<?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>97353</bug_id>
          
          <creation_ts>2012-09-21 11:59:00 -0700</creation_ts>
          <short_desc>Split stylesheet related code out from Document</short_desc>
          <delta_ts>2012-09-24 15:14:45 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>CSS</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Antti Koivisto">koivisto</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>cmarcelo</cc>
    
    <cc>dbarton</cc>
    
    <cc>dglazkov</cc>
    
    <cc>eric</cc>
    
    <cc>gyuyoung.kim</cc>
    
    <cc>kling</cc>
    
    <cc>macpherson</cc>
    
    <cc>menard</cc>
    
    <cc>peter+ews</cc>
    
    <cc>rakuco</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>725678</commentid>
    <comment_count>0</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2012-09-21 11:59:00 -0700</bug_when>
    <thetext>Document is big and unwieldy. The code related to tracking active stylesheets can be factored out.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>726220</commentid>
    <comment_count>1</comment_count>
      <attachid>165278</attachid>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2012-09-22 22:33:57 -0700</bug_when>
    <thetext>Created attachment 165278
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>726221</commentid>
    <comment_count>2</comment_count>
      <attachid>165278</attachid>
    <who name="Early Warning System Bot">webkit-ews</who>
    <bug_when>2012-09-22 22:55:08 -0700</bug_when>
    <thetext>Comment on attachment 165278
patch

Attachment 165278 did not pass qt-ews (qt):
Output: http://queues.webkit.org/results/13988234</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>726222</commentid>
    <comment_count>3</comment_count>
      <attachid>165278</attachid>
    <who name="Gyuyoung Kim">gyuyoung.kim</who>
    <bug_when>2012-09-22 22:56:45 -0700</bug_when>
    <thetext>Comment on attachment 165278
patch

Attachment 165278 did not pass efl-ews (efl):
Output: http://queues.webkit.org/results/13985280</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>726223</commentid>
    <comment_count>4</comment_count>
      <attachid>165278</attachid>
    <who name="Early Warning System Bot">webkit-ews</who>
    <bug_when>2012-09-22 22:58:25 -0700</bug_when>
    <thetext>Comment on attachment 165278
patch

Attachment 165278 did not pass qt-wk2-ews (qt):
Output: http://queues.webkit.org/results/13993198</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>726224</commentid>
    <comment_count>5</comment_count>
      <attachid>165278</attachid>
    <who name="Build Bot">buildbot</who>
    <bug_when>2012-09-22 23:05:29 -0700</bug_when>
    <thetext>Comment on attachment 165278
patch

Attachment 165278 did not pass win-ews (win):
Output: http://queues.webkit.org/results/13990197</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>726225</commentid>
    <comment_count>6</comment_count>
      <attachid>165278</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-09-22 23:07:00 -0700</bug_when>
    <thetext>Comment on attachment 165278
patch

Attachment 165278 did not pass chromium-ews (chromium-xvfb):
Output: http://queues.webkit.org/results/13986250</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>726227</commentid>
    <comment_count>7</comment_count>
      <attachid>165278</attachid>
    <who name="Build Bot">buildbot</who>
    <bug_when>2012-09-22 23:18:48 -0700</bug_when>
    <thetext>Comment on attachment 165278
patch

Attachment 165278 did not pass mac-ews (mac):
Output: http://queues.webkit.org/results/13993200</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>726231</commentid>
    <comment_count>8</comment_count>
      <attachid>165278</attachid>
    <who name="Peter Beverloo (cr-android ews)">peter+ews</who>
    <bug_when>2012-09-22 23:31:42 -0700</bug_when>
    <thetext>Comment on attachment 165278
patch

Attachment 165278 did not pass cr-android-ews (chromium-android):
Output: http://queues.webkit.org/results/13993202</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>726233</commentid>
    <comment_count>9</comment_count>
      <attachid>165278</attachid>
    <who name="Gyuyoung Kim">gyuyoung.kim</who>
    <bug_when>2012-09-22 23:44:05 -0700</bug_when>
    <thetext>Comment on attachment 165278
patch

Attachment 165278 did not pass efl-ews (efl):
Output: http://queues.webkit.org/results/13981669</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>726244</commentid>
    <comment_count>10</comment_count>
      <attachid>165278</attachid>
    <who name="Early Warning System Bot">webkit-ews</who>
    <bug_when>2012-09-23 00:06:49 -0700</bug_when>
    <thetext>Comment on attachment 165278
patch

Attachment 165278 did not pass qt-ews (qt):
Output: http://queues.webkit.org/results/13986268</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>726255</commentid>
    <comment_count>11</comment_count>
      <attachid>165278</attachid>
    <who name="Andreas Kling">kling</who>
    <bug_when>2012-09-23 07:58:51 -0700</bug_when>
    <thetext>Comment on attachment 165278
patch

This is a fantastic cleanup. Obviously needs some build system love.

Mac EWS failure:
Undefined symbols for architecture x86_64:
  &quot;__ZN7WebCore8Document18clearStyleResolverEv&quot;, referenced from:
      __ZN7WebCore28DocumentStyleSheetCollection23updateActiveStyleSheetsENS0_10UpdateFlagE in DocumentStyleSheetCollection.o

Need to remove inline keyword from Document::clearStyleResolver() implementation I suppose.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>726256</commentid>
    <comment_count>12</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2012-09-23 08:51:02 -0700</bug_when>
    <thetext>Huge fan!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>726257</commentid>
    <comment_count>13</comment_count>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2012-09-23 08:55:23 -0700</bug_when>
    <thetext>Kisses!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>726368</commentid>
    <comment_count>14</comment_count>
      <attachid>165278</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2012-09-23 21:09:14 -0700</bug_when>
    <thetext>Comment on attachment 165278
patch

r- for making the bots mad.  I&apos;m excited to see v2!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>726886</commentid>
    <comment_count>15</comment_count>
      <attachid>165418</attachid>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2012-09-24 11:46:13 -0700</bug_when>
    <thetext>Created attachment 165418
try to make it build 

- build files for non-mac platforms
- svn cp&apos;d Document.cpp so we preserve the history for the moved functions</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>726901</commentid>
    <comment_count>16</comment_count>
      <attachid>165423</attachid>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2012-09-24 12:03:33 -0700</bug_when>
    <thetext>Created attachment 165423
update to tot</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>726908</commentid>
    <comment_count>17</comment_count>
      <attachid>165426</attachid>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2012-09-24 12:16:22 -0700</bug_when>
    <thetext>Created attachment 165426
another try</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>726975</commentid>
    <comment_count>18</comment_count>
      <attachid>165442</attachid>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2012-09-24 13:57:12 -0700</bug_when>
    <thetext>Created attachment 165442
another rebase</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>727037</commentid>
    <comment_count>19</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2012-09-24 15:14:45 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/129423</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>165278</attachid>
            <date>2012-09-22 22:33:57 -0700</date>
            <delta_ts>2012-09-24 11:46:13 -0700</delta_ts>
            <desc>patch</desc>
            <filename>document-stylesheet-split-7.patch</filename>
            <type>text/plain</type>
            <size>105955</size>
            <attacher name="Antti Koivisto">koivisto</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEyOTMwMykKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE1MyBAQAorMjAxMi0wOS0yMSAgQW50dGkg
S29pdmlzdG8gIDxhbnR0aUBhcHBsZS5jb20+CisKKyAgICAgICAgU3BsaXQgc3R5bGVzaGVldCBy
ZWxhdGVkIGNvZGUgb3V0IGZyb20gRG9jdW1lbnQgCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD05NzM1MworCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgIERvY3VtZW50IGlzIGJpZyBhbmQgdW53aWVsZHkuIFRoZSBj
b2RlIHJlbGF0ZWQgdG8gdHJhY2tpbmcgYWN0aXZlIHN0eWxlc2hlZXRzIGNhbiBiZSBmYWN0b3Jl
ZCBvdXQuCisgICAgICAgIAorICAgICAgICBUaGUgcGF0Y2ggbW92ZXMgc3R5bGVzaGVldCB1cGtl
ZXAsIGNvbGxlY3Rpb24gYW5kIGludmFsaWRhdGlvbiBjb2RlIGZyb20gRG9jdW1lbnQgdG8gYSBz
ZXBhcmF0ZQorICAgICAgICBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uIGNsYXNzLiBUaGVy
ZSBhcmUgbm8gZnVuY3Rpb25hbCBjaGFuZ2VzLgorICAgICAgICAKKyAgICAgICAgVGhlIHVzZXNM
aW5rUnVsZXMgc3R5bGVzaGVldCBmZWF0dXJlIGJpdCBhbmQgdGhlIHJlbGF0ZWQgY29kZSBpcyBy
ZW1vdmVkIGFzIG5vIG9uZSB3YXMgdXNpbmcgaXQuCisKKyAgICAgICAgKiBXZWJDb3JlLnhjb2Rl
cHJvai9wcm9qZWN0LnBieHByb2o6CisgICAgICAgICogY3NzL1NlbGVjdG9yQ2hlY2tlci5jcHA6
CisgICAgICAgIChXZWJDb3JlOjpTZWxlY3RvckNoZWNrZXI6OmNoZWNrT25lU2VsZWN0b3IpOgor
ICAgICAgICAqIGNzcy9TdHlsZVJlc29sdmVyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxl
UmVzb2x2ZXI6OlN0eWxlUmVzb2x2ZXIpOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVSZXNvbHZl
cjo6RmVhdHVyZXM6OkZlYXR1cmVzKToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6
OkZlYXR1cmVzOjphZGQpOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVSZXNvbHZlcjo6RmVhdHVy
ZXM6OmNsZWFyKToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OmNvbGxlY3RNYXRj
aGluZ1J1bGVzRm9yTGlzdCk6CisgICAgICAgICogY3NzL1N0eWxlUmVzb2x2ZXIuaDoKKyAgICAg
ICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OnVzZXNCZWZvcmVBZnRlclJ1bGVzKToKKyAgICAg
ICAgKEZlYXR1cmVzKToKKyAgICAgICAgKiBkb20vRG9jdW1lbnQuY3BwOgorICAgICAgICAoV2Vi
Q29yZTo6RG9jdW1lbnQ6OkRvY3VtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50Ojp+
RG9jdW1lbnQpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnQ6OnNldENvbXBhdGliaWxpdHlN
b2RlKToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50OjpyZWNhbGNTdHlsZSk6CisgICAgICAg
IChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50OjpjcmVhdGVTdHlsZVJlc29s
dmVyKToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50OjpzZWFtbGVzc1BhcmVudFVwZGF0ZWRT
dHlsZXNoZWV0cyk6CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudDo6ZGlkUmVtb3ZlQWxsUGVu
ZGluZ1N0eWxlc2hlZXQpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnQ6OnByb2Nlc3NIdHRw
RXF1aXYpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnQ6OnN0eWxlU2hlZXRzKToKKyAgICAg
ICAgKFdlYkNvcmU6OkRvY3VtZW50OjpwcmVmZXJyZWRTdHlsZXNoZWV0U2V0KToKKyAgICAgICAg
KFdlYkNvcmU6OkRvY3VtZW50OjpzZWxlY3RlZFN0eWxlc2hlZXRTZXQpOgorICAgICAgICAoV2Vi
Q29yZTo6RG9jdW1lbnQ6OnNldFNlbGVjdGVkU3R5bGVzaGVldFNldCk6CisgICAgICAgIChXZWJD
b3JlOjpEb2N1bWVudDo6c3R5bGVSZXNvbHZlckNoYW5nZWQpOgorICAgICAgICAoV2ViQ29yZTo6
RG9jdW1lbnQ6OnJlcG9ydE1lbW9yeVVzYWdlKToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50
OjpoYXZlU3R5bGVzaGVldHNMb2FkZWQpOgorICAgICAgICAqIGRvbS9Eb2N1bWVudC5oOgorICAg
ICAgICAoV2ViQ29yZSk6CisgICAgICAgIChEb2N1bWVudCk6CisgICAgICAgIChXZWJDb3JlOjpE
b2N1bWVudDo6c3R5bGVTaGVldENvbGxlY3Rpb24pOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1l
bnQ6Omhhc05vZGVzV2l0aFBsYWNlaG9sZGVyU3R5bGUpOgorICAgICAgICAoV2ViQ29yZTo6RG9j
dW1lbnQ6OnNldE5lZWRzTm90aWZ5UmVtb3ZlQWxsUGVuZGluZ1N0eWxlc2hlZXQpOgorICAgICAg
ICAoV2ViQ29yZTo6RG9jdW1lbnQ6OmluU3R5bGVSZWNhbGMpOgorICAgICAgICAqIGRvbS9Eb2N1
bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlKToK
KyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OkRvY3VtZW50
U3R5bGVTaGVldENvbGxlY3Rpb24pOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNo
ZWV0Q29sbGVjdGlvbjo6fkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24pOgorICAgICAgICAo
V2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6cGFnZVVzZXJTaGVldCk6Cisg
ICAgICAgIChXZWJDb3JlOjpEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjpjbGVhclBhZ2VV
c2VyU2hlZXQpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlv
bjo6dXBkYXRlUGFnZVVzZXJTaGVldCk6CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudFN0eWxl
U2hlZXRDb2xsZWN0aW9uOjpwYWdlR3JvdXBVc2VyU2hlZXRzKToKKyAgICAgICAgKFdlYkNvcmU6
OkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OmNsZWFyUGFnZUdyb3VwVXNlclNoZWV0cyk6
CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjp1cGRhdGVQ
YWdlR3JvdXBVc2VyU2hlZXRzKToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50U3R5bGVTaGVl
dENvbGxlY3Rpb246OmFkZFVzZXJTaGVldCk6CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudFN0
eWxlU2hlZXRDb2xsZWN0aW9uOjpyZW1vdmVQZW5kaW5nU2hlZXQpOgorICAgICAgICAoV2ViQ29y
ZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6YWRkU3R5bGVTaGVldENhbmRpZGF0ZU5v
ZGUpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6cmVt
b3ZlU3R5bGVTaGVldENhbmRpZGF0ZU5vZGUpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRT
dHlsZVNoZWV0Q29sbGVjdGlvbjo6Y29sbGVjdEFjdGl2ZVN0eWxlU2hlZXRzKToKKyAgICAgICAg
KFdlYkNvcmU6OkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OnRlc3RBZGRlZFN0eWxlU2hl
ZXRSZXF1aXJlc1N0eWxlUmVjYWxjKToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50U3R5bGVT
aGVldENvbGxlY3Rpb246OmFuYWx5emVTdHlsZVNoZWV0Q2hhbmdlKToKKyAgICAgICAgKFdlYkNv
cmU6OnN0eWxlU2hlZXRzVXNlUmVtVW5pdHMpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRT
dHlsZVNoZWV0Q29sbGVjdGlvbjo6dXBkYXRlQWN0aXZlU3R5bGVTaGVldHMpOgorICAgICAgICAo
V2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6Y29tYmluZUNTU0ZlYXR1cmVG
bGFncyk6CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjpy
ZXNldENTU0ZlYXR1cmVGbGFncyk6CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudFN0eWxlU2hl
ZXRDb2xsZWN0aW9uOjpyZXBvcnRNZW1vcnlVc2FnZSk6CisgICAgICAgICogZG9tL0RvY3VtZW50
U3R5bGVTaGVldENvbGxlY3Rpb24uaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlKToKKyAgICAg
ICAgKERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24pOgorICAgICAgICAoV2ViQ29yZTo6RG9j
dW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6YXV0aG9yU3R5bGVTaGVldHMpOgorICAgICAgICAo
V2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6ZG9jdW1lbnRVc2VyU2hlZXRz
KToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246Om5lZWRz
VXBkYXRlQWN0aXZlU3R5bGVzaGVldHNPblN0eWxlUmVjYWxjKToKKyAgICAgICAgKFdlYkNvcmU6
OkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OnByZWZlcnJlZFN0eWxlc2hlZXRTZXROYW1l
KToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OnNlbGVj
dGVkU3R5bGVzaGVldFNldE5hbWUpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNo
ZWV0Q29sbGVjdGlvbjo6c2V0UHJlZmVycmVkU3R5bGVzaGVldFNldE5hbWUpOgorICAgICAgICAo
V2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6c2V0U2VsZWN0ZWRTdHlsZXNo
ZWV0U2V0TmFtZSk6CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0
aW9uOjphZGRQZW5kaW5nU2hlZXQpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNo
ZWV0Q29sbGVjdGlvbjo6aGFzUGVuZGluZ1NoZWV0cyk6CisgICAgICAgIChXZWJDb3JlOjpEb2N1
bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjp1c2VzU2libGluZ1J1bGVzKToKKyAgICAgICAgKFdl
YkNvcmU6OkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OnNldFVzZXNTaWJsaW5nUnVsZXNP
dmVycmlkZSk6CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9u
Ojp1c2VzRmlyc3RMaW5lUnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNo
ZWV0Q29sbGVjdGlvbjo6dXNlc0ZpcnN0TGV0dGVyUnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6
RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6c2V0VXNlc0ZpcnN0TGV0dGVyUnVsZXMpOgor
ICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6dXNlc0JlZm9y
ZUFmdGVyUnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVj
dGlvbjo6c2V0VXNlc0JlZm9yZUFmdGVyUnVsZXNPdmVycmlkZSk6CisgICAgICAgIChXZWJDb3Jl
OjpEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjp1c2VzUmVtVW5pdHMpOgorICAgICAgICAo
V2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6c2V0VXNlc1JlbVVuaXQpOgor
ICAgICAgICAqIGRvbS9FbGVtZW50LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnQ6OnJl
Y2FsY1N0eWxlKToKKyAgICAgICAgKiBkb20vUHJvY2Vzc2luZ0luc3RydWN0aW9uLmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OlByb2Nlc3NpbmdJbnN0cnVjdGlvbjo6flByb2Nlc3NpbmdJbnN0cnVj
dGlvbik6CisgICAgICAgIChXZWJDb3JlOjpQcm9jZXNzaW5nSW5zdHJ1Y3Rpb246OmNoZWNrU3R5
bGVTaGVldCk6CisgICAgICAgIChXZWJDb3JlOjpQcm9jZXNzaW5nSW5zdHJ1Y3Rpb246OnNoZWV0
TG9hZGVkKToKKyAgICAgICAgKFdlYkNvcmU6OlByb2Nlc3NpbmdJbnN0cnVjdGlvbjo6aW5zZXJ0
ZWRJbnRvKToKKyAgICAgICAgKFdlYkNvcmU6OlByb2Nlc3NpbmdJbnN0cnVjdGlvbjo6cmVtb3Zl
ZEZyb20pOgorICAgICAgICAqIGRvbS9TdHlsZUVsZW1lbnQuY3BwOgorICAgICAgICAoV2ViQ29y
ZTo6U3R5bGVFbGVtZW50OjppbnNlcnRlZEludG9Eb2N1bWVudCk6CisgICAgICAgIChXZWJDb3Jl
OjpTdHlsZUVsZW1lbnQ6OnJlbW92ZWRGcm9tRG9jdW1lbnQpOgorICAgICAgICAoV2ViQ29yZTo6
U3R5bGVFbGVtZW50OjpjbGVhckRvY3VtZW50RGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpTdHls
ZUVsZW1lbnQ6OmNyZWF0ZVNoZWV0KToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlRWxlbWVudDo6
c2hlZXRMb2FkZWQpOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVFbGVtZW50OjpzdGFydExvYWRp
bmdEeW5hbWljU2hlZXQpOgorICAgICAgICAqIGh0bWwvSFRNTExpbmtFbGVtZW50LmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OkhUTUxMaW5rRWxlbWVudDo6fkhUTUxMaW5rRWxlbWVudCk6CisgICAg
ICAgIChXZWJDb3JlOjpIVE1MTGlua0VsZW1lbnQ6Omluc2VydGVkSW50byk6CisgICAgICAgIChX
ZWJDb3JlOjpIVE1MTGlua0VsZW1lbnQ6OnJlbW92ZWRGcm9tKToKKyAgICAgICAgKFdlYkNvcmU6
OkhUTUxMaW5rRWxlbWVudDo6YWRkUGVuZGluZ1NoZWV0KToKKyAgICAgICAgKFdlYkNvcmU6OkhU
TUxMaW5rRWxlbWVudDo6cmVtb3ZlUGVuZGluZ1NoZWV0KToKKyAgICAgICAgKiBodG1sL0hUTUxR
dW90ZUVsZW1lbnQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6SFRNTFF1b3RlRWxlbWVudDo6aW5z
ZXJ0ZWRJbnRvKToKKyAgICAgICAgKiBodG1sL0hUTUxWaWV3U291cmNlRG9jdW1lbnQuY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6SFRNTFZpZXdTb3VyY2VEb2N1bWVudDo6SFRNTFZpZXdTb3VyY2VE
b2N1bWVudCk6CisgICAgICAgICogbWF0aG1sL01hdGhNTE1hdGhFbGVtZW50LmNwcDoKKyAgICAg
ICAgKFdlYkNvcmU6Ok1hdGhNTE1hdGhFbGVtZW50OjppbnNlcnRlZEludG8pOgorICAgICAgICAq
IHBhZ2UvUGFnZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpQYWdlOjp1c2VyU3R5bGVTaGVldExv
Y2F0aW9uQ2hhbmdlZCk6CisgICAgICAgICogcGFnZS9QYWdlR3JvdXAuY3BwOgorICAgICAgICAo
V2ViQ29yZTo6UGFnZUdyb3VwOjpyZXNldFVzZXJTdHlsZUNhY2hlSW5BbGxGcmFtZXMpOgorICAg
ICAgICAqIHJlbmRlcmluZy9SZW5kZXJCUi5jcHA6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJC
Ujo6bGluZUhlaWdodCk6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlckJsb2NrLmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrOjpzdHlsZURpZENoYW5nZSk6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJCbG9jazo6c3BsaXRCbG9ja3MpOgorICAgICAgICAoV2ViQ29yZTo6UmVu
ZGVyQmxvY2s6OmFkZENoaWxkSWdub3JpbmdBbm9ueW1vdXNDb2x1bW5CbG9ja3MpOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6OmxpbmVIZWlnaHQpOgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyQmxvY2s6OnVwZGF0ZUZpcnN0TGV0dGVyKToKKyAgICAgICAgKiByZW5kZXJpbmcvUmVu
ZGVySW5saW5lLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlcklubGluZTo6c3R5bGVEaWRD
aGFuZ2UpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVySW5saW5lOjp1cGRhdGVBbHdheXNDcmVh
dGVMaW5lQm94ZXMpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVySW5saW5lOjphZGRDaGlsZEln
bm9yaW5nQ29udGludWF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlcklubGluZTo6c3Bs
aXRJbmxpbmVzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlcklubGluZTo6bGluZUhlaWdodCk6
CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlck9iamVjdC5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJPYmplY3Q6OnVuY2FjaGVkRmlyc3RMaW5lU3R5bGUpOgorICAgICAgICAoV2ViQ29y
ZTo6UmVuZGVyT2JqZWN0OjpmaXJzdExpbmVTdHlsZVNsb3dDYXNlKToKKyAgICAgICAgKiByZW5k
ZXJpbmcvUmVuZGVyT2JqZWN0Lmg6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJPYmplY3Q6OmZp
cnN0TGluZVN0eWxlKToKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyT2JqZWN0Q2hpbGRMaXN0
LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck9iamVjdENoaWxkTGlzdDo6dXBkYXRlQmVm
b3JlQWZ0ZXJDb250ZW50KToKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyVGFibGVSb3cuY3Bw
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGFibGVSb3c6OnVwZGF0ZUJlZm9yZUFuZEFmdGVy
Q29udGVudCk6CisgICAgICAgICogcmVuZGVyaW5nL1Jvb3RJbmxpbmVCb3guY3BwOgorICAgICAg
ICAoV2ViQ29yZTo6Um9vdElubGluZUJveDo6dmVydGljYWxQb3NpdGlvbkZvckJveCk6CisKIDIw
MTItMDktMjEgIEFtaSBGaXNjaG1hbiAgPGZpc2NobWFuQGNocm9taXVtLm9yZz4KIAogICAgICAg
ICBIVE1MTWVkaWFFbGVtZW50IGlzbid0IGdhcmJhZ2UgY29sbGVjdGVkIGJldHdlZW4gZG9jdW1l
bnQgcmVsb2FkcwpJbmRleDogU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVj
dC5wYnhwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9q
L3Byb2plY3QucGJ4cHJvagkocmV2aXNpb24gMTI5MzAzKQorKysgU291cmNlL1dlYkNvcmUvV2Vi
Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCSh3b3JraW5nIGNvcHkpCkBAIC02MTQxLDYg
KzYxNDEsOCBAQAogCQlFNDc3OEI4MDExNUE1ODFBMDBCNUQzNzIgLyogSlNDdXN0b21FdmVudC5o
IGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRTQ3NzhCN0Ux
MTVBNTgxQTAwQjVEMzcyIC8qIEpTQ3VzdG9tRXZlbnQuaCAqLzsgfTsKIAkJRTQ3QjRCRTgwRTcx
MjQxNjAwMDM4ODU0IC8qIENhY2hlZFJlc291cmNlSGFuZGxlLmggaW4gSGVhZGVycyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFNDdCNEJFNjBFNzEyNDE2MDAwMzg4NTQgLyog
Q2FjaGVkUmVzb3VyY2VIYW5kbGUuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2
YXRlLCApOyB9OyB9OwogCQlFNDdCNEJFOTBFNzEyNDE2MDAwMzg4NTQgLyogQ2FjaGVkUmVzb3Vy
Y2VIYW5kbGUuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gRTQ3QjRCRTcwRTcxMjQxNjAwMDM4ODU0IC8qIENhY2hlZFJlc291cmNlSGFuZGxlLmNwcCAq
LzsgfTsKKwkJRTQ3RTI3NjUxNjAzNkVEMjAwRUUyQUZCIC8qIERvY3VtZW50U3R5bGVTaGVldENv
bGxlY3Rpb24uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9
IEU0N0UyNzY0MTYwMzZFRDIwMEVFMkFGQiAvKiBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9u
LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKKwkJRTQ3
RTI3NjgxNjAzNkVEQzAwRUUyQUZCIC8qIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uY3Bw
IGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRTQ3RTI3Njcx
NjAzNkVEQzAwRUUyQUZCIC8qIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uY3BwICovOyB9
OwogCQlFNDk0NkVBRTE1NkU2NEREMDBEMzI5N0YgLyogU3R5bGVSdWxlSW1wb3J0LmNwcCBpbiBT
b3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEU0OTQ2RUFDMTU2RTY0
REQwMEQzMjk3RiAvKiBTdHlsZVJ1bGVJbXBvcnQuY3BwICovOyB9OwogCQlFNDk0NkVBRjE1NkU2
NEREMDBEMzI5N0YgLyogU3R5bGVSdWxlSW1wb3J0LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQ
QlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFNDk0NkVBRDE1NkU2NEREMDBEMzI5N0YgLyogU3R5bGVS
dWxlSW1wb3J0LmggKi87IH07CiAJCUU0OUJEOUZBMTMxRkQyRUQwMDNDNTZGMCAvKiBDU1NWYWx1
ZVBvb2wuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEU0
OUJEOUY5MTMxRkQyRUQwMDNDNTZGMCAvKiBDU1NWYWx1ZVBvb2wuaCAqLzsgfTsKQEAgLTEzNTIw
LDYgKzEzNTIyLDggQEAKIAkJRTQ3NzhCN0UxMTVBNTgxQTAwQjVEMzcyIC8qIEpTQ3VzdG9tRXZl
bnQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0
S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gSlNDdXN0b21FdmVudC5oOyBz
b3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlFNDdCNEJFNjBFNzEyNDE2MDAwMzg4NTQgLyog
Q2FjaGVkUmVzb3VyY2VIYW5kbGUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0g
Q2FjaGVkUmVzb3VyY2VIYW5kbGUuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRTQ3
QjRCRTcwRTcxMjQxNjAwMDM4ODU0IC8qIENhY2hlZFJlc291cmNlSGFuZGxlLmNwcCAqLyA9IHtp
c2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlw
ZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IENhY2hlZFJlc291cmNlSGFuZGxlLmNwcDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRTQ3RTI3NjQxNjAzNkVEMjAwRUUyQUZCIC8q
IERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJl
bmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5o
OyBwYXRoID0gRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5oOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OworCQlFNDdFMjc2NzE2MDM2RURDMDBFRTJBRkIgLyogRG9jdW1lbnRTdHlsZVNo
ZWV0Q29sbGVjdGlvbi5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29k
aW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBE
b2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKIAkJRTQ5NDZFQUMxNTZFNjRERDAwRDMyOTdGIC8qIFN0eWxlUnVsZUltcG9ydC5jcHAgKi8g
PSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmls
ZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBTdHlsZVJ1bGVJbXBvcnQuY3BwOyBz
b3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlFNDk0NkVBRDE1NkU2NEREMDBEMzI5N0YgLyog
U3R5bGVSdWxlSW1wb3J0LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29k
aW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFN0eWxl
UnVsZUltcG9ydC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlFNDlCRDlGOTEzMUZE
MkVEMDAzQzU2RjAgLyogQ1NTVmFsdWVQb29sLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsg
cGF0aCA9IENTU1ZhbHVlUG9vbC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAtMjE2
NzEsNiArMjE2NzUsOCBAQAogCQkJCTE0OTQ3RkZDMTJGODBDRDIwMEEwRjYzMSAvKiBEb2N1bWVu
dE9yZGVyZWRNYXAuaCAqLywKIAkJCQlBOEMyMjgwRDExRDRBNTk3MDBENUE3RDMgLyogRG9jdW1l
bnRQYXJzZXIuY3BwICovLAogCQkJCUJDQ0ZCQUU3MEI1MTUyRUQwMDAxRjFENyAvKiBEb2N1bWVu
dFBhcnNlci5oICovLAorCQkJCUU0N0UyNzY3MTYwMzZFREMwMEVFMkFGQiAvKiBEb2N1bWVudFN0
eWxlU2hlZXRDb2xsZWN0aW9uLmNwcCAqLywKKwkJCQlFNDdFMjc2NDE2MDM2RUQyMDBFRTJBRkIg
LyogRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5oICovLAogCQkJCTg2RDk4MkY2MTI1QzE1
NDAwMEFEOUUzRCAvKiBEb2N1bWVudFRpbWluZy5oICovLAogCQkJCUE4MTg1RjMyMDk3NjU3NjUw
MDU4MjZEOSAvKiBEb2N1bWVudFR5cGUuY3BwICovLAogCQkJCUE4MTg1RjMxMDk3NjU3NjUwMDU4
MjZEOSAvKiBEb2N1bWVudFR5cGUuaCAqLywKQEAgLTIyMjc1LDYgKzIyMjgxLDcgQEAKIAkJCWlz
YSA9IFBCWEhlYWRlcnNCdWlsZFBoYXNlOwogCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0
NzsKIAkJCWZpbGVzID0gKAorCQkJCUU0N0UyNzY1MTYwMzZFRDIwMEVFMkFGQiAvKiBEb2N1bWVu
dFN0eWxlU2hlZXRDb2xsZWN0aW9uLmggaW4gSGVhZGVycyAqLywKIAkJCQk5N0JDNjlEQjE1MDVG
MDc2MDAxQjc0QUMgLyogQWJzdHJhY3REYXRhYmFzZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJNDFF
MUIxRDEwRkY1OTg2OTAwNTc2QjNCIC8qIEFic3RyYWN0V29ya2VyLmggaW4gSGVhZGVycyAqLywK
IAkJCQkyOUE4MTIyRTBGQkI5QzFEMDA1MTAyOTMgLyogQWNjZXNzaWJpbGl0eUFSSUFHcmlkQ2Vs
bC5oIGluIEhlYWRlcnMgKi8sCkBAIC0yODY2OCw2ICsyODY3NSw3IEBACiAJCQkJRTFCRTUxMkQw
Q0Y2QzUxMjAwMkVBOTU5IC8qIFhTTFRVbmljb2RlU29ydC5jcHAgaW4gU291cmNlcyAqLywKIAkJ
CQk5NzdFMkUwRTEyRjBGQzlDMDBDMTMzNzkgLyogWFNTQXVkaXRvci5jcHAgaW4gU291cmNlcyAq
LywKIAkJCQlGRDUzNzM1MjEzN0I2NTE4MDAwMDhEQ0UgLyogWmVyb1BvbGUuY3BwIGluIFNvdXJj
ZXMgKi8sCisJCQkJRTQ3RTI3NjgxNjAzNkVEQzAwRUUyQUZCIC8qIERvY3VtZW50U3R5bGVTaGVl
dENvbGxlY3Rpb24uY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJNEYxRDExQkYxNUZGMzcyMDAwMjZF
OTA4IC8qIFBsYXRmb3JtTWVtb3J5SW5zdHJ1bWVudGF0aW9uLmNwcCBpbiBTb3VyY2VzICovLAog
CQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwpJbmRleDog
U291cmNlL1dlYkNvcmUvY3NzL1NlbGVjdG9yQ2hlY2tlci5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvY3NzL1NlbGVjdG9yQ2hlY2tlci5jcHAJKHJldmlzaW9uIDEyOTMwMykKKysr
IFNvdXJjZS9XZWJDb3JlL2Nzcy9TZWxlY3RvckNoZWNrZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSAiQ1NTU2VsZWN0b3IuaCIKICNpbmNsdWRlICJDU1NT
ZWxlY3Rvckxpc3QuaCIKICNpbmNsdWRlICJEb2N1bWVudC5oIgorI2luY2x1ZGUgIkRvY3VtZW50
U3R5bGVTaGVldENvbGxlY3Rpb24uaCIKICNpbmNsdWRlICJGb2N1c0NvbnRyb2xsZXIuaCIKICNp
bmNsdWRlICJGcmFtZS5oIgogI2luY2x1ZGUgIkZyYW1lU2VsZWN0aW9uLmgiCkBAIC03ODMsNyAr
Nzg0LDcgQEAgYm9vbCBTZWxlY3RvckNoZWNrZXI6OmNoZWNrT25lU2VsZWN0b3IoYwogICAgICAg
ICAgICAgICAgIGlmIChtX21vZGUgPT0gUmVzb2x2aW5nU3R5bGUpIHsKICAgICAgICAgICAgICAg
ICAgICAgaWYgKGNvbnRleHQuZWxlbWVudFN0eWxlKQogICAgICAgICAgICAgICAgICAgICAgICAg
Y29udGV4dC5lbGVtZW50U3R5bGUtPnNldEVtcHR5U3RhdGUocmVzdWx0KTsKLSAgICAgICAgICAg
ICAgICAgICAgZWxzZSBpZiAoZWxlbWVudC0+cmVuZGVyU3R5bGUoKSAmJiAoZWxlbWVudC0+ZG9j
dW1lbnQoKS0+dXNlc1NpYmxpbmdSdWxlcygpIHx8IGVsZW1lbnQtPnJlbmRlclN0eWxlKCktPnVu
aXF1ZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZWxlbWVudC0+cmVuZGVyU3R5
bGUoKSAmJiAoZWxlbWVudC0+ZG9jdW1lbnQoKS0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+dXNl
c1NpYmxpbmdSdWxlcygpIHx8IGVsZW1lbnQtPnJlbmRlclN0eWxlKCktPnVuaXF1ZSgpKSkKICAg
ICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQtPnJlbmRlclN0eWxlKCktPnNldEVtcHR5U3Rh
dGUocmVzdWx0KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIHJl
c3VsdDsKQEAgLTExODcsNyArMTE4OCw3IEBAIGJvb2wgU2VsZWN0b3JDaGVja2VyOjpjaGVja09u
ZVNlbGVjdG9yKGMKICAgICAgICAgUHNldWRvSWQgcHNldWRvSWQgPSBDU1NTZWxlY3Rvcjo6cHNl
dWRvSWQoc2VsZWN0b3ItPnBzZXVkb1R5cGUoKSk7CiAgICAgICAgIGlmIChwc2V1ZG9JZCA9PSBG
SVJTVF9MRVRURVIpIHsKICAgICAgICAgICAgIGlmIChEb2N1bWVudCogZG9jdW1lbnQgPSBlbGVt
ZW50LT5kb2N1bWVudCgpKQotICAgICAgICAgICAgICAgIGRvY3VtZW50LT5zZXRVc2VzRmlyc3RM
ZXR0ZXJSdWxlcyh0cnVlKTsKKyAgICAgICAgICAgICAgICBkb2N1bWVudC0+c3R5bGVTaGVldENv
bGxlY3Rpb24oKS0+c2V0VXNlc0ZpcnN0TGV0dGVyUnVsZXModHJ1ZSk7CiAgICAgICAgIH0KICAg
ICAgICAgaWYgKHBzZXVkb0lkICE9IE5PUFNFVURPKQogICAgICAgICAgICAgZHluYW1pY1BzZXVk
byA9IHBzZXVkb0lkOwpJbmRleDogU291cmNlL1dlYkNvcmUvY3NzL1N0eWxlUmVzb2x2ZXIuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2Nzcy9TdHlsZVJlc29sdmVyLmNwcAkocmV2
aXNpb24gMTI5MzAzKQorKysgU291cmNlL1dlYkNvcmUvY3NzL1N0eWxlUmVzb2x2ZXIuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC02MCw2ICs2MCw3IEBACiAjaW5jbHVkZSAiQ291bnRlci5oIgogI2lu
Y2x1ZGUgIkNvdW50ZXJDb250ZW50LmgiCiAjaW5jbHVkZSAiQ3Vyc29yTGlzdC5oIgorI2luY2x1
ZGUgIkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uaCIKICNpbmNsdWRlICJGb250RmVhdHVy
ZVZhbHVlLmgiCiAjaW5jbHVkZSAiRm9udFZhbHVlLmgiCiAjaW5jbHVkZSAiRnJhbWUuaCIKQEAg
LTQyOCwxMiArNDI5LDEzIEBAIFN0eWxlUmVzb2x2ZXI6OlN0eWxlUmVzb2x2ZXIoRG9jdW1lbnQq
IGQKICAgICAvLyBOb3RlIHRoYXQgdGhlcmUgdXN1YWxseSBpcyBvbmx5IDEgc2hlZXQgZm9yIHNj
b3BlZCBydWxlcywgc28gYXV0by1zaHJpbmstdG8tZml0IGlzIGZpbmUuCiAgICAgbV9hdXRob3JT
dHlsZS0+ZGlzYWJsZUF1dG9TaHJpbmtUb0ZpdCgpOwogCisgICAgRG9jdW1lbnRTdHlsZVNoZWV0
Q29sbGVjdGlvbiogc3R5bGVTaGVldENvbGxlY3Rpb24gPSBkb2N1bWVudC0+c3R5bGVTaGVldENv
bGxlY3Rpb24oKTsKICAgICAvLyBGSVhNRTogVGhpcyBzdWNrcyEgVGhlIHVzZXIgc2hlZXQgaXMg
cmVwYXJzZWQgZXZlcnkgdGltZSEKICAgICBPd25QdHI8UnVsZVNldD4gdGVtcFVzZXJTdHlsZSA9
IFJ1bGVTZXQ6OmNyZWF0ZSgpOwotICAgIGlmIChDU1NTdHlsZVNoZWV0KiBwYWdlVXNlclNoZWV0
ID0gZG9jdW1lbnQtPnBhZ2VVc2VyU2hlZXQoKSkKKyAgICBpZiAoQ1NTU3R5bGVTaGVldCogcGFn
ZVVzZXJTaGVldCA9IHN0eWxlU2hlZXRDb2xsZWN0aW9uLT5wYWdlVXNlclNoZWV0KCkpCiAgICAg
ICAgIHRlbXBVc2VyU3R5bGUtPmFkZFJ1bGVzRnJvbVNoZWV0KHBhZ2VVc2VyU2hlZXQtPmNvbnRl
bnRzKCksICptX21lZGl1bSwgdGhpcyk7Ci0gICAgYWRkQXV0aG9yUnVsZXNBbmRDb2xsZWN0VXNl
clJ1bGVzRnJvbVNoZWV0cyhkb2N1bWVudC0+cGFnZUdyb3VwVXNlclNoZWV0cygpLCAqdGVtcFVz
ZXJTdHlsZSk7Ci0gICAgYWRkQXV0aG9yUnVsZXNBbmRDb2xsZWN0VXNlclJ1bGVzRnJvbVNoZWV0
cyhkb2N1bWVudC0+ZG9jdW1lbnRVc2VyU2hlZXRzKCksICp0ZW1wVXNlclN0eWxlKTsKKyAgICBh
ZGRBdXRob3JSdWxlc0FuZENvbGxlY3RVc2VyUnVsZXNGcm9tU2hlZXRzKHN0eWxlU2hlZXRDb2xs
ZWN0aW9uLT5wYWdlR3JvdXBVc2VyU2hlZXRzKCksICp0ZW1wVXNlclN0eWxlKTsKKyAgICBhZGRB
dXRob3JSdWxlc0FuZENvbGxlY3RVc2VyUnVsZXNGcm9tU2hlZXRzKHN0eWxlU2hlZXRDb2xsZWN0
aW9uLT5kb2N1bWVudFVzZXJTaGVldHMoKSwgKnRlbXBVc2VyU3R5bGUpOwogICAgIGlmICh0ZW1w
VXNlclN0eWxlLT5tX3J1bGVDb3VudCA+IDAgfHwgdGVtcFVzZXJTdHlsZS0+bV9wYWdlUnVsZXMu
c2l6ZSgpID4gMCkKICAgICAgICAgbV91c2VyU3R5bGUgPSB0ZW1wVXNlclN0eWxlLnJlbGVhc2Uo
KTsKIApAQCAtNDQ3LDcgKzQ0OSw3IEBAIFN0eWxlUmVzb2x2ZXI6OlN0eWxlUmVzb2x2ZXIoRG9j
dW1lbnQqIGQKICNlbmRpZgogCiAgICAgYWRkU3R5bGVzaGVldHNGcm9tU2VhbWxlc3NQYXJlbnRz
KCk7Ci0gICAgYXBwZW5kQXV0aG9yU3R5bGVzaGVldHMoMCwgZG9jdW1lbnQtPnN0eWxlU2hlZXRz
KCktPnZlY3RvcigpKTsKKyAgICBhcHBlbmRBdXRob3JTdHlsZXNoZWV0cygwLCBzdHlsZVNoZWV0
Q29sbGVjdGlvbi0+YXV0aG9yU3R5bGVTaGVldHMoKS0+dmVjdG9yKCkpOwogfQogCiB2b2lkIFN0
eWxlUmVzb2x2ZXI6OmFkZFN0eWxlc2hlZXRzRnJvbVNlYW1sZXNzUGFyZW50cygpCkBAIC03MDgs
NyArNzEwLDYgQEAgdm9pZCBTdHlsZVJlc29sdmVyOjpzd2VlcE1hdGNoZWRQcm9wZXJ0aQogU3R5
bGVSZXNvbHZlcjo6RmVhdHVyZXM6OkZlYXR1cmVzKCkKICAgICA6IHVzZXNGaXJzdExpbmVSdWxl
cyhmYWxzZSkKICAgICAsIHVzZXNCZWZvcmVBZnRlclJ1bGVzKGZhbHNlKQotICAgICwgdXNlc0xp
bmtSdWxlcyhmYWxzZSkKIHsKIH0KIApAQCAtNzI4LDcgKzcyOSw2IEBAIHZvaWQgU3R5bGVSZXNv
bHZlcjo6RmVhdHVyZXM6OmFkZChjb25zdCAKICAgICB1bmNvbW1vbkF0dHJpYnV0ZVJ1bGVzLmFw
cGVuZChvdGhlci51bmNvbW1vbkF0dHJpYnV0ZVJ1bGVzKTsKICAgICB1c2VzRmlyc3RMaW5lUnVs
ZXMgPSB1c2VzRmlyc3RMaW5lUnVsZXMgfHwgb3RoZXIudXNlc0ZpcnN0TGluZVJ1bGVzOwogICAg
IHVzZXNCZWZvcmVBZnRlclJ1bGVzID0gdXNlc0JlZm9yZUFmdGVyUnVsZXMgfHwgb3RoZXIudXNl
c0JlZm9yZUFmdGVyUnVsZXM7Ci0gICAgdXNlc0xpbmtSdWxlcyA9IHVzZXNMaW5rUnVsZXMgfHwg
b3RoZXIudXNlc0xpbmtSdWxlczsKIH0KIAogdm9pZCBTdHlsZVJlc29sdmVyOjpGZWF0dXJlczo6
Y2xlYXIoKQpAQCAtNzM5LDcgKzczOSw2IEBAIHZvaWQgU3R5bGVSZXNvbHZlcjo6RmVhdHVyZXM6
OmNsZWFyKCkKICAgICB1bmNvbW1vbkF0dHJpYnV0ZVJ1bGVzLmNsZWFyKCk7CiAgICAgdXNlc0Zp
cnN0TGluZVJ1bGVzID0gZmFsc2U7CiAgICAgdXNlc0JlZm9yZUFmdGVyUnVsZXMgPSBmYWxzZTsK
LSAgICB1c2VzTGlua1J1bGVzID0gZmFsc2U7CiB9CiAKIHZvaWQgU3R5bGVSZXNvbHZlcjo6RmVh
dHVyZXM6OnJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qIG1lbW9yeU9iamVjdElu
Zm8pIGNvbnN0CkBAIC0yNjA1LDEwICsyNjA0LDYgQEAgc3RhdGljIGlubGluZSB2b2lkIGNvbGxl
Y3RGZWF0dXJlc0Zyb21TZQogICAgIGNhc2UgQ1NTU2VsZWN0b3I6OlBzZXVkb0FmdGVyOgogICAg
ICAgICBmZWF0dXJlcy51c2VzQmVmb3JlQWZ0ZXJSdWxlcyA9IHRydWU7CiAgICAgICAgIGJyZWFr
OwotICAgIGNhc2UgQ1NTU2VsZWN0b3I6OlBzZXVkb0xpbms6Ci0gICAgY2FzZSBDU1NTZWxlY3Rv
cjo6UHNldWRvVmlzaXRlZDoKLSAgICAgICAgZmVhdHVyZXMudXNlc0xpbmtSdWxlcyA9IHRydWU7
Ci0gICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIGJyZWFrOwogICAgIH0KQEAg
LTMxODEsMjUgKzMxNzYsMjUgQEAgc3RhdGljIHZvaWQgY29sbGVjdENTU09NV3JhcHBlcnMoSGFz
aE1hcAogICAgIGNvbGxlY3RDU1NPTVdyYXBwZXJzKHdyYXBwZXJNYXAsIHN0eWxlU2hlZXRXcmFw
cGVyLmdldCgpKTsKIH0KIAotc3RhdGljIHZvaWQgY29sbGVjdENTU09NV3JhcHBlcnMoSGFzaE1h
cDxTdHlsZVJ1bGUqLCBSZWZQdHI8Q1NTU3R5bGVSdWxlPiA+JiB3cmFwcGVyTWFwLCBEb2N1bWVu
dCogZG9jdW1lbnQpCitzdGF0aWMgdm9pZCBjb2xsZWN0Q1NTT01XcmFwcGVycyhIYXNoTWFwPFN0
eWxlUnVsZSosIFJlZlB0cjxDU1NTdHlsZVJ1bGU+ID4mIHdyYXBwZXJNYXAsIERvY3VtZW50U3R5
bGVTaGVldENvbGxlY3Rpb24qIHN0eWxlU2hlZXRDb2xsZWN0aW9uKQogewotICAgIGNvbnN0IFZl
Y3RvcjxSZWZQdHI8U3R5bGVTaGVldD4gPiYgc3R5bGVTaGVldHMgPSBkb2N1bWVudC0+c3R5bGVT
aGVldHMoKS0+dmVjdG9yKCk7CisgICAgY29uc3QgVmVjdG9yPFJlZlB0cjxTdHlsZVNoZWV0PiA+
JiBzdHlsZVNoZWV0cyA9IHN0eWxlU2hlZXRDb2xsZWN0aW9uLT5hdXRob3JTdHlsZVNoZWV0cygp
LT52ZWN0b3IoKTsKICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc3R5bGVTaGVldHMuc2l6
ZSgpOyArK2kpIHsKICAgICAgICAgU3R5bGVTaGVldCogc3R5bGVTaGVldCA9IHN0eWxlU2hlZXRz
W2ldLmdldCgpOwogICAgICAgICBpZiAoIXN0eWxlU2hlZXQtPmlzQ1NTU3R5bGVTaGVldCgpKQog
ICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIGNvbGxlY3RDU1NPTVdyYXBwZXJzKHdyYXBw
ZXJNYXAsIHN0YXRpY19jYXN0PENTU1N0eWxlU2hlZXQqPihzdHlsZVNoZWV0KSk7CiAgICAgfQot
ICAgIGNvbGxlY3RDU1NPTVdyYXBwZXJzKHdyYXBwZXJNYXAsIGRvY3VtZW50LT5wYWdlVXNlclNo
ZWV0KCkpOworICAgIGNvbGxlY3RDU1NPTVdyYXBwZXJzKHdyYXBwZXJNYXAsIHN0eWxlU2hlZXRD
b2xsZWN0aW9uLT5wYWdlVXNlclNoZWV0KCkpOwogICAgIHsKLSAgICAgICAgY29uc3QgVmVjdG9y
PFJlZlB0cjxDU1NTdHlsZVNoZWV0PiA+KiBwYWdlR3JvdXBVc2VyU2hlZXRzID0gZG9jdW1lbnQt
PnBhZ2VHcm91cFVzZXJTaGVldHMoKTsKKyAgICAgICAgY29uc3QgVmVjdG9yPFJlZlB0cjxDU1NT
dHlsZVNoZWV0PiA+KiBwYWdlR3JvdXBVc2VyU2hlZXRzID0gc3R5bGVTaGVldENvbGxlY3Rpb24t
PnBhZ2VHcm91cFVzZXJTaGVldHMoKTsKICAgICAgICAgaWYgKHBhZ2VHcm91cFVzZXJTaGVldHMp
IHsKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwLCBzaXplID0gcGFnZUdyb3VwVXNlclNo
ZWV0cy0+c2l6ZSgpOyBpIDwgc2l6ZTsgKytpKQogICAgICAgICAgICAgICAgIGNvbGxlY3RDU1NP
TVdyYXBwZXJzKHdyYXBwZXJNYXAsIHBhZ2VHcm91cFVzZXJTaGVldHMtPmF0KGkpLmdldCgpKTsK
ICAgICAgICAgfQogICAgIH0KICAgICB7Ci0gICAgICAgIGNvbnN0IFZlY3RvcjxSZWZQdHI8Q1NT
U3R5bGVTaGVldD4gPiogZG9jdW1lbnRVc2VyU2hlZXRzID0gZG9jdW1lbnQtPmRvY3VtZW50VXNl
clNoZWV0cygpOworICAgICAgICBjb25zdCBWZWN0b3I8UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4q
IGRvY3VtZW50VXNlclNoZWV0cyA9IHN0eWxlU2hlZXRDb2xsZWN0aW9uLT5kb2N1bWVudFVzZXJT
aGVldHMoKTsKICAgICAgICAgaWYgKGRvY3VtZW50VXNlclNoZWV0cykgewogICAgICAgICAgICAg
Zm9yIChzaXplX3QgaSA9IDAsIHNpemUgPSBkb2N1bWVudFVzZXJTaGVldHMtPnNpemUoKTsgaSA8
IHNpemU7ICsraSkKICAgICAgICAgICAgICAgICBjb2xsZWN0Q1NTT01XcmFwcGVycyh3cmFwcGVy
TWFwLCBkb2N1bWVudFVzZXJTaGVldHMtPmF0KGkpLmdldCgpKTsKQEAgLTMyMTgsNyArMzIxMyw3
IEBAIENTU1N0eWxlUnVsZSogU3R5bGVSZXNvbHZlcjo6ZW5zdXJlRnVsbEMKICAgICAgICAgY29s
bGVjdENTU09NV3JhcHBlcnMobV9zdHlsZVJ1bGVUb0NTU09NV3JhcHBlck1hcCwgbV9zdHlsZVNo
ZWV0Q1NTT01XcmFwcGVyU2V0LCBtZWRpYUNvbnRyb2xzU3R5bGVTaGVldCk7CiAgICAgICAgIGNv
bGxlY3RDU1NPTVdyYXBwZXJzKG1fc3R5bGVSdWxlVG9DU1NPTVdyYXBwZXJNYXAsIG1fc3R5bGVT
aGVldENTU09NV3JhcHBlclNldCwgZnVsbHNjcmVlblN0eWxlU2hlZXQpOwogCi0gICAgICAgIGNv
bGxlY3RDU1NPTVdyYXBwZXJzKG1fc3R5bGVSdWxlVG9DU1NPTVdyYXBwZXJNYXAsIGRvY3VtZW50
KCkpOworICAgICAgICBjb2xsZWN0Q1NTT01XcmFwcGVycyhtX3N0eWxlUnVsZVRvQ1NTT01XcmFw
cGVyTWFwLCBkb2N1bWVudCgpLT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpKTsKICAgICB9CiAgICAg
cmV0dXJuIG1fc3R5bGVSdWxlVG9DU1NPTVdyYXBwZXJNYXAuZ2V0KHJ1bGUpLmdldCgpOwogfQpJ
bmRleDogU291cmNlL1dlYkNvcmUvY3NzL1N0eWxlUmVzb2x2ZXIuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViQ29yZS9jc3MvU3R5bGVSZXNvbHZlci5oCShyZXZpc2lvbiAxMjkzMDMpCisrKyBT
b3VyY2UvV2ViQ29yZS9jc3MvU3R5bGVSZXNvbHZlci5oCSh3b3JraW5nIGNvcHkpCkBAIC0yNDQs
NyArMjQ0LDYgQEAgcHVibGljOgogICAgIGJvb2wgdXNlc1NpYmxpbmdSdWxlcygpIGNvbnN0IHsg
cmV0dXJuICFtX2ZlYXR1cmVzLnNpYmxpbmdSdWxlcy5pc0VtcHR5KCk7IH0KICAgICBib29sIHVz
ZXNGaXJzdExpbmVSdWxlcygpIGNvbnN0IHsgcmV0dXJuIG1fZmVhdHVyZXMudXNlc0ZpcnN0TGlu
ZVJ1bGVzOyB9CiAgICAgYm9vbCB1c2VzQmVmb3JlQWZ0ZXJSdWxlcygpIGNvbnN0IHsgcmV0dXJu
IG1fZmVhdHVyZXMudXNlc0JlZm9yZUFmdGVyUnVsZXM7IH0KLSAgICBib29sIHVzZXNMaW5rUnVs
ZXMoKSBjb25zdCB7IHJldHVybiBtX2ZlYXR1cmVzLnVzZXNMaW5rUnVsZXM7IH0KIAogICAgIHN0
YXRpYyBib29sIGNyZWF0ZVRyYW5zZm9ybU9wZXJhdGlvbnMoQ1NTVmFsdWUqIGluVmFsdWUsIFJl
bmRlclN0eWxlKiBpblN0eWxlLCBSZW5kZXJTdHlsZSogcm9vdFN0eWxlLCBUcmFuc2Zvcm1PcGVy
YXRpb25zJiBvdXRPcGVyYXRpb25zKTsKICAgICAKQEAgLTI5Nyw3ICsyOTYsNiBAQCBwdWJsaWM6
CiAgICAgICAgIFZlY3RvcjxSdWxlRmVhdHVyZT4gdW5jb21tb25BdHRyaWJ1dGVSdWxlczsKICAg
ICAgICAgYm9vbCB1c2VzRmlyc3RMaW5lUnVsZXM7CiAgICAgICAgIGJvb2wgdXNlc0JlZm9yZUFm
dGVyUnVsZXM7Ci0gICAgICAgIGJvb2wgdXNlc0xpbmtSdWxlczsKICAgICB9OwogCiBwcml2YXRl
OgpJbmRleDogU291cmNlL1dlYkNvcmUvZG9tL0RvY3VtZW50LmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViQ29yZS9kb20vRG9jdW1lbnQuY3BwCShyZXZpc2lvbiAxMjkzMDMpCisrKyBTb3Vy
Y2UvV2ViQ29yZS9kb20vRG9jdW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01Nyw2ICs1Nyw3
IEBACiAjaW5jbHVkZSAiRG9jdW1lbnRGcmFnbWVudC5oIgogI2luY2x1ZGUgIkRvY3VtZW50TG9h
ZGVyLmgiCiAjaW5jbHVkZSAiRG9jdW1lbnRNYXJrZXJDb250cm9sbGVyLmgiCisjaW5jbHVkZSAi
RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5oIgogI2luY2x1ZGUgIkRvY3VtZW50VHlwZS5o
IgogI2luY2x1ZGUgIkVkaXRpbmdUZXh0LmgiCiAjaW5jbHVkZSAiRWRpdG9yLmgiCkBAIC00MzYs
OCArNDM3LDcgQEAgRG9jdW1lbnQ6OkRvY3VtZW50KEZyYW1lKiBmcmFtZSwgY29uc3QgSwogI2lm
IEVOQUJMRShNVVRBVElPTl9PQlNFUlZFUlMpCiAgICAgLCBtX211dGF0aW9uT2JzZXJ2ZXJUeXBl
cygwKQogI2VuZGlmCi0gICAgLCBtX3N0eWxlU2hlZXRzKFN0eWxlU2hlZXRMaXN0OjpjcmVhdGUo
dGhpcykpCi0gICAgLCBtX2hhZEFjdGl2ZUxvYWRpbmdTdHlsZXNoZWV0KGZhbHNlKQorICAgICwg
bV9zdHlsZVNoZWV0Q29sbGVjdGlvbihhZG9wdFB0cihuZXcgRG9jdW1lbnRTdHlsZVNoZWV0Q29s
bGVjdGlvbih0aGlzKSkpCiAgICAgLCBtX3JlYWR5U3RhdGUoQ29tcGxldGUpCiAgICAgLCBtX3N0
eWxlUmVjYWxjVGltZXIodGhpcywgJkRvY3VtZW50OjpzdHlsZVJlY2FsY1RpbWVyRmlyZWQpCiAg
ICAgLCBtX3BlbmRpbmdTdHlsZVJlY2FsY1Nob3VsZEZvcmNlKGZhbHNlKQpAQCAtNTAzLDggKzUw
Myw2IEBAIERvY3VtZW50OjpEb2N1bWVudChGcmFtZSogZnJhbWUsIGNvbnN0IEsKIHsKICAgICBt
X2RvY3VtZW50ID0gdGhpczsKIAotICAgIG1fcGFnZUdyb3VwVXNlclNoZWV0Q2FjaGVWYWxpZCA9
IGZhbHNlOwotCiAgICAgbV9wcmludGluZyA9IGZhbHNlOwogICAgIG1fcGFnaW5hdGVkRm9yU2Ny
ZWVuID0gZmFsc2U7CiAKQEAgLTU0MiwyMCArNTQwLDkgQEAgRG9jdW1lbnQ6OkRvY3VtZW50KEZy
YW1lKiBmcmFtZSwgY29uc3QgSwogICAgIG1faW5TdHlsZVJlY2FsYyA9IGZhbHNlOwogICAgIG1f
Y2xvc2VBZnRlclN0eWxlUmVjYWxjID0gZmFsc2U7CiAKLSAgICBtX3VzZXNTaWJsaW5nUnVsZXMg
PSBmYWxzZTsKLSAgICBtX3VzZXNTaWJsaW5nUnVsZXNPdmVycmlkZSA9IGZhbHNlOwotICAgIG1f
dXNlc0ZpcnN0TGluZVJ1bGVzID0gZmFsc2U7Ci0gICAgbV91c2VzRmlyc3RMZXR0ZXJSdWxlcyA9
IGZhbHNlOwotICAgIG1fdXNlc0JlZm9yZUFmdGVyUnVsZXMgPSBmYWxzZTsKLSAgICBtX3VzZXNC
ZWZvcmVBZnRlclJ1bGVzT3ZlcnJpZGUgPSBmYWxzZTsKLSAgICBtX3VzZXNSZW1Vbml0cyA9IGZh
bHNlOwotICAgIG1fdXNlc0xpbmtSdWxlcyA9IGZhbHNlOwotCiAgICAgbV9nb3RvQW5jaG9yTmVl
ZGVkQWZ0ZXJTdHlsZXNoZWV0c0xvYWQgPSBmYWxzZTsKIAogICAgIG1fZGlkQ2FsY3VsYXRlU3R5
bGVSZXNvbHZlciA9IGZhbHNlOwotICAgIG1faGFzRGlydHlTdHlsZVJlc29sdmVyID0gZmFsc2U7
Ci0gICAgbV9wZW5kaW5nU3R5bGVzaGVldHMgPSAwOwogICAgIG1faWdub3JlUGVuZGluZ1N0eWxl
c2hlZXRzID0gZmFsc2U7CiAgICAgbV9uZWVkc05vdGlmeVJlbW92ZUFsbFBlbmRpbmdTdHlsZXNo
ZWV0ID0gZmFsc2U7CiAgICAgbV9oYXNOb2Rlc1dpdGhQbGFjZWhvbGRlclN0eWxlID0gZmFsc2U7
CkBAIC02NDIsMjQgKzYyOSwxMyBAQCBEb2N1bWVudDo6fkRvY3VtZW50KCkKIAogICAgIG1fZGVj
b2RlciA9IDA7CiAKLSAgICBpZiAobV9zdHlsZVNoZWV0cykKLSAgICAgICAgbV9zdHlsZVNoZWV0
cy0+ZG9jdW1lbnREZXN0cm95ZWQoKTsKKyAgICBtX3N0eWxlU2hlZXRDb2xsZWN0aW9uLmNsZWFy
KCk7CiAKICAgICBpZiAobV9uYW1lZEZsb3dzKQogICAgICAgICBtX25hbWVkRmxvd3MtPmRvY3Vt
ZW50RGVzdHJveWVkKCk7CiAKICAgICBpZiAobV9lbGVtU2hlZXQpCiAgICAgICAgIG1fZWxlbVNo
ZWV0LT5jbGVhck93bmVyTm9kZSgpOwotICAgIGlmIChtX3BhZ2VVc2VyU2hlZXQpCi0gICAgICAg
IG1fcGFnZVVzZXJTaGVldC0+Y2xlYXJPd25lck5vZGUoKTsKLSAgICBpZiAobV9wYWdlR3JvdXBV
c2VyU2hlZXRzKSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9wYWdlR3JvdXBV
c2VyU2hlZXRzLT5zaXplKCk7ICsraSkKLSAgICAgICAgICAgICgqbV9wYWdlR3JvdXBVc2VyU2hl
ZXRzKVtpXS0+Y2xlYXJPd25lck5vZGUoKTsKLSAgICB9Ci0gICAgaWYgKG1fdXNlclNoZWV0cykg
ewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fdXNlclNoZWV0cy0+c2l6ZSgpOyAr
K2kpCi0gICAgICAgICAgICAoKm1fdXNlclNoZWV0cylbaV0tPmNsZWFyT3duZXJOb2RlKCk7Ci0g
ICAgfQogCiAgICAgZGVsZXRlQ3VzdG9tRm9udHMoKTsKIApAQCAtODAxLDE0ICs3NzcsMTQgQEAg
dm9pZCBEb2N1bWVudDo6c2V0Q29tcGF0aWJpbGl0eU1vZGUoQ29tcAogewogICAgIGlmIChtX2Nv
bXBhdGliaWxpdHlNb2RlTG9ja2VkIHx8IG1vZGUgPT0gbV9jb21wYXRpYmlsaXR5TW9kZSkKICAg
ICAgICAgcmV0dXJuOwotICAgIEFTU0VSVCghbV9zdHlsZVNoZWV0cy0+bGVuZ3RoKCkpOworICAg
IEFTU0VSVCghbV9zdHlsZVNoZWV0Q29sbGVjdGlvbi0+YXV0aG9yU3R5bGVTaGVldHMoKS0+bGVu
Z3RoKCkpOwogICAgIGJvb2wgd2FzSW5RdWlya3NNb2RlID0gaW5RdWlya3NNb2RlKCk7CiAgICAg
bV9jb21wYXRpYmlsaXR5TW9kZSA9IG1vZGU7CiAgICAgc2VsZWN0b3JRdWVyeUNhY2hlKCktPmlu
dmFsaWRhdGUoKTsKICAgICBpZiAoaW5RdWlya3NNb2RlKCkgIT0gd2FzSW5RdWlya3NNb2RlKSB7
CiAgICAgICAgIC8vIEFsbCB1c2VyIHN0eWxlc2hlZXRzIGhhdmUgdG8gcmVwYXJzZSB1c2luZyB0
aGUgZGlmZmVyZW50IG1vZGUuCi0gICAgICAgIGNsZWFyUGFnZVVzZXJTaGVldCgpOwotICAgICAg
ICBjbGVhclBhZ2VHcm91cFVzZXJTaGVldHMoKTsKKyAgICAgICAgbV9zdHlsZVNoZWV0Q29sbGVj
dGlvbi0+Y2xlYXJQYWdlVXNlclNoZWV0KCk7CisgICAgICAgIG1fc3R5bGVTaGVldENvbGxlY3Rp
b24tPmNsZWFyUGFnZUdyb3VwVXNlclNoZWV0cygpOwogICAgIH0KIH0KIApAQCAtMTgyMSwxMyAr
MTc5NywxMyBAQCB2b2lkIERvY3VtZW50OjpyZWNhbGNTdHlsZShTdHlsZUNoYW5nZSBjCiAgICAg
Ly8gcmUtYXR0YWNoaW5nIG91ciBjb250YWluaW5nIGlmcmFtZSwgd2hpY2ggd2hlbiBhc2tlZCBI
VE1MRnJhbWVFbGVtZW50QmFzZTo6aXNVUkxBbGxvd2VkCiAgICAgLy8gaGl0cyBhIG51bGwtZGVy
ZWZlcmVuY2UgZHVlIHRvIHNlY3VyaXR5IGNvZGUgYWx3YXlzIGFzc3VtaW5nIHRoZSBkb2N1bWVu
dCBoYXMgYSBTZWN1cml0eU9yaWdpbi4KIAotICAgIGlmIChtX2hhc0RpcnR5U3R5bGVSZXNvbHZl
cikKLSAgICAgICAgdXBkYXRlQWN0aXZlU3R5bGVzaGVldHMoUmVjYWxjU3R5bGVJbW1lZGlhdGVs
eSk7CisgICAgaWYgKG1fc3R5bGVTaGVldENvbGxlY3Rpb24tPm5lZWRzVXBkYXRlQWN0aXZlU3R5
bGVzaGVldHNPblN0eWxlUmVjYWxjKCkpCisgICAgICAgIG1fc3R5bGVTaGVldENvbGxlY3Rpb24t
PnVwZGF0ZUFjdGl2ZVN0eWxlU2hlZXRzKERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OkZ1
bGxVcGRhdGUpOwogCiAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2llIGNvb2tpZSA9
IEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6d2lsbFJlY2FsY3VsYXRlU3R5bGUodGhpcyk7CiAK
ICAgICBpZiAobV9lbGVtU2hlZXQgJiYgbV9lbGVtU2hlZXQtPmNvbnRlbnRzKCktPnVzZXNSZW1V
bml0cygpKQotICAgICAgICBtX3VzZXNSZW1Vbml0cyA9IHRydWU7CisgICAgICAgIG1fc3R5bGVT
aGVldENvbGxlY3Rpb24tPnNldFVzZXNSZW1Vbml0KHRydWUpOwogCiAgICAgbV9pblN0eWxlUmVj
YWxjID0gdHJ1ZTsKICAgICBzdXNwZW5kUG9zdEF0dGFjaENhbGxiYWNrcygpOwpAQCAtMTg4Myw3
ICsxODU5LDcgQEAgYmFpbF9vdXQ6CiAgICAgCiAgICAgLy8gUHNldWRvIGVsZW1lbnQgcmVtb3Zh
bCBhbmQgc2ltaWxhciBtYXkgb25seSB3b3JrIHdpdGggdGhlc2UgZmxhZ3Mgc3RpbGwgc2V0LiBS
ZXNldCB0aGVtIGFmdGVyIHRoZSBzdHlsZSByZWNhbGMuCiAgICAgaWYgKG1fc3R5bGVSZXNvbHZl
cikKLSAgICAgICAgcmVzZXRDU1NGZWF0dXJlRmxhZ3MoKTsKKyAgICAgICAgbV9zdHlsZVNoZWV0
Q29sbGVjdGlvbi0+cmVzZXRDU1NGZWF0dXJlRmxhZ3MoKTsKIAogICAgIGlmIChmcmFtZVZpZXcp
IHsKICAgICAgICAgZnJhbWVWaWV3LT5yZXN1bWVTY2hlZHVsZWRFdmVudHMoKTsKQEAgLTIwNjYs
MzAgKzIwNDIsMTMgQEAgdm9pZCBEb2N1bWVudDo6c2V0SXNWaWV3U291cmNlKGJvb2wgaXNWaQog
ICAgIGRpZFVwZGF0ZVNlY3VyaXR5T3JpZ2luKCk7CiB9CiAKLXZvaWQgRG9jdW1lbnQ6OmNvbWJp
bmVDU1NGZWF0dXJlRmxhZ3MoKQotewotICAgIC8vIERlbGF5IHJlc2V0dGluZyB0aGUgZmxhZ3Mg
dW50aWwgYWZ0ZXIgbmV4dCBzdHlsZSByZWNhbGMgc2luY2UgdW5hcHBseWluZyB0aGUgc3R5bGUg
bWF5IG5vdCB3b3JrIHdpdGhvdXQgdGhlc2Ugc2V0ICh0aGlzIGlzIHRydWUgYXQgbGVhc3Qgd2l0
aCBiZWZvcmUvYWZ0ZXIpLgotICAgIG1fdXNlc1NpYmxpbmdSdWxlcyA9IG1fdXNlc1NpYmxpbmdS
dWxlcyB8fCBtX3N0eWxlUmVzb2x2ZXItPnVzZXNTaWJsaW5nUnVsZXMoKTsKLSAgICBtX3VzZXNG
aXJzdExpbmVSdWxlcyA9IG1fdXNlc0ZpcnN0TGluZVJ1bGVzIHx8IG1fc3R5bGVSZXNvbHZlci0+
dXNlc0ZpcnN0TGluZVJ1bGVzKCk7Ci0gICAgbV91c2VzQmVmb3JlQWZ0ZXJSdWxlcyA9IG1fdXNl
c0JlZm9yZUFmdGVyUnVsZXMgfHwgbV9zdHlsZVJlc29sdmVyLT51c2VzQmVmb3JlQWZ0ZXJSdWxl
cygpOwotICAgIG1fdXNlc0xpbmtSdWxlcyA9IG1fdXNlc0xpbmtSdWxlcyB8fCBtX3N0eWxlUmVz
b2x2ZXItPnVzZXNMaW5rUnVsZXMoKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6cmVzZXRDU1NGZWF0
dXJlRmxhZ3MoKQotewotICAgIG1fdXNlc1NpYmxpbmdSdWxlcyA9IG1fc3R5bGVSZXNvbHZlci0+
dXNlc1NpYmxpbmdSdWxlcygpOwotICAgIG1fdXNlc0ZpcnN0TGluZVJ1bGVzID0gbV9zdHlsZVJl
c29sdmVyLT51c2VzRmlyc3RMaW5lUnVsZXMoKTsKLSAgICBtX3VzZXNCZWZvcmVBZnRlclJ1bGVz
ID0gbV9zdHlsZVJlc29sdmVyLT51c2VzQmVmb3JlQWZ0ZXJSdWxlcygpOwotICAgIG1fdXNlc0xp
bmtSdWxlcyA9IG1fc3R5bGVSZXNvbHZlci0+dXNlc0xpbmtSdWxlcygpOwotfQotCiB2b2lkIERv
Y3VtZW50OjpjcmVhdGVTdHlsZVJlc29sdmVyKCkKIHsKICAgICBib29sIG1hdGNoQXV0aG9yQW5k
VXNlclN0eWxlcyA9IHRydWU7CiAgICAgaWYgKFNldHRpbmdzKiBkb2NTZXR0aW5ncyA9IHNldHRp
bmdzKCkpCiAgICAgICAgIG1hdGNoQXV0aG9yQW5kVXNlclN0eWxlcyA9IGRvY1NldHRpbmdzLT5h
dXRob3JBbmRVc2VyU3R5bGVzRW5hYmxlZCgpOwogICAgIG1fc3R5bGVSZXNvbHZlciA9IGFkb3B0
UHRyKG5ldyBTdHlsZVJlc29sdmVyKHRoaXMsIG1hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykpOwot
ICAgIGNvbWJpbmVDU1NGZWF0dXJlRmxhZ3MoKTsKKyAgICBtX3N0eWxlU2hlZXRDb2xsZWN0aW9u
LT5jb21iaW5lQ1NTRmVhdHVyZUZsYWdzKCk7CiB9CiAKIGlubGluZSB2b2lkIERvY3VtZW50Ojpj
bGVhclN0eWxlUmVzb2x2ZXIoKQpAQCAtMjkwMiwxMDUgKzI4NjEsMjMgQEAgRnJhbWUqIERvY3Vt
ZW50OjpmaW5kVW5zYWZlUGFyZW50U2Nyb2xsUAogICAgIHJldHVybiAwOwogfQogCi1DU1NTdHls
ZVNoZWV0KiBEb2N1bWVudDo6cGFnZVVzZXJTaGVldCgpCi17Ci0gICAgaWYgKG1fcGFnZVVzZXJT
aGVldCkKLSAgICAgICAgcmV0dXJuIG1fcGFnZVVzZXJTaGVldC5nZXQoKTsKLSAgICAKLSAgICBQ
YWdlKiBvd25pbmdQYWdlID0gcGFnZSgpOwotICAgIGlmICghb3duaW5nUGFnZSkKLSAgICAgICAg
cmV0dXJuIDA7Ci0gICAgCi0gICAgU3RyaW5nIHVzZXJTaGVldFRleHQgPSBvd25pbmdQYWdlLT51
c2VyU3R5bGVTaGVldCgpOwotICAgIGlmICh1c2VyU2hlZXRUZXh0LmlzRW1wdHkoKSkKLSAgICAg
ICAgcmV0dXJuIDA7Ci0gICAgCi0gICAgLy8gUGFyc2UgdGhlIHNoZWV0IGFuZCBjYWNoZSBpdC4K
LSAgICBtX3BhZ2VVc2VyU2hlZXQgPSBDU1NTdHlsZVNoZWV0OjpjcmVhdGVJbmxpbmUodGhpcywg
c2V0dGluZ3MoKS0+dXNlclN0eWxlU2hlZXRMb2NhdGlvbigpKTsKLSAgICBtX3BhZ2VVc2VyU2hl
ZXQtPmNvbnRlbnRzKCktPnNldElzVXNlclN0eWxlU2hlZXQodHJ1ZSk7Ci0gICAgbV9wYWdlVXNl
clNoZWV0LT5jb250ZW50cygpLT5wYXJzZVN0cmluZyh1c2VyU2hlZXRUZXh0KTsKLSAgICByZXR1
cm4gbV9wYWdlVXNlclNoZWV0LmdldCgpOwotfQotCi12b2lkIERvY3VtZW50OjpjbGVhclBhZ2VV
c2VyU2hlZXQoKQotewotICAgIGlmIChtX3BhZ2VVc2VyU2hlZXQpIHsKLSAgICAgICAgbV9wYWdl
VXNlclNoZWV0ID0gMDsKLSAgICAgICAgc3R5bGVSZXNvbHZlckNoYW5nZWQoRGVmZXJSZWNhbGNT
dHlsZSk7Ci0gICAgfQotfQotCi12b2lkIERvY3VtZW50Ojp1cGRhdGVQYWdlVXNlclNoZWV0KCkK
LXsKLSAgICBjbGVhclBhZ2VVc2VyU2hlZXQoKTsKLSAgICBpZiAocGFnZVVzZXJTaGVldCgpKQot
ICAgICAgICBzdHlsZVJlc29sdmVyQ2hhbmdlZChSZWNhbGNTdHlsZUltbWVkaWF0ZWx5KTsKLX0K
IAotY29uc3QgVmVjdG9yPFJlZlB0cjxDU1NTdHlsZVNoZWV0PiA+KiBEb2N1bWVudDo6cGFnZUdy
b3VwVXNlclNoZWV0cygpIGNvbnN0Cit2b2lkIERvY3VtZW50OjpzZWFtbGVzc1BhcmVudFVwZGF0
ZWRTdHlsZXNoZWV0cygpCiB7Ci0gICAgaWYgKG1fcGFnZUdyb3VwVXNlclNoZWV0Q2FjaGVWYWxp
ZCkKLSAgICAgICAgcmV0dXJuIG1fcGFnZUdyb3VwVXNlclNoZWV0cy5nZXQoKTsKLSAgICAKLSAg
ICBtX3BhZ2VHcm91cFVzZXJTaGVldENhY2hlVmFsaWQgPSB0cnVlOwotICAgIAotICAgIFBhZ2Uq
IG93bmluZ1BhZ2UgPSBwYWdlKCk7Ci0gICAgaWYgKCFvd25pbmdQYWdlKQotICAgICAgICByZXR1
cm4gMDsKLSAgICAgICAgCi0gICAgY29uc3QgUGFnZUdyb3VwJiBwYWdlR3JvdXAgPSBvd25pbmdQ
YWdlLT5ncm91cCgpOwotICAgIGNvbnN0IFVzZXJTdHlsZVNoZWV0TWFwKiBzaGVldHNNYXAgPSBw
YWdlR3JvdXAudXNlclN0eWxlU2hlZXRzKCk7Ci0gICAgaWYgKCFzaGVldHNNYXApCi0gICAgICAg
IHJldHVybiAwOwotCi0gICAgVXNlclN0eWxlU2hlZXRNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9
IHNoZWV0c01hcC0+ZW5kKCk7Ci0gICAgZm9yIChVc2VyU3R5bGVTaGVldE1hcDo6Y29uc3RfaXRl
cmF0b3IgaXQgPSBzaGVldHNNYXAtPmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAg
ICBjb25zdCBVc2VyU3R5bGVTaGVldFZlY3Rvciogc2hlZXRzID0gaXQtPnNlY29uZC5nZXQoKTsK
LSAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNoZWV0cy0+c2l6ZSgpOyArK2kpIHsK
LSAgICAgICAgICAgIGNvbnN0IFVzZXJTdHlsZVNoZWV0KiBzaGVldCA9IHNoZWV0cy0+YXQoaSku
Z2V0KCk7Ci0gICAgICAgICAgICBpZiAoc2hlZXQtPmluamVjdGVkRnJhbWVzKCkgPT0gSW5qZWN0
SW5Ub3BGcmFtZU9ubHkgJiYgb3duZXJFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgY29udGlu
dWU7Ci0gICAgICAgICAgICBpZiAoIVVzZXJDb250ZW50VVJMUGF0dGVybjo6bWF0Y2hlc1BhdHRl
cm5zKHVybCgpLCBzaGVldC0+d2hpdGVsaXN0KCksIHNoZWV0LT5ibGFja2xpc3QoKSkpCi0gICAg
ICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBSZWZQdHI8Q1NTU3R5bGVTaGVldD4g
Z3JvdXBTaGVldCA9IENTU1N0eWxlU2hlZXQ6OmNyZWF0ZUlubGluZShjb25zdF9jYXN0PERvY3Vt
ZW50Kj4odGhpcyksIHNoZWV0LT51cmwoKSk7Ci0gICAgICAgICAgICBpZiAoIW1fcGFnZUdyb3Vw
VXNlclNoZWV0cykKLSAgICAgICAgICAgICAgICBtX3BhZ2VHcm91cFVzZXJTaGVldHMgPSBhZG9w
dFB0cihuZXcgVmVjdG9yPFJlZlB0cjxDU1NTdHlsZVNoZWV0PiA+KTsKLSAgICAgICAgICAgIG1f
cGFnZUdyb3VwVXNlclNoZWV0cy0+YXBwZW5kKGdyb3VwU2hlZXQpOwotICAgICAgICAgICAgZ3Jv
dXBTaGVldC0+Y29udGVudHMoKS0+c2V0SXNVc2VyU3R5bGVTaGVldChzaGVldC0+bGV2ZWwoKSA9
PSBVc2VyU3R5bGVVc2VyTGV2ZWwpOwotICAgICAgICAgICAgZ3JvdXBTaGVldC0+Y29udGVudHMo
KS0+cGFyc2VTdHJpbmcoc2hlZXQtPnNvdXJjZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAg
IHJldHVybiBtX3BhZ2VHcm91cFVzZXJTaGVldHMuZ2V0KCk7CisgICAgc3R5bGVSZXNvbHZlckNo
YW5nZWQoUmVjYWxjU3R5bGVJbW1lZGlhdGVseSk7CiB9CiAKLXZvaWQgRG9jdW1lbnQ6OmNsZWFy
UGFnZUdyb3VwVXNlclNoZWV0cygpCit2b2lkIERvY3VtZW50OjpkaWRSZW1vdmVBbGxQZW5kaW5n
U3R5bGVzaGVldCgpCiB7Ci0gICAgbV9wYWdlR3JvdXBVc2VyU2hlZXRDYWNoZVZhbGlkID0gZmFs
c2U7Ci0gICAgaWYgKG1fcGFnZUdyb3VwVXNlclNoZWV0cyAmJiBtX3BhZ2VHcm91cFVzZXJTaGVl
dHMtPnNpemUoKSkgewotICAgICAgICBtX3BhZ2VHcm91cFVzZXJTaGVldHMtPmNsZWFyKCk7Ci0g
ICAgICAgIHN0eWxlUmVzb2x2ZXJDaGFuZ2VkKERlZmVyUmVjYWxjU3R5bGUpOwotICAgIH0KLX0K
KyAgICBtX25lZWRzTm90aWZ5UmVtb3ZlQWxsUGVuZGluZ1N0eWxlc2hlZXQgPSBmYWxzZTsKIAot
dm9pZCBEb2N1bWVudDo6dXBkYXRlUGFnZUdyb3VwVXNlclNoZWV0cygpCi17Ci0gICAgY2xlYXJQ
YWdlR3JvdXBVc2VyU2hlZXRzKCk7Ci0gICAgaWYgKHBhZ2VHcm91cFVzZXJTaGVldHMoKSAmJiBw
YWdlR3JvdXBVc2VyU2hlZXRzKCktPnNpemUoKSkKLSAgICAgICAgc3R5bGVSZXNvbHZlckNoYW5n
ZWQoUmVjYWxjU3R5bGVJbW1lZGlhdGVseSk7Ci19CisgICAgc3R5bGVSZXNvbHZlckNoYW5nZWQo
UmVjYWxjU3R5bGVJZk5lZWRlZCk7CiAKLXZvaWQgRG9jdW1lbnQ6OmFkZFVzZXJTaGVldChQYXNz
UmVmUHRyPFN0eWxlU2hlZXRDb250ZW50cz4gdXNlclNoZWV0KQotewotICAgIGlmICghbV91c2Vy
U2hlZXRzKQotICAgICAgICBtX3VzZXJTaGVldHMgPSBhZG9wdFB0cihuZXcgVmVjdG9yPFJlZlB0
cjxDU1NTdHlsZVNoZWV0PiA+KTsKLSAgICBtX3VzZXJTaGVldHMtPmFwcGVuZChDU1NTdHlsZVNo
ZWV0OjpjcmVhdGUodXNlclNoZWV0LCB0aGlzKSk7Ci0gICAgc3R5bGVSZXNvbHZlckNoYW5nZWQo
UmVjYWxjU3R5bGVJbW1lZGlhdGVseSk7Ci19CisgICAgaWYgKFNjcmlwdGFibGVEb2N1bWVudFBh
cnNlciogcGFyc2VyID0gc2NyaXB0YWJsZURvY3VtZW50UGFyc2VyKCkpCisgICAgICAgIHBhcnNl
ci0+ZXhlY3V0ZVNjcmlwdHNXYWl0aW5nRm9yU3R5bGVzaGVldHMoKTsKIAotdm9pZCBEb2N1bWVu
dDo6c2VhbWxlc3NQYXJlbnRVcGRhdGVkU3R5bGVzaGVldHMoKQotewotICAgIHN0eWxlUmVzb2x2
ZXJDaGFuZ2VkKFJlY2FsY1N0eWxlSW1tZWRpYXRlbHkpOworICAgIGlmIChtX2dvdG9BbmNob3JO
ZWVkZWRBZnRlclN0eWxlc2hlZXRzTG9hZCAmJiB2aWV3KCkpCisgICAgICAgIHZpZXcoKS0+c2Ny
b2xsVG9GcmFnbWVudChtX3VybCk7CiB9CiAKIENTU1N0eWxlU2hlZXQqIERvY3VtZW50OjplbGVt
ZW50U2hlZXQoKQpAQCAtMzA0MSw4ICsyOTE4LDggQEAgdm9pZCBEb2N1bWVudDo6cHJvY2Vzc0h0
dHBFcXVpdihjb25zdCBTdAogICAgICAgICAvLyBGb3IgbW9yZSBpbmZvLCBzZWUgdGhlIHRlc3Qg
YXQ6CiAgICAgICAgIC8vIGh0dHA6Ly93d3cuaGl4aWUuY2gvdGVzdHMvZXZpbC9jc3MvaW1wb3J0
L21haW4vcHJlZmVycmVkLmh0bWwKICAgICAgICAgLy8gLWR3aAotICAgICAgICBtX3NlbGVjdGVk
U3R5bGVzaGVldFNldCA9IGNvbnRlbnQ7Ci0gICAgICAgIG1fcHJlZmVycmVkU3R5bGVzaGVldFNl
dCA9IGNvbnRlbnQ7CisgICAgICAgIG1fc3R5bGVTaGVldENvbGxlY3Rpb24tPnNldFNlbGVjdGVk
U3R5bGVzaGVldFNldE5hbWUoY29udGVudCk7CisgICAgICAgIG1fc3R5bGVTaGVldENvbGxlY3Rp
b24tPnNldFByZWZlcnJlZFN0eWxlc2hlZXRTZXROYW1lKGNvbnRlbnQpOwogICAgICAgICBzdHls
ZVJlc29sdmVyQ2hhbmdlZChEZWZlclJlY2FsY1N0eWxlKTsKICAgICB9IGVsc2UgaWYgKGVxdWFs
SWdub3JpbmdDYXNlKGVxdWl2LCAicmVmcmVzaCIpKSB7CiAgICAgICAgIGRvdWJsZSBkZWxheTsK
QEAgLTMzMTQsNjMgKzMxOTEsMjUgQEAgUGFzc1JlZlB0cjxOb2RlPiBEb2N1bWVudDo6Y2xvbmVO
b2RlKGJvbwogCiBTdHlsZVNoZWV0TGlzdCogRG9jdW1lbnQ6OnN0eWxlU2hlZXRzKCkKIHsKLSAg
ICByZXR1cm4gbV9zdHlsZVNoZWV0cy5nZXQoKTsKKyAgICByZXR1cm4gbV9zdHlsZVNoZWV0Q29s
bGVjdGlvbi0+YXV0aG9yU3R5bGVTaGVldHMoKTsKIH0KIAogU3RyaW5nIERvY3VtZW50OjpwcmVm
ZXJyZWRTdHlsZXNoZWV0U2V0KCkgY29uc3QKIHsKLSAgICByZXR1cm4gbV9wcmVmZXJyZWRTdHls
ZXNoZWV0U2V0OworICAgIHJldHVybiBtX3N0eWxlU2hlZXRDb2xsZWN0aW9uLT5wcmVmZXJyZWRT
dHlsZXNoZWV0U2V0TmFtZSgpOwogfQogCiBTdHJpbmcgRG9jdW1lbnQ6OnNlbGVjdGVkU3R5bGVz
aGVldFNldCgpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIG1fc2VsZWN0ZWRTdHlsZXNoZWV0U2V0Owor
ICAgIHJldHVybiBtX3N0eWxlU2hlZXRDb2xsZWN0aW9uLT5zZWxlY3RlZFN0eWxlc2hlZXRTZXRO
YW1lKCk7CiB9CiAKIHZvaWQgRG9jdW1lbnQ6OnNldFNlbGVjdGVkU3R5bGVzaGVldFNldChjb25z
dCBTdHJpbmcmIGFTdHJpbmcpCiB7Ci0gICAgbV9zZWxlY3RlZFN0eWxlc2hlZXRTZXQgPSBhU3Ry
aW5nOworICAgIG1fc3R5bGVTaGVldENvbGxlY3Rpb24tPnNldFNlbGVjdGVkU3R5bGVzaGVldFNl
dE5hbWUoYVN0cmluZyk7CiAgICAgc3R5bGVSZXNvbHZlckNoYW5nZWQoRGVmZXJSZWNhbGNTdHls
ZSk7CiB9CiAKLS8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuZXZlciBhIHRvcC1sZXZlbCBz
dHlsZXNoZWV0IGhhcyBmaW5pc2hlZCBsb2FkaW5nLgotdm9pZCBEb2N1bWVudDo6cmVtb3ZlUGVu
ZGluZ1NoZWV0KFJlbW92ZVBlbmRpbmdTaGVldE5vdGlmaWNhdGlvblR5cGUgbm90aWZpY2F0aW9u
KQotewotICAgIC8vIE1ha2Ugc3VyZSB3ZSBrbmV3IHRoaXMgc2hlZXQgd2FzIHBlbmRpbmcsIGFu
ZCB0aGF0IG91ciBjb3VudCBpc24ndCBvdXQgb2Ygc3luYy4KLSAgICBBU1NFUlQobV9wZW5kaW5n
U3R5bGVzaGVldHMgPiAwKTsKLQotICAgIG1fcGVuZGluZ1N0eWxlc2hlZXRzLS07Ci0gICAgCi0j
aWZkZWYgSU5TVFJVTUVOVF9MQVlPVVRfU0NIRURVTElORwotICAgIGlmICghb3duZXJFbGVtZW50
KCkpCi0gICAgICAgIHByaW50ZigiU3R5bGVzaGVldCBsb2FkZWQgYXQgdGltZSAlZC4gJWQgc3R5
bGVzaGVldHMgc3RpbGwgcmVtYWluLlxuIiwgZWxhcHNlZFRpbWUoKSwgbV9wZW5kaW5nU3R5bGVz
aGVldHMpOwotI2VuZGlmCi0KLSAgICBpZiAobV9wZW5kaW5nU3R5bGVzaGVldHMpCi0gICAgICAg
IHJldHVybjsKLQotICAgIGlmIChub3RpZmljYXRpb24gPT0gUmVtb3ZlUGVuZGluZ1NoZWV0Tm90
aWZ5TGF0ZXIpIHsKLSAgICAgICAgc2V0TmVlZHNOb3RpZnlSZW1vdmVBbGxQZW5kaW5nU3R5bGVz
aGVldCgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIGRpZFJlbW92ZUFsbFBl
bmRpbmdTdHlsZXNoZWV0KCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmRpZFJlbW92ZUFsbFBlbmRp
bmdTdHlsZXNoZWV0KCkKLXsKLSAgICBtX25lZWRzTm90aWZ5UmVtb3ZlQWxsUGVuZGluZ1N0eWxl
c2hlZXQgPSBmYWxzZTsKLQotICAgIHN0eWxlUmVzb2x2ZXJDaGFuZ2VkKFJlY2FsY1N0eWxlSWZO
ZWVkZWQpOwotCi0gICAgaWYgKFNjcmlwdGFibGVEb2N1bWVudFBhcnNlciogcGFyc2VyID0gc2Ny
aXB0YWJsZURvY3VtZW50UGFyc2VyKCkpCi0gICAgICAgIHBhcnNlci0+ZXhlY3V0ZVNjcmlwdHNX
YWl0aW5nRm9yU3R5bGVzaGVldHMoKTsKLQotICAgIGlmIChtX2dvdG9BbmNob3JOZWVkZWRBZnRl
clN0eWxlc2hlZXRzTG9hZCAmJiB2aWV3KCkpCi0gICAgICAgIHZpZXcoKS0+c2Nyb2xsVG9GcmFn
bWVudChtX3VybCk7Ci19Ci0KLQogdm9pZCBEb2N1bWVudDo6ZXZhbHVhdGVNZWRpYVF1ZXJ5TGlz
dCgpCiB7CiAgICAgaWYgKG1fbWVkaWFRdWVyeU1hdGNoZXIpCkBAIC0zMzg1LDIwICszMjI0LDI0
IEBAIHZvaWQgRG9jdW1lbnQ6OnN0eWxlUmVzb2x2ZXJDaGFuZ2VkKFN0eWwKICAgICAgICAgbV9z
dHlsZVJlc29sdmVyLmNsZWFyKCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CisgICAgbV9kaWRD
YWxjdWxhdGVTdHlsZVJlc29sdmVyID0gdHJ1ZTsKIAogI2lmZGVmIElOU1RSVU1FTlRfTEFZT1VU
X1NDSEVEVUxJTkcKICAgICBpZiAoIW93bmVyRWxlbWVudCgpKQogICAgICAgICBwcmludGYoIkJl
Z2lubmluZyB1cGRhdGUgb2Ygc3R5bGUgc2VsZWN0b3IgYXQgdGltZSAlZC5cbiIsIGVsYXBzZWRU
aW1lKCkpOwogI2VuZGlmCiAKLSAgICBib29sIHN0eWxlc2hlZXRDaGFuZ2VSZXF1aXJlc1N0eWxl
UmVjYWxjID0gdXBkYXRlQWN0aXZlU3R5bGVzaGVldHModXBkYXRlRmxhZyk7CisgICAgRG9jdW1l
bnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6VXBkYXRlRmxhZyBzdHlsZVNoZWV0VXBkYXRlID0gKHVw
ZGF0ZUZsYWcgPT0gUmVjYWxjU3R5bGVJZk5lZWRlZCkKKyAgICAgICAgPyBEb2N1bWVudFN0eWxl
U2hlZXRDb2xsZWN0aW9uOjpPcHRpbWl6ZWRVcGRhdGUKKyAgICAgICAgOiBEb2N1bWVudFN0eWxl
U2hlZXRDb2xsZWN0aW9uOjpGdWxsVXBkYXRlOworICAgIGJvb2wgc3R5bGVzaGVldENoYW5nZVJl
cXVpcmVzU3R5bGVSZWNhbGMgPSBtX3N0eWxlU2hlZXRDb2xsZWN0aW9uLT51cGRhdGVBY3RpdmVT
dHlsZVNoZWV0cyhzdHlsZVNoZWV0VXBkYXRlKTsKIAogICAgIGlmICh1cGRhdGVGbGFnID09IERl
ZmVyUmVjYWxjU3R5bGUpIHsKICAgICAgICAgc2NoZWR1bGVGb3JjZWRTdHlsZVJlY2FsYygpOwog
ICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgaWYgKGRpZExheW91dFdpdGhQZW5kaW5nU3R5
bGVzaGVldHMoKSAmJiBtX3BlbmRpbmdTdHlsZXNoZWV0cyA8PSAwKSB7CisgICAgaWYgKGRpZExh
eW91dFdpdGhQZW5kaW5nU3R5bGVzaGVldHMoKSAmJiAhbV9zdHlsZVNoZWV0Q29sbGVjdGlvbi0+
aGFzUGVuZGluZ1NoZWV0cygpKSB7CiAgICAgICAgIG1fcGVuZGluZ1NoZWV0TGF5b3V0ID0gSWdu
b3JlTGF5b3V0V2l0aFBlbmRpbmdTaGVldHM7CiAgICAgICAgIGlmIChyZW5kZXJlcigpKQogICAg
ICAgICAgICAgcmVuZGVyZXIoKS0+cmVwYWludCgpOwpAQCAtMzQyOCwyMTkgKzMyNzEsNiBAQCB2
b2lkIERvY3VtZW50OjpzdHlsZVJlc29sdmVyQ2hhbmdlZChTdHlsCiAgICAgZXZhbHVhdGVNZWRp
YVF1ZXJ5TGlzdCgpOwogfQogCi12b2lkIERvY3VtZW50OjphZGRTdHlsZVNoZWV0Q2FuZGlkYXRl
Tm9kZShOb2RlKiBub2RlLCBib29sIGNyZWF0ZWRCeVBhcnNlcikKLXsKLSAgICBpZiAoIW5vZGUt
PmluRG9jdW1lbnQoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIC8vIFVudGlsIHRoZSA8
Ym9keT4gZXhpc3RzLCB3ZSBoYXZlIG5vIGNob2ljZSBidXQgdG8gY29tcGFyZSBkb2N1bWVudCBw
b3NpdGlvbnMsCi0gICAgLy8gc2luY2Ugc3R5bGVzIG91dHNpZGUgb2YgdGhlIGJvZHkgYW5kIGhl
YWQgY29udGludWUgdG8gYmUgc2h1bnRlZCBpbnRvIHRoZSBoZWFkCi0gICAgLy8gKGFuZCB0aHVz
IGNhbiBzaGlmdCB0byBlbmQgdXAgYmVmb3JlIGR5bmFtaWNhbGx5IGFkZGVkIERPTSBjb250ZW50
IHRoYXQgaXMgYWxzbwotICAgIC8vIG91dHNpZGUgdGhlIGJvZHkpLgotICAgIGlmICgoY3JlYXRl
ZEJ5UGFyc2VyICYmIGJvZHkoKSkgfHwgbV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMuaXNFbXB0
eSgpKSB7Ci0gICAgICAgIG1fc3R5bGVTaGVldENhbmRpZGF0ZU5vZGVzLmFkZChub2RlKTsKLSAg
ICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIERldGVybWluZSBhbiBhcHByb3ByaWF0ZSBp
bnNlcnRpb24gcG9pbnQuCi0gICAgU3R5bGVTaGVldENhbmRpZGF0ZUxpc3RIYXNoU2V0OjppdGVy
YXRvciBiZWdpbiA9IG1fc3R5bGVTaGVldENhbmRpZGF0ZU5vZGVzLmJlZ2luKCk7Ci0gICAgU3R5
bGVTaGVldENhbmRpZGF0ZUxpc3RIYXNoU2V0OjppdGVyYXRvciBlbmQgPSBtX3N0eWxlU2hlZXRD
YW5kaWRhdGVOb2Rlcy5lbmQoKTsKLSAgICBTdHlsZVNoZWV0Q2FuZGlkYXRlTGlzdEhhc2hTZXQ6
Oml0ZXJhdG9yIGl0ID0gZW5kOwotICAgIE5vZGUqIGZvbGxvd2luZ05vZGUgPSAwOwotICAgIGRv
IHsKLSAgICAgICAgLS1pdDsKLSAgICAgICAgTm9kZSogbiA9ICppdDsKLSAgICAgICAgdW5zaWdu
ZWQgc2hvcnQgcG9zaXRpb24gPSBuLT5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihub2RlKTsKLSAg
ICAgICAgaWYgKHBvc2l0aW9uID09IERPQ1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lORykgewotICAg
ICAgICAgICAgbV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMuaW5zZXJ0QmVmb3JlKGZvbGxvd2lu
Z05vZGUsIG5vZGUpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZv
bGxvd2luZ05vZGUgPSBuOwotICAgIH0gd2hpbGUgKGl0ICE9IGJlZ2luKTsKLSAgICAKLSAgICBt
X3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcy5pbnNlcnRCZWZvcmUoZm9sbG93aW5nTm9kZSwgbm9k
ZSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnJlbW92ZVN0eWxlU2hlZXRDYW5kaWRhdGVOb2RlKE5v
ZGUqIG5vZGUpCi17Ci0gICAgbV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMucmVtb3ZlKG5vZGUp
OwotfQotCi12b2lkIERvY3VtZW50Ojpjb2xsZWN0QWN0aXZlU3R5bGVzaGVldHMoVmVjdG9yPFJl
ZlB0cjxTdHlsZVNoZWV0PiA+JiBzaGVldHMpCi17Ci0gICAgaWYgKHNldHRpbmdzKCkgJiYgIXNl
dHRpbmdzKCktPmF1dGhvckFuZFVzZXJTdHlsZXNFbmFibGVkKCkpCi0gICAgICAgIHJldHVybjsK
LQotICAgIFN0eWxlU2hlZXRDYW5kaWRhdGVMaXN0SGFzaFNldDo6aXRlcmF0b3IgYmVnaW4gPSBt
X3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcy5iZWdpbigpOwotICAgIFN0eWxlU2hlZXRDYW5kaWRh
dGVMaXN0SGFzaFNldDo6aXRlcmF0b3IgZW5kID0gbV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMu
ZW5kKCk7Ci0gICAgZm9yIChTdHlsZVNoZWV0Q2FuZGlkYXRlTGlzdEhhc2hTZXQ6Oml0ZXJhdG9y
IGl0ID0gYmVnaW47IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICBOb2RlKiBuID0gKml0Owot
ICAgICAgICBTdHlsZVNoZWV0KiBzaGVldCA9IDA7Ci0gICAgICAgIGlmIChuLT5ub2RlVHlwZSgp
ID09IFBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSkgewotICAgICAgICAgICAgLy8gUHJvY2Vz
c2luZyBpbnN0cnVjdGlvbiAoWE1MIGRvY3VtZW50cyBvbmx5KS4KLSAgICAgICAgICAgIC8vIFdl
IGRvbid0IHN1cHBvcnQgbGlua2luZyB0byBlbWJlZGRlZCBDU1Mgc3R5bGVzaGVldHMsIHNlZSA8
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQ5MjgxPiBmb3IgZGlzY3Vz
c2lvbi4KLSAgICAgICAgICAgIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiogcGkgPSBzdGF0aWNfY2Fz
dDxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24qPihuKTsKLSAgICAgICAgICAgIHNoZWV0ID0gcGktPnNo
ZWV0KCk7Ci0jaWYgRU5BQkxFKFhTTFQpCi0gICAgICAgICAgICAvLyBEb24ndCBhcHBseSBYU0wg
dHJhbnNmb3JtcyB0byBhbHJlYWR5IHRyYW5zZm9ybWVkIGRvY3VtZW50cyAtLSA8cmRhcjovL3By
b2JsZW0vNDEzMjgwNj4KLSAgICAgICAgICAgIGlmIChwaS0+aXNYU0woKSAmJiAhdHJhbnNmb3Jt
U291cmNlRG9jdW1lbnQoKSkgewotICAgICAgICAgICAgICAgIC8vIERvbid0IGFwcGx5IFhTTCB0
cmFuc2Zvcm1zIHVudGlsIGxvYWRpbmcgaXMgZmluaXNoZWQuCi0gICAgICAgICAgICAgICAgaWYg
KCFwYXJzaW5nKCkpCi0gICAgICAgICAgICAgICAgICAgIGFwcGx5WFNMVHJhbnNmb3JtKHBpKTsK
LSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAg
fSBlbHNlIGlmICgobi0+aXNIVE1MRWxlbWVudCgpICYmIChuLT5oYXNUYWdOYW1lKGxpbmtUYWcp
IHx8IG4tPmhhc1RhZ05hbWUoc3R5bGVUYWcpKSkKLSNpZiBFTkFCTEUoU1ZHKQotICAgICAgICAg
ICAgICAgICAgIHx8ICAobi0+aXNTVkdFbGVtZW50KCkgJiYgbi0+aGFzVGFnTmFtZShTVkdOYW1l
czo6c3R5bGVUYWcpKQotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgKSB7Ci0gICAgICAgICAg
ICBFbGVtZW50KiBlID0gc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG4pOwotICAgICAgICAgICAgQXRv
bWljU3RyaW5nIHRpdGxlID0gZS0+Z2V0QXR0cmlidXRlKHRpdGxlQXR0cik7Ci0gICAgICAgICAg
ICBib29sIGVuYWJsZWRWaWFTY3JpcHQgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChlLT5oYXNM
b2NhbE5hbWUobGlua1RhZykpIHsKLSAgICAgICAgICAgICAgICAvLyA8TElOSz4gZWxlbWVudAot
ICAgICAgICAgICAgICAgIEhUTUxMaW5rRWxlbWVudCogbGlua0VsZW1lbnQgPSBzdGF0aWNfY2Fz
dDxIVE1MTGlua0VsZW1lbnQqPihuKTsKLSAgICAgICAgICAgICAgICBpZiAobGlua0VsZW1lbnQt
PmlzRGlzYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAg
ICAgICAgZW5hYmxlZFZpYVNjcmlwdCA9IGxpbmtFbGVtZW50LT5pc0VuYWJsZWRWaWFTY3JpcHQo
KTsKLSAgICAgICAgICAgICAgICBpZiAobGlua0VsZW1lbnQtPnN0eWxlU2hlZXRJc0xvYWRpbmco
KSkgewotICAgICAgICAgICAgICAgICAgICAvLyBpdCBpcyBsb2FkaW5nIGJ1dCB3ZSBzaG91bGQg
c3RpbGwgZGVjaWRlIHdoaWNoIHN0eWxlIHNoZWV0IHNldCB0byB1c2UKLSAgICAgICAgICAgICAg
ICAgICAgaWYgKCFlbmFibGVkVmlhU2NyaXB0ICYmICF0aXRsZS5pc0VtcHR5KCkgJiYgbV9wcmVm
ZXJyZWRTdHlsZXNoZWV0U2V0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAg
Y29uc3QgQXRvbWljU3RyaW5nJiByZWwgPSBlLT5nZXRBdHRyaWJ1dGUocmVsQXR0cik7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICBpZiAoIXJlbC5jb250YWlucygiYWx0ZXJuYXRlIikpIHsKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ByZWZlcnJlZFN0eWxlc2hlZXRTZXQgPSB0aXRs
ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3NlbGVjdGVkU3R5bGVzaGVldFNldCA9
IHRpdGxlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9
Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgICAgICBpZiAoIWxpbmtFbGVtZW50LT5zaGVldCgpKQotICAgICAgICAgICAgICAgICAg
ICB0aXRsZSA9IG51bGxBdG9tOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gR2V0IHRo
ZSBjdXJyZW50IHByZWZlcnJlZCBzdHlsZXNldC4gIFRoaXMgaXMgdGhlCi0gICAgICAgICAgICAv
LyBzZXQgb2Ygc2hlZXRzIHRoYXQgd2lsbCBiZSBlbmFibGVkLgotI2lmIEVOQUJMRShTVkcpCi0g
ICAgICAgICAgICBpZiAobi0+aXNTVkdFbGVtZW50KCkgJiYgbi0+aGFzVGFnTmFtZShTVkdOYW1l
czo6c3R5bGVUYWcpKQotICAgICAgICAgICAgICAgIHNoZWV0ID0gc3RhdGljX2Nhc3Q8U1ZHU3R5
bGVFbGVtZW50Kj4obiktPnNoZWV0KCk7Ci0gICAgICAgICAgICBlbHNlCi0jZW5kaWYKLSAgICAg
ICAgICAgIGlmIChlLT5oYXNMb2NhbE5hbWUobGlua1RhZykpCi0gICAgICAgICAgICAgICAgc2hl
ZXQgPSBzdGF0aWNfY2FzdDxIVE1MTGlua0VsZW1lbnQqPihuKS0+c2hlZXQoKTsKLSAgICAgICAg
ICAgIGVsc2UKLSAgICAgICAgICAgICAgICAvLyA8U1RZTEU+IGVsZW1lbnQKLSAgICAgICAgICAg
ICAgICBzaGVldCA9IHN0YXRpY19jYXN0PEhUTUxTdHlsZUVsZW1lbnQqPihuKS0+c2hlZXQoKTsK
LSAgICAgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGlzIHNoZWV0IGJlbG9uZ3MgdG8gYSBz
dHlsZXNldAotICAgICAgICAgICAgLy8gKHRodXMgbWFraW5nIGl0IFBSRUZFUlJFRCBvciBBTFRF
Uk5BVEUgcmF0aGVyIHRoYW4KLSAgICAgICAgICAgIC8vIFBFUlNJU1RFTlQpLgotICAgICAgICAg
ICAgQXRvbWljU3RyaW5nIHJlbCA9IGUtPmdldEF0dHJpYnV0ZShyZWxBdHRyKTsKLSAgICAgICAg
ICAgIGlmICghZW5hYmxlZFZpYVNjcmlwdCAmJiAhdGl0bGUuaXNFbXB0eSgpKSB7Ci0gICAgICAg
ICAgICAgICAgLy8gWWVzLCB3ZSBoYXZlIGEgdGl0bGUuCi0gICAgICAgICAgICAgICAgaWYgKG1f
cHJlZmVycmVkU3R5bGVzaGVldFNldC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAg
Ly8gTm8gcHJlZmVycmVkIHNldCBoYXMgYmVlbiBlc3RhYmxpc2hlZC4gIElmCi0gICAgICAgICAg
ICAgICAgICAgIC8vIHdlIGFyZSBOT1QgYW4gYWx0ZXJuYXRlIHNoZWV0LCB0aGVuIGVzdGFibGlz
aAotICAgICAgICAgICAgICAgICAgICAvLyB1cyBhcyB0aGUgcHJlZmVycmVkIHNldC4gIE90aGVy
d2lzZSwganVzdCBpZ25vcmUKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBzaGVldC4KLSAg
ICAgICAgICAgICAgICAgICAgaWYgKGUtPmhhc0xvY2FsTmFtZShzdHlsZVRhZykgfHwgIXJlbC5j
b250YWlucygiYWx0ZXJuYXRlIikpCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3ByZWZlcnJl
ZFN0eWxlc2hlZXRTZXQgPSBtX3NlbGVjdGVkU3R5bGVzaGVldFNldCA9IHRpdGxlOwotICAgICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodGl0bGUgIT0gbV9wcmVmZXJyZWRTdHls
ZXNoZWV0U2V0KQotICAgICAgICAgICAgICAgICAgICBzaGVldCA9IDA7Ci0gICAgICAgICAgICB9
Ci0KLSAgICAgICAgICAgIGlmIChyZWwuY29udGFpbnMoImFsdGVybmF0ZSIpICYmIHRpdGxlLmlz
RW1wdHkoKSkKLSAgICAgICAgICAgICAgICBzaGVldCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAg
aWYgKHNoZWV0KQotICAgICAgICAgICAgc2hlZXRzLmFwcGVuZChzaGVldCk7Ci0gICAgfQotfQot
Ci1ib29sIERvY3VtZW50Ojp0ZXN0QWRkZWRTdHlsZXNoZWV0UmVxdWlyZXNTdHlsZVJlY2FsYyhT
dHlsZVNoZWV0Q29udGVudHMqIHN0eWxlc2hlZXQpCi17Ci0gICAgLy8gU2VlIGlmIGFsbCBydWxl
cyBvbiB0aGUgc2hlZXQgYXJlIHNjb3BlZCB0byBzb21lIHNwZWNpZmljIGlkcyBvciBjbGFzc2Vz
LgotICAgIC8vIFRoZW4gdGVzdCBpZiB3ZSBhY3R1YWxseSBoYXZlIGFueSBvZiB0aG9zZSBpbiB0
aGUgdHJlZSBhdCB0aGUgbW9tZW50LgotICAgIEhhc2hTZXQ8QXRvbWljU3RyaW5nSW1wbCo+IGlk
U2NvcGVzOyAKLSAgICBIYXNoU2V0PEF0b21pY1N0cmluZ0ltcGwqPiBjbGFzc1Njb3BlczsKLSAg
ICBpZiAoIVN0eWxlUmVzb2x2ZXI6OmRldGVybWluZVN0eWxlc2hlZXRTZWxlY3RvclNjb3Blcyhz
dHlsZXNoZWV0LCBpZFNjb3BlcywgY2xhc3NTY29wZXMpKQotICAgICAgICByZXR1cm4gdHJ1ZTsK
LSAgICAvLyBJbnZhbGlkYXRlIHRoZSBzdWJ0cmVlcyB0aGF0IG1hdGNoIHRoZSBzY29wZXMuCi0g
ICAgTm9kZSogbm9kZSA9IGZpcnN0Q2hpbGQoKTsKLSAgICB3aGlsZSAobm9kZSkgewotICAgICAg
ICBpZiAoIW5vZGUtPmlzU3R5bGVkRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICBub2RlID0gbm9k
ZS0+dHJhdmVyc2VOZXh0Tm9kZSgpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0K
LSAgICAgICAgU3R5bGVkRWxlbWVudCogZWxlbWVudCA9IHN0YXRpY19jYXN0PFN0eWxlZEVsZW1l
bnQqPihub2RlKTsKLSAgICAgICAgaWYgKFNlbGVjdG9yQ2hlY2tlcjo6ZWxlbWVudE1hdGNoZXNT
ZWxlY3RvclNjb3BlcyhlbGVtZW50LCBpZFNjb3BlcywgY2xhc3NTY29wZXMpKSB7Ci0gICAgICAg
ICAgICBlbGVtZW50LT5zZXROZWVkc1N0eWxlUmVjYWxjKCk7Ci0gICAgICAgICAgICAvLyBUaGUg
d2hvbGUgc3VidHJlZSBpcyBub3cgaW52YWxpZGF0ZWQsIHdlIGNhbiBza2lwIHRvIHRoZSBuZXh0
IHNpYmxpbmcuCi0gICAgICAgICAgICBub2RlID0gbm9kZS0+dHJhdmVyc2VOZXh0U2libGluZygp
OwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgbm9kZSA9IG5vZGUt
PnRyYXZlcnNlTmV4dE5vZGUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lk
IERvY3VtZW50OjphbmFseXplU3R5bGVzaGVldENoYW5nZShTdHlsZVJlc29sdmVyVXBkYXRlRmxh
ZyB1cGRhdGVGbGFnLCBjb25zdCBWZWN0b3I8UmVmUHRyPFN0eWxlU2hlZXQ+ID4mIG5ld1N0eWxl
c2hlZXRzLCBib29sJiByZXF1aXJlc1N0eWxlUmVzb2x2ZXJSZXNldCwgYm9vbCYgcmVxdWlyZXNG
dWxsU3R5bGVSZWNhbGMpCi17Ci0gICAgcmVxdWlyZXNTdHlsZVJlc29sdmVyUmVzZXQgPSB0cnVl
OwotICAgIHJlcXVpcmVzRnVsbFN0eWxlUmVjYWxjID0gdHJ1ZTsKLSAgICAKLSAgICAvLyBTdHls
ZXNoZWV0cyBvZiA8c3R5bGU+IGVsZW1lbnRzIHRoYXQgQGltcG9ydCBzdHlsZXNoZWV0cyBhcmUg
YWN0aXZlIGJ1dCBsb2FkaW5nLiBXZSBuZWVkIHRvIHRyaWdnZXIgYSBmdWxsIHJlY2FsYyB3aGVu
IHN1Y2ggbG9hZHMgYXJlIGRvbmUuCi0gICAgYm9vbCBoYXNBY3RpdmVMb2FkaW5nU3R5bGVzaGVl
dCA9IGZhbHNlOwotICAgIHVuc2lnbmVkIG5ld1N0eWxlc2hlZXRDb3VudCA9IG5ld1N0eWxlc2hl
ZXRzLnNpemUoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbmV3U3R5bGVzaGVldENv
dW50OyArK2kpIHsKLSAgICAgICAgaWYgKG5ld1N0eWxlc2hlZXRzW2ldLT5pc0xvYWRpbmcoKSkK
LSAgICAgICAgICAgIGhhc0FjdGl2ZUxvYWRpbmdTdHlsZXNoZWV0ID0gdHJ1ZTsKLSAgICB9Ci0g
ICAgaWYgKG1faGFkQWN0aXZlTG9hZGluZ1N0eWxlc2hlZXQgJiYgIWhhc0FjdGl2ZUxvYWRpbmdT
dHlsZXNoZWV0KSB7Ci0gICAgICAgIG1faGFkQWN0aXZlTG9hZGluZ1N0eWxlc2hlZXQgPSBmYWxz
ZTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtX2hhZEFjdGl2ZUxvYWRpbmdTdHlsZXNo
ZWV0ID0gaGFzQWN0aXZlTG9hZGluZ1N0eWxlc2hlZXQ7Ci0KLSAgICBpZiAodXBkYXRlRmxhZyAh
PSBSZWNhbGNTdHlsZUlmTmVlZGVkKQotICAgICAgICByZXR1cm47Ci0gICAgaWYgKCFtX3N0eWxl
UmVzb2x2ZXIpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIFNlZSBpZiB3ZSBhcmUganVzdCBh
ZGRpbmcgc3R5bGVzaGVldHMuCi0gICAgdW5zaWduZWQgb2xkU3R5bGVzaGVldENvdW50ID0gbV9z
dHlsZVNoZWV0cy0+bGVuZ3RoKCk7Ci0gICAgaWYgKG5ld1N0eWxlc2hlZXRDb3VudCA8IG9sZFN0
eWxlc2hlZXRDb3VudCkKLSAgICAgICAgcmV0dXJuOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7
IGkgPCBvbGRTdHlsZXNoZWV0Q291bnQ7ICsraSkgewotICAgICAgICBpZiAobV9zdHlsZVNoZWV0
cy0+aXRlbShpKSAhPSBuZXdTdHlsZXNoZWV0c1tpXSkKLSAgICAgICAgICAgIHJldHVybjsKLSAg
ICB9Ci0gICAgcmVxdWlyZXNTdHlsZVJlc29sdmVyUmVzZXQgPSBmYWxzZTsKLQotICAgIC8vIElm
IHdlIGFyZSBhbHJlYWR5IHBhcnNpbmcgdGhlIGJvZHkgYW5kIHNvIG1heSBoYXZlIHNpZ25pZmlj
YW50IGFtb3VudCBvZiBlbGVtZW50cywgcHV0IHNvbWUgZWZmb3J0IGludG8gdHJ5aW5nIHRvIGF2
b2lkIHN0eWxlIHJlY2FsY3MuCi0gICAgaWYgKCFib2R5KCkgfHwgbV9oYXNOb2Rlc1dpdGhQbGFj
ZWhvbGRlclN0eWxlKQotICAgICAgICByZXR1cm47Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gb2xk
U3R5bGVzaGVldENvdW50OyBpIDwgbmV3U3R5bGVzaGVldENvdW50OyArK2kpIHsKLSAgICAgICAg
aWYgKCFuZXdTdHlsZXNoZWV0c1tpXS0+aXNDU1NTdHlsZVNoZWV0KCkpCi0gICAgICAgICAgICBy
ZXR1cm47Ci0gICAgICAgIGlmIChuZXdTdHlsZXNoZWV0c1tpXS0+ZGlzYWJsZWQoKSkKLSAgICAg
ICAgICAgIGNvbnRpbnVlOwotICAgICAgICBpZiAodGVzdEFkZGVkU3R5bGVzaGVldFJlcXVpcmVz
U3R5bGVSZWNhbGMoc3RhdGljX2Nhc3Q8Q1NTU3R5bGVTaGVldCo+KG5ld1N0eWxlc2hlZXRzW2ld
LmdldCgpKS0+Y29udGVudHMoKSkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHJl
cXVpcmVzRnVsbFN0eWxlUmVjYWxjID0gZmFsc2U7Ci19Ci0KLXN0YXRpYyBib29sIHN0eWxlU2hl
ZXRzVXNlUmVtVW5pdHMoY29uc3QgVmVjdG9yPFJlZlB0cjxTdHlsZVNoZWV0PiA+JiBzaGVldHMp
Ci17Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNoZWV0cy5zaXplKCk7ICsraSkgewot
ICAgICAgICBpZiAoIXNoZWV0c1tpXS0+aXNDU1NTdHlsZVNoZWV0KCkpCi0gICAgICAgICAgICBj
b250aW51ZTsKLSAgICAgICAgaWYgKHN0YXRpY19jYXN0PENTU1N0eWxlU2hlZXQqPihzaGVldHNb
aV0uZ2V0KCkpLT5jb250ZW50cygpLT51c2VzUmVtVW5pdHMoKSkKLSAgICAgICAgICAgIHJldHVy
biB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KIHZvaWQgRG9jdW1lbnQ6Om5v
dGlmeVNlYW1sZXNzQ2hpbGREb2N1bWVudHNPZlN0eWxlc2hlZXRVcGRhdGUoKSBjb25zdAogewog
ICAgIC8vIElmIHdlJ3JlIG5vdCBpbiBhIGZyYW1lIHlldCBhbnkgcG90ZW50aWFsIGNoaWxkIGRv
Y3VtZW50cyB3b24ndCBoYXZlIGEgU3R5bGVSZXNvbHZlciB0byB1cGRhdGUuCkBAIC0zNjU3LDQz
ICszMjg3LDYgQEAgdm9pZCBEb2N1bWVudDo6bm90aWZ5U2VhbWxlc3NDaGlsZERvY3VtZQogICAg
IH0KIH0KIAotYm9vbCBEb2N1bWVudDo6dXBkYXRlQWN0aXZlU3R5bGVzaGVldHMoU3R5bGVSZXNv
bHZlclVwZGF0ZUZsYWcgdXBkYXRlRmxhZykKLXsKLSAgICBpZiAobV9pblN0eWxlUmVjYWxjKSB7
Ci0gICAgICAgIC8vIFNWRyA8dXNlPiBlbGVtZW50IG1heSBtYW5hZ2UgdG8gaW52YWxpZGF0ZSBz
dHlsZSBzZWxlY3RvciBpbiB0aGUgbWlkZGxlIG9mIGEgc3R5bGUgcmVjYWxjLgotICAgICAgICAv
LyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTQzNDQKLSAgICAgICAg
Ly8gRklYTUU6IFRoaXMgc2hvdWxkIGJlIGZpeGVkIGluIFNWRyBhbmQgdGhpcyBjb2RlIHJlcGxh
Y2VkIHdpdGggQVNTRVJUKCFtX2luU3R5bGVSZWNhbGMpLgotICAgICAgICBtX2hhc0RpcnR5U3R5
bGVSZXNvbHZlciA9IHRydWU7Ci0gICAgICAgIHNjaGVkdWxlRm9yY2VkU3R5bGVSZWNhbGMoKTsK
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoIXJlbmRlcmVyKCkgfHwgIWF0
dGFjaGVkKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIFN0eWxlU2hlZXRWZWN0b3Ig
bmV3U3R5bGVzaGVldHM7Ci0gICAgY29sbGVjdEFjdGl2ZVN0eWxlc2hlZXRzKG5ld1N0eWxlc2hl
ZXRzKTsKLQotICAgIGJvb2wgcmVxdWlyZXNTdHlsZVJlc29sdmVyUmVzZXQ7Ci0gICAgYm9vbCBy
ZXF1aXJlc0Z1bGxTdHlsZVJlY2FsYzsKLSAgICBhbmFseXplU3R5bGVzaGVldENoYW5nZSh1cGRh
dGVGbGFnLCBuZXdTdHlsZXNoZWV0cywgcmVxdWlyZXNTdHlsZVJlc29sdmVyUmVzZXQsIHJlcXVp
cmVzRnVsbFN0eWxlUmVjYWxjKTsKLQotICAgIGlmIChyZXF1aXJlc1N0eWxlUmVzb2x2ZXJSZXNl
dCkKLSAgICAgICAgY2xlYXJTdHlsZVJlc29sdmVyKCk7Ci0gICAgZWxzZSB7Ci0gICAgICAgIG1f
c3R5bGVSZXNvbHZlci0+YXBwZW5kQXV0aG9yU3R5bGVzaGVldHMobV9zdHlsZVNoZWV0cy0+bGVu
Z3RoKCksIG5ld1N0eWxlc2hlZXRzKTsKLSAgICAgICAgcmVzZXRDU1NGZWF0dXJlRmxhZ3MoKTsK
LSAgICB9Ci0gICAgbV9zdHlsZVNoZWV0cy0+c3dhcChuZXdTdHlsZXNoZWV0cyk7Ci0KLSAgICBt
X3VzZXNSZW1Vbml0cyA9IHN0eWxlU2hlZXRzVXNlUmVtVW5pdHMobV9zdHlsZVNoZWV0cy0+dmVj
dG9yKCkpOwotICAgIG1fZGlkQ2FsY3VsYXRlU3R5bGVSZXNvbHZlciA9IHRydWU7Ci0gICAgbV9o
YXNEaXJ0eVN0eWxlUmVzb2x2ZXIgPSBmYWxzZTsKLQotICAgIG5vdGlmeVNlYW1sZXNzQ2hpbGRE
b2N1bWVudHNPZlN0eWxlc2hlZXRVcGRhdGUoKTsKLQotICAgIHJldHVybiByZXF1aXJlc0Z1bGxT
dHlsZVJlY2FsYzsKLX0KLQogdm9pZCBEb2N1bWVudDo6c2V0SG92ZXJOb2RlKFBhc3NSZWZQdHI8
Tm9kZT4gbmV3SG92ZXJOb2RlKQogewogICAgIG1faG92ZXJOb2RlID0gbmV3SG92ZXJOb2RlOwpA
QCAtNjI3MywxNiArNTg2Niw5IEBAIHZvaWQgRG9jdW1lbnQ6OnJlcG9ydE1lbW9yeVVzYWdlKE1l
bW9yeU8KICAgICBpbmZvLmFkZE1lbWJlcihtX2ZyYW1lKTsKICAgICBpbmZvLmFkZE1lbWJlciht
X2NhY2hlZFJlc291cmNlTG9hZGVyKTsKICAgICBpbmZvLmFkZE1lbWJlcihtX2VsZW1TaGVldCk7
Ci0gICAgaW5mby5hZGRNZW1iZXIobV9wYWdlVXNlclNoZWV0KTsKLSAgICBpZiAobV9wYWdlR3Jv
dXBVc2VyU2hlZXRzKQotICAgICAgICBpbmZvLmFkZEluc3RydW1lbnRlZFZlY3RvclB0cihtX3Bh
Z2VHcm91cFVzZXJTaGVldHMpOwotICAgIGlmIChtX3VzZXJTaGVldHMpCi0gICAgICAgIGluZm8u
YWRkSW5zdHJ1bWVudGVkVmVjdG9yUHRyKG1fdXNlclNoZWV0cyk7CisgICAgaW5mby5hZGRNZW1i
ZXIobV9zdHlsZVNoZWV0Q29sbGVjdGlvbik7CiAgICAgaW5mby5hZGRIYXNoU2V0KG1fbm9kZUl0
ZXJhdG9ycyk7CiAgICAgaW5mby5hZGRIYXNoU2V0KG1fcmFuZ2VzKTsKLSAgICBpbmZvLmFkZExp
c3RIYXNoU2V0KG1fc3R5bGVTaGVldENhbmRpZGF0ZU5vZGVzKTsKLSAgICBpbmZvLmFkZE1lbWJl
cihtX3ByZWZlcnJlZFN0eWxlc2hlZXRTZXQpOwotICAgIGluZm8uYWRkTWVtYmVyKG1fc2VsZWN0
ZWRTdHlsZXNoZWV0U2V0KTsKICAgICBpbmZvLmFkZE1lbWJlcihtX3RpdGxlLnN0cmluZygpKTsK
ICAgICBpbmZvLmFkZE1lbWJlcihtX3Jhd1RpdGxlLnN0cmluZygpKTsKICAgICBpbmZvLmFkZE1l
bWJlcihtX3htbEVuY29kaW5nKTsKQEAgLTYzODMsNiArNTk2OSwxMSBAQCBQYXNzUmVmUHRyPEVs
ZW1lbnRBdHRyaWJ1dGVEYXRhPiBEb2N1bWVuCiAgICAgcmV0dXJuIGF0dHJpYnV0ZURhdGEucmVs
ZWFzZSgpOwogfQogCitib29sIERvY3VtZW50OjpoYXZlU3R5bGVzaGVldHNMb2FkZWQoKSBjb25z
dAoreworICAgIHJldHVybiAhbV9zdHlsZVNoZWV0Q29sbGVjdGlvbi0+aGFzUGVuZGluZ1NoZWV0
cygpIHx8IG1faWdub3JlUGVuZGluZ1N0eWxlc2hlZXRzOworfQorCiBMb2NhbGl6ZXImIERvY3Vt
ZW50OjpnZXRMb2NhbGl6ZXIoY29uc3QgQXRvbWljU3RyaW5nJiBsb2NhbGUpCiB7CiAgICAgQXRv
bWljU3RyaW5nIGxvY2FsZUtleSA9IGxvY2FsZTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2RvbS9E
b2N1bWVudC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2RvbS9Eb2N1bWVudC5oCShy
ZXZpc2lvbiAxMjkzMDMpCisrKyBTb3VyY2UvV2ViQ29yZS9kb20vRG9jdW1lbnQuaAkod29ya2lu
ZyBjb3B5KQpAQCAtNzgsNiArNzgsNyBAQCBjbGFzcyBEb2N1bWVudEZyYWdtZW50OwogY2xhc3Mg
RG9jdW1lbnRMb2FkZXI7CiBjbGFzcyBEb2N1bWVudE1hcmtlckNvbnRyb2xsZXI7CiBjbGFzcyBE
b2N1bWVudFBhcnNlcjsKK2NsYXNzIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb247CiBjbGFz
cyBEb2N1bWVudFR5cGU7CiBjbGFzcyBEb2N1bWVudFdlYWtSZWZlcmVuY2U7CiBjbGFzcyBEeW5h
bWljTm9kZUxpc3RDYWNoZUJhc2U7CkBAIC00ODUsMzQgKzQ4NiwxNCBAQCBwdWJsaWM6CiAgICAg
ICAgIHJldHVybiBtX3N0eWxlUmVzb2x2ZXIuZ2V0KCk7CiAgICAgfQogCi0gICAgLyoqCi0gICAg
ICogVXBkYXRlcyB0aGUgcGVuZGluZyBzaGVldCBjb3VudCBhbmQgdGhlbiBjYWxscyB1cGRhdGVB
Y3RpdmVTdHlsZXNoZWV0cy4KLSAgICAgKi8KLSAgICBlbnVtIFJlbW92ZVBlbmRpbmdTaGVldE5v
dGlmaWNhdGlvblR5cGUgewotICAgICAgICBSZW1vdmVQZW5kaW5nU2hlZXROb3RpZnlJbW1lZGlh
dGVseSwKLSAgICAgICAgUmVtb3ZlUGVuZGluZ1NoZWV0Tm90aWZ5TGF0ZXIKLSAgICB9OwotCi0g
ICAgdm9pZCByZW1vdmVQZW5kaW5nU2hlZXQoUmVtb3ZlUGVuZGluZ1NoZWV0Tm90aWZpY2F0aW9u
VHlwZSA9IFJlbW92ZVBlbmRpbmdTaGVldE5vdGlmeUltbWVkaWF0ZWx5KTsKICAgICB2b2lkIG5v
dGlmeVJlbW92ZVBlbmRpbmdTaGVldElmTmVlZGVkKCk7CiAKLSAgICAvKioKLSAgICAgKiBUaGlz
IG1ldGhvZCByZXR1cm5zIHRydWUgaWYgYWxsIHRvcC1sZXZlbCBzdHlsZXNoZWV0cyBoYXZlIGxv
YWRlZCAoaW5jbHVkaW5nCi0gICAgICogYW55IEBpbXBvcnRzIHRoYXQgdGhleSBtYXkgYmUgbG9h
ZGluZykuCi0gICAgICovCi0gICAgYm9vbCBoYXZlU3R5bGVzaGVldHNMb2FkZWQoKSBjb25zdAot
ICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcGVuZGluZ1N0eWxlc2hlZXRzIDw9IDAgfHwgbV9pZ25v
cmVQZW5kaW5nU3R5bGVzaGVldHM7Ci0gICAgfQorICAgIGJvb2wgaGF2ZVN0eWxlc2hlZXRzTG9h
ZGVkKCkgY29uc3Q7CiAKLSAgICAvKioKLSAgICAgKiBJbmNyZW1lbnRzIHRoZSBudW1iZXIgb2Yg
cGVuZGluZyBzaGVldHMuICBUaGUgPGxpbms+IGVsZW1lbnRzCi0gICAgICogaW52b2tlIHRoaXMg
dG8gYWRkIHRoZW1zZWx2ZXMgdG8gdGhlIGxvYWRpbmcgbGlzdC4KLSAgICAgKi8KLSAgICB2b2lk
IGFkZFBlbmRpbmdTaGVldCgpIHsgbV9wZW5kaW5nU3R5bGVzaGVldHMrKzsgfQorICAgIC8vIFRo
aXMgaXMgYSBET00gZnVuY3Rpb24uCisgICAgU3R5bGVTaGVldExpc3QqIHN0eWxlU2hlZXRzKCk7
CiAKLSAgICB2b2lkIGFkZFN0eWxlU2hlZXRDYW5kaWRhdGVOb2RlKE5vZGUqLCBib29sIGNyZWF0
ZWRCeVBhcnNlcik7Ci0gICAgdm9pZCByZW1vdmVTdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZShOb2Rl
Kik7CisgICAgRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbiogc3R5bGVTaGVldENvbGxlY3Rp
b24oKSB7IHJldHVybiBtX3N0eWxlU2hlZXRDb2xsZWN0aW9uLmdldCgpOyB9CiAKICAgICBib29s
IGdvdG9BbmNob3JOZWVkZWRBZnRlclN0eWxlc2hlZXRzTG9hZCgpIHsgcmV0dXJuIG1fZ290b0Fu
Y2hvck5lZWRlZEFmdGVyU3R5bGVzaGVldHNMb2FkOyB9CiAgICAgdm9pZCBzZXRHb3RvQW5jaG9y
TmVlZGVkQWZ0ZXJTdHlsZXNoZWV0c0xvYWQoYm9vbCBiKSB7IG1fZ290b0FuY2hvck5lZWRlZEFm
dGVyU3R5bGVzaGVldHNMb2FkID0gYjsgfQpAQCAtNTMwLDE3ICs1MTEsNiBAQCBwdWJsaWM6CiAK
ICAgICB2b2lkIGV2YWx1YXRlTWVkaWFRdWVyeUxpc3QoKTsKIAotICAgIGJvb2wgdXNlc1NpYmxp
bmdSdWxlcygpIGNvbnN0IHsgcmV0dXJuIG1fdXNlc1NpYmxpbmdSdWxlcyB8fCBtX3VzZXNTaWJs
aW5nUnVsZXNPdmVycmlkZTsgfQotICAgIHZvaWQgc2V0VXNlc1NpYmxpbmdSdWxlcyhib29sIGIp
IHsgbV91c2VzU2libGluZ1J1bGVzT3ZlcnJpZGUgPSBiOyB9Ci0gICAgYm9vbCB1c2VzRmlyc3RM
aW5lUnVsZXMoKSBjb25zdCB7IHJldHVybiBtX3VzZXNGaXJzdExpbmVSdWxlczsgfQotICAgIGJv
b2wgdXNlc0ZpcnN0TGV0dGVyUnVsZXMoKSBjb25zdCB7IHJldHVybiBtX3VzZXNGaXJzdExldHRl
clJ1bGVzOyB9Ci0gICAgdm9pZCBzZXRVc2VzRmlyc3RMZXR0ZXJSdWxlcyhib29sIGIpIHsgbV91
c2VzRmlyc3RMZXR0ZXJSdWxlcyA9IGI7IH0KLSAgICBib29sIHVzZXNCZWZvcmVBZnRlclJ1bGVz
KCkgY29uc3QgeyByZXR1cm4gbV91c2VzQmVmb3JlQWZ0ZXJSdWxlcyB8fCBtX3VzZXNCZWZvcmVB
ZnRlclJ1bGVzT3ZlcnJpZGU7IH0KLSAgICB2b2lkIHNldFVzZXNCZWZvcmVBZnRlclJ1bGVzKGJv
b2wgYikgeyBtX3VzZXNCZWZvcmVBZnRlclJ1bGVzT3ZlcnJpZGUgPSBiOyB9Ci0gICAgYm9vbCB1
c2VzUmVtVW5pdHMoKSBjb25zdCB7IHJldHVybiBtX3VzZXNSZW1Vbml0czsgfQotICAgIGJvb2wg
dXNlc0xpbmtSdWxlcygpIGNvbnN0IHsgcmV0dXJuIGxpbmtDb2xvcigpICE9IHZpc2l0ZWRMaW5r
Q29sb3IoKSB8fCBtX3VzZXNMaW5rUnVsZXM7IH0KLSAgICB2b2lkIHNldFVzZXNMaW5rUnVsZXMo
Ym9vbCBiKSB7IG1fdXNlc0xpbmtSdWxlcyA9IGI7IH0KLQogICAgIC8vIE5ldmVyIHJldHVybnMg
MC4KICAgICBGb3JtQ29udHJvbGxlciogZm9ybUNvbnRyb2xsZXIoKTsKICAgICBWZWN0b3I8U3Ry
aW5nPiBmb3JtRWxlbWVudHNTdGF0ZSgpIGNvbnN0OwpAQCAtNTU2LDcgKzUyNiw3IEBAIHB1Ymxp
YzoKICAgICBQYXNzUmVmUHRyPE5vZGVJdGVyYXRvcj4gY3JlYXRlTm9kZUl0ZXJhdG9yKE5vZGUq
IHJvb3QsIHVuc2lnbmVkIHdoYXRUb1Nob3csCiAgICAgICAgIFBhc3NSZWZQdHI8Tm9kZUZpbHRl
cj4sIGJvb2wgZXhwYW5kRW50aXR5UmVmZXJlbmNlcywgRXhjZXB0aW9uQ29kZSYpOwogCi0gICAg
UGFzc1JlZlB0cjxUcmVlV2Fsa2VyPiBjcmVhdGVUcmVlV2Fsa2VyKE5vZGUqIHJvb3QsIHVuc2ln
bmVkIHdoYXRUb1Nob3csIAorICAgIFBhc3NSZWZQdHI8VHJlZVdhbGtlcj4gY3JlYXRlVHJlZVdh
bGtlcihOb2RlKiByb290LCB1bnNpZ25lZCB3aGF0VG9TaG93LAogICAgICAgICBQYXNzUmVmUHRy
PE5vZGVGaWx0ZXI+LCBib29sIGV4cGFuZEVudGl0eVJlZmVyZW5jZXMsIEV4Y2VwdGlvbkNvZGUm
KTsKIAogICAgIC8vIFNwZWNpYWwgc3VwcG9ydCBmb3IgZWRpdGluZwpAQCAtNjQ5LDE3ICs2MTks
NiBAQCBwdWJsaWM6CiAgICAgYm9vbCBjYW5OYXZpZ2F0ZShGcmFtZSogdGFyZ2V0RnJhbWUpOwog
ICAgIEZyYW1lKiBmaW5kVW5zYWZlUGFyZW50U2Nyb2xsUHJvcGFnYXRpb25Cb3VuZGFyeSgpOwog
Ci0gICAgQ1NTU3R5bGVTaGVldCogcGFnZVVzZXJTaGVldCgpOwotICAgIHZvaWQgY2xlYXJQYWdl
VXNlclNoZWV0KCk7Ci0gICAgdm9pZCB1cGRhdGVQYWdlVXNlclNoZWV0KCk7Ci0KLSAgICBjb25z
dCBWZWN0b3I8UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4qIHBhZ2VHcm91cFVzZXJTaGVldHMoKSBj
b25zdDsKLSAgICB2b2lkIGNsZWFyUGFnZUdyb3VwVXNlclNoZWV0cygpOwotICAgIHZvaWQgdXBk
YXRlUGFnZUdyb3VwVXNlclNoZWV0cygpOwotCi0gICAgY29uc3QgVmVjdG9yPFJlZlB0cjxDU1NT
dHlsZVNoZWV0PiA+KiBkb2N1bWVudFVzZXJTaGVldHMoKSBjb25zdCB7IHJldHVybiBtX3VzZXJT
aGVldHMuZ2V0KCk7IH0KLSAgICB2b2lkIGFkZFVzZXJTaGVldChQYXNzUmVmUHRyPFN0eWxlU2hl
ZXRDb250ZW50cz4gdXNlclNoZWV0KTsKLQogICAgIENTU1N0eWxlU2hlZXQqIGVsZW1lbnRTaGVl
dCgpOwogICAgIAogICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxEb2N1bWVudFBhcnNlcj4gY3JlYXRl
UGFyc2VyKCk7CkBAIC03MTYsOCArNjc1LDYgQEAgcHVibGljOgogICAgIAogICAgIE1vdXNlRXZl
bnRXaXRoSGl0VGVzdFJlc3VsdHMgcHJlcGFyZU1vdXNlRXZlbnQoY29uc3QgSGl0VGVzdFJlcXVl
c3QmLCBjb25zdCBMYXlvdXRQb2ludCYsIGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYpOwogCi0g
ICAgU3R5bGVTaGVldExpc3QqIHN0eWxlU2hlZXRzKCk7Ci0KICAgICAvKiBOZXdseSBwcm9wb3Nl
ZCBDU1MzIG1lY2hhbmlzbSBmb3Igc2VsZWN0aW5nIGFsdGVybmF0ZQogICAgICAgIHN0eWxlc2hl
ZXRzIHVzaW5nIHRoZSBET00uIE1heSBiZSBzdWJqZWN0IHRvIGNoYW5nZSBhcwogICAgICAgIHNw
ZWMgbWF0dXJlcy4gLSBkd2gKQEAgLTk3NCw3ICs5MzEsOCBAQCBwdWJsaWM6CiAgICAgZW51bSBQ
ZW5kaW5nU2hlZXRMYXlvdXQgeyBOb0xheW91dFdpdGhQZW5kaW5nU2hlZXRzLCBEaWRMYXlvdXRX
aXRoUGVuZGluZ1NoZWV0cywgSWdub3JlTGF5b3V0V2l0aFBlbmRpbmdTaGVldHMgfTsKIAogICAg
IGJvb2wgZGlkTGF5b3V0V2l0aFBlbmRpbmdTdHlsZXNoZWV0cygpIGNvbnN0IHsgcmV0dXJuIG1f
cGVuZGluZ1NoZWV0TGF5b3V0ID09IERpZExheW91dFdpdGhQZW5kaW5nU2hlZXRzOyB9Ci0gICAg
CisKKyAgICBib29sIGhhc05vZGVzV2l0aFBsYWNlaG9sZGVyU3R5bGUoKSBjb25zdCB7IHJldHVy
biBtX2hhc05vZGVzV2l0aFBsYWNlaG9sZGVyU3R5bGU7IH0KICAgICB2b2lkIHNldEhhc05vZGVz
V2l0aFBsYWNlaG9sZGVyU3R5bGUoKSB7IG1faGFzTm9kZXNXaXRoUGxhY2Vob2xkZXJTdHlsZSA9
IHRydWU7IH0KIAogICAgIGNvbnN0IFZlY3RvcjxJY29uVVJMPiYgaWNvblVSTHMoKTsKQEAgLTEx
OTQsNiArMTE1MiwxMyBAQCBwdWJsaWM6CiAKICAgICBQYXNzUmVmUHRyPEVsZW1lbnRBdHRyaWJ1
dGVEYXRhPiBjYWNoZWRJbW11dGFibGVBdHRyaWJ1dGVEYXRhKGNvbnN0IEVsZW1lbnQqLCBjb25z
dCBWZWN0b3I8QXR0cmlidXRlPiYpOwogCisgICAgdm9pZCBkaWRSZW1vdmVBbGxQZW5kaW5nU3R5
bGVzaGVldCgpOworICAgIHZvaWQgc2V0TmVlZHNOb3RpZnlSZW1vdmVBbGxQZW5kaW5nU3R5bGVz
aGVldCgpIHsgbV9uZWVkc05vdGlmeVJlbW92ZUFsbFBlbmRpbmdTdHlsZXNoZWV0ID0gdHJ1ZTsg
fQorICAgIHZvaWQgY2xlYXJTdHlsZVJlc29sdmVyKCk7CisgICAgdm9pZCBub3RpZnlTZWFtbGVz
c0NoaWxkRG9jdW1lbnRzT2ZTdHlsZXNoZWV0VXBkYXRlKCkgY29uc3Q7CisKKyAgICBib29sIGlu
U3R5bGVSZWNhbGMoKSB7IHJldHVybiBtX2luU3R5bGVSZWNhbGM7IH0KKwogICAgIExvY2FsaXpl
ciYgZ2V0TG9jYWxpemVyKGNvbnN0IEF0b21pY1N0cmluZyYgbG9jYWxlKTsKIAogcHJvdGVjdGVk
OgpAQCAtMTI0MSwxOSArMTIwNiw4IEBAIHByaXZhdGU6CiAgICAgdm9pZCBidWlsZEFjY2Vzc0tl
eU1hcChUcmVlU2NvcGUqIHJvb3QpOwogCiAgICAgdm9pZCBjcmVhdGVTdHlsZVJlc29sdmVyKCk7
Ci0gICAgdm9pZCBjbGVhclN0eWxlUmVzb2x2ZXIoKTsKLSAgICB2b2lkIGNvbWJpbmVDU1NGZWF0
dXJlRmxhZ3MoKTsKLSAgICB2b2lkIHJlc2V0Q1NTRmVhdHVyZUZsYWdzKCk7Ci0gICAgCi0gICAg
Ym9vbCB1cGRhdGVBY3RpdmVTdHlsZXNoZWV0cyhTdHlsZVJlc29sdmVyVXBkYXRlRmxhZyk7Ci0g
ICAgdm9pZCBjb2xsZWN0QWN0aXZlU3R5bGVzaGVldHMoVmVjdG9yPFJlZlB0cjxTdHlsZVNoZWV0
PiA+Jik7Ci0gICAgYm9vbCB0ZXN0QWRkZWRTdHlsZXNoZWV0UmVxdWlyZXNTdHlsZVJlY2FsYyhT
dHlsZVNoZWV0Q29udGVudHMqKTsKLSAgICB2b2lkIGFuYWx5emVTdHlsZXNoZWV0Q2hhbmdlKFN0
eWxlUmVzb2x2ZXJVcGRhdGVGbGFnLCBjb25zdCBWZWN0b3I8UmVmUHRyPFN0eWxlU2hlZXQ+ID4m
IG5ld1N0eWxlc2hlZXRzLCBib29sJiByZXF1aXJlc1N0eWxlUmVzb2x2ZXJSZXNldCwgYm9vbCYg
cmVxdWlyZXNGdWxsU3R5bGVSZWNhbGMpOwotICAgIHZvaWQgZGlkUmVtb3ZlQWxsUGVuZGluZ1N0
eWxlc2hlZXQoKTsKLSAgICB2b2lkIHNldE5lZWRzTm90aWZ5UmVtb3ZlQWxsUGVuZGluZ1N0eWxl
c2hlZXQoKSB7IG1fbmVlZHNOb3RpZnlSZW1vdmVBbGxQZW5kaW5nU3R5bGVzaGVldCA9IHRydWU7
IH0KIAogICAgIHZvaWQgc2VhbWxlc3NQYXJlbnRVcGRhdGVkU3R5bGVzaGVldHMoKTsKLSAgICB2
b2lkIG5vdGlmeVNlYW1sZXNzQ2hpbGREb2N1bWVudHNPZlN0eWxlc2hlZXRVcGRhdGUoKSBjb25z
dDsKIAogICAgIHZvaWQgZGVsZXRlQ3VzdG9tRm9udHMoKTsKIApAQCAtMTI5MCw2ICsxMjQ0LDE3
IEBAIHByaXZhdGU6CiAgICAgT3duUHRyPFN0eWxlUmVzb2x2ZXI+IG1fc3R5bGVSZXNvbHZlcjsK
ICAgICBib29sIG1fZGlkQ2FsY3VsYXRlU3R5bGVSZXNvbHZlcjsKICAgICBib29sIG1faGFzRGly
dHlTdHlsZVJlc29sdmVyOworICAgIGJvb2wgbV9oYXNOb2Rlc1dpdGhQbGFjZWhvbGRlclN0eWxl
OworICAgIGJvb2wgbV9uZWVkc05vdGlmeVJlbW92ZUFsbFBlbmRpbmdTdHlsZXNoZWV0OworICAg
IC8vIEJ1dCBzb21ldGltZXMgeW91IG5lZWQgdG8gaWdub3JlIHBlbmRpbmcgc3R5bGVzaGVldCBj
b3VudCB0bworICAgIC8vIGZvcmNlIGFuIGltbWVkaWF0ZSBsYXlvdXQgd2hlbiByZXF1ZXN0ZWQg
YnkgSlMuCisgICAgYm9vbCBtX2lnbm9yZVBlbmRpbmdTdHlsZXNoZWV0czsKKworICAgIC8vIElm
IHdlIGRvIGlnbm9yZSB0aGUgcGVuZGluZyBzdHlsZXNoZWV0IGNvdW50LCB0aGVuIHdlIG5lZWQg
dG8gYWRkIGEgYm9vbGVhbgorICAgIC8vIHRvIHRyYWNrIHRoYXQgdGhpcyBoYXBwZW5lZCBzbyB0
aGF0IHdlIGNhbiBkbyBhIGZ1bGwgcmVwYWludCB3aGVuIHRoZSBzdHlsZXNoZWV0cworICAgIC8v
IGRvIGV2ZW50dWFsbHkgbG9hZC4KKyAgICBQZW5kaW5nU2hlZXRMYXlvdXQgbV9wZW5kaW5nU2hl
ZXRMYXlvdXQ7CisKICAgICBWZWN0b3I8T3duUHRyPEZvbnREYXRhPiA+IG1fY3VzdG9tRm9udHM7
CiAKICAgICBGcmFtZSogbV9mcmFtZTsKQEAgLTEzMjMsMjkgKzEyODgsNyBAQCBwcml2YXRlOgog
ICAgIFJlZlB0cjxEb2N1bWVudFR5cGU+IG1fZG9jVHlwZTsKICAgICBPd25QdHI8RE9NSW1wbGVt
ZW50YXRpb24+IG1faW1wbGVtZW50YXRpb247CiAKLSAgICAvLyBUcmFjayB0aGUgbnVtYmVyIG9m
IGN1cnJlbnRseSBsb2FkaW5nIHRvcC1sZXZlbCBzdHlsZXNoZWV0cyBuZWVkZWQgZm9yIHJlbmRl
cmluZy4KLSAgICAvLyBTaGVldHMgbG9hZGVkIHVzaW5nIHRoZSBAaW1wb3J0IGRpcmVjdGl2ZSBh
cmUgbm90IGluY2x1ZGVkIGluIHRoaXMgY291bnQuCi0gICAgLy8gV2UgdXNlIHRoaXMgY291bnQg
b2YgcGVuZGluZyBzaGVldHMgdG8gZGV0ZWN0IHdoZW4gd2UgY2FuIGJlZ2luIGF0dGFjaGluZwot
ICAgIC8vIGVsZW1lbnRzIGFuZCB3aGVuIGl0IGlzIHNhZmUgdG8gZXhlY3V0ZSBzY3JpcHRzLgot
ICAgIGludCBtX3BlbmRpbmdTdHlsZXNoZWV0czsKLQotICAgIC8vIEJ1dCBzb21ldGltZXMgeW91
IG5lZWQgdG8gaWdub3JlIHBlbmRpbmcgc3R5bGVzaGVldCBjb3VudCB0bwotICAgIC8vIGZvcmNl
IGFuIGltbWVkaWF0ZSBsYXlvdXQgd2hlbiByZXF1ZXN0ZWQgYnkgSlMuCi0gICAgYm9vbCBtX2ln
bm9yZVBlbmRpbmdTdHlsZXNoZWV0cyA6IDE7Ci0gICAgYm9vbCBtX25lZWRzTm90aWZ5UmVtb3Zl
QWxsUGVuZGluZ1N0eWxlc2hlZXQgOiAxOwotCi0gICAgLy8gSWYgd2UgZG8gaWdub3JlIHRoZSBw
ZW5kaW5nIHN0eWxlc2hlZXQgY291bnQsIHRoZW4gd2UgbmVlZCB0byBhZGQgYSBib29sZWFuCi0g
ICAgLy8gdG8gdHJhY2sgdGhhdCB0aGlzIGhhcHBlbmVkIHNvIHRoYXQgd2UgY2FuIGRvIGEgZnVs
bCByZXBhaW50IHdoZW4gdGhlIHN0eWxlc2hlZXRzCi0gICAgLy8gZG8gZXZlbnR1YWxseSBsb2Fk
LgotICAgIFBlbmRpbmdTaGVldExheW91dCBtX3BlbmRpbmdTaGVldExheW91dDsKLSAgICAKLSAg
ICBib29sIG1faGFzTm9kZXNXaXRoUGxhY2Vob2xkZXJTdHlsZTsKLQogICAgIFJlZlB0cjxDU1NT
dHlsZVNoZWV0PiBtX2VsZW1TaGVldDsKLSAgICBSZWZQdHI8Q1NTU3R5bGVTaGVldD4gbV9wYWdl
VXNlclNoZWV0OwotICAgIG11dGFibGUgT3duUHRyPFZlY3RvcjxSZWZQdHI8Q1NTU3R5bGVTaGVl
dD4gPiA+IG1fcGFnZUdyb3VwVXNlclNoZWV0czsKLSAgICBPd25QdHI8VmVjdG9yPFJlZlB0cjxD
U1NTdHlsZVNoZWV0PiA+ID4gbV91c2VyU2hlZXRzOwotICAgIG11dGFibGUgYm9vbCBtX3BhZ2VH
cm91cFVzZXJTaGVldENhY2hlVmFsaWQ7CiAKICAgICBib29sIG1fcHJpbnRpbmc7CiAgICAgYm9v
bCBtX3BhZ2luYXRlZEZvclNjcmVlbjsKQEAgLTEzNzQsMTEgKzEzMTcsOCBAQCBwcml2YXRlOgog
ICAgIE11dGF0aW9uT2JzZXJ2ZXJPcHRpb25zIG1fbXV0YXRpb25PYnNlcnZlclR5cGVzOwogI2Vu
ZGlmCiAKLSAgICBSZWZQdHI8U3R5bGVTaGVldExpc3Q+IG1fc3R5bGVTaGVldHM7IC8vIEFsbCBv
ZiB0aGUgc3R5bGVzaGVldHMgdGhhdCBhcmUgY3VycmVudGx5IGluIGVmZmVjdCBmb3Igb3VyIG1l
ZGlhIHR5cGUgYW5kIHN0eWxlc2hlZXQgc2V0LgotICAgIGJvb2wgbV9oYWRBY3RpdmVMb2FkaW5n
U3R5bGVzaGVldDsKLSAgICAKLSAgICB0eXBlZGVmIExpc3RIYXNoU2V0PE5vZGUqLCAzMj4gU3R5
bGVTaGVldENhbmRpZGF0ZUxpc3RIYXNoU2V0OwotICAgIFN0eWxlU2hlZXRDYW5kaWRhdGVMaXN0
SGFzaFNldCBtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2RlczsgLy8gQWxsIG9mIHRoZSBub2RlcyB0
aGF0IGNvdWxkIHBvdGVudGlhbGx5IHByb3ZpZGUgc3R5bGVzaGVldHMgdG8gdGhlIGRvY3VtZW50
ICg8bGluaz4sIDxzdHlsZT4sIDw/eG1sLXN0eWxlc2hlZXQ+KQorCisgICAgT3duUHRyPERvY3Vt
ZW50U3R5bGVTaGVldENvbGxlY3Rpb24+IG1fc3R5bGVTaGVldENvbGxlY3Rpb247CiAKICAgICBP
d25QdHI8Rm9ybUNvbnRyb2xsZXI+IG1fZm9ybUNvbnRyb2xsZXI7CiAKQEAgLTEzODYsOSArMTMy
Niw2IEBAIHByaXZhdGU6CiAgICAgQ29sb3IgbV92aXNpdGVkTGlua0NvbG9yOwogICAgIENvbG9y
IG1fYWN0aXZlTGlua0NvbG9yOwogCi0gICAgU3RyaW5nIG1fcHJlZmVycmVkU3R5bGVzaGVldFNl
dDsKLSAgICBTdHJpbmcgbV9zZWxlY3RlZFN0eWxlc2hlZXRTZXQ7Ci0KICAgICBib29sIG1fbG9h
ZGluZ1NoZWV0OwogICAgIGJvb2wgbV92aXN1YWxseU9yZGVyZWQ7CiAgICAgUmVhZHlTdGF0ZSBt
X3JlYWR5U3RhdGU7CkBAIC0xMzk5LDE0ICsxMzM2LDYgQEAgcHJpdmF0ZToKICAgICBib29sIG1f
aW5TdHlsZVJlY2FsYzsKICAgICBib29sIG1fY2xvc2VBZnRlclN0eWxlUmVjYWxjOwogCi0gICAg
Ym9vbCBtX3VzZXNTaWJsaW5nUnVsZXM7Ci0gICAgYm9vbCBtX3VzZXNTaWJsaW5nUnVsZXNPdmVy
cmlkZTsKLSAgICBib29sIG1fdXNlc0ZpcnN0TGluZVJ1bGVzOwotICAgIGJvb2wgbV91c2VzRmly
c3RMZXR0ZXJSdWxlczsKLSAgICBib29sIG1fdXNlc0JlZm9yZUFmdGVyUnVsZXM7Ci0gICAgYm9v
bCBtX3VzZXNCZWZvcmVBZnRlclJ1bGVzT3ZlcnJpZGU7Ci0gICAgYm9vbCBtX3VzZXNSZW1Vbml0
czsKLSAgICBib29sIG1fdXNlc0xpbmtSdWxlczsKICAgICBib29sIG1fZ290b0FuY2hvck5lZWRl
ZEFmdGVyU3R5bGVzaGVldHNMb2FkOwogICAgIGJvb2wgbV9pc0ROU1ByZWZldGNoRW5hYmxlZDsK
ICAgICBib29sIG1faGF2ZUV4cGxpY2l0bHlEaXNhYmxlZEROU1ByZWZldGNoOwpJbmRleDogU291
cmNlL1dlYkNvcmUvZG9tL0RvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2RvbS9Eb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmNw
cAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9XZWJDb3JlL2RvbS9Eb2N1bWVudFN0eWxlU2hlZXRD
b2xsZWN0aW9uLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw0ODcgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDE5OTkgTGFycyBLbm9sbCAoa25vbGxAa2RlLm9yZykKKyAqICAgICAgICAgICAo
QykgMTk5OSBBbnR0aSBLb2l2aXN0byAoa29pdmlzdG9Aa2RlLm9yZykKKyAqICAgICAgICAgICAo
QykgMjAwMSBEaXJrIE11ZWxsZXIgKG11ZWxsZXJAa2RlLm9yZykKKyAqICAgICAgICAgICAoQykg
MjAwNiBBbGV4ZXkgUHJvc2t1cnlha292IChhcEB3ZWJraXQub3JnKQorICogQ29weXJpZ2h0IChD
KSAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDEyIEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSBUb3Jj
aCBNb2JpbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAoaHR0cDovL3d3dy50b3JjaG1vYmls
ZS5jb20vKQorICogQ29weXJpZ2h0IChDKSAyMDEwIE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBp
dHMgc3Vic2lkaWFyeSgtaWVzKQorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7
IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0
ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVi
bGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lv
biAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9u
LgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0
IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2
ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVy
YWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhh
dmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNl
bnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElC
LiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5j
LiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAt
MTMwMSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRG9j
dW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5oIgorCisjaW5jbHVkZSAiQ1NTU3R5bGVTaGVldC5o
IgorI2luY2x1ZGUgIkRvY3VtZW50LmgiCisjaW5jbHVkZSAiRWxlbWVudC5oIgorI2luY2x1ZGUg
IkhUTUxMaW5rRWxlbWVudC5oIgorI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgorI2luY2x1ZGUgIkhU
TUxTdHlsZUVsZW1lbnQuaCIKKyNpbmNsdWRlICJQYWdlLmgiCisjaW5jbHVkZSAiUGFnZUdyb3Vw
LmgiCisjaW5jbHVkZSAiUHJvY2Vzc2luZ0luc3RydWN0aW9uLmgiCisjaW5jbHVkZSAiU1ZHTmFt
ZXMuaCIKKyNpbmNsdWRlICJTVkdTdHlsZUVsZW1lbnQuaCIKKyNpbmNsdWRlICJTZWxlY3RvckNo
ZWNrZXIuaCIKKyNpbmNsdWRlICJTZXR0aW5ncy5oIgorI2luY2x1ZGUgIlN0eWxlUmVzb2x2ZXIu
aCIKKyNpbmNsdWRlICJTdHlsZVNoZWV0Q29udGVudHMuaCIKKyNpbmNsdWRlICJTdHlsZVNoZWV0
TGlzdC5oIgorI2luY2x1ZGUgIlVzZXJDb250ZW50VVJMUGF0dGVybi5oIgorI2luY2x1ZGUgIldl
YkNvcmVNZW1vcnlJbnN0cnVtZW50YXRpb24uaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit1
c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOworCitEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9u
OjpEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uKERvY3VtZW50KiBkb2N1bWVudCkKKyAgICA6
IG1fZG9jdW1lbnQoZG9jdW1lbnQpCisgICAgLCBtX2F1dGhvclN0eWxlU2hlZXRzKFN0eWxlU2hl
ZXRMaXN0OjpjcmVhdGUoZG9jdW1lbnQpKQorICAgICwgbV9wZW5kaW5nU3R5bGVzaGVldHMoMCkK
KyAgICAsIG1fcGFnZUdyb3VwVXNlclNoZWV0Q2FjaGVWYWxpZChmYWxzZSkKKyAgICAsIG1faGFk
QWN0aXZlTG9hZGluZ1N0eWxlc2hlZXQoZmFsc2UpCisgICAgLCBtX25lZWRzVXBkYXRlQWN0aXZl
U3R5bGVzaGVldHNPblN0eWxlUmVjYWxjKGZhbHNlKQorICAgICwgbV91c2VzU2libGluZ1J1bGVz
KGZhbHNlKQorICAgICwgbV91c2VzU2libGluZ1J1bGVzT3ZlcnJpZGUoZmFsc2UpCisgICAgLCBt
X3VzZXNGaXJzdExpbmVSdWxlcyhmYWxzZSkKKyAgICAsIG1fdXNlc0ZpcnN0TGV0dGVyUnVsZXMo
ZmFsc2UpCisgICAgLCBtX3VzZXNCZWZvcmVBZnRlclJ1bGVzKGZhbHNlKQorICAgICwgbV91c2Vz
QmVmb3JlQWZ0ZXJSdWxlc092ZXJyaWRlKGZhbHNlKQorICAgICwgbV91c2VzUmVtVW5pdHMoZmFs
c2UpCit7Cit9CisKK0RvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246On5Eb2N1bWVudFN0eWxl
U2hlZXRDb2xsZWN0aW9uKCkKK3sKKyAgICBtX2F1dGhvclN0eWxlU2hlZXRzLT5kb2N1bWVudERl
c3Ryb3llZCgpOworCisgICAgaWYgKG1fcGFnZVVzZXJTaGVldCkKKyAgICAgICAgbV9wYWdlVXNl
clNoZWV0LT5jbGVhck93bmVyTm9kZSgpOworICAgIGlmIChtX3BhZ2VHcm91cFVzZXJTaGVldHMp
IHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX3BhZ2VHcm91cFVzZXJTaGVldHMt
PnNpemUoKTsgKytpKQorICAgICAgICAgICAgKCptX3BhZ2VHcm91cFVzZXJTaGVldHMpW2ldLT5j
bGVhck93bmVyTm9kZSgpOworICAgIH0KKyAgICBpZiAobV91c2VyU2hlZXRzKSB7CisgICAgICAg
IGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV91c2VyU2hlZXRzLT5zaXplKCk7ICsraSkKKyAgICAg
ICAgICAgICgqbV91c2VyU2hlZXRzKVtpXS0+Y2xlYXJPd25lck5vZGUoKTsKKyAgICB9Cit9CisK
K0NTU1N0eWxlU2hlZXQqIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OnBhZ2VVc2VyU2hl
ZXQoKQoreworICAgIGlmIChtX3BhZ2VVc2VyU2hlZXQpCisgICAgICAgIHJldHVybiBtX3BhZ2VV
c2VyU2hlZXQuZ2V0KCk7CisgICAgCisgICAgUGFnZSogb3duaW5nUGFnZSA9IG1fZG9jdW1lbnQt
PnBhZ2UoKTsKKyAgICBpZiAoIW93bmluZ1BhZ2UpCisgICAgICAgIHJldHVybiAwOworICAgIAor
ICAgIFN0cmluZyB1c2VyU2hlZXRUZXh0ID0gb3duaW5nUGFnZS0+dXNlclN0eWxlU2hlZXQoKTsK
KyAgICBpZiAodXNlclNoZWV0VGV4dC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiAwOworICAg
IAorICAgIC8vIFBhcnNlIHRoZSBzaGVldCBhbmQgY2FjaGUgaXQuCisgICAgbV9wYWdlVXNlclNo
ZWV0ID0gQ1NTU3R5bGVTaGVldDo6Y3JlYXRlSW5saW5lKG1fZG9jdW1lbnQsIG1fZG9jdW1lbnQt
PnNldHRpbmdzKCktPnVzZXJTdHlsZVNoZWV0TG9jYXRpb24oKSk7CisgICAgbV9wYWdlVXNlclNo
ZWV0LT5jb250ZW50cygpLT5zZXRJc1VzZXJTdHlsZVNoZWV0KHRydWUpOworICAgIG1fcGFnZVVz
ZXJTaGVldC0+Y29udGVudHMoKS0+cGFyc2VTdHJpbmcodXNlclNoZWV0VGV4dCk7CisgICAgcmV0
dXJuIG1fcGFnZVVzZXJTaGVldC5nZXQoKTsKK30KKwordm9pZCBEb2N1bWVudFN0eWxlU2hlZXRD
b2xsZWN0aW9uOjpjbGVhclBhZ2VVc2VyU2hlZXQoKQoreworICAgIGlmIChtX3BhZ2VVc2VyU2hl
ZXQpIHsKKyAgICAgICAgbV9wYWdlVXNlclNoZWV0ID0gMDsKKyAgICAgICAgbV9kb2N1bWVudC0+
c3R5bGVSZXNvbHZlckNoYW5nZWQoRGVmZXJSZWNhbGNTdHlsZSk7CisgICAgfQorfQorCit2b2lk
IERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OnVwZGF0ZVBhZ2VVc2VyU2hlZXQoKQorewor
ICAgIGNsZWFyUGFnZVVzZXJTaGVldCgpOworICAgIGlmIChwYWdlVXNlclNoZWV0KCkpCisgICAg
ICAgIG1fZG9jdW1lbnQtPnN0eWxlUmVzb2x2ZXJDaGFuZ2VkKFJlY2FsY1N0eWxlSW1tZWRpYXRl
bHkpOworfQorCitjb25zdCBWZWN0b3I8UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4qIERvY3VtZW50
U3R5bGVTaGVldENvbGxlY3Rpb246OnBhZ2VHcm91cFVzZXJTaGVldHMoKSBjb25zdAoreworICAg
IGlmIChtX3BhZ2VHcm91cFVzZXJTaGVldENhY2hlVmFsaWQpCisgICAgICAgIHJldHVybiBtX3Bh
Z2VHcm91cFVzZXJTaGVldHMuZ2V0KCk7CisgICAgCisgICAgbV9wYWdlR3JvdXBVc2VyU2hlZXRD
YWNoZVZhbGlkID0gdHJ1ZTsKKyAgICAKKyAgICBQYWdlKiBvd25pbmdQYWdlID0gbV9kb2N1bWVu
dC0+cGFnZSgpOworICAgIGlmICghb3duaW5nUGFnZSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAg
ICAgIAorICAgIGNvbnN0IFBhZ2VHcm91cCYgcGFnZUdyb3VwID0gb3duaW5nUGFnZS0+Z3JvdXAo
KTsKKyAgICBjb25zdCBVc2VyU3R5bGVTaGVldE1hcCogc2hlZXRzTWFwID0gcGFnZUdyb3VwLnVz
ZXJTdHlsZVNoZWV0cygpOworICAgIGlmICghc2hlZXRzTWFwKQorICAgICAgICByZXR1cm4gMDsK
KworICAgIFVzZXJTdHlsZVNoZWV0TWFwOjpjb25zdF9pdGVyYXRvciBlbmQgPSBzaGVldHNNYXAt
PmVuZCgpOworICAgIGZvciAoVXNlclN0eWxlU2hlZXRNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0g
c2hlZXRzTWFwLT5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgY29uc3QgVXNl
clN0eWxlU2hlZXRWZWN0b3IqIHNoZWV0cyA9IGl0LT5zZWNvbmQuZ2V0KCk7CisgICAgICAgIGZv
ciAodW5zaWduZWQgaSA9IDA7IGkgPCBzaGVldHMtPnNpemUoKTsgKytpKSB7CisgICAgICAgICAg
ICBjb25zdCBVc2VyU3R5bGVTaGVldCogc2hlZXQgPSBzaGVldHMtPmF0KGkpLmdldCgpOworICAg
ICAgICAgICAgaWYgKHNoZWV0LT5pbmplY3RlZEZyYW1lcygpID09IEluamVjdEluVG9wRnJhbWVP
bmx5ICYmIG1fZG9jdW1lbnQtPm93bmVyRWxlbWVudCgpKQorICAgICAgICAgICAgICAgIGNvbnRp
bnVlOworICAgICAgICAgICAgaWYgKCFVc2VyQ29udGVudFVSTFBhdHRlcm46Om1hdGNoZXNQYXR0
ZXJucyhtX2RvY3VtZW50LT51cmwoKSwgc2hlZXQtPndoaXRlbGlzdCgpLCBzaGVldC0+YmxhY2ts
aXN0KCkpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgUmVmUHRyPENT
U1N0eWxlU2hlZXQ+IGdyb3VwU2hlZXQgPSBDU1NTdHlsZVNoZWV0OjpjcmVhdGVJbmxpbmUoY29u
c3RfY2FzdDxEb2N1bWVudCo+KG1fZG9jdW1lbnQpLCBzaGVldC0+dXJsKCkpOworICAgICAgICAg
ICAgaWYgKCFtX3BhZ2VHcm91cFVzZXJTaGVldHMpCisgICAgICAgICAgICAgICAgbV9wYWdlR3Jv
dXBVc2VyU2hlZXRzID0gYWRvcHRQdHIobmV3IFZlY3RvcjxSZWZQdHI8Q1NTU3R5bGVTaGVldD4g
Pik7CisgICAgICAgICAgICBtX3BhZ2VHcm91cFVzZXJTaGVldHMtPmFwcGVuZChncm91cFNoZWV0
KTsKKyAgICAgICAgICAgIGdyb3VwU2hlZXQtPmNvbnRlbnRzKCktPnNldElzVXNlclN0eWxlU2hl
ZXQoc2hlZXQtPmxldmVsKCkgPT0gVXNlclN0eWxlVXNlckxldmVsKTsKKyAgICAgICAgICAgIGdy
b3VwU2hlZXQtPmNvbnRlbnRzKCktPnBhcnNlU3RyaW5nKHNoZWV0LT5zb3VyY2UoKSk7CisgICAg
ICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbV9wYWdlR3JvdXBVc2VyU2hlZXRzLmdldCgpOwor
fQorCit2b2lkIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OmNsZWFyUGFnZUdyb3VwVXNl
clNoZWV0cygpCit7CisgICAgbV9wYWdlR3JvdXBVc2VyU2hlZXRDYWNoZVZhbGlkID0gZmFsc2U7
CisgICAgaWYgKG1fcGFnZUdyb3VwVXNlclNoZWV0cyAmJiBtX3BhZ2VHcm91cFVzZXJTaGVldHMt
PnNpemUoKSkgeworICAgICAgICBtX3BhZ2VHcm91cFVzZXJTaGVldHMtPmNsZWFyKCk7CisgICAg
ICAgIG1fZG9jdW1lbnQtPnN0eWxlUmVzb2x2ZXJDaGFuZ2VkKERlZmVyUmVjYWxjU3R5bGUpOwor
ICAgIH0KK30KKwordm9pZCBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjp1cGRhdGVQYWdl
R3JvdXBVc2VyU2hlZXRzKCkKK3sKKyAgICBjbGVhclBhZ2VHcm91cFVzZXJTaGVldHMoKTsKKyAg
ICBpZiAocGFnZUdyb3VwVXNlclNoZWV0cygpICYmIHBhZ2VHcm91cFVzZXJTaGVldHMoKS0+c2l6
ZSgpKQorICAgICAgICBtX2RvY3VtZW50LT5zdHlsZVJlc29sdmVyQ2hhbmdlZChSZWNhbGNTdHls
ZUltbWVkaWF0ZWx5KTsKK30KKwordm9pZCBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjph
ZGRVc2VyU2hlZXQoUGFzc1JlZlB0cjxTdHlsZVNoZWV0Q29udGVudHM+IHVzZXJTaGVldCkKK3sK
KyAgICBpZiAoIW1fdXNlclNoZWV0cykKKyAgICAgICAgbV91c2VyU2hlZXRzID0gYWRvcHRQdHIo
bmV3IFZlY3RvcjxSZWZQdHI8Q1NTU3R5bGVTaGVldD4gPik7CisgICAgbV91c2VyU2hlZXRzLT5h
cHBlbmQoQ1NTU3R5bGVTaGVldDo6Y3JlYXRlKHVzZXJTaGVldCwgbV9kb2N1bWVudCkpOworICAg
IG1fZG9jdW1lbnQtPnN0eWxlUmVzb2x2ZXJDaGFuZ2VkKFJlY2FsY1N0eWxlSW1tZWRpYXRlbHkp
OworfQorCisvLyBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbmV2ZXIgYSB0b3AtbGV2ZWwgc3R5
bGVzaGVldCBoYXMgZmluaXNoZWQgbG9hZGluZy4KK3ZvaWQgRG9jdW1lbnRTdHlsZVNoZWV0Q29s
bGVjdGlvbjo6cmVtb3ZlUGVuZGluZ1NoZWV0KFJlbW92ZVBlbmRpbmdTaGVldE5vdGlmaWNhdGlv
blR5cGUgbm90aWZpY2F0aW9uKQoreworICAgIC8vIE1ha2Ugc3VyZSB3ZSBrbmV3IHRoaXMgc2hl
ZXQgd2FzIHBlbmRpbmcsIGFuZCB0aGF0IG91ciBjb3VudCBpc24ndCBvdXQgb2Ygc3luYy4KKyAg
ICBBU1NFUlQobV9wZW5kaW5nU3R5bGVzaGVldHMgPiAwKTsKKworICAgIG1fcGVuZGluZ1N0eWxl
c2hlZXRzLS07CisgICAgCisjaWZkZWYgSU5TVFJVTUVOVF9MQVlPVVRfU0NIRURVTElORworICAg
IGlmICghb3duZXJFbGVtZW50KCkpCisgICAgICAgIHByaW50ZigiU3R5bGVzaGVldCBsb2FkZWQg
YXQgdGltZSAlZC4gJWQgc3R5bGVzaGVldHMgc3RpbGwgcmVtYWluLlxuIiwgZWxhcHNlZFRpbWUo
KSwgbV9wZW5kaW5nU3R5bGVzaGVldHMpOworI2VuZGlmCisKKyAgICBpZiAobV9wZW5kaW5nU3R5
bGVzaGVldHMpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChub3RpZmljYXRpb24gPT0gUmVt
b3ZlUGVuZGluZ1NoZWV0Tm90aWZ5TGF0ZXIpIHsKKyAgICAgICAgbV9kb2N1bWVudC0+c2V0TmVl
ZHNOb3RpZnlSZW1vdmVBbGxQZW5kaW5nU3R5bGVzaGVldCgpOworICAgICAgICByZXR1cm47Cisg
ICAgfQorICAgIAorICAgIG1fZG9jdW1lbnQtPmRpZFJlbW92ZUFsbFBlbmRpbmdTdHlsZXNoZWV0
KCk7Cit9CisKK3ZvaWQgRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6YWRkU3R5bGVTaGVl
dENhbmRpZGF0ZU5vZGUoTm9kZSogbm9kZSwgYm9vbCBjcmVhdGVkQnlQYXJzZXIpCit7CisgICAg
aWYgKCFub2RlLT5pbkRvY3VtZW50KCkpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICAvLyBV
bnRpbCB0aGUgPGJvZHk+IGV4aXN0cywgd2UgaGF2ZSBubyBjaG9pY2UgYnV0IHRvIGNvbXBhcmUg
ZG9jdW1lbnQgcG9zaXRpb25zLAorICAgIC8vIHNpbmNlIHN0eWxlcyBvdXRzaWRlIG9mIHRoZSBi
b2R5IGFuZCBoZWFkIGNvbnRpbnVlIHRvIGJlIHNodW50ZWQgaW50byB0aGUgaGVhZAorICAgIC8v
IChhbmQgdGh1cyBjYW4gc2hpZnQgdG8gZW5kIHVwIGJlZm9yZSBkeW5hbWljYWxseSBhZGRlZCBE
T00gY29udGVudCB0aGF0IGlzIGFsc28KKyAgICAvLyBvdXRzaWRlIHRoZSBib2R5KS4KKyAgICBp
ZiAoKGNyZWF0ZWRCeVBhcnNlciAmJiBtX2RvY3VtZW50LT5ib2R5KCkpIHx8IG1fc3R5bGVTaGVl
dENhbmRpZGF0ZU5vZGVzLmlzRW1wdHkoKSkgeworICAgICAgICBtX3N0eWxlU2hlZXRDYW5kaWRh
dGVOb2Rlcy5hZGQobm9kZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBEZXRl
cm1pbmUgYW4gYXBwcm9wcmlhdGUgaW5zZXJ0aW9uIHBvaW50LgorICAgIFN0eWxlU2hlZXRDYW5k
aWRhdGVMaXN0SGFzaFNldDo6aXRlcmF0b3IgYmVnaW4gPSBtX3N0eWxlU2hlZXRDYW5kaWRhdGVO
b2Rlcy5iZWdpbigpOworICAgIFN0eWxlU2hlZXRDYW5kaWRhdGVMaXN0SGFzaFNldDo6aXRlcmF0
b3IgZW5kID0gbV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMuZW5kKCk7CisgICAgU3R5bGVTaGVl
dENhbmRpZGF0ZUxpc3RIYXNoU2V0OjppdGVyYXRvciBpdCA9IGVuZDsKKyAgICBOb2RlKiBmb2xs
b3dpbmdOb2RlID0gMDsKKyAgICBkbyB7CisgICAgICAgIC0taXQ7CisgICAgICAgIE5vZGUqIG4g
PSAqaXQ7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IHBvc2l0aW9uID0gbi0+Y29tcGFyZURvY3Vt
ZW50UG9zaXRpb24obm9kZSk7CisgICAgICAgIGlmIChwb3NpdGlvbiA9PSBOb2RlOjpET0NVTUVO
VF9QT1NJVElPTl9GT0xMT1dJTkcpIHsKKyAgICAgICAgICAgIG1fc3R5bGVTaGVldENhbmRpZGF0
ZU5vZGVzLmluc2VydEJlZm9yZShmb2xsb3dpbmdOb2RlLCBub2RlKTsKKyAgICAgICAgICAgIHJl
dHVybjsKKyAgICAgICAgfQorICAgICAgICBmb2xsb3dpbmdOb2RlID0gbjsKKyAgICB9IHdoaWxl
IChpdCAhPSBiZWdpbik7CisgICAgCisgICAgbV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMuaW5z
ZXJ0QmVmb3JlKGZvbGxvd2luZ05vZGUsIG5vZGUpOworfQorCit2b2lkIERvY3VtZW50U3R5bGVT
aGVldENvbGxlY3Rpb246OnJlbW92ZVN0eWxlU2hlZXRDYW5kaWRhdGVOb2RlKE5vZGUqIG5vZGUp
Cit7CisgICAgbV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMucmVtb3ZlKG5vZGUpOworfQorCit2
b2lkIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OmNvbGxlY3RBY3RpdmVTdHlsZVNoZWV0
cyhWZWN0b3I8UmVmUHRyPFN0eWxlU2hlZXQ+ID4mIHNoZWV0cykKK3sKKyAgICBpZiAobV9kb2N1
bWVudC0+c2V0dGluZ3MoKSAmJiAhbV9kb2N1bWVudC0+c2V0dGluZ3MoKS0+YXV0aG9yQW5kVXNl
clN0eWxlc0VuYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgU3R5bGVTaGVldENhbmRp
ZGF0ZUxpc3RIYXNoU2V0OjppdGVyYXRvciBiZWdpbiA9IG1fc3R5bGVTaGVldENhbmRpZGF0ZU5v
ZGVzLmJlZ2luKCk7CisgICAgU3R5bGVTaGVldENhbmRpZGF0ZUxpc3RIYXNoU2V0OjppdGVyYXRv
ciBlbmQgPSBtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcy5lbmQoKTsKKyAgICBmb3IgKFN0eWxl
U2hlZXRDYW5kaWRhdGVMaXN0SGFzaFNldDo6aXRlcmF0b3IgaXQgPSBiZWdpbjsgaXQgIT0gZW5k
OyArK2l0KSB7CisgICAgICAgIE5vZGUqIG4gPSAqaXQ7CisgICAgICAgIFN0eWxlU2hlZXQqIHNo
ZWV0ID0gMDsKKyAgICAgICAgaWYgKG4tPm5vZGVUeXBlKCkgPT0gTm9kZTo6UFJPQ0VTU0lOR19J
TlNUUlVDVElPTl9OT0RFKSB7CisgICAgICAgICAgICAvLyBQcm9jZXNzaW5nIGluc3RydWN0aW9u
IChYTUwgZG9jdW1lbnRzIG9ubHkpLgorICAgICAgICAgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCBs
aW5raW5nIHRvIGVtYmVkZGVkIENTUyBzdHlsZXNoZWV0cywgc2VlIDxodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDkyODE+IGZvciBkaXNjdXNzaW9uLgorICAgICAgICAg
ICAgUHJvY2Vzc2luZ0luc3RydWN0aW9uKiBwaSA9IHN0YXRpY19jYXN0PFByb2Nlc3NpbmdJbnN0
cnVjdGlvbio+KG4pOworICAgICAgICAgICAgc2hlZXQgPSBwaS0+c2hlZXQoKTsKKyNpZiBFTkFC
TEUoWFNMVCkKKyAgICAgICAgICAgIC8vIERvbid0IGFwcGx5IFhTTCB0cmFuc2Zvcm1zIHRvIGFs
cmVhZHkgdHJhbnNmb3JtZWQgZG9jdW1lbnRzIC0tIDxyZGFyOi8vcHJvYmxlbS80MTMyODA2Pgor
ICAgICAgICAgICAgaWYgKHBpLT5pc1hTTCgpICYmICFtX2RvY3VtZW50LT50cmFuc2Zvcm1Tb3Vy
Y2VEb2N1bWVudCgpKSB7CisgICAgICAgICAgICAgICAgLy8gRG9uJ3QgYXBwbHkgWFNMIHRyYW5z
Zm9ybXMgdW50aWwgbG9hZGluZyBpcyBmaW5pc2hlZC4KKyAgICAgICAgICAgICAgICBpZiAoIW1f
ZG9jdW1lbnQtPnBhcnNpbmcoKSkKKyAgICAgICAgICAgICAgICAgICAgbV9kb2N1bWVudC0+YXBw
bHlYU0xUcmFuc2Zvcm0ocGkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAg
IH0KKyNlbmRpZgorICAgICAgICB9IGVsc2UgaWYgKChuLT5pc0hUTUxFbGVtZW50KCkgJiYgKG4t
Pmhhc1RhZ05hbWUobGlua1RhZykgfHwgbi0+aGFzVGFnTmFtZShzdHlsZVRhZykpKQorI2lmIEVO
QUJMRShTVkcpCisgICAgICAgICAgICAgICAgICAgfHwgIChuLT5pc1NWR0VsZW1lbnQoKSAmJiBu
LT5oYXNUYWdOYW1lKFNWR05hbWVzOjpzdHlsZVRhZykpCisjZW5kaWYKKyAgICAgICAgICAgICAg
ICAgICApIHsKKyAgICAgICAgICAgIEVsZW1lbnQqIGUgPSBzdGF0aWNfY2FzdDxFbGVtZW50Kj4o
bik7CisgICAgICAgICAgICBBdG9taWNTdHJpbmcgdGl0bGUgPSBlLT5nZXRBdHRyaWJ1dGUodGl0
bGVBdHRyKTsKKyAgICAgICAgICAgIGJvb2wgZW5hYmxlZFZpYVNjcmlwdCA9IGZhbHNlOworICAg
ICAgICAgICAgaWYgKGUtPmhhc0xvY2FsTmFtZShsaW5rVGFnKSkgeworICAgICAgICAgICAgICAg
IC8vIDxMSU5LPiBlbGVtZW50CisgICAgICAgICAgICAgICAgSFRNTExpbmtFbGVtZW50KiBsaW5r
RWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxMaW5rRWxlbWVudCo+KG4pOworICAgICAgICAgICAg
ICAgIGlmIChsaW5rRWxlbWVudC0+aXNEaXNhYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBj
b250aW51ZTsKKyAgICAgICAgICAgICAgICBlbmFibGVkVmlhU2NyaXB0ID0gbGlua0VsZW1lbnQt
PmlzRW5hYmxlZFZpYVNjcmlwdCgpOworICAgICAgICAgICAgICAgIGlmIChsaW5rRWxlbWVudC0+
c3R5bGVTaGVldElzTG9hZGluZygpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGl0IGlzIGxv
YWRpbmcgYnV0IHdlIHNob3VsZCBzdGlsbCBkZWNpZGUgd2hpY2ggc3R5bGUgc2hlZXQgc2V0IHRv
IHVzZQorICAgICAgICAgICAgICAgICAgICBpZiAoIWVuYWJsZWRWaWFTY3JpcHQgJiYgIXRpdGxl
LmlzRW1wdHkoKSAmJiBtX3ByZWZlcnJlZFN0eWxlc2hlZXRTZXROYW1lLmlzRW1wdHkoKSkgewor
ICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXRvbWljU3RyaW5nJiByZWwgPSBlLT5nZXRB
dHRyaWJ1dGUocmVsQXR0cik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlbC5jb250
YWlucygiYWx0ZXJuYXRlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ByZWZl
cnJlZFN0eWxlc2hlZXRTZXROYW1lID0gdGl0bGU7CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgbV9zZWxlY3RlZFN0eWxlc2hlZXRTZXROYW1lID0gdGl0bGU7CisgICAgICAgICAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY29u
dGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghbGlua0VsZW1l
bnQtPnNoZWV0KCkpCisgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gbnVsbEF0b207CisgICAg
ICAgICAgICB9CisgICAgICAgICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgcHJlZmVycmVkIHN0eWxl
c2V0LiBUaGlzIGlzIHRoZQorICAgICAgICAgICAgLy8gc2V0IG9mIHNoZWV0cyB0aGF0IHdpbGwg
YmUgZW5hYmxlZC4KKyNpZiBFTkFCTEUoU1ZHKQorICAgICAgICAgICAgaWYgKG4tPmlzU1ZHRWxl
bWVudCgpICYmIG4tPmhhc1RhZ05hbWUoU1ZHTmFtZXM6OnN0eWxlVGFnKSkKKyAgICAgICAgICAg
ICAgICBzaGVldCA9IHN0YXRpY19jYXN0PFNWR1N0eWxlRWxlbWVudCo+KG4pLT5zaGVldCgpOwor
ICAgICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICBpZiAoZS0+aGFzTG9jYWxOYW1l
KGxpbmtUYWcpKQorICAgICAgICAgICAgICAgIHNoZWV0ID0gc3RhdGljX2Nhc3Q8SFRNTExpbmtF
bGVtZW50Kj4obiktPnNoZWV0KCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAg
Ly8gPFNUWUxFPiBlbGVtZW50CisgICAgICAgICAgICAgICAgc2hlZXQgPSBzdGF0aWNfY2FzdDxI
VE1MU3R5bGVFbGVtZW50Kj4obiktPnNoZWV0KCk7CisgICAgICAgICAgICAvLyBDaGVjayB0byBz
ZWUgaWYgdGhpcyBzaGVldCBiZWxvbmdzIHRvIGEgc3R5bGVzZXQKKyAgICAgICAgICAgIC8vICh0
aHVzIG1ha2luZyBpdCBQUkVGRVJSRUQgb3IgQUxURVJOQVRFIHJhdGhlciB0aGFuCisgICAgICAg
ICAgICAvLyBQRVJTSVNURU5UKS4KKyAgICAgICAgICAgIEF0b21pY1N0cmluZyByZWwgPSBlLT5n
ZXRBdHRyaWJ1dGUocmVsQXR0cik7CisgICAgICAgICAgICBpZiAoIWVuYWJsZWRWaWFTY3JpcHQg
JiYgIXRpdGxlLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIC8vIFllcywgd2UgaGF2ZSBh
IHRpdGxlLgorICAgICAgICAgICAgICAgIGlmIChtX3ByZWZlcnJlZFN0eWxlc2hlZXRTZXROYW1l
LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBObyBwcmVmZXJyZWQgc2V0IGhh
cyBiZWVuIGVzdGFibGlzaGVkLiBJZgorICAgICAgICAgICAgICAgICAgICAvLyB3ZSBhcmUgTk9U
IGFuIGFsdGVybmF0ZSBzaGVldCwgdGhlbiBlc3RhYmxpc2gKKyAgICAgICAgICAgICAgICAgICAg
Ly8gdXMgYXMgdGhlIHByZWZlcnJlZCBzZXQuIE90aGVyd2lzZSwganVzdCBpZ25vcmUKKyAgICAg
ICAgICAgICAgICAgICAgLy8gdGhpcyBzaGVldC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKGUt
Pmhhc0xvY2FsTmFtZShzdHlsZVRhZykgfHwgIXJlbC5jb250YWlucygiYWx0ZXJuYXRlIikpCisg
ICAgICAgICAgICAgICAgICAgICAgICBtX3ByZWZlcnJlZFN0eWxlc2hlZXRTZXROYW1lID0gbV9z
ZWxlY3RlZFN0eWxlc2hlZXRTZXROYW1lID0gdGl0bGU7CisgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgICAgIGlmICh0aXRsZSAhPSBtX3ByZWZlcnJlZFN0eWxlc2hlZXRTZXROYW1lKQor
ICAgICAgICAgICAgICAgICAgICBzaGVldCA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgIGlmIChyZWwuY29udGFpbnMoImFsdGVybmF0ZSIpICYmIHRpdGxlLmlzRW1wdHkoKSkKKyAg
ICAgICAgICAgICAgICBzaGVldCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNoZWV0KQor
ICAgICAgICAgICAgc2hlZXRzLmFwcGVuZChzaGVldCk7CisgICAgfQorfQorCitib29sIERvY3Vt
ZW50U3R5bGVTaGVldENvbGxlY3Rpb246OnRlc3RBZGRlZFN0eWxlU2hlZXRSZXF1aXJlc1N0eWxl
UmVjYWxjKFN0eWxlU2hlZXRDb250ZW50cyogc3R5bGVzaGVldCkKK3sKKyAgICAvLyBTZWUgaWYg
YWxsIHJ1bGVzIG9uIHRoZSBzaGVldCBhcmUgc2NvcGVkIHRvIHNvbWUgc3BlY2lmaWMgaWRzIG9y
IGNsYXNzZXMuCisgICAgLy8gVGhlbiB0ZXN0IGlmIHdlIGFjdHVhbGx5IGhhdmUgYW55IG9mIHRo
b3NlIGluIHRoZSB0cmVlIGF0IHRoZSBtb21lbnQuCisgICAgSGFzaFNldDxBdG9taWNTdHJpbmdJ
bXBsKj4gaWRTY29wZXM7IAorICAgIEhhc2hTZXQ8QXRvbWljU3RyaW5nSW1wbCo+IGNsYXNzU2Nv
cGVzOworICAgIGlmICghU3R5bGVSZXNvbHZlcjo6ZGV0ZXJtaW5lU3R5bGVzaGVldFNlbGVjdG9y
U2NvcGVzKHN0eWxlc2hlZXQsIGlkU2NvcGVzLCBjbGFzc1Njb3BlcykpCisgICAgICAgIHJldHVy
biB0cnVlOworICAgIC8vIEludmFsaWRhdGUgdGhlIHN1YnRyZWVzIHRoYXQgbWF0Y2ggdGhlIHNj
b3Blcy4KKyAgICBOb2RlKiBub2RlID0gbV9kb2N1bWVudC0+Zmlyc3RDaGlsZCgpOworICAgIHdo
aWxlIChub2RlKSB7CisgICAgICAgIGlmICghbm9kZS0+aXNTdHlsZWRFbGVtZW50KCkpIHsKKyAg
ICAgICAgICAgIG5vZGUgPSBub2RlLT50cmF2ZXJzZU5leHROb2RlKCk7CisgICAgICAgICAgICBj
b250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBTdHlsZWRFbGVtZW50KiBlbGVtZW50ID0gc3Rh
dGljX2Nhc3Q8U3R5bGVkRWxlbWVudCo+KG5vZGUpOworICAgICAgICBpZiAoU2VsZWN0b3JDaGVj
a2VyOjplbGVtZW50TWF0Y2hlc1NlbGVjdG9yU2NvcGVzKGVsZW1lbnQsIGlkU2NvcGVzLCBjbGFz
c1Njb3BlcykpIHsKKyAgICAgICAgICAgIGVsZW1lbnQtPnNldE5lZWRzU3R5bGVSZWNhbGMoKTsK
KyAgICAgICAgICAgIC8vIFRoZSB3aG9sZSBzdWJ0cmVlIGlzIG5vdyBpbnZhbGlkYXRlZCwgd2Ug
Y2FuIHNraXAgdG8gdGhlIG5leHQgc2libGluZy4KKyAgICAgICAgICAgIG5vZGUgPSBub2RlLT50
cmF2ZXJzZU5leHRTaWJsaW5nKCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQor
ICAgICAgICBub2RlID0gbm9kZS0+dHJhdmVyc2VOZXh0Tm9kZSgpOworICAgIH0KKyAgICByZXR1
cm4gZmFsc2U7Cit9CisKK3ZvaWQgRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6YW5hbHl6
ZVN0eWxlU2hlZXRDaGFuZ2UoVXBkYXRlRmxhZyB1cGRhdGVGbGFnLCBjb25zdCBWZWN0b3I8UmVm
UHRyPFN0eWxlU2hlZXQ+ID4mIG5ld1N0eWxlc2hlZXRzLCBib29sJiByZXF1aXJlc1N0eWxlUmVz
b2x2ZXJSZXNldCwgYm9vbCYgcmVxdWlyZXNGdWxsU3R5bGVSZWNhbGMpCit7CisgICAgcmVxdWly
ZXNTdHlsZVJlc29sdmVyUmVzZXQgPSB0cnVlOworICAgIHJlcXVpcmVzRnVsbFN0eWxlUmVjYWxj
ID0gdHJ1ZTsKKyAgICAKKyAgICAvLyBTdHlsZXNoZWV0cyBvZiA8c3R5bGU+IGVsZW1lbnRzIHRo
YXQgQGltcG9ydCBzdHlsZXNoZWV0cyBhcmUgYWN0aXZlIGJ1dCBsb2FkaW5nLiBXZSBuZWVkIHRv
IHRyaWdnZXIgYSBmdWxsIHJlY2FsYyB3aGVuIHN1Y2ggbG9hZHMgYXJlIGRvbmUuCisgICAgYm9v
bCBoYXNBY3RpdmVMb2FkaW5nU3R5bGVzaGVldCA9IGZhbHNlOworICAgIHVuc2lnbmVkIG5ld1N0
eWxlc2hlZXRDb3VudCA9IG5ld1N0eWxlc2hlZXRzLnNpemUoKTsKKyAgICBmb3IgKHVuc2lnbmVk
IGkgPSAwOyBpIDwgbmV3U3R5bGVzaGVldENvdW50OyArK2kpIHsKKyAgICAgICAgaWYgKG5ld1N0
eWxlc2hlZXRzW2ldLT5pc0xvYWRpbmcoKSkKKyAgICAgICAgICAgIGhhc0FjdGl2ZUxvYWRpbmdT
dHlsZXNoZWV0ID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKG1faGFkQWN0aXZlTG9hZGluZ1N0eWxl
c2hlZXQgJiYgIWhhc0FjdGl2ZUxvYWRpbmdTdHlsZXNoZWV0KSB7CisgICAgICAgIG1faGFkQWN0
aXZlTG9hZGluZ1N0eWxlc2hlZXQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAg
ICBtX2hhZEFjdGl2ZUxvYWRpbmdTdHlsZXNoZWV0ID0gaGFzQWN0aXZlTG9hZGluZ1N0eWxlc2hl
ZXQ7CisKKyAgICBpZiAodXBkYXRlRmxhZyAhPSBPcHRpbWl6ZWRVcGRhdGUpCisgICAgICAgIHJl
dHVybjsKKyAgICBpZiAoIW1fZG9jdW1lbnQtPnN0eWxlUmVzb2x2ZXJJZkV4aXN0cygpKQorICAg
ICAgICByZXR1cm47CisKKyAgICAvLyBTZWUgaWYgd2UgYXJlIGp1c3QgYWRkaW5nIHN0eWxlc2hl
ZXRzLgorICAgIHVuc2lnbmVkIG9sZFN0eWxlc2hlZXRDb3VudCA9IG1fYXV0aG9yU3R5bGVTaGVl
dHMtPmxlbmd0aCgpOworICAgIGlmIChuZXdTdHlsZXNoZWV0Q291bnQgPCBvbGRTdHlsZXNoZWV0
Q291bnQpCisgICAgICAgIHJldHVybjsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgb2xk
U3R5bGVzaGVldENvdW50OyArK2kpIHsKKyAgICAgICAgaWYgKG1fYXV0aG9yU3R5bGVTaGVldHMt
Pml0ZW0oaSkgIT0gbmV3U3R5bGVzaGVldHNbaV0pCisgICAgICAgICAgICByZXR1cm47CisgICAg
fQorICAgIHJlcXVpcmVzU3R5bGVSZXNvbHZlclJlc2V0ID0gZmFsc2U7CisKKyAgICAvLyBJZiB3
ZSBhcmUgYWxyZWFkeSBwYXJzaW5nIHRoZSBib2R5IGFuZCBzbyBtYXkgaGF2ZSBzaWduaWZpY2Fu
dCBhbW91bnQgb2YgZWxlbWVudHMsIHB1dCBzb21lIGVmZm9ydCBpbnRvIHRyeWluZyB0byBhdm9p
ZCBzdHlsZSByZWNhbGNzLgorICAgIGlmICghbV9kb2N1bWVudC0+Ym9keSgpIHx8IG1fZG9jdW1l
bnQtPmhhc05vZGVzV2l0aFBsYWNlaG9sZGVyU3R5bGUoKSkKKyAgICAgICAgcmV0dXJuOworICAg
IGZvciAodW5zaWduZWQgaSA9IG9sZFN0eWxlc2hlZXRDb3VudDsgaSA8IG5ld1N0eWxlc2hlZXRD
b3VudDsgKytpKSB7CisgICAgICAgIGlmICghbmV3U3R5bGVzaGVldHNbaV0tPmlzQ1NTU3R5bGVT
aGVldCgpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAobmV3U3R5bGVzaGVldHNb
aV0tPmRpc2FibGVkKCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKHRlc3RB
ZGRlZFN0eWxlU2hlZXRSZXF1aXJlc1N0eWxlUmVjYWxjKHN0YXRpY19jYXN0PENTU1N0eWxlU2hl
ZXQqPihuZXdTdHlsZXNoZWV0c1tpXS5nZXQoKSktPmNvbnRlbnRzKCkpKQorICAgICAgICAgICAg
cmV0dXJuOworICAgIH0KKyAgICByZXF1aXJlc0Z1bGxTdHlsZVJlY2FsYyA9IGZhbHNlOworfQor
CitzdGF0aWMgYm9vbCBzdHlsZVNoZWV0c1VzZVJlbVVuaXRzKGNvbnN0IFZlY3RvcjxSZWZQdHI8
U3R5bGVTaGVldD4gPiYgc2hlZXRzKQoreworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBz
aGVldHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKCFzaGVldHNbaV0tPmlzQ1NTU3R5bGVT
aGVldCgpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChzdGF0aWNfY2FzdDxD
U1NTdHlsZVNoZWV0Kj4oc2hlZXRzW2ldLmdldCgpKS0+Y29udGVudHMoKS0+dXNlc1JlbVVuaXRz
KCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOwor
fQorCitib29sIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OnVwZGF0ZUFjdGl2ZVN0eWxl
U2hlZXRzKFVwZGF0ZUZsYWcgdXBkYXRlRmxhZykKK3sKKyAgICBpZiAobV9kb2N1bWVudC0+aW5T
dHlsZVJlY2FsYygpKSB7CisgICAgICAgIC8vIFNWRyA8dXNlPiBlbGVtZW50IG1heSBtYW5hZ2Ug
dG8gaW52YWxpZGF0ZSBzdHlsZSBzZWxlY3RvciBpbiB0aGUgbWlkZGxlIG9mIGEgc3R5bGUgcmVj
YWxjLgorICAgICAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
NTQzNDQKKyAgICAgICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIGJlIGZpeGVkIGluIFNWRyBhbmQg
dGhlIGNhbGwgc2l0ZSByZXBsYWNlZCBieSBBU1NFUlQoIW1faW5TdHlsZVJlY2FsYykuCisgICAg
ICAgIG1fbmVlZHNVcGRhdGVBY3RpdmVTdHlsZXNoZWV0c09uU3R5bGVSZWNhbGMgPSB0cnVlOwor
ICAgICAgICBtX2RvY3VtZW50LT5zY2hlZHVsZUZvcmNlZFN0eWxlUmVjYWxjKCk7CisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIH0KKyAgICBpZiAoIW1fZG9jdW1lbnQtPnJlbmRlcmVyKCkg
fHwgIW1fZG9jdW1lbnQtPmF0dGFjaGVkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
IFN0eWxlU2hlZXRWZWN0b3IgbmV3U3R5bGVzaGVldHM7CisgICAgY29sbGVjdEFjdGl2ZVN0eWxl
U2hlZXRzKG5ld1N0eWxlc2hlZXRzKTsKKworICAgIGJvb2wgcmVxdWlyZXNTdHlsZVJlc29sdmVy
UmVzZXQ7CisgICAgYm9vbCByZXF1aXJlc0Z1bGxTdHlsZVJlY2FsYzsKKyAgICBhbmFseXplU3R5
bGVTaGVldENoYW5nZSh1cGRhdGVGbGFnLCBuZXdTdHlsZXNoZWV0cywgcmVxdWlyZXNTdHlsZVJl
c29sdmVyUmVzZXQsIHJlcXVpcmVzRnVsbFN0eWxlUmVjYWxjKTsKKworICAgIGlmIChyZXF1aXJl
c1N0eWxlUmVzb2x2ZXJSZXNldCkKKyAgICAgICAgbV9kb2N1bWVudC0+Y2xlYXJTdHlsZVJlc29s
dmVyKCk7CisgICAgZWxzZSB7CisgICAgICAgIG1fZG9jdW1lbnQtPnN0eWxlUmVzb2x2ZXIoKS0+
YXBwZW5kQXV0aG9yU3R5bGVzaGVldHMobV9hdXRob3JTdHlsZVNoZWV0cy0+bGVuZ3RoKCksIG5l
d1N0eWxlc2hlZXRzKTsKKyAgICAgICAgcmVzZXRDU1NGZWF0dXJlRmxhZ3MoKTsKKyAgICB9Cisg
ICAgbV9hdXRob3JTdHlsZVNoZWV0cy0+c3dhcChuZXdTdHlsZXNoZWV0cyk7CisKKyAgICBtX3Vz
ZXNSZW1Vbml0cyA9IHN0eWxlU2hlZXRzVXNlUmVtVW5pdHMobV9hdXRob3JTdHlsZVNoZWV0cy0+
dmVjdG9yKCkpOworICAgIG1fbmVlZHNVcGRhdGVBY3RpdmVTdHlsZXNoZWV0c09uU3R5bGVSZWNh
bGMgPSBmYWxzZTsKKworICAgIG1fZG9jdW1lbnQtPm5vdGlmeVNlYW1sZXNzQ2hpbGREb2N1bWVu
dHNPZlN0eWxlc2hlZXRVcGRhdGUoKTsKKworICAgIHJldHVybiByZXF1aXJlc0Z1bGxTdHlsZVJl
Y2FsYzsKK30KKwordm9pZCBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjpjb21iaW5lQ1NT
RmVhdHVyZUZsYWdzKCkKK3sKKyAgICAvLyBEZWxheSByZXNldHRpbmcgdGhlIGZsYWdzIHVudGls
IGFmdGVyIG5leHQgc3R5bGUgcmVjYWxjIHNpbmNlIHVuYXBwbHlpbmcgdGhlIHN0eWxlIG1heSBu
b3Qgd29yayB3aXRob3V0IHRoZXNlIHNldCAodGhpcyBpcyB0cnVlIGF0IGxlYXN0IHdpdGggYmVm
b3JlL2FmdGVyKS4KKyAgICBTdHlsZVJlc29sdmVyKiBzdHlsZVJlc29sdmVyID0gbV9kb2N1bWVu
dC0+c3R5bGVSZXNvbHZlcigpOworICAgIG1fdXNlc1NpYmxpbmdSdWxlcyA9IG1fdXNlc1NpYmxp
bmdSdWxlcyB8fCBzdHlsZVJlc29sdmVyLT51c2VzU2libGluZ1J1bGVzKCk7CisgICAgbV91c2Vz
Rmlyc3RMaW5lUnVsZXMgPSBtX3VzZXNGaXJzdExpbmVSdWxlcyB8fCBzdHlsZVJlc29sdmVyLT51
c2VzRmlyc3RMaW5lUnVsZXMoKTsKKyAgICBtX3VzZXNCZWZvcmVBZnRlclJ1bGVzID0gbV91c2Vz
QmVmb3JlQWZ0ZXJSdWxlcyB8fCBzdHlsZVJlc29sdmVyLT51c2VzQmVmb3JlQWZ0ZXJSdWxlcygp
OworfQorCit2b2lkIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OnJlc2V0Q1NTRmVhdHVy
ZUZsYWdzKCkKK3sKKyAgICBTdHlsZVJlc29sdmVyKiBzdHlsZVJlc29sdmVyID0gbV9kb2N1bWVu
dC0+c3R5bGVSZXNvbHZlcigpOworICAgIG1fdXNlc1NpYmxpbmdSdWxlcyA9IHN0eWxlUmVzb2x2
ZXItPnVzZXNTaWJsaW5nUnVsZXMoKTsKKyAgICBtX3VzZXNGaXJzdExpbmVSdWxlcyA9IHN0eWxl
UmVzb2x2ZXItPnVzZXNGaXJzdExpbmVSdWxlcygpOworICAgIG1fdXNlc0JlZm9yZUFmdGVyUnVs
ZXMgPSBzdHlsZVJlc29sdmVyLT51c2VzQmVmb3JlQWZ0ZXJSdWxlcygpOworfQorCit2b2lkIERv
Y3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OnJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVj
dEluZm8qIG1lbW9yeU9iamVjdEluZm8pIGNvbnN0Cit7CisgICAgTWVtb3J5Q2xhc3NJbmZvIGlu
Zm8obWVtb3J5T2JqZWN0SW5mbywgdGhpcywgV2ViQ29yZU1lbW9yeVR5cGVzOjpET00pOworICAg
IGluZm8uYWRkTWVtYmVyKG1fcGFnZVVzZXJTaGVldCk7CisgICAgaWYgKG1fcGFnZUdyb3VwVXNl
clNoZWV0cykKKyAgICAgICAgaW5mby5hZGRJbnN0cnVtZW50ZWRWZWN0b3JQdHIobV9wYWdlR3Jv
dXBVc2VyU2hlZXRzKTsKKyAgICBpZiAobV91c2VyU2hlZXRzKQorICAgICAgICBpbmZvLmFkZElu
c3RydW1lbnRlZFZlY3RvclB0cihtX3VzZXJTaGVldHMpOworICAgIGluZm8uYWRkTGlzdEhhc2hT
ZXQobV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMpOworICAgIGluZm8uYWRkTWVtYmVyKG1fcHJl
ZmVycmVkU3R5bGVzaGVldFNldE5hbWUpOworICAgIGluZm8uYWRkTWVtYmVyKG1fc2VsZWN0ZWRT
dHlsZXNoZWV0U2V0TmFtZSk7Cit9CisKK30KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2RvbS9Eb2N1
bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUv
ZG9tL0RvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uaAkocmV2aXNpb24gMCkKKysrIFNvdXJj
ZS9XZWJDb3JlL2RvbS9Eb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmgJKHJldmlzaW9uIDAp
CkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAxOTk5IExhcnMgS25vbGwg
KGtub2xsQGtkZS5vcmcpCisgKiAgICAgICAgICAgKEMpIDE5OTkgQW50dGkgS29pdmlzdG8gKGtv
aXZpc3RvQGtkZS5vcmcpCisgKiAgICAgICAgICAgKEMpIDIwMDEgRGlyayBNdWVsbGVyIChtdWVs
bGVyQGtkZS5vcmcpCisgKiAgICAgICAgICAgKEMpIDIwMDYgQWxleGV5IFByb3NrdXJ5YWtvdiAo
YXBAd2Via2l0Lm9yZykKKyAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywg
MjAwOCwgMjAwOSwgMjAxMCwgMjAxMiBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkgVG9yY2ggTW9iaWxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4gKGh0dHA6Ly93d3cudG9yY2htb2JpbGUuY29tLykKKyAqIENvcHlyaWdodCAoQykg
MjAxMCBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykKKyAqIENv
cHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBh
bmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2Fy
ZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0
IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMg
ZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBX
SVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9m
CisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Uu
ICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3Jl
IGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUg
R05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxp
YnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlm
dGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2lm
bmRlZiBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uX2gKKyNkZWZpbmUgRG9jdW1lbnRTdHls
ZVNoZWV0Q29sbGVjdGlvbl9oCisKKyNpbmNsdWRlIDx3dGYvRmFzdEFsbG9jQmFzZS5oPgorI2lu
Y2x1ZGUgPHd0Zi9MaXN0SGFzaFNldC5oPgorI2luY2x1ZGUgPHd0Zi9SZWZQdHIuaD4KKyNpbmNs
dWRlIDx3dGYvVmVjdG9yLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvV1RGU3RyaW5nLmg+CisKK25h
bWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgQ1NTU3R5bGVTaGVldDsKK2NsYXNzIERvY3VtZW50
OworY2xhc3MgTm9kZTsKK2NsYXNzIFN0eWxlU2hlZXQ7CitjbGFzcyBTdHlsZVNoZWV0Q29udGVu
dHM7CitjbGFzcyBTdHlsZVNoZWV0TGlzdDsKKworY2xhc3MgRG9jdW1lbnRTdHlsZVNoZWV0Q29s
bGVjdGlvbiB7CisgICAgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7CitwdWJsaWM6CisgICAgRG9j
dW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbihEb2N1bWVudCopOworICAgIH5Eb2N1bWVudFN0eWxl
U2hlZXRDb2xsZWN0aW9uKCk7CisKKyAgICBTdHlsZVNoZWV0TGlzdCogYXV0aG9yU3R5bGVTaGVl
dHMoKSB7IHJldHVybiBtX2F1dGhvclN0eWxlU2hlZXRzLmdldCgpOyB9CisKKyAgICBDU1NTdHls
ZVNoZWV0KiBwYWdlVXNlclNoZWV0KCk7CisgICAgY29uc3QgVmVjdG9yPFJlZlB0cjxDU1NTdHls
ZVNoZWV0PiA+KiBwYWdlR3JvdXBVc2VyU2hlZXRzKCkgY29uc3Q7CisgICAgY29uc3QgVmVjdG9y
PFJlZlB0cjxDU1NTdHlsZVNoZWV0PiA+KiBkb2N1bWVudFVzZXJTaGVldHMoKSBjb25zdCB7IHJl
dHVybiBtX3VzZXJTaGVldHMuZ2V0KCk7IH0KKworICAgIHZvaWQgYWRkU3R5bGVTaGVldENhbmRp
ZGF0ZU5vZGUoTm9kZSosIGJvb2wgY3JlYXRlZEJ5UGFyc2VyKTsKKyAgICB2b2lkIHJlbW92ZVN0
eWxlU2hlZXRDYW5kaWRhdGVOb2RlKE5vZGUqKTsKKworICAgIHZvaWQgY2xlYXJQYWdlVXNlclNo
ZWV0KCk7CisgICAgdm9pZCB1cGRhdGVQYWdlVXNlclNoZWV0KCk7CisgICAgdm9pZCBjbGVhclBh
Z2VHcm91cFVzZXJTaGVldHMoKTsKKyAgICB2b2lkIHVwZGF0ZVBhZ2VHcm91cFVzZXJTaGVldHMo
KTsKKworICAgIHZvaWQgYWRkVXNlclNoZWV0KFBhc3NSZWZQdHI8U3R5bGVTaGVldENvbnRlbnRz
PiB1c2VyU2hlZXQpOworCisgICAgYm9vbCBuZWVkc1VwZGF0ZUFjdGl2ZVN0eWxlc2hlZXRzT25T
dHlsZVJlY2FsYygpIHsgcmV0dXJuIG1fbmVlZHNVcGRhdGVBY3RpdmVTdHlsZXNoZWV0c09uU3R5
bGVSZWNhbGM7IH0KKworICAgIGVudW0gVXBkYXRlRmxhZyB7IEZ1bGxVcGRhdGUsIE9wdGltaXpl
ZFVwZGF0ZSB9OworICAgIGJvb2wgdXBkYXRlQWN0aXZlU3R5bGVTaGVldHMoVXBkYXRlRmxhZyk7
CisKKyAgICBTdHJpbmcgcHJlZmVycmVkU3R5bGVzaGVldFNldE5hbWUoKSBjb25zdCB7IHJldHVy
biBtX3ByZWZlcnJlZFN0eWxlc2hlZXRTZXROYW1lOyB9CisgICAgU3RyaW5nIHNlbGVjdGVkU3R5
bGVzaGVldFNldE5hbWUoKSBjb25zdCB7IHJldHVybiBtX3NlbGVjdGVkU3R5bGVzaGVldFNldE5h
bWU7IH0KKyAgICB2b2lkIHNldFByZWZlcnJlZFN0eWxlc2hlZXRTZXROYW1lKGNvbnN0IFN0cmlu
ZyYgbmFtZSkgeyBtX3ByZWZlcnJlZFN0eWxlc2hlZXRTZXROYW1lID0gbmFtZTsgfQorICAgIHZv
aWQgc2V0U2VsZWN0ZWRTdHlsZXNoZWV0U2V0TmFtZShjb25zdCBTdHJpbmcmIG5hbWUpIHsgbV9z
ZWxlY3RlZFN0eWxlc2hlZXRTZXROYW1lID0gbmFtZTsgfQorCisgICAgdm9pZCBhZGRQZW5kaW5n
U2hlZXQoKSB7IG1fcGVuZGluZ1N0eWxlc2hlZXRzKys7IH0KKyAgICBlbnVtIFJlbW92ZVBlbmRp
bmdTaGVldE5vdGlmaWNhdGlvblR5cGUgeworICAgICAgICBSZW1vdmVQZW5kaW5nU2hlZXROb3Rp
ZnlJbW1lZGlhdGVseSwKKyAgICAgICAgUmVtb3ZlUGVuZGluZ1NoZWV0Tm90aWZ5TGF0ZXIKKyAg
ICB9OworICAgIHZvaWQgcmVtb3ZlUGVuZGluZ1NoZWV0KFJlbW92ZVBlbmRpbmdTaGVldE5vdGlm
aWNhdGlvblR5cGUgPSBSZW1vdmVQZW5kaW5nU2hlZXROb3RpZnlJbW1lZGlhdGVseSk7CisKKyAg
ICBib29sIGhhc1BlbmRpbmdTaGVldHMoKSBjb25zdCB7IHJldHVybiBtX3BlbmRpbmdTdHlsZXNo
ZWV0cyA+IDA7IH0KKworICAgIGJvb2wgdXNlc1NpYmxpbmdSdWxlcygpIGNvbnN0IHsgcmV0dXJu
IG1fdXNlc1NpYmxpbmdSdWxlcyB8fCBtX3VzZXNTaWJsaW5nUnVsZXNPdmVycmlkZTsgfQorICAg
IHZvaWQgc2V0VXNlc1NpYmxpbmdSdWxlc092ZXJyaWRlKGJvb2wgYikgeyBtX3VzZXNTaWJsaW5n
UnVsZXNPdmVycmlkZSA9IGI7IH0KKyAgICBib29sIHVzZXNGaXJzdExpbmVSdWxlcygpIGNvbnN0
IHsgcmV0dXJuIG1fdXNlc0ZpcnN0TGluZVJ1bGVzOyB9CisgICAgYm9vbCB1c2VzRmlyc3RMZXR0
ZXJSdWxlcygpIGNvbnN0IHsgcmV0dXJuIG1fdXNlc0ZpcnN0TGV0dGVyUnVsZXM7IH0KKyAgICB2
b2lkIHNldFVzZXNGaXJzdExldHRlclJ1bGVzKGJvb2wgYikgeyBtX3VzZXNGaXJzdExldHRlclJ1
bGVzID0gYjsgfQorICAgIGJvb2wgdXNlc0JlZm9yZUFmdGVyUnVsZXMoKSBjb25zdCB7IHJldHVy
biBtX3VzZXNCZWZvcmVBZnRlclJ1bGVzIHx8IG1fdXNlc0JlZm9yZUFmdGVyUnVsZXNPdmVycmlk
ZTsgfQorICAgIHZvaWQgc2V0VXNlc0JlZm9yZUFmdGVyUnVsZXNPdmVycmlkZShib29sIGIpIHsg
bV91c2VzQmVmb3JlQWZ0ZXJSdWxlc092ZXJyaWRlID0gYjsgfQorICAgIGJvb2wgdXNlc1JlbVVu
aXRzKCkgY29uc3QgeyByZXR1cm4gbV91c2VzUmVtVW5pdHM7IH0KKyAgICB2b2lkIHNldFVzZXNS
ZW1Vbml0KGJvb2wgYikgeyBtX3VzZXNSZW1Vbml0cyA9IGI7IH0KKworICAgIHZvaWQgY29tYmlu
ZUNTU0ZlYXR1cmVGbGFncygpOworICAgIHZvaWQgcmVzZXRDU1NGZWF0dXJlRmxhZ3MoKTsKKwor
ICAgIHZvaWQgcmVwb3J0TWVtb3J5VXNhZ2UoTWVtb3J5T2JqZWN0SW5mbyopIGNvbnN0OworCitw
cml2YXRlOgorICAgIHZvaWQgY29sbGVjdEFjdGl2ZVN0eWxlU2hlZXRzKFZlY3RvcjxSZWZQdHI8
U3R5bGVTaGVldD4gPiYpOworICAgIGJvb2wgdGVzdEFkZGVkU3R5bGVTaGVldFJlcXVpcmVzU3R5
bGVSZWNhbGMoU3R5bGVTaGVldENvbnRlbnRzKik7CisgICAgdm9pZCBhbmFseXplU3R5bGVTaGVl
dENoYW5nZShVcGRhdGVGbGFnLCBjb25zdCBWZWN0b3I8UmVmUHRyPFN0eWxlU2hlZXQ+ID4mIG5l
d1N0eWxlc2hlZXRzLCBib29sJiByZXF1aXJlc1N0eWxlUmVzb2x2ZXJSZXNldCwgYm9vbCYgcmVx
dWlyZXNGdWxsU3R5bGVSZWNhbGMpOworCisgICAgRG9jdW1lbnQqIG1fZG9jdW1lbnQ7CisKKyAg
ICBSZWZQdHI8U3R5bGVTaGVldExpc3Q+IG1fYXV0aG9yU3R5bGVTaGVldHM7CisKKyAgICAvLyBU
cmFjayB0aGUgbnVtYmVyIG9mIGN1cnJlbnRseSBsb2FkaW5nIHRvcC1sZXZlbCBzdHlsZXNoZWV0
cyBuZWVkZWQgZm9yIHJlbmRlcmluZy4KKyAgICAvLyBTaGVldHMgbG9hZGVkIHVzaW5nIHRoZSBA
aW1wb3J0IGRpcmVjdGl2ZSBhcmUgbm90IGluY2x1ZGVkIGluIHRoaXMgY291bnQuCisgICAgLy8g
V2UgdXNlIHRoaXMgY291bnQgb2YgcGVuZGluZyBzaGVldHMgdG8gZGV0ZWN0IHdoZW4gd2UgY2Fu
IGJlZ2luIGF0dGFjaGluZworICAgIC8vIGVsZW1lbnRzIGFuZCB3aGVuIGl0IGlzIHNhZmUgdG8g
ZXhlY3V0ZSBzY3JpcHRzLgorICAgIGludCBtX3BlbmRpbmdTdHlsZXNoZWV0czsKKworICAgIFJl
ZlB0cjxDU1NTdHlsZVNoZWV0PiBtX3BhZ2VVc2VyU2hlZXQ7CisgICAgbXV0YWJsZSBPd25QdHI8
VmVjdG9yPFJlZlB0cjxDU1NTdHlsZVNoZWV0PiA+ID4gbV9wYWdlR3JvdXBVc2VyU2hlZXRzOwor
ICAgIE93blB0cjxWZWN0b3I8UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4gPiBtX3VzZXJTaGVldHM7
CisgICAgbXV0YWJsZSBib29sIG1fcGFnZUdyb3VwVXNlclNoZWV0Q2FjaGVWYWxpZDsKKworICAg
IGJvb2wgbV9oYWRBY3RpdmVMb2FkaW5nU3R5bGVzaGVldDsKKyAgICBib29sIG1fbmVlZHNVcGRh
dGVBY3RpdmVTdHlsZXNoZWV0c09uU3R5bGVSZWNhbGM7CisKKyAgICB0eXBlZGVmIExpc3RIYXNo
U2V0PE5vZGUqLCAzMj4gU3R5bGVTaGVldENhbmRpZGF0ZUxpc3RIYXNoU2V0OworICAgIFN0eWxl
U2hlZXRDYW5kaWRhdGVMaXN0SGFzaFNldCBtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2RlczsKKwor
ICAgIFN0cmluZyBtX3ByZWZlcnJlZFN0eWxlc2hlZXRTZXROYW1lOworICAgIFN0cmluZyBtX3Nl
bGVjdGVkU3R5bGVzaGVldFNldE5hbWU7CisKKyAgICBib29sIG1fdXNlc1NpYmxpbmdSdWxlczsK
KyAgICBib29sIG1fdXNlc1NpYmxpbmdSdWxlc092ZXJyaWRlOworICAgIGJvb2wgbV91c2VzRmly
c3RMaW5lUnVsZXM7CisgICAgYm9vbCBtX3VzZXNGaXJzdExldHRlclJ1bGVzOworICAgIGJvb2wg
bV91c2VzQmVmb3JlQWZ0ZXJSdWxlczsKKyAgICBib29sIG1fdXNlc0JlZm9yZUFmdGVyUnVsZXNP
dmVycmlkZTsKKyAgICBib29sIG1fdXNlc1JlbVVuaXRzOworfTsKKworfQorCisjZW5kaWYKKwpJ
bmRleDogU291cmNlL1dlYkNvcmUvZG9tL0VsZW1lbnQuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJDb3JlL2RvbS9FbGVtZW50LmNwcAkocmV2aXNpb24gMTI5MzAzKQorKysgU291cmNlL1dl
YkNvcmUvZG9tL0VsZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMTc5LDcgKzExNzksNyBA
QCB2b2lkIEVsZW1lbnQ6OnJlY2FsY1N0eWxlKFN0eWxlQ2hhbmdlIGNoCiAKICAgICAgICAgLy8g
SWYgInJlbSIgdW5pdHMgYXJlIHVzZWQgYW55d2hlcmUgaW4gdGhlIGRvY3VtZW50LCBhbmQgaWYg
dGhlIGRvY3VtZW50IGVsZW1lbnQncyBmb250IHNpemUgY2hhbmdlcywgdGhlbiBnbyBhaGVhZCBh
bmQgZm9yY2UgZm9udCB1cGRhdGluZwogICAgICAgICAvLyBhbGwgdGhlIHdheSBkb3duIHRoZSB0
cmVlLiBUaGlzIGlzIHNpbXBsZXIgdGhhbiBoYXZpbmcgdG8gbWFpbnRhaW4gYSBjYWNoZSBvZiBv
YmplY3RzIChhbmQgc3VjaCBmb250IHNpemUgY2hhbmdlcyBzaG91bGQgYmUgcmFyZSBhbnl3YXkp
LgotICAgICAgICBpZiAoZG9jdW1lbnQoKS0+dXNlc1JlbVVuaXRzKCkgJiYgZG9jdW1lbnQoKS0+
ZG9jdW1lbnRFbGVtZW50KCkgPT0gdGhpcyAmJiBjaCAhPSBOb0NoYW5nZSAmJiBjdXJyZW50U3R5
bGUgJiYgbmV3U3R5bGUgJiYgY3VycmVudFN0eWxlLT5mb250U2l6ZSgpICE9IG5ld1N0eWxlLT5m
b250U2l6ZSgpKSB7CisgICAgICAgIGlmIChkb2N1bWVudCgpLT5zdHlsZVNoZWV0Q29sbGVjdGlv
bigpLT51c2VzUmVtVW5pdHMoKSAmJiBkb2N1bWVudCgpLT5kb2N1bWVudEVsZW1lbnQoKSA9PSB0
aGlzICYmIGNoICE9IE5vQ2hhbmdlICYmIGN1cnJlbnRTdHlsZSAmJiBuZXdTdHlsZSAmJiBjdXJy
ZW50U3R5bGUtPmZvbnRTaXplKCkgIT0gbmV3U3R5bGUtPmZvbnRTaXplKCkpIHsKICAgICAgICAg
ICAgIC8vIENhY2hlZCBSZW5kZXJTdHlsZXMgbWF5IGRlcGVuZCBvbiB0aGUgcmVtIHVuaXRzLgog
ICAgICAgICAgICAgZG9jdW1lbnQoKS0+c3R5bGVSZXNvbHZlcigpLT5pbnZhbGlkYXRlTWF0Y2hl
ZFByb3BlcnRpZXNDYWNoZSgpOwogICAgICAgICAgICAgY2hhbmdlID0gRm9yY2U7CkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9kb20vUHJvY2Vzc2luZ0luc3RydWN0aW9uLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViQ29yZS9kb20vUHJvY2Vzc2luZ0luc3RydWN0aW9uLmNwcAkocmV2aXNpb24g
MTI5MzAzKQorKysgU291cmNlL1dlYkNvcmUvZG9tL1Byb2Nlc3NpbmdJbnN0cnVjdGlvbi5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTIzLDkgKzIzLDEwIEBACiAKICNpbmNsdWRlICJDU1NTdHlsZVNo
ZWV0LmgiCiAjaW5jbHVkZSAiQ2FjaGVkQ1NTU3R5bGVTaGVldC5oIgorI2luY2x1ZGUgIkNhY2hl
ZFJlc291cmNlTG9hZGVyLmgiCiAjaW5jbHVkZSAiQ2FjaGVkWFNMU3R5bGVTaGVldC5oIgogI2lu
Y2x1ZGUgIkRvY3VtZW50LmgiCi0jaW5jbHVkZSAiQ2FjaGVkUmVzb3VyY2VMb2FkZXIuaCIKKyNp
bmNsdWRlICJEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmgiCiAjaW5jbHVkZSAiRXhjZXB0
aW9uQ29kZS5oIgogI2luY2x1ZGUgIkZyYW1lLmgiCiAjaW5jbHVkZSAiRnJhbWVMb2FkZXIuaCIK
QEAgLTY1LDcgKzY2LDcgQEAgUHJvY2Vzc2luZ0luc3RydWN0aW9uOjp+UHJvY2Vzc2luZ0luc3Ry
dQogICAgICAgICBtX2NhY2hlZFNoZWV0LT5yZW1vdmVDbGllbnQodGhpcyk7CiAKICAgICBpZiAo
aW5Eb2N1bWVudCgpKQotICAgICAgICBkb2N1bWVudCgpLT5yZW1vdmVTdHlsZVNoZWV0Q2FuZGlk
YXRlTm9kZSh0aGlzKTsKKyAgICAgICAgZG9jdW1lbnQoKS0+c3R5bGVTaGVldENvbGxlY3Rpb24o
KS0+cmVtb3ZlU3R5bGVTaGVldENhbmRpZGF0ZU5vZGUodGhpcyk7CiB9CiAKIHZvaWQgUHJvY2Vz
c2luZ0luc3RydWN0aW9uOjpzZXREYXRhKGNvbnN0IFN0cmluZyYgZGF0YSwgRXhjZXB0aW9uQ29k
ZSYpCkBAIC0xNjAsNyArMTYxLDcgQEAgdm9pZCBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb246OmNoZWNr
U3R5bGVTaAogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIAogICAgICAgICAg
ICAgbV9sb2FkaW5nID0gdHJ1ZTsKLSAgICAgICAgICAgIGRvY3VtZW50KCktPmFkZFBlbmRpbmdT
aGVldCgpOworICAgICAgICAgICAgZG9jdW1lbnQoKS0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+
YWRkUGVuZGluZ1NoZWV0KCk7CiAgICAgICAgICAgICAKICAgICAgICAgICAgIFJlc291cmNlUmVx
dWVzdCByZXF1ZXN0KGRvY3VtZW50KCktPmNvbXBsZXRlVVJMKGhyZWYpKTsKICNpZiBFTkFCTEUo
WFNMVCkKQEAgLTE4MCw3ICsxODEsNyBAQCB2b2lkIFByb2Nlc3NpbmdJbnN0cnVjdGlvbjo6Y2hl
Y2tTdHlsZVNoCiAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBUaGUgcmVx
dWVzdCBtYXkgaGF2ZSBiZWVuIGRlbmllZCBpZiAoZm9yIGV4YW1wbGUpIHRoZSBzdHlsZXNoZWV0
IGlzIGxvY2FsIGFuZCB0aGUgZG9jdW1lbnQgaXMgcmVtb3RlLgogICAgICAgICAgICAgICAgIG1f
bG9hZGluZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGRvY3VtZW50KCktPnJlbW92ZVBlbmRp
bmdTaGVldCgpOworICAgICAgICAgICAgICAgIGRvY3VtZW50KCktPnN0eWxlU2hlZXRDb2xsZWN0
aW9uKCktPnJlbW92ZVBlbmRpbmdTaGVldCgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAg
ICAgfQpAQCAtMTk4LDcgKzE5OSw3IEBAIGJvb2wgUHJvY2Vzc2luZ0luc3RydWN0aW9uOjppc0xv
YWRpbmcoKSAKIGJvb2wgUHJvY2Vzc2luZ0luc3RydWN0aW9uOjpzaGVldExvYWRlZCgpCiB7CiAg
ICAgaWYgKCFpc0xvYWRpbmcoKSkgewotICAgICAgICBkb2N1bWVudCgpLT5yZW1vdmVQZW5kaW5n
U2hlZXQoKTsKKyAgICAgICAgZG9jdW1lbnQoKS0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+cmVt
b3ZlUGVuZGluZ1NoZWV0KCk7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICByZXR1
cm4gZmFsc2U7CkBAIC0yOTMsNyArMjk0LDcgQEAgTm9kZTo6SW5zZXJ0aW9uTm90aWZpY2F0aW9u
UmVxdWVzdCBQcm9jZQogICAgIE5vZGU6Omluc2VydGVkSW50byhpbnNlcnRpb25Qb2ludCk7CiAg
ICAgaWYgKCFpbnNlcnRpb25Qb2ludC0+aW5Eb2N1bWVudCgpKQogICAgICAgICByZXR1cm4gSW5z
ZXJ0aW9uRG9uZTsKLSAgICBkb2N1bWVudCgpLT5hZGRTdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZSh0
aGlzLCBtX2NyZWF0ZWRCeVBhcnNlcik7CisgICAgZG9jdW1lbnQoKS0+c3R5bGVTaGVldENvbGxl
Y3Rpb24oKS0+YWRkU3R5bGVTaGVldENhbmRpZGF0ZU5vZGUodGhpcywgbV9jcmVhdGVkQnlQYXJz
ZXIpOwogICAgIGNoZWNrU3R5bGVTaGVldCgpOwogICAgIHJldHVybiBJbnNlcnRpb25Eb25lOwog
fQpAQCAtMzA0LDcgKzMwNSw3IEBAIHZvaWQgUHJvY2Vzc2luZ0luc3RydWN0aW9uOjpyZW1vdmVk
RnJvbSgKICAgICBpZiAoIWluc2VydGlvblBvaW50LT5pbkRvY3VtZW50KCkpCiAgICAgICAgIHJl
dHVybjsKICAgICAKLSAgICBkb2N1bWVudCgpLT5yZW1vdmVTdHlsZVNoZWV0Q2FuZGlkYXRlTm9k
ZSh0aGlzKTsKKyAgICBkb2N1bWVudCgpLT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpLT5yZW1vdmVT
dHlsZVNoZWV0Q2FuZGlkYXRlTm9kZSh0aGlzKTsKIAogICAgIGlmIChtX3NoZWV0KSB7CiAgICAg
ICAgIEFTU0VSVChtX3NoZWV0LT5vd25lck5vZGUoKSA9PSB0aGlzKTsKSW5kZXg6IFNvdXJjZS9X
ZWJDb3JlL2RvbS9TdHlsZUVsZW1lbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3Jl
L2RvbS9TdHlsZUVsZW1lbnQuY3BwCShyZXZpc2lvbiAxMjkzMDMpCisrKyBTb3VyY2UvV2ViQ29y
ZS9kb20vU3R5bGVFbGVtZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjQsNiArMjQsNyBAQAog
I2luY2x1ZGUgIkF0dHJpYnV0ZS5oIgogI2luY2x1ZGUgIkNvbnRlbnRTZWN1cml0eVBvbGljeS5o
IgogI2luY2x1ZGUgIkRvY3VtZW50LmgiCisjaW5jbHVkZSAiRG9jdW1lbnRTdHlsZVNoZWV0Q29s
bGVjdGlvbi5oIgogI2luY2x1ZGUgIkVsZW1lbnQuaCIKICNpbmNsdWRlICJNZWRpYUxpc3QuaCIK
ICNpbmNsdWRlICJNZWRpYVF1ZXJ5RXZhbHVhdG9yLmgiCkBAIC02Myw3ICs2NCw3IEBAIHZvaWQg
U3R5bGVFbGVtZW50OjppbnNlcnRlZEludG9Eb2N1bWVudCgKIHsKICAgICBBU1NFUlQoZG9jdW1l
bnQpOwogICAgIEFTU0VSVChlbGVtZW50KTsKLSAgICBkb2N1bWVudC0+YWRkU3R5bGVTaGVldENh
bmRpZGF0ZU5vZGUoZWxlbWVudCwgbV9jcmVhdGVkQnlQYXJzZXIpOworICAgIGRvY3VtZW50LT5z
dHlsZVNoZWV0Q29sbGVjdGlvbigpLT5hZGRTdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZShlbGVtZW50
LCBtX2NyZWF0ZWRCeVBhcnNlcik7CiAgICAgaWYgKG1fY3JlYXRlZEJ5UGFyc2VyKQogICAgICAg
ICByZXR1cm47CiAKQEAgLTc0LDcgKzc1LDcgQEAgdm9pZCBTdHlsZUVsZW1lbnQ6OnJlbW92ZWRG
cm9tRG9jdW1lbnQoRAogewogICAgIEFTU0VSVChkb2N1bWVudCk7CiAgICAgQVNTRVJUKGVsZW1l
bnQpOwotICAgIGRvY3VtZW50LT5yZW1vdmVTdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZShlbGVtZW50
KTsKKyAgICBkb2N1bWVudC0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+cmVtb3ZlU3R5bGVTaGVl
dENhbmRpZGF0ZU5vZGUoZWxlbWVudCk7CiAKICAgICBpZiAobV9zaGVldCkKICAgICAgICAgY2xl
YXJTaGVldCgpOwpAQCAtOTAsNyArOTEsNyBAQCB2b2lkIFN0eWxlRWxlbWVudDo6Y2xlYXJEb2N1
bWVudERhdGEoRG9jCiAgICAgICAgIG1fc2hlZXQtPmNsZWFyT3duZXJOb2RlKCk7CiAKICAgICBp
ZiAoZWxlbWVudC0+aW5Eb2N1bWVudCgpKQotICAgICAgICBkb2N1bWVudC0+cmVtb3ZlU3R5bGVT
aGVldENhbmRpZGF0ZU5vZGUoZWxlbWVudCk7CisgICAgICAgIGRvY3VtZW50LT5zdHlsZVNoZWV0
Q29sbGVjdGlvbigpLT5yZW1vdmVTdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZShlbGVtZW50KTsKIH0K
IAogdm9pZCBTdHlsZUVsZW1lbnQ6OmNoaWxkcmVuQ2hhbmdlZChFbGVtZW50KiBlbGVtZW50KQpA
QCAtMTUyLDcgKzE1Myw3IEBAIHZvaWQgU3R5bGVFbGVtZW50OjpjcmVhdGVTaGVldChFbGVtZW50
KiAKICAgICBEb2N1bWVudCogZG9jdW1lbnQgPSBlLT5kb2N1bWVudCgpOwogICAgIGlmIChtX3No
ZWV0KSB7CiAgICAgICAgIGlmIChtX3NoZWV0LT5pc0xvYWRpbmcoKSkKLSAgICAgICAgICAgIGRv
Y3VtZW50LT5yZW1vdmVQZW5kaW5nU2hlZXQoKTsKKyAgICAgICAgICAgIGRvY3VtZW50LT5zdHls
ZVNoZWV0Q29sbGVjdGlvbigpLT5yZW1vdmVQZW5kaW5nU2hlZXQoKTsKICAgICAgICAgY2xlYXJT
aGVldCgpOwogICAgIH0KIApAQCAtMTY4LDcgKzE2OSw3IEBAIHZvaWQgU3R5bGVFbGVtZW50Ojpj
cmVhdGVTaGVldChFbGVtZW50KiAKICAgICAgICAgTWVkaWFRdWVyeUV2YWx1YXRvciBzY3JlZW5F
dmFsKCJzY3JlZW4iLCB0cnVlKTsKICAgICAgICAgTWVkaWFRdWVyeUV2YWx1YXRvciBwcmludEV2
YWwoInByaW50IiwgdHJ1ZSk7CiAgICAgICAgIGlmIChzY3JlZW5FdmFsLmV2YWwobWVkaWFRdWVy
aWVzLmdldCgpKSB8fCBwcmludEV2YWwuZXZhbChtZWRpYVF1ZXJpZXMuZ2V0KCkpKSB7Ci0gICAg
ICAgICAgICBkb2N1bWVudC0+YWRkUGVuZGluZ1NoZWV0KCk7CisgICAgICAgICAgICBkb2N1bWVu
dC0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+YWRkUGVuZGluZ1NoZWV0KCk7CiAgICAgICAgICAg
ICBtX2xvYWRpbmcgPSB0cnVlOwogCiAgICAgICAgICAgICBtX3NoZWV0ID0gQ1NTU3R5bGVTaGVl
dDo6Y3JlYXRlSW5saW5lKGUsIEtVUkwoKSwgZG9jdW1lbnQtPmlucHV0RW5jb2RpbmcoKSk7CkBA
IC0xOTcsMTQgKzE5OCwxNCBAQCBib29sIFN0eWxlRWxlbWVudDo6c2hlZXRMb2FkZWQoRG9jdW1l
bnQqCiAgICAgaWYgKGlzTG9hZGluZygpKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICBk
b2N1bWVudC0+cmVtb3ZlUGVuZGluZ1NoZWV0KCk7CisgICAgZG9jdW1lbnQtPnN0eWxlU2hlZXRD
b2xsZWN0aW9uKCktPnJlbW92ZVBlbmRpbmdTaGVldCgpOwogICAgIHJldHVybiB0cnVlOwogfQog
CiB2b2lkIFN0eWxlRWxlbWVudDo6c3RhcnRMb2FkaW5nRHluYW1pY1NoZWV0KERvY3VtZW50KiBk
b2N1bWVudCkKIHsKICAgICBBU1NFUlQoZG9jdW1lbnQpOwotICAgIGRvY3VtZW50LT5hZGRQZW5k
aW5nU2hlZXQoKTsKKyAgICBkb2N1bWVudC0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+YWRkUGVu
ZGluZ1NoZWV0KCk7CiB9CiAKIH0KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2h0bWwvSFRNTExpbmtF
bGVtZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxMaW5rRWxl
bWVudC5jcHAJKHJldmlzaW9uIDEyOTMwMykKKysrIFNvdXJjZS9XZWJDb3JlL2h0bWwvSFRNTExp
bmtFbGVtZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUg
IkNhY2hlZFJlc291cmNlLmgiCiAjaW5jbHVkZSAiQ2FjaGVkUmVzb3VyY2VMb2FkZXIuaCIKICNp
bmNsdWRlICJEb2N1bWVudC5oIgorI2luY2x1ZGUgIkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rp
b24uaCIKICNpbmNsdWRlICJFdmVudFNlbmRlci5oIgogI2luY2x1ZGUgIkZyYW1lLmgiCiAjaW5j
bHVkZSAiRnJhbWVMb2FkZXIuaCIKQEAgLTg3LDcgKzg4LDcgQEAgSFRNTExpbmtFbGVtZW50Ojp+
SFRNTExpbmtFbGVtZW50KCkKICAgICAgICAgbV9jYWNoZWRTaGVldC0+cmVtb3ZlQ2xpZW50KHRo
aXMpOwogCiAgICAgaWYgKGluRG9jdW1lbnQoKSkKLSAgICAgICAgZG9jdW1lbnQoKS0+cmVtb3Zl
U3R5bGVTaGVldENhbmRpZGF0ZU5vZGUodGhpcyk7CisgICAgICAgIGRvY3VtZW50KCktPnN0eWxl
U2hlZXRDb2xsZWN0aW9uKCktPnJlbW92ZVN0eWxlU2hlZXRDYW5kaWRhdGVOb2RlKHRoaXMpOwog
CiAgICAgbGlua0xvYWRFdmVudFNlbmRlcigpLmNhbmNlbEV2ZW50KHRoaXMpOwogfQpAQCAtMjU0
LDcgKzI1NSw3IEBAIE5vZGU6Okluc2VydGlvbk5vdGlmaWNhdGlvblJlcXVlc3QgSFRNTEwKICAg
ICBpZiAobV9pc0luU2hhZG93VHJlZSkKICAgICAgICAgcmV0dXJuIEluc2VydGlvbkRvbmU7CiAK
LSAgICBkb2N1bWVudCgpLT5hZGRTdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZSh0aGlzLCBtX2NyZWF0
ZWRCeVBhcnNlcik7CisgICAgZG9jdW1lbnQoKS0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+YWRk
U3R5bGVTaGVldENhbmRpZGF0ZU5vZGUodGhpcywgbV9jcmVhdGVkQnlQYXJzZXIpOwogCiAgICAg
cHJvY2VzcygpOwogICAgIHJldHVybiBJbnNlcnRpb25Eb25lOwpAQCAtMjcyLDcgKzI3Myw3IEBA
IHZvaWQgSFRNTExpbmtFbGVtZW50OjpyZW1vdmVkRnJvbShDb250YWkKICAgICAgICAgQVNTRVJU
KCFtX3NoZWV0KTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBkb2N1bWVudCgpLT5yZW1v
dmVTdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZSh0aGlzKTsKKyAgICBkb2N1bWVudCgpLT5zdHlsZVNo
ZWV0Q29sbGVjdGlvbigpLT5yZW1vdmVTdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZSh0aGlzKTsKIAog
ICAgIGlmIChtX3NoZWV0KQogICAgICAgICBjbGVhclNoZWV0KCk7CkBAIC00NTUsNyArNDU2LDcg
QEAgdm9pZCBIVE1MTGlua0VsZW1lbnQ6OmFkZFBlbmRpbmdTaGVldChQZQogCiAgICAgaWYgKG1f
cGVuZGluZ1NoZWV0VHlwZSA9PSBOb25CbG9ja2luZykKICAgICAgICAgcmV0dXJuOwotICAgIGRv
Y3VtZW50KCktPmFkZFBlbmRpbmdTaGVldCgpOworICAgIGRvY3VtZW50KCktPnN0eWxlU2hlZXRD
b2xsZWN0aW9uKCktPmFkZFBlbmRpbmdTaGVldCgpOwogfQogCiB2b2lkIEhUTUxMaW5rRWxlbWVu
dDo6cmVtb3ZlUGVuZGluZ1NoZWV0KFJlbW92ZVBlbmRpbmdTaGVldE5vdGlmaWNhdGlvblR5cGUg
bm90aWZpY2F0aW9uKQpAQCAtNDcxLDEwICs0NzIsMTAgQEAgdm9pZCBIVE1MTGlua0VsZW1lbnQ6
OnJlbW92ZVBlbmRpbmdTaGVldAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgZG9jdW1l
bnQoKS0+cmVtb3ZlUGVuZGluZ1NoZWV0KAorICAgIGRvY3VtZW50KCktPnN0eWxlU2hlZXRDb2xs
ZWN0aW9uKCktPnJlbW92ZVBlbmRpbmdTaGVldCgKICAgICAgICAgbm90aWZpY2F0aW9uID09IFJl
bW92ZVBlbmRpbmdTaGVldE5vdGlmeUltbWVkaWF0ZWx5Ci0gICAgICAgID8gRG9jdW1lbnQ6OlJl
bW92ZVBlbmRpbmdTaGVldE5vdGlmeUltbWVkaWF0ZWx5Ci0gICAgICAgIDogRG9jdW1lbnQ6OlJl
bW92ZVBlbmRpbmdTaGVldE5vdGlmeUxhdGVyKTsKKyAgICAgICAgPyBEb2N1bWVudFN0eWxlU2hl
ZXRDb2xsZWN0aW9uOjpSZW1vdmVQZW5kaW5nU2hlZXROb3RpZnlJbW1lZGlhdGVseQorICAgICAg
ICA6IERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OlJlbW92ZVBlbmRpbmdTaGVldE5vdGlm
eUxhdGVyKTsKIH0KIAogRE9NU2V0dGFibGVUb2tlbkxpc3QqIEhUTUxMaW5rRWxlbWVudDo6c2l6
ZXMoKSBjb25zdApJbmRleDogU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MUXVvdGVFbGVtZW50LmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxRdW90ZUVsZW1lbnQuY3Bw
CShyZXZpc2lvbiAxMjkzMDMpCisrKyBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxRdW90ZUVsZW1l
bnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSAiSFRNTFF1
b3RlRWxlbWVudC5oIgogCiAjaW5jbHVkZSAiRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJEb2N1bWVu
dFN0eWxlU2hlZXRDb2xsZWN0aW9uLmgiCiAjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCiAKIG5hbWVz
cGFjZSBXZWJDb3JlIHsKQEAgLTQ0LDcgKzQ1LDcgQEAgUGFzc1JlZlB0cjxIVE1MUXVvdGVFbGVt
ZW50PiBIVE1MUXVvdGVFbAogTm9kZTo6SW5zZXJ0aW9uTm90aWZpY2F0aW9uUmVxdWVzdCBIVE1M
UXVvdGVFbGVtZW50OjppbnNlcnRlZEludG8oQ29udGFpbmVyTm9kZSogaW5zZXJ0aW9uUG9pbnQp
CiB7CiAgICAgaWYgKGhhc1RhZ05hbWUocVRhZykpCi0gICAgICAgIGRvY3VtZW50KCktPnNldFVz
ZXNCZWZvcmVBZnRlclJ1bGVzKHRydWUpOworICAgICAgICBkb2N1bWVudCgpLT5zdHlsZVNoZWV0
Q29sbGVjdGlvbigpLT5zZXRVc2VzQmVmb3JlQWZ0ZXJSdWxlc092ZXJyaWRlKHRydWUpOwogCiAg
ICAgcmV0dXJuIEhUTUxFbGVtZW50OjppbnNlcnRlZEludG8oaW5zZXJ0aW9uUG9pbnQpOwogfQpJ
bmRleDogU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MVmlld1NvdXJjZURvY3VtZW50LmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxWaWV3U291cmNlRG9jdW1lbnQuY3Bw
CShyZXZpc2lvbiAxMjkzMDMpCisrKyBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxWaWV3U291cmNl
RG9jdW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNyw2ICsyNyw3IEBACiAKICNpbmNsdWRl
ICJBdHRyaWJ1dGUuaCIKICNpbmNsdWRlICJET01JbXBsZW1lbnRhdGlvbi5oIgorI2luY2x1ZGUg
IkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uaCIKICNpbmNsdWRlICJIVE1MQW5jaG9yRWxl
bWVudC5oIgogI2luY2x1ZGUgIkhUTUxCUkVsZW1lbnQuaCIKICNpbmNsdWRlICJIVE1MQmFzZUVs
ZW1lbnQuaCIKQEAgLTUyLDcgKzUzLDcgQEAgSFRNTFZpZXdTb3VyY2VEb2N1bWVudDo6SFRNTFZp
ZXdTb3VyY2VEbwogICAgIDogSFRNTERvY3VtZW50KGZyYW1lLCB1cmwpCiAgICAgLCBtX3R5cGUo
bWltZVR5cGUpCiB7Ci0gICAgc2V0VXNlc0JlZm9yZUFmdGVyUnVsZXModHJ1ZSk7CisgICAgc3R5
bGVTaGVldENvbGxlY3Rpb24oKS0+c2V0VXNlc0JlZm9yZUFmdGVyUnVsZXNPdmVycmlkZSh0cnVl
KTsKICAgICBzZXRJc1ZpZXdTb3VyY2UodHJ1ZSk7CiAKICAgICBzZXRDb21wYXRpYmlsaXR5TW9k
ZShRdWlya3NNb2RlKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL21hdGhtbC9NYXRoTUxNYXRoRWxl
bWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvbWF0aG1sL01hdGhNTE1hdGhF
bGVtZW50LmNwcAkocmV2aXNpb24gMTI5MzAzKQorKysgU291cmNlL1dlYkNvcmUvbWF0aG1sL01h
dGhNTE1hdGhFbGVtZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDcsNyArNDcsNyBAQCBOb2Rl
OjpJbnNlcnRpb25Ob3RpZmljYXRpb25SZXF1ZXN0IE1hdGhNCiB7CiAgICAgLy8gVGhlcmUgYXJl
IHNpYmxpbmcgcnVsZXMgaW4gdGhlIE1hdGhNTCBkZWZhdWx0IHN0eWxlLgogICAgIGlmIChpbnNl
cnRpb25Qb2ludC0+aW5Eb2N1bWVudCgpKQotICAgICAgICBkb2N1bWVudCgpLT5zZXRVc2VzU2li
bGluZ1J1bGVzKHRydWUpOworICAgICAgICBkb2N1bWVudCgpLT5zdHlsZVNoZWV0Q29sbGVjdGlv
bigpLT5zZXRVc2VzU2libGluZ1J1bGVzT3ZlcnJpZGUodHJ1ZSk7CiAgICAgcmV0dXJuIE1hdGhN
TElubGluZUNvbnRhaW5lckVsZW1lbnQ6Omluc2VydGVkSW50byhpbnNlcnRpb25Qb2ludCk7CiB9
CiAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BhZ2UvUGFnZS5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvcGFnZS9QYWdlLmNwcAkocmV2aXNpb24gMTI5MzAzKQorKysgU291cmNlL1dl
YkNvcmUvcGFnZS9QYWdlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjksNiArMjksNyBAQAogI2lu
Y2x1ZGUgIkNvbnRleHRNZW51Q29udHJvbGxlci5oIgogI2luY2x1ZGUgIkRPTVdpbmRvdy5oIgog
I2luY2x1ZGUgIkRvY3VtZW50TWFya2VyQ29udHJvbGxlci5oIgorI2luY2x1ZGUgIkRvY3VtZW50
U3R5bGVTaGVldENvbGxlY3Rpb24uaCIKICNpbmNsdWRlICJEcmFnQ29udHJvbGxlci5oIgogI2lu
Y2x1ZGUgIkVkaXRvckNsaWVudC5oIgogI2luY2x1ZGUgIkV2ZW50LmgiCkBAIC04MzgsNyArODM5
LDcgQEAgdm9pZCBQYWdlOjp1c2VyU3R5bGVTaGVldExvY2F0aW9uQ2hhbmdlZAogCiAgICAgZm9y
IChGcmFtZSogZnJhbWUgPSBtYWluRnJhbWUoKTsgZnJhbWU7IGZyYW1lID0gZnJhbWUtPnRyZWUo
KS0+dHJhdmVyc2VOZXh0KCkpIHsKICAgICAgICAgaWYgKGZyYW1lLT5kb2N1bWVudCgpKQotICAg
ICAgICAgICAgZnJhbWUtPmRvY3VtZW50KCktPnVwZGF0ZVBhZ2VVc2VyU2hlZXQoKTsKKyAgICAg
ICAgICAgIGZyYW1lLT5kb2N1bWVudCgpLT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpLT51cGRhdGVQ
YWdlVXNlclNoZWV0KCk7CiAgICAgfQogfQogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wYWdlL1Bh
Z2VHcm91cC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGFnZS9QYWdlR3JvdXAu
Y3BwCShyZXZpc2lvbiAxMjkzMDMpCisrKyBTb3VyY2UvV2ViQ29yZS9wYWdlL1BhZ2VHcm91cC5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlICJDaHJvbWUuaCIK
ICNpbmNsdWRlICJDaHJvbWVDbGllbnQuaCIKICNpbmNsdWRlICJEb2N1bWVudC5oIgorI2luY2x1
ZGUgIkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uaCIKICNpbmNsdWRlICJGcmFtZS5oIgog
I2luY2x1ZGUgIkdyb3VwU2V0dGluZ3MuaCIKICNpbmNsdWRlICJQYWdlLmgiCkBAIC0zOTEsNyAr
MzkyLDcgQEAgdm9pZCBQYWdlR3JvdXA6OnJlc2V0VXNlclN0eWxlQ2FjaGVJbkFsbAogICAgIEhh
c2hTZXQ8UGFnZSo+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBtX3BhZ2VzLmVuZCgpOwogICAgIGZv
ciAoSGFzaFNldDxQYWdlKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9wYWdlcy5iZWdpbigpOyBp
dCAhPSBlbmQ7ICsraXQpIHsKICAgICAgICAgZm9yIChGcmFtZSogZnJhbWUgPSAoKml0KS0+bWFp
bkZyYW1lKCk7IGZyYW1lOyBmcmFtZSA9IGZyYW1lLT50cmVlKCktPnRyYXZlcnNlTmV4dCgpKQot
ICAgICAgICAgICAgZnJhbWUtPmRvY3VtZW50KCktPnVwZGF0ZVBhZ2VHcm91cFVzZXJTaGVldHMo
KTsKKyAgICAgICAgICAgIGZyYW1lLT5kb2N1bWVudCgpLT5zdHlsZVNoZWV0Q29sbGVjdGlvbigp
LT51cGRhdGVQYWdlR3JvdXBVc2VyU2hlZXRzKCk7CiAgICAgfQogfQogCkluZGV4OiBTb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQlIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJD
b3JlL3JlbmRlcmluZy9SZW5kZXJCUi5jcHAJKHJldmlzaW9uIDEyOTMwMykKKysrIFNvdXJjZS9X
ZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCUi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQwLDcgKzQw
LDcgQEAgUmVuZGVyQlI6On5SZW5kZXJCUigpCiAKIGludCBSZW5kZXJCUjo6bGluZUhlaWdodChi
b29sIGZpcnN0TGluZSkgY29uc3QKIHsKLSAgICBpZiAoZmlyc3RMaW5lICYmIGRvY3VtZW50KCkt
PnVzZXNGaXJzdExpbmVSdWxlcygpKSB7CisgICAgaWYgKGZpcnN0TGluZSAmJiBkb2N1bWVudCgp
LT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpLT51c2VzRmlyc3RMaW5lUnVsZXMoKSkgewogICAgICAg
ICBSZW5kZXJTdHlsZSogcyA9IHN0eWxlKGZpcnN0TGluZSk7CiAgICAgICAgIGlmIChzICE9IHN0
eWxlKCkpCiAgICAgICAgICAgICByZXR1cm4gcy0+Y29tcHV0ZWRMaW5lSGVpZ2h0KHZpZXcoKSk7
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5jcHAJKHJldmlzaW9u
IDEyOTMwMykKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTM0Nyw3ICszNDcsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjpzdHlsZURp
ZENoYW5nZShTdHlsZURpCiAgICAgbV9saW5lSGVpZ2h0ID0gLTE7CiAKICAgICAvLyBVcGRhdGUg
cHNldWRvcyBmb3IgOmJlZm9yZSBhbmQgOmFmdGVyIG5vdy4KLSAgICBpZiAoIWlzQW5vbnltb3Vz
KCkgJiYgZG9jdW1lbnQoKS0+dXNlc0JlZm9yZUFmdGVyUnVsZXMoKSAmJiBjYW5IYXZlR2VuZXJh
dGVkQ2hpbGRyZW4oKSkgeworICAgIGlmICghaXNBbm9ueW1vdXMoKSAmJiBkb2N1bWVudCgpLT5z
dHlsZVNoZWV0Q29sbGVjdGlvbigpLT51c2VzQmVmb3JlQWZ0ZXJSdWxlcygpICYmIGNhbkhhdmVH
ZW5lcmF0ZWRDaGlsZHJlbigpKSB7CiAgICAgICAgIHVwZGF0ZUJlZm9yZUFmdGVyQ29udGVudChC
RUZPUkUpOwogICAgICAgICB1cGRhdGVCZWZvcmVBZnRlckNvbnRlbnQoQUZURVIpOwogICAgIH0K
QEAgLTYwMiw3ICs2MDIsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjpzcGxpdEJsb2NrcyhSZW5kZXJC
bG9jCiAgICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGN1cnIgPSB0b1JlbmRlckJveE1vZGVsT2Jq
ZWN0KHBhcmVudCgpKTsKICAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogY3VyckNoaWxkID0gdGhp
czsKICAgICBSZW5kZXJPYmplY3QqIGN1cnJDaGlsZE5leHRTaWJsaW5nID0gY3VyckNoaWxkLT5u
ZXh0U2libGluZygpOwotICAgIGJvb2wgZG9jdW1lbnRVc2VzQmVmb3JlQWZ0ZXJSdWxlcyA9IGRv
Y3VtZW50KCktPnVzZXNCZWZvcmVBZnRlclJ1bGVzKCk7IAorICAgIGJvb2wgZG9jdW1lbnRVc2Vz
QmVmb3JlQWZ0ZXJSdWxlcyA9IGRvY3VtZW50KCktPnN0eWxlU2hlZXRDb2xsZWN0aW9uKCktPnVz
ZXNCZWZvcmVBZnRlclJ1bGVzKCk7CiAKICAgICAvLyBOb3RlOiB8dGhpc3wgY2FuIGJlIGRlc3Ry
b3llZCBpbnNpZGUgdGhpcyBsb29wIGlmIGl0IGlzIGFuIGVtcHR5IGFub255bW91cwogICAgIC8v
IGJsb2NrIGFuZCB3ZSB0cnkgdG8gY2FsbCB1cGRhdGVCZWZvcmVBZnRlckNvbnRlbnQgaW5zaWRl
IHdoaWNoIHJlbW92ZXMgdGhlCkBAIC04NzcsNyArODc3LDcgQEAgdm9pZCBSZW5kZXJCbG9jazo6
YWRkQ2hpbGRJZ25vcmluZ0Fub255bQogICAgICAgICAgICAgLy8gY29udGVudCBnZXRzIHByb3Bl
cmx5IGRlc3Ryb3llZC4KICAgICAgICAgICAgIGJvb2wgaXNGaXJzdENoaWxkID0gKGJlZm9yZUNo
aWxkID09IGZpcnN0Q2hpbGQoKSk7CiAgICAgICAgICAgICBib29sIGlzTGFzdENoaWxkID0gKGJl
Zm9yZUNoaWxkID09IGxhc3RDaGlsZCgpKTsKLSAgICAgICAgICAgIGlmIChkb2N1bWVudCgpLT51
c2VzQmVmb3JlQWZ0ZXJSdWxlcygpKQorICAgICAgICAgICAgaWYgKGRvY3VtZW50KCktPnN0eWxl
U2hlZXRDb2xsZWN0aW9uKCktPnVzZXNCZWZvcmVBZnRlclJ1bGVzKCkpCiAgICAgICAgICAgICAg
ICAgY2hpbGRyZW4oKS0+dXBkYXRlQmVmb3JlQWZ0ZXJDb250ZW50KHRoaXMsIEFGVEVSKTsKICAg
ICAgICAgICAgIGlmIChpc0xhc3RDaGlsZCAmJiBiZWZvcmVDaGlsZCAhPSBsYXN0Q2hpbGQoKSkg
ewogICAgICAgICAgICAgICAgIC8vIFdlIGRlc3Ryb3llZCB0aGUgbGFzdCBjaGlsZCwgc28gbm93
IHdlIG5lZWQgdG8gdXBkYXRlIG91ciBpbnNlcnRpb24KQEAgLTYxNTMsNyArNjE1Myw3IEBAIExh
eW91dFVuaXQgUmVuZGVyQmxvY2s6OmxpbmVIZWlnaHQoYm9vbCAKICAgICBpZiAoaXNSZXBsYWNl
ZCgpICYmIGxpbmVQb3NpdGlvbk1vZGUgPT0gUG9zaXRpb25PbkNvbnRhaW5pbmdMaW5lKQogICAg
ICAgICByZXR1cm4gUmVuZGVyQm94OjpsaW5lSGVpZ2h0KGZpcnN0TGluZSwgZGlyZWN0aW9uLCBs
aW5lUG9zaXRpb25Nb2RlKTsKIAotICAgIGlmIChmaXJzdExpbmUgJiYgZG9jdW1lbnQoKS0+dXNl
c0ZpcnN0TGluZVJ1bGVzKCkpIHsKKyAgICBpZiAoZmlyc3RMaW5lICYmIGRvY3VtZW50KCktPnN0
eWxlU2hlZXRDb2xsZWN0aW9uKCktPnVzZXNGaXJzdExpbmVSdWxlcygpKSB7CiAgICAgICAgIFJl
bmRlclN0eWxlKiBzID0gc3R5bGUoZmlyc3RMaW5lKTsKICAgICAgICAgaWYgKHMgIT0gc3R5bGUo
KSkKICAgICAgICAgICAgIHJldHVybiBzLT5jb21wdXRlZExpbmVIZWlnaHQodmlldygpKTsKQEAg
LTY0NjEsNyArNjQ2MSw3IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmNyZWF0ZUZpcnN0TGV0dGVyUmVu
ZGUKIAogdm9pZCBSZW5kZXJCbG9jazo6dXBkYXRlRmlyc3RMZXR0ZXIoKQogewotICAgIGlmICgh
ZG9jdW1lbnQoKS0+dXNlc0ZpcnN0TGV0dGVyUnVsZXMoKSkKKyAgICBpZiAoIWRvY3VtZW50KCkt
PnN0eWxlU2hlZXRDb2xsZWN0aW9uKCktPnVzZXNGaXJzdExldHRlclJ1bGVzKCkpCiAgICAgICAg
IHJldHVybjsKICAgICAvLyBEb24ndCByZWN1cgogICAgIGlmIChzdHlsZSgpLT5zdHlsZVR5cGUo
KSA9PSBGSVJTVF9MRVRURVIpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVy
SW5saW5lLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVy
SW5saW5lLmNwcAkocmV2aXNpb24gMTI5MzAzKQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5n
L1JlbmRlcklubGluZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE5NCw3ICsxOTQsNyBAQCB2b2lk
IFJlbmRlcklubGluZTo6c3R5bGVEaWRDaGFuZ2UoU3R5bGVECiAgICAgfQogCiAgICAgLy8gVXBk
YXRlIHBzZXVkb3MgZm9yIDpiZWZvcmUgYW5kIDphZnRlciBub3cuCi0gICAgaWYgKCFpc0Fub255
bW91cygpICYmIGRvY3VtZW50KCktPnVzZXNCZWZvcmVBZnRlclJ1bGVzKCkpIHsKKyAgICBpZiAo
IWlzQW5vbnltb3VzKCkgJiYgZG9jdW1lbnQoKS0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+dXNl
c0JlZm9yZUFmdGVyUnVsZXMoKSkgewogICAgICAgICBjaGlsZHJlbigpLT51cGRhdGVCZWZvcmVB
ZnRlckNvbnRlbnQodGhpcywgQkVGT1JFKTsKICAgICAgICAgY2hpbGRyZW4oKS0+dXBkYXRlQmVm
b3JlQWZ0ZXJDb250ZW50KHRoaXMsIEFGVEVSKTsKICAgICB9CkBAIC0yMTgsNyArMjE4LDcgQEAg
dm9pZCBSZW5kZXJJbmxpbmU6OnVwZGF0ZUFsd2F5c0NyZWF0ZUxpbgogICAgICAgICB8fCBwYXJl
bnRTdHlsZS0+bGluZUhlaWdodCgpICE9IHN0eWxlKCktPmxpbmVIZWlnaHQoKSkpCiAgICAgICAg
IHx8IChpblJlbmRlckZsb3dUaHJlYWQoKSAmJiBlbmNsb3NpbmdSZW5kZXJGbG93VGhyZWFkKCkt
Pmhhc1JlZ2lvbnNXaXRoU3R5bGluZygpKTsKIAotICAgIGlmICghYWx3YXlzQ3JlYXRlTGluZUJv
eGVzICYmIGNoZWNrRm9udHMgJiYgZG9jdW1lbnQoKS0+dXNlc0ZpcnN0TGluZVJ1bGVzKCkpIHsK
KyAgICBpZiAoIWFsd2F5c0NyZWF0ZUxpbmVCb3hlcyAmJiBjaGVja0ZvbnRzICYmIGRvY3VtZW50
KCktPnN0eWxlU2hlZXRDb2xsZWN0aW9uKCktPnVzZXNGaXJzdExpbmVSdWxlcygpKSB7CiAgICAg
ICAgIC8vIEhhdmUgdG8gY2hlY2sgdGhlIGZpcnN0IGxpbmUgc3R5bGUgYXMgd2VsbC4KICAgICAg
ICAgcGFyZW50U3R5bGUgPSBwYXJlbnQoKS0+c3R5bGUodHJ1ZSk7CiAgICAgICAgIFJlbmRlclN0
eWxlKiBjaGlsZFN0eWxlID0gc3R5bGUodHJ1ZSk7CkBAIC0zMjQsNyArMzI0LDcgQEAgdm9pZCBS
ZW5kZXJJbmxpbmU6OmFkZENoaWxkSWdub3JpbmdDb250aQogICAgICAgICAvLyBoYXMgdG8gbW92
ZSBpbnRvIHRoZSBpbmxpbmUgY29udGludWF0aW9uLiAgQ2FsbCB1cGRhdGVCZWZvcmVBZnRlckNv
bnRlbnQgdG8gZW5zdXJlIHRoYXQgb3VyIDphZnRlcgogICAgICAgICAvLyBjb250ZW50IGdldHMg
cHJvcGVybHkgZGVzdHJveWVkLgogICAgICAgICBib29sIGlzTGFzdENoaWxkID0gKGJlZm9yZUNo
aWxkID09IGxhc3RDaGlsZCgpKTsKLSAgICAgICAgaWYgKGRvY3VtZW50KCktPnVzZXNCZWZvcmVB
ZnRlclJ1bGVzKCkpCisgICAgICAgIGlmIChkb2N1bWVudCgpLT5zdHlsZVNoZWV0Q29sbGVjdGlv
bigpLT51c2VzQmVmb3JlQWZ0ZXJSdWxlcygpKQogICAgICAgICAgICAgY2hpbGRyZW4oKS0+dXBk
YXRlQmVmb3JlQWZ0ZXJDb250ZW50KHRoaXMsIEFGVEVSKTsKICAgICAgICAgaWYgKGlzTGFzdENo
aWxkICYmIGJlZm9yZUNoaWxkICE9IGxhc3RDaGlsZCgpKQogICAgICAgICAgICAgYmVmb3JlQ2hp
bGQgPSAwOyAvLyBXZSBkZXN0cm95ZWQgdGhlIGxhc3QgY2hpbGQsIHNvIG5vdyB3ZSBuZWVkIHRv
IHVwZGF0ZSBvdXIgaW5zZXJ0aW9uCkBAIC0zOTksNyArMzk5LDcgQEAgdm9pZCBSZW5kZXJJbmxp
bmU6OnNwbGl0SW5saW5lcyhSZW5kZXJCbAogICAgICAgICAgICAgLy8gU29tZW9uZSBtYXkgaGF2
ZSBpbmRpcmVjdGx5IGNhdXNlZCBhIDxxPiB0byBzcGxpdC4gIFdoZW4gdGhpcyBoYXBwZW5zLCB0
aGUgOmFmdGVyIGNvbnRlbnQKICAgICAgICAgICAgIC8vIGhhcyB0byBtb3ZlIGludG8gdGhlIGlu
bGluZSBjb250aW51YXRpb24uICBDYWxsIHVwZGF0ZUJlZm9yZUFmdGVyQ29udGVudCB0byBlbnN1
cmUgdGhhdCB0aGUgaW5saW5lJ3MgOmFmdGVyCiAgICAgICAgICAgICAvLyBjb250ZW50IGdldHMg
cHJvcGVybHkgZGVzdHJveWVkLgotICAgICAgICAgICAgaWYgKGRvY3VtZW50KCktPnVzZXNCZWZv
cmVBZnRlclJ1bGVzKCkpCisgICAgICAgICAgICBpZiAoZG9jdW1lbnQoKS0+c3R5bGVTaGVldENv
bGxlY3Rpb24oKS0+dXNlc0JlZm9yZUFmdGVyUnVsZXMoKSkKICAgICAgICAgICAgICAgICBpbmxp
bmVDdXJyLT5jaGlsZHJlbigpLT51cGRhdGVCZWZvcmVBZnRlckNvbnRlbnQoaW5saW5lQ3Vyciwg
QUZURVIpOwogCiAgICAgICAgICAgICAvLyBOb3cgd2UgbmVlZCB0byB0YWtlIGFsbCBvZiB0aGUg
Y2hpbGRyZW4gc3RhcnRpbmcgZnJvbSB0aGUgZmlyc3QgY2hpbGQKQEAgLTEyODMsNyArMTI4Myw3
IEBAIElubGluZUZsb3dCb3gqIFJlbmRlcklubGluZTo6Y3JlYXRlQW5kQXAKIAogTGF5b3V0VW5p
dCBSZW5kZXJJbmxpbmU6OmxpbmVIZWlnaHQoYm9vbCBmaXJzdExpbmUsIExpbmVEaXJlY3Rpb25N
b2RlIC8qZGlyZWN0aW9uKi8sIExpbmVQb3NpdGlvbk1vZGUgLypsaW5lUG9zaXRpb25Nb2RlKi8p
IGNvbnN0CiB7Ci0gICAgaWYgKGZpcnN0TGluZSAmJiBkb2N1bWVudCgpLT51c2VzRmlyc3RMaW5l
UnVsZXMoKSkgeworICAgIGlmIChmaXJzdExpbmUgJiYgZG9jdW1lbnQoKS0+c3R5bGVTaGVldENv
bGxlY3Rpb24oKS0+dXNlc0ZpcnN0TGluZVJ1bGVzKCkpIHsKICAgICAgICAgUmVuZGVyU3R5bGUq
IHMgPSBzdHlsZShmaXJzdExpbmUpOwogICAgICAgICBpZiAocyAhPSBzdHlsZSgpKQogICAgICAg
ICAgICAgcmV0dXJuIHMtPmNvbXB1dGVkTGluZUhlaWdodCh2aWV3KCkpOwpJbmRleDogU291cmNl
L1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdC5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdC5jcHAJKHJldmlzaW9uIDEyOTMwMykKKysr
IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3QuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0yNTk3LDcgKzI1OTcsNyBAQCB2b2lkIFJlbmRlck9iamVjdDo6bGF5b3V0KCkKIAogUGFz
c1JlZlB0cjxSZW5kZXJTdHlsZT4gUmVuZGVyT2JqZWN0Ojp1bmNhY2hlZEZpcnN0TGluZVN0eWxl
KFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKIHsKLSAgICBpZiAoIWRvY3VtZW50KCktPnVzZXNG
aXJzdExpbmVSdWxlcygpKQorICAgIGlmICghZG9jdW1lbnQoKS0+c3R5bGVTaGVldENvbGxlY3Rp
b24oKS0+dXNlc0ZpcnN0TGluZVJ1bGVzKCkpCiAgICAgICAgIHJldHVybiAwOwogCiAgICAgQVNT
RVJUKCFpc1RleHQoKSk7CkBAIC0yNjE4LDcgKzI2MTgsNyBAQCBQYXNzUmVmUHRyPFJlbmRlclN0
eWxlPiBSZW5kZXJPYmplY3Q6OnVuCiAKIFJlbmRlclN0eWxlKiBSZW5kZXJPYmplY3Q6OmZpcnN0
TGluZVN0eWxlU2xvd0Nhc2UoKSBjb25zdAogewotICAgIEFTU0VSVChkb2N1bWVudCgpLT51c2Vz
Rmlyc3RMaW5lUnVsZXMoKSk7CisgICAgQVNTRVJUKGRvY3VtZW50KCktPnN0eWxlU2hlZXRDb2xs
ZWN0aW9uKCktPnVzZXNGaXJzdExpbmVSdWxlcygpKTsKIAogICAgIFJlbmRlclN0eWxlKiBzdHls
ZSA9IG1fc3R5bGUuZ2V0KCk7CiAgICAgY29uc3QgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IGlz
VGV4dCgpID8gcGFyZW50KCkgOiB0aGlzOwpJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5n
L1JlbmRlck9iamVjdC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9S
ZW5kZXJPYmplY3QuaAkocmV2aXNpb24gMTI5MzAzKQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVy
aW5nL1JlbmRlck9iamVjdC5oCSh3b3JraW5nIGNvcHkpCkBAIC0yNyw2ICsyNyw3IEBACiAjZGVm
aW5lIFJlbmRlck9iamVjdF9oCiAKICNpbmNsdWRlICJDYWNoZWRJbWFnZUNsaWVudC5oIgorI2lu
Y2x1ZGUgIkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uaCIKICNpbmNsdWRlICJFbGVtZW50
LmgiCiAjaW5jbHVkZSAiRnJhY3Rpb25hbExheW91dFVuaXQuaCIKICNpbmNsdWRlICJGbG9hdFF1
YWQuaCIKQEAgLTczNSw3ICs3MzYsNyBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCBMYXlvdXRVbml0
IG1heFByZWZlcnJlZExvZ2ljYWxXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KIAogICAgIFJl
bmRlclN0eWxlKiBzdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3R5bGUuZ2V0KCk7IH0KLSAgICBS
ZW5kZXJTdHlsZSogZmlyc3RMaW5lU3R5bGUoKSBjb25zdCB7IHJldHVybiBkb2N1bWVudCgpLT51
c2VzRmlyc3RMaW5lUnVsZXMoKSA/IGZpcnN0TGluZVN0eWxlU2xvd0Nhc2UoKSA6IHN0eWxlKCk7
IH0KKyAgICBSZW5kZXJTdHlsZSogZmlyc3RMaW5lU3R5bGUoKSBjb25zdCB7IHJldHVybiBkb2N1
bWVudCgpLT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpLT51c2VzRmlyc3RMaW5lUnVsZXMoKSA/IGZp
cnN0TGluZVN0eWxlU2xvd0Nhc2UoKSA6IHN0eWxlKCk7IH0KICAgICBSZW5kZXJTdHlsZSogc3R5
bGUoYm9vbCBmaXJzdExpbmUpIGNvbnN0IHsgcmV0dXJuIGZpcnN0TGluZSA/IGZpcnN0TGluZVN0
eWxlKCkgOiBzdHlsZSgpOyB9CiAKICAgICAvLyBVc2VkIG9ubHkgYnkgRWxlbWVudDo6cHNldWRv
U3R5bGVDYWNoZUlzSW52YWxpZCB0byBnZXQgYSBmaXJzdCBsaW5lIHN0eWxlIGJhc2VkIG9mZiBv
ZiBhCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0Q2hpbGRMaXN0
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0
Q2hpbGRMaXN0LmNwcAkocmV2aXNpb24gMTI5MzAzKQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVy
aW5nL1JlbmRlck9iamVjdENoaWxkTGlzdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM2OSw3ICsz
NjksNyBAQCBzdGF0aWMgUmVuZGVyT2JqZWN0KiBlbnN1cmVCZWZvcmVBZnRlckNvCiB2b2lkIFJl
bmRlck9iamVjdENoaWxkTGlzdDo6dXBkYXRlQmVmb3JlQWZ0ZXJDb250ZW50KFJlbmRlck9iamVj
dCogb3duZXIsIFBzZXVkb0lkIHR5cGUsIGNvbnN0IFJlbmRlck9iamVjdCogc3R5bGVkT2JqZWN0
KQogewogICAgIC8vIERvdWJsZSBjaGVjayB0aGF0IHRoZSBkb2N1bWVudCBkaWQgaW4gZmFjdCB1
c2UgZ2VuZXJhdGVkIGNvbnRlbnQgcnVsZXMuICBPdGhlcndpc2Ugd2Ugc2hvdWxkIG5vdCBoYXZl
IGJlZW4gY2FsbGVkLgotICAgIEFTU0VSVChvd25lci0+ZG9jdW1lbnQoKS0+dXNlc0JlZm9yZUFm
dGVyUnVsZXMoKSk7CisgICAgQVNTRVJUKG93bmVyLT5kb2N1bWVudCgpLT5zdHlsZVNoZWV0Q29s
bGVjdGlvbigpLT51c2VzQmVmb3JlQWZ0ZXJSdWxlcygpKTsKIAogICAgIC8vIEluIENTUzIsIGJl
Zm9yZS9hZnRlciBwc2V1ZG8tY29udGVudCBjYW5ub3QgbmVzdC4gIENoZWNrIHRoaXMgZmlyc3Qu
CiAgICAgaWYgKG93bmVyLT5zdHlsZSgpLT5zdHlsZVR5cGUoKSA9PSBCRUZPUkUgfHwgb3duZXIt
PnN0eWxlKCktPnN0eWxlVHlwZSgpID09IEFGVEVSKQpJbmRleDogU291cmNlL1dlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlclRhYmxlUm93LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9y
ZW5kZXJpbmcvUmVuZGVyVGFibGVSb3cuY3BwCShyZXZpc2lvbiAxMjkzMDMpCisrKyBTb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGFibGVSb3cuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01
NSw3ICs1NSw3IEBAIHZvaWQgUmVuZGVyVGFibGVSb3c6OndpbGxCZVJlbW92ZWRGcm9tVHIKIAog
dm9pZCBSZW5kZXJUYWJsZVJvdzo6dXBkYXRlQmVmb3JlQW5kQWZ0ZXJDb250ZW50KCkKIHsKLSAg
ICBpZiAoIWlzQW5vbnltb3VzKCkgJiYgZG9jdW1lbnQoKS0+dXNlc0JlZm9yZUFmdGVyUnVsZXMo
KSkgeworICAgIGlmICghaXNBbm9ueW1vdXMoKSAmJiBkb2N1bWVudCgpLT5zdHlsZVNoZWV0Q29s
bGVjdGlvbigpLT51c2VzQmVmb3JlQWZ0ZXJSdWxlcygpKSB7CiAgICAgICAgIGNoaWxkcmVuKCkt
PnVwZGF0ZUJlZm9yZUFmdGVyQ29udGVudCh0aGlzLCBCRUZPUkUpOwogICAgICAgICBjaGlsZHJl
bigpLT51cGRhdGVCZWZvcmVBZnRlckNvbnRlbnQodGhpcywgQUZURVIpOwogICAgIH0KSW5kZXg6
IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9Sb290SW5saW5lQm94LmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUm9vdElubGluZUJveC5jcHAJKHJldmlzaW9uIDEy
OTMwMykKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9Sb290SW5saW5lQm94LmNwcAkod29y
a2luZyBjb3B5KQpAQCAtODQ2LDcgKzg0Niw3IEBAIExheW91dFVuaXQgUm9vdElubGluZUJveDo6
dmVydGljYWxQb3NpdGkKIAogICAgIC8vIFRoaXMgbWV0aG9kIGRldGVybWluZXMgdGhlIHZlcnRp
Y2FsIHBvc2l0aW9uIGZvciBpbmxpbmUgZWxlbWVudHMuCiAgICAgYm9vbCBmaXJzdExpbmUgPSBp
c0ZpcnN0TGluZVN0eWxlKCk7Ci0gICAgaWYgKGZpcnN0TGluZSAmJiAhcmVuZGVyZXItPmRvY3Vt
ZW50KCktPnVzZXNGaXJzdExpbmVSdWxlcygpKQorICAgIGlmIChmaXJzdExpbmUgJiYgIXJlbmRl
cmVyLT5kb2N1bWVudCgpLT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpLT51c2VzRmlyc3RMaW5lUnVs
ZXMoKSkKICAgICAgICAgZmlyc3RMaW5lID0gZmFsc2U7CiAKICAgICAvLyBDaGVjayB0aGUgY2Fj
aGUuCkluZGV4OiBTb3VyY2UvV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJEb2N1bWVudC5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViRG9jdW1lbnQuY3BwCShy
ZXZpc2lvbiAxMjkzMDMpCisrKyBTb3VyY2UvV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJEb2N1bWVu
dC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlICJDU1NQYXJz
ZXJNb2RlLmgiCiAjaW5jbHVkZSAiRG9jdW1lbnQuaCIKICNpbmNsdWRlICJEb2N1bWVudExvYWRl
ci5oIgorI2luY2x1ZGUgIkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uaCIKICNpbmNsdWRl
ICJEb2N1bWVudFR5cGUuaCIKICNpbmNsdWRlICJFbGVtZW50LmgiCiAjaW5jbHVkZSAiSFRNTEFs
bENvbGxlY3Rpb24uaCIKQEAgLTE5Niw3ICsxOTcsNyBAQCB2b2lkIFdlYkRvY3VtZW50OjppbnNl
cnRVc2VyU3R5bGVTaGVldChjCiAgICAgUmVmUHRyPFN0eWxlU2hlZXRDb250ZW50cz4gcGFyc2Vk
U2hlZXQgPSBTdHlsZVNoZWV0Q29udGVudHM6OmNyZWF0ZShkb2N1bWVudC5nZXQoKSk7CiAgICAg
cGFyc2VkU2hlZXQtPnNldElzVXNlclN0eWxlU2hlZXQobGV2ZWwgPT0gVXNlclN0eWxlVXNlckxl
dmVsKTsKICAgICBwYXJzZWRTaGVldC0+cGFyc2VTdHJpbmcoc291cmNlQ29kZSk7Ci0gICAgZG9j
dW1lbnQtPmFkZFVzZXJTaGVldChwYXJzZWRTaGVldC5yZWxlYXNlKCkpOworICAgIGRvY3VtZW50
LT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpLT5hZGRVc2VyU2hlZXQocGFyc2VkU2hlZXQucmVsZWFz
ZSgpKTsKIH0KIAogdm9pZCBXZWJEb2N1bWVudDo6Y2FuY2VsRnVsbFNjcmVlbigpCg==
</data>
<flag name="review"
          id="177282"
          type_id="1"
          status="-"
          setter="eric"
    />
    <flag name="commit-queue"
          id="177283"
          type_id="3"
          status="-"
          setter="webkit-ews"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>165418</attachid>
            <date>2012-09-24 11:46:13 -0700</date>
            <delta_ts>2012-09-24 12:03:33 -0700</delta_ts>
            <desc>try to make it build </desc>
            <filename>document-stylesheet-split-8.patch</filename>
            <type>text/plain</type>
            <size>541449</size>
            <attacher name="Antti Koivisto">koivisto</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEyOTMwMykKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE1MyBAQAorMjAxMi0wOS0yMSAgQW50dGkg
S29pdmlzdG8gIDxhbnR0aUBhcHBsZS5jb20+CisKKyAgICAgICAgU3BsaXQgc3R5bGVzaGVldCBy
ZWxhdGVkIGNvZGUgb3V0IGZyb20gRG9jdW1lbnQgCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD05NzM1MworCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgIERvY3VtZW50IGlzIGJpZyBhbmQgdW53aWVsZHkuIFRoZSBj
b2RlIHJlbGF0ZWQgdG8gdHJhY2tpbmcgYWN0aXZlIHN0eWxlc2hlZXRzIGNhbiBiZSBmYWN0b3Jl
ZCBvdXQuCisgICAgICAgIAorICAgICAgICBUaGUgcGF0Y2ggbW92ZXMgc3R5bGVzaGVldCB1cGtl
ZXAsIGNvbGxlY3Rpb24gYW5kIGludmFsaWRhdGlvbiBjb2RlIGZyb20gRG9jdW1lbnQgdG8gYSBz
ZXBhcmF0ZQorICAgICAgICBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uIGNsYXNzLiBUaGVy
ZSBhcmUgbm8gZnVuY3Rpb25hbCBjaGFuZ2VzLgorICAgICAgICAKKyAgICAgICAgVGhlIHVzZXNM
aW5rUnVsZXMgc3R5bGVzaGVldCBmZWF0dXJlIGJpdCBhbmQgdGhlIHJlbGF0ZWQgY29kZSBpcyBy
ZW1vdmVkIGFzIG5vIG9uZSB3YXMgdXNpbmcgaXQuCisKKyAgICAgICAgKiBXZWJDb3JlLnhjb2Rl
cHJvai9wcm9qZWN0LnBieHByb2o6CisgICAgICAgICogY3NzL1NlbGVjdG9yQ2hlY2tlci5jcHA6
CisgICAgICAgIChXZWJDb3JlOjpTZWxlY3RvckNoZWNrZXI6OmNoZWNrT25lU2VsZWN0b3IpOgor
ICAgICAgICAqIGNzcy9TdHlsZVJlc29sdmVyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxl
UmVzb2x2ZXI6OlN0eWxlUmVzb2x2ZXIpOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVSZXNvbHZl
cjo6RmVhdHVyZXM6OkZlYXR1cmVzKToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6
OkZlYXR1cmVzOjphZGQpOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVSZXNvbHZlcjo6RmVhdHVy
ZXM6OmNsZWFyKToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OmNvbGxlY3RNYXRj
aGluZ1J1bGVzRm9yTGlzdCk6CisgICAgICAgICogY3NzL1N0eWxlUmVzb2x2ZXIuaDoKKyAgICAg
ICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OnVzZXNCZWZvcmVBZnRlclJ1bGVzKToKKyAgICAg
ICAgKEZlYXR1cmVzKToKKyAgICAgICAgKiBkb20vRG9jdW1lbnQuY3BwOgorICAgICAgICAoV2Vi
Q29yZTo6RG9jdW1lbnQ6OkRvY3VtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50Ojp+
RG9jdW1lbnQpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnQ6OnNldENvbXBhdGliaWxpdHlN
b2RlKToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50OjpyZWNhbGNTdHlsZSk6CisgICAgICAg
IChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50OjpjcmVhdGVTdHlsZVJlc29s
dmVyKToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50OjpzZWFtbGVzc1BhcmVudFVwZGF0ZWRT
dHlsZXNoZWV0cyk6CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudDo6ZGlkUmVtb3ZlQWxsUGVu
ZGluZ1N0eWxlc2hlZXQpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnQ6OnByb2Nlc3NIdHRw
RXF1aXYpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnQ6OnN0eWxlU2hlZXRzKToKKyAgICAg
ICAgKFdlYkNvcmU6OkRvY3VtZW50OjpwcmVmZXJyZWRTdHlsZXNoZWV0U2V0KToKKyAgICAgICAg
KFdlYkNvcmU6OkRvY3VtZW50OjpzZWxlY3RlZFN0eWxlc2hlZXRTZXQpOgorICAgICAgICAoV2Vi
Q29yZTo6RG9jdW1lbnQ6OnNldFNlbGVjdGVkU3R5bGVzaGVldFNldCk6CisgICAgICAgIChXZWJD
b3JlOjpEb2N1bWVudDo6c3R5bGVSZXNvbHZlckNoYW5nZWQpOgorICAgICAgICAoV2ViQ29yZTo6
RG9jdW1lbnQ6OnJlcG9ydE1lbW9yeVVzYWdlKToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50
OjpoYXZlU3R5bGVzaGVldHNMb2FkZWQpOgorICAgICAgICAqIGRvbS9Eb2N1bWVudC5oOgorICAg
ICAgICAoV2ViQ29yZSk6CisgICAgICAgIChEb2N1bWVudCk6CisgICAgICAgIChXZWJDb3JlOjpE
b2N1bWVudDo6c3R5bGVTaGVldENvbGxlY3Rpb24pOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1l
bnQ6Omhhc05vZGVzV2l0aFBsYWNlaG9sZGVyU3R5bGUpOgorICAgICAgICAoV2ViQ29yZTo6RG9j
dW1lbnQ6OnNldE5lZWRzTm90aWZ5UmVtb3ZlQWxsUGVuZGluZ1N0eWxlc2hlZXQpOgorICAgICAg
ICAoV2ViQ29yZTo6RG9jdW1lbnQ6OmluU3R5bGVSZWNhbGMpOgorICAgICAgICAqIGRvbS9Eb2N1
bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlKToK
KyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OkRvY3VtZW50
U3R5bGVTaGVldENvbGxlY3Rpb24pOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNo
ZWV0Q29sbGVjdGlvbjo6fkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24pOgorICAgICAgICAo
V2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6cGFnZVVzZXJTaGVldCk6Cisg
ICAgICAgIChXZWJDb3JlOjpEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjpjbGVhclBhZ2VV
c2VyU2hlZXQpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlv
bjo6dXBkYXRlUGFnZVVzZXJTaGVldCk6CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudFN0eWxl
U2hlZXRDb2xsZWN0aW9uOjpwYWdlR3JvdXBVc2VyU2hlZXRzKToKKyAgICAgICAgKFdlYkNvcmU6
OkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OmNsZWFyUGFnZUdyb3VwVXNlclNoZWV0cyk6
CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjp1cGRhdGVQ
YWdlR3JvdXBVc2VyU2hlZXRzKToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50U3R5bGVTaGVl
dENvbGxlY3Rpb246OmFkZFVzZXJTaGVldCk6CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudFN0
eWxlU2hlZXRDb2xsZWN0aW9uOjpyZW1vdmVQZW5kaW5nU2hlZXQpOgorICAgICAgICAoV2ViQ29y
ZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6YWRkU3R5bGVTaGVldENhbmRpZGF0ZU5v
ZGUpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6cmVt
b3ZlU3R5bGVTaGVldENhbmRpZGF0ZU5vZGUpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRT
dHlsZVNoZWV0Q29sbGVjdGlvbjo6Y29sbGVjdEFjdGl2ZVN0eWxlU2hlZXRzKToKKyAgICAgICAg
KFdlYkNvcmU6OkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OnRlc3RBZGRlZFN0eWxlU2hl
ZXRSZXF1aXJlc1N0eWxlUmVjYWxjKToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50U3R5bGVT
aGVldENvbGxlY3Rpb246OmFuYWx5emVTdHlsZVNoZWV0Q2hhbmdlKToKKyAgICAgICAgKFdlYkNv
cmU6OnN0eWxlU2hlZXRzVXNlUmVtVW5pdHMpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRT
dHlsZVNoZWV0Q29sbGVjdGlvbjo6dXBkYXRlQWN0aXZlU3R5bGVTaGVldHMpOgorICAgICAgICAo
V2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6Y29tYmluZUNTU0ZlYXR1cmVG
bGFncyk6CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjpy
ZXNldENTU0ZlYXR1cmVGbGFncyk6CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudFN0eWxlU2hl
ZXRDb2xsZWN0aW9uOjpyZXBvcnRNZW1vcnlVc2FnZSk6CisgICAgICAgICogZG9tL0RvY3VtZW50
U3R5bGVTaGVldENvbGxlY3Rpb24uaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlKToKKyAgICAg
ICAgKERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24pOgorICAgICAgICAoV2ViQ29yZTo6RG9j
dW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6YXV0aG9yU3R5bGVTaGVldHMpOgorICAgICAgICAo
V2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6ZG9jdW1lbnRVc2VyU2hlZXRz
KToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246Om5lZWRz
VXBkYXRlQWN0aXZlU3R5bGVzaGVldHNPblN0eWxlUmVjYWxjKToKKyAgICAgICAgKFdlYkNvcmU6
OkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OnByZWZlcnJlZFN0eWxlc2hlZXRTZXROYW1l
KToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OnNlbGVj
dGVkU3R5bGVzaGVldFNldE5hbWUpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNo
ZWV0Q29sbGVjdGlvbjo6c2V0UHJlZmVycmVkU3R5bGVzaGVldFNldE5hbWUpOgorICAgICAgICAo
V2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6c2V0U2VsZWN0ZWRTdHlsZXNo
ZWV0U2V0TmFtZSk6CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0
aW9uOjphZGRQZW5kaW5nU2hlZXQpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNo
ZWV0Q29sbGVjdGlvbjo6aGFzUGVuZGluZ1NoZWV0cyk6CisgICAgICAgIChXZWJDb3JlOjpEb2N1
bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjp1c2VzU2libGluZ1J1bGVzKToKKyAgICAgICAgKFdl
YkNvcmU6OkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OnNldFVzZXNTaWJsaW5nUnVsZXNP
dmVycmlkZSk6CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9u
Ojp1c2VzRmlyc3RMaW5lUnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNo
ZWV0Q29sbGVjdGlvbjo6dXNlc0ZpcnN0TGV0dGVyUnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6
RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6c2V0VXNlc0ZpcnN0TGV0dGVyUnVsZXMpOgor
ICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6dXNlc0JlZm9y
ZUFmdGVyUnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVj
dGlvbjo6c2V0VXNlc0JlZm9yZUFmdGVyUnVsZXNPdmVycmlkZSk6CisgICAgICAgIChXZWJDb3Jl
OjpEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjp1c2VzUmVtVW5pdHMpOgorICAgICAgICAo
V2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6c2V0VXNlc1JlbVVuaXQpOgor
ICAgICAgICAqIGRvbS9FbGVtZW50LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnQ6OnJl
Y2FsY1N0eWxlKToKKyAgICAgICAgKiBkb20vUHJvY2Vzc2luZ0luc3RydWN0aW9uLmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OlByb2Nlc3NpbmdJbnN0cnVjdGlvbjo6flByb2Nlc3NpbmdJbnN0cnVj
dGlvbik6CisgICAgICAgIChXZWJDb3JlOjpQcm9jZXNzaW5nSW5zdHJ1Y3Rpb246OmNoZWNrU3R5
bGVTaGVldCk6CisgICAgICAgIChXZWJDb3JlOjpQcm9jZXNzaW5nSW5zdHJ1Y3Rpb246OnNoZWV0
TG9hZGVkKToKKyAgICAgICAgKFdlYkNvcmU6OlByb2Nlc3NpbmdJbnN0cnVjdGlvbjo6aW5zZXJ0
ZWRJbnRvKToKKyAgICAgICAgKFdlYkNvcmU6OlByb2Nlc3NpbmdJbnN0cnVjdGlvbjo6cmVtb3Zl
ZEZyb20pOgorICAgICAgICAqIGRvbS9TdHlsZUVsZW1lbnQuY3BwOgorICAgICAgICAoV2ViQ29y
ZTo6U3R5bGVFbGVtZW50OjppbnNlcnRlZEludG9Eb2N1bWVudCk6CisgICAgICAgIChXZWJDb3Jl
OjpTdHlsZUVsZW1lbnQ6OnJlbW92ZWRGcm9tRG9jdW1lbnQpOgorICAgICAgICAoV2ViQ29yZTo6
U3R5bGVFbGVtZW50OjpjbGVhckRvY3VtZW50RGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpTdHls
ZUVsZW1lbnQ6OmNyZWF0ZVNoZWV0KToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlRWxlbWVudDo6
c2hlZXRMb2FkZWQpOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVFbGVtZW50OjpzdGFydExvYWRp
bmdEeW5hbWljU2hlZXQpOgorICAgICAgICAqIGh0bWwvSFRNTExpbmtFbGVtZW50LmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OkhUTUxMaW5rRWxlbWVudDo6fkhUTUxMaW5rRWxlbWVudCk6CisgICAg
ICAgIChXZWJDb3JlOjpIVE1MTGlua0VsZW1lbnQ6Omluc2VydGVkSW50byk6CisgICAgICAgIChX
ZWJDb3JlOjpIVE1MTGlua0VsZW1lbnQ6OnJlbW92ZWRGcm9tKToKKyAgICAgICAgKFdlYkNvcmU6
OkhUTUxMaW5rRWxlbWVudDo6YWRkUGVuZGluZ1NoZWV0KToKKyAgICAgICAgKFdlYkNvcmU6OkhU
TUxMaW5rRWxlbWVudDo6cmVtb3ZlUGVuZGluZ1NoZWV0KToKKyAgICAgICAgKiBodG1sL0hUTUxR
dW90ZUVsZW1lbnQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6SFRNTFF1b3RlRWxlbWVudDo6aW5z
ZXJ0ZWRJbnRvKToKKyAgICAgICAgKiBodG1sL0hUTUxWaWV3U291cmNlRG9jdW1lbnQuY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6SFRNTFZpZXdTb3VyY2VEb2N1bWVudDo6SFRNTFZpZXdTb3VyY2VE
b2N1bWVudCk6CisgICAgICAgICogbWF0aG1sL01hdGhNTE1hdGhFbGVtZW50LmNwcDoKKyAgICAg
ICAgKFdlYkNvcmU6Ok1hdGhNTE1hdGhFbGVtZW50OjppbnNlcnRlZEludG8pOgorICAgICAgICAq
IHBhZ2UvUGFnZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpQYWdlOjp1c2VyU3R5bGVTaGVldExv
Y2F0aW9uQ2hhbmdlZCk6CisgICAgICAgICogcGFnZS9QYWdlR3JvdXAuY3BwOgorICAgICAgICAo
V2ViQ29yZTo6UGFnZUdyb3VwOjpyZXNldFVzZXJTdHlsZUNhY2hlSW5BbGxGcmFtZXMpOgorICAg
ICAgICAqIHJlbmRlcmluZy9SZW5kZXJCUi5jcHA6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJC
Ujo6bGluZUhlaWdodCk6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlckJsb2NrLmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrOjpzdHlsZURpZENoYW5nZSk6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJCbG9jazo6c3BsaXRCbG9ja3MpOgorICAgICAgICAoV2ViQ29yZTo6UmVu
ZGVyQmxvY2s6OmFkZENoaWxkSWdub3JpbmdBbm9ueW1vdXNDb2x1bW5CbG9ja3MpOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6OmxpbmVIZWlnaHQpOgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyQmxvY2s6OnVwZGF0ZUZpcnN0TGV0dGVyKToKKyAgICAgICAgKiByZW5kZXJpbmcvUmVu
ZGVySW5saW5lLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlcklubGluZTo6c3R5bGVEaWRD
aGFuZ2UpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVySW5saW5lOjp1cGRhdGVBbHdheXNDcmVh
dGVMaW5lQm94ZXMpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVySW5saW5lOjphZGRDaGlsZEln
bm9yaW5nQ29udGludWF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlcklubGluZTo6c3Bs
aXRJbmxpbmVzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlcklubGluZTo6bGluZUhlaWdodCk6
CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlck9iamVjdC5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJPYmplY3Q6OnVuY2FjaGVkRmlyc3RMaW5lU3R5bGUpOgorICAgICAgICAoV2ViQ29y
ZTo6UmVuZGVyT2JqZWN0OjpmaXJzdExpbmVTdHlsZVNsb3dDYXNlKToKKyAgICAgICAgKiByZW5k
ZXJpbmcvUmVuZGVyT2JqZWN0Lmg6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJPYmplY3Q6OmZp
cnN0TGluZVN0eWxlKToKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyT2JqZWN0Q2hpbGRMaXN0
LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck9iamVjdENoaWxkTGlzdDo6dXBkYXRlQmVm
b3JlQWZ0ZXJDb250ZW50KToKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyVGFibGVSb3cuY3Bw
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGFibGVSb3c6OnVwZGF0ZUJlZm9yZUFuZEFmdGVy
Q29udGVudCk6CisgICAgICAgICogcmVuZGVyaW5nL1Jvb3RJbmxpbmVCb3guY3BwOgorICAgICAg
ICAoV2ViQ29yZTo6Um9vdElubGluZUJveDo6dmVydGljYWxQb3NpdGlvbkZvckJveCk6CisKIDIw
MTItMDktMjEgIEFtaSBGaXNjaG1hbiAgPGZpc2NobWFuQGNocm9taXVtLm9yZz4KIAogICAgICAg
ICBIVE1MTWVkaWFFbGVtZW50IGlzbid0IGdhcmJhZ2UgY29sbGVjdGVkIGJldHdlZW4gZG9jdW1l
bnQgcmVsb2FkcwpJbmRleDogU291cmNlL1dlYkNvcmUvQ01ha2VMaXN0cy50eHQKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL1dlYkNvcmUvQ01ha2VMaXN0cy50eHQJKHJldmlzaW9uIDEyOTMwMykKKysr
IFNvdXJjZS9XZWJDb3JlL0NNYWtlTGlzdHMudHh0CSh3b3JraW5nIGNvcHkpCkBAIC0xMTI1LDYg
KzExMjUsNyBAQCBTRVQoV2ViQ29yZV9TT1VSQ0VTCiAgICAgZG9tL0RvY3VtZW50RnJhZ21lbnQu
Y3BwCiAgICAgZG9tL0RvY3VtZW50UGFyc2VyLmNwcAogICAgIGRvbS9Eb2N1bWVudE9yZGVyZWRN
YXAuY3BwCisgICAgZG9tL0RvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uY3BwCiAgICAgZG9t
L0RvY3VtZW50VHlwZS5jcHAKICAgICBkb20vRHluYW1pY05vZGVMaXN0LmNwcAogICAgIGRvbS9F
ZGl0aW5nVGV4dC5jcHAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL0dOVW1ha2VmaWxlLmxpc3QuYW0K
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvR05VbWFrZWZpbGUubGlzdC5hbQkocmV2aXNp
b24gMTI5MzAzKQorKysgU291cmNlL1dlYkNvcmUvR05VbWFrZWZpbGUubGlzdC5hbQkod29ya2lu
ZyBjb3B5KQpAQCAtMjczNCw2ICsyNzM0LDggQEAgd2ViY29yZV9zb3VyY2VzICs9IFwKIAlTb3Vy
Y2UvV2ViQ29yZS9kb20vRG9jdW1lbnRPcmRlcmVkTWFwLmggXAogCVNvdXJjZS9XZWJDb3JlL2Rv
bS9Eb2N1bWVudFBhcnNlci5jcHAgXAogCVNvdXJjZS9XZWJDb3JlL2RvbS9Eb2N1bWVudFBhcnNl
ci5oIFwKKyAgICBTb3VyY2UvV2ViQ29yZS9kb20vRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlv
bi5jcHAgXAorICAgIFNvdXJjZS9XZWJDb3JlL2RvbS9Eb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0
aW9uLmggXAogCVNvdXJjZS9XZWJDb3JlL2RvbS9Eb2N1bWVudFRpbWluZy5oIFwKIAlTb3VyY2Uv
V2ViQ29yZS9kb20vRG9jdW1lbnRUeXBlLmNwcCBcCiAJU291cmNlL1dlYkNvcmUvZG9tL0RvY3Vt
ZW50VHlwZS5oIFwKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL1RhcmdldC5wcmkKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYkNvcmUvVGFyZ2V0LnByaQkocmV2aXNpb24gMTI5MzAzKQorKysgU291cmNl
L1dlYkNvcmUvVGFyZ2V0LnByaQkod29ya2luZyBjb3B5KQpAQCAtMzcxLDYgKzM3MSw3IEBAIFNP
VVJDRVMgKz0gXAogICAgIGRvbS9Eb2N1bWVudE1hcmtlci5jcHAgXAogICAgIGRvbS9Eb2N1bWVu
dE9yZGVyZWRNYXAuY3BwIFwKICAgICBkb20vRG9jdW1lbnRQYXJzZXIuY3BwIFwKKyAgICBkb20v
RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5jcHAgXAogICAgIGRvbS9Eb2N1bWVudFR5cGUu
Y3BwIFwKICAgICBkb20vRE9NQ29yZUV4Y2VwdGlvbi5jcHAgXAogICAgIGRvbS9ET01FcnJvci5j
cHAgXApAQCAtMTUyOCw2ICsxNTI5LDcgQEAgSEVBREVSUyArPSBcCiAgICAgZG9tL0RvY3VtZW50
TWFya2VyLmggXAogICAgIGRvbS9Eb2N1bWVudE1hcmtlckNvbnRyb2xsZXIuaCBcCiAgICAgZG9t
L0RvY3VtZW50T3JkZXJlZE1hcC5oIFwKKyAgICBkb20vRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVj
dGlvbi5oIFwKICAgICBkb20vRG9jdW1lbnRUeXBlLmggXAogICAgIGRvbS9ET01FcnJvci5oIFwK
ICAgICBkb20vRE9NSW1wbGVtZW50YXRpb24uaCBcCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9XZWJD
b3JlLmd5cGkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBpCShyZXZp
c2lvbiAxMjkzMDMpCisrKyBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkJKHdvcmtpbmcgY29w
eSkKQEAgLTY1Nyw2ICs2NTcsNyBAQAogICAgICAgICAgICAgJ2RvbS9Eb2N1bWVudE1hcmtlckNv
bnRyb2xsZXIuaCcsCiAgICAgICAgICAgICAnZG9tL0RvY3VtZW50T3JkZXJlZE1hcC5oJywKICAg
ICAgICAgICAgICdkb20vRG9jdW1lbnRQYXJzZXIuaCcsCisgICAgICAgICAgICAnZG9tL0RvY3Vt
ZW50U3R5bGVTaGVldENvbGxlY3Rpb24uaCcsCiAgICAgICAgICAgICAnZG9tL0RvY3VtZW50VGlt
aW5nLmgnLAogICAgICAgICAgICAgJ2RvbS9Eb2N1bWVudFR5cGUuaCcsCiAgICAgICAgICAgICAn
ZG9tL0VsZW1lbnQuaCcsCkBAIC0zODE2LDYgKzM4MTcsNyBAQAogICAgICAgICAgICAgJ2RvbS9E
b2N1bWVudE1hcmtlci5jcHAnLAogICAgICAgICAgICAgJ2RvbS9Eb2N1bWVudE9yZGVyZWRNYXAu
Y3BwJywKICAgICAgICAgICAgICdkb20vRG9jdW1lbnRQYXJzZXIuY3BwJywKKyAgICAgICAgICAg
ICdkb20vRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5jcHAnLAogICAgICAgICAgICAgJ2Rv
bS9Eb2N1bWVudFR5cGUuY3BwJywKICAgICAgICAgICAgICdkb20vRHluYW1pY05vZGVMaXN0LmNw
cCcsCiAgICAgICAgICAgICAnZG9tL0R5bmFtaWNOb2RlTGlzdC5oJywKSW5kZXg6IFNvdXJjZS9X
ZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qCShyZXZpc2lvbiAxMjkzMDMp
CisrKyBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvagkod29ya2lu
ZyBjb3B5KQpAQCAtNTA0MDYsNiArNTA0MDYsMTQgQEAKIAkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGRv
bVxEb2N1bWVudFBhcnNlci5oIgogCQkJCT4KIAkJCTwvRmlsZT4KKyAgICAgICAgICAgIDxGaWxl
CisJCQkJUmVsYXRpdmVQYXRoPSIuLlxkb21cRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5j
cHAiCisJCQkJPgorCQkJPC9GaWxlPgorICAgICAgICAgICAgPEZpbGUKKwkJCQlSZWxhdGl2ZVBh
dGg9Ii4uXGRvbVxEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmgiCisJCQkJPgorCQkJPC9G
aWxlPgogCQkJPEZpbGUKIAkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGRvbVxEb2N1bWVudFRpbWluZy5o
IgogCQkJCT4KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3Qu
cGJ4cHJvago9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9w
cm9qZWN0LnBieHByb2oJKHJldmlzaW9uIDEyOTMwMykKKysrIFNvdXJjZS9XZWJDb3JlL1dlYkNv
cmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29ya2luZyBjb3B5KQpAQCAtNjE0MSw2ICs2
MTQxLDggQEAKIAkJRTQ3NzhCODAxMTVBNTgxQTAwQjVEMzcyIC8qIEpTQ3VzdG9tRXZlbnQuaCBp
biBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEU0Nzc4QjdFMTE1
QTU4MUEwMEI1RDM3MiAvKiBKU0N1c3RvbUV2ZW50LmggKi87IH07CiAJCUU0N0I0QkU4MEU3MTI0
MTYwMDAzODg1NCAvKiBDYWNoZWRSZXNvdXJjZUhhbmRsZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNh
ID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRTQ3QjRCRTYwRTcxMjQxNjAwMDM4ODU0IC8qIENh
Y2hlZFJlc291cmNlSGFuZGxlLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0
ZSwgKTsgfTsgfTsKIAkJRTQ3QjRCRTkwRTcxMjQxNjAwMDM4ODU0IC8qIENhY2hlZFJlc291cmNl
SGFuZGxlLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9
IEU0N0I0QkU3MEU3MTI0MTYwMDAzODg1NCAvKiBDYWNoZWRSZXNvdXJjZUhhbmRsZS5jcHAgKi87
IH07CisJCUU0N0UyNzY1MTYwMzZFRDIwMEVFMkFGQiAvKiBEb2N1bWVudFN0eWxlU2hlZXRDb2xs
ZWN0aW9uLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBF
NDdFMjc2NDE2MDM2RUQyMDBFRTJBRkIgLyogRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5o
ICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CisJCUU0N0Uy
NzY4MTYwMzZFREMwMEVFMkFGQiAvKiBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmNwcCBp
biBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEU0N0UyNzY3MTYw
MzZFREMwMEVFMkFGQiAvKiBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmNwcCAqLzsgfTsK
IAkJRTQ5NDZFQUUxNTZFNjRERDAwRDMyOTdGIC8qIFN0eWxlUnVsZUltcG9ydC5jcHAgaW4gU291
cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFNDk0NkVBQzE1NkU2NERE
MDBEMzI5N0YgLyogU3R5bGVSdWxlSW1wb3J0LmNwcCAqLzsgfTsKIAkJRTQ5NDZFQUYxNTZFNjRE
RDAwRDMyOTdGIC8qIFN0eWxlUnVsZUltcG9ydC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gRTQ5NDZFQUQxNTZFNjRERDAwRDMyOTdGIC8qIFN0eWxlUnVs
ZUltcG9ydC5oICovOyB9OwogCQlFNDlCRDlGQTEzMUZEMkVEMDAzQzU2RjAgLyogQ1NTVmFsdWVQ
b29sLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFNDlC
RDlGOTEzMUZEMkVEMDAzQzU2RjAgLyogQ1NTVmFsdWVQb29sLmggKi87IH07CkBAIC0xMzUyMCw2
ICsxMzUyMiw4IEBACiAJCUU0Nzc4QjdFMTE1QTU4MUEwMEI1RDM3MiAvKiBKU0N1c3RvbUV2ZW50
LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtu
b3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEpTQ3VzdG9tRXZlbnQuaDsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRTQ3QjRCRTYwRTcxMjQxNjAwMDM4ODU0IC8qIENh
Y2hlZFJlc291cmNlSGFuZGxlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVu
Y29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IENh
Y2hlZFJlc291cmNlSGFuZGxlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUU0N0I0
QkU3MEU3MTI0MTYwMDAzODg1NCAvKiBDYWNoZWRSZXNvdXJjZUhhbmRsZS5jcHAgKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUg
PSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBDYWNoZWRSZXNvdXJjZUhhbmRsZS5jcHA7IHNv
dXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUU0N0UyNzY0MTYwMzZFRDIwMEVFMkFGQiAvKiBE
b2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsg
cGF0aCA9IERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uaDsgc291cmNlVHJlZSA9ICI8Z3Jv
dXA+IjsgfTsKKwkJRTQ3RTI3NjcxNjAzNkVEQzAwRUUyQUZCIC8qIERvY3VtZW50U3R5bGVTaGVl
dENvbGxlY3Rpb24uY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGlu
ZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gRG9j
dW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07
CiAJCUU0OTQ2RUFDMTU2RTY0REQwMEQzMjk3RiAvKiBTdHlsZVJ1bGVJbXBvcnQuY3BwICovID0g
e2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVU
eXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gU3R5bGVSdWxlSW1wb3J0LmNwcDsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRTQ5NDZFQUQxNTZFNjRERDAwRDMyOTdGIC8qIFN0
eWxlUnVsZUltcG9ydC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGlu
ZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBTdHlsZVJ1
bGVJbXBvcnQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRTQ5QkQ5RjkxMzFGRDJF
RDAwM0M1NkYwIC8qIENTU1ZhbHVlUG9vbC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7
IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBh
dGggPSBDU1NWYWx1ZVBvb2wuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTIxNjcx
LDYgKzIxNjc1LDggQEAKIAkJCQkxNDk0N0ZGQzEyRjgwQ0QyMDBBMEY2MzEgLyogRG9jdW1lbnRP
cmRlcmVkTWFwLmggKi8sCiAJCQkJQThDMjI4MEQxMUQ0QTU5NzAwRDVBN0QzIC8qIERvY3VtZW50
UGFyc2VyLmNwcCAqLywKIAkJCQlCQ0NGQkFFNzBCNTE1MkVEMDAwMUYxRDcgLyogRG9jdW1lbnRQ
YXJzZXIuaCAqLywKKwkJCQlFNDdFMjc2NzE2MDM2RURDMDBFRTJBRkIgLyogRG9jdW1lbnRTdHls
ZVNoZWV0Q29sbGVjdGlvbi5jcHAgKi8sCisJCQkJRTQ3RTI3NjQxNjAzNkVEMjAwRUUyQUZCIC8q
IERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uaCAqLywKIAkJCQk4NkQ5ODJGNjEyNUMxNTQw
MDBBRDlFM0QgLyogRG9jdW1lbnRUaW1pbmcuaCAqLywKIAkJCQlBODE4NUYzMjA5NzY1NzY1MDA1
ODI2RDkgLyogRG9jdW1lbnRUeXBlLmNwcCAqLywKIAkJCQlBODE4NUYzMTA5NzY1NzY1MDA1ODI2
RDkgLyogRG9jdW1lbnRUeXBlLmggKi8sCkBAIC0yMjI3NSw2ICsyMjI4MSw3IEBACiAJCQlpc2Eg
PSBQQlhIZWFkZXJzQnVpbGRQaGFzZTsKIAkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7
CiAJCQlmaWxlcyA9ICgKKwkJCQlFNDdFMjc2NTE2MDM2RUQyMDBFRTJBRkIgLyogRG9jdW1lbnRT
dHlsZVNoZWV0Q29sbGVjdGlvbi5oIGluIEhlYWRlcnMgKi8sCiAJCQkJOTdCQzY5REIxNTA1RjA3
NjAwMUI3NEFDIC8qIEFic3RyYWN0RGF0YWJhc2UuaCBpbiBIZWFkZXJzICovLAogCQkJCTQxRTFC
MUQxMEZGNTk4NjkwMDU3NkIzQiAvKiBBYnN0cmFjdFdvcmtlci5oIGluIEhlYWRlcnMgKi8sCiAJ
CQkJMjlBODEyMkUwRkJCOUMxRDAwNTEwMjkzIC8qIEFjY2Vzc2liaWxpdHlBUklBR3JpZENlbGwu
aCBpbiBIZWFkZXJzICovLApAQCAtMjg2NjgsNiArMjg2NzUsNyBAQAogCQkJCUUxQkU1MTJEMENG
NkM1MTIwMDJFQTk1OSAvKiBYU0xUVW5pY29kZVNvcnQuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJ
OTc3RTJFMEUxMkYwRkM5QzAwQzEzMzc5IC8qIFhTU0F1ZGl0b3IuY3BwIGluIFNvdXJjZXMgKi8s
CiAJCQkJRkQ1MzczNTIxMzdCNjUxODAwMDA4RENFIC8qIFplcm9Qb2xlLmNwcCBpbiBTb3VyY2Vz
ICovLAorCQkJCUU0N0UyNzY4MTYwMzZFREMwMEVFMkFGQiAvKiBEb2N1bWVudFN0eWxlU2hlZXRD
b2xsZWN0aW9uLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTRGMUQxMUJGMTVGRjM3MjAwMDI2RTkw
OCAvKiBQbGF0Zm9ybU1lbW9yeUluc3RydW1lbnRhdGlvbi5jcHAgaW4gU291cmNlcyAqLywKIAkJ
CSk7CiAJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKSW5kZXg6IFNv
dXJjZS9XZWJDb3JlL2Nzcy9TZWxlY3RvckNoZWNrZXIuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJDb3JlL2Nzcy9TZWxlY3RvckNoZWNrZXIuY3BwCShyZXZpc2lvbiAxMjkzMDMpCisrKyBT
b3VyY2UvV2ViQ29yZS9jc3MvU2VsZWN0b3JDaGVja2VyLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MzEsNiArMzEsNyBAQAogI2luY2x1ZGUgIkNTU1NlbGVjdG9yLmgiCiAjaW5jbHVkZSAiQ1NTU2Vs
ZWN0b3JMaXN0LmgiCiAjaW5jbHVkZSAiRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJEb2N1bWVudFN0
eWxlU2hlZXRDb2xsZWN0aW9uLmgiCiAjaW5jbHVkZSAiRm9jdXNDb250cm9sbGVyLmgiCiAjaW5j
bHVkZSAiRnJhbWUuaCIKICNpbmNsdWRlICJGcmFtZVNlbGVjdGlvbi5oIgpAQCAtNzgzLDcgKzc4
NCw3IEBAIGJvb2wgU2VsZWN0b3JDaGVja2VyOjpjaGVja09uZVNlbGVjdG9yKGMKICAgICAgICAg
ICAgICAgICBpZiAobV9tb2RlID09IFJlc29sdmluZ1N0eWxlKSB7CiAgICAgICAgICAgICAgICAg
ICAgIGlmIChjb250ZXh0LmVsZW1lbnRTdHlsZSkKICAgICAgICAgICAgICAgICAgICAgICAgIGNv
bnRleHQuZWxlbWVudFN0eWxlLT5zZXRFbXB0eVN0YXRlKHJlc3VsdCk7Ci0gICAgICAgICAgICAg
ICAgICAgIGVsc2UgaWYgKGVsZW1lbnQtPnJlbmRlclN0eWxlKCkgJiYgKGVsZW1lbnQtPmRvY3Vt
ZW50KCktPnVzZXNTaWJsaW5nUnVsZXMoKSB8fCBlbGVtZW50LT5yZW5kZXJTdHlsZSgpLT51bmlx
dWUoKSkpCisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVsZW1lbnQtPnJlbmRlclN0eWxl
KCkgJiYgKGVsZW1lbnQtPmRvY3VtZW50KCktPnN0eWxlU2hlZXRDb2xsZWN0aW9uKCktPnVzZXNT
aWJsaW5nUnVsZXMoKSB8fCBlbGVtZW50LT5yZW5kZXJTdHlsZSgpLT51bmlxdWUoKSkpCiAgICAg
ICAgICAgICAgICAgICAgICAgICBlbGVtZW50LT5yZW5kZXJTdHlsZSgpLT5zZXRFbXB0eVN0YXRl
KHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiByZXN1
bHQ7CkBAIC0xMTg3LDcgKzExODgsNyBAQCBib29sIFNlbGVjdG9yQ2hlY2tlcjo6Y2hlY2tPbmVT
ZWxlY3RvcihjCiAgICAgICAgIFBzZXVkb0lkIHBzZXVkb0lkID0gQ1NTU2VsZWN0b3I6OnBzZXVk
b0lkKHNlbGVjdG9yLT5wc2V1ZG9UeXBlKCkpOwogICAgICAgICBpZiAocHNldWRvSWQgPT0gRklS
U1RfTEVUVEVSKSB7CiAgICAgICAgICAgICBpZiAoRG9jdW1lbnQqIGRvY3VtZW50ID0gZWxlbWVu
dC0+ZG9jdW1lbnQoKSkKLSAgICAgICAgICAgICAgICBkb2N1bWVudC0+c2V0VXNlc0ZpcnN0TGV0
dGVyUnVsZXModHJ1ZSk7CisgICAgICAgICAgICAgICAgZG9jdW1lbnQtPnN0eWxlU2hlZXRDb2xs
ZWN0aW9uKCktPnNldFVzZXNGaXJzdExldHRlclJ1bGVzKHRydWUpOwogICAgICAgICB9CiAgICAg
ICAgIGlmIChwc2V1ZG9JZCAhPSBOT1BTRVVETykKICAgICAgICAgICAgIGR5bmFtaWNQc2V1ZG8g
PSBwc2V1ZG9JZDsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2Nzcy9TdHlsZVJlc29sdmVyLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9jc3MvU3R5bGVSZXNvbHZlci5jcHAJKHJldmlz
aW9uIDEyOTMwMykKKysrIFNvdXJjZS9XZWJDb3JlL2Nzcy9TdHlsZVJlc29sdmVyLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtNjAsNiArNjAsNyBAQAogI2luY2x1ZGUgIkNvdW50ZXIuaCIKICNpbmNs
dWRlICJDb3VudGVyQ29udGVudC5oIgogI2luY2x1ZGUgIkN1cnNvckxpc3QuaCIKKyNpbmNsdWRl
ICJEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmgiCiAjaW5jbHVkZSAiRm9udEZlYXR1cmVW
YWx1ZS5oIgogI2luY2x1ZGUgIkZvbnRWYWx1ZS5oIgogI2luY2x1ZGUgIkZyYW1lLmgiCkBAIC00
MjgsMTIgKzQyOSwxMyBAQCBTdHlsZVJlc29sdmVyOjpTdHlsZVJlc29sdmVyKERvY3VtZW50KiBk
CiAgICAgLy8gTm90ZSB0aGF0IHRoZXJlIHVzdWFsbHkgaXMgb25seSAxIHNoZWV0IGZvciBzY29w
ZWQgcnVsZXMsIHNvIGF1dG8tc2hyaW5rLXRvLWZpdCBpcyBmaW5lLgogICAgIG1fYXV0aG9yU3R5
bGUtPmRpc2FibGVBdXRvU2hyaW5rVG9GaXQoKTsKIAorICAgIERvY3VtZW50U3R5bGVTaGVldENv
bGxlY3Rpb24qIHN0eWxlU2hlZXRDb2xsZWN0aW9uID0gZG9jdW1lbnQtPnN0eWxlU2hlZXRDb2xs
ZWN0aW9uKCk7CiAgICAgLy8gRklYTUU6IFRoaXMgc3Vja3MhIFRoZSB1c2VyIHNoZWV0IGlzIHJl
cGFyc2VkIGV2ZXJ5IHRpbWUhCiAgICAgT3duUHRyPFJ1bGVTZXQ+IHRlbXBVc2VyU3R5bGUgPSBS
dWxlU2V0OjpjcmVhdGUoKTsKLSAgICBpZiAoQ1NTU3R5bGVTaGVldCogcGFnZVVzZXJTaGVldCA9
IGRvY3VtZW50LT5wYWdlVXNlclNoZWV0KCkpCisgICAgaWYgKENTU1N0eWxlU2hlZXQqIHBhZ2VV
c2VyU2hlZXQgPSBzdHlsZVNoZWV0Q29sbGVjdGlvbi0+cGFnZVVzZXJTaGVldCgpKQogICAgICAg
ICB0ZW1wVXNlclN0eWxlLT5hZGRSdWxlc0Zyb21TaGVldChwYWdlVXNlclNoZWV0LT5jb250ZW50
cygpLCAqbV9tZWRpdW0sIHRoaXMpOwotICAgIGFkZEF1dGhvclJ1bGVzQW5kQ29sbGVjdFVzZXJS
dWxlc0Zyb21TaGVldHMoZG9jdW1lbnQtPnBhZ2VHcm91cFVzZXJTaGVldHMoKSwgKnRlbXBVc2Vy
U3R5bGUpOwotICAgIGFkZEF1dGhvclJ1bGVzQW5kQ29sbGVjdFVzZXJSdWxlc0Zyb21TaGVldHMo
ZG9jdW1lbnQtPmRvY3VtZW50VXNlclNoZWV0cygpLCAqdGVtcFVzZXJTdHlsZSk7CisgICAgYWRk
QXV0aG9yUnVsZXNBbmRDb2xsZWN0VXNlclJ1bGVzRnJvbVNoZWV0cyhzdHlsZVNoZWV0Q29sbGVj
dGlvbi0+cGFnZUdyb3VwVXNlclNoZWV0cygpLCAqdGVtcFVzZXJTdHlsZSk7CisgICAgYWRkQXV0
aG9yUnVsZXNBbmRDb2xsZWN0VXNlclJ1bGVzRnJvbVNoZWV0cyhzdHlsZVNoZWV0Q29sbGVjdGlv
bi0+ZG9jdW1lbnRVc2VyU2hlZXRzKCksICp0ZW1wVXNlclN0eWxlKTsKICAgICBpZiAodGVtcFVz
ZXJTdHlsZS0+bV9ydWxlQ291bnQgPiAwIHx8IHRlbXBVc2VyU3R5bGUtPm1fcGFnZVJ1bGVzLnNp
emUoKSA+IDApCiAgICAgICAgIG1fdXNlclN0eWxlID0gdGVtcFVzZXJTdHlsZS5yZWxlYXNlKCk7
CiAKQEAgLTQ0Nyw3ICs0NDksNyBAQCBTdHlsZVJlc29sdmVyOjpTdHlsZVJlc29sdmVyKERvY3Vt
ZW50KiBkCiAjZW5kaWYKIAogICAgIGFkZFN0eWxlc2hlZXRzRnJvbVNlYW1sZXNzUGFyZW50cygp
OwotICAgIGFwcGVuZEF1dGhvclN0eWxlc2hlZXRzKDAsIGRvY3VtZW50LT5zdHlsZVNoZWV0cygp
LT52ZWN0b3IoKSk7CisgICAgYXBwZW5kQXV0aG9yU3R5bGVzaGVldHMoMCwgc3R5bGVTaGVldENv
bGxlY3Rpb24tPmF1dGhvclN0eWxlU2hlZXRzKCktPnZlY3RvcigpKTsKIH0KIAogdm9pZCBTdHls
ZVJlc29sdmVyOjphZGRTdHlsZXNoZWV0c0Zyb21TZWFtbGVzc1BhcmVudHMoKQpAQCAtNzA4LDcg
KzcxMCw2IEBAIHZvaWQgU3R5bGVSZXNvbHZlcjo6c3dlZXBNYXRjaGVkUHJvcGVydGkKIFN0eWxl
UmVzb2x2ZXI6OkZlYXR1cmVzOjpGZWF0dXJlcygpCiAgICAgOiB1c2VzRmlyc3RMaW5lUnVsZXMo
ZmFsc2UpCiAgICAgLCB1c2VzQmVmb3JlQWZ0ZXJSdWxlcyhmYWxzZSkKLSAgICAsIHVzZXNMaW5r
UnVsZXMoZmFsc2UpCiB7CiB9CiAKQEAgLTcyOCw3ICs3MjksNiBAQCB2b2lkIFN0eWxlUmVzb2x2
ZXI6OkZlYXR1cmVzOjphZGQoY29uc3QgCiAgICAgdW5jb21tb25BdHRyaWJ1dGVSdWxlcy5hcHBl
bmQob3RoZXIudW5jb21tb25BdHRyaWJ1dGVSdWxlcyk7CiAgICAgdXNlc0ZpcnN0TGluZVJ1bGVz
ID0gdXNlc0ZpcnN0TGluZVJ1bGVzIHx8IG90aGVyLnVzZXNGaXJzdExpbmVSdWxlczsKICAgICB1
c2VzQmVmb3JlQWZ0ZXJSdWxlcyA9IHVzZXNCZWZvcmVBZnRlclJ1bGVzIHx8IG90aGVyLnVzZXNC
ZWZvcmVBZnRlclJ1bGVzOwotICAgIHVzZXNMaW5rUnVsZXMgPSB1c2VzTGlua1J1bGVzIHx8IG90
aGVyLnVzZXNMaW5rUnVsZXM7CiB9CiAKIHZvaWQgU3R5bGVSZXNvbHZlcjo6RmVhdHVyZXM6OmNs
ZWFyKCkKQEAgLTczOSw3ICs3MzksNiBAQCB2b2lkIFN0eWxlUmVzb2x2ZXI6OkZlYXR1cmVzOjpj
bGVhcigpCiAgICAgdW5jb21tb25BdHRyaWJ1dGVSdWxlcy5jbGVhcigpOwogICAgIHVzZXNGaXJz
dExpbmVSdWxlcyA9IGZhbHNlOwogICAgIHVzZXNCZWZvcmVBZnRlclJ1bGVzID0gZmFsc2U7Ci0g
ICAgdXNlc0xpbmtSdWxlcyA9IGZhbHNlOwogfQogCiB2b2lkIFN0eWxlUmVzb2x2ZXI6OkZlYXR1
cmVzOjpyZXBvcnRNZW1vcnlVc2FnZShNZW1vcnlPYmplY3RJbmZvKiBtZW1vcnlPYmplY3RJbmZv
KSBjb25zdApAQCAtMjYwNSwxMCArMjYwNCw2IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBjb2xsZWN0
RmVhdHVyZXNGcm9tU2UKICAgICBjYXNlIENTU1NlbGVjdG9yOjpQc2V1ZG9BZnRlcjoKICAgICAg
ICAgZmVhdHVyZXMudXNlc0JlZm9yZUFmdGVyUnVsZXMgPSB0cnVlOwogICAgICAgICBicmVhazsK
LSAgICBjYXNlIENTU1NlbGVjdG9yOjpQc2V1ZG9MaW5rOgotICAgIGNhc2UgQ1NTU2VsZWN0b3I6
OlBzZXVkb1Zpc2l0ZWQ6Ci0gICAgICAgIGZlYXR1cmVzLnVzZXNMaW5rUnVsZXMgPSB0cnVlOwot
ICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgICBicmVhazsKICAgICB9CkBAIC0z
MTgxLDI1ICszMTc2LDI1IEBAIHN0YXRpYyB2b2lkIGNvbGxlY3RDU1NPTVdyYXBwZXJzKEhhc2hN
YXAKICAgICBjb2xsZWN0Q1NTT01XcmFwcGVycyh3cmFwcGVyTWFwLCBzdHlsZVNoZWV0V3JhcHBl
ci5nZXQoKSk7CiB9CiAKLXN0YXRpYyB2b2lkIGNvbGxlY3RDU1NPTVdyYXBwZXJzKEhhc2hNYXA8
U3R5bGVSdWxlKiwgUmVmUHRyPENTU1N0eWxlUnVsZT4gPiYgd3JhcHBlck1hcCwgRG9jdW1lbnQq
IGRvY3VtZW50KQorc3RhdGljIHZvaWQgY29sbGVjdENTU09NV3JhcHBlcnMoSGFzaE1hcDxTdHls
ZVJ1bGUqLCBSZWZQdHI8Q1NTU3R5bGVSdWxlPiA+JiB3cmFwcGVyTWFwLCBEb2N1bWVudFN0eWxl
U2hlZXRDb2xsZWN0aW9uKiBzdHlsZVNoZWV0Q29sbGVjdGlvbikKIHsKLSAgICBjb25zdCBWZWN0
b3I8UmVmUHRyPFN0eWxlU2hlZXQ+ID4mIHN0eWxlU2hlZXRzID0gZG9jdW1lbnQtPnN0eWxlU2hl
ZXRzKCktPnZlY3RvcigpOworICAgIGNvbnN0IFZlY3RvcjxSZWZQdHI8U3R5bGVTaGVldD4gPiYg
c3R5bGVTaGVldHMgPSBzdHlsZVNoZWV0Q29sbGVjdGlvbi0+YXV0aG9yU3R5bGVTaGVldHMoKS0+
dmVjdG9yKCk7CiAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHN0eWxlU2hlZXRzLnNpemUo
KTsgKytpKSB7CiAgICAgICAgIFN0eWxlU2hlZXQqIHN0eWxlU2hlZXQgPSBzdHlsZVNoZWV0c1tp
XS5nZXQoKTsKICAgICAgICAgaWYgKCFzdHlsZVNoZWV0LT5pc0NTU1N0eWxlU2hlZXQoKSkKICAg
ICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICBjb2xsZWN0Q1NTT01XcmFwcGVycyh3cmFwcGVy
TWFwLCBzdGF0aWNfY2FzdDxDU1NTdHlsZVNoZWV0Kj4oc3R5bGVTaGVldCkpOwogICAgIH0KLSAg
ICBjb2xsZWN0Q1NTT01XcmFwcGVycyh3cmFwcGVyTWFwLCBkb2N1bWVudC0+cGFnZVVzZXJTaGVl
dCgpKTsKKyAgICBjb2xsZWN0Q1NTT01XcmFwcGVycyh3cmFwcGVyTWFwLCBzdHlsZVNoZWV0Q29s
bGVjdGlvbi0+cGFnZVVzZXJTaGVldCgpKTsKICAgICB7Ci0gICAgICAgIGNvbnN0IFZlY3RvcjxS
ZWZQdHI8Q1NTU3R5bGVTaGVldD4gPiogcGFnZUdyb3VwVXNlclNoZWV0cyA9IGRvY3VtZW50LT5w
YWdlR3JvdXBVc2VyU2hlZXRzKCk7CisgICAgICAgIGNvbnN0IFZlY3RvcjxSZWZQdHI8Q1NTU3R5
bGVTaGVldD4gPiogcGFnZUdyb3VwVXNlclNoZWV0cyA9IHN0eWxlU2hlZXRDb2xsZWN0aW9uLT5w
YWdlR3JvdXBVc2VyU2hlZXRzKCk7CiAgICAgICAgIGlmIChwYWdlR3JvdXBVc2VyU2hlZXRzKSB7
CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMCwgc2l6ZSA9IHBhZ2VHcm91cFVzZXJTaGVl
dHMtPnNpemUoKTsgaSA8IHNpemU7ICsraSkKICAgICAgICAgICAgICAgICBjb2xsZWN0Q1NTT01X
cmFwcGVycyh3cmFwcGVyTWFwLCBwYWdlR3JvdXBVc2VyU2hlZXRzLT5hdChpKS5nZXQoKSk7CiAg
ICAgICAgIH0KICAgICB9CiAgICAgewotICAgICAgICBjb25zdCBWZWN0b3I8UmVmUHRyPENTU1N0
eWxlU2hlZXQ+ID4qIGRvY3VtZW50VXNlclNoZWV0cyA9IGRvY3VtZW50LT5kb2N1bWVudFVzZXJT
aGVldHMoKTsKKyAgICAgICAgY29uc3QgVmVjdG9yPFJlZlB0cjxDU1NTdHlsZVNoZWV0PiA+KiBk
b2N1bWVudFVzZXJTaGVldHMgPSBzdHlsZVNoZWV0Q29sbGVjdGlvbi0+ZG9jdW1lbnRVc2VyU2hl
ZXRzKCk7CiAgICAgICAgIGlmIChkb2N1bWVudFVzZXJTaGVldHMpIHsKICAgICAgICAgICAgIGZv
ciAoc2l6ZV90IGkgPSAwLCBzaXplID0gZG9jdW1lbnRVc2VyU2hlZXRzLT5zaXplKCk7IGkgPCBz
aXplOyArK2kpCiAgICAgICAgICAgICAgICAgY29sbGVjdENTU09NV3JhcHBlcnMod3JhcHBlck1h
cCwgZG9jdW1lbnRVc2VyU2hlZXRzLT5hdChpKS5nZXQoKSk7CkBAIC0zMjE4LDcgKzMyMTMsNyBA
QCBDU1NTdHlsZVJ1bGUqIFN0eWxlUmVzb2x2ZXI6OmVuc3VyZUZ1bGxDCiAgICAgICAgIGNvbGxl
Y3RDU1NPTVdyYXBwZXJzKG1fc3R5bGVSdWxlVG9DU1NPTVdyYXBwZXJNYXAsIG1fc3R5bGVTaGVl
dENTU09NV3JhcHBlclNldCwgbWVkaWFDb250cm9sc1N0eWxlU2hlZXQpOwogICAgICAgICBjb2xs
ZWN0Q1NTT01XcmFwcGVycyhtX3N0eWxlUnVsZVRvQ1NTT01XcmFwcGVyTWFwLCBtX3N0eWxlU2hl
ZXRDU1NPTVdyYXBwZXJTZXQsIGZ1bGxzY3JlZW5TdHlsZVNoZWV0KTsKIAotICAgICAgICBjb2xs
ZWN0Q1NTT01XcmFwcGVycyhtX3N0eWxlUnVsZVRvQ1NTT01XcmFwcGVyTWFwLCBkb2N1bWVudCgp
KTsKKyAgICAgICAgY29sbGVjdENTU09NV3JhcHBlcnMobV9zdHlsZVJ1bGVUb0NTU09NV3JhcHBl
ck1hcCwgZG9jdW1lbnQoKS0+c3R5bGVTaGVldENvbGxlY3Rpb24oKSk7CiAgICAgfQogICAgIHJl
dHVybiBtX3N0eWxlUnVsZVRvQ1NTT01XcmFwcGVyTWFwLmdldChydWxlKS5nZXQoKTsKIH0KSW5k
ZXg6IFNvdXJjZS9XZWJDb3JlL2Nzcy9TdHlsZVJlc29sdmVyLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvY3NzL1N0eWxlUmVzb2x2ZXIuaAkocmV2aXNpb24gMTI5MzAzKQorKysgU291
cmNlL1dlYkNvcmUvY3NzL1N0eWxlUmVzb2x2ZXIuaAkod29ya2luZyBjb3B5KQpAQCAtMjQ0LDcg
KzI0NCw2IEBAIHB1YmxpYzoKICAgICBib29sIHVzZXNTaWJsaW5nUnVsZXMoKSBjb25zdCB7IHJl
dHVybiAhbV9mZWF0dXJlcy5zaWJsaW5nUnVsZXMuaXNFbXB0eSgpOyB9CiAgICAgYm9vbCB1c2Vz
Rmlyc3RMaW5lUnVsZXMoKSBjb25zdCB7IHJldHVybiBtX2ZlYXR1cmVzLnVzZXNGaXJzdExpbmVS
dWxlczsgfQogICAgIGJvb2wgdXNlc0JlZm9yZUFmdGVyUnVsZXMoKSBjb25zdCB7IHJldHVybiBt
X2ZlYXR1cmVzLnVzZXNCZWZvcmVBZnRlclJ1bGVzOyB9Ci0gICAgYm9vbCB1c2VzTGlua1J1bGVz
KCkgY29uc3QgeyByZXR1cm4gbV9mZWF0dXJlcy51c2VzTGlua1J1bGVzOyB9CiAKICAgICBzdGF0
aWMgYm9vbCBjcmVhdGVUcmFuc2Zvcm1PcGVyYXRpb25zKENTU1ZhbHVlKiBpblZhbHVlLCBSZW5k
ZXJTdHlsZSogaW5TdHlsZSwgUmVuZGVyU3R5bGUqIHJvb3RTdHlsZSwgVHJhbnNmb3JtT3BlcmF0
aW9ucyYgb3V0T3BlcmF0aW9ucyk7CiAgICAgCkBAIC0yOTcsNyArMjk2LDYgQEAgcHVibGljOgog
ICAgICAgICBWZWN0b3I8UnVsZUZlYXR1cmU+IHVuY29tbW9uQXR0cmlidXRlUnVsZXM7CiAgICAg
ICAgIGJvb2wgdXNlc0ZpcnN0TGluZVJ1bGVzOwogICAgICAgICBib29sIHVzZXNCZWZvcmVBZnRl
clJ1bGVzOwotICAgICAgICBib29sIHVzZXNMaW5rUnVsZXM7CiAgICAgfTsKIAogcHJpdmF0ZToK
SW5kZXg6IFNvdXJjZS9XZWJDb3JlL2RvbS9Eb2N1bWVudC5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvZG9tL0RvY3VtZW50LmNwcAkocmV2aXNpb24gMTI5MzAzKQorKysgU291cmNl
L1dlYkNvcmUvZG9tL0RvY3VtZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTcsNiArNTcsNyBA
QAogI2luY2x1ZGUgIkRvY3VtZW50RnJhZ21lbnQuaCIKICNpbmNsdWRlICJEb2N1bWVudExvYWRl
ci5oIgogI2luY2x1ZGUgIkRvY3VtZW50TWFya2VyQ29udHJvbGxlci5oIgorI2luY2x1ZGUgIkRv
Y3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uaCIKICNpbmNsdWRlICJEb2N1bWVudFR5cGUuaCIK
ICNpbmNsdWRlICJFZGl0aW5nVGV4dC5oIgogI2luY2x1ZGUgIkVkaXRvci5oIgpAQCAtNDM2LDgg
KzQzNyw3IEBAIERvY3VtZW50OjpEb2N1bWVudChGcmFtZSogZnJhbWUsIGNvbnN0IEsKICNpZiBF
TkFCTEUoTVVUQVRJT05fT0JTRVJWRVJTKQogICAgICwgbV9tdXRhdGlvbk9ic2VydmVyVHlwZXMo
MCkKICNlbmRpZgotICAgICwgbV9zdHlsZVNoZWV0cyhTdHlsZVNoZWV0TGlzdDo6Y3JlYXRlKHRo
aXMpKQotICAgICwgbV9oYWRBY3RpdmVMb2FkaW5nU3R5bGVzaGVldChmYWxzZSkKKyAgICAsIG1f
c3R5bGVTaGVldENvbGxlY3Rpb24oYWRvcHRQdHIobmV3IERvY3VtZW50U3R5bGVTaGVldENvbGxl
Y3Rpb24odGhpcykpKQogICAgICwgbV9yZWFkeVN0YXRlKENvbXBsZXRlKQogICAgICwgbV9zdHls
ZVJlY2FsY1RpbWVyKHRoaXMsICZEb2N1bWVudDo6c3R5bGVSZWNhbGNUaW1lckZpcmVkKQogICAg
ICwgbV9wZW5kaW5nU3R5bGVSZWNhbGNTaG91bGRGb3JjZShmYWxzZSkKQEAgLTUwMyw4ICs1MDMs
NiBAQCBEb2N1bWVudDo6RG9jdW1lbnQoRnJhbWUqIGZyYW1lLCBjb25zdCBLCiB7CiAgICAgbV9k
b2N1bWVudCA9IHRoaXM7CiAKLSAgICBtX3BhZ2VHcm91cFVzZXJTaGVldENhY2hlVmFsaWQgPSBm
YWxzZTsKLQogICAgIG1fcHJpbnRpbmcgPSBmYWxzZTsKICAgICBtX3BhZ2luYXRlZEZvclNjcmVl
biA9IGZhbHNlOwogCkBAIC01NDIsMjAgKzU0MCw5IEBAIERvY3VtZW50OjpEb2N1bWVudChGcmFt
ZSogZnJhbWUsIGNvbnN0IEsKICAgICBtX2luU3R5bGVSZWNhbGMgPSBmYWxzZTsKICAgICBtX2Ns
b3NlQWZ0ZXJTdHlsZVJlY2FsYyA9IGZhbHNlOwogCi0gICAgbV91c2VzU2libGluZ1J1bGVzID0g
ZmFsc2U7Ci0gICAgbV91c2VzU2libGluZ1J1bGVzT3ZlcnJpZGUgPSBmYWxzZTsKLSAgICBtX3Vz
ZXNGaXJzdExpbmVSdWxlcyA9IGZhbHNlOwotICAgIG1fdXNlc0ZpcnN0TGV0dGVyUnVsZXMgPSBm
YWxzZTsKLSAgICBtX3VzZXNCZWZvcmVBZnRlclJ1bGVzID0gZmFsc2U7Ci0gICAgbV91c2VzQmVm
b3JlQWZ0ZXJSdWxlc092ZXJyaWRlID0gZmFsc2U7Ci0gICAgbV91c2VzUmVtVW5pdHMgPSBmYWxz
ZTsKLSAgICBtX3VzZXNMaW5rUnVsZXMgPSBmYWxzZTsKLQogICAgIG1fZ290b0FuY2hvck5lZWRl
ZEFmdGVyU3R5bGVzaGVldHNMb2FkID0gZmFsc2U7CiAKICAgICBtX2RpZENhbGN1bGF0ZVN0eWxl
UmVzb2x2ZXIgPSBmYWxzZTsKLSAgICBtX2hhc0RpcnR5U3R5bGVSZXNvbHZlciA9IGZhbHNlOwot
ICAgIG1fcGVuZGluZ1N0eWxlc2hlZXRzID0gMDsKICAgICBtX2lnbm9yZVBlbmRpbmdTdHlsZXNo
ZWV0cyA9IGZhbHNlOwogICAgIG1fbmVlZHNOb3RpZnlSZW1vdmVBbGxQZW5kaW5nU3R5bGVzaGVl
dCA9IGZhbHNlOwogICAgIG1faGFzTm9kZXNXaXRoUGxhY2Vob2xkZXJTdHlsZSA9IGZhbHNlOwpA
QCAtNjQyLDI0ICs2MjksMTMgQEAgRG9jdW1lbnQ6On5Eb2N1bWVudCgpCiAKICAgICBtX2RlY29k
ZXIgPSAwOwogCi0gICAgaWYgKG1fc3R5bGVTaGVldHMpCi0gICAgICAgIG1fc3R5bGVTaGVldHMt
PmRvY3VtZW50RGVzdHJveWVkKCk7CisgICAgbV9zdHlsZVNoZWV0Q29sbGVjdGlvbi5jbGVhcigp
OwogCiAgICAgaWYgKG1fbmFtZWRGbG93cykKICAgICAgICAgbV9uYW1lZEZsb3dzLT5kb2N1bWVu
dERlc3Ryb3llZCgpOwogCiAgICAgaWYgKG1fZWxlbVNoZWV0KQogICAgICAgICBtX2VsZW1TaGVl
dC0+Y2xlYXJPd25lck5vZGUoKTsKLSAgICBpZiAobV9wYWdlVXNlclNoZWV0KQotICAgICAgICBt
X3BhZ2VVc2VyU2hlZXQtPmNsZWFyT3duZXJOb2RlKCk7Ci0gICAgaWYgKG1fcGFnZUdyb3VwVXNl
clNoZWV0cykgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fcGFnZUdyb3VwVXNl
clNoZWV0cy0+c2l6ZSgpOyArK2kpCi0gICAgICAgICAgICAoKm1fcGFnZUdyb3VwVXNlclNoZWV0
cylbaV0tPmNsZWFyT3duZXJOb2RlKCk7Ci0gICAgfQotICAgIGlmIChtX3VzZXJTaGVldHMpIHsK
LSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX3VzZXJTaGVldHMtPnNpemUoKTsgKytp
KQotICAgICAgICAgICAgKCptX3VzZXJTaGVldHMpW2ldLT5jbGVhck93bmVyTm9kZSgpOwotICAg
IH0KIAogICAgIGRlbGV0ZUN1c3RvbUZvbnRzKCk7CiAKQEAgLTgwMSwxNCArNzc3LDE0IEBAIHZv
aWQgRG9jdW1lbnQ6OnNldENvbXBhdGliaWxpdHlNb2RlKENvbXAKIHsKICAgICBpZiAobV9jb21w
YXRpYmlsaXR5TW9kZUxvY2tlZCB8fCBtb2RlID09IG1fY29tcGF0aWJpbGl0eU1vZGUpCiAgICAg
ICAgIHJldHVybjsKLSAgICBBU1NFUlQoIW1fc3R5bGVTaGVldHMtPmxlbmd0aCgpKTsKKyAgICBB
U1NFUlQoIW1fc3R5bGVTaGVldENvbGxlY3Rpb24tPmF1dGhvclN0eWxlU2hlZXRzKCktPmxlbmd0
aCgpKTsKICAgICBib29sIHdhc0luUXVpcmtzTW9kZSA9IGluUXVpcmtzTW9kZSgpOwogICAgIG1f
Y29tcGF0aWJpbGl0eU1vZGUgPSBtb2RlOwogICAgIHNlbGVjdG9yUXVlcnlDYWNoZSgpLT5pbnZh
bGlkYXRlKCk7CiAgICAgaWYgKGluUXVpcmtzTW9kZSgpICE9IHdhc0luUXVpcmtzTW9kZSkgewog
ICAgICAgICAvLyBBbGwgdXNlciBzdHlsZXNoZWV0cyBoYXZlIHRvIHJlcGFyc2UgdXNpbmcgdGhl
IGRpZmZlcmVudCBtb2RlLgotICAgICAgICBjbGVhclBhZ2VVc2VyU2hlZXQoKTsKLSAgICAgICAg
Y2xlYXJQYWdlR3JvdXBVc2VyU2hlZXRzKCk7CisgICAgICAgIG1fc3R5bGVTaGVldENvbGxlY3Rp
b24tPmNsZWFyUGFnZVVzZXJTaGVldCgpOworICAgICAgICBtX3N0eWxlU2hlZXRDb2xsZWN0aW9u
LT5jbGVhclBhZ2VHcm91cFVzZXJTaGVldHMoKTsKICAgICB9CiB9CiAKQEAgLTE4MjEsMTMgKzE3
OTcsMTMgQEAgdm9pZCBEb2N1bWVudDo6cmVjYWxjU3R5bGUoU3R5bGVDaGFuZ2UgYwogICAgIC8v
IHJlLWF0dGFjaGluZyBvdXIgY29udGFpbmluZyBpZnJhbWUsIHdoaWNoIHdoZW4gYXNrZWQgSFRN
TEZyYW1lRWxlbWVudEJhc2U6OmlzVVJMQWxsb3dlZAogICAgIC8vIGhpdHMgYSBudWxsLWRlcmVm
ZXJlbmNlIGR1ZSB0byBzZWN1cml0eSBjb2RlIGFsd2F5cyBhc3N1bWluZyB0aGUgZG9jdW1lbnQg
aGFzIGEgU2VjdXJpdHlPcmlnaW4uCiAKLSAgICBpZiAobV9oYXNEaXJ0eVN0eWxlUmVzb2x2ZXIp
Ci0gICAgICAgIHVwZGF0ZUFjdGl2ZVN0eWxlc2hlZXRzKFJlY2FsY1N0eWxlSW1tZWRpYXRlbHkp
OworICAgIGlmIChtX3N0eWxlU2hlZXRDb2xsZWN0aW9uLT5uZWVkc1VwZGF0ZUFjdGl2ZVN0eWxl
c2hlZXRzT25TdHlsZVJlY2FsYygpKQorICAgICAgICBtX3N0eWxlU2hlZXRDb2xsZWN0aW9uLT51
cGRhdGVBY3RpdmVTdHlsZVNoZWV0cyhEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjpGdWxs
VXBkYXRlKTsKIAogICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSBjb29raWUgPSBJ
bnNwZWN0b3JJbnN0cnVtZW50YXRpb246OndpbGxSZWNhbGN1bGF0ZVN0eWxlKHRoaXMpOwogCiAg
ICAgaWYgKG1fZWxlbVNoZWV0ICYmIG1fZWxlbVNoZWV0LT5jb250ZW50cygpLT51c2VzUmVtVW5p
dHMoKSkKLSAgICAgICAgbV91c2VzUmVtVW5pdHMgPSB0cnVlOworICAgICAgICBtX3N0eWxlU2hl
ZXRDb2xsZWN0aW9uLT5zZXRVc2VzUmVtVW5pdCh0cnVlKTsKIAogICAgIG1faW5TdHlsZVJlY2Fs
YyA9IHRydWU7CiAgICAgc3VzcGVuZFBvc3RBdHRhY2hDYWxsYmFja3MoKTsKQEAgLTE4ODMsNyAr
MTg1OSw3IEBAIGJhaWxfb3V0OgogICAgIAogICAgIC8vIFBzZXVkbyBlbGVtZW50IHJlbW92YWwg
YW5kIHNpbWlsYXIgbWF5IG9ubHkgd29yayB3aXRoIHRoZXNlIGZsYWdzIHN0aWxsIHNldC4gUmVz
ZXQgdGhlbSBhZnRlciB0aGUgc3R5bGUgcmVjYWxjLgogICAgIGlmIChtX3N0eWxlUmVzb2x2ZXIp
Ci0gICAgICAgIHJlc2V0Q1NTRmVhdHVyZUZsYWdzKCk7CisgICAgICAgIG1fc3R5bGVTaGVldENv
bGxlY3Rpb24tPnJlc2V0Q1NTRmVhdHVyZUZsYWdzKCk7CiAKICAgICBpZiAoZnJhbWVWaWV3KSB7
CiAgICAgICAgIGZyYW1lVmlldy0+cmVzdW1lU2NoZWR1bGVkRXZlbnRzKCk7CkBAIC0yMDY2LDMz
ICsyMDQyLDE2IEBAIHZvaWQgRG9jdW1lbnQ6OnNldElzVmlld1NvdXJjZShib29sIGlzVmkKICAg
ICBkaWRVcGRhdGVTZWN1cml0eU9yaWdpbigpOwogfQogCi12b2lkIERvY3VtZW50Ojpjb21iaW5l
Q1NTRmVhdHVyZUZsYWdzKCkKLXsKLSAgICAvLyBEZWxheSByZXNldHRpbmcgdGhlIGZsYWdzIHVu
dGlsIGFmdGVyIG5leHQgc3R5bGUgcmVjYWxjIHNpbmNlIHVuYXBwbHlpbmcgdGhlIHN0eWxlIG1h
eSBub3Qgd29yayB3aXRob3V0IHRoZXNlIHNldCAodGhpcyBpcyB0cnVlIGF0IGxlYXN0IHdpdGgg
YmVmb3JlL2FmdGVyKS4KLSAgICBtX3VzZXNTaWJsaW5nUnVsZXMgPSBtX3VzZXNTaWJsaW5nUnVs
ZXMgfHwgbV9zdHlsZVJlc29sdmVyLT51c2VzU2libGluZ1J1bGVzKCk7Ci0gICAgbV91c2VzRmly
c3RMaW5lUnVsZXMgPSBtX3VzZXNGaXJzdExpbmVSdWxlcyB8fCBtX3N0eWxlUmVzb2x2ZXItPnVz
ZXNGaXJzdExpbmVSdWxlcygpOwotICAgIG1fdXNlc0JlZm9yZUFmdGVyUnVsZXMgPSBtX3VzZXNC
ZWZvcmVBZnRlclJ1bGVzIHx8IG1fc3R5bGVSZXNvbHZlci0+dXNlc0JlZm9yZUFmdGVyUnVsZXMo
KTsKLSAgICBtX3VzZXNMaW5rUnVsZXMgPSBtX3VzZXNMaW5rUnVsZXMgfHwgbV9zdHlsZVJlc29s
dmVyLT51c2VzTGlua1J1bGVzKCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnJlc2V0Q1NTRmVhdHVy
ZUZsYWdzKCkKLXsKLSAgICBtX3VzZXNTaWJsaW5nUnVsZXMgPSBtX3N0eWxlUmVzb2x2ZXItPnVz
ZXNTaWJsaW5nUnVsZXMoKTsKLSAgICBtX3VzZXNGaXJzdExpbmVSdWxlcyA9IG1fc3R5bGVSZXNv
bHZlci0+dXNlc0ZpcnN0TGluZVJ1bGVzKCk7Ci0gICAgbV91c2VzQmVmb3JlQWZ0ZXJSdWxlcyA9
IG1fc3R5bGVSZXNvbHZlci0+dXNlc0JlZm9yZUFmdGVyUnVsZXMoKTsKLSAgICBtX3VzZXNMaW5r
UnVsZXMgPSBtX3N0eWxlUmVzb2x2ZXItPnVzZXNMaW5rUnVsZXMoKTsKLX0KLQogdm9pZCBEb2N1
bWVudDo6Y3JlYXRlU3R5bGVSZXNvbHZlcigpCiB7CiAgICAgYm9vbCBtYXRjaEF1dGhvckFuZFVz
ZXJTdHlsZXMgPSB0cnVlOwogICAgIGlmIChTZXR0aW5ncyogZG9jU2V0dGluZ3MgPSBzZXR0aW5n
cygpKQogICAgICAgICBtYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMgPSBkb2NTZXR0aW5ncy0+YXV0
aG9yQW5kVXNlclN0eWxlc0VuYWJsZWQoKTsKICAgICBtX3N0eWxlUmVzb2x2ZXIgPSBhZG9wdFB0
cihuZXcgU3R5bGVSZXNvbHZlcih0aGlzLCBtYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpKTsKLSAg
ICBjb21iaW5lQ1NTRmVhdHVyZUZsYWdzKCk7CisgICAgbV9zdHlsZVNoZWV0Q29sbGVjdGlvbi0+
Y29tYmluZUNTU0ZlYXR1cmVGbGFncygpOwogfQogCi1pbmxpbmUgdm9pZCBEb2N1bWVudDo6Y2xl
YXJTdHlsZVJlc29sdmVyKCkKK3ZvaWQgRG9jdW1lbnQ6OmNsZWFyU3R5bGVSZXNvbHZlcigpCiB7
CiAgICAgbV9zdHlsZVJlc29sdmVyLmNsZWFyKCk7CiB9CkBAIC0yOTAyLDEwNSArMjg2MSwyMyBA
QCBGcmFtZSogRG9jdW1lbnQ6OmZpbmRVbnNhZmVQYXJlbnRTY3JvbGxQCiAgICAgcmV0dXJuIDA7
CiB9CiAKLUNTU1N0eWxlU2hlZXQqIERvY3VtZW50OjpwYWdlVXNlclNoZWV0KCkKLXsKLSAgICBp
ZiAobV9wYWdlVXNlclNoZWV0KQotICAgICAgICByZXR1cm4gbV9wYWdlVXNlclNoZWV0LmdldCgp
OwotICAgIAotICAgIFBhZ2UqIG93bmluZ1BhZ2UgPSBwYWdlKCk7Ci0gICAgaWYgKCFvd25pbmdQ
YWdlKQotICAgICAgICByZXR1cm4gMDsKLSAgICAKLSAgICBTdHJpbmcgdXNlclNoZWV0VGV4dCA9
IG93bmluZ1BhZ2UtPnVzZXJTdHlsZVNoZWV0KCk7Ci0gICAgaWYgKHVzZXJTaGVldFRleHQuaXNF
bXB0eSgpKQotICAgICAgICByZXR1cm4gMDsKLSAgICAKLSAgICAvLyBQYXJzZSB0aGUgc2hlZXQg
YW5kIGNhY2hlIGl0LgotICAgIG1fcGFnZVVzZXJTaGVldCA9IENTU1N0eWxlU2hlZXQ6OmNyZWF0
ZUlubGluZSh0aGlzLCBzZXR0aW5ncygpLT51c2VyU3R5bGVTaGVldExvY2F0aW9uKCkpOwotICAg
IG1fcGFnZVVzZXJTaGVldC0+Y29udGVudHMoKS0+c2V0SXNVc2VyU3R5bGVTaGVldCh0cnVlKTsK
LSAgICBtX3BhZ2VVc2VyU2hlZXQtPmNvbnRlbnRzKCktPnBhcnNlU3RyaW5nKHVzZXJTaGVldFRl
eHQpOwotICAgIHJldHVybiBtX3BhZ2VVc2VyU2hlZXQuZ2V0KCk7Ci19Ci0KLXZvaWQgRG9jdW1l
bnQ6OmNsZWFyUGFnZVVzZXJTaGVldCgpCi17Ci0gICAgaWYgKG1fcGFnZVVzZXJTaGVldCkgewot
ICAgICAgICBtX3BhZ2VVc2VyU2hlZXQgPSAwOwotICAgICAgICBzdHlsZVJlc29sdmVyQ2hhbmdl
ZChEZWZlclJlY2FsY1N0eWxlKTsKLSAgICB9Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnVwZGF0ZVBh
Z2VVc2VyU2hlZXQoKQotewotICAgIGNsZWFyUGFnZVVzZXJTaGVldCgpOwotICAgIGlmIChwYWdl
VXNlclNoZWV0KCkpCi0gICAgICAgIHN0eWxlUmVzb2x2ZXJDaGFuZ2VkKFJlY2FsY1N0eWxlSW1t
ZWRpYXRlbHkpOwotfQogCi1jb25zdCBWZWN0b3I8UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4qIERv
Y3VtZW50OjpwYWdlR3JvdXBVc2VyU2hlZXRzKCkgY29uc3QKK3ZvaWQgRG9jdW1lbnQ6OnNlYW1s
ZXNzUGFyZW50VXBkYXRlZFN0eWxlc2hlZXRzKCkKIHsKLSAgICBpZiAobV9wYWdlR3JvdXBVc2Vy
U2hlZXRDYWNoZVZhbGlkKQotICAgICAgICByZXR1cm4gbV9wYWdlR3JvdXBVc2VyU2hlZXRzLmdl
dCgpOwotICAgIAotICAgIG1fcGFnZUdyb3VwVXNlclNoZWV0Q2FjaGVWYWxpZCA9IHRydWU7Ci0g
ICAgCi0gICAgUGFnZSogb3duaW5nUGFnZSA9IHBhZ2UoKTsKLSAgICBpZiAoIW93bmluZ1BhZ2Up
Ci0gICAgICAgIHJldHVybiAwOwotICAgICAgICAKLSAgICBjb25zdCBQYWdlR3JvdXAmIHBhZ2VH
cm91cCA9IG93bmluZ1BhZ2UtPmdyb3VwKCk7Ci0gICAgY29uc3QgVXNlclN0eWxlU2hlZXRNYXAq
IHNoZWV0c01hcCA9IHBhZ2VHcm91cC51c2VyU3R5bGVTaGVldHMoKTsKLSAgICBpZiAoIXNoZWV0
c01hcCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBVc2VyU3R5bGVTaGVldE1hcDo6Y29uc3Rf
aXRlcmF0b3IgZW5kID0gc2hlZXRzTWFwLT5lbmQoKTsKLSAgICBmb3IgKFVzZXJTdHlsZVNoZWV0
TWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IHNoZWV0c01hcC0+YmVnaW4oKTsgaXQgIT0gZW5kOyAr
K2l0KSB7Ci0gICAgICAgIGNvbnN0IFVzZXJTdHlsZVNoZWV0VmVjdG9yKiBzaGVldHMgPSBpdC0+
c2Vjb25kLmdldCgpOwotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2hlZXRzLT5z
aXplKCk7ICsraSkgewotICAgICAgICAgICAgY29uc3QgVXNlclN0eWxlU2hlZXQqIHNoZWV0ID0g
c2hlZXRzLT5hdChpKS5nZXQoKTsKLSAgICAgICAgICAgIGlmIChzaGVldC0+aW5qZWN0ZWRGcmFt
ZXMoKSA9PSBJbmplY3RJblRvcEZyYW1lT25seSAmJiBvd25lckVsZW1lbnQoKSkKLSAgICAgICAg
ICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGlmICghVXNlckNvbnRlbnRVUkxQYXR0ZXJu
OjptYXRjaGVzUGF0dGVybnModXJsKCksIHNoZWV0LT53aGl0ZWxpc3QoKSwgc2hlZXQtPmJsYWNr
bGlzdCgpKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIFJlZlB0cjxD
U1NTdHlsZVNoZWV0PiBncm91cFNoZWV0ID0gQ1NTU3R5bGVTaGVldDo6Y3JlYXRlSW5saW5lKGNv
bnN0X2Nhc3Q8RG9jdW1lbnQqPih0aGlzKSwgc2hlZXQtPnVybCgpKTsKLSAgICAgICAgICAgIGlm
ICghbV9wYWdlR3JvdXBVc2VyU2hlZXRzKQotICAgICAgICAgICAgICAgIG1fcGFnZUdyb3VwVXNl
clNoZWV0cyA9IGFkb3B0UHRyKG5ldyBWZWN0b3I8UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4pOwot
ICAgICAgICAgICAgbV9wYWdlR3JvdXBVc2VyU2hlZXRzLT5hcHBlbmQoZ3JvdXBTaGVldCk7Ci0g
ICAgICAgICAgICBncm91cFNoZWV0LT5jb250ZW50cygpLT5zZXRJc1VzZXJTdHlsZVNoZWV0KHNo
ZWV0LT5sZXZlbCgpID09IFVzZXJTdHlsZVVzZXJMZXZlbCk7Ci0gICAgICAgICAgICBncm91cFNo
ZWV0LT5jb250ZW50cygpLT5wYXJzZVN0cmluZyhzaGVldC0+c291cmNlKCkpOwotICAgICAgICB9
Ci0gICAgfQotCi0gICAgcmV0dXJuIG1fcGFnZUdyb3VwVXNlclNoZWV0cy5nZXQoKTsKKyAgICBz
dHlsZVJlc29sdmVyQ2hhbmdlZChSZWNhbGNTdHlsZUltbWVkaWF0ZWx5KTsKIH0KIAotdm9pZCBE
b2N1bWVudDo6Y2xlYXJQYWdlR3JvdXBVc2VyU2hlZXRzKCkKK3ZvaWQgRG9jdW1lbnQ6OmRpZFJl
bW92ZUFsbFBlbmRpbmdTdHlsZXNoZWV0KCkKIHsKLSAgICBtX3BhZ2VHcm91cFVzZXJTaGVldENh
Y2hlVmFsaWQgPSBmYWxzZTsKLSAgICBpZiAobV9wYWdlR3JvdXBVc2VyU2hlZXRzICYmIG1fcGFn
ZUdyb3VwVXNlclNoZWV0cy0+c2l6ZSgpKSB7Ci0gICAgICAgIG1fcGFnZUdyb3VwVXNlclNoZWV0
cy0+Y2xlYXIoKTsKLSAgICAgICAgc3R5bGVSZXNvbHZlckNoYW5nZWQoRGVmZXJSZWNhbGNTdHls
ZSk7Ci0gICAgfQotfQorICAgIG1fbmVlZHNOb3RpZnlSZW1vdmVBbGxQZW5kaW5nU3R5bGVzaGVl
dCA9IGZhbHNlOwogCi12b2lkIERvY3VtZW50Ojp1cGRhdGVQYWdlR3JvdXBVc2VyU2hlZXRzKCkK
LXsKLSAgICBjbGVhclBhZ2VHcm91cFVzZXJTaGVldHMoKTsKLSAgICBpZiAocGFnZUdyb3VwVXNl
clNoZWV0cygpICYmIHBhZ2VHcm91cFVzZXJTaGVldHMoKS0+c2l6ZSgpKQotICAgICAgICBzdHls
ZVJlc29sdmVyQ2hhbmdlZChSZWNhbGNTdHlsZUltbWVkaWF0ZWx5KTsKLX0KKyAgICBzdHlsZVJl
c29sdmVyQ2hhbmdlZChSZWNhbGNTdHlsZUlmTmVlZGVkKTsKIAotdm9pZCBEb2N1bWVudDo6YWRk
VXNlclNoZWV0KFBhc3NSZWZQdHI8U3R5bGVTaGVldENvbnRlbnRzPiB1c2VyU2hlZXQpCi17Ci0g
ICAgaWYgKCFtX3VzZXJTaGVldHMpCi0gICAgICAgIG1fdXNlclNoZWV0cyA9IGFkb3B0UHRyKG5l
dyBWZWN0b3I8UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4pOwotICAgIG1fdXNlclNoZWV0cy0+YXBw
ZW5kKENTU1N0eWxlU2hlZXQ6OmNyZWF0ZSh1c2VyU2hlZXQsIHRoaXMpKTsKLSAgICBzdHlsZVJl
c29sdmVyQ2hhbmdlZChSZWNhbGNTdHlsZUltbWVkaWF0ZWx5KTsKLX0KKyAgICBpZiAoU2NyaXB0
YWJsZURvY3VtZW50UGFyc2VyKiBwYXJzZXIgPSBzY3JpcHRhYmxlRG9jdW1lbnRQYXJzZXIoKSkK
KyAgICAgICAgcGFyc2VyLT5leGVjdXRlU2NyaXB0c1dhaXRpbmdGb3JTdHlsZXNoZWV0cygpOwog
Ci12b2lkIERvY3VtZW50OjpzZWFtbGVzc1BhcmVudFVwZGF0ZWRTdHlsZXNoZWV0cygpCi17Ci0g
ICAgc3R5bGVSZXNvbHZlckNoYW5nZWQoUmVjYWxjU3R5bGVJbW1lZGlhdGVseSk7CisgICAgaWYg
KG1fZ290b0FuY2hvck5lZWRlZEFmdGVyU3R5bGVzaGVldHNMb2FkICYmIHZpZXcoKSkKKyAgICAg
ICAgdmlldygpLT5zY3JvbGxUb0ZyYWdtZW50KG1fdXJsKTsKIH0KIAogQ1NTU3R5bGVTaGVldCog
RG9jdW1lbnQ6OmVsZW1lbnRTaGVldCgpCkBAIC0zMDQxLDggKzI5MTgsOCBAQCB2b2lkIERvY3Vt
ZW50Ojpwcm9jZXNzSHR0cEVxdWl2KGNvbnN0IFN0CiAgICAgICAgIC8vIEZvciBtb3JlIGluZm8s
IHNlZSB0aGUgdGVzdCBhdDoKICAgICAgICAgLy8gaHR0cDovL3d3dy5oaXhpZS5jaC90ZXN0cy9l
dmlsL2Nzcy9pbXBvcnQvbWFpbi9wcmVmZXJyZWQuaHRtbAogICAgICAgICAvLyAtZHdoCi0gICAg
ICAgIG1fc2VsZWN0ZWRTdHlsZXNoZWV0U2V0ID0gY29udGVudDsKLSAgICAgICAgbV9wcmVmZXJy
ZWRTdHlsZXNoZWV0U2V0ID0gY29udGVudDsKKyAgICAgICAgbV9zdHlsZVNoZWV0Q29sbGVjdGlv
bi0+c2V0U2VsZWN0ZWRTdHlsZXNoZWV0U2V0TmFtZShjb250ZW50KTsKKyAgICAgICAgbV9zdHls
ZVNoZWV0Q29sbGVjdGlvbi0+c2V0UHJlZmVycmVkU3R5bGVzaGVldFNldE5hbWUoY29udGVudCk7
CiAgICAgICAgIHN0eWxlUmVzb2x2ZXJDaGFuZ2VkKERlZmVyUmVjYWxjU3R5bGUpOwogICAgIH0g
ZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoZXF1aXYsICJyZWZyZXNoIikpIHsKICAgICAgICAg
ZG91YmxlIGRlbGF5OwpAQCAtMzMxNCw2MyArMzE5MSwyNSBAQCBQYXNzUmVmUHRyPE5vZGU+IERv
Y3VtZW50OjpjbG9uZU5vZGUoYm9vCiAKIFN0eWxlU2hlZXRMaXN0KiBEb2N1bWVudDo6c3R5bGVT
aGVldHMoKQogewotICAgIHJldHVybiBtX3N0eWxlU2hlZXRzLmdldCgpOworICAgIHJldHVybiBt
X3N0eWxlU2hlZXRDb2xsZWN0aW9uLT5hdXRob3JTdHlsZVNoZWV0cygpOwogfQogCiBTdHJpbmcg
RG9jdW1lbnQ6OnByZWZlcnJlZFN0eWxlc2hlZXRTZXQoKSBjb25zdAogewotICAgIHJldHVybiBt
X3ByZWZlcnJlZFN0eWxlc2hlZXRTZXQ7CisgICAgcmV0dXJuIG1fc3R5bGVTaGVldENvbGxlY3Rp
b24tPnByZWZlcnJlZFN0eWxlc2hlZXRTZXROYW1lKCk7CiB9CiAKIFN0cmluZyBEb2N1bWVudDo6
c2VsZWN0ZWRTdHlsZXNoZWV0U2V0KCkgY29uc3QKIHsKLSAgICByZXR1cm4gbV9zZWxlY3RlZFN0
eWxlc2hlZXRTZXQ7CisgICAgcmV0dXJuIG1fc3R5bGVTaGVldENvbGxlY3Rpb24tPnNlbGVjdGVk
U3R5bGVzaGVldFNldE5hbWUoKTsKIH0KIAogdm9pZCBEb2N1bWVudDo6c2V0U2VsZWN0ZWRTdHls
ZXNoZWV0U2V0KGNvbnN0IFN0cmluZyYgYVN0cmluZykKIHsKLSAgICBtX3NlbGVjdGVkU3R5bGVz
aGVldFNldCA9IGFTdHJpbmc7CisgICAgbV9zdHlsZVNoZWV0Q29sbGVjdGlvbi0+c2V0U2VsZWN0
ZWRTdHlsZXNoZWV0U2V0TmFtZShhU3RyaW5nKTsKICAgICBzdHlsZVJlc29sdmVyQ2hhbmdlZChE
ZWZlclJlY2FsY1N0eWxlKTsKIH0KIAotLy8gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW5ldmVy
IGEgdG9wLWxldmVsIHN0eWxlc2hlZXQgaGFzIGZpbmlzaGVkIGxvYWRpbmcuCi12b2lkIERvY3Vt
ZW50OjpyZW1vdmVQZW5kaW5nU2hlZXQoUmVtb3ZlUGVuZGluZ1NoZWV0Tm90aWZpY2F0aW9uVHlw
ZSBub3RpZmljYXRpb24pCi17Ci0gICAgLy8gTWFrZSBzdXJlIHdlIGtuZXcgdGhpcyBzaGVldCB3
YXMgcGVuZGluZywgYW5kIHRoYXQgb3VyIGNvdW50IGlzbid0IG91dCBvZiBzeW5jLgotICAgIEFT
U0VSVChtX3BlbmRpbmdTdHlsZXNoZWV0cyA+IDApOwotCi0gICAgbV9wZW5kaW5nU3R5bGVzaGVl
dHMtLTsKLSAgICAKLSNpZmRlZiBJTlNUUlVNRU5UX0xBWU9VVF9TQ0hFRFVMSU5HCi0gICAgaWYg
KCFvd25lckVsZW1lbnQoKSkKLSAgICAgICAgcHJpbnRmKCJTdHlsZXNoZWV0IGxvYWRlZCBhdCB0
aW1lICVkLiAlZCBzdHlsZXNoZWV0cyBzdGlsbCByZW1haW4uXG4iLCBlbGFwc2VkVGltZSgpLCBt
X3BlbmRpbmdTdHlsZXNoZWV0cyk7Ci0jZW5kaWYKLQotICAgIGlmIChtX3BlbmRpbmdTdHlsZXNo
ZWV0cykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKG5vdGlmaWNhdGlvbiA9PSBSZW1vdmVQ
ZW5kaW5nU2hlZXROb3RpZnlMYXRlcikgewotICAgICAgICBzZXROZWVkc05vdGlmeVJlbW92ZUFs
bFBlbmRpbmdTdHlsZXNoZWV0KCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0gICAg
ZGlkUmVtb3ZlQWxsUGVuZGluZ1N0eWxlc2hlZXQoKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6ZGlk
UmVtb3ZlQWxsUGVuZGluZ1N0eWxlc2hlZXQoKQotewotICAgIG1fbmVlZHNOb3RpZnlSZW1vdmVB
bGxQZW5kaW5nU3R5bGVzaGVldCA9IGZhbHNlOwotCi0gICAgc3R5bGVSZXNvbHZlckNoYW5nZWQo
UmVjYWxjU3R5bGVJZk5lZWRlZCk7Ci0KLSAgICBpZiAoU2NyaXB0YWJsZURvY3VtZW50UGFyc2Vy
KiBwYXJzZXIgPSBzY3JpcHRhYmxlRG9jdW1lbnRQYXJzZXIoKSkKLSAgICAgICAgcGFyc2VyLT5l
eGVjdXRlU2NyaXB0c1dhaXRpbmdGb3JTdHlsZXNoZWV0cygpOwotCi0gICAgaWYgKG1fZ290b0Fu
Y2hvck5lZWRlZEFmdGVyU3R5bGVzaGVldHNMb2FkICYmIHZpZXcoKSkKLSAgICAgICAgdmlldygp
LT5zY3JvbGxUb0ZyYWdtZW50KG1fdXJsKTsKLX0KLQotCiB2b2lkIERvY3VtZW50OjpldmFsdWF0
ZU1lZGlhUXVlcnlMaXN0KCkKIHsKICAgICBpZiAobV9tZWRpYVF1ZXJ5TWF0Y2hlcikKQEAgLTMz
ODUsMjAgKzMyMjQsMjQgQEAgdm9pZCBEb2N1bWVudDo6c3R5bGVSZXNvbHZlckNoYW5nZWQoU3R5
bAogICAgICAgICBtX3N0eWxlUmVzb2x2ZXIuY2xlYXIoKTsKICAgICAgICAgcmV0dXJuOwogICAg
IH0KKyAgICBtX2RpZENhbGN1bGF0ZVN0eWxlUmVzb2x2ZXIgPSB0cnVlOwogCiAjaWZkZWYgSU5T
VFJVTUVOVF9MQVlPVVRfU0NIRURVTElORwogICAgIGlmICghb3duZXJFbGVtZW50KCkpCiAgICAg
ICAgIHByaW50ZigiQmVnaW5uaW5nIHVwZGF0ZSBvZiBzdHlsZSBzZWxlY3RvciBhdCB0aW1lICVk
LlxuIiwgZWxhcHNlZFRpbWUoKSk7CiAjZW5kaWYKIAotICAgIGJvb2wgc3R5bGVzaGVldENoYW5n
ZVJlcXVpcmVzU3R5bGVSZWNhbGMgPSB1cGRhdGVBY3RpdmVTdHlsZXNoZWV0cyh1cGRhdGVGbGFn
KTsKKyAgICBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjpVcGRhdGVGbGFnIHN0eWxlU2hl
ZXRVcGRhdGUgPSAodXBkYXRlRmxhZyA9PSBSZWNhbGNTdHlsZUlmTmVlZGVkKQorICAgICAgICA/
IERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246Ok9wdGltaXplZFVwZGF0ZQorICAgICAgICA6
IERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OkZ1bGxVcGRhdGU7CisgICAgYm9vbCBzdHls
ZXNoZWV0Q2hhbmdlUmVxdWlyZXNTdHlsZVJlY2FsYyA9IG1fc3R5bGVTaGVldENvbGxlY3Rpb24t
PnVwZGF0ZUFjdGl2ZVN0eWxlU2hlZXRzKHN0eWxlU2hlZXRVcGRhdGUpOwogCiAgICAgaWYgKHVw
ZGF0ZUZsYWcgPT0gRGVmZXJSZWNhbGNTdHlsZSkgewogICAgICAgICBzY2hlZHVsZUZvcmNlZFN0
eWxlUmVjYWxjKCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBpZiAoZGlkTGF5b3V0
V2l0aFBlbmRpbmdTdHlsZXNoZWV0cygpICYmIG1fcGVuZGluZ1N0eWxlc2hlZXRzIDw9IDApIHsK
KyAgICBpZiAoZGlkTGF5b3V0V2l0aFBlbmRpbmdTdHlsZXNoZWV0cygpICYmICFtX3N0eWxlU2hl
ZXRDb2xsZWN0aW9uLT5oYXNQZW5kaW5nU2hlZXRzKCkpIHsKICAgICAgICAgbV9wZW5kaW5nU2hl
ZXRMYXlvdXQgPSBJZ25vcmVMYXlvdXRXaXRoUGVuZGluZ1NoZWV0czsKICAgICAgICAgaWYgKHJl
bmRlcmVyKCkpCiAgICAgICAgICAgICByZW5kZXJlcigpLT5yZXBhaW50KCk7CkBAIC0zNDI4LDIx
OSArMzI3MSw2IEBAIHZvaWQgRG9jdW1lbnQ6OnN0eWxlUmVzb2x2ZXJDaGFuZ2VkKFN0eWwKICAg
ICBldmFsdWF0ZU1lZGlhUXVlcnlMaXN0KCk7CiB9CiAKLXZvaWQgRG9jdW1lbnQ6OmFkZFN0eWxl
U2hlZXRDYW5kaWRhdGVOb2RlKE5vZGUqIG5vZGUsIGJvb2wgY3JlYXRlZEJ5UGFyc2VyKQotewot
ICAgIGlmICghbm9kZS0+aW5Eb2N1bWVudCgpKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAg
Ly8gVW50aWwgdGhlIDxib2R5PiBleGlzdHMsIHdlIGhhdmUgbm8gY2hvaWNlIGJ1dCB0byBjb21w
YXJlIGRvY3VtZW50IHBvc2l0aW9ucywKLSAgICAvLyBzaW5jZSBzdHlsZXMgb3V0c2lkZSBvZiB0
aGUgYm9keSBhbmQgaGVhZCBjb250aW51ZSB0byBiZSBzaHVudGVkIGludG8gdGhlIGhlYWQKLSAg
ICAvLyAoYW5kIHRodXMgY2FuIHNoaWZ0IHRvIGVuZCB1cCBiZWZvcmUgZHluYW1pY2FsbHkgYWRk
ZWQgRE9NIGNvbnRlbnQgdGhhdCBpcyBhbHNvCi0gICAgLy8gb3V0c2lkZSB0aGUgYm9keSkuCi0g
ICAgaWYgKChjcmVhdGVkQnlQYXJzZXIgJiYgYm9keSgpKSB8fCBtX3N0eWxlU2hlZXRDYW5kaWRh
dGVOb2Rlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgbV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMu
YWRkKG5vZGUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gRGV0ZXJtaW5lIGFu
IGFwcHJvcHJpYXRlIGluc2VydGlvbiBwb2ludC4KLSAgICBTdHlsZVNoZWV0Q2FuZGlkYXRlTGlz
dEhhc2hTZXQ6Oml0ZXJhdG9yIGJlZ2luID0gbV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMuYmVn
aW4oKTsKLSAgICBTdHlsZVNoZWV0Q2FuZGlkYXRlTGlzdEhhc2hTZXQ6Oml0ZXJhdG9yIGVuZCA9
IG1fc3R5bGVTaGVldENhbmRpZGF0ZU5vZGVzLmVuZCgpOwotICAgIFN0eWxlU2hlZXRDYW5kaWRh
dGVMaXN0SGFzaFNldDo6aXRlcmF0b3IgaXQgPSBlbmQ7Ci0gICAgTm9kZSogZm9sbG93aW5nTm9k
ZSA9IDA7Ci0gICAgZG8gewotICAgICAgICAtLWl0OwotICAgICAgICBOb2RlKiBuID0gKml0Owot
ICAgICAgICB1bnNpZ25lZCBzaG9ydCBwb3NpdGlvbiA9IG4tPmNvbXBhcmVEb2N1bWVudFBvc2l0
aW9uKG5vZGUpOwotICAgICAgICBpZiAocG9zaXRpb24gPT0gRE9DVU1FTlRfUE9TSVRJT05fRk9M
TE9XSU5HKSB7Ci0gICAgICAgICAgICBtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcy5pbnNlcnRC
ZWZvcmUoZm9sbG93aW5nTm9kZSwgbm9kZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAg
IH0KLSAgICAgICAgZm9sbG93aW5nTm9kZSA9IG47Ci0gICAgfSB3aGlsZSAoaXQgIT0gYmVnaW4p
OwotICAgIAotICAgIG1fc3R5bGVTaGVldENhbmRpZGF0ZU5vZGVzLmluc2VydEJlZm9yZShmb2xs
b3dpbmdOb2RlLCBub2RlKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6cmVtb3ZlU3R5bGVTaGVldENh
bmRpZGF0ZU5vZGUoTm9kZSogbm9kZSkKLXsKLSAgICBtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rl
cy5yZW1vdmUobm9kZSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmNvbGxlY3RBY3RpdmVTdHlsZXNo
ZWV0cyhWZWN0b3I8UmVmUHRyPFN0eWxlU2hlZXQ+ID4mIHNoZWV0cykKLXsKLSAgICBpZiAoc2V0
dGluZ3MoKSAmJiAhc2V0dGluZ3MoKS0+YXV0aG9yQW5kVXNlclN0eWxlc0VuYWJsZWQoKSkKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgU3R5bGVTaGVldENhbmRpZGF0ZUxpc3RIYXNoU2V0OjppdGVy
YXRvciBiZWdpbiA9IG1fc3R5bGVTaGVldENhbmRpZGF0ZU5vZGVzLmJlZ2luKCk7Ci0gICAgU3R5
bGVTaGVldENhbmRpZGF0ZUxpc3RIYXNoU2V0OjppdGVyYXRvciBlbmQgPSBtX3N0eWxlU2hlZXRD
YW5kaWRhdGVOb2Rlcy5lbmQoKTsKLSAgICBmb3IgKFN0eWxlU2hlZXRDYW5kaWRhdGVMaXN0SGFz
aFNldDo6aXRlcmF0b3IgaXQgPSBiZWdpbjsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgIE5v
ZGUqIG4gPSAqaXQ7Ci0gICAgICAgIFN0eWxlU2hlZXQqIHNoZWV0ID0gMDsKLSAgICAgICAgaWYg
KG4tPm5vZGVUeXBlKCkgPT0gUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFKSB7Ci0gICAgICAg
ICAgICAvLyBQcm9jZXNzaW5nIGluc3RydWN0aW9uIChYTUwgZG9jdW1lbnRzIG9ubHkpLgotICAg
ICAgICAgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCBsaW5raW5nIHRvIGVtYmVkZGVkIENTUyBzdHls
ZXNoZWV0cywgc2VlIDxodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDky
ODE+IGZvciBkaXNjdXNzaW9uLgotICAgICAgICAgICAgUHJvY2Vzc2luZ0luc3RydWN0aW9uKiBw
aSA9IHN0YXRpY19jYXN0PFByb2Nlc3NpbmdJbnN0cnVjdGlvbio+KG4pOwotICAgICAgICAgICAg
c2hlZXQgPSBwaS0+c2hlZXQoKTsKLSNpZiBFTkFCTEUoWFNMVCkKLSAgICAgICAgICAgIC8vIERv
bid0IGFwcGx5IFhTTCB0cmFuc2Zvcm1zIHRvIGFscmVhZHkgdHJhbnNmb3JtZWQgZG9jdW1lbnRz
IC0tIDxyZGFyOi8vcHJvYmxlbS80MTMyODA2PgotICAgICAgICAgICAgaWYgKHBpLT5pc1hTTCgp
ICYmICF0cmFuc2Zvcm1Tb3VyY2VEb2N1bWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gRG9u
J3QgYXBwbHkgWFNMIHRyYW5zZm9ybXMgdW50aWwgbG9hZGluZyBpcyBmaW5pc2hlZC4KLSAgICAg
ICAgICAgICAgICBpZiAoIXBhcnNpbmcoKSkKLSAgICAgICAgICAgICAgICAgICAgYXBwbHlYU0xU
cmFuc2Zvcm0ocGkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSNl
bmRpZgotICAgICAgICB9IGVsc2UgaWYgKChuLT5pc0hUTUxFbGVtZW50KCkgJiYgKG4tPmhhc1Rh
Z05hbWUobGlua1RhZykgfHwgbi0+aGFzVGFnTmFtZShzdHlsZVRhZykpKQotI2lmIEVOQUJMRShT
VkcpCi0gICAgICAgICAgICAgICAgICAgfHwgIChuLT5pc1NWR0VsZW1lbnQoKSAmJiBuLT5oYXNU
YWdOYW1lKFNWR05hbWVzOjpzdHlsZVRhZykpCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAp
IHsKLSAgICAgICAgICAgIEVsZW1lbnQqIGUgPSBzdGF0aWNfY2FzdDxFbGVtZW50Kj4obik7Ci0g
ICAgICAgICAgICBBdG9taWNTdHJpbmcgdGl0bGUgPSBlLT5nZXRBdHRyaWJ1dGUodGl0bGVBdHRy
KTsKLSAgICAgICAgICAgIGJvb2wgZW5hYmxlZFZpYVNjcmlwdCA9IGZhbHNlOwotICAgICAgICAg
ICAgaWYgKGUtPmhhc0xvY2FsTmFtZShsaW5rVGFnKSkgewotICAgICAgICAgICAgICAgIC8vIDxM
SU5LPiBlbGVtZW50Ci0gICAgICAgICAgICAgICAgSFRNTExpbmtFbGVtZW50KiBsaW5rRWxlbWVu
dCA9IHN0YXRpY19jYXN0PEhUTUxMaW5rRWxlbWVudCo+KG4pOwotICAgICAgICAgICAgICAgIGlm
IChsaW5rRWxlbWVudC0+aXNEaXNhYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51
ZTsKLSAgICAgICAgICAgICAgICBlbmFibGVkVmlhU2NyaXB0ID0gbGlua0VsZW1lbnQtPmlzRW5h
YmxlZFZpYVNjcmlwdCgpOwotICAgICAgICAgICAgICAgIGlmIChsaW5rRWxlbWVudC0+c3R5bGVT
aGVldElzTG9hZGluZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGl0IGlzIGxvYWRpbmcg
YnV0IHdlIHNob3VsZCBzdGlsbCBkZWNpZGUgd2hpY2ggc3R5bGUgc2hlZXQgc2V0IHRvIHVzZQot
ICAgICAgICAgICAgICAgICAgICBpZiAoIWVuYWJsZWRWaWFTY3JpcHQgJiYgIXRpdGxlLmlzRW1w
dHkoKSAmJiBtX3ByZWZlcnJlZFN0eWxlc2hlZXRTZXQuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAg
ICAgICAgICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcmIHJlbCA9IGUtPmdldEF0dHJpYnV0ZShy
ZWxBdHRyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVsLmNvbnRhaW5zKCJhbHRl
cm5hdGUiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcHJlZmVycmVkU3R5bGVz
aGVldFNldCA9IHRpdGxlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc2VsZWN0ZWRT
dHlsZXNoZWV0U2V0ID0gdGl0bGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAg
ICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghbGlua0VsZW1lbnQtPnNoZWV0KCkpCi0gICAg
ICAgICAgICAgICAgICAgIHRpdGxlID0gbnVsbEF0b207Ci0gICAgICAgICAgICB9Ci0gICAgICAg
ICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgcHJlZmVycmVkIHN0eWxlc2V0LiAgVGhpcyBpcyB0aGUK
LSAgICAgICAgICAgIC8vIHNldCBvZiBzaGVldHMgdGhhdCB3aWxsIGJlIGVuYWJsZWQuCi0jaWYg
RU5BQkxFKFNWRykKLSAgICAgICAgICAgIGlmIChuLT5pc1NWR0VsZW1lbnQoKSAmJiBuLT5oYXNU
YWdOYW1lKFNWR05hbWVzOjpzdHlsZVRhZykpCi0gICAgICAgICAgICAgICAgc2hlZXQgPSBzdGF0
aWNfY2FzdDxTVkdTdHlsZUVsZW1lbnQqPihuKS0+c2hlZXQoKTsKLSAgICAgICAgICAgIGVsc2UK
LSNlbmRpZgotICAgICAgICAgICAgaWYgKGUtPmhhc0xvY2FsTmFtZShsaW5rVGFnKSkKLSAgICAg
ICAgICAgICAgICBzaGVldCA9IHN0YXRpY19jYXN0PEhUTUxMaW5rRWxlbWVudCo+KG4pLT5zaGVl
dCgpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIC8vIDxTVFlMRT4gZWxlbWVu
dAotICAgICAgICAgICAgICAgIHNoZWV0ID0gc3RhdGljX2Nhc3Q8SFRNTFN0eWxlRWxlbWVudCo+
KG4pLT5zaGVldCgpOwotICAgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoaXMgc2hlZXQg
YmVsb25ncyB0byBhIHN0eWxlc2V0Ci0gICAgICAgICAgICAvLyAodGh1cyBtYWtpbmcgaXQgUFJF
RkVSUkVEIG9yIEFMVEVSTkFURSByYXRoZXIgdGhhbgotICAgICAgICAgICAgLy8gUEVSU0lTVEVO
VCkuCi0gICAgICAgICAgICBBdG9taWNTdHJpbmcgcmVsID0gZS0+Z2V0QXR0cmlidXRlKHJlbEF0
dHIpOwotICAgICAgICAgICAgaWYgKCFlbmFibGVkVmlhU2NyaXB0ICYmICF0aXRsZS5pc0VtcHR5
KCkpIHsKLSAgICAgICAgICAgICAgICAvLyBZZXMsIHdlIGhhdmUgYSB0aXRsZS4KLSAgICAgICAg
ICAgICAgICBpZiAobV9wcmVmZXJyZWRTdHlsZXNoZWV0U2V0LmlzRW1wdHkoKSkgewotICAgICAg
ICAgICAgICAgICAgICAvLyBObyBwcmVmZXJyZWQgc2V0IGhhcyBiZWVuIGVzdGFibGlzaGVkLiAg
SWYKLSAgICAgICAgICAgICAgICAgICAgLy8gd2UgYXJlIE5PVCBhbiBhbHRlcm5hdGUgc2hlZXQs
IHRoZW4gZXN0YWJsaXNoCi0gICAgICAgICAgICAgICAgICAgIC8vIHVzIGFzIHRoZSBwcmVmZXJy
ZWQgc2V0LiAgT3RoZXJ3aXNlLCBqdXN0IGlnbm9yZQotICAgICAgICAgICAgICAgICAgICAvLyB0
aGlzIHNoZWV0LgotICAgICAgICAgICAgICAgICAgICBpZiAoZS0+aGFzTG9jYWxOYW1lKHN0eWxl
VGFnKSB8fCAhcmVsLmNvbnRhaW5zKCJhbHRlcm5hdGUiKSkKLSAgICAgICAgICAgICAgICAgICAg
ICAgIG1fcHJlZmVycmVkU3R5bGVzaGVldFNldCA9IG1fc2VsZWN0ZWRTdHlsZXNoZWV0U2V0ID0g
dGl0bGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh0aXRsZSAhPSBt
X3ByZWZlcnJlZFN0eWxlc2hlZXRTZXQpCi0gICAgICAgICAgICAgICAgICAgIHNoZWV0ID0gMDsK
LSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJlbC5jb250YWlucygiYWx0ZXJuYXRl
IikgJiYgdGl0bGUuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIHNoZWV0ID0gMDsKLSAgICAg
ICAgfQotICAgICAgICBpZiAoc2hlZXQpCi0gICAgICAgICAgICBzaGVldHMuYXBwZW5kKHNoZWV0
KTsKLSAgICB9Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6OnRlc3RBZGRlZFN0eWxlc2hlZXRSZXF1aXJl
c1N0eWxlUmVjYWxjKFN0eWxlU2hlZXRDb250ZW50cyogc3R5bGVzaGVldCkKLXsKLSAgICAvLyBT
ZWUgaWYgYWxsIHJ1bGVzIG9uIHRoZSBzaGVldCBhcmUgc2NvcGVkIHRvIHNvbWUgc3BlY2lmaWMg
aWRzIG9yIGNsYXNzZXMuCi0gICAgLy8gVGhlbiB0ZXN0IGlmIHdlIGFjdHVhbGx5IGhhdmUgYW55
IG9mIHRob3NlIGluIHRoZSB0cmVlIGF0IHRoZSBtb21lbnQuCi0gICAgSGFzaFNldDxBdG9taWNT
dHJpbmdJbXBsKj4gaWRTY29wZXM7IAotICAgIEhhc2hTZXQ8QXRvbWljU3RyaW5nSW1wbCo+IGNs
YXNzU2NvcGVzOwotICAgIGlmICghU3R5bGVSZXNvbHZlcjo6ZGV0ZXJtaW5lU3R5bGVzaGVldFNl
bGVjdG9yU2NvcGVzKHN0eWxlc2hlZXQsIGlkU2NvcGVzLCBjbGFzc1Njb3BlcykpCi0gICAgICAg
IHJldHVybiB0cnVlOwotICAgIC8vIEludmFsaWRhdGUgdGhlIHN1YnRyZWVzIHRoYXQgbWF0Y2gg
dGhlIHNjb3Blcy4KLSAgICBOb2RlKiBub2RlID0gZmlyc3RDaGlsZCgpOwotICAgIHdoaWxlIChu
b2RlKSB7Ci0gICAgICAgIGlmICghbm9kZS0+aXNTdHlsZWRFbGVtZW50KCkpIHsKLSAgICAgICAg
ICAgIG5vZGUgPSBub2RlLT50cmF2ZXJzZU5leHROb2RlKCk7Ci0gICAgICAgICAgICBjb250aW51
ZTsKLSAgICAgICAgfQotICAgICAgICBTdHlsZWRFbGVtZW50KiBlbGVtZW50ID0gc3RhdGljX2Nh
c3Q8U3R5bGVkRWxlbWVudCo+KG5vZGUpOwotICAgICAgICBpZiAoU2VsZWN0b3JDaGVja2VyOjpl
bGVtZW50TWF0Y2hlc1NlbGVjdG9yU2NvcGVzKGVsZW1lbnQsIGlkU2NvcGVzLCBjbGFzc1Njb3Bl
cykpIHsKLSAgICAgICAgICAgIGVsZW1lbnQtPnNldE5lZWRzU3R5bGVSZWNhbGMoKTsKLSAgICAg
ICAgICAgIC8vIFRoZSB3aG9sZSBzdWJ0cmVlIGlzIG5vdyBpbnZhbGlkYXRlZCwgd2UgY2FuIHNr
aXAgdG8gdGhlIG5leHQgc2libGluZy4KLSAgICAgICAgICAgIG5vZGUgPSBub2RlLT50cmF2ZXJz
ZU5leHRTaWJsaW5nKCk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAg
ICBub2RlID0gbm9kZS0+dHJhdmVyc2VOZXh0Tm9kZSgpOwotICAgIH0KLSAgICByZXR1cm4gZmFs
c2U7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmFuYWx5emVTdHlsZXNoZWV0Q2hhbmdlKFN0eWxlUmVz
b2x2ZXJVcGRhdGVGbGFnIHVwZGF0ZUZsYWcsIGNvbnN0IFZlY3RvcjxSZWZQdHI8U3R5bGVTaGVl
dD4gPiYgbmV3U3R5bGVzaGVldHMsIGJvb2wmIHJlcXVpcmVzU3R5bGVSZXNvbHZlclJlc2V0LCBi
b29sJiByZXF1aXJlc0Z1bGxTdHlsZVJlY2FsYykKLXsKLSAgICByZXF1aXJlc1N0eWxlUmVzb2x2
ZXJSZXNldCA9IHRydWU7Ci0gICAgcmVxdWlyZXNGdWxsU3R5bGVSZWNhbGMgPSB0cnVlOwotICAg
IAotICAgIC8vIFN0eWxlc2hlZXRzIG9mIDxzdHlsZT4gZWxlbWVudHMgdGhhdCBAaW1wb3J0IHN0
eWxlc2hlZXRzIGFyZSBhY3RpdmUgYnV0IGxvYWRpbmcuIFdlIG5lZWQgdG8gdHJpZ2dlciBhIGZ1
bGwgcmVjYWxjIHdoZW4gc3VjaCBsb2FkcyBhcmUgZG9uZS4KLSAgICBib29sIGhhc0FjdGl2ZUxv
YWRpbmdTdHlsZXNoZWV0ID0gZmFsc2U7Ci0gICAgdW5zaWduZWQgbmV3U3R5bGVzaGVldENvdW50
ID0gbmV3U3R5bGVzaGVldHMuc2l6ZSgpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBu
ZXdTdHlsZXNoZWV0Q291bnQ7ICsraSkgewotICAgICAgICBpZiAobmV3U3R5bGVzaGVldHNbaV0t
PmlzTG9hZGluZygpKQotICAgICAgICAgICAgaGFzQWN0aXZlTG9hZGluZ1N0eWxlc2hlZXQgPSB0
cnVlOwotICAgIH0KLSAgICBpZiAobV9oYWRBY3RpdmVMb2FkaW5nU3R5bGVzaGVldCAmJiAhaGFz
QWN0aXZlTG9hZGluZ1N0eWxlc2hlZXQpIHsKLSAgICAgICAgbV9oYWRBY3RpdmVMb2FkaW5nU3R5
bGVzaGVldCA9IGZhbHNlOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1faGFkQWN0aXZl
TG9hZGluZ1N0eWxlc2hlZXQgPSBoYXNBY3RpdmVMb2FkaW5nU3R5bGVzaGVldDsKLQotICAgIGlm
ICh1cGRhdGVGbGFnICE9IFJlY2FsY1N0eWxlSWZOZWVkZWQpCi0gICAgICAgIHJldHVybjsKLSAg
ICBpZiAoIW1fc3R5bGVSZXNvbHZlcikKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gU2VlIGlm
IHdlIGFyZSBqdXN0IGFkZGluZyBzdHlsZXNoZWV0cy4KLSAgICB1bnNpZ25lZCBvbGRTdHlsZXNo
ZWV0Q291bnQgPSBtX3N0eWxlU2hlZXRzLT5sZW5ndGgoKTsKLSAgICBpZiAobmV3U3R5bGVzaGVl
dENvdW50IDwgb2xkU3R5bGVzaGVldENvdW50KQotICAgICAgICByZXR1cm47Ci0gICAgZm9yICh1
bnNpZ25lZCBpID0gMDsgaSA8IG9sZFN0eWxlc2hlZXRDb3VudDsgKytpKSB7Ci0gICAgICAgIGlm
IChtX3N0eWxlU2hlZXRzLT5pdGVtKGkpICE9IG5ld1N0eWxlc2hlZXRzW2ldKQotICAgICAgICAg
ICAgcmV0dXJuOwotICAgIH0KLSAgICByZXF1aXJlc1N0eWxlUmVzb2x2ZXJSZXNldCA9IGZhbHNl
OwotCi0gICAgLy8gSWYgd2UgYXJlIGFscmVhZHkgcGFyc2luZyB0aGUgYm9keSBhbmQgc28gbWF5
IGhhdmUgc2lnbmlmaWNhbnQgYW1vdW50IG9mIGVsZW1lbnRzLCBwdXQgc29tZSBlZmZvcnQgaW50
byB0cnlpbmcgdG8gYXZvaWQgc3R5bGUgcmVjYWxjcy4KLSAgICBpZiAoIWJvZHkoKSB8fCBtX2hh
c05vZGVzV2l0aFBsYWNlaG9sZGVyU3R5bGUpCi0gICAgICAgIHJldHVybjsKLSAgICBmb3IgKHVu
c2lnbmVkIGkgPSBvbGRTdHlsZXNoZWV0Q291bnQ7IGkgPCBuZXdTdHlsZXNoZWV0Q291bnQ7ICsr
aSkgewotICAgICAgICBpZiAoIW5ld1N0eWxlc2hlZXRzW2ldLT5pc0NTU1N0eWxlU2hlZXQoKSkK
LSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYgKG5ld1N0eWxlc2hlZXRzW2ldLT5kaXNh
YmxlZCgpKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGlmICh0ZXN0QWRkZWRTdHls
ZXNoZWV0UmVxdWlyZXNTdHlsZVJlY2FsYyhzdGF0aWNfY2FzdDxDU1NTdHlsZVNoZWV0Kj4obmV3
U3R5bGVzaGVldHNbaV0uZ2V0KCkpLT5jb250ZW50cygpKSkKLSAgICAgICAgICAgIHJldHVybjsK
LSAgICB9Ci0gICAgcmVxdWlyZXNGdWxsU3R5bGVSZWNhbGMgPSBmYWxzZTsKLX0KLQotc3RhdGlj
IGJvb2wgc3R5bGVTaGVldHNVc2VSZW1Vbml0cyhjb25zdCBWZWN0b3I8UmVmUHRyPFN0eWxlU2hl
ZXQ+ID4mIHNoZWV0cykKLXsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2hlZXRzLnNp
emUoKTsgKytpKSB7Ci0gICAgICAgIGlmICghc2hlZXRzW2ldLT5pc0NTU1N0eWxlU2hlZXQoKSkK
LSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8Q1NTU3R5bGVT
aGVldCo+KHNoZWV0c1tpXS5nZXQoKSktPmNvbnRlbnRzKCktPnVzZXNSZW1Vbml0cygpKQotICAg
ICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQogdm9p
ZCBEb2N1bWVudDo6bm90aWZ5U2VhbWxlc3NDaGlsZERvY3VtZW50c09mU3R5bGVzaGVldFVwZGF0
ZSgpIGNvbnN0CiB7CiAgICAgLy8gSWYgd2UncmUgbm90IGluIGEgZnJhbWUgeWV0IGFueSBwb3Rl
bnRpYWwgY2hpbGQgZG9jdW1lbnRzIHdvbid0IGhhdmUgYSBTdHlsZVJlc29sdmVyIHRvIHVwZGF0
ZS4KQEAgLTM2NTcsNDMgKzMyODcsNiBAQCB2b2lkIERvY3VtZW50Ojpub3RpZnlTZWFtbGVzc0No
aWxkRG9jdW1lCiAgICAgfQogfQogCi1ib29sIERvY3VtZW50Ojp1cGRhdGVBY3RpdmVTdHlsZXNo
ZWV0cyhTdHlsZVJlc29sdmVyVXBkYXRlRmxhZyB1cGRhdGVGbGFnKQotewotICAgIGlmIChtX2lu
U3R5bGVSZWNhbGMpIHsKLSAgICAgICAgLy8gU1ZHIDx1c2U+IGVsZW1lbnQgbWF5IG1hbmFnZSB0
byBpbnZhbGlkYXRlIHN0eWxlIHNlbGVjdG9yIGluIHRoZSBtaWRkbGUgb2YgYSBzdHlsZSByZWNh
bGMuCi0gICAgICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD01
NDM0NAotICAgICAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgYmUgZml4ZWQgaW4gU1ZHIGFuZCB0
aGlzIGNvZGUgcmVwbGFjZWQgd2l0aCBBU1NFUlQoIW1faW5TdHlsZVJlY2FsYykuCi0gICAgICAg
IG1faGFzRGlydHlTdHlsZVJlc29sdmVyID0gdHJ1ZTsKLSAgICAgICAgc2NoZWR1bGVGb3JjZWRT
dHlsZVJlY2FsYygpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmICghcmVu
ZGVyZXIoKSB8fCAhYXR0YWNoZWQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgU3R5
bGVTaGVldFZlY3RvciBuZXdTdHlsZXNoZWV0czsKLSAgICBjb2xsZWN0QWN0aXZlU3R5bGVzaGVl
dHMobmV3U3R5bGVzaGVldHMpOwotCi0gICAgYm9vbCByZXF1aXJlc1N0eWxlUmVzb2x2ZXJSZXNl
dDsKLSAgICBib29sIHJlcXVpcmVzRnVsbFN0eWxlUmVjYWxjOwotICAgIGFuYWx5emVTdHlsZXNo
ZWV0Q2hhbmdlKHVwZGF0ZUZsYWcsIG5ld1N0eWxlc2hlZXRzLCByZXF1aXJlc1N0eWxlUmVzb2x2
ZXJSZXNldCwgcmVxdWlyZXNGdWxsU3R5bGVSZWNhbGMpOwotCi0gICAgaWYgKHJlcXVpcmVzU3R5
bGVSZXNvbHZlclJlc2V0KQotICAgICAgICBjbGVhclN0eWxlUmVzb2x2ZXIoKTsKLSAgICBlbHNl
IHsKLSAgICAgICAgbV9zdHlsZVJlc29sdmVyLT5hcHBlbmRBdXRob3JTdHlsZXNoZWV0cyhtX3N0
eWxlU2hlZXRzLT5sZW5ndGgoKSwgbmV3U3R5bGVzaGVldHMpOwotICAgICAgICByZXNldENTU0Zl
YXR1cmVGbGFncygpOwotICAgIH0KLSAgICBtX3N0eWxlU2hlZXRzLT5zd2FwKG5ld1N0eWxlc2hl
ZXRzKTsKLQotICAgIG1fdXNlc1JlbVVuaXRzID0gc3R5bGVTaGVldHNVc2VSZW1Vbml0cyhtX3N0
eWxlU2hlZXRzLT52ZWN0b3IoKSk7Ci0gICAgbV9kaWRDYWxjdWxhdGVTdHlsZVJlc29sdmVyID0g
dHJ1ZTsKLSAgICBtX2hhc0RpcnR5U3R5bGVSZXNvbHZlciA9IGZhbHNlOwotCi0gICAgbm90aWZ5
U2VhbWxlc3NDaGlsZERvY3VtZW50c09mU3R5bGVzaGVldFVwZGF0ZSgpOwotCi0gICAgcmV0dXJu
IHJlcXVpcmVzRnVsbFN0eWxlUmVjYWxjOwotfQotCiB2b2lkIERvY3VtZW50OjpzZXRIb3Zlck5v
ZGUoUGFzc1JlZlB0cjxOb2RlPiBuZXdIb3Zlck5vZGUpCiB7CiAgICAgbV9ob3Zlck5vZGUgPSBu
ZXdIb3Zlck5vZGU7CkBAIC02MjczLDE2ICs1ODY2LDkgQEAgdm9pZCBEb2N1bWVudDo6cmVwb3J0
TWVtb3J5VXNhZ2UoTWVtb3J5TwogICAgIGluZm8uYWRkTWVtYmVyKG1fZnJhbWUpOwogICAgIGlu
Zm8uYWRkTWVtYmVyKG1fY2FjaGVkUmVzb3VyY2VMb2FkZXIpOwogICAgIGluZm8uYWRkTWVtYmVy
KG1fZWxlbVNoZWV0KTsKLSAgICBpbmZvLmFkZE1lbWJlcihtX3BhZ2VVc2VyU2hlZXQpOwotICAg
IGlmIChtX3BhZ2VHcm91cFVzZXJTaGVldHMpCi0gICAgICAgIGluZm8uYWRkSW5zdHJ1bWVudGVk
VmVjdG9yUHRyKG1fcGFnZUdyb3VwVXNlclNoZWV0cyk7Ci0gICAgaWYgKG1fdXNlclNoZWV0cykK
LSAgICAgICAgaW5mby5hZGRJbnN0cnVtZW50ZWRWZWN0b3JQdHIobV91c2VyU2hlZXRzKTsKKyAg
ICBpbmZvLmFkZE1lbWJlcihtX3N0eWxlU2hlZXRDb2xsZWN0aW9uKTsKICAgICBpbmZvLmFkZEhh
c2hTZXQobV9ub2RlSXRlcmF0b3JzKTsKICAgICBpbmZvLmFkZEhhc2hTZXQobV9yYW5nZXMpOwot
ICAgIGluZm8uYWRkTGlzdEhhc2hTZXQobV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMpOwotICAg
IGluZm8uYWRkTWVtYmVyKG1fcHJlZmVycmVkU3R5bGVzaGVldFNldCk7Ci0gICAgaW5mby5hZGRN
ZW1iZXIobV9zZWxlY3RlZFN0eWxlc2hlZXRTZXQpOwogICAgIGluZm8uYWRkTWVtYmVyKG1fdGl0
bGUuc3RyaW5nKCkpOwogICAgIGluZm8uYWRkTWVtYmVyKG1fcmF3VGl0bGUuc3RyaW5nKCkpOwog
ICAgIGluZm8uYWRkTWVtYmVyKG1feG1sRW5jb2RpbmcpOwpAQCAtNjM4Myw2ICs1OTY5LDExIEBA
IFBhc3NSZWZQdHI8RWxlbWVudEF0dHJpYnV0ZURhdGE+IERvY3VtZW4KICAgICByZXR1cm4gYXR0
cmlidXRlRGF0YS5yZWxlYXNlKCk7CiB9CiAKK2Jvb2wgRG9jdW1lbnQ6OmhhdmVTdHlsZXNoZWV0
c0xvYWRlZCgpIGNvbnN0Cit7CisgICAgcmV0dXJuICFtX3N0eWxlU2hlZXRDb2xsZWN0aW9uLT5o
YXNQZW5kaW5nU2hlZXRzKCkgfHwgbV9pZ25vcmVQZW5kaW5nU3R5bGVzaGVldHM7Cit9CisKIExv
Y2FsaXplciYgRG9jdW1lbnQ6OmdldExvY2FsaXplcihjb25zdCBBdG9taWNTdHJpbmcmIGxvY2Fs
ZSkKIHsKICAgICBBdG9taWNTdHJpbmcgbG9jYWxlS2V5ID0gbG9jYWxlOwpJbmRleDogU291cmNl
L1dlYkNvcmUvZG9tL0RvY3VtZW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZG9t
L0RvY3VtZW50LmgJKHJldmlzaW9uIDEyOTMwMykKKysrIFNvdXJjZS9XZWJDb3JlL2RvbS9Eb2N1
bWVudC5oCSh3b3JraW5nIGNvcHkpCkBAIC03OCw2ICs3OCw3IEBAIGNsYXNzIERvY3VtZW50RnJh
Z21lbnQ7CiBjbGFzcyBEb2N1bWVudExvYWRlcjsKIGNsYXNzIERvY3VtZW50TWFya2VyQ29udHJv
bGxlcjsKIGNsYXNzIERvY3VtZW50UGFyc2VyOworY2xhc3MgRG9jdW1lbnRTdHlsZVNoZWV0Q29s
bGVjdGlvbjsKIGNsYXNzIERvY3VtZW50VHlwZTsKIGNsYXNzIERvY3VtZW50V2Vha1JlZmVyZW5j
ZTsKIGNsYXNzIER5bmFtaWNOb2RlTGlzdENhY2hlQmFzZTsKQEAgLTQ4NSwzNCArNDg2LDE0IEBA
IHB1YmxpYzoKICAgICAgICAgcmV0dXJuIG1fc3R5bGVSZXNvbHZlci5nZXQoKTsKICAgICB9CiAK
LSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSBwZW5kaW5nIHNoZWV0IGNvdW50IGFuZCB0aGVu
IGNhbGxzIHVwZGF0ZUFjdGl2ZVN0eWxlc2hlZXRzLgotICAgICAqLwotICAgIGVudW0gUmVtb3Zl
UGVuZGluZ1NoZWV0Tm90aWZpY2F0aW9uVHlwZSB7Ci0gICAgICAgIFJlbW92ZVBlbmRpbmdTaGVl
dE5vdGlmeUltbWVkaWF0ZWx5LAotICAgICAgICBSZW1vdmVQZW5kaW5nU2hlZXROb3RpZnlMYXRl
cgotICAgIH07Ci0KLSAgICB2b2lkIHJlbW92ZVBlbmRpbmdTaGVldChSZW1vdmVQZW5kaW5nU2hl
ZXROb3RpZmljYXRpb25UeXBlID0gUmVtb3ZlUGVuZGluZ1NoZWV0Tm90aWZ5SW1tZWRpYXRlbHkp
OwogICAgIHZvaWQgbm90aWZ5UmVtb3ZlUGVuZGluZ1NoZWV0SWZOZWVkZWQoKTsKIAotICAgIC8q
KgotICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiBhbGwgdG9wLWxldmVsIHN0eWxl
c2hlZXRzIGhhdmUgbG9hZGVkIChpbmNsdWRpbmcKLSAgICAgKiBhbnkgQGltcG9ydHMgdGhhdCB0
aGV5IG1heSBiZSBsb2FkaW5nKS4KLSAgICAgKi8KLSAgICBib29sIGhhdmVTdHlsZXNoZWV0c0xv
YWRlZCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wZW5kaW5nU3R5bGVzaGVldHMg
PD0gMCB8fCBtX2lnbm9yZVBlbmRpbmdTdHlsZXNoZWV0czsKLSAgICB9CisgICAgYm9vbCBoYXZl
U3R5bGVzaGVldHNMb2FkZWQoKSBjb25zdDsKIAotICAgIC8qKgotICAgICAqIEluY3JlbWVudHMg
dGhlIG51bWJlciBvZiBwZW5kaW5nIHNoZWV0cy4gIFRoZSA8bGluaz4gZWxlbWVudHMKLSAgICAg
KiBpbnZva2UgdGhpcyB0byBhZGQgdGhlbXNlbHZlcyB0byB0aGUgbG9hZGluZyBsaXN0LgotICAg
ICAqLwotICAgIHZvaWQgYWRkUGVuZGluZ1NoZWV0KCkgeyBtX3BlbmRpbmdTdHlsZXNoZWV0cysr
OyB9CisgICAgLy8gVGhpcyBpcyBhIERPTSBmdW5jdGlvbi4KKyAgICBTdHlsZVNoZWV0TGlzdCog
c3R5bGVTaGVldHMoKTsKIAotICAgIHZvaWQgYWRkU3R5bGVTaGVldENhbmRpZGF0ZU5vZGUoTm9k
ZSosIGJvb2wgY3JlYXRlZEJ5UGFyc2VyKTsKLSAgICB2b2lkIHJlbW92ZVN0eWxlU2hlZXRDYW5k
aWRhdGVOb2RlKE5vZGUqKTsKKyAgICBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uKiBzdHls
ZVNoZWV0Q29sbGVjdGlvbigpIHsgcmV0dXJuIG1fc3R5bGVTaGVldENvbGxlY3Rpb24uZ2V0KCk7
IH0KIAogICAgIGJvb2wgZ290b0FuY2hvck5lZWRlZEFmdGVyU3R5bGVzaGVldHNMb2FkKCkgeyBy
ZXR1cm4gbV9nb3RvQW5jaG9yTmVlZGVkQWZ0ZXJTdHlsZXNoZWV0c0xvYWQ7IH0KICAgICB2b2lk
IHNldEdvdG9BbmNob3JOZWVkZWRBZnRlclN0eWxlc2hlZXRzTG9hZChib29sIGIpIHsgbV9nb3Rv
QW5jaG9yTmVlZGVkQWZ0ZXJTdHlsZXNoZWV0c0xvYWQgPSBiOyB9CkBAIC01MzAsMTcgKzUxMSw2
IEBAIHB1YmxpYzoKIAogICAgIHZvaWQgZXZhbHVhdGVNZWRpYVF1ZXJ5TGlzdCgpOwogCi0gICAg
Ym9vbCB1c2VzU2libGluZ1J1bGVzKCkgY29uc3QgeyByZXR1cm4gbV91c2VzU2libGluZ1J1bGVz
IHx8IG1fdXNlc1NpYmxpbmdSdWxlc092ZXJyaWRlOyB9Ci0gICAgdm9pZCBzZXRVc2VzU2libGlu
Z1J1bGVzKGJvb2wgYikgeyBtX3VzZXNTaWJsaW5nUnVsZXNPdmVycmlkZSA9IGI7IH0KLSAgICBi
b29sIHVzZXNGaXJzdExpbmVSdWxlcygpIGNvbnN0IHsgcmV0dXJuIG1fdXNlc0ZpcnN0TGluZVJ1
bGVzOyB9Ci0gICAgYm9vbCB1c2VzRmlyc3RMZXR0ZXJSdWxlcygpIGNvbnN0IHsgcmV0dXJuIG1f
dXNlc0ZpcnN0TGV0dGVyUnVsZXM7IH0KLSAgICB2b2lkIHNldFVzZXNGaXJzdExldHRlclJ1bGVz
KGJvb2wgYikgeyBtX3VzZXNGaXJzdExldHRlclJ1bGVzID0gYjsgfQotICAgIGJvb2wgdXNlc0Jl
Zm9yZUFmdGVyUnVsZXMoKSBjb25zdCB7IHJldHVybiBtX3VzZXNCZWZvcmVBZnRlclJ1bGVzIHx8
IG1fdXNlc0JlZm9yZUFmdGVyUnVsZXNPdmVycmlkZTsgfQotICAgIHZvaWQgc2V0VXNlc0JlZm9y
ZUFmdGVyUnVsZXMoYm9vbCBiKSB7IG1fdXNlc0JlZm9yZUFmdGVyUnVsZXNPdmVycmlkZSA9IGI7
IH0KLSAgICBib29sIHVzZXNSZW1Vbml0cygpIGNvbnN0IHsgcmV0dXJuIG1fdXNlc1JlbVVuaXRz
OyB9Ci0gICAgYm9vbCB1c2VzTGlua1J1bGVzKCkgY29uc3QgeyByZXR1cm4gbGlua0NvbG9yKCkg
IT0gdmlzaXRlZExpbmtDb2xvcigpIHx8IG1fdXNlc0xpbmtSdWxlczsgfQotICAgIHZvaWQgc2V0
VXNlc0xpbmtSdWxlcyhib29sIGIpIHsgbV91c2VzTGlua1J1bGVzID0gYjsgfQotCiAgICAgLy8g
TmV2ZXIgcmV0dXJucyAwLgogICAgIEZvcm1Db250cm9sbGVyKiBmb3JtQ29udHJvbGxlcigpOwog
ICAgIFZlY3RvcjxTdHJpbmc+IGZvcm1FbGVtZW50c1N0YXRlKCkgY29uc3Q7CkBAIC01NTYsNyAr
NTI2LDcgQEAgcHVibGljOgogICAgIFBhc3NSZWZQdHI8Tm9kZUl0ZXJhdG9yPiBjcmVhdGVOb2Rl
SXRlcmF0b3IoTm9kZSogcm9vdCwgdW5zaWduZWQgd2hhdFRvU2hvdywKICAgICAgICAgUGFzc1Jl
ZlB0cjxOb2RlRmlsdGVyPiwgYm9vbCBleHBhbmRFbnRpdHlSZWZlcmVuY2VzLCBFeGNlcHRpb25D
b2RlJik7CiAKLSAgICBQYXNzUmVmUHRyPFRyZWVXYWxrZXI+IGNyZWF0ZVRyZWVXYWxrZXIoTm9k
ZSogcm9vdCwgdW5zaWduZWQgd2hhdFRvU2hvdywgCisgICAgUGFzc1JlZlB0cjxUcmVlV2Fsa2Vy
PiBjcmVhdGVUcmVlV2Fsa2VyKE5vZGUqIHJvb3QsIHVuc2lnbmVkIHdoYXRUb1Nob3csCiAgICAg
ICAgIFBhc3NSZWZQdHI8Tm9kZUZpbHRlcj4sIGJvb2wgZXhwYW5kRW50aXR5UmVmZXJlbmNlcywg
RXhjZXB0aW9uQ29kZSYpOwogCiAgICAgLy8gU3BlY2lhbCBzdXBwb3J0IGZvciBlZGl0aW5nCkBA
IC02NDksMTcgKzYxOSw2IEBAIHB1YmxpYzoKICAgICBib29sIGNhbk5hdmlnYXRlKEZyYW1lKiB0
YXJnZXRGcmFtZSk7CiAgICAgRnJhbWUqIGZpbmRVbnNhZmVQYXJlbnRTY3JvbGxQcm9wYWdhdGlv
bkJvdW5kYXJ5KCk7CiAKLSAgICBDU1NTdHlsZVNoZWV0KiBwYWdlVXNlclNoZWV0KCk7Ci0gICAg
dm9pZCBjbGVhclBhZ2VVc2VyU2hlZXQoKTsKLSAgICB2b2lkIHVwZGF0ZVBhZ2VVc2VyU2hlZXQo
KTsKLQotICAgIGNvbnN0IFZlY3RvcjxSZWZQdHI8Q1NTU3R5bGVTaGVldD4gPiogcGFnZUdyb3Vw
VXNlclNoZWV0cygpIGNvbnN0OwotICAgIHZvaWQgY2xlYXJQYWdlR3JvdXBVc2VyU2hlZXRzKCk7
Ci0gICAgdm9pZCB1cGRhdGVQYWdlR3JvdXBVc2VyU2hlZXRzKCk7Ci0KLSAgICBjb25zdCBWZWN0
b3I8UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4qIGRvY3VtZW50VXNlclNoZWV0cygpIGNvbnN0IHsg
cmV0dXJuIG1fdXNlclNoZWV0cy5nZXQoKTsgfQotICAgIHZvaWQgYWRkVXNlclNoZWV0KFBhc3NS
ZWZQdHI8U3R5bGVTaGVldENvbnRlbnRzPiB1c2VyU2hlZXQpOwotCiAgICAgQ1NTU3R5bGVTaGVl
dCogZWxlbWVudFNoZWV0KCk7CiAgICAgCiAgICAgdmlydHVhbCBQYXNzUmVmUHRyPERvY3VtZW50
UGFyc2VyPiBjcmVhdGVQYXJzZXIoKTsKQEAgLTcxNiw4ICs2NzUsNiBAQCBwdWJsaWM6CiAgICAg
CiAgICAgTW91c2VFdmVudFdpdGhIaXRUZXN0UmVzdWx0cyBwcmVwYXJlTW91c2VFdmVudChjb25z
dCBIaXRUZXN0UmVxdWVzdCYsIGNvbnN0IExheW91dFBvaW50JiwgY29uc3QgUGxhdGZvcm1Nb3Vz
ZUV2ZW50Jik7CiAKLSAgICBTdHlsZVNoZWV0TGlzdCogc3R5bGVTaGVldHMoKTsKLQogICAgIC8q
IE5ld2x5IHByb3Bvc2VkIENTUzMgbWVjaGFuaXNtIGZvciBzZWxlY3RpbmcgYWx0ZXJuYXRlCiAg
ICAgICAgc3R5bGVzaGVldHMgdXNpbmcgdGhlIERPTS4gTWF5IGJlIHN1YmplY3QgdG8gY2hhbmdl
IGFzCiAgICAgICAgc3BlYyBtYXR1cmVzLiAtIGR3aApAQCAtOTc0LDcgKzkzMSw4IEBAIHB1Ymxp
YzoKICAgICBlbnVtIFBlbmRpbmdTaGVldExheW91dCB7IE5vTGF5b3V0V2l0aFBlbmRpbmdTaGVl
dHMsIERpZExheW91dFdpdGhQZW5kaW5nU2hlZXRzLCBJZ25vcmVMYXlvdXRXaXRoUGVuZGluZ1No
ZWV0cyB9OwogCiAgICAgYm9vbCBkaWRMYXlvdXRXaXRoUGVuZGluZ1N0eWxlc2hlZXRzKCkgY29u
c3QgeyByZXR1cm4gbV9wZW5kaW5nU2hlZXRMYXlvdXQgPT0gRGlkTGF5b3V0V2l0aFBlbmRpbmdT
aGVldHM7IH0KLSAgICAKKworICAgIGJvb2wgaGFzTm9kZXNXaXRoUGxhY2Vob2xkZXJTdHlsZSgp
IGNvbnN0IHsgcmV0dXJuIG1faGFzTm9kZXNXaXRoUGxhY2Vob2xkZXJTdHlsZTsgfQogICAgIHZv
aWQgc2V0SGFzTm9kZXNXaXRoUGxhY2Vob2xkZXJTdHlsZSgpIHsgbV9oYXNOb2Rlc1dpdGhQbGFj
ZWhvbGRlclN0eWxlID0gdHJ1ZTsgfQogCiAgICAgY29uc3QgVmVjdG9yPEljb25VUkw+JiBpY29u
VVJMcygpOwpAQCAtMTE5NCw2ICsxMTUyLDEzIEBAIHB1YmxpYzoKIAogICAgIFBhc3NSZWZQdHI8
RWxlbWVudEF0dHJpYnV0ZURhdGE+IGNhY2hlZEltbXV0YWJsZUF0dHJpYnV0ZURhdGEoY29uc3Qg
RWxlbWVudCosIGNvbnN0IFZlY3RvcjxBdHRyaWJ1dGU+Jik7CiAKKyAgICB2b2lkIGRpZFJlbW92
ZUFsbFBlbmRpbmdTdHlsZXNoZWV0KCk7CisgICAgdm9pZCBzZXROZWVkc05vdGlmeVJlbW92ZUFs
bFBlbmRpbmdTdHlsZXNoZWV0KCkgeyBtX25lZWRzTm90aWZ5UmVtb3ZlQWxsUGVuZGluZ1N0eWxl
c2hlZXQgPSB0cnVlOyB9CisgICAgdm9pZCBjbGVhclN0eWxlUmVzb2x2ZXIoKTsKKyAgICB2b2lk
IG5vdGlmeVNlYW1sZXNzQ2hpbGREb2N1bWVudHNPZlN0eWxlc2hlZXRVcGRhdGUoKSBjb25zdDsK
KworICAgIGJvb2wgaW5TdHlsZVJlY2FsYygpIHsgcmV0dXJuIG1faW5TdHlsZVJlY2FsYzsgfQor
CiAgICAgTG9jYWxpemVyJiBnZXRMb2NhbGl6ZXIoY29uc3QgQXRvbWljU3RyaW5nJiBsb2NhbGUp
OwogCiBwcm90ZWN0ZWQ6CkBAIC0xMjQxLDE5ICsxMjA2LDggQEAgcHJpdmF0ZToKICAgICB2b2lk
IGJ1aWxkQWNjZXNzS2V5TWFwKFRyZWVTY29wZSogcm9vdCk7CiAKICAgICB2b2lkIGNyZWF0ZVN0
eWxlUmVzb2x2ZXIoKTsKLSAgICB2b2lkIGNsZWFyU3R5bGVSZXNvbHZlcigpOwotICAgIHZvaWQg
Y29tYmluZUNTU0ZlYXR1cmVGbGFncygpOwotICAgIHZvaWQgcmVzZXRDU1NGZWF0dXJlRmxhZ3Mo
KTsKLSAgICAKLSAgICBib29sIHVwZGF0ZUFjdGl2ZVN0eWxlc2hlZXRzKFN0eWxlUmVzb2x2ZXJV
cGRhdGVGbGFnKTsKLSAgICB2b2lkIGNvbGxlY3RBY3RpdmVTdHlsZXNoZWV0cyhWZWN0b3I8UmVm
UHRyPFN0eWxlU2hlZXQ+ID4mKTsKLSAgICBib29sIHRlc3RBZGRlZFN0eWxlc2hlZXRSZXF1aXJl
c1N0eWxlUmVjYWxjKFN0eWxlU2hlZXRDb250ZW50cyopOwotICAgIHZvaWQgYW5hbHl6ZVN0eWxl
c2hlZXRDaGFuZ2UoU3R5bGVSZXNvbHZlclVwZGF0ZUZsYWcsIGNvbnN0IFZlY3RvcjxSZWZQdHI8
U3R5bGVTaGVldD4gPiYgbmV3U3R5bGVzaGVldHMsIGJvb2wmIHJlcXVpcmVzU3R5bGVSZXNvbHZl
clJlc2V0LCBib29sJiByZXF1aXJlc0Z1bGxTdHlsZVJlY2FsYyk7Ci0gICAgdm9pZCBkaWRSZW1v
dmVBbGxQZW5kaW5nU3R5bGVzaGVldCgpOwotICAgIHZvaWQgc2V0TmVlZHNOb3RpZnlSZW1vdmVB
bGxQZW5kaW5nU3R5bGVzaGVldCgpIHsgbV9uZWVkc05vdGlmeVJlbW92ZUFsbFBlbmRpbmdTdHls
ZXNoZWV0ID0gdHJ1ZTsgfQogCiAgICAgdm9pZCBzZWFtbGVzc1BhcmVudFVwZGF0ZWRTdHlsZXNo
ZWV0cygpOwotICAgIHZvaWQgbm90aWZ5U2VhbWxlc3NDaGlsZERvY3VtZW50c09mU3R5bGVzaGVl
dFVwZGF0ZSgpIGNvbnN0OwogCiAgICAgdm9pZCBkZWxldGVDdXN0b21Gb250cygpOwogCkBAIC0x
MjkwLDYgKzEyNDQsMTcgQEAgcHJpdmF0ZToKICAgICBPd25QdHI8U3R5bGVSZXNvbHZlcj4gbV9z
dHlsZVJlc29sdmVyOwogICAgIGJvb2wgbV9kaWRDYWxjdWxhdGVTdHlsZVJlc29sdmVyOwogICAg
IGJvb2wgbV9oYXNEaXJ0eVN0eWxlUmVzb2x2ZXI7CisgICAgYm9vbCBtX2hhc05vZGVzV2l0aFBs
YWNlaG9sZGVyU3R5bGU7CisgICAgYm9vbCBtX25lZWRzTm90aWZ5UmVtb3ZlQWxsUGVuZGluZ1N0
eWxlc2hlZXQ7CisgICAgLy8gQnV0IHNvbWV0aW1lcyB5b3UgbmVlZCB0byBpZ25vcmUgcGVuZGlu
ZyBzdHlsZXNoZWV0IGNvdW50IHRvCisgICAgLy8gZm9yY2UgYW4gaW1tZWRpYXRlIGxheW91dCB3
aGVuIHJlcXVlc3RlZCBieSBKUy4KKyAgICBib29sIG1faWdub3JlUGVuZGluZ1N0eWxlc2hlZXRz
OworCisgICAgLy8gSWYgd2UgZG8gaWdub3JlIHRoZSBwZW5kaW5nIHN0eWxlc2hlZXQgY291bnQs
IHRoZW4gd2UgbmVlZCB0byBhZGQgYSBib29sZWFuCisgICAgLy8gdG8gdHJhY2sgdGhhdCB0aGlz
IGhhcHBlbmVkIHNvIHRoYXQgd2UgY2FuIGRvIGEgZnVsbCByZXBhaW50IHdoZW4gdGhlIHN0eWxl
c2hlZXRzCisgICAgLy8gZG8gZXZlbnR1YWxseSBsb2FkLgorICAgIFBlbmRpbmdTaGVldExheW91
dCBtX3BlbmRpbmdTaGVldExheW91dDsKKwogICAgIFZlY3RvcjxPd25QdHI8Rm9udERhdGE+ID4g
bV9jdXN0b21Gb250czsKIAogICAgIEZyYW1lKiBtX2ZyYW1lOwpAQCAtMTMyMywyOSArMTI4OCw3
IEBAIHByaXZhdGU6CiAgICAgUmVmUHRyPERvY3VtZW50VHlwZT4gbV9kb2NUeXBlOwogICAgIE93
blB0cjxET01JbXBsZW1lbnRhdGlvbj4gbV9pbXBsZW1lbnRhdGlvbjsKIAotICAgIC8vIFRyYWNr
IHRoZSBudW1iZXIgb2YgY3VycmVudGx5IGxvYWRpbmcgdG9wLWxldmVsIHN0eWxlc2hlZXRzIG5l
ZWRlZCBmb3IgcmVuZGVyaW5nLgotICAgIC8vIFNoZWV0cyBsb2FkZWQgdXNpbmcgdGhlIEBpbXBv
cnQgZGlyZWN0aXZlIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhpcyBjb3VudC4KLSAgICAvLyBXZSB1
c2UgdGhpcyBjb3VudCBvZiBwZW5kaW5nIHNoZWV0cyB0byBkZXRlY3Qgd2hlbiB3ZSBjYW4gYmVn
aW4gYXR0YWNoaW5nCi0gICAgLy8gZWxlbWVudHMgYW5kIHdoZW4gaXQgaXMgc2FmZSB0byBleGVj
dXRlIHNjcmlwdHMuCi0gICAgaW50IG1fcGVuZGluZ1N0eWxlc2hlZXRzOwotCi0gICAgLy8gQnV0
IHNvbWV0aW1lcyB5b3UgbmVlZCB0byBpZ25vcmUgcGVuZGluZyBzdHlsZXNoZWV0IGNvdW50IHRv
Ci0gICAgLy8gZm9yY2UgYW4gaW1tZWRpYXRlIGxheW91dCB3aGVuIHJlcXVlc3RlZCBieSBKUy4K
LSAgICBib29sIG1faWdub3JlUGVuZGluZ1N0eWxlc2hlZXRzIDogMTsKLSAgICBib29sIG1fbmVl
ZHNOb3RpZnlSZW1vdmVBbGxQZW5kaW5nU3R5bGVzaGVldCA6IDE7Ci0KLSAgICAvLyBJZiB3ZSBk
byBpZ25vcmUgdGhlIHBlbmRpbmcgc3R5bGVzaGVldCBjb3VudCwgdGhlbiB3ZSBuZWVkIHRvIGFk
ZCBhIGJvb2xlYW4KLSAgICAvLyB0byB0cmFjayB0aGF0IHRoaXMgaGFwcGVuZWQgc28gdGhhdCB3
ZSBjYW4gZG8gYSBmdWxsIHJlcGFpbnQgd2hlbiB0aGUgc3R5bGVzaGVldHMKLSAgICAvLyBkbyBl
dmVudHVhbGx5IGxvYWQuCi0gICAgUGVuZGluZ1NoZWV0TGF5b3V0IG1fcGVuZGluZ1NoZWV0TGF5
b3V0OwotICAgIAotICAgIGJvb2wgbV9oYXNOb2Rlc1dpdGhQbGFjZWhvbGRlclN0eWxlOwotCiAg
ICAgUmVmUHRyPENTU1N0eWxlU2hlZXQ+IG1fZWxlbVNoZWV0OwotICAgIFJlZlB0cjxDU1NTdHls
ZVNoZWV0PiBtX3BhZ2VVc2VyU2hlZXQ7Ci0gICAgbXV0YWJsZSBPd25QdHI8VmVjdG9yPFJlZlB0
cjxDU1NTdHlsZVNoZWV0PiA+ID4gbV9wYWdlR3JvdXBVc2VyU2hlZXRzOwotICAgIE93blB0cjxW
ZWN0b3I8UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4gPiBtX3VzZXJTaGVldHM7Ci0gICAgbXV0YWJs
ZSBib29sIG1fcGFnZUdyb3VwVXNlclNoZWV0Q2FjaGVWYWxpZDsKIAogICAgIGJvb2wgbV9wcmlu
dGluZzsKICAgICBib29sIG1fcGFnaW5hdGVkRm9yU2NyZWVuOwpAQCAtMTM3NCwxMSArMTMxNyw4
IEBAIHByaXZhdGU6CiAgICAgTXV0YXRpb25PYnNlcnZlck9wdGlvbnMgbV9tdXRhdGlvbk9ic2Vy
dmVyVHlwZXM7CiAjZW5kaWYKIAotICAgIFJlZlB0cjxTdHlsZVNoZWV0TGlzdD4gbV9zdHlsZVNo
ZWV0czsgLy8gQWxsIG9mIHRoZSBzdHlsZXNoZWV0cyB0aGF0IGFyZSBjdXJyZW50bHkgaW4gZWZm
ZWN0IGZvciBvdXIgbWVkaWEgdHlwZSBhbmQgc3R5bGVzaGVldCBzZXQuCi0gICAgYm9vbCBtX2hh
ZEFjdGl2ZUxvYWRpbmdTdHlsZXNoZWV0OwotICAgIAotICAgIHR5cGVkZWYgTGlzdEhhc2hTZXQ8
Tm9kZSosIDMyPiBTdHlsZVNoZWV0Q2FuZGlkYXRlTGlzdEhhc2hTZXQ7Ci0gICAgU3R5bGVTaGVl
dENhbmRpZGF0ZUxpc3RIYXNoU2V0IG1fc3R5bGVTaGVldENhbmRpZGF0ZU5vZGVzOyAvLyBBbGwg
b2YgdGhlIG5vZGVzIHRoYXQgY291bGQgcG90ZW50aWFsbHkgcHJvdmlkZSBzdHlsZXNoZWV0cyB0
byB0aGUgZG9jdW1lbnQgKDxsaW5rPiwgPHN0eWxlPiwgPD94bWwtc3R5bGVzaGVldD4pCisKKyAg
ICBPd25QdHI8RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbj4gbV9zdHlsZVNoZWV0Q29sbGVj
dGlvbjsKIAogICAgIE93blB0cjxGb3JtQ29udHJvbGxlcj4gbV9mb3JtQ29udHJvbGxlcjsKIApA
QCAtMTM4Niw5ICsxMzI2LDYgQEAgcHJpdmF0ZToKICAgICBDb2xvciBtX3Zpc2l0ZWRMaW5rQ29s
b3I7CiAgICAgQ29sb3IgbV9hY3RpdmVMaW5rQ29sb3I7CiAKLSAgICBTdHJpbmcgbV9wcmVmZXJy
ZWRTdHlsZXNoZWV0U2V0OwotICAgIFN0cmluZyBtX3NlbGVjdGVkU3R5bGVzaGVldFNldDsKLQog
ICAgIGJvb2wgbV9sb2FkaW5nU2hlZXQ7CiAgICAgYm9vbCBtX3Zpc3VhbGx5T3JkZXJlZDsKICAg
ICBSZWFkeVN0YXRlIG1fcmVhZHlTdGF0ZTsKQEAgLTEzOTksMTQgKzEzMzYsNiBAQCBwcml2YXRl
OgogICAgIGJvb2wgbV9pblN0eWxlUmVjYWxjOwogICAgIGJvb2wgbV9jbG9zZUFmdGVyU3R5bGVS
ZWNhbGM7CiAKLSAgICBib29sIG1fdXNlc1NpYmxpbmdSdWxlczsKLSAgICBib29sIG1fdXNlc1Np
YmxpbmdSdWxlc092ZXJyaWRlOwotICAgIGJvb2wgbV91c2VzRmlyc3RMaW5lUnVsZXM7Ci0gICAg
Ym9vbCBtX3VzZXNGaXJzdExldHRlclJ1bGVzOwotICAgIGJvb2wgbV91c2VzQmVmb3JlQWZ0ZXJS
dWxlczsKLSAgICBib29sIG1fdXNlc0JlZm9yZUFmdGVyUnVsZXNPdmVycmlkZTsKLSAgICBib29s
IG1fdXNlc1JlbVVuaXRzOwotICAgIGJvb2wgbV91c2VzTGlua1J1bGVzOwogICAgIGJvb2wgbV9n
b3RvQW5jaG9yTmVlZGVkQWZ0ZXJTdHlsZXNoZWV0c0xvYWQ7CiAgICAgYm9vbCBtX2lzRE5TUHJl
ZmV0Y2hFbmFibGVkOwogICAgIGJvb2wgbV9oYXZlRXhwbGljaXRseURpc2FibGVkRE5TUHJlZmV0
Y2g7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9kb20vRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlv
bi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZG9tL0RvY3VtZW50U3R5bGVTaGVl
dENvbGxlY3Rpb24uY3BwCShyZXZpc2lvbiAxMjkzMDMpCShmcm9tIFNvdXJjZS9XZWJDb3JlL2Rv
bS9Eb2N1bWVudC5jcHA6MTI5MzAzKQorKysgU291cmNlL1dlYkNvcmUvZG9tL0RvY3VtZW50U3R5
bGVTaGVldENvbGxlY3Rpb24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjM5NyBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBMYXJzIEtub2xsIChrbm9sbEBrZGUub3JnKQorICog
ICAgICAgICAgIChDKSAxOTk5IEFudHRpIEtvaXZpc3RvIChrb2l2aXN0b0BrZGUub3JnKQorICog
ICAgICAgICAgIChDKSAyMDAxIERpcmsgTXVlbGxlciAobXVlbGxlckBrZGUub3JnKQorICogICAg
ICAgICAgIChDKSAyMDA2IEFsZXhleSBQcm9za3VyeWFrb3YgKGFwQHdlYmtpdC5vcmcpCisgKiBD
b3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTEsIDIw
MTIgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA4
LCAyMDA5IFRvcmNoIE1vYmlsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIChodHRwOi8vd3d3
LnRvcmNobW9iaWxlLmNvbS8pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDksIDIwMTEsIDIw
MTIgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAx
MCBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykKKyAqIENvcHly
aWdodCAoQykgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQgMjAxMC0yMDExLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2Fu
IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2Yg
dGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBi
eSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0
aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisg
KiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJl
IHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp
bXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1Ymxp
YyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2Vp
dmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICog
YWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5v
dCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZy
YW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVT
QS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRG9jdW1lbnQuaCIKKwor
I2luY2x1ZGUgIkFYT2JqZWN0Q2FjaGUuaCIKKyNpbmNsdWRlICJBbmltYXRpb25Db250cm9sbGVy
LmgiCisjaW5jbHVkZSAiQXR0ci5oIgorI2luY2x1ZGUgIkF0dHJpYnV0ZS5oIgorI2luY2x1ZGUg
IkNEQVRBU2VjdGlvbi5oIgorI2luY2x1ZGUgIkNTU1BhcnNlci5oIgorI2luY2x1ZGUgIkNTU1N0
eWxlRGVjbGFyYXRpb24uaCIKKyNpbmNsdWRlICJDU1NTdHlsZVNoZWV0LmgiCisjaW5jbHVkZSAi
Q1NTVmFsdWVLZXl3b3Jkcy5oIgorI2luY2x1ZGUgIkNhY2hlZENTU1N0eWxlU2hlZXQuaCIKKyNp
bmNsdWRlICJDYWNoZWRSZXNvdXJjZUxvYWRlci5oIgorI2luY2x1ZGUgIkNocm9tZS5oIgorI2lu
Y2x1ZGUgIkNocm9tZUNsaWVudC5oIgorI2luY2x1ZGUgIkNvbW1lbnQuaCIKKyNpbmNsdWRlICJD
b25zb2xlLmgiCisjaW5jbHVkZSAiQ29udGVudFNlY3VyaXR5UG9saWN5LmgiCisjaW5jbHVkZSAi
Q29udGV4dEZlYXR1cmVzLmgiCisjaW5jbHVkZSAiQ29va2llSmFyLmgiCisjaW5jbHVkZSAiRE9N
SW1wbGVtZW50YXRpb24uaCIKKyNpbmNsdWRlICJET01OYW1lZEZsb3dDb2xsZWN0aW9uLmgiCisj
aW5jbHVkZSAiRE9NU2VsZWN0aW9uLmgiCisjaW5jbHVkZSAiRE9NV2luZG93LmgiCisjaW5jbHVk
ZSAiRGF0ZUNvbXBvbmVudHMuaCIKKyNpbmNsdWRlICJEZXZpY2VNb3Rpb25Db250cm9sbGVyLmgi
CisjaW5jbHVkZSAiRGV2aWNlT3JpZW50YXRpb25Db250cm9sbGVyLmgiCisjaW5jbHVkZSAiRG9j
dW1lbnRFdmVudFF1ZXVlLmgiCisjaW5jbHVkZSAiRG9jdW1lbnRGcmFnbWVudC5oIgorI2luY2x1
ZGUgIkRvY3VtZW50TG9hZGVyLmgiCisjaW5jbHVkZSAiRG9jdW1lbnRNYXJrZXJDb250cm9sbGVy
LmgiCisjaW5jbHVkZSAiRG9jdW1lbnRUeXBlLmgiCisjaW5jbHVkZSAiRWRpdGluZ1RleHQuaCIK
KyNpbmNsdWRlICJFZGl0b3IuaCIKKyNpbmNsdWRlICJFbGVtZW50LmgiCisjaW5jbHVkZSAiRWxl
bWVudFNoYWRvdy5oIgorI2luY2x1ZGUgIkVudGl0eVJlZmVyZW5jZS5oIgorI2luY2x1ZGUgIkV2
ZW50LmgiCisjaW5jbHVkZSAiRXZlbnRGYWN0b3J5LmgiCisjaW5jbHVkZSAiRXZlbnRIYW5kbGVy
LmgiCisjaW5jbHVkZSAiRXZlbnRMaXN0ZW5lci5oIgorI2luY2x1ZGUgIkV2ZW50TmFtZXMuaCIK
KyNpbmNsdWRlICJFeGNlcHRpb25Db2RlLmgiCisjaW5jbHVkZSAiRmxvd1RocmVhZENvbnRyb2xs
ZXIuaCIKKyNpbmNsdWRlICJGb2N1c0NvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJGb3JtQ29udHJv
bGxlci5oIgorI2luY2x1ZGUgIkZyYW1lLmgiCisjaW5jbHVkZSAiRnJhbWVMb2FkZXIuaCIKKyNp
bmNsdWRlICJGcmFtZUxvYWRlckNsaWVudC5oIgorI2luY2x1ZGUgIkZyYW1lU2VsZWN0aW9uLmgi
CisjaW5jbHVkZSAiRnJhbWVUcmVlLmgiCisjaW5jbHVkZSAiRnJhbWVWaWV3LmgiCisjaW5jbHVk
ZSAiR2VvbG9jYXRpb25Db250cm9sbGVyLmgiCisjaW5jbHVkZSAiSGFzaENoYW5nZUV2ZW50Lmgi
CisjaW5jbHVkZSAiSGlzdG9ncmFtU3VwcG9ydC5oIgorI2luY2x1ZGUgIkhpc3RvcnkuaCIKKyNp
bmNsdWRlICJIVE1MQWxsQ29sbGVjdGlvbi5oIgorI2luY2x1ZGUgIkhUTUxBbmNob3JFbGVtZW50
LmgiCisjaW5jbHVkZSAiSFRNTEJvZHlFbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTENhbnZhc0Vs
ZW1lbnQuaCIKKyNpbmNsdWRlICJIVE1MQ29sbGVjdGlvbi5oIgorI2luY2x1ZGUgIkhUTUxEb2N1
bWVudC5oIgorI2luY2x1ZGUgIkhUTUxFbGVtZW50RmFjdG9yeS5oIgorI2luY2x1ZGUgIkhUTUxG
cmFtZU93bmVyRWxlbWVudC5oIgorI2luY2x1ZGUgIkhUTUxIZWFkRWxlbWVudC5oIgorI2luY2x1
ZGUgIkhUTUxJRnJhbWVFbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTExpbmtFbGVtZW50LmgiCisj
aW5jbHVkZSAiSFRNTE1hcEVsZW1lbnQuaCIKKyNpbmNsdWRlICJIVE1MTmFtZUNvbGxlY3Rpb24u
aCIKKyNpbmNsdWRlICJIVE1MTmFtZXMuaCIKKyNpbmNsdWRlICJIVE1MUGFyc2VySWRpb21zLmgi
CisjaW5jbHVkZSAiSFRNTFN0eWxlRWxlbWVudC5oIgorI2luY2x1ZGUgIkhUTUxUaXRsZUVsZW1l
bnQuaCIKKyNpbmNsdWRlICJIVFRQUGFyc2Vycy5oIgorI2luY2x1ZGUgIkhpdFRlc3RSZXF1ZXN0
LmgiCisjaW5jbHVkZSAiSGl0VGVzdFJlc3VsdC5oIgorI2luY2x1ZGUgIkltYWdlTG9hZGVyLmgi
CisjaW5jbHVkZSAiSW5zcGVjdG9yQ291bnRlcnMuaCIKKyNpbmNsdWRlICJJbnNwZWN0b3JJbnN0
cnVtZW50YXRpb24uaCIKKyNpbmNsdWRlICJMYW5ndWFnZS5oIgorI2luY2x1ZGUgIkxvY2FsaXpl
ci5oIgorI2luY2x1ZGUgIkxvZ2dpbmcuaCIKKyNpbmNsdWRlICJNZWRpYVF1ZXJ5TGlzdC5oIgor
I2luY2x1ZGUgIk1lZGlhUXVlcnlNYXRjaGVyLmgiCisjaW5jbHVkZSAiTW91c2VFdmVudFdpdGhI
aXRUZXN0UmVzdWx0cy5oIgorI2luY2x1ZGUgIk5hbWVOb2RlTGlzdC5oIgorI2luY2x1ZGUgIk5h
bWVkRmxvd0NvbGxlY3Rpb24uaCIKKyNpbmNsdWRlICJOZXN0aW5nTGV2ZWxJbmNyZW1lbnRlci5o
IgorI2luY2x1ZGUgIk5ld1hNTERvY3VtZW50UGFyc2VyLmgiCisjaW5jbHVkZSAiTm9kZUZpbHRl
ci5oIgorI2luY2x1ZGUgIk5vZGVJdGVyYXRvci5oIgorI2luY2x1ZGUgIk5vZGVSYXJlRGF0YS5o
IgorI2luY2x1ZGUgIk5vZGVXaXRoSW5kZXguaCIKKyNpbmNsdWRlICJQYWdlLmgiCisjaW5jbHVk
ZSAiUGFnZUdyb3VwLmgiCisjaW5jbHVkZSAiUGFnZVRyYW5zaXRpb25FdmVudC5oIgorI2luY2x1
ZGUgIlBsYXRmb3JtS2V5Ym9hcmRFdmVudC5oIgorI2luY2x1ZGUgIlBsdWdpbkRvY3VtZW50Lmgi
CisjaW5jbHVkZSAiUG9pbnRlckxvY2tDb250cm9sbGVyLmgiCisjaW5jbHVkZSAiUG9wU3RhdGVF
dmVudC5oIgorI2luY2x1ZGUgIlByb2Nlc3NpbmdJbnN0cnVjdGlvbi5oIgorI2luY2x1ZGUgIlJl
Z2lzdGVyZWRFdmVudExpc3RlbmVyLmgiCisjaW5jbHVkZSAiUmVuZGVyQXJlbmEuaCIKKyNpbmNs
dWRlICJSZW5kZXJOYW1lZEZsb3dUaHJlYWQuaCIKKyNpbmNsdWRlICJSZW5kZXJUZXh0Q29udHJv
bC5oIgorI2luY2x1ZGUgIlJlbmRlclZpZXcuaCIKKyNpbmNsdWRlICJSZW5kZXJXaWRnZXQuaCIK
KyNpbmNsdWRlICJSdW50aW1lRW5hYmxlZEZlYXR1cmVzLmgiCisjaW5jbHVkZSAiU2NoZW1lUmVn
aXN0cnkuaCIKKyNpbmNsdWRlICJTY29wZWRFdmVudFF1ZXVlLmgiCisjaW5jbHVkZSAiU2NyaXB0
Q2FsbFN0YWNrLmgiCisjaW5jbHVkZSAiU2NyaXB0Q29udHJvbGxlci5oIgorI2luY2x1ZGUgIlNj
cmlwdEVsZW1lbnQuaCIKKyNpbmNsdWRlICJTY3JpcHRFdmVudExpc3RlbmVyLmgiCisjaW5jbHVk
ZSAiU2NyaXB0UnVubmVyLmgiCisjaW5jbHVkZSAiU2Nyb2xsaW5nQ29vcmRpbmF0b3IuaCIKKyNp
bmNsdWRlICJTZWN1cml0eU9yaWdpbi5oIgorI2luY2x1ZGUgIlNlY3VyaXR5UG9saWN5LmgiCisj
aW5jbHVkZSAiU2VnbWVudGVkU3RyaW5nLmgiCisjaW5jbHVkZSAiU2VsZWN0b3JRdWVyeS5oIgor
I2luY2x1ZGUgIlNldHRpbmdzLmgiCisjaW5jbHVkZSAiU2hhZG93Um9vdC5oIgorI2luY2x1ZGUg
IlN0YXRpY0hhc2hTZXROb2RlTGlzdC5oIgorI2luY2x1ZGUgIlN0eWxlUmVzb2x2ZXIuaCIKKyNp
bmNsdWRlICJTdHlsZVNoZWV0Q29udGVudHMuaCIKKyNpbmNsdWRlICJTdHlsZVNoZWV0TGlzdC5o
IgorI2luY2x1ZGUgIlRleHRSZXNvdXJjZURlY29kZXIuaCIKKyNpbmNsdWRlICJUaW1lci5oIgor
I2luY2x1ZGUgIlRyYW5zZm9ybVNvdXJjZS5oIgorI2luY2x1ZGUgIlRyZWVXYWxrZXIuaCIKKyNp
bmNsdWRlICJVbmRvTWFuYWdlci5oIgorI2luY2x1ZGUgIlVzZXJDb250ZW50VVJMUGF0dGVybi5o
IgorI2luY2x1ZGUgIldlYkNvcmVNZW1vcnlJbnN0cnVtZW50YXRpb24uaCIKKyNpbmNsdWRlICJX
ZWJLaXROYW1lZEZsb3cuaCIKKyNpbmNsdWRlICJYTUxEb2N1bWVudFBhcnNlci5oIgorI2luY2x1
ZGUgIlhNTEh0dHBSZXF1ZXN0LmgiCisjaW5jbHVkZSAiWE1MTlNOYW1lcy5oIgorI2luY2x1ZGUg
IlhNTE5hbWVzLmgiCisjaW5jbHVkZSAiWFBhdGhFdmFsdWF0b3IuaCIKKyNpbmNsdWRlICJYUGF0
aEV4cHJlc3Npb24uaCIKKyNpbmNsdWRlICJYUGF0aE5TUmVzb2x2ZXIuaCIKKyNpbmNsdWRlICJY
UGF0aFJlc3VsdC5oIgorI2luY2x1ZGUgImh0bWxlZGl0aW5nLmgiCisjaW5jbHVkZSA8d3RmL0N1
cnJlbnRUaW1lLmg+CisjaW5jbHVkZSA8d3RmL0hhc2hGdW5jdGlvbnMuaD4KKyNpbmNsdWRlIDx3
dGYvTWFpblRocmVhZC5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzUmVmUHRyLmg+CisjaW5jbHVkZSA8
d3RmL1N0ZExpYkV4dHJhcy5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1N0cmluZ0J1ZmZlci5oPgor
CisjaWYgRU5BQkxFKFNIQVJFRF9XT1JLRVJTKQorI2luY2x1ZGUgIlNoYXJlZFdvcmtlclJlcG9z
aXRvcnkuaCIKKyNlbmRpZgorCisjaWYgRU5BQkxFKFhTTFQpCisjaW5jbHVkZSAiWFNMVFByb2Nl
c3Nvci5oIgorI2VuZGlmCisKKyNpZiBFTkFCTEUoU1ZHKQorI2luY2x1ZGUgIlNWR0RvY3VtZW50
RXh0ZW5zaW9ucy5oIgorI2luY2x1ZGUgIlNWR0VsZW1lbnRGYWN0b3J5LmgiCisjaW5jbHVkZSAi
U1ZHTmFtZXMuaCIKKyNpbmNsdWRlICJTVkdTVkdFbGVtZW50LmgiCisjaW5jbHVkZSAiU1ZHU3R5
bGVFbGVtZW50LmgiCisjZW5kaWYKKworI2lmIEVOQUJMRShUT1VDSF9FVkVOVFMpCisjaW5jbHVk
ZSAiVG91Y2hMaXN0LmgiCisjZW5kaWYKKworI2lmIEVOQUJMRShNQVRITUwpCisjaW5jbHVkZSAi
TWF0aE1MRWxlbWVudC5oIgorI2luY2x1ZGUgIk1hdGhNTEVsZW1lbnRGYWN0b3J5LmgiCisjaW5j
bHVkZSAiTWF0aE1MTmFtZXMuaCIKKyNlbmRpZgorCisjaWYgRU5BQkxFKEZVTExTQ1JFRU5fQVBJ
KQorI2luY2x1ZGUgIlJlbmRlckZ1bGxTY3JlZW4uaCIKKyNlbmRpZgorCisjaWYgRU5BQkxFKFJF
UVVFU1RfQU5JTUFUSU9OX0ZSQU1FKQorI2luY2x1ZGUgIlJlcXVlc3RBbmltYXRpb25GcmFtZUNh
bGxiYWNrLmgiCisjaW5jbHVkZSAiU2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyLmgiCisjZW5k
aWYKKworI2lmIEVOQUJMRShNSUNST0RBVEEpCisjaW5jbHVkZSAiTWljcm9EYXRhSXRlbUxpc3Qu
aCIKKyNpbmNsdWRlICJOb2RlUmFyZURhdGEuaCIKKyNlbmRpZgorCisjaWYgRU5BQkxFKExJTktf
UFJFUkVOREVSKQorI2luY2x1ZGUgIlByZXJlbmRlcmVyLmgiCisjZW5kaWYKKworI2lmIEVOQUJM
RShURVhUX0FVVE9TSVpJTkcpCisjaW5jbHVkZSAiVGV4dEF1dG9zaXplci5oIgorI2VuZGlmCisK
KyNpZiBFTkFCTEUoQ1NQX05FWFQpCisjaW5jbHVkZSAiRE9NU2VjdXJpdHlQb2xpY3kuaCIKKyNl
bmRpZgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgbmFtZXNwYWNlIFdURjsKK3VzaW5n
IG5hbWVzcGFjZSBVbmljb2RlOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3VzaW5nIG5hbWVz
cGFjZSBIVE1MTmFtZXM7CisKKy8vICNkZWZpbmUgSU5TVFJVTUVOVF9MQVlPVVRfU0NIRURVTElO
RyAxCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjTWF4V3JpdGVSZWN1cnNpb25EZXB0aCA9IDIx
OworCisvLyBUaGlzIGFtb3VudCBvZiB0aW1lIG11c3QgaGF2ZSBlbGFwc2VkIGJlZm9yZSB3ZSB3
aWxsIGV2ZW4gY29uc2lkZXIgc2NoZWR1bGluZyBhIGxheW91dCB3aXRob3V0IGEgZGVsYXkuCisv
LyBGSVhNRTogRm9yIGZhc3RlciBtYWNoaW5lcyB0aGlzIHZhbHVlIGNhbiByZWFsbHkgYmUgbG93
ZXJlZCB0byAyMDAuICAyNTAgaXMgYWRlcXVhdGUsIGJ1dCBhIGxpdHRsZSBoaWdoCisvLyBmb3Ig
ZHVhbCBHNXMuIDopCitzdGF0aWMgY29uc3QgaW50IGNMYXlvdXRTY2hlZHVsZVRocmVzaG9sZCA9
IDI1MDsKKworLy8gRE9NIExldmVsIDIgc2F5cyAobGV0dGVycyBhZGRlZCk6CisvLworLy8gYSkg
TmFtZSBzdGFydCBjaGFyYWN0ZXJzIG11c3QgaGF2ZSBvbmUgb2YgdGhlIGNhdGVnb3JpZXMgTGws
IEx1LCBMbywgTHQsIE5sLgorLy8gYikgTmFtZSBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gTmFtZS1z
dGFydCBjaGFyYWN0ZXJzIG11c3QgaGF2ZSBvbmUgb2YgdGhlIGNhdGVnb3JpZXMgTWMsIE1lLCBN
biwgTG0sIG9yIE5kLgorLy8gYykgQ2hhcmFjdGVycyBpbiB0aGUgY29tcGF0aWJpbGl0eSBhcmVh
IChpLmUuIHdpdGggY2hhcmFjdGVyIGNvZGUgZ3JlYXRlciB0aGFuICN4RjkwMCBhbmQgbGVzcyB0
aGFuICN4RkZGRSkgYXJlIG5vdCBhbGxvd2VkIGluIFhNTCBuYW1lcy4KKy8vIGQpIENoYXJhY3Rl
cnMgd2hpY2ggaGF2ZSBhIGZvbnQgb3IgY29tcGF0aWJpbGl0eSBkZWNvbXBvc2l0aW9uIChpLmUu
IHRob3NlIHdpdGggYSAiY29tcGF0aWJpbGl0eSBmb3JtYXR0aW5nIHRhZyIgaW4gZmllbGQgNSBv
ZiB0aGUgZGF0YWJhc2UgLS0gbWFya2VkIGJ5IGZpZWxkIDUgYmVnaW5uaW5nIHdpdGggYSAiPCIp
IGFyZSBub3QgYWxsb3dlZC4KKy8vIGUpIFRoZSBmb2xsb3dpbmcgY2hhcmFjdGVycyBhcmUgdHJl
YXRlZCBhcyBuYW1lLXN0YXJ0IGNoYXJhY3RlcnMgcmF0aGVyIHRoYW4gbmFtZSBjaGFyYWN0ZXJz
LCBiZWNhdXNlIHRoZSBwcm9wZXJ0eSBmaWxlIGNsYXNzaWZpZXMgdGhlbSBhcyBBbHBoYWJldGlj
OiBbI3gwMkJCLSN4MDJDMV0sICN4MDU1OSwgI3gwNkU1LCAjeDA2RTYuCisvLyBmKSBDaGFyYWN0
ZXJzICN4MjBERC0jeDIwRTAgYXJlIGV4Y2x1ZGVkIChpbiBhY2NvcmRhbmNlIHdpdGggVW5pY29k
ZSwgc2VjdGlvbiA1LjE0KS4KKy8vIGcpIENoYXJhY3RlciAjeDAwQjcgaXMgY2xhc3NpZmllZCBh
cyBhbiBleHRlbmRlciwgYmVjYXVzZSB0aGUgcHJvcGVydHkgbGlzdCBzbyBpZGVudGlmaWVzIGl0
LgorLy8gaCkgQ2hhcmFjdGVyICN4MDM4NyBpcyBhZGRlZCBhcyBhIG5hbWUgY2hhcmFjdGVyLCBi
ZWNhdXNlICN4MDBCNyBpcyBpdHMgY2Fub25pY2FsIGVxdWl2YWxlbnQuCisvLyBpKSBDaGFyYWN0
ZXJzICc6JyBhbmQgJ18nIGFyZSBhbGxvd2VkIGFzIG5hbWUtc3RhcnQgY2hhcmFjdGVycy4KKy8v
IGopIENoYXJhY3RlcnMgJy0nIGFuZCAnLicgYXJlIGFsbG93ZWQgYXMgbmFtZSBjaGFyYWN0ZXJz
LgorLy8KKy8vIEl0IGFsc28gY29udGFpbnMgY29tcGxldGUgdGFibGVzLiBJZiB3ZSBkZWNpZGUg
aXQncyBiZXR0ZXIsIHdlIGNvdWxkIGluY2x1ZGUgdGhvc2UgaW5zdGVhZCBvZiB0aGUgZm9sbG93
aW5nIGNvZGUuCisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc1ZhbGlkTmFtZVN0YXJ0KFVDaGFyMzIg
YykKK3sKKyAgICAvLyBydWxlIChlKSBhYm92ZQorICAgIGlmICgoYyA+PSAweDAyQkIgJiYgYyA8
PSAweDAyQzEpIHx8IGMgPT0gMHg1NTkgfHwgYyA9PSAweDZFNSB8fCBjID09IDB4NkU2KQorICAg
ICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIHJ1bGUgKGkpIGFib3ZlCisgICAgaWYgKGMgPT0g
JzonIHx8IGMgPT0gJ18nKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIHJ1bGVzIChh
KSBhbmQgKGYpIGFib3ZlCisgICAgY29uc3QgdWludDMyX3QgbmFtZVN0YXJ0TWFzayA9IExldHRl
cl9Mb3dlcmNhc2UgfCBMZXR0ZXJfVXBwZXJjYXNlIHwgTGV0dGVyX090aGVyIHwgTGV0dGVyX1Rp
dGxlY2FzZSB8IE51bWJlcl9MZXR0ZXI7CisgICAgaWYgKCEoVW5pY29kZTo6Y2F0ZWdvcnkoYykg
JiBuYW1lU3RhcnRNYXNrKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gcnVsZSAo
YykgYWJvdmUKKyAgICBpZiAoYyA+PSAweEY5MDAgJiYgYyA8IDB4RkZGRSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgLy8gcnVsZSAoZCkgYWJvdmUKKyAgICBEZWNvbXBvc2l0aW9uVHlw
ZSBkZWNvbXBUeXBlID0gZGVjb21wb3NpdGlvblR5cGUoYyk7CisgICAgaWYgKGRlY29tcFR5cGUg
PT0gRGVjb21wb3NpdGlvbkZvbnQgfHwgZGVjb21wVHlwZSA9PSBEZWNvbXBvc2l0aW9uQ29tcGF0
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGlj
IGlubGluZSBib29sIGlzVmFsaWROYW1lUGFydChVQ2hhcjMyIGMpCit7CisgICAgLy8gcnVsZXMg
KGEpLCAoZSksIGFuZCAoaSkgYWJvdmUKKyAgICBpZiAoaXNWYWxpZE5hbWVTdGFydChjKSkKKyAg
ICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBydWxlcyAoZykgYW5kIChoKSBhYm92ZQorICAg
IGlmIChjID09IDB4MDBCNyB8fCBjID09IDB4MDM4NykKKyAgICAgICAgcmV0dXJuIHRydWU7CisK
KyAgICAvLyBydWxlIChqKSBhYm92ZQorICAgIGlmIChjID09ICctJyB8fCBjID09ICcuJykKKyAg
ICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBydWxlcyAoYikgYW5kIChmKSBhYm92ZQorICAg
IGNvbnN0IHVpbnQzMl90IG90aGVyTmFtZVBhcnRNYXNrID0gTWFya19Ob25TcGFjaW5nIHwgTWFy
a19FbmNsb3NpbmcgfCBNYXJrX1NwYWNpbmdDb21iaW5pbmcgfCBMZXR0ZXJfTW9kaWZpZXIgfCBO
dW1iZXJfRGVjaW1hbERpZ2l0OworICAgIGlmICghKFVuaWNvZGU6OmNhdGVnb3J5KGMpICYgb3Ro
ZXJOYW1lUGFydE1hc2spKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBydWxlIChj
KSBhYm92ZQorICAgIGlmIChjID49IDB4RjkwMCAmJiBjIDwgMHhGRkZFKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICAvLyBydWxlIChkKSBhYm92ZQorICAgIERlY29tcG9zaXRpb25UeXBl
IGRlY29tcFR5cGUgPSBkZWNvbXBvc2l0aW9uVHlwZShjKTsKKyAgICBpZiAoZGVjb21wVHlwZSA9
PSBEZWNvbXBvc2l0aW9uRm9udCB8fCBkZWNvbXBUeXBlID09IERlY29tcG9zaXRpb25Db21wYXQp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMg
Ym9vbCBzaG91bGRJbmhlcml0U2VjdXJpdHlPcmlnaW5Gcm9tT3duZXIoY29uc3QgS1VSTCYgdXJs
KQoreworICAgIC8vIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50
LXdvcmsvI29yaWdpbi0wCisgICAgLy8KKyAgICAvLyBJZiBhIERvY3VtZW50IGhhcyB0aGUgYWRk
cmVzcyAiYWJvdXQ6YmxhbmsiCisgICAgLy8gICAgIFRoZSBvcmlnaW4gb2YgdGhlIERvY3VtZW50
IGlzIHRoZSBvcmlnaW4gaXQgd2FzIGFzc2lnbmVkIHdoZW4gaXRzIGJyb3dzaW5nIGNvbnRleHQg
d2FzIGNyZWF0ZWQuCisgICAgLy8KKyAgICAvLyBOb3RlOiBXZSBnZW5lcmFsaXplIHRoaXMgdG8g
YWxsICJibGFuayIgVVJMcyBhbmQgaW52YWxpZCBVUkxzIGJlY2F1c2Ugd2UKKyAgICAvLyB0cmVh
dCBhbGwgb2YgdGhlc2UgVVJMcyBhcyBhYm91dDpibGFuay4KKyAgICAvLworICAgIHJldHVybiAh
dXJsLmlzVmFsaWQoKSB8fCB1cmwuaXNCbGFua1VSTCgpOworfQorCitzdGF0aWMgV2lkZ2V0KiB3
aWRnZXRGb3JOb2RlKE5vZGUqIGZvY3VzZWROb2RlKQoreworICAgIGlmICghZm9jdXNlZE5vZGUp
CisgICAgICAgIHJldHVybiAwOworICAgIFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSBmb2N1c2Vk
Tm9kZS0+cmVuZGVyZXIoKTsKKyAgICBpZiAoIXJlbmRlcmVyIHx8ICFyZW5kZXJlci0+aXNXaWRn
ZXQoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIHRvUmVuZGVyV2lkZ2V0KHJlbmRl
cmVyKS0+d2lkZ2V0KCk7Cit9CisKK3N0YXRpYyBib29sIGFjY2VwdHNFZGl0aW5nRm9jdXMoTm9k
ZSogbm9kZSkKK3sKKyAgICBBU1NFUlQobm9kZSk7CisgICAgQVNTRVJUKG5vZGUtPnJlbmRlcmVy
SXNFZGl0YWJsZSgpKTsKKworICAgIE5vZGUqIHJvb3QgPSBub2RlLT5yb290RWRpdGFibGVFbGVt
ZW50KCk7CisgICAgRnJhbWUqIGZyYW1lID0gbm9kZS0+ZG9jdW1lbnQoKS0+ZnJhbWUoKTsKKyAg
ICBpZiAoIWZyYW1lIHx8ICFyb290KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1
cm4gZnJhbWUtPmVkaXRvcigpLT5zaG91bGRCZWdpbkVkaXRpbmcocmFuZ2VPZkNvbnRlbnRzKHJv
b3QpLmdldCgpKTsKK30KKworc3RhdGljIGJvb2wgY2FuQWNjZXNzQW5jZXN0b3IoY29uc3QgU2Vj
dXJpdHlPcmlnaW4qIGFjdGl2ZVNlY3VyaXR5T3JpZ2luLCBGcmFtZSogdGFyZ2V0RnJhbWUpCit7
CisgICAgLy8gdGFyZ2V0RnJhbWUgY2FuIGJlIDAgd2hlbiB3ZSdyZSB0cnlpbmcgdG8gbmF2aWdh
dGUgYSB0b3AtbGV2ZWwgZnJhbWUKKyAgICAvLyB0aGF0IGhhcyBhIDAgb3BlbmVyLgorICAgIGlm
ICghdGFyZ2V0RnJhbWUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGNvbnN0IGJvb2wg
aXNMb2NhbEFjdGl2ZU9yaWdpbiA9IGFjdGl2ZVNlY3VyaXR5T3JpZ2luLT5pc0xvY2FsKCk7Cisg
ICAgZm9yIChGcmFtZSogYW5jZXN0b3JGcmFtZSA9IHRhcmdldEZyYW1lOyBhbmNlc3RvckZyYW1l
OyBhbmNlc3RvckZyYW1lID0gYW5jZXN0b3JGcmFtZS0+dHJlZSgpLT5wYXJlbnQoKSkgeworICAg
ICAgICBEb2N1bWVudCogYW5jZXN0b3JEb2N1bWVudCA9IGFuY2VzdG9yRnJhbWUtPmRvY3VtZW50
KCk7CisgICAgICAgIC8vIEZJWE1FOiBTaG91bGQgYmUgYW4gQVNTRVJUPyBGcmFtZXMgc2hvdWxk
IGFsd2F5IGhhdmUgZG9jdW1lbnRzLgorICAgICAgICBpZiAoIWFuY2VzdG9yRG9jdW1lbnQpCisg
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICBjb25zdCBTZWN1cml0eU9yaWdpbiog
YW5jZXN0b3JTZWN1cml0eU9yaWdpbiA9IGFuY2VzdG9yRG9jdW1lbnQtPnNlY3VyaXR5T3JpZ2lu
KCk7CisgICAgICAgIGlmIChhY3RpdmVTZWN1cml0eU9yaWdpbi0+Y2FuQWNjZXNzKGFuY2VzdG9y
U2VjdXJpdHlPcmlnaW4pKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIAorICAg
ICAgICAvLyBBbGxvdyBmaWxlIFVSTCBkZXNjZW5kYW50IG5hdmlnYXRpb24gZXZlbiB3aGVuIGFs
bG93RmlsZUFjY2Vzc0Zyb21GaWxlVVJMcyBpcyBmYWxzZS4KKyAgICAgICAgLy8gRklYTUU6IEl0
J3MgYSBiaXQgc3RyYW5nZSB0byBzcGVjaWFsLWNhc2UgbG9jYWwgb3JpZ2lucyBoZXJlLiBTaG91
bGQgd2UgYmUgZG9pbmcKKyAgICAgICAgLy8gc29tZXRoaW5nIG1vcmUgZ2VuZXJhbCBpbnN0ZWFk
PworICAgICAgICBpZiAoaXNMb2NhbEFjdGl2ZU9yaWdpbiAmJiBhbmNlc3RvclNlY3VyaXR5T3Jp
Z2luLT5pc0xvY2FsKCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBy
ZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50TmF2aWdhdGlvbkVycm9yTWVzc2Fn
ZShGcmFtZSogZnJhbWUsIGNvbnN0IEtVUkwmIGFjdGl2ZVVSTCkKK3sKKyAgICAvLyBGSVhNRTog
dGhpcyBlcnJvciBtZXNzYWdlIHNob3VsZCBjb250YWluIG1vcmUgc3BlY2lmaWNzIG9mIHdoeSB0
aGUgbmF2aWdhdGlvbiBjaGFuZ2UgaXMgbm90IGFsbG93ZWQuCisgICAgU3RyaW5nIG1lc3NhZ2Ug
PSAiVW5zYWZlIEphdmFTY3JpcHQgYXR0ZW1wdCB0byBpbml0aWF0ZSBhIG5hdmlnYXRpb24gY2hh
bmdlIGZvciBmcmFtZSB3aXRoIFVSTCAiICsKKyAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5k
b2N1bWVudCgpLT51cmwoKS5zdHJpbmcoKSArICIgZnJvbSBmcmFtZSB3aXRoIFVSTCAiICsgYWN0
aXZlVVJMLnN0cmluZygpICsgIi5cbiI7CisKKyAgICAvLyBGSVhNRTogc2hvdWxkIHdlIHByaW50
IHRvIHRoZSBjb25zb2xlIG9mIHRoZSBkb2N1bWVudCBwZXJmb3JtaW5nIHRoZSBuYXZpZ2F0aW9u
IGluc3RlYWQ/CisgICAgZnJhbWUtPmRvY3VtZW50KCktPmRvbVdpbmRvdygpLT5wcmludEVycm9y
TWVzc2FnZShtZXNzYWdlKTsKK30KKworc3RhdGljIEhhc2hTZXQ8RG9jdW1lbnQqPiogZG9jdW1l
bnRzVGhhdE5lZWRTdHlsZVJlY2FsYyA9IDA7CisKK2NsYXNzIERvY3VtZW50V2Vha1JlZmVyZW5j
ZSA6IHB1YmxpYyBUaHJlYWRTYWZlUmVmQ291bnRlZDxEb2N1bWVudFdlYWtSZWZlcmVuY2U+IHsK
K3B1YmxpYzoKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxEb2N1bWVudFdlYWtSZWZlcmVuY2U+IGNy
ZWF0ZShEb2N1bWVudCogZG9jdW1lbnQpCisgICAgeworICAgICAgICByZXR1cm4gYWRvcHRSZWYo
bmV3IERvY3VtZW50V2Vha1JlZmVyZW5jZShkb2N1bWVudCkpOworICAgIH0KKworICAgIERvY3Vt
ZW50KiBkb2N1bWVudCgpCisgICAgeworICAgICAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOwor
ICAgICAgICByZXR1cm4gbV9kb2N1bWVudDsKKyAgICB9CisKKyAgICB2b2lkIGNsZWFyKCkKKyAg
ICB7CisgICAgICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisgICAgICAgIG1fZG9jdW1lbnQg
PSAwOworICAgIH0KKworcHJpdmF0ZToKKyAgICBEb2N1bWVudFdlYWtSZWZlcmVuY2UoRG9jdW1l
bnQqIGRvY3VtZW50KQorICAgICAgICA6IG1fZG9jdW1lbnQoZG9jdW1lbnQpCisgICAgeworICAg
ICAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworICAgIH0KKworICAgIERvY3VtZW50KiBtX2Rv
Y3VtZW50OworfTsKKwordWludDY0X3QgRG9jdW1lbnQ6OnNfZ2xvYmFsVHJlZVZlcnNpb24gPSAw
OworCitEb2N1bWVudDo6RG9jdW1lbnQoRnJhbWUqIGZyYW1lLCBjb25zdCBLVVJMJiB1cmwsIGJv
b2wgaXNYSFRNTCwgYm9vbCBpc0hUTUwpCisgICAgOiBDb250YWluZXJOb2RlKDAsIENyZWF0ZURv
Y3VtZW50KQorICAgICwgVHJlZVNjb3BlKHRoaXMpCisgICAgLCBtX2d1YXJkUmVmQ291bnQoMCkK
KyAgICAsIG1fY29udGV4dEZlYXR1cmVzKENvbnRleHRGZWF0dXJlczo6ZGVmYXVsdFN3aXRjaCgp
KQorICAgICwgbV9jb21wYXRpYmlsaXR5TW9kZShOb1F1aXJrc01vZGUpCisgICAgLCBtX2NvbXBh
dGliaWxpdHlNb2RlTG9ja2VkKGZhbHNlKQorICAgICwgbV9kb21UcmVlVmVyc2lvbigrK3NfZ2xv
YmFsVHJlZVZlcnNpb24pCisjaWYgRU5BQkxFKE1VVEFUSU9OX09CU0VSVkVSUykKKyAgICAsIG1f
bXV0YXRpb25PYnNlcnZlclR5cGVzKDApCisjZW5kaWYKKyAgICAsIG1fc3R5bGVTaGVldHMoU3R5
bGVTaGVldExpc3Q6OmNyZWF0ZSh0aGlzKSkKKyAgICAsIG1faGFkQWN0aXZlTG9hZGluZ1N0eWxl
c2hlZXQoZmFsc2UpCisgICAgLCBtX3JlYWR5U3RhdGUoQ29tcGxldGUpCisgICAgLCBtX3N0eWxl
UmVjYWxjVGltZXIodGhpcywgJkRvY3VtZW50OjpzdHlsZVJlY2FsY1RpbWVyRmlyZWQpCisgICAg
LCBtX3BlbmRpbmdTdHlsZVJlY2FsY1Nob3VsZEZvcmNlKGZhbHNlKQorICAgICwgbV9mcmFtZUVs
ZW1lbnRzU2hvdWxkSWdub3JlU2Nyb2xsaW5nKGZhbHNlKQorICAgICwgbV9jb250YWluc1ZhbGlk
aXR5U3R5bGVSdWxlcyhmYWxzZSkKKyAgICAsIG1fdXBkYXRlRm9jdXNBcHBlYXJhbmNlUmVzdG9y
ZXNTZWxlY3Rpb24oZmFsc2UpCisgICAgLCBtX2lnbm9yZURlc3RydWN0aXZlV3JpdGVDb3VudCgw
KQorICAgICwgbV90aXRsZVNldEV4cGxpY2l0bHkoZmFsc2UpCisgICAgLCBtX3VwZGF0ZUZvY3Vz
QXBwZWFyYW5jZVRpbWVyKHRoaXMsICZEb2N1bWVudDo6dXBkYXRlRm9jdXNBcHBlYXJhbmNlVGlt
ZXJGaXJlZCkKKyAgICAsIG1fbG9hZEV2ZW50RmluaXNoZWQoZmFsc2UpCisgICAgLCBtX3N0YXJ0
VGltZShjdXJyZW50VGltZSgpKQorICAgICwgbV9vdmVyTWluaW11bUxheW91dFRocmVzaG9sZChm
YWxzZSkKKyAgICAsIG1fc2NyaXB0UnVubmVyKFNjcmlwdFJ1bm5lcjo6Y3JlYXRlKHRoaXMpKQor
ICAgICwgbV94bWxWZXJzaW9uKCIxLjAiKQorICAgICwgbV94bWxTdGFuZGFsb25lKFN0YW5kYWxv
bmVVbnNwZWNpZmllZCkKKyAgICAsIG1faGFzWE1MRGVjbGFyYXRpb24oMCkKKyAgICAsIG1fc2F2
ZWRSZW5kZXJlcigwKQorICAgICwgbV9kZXNpZ25Nb2RlKGluaGVyaXQpCisjaWYgRU5BQkxFKERB
U0hCT0FSRF9TVVBQT1JUKSB8fCBFTkFCTEUoV0lER0VUX1JFR0lPTikKKyAgICAsIG1faGFzRGFz
aGJvYXJkUmVnaW9ucyhmYWxzZSkKKyAgICAsIG1fZGFzaGJvYXJkUmVnaW9uc0RpcnR5KGZhbHNl
KQorI2VuZGlmCisgICAgLCBtX2NyZWF0ZVJlbmRlcmVycyh0cnVlKQorICAgICwgbV9pblBhZ2VD
YWNoZShmYWxzZSkKKyAgICAsIG1fYWNjZXNzS2V5TWFwVmFsaWQoZmFsc2UpCisgICAgLCBtX3Vz
ZVNlY3VyZUtleWJvYXJkRW50cnlXaGVuQWN0aXZlKGZhbHNlKQorICAgICwgbV9pc1hIVE1MKGlz
WEhUTUwpCisgICAgLCBtX2lzSFRNTChpc0hUTUwpCisgICAgLCBtX2lzVmlld1NvdXJjZShmYWxz
ZSkKKyAgICAsIG1fc2F3RWxlbWVudHNJbktub3duTmFtZXNwYWNlcyhmYWxzZSkKKyAgICAsIG1f
aXNTcmNkb2NEb2N1bWVudChmYWxzZSkKKyAgICAsIG1fZG9jdW1lbnRSYXJlRGF0YSgwKQorICAg
ICwgbV9ldmVudFF1ZXVlKERvY3VtZW50RXZlbnRRdWV1ZTo6Y3JlYXRlKHRoaXMpKQorICAgICwg
bV93ZWFrUmVmZXJlbmNlKERvY3VtZW50V2Vha1JlZmVyZW5jZTo6Y3JlYXRlKHRoaXMpKQorICAg
ICwgbV9pZEF0dHJpYnV0ZU5hbWUoaWRBdHRyKQorI2lmIEVOQUJMRShGVUxMU0NSRUVOX0FQSSkK
KyAgICAsIG1fYXJlS2V5c0VuYWJsZWRJbkZ1bGxTY3JlZW4oMCkKKyAgICAsIG1fZnVsbFNjcmVl
blJlbmRlcmVyKDApCisgICAgLCBtX2Z1bGxTY3JlZW5DaGFuZ2VEZWxheVRpbWVyKHRoaXMsICZE
b2N1bWVudDo6ZnVsbFNjcmVlbkNoYW5nZURlbGF5VGltZXJGaXJlZCkKKyAgICAsIG1faXNBbmlt
YXRpbmdGdWxsU2NyZWVuKGZhbHNlKQorI2VuZGlmCisgICAgLCBtX2xvYWRFdmVudERlbGF5Q291
bnQoMCkKKyAgICAsIG1fbG9hZEV2ZW50RGVsYXlUaW1lcih0aGlzLCAmRG9jdW1lbnQ6OmxvYWRF
dmVudERlbGF5VGltZXJGaXJlZCkKKyAgICAsIG1fcmVmZXJyZXJQb2xpY3koUmVmZXJyZXJQb2xp
Y3lEZWZhdWx0KQorICAgICwgbV9kaXJlY3Rpb25TZXRPbkRvY3VtZW50RWxlbWVudChmYWxzZSkK
KyAgICAsIG1fd3JpdGluZ01vZGVTZXRPbkRvY3VtZW50RWxlbWVudChmYWxzZSkKKyAgICAsIG1f
d3JpdGVSZWN1cnNpb25Jc1Rvb0RlZXAoZmFsc2UpCisgICAgLCBtX3dyaXRlUmVjdXJzaW9uRGVw
dGgoMCkKKyAgICAsIG1fd2hlZWxFdmVudEhhbmRsZXJDb3VudCgwKQorI2lmIEVOQUJMRShUT1VD
SF9FVkVOVFMpCisgICAgLCBtX3RvdWNoRXZlbnRIYW5kbGVyQ291bnQoMCkKKyNlbmRpZgorI2lm
IEVOQUJMRShVTkRPX01BTkFHRVIpCisgICAgLCBtX3VuZG9NYW5hZ2VyKDApCisjZW5kaWYKKyAg
ICAsIG1fcGVuZGluZ1Rhc2tzVGltZXIodGhpcywgJkRvY3VtZW50OjpwZW5kaW5nVGFza3NUaW1l
ckZpcmVkKQorICAgICwgbV9zY2hlZHVsZWRUYXNrc0FyZVN1c3BlbmRlZChmYWxzZSkKKyAgICAs
IG1fdmlzdWFsVXBkYXRlc0FsbG93ZWQodHJ1ZSkKKyAgICAsIG1fdmlzdWFsVXBkYXRlc1N1cHBy
ZXNzaW9uVGltZXIodGhpcywgJkRvY3VtZW50Ojp2aXN1YWxVcGRhdGVzU3VwcHJlc3Npb25UaW1l
ckZpcmVkKQorI2lmbmRlZiBOREVCVUcKKyAgICAsIG1fZGlkRGlzcGF0Y2hWaWV3cG9ydFByb3Bl
cnRpZXNDaGFuZ2VkKGZhbHNlKQorI2VuZGlmCit7CisgICAgbV9kb2N1bWVudCA9IHRoaXM7CisK
KyAgICBtX3BhZ2VHcm91cFVzZXJTaGVldENhY2hlVmFsaWQgPSBmYWxzZTsKKworICAgIG1fcHJp
bnRpbmcgPSBmYWxzZTsKKyAgICBtX3BhZ2luYXRlZEZvclNjcmVlbiA9IGZhbHNlOworCisgICAg
bV9pZ25vcmVBdXRvZm9jdXMgPSBmYWxzZTsKKworICAgIG1fZnJhbWUgPSBmcmFtZTsKKyAgICBp
ZiAobV9mcmFtZSkKKyAgICAgICAgcHJvdmlkZUNvbnRleHRGZWF0dXJlc1RvRG9jdW1lbnRGcm9t
KHRoaXMsIG1fZnJhbWUtPnBhZ2UoKSk7CisKKyAgICAvLyBXZSBkZXBlbmQgb24gdGhlIHVybCBn
ZXR0aW5nIGltbWVkaWF0ZWx5IHNldCBpbiBzdWJmcmFtZXMsIGJ1dCB3ZQorICAgIC8vIGFsc28g
ZGVwZW5kIG9uIHRoZSB1cmwgTk9UIGdldHRpbmcgaW1tZWRpYXRlbHkgc2V0IGluIG9wZW5lZCB3
aW5kb3dzLgorICAgIC8vIFNlZSBmYXN0L2RvbS9lYXJseS1mcmFtZS11cmwuaHRtbAorICAgIC8v
IGFuZCBmYXN0L2RvbS9sb2NhdGlvbi1uZXctd2luZG93LW5vLWNyYXNoLmh0bWwsIHJlc3BlY3Rp
dmVseS4KKyAgICAvLyBGSVhNRTogQ2FuL3Nob3VsZCB3ZSB1bmlmeSB0aGlzIGJlaGF2aW9yPwor
ICAgIGlmICgoZnJhbWUgJiYgZnJhbWUtPm93bmVyRWxlbWVudCgpKSB8fCAhdXJsLmlzRW1wdHko
KSkKKyAgICAgICAgc2V0VVJMKHVybCk7CisKKyAgICBtX2F4T2JqZWN0Q2FjaGUgPSAwOworCisg
ICAgbV9tYXJrZXJzID0gYWRvcHRQdHIobmV3IERvY3VtZW50TWFya2VyQ29udHJvbGxlcik7CisK
KyAgICBtX2NhY2hlZFJlc291cmNlTG9hZGVyID0gYWRvcHRQdHIobmV3IENhY2hlZFJlc291cmNl
TG9hZGVyKHRoaXMpKTsKKyNpZiBFTkFCTEUoTElOS19QUkVSRU5ERVIpCisgICAgbV9wcmVyZW5k
ZXJlciA9IFByZXJlbmRlcmVyOjpjcmVhdGUodGhpcyk7CisjZW5kaWYKKyNpZiBFTkFCTEUoVEVY
VF9BVVRPU0laSU5HKQorICAgIG1fdGV4dEF1dG9zaXplciA9IFRleHRBdXRvc2l6ZXI6OmNyZWF0
ZSh0aGlzKTsKKyNlbmRpZgorICAgIG1fdmlzdWFsbHlPcmRlcmVkID0gZmFsc2U7CisgICAgbV9i
UGFyc2luZyA9IGZhbHNlOworICAgIG1fd2VsbEZvcm1lZCA9IGZhbHNlOworCisgICAgbV90ZXh0
Q29sb3IgPSBDb2xvcjo6YmxhY2s7CisgICAgbV9saXN0ZW5lclR5cGVzID0gMDsKKyAgICBtX2lu
U3R5bGVSZWNhbGMgPSBmYWxzZTsKKyAgICBtX2Nsb3NlQWZ0ZXJTdHlsZVJlY2FsYyA9IGZhbHNl
OworCisgICAgbV91c2VzU2libGluZ1J1bGVzID0gZmFsc2U7CisgICAgbV91c2VzU2libGluZ1J1
bGVzT3ZlcnJpZGUgPSBmYWxzZTsKKyAgICBtX3VzZXNGaXJzdExpbmVSdWxlcyA9IGZhbHNlOwor
ICAgIG1fdXNlc0ZpcnN0TGV0dGVyUnVsZXMgPSBmYWxzZTsKKyAgICBtX3VzZXNCZWZvcmVBZnRl
clJ1bGVzID0gZmFsc2U7CisgICAgbV91c2VzQmVmb3JlQWZ0ZXJSdWxlc092ZXJyaWRlID0gZmFs
c2U7CisgICAgbV91c2VzUmVtVW5pdHMgPSBmYWxzZTsKKyAgICBtX3VzZXNMaW5rUnVsZXMgPSBm
YWxzZTsKKworICAgIG1fZ290b0FuY2hvck5lZWRlZEFmdGVyU3R5bGVzaGVldHNMb2FkID0gZmFs
c2U7CisKKyAgICBtX2RpZENhbGN1bGF0ZVN0eWxlUmVzb2x2ZXIgPSBmYWxzZTsKKyAgICBtX2hh
c0RpcnR5U3R5bGVSZXNvbHZlciA9IGZhbHNlOworICAgIG1fcGVuZGluZ1N0eWxlc2hlZXRzID0g
MDsKKyAgICBtX2lnbm9yZVBlbmRpbmdTdHlsZXNoZWV0cyA9IGZhbHNlOworICAgIG1fbmVlZHNO
b3RpZnlSZW1vdmVBbGxQZW5kaW5nU3R5bGVzaGVldCA9IGZhbHNlOworICAgIG1faGFzTm9kZXNX
aXRoUGxhY2Vob2xkZXJTdHlsZSA9IGZhbHNlOworICAgIG1fcGVuZGluZ1NoZWV0TGF5b3V0ID0g
Tm9MYXlvdXRXaXRoUGVuZGluZ1NoZWV0czsKKworICAgIG1fY3NzVGFyZ2V0ID0gMDsKKworICAg
IHJlc2V0TGlua0NvbG9yKCk7CisgICAgcmVzZXRWaXNpdGVkTGlua0NvbG9yKCk7CisgICAgcmVz
ZXRBY3RpdmVMaW5rQ29sb3IoKTsKKworICAgIG1fcHJvY2Vzc2luZ0xvYWRFdmVudCA9IGZhbHNl
OworICAgIAorICAgIGluaXRTZWN1cml0eUNvbnRleHQoKTsKKyAgICBpbml0RE5TUHJlZmV0Y2go
KTsKKworICAgIHN0YXRpYyBpbnQgZG9jSUQgPSAwOworICAgIG1fZG9jSUQgPSBkb2NJRCsrOwor
CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IFdURl9BUlJBWV9MRU5HVEgobV9ub2RlTGlz
dENvdW50cyk7IGkrKykKKyAgICAgICAgbV9ub2RlTGlzdENvdW50c1tpXSA9IDA7CisKKyAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgV1RGX0FSUkFZX0xFTkdUSChtX2NvbGxlY3Rpb25zKTsg
aSsrKQorICAgICAgICBtX2NvbGxlY3Rpb25zW2ldID0gMDsKKworICAgIEluc3BlY3RvckNvdW50
ZXJzOjppbmNyZW1lbnRDb3VudGVyKEluc3BlY3RvckNvdW50ZXJzOjpEb2N1bWVudENvdW50ZXIp
OworfQorCitzdGF0aWMgdm9pZCBoaXN0b2dyYW1NdXRhdGlvbkV2ZW50VXNhZ2UoY29uc3QgdW5z
aWduZWQgc2hvcnQmIGxpc3RlbmVyVHlwZXMpCit7CisgICAgSGlzdG9ncmFtU3VwcG9ydDo6aGlz
dG9ncmFtRW51bWVyYXRpb24oIkRPTUFQSS5QZXJEb2N1bWVudE11dGF0aW9uRXZlbnRVc2FnZS5E
T01TdWJ0cmVlTW9kaWZpZWQiLCBzdGF0aWNfY2FzdDxib29sPihsaXN0ZW5lclR5cGVzICYgRG9j
dW1lbnQ6OkRPTVNVQlRSRUVNT0RJRklFRF9MSVNURU5FUiksIDIpOworICAgIEhpc3RvZ3JhbVN1
cHBvcnQ6Omhpc3RvZ3JhbUVudW1lcmF0aW9uKCJET01BUEkuUGVyRG9jdW1lbnRNdXRhdGlvbkV2
ZW50VXNhZ2UuRE9NTm9kZUluc2VydGVkIiwgc3RhdGljX2Nhc3Q8Ym9vbD4obGlzdGVuZXJUeXBl
cyAmIERvY3VtZW50OjpET01OT0RFSU5TRVJURURfTElTVEVORVIpLCAyKTsKKyAgICBIaXN0b2dy
YW1TdXBwb3J0OjpoaXN0b2dyYW1FbnVtZXJhdGlvbigiRE9NQVBJLlBlckRvY3VtZW50TXV0YXRp
b25FdmVudFVzYWdlLkRPTU5vZGVSZW1vdmVkIiwgc3RhdGljX2Nhc3Q8Ym9vbD4obGlzdGVuZXJU
eXBlcyAmIERvY3VtZW50OjpET01OT0RFUkVNT1ZFRF9MSVNURU5FUiksIDIpOworICAgIEhpc3Rv
Z3JhbVN1cHBvcnQ6Omhpc3RvZ3JhbUVudW1lcmF0aW9uKCJET01BUEkuUGVyRG9jdW1lbnRNdXRh
dGlvbkV2ZW50VXNhZ2UuRE9NTm9kZVJlbW92ZWRGcm9tRG9jdW1lbnQiLCBzdGF0aWNfY2FzdDxi
b29sPihsaXN0ZW5lclR5cGVzICYgRG9jdW1lbnQ6OkRPTU5PREVSRU1PVkVERlJPTURPQ1VNRU5U
X0xJU1RFTkVSKSwgMik7CisgICAgSGlzdG9ncmFtU3VwcG9ydDo6aGlzdG9ncmFtRW51bWVyYXRp
b24oIkRPTUFQSS5QZXJEb2N1bWVudE11dGF0aW9uRXZlbnRVc2FnZS5ET01Ob2RlSW5zZXJ0ZWRJ
bnRvRG9jdW1lbnQiLCBzdGF0aWNfY2FzdDxib29sPihsaXN0ZW5lclR5cGVzICYgRG9jdW1lbnQ6
OkRPTU5PREVJTlNFUlRFRElOVE9ET0NVTUVOVF9MSVNURU5FUiksIDIpOworICAgIEhpc3RvZ3Jh
bVN1cHBvcnQ6Omhpc3RvZ3JhbUVudW1lcmF0aW9uKCJET01BUEkuUGVyRG9jdW1lbnRNdXRhdGlv
bkV2ZW50VXNhZ2UuRE9NQ2hhcmFjdGVyRGF0YU1vZGlmaWVkIiwgc3RhdGljX2Nhc3Q8Ym9vbD4o
bGlzdGVuZXJUeXBlcyAmIERvY3VtZW50OjpET01DSEFSQUNURVJEQVRBTU9ESUZJRURfTElTVEVO
RVIpLCAyKTsKK30KKworI2lmIEVOQUJMRShGVUxMU0NSRUVOX0FQSSkKK3N0YXRpYyBib29sIGlz
QXR0cmlidXRlT25BbGxPd25lcnMoY29uc3QgV2ViQ29yZTo6UXVhbGlmaWVkTmFtZSYgYXR0cmli
dXRlLCBjb25zdCBIVE1MRnJhbWVPd25lckVsZW1lbnQqIG93bmVyKQoreworICAgIGlmICghb3du
ZXIpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIGRvIHsKKyAgICAgICAgaWYgKCFvd25lci0+
aGFzQXR0cmlidXRlKGF0dHJpYnV0ZSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
fSB3aGlsZSAoKG93bmVyID0gb3duZXItPmRvY3VtZW50KCktPm93bmVyRWxlbWVudCgpKSk7Cisg
ICAgcmV0dXJuIHRydWU7Cit9CisjZW5kaWYKKworRG9jdW1lbnQ6On5Eb2N1bWVudCgpCit7Cisg
ICAgQVNTRVJUKCFyZW5kZXJlcigpKTsKKyAgICBBU1NFUlQoIW1faW5QYWdlQ2FjaGUpOworICAg
IEFTU0VSVCghbV9zYXZlZFJlbmRlcmVyKTsKKyAgICBBU1NFUlQobV9yYW5nZXMuaXNFbXB0eSgp
KTsKKyAgICBBU1NFUlQoIW1fc3R5bGVSZWNhbGNUaW1lci5pc0FjdGl2ZSgpKTsKKyAgICBBU1NF
UlQoIW1fcGFyZW50VHJlZVNjb3BlKTsKKyAgICBBU1NFUlQoIW1fZ3VhcmRSZWZDb3VudCk7CisK
KyAgICAvLyBGSVhNRTogU2hvdWxkIHdlIHJlc2V0IG1fZG9tV2luZG93IHdoZW4gd2UgZGV0YWNo
IGZyb20gdGhlIEZyYW1lPworICAgIGlmIChtX2RvbVdpbmRvdykKKyAgICAgICAgbV9kb21XaW5k
b3ctPnJlc2V0VW5sZXNzU3VzcGVuZGVkRm9yUGFnZUNhY2hlKCk7CisKKyAgICBtX3NjcmlwdFJ1
bm5lci5jbGVhcigpOworCisgICAgaGlzdG9ncmFtTXV0YXRpb25FdmVudFVzYWdlKG1fbGlzdGVu
ZXJUeXBlcyk7CisKKyAgICByZW1vdmVBbGxFdmVudExpc3RlbmVycygpOworCisgICAgLy8gQ3Vy
cmVudGx5IHdlIGJlbGlldmUgdGhhdCBEb2N1bWVudCBjYW4gbmV2ZXIgb3V0bGl2ZSB0aGUgcGFy
c2VyLgorICAgIC8vIEFsdGhvdWdoIHRoZSBEb2N1bWVudCBtYXkgYmUgcmVwbGFjZWQgc3luY2hy
b25vdXNseSwgRG9jdW1lbnRQYXJzZXJzCisgICAgLy8gZ2VuZXJhbGx5IGtlZXAgYXQgbGVhc3Qg
b25lIHJlZmVyZW5jZSB0byBhbiBFbGVtZW50IHdoaWNoIHdvdWxkIGluIHR1cm4KKyAgICAvLyBo
YXMgYSByZWZlcmVuY2UgdG8gdGhlIERvY3VtZW50LiAgSWYgeW91IGhpdCB0aGlzIEFTU0VSVCwg
dGhlbiB0aGF0CisgICAgLy8gYXNzdW1wdGlvbiBpcyB3cm9uZy4gIERvY3VtZW50UGFyc2VyOjpk
ZXRhY2goKSBzaG91bGQgZW5zdXJlIHRoYXQgZXZlbgorICAgIC8vIGlmIHRoZSBEb2N1bWVudFBh
cnNlciBvdXRsaXZlcyB0aGUgRG9jdW1lbnQgaXQgd29uJ3QgY2F1c2UgYmFkbmVzcy4KKyAgICBB
U1NFUlQoIW1fcGFyc2VyIHx8IG1fcGFyc2VyLT5yZWZDb3VudCgpID09IDEpOworICAgIGRldGFj
aFBhcnNlcigpOworCisgICAgbV9yZW5kZXJBcmVuYS5jbGVhcigpOworCisgICAgY2xlYXJBWE9i
amVjdENhY2hlKCk7CisKKyAgICBtX2RlY29kZXIgPSAwOworCisgICAgaWYgKG1fc3R5bGVTaGVl
dHMpCisgICAgICAgIG1fc3R5bGVTaGVldHMtPmRvY3VtZW50RGVzdHJveWVkKCk7CisKKyAgICBp
ZiAobV9uYW1lZEZsb3dzKQorICAgICAgICBtX25hbWVkRmxvd3MtPmRvY3VtZW50RGVzdHJveWVk
KCk7CisKKyAgICBpZiAobV9lbGVtU2hlZXQpCisgICAgICAgIG1fZWxlbVNoZWV0LT5jbGVhck93
bmVyTm9kZSgpOworICAgIGlmIChtX3BhZ2VVc2VyU2hlZXQpCisgICAgICAgIG1fcGFnZVVzZXJT
aGVldC0+Y2xlYXJPd25lck5vZGUoKTsKKyAgICBpZiAobV9wYWdlR3JvdXBVc2VyU2hlZXRzKSB7
CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9wYWdlR3JvdXBVc2VyU2hlZXRzLT5z
aXplKCk7ICsraSkKKyAgICAgICAgICAgICgqbV9wYWdlR3JvdXBVc2VyU2hlZXRzKVtpXS0+Y2xl
YXJPd25lck5vZGUoKTsKKyAgICB9CisgICAgaWYgKG1fdXNlclNoZWV0cykgeworICAgICAgICBm
b3IgKHNpemVfdCBpID0gMDsgaSA8IG1fdXNlclNoZWV0cy0+c2l6ZSgpOyArK2kpCisgICAgICAg
ICAgICAoKm1fdXNlclNoZWV0cylbaV0tPmNsZWFyT3duZXJOb2RlKCk7CisgICAgfQorCisgICAg
ZGVsZXRlQ3VzdG9tRm9udHMoKTsKKworICAgIG1fd2Vha1JlZmVyZW5jZS0+Y2xlYXIoKTsKKwor
ICAgIGlmIChtX21lZGlhUXVlcnlNYXRjaGVyKQorICAgICAgICBtX21lZGlhUXVlcnlNYXRjaGVy
LT5kb2N1bWVudERlc3Ryb3llZCgpOworCisgICAgY2xlYXJTdHlsZVJlc29sdmVyKCk7IC8vIFdl
IG5lZWQgdG8gZGVzdG9yeSBDU1NGb250U2VsZWN0b3IgYmVmb3JlIGRlc3Ryb3lpbmcgbV9jYWNo
ZWRSZXNvdXJjZUxvYWRlci4KKyAgICBtX2NhY2hlZFJlc291cmNlTG9hZGVyLmNsZWFyKCk7CisK
KyAgICAvLyBXZSBtdXN0IGNhbGwgY2xlYXJSYXJlRGF0YSgpIGhlcmUgc2luY2UgYSBEb2N1bWVu
dCBjbGFzcyBpbmhlcml0cyBUcmVlU2NvcGUKKyAgICAvLyBhcyB3ZWxsIGFzIE5vZGUuIFNlZSBh
IGNvbW1lbnQgb24gVHJlZVNjb3BlLmggZm9yIHRoZSByZWFzb24uCisgICAgaWYgKGhhc1JhcmVE
YXRhKCkpCisgICAgICAgIGNsZWFyUmFyZURhdGEoKTsKKworICAgIEFTU0VSVCghbV9saXN0c0lu
dmFsaWRhdGVkQXREb2N1bWVudC5zaXplKCkpOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8IFdURl9BUlJBWV9MRU5HVEgobV9ub2RlTGlzdENvdW50cyk7IGkrKykKKyAgICAgICAgQVNT
RVJUKCFtX25vZGVMaXN0Q291bnRzW2ldKTsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBXVEZfQVJSQVlfTEVOR1RIKG1fY29sbGVjdGlvbnMpOyBpKyspCisgICAgICAgIEFTU0VSVCgh
bV9jb2xsZWN0aW9uc1tpXSk7CisKKyAgICBtX2RvY3VtZW50ID0gMDsKKworICAgIEluc3BlY3Rv
ckNvdW50ZXJzOjpkZWNyZW1lbnRDb3VudGVyKEluc3BlY3RvckNvdW50ZXJzOjpEb2N1bWVudENv
dW50ZXIpOworfQorCit2b2lkIERvY3VtZW50OjpyZW1vdmVkTGFzdFJlZigpCit7CisgICAgQVNT
RVJUKCFtX2RlbGV0aW9uSGFzQmVndW4pOworICAgIGlmIChtX2d1YXJkUmVmQ291bnQpIHsKKyAg
ICAgICAgLy8gSWYgcmVtb3ZpbmcgYSBjaGlsZCByZW1vdmVzIHRoZSBsYXN0IHNlbGYtb25seSBy
ZWYsIHdlIGRvbid0CisgICAgICAgIC8vIHdhbnQgdGhlIHNjb3BlIHRvIGJlIGRlc3RydWN0ZWQg
dW50aWwgYWZ0ZXIKKyAgICAgICAgLy8gcmVtb3ZlQWxsQ2hpbGRyZW4gcmV0dXJucywgc28gd2Ug
Z3VhcmQgb3Vyc2VsdmVzIHdpdGggYW4KKyAgICAgICAgLy8gZXh0cmEgc2VsZi1vbmx5IHJlZi4K
KyAgICAgICAgZ3VhcmRSZWYoKTsKKworICAgICAgICAvLyBXZSBtdXN0IG1ha2Ugc3VyZSBub3Qg
dG8gYmUgcmV0YWluaW5nIGFueSBvZiBvdXIgY2hpbGRyZW4gdGhyb3VnaAorICAgICAgICAvLyB0
aGVzZSBleHRyYSBwb2ludGVycyBvciB3ZSB3aWxsIGNyZWF0ZSBhIHJlZmVyZW5jZSBjeWNsZS4K
KyAgICAgICAgbV9kb2NUeXBlID0gMDsKKyAgICAgICAgbV9mb2N1c2VkTm9kZSA9IDA7CisgICAg
ICAgIG1faG92ZXJOb2RlID0gMDsKKyAgICAgICAgbV9hY3RpdmVOb2RlID0gMDsKKyAgICAgICAg
bV90aXRsZUVsZW1lbnQgPSAwOworICAgICAgICBtX2RvY3VtZW50RWxlbWVudCA9IDA7CisgICAg
ICAgIG1fY29udGV4dEZlYXR1cmVzID0gQ29udGV4dEZlYXR1cmVzOjpkZWZhdWx0U3dpdGNoKCk7
CisjaWYgRU5BQkxFKEZVTExTQ1JFRU5fQVBJKQorICAgICAgICBtX2Z1bGxTY3JlZW5FbGVtZW50
ID0gMDsKKyAgICAgICAgbV9mdWxsU2NyZWVuRWxlbWVudFN0YWNrLmNsZWFyKCk7CisjZW5kaWYK
KworICAgICAgICBkZXRhY2hQYXJzZXIoKTsKKworICAgICAgICAvLyByZW1vdmVBbGxDaGlsZHJl
bigpIGRvZXNuJ3QgYWx3YXlzIHVucmVnaXN0ZXIgSURzLAorICAgICAgICAvLyBzbyB0ZWFyIGRv
d24gc2NvcGUgaW5mb3JtYXRpb24gdXBmcm9udCB0byBhdm9pZCBoYXZpbmcgc3RhbGUgcmVmZXJl
bmNlcyBpbiB0aGUgbWFwLgorICAgICAgICBkZXN0cm95VHJlZVNjb3BlRGF0YSgpOworICAgICAg
ICByZW1vdmVBbGxDaGlsZHJlbigpOworCisgICAgICAgIG1fbWFya2Vycy0+ZGV0YWNoKCk7CisK
KyAgICAgICAgbV9jc3NDYW52YXNFbGVtZW50cy5jbGVhcigpOworCisjaWYgRU5BQkxFKFJFUVVF
U1RfQU5JTUFUSU9OX0ZSQU1FKQorICAgICAgICAvLyBGSVhNRTogY29uc2lkZXIgdXNpbmcgQWN0
aXZlRE9NT2JqZWN0LgorICAgICAgICBpZiAobV9zY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXIp
CisgICAgICAgICAgICBtX3NjcmlwdGVkQW5pbWF0aW9uQ29udHJvbGxlci0+Y2xlYXJEb2N1bWVu
dFBvaW50ZXIoKTsKKyAgICAgICAgbV9zY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXIuY2xlYXIo
KTsKKyNlbmRpZgorCisjaWZuZGVmIE5ERUJVRworICAgICAgICBtX2luUmVtb3ZlZExhc3RSZWZG
dW5jdGlvbiA9IGZhbHNlOworI2VuZGlmCisKKyAgICAgICAgZ3VhcmREZXJlZigpOworICAgIH0g
ZWxzZSB7CisjaWZuZGVmIE5ERUJVRyAKKyAgICAgICAgbV9kZWxldGlvbkhhc0JlZ3VuID0gdHJ1
ZTsgCisjZW5kaWYgCisgICAgICAgIGRlbGV0ZSB0aGlzOworICAgIH0KK30KKworRWxlbWVudCog
RG9jdW1lbnQ6OmdldEVsZW1lbnRCeUlkKGNvbnN0IEF0b21pY1N0cmluZyYgaWQpIGNvbnN0Cit7
CisgICAgcmV0dXJuIFRyZWVTY29wZTo6Z2V0RWxlbWVudEJ5SWQoaWQpOworfQorCitFbGVtZW50
KiBEb2N1bWVudDo6Z2V0RWxlbWVudEJ5QWNjZXNzS2V5KGNvbnN0IFN0cmluZyYga2V5KQorewor
ICAgIGlmIChrZXkuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIW1fYWNj
ZXNzS2V5TWFwVmFsaWQpIHsKKyAgICAgICAgYnVpbGRBY2Nlc3NLZXlNYXAodGhpcyk7CisgICAg
ICAgIG1fYWNjZXNzS2V5TWFwVmFsaWQgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gbV9lbGVt
ZW50c0J5QWNjZXNzS2V5LmdldChrZXkuaW1wbCgpKTsKK30KKwordm9pZCBEb2N1bWVudDo6YnVp
bGRBY2Nlc3NLZXlNYXAoVHJlZVNjb3BlKiBzY29wZSkKK3sKKyAgICBBU1NFUlQoc2NvcGUpOwor
ICAgIE5vZGUqIHJvb3ROb2RlID0gc2NvcGUtPnJvb3ROb2RlKCk7CisgICAgZm9yIChOb2RlKiBu
b2RlID0gcm9vdE5vZGU7IG5vZGU7IG5vZGUgPSBub2RlLT50cmF2ZXJzZU5leHROb2RlKHJvb3RO
b2RlKSkgeworICAgICAgICBpZiAoIW5vZGUtPmlzRWxlbWVudE5vZGUoKSkKKyAgICAgICAgICAg
IGNvbnRpbnVlOworICAgICAgICBFbGVtZW50KiBlbGVtZW50ID0gc3RhdGljX2Nhc3Q8RWxlbWVu
dCo+KG5vZGUpOworICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcmIGFjY2Vzc0tleSA9IGVsZW1l
bnQtPmdldEF0dHJpYnV0ZShhY2Nlc3NrZXlBdHRyKTsKKyAgICAgICAgaWYgKCFhY2Nlc3NLZXku
aXNFbXB0eSgpKQorICAgICAgICAgICAgbV9lbGVtZW50c0J5QWNjZXNzS2V5LnNldChhY2Nlc3NL
ZXkuaW1wbCgpLCBlbGVtZW50KTsKKworICAgICAgICBmb3IgKFNoYWRvd1Jvb3QqIHJvb3QgPSBu
b2RlLT55b3VuZ2VzdFNoYWRvd1Jvb3QoKTsgcm9vdDsgcm9vdCA9IHJvb3QtPm9sZGVyU2hhZG93
Um9vdCgpKQorICAgICAgICAgICAgYnVpbGRBY2Nlc3NLZXlNYXAocm9vdCk7CisgICAgfQorfQor
Cit2b2lkIERvY3VtZW50OjppbnZhbGlkYXRlQWNjZXNzS2V5TWFwKCkKK3sKKyAgICBtX2FjY2Vz
c0tleU1hcFZhbGlkID0gZmFsc2U7CisgICAgbV9lbGVtZW50c0J5QWNjZXNzS2V5LmNsZWFyKCk7
Cit9CisKK1NlbGVjdG9yUXVlcnlDYWNoZSogRG9jdW1lbnQ6OnNlbGVjdG9yUXVlcnlDYWNoZSgp
Cit7CisgICAgaWYgKCFtX3NlbGVjdG9yUXVlcnlDYWNoZSkKKyAgICAgICAgbV9zZWxlY3RvclF1
ZXJ5Q2FjaGUgPSBhZG9wdFB0cihuZXcgU2VsZWN0b3JRdWVyeUNhY2hlKCkpOworICAgIHJldHVy
biBtX3NlbGVjdG9yUXVlcnlDYWNoZS5nZXQoKTsKK30KKworTWVkaWFRdWVyeU1hdGNoZXIqIERv
Y3VtZW50OjptZWRpYVF1ZXJ5TWF0Y2hlcigpCit7CisgICAgaWYgKCFtX21lZGlhUXVlcnlNYXRj
aGVyKQorICAgICAgICBtX21lZGlhUXVlcnlNYXRjaGVyID0gTWVkaWFRdWVyeU1hdGNoZXI6OmNy
ZWF0ZSh0aGlzKTsKKyAgICByZXR1cm4gbV9tZWRpYVF1ZXJ5TWF0Y2hlci5nZXQoKTsKK30KKwor
dm9pZCBEb2N1bWVudDo6c2V0Q29tcGF0aWJpbGl0eU1vZGUoQ29tcGF0aWJpbGl0eU1vZGUgbW9k
ZSkKK3sKKyAgICBpZiAobV9jb21wYXRpYmlsaXR5TW9kZUxvY2tlZCB8fCBtb2RlID09IG1fY29t
cGF0aWJpbGl0eU1vZGUpCisgICAgICAgIHJldHVybjsKKyAgICBBU1NFUlQoIW1fc3R5bGVTaGVl
dHMtPmxlbmd0aCgpKTsKKyAgICBib29sIHdhc0luUXVpcmtzTW9kZSA9IGluUXVpcmtzTW9kZSgp
OworICAgIG1fY29tcGF0aWJpbGl0eU1vZGUgPSBtb2RlOworICAgIHNlbGVjdG9yUXVlcnlDYWNo
ZSgpLT5pbnZhbGlkYXRlKCk7CisgICAgaWYgKGluUXVpcmtzTW9kZSgpICE9IHdhc0luUXVpcmtz
TW9kZSkgeworICAgICAgICAvLyBBbGwgdXNlciBzdHlsZXNoZWV0cyBoYXZlIHRvIHJlcGFyc2Ug
dXNpbmcgdGhlIGRpZmZlcmVudCBtb2RlLgorICAgICAgICBjbGVhclBhZ2VVc2VyU2hlZXQoKTsK
KyAgICAgICAgY2xlYXJQYWdlR3JvdXBVc2VyU2hlZXRzKCk7CisgICAgfQorfQorCitTdHJpbmcg
RG9jdW1lbnQ6OmNvbXBhdE1vZGUoKSBjb25zdAoreworICAgIHJldHVybiBpblF1aXJrc01vZGUo
KSA/ICJCYWNrQ29tcGF0IiA6ICJDU1MxQ29tcGF0IjsKK30KKwordm9pZCBEb2N1bWVudDo6cmVz
ZXRMaW5rQ29sb3IoKQoreworICAgIG1fbGlua0NvbG9yID0gQ29sb3IoMCwgMCwgMjM4KTsKK30K
Kwordm9pZCBEb2N1bWVudDo6cmVzZXRWaXNpdGVkTGlua0NvbG9yKCkKK3sKKyAgICBtX3Zpc2l0
ZWRMaW5rQ29sb3IgPSBDb2xvcig4NSwgMjYsIDEzOSk7ICAgIAorfQorCit2b2lkIERvY3VtZW50
OjpyZXNldEFjdGl2ZUxpbmtDb2xvcigpCit7CisgICAgbV9hY3RpdmVMaW5rQ29sb3Iuc2V0TmFt
ZWRDb2xvcigicmVkIik7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnNldERvY1R5cGUoUGFzc1JlZlB0
cjxEb2N1bWVudFR5cGU+IGRvY1R5cGUpCit7CisgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgYmUg
Y2FsbGVkIG1vcmUgdGhhbiBvbmNlLgorICAgIEFTU0VSVCghbV9kb2NUeXBlIHx8ICFkb2NUeXBl
KTsKKyAgICBtX2RvY1R5cGUgPSBkb2NUeXBlOworICAgIGlmIChtX2RvY1R5cGUpIHsKKyAgICAg
ICAgdGhpcy0+YWRvcHRJZk5lZWRlZChtX2RvY1R5cGUuZ2V0KCkpOworI2lmIEVOQUJMRShMRUdB
Q1lfVklFV1BPUlRfQURBUFRJT04pCisgICAgICAgIGlmIChtX2RvY1R5cGUtPnB1YmxpY0lkKCku
c3RhcnRzV2l0aCgiLS8vd2FwZm9ydW0vL2R0ZCB4aHRtbCBtb2JpbGUgMS4iLCAvKiBjYXNlU2Vu
c2l0aXZlICovIGZhbHNlKSkKKyAgICAgICAgICAgIHByb2Nlc3NWaWV3cG9ydCgid2lkdGg9ZGV2
aWNlLXdpZHRoLCBoZWlnaHQ9ZGV2aWNlLWhlaWdodCIsIFZpZXdwb3J0QXJndW1lbnRzOjpYSFRN
TE1vYmlsZVByb2ZpbGUpOworI2VuZGlmCisgICAgfQorICAgIC8vIERvY3R5cGUgYWZmZWN0cyB0
aGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlIHN0eWxlc2hlZXRzLgorICAgIGNsZWFyU3R5bGVSZXNv
bHZlcigpOworfQorCitET01JbXBsZW1lbnRhdGlvbiogRG9jdW1lbnQ6OmltcGxlbWVudGF0aW9u
KCkKK3sKKyAgICBpZiAoIW1faW1wbGVtZW50YXRpb24pCisgICAgICAgIG1faW1wbGVtZW50YXRp
b24gPSBET01JbXBsZW1lbnRhdGlvbjo6Y3JlYXRlKHRoaXMpOworICAgIHJldHVybiBtX2ltcGxl
bWVudGF0aW9uLmdldCgpOworfQorCit2b2lkIERvY3VtZW50OjpjaGlsZHJlbkNoYW5nZWQoYm9v
bCBjaGFuZ2VkQnlQYXJzZXIsIE5vZGUqIGJlZm9yZUNoYW5nZSwgTm9kZSogYWZ0ZXJDaGFuZ2Us
IGludCBjaGlsZENvdW50RGVsdGEpCit7CisgICAgQ29udGFpbmVyTm9kZTo6Y2hpbGRyZW5DaGFu
Z2VkKGNoYW5nZWRCeVBhcnNlciwgYmVmb3JlQ2hhbmdlLCBhZnRlckNoYW5nZSwgY2hpbGRDb3Vu
dERlbHRhKTsKKyAgICAKKyAgICBFbGVtZW50KiBuZXdEb2N1bWVudEVsZW1lbnQgPSBmaXJzdEVs
ZW1lbnRDaGlsZCh0aGlzKTsKKyAgICBpZiAobmV3RG9jdW1lbnRFbGVtZW50ID09IG1fZG9jdW1l
bnRFbGVtZW50KQorICAgICAgICByZXR1cm47CisgICAgbV9kb2N1bWVudEVsZW1lbnQgPSBuZXdE
b2N1bWVudEVsZW1lbnQ7CisgICAgLy8gVGhlIHJvb3Qgc3R5bGUgdXNlZCBmb3IgbWVkaWEgcXVl
cnkgbWF0Y2hpbmcgZGVwZW5kcyBvbiB0aGUgZG9jdW1lbnQgZWxlbWVudC4KKyAgICBjbGVhclN0
eWxlUmVzb2x2ZXIoKTsKK30KKworUGFzc1JlZlB0cjxFbGVtZW50PiBEb2N1bWVudDo6Y3JlYXRl
RWxlbWVudChjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUsIEV4Y2VwdGlvbkNvZGUmIGVjKQorewor
ICAgIGlmICghaXNWYWxpZE5hbWUobmFtZSkpIHsKKyAgICAgICAgZWMgPSBJTlZBTElEX0NIQVJB
Q1RFUl9FUlI7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChtX2lzWEhUTUwp
CisgICAgICAgIHJldHVybiBIVE1MRWxlbWVudEZhY3Rvcnk6OmNyZWF0ZUhUTUxFbGVtZW50KFF1
YWxpZmllZE5hbWUobnVsbEF0b20sIG5hbWUsIHhodG1sTmFtZXNwYWNlVVJJKSwgdGhpcywgMCwg
ZmFsc2UpOworCisgICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoUXVhbGlmaWVkTmFtZShudWxsQXRv
bSwgbmFtZSwgbnVsbEF0b20pLCBmYWxzZSk7Cit9CisKK1Bhc3NSZWZQdHI8RG9jdW1lbnRGcmFn
bWVudD4gRG9jdW1lbnQ6OmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKQoreworICAgIHJldHVybiBE
b2N1bWVudEZyYWdtZW50OjpjcmVhdGUoZG9jdW1lbnQoKSk7Cit9CisKK1Bhc3NSZWZQdHI8VGV4
dD4gRG9jdW1lbnQ6OmNyZWF0ZVRleHROb2RlKGNvbnN0IFN0cmluZyYgZGF0YSkKK3sKKyAgICBy
ZXR1cm4gVGV4dDo6Y3JlYXRlKHRoaXMsIGRhdGEpOworfQorCitQYXNzUmVmUHRyPENvbW1lbnQ+
IERvY3VtZW50OjpjcmVhdGVDb21tZW50KGNvbnN0IFN0cmluZyYgZGF0YSkKK3sKKyAgICByZXR1
cm4gQ29tbWVudDo6Y3JlYXRlKHRoaXMsIGRhdGEpOworfQorCitQYXNzUmVmUHRyPENEQVRBU2Vj
dGlvbj4gRG9jdW1lbnQ6OmNyZWF0ZUNEQVRBU2VjdGlvbihjb25zdCBTdHJpbmcmIGRhdGEsIEV4
Y2VwdGlvbkNvZGUmIGVjKQoreworICAgIGlmIChpc0hUTUxEb2N1bWVudCgpKSB7CisgICAgICAg
IGVjID0gTk9UX1NVUFBPUlRFRF9FUlI7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBy
ZXR1cm4gQ0RBVEFTZWN0aW9uOjpjcmVhdGUodGhpcywgZGF0YSk7Cit9CisKK1Bhc3NSZWZQdHI8
UHJvY2Vzc2luZ0luc3RydWN0aW9uPiBEb2N1bWVudDo6Y3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0
aW9uKGNvbnN0IFN0cmluZyYgdGFyZ2V0LCBjb25zdCBTdHJpbmcmIGRhdGEsIEV4Y2VwdGlvbkNv
ZGUmIGVjKQoreworICAgIGlmICghaXNWYWxpZE5hbWUodGFyZ2V0KSkgeworICAgICAgICBlYyA9
IElOVkFMSURfQ0hBUkFDVEVSX0VSUjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlm
IChpc0hUTUxEb2N1bWVudCgpKSB7CisgICAgICAgIGVjID0gTk9UX1NVUFBPUlRFRF9FUlI7Cisg
ICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gUHJvY2Vzc2luZ0luc3RydWN0aW9u
OjpjcmVhdGUodGhpcywgdGFyZ2V0LCBkYXRhKTsKK30KKworUGFzc1JlZlB0cjxFbnRpdHlSZWZl
cmVuY2U+IERvY3VtZW50OjpjcmVhdGVFbnRpdHlSZWZlcmVuY2UoY29uc3QgU3RyaW5nJiBuYW1l
LCBFeGNlcHRpb25Db2RlJiBlYykKK3sKKyAgICBpZiAoIWlzVmFsaWROYW1lKG5hbWUpKSB7Cisg
ICAgICAgIGVjID0gSU5WQUxJRF9DSEFSQUNURVJfRVJSOworICAgICAgICByZXR1cm4gMDsKKyAg
ICB9CisgICAgaWYgKGlzSFRNTERvY3VtZW50KCkpIHsKKyAgICAgICAgZWMgPSBOT1RfU1VQUE9S
VEVEX0VSUjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBFbnRpdHlSZWZl
cmVuY2U6OmNyZWF0ZSh0aGlzLCBuYW1lKTsKK30KKworUGFzc1JlZlB0cjxFZGl0aW5nVGV4dD4g
RG9jdW1lbnQ6OmNyZWF0ZUVkaXRpbmdUZXh0Tm9kZShjb25zdCBTdHJpbmcmIHRleHQpCit7Cisg
ICAgcmV0dXJuIEVkaXRpbmdUZXh0OjpjcmVhdGUodGhpcywgdGV4dCk7Cit9CisKK1Bhc3NSZWZQ
dHI8Q1NTU3R5bGVEZWNsYXJhdGlvbj4gRG9jdW1lbnQ6OmNyZWF0ZUNTU1N0eWxlRGVjbGFyYXRp
b24oKQoreworICAgIHJldHVybiBTdHlsZVByb3BlcnR5U2V0OjpjcmVhdGUoKS0+ZW5zdXJlQ1NT
U3R5bGVEZWNsYXJhdGlvbigpOworfQorCitQYXNzUmVmUHRyPE5vZGU+IERvY3VtZW50OjppbXBv
cnROb2RlKE5vZGUqIGltcG9ydGVkTm9kZSwgYm9vbCBkZWVwLCBFeGNlcHRpb25Db2RlJiBlYykK
K3sKKyAgICBlYyA9IDA7CisgICAgCisgICAgaWYgKCFpbXBvcnRlZE5vZGUpIHsKKyAgICAgICAg
ZWMgPSBOT1RfU1VQUE9SVEVEX0VSUjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAg
c3dpdGNoIChpbXBvcnRlZE5vZGUtPm5vZGVUeXBlKCkpIHsKKyAgICBjYXNlIFRFWFRfTk9ERToK
KyAgICAgICAgcmV0dXJuIGNyZWF0ZVRleHROb2RlKGltcG9ydGVkTm9kZS0+bm9kZVZhbHVlKCkp
OworICAgIGNhc2UgQ0RBVEFfU0VDVElPTl9OT0RFOgorICAgICAgICByZXR1cm4gY3JlYXRlQ0RB
VEFTZWN0aW9uKGltcG9ydGVkTm9kZS0+bm9kZVZhbHVlKCksIGVjKTsKKyAgICBjYXNlIEVOVElU
WV9SRUZFUkVOQ0VfTk9ERToKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUVudGl0eVJlZmVyZW5jZShp
bXBvcnRlZE5vZGUtPm5vZGVOYW1lKCksIGVjKTsKKyAgICBjYXNlIFBST0NFU1NJTkdfSU5TVFJV
Q1RJT05fTk9ERToKKyAgICAgICAgcmV0dXJuIGNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihp
bXBvcnRlZE5vZGUtPm5vZGVOYW1lKCksIGltcG9ydGVkTm9kZS0+bm9kZVZhbHVlKCksIGVjKTsK
KyAgICBjYXNlIENPTU1FTlRfTk9ERToKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUNvbW1lbnQoaW1w
b3J0ZWROb2RlLT5ub2RlVmFsdWUoKSk7CisgICAgY2FzZSBFTEVNRU5UX05PREU6IHsKKyAgICAg
ICAgRWxlbWVudCogb2xkRWxlbWVudCA9IHN0YXRpY19jYXN0PEVsZW1lbnQqPihpbXBvcnRlZE5v
ZGUpOworICAgICAgICAvLyBGSVhNRTogVGhlIGZvbGxvd2luZyBjaGVjayBtaWdodCBiZSB1bm5l
Y2Vzc2FyeS4gSXMgaXQgcG9zc2libGUgdGhhdAorICAgICAgICAvLyBvbGRFbGVtZW50IGhhcyBt
aXNtYXRjaGVkIHByZWZpeC9uYW1lc3BhY2U/CisgICAgICAgIGlmICghaGFzVmFsaWROYW1lc3Bh
Y2VGb3JFbGVtZW50cyhvbGRFbGVtZW50LT50YWdRTmFtZSgpKSkgeworICAgICAgICAgICAgZWMg
PSBOQU1FU1BBQ0VfRVJSOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAg
ICAgUmVmUHRyPEVsZW1lbnQ+IG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50KG9sZEVsZW1lbnQt
PnRhZ1FOYW1lKCksIGVjKTsKKyAgICAgICAgaWYgKGVjKQorICAgICAgICAgICAgcmV0dXJuIDA7
CisKKyAgICAgICAgbmV3RWxlbWVudC0+Y2xvbmVEYXRhRnJvbUVsZW1lbnQoKm9sZEVsZW1lbnQp
OworCisgICAgICAgIGlmIChkZWVwKSB7CisgICAgICAgICAgICBmb3IgKE5vZGUqIG9sZENoaWxk
ID0gb2xkRWxlbWVudC0+Zmlyc3RDaGlsZCgpOyBvbGRDaGlsZDsgb2xkQ2hpbGQgPSBvbGRDaGls
ZC0+bmV4dFNpYmxpbmcoKSkgeworICAgICAgICAgICAgICAgIFJlZlB0cjxOb2RlPiBuZXdDaGls
ZCA9IGltcG9ydE5vZGUob2xkQ2hpbGQsIHRydWUsIGVjKTsKKyAgICAgICAgICAgICAgICBpZiAo
ZWMpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIG5ld0Vs
ZW1lbnQtPmFwcGVuZENoaWxkKG5ld0NoaWxkLnJlbGVhc2UoKSwgZWMpOworICAgICAgICAgICAg
ICAgIGlmIChlYykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9
CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3RWxlbWVudC5yZWxlYXNlKCk7CisgICAg
fQorICAgIGNhc2UgQVRUUklCVVRFX05PREU6CisgICAgICAgIHJldHVybiBBdHRyOjpjcmVhdGUo
dGhpcywgUXVhbGlmaWVkTmFtZShudWxsQXRvbSwgc3RhdGljX2Nhc3Q8QXR0cio+KGltcG9ydGVk
Tm9kZSktPm5hbWUoKSwgbnVsbEF0b20pLCBzdGF0aWNfY2FzdDxBdHRyKj4oaW1wb3J0ZWROb2Rl
KS0+dmFsdWUoKSk7CisgICAgY2FzZSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFOiB7CisgICAgICAg
IGlmIChpbXBvcnRlZE5vZGUtPmlzU2hhZG93Um9vdCgpKSB7CisgICAgICAgICAgICAvLyBTaGFk
b3dSb290IG5vZGVzIHNob3VsZCBub3QgYmUgZXhwbGljaXRseSBpbXBvcnRhYmxlLgorICAgICAg
ICAgICAgLy8gRWl0aGVyIHRoZXkgYXJlIGltcG9ydGVkIGFsb25nIHdpdGggdGhlaXIgaG9zdCBu
b2RlLCBvciBjcmVhdGVkIGltcGxpY2l0bHkuCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
fQorICAgICAgICBEb2N1bWVudEZyYWdtZW50KiBvbGRGcmFnbWVudCA9IHN0YXRpY19jYXN0PERv
Y3VtZW50RnJhZ21lbnQqPihpbXBvcnRlZE5vZGUpOworICAgICAgICBSZWZQdHI8RG9jdW1lbnRG
cmFnbWVudD4gbmV3RnJhZ21lbnQgPSBjcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CisgICAgICAg
IGlmIChkZWVwKSB7CisgICAgICAgICAgICBmb3IgKE5vZGUqIG9sZENoaWxkID0gb2xkRnJhZ21l
bnQtPmZpcnN0Q2hpbGQoKTsgb2xkQ2hpbGQ7IG9sZENoaWxkID0gb2xkQ2hpbGQtPm5leHRTaWJs
aW5nKCkpIHsKKyAgICAgICAgICAgICAgICBSZWZQdHI8Tm9kZT4gbmV3Q2hpbGQgPSBpbXBvcnRO
b2RlKG9sZENoaWxkLCB0cnVlLCBlYyk7CisgICAgICAgICAgICAgICAgaWYgKGVjKQorICAgICAg
ICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICBuZXdGcmFnbWVudC0+YXBw
ZW5kQ2hpbGQobmV3Q2hpbGQucmVsZWFzZSgpLCBlYyk7CisgICAgICAgICAgICAgICAgaWYgKGVj
KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
fQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIG5ld0ZyYWdtZW50LnJlbGVhc2UoKTsKKyAgICB9
CisgICAgY2FzZSBFTlRJVFlfTk9ERToKKyAgICBjYXNlIE5PVEFUSU9OX05PREU6CisgICAgICAg
IC8vIEZJWE1FOiBJdCBzaG91bGQgYmUgcG9zc2libGUgdG8gaW1wb3J0IHRoZXNlIG5vZGUgdHlw
ZXMsIGhvd2V2ZXIgaW4gRE9NMyB0aGUgRG9jdW1lbnRUeXBlIGlzIHJlYWRvbmx5LCBzbyB0aGVy
ZSBpc24ndCBtdWNoIHNlbnNlIGluIGRvaW5nIHRoYXQuCisgICAgICAgIC8vIEFiaWxpdHkgdG8g
YWRkIHRoZXNlIGltcG9ydGVkIG5vZGVzIHRvIGEgRG9jdW1lbnRUeXBlIHdpbGwgYmUgY29uc2lk
ZXJlZCBmb3IgYWRkaXRpb24gdG8gYSBmdXR1cmUgcmVsZWFzZSBvZiB0aGUgRE9NLgorICAgIGNh
c2UgRE9DVU1FTlRfTk9ERToKKyAgICBjYXNlIERPQ1VNRU5UX1RZUEVfTk9ERToKKyAgICBjYXNl
IFhQQVRIX05BTUVTUEFDRV9OT0RFOgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgZWMgPSBO
T1RfU1VQUE9SVEVEX0VSUjsKKyAgICByZXR1cm4gMDsKK30KKworCitQYXNzUmVmUHRyPE5vZGU+
IERvY3VtZW50OjphZG9wdE5vZGUoUGFzc1JlZlB0cjxOb2RlPiBzb3VyY2UsIEV4Y2VwdGlvbkNv
ZGUmIGVjKQoreworICAgIGlmICghc291cmNlKSB7CisgICAgICAgIGVjID0gTk9UX1NVUFBPUlRF
RF9FUlI7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChzb3VyY2UtPmlzUmVh
ZE9ubHlOb2RlKCkpIHsKKyAgICAgICAgZWMgPSBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI7
CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEV2ZW50UXVldWVTY29wZSBzY29wZTsK
KworICAgIHN3aXRjaCAoc291cmNlLT5ub2RlVHlwZSgpKSB7CisgICAgY2FzZSBFTlRJVFlfTk9E
RToKKyAgICBjYXNlIE5PVEFUSU9OX05PREU6CisgICAgY2FzZSBET0NVTUVOVF9OT0RFOgorICAg
IGNhc2UgRE9DVU1FTlRfVFlQRV9OT0RFOgorICAgIGNhc2UgWFBBVEhfTkFNRVNQQUNFX05PREU6
CisgICAgICAgIGVjID0gTk9UX1NVUFBPUlRFRF9FUlI7CisgICAgICAgIHJldHVybiAwOyAgICAg
ICAgICAgIAorICAgIGNhc2UgQVRUUklCVVRFX05PREU6IHsgICAgICAgICAgICAgICAgICAgCisg
ICAgICAgIEF0dHIqIGF0dHIgPSBzdGF0aWNfY2FzdDxBdHRyKj4oc291cmNlLmdldCgpKTsKKyAg
ICAgICAgaWYgKGF0dHItPm93bmVyRWxlbWVudCgpKQorICAgICAgICAgICAgYXR0ci0+b3duZXJF
bGVtZW50KCktPnJlbW92ZUF0dHJpYnV0ZU5vZGUoYXR0ciwgZWMpOworICAgICAgICBhdHRyLT5z
ZXRTcGVjaWZpZWQodHJ1ZSk7CisgICAgICAgIGJyZWFrOworICAgIH0gICAgICAgCisgICAgZGVm
YXVsdDoKKyAgICAgICAgaWYgKHNvdXJjZS0+aXNTaGFkb3dSb290KCkpIHsKKyAgICAgICAgICAg
IC8vIFNoYWRvd1Jvb3QgY2Fubm90IGRpc2Nvbm5lY3QgaXRzZWxmIGZyb20gdGhlIGhvc3Qgbm9k
ZS4KKyAgICAgICAgICAgIGVjID0gSElFUkFSQ0hZX1JFUVVFU1RfRVJSOworICAgICAgICAgICAg
cmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICAvLyBGSVhNRTogV2hhdCBhYm91dCA8ZnJh
bWU+IGFuZCA8b2JqZWN0Pj8KKyAgICAgICAgaWYgKHNvdXJjZS0+aGFzVGFnTmFtZShpZnJhbWVU
YWcpKSB7CisgICAgICAgICAgICBIVE1MSUZyYW1lRWxlbWVudCogaWZyYW1lID0gc3RhdGljX2Nh
c3Q8SFRNTElGcmFtZUVsZW1lbnQqPihzb3VyY2UuZ2V0KCkpOworICAgICAgICAgICAgaWYgKGZy
YW1lKCkgJiYgZnJhbWUoKS0+dHJlZSgpLT5pc0Rlc2NlbmRhbnRPZihpZnJhbWUtPmNvbnRlbnRG
cmFtZSgpKSkgeworICAgICAgICAgICAgICAgIGVjID0gSElFUkFSQ0hZX1JFUVVFU1RfRVJSOwor
ICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAg
ICAgIGlmIChzb3VyY2UtPnBhcmVudE5vZGUoKSkKKyAgICAgICAgICAgIHNvdXJjZS0+cGFyZW50
Tm9kZSgpLT5yZW1vdmVDaGlsZChzb3VyY2UuZ2V0KCksIGVjKTsKKyAgICB9CisKKyAgICB0aGlz
LT5hZG9wdElmTmVlZGVkKHNvdXJjZS5nZXQoKSk7CisKKyAgICByZXR1cm4gc291cmNlOworfQor
Citib29sIERvY3VtZW50OjpoYXNWYWxpZE5hbWVzcGFjZUZvckVsZW1lbnRzKGNvbnN0IFF1YWxp
ZmllZE5hbWUmIHFOYW1lKQoreworICAgIC8vIFRoZXNlIGNoZWNrcyBhcmUgZnJvbSBET00gQ29y
ZSBMZXZlbCAyLCBjcmVhdGVFbGVtZW50TlMKKyAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9E
T00tTGV2ZWwtMi1Db3JlL2NvcmUuaHRtbCNJRC1Eb2NDckVsTlMKKyAgICBpZiAoIXFOYW1lLnBy
ZWZpeCgpLmlzRW1wdHkoKSAmJiBxTmFtZS5uYW1lc3BhY2VVUkkoKS5pc051bGwoKSkgLy8gY3Jl
YXRlRWxlbWVudE5TKG51bGwsICJodG1sOmRpdiIpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICBpZiAocU5hbWUucHJlZml4KCkgPT0geG1sQXRvbSAmJiBxTmFtZS5uYW1lc3BhY2VVUkkoKSAh
PSBYTUxOYW1lczo6eG1sTmFtZXNwYWNlVVJJKSAvLyBjcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93
d3cuZXhhbXBsZS5jb20iLCAieG1sOmxhbmciKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICAvLyBSZXF1aXJlZCBieSBET00gTGV2ZWwgMyBDb3JlIGFuZCB1bnNwZWNpZmllZCBieSBET00g
TGV2ZWwgMiBDb3JlOgorICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDQvUkVDLURPTS1M
ZXZlbC0zLUNvcmUtMjAwNDA0MDcvY29yZS5odG1sI0lELURvY0NyRWxOUworICAgIC8vIGNyZWF0
ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8iLCAiZm9vOmJhciIpLCBj
cmVhdGVFbGVtZW50TlMobnVsbCwgInhtbG5zOmJhciIpCisgICAgaWYgKChxTmFtZS5wcmVmaXgo
KSA9PSB4bWxuc0F0b20gJiYgcU5hbWUubmFtZXNwYWNlVVJJKCkgIT0gWE1MTlNOYW1lczo6eG1s
bnNOYW1lc3BhY2VVUkkpIHx8IChxTmFtZS5wcmVmaXgoKSAhPSB4bWxuc0F0b20gJiYgcU5hbWUu
bmFtZXNwYWNlVVJJKCkgPT0gWE1MTlNOYW1lczo6eG1sbnNOYW1lc3BhY2VVUkkpKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBEb2N1bWVudDo6
aGFzVmFsaWROYW1lc3BhY2VGb3JBdHRyaWJ1dGVzKGNvbnN0IFF1YWxpZmllZE5hbWUmIHFOYW1l
KQoreworICAgIC8vIFNwZWM6IERPTSBMZXZlbCAyIENvcmU6IGh0dHA6Ly93d3cudzMub3JnL1RS
L0RPTS1MZXZlbC0yLUNvcmUvY29yZS5odG1sI0lELUVsU2V0QXR0ck5TCisgICAgaWYgKHFOYW1l
LnByZWZpeCgpLmlzRW1wdHkoKSAmJiBxTmFtZS5sb2NhbE5hbWUoKSA9PSB4bWxuc0F0b20pIHsK
KyAgICAgICAgLy8gTm90ZTogVGhlIGNhc2Ugb2YgYW4gInhtbG5zIiBxdWFsaWZpZWQgbmFtZSB3
aXRoIGEgbmFtZXNwYWNlIG9mCisgICAgICAgIC8vIHhtbG5zTmFtZXNwYWNlVVJJIGlzIHNwZWNp
ZmljYWxseSBhbGxvd2VkIChTZWUgPGh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvPikuCisg
ICAgICAgIHJldHVybiBxTmFtZS5uYW1lc3BhY2VVUkkoKSA9PSBYTUxOU05hbWVzOjp4bWxuc05h
bWVzcGFjZVVSSTsKKyAgICB9CisgICAgcmV0dXJuIGhhc1ZhbGlkTmFtZXNwYWNlRm9yRWxlbWVu
dHMocU5hbWUpOworfQorCisvLyBGSVhNRTogVGhpcyBzaG91bGQgcmVhbGx5IGJlIGluIGEgcG9z
c2libGUgRWxlbWVudEZhY3RvcnkgY2xhc3MKK1Bhc3NSZWZQdHI8RWxlbWVudD4gRG9jdW1lbnQ6
OmNyZWF0ZUVsZW1lbnQoY29uc3QgUXVhbGlmaWVkTmFtZSYgcU5hbWUsIGJvb2wgY3JlYXRlZEJ5
UGFyc2VyKQoreworICAgIFJlZlB0cjxFbGVtZW50PiBlOworCisgICAgLy8gRklYTUU6IFVzZSBy
ZWdpc3RlcmVkIG5hbWVzcGFjZXMgYW5kIGxvb2sgdXAgaW4gYSBoYXNoIHRvIGZpbmQgdGhlIHJp
Z2h0IGZhY3RvcnkuCisgICAgaWYgKHFOYW1lLm5hbWVzcGFjZVVSSSgpID09IHhodG1sTmFtZXNw
YWNlVVJJKQorICAgICAgICBlID0gSFRNTEVsZW1lbnRGYWN0b3J5OjpjcmVhdGVIVE1MRWxlbWVu
dChxTmFtZSwgdGhpcywgMCwgY3JlYXRlZEJ5UGFyc2VyKTsKKyNpZiBFTkFCTEUoU1ZHKQorICAg
IGVsc2UgaWYgKHFOYW1lLm5hbWVzcGFjZVVSSSgpID09IFNWR05hbWVzOjpzdmdOYW1lc3BhY2VV
UkkpCisgICAgICAgIGUgPSBTVkdFbGVtZW50RmFjdG9yeTo6Y3JlYXRlU1ZHRWxlbWVudChxTmFt
ZSwgdGhpcywgY3JlYXRlZEJ5UGFyc2VyKTsKKyNlbmRpZgorI2lmIEVOQUJMRShNQVRITUwpCisg
ICAgZWxzZSBpZiAocU5hbWUubmFtZXNwYWNlVVJJKCkgPT0gTWF0aE1MTmFtZXM6Om1hdGhtbE5h
bWVzcGFjZVVSSSkKKyAgICAgICAgZSA9IE1hdGhNTEVsZW1lbnRGYWN0b3J5OjpjcmVhdGVNYXRo
TUxFbGVtZW50KHFOYW1lLCB0aGlzLCBjcmVhdGVkQnlQYXJzZXIpOworI2VuZGlmCisKKyAgICBp
ZiAoZSkKKyAgICAgICAgbV9zYXdFbGVtZW50c0luS25vd25OYW1lc3BhY2VzID0gdHJ1ZTsKKyAg
ICBlbHNlCisgICAgICAgIGUgPSBFbGVtZW50OjpjcmVhdGUocU5hbWUsIGRvY3VtZW50KCkpOwor
CisgICAgLy8gPGltYWdlPiB1c2VzIGltZ1RhZyBzbyB3ZSBuZWVkIGEgc3BlY2lhbCBydWxlLgor
ICAgIEFTU0VSVCgocU5hbWUubWF0Y2hlcyhpbWFnZVRhZykgJiYgZS0+dGFnUU5hbWUoKS5tYXRj
aGVzKGltZ1RhZykgJiYgZS0+dGFnUU5hbWUoKS5wcmVmaXgoKSA9PSBxTmFtZS5wcmVmaXgoKSkg
fHwgcU5hbWUgPT0gZS0+dGFnUU5hbWUoKSk7CisKKyAgICByZXR1cm4gZS5yZWxlYXNlKCk7Cit9
CisKK2Jvb2wgRG9jdW1lbnQ6OnJlZ2lvbkJhc2VkQ29sdW1uc0VuYWJsZWQoKSBjb25zdAorewor
ICAgIHJldHVybiBzZXR0aW5ncygpICYmIHNldHRpbmdzKCktPnJlZ2lvbkJhc2VkQ29sdW1uc0Vu
YWJsZWQoKTsgCit9CisKK2Jvb2wgRG9jdW1lbnQ6OmNzc1N0aWNreVBvc2l0aW9uRW5hYmxlZCgp
IGNvbnN0Cit7CisgICAgcmV0dXJuIHNldHRpbmdzKCkgJiYgc2V0dGluZ3MoKS0+Y3NzU3RpY2t5
UG9zaXRpb25FbmFibGVkKCk7IAorfQorCitib29sIERvY3VtZW50Ojpjc3NSZWdpb25zRW5hYmxl
ZCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIHNldHRpbmdzKCkgJiYgc2V0dGluZ3MoKS0+Y3NzUmVn
aW9uc0VuYWJsZWQoKTsgCit9CisKK2Jvb2wgRG9jdW1lbnQ6OmNzc0dyaWRMYXlvdXRFbmFibGVk
KCkgY29uc3QKK3sKKyAgICByZXR1cm4gc2V0dGluZ3MoKSAmJiBzZXR0aW5ncygpLT5jc3NHcmlk
TGF5b3V0RW5hYmxlZCgpOworfQorCisjaWYgRU5BQkxFKENTU19SRUdJT05TKQorCitQYXNzUmVm
UHRyPFdlYktpdE5hbWVkRmxvdz4gRG9jdW1lbnQ6OndlYmtpdEdldEZsb3dCeU5hbWUoY29uc3Qg
U3RyaW5nJiBmbG93TmFtZSkKK3sKKyAgICBpZiAoIWNzc1JlZ2lvbnNFbmFibGVkKCkgfHwgIXJl
bmRlcmVyKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgLy8gSXQncyBwb3NzaWJsZSB0byBo
YXZlIHBlbmRpbmcgc3R5bGVzIG5vdCBhcHBsaWVkIHRoYXQgYWZmZWN0IHRoZSBleGlzdGluZyBm
bG93cy4KKyAgICB1cGRhdGVTdHlsZUlmTmVlZGVkKCk7CisKKyAgICByZXR1cm4gbmFtZWRGbG93
cygpLT5mbG93QnlOYW1lKGZsb3dOYW1lKTsKK30KKworUGFzc1JlZlB0cjxET01OYW1lZEZsb3dD
b2xsZWN0aW9uPiBEb2N1bWVudDo6d2Via2l0R2V0TmFtZWRGbG93cygpCit7CisgICAgaWYgKCFj
c3NSZWdpb25zRW5hYmxlZCgpIHx8ICFyZW5kZXJlcigpKQorICAgICAgICByZXR1cm4gMDsKKwor
ICAgIHVwZGF0ZVN0eWxlSWZOZWVkZWQoKTsKKworICAgIHJldHVybiBuYW1lZEZsb3dzKCktPmNy
ZWF0ZUNTU09NU25hcHNob3QoKTsKK30KKworI2VuZGlmCisKK05hbWVkRmxvd0NvbGxlY3Rpb24q
IERvY3VtZW50OjpuYW1lZEZsb3dzKCkKK3sKKyAgICBpZiAoIW1fbmFtZWRGbG93cykKKyAgICAg
ICAgbV9uYW1lZEZsb3dzID0gTmFtZWRGbG93Q29sbGVjdGlvbjo6Y3JlYXRlKHRoaXMpOworCisg
ICAgcmV0dXJuIG1fbmFtZWRGbG93cy5nZXQoKTsKK30KKworUGFzc1JlZlB0cjxFbGVtZW50PiBE
b2N1bWVudDo6Y3JlYXRlRWxlbWVudE5TKGNvbnN0IFN0cmluZyYgbmFtZXNwYWNlVVJJLCBjb25z
dCBTdHJpbmcmIHF1YWxpZmllZE5hbWUsIEV4Y2VwdGlvbkNvZGUmIGVjKQoreworICAgIFN0cmlu
ZyBwcmVmaXgsIGxvY2FsTmFtZTsKKyAgICBpZiAoIXBhcnNlUXVhbGlmaWVkTmFtZShxdWFsaWZp
ZWROYW1lLCBwcmVmaXgsIGxvY2FsTmFtZSwgZWMpKQorICAgICAgICByZXR1cm4gMDsKKworICAg
IFF1YWxpZmllZE5hbWUgcU5hbWUocHJlZml4LCBsb2NhbE5hbWUsIG5hbWVzcGFjZVVSSSk7Cisg
ICAgaWYgKCFoYXNWYWxpZE5hbWVzcGFjZUZvckVsZW1lbnRzKHFOYW1lKSkgeworICAgICAgICBl
YyA9IE5BTUVTUEFDRV9FUlI7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVy
biBjcmVhdGVFbGVtZW50KHFOYW1lLCBmYWxzZSk7Cit9CisKK1N0cmluZyBEb2N1bWVudDo6cmVh
ZHlTdGF0ZSgpIGNvbnN0Cit7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChjb25zdCBTdHJpbmcs
IGxvYWRpbmcsIChBU0NJSUxpdGVyYWwoImxvYWRpbmciKSkpOworICAgIERFRklORV9TVEFUSUNf
TE9DQUwoY29uc3QgU3RyaW5nLCBpbnRlcmFjdGl2ZSwgKEFTQ0lJTGl0ZXJhbCgiaW50ZXJhY3Rp
dmUiKSkpOworICAgIERFRklORV9TVEFUSUNfTE9DQUwoY29uc3QgU3RyaW5nLCBjb21wbGV0ZSwg
KEFTQ0lJTGl0ZXJhbCgiY29tcGxldGUiKSkpOworCisgICAgc3dpdGNoIChtX3JlYWR5U3RhdGUp
IHsKKyAgICBjYXNlIExvYWRpbmc6CisgICAgICAgIHJldHVybiBsb2FkaW5nOworICAgIGNhc2Ug
SW50ZXJhY3RpdmU6CisgICAgICAgIHJldHVybiBpbnRlcmFjdGl2ZTsKKyAgICBjYXNlIENvbXBs
ZXRlOgorICAgICAgICByZXR1cm4gY29tcGxldGU7CisgICAgfQorCisgICAgQVNTRVJUX05PVF9S
RUFDSEVEKCk7CisgICAgcmV0dXJuIFN0cmluZygpOworfQorCit2b2lkIERvY3VtZW50OjpzZXRS
ZWFkeVN0YXRlKFJlYWR5U3RhdGUgcmVhZHlTdGF0ZSkKK3sKKyAgICBpZiAocmVhZHlTdGF0ZSA9
PSBtX3JlYWR5U3RhdGUpCisgICAgICAgIHJldHVybjsKKworICAgIHN3aXRjaCAocmVhZHlTdGF0
ZSkgeworICAgIGNhc2UgTG9hZGluZzoKKyAgICAgICAgaWYgKCFtX2RvY3VtZW50VGltaW5nLmRv
bUxvYWRpbmcpCisgICAgICAgICAgICBtX2RvY3VtZW50VGltaW5nLmRvbUxvYWRpbmcgPSBtb25v
dG9uaWNhbGx5SW5jcmVhc2luZ1RpbWUoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJbnRl
cmFjdGl2ZToKKyAgICAgICAgaWYgKCFtX2RvY3VtZW50VGltaW5nLmRvbUludGVyYWN0aXZlKQor
ICAgICAgICAgICAgbV9kb2N1bWVudFRpbWluZy5kb21JbnRlcmFjdGl2ZSA9IG1vbm90b25pY2Fs
bHlJbmNyZWFzaW5nVGltZSgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENvbXBsZXRlOgor
ICAgICAgICBpZiAoIW1fZG9jdW1lbnRUaW1pbmcuZG9tQ29tcGxldGUpCisgICAgICAgICAgICBt
X2RvY3VtZW50VGltaW5nLmRvbUNvbXBsZXRlID0gbW9ub3RvbmljYWxseUluY3JlYXNpbmdUaW1l
KCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIG1fcmVhZHlTdGF0ZSA9IHJlYWR5U3Rh
dGU7CisgICAgZGlzcGF0Y2hFdmVudChFdmVudDo6Y3JlYXRlKGV2ZW50TmFtZXMoKS5yZWFkeXN0
YXRlY2hhbmdlRXZlbnQsIGZhbHNlLCBmYWxzZSkpOworICAgIAorICAgIGlmIChzZXR0aW5ncygp
ICYmIHNldHRpbmdzKCktPnN1cHByZXNzZXNJbmNyZW1lbnRhbFJlbmRlcmluZygpKQorICAgICAg
ICBzZXRWaXN1YWxVcGRhdGVzQWxsb3dlZChyZWFkeVN0YXRlKTsKK30KKwordm9pZCBEb2N1bWVu
dDo6c2V0VmlzdWFsVXBkYXRlc0FsbG93ZWQoUmVhZHlTdGF0ZSByZWFkeVN0YXRlKQoreworICAg
IEFTU0VSVChzZXR0aW5ncygpICYmIHNldHRpbmdzKCktPnN1cHByZXNzZXNJbmNyZW1lbnRhbFJl
bmRlcmluZygpKTsKKyAgICBzd2l0Y2ggKHJlYWR5U3RhdGUpIHsKKyAgICBjYXNlIExvYWRpbmc6
CisgICAgICAgIEFTU0VSVCghbV92aXN1YWxVcGRhdGVzU3VwcHJlc3Npb25UaW1lci5pc0FjdGl2
ZSgpKTsKKyAgICAgICAgQVNTRVJUKG1fdmlzdWFsVXBkYXRlc0FsbG93ZWQpOworICAgICAgICBt
X3Zpc3VhbFVwZGF0ZXNTdXBwcmVzc2lvblRpbWVyLnN0YXJ0T25lU2hvdChzZXR0aW5ncygpLT5p
bmNyZW1lbnRhbFJlbmRlcmluZ1N1cHByZXNzaW9uVGltZW91dEluU2Vjb25kcygpKTsKKyAgICAg
ICAgc2V0VmlzdWFsVXBkYXRlc0FsbG93ZWQoZmFsc2UpOworICAgICAgICBicmVhazsKKyAgICBj
YXNlIEludGVyYWN0aXZlOgorICAgICAgICBBU1NFUlQobV92aXN1YWxVcGRhdGVzU3VwcHJlc3Np
b25UaW1lci5pc0FjdGl2ZSgpIHx8IG1fdmlzdWFsVXBkYXRlc0FsbG93ZWQpOworICAgICAgICBi
cmVhazsKKyAgICBjYXNlIENvbXBsZXRlOgorICAgICAgICBpZiAobV92aXN1YWxVcGRhdGVzU3Vw
cHJlc3Npb25UaW1lci5pc0FjdGl2ZSgpKSB7CisgICAgICAgICAgICBBU1NFUlQoIW1fdmlzdWFs
VXBkYXRlc0FsbG93ZWQpOworICAgICAgICAgICAgbV92aXN1YWxVcGRhdGVzU3VwcHJlc3Npb25U
aW1lci5zdG9wKCk7CisgICAgICAgICAgICBzZXRWaXN1YWxVcGRhdGVzQWxsb3dlZCh0cnVlKTsK
KyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBBU1NFUlQobV92aXN1YWxVcGRhdGVzQWxsb3dl
ZCk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKyAgICAKK3ZvaWQgRG9jdW1lbnQ6OnNldFZp
c3VhbFVwZGF0ZXNBbGxvd2VkKGJvb2wgdmlzdWFsVXBkYXRlc0FsbG93ZWQpCit7CisgICAgaWYg
KG1fdmlzdWFsVXBkYXRlc0FsbG93ZWQgPT0gdmlzdWFsVXBkYXRlc0FsbG93ZWQpCisgICAgICAg
IHJldHVybjsKKworICAgIG1fdmlzdWFsVXBkYXRlc0FsbG93ZWQgPSB2aXN1YWxVcGRhdGVzQWxs
b3dlZDsKKworICAgIGlmICghdmlzdWFsVXBkYXRlc0FsbG93ZWQpCisgICAgICAgIHJldHVybjsK
KworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICBpZiAodmlldygpKQorICAg
ICAgICB2aWV3KCktPnVwZGF0ZUNvbXBvc2l0aW5nTGF5ZXJzQWZ0ZXJMYXlvdXQoKTsKKyNlbmRp
ZgorCisgICAgaWYgKHJlbmRlcmVyKCkpCisgICAgICAgIHJlbmRlcmVyKCktPnJlcGFpbnQoKTsK
K30KKwordm9pZCBEb2N1bWVudDo6dmlzdWFsVXBkYXRlc1N1cHByZXNzaW9uVGltZXJGaXJlZChU
aW1lcjxEb2N1bWVudD4qKQoreworICAgIEFTU0VSVCghbV92aXN1YWxVcGRhdGVzQWxsb3dlZCk7
CisgICAgc2V0VmlzdWFsVXBkYXRlc0FsbG93ZWQodHJ1ZSk7Cit9CisKK1N0cmluZyBEb2N1bWVu
dDo6ZW5jb2RpbmcoKSBjb25zdAoreworICAgIGlmIChUZXh0UmVzb3VyY2VEZWNvZGVyKiBkID0g
ZGVjb2RlcigpKQorICAgICAgICByZXR1cm4gZC0+ZW5jb2RpbmcoKS5kb21OYW1lKCk7CisgICAg
cmV0dXJuIFN0cmluZygpOworfQorCitTdHJpbmcgRG9jdW1lbnQ6OmRlZmF1bHRDaGFyc2V0KCkg
Y29uc3QKK3sKKyAgICBpZiAoU2V0dGluZ3MqIHNldHRpbmdzID0gdGhpcy0+c2V0dGluZ3MoKSkK
KyAgICAgICAgcmV0dXJuIHNldHRpbmdzLT5kZWZhdWx0VGV4dEVuY29kaW5nTmFtZSgpOworICAg
IHJldHVybiBTdHJpbmcoKTsKK30KKwordm9pZCBEb2N1bWVudDo6c2V0Q2hhcnNldChjb25zdCBT
dHJpbmcmIGNoYXJzZXQpCit7CisgICAgaWYgKCFkZWNvZGVyKCkpCisgICAgICAgIHJldHVybjsK
KyAgICBkZWNvZGVyKCktPnNldEVuY29kaW5nKGNoYXJzZXQsIFRleHRSZXNvdXJjZURlY29kZXI6
OlVzZXJDaG9zZW5FbmNvZGluZyk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnNldENvbnRlbnRMYW5n
dWFnZShjb25zdCBTdHJpbmcmIGxhbmd1YWdlKQoreworICAgIGlmIChtX2NvbnRlbnRMYW5ndWFn
ZSA9PSBsYW5ndWFnZSkKKyAgICAgICAgcmV0dXJuOworICAgIG1fY29udGVudExhbmd1YWdlID0g
bGFuZ3VhZ2U7CisKKyAgICAvLyBSZWNhbGN1bGF0ZSBzdHlsZSBzbyBsYW5ndWFnZSBpcyB1c2Vk
IHdoZW4gc2VsZWN0aW5nIHRoZSBpbml0aWFsIGZvbnQuCisgICAgc3R5bGVSZXNvbHZlckNoYW5n
ZWQoRGVmZXJSZWNhbGNTdHlsZSk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnNldFhNTFZlcnNpb24o
Y29uc3QgU3RyaW5nJiB2ZXJzaW9uLCBFeGNlcHRpb25Db2RlJiBlYykKK3sKKyAgICBpZiAoIWlt
cGxlbWVudGF0aW9uKCktPmhhc0ZlYXR1cmUoIlhNTCIsIFN0cmluZygpKSkgeworICAgICAgICBl
YyA9IE5PVF9TVVBQT1JURURfRVJSOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYg
KCFYTUxEb2N1bWVudFBhcnNlcjo6c3VwcG9ydHNYTUxWZXJzaW9uKHZlcnNpb24pKSB7CisgICAg
ICAgIGVjID0gTk9UX1NVUFBPUlRFRF9FUlI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAg
ICBtX3htbFZlcnNpb24gPSB2ZXJzaW9uOworfQorCit2b2lkIERvY3VtZW50OjpzZXRYTUxTdGFu
ZGFsb25lKGJvb2wgc3RhbmRhbG9uZSwgRXhjZXB0aW9uQ29kZSYgZWMpCit7CisgICAgaWYgKCFp
bXBsZW1lbnRhdGlvbigpLT5oYXNGZWF0dXJlKCJYTUwiLCBTdHJpbmcoKSkpIHsKKyAgICAgICAg
ZWMgPSBOT1RfU1VQUE9SVEVEX0VSUjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1f
eG1sU3RhbmRhbG9uZSA9IHN0YW5kYWxvbmUgPyBTdGFuZGFsb25lIDogTm90U3RhbmRhbG9uZTsK
K30KKwordm9pZCBEb2N1bWVudDo6c2V0RG9jdW1lbnRVUkkoY29uc3QgU3RyaW5nJiB1cmkpCit7
CisgICAgLy8gVGhpcyBwcm9wZXJ0eSBpcyByZWFkLW9ubHkgZnJvbSBKYXZhU2NyaXB0LCBidXQg
d3JpdGFibGUgZnJvbSBPYmplY3RpdmUtQy4KKyAgICBtX2RvY3VtZW50VVJJID0gdXJpOworICAg
IHVwZGF0ZUJhc2VVUkwoKTsKK30KKworS1VSTCBEb2N1bWVudDo6YmFzZVVSSSgpIGNvbnN0Cit7
CisgICAgcmV0dXJuIG1fYmFzZVVSTDsKK30KKwordm9pZCBEb2N1bWVudDo6c2V0Q29udGVudChj
b25zdCBTdHJpbmcmIGNvbnRlbnQpCit7CisgICAgb3BlbigpOworICAgIG1fcGFyc2VyLT5hcHBl
bmQoY29udGVudCk7CisgICAgY2xvc2UoKTsKK30KKworU3RyaW5nIERvY3VtZW50OjpzdWdnZXN0
ZWRNSU1FVHlwZSgpIGNvbnN0Cit7CisgICAgaWYgKG1fZG9jdW1lbnQtPmlzWEhUTUxEb2N1bWVu
dCgpKQorICAgICAgICByZXR1cm4gImFwcGxpY2F0aW9uL3hodG1sK3htbCI7CisgICAgaWYgKG1f
ZG9jdW1lbnQtPmlzU1ZHRG9jdW1lbnQoKSkKKyAgICAgICAgcmV0dXJuICJpbWFnZS9zdmcreG1s
IjsKKyAgICBpZiAobV9kb2N1bWVudC0+eG1sU3RhbmRhbG9uZSgpKQorICAgICAgICByZXR1cm4g
InRleHQveG1sIjsKKyAgICBpZiAobV9kb2N1bWVudC0+aXNIVE1MRG9jdW1lbnQoKSkKKyAgICAg
ICAgcmV0dXJuICJ0ZXh0L2h0bWwiOworCisgICAgaWYgKERvY3VtZW50TG9hZGVyKiBkb2N1bWVu
dExvYWRlciA9IGxvYWRlcigpKQorICAgICAgICByZXR1cm4gZG9jdW1lbnRMb2FkZXItPnJlc3Bv
bnNlTUlNRVR5cGUoKTsKKyAgICByZXR1cm4gU3RyaW5nKCk7Cit9CisKKy8vIEZJWE1FOiBXZSBu
ZWVkIHRvIGRpc2N1c3MgdGhlIERPTSBBUEkgaGVyZSBhdCBzb21lIHBvaW50LiBJZGVhczoKKy8v
ICogbWFraW5nIGl0IHJlY2VpdmUgYSByZWN0IGFzIHBhcmFtZXRlciwgaS5lLiBub2Rlc0Zyb21S
ZWN0KHgsIHksIHcsIGgpOworLy8gKiBtYWtpbmcgaXQgcmVjZWl2ZSB0aGUgZXhwYWRpbmcgc2l6
ZSBvZiBlYWNoIGRpcmVjdGlvbiBzZXBhcmF0ZWx5LAorLy8gICBpLmUuIG5vZGVzRnJvbVJlY3Qo
eCwgeSwgdG9wU2l6ZSwgcmlnaHRTaXplLCBib3R0b21TaXplLCBsZWZ0U2l6ZSk7CitQYXNzUmVm
UHRyPE5vZGVMaXN0PiBEb2N1bWVudDo6bm9kZXNGcm9tUmVjdChpbnQgY2VudGVyWCwgaW50IGNl
bnRlclksIHVuc2lnbmVkIHRvcFBhZGRpbmcsIHVuc2lnbmVkIHJpZ2h0UGFkZGluZywgdW5zaWdu
ZWQgYm90dG9tUGFkZGluZywgdW5zaWduZWQgbGVmdFBhZGRpbmcsIGJvb2wgaWdub3JlQ2xpcHBp
bmcsIGJvb2wgYWxsb3dTaGFkb3dDb250ZW50KSBjb25zdAoreworICAgIC8vIEZJWE1FOiBTaGFy
ZSBjb2RlIGJldHdlZW4gdGhpcywgZWxlbWVudEZyb21Qb2ludCBhbmQgY2FyZXRSYW5nZUZyb21Q
b2ludC4KKyAgICBpZiAoIXJlbmRlcmVyKCkpCisgICAgICAgIHJldHVybiAwOworICAgIEZyYW1l
KiBmcmFtZSA9IHRoaXMtPmZyYW1lKCk7CisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJu
IDA7CisgICAgRnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBmcmFtZS0+dmlldygpOworICAgIGlmICgh
ZnJhbWVWaWV3KQorICAgICAgICByZXR1cm4gMDsKKworICAgIGZsb2F0IHpvb21GYWN0b3IgPSBm
cmFtZS0+cGFnZVpvb21GYWN0b3IoKTsKKyAgICBMYXlvdXRQb2ludCBwb2ludCA9IHJvdW5kZWRM
YXlvdXRQb2ludChGbG9hdFBvaW50KGNlbnRlclggKiB6b29tRmFjdG9yICsgdmlldygpLT5zY3Jv
bGxYKCksIGNlbnRlclkgKiB6b29tRmFjdG9yICsgdmlldygpLT5zY3JvbGxZKCkpKTsKKworICAg
IGludCB0eXBlID0gSGl0VGVzdFJlcXVlc3Q6OlJlYWRPbmx5IHwgSGl0VGVzdFJlcXVlc3Q6OkFj
dGl2ZTsKKworICAgIC8vIFdoZW4gaWdub3JlQ2xpcHBpbmcgaXMgZmFsc2UsIHRoaXMgbWV0aG9k
IHJldHVybnMgbnVsbCBmb3IgY29vcmRpbmF0ZXMgb3V0c2lkZSBvZiB0aGUgdmlld3BvcnQuCisg
ICAgaWYgKGlnbm9yZUNsaXBwaW5nKQorICAgICAgICB0eXBlIHw9IEhpdFRlc3RSZXF1ZXN0OjpJ
Z25vcmVDbGlwcGluZzsKKyAgICBlbHNlIGlmICghZnJhbWVWaWV3LT52aXNpYmxlQ29udGVudFJl
Y3QoKS5pbnRlcnNlY3RzKEhpdFRlc3RSZXN1bHQ6OnJlY3RGb3JQb2ludChwb2ludCwgdG9wUGFk
ZGluZywgcmlnaHRQYWRkaW5nLCBib3R0b21QYWRkaW5nLCBsZWZ0UGFkZGluZykpKQorICAgICAg
ICByZXR1cm4gMDsKKyAgICBpZiAoYWxsb3dTaGFkb3dDb250ZW50KQorICAgICAgICB0eXBlIHw9
IEhpdFRlc3RSZXF1ZXN0OjpBbGxvd1NoYWRvd0NvbnRlbnQ7CisKKyAgICBIaXRUZXN0UmVxdWVz
dCByZXF1ZXN0KHR5cGUpOworCisgICAgLy8gUGFzc2luZyBhIHplcm8gcGFkZGluZyB3aWxsIHRy
aWdnZXIgYSByZWN0IGhpdCB0ZXN0LCBob3dldmVyIGZvciB0aGUgcHVycG9zZXMgb2Ygbm9kZXNG
cm9tUmVjdCwKKyAgICAvLyB3ZSBzcGVjaWFsIGhhbmRsZSB0aGlzIGNhc2UgaW4gb3JkZXIgdG8g
cmV0dXJuIGEgdmFsaWQgTm9kZUxpc3QuCisgICAgaWYgKCF0b3BQYWRkaW5nICYmICFyaWdodFBh
ZGRpbmcgJiYgIWJvdHRvbVBhZGRpbmcgJiYgIWxlZnRQYWRkaW5nKSB7CisgICAgICAgIEhpdFRl
c3RSZXN1bHQgcmVzdWx0KHBvaW50KTsKKyAgICAgICAgcmV0dXJuIGhhbmRsZVplcm9QYWRkaW5n
KHJlcXVlc3QsIHJlc3VsdCk7CisgICAgfQorCisgICAgSGl0VGVzdFJlc3VsdCByZXN1bHQocG9p
bnQsIHRvcFBhZGRpbmcsIHJpZ2h0UGFkZGluZywgYm90dG9tUGFkZGluZywgbGVmdFBhZGRpbmcp
OworICAgIHJlbmRlclZpZXcoKS0+aGl0VGVzdChyZXF1ZXN0LCByZXN1bHQpOworCisgICAgcmV0
dXJuIFN0YXRpY0hhc2hTZXROb2RlTGlzdDo6YWRvcHQocmVzdWx0LnJlY3RCYXNlZFRlc3RSZXN1
bHQoKSk7Cit9CisKK1Bhc3NSZWZQdHI8Tm9kZUxpc3Q+IERvY3VtZW50OjpoYW5kbGVaZXJvUGFk
ZGluZyhjb25zdCBIaXRUZXN0UmVxdWVzdCYgcmVxdWVzdCwgSGl0VGVzdFJlc3VsdCYgcmVzdWx0
KSBjb25zdAoreworICAgIHJlbmRlclZpZXcoKS0+aGl0VGVzdChyZXF1ZXN0LCByZXN1bHQpOwor
CisgICAgTm9kZSogbm9kZSA9IHJlc3VsdC5pbm5lck5vZGUoKTsKKyAgICBpZiAoIW5vZGUpCisg
ICAgICAgIHJldHVybiAwOworCisgICAgbm9kZSA9IG5vZGUtPnNoYWRvd0FuY2VzdG9yTm9kZSgp
OworICAgIExpc3RIYXNoU2V0PFJlZlB0cjxOb2RlPiA+IGxpc3Q7CisgICAgbGlzdC5hZGQobm9k
ZSk7CisgICAgcmV0dXJuIFN0YXRpY0hhc2hTZXROb2RlTGlzdDo6YWRvcHQobGlzdCk7Cit9CisK
K3N0YXRpYyBOb2RlKiBub2RlRnJvbVBvaW50KEZyYW1lKiBmcmFtZSwgUmVuZGVyVmlldyogcmVu
ZGVyVmlldywgaW50IHgsIGludCB5LCBMYXlvdXRQb2ludCogbG9jYWxQb2ludCA9IDApCit7Cisg
ICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgRnJhbWVWaWV3KiBmcmFtZVZp
ZXcgPSBmcmFtZS0+dmlldygpOworICAgIGlmICghZnJhbWVWaWV3KQorICAgICAgICByZXR1cm4g
MDsKKworICAgIGZsb2F0IHpvb21GYWN0b3IgPSBmcmFtZS0+cGFnZVpvb21GYWN0b3IoKTsKKyAg
ICBJbnRQb2ludCBwb2ludCA9IHJvdW5kZWRJbnRQb2ludChGbG9hdFBvaW50KHggKiB6b29tRmFj
dG9yICArIGZyYW1lVmlldy0+c2Nyb2xsWCgpLCB5ICogem9vbUZhY3RvciArIGZyYW1lVmlldy0+
c2Nyb2xsWSgpKSk7CisKKyAgICBpZiAoIWZyYW1lVmlldy0+dmlzaWJsZUNvbnRlbnRSZWN0KCku
Y29udGFpbnMocG9pbnQpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIEhpdFRlc3RSZXF1ZXN0
IHJlcXVlc3QoSGl0VGVzdFJlcXVlc3Q6OlJlYWRPbmx5IHwgSGl0VGVzdFJlcXVlc3Q6OkFjdGl2
ZSk7CisgICAgSGl0VGVzdFJlc3VsdCByZXN1bHQocG9pbnQpOworICAgIHJlbmRlclZpZXctPmhp
dFRlc3QocmVxdWVzdCwgcmVzdWx0KTsKKworICAgIGlmIChsb2NhbFBvaW50KQorICAgICAgICAq
bG9jYWxQb2ludCA9IHJlc3VsdC5sb2NhbFBvaW50KCk7CisKKyAgICByZXR1cm4gcmVzdWx0Lmlu
bmVyTm9kZSgpOworfQorCitFbGVtZW50KiBEb2N1bWVudDo6ZWxlbWVudEZyb21Qb2ludChpbnQg
eCwgaW50IHkpIGNvbnN0Cit7CisgICAgaWYgKCFyZW5kZXJlcigpKQorICAgICAgICByZXR1cm4g
MDsKKyAgICBOb2RlKiBub2RlID0gbm9kZUZyb21Qb2ludChmcmFtZSgpLCByZW5kZXJWaWV3KCks
IHgsIHkpOworICAgIHdoaWxlIChub2RlICYmICFub2RlLT5pc0VsZW1lbnROb2RlKCkpCisgICAg
ICAgIG5vZGUgPSBub2RlLT5wYXJlbnROb2RlKCk7CisgICAgaWYgKG5vZGUpCisgICAgICAgIG5v
ZGUgPSBhbmNlc3RvckluVGhpc1Njb3BlKG5vZGUpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxF
bGVtZW50Kj4obm9kZSk7Cit9CisKK1Bhc3NSZWZQdHI8UmFuZ2U+IERvY3VtZW50OjpjYXJldFJh
bmdlRnJvbVBvaW50KGludCB4LCBpbnQgeSkKK3sKKyAgICBpZiAoIXJlbmRlcmVyKCkpCisgICAg
ICAgIHJldHVybiAwOworICAgIExheW91dFBvaW50IGxvY2FsUG9pbnQ7CisgICAgTm9kZSogbm9k
ZSA9IG5vZGVGcm9tUG9pbnQoZnJhbWUoKSwgcmVuZGVyVmlldygpLCB4LCB5LCAmbG9jYWxQb2lu
dCk7CisgICAgaWYgKCFub2RlKQorICAgICAgICByZXR1cm4gMDsKKworICAgIE5vZGUqIHNoYWRv
d0FuY2VzdG9yTm9kZSA9IGFuY2VzdG9ySW5UaGlzU2NvcGUobm9kZSk7CisgICAgaWYgKHNoYWRv
d0FuY2VzdG9yTm9kZSAhPSBub2RlKSB7CisgICAgICAgIHVuc2lnbmVkIG9mZnNldCA9IHNoYWRv
d0FuY2VzdG9yTm9kZS0+bm9kZUluZGV4KCk7CisgICAgICAgIENvbnRhaW5lck5vZGUqIGNvbnRh
aW5lciA9IHNoYWRvd0FuY2VzdG9yTm9kZS0+cGFyZW50Tm9kZSgpOworICAgICAgICByZXR1cm4g
UmFuZ2U6OmNyZWF0ZSh0aGlzLCBjb250YWluZXIsIG9mZnNldCwgY29udGFpbmVyLCBvZmZzZXQp
OworICAgIH0KKworICAgIFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSBub2RlLT5yZW5kZXJlcigp
OworICAgIGlmICghcmVuZGVyZXIpCisgICAgICAgIHJldHVybiAwOworICAgIFZpc2libGVQb3Np
dGlvbiB2aXNpYmxlUG9zaXRpb24gPSByZW5kZXJlci0+cG9zaXRpb25Gb3JQb2ludChsb2NhbFBv
aW50KTsKKyAgICBpZiAodmlzaWJsZVBvc2l0aW9uLmlzTnVsbCgpKQorICAgICAgICByZXR1cm4g
MDsKKworICAgIFBvc2l0aW9uIHJhbmdlQ29tcGxpYW50UG9zaXRpb24gPSB2aXNpYmxlUG9zaXRp
b24uZGVlcEVxdWl2YWxlbnQoKS5wYXJlbnRBbmNob3JlZEVxdWl2YWxlbnQoKTsKKyAgICByZXR1
cm4gUmFuZ2U6OmNyZWF0ZSh0aGlzLCByYW5nZUNvbXBsaWFudFBvc2l0aW9uLCByYW5nZUNvbXBs
aWFudFBvc2l0aW9uKTsKK30KKworLyoKKyAqIFBlcmZvcm1zIHRocmVlIG9wZXJhdGlvbnM6Cisg
KiAgMS4gQ29udmVydCBjb250cm9sIGNoYXJhY3RlcnMgdG8gc3BhY2VzCisgKiAgMi4gVHJpbSBs
ZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZXMKKyAqICAzLiBDb2xsYXBzZSBpbnRlcm5hbCB3aGl0
ZXNwYWNlLgorICovCitzdGF0aWMgaW5saW5lIFN0cmluZ1dpdGhEaXJlY3Rpb24gY2Fub25pY2Fs
aXplZFRpdGxlKERvY3VtZW50KiBkb2N1bWVudCwgY29uc3QgU3RyaW5nV2l0aERpcmVjdGlvbiYg
dGl0bGVXaXRoRGlyZWN0aW9uKQoreworICAgIGNvbnN0IFN0cmluZyYgdGl0bGUgPSB0aXRsZVdp
dGhEaXJlY3Rpb24uc3RyaW5nKCk7CisgICAgY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMgPSB0aXRs
ZS5jaGFyYWN0ZXJzKCk7CisgICAgdW5zaWduZWQgbGVuZ3RoID0gdGl0bGUubGVuZ3RoKCk7Cisg
ICAgdW5zaWduZWQgaTsKKworICAgIFN0cmluZ0J1ZmZlcjxVQ2hhcj4gYnVmZmVyKGxlbmd0aCk7
CisgICAgdW5zaWduZWQgYnVpbGRlckluZGV4ID0gMDsKKworICAgIC8vIFNraXAgbGVhZGluZyBz
cGFjZXMgYW5kIGxlYWRpbmcgY2hhcmFjdGVycyB0aGF0IHdvdWxkIGNvbnZlcnQgdG8gc3BhY2Vz
CisgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgICAgIFVDaGFyIGMgPSBj
aGFyYWN0ZXJzW2ldOworICAgICAgICBpZiAoIShjIDw9IDB4MjAgfHwgYyA9PSAweDdGKSkKKyAg
ICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChpID09IGxlbmd0aCkKKyAgICAgICAg
cmV0dXJuIFN0cmluZ1dpdGhEaXJlY3Rpb24oKTsKKworICAgIC8vIFJlcGxhY2UgY29udHJvbCBj
aGFyYWN0ZXJzIHdpdGggc3BhY2VzLCBhbmQgYmFja3NsYXNoZXMgd2l0aCBjdXJyZW5jeSBzeW1i
b2xzLCBhbmQgY29sbGFwc2Ugd2hpdGVzcGFjZS4KKyAgICBib29sIHByZXZpb3VzQ2hhcldhc1dT
ID0gZmFsc2U7CisgICAgZm9yICg7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgICBVQ2hhciBj
ID0gY2hhcmFjdGVyc1tpXTsKKyAgICAgICAgaWYgKGMgPD0gMHgyMCB8fCBjID09IDB4N0YgfHwg
KFdURjo6VW5pY29kZTo6Y2F0ZWdvcnkoYykgJiAoV1RGOjpVbmljb2RlOjpTZXBhcmF0b3JfTGlu
ZSB8IFdURjo6VW5pY29kZTo6U2VwYXJhdG9yX1BhcmFncmFwaCkpKSB7CisgICAgICAgICAgICBp
ZiAocHJldmlvdXNDaGFyV2FzV1MpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
ICAgICBidWZmZXJbYnVpbGRlckluZGV4KytdID0gJyAnOworICAgICAgICAgICAgcHJldmlvdXND
aGFyV2FzV1MgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnVmZmVyW2J1
aWxkZXJJbmRleCsrXSA9IGM7CisgICAgICAgICAgICBwcmV2aW91c0NoYXJXYXNXUyA9IGZhbHNl
OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gU3RyaXAgdHJhaWxpbmcgc3BhY2VzCisgICAg
d2hpbGUgKGJ1aWxkZXJJbmRleCA+IDApIHsKKyAgICAgICAgLS1idWlsZGVySW5kZXg7CisgICAg
ICAgIGlmIChidWZmZXJbYnVpbGRlckluZGV4XSAhPSAnICcpCisgICAgICAgICAgICBicmVhazsK
KyAgICB9CisKKyAgICBpZiAoIWJ1aWxkZXJJbmRleCAmJiBidWZmZXJbYnVpbGRlckluZGV4XSA9
PSAnICcpCisgICAgICAgIHJldHVybiBTdHJpbmdXaXRoRGlyZWN0aW9uKCk7CisKKyAgICBidWZm
ZXIuc2hyaW5rKGJ1aWxkZXJJbmRleCArIDEpOworCisgICAgLy8gUmVwbGFjZSB0aGUgYmFja3Ns
YXNoZXMgd2l0aCBjdXJyZW5jeSBzeW1ib2xzIGlmIHRoZSBlbmNvZGluZyByZXF1aXJlcyBpdC4K
KyAgICBkb2N1bWVudC0+ZGlzcGxheUJ1ZmZlck1vZGlmaWVkQnlFbmNvZGluZyhidWZmZXIuY2hh
cmFjdGVycygpLCBidWZmZXIubGVuZ3RoKCkpOworICAgIAorICAgIHJldHVybiBTdHJpbmdXaXRo
RGlyZWN0aW9uKFN0cmluZzo6YWRvcHQoYnVmZmVyKSwgdGl0bGVXaXRoRGlyZWN0aW9uLmRpcmVj
dGlvbigpKTsKK30KKwordm9pZCBEb2N1bWVudDo6dXBkYXRlVGl0bGUoY29uc3QgU3RyaW5nV2l0
aERpcmVjdGlvbiYgdGl0bGUpCit7CisgICAgaWYgKG1fcmF3VGl0bGUgPT0gdGl0bGUpCisgICAg
ICAgIHJldHVybjsKKworICAgIG1fcmF3VGl0bGUgPSB0aXRsZTsKKyAgICBtX3RpdGxlID0gY2Fu
b25pY2FsaXplZFRpdGxlKHRoaXMsIG1fcmF3VGl0bGUpOworICAgIGlmIChGcmFtZSogZiA9IGZy
YW1lKCkpCisgICAgICAgIGYtPmxvYWRlcigpLT5zZXRUaXRsZShtX3RpdGxlKTsKK30KKwordm9p
ZCBEb2N1bWVudDo6c2V0VGl0bGUoY29uc3QgU3RyaW5nJiB0aXRsZSkKK3sKKyAgICAvLyBUaXRs
ZSBzZXQgYnkgSmF2YVNjcmlwdCAtLSBvdmVycmlkZXMgYW55IHRpdGxlIGVsZW1lbnRzLgorICAg
IG1fdGl0bGVTZXRFeHBsaWNpdGx5ID0gdHJ1ZTsKKyAgICBpZiAoIWlzSFRNTERvY3VtZW50KCkg
JiYgIWlzWEhUTUxEb2N1bWVudCgpKQorICAgICAgICBtX3RpdGxlRWxlbWVudCA9IDA7CisgICAg
ZWxzZSBpZiAoIW1fdGl0bGVFbGVtZW50KSB7CisgICAgICAgIGlmIChIVE1MRWxlbWVudCogaGVh
ZEVsZW1lbnQgPSBoZWFkKCkpIHsKKyAgICAgICAgICAgIG1fdGl0bGVFbGVtZW50ID0gY3JlYXRl
RWxlbWVudCh0aXRsZVRhZywgZmFsc2UpOworICAgICAgICAgICAgRXhjZXB0aW9uQ29kZSBlYyA9
IDA7CisgICAgICAgICAgICBoZWFkRWxlbWVudC0+YXBwZW5kQ2hpbGQobV90aXRsZUVsZW1lbnQs
IGVjKTsKKyAgICAgICAgICAgIEFTU0VSVCghZWMpOworICAgICAgICB9CisgICAgfQorCisgICAg
Ly8gVGhlIERPTSBBUEkgaGFzIG5vIG1ldGhvZCBvZiBzcGVjaWZ5aW5nIGRpcmVjdGlvbiwgc28g
YXNzdW1lIExUUi4KKyAgICB1cGRhdGVUaXRsZShTdHJpbmdXaXRoRGlyZWN0aW9uKHRpdGxlLCBM
VFIpKTsKKworICAgIGlmIChtX3RpdGxlRWxlbWVudCkgeworICAgICAgICBBU1NFUlQobV90aXRs
ZUVsZW1lbnQtPmhhc1RhZ05hbWUodGl0bGVUYWcpKTsKKyAgICAgICAgaWYgKG1fdGl0bGVFbGVt
ZW50LT5oYXNUYWdOYW1lKHRpdGxlVGFnKSkKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEhUTUxU
aXRsZUVsZW1lbnQqPihtX3RpdGxlRWxlbWVudC5nZXQoKSktPnNldFRleHQodGl0bGUpOworICAg
IH0KK30KKwordm9pZCBEb2N1bWVudDo6c2V0VGl0bGVFbGVtZW50KGNvbnN0IFN0cmluZ1dpdGhE
aXJlY3Rpb24mIHRpdGxlLCBFbGVtZW50KiB0aXRsZUVsZW1lbnQpCit7CisgICAgaWYgKHRpdGxl
RWxlbWVudCAhPSBtX3RpdGxlRWxlbWVudCkgeworICAgICAgICBpZiAobV90aXRsZUVsZW1lbnQg
fHwgbV90aXRsZVNldEV4cGxpY2l0bHkpCisgICAgICAgICAgICAvLyBPbmx5IGFsbG93IHRoZSBm
aXJzdCB0aXRsZSBlbGVtZW50IHRvIGNoYW5nZSB0aGUgdGl0bGUgLS0gb3RoZXJzIGhhdmUgbm8g
ZWZmZWN0LgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBtX3RpdGxlRWxlbWVudCA9IHRp
dGxlRWxlbWVudDsKKyAgICB9CisKKyAgICB1cGRhdGVUaXRsZSh0aXRsZSk7Cit9CisKK3ZvaWQg
RG9jdW1lbnQ6OnJlbW92ZVRpdGxlKEVsZW1lbnQqIHRpdGxlRWxlbWVudCkKK3sKKyAgICBpZiAo
bV90aXRsZUVsZW1lbnQgIT0gdGl0bGVFbGVtZW50KQorICAgICAgICByZXR1cm47CisKKyAgICBt
X3RpdGxlRWxlbWVudCA9IDA7CisgICAgbV90aXRsZVNldEV4cGxpY2l0bHkgPSBmYWxzZTsKKwor
ICAgIC8vIFVwZGF0ZSB0aXRsZSBiYXNlZCBvbiBmaXJzdCB0aXRsZSBlbGVtZW50IGluIHRoZSBo
ZWFkLCBpZiBvbmUgZXhpc3RzLgorICAgIGlmIChIVE1MRWxlbWVudCogaGVhZEVsZW1lbnQgPSBo
ZWFkKCkpIHsKKyAgICAgICAgZm9yIChOb2RlKiBlID0gaGVhZEVsZW1lbnQtPmZpcnN0Q2hpbGQo
KTsgZTsgZSA9IGUtPm5leHRTaWJsaW5nKCkpCisgICAgICAgICAgICBpZiAoZS0+aGFzVGFnTmFt
ZSh0aXRsZVRhZykpIHsKKyAgICAgICAgICAgICAgICBIVE1MVGl0bGVFbGVtZW50KiB0aXRsZUVs
ZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MVGl0bGVFbGVtZW50Kj4oZSk7CisgICAgICAgICAgICAg
ICAgc2V0VGl0bGVFbGVtZW50KHRpdGxlRWxlbWVudC0+dGV4dFdpdGhEaXJlY3Rpb24oKSwgdGl0
bGVFbGVtZW50KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICB9
CisKKyAgICBpZiAoIW1fdGl0bGVFbGVtZW50KQorICAgICAgICB1cGRhdGVUaXRsZShTdHJpbmdX
aXRoRGlyZWN0aW9uKCkpOworfQorCisjaWYgRU5BQkxFKFBBR0VfVklTSUJJTElUWV9BUEkpCitQ
YWdlVmlzaWJpbGl0eVN0YXRlIERvY3VtZW50Ojp2aXNpYmlsaXR5U3RhdGUoKSBjb25zdAorewor
ICAgIC8vIFRoZSB2aXNpYmlsaXR5IG9mIHRoZSBkb2N1bWVudCBpcyBpbmhlcml0ZWQgZnJvbSB0
aGUgdmlzaWJpbGl0eSBvZiB0aGUKKyAgICAvLyBwYWdlLiBJZiB0aGVyZSBpcyBubyBwYWdlIGFz
c29jaWF0ZWQgd2l0aCB0aGUgZG9jdW1lbnQsIHdlIHdpbGwgYXNzdW1lCisgICAgLy8gdGhhdCB0
aGUgcGFnZSBpcyB2aXNpYmxlIGkuZS4gaW52aXNpYmlsaXR5IGhhcyB0byBiZSBleHBsaWNpdGx5
CisgICAgLy8gc3BlY2lmaWVkIGJ5IHRoZSBlbWJlZGRlci4KKyAgICBpZiAoIW1fZnJhbWUgfHwg
IW1fZnJhbWUtPnBhZ2UoKSkKKyAgICAgICAgcmV0dXJuIFBhZ2VWaXNpYmlsaXR5U3RhdGVWaXNp
YmxlOworICAgIHJldHVybiBtX2ZyYW1lLT5wYWdlKCktPnZpc2liaWxpdHlTdGF0ZSgpOworfQor
CitTdHJpbmcgRG9jdW1lbnQ6OndlYmtpdFZpc2liaWxpdHlTdGF0ZSgpIGNvbnN0Cit7CisgICAg
cmV0dXJuIHBhZ2VWaXNpYmlsaXR5U3RhdGVTdHJpbmcodmlzaWJpbGl0eVN0YXRlKCkpOworfQor
Citib29sIERvY3VtZW50Ojp3ZWJraXRIaWRkZW4oKSBjb25zdAoreworICAgIHJldHVybiB2aXNp
YmlsaXR5U3RhdGUoKSAhPSBQYWdlVmlzaWJpbGl0eVN0YXRlVmlzaWJsZTsKK30KKwordm9pZCBE
b2N1bWVudDo6ZGlzcGF0Y2hWaXNpYmlsaXR5U3RhdGVDaGFuZ2VFdmVudCgpCit7CisgICAgZGlz
cGF0Y2hFdmVudChFdmVudDo6Y3JlYXRlKGV2ZW50TmFtZXMoKS53ZWJraXR2aXNpYmlsaXR5Y2hh
bmdlRXZlbnQsIGZhbHNlLCBmYWxzZSkpOworfQorI2VuZGlmCisKKyNpZiBFTkFCTEUoQ1NQX05F
WFQpCitET01TZWN1cml0eVBvbGljeSogRG9jdW1lbnQ6OnNlY3VyaXR5UG9saWN5KCkKK3sKKyAg
ICBpZiAoIW1fZG9tU2VjdXJpdHlQb2xpY3kpCisgICAgICAgIG1fZG9tU2VjdXJpdHlQb2xpY3kg
PSBET01TZWN1cml0eVBvbGljeTo6Y3JlYXRlKHRoaXMpOworICAgIHJldHVybiBtX2RvbVNlY3Vy
aXR5UG9saWN5LmdldCgpOworfQorI2VuZGlmCisKK1N0cmluZyBEb2N1bWVudDo6bm9kZU5hbWUo
KSBjb25zdAoreworICAgIHJldHVybiAiI2RvY3VtZW50IjsKK30KKworTm9kZTo6Tm9kZVR5cGUg
RG9jdW1lbnQ6Om5vZGVUeXBlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gRE9DVU1FTlRfTk9ERTsK
K30KKworRm9ybUNvbnRyb2xsZXIqIERvY3VtZW50Ojpmb3JtQ29udHJvbGxlcigpCit7CisgICAg
aWYgKCFtX2Zvcm1Db250cm9sbGVyKQorICAgICAgICBtX2Zvcm1Db250cm9sbGVyID0gRm9ybUNv
bnRyb2xsZXI6OmNyZWF0ZSgpOworICAgIHJldHVybiBtX2Zvcm1Db250cm9sbGVyLmdldCgpOwor
fQorCitWZWN0b3I8U3RyaW5nPiBEb2N1bWVudDo6Zm9ybUVsZW1lbnRzU3RhdGUoKSBjb25zdAor
eworICAgIGlmICghbV9mb3JtQ29udHJvbGxlcikKKyAgICAgICAgcmV0dXJuIFZlY3RvcjxTdHJp
bmc+KCk7CisgICAgcmV0dXJuIG1fZm9ybUNvbnRyb2xsZXItPmZvcm1FbGVtZW50c1N0YXRlKCk7
Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnNldFN0YXRlRm9yTmV3Rm9ybUVsZW1lbnRzKGNvbnN0IFZl
Y3RvcjxTdHJpbmc+JiBzdGF0ZVZlY3RvcikKK3sKKyAgICBpZiAoIXN0YXRlVmVjdG9yLnNpemUo
KSAmJiAhbV9mb3JtQ29udHJvbGxlcikKKyAgICAgICAgcmV0dXJuOworICAgIGZvcm1Db250cm9s
bGVyKCktPnNldFN0YXRlRm9yTmV3Rm9ybUVsZW1lbnRzKHN0YXRlVmVjdG9yKTsKK30KKworRnJh
bWVWaWV3KiBEb2N1bWVudDo6dmlldygpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fZnJhbWUgPyBt
X2ZyYW1lLT52aWV3KCkgOiAwOworfQorCitQYWdlKiBEb2N1bWVudDo6cGFnZSgpIGNvbnN0Cit7
CisgICAgcmV0dXJuIG1fZnJhbWUgPyBtX2ZyYW1lLT5wYWdlKCkgOiAwOyAgICAKK30KKworU2V0
dGluZ3MqIERvY3VtZW50OjpzZXR0aW5ncygpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fZnJhbWUg
PyBtX2ZyYW1lLT5zZXR0aW5ncygpIDogMDsKK30KKworUGFzc1JlZlB0cjxSYW5nZT4gRG9jdW1l
bnQ6OmNyZWF0ZVJhbmdlKCkKK3sKKyAgICByZXR1cm4gUmFuZ2U6OmNyZWF0ZSh0aGlzKTsKK30K
KworUGFzc1JlZlB0cjxOb2RlSXRlcmF0b3I+IERvY3VtZW50OjpjcmVhdGVOb2RlSXRlcmF0b3Io
Tm9kZSogcm9vdCwgdW5zaWduZWQgd2hhdFRvU2hvdywgCisgICAgUGFzc1JlZlB0cjxOb2RlRmls
dGVyPiBmaWx0ZXIsIGJvb2wgZXhwYW5kRW50aXR5UmVmZXJlbmNlcywgRXhjZXB0aW9uQ29kZSYg
ZWMpCit7CisgICAgaWYgKCFyb290KSB7CisgICAgICAgIGVjID0gTk9UX1NVUFBPUlRFRF9FUlI7
CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gTm9kZUl0ZXJhdG9yOjpjcmVh
dGUocm9vdCwgd2hhdFRvU2hvdywgZmlsdGVyLCBleHBhbmRFbnRpdHlSZWZlcmVuY2VzKTsKK30K
KworUGFzc1JlZlB0cjxUcmVlV2Fsa2VyPiBEb2N1bWVudDo6Y3JlYXRlVHJlZVdhbGtlcihOb2Rl
KiByb290LCB1bnNpZ25lZCB3aGF0VG9TaG93LCAKKyAgICBQYXNzUmVmUHRyPE5vZGVGaWx0ZXI+
IGZpbHRlciwgYm9vbCBleHBhbmRFbnRpdHlSZWZlcmVuY2VzLCBFeGNlcHRpb25Db2RlJiBlYykK
K3sKKyAgICBpZiAoIXJvb3QpIHsKKyAgICAgICAgZWMgPSBOT1RfU1VQUE9SVEVEX0VSUjsKKyAg
ICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBUcmVlV2Fsa2VyOjpjcmVhdGUocm9v
dCwgd2hhdFRvU2hvdywgZmlsdGVyLCBleHBhbmRFbnRpdHlSZWZlcmVuY2VzKTsKK30KKwordm9p
ZCBEb2N1bWVudDo6c2NoZWR1bGVGb3JjZWRTdHlsZVJlY2FsYygpCit7CisgICAgbV9wZW5kaW5n
U3R5bGVSZWNhbGNTaG91bGRGb3JjZSA9IHRydWU7CisgICAgc2NoZWR1bGVTdHlsZVJlY2FsYygp
OworfQorCit2b2lkIERvY3VtZW50OjpzY2hlZHVsZVN0eWxlUmVjYWxjKCkKK3sKKyAgICBpZiAo
c2hvdWxkRGlzcGxheVNlYW1sZXNzbHlXaXRoUGFyZW50KCkpIHsKKyAgICAgICAgLy8gV2hlbiB3
ZSdyZSBzZWFtbGVzcywgb3VyIHBhcmVudCBkb2N1bWVudCBtYW5hZ2VzIG91ciBzdHlsZSByZWNh
bGNzLgorICAgICAgICBvd25lckVsZW1lbnQoKS0+c2V0TmVlZHNTdHlsZVJlY2FsYygpOworICAg
ICAgICBvd25lckVsZW1lbnQoKS0+ZG9jdW1lbnQoKS0+c2NoZWR1bGVTdHlsZVJlY2FsYygpOwor
ICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1fc3R5bGVSZWNhbGNUaW1lci5pc0Fj
dGl2ZSgpIHx8IGluUGFnZUNhY2hlKCkpCisgICAgICAgIHJldHVybjsKKworICAgIEFTU0VSVChj
aGlsZE5lZWRzU3R5bGVSZWNhbGMoKSB8fCBtX3BlbmRpbmdTdHlsZVJlY2FsY1Nob3VsZEZvcmNl
KTsKKworICAgIGlmICghZG9jdW1lbnRzVGhhdE5lZWRTdHlsZVJlY2FsYykKKyAgICAgICAgZG9j
dW1lbnRzVGhhdE5lZWRTdHlsZVJlY2FsYyA9IG5ldyBIYXNoU2V0PERvY3VtZW50Kj47CisgICAg
ZG9jdW1lbnRzVGhhdE5lZWRTdHlsZVJlY2FsYy0+YWRkKHRoaXMpOworICAgIAorICAgIC8vIEZJ
WE1FOiBXaHkgb24gZWFydGggaXMgdGhpcyBoZXJlPyBUaGlzIGlzIGNsZWFybHkgbWlzcGxhY2Vk
LgorICAgIGludmFsaWRhdGVBY2Nlc3NLZXlNYXAoKTsKKyAgICAKKyAgICBtX3N0eWxlUmVjYWxj
VGltZXIuc3RhcnRPbmVTaG90KDApOworCisgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpk
aWRTY2hlZHVsZVN0eWxlUmVjYWxjdWxhdGlvbih0aGlzKTsKK30KKwordm9pZCBEb2N1bWVudDo6
dW5zY2hlZHVsZVN0eWxlUmVjYWxjKCkKK3sKKyAgICBBU1NFUlQoIWNoaWxkTmVlZHNTdHlsZVJl
Y2FsYygpKTsKKworICAgIGlmIChkb2N1bWVudHNUaGF0TmVlZFN0eWxlUmVjYWxjKQorICAgICAg
ICBkb2N1bWVudHNUaGF0TmVlZFN0eWxlUmVjYWxjLT5yZW1vdmUodGhpcyk7CisKKyAgICBtX3N0
eWxlUmVjYWxjVGltZXIuc3RvcCgpOworICAgIG1fcGVuZGluZ1N0eWxlUmVjYWxjU2hvdWxkRm9y
Y2UgPSBmYWxzZTsKK30KKworYm9vbCBEb2N1bWVudDo6aXNQZW5kaW5nU3R5bGVSZWNhbGMoKSBj
b25zdAoreworICAgIHJldHVybiBtX3N0eWxlUmVjYWxjVGltZXIuaXNBY3RpdmUoKSAmJiAhbV9p
blN0eWxlUmVjYWxjOworfQorCit2b2lkIERvY3VtZW50OjpzdHlsZVJlY2FsY1RpbWVyRmlyZWQo
VGltZXI8RG9jdW1lbnQ+KikKK3sKKyAgICB1cGRhdGVTdHlsZUlmTmVlZGVkKCk7Cit9CisKK2Jv
b2wgRG9jdW1lbnQ6OmNoaWxkTmVlZHNBbmROb3RJblN0eWxlUmVjYWxjKCkKK3sKKyAgICByZXR1
cm4gY2hpbGROZWVkc1N0eWxlUmVjYWxjKCkgJiYgIW1faW5TdHlsZVJlY2FsYzsKK30KKwordm9p
ZCBEb2N1bWVudDo6cmVjYWxjU3R5bGUoU3R5bGVDaGFuZ2UgY2hhbmdlKQoreworICAgIC8vIHdl
IHNob3VsZCBub3QgZW50ZXIgc3R5bGUgcmVjYWxjIHdoaWxlIHBhaW50aW5nCisgICAgQVNTRVJU
KCF2aWV3KCkgfHwgIXZpZXcoKS0+aXNQYWludGluZygpKTsKKyAgICBpZiAodmlldygpICYmIHZp
ZXcoKS0+aXNQYWludGluZygpKQorICAgICAgICByZXR1cm47CisgICAgCisgICAgaWYgKG1faW5T
dHlsZVJlY2FsYykKKyAgICAgICAgcmV0dXJuOyAvLyBHdWFyZCBhZ2FpbnN0IHJlLWVudHJhbmN5
LiAtZHdoCisKKyAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIHVwZGF0ZSBzdHlsZSBvbiBvdXIgYW5j
ZXN0b3IgY2hhaW4gYmVmb3JlIHByb2NlZWRpbmcgKGVzcGVjaWFsbHkgZm9yIHNlYW1sZXNzKSwK
KyAgICAvLyBob3dldmVyIGRvaW5nIHNvIGN1cnJlbnRseSBjYXVzZXMgc2V2ZXJhbCB0ZXN0cyB0
byBjcmFzaCwgYXMgRnJhbWU6OnNldERvY3VtZW50IGNhbGxzIERvY3VtZW50OjphdHRhY2gKKyAg
ICAvLyBiZWZvcmUgc2V0dGluZyB0aGUgRE9NV2luZG93IG9uIHRoZSBGcmFtZSwgb3IgdGhlIFNl
Y3VyaXR5T3JpZ2luIG9uIHRoZSBkb2N1bWVudC4gVGhlIGF0dGFjaCwgaW4gdHVybgorICAgIC8v
IHJlc29sdmVzIHN0eWxlIChoZXJlKSBhbmQgdGhlbiB3aGVuIHdlIHJlc29sdmUgc3R5bGUgb24g
dGhlIHBhcmVudCBjaGFpbiwgd2UgbWF5IGVuZCB1cAorICAgIC8vIHJlLWF0dGFjaGluZyBvdXIg
Y29udGFpbmluZyBpZnJhbWUsIHdoaWNoIHdoZW4gYXNrZWQgSFRNTEZyYW1lRWxlbWVudEJhc2U6
OmlzVVJMQWxsb3dlZAorICAgIC8vIGhpdHMgYSBudWxsLWRlcmVmZXJlbmNlIGR1ZSB0byBzZWN1
cml0eSBjb2RlIGFsd2F5cyBhc3N1bWluZyB0aGUgZG9jdW1lbnQgaGFzIGEgU2VjdXJpdHlPcmln
aW4uCisKKyAgICBpZiAobV9oYXNEaXJ0eVN0eWxlUmVzb2x2ZXIpCisgICAgICAgIHVwZGF0ZUFj
dGl2ZVN0eWxlc2hlZXRzKFJlY2FsY1N0eWxlSW1tZWRpYXRlbHkpOworCisgICAgSW5zcGVjdG9y
SW5zdHJ1bWVudGF0aW9uQ29va2llIGNvb2tpZSA9IEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6
d2lsbFJlY2FsY3VsYXRlU3R5bGUodGhpcyk7CisKKyAgICBpZiAobV9lbGVtU2hlZXQgJiYgbV9l
bGVtU2hlZXQtPmNvbnRlbnRzKCktPnVzZXNSZW1Vbml0cygpKQorICAgICAgICBtX3VzZXNSZW1V
bml0cyA9IHRydWU7CisKKyAgICBtX2luU3R5bGVSZWNhbGMgPSB0cnVlOworICAgIHN1c3BlbmRQ
b3N0QXR0YWNoQ2FsbGJhY2tzKCk7CisgICAgUmVuZGVyV2lkZ2V0OjpzdXNwZW5kV2lkZ2V0SGll
cmFyY2h5VXBkYXRlcygpOworICAgIAorICAgIFJlZlB0cjxGcmFtZVZpZXc+IGZyYW1lVmlldyA9
IHZpZXcoKTsKKyAgICBpZiAoZnJhbWVWaWV3KSB7CisgICAgICAgIGZyYW1lVmlldy0+cGF1c2VT
Y2hlZHVsZWRFdmVudHMoKTsKKyAgICAgICAgZnJhbWVWaWV3LT5iZWdpbkRlZmVycmVkUmVwYWlu
dHMoKTsKKyAgICB9CisKKyAgICBBU1NFUlQoIXJlbmRlcmVyKCkgfHwgcmVuZGVyQXJlbmEoKSk7
CisgICAgaWYgKCFyZW5kZXJlcigpIHx8ICFyZW5kZXJBcmVuYSgpKQorICAgICAgICBnb3RvIGJh
aWxfb3V0OworCisgICAgaWYgKG1fcGVuZGluZ1N0eWxlUmVjYWxjU2hvdWxkRm9yY2UpCisgICAg
ICAgIGNoYW5nZSA9IEZvcmNlOworCisgICAgLy8gUmVjYWxjdWxhdGluZyB0aGUgcm9vdCBzdHls
ZSAob24gdGhlIGRvY3VtZW50KSBpcyBub3QgbmVlZGVkIGluIHRoZSBjb21tb24gY2FzZS4KKyAg
ICBpZiAoKGNoYW5nZSA9PSBGb3JjZSkgfHwgKHNob3VsZERpc3BsYXlTZWFtbGVzc2x5V2l0aFBh
cmVudCgpICYmIChjaGFuZ2UgPj0gSW5oZXJpdCkpKSB7CisgICAgICAgIC8vIHN0eWxlIHNlbGVj
dG9yIG1heSBzZXQgdGhpcyBhZ2FpbiBkdXJpbmcgcmVjYWxjCisgICAgICAgIG1faGFzTm9kZXNX
aXRoUGxhY2Vob2xkZXJTdHlsZSA9IGZhbHNlOworICAgICAgICAKKyAgICAgICAgUmVmUHRyPFJl
bmRlclN0eWxlPiBkb2N1bWVudFN0eWxlID0gU3R5bGVSZXNvbHZlcjo6c3R5bGVGb3JEb2N1bWVu
dCh0aGlzLCBtX3N0eWxlUmVzb2x2ZXIgPyBtX3N0eWxlUmVzb2x2ZXItPmZvbnRTZWxlY3Rvcigp
IDogMCk7CisgICAgICAgIFN0eWxlQ2hhbmdlIGNoID0gTm9kZTo6ZGlmZihkb2N1bWVudFN0eWxl
LmdldCgpLCByZW5kZXJlcigpLT5zdHlsZSgpLCB0aGlzKTsKKyAgICAgICAgaWYgKGNoICE9IE5v
Q2hhbmdlKQorICAgICAgICAgICAgcmVuZGVyZXIoKS0+c2V0U3R5bGUoZG9jdW1lbnRTdHlsZS5y
ZWxlYXNlKCkpOworICAgIH0KKworICAgIGZvciAoTm9kZSogbiA9IGZpcnN0Q2hpbGQoKTsgbjsg
biA9IG4tPm5leHRTaWJsaW5nKCkpIHsKKyAgICAgICAgaWYgKCFuLT5pc0VsZW1lbnROb2RlKCkp
CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgRWxlbWVudCogZWxlbWVudCA9IHN0YXRp
Y19jYXN0PEVsZW1lbnQqPihuKTsKKyAgICAgICAgaWYgKGNoYW5nZSA+PSBJbmhlcml0IHx8IGVs
ZW1lbnQtPmNoaWxkTmVlZHNTdHlsZVJlY2FsYygpIHx8IGVsZW1lbnQtPm5lZWRzU3R5bGVSZWNh
bGMoKSkKKyAgICAgICAgICAgIGVsZW1lbnQtPnJlY2FsY1N0eWxlKGNoYW5nZSk7CisgICAgfQor
CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgIGlmICh2aWV3KCkpIHsKKyAg
ICAgICAgYm9vbCBsYXlvdXRQZW5kaW5nID0gdmlldygpLT5sYXlvdXRQZW5kaW5nKCkgfHwgcmVu
ZGVyZXIoKS0+bmVlZHNMYXlvdXQoKTsKKyAgICAgICAgLy8gSWYgd2UgZGlkbid0IHVwZGF0ZSBj
b21wb3NpdGluZyBsYXllcnMgYmVjYXVzZSBvZiBsYXlvdXQoKSwgd2UgbmVlZCB0byBkbyBzbyBo
ZXJlLgorICAgICAgICBpZiAoIWxheW91dFBlbmRpbmcpCisgICAgICAgICAgICB2aWV3KCktPnVw
ZGF0ZUNvbXBvc2l0aW5nTGF5ZXJzQWZ0ZXJTdHlsZUNoYW5nZSgpOworICAgIH0KKyNlbmRpZgor
CitiYWlsX291dDoKKyAgICBjbGVhck5lZWRzU3R5bGVSZWNhbGMoKTsKKyAgICBjbGVhckNoaWxk
TmVlZHNTdHlsZVJlY2FsYygpOworICAgIHVuc2NoZWR1bGVTdHlsZVJlY2FsYygpOworCisgICAg
bV9pblN0eWxlUmVjYWxjID0gZmFsc2U7CisgICAgCisgICAgLy8gUHNldWRvIGVsZW1lbnQgcmVt
b3ZhbCBhbmQgc2ltaWxhciBtYXkgb25seSB3b3JrIHdpdGggdGhlc2UgZmxhZ3Mgc3RpbGwgc2V0
LiBSZXNldCB0aGVtIGFmdGVyIHRoZSBzdHlsZSByZWNhbGMuCisgICAgaWYgKG1fc3R5bGVSZXNv
bHZlcikKKyAgICAgICAgcmVzZXRDU1NGZWF0dXJlRmxhZ3MoKTsKKworICAgIGlmIChmcmFtZVZp
ZXcpIHsKKyAgICAgICAgZnJhbWVWaWV3LT5yZXN1bWVTY2hlZHVsZWRFdmVudHMoKTsKKyAgICAg
ICAgZnJhbWVWaWV3LT5lbmREZWZlcnJlZFJlcGFpbnRzKCk7CisgICAgfQorICAgIFJlbmRlcldp
ZGdldDo6cmVzdW1lV2lkZ2V0SGllcmFyY2h5VXBkYXRlcygpOworICAgIHJlc3VtZVBvc3RBdHRh
Y2hDYWxsYmFja3MoKTsKKworICAgIC8vIElmIHdlIHdhbnRlZCB0byBjYWxsIGltcGxpY2l0Q2xv
c2UoKSBkdXJpbmcgcmVjYWxjU3R5bGUsIGRvIHNvIG5vdyB0aGF0IHdlJ3JlIGZpbmlzaGVkLgor
ICAgIGlmIChtX2Nsb3NlQWZ0ZXJTdHlsZVJlY2FsYykgeworICAgICAgICBtX2Nsb3NlQWZ0ZXJT
dHlsZVJlY2FsYyA9IGZhbHNlOworICAgICAgICBpbXBsaWNpdENsb3NlKCk7CisgICAgfQorCisg
ICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpkaWRSZWNhbGN1bGF0ZVN0eWxlKGNvb2tpZSk7
Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnVwZGF0ZVN0eWxlSWZOZWVkZWQoKQoreworICAgIEFTU0VS
VChpc01haW5UaHJlYWQoKSk7CisgICAgQVNTRVJUKCF2aWV3KCkgfHwgKCF2aWV3KCktPmlzSW5M
YXlvdXQoKSAmJiAhdmlldygpLT5pc1BhaW50aW5nKCkpKTsKKyAgICAKKyAgICBpZiAoKCFtX3Bl
bmRpbmdTdHlsZVJlY2FsY1Nob3VsZEZvcmNlICYmICFjaGlsZE5lZWRzU3R5bGVSZWNhbGMoKSkg
fHwgaW5QYWdlQ2FjaGUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgQW5pbWF0aW9uVXBkYXRl
QmxvY2sgYW5pbWF0aW9uVXBkYXRlQmxvY2sobV9mcmFtZSA/IG1fZnJhbWUtPmFuaW1hdGlvbigp
IDogMCk7CisgICAgcmVjYWxjU3R5bGUoTm9DaGFuZ2UpOworfQorCit2b2lkIERvY3VtZW50Ojp1
cGRhdGVTdHlsZUZvckFsbERvY3VtZW50cygpCit7CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgp
KTsKKyAgICBpZiAoIWRvY3VtZW50c1RoYXROZWVkU3R5bGVSZWNhbGMpCisgICAgICAgIHJldHVy
bjsKKworICAgIHdoaWxlIChkb2N1bWVudHNUaGF0TmVlZFN0eWxlUmVjYWxjLT5zaXplKCkpIHsK
KyAgICAgICAgSGFzaFNldDxEb2N1bWVudCo+OjppdGVyYXRvciBpdCA9IGRvY3VtZW50c1RoYXRO
ZWVkU3R5bGVSZWNhbGMtPmJlZ2luKCk7CisgICAgICAgIERvY3VtZW50KiBkb2MgPSAqaXQ7Cisg
ICAgICAgIGRvY3VtZW50c1RoYXROZWVkU3R5bGVSZWNhbGMtPnJlbW92ZShkb2MpOworICAgICAg
ICBkb2MtPnVwZGF0ZVN0eWxlSWZOZWVkZWQoKTsKKyAgICB9Cit9CisKK3ZvaWQgRG9jdW1lbnQ6
OnVwZGF0ZUxheW91dCgpCit7CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKyAgICBpZiAo
RWxlbWVudCogb2UgPSBvd25lckVsZW1lbnQoKSkKKyAgICAgICAgb2UtPmRvY3VtZW50KCktPnVw
ZGF0ZUxheW91dCgpOworCisgICAgdXBkYXRlU3R5bGVJZk5lZWRlZCgpOworCisgICAgLy8gT25s
eSBkbyBhIGxheW91dCBpZiBjaGFuZ2VzIGhhdmUgb2NjdXJyZWQgdGhhdCBtYWtlIGl0IG5lY2Vz
c2FyeS4gICAgICAKKyAgICBGcmFtZVZpZXcqIHYgPSB2aWV3KCk7CisgICAgaWYgKHYgJiYgcmVu
ZGVyZXIoKSAmJiAodi0+bGF5b3V0UGVuZGluZygpIHx8IHJlbmRlcmVyKCktPm5lZWRzTGF5b3V0
KCkpKQorICAgICAgICB2LT5sYXlvdXQoKTsKK30KKworLy8gRklYTUU6IFRoaXMgaXMgYSBiYWQg
aWRlYSBhbmQgbmVlZHMgdG8gYmUgcmVtb3ZlZCBldmVudHVhbGx5LgorLy8gT3RoZXIgYnJvd3Nl
cnMgbG9hZCBzdHlsZXNoZWV0cyBiZWZvcmUgdGhleSBjb250aW51ZSBwYXJzaW5nIHRoZSB3ZWIg
cGFnZS4KKy8vIFNpbmNlIHdlIGRvbid0LCB3ZSBjYW4gcnVuIEphdmFTY3JpcHQgY29kZSB0aGF0
IG5lZWRzIGFuc3dlcnMgYmVmb3JlIHRoZQorLy8gc3R5bGVzaGVldHMgYXJlIGxvYWRlZC4gRG9p
bmcgYSBsYXlvdXQgaWdub3JpbmcgdGhlIHBlbmRpbmcgc3R5bGVzaGVldHMKKy8vIGxldHMgdXMg
Z2V0IHJlYXNvbmFibGUgYW5zd2Vycy4gVGhlIGxvbmcgdGVybSBzb2x1dGlvbiB0byB0aGlzIHBy
b2JsZW0gaXMKKy8vIHRvIGluc3RlYWQgc3VzcGVuZCBKYXZhU2NyaXB0IGV4ZWN1dGlvbi4KK3Zv
aWQgRG9jdW1lbnQ6OnVwZGF0ZUxheW91dElnbm9yZVBlbmRpbmdTdHlsZXNoZWV0cygpCit7Cisg
ICAgYm9vbCBvbGRJZ25vcmUgPSBtX2lnbm9yZVBlbmRpbmdTdHlsZXNoZWV0czsKKyAgICAKKyAg
ICBpZiAoIWhhdmVTdHlsZXNoZWV0c0xvYWRlZCgpKSB7CisgICAgICAgIG1faWdub3JlUGVuZGlu
Z1N0eWxlc2hlZXRzID0gdHJ1ZTsKKyAgICAgICAgLy8gRklYTUU6IFdlIGFyZSB3aWxsaW5nIHRv
IGF0dGVtcHQgdG8gc3VwcHJlc3MgcGFpbnRpbmcgd2l0aCBvdXRkYXRlZCBzdHlsZSBpbmZvIG9u
bHkgb25jZS4gIE91ciBhc3N1bXB0aW9uIGlzIHRoYXQgaXQgd291bGQgYmUKKyAgICAgICAgLy8g
ZGFuZ2Vyb3VzIHRvIHRyeSB0byBzdG9wIGl0IGEgc2Vjb25kIHRpbWUsIGFmdGVyIHBhZ2UgY29u
dGVudCBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZCBhbmQgZGlzcGxheWVkCisgICAgICAgIC8vIHdp
dGggYWNjdXJhdGUgc3R5bGUgaW5mb3JtYXRpb24uICAoT3VyIHN1cHByZXNzaW9uIGludm9sdmVz
IGJsYW5raW5nIHRoZSB3aG9sZSBwYWdlIGF0IHRoZQorICAgICAgICAvLyBtb21lbnQuICBJZiBp
dCB3ZXJlIG1vcmUgcmVmaW5lZCwgd2UgbWlnaHQgYmUgYWJsZSB0byBkbyBzb21ldGhpbmcgYmV0
dGVyLikKKyAgICAgICAgLy8gSXQncyB3b3J0aCBub3RpbmcgdGhvdWdoIHRoYXQgdGhpcyBlbnRp
cmUgbWV0aG9kIGlzIGEgaGFjaywgc2luY2Ugd2hhdCB3ZSByZWFsbHkgd2FudCB0byBkbyBpcwor
ICAgICAgICAvLyBzdXNwZW5kIEpTIGluc3RlYWQgb2YgZG9pbmcgYSBsYXlvdXQgd2l0aCBpbmFj
Y3VyYXRlIGluZm9ybWF0aW9uLgorICAgICAgICBIVE1MRWxlbWVudCogYm9keUVsZW1lbnQgPSBi
b2R5KCk7CisgICAgICAgIGlmIChib2R5RWxlbWVudCAmJiAhYm9keUVsZW1lbnQtPnJlbmRlcmVy
KCkgJiYgbV9wZW5kaW5nU2hlZXRMYXlvdXQgPT0gTm9MYXlvdXRXaXRoUGVuZGluZ1NoZWV0cykg
eworICAgICAgICAgICAgbV9wZW5kaW5nU2hlZXRMYXlvdXQgPSBEaWRMYXlvdXRXaXRoUGVuZGlu
Z1NoZWV0czsKKyAgICAgICAgICAgIHN0eWxlUmVzb2x2ZXJDaGFuZ2VkKFJlY2FsY1N0eWxlSW1t
ZWRpYXRlbHkpOworICAgICAgICB9IGVsc2UgaWYgKG1faGFzTm9kZXNXaXRoUGxhY2Vob2xkZXJT
dHlsZSkKKyAgICAgICAgICAgIC8vIElmIG5ldyBub2RlcyBoYXZlIGJlZW4gYWRkZWQgb3Igc3R5
bGUgcmVjYWxjIGhhcyBiZWVuIGRvbmUgd2l0aCBzdHlsZSBzaGVldHMgc3RpbGwgcGVuZGluZywg
c29tZSBub2RlcyAKKyAgICAgICAgICAgIC8vIG1heSBub3QgaGF2ZSBoYWQgdGhlaXIgcmVhbCBz
dHlsZSBjYWxjdWxhdGVkIHlldC4gTm9ybWFsbHkgdGhpcyBnZXRzIGNsZWFuZWQgd2hlbiBzdHls
ZSBzaGVldHMgYXJyaXZlIAorICAgICAgICAgICAgLy8gYnV0IGhlcmUgd2UgbmVlZCB1cC10by1k
YXRlIHN0eWxlIGltbWVkaWF0ZWx5LgorICAgICAgICAgICAgcmVjYWxjU3R5bGUoRm9yY2UpOwor
ICAgIH0KKworICAgIHVwZGF0ZUxheW91dCgpOworCisgICAgbV9pZ25vcmVQZW5kaW5nU3R5bGVz
aGVldHMgPSBvbGRJZ25vcmU7Cit9CisKK1Bhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IERvY3VtZW50
OjpzdHlsZUZvckVsZW1lbnRJZ25vcmluZ1BlbmRpbmdTdHlsZXNoZWV0cyhFbGVtZW50KiBlbGVt
ZW50KQoreworICAgIEFTU0VSVF9BUkcoZWxlbWVudCwgZWxlbWVudC0+ZG9jdW1lbnQoKSA9PSB0
aGlzKTsKKworICAgIGJvb2wgb2xkSWdub3JlID0gbV9pZ25vcmVQZW5kaW5nU3R5bGVzaGVldHM7
CisgICAgbV9pZ25vcmVQZW5kaW5nU3R5bGVzaGVldHMgPSB0cnVlOworICAgIFJlZlB0cjxSZW5k
ZXJTdHlsZT4gc3R5bGUgPSBzdHlsZVJlc29sdmVyKCktPnN0eWxlRm9yRWxlbWVudChlbGVtZW50
LCBlbGVtZW50LT5wYXJlbnROb2RlKCkgPyBlbGVtZW50LT5wYXJlbnROb2RlKCktPmNvbXB1dGVk
U3R5bGUoKSA6IDApOworICAgIG1faWdub3JlUGVuZGluZ1N0eWxlc2hlZXRzID0gb2xkSWdub3Jl
OworICAgIHJldHVybiBzdHlsZS5yZWxlYXNlKCk7Cit9CisKK1Bhc3NSZWZQdHI8UmVuZGVyU3R5
bGU+IERvY3VtZW50OjpzdHlsZUZvclBhZ2UoaW50IHBhZ2VJbmRleCkKK3sKKyAgICBSZWZQdHI8
UmVuZGVyU3R5bGU+IHN0eWxlID0gc3R5bGVSZXNvbHZlcigpLT5zdHlsZUZvclBhZ2UocGFnZUlu
ZGV4KTsKKyAgICByZXR1cm4gc3R5bGUucmVsZWFzZSgpOworfQorCit2b2lkIERvY3VtZW50Ojpy
ZWdpc3RlckN1c3RvbUZvbnQoUGFzc093blB0cjxGb250RGF0YT4gZm9udERhdGEpCit7CisgICAg
bV9jdXN0b21Gb250cy5hcHBlbmQoZm9udERhdGEpOworfQorCit2b2lkIERvY3VtZW50OjpkZWxl
dGVDdXN0b21Gb250cygpCit7CisgICAgc2l6ZV90IHNpemUgPSBtX2N1c3RvbUZvbnRzLnNpemUo
KTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkKKyAgICAgICAgR2x5cGhQ
YWdlVHJlZU5vZGU6OnBydW5lVHJlZUN1c3RvbUZvbnREYXRhKG1fY3VzdG9tRm9udHNbaV0uZ2V0
KCkpOworCisgICAgbV9jdXN0b21Gb250cy5jbGVhcigpOworfQorCitib29sIERvY3VtZW50Ojpp
c1BhZ2VCb3hWaXNpYmxlKGludCBwYWdlSW5kZXgpCit7CisgICAgUmVmUHRyPFJlbmRlclN0eWxl
PiBzdHlsZSA9IHN0eWxlRm9yUGFnZShwYWdlSW5kZXgpOworICAgIHJldHVybiBzdHlsZS0+dmlz
aWJpbGl0eSgpICE9IEhJRERFTjsgLy8gZGlzcGxheSBwcm9wZXJ0eSBkb2Vzbid0IGFwcGx5IHRv
IEBwYWdlLgorfQorCit2b2lkIERvY3VtZW50OjpwYWdlU2l6ZUFuZE1hcmdpbnNJblBpeGVscyhp
bnQgcGFnZUluZGV4LCBJbnRTaXplJiBwYWdlU2l6ZSwgaW50JiBtYXJnaW5Ub3AsIGludCYgbWFy
Z2luUmlnaHQsIGludCYgbWFyZ2luQm90dG9tLCBpbnQmIG1hcmdpbkxlZnQpCit7CisgICAgUmVm
UHRyPFJlbmRlclN0eWxlPiBzdHlsZSA9IHN0eWxlRm9yUGFnZShwYWdlSW5kZXgpOworICAgIFJl
bmRlclZpZXcqIHZpZXcgPSByZW5kZXJWaWV3KCk7CisKKyAgICBpbnQgd2lkdGggPSBwYWdlU2l6
ZS53aWR0aCgpOworICAgIGludCBoZWlnaHQgPSBwYWdlU2l6ZS5oZWlnaHQoKTsKKyAgICBzd2l0
Y2ggKHN0eWxlLT5wYWdlU2l6ZVR5cGUoKSkgeworICAgIGNhc2UgUEFHRV9TSVpFX0FVVE86Cisg
ICAgICAgIGJyZWFrOworICAgIGNhc2UgUEFHRV9TSVpFX0FVVE9fTEFORFNDQVBFOgorICAgICAg
ICBpZiAod2lkdGggPCBoZWlnaHQpCisgICAgICAgICAgICBzdGQ6OnN3YXAod2lkdGgsIGhlaWdo
dCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUEFHRV9TSVpFX0FVVE9fUE9SVFJBSVQ6Cisg
ICAgICAgIGlmICh3aWR0aCA+IGhlaWdodCkKKyAgICAgICAgICAgIHN0ZDo6c3dhcCh3aWR0aCwg
aGVpZ2h0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQQUdFX1NJWkVfUkVTT0xWRUQ6IHsK
KyAgICAgICAgTGVuZ3RoU2l6ZSBzaXplID0gc3R5bGUtPnBhZ2VTaXplKCk7CisgICAgICAgIEFT
U0VSVChzaXplLndpZHRoKCkuaXNGaXhlZCgpKTsKKyAgICAgICAgQVNTRVJUKHNpemUuaGVpZ2h0
KCkuaXNGaXhlZCgpKTsKKyAgICAgICAgd2lkdGggPSB2YWx1ZUZvckxlbmd0aChzaXplLndpZHRo
KCksIDAsIHZpZXcpOworICAgICAgICBoZWlnaHQgPSB2YWx1ZUZvckxlbmd0aChzaXplLmhlaWdo
dCgpLCAwLCB2aWV3KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAg
ICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIH0KKyAgICBwYWdlU2l6ZSA9IEludFNpemUo
d2lkdGgsIGhlaWdodCk7CisKKyAgICAvLyBUaGUgcGVyY2VudGFnZSBpcyBjYWxjdWxhdGVkIHdp
dGggcmVzcGVjdCB0byB0aGUgd2lkdGggZXZlbiBmb3IgbWFyZ2luIHRvcCBhbmQgYm90dG9tLgor
ICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIvYm94Lmh0bWwjbWFyZ2luLXByb3BlcnRp
ZXMKKyAgICBtYXJnaW5Ub3AgPSBzdHlsZS0+bWFyZ2luVG9wKCkuaXNBdXRvKCkgPyBtYXJnaW5U
b3AgOiBpbnRWYWx1ZUZvckxlbmd0aChzdHlsZS0+bWFyZ2luVG9wKCksIHdpZHRoLCB2aWV3KTsK
KyAgICBtYXJnaW5SaWdodCA9IHN0eWxlLT5tYXJnaW5SaWdodCgpLmlzQXV0bygpID8gbWFyZ2lu
UmlnaHQgOiBpbnRWYWx1ZUZvckxlbmd0aChzdHlsZS0+bWFyZ2luUmlnaHQoKSwgd2lkdGgsIHZp
ZXcpOworICAgIG1hcmdpbkJvdHRvbSA9IHN0eWxlLT5tYXJnaW5Cb3R0b20oKS5pc0F1dG8oKSA/
IG1hcmdpbkJvdHRvbSA6IGludFZhbHVlRm9yTGVuZ3RoKHN0eWxlLT5tYXJnaW5Cb3R0b20oKSwg
d2lkdGgsIHZpZXcpOworICAgIG1hcmdpbkxlZnQgPSBzdHlsZS0+bWFyZ2luTGVmdCgpLmlzQXV0
bygpID8gbWFyZ2luTGVmdCA6IGludFZhbHVlRm9yTGVuZ3RoKHN0eWxlLT5tYXJnaW5MZWZ0KCks
IHdpZHRoLCB2aWV3KTsKK30KKwordm9pZCBEb2N1bWVudDo6c2V0RG9jdW1lbnRSYXJlRGF0YShO
b2RlUmFyZURhdGEqIHJhcmVEYXRhKQoreworICAgIG1fZG9jdW1lbnRSYXJlRGF0YSA9IHJhcmVE
YXRhOworfQorCit2b2lkIERvY3VtZW50OjpzZXRJc1ZpZXdTb3VyY2UoYm9vbCBpc1ZpZXdTb3Vy
Y2UpCit7CisgICAgbV9pc1ZpZXdTb3VyY2UgPSBpc1ZpZXdTb3VyY2U7CisgICAgaWYgKCFtX2lz
Vmlld1NvdXJjZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgc2V0U2VjdXJpdHlPcmlnaW4oU2Vj
dXJpdHlPcmlnaW46OmNyZWF0ZVVuaXF1ZSgpKTsKKyAgICBkaWRVcGRhdGVTZWN1cml0eU9yaWdp
bigpOworfQorCit2b2lkIERvY3VtZW50Ojpjb21iaW5lQ1NTRmVhdHVyZUZsYWdzKCkKK3sKKyAg
ICAvLyBEZWxheSByZXNldHRpbmcgdGhlIGZsYWdzIHVudGlsIGFmdGVyIG5leHQgc3R5bGUgcmVj
YWxjIHNpbmNlIHVuYXBwbHlpbmcgdGhlIHN0eWxlIG1heSBub3Qgd29yayB3aXRob3V0IHRoZXNl
IHNldCAodGhpcyBpcyB0cnVlIGF0IGxlYXN0IHdpdGggYmVmb3JlL2FmdGVyKS4KKyAgICBtX3Vz
ZXNTaWJsaW5nUnVsZXMgPSBtX3VzZXNTaWJsaW5nUnVsZXMgfHwgbV9zdHlsZVJlc29sdmVyLT51
c2VzU2libGluZ1J1bGVzKCk7CisgICAgbV91c2VzRmlyc3RMaW5lUnVsZXMgPSBtX3VzZXNGaXJz
dExpbmVSdWxlcyB8fCBtX3N0eWxlUmVzb2x2ZXItPnVzZXNGaXJzdExpbmVSdWxlcygpOworICAg
IG1fdXNlc0JlZm9yZUFmdGVyUnVsZXMgPSBtX3VzZXNCZWZvcmVBZnRlclJ1bGVzIHx8IG1fc3R5
bGVSZXNvbHZlci0+dXNlc0JlZm9yZUFmdGVyUnVsZXMoKTsKKyAgICBtX3VzZXNMaW5rUnVsZXMg
PSBtX3VzZXNMaW5rUnVsZXMgfHwgbV9zdHlsZVJlc29sdmVyLT51c2VzTGlua1J1bGVzKCk7Cit9
CisKK3ZvaWQgRG9jdW1lbnQ6OnJlc2V0Q1NTRmVhdHVyZUZsYWdzKCkKK3sKKyAgICBtX3VzZXNT
aWJsaW5nUnVsZXMgPSBtX3N0eWxlUmVzb2x2ZXItPnVzZXNTaWJsaW5nUnVsZXMoKTsKKyAgICBt
X3VzZXNGaXJzdExpbmVSdWxlcyA9IG1fc3R5bGVSZXNvbHZlci0+dXNlc0ZpcnN0TGluZVJ1bGVz
KCk7CisgICAgbV91c2VzQmVmb3JlQWZ0ZXJSdWxlcyA9IG1fc3R5bGVSZXNvbHZlci0+dXNlc0Jl
Zm9yZUFmdGVyUnVsZXMoKTsKKyAgICBtX3VzZXNMaW5rUnVsZXMgPSBtX3N0eWxlUmVzb2x2ZXIt
PnVzZXNMaW5rUnVsZXMoKTsKK30KKwordm9pZCBEb2N1bWVudDo6Y3JlYXRlU3R5bGVSZXNvbHZl
cigpCit7CisgICAgYm9vbCBtYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMgPSB0cnVlOworICAgIGlm
IChTZXR0aW5ncyogZG9jU2V0dGluZ3MgPSBzZXR0aW5ncygpKQorICAgICAgICBtYXRjaEF1dGhv
ckFuZFVzZXJTdHlsZXMgPSBkb2NTZXR0aW5ncy0+YXV0aG9yQW5kVXNlclN0eWxlc0VuYWJsZWQo
KTsKKyAgICBtX3N0eWxlUmVzb2x2ZXIgPSBhZG9wdFB0cihuZXcgU3R5bGVSZXNvbHZlcih0aGlz
LCBtYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpKTsKKyAgICBjb21iaW5lQ1NTRmVhdHVyZUZsYWdz
KCk7Cit9CisKK2lubGluZSB2b2lkIERvY3VtZW50OjpjbGVhclN0eWxlUmVzb2x2ZXIoKQorewor
ICAgIG1fc3R5bGVSZXNvbHZlci5jbGVhcigpOworfQorCit2b2lkIERvY3VtZW50OjphdHRhY2go
KQoreworICAgIEFTU0VSVCghYXR0YWNoZWQoKSk7CisgICAgQVNTRVJUKCFtX2luUGFnZUNhY2hl
KTsKKyAgICBBU1NFUlQoIW1fYXhPYmplY3RDYWNoZSB8fCB0aGlzICE9IHRvcERvY3VtZW50KCkp
OworCisgICAgaWYgKCFtX3JlbmRlckFyZW5hKQorICAgICAgICBtX3JlbmRlckFyZW5hID0gYWRv
cHRQdHIobmV3IFJlbmRlckFyZW5hKTsKKyAgICAKKyAgICAvLyBDcmVhdGUgdGhlIHJlbmRlcmlu
ZyB0cmVlCisgICAgc2V0UmVuZGVyZXIobmV3IChtX3JlbmRlckFyZW5hLmdldCgpKSBSZW5kZXJW
aWV3KHRoaXMsIHZpZXcoKSkpOworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAg
ICByZW5kZXJWaWV3KCktPmRpZE1vdmVPbnNjcmVlbigpOworI2VuZGlmCisKKyAgICByZWNhbGNT
dHlsZShGb3JjZSk7CisKKyAgICBSZW5kZXJPYmplY3QqIHJlbmRlciA9IHJlbmRlcmVyKCk7Cisg
ICAgc2V0UmVuZGVyZXIoMCk7CisKKyAgICBDb250YWluZXJOb2RlOjphdHRhY2goKTsKKworICAg
IHNldFJlbmRlcmVyKHJlbmRlcik7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmRldGFjaCgpCit7Cisg
ICAgQVNTRVJUKGF0dGFjaGVkKCkpOworICAgIEFTU0VSVCghbV9pblBhZ2VDYWNoZSk7CisKKyNp
ZiBFTkFCTEUoUE9JTlRFUl9MT0NLKQorICAgIGlmIChwYWdlKCkpCisgICAgICAgIHBhZ2UoKS0+
cG9pbnRlckxvY2tDb250cm9sbGVyKCktPmRvY3VtZW50RGV0YWNoZWQodGhpcyk7CisjZW5kaWYK
KworICAgIGlmICh0aGlzID09IHRvcERvY3VtZW50KCkpCisgICAgICAgIGNsZWFyQVhPYmplY3RD
YWNoZSgpOworCisgICAgc3RvcEFjdGl2ZURPTU9iamVjdHMoKTsKKyAgICBtX2V2ZW50UXVldWUt
PmNsb3NlKCk7CisjaWYgRU5BQkxFKEZVTExTQ1JFRU5fQVBJKQorICAgIG1fZnVsbFNjcmVlbkNo
YW5nZUV2ZW50VGFyZ2V0UXVldWUuY2xlYXIoKTsKKyAgICBtX2Z1bGxTY3JlZW5FcnJvckV2ZW50
VGFyZ2V0UXVldWUuY2xlYXIoKTsKKyNlbmRpZgorCisjaWYgRU5BQkxFKFJFUVVFU1RfQU5JTUFU
SU9OX0ZSQU1FKQorICAgIC8vIEZJWE1FOiBjb25zaWRlciB1c2luZyBBY3RpdmVET01PYmplY3Qu
CisgICAgaWYgKG1fc2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyKQorICAgICAgICBtX3Njcmlw
dGVkQW5pbWF0aW9uQ29udHJvbGxlci0+Y2xlYXJEb2N1bWVudFBvaW50ZXIoKTsKKyAgICBtX3Nj
cmlwdGVkQW5pbWF0aW9uQ29udHJvbGxlci5jbGVhcigpOworI2VuZGlmCisKKyAgICBSZW5kZXJP
YmplY3QqIHJlbmRlciA9IHJlbmRlcmVyKCk7CisKKyAgICBkb2N1bWVudFdpbGxCZWNvbWVJbmFj
dGl2ZSgpOworCisjaWYgRU5BQkxFKFNIQVJFRF9XT1JLRVJTKQorICAgIFNoYXJlZFdvcmtlclJl
cG9zaXRvcnk6OmRvY3VtZW50RGV0YWNoZWQodGhpcyk7CisjZW5kaWYKKworICAgIGlmIChtX2Zy
YW1lKSB7CisgICAgICAgIEZyYW1lVmlldyogdmlldyA9IG1fZnJhbWUtPnZpZXcoKTsKKyAgICAg
ICAgaWYgKHZpZXcpCisgICAgICAgICAgICB2aWV3LT5kZXRhY2hDdXN0b21TY3JvbGxiYXJzKCk7
CisKKyAgICB9CisKKyAgICAvLyBpbmRpY2F0ZSBkZXN0cnVjdGlvbiBtb2RlLCAgaS5lLiBhdHRh
Y2hlZCgpIGJ1dCByZW5kZXJlciA9PSAwCisgICAgc2V0UmVuZGVyZXIoMCk7CisgICAgCisjaWYg
RU5BQkxFKEZVTExTQ1JFRU5fQVBJKQorICAgIGlmIChtX2Z1bGxTY3JlZW5SZW5kZXJlcikKKyAg
ICAgICAgc2V0RnVsbFNjcmVlblJlbmRlcmVyKDApOworI2VuZGlmCisKKyAgICBtX2hvdmVyTm9k
ZSA9IDA7CisgICAgbV9mb2N1c2VkTm9kZSA9IDA7CisgICAgbV9hY3RpdmVOb2RlID0gMDsKKwor
ICAgIENvbnRhaW5lck5vZGU6OmRldGFjaCgpOworCisgICAgdW5zY2hlZHVsZVN0eWxlUmVjYWxj
KCk7CisKKyAgICBpZiAocmVuZGVyKQorICAgICAgICByZW5kZXItPmRlc3Ryb3koKTsKKworICAg
IC8vIFRoaXMgaXMgcmVxdWlyZWQsIGFzIG91ciBGcmFtZSBtaWdodCBkZWxldGUgaXRzZWxmIGFz
IHNvb24gYXMgaXQgZGV0YWNoZXMKKyAgICAvLyB1cy4gSG93ZXZlciwgdGhpcyB2aW9sYXRlcyBO
b2RlOjpkZXRhY2goKSBzZW1hbnRpY3MsIGFzIGl0J3MgbmV2ZXIKKyAgICAvLyBwb3NzaWJsZSB0
byByZS1hdHRhY2guIEV2ZW50dWFsbHkgRG9jdW1lbnQ6OmRldGFjaCgpIHNob3VsZCBiZSByZW5h
bWVkLAorICAgIC8vIG9yIHRoaXMgc2V0dGluZyBvZiB0aGUgZnJhbWUgdG8gMCBjb3VsZCBiZSBt
YWRlIGV4cGxpY2l0IGluIGVhY2ggb2YgdGhlCisgICAgLy8gY2FsbGVycyBvZiBEb2N1bWVudDo6
ZGV0YWNoKCkuCisgICAgbV9mcmFtZSA9IDA7CisgICAgbV9yZW5kZXJBcmVuYS5jbGVhcigpOwor
fQorCit2b2lkIERvY3VtZW50OjpwcmVwYXJlRm9yRGVzdHJ1Y3Rpb24oKQoreworICAgIGRpc2Nv
bm5lY3REZXNjZW5kYW50RnJhbWVzKCk7CisgICAgaWYgKERPTVdpbmRvdyogd2luZG93ID0gdGhp
cy0+ZG9tV2luZG93KCkpCisgICAgICAgIHdpbmRvdy0+d2lsbERldGFjaERvY3VtZW50RnJvbUZy
YW1lKCk7CisgICAgZGV0YWNoKCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnJlbW92ZUFsbEV2ZW50
TGlzdGVuZXJzKCkKK3sKKyAgICBFdmVudFRhcmdldDo6cmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnMo
KTsKKworICAgIGlmIChET01XaW5kb3cqIGRvbVdpbmRvdyA9IHRoaXMtPmRvbVdpbmRvdygpKQor
ICAgICAgICBkb21XaW5kb3ctPnJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzKCk7CisgICAgZm9yIChO
b2RlKiBub2RlID0gZmlyc3RDaGlsZCgpOyBub2RlOyBub2RlID0gbm9kZS0+dHJhdmVyc2VOZXh0
Tm9kZSgpKQorICAgICAgICBub2RlLT5yZW1vdmVBbGxFdmVudExpc3RlbmVycygpOworfQorCit2
b2lkIERvY3VtZW50OjpzdXNwZW5kQWN0aXZlRE9NT2JqZWN0cyhBY3RpdmVET01PYmplY3Q6OlJl
YXNvbkZvclN1c3BlbnNpb24gd2h5KQoreworICAgIFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQ6OnN1
c3BlbmRBY3RpdmVET01PYmplY3RzKHdoeSk7CisKKyNpZiBFTkFCTEUoREVWSUNFX09SSUVOVEFU
SU9OKQorICAgIGlmICghcGFnZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoRGV2aWNl
TW90aW9uQ29udHJvbGxlciogY29udHJvbGxlciA9IERldmljZU1vdGlvbkNvbnRyb2xsZXI6OmZy
b20ocGFnZSgpKSkKKyAgICAgICAgY29udHJvbGxlci0+c3VzcGVuZEV2ZW50c0ZvckFsbExpc3Rl
bmVycyhkb21XaW5kb3coKSk7CisgICAgaWYgKERldmljZU9yaWVudGF0aW9uQ29udHJvbGxlciog
Y29udHJvbGxlciA9IERldmljZU9yaWVudGF0aW9uQ29udHJvbGxlcjo6ZnJvbShwYWdlKCkpKQor
ICAgICAgICBjb250cm9sbGVyLT5zdXNwZW5kRXZlbnRzRm9yQWxsTGlzdGVuZXJzKGRvbVdpbmRv
dygpKTsKKworI2VuZGlmCit9CisKK3ZvaWQgRG9jdW1lbnQ6OnJlc3VtZUFjdGl2ZURPTU9iamVj
dHMoKQoreworICAgIFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQ6OnJlc3VtZUFjdGl2ZURPTU9iamVj
dHMoKTsKKworI2lmIEVOQUJMRShERVZJQ0VfT1JJRU5UQVRJT04pCisgICAgaWYgKCFwYWdlKCkp
CisgICAgICAgIHJldHVybjsKKworICAgIGlmIChEZXZpY2VNb3Rpb25Db250cm9sbGVyKiBjb250
cm9sbGVyID0gRGV2aWNlTW90aW9uQ29udHJvbGxlcjo6ZnJvbShwYWdlKCkpKQorICAgICAgICBj
b250cm9sbGVyLT5yZXN1bWVFdmVudHNGb3JBbGxMaXN0ZW5lcnMoZG9tV2luZG93KCkpOworICAg
IGlmIChEZXZpY2VPcmllbnRhdGlvbkNvbnRyb2xsZXIqIGNvbnRyb2xsZXIgPSBEZXZpY2VPcmll
bnRhdGlvbkNvbnRyb2xsZXI6OmZyb20ocGFnZSgpKSkKKyAgICAgICAgY29udHJvbGxlci0+cmVz
dW1lRXZlbnRzRm9yQWxsTGlzdGVuZXJzKGRvbVdpbmRvdygpKTsKKyNlbmRpZgorfQorCitSZW5k
ZXJWaWV3KiBEb2N1bWVudDo6cmVuZGVyVmlldygpIGNvbnN0Cit7CisgICAgcmV0dXJuIHRvUmVu
ZGVyVmlldyhyZW5kZXJlcigpKTsKK30KKwordm9pZCBEb2N1bWVudDo6Y2xlYXJBWE9iamVjdENh
Y2hlKCkKK3sKKyAgICAvLyBjbGVhciBjYWNoZSBpbiB0b3AgZG9jdW1lbnQKKyAgICBpZiAobV9h
eE9iamVjdENhY2hlKSB7CisgICAgICAgIC8vIENsZWFyIHRoZSBjYWNoZSBtZW1iZXIgdmFyaWFi
bGUgYmVmb3JlIGNhbGxpbmcgZGVsZXRlIGJlY2F1c2UgYXR0ZW1wdHMKKyAgICAgICAgLy8gYXJl
IG1hZGUgdG8gYWNjZXNzIGl0IGR1cmluZyBkZXN0cnVjdGlvbi4KKyAgICAgICAgQVhPYmplY3RD
YWNoZSogYXhPYmplY3RDYWNoZSA9IG1fYXhPYmplY3RDYWNoZTsKKyAgICAgICAgbV9heE9iamVj
dENhY2hlID0gMDsKKyAgICAgICAgZGVsZXRlIGF4T2JqZWN0Q2FjaGU7CisgICAgICAgIHJldHVy
bjsKKyAgICB9CisgICAgCisgICAgLy8gYXNrIHRoZSB0b3AtbGV2ZWwgZG9jdW1lbnQgdG8gY2xl
YXIgaXRzIGNhY2hlCisgICAgRG9jdW1lbnQqIGRvYyA9IHRvcERvY3VtZW50KCk7CisgICAgaWYg
KGRvYyAhPSB0aGlzKQorICAgICAgICBkb2MtPmNsZWFyQVhPYmplY3RDYWNoZSgpOworfQorCiti
b29sIERvY3VtZW50OjpheE9iamVjdENhY2hlRXhpc3RzKCkgY29uc3QKK3sKKyAgICBpZiAobV9h
eE9iamVjdENhY2hlKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAKKyAgICBEb2N1bWVudCog
ZG9jID0gdG9wRG9jdW1lbnQoKTsKKyAgICBpZiAoZG9jICE9IHRoaXMpCisgICAgICAgIHJldHVy
biBkb2MtPmF4T2JqZWN0Q2FjaGVFeGlzdHMoKTsKKyAgICAKKyAgICByZXR1cm4gZmFsc2U7Cit9
CisgICAgCitBWE9iamVjdENhY2hlKiBEb2N1bWVudDo6YXhPYmplY3RDYWNoZSgpIGNvbnN0Cit7
CisgICAgLy8gVGhlIG9ubHkgZG9jdW1lbnQgdGhhdCBhY3R1YWxseSBoYXMgYSBBWE9iamVjdENh
Y2hlIGlzIHRoZSB0b3AtbGV2ZWwKKyAgICAvLyBkb2N1bWVudC4gIFRoaXMgaXMgYmVjYXVzZSB3
ZSBuZWVkIHRvIGJlIGFibGUgdG8gZ2V0IGZyb20gYW55IFdlYkNvcmVBWE9iamVjdAorICAgIC8v
IHRvIGFueSBvdGhlciBXZWJDb3JlQVhPYmplY3Qgb24gdGhlIHNhbWUgcGFnZS4gIFVzaW5nIGEg
c2luZ2xlIGNhY2hlIGFsbG93cworICAgIC8vIGxvb2t1cHMgYWNyb3NzIG5lc3RlZCB3ZWJhcmVh
cyAoaS5lLiBtdWx0aXBsZSBkb2N1bWVudHMpLgorICAgIAorICAgIGlmIChtX2F4T2JqZWN0Q2Fj
aGUpIHsKKyAgICAgICAgLy8gcmV0dXJuIGFscmVhZHkga25vd24gdG9wLWxldmVsIGNhY2hlCisg
ICAgICAgIGlmICghb3duZXJFbGVtZW50KCkpCisgICAgICAgICAgICByZXR1cm4gbV9heE9iamVj
dENhY2hlOworICAgICAgICAKKyAgICAgICAgLy8gSW4gc29tZSBwYWdlcyB3aXRoIGZyYW1lcywg
dGhlIGNhY2hlIGlzIGNyZWF0ZWQgYmVmb3JlIHRoZSBzdWItd2ViYXJlYSBpcworICAgICAgICAv
LyBpbnNlcnRlZCBpbnRvIHRoZSB0cmVlLiAgSGVyZSwgd2UgY2F0Y2ggdGhhdCBjYXNlIGFuZCBq
dXN0IHRvc3MgdGhlIG9sZAorICAgICAgICAvLyBjYWNoZSBhbmQgc3RhcnQgb3Zlci4KKyAgICAg
ICAgLy8gTk9URTogVGhpcyByZWNvdmVyeSBtYXkgbm8gbG9uZ2VyIGJlIG5lZWRlZC4gSSBoYXZl
IGJlZW4gdW5hYmxlIHRvIHRyaWdnZXIKKyAgICAgICAgLy8gaXQgYWdhaW4uIFNlZSByZGFyOi8v
NTc5NDQ1NAorICAgICAgICAvLyBGSVhNRTogQ2FuIHRoaXMgYmUgZml4ZWQgd2hlbiBpbnNlcnRp
bmcgdGhlIHN1YmZyYW1lIGluc3RlYWQgb2Ygbm93PworICAgICAgICAvLyBGSVhNRTogSWYgdGhp
cyBmdW5jdGlvbiB3YXMgY2FsbGVkIHRvIGdldCB0aGUgY2FjaGUgaW4gb3JkZXIgdG8gcmVtb3Zl
CisgICAgICAgIC8vIGFuIEFYT2JqZWN0LCB3ZSBhcmUgbm93IGRlbGV0aW5nIHRoZSBjYWNoZSBh
cyBhIHdob2xlIGFuZCByZXR1cm5pbmcgYQorICAgICAgICAvLyBuZXcgZW1wdHkgY2FjaGUgdGhh
dCBkb2VzIG5vdCBjb250YWluIHRoZSBBWE9iamVjdCEgVGhhdCBzaG91bGQgYWN0dWFsbHkKKyAg
ICAgICAgLy8gYmUgT0suIEkgYW0gY29uY2VybmVkIGFib3V0IG90aGVyIGNhc2VzIGxpa2UgdGhp
cyB3aGVyZSBhY2Nlc3NpbmcgdGhlCisgICAgICAgIC8vIGNhY2hlIGJsb3dzIGF3YXkgdGhlIEFY
T2JqZWN0IGJlaW5nIG9wZXJhdGVkIG9uLgorICAgICAgICBkZWxldGUgbV9heE9iamVjdENhY2hl
OworICAgICAgICBtX2F4T2JqZWN0Q2FjaGUgPSAwOworICAgIH0KKworICAgIC8vIGFzayB0aGUg
dG9wLWxldmVsIGRvY3VtZW50IGZvciBpdHMgY2FjaGUKKyAgICBEb2N1bWVudCogZG9jID0gdG9w
RG9jdW1lbnQoKTsKKyAgICBpZiAoZG9jICE9IHRoaXMpCisgICAgICAgIHJldHVybiBkb2MtPmF4
T2JqZWN0Q2FjaGUoKTsKKyAgICAKKyAgICAvLyB0aGlzIGlzIHRoZSB0b3AtbGV2ZWwgZG9jdW1l
bnQsIHNvIGluc3RhbGwgYSBuZXcgY2FjaGUKKyAgICBtX2F4T2JqZWN0Q2FjaGUgPSBuZXcgQVhP
YmplY3RDYWNoZSh0aGlzKTsKKyAgICByZXR1cm4gbV9heE9iamVjdENhY2hlOworfQorCit2b2lk
IERvY3VtZW50OjpzZXRWaXN1YWxseU9yZGVyZWQoKQoreworICAgIG1fdmlzdWFsbHlPcmRlcmVk
ID0gdHJ1ZTsKKyAgICBpZiAocmVuZGVyZXIoKSkKKyAgICAgICAgcmVuZGVyZXIoKS0+c3R5bGUo
KS0+c2V0UlRMT3JkZXJpbmcoVmlzdWFsT3JkZXIpOworfQorCitQYXNzUmVmUHRyPERvY3VtZW50
UGFyc2VyPiBEb2N1bWVudDo6Y3JlYXRlUGFyc2VyKCkKK3sKKyAgICAvLyBGSVhNRTogdGhpcyBz
aG91bGQgcHJvYmFibHkgcGFzcyB0aGUgZnJhbWUgaW5zdGVhZAorI2lmIEVOQUJMRShORVdfWE1M
KQorICAgIHJldHVybiBOZXdYTUxEb2N1bWVudFBhcnNlcjo6Y3JlYXRlKHRoaXMpOworI2Vsc2UK
KyAgICByZXR1cm4gWE1MRG9jdW1lbnRQYXJzZXI6OmNyZWF0ZSh0aGlzLCB2aWV3KCkpOworI2Vu
ZGlmCit9CisKK1NjcmlwdGFibGVEb2N1bWVudFBhcnNlciogRG9jdW1lbnQ6OnNjcmlwdGFibGVE
b2N1bWVudFBhcnNlcigpIGNvbnN0Cit7CisgICAgcmV0dXJuIHBhcnNlcigpID8gcGFyc2VyKCkt
PmFzU2NyaXB0YWJsZURvY3VtZW50UGFyc2VyKCkgOiAwOworfQorCit2b2lkIERvY3VtZW50Ojpv
cGVuKERvY3VtZW50KiBvd25lckRvY3VtZW50KQoreworICAgIGlmIChvd25lckRvY3VtZW50KSB7
CisgICAgICAgIHNldFVSTChvd25lckRvY3VtZW50LT51cmwoKSk7CisgICAgICAgIG1fY29va2ll
VVJMID0gb3duZXJEb2N1bWVudC0+Y29va2llVVJMKCk7CisgICAgICAgIHNldFNlY3VyaXR5T3Jp
Z2luKG93bmVyRG9jdW1lbnQtPnNlY3VyaXR5T3JpZ2luKCkpOworICAgIH0KKworICAgIGlmICht
X2ZyYW1lKSB7CisgICAgICAgIGlmIChTY3JpcHRhYmxlRG9jdW1lbnRQYXJzZXIqIHBhcnNlciA9
IHNjcmlwdGFibGVEb2N1bWVudFBhcnNlcigpKSB7CisgICAgICAgICAgICBpZiAocGFyc2VyLT5p
c1BhcnNpbmcoKSkgeworICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBIVE1MNSBkb2Vzbid0IHRl
bGwgdXMgdG8gY2hlY2sgdGhpcywgaXQgbWlnaHQgbm90IGJlIGNvcnJlY3QuCisgICAgICAgICAg
ICAgICAgaWYgKHBhcnNlci0+aXNFeGVjdXRpbmdTY3JpcHQoKSkKKyAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuOworCisgICAgICAgICAgICAgICAgaWYgKCFwYXJzZXItPndhc0NyZWF0ZWRCeVNj
cmlwdCgpICYmIHBhcnNlci0+aGFzSW5zZXJ0aW9uUG9pbnQoKSkKKyAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG1fZnJh
bWUtPmxvYWRlcigpLT5zdGF0ZSgpID09IEZyYW1lU3RhdGVQcm92aXNpb25hbCkKKyAgICAgICAg
ICAgIG1fZnJhbWUtPmxvYWRlcigpLT5zdG9wQWxsTG9hZGVycygpOworICAgIH0KKworICAgIHJl
bW92ZUFsbEV2ZW50TGlzdGVuZXJzKCk7CisgICAgaW1wbGljaXRPcGVuKCk7CisgICAgaWYgKFNj
cmlwdGFibGVEb2N1bWVudFBhcnNlciogcGFyc2VyID0gc2NyaXB0YWJsZURvY3VtZW50UGFyc2Vy
KCkpCisgICAgICAgIHBhcnNlci0+c2V0V2FzQ3JlYXRlZEJ5U2NyaXB0KHRydWUpOworCisgICAg
aWYgKERPTVdpbmRvdyogZG9tV2luZG93ID0gdGhpcy0+ZG9tV2luZG93KCkpCisgICAgICAgIGRv
bVdpbmRvdy0+cmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnMoKTsKKworICAgIGlmIChtX2ZyYW1lKQor
ICAgICAgICBtX2ZyYW1lLT5sb2FkZXIoKS0+ZGlkRXhwbGljaXRPcGVuKCk7Cit9CisKK3ZvaWQg
RG9jdW1lbnQ6OmRldGFjaFBhcnNlcigpCit7CisgICAgaWYgKCFtX3BhcnNlcikKKyAgICAgICAg
cmV0dXJuOworICAgIG1fcGFyc2VyLT5kZXRhY2goKTsKKyAgICBtX3BhcnNlci5jbGVhcigpOwor
fQorCit2b2lkIERvY3VtZW50OjpjYW5jZWxQYXJzaW5nKCkKK3sKKyAgICBpZiAoIW1fcGFyc2Vy
KQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBXZSBoYXZlIHRvIGNsZWFyIHRoZSBwYXJzZXIg
dG8gYXZvaWQgcG9zc2libHkgdHJpZ2dlcmluZworICAgIC8vIHRoZSBvbmxvYWQgaGFuZGxlciB3
aGVuIGNsb3NpbmcgYXMgYSBzaWRlIGVmZmVjdCBvZiBhIGNhbmNlbC1zdHlsZQorICAgIC8vIGNo
YW5nZSwgc3VjaCBhcyBvcGVuaW5nIGEgbmV3IGRvY3VtZW50IG9yIGNsb3NpbmcgdGhlIHdpbmRv
dyB3aGlsZQorICAgIC8vIHN0aWxsIHBhcnNpbmcKKyAgICBkZXRhY2hQYXJzZXIoKTsKKyAgICBl
eHBsaWNpdENsb3NlKCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmltcGxpY2l0T3BlbigpCit7Cisg
ICAgY2FuY2VsUGFyc2luZygpOworCisgICAgcmVtb3ZlQ2hpbGRyZW4oKTsKKworICAgIHNldENv
bXBhdGliaWxpdHlNb2RlKE5vUXVpcmtzTW9kZSk7CisKKyAgICBtX3BhcnNlciA9IGNyZWF0ZVBh
cnNlcigpOworICAgIHNldFBhcnNpbmcodHJ1ZSk7CisgICAgc2V0UmVhZHlTdGF0ZShMb2FkaW5n
KTsKK30KKworSFRNTEVsZW1lbnQqIERvY3VtZW50Ojpib2R5KCkgY29uc3QKK3sKKyAgICBOb2Rl
KiBkZSA9IGRvY3VtZW50RWxlbWVudCgpOworICAgIGlmICghZGUpCisgICAgICAgIHJldHVybiAw
OworICAgIAorICAgIC8vIHRyeSB0byBwcmVmZXIgYSBGUkFNRVNFVCBlbGVtZW50IG92ZXIgQk9E
WQorICAgIE5vZGUqIGJvZHkgPSAwOworICAgIGZvciAoTm9kZSogaSA9IGRlLT5maXJzdENoaWxk
KCk7IGk7IGkgPSBpLT5uZXh0U2libGluZygpKSB7CisgICAgICAgIGlmIChpLT5oYXNUYWdOYW1l
KGZyYW1lc2V0VGFnKSkKKyAgICAgICAgICAgIHJldHVybiB0b0hUTUxFbGVtZW50KGkpOworICAg
ICAgICAKKyAgICAgICAgaWYgKGktPmhhc1RhZ05hbWUoYm9keVRhZykgJiYgIWJvZHkpCisgICAg
ICAgICAgICBib2R5ID0gaTsKKyAgICB9CisgICAgcmV0dXJuIHRvSFRNTEVsZW1lbnQoYm9keSk7
Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnNldEJvZHkoUGFzc1JlZlB0cjxIVE1MRWxlbWVudD4gcHJw
TmV3Qm9keSwgRXhjZXB0aW9uQ29kZSYgZWMpCit7CisgICAgUmVmUHRyPEhUTUxFbGVtZW50PiBu
ZXdCb2R5ID0gcHJwTmV3Qm9keTsKKworICAgIGlmICghbmV3Qm9keSB8fCAhZG9jdW1lbnRFbGVt
ZW50KCkgfHwgIW5ld0JvZHktPmhhc1RhZ05hbWUoYm9keVRhZykpIHsgCisgICAgICAgIGVjID0g
SElFUkFSQ0hZX1JFUVVFU1RfRVJSOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYg
KG5ld0JvZHktPmRvY3VtZW50KCkgJiYgbmV3Qm9keS0+ZG9jdW1lbnQoKSAhPSB0aGlzKSB7Cisg
ICAgICAgIGVjID0gMDsKKyAgICAgICAgUmVmUHRyPE5vZGU+IG5vZGUgPSBpbXBvcnROb2RlKG5l
d0JvZHkuZ2V0KCksIHRydWUsIGVjKTsKKyAgICAgICAgaWYgKGVjKQorICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICAKKyAgICAgICAgbmV3Qm9keSA9IHRvSFRNTEVsZW1lbnQobm9kZS5nZXQo
KSk7CisgICAgfQorCisgICAgSFRNTEVsZW1lbnQqIGIgPSBib2R5KCk7CisgICAgaWYgKCFiKQor
ICAgICAgICBkb2N1bWVudEVsZW1lbnQoKS0+YXBwZW5kQ2hpbGQobmV3Qm9keS5yZWxlYXNlKCks
IGVjKTsKKyAgICBlbHNlCisgICAgICAgIGRvY3VtZW50RWxlbWVudCgpLT5yZXBsYWNlQ2hpbGQo
bmV3Qm9keS5yZWxlYXNlKCksIGIsIGVjKTsKK30KKworSFRNTEhlYWRFbGVtZW50KiBEb2N1bWVu
dDo6aGVhZCgpCit7CisgICAgTm9kZSogZGUgPSBkb2N1bWVudEVsZW1lbnQoKTsKKyAgICBpZiAo
IWRlKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGZvciAoTm9kZSogZSA9IGRlLT5maXJzdENo
aWxkKCk7IGU7IGUgPSBlLT5uZXh0U2libGluZygpKQorICAgICAgICBpZiAoZS0+aGFzVGFnTmFt
ZShoZWFkVGFnKSkKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxIVE1MSGVhZEVsZW1l
bnQqPihlKTsKKworICAgIHJldHVybiAwOworfQorCit2b2lkIERvY3VtZW50OjpjbG9zZSgpCit7
CisgICAgLy8gRklYTUU6IFdlIHNob3VsZCBmb2xsb3cgdGhlIHNwZWNpZmljYXRpb24gbW9yZSBj
bG9zZWx5OgorICAgIC8vICAgICAgICBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFw
cHMvY3VycmVudC13b3JrLyNkb20tZG9jdW1lbnQtY2xvc2UKKworICAgIGlmICghc2NyaXB0YWJs
ZURvY3VtZW50UGFyc2VyKCkgfHwgIXNjcmlwdGFibGVEb2N1bWVudFBhcnNlcigpLT53YXNDcmVh
dGVkQnlTY3JpcHQoKSB8fCAhc2NyaXB0YWJsZURvY3VtZW50UGFyc2VyKCktPmlzUGFyc2luZygp
KQorICAgICAgICByZXR1cm47CisKKyAgICBleHBsaWNpdENsb3NlKCk7Cit9CisKK3ZvaWQgRG9j
dW1lbnQ6OmV4cGxpY2l0Q2xvc2UoKQoreworICAgIGlmIChtX3BhcnNlcikKKyAgICAgICAgbV9w
YXJzZXItPmZpbmlzaCgpOworCisgICAgaWYgKCFtX2ZyYW1lKSB7CisgICAgICAgIC8vIEJlY2F1
c2Ugd2UgaGF2ZSBubyBmcmFtZSwgd2UgZG9uJ3Qga25vdyBpZiBhbGwgbG9hZGluZyBoYXMgY29t
cGxldGVkLAorICAgICAgICAvLyBzbyB3ZSBqdXN0IGNhbGwgaW1wbGljaXRDbG9zZSgpIGltbWVk
aWF0ZWx5LiBGSVhNRTogVGhpcyBtaWdodCBmaXJlCisgICAgICAgIC8vIHRoZSBsb2FkIGV2ZW50
IHByZW1hdHVyZWx5IDxodHRwOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDU2
OD4uCisgICAgICAgIGltcGxpY2l0Q2xvc2UoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwor
ICAgIG1fZnJhbWUtPmxvYWRlcigpLT5jaGVja0NvbXBsZXRlZCgpOworfQorCit2b2lkIERvY3Vt
ZW50OjppbXBsaWNpdENsb3NlKCkKK3sKKyAgICAvLyBJZiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9m
IHJlY2FsY1N0eWxlLCB3ZSBuZWVkIHRvIGRlZmVyIHRoZSBjbG9zZSB1bnRpbCB0aGUgc3R5bGUg
aW5mb3JtYXRpb24gaXMgYWNjdXJhdGUgYW5kIGFsbCBlbGVtZW50cyBhcmUgcmUtYXR0YWNoZWQu
CisgICAgaWYgKG1faW5TdHlsZVJlY2FsYykgeworICAgICAgICBtX2Nsb3NlQWZ0ZXJTdHlsZVJl
Y2FsYyA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIHdhc0xvY2F0
aW9uQ2hhbmdlUGVuZGluZyA9IGZyYW1lKCkgJiYgZnJhbWUoKS0+bmF2aWdhdGlvblNjaGVkdWxl
cigpLT5sb2NhdGlvbkNoYW5nZVBlbmRpbmcoKTsKKyAgICBib29sIGRvbG9hZCA9ICFwYXJzaW5n
KCkgJiYgbV9wYXJzZXIgJiYgIW1fcHJvY2Vzc2luZ0xvYWRFdmVudCAmJiAhd2FzTG9jYXRpb25D
aGFuZ2VQZW5kaW5nOworICAgIAorICAgIGlmICghZG9sb2FkKQorICAgICAgICByZXR1cm47CisK
KyAgICBtX3Byb2Nlc3NpbmdMb2FkRXZlbnQgPSB0cnVlOworCisgICAgU2NyaXB0YWJsZURvY3Vt
ZW50UGFyc2VyKiBwYXJzZXIgPSBzY3JpcHRhYmxlRG9jdW1lbnRQYXJzZXIoKTsKKyAgICBtX3dl
bGxGb3JtZWQgPSBwYXJzZXIgJiYgcGFyc2VyLT53ZWxsRm9ybWVkKCk7CisKKyAgICAvLyBXZSBo
YXZlIHRvIGNsZWFyIHRoZSBwYXJzZXIsIGluIGNhc2Ugc29tZW9uZSBkb2N1bWVudC53cml0ZSgp
cyBmcm9tIHRoZQorICAgIC8vIG9uTG9hZCBldmVudCBoYW5kbGVyLCBhcyBpbiBSYWRhciAzMjA2
NTI0LgorICAgIGRldGFjaFBhcnNlcigpOworCisgICAgLy8gUGFyc2VyIHNob3VsZCBoYXZlIHBp
Y2tlZCB1cCBhbGwgcHJlbG9hZHMgYnkgbm93CisgICAgbV9jYWNoZWRSZXNvdXJjZUxvYWRlci0+
Y2xlYXJQcmVsb2FkcygpOworCisgICAgLy8gRklYTUU6IFdlIGtpY2sgb2ZmIHRoZSBpY29uIGxv
YWRlciB3aGVuIHRoZSBEb2N1bWVudCBpcyBkb25lIHBhcnNpbmcuCisgICAgLy8gVGhlcmUgYXJl
IGVhcmxpZXIgb3Bwb3J0dW5pdGllcyB3ZSBjb3VsZCBzdGFydCBpdDoKKyAgICAvLyAgLVdoZW4g
dGhlIDxoZWFkPiBmaW5pc2hlcyBwYXJzaW5nCisgICAgLy8gIC1XaGVuIGFueSBuZXcgSFRNTExp
bmtFbGVtZW50IGlzIGluc2VydGVkIGludG8gdGhlIGRvY3VtZW50CisgICAgLy8gQnV0IHRob3Nl
IGFkZCBhIGR5bmFtaWMgY29tcG9uZW50IHRvIHRoZSBmYXZpY29uIHRoYXQgaGFzIFVJIAorICAg
IC8vIHJhbWlmaWNhdGlvbnMsIGFuZCB3ZSBuZWVkIHRvIGRlY2lkZSB3aGF0IGlzIHRoZSBSaWdo
dCBUaGluZyBUbyBEbyh0bSkKKyAgICBGcmFtZSogZiA9IGZyYW1lKCk7CisgICAgaWYgKGYpIHsK
KyAgICAgICAgZi0+bG9hZGVyKCktPmljb24oKS0+c3RhcnRMb2FkZXIoKTsKKyAgICAgICAgZi0+
YW5pbWF0aW9uKCktPnJlc3VtZUFuaW1hdGlvbnNGb3JEb2N1bWVudCh0aGlzKTsKKyAgICB9CisK
KyAgICBJbWFnZUxvYWRlcjo6ZGlzcGF0Y2hQZW5kaW5nQmVmb3JlTG9hZEV2ZW50cygpOworICAg
IEltYWdlTG9hZGVyOjpkaXNwYXRjaFBlbmRpbmdMb2FkRXZlbnRzKCk7CisgICAgSW1hZ2VMb2Fk
ZXI6OmRpc3BhdGNoUGVuZGluZ0Vycm9yRXZlbnRzKCk7CisKKyAgICBIVE1MTGlua0VsZW1lbnQ6
OmRpc3BhdGNoUGVuZGluZ0xvYWRFdmVudHMoKTsKKyAgICBIVE1MU3R5bGVFbGVtZW50OjpkaXNw
YXRjaFBlbmRpbmdMb2FkRXZlbnRzKCk7CisKKyNpZiBFTkFCTEUoU1ZHKQorICAgIC8vIFRvIGFs
aWduIHRoZSBIVE1MIGxvYWQgZXZlbnQgYW5kIHRoZSBTVkdMb2FkIGV2ZW50IGZvciB0aGUgb3V0
ZXJtb3N0IDxzdmc+IGVsZW1lbnQsIGZpcmUgaXQgZnJvbQorICAgIC8vIGhlcmUsIGluc3RlYWQg
b2YgZG9pbmcgaXQgZnJvbSBTVkdFbGVtZW50OjpmaW5pc2hlZFBhcnNpbmdDaGlsZHJlbiAoaWYg
ZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZD0iZmFsc2UiLAorICAgIC8vIHdoaWNoIGlzIHRoZSBk
ZWZhdWx0LCBmb3IgPSd0cnVlJyBpdHMgZmlyZWQgYXQgYSBsYXRlciB0aW1lLCBvbmNlIGFsbCBl
eHRlcm5hbCByZXNvdXJjZXMgZmluaXNoZWQgbG9hZGluZykuCisgICAgaWYgKHN2Z0V4dGVuc2lv
bnMoKSkKKyAgICAgICAgYWNjZXNzU1ZHRXh0ZW5zaW9ucygpLT5kaXNwYXRjaFNWR0xvYWRFdmVu
dFRvT3V0ZXJtb3N0U1ZHRWxlbWVudHMoKTsKKyNlbmRpZgorCisgICAgZGlzcGF0Y2hXaW5kb3dM
b2FkRXZlbnQoKTsKKyAgICBlbnF1ZXVlUGFnZXNob3dFdmVudChQYWdlc2hvd0V2ZW50Tm90UGVy
c2lzdGVkKTsKKyAgICBlbnF1ZXVlUG9wc3RhdGVFdmVudChtX3BlbmRpbmdTdGF0ZU9iamVjdCA/
IG1fcGVuZGluZ1N0YXRlT2JqZWN0LnJlbGVhc2UoKSA6IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6
bnVsbFZhbHVlKCkpOworICAgIAorICAgIGlmIChmKQorICAgICAgICBmLT5sb2FkZXIoKS0+aGFu
ZGxlZE9ubG9hZEV2ZW50cygpOworI2lmZGVmIElOU1RSVU1FTlRfTEFZT1VUX1NDSEVEVUxJTkcK
KyAgICBpZiAoIW93bmVyRWxlbWVudCgpKQorICAgICAgICBwcmludGYoIm9ubG9hZCBmaXJlZCBh
dCAlZFxuIiwgZWxhcHNlZFRpbWUoKSk7CisjZW5kaWYKKworICAgIC8vIEFuIGV2ZW50IGhhbmRs
ZXIgbWF5IGhhdmUgcmVtb3ZlZCB0aGUgZnJhbWUKKyAgICBpZiAoIWZyYW1lKCkpIHsKKyAgICAg
ICAgbV9wcm9jZXNzaW5nTG9hZEV2ZW50ID0gZmFsc2U7CisgICAgICAgIHJldHVybjsKKyAgICB9
CisKKyAgICAvLyBNYWtlIHN1cmUgYm90aCB0aGUgaW5pdGlhbCBsYXlvdXQgYW5kIHJlZmxvdyBo
YXBwZW4gYWZ0ZXIgdGhlIG9ubG9hZAorICAgIC8vIGZpcmVzLiBUaGlzIHdpbGwgaW1wcm92ZSBv
bmxvYWQgc2NvcmVzLCBhbmQgb3RoZXIgYnJvd3NlcnMgZG8gaXQuCisgICAgLy8gSWYgdGhleSB3
YW5uYSBjaGVhdCwgd2UgY2FuIHRvby4gLWR3aAorCisgICAgaWYgKGZyYW1lKCktPm5hdmlnYXRp
b25TY2hlZHVsZXIoKS0+bG9jYXRpb25DaGFuZ2VQZW5kaW5nKCkgJiYgZWxhcHNlZFRpbWUoKSA8
IGNMYXlvdXRTY2hlZHVsZVRocmVzaG9sZCkgeworICAgICAgICAvLyBKdXN0IGJhaWwgb3V0LiBC
ZWZvcmUgb3IgZHVyaW5nIHRoZSBvbmxvYWQgd2Ugd2VyZSBzaGlmdGVkIHRvIGFub3RoZXIgcGFn
ZS4KKyAgICAgICAgLy8gVGhlIG9sZCBpLUJlbmNoIHN1aXRlIGRvZXMgdGhpcy4gV2hlbiB0aGlz
IGhhcHBlbnMgZG9uJ3QgYm90aGVyIHBhaW50aW5nIG9yIGxheWluZyBvdXQuICAgICAgICAKKyAg
ICAgICAgbV9wcm9jZXNzaW5nTG9hZEV2ZW50ID0gZmFsc2U7CisgICAgICAgIHZpZXcoKS0+dW5z
Y2hlZHVsZVJlbGF5b3V0KCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmcmFtZSgp
LT5sb2FkZXIoKS0+Y2hlY2tDYWxsSW1wbGljaXRDbG9zZSgpOworICAgIFJlbmRlck9iamVjdCog
cmVuZGVyT2JqZWN0ID0gcmVuZGVyZXIoKTsKKyAgICAKKyAgICAvLyBXZSB1c2VkIHRvIGZvcmNl
IGEgc3luY2hyb25vdXMgZGlzcGxheSBhbmQgZmx1c2ggaGVyZS4gIFRoaXMgcmVhbGx5IGlzbid0
CisgICAgLy8gbmVjZXNzYXJ5IGFuZCBjYW4gaW4gZmFjdCBiZSBhY3RpdmVseSBoYXJtZnVsIGlm
IHBhZ2VzIGFyZSBsb2FkaW5nIGF0IGEgcmF0ZSBvZiA+IDYwZnBzCisgICAgLy8gKGlmIHlvdXIg
cGxhdGZvcm0gaXMgc3luY2luZyBmbHVzaGVzIGFuZCBsaW1pdGluZyB0aGVtIHRvIDYwZnBzKS4K
KyAgICBtX292ZXJNaW5pbXVtTGF5b3V0VGhyZXNob2xkID0gdHJ1ZTsKKyAgICBpZiAoIW93bmVy
RWxlbWVudCgpIHx8IChvd25lckVsZW1lbnQoKS0+cmVuZGVyZXIoKSAmJiAhb3duZXJFbGVtZW50
KCktPnJlbmRlcmVyKCktPm5lZWRzTGF5b3V0KCkpKSB7CisgICAgICAgIHVwZGF0ZVN0eWxlSWZO
ZWVkZWQoKTsKKyAgICAgICAgCisgICAgICAgIC8vIEFsd2F5cyBkbyBhIGxheW91dCBhZnRlciBs
b2FkaW5nIGlmIG5lZWRlZC4KKyAgICAgICAgaWYgKHZpZXcoKSAmJiByZW5kZXJPYmplY3QgJiYg
KCFyZW5kZXJPYmplY3QtPmZpcnN0Q2hpbGQoKSB8fCByZW5kZXJPYmplY3QtPm5lZWRzTGF5b3V0
KCkpKQorICAgICAgICAgICAgdmlldygpLT5sYXlvdXQoKTsKKyAgICB9CisKKyAgICBtX3Byb2Nl
c3NpbmdMb2FkRXZlbnQgPSBmYWxzZTsKKworI2lmIFBMQVRGT1JNKE1BQykgfHwgUExBVEZPUk0o
Q0hST01JVU0pCisgICAgaWYgKGYgJiYgcmVuZGVyT2JqZWN0ICYmIEFYT2JqZWN0Q2FjaGU6OmFj
Y2Vzc2liaWxpdHlFbmFibGVkKCkpIHsKKyAgICAgICAgLy8gVGhlIEFYIGNhY2hlIG1heSBoYXZl
IGJlZW4gY2xlYXJlZCBhdCB0aGlzIHBvaW50LCBidXQgd2UgbmVlZCB0byBtYWtlIHN1cmUgaXQg
Y29udGFpbnMgYW4KKyAgICAgICAgLy8gQVggb2JqZWN0IHRvIHNlbmQgdGhlIG5vdGlmaWNhdGlv
biB0by4gZ2V0T3JDcmVhdGUgd2lsbCBtYWtlIHN1cmUgdGhhdCBhbiB2YWxpZCBBWCBvYmplY3QK
KyAgICAgICAgLy8gZXhpc3RzIGluIHRoZSBjYWNoZSAod2UgaWdub3JlIHRoZSByZXR1cm4gdmFs
dWUgYmVjYXVzZSB3ZSBkb24ndCBuZWVkIGl0IGhlcmUpLiBUaGlzIGlzIAorICAgICAgICAvLyBv
bmx5IHNhZmUgdG8gY2FsbCB3aGVuIGEgbGF5b3V0IGlzIG5vdCBpbiBwcm9ncmVzcywgc28gaXQg
Y2FuIG5vdCBiZSB1c2VkIGluIHBvc3ROb3RpZmljYXRpb24uICAgIAorICAgICAgICBheE9iamVj
dENhY2hlKCktPmdldE9yQ3JlYXRlKHJlbmRlck9iamVjdCk7CisgICAgICAgIGlmICh0aGlzID09
IHRvcERvY3VtZW50KCkpCisgICAgICAgICAgICBheE9iamVjdENhY2hlKCktPnBvc3ROb3RpZmlj
YXRpb24ocmVuZGVyT2JqZWN0LCBBWE9iamVjdENhY2hlOjpBWExvYWRDb21wbGV0ZSwgdHJ1ZSk7
CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8gQVhMb2FkQ29tcGxldGUgY2FuIG9ubHkg
YmUgcG9zdGVkIG9uIHRoZSB0b3AgZG9jdW1lbnQsIHNvIGlmIGl0J3MgYSBkb2N1bWVudAorICAg
ICAgICAgICAgLy8gaW4gYW4gaWZyYW1lIHRoYXQganVzdCBmaW5pc2hlZCBsb2FkaW5nLCBwb3N0
IEFYTGF5b3V0Q29tcGxldGUgaW5zdGVhZC4KKyAgICAgICAgICAgIGF4T2JqZWN0Q2FjaGUoKS0+
cG9zdE5vdGlmaWNhdGlvbihyZW5kZXJPYmplY3QsIEFYT2JqZWN0Q2FjaGU6OkFYTGF5b3V0Q29t
cGxldGUsIHRydWUpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyNpZiBFTkFCTEUoU1ZH
KQorICAgIGlmIChzdmdFeHRlbnNpb25zKCkpCisgICAgICAgIGFjY2Vzc1NWR0V4dGVuc2lvbnMo
KS0+c3RhcnRBbmltYXRpb25zKCk7CisjZW5kaWYKK30KKwordm9pZCBEb2N1bWVudDo6c2V0UGFy
c2luZyhib29sIGIpCit7CisgICAgbV9iUGFyc2luZyA9IGI7CisgICAgaWYgKCFtX2JQYXJzaW5n
ICYmIHZpZXcoKSkKKyAgICAgICAgdmlldygpLT5zY2hlZHVsZVJlbGF5b3V0KCk7CisKKyNpZmRl
ZiBJTlNUUlVNRU5UX0xBWU9VVF9TQ0hFRFVMSU5HCisgICAgaWYgKCFvd25lckVsZW1lbnQoKSAm
JiAhbV9iUGFyc2luZykKKyAgICAgICAgcHJpbnRmKCJQYXJzaW5nIGZpbmlzaGVkIGF0ICVkXG4i
LCBlbGFwc2VkVGltZSgpKTsKKyNlbmRpZgorfQorCitib29sIERvY3VtZW50OjpzaG91bGRTY2hl
ZHVsZUxheW91dCgpCit7CisgICAgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIG9ubHkgYmUgY2FsbGVk
IHdoZW4gRnJhbWVWaWV3IHRoaW5rcyBhIGxheW91dCBpcyBuZWVkZWQuCisgICAgLy8gVGhpcyBl
bmZvcmNlcyBhIGNvdXBsZSBleHRyYSBydWxlcy4KKyAgICAvLworICAgIC8vICAgIChhKSBPbmx5
IHNjaGVkdWxlIGEgbGF5b3V0IG9uY2UgdGhlIHN0eWxlc2hlZXRzIGFyZSBsb2FkZWQuCisgICAg
Ly8gICAgKGIpIE9ubHkgc2NoZWR1bGUgbGF5b3V0IG9uY2Ugd2UgaGF2ZSBhIGJvZHkgZWxlbWVu
dC4KKworICAgIHJldHVybiAoaGF2ZVN0eWxlc2hlZXRzTG9hZGVkKCkgJiYgYm9keSgpKQorICAg
ICAgICB8fCAoZG9jdW1lbnRFbGVtZW50KCkgJiYgIWRvY3VtZW50RWxlbWVudCgpLT5oYXNUYWdO
YW1lKGh0bWxUYWcpKTsKK30KKyAgICAKK2Jvb2wgRG9jdW1lbnQ6OmlzTGF5b3V0VGltZXJBY3Rp
dmUoKQoreworICAgIHJldHVybiB2aWV3KCkgJiYgdmlldygpLT5sYXlvdXRQZW5kaW5nKCkgJiYg
IW1pbmltdW1MYXlvdXREZWxheSgpOworfQorCitpbnQgRG9jdW1lbnQ6Om1pbmltdW1MYXlvdXRE
ZWxheSgpCit7CisgICAgaWYgKG1fb3Zlck1pbmltdW1MYXlvdXRUaHJlc2hvbGQpCisgICAgICAg
IHJldHVybiAwOworICAgIAorICAgIGludCBlbGFwc2VkID0gZWxhcHNlZFRpbWUoKTsKKyAgICBt
X292ZXJNaW5pbXVtTGF5b3V0VGhyZXNob2xkID0gZWxhcHNlZCA+IGNMYXlvdXRTY2hlZHVsZVRo
cmVzaG9sZDsKKyAgICAKKyAgICAvLyBXZSdsbCB3YW50IHRvIHNjaGVkdWxlIHRoZSB0aW1lciB0
byBmaXJlIGF0IHRoZSBtaW5pbXVtIGxheW91dCB0aHJlc2hvbGQuCisgICAgcmV0dXJuIG1heCgw
LCBjTGF5b3V0U2NoZWR1bGVUaHJlc2hvbGQgLSBlbGFwc2VkKTsKK30KKworaW50IERvY3VtZW50
OjplbGFwc2VkVGltZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oKGN1
cnJlbnRUaW1lKCkgLSBtX3N0YXJ0VGltZSkgKiAxMDAwKTsKK30KKwordm9pZCBEb2N1bWVudDo6
d3JpdGUoY29uc3QgU2VnbWVudGVkU3RyaW5nJiB0ZXh0LCBEb2N1bWVudCogb3duZXJEb2N1bWVu
dCkKK3sKKyAgICBOZXN0aW5nTGV2ZWxJbmNyZW1lbnRlciBuZXN0aW5nTGV2ZWxJbmNyZW1lbnRl
cihtX3dyaXRlUmVjdXJzaW9uRGVwdGgpOworCisgICAgbV93cml0ZVJlY3Vyc2lvbklzVG9vRGVl
cCA9IChtX3dyaXRlUmVjdXJzaW9uRGVwdGggPiAxKSAmJiBtX3dyaXRlUmVjdXJzaW9uSXNUb29E
ZWVwOworICAgIG1fd3JpdGVSZWN1cnNpb25Jc1Rvb0RlZXAgPSAobV93cml0ZVJlY3Vyc2lvbkRl
cHRoID4gY01heFdyaXRlUmVjdXJzaW9uRGVwdGgpIHx8IG1fd3JpdGVSZWN1cnNpb25Jc1Rvb0Rl
ZXA7CisKKyAgICBpZiAobV93cml0ZVJlY3Vyc2lvbklzVG9vRGVlcCkKKyAgICAgICByZXR1cm47
CisKKyNpZmRlZiBJTlNUUlVNRU5UX0xBWU9VVF9TQ0hFRFVMSU5HCisgICAgaWYgKCFvd25lckVs
ZW1lbnQoKSkKKyAgICAgICAgcHJpbnRmKCJCZWdpbm5pbmcgYSBkb2N1bWVudC53cml0ZSBhdCAl
ZFxuIiwgZWxhcHNlZFRpbWUoKSk7CisjZW5kaWYKKworICAgIGJvb2wgaGFzSW5zZXJ0aW9uUG9p
bnQgPSBtX3BhcnNlciAmJiBtX3BhcnNlci0+aGFzSW5zZXJ0aW9uUG9pbnQoKTsKKyAgICBpZiAo
IWhhc0luc2VydGlvblBvaW50ICYmIG1faWdub3JlRGVzdHJ1Y3RpdmVXcml0ZUNvdW50KQorICAg
ICAgICByZXR1cm47CisKKyAgICBpZiAoIWhhc0luc2VydGlvblBvaW50KQorICAgICAgICBvcGVu
KG93bmVyRG9jdW1lbnQpOworCisgICAgQVNTRVJUKG1fcGFyc2VyKTsKKyAgICBtX3BhcnNlci0+
aW5zZXJ0KHRleHQpOworCisjaWZkZWYgSU5TVFJVTUVOVF9MQVlPVVRfU0NIRURVTElORworICAg
IGlmICghb3duZXJFbGVtZW50KCkpCisgICAgICAgIHByaW50ZigiRW5kaW5nIGEgZG9jdW1lbnQu
d3JpdGUgYXQgJWRcbiIsIGVsYXBzZWRUaW1lKCkpOworI2VuZGlmICAgIAorfQorCit2b2lkIERv
Y3VtZW50Ojp3cml0ZShjb25zdCBTdHJpbmcmIHRleHQsIERvY3VtZW50KiBvd25lckRvY3VtZW50
KQoreworICAgIHdyaXRlKFNlZ21lbnRlZFN0cmluZyh0ZXh0KSwgb3duZXJEb2N1bWVudCk7Cit9
CisKK3ZvaWQgRG9jdW1lbnQ6OndyaXRlbG4oY29uc3QgU3RyaW5nJiB0ZXh0LCBEb2N1bWVudCog
b3duZXJEb2N1bWVudCkKK3sKKyAgICB3cml0ZSh0ZXh0LCBvd25lckRvY3VtZW50KTsKKyAgICB3
cml0ZSgiXG4iLCBvd25lckRvY3VtZW50KTsKK30KKworY29uc3QgS1VSTCYgRG9jdW1lbnQ6OnZp
cnR1YWxVUkwoKSBjb25zdAoreworICAgIHJldHVybiBtX3VybDsKK30KKworS1VSTCBEb2N1bWVu
dDo6dmlydHVhbENvbXBsZXRlVVJMKGNvbnN0IFN0cmluZyYgdXJsKSBjb25zdAoreworICAgIHJl
dHVybiBjb21wbGV0ZVVSTCh1cmwpOworfQorCitkb3VibGUgRG9jdW1lbnQ6Om1pbmltdW1UaW1l
ckludGVydmFsKCkgY29uc3QKK3sKKyAgICBQYWdlKiBwID0gcGFnZSgpOworICAgIGlmICghcCkK
KyAgICAgICAgcmV0dXJuIFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQ6Om1pbmltdW1UaW1lckludGVy
dmFsKCk7CisgICAgcmV0dXJuIHAtPnNldHRpbmdzKCktPm1pbkRPTVRpbWVySW50ZXJ2YWwoKTsK
K30KKworRXZlbnRUYXJnZXQqIERvY3VtZW50OjplcnJvckV2ZW50VGFyZ2V0KCkKK3sKKyAgICBy
ZXR1cm4gZG9tV2luZG93KCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmxvZ0V4Y2VwdGlvblRvQ29u
c29sZShjb25zdCBTdHJpbmcmIGVycm9yTWVzc2FnZSwgY29uc3QgU3RyaW5nJiBzb3VyY2VVUkws
IGludCBsaW5lTnVtYmVyLCBQYXNzUmVmUHRyPFNjcmlwdENhbGxTdGFjaz4gY2FsbFN0YWNrKQor
eworICAgIGFkZENvbnNvbGVNZXNzYWdlKEpTTWVzc2FnZVNvdXJjZSwgTG9nTWVzc2FnZVR5cGUs
IEVycm9yTWVzc2FnZUxldmVsLCBlcnJvck1lc3NhZ2UsIHNvdXJjZVVSTCwgbGluZU51bWJlciwg
Y2FsbFN0YWNrKTsKK30KKwordm9pZCBEb2N1bWVudDo6c2V0VVJMKGNvbnN0IEtVUkwmIHVybCkK
K3sKKyAgICBjb25zdCBLVVJMJiBuZXdVUkwgPSB1cmwuaXNFbXB0eSgpID8gYmxhbmtVUkwoKSA6
IHVybDsKKyAgICBpZiAobmV3VVJMID09IG1fdXJsKQorICAgICAgICByZXR1cm47CisKKyAgICBt
X3VybCA9IG5ld1VSTDsKKyAgICBtX2RvY3VtZW50VVJJID0gbV91cmwuc3RyaW5nKCk7CisgICAg
dXBkYXRlQmFzZVVSTCgpOworICAgIGNvbnRleHRGZWF0dXJlcygpLT51cmxEaWRDaGFuZ2UodGhp
cyk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnVwZGF0ZUJhc2VVUkwoKQoreworICAgIEtVUkwgb2xk
QmFzZVVSTCA9IG1fYmFzZVVSTDsKKyAgICAvLyBET00gMyBDb3JlOiBXaGVuIHRoZSBEb2N1bWVu
dCBzdXBwb3J0cyB0aGUgZmVhdHVyZSAiSFRNTCIgW0RPTSBMZXZlbCAyIEhUTUxdLCB0aGUgYmFz
ZSBVUkkgaXMgY29tcHV0ZWQgdXNpbmcKKyAgICAvLyBmaXJzdCB0aGUgdmFsdWUgb2YgdGhlIGhy
ZWYgYXR0cmlidXRlIG9mIHRoZSBIVE1MIEJBU0UgZWxlbWVudCBpZiBhbnksIGFuZCB0aGUgdmFs
dWUgb2YgdGhlIGRvY3VtZW50VVJJIGF0dHJpYnV0ZQorICAgIC8vIGZyb20gdGhlIERvY3VtZW50
IGludGVyZmFjZSBvdGhlcndpc2UuCisgICAgaWYgKCFtX2Jhc2VFbGVtZW50VVJMLmlzRW1wdHko
KSkKKyAgICAgICAgbV9iYXNlVVJMID0gbV9iYXNlRWxlbWVudFVSTDsKKyAgICBlbHNlIGlmICgh
bV9iYXNlVVJMT3ZlcnJpZGUuaXNFbXB0eSgpKQorICAgICAgICBtX2Jhc2VVUkwgPSBtX2Jhc2VV
UkxPdmVycmlkZTsKKyAgICBlbHNlIHsKKyAgICAgICAgLy8gVGhlIGRvY3VtZW50VVJJIGF0dHJp
YnV0ZSBpcyByZWFkLW9ubHkgZnJvbSBKYXZhU2NyaXB0LCBidXQgd3JpdGFibGUgZnJvbSBPYmpl
Y3RpdmUgQywgc28gd2UgbmVlZCB0byByZXRhaW4KKyAgICAgICAgLy8gdGhpcyBmYWxsYmFjayBi
ZWhhdmlvci4gV2UgdXNlIGEgbnVsbCBiYXNlIFVSTCwgc2luY2UgdGhlIGRvY3VtZW50VVJJIGF0
dHJpYnV0ZSBpcyBhbiBhcmJpdHJhcnkgc3RyaW5nCisgICAgICAgIC8vIGFuZCBET00gMyBDb3Jl
IGRvZXMgbm90IHNwZWNpZnkgaG93IGl0IHNob3VsZCBiZSByZXNvbHZlZC4KKyAgICAgICAgbV9i
YXNlVVJMID0gS1VSTChLVVJMKCksIGRvY3VtZW50VVJJKCkpOworICAgIH0KKyAgICBzZWxlY3Rv
clF1ZXJ5Q2FjaGUoKS0+aW52YWxpZGF0ZSgpOworCisgICAgaWYgKCFtX2Jhc2VVUkwuaXNWYWxp
ZCgpKQorICAgICAgICBtX2Jhc2VVUkwgPSBLVVJMKCk7CisKKyAgICBpZiAobV9lbGVtU2hlZXQp
IHsKKyAgICAgICAgLy8gRWxlbWVudCBzaGVldCBpcyBzaWxseS4gSXQgbmV2ZXIgY29udGFpbnMg
YW55dGhpbmcuCisgICAgICAgIEFTU0VSVCghbV9lbGVtU2hlZXQtPmNvbnRlbnRzKCktPnJ1bGVD
b3VudCgpKTsKKyAgICAgICAgYm9vbCB1c2VzUmVtVW5pdHMgPSBtX2VsZW1TaGVldC0+Y29udGVu
dHMoKS0+dXNlc1JlbVVuaXRzKCk7CisgICAgICAgIG1fZWxlbVNoZWV0ID0gQ1NTU3R5bGVTaGVl
dDo6Y3JlYXRlSW5saW5lKHRoaXMsIG1fYmFzZVVSTCk7CisgICAgICAgIC8vIEZJWE1FOiBTbyB3
ZSBhcmUgbm90IHJlYWxseSB0aGUgcGFyc2VyLiBUaGUgcmlnaHQgZml4IGlzIHRvIGVsaW1pbmF0
ZSB0aGUgZWxlbWVudCBzaGVldCBjb21wbGV0ZWx5LgorICAgICAgICBtX2VsZW1TaGVldC0+Y29u
dGVudHMoKS0+cGFyc2VyU2V0VXNlc1JlbVVuaXRzKHVzZXNSZW1Vbml0cyk7CisgICAgfQorCisg
ICAgaWYgKCFlcXVhbElnbm9yaW5nRnJhZ21lbnRJZGVudGlmaWVyKG9sZEJhc2VVUkwsIG1fYmFz
ZVVSTCkpIHsKKyAgICAgICAgLy8gQmFzZSBVUkwgY2hhbmdlIGNoYW5nZXMgYW55IHJlbGF0aXZl
IHZpc2l0ZWQgbGlua3MuCisgICAgICAgIC8vIEZJWE1FOiBUaGVyZSBhcmUgb3RoZXIgVVJMcyBp
biB0aGUgdHJlZSB0aGF0IHdvdWxkIG5lZWQgdG8gYmUgcmUtZXZhbHVhdGVkIG9uIGR5bmFtaWMg
YmFzZSBVUkwgY2hhbmdlLiBTdHlsZSBzaG91bGQgYmUgaW52YWxpZGF0ZWQgdG9vLgorICAgICAg
ICBmb3IgKE5vZGUqIG5vZGUgPSBmaXJzdENoaWxkKCk7IG5vZGU7IG5vZGUgPSBub2RlLT50cmF2
ZXJzZU5leHROb2RlKCkpIHsKKyAgICAgICAgICAgIGlmIChub2RlLT5oYXNUYWdOYW1lKGFUYWcp
KQorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEhUTUxBbmNob3JFbGVtZW50Kj4obm9kZSkt
PmludmFsaWRhdGVDYWNoZWRWaXNpdGVkTGlua0hhc2goKTsKKyAgICAgICAgfQorICAgIH0KK30K
Kwordm9pZCBEb2N1bWVudDo6c2V0QmFzZVVSTE92ZXJyaWRlKGNvbnN0IEtVUkwmIHVybCkKK3sK
KyAgICBtX2Jhc2VVUkxPdmVycmlkZSA9IHVybDsKKyAgICB1cGRhdGVCYXNlVVJMKCk7Cit9CisK
K3ZvaWQgRG9jdW1lbnQ6OnByb2Nlc3NCYXNlRWxlbWVudCgpCit7CisgICAgLy8gRmluZCB0aGUg
Zmlyc3QgaHJlZiBhdHRyaWJ1dGUgaW4gYSBiYXNlIGVsZW1lbnQgYW5kIHRoZSBmaXJzdCB0YXJn
ZXQgYXR0cmlidXRlIGluIGEgYmFzZSBlbGVtZW50LgorICAgIGNvbnN0IEF0b21pY1N0cmluZyog
aHJlZiA9IDA7CisgICAgY29uc3QgQXRvbWljU3RyaW5nKiB0YXJnZXQgPSAwOworICAgIGZvciAo
Tm9kZSogbm9kZSA9IGRvY3VtZW50KCktPmZpcnN0Q2hpbGQoKTsgbm9kZSAmJiAoIWhyZWYgfHwg
IXRhcmdldCk7IG5vZGUgPSBub2RlLT50cmF2ZXJzZU5leHROb2RlKCkpIHsKKyAgICAgICAgaWYg
KG5vZGUtPmhhc1RhZ05hbWUoYmFzZVRhZykpIHsKKyAgICAgICAgICAgIGlmICghaHJlZikgewor
ICAgICAgICAgICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyYgdmFsdWUgPSBzdGF0aWNfY2FzdDxF
bGVtZW50Kj4obm9kZSktPmZhc3RHZXRBdHRyaWJ1dGUoaHJlZkF0dHIpOworICAgICAgICAgICAg
ICAgIGlmICghdmFsdWUuaXNOdWxsKCkpCisgICAgICAgICAgICAgICAgICAgIGhyZWYgPSAmdmFs
dWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXRhcmdldCkgeworICAgICAgICAg
ICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyYgdmFsdWUgPSBzdGF0aWNfY2FzdDxFbGVtZW50Kj4o
bm9kZSktPmZhc3RHZXRBdHRyaWJ1dGUodGFyZ2V0QXR0cik7CisgICAgICAgICAgICAgICAgaWYg
KCF2YWx1ZS5pc051bGwoKSkKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gJnZhbHVlOwor
ICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gRklYTUU6IFNpbmNlIHRo
aXMgZG9lc24ndCBzaGFyZSBjb2RlIHdpdGggY29tcGxldGVVUkwgaXQgbWF5IG5vdCBoYW5kbGUg
ZW5jb2RpbmdzIGNvcnJlY3RseS4KKyAgICBLVVJMIGJhc2VFbGVtZW50VVJMOworICAgIGlmICho
cmVmKSB7CisgICAgICAgIFN0cmluZyBzdHJpcHBlZEhyZWYgPSBzdHJpcExlYWRpbmdBbmRUcmFp
bGluZ0hUTUxTcGFjZXMoKmhyZWYpOworICAgICAgICBpZiAoIXN0cmlwcGVkSHJlZi5pc0VtcHR5
KCkpCisgICAgICAgICAgICBiYXNlRWxlbWVudFVSTCA9IEtVUkwodXJsKCksIHN0cmlwcGVkSHJl
Zik7CisgICAgfQorICAgIGlmIChtX2Jhc2VFbGVtZW50VVJMICE9IGJhc2VFbGVtZW50VVJMKSB7
CisgICAgICAgIG1fYmFzZUVsZW1lbnRVUkwgPSBiYXNlRWxlbWVudFVSTDsKKyAgICAgICAgdXBk
YXRlQmFzZVVSTCgpOworICAgIH0KKworICAgIG1fYmFzZVRhcmdldCA9IHRhcmdldCA/ICp0YXJn
ZXQgOiBudWxsQXRvbTsKK30KKworU3RyaW5nIERvY3VtZW50Ojp1c2VyQWdlbnQoY29uc3QgS1VS
TCYgdXJsKSBjb25zdAoreworICAgIHJldHVybiBmcmFtZSgpID8gZnJhbWUoKS0+bG9hZGVyKCkt
PnVzZXJBZ2VudCh1cmwpIDogU3RyaW5nKCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmRpc2FibGVF
dmFsKGNvbnN0IFN0cmluZyYgZXJyb3JNZXNzYWdlKQoreworICAgIGlmICghZnJhbWUoKSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgZnJhbWUoKS0+c2NyaXB0KCktPmRpc2FibGVFdmFsKGVycm9y
TWVzc2FnZSk7Cit9CisKK2Jvb2wgRG9jdW1lbnQ6OmNhbk5hdmlnYXRlKEZyYW1lKiB0YXJnZXRG
cmFtZSkKK3sKKyAgICBpZiAoIW1fZnJhbWUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
IC8vIEZJWE1FOiBXZSBzaG91bGRuJ3QgY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGhvdXQgYSB0YXJn
ZXQgZnJhbWUsIGJ1dAorICAgIC8vIGZhc3QvZm9ybXMvc3VibWl0LXRvLWJsYW5rLW11bHRpcGxl
LXRpbWVzLmh0bWwgZGVwZW5kcyBvbiB0aGlzIGZ1bmN0aW9uCisgICAgLy8gcmV0dXJuaW5nIHRy
dWUgd2hlbiBzdXBwbGllZCB3aXRoIGEgMCB0YXJnZXRGcmFtZS4KKyAgICBpZiAoIXRhcmdldEZy
YW1lKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIEZyYW1lLWJ1c3RpbmcgaXMgZ2Vu
ZXJhbGx5IGFsbG93ZWQgKHVubGVzcyB3ZSdyZSBzYW5kYm94ZWQgYW5kIHByZXZlbnQgZnJvbSBm
cmFtZS1idXN0aW5nKS4KKyAgICBpZiAoIWlzU2FuZGJveGVkKFNhbmRib3hUb3BOYXZpZ2F0aW9u
KSAmJiB0YXJnZXRGcmFtZSA9PSBtX2ZyYW1lLT50cmVlKCktPnRvcCgpKQorICAgICAgICByZXR1
cm4gdHJ1ZTsKKworICAgIGlmIChpc1NhbmRib3hlZChTYW5kYm94TmF2aWdhdGlvbikpIHsKKyAg
ICAgICAgaWYgKHRhcmdldEZyYW1lLT50cmVlKCktPmlzRGVzY2VuZGFudE9mKG1fZnJhbWUpKQor
ICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgcHJpbnROYXZpZ2F0aW9uRXJyb3JN
ZXNzYWdlKHRhcmdldEZyYW1lLCB1cmwoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9
CisKKyAgICAvLyBUaGlzIGlzIHRoZSBub3JtYWwgY2FzZS4gQSBkb2N1bWVudCBjYW4gbmF2aWdh
dGUgaXRzIGRlY2VuZGFudCBmcmFtZXMsCisgICAgLy8gb3IsIG1vcmUgZ2VuZXJhbGx5LCBhIGRv
Y3VtZW50IGNhbiBuYXZpZ2F0ZSBhIGZyYW1lIGlmIHRoZSBkb2N1bWVudCBpcworICAgIC8vIGlu
IHRoZSBzYW1lIG9yaWdpbiBhcyBhbnkgb2YgdGhhdCBmcmFtZSdzIGFuY2VzdG9ycyAoaW4gdGhl
IGZyYW1lCisgICAgLy8gaGllcmFyY2h5KS4KKyAgICAvLworICAgIC8vIFNlZSBodHRwOi8vd3d3
LmFkYW1iYXJ0aC5jb20vcGFwZXJzLzIwMDgvYmFydGgtamFja3Nvbi1taXRjaGVsbC5wZGYgZm9y
CisgICAgLy8gaGlzdG9yaWNhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHNlY3VyaXR5IGNoZWNr
LgorICAgIGlmIChjYW5BY2Nlc3NBbmNlc3RvcihzZWN1cml0eU9yaWdpbigpLCB0YXJnZXRGcmFt
ZSkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gVG9wLWxldmVsIGZyYW1lcyBhcmUg
ZWFzaWVyIHRvIG5hdmlnYXRlIHRoYW4gb3RoZXIgZnJhbWVzIGJlY2F1c2UgdGhleQorICAgIC8v
IGRpc3BsYXkgdGhlaXIgVVJMcyBpbiB0aGUgYWRkcmVzcyBiYXIgKGluIG1vc3QgYnJvd3NlcnMp
LiBIb3dldmVyLCB0aGVyZQorICAgIC8vIGFyZSBzdGlsbCBzb21lIHJlc3RyaWN0aW9ucyBvbiBu
YXZpZ2F0aW9uIHRvIGF2b2lkIG51aXNhbmNlIGF0dGFja3MuCisgICAgLy8gU3BlY2lmaWNhbGx5
LCBhIGRvY3VtZW50IGNhbiBuYXZpZ2F0ZSBhIHRvcC1sZXZlbCBmcmFtZSBpZiB0aGF0IGZyYW1l
CisgICAgLy8gb3BlbmVkIHRoZSBkb2N1bWVudCBvciBpZiB0aGUgZG9jdW1lbnQgaXMgdGhlIHNh
bWUtb3JpZ2luIHdpdGggYW55IG9mCisgICAgLy8gdGhlIHRvcC1sZXZlbCBmcmFtZSdzIG9wZW5l
cidzIGFuY2VzdG9ycyAoaW4gdGhlIGZyYW1lIGhpZXJhcmNoeSkuCisgICAgLy8KKyAgICAvLyBJ
biBib3RoIG9mIHRoZXNlIGNhc2VzLCB0aGUgZG9jdW1lbnQgcGVyZm9ybWluZyB0aGUgbmF2aWdh
dGlvbiBpcyBpbgorICAgIC8vIHNvbWUgd2F5IHJlbGF0ZWQgdG8gdGhlIGZyYW1lIGJlaW5nIG5h
dmlnYXRlIChlLmcuLCBieSB0aGUgIm9wZW5lciIKKyAgICAvLyBhbmQvb3IgInBhcmVudCIgcmVs
YXRpb24pLiBSZXF1aXJpbmcgc29tZSBzb3J0IG9mIHJlbGF0aW9uIHByZXZlbnRzIGEKKyAgICAv
LyBkb2N1bWVudCBmcm9tIG5hdmlnYXRpbmcgYXJiaXRyYXJ5LCB1bnJlbGF0ZWQgdG9wLWxldmVs
IGZyYW1lcy4KKyAgICBpZiAoIXRhcmdldEZyYW1lLT50cmVlKCktPnBhcmVudCgpKSB7CisgICAg
ICAgIGlmICh0YXJnZXRGcmFtZSA9PSBtX2ZyYW1lLT5sb2FkZXIoKS0+b3BlbmVyKCkpCisgICAg
ICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICBpZiAoY2FuQWNjZXNzQW5jZXN0b3Ioc2Vj
dXJpdHlPcmlnaW4oKSwgdGFyZ2V0RnJhbWUtPmxvYWRlcigpLT5vcGVuZXIoKSkpCisgICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcmludE5hdmlnYXRpb25FcnJvck1lc3Nh
Z2UodGFyZ2V0RnJhbWUsIHVybCgpKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK0ZyYW1lKiBE
b2N1bWVudDo6ZmluZFVuc2FmZVBhcmVudFNjcm9sbFByb3BhZ2F0aW9uQm91bmRhcnkoKQorewor
ICAgIEZyYW1lKiBjdXJyZW50RnJhbWUgPSBtX2ZyYW1lOworICAgIEZyYW1lKiBhbmNlc3RvckZy
YW1lID0gY3VycmVudEZyYW1lLT50cmVlKCktPnBhcmVudCgpOyAKKworICAgIHdoaWxlIChhbmNl
c3RvckZyYW1lKSB7CisgICAgICAgIGlmICghYW5jZXN0b3JGcmFtZS0+ZG9jdW1lbnQoKS0+c2Vj
dXJpdHlPcmlnaW4oKS0+Y2FuQWNjZXNzKHNlY3VyaXR5T3JpZ2luKCkpKQorICAgICAgICAgICAg
cmV0dXJuIGN1cnJlbnRGcmFtZTsKKyAgICAgICAgY3VycmVudEZyYW1lID0gYW5jZXN0b3JGcmFt
ZTsKKyAgICAgICAgYW5jZXN0b3JGcmFtZSA9IGFuY2VzdG9yRnJhbWUtPnRyZWUoKS0+cGFyZW50
KCk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitDU1NTdHlsZVNoZWV0KiBEb2N1bWVudDo6
cGFnZVVzZXJTaGVldCgpCit7CisgICAgaWYgKG1fcGFnZVVzZXJTaGVldCkKKyAgICAgICAgcmV0
dXJuIG1fcGFnZVVzZXJTaGVldC5nZXQoKTsKKyAgICAKKyAgICBQYWdlKiBvd25pbmdQYWdlID0g
cGFnZSgpOworICAgIGlmICghb3duaW5nUGFnZSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgCisg
ICAgU3RyaW5nIHVzZXJTaGVldFRleHQgPSBvd25pbmdQYWdlLT51c2VyU3R5bGVTaGVldCgpOwor
ICAgIGlmICh1c2VyU2hlZXRUZXh0LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAg
CisgICAgLy8gUGFyc2UgdGhlIHNoZWV0IGFuZCBjYWNoZSBpdC4KKyAgICBtX3BhZ2VVc2VyU2hl
ZXQgPSBDU1NTdHlsZVNoZWV0OjpjcmVhdGVJbmxpbmUodGhpcywgc2V0dGluZ3MoKS0+dXNlclN0
eWxlU2hlZXRMb2NhdGlvbigpKTsKKyAgICBtX3BhZ2VVc2VyU2hlZXQtPmNvbnRlbnRzKCktPnNl
dElzVXNlclN0eWxlU2hlZXQodHJ1ZSk7CisgICAgbV9wYWdlVXNlclNoZWV0LT5jb250ZW50cygp
LT5wYXJzZVN0cmluZyh1c2VyU2hlZXRUZXh0KTsKKyAgICByZXR1cm4gbV9wYWdlVXNlclNoZWV0
LmdldCgpOworfQorCit2b2lkIERvY3VtZW50OjpjbGVhclBhZ2VVc2VyU2hlZXQoKQoreworICAg
IGlmIChtX3BhZ2VVc2VyU2hlZXQpIHsKKyAgICAgICAgbV9wYWdlVXNlclNoZWV0ID0gMDsKKyAg
ICAgICAgc3R5bGVSZXNvbHZlckNoYW5nZWQoRGVmZXJSZWNhbGNTdHlsZSk7CisgICAgfQorfQor
Cit2b2lkIERvY3VtZW50Ojp1cGRhdGVQYWdlVXNlclNoZWV0KCkKK3sKKyAgICBjbGVhclBhZ2VV
c2VyU2hlZXQoKTsKKyAgICBpZiAocGFnZVVzZXJTaGVldCgpKQorICAgICAgICBzdHlsZVJlc29s
dmVyQ2hhbmdlZChSZWNhbGNTdHlsZUltbWVkaWF0ZWx5KTsKK30KKworY29uc3QgVmVjdG9yPFJl
ZlB0cjxDU1NTdHlsZVNoZWV0PiA+KiBEb2N1bWVudDo6cGFnZUdyb3VwVXNlclNoZWV0cygpIGNv
bnN0Cit7CisgICAgaWYgKG1fcGFnZUdyb3VwVXNlclNoZWV0Q2FjaGVWYWxpZCkKKyAgICAgICAg
cmV0dXJuIG1fcGFnZUdyb3VwVXNlclNoZWV0cy5nZXQoKTsKKyAgICAKKyAgICBtX3BhZ2VHcm91
cFVzZXJTaGVldENhY2hlVmFsaWQgPSB0cnVlOworICAgIAorICAgIFBhZ2UqIG93bmluZ1BhZ2Ug
PSBwYWdlKCk7CisgICAgaWYgKCFvd25pbmdQYWdlKQorICAgICAgICByZXR1cm4gMDsKKyAgICAg
ICAgCisgICAgY29uc3QgUGFnZUdyb3VwJiBwYWdlR3JvdXAgPSBvd25pbmdQYWdlLT5ncm91cCgp
OworICAgIGNvbnN0IFVzZXJTdHlsZVNoZWV0TWFwKiBzaGVldHNNYXAgPSBwYWdlR3JvdXAudXNl
clN0eWxlU2hlZXRzKCk7CisgICAgaWYgKCFzaGVldHNNYXApCisgICAgICAgIHJldHVybiAwOwor
CisgICAgVXNlclN0eWxlU2hlZXRNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IHNoZWV0c01hcC0+
ZW5kKCk7CisgICAgZm9yIChVc2VyU3R5bGVTaGVldE1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBz
aGVldHNNYXAtPmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBjb25zdCBVc2Vy
U3R5bGVTaGVldFZlY3Rvciogc2hlZXRzID0gaXQtPnNlY29uZC5nZXQoKTsKKyAgICAgICAgZm9y
ICh1bnNpZ25lZCBpID0gMDsgaSA8IHNoZWV0cy0+c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAg
IGNvbnN0IFVzZXJTdHlsZVNoZWV0KiBzaGVldCA9IHNoZWV0cy0+YXQoaSkuZ2V0KCk7CisgICAg
ICAgICAgICBpZiAoc2hlZXQtPmluamVjdGVkRnJhbWVzKCkgPT0gSW5qZWN0SW5Ub3BGcmFtZU9u
bHkgJiYgb3duZXJFbGVtZW50KCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
ICAgICBpZiAoIVVzZXJDb250ZW50VVJMUGF0dGVybjo6bWF0Y2hlc1BhdHRlcm5zKHVybCgpLCBz
aGVldC0+d2hpdGVsaXN0KCksIHNoZWV0LT5ibGFja2xpc3QoKSkpCisgICAgICAgICAgICAgICAg
Y29udGludWU7CisgICAgICAgICAgICBSZWZQdHI8Q1NTU3R5bGVTaGVldD4gZ3JvdXBTaGVldCA9
IENTU1N0eWxlU2hlZXQ6OmNyZWF0ZUlubGluZShjb25zdF9jYXN0PERvY3VtZW50Kj4odGhpcyks
IHNoZWV0LT51cmwoKSk7CisgICAgICAgICAgICBpZiAoIW1fcGFnZUdyb3VwVXNlclNoZWV0cykK
KyAgICAgICAgICAgICAgICBtX3BhZ2VHcm91cFVzZXJTaGVldHMgPSBhZG9wdFB0cihuZXcgVmVj
dG9yPFJlZlB0cjxDU1NTdHlsZVNoZWV0PiA+KTsKKyAgICAgICAgICAgIG1fcGFnZUdyb3VwVXNl
clNoZWV0cy0+YXBwZW5kKGdyb3VwU2hlZXQpOworICAgICAgICAgICAgZ3JvdXBTaGVldC0+Y29u
dGVudHMoKS0+c2V0SXNVc2VyU3R5bGVTaGVldChzaGVldC0+bGV2ZWwoKSA9PSBVc2VyU3R5bGVV
c2VyTGV2ZWwpOworICAgICAgICAgICAgZ3JvdXBTaGVldC0+Y29udGVudHMoKS0+cGFyc2VTdHJp
bmcoc2hlZXQtPnNvdXJjZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBtX3Bh
Z2VHcm91cFVzZXJTaGVldHMuZ2V0KCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmNsZWFyUGFnZUdy
b3VwVXNlclNoZWV0cygpCit7CisgICAgbV9wYWdlR3JvdXBVc2VyU2hlZXRDYWNoZVZhbGlkID0g
ZmFsc2U7CisgICAgaWYgKG1fcGFnZUdyb3VwVXNlclNoZWV0cyAmJiBtX3BhZ2VHcm91cFVzZXJT
aGVldHMtPnNpemUoKSkgeworICAgICAgICBtX3BhZ2VHcm91cFVzZXJTaGVldHMtPmNsZWFyKCk7
CisgICAgICAgIHN0eWxlUmVzb2x2ZXJDaGFuZ2VkKERlZmVyUmVjYWxjU3R5bGUpOworICAgIH0K
K30KKwordm9pZCBEb2N1bWVudDo6dXBkYXRlUGFnZUdyb3VwVXNlclNoZWV0cygpCit7CisgICAg
Y2xlYXJQYWdlR3JvdXBVc2VyU2hlZXRzKCk7CisgICAgaWYgKHBhZ2VHcm91cFVzZXJTaGVldHMo
KSAmJiBwYWdlR3JvdXBVc2VyU2hlZXRzKCktPnNpemUoKSkKKyAgICAgICAgc3R5bGVSZXNvbHZl
ckNoYW5nZWQoUmVjYWxjU3R5bGVJbW1lZGlhdGVseSk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmFk
ZFVzZXJTaGVldChQYXNzUmVmUHRyPFN0eWxlU2hlZXRDb250ZW50cz4gdXNlclNoZWV0KQorewor
ICAgIGlmICghbV91c2VyU2hlZXRzKQorICAgICAgICBtX3VzZXJTaGVldHMgPSBhZG9wdFB0cihu
ZXcgVmVjdG9yPFJlZlB0cjxDU1NTdHlsZVNoZWV0PiA+KTsKKyAgICBtX3VzZXJTaGVldHMtPmFw
cGVuZChDU1NTdHlsZVNoZWV0OjpjcmVhdGUodXNlclNoZWV0LCB0aGlzKSk7CisgICAgc3R5bGVS
ZXNvbHZlckNoYW5nZWQoUmVjYWxjU3R5bGVJbW1lZGlhdGVseSk7Cit9CisKK3ZvaWQgRG9jdW1l
bnQ6OnNlYW1sZXNzUGFyZW50VXBkYXRlZFN0eWxlc2hlZXRzKCkKK3sKKyAgICBzdHlsZVJlc29s
dmVyQ2hhbmdlZChSZWNhbGNTdHlsZUltbWVkaWF0ZWx5KTsKK30KKworQ1NTU3R5bGVTaGVldCog
RG9jdW1lbnQ6OmVsZW1lbnRTaGVldCgpCit7CisgICAgaWYgKCFtX2VsZW1TaGVldCkKKyAgICAg
ICAgbV9lbGVtU2hlZXQgPSBDU1NTdHlsZVNoZWV0OjpjcmVhdGVJbmxpbmUodGhpcywgbV9iYXNl
VVJMKTsKKyAgICByZXR1cm4gbV9lbGVtU2hlZXQuZ2V0KCk7Cit9CisKK2ludCBEb2N1bWVudDo6
bm9kZUFic0luZGV4KE5vZGUgKm5vZGUpCit7CisgICAgQVNTRVJUKG5vZGUtPmRvY3VtZW50KCkg
PT0gdGhpcyk7CisKKyAgICBpbnQgYWJzSW5kZXggPSAwOworICAgIGZvciAoTm9kZSogbiA9IG5v
ZGU7IG4gJiYgbiAhPSB0aGlzOyBuID0gbi0+dHJhdmVyc2VQcmV2aW91c05vZGUoKSkKKyAgICAg
ICAgYWJzSW5kZXgrKzsKKyAgICByZXR1cm4gYWJzSW5kZXg7Cit9CisKK05vZGUqIERvY3VtZW50
Ojpub2RlV2l0aEFic0luZGV4KGludCBhYnNJbmRleCkKK3sKKyAgICBOb2RlKiBuID0gdGhpczsK
KyAgICBmb3IgKGludCBpID0gMDsgbiAmJiAoaSA8IGFic0luZGV4KTsgaSsrKQorICAgICAgICBu
ID0gbi0+dHJhdmVyc2VOZXh0Tm9kZSgpOworICAgIHJldHVybiBuOworfQorCit2b2lkIERvY3Vt
ZW50Ojpwcm9jZXNzSHR0cEVxdWl2KGNvbnN0IFN0cmluZyYgZXF1aXYsIGNvbnN0IFN0cmluZyYg
Y29udGVudCkKK3sKKyAgICBBU1NFUlQoIWVxdWl2LmlzTnVsbCgpICYmICFjb250ZW50LmlzTnVs
bCgpKTsKKworICAgIEZyYW1lKiBmcmFtZSA9IHRoaXMtPmZyYW1lKCk7CisKKyAgICBpZiAoZXF1
YWxJZ25vcmluZ0Nhc2UoZXF1aXYsICJkZWZhdWx0LXN0eWxlIikpIHsKKyAgICAgICAgLy8gVGhl
IHByZWZlcnJlZCBzdHlsZSBzZXQgaGFzIGJlZW4gb3ZlcnJpZGRlbiBhcyBwZXIgc2VjdGlvbiAK
KyAgICAgICAgLy8gMTQuMy4yIG9mIHRoZSBIVE1MNC4wIHNwZWNpZmljYXRpb24uICBXZSBuZWVk
IHRvIHVwZGF0ZSB0aGUKKyAgICAgICAgLy8gc2hlZXQgdXNlZCB2YXJpYWJsZSBhbmQgdGhlbiB1
cGRhdGUgb3VyIHN0eWxlIHNlbGVjdG9yLiAKKyAgICAgICAgLy8gRm9yIG1vcmUgaW5mbywgc2Vl
IHRoZSB0ZXN0IGF0OgorICAgICAgICAvLyBodHRwOi8vd3d3LmhpeGllLmNoL3Rlc3RzL2V2aWwv
Y3NzL2ltcG9ydC9tYWluL3ByZWZlcnJlZC5odG1sCisgICAgICAgIC8vIC1kd2gKKyAgICAgICAg
bV9zZWxlY3RlZFN0eWxlc2hlZXRTZXQgPSBjb250ZW50OworICAgICAgICBtX3ByZWZlcnJlZFN0
eWxlc2hlZXRTZXQgPSBjb250ZW50OworICAgICAgICBzdHlsZVJlc29sdmVyQ2hhbmdlZChEZWZl
clJlY2FsY1N0eWxlKTsKKyAgICB9IGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGVxdWl2LCAi
cmVmcmVzaCIpKSB7CisgICAgICAgIGRvdWJsZSBkZWxheTsKKyAgICAgICAgU3RyaW5nIHVybDsK
KyAgICAgICAgaWYgKGZyYW1lICYmIHBhcnNlSFRUUFJlZnJlc2goY29udGVudCwgdHJ1ZSwgZGVs
YXksIHVybCkpIHsKKyAgICAgICAgICAgIGlmICh1cmwuaXNFbXB0eSgpKQorICAgICAgICAgICAg
ICAgIHVybCA9IG1fdXJsLnN0cmluZygpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAg
ICAgIHVybCA9IGNvbXBsZXRlVVJMKHVybCkuc3RyaW5nKCk7CisgICAgICAgICAgICBmcmFtZS0+
bmF2aWdhdGlvblNjaGVkdWxlcigpLT5zY2hlZHVsZVJlZGlyZWN0KGRlbGF5LCB1cmwpOworICAg
ICAgICB9CisgICAgfSBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZShlcXVpdiwgInNldC1jb29r
aWUiKSkgeworICAgICAgICAvLyBGSVhNRTogbWFrZSBzZXRDb29raWUgd29yayBvbiBYTUwgZG9j
dW1lbnRzIHRvbzsgZS5nLiBpbiBjYXNlIG9mIDxodG1sOm1ldGEgLi4uLi4+CisgICAgICAgIGlm
IChpc0hUTUxEb2N1bWVudCgpKSB7CisgICAgICAgICAgICBFeGNlcHRpb25Db2RlIGVjOyAvLyBF
eGNlcHRpb24gKGZvciBzYW5kYm94ZWQgZG9jdW1lbnRzKSBpZ25vcmVkLgorICAgICAgICAgICAg
c3RhdGljX2Nhc3Q8SFRNTERvY3VtZW50Kj4odGhpcyktPnNldENvb2tpZShjb250ZW50LCBlYyk7
CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGVxdWl2LCAiY29u
dGVudC1sYW5ndWFnZSIpKQorICAgICAgICBzZXRDb250ZW50TGFuZ3VhZ2UoY29udGVudCk7Cisg
ICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoZXF1aXYsICJ4LWRucy1wcmVmZXRjaC1jb250
cm9sIikpCisgICAgICAgIHBhcnNlRE5TUHJlZmV0Y2hDb250cm9sSGVhZGVyKGNvbnRlbnQpOwor
ICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGVxdWl2LCAieC1mcmFtZS1vcHRpb25zIikp
IHsKKyAgICAgICAgaWYgKGZyYW1lKSB7CisgICAgICAgICAgICBGcmFtZUxvYWRlciogZnJhbWVM
b2FkZXIgPSBmcmFtZS0+bG9hZGVyKCk7CisgICAgICAgICAgICBpZiAoZnJhbWVMb2FkZXItPnNo
b3VsZEludGVycnVwdExvYWRGb3JYRnJhbWVPcHRpb25zKGNvbnRlbnQsIHVybCgpKSkgeworICAg
ICAgICAgICAgICAgIGZyYW1lTG9hZGVyLT5zdG9wQWxsTG9hZGVycygpOworICAgICAgICAgICAg
ICAgIGZyYW1lLT5uYXZpZ2F0aW9uU2NoZWR1bGVyKCktPnNjaGVkdWxlTG9jYXRpb25DaGFuZ2Uo
c2VjdXJpdHlPcmlnaW4oKSwgYmxhbmtVUkwoKSwgU3RyaW5nKCkpOworCisgICAgICAgICAgICAg
ICAgREVGSU5FX1NUQVRJQ19MT0NBTChTdHJpbmcsIGNvbnNvbGVNZXNzYWdlLCAoQVNDSUlMaXRl
cmFsKCJSZWZ1c2VkIHRvIGRpc3BsYXkgZG9jdW1lbnQgYmVjYXVzZSBkaXNwbGF5IGZvcmJpZGRl
biBieSBYLUZyYW1lLU9wdGlvbnMuXG4iKSkpOworICAgICAgICAgICAgICAgIGFkZENvbnNvbGVN
ZXNzYWdlKEpTTWVzc2FnZVNvdXJjZSwgTG9nTWVzc2FnZVR5cGUsIEVycm9yTWVzc2FnZUxldmVs
LCBjb25zb2xlTWVzc2FnZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2Ug
aWYgKGVxdWFsSWdub3JpbmdDYXNlKGVxdWl2LCAieC13ZWJraXQtY3NwIikpCisgICAgICAgIGNv
bnRlbnRTZWN1cml0eVBvbGljeSgpLT5kaWRSZWNlaXZlSGVhZGVyKGNvbnRlbnQsIENvbnRlbnRT
ZWN1cml0eVBvbGljeTo6RW5mb3JjZVBvbGljeSk7CisgICAgZWxzZSBpZiAoZXF1YWxJZ25vcmlu
Z0Nhc2UoZXF1aXYsICJ4LXdlYmtpdC1jc3AtcmVwb3J0LW9ubHkiKSkKKyAgICAgICAgY29udGVu
dFNlY3VyaXR5UG9saWN5KCktPmRpZFJlY2VpdmVIZWFkZXIoY29udGVudCwgQ29udGVudFNlY3Vy
aXR5UG9saWN5OjpSZXBvcnRPbmx5KTsKK30KKworLy8gVGhvdWdoIGlzc3BhY2UoKSBjb25zaWRl
cnMgXHQgYW5kIFx2IHRvIGJlIHdoaXRlc3BhY2UsIFdpbiBJRSBkb2Vzbid0Lgorc3RhdGljIGJv
b2wgaXNTZXBhcmF0b3IoVUNoYXIgYykKK3sKKyAgICByZXR1cm4gYyA9PSAnICcgfHwgYyA9PSAn
XHQnIHx8IGMgPT0gJ1xuJyB8fCBjID09ICdccicgfHwgYyA9PSAnPScgfHwgYyA9PSAnLCcgfHwg
YyA9PSAnXDAnOworfQorCit2b2lkIERvY3VtZW50Ojpwcm9jZXNzQXJndW1lbnRzKGNvbnN0IFN0
cmluZyYgZmVhdHVyZXMsIHZvaWQqIGRhdGEsIEFyZ3VtZW50c0NhbGxiYWNrIGNhbGxiYWNrKQor
eworICAgIC8vIFRyZWFkIGxpZ2h0bHkgaW4gdGhpcyBjb2RlIC0tIGl0IHdhcyBzcGVjaWZpY2Fs
bHkgZGVzaWduZWQgdG8gbWltaWMgV2luIElFJ3MgcGFyc2luZyBiZWhhdmlvci4KKyAgICBpbnQg
a2V5QmVnaW4sIGtleUVuZDsKKyAgICBpbnQgdmFsdWVCZWdpbiwgdmFsdWVFbmQ7CisKKyAgICBp
bnQgaSA9IDA7CisgICAgaW50IGxlbmd0aCA9IGZlYXR1cmVzLmxlbmd0aCgpOworICAgIFN0cmlu
ZyBidWZmZXIgPSBmZWF0dXJlcy5sb3dlcigpOworICAgIHdoaWxlIChpIDwgbGVuZ3RoKSB7Cisg
ICAgICAgIC8vIHNraXAgdG8gZmlyc3Qgbm9uLXNlcGFyYXRvciwgYnV0IGRvbid0IHNraXAgcGFz
dCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcKKyAgICAgICAgd2hpbGUgKGlzU2VwYXJhdG9yKGJ1ZmZl
cltpXSkpIHsKKyAgICAgICAgICAgIGlmIChpID49IGxlbmd0aCkKKyAgICAgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorICAgICAgICBrZXlCZWdpbiA9IGk7
CisKKyAgICAgICAgLy8gc2tpcCB0byBmaXJzdCBzZXBhcmF0b3IKKyAgICAgICAgd2hpbGUgKCFp
c1NlcGFyYXRvcihidWZmZXJbaV0pKQorICAgICAgICAgICAgaSsrOworICAgICAgICBrZXlFbmQg
PSBpOworCisgICAgICAgIC8vIHNraXAgdG8gZmlyc3QgJz0nLCBidXQgZG9uJ3Qgc2tpcCBwYXN0
IGEgJywnIG9yIHRoZSBlbmQgb2YgdGhlIHN0cmluZworICAgICAgICB3aGlsZSAoYnVmZmVyW2ld
ICE9ICc9JykgeworICAgICAgICAgICAgaWYgKGJ1ZmZlcltpXSA9PSAnLCcgfHwgaSA+PSBsZW5n
dGgpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0K
KworICAgICAgICAvLyBza2lwIHRvIGZpcnN0IG5vbi1zZXBhcmF0b3IsIGJ1dCBkb24ndCBza2lw
IHBhc3QgYSAnLCcgb3IgdGhlIGVuZCBvZiB0aGUgc3RyaW5nCisgICAgICAgIHdoaWxlIChpc1Nl
cGFyYXRvcihidWZmZXJbaV0pKSB7CisgICAgICAgICAgICBpZiAoYnVmZmVyW2ldID09ICcsJyB8
fCBpID49IGxlbmd0aCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGkrKzsK
KyAgICAgICAgfQorICAgICAgICB2YWx1ZUJlZ2luID0gaTsKKworICAgICAgICAvLyBza2lwIHRv
IGZpcnN0IHNlcGFyYXRvcgorICAgICAgICB3aGlsZSAoIWlzU2VwYXJhdG9yKGJ1ZmZlcltpXSkp
CisgICAgICAgICAgICBpKys7CisgICAgICAgIHZhbHVlRW5kID0gaTsKKworICAgICAgICBBU1NF
UlQoaSA8PSBsZW5ndGgpOworCisgICAgICAgIFN0cmluZyBrZXlTdHJpbmcgPSBidWZmZXIuc3Vi
c3RyaW5nKGtleUJlZ2luLCBrZXlFbmQgLSBrZXlCZWdpbik7CisgICAgICAgIFN0cmluZyB2YWx1
ZVN0cmluZyA9IGJ1ZmZlci5zdWJzdHJpbmcodmFsdWVCZWdpbiwgdmFsdWVFbmQgLSB2YWx1ZUJl
Z2luKTsKKyAgICAgICAgY2FsbGJhY2soa2V5U3RyaW5nLCB2YWx1ZVN0cmluZywgdGhpcywgZGF0
YSk7CisgICAgfQorfQorCit2b2lkIERvY3VtZW50Ojpwcm9jZXNzVmlld3BvcnQoY29uc3QgU3Ry
aW5nJiBmZWF0dXJlcywgVmlld3BvcnRBcmd1bWVudHM6OlR5cGUgb3JpZ2luKQoreworICAgIEFT
U0VSVCghZmVhdHVyZXMuaXNOdWxsKCkpOworCisgICAgaWYgKG9yaWdpbiA8IG1fdmlld3BvcnRB
cmd1bWVudHMudHlwZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV92aWV3cG9ydEFyZ3VtZW50
cyA9IFZpZXdwb3J0QXJndW1lbnRzKG9yaWdpbik7CisgICAgcHJvY2Vzc0FyZ3VtZW50cyhmZWF0
dXJlcywgKHZvaWQqKSZtX3ZpZXdwb3J0QXJndW1lbnRzLCAmc2V0Vmlld3BvcnRGZWF0dXJlKTsK
KworICAgIHVwZGF0ZVZpZXdwb3J0QXJndW1lbnRzKCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnVw
ZGF0ZVZpZXdwb3J0QXJndW1lbnRzKCkKK3sKKyAgICBpZiAocGFnZSgpICYmIHBhZ2UoKS0+bWFp
bkZyYW1lKCkgPT0gZnJhbWUoKSkgeworI2lmbmRlZiBOREVCVUcKKyAgICAgICAgbV9kaWREaXNw
YXRjaFZpZXdwb3J0UHJvcGVydGllc0NoYW5nZWQgPSB0cnVlOworI2VuZGlmCisgICAgICAgIHBh
Z2UoKS0+Y2hyb21lKCktPmRpc3BhdGNoVmlld3BvcnRQcm9wZXJ0aWVzRGlkQ2hhbmdlKG1fdmll
d3BvcnRBcmd1bWVudHMpOworICAgIH0KK30KKwordm9pZCBEb2N1bWVudDo6cHJvY2Vzc1JlZmVy
cmVyUG9saWN5KGNvbnN0IFN0cmluZyYgcG9saWN5KQoreworICAgIEFTU0VSVCghcG9saWN5Lmlz
TnVsbCgpKTsKKworICAgIG1fcmVmZXJyZXJQb2xpY3kgPSBSZWZlcnJlclBvbGljeURlZmF1bHQ7
CisKKyAgICBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UocG9saWN5LCAibmV2ZXIiKSkKKyAgICAgICAg
bV9yZWZlcnJlclBvbGljeSA9IFJlZmVycmVyUG9saWN5TmV2ZXI7CisgICAgZWxzZSBpZiAoZXF1
YWxJZ25vcmluZ0Nhc2UocG9saWN5LCAiYWx3YXlzIikpCisgICAgICAgIG1fcmVmZXJyZXJQb2xp
Y3kgPSBSZWZlcnJlclBvbGljeUFsd2F5czsKKyAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2Fz
ZShwb2xpY3ksICJvcmlnaW4iKSkKKyAgICAgICAgbV9yZWZlcnJlclBvbGljeSA9IFJlZmVycmVy
UG9saWN5T3JpZ2luOworfQorCitNb3VzZUV2ZW50V2l0aEhpdFRlc3RSZXN1bHRzIERvY3VtZW50
OjpwcmVwYXJlTW91c2VFdmVudChjb25zdCBIaXRUZXN0UmVxdWVzdCYgcmVxdWVzdCwgY29uc3Qg
TGF5b3V0UG9pbnQmIGRvY3VtZW50UG9pbnQsIGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYgZXZl
bnQpCit7CisgICAgQVNTRVJUKCFyZW5kZXJlcigpIHx8IHJlbmRlcmVyKCktPmlzUmVuZGVyVmll
dygpKTsKKworICAgIGlmICghcmVuZGVyZXIoKSkKKyAgICAgICAgcmV0dXJuIE1vdXNlRXZlbnRX
aXRoSGl0VGVzdFJlc3VsdHMoZXZlbnQsIEhpdFRlc3RSZXN1bHQoTGF5b3V0UG9pbnQoKSkpOwor
CisgICAgSGl0VGVzdFJlc3VsdCByZXN1bHQoZG9jdW1lbnRQb2ludCk7CisgICAgcmVuZGVyVmll
dygpLT5oaXRUZXN0KHJlcXVlc3QsIHJlc3VsdCk7CisKKyAgICBpZiAoIXJlcXVlc3QucmVhZE9u
bHkoKSkKKyAgICAgICAgdXBkYXRlU3R5bGVJZk5lZWRlZCgpOworCisgICAgcmV0dXJuIE1vdXNl
RXZlbnRXaXRoSGl0VGVzdFJlc3VsdHMoZXZlbnQsIHJlc3VsdCk7Cit9CisKKy8vIERPTSBTZWN0
aW9uIDEuMS4xCitib29sIERvY3VtZW50OjpjaGlsZFR5cGVBbGxvd2VkKE5vZGVUeXBlIHR5cGUp
IGNvbnN0Cit7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBBVFRSSUJVVEVfTk9ERToK
KyAgICBjYXNlIENEQVRBX1NFQ1RJT05fTk9ERToKKyAgICBjYXNlIERPQ1VNRU5UX0ZSQUdNRU5U
X05PREU6CisgICAgY2FzZSBET0NVTUVOVF9OT0RFOgorICAgIGNhc2UgRU5USVRZX05PREU6Cisg
ICAgY2FzZSBFTlRJVFlfUkVGRVJFTkNFX05PREU6CisgICAgY2FzZSBOT1RBVElPTl9OT0RFOgor
ICAgIGNhc2UgVEVYVF9OT0RFOgorICAgIGNhc2UgWFBBVEhfTkFNRVNQQUNFX05PREU6CisgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICBjYXNlIENPTU1FTlRfTk9ERToKKyAgICBjYXNlIFBST0NF
U1NJTkdfSU5TVFJVQ1RJT05fTk9ERToKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgY2FzZSBE
T0NVTUVOVF9UWVBFX05PREU6CisgICAgY2FzZSBFTEVNRU5UX05PREU6CisgICAgICAgIC8vIERv
Y3VtZW50cyBtYXkgY29udGFpbiBubyBtb3JlIHRoYW4gb25lIG9mIGVhY2ggb2YgdGhlc2UuCisg
ICAgICAgIC8vIChPbmUgRWxlbWVudCBhbmQgb25lIERvY3VtZW50VHlwZS4pCisgICAgICAgIGZv
ciAoTm9kZSogYyA9IGZpcnN0Q2hpbGQoKTsgYzsgYyA9IGMtPm5leHRTaWJsaW5nKCkpCisgICAg
ICAgICAgICBpZiAoYy0+bm9kZVR5cGUoKSA9PSB0eXBlKQorICAgICAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsK
K30KKworYm9vbCBEb2N1bWVudDo6Y2FuUmVwbGFjZUNoaWxkKE5vZGUqIG5ld0NoaWxkLCBOb2Rl
KiBvbGRDaGlsZCkKK3sKKyAgICBpZiAoIW9sZENoaWxkKQorICAgICAgICAvLyBDb250YWluZXJO
b2RlOjpyZXBsYWNlQ2hpbGQgd2lsbCByYWlzZSBhIE5PVF9GT1VORF9FUlIuCisgICAgICAgIHJl
dHVybiB0cnVlOworCisgICAgaWYgKG9sZENoaWxkLT5ub2RlVHlwZSgpID09IG5ld0NoaWxkLT5u
b2RlVHlwZSgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGludCBudW1Eb2N0eXBlcyA9
IDA7CisgICAgaW50IG51bUVsZW1lbnRzID0gMDsKKworICAgIC8vIEZpcnN0LCBjaGVjayBob3cg
bWFueSBkb2N0eXBlcyBhbmQgZWxlbWVudHMgd2UgaGF2ZSwgbm90IGNvdW50aW5nCisgICAgLy8g
dGhlIGNoaWxkIHdlJ3JlIGFib3V0IHRvIHJlbW92ZS4KKyAgICBmb3IgKE5vZGUqIGMgPSBmaXJz
dENoaWxkKCk7IGM7IGMgPSBjLT5uZXh0U2libGluZygpKSB7CisgICAgICAgIGlmIChjID09IG9s
ZENoaWxkKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIAorICAgICAgICBzd2l0Y2gg
KGMtPm5vZGVUeXBlKCkpIHsKKyAgICAgICAgY2FzZSBET0NVTUVOVF9UWVBFX05PREU6CisgICAg
ICAgICAgICBudW1Eb2N0eXBlcysrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Ug
RUxFTUVOVF9OT0RFOgorICAgICAgICAgICAgbnVtRWxlbWVudHMrKzsKKyAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAg
ICB9CisgICAgCisgICAgLy8gVGhlbiwgc2VlIGhvdyBtYW55IGRvY3R5cGVzIGFuZCBlbGVtZW50
cyBtaWdodCBiZSBhZGRlZCBieSB0aGUgbmV3IGNoaWxkLgorICAgIGlmIChuZXdDaGlsZC0+bm9k
ZVR5cGUoKSA9PSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFKSB7CisgICAgICAgIGZvciAoTm9kZSog
YyA9IG5ld0NoaWxkLT5maXJzdENoaWxkKCk7IGM7IGMgPSBjLT5uZXh0U2libGluZygpKSB7Cisg
ICAgICAgICAgICBzd2l0Y2ggKGMtPm5vZGVUeXBlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgQVRU
UklCVVRFX05PREU6CisgICAgICAgICAgICBjYXNlIENEQVRBX1NFQ1RJT05fTk9ERToKKyAgICAg
ICAgICAgIGNhc2UgRE9DVU1FTlRfRlJBR01FTlRfTk9ERToKKyAgICAgICAgICAgIGNhc2UgRE9D
VU1FTlRfTk9ERToKKyAgICAgICAgICAgIGNhc2UgRU5USVRZX05PREU6CisgICAgICAgICAgICBj
YXNlIEVOVElUWV9SRUZFUkVOQ0VfTk9ERToKKyAgICAgICAgICAgIGNhc2UgTk9UQVRJT05fTk9E
RToKKyAgICAgICAgICAgIGNhc2UgVEVYVF9OT0RFOgorICAgICAgICAgICAgY2FzZSBYUEFUSF9O
QU1FU1BBQ0VfTk9ERToKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAg
ICBjYXNlIENPTU1FTlRfTk9ERToKKyAgICAgICAgICAgIGNhc2UgUFJPQ0VTU0lOR19JTlNUUlVD
VElPTl9OT0RFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBET0NV
TUVOVF9UWVBFX05PREU6CisgICAgICAgICAgICAgICAgbnVtRG9jdHlwZXMrKzsKKyAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRUxFTUVOVF9OT0RFOgorICAgICAgICAg
ICAgICAgIG51bUVsZW1lbnRzKys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzd2l0Y2ggKG5ld0NoaWxkLT5u
b2RlVHlwZSgpKSB7CisgICAgICAgIGNhc2UgQVRUUklCVVRFX05PREU6CisgICAgICAgIGNhc2Ug
Q0RBVEFfU0VDVElPTl9OT0RFOgorICAgICAgICBjYXNlIERPQ1VNRU5UX0ZSQUdNRU5UX05PREU6
CisgICAgICAgIGNhc2UgRE9DVU1FTlRfTk9ERToKKyAgICAgICAgY2FzZSBFTlRJVFlfTk9ERToK
KyAgICAgICAgY2FzZSBFTlRJVFlfUkVGRVJFTkNFX05PREU6CisgICAgICAgIGNhc2UgTk9UQVRJ
T05fTk9ERToKKyAgICAgICAgY2FzZSBURVhUX05PREU6CisgICAgICAgIGNhc2UgWFBBVEhfTkFN
RVNQQUNFX05PREU6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGNhc2UgQ09N
TUVOVF9OT0RFOgorICAgICAgICBjYXNlIFBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERToKKyAg
ICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIERPQ1VNRU5UX1RZUEVfTk9ERToK
KyAgICAgICAgICAgIG51bURvY3R5cGVzKys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
Y2FzZSBFTEVNRU5UX05PREU6CisgICAgICAgICAgICBudW1FbGVtZW50cysrOworICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIH0gICAgICAgICAgICAgICAgCisgICAgfQorICAgICAgICAKKyAg
ICBpZiAobnVtRWxlbWVudHMgPiAxIHx8IG51bURvY3R5cGVzID4gMSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgIAorICAgIHJldHVybiB0cnVlOworfQorCitQYXNzUmVmUHRyPE5vZGU+IERv
Y3VtZW50OjpjbG9uZU5vZGUoYm9vbCAvKmRlZXAqLykKK3sKKyAgICAvLyBTcGVjIHNheXMgY2xv
bmluZyBEb2N1bWVudCBub2RlcyBpcyAiaW1wbGVtZW50YXRpb24gZGVwZW5kZW50IgorICAgIC8v
IHNvIHdlIGRvIG5vdCBzdXBwb3J0IGl0Li4uCisgICAgcmV0dXJuIDA7Cit9CisKK1N0eWxlU2hl
ZXRMaXN0KiBEb2N1bWVudDo6c3R5bGVTaGVldHMoKQoreworICAgIHJldHVybiBtX3N0eWxlU2hl
ZXRzLmdldCgpOworfQorCitTdHJpbmcgRG9jdW1lbnQ6OnByZWZlcnJlZFN0eWxlc2hlZXRTZXQo
KSBjb25zdAoreworICAgIHJldHVybiBtX3ByZWZlcnJlZFN0eWxlc2hlZXRTZXQ7Cit9CisKK1N0
cmluZyBEb2N1bWVudDo6c2VsZWN0ZWRTdHlsZXNoZWV0U2V0KCkgY29uc3QKK3sKKyAgICByZXR1
cm4gbV9zZWxlY3RlZFN0eWxlc2hlZXRTZXQ7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnNldFNlbGVj
dGVkU3R5bGVzaGVldFNldChjb25zdCBTdHJpbmcmIGFTdHJpbmcpCit7CisgICAgbV9zZWxlY3Rl
ZFN0eWxlc2hlZXRTZXQgPSBhU3RyaW5nOworICAgIHN0eWxlUmVzb2x2ZXJDaGFuZ2VkKERlZmVy
UmVjYWxjU3R5bGUpOworfQorCisvLyBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbmV2ZXIgYSB0
b3AtbGV2ZWwgc3R5bGVzaGVldCBoYXMgZmluaXNoZWQgbG9hZGluZy4KK3ZvaWQgRG9jdW1lbnQ6
OnJlbW92ZVBlbmRpbmdTaGVldChSZW1vdmVQZW5kaW5nU2hlZXROb3RpZmljYXRpb25UeXBlIG5v
dGlmaWNhdGlvbikKK3sKKyAgICAvLyBNYWtlIHN1cmUgd2Uga25ldyB0aGlzIHNoZWV0IHdhcyBw
ZW5kaW5nLCBhbmQgdGhhdCBvdXIgY291bnQgaXNuJ3Qgb3V0IG9mIHN5bmMuCisgICAgQVNTRVJU
KG1fcGVuZGluZ1N0eWxlc2hlZXRzID4gMCk7CisKKyAgICBtX3BlbmRpbmdTdHlsZXNoZWV0cy0t
OworICAgIAorI2lmZGVmIElOU1RSVU1FTlRfTEFZT1VUX1NDSEVEVUxJTkcKKyAgICBpZiAoIW93
bmVyRWxlbWVudCgpKQorICAgICAgICBwcmludGYoIlN0eWxlc2hlZXQgbG9hZGVkIGF0IHRpbWUg
JWQuICVkIHN0eWxlc2hlZXRzIHN0aWxsIHJlbWFpbi5cbiIsIGVsYXBzZWRUaW1lKCksIG1fcGVu
ZGluZ1N0eWxlc2hlZXRzKTsKKyNlbmRpZgorCisgICAgaWYgKG1fcGVuZGluZ1N0eWxlc2hlZXRz
KQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAobm90aWZpY2F0aW9uID09IFJlbW92ZVBlbmRp
bmdTaGVldE5vdGlmeUxhdGVyKSB7CisgICAgICAgIHNldE5lZWRzTm90aWZ5UmVtb3ZlQWxsUGVu
ZGluZ1N0eWxlc2hlZXQoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICBkaWRS
ZW1vdmVBbGxQZW5kaW5nU3R5bGVzaGVldCgpOworfQorCit2b2lkIERvY3VtZW50OjpkaWRSZW1v
dmVBbGxQZW5kaW5nU3R5bGVzaGVldCgpCit7CisgICAgbV9uZWVkc05vdGlmeVJlbW92ZUFsbFBl
bmRpbmdTdHlsZXNoZWV0ID0gZmFsc2U7CisKKyAgICBzdHlsZVJlc29sdmVyQ2hhbmdlZChSZWNh
bGNTdHlsZUlmTmVlZGVkKTsKKworICAgIGlmIChTY3JpcHRhYmxlRG9jdW1lbnRQYXJzZXIqIHBh
cnNlciA9IHNjcmlwdGFibGVEb2N1bWVudFBhcnNlcigpKQorICAgICAgICBwYXJzZXItPmV4ZWN1
dGVTY3JpcHRzV2FpdGluZ0ZvclN0eWxlc2hlZXRzKCk7CisKKyAgICBpZiAobV9nb3RvQW5jaG9y
TmVlZGVkQWZ0ZXJTdHlsZXNoZWV0c0xvYWQgJiYgdmlldygpKQorICAgICAgICB2aWV3KCktPnNj
cm9sbFRvRnJhZ21lbnQobV91cmwpOworfQorCisKK3ZvaWQgRG9jdW1lbnQ6OmV2YWx1YXRlTWVk
aWFRdWVyeUxpc3QoKQoreworICAgIGlmIChtX21lZGlhUXVlcnlNYXRjaGVyKQorICAgICAgICBt
X21lZGlhUXVlcnlNYXRjaGVyLT5zdHlsZVJlc29sdmVyQ2hhbmdlZCgpOworfQorCit2b2lkIERv
Y3VtZW50OjpzdHlsZVJlc29sdmVyQ2hhbmdlZChTdHlsZVJlc29sdmVyVXBkYXRlRmxhZyB1cGRh
dGVGbGFnKQoreworICAgIC8vIERvbid0IGJvdGhlciB1cGRhdGluZywgc2luY2Ugd2UgaGF2ZW4n
dCBsb2FkZWQgYWxsIG91ciBzdHlsZSBpbmZvIHlldAorICAgIC8vIGFuZCBoYXZlbid0IGNhbGN1
bGF0ZWQgdGhlIHN0eWxlIHNlbGVjdG9yIGZvciB0aGUgZmlyc3QgdGltZS4KKyAgICBpZiAoIWF0
dGFjaGVkKCkgfHwgKCFtX2RpZENhbGN1bGF0ZVN0eWxlUmVzb2x2ZXIgJiYgIWhhdmVTdHlsZXNo
ZWV0c0xvYWRlZCgpKSkgeworICAgICAgICBtX3N0eWxlUmVzb2x2ZXIuY2xlYXIoKTsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKworI2lmZGVmIElOU1RSVU1FTlRfTEFZT1VUX1NDSEVEVUxJTkcK
KyAgICBpZiAoIW93bmVyRWxlbWVudCgpKQorICAgICAgICBwcmludGYoIkJlZ2lubmluZyB1cGRh
dGUgb2Ygc3R5bGUgc2VsZWN0b3IgYXQgdGltZSAlZC5cbiIsIGVsYXBzZWRUaW1lKCkpOworI2Vu
ZGlmCisKKyAgICBib29sIHN0eWxlc2hlZXRDaGFuZ2VSZXF1aXJlc1N0eWxlUmVjYWxjID0gdXBk
YXRlQWN0aXZlU3R5bGVzaGVldHModXBkYXRlRmxhZyk7CisKKyAgICBpZiAodXBkYXRlRmxhZyA9
PSBEZWZlclJlY2FsY1N0eWxlKSB7CisgICAgICAgIHNjaGVkdWxlRm9yY2VkU3R5bGVSZWNhbGMo
KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChkaWRMYXlvdXRXaXRoUGVuZGlu
Z1N0eWxlc2hlZXRzKCkgJiYgbV9wZW5kaW5nU3R5bGVzaGVldHMgPD0gMCkgeworICAgICAgICBt
X3BlbmRpbmdTaGVldExheW91dCA9IElnbm9yZUxheW91dFdpdGhQZW5kaW5nU2hlZXRzOworICAg
ICAgICBpZiAocmVuZGVyZXIoKSkKKyAgICAgICAgICAgIHJlbmRlcmVyKCktPnJlcGFpbnQoKTsK
KyAgICB9CisKKyAgICBpZiAoIXN0eWxlc2hlZXRDaGFuZ2VSZXF1aXJlc1N0eWxlUmVjYWxjKQor
ICAgICAgICByZXR1cm47CisKKyAgICAvLyBUaGlzIHJlY2FsY1N0eWxlIGluaXRpYXRlcyBhIG5l
dyByZWNhbGMgY3ljbGUuIFdlIG5lZWQgdG8gYnJhY2tldCBpdCB0bworICAgIC8vIG1ha2Ugc3Vy
ZSBhbmltYXRpb25zIGdldCB0aGUgY29ycmVjdCB1cGRhdGUgdGltZQorICAgIHsKKyAgICAgICAg
QW5pbWF0aW9uVXBkYXRlQmxvY2sgYW5pbWF0aW9uVXBkYXRlQmxvY2sobV9mcmFtZSA/IG1fZnJh
bWUtPmFuaW1hdGlvbigpIDogMCk7CisgICAgICAgIHJlY2FsY1N0eWxlKEZvcmNlKTsKKyAgICB9
CisKKyNpZmRlZiBJTlNUUlVNRU5UX0xBWU9VVF9TQ0hFRFVMSU5HCisgICAgaWYgKCFvd25lckVs
ZW1lbnQoKSkKKyAgICAgICAgcHJpbnRmKCJGaW5pc2hlZCB1cGRhdGUgb2Ygc3R5bGUgc2VsZWN0
b3IgYXQgdGltZSAlZFxuIiwgZWxhcHNlZFRpbWUoKSk7CisjZW5kaWYKKworICAgIGlmIChyZW5k
ZXJlcigpKSB7CisgICAgICAgIHJlbmRlcmVyKCktPnNldE5lZWRzTGF5b3V0QW5kUHJlZldpZHRo
c1JlY2FsYygpOworICAgICAgICBpZiAodmlldygpKQorICAgICAgICAgICAgdmlldygpLT5zY2hl
ZHVsZVJlbGF5b3V0KCk7CisgICAgfQorCisgICAgZXZhbHVhdGVNZWRpYVF1ZXJ5TGlzdCgpOwor
fQorCit2b2lkIERvY3VtZW50OjphZGRTdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZShOb2RlKiBub2Rl
LCBib29sIGNyZWF0ZWRCeVBhcnNlcikKK3sKKyAgICBpZiAoIW5vZGUtPmluRG9jdW1lbnQoKSkK
KyAgICAgICAgcmV0dXJuOworICAgIAorICAgIC8vIFVudGlsIHRoZSA8Ym9keT4gZXhpc3RzLCB3
ZSBoYXZlIG5vIGNob2ljZSBidXQgdG8gY29tcGFyZSBkb2N1bWVudCBwb3NpdGlvbnMsCisgICAg
Ly8gc2luY2Ugc3R5bGVzIG91dHNpZGUgb2YgdGhlIGJvZHkgYW5kIGhlYWQgY29udGludWUgdG8g
YmUgc2h1bnRlZCBpbnRvIHRoZSBoZWFkCisgICAgLy8gKGFuZCB0aHVzIGNhbiBzaGlmdCB0byBl
bmQgdXAgYmVmb3JlIGR5bmFtaWNhbGx5IGFkZGVkIERPTSBjb250ZW50IHRoYXQgaXMgYWxzbwor
ICAgIC8vIG91dHNpZGUgdGhlIGJvZHkpLgorICAgIGlmICgoY3JlYXRlZEJ5UGFyc2VyICYmIGJv
ZHkoKSkgfHwgbV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMuaXNFbXB0eSgpKSB7CisgICAgICAg
IG1fc3R5bGVTaGVldENhbmRpZGF0ZU5vZGVzLmFkZChub2RlKTsKKyAgICAgICAgcmV0dXJuOwor
ICAgIH0KKworICAgIC8vIERldGVybWluZSBhbiBhcHByb3ByaWF0ZSBpbnNlcnRpb24gcG9pbnQu
CisgICAgU3R5bGVTaGVldENhbmRpZGF0ZUxpc3RIYXNoU2V0OjppdGVyYXRvciBiZWdpbiA9IG1f
c3R5bGVTaGVldENhbmRpZGF0ZU5vZGVzLmJlZ2luKCk7CisgICAgU3R5bGVTaGVldENhbmRpZGF0
ZUxpc3RIYXNoU2V0OjppdGVyYXRvciBlbmQgPSBtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcy5l
bmQoKTsKKyAgICBTdHlsZVNoZWV0Q2FuZGlkYXRlTGlzdEhhc2hTZXQ6Oml0ZXJhdG9yIGl0ID0g
ZW5kOworICAgIE5vZGUqIGZvbGxvd2luZ05vZGUgPSAwOworICAgIGRvIHsKKyAgICAgICAgLS1p
dDsKKyAgICAgICAgTm9kZSogbiA9ICppdDsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgcG9zaXRp
b24gPSBuLT5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihub2RlKTsKKyAgICAgICAgaWYgKHBvc2l0
aW9uID09IERPQ1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lORykgeworICAgICAgICAgICAgbV9zdHls
ZVNoZWV0Q2FuZGlkYXRlTm9kZXMuaW5zZXJ0QmVmb3JlKGZvbGxvd2luZ05vZGUsIG5vZGUpOwor
ICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZvbGxvd2luZ05vZGUgPSBu
OworICAgIH0gd2hpbGUgKGl0ICE9IGJlZ2luKTsKKyAgICAKKyAgICBtX3N0eWxlU2hlZXRDYW5k
aWRhdGVOb2Rlcy5pbnNlcnRCZWZvcmUoZm9sbG93aW5nTm9kZSwgbm9kZSk7Cit9CisKK3ZvaWQg
RG9jdW1lbnQ6OnJlbW92ZVN0eWxlU2hlZXRDYW5kaWRhdGVOb2RlKE5vZGUqIG5vZGUpCit7Cisg
ICAgbV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMucmVtb3ZlKG5vZGUpOworfQorCit2b2lkIERv
Y3VtZW50Ojpjb2xsZWN0QWN0aXZlU3R5bGVzaGVldHMoVmVjdG9yPFJlZlB0cjxTdHlsZVNoZWV0
PiA+JiBzaGVldHMpCit7CisgICAgaWYgKHNldHRpbmdzKCkgJiYgIXNldHRpbmdzKCktPmF1dGhv
ckFuZFVzZXJTdHlsZXNFbmFibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIFN0eWxlU2hl
ZXRDYW5kaWRhdGVMaXN0SGFzaFNldDo6aXRlcmF0b3IgYmVnaW4gPSBtX3N0eWxlU2hlZXRDYW5k
aWRhdGVOb2Rlcy5iZWdpbigpOworICAgIFN0eWxlU2hlZXRDYW5kaWRhdGVMaXN0SGFzaFNldDo6
aXRlcmF0b3IgZW5kID0gbV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMuZW5kKCk7CisgICAgZm9y
IChTdHlsZVNoZWV0Q2FuZGlkYXRlTGlzdEhhc2hTZXQ6Oml0ZXJhdG9yIGl0ID0gYmVnaW47IGl0
ICE9IGVuZDsgKytpdCkgeworICAgICAgICBOb2RlKiBuID0gKml0OworICAgICAgICBTdHlsZVNo
ZWV0KiBzaGVldCA9IDA7CisgICAgICAgIGlmIChuLT5ub2RlVHlwZSgpID09IFBST0NFU1NJTkdf
SU5TVFJVQ1RJT05fTk9ERSkgeworICAgICAgICAgICAgLy8gUHJvY2Vzc2luZyBpbnN0cnVjdGlv
biAoWE1MIGRvY3VtZW50cyBvbmx5KS4KKyAgICAgICAgICAgIC8vIFdlIGRvbid0IHN1cHBvcnQg
bGlua2luZyB0byBlbWJlZGRlZCBDU1Mgc3R5bGVzaGVldHMsIHNlZSA8aHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQ5MjgxPiBmb3IgZGlzY3Vzc2lvbi4KKyAgICAgICAg
ICAgIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiogcGkgPSBzdGF0aWNfY2FzdDxQcm9jZXNzaW5nSW5z
dHJ1Y3Rpb24qPihuKTsKKyAgICAgICAgICAgIHNoZWV0ID0gcGktPnNoZWV0KCk7CisjaWYgRU5B
QkxFKFhTTFQpCisgICAgICAgICAgICAvLyBEb24ndCBhcHBseSBYU0wgdHJhbnNmb3JtcyB0byBh
bHJlYWR5IHRyYW5zZm9ybWVkIGRvY3VtZW50cyAtLSA8cmRhcjovL3Byb2JsZW0vNDEzMjgwNj4K
KyAgICAgICAgICAgIGlmIChwaS0+aXNYU0woKSAmJiAhdHJhbnNmb3JtU291cmNlRG9jdW1lbnQo
KSkgeworICAgICAgICAgICAgICAgIC8vIERvbid0IGFwcGx5IFhTTCB0cmFuc2Zvcm1zIHVudGls
IGxvYWRpbmcgaXMgZmluaXNoZWQuCisgICAgICAgICAgICAgICAgaWYgKCFwYXJzaW5nKCkpCisg
ICAgICAgICAgICAgICAgICAgIGFwcGx5WFNMVHJhbnNmb3JtKHBpKTsKKyAgICAgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfSBlbHNlIGlmICgobi0+
aXNIVE1MRWxlbWVudCgpICYmIChuLT5oYXNUYWdOYW1lKGxpbmtUYWcpIHx8IG4tPmhhc1RhZ05h
bWUoc3R5bGVUYWcpKSkKKyNpZiBFTkFCTEUoU1ZHKQorICAgICAgICAgICAgICAgICAgIHx8ICAo
bi0+aXNTVkdFbGVtZW50KCkgJiYgbi0+aGFzVGFnTmFtZShTVkdOYW1lczo6c3R5bGVUYWcpKQor
I2VuZGlmCisgICAgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICBFbGVtZW50KiBlID0g
c3RhdGljX2Nhc3Q8RWxlbWVudCo+KG4pOworICAgICAgICAgICAgQXRvbWljU3RyaW5nIHRpdGxl
ID0gZS0+Z2V0QXR0cmlidXRlKHRpdGxlQXR0cik7CisgICAgICAgICAgICBib29sIGVuYWJsZWRW
aWFTY3JpcHQgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChlLT5oYXNMb2NhbE5hbWUobGlua1Rh
ZykpIHsKKyAgICAgICAgICAgICAgICAvLyA8TElOSz4gZWxlbWVudAorICAgICAgICAgICAgICAg
IEhUTUxMaW5rRWxlbWVudCogbGlua0VsZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MTGlua0VsZW1l
bnQqPihuKTsKKyAgICAgICAgICAgICAgICBpZiAobGlua0VsZW1lbnQtPmlzRGlzYWJsZWQoKSkK
KyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgZW5hYmxlZFZp
YVNjcmlwdCA9IGxpbmtFbGVtZW50LT5pc0VuYWJsZWRWaWFTY3JpcHQoKTsKKyAgICAgICAgICAg
ICAgICBpZiAobGlua0VsZW1lbnQtPnN0eWxlU2hlZXRJc0xvYWRpbmcoKSkgeworICAgICAgICAg
ICAgICAgICAgICAvLyBpdCBpcyBsb2FkaW5nIGJ1dCB3ZSBzaG91bGQgc3RpbGwgZGVjaWRlIHdo
aWNoIHN0eWxlIHNoZWV0IHNldCB0byB1c2UKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFlbmFi
bGVkVmlhU2NyaXB0ICYmICF0aXRsZS5pc0VtcHR5KCkgJiYgbV9wcmVmZXJyZWRTdHlsZXNoZWV0
U2V0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXRvbWljU3Ry
aW5nJiByZWwgPSBlLT5nZXRBdHRyaWJ1dGUocmVsQXR0cik7CisgICAgICAgICAgICAgICAgICAg
ICAgICBpZiAoIXJlbC5jb250YWlucygiYWx0ZXJuYXRlIikpIHsKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBtX3ByZWZlcnJlZFN0eWxlc2hlZXRTZXQgPSB0aXRsZTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBtX3NlbGVjdGVkU3R5bGVzaGVldFNldCA9IHRpdGxlOworICAgICAg
ICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAo
IWxpbmtFbGVtZW50LT5zaGVldCgpKQorICAgICAgICAgICAgICAgICAgICB0aXRsZSA9IG51bGxB
dG9tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gR2V0IHRoZSBjdXJyZW50IHByZWZl
cnJlZCBzdHlsZXNldC4gIFRoaXMgaXMgdGhlCisgICAgICAgICAgICAvLyBzZXQgb2Ygc2hlZXRz
IHRoYXQgd2lsbCBiZSBlbmFibGVkLgorI2lmIEVOQUJMRShTVkcpCisgICAgICAgICAgICBpZiAo
bi0+aXNTVkdFbGVtZW50KCkgJiYgbi0+aGFzVGFnTmFtZShTVkdOYW1lczo6c3R5bGVUYWcpKQor
ICAgICAgICAgICAgICAgIHNoZWV0ID0gc3RhdGljX2Nhc3Q8U1ZHU3R5bGVFbGVtZW50Kj4obikt
PnNoZWV0KCk7CisgICAgICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgIGlmIChlLT5o
YXNMb2NhbE5hbWUobGlua1RhZykpCisgICAgICAgICAgICAgICAgc2hlZXQgPSBzdGF0aWNfY2Fz
dDxIVE1MTGlua0VsZW1lbnQqPihuKS0+c2hlZXQoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAg
ICAgICAgICAgICAvLyA8U1RZTEU+IGVsZW1lbnQKKyAgICAgICAgICAgICAgICBzaGVldCA9IHN0
YXRpY19jYXN0PEhUTUxTdHlsZUVsZW1lbnQqPihuKS0+c2hlZXQoKTsKKyAgICAgICAgICAgIC8v
IENoZWNrIHRvIHNlZSBpZiB0aGlzIHNoZWV0IGJlbG9uZ3MgdG8gYSBzdHlsZXNldAorICAgICAg
ICAgICAgLy8gKHRodXMgbWFraW5nIGl0IFBSRUZFUlJFRCBvciBBTFRFUk5BVEUgcmF0aGVyIHRo
YW4KKyAgICAgICAgICAgIC8vIFBFUlNJU1RFTlQpLgorICAgICAgICAgICAgQXRvbWljU3RyaW5n
IHJlbCA9IGUtPmdldEF0dHJpYnV0ZShyZWxBdHRyKTsKKyAgICAgICAgICAgIGlmICghZW5hYmxl
ZFZpYVNjcmlwdCAmJiAhdGl0bGUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgLy8gWWVz
LCB3ZSBoYXZlIGEgdGl0bGUuCisgICAgICAgICAgICAgICAgaWYgKG1fcHJlZmVycmVkU3R5bGVz
aGVldFNldC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTm8gcHJlZmVycmVk
IHNldCBoYXMgYmVlbiBlc3RhYmxpc2hlZC4gIElmCisgICAgICAgICAgICAgICAgICAgIC8vIHdl
IGFyZSBOT1QgYW4gYWx0ZXJuYXRlIHNoZWV0LCB0aGVuIGVzdGFibGlzaAorICAgICAgICAgICAg
ICAgICAgICAvLyB1cyBhcyB0aGUgcHJlZmVycmVkIHNldC4gIE90aGVyd2lzZSwganVzdCBpZ25v
cmUKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBzaGVldC4KKyAgICAgICAgICAgICAgICAg
ICAgaWYgKGUtPmhhc0xvY2FsTmFtZShzdHlsZVRhZykgfHwgIXJlbC5jb250YWlucygiYWx0ZXJu
YXRlIikpCisgICAgICAgICAgICAgICAgICAgICAgICBtX3ByZWZlcnJlZFN0eWxlc2hlZXRTZXQg
PSBtX3NlbGVjdGVkU3R5bGVzaGVldFNldCA9IHRpdGxlOworICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgICAgICBpZiAodGl0bGUgIT0gbV9wcmVmZXJyZWRTdHlsZXNoZWV0U2V0KQorICAg
ICAgICAgICAgICAgICAgICBzaGVldCA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
IGlmIChyZWwuY29udGFpbnMoImFsdGVybmF0ZSIpICYmIHRpdGxlLmlzRW1wdHkoKSkKKyAgICAg
ICAgICAgICAgICBzaGVldCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNoZWV0KQorICAg
ICAgICAgICAgc2hlZXRzLmFwcGVuZChzaGVldCk7CisgICAgfQorfQorCitib29sIERvY3VtZW50
Ojp0ZXN0QWRkZWRTdHlsZXNoZWV0UmVxdWlyZXNTdHlsZVJlY2FsYyhTdHlsZVNoZWV0Q29udGVu
dHMqIHN0eWxlc2hlZXQpCit7CisgICAgLy8gU2VlIGlmIGFsbCBydWxlcyBvbiB0aGUgc2hlZXQg
YXJlIHNjb3BlZCB0byBzb21lIHNwZWNpZmljIGlkcyBvciBjbGFzc2VzLgorICAgIC8vIFRoZW4g
dGVzdCBpZiB3ZSBhY3R1YWxseSBoYXZlIGFueSBvZiB0aG9zZSBpbiB0aGUgdHJlZSBhdCB0aGUg
bW9tZW50LgorICAgIEhhc2hTZXQ8QXRvbWljU3RyaW5nSW1wbCo+IGlkU2NvcGVzOyAKKyAgICBI
YXNoU2V0PEF0b21pY1N0cmluZ0ltcGwqPiBjbGFzc1Njb3BlczsKKyAgICBpZiAoIVN0eWxlUmVz
b2x2ZXI6OmRldGVybWluZVN0eWxlc2hlZXRTZWxlY3RvclNjb3BlcyhzdHlsZXNoZWV0LCBpZFNj
b3BlcywgY2xhc3NTY29wZXMpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAvLyBJbnZhbGlk
YXRlIHRoZSBzdWJ0cmVlcyB0aGF0IG1hdGNoIHRoZSBzY29wZXMuCisgICAgTm9kZSogbm9kZSA9
IGZpcnN0Q2hpbGQoKTsKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgICBpZiAoIW5vZGUtPmlz
U3R5bGVkRWxlbWVudCgpKSB7CisgICAgICAgICAgICBub2RlID0gbm9kZS0+dHJhdmVyc2VOZXh0
Tm9kZSgpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgU3R5bGVk
RWxlbWVudCogZWxlbWVudCA9IHN0YXRpY19jYXN0PFN0eWxlZEVsZW1lbnQqPihub2RlKTsKKyAg
ICAgICAgaWYgKFNlbGVjdG9yQ2hlY2tlcjo6ZWxlbWVudE1hdGNoZXNTZWxlY3RvclNjb3Blcyhl
bGVtZW50LCBpZFNjb3BlcywgY2xhc3NTY29wZXMpKSB7CisgICAgICAgICAgICBlbGVtZW50LT5z
ZXROZWVkc1N0eWxlUmVjYWxjKCk7CisgICAgICAgICAgICAvLyBUaGUgd2hvbGUgc3VidHJlZSBp
cyBub3cgaW52YWxpZGF0ZWQsIHdlIGNhbiBza2lwIHRvIHRoZSBuZXh0IHNpYmxpbmcuCisgICAg
ICAgICAgICBub2RlID0gbm9kZS0+dHJhdmVyc2VOZXh0U2libGluZygpOworICAgICAgICAgICAg
Y29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgbm9kZSA9IG5vZGUtPnRyYXZlcnNlTmV4dE5v
ZGUoKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIERvY3VtZW50OjphbmFs
eXplU3R5bGVzaGVldENoYW5nZShTdHlsZVJlc29sdmVyVXBkYXRlRmxhZyB1cGRhdGVGbGFnLCBj
b25zdCBWZWN0b3I8UmVmUHRyPFN0eWxlU2hlZXQ+ID4mIG5ld1N0eWxlc2hlZXRzLCBib29sJiBy
ZXF1aXJlc1N0eWxlUmVzb2x2ZXJSZXNldCwgYm9vbCYgcmVxdWlyZXNGdWxsU3R5bGVSZWNhbGMp
Cit7CisgICAgcmVxdWlyZXNTdHlsZVJlc29sdmVyUmVzZXQgPSB0cnVlOworICAgIHJlcXVpcmVz
RnVsbFN0eWxlUmVjYWxjID0gdHJ1ZTsKKyAgICAKKyAgICAvLyBTdHlsZXNoZWV0cyBvZiA8c3R5
bGU+IGVsZW1lbnRzIHRoYXQgQGltcG9ydCBzdHlsZXNoZWV0cyBhcmUgYWN0aXZlIGJ1dCBsb2Fk
aW5nLiBXZSBuZWVkIHRvIHRyaWdnZXIgYSBmdWxsIHJlY2FsYyB3aGVuIHN1Y2ggbG9hZHMgYXJl
IGRvbmUuCisgICAgYm9vbCBoYXNBY3RpdmVMb2FkaW5nU3R5bGVzaGVldCA9IGZhbHNlOworICAg
IHVuc2lnbmVkIG5ld1N0eWxlc2hlZXRDb3VudCA9IG5ld1N0eWxlc2hlZXRzLnNpemUoKTsKKyAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbmV3U3R5bGVzaGVldENvdW50OyArK2kpIHsKKyAg
ICAgICAgaWYgKG5ld1N0eWxlc2hlZXRzW2ldLT5pc0xvYWRpbmcoKSkKKyAgICAgICAgICAgIGhh
c0FjdGl2ZUxvYWRpbmdTdHlsZXNoZWV0ID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKG1faGFkQWN0
aXZlTG9hZGluZ1N0eWxlc2hlZXQgJiYgIWhhc0FjdGl2ZUxvYWRpbmdTdHlsZXNoZWV0KSB7Cisg
ICAgICAgIG1faGFkQWN0aXZlTG9hZGluZ1N0eWxlc2hlZXQgPSBmYWxzZTsKKyAgICAgICAgcmV0
dXJuOworICAgIH0KKyAgICBtX2hhZEFjdGl2ZUxvYWRpbmdTdHlsZXNoZWV0ID0gaGFzQWN0aXZl
TG9hZGluZ1N0eWxlc2hlZXQ7CisKKyAgICBpZiAodXBkYXRlRmxhZyAhPSBSZWNhbGNTdHlsZUlm
TmVlZGVkKQorICAgICAgICByZXR1cm47CisgICAgaWYgKCFtX3N0eWxlUmVzb2x2ZXIpCisgICAg
ICAgIHJldHVybjsKKworICAgIC8vIFNlZSBpZiB3ZSBhcmUganVzdCBhZGRpbmcgc3R5bGVzaGVl
dHMuCisgICAgdW5zaWduZWQgb2xkU3R5bGVzaGVldENvdW50ID0gbV9zdHlsZVNoZWV0cy0+bGVu
Z3RoKCk7CisgICAgaWYgKG5ld1N0eWxlc2hlZXRDb3VudCA8IG9sZFN0eWxlc2hlZXRDb3VudCkK
KyAgICAgICAgcmV0dXJuOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBvbGRTdHlsZXNo
ZWV0Q291bnQ7ICsraSkgeworICAgICAgICBpZiAobV9zdHlsZVNoZWV0cy0+aXRlbShpKSAhPSBu
ZXdTdHlsZXNoZWV0c1tpXSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcmVxdWly
ZXNTdHlsZVJlc29sdmVyUmVzZXQgPSBmYWxzZTsKKworICAgIC8vIElmIHdlIGFyZSBhbHJlYWR5
IHBhcnNpbmcgdGhlIGJvZHkgYW5kIHNvIG1heSBoYXZlIHNpZ25pZmljYW50IGFtb3VudCBvZiBl
bGVtZW50cywgcHV0IHNvbWUgZWZmb3J0IGludG8gdHJ5aW5nIHRvIGF2b2lkIHN0eWxlIHJlY2Fs
Y3MuCisgICAgaWYgKCFib2R5KCkgfHwgbV9oYXNOb2Rlc1dpdGhQbGFjZWhvbGRlclN0eWxlKQor
ICAgICAgICByZXR1cm47CisgICAgZm9yICh1bnNpZ25lZCBpID0gb2xkU3R5bGVzaGVldENvdW50
OyBpIDwgbmV3U3R5bGVzaGVldENvdW50OyArK2kpIHsKKyAgICAgICAgaWYgKCFuZXdTdHlsZXNo
ZWV0c1tpXS0+aXNDU1NTdHlsZVNoZWV0KCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAg
IGlmIChuZXdTdHlsZXNoZWV0c1tpXS0+ZGlzYWJsZWQoKSkKKyAgICAgICAgICAgIGNvbnRpbnVl
OworICAgICAgICBpZiAodGVzdEFkZGVkU3R5bGVzaGVldFJlcXVpcmVzU3R5bGVSZWNhbGMoc3Rh
dGljX2Nhc3Q8Q1NTU3R5bGVTaGVldCo+KG5ld1N0eWxlc2hlZXRzW2ldLmdldCgpKS0+Y29udGVu
dHMoKSkpCisgICAgICAgICAgICByZXR1cm47CisgICAgfQorICAgIHJlcXVpcmVzRnVsbFN0eWxl
UmVjYWxjID0gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIHN0eWxlU2hlZXRzVXNlUmVtVW5pdHMo
Y29uc3QgVmVjdG9yPFJlZlB0cjxTdHlsZVNoZWV0PiA+JiBzaGVldHMpCit7CisgICAgZm9yICh1
bnNpZ25lZCBpID0gMDsgaSA8IHNoZWV0cy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAoIXNo
ZWV0c1tpXS0+aXNDU1NTdHlsZVNoZWV0KCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAg
ICAgaWYgKHN0YXRpY19jYXN0PENTU1N0eWxlU2hlZXQqPihzaGVldHNbaV0uZ2V0KCkpLT5jb250
ZW50cygpLT51c2VzUmVtVW5pdHMoKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0K
KyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6Om5vdGlmeVNlYW1sZXNzQ2hp
bGREb2N1bWVudHNPZlN0eWxlc2hlZXRVcGRhdGUoKSBjb25zdAoreworICAgIC8vIElmIHdlJ3Jl
IG5vdCBpbiBhIGZyYW1lIHlldCBhbnkgcG90ZW50aWFsIGNoaWxkIGRvY3VtZW50cyB3b24ndCBo
YXZlIGEgU3R5bGVSZXNvbHZlciB0byB1cGRhdGUuCisgICAgaWYgKCFmcmFtZSgpKQorICAgICAg
ICByZXR1cm47CisKKyAgICAvLyBTZWFtbGVzcyBjaGlsZCBmcmFtZXMgYXJlIGV4cGVjdGVkIHRv
IG5vdGlmeSB0aGVpciBzZWFtbGVzcyBjaGlsZHJlbiByZWN1cnNpdmVseSwgc28gd2Ugb25seSBk
byBkaXJlY3QgY2hpbGRyZW4uCisgICAgZm9yIChGcmFtZSogY2hpbGQgPSBmcmFtZSgpLT50cmVl
KCktPmZpcnN0Q2hpbGQoKTsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPnRyZWUoKS0+bmV4dFNpYmxp
bmcoKSkgeworICAgICAgICBEb2N1bWVudCogY2hpbGREb2N1bWVudCA9IGNoaWxkLT5kb2N1bWVu
dCgpOworICAgICAgICBpZiAoY2hpbGREb2N1bWVudC0+c2hvdWxkRGlzcGxheVNlYW1sZXNzbHlX
aXRoUGFyZW50KCkpIHsKKyAgICAgICAgICAgIEFTU0VSVChjaGlsZERvY3VtZW50LT5zZWFtbGVz
c1BhcmVudElGcmFtZSgpLT5kb2N1bWVudCgpID09IHRoaXMpOworICAgICAgICAgICAgY2hpbGRE
b2N1bWVudC0+c2VhbWxlc3NQYXJlbnRVcGRhdGVkU3R5bGVzaGVldHMoKTsKKyAgICAgICAgfQor
ICAgIH0KK30KKworYm9vbCBEb2N1bWVudDo6dXBkYXRlQWN0aXZlU3R5bGVzaGVldHMoU3R5bGVS
ZXNvbHZlclVwZGF0ZUZsYWcgdXBkYXRlRmxhZykKK3sKKyAgICBpZiAobV9pblN0eWxlUmVjYWxj
KSB7CisgICAgICAgIC8vIFNWRyA8dXNlPiBlbGVtZW50IG1heSBtYW5hZ2UgdG8gaW52YWxpZGF0
ZSBzdHlsZSBzZWxlY3RvciBpbiB0aGUgbWlkZGxlIG9mIGEgc3R5bGUgcmVjYWxjLgorICAgICAg
ICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTQzNDQKKyAgICAg
ICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIGJlIGZpeGVkIGluIFNWRyBhbmQgdGhpcyBjb2RlIHJl
cGxhY2VkIHdpdGggQVNTRVJUKCFtX2luU3R5bGVSZWNhbGMpLgorICAgICAgICBtX2hhc0RpcnR5
U3R5bGVSZXNvbHZlciA9IHRydWU7CisgICAgICAgIHNjaGVkdWxlRm9yY2VkU3R5bGVSZWNhbGMo
KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIXJlbmRlcmVyKCkgfHwg
IWF0dGFjaGVkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIFN0eWxlU2hlZXRWZWN0
b3IgbmV3U3R5bGVzaGVldHM7CisgICAgY29sbGVjdEFjdGl2ZVN0eWxlc2hlZXRzKG5ld1N0eWxl
c2hlZXRzKTsKKworICAgIGJvb2wgcmVxdWlyZXNTdHlsZVJlc29sdmVyUmVzZXQ7CisgICAgYm9v
bCByZXF1aXJlc0Z1bGxTdHlsZVJlY2FsYzsKKyAgICBhbmFseXplU3R5bGVzaGVldENoYW5nZSh1
cGRhdGVGbGFnLCBuZXdTdHlsZXNoZWV0cywgcmVxdWlyZXNTdHlsZVJlc29sdmVyUmVzZXQsIHJl
cXVpcmVzRnVsbFN0eWxlUmVjYWxjKTsKKworICAgIGlmIChyZXF1aXJlc1N0eWxlUmVzb2x2ZXJS
ZXNldCkKKyAgICAgICAgY2xlYXJTdHlsZVJlc29sdmVyKCk7CisgICAgZWxzZSB7CisgICAgICAg
IG1fc3R5bGVSZXNvbHZlci0+YXBwZW5kQXV0aG9yU3R5bGVzaGVldHMobV9zdHlsZVNoZWV0cy0+
bGVuZ3RoKCksIG5ld1N0eWxlc2hlZXRzKTsKKyAgICAgICAgcmVzZXRDU1NGZWF0dXJlRmxhZ3Mo
KTsKKyAgICB9CisgICAgbV9zdHlsZVNoZWV0cy0+c3dhcChuZXdTdHlsZXNoZWV0cyk7CisKKyAg
ICBtX3VzZXNSZW1Vbml0cyA9IHN0eWxlU2hlZXRzVXNlUmVtVW5pdHMobV9zdHlsZVNoZWV0cy0+
dmVjdG9yKCkpOworICAgIG1fZGlkQ2FsY3VsYXRlU3R5bGVSZXNvbHZlciA9IHRydWU7CisgICAg
bV9oYXNEaXJ0eVN0eWxlUmVzb2x2ZXIgPSBmYWxzZTsKKworICAgIG5vdGlmeVNlYW1sZXNzQ2hp
bGREb2N1bWVudHNPZlN0eWxlc2hlZXRVcGRhdGUoKTsKKworICAgIHJldHVybiByZXF1aXJlc0Z1
bGxTdHlsZVJlY2FsYzsKK30KKwordm9pZCBEb2N1bWVudDo6c2V0SG92ZXJOb2RlKFBhc3NSZWZQ
dHI8Tm9kZT4gbmV3SG92ZXJOb2RlKQoreworICAgIG1faG92ZXJOb2RlID0gbmV3SG92ZXJOb2Rl
OworfQorCit2b2lkIERvY3VtZW50OjpzZXRBY3RpdmVOb2RlKFBhc3NSZWZQdHI8Tm9kZT4gbmV3
QWN0aXZlTm9kZSkKK3sKKyAgICBtX2FjdGl2ZU5vZGUgPSBuZXdBY3RpdmVOb2RlOworfQorCit2
b2lkIERvY3VtZW50Ojpmb2N1c2VkTm9kZVJlbW92ZWQoKQoreworICAgIHNldEZvY3VzZWROb2Rl
KDApOworfQorCit2b2lkIERvY3VtZW50OjpyZW1vdmVGb2N1c2VkTm9kZU9mU3VidHJlZShOb2Rl
KiBub2RlLCBib29sIGFtb25nQ2hpbGRyZW5Pbmx5KQoreworICAgIGlmICghbV9mb2N1c2VkTm9k
ZSB8fCB0aGlzLT5pblBhZ2VDYWNoZSgpKSAvLyBJZiB0aGUgZG9jdW1lbnQgaXMgaW4gdGhlIHBh
Z2UgY2FjaGUsIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byBjbGVhciBvdXQgdGhlIGZvY3VzZWQgbm9k
ZS4KKyAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICBib29sIG5vZGVJblN1YnRyZWUgPSBm
YWxzZTsKKyAgICBpZiAoYW1vbmdDaGlsZHJlbk9ubHkpCisgICAgICAgIG5vZGVJblN1YnRyZWUg
PSBtX2ZvY3VzZWROb2RlLT5pc0Rlc2NlbmRhbnRPZihub2RlKTsKKyAgICBlbHNlCisgICAgICAg
IG5vZGVJblN1YnRyZWUgPSAobV9mb2N1c2VkTm9kZSA9PSBub2RlKSB8fCBtX2ZvY3VzZWROb2Rl
LT5pc0Rlc2NlbmRhbnRPZihub2RlKTsKKyAgICAKKyAgICBpZiAobm9kZUluU3VidHJlZSkKKyAg
ICAgICAgZG9jdW1lbnQoKS0+Zm9jdXNlZE5vZGVSZW1vdmVkKCk7Cit9CisKK3ZvaWQgRG9jdW1l
bnQ6OmhvdmVyZWROb2RlRGV0YWNoZWQoTm9kZSogbm9kZSkKK3sKKyAgICBpZiAoIW1faG92ZXJO
b2RlIHx8IChub2RlICE9IG1faG92ZXJOb2RlICYmICghbV9ob3Zlck5vZGUtPmlzVGV4dE5vZGUo
KSB8fCBub2RlICE9IG1faG92ZXJOb2RlLT5wYXJlbnROb2RlKCkpKSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgbV9ob3Zlck5vZGUgPSBub2RlLT5wYXJlbnROb2RlKCk7CisgICAgd2hpbGUgKG1f
aG92ZXJOb2RlICYmICFtX2hvdmVyTm9kZS0+cmVuZGVyZXIoKSkKKyAgICAgICAgbV9ob3Zlck5v
ZGUgPSBtX2hvdmVyTm9kZS0+cGFyZW50Tm9kZSgpOworICAgIGlmIChmcmFtZSgpKQorICAgICAg
ICBmcmFtZSgpLT5ldmVudEhhbmRsZXIoKS0+c2NoZWR1bGVIb3ZlclN0YXRlVXBkYXRlKCk7Cit9
CisKK3ZvaWQgRG9jdW1lbnQ6OmFjdGl2ZUNoYWluTm9kZURldGFjaGVkKE5vZGUqIG5vZGUpCit7
CisgICAgaWYgKCFtX2FjdGl2ZU5vZGUgfHwgKG5vZGUgIT0gbV9hY3RpdmVOb2RlICYmICghbV9h
Y3RpdmVOb2RlLT5pc1RleHROb2RlKCkgfHwgbm9kZSAhPSBtX2FjdGl2ZU5vZGUtPnBhcmVudE5v
ZGUoKSkpKQorICAgICAgICByZXR1cm47CisKKyAgICBtX2FjdGl2ZU5vZGUgPSBub2RlLT5wYXJl
bnROb2RlKCk7CisgICAgd2hpbGUgKG1fYWN0aXZlTm9kZSAmJiAhbV9hY3RpdmVOb2RlLT5yZW5k
ZXJlcigpKQorICAgICAgICBtX2FjdGl2ZU5vZGUgPSBtX2FjdGl2ZU5vZGUtPnBhcmVudE5vZGUo
KTsKK30KKworI2lmIEVOQUJMRShEQVNIQk9BUkRfU1VQUE9SVCkgfHwgRU5BQkxFKFdJREdFVF9S
RUdJT04pCitjb25zdCBWZWN0b3I8RGFzaGJvYXJkUmVnaW9uVmFsdWU+JiBEb2N1bWVudDo6ZGFz
aGJvYXJkUmVnaW9ucygpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fZGFzaGJvYXJkUmVnaW9uczsK
K30KKwordm9pZCBEb2N1bWVudDo6c2V0RGFzaGJvYXJkUmVnaW9ucyhjb25zdCBWZWN0b3I8RGFz
aGJvYXJkUmVnaW9uVmFsdWU+JiByZWdpb25zKQoreworICAgIG1fZGFzaGJvYXJkUmVnaW9ucyA9
IHJlZ2lvbnM7CisgICAgc2V0RGFzaGJvYXJkUmVnaW9uc0RpcnR5KGZhbHNlKTsKK30KKyNlbmRp
ZgorCitib29sIERvY3VtZW50OjpzZXRGb2N1c2VkTm9kZShQYXNzUmVmUHRyPE5vZGU+IHBycE5l
d0ZvY3VzZWROb2RlKQoreworICAgIFJlZlB0cjxOb2RlPiBuZXdGb2N1c2VkTm9kZSA9IHBycE5l
d0ZvY3VzZWROb2RlOworCisgICAgLy8gTWFrZSBzdXJlIG5ld0ZvY3VzZWROb2RlIGlzIGFjdHVh
bGx5IGluIHRoaXMgZG9jdW1lbnQKKyAgICBpZiAobmV3Rm9jdXNlZE5vZGUgJiYgKG5ld0ZvY3Vz
ZWROb2RlLT5kb2N1bWVudCgpICE9IHRoaXMpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAg
IGlmIChtX2ZvY3VzZWROb2RlID09IG5ld0ZvY3VzZWROb2RlKQorICAgICAgICByZXR1cm4gdHJ1
ZTsKKworICAgIGlmIChtX2luUGFnZUNhY2hlKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICBib29sIGZvY3VzQ2hhbmdlQmxvY2tlZCA9IGZhbHNlOworICAgIFJlZlB0cjxOb2RlPiBvbGRG
b2N1c2VkTm9kZSA9IG1fZm9jdXNlZE5vZGU7CisgICAgbV9mb2N1c2VkTm9kZSA9IDA7CisKKyAg
ICAvLyBSZW1vdmUgZm9jdXMgZnJvbSB0aGUgZXhpc3RpbmcgZm9jdXMgbm9kZSAoaWYgYW55KQor
ICAgIGlmIChvbGRGb2N1c2VkTm9kZSkgeworICAgICAgICBBU1NFUlQoIW9sZEZvY3VzZWROb2Rl
LT5pbkRldGFjaCgpKTsKKworICAgICAgICBpZiAob2xkRm9jdXNlZE5vZGUtPmFjdGl2ZSgpKQor
ICAgICAgICAgICAgb2xkRm9jdXNlZE5vZGUtPnNldEFjdGl2ZShmYWxzZSk7CisKKyAgICAgICAg
b2xkRm9jdXNlZE5vZGUtPnNldEZvY3VzKGZhbHNlKTsKKworICAgICAgICAvLyBEaXNwYXRjaCBh
IGNoYW5nZSBldmVudCBmb3IgdGV4dCBmaWVsZHMgb3IgdGV4dGFyZWFzIHRoYXQgaGF2ZSBiZWVu
IGVkaXRlZAorICAgICAgICBpZiAob2xkRm9jdXNlZE5vZGUtPmlzRWxlbWVudE5vZGUoKSkgewor
ICAgICAgICAgICAgRWxlbWVudCogZWxlbWVudCA9IHN0YXRpY19jYXN0PEVsZW1lbnQqPihvbGRG
b2N1c2VkTm9kZS5nZXQoKSk7CisgICAgICAgICAgICBpZiAoZWxlbWVudC0+d2FzQ2hhbmdlZFNp
bmNlTGFzdEZvcm1Db250cm9sQ2hhbmdlRXZlbnQoKSkKKyAgICAgICAgICAgICAgICBlbGVtZW50
LT5kaXNwYXRjaEZvcm1Db250cm9sQ2hhbmdlRXZlbnQoKTsKKyAgICAgICAgfQorCisgICAgICAg
IC8vIERpc3BhdGNoIHRoZSBibHVyIGV2ZW50IGFuZCBsZXQgdGhlIG5vZGUgZG8gYW55IG90aGVy
IGJsdXIgcmVsYXRlZCBhY3Rpdml0aWVzIChpbXBvcnRhbnQgZm9yIHRleHQgZmllbGRzKQorICAg
ICAgICBvbGRGb2N1c2VkTm9kZS0+ZGlzcGF0Y2hCbHVyRXZlbnQobmV3Rm9jdXNlZE5vZGUpOwor
CisgICAgICAgIGlmIChtX2ZvY3VzZWROb2RlKSB7CisgICAgICAgICAgICAvLyBoYW5kbGVyIHNo
aWZ0ZWQgZm9jdXMKKyAgICAgICAgICAgIGZvY3VzQ2hhbmdlQmxvY2tlZCA9IHRydWU7CisgICAg
ICAgICAgICBuZXdGb2N1c2VkTm9kZSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAg
IG9sZEZvY3VzZWROb2RlLT5kaXNwYXRjaEZvY3VzT3V0RXZlbnQoZXZlbnROYW1lcygpLmZvY3Vz
b3V0RXZlbnQsIG5ld0ZvY3VzZWROb2RlKTsgLy8gRE9NIGxldmVsIDMgbmFtZSBmb3IgdGhlIGJ1
YmJsaW5nIGJsdXIgZXZlbnQuCisgICAgICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgcmVtb3ZlIGZp
cmluZyBET01Gb2N1c091dEV2ZW50IGV2ZW50IHdoZW4gd2UgYXJlIHN1cmUgbm8gY29udGVudCBk
ZXBlbmRzCisgICAgICAgIC8vIG9uIGl0LCBwcm9iYWJseSB3aGVuIDxyZGFyOi8vcHJvYmxlbS84
NTAzOTU4PiBpcyByZXNvbHZlZC4KKyAgICAgICAgb2xkRm9jdXNlZE5vZGUtPmRpc3BhdGNoRm9j
dXNPdXRFdmVudChldmVudE5hbWVzKCkuRE9NRm9jdXNPdXRFdmVudCwgbmV3Rm9jdXNlZE5vZGUp
OyAvLyBET00gbGV2ZWwgMiBuYW1lIGZvciBjb21wYXRpYmlsaXR5LgorCisgICAgICAgIGlmICht
X2ZvY3VzZWROb2RlKSB7CisgICAgICAgICAgICAvLyBoYW5kbGVyIHNoaWZ0ZWQgZm9jdXMKKyAg
ICAgICAgICAgIGZvY3VzQ2hhbmdlQmxvY2tlZCA9IHRydWU7CisgICAgICAgICAgICBuZXdGb2N1
c2VkTm9kZSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9sZEZvY3VzZWROb2RlID09IHRo
aXMgJiYgb2xkRm9jdXNlZE5vZGUtPmhhc09uZVJlZigpKQorICAgICAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgICAgICAgICAKKyAgICAgICAgaWYgKG9sZEZvY3VzZWROb2RlLT5pc1Jvb3RFZGl0
YWJsZUVsZW1lbnQoKSkKKyAgICAgICAgICAgIGZyYW1lKCktPmVkaXRvcigpLT5kaWRFbmRFZGl0
aW5nKCk7CisKKyAgICAgICAgaWYgKHZpZXcoKSkgeworICAgICAgICAgICAgV2lkZ2V0KiBvbGRX
aWRnZXQgPSB3aWRnZXRGb3JOb2RlKG9sZEZvY3VzZWROb2RlLmdldCgpKTsKKyAgICAgICAgICAg
IGlmIChvbGRXaWRnZXQpCisgICAgICAgICAgICAgICAgb2xkV2lkZ2V0LT5zZXRGb2N1cyhmYWxz
ZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdmlldygpLT5zZXRGb2N1cyhm
YWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobmV3Rm9jdXNlZE5vZGUpIHsKKyAg
ICAgICAgaWYgKG5ld0ZvY3VzZWROb2RlLT5pc1Jvb3RFZGl0YWJsZUVsZW1lbnQoKSAmJiAhYWNj
ZXB0c0VkaXRpbmdGb2N1cyhuZXdGb2N1c2VkTm9kZS5nZXQoKSkpIHsKKyAgICAgICAgICAgIC8v
IGRlbGVnYXRlIGJsb2NrcyBmb2N1cyBjaGFuZ2UKKyAgICAgICAgICAgIGZvY3VzQ2hhbmdlQmxv
Y2tlZCA9IHRydWU7CisgICAgICAgICAgICBnb3RvIFNldEZvY3VzZWROb2RlRG9uZTsKKyAgICAg
ICAgfQorICAgICAgICAvLyBTZXQgZm9jdXMgb24gdGhlIG5ldyBub2RlCisgICAgICAgIG1fZm9j
dXNlZE5vZGUgPSBuZXdGb2N1c2VkTm9kZTsKKworICAgICAgICAvLyBEaXNwYXRjaCB0aGUgZm9j
dXMgZXZlbnQgYW5kIGxldCB0aGUgbm9kZSBkbyBhbnkgb3RoZXIgZm9jdXMgcmVsYXRlZCBhY3Rp
dml0aWVzIChpbXBvcnRhbnQgZm9yIHRleHQgZmllbGRzKQorICAgICAgICBtX2ZvY3VzZWROb2Rl
LT5kaXNwYXRjaEZvY3VzRXZlbnQob2xkRm9jdXNlZE5vZGUpOworCisgICAgICAgIGlmIChtX2Zv
Y3VzZWROb2RlICE9IG5ld0ZvY3VzZWROb2RlKSB7CisgICAgICAgICAgICAvLyBoYW5kbGVyIHNo
aWZ0ZWQgZm9jdXMKKyAgICAgICAgICAgIGZvY3VzQ2hhbmdlQmxvY2tlZCA9IHRydWU7CisgICAg
ICAgICAgICBnb3RvIFNldEZvY3VzZWROb2RlRG9uZTsKKyAgICAgICAgfQorCisgICAgICAgIG1f
Zm9jdXNlZE5vZGUtPmRpc3BhdGNoRm9jdXNJbkV2ZW50KGV2ZW50TmFtZXMoKS5mb2N1c2luRXZl
bnQsIG9sZEZvY3VzZWROb2RlKTsgLy8gRE9NIGxldmVsIDMgYnViYmxpbmcgZm9jdXMgZXZlbnQu
CisKKyAgICAgICAgaWYgKG1fZm9jdXNlZE5vZGUgIT0gbmV3Rm9jdXNlZE5vZGUpIHsKKyAgICAg
ICAgICAgIC8vIGhhbmRsZXIgc2hpZnRlZCBmb2N1cworICAgICAgICAgICAgZm9jdXNDaGFuZ2VC
bG9ja2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIGdvdG8gU2V0Rm9jdXNlZE5vZGVEb25lOworICAg
ICAgICB9CisKKyAgICAgICAgLy8gRklYTUU6IFdlIHNob3VsZCByZW1vdmUgZmlyaW5nIERPTUZv
Y3VzSW5FdmVudCBldmVudCB3aGVuIHdlIGFyZSBzdXJlIG5vIGNvbnRlbnQgZGVwZW5kcworICAg
ICAgICAvLyBvbiBpdCwgcHJvYmFibHkgd2hlbiA8cmRhcjovL3Byb2JsZW0vODUwMzk1OD4gaXMg
bS4KKyAgICAgICAgbV9mb2N1c2VkTm9kZS0+ZGlzcGF0Y2hGb2N1c0luRXZlbnQoZXZlbnROYW1l
cygpLkRPTUZvY3VzSW5FdmVudCwgb2xkRm9jdXNlZE5vZGUpOyAvLyBET00gbGV2ZWwgMiBmb3Ig
Y29tcGF0aWJpbGl0eS4KKworICAgICAgICBpZiAobV9mb2N1c2VkTm9kZSAhPSBuZXdGb2N1c2Vk
Tm9kZSkgeyAKKyAgICAgICAgICAgIC8vIGhhbmRsZXIgc2hpZnRlZCBmb2N1cworICAgICAgICAg
ICAgZm9jdXNDaGFuZ2VCbG9ja2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIGdvdG8gU2V0Rm9jdXNl
ZE5vZGVEb25lOworICAgICAgICB9CisgICAgICAgIG1fZm9jdXNlZE5vZGUtPnNldEZvY3VzKHRy
dWUpOworCisgICAgICAgIGlmIChtX2ZvY3VzZWROb2RlLT5pc1Jvb3RFZGl0YWJsZUVsZW1lbnQo
KSkKKyAgICAgICAgICAgIGZyYW1lKCktPmVkaXRvcigpLT5kaWRCZWdpbkVkaXRpbmcoKTsKKwor
ICAgICAgICAvLyBld3csIEkgc3Vjay4gc2V0IHRoZSBxdCBmb2N1cyBjb3JyZWN0bHkKKyAgICAg
ICAgLy8gIyMjIGZpbmQgYSBiZXR0ZXIgcGxhY2UgaW4gdGhlIGNvZGUgZm9yIHRoaXMKKyAgICAg
ICAgaWYgKHZpZXcoKSkgeworICAgICAgICAgICAgV2lkZ2V0KiBmb2N1c1dpZGdldCA9IHdpZGdl
dEZvck5vZGUobV9mb2N1c2VkTm9kZS5nZXQoKSk7CisgICAgICAgICAgICBpZiAoZm9jdXNXaWRn
ZXQpIHsKKyAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgYSB3aWRnZXQgaGFzIHRoZSByaWdo
dCBzaXplIGJlZm9yZSBnaXZpbmcgaXQgZm9jdXMuCisgICAgICAgICAgICAgICAgLy8gT3RoZXJ3
aXNlLCB3ZSBhcmUgdGVzdGluZyBlZGdlIGNhc2VzIG9mIHRoZSBXaWRnZXQgY29kZS4KKyAgICAg
ICAgICAgICAgICAvLyBTcGVjaWZpY2FsbHksIGluIFdlYkNvcmUgdGhpcyBkb2VzIG5vdCB3b3Jr
IHdlbGwgZm9yIHRleHQgZmllbGRzLgorICAgICAgICAgICAgICAgIHVwZGF0ZUxheW91dCgpOwor
ICAgICAgICAgICAgICAgIC8vIFJlLWdldCB0aGUgd2lkZ2V0IGluIGNhc2UgdXBkYXRpbmcgdGhl
IGxheW91dCBjaGFuZ2VkIHRoaW5ncy4KKyAgICAgICAgICAgICAgICBmb2N1c1dpZGdldCA9IHdp
ZGdldEZvck5vZGUobV9mb2N1c2VkTm9kZS5nZXQoKSk7CisgICAgICAgICAgICB9CisgICAgICAg
ICAgICBpZiAoZm9jdXNXaWRnZXQpCisgICAgICAgICAgICAgICAgZm9jdXNXaWRnZXQtPnNldEZv
Y3VzKHRydWUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHZpZXcoKS0+c2V0
Rm9jdXModHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyNpZiBQTEFURk9STShNQUMpIHx8IFBM
QVRGT1JNKFdJTikgfHwgUExBVEZPUk0oR1RLKSB8fCBQTEFURk9STShDSFJPTUlVTSkKKyAgICBp
ZiAoIWZvY3VzQ2hhbmdlQmxvY2tlZCAmJiBtX2ZvY3VzZWROb2RlICYmIEFYT2JqZWN0Q2FjaGU6
OmFjY2Vzc2liaWxpdHlFbmFibGVkKCkpCisgICAgICAgIGF4T2JqZWN0Q2FjaGUoKS0+aGFuZGxl
Rm9jdXNlZFVJRWxlbWVudENoYW5nZWQob2xkRm9jdXNlZE5vZGUuZ2V0KCksIG5ld0ZvY3VzZWRO
b2RlLmdldCgpKTsKKyNlbmRpZgorICAgIGlmICghZm9jdXNDaGFuZ2VCbG9ja2VkKQorICAgICAg
ICBwYWdlKCktPmNocm9tZSgpLT5mb2N1c2VkTm9kZUNoYW5nZWQobV9mb2N1c2VkTm9kZS5nZXQo
KSk7CisKK1NldEZvY3VzZWROb2RlRG9uZToKKyAgICB1cGRhdGVTdHlsZUlmTmVlZGVkKCk7Cisg
ICAgcmV0dXJuICFmb2N1c0NoYW5nZUJsb2NrZWQ7Cit9CisgICAgCit2b2lkIERvY3VtZW50Ojpn
ZXRGb2N1c2FibGVOb2RlcyhWZWN0b3I8UmVmUHRyPE5vZGU+ID4mIG5vZGVzKQoreworICAgIHVw
ZGF0ZUxheW91dCgpOworCisgICAgZm9yIChOb2RlKiBub2RlID0gZmlyc3RDaGlsZCgpOyBub2Rl
OyBub2RlID0gbm9kZS0+dHJhdmVyc2VOZXh0Tm9kZSgpKSB7CisgICAgICAgIGlmIChub2RlLT5p
c0ZvY3VzYWJsZSgpKQorICAgICAgICAgICAgbm9kZXMuYXBwZW5kKG5vZGUpOworICAgIH0KK30K
KyAgCit2b2lkIERvY3VtZW50OjpzZXRDU1NUYXJnZXQoRWxlbWVudCogbikKK3sKKyAgICBpZiAo
bV9jc3NUYXJnZXQpCisgICAgICAgIG1fY3NzVGFyZ2V0LT5zZXROZWVkc1N0eWxlUmVjYWxjKCk7
CisgICAgbV9jc3NUYXJnZXQgPSBuOworICAgIGlmIChuKQorICAgICAgICBuLT5zZXROZWVkc1N0
eWxlUmVjYWxjKCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnJlZ2lzdGVyTm9kZUxpc3RDYWNoZShE
eW5hbWljTm9kZUxpc3RDYWNoZUJhc2UqIGxpc3QpCit7CisgICAgaWYgKGxpc3QtPnR5cGUoKSAh
PSBOb2RlTGlzdENvbGxlY3Rpb25UeXBlKQorICAgICAgICBtX25vZGVMaXN0Q291bnRzW0ludmFs
aWRhdGVPbklkTmFtZUF0dHJDaGFuZ2VdKys7CisgICAgbV9ub2RlTGlzdENvdW50c1tsaXN0LT5p
bnZhbGlkYXRpb25UeXBlKCldKys7CisgICAgaWYgKGxpc3QtPmlzUm9vdGVkQXREb2N1bWVudCgp
KQorICAgICAgICBtX2xpc3RzSW52YWxpZGF0ZWRBdERvY3VtZW50LmFkZChsaXN0KTsKK30KKwor
dm9pZCBEb2N1bWVudDo6dW5yZWdpc3Rlck5vZGVMaXN0Q2FjaGUoRHluYW1pY05vZGVMaXN0Q2Fj
aGVCYXNlKiBsaXN0KQoreworICAgIGlmIChsaXN0LT50eXBlKCkgIT0gTm9kZUxpc3RDb2xsZWN0
aW9uVHlwZSkKKyAgICAgICAgbV9ub2RlTGlzdENvdW50c1tJbnZhbGlkYXRlT25JZE5hbWVBdHRy
Q2hhbmdlXS0tOworICAgIG1fbm9kZUxpc3RDb3VudHNbbGlzdC0+aW52YWxpZGF0aW9uVHlwZSgp
XS0tOworICAgIGlmIChsaXN0LT5pc1Jvb3RlZEF0RG9jdW1lbnQoKSkgeworICAgICAgICBBU1NF
UlQobV9saXN0c0ludmFsaWRhdGVkQXREb2N1bWVudC5jb250YWlucyhsaXN0KSk7CisgICAgICAg
IG1fbGlzdHNJbnZhbGlkYXRlZEF0RG9jdW1lbnQucmVtb3ZlKGxpc3QpOworICAgIH0KK30KKwor
dm9pZCBEb2N1bWVudDo6YXR0YWNoTm9kZUl0ZXJhdG9yKE5vZGVJdGVyYXRvciogbmkpCit7Cisg
ICAgbV9ub2RlSXRlcmF0b3JzLmFkZChuaSk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmRldGFjaE5v
ZGVJdGVyYXRvcihOb2RlSXRlcmF0b3IqIG5pKQoreworICAgIC8vIFRoZSBub2RlIGl0ZXJhdG9y
IGNhbiBiZSBkZXRhY2hlZCB3aXRob3V0IGhhdmluZyBiZWVuIGF0dGFjaGVkIGlmIGl0cyByb290
IG5vZGUgZGlkbid0IGhhdmUgYSBkb2N1bWVudAorICAgIC8vIHdoZW4gdGhlIGl0ZXJhdG9yIHdh
cyBjcmVhdGVkLCBidXQgaGFzIGl0IG5vdy4KKyAgICBtX25vZGVJdGVyYXRvcnMucmVtb3ZlKG5p
KTsKK30KKwordm9pZCBEb2N1bWVudDo6bW92ZU5vZGVJdGVyYXRvcnNUb05ld0RvY3VtZW50KE5v
ZGUqIG5vZGUsIERvY3VtZW50KiBuZXdEb2N1bWVudCkKK3sKKyAgICBIYXNoU2V0PE5vZGVJdGVy
YXRvcio+IG5vZGVJdGVyYXRvcnNMaXN0ID0gbV9ub2RlSXRlcmF0b3JzOworICAgIEhhc2hTZXQ8
Tm9kZUl0ZXJhdG9yKj46OmNvbnN0X2l0ZXJhdG9yIG5vZGVJdGVyYXRvcnNFbmQgPSBub2RlSXRl
cmF0b3JzTGlzdC5lbmQoKTsKKyAgICBmb3IgKEhhc2hTZXQ8Tm9kZUl0ZXJhdG9yKj46OmNvbnN0
X2l0ZXJhdG9yIGl0ID0gbm9kZUl0ZXJhdG9yc0xpc3QuYmVnaW4oKTsgaXQgIT0gbm9kZUl0ZXJh
dG9yc0VuZDsgKytpdCkgeworICAgICAgICBpZiAoKCppdCktPnJvb3QoKSA9PSBub2RlKSB7Cisg
ICAgICAgICAgICBkZXRhY2hOb2RlSXRlcmF0b3IoKml0KTsKKyAgICAgICAgICAgIG5ld0RvY3Vt
ZW50LT5hdHRhY2hOb2RlSXRlcmF0b3IoKml0KTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9p
ZCBEb2N1bWVudDo6dXBkYXRlUmFuZ2VzQWZ0ZXJDaGlsZHJlbkNoYW5nZWQoQ29udGFpbmVyTm9k
ZSogY29udGFpbmVyKQoreworICAgIGlmICghbV9yYW5nZXMuaXNFbXB0eSgpKSB7CisgICAgICAg
IEhhc2hTZXQ8UmFuZ2UqPjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV9yYW5nZXMuZW5kKCk7Cisg
ICAgICAgIGZvciAoSGFzaFNldDxSYW5nZSo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmFuZ2Vz
LmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkKKyAgICAgICAgICAgICgqaXQpLT5ub2RlQ2hpbGRy
ZW5DaGFuZ2VkKGNvbnRhaW5lcik7CisgICAgfQorfQorCit2b2lkIERvY3VtZW50Ojpub2RlQ2hp
bGRyZW5XaWxsQmVSZW1vdmVkKENvbnRhaW5lck5vZGUqIGNvbnRhaW5lcikKK3sKKyAgICBpZiAo
IW1fcmFuZ2VzLmlzRW1wdHkoKSkgeworICAgICAgICBIYXNoU2V0PFJhbmdlKj46OmNvbnN0X2l0
ZXJhdG9yIGVuZCA9IG1fcmFuZ2VzLmVuZCgpOworICAgICAgICBmb3IgKEhhc2hTZXQ8UmFuZ2Uq
Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3Jhbmdlcy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQp
CisgICAgICAgICAgICAoKml0KS0+bm9kZUNoaWxkcmVuV2lsbEJlUmVtb3ZlZChjb250YWluZXIp
OworICAgIH0KKworICAgIEhhc2hTZXQ8Tm9kZUl0ZXJhdG9yKj46OmNvbnN0X2l0ZXJhdG9yIG5v
ZGVJdGVyYXRvcnNFbmQgPSBtX25vZGVJdGVyYXRvcnMuZW5kKCk7CisgICAgZm9yIChIYXNoU2V0
PE5vZGVJdGVyYXRvcio+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fbm9kZUl0ZXJhdG9ycy5iZWdp
bigpOyBpdCAhPSBub2RlSXRlcmF0b3JzRW5kOyArK2l0KSB7CisgICAgICAgIGZvciAoTm9kZSog
biA9IGNvbnRhaW5lci0+Zmlyc3RDaGlsZCgpOyBuOyBuID0gbi0+bmV4dFNpYmxpbmcoKSkKKyAg
ICAgICAgICAgICgqaXQpLT5ub2RlV2lsbEJlUmVtb3ZlZChuKTsKKyAgICB9CisKKyAgICBpZiAo
RnJhbWUqIGZyYW1lID0gdGhpcy0+ZnJhbWUoKSkgeworICAgICAgICBmb3IgKE5vZGUqIG4gPSBj
b250YWluZXItPmZpcnN0Q2hpbGQoKTsgbjsgbiA9IG4tPm5leHRTaWJsaW5nKCkpIHsKKyAgICAg
ICAgICAgIGZyYW1lLT5ldmVudEhhbmRsZXIoKS0+bm9kZVdpbGxCZVJlbW92ZWQobik7CisgICAg
ICAgICAgICBmcmFtZS0+c2VsZWN0aW9uKCktPm5vZGVXaWxsQmVSZW1vdmVkKG4pOworICAgICAg
ICAgICAgZnJhbWUtPnBhZ2UoKS0+ZHJhZ0NhcmV0Q29udHJvbGxlcigpLT5ub2RlV2lsbEJlUmVt
b3ZlZChuKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBEb2N1bWVudDo6bm9kZVdpbGxC
ZVJlbW92ZWQoTm9kZSogbikKK3sKKyAgICBIYXNoU2V0PE5vZGVJdGVyYXRvcio+Ojpjb25zdF9p
dGVyYXRvciBub2RlSXRlcmF0b3JzRW5kID0gbV9ub2RlSXRlcmF0b3JzLmVuZCgpOworICAgIGZv
ciAoSGFzaFNldDxOb2RlSXRlcmF0b3IqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX25vZGVJdGVy
YXRvcnMuYmVnaW4oKTsgaXQgIT0gbm9kZUl0ZXJhdG9yc0VuZDsgKytpdCkKKyAgICAgICAgKCpp
dCktPm5vZGVXaWxsQmVSZW1vdmVkKG4pOworCisgICAgaWYgKCFtX3Jhbmdlcy5pc0VtcHR5KCkp
IHsKKyAgICAgICAgSGFzaFNldDxSYW5nZSo+Ojpjb25zdF9pdGVyYXRvciByYW5nZXNFbmQgPSBt
X3Jhbmdlcy5lbmQoKTsKKyAgICAgICAgZm9yIChIYXNoU2V0PFJhbmdlKj46OmNvbnN0X2l0ZXJh
dG9yIGl0ID0gbV9yYW5nZXMuYmVnaW4oKTsgaXQgIT0gcmFuZ2VzRW5kOyArK2l0KQorICAgICAg
ICAgICAgKCppdCktPm5vZGVXaWxsQmVSZW1vdmVkKG4pOworICAgIH0KKworICAgIGlmIChGcmFt
ZSogZnJhbWUgPSB0aGlzLT5mcmFtZSgpKSB7CisgICAgICAgIGZyYW1lLT5ldmVudEhhbmRsZXIo
KS0+bm9kZVdpbGxCZVJlbW92ZWQobik7CisgICAgICAgIGZyYW1lLT5zZWxlY3Rpb24oKS0+bm9k
ZVdpbGxCZVJlbW92ZWQobik7CisgICAgICAgIGZyYW1lLT5wYWdlKCktPmRyYWdDYXJldENvbnRy
b2xsZXIoKS0+bm9kZVdpbGxCZVJlbW92ZWQobik7CisgICAgfQorfQorCit2b2lkIERvY3VtZW50
Ojp0ZXh0SW5zZXJ0ZWQoTm9kZSogdGV4dCwgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBsZW5n
dGgpCit7CisgICAgaWYgKCFtX3Jhbmdlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgSGFzaFNldDxS
YW5nZSo+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBtX3Jhbmdlcy5lbmQoKTsKKyAgICAgICAgZm9y
IChIYXNoU2V0PFJhbmdlKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yYW5nZXMuYmVnaW4oKTsg
aXQgIT0gZW5kOyArK2l0KQorICAgICAgICAgICAgKCppdCktPnRleHRJbnNlcnRlZCh0ZXh0LCBv
ZmZzZXQsIGxlbmd0aCk7CisgICAgfQorCisgICAgLy8gVXBkYXRlIHRoZSBtYXJrZXJzIGZvciBz
cGVsbGluZyBhbmQgZ3JhbW1hciBjaGVja2luZy4KKyAgICBtX21hcmtlcnMtPnNoaWZ0TWFya2Vy
cyh0ZXh0LCBvZmZzZXQsIGxlbmd0aCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnRleHRSZW1vdmVk
KE5vZGUqIHRleHQsIHVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgbGVuZ3RoKQoreworICAgIGlm
ICghbV9yYW5nZXMuaXNFbXB0eSgpKSB7CisgICAgICAgIEhhc2hTZXQ8UmFuZ2UqPjo6Y29uc3Rf
aXRlcmF0b3IgZW5kID0gbV9yYW5nZXMuZW5kKCk7CisgICAgICAgIGZvciAoSGFzaFNldDxSYW5n
ZSo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmFuZ2VzLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytp
dCkKKyAgICAgICAgICAgICgqaXQpLT50ZXh0UmVtb3ZlZCh0ZXh0LCBvZmZzZXQsIGxlbmd0aCk7
CisgICAgfQorCisgICAgLy8gVXBkYXRlIHRoZSBtYXJrZXJzIGZvciBzcGVsbGluZyBhbmQgZ3Jh
bW1hciBjaGVja2luZy4KKyAgICBtX21hcmtlcnMtPnJlbW92ZU1hcmtlcnModGV4dCwgb2Zmc2V0
LCBsZW5ndGgpOworICAgIG1fbWFya2Vycy0+c2hpZnRNYXJrZXJzKHRleHQsIG9mZnNldCArIGxl
bmd0aCwgMCAtIGxlbmd0aCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnRleHROb2Rlc01lcmdlZChU
ZXh0KiBvbGROb2RlLCB1bnNpZ25lZCBvZmZzZXQpCit7CisgICAgaWYgKCFtX3Jhbmdlcy5pc0Vt
cHR5KCkpIHsKKyAgICAgICAgTm9kZVdpdGhJbmRleCBvbGROb2RlV2l0aEluZGV4KG9sZE5vZGUp
OworICAgICAgICBIYXNoU2V0PFJhbmdlKj46OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fcmFuZ2Vz
LmVuZCgpOworICAgICAgICBmb3IgKEhhc2hTZXQ8UmFuZ2UqPjo6Y29uc3RfaXRlcmF0b3IgaXQg
PSBtX3Jhbmdlcy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpCisgICAgICAgICAgICAoKml0KS0+
dGV4dE5vZGVzTWVyZ2VkKG9sZE5vZGVXaXRoSW5kZXgsIG9mZnNldCk7CisgICAgfQorCisgICAg
Ly8gRklYTUU6IFRoaXMgc2hvdWxkIHVwZGF0ZSBtYXJrZXJzIGZvciBzcGVsbGluZyBhbmQgZ3Jh
bW1hciBjaGVja2luZy4KK30KKwordm9pZCBEb2N1bWVudDo6dGV4dE5vZGVTcGxpdChUZXh0KiBv
bGROb2RlKQoreworICAgIGlmICghbV9yYW5nZXMuaXNFbXB0eSgpKSB7CisgICAgICAgIEhhc2hT
ZXQ8UmFuZ2UqPjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV9yYW5nZXMuZW5kKCk7CisgICAgICAg
IGZvciAoSGFzaFNldDxSYW5nZSo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmFuZ2VzLmJlZ2lu
KCk7IGl0ICE9IGVuZDsgKytpdCkKKyAgICAgICAgICAgICgqaXQpLT50ZXh0Tm9kZVNwbGl0KG9s
ZE5vZGUpOworICAgIH0KKworICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCB1cGRhdGUgbWFya2Vy
cyBmb3Igc3BlbGxpbmcgYW5kIGdyYW1tYXIgY2hlY2tpbmcuCit9CisKK3ZvaWQgRG9jdW1lbnQ6
OmNyZWF0ZURPTVdpbmRvdygpCit7CisgICAgQVNTRVJUKG1fZnJhbWUpOworICAgIEFTU0VSVCgh
bV9kb21XaW5kb3cpOworCisgICAgbV9kb21XaW5kb3cgPSBET01XaW5kb3c6OmNyZWF0ZSh0aGlz
KTsKKworICAgIEFTU0VSVChtX2RvbVdpbmRvdy0+ZG9jdW1lbnQoKSA9PSB0aGlzKTsKKyAgICBB
U1NFUlQobV9kb21XaW5kb3ctPmZyYW1lKCkgPT0gbV9mcmFtZSk7Cit9CisKK3ZvaWQgRG9jdW1l
bnQ6OnRha2VET01XaW5kb3dGcm9tKERvY3VtZW50KiBkb2N1bWVudCkKK3sKKyAgICBBU1NFUlQo
bV9mcmFtZSk7CisgICAgQVNTRVJUKCFtX2RvbVdpbmRvdyk7CisgICAgQVNTRVJUKGRvY3VtZW50
LT5kb21XaW5kb3coKSk7CisKKyAgICBtX2RvbVdpbmRvdyA9IGRvY3VtZW50LT5tX2RvbVdpbmRv
dy5yZWxlYXNlKCk7CisgICAgbV9kb21XaW5kb3ctPmRpZFNlY3VyZVRyYW5zaXRpb25Ubyh0aGlz
KTsKKworICAgIEFTU0VSVChtX2RvbVdpbmRvdy0+ZG9jdW1lbnQoKSA9PSB0aGlzKTsKKyAgICBB
U1NFUlQobV9kb21XaW5kb3ctPmZyYW1lKCkgPT0gbV9mcmFtZSk7Cit9CisKK3ZvaWQgRG9jdW1l
bnQ6OnNldFdpbmRvd0F0dHJpYnV0ZUV2ZW50TGlzdGVuZXIoY29uc3QgQXRvbWljU3RyaW5nJiBl
dmVudFR5cGUsIFBhc3NSZWZQdHI8RXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXIpCit7CisgICAgRE9N
V2luZG93KiBkb21XaW5kb3cgPSB0aGlzLT5kb21XaW5kb3coKTsKKyAgICBpZiAoIWRvbVdpbmRv
dykKKyAgICAgICAgcmV0dXJuOworICAgIGRvbVdpbmRvdy0+c2V0QXR0cmlidXRlRXZlbnRMaXN0
ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyKTsKK30KKworRXZlbnRMaXN0ZW5lciogRG9jdW1lbnQ6
OmdldFdpbmRvd0F0dHJpYnV0ZUV2ZW50TGlzdGVuZXIoY29uc3QgQXRvbWljU3RyaW5nJiBldmVu
dFR5cGUpCit7CisgICAgRE9NV2luZG93KiBkb21XaW5kb3cgPSB0aGlzLT5kb21XaW5kb3coKTsK
KyAgICBpZiAoIWRvbVdpbmRvdykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGRvbVdp
bmRvdy0+Z2V0QXR0cmlidXRlRXZlbnRMaXN0ZW5lcihldmVudFR5cGUpOworfQorCit2b2lkIERv
Y3VtZW50OjpkaXNwYXRjaFdpbmRvd0V2ZW50KFBhc3NSZWZQdHI8RXZlbnQ+IGV2ZW50LCAgUGFz
c1JlZlB0cjxFdmVudFRhcmdldD4gdGFyZ2V0KQoreworICAgIEFTU0VSVCghZXZlbnREaXNwYXRj
aEZvcmJpZGRlbigpKTsKKyAgICBET01XaW5kb3cqIGRvbVdpbmRvdyA9IHRoaXMtPmRvbVdpbmRv
dygpOworICAgIGlmICghZG9tV2luZG93KQorICAgICAgICByZXR1cm47CisgICAgZG9tV2luZG93
LT5kaXNwYXRjaEV2ZW50KGV2ZW50LCB0YXJnZXQpOworfQorCit2b2lkIERvY3VtZW50OjpkaXNw
YXRjaFdpbmRvd0xvYWRFdmVudCgpCit7CisgICAgQVNTRVJUKCFldmVudERpc3BhdGNoRm9yYmlk
ZGVuKCkpOworICAgIERPTVdpbmRvdyogZG9tV2luZG93ID0gdGhpcy0+ZG9tV2luZG93KCk7Cisg
ICAgaWYgKCFkb21XaW5kb3cpCisgICAgICAgIHJldHVybjsKKyAgICBkb21XaW5kb3ctPmRpc3Bh
dGNoTG9hZEV2ZW50KCk7CisgICAgbV9sb2FkRXZlbnRGaW5pc2hlZCA9IHRydWU7Cit9CisKK3Zv
aWQgRG9jdW1lbnQ6OmVucXVldWVXaW5kb3dFdmVudChQYXNzUmVmUHRyPEV2ZW50PiBldmVudCkK
K3sKKyAgICBldmVudC0+c2V0VGFyZ2V0KGRvbVdpbmRvdygpKTsKKyAgICBtX2V2ZW50UXVldWUt
PmVucXVldWVFdmVudChldmVudCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmVucXVldWVEb2N1bWVu
dEV2ZW50KFBhc3NSZWZQdHI8RXZlbnQ+IGV2ZW50KQoreworICAgIGV2ZW50LT5zZXRUYXJnZXQo
dGhpcyk7CisgICAgbV9ldmVudFF1ZXVlLT5lbnF1ZXVlRXZlbnQoZXZlbnQpOworfQorCitQYXNz
UmVmUHRyPEV2ZW50PiBEb2N1bWVudDo6Y3JlYXRlRXZlbnQoY29uc3QgU3RyaW5nJiBldmVudFR5
cGUsIEV4Y2VwdGlvbkNvZGUmIGVjKQoreworICAgIFJlZlB0cjxFdmVudD4gZXZlbnQgPSBFdmVu
dEZhY3Rvcnk6OmNyZWF0ZShldmVudFR5cGUpOworICAgIGlmIChldmVudCkKKyAgICAgICAgcmV0
dXJuIGV2ZW50LnJlbGVhc2UoKTsKKworICAgIGVjID0gTk9UX1NVUFBPUlRFRF9FUlI7CisgICAg
cmV0dXJuIDA7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmFkZE11dGF0aW9uRXZlbnRMaXN0ZW5lclR5
cGVJZkVuYWJsZWQoTGlzdGVuZXJUeXBlIGxpc3RlbmVyVHlwZSkKK3sKKyAgICBpZiAoQ29udGV4
dEZlYXR1cmVzOjptdXRhdGlvbkV2ZW50c0VuYWJsZWQodGhpcykpCisgICAgICAgIGFkZExpc3Rl
bmVyVHlwZShsaXN0ZW5lclR5cGUpOworfQorCit2b2lkIERvY3VtZW50OjphZGRMaXN0ZW5lclR5
cGVJZk5lZWRlZChjb25zdCBBdG9taWNTdHJpbmcmIGV2ZW50VHlwZSkKK3sKKyAgICBpZiAoZXZl
bnRUeXBlID09IGV2ZW50TmFtZXMoKS5ET01TdWJ0cmVlTW9kaWZpZWRFdmVudCkKKyAgICAgICAg
YWRkTXV0YXRpb25FdmVudExpc3RlbmVyVHlwZUlmRW5hYmxlZChET01TVUJUUkVFTU9ESUZJRURf
TElTVEVORVIpOworICAgIGVsc2UgaWYgKGV2ZW50VHlwZSA9PSBldmVudE5hbWVzKCkuRE9NTm9k
ZUluc2VydGVkRXZlbnQpCisgICAgICAgIGFkZE11dGF0aW9uRXZlbnRMaXN0ZW5lclR5cGVJZkVu
YWJsZWQoRE9NTk9ERUlOU0VSVEVEX0xJU1RFTkVSKTsKKyAgICBlbHNlIGlmIChldmVudFR5cGUg
PT0gZXZlbnROYW1lcygpLkRPTU5vZGVSZW1vdmVkRXZlbnQpCisgICAgICAgIGFkZE11dGF0aW9u
RXZlbnRMaXN0ZW5lclR5cGVJZkVuYWJsZWQoRE9NTk9ERVJFTU9WRURfTElTVEVORVIpOworICAg
IGVsc2UgaWYgKGV2ZW50VHlwZSA9PSBldmVudE5hbWVzKCkuRE9NTm9kZVJlbW92ZWRGcm9tRG9j
dW1lbnRFdmVudCkKKyAgICAgICAgYWRkTXV0YXRpb25FdmVudExpc3RlbmVyVHlwZUlmRW5hYmxl
ZChET01OT0RFUkVNT1ZFREZST01ET0NVTUVOVF9MSVNURU5FUik7CisgICAgZWxzZSBpZiAoZXZl
bnRUeXBlID09IGV2ZW50TmFtZXMoKS5ET01Ob2RlSW5zZXJ0ZWRJbnRvRG9jdW1lbnRFdmVudCkK
KyAgICAgICAgYWRkTXV0YXRpb25FdmVudExpc3RlbmVyVHlwZUlmRW5hYmxlZChET01OT0RFSU5T
RVJURURJTlRPRE9DVU1FTlRfTElTVEVORVIpOworICAgIGVsc2UgaWYgKGV2ZW50VHlwZSA9PSBl
dmVudE5hbWVzKCkuRE9NQXR0ck1vZGlmaWVkRXZlbnQpCisgICAgICAgIGFkZE11dGF0aW9uRXZl
bnRMaXN0ZW5lclR5cGVJZkVuYWJsZWQoRE9NQVRUUk1PRElGSUVEX0xJU1RFTkVSKTsKKyAgICBl
bHNlIGlmIChldmVudFR5cGUgPT0gZXZlbnROYW1lcygpLkRPTUNoYXJhY3RlckRhdGFNb2RpZmll
ZEV2ZW50KQorICAgICAgICBhZGRNdXRhdGlvbkV2ZW50TGlzdGVuZXJUeXBlSWZFbmFibGVkKERP
TUNIQVJBQ1RFUkRBVEFNT0RJRklFRF9MSVNURU5FUik7CisgICAgZWxzZSBpZiAoZXZlbnRUeXBl
ID09IGV2ZW50TmFtZXMoKS5vdmVyZmxvd2NoYW5nZWRFdmVudCkKKyAgICAgICAgYWRkTGlzdGVu
ZXJUeXBlKE9WRVJGTE9XQ0hBTkdFRF9MSVNURU5FUik7CisgICAgZWxzZSBpZiAoZXZlbnRUeXBl
ID09IGV2ZW50TmFtZXMoKS53ZWJraXRBbmltYXRpb25TdGFydEV2ZW50KQorICAgICAgICBhZGRM
aXN0ZW5lclR5cGUoQU5JTUFUSU9OU1RBUlRfTElTVEVORVIpOworICAgIGVsc2UgaWYgKGV2ZW50
VHlwZSA9PSBldmVudE5hbWVzKCkud2Via2l0QW5pbWF0aW9uRW5kRXZlbnQpCisgICAgICAgIGFk
ZExpc3RlbmVyVHlwZShBTklNQVRJT05FTkRfTElTVEVORVIpOworICAgIGVsc2UgaWYgKGV2ZW50
VHlwZSA9PSBldmVudE5hbWVzKCkud2Via2l0QW5pbWF0aW9uSXRlcmF0aW9uRXZlbnQpCisgICAg
ICAgIGFkZExpc3RlbmVyVHlwZShBTklNQVRJT05JVEVSQVRJT05fTElTVEVORVIpOworICAgIGVs
c2UgaWYgKGV2ZW50VHlwZSA9PSBldmVudE5hbWVzKCkud2Via2l0VHJhbnNpdGlvbkVuZEV2ZW50
KQorICAgICAgICBhZGRMaXN0ZW5lclR5cGUoVFJBTlNJVElPTkVORF9MSVNURU5FUik7CisgICAg
ZWxzZSBpZiAoZXZlbnRUeXBlID09IGV2ZW50TmFtZXMoKS5iZWZvcmVsb2FkRXZlbnQpCisgICAg
ICAgIGFkZExpc3RlbmVyVHlwZShCRUZPUkVMT0FEX0xJU1RFTkVSKTsKKyAgICBlbHNlIGlmIChl
dmVudFR5cGUgPT0gZXZlbnROYW1lcygpLnNjcm9sbEV2ZW50KQorICAgICAgICBhZGRMaXN0ZW5l
clR5cGUoU0NST0xMX0xJU1RFTkVSKTsKK30KKworQ1NTU3R5bGVEZWNsYXJhdGlvbiogRG9jdW1l
bnQ6OmdldE92ZXJyaWRlU3R5bGUoRWxlbWVudCosIGNvbnN0IFN0cmluZyYpCit7CisgICAgcmV0
dXJuIDA7Cit9CisKK0hUTUxGcmFtZU93bmVyRWxlbWVudCogRG9jdW1lbnQ6Om93bmVyRWxlbWVu
dCgpIGNvbnN0Cit7CisgICAgaWYgKCFmcmFtZSgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBy
ZXR1cm4gZnJhbWUoKS0+b3duZXJFbGVtZW50KCk7Cit9CisKK1N0cmluZyBEb2N1bWVudDo6Y29v
a2llKEV4Y2VwdGlvbkNvZGUmIGVjKSBjb25zdAoreworICAgIGlmIChwYWdlKCkgJiYgIXBhZ2Uo
KS0+c2V0dGluZ3MoKS0+Y29va2llRW5hYmxlZCgpKQorICAgICAgICByZXR1cm4gU3RyaW5nKCk7
CisKKyAgICAvLyBGSVhNRTogVGhlIEhUTUw1IERPTSBzcGVjIHN0YXRlcyB0aGF0IHRoaXMgYXR0
cmlidXRlIGNhbiByYWlzZSBhbgorICAgIC8vIElOVkFMSURfU1RBVEVfRVJSIGV4Y2VwdGlvbiBv
biBnZXR0aW5nIGlmIHRoZSBEb2N1bWVudCBoYXMgbm8KKyAgICAvLyBicm93c2luZyBjb250ZXh0
LgorCisgICAgaWYgKCFzZWN1cml0eU9yaWdpbigpLT5jYW5BY2Nlc3NDb29raWVzKCkpIHsKKyAg
ICAgICAgZWMgPSBTRUNVUklUWV9FUlI7CisgICAgICAgIHJldHVybiBTdHJpbmcoKTsKKyAgICB9
CisKKyAgICBLVVJMIGNvb2tpZVVSTCA9IHRoaXMtPmNvb2tpZVVSTCgpOworICAgIGlmIChjb29r
aWVVUkwuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gU3RyaW5nKCk7CisKKyAgICByZXR1cm4g
Y29va2llcyh0aGlzLCBjb29raWVVUkwpOworfQorCit2b2lkIERvY3VtZW50OjpzZXRDb29raWUo
Y29uc3QgU3RyaW5nJiB2YWx1ZSwgRXhjZXB0aW9uQ29kZSYgZWMpCit7CisgICAgaWYgKHBhZ2Uo
KSAmJiAhcGFnZSgpLT5zZXR0aW5ncygpLT5jb29raWVFbmFibGVkKCkpCisgICAgICAgIHJldHVy
bjsKKworICAgIC8vIEZJWE1FOiBUaGUgSFRNTDUgRE9NIHNwZWMgc3RhdGVzIHRoYXQgdGhpcyBh
dHRyaWJ1dGUgY2FuIHJhaXNlIGFuCisgICAgLy8gSU5WQUxJRF9TVEFURV9FUlIgZXhjZXB0aW9u
IG9uIHNldHRpbmcgaWYgdGhlIERvY3VtZW50IGhhcyBubworICAgIC8vIGJyb3dzaW5nIGNvbnRl
eHQuCisKKyAgICBpZiAoIXNlY3VyaXR5T3JpZ2luKCktPmNhbkFjY2Vzc0Nvb2tpZXMoKSkgewor
ICAgICAgICBlYyA9IFNFQ1VSSVRZX0VSUjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAg
IEtVUkwgY29va2llVVJMID0gdGhpcy0+Y29va2llVVJMKCk7CisgICAgaWYgKGNvb2tpZVVSTC5p
c0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIHNldENvb2tpZXModGhpcywgY29va2ll
VVJMLCB2YWx1ZSk7Cit9CisKK1N0cmluZyBEb2N1bWVudDo6cmVmZXJyZXIoKSBjb25zdAorewor
ICAgIGlmIChmcmFtZSgpKQorICAgICAgICByZXR1cm4gZnJhbWUoKS0+bG9hZGVyKCktPnJlZmVy
cmVyKCk7CisgICAgcmV0dXJuIFN0cmluZygpOworfQorCitTdHJpbmcgRG9jdW1lbnQ6OmRvbWFp
bigpIGNvbnN0Cit7CisgICAgcmV0dXJuIHNlY3VyaXR5T3JpZ2luKCktPmRvbWFpbigpOworfQor
Cit2b2lkIERvY3VtZW50OjpzZXREb21haW4oY29uc3QgU3RyaW5nJiBuZXdEb21haW4sIEV4Y2Vw
dGlvbkNvZGUmIGVjKQoreworICAgIGlmIChTY2hlbWVSZWdpc3RyeTo6aXNEb21haW5SZWxheGF0
aW9uRm9yYmlkZGVuRm9yVVJMU2NoZW1lKHNlY3VyaXR5T3JpZ2luKCktPnByb3RvY29sKCkpKSB7
CisgICAgICAgIGVjID0gU0VDVVJJVFlfRVJSOworICAgICAgICByZXR1cm47CisgICAgfQorCisg
ICAgLy8gQm90aCBOUyBhbmQgSUUgc3BlY2lmeSB0aGF0IGNoYW5naW5nIHRoZSBkb21haW4gaXMg
b25seSBhbGxvd2VkIHdoZW4KKyAgICAvLyB0aGUgbmV3IGRvbWFpbiBpcyBhIHN1ZmZpeCBvZiB0
aGUgb2xkIGRvbWFpbi4KKworICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgYWRkIGxvZ2dpbmcgaW5k
aWNhdGluZyB3aHkgYSBkb21haW4gd2FzIG5vdCBhbGxvd2VkLgorCisgICAgLy8gSWYgdGhlIG5l
dyBkb21haW4gaXMgdGhlIHNhbWUgYXMgdGhlIG9sZCBkb21haW4sIHN0aWxsIGNhbGwKKyAgICAv
LyBzZWN1cml0eU9yaWdpbigpLT5zZXREb21haW5Gb3JET00uIFRoaXMgd2lsbCBjaGFuZ2UgdGhl
CisgICAgLy8gc2VjdXJpdHkgY2hlY2sgYmVoYXZpb3IuIEZvciBleGFtcGxlLCBpZiBhIHBhZ2Ug
bG9hZGVkIG9uIHBvcnQgODAwMAorICAgIC8vIGFzc2lnbnMgaXRzIGN1cnJlbnQgZG9tYWluIHVz
aW5nIGRvY3VtZW50LmRvbWFpbiwgdGhlIHBhZ2Ugd2lsbAorICAgIC8vIGFsbG93IG90aGVyIHBh
Z2VzIGxvYWRlZCBvbiBkaWZmZXJlbnQgcG9ydHMgaW4gdGhlIHNhbWUgZG9tYWluIHRoYXQKKyAg
ICAvLyBoYXZlIGFsc28gYXNzaWduZWQgdG8gYWNjZXNzIHRoaXMgcGFnZS4KKyAgICBpZiAoZXF1
YWxJZ25vcmluZ0Nhc2UoZG9tYWluKCksIG5ld0RvbWFpbikpIHsKKyAgICAgICAgc2VjdXJpdHlP
cmlnaW4oKS0+c2V0RG9tYWluRnJvbURPTShuZXdEb21haW4pOworICAgICAgICBpZiAobV9mcmFt
ZSkKKyAgICAgICAgICAgIG1fZnJhbWUtPnNjcmlwdCgpLT51cGRhdGVTZWN1cml0eU9yaWdpbigp
OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50IG9sZExlbmd0aCA9IGRvbWFpbigp
Lmxlbmd0aCgpOworICAgIGludCBuZXdMZW5ndGggPSBuZXdEb21haW4ubGVuZ3RoKCk7CisgICAg
Ly8gZS5nLiBuZXdEb21haW4gPSB3ZWJraXQub3JnICgxMCkgYW5kIGRvbWFpbigpID0gd3d3Lndl
YmtpdC5vcmcgKDE0KQorICAgIGlmIChuZXdMZW5ndGggPj0gb2xkTGVuZ3RoKSB7CisgICAgICAg
IGVjID0gU0VDVVJJVFlfRVJSOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgU3RyaW5n
IHRlc3QgPSBkb21haW4oKTsKKyAgICAvLyBDaGVjayB0aGF0IGl0J3MgYSBzdWJkb21haW4sIG5v
dCBlLmcuICJlYmtpdC5vcmciCisgICAgaWYgKHRlc3Rbb2xkTGVuZ3RoIC0gbmV3TGVuZ3RoIC0g
MV0gIT0gJy4nKSB7CisgICAgICAgIGVjID0gU0VDVVJJVFlfRVJSOworICAgICAgICByZXR1cm47
CisgICAgfQorCisgICAgLy8gTm93IHRlc3QgaXMgIndlYmtpdC5vcmciIGZyb20gZG9tYWluKCkK
KyAgICAvLyBhbmQgd2UgY2hlY2sgdGhhdCBpdCdzIHRoZSBzYW1lIHRoaW5nIGFzIG5ld0RvbWFp
bgorICAgIHRlc3QucmVtb3ZlKDAsIG9sZExlbmd0aCAtIG5ld0xlbmd0aCk7CisgICAgaWYgKHRl
c3QgIT0gbmV3RG9tYWluKSB7CisgICAgICAgIGVjID0gU0VDVVJJVFlfRVJSOworICAgICAgICBy
ZXR1cm47CisgICAgfQorCisgICAgc2VjdXJpdHlPcmlnaW4oKS0+c2V0RG9tYWluRnJvbURPTShu
ZXdEb21haW4pOworICAgIGlmIChtX2ZyYW1lKQorICAgICAgICBtX2ZyYW1lLT5zY3JpcHQoKS0+
dXBkYXRlU2VjdXJpdHlPcmlnaW4oKTsKK30KKworLy8gaHR0cDovL3d3dy53aGF0d2cub3JnL3Nw
ZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay8jZG9tLWRvY3VtZW50LWxhc3Rtb2RpZmllZAorU3Ry
aW5nIERvY3VtZW50OjpsYXN0TW9kaWZpZWQoKSBjb25zdAoreworICAgIERhdGVDb21wb25lbnRz
IGRhdGU7CisgICAgYm9vbCBmb3VuZERhdGUgPSBmYWxzZTsKKyAgICBpZiAobV9mcmFtZSkgewor
ICAgICAgICBTdHJpbmcgaHR0cExhc3RNb2RpZmllZDsKKyAgICAgICAgaWYgKERvY3VtZW50TG9h
ZGVyKiBkb2N1bWVudExvYWRlciA9IGxvYWRlcigpKSAKKyAgICAgICAgICAgIGh0dHBMYXN0TW9k
aWZpZWQgPSBkb2N1bWVudExvYWRlci0+cmVzcG9uc2UoKS5odHRwSGVhZGVyRmllbGQoIkxhc3Qt
TW9kaWZpZWQiKTsKKyAgICAgICAgaWYgKCFodHRwTGFzdE1vZGlmaWVkLmlzRW1wdHkoKSkgewor
ICAgICAgICAgICAgZGF0ZS5zZXRNaWxsaXNlY29uZHNTaW5jZUVwb2NoRm9yRGF0ZVRpbWUocGFy
c2VEYXRlKGh0dHBMYXN0TW9kaWZpZWQpKTsKKyAgICAgICAgICAgIGZvdW5kRGF0ZSA9IHRydWU7
CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gRklYTUU6IElmIHRoaXMgZG9jdW1lbnQgY2FtZSBm
cm9tIHRoZSBmaWxlIHN5c3RlbSwgdGhlIEhUTUw1CisgICAgLy8gc3BlY2lmaWNpYXRpb24gdGVs
bHMgdXMgdG8gcmVhZCB0aGUgbGFzdCBtb2RpZmljYXRpb24gZGF0ZSBmcm9tIHRoZSBmaWxlCisg
ICAgLy8gc3lzdGVtLgorICAgIGlmICghZm91bmREYXRlKQorICAgICAgICBkYXRlLnNldE1pbGxp
c2Vjb25kc1NpbmNlRXBvY2hGb3JEYXRlVGltZShjdXJyZW50VGltZU1TKCkpOworICAgIHJldHVy
biBTdHJpbmc6OmZvcm1hdCgiJTAyZC8lMDJkLyUwNGQgJTAyZDolMDJkOiUwMmQiLCBkYXRlLm1v
bnRoKCkgKyAxLCBkYXRlLm1vbnRoRGF5KCksIGRhdGUuZnVsbFllYXIoKSwgZGF0ZS5ob3VyKCks
IGRhdGUubWludXRlKCksIGRhdGUuc2Vjb25kKCkpOworfQorCitzdGF0aWMgYm9vbCBpc1ZhbGlk
TmFtZU5vbkFTQ0lJKGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCB1bnNpZ25lZCBsZW5ndGgpCit7
CisgICAgdW5zaWduZWQgaSA9IDA7CisKKyAgICBVQ2hhcjMyIGM7CisgICAgVTE2X05FWFQoY2hh
cmFjdGVycywgaSwgbGVuZ3RoLCBjKQorICAgIGlmICghaXNWYWxpZE5hbWVTdGFydChjKSkKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgd2hpbGUgKGkgPCBsZW5ndGgpIHsKKyAgICAgICAg
VTE2X05FWFQoY2hhcmFjdGVycywgaSwgbGVuZ3RoLCBjKQorICAgICAgICBpZiAoIWlzVmFsaWRO
YW1lUGFydChjKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1
cm4gdHJ1ZTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgQ2hhclR5cGU+CitzdGF0aWMgaW5saW5l
IGJvb2wgaXNWYWxpZE5hbWVBU0NJSShjb25zdCBDaGFyVHlwZSogY2hhcmFjdGVycywgdW5zaWdu
ZWQgbGVuZ3RoKQoreworICAgIENoYXJUeXBlIGMgPSBjaGFyYWN0ZXJzWzBdOworICAgIGlmICgh
KGlzQVNDSUlBbHBoYShjKSB8fCBjID09ICc6JyB8fCBjID09ICdfJykpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDE7IGkgPCBsZW5ndGg7ICsraSkgewor
ICAgICAgICBjID0gY2hhcmFjdGVyc1tpXTsKKyAgICAgICAgaWYgKCEoaXNBU0NJSUFscGhhbnVt
ZXJpYyhjKSB8fCBjID09ICc6JyB8fCBjID09ICdfJyB8fCBjID09ICctJyB8fCBjID09ICcuJykp
CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9
CisKK2Jvb2wgRG9jdW1lbnQ6OmlzVmFsaWROYW1lKGNvbnN0IFN0cmluZyYgbmFtZSkKK3sKKyAg
ICB1bnNpZ25lZCBsZW5ndGggPSBuYW1lLmxlbmd0aCgpOworICAgIGlmICghbGVuZ3RoKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBjb25zdCBVQ2hhciogY2hhcmFjdGVyczsKKyAgICBp
ZiAobmFtZS5pczhCaXQoKSkgeworICAgICAgICBpZiAoaXNWYWxpZE5hbWVBU0NJSShuYW1lLmNo
YXJhY3RlcnM4KCksIGxlbmd0aCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAg
Y2hhcmFjdGVycyA9IG5hbWUuY2hhcmFjdGVycygpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNo
YXJhY3RlcnMgPSBuYW1lLmNoYXJhY3RlcnMxNigpOworICAgICAgICBpZiAoaXNWYWxpZE5hbWVB
U0NJSShjaGFyYWN0ZXJzLCBsZW5ndGgpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
fQorICAgIHJldHVybiBpc1ZhbGlkTmFtZU5vbkFTQ0lJKGNoYXJhY3RlcnMsIGxlbmd0aCk7Cit9
CisKK2Jvb2wgRG9jdW1lbnQ6OnBhcnNlUXVhbGlmaWVkTmFtZShjb25zdCBTdHJpbmcmIHF1YWxp
ZmllZE5hbWUsIFN0cmluZyYgcHJlZml4LCBTdHJpbmcmIGxvY2FsTmFtZSwgRXhjZXB0aW9uQ29k
ZSYgZWMpCit7CisgICAgdW5zaWduZWQgbGVuZ3RoID0gcXVhbGlmaWVkTmFtZS5sZW5ndGgoKTsK
KworICAgIGlmICghbGVuZ3RoKSB7CisgICAgICAgIGVjID0gSU5WQUxJRF9DSEFSQUNURVJfRVJS
OworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCBuYW1lU3RhcnQgPSB0
cnVlOworICAgIGJvb2wgc2F3Q29sb24gPSBmYWxzZTsKKyAgICBpbnQgY29sb25Qb3MgPSAwOwor
CisgICAgY29uc3QgVUNoYXIqIHMgPSBxdWFsaWZpZWROYW1lLmNoYXJhY3RlcnMoKTsKKyAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVuZ3RoOykgeworICAgICAgICBVQ2hhcjMyIGM7Cisg
ICAgICAgIFUxNl9ORVhUKHMsIGksIGxlbmd0aCwgYykKKyAgICAgICAgaWYgKGMgPT0gJzonKSB7
CisgICAgICAgICAgICBpZiAoc2F3Q29sb24pIHsKKyAgICAgICAgICAgICAgICBlYyA9IE5BTUVT
UEFDRV9FUlI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBtdWx0aXBsZSBjb2xv
bnM6IG5vdCBhbGxvd2VkCisgICAgICAgICAgICB9CisgICAgICAgICAgICBuYW1lU3RhcnQgPSB0
cnVlOworICAgICAgICAgICAgc2F3Q29sb24gPSB0cnVlOworICAgICAgICAgICAgY29sb25Qb3Mg
PSBpIC0gMTsKKyAgICAgICAgfSBlbHNlIGlmIChuYW1lU3RhcnQpIHsKKyAgICAgICAgICAgIGlm
ICghaXNWYWxpZE5hbWVTdGFydChjKSkgeworICAgICAgICAgICAgICAgIGVjID0gSU5WQUxJRF9D
SEFSQUNURVJfRVJSOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIG5hbWVTdGFydCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAg
ICAgICAgICAgaWYgKCFpc1ZhbGlkTmFtZVBhcnQoYykpIHsKKyAgICAgICAgICAgICAgICBlYyA9
IElOVkFMSURfQ0hBUkFDVEVSX0VSUjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXNhd0NvbG9uKSB7Cisg
ICAgICAgIHByZWZpeCA9IFN0cmluZygpOworICAgICAgICBsb2NhbE5hbWUgPSBxdWFsaWZpZWRO
YW1lOworICAgIH0gZWxzZSB7CisgICAgICAgIHByZWZpeCA9IHF1YWxpZmllZE5hbWUuc3Vic3Ry
aW5nKDAsIGNvbG9uUG9zKTsKKyAgICAgICAgaWYgKHByZWZpeC5pc0VtcHR5KCkpIHsKKyAgICAg
ICAgICAgIGVjID0gTkFNRVNQQUNFX0VSUjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICAgICAgfQorICAgICAgICBsb2NhbE5hbWUgPSBxdWFsaWZpZWROYW1lLnN1YnN0cmluZyhjb2xv
blBvcyArIDEpOworICAgIH0KKworICAgIGlmIChsb2NhbE5hbWUuaXNFbXB0eSgpKSB7CisgICAg
ICAgIGVjID0gTkFNRVNQQUNFX0VSUjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwor
ICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIERvY3VtZW50OjpzZXREZWNvZGVyKFBhc3NSZWZQ
dHI8VGV4dFJlc291cmNlRGVjb2Rlcj4gZGVjb2RlcikKK3sKKyAgICBtX2RlY29kZXIgPSBkZWNv
ZGVyOworfQorCitLVVJMIERvY3VtZW50Ojpjb21wbGV0ZVVSTChjb25zdCBTdHJpbmcmIHVybCwg
Y29uc3QgS1VSTCYgYmFzZVVSTE92ZXJyaWRlKSBjb25zdAoreworICAgIC8vIEFsd2F5cyByZXR1
cm4gYSBudWxsIFVSTCB3aGVuIHBhc3NlZCBhIG51bGwgc3RyaW5nLgorICAgIC8vIEZJWE1FOiBT
aG91bGQgd2UgY2hhbmdlIHRoZSBLVVJMIGNvbnN0cnVjdG9yIHRvIGhhdmUgdGhpcyBiZWhhdmlv
cj8KKyAgICAvLyBTZWUgYWxzbyBbQ1NTXVN0eWxlU2hlZXQ6OmNvbXBsZXRlVVJMKGNvbnN0IFN0
cmluZyYpCisgICAgaWYgKHVybC5pc051bGwoKSkKKyAgICAgICAgcmV0dXJuIEtVUkwoKTsKKyAg
ICBjb25zdCBLVVJMJiBiYXNlVVJMID0gKChiYXNlVVJMT3ZlcnJpZGUuaXNFbXB0eSgpIHx8IGJh
c2VVUkxPdmVycmlkZSA9PSBibGFua1VSTCgpKSAmJiBwYXJlbnREb2N1bWVudCgpKSA/IHBhcmVu
dERvY3VtZW50KCktPmJhc2VVUkwoKSA6IGJhc2VVUkxPdmVycmlkZTsKKyAgICBpZiAoIW1fZGVj
b2RlcikKKyAgICAgICAgcmV0dXJuIEtVUkwoYmFzZVVSTCwgdXJsKTsKKyAgICByZXR1cm4gS1VS
TChiYXNlVVJMLCB1cmwsIG1fZGVjb2Rlci0+ZW5jb2RpbmcoKSk7Cit9CisKK0tVUkwgRG9jdW1l
bnQ6OmNvbXBsZXRlVVJMKGNvbnN0IFN0cmluZyYgdXJsKSBjb25zdAoreworICAgIHJldHVybiBj
b21wbGV0ZVVSTCh1cmwsIG1fYmFzZVVSTCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnNldEluUGFn
ZUNhY2hlKGJvb2wgZmxhZykKK3sKKyAgICBpZiAobV9pblBhZ2VDYWNoZSA9PSBmbGFnKQorICAg
ICAgICByZXR1cm47CisKKyAgICBtX2luUGFnZUNhY2hlID0gZmxhZzsKKworICAgIEZyYW1lVmll
dyogdiA9IHZpZXcoKTsKKyAgICBpZiAoZmxhZykgeworICAgICAgICBBU1NFUlQoIW1fc2F2ZWRS
ZW5kZXJlcik7CisgICAgICAgIG1fc2F2ZWRSZW5kZXJlciA9IHJlbmRlcmVyKCk7CisgICAgICAg
IGlmICh2KSB7CisgICAgICAgICAgICB2LT5jYWNoZUN1cnJlbnRTY3JvbGxQb3NpdGlvbigpOwor
ICAgICAgICAgICAgaWYgKHBhZ2UoKSAmJiBwYWdlKCktPm1haW5GcmFtZSgpID09IG1fZnJhbWUp
CisgICAgICAgICAgICAgICAgdi0+cmVzZXRTY3JvbGxiYXJzQW5kQ2xlYXJDb250ZW50c1NpemUo
KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB2LT5yZXNldFNjcm9sbGJhcnMo
KTsKKyAgICAgICAgfQorICAgICAgICBtX3N0eWxlUmVjYWxjVGltZXIuc3RvcCgpOworICAgIH0g
ZWxzZSB7CisgICAgICAgIEFTU0VSVCghcmVuZGVyZXIoKSB8fCByZW5kZXJlcigpID09IG1fc2F2
ZWRSZW5kZXJlcik7CisgICAgICAgIEFTU0VSVChtX3JlbmRlckFyZW5hKTsKKyAgICAgICAgc2V0
UmVuZGVyZXIobV9zYXZlZFJlbmRlcmVyKTsKKyAgICAgICAgbV9zYXZlZFJlbmRlcmVyID0gMDsK
KworICAgICAgICBpZiAoY2hpbGROZWVkc1N0eWxlUmVjYWxjKCkpCisgICAgICAgICAgICBzY2hl
ZHVsZVN0eWxlUmVjYWxjKCk7CisgICAgfQorfQorCit2b2lkIERvY3VtZW50Ojpkb2N1bWVudFdp
bGxCZWNvbWVJbmFjdGl2ZSgpCit7CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQor
ICAgIGlmIChyZW5kZXJlcigpKQorICAgICAgICByZW5kZXJWaWV3KCktPndpbGxNb3ZlT2Zmc2Ny
ZWVuKCk7CisjZW5kaWYKK30KKwordm9pZCBEb2N1bWVudDo6ZG9jdW1lbnRXaWxsU3VzcGVuZEZv
clBhZ2VDYWNoZSgpCit7CisgICAgZG9jdW1lbnRXaWxsQmVjb21lSW5hY3RpdmUoKTsKKworICAg
IEhhc2hTZXQ8RWxlbWVudCo+OjppdGVyYXRvciBlbmQgPSBtX2RvY3VtZW50U3VzcGVuc2lvbkNh
bGxiYWNrRWxlbWVudHMuZW5kKCk7CisgICAgZm9yIChIYXNoU2V0PEVsZW1lbnQqPjo6aXRlcmF0
b3IgaSA9IG1fZG9jdW1lbnRTdXNwZW5zaW9uQ2FsbGJhY2tFbGVtZW50cy5iZWdpbigpOyBpICE9
IGVuZDsgKytpKQorICAgICAgICAoKmkpLT5kb2N1bWVudFdpbGxTdXNwZW5kRm9yUGFnZUNhY2hl
KCk7CisKKyNpZm5kZWYgTkRFQlVHCisgICAgLy8gQ2xlYXIgdGhlIHVwZGF0ZSBmbGFnIHRvIGJl
IGFibGUgdG8gY2hlY2sgaWYgdGhlIHZpZXdwb3J0IGFyZ3VtZW50cyB1cGRhdGUKKyAgICAvLyBp
cyBkaXNwYXRjaGVkLCBhZnRlciB0aGUgZG9jdW1lbnQgaXMgcmVzdG9yZWQgZnJvbSB0aGUgcGFn
ZSBjYWNoZS4KKyAgICBtX2RpZERpc3BhdGNoVmlld3BvcnRQcm9wZXJ0aWVzQ2hhbmdlZCA9IGZh
bHNlOworI2VuZGlmCit9CisKK3ZvaWQgRG9jdW1lbnQ6OmRvY3VtZW50RGlkUmVzdW1lRnJvbVBh
Z2VDYWNoZSgpIAoreworICAgIFZlY3RvcjxFbGVtZW50Kj4gZWxlbWVudHM7CisgICAgY29weVRv
VmVjdG9yKG1fZG9jdW1lbnRTdXNwZW5zaW9uQ2FsbGJhY2tFbGVtZW50cywgZWxlbWVudHMpOwor
ICAgIFZlY3RvcjxFbGVtZW50Kj46Oml0ZXJhdG9yIGVuZCA9IGVsZW1lbnRzLmVuZCgpOworICAg
IGZvciAoVmVjdG9yPEVsZW1lbnQqPjo6aXRlcmF0b3IgaSA9IGVsZW1lbnRzLmJlZ2luKCk7IGkg
IT0gZW5kOyArK2kpCisgICAgICAgICgqaSktPmRvY3VtZW50RGlkUmVzdW1lRnJvbVBhZ2VDYWNo
ZSgpOworCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgIGlmIChyZW5kZXJl
cigpKQorICAgICAgICByZW5kZXJWaWV3KCktPmRpZE1vdmVPbnNjcmVlbigpOworI2VuZGlmCisK
KyAgICBpZiAoRnJhbWVWaWV3KiBmcmFtZVZpZXcgPSB2aWV3KCkpCisgICAgICAgIGZyYW1lVmll
dy0+c2V0QW5pbWF0b3JzQXJlQWN0aXZlKCk7CisKKyAgICBBU1NFUlQobV9mcmFtZSk7CisgICAg
bV9mcmFtZS0+bG9hZGVyKCktPmNsaWVudCgpLT5kaXNwYXRjaERpZEJlY29tZUZyYW1lc2V0KGlz
RnJhbWVTZXQoKSk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnJlZ2lzdGVyRm9yUGFnZUNhY2hlU3Vz
cGVuc2lvbkNhbGxiYWNrcyhFbGVtZW50KiBlKQoreworICAgIG1fZG9jdW1lbnRTdXNwZW5zaW9u
Q2FsbGJhY2tFbGVtZW50cy5hZGQoZSk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnVucmVnaXN0ZXJG
b3JQYWdlQ2FjaGVTdXNwZW5zaW9uQ2FsbGJhY2tzKEVsZW1lbnQqIGUpCit7CisgICAgbV9kb2N1
bWVudFN1c3BlbnNpb25DYWxsYmFja0VsZW1lbnRzLnJlbW92ZShlKTsKK30KKwordm9pZCBEb2N1
bWVudDo6bWVkaWFWb2x1bWVEaWRDaGFuZ2UoKSAKK3sKKyAgICBIYXNoU2V0PEVsZW1lbnQqPjo6
aXRlcmF0b3IgZW5kID0gbV9tZWRpYVZvbHVtZUNhbGxiYWNrRWxlbWVudHMuZW5kKCk7CisgICAg
Zm9yIChIYXNoU2V0PEVsZW1lbnQqPjo6aXRlcmF0b3IgaSA9IG1fbWVkaWFWb2x1bWVDYWxsYmFj
a0VsZW1lbnRzLmJlZ2luKCk7IGkgIT0gZW5kOyArK2kpCisgICAgICAgICgqaSktPm1lZGlhVm9s
dW1lRGlkQ2hhbmdlKCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnJlZ2lzdGVyRm9yTWVkaWFWb2x1
bWVDYWxsYmFja3MoRWxlbWVudCogZSkKK3sKKyAgICBtX21lZGlhVm9sdW1lQ2FsbGJhY2tFbGVt
ZW50cy5hZGQoZSk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnVucmVnaXN0ZXJGb3JNZWRpYVZvbHVt
ZUNhbGxiYWNrcyhFbGVtZW50KiBlKQoreworICAgIG1fbWVkaWFWb2x1bWVDYWxsYmFja0VsZW1l
bnRzLnJlbW92ZShlKTsKK30KKwordm9pZCBEb2N1bWVudDo6c3RvcmFnZUJsb2NraW5nU3RhdGVE
aWRDaGFuZ2UoKQoreworICAgIGlmIChTZXR0aW5ncyogc2V0dGluZ3MgPSB0aGlzLT5zZXR0aW5n
cygpKQorICAgICAgICBzZWN1cml0eU9yaWdpbigpLT5zZXRTdG9yYWdlQmxvY2tpbmdQb2xpY3ko
c2V0dGluZ3MtPnN0b3JhZ2VCbG9ja2luZ1BvbGljeSgpKTsKK30KKwordm9pZCBEb2N1bWVudDo6
cHJpdmF0ZUJyb3dzaW5nU3RhdGVEaWRDaGFuZ2UoKSAKK3sKKyAgICBIYXNoU2V0PEVsZW1lbnQq
Pjo6aXRlcmF0b3IgZW5kID0gbV9wcml2YXRlQnJvd3NpbmdTdGF0ZUNoYW5nZWRFbGVtZW50cy5l
bmQoKTsKKyAgICBmb3IgKEhhc2hTZXQ8RWxlbWVudCo+OjppdGVyYXRvciBpdCA9IG1fcHJpdmF0
ZUJyb3dzaW5nU3RhdGVDaGFuZ2VkRWxlbWVudHMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KQor
ICAgICAgICAoKml0KS0+cHJpdmF0ZUJyb3dzaW5nU3RhdGVEaWRDaGFuZ2UoKTsKK30KKwordm9p
ZCBEb2N1bWVudDo6cmVnaXN0ZXJGb3JQcml2YXRlQnJvd3NpbmdTdGF0ZUNoYW5nZWRDYWxsYmFj
a3MoRWxlbWVudCogZSkKK3sKKyAgICBtX3ByaXZhdGVCcm93c2luZ1N0YXRlQ2hhbmdlZEVsZW1l
bnRzLmFkZChlKTsKK30KKwordm9pZCBEb2N1bWVudDo6dW5yZWdpc3RlckZvclByaXZhdGVCcm93
c2luZ1N0YXRlQ2hhbmdlZENhbGxiYWNrcyhFbGVtZW50KiBlKQoreworICAgIG1fcHJpdmF0ZUJy
b3dzaW5nU3RhdGVDaGFuZ2VkRWxlbWVudHMucmVtb3ZlKGUpOworfQorCit2b2lkIERvY3VtZW50
OjpzZXRTaG91bGRDcmVhdGVSZW5kZXJlcnMoYm9vbCBmKQoreworICAgIG1fY3JlYXRlUmVuZGVy
ZXJzID0gZjsKK30KKworYm9vbCBEb2N1bWVudDo6c2hvdWxkQ3JlYXRlUmVuZGVyZXJzKCkKK3sK
KyAgICByZXR1cm4gbV9jcmVhdGVSZW5kZXJlcnM7Cit9CisKKy8vIFN1cHBvcnQgZm9yIEphdmFz
Y3JpcHQgZXhlY0NvbW1hbmQsIGFuZCByZWxhdGVkIG1ldGhvZHMKKworc3RhdGljIEVkaXRvcjo6
Q29tbWFuZCBjb21tYW5kKERvY3VtZW50KiBkb2N1bWVudCwgY29uc3QgU3RyaW5nJiBjb21tYW5k
TmFtZSwgYm9vbCB1c2VySW50ZXJmYWNlID0gZmFsc2UpCit7CisgICAgRnJhbWUqIGZyYW1lID0g
ZG9jdW1lbnQtPmZyYW1lKCk7CisgICAgaWYgKCFmcmFtZSB8fCBmcmFtZS0+ZG9jdW1lbnQoKSAh
PSBkb2N1bWVudCkKKyAgICAgICAgcmV0dXJuIEVkaXRvcjo6Q29tbWFuZCgpOworCisgICAgZG9j
dW1lbnQtPnVwZGF0ZVN0eWxlSWZOZWVkZWQoKTsKKworICAgIHJldHVybiBmcmFtZS0+ZWRpdG9y
KCktPmNvbW1hbmQoY29tbWFuZE5hbWUsCisgICAgICAgIHVzZXJJbnRlcmZhY2UgPyBDb21tYW5k
RnJvbURPTVdpdGhVc2VySW50ZXJmYWNlIDogQ29tbWFuZEZyb21ET00pOworfQorCitib29sIERv
Y3VtZW50OjpleGVjQ29tbWFuZChjb25zdCBTdHJpbmcmIGNvbW1hbmROYW1lLCBib29sIHVzZXJJ
bnRlcmZhY2UsIGNvbnN0IFN0cmluZyYgdmFsdWUpCit7CisgICAgcmV0dXJuIGNvbW1hbmQodGhp
cywgY29tbWFuZE5hbWUsIHVzZXJJbnRlcmZhY2UpLmV4ZWN1dGUodmFsdWUpOworfQorCitib29s
IERvY3VtZW50OjpxdWVyeUNvbW1hbmRFbmFibGVkKGNvbnN0IFN0cmluZyYgY29tbWFuZE5hbWUp
Cit7CisgICAgcmV0dXJuIGNvbW1hbmQodGhpcywgY29tbWFuZE5hbWUpLmlzRW5hYmxlZCgpOwor
fQorCitib29sIERvY3VtZW50OjpxdWVyeUNvbW1hbmRJbmRldGVybShjb25zdCBTdHJpbmcmIGNv
bW1hbmROYW1lKQoreworICAgIHJldHVybiBjb21tYW5kKHRoaXMsIGNvbW1hbmROYW1lKS5zdGF0
ZSgpID09IE1peGVkVHJpU3RhdGU7Cit9CisKK2Jvb2wgRG9jdW1lbnQ6OnF1ZXJ5Q29tbWFuZFN0
YXRlKGNvbnN0IFN0cmluZyYgY29tbWFuZE5hbWUpCit7CisgICAgcmV0dXJuIGNvbW1hbmQodGhp
cywgY29tbWFuZE5hbWUpLnN0YXRlKCkgPT0gVHJ1ZVRyaVN0YXRlOworfQorCitib29sIERvY3Vt
ZW50OjpxdWVyeUNvbW1hbmRTdXBwb3J0ZWQoY29uc3QgU3RyaW5nJiBjb21tYW5kTmFtZSkKK3sK
KyAgICByZXR1cm4gY29tbWFuZCh0aGlzLCBjb21tYW5kTmFtZSkuaXNTdXBwb3J0ZWQoKTsKK30K
KworU3RyaW5nIERvY3VtZW50OjpxdWVyeUNvbW1hbmRWYWx1ZShjb25zdCBTdHJpbmcmIGNvbW1h
bmROYW1lKQoreworICAgIHJldHVybiBjb21tYW5kKHRoaXMsIGNvbW1hbmROYW1lKS52YWx1ZSgp
OworfQorCitLVVJMIERvY3VtZW50OjpvcGVuU2VhcmNoRGVzY3JpcHRpb25VUkwoKQoreworICAg
IHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBvcGVuU2VhcmNoTUlNRVR5cGUgPSAiYXBwbGljYXRp
b24vb3BlbnNlYXJjaGRlc2NyaXB0aW9uK3htbCI7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGNv
bnN0IG9wZW5TZWFyY2hSZWxhdGlvbiA9ICJzZWFyY2giOworCisgICAgLy8gRklYTUU6IFdoeSBk
byBvbmx5IHRvcC1sZXZlbCBmcmFtZXMgaGF2ZSBvcGVuU2VhcmNoRGVzY3JpcHRpb25VUkxzPwor
ICAgIGlmICghZnJhbWUoKSB8fCBmcmFtZSgpLT50cmVlKCktPnBhcmVudCgpKQorICAgICAgICBy
ZXR1cm4gS1VSTCgpOworCisgICAgLy8gRklYTUU6IFdoeSBkbyB3ZSBuZWVkIHRvIHdhaXQgZm9y
IEZyYW1lU3RhdGVDb21wbGV0ZT8KKyAgICBpZiAoZnJhbWUoKS0+bG9hZGVyKCktPnN0YXRlKCkg
IT0gRnJhbWVTdGF0ZUNvbXBsZXRlKQorICAgICAgICByZXR1cm4gS1VSTCgpOworCisgICAgaWYg
KCFoZWFkKCkpCisgICAgICAgIHJldHVybiBLVVJMKCk7CisKKyAgICBSZWZQdHI8SFRNTENvbGxl
Y3Rpb24+IGNoaWxkcmVuID0gaGVhZCgpLT5jaGlsZHJlbigpOworICAgIGZvciAodW5zaWduZWQg
aSA9IDA7IE5vZGUqIGNoaWxkID0gY2hpbGRyZW4tPml0ZW0oaSk7IGkrKykgeworICAgICAgICBp
ZiAoIWNoaWxkLT5oYXNUYWdOYW1lKGxpbmtUYWcpKQorICAgICAgICAgICAgY29udGludWU7Cisg
ICAgICAgIEhUTUxMaW5rRWxlbWVudCogbGlua0VsZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MTGlu
a0VsZW1lbnQqPihjaGlsZCk7CisgICAgICAgIGlmICghZXF1YWxJZ25vcmluZ0Nhc2UobGlua0Vs
ZW1lbnQtPnR5cGUoKSwgb3BlblNlYXJjaE1JTUVUeXBlKSB8fCAhZXF1YWxJZ25vcmluZ0Nhc2Uo
bGlua0VsZW1lbnQtPnJlbCgpLCBvcGVuU2VhcmNoUmVsYXRpb24pKQorICAgICAgICAgICAgY29u
dGludWU7CisgICAgICAgIGlmIChsaW5rRWxlbWVudC0+aHJlZigpLmlzRW1wdHkoKSkKKyAgICAg
ICAgICAgIGNvbnRpbnVlOworICAgICAgICByZXR1cm4gbGlua0VsZW1lbnQtPmhyZWYoKTsKKyAg
ICB9CisKKyAgICByZXR1cm4gS1VSTCgpOworfQorCisjaWYgRU5BQkxFKFhTTFQpCisKK3ZvaWQg
RG9jdW1lbnQ6OmFwcGx5WFNMVHJhbnNmb3JtKFByb2Nlc3NpbmdJbnN0cnVjdGlvbiogcGkpCit7
CisgICAgUmVmUHRyPFhTTFRQcm9jZXNzb3I+IHByb2Nlc3NvciA9IFhTTFRQcm9jZXNzb3I6OmNy
ZWF0ZSgpOworICAgIHByb2Nlc3Nvci0+c2V0WFNMU3R5bGVTaGVldChzdGF0aWNfY2FzdDxYU0xT
dHlsZVNoZWV0Kj4ocGktPnNoZWV0KCkpKTsKKyAgICBTdHJpbmcgcmVzdWx0TUlNRVR5cGU7Cisg
ICAgU3RyaW5nIG5ld1NvdXJjZTsKKyAgICBTdHJpbmcgcmVzdWx0RW5jb2Rpbmc7CisgICAgaWYg
KCFwcm9jZXNzb3ItPnRyYW5zZm9ybVRvU3RyaW5nKHRoaXMsIHJlc3VsdE1JTUVUeXBlLCBuZXdT
b3VyY2UsIHJlc3VsdEVuY29kaW5nKSkKKyAgICAgICAgcmV0dXJuOworICAgIC8vIEZJWE1FOiBJ
ZiB0aGUgdHJhbnNmb3JtIGZhaWxlZCB3ZSBzaG91bGQgcHJvYmFibHkgcmVwb3J0IGFuIGVycm9y
IChsaWtlIE1vemlsbGEgZG9lcykuCisgICAgcHJvY2Vzc29yLT5jcmVhdGVEb2N1bWVudEZyb21T
b3VyY2UobmV3U291cmNlLCByZXN1bHRFbmNvZGluZywgcmVzdWx0TUlNRVR5cGUsIHRoaXMsIGZy
YW1lKCkpOworfQorCit2b2lkIERvY3VtZW50OjpzZXRUcmFuc2Zvcm1Tb3VyY2UoUGFzc093blB0
cjxUcmFuc2Zvcm1Tb3VyY2U+IHNvdXJjZSkKK3sKKyAgICBtX3RyYW5zZm9ybVNvdXJjZSA9IHNv
dXJjZTsKK30KKworI2VuZGlmCisKK3ZvaWQgRG9jdW1lbnQ6OnNldERlc2lnbk1vZGUoSW5oZXJp
dGVkQm9vbCB2YWx1ZSkKK3sKKyAgICBtX2Rlc2lnbk1vZGUgPSB2YWx1ZTsKKyAgICBmb3IgKEZy
YW1lKiBmcmFtZSA9IG1fZnJhbWU7IGZyYW1lICYmIGZyYW1lLT5kb2N1bWVudCgpOyBmcmFtZSA9
IGZyYW1lLT50cmVlKCktPnRyYXZlcnNlTmV4dChtX2ZyYW1lKSkKKyAgICAgICAgZnJhbWUtPmRv
Y3VtZW50KCktPnNjaGVkdWxlRm9yY2VkU3R5bGVSZWNhbGMoKTsKK30KKworRG9jdW1lbnQ6Oklu
aGVyaXRlZEJvb2wgRG9jdW1lbnQ6OmdldERlc2lnbk1vZGUoKSBjb25zdAoreworICAgIHJldHVy
biBtX2Rlc2lnbk1vZGU7Cit9CisKK2Jvb2wgRG9jdW1lbnQ6OmluRGVzaWduTW9kZSgpIGNvbnN0
Cit7CisgICAgZm9yIChjb25zdCBEb2N1bWVudCogZCA9IHRoaXM7IGQ7IGQgPSBkLT5wYXJlbnRE
b2N1bWVudCgpKSB7CisgICAgICAgIGlmIChkLT5tX2Rlc2lnbk1vZGUgIT0gaW5oZXJpdCkKKyAg
ICAgICAgICAgIHJldHVybiBkLT5tX2Rlc2lnbk1vZGU7CisgICAgfQorICAgIHJldHVybiBmYWxz
ZTsKK30KKworRG9jdW1lbnQqIERvY3VtZW50OjpwYXJlbnREb2N1bWVudCgpIGNvbnN0Cit7Cisg
ICAgaWYgKCFtX2ZyYW1lKQorICAgICAgICByZXR1cm4gMDsKKyAgICBGcmFtZSogcGFyZW50ID0g
bV9mcmFtZS0+dHJlZSgpLT5wYXJlbnQoKTsKKyAgICBpZiAoIXBhcmVudCkKKyAgICAgICAgcmV0
dXJuIDA7CisgICAgcmV0dXJuIHBhcmVudC0+ZG9jdW1lbnQoKTsKK30KKworRG9jdW1lbnQqIERv
Y3VtZW50Ojp0b3BEb2N1bWVudCgpIGNvbnN0Cit7CisgICAgRG9jdW1lbnQqIGRvYyA9IGNvbnN0
X2Nhc3Q8RG9jdW1lbnQgKj4odGhpcyk7CisgICAgRWxlbWVudCogZWxlbWVudDsKKyAgICB3aGls
ZSAoKGVsZW1lbnQgPSBkb2MtPm93bmVyRWxlbWVudCgpKSkKKyAgICAgICAgZG9jID0gZWxlbWVu
dC0+ZG9jdW1lbnQoKTsKKyAgICAKKyAgICByZXR1cm4gZG9jOworfQorCitQYXNzUmVmUHRyPEF0
dHI+IERvY3VtZW50OjpjcmVhdGVBdHRyaWJ1dGUoY29uc3QgU3RyaW5nJiBuYW1lLCBFeGNlcHRp
b25Db2RlJiBlYykKK3sKKyAgICByZXR1cm4gY3JlYXRlQXR0cmlidXRlTlMoU3RyaW5nKCksIG5h
bWUsIGVjLCB0cnVlKTsKK30KKworUGFzc1JlZlB0cjxBdHRyPiBEb2N1bWVudDo6Y3JlYXRlQXR0
cmlidXRlTlMoY29uc3QgU3RyaW5nJiBuYW1lc3BhY2VVUkksIGNvbnN0IFN0cmluZyYgcXVhbGlm
aWVkTmFtZSwgRXhjZXB0aW9uQ29kZSYgZWMsIGJvb2wgc2hvdWxkSWdub3JlTmFtZXNwYWNlQ2hl
Y2tzKQoreworICAgIFN0cmluZyBwcmVmaXgsIGxvY2FsTmFtZTsKKyAgICBpZiAoIXBhcnNlUXVh
bGlmaWVkTmFtZShxdWFsaWZpZWROYW1lLCBwcmVmaXgsIGxvY2FsTmFtZSwgZWMpKQorICAgICAg
ICByZXR1cm4gMDsKKworICAgIFF1YWxpZmllZE5hbWUgcU5hbWUocHJlZml4LCBsb2NhbE5hbWUs
IG5hbWVzcGFjZVVSSSk7CisKKyAgICBpZiAoIXNob3VsZElnbm9yZU5hbWVzcGFjZUNoZWNrcyAm
JiAhaGFzVmFsaWROYW1lc3BhY2VGb3JBdHRyaWJ1dGVzKHFOYW1lKSkgeworICAgICAgICBlYyA9
IE5BTUVTUEFDRV9FUlI7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiBB
dHRyOjpjcmVhdGUodGhpcywgcU5hbWUsIGVtcHR5U3RyaW5nKCkpOworfQorCisjaWYgRU5BQkxF
KFNWRykKK2NvbnN0IFNWR0RvY3VtZW50RXh0ZW5zaW9ucyogRG9jdW1lbnQ6OnN2Z0V4dGVuc2lv
bnMoKQoreworICAgIHJldHVybiBtX3N2Z0V4dGVuc2lvbnMuZ2V0KCk7Cit9CisKK1NWR0RvY3Vt
ZW50RXh0ZW5zaW9ucyogRG9jdW1lbnQ6OmFjY2Vzc1NWR0V4dGVuc2lvbnMoKQoreworICAgIGlm
ICghbV9zdmdFeHRlbnNpb25zKQorICAgICAgICBtX3N2Z0V4dGVuc2lvbnMgPSBhZG9wdFB0cihu
ZXcgU1ZHRG9jdW1lbnRFeHRlbnNpb25zKHRoaXMpKTsKKyAgICByZXR1cm4gbV9zdmdFeHRlbnNp
b25zLmdldCgpOworfQorCitib29sIERvY3VtZW50OjpoYXNTVkdSb290Tm9kZSgpIGNvbnN0Cit7
CisgICAgcmV0dXJuIGRvY3VtZW50RWxlbWVudCgpICYmIGRvY3VtZW50RWxlbWVudCgpLT5oYXNU
YWdOYW1lKFNWR05hbWVzOjpzdmdUYWcpOworfQorI2VuZGlmCisKKy8vIEZJWE1FOiBUaGlzIGNh
Y2hpbmcgbWVjaGFuaXNtIHNob3VsZCBiZSBtZXJnZWQgdGhhdCBvZiBEeW5hbWljTm9kZUxpc3Qg
aW4gTm9kZVJhcmVEYXRhLgorUGFzc1JlZlB0cjxIVE1MQ29sbGVjdGlvbj4gRG9jdW1lbnQ6OmNh
Y2hlZENvbGxlY3Rpb24oQ29sbGVjdGlvblR5cGUgdHlwZSkKK3sKKyAgICBBU1NFUlQoc3RhdGlj
X2Nhc3Q8dW5zaWduZWQ+KHR5cGUpIDwgTnVtVW5uYW1lZERvY3VtZW50Q2FjaGVkVHlwZXMpOwor
ICAgIGlmIChtX2NvbGxlY3Rpb25zW3R5cGVdKQorICAgICAgICByZXR1cm4gbV9jb2xsZWN0aW9u
c1t0eXBlXTsKKworICAgIFJlZlB0cjxIVE1MQ29sbGVjdGlvbj4gY29sbGVjdGlvbjsKKyAgICBp
ZiAodHlwZSA9PSBEb2NBbGwpCisgICAgICAgIGNvbGxlY3Rpb24gPSBIVE1MQWxsQ29sbGVjdGlv
bjo6Y3JlYXRlKHRoaXMpOworICAgIGVsc2UKKyAgICAgICAgY29sbGVjdGlvbiA9IEhUTUxDb2xs
ZWN0aW9uOjpjcmVhdGUodGhpcywgdHlwZSk7CisgICAgbV9jb2xsZWN0aW9uc1t0eXBlXSA9IGNv
bGxlY3Rpb24uZ2V0KCk7CisKKyAgICByZXR1cm4gY29sbGVjdGlvbi5yZWxlYXNlKCk7Cit9CisK
K3ZvaWQgRG9jdW1lbnQ6OnJlbW92ZUNhY2hlZEhUTUxDb2xsZWN0aW9uKEhUTUxDb2xsZWN0aW9u
KiBjb2xsZWN0aW9uLCBDb2xsZWN0aW9uVHlwZSB0eXBlKQoreworICAgIEFTU0VSVF9VTlVTRUQo
Y29sbGVjdGlvbiwgbV9jb2xsZWN0aW9uc1t0eXBlXSA9PSBjb2xsZWN0aW9uKTsKKyAgICBtX2Nv
bGxlY3Rpb25zW3R5cGVdID0gMDsKK30KKworUGFzc1JlZlB0cjxIVE1MQ29sbGVjdGlvbj4gRG9j
dW1lbnQ6OmltYWdlcygpCit7CisgICAgcmV0dXJuIGNhY2hlZENvbGxlY3Rpb24oRG9jSW1hZ2Vz
KTsKK30KKworUGFzc1JlZlB0cjxIVE1MQ29sbGVjdGlvbj4gRG9jdW1lbnQ6OmFwcGxldHMoKQor
eworICAgIHJldHVybiBjYWNoZWRDb2xsZWN0aW9uKERvY0FwcGxldHMpOworfQorCitQYXNzUmVm
UHRyPEhUTUxDb2xsZWN0aW9uPiBEb2N1bWVudDo6ZW1iZWRzKCkKK3sKKyAgICByZXR1cm4gY2Fj
aGVkQ29sbGVjdGlvbihEb2NFbWJlZHMpOworfQorCitQYXNzUmVmUHRyPEhUTUxDb2xsZWN0aW9u
PiBEb2N1bWVudDo6cGx1Z2lucygpCit7CisgICAgLy8gVGhpcyBpcyBhbiBhbGlhcyBmb3IgZW1i
ZWRzKCkgcmVxdWlyZWQgZm9yIHRoZSBKUyBET00gYmluZGluZ3MuCisgICAgcmV0dXJuIGNhY2hl
ZENvbGxlY3Rpb24oRG9jRW1iZWRzKTsKK30KKworUGFzc1JlZlB0cjxIVE1MQ29sbGVjdGlvbj4g
RG9jdW1lbnQ6Om9iamVjdHMoKQoreworICAgIHJldHVybiBjYWNoZWRDb2xsZWN0aW9uKERvY09i
amVjdHMpOworfQorCitQYXNzUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBEb2N1bWVudDo6c2NyaXB0
cygpCit7CisgICAgcmV0dXJuIGNhY2hlZENvbGxlY3Rpb24oRG9jU2NyaXB0cyk7Cit9CisKK1Bh
c3NSZWZQdHI8SFRNTENvbGxlY3Rpb24+IERvY3VtZW50OjpsaW5rcygpCit7CisgICAgcmV0dXJu
IGNhY2hlZENvbGxlY3Rpb24oRG9jTGlua3MpOworfQorCitQYXNzUmVmUHRyPEhUTUxDb2xsZWN0
aW9uPiBEb2N1bWVudDo6Zm9ybXMoKQoreworICAgIHJldHVybiBjYWNoZWRDb2xsZWN0aW9uKERv
Y0Zvcm1zKTsKK30KKworUGFzc1JlZlB0cjxIVE1MQ29sbGVjdGlvbj4gRG9jdW1lbnQ6OmFuY2hv
cnMoKQoreworICAgIHJldHVybiBjYWNoZWRDb2xsZWN0aW9uKERvY0FuY2hvcnMpOworfQorCitQ
YXNzUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBEb2N1bWVudDo6YWxsKCkKK3sKKyAgICByZXR1cm4g
Y2FjaGVkQ29sbGVjdGlvbihEb2NBbGwpOworfQorCitQYXNzUmVmUHRyPEhUTUxDb2xsZWN0aW9u
PiBEb2N1bWVudDo6d2luZG93TmFtZWRJdGVtcyhjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUpCit7
CisgICAgTmFtZWRDb2xsZWN0aW9uTWFwOjpBZGRSZXN1bHQgcmVzdWx0ID0gbV93aW5kb3dOYW1l
ZEl0ZW1Db2xsZWN0aW9ucy5hZGQobmFtZSwgMCk7CisgICAgaWYgKCFyZXN1bHQuaXNOZXdFbnRy
eSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdC5pdGVyYXRvci0+c2Vjb25kOworCisgICAgUmVmUHRy
PEhUTUxOYW1lQ29sbGVjdGlvbj4gY29sbGVjdGlvbiA9IEhUTUxOYW1lQ29sbGVjdGlvbjo6Y3Jl
YXRlKHRoaXMsIFdpbmRvd05hbWVkSXRlbXMsIG5hbWUpOworICAgIHJlc3VsdC5pdGVyYXRvci0+
c2Vjb25kID0gY29sbGVjdGlvbi5nZXQoKTsKKyAgICByZXR1cm4gY29sbGVjdGlvbi5yZWxlYXNl
KCk7Cit9CisKK1Bhc3NSZWZQdHI8SFRNTENvbGxlY3Rpb24+IERvY3VtZW50Ojpkb2N1bWVudE5h
bWVkSXRlbXMoY29uc3QgQXRvbWljU3RyaW5nJiBuYW1lKQoreworICAgIE5hbWVkQ29sbGVjdGlv
bk1hcDo6QWRkUmVzdWx0IHJlc3VsdCA9IG1fZG9jdW1lbnROYW1lZEl0ZW1Db2xsZWN0aW9ucy5h
ZGQobmFtZSwgMCk7CisgICAgaWYgKCFyZXN1bHQuaXNOZXdFbnRyeSkKKyAgICAgICAgcmV0dXJu
IHJlc3VsdC5pdGVyYXRvci0+c2Vjb25kOworCisgICAgUmVmUHRyPEhUTUxOYW1lQ29sbGVjdGlv
bj4gY29sbGVjdGlvbiA9IEhUTUxOYW1lQ29sbGVjdGlvbjo6Y3JlYXRlKHRoaXMsIERvY3VtZW50
TmFtZWRJdGVtcywgbmFtZSk7CisgICAgcmVzdWx0Lml0ZXJhdG9yLT5zZWNvbmQgPSBjb2xsZWN0
aW9uLmdldCgpOworICAgIHJldHVybiBjb2xsZWN0aW9uLnJlbGVhc2UoKTsKK30KKworLy8gRklY
TUU6IFRoaXMgY2FjaGluZyBtZWNoYW5pc20gc2hvdWxkIGJlIG1lcmdlZCB0aGF0IG9mIER5bmFt
aWNOb2RlTGlzdCBpbiBOb2RlUmFyZURhdGEuCit2b2lkIERvY3VtZW50OjpyZW1vdmVXaW5kb3dO
YW1lZEl0ZW1DYWNoZShIVE1MQ29sbGVjdGlvbiogY29sbGVjdGlvbiwgY29uc3QgQXRvbWljU3Ry
aW5nJiBuYW1lKQoreworICAgIEFTU0VSVF9VTlVTRUQoY29sbGVjdGlvbiwgbV93aW5kb3dOYW1l
ZEl0ZW1Db2xsZWN0aW9ucy5nZXQobmFtZSkgPT0gY29sbGVjdGlvbik7CisgICAgbV93aW5kb3dO
YW1lZEl0ZW1Db2xsZWN0aW9ucy5yZW1vdmUobmFtZSk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnJl
bW92ZURvY3VtZW50TmFtZWRJdGVtQ2FjaGUoSFRNTENvbGxlY3Rpb24qIGNvbGxlY3Rpb24sIGNv
bnN0IEF0b21pY1N0cmluZyYgbmFtZSkKK3sKKyAgICBBU1NFUlRfVU5VU0VEKGNvbGxlY3Rpb24s
IG1fZG9jdW1lbnROYW1lZEl0ZW1Db2xsZWN0aW9ucy5nZXQobmFtZSkgPT0gY29sbGVjdGlvbik7
CisgICAgbV9kb2N1bWVudE5hbWVkSXRlbUNvbGxlY3Rpb25zLnJlbW92ZShuYW1lKTsKK30KKwor
dm9pZCBEb2N1bWVudDo6ZmluaXNoZWRQYXJzaW5nKCkKK3sKKyAgICBBU1NFUlQoIXNjcmlwdGFi
bGVEb2N1bWVudFBhcnNlcigpIHx8ICFtX3BhcnNlci0+aXNQYXJzaW5nKCkpOworICAgIEFTU0VS
VCghc2NyaXB0YWJsZURvY3VtZW50UGFyc2VyKCkgfHwgbV9yZWFkeVN0YXRlICE9IExvYWRpbmcp
OworICAgIHNldFBhcnNpbmcoZmFsc2UpOworICAgIGlmICghbV9kb2N1bWVudFRpbWluZy5kb21D
b250ZW50TG9hZGVkRXZlbnRTdGFydCkKKyAgICAgICAgbV9kb2N1bWVudFRpbWluZy5kb21Db250
ZW50TG9hZGVkRXZlbnRTdGFydCA9IG1vbm90b25pY2FsbHlJbmNyZWFzaW5nVGltZSgpOworICAg
IGRpc3BhdGNoRXZlbnQoRXZlbnQ6OmNyZWF0ZShldmVudE5hbWVzKCkuRE9NQ29udGVudExvYWRl
ZEV2ZW50LCB0cnVlLCBmYWxzZSkpOworICAgIGlmICghbV9kb2N1bWVudFRpbWluZy5kb21Db250
ZW50TG9hZGVkRXZlbnRFbmQpCisgICAgICAgIG1fZG9jdW1lbnRUaW1pbmcuZG9tQ29udGVudExv
YWRlZEV2ZW50RW5kID0gbW9ub3RvbmljYWxseUluY3JlYXNpbmdUaW1lKCk7CisKKyAgICBpZiAo
UmVmUHRyPEZyYW1lPiBmID0gZnJhbWUoKSkgeworICAgICAgICAvLyBGcmFtZUxvYWRlcjo6Zmlu
aXNoZWRQYXJzaW5nKCkgbWlnaHQgZW5kIHVwIGNhbGxpbmcgRG9jdW1lbnQ6OmltcGxpY2l0Q2xv
c2UoKSBpZiBhbGwKKyAgICAgICAgLy8gcmVzb3VyY2UgbG9hZHMgYXJlIGNvbXBsZXRlLiBIVE1M
T2JqZWN0RWxlbWVudHMgY2FuIHN0YXJ0IGxvYWRpbmcgdGhlaXIgcmVzb3VyY2VzIGZyb20KKyAg
ICAgICAgLy8gcG9zdCBhdHRhY2ggY2FsbGJhY2tzIHRyaWdnZXJlZCBieSByZWNhbGNTdHlsZSgp
LiAgVGhpcyBtZWFucyBpZiB3ZSBwYXJzZSBvdXQgYW4gPG9iamVjdD4KKyAgICAgICAgLy8gdGFn
IGFuZCB0aGVuIHJlYWNoIHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50IHdpdGhvdXQgdXBkYXRpbmcg
c3R5bGVzLCB3ZSBtaWdodCBub3QgaGF2ZSB5ZXQKKyAgICAgICAgLy8gc3RhcnRlZCB0aGUgcmVz
b3VyY2UgbG9hZCBhbmQgbWlnaHQgZmlyZSB0aGUgd2luZG93IGxvYWQgZXZlbnQgdG9vIGVhcmx5
LiAgVG8gYXZvaWQgdGhpcworICAgICAgICAvLyB3ZSBmb3JjZSB0aGUgc3R5bGVzIHRvIGJlIHVw
IHRvIGRhdGUgYmVmb3JlIGNhbGxpbmcgRnJhbWVMb2FkZXI6OmZpbmlzaGVkUGFyc2luZygpLgor
ICAgICAgICAvLyBTZWUgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTM2
ODY0IHN0YXJ0aW5nIGFyb3VuZCBjb21tZW50IDM1LgorICAgICAgICB1cGRhdGVTdHlsZUlmTmVl
ZGVkKCk7CisKKyAgICAgICAgZi0+bG9hZGVyKCktPmZpbmlzaGVkUGFyc2luZygpOworCisgICAg
ICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZG9tQ29udGVudExvYWRlZEV2ZW50RmlyZWQo
Zi5nZXQoKSk7CisgICAgfQorCisgICAgLy8gVGhlIEVsZW1lbnRBdHRyaWJ1dGVEYXRhIHNoYXJp
bmcgY2FjaGUgaXMgb25seSB1c2VkIGR1cmluZyBwYXJzaW5nIHNpbmNlCisgICAgLy8gdGhhdCdz
IHdoZW4gdGhlIG1ham9yaXR5IG9mIGltbXV0YWJsZSBhdHRyaWJ1dGUgZGF0YSB3aWxsIGJlIGNy
ZWF0ZWQuCisgICAgbV9pbW11dGFibGVBdHRyaWJ1dGVEYXRhQ2FjaGUuY2xlYXIoKTsKK30KKwor
UGFzc1JlZlB0cjxYUGF0aEV4cHJlc3Npb24+IERvY3VtZW50OjpjcmVhdGVFeHByZXNzaW9uKGNv
bnN0IFN0cmluZyYgZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBYUGF0aE5TUmVzb2x2ZXIqIHJlc29sdmVyLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlv
bkNvZGUmIGVjKQoreworICAgIGlmICghbV94cGF0aEV2YWx1YXRvcikKKyAgICAgICAgbV94cGF0
aEV2YWx1YXRvciA9IFhQYXRoRXZhbHVhdG9yOjpjcmVhdGUoKTsKKyAgICByZXR1cm4gbV94cGF0
aEV2YWx1YXRvci0+Y3JlYXRlRXhwcmVzc2lvbihleHByZXNzaW9uLCByZXNvbHZlciwgZWMpOwor
fQorCitQYXNzUmVmUHRyPFhQYXRoTlNSZXNvbHZlcj4gRG9jdW1lbnQ6OmNyZWF0ZU5TUmVzb2x2
ZXIoTm9kZSogbm9kZVJlc29sdmVyKQoreworICAgIGlmICghbV94cGF0aEV2YWx1YXRvcikKKyAg
ICAgICAgbV94cGF0aEV2YWx1YXRvciA9IFhQYXRoRXZhbHVhdG9yOjpjcmVhdGUoKTsKKyAgICBy
ZXR1cm4gbV94cGF0aEV2YWx1YXRvci0+Y3JlYXRlTlNSZXNvbHZlcihub2RlUmVzb2x2ZXIpOwor
fQorCitQYXNzUmVmUHRyPFhQYXRoUmVzdWx0PiBEb2N1bWVudDo6ZXZhbHVhdGUoY29uc3QgU3Ry
aW5nJiBleHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIE5vZGUqIGNvbnRleHROb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIFhQYXRoTlNSZXNvbHZlciogcmVzb2x2ZXIsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgdHlwZSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYUGF0aFJlc3VsdCogcmVzdWx0LAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvbkNvZGUmIGVj
KQoreworICAgIGlmICghbV94cGF0aEV2YWx1YXRvcikKKyAgICAgICAgbV94cGF0aEV2YWx1YXRv
ciA9IFhQYXRoRXZhbHVhdG9yOjpjcmVhdGUoKTsKKyAgICByZXR1cm4gbV94cGF0aEV2YWx1YXRv
ci0+ZXZhbHVhdGUoZXhwcmVzc2lvbiwgY29udGV4dE5vZGUsIHJlc29sdmVyLCB0eXBlLCByZXN1
bHQsIGVjKTsKK30KKworY29uc3QgVmVjdG9yPEljb25VUkw+JiBEb2N1bWVudDo6aWNvblVSTHMo
KQoreworICAgIG1faWNvblVSTHMuY2xlYXIoKTsKKworICAgIGlmICghaGVhZCgpIHx8ICEoaGVh
ZCgpLT5jaGlsZHJlbigpKSkKKyAgICAgICAgcmV0dXJuIG1faWNvblVSTHM7CisKKyAgICAvLyBJ
bmNsdWRlIGFueSBpY29ucyB3aGVyZSB0eXBlID0gbGluaywgcmVsID0gInNob3J0Y3V0IGljb24i
LgorICAgIFJlZlB0cjxIVE1MQ29sbGVjdGlvbj4gY2hpbGRyZW4gPSBoZWFkKCktPmNoaWxkcmVu
KCk7CisgICAgdW5zaWduZWQgaW50IGxlbmd0aCA9IGNoaWxkcmVuLT5sZW5ndGgoKTsKKyAgICBm
b3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgICAgIE5vZGUq
IGNoaWxkID0gY2hpbGRyZW4tPml0ZW0oaSk7CisgICAgICAgIGlmICghY2hpbGQtPmhhc1RhZ05h
bWUobGlua1RhZykpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgSFRNTExpbmtFbGVt
ZW50KiBsaW5rRWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxMaW5rRWxlbWVudCo+KGNoaWxkKTsK
KyAgICAgICAgaWYgKGxpbmtFbGVtZW50LT5pY29uVHlwZSgpICE9IEZhdmljb24pCisgICAgICAg
ICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKGxpbmtFbGVtZW50LT5ocmVmKCkuaXNFbXB0eSgp
KQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLy8gUHV0IGl0IGF0IHRoZSBmcm9u
dCB0byBlbnN1cmUgdGhhdCBpY29ucyBzZWVuIGxhdGVyIHRha2UgcHJlY2VkZW5jZSBhcyByZXF1
aXJlZCBieSB0aGUgc3BlYy4KKyAgICAgICAgSWNvblVSTCBuZXdVUkwobGlua0VsZW1lbnQtPmhy
ZWYoKSwgbGlua0VsZW1lbnQtPmljb25TaXplcygpLCBsaW5rRWxlbWVudC0+dHlwZSgpLCBsaW5r
RWxlbWVudC0+aWNvblR5cGUoKSk7CisgICAgICAgIG1faWNvblVSTHMucHJlcGVuZChuZXdVUkwp
OworICAgIH0KKworICAgIHJldHVybiBtX2ljb25VUkxzOworfQorCit2b2lkIERvY3VtZW50Ojph
ZGRJY29uVVJMKGNvbnN0IFN0cmluZyYgdXJsLCBjb25zdCBTdHJpbmcmIG1pbWVUeXBlLCBjb25z
dCBTdHJpbmcmIHNpemVzLCBJY29uVHlwZSBpY29uVHlwZSkKK3sKKyAgICBpZiAodXJsLmlzRW1w
dHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gRklYTUUgLSA8cmRhcjovL3Byb2JsZW0v
NDcyNzY0NT4gLSBBdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUsIHdlIG1pZ2h0IGFjdHVhbGx5
IGhvbm9yIHRoZSAibWltZVR5cGUiCisgICAgSWNvblVSTCBuZXdVUkwoS1VSTChQYXJzZWRVUkxT
dHJpbmcsIHVybCksIHNpemVzLCBtaW1lVHlwZSwgaWNvblR5cGUpOworCisgICAgaWYgKEZyYW1l
KiBmID0gZnJhbWUoKSkgeworICAgICAgICBJY29uVVJMIGljb25VUkwgPSBmLT5sb2FkZXIoKS0+
aWNvbigpLT5pY29uVVJMKGljb25UeXBlKTsKKyAgICAgICAgaWYgKGljb25VUkwgPT0gbmV3VVJM
KQorICAgICAgICAgICAgZi0+bG9hZGVyKCktPmRpZENoYW5nZUljb25zKGljb25UeXBlKTsKKyAg
ICB9Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnNldFVzZVNlY3VyZUtleWJvYXJkRW50cnlXaGVuQWN0
aXZlKGJvb2wgdXNlc1NlY3VyZUtleWJvYXJkKQoreworICAgIGlmIChtX3VzZVNlY3VyZUtleWJv
YXJkRW50cnlXaGVuQWN0aXZlID09IHVzZXNTZWN1cmVLZXlib2FyZCkKKyAgICAgICAgcmV0dXJu
OworCisgICAgbV91c2VTZWN1cmVLZXlib2FyZEVudHJ5V2hlbkFjdGl2ZSA9IHVzZXNTZWN1cmVL
ZXlib2FyZDsKKyAgICBtX2ZyYW1lLT5zZWxlY3Rpb24oKS0+dXBkYXRlU2VjdXJlS2V5Ym9hcmRF
bnRyeUlmQWN0aXZlKCk7Cit9CisKK2Jvb2wgRG9jdW1lbnQ6OnVzZVNlY3VyZUtleWJvYXJkRW50
cnlXaGVuQWN0aXZlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV91c2VTZWN1cmVLZXlib2FyZEVu
dHJ5V2hlbkFjdGl2ZTsKK30KKworc3RhdGljIGJvb2wgaXNFbGlnaWJsZUZvclNlYW1sZXNzKERv
Y3VtZW50KiBwYXJlbnQsIERvY3VtZW50KiBjaGlsZCkKK3sKKyAgICAvLyBJdCBzaG91bGQgbm90
IG1hdHRlciB3aGF0IHdlIHJldHVybiBmb3IgdGhlIHRvcC1tb3N0IGRvY3VtZW50LgorICAgIGlm
ICghcGFyZW50KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKHBhcmVudC0+aXNTYW5k
Ym94ZWQoU2FuZGJveFNlYW1sZXNzSWZyYW1lcykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICBpZiAoY2hpbGQtPmlzU3JjZG9jRG9jdW1lbnQoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgaWYgKHBhcmVudC0+c2VjdXJpdHlPcmlnaW4oKS0+Y2FuQWNjZXNzKGNoaWxkLT5zZWN1cml0
eU9yaWdpbigpKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIHBhcmVudC0+c2Vj
dXJpdHlPcmlnaW4oKS0+Y2FuUmVxdWVzdChjaGlsZC0+dXJsKCkpOworfQorCit2b2lkIERvY3Vt
ZW50Ojppbml0U2VjdXJpdHlDb250ZXh0KCkKK3sKKyAgICBpZiAoaGF2ZUluaXRpYWxpemVkU2Vj
dXJpdHlPcmlnaW4oKSkgeworICAgICAgICBBU1NFUlQoc2VjdXJpdHlPcmlnaW4oKSk7CisgICAg
ICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIW1fZnJhbWUpIHsKKyAgICAgICAgLy8gTm8g
c291cmNlIGZvciBhIHNlY3VyaXR5IGNvbnRleHQuCisgICAgICAgIC8vIFRoaXMgY2FuIG9jY3Vy
IHZpYSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVEb2N1bWVudCgpLgorICAgICAgICBt
X2Nvb2tpZVVSTCA9IEtVUkwoUGFyc2VkVVJMU3RyaW5nLCBlbXB0eVN0cmluZygpKTsKKyAgICAg
ICAgc2V0U2VjdXJpdHlPcmlnaW4oU2VjdXJpdHlPcmlnaW46OmNyZWF0ZVVuaXF1ZSgpKTsKKyAg
ICAgICAgc2V0Q29udGVudFNlY3VyaXR5UG9saWN5KENvbnRlbnRTZWN1cml0eVBvbGljeTo6Y3Jl
YXRlKHRoaXMpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEluIHRoZSBjb21t
b24gY2FzZSwgY3JlYXRlIHRoZSBzZWN1cml0eSBjb250ZXh0IGZyb20gdGhlIGN1cnJlbnRseQor
ICAgIC8vIGxvYWRpbmcgVVJMIHdpdGggYSBmcmVzaCBjb250ZW50IHNlY3VyaXR5IHBvbGljeS4K
KyAgICBtX2Nvb2tpZVVSTCA9IG1fdXJsOworICAgIGVuZm9yY2VTYW5kYm94RmxhZ3MobV9mcmFt
ZS0+bG9hZGVyKCktPmVmZmVjdGl2ZVNhbmRib3hGbGFncygpKTsKKyAgICBzZXRTZWN1cml0eU9y
aWdpbihpc1NhbmRib3hlZChTYW5kYm94T3JpZ2luKSA/IFNlY3VyaXR5T3JpZ2luOjpjcmVhdGVV
bmlxdWUoKSA6IFNlY3VyaXR5T3JpZ2luOjpjcmVhdGUobV91cmwpKTsKKyAgICBzZXRDb250ZW50
U2VjdXJpdHlQb2xpY3koQ29udGVudFNlY3VyaXR5UG9saWN5OjpjcmVhdGUodGhpcykpOworCisg
ICAgaWYgKFNlY3VyaXR5UG9saWN5OjphbGxvd1N1YnN0aXR1dGVEYXRhQWNjZXNzVG9Mb2NhbCgp
KSB7CisgICAgICAgIC8vIElmIHRoaXMgZG9jdW1lbnQgd2FzIGxvYWRlZCB3aXRoIHN1YnN0aXR1
dGVEYXRhLCB0aGVuIHRoZSBkb2N1bWVudCBjYW4KKyAgICAgICAgLy8gbG9hZCBsb2NhbCByZXNv
dXJjZXMuICBTZWUgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE2NzU2
CisgICAgICAgIC8vIGFuZCBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
MTk3NjAgZm9yIGZ1cnRoZXIKKyAgICAgICAgLy8gZGlzY3Vzc2lvbi4KKyAgICAgICAgCisgICAg
ICAgIERvY3VtZW50TG9hZGVyKiBkb2N1bWVudExvYWRlciA9IGxvYWRlcigpOworICAgICAgICBp
ZiAoZG9jdW1lbnRMb2FkZXIgJiYgZG9jdW1lbnRMb2FkZXItPnN1YnN0aXR1dGVEYXRhKCkuaXNW
YWxpZCgpKQorICAgICAgICAgICAgc2VjdXJpdHlPcmlnaW4oKS0+Z3JhbnRMb2FkTG9jYWxSZXNv
dXJjZXMoKTsKKyAgICB9CisKKyAgICBpZiAoU2V0dGluZ3MqIHNldHRpbmdzID0gdGhpcy0+c2V0
dGluZ3MoKSkgeworICAgICAgICBpZiAoIXNldHRpbmdzLT5pc1dlYlNlY3VyaXR5RW5hYmxlZCgp
KSB7CisgICAgICAgICAgICAvLyBXZWIgc2VjdXJpdHkgaXMgdHVybmVkIG9mZi4gV2Ugc2hvdWxk
IGxldCB0aGlzIGRvY3VtZW50IGFjY2VzcyBldmVyeSBvdGhlciBkb2N1bWVudC4gVGhpcyBpcyB1
c2VkIHByaW1hcnkgYnkgdGVzdGluZworICAgICAgICAgICAgLy8gaGFybmVzc2VzIGZvciB3ZWIg
c2l0ZXMuCisgICAgICAgICAgICBzZWN1cml0eU9yaWdpbigpLT5ncmFudFVuaXZlcnNhbEFjY2Vz
cygpOworICAgICAgICB9IGVsc2UgaWYgKHNlY3VyaXR5T3JpZ2luKCktPmlzTG9jYWwoKSkgewor
ICAgICAgICAgICAgaWYgKHNldHRpbmdzLT5hbGxvd1VuaXZlcnNhbEFjY2Vzc0Zyb21GaWxlVVJM
cygpIHx8IG1fZnJhbWUtPmxvYWRlcigpLT5jbGllbnQoKS0+c2hvdWxkRm9yY2VVbml2ZXJzYWxB
Y2Nlc3NGcm9tTG9jYWxVUkwobV91cmwpKSB7CisgICAgICAgICAgICAgICAgLy8gU29tZSBjbGll
bnRzIHdhbnQgbG9jYWwgVVJMcyB0byBoYXZlIHVuaXZlcnNhbCBhY2Nlc3MsIGJ1dCB0aGF0IHNl
dHRpbmcgaXMgZGFuZ2Vyb3VzIGZvciBvdGhlciBjbGllbnRzLgorICAgICAgICAgICAgICAgIHNl
Y3VyaXR5T3JpZ2luKCktPmdyYW50VW5pdmVyc2FsQWNjZXNzKCk7CisgICAgICAgICAgICB9IGVs
c2UgaWYgKCFzZXR0aW5ncy0+YWxsb3dGaWxlQWNjZXNzRnJvbUZpbGVVUkxzKCkpIHsKKyAgICAg
ICAgICAgICAgICAvLyBTb21lIGNsaWVudHMgd2FudCBsb2NhbCBVUkxzIHRvIGhhdmUgZXZlbiB0
aWdodGVyIHJlc3RyaWN0aW9ucyBieSBkZWZhdWx0LCBhbmQgbm90IGJlIGFibGUgdG8gYWNjZXNz
IG90aGVyIGxvY2FsIGZpbGVzLgorICAgICAgICAgICAgICAgIC8vIEZJWE1FIDgxNTc4OiBUaGUg
bmFtaW5nIG9mIHRoaXMgaXMgY29uZnVzaW5nLiBGaWxlcyB3aXRoIHJlc3RyaWN0ZWQgYWNjZXNz
IHRvIG90aGVyIGxvY2FsIGZpbGVzCisgICAgICAgICAgICAgICAgLy8gc3RpbGwgY2FuIGhhdmUg
b3RoZXIgcHJpdmlsZWdlcyB0aGF0IGNhbiBiZSByZW1lbWJlcmVkLCB0aGVyZWJ5IG5vdCBtYWtp
bmcgdGhlbSB1bmlxdWUgb3JpZ2lucy4KKyAgICAgICAgICAgICAgICBzZWN1cml0eU9yaWdpbigp
LT5lbmZvcmNlRmlsZVBhdGhTZXBhcmF0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0K
KyAgICAgICAgc2VjdXJpdHlPcmlnaW4oKS0+c2V0U3RvcmFnZUJsb2NraW5nUG9saWN5KHNldHRp
bmdzLT5zdG9yYWdlQmxvY2tpbmdQb2xpY3koKSk7CisgICAgfQorCisgICAgRG9jdW1lbnQqIHBh
cmVudERvY3VtZW50ID0gb3duZXJFbGVtZW50KCkgPyBvd25lckVsZW1lbnQoKS0+ZG9jdW1lbnQo
KSA6IDA7CisgICAgaWYgKHBhcmVudERvY3VtZW50ICYmIG1fZnJhbWUtPmxvYWRlcigpLT5zaG91
bGRUcmVhdFVSTEFzU3JjZG9jRG9jdW1lbnQodXJsKCkpKSB7CisgICAgICAgIG1faXNTcmNkb2NE
b2N1bWVudCA9IHRydWU7CisgICAgICAgIHNldEJhc2VVUkxPdmVycmlkZShwYXJlbnREb2N1bWVu
dC0+YmFzZVVSTCgpKTsKKyAgICB9CisKKyAgICAvLyBGSVhNRTogV2hhdCBoYXBwZW5zIGlmIHdl
IGluaGVyaXQgdGhlIHNlY3VyaXR5IG9yaWdpbj8gVGhpcyBjaGVjayBtYXkgbmVlZCB0byBiZSBs
YXRlci4KKyAgICAvLyA8aWZyYW1lIHNlYW1sZXNzIHNyYz0iYWJvdXQ6YmxhbmsiPiBsaWtlbHkg
d29uJ3Qgd29yayBhcy1pcy4KKyAgICBtX21heURpc3BsYXlTZWFtbGVzc1dpdGhQYXJlbnQgPSBp
c0VsaWdpYmxlRm9yU2VhbWxlc3MocGFyZW50RG9jdW1lbnQsIHRoaXMpOworCisgICAgaWYgKCFz
aG91bGRJbmhlcml0U2VjdXJpdHlPcmlnaW5Gcm9tT3duZXIobV91cmwpKQorICAgICAgICByZXR1
cm47CisKKyAgICAvLyBJZiB3ZSBkbyBub3Qgb2J0YWluIGEgbWVhbmluZ2Z1bCBvcmlnaW4gZnJv
bSB0aGUgVVJMLCB0aGVuIHdlIHRyeSB0bworICAgIC8vIGZpbmQgb25lIHZpYSB0aGUgZnJhbWUg
aGllcmFyY2h5LgorCisgICAgRnJhbWUqIG93bmVyRnJhbWUgPSBtX2ZyYW1lLT50cmVlKCktPnBh
cmVudCgpOworICAgIGlmICghb3duZXJGcmFtZSkKKyAgICAgICAgb3duZXJGcmFtZSA9IG1fZnJh
bWUtPmxvYWRlcigpLT5vcGVuZXIoKTsKKworICAgIGlmICghb3duZXJGcmFtZSkgeworICAgICAg
ICBkaWRGYWlsVG9Jbml0aWFsaXplU2VjdXJpdHlPcmlnaW4oKTsKKyAgICAgICAgcmV0dXJuOwor
ICAgIH0KKworICAgIGlmIChpc1NhbmRib3hlZChTYW5kYm94T3JpZ2luKSkgeworICAgICAgICAv
LyBJZiB3ZSdyZSBzdXBwb3NlZCB0byBpbmhlcml0IG91ciBzZWN1cml0eSBvcmlnaW4gZnJvbSBv
dXIgb3duZXIsCisgICAgICAgIC8vIGJ1dCB3ZSdyZSBhbHNvIHNhbmRib3hlZCwgdGhlIG9ubHkg
dGhpbmcgd2UgaW5oZXJpdCBpcyB0aGUgYWJpbGl0eQorICAgICAgICAvLyB0byBsb2FkIGxvY2Fs
IHJlc291cmNlcy4gVGhpcyBsZXRzIGFib3V0OmJsYW5rIGlmcmFtZXMgaW4gZmlsZTovLworICAg
ICAgICAvLyBVUkwgZG9jdW1lbnRzIGxvYWQgaW1hZ2VzIGFuZCBvdGhlciByZXNvdXJjZXMgZnJv
bSB0aGUgZmlsZSBzeXN0ZW0uCisgICAgICAgIGlmIChvd25lckZyYW1lLT5kb2N1bWVudCgpLT5z
ZWN1cml0eU9yaWdpbigpLT5jYW5Mb2FkTG9jYWxSZXNvdXJjZXMoKSkKKyAgICAgICAgICAgIHNl
Y3VyaXR5T3JpZ2luKCktPmdyYW50TG9hZExvY2FsUmVzb3VyY2VzKCk7CisgICAgICAgIHJldHVy
bjsKKyAgICB9CisKKyAgICBtX2Nvb2tpZVVSTCA9IG93bmVyRnJhbWUtPmRvY3VtZW50KCktPmNv
b2tpZVVSTCgpOworICAgIC8vIFdlIGFsaWFzIHRoZSBTZWN1cml0eU9yaWdpbnMgdG8gbWF0Y2gg
RmlyZWZveCwgc2VlIEJ1ZyAxNTMxMworICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD0xNTMxMworICAgIHNldFNlY3VyaXR5T3JpZ2luKG93bmVyRnJhbWUtPmRv
Y3VtZW50KCktPnNlY3VyaXR5T3JpZ2luKCkpOworfQorCit2b2lkIERvY3VtZW50Ojppbml0Q29u
dGVudFNlY3VyaXR5UG9saWN5KCkKK3sKKyAgICBpZiAoIW1fZnJhbWUtPnRyZWUoKS0+cGFyZW50
KCkgfHwgKCFzaG91bGRJbmhlcml0U2VjdXJpdHlPcmlnaW5Gcm9tT3duZXIobV91cmwpICYmICFp
c1BsdWdpbkRvY3VtZW50KCkpKQorICAgICAgICByZXR1cm47CisKKyAgICBjb250ZW50U2VjdXJp
dHlQb2xpY3koKS0+Y29weVN0YXRlRnJvbShtX2ZyYW1lLT50cmVlKCktPnBhcmVudCgpLT5kb2N1
bWVudCgpLT5jb250ZW50U2VjdXJpdHlQb2xpY3koKSk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmRp
ZFVwZGF0ZVNlY3VyaXR5T3JpZ2luKCkKK3sKKyAgICBpZiAoIW1fZnJhbWUpCisgICAgICAgIHJl
dHVybjsKKyAgICBtX2ZyYW1lLT5zY3JpcHQoKS0+dXBkYXRlU2VjdXJpdHlPcmlnaW4oKTsKK30K
KworYm9vbCBEb2N1bWVudDo6aXNDb250ZXh0VGhyZWFkKCkgY29uc3QKK3sKKyAgICByZXR1cm4g
aXNNYWluVGhyZWFkKCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnVwZGF0ZVVSTEZvclB1c2hPclJl
cGxhY2VTdGF0ZShjb25zdCBLVVJMJiB1cmwpCit7CisgICAgRnJhbWUqIGYgPSBmcmFtZSgpOwor
ICAgIGlmICghZikKKyAgICAgICAgcmV0dXJuOworCisgICAgc2V0VVJMKHVybCk7CisgICAgZi0+
bG9hZGVyKCktPnNldE91dGdvaW5nUmVmZXJyZXIodXJsKTsKKworICAgIGlmIChEb2N1bWVudExv
YWRlciogZG9jdW1lbnRMb2FkZXIgPSBsb2FkZXIoKSkKKyAgICAgICAgZG9jdW1lbnRMb2FkZXIt
PnJlcGxhY2VSZXF1ZXN0VVJMRm9yU2FtZURvY3VtZW50TmF2aWdhdGlvbih1cmwpOworfQorCit2
b2lkIERvY3VtZW50OjpzdGF0ZVBvcHBlZChQYXNzUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1
ZT4gc3RhdGVPYmplY3QpCit7CisgICAgaWYgKCFmcmFtZSgpKQorICAgICAgICByZXR1cm47Cisg
ICAgCisgICAgLy8gUGVyIHN0ZXAgMTEgb2Ygc2VjdGlvbiA2LjUuOSAoaGlzdG9yeSB0cmF2ZXJz
YWwpIG9mIHRoZSBIVE1MNSBzcGVjLCB3ZSAKKyAgICAvLyBkZWZlciBmaXJpbmcgb2YgcG9wc3Rh
dGUgdW50aWwgd2UncmUgaW4gdGhlIGNvbXBsZXRlIHN0YXRlLgorICAgIGlmIChtX3JlYWR5U3Rh
dGUgPT0gQ29tcGxldGUpCisgICAgICAgIGVucXVldWVQb3BzdGF0ZUV2ZW50KHN0YXRlT2JqZWN0
KTsKKyAgICBlbHNlCisgICAgICAgIG1fcGVuZGluZ1N0YXRlT2JqZWN0ID0gc3RhdGVPYmplY3Q7
Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnVwZGF0ZUZvY3VzQXBwZWFyYW5jZVNvb24oYm9vbCByZXN0
b3JlUHJldmlvdXNTZWxlY3Rpb24pCit7CisgICAgbV91cGRhdGVGb2N1c0FwcGVhcmFuY2VSZXN0
b3Jlc1NlbGVjdGlvbiA9IHJlc3RvcmVQcmV2aW91c1NlbGVjdGlvbjsKKyAgICBpZiAoIW1fdXBk
YXRlRm9jdXNBcHBlYXJhbmNlVGltZXIuaXNBY3RpdmUoKSkKKyAgICAgICAgbV91cGRhdGVGb2N1
c0FwcGVhcmFuY2VUaW1lci5zdGFydE9uZVNob3QoMCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmNh
bmNlbEZvY3VzQXBwZWFyYW5jZVVwZGF0ZSgpCit7CisgICAgbV91cGRhdGVGb2N1c0FwcGVhcmFu
Y2VUaW1lci5zdG9wKCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnVwZGF0ZUZvY3VzQXBwZWFyYW5j
ZVRpbWVyRmlyZWQoVGltZXI8RG9jdW1lbnQ+KikKK3sKKyAgICBOb2RlKiBub2RlID0gZm9jdXNl
ZE5vZGUoKTsKKyAgICBpZiAoIW5vZGUpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoIW5vZGUt
PmlzRWxlbWVudE5vZGUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgdXBkYXRlTGF5b3V0KCk7
CisKKyAgICBFbGVtZW50KiBlbGVtZW50ID0gc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG5vZGUpOwor
ICAgIGlmIChlbGVtZW50LT5pc0ZvY3VzYWJsZSgpKQorICAgICAgICBlbGVtZW50LT51cGRhdGVG
b2N1c0FwcGVhcmFuY2UobV91cGRhdGVGb2N1c0FwcGVhcmFuY2VSZXN0b3Jlc1NlbGVjdGlvbik7
Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmF0dGFjaFJhbmdlKFJhbmdlKiByYW5nZSkKK3sKKyAgICBB
U1NFUlQoIW1fcmFuZ2VzLmNvbnRhaW5zKHJhbmdlKSk7CisgICAgbV9yYW5nZXMuYWRkKHJhbmdl
KTsKK30KKwordm9pZCBEb2N1bWVudDo6ZGV0YWNoUmFuZ2UoUmFuZ2UqIHJhbmdlKQoreworICAg
IC8vIFdlIGRvbid0IEFTU0VSVCBtX3Jhbmdlcy5jb250YWlucyhyYW5nZSkgdG8gYWxsb3cgdXMg
dG8gY2FsbCB0aGlzCisgICAgLy8gdW5jb25kaXRpb25hbGx5IHRvIGZpeDogaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI2MDQ0CisgICAgbV9yYW5nZXMucmVtb3ZlKHJh
bmdlKTsKK30KKworQ2FudmFzUmVuZGVyaW5nQ29udGV4dCogRG9jdW1lbnQ6OmdldENTU0NhbnZh
c0NvbnRleHQoY29uc3QgU3RyaW5nJiB0eXBlLCBjb25zdCBTdHJpbmcmIG5hbWUsIGludCB3aWR0
aCwgaW50IGhlaWdodCkKK3sKKyAgICBIVE1MQ2FudmFzRWxlbWVudCogZWxlbWVudCA9IGdldENT
U0NhbnZhc0VsZW1lbnQobmFtZSk7CisgICAgaWYgKCFlbGVtZW50KQorICAgICAgICByZXR1cm4g
MDsKKyAgICBlbGVtZW50LT5zZXRTaXplKEludFNpemUod2lkdGgsIGhlaWdodCkpOworICAgIHJl
dHVybiBlbGVtZW50LT5nZXRDb250ZXh0KHR5cGUpOworfQorCitIVE1MQ2FudmFzRWxlbWVudCog
RG9jdW1lbnQ6OmdldENTU0NhbnZhc0VsZW1lbnQoY29uc3QgU3RyaW5nJiBuYW1lKQoreworICAg
IFJlZlB0cjxIVE1MQ2FudmFzRWxlbWVudD4mIGVsZW1lbnQgPSBtX2Nzc0NhbnZhc0VsZW1lbnRz
LmFkZChuYW1lLCAwKS5pdGVyYXRvci0+c2Vjb25kOworICAgIGlmICghZWxlbWVudCkKKyAgICAg
ICAgZWxlbWVudCA9IEhUTUxDYW52YXNFbGVtZW50OjpjcmVhdGUodGhpcyk7CisgICAgcmV0dXJu
IGVsZW1lbnQuZ2V0KCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmluaXRETlNQcmVmZXRjaCgpCit7
CisgICAgU2V0dGluZ3MqIHNldHRpbmdzID0gdGhpcy0+c2V0dGluZ3MoKTsKKworICAgIG1faGF2
ZUV4cGxpY2l0bHlEaXNhYmxlZEROU1ByZWZldGNoID0gZmFsc2U7CisgICAgbV9pc0ROU1ByZWZl
dGNoRW5hYmxlZCA9IHNldHRpbmdzICYmIHNldHRpbmdzLT5kbnNQcmVmZXRjaGluZ0VuYWJsZWQo
KSAmJiBzZWN1cml0eU9yaWdpbigpLT5wcm90b2NvbCgpID09ICJodHRwIjsKKworICAgIC8vIElu
aGVyaXQgRE5TIHByZWZldGNoIG9wdC1vdXQgZnJvbSBwYXJlbnQgZnJhbWUgICAgCisgICAgaWYg
KERvY3VtZW50KiBwYXJlbnQgPSBwYXJlbnREb2N1bWVudCgpKSB7CisgICAgICAgIGlmICghcGFy
ZW50LT5pc0ROU1ByZWZldGNoRW5hYmxlZCgpKQorICAgICAgICAgICAgbV9pc0ROU1ByZWZldGNo
RW5hYmxlZCA9IGZhbHNlOworICAgIH0KK30KKwordm9pZCBEb2N1bWVudDo6cGFyc2VETlNQcmVm
ZXRjaENvbnRyb2xIZWFkZXIoY29uc3QgU3RyaW5nJiBkbnNQcmVmZXRjaENvbnRyb2wpCit7Cisg
ICAgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGRuc1ByZWZldGNoQ29udHJvbCwgIm9uIikgJiYgIW1f
aGF2ZUV4cGxpY2l0bHlEaXNhYmxlZEROU1ByZWZldGNoKSB7CisgICAgICAgIG1faXNETlNQcmVm
ZXRjaEVuYWJsZWQgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbV9pc0RO
U1ByZWZldGNoRW5hYmxlZCA9IGZhbHNlOworICAgIG1faGF2ZUV4cGxpY2l0bHlEaXNhYmxlZERO
U1ByZWZldGNoID0gdHJ1ZTsKK30KKwordm9pZCBEb2N1bWVudDo6YWRkTWVzc2FnZShNZXNzYWdl
U291cmNlIHNvdXJjZSwgTWVzc2FnZVR5cGUgdHlwZSwgTWVzc2FnZUxldmVsIGxldmVsLCBjb25z
dCBTdHJpbmcmIG1lc3NhZ2UsIGNvbnN0IFN0cmluZyYgc291cmNlVVJMLCB1bnNpZ25lZCBsaW5l
TnVtYmVyLCBQYXNzUmVmUHRyPFNjcmlwdENhbGxTdGFjaz4gY2FsbFN0YWNrKQoreworICAgIGlm
ICghaXNDb250ZXh0VGhyZWFkKCkpIHsKKyAgICAgICAgcG9zdFRhc2soQWRkQ29uc29sZU1lc3Nh
Z2VUYXNrOjpjcmVhdGUoc291cmNlLCB0eXBlLCBsZXZlbCwgbWVzc2FnZSkpOworICAgICAgICBy
ZXR1cm47CisgICAgfQorCisgICAgaWYgKERPTVdpbmRvdyogd2luZG93ID0gZG9tV2luZG93KCkp
CisgICAgICAgIHdpbmRvdy0+Y29uc29sZSgpLT5hZGRNZXNzYWdlKHNvdXJjZSwgdHlwZSwgbGV2
ZWwsIG1lc3NhZ2UsIHNvdXJjZVVSTCwgbGluZU51bWJlciwgY2FsbFN0YWNrKTsKK30KKworc3Ry
dWN0IFBlcmZvcm1UYXNrQ29udGV4dCB7CisgICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoUGVyZm9y
bVRhc2tDb250ZXh0KTsgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7CitwdWJsaWM6CisgICAgUGVy
Zm9ybVRhc2tDb250ZXh0KFBhc3NSZWZQdHI8RG9jdW1lbnRXZWFrUmVmZXJlbmNlPiBkb2N1bWVu
dFJlZmVyZW5jZSwgUGFzc093blB0cjxTY3JpcHRFeGVjdXRpb25Db250ZXh0OjpUYXNrPiB0YXNr
KQorICAgICAgICA6IGRvY3VtZW50UmVmZXJlbmNlKGRvY3VtZW50UmVmZXJlbmNlKQorICAgICAg
ICAsIHRhc2sodGFzaykKKyAgICB7CisgICAgfQorCisgICAgUmVmUHRyPERvY3VtZW50V2Vha1Jl
ZmVyZW5jZT4gZG9jdW1lbnRSZWZlcmVuY2U7CisgICAgT3duUHRyPFNjcmlwdEV4ZWN1dGlvbkNv
bnRleHQ6OlRhc2s+IHRhc2s7Cit9OworCit2b2lkIERvY3VtZW50OjpkaWRSZWNlaXZlVGFzayh2
b2lkKiB1bnR5cGVkQ29udGV4dCkKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworCisg
ICAgT3duUHRyPFBlcmZvcm1UYXNrQ29udGV4dD4gY29udGV4dCA9IGFkb3B0UHRyKHN0YXRpY19j
YXN0PFBlcmZvcm1UYXNrQ29udGV4dCo+KHVudHlwZWRDb250ZXh0KSk7CisgICAgQVNTRVJUKGNv
bnRleHQpOworCisgICAgRG9jdW1lbnQqIGRvY3VtZW50ID0gY29udGV4dC0+ZG9jdW1lbnRSZWZl
cmVuY2UtPmRvY3VtZW50KCk7CisgICAgaWYgKCFkb2N1bWVudCkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgUGFnZSogcGFnZSA9IGRvY3VtZW50LT5wYWdlKCk7CisgICAgaWYgKChwYWdlICYmIHBh
Z2UtPmRlZmVyc0xvYWRpbmcoKSkgfHwgIWRvY3VtZW50LT5tX3BlbmRpbmdUYXNrcy5pc0VtcHR5
KCkpIHsKKyAgICAgICAgZG9jdW1lbnQtPm1fcGVuZGluZ1Rhc2tzLmFwcGVuZChjb250ZXh0LT50
YXNrLnJlbGVhc2UoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb250ZXh0LT50
YXNrLT5wZXJmb3JtVGFzayhkb2N1bWVudCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnBvc3RUYXNr
KFBhc3NPd25QdHI8VGFzaz4gdGFzaykKK3sKKyAgICBjYWxsT25NYWluVGhyZWFkKGRpZFJlY2Vp
dmVUYXNrLCBuZXcgUGVyZm9ybVRhc2tDb250ZXh0KG1fd2Vha1JlZmVyZW5jZSwgdGFzaykpOwor
fQorCit2b2lkIERvY3VtZW50OjpwZW5kaW5nVGFza3NUaW1lckZpcmVkKFRpbWVyPERvY3VtZW50
PiopCit7CisgICAgd2hpbGUgKCFtX3BlbmRpbmdUYXNrcy5pc0VtcHR5KCkpIHsKKyAgICAgICAg
T3duUHRyPFRhc2s+IHRhc2sgPSBtX3BlbmRpbmdUYXNrc1swXS5yZWxlYXNlKCk7CisgICAgICAg
IG1fcGVuZGluZ1Rhc2tzLnJlbW92ZSgwKTsKKyAgICAgICAgdGFzay0+cGVyZm9ybVRhc2sodGhp
cyk7CisgICAgfQorfQorCit2b2lkIERvY3VtZW50OjpzdXNwZW5kU2NoZWR1bGVkVGFza3MoQWN0
aXZlRE9NT2JqZWN0OjpSZWFzb25Gb3JTdXNwZW5zaW9uIHJlYXNvbikKK3sKKyAgICBBU1NFUlQo
IW1fc2NoZWR1bGVkVGFza3NBcmVTdXNwZW5kZWQpOworCisgICAgc3VzcGVuZFNjcmlwdGVkQW5p
bWF0aW9uQ29udHJvbGxlckNhbGxiYWNrcygpOworICAgIHN1c3BlbmRBY3RpdmVET01PYmplY3Rz
KHJlYXNvbik7CisgICAgc2NyaXB0UnVubmVyKCktPnN1c3BlbmQoKTsKKyAgICBtX3BlbmRpbmdU
YXNrc1RpbWVyLnN0b3AoKTsKKyAgICBpZiAobV9wYXJzZXIpCisgICAgICAgIG1fcGFyc2VyLT5z
dXNwZW5kU2NoZWR1bGVkVGFza3MoKTsKKworICAgIG1fc2NoZWR1bGVkVGFza3NBcmVTdXNwZW5k
ZWQgPSB0cnVlOworfQorCit2b2lkIERvY3VtZW50OjpyZXN1bWVTY2hlZHVsZWRUYXNrcygpCit7
CisgICAgQVNTRVJUKG1fc2NoZWR1bGVkVGFza3NBcmVTdXNwZW5kZWQpOworCisgICAgaWYgKG1f
cGFyc2VyKQorICAgICAgICBtX3BhcnNlci0+cmVzdW1lU2NoZWR1bGVkVGFza3MoKTsKKyAgICBp
ZiAoIW1fcGVuZGluZ1Rhc2tzLmlzRW1wdHkoKSkKKyAgICAgICAgbV9wZW5kaW5nVGFza3NUaW1l
ci5zdGFydE9uZVNob3QoMCk7CisgICAgc2NyaXB0UnVubmVyKCktPnJlc3VtZSgpOworICAgIHJl
c3VtZUFjdGl2ZURPTU9iamVjdHMoKTsKKyAgICByZXN1bWVTY3JpcHRlZEFuaW1hdGlvbkNvbnRy
b2xsZXJDYWxsYmFja3MoKTsKKyAgICAKKyAgICBtX3NjaGVkdWxlZFRhc2tzQXJlU3VzcGVuZGVk
ID0gZmFsc2U7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnN1c3BlbmRTY3JpcHRlZEFuaW1hdGlvbkNv
bnRyb2xsZXJDYWxsYmFja3MoKQoreworI2lmIEVOQUJMRShSRVFVRVNUX0FOSU1BVElPTl9GUkFN
RSkKKyAgICBpZiAobV9zY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXIpCisgICAgICAgIG1fc2Ny
aXB0ZWRBbmltYXRpb25Db250cm9sbGVyLT5zdXNwZW5kKCk7CisjZW5kaWYKK30KKwordm9pZCBE
b2N1bWVudDo6cmVzdW1lU2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyQ2FsbGJhY2tzKCkKK3sK
KyNpZiBFTkFCTEUoUkVRVUVTVF9BTklNQVRJT05fRlJBTUUpCisgICAgaWYgKG1fc2NyaXB0ZWRB
bmltYXRpb25Db250cm9sbGVyKQorICAgICAgICBtX3NjcmlwdGVkQW5pbWF0aW9uQ29udHJvbGxl
ci0+cmVzdW1lKCk7CisjZW5kaWYKK30KKwordm9pZCBEb2N1bWVudDo6d2luZG93U2NyZWVuRGlk
Q2hhbmdlKFBsYXRmb3JtRGlzcGxheUlEIGRpc3BsYXlJRCkKK3sKKyNpZiBFTkFCTEUoUkVRVUVT
VF9BTklNQVRJT05fRlJBTUUpCisgICAgaWYgKG1fc2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVy
KQorICAgICAgICBtX3NjcmlwdGVkQW5pbWF0aW9uQ29udHJvbGxlci0+d2luZG93U2NyZWVuRGlk
Q2hhbmdlKGRpc3BsYXlJRCk7CisjZWxzZQorICAgIFVOVVNFRF9QQVJBTShkaXNwbGF5SUQpOwor
I2VuZGlmCit9CisKKworU3RyaW5nIERvY3VtZW50OjpkaXNwbGF5U3RyaW5nTW9kaWZpZWRCeUVu
Y29kaW5nKGNvbnN0IFN0cmluZyYgc3RyKSBjb25zdAoreworICAgIGlmIChtX2RlY29kZXIpCisg
ICAgICAgIHJldHVybiBtX2RlY29kZXItPmVuY29kaW5nKCkuZGlzcGxheVN0cmluZyhzdHIuaW1w
bCgpKTsKKyAgICByZXR1cm4gc3RyOworfQorCitQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IERvY3Vt
ZW50OjpkaXNwbGF5U3RyaW5nTW9kaWZpZWRCeUVuY29kaW5nKFBhc3NSZWZQdHI8U3RyaW5nSW1w
bD4gc3RyKSBjb25zdAoreworICAgIGlmIChtX2RlY29kZXIpCisgICAgICAgIHJldHVybiBtX2Rl
Y29kZXItPmVuY29kaW5nKCkuZGlzcGxheVN0cmluZyhzdHIpOworICAgIHJldHVybiBzdHI7Cit9
CisKK3ZvaWQgRG9jdW1lbnQ6OmRpc3BsYXlCdWZmZXJNb2RpZmllZEJ5RW5jb2RpbmcoVUNoYXIq
IGJ1ZmZlciwgdW5zaWduZWQgbGVuKSBjb25zdAoreworICAgIGlmIChtX2RlY29kZXIpCisgICAg
ICAgIG1fZGVjb2Rlci0+ZW5jb2RpbmcoKS5kaXNwbGF5QnVmZmVyKGJ1ZmZlciwgbGVuKTsKK30K
Kwordm9pZCBEb2N1bWVudDo6ZW5xdWV1ZVBhZ2VzaG93RXZlbnQoUGFnZXNob3dFdmVudFBlcnNp
c3RlbmNlIHBlcnNpc3RlZCkKK3sKKyAgICAvLyBGSVhNRTogaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTM2MzM0IFBhZ2VzaG93IGV2ZW50IG5lZWRzIHRvIGZpcmUgYXN5
bmNocm9ub3VzbHkuCisgICAgZGlzcGF0Y2hXaW5kb3dFdmVudChQYWdlVHJhbnNpdGlvbkV2ZW50
OjpjcmVhdGUoZXZlbnROYW1lcygpLnBhZ2VzaG93RXZlbnQsIHBlcnNpc3RlZCksIHRoaXMpOwor
fQorCit2b2lkIERvY3VtZW50OjplbnF1ZXVlSGFzaGNoYW5nZUV2ZW50KGNvbnN0IFN0cmluZyYg
b2xkVVJMLCBjb25zdCBTdHJpbmcmIG5ld1VSTCkKK3sKKyAgICBlbnF1ZXVlV2luZG93RXZlbnQo
SGFzaENoYW5nZUV2ZW50OjpjcmVhdGUob2xkVVJMLCBuZXdVUkwpKTsKK30KKwordm9pZCBEb2N1
bWVudDo6ZW5xdWV1ZVBvcHN0YXRlRXZlbnQoUGFzc1JlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFs
dWU+IHN0YXRlT2JqZWN0KQoreworICAgIC8vIEZJWE1FOiBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9MzYyMDIgUG9wc3RhdGUgZXZlbnQgbmVlZHMgdG8gZmlyZSBhc3lu
Y2hyb25vdXNseQorICAgIGRpc3BhdGNoV2luZG93RXZlbnQoUG9wU3RhdGVFdmVudDo6Y3JlYXRl
KHN0YXRlT2JqZWN0LCBkb21XaW5kb3coKSA/IGRvbVdpbmRvdygpLT5oaXN0b3J5KCkgOiAwKSk7
Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmFkZE1lZGlhQ2FuU3RhcnRMaXN0ZW5lcihNZWRpYUNhblN0
YXJ0TGlzdGVuZXIqIGxpc3RlbmVyKQoreworICAgIEFTU0VSVCghbV9tZWRpYUNhblN0YXJ0TGlz
dGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSk7CisgICAgbV9tZWRpYUNhblN0YXJ0TGlzdGVuZXJz
LmFkZChsaXN0ZW5lcik7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnJlbW92ZU1lZGlhQ2FuU3RhcnRM
aXN0ZW5lcihNZWRpYUNhblN0YXJ0TGlzdGVuZXIqIGxpc3RlbmVyKQoreworICAgIEFTU0VSVCht
X21lZGlhQ2FuU3RhcnRMaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKTsKKyAgICBtX21lZGlh
Q2FuU3RhcnRMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKK30KKworTWVkaWFDYW5TdGFydExp
c3RlbmVyKiBEb2N1bWVudDo6dGFrZUFueU1lZGlhQ2FuU3RhcnRMaXN0ZW5lcigpCit7CisgICAg
SGFzaFNldDxNZWRpYUNhblN0YXJ0TGlzdGVuZXIqPjo6aXRlcmF0b3Igc2xvdCA9IG1fbWVkaWFD
YW5TdGFydExpc3RlbmVycy5iZWdpbigpOworICAgIGlmIChzbG90ID09IG1fbWVkaWFDYW5TdGFy
dExpc3RlbmVycy5lbmQoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgTWVkaWFDYW5TdGFydExp
c3RlbmVyKiBsaXN0ZW5lciA9ICpzbG90OworICAgIG1fbWVkaWFDYW5TdGFydExpc3RlbmVycy5y
ZW1vdmUoc2xvdCk7CisgICAgcmV0dXJuIGxpc3RlbmVyOworfQorCisjaWYgRU5BQkxFKEZVTExT
Q1JFRU5fQVBJKQorYm9vbCBEb2N1bWVudDo6ZnVsbFNjcmVlbklzQWxsb3dlZEZvckVsZW1lbnQo
RWxlbWVudCogZWxlbWVudCkgY29uc3QKK3sKKyAgICBBU1NFUlQoZWxlbWVudCk7CisgICAgcmV0
dXJuIGlzQXR0cmlidXRlT25BbGxPd25lcnMod2Via2l0YWxsb3dmdWxsc2NyZWVuQXR0ciwgZWxl
bWVudC0+ZG9jdW1lbnQoKS0+b3duZXJFbGVtZW50KCkpOworfQorCit2b2lkIERvY3VtZW50Ojpy
ZXF1ZXN0RnVsbFNjcmVlbkZvckVsZW1lbnQoRWxlbWVudCogZWxlbWVudCwgdW5zaWduZWQgc2hv
cnQgZmxhZ3MsIEZ1bGxTY3JlZW5DaGVja1R5cGUgY2hlY2tUeXBlKQoreworICAgIC8vIFRoZSBN
b3ppbGxhIEZ1bGwgU2NyZWVuIEFQSSA8aHR0cHM6Ly93aWtpLm1vemlsbGEub3JnL0dlY2tvOkZ1
bGxTY3JlZW5BUEk+IGhhcyBkaWZmZXJlbnQgcmVxdWlyZW1lbnRzCisgICAgLy8gZm9yIGZ1bGwg
c2NyZWVuIG1vZGUsIGFuZCBkbyBub3QgaGF2ZSB0aGUgY29uY2VwdCBvZiBhIGZ1bGwgc2NyZWVu
IGVsZW1lbnQgc3RhY2suCisgICAgYm9vbCBpbkxlZ2FjeU1vemlsbGFNb2RlID0gKGZsYWdzICYg
RWxlbWVudDo6TEVHQUNZX01PWklMTEFfUkVRVUVTVCk7CisKKyAgICBkbyB7CisgICAgICAgIGlm
ICghZWxlbWVudCkKKyAgICAgICAgICAgIGVsZW1lbnQgPSBkb2N1bWVudEVsZW1lbnQoKTsKKyAK
KyAgICAgICAgLy8gMS4gSWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgdHJ1
ZSwgdGVybWluYXRlIHRoZXNlIHN0ZXBzIGFuZCBxdWV1ZSBhIHRhc2sgdG8gZmlyZQorICAgICAg
ICAvLyBhbiBldmVudCBuYW1lZCBmdWxsc2NyZWVuZXJyb3Igd2l0aCBpdHMgYnViYmxlcyBhdHRy
aWJ1dGUgc2V0IHRvIHRydWUgb24gdGhlIGNvbnRleHQgb2JqZWN0J3MgCisgICAgICAgIC8vIG5v
ZGUgZG9jdW1lbnQ6CisKKyAgICAgICAgLy8gVGhlIGNvbnRleHQgb2JqZWN0IGlzIG5vdCBpbiBh
IGRvY3VtZW50LgorICAgICAgICBpZiAoIWVsZW1lbnQtPmluRG9jdW1lbnQoKSkKKyAgICAgICAg
ICAgIGJyZWFrOworCisgICAgICAgIC8vIFRoZSBjb250ZXh0IG9iamVjdCdzIG5vZGUgZG9jdW1l
bnQsIG9yIGFuIGFuY2VzdG9yIGJyb3dzaW5nIGNvbnRleHQncyBkb2N1bWVudCBkb2VzIG5vdCBo
YXZlCisgICAgICAgIC8vIHRoZSBmdWxsc2NyZWVuIGVuYWJsZWQgZmxhZyBzZXQuCisgICAgICAg
IGlmIChjaGVja1R5cGUgPT0gRW5mb3JjZUlGcmFtZUFsbG93RnVsbFNjcmVlblJlcXVpcmVtZW50
ICYmICFmdWxsU2NyZWVuSXNBbGxvd2VkRm9yRWxlbWVudChlbGVtZW50KSkKKyAgICAgICAgICAg
IGJyZWFrOworCisgICAgICAgIC8vIFRoZSBjb250ZXh0IG9iamVjdCdzIG5vZGUgZG9jdW1lbnQg
ZnVsbHNjcmVlbiBlbGVtZW50IHN0YWNrIGlzIG5vdCBlbXB0eSBhbmQgaXRzIHRvcCBlbGVtZW50
CisgICAgICAgIC8vIGlzIG5vdCBhbiBhbmNlc3RvciBvZiB0aGUgY29udGV4dCBvYmplY3QuIChO
T1RFOiBJZ25vcmUgdGhpcyByZXF1aXJlbWVudCBpZiB0aGUgcmVxdWVzdCB3YXMKKyAgICAgICAg
Ly8gbWFkZSB2aWEgdGhlIGxlZ2FjeSBNb3ppbGxhLXN0eWxlIEFQSS4pCisgICAgICAgIGlmICgh
bV9mdWxsU2NyZWVuRWxlbWVudFN0YWNrLmlzRW1wdHkoKSAmJiAhbV9mdWxsU2NyZWVuRWxlbWVu
dFN0YWNrLmZpcnN0KCktPmNvbnRhaW5zKGVsZW1lbnQpICYmICFpbkxlZ2FjeU1vemlsbGFNb2Rl
KQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLy8gQSBkZXNjZW5kYW50IGJyb3dzaW5n
IGNvbnRleHQncyBkb2N1bWVudCBoYXMgYSBub24tZW1wdHkgZnVsbHNjcmVlbiBlbGVtZW50IHN0
YWNrLgorICAgICAgICBib29sIGRlc2NlbmRlbnRIYXNOb25FbXB0eVN0YWNrID0gZmFsc2U7Cisg
ICAgICAgIGZvciAoRnJhbWUqIGRlc2NlbmRhbnQgPSBmcmFtZSgpID8gZnJhbWUoKS0+dHJlZSgp
LT50cmF2ZXJzZU5leHQoKSA6IDA7IGRlc2NlbmRhbnQ7IGRlc2NlbmRhbnQgPSBkZXNjZW5kYW50
LT50cmVlKCktPnRyYXZlcnNlTmV4dCgpKSB7CisgICAgICAgICAgICBpZiAoZGVzY2VuZGFudC0+
ZG9jdW1lbnQoKS0+d2Via2l0RnVsbHNjcmVlbkVsZW1lbnQoKSkgeworICAgICAgICAgICAgICAg
IGRlc2NlbmRlbnRIYXNOb25FbXB0eVN0YWNrID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZGVzY2VuZGVudEhhc05v
bkVtcHR5U3RhY2sgJiYgIWluTGVnYWN5TW96aWxsYU1vZGUpCisgICAgICAgICAgICBicmVhazsK
KworICAgICAgICAvLyBUaGlzIGFsZ29yaXRobSBpcyBub3QgYWxsb3dlZCB0byBzaG93IGEgcG9w
LXVwOgorICAgICAgICAvLyAgIEFuIGFsZ29yaXRobSBpcyBhbGxvd2VkIHRvIHNob3cgYSBwb3At
dXAgaWYsIGluIHRoZSB0YXNrIGluIHdoaWNoIHRoZSBhbGdvcml0aG0gaXMgcnVubmluZywgZWl0
aGVyOgorICAgICAgICAvLyAgIC0gYW4gYWN0aXZhdGlvbiBiZWhhdmlvciBpcyBjdXJyZW50bHkg
YmVpbmcgcHJvY2Vzc2VkIHdob3NlIGNsaWNrIGV2ZW50IHdhcyB0cnVzdGVkLCBvcgorICAgICAg
ICAvLyAgIC0gdGhlIGV2ZW50IGxpc3RlbmVyIGZvciBhIHRydXN0ZWQgY2xpY2sgZXZlbnQgaXMg
YmVpbmcgaGFuZGxlZC4KKyAgICAgICAgaWYgKCFTY3JpcHRDb250cm9sbGVyOjpwcm9jZXNzaW5n
VXNlckdlc3R1cmUoKSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8vIFRoZXJlIGlz
IGEgcHJldmlvdXNseS1lc3RhYmxpc2hlZCB1c2VyIHByZWZlcmVuY2UsIHNlY3VyaXR5IHJpc2ss
IG9yIHBsYXRmb3JtIGxpbWl0YXRpb24uCisgICAgICAgIGlmICghcGFnZSgpIHx8ICFwYWdlKCkt
PnNldHRpbmdzKCktPmZ1bGxTY3JlZW5FbmFibGVkKCkpCisgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgCisgICAgICAgIGlmICghcGFnZSgpLT5jaHJvbWUoKS0+Y2xpZW50KCktPnN1cHBvcnRz
RnVsbFNjcmVlbkZvckVsZW1lbnQoZWxlbWVudCwgZmxhZ3MgJiBFbGVtZW50OjpBTExPV19LRVlC
T0FSRF9JTlBVVCkpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvLyAyLiBMZXQgZG9j
IGJlIGVsZW1lbnQncyBub2RlIGRvY3VtZW50LiAoaS5lLiAidGhpcyIpCisgICAgICAgIERvY3Vt
ZW50KiBjdXJyZW50RG9jID0gdGhpczsKKworICAgICAgICAvLyAzLiBMZXQgZG9jcyBiZSBhbGwg
ZG9jJ3MgYW5jZXN0b3IgYnJvd3NpbmcgY29udGV4dCdzIGRvY3VtZW50cyAoaWYgYW55KSBhbmQg
ZG9jLgorICAgICAgICBEZXF1ZTxEb2N1bWVudCo+IGRvY3M7CisKKyAgICAgICAgZG8geworICAg
ICAgICAgICAgZG9jcy5wcmVwZW5kKGN1cnJlbnREb2MpOworICAgICAgICAgICAgY3VycmVudERv
YyA9IGN1cnJlbnREb2MtPm93bmVyRWxlbWVudCgpID8gY3VycmVudERvYy0+b3duZXJFbGVtZW50
KCktPmRvY3VtZW50KCkgOiAwOworICAgICAgICB9IHdoaWxlIChjdXJyZW50RG9jKTsKKworICAg
ICAgICAvLyA0LiBGb3IgZWFjaCBkb2N1bWVudCBpbiBkb2NzLCBydW4gdGhlc2Ugc3Vic3RlcHM6
CisgICAgICAgIERlcXVlPERvY3VtZW50Kj46Oml0ZXJhdG9yIGN1cnJlbnQgPSBkb2NzLmJlZ2lu
KCksIGZvbGxvd2luZyA9IGRvY3MuYmVnaW4oKTsKKworICAgICAgICBkbyB7CisgICAgICAgICAg
ICArK2ZvbGxvd2luZzsKKworICAgICAgICAgICAgLy8gMS4gTGV0IGZvbGxvd2luZyBkb2N1bWVu
dCBiZSB0aGUgZG9jdW1lbnQgYWZ0ZXIgZG9jdW1lbnQgaW4gZG9jcywgb3IgbnVsbCBpZiB0aGVy
ZSBpcyBubworICAgICAgICAgICAgLy8gc3VjaCBkb2N1bWVudC4KKyAgICAgICAgICAgIERvY3Vt
ZW50KiBjdXJyZW50RG9jID0gKmN1cnJlbnQ7CisgICAgICAgICAgICBEb2N1bWVudCogZm9sbG93
aW5nRG9jID0gZm9sbG93aW5nICE9IGRvY3MuZW5kKCkgPyAqZm9sbG93aW5nIDogMDsKKworICAg
ICAgICAgICAgLy8gMi4gSWYgZm9sbG93aW5nIGRvY3VtZW50IGlzIG51bGwsIHB1c2ggY29udGV4
dCBvYmplY3Qgb24gZG9jdW1lbnQncyBmdWxsc2NyZWVuIGVsZW1lbnQKKyAgICAgICAgICAgIC8v
IHN0YWNrLCBhbmQgcXVldWUgYSB0YXNrIHRvIGZpcmUgYW4gZXZlbnQgbmFtZWQgZnVsbHNjcmVl
bmNoYW5nZSB3aXRoIGl0cyBidWJibGVzIGF0dHJpYnV0ZQorICAgICAgICAgICAgLy8gc2V0IHRv
IHRydWUgb24gdGhlIGRvY3VtZW50LgorICAgICAgICAgICAgaWYgKCFmb2xsb3dpbmdEb2MpIHsK
KyAgICAgICAgICAgICAgICBjdXJyZW50RG9jLT5wdXNoRnVsbHNjcmVlbkVsZW1lbnRTdGFjayhl
bGVtZW50KTsKKyAgICAgICAgICAgICAgICBhZGREb2N1bWVudFRvRnVsbFNjcmVlbkNoYW5nZUV2
ZW50UXVldWUoY3VycmVudERvYyk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgIC8vIDMuIE90aGVyd2lzZSwgaWYgZG9jdW1lbnQncyBmdWxs
c2NyZWVuIGVsZW1lbnQgc3RhY2sgaXMgZWl0aGVyIGVtcHR5IG9yIGl0cyB0b3AgZWxlbWVudAor
ICAgICAgICAgICAgLy8gaXMgbm90IGZvbGxvd2luZyBkb2N1bWVudCdzIGJyb3dzaW5nIGNvbnRl
eHQgY29udGFpbmVyLAorICAgICAgICAgICAgRWxlbWVudCogdG9wRWxlbWVudCA9IGN1cnJlbnRE
b2MtPndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50KCk7CisgICAgICAgICAgICBpZiAoIXRvcEVsZW1l
bnQgfHwgdG9wRWxlbWVudCAhPSBmb2xsb3dpbmdEb2MtPm93bmVyRWxlbWVudCgpKSB7CisgICAg
ICAgICAgICAgICAgLy8gLi4ucHVzaCBmb2xsb3dpbmcgZG9jdW1lbnQncyBicm93c2luZyBjb250
ZXh0IGNvbnRhaW5lciBvbiBkb2N1bWVudCdzIGZ1bGxzY3JlZW4gZWxlbWVudAorICAgICAgICAg
ICAgICAgIC8vIHN0YWNrLCBhbmQgcXVldWUgYSB0YXNrIHRvIGZpcmUgYW4gZXZlbnQgbmFtZWQg
ZnVsbHNjcmVlbmNoYW5nZSB3aXRoIGl0cyBidWJibGVzIGF0dHJpYnV0ZQorICAgICAgICAgICAg
ICAgIC8vIHNldCB0byB0cnVlIG9uIGRvY3VtZW50LgorICAgICAgICAgICAgICAgIGN1cnJlbnRE
b2MtPnB1c2hGdWxsc2NyZWVuRWxlbWVudFN0YWNrKGZvbGxvd2luZ0RvYy0+b3duZXJFbGVtZW50
KCkpOworICAgICAgICAgICAgICAgIGFkZERvY3VtZW50VG9GdWxsU2NyZWVuQ2hhbmdlRXZlbnRR
dWV1ZShjdXJyZW50RG9jKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgLy8gNC4gT3RoZXJ3aXNlLCBkbyBub3RoaW5nIGZvciB0aGlzIGRv
Y3VtZW50LiBJdCBzdGF5cyB0aGUgc2FtZS4KKyAgICAgICAgfSB3aGlsZSAoKytjdXJyZW50ICE9
IGRvY3MuZW5kKCkpOworCisgICAgICAgIC8vIDUuIFJldHVybiwgYW5kIHJ1biB0aGUgcmVtYWlu
aW5nIHN0ZXBzIGFzeW5jaHJvbm91c2x5LgorICAgICAgICAvLyA2LiBPcHRpb25hbGx5LCBwZXJm
b3JtIHNvbWUgYW5pbWF0aW9uLgorICAgICAgICBtX2FyZUtleXNFbmFibGVkSW5GdWxsU2NyZWVu
ID0gZmxhZ3MgJiBFbGVtZW50OjpBTExPV19LRVlCT0FSRF9JTlBVVDsKKyAgICAgICAgcGFnZSgp
LT5jaHJvbWUoKS0+Y2xpZW50KCktPmVudGVyRnVsbFNjcmVlbkZvckVsZW1lbnQoZWxlbWVudCk7
CisKKyAgICAgICAgLy8gNy4gT3B0aW9uYWxseSwgZGlzcGxheSBhIG1lc3NhZ2UgaW5kaWNhdGlu
ZyBob3cgdGhlIHVzZXIgY2FuIGV4aXQgZGlzcGxheWluZyB0aGUgY29udGV4dCBvYmplY3QgZnVs
bHNjcmVlbi4KKyAgICAgICAgcmV0dXJuOworICAgIH0gd2hpbGUgKDApOworCisgICAgbV9mdWxs
U2NyZWVuRXJyb3JFdmVudFRhcmdldFF1ZXVlLmFwcGVuZChlbGVtZW50ID8gZWxlbWVudCA6IGRv
Y3VtZW50RWxlbWVudCgpKTsKKyAgICBtX2Z1bGxTY3JlZW5DaGFuZ2VEZWxheVRpbWVyLnN0YXJ0
T25lU2hvdCgwKTsKK30KKwordm9pZCBEb2N1bWVudDo6d2Via2l0Q2FuY2VsRnVsbFNjcmVlbigp
Cit7CisgICAgLy8gVGhlIE1vemlsbGEgImNhbmNlbEZ1bGxTY3JlZW4oKSIgQVBJIGJlaGF2ZXMg
bGlrZSB0aGUgVzNDICJmdWxseSBleGl0IGZ1bGxzY3JlZW4iIGJlaGF2aW9yLCB3aGljaAorICAg
IC8vIGlzIGRlZmluZWQgYXM6IAorICAgIC8vICJUbyBmdWxseSBleGl0IGZ1bGxzY3JlZW4gYWN0
IGFzIGlmIHRoZSBleGl0RnVsbHNjcmVlbigpIG1ldGhvZCB3YXMgaW52b2tlZCBvbiB0aGUgdG9w
LWxldmVsIGJyb3dzaW5nCisgICAgLy8gY29udGV4dCdzIGRvY3VtZW50IGFuZCBzdWJzZXF1ZW50
bHkgZW1wdHkgdGhhdCBkb2N1bWVudCdzIGZ1bGxzY3JlZW4gZWxlbWVudCBzdGFjay4iCisgICAg
aWYgKCF0b3BEb2N1bWVudCgpLT53ZWJraXRGdWxsc2NyZWVuRWxlbWVudCgpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICAvLyBUbyBhY2hpZXZlIHRoYXQgYWltLCByZW1vdmUgYWxsIHRoZSBlbGVt
ZW50cyBmcm9tIHRoZSB0b3AgZG9jdW1lbnQncyBzdGFjayBleGNlcHQgZm9yIHRoZSBmaXJzdCBi
ZWZvcmUKKyAgICAvLyBjYWxsaW5nIHdlYmtpdEV4aXRGdWxsc2NyZWVuKCk6CisgICAgRGVxdWU8
UmVmUHRyPEVsZW1lbnQ+ID4gcmVwbGFjZW1lbnRGdWxsc2NyZWVuRWxlbWVudFN0YWNrOworICAg
IHJlcGxhY2VtZW50RnVsbHNjcmVlbkVsZW1lbnRTdGFjay5wcmVwZW5kKHRvcERvY3VtZW50KCkt
PndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50KCkpOworICAgIHRvcERvY3VtZW50KCktPm1fZnVsbFNj
cmVlbkVsZW1lbnRTdGFjay5zd2FwKHJlcGxhY2VtZW50RnVsbHNjcmVlbkVsZW1lbnRTdGFjayk7
CisKKyAgICB0b3BEb2N1bWVudCgpLT53ZWJraXRFeGl0RnVsbHNjcmVlbigpOworfQorCit2b2lk
IERvY3VtZW50Ojp3ZWJraXRFeGl0RnVsbHNjcmVlbigpCit7CisgICAgLy8gVGhlIGV4aXRGdWxs
c2NyZWVuKCkgbWV0aG9kIG11c3QgcnVuIHRoZXNlIHN0ZXBzOgorICAgIAorICAgIC8vIDEuIExl
dCBkb2MgYmUgdGhlIGNvbnRleHQgb2JqZWN0LiAoaS5lLiAidGhpcyIpCisgICAgRG9jdW1lbnQq
IGN1cnJlbnREb2MgPSB0aGlzOworCisgICAgLy8gMi4gSWYgZG9jJ3MgZnVsbHNjcmVlbiBlbGVt
ZW50IHN0YWNrIGlzIGVtcHR5LCB0ZXJtaW5hdGUgdGhlc2Ugc3RlcHMuCisgICAgaWYgKG1fZnVs
bFNjcmVlbkVsZW1lbnRTdGFjay5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAg
ICAvLyAzLiBMZXQgZGVzY2VuZGFudHMgYmUgYWxsIHRoZSBkb2MncyBkZXNjZW5kYW50IGJyb3dz
aW5nIGNvbnRleHQncyBkb2N1bWVudHMgd2l0aCBhIG5vbi1lbXB0eSBmdWxsc2NyZWVuCisgICAg
Ly8gZWxlbWVudCBzdGFjayAoaWYgYW55KSwgb3JkZXJlZCBzbyB0aGF0IHRoZSBjaGlsZCBvZiB0
aGUgZG9jIGlzIGxhc3QgYW5kIHRoZSBkb2N1bWVudCBmdXJ0aGVzdAorICAgIC8vIGF3YXkgZnJv
bSB0aGUgZG9jIGlzIGZpcnN0LgorICAgIERlcXVlPFJlZlB0cjxEb2N1bWVudD4gPiBkZXNjZW5k
YW50czsKKyAgICBmb3IgKEZyYW1lKiBkZXNjZW5kYW50ID0gZnJhbWUoKSA/IGZyYW1lKCktPnRy
ZWUoKS0+dHJhdmVyc2VOZXh0KCkgOiAwOyBkZXNjZW5kYW50OyBkZXNjZW5kYW50ID0gZGVzY2Vu
ZGFudC0+dHJlZSgpLT50cmF2ZXJzZU5leHQoKSkgeworICAgICAgICBpZiAoZGVzY2VuZGFudC0+
ZG9jdW1lbnQoKS0+d2Via2l0RnVsbHNjcmVlbkVsZW1lbnQoKSkKKyAgICAgICAgICAgIGRlc2Nl
bmRhbnRzLnByZXBlbmQoZGVzY2VuZGFudC0+ZG9jdW1lbnQoKSk7CisgICAgfQorICAgICAgICAK
KyAgICAvLyA0LiBGb3IgZWFjaCBkZXNjZW5kYW50IGluIGRlc2NlbmRhbnRzLCBlbXB0eSBkZXNj
ZW5kYW50J3MgZnVsbHNjcmVlbiBlbGVtZW50IHN0YWNrLCBhbmQgcXVldWUgYQorICAgIC8vIHRh
c2sgdG8gZmlyZSBhbiBldmVudCBuYW1lZCBmdWxsc2NyZWVuY2hhbmdlIHdpdGggaXRzIGJ1YmJs
ZXMgYXR0cmlidXRlIHNldCB0byB0cnVlIG9uIGRlc2NlbmRhbnQuCisgICAgZm9yIChEZXF1ZTxS
ZWZQdHI8RG9jdW1lbnQ+ID46Oml0ZXJhdG9yIGkgPSBkZXNjZW5kYW50cy5iZWdpbigpOyBpICE9
IGRlc2NlbmRhbnRzLmVuZCgpOyArK2kpIHsKKyAgICAgICAgKCppKS0+Y2xlYXJGdWxsc2NyZWVu
RWxlbWVudFN0YWNrKCk7CisgICAgICAgIGFkZERvY3VtZW50VG9GdWxsU2NyZWVuQ2hhbmdlRXZl
bnRRdWV1ZShpLT5nZXQoKSk7CisgICAgfQorCisgICAgLy8gNS4gV2hpbGUgZG9jIGlzIG5vdCBu
dWxsLCBydW4gdGhlc2Ugc3Vic3RlcHM6CisgICAgRWxlbWVudCogbmV3VG9wID0gMDsKKyAgICB3
aGlsZSAoY3VycmVudERvYykgeworICAgICAgICAvLyAxLiBQb3AgdGhlIHRvcCBlbGVtZW50IG9m
IGRvYydzIGZ1bGxzY3JlZW4gZWxlbWVudCBzdGFjay4KKyAgICAgICAgY3VycmVudERvYy0+cG9w
RnVsbHNjcmVlbkVsZW1lbnRTdGFjaygpOworCisgICAgICAgIC8vICAgIElmIGRvYydzIGZ1bGxz
Y3JlZW4gZWxlbWVudCBzdGFjayBpcyBub24tZW1wdHkgYW5kIHRoZSBlbGVtZW50IG5vdyBhdCB0
aGUgdG9wIGlzIGVpdGhlcgorICAgICAgICAvLyAgICBub3QgaW4gYSBkb2N1bWVudCBvciBpdHMg
bm9kZSBkb2N1bWVudCBpcyBub3QgZG9jLCByZXBlYXQgdGhpcyBzdWJzdGVwLgorICAgICAgICBu
ZXdUb3AgPSBjdXJyZW50RG9jLT53ZWJraXRGdWxsc2NyZWVuRWxlbWVudCgpOworICAgICAgICBp
ZiAobmV3VG9wICYmICghbmV3VG9wLT5pbkRvY3VtZW50KCkgfHwgbmV3VG9wLT5kb2N1bWVudCgp
ICE9IGN1cnJlbnREb2MpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLy8gMi4g
UXVldWUgYSB0YXNrIHRvIGZpcmUgYW4gZXZlbnQgbmFtZWQgZnVsbHNjcmVlbmNoYW5nZSB3aXRo
IGl0cyBidWJibGVzIGF0dHJpYnV0ZSBzZXQgdG8gdHJ1ZQorICAgICAgICAvLyBvbiBkb2MuCisg
ICAgICAgIGFkZERvY3VtZW50VG9GdWxsU2NyZWVuQ2hhbmdlRXZlbnRRdWV1ZShjdXJyZW50RG9j
KTsKKworICAgICAgICAvLyAzLiBJZiBkb2MncyBmdWxsc2NyZWVuIGVsZW1lbnQgc3RhY2sgaXMg
ZW1wdHkgYW5kIGRvYydzIGJyb3dzaW5nIGNvbnRleHQgaGFzIGEgYnJvd3NpbmcgY29udGV4dAor
ICAgICAgICAvLyBjb250YWluZXIsIHNldCBkb2MgdG8gdGhhdCBicm93c2luZyBjb250ZXh0IGNv
bnRhaW5lcidzIG5vZGUgZG9jdW1lbnQuCisgICAgICAgIGlmICghbmV3VG9wICYmIGN1cnJlbnRE
b2MtPm93bmVyRWxlbWVudCgpKSB7CisgICAgICAgICAgICBjdXJyZW50RG9jID0gY3VycmVudERv
Yy0+b3duZXJFbGVtZW50KCktPmRvY3VtZW50KCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAg
ICAgICAgfQorCisgICAgICAgIC8vIDQuIE90aGVyd2lzZSwgc2V0IGRvYyB0byBudWxsLgorICAg
ICAgICBjdXJyZW50RG9jID0gMDsKKyAgICB9CisKKyAgICAvLyA2LiBSZXR1cm4sIGFuZCBydW4g
dGhlIHJlbWFpbmluZyBzdGVwcyBhc3luY2hyb25vdXNseS4KKyAgICAvLyA3LiBPcHRpb25hbGx5
LCBwZXJmb3JtIHNvbWUgYW5pbWF0aW9uLgorCisgICAgLy8gT25seSBleGl0IG91dCBvZiBmdWxs
IHNjcmVlbiB3aW5kb3cgbW9kZSBpZiB0aGVyZSBhcmUgbm8gcmVtYWluaW5nIGVsZW1lbnRzIGlu
IHRoZSAKKyAgICAvLyBmdWxsIHNjcmVlbiBzdGFjay4KKyAgICBpZiAoIW5ld1RvcCkgeworICAg
ICAgICBwYWdlKCktPmNocm9tZSgpLT5jbGllbnQoKS0+ZXhpdEZ1bGxTY3JlZW5Gb3JFbGVtZW50
KG1fZnVsbFNjcmVlbkVsZW1lbnQuZ2V0KCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisg
ICAgLy8gT3RoZXJ3aXNlLCBub3RpZnkgdGhlIGNocm9tZSBvZiB0aGUgbmV3IGZ1bGwgc2NyZWVu
IGVsZW1lbnQuCisgICAgcGFnZSgpLT5jaHJvbWUoKS0+Y2xpZW50KCktPmVudGVyRnVsbFNjcmVl
bkZvckVsZW1lbnQobmV3VG9wKTsgICAgICAKK30KKworYm9vbCBEb2N1bWVudDo6d2Via2l0RnVs
bHNjcmVlbkVuYWJsZWQoKSBjb25zdAoreworICAgIC8vIDQuIFRoZSBmdWxsc2NyZWVuRW5hYmxl
ZCBhdHRyaWJ1dGUgbXVzdCByZXR1cm4gdHJ1ZSBpZiB0aGUgY29udGV4dCBvYmplY3QgYW5kIGFs
bCBhbmNlc3RvcgorICAgIC8vIGJyb3dzaW5nIGNvbnRleHQncyBkb2N1bWVudHMgaGF2ZSB0aGVp
ciBmdWxsc2NyZWVuIGVuYWJsZWQgZmxhZyBzZXQsIG9yIGZhbHNlIG90aGVyd2lzZS4KKworICAg
IC8vIFRvcC1sZXZlbCBicm93c2luZyBjb250ZXh0cyBhcmUgaW1wbGllZCB0byBoYXZlIHRoZWly
IGFsbG93RnVsbFNjcmVlbiBhdHRyaWJ1dGUgc2V0LgorICAgIHJldHVybiBpc0F0dHJpYnV0ZU9u
QWxsT3duZXJzKHdlYmtpdGFsbG93ZnVsbHNjcmVlbkF0dHIsIG93bmVyRWxlbWVudCgpKTsKK30K
Kwordm9pZCBEb2N1bWVudDo6d2Via2l0V2lsbEVudGVyRnVsbFNjcmVlbkZvckVsZW1lbnQoRWxl
bWVudCogZWxlbWVudCkKK3sKKyAgICBpZiAoIWF0dGFjaGVkKCkgfHwgaW5QYWdlQ2FjaGUoKSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgQVNTRVJUKGVsZW1lbnQpOworCisgICAgLy8gUHJvdGVj
dCBhZ2FpbnN0IGJlaW5nIGNhbGxlZCBhZnRlciB0aGUgZG9jdW1lbnQgaGFzIGJlZW4gcmVtb3Zl
ZCBmcm9tIHRoZSBwYWdlLgorICAgIGlmICghcGFnZSgpKQorICAgICAgICByZXR1cm47CisKKyAg
ICBBU1NFUlQocGFnZSgpLT5zZXR0aW5ncygpLT5mdWxsU2NyZWVuRW5hYmxlZCgpKTsKKworICAg
IGlmIChtX2Z1bGxTY3JlZW5SZW5kZXJlcikKKyAgICAgICAgbV9mdWxsU2NyZWVuUmVuZGVyZXIt
PnVud3JhcFJlbmRlcmVyKCk7CisKKyAgICBtX2Z1bGxTY3JlZW5FbGVtZW50ID0gZWxlbWVudDsK
KworI2lmIFVTRShOQVRJVkVfRlVMTFNDUkVFTl9WSURFTykKKyAgICBpZiAoZWxlbWVudCAmJiBl
bGVtZW50LT5pc01lZGlhRWxlbWVudCgpKQorICAgICAgICByZXR1cm47CisjZW5kaWYKKworICAg
IC8vIENyZWF0ZSBhIHBsYWNlaG9sZGVyIGJsb2NrIGZvciBhIHRoZSBmdWxsLXNjcmVlbiBlbGVt
ZW50LCB0byBrZWVwIHRoZSBwYWdlIGZyb20gcmVmbG93aW5nCisgICAgLy8gd2hlbiB0aGUgZWxl
bWVudCBpcyByZW1vdmVkIGZyb20gdGhlIG5vcm1hbCBmbG93LiAgT25seSBkbyB0aGlzIGZvciBh
IFJlbmRlckJveCwgYXMgb25seSAKKyAgICAvLyBhIGJveCB3aWxsIGhhdmUgYSBmcmFtZVJlY3Qu
ICBUaGUgcGxhY2Vob2xkZXIgd2lsbCBiZSBjcmVhdGVkIGluIHNldEZ1bGxTY3JlZW5SZW5kZXJl
cigpCisgICAgLy8gZHVyaW5nIGxheW91dC4KKyAgICBSZW5kZXJPYmplY3QqIHJlbmRlcmVyID0g
bV9mdWxsU2NyZWVuRWxlbWVudC0+cmVuZGVyZXIoKTsKKyAgICBib29sIHNob3VsZENyZWF0ZVBs
YWNlaG9sZGVyID0gcmVuZGVyZXIgJiYgcmVuZGVyZXItPmlzQm94KCk7CisgICAgaWYgKHNob3Vs
ZENyZWF0ZVBsYWNlaG9sZGVyKSB7CisgICAgICAgIG1fc2F2ZWRQbGFjZWhvbGRlckZyYW1lUmVj
dCA9IHRvUmVuZGVyQm94KHJlbmRlcmVyKS0+ZnJhbWVSZWN0KCk7CisgICAgICAgIG1fc2F2ZWRQ
bGFjZWhvbGRlclJlbmRlclN0eWxlID0gUmVuZGVyU3R5bGU6OmNsb25lKHJlbmRlcmVyLT5zdHls
ZSgpKTsKKyAgICB9CisKKyAgICBpZiAobV9mdWxsU2NyZWVuRWxlbWVudCAhPSBkb2N1bWVudEVs
ZW1lbnQoKSkKKyAgICAgICAgUmVuZGVyRnVsbFNjcmVlbjo6d3JhcFJlbmRlcmVyKHJlbmRlcmVy
LCByZW5kZXJlciA/IHJlbmRlcmVyLT5wYXJlbnQoKSA6IDAsIHRoaXMpOworCisgICAgbV9mdWxs
U2NyZWVuRWxlbWVudC0+c2V0Q29udGFpbnNGdWxsU2NyZWVuRWxlbWVudE9uQW5jZXN0b3JzQ3Jv
c3NpbmdGcmFtZUJvdW5kYXJpZXModHJ1ZSk7CisgICAgCisgICAgcmVjYWxjU3R5bGUoRm9yY2Up
OworfQorCit2b2lkIERvY3VtZW50Ojp3ZWJraXREaWRFbnRlckZ1bGxTY3JlZW5Gb3JFbGVtZW50
KEVsZW1lbnQqKQoreworICAgIGlmICghbV9mdWxsU2NyZWVuRWxlbWVudCkKKyAgICAgICAgcmV0
dXJuOworCisgICAgaWYgKCFhdHRhY2hlZCgpIHx8IGluUGFnZUNhY2hlKCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIG1fZnVsbFNjcmVlbkVsZW1lbnQtPmRpZEJlY29tZUZ1bGxzY3JlZW5FbGVt
ZW50KCk7CisKKyAgICBtX2Z1bGxTY3JlZW5DaGFuZ2VEZWxheVRpbWVyLnN0YXJ0T25lU2hvdCgw
KTsKK30KKwordm9pZCBEb2N1bWVudDo6d2Via2l0V2lsbEV4aXRGdWxsU2NyZWVuRm9yRWxlbWVu
dChFbGVtZW50KikKK3sKKyAgICBpZiAoIW1fZnVsbFNjcmVlbkVsZW1lbnQpCisgICAgICAgIHJl
dHVybjsKKworICAgIGlmICghYXR0YWNoZWQoKSB8fCBpblBhZ2VDYWNoZSgpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBtX2Z1bGxTY3JlZW5FbGVtZW50LT53aWxsU3RvcEJlaW5nRnVsbHNjcmVl
bkVsZW1lbnQoKTsKK30KKwordm9pZCBEb2N1bWVudDo6d2Via2l0RGlkRXhpdEZ1bGxTY3JlZW5G
b3JFbGVtZW50KEVsZW1lbnQqKQoreworICAgIGlmICghbV9mdWxsU2NyZWVuRWxlbWVudCkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgaWYgKCFhdHRhY2hlZCgpIHx8IGluUGFnZUNhY2hlKCkpCisg
ICAgICAgIHJldHVybjsKKworICAgIG1fZnVsbFNjcmVlbkVsZW1lbnQtPnNldENvbnRhaW5zRnVs
bFNjcmVlbkVsZW1lbnRPbkFuY2VzdG9yc0Nyb3NzaW5nRnJhbWVCb3VuZGFyaWVzKGZhbHNlKTsK
KworICAgIG1fYXJlS2V5c0VuYWJsZWRJbkZ1bGxTY3JlZW4gPSBmYWxzZTsKKyAgICAKKyAgICBp
ZiAobV9mdWxsU2NyZWVuUmVuZGVyZXIpCisgICAgICAgIG1fZnVsbFNjcmVlblJlbmRlcmVyLT51
bndyYXBSZW5kZXJlcigpOworCisgICAgbV9mdWxsU2NyZWVuRWxlbWVudCA9IDA7CisgICAgc2No
ZWR1bGVGb3JjZWRTdHlsZVJlY2FsYygpOworICAgIAorICAgIC8vIFdoZW4gd2Via2l0Q2FuY2Vs
RnVsbFNjcmVlbiBpcyBjYWxsZWQsIHdlIGNhbGwgd2Via2l0RXhpdEZ1bGxTY3JlZW4gb24gdGhl
IHRvcERvY3VtZW50KCkuIFRoYXQKKyAgICAvLyBtZWFucyB0aGF0IHRoZSBldmVudHMgd2lsbCBi
ZSBxdWV1ZWQgdGhlcmUuIFNvIGlmIHdlIGhhdmUgbm8gZXZlbnRzIGhlcmUsIHN0YXJ0IHRoZSB0
aW1lciBvbgorICAgIC8vIHRoZSBleGl0aW5nIGRvY3VtZW50LgorICAgIERvY3VtZW50KiBleGl0
aW5nRG9jdW1lbnQgPSB0aGlzOworICAgIGlmIChtX2Z1bGxTY3JlZW5DaGFuZ2VFdmVudFRhcmdl
dFF1ZXVlLmlzRW1wdHkoKSAmJiBtX2Z1bGxTY3JlZW5FcnJvckV2ZW50VGFyZ2V0UXVldWUuaXNF
bXB0eSgpKQorICAgICAgICBleGl0aW5nRG9jdW1lbnQgPSB0b3BEb2N1bWVudCgpOworICAgIGV4
aXRpbmdEb2N1bWVudC0+bV9mdWxsU2NyZWVuQ2hhbmdlRGVsYXlUaW1lci5zdGFydE9uZVNob3Qo
MCk7Cit9CisgICAgCit2b2lkIERvY3VtZW50OjpzZXRGdWxsU2NyZWVuUmVuZGVyZXIoUmVuZGVy
RnVsbFNjcmVlbiogcmVuZGVyZXIpCit7CisgICAgaWYgKHJlbmRlcmVyID09IG1fZnVsbFNjcmVl
blJlbmRlcmVyKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAocmVuZGVyZXIgJiYgbV9zYXZl
ZFBsYWNlaG9sZGVyUmVuZGVyU3R5bGUpIAorICAgICAgICByZW5kZXJlci0+Y3JlYXRlUGxhY2Vo
b2xkZXIobV9zYXZlZFBsYWNlaG9sZGVyUmVuZGVyU3R5bGUucmVsZWFzZSgpLCBtX3NhdmVkUGxh
Y2Vob2xkZXJGcmFtZVJlY3QpOworICAgIGVsc2UgaWYgKHJlbmRlcmVyICYmIG1fZnVsbFNjcmVl
blJlbmRlcmVyICYmIG1fZnVsbFNjcmVlblJlbmRlcmVyLT5wbGFjZWhvbGRlcigpKSB7CisgICAg
ICAgIFJlbmRlckJsb2NrKiBwbGFjZWhvbGRlciA9IG1fZnVsbFNjcmVlblJlbmRlcmVyLT5wbGFj
ZWhvbGRlcigpOworICAgICAgICByZW5kZXJlci0+Y3JlYXRlUGxhY2Vob2xkZXIoUmVuZGVyU3R5
bGU6OmNsb25lKHBsYWNlaG9sZGVyLT5zdHlsZSgpKSwgcGxhY2Vob2xkZXItPmZyYW1lUmVjdCgp
KTsKKyAgICB9CisKKyAgICBpZiAobV9mdWxsU2NyZWVuUmVuZGVyZXIpCisgICAgICAgIG1fZnVs
bFNjcmVlblJlbmRlcmVyLT5kZXN0cm95KCk7CisgICAgQVNTRVJUKCFtX2Z1bGxTY3JlZW5SZW5k
ZXJlcik7CisKKyAgICBtX2Z1bGxTY3JlZW5SZW5kZXJlciA9IHJlbmRlcmVyOworICAgIAorICAg
IC8vIFRoaXMgbm90aWZpY2F0aW9uIGNhbiBjb21lIGluIGFmdGVyIHRoZSBwYWdlIGhhcyBiZWVu
IGRlc3Ryb3llZC4KKyAgICBpZiAocGFnZSgpKQorICAgICAgICBwYWdlKCktPmNocm9tZSgpLT5j
bGllbnQoKS0+ZnVsbFNjcmVlblJlbmRlcmVyQ2hhbmdlZChtX2Z1bGxTY3JlZW5SZW5kZXJlcik7
Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmZ1bGxTY3JlZW5SZW5kZXJlckRlc3Ryb3llZCgpCit7Cisg
ICAgbV9mdWxsU2NyZWVuUmVuZGVyZXIgPSAwOworCisgICAgaWYgKHBhZ2UoKSkKKyAgICAgICAg
cGFnZSgpLT5jaHJvbWUoKS0+Y2xpZW50KCktPmZ1bGxTY3JlZW5SZW5kZXJlckNoYW5nZWQoMCk7
Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnNldEZ1bGxTY3JlZW5SZW5kZXJlclNpemUoY29uc3QgSW50
U2l6ZSYgc2l6ZSkKK3sKKyAgICBBU1NFUlQobV9mdWxsU2NyZWVuUmVuZGVyZXIpOworICAgIGlm
ICghbV9mdWxsU2NyZWVuUmVuZGVyZXIpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICBpZiAo
bV9mdWxsU2NyZWVuUmVuZGVyZXIpIHsKKyAgICAgICAgUmVmUHRyPFJlbmRlclN0eWxlPiBuZXdT
dHlsZSA9IFJlbmRlclN0eWxlOjpjbG9uZShtX2Z1bGxTY3JlZW5SZW5kZXJlci0+c3R5bGUoKSk7
CisgICAgICAgIG5ld1N0eWxlLT5zZXRXaWR0aChMZW5ndGgoc2l6ZS53aWR0aCgpLCBXZWJDb3Jl
OjpGaXhlZCkpOworICAgICAgICBuZXdTdHlsZS0+c2V0SGVpZ2h0KExlbmd0aChzaXplLmhlaWdo
dCgpLCBXZWJDb3JlOjpGaXhlZCkpOworICAgICAgICBuZXdTdHlsZS0+c2V0VG9wKExlbmd0aCgw
LCBXZWJDb3JlOjpGaXhlZCkpOworICAgICAgICBuZXdTdHlsZS0+c2V0TGVmdChMZW5ndGgoMCwg
V2ViQ29yZTo6Rml4ZWQpKTsKKyAgICAgICAgbV9mdWxsU2NyZWVuUmVuZGVyZXItPnNldFN0eWxl
KG5ld1N0eWxlKTsKKyAgICAgICAgdXBkYXRlTGF5b3V0KCk7CisgICAgfQorfQorICAgIAordm9p
ZCBEb2N1bWVudDo6c2V0RnVsbFNjcmVlblJlbmRlcmVyQmFja2dyb3VuZENvbG9yKENvbG9yIGJh
Y2tncm91bmRDb2xvcikKK3sKKyAgICBpZiAoIW1fZnVsbFNjcmVlblJlbmRlcmVyKQorICAgICAg
ICByZXR1cm47CisgICAgCisgICAgUmVmUHRyPFJlbmRlclN0eWxlPiBuZXdTdHlsZSA9IFJlbmRl
clN0eWxlOjpjbG9uZShtX2Z1bGxTY3JlZW5SZW5kZXJlci0+c3R5bGUoKSk7CisgICAgbmV3U3R5
bGUtPnNldEJhY2tncm91bmRDb2xvcihiYWNrZ3JvdW5kQ29sb3IpOworICAgIG1fZnVsbFNjcmVl
blJlbmRlcmVyLT5zZXRTdHlsZShuZXdTdHlsZSk7Cit9CisgICAgCit2b2lkIERvY3VtZW50Ojpm
dWxsU2NyZWVuQ2hhbmdlRGVsYXlUaW1lckZpcmVkKFRpbWVyPERvY3VtZW50PiopCit7CisgICAg
Ly8gU2luY2Ugd2UgZGlzcGF0Y2ggZXZlbnRzIGluIHRoaXMgZnVuY3Rpb24sIGl0J3MgcG9zc2li
bGUgdGhhdCB0aGUKKyAgICAvLyBkb2N1bWVudCB3aWxsIGJlIGRldGFjaGVkIGFuZCBHQydkLiBX
ZSBwcm90ZWN0IGl0IGhlcmUgdG8gbWFrZSBzdXJlIHdlCisgICAgLy8gY2FuIGZpbmlzaCB0aGUg
ZnVuY3Rpb24gc3VjY2Vzc2Z1bGx5LgorICAgIFJlZlB0cjxEb2N1bWVudD4gcHJvdGVjdERvY3Vt
ZW50KHRoaXMpOworICAgIERlcXVlPFJlZlB0cjxOb2RlPiA+IGNoYW5nZVF1ZXVlOworICAgIG1f
ZnVsbFNjcmVlbkNoYW5nZUV2ZW50VGFyZ2V0UXVldWUuc3dhcChjaGFuZ2VRdWV1ZSk7CisKKyAg
ICB3aGlsZSAoIWNoYW5nZVF1ZXVlLmlzRW1wdHkoKSkgeworICAgICAgICBSZWZQdHI8Tm9kZT4g
bm9kZSA9IGNoYW5nZVF1ZXVlLnRha2VGaXJzdCgpOworICAgICAgICBpZiAoIW5vZGUpCisgICAg
ICAgICAgICBub2RlID0gZG9jdW1lbnRFbGVtZW50KCk7CisgICAgICAgIC8vIFRoZSBkaXNwYXRj
aEV2ZW50IGJlbG93IG1heSBoYXZlIGJsb3duIGF3YXkgb3VyIGRvY3VtZW50RWxlbWVudC4KKyAg
ICAgICAgaWYgKCFub2RlKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLy8gSWYg
dGhlIGVsZW1lbnQgd2FzIHJlbW92ZWQgZnJvbSBvdXIgdHJlZSwgYWxzbyBtZXNzYWdlIHRoZSBk
b2N1bWVudEVsZW1lbnQuIFNpbmNlIHdlIG1heQorICAgICAgICAvLyBoYXZlIGEgZG9jdW1lbnQg
aGllcmFyY2h5LCBjaGVjayB0aGF0IG5vZGUgaXNuJ3QgaW4gYW5vdGhlciBkb2N1bWVudC4KKyAg
ICAgICAgaWYgKCFjb250YWlucyhub2RlLmdldCgpKSAmJiAhbm9kZS0+aW5Eb2N1bWVudCgpKQor
ICAgICAgICAgICAgY2hhbmdlUXVldWUuYXBwZW5kKGRvY3VtZW50RWxlbWVudCgpKTsKKyAgICAg
ICAgCisgICAgICAgIG5vZGUtPmRpc3BhdGNoRXZlbnQoRXZlbnQ6OmNyZWF0ZShldmVudE5hbWVz
KCkud2Via2l0ZnVsbHNjcmVlbmNoYW5nZUV2ZW50LCB0cnVlLCBmYWxzZSkpOworICAgIH0KKwor
ICAgIERlcXVlPFJlZlB0cjxOb2RlPiA+IGVycm9yUXVldWU7CisgICAgbV9mdWxsU2NyZWVuRXJy
b3JFdmVudFRhcmdldFF1ZXVlLnN3YXAoZXJyb3JRdWV1ZSk7CisgICAgCisgICAgd2hpbGUgKCFl
cnJvclF1ZXVlLmlzRW1wdHkoKSkgeworICAgICAgICBSZWZQdHI8Tm9kZT4gbm9kZSA9IGVycm9y
UXVldWUudGFrZUZpcnN0KCk7CisgICAgICAgIGlmICghbm9kZSkKKyAgICAgICAgICAgIG5vZGUg
PSBkb2N1bWVudEVsZW1lbnQoKTsKKyAgICAgICAgLy8gVGhlIGRpc3BhdGNoRXZlbnQgYmVsb3cg
bWF5IGhhdmUgYmxvd24gYXdheSBvdXIgZG9jdW1lbnRFbGVtZW50LgorICAgICAgICBpZiAoIW5v
ZGUpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgCisgICAgICAgIC8vIElmIHRoZSBl
bGVtZW50IHdhcyByZW1vdmVkIGZyb20gb3VyIHRyZWUsIGFsc28gbWVzc2FnZSB0aGUgZG9jdW1l
bnRFbGVtZW50LiBTaW5jZSB3ZSBtYXkKKyAgICAgICAgLy8gaGF2ZSBhIGRvY3VtZW50IGhpZXJh
cmNoeSwgY2hlY2sgdGhhdCBub2RlIGlzbid0IGluIGFub3RoZXIgZG9jdW1lbnQuCisgICAgICAg
IGlmICghY29udGFpbnMobm9kZS5nZXQoKSkgJiYgIW5vZGUtPmluRG9jdW1lbnQoKSkKKyAgICAg
ICAgICAgIGVycm9yUXVldWUuYXBwZW5kKGRvY3VtZW50RWxlbWVudCgpKTsKKyAgICAgICAgCisg
ICAgICAgIG5vZGUtPmRpc3BhdGNoRXZlbnQoRXZlbnQ6OmNyZWF0ZShldmVudE5hbWVzKCkud2Vi
a2l0ZnVsbHNjcmVlbmVycm9yRXZlbnQsIHRydWUsIGZhbHNlKSk7CisgICAgfQorfQorCit2b2lk
IERvY3VtZW50OjpmdWxsU2NyZWVuRWxlbWVudFJlbW92ZWQoKQoreworICAgIG1fZnVsbFNjcmVl
bkVsZW1lbnQtPnNldENvbnRhaW5zRnVsbFNjcmVlbkVsZW1lbnRPbkFuY2VzdG9yc0Nyb3NzaW5n
RnJhbWVCb3VuZGFyaWVzKGZhbHNlKTsKKyAgICB3ZWJraXRDYW5jZWxGdWxsU2NyZWVuKCk7Cit9
CisKK3ZvaWQgRG9jdW1lbnQ6OnJlbW92ZUZ1bGxTY3JlZW5FbGVtZW50T2ZTdWJ0cmVlKE5vZGUq
IG5vZGUsIGJvb2wgYW1vbmdDaGlsZHJlbk9ubHkpCit7CisgICAgaWYgKCFtX2Z1bGxTY3JlZW5F
bGVtZW50KQorICAgICAgICByZXR1cm47CisgICAgCisgICAgYm9vbCBlbGVtZW50SW5TdWJ0cmVl
ID0gZmFsc2U7CisgICAgaWYgKGFtb25nQ2hpbGRyZW5Pbmx5KQorICAgICAgICBlbGVtZW50SW5T
dWJ0cmVlID0gbV9mdWxsU2NyZWVuRWxlbWVudC0+aXNEZXNjZW5kYW50T2Yobm9kZSk7CisgICAg
ZWxzZQorICAgICAgICBlbGVtZW50SW5TdWJ0cmVlID0gKG1fZnVsbFNjcmVlbkVsZW1lbnQgPT0g
bm9kZSkgfHwgbV9mdWxsU2NyZWVuRWxlbWVudC0+aXNEZXNjZW5kYW50T2Yobm9kZSk7CisgICAg
CisgICAgaWYgKGVsZW1lbnRJblN1YnRyZWUpCisgICAgICAgIGZ1bGxTY3JlZW5FbGVtZW50UmVt
b3ZlZCgpOworfQorCitib29sIERvY3VtZW50Ojppc0FuaW1hdGluZ0Z1bGxTY3JlZW4oKSBjb25z
dAoreworICAgIHJldHVybiBtX2lzQW5pbWF0aW5nRnVsbFNjcmVlbjsKK30KKwordm9pZCBEb2N1
bWVudDo6c2V0QW5pbWF0aW5nRnVsbFNjcmVlbihib29sIGZsYWcpCit7CisgICAgaWYgKG1faXNB
bmltYXRpbmdGdWxsU2NyZWVuID09IGZsYWcpCisgICAgICAgIHJldHVybjsKKyAgICBtX2lzQW5p
bWF0aW5nRnVsbFNjcmVlbiA9IGZsYWc7CisKKyAgICBpZiAobV9mdWxsU2NyZWVuRWxlbWVudCAm
JiBtX2Z1bGxTY3JlZW5FbGVtZW50LT5pc0Rlc2NlbmRhbnRPZih0aGlzKSkgeworICAgICAgICBt
X2Z1bGxTY3JlZW5FbGVtZW50LT5zZXROZWVkc1N0eWxlUmVjYWxjKCk7CisgICAgICAgIHNjaGVk
dWxlRm9yY2VkU3R5bGVSZWNhbGMoKTsKKyAgICB9Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmNsZWFy
RnVsbHNjcmVlbkVsZW1lbnRTdGFjaygpCit7CisgICAgbV9mdWxsU2NyZWVuRWxlbWVudFN0YWNr
LmNsZWFyKCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnBvcEZ1bGxzY3JlZW5FbGVtZW50U3RhY2so
KQoreworICAgIGlmIChtX2Z1bGxTY3JlZW5FbGVtZW50U3RhY2suaXNFbXB0eSgpKQorICAgICAg
ICByZXR1cm47CisKKyAgICBtX2Z1bGxTY3JlZW5FbGVtZW50U3RhY2sucmVtb3ZlRmlyc3QoKTsK
K30KKwordm9pZCBEb2N1bWVudDo6cHVzaEZ1bGxzY3JlZW5FbGVtZW50U3RhY2soRWxlbWVudCog
ZWxlbWVudCkKK3sKKyAgICBtX2Z1bGxTY3JlZW5FbGVtZW50U3RhY2sucHJlcGVuZChlbGVtZW50
KTsKK30KKwordm9pZCBEb2N1bWVudDo6YWRkRG9jdW1lbnRUb0Z1bGxTY3JlZW5DaGFuZ2VFdmVu
dFF1ZXVlKERvY3VtZW50KiBkb2MpCit7CisgICAgQVNTRVJUKGRvYyk7CisgICAgTm9kZSogdGFy
Z2V0ID0gZG9jLT53ZWJraXRGdWxsc2NyZWVuRWxlbWVudCgpOworICAgIGlmICghdGFyZ2V0KQor
ICAgICAgICB0YXJnZXQgPSBkb2MtPndlYmtpdEN1cnJlbnRGdWxsU2NyZWVuRWxlbWVudCgpOwor
ICAgIGlmICghdGFyZ2V0KQorICAgICAgICB0YXJnZXQgPSBkb2M7CisgICAgbV9mdWxsU2NyZWVu
Q2hhbmdlRXZlbnRUYXJnZXRRdWV1ZS5hcHBlbmQodGFyZ2V0KTsKK30KKyNlbmRpZgorCisjaWYg
RU5BQkxFKFBPSU5URVJfTE9DSykKK3ZvaWQgRG9jdW1lbnQ6OndlYmtpdEV4aXRQb2ludGVyTG9j
aygpCit7CisgICAgaWYgKCFwYWdlKCkpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoRWxlbWVu
dCogdGFyZ2V0ID0gcGFnZSgpLT5wb2ludGVyTG9ja0NvbnRyb2xsZXIoKS0+ZWxlbWVudCgpKSB7
CisgICAgICAgIGlmICh0YXJnZXQtPmRvY3VtZW50KCkgIT0gdGhpcykKKyAgICAgICAgICAgIHJl
dHVybjsKKyAgICB9CisgICAgcGFnZSgpLT5wb2ludGVyTG9ja0NvbnRyb2xsZXIoKS0+cmVxdWVz
dFBvaW50ZXJVbmxvY2soKTsKK30KKworRWxlbWVudCogRG9jdW1lbnQ6OndlYmtpdFBvaW50ZXJM
b2NrRWxlbWVudCgpIGNvbnN0Cit7CisgICAgaWYgKCFwYWdlKCkgfHwgcGFnZSgpLT5wb2ludGVy
TG9ja0NvbnRyb2xsZXIoKS0+bG9ja1BlbmRpbmcoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAg
aWYgKEVsZW1lbnQqIGVsZW1lbnQgPSBwYWdlKCktPnBvaW50ZXJMb2NrQ29udHJvbGxlcigpLT5l
bGVtZW50KCkpIHsKKyAgICAgICAgaWYgKGVsZW1lbnQtPmRvY3VtZW50KCkgPT0gdGhpcykKKyAg
ICAgICAgICAgIHJldHVybiBlbGVtZW50OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKyNlbmRp
ZgorCit2b2lkIERvY3VtZW50OjpkZWNyZW1lbnRMb2FkRXZlbnREZWxheUNvdW50KCkKK3sKKyAg
ICBBU1NFUlQobV9sb2FkRXZlbnREZWxheUNvdW50KTsKKyAgICAtLW1fbG9hZEV2ZW50RGVsYXlD
b3VudDsKKworICAgIGlmIChmcmFtZSgpICYmICFtX2xvYWRFdmVudERlbGF5Q291bnQgJiYgIW1f
bG9hZEV2ZW50RGVsYXlUaW1lci5pc0FjdGl2ZSgpKQorICAgICAgICBtX2xvYWRFdmVudERlbGF5
VGltZXIuc3RhcnRPbmVTaG90KDApOworfQorCit2b2lkIERvY3VtZW50Ojpsb2FkRXZlbnREZWxh
eVRpbWVyRmlyZWQoVGltZXI8RG9jdW1lbnQ+KikKK3sKKyAgICBpZiAoZnJhbWUoKSkKKyAgICAg
ICAgZnJhbWUoKS0+bG9hZGVyKCktPmNoZWNrQ29tcGxldGVkKCk7Cit9CisKKyNpZiBFTkFCTEUo
UkVRVUVTVF9BTklNQVRJT05fRlJBTUUpCitpbnQgRG9jdW1lbnQ6OndlYmtpdFJlcXVlc3RBbmlt
YXRpb25GcmFtZShQYXNzUmVmUHRyPFJlcXVlc3RBbmltYXRpb25GcmFtZUNhbGxiYWNrPiBjYWxs
YmFjaykKK3sKKyAgICBpZiAoIW1fc2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyKSB7CisjaWYg
VVNFKFJFUVVFU1RfQU5JTUFUSU9OX0ZSQU1FX0RJU1BMQVlfTU9OSVRPUikKKyAgICAgICAgbV9z
Y3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXIgPSBTY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXI6
OmNyZWF0ZSh0aGlzLCBwYWdlKCkgPyBwYWdlKCktPmRpc3BsYXlJRCgpIDogMCk7CisjZWxzZQor
ICAgICAgICBtX3NjcmlwdGVkQW5pbWF0aW9uQ29udHJvbGxlciA9IFNjcmlwdGVkQW5pbWF0aW9u
Q29udHJvbGxlcjo6Y3JlYXRlKHRoaXMsIDApOworI2VuZGlmCisgICAgICAgIC8vIEl0J3MgcG9z
c2libGUgdGhhdCB0aGUgUGFnZSBtYXkgaGF2ZSBzdXNwZW5kZWQgc2NyaXB0ZWQgYW5pbWF0aW9u
cyBiZWZvcmUKKyAgICAgICAgLy8gd2Ugd2VyZSBjcmVhdGVkLiBXZSBuZWVkIHRvIG1ha2Ugc3Vy
ZSB0aGF0IHdlIGRvbid0IHN0YXJ0IHVwIHRoZSBhbmltYXRpb24KKyAgICAgICAgLy8gY29udHJv
bGxlciBvbiBhIGJhY2tncm91bmQgdGFiLCBmb3IgZXhhbXBsZS4KKyAgICAgICAgaWYgKCFwYWdl
KCkgfHwgcGFnZSgpLT5zY3JpcHRlZEFuaW1hdGlvbnNTdXNwZW5kZWQoKSkKKyAgICAgICAgICAg
IG1fc2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyLT5zdXNwZW5kKCk7CisgICAgfQorCisgICAg
cmV0dXJuIG1fc2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyLT5yZWdpc3RlckNhbGxiYWNrKGNh
bGxiYWNrKTsKK30KKwordm9pZCBEb2N1bWVudDo6d2Via2l0Q2FuY2VsQW5pbWF0aW9uRnJhbWUo
aW50IGlkKQoreworICAgIGlmICghbV9zY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXIpCisgICAg
ICAgIHJldHVybjsKKyAgICBtX3NjcmlwdGVkQW5pbWF0aW9uQ29udHJvbGxlci0+Y2FuY2VsQ2Fs
bGJhY2soaWQpOworfQorCit2b2lkIERvY3VtZW50OjpzZXJ2aWNlU2NyaXB0ZWRBbmltYXRpb25z
KERPTVRpbWVTdGFtcCB0aW1lKQoreworICAgIGlmICghbV9zY3JpcHRlZEFuaW1hdGlvbkNvbnRy
b2xsZXIpCisgICAgICAgIHJldHVybjsKKyAgICBtX3NjcmlwdGVkQW5pbWF0aW9uQ29udHJvbGxl
ci0+c2VydmljZVNjcmlwdGVkQW5pbWF0aW9ucyh0aW1lKTsKK30KKyNlbmRpZgorCisjaWYgRU5B
QkxFKFRPVUNIX0VWRU5UUykKK1Bhc3NSZWZQdHI8VG91Y2g+IERvY3VtZW50OjpjcmVhdGVUb3Vj
aChET01XaW5kb3cqIHdpbmRvdywgRXZlbnRUYXJnZXQqIHRhcmdldCwgaW50IGlkZW50aWZpZXIs
IGludCBwYWdlWCwgaW50IHBhZ2VZLCBpbnQgc2NyZWVuWCwgaW50IHNjcmVlblksIGludCByYWRp
dXNYLCBpbnQgcmFkaXVzWSwgZmxvYXQgcm90YXRpb25BbmdsZSwgZmxvYXQgZm9yY2UsIEV4Y2Vw
dGlvbkNvZGUmKSBjb25zdAoreworICAgIC8vIEZJWE1FOiBJdCdzIG5vdCBjbGVhciBmcm9tIHRo
ZSBkb2N1bWVudGF0aW9uIGF0CisgICAgLy8gaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vbGli
cmFyeS9zYWZhcmkvI2RvY3VtZW50YXRpb24vVXNlckV4cGVyaWVuY2UvUmVmZXJlbmNlL0RvY3Vt
ZW50QWRkaXRpb25zUmVmZXJlbmNlL0RvY3VtZW50QWRkaXRpb25zL0RvY3VtZW50QWRkaXRpb25z
Lmh0bWwKKyAgICAvLyB3aGVuIHRoaXMgbWV0aG9kIHNob3VsZCB0aHJvdyBhbmQgbm9yIGlzIGl0
IGJ5IGluc3BlY3Rpb24gb2YgaU9TIGJlaGF2aW9yLiBJdCB3b3VsZCBiZSBuaWNlIHRvIHZlcmlm
eSBhbnkgY2FzZXMgd2hlcmUgaXQgdGhyb3dzIHVuZGVyIGlPUworICAgIC8vIGFuZCBpbXBsZW1l
bnQgdGhlbSBoZXJlLiBTZWUgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTQ3ODE5CisgICAgRnJhbWUqIGZyYW1lID0gd2luZG93ID8gd2luZG93LT5mcmFtZSgpIDogdGhp
cy0+ZnJhbWUoKTsKKyAgICByZXR1cm4gVG91Y2g6OmNyZWF0ZShmcmFtZSwgdGFyZ2V0LCBpZGVu
dGlmaWVyLCBzY3JlZW5YLCBzY3JlZW5ZLCBwYWdlWCwgcGFnZVksIHJhZGl1c1gsIHJhZGl1c1ks
IHJvdGF0aW9uQW5nbGUsIGZvcmNlKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCB3aGVlbEV2
ZW50SGFuZGxlckNvdW50Q2hhbmdlZChEb2N1bWVudCogZG9jdW1lbnQpCit7CisgICAgUGFnZSog
cGFnZSA9IGRvY3VtZW50LT5wYWdlKCk7CisgICAgaWYgKCFwYWdlKQorICAgICAgICByZXR1cm47
CisKKyAgICBTY3JvbGxpbmdDb29yZGluYXRvciogc2Nyb2xsaW5nQ29vcmRpbmF0b3IgPSBwYWdl
LT5zY3JvbGxpbmdDb29yZGluYXRvcigpOworICAgIGlmICghc2Nyb2xsaW5nQ29vcmRpbmF0b3Ip
CisgICAgICAgIHJldHVybjsKKworICAgIEZyYW1lVmlldyogZnJhbWVWaWV3ID0gZG9jdW1lbnQt
PnZpZXcoKTsKKyAgICBpZiAoIWZyYW1lVmlldykKKyAgICAgICAgcmV0dXJuOworCisgICAgc2Ny
b2xsaW5nQ29vcmRpbmF0b3ItPmZyYW1lVmlld1doZWVsRXZlbnRIYW5kbGVyQ291bnRDaGFuZ2Vk
KGZyYW1lVmlldyk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmRpZEFkZFdoZWVsRXZlbnRIYW5kbGVy
KCkKK3sKKyAgICArK21fd2hlZWxFdmVudEhhbmRsZXJDb3VudDsKKyAgICBGcmFtZSogbWFpbkZy
YW1lID0gcGFnZSgpID8gcGFnZSgpLT5tYWluRnJhbWUoKSA6IDA7CisgICAgaWYgKG1haW5GcmFt
ZSkKKyAgICAgICAgbWFpbkZyYW1lLT5ub3RpZnlDaHJvbWVDbGllbnRXaGVlbEV2ZW50SGFuZGxl
ckNvdW50Q2hhbmdlZCgpOworCisgICAgd2hlZWxFdmVudEhhbmRsZXJDb3VudENoYW5nZWQodGhp
cyk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmRpZFJlbW92ZVdoZWVsRXZlbnRIYW5kbGVyKCkKK3sK
KyAgICBBU1NFUlQobV93aGVlbEV2ZW50SGFuZGxlckNvdW50ID4gMCk7CisgICAgLS1tX3doZWVs
RXZlbnRIYW5kbGVyQ291bnQ7CisgICAgRnJhbWUqIG1haW5GcmFtZSA9IHBhZ2UoKSA/IHBhZ2Uo
KS0+bWFpbkZyYW1lKCkgOiAwOworICAgIGlmIChtYWluRnJhbWUpCisgICAgICAgIG1haW5GcmFt
ZS0+bm90aWZ5Q2hyb21lQ2xpZW50V2hlZWxFdmVudEhhbmRsZXJDb3VudENoYW5nZWQoKTsKKwor
ICAgIHdoZWVsRXZlbnRIYW5kbGVyQ291bnRDaGFuZ2VkKHRoaXMpOworfQorCit2b2lkIERvY3Vt
ZW50OjpkaWRBZGRUb3VjaEV2ZW50SGFuZGxlcigpCit7CisjaWYgRU5BQkxFKFRPVUNIX0VWRU5U
UykKKyAgICArK21fdG91Y2hFdmVudEhhbmRsZXJDb3VudDsKKyAgICBpZiAobV90b3VjaEV2ZW50
SGFuZGxlckNvdW50ID4gMSkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChQYWdlKiBwYWdlID0g
dGhpcy0+cGFnZSgpKQorICAgICAgICBwYWdlLT5jaHJvbWUoKS0+Y2xpZW50KCktPm5lZWRUb3Vj
aEV2ZW50cyh0cnVlKTsKKyNlbmRpZgorfQorCit2b2lkIERvY3VtZW50OjpkaWRSZW1vdmVUb3Vj
aEV2ZW50SGFuZGxlcigpCit7CisjaWYgRU5BQkxFKFRPVUNIX0VWRU5UUykKKyAgICBBU1NFUlQo
bV90b3VjaEV2ZW50SGFuZGxlckNvdW50KTsKKyAgICAtLW1fdG91Y2hFdmVudEhhbmRsZXJDb3Vu
dDsKKyAgICBpZiAobV90b3VjaEV2ZW50SGFuZGxlckNvdW50KQorICAgICAgICByZXR1cm47CisK
KyAgICBQYWdlKiBwYWdlID0gdGhpcy0+cGFnZSgpOworICAgIGlmICghcGFnZSkKKyAgICAgICAg
cmV0dXJuOworICAgIGZvciAoY29uc3QgRnJhbWUqIGZyYW1lID0gcGFnZS0+bWFpbkZyYW1lKCk7
IGZyYW1lOyBmcmFtZSA9IGZyYW1lLT50cmVlKCktPnRyYXZlcnNlTmV4dCgpKSB7CisgICAgICAg
IGlmIChmcmFtZS0+ZG9jdW1lbnQoKSAmJiBmcmFtZS0+ZG9jdW1lbnQoKS0+dG91Y2hFdmVudEhh
bmRsZXJDb3VudCgpKQorICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwYWdlLT5jaHJv
bWUoKS0+Y2xpZW50KCktPm5lZWRUb3VjaEV2ZW50cyhmYWxzZSk7CisjZW5kaWYKK30KKworSFRN
TElGcmFtZUVsZW1lbnQqIERvY3VtZW50OjpzZWFtbGVzc1BhcmVudElGcmFtZSgpIGNvbnN0Cit7
CisgICAgaWYgKCFzaG91bGREaXNwbGF5U2VhbWxlc3NseVdpdGhQYXJlbnQoKSkKKyAgICAgICAg
cmV0dXJuIDA7CisKKyAgICBIVE1MRnJhbWVPd25lckVsZW1lbnQqIG93bmVyRWxlbWVudCA9IHRo
aXMtPm93bmVyRWxlbWVudCgpOworICAgIEFTU0VSVChvd25lckVsZW1lbnQtPmhhc1RhZ05hbWUo
aWZyYW1lVGFnKSk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEhUTUxJRnJhbWVFbGVtZW50Kj4o
b3duZXJFbGVtZW50KTsKK30KKworYm9vbCBEb2N1bWVudDo6c2hvdWxkRGlzcGxheVNlYW1sZXNz
bHlXaXRoUGFyZW50KCkgY29uc3QKK3sKKyNpZiBFTkFCTEUoSUZSQU1FX1NFQU1MRVNTKQorICAg
IEhUTUxGcmFtZU93bmVyRWxlbWVudCogb3duZXJFbGVtZW50ID0gdGhpcy0+b3duZXJFbGVtZW50
KCk7CisgICAgaWYgKCFvd25lckVsZW1lbnQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBy
ZXR1cm4gbV9tYXlEaXNwbGF5U2VhbWxlc3NXaXRoUGFyZW50ICYmIG93bmVyRWxlbWVudC0+aGFz
VGFnTmFtZShpZnJhbWVUYWcpICYmIG93bmVyRWxlbWVudC0+ZmFzdEhhc0F0dHJpYnV0ZShzZWFt
bGVzc0F0dHIpOworI2Vsc2UKKyAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKK30KKworRG9jdW1l
bnRMb2FkZXIqIERvY3VtZW50Ojpsb2FkZXIoKSBjb25zdAoreworICAgIGlmICghbV9mcmFtZSkK
KyAgICAgICAgcmV0dXJuIDA7CisgICAgCisgICAgRG9jdW1lbnRMb2FkZXIqIGxvYWRlciA9IG1f
ZnJhbWUtPmxvYWRlcigpLT5kb2N1bWVudExvYWRlcigpOworICAgIGlmICghbG9hZGVyKQorICAg
ICAgICByZXR1cm4gMDsKKyAgICAKKyAgICBpZiAobV9mcmFtZS0+ZG9jdW1lbnQoKSAhPSB0aGlz
KQorICAgICAgICByZXR1cm4gMDsKKyAgICAKKyAgICByZXR1cm4gbG9hZGVyOworfQorCisjaWYg
RU5BQkxFKE1JQ1JPREFUQSkKK1Bhc3NSZWZQdHI8Tm9kZUxpc3Q+IERvY3VtZW50OjpnZXRJdGVt
cyhjb25zdCBTdHJpbmcmIHR5cGVOYW1lcykKK3sKKyAgICAvLyBTaW5jZSBkb2N1bWV0LmdldEl0
ZW0oKSBpcyBhbGxvd2VkIGZvciBtaWNyb2RhdGEsIHR5cGVOYW1lcyB3aWxsIGJlIG51bGwgc3Ry
aW5nLgorICAgIC8vIEluIHRoaXMgY2FzZSB3ZSBuZWVkIHRvIGNyZWF0ZSBhbiBlbXB0eSBzdHJp
bmcgaWRlbnRpZmllciB0byBtYXAgc3VjaCByZXF1ZXN0IGluIHRoZSBjYWNoZS4KKyAgICBTdHJp
bmcgbG9jYWxUeXBlTmFtZXMgPSB0eXBlTmFtZXMuaXNOdWxsKCkgPyBNaWNyb0RhdGFJdGVtTGlz
dDo6dW5kZWZpbmVkSXRlbVR5cGUoKSA6IHR5cGVOYW1lczsKKworICAgIHJldHVybiBlbnN1cmVS
YXJlRGF0YSgpLT5lbnN1cmVOb2RlTGlzdHMoKS0+YWRkQ2FjaGVXaXRoTmFtZTxNaWNyb0RhdGFJ
dGVtTGlzdD4odGhpcywgRHluYW1pY05vZGVMaXN0OjpNaWNyb0RhdGFJdGVtTGlzdFR5cGUsIGxv
Y2FsVHlwZU5hbWVzKTsKK30KKyNlbmRpZgorCitJbnRTaXplIERvY3VtZW50Ojp2aWV3cG9ydFNp
emUoKSBjb25zdAoreworICAgIGlmICghdmlldygpKQorICAgICAgICByZXR1cm4gSW50U2l6ZSgp
OworICAgIHJldHVybiB2aWV3KCktPnZpc2libGVDb250ZW50UmVjdCgvKiBpbmNsdWRlU2Nyb2xs
YmFycyAqLyB0cnVlKS5zaXplKCk7Cit9CisKK05vZGUqIGV2ZW50VGFyZ2V0Tm9kZUZvckRvY3Vt
ZW50KERvY3VtZW50KiBkb2MpCit7CisgICAgaWYgKCFkb2MpCisgICAgICAgIHJldHVybiAwOwor
ICAgIE5vZGUqIG5vZGUgPSBkb2MtPmZvY3VzZWROb2RlKCk7CisgICAgaWYgKCFub2RlICYmIGRv
Yy0+aXNQbHVnaW5Eb2N1bWVudCgpKSB7CisgICAgICAgIFBsdWdpbkRvY3VtZW50KiBwbHVnaW5E
b2N1bWVudCA9IHN0YXRpY19jYXN0PFBsdWdpbkRvY3VtZW50Kj4oZG9jKTsKKyAgICAgICAgbm9k
ZSA9ICBwbHVnaW5Eb2N1bWVudC0+cGx1Z2luTm9kZSgpOworICAgIH0KKyAgICBpZiAoIW5vZGUg
JiYgZG9jLT5pc0hUTUxEb2N1bWVudCgpKQorICAgICAgICBub2RlID0gZG9jLT5ib2R5KCk7Cisg
ICAgaWYgKCFub2RlKQorICAgICAgICBub2RlID0gZG9jLT5kb2N1bWVudEVsZW1lbnQoKTsKKyAg
ICByZXR1cm4gbm9kZTsKK30KKwordm9pZCBEb2N1bWVudDo6YWRqdXN0RmxvYXRRdWFkc0ZvclNj
cm9sbEFuZEFic29sdXRlWm9vbUFuZEZyYW1lU2NhbGUoVmVjdG9yPEZsb2F0UXVhZD4mIHF1YWRz
LCBSZW5kZXJPYmplY3QqIHJlbmRlcmVyKQoreworICAgIGlmICghdmlldygpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBmbG9hdCBpbnZlcnNlRnJhbWVTY2FsZSA9IDE7CisgICAgaWYgKGZyYW1l
KCkpCisgICAgICAgIGludmVyc2VGcmFtZVNjYWxlID0gMSAvIGZyYW1lKCktPmZyYW1lU2NhbGVG
YWN0b3IoKTsKKworICAgIExheW91dFJlY3QgdmlzaWJsZUNvbnRlbnRSZWN0ID0gdmlldygpLT52
aXNpYmxlQ29udGVudFJlY3QoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHF1YWRzLnNp
emUoKTsgKytpKSB7CisgICAgICAgIHF1YWRzW2ldLm1vdmUoLXZpc2libGVDb250ZW50UmVjdC54
KCksIC12aXNpYmxlQ29udGVudFJlY3QueSgpKTsKKyAgICAgICAgYWRqdXN0RmxvYXRRdWFkRm9y
QWJzb2x1dGVab29tKHF1YWRzW2ldLCByZW5kZXJlcik7CisgICAgICAgIGlmIChpbnZlcnNlRnJh
bWVTY2FsZSAhPSAxKQorICAgICAgICAgICAgcXVhZHNbaV0uc2NhbGUoaW52ZXJzZUZyYW1lU2Nh
bGUsIGludmVyc2VGcmFtZVNjYWxlKTsKKyAgICB9Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmFkanVz
dEZsb2F0UmVjdEZvclNjcm9sbEFuZEFic29sdXRlWm9vbUFuZEZyYW1lU2NhbGUoRmxvYXRSZWN0
JiByZWN0LCBSZW5kZXJPYmplY3QqIHJlbmRlcmVyKQoreworICAgIGlmICghdmlldygpKQorICAg
ICAgICByZXR1cm47CisKKyAgICBmbG9hdCBpbnZlcnNlRnJhbWVTY2FsZSA9IDE7CisgICAgaWYg
KGZyYW1lKCkpCisgICAgICAgIGludmVyc2VGcmFtZVNjYWxlID0gMSAvIGZyYW1lKCktPmZyYW1l
U2NhbGVGYWN0b3IoKTsKKworICAgIExheW91dFJlY3QgdmlzaWJsZUNvbnRlbnRSZWN0ID0gdmll
dygpLT52aXNpYmxlQ29udGVudFJlY3QoKTsKKyAgICByZWN0Lm1vdmUoLXZpc2libGVDb250ZW50
UmVjdC54KCksIC12aXNpYmxlQ29udGVudFJlY3QueSgpKTsKKyAgICBhZGp1c3RGbG9hdFJlY3RG
b3JBYnNvbHV0ZVpvb20ocmVjdCwgcmVuZGVyZXIpOworICAgIGlmIChpbnZlcnNlRnJhbWVTY2Fs
ZSAhPSAxKQorICAgICAgICByZWN0LnNjYWxlKGludmVyc2VGcmFtZVNjYWxlKTsKK30KKwordm9p
ZCBEb2N1bWVudDo6c2V0Q29udGV4dEZlYXR1cmVzKFBhc3NSZWZQdHI8Q29udGV4dEZlYXR1cmVz
PiBmZWF0dXJlcykKK3sKKyAgICBtX2NvbnRleHRGZWF0dXJlcyA9IGZlYXR1cmVzOworfQorCitz
dGF0aWMgUmVuZGVyT2JqZWN0KiBuZWFyZXN0Q29tbW9uSG92ZXJBbmNlc3RvcihSZW5kZXJPYmpl
Y3QqIG9iajEsIFJlbmRlck9iamVjdCogb2JqMikKK3sKKyAgICBpZiAoIW9iajEgfHwgIW9iajIp
CisgICAgICAgIHJldHVybiAwOworCisgICAgZm9yIChSZW5kZXJPYmplY3QqIGN1cnJPYmoxID0g
b2JqMTsgY3Vyck9iajE7IGN1cnJPYmoxID0gY3Vyck9iajEtPmhvdmVyQW5jZXN0b3IoKSkgewor
ICAgICAgICBmb3IgKFJlbmRlck9iamVjdCogY3Vyck9iajIgPSBvYmoyOyBjdXJyT2JqMjsgY3Vy
ck9iajIgPSBjdXJyT2JqMi0+aG92ZXJBbmNlc3RvcigpKSB7CisgICAgICAgICAgICBpZiAoY3Vy
ck9iajEgPT0gY3Vyck9iajIpCisgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJPYmoxOworICAg
ICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnVwZGF0
ZUhvdmVyQWN0aXZlU3RhdGUoY29uc3QgSGl0VGVzdFJlcXVlc3QmIHJlcXVlc3QsIEhpdFRlc3RS
ZXN1bHQmIHJlc3VsdCkKK3sKKyAgICAvLyBXZSBkb24ndCB1cGRhdGUgOmhvdmVyLzphY3RpdmUg
c3RhdGUgd2hlbiB0aGUgcmVzdWx0IGlzIG1hcmtlZCBhcyByZWFkT25seS4KKyAgICBpZiAocmVx
dWVzdC5yZWFkT25seSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBOb2RlKiBpbm5lck5vZGVJ
bkRvY3VtZW50ID0gcmVzdWx0LmlubmVyTm9kZSgpOworICAgIEFTU0VSVCghaW5uZXJOb2RlSW5E
b2N1bWVudCB8fCBpbm5lck5vZGVJbkRvY3VtZW50LT5kb2N1bWVudCgpID09IHRoaXMpOworCisg
ICAgTm9kZSogb2xkQWN0aXZlTm9kZSA9IGFjdGl2ZU5vZGUoKTsKKyAgICBpZiAob2xkQWN0aXZl
Tm9kZSAmJiAhcmVxdWVzdC5hY3RpdmUoKSkgeworICAgICAgICAvLyBXZSBhcmUgY2xlYXJpbmcg
dGhlIDphY3RpdmUgY2hhaW4gYmVjYXVzZSB0aGUgbW91c2UgaGFzIGJlZW4gcmVsZWFzZWQuCisg
ICAgICAgIGZvciAoUmVuZGVyT2JqZWN0KiBjdXJyID0gb2xkQWN0aXZlTm9kZS0+cmVuZGVyZXIo
KTsgY3VycjsgY3VyciA9IGN1cnItPnBhcmVudCgpKSB7CisgICAgICAgICAgICBpZiAoY3Vyci0+
bm9kZSgpICYmICFjdXJyLT5pc1RleHQoKSkgeworICAgICAgICAgICAgICAgIGN1cnItPm5vZGUo
KS0+c2V0QWN0aXZlKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBjdXJyLT5ub2RlKCktPmNsZWFy
SW5BY3RpdmVDaGFpbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNldEFj
dGl2ZU5vZGUoMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTm9kZSogbmV3QWN0aXZlTm9kZSA9
IGlubmVyTm9kZUluRG9jdW1lbnQ7CisgICAgICAgIGlmICghb2xkQWN0aXZlTm9kZSAmJiBuZXdB
Y3RpdmVOb2RlICYmIHJlcXVlc3QuYWN0aXZlKCkgJiYgIXJlcXVlc3QudG91Y2hNb3ZlKCkpIHsK
KyAgICAgICAgICAgIC8vIFdlIGFyZSBzZXR0aW5nIHRoZSA6YWN0aXZlIGNoYWluIGFuZCBmcmVl
emluZyBpdC4gSWYgZnV0dXJlIG1vdmVzIGhhcHBlbiwgdGhleQorICAgICAgICAgICAgLy8gd2ls
bCBuZWVkIHRvIHJlZmVyZW5jZSB0aGlzIGNoYWluLgorICAgICAgICAgICAgZm9yIChSZW5kZXJP
YmplY3QqIGN1cnIgPSBuZXdBY3RpdmVOb2RlLT5yZW5kZXJlcigpOyBjdXJyOyBjdXJyID0gY3Vy
ci0+cGFyZW50KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoY3Vyci0+bm9kZSgpICYmICFjdXJy
LT5pc1RleHQoKSkKKyAgICAgICAgICAgICAgICAgICAgY3Vyci0+bm9kZSgpLT5zZXRJbkFjdGl2
ZUNoYWluKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRBY3RpdmVOb2RlKG5ld0Fj
dGl2ZU5vZGUpOworICAgICAgICB9CisgICAgfQorICAgIC8vIElmIHRoZSBtb3VzZSBoYXMganVz
dCBiZWVuIHByZXNzZWQsIHNldCA6YWN0aXZlIG9uIHRoZSBjaGFpbi4gVGhvc2UgKGFuZCBvbmx5
IHRob3NlKQorICAgIC8vIG5vZGVzIHNob3VsZCByZW1haW4gOmFjdGl2ZSB1bnRpbCB0aGUgbW91
c2UgaXMgcmVsZWFzZWQuCisgICAgYm9vbCBhbGxvd0FjdGl2ZUNoYW5nZXMgPSAhb2xkQWN0aXZl
Tm9kZSAmJiBhY3RpdmVOb2RlKCk7CisKKyAgICAvLyBJZiB0aGUgbW91c2UgaXMgZG93biBhbmQg
aWYgdGhpcyBpcyBhIG1vdXNlIG1vdmUgZXZlbnQsIHdlIHdhbnQgdG8gcmVzdHJpY3QgY2hhbmdl
cyBpbgorICAgIC8vIDpob3Zlci86YWN0aXZlIHRvIG9ubHkgYXBwbHkgdG8gZWxlbWVudHMgdGhh
dCBhcmUgaW4gdGhlIDphY3RpdmUgY2hhaW4gdGhhdCB3ZSBmcm96ZQorICAgIC8vIGF0IHRoZSB0
aW1lIHRoZSBtb3VzZSB3ZW50IGRvd24uCisgICAgYm9vbCBtdXN0QmVJbkFjdGl2ZUNoYWluID0g
cmVxdWVzdC5hY3RpdmUoKSAmJiByZXF1ZXN0Lm1vdmUoKTsKKworICAgIFJlZlB0cjxOb2RlPiBv
bGRIb3Zlck5vZGUgPSBob3Zlck5vZGUoKTsKKyAgICAvLyBDbGVhciB0aGUgOmhvdmVyIGNoYWlu
IHdoZW4gdGhlIHRvdWNoIGdlc3R1cmUgaXMgb3Zlci4KKyAgICBpZiAocmVxdWVzdC50b3VjaFJl
bGVhc2UoKSkgeworICAgICAgICBpZiAob2xkSG92ZXJOb2RlKSB7CisgICAgICAgICAgICBmb3Ig
KFJlbmRlck9iamVjdCogY3VyciA9IG9sZEhvdmVyTm9kZS0+cmVuZGVyZXIoKTsgY3VycjsgY3Vy
ciA9IGN1cnItPmhvdmVyQW5jZXN0b3IoKSkgeworICAgICAgICAgICAgICAgIGlmIChjdXJyLT5u
b2RlKCkgJiYgIWN1cnItPmlzVGV4dCgpKQorICAgICAgICAgICAgICAgICAgICBjdXJyLT5ub2Rl
KCktPnNldEhvdmVyZWQoZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0SG92
ZXJOb2RlKDApOworICAgICAgICB9CisgICAgICAgIC8vIEEgdG91Y2ggcmVsZWFzZSBjYW4gbm90
IHNldCBuZXcgaG92ZXIgb3IgYWN0aXZlIHRhcmdldC4KKyAgICAgICAgcmV0dXJuOworICAgIH0K
KworICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgaG92ZXJlZCBub2RlIGhhcyBjaGFuZ2VkLgor
ICAgIC8vIElmIGl0IGhhc24ndCwgd2UgZG8gbm90IG5lZWQgdG8gZG8gYW55dGhpbmcuCisgICAg
Tm9kZSogbmV3SG92ZXJOb2RlID0gaW5uZXJOb2RlSW5Eb2N1bWVudDsKKyAgICB3aGlsZSAobmV3
SG92ZXJOb2RlICYmICFuZXdIb3Zlck5vZGUtPnJlbmRlcmVyKCkpCisgICAgICAgIG5ld0hvdmVy
Tm9kZSA9IG5ld0hvdmVyTm9kZS0+cGFyZW50T3JIb3N0Tm9kZSgpOworCisgICAgLy8gVXBkYXRl
IG91ciBjdXJyZW50IGhvdmVyIG5vZGUuCisgICAgc2V0SG92ZXJOb2RlKG5ld0hvdmVyTm9kZSk7
CisKKyAgICAvLyBXZSBoYXZlIHR3byBkaWZmZXJlbnQgb2JqZWN0cy4gRmV0Y2ggdGhlaXIgcmVu
ZGVyZXJzLgorICAgIFJlbmRlck9iamVjdCogb2xkSG92ZXJPYmogPSBvbGRIb3Zlck5vZGUgPyBv
bGRIb3Zlck5vZGUtPnJlbmRlcmVyKCkgOiAwOworICAgIFJlbmRlck9iamVjdCogbmV3SG92ZXJP
YmogPSBuZXdIb3Zlck5vZGUgPyBuZXdIb3Zlck5vZGUtPnJlbmRlcmVyKCkgOiAwOworCisgICAg
Ly8gTG9jYXRlIHRoZSBjb21tb24gYW5jZXN0b3IgcmVuZGVyIG9iamVjdCBmb3IgdGhlIHR3byBy
ZW5kZXJlcnMuCisgICAgUmVuZGVyT2JqZWN0KiBhbmNlc3RvciA9IG5lYXJlc3RDb21tb25Ib3Zl
ckFuY2VzdG9yKG9sZEhvdmVyT2JqLCBuZXdIb3Zlck9iaik7CisKKyAgICBWZWN0b3I8UmVmUHRy
PE5vZGU+LCAzMj4gbm9kZXNUb1JlbW92ZUZyb21DaGFpbjsKKyAgICBWZWN0b3I8UmVmUHRyPE5v
ZGU+LCAzMj4gbm9kZXNUb0FkZFRvQ2hhaW47CisKKyAgICBpZiAob2xkSG92ZXJPYmogIT0gbmV3
SG92ZXJPYmopIHsKKyAgICAgICAgLy8gVGhlIG9sZCBob3ZlciBwYXRoIG9ubHkgbmVlZHMgdG8g
YmUgY2xlYXJlZCB1cCB0byAoYW5kIG5vdCBpbmNsdWRpbmcpIHRoZSBjb21tb24gYW5jZXN0b3I7
CisgICAgICAgIGZvciAoUmVuZGVyT2JqZWN0KiBjdXJyID0gb2xkSG92ZXJPYmo7IGN1cnIgJiYg
Y3VyciAhPSBhbmNlc3RvcjsgY3VyciA9IGN1cnItPmhvdmVyQW5jZXN0b3IoKSkgeworICAgICAg
ICAgICAgaWYgKGN1cnItPm5vZGUoKSAmJiAhY3Vyci0+aXNUZXh0KCkgJiYgKCFtdXN0QmVJbkFj
dGl2ZUNoYWluIHx8IGN1cnItPm5vZGUoKS0+aW5BY3RpdmVDaGFpbigpKSkKKyAgICAgICAgICAg
ICAgICBub2Rlc1RvUmVtb3ZlRnJvbUNoYWluLmFwcGVuZChjdXJyLT5ub2RlKCkpOworICAgICAg
ICB9CisgICAgfQorCisgICAgLy8gTm93IHNldCB0aGUgaG92ZXIgc3RhdGUgZm9yIG91ciBuZXcg
b2JqZWN0IHVwIHRvIHRoZSByb290LgorICAgIGZvciAoUmVuZGVyT2JqZWN0KiBjdXJyID0gbmV3
SG92ZXJPYmo7IGN1cnI7IGN1cnIgPSBjdXJyLT5ob3ZlckFuY2VzdG9yKCkpIHsKKyAgICAgICAg
aWYgKGN1cnItPm5vZGUoKSAmJiAhY3Vyci0+aXNUZXh0KCkgJiYgKCFtdXN0QmVJbkFjdGl2ZUNo
YWluIHx8IGN1cnItPm5vZGUoKS0+aW5BY3RpdmVDaGFpbigpKSkKKyAgICAgICAgICAgIG5vZGVz
VG9BZGRUb0NoYWluLmFwcGVuZChjdXJyLT5ub2RlKCkpOworICAgIH0KKworICAgIHNpemVfdCBy
ZW1vdmVDb3VudCA9IG5vZGVzVG9SZW1vdmVGcm9tQ2hhaW4uc2l6ZSgpOworICAgIGZvciAoc2l6
ZV90IGkgPSAwOyBpIDwgcmVtb3ZlQ291bnQ7ICsraSkKKyAgICAgICAgbm9kZXNUb1JlbW92ZUZy
b21DaGFpbltpXS0+c2V0SG92ZXJlZChmYWxzZSk7CisKKyAgICBzaXplX3QgYWRkQ291bnQgPSBu
b2Rlc1RvQWRkVG9DaGFpbi5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhZGRD
b3VudDsgKytpKSB7CisgICAgICAgIGlmIChhbGxvd0FjdGl2ZUNoYW5nZXMpCisgICAgICAgICAg
ICBub2Rlc1RvQWRkVG9DaGFpbltpXS0+c2V0QWN0aXZlKHRydWUpOworICAgICAgICBub2Rlc1Rv
QWRkVG9DaGFpbltpXS0+c2V0SG92ZXJlZCh0cnVlKTsKKyAgICB9Cit9CisKK3ZvaWQgRG9jdW1l
bnQ6OnJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qIG1lbW9yeU9iamVjdEluZm8p
IGNvbnN0Cit7CisgICAgTWVtb3J5Q2xhc3NJbmZvIGluZm8obWVtb3J5T2JqZWN0SW5mbywgdGhp
cywgV2ViQ29yZU1lbW9yeVR5cGVzOjpET00pOworICAgIGluZm8uYWRkTWVtYmVyKG1fc3R5bGVS
ZXNvbHZlcik7CisgICAgQ29udGFpbmVyTm9kZTo6cmVwb3J0TWVtb3J5VXNhZ2UobWVtb3J5T2Jq
ZWN0SW5mbyk7CisgICAgaW5mby5hZGRWZWN0b3IobV9jdXN0b21Gb250cyk7CisgICAgaW5mby5h
ZGRNZW1iZXIobV91cmwpOworICAgIGluZm8uYWRkTWVtYmVyKG1fYmFzZVVSTCk7CisgICAgaW5m
by5hZGRNZW1iZXIobV9iYXNlVVJMT3ZlcnJpZGUpOworICAgIGluZm8uYWRkTWVtYmVyKG1fYmFz
ZUVsZW1lbnRVUkwpOworICAgIGluZm8uYWRkTWVtYmVyKG1fY29va2llVVJMKTsKKyAgICBpbmZv
LmFkZE1lbWJlcihtX2ZpcnN0UGFydHlGb3JDb29raWVzKTsKKyAgICBpbmZvLmFkZE1lbWJlciht
X2RvY3VtZW50VVJJKTsKKyAgICBpbmZvLmFkZE1lbWJlcihtX2Jhc2VUYXJnZXQpOworICAgIGlu
Zm8uYWRkTWVtYmVyKG1fZnJhbWUpOworICAgIGluZm8uYWRkTWVtYmVyKG1fY2FjaGVkUmVzb3Vy
Y2VMb2FkZXIpOworICAgIGluZm8uYWRkTWVtYmVyKG1fZWxlbVNoZWV0KTsKKyAgICBpbmZvLmFk
ZE1lbWJlcihtX3BhZ2VVc2VyU2hlZXQpOworICAgIGlmIChtX3BhZ2VHcm91cFVzZXJTaGVldHMp
CisgICAgICAgIGluZm8uYWRkSW5zdHJ1bWVudGVkVmVjdG9yUHRyKG1fcGFnZUdyb3VwVXNlclNo
ZWV0cyk7CisgICAgaWYgKG1fdXNlclNoZWV0cykKKyAgICAgICAgaW5mby5hZGRJbnN0cnVtZW50
ZWRWZWN0b3JQdHIobV91c2VyU2hlZXRzKTsKKyAgICBpbmZvLmFkZEhhc2hTZXQobV9ub2RlSXRl
cmF0b3JzKTsKKyAgICBpbmZvLmFkZEhhc2hTZXQobV9yYW5nZXMpOworICAgIGluZm8uYWRkTGlz
dEhhc2hTZXQobV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMpOworICAgIGluZm8uYWRkTWVtYmVy
KG1fcHJlZmVycmVkU3R5bGVzaGVldFNldCk7CisgICAgaW5mby5hZGRNZW1iZXIobV9zZWxlY3Rl
ZFN0eWxlc2hlZXRTZXQpOworICAgIGluZm8uYWRkTWVtYmVyKG1fdGl0bGUuc3RyaW5nKCkpOwor
ICAgIGluZm8uYWRkTWVtYmVyKG1fcmF3VGl0bGUuc3RyaW5nKCkpOworICAgIGluZm8uYWRkTWVt
YmVyKG1feG1sRW5jb2RpbmcpOworICAgIGluZm8uYWRkTWVtYmVyKG1feG1sVmVyc2lvbik7Cisg
ICAgaW5mby5hZGRNZW1iZXIobV9jb250ZW50TGFuZ3VhZ2UpOworICAgIGluZm8uYWRkSGFzaE1h
cChtX2RvY3VtZW50TmFtZWRJdGVtQ29sbGVjdGlvbnMpOworICAgIGluZm8uYWRkSGFzaE1hcCht
X3dpbmRvd05hbWVkSXRlbUNvbGxlY3Rpb25zKTsKKyNpZiBFTkFCTEUoREFTSEJPQVJEX1NVUFBP
UlQpCisgICAgaW5mby5hZGRWZWN0b3IobV9kYXNoYm9hcmRSZWdpb25zKTsKKyNlbmRpZgorICAg
IGluZm8uYWRkSGFzaE1hcChtX2Nzc0NhbnZhc0VsZW1lbnRzKTsKKyAgICBpbmZvLmFkZFZlY3Rv
cihtX2ljb25VUkxzKTsKKyAgICBpbmZvLmFkZEhhc2hTZXQobV9kb2N1bWVudFN1c3BlbnNpb25D
YWxsYmFja0VsZW1lbnRzKTsKKyAgICBpbmZvLmFkZEhhc2hTZXQobV9tZWRpYVZvbHVtZUNhbGxi
YWNrRWxlbWVudHMpOworICAgIGluZm8uYWRkSGFzaFNldChtX3ByaXZhdGVCcm93c2luZ1N0YXRl
Q2hhbmdlZEVsZW1lbnRzKTsKKyAgICBpbmZvLmFkZEhhc2hNYXAobV9lbGVtZW50c0J5QWNjZXNz
S2V5KTsKKyAgICBpbmZvLmFkZE1lbWJlcihtX2V2ZW50UXVldWUpOworICAgIGluZm8uYWRkSGFz
aFNldChtX21lZGlhQ2FuU3RhcnRMaXN0ZW5lcnMpOworICAgIGluZm8uYWRkVmVjdG9yKG1fcGVu
ZGluZ1Rhc2tzKTsKK30KKworI2lmIEVOQUJMRShVTkRPX01BTkFHRVIpCitQYXNzUmVmUHRyPFVu
ZG9NYW5hZ2VyPiBEb2N1bWVudDo6dW5kb01hbmFnZXIoKQoreworICAgIGlmICghbV91bmRvTWFu
YWdlcikKKyAgICAgICAgbV91bmRvTWFuYWdlciA9IFVuZG9NYW5hZ2VyOjpjcmVhdGUodGhpcyk7
CisgICAgcmV0dXJuIG1fdW5kb01hbmFnZXI7Cit9CisjZW5kaWYKKworY2xhc3MgSW1tdXRhYmxl
QXR0cmlidXRlRGF0YUNhY2hlS2V5IHsKKyAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKK3B1
YmxpYzoKKyAgICBJbW11dGFibGVBdHRyaWJ1dGVEYXRhQ2FjaGVLZXkoKQorICAgICAgICA6IG1f
bG9jYWxOYW1lKDApCisgICAgICAgICwgbV9hdHRyaWJ1dGVzKDApCisgICAgICAgICwgbV9hdHRy
aWJ1dGVDb3VudCgwKQorICAgIHsgfQorCisgICAgSW1tdXRhYmxlQXR0cmlidXRlRGF0YUNhY2hl
S2V5KGNvbnN0IEF0b21pY1N0cmluZyYgbG9jYWxOYW1lLCBjb25zdCBBdHRyaWJ1dGUqIGF0dHJp
YnV0ZXMsIHVuc2lnbmVkIGF0dHJpYnV0ZUNvdW50KQorICAgICAgICA6IG1fbG9jYWxOYW1lKGxv
Y2FsTmFtZS5pbXBsKCkpCisgICAgICAgICwgbV9hdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpCisgICAg
ICAgICwgbV9hdHRyaWJ1dGVDb3VudChhdHRyaWJ1dGVDb3VudCkKKyAgICB7IH0KKworICAgIGJv
b2wgb3BlcmF0b3IhPShjb25zdCBJbW11dGFibGVBdHRyaWJ1dGVEYXRhQ2FjaGVLZXkmIG90aGVy
KSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKG1fbG9jYWxOYW1lICE9IG90aGVyLm1fbG9jYWxO
YW1lKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChtX2F0dHJpYnV0ZUNv
dW50ICE9IG90aGVyLm1fYXR0cmlidXRlQ291bnQpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICAgICAgcmV0dXJuIG1lbWNtcChtX2F0dHJpYnV0ZXMsIG90aGVyLm1fYXR0cmlidXRlcywg
c2l6ZW9mKEF0dHJpYnV0ZSkgKiBtX2F0dHJpYnV0ZUNvdW50KTsKKyAgICB9CisKKyAgICB1bnNp
Z25lZCBoYXNoKCkgY29uc3QKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIGF0dHJpYnV0ZUhhc2gg
PSBTdHJpbmdIYXNoZXI6Omhhc2hNZW1vcnkobV9hdHRyaWJ1dGVzLCBtX2F0dHJpYnV0ZUNvdW50
ICogc2l6ZW9mKEF0dHJpYnV0ZSkpOworICAgICAgICByZXR1cm4gV1RGOjpwYWlySW50SGFzaCht
X2xvY2FsTmFtZS0+ZXhpc3RpbmdIYXNoKCksIGF0dHJpYnV0ZUhhc2gpOworICAgIH0KKworcHJp
dmF0ZToKKyAgICBBdG9taWNTdHJpbmdJbXBsKiBtX2xvY2FsTmFtZTsKKyAgICBjb25zdCBBdHRy
aWJ1dGUqIG1fYXR0cmlidXRlczsKKyAgICB1bnNpZ25lZCBtX2F0dHJpYnV0ZUNvdW50OworfTsK
Kworc3RydWN0IEltbXV0YWJsZUF0dHJpYnV0ZURhdGFDYWNoZUVudHJ5IHsKKyAgICBJbW11dGFi
bGVBdHRyaWJ1dGVEYXRhQ2FjaGVLZXkga2V5OworICAgIFJlZlB0cjxFbGVtZW50QXR0cmlidXRl
RGF0YT4gdmFsdWU7Cit9OworCitQYXNzUmVmUHRyPEVsZW1lbnRBdHRyaWJ1dGVEYXRhPiBEb2N1
bWVudDo6Y2FjaGVkSW1tdXRhYmxlQXR0cmlidXRlRGF0YShjb25zdCBFbGVtZW50KiBlbGVtZW50
LCBjb25zdCBWZWN0b3I8QXR0cmlidXRlPiYgYXR0cmlidXRlcykKK3sKKyAgICBBU1NFUlQoIWF0
dHJpYnV0ZXMuaXNFbXB0eSgpKTsKKworICAgIEltbXV0YWJsZUF0dHJpYnV0ZURhdGFDYWNoZUtl
eSBjYWNoZUtleShlbGVtZW50LT5sb2NhbE5hbWUoKSwgYXR0cmlidXRlcy5kYXRhKCksIGF0dHJp
YnV0ZXMuc2l6ZSgpKTsKKyAgICB1bnNpZ25lZCBjYWNoZUhhc2ggPSBjYWNoZUtleS5oYXNoKCk7
CisKKyAgICBJbW11dGFibGVBdHRyaWJ1dGVEYXRhQ2FjaGU6Oml0ZXJhdG9yIGNhY2hlSXRlcmF0
b3IgPSBtX2ltbXV0YWJsZUF0dHJpYnV0ZURhdGFDYWNoZS5hZGQoY2FjaGVIYXNoLCBudWxscHRy
KS5pdGVyYXRvcjsKKyAgICBpZiAoY2FjaGVJdGVyYXRvci0+c2Vjb25kICYmIGNhY2hlSXRlcmF0
b3ItPnNlY29uZC0+a2V5ICE9IGNhY2hlS2V5KQorICAgICAgICBjYWNoZUhhc2ggPSAwOworCisg
ICAgUmVmUHRyPEVsZW1lbnRBdHRyaWJ1dGVEYXRhPiBhdHRyaWJ1dGVEYXRhOworICAgIGlmIChj
YWNoZUhhc2ggJiYgY2FjaGVJdGVyYXRvci0+c2Vjb25kKQorICAgICAgICBhdHRyaWJ1dGVEYXRh
ID0gY2FjaGVJdGVyYXRvci0+c2Vjb25kLT52YWx1ZTsKKyAgICBlbHNlCisgICAgICAgIGF0dHJp
YnV0ZURhdGEgPSBFbGVtZW50QXR0cmlidXRlRGF0YTo6Y3JlYXRlSW1tdXRhYmxlKGF0dHJpYnV0
ZXMpOworCisgICAgaWYgKCFjYWNoZUhhc2ggfHwgY2FjaGVJdGVyYXRvci0+c2Vjb25kKQorICAg
ICAgICByZXR1cm4gYXR0cmlidXRlRGF0YS5yZWxlYXNlKCk7CisKKyAgICBPd25QdHI8SW1tdXRh
YmxlQXR0cmlidXRlRGF0YUNhY2hlRW50cnk+IG5ld0VudHJ5ID0gYWRvcHRQdHIobmV3IEltbXV0
YWJsZUF0dHJpYnV0ZURhdGFDYWNoZUVudHJ5KTsKKyAgICBuZXdFbnRyeS0+a2V5ID0gSW1tdXRh
YmxlQXR0cmlidXRlRGF0YUNhY2hlS2V5KGVsZW1lbnQtPmxvY2FsTmFtZSgpLCBjb25zdF9jYXN0
PGNvbnN0IEVsZW1lbnRBdHRyaWJ1dGVEYXRhKj4oYXR0cmlidXRlRGF0YS5nZXQoKSktPmF0dHJp
YnV0ZUl0ZW0oMCksIGF0dHJpYnV0ZURhdGEtPmxlbmd0aCgpKTsKKyAgICBuZXdFbnRyeS0+dmFs
dWUgPSBhdHRyaWJ1dGVEYXRhOworCisgICAgY2FjaGVJdGVyYXRvci0+c2Vjb25kID0gbmV3RW50
cnkucmVsZWFzZSgpOworCisgICAgcmV0dXJuIGF0dHJpYnV0ZURhdGEucmVsZWFzZSgpOworfQor
CitMb2NhbGl6ZXImIERvY3VtZW50OjpnZXRMb2NhbGl6ZXIoY29uc3QgQXRvbWljU3RyaW5nJiBs
b2NhbGUpCit7CisgICAgQXRvbWljU3RyaW5nIGxvY2FsZUtleSA9IGxvY2FsZTsKKyAgICBpZiAo
bG9jYWxlLmlzRW1wdHkoKSB8fCAhUnVudGltZUVuYWJsZWRGZWF0dXJlczo6bGFuZ0F0dHJpYnV0
ZUF3YXJlRm9ybUNvbnRyb2xVSUVuYWJsZWQoKSkKKyAgICAgICAgbG9jYWxlS2V5ID0gZGVmYXVs
dExhbmd1YWdlKCk7CisgICAgTG9jYWxlVG9Mb2NhbGl6ZXJNYXA6OkFkZFJlc3VsdCByZXN1bHQg
PSBtX2xvY2FsaXplckNhY2hlLmFkZChsb2NhbGVLZXksIG51bGxwdHIpOworICAgIGlmIChyZXN1
bHQuaXNOZXdFbnRyeSkKKyAgICAgICAgcmVzdWx0Lml0ZXJhdG9yLT5zZWNvbmQgPSBMb2NhbGl6
ZXI6OmNyZWF0ZShsb2NhbGVLZXkpOworICAgIHJldHVybiAqKHJlc3VsdC5pdGVyYXRvci0+c2Vj
b25kKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogU291cmNlL1dlYkNvcmUv
ZG9tL0RvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJDb3JlL2RvbS9Eb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmNwcAkocmV2aXNpb24g
MTI5MzAzKQorKysgU291cmNlL1dlYkNvcmUvZG9tL0RvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rp
b24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNiw2MzAgKzI2LDUyIEBACiAgKi8KIAogI2luY2x1
ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIkRvY3VtZW50LmgiCisjaW5jbHVkZSAiRG9jdW1lbnRT
dHlsZVNoZWV0Q29sbGVjdGlvbi5oIgogCi0jaW5jbHVkZSAiQVhPYmplY3RDYWNoZS5oIgotI2lu
Y2x1ZGUgIkFuaW1hdGlvbkNvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJBdHRyLmgiCi0jaW5jbHVk
ZSAiQXR0cmlidXRlLmgiCi0jaW5jbHVkZSAiQ0RBVEFTZWN0aW9uLmgiCi0jaW5jbHVkZSAiQ1NT
UGFyc2VyLmgiCi0jaW5jbHVkZSAiQ1NTU3R5bGVEZWNsYXJhdGlvbi5oIgogI2luY2x1ZGUgIkNT
U1N0eWxlU2hlZXQuaCIKLSNpbmNsdWRlICJDU1NWYWx1ZUtleXdvcmRzLmgiCi0jaW5jbHVkZSAi
Q2FjaGVkQ1NTU3R5bGVTaGVldC5oIgotI2luY2x1ZGUgIkNhY2hlZFJlc291cmNlTG9hZGVyLmgi
Ci0jaW5jbHVkZSAiQ2hyb21lLmgiCi0jaW5jbHVkZSAiQ2hyb21lQ2xpZW50LmgiCi0jaW5jbHVk
ZSAiQ29tbWVudC5oIgotI2luY2x1ZGUgIkNvbnNvbGUuaCIKLSNpbmNsdWRlICJDb250ZW50U2Vj
dXJpdHlQb2xpY3kuaCIKLSNpbmNsdWRlICJDb250ZXh0RmVhdHVyZXMuaCIKLSNpbmNsdWRlICJD
b29raWVKYXIuaCIKLSNpbmNsdWRlICJET01JbXBsZW1lbnRhdGlvbi5oIgotI2luY2x1ZGUgIkRP
TU5hbWVkRmxvd0NvbGxlY3Rpb24uaCIKLSNpbmNsdWRlICJET01TZWxlY3Rpb24uaCIKLSNpbmNs
dWRlICJET01XaW5kb3cuaCIKLSNpbmNsdWRlICJEYXRlQ29tcG9uZW50cy5oIgotI2luY2x1ZGUg
IkRldmljZU1vdGlvbkNvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJEZXZpY2VPcmllbnRhdGlvbkNv
bnRyb2xsZXIuaCIKLSNpbmNsdWRlICJEb2N1bWVudEV2ZW50UXVldWUuaCIKLSNpbmNsdWRlICJE
b2N1bWVudEZyYWdtZW50LmgiCi0jaW5jbHVkZSAiRG9jdW1lbnRMb2FkZXIuaCIKLSNpbmNsdWRl
ICJEb2N1bWVudE1hcmtlckNvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJEb2N1bWVudFR5cGUuaCIK
LSNpbmNsdWRlICJFZGl0aW5nVGV4dC5oIgotI2luY2x1ZGUgIkVkaXRvci5oIgorI2luY2x1ZGUg
IkRvY3VtZW50LmgiCiAjaW5jbHVkZSAiRWxlbWVudC5oIgotI2luY2x1ZGUgIkVsZW1lbnRTaGFk
b3cuaCIKLSNpbmNsdWRlICJFbnRpdHlSZWZlcmVuY2UuaCIKLSNpbmNsdWRlICJFdmVudC5oIgot
I2luY2x1ZGUgIkV2ZW50RmFjdG9yeS5oIgotI2luY2x1ZGUgIkV2ZW50SGFuZGxlci5oIgotI2lu
Y2x1ZGUgIkV2ZW50TGlzdGVuZXIuaCIKLSNpbmNsdWRlICJFdmVudE5hbWVzLmgiCi0jaW5jbHVk
ZSAiRXhjZXB0aW9uQ29kZS5oIgotI2luY2x1ZGUgIkZsb3dUaHJlYWRDb250cm9sbGVyLmgiCi0j
aW5jbHVkZSAiRm9jdXNDb250cm9sbGVyLmgiCi0jaW5jbHVkZSAiRm9ybUNvbnRyb2xsZXIuaCIK
LSNpbmNsdWRlICJGcmFtZS5oIgotI2luY2x1ZGUgIkZyYW1lTG9hZGVyLmgiCi0jaW5jbHVkZSAi
RnJhbWVMb2FkZXJDbGllbnQuaCIKLSNpbmNsdWRlICJGcmFtZVNlbGVjdGlvbi5oIgotI2luY2x1
ZGUgIkZyYW1lVHJlZS5oIgotI2luY2x1ZGUgIkZyYW1lVmlldy5oIgotI2luY2x1ZGUgIkdlb2xv
Y2F0aW9uQ29udHJvbGxlci5oIgotI2luY2x1ZGUgIkhhc2hDaGFuZ2VFdmVudC5oIgotI2luY2x1
ZGUgIkhpc3RvZ3JhbVN1cHBvcnQuaCIKLSNpbmNsdWRlICJIaXN0b3J5LmgiCi0jaW5jbHVkZSAi
SFRNTEFsbENvbGxlY3Rpb24uaCIKLSNpbmNsdWRlICJIVE1MQW5jaG9yRWxlbWVudC5oIgotI2lu
Y2x1ZGUgIkhUTUxCb2R5RWxlbWVudC5oIgotI2luY2x1ZGUgIkhUTUxDYW52YXNFbGVtZW50Lmgi
Ci0jaW5jbHVkZSAiSFRNTENvbGxlY3Rpb24uaCIKLSNpbmNsdWRlICJIVE1MRG9jdW1lbnQuaCIK
LSNpbmNsdWRlICJIVE1MRWxlbWVudEZhY3RvcnkuaCIKLSNpbmNsdWRlICJIVE1MRnJhbWVPd25l
ckVsZW1lbnQuaCIKLSNpbmNsdWRlICJIVE1MSGVhZEVsZW1lbnQuaCIKLSNpbmNsdWRlICJIVE1M
SUZyYW1lRWxlbWVudC5oIgogI2luY2x1ZGUgIkhUTUxMaW5rRWxlbWVudC5oIgotI2luY2x1ZGUg
IkhUTUxNYXBFbGVtZW50LmgiCi0jaW5jbHVkZSAiSFRNTE5hbWVDb2xsZWN0aW9uLmgiCiAjaW5j
bHVkZSAiSFRNTE5hbWVzLmgiCi0jaW5jbHVkZSAiSFRNTFBhcnNlcklkaW9tcy5oIgogI2luY2x1
ZGUgIkhUTUxTdHlsZUVsZW1lbnQuaCIKLSNpbmNsdWRlICJIVE1MVGl0bGVFbGVtZW50LmgiCi0j
aW5jbHVkZSAiSFRUUFBhcnNlcnMuaCIKLSNpbmNsdWRlICJIaXRUZXN0UmVxdWVzdC5oIgotI2lu
Y2x1ZGUgIkhpdFRlc3RSZXN1bHQuaCIKLSNpbmNsdWRlICJJbWFnZUxvYWRlci5oIgotI2luY2x1
ZGUgIkluc3BlY3RvckNvdW50ZXJzLmgiCi0jaW5jbHVkZSAiSW5zcGVjdG9ySW5zdHJ1bWVudGF0
aW9uLmgiCi0jaW5jbHVkZSAiTGFuZ3VhZ2UuaCIKLSNpbmNsdWRlICJMb2NhbGl6ZXIuaCIKLSNp
bmNsdWRlICJMb2dnaW5nLmgiCi0jaW5jbHVkZSAiTWVkaWFRdWVyeUxpc3QuaCIKLSNpbmNsdWRl
ICJNZWRpYVF1ZXJ5TWF0Y2hlci5oIgotI2luY2x1ZGUgIk1vdXNlRXZlbnRXaXRoSGl0VGVzdFJl
c3VsdHMuaCIKLSNpbmNsdWRlICJOYW1lTm9kZUxpc3QuaCIKLSNpbmNsdWRlICJOYW1lZEZsb3dD
b2xsZWN0aW9uLmgiCi0jaW5jbHVkZSAiTmVzdGluZ0xldmVsSW5jcmVtZW50ZXIuaCIKLSNpbmNs
dWRlICJOZXdYTUxEb2N1bWVudFBhcnNlci5oIgotI2luY2x1ZGUgIk5vZGVGaWx0ZXIuaCIKLSNp
bmNsdWRlICJOb2RlSXRlcmF0b3IuaCIKLSNpbmNsdWRlICJOb2RlUmFyZURhdGEuaCIKLSNpbmNs
dWRlICJOb2RlV2l0aEluZGV4LmgiCiAjaW5jbHVkZSAiUGFnZS5oIgogI2luY2x1ZGUgIlBhZ2VH
cm91cC5oIgotI2luY2x1ZGUgIlBhZ2VUcmFuc2l0aW9uRXZlbnQuaCIKLSNpbmNsdWRlICJQbGF0
Zm9ybUtleWJvYXJkRXZlbnQuaCIKLSNpbmNsdWRlICJQbHVnaW5Eb2N1bWVudC5oIgotI2luY2x1
ZGUgIlBvaW50ZXJMb2NrQ29udHJvbGxlci5oIgotI2luY2x1ZGUgIlBvcFN0YXRlRXZlbnQuaCIK
ICNpbmNsdWRlICJQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24uaCIKLSNpbmNsdWRlICJSZWdpc3RlcmVk
RXZlbnRMaXN0ZW5lci5oIgotI2luY2x1ZGUgIlJlbmRlckFyZW5hLmgiCi0jaW5jbHVkZSAiUmVu
ZGVyTmFtZWRGbG93VGhyZWFkLmgiCi0jaW5jbHVkZSAiUmVuZGVyVGV4dENvbnRyb2wuaCIKLSNp
bmNsdWRlICJSZW5kZXJWaWV3LmgiCi0jaW5jbHVkZSAiUmVuZGVyV2lkZ2V0LmgiCi0jaW5jbHVk
ZSAiUnVudGltZUVuYWJsZWRGZWF0dXJlcy5oIgotI2luY2x1ZGUgIlNjaGVtZVJlZ2lzdHJ5Lmgi
Ci0jaW5jbHVkZSAiU2NvcGVkRXZlbnRRdWV1ZS5oIgotI2luY2x1ZGUgIlNjcmlwdENhbGxTdGFj
ay5oIgotI2luY2x1ZGUgIlNjcmlwdENvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJTY3JpcHRFbGVt
ZW50LmgiCi0jaW5jbHVkZSAiU2NyaXB0RXZlbnRMaXN0ZW5lci5oIgotI2luY2x1ZGUgIlNjcmlw
dFJ1bm5lci5oIgotI2luY2x1ZGUgIlNjcm9sbGluZ0Nvb3JkaW5hdG9yLmgiCi0jaW5jbHVkZSAi
U2VjdXJpdHlPcmlnaW4uaCIKLSNpbmNsdWRlICJTZWN1cml0eVBvbGljeS5oIgotI2luY2x1ZGUg
IlNlZ21lbnRlZFN0cmluZy5oIgotI2luY2x1ZGUgIlNlbGVjdG9yUXVlcnkuaCIKKyNpbmNsdWRl
ICJTVkdOYW1lcy5oIgorI2luY2x1ZGUgIlNWR1N0eWxlRWxlbWVudC5oIgorI2luY2x1ZGUgIlNl
bGVjdG9yQ2hlY2tlci5oIgogI2luY2x1ZGUgIlNldHRpbmdzLmgiCi0jaW5jbHVkZSAiU2hhZG93
Um9vdC5oIgotI2luY2x1ZGUgIlN0YXRpY0hhc2hTZXROb2RlTGlzdC5oIgogI2luY2x1ZGUgIlN0
eWxlUmVzb2x2ZXIuaCIKICNpbmNsdWRlICJTdHlsZVNoZWV0Q29udGVudHMuaCIKICNpbmNsdWRl
ICJTdHlsZVNoZWV0TGlzdC5oIgotI2luY2x1ZGUgIlRleHRSZXNvdXJjZURlY29kZXIuaCIKLSNp
bmNsdWRlICJUaW1lci5oIgotI2luY2x1ZGUgIlRyYW5zZm9ybVNvdXJjZS5oIgotI2luY2x1ZGUg
IlRyZWVXYWxrZXIuaCIKLSNpbmNsdWRlICJVbmRvTWFuYWdlci5oIgogI2luY2x1ZGUgIlVzZXJD
b250ZW50VVJMUGF0dGVybi5oIgogI2luY2x1ZGUgIldlYkNvcmVNZW1vcnlJbnN0cnVtZW50YXRp
b24uaCIKLSNpbmNsdWRlICJXZWJLaXROYW1lZEZsb3cuaCIKLSNpbmNsdWRlICJYTUxEb2N1bWVu
dFBhcnNlci5oIgotI2luY2x1ZGUgIlhNTEh0dHBSZXF1ZXN0LmgiCi0jaW5jbHVkZSAiWE1MTlNO
YW1lcy5oIgotI2luY2x1ZGUgIlhNTE5hbWVzLmgiCi0jaW5jbHVkZSAiWFBhdGhFdmFsdWF0b3Iu
aCIKLSNpbmNsdWRlICJYUGF0aEV4cHJlc3Npb24uaCIKLSNpbmNsdWRlICJYUGF0aE5TUmVzb2x2
ZXIuaCIKLSNpbmNsdWRlICJYUGF0aFJlc3VsdC5oIgotI2luY2x1ZGUgImh0bWxlZGl0aW5nLmgi
Ci0jaW5jbHVkZSA8d3RmL0N1cnJlbnRUaW1lLmg+Ci0jaW5jbHVkZSA8d3RmL0hhc2hGdW5jdGlv
bnMuaD4KLSNpbmNsdWRlIDx3dGYvTWFpblRocmVhZC5oPgotI2luY2x1ZGUgPHd0Zi9QYXNzUmVm
UHRyLmg+Ci0jaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgotI2luY2x1ZGUgPHd0Zi90ZXh0
L1N0cmluZ0J1ZmZlci5oPgotCi0jaWYgRU5BQkxFKFNIQVJFRF9XT1JLRVJTKQotI2luY2x1ZGUg
IlNoYXJlZFdvcmtlclJlcG9zaXRvcnkuaCIKLSNlbmRpZgotCi0jaWYgRU5BQkxFKFhTTFQpCi0j
aW5jbHVkZSAiWFNMVFByb2Nlc3Nvci5oIgotI2VuZGlmCi0KLSNpZiBFTkFCTEUoU1ZHKQotI2lu
Y2x1ZGUgIlNWR0RvY3VtZW50RXh0ZW5zaW9ucy5oIgotI2luY2x1ZGUgIlNWR0VsZW1lbnRGYWN0
b3J5LmgiCi0jaW5jbHVkZSAiU1ZHTmFtZXMuaCIKLSNpbmNsdWRlICJTVkdTVkdFbGVtZW50Lmgi
Ci0jaW5jbHVkZSAiU1ZHU3R5bGVFbGVtZW50LmgiCi0jZW5kaWYKLQotI2lmIEVOQUJMRShUT1VD
SF9FVkVOVFMpCi0jaW5jbHVkZSAiVG91Y2hMaXN0LmgiCi0jZW5kaWYKLQotI2lmIEVOQUJMRShN
QVRITUwpCi0jaW5jbHVkZSAiTWF0aE1MRWxlbWVudC5oIgotI2luY2x1ZGUgIk1hdGhNTEVsZW1l
bnRGYWN0b3J5LmgiCi0jaW5jbHVkZSAiTWF0aE1MTmFtZXMuaCIKLSNlbmRpZgotCi0jaWYgRU5B
QkxFKEZVTExTQ1JFRU5fQVBJKQotI2luY2x1ZGUgIlJlbmRlckZ1bGxTY3JlZW4uaCIKLSNlbmRp
ZgotCi0jaWYgRU5BQkxFKFJFUVVFU1RfQU5JTUFUSU9OX0ZSQU1FKQotI2luY2x1ZGUgIlJlcXVl
c3RBbmltYXRpb25GcmFtZUNhbGxiYWNrLmgiCi0jaW5jbHVkZSAiU2NyaXB0ZWRBbmltYXRpb25D
b250cm9sbGVyLmgiCi0jZW5kaWYKLQotI2lmIEVOQUJMRShNSUNST0RBVEEpCi0jaW5jbHVkZSAi
TWljcm9EYXRhSXRlbUxpc3QuaCIKLSNpbmNsdWRlICJOb2RlUmFyZURhdGEuaCIKLSNlbmRpZgot
Ci0jaWYgRU5BQkxFKExJTktfUFJFUkVOREVSKQotI2luY2x1ZGUgIlByZXJlbmRlcmVyLmgiCi0j
ZW5kaWYKLQotI2lmIEVOQUJMRShURVhUX0FVVE9TSVpJTkcpCi0jaW5jbHVkZSAiVGV4dEF1dG9z
aXplci5oIgotI2VuZGlmCi0KLSNpZiBFTkFCTEUoQ1NQX05FWFQpCi0jaW5jbHVkZSAiRE9NU2Vj
dXJpdHlQb2xpY3kuaCIKLSNlbmRpZgotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotdXNpbmcgbmFt
ZXNwYWNlIFdURjsKLXVzaW5nIG5hbWVzcGFjZSBVbmljb2RlOwogCiBuYW1lc3BhY2UgV2ViQ29y
ZSB7CiAKIHVzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7CiAKLS8vICNkZWZpbmUgSU5TVFJVTUVO
VF9MQVlPVVRfU0NIRURVTElORyAxCi0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjTWF4V3JpdGVS
ZWN1cnNpb25EZXB0aCA9IDIxOwotCi0vLyBUaGlzIGFtb3VudCBvZiB0aW1lIG11c3QgaGF2ZSBl
bGFwc2VkIGJlZm9yZSB3ZSB3aWxsIGV2ZW4gY29uc2lkZXIgc2NoZWR1bGluZyBhIGxheW91dCB3
aXRob3V0IGEgZGVsYXkuCi0vLyBGSVhNRTogRm9yIGZhc3RlciBtYWNoaW5lcyB0aGlzIHZhbHVl
IGNhbiByZWFsbHkgYmUgbG93ZXJlZCB0byAyMDAuICAyNTAgaXMgYWRlcXVhdGUsIGJ1dCBhIGxp
dHRsZSBoaWdoCi0vLyBmb3IgZHVhbCBHNXMuIDopCi1zdGF0aWMgY29uc3QgaW50IGNMYXlvdXRT
Y2hlZHVsZVRocmVzaG9sZCA9IDI1MDsKLQotLy8gRE9NIExldmVsIDIgc2F5cyAobGV0dGVycyBh
ZGRlZCk6Ci0vLwotLy8gYSkgTmFtZSBzdGFydCBjaGFyYWN0ZXJzIG11c3QgaGF2ZSBvbmUgb2Yg
dGhlIGNhdGVnb3JpZXMgTGwsIEx1LCBMbywgTHQsIE5sLgotLy8gYikgTmFtZSBjaGFyYWN0ZXJz
IG90aGVyIHRoYW4gTmFtZS1zdGFydCBjaGFyYWN0ZXJzIG11c3QgaGF2ZSBvbmUgb2YgdGhlIGNh
dGVnb3JpZXMgTWMsIE1lLCBNbiwgTG0sIG9yIE5kLgotLy8gYykgQ2hhcmFjdGVycyBpbiB0aGUg
Y29tcGF0aWJpbGl0eSBhcmVhIChpLmUuIHdpdGggY2hhcmFjdGVyIGNvZGUgZ3JlYXRlciB0aGFu
ICN4RjkwMCBhbmQgbGVzcyB0aGFuICN4RkZGRSkgYXJlIG5vdCBhbGxvd2VkIGluIFhNTCBuYW1l
cy4KLS8vIGQpIENoYXJhY3RlcnMgd2hpY2ggaGF2ZSBhIGZvbnQgb3IgY29tcGF0aWJpbGl0eSBk
ZWNvbXBvc2l0aW9uIChpLmUuIHRob3NlIHdpdGggYSAiY29tcGF0aWJpbGl0eSBmb3JtYXR0aW5n
IHRhZyIgaW4gZmllbGQgNSBvZiB0aGUgZGF0YWJhc2UgLS0gbWFya2VkIGJ5IGZpZWxkIDUgYmVn
aW5uaW5nIHdpdGggYSAiPCIpIGFyZSBub3QgYWxsb3dlZC4KLS8vIGUpIFRoZSBmb2xsb3dpbmcg
Y2hhcmFjdGVycyBhcmUgdHJlYXRlZCBhcyBuYW1lLXN0YXJ0IGNoYXJhY3RlcnMgcmF0aGVyIHRo
YW4gbmFtZSBjaGFyYWN0ZXJzLCBiZWNhdXNlIHRoZSBwcm9wZXJ0eSBmaWxlIGNsYXNzaWZpZXMg
dGhlbSBhcyBBbHBoYWJldGljOiBbI3gwMkJCLSN4MDJDMV0sICN4MDU1OSwgI3gwNkU1LCAjeDA2
RTYuCi0vLyBmKSBDaGFyYWN0ZXJzICN4MjBERC0jeDIwRTAgYXJlIGV4Y2x1ZGVkIChpbiBhY2Nv
cmRhbmNlIHdpdGggVW5pY29kZSwgc2VjdGlvbiA1LjE0KS4KLS8vIGcpIENoYXJhY3RlciAjeDAw
QjcgaXMgY2xhc3NpZmllZCBhcyBhbiBleHRlbmRlciwgYmVjYXVzZSB0aGUgcHJvcGVydHkgbGlz
dCBzbyBpZGVudGlmaWVzIGl0LgotLy8gaCkgQ2hhcmFjdGVyICN4MDM4NyBpcyBhZGRlZCBhcyBh
IG5hbWUgY2hhcmFjdGVyLCBiZWNhdXNlICN4MDBCNyBpcyBpdHMgY2Fub25pY2FsIGVxdWl2YWxl
bnQuCi0vLyBpKSBDaGFyYWN0ZXJzICc6JyBhbmQgJ18nIGFyZSBhbGxvd2VkIGFzIG5hbWUtc3Rh
cnQgY2hhcmFjdGVycy4KLS8vIGopIENoYXJhY3RlcnMgJy0nIGFuZCAnLicgYXJlIGFsbG93ZWQg
YXMgbmFtZSBjaGFyYWN0ZXJzLgotLy8KLS8vIEl0IGFsc28gY29udGFpbnMgY29tcGxldGUgdGFi
bGVzLiBJZiB3ZSBkZWNpZGUgaXQncyBiZXR0ZXIsIHdlIGNvdWxkIGluY2x1ZGUgdGhvc2UgaW5z
dGVhZCBvZiB0aGUgZm9sbG93aW5nIGNvZGUuCi0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc1ZhbGlk
TmFtZVN0YXJ0KFVDaGFyMzIgYykKLXsKLSAgICAvLyBydWxlIChlKSBhYm92ZQotICAgIGlmICgo
YyA+PSAweDAyQkIgJiYgYyA8PSAweDAyQzEpIHx8IGMgPT0gMHg1NTkgfHwgYyA9PSAweDZFNSB8
fCBjID09IDB4NkU2KQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIC8vIHJ1bGUgKGkpIGFi
b3ZlCi0gICAgaWYgKGMgPT0gJzonIHx8IGMgPT0gJ18nKQotICAgICAgICByZXR1cm4gdHJ1ZTsK
LQotICAgIC8vIHJ1bGVzIChhKSBhbmQgKGYpIGFib3ZlCi0gICAgY29uc3QgdWludDMyX3QgbmFt
ZVN0YXJ0TWFzayA9IExldHRlcl9Mb3dlcmNhc2UgfCBMZXR0ZXJfVXBwZXJjYXNlIHwgTGV0dGVy
X090aGVyIHwgTGV0dGVyX1RpdGxlY2FzZSB8IE51bWJlcl9MZXR0ZXI7Ci0gICAgaWYgKCEoVW5p
Y29kZTo6Y2F0ZWdvcnkoYykgJiBuYW1lU3RhcnRNYXNrKSkKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotCi0gICAgLy8gcnVsZSAoYykgYWJvdmUKLSAgICBpZiAoYyA+PSAweEY5MDAgJiYgYyA8IDB4
RkZGRSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gcnVsZSAoZCkgYWJvdmUKLSAg
ICBEZWNvbXBvc2l0aW9uVHlwZSBkZWNvbXBUeXBlID0gZGVjb21wb3NpdGlvblR5cGUoYyk7Ci0g
ICAgaWYgKGRlY29tcFR5cGUgPT0gRGVjb21wb3NpdGlvbkZvbnQgfHwgZGVjb21wVHlwZSA9PSBE
ZWNvbXBvc2l0aW9uQ29tcGF0KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICByZXR1cm4g
dHJ1ZTsKLX0KLQotc3RhdGljIGlubGluZSBib29sIGlzVmFsaWROYW1lUGFydChVQ2hhcjMyIGMp
Ci17Ci0gICAgLy8gcnVsZXMgKGEpLCAoZSksIGFuZCAoaSkgYWJvdmUKLSAgICBpZiAoaXNWYWxp
ZE5hbWVTdGFydChjKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAvLyBydWxlcyAoZykg
YW5kIChoKSBhYm92ZQotICAgIGlmIChjID09IDB4MDBCNyB8fCBjID09IDB4MDM4NykKLSAgICAg
ICAgcmV0dXJuIHRydWU7Ci0KLSAgICAvLyBydWxlIChqKSBhYm92ZQotICAgIGlmIChjID09ICct
JyB8fCBjID09ICcuJykKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAvLyBydWxlcyAoYikg
YW5kIChmKSBhYm92ZQotICAgIGNvbnN0IHVpbnQzMl90IG90aGVyTmFtZVBhcnRNYXNrID0gTWFy
a19Ob25TcGFjaW5nIHwgTWFya19FbmNsb3NpbmcgfCBNYXJrX1NwYWNpbmdDb21iaW5pbmcgfCBM
ZXR0ZXJfTW9kaWZpZXIgfCBOdW1iZXJfRGVjaW1hbERpZ2l0OwotICAgIGlmICghKFVuaWNvZGU6
OmNhdGVnb3J5KGMpICYgb3RoZXJOYW1lUGFydE1hc2spKQotICAgICAgICByZXR1cm4gZmFsc2U7
Ci0KLSAgICAvLyBydWxlIChjKSBhYm92ZQotICAgIGlmIChjID49IDB4RjkwMCAmJiBjIDwgMHhG
RkZFKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBydWxlIChkKSBhYm92ZQotICAg
IERlY29tcG9zaXRpb25UeXBlIGRlY29tcFR5cGUgPSBkZWNvbXBvc2l0aW9uVHlwZShjKTsKLSAg
ICBpZiAoZGVjb21wVHlwZSA9PSBEZWNvbXBvc2l0aW9uRm9udCB8fCBkZWNvbXBUeXBlID09IERl
Y29tcG9zaXRpb25Db21wYXQpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHJldHVybiB0
cnVlOwotfQotCi1zdGF0aWMgYm9vbCBzaG91bGRJbmhlcml0U2VjdXJpdHlPcmlnaW5Gcm9tT3du
ZXIoY29uc3QgS1VSTCYgdXJsKQotewotICAgIC8vIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVj
cy93ZWItYXBwcy9jdXJyZW50LXdvcmsvI29yaWdpbi0wCi0gICAgLy8KLSAgICAvLyBJZiBhIERv
Y3VtZW50IGhhcyB0aGUgYWRkcmVzcyAiYWJvdXQ6YmxhbmsiCi0gICAgLy8gICAgIFRoZSBvcmln
aW4gb2YgdGhlIERvY3VtZW50IGlzIHRoZSBvcmlnaW4gaXQgd2FzIGFzc2lnbmVkIHdoZW4gaXRz
IGJyb3dzaW5nIGNvbnRleHQgd2FzIGNyZWF0ZWQuCi0gICAgLy8KLSAgICAvLyBOb3RlOiBXZSBn
ZW5lcmFsaXplIHRoaXMgdG8gYWxsICJibGFuayIgVVJMcyBhbmQgaW52YWxpZCBVUkxzIGJlY2F1
c2Ugd2UKLSAgICAvLyB0cmVhdCBhbGwgb2YgdGhlc2UgVVJMcyBhcyBhYm91dDpibGFuay4KLSAg
ICAvLwotICAgIHJldHVybiAhdXJsLmlzVmFsaWQoKSB8fCB1cmwuaXNCbGFua1VSTCgpOwotfQot
Ci1zdGF0aWMgV2lkZ2V0KiB3aWRnZXRGb3JOb2RlKE5vZGUqIGZvY3VzZWROb2RlKQotewotICAg
IGlmICghZm9jdXNlZE5vZGUpCi0gICAgICAgIHJldHVybiAwOwotICAgIFJlbmRlck9iamVjdCog
cmVuZGVyZXIgPSBmb2N1c2VkTm9kZS0+cmVuZGVyZXIoKTsKLSAgICBpZiAoIXJlbmRlcmVyIHx8
ICFyZW5kZXJlci0+aXNXaWRnZXQoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIHRv
UmVuZGVyV2lkZ2V0KHJlbmRlcmVyKS0+d2lkZ2V0KCk7Ci19Ci0KLXN0YXRpYyBib29sIGFjY2Vw
dHNFZGl0aW5nRm9jdXMoTm9kZSogbm9kZSkKLXsKLSAgICBBU1NFUlQobm9kZSk7Ci0gICAgQVNT
RVJUKG5vZGUtPnJlbmRlcmVySXNFZGl0YWJsZSgpKTsKLQotICAgIE5vZGUqIHJvb3QgPSBub2Rl
LT5yb290RWRpdGFibGVFbGVtZW50KCk7Ci0gICAgRnJhbWUqIGZyYW1lID0gbm9kZS0+ZG9jdW1l
bnQoKS0+ZnJhbWUoKTsKLSAgICBpZiAoIWZyYW1lIHx8ICFyb290KQotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0KLSAgICByZXR1cm4gZnJhbWUtPmVkaXRvcigpLT5zaG91bGRCZWdpbkVkaXRpbmco
cmFuZ2VPZkNvbnRlbnRzKHJvb3QpLmdldCgpKTsKLX0KLQotc3RhdGljIGJvb2wgY2FuQWNjZXNz
QW5jZXN0b3IoY29uc3QgU2VjdXJpdHlPcmlnaW4qIGFjdGl2ZVNlY3VyaXR5T3JpZ2luLCBGcmFt
ZSogdGFyZ2V0RnJhbWUpCi17Ci0gICAgLy8gdGFyZ2V0RnJhbWUgY2FuIGJlIDAgd2hlbiB3ZSdy
ZSB0cnlpbmcgdG8gbmF2aWdhdGUgYSB0b3AtbGV2ZWwgZnJhbWUKLSAgICAvLyB0aGF0IGhhcyBh
IDAgb3BlbmVyLgotICAgIGlmICghdGFyZ2V0RnJhbWUpCi0gICAgICAgIHJldHVybiBmYWxzZTsK
LQotICAgIGNvbnN0IGJvb2wgaXNMb2NhbEFjdGl2ZU9yaWdpbiA9IGFjdGl2ZVNlY3VyaXR5T3Jp
Z2luLT5pc0xvY2FsKCk7Ci0gICAgZm9yIChGcmFtZSogYW5jZXN0b3JGcmFtZSA9IHRhcmdldEZy
YW1lOyBhbmNlc3RvckZyYW1lOyBhbmNlc3RvckZyYW1lID0gYW5jZXN0b3JGcmFtZS0+dHJlZSgp
LT5wYXJlbnQoKSkgewotICAgICAgICBEb2N1bWVudCogYW5jZXN0b3JEb2N1bWVudCA9IGFuY2Vz
dG9yRnJhbWUtPmRvY3VtZW50KCk7Ci0gICAgICAgIC8vIEZJWE1FOiBTaG91bGQgYmUgYW4gQVNT
RVJUPyBGcmFtZXMgc2hvdWxkIGFsd2F5IGhhdmUgZG9jdW1lbnRzLgotICAgICAgICBpZiAoIWFu
Y2VzdG9yRG9jdW1lbnQpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICBjb25z
dCBTZWN1cml0eU9yaWdpbiogYW5jZXN0b3JTZWN1cml0eU9yaWdpbiA9IGFuY2VzdG9yRG9jdW1l
bnQtPnNlY3VyaXR5T3JpZ2luKCk7Ci0gICAgICAgIGlmIChhY3RpdmVTZWN1cml0eU9yaWdpbi0+
Y2FuQWNjZXNzKGFuY2VzdG9yU2VjdXJpdHlPcmlnaW4pKQotICAgICAgICAgICAgcmV0dXJuIHRy
dWU7Ci0gICAgICAgIAotICAgICAgICAvLyBBbGxvdyBmaWxlIFVSTCBkZXNjZW5kYW50IG5hdmln
YXRpb24gZXZlbiB3aGVuIGFsbG93RmlsZUFjY2Vzc0Zyb21GaWxlVVJMcyBpcyBmYWxzZS4KLSAg
ICAgICAgLy8gRklYTUU6IEl0J3MgYSBiaXQgc3RyYW5nZSB0byBzcGVjaWFsLWNhc2UgbG9jYWwg
b3JpZ2lucyBoZXJlLiBTaG91bGQgd2UgYmUgZG9pbmcKLSAgICAgICAgLy8gc29tZXRoaW5nIG1v
cmUgZ2VuZXJhbCBpbnN0ZWFkPwotICAgICAgICBpZiAoaXNMb2NhbEFjdGl2ZU9yaWdpbiAmJiBh
bmNlc3RvclNlY3VyaXR5T3JpZ2luLT5pc0xvY2FsKCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1
ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyB2b2lkIHByaW50TmF2
aWdhdGlvbkVycm9yTWVzc2FnZShGcmFtZSogZnJhbWUsIGNvbnN0IEtVUkwmIGFjdGl2ZVVSTCkK
LXsKLSAgICAvLyBGSVhNRTogdGhpcyBlcnJvciBtZXNzYWdlIHNob3VsZCBjb250YWluIG1vcmUg
c3BlY2lmaWNzIG9mIHdoeSB0aGUgbmF2aWdhdGlvbiBjaGFuZ2UgaXMgbm90IGFsbG93ZWQuCi0g
ICAgU3RyaW5nIG1lc3NhZ2UgPSAiVW5zYWZlIEphdmFTY3JpcHQgYXR0ZW1wdCB0byBpbml0aWF0
ZSBhIG5hdmlnYXRpb24gY2hhbmdlIGZvciBmcmFtZSB3aXRoIFVSTCAiICsKLSAgICAgICAgICAg
ICAgICAgICAgIGZyYW1lLT5kb2N1bWVudCgpLT51cmwoKS5zdHJpbmcoKSArICIgZnJvbSBmcmFt
ZSB3aXRoIFVSTCAiICsgYWN0aXZlVVJMLnN0cmluZygpICsgIi5cbiI7Ci0KLSAgICAvLyBGSVhN
RTogc2hvdWxkIHdlIHByaW50IHRvIHRoZSBjb25zb2xlIG9mIHRoZSBkb2N1bWVudCBwZXJmb3Jt
aW5nIHRoZSBuYXZpZ2F0aW9uIGluc3RlYWQ/Ci0gICAgZnJhbWUtPmRvY3VtZW50KCktPmRvbVdp
bmRvdygpLT5wcmludEVycm9yTWVzc2FnZShtZXNzYWdlKTsKLX0KLQotc3RhdGljIEhhc2hTZXQ8
RG9jdW1lbnQqPiogZG9jdW1lbnRzVGhhdE5lZWRTdHlsZVJlY2FsYyA9IDA7Ci0KLWNsYXNzIERv
Y3VtZW50V2Vha1JlZmVyZW5jZSA6IHB1YmxpYyBUaHJlYWRTYWZlUmVmQ291bnRlZDxEb2N1bWVu
dFdlYWtSZWZlcmVuY2U+IHsKLXB1YmxpYzoKLSAgICBzdGF0aWMgUGFzc1JlZlB0cjxEb2N1bWVu
dFdlYWtSZWZlcmVuY2U+IGNyZWF0ZShEb2N1bWVudCogZG9jdW1lbnQpCi0gICAgewotICAgICAg
ICByZXR1cm4gYWRvcHRSZWYobmV3IERvY3VtZW50V2Vha1JlZmVyZW5jZShkb2N1bWVudCkpOwot
ICAgIH0KLQotICAgIERvY3VtZW50KiBkb2N1bWVudCgpCi0gICAgewotICAgICAgICBBU1NFUlQo
aXNNYWluVGhyZWFkKCkpOwotICAgICAgICByZXR1cm4gbV9kb2N1bWVudDsKLSAgICB9Ci0KLSAg
ICB2b2lkIGNsZWFyKCkKLSAgICB7Ci0gICAgICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7Ci0g
ICAgICAgIG1fZG9jdW1lbnQgPSAwOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBEb2N1bWVudFdl
YWtSZWZlcmVuY2UoRG9jdW1lbnQqIGRvY3VtZW50KQotICAgICAgICA6IG1fZG9jdW1lbnQoZG9j
dW1lbnQpCi0gICAgewotICAgICAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOwotICAgIH0KLQot
ICAgIERvY3VtZW50KiBtX2RvY3VtZW50OwotfTsKLQotdWludDY0X3QgRG9jdW1lbnQ6OnNfZ2xv
YmFsVHJlZVZlcnNpb24gPSAwOwotCi1Eb2N1bWVudDo6RG9jdW1lbnQoRnJhbWUqIGZyYW1lLCBj
b25zdCBLVVJMJiB1cmwsIGJvb2wgaXNYSFRNTCwgYm9vbCBpc0hUTUwpCi0gICAgOiBDb250YWlu
ZXJOb2RlKDAsIENyZWF0ZURvY3VtZW50KQotICAgICwgVHJlZVNjb3BlKHRoaXMpCi0gICAgLCBt
X2d1YXJkUmVmQ291bnQoMCkKLSAgICAsIG1fY29udGV4dEZlYXR1cmVzKENvbnRleHRGZWF0dXJl
czo6ZGVmYXVsdFN3aXRjaCgpKQotICAgICwgbV9jb21wYXRpYmlsaXR5TW9kZShOb1F1aXJrc01v
ZGUpCi0gICAgLCBtX2NvbXBhdGliaWxpdHlNb2RlTG9ja2VkKGZhbHNlKQotICAgICwgbV9kb21U
cmVlVmVyc2lvbigrK3NfZ2xvYmFsVHJlZVZlcnNpb24pCi0jaWYgRU5BQkxFKE1VVEFUSU9OX09C
U0VSVkVSUykKLSAgICAsIG1fbXV0YXRpb25PYnNlcnZlclR5cGVzKDApCi0jZW5kaWYKLSAgICAs
IG1fc3R5bGVTaGVldHMoU3R5bGVTaGVldExpc3Q6OmNyZWF0ZSh0aGlzKSkKK0RvY3VtZW50U3R5
bGVTaGVldENvbGxlY3Rpb246OkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24oRG9jdW1lbnQq
IGRvY3VtZW50KQorICAgIDogbV9kb2N1bWVudChkb2N1bWVudCkKKyAgICAsIG1fYXV0aG9yU3R5
bGVTaGVldHMoU3R5bGVTaGVldExpc3Q6OmNyZWF0ZShkb2N1bWVudCkpCisgICAgLCBtX3BlbmRp
bmdTdHlsZXNoZWV0cygwKQorICAgICwgbV9wYWdlR3JvdXBVc2VyU2hlZXRDYWNoZVZhbGlkKGZh
bHNlKQogICAgICwgbV9oYWRBY3RpdmVMb2FkaW5nU3R5bGVzaGVldChmYWxzZSkKLSAgICAsIG1f
cmVhZHlTdGF0ZShDb21wbGV0ZSkKLSAgICAsIG1fc3R5bGVSZWNhbGNUaW1lcih0aGlzLCAmRG9j
dW1lbnQ6OnN0eWxlUmVjYWxjVGltZXJGaXJlZCkKLSAgICAsIG1fcGVuZGluZ1N0eWxlUmVjYWxj
U2hvdWxkRm9yY2UoZmFsc2UpCi0gICAgLCBtX2ZyYW1lRWxlbWVudHNTaG91bGRJZ25vcmVTY3Jv
bGxpbmcoZmFsc2UpCi0gICAgLCBtX2NvbnRhaW5zVmFsaWRpdHlTdHlsZVJ1bGVzKGZhbHNlKQot
ICAgICwgbV91cGRhdGVGb2N1c0FwcGVhcmFuY2VSZXN0b3Jlc1NlbGVjdGlvbihmYWxzZSkKLSAg
ICAsIG1faWdub3JlRGVzdHJ1Y3RpdmVXcml0ZUNvdW50KDApCi0gICAgLCBtX3RpdGxlU2V0RXhw
bGljaXRseShmYWxzZSkKLSAgICAsIG1fdXBkYXRlRm9jdXNBcHBlYXJhbmNlVGltZXIodGhpcywg
JkRvY3VtZW50Ojp1cGRhdGVGb2N1c0FwcGVhcmFuY2VUaW1lckZpcmVkKQotICAgICwgbV9sb2Fk
RXZlbnRGaW5pc2hlZChmYWxzZSkKLSAgICAsIG1fc3RhcnRUaW1lKGN1cnJlbnRUaW1lKCkpCi0g
ICAgLCBtX292ZXJNaW5pbXVtTGF5b3V0VGhyZXNob2xkKGZhbHNlKQotICAgICwgbV9zY3JpcHRS
dW5uZXIoU2NyaXB0UnVubmVyOjpjcmVhdGUodGhpcykpCi0gICAgLCBtX3htbFZlcnNpb24oIjEu
MCIpCi0gICAgLCBtX3htbFN0YW5kYWxvbmUoU3RhbmRhbG9uZVVuc3BlY2lmaWVkKQotICAgICwg
bV9oYXNYTUxEZWNsYXJhdGlvbigwKQotICAgICwgbV9zYXZlZFJlbmRlcmVyKDApCi0gICAgLCBt
X2Rlc2lnbk1vZGUoaW5oZXJpdCkKLSNpZiBFTkFCTEUoREFTSEJPQVJEX1NVUFBPUlQpIHx8IEVO
QUJMRShXSURHRVRfUkVHSU9OKQotICAgICwgbV9oYXNEYXNoYm9hcmRSZWdpb25zKGZhbHNlKQot
ICAgICwgbV9kYXNoYm9hcmRSZWdpb25zRGlydHkoZmFsc2UpCi0jZW5kaWYKLSAgICAsIG1fY3Jl
YXRlUmVuZGVyZXJzKHRydWUpCi0gICAgLCBtX2luUGFnZUNhY2hlKGZhbHNlKQotICAgICwgbV9h
Y2Nlc3NLZXlNYXBWYWxpZChmYWxzZSkKLSAgICAsIG1fdXNlU2VjdXJlS2V5Ym9hcmRFbnRyeVdo
ZW5BY3RpdmUoZmFsc2UpCi0gICAgLCBtX2lzWEhUTUwoaXNYSFRNTCkKLSAgICAsIG1faXNIVE1M
KGlzSFRNTCkKLSAgICAsIG1faXNWaWV3U291cmNlKGZhbHNlKQotICAgICwgbV9zYXdFbGVtZW50
c0luS25vd25OYW1lc3BhY2VzKGZhbHNlKQotICAgICwgbV9pc1NyY2RvY0RvY3VtZW50KGZhbHNl
KQotICAgICwgbV9kb2N1bWVudFJhcmVEYXRhKDApCi0gICAgLCBtX2V2ZW50UXVldWUoRG9jdW1l
bnRFdmVudFF1ZXVlOjpjcmVhdGUodGhpcykpCi0gICAgLCBtX3dlYWtSZWZlcmVuY2UoRG9jdW1l
bnRXZWFrUmVmZXJlbmNlOjpjcmVhdGUodGhpcykpCi0gICAgLCBtX2lkQXR0cmlidXRlTmFtZShp
ZEF0dHIpCi0jaWYgRU5BQkxFKEZVTExTQ1JFRU5fQVBJKQotICAgICwgbV9hcmVLZXlzRW5hYmxl
ZEluRnVsbFNjcmVlbigwKQotICAgICwgbV9mdWxsU2NyZWVuUmVuZGVyZXIoMCkKLSAgICAsIG1f
ZnVsbFNjcmVlbkNoYW5nZURlbGF5VGltZXIodGhpcywgJkRvY3VtZW50OjpmdWxsU2NyZWVuQ2hh
bmdlRGVsYXlUaW1lckZpcmVkKQotICAgICwgbV9pc0FuaW1hdGluZ0Z1bGxTY3JlZW4oZmFsc2Up
Ci0jZW5kaWYKLSAgICAsIG1fbG9hZEV2ZW50RGVsYXlDb3VudCgwKQotICAgICwgbV9sb2FkRXZl
bnREZWxheVRpbWVyKHRoaXMsICZEb2N1bWVudDo6bG9hZEV2ZW50RGVsYXlUaW1lckZpcmVkKQot
ICAgICwgbV9yZWZlcnJlclBvbGljeShSZWZlcnJlclBvbGljeURlZmF1bHQpCi0gICAgLCBtX2Rp
cmVjdGlvblNldE9uRG9jdW1lbnRFbGVtZW50KGZhbHNlKQotICAgICwgbV93cml0aW5nTW9kZVNl
dE9uRG9jdW1lbnRFbGVtZW50KGZhbHNlKQotICAgICwgbV93cml0ZVJlY3Vyc2lvbklzVG9vRGVl
cChmYWxzZSkKLSAgICAsIG1fd3JpdGVSZWN1cnNpb25EZXB0aCgwKQotICAgICwgbV93aGVlbEV2
ZW50SGFuZGxlckNvdW50KDApCi0jaWYgRU5BQkxFKFRPVUNIX0VWRU5UUykKLSAgICAsIG1fdG91
Y2hFdmVudEhhbmRsZXJDb3VudCgwKQotI2VuZGlmCi0jaWYgRU5BQkxFKFVORE9fTUFOQUdFUikK
LSAgICAsIG1fdW5kb01hbmFnZXIoMCkKLSNlbmRpZgotICAgICwgbV9wZW5kaW5nVGFza3NUaW1l
cih0aGlzLCAmRG9jdW1lbnQ6OnBlbmRpbmdUYXNrc1RpbWVyRmlyZWQpCi0gICAgLCBtX3NjaGVk
dWxlZFRhc2tzQXJlU3VzcGVuZGVkKGZhbHNlKQotICAgICwgbV92aXN1YWxVcGRhdGVzQWxsb3dl
ZCh0cnVlKQotICAgICwgbV92aXN1YWxVcGRhdGVzU3VwcHJlc3Npb25UaW1lcih0aGlzLCAmRG9j
dW1lbnQ6OnZpc3VhbFVwZGF0ZXNTdXBwcmVzc2lvblRpbWVyRmlyZWQpCi0jaWZuZGVmIE5ERUJV
RwotICAgICwgbV9kaWREaXNwYXRjaFZpZXdwb3J0UHJvcGVydGllc0NoYW5nZWQoZmFsc2UpCi0j
ZW5kaWYKLXsKLSAgICBtX2RvY3VtZW50ID0gdGhpczsKLQotICAgIG1fcGFnZUdyb3VwVXNlclNo
ZWV0Q2FjaGVWYWxpZCA9IGZhbHNlOwotCi0gICAgbV9wcmludGluZyA9IGZhbHNlOwotICAgIG1f
cGFnaW5hdGVkRm9yU2NyZWVuID0gZmFsc2U7Ci0KLSAgICBtX2lnbm9yZUF1dG9mb2N1cyA9IGZh
bHNlOwotCi0gICAgbV9mcmFtZSA9IGZyYW1lOwotICAgIGlmIChtX2ZyYW1lKQotICAgICAgICBw
cm92aWRlQ29udGV4dEZlYXR1cmVzVG9Eb2N1bWVudEZyb20odGhpcywgbV9mcmFtZS0+cGFnZSgp
KTsKLQotICAgIC8vIFdlIGRlcGVuZCBvbiB0aGUgdXJsIGdldHRpbmcgaW1tZWRpYXRlbHkgc2V0
IGluIHN1YmZyYW1lcywgYnV0IHdlCi0gICAgLy8gYWxzbyBkZXBlbmQgb24gdGhlIHVybCBOT1Qg
Z2V0dGluZyBpbW1lZGlhdGVseSBzZXQgaW4gb3BlbmVkIHdpbmRvd3MuCi0gICAgLy8gU2VlIGZh
c3QvZG9tL2Vhcmx5LWZyYW1lLXVybC5odG1sCi0gICAgLy8gYW5kIGZhc3QvZG9tL2xvY2F0aW9u
LW5ldy13aW5kb3ctbm8tY3Jhc2guaHRtbCwgcmVzcGVjdGl2ZWx5LgotICAgIC8vIEZJWE1FOiBD
YW4vc2hvdWxkIHdlIHVuaWZ5IHRoaXMgYmVoYXZpb3I/Ci0gICAgaWYgKChmcmFtZSAmJiBmcmFt
ZS0+b3duZXJFbGVtZW50KCkpIHx8ICF1cmwuaXNFbXB0eSgpKQotICAgICAgICBzZXRVUkwodXJs
KTsKLQotICAgIG1fYXhPYmplY3RDYWNoZSA9IDA7Ci0KLSAgICBtX21hcmtlcnMgPSBhZG9wdFB0
cihuZXcgRG9jdW1lbnRNYXJrZXJDb250cm9sbGVyKTsKLQotICAgIG1fY2FjaGVkUmVzb3VyY2VM
b2FkZXIgPSBhZG9wdFB0cihuZXcgQ2FjaGVkUmVzb3VyY2VMb2FkZXIodGhpcykpOwotI2lmIEVO
QUJMRShMSU5LX1BSRVJFTkRFUikKLSAgICBtX3ByZXJlbmRlcmVyID0gUHJlcmVuZGVyZXI6OmNy
ZWF0ZSh0aGlzKTsKLSNlbmRpZgotI2lmIEVOQUJMRShURVhUX0FVVE9TSVpJTkcpCi0gICAgbV90
ZXh0QXV0b3NpemVyID0gVGV4dEF1dG9zaXplcjo6Y3JlYXRlKHRoaXMpOwotI2VuZGlmCi0gICAg
bV92aXN1YWxseU9yZGVyZWQgPSBmYWxzZTsKLSAgICBtX2JQYXJzaW5nID0gZmFsc2U7Ci0gICAg
bV93ZWxsRm9ybWVkID0gZmFsc2U7Ci0KLSAgICBtX3RleHRDb2xvciA9IENvbG9yOjpibGFjazsK
LSAgICBtX2xpc3RlbmVyVHlwZXMgPSAwOwotICAgIG1faW5TdHlsZVJlY2FsYyA9IGZhbHNlOwot
ICAgIG1fY2xvc2VBZnRlclN0eWxlUmVjYWxjID0gZmFsc2U7Ci0KLSAgICBtX3VzZXNTaWJsaW5n
UnVsZXMgPSBmYWxzZTsKLSAgICBtX3VzZXNTaWJsaW5nUnVsZXNPdmVycmlkZSA9IGZhbHNlOwot
ICAgIG1fdXNlc0ZpcnN0TGluZVJ1bGVzID0gZmFsc2U7Ci0gICAgbV91c2VzRmlyc3RMZXR0ZXJS
dWxlcyA9IGZhbHNlOwotICAgIG1fdXNlc0JlZm9yZUFmdGVyUnVsZXMgPSBmYWxzZTsKLSAgICBt
X3VzZXNCZWZvcmVBZnRlclJ1bGVzT3ZlcnJpZGUgPSBmYWxzZTsKLSAgICBtX3VzZXNSZW1Vbml0
cyA9IGZhbHNlOwotICAgIG1fdXNlc0xpbmtSdWxlcyA9IGZhbHNlOwotCi0gICAgbV9nb3RvQW5j
aG9yTmVlZGVkQWZ0ZXJTdHlsZXNoZWV0c0xvYWQgPSBmYWxzZTsKLQotICAgIG1fZGlkQ2FsY3Vs
YXRlU3R5bGVSZXNvbHZlciA9IGZhbHNlOwotICAgIG1faGFzRGlydHlTdHlsZVJlc29sdmVyID0g
ZmFsc2U7Ci0gICAgbV9wZW5kaW5nU3R5bGVzaGVldHMgPSAwOwotICAgIG1faWdub3JlUGVuZGlu
Z1N0eWxlc2hlZXRzID0gZmFsc2U7Ci0gICAgbV9uZWVkc05vdGlmeVJlbW92ZUFsbFBlbmRpbmdT
dHlsZXNoZWV0ID0gZmFsc2U7Ci0gICAgbV9oYXNOb2Rlc1dpdGhQbGFjZWhvbGRlclN0eWxlID0g
ZmFsc2U7Ci0gICAgbV9wZW5kaW5nU2hlZXRMYXlvdXQgPSBOb0xheW91dFdpdGhQZW5kaW5nU2hl
ZXRzOwotCi0gICAgbV9jc3NUYXJnZXQgPSAwOwotCi0gICAgcmVzZXRMaW5rQ29sb3IoKTsKLSAg
ICByZXNldFZpc2l0ZWRMaW5rQ29sb3IoKTsKLSAgICByZXNldEFjdGl2ZUxpbmtDb2xvcigpOwot
Ci0gICAgbV9wcm9jZXNzaW5nTG9hZEV2ZW50ID0gZmFsc2U7Ci0gICAgCi0gICAgaW5pdFNlY3Vy
aXR5Q29udGV4dCgpOwotICAgIGluaXRETlNQcmVmZXRjaCgpOwotCi0gICAgc3RhdGljIGludCBk
b2NJRCA9IDA7Ci0gICAgbV9kb2NJRCA9IGRvY0lEKys7Ci0KLSAgICBmb3IgKHVuc2lnbmVkIGkg
PSAwOyBpIDwgV1RGX0FSUkFZX0xFTkdUSChtX25vZGVMaXN0Q291bnRzKTsgaSsrKQotICAgICAg
ICBtX25vZGVMaXN0Q291bnRzW2ldID0gMDsKLQotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBXVEZfQVJSQVlfTEVOR1RIKG1fY29sbGVjdGlvbnMpOyBpKyspCi0gICAgICAgIG1fY29sbGVj
dGlvbnNbaV0gPSAwOwotCi0gICAgSW5zcGVjdG9yQ291bnRlcnM6OmluY3JlbWVudENvdW50ZXIo
SW5zcGVjdG9yQ291bnRlcnM6OkRvY3VtZW50Q291bnRlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIGhp
c3RvZ3JhbU11dGF0aW9uRXZlbnRVc2FnZShjb25zdCB1bnNpZ25lZCBzaG9ydCYgbGlzdGVuZXJU
eXBlcykKLXsKLSAgICBIaXN0b2dyYW1TdXBwb3J0OjpoaXN0b2dyYW1FbnVtZXJhdGlvbigiRE9N
QVBJLlBlckRvY3VtZW50TXV0YXRpb25FdmVudFVzYWdlLkRPTVN1YnRyZWVNb2RpZmllZCIsIHN0
YXRpY19jYXN0PGJvb2w+KGxpc3RlbmVyVHlwZXMgJiBEb2N1bWVudDo6RE9NU1VCVFJFRU1PRElG
SUVEX0xJU1RFTkVSKSwgMik7Ci0gICAgSGlzdG9ncmFtU3VwcG9ydDo6aGlzdG9ncmFtRW51bWVy
YXRpb24oIkRPTUFQSS5QZXJEb2N1bWVudE11dGF0aW9uRXZlbnRVc2FnZS5ET01Ob2RlSW5zZXJ0
ZWQiLCBzdGF0aWNfY2FzdDxib29sPihsaXN0ZW5lclR5cGVzICYgRG9jdW1lbnQ6OkRPTU5PREVJ
TlNFUlRFRF9MSVNURU5FUiksIDIpOwotICAgIEhpc3RvZ3JhbVN1cHBvcnQ6Omhpc3RvZ3JhbUVu
dW1lcmF0aW9uKCJET01BUEkuUGVyRG9jdW1lbnRNdXRhdGlvbkV2ZW50VXNhZ2UuRE9NTm9kZVJl
bW92ZWQiLCBzdGF0aWNfY2FzdDxib29sPihsaXN0ZW5lclR5cGVzICYgRG9jdW1lbnQ6OkRPTU5P
REVSRU1PVkVEX0xJU1RFTkVSKSwgMik7Ci0gICAgSGlzdG9ncmFtU3VwcG9ydDo6aGlzdG9ncmFt
RW51bWVyYXRpb24oIkRPTUFQSS5QZXJEb2N1bWVudE11dGF0aW9uRXZlbnRVc2FnZS5ET01Ob2Rl
UmVtb3ZlZEZyb21Eb2N1bWVudCIsIHN0YXRpY19jYXN0PGJvb2w+KGxpc3RlbmVyVHlwZXMgJiBE
b2N1bWVudDo6RE9NTk9ERVJFTU9WRURGUk9NRE9DVU1FTlRfTElTVEVORVIpLCAyKTsKLSAgICBI
aXN0b2dyYW1TdXBwb3J0OjpoaXN0b2dyYW1FbnVtZXJhdGlvbigiRE9NQVBJLlBlckRvY3VtZW50
TXV0YXRpb25FdmVudFVzYWdlLkRPTU5vZGVJbnNlcnRlZEludG9Eb2N1bWVudCIsIHN0YXRpY19j
YXN0PGJvb2w+KGxpc3RlbmVyVHlwZXMgJiBEb2N1bWVudDo6RE9NTk9ERUlOU0VSVEVESU5UT0RP
Q1VNRU5UX0xJU1RFTkVSKSwgMik7Ci0gICAgSGlzdG9ncmFtU3VwcG9ydDo6aGlzdG9ncmFtRW51
bWVyYXRpb24oIkRPTUFQSS5QZXJEb2N1bWVudE11dGF0aW9uRXZlbnRVc2FnZS5ET01DaGFyYWN0
ZXJEYXRhTW9kaWZpZWQiLCBzdGF0aWNfY2FzdDxib29sPihsaXN0ZW5lclR5cGVzICYgRG9jdW1l
bnQ6OkRPTUNIQVJBQ1RFUkRBVEFNT0RJRklFRF9MSVNURU5FUiksIDIpOwotfQotCi0jaWYgRU5B
QkxFKEZVTExTQ1JFRU5fQVBJKQotc3RhdGljIGJvb2wgaXNBdHRyaWJ1dGVPbkFsbE93bmVycyhj
b25zdCBXZWJDb3JlOjpRdWFsaWZpZWROYW1lJiBhdHRyaWJ1dGUsIGNvbnN0IEhUTUxGcmFtZU93
bmVyRWxlbWVudCogb3duZXIpCisgICAgLCBtX25lZWRzVXBkYXRlQWN0aXZlU3R5bGVzaGVldHNP
blN0eWxlUmVjYWxjKGZhbHNlKQorICAgICwgbV91c2VzU2libGluZ1J1bGVzKGZhbHNlKQorICAg
ICwgbV91c2VzU2libGluZ1J1bGVzT3ZlcnJpZGUoZmFsc2UpCisgICAgLCBtX3VzZXNGaXJzdExp
bmVSdWxlcyhmYWxzZSkKKyAgICAsIG1fdXNlc0ZpcnN0TGV0dGVyUnVsZXMoZmFsc2UpCisgICAg
LCBtX3VzZXNCZWZvcmVBZnRlclJ1bGVzKGZhbHNlKQorICAgICwgbV91c2VzQmVmb3JlQWZ0ZXJS
dWxlc092ZXJyaWRlKGZhbHNlKQorICAgICwgbV91c2VzUmVtVW5pdHMoZmFsc2UpCiB7Ci0gICAg
aWYgKCFvd25lcikKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZG8gewotICAgICAgICBpZiAo
IW93bmVyLT5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICB9IHdoaWxlICgob3duZXIgPSBvd25lci0+ZG9jdW1lbnQoKS0+b3duZXJFbGVtZW50
KCkpKTsKLSAgICByZXR1cm4gdHJ1ZTsKIH0KLSNlbmRpZgogCi1Eb2N1bWVudDo6fkRvY3VtZW50
KCkKK0RvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246On5Eb2N1bWVudFN0eWxlU2hlZXRDb2xs
ZWN0aW9uKCkKIHsKLSAgICBBU1NFUlQoIXJlbmRlcmVyKCkpOwotICAgIEFTU0VSVCghbV9pblBh
Z2VDYWNoZSk7Ci0gICAgQVNTRVJUKCFtX3NhdmVkUmVuZGVyZXIpOwotICAgIEFTU0VSVChtX3Jh
bmdlcy5pc0VtcHR5KCkpOwotICAgIEFTU0VSVCghbV9zdHlsZVJlY2FsY1RpbWVyLmlzQWN0aXZl
KCkpOwotICAgIEFTU0VSVCghbV9wYXJlbnRUcmVlU2NvcGUpOwotICAgIEFTU0VSVCghbV9ndWFy
ZFJlZkNvdW50KTsKLQotICAgIC8vIEZJWE1FOiBTaG91bGQgd2UgcmVzZXQgbV9kb21XaW5kb3cg
d2hlbiB3ZSBkZXRhY2ggZnJvbSB0aGUgRnJhbWU/Ci0gICAgaWYgKG1fZG9tV2luZG93KQotICAg
ICAgICBtX2RvbVdpbmRvdy0+cmVzZXRVbmxlc3NTdXNwZW5kZWRGb3JQYWdlQ2FjaGUoKTsKLQot
ICAgIG1fc2NyaXB0UnVubmVyLmNsZWFyKCk7Ci0KLSAgICBoaXN0b2dyYW1NdXRhdGlvbkV2ZW50
VXNhZ2UobV9saXN0ZW5lclR5cGVzKTsKLQotICAgIHJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzKCk7
CisgICAgbV9hdXRob3JTdHlsZVNoZWV0cy0+ZG9jdW1lbnREZXN0cm95ZWQoKTsKIAotICAgIC8v
IEN1cnJlbnRseSB3ZSBiZWxpZXZlIHRoYXQgRG9jdW1lbnQgY2FuIG5ldmVyIG91dGxpdmUgdGhl
IHBhcnNlci4KLSAgICAvLyBBbHRob3VnaCB0aGUgRG9jdW1lbnQgbWF5IGJlIHJlcGxhY2VkIHN5
bmNocm9ub3VzbHksIERvY3VtZW50UGFyc2VycwotICAgIC8vIGdlbmVyYWxseSBrZWVwIGF0IGxl
YXN0IG9uZSByZWZlcmVuY2UgdG8gYW4gRWxlbWVudCB3aGljaCB3b3VsZCBpbiB0dXJuCi0gICAg
Ly8gaGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBEb2N1bWVudC4gIElmIHlvdSBoaXQgdGhpcyBBU1NF
UlQsIHRoZW4gdGhhdAotICAgIC8vIGFzc3VtcHRpb24gaXMgd3JvbmcuICBEb2N1bWVudFBhcnNl
cjo6ZGV0YWNoKCkgc2hvdWxkIGVuc3VyZSB0aGF0IGV2ZW4KLSAgICAvLyBpZiB0aGUgRG9jdW1l
bnRQYXJzZXIgb3V0bGl2ZXMgdGhlIERvY3VtZW50IGl0IHdvbid0IGNhdXNlIGJhZG5lc3MuCi0g
ICAgQVNTRVJUKCFtX3BhcnNlciB8fCBtX3BhcnNlci0+cmVmQ291bnQoKSA9PSAxKTsKLSAgICBk
ZXRhY2hQYXJzZXIoKTsKLQotICAgIG1fcmVuZGVyQXJlbmEuY2xlYXIoKTsKLQotICAgIGNsZWFy
QVhPYmplY3RDYWNoZSgpOwotCi0gICAgbV9kZWNvZGVyID0gMDsKLQotICAgIGlmIChtX3N0eWxl
U2hlZXRzKQotICAgICAgICBtX3N0eWxlU2hlZXRzLT5kb2N1bWVudERlc3Ryb3llZCgpOwotCi0g
ICAgaWYgKG1fbmFtZWRGbG93cykKLSAgICAgICAgbV9uYW1lZEZsb3dzLT5kb2N1bWVudERlc3Ry
b3llZCgpOwotCi0gICAgaWYgKG1fZWxlbVNoZWV0KQotICAgICAgICBtX2VsZW1TaGVldC0+Y2xl
YXJPd25lck5vZGUoKTsKICAgICBpZiAobV9wYWdlVXNlclNoZWV0KQogICAgICAgICBtX3BhZ2VV
c2VyU2hlZXQtPmNsZWFyT3duZXJOb2RlKCk7CiAgICAgaWYgKG1fcGFnZUdyb3VwVXNlclNoZWV0
cykgewpAQCAtNjYwLDU3MzggKzgyLDQwNiBAQCBEb2N1bWVudDo6fkRvY3VtZW50KCkKICAgICAg
ICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX3VzZXJTaGVldHMtPnNpemUoKTsgKytpKQogICAg
ICAgICAgICAgKCptX3VzZXJTaGVldHMpW2ldLT5jbGVhck93bmVyTm9kZSgpOwogICAgIH0KLQot
ICAgIGRlbGV0ZUN1c3RvbUZvbnRzKCk7Ci0KLSAgICBtX3dlYWtSZWZlcmVuY2UtPmNsZWFyKCk7
Ci0KLSAgICBpZiAobV9tZWRpYVF1ZXJ5TWF0Y2hlcikKLSAgICAgICAgbV9tZWRpYVF1ZXJ5TWF0
Y2hlci0+ZG9jdW1lbnREZXN0cm95ZWQoKTsKLQotICAgIGNsZWFyU3R5bGVSZXNvbHZlcigpOyAv
LyBXZSBuZWVkIHRvIGRlc3RvcnkgQ1NTRm9udFNlbGVjdG9yIGJlZm9yZSBkZXN0cm95aW5nIG1f
Y2FjaGVkUmVzb3VyY2VMb2FkZXIuCi0gICAgbV9jYWNoZWRSZXNvdXJjZUxvYWRlci5jbGVhcigp
OwotCi0gICAgLy8gV2UgbXVzdCBjYWxsIGNsZWFyUmFyZURhdGEoKSBoZXJlIHNpbmNlIGEgRG9j
dW1lbnQgY2xhc3MgaW5oZXJpdHMgVHJlZVNjb3BlCi0gICAgLy8gYXMgd2VsbCBhcyBOb2RlLiBT
ZWUgYSBjb21tZW50IG9uIFRyZWVTY29wZS5oIGZvciB0aGUgcmVhc29uLgotICAgIGlmIChoYXNS
YXJlRGF0YSgpKQotICAgICAgICBjbGVhclJhcmVEYXRhKCk7Ci0KLSAgICBBU1NFUlQoIW1fbGlz
dHNJbnZhbGlkYXRlZEF0RG9jdW1lbnQuc2l6ZSgpKTsKLQotICAgIGZvciAodW5zaWduZWQgaSA9
IDA7IGkgPCBXVEZfQVJSQVlfTEVOR1RIKG1fbm9kZUxpc3RDb3VudHMpOyBpKyspCi0gICAgICAg
IEFTU0VSVCghbV9ub2RlTGlzdENvdW50c1tpXSk7Ci0KLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAw
OyBpIDwgV1RGX0FSUkFZX0xFTkdUSChtX2NvbGxlY3Rpb25zKTsgaSsrKQotICAgICAgICBBU1NF
UlQoIW1fY29sbGVjdGlvbnNbaV0pOwotCi0gICAgbV9kb2N1bWVudCA9IDA7Ci0KLSAgICBJbnNw
ZWN0b3JDb3VudGVyczo6ZGVjcmVtZW50Q291bnRlcihJbnNwZWN0b3JDb3VudGVyczo6RG9jdW1l
bnRDb3VudGVyKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6cmVtb3ZlZExhc3RSZWYoKQotewotICAg
IEFTU0VSVCghbV9kZWxldGlvbkhhc0JlZ3VuKTsKLSAgICBpZiAobV9ndWFyZFJlZkNvdW50KSB7
Ci0gICAgICAgIC8vIElmIHJlbW92aW5nIGEgY2hpbGQgcmVtb3ZlcyB0aGUgbGFzdCBzZWxmLW9u
bHkgcmVmLCB3ZSBkb24ndAotICAgICAgICAvLyB3YW50IHRoZSBzY29wZSB0byBiZSBkZXN0cnVj
dGVkIHVudGlsIGFmdGVyCi0gICAgICAgIC8vIHJlbW92ZUFsbENoaWxkcmVuIHJldHVybnMsIHNv
IHdlIGd1YXJkIG91cnNlbHZlcyB3aXRoIGFuCi0gICAgICAgIC8vIGV4dHJhIHNlbGYtb25seSBy
ZWYuCi0gICAgICAgIGd1YXJkUmVmKCk7Ci0KLSAgICAgICAgLy8gV2UgbXVzdCBtYWtlIHN1cmUg
bm90IHRvIGJlIHJldGFpbmluZyBhbnkgb2Ygb3VyIGNoaWxkcmVuIHRocm91Z2gKLSAgICAgICAg
Ly8gdGhlc2UgZXh0cmEgcG9pbnRlcnMgb3Igd2Ugd2lsbCBjcmVhdGUgYSByZWZlcmVuY2UgY3lj
bGUuCi0gICAgICAgIG1fZG9jVHlwZSA9IDA7Ci0gICAgICAgIG1fZm9jdXNlZE5vZGUgPSAwOwot
ICAgICAgICBtX2hvdmVyTm9kZSA9IDA7Ci0gICAgICAgIG1fYWN0aXZlTm9kZSA9IDA7Ci0gICAg
ICAgIG1fdGl0bGVFbGVtZW50ID0gMDsKLSAgICAgICAgbV9kb2N1bWVudEVsZW1lbnQgPSAwOwot
ICAgICAgICBtX2NvbnRleHRGZWF0dXJlcyA9IENvbnRleHRGZWF0dXJlczo6ZGVmYXVsdFN3aXRj
aCgpOwotI2lmIEVOQUJMRShGVUxMU0NSRUVOX0FQSSkKLSAgICAgICAgbV9mdWxsU2NyZWVuRWxl
bWVudCA9IDA7Ci0gICAgICAgIG1fZnVsbFNjcmVlbkVsZW1lbnRTdGFjay5jbGVhcigpOwotI2Vu
ZGlmCi0KLSAgICAgICAgZGV0YWNoUGFyc2VyKCk7Ci0KLSAgICAgICAgLy8gcmVtb3ZlQWxsQ2hp
bGRyZW4oKSBkb2Vzbid0IGFsd2F5cyB1bnJlZ2lzdGVyIElEcywKLSAgICAgICAgLy8gc28gdGVh
ciBkb3duIHNjb3BlIGluZm9ybWF0aW9uIHVwZnJvbnQgdG8gYXZvaWQgaGF2aW5nIHN0YWxlIHJl
ZmVyZW5jZXMgaW4gdGhlIG1hcC4KLSAgICAgICAgZGVzdHJveVRyZWVTY29wZURhdGEoKTsKLSAg
ICAgICAgcmVtb3ZlQWxsQ2hpbGRyZW4oKTsKLQotICAgICAgICBtX21hcmtlcnMtPmRldGFjaCgp
OwotCi0gICAgICAgIG1fY3NzQ2FudmFzRWxlbWVudHMuY2xlYXIoKTsKLQotI2lmIEVOQUJMRShS
RVFVRVNUX0FOSU1BVElPTl9GUkFNRSkKLSAgICAgICAgLy8gRklYTUU6IGNvbnNpZGVyIHVzaW5n
IEFjdGl2ZURPTU9iamVjdC4KLSAgICAgICAgaWYgKG1fc2NyaXB0ZWRBbmltYXRpb25Db250cm9s
bGVyKQotICAgICAgICAgICAgbV9zY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXItPmNsZWFyRG9j
dW1lbnRQb2ludGVyKCk7Ci0gICAgICAgIG1fc2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyLmNs
ZWFyKCk7Ci0jZW5kaWYKLQotI2lmbmRlZiBOREVCVUcKLSAgICAgICAgbV9pblJlbW92ZWRMYXN0
UmVmRnVuY3Rpb24gPSBmYWxzZTsKLSNlbmRpZgotCi0gICAgICAgIGd1YXJkRGVyZWYoKTsKLSAg
ICB9IGVsc2UgewotI2lmbmRlZiBOREVCVUcgCi0gICAgICAgIG1fZGVsZXRpb25IYXNCZWd1biA9
IHRydWU7IAotI2VuZGlmIAotICAgICAgICBkZWxldGUgdGhpczsKLSAgICB9Ci19Ci0KLUVsZW1l
bnQqIERvY3VtZW50OjpnZXRFbGVtZW50QnlJZChjb25zdCBBdG9taWNTdHJpbmcmIGlkKSBjb25z
dAotewotICAgIHJldHVybiBUcmVlU2NvcGU6OmdldEVsZW1lbnRCeUlkKGlkKTsKIH0KIAotRWxl
bWVudCogRG9jdW1lbnQ6OmdldEVsZW1lbnRCeUFjY2Vzc0tleShjb25zdCBTdHJpbmcmIGtleSkK
K0NTU1N0eWxlU2hlZXQqIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OnBhZ2VVc2VyU2hl
ZXQoKQogewotICAgIGlmIChrZXkuaXNFbXB0eSgpKQorICAgIGlmIChtX3BhZ2VVc2VyU2hlZXQp
CisgICAgICAgIHJldHVybiBtX3BhZ2VVc2VyU2hlZXQuZ2V0KCk7CisgICAgCisgICAgUGFnZSog
b3duaW5nUGFnZSA9IG1fZG9jdW1lbnQtPnBhZ2UoKTsKKyAgICBpZiAoIW93bmluZ1BhZ2UpCiAg
ICAgICAgIHJldHVybiAwOwotICAgIGlmICghbV9hY2Nlc3NLZXlNYXBWYWxpZCkgewotICAgICAg
ICBidWlsZEFjY2Vzc0tleU1hcCh0aGlzKTsKLSAgICAgICAgbV9hY2Nlc3NLZXlNYXBWYWxpZCA9
IHRydWU7Ci0gICAgfQotICAgIHJldHVybiBtX2VsZW1lbnRzQnlBY2Nlc3NLZXkuZ2V0KGtleS5p
bXBsKCkpOworICAgIAorICAgIFN0cmluZyB1c2VyU2hlZXRUZXh0ID0gb3duaW5nUGFnZS0+dXNl
clN0eWxlU2hlZXQoKTsKKyAgICBpZiAodXNlclNoZWV0VGV4dC5pc0VtcHR5KCkpCisgICAgICAg
IHJldHVybiAwOworICAgIAorICAgIC8vIFBhcnNlIHRoZSBzaGVldCBhbmQgY2FjaGUgaXQuCisg
ICAgbV9wYWdlVXNlclNoZWV0ID0gQ1NTU3R5bGVTaGVldDo6Y3JlYXRlSW5saW5lKG1fZG9jdW1l
bnQsIG1fZG9jdW1lbnQtPnNldHRpbmdzKCktPnVzZXJTdHlsZVNoZWV0TG9jYXRpb24oKSk7Cisg
ICAgbV9wYWdlVXNlclNoZWV0LT5jb250ZW50cygpLT5zZXRJc1VzZXJTdHlsZVNoZWV0KHRydWUp
OworICAgIG1fcGFnZVVzZXJTaGVldC0+Y29udGVudHMoKS0+cGFyc2VTdHJpbmcodXNlclNoZWV0
VGV4dCk7CisgICAgcmV0dXJuIG1fcGFnZVVzZXJTaGVldC5nZXQoKTsKIH0KIAotdm9pZCBEb2N1
bWVudDo6YnVpbGRBY2Nlc3NLZXlNYXAoVHJlZVNjb3BlKiBzY29wZSkKK3ZvaWQgRG9jdW1lbnRT
dHlsZVNoZWV0Q29sbGVjdGlvbjo6Y2xlYXJQYWdlVXNlclNoZWV0KCkKIHsKLSAgICBBU1NFUlQo
c2NvcGUpOwotICAgIE5vZGUqIHJvb3ROb2RlID0gc2NvcGUtPnJvb3ROb2RlKCk7Ci0gICAgZm9y
IChOb2RlKiBub2RlID0gcm9vdE5vZGU7IG5vZGU7IG5vZGUgPSBub2RlLT50cmF2ZXJzZU5leHRO
b2RlKHJvb3ROb2RlKSkgewotICAgICAgICBpZiAoIW5vZGUtPmlzRWxlbWVudE5vZGUoKSkKLSAg
ICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBFbGVtZW50KiBlbGVtZW50ID0gc3RhdGljX2Nh
c3Q8RWxlbWVudCo+KG5vZGUpOwotICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcmIGFjY2Vzc0tl
eSA9IGVsZW1lbnQtPmdldEF0dHJpYnV0ZShhY2Nlc3NrZXlBdHRyKTsKLSAgICAgICAgaWYgKCFh
Y2Nlc3NLZXkuaXNFbXB0eSgpKQotICAgICAgICAgICAgbV9lbGVtZW50c0J5QWNjZXNzS2V5LnNl
dChhY2Nlc3NLZXkuaW1wbCgpLCBlbGVtZW50KTsKLQotICAgICAgICBmb3IgKFNoYWRvd1Jvb3Qq
IHJvb3QgPSBub2RlLT55b3VuZ2VzdFNoYWRvd1Jvb3QoKTsgcm9vdDsgcm9vdCA9IHJvb3QtPm9s
ZGVyU2hhZG93Um9vdCgpKQotICAgICAgICAgICAgYnVpbGRBY2Nlc3NLZXlNYXAocm9vdCk7Cisg
ICAgaWYgKG1fcGFnZVVzZXJTaGVldCkgeworICAgICAgICBtX3BhZ2VVc2VyU2hlZXQgPSAwOwor
ICAgICAgICBtX2RvY3VtZW50LT5zdHlsZVJlc29sdmVyQ2hhbmdlZChEZWZlclJlY2FsY1N0eWxl
KTsKICAgICB9CiB9CiAKLXZvaWQgRG9jdW1lbnQ6OmludmFsaWRhdGVBY2Nlc3NLZXlNYXAoKQor
dm9pZCBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjp1cGRhdGVQYWdlVXNlclNoZWV0KCkK
IHsKLSAgICBtX2FjY2Vzc0tleU1hcFZhbGlkID0gZmFsc2U7Ci0gICAgbV9lbGVtZW50c0J5QWNj
ZXNzS2V5LmNsZWFyKCk7Ci19Ci0KLVNlbGVjdG9yUXVlcnlDYWNoZSogRG9jdW1lbnQ6OnNlbGVj
dG9yUXVlcnlDYWNoZSgpCi17Ci0gICAgaWYgKCFtX3NlbGVjdG9yUXVlcnlDYWNoZSkKLSAgICAg
ICAgbV9zZWxlY3RvclF1ZXJ5Q2FjaGUgPSBhZG9wdFB0cihuZXcgU2VsZWN0b3JRdWVyeUNhY2hl
KCkpOwotICAgIHJldHVybiBtX3NlbGVjdG9yUXVlcnlDYWNoZS5nZXQoKTsKKyAgICBjbGVhclBh
Z2VVc2VyU2hlZXQoKTsKKyAgICBpZiAocGFnZVVzZXJTaGVldCgpKQorICAgICAgICBtX2RvY3Vt
ZW50LT5zdHlsZVJlc29sdmVyQ2hhbmdlZChSZWNhbGNTdHlsZUltbWVkaWF0ZWx5KTsKIH0KIAot
TWVkaWFRdWVyeU1hdGNoZXIqIERvY3VtZW50OjptZWRpYVF1ZXJ5TWF0Y2hlcigpCitjb25zdCBW
ZWN0b3I8UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4qIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rp
b246OnBhZ2VHcm91cFVzZXJTaGVldHMoKSBjb25zdAogewotICAgIGlmICghbV9tZWRpYVF1ZXJ5
TWF0Y2hlcikKLSAgICAgICAgbV9tZWRpYVF1ZXJ5TWF0Y2hlciA9IE1lZGlhUXVlcnlNYXRjaGVy
OjpjcmVhdGUodGhpcyk7Ci0gICAgcmV0dXJuIG1fbWVkaWFRdWVyeU1hdGNoZXIuZ2V0KCk7Ci19
CisgICAgaWYgKG1fcGFnZUdyb3VwVXNlclNoZWV0Q2FjaGVWYWxpZCkKKyAgICAgICAgcmV0dXJu
IG1fcGFnZUdyb3VwVXNlclNoZWV0cy5nZXQoKTsKKyAgICAKKyAgICBtX3BhZ2VHcm91cFVzZXJT
aGVldENhY2hlVmFsaWQgPSB0cnVlOworICAgIAorICAgIFBhZ2UqIG93bmluZ1BhZ2UgPSBtX2Rv
Y3VtZW50LT5wYWdlKCk7CisgICAgaWYgKCFvd25pbmdQYWdlKQorICAgICAgICByZXR1cm4gMDsK
KyAgICAgICAgCisgICAgY29uc3QgUGFnZUdyb3VwJiBwYWdlR3JvdXAgPSBvd25pbmdQYWdlLT5n
cm91cCgpOworICAgIGNvbnN0IFVzZXJTdHlsZVNoZWV0TWFwKiBzaGVldHNNYXAgPSBwYWdlR3Jv
dXAudXNlclN0eWxlU2hlZXRzKCk7CisgICAgaWYgKCFzaGVldHNNYXApCisgICAgICAgIHJldHVy
biAwOwogCi12b2lkIERvY3VtZW50OjpzZXRDb21wYXRpYmlsaXR5TW9kZShDb21wYXRpYmlsaXR5
TW9kZSBtb2RlKQotewotICAgIGlmIChtX2NvbXBhdGliaWxpdHlNb2RlTG9ja2VkIHx8IG1vZGUg
PT0gbV9jb21wYXRpYmlsaXR5TW9kZSkKLSAgICAgICAgcmV0dXJuOwotICAgIEFTU0VSVCghbV9z
dHlsZVNoZWV0cy0+bGVuZ3RoKCkpOwotICAgIGJvb2wgd2FzSW5RdWlya3NNb2RlID0gaW5RdWly
a3NNb2RlKCk7Ci0gICAgbV9jb21wYXRpYmlsaXR5TW9kZSA9IG1vZGU7Ci0gICAgc2VsZWN0b3JR
dWVyeUNhY2hlKCktPmludmFsaWRhdGUoKTsKLSAgICBpZiAoaW5RdWlya3NNb2RlKCkgIT0gd2Fz
SW5RdWlya3NNb2RlKSB7Ci0gICAgICAgIC8vIEFsbCB1c2VyIHN0eWxlc2hlZXRzIGhhdmUgdG8g
cmVwYXJzZSB1c2luZyB0aGUgZGlmZmVyZW50IG1vZGUuCi0gICAgICAgIGNsZWFyUGFnZVVzZXJT
aGVldCgpOwotICAgICAgICBjbGVhclBhZ2VHcm91cFVzZXJTaGVldHMoKTsKKyAgICBVc2VyU3R5
bGVTaGVldE1hcDo6Y29uc3RfaXRlcmF0b3IgZW5kID0gc2hlZXRzTWFwLT5lbmQoKTsKKyAgICBm
b3IgKFVzZXJTdHlsZVNoZWV0TWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IHNoZWV0c01hcC0+YmVn
aW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgIGNvbnN0IFVzZXJTdHlsZVNoZWV0VmVj
dG9yKiBzaGVldHMgPSBpdC0+c2Vjb25kLmdldCgpOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkg
PSAwOyBpIDwgc2hlZXRzLT5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgY29uc3QgVXNlclN0
eWxlU2hlZXQqIHNoZWV0ID0gc2hlZXRzLT5hdChpKS5nZXQoKTsKKyAgICAgICAgICAgIGlmIChz
aGVldC0+aW5qZWN0ZWRGcmFtZXMoKSA9PSBJbmplY3RJblRvcEZyYW1lT25seSAmJiBtX2RvY3Vt
ZW50LT5vd25lckVsZW1lbnQoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
ICAgIGlmICghVXNlckNvbnRlbnRVUkxQYXR0ZXJuOjptYXRjaGVzUGF0dGVybnMobV9kb2N1bWVu
dC0+dXJsKCksIHNoZWV0LT53aGl0ZWxpc3QoKSwgc2hlZXQtPmJsYWNrbGlzdCgpKSkKKyAgICAg
ICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIFJlZlB0cjxDU1NTdHlsZVNoZWV0PiBn
cm91cFNoZWV0ID0gQ1NTU3R5bGVTaGVldDo6Y3JlYXRlSW5saW5lKGNvbnN0X2Nhc3Q8RG9jdW1l
bnQqPihtX2RvY3VtZW50KSwgc2hlZXQtPnVybCgpKTsKKyAgICAgICAgICAgIGlmICghbV9wYWdl
R3JvdXBVc2VyU2hlZXRzKQorICAgICAgICAgICAgICAgIG1fcGFnZUdyb3VwVXNlclNoZWV0cyA9
IGFkb3B0UHRyKG5ldyBWZWN0b3I8UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4pOworICAgICAgICAg
ICAgbV9wYWdlR3JvdXBVc2VyU2hlZXRzLT5hcHBlbmQoZ3JvdXBTaGVldCk7CisgICAgICAgICAg
ICBncm91cFNoZWV0LT5jb250ZW50cygpLT5zZXRJc1VzZXJTdHlsZVNoZWV0KHNoZWV0LT5sZXZl
bCgpID09IFVzZXJTdHlsZVVzZXJMZXZlbCk7CisgICAgICAgICAgICBncm91cFNoZWV0LT5jb250
ZW50cygpLT5wYXJzZVN0cmluZyhzaGVldC0+c291cmNlKCkpOworICAgICAgICB9CiAgICAgfQot
fQotCi1TdHJpbmcgRG9jdW1lbnQ6OmNvbXBhdE1vZGUoKSBjb25zdAotewotICAgIHJldHVybiBp
blF1aXJrc01vZGUoKSA/ICJCYWNrQ29tcGF0IiA6ICJDU1MxQ29tcGF0IjsKLX0KIAotdm9pZCBE
b2N1bWVudDo6cmVzZXRMaW5rQ29sb3IoKQotewotICAgIG1fbGlua0NvbG9yID0gQ29sb3IoMCwg
MCwgMjM4KTsKKyAgICByZXR1cm4gbV9wYWdlR3JvdXBVc2VyU2hlZXRzLmdldCgpOwogfQogCi12
b2lkIERvY3VtZW50OjpyZXNldFZpc2l0ZWRMaW5rQ29sb3IoKQordm9pZCBEb2N1bWVudFN0eWxl
U2hlZXRDb2xsZWN0aW9uOjpjbGVhclBhZ2VHcm91cFVzZXJTaGVldHMoKQogewotICAgIG1fdmlz
aXRlZExpbmtDb2xvciA9IENvbG9yKDg1LCAyNiwgMTM5KTsgICAgCisgICAgbV9wYWdlR3JvdXBV
c2VyU2hlZXRDYWNoZVZhbGlkID0gZmFsc2U7CisgICAgaWYgKG1fcGFnZUdyb3VwVXNlclNoZWV0
cyAmJiBtX3BhZ2VHcm91cFVzZXJTaGVldHMtPnNpemUoKSkgeworICAgICAgICBtX3BhZ2VHcm91
cFVzZXJTaGVldHMtPmNsZWFyKCk7CisgICAgICAgIG1fZG9jdW1lbnQtPnN0eWxlUmVzb2x2ZXJD
aGFuZ2VkKERlZmVyUmVjYWxjU3R5bGUpOworICAgIH0KIH0KIAotdm9pZCBEb2N1bWVudDo6cmVz
ZXRBY3RpdmVMaW5rQ29sb3IoKQordm9pZCBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjp1
cGRhdGVQYWdlR3JvdXBVc2VyU2hlZXRzKCkKIHsKLSAgICBtX2FjdGl2ZUxpbmtDb2xvci5zZXRO
YW1lZENvbG9yKCJyZWQiKTsKKyAgICBjbGVhclBhZ2VHcm91cFVzZXJTaGVldHMoKTsKKyAgICBp
ZiAocGFnZUdyb3VwVXNlclNoZWV0cygpICYmIHBhZ2VHcm91cFVzZXJTaGVldHMoKS0+c2l6ZSgp
KQorICAgICAgICBtX2RvY3VtZW50LT5zdHlsZVJlc29sdmVyQ2hhbmdlZChSZWNhbGNTdHlsZUlt
bWVkaWF0ZWx5KTsKIH0KIAotdm9pZCBEb2N1bWVudDo6c2V0RG9jVHlwZShQYXNzUmVmUHRyPERv
Y3VtZW50VHlwZT4gZG9jVHlwZSkKK3ZvaWQgRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6
YWRkVXNlclNoZWV0KFBhc3NSZWZQdHI8U3R5bGVTaGVldENvbnRlbnRzPiB1c2VyU2hlZXQpCiB7
Ci0gICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLgotICAg
IEFTU0VSVCghbV9kb2NUeXBlIHx8ICFkb2NUeXBlKTsKLSAgICBtX2RvY1R5cGUgPSBkb2NUeXBl
OwotICAgIGlmIChtX2RvY1R5cGUpIHsKLSAgICAgICAgdGhpcy0+YWRvcHRJZk5lZWRlZChtX2Rv
Y1R5cGUuZ2V0KCkpOwotI2lmIEVOQUJMRShMRUdBQ1lfVklFV1BPUlRfQURBUFRJT04pCi0gICAg
ICAgIGlmIChtX2RvY1R5cGUtPnB1YmxpY0lkKCkuc3RhcnRzV2l0aCgiLS8vd2FwZm9ydW0vL2R0
ZCB4aHRtbCBtb2JpbGUgMS4iLCAvKiBjYXNlU2Vuc2l0aXZlICovIGZhbHNlKSkKLSAgICAgICAg
ICAgIHByb2Nlc3NWaWV3cG9ydCgid2lkdGg9ZGV2aWNlLXdpZHRoLCBoZWlnaHQ9ZGV2aWNlLWhl
aWdodCIsIFZpZXdwb3J0QXJndW1lbnRzOjpYSFRNTE1vYmlsZVByb2ZpbGUpOwotI2VuZGlmCi0g
ICAgfQotICAgIC8vIERvY3R5cGUgYWZmZWN0cyB0aGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlIHN0
eWxlc2hlZXRzLgotICAgIGNsZWFyU3R5bGVSZXNvbHZlcigpOworICAgIGlmICghbV91c2VyU2hl
ZXRzKQorICAgICAgICBtX3VzZXJTaGVldHMgPSBhZG9wdFB0cihuZXcgVmVjdG9yPFJlZlB0cjxD
U1NTdHlsZVNoZWV0PiA+KTsKKyAgICBtX3VzZXJTaGVldHMtPmFwcGVuZChDU1NTdHlsZVNoZWV0
OjpjcmVhdGUodXNlclNoZWV0LCBtX2RvY3VtZW50KSk7CisgICAgbV9kb2N1bWVudC0+c3R5bGVS
ZXNvbHZlckNoYW5nZWQoUmVjYWxjU3R5bGVJbW1lZGlhdGVseSk7CiB9CiAKLURPTUltcGxlbWVu
dGF0aW9uKiBEb2N1bWVudDo6aW1wbGVtZW50YXRpb24oKQorLy8gVGhpcyBtZXRob2QgaXMgY2Fs
bGVkIHdoZW5ldmVyIGEgdG9wLWxldmVsIHN0eWxlc2hlZXQgaGFzIGZpbmlzaGVkIGxvYWRpbmcu
Cit2b2lkIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OnJlbW92ZVBlbmRpbmdTaGVldChS
ZW1vdmVQZW5kaW5nU2hlZXROb3RpZmljYXRpb25UeXBlIG5vdGlmaWNhdGlvbikKIHsKLSAgICBp
ZiAoIW1faW1wbGVtZW50YXRpb24pCi0gICAgICAgIG1faW1wbGVtZW50YXRpb24gPSBET01JbXBs
ZW1lbnRhdGlvbjo6Y3JlYXRlKHRoaXMpOwotICAgIHJldHVybiBtX2ltcGxlbWVudGF0aW9uLmdl
dCgpOwotfQorICAgIC8vIE1ha2Ugc3VyZSB3ZSBrbmV3IHRoaXMgc2hlZXQgd2FzIHBlbmRpbmcs
IGFuZCB0aGF0IG91ciBjb3VudCBpc24ndCBvdXQgb2Ygc3luYy4KKyAgICBBU1NFUlQobV9wZW5k
aW5nU3R5bGVzaGVldHMgPiAwKTsKIAotdm9pZCBEb2N1bWVudDo6Y2hpbGRyZW5DaGFuZ2VkKGJv
b2wgY2hhbmdlZEJ5UGFyc2VyLCBOb2RlKiBiZWZvcmVDaGFuZ2UsIE5vZGUqIGFmdGVyQ2hhbmdl
LCBpbnQgY2hpbGRDb3VudERlbHRhKQotewotICAgIENvbnRhaW5lck5vZGU6OmNoaWxkcmVuQ2hh
bmdlZChjaGFuZ2VkQnlQYXJzZXIsIGJlZm9yZUNoYW5nZSwgYWZ0ZXJDaGFuZ2UsIGNoaWxkQ291
bnREZWx0YSk7CisgICAgbV9wZW5kaW5nU3R5bGVzaGVldHMtLTsKICAgICAKLSAgICBFbGVtZW50
KiBuZXdEb2N1bWVudEVsZW1lbnQgPSBmaXJzdEVsZW1lbnRDaGlsZCh0aGlzKTsKLSAgICBpZiAo
bmV3RG9jdW1lbnRFbGVtZW50ID09IG1fZG9jdW1lbnRFbGVtZW50KQorI2lmZGVmIElOU1RSVU1F
TlRfTEFZT1VUX1NDSEVEVUxJTkcKKyAgICBpZiAoIW93bmVyRWxlbWVudCgpKQorICAgICAgICBw
cmludGYoIlN0eWxlc2hlZXQgbG9hZGVkIGF0IHRpbWUgJWQuICVkIHN0eWxlc2hlZXRzIHN0aWxs
IHJlbWFpbi5cbiIsIGVsYXBzZWRUaW1lKCksIG1fcGVuZGluZ1N0eWxlc2hlZXRzKTsKKyNlbmRp
ZgorCisgICAgaWYgKG1fcGVuZGluZ1N0eWxlc2hlZXRzKQogICAgICAgICByZXR1cm47Ci0gICAg
bV9kb2N1bWVudEVsZW1lbnQgPSBuZXdEb2N1bWVudEVsZW1lbnQ7Ci0gICAgLy8gVGhlIHJvb3Qg
c3R5bGUgdXNlZCBmb3IgbWVkaWEgcXVlcnkgbWF0Y2hpbmcgZGVwZW5kcyBvbiB0aGUgZG9jdW1l
bnQgZWxlbWVudC4KLSAgICBjbGVhclN0eWxlUmVzb2x2ZXIoKTsKLX0KIAotUGFzc1JlZlB0cjxF
bGVtZW50PiBEb2N1bWVudDo6Y3JlYXRlRWxlbWVudChjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUs
IEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIGlmICghaXNWYWxpZE5hbWUobmFtZSkpIHsKLSAg
ICAgICAgZWMgPSBJTlZBTElEX0NIQVJBQ1RFUl9FUlI7Ci0gICAgICAgIHJldHVybiAwOworICAg
IGlmIChub3RpZmljYXRpb24gPT0gUmVtb3ZlUGVuZGluZ1NoZWV0Tm90aWZ5TGF0ZXIpIHsKKyAg
ICAgICAgbV9kb2N1bWVudC0+c2V0TmVlZHNOb3RpZnlSZW1vdmVBbGxQZW5kaW5nU3R5bGVzaGVl
dCgpOworICAgICAgICByZXR1cm47CiAgICAgfQotCi0gICAgaWYgKG1faXNYSFRNTCkKLSAgICAg
ICAgcmV0dXJuIEhUTUxFbGVtZW50RmFjdG9yeTo6Y3JlYXRlSFRNTEVsZW1lbnQoUXVhbGlmaWVk
TmFtZShudWxsQXRvbSwgbmFtZSwgeGh0bWxOYW1lc3BhY2VVUkkpLCB0aGlzLCAwLCBmYWxzZSk7
Ci0KLSAgICByZXR1cm4gY3JlYXRlRWxlbWVudChRdWFsaWZpZWROYW1lKG51bGxBdG9tLCBuYW1l
LCBudWxsQXRvbSksIGZhbHNlKTsKLX0KLQotUGFzc1JlZlB0cjxEb2N1bWVudEZyYWdtZW50PiBE
b2N1bWVudDo6Y3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpCi17Ci0gICAgcmV0dXJuIERvY3VtZW50
RnJhZ21lbnQ6OmNyZWF0ZShkb2N1bWVudCgpKTsKKyAgICAKKyAgICBtX2RvY3VtZW50LT5kaWRS
ZW1vdmVBbGxQZW5kaW5nU3R5bGVzaGVldCgpOwogfQogCi1QYXNzUmVmUHRyPFRleHQ+IERvY3Vt
ZW50OjpjcmVhdGVUZXh0Tm9kZShjb25zdCBTdHJpbmcmIGRhdGEpCit2b2lkIERvY3VtZW50U3R5
bGVTaGVldENvbGxlY3Rpb246OmFkZFN0eWxlU2hlZXRDYW5kaWRhdGVOb2RlKE5vZGUqIG5vZGUs
IGJvb2wgY3JlYXRlZEJ5UGFyc2VyKQogewotICAgIHJldHVybiBUZXh0OjpjcmVhdGUodGhpcywg
ZGF0YSk7Ci19Ci0KLVBhc3NSZWZQdHI8Q29tbWVudD4gRG9jdW1lbnQ6OmNyZWF0ZUNvbW1lbnQo
Y29uc3QgU3RyaW5nJiBkYXRhKQotewotICAgIHJldHVybiBDb21tZW50OjpjcmVhdGUodGhpcywg
ZGF0YSk7Ci19Ci0KLVBhc3NSZWZQdHI8Q0RBVEFTZWN0aW9uPiBEb2N1bWVudDo6Y3JlYXRlQ0RB
VEFTZWN0aW9uKGNvbnN0IFN0cmluZyYgZGF0YSwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAg
aWYgKGlzSFRNTERvY3VtZW50KCkpIHsKLSAgICAgICAgZWMgPSBOT1RfU1VQUE9SVEVEX0VSUjsK
LSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBDREFUQVNlY3Rpb246OmNyZWF0
ZSh0aGlzLCBkYXRhKTsKLX0KLQotUGFzc1JlZlB0cjxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24+IERv
Y3VtZW50OjpjcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oY29uc3QgU3RyaW5nJiB0YXJnZXQs
IGNvbnN0IFN0cmluZyYgZGF0YSwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgaWYgKCFpc1Zh
bGlkTmFtZSh0YXJnZXQpKSB7Ci0gICAgICAgIGVjID0gSU5WQUxJRF9DSEFSQUNURVJfRVJSOwot
ICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKGlzSFRNTERvY3VtZW50KCkpIHsKLSAg
ICAgICAgZWMgPSBOT1RfU1VQUE9SVEVEX0VSUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQot
ICAgIHJldHVybiBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb246OmNyZWF0ZSh0aGlzLCB0YXJnZXQsIGRh
dGEpOwotfQotCi1QYXNzUmVmUHRyPEVudGl0eVJlZmVyZW5jZT4gRG9jdW1lbnQ6OmNyZWF0ZUVu
dGl0eVJlZmVyZW5jZShjb25zdCBTdHJpbmcmIG5hbWUsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewot
ICAgIGlmICghaXNWYWxpZE5hbWUobmFtZSkpIHsKLSAgICAgICAgZWMgPSBJTlZBTElEX0NIQVJB
Q1RFUl9FUlI7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAoaXNIVE1MRG9jdW1l
bnQoKSkgewotICAgICAgICBlYyA9IE5PVF9TVVBQT1JURURfRVJSOwotICAgICAgICByZXR1cm4g
MDsKLSAgICB9Ci0gICAgcmV0dXJuIEVudGl0eVJlZmVyZW5jZTo6Y3JlYXRlKHRoaXMsIG5hbWUp
OwotfQotCi1QYXNzUmVmUHRyPEVkaXRpbmdUZXh0PiBEb2N1bWVudDo6Y3JlYXRlRWRpdGluZ1Rl
eHROb2RlKGNvbnN0IFN0cmluZyYgdGV4dCkKLXsKLSAgICByZXR1cm4gRWRpdGluZ1RleHQ6OmNy
ZWF0ZSh0aGlzLCB0ZXh0KTsKLX0KLQotUGFzc1JlZlB0cjxDU1NTdHlsZURlY2xhcmF0aW9uPiBE
b2N1bWVudDo6Y3JlYXRlQ1NTU3R5bGVEZWNsYXJhdGlvbigpCi17Ci0gICAgcmV0dXJuIFN0eWxl
UHJvcGVydHlTZXQ6OmNyZWF0ZSgpLT5lbnN1cmVDU1NTdHlsZURlY2xhcmF0aW9uKCk7Ci19Ci0K
LVBhc3NSZWZQdHI8Tm9kZT4gRG9jdW1lbnQ6OmltcG9ydE5vZGUoTm9kZSogaW1wb3J0ZWROb2Rl
LCBib29sIGRlZXAsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIGVjID0gMDsKLSAgICAKLSAg
ICBpZiAoIWltcG9ydGVkTm9kZSkgewotICAgICAgICBlYyA9IE5PVF9TVVBQT1JURURfRVJSOwot
ICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKGltcG9ydGVkTm9kZS0+bm9k
ZVR5cGUoKSkgewotICAgIGNhc2UgVEVYVF9OT0RFOgotICAgICAgICByZXR1cm4gY3JlYXRlVGV4
dE5vZGUoaW1wb3J0ZWROb2RlLT5ub2RlVmFsdWUoKSk7Ci0gICAgY2FzZSBDREFUQV9TRUNUSU9O
X05PREU6Ci0gICAgICAgIHJldHVybiBjcmVhdGVDREFUQVNlY3Rpb24oaW1wb3J0ZWROb2RlLT5u
b2RlVmFsdWUoKSwgZWMpOwotICAgIGNhc2UgRU5USVRZX1JFRkVSRU5DRV9OT0RFOgotICAgICAg
ICByZXR1cm4gY3JlYXRlRW50aXR5UmVmZXJlbmNlKGltcG9ydGVkTm9kZS0+bm9kZU5hbWUoKSwg
ZWMpOwotICAgIGNhc2UgUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFOgotICAgICAgICByZXR1
cm4gY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKGltcG9ydGVkTm9kZS0+bm9kZU5hbWUoKSwg
aW1wb3J0ZWROb2RlLT5ub2RlVmFsdWUoKSwgZWMpOwotICAgIGNhc2UgQ09NTUVOVF9OT0RFOgot
ICAgICAgICByZXR1cm4gY3JlYXRlQ29tbWVudChpbXBvcnRlZE5vZGUtPm5vZGVWYWx1ZSgpKTsK
LSAgICBjYXNlIEVMRU1FTlRfTk9ERTogewotICAgICAgICBFbGVtZW50KiBvbGRFbGVtZW50ID0g
c3RhdGljX2Nhc3Q8RWxlbWVudCo+KGltcG9ydGVkTm9kZSk7Ci0gICAgICAgIC8vIEZJWE1FOiBU
aGUgZm9sbG93aW5nIGNoZWNrIG1pZ2h0IGJlIHVubmVjZXNzYXJ5LiBJcyBpdCBwb3NzaWJsZSB0
aGF0Ci0gICAgICAgIC8vIG9sZEVsZW1lbnQgaGFzIG1pc21hdGNoZWQgcHJlZml4L25hbWVzcGFj
ZT8KLSAgICAgICAgaWYgKCFoYXNWYWxpZE5hbWVzcGFjZUZvckVsZW1lbnRzKG9sZEVsZW1lbnQt
PnRhZ1FOYW1lKCkpKSB7Ci0gICAgICAgICAgICBlYyA9IE5BTUVTUEFDRV9FUlI7Ci0gICAgICAg
ICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBSZWZQdHI8RWxlbWVudD4gbmV3RWxl
bWVudCA9IGNyZWF0ZUVsZW1lbnQob2xkRWxlbWVudC0+dGFnUU5hbWUoKSwgZWMpOwotICAgICAg
ICBpZiAoZWMpCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICBuZXdFbGVtZW50LT5j
bG9uZURhdGFGcm9tRWxlbWVudCgqb2xkRWxlbWVudCk7Ci0KLSAgICAgICAgaWYgKGRlZXApIHsK
LSAgICAgICAgICAgIGZvciAoTm9kZSogb2xkQ2hpbGQgPSBvbGRFbGVtZW50LT5maXJzdENoaWxk
KCk7IG9sZENoaWxkOyBvbGRDaGlsZCA9IG9sZENoaWxkLT5uZXh0U2libGluZygpKSB7Ci0gICAg
ICAgICAgICAgICAgUmVmUHRyPE5vZGU+IG5ld0NoaWxkID0gaW1wb3J0Tm9kZShvbGRDaGlsZCwg
dHJ1ZSwgZWMpOwotICAgICAgICAgICAgICAgIGlmIChlYykKLSAgICAgICAgICAgICAgICAgICAg
cmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgbmV3RWxlbWVudC0+YXBwZW5kQ2hpbGQobmV3Q2hp
bGQucmVsZWFzZSgpLCBlYyk7Ci0gICAgICAgICAgICAgICAgaWYgKGVjKQotICAgICAgICAgICAg
ICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJl
dHVybiBuZXdFbGVtZW50LnJlbGVhc2UoKTsKLSAgICB9Ci0gICAgY2FzZSBBVFRSSUJVVEVfTk9E
RToKLSAgICAgICAgcmV0dXJuIEF0dHI6OmNyZWF0ZSh0aGlzLCBRdWFsaWZpZWROYW1lKG51bGxB
dG9tLCBzdGF0aWNfY2FzdDxBdHRyKj4oaW1wb3J0ZWROb2RlKS0+bmFtZSgpLCBudWxsQXRvbSks
IHN0YXRpY19jYXN0PEF0dHIqPihpbXBvcnRlZE5vZGUpLT52YWx1ZSgpKTsKLSAgICBjYXNlIERP
Q1VNRU5UX0ZSQUdNRU5UX05PREU6IHsKLSAgICAgICAgaWYgKGltcG9ydGVkTm9kZS0+aXNTaGFk
b3dSb290KCkpIHsKLSAgICAgICAgICAgIC8vIFNoYWRvd1Jvb3Qgbm9kZXMgc2hvdWxkIG5vdCBi
ZSBleHBsaWNpdGx5IGltcG9ydGFibGUuCi0gICAgICAgICAgICAvLyBFaXRoZXIgdGhleSBhcmUg
aW1wb3J0ZWQgYWxvbmcgd2l0aCB0aGVpciBob3N0IG5vZGUsIG9yIGNyZWF0ZWQgaW1wbGljaXRs
eS4KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIERvY3VtZW50RnJhZ21l
bnQqIG9sZEZyYWdtZW50ID0gc3RhdGljX2Nhc3Q8RG9jdW1lbnRGcmFnbWVudCo+KGltcG9ydGVk
Tm9kZSk7Ci0gICAgICAgIFJlZlB0cjxEb2N1bWVudEZyYWdtZW50PiBuZXdGcmFnbWVudCA9IGNy
ZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKLSAgICAgICAgaWYgKGRlZXApIHsKLSAgICAgICAgICAg
IGZvciAoTm9kZSogb2xkQ2hpbGQgPSBvbGRGcmFnbWVudC0+Zmlyc3RDaGlsZCgpOyBvbGRDaGls
ZDsgb2xkQ2hpbGQgPSBvbGRDaGlsZC0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICAgICAgICAg
IFJlZlB0cjxOb2RlPiBuZXdDaGlsZCA9IGltcG9ydE5vZGUob2xkQ2hpbGQsIHRydWUsIGVjKTsK
LSAgICAgICAgICAgICAgICBpZiAoZWMpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwot
ICAgICAgICAgICAgICAgIG5ld0ZyYWdtZW50LT5hcHBlbmRDaGlsZChuZXdDaGlsZC5yZWxlYXNl
KCksIGVjKTsKLSAgICAgICAgICAgICAgICBpZiAoZWMpCi0gICAgICAgICAgICAgICAgICAgIHJl
dHVybiAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1
cm4gbmV3RnJhZ21lbnQucmVsZWFzZSgpOwotICAgIH0KLSAgICBjYXNlIEVOVElUWV9OT0RFOgot
ICAgIGNhc2UgTk9UQVRJT05fTk9ERToKLSAgICAgICAgLy8gRklYTUU6IEl0IHNob3VsZCBiZSBw
b3NzaWJsZSB0byBpbXBvcnQgdGhlc2Ugbm9kZSB0eXBlcywgaG93ZXZlciBpbiBET00zIHRoZSBE
b2N1bWVudFR5cGUgaXMgcmVhZG9ubHksIHNvIHRoZXJlIGlzbid0IG11Y2ggc2Vuc2UgaW4gZG9p
bmcgdGhhdC4KLSAgICAgICAgLy8gQWJpbGl0eSB0byBhZGQgdGhlc2UgaW1wb3J0ZWQgbm9kZXMg
dG8gYSBEb2N1bWVudFR5cGUgd2lsbCBiZSBjb25zaWRlcmVkIGZvciBhZGRpdGlvbiB0byBhIGZ1
dHVyZSByZWxlYXNlIG9mIHRoZSBET00uCi0gICAgY2FzZSBET0NVTUVOVF9OT0RFOgotICAgIGNh
c2UgRE9DVU1FTlRfVFlQRV9OT0RFOgotICAgIGNhc2UgWFBBVEhfTkFNRVNQQUNFX05PREU6Ci0g
ICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBlYyA9IE5PVF9TVVBQT1JURURfRVJSOwotICAgIHJl
dHVybiAwOwotfQotCi0KLVBhc3NSZWZQdHI8Tm9kZT4gRG9jdW1lbnQ6OmFkb3B0Tm9kZShQYXNz
UmVmUHRyPE5vZGU+IHNvdXJjZSwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgaWYgKCFzb3Vy
Y2UpIHsKLSAgICAgICAgZWMgPSBOT1RfU1VQUE9SVEVEX0VSUjsKLSAgICAgICAgcmV0dXJuIDA7
Ci0gICAgfQotCi0gICAgaWYgKHNvdXJjZS0+aXNSZWFkT25seU5vZGUoKSkgewotICAgICAgICBl
YyA9IE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAg
fQotCi0gICAgRXZlbnRRdWV1ZVNjb3BlIHNjb3BlOwotCi0gICAgc3dpdGNoIChzb3VyY2UtPm5v
ZGVUeXBlKCkpIHsKLSAgICBjYXNlIEVOVElUWV9OT0RFOgotICAgIGNhc2UgTk9UQVRJT05fTk9E
RToKLSAgICBjYXNlIERPQ1VNRU5UX05PREU6Ci0gICAgY2FzZSBET0NVTUVOVF9UWVBFX05PREU6
Ci0gICAgY2FzZSBYUEFUSF9OQU1FU1BBQ0VfTk9ERToKLSAgICAgICAgZWMgPSBOT1RfU1VQUE9S
VEVEX0VSUjsKLSAgICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAgCi0gICAgY2FzZSBBVFRSSUJV
VEVfTk9ERTogeyAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQXR0ciogYXR0ciA9IHN0YXRp
Y19jYXN0PEF0dHIqPihzb3VyY2UuZ2V0KCkpOwotICAgICAgICBpZiAoYXR0ci0+b3duZXJFbGVt
ZW50KCkpCi0gICAgICAgICAgICBhdHRyLT5vd25lckVsZW1lbnQoKS0+cmVtb3ZlQXR0cmlidXRl
Tm9kZShhdHRyLCBlYyk7Ci0gICAgICAgIGF0dHItPnNldFNwZWNpZmllZCh0cnVlKTsKLSAgICAg
ICAgYnJlYWs7Ci0gICAgfSAgICAgICAKLSAgICBkZWZhdWx0OgotICAgICAgICBpZiAoc291cmNl
LT5pc1NoYWRvd1Jvb3QoKSkgewotICAgICAgICAgICAgLy8gU2hhZG93Um9vdCBjYW5ub3QgZGlz
Y29ubmVjdCBpdHNlbGYgZnJvbSB0aGUgaG9zdCBub2RlLgotICAgICAgICAgICAgZWMgPSBISUVS
QVJDSFlfUkVRVUVTVF9FUlI7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0g
ICAgICAgIC8vIEZJWE1FOiBXaGF0IGFib3V0IDxmcmFtZT4gYW5kIDxvYmplY3Q+PwotICAgICAg
ICBpZiAoc291cmNlLT5oYXNUYWdOYW1lKGlmcmFtZVRhZykpIHsKLSAgICAgICAgICAgIEhUTUxJ
RnJhbWVFbGVtZW50KiBpZnJhbWUgPSBzdGF0aWNfY2FzdDxIVE1MSUZyYW1lRWxlbWVudCo+KHNv
dXJjZS5nZXQoKSk7Ci0gICAgICAgICAgICBpZiAoZnJhbWUoKSAmJiBmcmFtZSgpLT50cmVlKCkt
PmlzRGVzY2VuZGFudE9mKGlmcmFtZS0+Y29udGVudEZyYW1lKCkpKSB7Ci0gICAgICAgICAgICAg
ICAgZWMgPSBISUVSQVJDSFlfUkVRVUVTVF9FUlI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7
Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNvdXJjZS0+cGFyZW50Tm9k
ZSgpKQotICAgICAgICAgICAgc291cmNlLT5wYXJlbnROb2RlKCktPnJlbW92ZUNoaWxkKHNvdXJj
ZS5nZXQoKSwgZWMpOwotICAgIH0KLQotICAgIHRoaXMtPmFkb3B0SWZOZWVkZWQoc291cmNlLmdl
dCgpKTsKLQotICAgIHJldHVybiBzb3VyY2U7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6Omhhc1ZhbGlk
TmFtZXNwYWNlRm9yRWxlbWVudHMoY29uc3QgUXVhbGlmaWVkTmFtZSYgcU5hbWUpCi17Ci0gICAg
Ly8gVGhlc2UgY2hlY2tzIGFyZSBmcm9tIERPTSBDb3JlIExldmVsIDIsIGNyZWF0ZUVsZW1lbnRO
UwotICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUNvcmUvY29yZS5odG1s
I0lELURvY0NyRWxOUwotICAgIGlmICghcU5hbWUucHJlZml4KCkuaXNFbXB0eSgpICYmIHFOYW1l
Lm5hbWVzcGFjZVVSSSgpLmlzTnVsbCgpKSAvLyBjcmVhdGVFbGVtZW50TlMobnVsbCwgImh0bWw6
ZGl2IikKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChxTmFtZS5wcmVmaXgoKSA9PSB4
bWxBdG9tICYmIHFOYW1lLm5hbWVzcGFjZVVSSSgpICE9IFhNTE5hbWVzOjp4bWxOYW1lc3BhY2VV
UkkpIC8vIGNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy5leGFtcGxlLmNvbSIsICJ4bWw6bGFu
ZyIpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIFJlcXVpcmVkIGJ5IERPTSBMZXZl
bCAzIENvcmUgYW5kIHVuc3BlY2lmaWVkIGJ5IERPTSBMZXZlbCAyIENvcmU6Ci0gICAgLy8gaHR0
cDovL3d3dy53My5vcmcvVFIvMjAwNC9SRUMtRE9NLUxldmVsLTMtQ29yZS0yMDA0MDQwNy9jb3Jl
Lmh0bWwjSUQtRG9jQ3JFbE5TCi0gICAgLy8gY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3Lncz
Lm9yZy8yMDAwL3htbG5zLyIsICJmb286YmFyIiksIGNyZWF0ZUVsZW1lbnROUyhudWxsLCAieG1s
bnM6YmFyIikKLSAgICBpZiAoKHFOYW1lLnByZWZpeCgpID09IHhtbG5zQXRvbSAmJiBxTmFtZS5u
YW1lc3BhY2VVUkkoKSAhPSBYTUxOU05hbWVzOjp4bWxuc05hbWVzcGFjZVVSSSkgfHwgKHFOYW1l
LnByZWZpeCgpICE9IHhtbG5zQXRvbSAmJiBxTmFtZS5uYW1lc3BhY2VVUkkoKSA9PSBYTUxOU05h
bWVzOjp4bWxuc05hbWVzcGFjZVVSSSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHJl
dHVybiB0cnVlOwotfQotCi1ib29sIERvY3VtZW50OjpoYXNWYWxpZE5hbWVzcGFjZUZvckF0dHJp
YnV0ZXMoY29uc3QgUXVhbGlmaWVkTmFtZSYgcU5hbWUpCi17Ci0gICAgLy8gU3BlYzogRE9NIExl
dmVsIDIgQ29yZTogaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlLmh0
bWwjSUQtRWxTZXRBdHRyTlMKLSAgICBpZiAocU5hbWUucHJlZml4KCkuaXNFbXB0eSgpICYmIHFO
YW1lLmxvY2FsTmFtZSgpID09IHhtbG5zQXRvbSkgewotICAgICAgICAvLyBOb3RlOiBUaGUgY2Fz
ZSBvZiBhbiAieG1sbnMiIHF1YWxpZmllZCBuYW1lIHdpdGggYSBuYW1lc3BhY2Ugb2YKLSAgICAg
ICAgLy8geG1sbnNOYW1lc3BhY2VVUkkgaXMgc3BlY2lmaWNhbGx5IGFsbG93ZWQgKFNlZSA8aHR0
cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8+KS4KLSAgICAgICAgcmV0dXJuIHFOYW1lLm5hbWVz
cGFjZVVSSSgpID09IFhNTE5TTmFtZXM6OnhtbG5zTmFtZXNwYWNlVVJJOwotICAgIH0KLSAgICBy
ZXR1cm4gaGFzVmFsaWROYW1lc3BhY2VGb3JFbGVtZW50cyhxTmFtZSk7Ci19Ci0KLS8vIEZJWE1F
OiBUaGlzIHNob3VsZCByZWFsbHkgYmUgaW4gYSBwb3NzaWJsZSBFbGVtZW50RmFjdG9yeSBjbGFz
cwotUGFzc1JlZlB0cjxFbGVtZW50PiBEb2N1bWVudDo6Y3JlYXRlRWxlbWVudChjb25zdCBRdWFs
aWZpZWROYW1lJiBxTmFtZSwgYm9vbCBjcmVhdGVkQnlQYXJzZXIpCi17Ci0gICAgUmVmUHRyPEVs
ZW1lbnQ+IGU7Ci0KLSAgICAvLyBGSVhNRTogVXNlIHJlZ2lzdGVyZWQgbmFtZXNwYWNlcyBhbmQg
bG9vayB1cCBpbiBhIGhhc2ggdG8gZmluZCB0aGUgcmlnaHQgZmFjdG9yeS4KLSAgICBpZiAocU5h
bWUubmFtZXNwYWNlVVJJKCkgPT0geGh0bWxOYW1lc3BhY2VVUkkpCi0gICAgICAgIGUgPSBIVE1M
RWxlbWVudEZhY3Rvcnk6OmNyZWF0ZUhUTUxFbGVtZW50KHFOYW1lLCB0aGlzLCAwLCBjcmVhdGVk
QnlQYXJzZXIpOwotI2lmIEVOQUJMRShTVkcpCi0gICAgZWxzZSBpZiAocU5hbWUubmFtZXNwYWNl
VVJJKCkgPT0gU1ZHTmFtZXM6OnN2Z05hbWVzcGFjZVVSSSkKLSAgICAgICAgZSA9IFNWR0VsZW1l
bnRGYWN0b3J5OjpjcmVhdGVTVkdFbGVtZW50KHFOYW1lLCB0aGlzLCBjcmVhdGVkQnlQYXJzZXIp
OwotI2VuZGlmCi0jaWYgRU5BQkxFKE1BVEhNTCkKLSAgICBlbHNlIGlmIChxTmFtZS5uYW1lc3Bh
Y2VVUkkoKSA9PSBNYXRoTUxOYW1lczo6bWF0aG1sTmFtZXNwYWNlVVJJKQotICAgICAgICBlID0g
TWF0aE1MRWxlbWVudEZhY3Rvcnk6OmNyZWF0ZU1hdGhNTEVsZW1lbnQocU5hbWUsIHRoaXMsIGNy
ZWF0ZWRCeVBhcnNlcik7Ci0jZW5kaWYKLQotICAgIGlmIChlKQotICAgICAgICBtX3Nhd0VsZW1l
bnRzSW5Lbm93bk5hbWVzcGFjZXMgPSB0cnVlOwotICAgIGVsc2UKLSAgICAgICAgZSA9IEVsZW1l
bnQ6OmNyZWF0ZShxTmFtZSwgZG9jdW1lbnQoKSk7Ci0KLSAgICAvLyA8aW1hZ2U+IHVzZXMgaW1n
VGFnIHNvIHdlIG5lZWQgYSBzcGVjaWFsIHJ1bGUuCi0gICAgQVNTRVJUKChxTmFtZS5tYXRjaGVz
KGltYWdlVGFnKSAmJiBlLT50YWdRTmFtZSgpLm1hdGNoZXMoaW1nVGFnKSAmJiBlLT50YWdRTmFt
ZSgpLnByZWZpeCgpID09IHFOYW1lLnByZWZpeCgpKSB8fCBxTmFtZSA9PSBlLT50YWdRTmFtZSgp
KTsKLQotICAgIHJldHVybiBlLnJlbGVhc2UoKTsKLX0KLQotYm9vbCBEb2N1bWVudDo6cmVnaW9u
QmFzZWRDb2x1bW5zRW5hYmxlZCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHNldHRpbmdzKCkgJiYg
c2V0dGluZ3MoKS0+cmVnaW9uQmFzZWRDb2x1bW5zRW5hYmxlZCgpOyAKLX0KLQotYm9vbCBEb2N1
bWVudDo6Y3NzU3RpY2t5UG9zaXRpb25FbmFibGVkKCkgY29uc3QKLXsKLSAgICByZXR1cm4gc2V0
dGluZ3MoKSAmJiBzZXR0aW5ncygpLT5jc3NTdGlja3lQb3NpdGlvbkVuYWJsZWQoKTsgCi19Ci0K
LWJvb2wgRG9jdW1lbnQ6OmNzc1JlZ2lvbnNFbmFibGVkKCkgY29uc3QKLXsKLSAgICByZXR1cm4g
c2V0dGluZ3MoKSAmJiBzZXR0aW5ncygpLT5jc3NSZWdpb25zRW5hYmxlZCgpOyAKLX0KLQotYm9v
bCBEb2N1bWVudDo6Y3NzR3JpZExheW91dEVuYWJsZWQoKSBjb25zdAotewotICAgIHJldHVybiBz
ZXR0aW5ncygpICYmIHNldHRpbmdzKCktPmNzc0dyaWRMYXlvdXRFbmFibGVkKCk7Ci19Ci0KLSNp
ZiBFTkFCTEUoQ1NTX1JFR0lPTlMpCi0KLVBhc3NSZWZQdHI8V2ViS2l0TmFtZWRGbG93PiBEb2N1
bWVudDo6d2Via2l0R2V0Rmxvd0J5TmFtZShjb25zdCBTdHJpbmcmIGZsb3dOYW1lKQotewotICAg
IGlmICghY3NzUmVnaW9uc0VuYWJsZWQoKSB8fCAhcmVuZGVyZXIoKSkKLSAgICAgICAgcmV0dXJu
IDA7Ci0KLSAgICAvLyBJdCdzIHBvc3NpYmxlIHRvIGhhdmUgcGVuZGluZyBzdHlsZXMgbm90IGFw
cGxpZWQgdGhhdCBhZmZlY3QgdGhlIGV4aXN0aW5nIGZsb3dzLgotICAgIHVwZGF0ZVN0eWxlSWZO
ZWVkZWQoKTsKLQotICAgIHJldHVybiBuYW1lZEZsb3dzKCktPmZsb3dCeU5hbWUoZmxvd05hbWUp
OwotfQotCi1QYXNzUmVmUHRyPERPTU5hbWVkRmxvd0NvbGxlY3Rpb24+IERvY3VtZW50Ojp3ZWJr
aXRHZXROYW1lZEZsb3dzKCkKLXsKLSAgICBpZiAoIWNzc1JlZ2lvbnNFbmFibGVkKCkgfHwgIXJl
bmRlcmVyKCkpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgdXBkYXRlU3R5bGVJZk5lZWRlZCgp
OwotCi0gICAgcmV0dXJuIG5hbWVkRmxvd3MoKS0+Y3JlYXRlQ1NTT01TbmFwc2hvdCgpOwotfQot
Ci0jZW5kaWYKLQotTmFtZWRGbG93Q29sbGVjdGlvbiogRG9jdW1lbnQ6Om5hbWVkRmxvd3MoKQot
ewotICAgIGlmICghbV9uYW1lZEZsb3dzKQotICAgICAgICBtX25hbWVkRmxvd3MgPSBOYW1lZEZs
b3dDb2xsZWN0aW9uOjpjcmVhdGUodGhpcyk7Ci0KLSAgICByZXR1cm4gbV9uYW1lZEZsb3dzLmdl
dCgpOwotfQotCi1QYXNzUmVmUHRyPEVsZW1lbnQ+IERvY3VtZW50OjpjcmVhdGVFbGVtZW50TlMo
Y29uc3QgU3RyaW5nJiBuYW1lc3BhY2VVUkksIGNvbnN0IFN0cmluZyYgcXVhbGlmaWVkTmFtZSwg
RXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgU3RyaW5nIHByZWZpeCwgbG9jYWxOYW1lOwotICAg
IGlmICghcGFyc2VRdWFsaWZpZWROYW1lKHF1YWxpZmllZE5hbWUsIHByZWZpeCwgbG9jYWxOYW1l
LCBlYykpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgUXVhbGlmaWVkTmFtZSBxTmFtZShwcmVm
aXgsIGxvY2FsTmFtZSwgbmFtZXNwYWNlVVJJKTsKLSAgICBpZiAoIWhhc1ZhbGlkTmFtZXNwYWNl
Rm9yRWxlbWVudHMocU5hbWUpKSB7Ci0gICAgICAgIGVjID0gTkFNRVNQQUNFX0VSUjsKLSAgICAg
ICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQocU5hbWUsIGZh
bHNlKTsKLX0KLQotU3RyaW5nIERvY3VtZW50OjpyZWFkeVN0YXRlKCkgY29uc3QKLXsKLSAgICBE
RUZJTkVfU1RBVElDX0xPQ0FMKGNvbnN0IFN0cmluZywgbG9hZGluZywgKEFTQ0lJTGl0ZXJhbCgi
bG9hZGluZyIpKSk7Ci0gICAgREVGSU5FX1NUQVRJQ19MT0NBTChjb25zdCBTdHJpbmcsIGludGVy
YWN0aXZlLCAoQVNDSUlMaXRlcmFsKCJpbnRlcmFjdGl2ZSIpKSk7Ci0gICAgREVGSU5FX1NUQVRJ
Q19MT0NBTChjb25zdCBTdHJpbmcsIGNvbXBsZXRlLCAoQVNDSUlMaXRlcmFsKCJjb21wbGV0ZSIp
KSk7Ci0KLSAgICBzd2l0Y2ggKG1fcmVhZHlTdGF0ZSkgewotICAgIGNhc2UgTG9hZGluZzoKLSAg
ICAgICAgcmV0dXJuIGxvYWRpbmc7Ci0gICAgY2FzZSBJbnRlcmFjdGl2ZToKLSAgICAgICAgcmV0
dXJuIGludGVyYWN0aXZlOwotICAgIGNhc2UgQ29tcGxldGU6Ci0gICAgICAgIHJldHVybiBjb21w
bGV0ZTsKLSAgICB9Ci0KLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICByZXR1cm4gU3Ry
aW5nKCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnNldFJlYWR5U3RhdGUoUmVhZHlTdGF0ZSByZWFk
eVN0YXRlKQotewotICAgIGlmIChyZWFkeVN0YXRlID09IG1fcmVhZHlTdGF0ZSkKLSAgICAgICAg
cmV0dXJuOwotCi0gICAgc3dpdGNoIChyZWFkeVN0YXRlKSB7Ci0gICAgY2FzZSBMb2FkaW5nOgot
ICAgICAgICBpZiAoIW1fZG9jdW1lbnRUaW1pbmcuZG9tTG9hZGluZykKLSAgICAgICAgICAgIG1f
ZG9jdW1lbnRUaW1pbmcuZG9tTG9hZGluZyA9IG1vbm90b25pY2FsbHlJbmNyZWFzaW5nVGltZSgp
OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEludGVyYWN0aXZlOgotICAgICAgICBpZiAoIW1f
ZG9jdW1lbnRUaW1pbmcuZG9tSW50ZXJhY3RpdmUpCi0gICAgICAgICAgICBtX2RvY3VtZW50VGlt
aW5nLmRvbUludGVyYWN0aXZlID0gbW9ub3RvbmljYWxseUluY3JlYXNpbmdUaW1lKCk7Ci0gICAg
ICAgIGJyZWFrOwotICAgIGNhc2UgQ29tcGxldGU6Ci0gICAgICAgIGlmICghbV9kb2N1bWVudFRp
bWluZy5kb21Db21wbGV0ZSkKLSAgICAgICAgICAgIG1fZG9jdW1lbnRUaW1pbmcuZG9tQ29tcGxl
dGUgPSBtb25vdG9uaWNhbGx5SW5jcmVhc2luZ1RpbWUoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAg
fQotCi0gICAgbV9yZWFkeVN0YXRlID0gcmVhZHlTdGF0ZTsKLSAgICBkaXNwYXRjaEV2ZW50KEV2
ZW50OjpjcmVhdGUoZXZlbnROYW1lcygpLnJlYWR5c3RhdGVjaGFuZ2VFdmVudCwgZmFsc2UsIGZh
bHNlKSk7Ci0gICAgCi0gICAgaWYgKHNldHRpbmdzKCkgJiYgc2V0dGluZ3MoKS0+c3VwcHJlc3Nl
c0luY3JlbWVudGFsUmVuZGVyaW5nKCkpCi0gICAgICAgIHNldFZpc3VhbFVwZGF0ZXNBbGxvd2Vk
KHJlYWR5U3RhdGUpOwotfQotCi12b2lkIERvY3VtZW50OjpzZXRWaXN1YWxVcGRhdGVzQWxsb3dl
ZChSZWFkeVN0YXRlIHJlYWR5U3RhdGUpCi17Ci0gICAgQVNTRVJUKHNldHRpbmdzKCkgJiYgc2V0
dGluZ3MoKS0+c3VwcHJlc3Nlc0luY3JlbWVudGFsUmVuZGVyaW5nKCkpOwotICAgIHN3aXRjaCAo
cmVhZHlTdGF0ZSkgewotICAgIGNhc2UgTG9hZGluZzoKLSAgICAgICAgQVNTRVJUKCFtX3Zpc3Vh
bFVwZGF0ZXNTdXBwcmVzc2lvblRpbWVyLmlzQWN0aXZlKCkpOwotICAgICAgICBBU1NFUlQobV92
aXN1YWxVcGRhdGVzQWxsb3dlZCk7Ci0gICAgICAgIG1fdmlzdWFsVXBkYXRlc1N1cHByZXNzaW9u
VGltZXIuc3RhcnRPbmVTaG90KHNldHRpbmdzKCktPmluY3JlbWVudGFsUmVuZGVyaW5nU3VwcHJl
c3Npb25UaW1lb3V0SW5TZWNvbmRzKCkpOwotICAgICAgICBzZXRWaXN1YWxVcGRhdGVzQWxsb3dl
ZChmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgSW50ZXJhY3RpdmU6Ci0gICAgICAg
IEFTU0VSVChtX3Zpc3VhbFVwZGF0ZXNTdXBwcmVzc2lvblRpbWVyLmlzQWN0aXZlKCkgfHwgbV92
aXN1YWxVcGRhdGVzQWxsb3dlZCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQ29tcGxldGU6
Ci0gICAgICAgIGlmIChtX3Zpc3VhbFVwZGF0ZXNTdXBwcmVzc2lvblRpbWVyLmlzQWN0aXZlKCkp
IHsKLSAgICAgICAgICAgIEFTU0VSVCghbV92aXN1YWxVcGRhdGVzQWxsb3dlZCk7Ci0gICAgICAg
ICAgICBtX3Zpc3VhbFVwZGF0ZXNTdXBwcmVzc2lvblRpbWVyLnN0b3AoKTsKLSAgICAgICAgICAg
IHNldFZpc3VhbFVwZGF0ZXNBbGxvd2VkKHRydWUpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAg
ICAgIEFTU0VSVChtX3Zpc3VhbFVwZGF0ZXNBbGxvd2VkKTsKLSAgICAgICAgYnJlYWs7Ci0gICAg
fQotfQotICAgIAotdm9pZCBEb2N1bWVudDo6c2V0VmlzdWFsVXBkYXRlc0FsbG93ZWQoYm9vbCB2
aXN1YWxVcGRhdGVzQWxsb3dlZCkKLXsKLSAgICBpZiAobV92aXN1YWxVcGRhdGVzQWxsb3dlZCA9
PSB2aXN1YWxVcGRhdGVzQWxsb3dlZCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV92aXN1YWxV
cGRhdGVzQWxsb3dlZCA9IHZpc3VhbFVwZGF0ZXNBbGxvd2VkOwotCi0gICAgaWYgKCF2aXN1YWxV
cGRhdGVzQWxsb3dlZCkKLSAgICAgICAgcmV0dXJuOwotCi0jaWYgVVNFKEFDQ0VMRVJBVEVEX0NP
TVBPU0lUSU5HKQotICAgIGlmICh2aWV3KCkpCi0gICAgICAgIHZpZXcoKS0+dXBkYXRlQ29tcG9z
aXRpbmdMYXllcnNBZnRlckxheW91dCgpOwotI2VuZGlmCi0KLSAgICBpZiAocmVuZGVyZXIoKSkK
LSAgICAgICAgcmVuZGVyZXIoKS0+cmVwYWludCgpOwotfQotCi12b2lkIERvY3VtZW50Ojp2aXN1
YWxVcGRhdGVzU3VwcHJlc3Npb25UaW1lckZpcmVkKFRpbWVyPERvY3VtZW50PiopCi17Ci0gICAg
QVNTRVJUKCFtX3Zpc3VhbFVwZGF0ZXNBbGxvd2VkKTsKLSAgICBzZXRWaXN1YWxVcGRhdGVzQWxs
b3dlZCh0cnVlKTsKLX0KLQotU3RyaW5nIERvY3VtZW50OjplbmNvZGluZygpIGNvbnN0Ci17Ci0g
ICAgaWYgKFRleHRSZXNvdXJjZURlY29kZXIqIGQgPSBkZWNvZGVyKCkpCi0gICAgICAgIHJldHVy
biBkLT5lbmNvZGluZygpLmRvbU5hbWUoKTsKLSAgICByZXR1cm4gU3RyaW5nKCk7Ci19Ci0KLVN0
cmluZyBEb2N1bWVudDo6ZGVmYXVsdENoYXJzZXQoKSBjb25zdAotewotICAgIGlmIChTZXR0aW5n
cyogc2V0dGluZ3MgPSB0aGlzLT5zZXR0aW5ncygpKQotICAgICAgICByZXR1cm4gc2V0dGluZ3Mt
PmRlZmF1bHRUZXh0RW5jb2RpbmdOYW1lKCk7Ci0gICAgcmV0dXJuIFN0cmluZygpOwotfQotCi12
b2lkIERvY3VtZW50OjpzZXRDaGFyc2V0KGNvbnN0IFN0cmluZyYgY2hhcnNldCkKLXsKLSAgICBp
ZiAoIWRlY29kZXIoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIGRlY29kZXIoKS0+c2V0RW5jb2Rp
bmcoY2hhcnNldCwgVGV4dFJlc291cmNlRGVjb2Rlcjo6VXNlckNob3NlbkVuY29kaW5nKTsKLX0K
LQotdm9pZCBEb2N1bWVudDo6c2V0Q29udGVudExhbmd1YWdlKGNvbnN0IFN0cmluZyYgbGFuZ3Vh
Z2UpCi17Ci0gICAgaWYgKG1fY29udGVudExhbmd1YWdlID09IGxhbmd1YWdlKQotICAgICAgICBy
ZXR1cm47Ci0gICAgbV9jb250ZW50TGFuZ3VhZ2UgPSBsYW5ndWFnZTsKLQotICAgIC8vIFJlY2Fs
Y3VsYXRlIHN0eWxlIHNvIGxhbmd1YWdlIGlzIHVzZWQgd2hlbiBzZWxlY3RpbmcgdGhlIGluaXRp
YWwgZm9udC4KLSAgICBzdHlsZVJlc29sdmVyQ2hhbmdlZChEZWZlclJlY2FsY1N0eWxlKTsKLX0K
LQotdm9pZCBEb2N1bWVudDo6c2V0WE1MVmVyc2lvbihjb25zdCBTdHJpbmcmIHZlcnNpb24sIEV4
Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIGlmICghaW1wbGVtZW50YXRpb24oKS0+aGFzRmVhdHVy
ZSgiWE1MIiwgU3RyaW5nKCkpKSB7Ci0gICAgICAgIGVjID0gTk9UX1NVUFBPUlRFRF9FUlI7Ci0g
ICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIVhNTERvY3VtZW50UGFyc2VyOjpzdXBw
b3J0c1hNTFZlcnNpb24odmVyc2lvbikpIHsKLSAgICAgICAgZWMgPSBOT1RfU1VQUE9SVEVEX0VS
UjsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1feG1sVmVyc2lvbiA9IHZlcnNpb247
Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnNldFhNTFN0YW5kYWxvbmUoYm9vbCBzdGFuZGFsb25lLCBF
eGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICBpZiAoIWltcGxlbWVudGF0aW9uKCktPmhhc0ZlYXR1
cmUoIlhNTCIsIFN0cmluZygpKSkgewotICAgICAgICBlYyA9IE5PVF9TVVBQT1JURURfRVJSOwot
ICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbV94bWxTdGFuZGFsb25lID0gc3RhbmRhbG9u
ZSA/IFN0YW5kYWxvbmUgOiBOb3RTdGFuZGFsb25lOwotfQotCi12b2lkIERvY3VtZW50OjpzZXRE
b2N1bWVudFVSSShjb25zdCBTdHJpbmcmIHVyaSkKLXsKLSAgICAvLyBUaGlzIHByb3BlcnR5IGlz
IHJlYWQtb25seSBmcm9tIEphdmFTY3JpcHQsIGJ1dCB3cml0YWJsZSBmcm9tIE9iamVjdGl2ZS1D
LgotICAgIG1fZG9jdW1lbnRVUkkgPSB1cmk7Ci0gICAgdXBkYXRlQmFzZVVSTCgpOwotfQotCi1L
VVJMIERvY3VtZW50OjpiYXNlVVJJKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9iYXNlVVJMOwot
fQotCi12b2lkIERvY3VtZW50OjpzZXRDb250ZW50KGNvbnN0IFN0cmluZyYgY29udGVudCkKLXsK
LSAgICBvcGVuKCk7Ci0gICAgbV9wYXJzZXItPmFwcGVuZChjb250ZW50KTsKLSAgICBjbG9zZSgp
OwotfQotCi1TdHJpbmcgRG9jdW1lbnQ6OnN1Z2dlc3RlZE1JTUVUeXBlKCkgY29uc3QKLXsKLSAg
ICBpZiAobV9kb2N1bWVudC0+aXNYSFRNTERvY3VtZW50KCkpCi0gICAgICAgIHJldHVybiAiYXBw
bGljYXRpb24veGh0bWwreG1sIjsKLSAgICBpZiAobV9kb2N1bWVudC0+aXNTVkdEb2N1bWVudCgp
KQotICAgICAgICByZXR1cm4gImltYWdlL3N2Zyt4bWwiOwotICAgIGlmIChtX2RvY3VtZW50LT54
bWxTdGFuZGFsb25lKCkpCi0gICAgICAgIHJldHVybiAidGV4dC94bWwiOwotICAgIGlmIChtX2Rv
Y3VtZW50LT5pc0hUTUxEb2N1bWVudCgpKQotICAgICAgICByZXR1cm4gInRleHQvaHRtbCI7Ci0K
LSAgICBpZiAoRG9jdW1lbnRMb2FkZXIqIGRvY3VtZW50TG9hZGVyID0gbG9hZGVyKCkpCi0gICAg
ICAgIHJldHVybiBkb2N1bWVudExvYWRlci0+cmVzcG9uc2VNSU1FVHlwZSgpOwotICAgIHJldHVy
biBTdHJpbmcoKTsKLX0KLQotLy8gRklYTUU6IFdlIG5lZWQgdG8gZGlzY3VzcyB0aGUgRE9NIEFQ
SSBoZXJlIGF0IHNvbWUgcG9pbnQuIElkZWFzOgotLy8gKiBtYWtpbmcgaXQgcmVjZWl2ZSBhIHJl
Y3QgYXMgcGFyYW1ldGVyLCBpLmUuIG5vZGVzRnJvbVJlY3QoeCwgeSwgdywgaCk7Ci0vLyAqIG1h
a2luZyBpdCByZWNlaXZlIHRoZSBleHBhZGluZyBzaXplIG9mIGVhY2ggZGlyZWN0aW9uIHNlcGFy
YXRlbHksCi0vLyAgIGkuZS4gbm9kZXNGcm9tUmVjdCh4LCB5LCB0b3BTaXplLCByaWdodFNpemUs
IGJvdHRvbVNpemUsIGxlZnRTaXplKTsKLVBhc3NSZWZQdHI8Tm9kZUxpc3Q+IERvY3VtZW50Ojpu
b2Rlc0Zyb21SZWN0KGludCBjZW50ZXJYLCBpbnQgY2VudGVyWSwgdW5zaWduZWQgdG9wUGFkZGlu
ZywgdW5zaWduZWQgcmlnaHRQYWRkaW5nLCB1bnNpZ25lZCBib3R0b21QYWRkaW5nLCB1bnNpZ25l
ZCBsZWZ0UGFkZGluZywgYm9vbCBpZ25vcmVDbGlwcGluZywgYm9vbCBhbGxvd1NoYWRvd0NvbnRl
bnQpIGNvbnN0Ci17Ci0gICAgLy8gRklYTUU6IFNoYXJlIGNvZGUgYmV0d2VlbiB0aGlzLCBlbGVt
ZW50RnJvbVBvaW50IGFuZCBjYXJldFJhbmdlRnJvbVBvaW50LgotICAgIGlmICghcmVuZGVyZXIo
KSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgRnJhbWUqIGZyYW1lID0gdGhpcy0+ZnJhbWUoKTsK
LSAgICBpZiAoIWZyYW1lKQotICAgICAgICByZXR1cm4gMDsKLSAgICBGcmFtZVZpZXcqIGZyYW1l
VmlldyA9IGZyYW1lLT52aWV3KCk7Ci0gICAgaWYgKCFmcmFtZVZpZXcpCi0gICAgICAgIHJldHVy
biAwOwotCi0gICAgZmxvYXQgem9vbUZhY3RvciA9IGZyYW1lLT5wYWdlWm9vbUZhY3RvcigpOwot
ICAgIExheW91dFBvaW50IHBvaW50ID0gcm91bmRlZExheW91dFBvaW50KEZsb2F0UG9pbnQoY2Vu
dGVyWCAqIHpvb21GYWN0b3IgKyB2aWV3KCktPnNjcm9sbFgoKSwgY2VudGVyWSAqIHpvb21GYWN0
b3IgKyB2aWV3KCktPnNjcm9sbFkoKSkpOwotCi0gICAgaW50IHR5cGUgPSBIaXRUZXN0UmVxdWVz
dDo6UmVhZE9ubHkgfCBIaXRUZXN0UmVxdWVzdDo6QWN0aXZlOwotCi0gICAgLy8gV2hlbiBpZ25v
cmVDbGlwcGluZyBpcyBmYWxzZSwgdGhpcyBtZXRob2QgcmV0dXJucyBudWxsIGZvciBjb29yZGlu
YXRlcyBvdXRzaWRlIG9mIHRoZSB2aWV3cG9ydC4KLSAgICBpZiAoaWdub3JlQ2xpcHBpbmcpCi0g
ICAgICAgIHR5cGUgfD0gSGl0VGVzdFJlcXVlc3Q6Oklnbm9yZUNsaXBwaW5nOwotICAgIGVsc2Ug
aWYgKCFmcmFtZVZpZXctPnZpc2libGVDb250ZW50UmVjdCgpLmludGVyc2VjdHMoSGl0VGVzdFJl
c3VsdDo6cmVjdEZvclBvaW50KHBvaW50LCB0b3BQYWRkaW5nLCByaWdodFBhZGRpbmcsIGJvdHRv
bVBhZGRpbmcsIGxlZnRQYWRkaW5nKSkpCi0gICAgICAgIHJldHVybiAwOwotICAgIGlmIChhbGxv
d1NoYWRvd0NvbnRlbnQpCi0gICAgICAgIHR5cGUgfD0gSGl0VGVzdFJlcXVlc3Q6OkFsbG93U2hh
ZG93Q29udGVudDsKLQotICAgIEhpdFRlc3RSZXF1ZXN0IHJlcXVlc3QodHlwZSk7Ci0KLSAgICAv
LyBQYXNzaW5nIGEgemVybyBwYWRkaW5nIHdpbGwgdHJpZ2dlciBhIHJlY3QgaGl0IHRlc3QsIGhv
d2V2ZXIgZm9yIHRoZSBwdXJwb3NlcyBvZiBub2Rlc0Zyb21SZWN0LAotICAgIC8vIHdlIHNwZWNp
YWwgaGFuZGxlIHRoaXMgY2FzZSBpbiBvcmRlciB0byByZXR1cm4gYSB2YWxpZCBOb2RlTGlzdC4K
LSAgICBpZiAoIXRvcFBhZGRpbmcgJiYgIXJpZ2h0UGFkZGluZyAmJiAhYm90dG9tUGFkZGluZyAm
JiAhbGVmdFBhZGRpbmcpIHsKLSAgICAgICAgSGl0VGVzdFJlc3VsdCByZXN1bHQocG9pbnQpOwot
ICAgICAgICByZXR1cm4gaGFuZGxlWmVyb1BhZGRpbmcocmVxdWVzdCwgcmVzdWx0KTsKLSAgICB9
Ci0KLSAgICBIaXRUZXN0UmVzdWx0IHJlc3VsdChwb2ludCwgdG9wUGFkZGluZywgcmlnaHRQYWRk
aW5nLCBib3R0b21QYWRkaW5nLCBsZWZ0UGFkZGluZyk7Ci0gICAgcmVuZGVyVmlldygpLT5oaXRU
ZXN0KHJlcXVlc3QsIHJlc3VsdCk7Ci0KLSAgICByZXR1cm4gU3RhdGljSGFzaFNldE5vZGVMaXN0
OjphZG9wdChyZXN1bHQucmVjdEJhc2VkVGVzdFJlc3VsdCgpKTsKLX0KLQotUGFzc1JlZlB0cjxO
b2RlTGlzdD4gRG9jdW1lbnQ6OmhhbmRsZVplcm9QYWRkaW5nKGNvbnN0IEhpdFRlc3RSZXF1ZXN0
JiByZXF1ZXN0LCBIaXRUZXN0UmVzdWx0JiByZXN1bHQpIGNvbnN0Ci17Ci0gICAgcmVuZGVyVmll
dygpLT5oaXRUZXN0KHJlcXVlc3QsIHJlc3VsdCk7Ci0KLSAgICBOb2RlKiBub2RlID0gcmVzdWx0
LmlubmVyTm9kZSgpOwotICAgIGlmICghbm9kZSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBu
b2RlID0gbm9kZS0+c2hhZG93QW5jZXN0b3JOb2RlKCk7Ci0gICAgTGlzdEhhc2hTZXQ8UmVmUHRy
PE5vZGU+ID4gbGlzdDsKLSAgICBsaXN0LmFkZChub2RlKTsKLSAgICByZXR1cm4gU3RhdGljSGFz
aFNldE5vZGVMaXN0OjphZG9wdChsaXN0KTsKLX0KLQotc3RhdGljIE5vZGUqIG5vZGVGcm9tUG9p
bnQoRnJhbWUqIGZyYW1lLCBSZW5kZXJWaWV3KiByZW5kZXJWaWV3LCBpbnQgeCwgaW50IHksIExh
eW91dFBvaW50KiBsb2NhbFBvaW50ID0gMCkKLXsKLSAgICBpZiAoIWZyYW1lKQotICAgICAgICBy
ZXR1cm4gMDsKLSAgICBGcmFtZVZpZXcqIGZyYW1lVmlldyA9IGZyYW1lLT52aWV3KCk7Ci0gICAg
aWYgKCFmcmFtZVZpZXcpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgZmxvYXQgem9vbUZhY3Rv
ciA9IGZyYW1lLT5wYWdlWm9vbUZhY3RvcigpOwotICAgIEludFBvaW50IHBvaW50ID0gcm91bmRl
ZEludFBvaW50KEZsb2F0UG9pbnQoeCAqIHpvb21GYWN0b3IgICsgZnJhbWVWaWV3LT5zY3JvbGxY
KCksIHkgKiB6b29tRmFjdG9yICsgZnJhbWVWaWV3LT5zY3JvbGxZKCkpKTsKLQotICAgIGlmICgh
ZnJhbWVWaWV3LT52aXNpYmxlQ29udGVudFJlY3QoKS5jb250YWlucyhwb2ludCkpCi0gICAgICAg
IHJldHVybiAwOwotCi0gICAgSGl0VGVzdFJlcXVlc3QgcmVxdWVzdChIaXRUZXN0UmVxdWVzdDo6
UmVhZE9ubHkgfCBIaXRUZXN0UmVxdWVzdDo6QWN0aXZlKTsKLSAgICBIaXRUZXN0UmVzdWx0IHJl
c3VsdChwb2ludCk7Ci0gICAgcmVuZGVyVmlldy0+aGl0VGVzdChyZXF1ZXN0LCByZXN1bHQpOwot
Ci0gICAgaWYgKGxvY2FsUG9pbnQpCi0gICAgICAgICpsb2NhbFBvaW50ID0gcmVzdWx0LmxvY2Fs
UG9pbnQoKTsKLQotICAgIHJldHVybiByZXN1bHQuaW5uZXJOb2RlKCk7Ci19Ci0KLUVsZW1lbnQq
IERvY3VtZW50OjplbGVtZW50RnJvbVBvaW50KGludCB4LCBpbnQgeSkgY29uc3QKLXsKLSAgICBp
ZiAoIXJlbmRlcmVyKCkpCi0gICAgICAgIHJldHVybiAwOwotICAgIE5vZGUqIG5vZGUgPSBub2Rl
RnJvbVBvaW50KGZyYW1lKCksIHJlbmRlclZpZXcoKSwgeCwgeSk7Ci0gICAgd2hpbGUgKG5vZGUg
JiYgIW5vZGUtPmlzRWxlbWVudE5vZGUoKSkKLSAgICAgICAgbm9kZSA9IG5vZGUtPnBhcmVudE5v
ZGUoKTsKLSAgICBpZiAobm9kZSkKLSAgICAgICAgbm9kZSA9IGFuY2VzdG9ySW5UaGlzU2NvcGUo
bm9kZSk7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PEVsZW1lbnQqPihub2RlKTsKLX0KLQotUGFz
c1JlZlB0cjxSYW5nZT4gRG9jdW1lbnQ6OmNhcmV0UmFuZ2VGcm9tUG9pbnQoaW50IHgsIGludCB5
KQotewotICAgIGlmICghcmVuZGVyZXIoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgTGF5b3V0
UG9pbnQgbG9jYWxQb2ludDsKLSAgICBOb2RlKiBub2RlID0gbm9kZUZyb21Qb2ludChmcmFtZSgp
LCByZW5kZXJWaWV3KCksIHgsIHksICZsb2NhbFBvaW50KTsKLSAgICBpZiAoIW5vZGUpCi0gICAg
ICAgIHJldHVybiAwOwotCi0gICAgTm9kZSogc2hhZG93QW5jZXN0b3JOb2RlID0gYW5jZXN0b3JJ
blRoaXNTY29wZShub2RlKTsKLSAgICBpZiAoc2hhZG93QW5jZXN0b3JOb2RlICE9IG5vZGUpIHsK
LSAgICAgICAgdW5zaWduZWQgb2Zmc2V0ID0gc2hhZG93QW5jZXN0b3JOb2RlLT5ub2RlSW5kZXgo
KTsKLSAgICAgICAgQ29udGFpbmVyTm9kZSogY29udGFpbmVyID0gc2hhZG93QW5jZXN0b3JOb2Rl
LT5wYXJlbnROb2RlKCk7Ci0gICAgICAgIHJldHVybiBSYW5nZTo6Y3JlYXRlKHRoaXMsIGNvbnRh
aW5lciwgb2Zmc2V0LCBjb250YWluZXIsIG9mZnNldCk7Ci0gICAgfQotCi0gICAgUmVuZGVyT2Jq
ZWN0KiByZW5kZXJlciA9IG5vZGUtPnJlbmRlcmVyKCk7Ci0gICAgaWYgKCFyZW5kZXJlcikKLSAg
ICAgICAgcmV0dXJuIDA7Ci0gICAgVmlzaWJsZVBvc2l0aW9uIHZpc2libGVQb3NpdGlvbiA9IHJl
bmRlcmVyLT5wb3NpdGlvbkZvclBvaW50KGxvY2FsUG9pbnQpOwotICAgIGlmICh2aXNpYmxlUG9z
aXRpb24uaXNOdWxsKCkpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgUG9zaXRpb24gcmFuZ2VD
b21wbGlhbnRQb3NpdGlvbiA9IHZpc2libGVQb3NpdGlvbi5kZWVwRXF1aXZhbGVudCgpLnBhcmVu
dEFuY2hvcmVkRXF1aXZhbGVudCgpOwotICAgIHJldHVybiBSYW5nZTo6Y3JlYXRlKHRoaXMsIHJh
bmdlQ29tcGxpYW50UG9zaXRpb24sIHJhbmdlQ29tcGxpYW50UG9zaXRpb24pOwotfQotCi0vKgot
ICogUGVyZm9ybXMgdGhyZWUgb3BlcmF0aW9uczoKLSAqICAxLiBDb252ZXJ0IGNvbnRyb2wgY2hh
cmFjdGVycyB0byBzcGFjZXMKLSAqICAyLiBUcmltIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNl
cwotICogIDMuIENvbGxhcHNlIGludGVybmFsIHdoaXRlc3BhY2UuCi0gKi8KLXN0YXRpYyBpbmxp
bmUgU3RyaW5nV2l0aERpcmVjdGlvbiBjYW5vbmljYWxpemVkVGl0bGUoRG9jdW1lbnQqIGRvY3Vt
ZW50LCBjb25zdCBTdHJpbmdXaXRoRGlyZWN0aW9uJiB0aXRsZVdpdGhEaXJlY3Rpb24pCi17Ci0g
ICAgY29uc3QgU3RyaW5nJiB0aXRsZSA9IHRpdGxlV2l0aERpcmVjdGlvbi5zdHJpbmcoKTsKLSAg
ICBjb25zdCBVQ2hhciogY2hhcmFjdGVycyA9IHRpdGxlLmNoYXJhY3RlcnMoKTsKLSAgICB1bnNp
Z25lZCBsZW5ndGggPSB0aXRsZS5sZW5ndGgoKTsKLSAgICB1bnNpZ25lZCBpOwotCi0gICAgU3Ry
aW5nQnVmZmVyPFVDaGFyPiBidWZmZXIobGVuZ3RoKTsKLSAgICB1bnNpZ25lZCBidWlsZGVySW5k
ZXggPSAwOwotCi0gICAgLy8gU2tpcCBsZWFkaW5nIHNwYWNlcyBhbmQgbGVhZGluZyBjaGFyYWN0
ZXJzIHRoYXQgd291bGQgY29udmVydCB0byBzcGFjZXMKLSAgICBmb3IgKGkgPSAwOyBpIDwgbGVu
Z3RoOyArK2kpIHsKLSAgICAgICAgVUNoYXIgYyA9IGNoYXJhY3RlcnNbaV07Ci0gICAgICAgIGlm
ICghKGMgPD0gMHgyMCB8fCBjID09IDB4N0YpKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQot
Ci0gICAgaWYgKGkgPT0gbGVuZ3RoKQotICAgICAgICByZXR1cm4gU3RyaW5nV2l0aERpcmVjdGlv
bigpOwotCi0gICAgLy8gUmVwbGFjZSBjb250cm9sIGNoYXJhY3RlcnMgd2l0aCBzcGFjZXMsIGFu
ZCBiYWNrc2xhc2hlcyB3aXRoIGN1cnJlbmN5IHN5bWJvbHMsIGFuZCBjb2xsYXBzZSB3aGl0ZXNw
YWNlLgotICAgIGJvb2wgcHJldmlvdXNDaGFyV2FzV1MgPSBmYWxzZTsKLSAgICBmb3IgKDsgaSA8
IGxlbmd0aDsgKytpKSB7Ci0gICAgICAgIFVDaGFyIGMgPSBjaGFyYWN0ZXJzW2ldOwotICAgICAg
ICBpZiAoYyA8PSAweDIwIHx8IGMgPT0gMHg3RiB8fCAoV1RGOjpVbmljb2RlOjpjYXRlZ29yeShj
KSAmIChXVEY6OlVuaWNvZGU6OlNlcGFyYXRvcl9MaW5lIHwgV1RGOjpVbmljb2RlOjpTZXBhcmF0
b3JfUGFyYWdyYXBoKSkpIHsKLSAgICAgICAgICAgIGlmIChwcmV2aW91c0NoYXJXYXNXUykKLSAg
ICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGJ1ZmZlcltidWlsZGVySW5kZXgr
K10gPSAnICc7Ci0gICAgICAgICAgICBwcmV2aW91c0NoYXJXYXNXUyA9IHRydWU7Ci0gICAgICAg
IH0gZWxzZSB7Ci0gICAgICAgICAgICBidWZmZXJbYnVpbGRlckluZGV4KytdID0gYzsKLSAgICAg
ICAgICAgIHByZXZpb3VzQ2hhcldhc1dTID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAg
ICAvLyBTdHJpcCB0cmFpbGluZyBzcGFjZXMKLSAgICB3aGlsZSAoYnVpbGRlckluZGV4ID4gMCkg
ewotICAgICAgICAtLWJ1aWxkZXJJbmRleDsKLSAgICAgICAgaWYgKGJ1ZmZlcltidWlsZGVySW5k
ZXhdICE9ICcgJykKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmICghYnVpbGRl
ckluZGV4ICYmIGJ1ZmZlcltidWlsZGVySW5kZXhdID09ICcgJykKLSAgICAgICAgcmV0dXJuIFN0
cmluZ1dpdGhEaXJlY3Rpb24oKTsKLQotICAgIGJ1ZmZlci5zaHJpbmsoYnVpbGRlckluZGV4ICsg
MSk7Ci0KLSAgICAvLyBSZXBsYWNlIHRoZSBiYWNrc2xhc2hlcyB3aXRoIGN1cnJlbmN5IHN5bWJv
bHMgaWYgdGhlIGVuY29kaW5nIHJlcXVpcmVzIGl0LgotICAgIGRvY3VtZW50LT5kaXNwbGF5QnVm
ZmVyTW9kaWZpZWRCeUVuY29kaW5nKGJ1ZmZlci5jaGFyYWN0ZXJzKCksIGJ1ZmZlci5sZW5ndGgo
KSk7Ci0gICAgCi0gICAgcmV0dXJuIFN0cmluZ1dpdGhEaXJlY3Rpb24oU3RyaW5nOjphZG9wdChi
dWZmZXIpLCB0aXRsZVdpdGhEaXJlY3Rpb24uZGlyZWN0aW9uKCkpOwotfQotCi12b2lkIERvY3Vt
ZW50Ojp1cGRhdGVUaXRsZShjb25zdCBTdHJpbmdXaXRoRGlyZWN0aW9uJiB0aXRsZSkKLXsKLSAg
ICBpZiAobV9yYXdUaXRsZSA9PSB0aXRsZSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9yYXdU
aXRsZSA9IHRpdGxlOwotICAgIG1fdGl0bGUgPSBjYW5vbmljYWxpemVkVGl0bGUodGhpcywgbV9y
YXdUaXRsZSk7Ci0gICAgaWYgKEZyYW1lKiBmID0gZnJhbWUoKSkKLSAgICAgICAgZi0+bG9hZGVy
KCktPnNldFRpdGxlKG1fdGl0bGUpOwotfQotCi12b2lkIERvY3VtZW50OjpzZXRUaXRsZShjb25z
dCBTdHJpbmcmIHRpdGxlKQotewotICAgIC8vIFRpdGxlIHNldCBieSBKYXZhU2NyaXB0IC0tIG92
ZXJyaWRlcyBhbnkgdGl0bGUgZWxlbWVudHMuCi0gICAgbV90aXRsZVNldEV4cGxpY2l0bHkgPSB0
cnVlOwotICAgIGlmICghaXNIVE1MRG9jdW1lbnQoKSAmJiAhaXNYSFRNTERvY3VtZW50KCkpCi0g
ICAgICAgIG1fdGl0bGVFbGVtZW50ID0gMDsKLSAgICBlbHNlIGlmICghbV90aXRsZUVsZW1lbnQp
IHsKLSAgICAgICAgaWYgKEhUTUxFbGVtZW50KiBoZWFkRWxlbWVudCA9IGhlYWQoKSkgewotICAg
ICAgICAgICAgbV90aXRsZUVsZW1lbnQgPSBjcmVhdGVFbGVtZW50KHRpdGxlVGFnLCBmYWxzZSk7
Ci0gICAgICAgICAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKLSAgICAgICAgICAgIGhlYWRFbGVt
ZW50LT5hcHBlbmRDaGlsZChtX3RpdGxlRWxlbWVudCwgZWMpOwotICAgICAgICAgICAgQVNTRVJU
KCFlYyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUaGUgRE9NIEFQSSBoYXMgbm8gbWV0
aG9kIG9mIHNwZWNpZnlpbmcgZGlyZWN0aW9uLCBzbyBhc3N1bWUgTFRSLgotICAgIHVwZGF0ZVRp
dGxlKFN0cmluZ1dpdGhEaXJlY3Rpb24odGl0bGUsIExUUikpOwotCi0gICAgaWYgKG1fdGl0bGVF
bGVtZW50KSB7Ci0gICAgICAgIEFTU0VSVChtX3RpdGxlRWxlbWVudC0+aGFzVGFnTmFtZSh0aXRs
ZVRhZykpOwotICAgICAgICBpZiAobV90aXRsZUVsZW1lbnQtPmhhc1RhZ05hbWUodGl0bGVUYWcp
KQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTFRpdGxlRWxlbWVudCo+KG1fdGl0bGVFbGVt
ZW50LmdldCgpKS0+c2V0VGV4dCh0aXRsZSk7Ci0gICAgfQotfQotCi12b2lkIERvY3VtZW50Ojpz
ZXRUaXRsZUVsZW1lbnQoY29uc3QgU3RyaW5nV2l0aERpcmVjdGlvbiYgdGl0bGUsIEVsZW1lbnQq
IHRpdGxlRWxlbWVudCkKLXsKLSAgICBpZiAodGl0bGVFbGVtZW50ICE9IG1fdGl0bGVFbGVtZW50
KSB7Ci0gICAgICAgIGlmIChtX3RpdGxlRWxlbWVudCB8fCBtX3RpdGxlU2V0RXhwbGljaXRseSkK
LSAgICAgICAgICAgIC8vIE9ubHkgYWxsb3cgdGhlIGZpcnN0IHRpdGxlIGVsZW1lbnQgdG8gY2hh
bmdlIHRoZSB0aXRsZSAtLSBvdGhlcnMgaGF2ZSBubyBlZmZlY3QuCi0gICAgICAgICAgICByZXR1
cm47Ci0gICAgICAgIG1fdGl0bGVFbGVtZW50ID0gdGl0bGVFbGVtZW50OwotICAgIH0KLQotICAg
IHVwZGF0ZVRpdGxlKHRpdGxlKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6cmVtb3ZlVGl0bGUoRWxl
bWVudCogdGl0bGVFbGVtZW50KQotewotICAgIGlmIChtX3RpdGxlRWxlbWVudCAhPSB0aXRsZUVs
ZW1lbnQpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fdGl0bGVFbGVtZW50ID0gMDsKLSAgICBt
X3RpdGxlU2V0RXhwbGljaXRseSA9IGZhbHNlOwotCi0gICAgLy8gVXBkYXRlIHRpdGxlIGJhc2Vk
IG9uIGZpcnN0IHRpdGxlIGVsZW1lbnQgaW4gdGhlIGhlYWQsIGlmIG9uZSBleGlzdHMuCi0gICAg
aWYgKEhUTUxFbGVtZW50KiBoZWFkRWxlbWVudCA9IGhlYWQoKSkgewotICAgICAgICBmb3IgKE5v
ZGUqIGUgPSBoZWFkRWxlbWVudC0+Zmlyc3RDaGlsZCgpOyBlOyBlID0gZS0+bmV4dFNpYmxpbmco
KSkKLSAgICAgICAgICAgIGlmIChlLT5oYXNUYWdOYW1lKHRpdGxlVGFnKSkgewotICAgICAgICAg
ICAgICAgIEhUTUxUaXRsZUVsZW1lbnQqIHRpdGxlRWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxU
aXRsZUVsZW1lbnQqPihlKTsKLSAgICAgICAgICAgICAgICBzZXRUaXRsZUVsZW1lbnQodGl0bGVF
bGVtZW50LT50ZXh0V2l0aERpcmVjdGlvbigpLCB0aXRsZUVsZW1lbnQpOwotICAgICAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgIH0KLQotICAgIGlmICghbV90aXRsZUVsZW1l
bnQpCi0gICAgICAgIHVwZGF0ZVRpdGxlKFN0cmluZ1dpdGhEaXJlY3Rpb24oKSk7Ci19Ci0KLSNp
ZiBFTkFCTEUoUEFHRV9WSVNJQklMSVRZX0FQSSkKLVBhZ2VWaXNpYmlsaXR5U3RhdGUgRG9jdW1l
bnQ6OnZpc2liaWxpdHlTdGF0ZSgpIGNvbnN0Ci17Ci0gICAgLy8gVGhlIHZpc2liaWxpdHkgb2Yg
dGhlIGRvY3VtZW50IGlzIGluaGVyaXRlZCBmcm9tIHRoZSB2aXNpYmlsaXR5IG9mIHRoZQotICAg
IC8vIHBhZ2UuIElmIHRoZXJlIGlzIG5vIHBhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBkb2N1bWVu
dCwgd2Ugd2lsbCBhc3N1bWUKLSAgICAvLyB0aGF0IHRoZSBwYWdlIGlzIHZpc2libGUgaS5lLiBp
bnZpc2liaWxpdHkgaGFzIHRvIGJlIGV4cGxpY2l0bHkKLSAgICAvLyBzcGVjaWZpZWQgYnkgdGhl
IGVtYmVkZGVyLgotICAgIGlmICghbV9mcmFtZSB8fCAhbV9mcmFtZS0+cGFnZSgpKQotICAgICAg
ICByZXR1cm4gUGFnZVZpc2liaWxpdHlTdGF0ZVZpc2libGU7Ci0gICAgcmV0dXJuIG1fZnJhbWUt
PnBhZ2UoKS0+dmlzaWJpbGl0eVN0YXRlKCk7Ci19Ci0KLVN0cmluZyBEb2N1bWVudDo6d2Via2l0
VmlzaWJpbGl0eVN0YXRlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gcGFnZVZpc2liaWxpdHlTdGF0
ZVN0cmluZyh2aXNpYmlsaXR5U3RhdGUoKSk7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6OndlYmtpdEhp
ZGRlbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHZpc2liaWxpdHlTdGF0ZSgpICE9IFBhZ2VWaXNp
YmlsaXR5U3RhdGVWaXNpYmxlOwotfQotCi12b2lkIERvY3VtZW50OjpkaXNwYXRjaFZpc2liaWxp
dHlTdGF0ZUNoYW5nZUV2ZW50KCkKLXsKLSAgICBkaXNwYXRjaEV2ZW50KEV2ZW50OjpjcmVhdGUo
ZXZlbnROYW1lcygpLndlYmtpdHZpc2liaWxpdHljaGFuZ2VFdmVudCwgZmFsc2UsIGZhbHNlKSk7
Ci19Ci0jZW5kaWYKLQotI2lmIEVOQUJMRShDU1BfTkVYVCkKLURPTVNlY3VyaXR5UG9saWN5KiBE
b2N1bWVudDo6c2VjdXJpdHlQb2xpY3koKQotewotICAgIGlmICghbV9kb21TZWN1cml0eVBvbGlj
eSkKLSAgICAgICAgbV9kb21TZWN1cml0eVBvbGljeSA9IERPTVNlY3VyaXR5UG9saWN5OjpjcmVh
dGUodGhpcyk7Ci0gICAgcmV0dXJuIG1fZG9tU2VjdXJpdHlQb2xpY3kuZ2V0KCk7Ci19Ci0jZW5k
aWYKLQotU3RyaW5nIERvY3VtZW50Ojpub2RlTmFtZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICIj
ZG9jdW1lbnQiOwotfQotCi1Ob2RlOjpOb2RlVHlwZSBEb2N1bWVudDo6bm9kZVR5cGUoKSBjb25z
dAotewotICAgIHJldHVybiBET0NVTUVOVF9OT0RFOwotfQotCi1Gb3JtQ29udHJvbGxlciogRG9j
dW1lbnQ6OmZvcm1Db250cm9sbGVyKCkKLXsKLSAgICBpZiAoIW1fZm9ybUNvbnRyb2xsZXIpCi0g
ICAgICAgIG1fZm9ybUNvbnRyb2xsZXIgPSBGb3JtQ29udHJvbGxlcjo6Y3JlYXRlKCk7Ci0gICAg
cmV0dXJuIG1fZm9ybUNvbnRyb2xsZXIuZ2V0KCk7Ci19Ci0KLVZlY3RvcjxTdHJpbmc+IERvY3Vt
ZW50Ojpmb3JtRWxlbWVudHNTdGF0ZSgpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX2Zvcm1Db250cm9s
bGVyKQotICAgICAgICByZXR1cm4gVmVjdG9yPFN0cmluZz4oKTsKLSAgICByZXR1cm4gbV9mb3Jt
Q29udHJvbGxlci0+Zm9ybUVsZW1lbnRzU3RhdGUoKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6c2V0
U3RhdGVGb3JOZXdGb3JtRWxlbWVudHMoY29uc3QgVmVjdG9yPFN0cmluZz4mIHN0YXRlVmVjdG9y
KQotewotICAgIGlmICghc3RhdGVWZWN0b3Iuc2l6ZSgpICYmICFtX2Zvcm1Db250cm9sbGVyKQot
ICAgICAgICByZXR1cm47Ci0gICAgZm9ybUNvbnRyb2xsZXIoKS0+c2V0U3RhdGVGb3JOZXdGb3Jt
RWxlbWVudHMoc3RhdGVWZWN0b3IpOwotfQotCi1GcmFtZVZpZXcqIERvY3VtZW50Ojp2aWV3KCkg
Y29uc3QKLXsKLSAgICByZXR1cm4gbV9mcmFtZSA/IG1fZnJhbWUtPnZpZXcoKSA6IDA7Ci19Ci0K
LVBhZ2UqIERvY3VtZW50OjpwYWdlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9mcmFtZSA/IG1f
ZnJhbWUtPnBhZ2UoKSA6IDA7ICAgIAotfQotCi1TZXR0aW5ncyogRG9jdW1lbnQ6OnNldHRpbmdz
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9mcmFtZSA/IG1fZnJhbWUtPnNldHRpbmdzKCkgOiAw
OwotfQotCi1QYXNzUmVmUHRyPFJhbmdlPiBEb2N1bWVudDo6Y3JlYXRlUmFuZ2UoKQotewotICAg
IHJldHVybiBSYW5nZTo6Y3JlYXRlKHRoaXMpOwotfQotCi1QYXNzUmVmUHRyPE5vZGVJdGVyYXRv
cj4gRG9jdW1lbnQ6OmNyZWF0ZU5vZGVJdGVyYXRvcihOb2RlKiByb290LCB1bnNpZ25lZCB3aGF0
VG9TaG93LCAKLSAgICBQYXNzUmVmUHRyPE5vZGVGaWx0ZXI+IGZpbHRlciwgYm9vbCBleHBhbmRF
bnRpdHlSZWZlcmVuY2VzLCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICBpZiAoIXJvb3QpIHsK
LSAgICAgICAgZWMgPSBOT1RfU1VQUE9SVEVEX0VSUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAg
fQotICAgIHJldHVybiBOb2RlSXRlcmF0b3I6OmNyZWF0ZShyb290LCB3aGF0VG9TaG93LCBmaWx0
ZXIsIGV4cGFuZEVudGl0eVJlZmVyZW5jZXMpOwotfQotCi1QYXNzUmVmUHRyPFRyZWVXYWxrZXI+
IERvY3VtZW50OjpjcmVhdGVUcmVlV2Fsa2VyKE5vZGUqIHJvb3QsIHVuc2lnbmVkIHdoYXRUb1No
b3csIAotICAgIFBhc3NSZWZQdHI8Tm9kZUZpbHRlcj4gZmlsdGVyLCBib29sIGV4cGFuZEVudGl0
eVJlZmVyZW5jZXMsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIGlmICghcm9vdCkgewotICAg
ICAgICBlYyA9IE5PVF9TVVBQT1JURURfRVJSOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0g
ICAgcmV0dXJuIFRyZWVXYWxrZXI6OmNyZWF0ZShyb290LCB3aGF0VG9TaG93LCBmaWx0ZXIsIGV4
cGFuZEVudGl0eVJlZmVyZW5jZXMpOwotfQotCi12b2lkIERvY3VtZW50OjpzY2hlZHVsZUZvcmNl
ZFN0eWxlUmVjYWxjKCkKLXsKLSAgICBtX3BlbmRpbmdTdHlsZVJlY2FsY1Nob3VsZEZvcmNlID0g
dHJ1ZTsKLSAgICBzY2hlZHVsZVN0eWxlUmVjYWxjKCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnNj
aGVkdWxlU3R5bGVSZWNhbGMoKQotewotICAgIGlmIChzaG91bGREaXNwbGF5U2VhbWxlc3NseVdp
dGhQYXJlbnQoKSkgewotICAgICAgICAvLyBXaGVuIHdlJ3JlIHNlYW1sZXNzLCBvdXIgcGFyZW50
IGRvY3VtZW50IG1hbmFnZXMgb3VyIHN0eWxlIHJlY2FsY3MuCi0gICAgICAgIG93bmVyRWxlbWVu
dCgpLT5zZXROZWVkc1N0eWxlUmVjYWxjKCk7Ci0gICAgICAgIG93bmVyRWxlbWVudCgpLT5kb2N1
bWVudCgpLT5zY2hlZHVsZVN0eWxlUmVjYWxjKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0K
LSAgICBpZiAobV9zdHlsZVJlY2FsY1RpbWVyLmlzQWN0aXZlKCkgfHwgaW5QYWdlQ2FjaGUoKSkK
LSAgICAgICAgcmV0dXJuOwotCi0gICAgQVNTRVJUKGNoaWxkTmVlZHNTdHlsZVJlY2FsYygpIHx8
IG1fcGVuZGluZ1N0eWxlUmVjYWxjU2hvdWxkRm9yY2UpOwotCi0gICAgaWYgKCFkb2N1bWVudHNU
aGF0TmVlZFN0eWxlUmVjYWxjKQotICAgICAgICBkb2N1bWVudHNUaGF0TmVlZFN0eWxlUmVjYWxj
ID0gbmV3IEhhc2hTZXQ8RG9jdW1lbnQqPjsKLSAgICBkb2N1bWVudHNUaGF0TmVlZFN0eWxlUmVj
YWxjLT5hZGQodGhpcyk7Ci0gICAgCi0gICAgLy8gRklYTUU6IFdoeSBvbiBlYXJ0aCBpcyB0aGlz
IGhlcmU/IFRoaXMgaXMgY2xlYXJseSBtaXNwbGFjZWQuCi0gICAgaW52YWxpZGF0ZUFjY2Vzc0tl
eU1hcCgpOwotICAgIAotICAgIG1fc3R5bGVSZWNhbGNUaW1lci5zdGFydE9uZVNob3QoMCk7Ci0K
LSAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZFNjaGVkdWxlU3R5bGVSZWNhbGN1bGF0
aW9uKHRoaXMpOwotfQotCi12b2lkIERvY3VtZW50Ojp1bnNjaGVkdWxlU3R5bGVSZWNhbGMoKQot
ewotICAgIEFTU0VSVCghY2hpbGROZWVkc1N0eWxlUmVjYWxjKCkpOwotCi0gICAgaWYgKGRvY3Vt
ZW50c1RoYXROZWVkU3R5bGVSZWNhbGMpCi0gICAgICAgIGRvY3VtZW50c1RoYXROZWVkU3R5bGVS
ZWNhbGMtPnJlbW92ZSh0aGlzKTsKLQotICAgIG1fc3R5bGVSZWNhbGNUaW1lci5zdG9wKCk7Ci0g
ICAgbV9wZW5kaW5nU3R5bGVSZWNhbGNTaG91bGRGb3JjZSA9IGZhbHNlOwotfQotCi1ib29sIERv
Y3VtZW50Ojppc1BlbmRpbmdTdHlsZVJlY2FsYygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fc3R5
bGVSZWNhbGNUaW1lci5pc0FjdGl2ZSgpICYmICFtX2luU3R5bGVSZWNhbGM7Ci19Ci0KLXZvaWQg
RG9jdW1lbnQ6OnN0eWxlUmVjYWxjVGltZXJGaXJlZChUaW1lcjxEb2N1bWVudD4qKQotewotICAg
IHVwZGF0ZVN0eWxlSWZOZWVkZWQoKTsKLX0KLQotYm9vbCBEb2N1bWVudDo6Y2hpbGROZWVkc0Fu
ZE5vdEluU3R5bGVSZWNhbGMoKQotewotICAgIHJldHVybiBjaGlsZE5lZWRzU3R5bGVSZWNhbGMo
KSAmJiAhbV9pblN0eWxlUmVjYWxjOwotfQotCi12b2lkIERvY3VtZW50OjpyZWNhbGNTdHlsZShT
dHlsZUNoYW5nZSBjaGFuZ2UpCi17Ci0gICAgLy8gd2Ugc2hvdWxkIG5vdCBlbnRlciBzdHlsZSBy
ZWNhbGMgd2hpbGUgcGFpbnRpbmcKLSAgICBBU1NFUlQoIXZpZXcoKSB8fCAhdmlldygpLT5pc1Bh
aW50aW5nKCkpOwotICAgIGlmICh2aWV3KCkgJiYgdmlldygpLT5pc1BhaW50aW5nKCkpCi0gICAg
ICAgIHJldHVybjsKLSAgICAKLSAgICBpZiAobV9pblN0eWxlUmVjYWxjKQotICAgICAgICByZXR1
cm47IC8vIEd1YXJkIGFnYWluc3QgcmUtZW50cmFuY3kuIC1kd2gKLQotICAgIC8vIEZJWE1FOiBX
ZSBzaG91bGQgdXBkYXRlIHN0eWxlIG9uIG91ciBhbmNlc3RvciBjaGFpbiBiZWZvcmUgcHJvY2Vl
ZGluZyAoZXNwZWNpYWxseSBmb3Igc2VhbWxlc3MpLAotICAgIC8vIGhvd2V2ZXIgZG9pbmcgc28g
Y3VycmVudGx5IGNhdXNlcyBzZXZlcmFsIHRlc3RzIHRvIGNyYXNoLCBhcyBGcmFtZTo6c2V0RG9j
dW1lbnQgY2FsbHMgRG9jdW1lbnQ6OmF0dGFjaAotICAgIC8vIGJlZm9yZSBzZXR0aW5nIHRoZSBE
T01XaW5kb3cgb24gdGhlIEZyYW1lLCBvciB0aGUgU2VjdXJpdHlPcmlnaW4gb24gdGhlIGRvY3Vt
ZW50LiBUaGUgYXR0YWNoLCBpbiB0dXJuCi0gICAgLy8gcmVzb2x2ZXMgc3R5bGUgKGhlcmUpIGFu
ZCB0aGVuIHdoZW4gd2UgcmVzb2x2ZSBzdHlsZSBvbiB0aGUgcGFyZW50IGNoYWluLCB3ZSBtYXkg
ZW5kIHVwCi0gICAgLy8gcmUtYXR0YWNoaW5nIG91ciBjb250YWluaW5nIGlmcmFtZSwgd2hpY2gg
d2hlbiBhc2tlZCBIVE1MRnJhbWVFbGVtZW50QmFzZTo6aXNVUkxBbGxvd2VkCi0gICAgLy8gaGl0
cyBhIG51bGwtZGVyZWZlcmVuY2UgZHVlIHRvIHNlY3VyaXR5IGNvZGUgYWx3YXlzIGFzc3VtaW5n
IHRoZSBkb2N1bWVudCBoYXMgYSBTZWN1cml0eU9yaWdpbi4KLQotICAgIGlmIChtX2hhc0RpcnR5
U3R5bGVSZXNvbHZlcikKLSAgICAgICAgdXBkYXRlQWN0aXZlU3R5bGVzaGVldHMoUmVjYWxjU3R5
bGVJbW1lZGlhdGVseSk7Ci0KLSAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUgY29v
a2llID0gSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjp3aWxsUmVjYWxjdWxhdGVTdHlsZSh0aGlz
KTsKLQotICAgIGlmIChtX2VsZW1TaGVldCAmJiBtX2VsZW1TaGVldC0+Y29udGVudHMoKS0+dXNl
c1JlbVVuaXRzKCkpCi0gICAgICAgIG1fdXNlc1JlbVVuaXRzID0gdHJ1ZTsKLQotICAgIG1faW5T
dHlsZVJlY2FsYyA9IHRydWU7Ci0gICAgc3VzcGVuZFBvc3RBdHRhY2hDYWxsYmFja3MoKTsKLSAg
ICBSZW5kZXJXaWRnZXQ6OnN1c3BlbmRXaWRnZXRIaWVyYXJjaHlVcGRhdGVzKCk7Ci0gICAgCi0g
ICAgUmVmUHRyPEZyYW1lVmlldz4gZnJhbWVWaWV3ID0gdmlldygpOwotICAgIGlmIChmcmFtZVZp
ZXcpIHsKLSAgICAgICAgZnJhbWVWaWV3LT5wYXVzZVNjaGVkdWxlZEV2ZW50cygpOwotICAgICAg
ICBmcmFtZVZpZXctPmJlZ2luRGVmZXJyZWRSZXBhaW50cygpOwotICAgIH0KLQotICAgIEFTU0VS
VCghcmVuZGVyZXIoKSB8fCByZW5kZXJBcmVuYSgpKTsKLSAgICBpZiAoIXJlbmRlcmVyKCkgfHwg
IXJlbmRlckFyZW5hKCkpCi0gICAgICAgIGdvdG8gYmFpbF9vdXQ7Ci0KLSAgICBpZiAobV9wZW5k
aW5nU3R5bGVSZWNhbGNTaG91bGRGb3JjZSkKLSAgICAgICAgY2hhbmdlID0gRm9yY2U7Ci0KLSAg
ICAvLyBSZWNhbGN1bGF0aW5nIHRoZSByb290IHN0eWxlIChvbiB0aGUgZG9jdW1lbnQpIGlzIG5v
dCBuZWVkZWQgaW4gdGhlIGNvbW1vbiBjYXNlLgotICAgIGlmICgoY2hhbmdlID09IEZvcmNlKSB8
fCAoc2hvdWxkRGlzcGxheVNlYW1sZXNzbHlXaXRoUGFyZW50KCkgJiYgKGNoYW5nZSA+PSBJbmhl
cml0KSkpIHsKLSAgICAgICAgLy8gc3R5bGUgc2VsZWN0b3IgbWF5IHNldCB0aGlzIGFnYWluIGR1
cmluZyByZWNhbGMKLSAgICAgICAgbV9oYXNOb2Rlc1dpdGhQbGFjZWhvbGRlclN0eWxlID0gZmFs
c2U7Ci0gICAgICAgIAotICAgICAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IGRvY3VtZW50U3R5bGUg
PSBTdHlsZVJlc29sdmVyOjpzdHlsZUZvckRvY3VtZW50KHRoaXMsIG1fc3R5bGVSZXNvbHZlciA/
IG1fc3R5bGVSZXNvbHZlci0+Zm9udFNlbGVjdG9yKCkgOiAwKTsKLSAgICAgICAgU3R5bGVDaGFu
Z2UgY2ggPSBOb2RlOjpkaWZmKGRvY3VtZW50U3R5bGUuZ2V0KCksIHJlbmRlcmVyKCktPnN0eWxl
KCksIHRoaXMpOwotICAgICAgICBpZiAoY2ggIT0gTm9DaGFuZ2UpCi0gICAgICAgICAgICByZW5k
ZXJlcigpLT5zZXRTdHlsZShkb2N1bWVudFN0eWxlLnJlbGVhc2UoKSk7Ci0gICAgfQotCi0gICAg
Zm9yIChOb2RlKiBuID0gZmlyc3RDaGlsZCgpOyBuOyBuID0gbi0+bmV4dFNpYmxpbmcoKSkgewot
ICAgICAgICBpZiAoIW4tPmlzRWxlbWVudE5vZGUoKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwot
ICAgICAgICBFbGVtZW50KiBlbGVtZW50ID0gc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG4pOwotICAg
ICAgICBpZiAoY2hhbmdlID49IEluaGVyaXQgfHwgZWxlbWVudC0+Y2hpbGROZWVkc1N0eWxlUmVj
YWxjKCkgfHwgZWxlbWVudC0+bmVlZHNTdHlsZVJlY2FsYygpKQotICAgICAgICAgICAgZWxlbWVu
dC0+cmVjYWxjU3R5bGUoY2hhbmdlKTsKLSAgICB9Ci0KLSNpZiBVU0UoQUNDRUxFUkFURURfQ09N
UE9TSVRJTkcpCi0gICAgaWYgKHZpZXcoKSkgewotICAgICAgICBib29sIGxheW91dFBlbmRpbmcg
PSB2aWV3KCktPmxheW91dFBlbmRpbmcoKSB8fCByZW5kZXJlcigpLT5uZWVkc0xheW91dCgpOwot
ICAgICAgICAvLyBJZiB3ZSBkaWRuJ3QgdXBkYXRlIGNvbXBvc2l0aW5nIGxheWVycyBiZWNhdXNl
IG9mIGxheW91dCgpLCB3ZSBuZWVkIHRvIGRvIHNvIGhlcmUuCi0gICAgICAgIGlmICghbGF5b3V0
UGVuZGluZykKLSAgICAgICAgICAgIHZpZXcoKS0+dXBkYXRlQ29tcG9zaXRpbmdMYXllcnNBZnRl
clN0eWxlQ2hhbmdlKCk7Ci0gICAgfQotI2VuZGlmCi0KLWJhaWxfb3V0OgotICAgIGNsZWFyTmVl
ZHNTdHlsZVJlY2FsYygpOwotICAgIGNsZWFyQ2hpbGROZWVkc1N0eWxlUmVjYWxjKCk7Ci0gICAg
dW5zY2hlZHVsZVN0eWxlUmVjYWxjKCk7Ci0KLSAgICBtX2luU3R5bGVSZWNhbGMgPSBmYWxzZTsK
LSAgICAKLSAgICAvLyBQc2V1ZG8gZWxlbWVudCByZW1vdmFsIGFuZCBzaW1pbGFyIG1heSBvbmx5
IHdvcmsgd2l0aCB0aGVzZSBmbGFncyBzdGlsbCBzZXQuIFJlc2V0IHRoZW0gYWZ0ZXIgdGhlIHN0
eWxlIHJlY2FsYy4KLSAgICBpZiAobV9zdHlsZVJlc29sdmVyKQotICAgICAgICByZXNldENTU0Zl
YXR1cmVGbGFncygpOwotCi0gICAgaWYgKGZyYW1lVmlldykgewotICAgICAgICBmcmFtZVZpZXct
PnJlc3VtZVNjaGVkdWxlZEV2ZW50cygpOwotICAgICAgICBmcmFtZVZpZXctPmVuZERlZmVycmVk
UmVwYWludHMoKTsKLSAgICB9Ci0gICAgUmVuZGVyV2lkZ2V0OjpyZXN1bWVXaWRnZXRIaWVyYXJj
aHlVcGRhdGVzKCk7Ci0gICAgcmVzdW1lUG9zdEF0dGFjaENhbGxiYWNrcygpOwotCi0gICAgLy8g
SWYgd2Ugd2FudGVkIHRvIGNhbGwgaW1wbGljaXRDbG9zZSgpIGR1cmluZyByZWNhbGNTdHlsZSwg
ZG8gc28gbm93IHRoYXQgd2UncmUgZmluaXNoZWQuCi0gICAgaWYgKG1fY2xvc2VBZnRlclN0eWxl
UmVjYWxjKSB7Ci0gICAgICAgIG1fY2xvc2VBZnRlclN0eWxlUmVjYWxjID0gZmFsc2U7Ci0gICAg
ICAgIGltcGxpY2l0Q2xvc2UoKTsKLSAgICB9Ci0KLSAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRp
b246OmRpZFJlY2FsY3VsYXRlU3R5bGUoY29va2llKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6dXBk
YXRlU3R5bGVJZk5lZWRlZCgpCi17Ci0gICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKLSAgICBB
U1NFUlQoIXZpZXcoKSB8fCAoIXZpZXcoKS0+aXNJbkxheW91dCgpICYmICF2aWV3KCktPmlzUGFp
bnRpbmcoKSkpOwotICAgIAotICAgIGlmICgoIW1fcGVuZGluZ1N0eWxlUmVjYWxjU2hvdWxkRm9y
Y2UgJiYgIWNoaWxkTmVlZHNTdHlsZVJlY2FsYygpKSB8fCBpblBhZ2VDYWNoZSgpKQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBBbmltYXRpb25VcGRhdGVCbG9jayBhbmltYXRpb25VcGRhdGVCbG9j
ayhtX2ZyYW1lID8gbV9mcmFtZS0+YW5pbWF0aW9uKCkgOiAwKTsKLSAgICByZWNhbGNTdHlsZShO
b0NoYW5nZSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnVwZGF0ZVN0eWxlRm9yQWxsRG9jdW1lbnRz
KCkKLXsKLSAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOwotICAgIGlmICghZG9jdW1lbnRzVGhh
dE5lZWRTdHlsZVJlY2FsYykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgd2hpbGUgKGRvY3VtZW50
c1RoYXROZWVkU3R5bGVSZWNhbGMtPnNpemUoKSkgewotICAgICAgICBIYXNoU2V0PERvY3VtZW50
Kj46Oml0ZXJhdG9yIGl0ID0gZG9jdW1lbnRzVGhhdE5lZWRTdHlsZVJlY2FsYy0+YmVnaW4oKTsK
LSAgICAgICAgRG9jdW1lbnQqIGRvYyA9ICppdDsKLSAgICAgICAgZG9jdW1lbnRzVGhhdE5lZWRT
dHlsZVJlY2FsYy0+cmVtb3ZlKGRvYyk7Ci0gICAgICAgIGRvYy0+dXBkYXRlU3R5bGVJZk5lZWRl
ZCgpOwotICAgIH0KLX0KLQotdm9pZCBEb2N1bWVudDo6dXBkYXRlTGF5b3V0KCkKLXsKLSAgICBB
U1NFUlQoaXNNYWluVGhyZWFkKCkpOwotICAgIGlmIChFbGVtZW50KiBvZSA9IG93bmVyRWxlbWVu
dCgpKQotICAgICAgICBvZS0+ZG9jdW1lbnQoKS0+dXBkYXRlTGF5b3V0KCk7Ci0KLSAgICB1cGRh
dGVTdHlsZUlmTmVlZGVkKCk7Ci0KLSAgICAvLyBPbmx5IGRvIGEgbGF5b3V0IGlmIGNoYW5nZXMg
aGF2ZSBvY2N1cnJlZCB0aGF0IG1ha2UgaXQgbmVjZXNzYXJ5LiAgICAgIAotICAgIEZyYW1lVmll
dyogdiA9IHZpZXcoKTsKLSAgICBpZiAodiAmJiByZW5kZXJlcigpICYmICh2LT5sYXlvdXRQZW5k
aW5nKCkgfHwgcmVuZGVyZXIoKS0+bmVlZHNMYXlvdXQoKSkpCi0gICAgICAgIHYtPmxheW91dCgp
OwotfQotCi0vLyBGSVhNRTogVGhpcyBpcyBhIGJhZCBpZGVhIGFuZCBuZWVkcyB0byBiZSByZW1v
dmVkIGV2ZW50dWFsbHkuCi0vLyBPdGhlciBicm93c2VycyBsb2FkIHN0eWxlc2hlZXRzIGJlZm9y
ZSB0aGV5IGNvbnRpbnVlIHBhcnNpbmcgdGhlIHdlYiBwYWdlLgotLy8gU2luY2Ugd2UgZG9uJ3Qs
IHdlIGNhbiBydW4gSmF2YVNjcmlwdCBjb2RlIHRoYXQgbmVlZHMgYW5zd2VycyBiZWZvcmUgdGhl
Ci0vLyBzdHlsZXNoZWV0cyBhcmUgbG9hZGVkLiBEb2luZyBhIGxheW91dCBpZ25vcmluZyB0aGUg
cGVuZGluZyBzdHlsZXNoZWV0cwotLy8gbGV0cyB1cyBnZXQgcmVhc29uYWJsZSBhbnN3ZXJzLiBU
aGUgbG9uZyB0ZXJtIHNvbHV0aW9uIHRvIHRoaXMgcHJvYmxlbSBpcwotLy8gdG8gaW5zdGVhZCBz
dXNwZW5kIEphdmFTY3JpcHQgZXhlY3V0aW9uLgotdm9pZCBEb2N1bWVudDo6dXBkYXRlTGF5b3V0
SWdub3JlUGVuZGluZ1N0eWxlc2hlZXRzKCkKLXsKLSAgICBib29sIG9sZElnbm9yZSA9IG1faWdu
b3JlUGVuZGluZ1N0eWxlc2hlZXRzOwotICAgIAotICAgIGlmICghaGF2ZVN0eWxlc2hlZXRzTG9h
ZGVkKCkpIHsKLSAgICAgICAgbV9pZ25vcmVQZW5kaW5nU3R5bGVzaGVldHMgPSB0cnVlOwotICAg
ICAgICAvLyBGSVhNRTogV2UgYXJlIHdpbGxpbmcgdG8gYXR0ZW1wdCB0byBzdXBwcmVzcyBwYWlu
dGluZyB3aXRoIG91dGRhdGVkIHN0eWxlIGluZm8gb25seSBvbmNlLiAgT3VyIGFzc3VtcHRpb24g
aXMgdGhhdCBpdCB3b3VsZCBiZQotICAgICAgICAvLyBkYW5nZXJvdXMgdG8gdHJ5IHRvIHN0b3Ag
aXQgYSBzZWNvbmQgdGltZSwgYWZ0ZXIgcGFnZSBjb250ZW50IGhhcyBhbHJlYWR5IGJlZW4gbG9h
ZGVkIGFuZCBkaXNwbGF5ZWQKLSAgICAgICAgLy8gd2l0aCBhY2N1cmF0ZSBzdHlsZSBpbmZvcm1h
dGlvbi4gIChPdXIgc3VwcHJlc3Npb24gaW52b2x2ZXMgYmxhbmtpbmcgdGhlIHdob2xlIHBhZ2Ug
YXQgdGhlCi0gICAgICAgIC8vIG1vbWVudC4gIElmIGl0IHdlcmUgbW9yZSByZWZpbmVkLCB3ZSBt
aWdodCBiZSBhYmxlIHRvIGRvIHNvbWV0aGluZyBiZXR0ZXIuKQotICAgICAgICAvLyBJdCdzIHdv
cnRoIG5vdGluZyB0aG91Z2ggdGhhdCB0aGlzIGVudGlyZSBtZXRob2QgaXMgYSBoYWNrLCBzaW5j
ZSB3aGF0IHdlIHJlYWxseSB3YW50IHRvIGRvIGlzCi0gICAgICAgIC8vIHN1c3BlbmQgSlMgaW5z
dGVhZCBvZiBkb2luZyBhIGxheW91dCB3aXRoIGluYWNjdXJhdGUgaW5mb3JtYXRpb24uCi0gICAg
ICAgIEhUTUxFbGVtZW50KiBib2R5RWxlbWVudCA9IGJvZHkoKTsKLSAgICAgICAgaWYgKGJvZHlF
bGVtZW50ICYmICFib2R5RWxlbWVudC0+cmVuZGVyZXIoKSAmJiBtX3BlbmRpbmdTaGVldExheW91
dCA9PSBOb0xheW91dFdpdGhQZW5kaW5nU2hlZXRzKSB7Ci0gICAgICAgICAgICBtX3BlbmRpbmdT
aGVldExheW91dCA9IERpZExheW91dFdpdGhQZW5kaW5nU2hlZXRzOwotICAgICAgICAgICAgc3R5
bGVSZXNvbHZlckNoYW5nZWQoUmVjYWxjU3R5bGVJbW1lZGlhdGVseSk7Ci0gICAgICAgIH0gZWxz
ZSBpZiAobV9oYXNOb2Rlc1dpdGhQbGFjZWhvbGRlclN0eWxlKQotICAgICAgICAgICAgLy8gSWYg
bmV3IG5vZGVzIGhhdmUgYmVlbiBhZGRlZCBvciBzdHlsZSByZWNhbGMgaGFzIGJlZW4gZG9uZSB3
aXRoIHN0eWxlIHNoZWV0cyBzdGlsbCBwZW5kaW5nLCBzb21lIG5vZGVzIAotICAgICAgICAgICAg
Ly8gbWF5IG5vdCBoYXZlIGhhZCB0aGVpciByZWFsIHN0eWxlIGNhbGN1bGF0ZWQgeWV0LiBOb3Jt
YWxseSB0aGlzIGdldHMgY2xlYW5lZCB3aGVuIHN0eWxlIHNoZWV0cyBhcnJpdmUgCi0gICAgICAg
ICAgICAvLyBidXQgaGVyZSB3ZSBuZWVkIHVwLXRvLWRhdGUgc3R5bGUgaW1tZWRpYXRlbHkuCi0g
ICAgICAgICAgICByZWNhbGNTdHlsZShGb3JjZSk7Ci0gICAgfQotCi0gICAgdXBkYXRlTGF5b3V0
KCk7Ci0KLSAgICBtX2lnbm9yZVBlbmRpbmdTdHlsZXNoZWV0cyA9IG9sZElnbm9yZTsKLX0KLQot
UGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gRG9jdW1lbnQ6OnN0eWxlRm9yRWxlbWVudElnbm9yaW5n
UGVuZGluZ1N0eWxlc2hlZXRzKEVsZW1lbnQqIGVsZW1lbnQpCi17Ci0gICAgQVNTRVJUX0FSRyhl
bGVtZW50LCBlbGVtZW50LT5kb2N1bWVudCgpID09IHRoaXMpOwotCi0gICAgYm9vbCBvbGRJZ25v
cmUgPSBtX2lnbm9yZVBlbmRpbmdTdHlsZXNoZWV0czsKLSAgICBtX2lnbm9yZVBlbmRpbmdTdHls
ZXNoZWV0cyA9IHRydWU7Ci0gICAgUmVmUHRyPFJlbmRlclN0eWxlPiBzdHlsZSA9IHN0eWxlUmVz
b2x2ZXIoKS0+c3R5bGVGb3JFbGVtZW50KGVsZW1lbnQsIGVsZW1lbnQtPnBhcmVudE5vZGUoKSA/
IGVsZW1lbnQtPnBhcmVudE5vZGUoKS0+Y29tcHV0ZWRTdHlsZSgpIDogMCk7Ci0gICAgbV9pZ25v
cmVQZW5kaW5nU3R5bGVzaGVldHMgPSBvbGRJZ25vcmU7Ci0gICAgcmV0dXJuIHN0eWxlLnJlbGVh
c2UoKTsKLX0KLQotUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gRG9jdW1lbnQ6OnN0eWxlRm9yUGFn
ZShpbnQgcGFnZUluZGV4KQotewotICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gc3R5bGUgPSBzdHls
ZVJlc29sdmVyKCktPnN0eWxlRm9yUGFnZShwYWdlSW5kZXgpOwotICAgIHJldHVybiBzdHlsZS5y
ZWxlYXNlKCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnJlZ2lzdGVyQ3VzdG9tRm9udChQYXNzT3du
UHRyPEZvbnREYXRhPiBmb250RGF0YSkKLXsKLSAgICBtX2N1c3RvbUZvbnRzLmFwcGVuZChmb250
RGF0YSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmRlbGV0ZUN1c3RvbUZvbnRzKCkKLXsKLSAgICBz
aXplX3Qgc2l6ZSA9IG1fY3VzdG9tRm9udHMuc2l6ZSgpOwotICAgIGZvciAoc2l6ZV90IGkgPSAw
OyBpIDwgc2l6ZTsgKytpKQotICAgICAgICBHbHlwaFBhZ2VUcmVlTm9kZTo6cHJ1bmVUcmVlQ3Vz
dG9tRm9udERhdGEobV9jdXN0b21Gb250c1tpXS5nZXQoKSk7Ci0KLSAgICBtX2N1c3RvbUZvbnRz
LmNsZWFyKCk7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6OmlzUGFnZUJveFZpc2libGUoaW50IHBhZ2VJ
bmRleCkKLXsKLSAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IHN0eWxlID0gc3R5bGVGb3JQYWdlKHBh
Z2VJbmRleCk7Ci0gICAgcmV0dXJuIHN0eWxlLT52aXNpYmlsaXR5KCkgIT0gSElEREVOOyAvLyBk
aXNwbGF5IHByb3BlcnR5IGRvZXNuJ3QgYXBwbHkgdG8gQHBhZ2UuCi19Ci0KLXZvaWQgRG9jdW1l
bnQ6OnBhZ2VTaXplQW5kTWFyZ2luc0luUGl4ZWxzKGludCBwYWdlSW5kZXgsIEludFNpemUmIHBh
Z2VTaXplLCBpbnQmIG1hcmdpblRvcCwgaW50JiBtYXJnaW5SaWdodCwgaW50JiBtYXJnaW5Cb3R0
b20sIGludCYgbWFyZ2luTGVmdCkKLXsKLSAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IHN0eWxlID0g
c3R5bGVGb3JQYWdlKHBhZ2VJbmRleCk7Ci0gICAgUmVuZGVyVmlldyogdmlldyA9IHJlbmRlclZp
ZXcoKTsKLQotICAgIGludCB3aWR0aCA9IHBhZ2VTaXplLndpZHRoKCk7Ci0gICAgaW50IGhlaWdo
dCA9IHBhZ2VTaXplLmhlaWdodCgpOwotICAgIHN3aXRjaCAoc3R5bGUtPnBhZ2VTaXplVHlwZSgp
KSB7Ci0gICAgY2FzZSBQQUdFX1NJWkVfQVVUTzoKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQ
QUdFX1NJWkVfQVVUT19MQU5EU0NBUEU6Ci0gICAgICAgIGlmICh3aWR0aCA8IGhlaWdodCkKLSAg
ICAgICAgICAgIHN0ZDo6c3dhcCh3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAg
Y2FzZSBQQUdFX1NJWkVfQVVUT19QT1JUUkFJVDoKLSAgICAgICAgaWYgKHdpZHRoID4gaGVpZ2h0
KQotICAgICAgICAgICAgc3RkOjpzd2FwKHdpZHRoLCBoZWlnaHQpOwotICAgICAgICBicmVhazsK
LSAgICBjYXNlIFBBR0VfU0laRV9SRVNPTFZFRDogewotICAgICAgICBMZW5ndGhTaXplIHNpemUg
PSBzdHlsZS0+cGFnZVNpemUoKTsKLSAgICAgICAgQVNTRVJUKHNpemUud2lkdGgoKS5pc0ZpeGVk
KCkpOwotICAgICAgICBBU1NFUlQoc2l6ZS5oZWlnaHQoKS5pc0ZpeGVkKCkpOwotICAgICAgICB3
aWR0aCA9IHZhbHVlRm9yTGVuZ3RoKHNpemUud2lkdGgoKSwgMCwgdmlldyk7Ci0gICAgICAgIGhl
aWdodCA9IHZhbHVlRm9yTGVuZ3RoKHNpemUuaGVpZ2h0KCksIDAsIHZpZXcpOwotICAgICAgICBi
cmVhazsKLSAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7
Ci0gICAgfQotICAgIHBhZ2VTaXplID0gSW50U2l6ZSh3aWR0aCwgaGVpZ2h0KTsKLQotICAgIC8v
IFRoZSBwZXJjZW50YWdlIGlzIGNhbGN1bGF0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSB3aWR0aCBl
dmVuIGZvciBtYXJnaW4gdG9wIGFuZCBib3R0b20uCi0gICAgLy8gaHR0cDovL3d3dy53My5vcmcv
VFIvQ1NTMi9ib3guaHRtbCNtYXJnaW4tcHJvcGVydGllcwotICAgIG1hcmdpblRvcCA9IHN0eWxl
LT5tYXJnaW5Ub3AoKS5pc0F1dG8oKSA/IG1hcmdpblRvcCA6IGludFZhbHVlRm9yTGVuZ3RoKHN0
eWxlLT5tYXJnaW5Ub3AoKSwgd2lkdGgsIHZpZXcpOwotICAgIG1hcmdpblJpZ2h0ID0gc3R5bGUt
Pm1hcmdpblJpZ2h0KCkuaXNBdXRvKCkgPyBtYXJnaW5SaWdodCA6IGludFZhbHVlRm9yTGVuZ3Ro
KHN0eWxlLT5tYXJnaW5SaWdodCgpLCB3aWR0aCwgdmlldyk7Ci0gICAgbWFyZ2luQm90dG9tID0g
c3R5bGUtPm1hcmdpbkJvdHRvbSgpLmlzQXV0bygpID8gbWFyZ2luQm90dG9tIDogaW50VmFsdWVG
b3JMZW5ndGgoc3R5bGUtPm1hcmdpbkJvdHRvbSgpLCB3aWR0aCwgdmlldyk7Ci0gICAgbWFyZ2lu
TGVmdCA9IHN0eWxlLT5tYXJnaW5MZWZ0KCkuaXNBdXRvKCkgPyBtYXJnaW5MZWZ0IDogaW50VmFs
dWVGb3JMZW5ndGgoc3R5bGUtPm1hcmdpbkxlZnQoKSwgd2lkdGgsIHZpZXcpOwotfQotCi12b2lk
IERvY3VtZW50OjpzZXREb2N1bWVudFJhcmVEYXRhKE5vZGVSYXJlRGF0YSogcmFyZURhdGEpCi17
Ci0gICAgbV9kb2N1bWVudFJhcmVEYXRhID0gcmFyZURhdGE7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6
OnNldElzVmlld1NvdXJjZShib29sIGlzVmlld1NvdXJjZSkKLXsKLSAgICBtX2lzVmlld1NvdXJj
ZSA9IGlzVmlld1NvdXJjZTsKLSAgICBpZiAoIW1faXNWaWV3U291cmNlKQotICAgICAgICByZXR1
cm47Ci0KLSAgICBzZXRTZWN1cml0eU9yaWdpbihTZWN1cml0eU9yaWdpbjo6Y3JlYXRlVW5pcXVl
KCkpOwotICAgIGRpZFVwZGF0ZVNlY3VyaXR5T3JpZ2luKCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6
OmNvbWJpbmVDU1NGZWF0dXJlRmxhZ3MoKQotewotICAgIC8vIERlbGF5IHJlc2V0dGluZyB0aGUg
ZmxhZ3MgdW50aWwgYWZ0ZXIgbmV4dCBzdHlsZSByZWNhbGMgc2luY2UgdW5hcHBseWluZyB0aGUg
c3R5bGUgbWF5IG5vdCB3b3JrIHdpdGhvdXQgdGhlc2Ugc2V0ICh0aGlzIGlzIHRydWUgYXQgbGVh
c3Qgd2l0aCBiZWZvcmUvYWZ0ZXIpLgotICAgIG1fdXNlc1NpYmxpbmdSdWxlcyA9IG1fdXNlc1Np
YmxpbmdSdWxlcyB8fCBtX3N0eWxlUmVzb2x2ZXItPnVzZXNTaWJsaW5nUnVsZXMoKTsKLSAgICBt
X3VzZXNGaXJzdExpbmVSdWxlcyA9IG1fdXNlc0ZpcnN0TGluZVJ1bGVzIHx8IG1fc3R5bGVSZXNv
bHZlci0+dXNlc0ZpcnN0TGluZVJ1bGVzKCk7Ci0gICAgbV91c2VzQmVmb3JlQWZ0ZXJSdWxlcyA9
IG1fdXNlc0JlZm9yZUFmdGVyUnVsZXMgfHwgbV9zdHlsZVJlc29sdmVyLT51c2VzQmVmb3JlQWZ0
ZXJSdWxlcygpOwotICAgIG1fdXNlc0xpbmtSdWxlcyA9IG1fdXNlc0xpbmtSdWxlcyB8fCBtX3N0
eWxlUmVzb2x2ZXItPnVzZXNMaW5rUnVsZXMoKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6cmVzZXRD
U1NGZWF0dXJlRmxhZ3MoKQotewotICAgIG1fdXNlc1NpYmxpbmdSdWxlcyA9IG1fc3R5bGVSZXNv
bHZlci0+dXNlc1NpYmxpbmdSdWxlcygpOwotICAgIG1fdXNlc0ZpcnN0TGluZVJ1bGVzID0gbV9z
dHlsZVJlc29sdmVyLT51c2VzRmlyc3RMaW5lUnVsZXMoKTsKLSAgICBtX3VzZXNCZWZvcmVBZnRl
clJ1bGVzID0gbV9zdHlsZVJlc29sdmVyLT51c2VzQmVmb3JlQWZ0ZXJSdWxlcygpOwotICAgIG1f
dXNlc0xpbmtSdWxlcyA9IG1fc3R5bGVSZXNvbHZlci0+dXNlc0xpbmtSdWxlcygpOwotfQotCi12
b2lkIERvY3VtZW50OjpjcmVhdGVTdHlsZVJlc29sdmVyKCkKLXsKLSAgICBib29sIG1hdGNoQXV0
aG9yQW5kVXNlclN0eWxlcyA9IHRydWU7Ci0gICAgaWYgKFNldHRpbmdzKiBkb2NTZXR0aW5ncyA9
IHNldHRpbmdzKCkpCi0gICAgICAgIG1hdGNoQXV0aG9yQW5kVXNlclN0eWxlcyA9IGRvY1NldHRp
bmdzLT5hdXRob3JBbmRVc2VyU3R5bGVzRW5hYmxlZCgpOwotICAgIG1fc3R5bGVSZXNvbHZlciA9
IGFkb3B0UHRyKG5ldyBTdHlsZVJlc29sdmVyKHRoaXMsIG1hdGNoQXV0aG9yQW5kVXNlclN0eWxl
cykpOwotICAgIGNvbWJpbmVDU1NGZWF0dXJlRmxhZ3MoKTsKLX0KLQotaW5saW5lIHZvaWQgRG9j
dW1lbnQ6OmNsZWFyU3R5bGVSZXNvbHZlcigpCi17Ci0gICAgbV9zdHlsZVJlc29sdmVyLmNsZWFy
KCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmF0dGFjaCgpCi17Ci0gICAgQVNTRVJUKCFhdHRhY2hl
ZCgpKTsKLSAgICBBU1NFUlQoIW1faW5QYWdlQ2FjaGUpOwotICAgIEFTU0VSVCghbV9heE9iamVj
dENhY2hlIHx8IHRoaXMgIT0gdG9wRG9jdW1lbnQoKSk7Ci0KLSAgICBpZiAoIW1fcmVuZGVyQXJl
bmEpCi0gICAgICAgIG1fcmVuZGVyQXJlbmEgPSBhZG9wdFB0cihuZXcgUmVuZGVyQXJlbmEpOwot
ICAgIAotICAgIC8vIENyZWF0ZSB0aGUgcmVuZGVyaW5nIHRyZWUKLSAgICBzZXRSZW5kZXJlcihu
ZXcgKG1fcmVuZGVyQXJlbmEuZ2V0KCkpIFJlbmRlclZpZXcodGhpcywgdmlldygpKSk7Ci0jaWYg
VVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQotICAgIHJlbmRlclZpZXcoKS0+ZGlkTW92ZU9u
c2NyZWVuKCk7Ci0jZW5kaWYKLQotICAgIHJlY2FsY1N0eWxlKEZvcmNlKTsKLQotICAgIFJlbmRl
ck9iamVjdCogcmVuZGVyID0gcmVuZGVyZXIoKTsKLSAgICBzZXRSZW5kZXJlcigwKTsKLQotICAg
IENvbnRhaW5lck5vZGU6OmF0dGFjaCgpOwotCi0gICAgc2V0UmVuZGVyZXIocmVuZGVyKTsKLX0K
LQotdm9pZCBEb2N1bWVudDo6ZGV0YWNoKCkKLXsKLSAgICBBU1NFUlQoYXR0YWNoZWQoKSk7Ci0g
ICAgQVNTRVJUKCFtX2luUGFnZUNhY2hlKTsKLQotI2lmIEVOQUJMRShQT0lOVEVSX0xPQ0spCi0g
ICAgaWYgKHBhZ2UoKSkKLSAgICAgICAgcGFnZSgpLT5wb2ludGVyTG9ja0NvbnRyb2xsZXIoKS0+
ZG9jdW1lbnREZXRhY2hlZCh0aGlzKTsKLSNlbmRpZgotCi0gICAgaWYgKHRoaXMgPT0gdG9wRG9j
dW1lbnQoKSkKLSAgICAgICAgY2xlYXJBWE9iamVjdENhY2hlKCk7Ci0KLSAgICBzdG9wQWN0aXZl
RE9NT2JqZWN0cygpOwotICAgIG1fZXZlbnRRdWV1ZS0+Y2xvc2UoKTsKLSNpZiBFTkFCTEUoRlVM
TFNDUkVFTl9BUEkpCi0gICAgbV9mdWxsU2NyZWVuQ2hhbmdlRXZlbnRUYXJnZXRRdWV1ZS5jbGVh
cigpOwotICAgIG1fZnVsbFNjcmVlbkVycm9yRXZlbnRUYXJnZXRRdWV1ZS5jbGVhcigpOwotI2Vu
ZGlmCi0KLSNpZiBFTkFCTEUoUkVRVUVTVF9BTklNQVRJT05fRlJBTUUpCi0gICAgLy8gRklYTUU6
IGNvbnNpZGVyIHVzaW5nIEFjdGl2ZURPTU9iamVjdC4KLSAgICBpZiAobV9zY3JpcHRlZEFuaW1h
dGlvbkNvbnRyb2xsZXIpCi0gICAgICAgIG1fc2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyLT5j
bGVhckRvY3VtZW50UG9pbnRlcigpOwotICAgIG1fc2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVy
LmNsZWFyKCk7Ci0jZW5kaWYKLQotICAgIFJlbmRlck9iamVjdCogcmVuZGVyID0gcmVuZGVyZXIo
KTsKLQotICAgIGRvY3VtZW50V2lsbEJlY29tZUluYWN0aXZlKCk7Ci0KLSNpZiBFTkFCTEUoU0hB
UkVEX1dPUktFUlMpCi0gICAgU2hhcmVkV29ya2VyUmVwb3NpdG9yeTo6ZG9jdW1lbnREZXRhY2hl
ZCh0aGlzKTsKLSNlbmRpZgotCi0gICAgaWYgKG1fZnJhbWUpIHsKLSAgICAgICAgRnJhbWVWaWV3
KiB2aWV3ID0gbV9mcmFtZS0+dmlldygpOwotICAgICAgICBpZiAodmlldykKLSAgICAgICAgICAg
IHZpZXctPmRldGFjaEN1c3RvbVNjcm9sbGJhcnMoKTsKLQotICAgIH0KLQotICAgIC8vIGluZGlj
YXRlIGRlc3RydWN0aW9uIG1vZGUsICBpLmUuIGF0dGFjaGVkKCkgYnV0IHJlbmRlcmVyID09IDAK
LSAgICBzZXRSZW5kZXJlcigwKTsKLSAgICAKLSNpZiBFTkFCTEUoRlVMTFNDUkVFTl9BUEkpCi0g
ICAgaWYgKG1fZnVsbFNjcmVlblJlbmRlcmVyKQotICAgICAgICBzZXRGdWxsU2NyZWVuUmVuZGVy
ZXIoMCk7Ci0jZW5kaWYKLQotICAgIG1faG92ZXJOb2RlID0gMDsKLSAgICBtX2ZvY3VzZWROb2Rl
ID0gMDsKLSAgICBtX2FjdGl2ZU5vZGUgPSAwOwotCi0gICAgQ29udGFpbmVyTm9kZTo6ZGV0YWNo
KCk7Ci0KLSAgICB1bnNjaGVkdWxlU3R5bGVSZWNhbGMoKTsKLQotICAgIGlmIChyZW5kZXIpCi0g
ICAgICAgIHJlbmRlci0+ZGVzdHJveSgpOwotCi0gICAgLy8gVGhpcyBpcyByZXF1aXJlZCwgYXMg
b3VyIEZyYW1lIG1pZ2h0IGRlbGV0ZSBpdHNlbGYgYXMgc29vbiBhcyBpdCBkZXRhY2hlcwotICAg
IC8vIHVzLiBIb3dldmVyLCB0aGlzIHZpb2xhdGVzIE5vZGU6OmRldGFjaCgpIHNlbWFudGljcywg
YXMgaXQncyBuZXZlcgotICAgIC8vIHBvc3NpYmxlIHRvIHJlLWF0dGFjaC4gRXZlbnR1YWxseSBE
b2N1bWVudDo6ZGV0YWNoKCkgc2hvdWxkIGJlIHJlbmFtZWQsCi0gICAgLy8gb3IgdGhpcyBzZXR0
aW5nIG9mIHRoZSBmcmFtZSB0byAwIGNvdWxkIGJlIG1hZGUgZXhwbGljaXQgaW4gZWFjaCBvZiB0
aGUKLSAgICAvLyBjYWxsZXJzIG9mIERvY3VtZW50OjpkZXRhY2goKS4KLSAgICBtX2ZyYW1lID0g
MDsKLSAgICBtX3JlbmRlckFyZW5hLmNsZWFyKCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnByZXBh
cmVGb3JEZXN0cnVjdGlvbigpCi17Ci0gICAgZGlzY29ubmVjdERlc2NlbmRhbnRGcmFtZXMoKTsK
LSAgICBpZiAoRE9NV2luZG93KiB3aW5kb3cgPSB0aGlzLT5kb21XaW5kb3coKSkKLSAgICAgICAg
d2luZG93LT53aWxsRGV0YWNoRG9jdW1lbnRGcm9tRnJhbWUoKTsKLSAgICBkZXRhY2goKTsKLX0K
LQotdm9pZCBEb2N1bWVudDo6cmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnMoKQotewotICAgIEV2ZW50
VGFyZ2V0OjpyZW1vdmVBbGxFdmVudExpc3RlbmVycygpOwotCi0gICAgaWYgKERPTVdpbmRvdyog
ZG9tV2luZG93ID0gdGhpcy0+ZG9tV2luZG93KCkpCi0gICAgICAgIGRvbVdpbmRvdy0+cmVtb3Zl
QWxsRXZlbnRMaXN0ZW5lcnMoKTsKLSAgICBmb3IgKE5vZGUqIG5vZGUgPSBmaXJzdENoaWxkKCk7
IG5vZGU7IG5vZGUgPSBub2RlLT50cmF2ZXJzZU5leHROb2RlKCkpCi0gICAgICAgIG5vZGUtPnJl
bW92ZUFsbEV2ZW50TGlzdGVuZXJzKCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnN1c3BlbmRBY3Rp
dmVET01PYmplY3RzKEFjdGl2ZURPTU9iamVjdDo6UmVhc29uRm9yU3VzcGVuc2lvbiB3aHkpCi17
Ci0gICAgU2NyaXB0RXhlY3V0aW9uQ29udGV4dDo6c3VzcGVuZEFjdGl2ZURPTU9iamVjdHMod2h5
KTsKLQotI2lmIEVOQUJMRShERVZJQ0VfT1JJRU5UQVRJT04pCi0gICAgaWYgKCFwYWdlKCkpCi0g
ICAgICAgIHJldHVybjsKLQotICAgIGlmIChEZXZpY2VNb3Rpb25Db250cm9sbGVyKiBjb250cm9s
bGVyID0gRGV2aWNlTW90aW9uQ29udHJvbGxlcjo6ZnJvbShwYWdlKCkpKQotICAgICAgICBjb250
cm9sbGVyLT5zdXNwZW5kRXZlbnRzRm9yQWxsTGlzdGVuZXJzKGRvbVdpbmRvdygpKTsKLSAgICBp
ZiAoRGV2aWNlT3JpZW50YXRpb25Db250cm9sbGVyKiBjb250cm9sbGVyID0gRGV2aWNlT3JpZW50
YXRpb25Db250cm9sbGVyOjpmcm9tKHBhZ2UoKSkpCi0gICAgICAgIGNvbnRyb2xsZXItPnN1c3Bl
bmRFdmVudHNGb3JBbGxMaXN0ZW5lcnMoZG9tV2luZG93KCkpOwotCi0jZW5kaWYKLX0KLQotdm9p
ZCBEb2N1bWVudDo6cmVzdW1lQWN0aXZlRE9NT2JqZWN0cygpCi17Ci0gICAgU2NyaXB0RXhlY3V0
aW9uQ29udGV4dDo6cmVzdW1lQWN0aXZlRE9NT2JqZWN0cygpOwotCi0jaWYgRU5BQkxFKERFVklD
RV9PUklFTlRBVElPTikKLSAgICBpZiAoIXBhZ2UoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAg
aWYgKERldmljZU1vdGlvbkNvbnRyb2xsZXIqIGNvbnRyb2xsZXIgPSBEZXZpY2VNb3Rpb25Db250
cm9sbGVyOjpmcm9tKHBhZ2UoKSkpCi0gICAgICAgIGNvbnRyb2xsZXItPnJlc3VtZUV2ZW50c0Zv
ckFsbExpc3RlbmVycyhkb21XaW5kb3coKSk7Ci0gICAgaWYgKERldmljZU9yaWVudGF0aW9uQ29u
dHJvbGxlciogY29udHJvbGxlciA9IERldmljZU9yaWVudGF0aW9uQ29udHJvbGxlcjo6ZnJvbShw
YWdlKCkpKQotICAgICAgICBjb250cm9sbGVyLT5yZXN1bWVFdmVudHNGb3JBbGxMaXN0ZW5lcnMo
ZG9tV2luZG93KCkpOwotI2VuZGlmCi19Ci0KLVJlbmRlclZpZXcqIERvY3VtZW50OjpyZW5kZXJW
aWV3KCkgY29uc3QKLXsKLSAgICByZXR1cm4gdG9SZW5kZXJWaWV3KHJlbmRlcmVyKCkpOwotfQot
Ci12b2lkIERvY3VtZW50OjpjbGVhckFYT2JqZWN0Q2FjaGUoKQotewotICAgIC8vIGNsZWFyIGNh
Y2hlIGluIHRvcCBkb2N1bWVudAotICAgIGlmIChtX2F4T2JqZWN0Q2FjaGUpIHsKLSAgICAgICAg
Ly8gQ2xlYXIgdGhlIGNhY2hlIG1lbWJlciB2YXJpYWJsZSBiZWZvcmUgY2FsbGluZyBkZWxldGUg
YmVjYXVzZSBhdHRlbXB0cwotICAgICAgICAvLyBhcmUgbWFkZSB0byBhY2Nlc3MgaXQgZHVyaW5n
IGRlc3RydWN0aW9uLgotICAgICAgICBBWE9iamVjdENhY2hlKiBheE9iamVjdENhY2hlID0gbV9h
eE9iamVjdENhY2hlOwotICAgICAgICBtX2F4T2JqZWN0Q2FjaGUgPSAwOwotICAgICAgICBkZWxl
dGUgYXhPYmplY3RDYWNoZTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICAvLyBh
c2sgdGhlIHRvcC1sZXZlbCBkb2N1bWVudCB0byBjbGVhciBpdHMgY2FjaGUKLSAgICBEb2N1bWVu
dCogZG9jID0gdG9wRG9jdW1lbnQoKTsKLSAgICBpZiAoZG9jICE9IHRoaXMpCi0gICAgICAgIGRv
Yy0+Y2xlYXJBWE9iamVjdENhY2hlKCk7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6OmF4T2JqZWN0Q2Fj
aGVFeGlzdHMoKSBjb25zdAotewotICAgIGlmIChtX2F4T2JqZWN0Q2FjaGUpCi0gICAgICAgIHJl
dHVybiB0cnVlOwotICAgIAotICAgIERvY3VtZW50KiBkb2MgPSB0b3BEb2N1bWVudCgpOwotICAg
IGlmIChkb2MgIT0gdGhpcykKLSAgICAgICAgcmV0dXJuIGRvYy0+YXhPYmplY3RDYWNoZUV4aXN0
cygpOwotICAgIAotICAgIHJldHVybiBmYWxzZTsKLX0KLSAgICAKLUFYT2JqZWN0Q2FjaGUqIERv
Y3VtZW50OjpheE9iamVjdENhY2hlKCkgY29uc3QKLXsKLSAgICAvLyBUaGUgb25seSBkb2N1bWVu
dCB0aGF0IGFjdHVhbGx5IGhhcyBhIEFYT2JqZWN0Q2FjaGUgaXMgdGhlIHRvcC1sZXZlbAotICAg
IC8vIGRvY3VtZW50LiAgVGhpcyBpcyBiZWNhdXNlIHdlIG5lZWQgdG8gYmUgYWJsZSB0byBnZXQg
ZnJvbSBhbnkgV2ViQ29yZUFYT2JqZWN0Ci0gICAgLy8gdG8gYW55IG90aGVyIFdlYkNvcmVBWE9i
amVjdCBvbiB0aGUgc2FtZSBwYWdlLiAgVXNpbmcgYSBzaW5nbGUgY2FjaGUgYWxsb3dzCi0gICAg
Ly8gbG9va3VwcyBhY3Jvc3MgbmVzdGVkIHdlYmFyZWFzIChpLmUuIG11bHRpcGxlIGRvY3VtZW50
cykuCi0gICAgCi0gICAgaWYgKG1fYXhPYmplY3RDYWNoZSkgewotICAgICAgICAvLyByZXR1cm4g
YWxyZWFkeSBrbm93biB0b3AtbGV2ZWwgY2FjaGUKLSAgICAgICAgaWYgKCFvd25lckVsZW1lbnQo
KSkKLSAgICAgICAgICAgIHJldHVybiBtX2F4T2JqZWN0Q2FjaGU7Ci0gICAgICAgIAotICAgICAg
ICAvLyBJbiBzb21lIHBhZ2VzIHdpdGggZnJhbWVzLCB0aGUgY2FjaGUgaXMgY3JlYXRlZCBiZWZv
cmUgdGhlIHN1Yi13ZWJhcmVhIGlzCi0gICAgICAgIC8vIGluc2VydGVkIGludG8gdGhlIHRyZWUu
ICBIZXJlLCB3ZSBjYXRjaCB0aGF0IGNhc2UgYW5kIGp1c3QgdG9zcyB0aGUgb2xkCi0gICAgICAg
IC8vIGNhY2hlIGFuZCBzdGFydCBvdmVyLgotICAgICAgICAvLyBOT1RFOiBUaGlzIHJlY292ZXJ5
IG1heSBubyBsb25nZXIgYmUgbmVlZGVkLiBJIGhhdmUgYmVlbiB1bmFibGUgdG8gdHJpZ2dlcgot
ICAgICAgICAvLyBpdCBhZ2Fpbi4gU2VlIHJkYXI6Ly81Nzk0NDU0Ci0gICAgICAgIC8vIEZJWE1F
OiBDYW4gdGhpcyBiZSBmaXhlZCB3aGVuIGluc2VydGluZyB0aGUgc3ViZnJhbWUgaW5zdGVhZCBv
ZiBub3c/Ci0gICAgICAgIC8vIEZJWE1FOiBJZiB0aGlzIGZ1bmN0aW9uIHdhcyBjYWxsZWQgdG8g
Z2V0IHRoZSBjYWNoZSBpbiBvcmRlciB0byByZW1vdmUKLSAgICAgICAgLy8gYW4gQVhPYmplY3Qs
IHdlIGFyZSBub3cgZGVsZXRpbmcgdGhlIGNhY2hlIGFzIGEgd2hvbGUgYW5kIHJldHVybmluZyBh
Ci0gICAgICAgIC8vIG5ldyBlbXB0eSBjYWNoZSB0aGF0IGRvZXMgbm90IGNvbnRhaW4gdGhlIEFY
T2JqZWN0ISBUaGF0IHNob3VsZCBhY3R1YWxseQotICAgICAgICAvLyBiZSBPSy4gSSBhbSBjb25j
ZXJuZWQgYWJvdXQgb3RoZXIgY2FzZXMgbGlrZSB0aGlzIHdoZXJlIGFjY2Vzc2luZyB0aGUKLSAg
ICAgICAgLy8gY2FjaGUgYmxvd3MgYXdheSB0aGUgQVhPYmplY3QgYmVpbmcgb3BlcmF0ZWQgb24u
Ci0gICAgICAgIGRlbGV0ZSBtX2F4T2JqZWN0Q2FjaGU7Ci0gICAgICAgIG1fYXhPYmplY3RDYWNo
ZSA9IDA7Ci0gICAgfQotCi0gICAgLy8gYXNrIHRoZSB0b3AtbGV2ZWwgZG9jdW1lbnQgZm9yIGl0
cyBjYWNoZQotICAgIERvY3VtZW50KiBkb2MgPSB0b3BEb2N1bWVudCgpOwotICAgIGlmIChkb2Mg
IT0gdGhpcykKLSAgICAgICAgcmV0dXJuIGRvYy0+YXhPYmplY3RDYWNoZSgpOwotICAgIAotICAg
IC8vIHRoaXMgaXMgdGhlIHRvcC1sZXZlbCBkb2N1bWVudCwgc28gaW5zdGFsbCBhIG5ldyBjYWNo
ZQotICAgIG1fYXhPYmplY3RDYWNoZSA9IG5ldyBBWE9iamVjdENhY2hlKHRoaXMpOwotICAgIHJl
dHVybiBtX2F4T2JqZWN0Q2FjaGU7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnNldFZpc3VhbGx5T3Jk
ZXJlZCgpCi17Ci0gICAgbV92aXN1YWxseU9yZGVyZWQgPSB0cnVlOwotICAgIGlmIChyZW5kZXJl
cigpKQotICAgICAgICByZW5kZXJlcigpLT5zdHlsZSgpLT5zZXRSVExPcmRlcmluZyhWaXN1YWxP
cmRlcik7Ci19Ci0KLVBhc3NSZWZQdHI8RG9jdW1lbnRQYXJzZXI+IERvY3VtZW50OjpjcmVhdGVQ
YXJzZXIoKQotewotICAgIC8vIEZJWE1FOiB0aGlzIHNob3VsZCBwcm9iYWJseSBwYXNzIHRoZSBm
cmFtZSBpbnN0ZWFkCi0jaWYgRU5BQkxFKE5FV19YTUwpCi0gICAgcmV0dXJuIE5ld1hNTERvY3Vt
ZW50UGFyc2VyOjpjcmVhdGUodGhpcyk7Ci0jZWxzZQotICAgIHJldHVybiBYTUxEb2N1bWVudFBh
cnNlcjo6Y3JlYXRlKHRoaXMsIHZpZXcoKSk7Ci0jZW5kaWYKLX0KLQotU2NyaXB0YWJsZURvY3Vt
ZW50UGFyc2VyKiBEb2N1bWVudDo6c2NyaXB0YWJsZURvY3VtZW50UGFyc2VyKCkgY29uc3QKLXsK
LSAgICByZXR1cm4gcGFyc2VyKCkgPyBwYXJzZXIoKS0+YXNTY3JpcHRhYmxlRG9jdW1lbnRQYXJz
ZXIoKSA6IDA7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6Om9wZW4oRG9jdW1lbnQqIG93bmVyRG9jdW1l
bnQpCi17Ci0gICAgaWYgKG93bmVyRG9jdW1lbnQpIHsKLSAgICAgICAgc2V0VVJMKG93bmVyRG9j
dW1lbnQtPnVybCgpKTsKLSAgICAgICAgbV9jb29raWVVUkwgPSBvd25lckRvY3VtZW50LT5jb29r
aWVVUkwoKTsKLSAgICAgICAgc2V0U2VjdXJpdHlPcmlnaW4ob3duZXJEb2N1bWVudC0+c2VjdXJp
dHlPcmlnaW4oKSk7Ci0gICAgfQotCi0gICAgaWYgKG1fZnJhbWUpIHsKLSAgICAgICAgaWYgKFNj
cmlwdGFibGVEb2N1bWVudFBhcnNlciogcGFyc2VyID0gc2NyaXB0YWJsZURvY3VtZW50UGFyc2Vy
KCkpIHsKLSAgICAgICAgICAgIGlmIChwYXJzZXItPmlzUGFyc2luZygpKSB7Ci0gICAgICAgICAg
ICAgICAgLy8gRklYTUU6IEhUTUw1IGRvZXNuJ3QgdGVsbCB1cyB0byBjaGVjayB0aGlzLCBpdCBt
aWdodCBub3QgYmUgY29ycmVjdC4KLSAgICAgICAgICAgICAgICBpZiAocGFyc2VyLT5pc0V4ZWN1
dGluZ1NjcmlwdCgpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAg
ICAgICBpZiAoIXBhcnNlci0+d2FzQ3JlYXRlZEJ5U2NyaXB0KCkgJiYgcGFyc2VyLT5oYXNJbnNl
cnRpb25Qb2ludCgpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobV9mcmFtZS0+bG9hZGVyKCktPnN0YXRlKCkgPT0g
RnJhbWVTdGF0ZVByb3Zpc2lvbmFsKQotICAgICAgICAgICAgbV9mcmFtZS0+bG9hZGVyKCktPnN0
b3BBbGxMb2FkZXJzKCk7Ci0gICAgfQotCi0gICAgcmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnMoKTsK
LSAgICBpbXBsaWNpdE9wZW4oKTsKLSAgICBpZiAoU2NyaXB0YWJsZURvY3VtZW50UGFyc2VyKiBw
YXJzZXIgPSBzY3JpcHRhYmxlRG9jdW1lbnRQYXJzZXIoKSkKLSAgICAgICAgcGFyc2VyLT5zZXRX
YXNDcmVhdGVkQnlTY3JpcHQodHJ1ZSk7Ci0KLSAgICBpZiAoRE9NV2luZG93KiBkb21XaW5kb3cg
PSB0aGlzLT5kb21XaW5kb3coKSkKLSAgICAgICAgZG9tV2luZG93LT5yZW1vdmVBbGxFdmVudExp
c3RlbmVycygpOwotCi0gICAgaWYgKG1fZnJhbWUpCi0gICAgICAgIG1fZnJhbWUtPmxvYWRlcigp
LT5kaWRFeHBsaWNpdE9wZW4oKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6ZGV0YWNoUGFyc2VyKCkK
LXsKLSAgICBpZiAoIW1fcGFyc2VyKQotICAgICAgICByZXR1cm47Ci0gICAgbV9wYXJzZXItPmRl
dGFjaCgpOwotICAgIG1fcGFyc2VyLmNsZWFyKCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmNhbmNl
bFBhcnNpbmcoKQotewotICAgIGlmICghbV9wYXJzZXIpCi0gICAgICAgIHJldHVybjsKLQotICAg
IC8vIFdlIGhhdmUgdG8gY2xlYXIgdGhlIHBhcnNlciB0byBhdm9pZCBwb3NzaWJseSB0cmlnZ2Vy
aW5nCi0gICAgLy8gdGhlIG9ubG9hZCBoYW5kbGVyIHdoZW4gY2xvc2luZyBhcyBhIHNpZGUgZWZm
ZWN0IG9mIGEgY2FuY2VsLXN0eWxlCi0gICAgLy8gY2hhbmdlLCBzdWNoIGFzIG9wZW5pbmcgYSBu
ZXcgZG9jdW1lbnQgb3IgY2xvc2luZyB0aGUgd2luZG93IHdoaWxlCi0gICAgLy8gc3RpbGwgcGFy
c2luZwotICAgIGRldGFjaFBhcnNlcigpOwotICAgIGV4cGxpY2l0Q2xvc2UoKTsKLX0KLQotdm9p
ZCBEb2N1bWVudDo6aW1wbGljaXRPcGVuKCkKLXsKLSAgICBjYW5jZWxQYXJzaW5nKCk7Ci0KLSAg
ICByZW1vdmVDaGlsZHJlbigpOwotCi0gICAgc2V0Q29tcGF0aWJpbGl0eU1vZGUoTm9RdWlya3NN
b2RlKTsKLQotICAgIG1fcGFyc2VyID0gY3JlYXRlUGFyc2VyKCk7Ci0gICAgc2V0UGFyc2luZyh0
cnVlKTsKLSAgICBzZXRSZWFkeVN0YXRlKExvYWRpbmcpOwotfQotCi1IVE1MRWxlbWVudCogRG9j
dW1lbnQ6OmJvZHkoKSBjb25zdAotewotICAgIE5vZGUqIGRlID0gZG9jdW1lbnRFbGVtZW50KCk7
Ci0gICAgaWYgKCFkZSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgCi0gICAgLy8gdHJ5IHRvIHBy
ZWZlciBhIEZSQU1FU0VUIGVsZW1lbnQgb3ZlciBCT0RZCi0gICAgTm9kZSogYm9keSA9IDA7Ci0g
ICAgZm9yIChOb2RlKiBpID0gZGUtPmZpcnN0Q2hpbGQoKTsgaTsgaSA9IGktPm5leHRTaWJsaW5n
KCkpIHsKLSAgICAgICAgaWYgKGktPmhhc1RhZ05hbWUoZnJhbWVzZXRUYWcpKQotICAgICAgICAg
ICAgcmV0dXJuIHRvSFRNTEVsZW1lbnQoaSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoaS0+aGFz
VGFnTmFtZShib2R5VGFnKSAmJiAhYm9keSkKLSAgICAgICAgICAgIGJvZHkgPSBpOwotICAgIH0K
LSAgICByZXR1cm4gdG9IVE1MRWxlbWVudChib2R5KTsKLX0KLQotdm9pZCBEb2N1bWVudDo6c2V0
Qm9keShQYXNzUmVmUHRyPEhUTUxFbGVtZW50PiBwcnBOZXdCb2R5LCBFeGNlcHRpb25Db2RlJiBl
YykKLXsKLSAgICBSZWZQdHI8SFRNTEVsZW1lbnQ+IG5ld0JvZHkgPSBwcnBOZXdCb2R5OwotCi0g
ICAgaWYgKCFuZXdCb2R5IHx8ICFkb2N1bWVudEVsZW1lbnQoKSB8fCAhbmV3Qm9keS0+aGFzVGFn
TmFtZShib2R5VGFnKSkgeyAKLSAgICAgICAgZWMgPSBISUVSQVJDSFlfUkVRVUVTVF9FUlI7Ci0g
ICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobmV3Qm9keS0+ZG9jdW1lbnQoKSAmJiBu
ZXdCb2R5LT5kb2N1bWVudCgpICE9IHRoaXMpIHsKLSAgICAgICAgZWMgPSAwOwotICAgICAgICBS
ZWZQdHI8Tm9kZT4gbm9kZSA9IGltcG9ydE5vZGUobmV3Qm9keS5nZXQoKSwgdHJ1ZSwgZWMpOwot
ICAgICAgICBpZiAoZWMpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgICAgICBu
ZXdCb2R5ID0gdG9IVE1MRWxlbWVudChub2RlLmdldCgpKTsKLSAgICB9Ci0KLSAgICBIVE1MRWxl
bWVudCogYiA9IGJvZHkoKTsKLSAgICBpZiAoIWIpCi0gICAgICAgIGRvY3VtZW50RWxlbWVudCgp
LT5hcHBlbmRDaGlsZChuZXdCb2R5LnJlbGVhc2UoKSwgZWMpOwotICAgIGVsc2UKLSAgICAgICAg
ZG9jdW1lbnRFbGVtZW50KCktPnJlcGxhY2VDaGlsZChuZXdCb2R5LnJlbGVhc2UoKSwgYiwgZWMp
OwotfQotCi1IVE1MSGVhZEVsZW1lbnQqIERvY3VtZW50OjpoZWFkKCkKLXsKLSAgICBOb2RlKiBk
ZSA9IGRvY3VtZW50RWxlbWVudCgpOwotICAgIGlmICghZGUpCi0gICAgICAgIHJldHVybiAwOwot
Ci0gICAgZm9yIChOb2RlKiBlID0gZGUtPmZpcnN0Q2hpbGQoKTsgZTsgZSA9IGUtPm5leHRTaWJs
aW5nKCkpCi0gICAgICAgIGlmIChlLT5oYXNUYWdOYW1lKGhlYWRUYWcpKQotICAgICAgICAgICAg
cmV0dXJuIHN0YXRpY19jYXN0PEhUTUxIZWFkRWxlbWVudCo+KGUpOwotCi0gICAgcmV0dXJuIDA7
Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmNsb3NlKCkKLXsKLSAgICAvLyBGSVhNRTogV2Ugc2hvdWxk
IGZvbGxvdyB0aGUgc3BlY2lmaWNhdGlvbiBtb3JlIGNsb3NlbHk6Ci0gICAgLy8gICAgICAgIGh0
dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvI2RvbS1kb2N1
bWVudC1jbG9zZQotCi0gICAgaWYgKCFzY3JpcHRhYmxlRG9jdW1lbnRQYXJzZXIoKSB8fCAhc2Ny
aXB0YWJsZURvY3VtZW50UGFyc2VyKCktPndhc0NyZWF0ZWRCeVNjcmlwdCgpIHx8ICFzY3JpcHRh
YmxlRG9jdW1lbnRQYXJzZXIoKS0+aXNQYXJzaW5nKCkpCi0gICAgICAgIHJldHVybjsKLQotICAg
IGV4cGxpY2l0Q2xvc2UoKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6ZXhwbGljaXRDbG9zZSgpCi17
Ci0gICAgaWYgKG1fcGFyc2VyKQotICAgICAgICBtX3BhcnNlci0+ZmluaXNoKCk7Ci0KLSAgICBp
ZiAoIW1fZnJhbWUpIHsKLSAgICAgICAgLy8gQmVjYXVzZSB3ZSBoYXZlIG5vIGZyYW1lLCB3ZSBk
b24ndCBrbm93IGlmIGFsbCBsb2FkaW5nIGhhcyBjb21wbGV0ZWQsCi0gICAgICAgIC8vIHNvIHdl
IGp1c3QgY2FsbCBpbXBsaWNpdENsb3NlKCkgaW1tZWRpYXRlbHkuIEZJWE1FOiBUaGlzIG1pZ2h0
IGZpcmUKLSAgICAgICAgLy8gdGhlIGxvYWQgZXZlbnQgcHJlbWF0dXJlbHkgPGh0dHA6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE0NTY4Pi4KLSAgICAgICAgaW1wbGljaXRDbG9z
ZSgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbV9mcmFtZS0+bG9hZGVyKCktPmNo
ZWNrQ29tcGxldGVkKCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmltcGxpY2l0Q2xvc2UoKQotewot
ICAgIC8vIElmIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgcmVjYWxjU3R5bGUsIHdlIG5lZWQgdG8g
ZGVmZXIgdGhlIGNsb3NlIHVudGlsIHRoZSBzdHlsZSBpbmZvcm1hdGlvbiBpcyBhY2N1cmF0ZSBh
bmQgYWxsIGVsZW1lbnRzIGFyZSByZS1hdHRhY2hlZC4KLSAgICBpZiAobV9pblN0eWxlUmVjYWxj
KSB7Ci0gICAgICAgIG1fY2xvc2VBZnRlclN0eWxlUmVjYWxjID0gdHJ1ZTsKLSAgICAgICAgcmV0
dXJuOwotICAgIH0KLQotICAgIGJvb2wgd2FzTG9jYXRpb25DaGFuZ2VQZW5kaW5nID0gZnJhbWUo
KSAmJiBmcmFtZSgpLT5uYXZpZ2F0aW9uU2NoZWR1bGVyKCktPmxvY2F0aW9uQ2hhbmdlUGVuZGlu
ZygpOwotICAgIGJvb2wgZG9sb2FkID0gIXBhcnNpbmcoKSAmJiBtX3BhcnNlciAmJiAhbV9wcm9j
ZXNzaW5nTG9hZEV2ZW50ICYmICF3YXNMb2NhdGlvbkNoYW5nZVBlbmRpbmc7Ci0gICAgCi0gICAg
aWYgKCFkb2xvYWQpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fcHJvY2Vzc2luZ0xvYWRFdmVu
dCA9IHRydWU7Ci0KLSAgICBTY3JpcHRhYmxlRG9jdW1lbnRQYXJzZXIqIHBhcnNlciA9IHNjcmlw
dGFibGVEb2N1bWVudFBhcnNlcigpOwotICAgIG1fd2VsbEZvcm1lZCA9IHBhcnNlciAmJiBwYXJz
ZXItPndlbGxGb3JtZWQoKTsKLQotICAgIC8vIFdlIGhhdmUgdG8gY2xlYXIgdGhlIHBhcnNlciwg
aW4gY2FzZSBzb21lb25lIGRvY3VtZW50LndyaXRlKClzIGZyb20gdGhlCi0gICAgLy8gb25Mb2Fk
IGV2ZW50IGhhbmRsZXIsIGFzIGluIFJhZGFyIDMyMDY1MjQuCi0gICAgZGV0YWNoUGFyc2VyKCk7
Ci0KLSAgICAvLyBQYXJzZXIgc2hvdWxkIGhhdmUgcGlja2VkIHVwIGFsbCBwcmVsb2FkcyBieSBu
b3cKLSAgICBtX2NhY2hlZFJlc291cmNlTG9hZGVyLT5jbGVhclByZWxvYWRzKCk7Ci0KLSAgICAv
LyBGSVhNRTogV2Uga2ljayBvZmYgdGhlIGljb24gbG9hZGVyIHdoZW4gdGhlIERvY3VtZW50IGlz
IGRvbmUgcGFyc2luZy4KLSAgICAvLyBUaGVyZSBhcmUgZWFybGllciBvcHBvcnR1bml0aWVzIHdl
IGNvdWxkIHN0YXJ0IGl0OgotICAgIC8vICAtV2hlbiB0aGUgPGhlYWQ+IGZpbmlzaGVzIHBhcnNp
bmcKLSAgICAvLyAgLVdoZW4gYW55IG5ldyBIVE1MTGlua0VsZW1lbnQgaXMgaW5zZXJ0ZWQgaW50
byB0aGUgZG9jdW1lbnQKLSAgICAvLyBCdXQgdGhvc2UgYWRkIGEgZHluYW1pYyBjb21wb25lbnQg
dG8gdGhlIGZhdmljb24gdGhhdCBoYXMgVUkgCi0gICAgLy8gcmFtaWZpY2F0aW9ucywgYW5kIHdl
IG5lZWQgdG8gZGVjaWRlIHdoYXQgaXMgdGhlIFJpZ2h0IFRoaW5nIFRvIERvKHRtKQotICAgIEZy
YW1lKiBmID0gZnJhbWUoKTsKLSAgICBpZiAoZikgewotICAgICAgICBmLT5sb2FkZXIoKS0+aWNv
bigpLT5zdGFydExvYWRlcigpOwotICAgICAgICBmLT5hbmltYXRpb24oKS0+cmVzdW1lQW5pbWF0
aW9uc0ZvckRvY3VtZW50KHRoaXMpOwotICAgIH0KLQotICAgIEltYWdlTG9hZGVyOjpkaXNwYXRj
aFBlbmRpbmdCZWZvcmVMb2FkRXZlbnRzKCk7Ci0gICAgSW1hZ2VMb2FkZXI6OmRpc3BhdGNoUGVu
ZGluZ0xvYWRFdmVudHMoKTsKLSAgICBJbWFnZUxvYWRlcjo6ZGlzcGF0Y2hQZW5kaW5nRXJyb3JF
dmVudHMoKTsKLQotICAgIEhUTUxMaW5rRWxlbWVudDo6ZGlzcGF0Y2hQZW5kaW5nTG9hZEV2ZW50
cygpOwotICAgIEhUTUxTdHlsZUVsZW1lbnQ6OmRpc3BhdGNoUGVuZGluZ0xvYWRFdmVudHMoKTsK
LQotI2lmIEVOQUJMRShTVkcpCi0gICAgLy8gVG8gYWxpZ24gdGhlIEhUTUwgbG9hZCBldmVudCBh
bmQgdGhlIFNWR0xvYWQgZXZlbnQgZm9yIHRoZSBvdXRlcm1vc3QgPHN2Zz4gZWxlbWVudCwgZmly
ZSBpdCBmcm9tCi0gICAgLy8gaGVyZSwgaW5zdGVhZCBvZiBkb2luZyBpdCBmcm9tIFNWR0VsZW1l
bnQ6OmZpbmlzaGVkUGFyc2luZ0NoaWxkcmVuIChpZiBleHRlcm5hbFJlc291cmNlc1JlcXVpcmVk
PSJmYWxzZSIsCi0gICAgLy8gd2hpY2ggaXMgdGhlIGRlZmF1bHQsIGZvciA9J3RydWUnIGl0cyBm
aXJlZCBhdCBhIGxhdGVyIHRpbWUsIG9uY2UgYWxsIGV4dGVybmFsIHJlc291cmNlcyBmaW5pc2hl
ZCBsb2FkaW5nKS4KLSAgICBpZiAoc3ZnRXh0ZW5zaW9ucygpKQotICAgICAgICBhY2Nlc3NTVkdF
eHRlbnNpb25zKCktPmRpc3BhdGNoU1ZHTG9hZEV2ZW50VG9PdXRlcm1vc3RTVkdFbGVtZW50cygp
OwotI2VuZGlmCi0KLSAgICBkaXNwYXRjaFdpbmRvd0xvYWRFdmVudCgpOwotICAgIGVucXVldWVQ
YWdlc2hvd0V2ZW50KFBhZ2VzaG93RXZlbnROb3RQZXJzaXN0ZWQpOwotICAgIGVucXVldWVQb3Bz
dGF0ZUV2ZW50KG1fcGVuZGluZ1N0YXRlT2JqZWN0ID8gbV9wZW5kaW5nU3RhdGVPYmplY3QucmVs
ZWFzZSgpIDogU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpudWxsVmFsdWUoKSk7Ci0gICAgCi0gICAg
aWYgKGYpCi0gICAgICAgIGYtPmxvYWRlcigpLT5oYW5kbGVkT25sb2FkRXZlbnRzKCk7Ci0jaWZk
ZWYgSU5TVFJVTUVOVF9MQVlPVVRfU0NIRURVTElORwotICAgIGlmICghb3duZXJFbGVtZW50KCkp
Ci0gICAgICAgIHByaW50Zigib25sb2FkIGZpcmVkIGF0ICVkXG4iLCBlbGFwc2VkVGltZSgpKTsK
LSNlbmRpZgotCi0gICAgLy8gQW4gZXZlbnQgaGFuZGxlciBtYXkgaGF2ZSByZW1vdmVkIHRoZSBm
cmFtZQotICAgIGlmICghZnJhbWUoKSkgewotICAgICAgICBtX3Byb2Nlc3NpbmdMb2FkRXZlbnQg
PSBmYWxzZTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIE1ha2Ugc3VyZSBib3Ro
IHRoZSBpbml0aWFsIGxheW91dCBhbmQgcmVmbG93IGhhcHBlbiBhZnRlciB0aGUgb25sb2FkCi0g
ICAgLy8gZmlyZXMuIFRoaXMgd2lsbCBpbXByb3ZlIG9ubG9hZCBzY29yZXMsIGFuZCBvdGhlciBi
cm93c2VycyBkbyBpdC4KLSAgICAvLyBJZiB0aGV5IHdhbm5hIGNoZWF0LCB3ZSBjYW4gdG9vLiAt
ZHdoCi0KLSAgICBpZiAoZnJhbWUoKS0+bmF2aWdhdGlvblNjaGVkdWxlcigpLT5sb2NhdGlvbkNo
YW5nZVBlbmRpbmcoKSAmJiBlbGFwc2VkVGltZSgpIDwgY0xheW91dFNjaGVkdWxlVGhyZXNob2xk
KSB7Ci0gICAgICAgIC8vIEp1c3QgYmFpbCBvdXQuIEJlZm9yZSBvciBkdXJpbmcgdGhlIG9ubG9h
ZCB3ZSB3ZXJlIHNoaWZ0ZWQgdG8gYW5vdGhlciBwYWdlLgotICAgICAgICAvLyBUaGUgb2xkIGkt
QmVuY2ggc3VpdGUgZG9lcyB0aGlzLiBXaGVuIHRoaXMgaGFwcGVucyBkb24ndCBib3RoZXIgcGFp
bnRpbmcgb3IgbGF5aW5nIG91dC4gICAgICAgIAotICAgICAgICBtX3Byb2Nlc3NpbmdMb2FkRXZl
bnQgPSBmYWxzZTsKLSAgICAgICAgdmlldygpLT51bnNjaGVkdWxlUmVsYXlvdXQoKTsKLSAgICAg
ICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZyYW1lKCktPmxvYWRlcigpLT5jaGVja0NhbGxJbXBs
aWNpdENsb3NlKCk7Ci0gICAgUmVuZGVyT2JqZWN0KiByZW5kZXJPYmplY3QgPSByZW5kZXJlcigp
OwotICAgIAotICAgIC8vIFdlIHVzZWQgdG8gZm9yY2UgYSBzeW5jaHJvbm91cyBkaXNwbGF5IGFu
ZCBmbHVzaCBoZXJlLiAgVGhpcyByZWFsbHkgaXNuJ3QKLSAgICAvLyBuZWNlc3NhcnkgYW5kIGNh
biBpbiBmYWN0IGJlIGFjdGl2ZWx5IGhhcm1mdWwgaWYgcGFnZXMgYXJlIGxvYWRpbmcgYXQgYSBy
YXRlIG9mID4gNjBmcHMKLSAgICAvLyAoaWYgeW91ciBwbGF0Zm9ybSBpcyBzeW5jaW5nIGZsdXNo
ZXMgYW5kIGxpbWl0aW5nIHRoZW0gdG8gNjBmcHMpLgotICAgIG1fb3Zlck1pbmltdW1MYXlvdXRU
aHJlc2hvbGQgPSB0cnVlOwotICAgIGlmICghb3duZXJFbGVtZW50KCkgfHwgKG93bmVyRWxlbWVu
dCgpLT5yZW5kZXJlcigpICYmICFvd25lckVsZW1lbnQoKS0+cmVuZGVyZXIoKS0+bmVlZHNMYXlv
dXQoKSkpIHsKLSAgICAgICAgdXBkYXRlU3R5bGVJZk5lZWRlZCgpOwotICAgICAgICAKLSAgICAg
ICAgLy8gQWx3YXlzIGRvIGEgbGF5b3V0IGFmdGVyIGxvYWRpbmcgaWYgbmVlZGVkLgotICAgICAg
ICBpZiAodmlldygpICYmIHJlbmRlck9iamVjdCAmJiAoIXJlbmRlck9iamVjdC0+Zmlyc3RDaGls
ZCgpIHx8IHJlbmRlck9iamVjdC0+bmVlZHNMYXlvdXQoKSkpCi0gICAgICAgICAgICB2aWV3KCkt
PmxheW91dCgpOwotICAgIH0KLQotICAgIG1fcHJvY2Vzc2luZ0xvYWRFdmVudCA9IGZhbHNlOwot
Ci0jaWYgUExBVEZPUk0oTUFDKSB8fCBQTEFURk9STShDSFJPTUlVTSkKLSAgICBpZiAoZiAmJiBy
ZW5kZXJPYmplY3QgJiYgQVhPYmplY3RDYWNoZTo6YWNjZXNzaWJpbGl0eUVuYWJsZWQoKSkgewot
ICAgICAgICAvLyBUaGUgQVggY2FjaGUgbWF5IGhhdmUgYmVlbiBjbGVhcmVkIGF0IHRoaXMgcG9p
bnQsIGJ1dCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhbgotICAgICAgICAvLyBB
WCBvYmplY3QgdG8gc2VuZCB0aGUgbm90aWZpY2F0aW9uIHRvLiBnZXRPckNyZWF0ZSB3aWxsIG1h
a2Ugc3VyZSB0aGF0IGFuIHZhbGlkIEFYIG9iamVjdAotICAgICAgICAvLyBleGlzdHMgaW4gdGhl
IGNhY2hlICh3ZSBpZ25vcmUgdGhlIHJldHVybiB2YWx1ZSBiZWNhdXNlIHdlIGRvbid0IG5lZWQg
aXQgaGVyZSkuIFRoaXMgaXMgCi0gICAgICAgIC8vIG9ubHkgc2FmZSB0byBjYWxsIHdoZW4gYSBs
YXlvdXQgaXMgbm90IGluIHByb2dyZXNzLCBzbyBpdCBjYW4gbm90IGJlIHVzZWQgaW4gcG9zdE5v
dGlmaWNhdGlvbi4gICAgCi0gICAgICAgIGF4T2JqZWN0Q2FjaGUoKS0+Z2V0T3JDcmVhdGUocmVu
ZGVyT2JqZWN0KTsKLSAgICAgICAgaWYgKHRoaXMgPT0gdG9wRG9jdW1lbnQoKSkKLSAgICAgICAg
ICAgIGF4T2JqZWN0Q2FjaGUoKS0+cG9zdE5vdGlmaWNhdGlvbihyZW5kZXJPYmplY3QsIEFYT2Jq
ZWN0Q2FjaGU6OkFYTG9hZENvbXBsZXRlLCB0cnVlKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAg
ICAgICAvLyBBWExvYWRDb21wbGV0ZSBjYW4gb25seSBiZSBwb3N0ZWQgb24gdGhlIHRvcCBkb2N1
bWVudCwgc28gaWYgaXQncyBhIGRvY3VtZW50Ci0gICAgICAgICAgICAvLyBpbiBhbiBpZnJhbWUg
dGhhdCBqdXN0IGZpbmlzaGVkIGxvYWRpbmcsIHBvc3QgQVhMYXlvdXRDb21wbGV0ZSBpbnN0ZWFk
LgotICAgICAgICAgICAgYXhPYmplY3RDYWNoZSgpLT5wb3N0Tm90aWZpY2F0aW9uKHJlbmRlck9i
amVjdCwgQVhPYmplY3RDYWNoZTo6QVhMYXlvdXRDb21wbGV0ZSwgdHJ1ZSk7Ci0gICAgICAgIH0K
LSAgICB9Ci0jZW5kaWYKLQotI2lmIEVOQUJMRShTVkcpCi0gICAgaWYgKHN2Z0V4dGVuc2lvbnMo
KSkKLSAgICAgICAgYWNjZXNzU1ZHRXh0ZW5zaW9ucygpLT5zdGFydEFuaW1hdGlvbnMoKTsKLSNl
bmRpZgotfQotCi12b2lkIERvY3VtZW50OjpzZXRQYXJzaW5nKGJvb2wgYikKLXsKLSAgICBtX2JQ
YXJzaW5nID0gYjsKLSAgICBpZiAoIW1fYlBhcnNpbmcgJiYgdmlldygpKQotICAgICAgICB2aWV3
KCktPnNjaGVkdWxlUmVsYXlvdXQoKTsKLQotI2lmZGVmIElOU1RSVU1FTlRfTEFZT1VUX1NDSEVE
VUxJTkcKLSAgICBpZiAoIW93bmVyRWxlbWVudCgpICYmICFtX2JQYXJzaW5nKQotICAgICAgICBw
cmludGYoIlBhcnNpbmcgZmluaXNoZWQgYXQgJWRcbiIsIGVsYXBzZWRUaW1lKCkpOwotI2VuZGlm
Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6OnNob3VsZFNjaGVkdWxlTGF5b3V0KCkKLXsKLSAgICAvLyBU
aGlzIGZ1bmN0aW9uIHdpbGwgb25seSBiZSBjYWxsZWQgd2hlbiBGcmFtZVZpZXcgdGhpbmtzIGEg
bGF5b3V0IGlzIG5lZWRlZC4KLSAgICAvLyBUaGlzIGVuZm9yY2VzIGEgY291cGxlIGV4dHJhIHJ1
bGVzLgotICAgIC8vCi0gICAgLy8gICAgKGEpIE9ubHkgc2NoZWR1bGUgYSBsYXlvdXQgb25jZSB0
aGUgc3R5bGVzaGVldHMgYXJlIGxvYWRlZC4KLSAgICAvLyAgICAoYikgT25seSBzY2hlZHVsZSBs
YXlvdXQgb25jZSB3ZSBoYXZlIGEgYm9keSBlbGVtZW50LgotCi0gICAgcmV0dXJuIChoYXZlU3R5
bGVzaGVldHNMb2FkZWQoKSAmJiBib2R5KCkpCi0gICAgICAgIHx8IChkb2N1bWVudEVsZW1lbnQo
KSAmJiAhZG9jdW1lbnRFbGVtZW50KCktPmhhc1RhZ05hbWUoaHRtbFRhZykpOwotfQotICAgIAot
Ym9vbCBEb2N1bWVudDo6aXNMYXlvdXRUaW1lckFjdGl2ZSgpCi17Ci0gICAgcmV0dXJuIHZpZXco
KSAmJiB2aWV3KCktPmxheW91dFBlbmRpbmcoKSAmJiAhbWluaW11bUxheW91dERlbGF5KCk7Ci19
Ci0KLWludCBEb2N1bWVudDo6bWluaW11bUxheW91dERlbGF5KCkKLXsKLSAgICBpZiAobV9vdmVy
TWluaW11bUxheW91dFRocmVzaG9sZCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgCi0gICAgaW50
IGVsYXBzZWQgPSBlbGFwc2VkVGltZSgpOwotICAgIG1fb3Zlck1pbmltdW1MYXlvdXRUaHJlc2hv
bGQgPSBlbGFwc2VkID4gY0xheW91dFNjaGVkdWxlVGhyZXNob2xkOwotICAgIAotICAgIC8vIFdl
J2xsIHdhbnQgdG8gc2NoZWR1bGUgdGhlIHRpbWVyIHRvIGZpcmUgYXQgdGhlIG1pbmltdW0gbGF5
b3V0IHRocmVzaG9sZC4KLSAgICByZXR1cm4gbWF4KDAsIGNMYXlvdXRTY2hlZHVsZVRocmVzaG9s
ZCAtIGVsYXBzZWQpOwotfQotCi1pbnQgRG9jdW1lbnQ6OmVsYXBzZWRUaW1lKCkgY29uc3QKLXsK
LSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PigoY3VycmVudFRpbWUoKSAtIG1fc3RhcnRUaW1l
KSAqIDEwMDApOwotfQotCi12b2lkIERvY3VtZW50Ojp3cml0ZShjb25zdCBTZWdtZW50ZWRTdHJp
bmcmIHRleHQsIERvY3VtZW50KiBvd25lckRvY3VtZW50KQotewotICAgIE5lc3RpbmdMZXZlbElu
Y3JlbWVudGVyIG5lc3RpbmdMZXZlbEluY3JlbWVudGVyKG1fd3JpdGVSZWN1cnNpb25EZXB0aCk7
Ci0KLSAgICBtX3dyaXRlUmVjdXJzaW9uSXNUb29EZWVwID0gKG1fd3JpdGVSZWN1cnNpb25EZXB0
aCA+IDEpICYmIG1fd3JpdGVSZWN1cnNpb25Jc1Rvb0RlZXA7Ci0gICAgbV93cml0ZVJlY3Vyc2lv
bklzVG9vRGVlcCA9IChtX3dyaXRlUmVjdXJzaW9uRGVwdGggPiBjTWF4V3JpdGVSZWN1cnNpb25E
ZXB0aCkgfHwgbV93cml0ZVJlY3Vyc2lvbklzVG9vRGVlcDsKLQotICAgIGlmIChtX3dyaXRlUmVj
dXJzaW9uSXNUb29EZWVwKQotICAgICAgIHJldHVybjsKLQotI2lmZGVmIElOU1RSVU1FTlRfTEFZ
T1VUX1NDSEVEVUxJTkcKLSAgICBpZiAoIW93bmVyRWxlbWVudCgpKQotICAgICAgICBwcmludGYo
IkJlZ2lubmluZyBhIGRvY3VtZW50LndyaXRlIGF0ICVkXG4iLCBlbGFwc2VkVGltZSgpKTsKLSNl
bmRpZgotCi0gICAgYm9vbCBoYXNJbnNlcnRpb25Qb2ludCA9IG1fcGFyc2VyICYmIG1fcGFyc2Vy
LT5oYXNJbnNlcnRpb25Qb2ludCgpOwotICAgIGlmICghaGFzSW5zZXJ0aW9uUG9pbnQgJiYgbV9p
Z25vcmVEZXN0cnVjdGl2ZVdyaXRlQ291bnQpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmICgh
aGFzSW5zZXJ0aW9uUG9pbnQpCi0gICAgICAgIG9wZW4ob3duZXJEb2N1bWVudCk7Ci0KLSAgICBB
U1NFUlQobV9wYXJzZXIpOwotICAgIG1fcGFyc2VyLT5pbnNlcnQodGV4dCk7Ci0KLSNpZmRlZiBJ
TlNUUlVNRU5UX0xBWU9VVF9TQ0hFRFVMSU5HCi0gICAgaWYgKCFvd25lckVsZW1lbnQoKSkKLSAg
ICAgICAgcHJpbnRmKCJFbmRpbmcgYSBkb2N1bWVudC53cml0ZSBhdCAlZFxuIiwgZWxhcHNlZFRp
bWUoKSk7Ci0jZW5kaWYgICAgCi19Ci0KLXZvaWQgRG9jdW1lbnQ6OndyaXRlKGNvbnN0IFN0cmlu
ZyYgdGV4dCwgRG9jdW1lbnQqIG93bmVyRG9jdW1lbnQpCi17Ci0gICAgd3JpdGUoU2VnbWVudGVk
U3RyaW5nKHRleHQpLCBvd25lckRvY3VtZW50KTsKLX0KLQotdm9pZCBEb2N1bWVudDo6d3JpdGVs
bihjb25zdCBTdHJpbmcmIHRleHQsIERvY3VtZW50KiBvd25lckRvY3VtZW50KQotewotICAgIHdy
aXRlKHRleHQsIG93bmVyRG9jdW1lbnQpOwotICAgIHdyaXRlKCJcbiIsIG93bmVyRG9jdW1lbnQp
OwotfQotCi1jb25zdCBLVVJMJiBEb2N1bWVudDo6dmlydHVhbFVSTCgpIGNvbnN0Ci17Ci0gICAg
cmV0dXJuIG1fdXJsOwotfQotCi1LVVJMIERvY3VtZW50Ojp2aXJ0dWFsQ29tcGxldGVVUkwoY29u
c3QgU3RyaW5nJiB1cmwpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGNvbXBsZXRlVVJMKHVybCk7Ci19
Ci0KLWRvdWJsZSBEb2N1bWVudDo6bWluaW11bVRpbWVySW50ZXJ2YWwoKSBjb25zdAotewotICAg
IFBhZ2UqIHAgPSBwYWdlKCk7Ci0gICAgaWYgKCFwKQotICAgICAgICByZXR1cm4gU2NyaXB0RXhl
Y3V0aW9uQ29udGV4dDo6bWluaW11bVRpbWVySW50ZXJ2YWwoKTsKLSAgICByZXR1cm4gcC0+c2V0
dGluZ3MoKS0+bWluRE9NVGltZXJJbnRlcnZhbCgpOwotfQotCi1FdmVudFRhcmdldCogRG9jdW1l
bnQ6OmVycm9yRXZlbnRUYXJnZXQoKQotewotICAgIHJldHVybiBkb21XaW5kb3coKTsKLX0KLQot
dm9pZCBEb2N1bWVudDo6bG9nRXhjZXB0aW9uVG9Db25zb2xlKGNvbnN0IFN0cmluZyYgZXJyb3JN
ZXNzYWdlLCBjb25zdCBTdHJpbmcmIHNvdXJjZVVSTCwgaW50IGxpbmVOdW1iZXIsIFBhc3NSZWZQ
dHI8U2NyaXB0Q2FsbFN0YWNrPiBjYWxsU3RhY2spCi17Ci0gICAgYWRkQ29uc29sZU1lc3NhZ2Uo
SlNNZXNzYWdlU291cmNlLCBMb2dNZXNzYWdlVHlwZSwgRXJyb3JNZXNzYWdlTGV2ZWwsIGVycm9y
TWVzc2FnZSwgc291cmNlVVJMLCBsaW5lTnVtYmVyLCBjYWxsU3RhY2spOwotfQotCi12b2lkIERv
Y3VtZW50OjpzZXRVUkwoY29uc3QgS1VSTCYgdXJsKQotewotICAgIGNvbnN0IEtVUkwmIG5ld1VS
TCA9IHVybC5pc0VtcHR5KCkgPyBibGFua1VSTCgpIDogdXJsOwotICAgIGlmIChuZXdVUkwgPT0g
bV91cmwpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fdXJsID0gbmV3VVJMOwotICAgIG1fZG9j
dW1lbnRVUkkgPSBtX3VybC5zdHJpbmcoKTsKLSAgICB1cGRhdGVCYXNlVVJMKCk7Ci0gICAgY29u
dGV4dEZlYXR1cmVzKCktPnVybERpZENoYW5nZSh0aGlzKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6
dXBkYXRlQmFzZVVSTCgpCi17Ci0gICAgS1VSTCBvbGRCYXNlVVJMID0gbV9iYXNlVVJMOwotICAg
IC8vIERPTSAzIENvcmU6IFdoZW4gdGhlIERvY3VtZW50IHN1cHBvcnRzIHRoZSBmZWF0dXJlICJI
VE1MIiBbRE9NIExldmVsIDIgSFRNTF0sIHRoZSBiYXNlIFVSSSBpcyBjb21wdXRlZCB1c2luZwot
ICAgIC8vIGZpcnN0IHRoZSB2YWx1ZSBvZiB0aGUgaHJlZiBhdHRyaWJ1dGUgb2YgdGhlIEhUTUwg
QkFTRSBlbGVtZW50IGlmIGFueSwgYW5kIHRoZSB2YWx1ZSBvZiB0aGUgZG9jdW1lbnRVUkkgYXR0
cmlidXRlCi0gICAgLy8gZnJvbSB0aGUgRG9jdW1lbnQgaW50ZXJmYWNlIG90aGVyd2lzZS4KLSAg
ICBpZiAoIW1fYmFzZUVsZW1lbnRVUkwuaXNFbXB0eSgpKQotICAgICAgICBtX2Jhc2VVUkwgPSBt
X2Jhc2VFbGVtZW50VVJMOwotICAgIGVsc2UgaWYgKCFtX2Jhc2VVUkxPdmVycmlkZS5pc0VtcHR5
KCkpCi0gICAgICAgIG1fYmFzZVVSTCA9IG1fYmFzZVVSTE92ZXJyaWRlOwotICAgIGVsc2Ugewot
ICAgICAgICAvLyBUaGUgZG9jdW1lbnRVUkkgYXR0cmlidXRlIGlzIHJlYWQtb25seSBmcm9tIEph
dmFTY3JpcHQsIGJ1dCB3cml0YWJsZSBmcm9tIE9iamVjdGl2ZSBDLCBzbyB3ZSBuZWVkIHRvIHJl
dGFpbgotICAgICAgICAvLyB0aGlzIGZhbGxiYWNrIGJlaGF2aW9yLiBXZSB1c2UgYSBudWxsIGJh
c2UgVVJMLCBzaW5jZSB0aGUgZG9jdW1lbnRVUkkgYXR0cmlidXRlIGlzIGFuIGFyYml0cmFyeSBz
dHJpbmcKLSAgICAgICAgLy8gYW5kIERPTSAzIENvcmUgZG9lcyBub3Qgc3BlY2lmeSBob3cgaXQg
c2hvdWxkIGJlIHJlc29sdmVkLgotICAgICAgICBtX2Jhc2VVUkwgPSBLVVJMKEtVUkwoKSwgZG9j
dW1lbnRVUkkoKSk7Ci0gICAgfQotICAgIHNlbGVjdG9yUXVlcnlDYWNoZSgpLT5pbnZhbGlkYXRl
KCk7Ci0KLSAgICBpZiAoIW1fYmFzZVVSTC5pc1ZhbGlkKCkpCi0gICAgICAgIG1fYmFzZVVSTCA9
IEtVUkwoKTsKLQotICAgIGlmIChtX2VsZW1TaGVldCkgewotICAgICAgICAvLyBFbGVtZW50IHNo
ZWV0IGlzIHNpbGx5LiBJdCBuZXZlciBjb250YWlucyBhbnl0aGluZy4KLSAgICAgICAgQVNTRVJU
KCFtX2VsZW1TaGVldC0+Y29udGVudHMoKS0+cnVsZUNvdW50KCkpOwotICAgICAgICBib29sIHVz
ZXNSZW1Vbml0cyA9IG1fZWxlbVNoZWV0LT5jb250ZW50cygpLT51c2VzUmVtVW5pdHMoKTsKLSAg
ICAgICAgbV9lbGVtU2hlZXQgPSBDU1NTdHlsZVNoZWV0OjpjcmVhdGVJbmxpbmUodGhpcywgbV9i
YXNlVVJMKTsKLSAgICAgICAgLy8gRklYTUU6IFNvIHdlIGFyZSBub3QgcmVhbGx5IHRoZSBwYXJz
ZXIuIFRoZSByaWdodCBmaXggaXMgdG8gZWxpbWluYXRlIHRoZSBlbGVtZW50IHNoZWV0IGNvbXBs
ZXRlbHkuCi0gICAgICAgIG1fZWxlbVNoZWV0LT5jb250ZW50cygpLT5wYXJzZXJTZXRVc2VzUmVt
VW5pdHModXNlc1JlbVVuaXRzKTsKLSAgICB9Ci0KLSAgICBpZiAoIWVxdWFsSWdub3JpbmdGcmFn
bWVudElkZW50aWZpZXIob2xkQmFzZVVSTCwgbV9iYXNlVVJMKSkgewotICAgICAgICAvLyBCYXNl
IFVSTCBjaGFuZ2UgY2hhbmdlcyBhbnkgcmVsYXRpdmUgdmlzaXRlZCBsaW5rcy4KLSAgICAgICAg
Ly8gRklYTUU6IFRoZXJlIGFyZSBvdGhlciBVUkxzIGluIHRoZSB0cmVlIHRoYXQgd291bGQgbmVl
ZCB0byBiZSByZS1ldmFsdWF0ZWQgb24gZHluYW1pYyBiYXNlIFVSTCBjaGFuZ2UuIFN0eWxlIHNo
b3VsZCBiZSBpbnZhbGlkYXRlZCB0b28uCi0gICAgICAgIGZvciAoTm9kZSogbm9kZSA9IGZpcnN0
Q2hpbGQoKTsgbm9kZTsgbm9kZSA9IG5vZGUtPnRyYXZlcnNlTmV4dE5vZGUoKSkgewotICAgICAg
ICAgICAgaWYgKG5vZGUtPmhhc1RhZ05hbWUoYVRhZykpCi0gICAgICAgICAgICAgICAgc3RhdGlj
X2Nhc3Q8SFRNTEFuY2hvckVsZW1lbnQqPihub2RlKS0+aW52YWxpZGF0ZUNhY2hlZFZpc2l0ZWRM
aW5rSGFzaCgpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIERvY3VtZW50OjpzZXRCYXNl
VVJMT3ZlcnJpZGUoY29uc3QgS1VSTCYgdXJsKQotewotICAgIG1fYmFzZVVSTE92ZXJyaWRlID0g
dXJsOwotICAgIHVwZGF0ZUJhc2VVUkwoKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6cHJvY2Vzc0Jh
c2VFbGVtZW50KCkKLXsKLSAgICAvLyBGaW5kIHRoZSBmaXJzdCBocmVmIGF0dHJpYnV0ZSBpbiBh
IGJhc2UgZWxlbWVudCBhbmQgdGhlIGZpcnN0IHRhcmdldCBhdHRyaWJ1dGUgaW4gYSBiYXNlIGVs
ZW1lbnQuCi0gICAgY29uc3QgQXRvbWljU3RyaW5nKiBocmVmID0gMDsKLSAgICBjb25zdCBBdG9t
aWNTdHJpbmcqIHRhcmdldCA9IDA7Ci0gICAgZm9yIChOb2RlKiBub2RlID0gZG9jdW1lbnQoKS0+
Zmlyc3RDaGlsZCgpOyBub2RlICYmICghaHJlZiB8fCAhdGFyZ2V0KTsgbm9kZSA9IG5vZGUtPnRy
YXZlcnNlTmV4dE5vZGUoKSkgewotICAgICAgICBpZiAobm9kZS0+aGFzVGFnTmFtZShiYXNlVGFn
KSkgewotICAgICAgICAgICAgaWYgKCFocmVmKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgQXRv
bWljU3RyaW5nJiB2YWx1ZSA9IHN0YXRpY19jYXN0PEVsZW1lbnQqPihub2RlKS0+ZmFzdEdldEF0
dHJpYnV0ZShocmVmQXR0cik7Ci0gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZS5pc051bGwoKSkK
LSAgICAgICAgICAgICAgICAgICAgaHJlZiA9ICZ2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIGlmICghdGFyZ2V0KSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgQXRvbWljU3RyaW5n
JiB2YWx1ZSA9IHN0YXRpY19jYXN0PEVsZW1lbnQqPihub2RlKS0+ZmFzdEdldEF0dHJpYnV0ZSh0
YXJnZXRBdHRyKTsKLSAgICAgICAgICAgICAgICBpZiAoIXZhbHVlLmlzTnVsbCgpKQotICAgICAg
ICAgICAgICAgICAgICB0YXJnZXQgPSAmdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0K
LSAgICB9Ci0KLSAgICAvLyBGSVhNRTogU2luY2UgdGhpcyBkb2Vzbid0IHNoYXJlIGNvZGUgd2l0
aCBjb21wbGV0ZVVSTCBpdCBtYXkgbm90IGhhbmRsZSBlbmNvZGluZ3MgY29ycmVjdGx5LgotICAg
IEtVUkwgYmFzZUVsZW1lbnRVUkw7Ci0gICAgaWYgKGhyZWYpIHsKLSAgICAgICAgU3RyaW5nIHN0
cmlwcGVkSHJlZiA9IHN0cmlwTGVhZGluZ0FuZFRyYWlsaW5nSFRNTFNwYWNlcygqaHJlZik7Ci0g
ICAgICAgIGlmICghc3RyaXBwZWRIcmVmLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIGJhc2VFbGVt
ZW50VVJMID0gS1VSTCh1cmwoKSwgc3RyaXBwZWRIcmVmKTsKLSAgICB9Ci0gICAgaWYgKG1fYmFz
ZUVsZW1lbnRVUkwgIT0gYmFzZUVsZW1lbnRVUkwpIHsKLSAgICAgICAgbV9iYXNlRWxlbWVudFVS
TCA9IGJhc2VFbGVtZW50VVJMOwotICAgICAgICB1cGRhdGVCYXNlVVJMKCk7Ci0gICAgfQotCi0g
ICAgbV9iYXNlVGFyZ2V0ID0gdGFyZ2V0ID8gKnRhcmdldCA6IG51bGxBdG9tOwotfQotCi1TdHJp
bmcgRG9jdW1lbnQ6OnVzZXJBZ2VudChjb25zdCBLVVJMJiB1cmwpIGNvbnN0Ci17Ci0gICAgcmV0
dXJuIGZyYW1lKCkgPyBmcmFtZSgpLT5sb2FkZXIoKS0+dXNlckFnZW50KHVybCkgOiBTdHJpbmco
KTsKLX0KLQotdm9pZCBEb2N1bWVudDo6ZGlzYWJsZUV2YWwoY29uc3QgU3RyaW5nJiBlcnJvck1l
c3NhZ2UpCi17Ci0gICAgaWYgKCFmcmFtZSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBmcmFt
ZSgpLT5zY3JpcHQoKS0+ZGlzYWJsZUV2YWwoZXJyb3JNZXNzYWdlKTsKLX0KLQotYm9vbCBEb2N1
bWVudDo6Y2FuTmF2aWdhdGUoRnJhbWUqIHRhcmdldEZyYW1lKQotewotICAgIGlmICghbV9mcmFt
ZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gRklYTUU6IFdlIHNob3VsZG4ndCBj
YWxsIHRoaXMgZnVuY3Rpb24gd2l0aG91dCBhIHRhcmdldCBmcmFtZSwgYnV0Ci0gICAgLy8gZmFz
dC9mb3Jtcy9zdWJtaXQtdG8tYmxhbmstbXVsdGlwbGUtdGltZXMuaHRtbCBkZXBlbmRzIG9uIHRo
aXMgZnVuY3Rpb24KLSAgICAvLyByZXR1cm5pbmcgdHJ1ZSB3aGVuIHN1cHBsaWVkIHdpdGggYSAw
IHRhcmdldEZyYW1lLgotICAgIGlmICghdGFyZ2V0RnJhbWUpCi0gICAgICAgIHJldHVybiB0cnVl
OwotCi0gICAgLy8gRnJhbWUtYnVzdGluZyBpcyBnZW5lcmFsbHkgYWxsb3dlZCAodW5sZXNzIHdl
J3JlIHNhbmRib3hlZCBhbmQgcHJldmVudCBmcm9tIGZyYW1lLWJ1c3RpbmcpLgotICAgIGlmICgh
aXNTYW5kYm94ZWQoU2FuZGJveFRvcE5hdmlnYXRpb24pICYmIHRhcmdldEZyYW1lID09IG1fZnJh
bWUtPnRyZWUoKS0+dG9wKCkpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgaWYgKGlzU2Fu
ZGJveGVkKFNhbmRib3hOYXZpZ2F0aW9uKSkgewotICAgICAgICBpZiAodGFyZ2V0RnJhbWUtPnRy
ZWUoKS0+aXNEZXNjZW5kYW50T2YobV9mcmFtZSkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsK
LQotICAgICAgICBwcmludE5hdmlnYXRpb25FcnJvck1lc3NhZ2UodGFyZ2V0RnJhbWUsIHVybCgp
KTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIFRoaXMgaXMgdGhlIG5v
cm1hbCBjYXNlLiBBIGRvY3VtZW50IGNhbiBuYXZpZ2F0ZSBpdHMgZGVjZW5kYW50IGZyYW1lcywK
LSAgICAvLyBvciwgbW9yZSBnZW5lcmFsbHksIGEgZG9jdW1lbnQgY2FuIG5hdmlnYXRlIGEgZnJh
bWUgaWYgdGhlIGRvY3VtZW50IGlzCi0gICAgLy8gaW4gdGhlIHNhbWUgb3JpZ2luIGFzIGFueSBv
ZiB0aGF0IGZyYW1lJ3MgYW5jZXN0b3JzIChpbiB0aGUgZnJhbWUKLSAgICAvLyBoaWVyYXJjaHkp
LgotICAgIC8vCi0gICAgLy8gU2VlIGh0dHA6Ly93d3cuYWRhbWJhcnRoLmNvbS9wYXBlcnMvMjAw
OC9iYXJ0aC1qYWNrc29uLW1pdGNoZWxsLnBkZiBmb3IKLSAgICAvLyBoaXN0b3JpY2FsIGluZm9y
bWF0aW9uIGFib3V0IHRoaXMgc2VjdXJpdHkgY2hlY2suCi0gICAgaWYgKGNhbkFjY2Vzc0FuY2Vz
dG9yKHNlY3VyaXR5T3JpZ2luKCksIHRhcmdldEZyYW1lKSkKLSAgICAgICAgcmV0dXJuIHRydWU7
Ci0KLSAgICAvLyBUb3AtbGV2ZWwgZnJhbWVzIGFyZSBlYXNpZXIgdG8gbmF2aWdhdGUgdGhhbiBv
dGhlciBmcmFtZXMgYmVjYXVzZSB0aGV5Ci0gICAgLy8gZGlzcGxheSB0aGVpciBVUkxzIGluIHRo
ZSBhZGRyZXNzIGJhciAoaW4gbW9zdCBicm93c2VycykuIEhvd2V2ZXIsIHRoZXJlCi0gICAgLy8g
YXJlIHN0aWxsIHNvbWUgcmVzdHJpY3Rpb25zIG9uIG5hdmlnYXRpb24gdG8gYXZvaWQgbnVpc2Fu
Y2UgYXR0YWNrcy4KLSAgICAvLyBTcGVjaWZpY2FsbHksIGEgZG9jdW1lbnQgY2FuIG5hdmlnYXRl
IGEgdG9wLWxldmVsIGZyYW1lIGlmIHRoYXQgZnJhbWUKLSAgICAvLyBvcGVuZWQgdGhlIGRvY3Vt
ZW50IG9yIGlmIHRoZSBkb2N1bWVudCBpcyB0aGUgc2FtZS1vcmlnaW4gd2l0aCBhbnkgb2YKLSAg
ICAvLyB0aGUgdG9wLWxldmVsIGZyYW1lJ3Mgb3BlbmVyJ3MgYW5jZXN0b3JzIChpbiB0aGUgZnJh
bWUgaGllcmFyY2h5KS4KLSAgICAvLwotICAgIC8vIEluIGJvdGggb2YgdGhlc2UgY2FzZXMsIHRo
ZSBkb2N1bWVudCBwZXJmb3JtaW5nIHRoZSBuYXZpZ2F0aW9uIGlzIGluCi0gICAgLy8gc29tZSB3
YXkgcmVsYXRlZCB0byB0aGUgZnJhbWUgYmVpbmcgbmF2aWdhdGUgKGUuZy4sIGJ5IHRoZSAib3Bl
bmVyIgotICAgIC8vIGFuZC9vciAicGFyZW50IiByZWxhdGlvbikuIFJlcXVpcmluZyBzb21lIHNv
cnQgb2YgcmVsYXRpb24gcHJldmVudHMgYQotICAgIC8vIGRvY3VtZW50IGZyb20gbmF2aWdhdGlu
ZyBhcmJpdHJhcnksIHVucmVsYXRlZCB0b3AtbGV2ZWwgZnJhbWVzLgotICAgIGlmICghdGFyZ2V0
RnJhbWUtPnRyZWUoKS0+cGFyZW50KCkpIHsKLSAgICAgICAgaWYgKHRhcmdldEZyYW1lID09IG1f
ZnJhbWUtPmxvYWRlcigpLT5vcGVuZXIoKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0g
ICAgICAgIGlmIChjYW5BY2Nlc3NBbmNlc3RvcihzZWN1cml0eU9yaWdpbigpLCB0YXJnZXRGcmFt
ZS0+bG9hZGVyKCktPm9wZW5lcigpKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0K
LQotICAgIHByaW50TmF2aWdhdGlvbkVycm9yTWVzc2FnZSh0YXJnZXRGcmFtZSwgdXJsKCkpOwot
ICAgIHJldHVybiBmYWxzZTsKLX0KLQotRnJhbWUqIERvY3VtZW50OjpmaW5kVW5zYWZlUGFyZW50
U2Nyb2xsUHJvcGFnYXRpb25Cb3VuZGFyeSgpCi17Ci0gICAgRnJhbWUqIGN1cnJlbnRGcmFtZSA9
IG1fZnJhbWU7Ci0gICAgRnJhbWUqIGFuY2VzdG9yRnJhbWUgPSBjdXJyZW50RnJhbWUtPnRyZWUo
KS0+cGFyZW50KCk7IAotCi0gICAgd2hpbGUgKGFuY2VzdG9yRnJhbWUpIHsKLSAgICAgICAgaWYg
KCFhbmNlc3RvckZyYW1lLT5kb2N1bWVudCgpLT5zZWN1cml0eU9yaWdpbigpLT5jYW5BY2Nlc3Mo
c2VjdXJpdHlPcmlnaW4oKSkpCi0gICAgICAgICAgICByZXR1cm4gY3VycmVudEZyYW1lOwotICAg
ICAgICBjdXJyZW50RnJhbWUgPSBhbmNlc3RvckZyYW1lOwotICAgICAgICBhbmNlc3RvckZyYW1l
ID0gYW5jZXN0b3JGcmFtZS0+dHJlZSgpLT5wYXJlbnQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7
Ci19Ci0KLUNTU1N0eWxlU2hlZXQqIERvY3VtZW50OjpwYWdlVXNlclNoZWV0KCkKLXsKLSAgICBp
ZiAobV9wYWdlVXNlclNoZWV0KQotICAgICAgICByZXR1cm4gbV9wYWdlVXNlclNoZWV0LmdldCgp
OwotICAgIAotICAgIFBhZ2UqIG93bmluZ1BhZ2UgPSBwYWdlKCk7Ci0gICAgaWYgKCFvd25pbmdQ
YWdlKQotICAgICAgICByZXR1cm4gMDsKLSAgICAKLSAgICBTdHJpbmcgdXNlclNoZWV0VGV4dCA9
IG93bmluZ1BhZ2UtPnVzZXJTdHlsZVNoZWV0KCk7Ci0gICAgaWYgKHVzZXJTaGVldFRleHQuaXNF
bXB0eSgpKQotICAgICAgICByZXR1cm4gMDsKLSAgICAKLSAgICAvLyBQYXJzZSB0aGUgc2hlZXQg
YW5kIGNhY2hlIGl0LgotICAgIG1fcGFnZVVzZXJTaGVldCA9IENTU1N0eWxlU2hlZXQ6OmNyZWF0
ZUlubGluZSh0aGlzLCBzZXR0aW5ncygpLT51c2VyU3R5bGVTaGVldExvY2F0aW9uKCkpOwotICAg
IG1fcGFnZVVzZXJTaGVldC0+Y29udGVudHMoKS0+c2V0SXNVc2VyU3R5bGVTaGVldCh0cnVlKTsK
LSAgICBtX3BhZ2VVc2VyU2hlZXQtPmNvbnRlbnRzKCktPnBhcnNlU3RyaW5nKHVzZXJTaGVldFRl
eHQpOwotICAgIHJldHVybiBtX3BhZ2VVc2VyU2hlZXQuZ2V0KCk7Ci19Ci0KLXZvaWQgRG9jdW1l
bnQ6OmNsZWFyUGFnZVVzZXJTaGVldCgpCi17Ci0gICAgaWYgKG1fcGFnZVVzZXJTaGVldCkgewot
ICAgICAgICBtX3BhZ2VVc2VyU2hlZXQgPSAwOwotICAgICAgICBzdHlsZVJlc29sdmVyQ2hhbmdl
ZChEZWZlclJlY2FsY1N0eWxlKTsKLSAgICB9Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnVwZGF0ZVBh
Z2VVc2VyU2hlZXQoKQotewotICAgIGNsZWFyUGFnZVVzZXJTaGVldCgpOwotICAgIGlmIChwYWdl
VXNlclNoZWV0KCkpCi0gICAgICAgIHN0eWxlUmVzb2x2ZXJDaGFuZ2VkKFJlY2FsY1N0eWxlSW1t
ZWRpYXRlbHkpOwotfQotCi1jb25zdCBWZWN0b3I8UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4qIERv
Y3VtZW50OjpwYWdlR3JvdXBVc2VyU2hlZXRzKCkgY29uc3QKLXsKLSAgICBpZiAobV9wYWdlR3Jv
dXBVc2VyU2hlZXRDYWNoZVZhbGlkKQotICAgICAgICByZXR1cm4gbV9wYWdlR3JvdXBVc2VyU2hl
ZXRzLmdldCgpOwotICAgIAotICAgIG1fcGFnZUdyb3VwVXNlclNoZWV0Q2FjaGVWYWxpZCA9IHRy
dWU7Ci0gICAgCi0gICAgUGFnZSogb3duaW5nUGFnZSA9IHBhZ2UoKTsKLSAgICBpZiAoIW93bmlu
Z1BhZ2UpCi0gICAgICAgIHJldHVybiAwOwotICAgICAgICAKLSAgICBjb25zdCBQYWdlR3JvdXAm
IHBhZ2VHcm91cCA9IG93bmluZ1BhZ2UtPmdyb3VwKCk7Ci0gICAgY29uc3QgVXNlclN0eWxlU2hl
ZXRNYXAqIHNoZWV0c01hcCA9IHBhZ2VHcm91cC51c2VyU3R5bGVTaGVldHMoKTsKLSAgICBpZiAo
IXNoZWV0c01hcCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBVc2VyU3R5bGVTaGVldE1hcDo6
Y29uc3RfaXRlcmF0b3IgZW5kID0gc2hlZXRzTWFwLT5lbmQoKTsKLSAgICBmb3IgKFVzZXJTdHls
ZVNoZWV0TWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IHNoZWV0c01hcC0+YmVnaW4oKTsgaXQgIT0g
ZW5kOyArK2l0KSB7Ci0gICAgICAgIGNvbnN0IFVzZXJTdHlsZVNoZWV0VmVjdG9yKiBzaGVldHMg
PSBpdC0+c2Vjb25kLmdldCgpOwotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2hl
ZXRzLT5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgY29uc3QgVXNlclN0eWxlU2hlZXQqIHNo
ZWV0ID0gc2hlZXRzLT5hdChpKS5nZXQoKTsKLSAgICAgICAgICAgIGlmIChzaGVldC0+aW5qZWN0
ZWRGcmFtZXMoKSA9PSBJbmplY3RJblRvcEZyYW1lT25seSAmJiBvd25lckVsZW1lbnQoKSkKLSAg
ICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGlmICghVXNlckNvbnRlbnRVUkxQ
YXR0ZXJuOjptYXRjaGVzUGF0dGVybnModXJsKCksIHNoZWV0LT53aGl0ZWxpc3QoKSwgc2hlZXQt
PmJsYWNrbGlzdCgpKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIFJl
ZlB0cjxDU1NTdHlsZVNoZWV0PiBncm91cFNoZWV0ID0gQ1NTU3R5bGVTaGVldDo6Y3JlYXRlSW5s
aW5lKGNvbnN0X2Nhc3Q8RG9jdW1lbnQqPih0aGlzKSwgc2hlZXQtPnVybCgpKTsKLSAgICAgICAg
ICAgIGlmICghbV9wYWdlR3JvdXBVc2VyU2hlZXRzKQotICAgICAgICAgICAgICAgIG1fcGFnZUdy
b3VwVXNlclNoZWV0cyA9IGFkb3B0UHRyKG5ldyBWZWN0b3I8UmVmUHRyPENTU1N0eWxlU2hlZXQ+
ID4pOwotICAgICAgICAgICAgbV9wYWdlR3JvdXBVc2VyU2hlZXRzLT5hcHBlbmQoZ3JvdXBTaGVl
dCk7Ci0gICAgICAgICAgICBncm91cFNoZWV0LT5jb250ZW50cygpLT5zZXRJc1VzZXJTdHlsZVNo
ZWV0KHNoZWV0LT5sZXZlbCgpID09IFVzZXJTdHlsZVVzZXJMZXZlbCk7Ci0gICAgICAgICAgICBn
cm91cFNoZWV0LT5jb250ZW50cygpLT5wYXJzZVN0cmluZyhzaGVldC0+c291cmNlKCkpOwotICAg
ICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG1fcGFnZUdyb3VwVXNlclNoZWV0cy5nZXQoKTsK
LX0KLQotdm9pZCBEb2N1bWVudDo6Y2xlYXJQYWdlR3JvdXBVc2VyU2hlZXRzKCkKLXsKLSAgICBt
X3BhZ2VHcm91cFVzZXJTaGVldENhY2hlVmFsaWQgPSBmYWxzZTsKLSAgICBpZiAobV9wYWdlR3Jv
dXBVc2VyU2hlZXRzICYmIG1fcGFnZUdyb3VwVXNlclNoZWV0cy0+c2l6ZSgpKSB7Ci0gICAgICAg
IG1fcGFnZUdyb3VwVXNlclNoZWV0cy0+Y2xlYXIoKTsKLSAgICAgICAgc3R5bGVSZXNvbHZlckNo
YW5nZWQoRGVmZXJSZWNhbGNTdHlsZSk7Ci0gICAgfQotfQotCi12b2lkIERvY3VtZW50Ojp1cGRh
dGVQYWdlR3JvdXBVc2VyU2hlZXRzKCkKLXsKLSAgICBjbGVhclBhZ2VHcm91cFVzZXJTaGVldHMo
KTsKLSAgICBpZiAocGFnZUdyb3VwVXNlclNoZWV0cygpICYmIHBhZ2VHcm91cFVzZXJTaGVldHMo
KS0+c2l6ZSgpKQotICAgICAgICBzdHlsZVJlc29sdmVyQ2hhbmdlZChSZWNhbGNTdHlsZUltbWVk
aWF0ZWx5KTsKLX0KLQotdm9pZCBEb2N1bWVudDo6YWRkVXNlclNoZWV0KFBhc3NSZWZQdHI8U3R5
bGVTaGVldENvbnRlbnRzPiB1c2VyU2hlZXQpCi17Ci0gICAgaWYgKCFtX3VzZXJTaGVldHMpCi0g
ICAgICAgIG1fdXNlclNoZWV0cyA9IGFkb3B0UHRyKG5ldyBWZWN0b3I8UmVmUHRyPENTU1N0eWxl
U2hlZXQ+ID4pOwotICAgIG1fdXNlclNoZWV0cy0+YXBwZW5kKENTU1N0eWxlU2hlZXQ6OmNyZWF0
ZSh1c2VyU2hlZXQsIHRoaXMpKTsKLSAgICBzdHlsZVJlc29sdmVyQ2hhbmdlZChSZWNhbGNTdHls
ZUltbWVkaWF0ZWx5KTsKLX0KLQotdm9pZCBEb2N1bWVudDo6c2VhbWxlc3NQYXJlbnRVcGRhdGVk
U3R5bGVzaGVldHMoKQotewotICAgIHN0eWxlUmVzb2x2ZXJDaGFuZ2VkKFJlY2FsY1N0eWxlSW1t
ZWRpYXRlbHkpOwotfQotCi1DU1NTdHlsZVNoZWV0KiBEb2N1bWVudDo6ZWxlbWVudFNoZWV0KCkK
LXsKLSAgICBpZiAoIW1fZWxlbVNoZWV0KQotICAgICAgICBtX2VsZW1TaGVldCA9IENTU1N0eWxl
U2hlZXQ6OmNyZWF0ZUlubGluZSh0aGlzLCBtX2Jhc2VVUkwpOwotICAgIHJldHVybiBtX2VsZW1T
aGVldC5nZXQoKTsKLX0KLQotaW50IERvY3VtZW50Ojpub2RlQWJzSW5kZXgoTm9kZSAqbm9kZSkK
LXsKLSAgICBBU1NFUlQobm9kZS0+ZG9jdW1lbnQoKSA9PSB0aGlzKTsKLQotICAgIGludCBhYnNJ
bmRleCA9IDA7Ci0gICAgZm9yIChOb2RlKiBuID0gbm9kZTsgbiAmJiBuICE9IHRoaXM7IG4gPSBu
LT50cmF2ZXJzZVByZXZpb3VzTm9kZSgpKQotICAgICAgICBhYnNJbmRleCsrOwotICAgIHJldHVy
biBhYnNJbmRleDsKLX0KLQotTm9kZSogRG9jdW1lbnQ6Om5vZGVXaXRoQWJzSW5kZXgoaW50IGFi
c0luZGV4KQotewotICAgIE5vZGUqIG4gPSB0aGlzOwotICAgIGZvciAoaW50IGkgPSAwOyBuICYm
IChpIDwgYWJzSW5kZXgpOyBpKyspCi0gICAgICAgIG4gPSBuLT50cmF2ZXJzZU5leHROb2RlKCk7
Ci0gICAgcmV0dXJuIG47Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnByb2Nlc3NIdHRwRXF1aXYoY29u
c3QgU3RyaW5nJiBlcXVpdiwgY29uc3QgU3RyaW5nJiBjb250ZW50KQotewotICAgIEFTU0VSVCgh
ZXF1aXYuaXNOdWxsKCkgJiYgIWNvbnRlbnQuaXNOdWxsKCkpOwotCi0gICAgRnJhbWUqIGZyYW1l
ID0gdGhpcy0+ZnJhbWUoKTsKLQotICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZShlcXVpdiwgImRl
ZmF1bHQtc3R5bGUiKSkgewotICAgICAgICAvLyBUaGUgcHJlZmVycmVkIHN0eWxlIHNldCBoYXMg
YmVlbiBvdmVycmlkZGVuIGFzIHBlciBzZWN0aW9uIAotICAgICAgICAvLyAxNC4zLjIgb2YgdGhl
IEhUTUw0LjAgc3BlY2lmaWNhdGlvbi4gIFdlIG5lZWQgdG8gdXBkYXRlIHRoZQotICAgICAgICAv
LyBzaGVldCB1c2VkIHZhcmlhYmxlIGFuZCB0aGVuIHVwZGF0ZSBvdXIgc3R5bGUgc2VsZWN0b3Iu
IAotICAgICAgICAvLyBGb3IgbW9yZSBpbmZvLCBzZWUgdGhlIHRlc3QgYXQ6Ci0gICAgICAgIC8v
IGh0dHA6Ly93d3cuaGl4aWUuY2gvdGVzdHMvZXZpbC9jc3MvaW1wb3J0L21haW4vcHJlZmVycmVk
Lmh0bWwKLSAgICAgICAgLy8gLWR3aAotICAgICAgICBtX3NlbGVjdGVkU3R5bGVzaGVldFNldCA9
IGNvbnRlbnQ7Ci0gICAgICAgIG1fcHJlZmVycmVkU3R5bGVzaGVldFNldCA9IGNvbnRlbnQ7Ci0g
ICAgICAgIHN0eWxlUmVzb2x2ZXJDaGFuZ2VkKERlZmVyUmVjYWxjU3R5bGUpOwotICAgIH0gZWxz
ZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoZXF1aXYsICJyZWZyZXNoIikpIHsKLSAgICAgICAgZG91
YmxlIGRlbGF5OwotICAgICAgICBTdHJpbmcgdXJsOwotICAgICAgICBpZiAoZnJhbWUgJiYgcGFy
c2VIVFRQUmVmcmVzaChjb250ZW50LCB0cnVlLCBkZWxheSwgdXJsKSkgewotICAgICAgICAgICAg
aWYgKHVybC5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgdXJsID0gbV91cmwuc3RyaW5nKCk7
Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdXJsID0gY29tcGxldGVVUkwodXJs
KS5zdHJpbmcoKTsKLSAgICAgICAgICAgIGZyYW1lLT5uYXZpZ2F0aW9uU2NoZWR1bGVyKCktPnNj
aGVkdWxlUmVkaXJlY3QoZGVsYXksIHVybCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGVx
dWFsSWdub3JpbmdDYXNlKGVxdWl2LCAic2V0LWNvb2tpZSIpKSB7Ci0gICAgICAgIC8vIEZJWE1F
OiBtYWtlIHNldENvb2tpZSB3b3JrIG9uIFhNTCBkb2N1bWVudHMgdG9vOyBlLmcuIGluIGNhc2Ug
b2YgPGh0bWw6bWV0YSAuLi4uLj4KLSAgICAgICAgaWYgKGlzSFRNTERvY3VtZW50KCkpIHsKLSAg
ICAgICAgICAgIEV4Y2VwdGlvbkNvZGUgZWM7IC8vIEV4Y2VwdGlvbiAoZm9yIHNhbmRib3hlZCBk
b2N1bWVudHMpIGlnbm9yZWQuCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxIVE1MRG9jdW1lbnQq
Pih0aGlzKS0+c2V0Q29va2llKGNvbnRlbnQsIGVjKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBp
ZiAoZXF1YWxJZ25vcmluZ0Nhc2UoZXF1aXYsICJjb250ZW50LWxhbmd1YWdlIikpCi0gICAgICAg
IHNldENvbnRlbnRMYW5ndWFnZShjb250ZW50KTsKLSAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5n
Q2FzZShlcXVpdiwgIngtZG5zLXByZWZldGNoLWNvbnRyb2wiKSkKLSAgICAgICAgcGFyc2VETlNQ
cmVmZXRjaENvbnRyb2xIZWFkZXIoY29udGVudCk7Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmlu
Z0Nhc2UoZXF1aXYsICJ4LWZyYW1lLW9wdGlvbnMiKSkgewotICAgICAgICBpZiAoZnJhbWUpIHsK
LSAgICAgICAgICAgIEZyYW1lTG9hZGVyKiBmcmFtZUxvYWRlciA9IGZyYW1lLT5sb2FkZXIoKTsK
LSAgICAgICAgICAgIGlmIChmcmFtZUxvYWRlci0+c2hvdWxkSW50ZXJydXB0TG9hZEZvclhGcmFt
ZU9wdGlvbnMoY29udGVudCwgdXJsKCkpKSB7Ci0gICAgICAgICAgICAgICAgZnJhbWVMb2FkZXIt
PnN0b3BBbGxMb2FkZXJzKCk7Ci0gICAgICAgICAgICAgICAgZnJhbWUtPm5hdmlnYXRpb25TY2hl
ZHVsZXIoKS0+c2NoZWR1bGVMb2NhdGlvbkNoYW5nZShzZWN1cml0eU9yaWdpbigpLCBibGFua1VS
TCgpLCBTdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgICAgICBERUZJTkVfU1RBVElDX0xPQ0FMKFN0
cmluZywgY29uc29sZU1lc3NhZ2UsIChBU0NJSUxpdGVyYWwoIlJlZnVzZWQgdG8gZGlzcGxheSBk
b2N1bWVudCBiZWNhdXNlIGRpc3BsYXkgZm9yYmlkZGVuIGJ5IFgtRnJhbWUtT3B0aW9ucy5cbiIp
KSk7Ci0gICAgICAgICAgICAgICAgYWRkQ29uc29sZU1lc3NhZ2UoSlNNZXNzYWdlU291cmNlLCBM
b2dNZXNzYWdlVHlwZSwgRXJyb3JNZXNzYWdlTGV2ZWwsIGNvbnNvbGVNZXNzYWdlKTsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoZXF1
aXYsICJ4LXdlYmtpdC1jc3AiKSkKLSAgICAgICAgY29udGVudFNlY3VyaXR5UG9saWN5KCktPmRp
ZFJlY2VpdmVIZWFkZXIoY29udGVudCwgQ29udGVudFNlY3VyaXR5UG9saWN5OjpFbmZvcmNlUG9s
aWN5KTsKLSAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZShlcXVpdiwgIngtd2Via2l0LWNz
cC1yZXBvcnQtb25seSIpKQotICAgICAgICBjb250ZW50U2VjdXJpdHlQb2xpY3koKS0+ZGlkUmVj
ZWl2ZUhlYWRlcihjb250ZW50LCBDb250ZW50U2VjdXJpdHlQb2xpY3k6OlJlcG9ydE9ubHkpOwot
fQotCi0vLyBUaG91Z2ggaXNzcGFjZSgpIGNvbnNpZGVycyBcdCBhbmQgXHYgdG8gYmUgd2hpdGVz
cGFjZSwgV2luIElFIGRvZXNuJ3QuCi1zdGF0aWMgYm9vbCBpc1NlcGFyYXRvcihVQ2hhciBjKQot
ewotICAgIHJldHVybiBjID09ICcgJyB8fCBjID09ICdcdCcgfHwgYyA9PSAnXG4nIHx8IGMgPT0g
J1xyJyB8fCBjID09ICc9JyB8fCBjID09ICcsJyB8fCBjID09ICdcMCc7Ci19Ci0KLXZvaWQgRG9j
dW1lbnQ6OnByb2Nlc3NBcmd1bWVudHMoY29uc3QgU3RyaW5nJiBmZWF0dXJlcywgdm9pZCogZGF0
YSwgQXJndW1lbnRzQ2FsbGJhY2sgY2FsbGJhY2spCi17Ci0gICAgLy8gVHJlYWQgbGlnaHRseSBp
biB0aGlzIGNvZGUgLS0gaXQgd2FzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBtaW1pYyBXaW4g
SUUncyBwYXJzaW5nIGJlaGF2aW9yLgotICAgIGludCBrZXlCZWdpbiwga2V5RW5kOwotICAgIGlu
dCB2YWx1ZUJlZ2luLCB2YWx1ZUVuZDsKLQotICAgIGludCBpID0gMDsKLSAgICBpbnQgbGVuZ3Ro
ID0gZmVhdHVyZXMubGVuZ3RoKCk7Ci0gICAgU3RyaW5nIGJ1ZmZlciA9IGZlYXR1cmVzLmxvd2Vy
KCk7Ci0gICAgd2hpbGUgKGkgPCBsZW5ndGgpIHsKLSAgICAgICAgLy8gc2tpcCB0byBmaXJzdCBu
b24tc2VwYXJhdG9yLCBidXQgZG9uJ3Qgc2tpcCBwYXN0IHRoZSBlbmQgb2YgdGhlIHN0cmluZwot
ICAgICAgICB3aGlsZSAoaXNTZXBhcmF0b3IoYnVmZmVyW2ldKSkgewotICAgICAgICAgICAgaWYg
KGkgPj0gbGVuZ3RoKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgaSsrOwot
ICAgICAgICB9Ci0gICAgICAgIGtleUJlZ2luID0gaTsKLQotICAgICAgICAvLyBza2lwIHRvIGZp
cnN0IHNlcGFyYXRvcgotICAgICAgICB3aGlsZSAoIWlzU2VwYXJhdG9yKGJ1ZmZlcltpXSkpCi0g
ICAgICAgICAgICBpKys7Ci0gICAgICAgIGtleUVuZCA9IGk7Ci0KLSAgICAgICAgLy8gc2tpcCB0
byBmaXJzdCAnPScsIGJ1dCBkb24ndCBza2lwIHBhc3QgYSAnLCcgb3IgdGhlIGVuZCBvZiB0aGUg
c3RyaW5nCi0gICAgICAgIHdoaWxlIChidWZmZXJbaV0gIT0gJz0nKSB7Ci0gICAgICAgICAgICBp
ZiAoYnVmZmVyW2ldID09ICcsJyB8fCBpID49IGxlbmd0aCkKLSAgICAgICAgICAgICAgICBicmVh
azsKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNraXAgdG8gZmly
c3Qgbm9uLXNlcGFyYXRvciwgYnV0IGRvbid0IHNraXAgcGFzdCBhICcsJyBvciB0aGUgZW5kIG9m
IHRoZSBzdHJpbmcKLSAgICAgICAgd2hpbGUgKGlzU2VwYXJhdG9yKGJ1ZmZlcltpXSkpIHsKLSAg
ICAgICAgICAgIGlmIChidWZmZXJbaV0gPT0gJywnIHx8IGkgPj0gbGVuZ3RoKQotICAgICAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICAgICAgaSsrOwotICAgICAgICB9Ci0gICAgICAgIHZhbHVl
QmVnaW4gPSBpOwotCi0gICAgICAgIC8vIHNraXAgdG8gZmlyc3Qgc2VwYXJhdG9yCi0gICAgICAg
IHdoaWxlICghaXNTZXBhcmF0b3IoYnVmZmVyW2ldKSkKLSAgICAgICAgICAgIGkrKzsKLSAgICAg
ICAgdmFsdWVFbmQgPSBpOwotCi0gICAgICAgIEFTU0VSVChpIDw9IGxlbmd0aCk7Ci0KLSAgICAg
ICAgU3RyaW5nIGtleVN0cmluZyA9IGJ1ZmZlci5zdWJzdHJpbmcoa2V5QmVnaW4sIGtleUVuZCAt
IGtleUJlZ2luKTsKLSAgICAgICAgU3RyaW5nIHZhbHVlU3RyaW5nID0gYnVmZmVyLnN1YnN0cmlu
Zyh2YWx1ZUJlZ2luLCB2YWx1ZUVuZCAtIHZhbHVlQmVnaW4pOwotICAgICAgICBjYWxsYmFjayhr
ZXlTdHJpbmcsIHZhbHVlU3RyaW5nLCB0aGlzLCBkYXRhKTsKLSAgICB9Ci19Ci0KLXZvaWQgRG9j
dW1lbnQ6OnByb2Nlc3NWaWV3cG9ydChjb25zdCBTdHJpbmcmIGZlYXR1cmVzLCBWaWV3cG9ydEFy
Z3VtZW50czo6VHlwZSBvcmlnaW4pCi17Ci0gICAgQVNTRVJUKCFmZWF0dXJlcy5pc051bGwoKSk7
Ci0KLSAgICBpZiAob3JpZ2luIDwgbV92aWV3cG9ydEFyZ3VtZW50cy50eXBlKQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBtX3ZpZXdwb3J0QXJndW1lbnRzID0gVmlld3BvcnRBcmd1bWVudHMob3Jp
Z2luKTsKLSAgICBwcm9jZXNzQXJndW1lbnRzKGZlYXR1cmVzLCAodm9pZCopJm1fdmlld3BvcnRB
cmd1bWVudHMsICZzZXRWaWV3cG9ydEZlYXR1cmUpOwotCi0gICAgdXBkYXRlVmlld3BvcnRBcmd1
bWVudHMoKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6dXBkYXRlVmlld3BvcnRBcmd1bWVudHMoKQot
ewotICAgIGlmIChwYWdlKCkgJiYgcGFnZSgpLT5tYWluRnJhbWUoKSA9PSBmcmFtZSgpKSB7Ci0j
aWZuZGVmIE5ERUJVRwotICAgICAgICBtX2RpZERpc3BhdGNoVmlld3BvcnRQcm9wZXJ0aWVzQ2hh
bmdlZCA9IHRydWU7Ci0jZW5kaWYKLSAgICAgICAgcGFnZSgpLT5jaHJvbWUoKS0+ZGlzcGF0Y2hW
aWV3cG9ydFByb3BlcnRpZXNEaWRDaGFuZ2UobV92aWV3cG9ydEFyZ3VtZW50cyk7Ci0gICAgfQot
fQotCi12b2lkIERvY3VtZW50Ojpwcm9jZXNzUmVmZXJyZXJQb2xpY3koY29uc3QgU3RyaW5nJiBw
b2xpY3kpCi17Ci0gICAgQVNTRVJUKCFwb2xpY3kuaXNOdWxsKCkpOwotCi0gICAgbV9yZWZlcnJl
clBvbGljeSA9IFJlZmVycmVyUG9saWN5RGVmYXVsdDsKLQotICAgIGlmIChlcXVhbElnbm9yaW5n
Q2FzZShwb2xpY3ksICJuZXZlciIpKQotICAgICAgICBtX3JlZmVycmVyUG9saWN5ID0gUmVmZXJy
ZXJQb2xpY3lOZXZlcjsKLSAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZShwb2xpY3ksICJh
bHdheXMiKSkKLSAgICAgICAgbV9yZWZlcnJlclBvbGljeSA9IFJlZmVycmVyUG9saWN5QWx3YXlz
OwotICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHBvbGljeSwgIm9yaWdpbiIpKQotICAg
ICAgICBtX3JlZmVycmVyUG9saWN5ID0gUmVmZXJyZXJQb2xpY3lPcmlnaW47Ci19Ci0KLU1vdXNl
RXZlbnRXaXRoSGl0VGVzdFJlc3VsdHMgRG9jdW1lbnQ6OnByZXBhcmVNb3VzZUV2ZW50KGNvbnN0
IEhpdFRlc3RSZXF1ZXN0JiByZXF1ZXN0LCBjb25zdCBMYXlvdXRQb2ludCYgZG9jdW1lbnRQb2lu
dCwgY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBldmVudCkKLXsKLSAgICBBU1NFUlQoIXJlbmRl
cmVyKCkgfHwgcmVuZGVyZXIoKS0+aXNSZW5kZXJWaWV3KCkpOwotCi0gICAgaWYgKCFyZW5kZXJl
cigpKQotICAgICAgICByZXR1cm4gTW91c2VFdmVudFdpdGhIaXRUZXN0UmVzdWx0cyhldmVudCwg
SGl0VGVzdFJlc3VsdChMYXlvdXRQb2ludCgpKSk7Ci0KLSAgICBIaXRUZXN0UmVzdWx0IHJlc3Vs
dChkb2N1bWVudFBvaW50KTsKLSAgICByZW5kZXJWaWV3KCktPmhpdFRlc3QocmVxdWVzdCwgcmVz
dWx0KTsKLQotICAgIGlmICghcmVxdWVzdC5yZWFkT25seSgpKQotICAgICAgICB1cGRhdGVTdHls
ZUlmTmVlZGVkKCk7Ci0KLSAgICByZXR1cm4gTW91c2VFdmVudFdpdGhIaXRUZXN0UmVzdWx0cyhl
dmVudCwgcmVzdWx0KTsKLX0KLQotLy8gRE9NIFNlY3Rpb24gMS4xLjEKLWJvb2wgRG9jdW1lbnQ6
OmNoaWxkVHlwZUFsbG93ZWQoTm9kZVR5cGUgdHlwZSkgY29uc3QKLXsKLSAgICBzd2l0Y2ggKHR5
cGUpIHsKLSAgICBjYXNlIEFUVFJJQlVURV9OT0RFOgotICAgIGNhc2UgQ0RBVEFfU0VDVElPTl9O
T0RFOgotICAgIGNhc2UgRE9DVU1FTlRfRlJBR01FTlRfTk9ERToKLSAgICBjYXNlIERPQ1VNRU5U
X05PREU6Ci0gICAgY2FzZSBFTlRJVFlfTk9ERToKLSAgICBjYXNlIEVOVElUWV9SRUZFUkVOQ0Vf
Tk9ERToKLSAgICBjYXNlIE5PVEFUSU9OX05PREU6Ci0gICAgY2FzZSBURVhUX05PREU6Ci0gICAg
Y2FzZSBYUEFUSF9OQU1FU1BBQ0VfTk9ERToKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGNh
c2UgQ09NTUVOVF9OT0RFOgotICAgIGNhc2UgUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFOgot
ICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICBjYXNlIERPQ1VNRU5UX1RZUEVfTk9ERToKLSAgICBj
YXNlIEVMRU1FTlRfTk9ERToKLSAgICAgICAgLy8gRG9jdW1lbnRzIG1heSBjb250YWluIG5vIG1v
cmUgdGhhbiBvbmUgb2YgZWFjaCBvZiB0aGVzZS4KLSAgICAgICAgLy8gKE9uZSBFbGVtZW50IGFu
ZCBvbmUgRG9jdW1lbnRUeXBlLikKLSAgICAgICAgZm9yIChOb2RlKiBjID0gZmlyc3RDaGlsZCgp
OyBjOyBjID0gYy0+bmV4dFNpYmxpbmcoKSkKLSAgICAgICAgICAgIGlmIChjLT5ub2RlVHlwZSgp
ID09IHR5cGUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4g
dHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIERvY3VtZW50OjpjYW5S
ZXBsYWNlQ2hpbGQoTm9kZSogbmV3Q2hpbGQsIE5vZGUqIG9sZENoaWxkKQotewotICAgIGlmICgh
b2xkQ2hpbGQpCi0gICAgICAgIC8vIENvbnRhaW5lck5vZGU6OnJlcGxhY2VDaGlsZCB3aWxsIHJh
aXNlIGEgTk9UX0ZPVU5EX0VSUi4KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBpZiAob2xk
Q2hpbGQtPm5vZGVUeXBlKCkgPT0gbmV3Q2hpbGQtPm5vZGVUeXBlKCkpCi0gICAgICAgIHJldHVy
biB0cnVlOwotCi0gICAgaW50IG51bURvY3R5cGVzID0gMDsKLSAgICBpbnQgbnVtRWxlbWVudHMg
PSAwOwotCi0gICAgLy8gRmlyc3QsIGNoZWNrIGhvdyBtYW55IGRvY3R5cGVzIGFuZCBlbGVtZW50
cyB3ZSBoYXZlLCBub3QgY291bnRpbmcKLSAgICAvLyB0aGUgY2hpbGQgd2UncmUgYWJvdXQgdG8g
cmVtb3ZlLgotICAgIGZvciAoTm9kZSogYyA9IGZpcnN0Q2hpbGQoKTsgYzsgYyA9IGMtPm5leHRT
aWJsaW5nKCkpIHsKLSAgICAgICAgaWYgKGMgPT0gb2xkQ2hpbGQpCi0gICAgICAgICAgICBjb250
aW51ZTsKLSAgICAgICAgCi0gICAgICAgIHN3aXRjaCAoYy0+bm9kZVR5cGUoKSkgewotICAgICAg
ICBjYXNlIERPQ1VNRU5UX1RZUEVfTk9ERToKLSAgICAgICAgICAgIG51bURvY3R5cGVzKys7Ci0g
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFTEVNRU5UX05PREU6Ci0gICAgICAgICAg
ICBudW1FbGVtZW50cysrOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0g
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvLyBUaGVuLCBz
ZWUgaG93IG1hbnkgZG9jdHlwZXMgYW5kIGVsZW1lbnRzIG1pZ2h0IGJlIGFkZGVkIGJ5IHRoZSBu
ZXcgY2hpbGQuCi0gICAgaWYgKG5ld0NoaWxkLT5ub2RlVHlwZSgpID09IERPQ1VNRU5UX0ZSQUdN
RU5UX05PREUpIHsKLSAgICAgICAgZm9yIChOb2RlKiBjID0gbmV3Q2hpbGQtPmZpcnN0Q2hpbGQo
KTsgYzsgYyA9IGMtPm5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAgICAgIHN3aXRjaCAoYy0+bm9k
ZVR5cGUoKSkgewotICAgICAgICAgICAgY2FzZSBBVFRSSUJVVEVfTk9ERToKLSAgICAgICAgICAg
IGNhc2UgQ0RBVEFfU0VDVElPTl9OT0RFOgotICAgICAgICAgICAgY2FzZSBET0NVTUVOVF9GUkFH
TUVOVF9OT0RFOgotICAgICAgICAgICAgY2FzZSBET0NVTUVOVF9OT0RFOgotICAgICAgICAgICAg
Y2FzZSBFTlRJVFlfTk9ERToKLSAgICAgICAgICAgIGNhc2UgRU5USVRZX1JFRkVSRU5DRV9OT0RF
OgotICAgICAgICAgICAgY2FzZSBOT1RBVElPTl9OT0RFOgotICAgICAgICAgICAgY2FzZSBURVhU
X05PREU6Ci0gICAgICAgICAgICBjYXNlIFhQQVRIX05BTUVTUEFDRV9OT0RFOgotICAgICAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGNhc2UgQ09NTUVOVF9OT0RFOgotICAg
ICAgICAgICAgY2FzZSBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU6Ci0gICAgICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIERPQ1VNRU5UX1RZUEVfTk9ERToKLSAgICAgICAg
ICAgICAgICBudW1Eb2N0eXBlcysrOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAg
ICAgY2FzZSBFTEVNRU5UX05PREU6Ci0gICAgICAgICAgICAgICAgbnVtRWxlbWVudHMrKzsKLSAg
ICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxz
ZSB7Ci0gICAgICAgIHN3aXRjaCAobmV3Q2hpbGQtPm5vZGVUeXBlKCkpIHsKLSAgICAgICAgY2Fz
ZSBBVFRSSUJVVEVfTk9ERToKLSAgICAgICAgY2FzZSBDREFUQV9TRUNUSU9OX05PREU6Ci0gICAg
ICAgIGNhc2UgRE9DVU1FTlRfRlJBR01FTlRfTk9ERToKLSAgICAgICAgY2FzZSBET0NVTUVOVF9O
T0RFOgotICAgICAgICBjYXNlIEVOVElUWV9OT0RFOgotICAgICAgICBjYXNlIEVOVElUWV9SRUZF
UkVOQ0VfTk9ERToKLSAgICAgICAgY2FzZSBOT1RBVElPTl9OT0RFOgotICAgICAgICBjYXNlIFRF
WFRfTk9ERToKLSAgICAgICAgY2FzZSBYUEFUSF9OQU1FU1BBQ0VfTk9ERToKLSAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKLSAgICAgICAgY2FzZSBDT01NRU5UX05PREU6Ci0gICAgICAgIGNhc2Ug
UFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFOgotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0g
ICAgICAgIGNhc2UgRE9DVU1FTlRfVFlQRV9OT0RFOgotICAgICAgICAgICAgbnVtRG9jdHlwZXMr
KzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVMRU1FTlRfTk9ERToKLSAgICAg
ICAgICAgIG51bUVsZW1lbnRzKys7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfSAgICAg
ICAgICAgICAgICAKLSAgICB9Ci0gICAgICAgIAotICAgIGlmIChudW1FbGVtZW50cyA+IDEgfHwg
bnVtRG9jdHlwZXMgPiAxKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgcmV0dXJu
IHRydWU7Ci19Ci0KLVBhc3NSZWZQdHI8Tm9kZT4gRG9jdW1lbnQ6OmNsb25lTm9kZShib29sIC8q
ZGVlcCovKQotewotICAgIC8vIFNwZWMgc2F5cyBjbG9uaW5nIERvY3VtZW50IG5vZGVzIGlzICJp
bXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQiCi0gICAgLy8gc28gd2UgZG8gbm90IHN1cHBvcnQgaXQu
Li4KLSAgICByZXR1cm4gMDsKLX0KLQotU3R5bGVTaGVldExpc3QqIERvY3VtZW50OjpzdHlsZVNo
ZWV0cygpCi17Ci0gICAgcmV0dXJuIG1fc3R5bGVTaGVldHMuZ2V0KCk7Ci19Ci0KLVN0cmluZyBE
b2N1bWVudDo6cHJlZmVycmVkU3R5bGVzaGVldFNldCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1f
cHJlZmVycmVkU3R5bGVzaGVldFNldDsKLX0KLQotU3RyaW5nIERvY3VtZW50OjpzZWxlY3RlZFN0
eWxlc2hlZXRTZXQoKSBjb25zdAotewotICAgIHJldHVybiBtX3NlbGVjdGVkU3R5bGVzaGVldFNl
dDsKLX0KLQotdm9pZCBEb2N1bWVudDo6c2V0U2VsZWN0ZWRTdHlsZXNoZWV0U2V0KGNvbnN0IFN0
cmluZyYgYVN0cmluZykKLXsKLSAgICBtX3NlbGVjdGVkU3R5bGVzaGVldFNldCA9IGFTdHJpbmc7
Ci0gICAgc3R5bGVSZXNvbHZlckNoYW5nZWQoRGVmZXJSZWNhbGNTdHlsZSk7Ci19Ci0KLS8vIFRo
aXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuZXZlciBhIHRvcC1sZXZlbCBzdHlsZXNoZWV0IGhhcyBm
aW5pc2hlZCBsb2FkaW5nLgotdm9pZCBEb2N1bWVudDo6cmVtb3ZlUGVuZGluZ1NoZWV0KFJlbW92
ZVBlbmRpbmdTaGVldE5vdGlmaWNhdGlvblR5cGUgbm90aWZpY2F0aW9uKQotewotICAgIC8vIE1h
a2Ugc3VyZSB3ZSBrbmV3IHRoaXMgc2hlZXQgd2FzIHBlbmRpbmcsIGFuZCB0aGF0IG91ciBjb3Vu
dCBpc24ndCBvdXQgb2Ygc3luYy4KLSAgICBBU1NFUlQobV9wZW5kaW5nU3R5bGVzaGVldHMgPiAw
KTsKLQotICAgIG1fcGVuZGluZ1N0eWxlc2hlZXRzLS07Ci0gICAgCi0jaWZkZWYgSU5TVFJVTUVO
VF9MQVlPVVRfU0NIRURVTElORwotICAgIGlmICghb3duZXJFbGVtZW50KCkpCi0gICAgICAgIHBy
aW50ZigiU3R5bGVzaGVldCBsb2FkZWQgYXQgdGltZSAlZC4gJWQgc3R5bGVzaGVldHMgc3RpbGwg
cmVtYWluLlxuIiwgZWxhcHNlZFRpbWUoKSwgbV9wZW5kaW5nU3R5bGVzaGVldHMpOwotI2VuZGlm
Ci0KLSAgICBpZiAobV9wZW5kaW5nU3R5bGVzaGVldHMpCi0gICAgICAgIHJldHVybjsKLQotICAg
IGlmIChub3RpZmljYXRpb24gPT0gUmVtb3ZlUGVuZGluZ1NoZWV0Tm90aWZ5TGF0ZXIpIHsKLSAg
ICAgICAgc2V0TmVlZHNOb3RpZnlSZW1vdmVBbGxQZW5kaW5nU3R5bGVzaGVldCgpOwotICAgICAg
ICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIGRpZFJlbW92ZUFsbFBlbmRpbmdTdHlsZXNoZWV0
KCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmRpZFJlbW92ZUFsbFBlbmRpbmdTdHlsZXNoZWV0KCkK
LXsKLSAgICBtX25lZWRzTm90aWZ5UmVtb3ZlQWxsUGVuZGluZ1N0eWxlc2hlZXQgPSBmYWxzZTsK
LQotICAgIHN0eWxlUmVzb2x2ZXJDaGFuZ2VkKFJlY2FsY1N0eWxlSWZOZWVkZWQpOwotCi0gICAg
aWYgKFNjcmlwdGFibGVEb2N1bWVudFBhcnNlciogcGFyc2VyID0gc2NyaXB0YWJsZURvY3VtZW50
UGFyc2VyKCkpCi0gICAgICAgIHBhcnNlci0+ZXhlY3V0ZVNjcmlwdHNXYWl0aW5nRm9yU3R5bGVz
aGVldHMoKTsKLQotICAgIGlmIChtX2dvdG9BbmNob3JOZWVkZWRBZnRlclN0eWxlc2hlZXRzTG9h
ZCAmJiB2aWV3KCkpCi0gICAgICAgIHZpZXcoKS0+c2Nyb2xsVG9GcmFnbWVudChtX3VybCk7Ci19
Ci0KLQotdm9pZCBEb2N1bWVudDo6ZXZhbHVhdGVNZWRpYVF1ZXJ5TGlzdCgpCi17Ci0gICAgaWYg
KG1fbWVkaWFRdWVyeU1hdGNoZXIpCi0gICAgICAgIG1fbWVkaWFRdWVyeU1hdGNoZXItPnN0eWxl
UmVzb2x2ZXJDaGFuZ2VkKCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnN0eWxlUmVzb2x2ZXJDaGFu
Z2VkKFN0eWxlUmVzb2x2ZXJVcGRhdGVGbGFnIHVwZGF0ZUZsYWcpCi17Ci0gICAgLy8gRG9uJ3Qg
Ym90aGVyIHVwZGF0aW5nLCBzaW5jZSB3ZSBoYXZlbid0IGxvYWRlZCBhbGwgb3VyIHN0eWxlIGlu
Zm8geWV0Ci0gICAgLy8gYW5kIGhhdmVuJ3QgY2FsY3VsYXRlZCB0aGUgc3R5bGUgc2VsZWN0b3Ig
Zm9yIHRoZSBmaXJzdCB0aW1lLgotICAgIGlmICghYXR0YWNoZWQoKSB8fCAoIW1fZGlkQ2FsY3Vs
YXRlU3R5bGVSZXNvbHZlciAmJiAhaGF2ZVN0eWxlc2hlZXRzTG9hZGVkKCkpKSB7Ci0gICAgICAg
IG1fc3R5bGVSZXNvbHZlci5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0jaWZk
ZWYgSU5TVFJVTUVOVF9MQVlPVVRfU0NIRURVTElORwotICAgIGlmICghb3duZXJFbGVtZW50KCkp
Ci0gICAgICAgIHByaW50ZigiQmVnaW5uaW5nIHVwZGF0ZSBvZiBzdHlsZSBzZWxlY3RvciBhdCB0
aW1lICVkLlxuIiwgZWxhcHNlZFRpbWUoKSk7Ci0jZW5kaWYKLQotICAgIGJvb2wgc3R5bGVzaGVl
dENoYW5nZVJlcXVpcmVzU3R5bGVSZWNhbGMgPSB1cGRhdGVBY3RpdmVTdHlsZXNoZWV0cyh1cGRh
dGVGbGFnKTsKLQotICAgIGlmICh1cGRhdGVGbGFnID09IERlZmVyUmVjYWxjU3R5bGUpIHsKLSAg
ICAgICAgc2NoZWR1bGVGb3JjZWRTdHlsZVJlY2FsYygpOwotICAgICAgICByZXR1cm47Ci0gICAg
fQotCi0gICAgaWYgKGRpZExheW91dFdpdGhQZW5kaW5nU3R5bGVzaGVldHMoKSAmJiBtX3BlbmRp
bmdTdHlsZXNoZWV0cyA8PSAwKSB7Ci0gICAgICAgIG1fcGVuZGluZ1NoZWV0TGF5b3V0ID0gSWdu
b3JlTGF5b3V0V2l0aFBlbmRpbmdTaGVldHM7Ci0gICAgICAgIGlmIChyZW5kZXJlcigpKQotICAg
ICAgICAgICAgcmVuZGVyZXIoKS0+cmVwYWludCgpOwotICAgIH0KLQotICAgIGlmICghc3R5bGVz
aGVldENoYW5nZVJlcXVpcmVzU3R5bGVSZWNhbGMpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8v
IFRoaXMgcmVjYWxjU3R5bGUgaW5pdGlhdGVzIGEgbmV3IHJlY2FsYyBjeWNsZS4gV2UgbmVlZCB0
byBicmFja2V0IGl0IHRvCi0gICAgLy8gbWFrZSBzdXJlIGFuaW1hdGlvbnMgZ2V0IHRoZSBjb3Jy
ZWN0IHVwZGF0ZSB0aW1lCi0gICAgewotICAgICAgICBBbmltYXRpb25VcGRhdGVCbG9jayBhbmlt
YXRpb25VcGRhdGVCbG9jayhtX2ZyYW1lID8gbV9mcmFtZS0+YW5pbWF0aW9uKCkgOiAwKTsKLSAg
ICAgICAgcmVjYWxjU3R5bGUoRm9yY2UpOwotICAgIH0KLQotI2lmZGVmIElOU1RSVU1FTlRfTEFZ
T1VUX1NDSEVEVUxJTkcKLSAgICBpZiAoIW93bmVyRWxlbWVudCgpKQotICAgICAgICBwcmludGYo
IkZpbmlzaGVkIHVwZGF0ZSBvZiBzdHlsZSBzZWxlY3RvciBhdCB0aW1lICVkXG4iLCBlbGFwc2Vk
VGltZSgpKTsKLSNlbmRpZgotCi0gICAgaWYgKHJlbmRlcmVyKCkpIHsKLSAgICAgICAgcmVuZGVy
ZXIoKS0+c2V0TmVlZHNMYXlvdXRBbmRQcmVmV2lkdGhzUmVjYWxjKCk7Ci0gICAgICAgIGlmICh2
aWV3KCkpCi0gICAgICAgICAgICB2aWV3KCktPnNjaGVkdWxlUmVsYXlvdXQoKTsKLSAgICB9Ci0K
LSAgICBldmFsdWF0ZU1lZGlhUXVlcnlMaXN0KCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmFkZFN0
eWxlU2hlZXRDYW5kaWRhdGVOb2RlKE5vZGUqIG5vZGUsIGJvb2wgY3JlYXRlZEJ5UGFyc2VyKQot
ewotICAgIGlmICghbm9kZS0+aW5Eb2N1bWVudCgpKQotICAgICAgICByZXR1cm47Ci0gICAgCi0g
ICAgLy8gVW50aWwgdGhlIDxib2R5PiBleGlzdHMsIHdlIGhhdmUgbm8gY2hvaWNlIGJ1dCB0byBj
b21wYXJlIGRvY3VtZW50IHBvc2l0aW9ucywKLSAgICAvLyBzaW5jZSBzdHlsZXMgb3V0c2lkZSBv
ZiB0aGUgYm9keSBhbmQgaGVhZCBjb250aW51ZSB0byBiZSBzaHVudGVkIGludG8gdGhlIGhlYWQK
LSAgICAvLyAoYW5kIHRodXMgY2FuIHNoaWZ0IHRvIGVuZCB1cCBiZWZvcmUgZHluYW1pY2FsbHkg
YWRkZWQgRE9NIGNvbnRlbnQgdGhhdCBpcyBhbHNvCi0gICAgLy8gb3V0c2lkZSB0aGUgYm9keSku
Ci0gICAgaWYgKChjcmVhdGVkQnlQYXJzZXIgJiYgYm9keSgpKSB8fCBtX3N0eWxlU2hlZXRDYW5k
aWRhdGVOb2Rlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgbV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9k
ZXMuYWRkKG5vZGUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gRGV0ZXJtaW5l
IGFuIGFwcHJvcHJpYXRlIGluc2VydGlvbiBwb2ludC4KLSAgICBTdHlsZVNoZWV0Q2FuZGlkYXRl
TGlzdEhhc2hTZXQ6Oml0ZXJhdG9yIGJlZ2luID0gbV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMu
YmVnaW4oKTsKLSAgICBTdHlsZVNoZWV0Q2FuZGlkYXRlTGlzdEhhc2hTZXQ6Oml0ZXJhdG9yIGVu
ZCA9IG1fc3R5bGVTaGVldENhbmRpZGF0ZU5vZGVzLmVuZCgpOwotICAgIFN0eWxlU2hlZXRDYW5k
aWRhdGVMaXN0SGFzaFNldDo6aXRlcmF0b3IgaXQgPSBlbmQ7Ci0gICAgTm9kZSogZm9sbG93aW5n
Tm9kZSA9IDA7Ci0gICAgZG8gewotICAgICAgICAtLWl0OwotICAgICAgICBOb2RlKiBuID0gKml0
OwotICAgICAgICB1bnNpZ25lZCBzaG9ydCBwb3NpdGlvbiA9IG4tPmNvbXBhcmVEb2N1bWVudFBv
c2l0aW9uKG5vZGUpOwotICAgICAgICBpZiAocG9zaXRpb24gPT0gRE9DVU1FTlRfUE9TSVRJT05f
Rk9MTE9XSU5HKSB7Ci0gICAgICAgICAgICBtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcy5pbnNl
cnRCZWZvcmUoZm9sbG93aW5nTm9kZSwgbm9kZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAg
ICAgIH0KLSAgICAgICAgZm9sbG93aW5nTm9kZSA9IG47Ci0gICAgfSB3aGlsZSAoaXQgIT0gYmVn
aW4pOwotICAgIAotICAgIG1fc3R5bGVTaGVldENhbmRpZGF0ZU5vZGVzLmluc2VydEJlZm9yZShm
b2xsb3dpbmdOb2RlLCBub2RlKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6cmVtb3ZlU3R5bGVTaGVl
dENhbmRpZGF0ZU5vZGUoTm9kZSogbm9kZSkKLXsKLSAgICBtX3N0eWxlU2hlZXRDYW5kaWRhdGVO
b2Rlcy5yZW1vdmUobm9kZSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmNvbGxlY3RBY3RpdmVTdHls
ZXNoZWV0cyhWZWN0b3I8UmVmUHRyPFN0eWxlU2hlZXQ+ID4mIHNoZWV0cykKLXsKLSAgICBpZiAo
c2V0dGluZ3MoKSAmJiAhc2V0dGluZ3MoKS0+YXV0aG9yQW5kVXNlclN0eWxlc0VuYWJsZWQoKSkK
LSAgICAgICAgcmV0dXJuOwotCi0gICAgU3R5bGVTaGVldENhbmRpZGF0ZUxpc3RIYXNoU2V0Ojpp
dGVyYXRvciBiZWdpbiA9IG1fc3R5bGVTaGVldENhbmRpZGF0ZU5vZGVzLmJlZ2luKCk7Ci0gICAg
U3R5bGVTaGVldENhbmRpZGF0ZUxpc3RIYXNoU2V0OjppdGVyYXRvciBlbmQgPSBtX3N0eWxlU2hl
ZXRDYW5kaWRhdGVOb2Rlcy5lbmQoKTsKLSAgICBmb3IgKFN0eWxlU2hlZXRDYW5kaWRhdGVMaXN0
SGFzaFNldDo6aXRlcmF0b3IgaXQgPSBiZWdpbjsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAg
IE5vZGUqIG4gPSAqaXQ7Ci0gICAgICAgIFN0eWxlU2hlZXQqIHNoZWV0ID0gMDsKLSAgICAgICAg
aWYgKG4tPm5vZGVUeXBlKCkgPT0gUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFKSB7Ci0gICAg
ICAgICAgICAvLyBQcm9jZXNzaW5nIGluc3RydWN0aW9uIChYTUwgZG9jdW1lbnRzIG9ubHkpLgot
ICAgICAgICAgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCBsaW5raW5nIHRvIGVtYmVkZGVkIENTUyBz
dHlsZXNoZWV0cywgc2VlIDxodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
NDkyODE+IGZvciBkaXNjdXNzaW9uLgotICAgICAgICAgICAgUHJvY2Vzc2luZ0luc3RydWN0aW9u
KiBwaSA9IHN0YXRpY19jYXN0PFByb2Nlc3NpbmdJbnN0cnVjdGlvbio+KG4pOwotICAgICAgICAg
ICAgc2hlZXQgPSBwaS0+c2hlZXQoKTsKLSNpZiBFTkFCTEUoWFNMVCkKLSAgICAgICAgICAgIC8v
IERvbid0IGFwcGx5IFhTTCB0cmFuc2Zvcm1zIHRvIGFscmVhZHkgdHJhbnNmb3JtZWQgZG9jdW1l
bnRzIC0tIDxyZGFyOi8vcHJvYmxlbS80MTMyODA2PgotICAgICAgICAgICAgaWYgKHBpLT5pc1hT
TCgpICYmICF0cmFuc2Zvcm1Tb3VyY2VEb2N1bWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgLy8g
RG9uJ3QgYXBwbHkgWFNMIHRyYW5zZm9ybXMgdW50aWwgbG9hZGluZyBpcyBmaW5pc2hlZC4KLSAg
ICAgICAgICAgICAgICBpZiAoIXBhcnNpbmcoKSkKLSAgICAgICAgICAgICAgICAgICAgYXBwbHlY
U0xUcmFuc2Zvcm0ocGkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0K
LSNlbmRpZgotICAgICAgICB9IGVsc2UgaWYgKChuLT5pc0hUTUxFbGVtZW50KCkgJiYgKG4tPmhh
c1RhZ05hbWUobGlua1RhZykgfHwgbi0+aGFzVGFnTmFtZShzdHlsZVRhZykpKQotI2lmIEVOQUJM
RShTVkcpCi0gICAgICAgICAgICAgICAgICAgfHwgIChuLT5pc1NWR0VsZW1lbnQoKSAmJiBuLT5o
YXNUYWdOYW1lKFNWR05hbWVzOjpzdHlsZVRhZykpCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAg
ICApIHsKLSAgICAgICAgICAgIEVsZW1lbnQqIGUgPSBzdGF0aWNfY2FzdDxFbGVtZW50Kj4obik7
Ci0gICAgICAgICAgICBBdG9taWNTdHJpbmcgdGl0bGUgPSBlLT5nZXRBdHRyaWJ1dGUodGl0bGVB
dHRyKTsKLSAgICAgICAgICAgIGJvb2wgZW5hYmxlZFZpYVNjcmlwdCA9IGZhbHNlOwotICAgICAg
ICAgICAgaWYgKGUtPmhhc0xvY2FsTmFtZShsaW5rVGFnKSkgewotICAgICAgICAgICAgICAgIC8v
IDxMSU5LPiBlbGVtZW50Ci0gICAgICAgICAgICAgICAgSFRNTExpbmtFbGVtZW50KiBsaW5rRWxl
bWVudCA9IHN0YXRpY19jYXN0PEhUTUxMaW5rRWxlbWVudCo+KG4pOwotICAgICAgICAgICAgICAg
IGlmIChsaW5rRWxlbWVudC0+aXNEaXNhYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICBjb250
aW51ZTsKLSAgICAgICAgICAgICAgICBlbmFibGVkVmlhU2NyaXB0ID0gbGlua0VsZW1lbnQtPmlz
RW5hYmxlZFZpYVNjcmlwdCgpOwotICAgICAgICAgICAgICAgIGlmIChsaW5rRWxlbWVudC0+c3R5
bGVTaGVldElzTG9hZGluZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGl0IGlzIGxvYWRp
bmcgYnV0IHdlIHNob3VsZCBzdGlsbCBkZWNpZGUgd2hpY2ggc3R5bGUgc2hlZXQgc2V0IHRvIHVz
ZQotICAgICAgICAgICAgICAgICAgICBpZiAoIWVuYWJsZWRWaWFTY3JpcHQgJiYgIXRpdGxlLmlz
RW1wdHkoKSAmJiBtX3ByZWZlcnJlZFN0eWxlc2hlZXRTZXQuaXNFbXB0eSgpKSB7Ci0gICAgICAg
ICAgICAgICAgICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcmIHJlbCA9IGUtPmdldEF0dHJpYnV0
ZShyZWxBdHRyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVsLmNvbnRhaW5zKCJh
bHRlcm5hdGUiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcHJlZmVycmVkU3R5
bGVzaGVldFNldCA9IHRpdGxlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc2VsZWN0
ZWRTdHlsZXNoZWV0U2V0ID0gdGl0bGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghbGlua0VsZW1lbnQtPnNoZWV0KCkpCi0g
ICAgICAgICAgICAgICAgICAgIHRpdGxlID0gbnVsbEF0b207Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgcHJlZmVycmVkIHN0eWxlc2V0LiAgVGhpcyBpcyB0
aGUKLSAgICAgICAgICAgIC8vIHNldCBvZiBzaGVldHMgdGhhdCB3aWxsIGJlIGVuYWJsZWQuCi0j
aWYgRU5BQkxFKFNWRykKLSAgICAgICAgICAgIGlmIChuLT5pc1NWR0VsZW1lbnQoKSAmJiBuLT5o
YXNUYWdOYW1lKFNWR05hbWVzOjpzdHlsZVRhZykpCi0gICAgICAgICAgICAgICAgc2hlZXQgPSBz
dGF0aWNfY2FzdDxTVkdTdHlsZUVsZW1lbnQqPihuKS0+c2hlZXQoKTsKLSAgICAgICAgICAgIGVs
c2UKLSNlbmRpZgotICAgICAgICAgICAgaWYgKGUtPmhhc0xvY2FsTmFtZShsaW5rVGFnKSkKLSAg
ICAgICAgICAgICAgICBzaGVldCA9IHN0YXRpY19jYXN0PEhUTUxMaW5rRWxlbWVudCo+KG4pLT5z
aGVldCgpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIC8vIDxTVFlMRT4gZWxl
bWVudAotICAgICAgICAgICAgICAgIHNoZWV0ID0gc3RhdGljX2Nhc3Q8SFRNTFN0eWxlRWxlbWVu
dCo+KG4pLT5zaGVldCgpOwotICAgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoaXMgc2hl
ZXQgYmVsb25ncyB0byBhIHN0eWxlc2V0Ci0gICAgICAgICAgICAvLyAodGh1cyBtYWtpbmcgaXQg
UFJFRkVSUkVEIG9yIEFMVEVSTkFURSByYXRoZXIgdGhhbgotICAgICAgICAgICAgLy8gUEVSU0lT
VEVOVCkuCi0gICAgICAgICAgICBBdG9taWNTdHJpbmcgcmVsID0gZS0+Z2V0QXR0cmlidXRlKHJl
bEF0dHIpOwotICAgICAgICAgICAgaWYgKCFlbmFibGVkVmlhU2NyaXB0ICYmICF0aXRsZS5pc0Vt
cHR5KCkpIHsKLSAgICAgICAgICAgICAgICAvLyBZZXMsIHdlIGhhdmUgYSB0aXRsZS4KLSAgICAg
ICAgICAgICAgICBpZiAobV9wcmVmZXJyZWRTdHlsZXNoZWV0U2V0LmlzRW1wdHkoKSkgewotICAg
ICAgICAgICAgICAgICAgICAvLyBObyBwcmVmZXJyZWQgc2V0IGhhcyBiZWVuIGVzdGFibGlzaGVk
LiAgSWYKLSAgICAgICAgICAgICAgICAgICAgLy8gd2UgYXJlIE5PVCBhbiBhbHRlcm5hdGUgc2hl
ZXQsIHRoZW4gZXN0YWJsaXNoCi0gICAgICAgICAgICAgICAgICAgIC8vIHVzIGFzIHRoZSBwcmVm
ZXJyZWQgc2V0LiAgT3RoZXJ3aXNlLCBqdXN0IGlnbm9yZQotICAgICAgICAgICAgICAgICAgICAv
LyB0aGlzIHNoZWV0LgotICAgICAgICAgICAgICAgICAgICBpZiAoZS0+aGFzTG9jYWxOYW1lKHN0
eWxlVGFnKSB8fCAhcmVsLmNvbnRhaW5zKCJhbHRlcm5hdGUiKSkKLSAgICAgICAgICAgICAgICAg
ICAgICAgIG1fcHJlZmVycmVkU3R5bGVzaGVldFNldCA9IG1fc2VsZWN0ZWRTdHlsZXNoZWV0U2V0
ID0gdGl0bGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh0aXRsZSAh
PSBtX3ByZWZlcnJlZFN0eWxlc2hlZXRTZXQpCi0gICAgICAgICAgICAgICAgICAgIHNoZWV0ID0g
MDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJlbC5jb250YWlucygiYWx0ZXJu
YXRlIikgJiYgdGl0bGUuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIHNoZWV0ID0gMDsKLSAg
ICAgICAgfQotICAgICAgICBpZiAoc2hlZXQpCi0gICAgICAgICAgICBzaGVldHMuYXBwZW5kKHNo
ZWV0KTsKLSAgICB9Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6OnRlc3RBZGRlZFN0eWxlc2hlZXRSZXF1
aXJlc1N0eWxlUmVjYWxjKFN0eWxlU2hlZXRDb250ZW50cyogc3R5bGVzaGVldCkKLXsKLSAgICAv
LyBTZWUgaWYgYWxsIHJ1bGVzIG9uIHRoZSBzaGVldCBhcmUgc2NvcGVkIHRvIHNvbWUgc3BlY2lm
aWMgaWRzIG9yIGNsYXNzZXMuCi0gICAgLy8gVGhlbiB0ZXN0IGlmIHdlIGFjdHVhbGx5IGhhdmUg
YW55IG9mIHRob3NlIGluIHRoZSB0cmVlIGF0IHRoZSBtb21lbnQuCi0gICAgSGFzaFNldDxBdG9t
aWNTdHJpbmdJbXBsKj4gaWRTY29wZXM7IAotICAgIEhhc2hTZXQ8QXRvbWljU3RyaW5nSW1wbCo+
IGNsYXNzU2NvcGVzOwotICAgIGlmICghU3R5bGVSZXNvbHZlcjo6ZGV0ZXJtaW5lU3R5bGVzaGVl
dFNlbGVjdG9yU2NvcGVzKHN0eWxlc2hlZXQsIGlkU2NvcGVzLCBjbGFzc1Njb3BlcykpCi0gICAg
ICAgIHJldHVybiB0cnVlOwotICAgIC8vIEludmFsaWRhdGUgdGhlIHN1YnRyZWVzIHRoYXQgbWF0
Y2ggdGhlIHNjb3Blcy4KLSAgICBOb2RlKiBub2RlID0gZmlyc3RDaGlsZCgpOwotICAgIHdoaWxl
IChub2RlKSB7Ci0gICAgICAgIGlmICghbm9kZS0+aXNTdHlsZWRFbGVtZW50KCkpIHsKLSAgICAg
ICAgICAgIG5vZGUgPSBub2RlLT50cmF2ZXJzZU5leHROb2RlKCk7Ci0gICAgICAgICAgICBjb250
aW51ZTsKLSAgICAgICAgfQotICAgICAgICBTdHlsZWRFbGVtZW50KiBlbGVtZW50ID0gc3RhdGlj
X2Nhc3Q8U3R5bGVkRWxlbWVudCo+KG5vZGUpOwotICAgICAgICBpZiAoU2VsZWN0b3JDaGVja2Vy
OjplbGVtZW50TWF0Y2hlc1NlbGVjdG9yU2NvcGVzKGVsZW1lbnQsIGlkU2NvcGVzLCBjbGFzc1Nj
b3BlcykpIHsKLSAgICAgICAgICAgIGVsZW1lbnQtPnNldE5lZWRzU3R5bGVSZWNhbGMoKTsKLSAg
ICAgICAgICAgIC8vIFRoZSB3aG9sZSBzdWJ0cmVlIGlzIG5vdyBpbnZhbGlkYXRlZCwgd2UgY2Fu
IHNraXAgdG8gdGhlIG5leHQgc2libGluZy4KLSAgICAgICAgICAgIG5vZGUgPSBub2RlLT50cmF2
ZXJzZU5leHRTaWJsaW5nKCk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAg
ICAgICBub2RlID0gbm9kZS0+dHJhdmVyc2VOZXh0Tm9kZSgpOwotICAgIH0KLSAgICByZXR1cm4g
ZmFsc2U7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmFuYWx5emVTdHlsZXNoZWV0Q2hhbmdlKFN0eWxl
UmVzb2x2ZXJVcGRhdGVGbGFnIHVwZGF0ZUZsYWcsIGNvbnN0IFZlY3RvcjxSZWZQdHI8U3R5bGVT
aGVldD4gPiYgbmV3U3R5bGVzaGVldHMsIGJvb2wmIHJlcXVpcmVzU3R5bGVSZXNvbHZlclJlc2V0
LCBib29sJiByZXF1aXJlc0Z1bGxTdHlsZVJlY2FsYykKLXsKLSAgICByZXF1aXJlc1N0eWxlUmVz
b2x2ZXJSZXNldCA9IHRydWU7Ci0gICAgcmVxdWlyZXNGdWxsU3R5bGVSZWNhbGMgPSB0cnVlOwot
ICAgIAotICAgIC8vIFN0eWxlc2hlZXRzIG9mIDxzdHlsZT4gZWxlbWVudHMgdGhhdCBAaW1wb3J0
IHN0eWxlc2hlZXRzIGFyZSBhY3RpdmUgYnV0IGxvYWRpbmcuIFdlIG5lZWQgdG8gdHJpZ2dlciBh
IGZ1bGwgcmVjYWxjIHdoZW4gc3VjaCBsb2FkcyBhcmUgZG9uZS4KLSAgICBib29sIGhhc0FjdGl2
ZUxvYWRpbmdTdHlsZXNoZWV0ID0gZmFsc2U7Ci0gICAgdW5zaWduZWQgbmV3U3R5bGVzaGVldENv
dW50ID0gbmV3U3R5bGVzaGVldHMuc2l6ZSgpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBuZXdTdHlsZXNoZWV0Q291bnQ7ICsraSkgewotICAgICAgICBpZiAobmV3U3R5bGVzaGVldHNb
aV0tPmlzTG9hZGluZygpKQotICAgICAgICAgICAgaGFzQWN0aXZlTG9hZGluZ1N0eWxlc2hlZXQg
PSB0cnVlOwotICAgIH0KLSAgICBpZiAobV9oYWRBY3RpdmVMb2FkaW5nU3R5bGVzaGVldCAmJiAh
aGFzQWN0aXZlTG9hZGluZ1N0eWxlc2hlZXQpIHsKLSAgICAgICAgbV9oYWRBY3RpdmVMb2FkaW5n
U3R5bGVzaGVldCA9IGZhbHNlOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1faGFkQWN0
aXZlTG9hZGluZ1N0eWxlc2hlZXQgPSBoYXNBY3RpdmVMb2FkaW5nU3R5bGVzaGVldDsKLQotICAg
IGlmICh1cGRhdGVGbGFnICE9IFJlY2FsY1N0eWxlSWZOZWVkZWQpCi0gICAgICAgIHJldHVybjsK
LSAgICBpZiAoIW1fc3R5bGVSZXNvbHZlcikKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gU2Vl
IGlmIHdlIGFyZSBqdXN0IGFkZGluZyBzdHlsZXNoZWV0cy4KLSAgICB1bnNpZ25lZCBvbGRTdHls
ZXNoZWV0Q291bnQgPSBtX3N0eWxlU2hlZXRzLT5sZW5ndGgoKTsKLSAgICBpZiAobmV3U3R5bGVz
aGVldENvdW50IDwgb2xkU3R5bGVzaGVldENvdW50KQotICAgICAgICByZXR1cm47Ci0gICAgZm9y
ICh1bnNpZ25lZCBpID0gMDsgaSA8IG9sZFN0eWxlc2hlZXRDb3VudDsgKytpKSB7Ci0gICAgICAg
IGlmIChtX3N0eWxlU2hlZXRzLT5pdGVtKGkpICE9IG5ld1N0eWxlc2hlZXRzW2ldKQotICAgICAg
ICAgICAgcmV0dXJuOwotICAgIH0KLSAgICByZXF1aXJlc1N0eWxlUmVzb2x2ZXJSZXNldCA9IGZh
bHNlOwotCi0gICAgLy8gSWYgd2UgYXJlIGFscmVhZHkgcGFyc2luZyB0aGUgYm9keSBhbmQgc28g
bWF5IGhhdmUgc2lnbmlmaWNhbnQgYW1vdW50IG9mIGVsZW1lbnRzLCBwdXQgc29tZSBlZmZvcnQg
aW50byB0cnlpbmcgdG8gYXZvaWQgc3R5bGUgcmVjYWxjcy4KLSAgICBpZiAoIWJvZHkoKSB8fCBt
X2hhc05vZGVzV2l0aFBsYWNlaG9sZGVyU3R5bGUpCi0gICAgICAgIHJldHVybjsKLSAgICBmb3Ig
KHVuc2lnbmVkIGkgPSBvbGRTdHlsZXNoZWV0Q291bnQ7IGkgPCBuZXdTdHlsZXNoZWV0Q291bnQ7
ICsraSkgewotICAgICAgICBpZiAoIW5ld1N0eWxlc2hlZXRzW2ldLT5pc0NTU1N0eWxlU2hlZXQo
KSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYgKG5ld1N0eWxlc2hlZXRzW2ldLT5k
aXNhYmxlZCgpKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGlmICh0ZXN0QWRkZWRT
dHlsZXNoZWV0UmVxdWlyZXNTdHlsZVJlY2FsYyhzdGF0aWNfY2FzdDxDU1NTdHlsZVNoZWV0Kj4o
bmV3U3R5bGVzaGVldHNbaV0uZ2V0KCkpLT5jb250ZW50cygpKSkKLSAgICAgICAgICAgIHJldHVy
bjsKLSAgICB9Ci0gICAgcmVxdWlyZXNGdWxsU3R5bGVSZWNhbGMgPSBmYWxzZTsKLX0KLQotc3Rh
dGljIGJvb2wgc3R5bGVTaGVldHNVc2VSZW1Vbml0cyhjb25zdCBWZWN0b3I8UmVmUHRyPFN0eWxl
U2hlZXQ+ID4mIHNoZWV0cykKLXsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2hlZXRz
LnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGlmICghc2hlZXRzW2ldLT5pc0NTU1N0eWxlU2hlZXQo
KSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8Q1NTU3R5
bGVTaGVldCo+KHNoZWV0c1tpXS5nZXQoKSktPmNvbnRlbnRzKCktPnVzZXNSZW1Vbml0cygpKQot
ICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQot
dm9pZCBEb2N1bWVudDo6bm90aWZ5U2VhbWxlc3NDaGlsZERvY3VtZW50c09mU3R5bGVzaGVldFVw
ZGF0ZSgpIGNvbnN0Ci17Ci0gICAgLy8gSWYgd2UncmUgbm90IGluIGEgZnJhbWUgeWV0IGFueSBw
b3RlbnRpYWwgY2hpbGQgZG9jdW1lbnRzIHdvbid0IGhhdmUgYSBTdHlsZVJlc29sdmVyIHRvIHVw
ZGF0ZS4KLSAgICBpZiAoIWZyYW1lKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIFNlYW1s
ZXNzIGNoaWxkIGZyYW1lcyBhcmUgZXhwZWN0ZWQgdG8gbm90aWZ5IHRoZWlyIHNlYW1sZXNzIGNo
aWxkcmVuIHJlY3Vyc2l2ZWx5LCBzbyB3ZSBvbmx5IGRvIGRpcmVjdCBjaGlsZHJlbi4KLSAgICBm
b3IgKEZyYW1lKiBjaGlsZCA9IGZyYW1lKCktPnRyZWUoKS0+Zmlyc3RDaGlsZCgpOyBjaGlsZDsg
Y2hpbGQgPSBjaGlsZC0+dHJlZSgpLT5uZXh0U2libGluZygpKSB7Ci0gICAgICAgIERvY3VtZW50
KiBjaGlsZERvY3VtZW50ID0gY2hpbGQtPmRvY3VtZW50KCk7Ci0gICAgICAgIGlmIChjaGlsZERv
Y3VtZW50LT5zaG91bGREaXNwbGF5U2VhbWxlc3NseVdpdGhQYXJlbnQoKSkgewotICAgICAgICAg
ICAgQVNTRVJUKGNoaWxkRG9jdW1lbnQtPnNlYW1sZXNzUGFyZW50SUZyYW1lKCktPmRvY3VtZW50
KCkgPT0gdGhpcyk7Ci0gICAgICAgICAgICBjaGlsZERvY3VtZW50LT5zZWFtbGVzc1BhcmVudFVw
ZGF0ZWRTdHlsZXNoZWV0cygpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1ib29sIERvY3VtZW50
Ojp1cGRhdGVBY3RpdmVTdHlsZXNoZWV0cyhTdHlsZVJlc29sdmVyVXBkYXRlRmxhZyB1cGRhdGVG
bGFnKQotewotICAgIGlmIChtX2luU3R5bGVSZWNhbGMpIHsKLSAgICAgICAgLy8gU1ZHIDx1c2U+
IGVsZW1lbnQgbWF5IG1hbmFnZSB0byBpbnZhbGlkYXRlIHN0eWxlIHNlbGVjdG9yIGluIHRoZSBt
aWRkbGUgb2YgYSBzdHlsZSByZWNhbGMuCi0gICAgICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQu
b3JnL3Nob3dfYnVnLmNnaT9pZD01NDM0NAotICAgICAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQg
YmUgZml4ZWQgaW4gU1ZHIGFuZCB0aGlzIGNvZGUgcmVwbGFjZWQgd2l0aCBBU1NFUlQoIW1faW5T
dHlsZVJlY2FsYykuCi0gICAgICAgIG1faGFzRGlydHlTdHlsZVJlc29sdmVyID0gdHJ1ZTsKLSAg
ICAgICAgc2NoZWR1bGVGb3JjZWRTdHlsZVJlY2FsYygpOwotICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgfQotICAgIGlmICghcmVuZGVyZXIoKSB8fCAhYXR0YWNoZWQoKSkKLSAgICAgICAgcmV0
dXJuIGZhbHNlOwotCi0gICAgU3R5bGVTaGVldFZlY3RvciBuZXdTdHlsZXNoZWV0czsKLSAgICBj
b2xsZWN0QWN0aXZlU3R5bGVzaGVldHMobmV3U3R5bGVzaGVldHMpOwotCi0gICAgYm9vbCByZXF1
aXJlc1N0eWxlUmVzb2x2ZXJSZXNldDsKLSAgICBib29sIHJlcXVpcmVzRnVsbFN0eWxlUmVjYWxj
OwotICAgIGFuYWx5emVTdHlsZXNoZWV0Q2hhbmdlKHVwZGF0ZUZsYWcsIG5ld1N0eWxlc2hlZXRz
LCByZXF1aXJlc1N0eWxlUmVzb2x2ZXJSZXNldCwgcmVxdWlyZXNGdWxsU3R5bGVSZWNhbGMpOwot
Ci0gICAgaWYgKHJlcXVpcmVzU3R5bGVSZXNvbHZlclJlc2V0KQotICAgICAgICBjbGVhclN0eWxl
UmVzb2x2ZXIoKTsKLSAgICBlbHNlIHsKLSAgICAgICAgbV9zdHlsZVJlc29sdmVyLT5hcHBlbmRB
dXRob3JTdHlsZXNoZWV0cyhtX3N0eWxlU2hlZXRzLT5sZW5ndGgoKSwgbmV3U3R5bGVzaGVldHMp
OwotICAgICAgICByZXNldENTU0ZlYXR1cmVGbGFncygpOwotICAgIH0KLSAgICBtX3N0eWxlU2hl
ZXRzLT5zd2FwKG5ld1N0eWxlc2hlZXRzKTsKLQotICAgIG1fdXNlc1JlbVVuaXRzID0gc3R5bGVT
aGVldHNVc2VSZW1Vbml0cyhtX3N0eWxlU2hlZXRzLT52ZWN0b3IoKSk7Ci0gICAgbV9kaWRDYWxj
dWxhdGVTdHlsZVJlc29sdmVyID0gdHJ1ZTsKLSAgICBtX2hhc0RpcnR5U3R5bGVSZXNvbHZlciA9
IGZhbHNlOwotCi0gICAgbm90aWZ5U2VhbWxlc3NDaGlsZERvY3VtZW50c09mU3R5bGVzaGVldFVw
ZGF0ZSgpOwotCi0gICAgcmV0dXJuIHJlcXVpcmVzRnVsbFN0eWxlUmVjYWxjOwotfQotCi12b2lk
IERvY3VtZW50OjpzZXRIb3Zlck5vZGUoUGFzc1JlZlB0cjxOb2RlPiBuZXdIb3Zlck5vZGUpCi17
Ci0gICAgbV9ob3Zlck5vZGUgPSBuZXdIb3Zlck5vZGU7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnNl
dEFjdGl2ZU5vZGUoUGFzc1JlZlB0cjxOb2RlPiBuZXdBY3RpdmVOb2RlKQotewotICAgIG1fYWN0
aXZlTm9kZSA9IG5ld0FjdGl2ZU5vZGU7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmZvY3VzZWROb2Rl
UmVtb3ZlZCgpCi17Ci0gICAgc2V0Rm9jdXNlZE5vZGUoMCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6
OnJlbW92ZUZvY3VzZWROb2RlT2ZTdWJ0cmVlKE5vZGUqIG5vZGUsIGJvb2wgYW1vbmdDaGlsZHJl
bk9ubHkpCi17Ci0gICAgaWYgKCFtX2ZvY3VzZWROb2RlIHx8IHRoaXMtPmluUGFnZUNhY2hlKCkp
IC8vIElmIHRoZSBkb2N1bWVudCBpcyBpbiB0aGUgcGFnZSBjYWNoZSwgdGhlbiB3ZSBkb24ndCBu
ZWVkIHRvIGNsZWFyIG91dCB0aGUgZm9jdXNlZCBub2RlLgotICAgICAgICByZXR1cm47Ci0gICAg
ICAgIAotICAgIGJvb2wgbm9kZUluU3VidHJlZSA9IGZhbHNlOwotICAgIGlmIChhbW9uZ0NoaWxk
cmVuT25seSkKLSAgICAgICAgbm9kZUluU3VidHJlZSA9IG1fZm9jdXNlZE5vZGUtPmlzRGVzY2Vu
ZGFudE9mKG5vZGUpOwotICAgIGVsc2UKLSAgICAgICAgbm9kZUluU3VidHJlZSA9IChtX2ZvY3Vz
ZWROb2RlID09IG5vZGUpIHx8IG1fZm9jdXNlZE5vZGUtPmlzRGVzY2VuZGFudE9mKG5vZGUpOwot
ICAgIAotICAgIGlmIChub2RlSW5TdWJ0cmVlKQotICAgICAgICBkb2N1bWVudCgpLT5mb2N1c2Vk
Tm9kZVJlbW92ZWQoKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6aG92ZXJlZE5vZGVEZXRhY2hlZChO
b2RlKiBub2RlKQotewotICAgIGlmICghbV9ob3Zlck5vZGUgfHwgKG5vZGUgIT0gbV9ob3Zlck5v
ZGUgJiYgKCFtX2hvdmVyTm9kZS0+aXNUZXh0Tm9kZSgpIHx8IG5vZGUgIT0gbV9ob3Zlck5vZGUt
PnBhcmVudE5vZGUoKSkpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX2hvdmVyTm9kZSA9IG5v
ZGUtPnBhcmVudE5vZGUoKTsKLSAgICB3aGlsZSAobV9ob3Zlck5vZGUgJiYgIW1faG92ZXJOb2Rl
LT5yZW5kZXJlcigpKQotICAgICAgICBtX2hvdmVyTm9kZSA9IG1faG92ZXJOb2RlLT5wYXJlbnRO
b2RlKCk7Ci0gICAgaWYgKGZyYW1lKCkpCi0gICAgICAgIGZyYW1lKCktPmV2ZW50SGFuZGxlcigp
LT5zY2hlZHVsZUhvdmVyU3RhdGVVcGRhdGUoKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6YWN0aXZl
Q2hhaW5Ob2RlRGV0YWNoZWQoTm9kZSogbm9kZSkKLXsKLSAgICBpZiAoIW1fYWN0aXZlTm9kZSB8
fCAobm9kZSAhPSBtX2FjdGl2ZU5vZGUgJiYgKCFtX2FjdGl2ZU5vZGUtPmlzVGV4dE5vZGUoKSB8
fCBub2RlICE9IG1fYWN0aXZlTm9kZS0+cGFyZW50Tm9kZSgpKSkpCi0gICAgICAgIHJldHVybjsK
LQotICAgIG1fYWN0aXZlTm9kZSA9IG5vZGUtPnBhcmVudE5vZGUoKTsKLSAgICB3aGlsZSAobV9h
Y3RpdmVOb2RlICYmICFtX2FjdGl2ZU5vZGUtPnJlbmRlcmVyKCkpCi0gICAgICAgIG1fYWN0aXZl
Tm9kZSA9IG1fYWN0aXZlTm9kZS0+cGFyZW50Tm9kZSgpOwotfQotCi0jaWYgRU5BQkxFKERBU0hC
T0FSRF9TVVBQT1JUKSB8fCBFTkFCTEUoV0lER0VUX1JFR0lPTikKLWNvbnN0IFZlY3RvcjxEYXNo
Ym9hcmRSZWdpb25WYWx1ZT4mIERvY3VtZW50OjpkYXNoYm9hcmRSZWdpb25zKCkgY29uc3QKLXsK
LSAgICByZXR1cm4gbV9kYXNoYm9hcmRSZWdpb25zOwotfQotCi12b2lkIERvY3VtZW50OjpzZXRE
YXNoYm9hcmRSZWdpb25zKGNvbnN0IFZlY3RvcjxEYXNoYm9hcmRSZWdpb25WYWx1ZT4mIHJlZ2lv
bnMpCi17Ci0gICAgbV9kYXNoYm9hcmRSZWdpb25zID0gcmVnaW9uczsKLSAgICBzZXREYXNoYm9h
cmRSZWdpb25zRGlydHkoZmFsc2UpOwotfQotI2VuZGlmCi0KLWJvb2wgRG9jdW1lbnQ6OnNldEZv
Y3VzZWROb2RlKFBhc3NSZWZQdHI8Tm9kZT4gcHJwTmV3Rm9jdXNlZE5vZGUpCi17Ci0gICAgUmVm
UHRyPE5vZGU+IG5ld0ZvY3VzZWROb2RlID0gcHJwTmV3Rm9jdXNlZE5vZGU7Ci0KLSAgICAvLyBN
YWtlIHN1cmUgbmV3Rm9jdXNlZE5vZGUgaXMgYWN0dWFsbHkgaW4gdGhpcyBkb2N1bWVudAotICAg
IGlmIChuZXdGb2N1c2VkTm9kZSAmJiAobmV3Rm9jdXNlZE5vZGUtPmRvY3VtZW50KCkgIT0gdGhp
cykpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgaWYgKG1fZm9jdXNlZE5vZGUgPT0gbmV3
Rm9jdXNlZE5vZGUpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgaWYgKG1faW5QYWdlQ2Fj
aGUpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGJvb2wgZm9jdXNDaGFuZ2VCbG9ja2Vk
ID0gZmFsc2U7Ci0gICAgUmVmUHRyPE5vZGU+IG9sZEZvY3VzZWROb2RlID0gbV9mb2N1c2VkTm9k
ZTsKLSAgICBtX2ZvY3VzZWROb2RlID0gMDsKLQotICAgIC8vIFJlbW92ZSBmb2N1cyBmcm9tIHRo
ZSBleGlzdGluZyBmb2N1cyBub2RlIChpZiBhbnkpCi0gICAgaWYgKG9sZEZvY3VzZWROb2RlKSB7
Ci0gICAgICAgIEFTU0VSVCghb2xkRm9jdXNlZE5vZGUtPmluRGV0YWNoKCkpOwotCi0gICAgICAg
IGlmIChvbGRGb2N1c2VkTm9kZS0+YWN0aXZlKCkpCi0gICAgICAgICAgICBvbGRGb2N1c2VkTm9k
ZS0+c2V0QWN0aXZlKGZhbHNlKTsKLQotICAgICAgICBvbGRGb2N1c2VkTm9kZS0+c2V0Rm9jdXMo
ZmFsc2UpOwotCi0gICAgICAgIC8vIERpc3BhdGNoIGEgY2hhbmdlIGV2ZW50IGZvciB0ZXh0IGZp
ZWxkcyBvciB0ZXh0YXJlYXMgdGhhdCBoYXZlIGJlZW4gZWRpdGVkCi0gICAgICAgIGlmIChvbGRG
b2N1c2VkTm9kZS0+aXNFbGVtZW50Tm9kZSgpKSB7Ci0gICAgICAgICAgICBFbGVtZW50KiBlbGVt
ZW50ID0gc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG9sZEZvY3VzZWROb2RlLmdldCgpKTsKLSAgICAg
ICAgICAgIGlmIChlbGVtZW50LT53YXNDaGFuZ2VkU2luY2VMYXN0Rm9ybUNvbnRyb2xDaGFuZ2VF
dmVudCgpKQotICAgICAgICAgICAgICAgIGVsZW1lbnQtPmRpc3BhdGNoRm9ybUNvbnRyb2xDaGFu
Z2VFdmVudCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRGlzcGF0Y2ggdGhlIGJsdXIgZXZl
bnQgYW5kIGxldCB0aGUgbm9kZSBkbyBhbnkgb3RoZXIgYmx1ciByZWxhdGVkIGFjdGl2aXRpZXMg
KGltcG9ydGFudCBmb3IgdGV4dCBmaWVsZHMpCi0gICAgICAgIG9sZEZvY3VzZWROb2RlLT5kaXNw
YXRjaEJsdXJFdmVudChuZXdGb2N1c2VkTm9kZSk7Ci0KLSAgICAgICAgaWYgKG1fZm9jdXNlZE5v
ZGUpIHsKLSAgICAgICAgICAgIC8vIGhhbmRsZXIgc2hpZnRlZCBmb2N1cwotICAgICAgICAgICAg
Zm9jdXNDaGFuZ2VCbG9ja2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIG5ld0ZvY3VzZWROb2RlID0g
MDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgb2xkRm9jdXNlZE5vZGUtPmRpc3BhdGNo
Rm9jdXNPdXRFdmVudChldmVudE5hbWVzKCkuZm9jdXNvdXRFdmVudCwgbmV3Rm9jdXNlZE5vZGUp
OyAvLyBET00gbGV2ZWwgMyBuYW1lIGZvciB0aGUgYnViYmxpbmcgYmx1ciBldmVudC4KLSAgICAg
ICAgLy8gRklYTUU6IFdlIHNob3VsZCByZW1vdmUgZmlyaW5nIERPTUZvY3VzT3V0RXZlbnQgZXZl
bnQgd2hlbiB3ZSBhcmUgc3VyZSBubyBjb250ZW50IGRlcGVuZHMKLSAgICAgICAgLy8gb24gaXQs
IHByb2JhYmx5IHdoZW4gPHJkYXI6Ly9wcm9ibGVtLzg1MDM5NTg+IGlzIHJlc29sdmVkLgotICAg
ICAgICBvbGRGb2N1c2VkTm9kZS0+ZGlzcGF0Y2hGb2N1c091dEV2ZW50KGV2ZW50TmFtZXMoKS5E
T01Gb2N1c091dEV2ZW50LCBuZXdGb2N1c2VkTm9kZSk7IC8vIERPTSBsZXZlbCAyIG5hbWUgZm9y
IGNvbXBhdGliaWxpdHkuCi0KLSAgICAgICAgaWYgKG1fZm9jdXNlZE5vZGUpIHsKLSAgICAgICAg
ICAgIC8vIGhhbmRsZXIgc2hpZnRlZCBmb2N1cwotICAgICAgICAgICAgZm9jdXNDaGFuZ2VCbG9j
a2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIG5ld0ZvY3VzZWROb2RlID0gMDsKLSAgICAgICAgfQot
ICAgICAgICBpZiAob2xkRm9jdXNlZE5vZGUgPT0gdGhpcyAmJiBvbGRGb2N1c2VkTm9kZS0+aGFz
T25lUmVmKCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIAotICAgICAg
ICBpZiAob2xkRm9jdXNlZE5vZGUtPmlzUm9vdEVkaXRhYmxlRWxlbWVudCgpKQotICAgICAgICAg
ICAgZnJhbWUoKS0+ZWRpdG9yKCktPmRpZEVuZEVkaXRpbmcoKTsKLQotICAgICAgICBpZiAodmll
dygpKSB7Ci0gICAgICAgICAgICBXaWRnZXQqIG9sZFdpZGdldCA9IHdpZGdldEZvck5vZGUob2xk
Rm9jdXNlZE5vZGUuZ2V0KCkpOwotICAgICAgICAgICAgaWYgKG9sZFdpZGdldCkKLSAgICAgICAg
ICAgICAgICBvbGRXaWRnZXQtPnNldEZvY3VzKGZhbHNlKTsKLSAgICAgICAgICAgIGVsc2UKLSAg
ICAgICAgICAgICAgICB2aWV3KCktPnNldEZvY3VzKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0K
LQotICAgIGlmIChuZXdGb2N1c2VkTm9kZSkgewotICAgICAgICBpZiAobmV3Rm9jdXNlZE5vZGUt
PmlzUm9vdEVkaXRhYmxlRWxlbWVudCgpICYmICFhY2NlcHRzRWRpdGluZ0ZvY3VzKG5ld0ZvY3Vz
ZWROb2RlLmdldCgpKSkgewotICAgICAgICAgICAgLy8gZGVsZWdhdGUgYmxvY2tzIGZvY3VzIGNo
YW5nZQotICAgICAgICAgICAgZm9jdXNDaGFuZ2VCbG9ja2VkID0gdHJ1ZTsKLSAgICAgICAgICAg
IGdvdG8gU2V0Rm9jdXNlZE5vZGVEb25lOwotICAgICAgICB9Ci0gICAgICAgIC8vIFNldCBmb2N1
cyBvbiB0aGUgbmV3IG5vZGUKLSAgICAgICAgbV9mb2N1c2VkTm9kZSA9IG5ld0ZvY3VzZWROb2Rl
OwotCi0gICAgICAgIC8vIERpc3BhdGNoIHRoZSBmb2N1cyBldmVudCBhbmQgbGV0IHRoZSBub2Rl
IGRvIGFueSBvdGhlciBmb2N1cyByZWxhdGVkIGFjdGl2aXRpZXMgKGltcG9ydGFudCBmb3IgdGV4
dCBmaWVsZHMpCi0gICAgICAgIG1fZm9jdXNlZE5vZGUtPmRpc3BhdGNoRm9jdXNFdmVudChvbGRG
b2N1c2VkTm9kZSk7Ci0KLSAgICAgICAgaWYgKG1fZm9jdXNlZE5vZGUgIT0gbmV3Rm9jdXNlZE5v
ZGUpIHsKLSAgICAgICAgICAgIC8vIGhhbmRsZXIgc2hpZnRlZCBmb2N1cwotICAgICAgICAgICAg
Zm9jdXNDaGFuZ2VCbG9ja2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIGdvdG8gU2V0Rm9jdXNlZE5v
ZGVEb25lOwotICAgICAgICB9Ci0KLSAgICAgICAgbV9mb2N1c2VkTm9kZS0+ZGlzcGF0Y2hGb2N1
c0luRXZlbnQoZXZlbnROYW1lcygpLmZvY3VzaW5FdmVudCwgb2xkRm9jdXNlZE5vZGUpOyAvLyBE
T00gbGV2ZWwgMyBidWJibGluZyBmb2N1cyBldmVudC4KLQotICAgICAgICBpZiAobV9mb2N1c2Vk
Tm9kZSAhPSBuZXdGb2N1c2VkTm9kZSkgewotICAgICAgICAgICAgLy8gaGFuZGxlciBzaGlmdGVk
IGZvY3VzCi0gICAgICAgICAgICBmb2N1c0NoYW5nZUJsb2NrZWQgPSB0cnVlOwotICAgICAgICAg
ICAgZ290byBTZXRGb2N1c2VkTm9kZURvbmU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBGSVhN
RTogV2Ugc2hvdWxkIHJlbW92ZSBmaXJpbmcgRE9NRm9jdXNJbkV2ZW50IGV2ZW50IHdoZW4gd2Ug
YXJlIHN1cmUgbm8gY29udGVudCBkZXBlbmRzCi0gICAgICAgIC8vIG9uIGl0LCBwcm9iYWJseSB3
aGVuIDxyZGFyOi8vcHJvYmxlbS84NTAzOTU4PiBpcyBtLgotICAgICAgICBtX2ZvY3VzZWROb2Rl
LT5kaXNwYXRjaEZvY3VzSW5FdmVudChldmVudE5hbWVzKCkuRE9NRm9jdXNJbkV2ZW50LCBvbGRG
b2N1c2VkTm9kZSk7IC8vIERPTSBsZXZlbCAyIGZvciBjb21wYXRpYmlsaXR5LgotCi0gICAgICAg
IGlmIChtX2ZvY3VzZWROb2RlICE9IG5ld0ZvY3VzZWROb2RlKSB7IAotICAgICAgICAgICAgLy8g
aGFuZGxlciBzaGlmdGVkIGZvY3VzCi0gICAgICAgICAgICBmb2N1c0NoYW5nZUJsb2NrZWQgPSB0
cnVlOwotICAgICAgICAgICAgZ290byBTZXRGb2N1c2VkTm9kZURvbmU7Ci0gICAgICAgIH0KLSAg
ICAgICAgbV9mb2N1c2VkTm9kZS0+c2V0Rm9jdXModHJ1ZSk7Ci0KLSAgICAgICAgaWYgKG1fZm9j
dXNlZE5vZGUtPmlzUm9vdEVkaXRhYmxlRWxlbWVudCgpKQotICAgICAgICAgICAgZnJhbWUoKS0+
ZWRpdG9yKCktPmRpZEJlZ2luRWRpdGluZygpOwotCi0gICAgICAgIC8vIGV3dywgSSBzdWNrLiBz
ZXQgdGhlIHF0IGZvY3VzIGNvcnJlY3RseQotICAgICAgICAvLyAjIyMgZmluZCBhIGJldHRlciBw
bGFjZSBpbiB0aGUgY29kZSBmb3IgdGhpcwotICAgICAgICBpZiAodmlldygpKSB7Ci0gICAgICAg
ICAgICBXaWRnZXQqIGZvY3VzV2lkZ2V0ID0gd2lkZ2V0Rm9yTm9kZShtX2ZvY3VzZWROb2RlLmdl
dCgpKTsKLSAgICAgICAgICAgIGlmIChmb2N1c1dpZGdldCkgewotICAgICAgICAgICAgICAgIC8v
IE1ha2Ugc3VyZSBhIHdpZGdldCBoYXMgdGhlIHJpZ2h0IHNpemUgYmVmb3JlIGdpdmluZyBpdCBm
b2N1cy4KLSAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHdlIGFyZSB0ZXN0aW5nIGVkZ2Ug
Y2FzZXMgb2YgdGhlIFdpZGdldCBjb2RlLgotICAgICAgICAgICAgICAgIC8vIFNwZWNpZmljYWxs
eSwgaW4gV2ViQ29yZSB0aGlzIGRvZXMgbm90IHdvcmsgd2VsbCBmb3IgdGV4dCBmaWVsZHMuCi0g
ICAgICAgICAgICAgICAgdXBkYXRlTGF5b3V0KCk7Ci0gICAgICAgICAgICAgICAgLy8gUmUtZ2V0
IHRoZSB3aWRnZXQgaW4gY2FzZSB1cGRhdGluZyB0aGUgbGF5b3V0IGNoYW5nZWQgdGhpbmdzLgot
ICAgICAgICAgICAgICAgIGZvY3VzV2lkZ2V0ID0gd2lkZ2V0Rm9yTm9kZShtX2ZvY3VzZWROb2Rl
LmdldCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChmb2N1c1dpZGdldCkKLSAg
ICAgICAgICAgICAgICBmb2N1c1dpZGdldC0+c2V0Rm9jdXModHJ1ZSk7Ci0gICAgICAgICAgICBl
bHNlCi0gICAgICAgICAgICAgICAgdmlldygpLT5zZXRGb2N1cyh0cnVlKTsKLSAgICAgICAgfQot
ICAgIH0KLQotI2lmIFBMQVRGT1JNKE1BQykgfHwgUExBVEZPUk0oV0lOKSB8fCBQTEFURk9STShH
VEspIHx8IFBMQVRGT1JNKENIUk9NSVVNKQotICAgIGlmICghZm9jdXNDaGFuZ2VCbG9ja2VkICYm
IG1fZm9jdXNlZE5vZGUgJiYgQVhPYmplY3RDYWNoZTo6YWNjZXNzaWJpbGl0eUVuYWJsZWQoKSkK
LSAgICAgICAgYXhPYmplY3RDYWNoZSgpLT5oYW5kbGVGb2N1c2VkVUlFbGVtZW50Q2hhbmdlZChv
bGRGb2N1c2VkTm9kZS5nZXQoKSwgbmV3Rm9jdXNlZE5vZGUuZ2V0KCkpOwotI2VuZGlmCi0gICAg
aWYgKCFmb2N1c0NoYW5nZUJsb2NrZWQpCi0gICAgICAgIHBhZ2UoKS0+Y2hyb21lKCktPmZvY3Vz
ZWROb2RlQ2hhbmdlZChtX2ZvY3VzZWROb2RlLmdldCgpKTsKLQotU2V0Rm9jdXNlZE5vZGVEb25l
OgotICAgIHVwZGF0ZVN0eWxlSWZOZWVkZWQoKTsKLSAgICByZXR1cm4gIWZvY3VzQ2hhbmdlQmxv
Y2tlZDsKLX0KLSAgICAKLXZvaWQgRG9jdW1lbnQ6OmdldEZvY3VzYWJsZU5vZGVzKFZlY3RvcjxS
ZWZQdHI8Tm9kZT4gPiYgbm9kZXMpCi17Ci0gICAgdXBkYXRlTGF5b3V0KCk7Ci0KLSAgICBmb3Ig
KE5vZGUqIG5vZGUgPSBmaXJzdENoaWxkKCk7IG5vZGU7IG5vZGUgPSBub2RlLT50cmF2ZXJzZU5l
eHROb2RlKCkpIHsKLSAgICAgICAgaWYgKG5vZGUtPmlzRm9jdXNhYmxlKCkpCi0gICAgICAgICAg
ICBub2Rlcy5hcHBlbmQobm9kZSk7Ci0gICAgfQotfQotICAKLXZvaWQgRG9jdW1lbnQ6OnNldENT
U1RhcmdldChFbGVtZW50KiBuKQotewotICAgIGlmIChtX2Nzc1RhcmdldCkKLSAgICAgICAgbV9j
c3NUYXJnZXQtPnNldE5lZWRzU3R5bGVSZWNhbGMoKTsKLSAgICBtX2Nzc1RhcmdldCA9IG47Ci0g
ICAgaWYgKG4pCi0gICAgICAgIG4tPnNldE5lZWRzU3R5bGVSZWNhbGMoKTsKLX0KLQotdm9pZCBE
b2N1bWVudDo6cmVnaXN0ZXJOb2RlTGlzdENhY2hlKER5bmFtaWNOb2RlTGlzdENhY2hlQmFzZSog
bGlzdCkKLXsKLSAgICBpZiAobGlzdC0+dHlwZSgpICE9IE5vZGVMaXN0Q29sbGVjdGlvblR5cGUp
Ci0gICAgICAgIG1fbm9kZUxpc3RDb3VudHNbSW52YWxpZGF0ZU9uSWROYW1lQXR0ckNoYW5nZV0r
KzsKLSAgICBtX25vZGVMaXN0Q291bnRzW2xpc3QtPmludmFsaWRhdGlvblR5cGUoKV0rKzsKLSAg
ICBpZiAobGlzdC0+aXNSb290ZWRBdERvY3VtZW50KCkpCi0gICAgICAgIG1fbGlzdHNJbnZhbGlk
YXRlZEF0RG9jdW1lbnQuYWRkKGxpc3QpOwotfQotCi12b2lkIERvY3VtZW50Ojp1bnJlZ2lzdGVy
Tm9kZUxpc3RDYWNoZShEeW5hbWljTm9kZUxpc3RDYWNoZUJhc2UqIGxpc3QpCi17Ci0gICAgaWYg
KGxpc3QtPnR5cGUoKSAhPSBOb2RlTGlzdENvbGxlY3Rpb25UeXBlKQotICAgICAgICBtX25vZGVM
aXN0Q291bnRzW0ludmFsaWRhdGVPbklkTmFtZUF0dHJDaGFuZ2VdLS07Ci0gICAgbV9ub2RlTGlz
dENvdW50c1tsaXN0LT5pbnZhbGlkYXRpb25UeXBlKCldLS07Ci0gICAgaWYgKGxpc3QtPmlzUm9v
dGVkQXREb2N1bWVudCgpKSB7Ci0gICAgICAgIEFTU0VSVChtX2xpc3RzSW52YWxpZGF0ZWRBdERv
Y3VtZW50LmNvbnRhaW5zKGxpc3QpKTsKLSAgICAgICAgbV9saXN0c0ludmFsaWRhdGVkQXREb2N1
bWVudC5yZW1vdmUobGlzdCk7Ci0gICAgfQotfQotCi12b2lkIERvY3VtZW50OjphdHRhY2hOb2Rl
SXRlcmF0b3IoTm9kZUl0ZXJhdG9yKiBuaSkKLXsKLSAgICBtX25vZGVJdGVyYXRvcnMuYWRkKG5p
KTsKLX0KLQotdm9pZCBEb2N1bWVudDo6ZGV0YWNoTm9kZUl0ZXJhdG9yKE5vZGVJdGVyYXRvciog
bmkpCi17Ci0gICAgLy8gVGhlIG5vZGUgaXRlcmF0b3IgY2FuIGJlIGRldGFjaGVkIHdpdGhvdXQg
aGF2aW5nIGJlZW4gYXR0YWNoZWQgaWYgaXRzIHJvb3Qgbm9kZSBkaWRuJ3QgaGF2ZSBhIGRvY3Vt
ZW50Ci0gICAgLy8gd2hlbiB0aGUgaXRlcmF0b3Igd2FzIGNyZWF0ZWQsIGJ1dCBoYXMgaXQgbm93
LgotICAgIG1fbm9kZUl0ZXJhdG9ycy5yZW1vdmUobmkpOwotfQotCi12b2lkIERvY3VtZW50Ojpt
b3ZlTm9kZUl0ZXJhdG9yc1RvTmV3RG9jdW1lbnQoTm9kZSogbm9kZSwgRG9jdW1lbnQqIG5ld0Rv
Y3VtZW50KQotewotICAgIEhhc2hTZXQ8Tm9kZUl0ZXJhdG9yKj4gbm9kZUl0ZXJhdG9yc0xpc3Qg
PSBtX25vZGVJdGVyYXRvcnM7Ci0gICAgSGFzaFNldDxOb2RlSXRlcmF0b3IqPjo6Y29uc3RfaXRl
cmF0b3Igbm9kZUl0ZXJhdG9yc0VuZCA9IG5vZGVJdGVyYXRvcnNMaXN0LmVuZCgpOwotICAgIGZv
ciAoSGFzaFNldDxOb2RlSXRlcmF0b3IqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBub2RlSXRlcmF0
b3JzTGlzdC5iZWdpbigpOyBpdCAhPSBub2RlSXRlcmF0b3JzRW5kOyArK2l0KSB7Ci0gICAgICAg
IGlmICgoKml0KS0+cm9vdCgpID09IG5vZGUpIHsKLSAgICAgICAgICAgIGRldGFjaE5vZGVJdGVy
YXRvcigqaXQpOwotICAgICAgICAgICAgbmV3RG9jdW1lbnQtPmF0dGFjaE5vZGVJdGVyYXRvcigq
aXQpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIERvY3VtZW50Ojp1cGRhdGVSYW5nZXNB
ZnRlckNoaWxkcmVuQ2hhbmdlZChDb250YWluZXJOb2RlKiBjb250YWluZXIpCi17Ci0gICAgaWYg
KCFtX3Jhbmdlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgSGFzaFNldDxSYW5nZSo+Ojpjb25zdF9p
dGVyYXRvciBlbmQgPSBtX3Jhbmdlcy5lbmQoKTsKLSAgICAgICAgZm9yIChIYXNoU2V0PFJhbmdl
Kj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yYW5nZXMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0
KQotICAgICAgICAgICAgKCppdCktPm5vZGVDaGlsZHJlbkNoYW5nZWQoY29udGFpbmVyKTsKLSAg
ICB9Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6Om5vZGVDaGlsZHJlbldpbGxCZVJlbW92ZWQoQ29udGFp
bmVyTm9kZSogY29udGFpbmVyKQotewotICAgIGlmICghbV9yYW5nZXMuaXNFbXB0eSgpKSB7Ci0g
ICAgICAgIEhhc2hTZXQ8UmFuZ2UqPjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV9yYW5nZXMuZW5k
KCk7Ci0gICAgICAgIGZvciAoSGFzaFNldDxSYW5nZSo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1f
cmFuZ2VzLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkKLSAgICAgICAgICAgICgqaXQpLT5ub2Rl
Q2hpbGRyZW5XaWxsQmVSZW1vdmVkKGNvbnRhaW5lcik7Ci0gICAgfQotCi0gICAgSGFzaFNldDxO
b2RlSXRlcmF0b3IqPjo6Y29uc3RfaXRlcmF0b3Igbm9kZUl0ZXJhdG9yc0VuZCA9IG1fbm9kZUl0
ZXJhdG9ycy5lbmQoKTsKLSAgICBmb3IgKEhhc2hTZXQ8Tm9kZUl0ZXJhdG9yKj46OmNvbnN0X2l0
ZXJhdG9yIGl0ID0gbV9ub2RlSXRlcmF0b3JzLmJlZ2luKCk7IGl0ICE9IG5vZGVJdGVyYXRvcnNF
bmQ7ICsraXQpIHsKLSAgICAgICAgZm9yIChOb2RlKiBuID0gY29udGFpbmVyLT5maXJzdENoaWxk
KCk7IG47IG4gPSBuLT5uZXh0U2libGluZygpKQotICAgICAgICAgICAgKCppdCktPm5vZGVXaWxs
QmVSZW1vdmVkKG4pOwotICAgIH0KLQotICAgIGlmIChGcmFtZSogZnJhbWUgPSB0aGlzLT5mcmFt
ZSgpKSB7Ci0gICAgICAgIGZvciAoTm9kZSogbiA9IGNvbnRhaW5lci0+Zmlyc3RDaGlsZCgpOyBu
OyBuID0gbi0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICAgICAgZnJhbWUtPmV2ZW50SGFuZGxl
cigpLT5ub2RlV2lsbEJlUmVtb3ZlZChuKTsKLSAgICAgICAgICAgIGZyYW1lLT5zZWxlY3Rpb24o
KS0+bm9kZVdpbGxCZVJlbW92ZWQobik7Ci0gICAgICAgICAgICBmcmFtZS0+cGFnZSgpLT5kcmFn
Q2FyZXRDb250cm9sbGVyKCktPm5vZGVXaWxsQmVSZW1vdmVkKG4pOwotICAgICAgICB9Ci0gICAg
fQotfQotCi12b2lkIERvY3VtZW50Ojpub2RlV2lsbEJlUmVtb3ZlZChOb2RlKiBuKQotewotICAg
IEhhc2hTZXQ8Tm9kZUl0ZXJhdG9yKj46OmNvbnN0X2l0ZXJhdG9yIG5vZGVJdGVyYXRvcnNFbmQg
PSBtX25vZGVJdGVyYXRvcnMuZW5kKCk7Ci0gICAgZm9yIChIYXNoU2V0PE5vZGVJdGVyYXRvcio+
Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fbm9kZUl0ZXJhdG9ycy5iZWdpbigpOyBpdCAhPSBub2Rl
SXRlcmF0b3JzRW5kOyArK2l0KQotICAgICAgICAoKml0KS0+bm9kZVdpbGxCZVJlbW92ZWQobik7
Ci0KLSAgICBpZiAoIW1fcmFuZ2VzLmlzRW1wdHkoKSkgewotICAgICAgICBIYXNoU2V0PFJhbmdl
Kj46OmNvbnN0X2l0ZXJhdG9yIHJhbmdlc0VuZCA9IG1fcmFuZ2VzLmVuZCgpOwotICAgICAgICBm
b3IgKEhhc2hTZXQ8UmFuZ2UqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3Jhbmdlcy5iZWdpbigp
OyBpdCAhPSByYW5nZXNFbmQ7ICsraXQpCi0gICAgICAgICAgICAoKml0KS0+bm9kZVdpbGxCZVJl
bW92ZWQobik7Ci0gICAgfQotCi0gICAgaWYgKEZyYW1lKiBmcmFtZSA9IHRoaXMtPmZyYW1lKCkp
IHsKLSAgICAgICAgZnJhbWUtPmV2ZW50SGFuZGxlcigpLT5ub2RlV2lsbEJlUmVtb3ZlZChuKTsK
LSAgICAgICAgZnJhbWUtPnNlbGVjdGlvbigpLT5ub2RlV2lsbEJlUmVtb3ZlZChuKTsKLSAgICAg
ICAgZnJhbWUtPnBhZ2UoKS0+ZHJhZ0NhcmV0Q29udHJvbGxlcigpLT5ub2RlV2lsbEJlUmVtb3Zl
ZChuKTsKLSAgICB9Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnRleHRJbnNlcnRlZChOb2RlKiB0ZXh0
LCB1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIGxlbmd0aCkKLXsKLSAgICBpZiAoIW1fcmFuZ2Vz
LmlzRW1wdHkoKSkgewotICAgICAgICBIYXNoU2V0PFJhbmdlKj46OmNvbnN0X2l0ZXJhdG9yIGVu
ZCA9IG1fcmFuZ2VzLmVuZCgpOwotICAgICAgICBmb3IgKEhhc2hTZXQ8UmFuZ2UqPjo6Y29uc3Rf
aXRlcmF0b3IgaXQgPSBtX3Jhbmdlcy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpCi0gICAgICAg
ICAgICAoKml0KS0+dGV4dEluc2VydGVkKHRleHQsIG9mZnNldCwgbGVuZ3RoKTsKLSAgICB9Ci0K
LSAgICAvLyBVcGRhdGUgdGhlIG1hcmtlcnMgZm9yIHNwZWxsaW5nIGFuZCBncmFtbWFyIGNoZWNr
aW5nLgotICAgIG1fbWFya2Vycy0+c2hpZnRNYXJrZXJzKHRleHQsIG9mZnNldCwgbGVuZ3RoKTsK
LX0KLQotdm9pZCBEb2N1bWVudDo6dGV4dFJlbW92ZWQoTm9kZSogdGV4dCwgdW5zaWduZWQgb2Zm
c2V0LCB1bnNpZ25lZCBsZW5ndGgpCi17Ci0gICAgaWYgKCFtX3Jhbmdlcy5pc0VtcHR5KCkpIHsK
LSAgICAgICAgSGFzaFNldDxSYW5nZSo+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBtX3Jhbmdlcy5l
bmQoKTsKLSAgICAgICAgZm9yIChIYXNoU2V0PFJhbmdlKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0g
bV9yYW5nZXMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KQotICAgICAgICAgICAgKCppdCktPnRl
eHRSZW1vdmVkKHRleHQsIG9mZnNldCwgbGVuZ3RoKTsKLSAgICB9Ci0KLSAgICAvLyBVcGRhdGUg
dGhlIG1hcmtlcnMgZm9yIHNwZWxsaW5nIGFuZCBncmFtbWFyIGNoZWNraW5nLgotICAgIG1fbWFy
a2Vycy0+cmVtb3ZlTWFya2Vycyh0ZXh0LCBvZmZzZXQsIGxlbmd0aCk7Ci0gICAgbV9tYXJrZXJz
LT5zaGlmdE1hcmtlcnModGV4dCwgb2Zmc2V0ICsgbGVuZ3RoLCAwIC0gbGVuZ3RoKTsKLX0KLQot
dm9pZCBEb2N1bWVudDo6dGV4dE5vZGVzTWVyZ2VkKFRleHQqIG9sZE5vZGUsIHVuc2lnbmVkIG9m
ZnNldCkKLXsKLSAgICBpZiAoIW1fcmFuZ2VzLmlzRW1wdHkoKSkgewotICAgICAgICBOb2RlV2l0
aEluZGV4IG9sZE5vZGVXaXRoSW5kZXgob2xkTm9kZSk7Ci0gICAgICAgIEhhc2hTZXQ8UmFuZ2Uq
Pjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV9yYW5nZXMuZW5kKCk7Ci0gICAgICAgIGZvciAoSGFz
aFNldDxSYW5nZSo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmFuZ2VzLmJlZ2luKCk7IGl0ICE9
IGVuZDsgKytpdCkKLSAgICAgICAgICAgICgqaXQpLT50ZXh0Tm9kZXNNZXJnZWQob2xkTm9kZVdp
dGhJbmRleCwgb2Zmc2V0KTsKLSAgICB9Ci0KLSAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgdXBk
YXRlIG1hcmtlcnMgZm9yIHNwZWxsaW5nIGFuZCBncmFtbWFyIGNoZWNraW5nLgotfQotCi12b2lk
IERvY3VtZW50Ojp0ZXh0Tm9kZVNwbGl0KFRleHQqIG9sZE5vZGUpCi17Ci0gICAgaWYgKCFtX3Jh
bmdlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgSGFzaFNldDxSYW5nZSo+Ojpjb25zdF9pdGVyYXRv
ciBlbmQgPSBtX3Jhbmdlcy5lbmQoKTsKLSAgICAgICAgZm9yIChIYXNoU2V0PFJhbmdlKj46OmNv
bnN0X2l0ZXJhdG9yIGl0ID0gbV9yYW5nZXMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KQotICAg
ICAgICAgICAgKCppdCktPnRleHROb2RlU3BsaXQob2xkTm9kZSk7Ci0gICAgfQotCi0gICAgLy8g
RklYTUU6IFRoaXMgc2hvdWxkIHVwZGF0ZSBtYXJrZXJzIGZvciBzcGVsbGluZyBhbmQgZ3JhbW1h
ciBjaGVja2luZy4KLX0KLQotdm9pZCBEb2N1bWVudDo6Y3JlYXRlRE9NV2luZG93KCkKLXsKLSAg
ICBBU1NFUlQobV9mcmFtZSk7Ci0gICAgQVNTRVJUKCFtX2RvbVdpbmRvdyk7Ci0KLSAgICBtX2Rv
bVdpbmRvdyA9IERPTVdpbmRvdzo6Y3JlYXRlKHRoaXMpOwotCi0gICAgQVNTRVJUKG1fZG9tV2lu
ZG93LT5kb2N1bWVudCgpID09IHRoaXMpOwotICAgIEFTU0VSVChtX2RvbVdpbmRvdy0+ZnJhbWUo
KSA9PSBtX2ZyYW1lKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6dGFrZURPTVdpbmRvd0Zyb20oRG9j
dW1lbnQqIGRvY3VtZW50KQotewotICAgIEFTU0VSVChtX2ZyYW1lKTsKLSAgICBBU1NFUlQoIW1f
ZG9tV2luZG93KTsKLSAgICBBU1NFUlQoZG9jdW1lbnQtPmRvbVdpbmRvdygpKTsKLQotICAgIG1f
ZG9tV2luZG93ID0gZG9jdW1lbnQtPm1fZG9tV2luZG93LnJlbGVhc2UoKTsKLSAgICBtX2RvbVdp
bmRvdy0+ZGlkU2VjdXJlVHJhbnNpdGlvblRvKHRoaXMpOwotCi0gICAgQVNTRVJUKG1fZG9tV2lu
ZG93LT5kb2N1bWVudCgpID09IHRoaXMpOwotICAgIEFTU0VSVChtX2RvbVdpbmRvdy0+ZnJhbWUo
KSA9PSBtX2ZyYW1lKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6c2V0V2luZG93QXR0cmlidXRlRXZl
bnRMaXN0ZW5lcihjb25zdCBBdG9taWNTdHJpbmcmIGV2ZW50VHlwZSwgUGFzc1JlZlB0cjxFdmVu
dExpc3RlbmVyPiBsaXN0ZW5lcikKLXsKLSAgICBET01XaW5kb3cqIGRvbVdpbmRvdyA9IHRoaXMt
PmRvbVdpbmRvdygpOwotICAgIGlmICghZG9tV2luZG93KQotICAgICAgICByZXR1cm47Ci0gICAg
ZG9tV2luZG93LT5zZXRBdHRyaWJ1dGVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIp
OwotfQotCi1FdmVudExpc3RlbmVyKiBEb2N1bWVudDo6Z2V0V2luZG93QXR0cmlidXRlRXZlbnRM
aXN0ZW5lcihjb25zdCBBdG9taWNTdHJpbmcmIGV2ZW50VHlwZSkKLXsKLSAgICBET01XaW5kb3cq
IGRvbVdpbmRvdyA9IHRoaXMtPmRvbVdpbmRvdygpOwotICAgIGlmICghZG9tV2luZG93KQotICAg
ICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gZG9tV2luZG93LT5nZXRBdHRyaWJ1dGVFdmVudExp
c3RlbmVyKGV2ZW50VHlwZSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmRpc3BhdGNoV2luZG93RXZl
bnQoUGFzc1JlZlB0cjxFdmVudD4gZXZlbnQsICBQYXNzUmVmUHRyPEV2ZW50VGFyZ2V0PiB0YXJn
ZXQpCi17Ci0gICAgQVNTRVJUKCFldmVudERpc3BhdGNoRm9yYmlkZGVuKCkpOwotICAgIERPTVdp
bmRvdyogZG9tV2luZG93ID0gdGhpcy0+ZG9tV2luZG93KCk7Ci0gICAgaWYgKCFkb21XaW5kb3cp
Ci0gICAgICAgIHJldHVybjsKLSAgICBkb21XaW5kb3ctPmRpc3BhdGNoRXZlbnQoZXZlbnQsIHRh
cmdldCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmRpc3BhdGNoV2luZG93TG9hZEV2ZW50KCkKLXsK
LSAgICBBU1NFUlQoIWV2ZW50RGlzcGF0Y2hGb3JiaWRkZW4oKSk7Ci0gICAgRE9NV2luZG93KiBk
b21XaW5kb3cgPSB0aGlzLT5kb21XaW5kb3coKTsKLSAgICBpZiAoIWRvbVdpbmRvdykKLSAgICAg
ICAgcmV0dXJuOwotICAgIGRvbVdpbmRvdy0+ZGlzcGF0Y2hMb2FkRXZlbnQoKTsKLSAgICBtX2xv
YWRFdmVudEZpbmlzaGVkID0gdHJ1ZTsKLX0KLQotdm9pZCBEb2N1bWVudDo6ZW5xdWV1ZVdpbmRv
d0V2ZW50KFBhc3NSZWZQdHI8RXZlbnQ+IGV2ZW50KQotewotICAgIGV2ZW50LT5zZXRUYXJnZXQo
ZG9tV2luZG93KCkpOwotICAgIG1fZXZlbnRRdWV1ZS0+ZW5xdWV1ZUV2ZW50KGV2ZW50KTsKLX0K
LQotdm9pZCBEb2N1bWVudDo6ZW5xdWV1ZURvY3VtZW50RXZlbnQoUGFzc1JlZlB0cjxFdmVudD4g
ZXZlbnQpCi17Ci0gICAgZXZlbnQtPnNldFRhcmdldCh0aGlzKTsKLSAgICBtX2V2ZW50UXVldWUt
PmVucXVldWVFdmVudChldmVudCk7Ci19Ci0KLVBhc3NSZWZQdHI8RXZlbnQ+IERvY3VtZW50Ojpj
cmVhdGVFdmVudChjb25zdCBTdHJpbmcmIGV2ZW50VHlwZSwgRXhjZXB0aW9uQ29kZSYgZWMpCi17
Ci0gICAgUmVmUHRyPEV2ZW50PiBldmVudCA9IEV2ZW50RmFjdG9yeTo6Y3JlYXRlKGV2ZW50VHlw
ZSk7Ci0gICAgaWYgKGV2ZW50KQotICAgICAgICByZXR1cm4gZXZlbnQucmVsZWFzZSgpOwotCi0g
ICAgZWMgPSBOT1RfU1VQUE9SVEVEX0VSUjsKLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBEb2N1
bWVudDo6YWRkTXV0YXRpb25FdmVudExpc3RlbmVyVHlwZUlmRW5hYmxlZChMaXN0ZW5lclR5cGUg
bGlzdGVuZXJUeXBlKQotewotICAgIGlmIChDb250ZXh0RmVhdHVyZXM6Om11dGF0aW9uRXZlbnRz
RW5hYmxlZCh0aGlzKSkKLSAgICAgICAgYWRkTGlzdGVuZXJUeXBlKGxpc3RlbmVyVHlwZSk7Ci19
Ci0KLXZvaWQgRG9jdW1lbnQ6OmFkZExpc3RlbmVyVHlwZUlmTmVlZGVkKGNvbnN0IEF0b21pY1N0
cmluZyYgZXZlbnRUeXBlKQotewotICAgIGlmIChldmVudFR5cGUgPT0gZXZlbnROYW1lcygpLkRP
TVN1YnRyZWVNb2RpZmllZEV2ZW50KQotICAgICAgICBhZGRNdXRhdGlvbkV2ZW50TGlzdGVuZXJU
eXBlSWZFbmFibGVkKERPTVNVQlRSRUVNT0RJRklFRF9MSVNURU5FUik7Ci0gICAgZWxzZSBpZiAo
ZXZlbnRUeXBlID09IGV2ZW50TmFtZXMoKS5ET01Ob2RlSW5zZXJ0ZWRFdmVudCkKLSAgICAgICAg
YWRkTXV0YXRpb25FdmVudExpc3RlbmVyVHlwZUlmRW5hYmxlZChET01OT0RFSU5TRVJURURfTElT
VEVORVIpOwotICAgIGVsc2UgaWYgKGV2ZW50VHlwZSA9PSBldmVudE5hbWVzKCkuRE9NTm9kZVJl
bW92ZWRFdmVudCkKLSAgICAgICAgYWRkTXV0YXRpb25FdmVudExpc3RlbmVyVHlwZUlmRW5hYmxl
ZChET01OT0RFUkVNT1ZFRF9MSVNURU5FUik7Ci0gICAgZWxzZSBpZiAoZXZlbnRUeXBlID09IGV2
ZW50TmFtZXMoKS5ET01Ob2RlUmVtb3ZlZEZyb21Eb2N1bWVudEV2ZW50KQotICAgICAgICBhZGRN
dXRhdGlvbkV2ZW50TGlzdGVuZXJUeXBlSWZFbmFibGVkKERPTU5PREVSRU1PVkVERlJPTURPQ1VN
RU5UX0xJU1RFTkVSKTsKLSAgICBlbHNlIGlmIChldmVudFR5cGUgPT0gZXZlbnROYW1lcygpLkRP
TU5vZGVJbnNlcnRlZEludG9Eb2N1bWVudEV2ZW50KQotICAgICAgICBhZGRNdXRhdGlvbkV2ZW50
TGlzdGVuZXJUeXBlSWZFbmFibGVkKERPTU5PREVJTlNFUlRFRElOVE9ET0NVTUVOVF9MSVNURU5F
Uik7Ci0gICAgZWxzZSBpZiAoZXZlbnRUeXBlID09IGV2ZW50TmFtZXMoKS5ET01BdHRyTW9kaWZp
ZWRFdmVudCkKLSAgICAgICAgYWRkTXV0YXRpb25FdmVudExpc3RlbmVyVHlwZUlmRW5hYmxlZChE
T01BVFRSTU9ESUZJRURfTElTVEVORVIpOwotICAgIGVsc2UgaWYgKGV2ZW50VHlwZSA9PSBldmVu
dE5hbWVzKCkuRE9NQ2hhcmFjdGVyRGF0YU1vZGlmaWVkRXZlbnQpCi0gICAgICAgIGFkZE11dGF0
aW9uRXZlbnRMaXN0ZW5lclR5cGVJZkVuYWJsZWQoRE9NQ0hBUkFDVEVSREFUQU1PRElGSUVEX0xJ
U1RFTkVSKTsKLSAgICBlbHNlIGlmIChldmVudFR5cGUgPT0gZXZlbnROYW1lcygpLm92ZXJmbG93
Y2hhbmdlZEV2ZW50KQotICAgICAgICBhZGRMaXN0ZW5lclR5cGUoT1ZFUkZMT1dDSEFOR0VEX0xJ
U1RFTkVSKTsKLSAgICBlbHNlIGlmIChldmVudFR5cGUgPT0gZXZlbnROYW1lcygpLndlYmtpdEFu
aW1hdGlvblN0YXJ0RXZlbnQpCi0gICAgICAgIGFkZExpc3RlbmVyVHlwZShBTklNQVRJT05TVEFS
VF9MSVNURU5FUik7Ci0gICAgZWxzZSBpZiAoZXZlbnRUeXBlID09IGV2ZW50TmFtZXMoKS53ZWJr
aXRBbmltYXRpb25FbmRFdmVudCkKLSAgICAgICAgYWRkTGlzdGVuZXJUeXBlKEFOSU1BVElPTkVO
RF9MSVNURU5FUik7Ci0gICAgZWxzZSBpZiAoZXZlbnRUeXBlID09IGV2ZW50TmFtZXMoKS53ZWJr
aXRBbmltYXRpb25JdGVyYXRpb25FdmVudCkKLSAgICAgICAgYWRkTGlzdGVuZXJUeXBlKEFOSU1B
VElPTklURVJBVElPTl9MSVNURU5FUik7Ci0gICAgZWxzZSBpZiAoZXZlbnRUeXBlID09IGV2ZW50
TmFtZXMoKS53ZWJraXRUcmFuc2l0aW9uRW5kRXZlbnQpCi0gICAgICAgIGFkZExpc3RlbmVyVHlw
ZShUUkFOU0lUSU9ORU5EX0xJU1RFTkVSKTsKLSAgICBlbHNlIGlmIChldmVudFR5cGUgPT0gZXZl
bnROYW1lcygpLmJlZm9yZWxvYWRFdmVudCkKLSAgICAgICAgYWRkTGlzdGVuZXJUeXBlKEJFRk9S
RUxPQURfTElTVEVORVIpOwotICAgIGVsc2UgaWYgKGV2ZW50VHlwZSA9PSBldmVudE5hbWVzKCku
c2Nyb2xsRXZlbnQpCi0gICAgICAgIGFkZExpc3RlbmVyVHlwZShTQ1JPTExfTElTVEVORVIpOwot
fQotCi1DU1NTdHlsZURlY2xhcmF0aW9uKiBEb2N1bWVudDo6Z2V0T3ZlcnJpZGVTdHlsZShFbGVt
ZW50KiwgY29uc3QgU3RyaW5nJikKLXsKLSAgICByZXR1cm4gMDsKLX0KLQotSFRNTEZyYW1lT3du
ZXJFbGVtZW50KiBEb2N1bWVudDo6b3duZXJFbGVtZW50KCkgY29uc3QKLXsKLSAgICBpZiAoIWZy
YW1lKCkpCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiBmcmFtZSgpLT5vd25lckVsZW1l
bnQoKTsKLX0KLQotU3RyaW5nIERvY3VtZW50Ojpjb29raWUoRXhjZXB0aW9uQ29kZSYgZWMpIGNv
bnN0Ci17Ci0gICAgaWYgKHBhZ2UoKSAmJiAhcGFnZSgpLT5zZXR0aW5ncygpLT5jb29raWVFbmFi
bGVkKCkpCi0gICAgICAgIHJldHVybiBTdHJpbmcoKTsKLQotICAgIC8vIEZJWE1FOiBUaGUgSFRN
TDUgRE9NIHNwZWMgc3RhdGVzIHRoYXQgdGhpcyBhdHRyaWJ1dGUgY2FuIHJhaXNlIGFuCi0gICAg
Ly8gSU5WQUxJRF9TVEFURV9FUlIgZXhjZXB0aW9uIG9uIGdldHRpbmcgaWYgdGhlIERvY3VtZW50
IGhhcyBubwotICAgIC8vIGJyb3dzaW5nIGNvbnRleHQuCi0KLSAgICBpZiAoIXNlY3VyaXR5T3Jp
Z2luKCktPmNhbkFjY2Vzc0Nvb2tpZXMoKSkgewotICAgICAgICBlYyA9IFNFQ1VSSVRZX0VSUjsK
LSAgICAgICAgcmV0dXJuIFN0cmluZygpOwotICAgIH0KLQotICAgIEtVUkwgY29va2llVVJMID0g
dGhpcy0+Y29va2llVVJMKCk7Ci0gICAgaWYgKGNvb2tpZVVSTC5pc0VtcHR5KCkpCi0gICAgICAg
IHJldHVybiBTdHJpbmcoKTsKLQotICAgIHJldHVybiBjb29raWVzKHRoaXMsIGNvb2tpZVVSTCk7
Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnNldENvb2tpZShjb25zdCBTdHJpbmcmIHZhbHVlLCBFeGNl
cHRpb25Db2RlJiBlYykKLXsKLSAgICBpZiAocGFnZSgpICYmICFwYWdlKCktPnNldHRpbmdzKCkt
PmNvb2tpZUVuYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gRklYTUU6IFRoZSBI
VE1MNSBET00gc3BlYyBzdGF0ZXMgdGhhdCB0aGlzIGF0dHJpYnV0ZSBjYW4gcmFpc2UgYW4KLSAg
ICAvLyBJTlZBTElEX1NUQVRFX0VSUiBleGNlcHRpb24gb24gc2V0dGluZyBpZiB0aGUgRG9jdW1l
bnQgaGFzIG5vCi0gICAgLy8gYnJvd3NpbmcgY29udGV4dC4KLQotICAgIGlmICghc2VjdXJpdHlP
cmlnaW4oKS0+Y2FuQWNjZXNzQ29va2llcygpKSB7Ci0gICAgICAgIGVjID0gU0VDVVJJVFlfRVJS
OwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgS1VSTCBjb29raWVVUkwgPSB0aGlzLT5j
b29raWVVUkwoKTsKLSAgICBpZiAoY29va2llVVJMLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJu
OwotCi0gICAgc2V0Q29va2llcyh0aGlzLCBjb29raWVVUkwsIHZhbHVlKTsKLX0KLQotU3RyaW5n
IERvY3VtZW50OjpyZWZlcnJlcigpIGNvbnN0Ci17Ci0gICAgaWYgKGZyYW1lKCkpCi0gICAgICAg
IHJldHVybiBmcmFtZSgpLT5sb2FkZXIoKS0+cmVmZXJyZXIoKTsKLSAgICByZXR1cm4gU3RyaW5n
KCk7Ci19Ci0KLVN0cmluZyBEb2N1bWVudDo6ZG9tYWluKCkgY29uc3QKLXsKLSAgICByZXR1cm4g
c2VjdXJpdHlPcmlnaW4oKS0+ZG9tYWluKCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnNldERvbWFp
bihjb25zdCBTdHJpbmcmIG5ld0RvbWFpbiwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgaWYg
KFNjaGVtZVJlZ2lzdHJ5Ojppc0RvbWFpblJlbGF4YXRpb25Gb3JiaWRkZW5Gb3JVUkxTY2hlbWUo
c2VjdXJpdHlPcmlnaW4oKS0+cHJvdG9jb2woKSkpIHsKLSAgICAgICAgZWMgPSBTRUNVUklUWV9F
UlI7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBCb3RoIE5TIGFuZCBJRSBzcGVj
aWZ5IHRoYXQgY2hhbmdpbmcgdGhlIGRvbWFpbiBpcyBvbmx5IGFsbG93ZWQgd2hlbgotICAgIC8v
IHRoZSBuZXcgZG9tYWluIGlzIGEgc3VmZml4IG9mIHRoZSBvbGQgZG9tYWluLgotCi0gICAgLy8g
RklYTUU6IFdlIHNob3VsZCBhZGQgbG9nZ2luZyBpbmRpY2F0aW5nIHdoeSBhIGRvbWFpbiB3YXMg
bm90IGFsbG93ZWQuCi0KLSAgICAvLyBJZiB0aGUgbmV3IGRvbWFpbiBpcyB0aGUgc2FtZSBhcyB0
aGUgb2xkIGRvbWFpbiwgc3RpbGwgY2FsbAotICAgIC8vIHNlY3VyaXR5T3JpZ2luKCktPnNldERv
bWFpbkZvckRPTS4gVGhpcyB3aWxsIGNoYW5nZSB0aGUKLSAgICAvLyBzZWN1cml0eSBjaGVjayBi
ZWhhdmlvci4gRm9yIGV4YW1wbGUsIGlmIGEgcGFnZSBsb2FkZWQgb24gcG9ydCA4MDAwCi0gICAg
Ly8gYXNzaWducyBpdHMgY3VycmVudCBkb21haW4gdXNpbmcgZG9jdW1lbnQuZG9tYWluLCB0aGUg
cGFnZSB3aWxsCi0gICAgLy8gYWxsb3cgb3RoZXIgcGFnZXMgbG9hZGVkIG9uIGRpZmZlcmVudCBw
b3J0cyBpbiB0aGUgc2FtZSBkb21haW4gdGhhdAotICAgIC8vIGhhdmUgYWxzbyBhc3NpZ25lZCB0
byBhY2Nlc3MgdGhpcyBwYWdlLgotICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZShkb21haW4oKSwg
bmV3RG9tYWluKSkgewotICAgICAgICBzZWN1cml0eU9yaWdpbigpLT5zZXREb21haW5Gcm9tRE9N
KG5ld0RvbWFpbik7Ci0gICAgICAgIGlmIChtX2ZyYW1lKQotICAgICAgICAgICAgbV9mcmFtZS0+
c2NyaXB0KCktPnVwZGF0ZVNlY3VyaXR5T3JpZ2luKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9
Ci0KLSAgICBpbnQgb2xkTGVuZ3RoID0gZG9tYWluKCkubGVuZ3RoKCk7Ci0gICAgaW50IG5ld0xl
bmd0aCA9IG5ld0RvbWFpbi5sZW5ndGgoKTsKLSAgICAvLyBlLmcuIG5ld0RvbWFpbiA9IHdlYmtp
dC5vcmcgKDEwKSBhbmQgZG9tYWluKCkgPSB3d3cud2Via2l0Lm9yZyAoMTQpCi0gICAgaWYgKG5l
d0xlbmd0aCA+PSBvbGRMZW5ndGgpIHsKLSAgICAgICAgZWMgPSBTRUNVUklUWV9FUlI7Ci0gICAg
ICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBTdHJpbmcgdGVzdCA9IGRvbWFpbigpOwotICAgIC8v
IENoZWNrIHRoYXQgaXQncyBhIHN1YmRvbWFpbiwgbm90IGUuZy4gImVia2l0Lm9yZyIKLSAgICBp
ZiAodGVzdFtvbGRMZW5ndGggLSBuZXdMZW5ndGggLSAxXSAhPSAnLicpIHsKLSAgICAgICAgZWMg
PSBTRUNVUklUWV9FUlI7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBOb3cgdGVz
dCBpcyAid2Via2l0Lm9yZyIgZnJvbSBkb21haW4oKQotICAgIC8vIGFuZCB3ZSBjaGVjayB0aGF0
IGl0J3MgdGhlIHNhbWUgdGhpbmcgYXMgbmV3RG9tYWluCi0gICAgdGVzdC5yZW1vdmUoMCwgb2xk
TGVuZ3RoIC0gbmV3TGVuZ3RoKTsKLSAgICBpZiAodGVzdCAhPSBuZXdEb21haW4pIHsKLSAgICAg
ICAgZWMgPSBTRUNVUklUWV9FUlI7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzZWN1
cml0eU9yaWdpbigpLT5zZXREb21haW5Gcm9tRE9NKG5ld0RvbWFpbik7Ci0gICAgaWYgKG1fZnJh
bWUpCi0gICAgICAgIG1fZnJhbWUtPnNjcmlwdCgpLT51cGRhdGVTZWN1cml0eU9yaWdpbigpOwot
fQotCi0vLyBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3Jr
LyNkb20tZG9jdW1lbnQtbGFzdG1vZGlmaWVkCi1TdHJpbmcgRG9jdW1lbnQ6Omxhc3RNb2RpZmll
ZCgpIGNvbnN0Ci17Ci0gICAgRGF0ZUNvbXBvbmVudHMgZGF0ZTsKLSAgICBib29sIGZvdW5kRGF0
ZSA9IGZhbHNlOwotICAgIGlmIChtX2ZyYW1lKSB7Ci0gICAgICAgIFN0cmluZyBodHRwTGFzdE1v
ZGlmaWVkOwotICAgICAgICBpZiAoRG9jdW1lbnRMb2FkZXIqIGRvY3VtZW50TG9hZGVyID0gbG9h
ZGVyKCkpIAotICAgICAgICAgICAgaHR0cExhc3RNb2RpZmllZCA9IGRvY3VtZW50TG9hZGVyLT5y
ZXNwb25zZSgpLmh0dHBIZWFkZXJGaWVsZCgiTGFzdC1Nb2RpZmllZCIpOwotICAgICAgICBpZiAo
IWh0dHBMYXN0TW9kaWZpZWQuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBkYXRlLnNldE1pbGxp
c2Vjb25kc1NpbmNlRXBvY2hGb3JEYXRlVGltZShwYXJzZURhdGUoaHR0cExhc3RNb2RpZmllZCkp
OwotICAgICAgICAgICAgZm91bmREYXRlID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAv
LyBGSVhNRTogSWYgdGhpcyBkb2N1bWVudCBjYW1lIGZyb20gdGhlIGZpbGUgc3lzdGVtLCB0aGUg
SFRNTDUKLSAgICAvLyBzcGVjaWZpY2lhdGlvbiB0ZWxscyB1cyB0byByZWFkIHRoZSBsYXN0IG1v
ZGlmaWNhdGlvbiBkYXRlIGZyb20gdGhlIGZpbGUKLSAgICAvLyBzeXN0ZW0uCi0gICAgaWYgKCFm
b3VuZERhdGUpCi0gICAgICAgIGRhdGUuc2V0TWlsbGlzZWNvbmRzU2luY2VFcG9jaEZvckRhdGVU
aW1lKGN1cnJlbnRUaW1lTVMoKSk7Ci0gICAgcmV0dXJuIFN0cmluZzo6Zm9ybWF0KCIlMDJkLyUw
MmQvJTA0ZCAlMDJkOiUwMmQ6JTAyZCIsIGRhdGUubW9udGgoKSArIDEsIGRhdGUubW9udGhEYXko
KSwgZGF0ZS5mdWxsWWVhcigpLCBkYXRlLmhvdXIoKSwgZGF0ZS5taW51dGUoKSwgZGF0ZS5zZWNv
bmQoKSk7Ci19Ci0KLXN0YXRpYyBib29sIGlzVmFsaWROYW1lTm9uQVNDSUkoY29uc3QgVUNoYXIq
IGNoYXJhY3RlcnMsIHVuc2lnbmVkIGxlbmd0aCkKLXsKLSAgICB1bnNpZ25lZCBpID0gMDsKLQot
ICAgIFVDaGFyMzIgYzsKLSAgICBVMTZfTkVYVChjaGFyYWN0ZXJzLCBpLCBsZW5ndGgsIGMpCi0g
ICAgaWYgKCFpc1ZhbGlkTmFtZVN0YXJ0KGMpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAg
ICB3aGlsZSAoaSA8IGxlbmd0aCkgewotICAgICAgICBVMTZfTkVYVChjaGFyYWN0ZXJzLCBpLCBs
ZW5ndGgsIGMpCi0gICAgICAgIGlmICghaXNWYWxpZE5hbWVQYXJ0KGMpKQotICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi10ZW1wbGF0ZTx0
eXBlbmFtZSBDaGFyVHlwZT4KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc1ZhbGlkTmFtZUFTQ0lJKGNv
bnN0IENoYXJUeXBlKiBjaGFyYWN0ZXJzLCB1bnNpZ25lZCBsZW5ndGgpCi17Ci0gICAgQ2hhclR5
cGUgYyA9IGNoYXJhY3RlcnNbMF07Ci0gICAgaWYgKCEoaXNBU0NJSUFscGhhKGMpIHx8IGMgPT0g
JzonIHx8IGMgPT0gJ18nKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgZm9yICh1bnNp
Z25lZCBpID0gMTsgaSA8IGxlbmd0aDsgKytpKSB7Ci0gICAgICAgIGMgPSBjaGFyYWN0ZXJzW2ld
OwotICAgICAgICBpZiAoIShpc0FTQ0lJQWxwaGFudW1lcmljKGMpIHx8IGMgPT0gJzonIHx8IGMg
PT0gJ18nIHx8IGMgPT0gJy0nIHx8IGMgPT0gJy4nKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBEb2N1bWVudDo6aXNWYWxp
ZE5hbWUoY29uc3QgU3RyaW5nJiBuYW1lKQotewotICAgIHVuc2lnbmVkIGxlbmd0aCA9IG5hbWUu
bGVuZ3RoKCk7Ci0gICAgaWYgKCFsZW5ndGgpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAg
IGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzOwotICAgIGlmIChuYW1lLmlzOEJpdCgpKSB7Ci0gICAg
ICAgIGlmIChpc1ZhbGlkTmFtZUFTQ0lJKG5hbWUuY2hhcmFjdGVyczgoKSwgbGVuZ3RoKSkKLSAg
ICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBjaGFyYWN0ZXJzID0gbmFtZS5jaGFyYWN0
ZXJzKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgY2hhcmFjdGVycyA9IG5hbWUuY2hhcmFjdGVy
czE2KCk7Ci0gICAgICAgIGlmIChpc1ZhbGlkTmFtZUFTQ0lJKGNoYXJhY3RlcnMsIGxlbmd0aCkp
Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGlzVmFsaWROYW1l
Tm9uQVNDSUkoY2hhcmFjdGVycywgbGVuZ3RoKTsKLX0KLQotYm9vbCBEb2N1bWVudDo6cGFyc2VR
dWFsaWZpZWROYW1lKGNvbnN0IFN0cmluZyYgcXVhbGlmaWVkTmFtZSwgU3RyaW5nJiBwcmVmaXgs
IFN0cmluZyYgbG9jYWxOYW1lLCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICB1bnNpZ25lZCBs
ZW5ndGggPSBxdWFsaWZpZWROYW1lLmxlbmd0aCgpOwotCi0gICAgaWYgKCFsZW5ndGgpIHsKLSAg
ICAgICAgZWMgPSBJTlZBTElEX0NIQVJBQ1RFUl9FUlI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICB9Ci0KLSAgICBib29sIG5hbWVTdGFydCA9IHRydWU7Ci0gICAgYm9vbCBzYXdDb2xvbiA9
IGZhbHNlOwotICAgIGludCBjb2xvblBvcyA9IDA7Ci0KLSAgICBjb25zdCBVQ2hhciogcyA9IHF1
YWxpZmllZE5hbWUuY2hhcmFjdGVycygpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBs
ZW5ndGg7KSB7Ci0gICAgICAgIFVDaGFyMzIgYzsKLSAgICAgICAgVTE2X05FWFQocywgaSwgbGVu
Z3RoLCBjKQotICAgICAgICBpZiAoYyA9PSAnOicpIHsKLSAgICAgICAgICAgIGlmIChzYXdDb2xv
bikgewotICAgICAgICAgICAgICAgIGVjID0gTkFNRVNQQUNFX0VSUjsKLSAgICAgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7IC8vIG11bHRpcGxlIGNvbG9uczogbm90IGFsbG93ZWQKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIG5hbWVTdGFydCA9IHRydWU7Ci0gICAgICAgICAgICBzYXdDb2xv
biA9IHRydWU7Ci0gICAgICAgICAgICBjb2xvblBvcyA9IGkgLSAxOwotICAgICAgICB9IGVsc2Ug
aWYgKG5hbWVTdGFydCkgewotICAgICAgICAgICAgaWYgKCFpc1ZhbGlkTmFtZVN0YXJ0KGMpKSB7
Ci0gICAgICAgICAgICAgICAgZWMgPSBJTlZBTElEX0NIQVJBQ1RFUl9FUlI7Ci0gICAgICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbmFtZVN0YXJ0
ID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoIWlzVmFsaWROYW1l
UGFydChjKSkgewotICAgICAgICAgICAgICAgIGVjID0gSU5WQUxJRF9DSEFSQUNURVJfRVJSOwot
ICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQot
ICAgIH0KLQotICAgIGlmICghc2F3Q29sb24pIHsKLSAgICAgICAgcHJlZml4ID0gU3RyaW5nKCk7
Ci0gICAgICAgIGxvY2FsTmFtZSA9IHF1YWxpZmllZE5hbWU7Ci0gICAgfSBlbHNlIHsKLSAgICAg
ICAgcHJlZml4ID0gcXVhbGlmaWVkTmFtZS5zdWJzdHJpbmcoMCwgY29sb25Qb3MpOwotICAgICAg
ICBpZiAocHJlZml4LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgZWMgPSBOQU1FU1BBQ0VfRVJS
OwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGxvY2FsTmFt
ZSA9IHF1YWxpZmllZE5hbWUuc3Vic3RyaW5nKGNvbG9uUG9zICsgMSk7Ci0gICAgfQotCi0gICAg
aWYgKGxvY2FsTmFtZS5pc0VtcHR5KCkpIHsKLSAgICAgICAgZWMgPSBOQU1FU1BBQ0VfRVJSOwot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZv
aWQgRG9jdW1lbnQ6OnNldERlY29kZXIoUGFzc1JlZlB0cjxUZXh0UmVzb3VyY2VEZWNvZGVyPiBk
ZWNvZGVyKQotewotICAgIG1fZGVjb2RlciA9IGRlY29kZXI7Ci19Ci0KLUtVUkwgRG9jdW1lbnQ6
OmNvbXBsZXRlVVJMKGNvbnN0IFN0cmluZyYgdXJsLCBjb25zdCBLVVJMJiBiYXNlVVJMT3ZlcnJp
ZGUpIGNvbnN0Ci17Ci0gICAgLy8gQWx3YXlzIHJldHVybiBhIG51bGwgVVJMIHdoZW4gcGFzc2Vk
IGEgbnVsbCBzdHJpbmcuCi0gICAgLy8gRklYTUU6IFNob3VsZCB3ZSBjaGFuZ2UgdGhlIEtVUkwg
Y29uc3RydWN0b3IgdG8gaGF2ZSB0aGlzIGJlaGF2aW9yPwotICAgIC8vIFNlZSBhbHNvIFtDU1Nd
U3R5bGVTaGVldDo6Y29tcGxldGVVUkwoY29uc3QgU3RyaW5nJikKLSAgICBpZiAodXJsLmlzTnVs
bCgpKQotICAgICAgICByZXR1cm4gS1VSTCgpOwotICAgIGNvbnN0IEtVUkwmIGJhc2VVUkwgPSAo
KGJhc2VVUkxPdmVycmlkZS5pc0VtcHR5KCkgfHwgYmFzZVVSTE92ZXJyaWRlID09IGJsYW5rVVJM
KCkpICYmIHBhcmVudERvY3VtZW50KCkpID8gcGFyZW50RG9jdW1lbnQoKS0+YmFzZVVSTCgpIDog
YmFzZVVSTE92ZXJyaWRlOwotICAgIGlmICghbV9kZWNvZGVyKQotICAgICAgICByZXR1cm4gS1VS
TChiYXNlVVJMLCB1cmwpOwotICAgIHJldHVybiBLVVJMKGJhc2VVUkwsIHVybCwgbV9kZWNvZGVy
LT5lbmNvZGluZygpKTsKLX0KLQotS1VSTCBEb2N1bWVudDo6Y29tcGxldGVVUkwoY29uc3QgU3Ry
aW5nJiB1cmwpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGNvbXBsZXRlVVJMKHVybCwgbV9iYXNlVVJM
KTsKLX0KLQotdm9pZCBEb2N1bWVudDo6c2V0SW5QYWdlQ2FjaGUoYm9vbCBmbGFnKQotewotICAg
IGlmIChtX2luUGFnZUNhY2hlID09IGZsYWcpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1faW5Q
YWdlQ2FjaGUgPSBmbGFnOwotCi0gICAgRnJhbWVWaWV3KiB2ID0gdmlldygpOwotICAgIGlmIChm
bGFnKSB7Ci0gICAgICAgIEFTU0VSVCghbV9zYXZlZFJlbmRlcmVyKTsKLSAgICAgICAgbV9zYXZl
ZFJlbmRlcmVyID0gcmVuZGVyZXIoKTsKLSAgICAgICAgaWYgKHYpIHsKLSAgICAgICAgICAgIHYt
PmNhY2hlQ3VycmVudFNjcm9sbFBvc2l0aW9uKCk7Ci0gICAgICAgICAgICBpZiAocGFnZSgpICYm
IHBhZ2UoKS0+bWFpbkZyYW1lKCkgPT0gbV9mcmFtZSkKLSAgICAgICAgICAgICAgICB2LT5yZXNl
dFNjcm9sbGJhcnNBbmRDbGVhckNvbnRlbnRzU2l6ZSgpOwotICAgICAgICAgICAgZWxzZQotICAg
ICAgICAgICAgICAgIHYtPnJlc2V0U2Nyb2xsYmFycygpOwotICAgICAgICB9Ci0gICAgICAgIG1f
c3R5bGVSZWNhbGNUaW1lci5zdG9wKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQVNTRVJUKCFy
ZW5kZXJlcigpIHx8IHJlbmRlcmVyKCkgPT0gbV9zYXZlZFJlbmRlcmVyKTsKLSAgICAgICAgQVNT
RVJUKG1fcmVuZGVyQXJlbmEpOwotICAgICAgICBzZXRSZW5kZXJlcihtX3NhdmVkUmVuZGVyZXIp
OwotICAgICAgICBtX3NhdmVkUmVuZGVyZXIgPSAwOwotCi0gICAgICAgIGlmIChjaGlsZE5lZWRz
U3R5bGVSZWNhbGMoKSkKLSAgICAgICAgICAgIHNjaGVkdWxlU3R5bGVSZWNhbGMoKTsKLSAgICB9
Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmRvY3VtZW50V2lsbEJlY29tZUluYWN0aXZlKCkKLXsKLSNp
ZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCi0gICAgaWYgKHJlbmRlcmVyKCkpCi0gICAg
ICAgIHJlbmRlclZpZXcoKS0+d2lsbE1vdmVPZmZzY3JlZW4oKTsKLSNlbmRpZgotfQotCi12b2lk
IERvY3VtZW50Ojpkb2N1bWVudFdpbGxTdXNwZW5kRm9yUGFnZUNhY2hlKCkKLXsKLSAgICBkb2N1
bWVudFdpbGxCZWNvbWVJbmFjdGl2ZSgpOwotCi0gICAgSGFzaFNldDxFbGVtZW50Kj46Oml0ZXJh
dG9yIGVuZCA9IG1fZG9jdW1lbnRTdXNwZW5zaW9uQ2FsbGJhY2tFbGVtZW50cy5lbmQoKTsKLSAg
ICBmb3IgKEhhc2hTZXQ8RWxlbWVudCo+OjppdGVyYXRvciBpID0gbV9kb2N1bWVudFN1c3BlbnNp
b25DYWxsYmFja0VsZW1lbnRzLmJlZ2luKCk7IGkgIT0gZW5kOyArK2kpCi0gICAgICAgICgqaSkt
PmRvY3VtZW50V2lsbFN1c3BlbmRGb3JQYWdlQ2FjaGUoKTsKLQotI2lmbmRlZiBOREVCVUcKLSAg
ICAvLyBDbGVhciB0aGUgdXBkYXRlIGZsYWcgdG8gYmUgYWJsZSB0byBjaGVjayBpZiB0aGUgdmll
d3BvcnQgYXJndW1lbnRzIHVwZGF0ZQotICAgIC8vIGlzIGRpc3BhdGNoZWQsIGFmdGVyIHRoZSBk
b2N1bWVudCBpcyByZXN0b3JlZCBmcm9tIHRoZSBwYWdlIGNhY2hlLgotICAgIG1fZGlkRGlzcGF0
Y2hWaWV3cG9ydFByb3BlcnRpZXNDaGFuZ2VkID0gZmFsc2U7Ci0jZW5kaWYKLX0KLQotdm9pZCBE
b2N1bWVudDo6ZG9jdW1lbnREaWRSZXN1bWVGcm9tUGFnZUNhY2hlKCkgCi17Ci0gICAgVmVjdG9y
PEVsZW1lbnQqPiBlbGVtZW50czsKLSAgICBjb3B5VG9WZWN0b3IobV9kb2N1bWVudFN1c3BlbnNp
b25DYWxsYmFja0VsZW1lbnRzLCBlbGVtZW50cyk7Ci0gICAgVmVjdG9yPEVsZW1lbnQqPjo6aXRl
cmF0b3IgZW5kID0gZWxlbWVudHMuZW5kKCk7Ci0gICAgZm9yIChWZWN0b3I8RWxlbWVudCo+Ojpp
dGVyYXRvciBpID0gZWxlbWVudHMuYmVnaW4oKTsgaSAhPSBlbmQ7ICsraSkKLSAgICAgICAgKCpp
KS0+ZG9jdW1lbnREaWRSZXN1bWVGcm9tUGFnZUNhY2hlKCk7Ci0KLSNpZiBVU0UoQUNDRUxFUkFU
RURfQ09NUE9TSVRJTkcpCi0gICAgaWYgKHJlbmRlcmVyKCkpCi0gICAgICAgIHJlbmRlclZpZXco
KS0+ZGlkTW92ZU9uc2NyZWVuKCk7Ci0jZW5kaWYKLQotICAgIGlmIChGcmFtZVZpZXcqIGZyYW1l
VmlldyA9IHZpZXcoKSkKLSAgICAgICAgZnJhbWVWaWV3LT5zZXRBbmltYXRvcnNBcmVBY3RpdmUo
KTsKLQotICAgIEFTU0VSVChtX2ZyYW1lKTsKLSAgICBtX2ZyYW1lLT5sb2FkZXIoKS0+Y2xpZW50
KCktPmRpc3BhdGNoRGlkQmVjb21lRnJhbWVzZXQoaXNGcmFtZVNldCgpKTsKLX0KLQotdm9pZCBE
b2N1bWVudDo6cmVnaXN0ZXJGb3JQYWdlQ2FjaGVTdXNwZW5zaW9uQ2FsbGJhY2tzKEVsZW1lbnQq
IGUpCi17Ci0gICAgbV9kb2N1bWVudFN1c3BlbnNpb25DYWxsYmFja0VsZW1lbnRzLmFkZChlKTsK
LX0KLQotdm9pZCBEb2N1bWVudDo6dW5yZWdpc3RlckZvclBhZ2VDYWNoZVN1c3BlbnNpb25DYWxs
YmFja3MoRWxlbWVudCogZSkKLXsKLSAgICBtX2RvY3VtZW50U3VzcGVuc2lvbkNhbGxiYWNrRWxl
bWVudHMucmVtb3ZlKGUpOwotfQotCi12b2lkIERvY3VtZW50OjptZWRpYVZvbHVtZURpZENoYW5n
ZSgpIAotewotICAgIEhhc2hTZXQ8RWxlbWVudCo+OjppdGVyYXRvciBlbmQgPSBtX21lZGlhVm9s
dW1lQ2FsbGJhY2tFbGVtZW50cy5lbmQoKTsKLSAgICBmb3IgKEhhc2hTZXQ8RWxlbWVudCo+Ojpp
dGVyYXRvciBpID0gbV9tZWRpYVZvbHVtZUNhbGxiYWNrRWxlbWVudHMuYmVnaW4oKTsgaSAhPSBl
bmQ7ICsraSkKLSAgICAgICAgKCppKS0+bWVkaWFWb2x1bWVEaWRDaGFuZ2UoKTsKLX0KLQotdm9p
ZCBEb2N1bWVudDo6cmVnaXN0ZXJGb3JNZWRpYVZvbHVtZUNhbGxiYWNrcyhFbGVtZW50KiBlKQot
ewotICAgIG1fbWVkaWFWb2x1bWVDYWxsYmFja0VsZW1lbnRzLmFkZChlKTsKLX0KLQotdm9pZCBE
b2N1bWVudDo6dW5yZWdpc3RlckZvck1lZGlhVm9sdW1lQ2FsbGJhY2tzKEVsZW1lbnQqIGUpCi17
Ci0gICAgbV9tZWRpYVZvbHVtZUNhbGxiYWNrRWxlbWVudHMucmVtb3ZlKGUpOwotfQotCi12b2lk
IERvY3VtZW50OjpzdG9yYWdlQmxvY2tpbmdTdGF0ZURpZENoYW5nZSgpCi17Ci0gICAgaWYgKFNl
dHRpbmdzKiBzZXR0aW5ncyA9IHRoaXMtPnNldHRpbmdzKCkpCi0gICAgICAgIHNlY3VyaXR5T3Jp
Z2luKCktPnNldFN0b3JhZ2VCbG9ja2luZ1BvbGljeShzZXR0aW5ncy0+c3RvcmFnZUJsb2NraW5n
UG9saWN5KCkpOwotfQotCi12b2lkIERvY3VtZW50Ojpwcml2YXRlQnJvd3NpbmdTdGF0ZURpZENo
YW5nZSgpIAotewotICAgIEhhc2hTZXQ8RWxlbWVudCo+OjppdGVyYXRvciBlbmQgPSBtX3ByaXZh
dGVCcm93c2luZ1N0YXRlQ2hhbmdlZEVsZW1lbnRzLmVuZCgpOwotICAgIGZvciAoSGFzaFNldDxF
bGVtZW50Kj46Oml0ZXJhdG9yIGl0ID0gbV9wcml2YXRlQnJvd3NpbmdTdGF0ZUNoYW5nZWRFbGVt
ZW50cy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpCi0gICAgICAgICgqaXQpLT5wcml2YXRlQnJv
d3NpbmdTdGF0ZURpZENoYW5nZSgpOwotfQotCi12b2lkIERvY3VtZW50OjpyZWdpc3RlckZvclBy
aXZhdGVCcm93c2luZ1N0YXRlQ2hhbmdlZENhbGxiYWNrcyhFbGVtZW50KiBlKQotewotICAgIG1f
cHJpdmF0ZUJyb3dzaW5nU3RhdGVDaGFuZ2VkRWxlbWVudHMuYWRkKGUpOwotfQotCi12b2lkIERv
Y3VtZW50Ojp1bnJlZ2lzdGVyRm9yUHJpdmF0ZUJyb3dzaW5nU3RhdGVDaGFuZ2VkQ2FsbGJhY2tz
KEVsZW1lbnQqIGUpCi17Ci0gICAgbV9wcml2YXRlQnJvd3NpbmdTdGF0ZUNoYW5nZWRFbGVtZW50
cy5yZW1vdmUoZSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnNldFNob3VsZENyZWF0ZVJlbmRlcmVy
cyhib29sIGYpCi17Ci0gICAgbV9jcmVhdGVSZW5kZXJlcnMgPSBmOwotfQotCi1ib29sIERvY3Vt
ZW50OjpzaG91bGRDcmVhdGVSZW5kZXJlcnMoKQotewotICAgIHJldHVybiBtX2NyZWF0ZVJlbmRl
cmVyczsKLX0KLQotLy8gU3VwcG9ydCBmb3IgSmF2YXNjcmlwdCBleGVjQ29tbWFuZCwgYW5kIHJl
bGF0ZWQgbWV0aG9kcwotCi1zdGF0aWMgRWRpdG9yOjpDb21tYW5kIGNvbW1hbmQoRG9jdW1lbnQq
IGRvY3VtZW50LCBjb25zdCBTdHJpbmcmIGNvbW1hbmROYW1lLCBib29sIHVzZXJJbnRlcmZhY2Ug
PSBmYWxzZSkKLXsKLSAgICBGcmFtZSogZnJhbWUgPSBkb2N1bWVudC0+ZnJhbWUoKTsKLSAgICBp
ZiAoIWZyYW1lIHx8IGZyYW1lLT5kb2N1bWVudCgpICE9IGRvY3VtZW50KQotICAgICAgICByZXR1
cm4gRWRpdG9yOjpDb21tYW5kKCk7Ci0KLSAgICBkb2N1bWVudC0+dXBkYXRlU3R5bGVJZk5lZWRl
ZCgpOwotCi0gICAgcmV0dXJuIGZyYW1lLT5lZGl0b3IoKS0+Y29tbWFuZChjb21tYW5kTmFtZSwK
LSAgICAgICAgdXNlckludGVyZmFjZSA/IENvbW1hbmRGcm9tRE9NV2l0aFVzZXJJbnRlcmZhY2Ug
OiBDb21tYW5kRnJvbURPTSk7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6OmV4ZWNDb21tYW5kKGNvbnN0
IFN0cmluZyYgY29tbWFuZE5hbWUsIGJvb2wgdXNlckludGVyZmFjZSwgY29uc3QgU3RyaW5nJiB2
YWx1ZSkKLXsKLSAgICByZXR1cm4gY29tbWFuZCh0aGlzLCBjb21tYW5kTmFtZSwgdXNlckludGVy
ZmFjZSkuZXhlY3V0ZSh2YWx1ZSk7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6OnF1ZXJ5Q29tbWFuZEVu
YWJsZWQoY29uc3QgU3RyaW5nJiBjb21tYW5kTmFtZSkKLXsKLSAgICByZXR1cm4gY29tbWFuZCh0
aGlzLCBjb21tYW5kTmFtZSkuaXNFbmFibGVkKCk7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6OnF1ZXJ5
Q29tbWFuZEluZGV0ZXJtKGNvbnN0IFN0cmluZyYgY29tbWFuZE5hbWUpCi17Ci0gICAgcmV0dXJu
IGNvbW1hbmQodGhpcywgY29tbWFuZE5hbWUpLnN0YXRlKCkgPT0gTWl4ZWRUcmlTdGF0ZTsKLX0K
LQotYm9vbCBEb2N1bWVudDo6cXVlcnlDb21tYW5kU3RhdGUoY29uc3QgU3RyaW5nJiBjb21tYW5k
TmFtZSkKLXsKLSAgICByZXR1cm4gY29tbWFuZCh0aGlzLCBjb21tYW5kTmFtZSkuc3RhdGUoKSA9
PSBUcnVlVHJpU3RhdGU7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6OnF1ZXJ5Q29tbWFuZFN1cHBvcnRl
ZChjb25zdCBTdHJpbmcmIGNvbW1hbmROYW1lKQotewotICAgIHJldHVybiBjb21tYW5kKHRoaXMs
IGNvbW1hbmROYW1lKS5pc1N1cHBvcnRlZCgpOwotfQotCi1TdHJpbmcgRG9jdW1lbnQ6OnF1ZXJ5
Q29tbWFuZFZhbHVlKGNvbnN0IFN0cmluZyYgY29tbWFuZE5hbWUpCi17Ci0gICAgcmV0dXJuIGNv
bW1hbmQodGhpcywgY29tbWFuZE5hbWUpLnZhbHVlKCk7Ci19Ci0KLUtVUkwgRG9jdW1lbnQ6Om9w
ZW5TZWFyY2hEZXNjcmlwdGlvblVSTCgpCi17Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0
IG9wZW5TZWFyY2hNSU1FVHlwZSA9ICJhcHBsaWNhdGlvbi9vcGVuc2VhcmNoZGVzY3JpcHRpb24r
eG1sIjsKLSAgICBzdGF0aWMgY29uc3QgY2hhciogY29uc3Qgb3BlblNlYXJjaFJlbGF0aW9uID0g
InNlYXJjaCI7Ci0KLSAgICAvLyBGSVhNRTogV2h5IGRvIG9ubHkgdG9wLWxldmVsIGZyYW1lcyBo
YXZlIG9wZW5TZWFyY2hEZXNjcmlwdGlvblVSTHM/Ci0gICAgaWYgKCFmcmFtZSgpIHx8IGZyYW1l
KCktPnRyZWUoKS0+cGFyZW50KCkpCi0gICAgICAgIHJldHVybiBLVVJMKCk7Ci0KLSAgICAvLyBG
SVhNRTogV2h5IGRvIHdlIG5lZWQgdG8gd2FpdCBmb3IgRnJhbWVTdGF0ZUNvbXBsZXRlPwotICAg
IGlmIChmcmFtZSgpLT5sb2FkZXIoKS0+c3RhdGUoKSAhPSBGcmFtZVN0YXRlQ29tcGxldGUpCi0g
ICAgICAgIHJldHVybiBLVVJMKCk7Ci0KLSAgICBpZiAoIWhlYWQoKSkKLSAgICAgICAgcmV0dXJu
IEtVUkwoKTsKLQotICAgIFJlZlB0cjxIVE1MQ29sbGVjdGlvbj4gY2hpbGRyZW4gPSBoZWFkKCkt
PmNoaWxkcmVuKCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgTm9kZSogY2hpbGQgPSBjaGls
ZHJlbi0+aXRlbShpKTsgaSsrKSB7Ci0gICAgICAgIGlmICghY2hpbGQtPmhhc1RhZ05hbWUobGlu
a1RhZykpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgSFRNTExpbmtFbGVtZW50KiBs
aW5rRWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxMaW5rRWxlbWVudCo+KGNoaWxkKTsKLSAgICAg
ICAgaWYgKCFlcXVhbElnbm9yaW5nQ2FzZShsaW5rRWxlbWVudC0+dHlwZSgpLCBvcGVuU2VhcmNo
TUlNRVR5cGUpIHx8ICFlcXVhbElnbm9yaW5nQ2FzZShsaW5rRWxlbWVudC0+cmVsKCksIG9wZW5T
ZWFyY2hSZWxhdGlvbikpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgaWYgKGxpbmtF
bGVtZW50LT5ocmVmKCkuaXNFbXB0eSgpKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAg
IHJldHVybiBsaW5rRWxlbWVudC0+aHJlZigpOwotICAgIH0KLQotICAgIHJldHVybiBLVVJMKCk7
Ci19Ci0KLSNpZiBFTkFCTEUoWFNMVCkKLQotdm9pZCBEb2N1bWVudDo6YXBwbHlYU0xUcmFuc2Zv
cm0oUHJvY2Vzc2luZ0luc3RydWN0aW9uKiBwaSkKLXsKLSAgICBSZWZQdHI8WFNMVFByb2Nlc3Nv
cj4gcHJvY2Vzc29yID0gWFNMVFByb2Nlc3Nvcjo6Y3JlYXRlKCk7Ci0gICAgcHJvY2Vzc29yLT5z
ZXRYU0xTdHlsZVNoZWV0KHN0YXRpY19jYXN0PFhTTFN0eWxlU2hlZXQqPihwaS0+c2hlZXQoKSkp
OwotICAgIFN0cmluZyByZXN1bHRNSU1FVHlwZTsKLSAgICBTdHJpbmcgbmV3U291cmNlOwotICAg
IFN0cmluZyByZXN1bHRFbmNvZGluZzsKLSAgICBpZiAoIXByb2Nlc3Nvci0+dHJhbnNmb3JtVG9T
dHJpbmcodGhpcywgcmVzdWx0TUlNRVR5cGUsIG5ld1NvdXJjZSwgcmVzdWx0RW5jb2RpbmcpKQot
ICAgICAgICByZXR1cm47Ci0gICAgLy8gRklYTUU6IElmIHRoZSB0cmFuc2Zvcm0gZmFpbGVkIHdl
IHNob3VsZCBwcm9iYWJseSByZXBvcnQgYW4gZXJyb3IgKGxpa2UgTW96aWxsYSBkb2VzKS4KLSAg
ICBwcm9jZXNzb3ItPmNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZShuZXdTb3VyY2UsIHJlc3VsdEVu
Y29kaW5nLCByZXN1bHRNSU1FVHlwZSwgdGhpcywgZnJhbWUoKSk7Ci19Ci0KLXZvaWQgRG9jdW1l
bnQ6OnNldFRyYW5zZm9ybVNvdXJjZShQYXNzT3duUHRyPFRyYW5zZm9ybVNvdXJjZT4gc291cmNl
KQotewotICAgIG1fdHJhbnNmb3JtU291cmNlID0gc291cmNlOwotfQotCi0jZW5kaWYKLQotdm9p
ZCBEb2N1bWVudDo6c2V0RGVzaWduTW9kZShJbmhlcml0ZWRCb29sIHZhbHVlKQotewotICAgIG1f
ZGVzaWduTW9kZSA9IHZhbHVlOwotICAgIGZvciAoRnJhbWUqIGZyYW1lID0gbV9mcmFtZTsgZnJh
bWUgJiYgZnJhbWUtPmRvY3VtZW50KCk7IGZyYW1lID0gZnJhbWUtPnRyZWUoKS0+dHJhdmVyc2VO
ZXh0KG1fZnJhbWUpKQotICAgICAgICBmcmFtZS0+ZG9jdW1lbnQoKS0+c2NoZWR1bGVGb3JjZWRT
dHlsZVJlY2FsYygpOwotfQotCi1Eb2N1bWVudDo6SW5oZXJpdGVkQm9vbCBEb2N1bWVudDo6Z2V0
RGVzaWduTW9kZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fZGVzaWduTW9kZTsKLX0KLQotYm9v
bCBEb2N1bWVudDo6aW5EZXNpZ25Nb2RlKCkgY29uc3QKLXsKLSAgICBmb3IgKGNvbnN0IERvY3Vt
ZW50KiBkID0gdGhpczsgZDsgZCA9IGQtPnBhcmVudERvY3VtZW50KCkpIHsKLSAgICAgICAgaWYg
KGQtPm1fZGVzaWduTW9kZSAhPSBpbmhlcml0KQotICAgICAgICAgICAgcmV0dXJuIGQtPm1fZGVz
aWduTW9kZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1Eb2N1bWVudCogRG9jdW1l
bnQ6OnBhcmVudERvY3VtZW50KCkgY29uc3QKLXsKLSAgICBpZiAoIW1fZnJhbWUpCi0gICAgICAg
IHJldHVybiAwOwotICAgIEZyYW1lKiBwYXJlbnQgPSBtX2ZyYW1lLT50cmVlKCktPnBhcmVudCgp
OwotICAgIGlmICghcGFyZW50KQotICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gcGFyZW50
LT5kb2N1bWVudCgpOwotfQotCi1Eb2N1bWVudCogRG9jdW1lbnQ6OnRvcERvY3VtZW50KCkgY29u
c3QKLXsKLSAgICBEb2N1bWVudCogZG9jID0gY29uc3RfY2FzdDxEb2N1bWVudCAqPih0aGlzKTsK
LSAgICBFbGVtZW50KiBlbGVtZW50OwotICAgIHdoaWxlICgoZWxlbWVudCA9IGRvYy0+b3duZXJF
bGVtZW50KCkpKQotICAgICAgICBkb2MgPSBlbGVtZW50LT5kb2N1bWVudCgpOwotICAgIAotICAg
IHJldHVybiBkb2M7Ci19Ci0KLVBhc3NSZWZQdHI8QXR0cj4gRG9jdW1lbnQ6OmNyZWF0ZUF0dHJp
YnV0ZShjb25zdCBTdHJpbmcmIG5hbWUsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIHJldHVy
biBjcmVhdGVBdHRyaWJ1dGVOUyhTdHJpbmcoKSwgbmFtZSwgZWMsIHRydWUpOwotfQotCi1QYXNz
UmVmUHRyPEF0dHI+IERvY3VtZW50OjpjcmVhdGVBdHRyaWJ1dGVOUyhjb25zdCBTdHJpbmcmIG5h
bWVzcGFjZVVSSSwgY29uc3QgU3RyaW5nJiBxdWFsaWZpZWROYW1lLCBFeGNlcHRpb25Db2RlJiBl
YywgYm9vbCBzaG91bGRJZ25vcmVOYW1lc3BhY2VDaGVja3MpCi17Ci0gICAgU3RyaW5nIHByZWZp
eCwgbG9jYWxOYW1lOwotICAgIGlmICghcGFyc2VRdWFsaWZpZWROYW1lKHF1YWxpZmllZE5hbWUs
IHByZWZpeCwgbG9jYWxOYW1lLCBlYykpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgUXVhbGlm
aWVkTmFtZSBxTmFtZShwcmVmaXgsIGxvY2FsTmFtZSwgbmFtZXNwYWNlVVJJKTsKLQotICAgIGlm
ICghc2hvdWxkSWdub3JlTmFtZXNwYWNlQ2hlY2tzICYmICFoYXNWYWxpZE5hbWVzcGFjZUZvckF0
dHJpYnV0ZXMocU5hbWUpKSB7Ci0gICAgICAgIGVjID0gTkFNRVNQQUNFX0VSUjsKLSAgICAgICAg
cmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIEF0dHI6OmNyZWF0ZSh0aGlzLCBxTmFtZSwg
ZW1wdHlTdHJpbmcoKSk7Ci19Ci0KLSNpZiBFTkFCTEUoU1ZHKQotY29uc3QgU1ZHRG9jdW1lbnRF
eHRlbnNpb25zKiBEb2N1bWVudDo6c3ZnRXh0ZW5zaW9ucygpCi17Ci0gICAgcmV0dXJuIG1fc3Zn
RXh0ZW5zaW9ucy5nZXQoKTsKLX0KLQotU1ZHRG9jdW1lbnRFeHRlbnNpb25zKiBEb2N1bWVudDo6
YWNjZXNzU1ZHRXh0ZW5zaW9ucygpCi17Ci0gICAgaWYgKCFtX3N2Z0V4dGVuc2lvbnMpCi0gICAg
ICAgIG1fc3ZnRXh0ZW5zaW9ucyA9IGFkb3B0UHRyKG5ldyBTVkdEb2N1bWVudEV4dGVuc2lvbnMo
dGhpcykpOwotICAgIHJldHVybiBtX3N2Z0V4dGVuc2lvbnMuZ2V0KCk7Ci19Ci0KLWJvb2wgRG9j
dW1lbnQ6Omhhc1NWR1Jvb3ROb2RlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZG9jdW1lbnRFbGVt
ZW50KCkgJiYgZG9jdW1lbnRFbGVtZW50KCktPmhhc1RhZ05hbWUoU1ZHTmFtZXM6OnN2Z1RhZyk7
Ci19Ci0jZW5kaWYKLQotLy8gRklYTUU6IFRoaXMgY2FjaGluZyBtZWNoYW5pc20gc2hvdWxkIGJl
IG1lcmdlZCB0aGF0IG9mIER5bmFtaWNOb2RlTGlzdCBpbiBOb2RlUmFyZURhdGEuCi1QYXNzUmVm
UHRyPEhUTUxDb2xsZWN0aW9uPiBEb2N1bWVudDo6Y2FjaGVkQ29sbGVjdGlvbihDb2xsZWN0aW9u
VHlwZSB0eXBlKQotewotICAgIEFTU0VSVChzdGF0aWNfY2FzdDx1bnNpZ25lZD4odHlwZSkgPCBO
dW1Vbm5hbWVkRG9jdW1lbnRDYWNoZWRUeXBlcyk7Ci0gICAgaWYgKG1fY29sbGVjdGlvbnNbdHlw
ZV0pCi0gICAgICAgIHJldHVybiBtX2NvbGxlY3Rpb25zW3R5cGVdOwotCi0gICAgUmVmUHRyPEhU
TUxDb2xsZWN0aW9uPiBjb2xsZWN0aW9uOwotICAgIGlmICh0eXBlID09IERvY0FsbCkKLSAgICAg
ICAgY29sbGVjdGlvbiA9IEhUTUxBbGxDb2xsZWN0aW9uOjpjcmVhdGUodGhpcyk7Ci0gICAgZWxz
ZQotICAgICAgICBjb2xsZWN0aW9uID0gSFRNTENvbGxlY3Rpb246OmNyZWF0ZSh0aGlzLCB0eXBl
KTsKLSAgICBtX2NvbGxlY3Rpb25zW3R5cGVdID0gY29sbGVjdGlvbi5nZXQoKTsKLQotICAgIHJl
dHVybiBjb2xsZWN0aW9uLnJlbGVhc2UoKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6cmVtb3ZlQ2Fj
aGVkSFRNTENvbGxlY3Rpb24oSFRNTENvbGxlY3Rpb24qIGNvbGxlY3Rpb24sIENvbGxlY3Rpb25U
eXBlIHR5cGUpCi17Ci0gICAgQVNTRVJUX1VOVVNFRChjb2xsZWN0aW9uLCBtX2NvbGxlY3Rpb25z
W3R5cGVdID09IGNvbGxlY3Rpb24pOwotICAgIG1fY29sbGVjdGlvbnNbdHlwZV0gPSAwOwotfQot
Ci1QYXNzUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBEb2N1bWVudDo6aW1hZ2VzKCkKLXsKLSAgICBy
ZXR1cm4gY2FjaGVkQ29sbGVjdGlvbihEb2NJbWFnZXMpOwotfQotCi1QYXNzUmVmUHRyPEhUTUxD
b2xsZWN0aW9uPiBEb2N1bWVudDo6YXBwbGV0cygpCi17Ci0gICAgcmV0dXJuIGNhY2hlZENvbGxl
Y3Rpb24oRG9jQXBwbGV0cyk7Ci19Ci0KLVBhc3NSZWZQdHI8SFRNTENvbGxlY3Rpb24+IERvY3Vt
ZW50OjplbWJlZHMoKQotewotICAgIHJldHVybiBjYWNoZWRDb2xsZWN0aW9uKERvY0VtYmVkcyk7
Ci19Ci0KLVBhc3NSZWZQdHI8SFRNTENvbGxlY3Rpb24+IERvY3VtZW50OjpwbHVnaW5zKCkKLXsK
LSAgICAvLyBUaGlzIGlzIGFuIGFsaWFzIGZvciBlbWJlZHMoKSByZXF1aXJlZCBmb3IgdGhlIEpT
IERPTSBiaW5kaW5ncy4KLSAgICByZXR1cm4gY2FjaGVkQ29sbGVjdGlvbihEb2NFbWJlZHMpOwot
fQotCi1QYXNzUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBEb2N1bWVudDo6b2JqZWN0cygpCi17Ci0g
ICAgcmV0dXJuIGNhY2hlZENvbGxlY3Rpb24oRG9jT2JqZWN0cyk7Ci19Ci0KLVBhc3NSZWZQdHI8
SFRNTENvbGxlY3Rpb24+IERvY3VtZW50OjpzY3JpcHRzKCkKLXsKLSAgICByZXR1cm4gY2FjaGVk
Q29sbGVjdGlvbihEb2NTY3JpcHRzKTsKLX0KLQotUGFzc1JlZlB0cjxIVE1MQ29sbGVjdGlvbj4g
RG9jdW1lbnQ6OmxpbmtzKCkKLXsKLSAgICByZXR1cm4gY2FjaGVkQ29sbGVjdGlvbihEb2NMaW5r
cyk7Ci19Ci0KLVBhc3NSZWZQdHI8SFRNTENvbGxlY3Rpb24+IERvY3VtZW50Ojpmb3JtcygpCi17
Ci0gICAgcmV0dXJuIGNhY2hlZENvbGxlY3Rpb24oRG9jRm9ybXMpOwotfQotCi1QYXNzUmVmUHRy
PEhUTUxDb2xsZWN0aW9uPiBEb2N1bWVudDo6YW5jaG9ycygpCi17Ci0gICAgcmV0dXJuIGNhY2hl
ZENvbGxlY3Rpb24oRG9jQW5jaG9ycyk7Ci19Ci0KLVBhc3NSZWZQdHI8SFRNTENvbGxlY3Rpb24+
IERvY3VtZW50OjphbGwoKQotewotICAgIHJldHVybiBjYWNoZWRDb2xsZWN0aW9uKERvY0FsbCk7
Ci19Ci0KLVBhc3NSZWZQdHI8SFRNTENvbGxlY3Rpb24+IERvY3VtZW50Ojp3aW5kb3dOYW1lZEl0
ZW1zKGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSkKLXsKLSAgICBOYW1lZENvbGxlY3Rpb25NYXA6
OkFkZFJlc3VsdCByZXN1bHQgPSBtX3dpbmRvd05hbWVkSXRlbUNvbGxlY3Rpb25zLmFkZChuYW1l
LCAwKTsKLSAgICBpZiAoIXJlc3VsdC5pc05ld0VudHJ5KQotICAgICAgICByZXR1cm4gcmVzdWx0
Lml0ZXJhdG9yLT5zZWNvbmQ7Ci0KLSAgICBSZWZQdHI8SFRNTE5hbWVDb2xsZWN0aW9uPiBjb2xs
ZWN0aW9uID0gSFRNTE5hbWVDb2xsZWN0aW9uOjpjcmVhdGUodGhpcywgV2luZG93TmFtZWRJdGVt
cywgbmFtZSk7Ci0gICAgcmVzdWx0Lml0ZXJhdG9yLT5zZWNvbmQgPSBjb2xsZWN0aW9uLmdldCgp
OwotICAgIHJldHVybiBjb2xsZWN0aW9uLnJlbGVhc2UoKTsKLX0KLQotUGFzc1JlZlB0cjxIVE1M
Q29sbGVjdGlvbj4gRG9jdW1lbnQ6OmRvY3VtZW50TmFtZWRJdGVtcyhjb25zdCBBdG9taWNTdHJp
bmcmIG5hbWUpCi17Ci0gICAgTmFtZWRDb2xsZWN0aW9uTWFwOjpBZGRSZXN1bHQgcmVzdWx0ID0g
bV9kb2N1bWVudE5hbWVkSXRlbUNvbGxlY3Rpb25zLmFkZChuYW1lLCAwKTsKLSAgICBpZiAoIXJl
c3VsdC5pc05ld0VudHJ5KQotICAgICAgICByZXR1cm4gcmVzdWx0Lml0ZXJhdG9yLT5zZWNvbmQ7
Ci0KLSAgICBSZWZQdHI8SFRNTE5hbWVDb2xsZWN0aW9uPiBjb2xsZWN0aW9uID0gSFRNTE5hbWVD
b2xsZWN0aW9uOjpjcmVhdGUodGhpcywgRG9jdW1lbnROYW1lZEl0ZW1zLCBuYW1lKTsKLSAgICBy
ZXN1bHQuaXRlcmF0b3ItPnNlY29uZCA9IGNvbGxlY3Rpb24uZ2V0KCk7Ci0gICAgcmV0dXJuIGNv
bGxlY3Rpb24ucmVsZWFzZSgpOwotfQotCi0vLyBGSVhNRTogVGhpcyBjYWNoaW5nIG1lY2hhbmlz
bSBzaG91bGQgYmUgbWVyZ2VkIHRoYXQgb2YgRHluYW1pY05vZGVMaXN0IGluIE5vZGVSYXJlRGF0
YS4KLXZvaWQgRG9jdW1lbnQ6OnJlbW92ZVdpbmRvd05hbWVkSXRlbUNhY2hlKEhUTUxDb2xsZWN0
aW9uKiBjb2xsZWN0aW9uLCBjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUpCi17Ci0gICAgQVNTRVJU
X1VOVVNFRChjb2xsZWN0aW9uLCBtX3dpbmRvd05hbWVkSXRlbUNvbGxlY3Rpb25zLmdldChuYW1l
KSA9PSBjb2xsZWN0aW9uKTsKLSAgICBtX3dpbmRvd05hbWVkSXRlbUNvbGxlY3Rpb25zLnJlbW92
ZShuYW1lKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6cmVtb3ZlRG9jdW1lbnROYW1lZEl0ZW1DYWNo
ZShIVE1MQ29sbGVjdGlvbiogY29sbGVjdGlvbiwgY29uc3QgQXRvbWljU3RyaW5nJiBuYW1lKQot
ewotICAgIEFTU0VSVF9VTlVTRUQoY29sbGVjdGlvbiwgbV9kb2N1bWVudE5hbWVkSXRlbUNvbGxl
Y3Rpb25zLmdldChuYW1lKSA9PSBjb2xsZWN0aW9uKTsKLSAgICBtX2RvY3VtZW50TmFtZWRJdGVt
Q29sbGVjdGlvbnMucmVtb3ZlKG5hbWUpOwotfQotCi12b2lkIERvY3VtZW50OjpmaW5pc2hlZFBh
cnNpbmcoKQotewotICAgIEFTU0VSVCghc2NyaXB0YWJsZURvY3VtZW50UGFyc2VyKCkgfHwgIW1f
cGFyc2VyLT5pc1BhcnNpbmcoKSk7Ci0gICAgQVNTRVJUKCFzY3JpcHRhYmxlRG9jdW1lbnRQYXJz
ZXIoKSB8fCBtX3JlYWR5U3RhdGUgIT0gTG9hZGluZyk7Ci0gICAgc2V0UGFyc2luZyhmYWxzZSk7
Ci0gICAgaWYgKCFtX2RvY3VtZW50VGltaW5nLmRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0KQot
ICAgICAgICBtX2RvY3VtZW50VGltaW5nLmRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0ID0gbW9u
b3RvbmljYWxseUluY3JlYXNpbmdUaW1lKCk7Ci0gICAgZGlzcGF0Y2hFdmVudChFdmVudDo6Y3Jl
YXRlKGV2ZW50TmFtZXMoKS5ET01Db250ZW50TG9hZGVkRXZlbnQsIHRydWUsIGZhbHNlKSk7Ci0g
ICAgaWYgKCFtX2RvY3VtZW50VGltaW5nLmRvbUNvbnRlbnRMb2FkZWRFdmVudEVuZCkKLSAgICAg
ICAgbV9kb2N1bWVudFRpbWluZy5kb21Db250ZW50TG9hZGVkRXZlbnRFbmQgPSBtb25vdG9uaWNh
bGx5SW5jcmVhc2luZ1RpbWUoKTsKLQotICAgIGlmIChSZWZQdHI8RnJhbWU+IGYgPSBmcmFtZSgp
KSB7Ci0gICAgICAgIC8vIEZyYW1lTG9hZGVyOjpmaW5pc2hlZFBhcnNpbmcoKSBtaWdodCBlbmQg
dXAgY2FsbGluZyBEb2N1bWVudDo6aW1wbGljaXRDbG9zZSgpIGlmIGFsbAotICAgICAgICAvLyBy
ZXNvdXJjZSBsb2FkcyBhcmUgY29tcGxldGUuIEhUTUxPYmplY3RFbGVtZW50cyBjYW4gc3RhcnQg
bG9hZGluZyB0aGVpciByZXNvdXJjZXMgZnJvbQotICAgICAgICAvLyBwb3N0IGF0dGFjaCBjYWxs
YmFja3MgdHJpZ2dlcmVkIGJ5IHJlY2FsY1N0eWxlKCkuICBUaGlzIG1lYW5zIGlmIHdlIHBhcnNl
IG91dCBhbiA8b2JqZWN0PgotICAgICAgICAvLyB0YWcgYW5kIHRoZW4gcmVhY2ggdGhlIGVuZCBv
ZiB0aGUgZG9jdW1lbnQgd2l0aG91dCB1cGRhdGluZyBzdHlsZXMsIHdlIG1pZ2h0IG5vdCBoYXZl
IHlldAotICAgICAgICAvLyBzdGFydGVkIHRoZSByZXNvdXJjZSBsb2FkIGFuZCBtaWdodCBmaXJl
IHRoZSB3aW5kb3cgbG9hZCBldmVudCB0b28gZWFybHkuICBUbyBhdm9pZCB0aGlzCi0gICAgICAg
IC8vIHdlIGZvcmNlIHRoZSBzdHlsZXMgdG8gYmUgdXAgdG8gZGF0ZSBiZWZvcmUgY2FsbGluZyBG
cmFtZUxvYWRlcjo6ZmluaXNoZWRQYXJzaW5nKCkuCi0gICAgICAgIC8vIFNlZSBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzY4NjQgc3RhcnRpbmcgYXJvdW5kIGNvbW1l
bnQgMzUuCi0gICAgICAgIHVwZGF0ZVN0eWxlSWZOZWVkZWQoKTsKLQotICAgICAgICBmLT5sb2Fk
ZXIoKS0+ZmluaXNoZWRQYXJzaW5nKCk7Ci0KLSAgICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0
aW9uOjpkb21Db250ZW50TG9hZGVkRXZlbnRGaXJlZChmLmdldCgpKTsKLSAgICB9Ci0KLSAgICAv
LyBUaGUgRWxlbWVudEF0dHJpYnV0ZURhdGEgc2hhcmluZyBjYWNoZSBpcyBvbmx5IHVzZWQgZHVy
aW5nIHBhcnNpbmcgc2luY2UKLSAgICAvLyB0aGF0J3Mgd2hlbiB0aGUgbWFqb3JpdHkgb2YgaW1t
dXRhYmxlIGF0dHJpYnV0ZSBkYXRhIHdpbGwgYmUgY3JlYXRlZC4KLSAgICBtX2ltbXV0YWJsZUF0
dHJpYnV0ZURhdGFDYWNoZS5jbGVhcigpOwotfQotCi1QYXNzUmVmUHRyPFhQYXRoRXhwcmVzc2lv
bj4gRG9jdW1lbnQ6OmNyZWF0ZUV4cHJlc3Npb24oY29uc3QgU3RyaW5nJiBleHByZXNzaW9uLAot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhQ
YXRoTlNSZXNvbHZlciogcmVzb2x2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgaWYgKCFt
X3hwYXRoRXZhbHVhdG9yKQotICAgICAgICBtX3hwYXRoRXZhbHVhdG9yID0gWFBhdGhFdmFsdWF0
b3I6OmNyZWF0ZSgpOwotICAgIHJldHVybiBtX3hwYXRoRXZhbHVhdG9yLT5jcmVhdGVFeHByZXNz
aW9uKGV4cHJlc3Npb24sIHJlc29sdmVyLCBlYyk7Ci19Ci0KLVBhc3NSZWZQdHI8WFBhdGhOU1Jl
c29sdmVyPiBEb2N1bWVudDo6Y3JlYXRlTlNSZXNvbHZlcihOb2RlKiBub2RlUmVzb2x2ZXIpCi17
Ci0gICAgaWYgKCFtX3hwYXRoRXZhbHVhdG9yKQotICAgICAgICBtX3hwYXRoRXZhbHVhdG9yID0g
WFBhdGhFdmFsdWF0b3I6OmNyZWF0ZSgpOwotICAgIHJldHVybiBtX3hwYXRoRXZhbHVhdG9yLT5j
cmVhdGVOU1Jlc29sdmVyKG5vZGVSZXNvbHZlcik7Ci19Ci0KLVBhc3NSZWZQdHI8WFBhdGhSZXN1
bHQ+IERvY3VtZW50OjpldmFsdWF0ZShjb25zdCBTdHJpbmcmIGV4cHJlc3Npb24sCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSogY29udGV4dE5vZGUsCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFBhdGhOU1Jlc29sdmVy
KiByZXNvbHZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1
bnNpZ25lZCBzaG9ydCB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIFhQYXRoUmVzdWx0KiByZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgaWYgKCFtX3hwYXRoRXZh
bHVhdG9yKQotICAgICAgICBtX3hwYXRoRXZhbHVhdG9yID0gWFBhdGhFdmFsdWF0b3I6OmNyZWF0
ZSgpOwotICAgIHJldHVybiBtX3hwYXRoRXZhbHVhdG9yLT5ldmFsdWF0ZShleHByZXNzaW9uLCBj
b250ZXh0Tm9kZSwgcmVzb2x2ZXIsIHR5cGUsIHJlc3VsdCwgZWMpOwotfQotCi1jb25zdCBWZWN0
b3I8SWNvblVSTD4mIERvY3VtZW50OjppY29uVVJMcygpCi17Ci0gICAgbV9pY29uVVJMcy5jbGVh
cigpOwotCi0gICAgaWYgKCFoZWFkKCkgfHwgIShoZWFkKCktPmNoaWxkcmVuKCkpKQotICAgICAg
ICByZXR1cm4gbV9pY29uVVJMczsKLQotICAgIC8vIEluY2x1ZGUgYW55IGljb25zIHdoZXJlIHR5
cGUgPSBsaW5rLCByZWwgPSAic2hvcnRjdXQgaWNvbiIuCi0gICAgUmVmUHRyPEhUTUxDb2xsZWN0
aW9uPiBjaGlsZHJlbiA9IGhlYWQoKS0+Y2hpbGRyZW4oKTsKLSAgICB1bnNpZ25lZCBpbnQgbGVu
Z3RoID0gY2hpbGRyZW4tPmxlbmd0aCgpOwotICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBp
IDwgbGVuZ3RoOyArK2kpIHsKLSAgICAgICAgTm9kZSogY2hpbGQgPSBjaGlsZHJlbi0+aXRlbShp
KTsKLSAgICAgICAgaWYgKCFjaGlsZC0+aGFzVGFnTmFtZShsaW5rVGFnKSkKLSAgICAgICAgICAg
IGNvbnRpbnVlOwotICAgICAgICBIVE1MTGlua0VsZW1lbnQqIGxpbmtFbGVtZW50ID0gc3RhdGlj
X2Nhc3Q8SFRNTExpbmtFbGVtZW50Kj4oY2hpbGQpOwotICAgICAgICBpZiAobGlua0VsZW1lbnQt
Pmljb25UeXBlKCkgIT0gRmF2aWNvbikKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBp
ZiAobGlua0VsZW1lbnQtPmhyZWYoKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICBjb250aW51ZTsK
LQotICAgICAgICAvLyBQdXQgaXQgYXQgdGhlIGZyb250IHRvIGVuc3VyZSB0aGF0IGljb25zIHNl
ZW4gbGF0ZXIgdGFrZSBwcmVjZWRlbmNlIGFzIHJlcXVpcmVkIGJ5IHRoZSBzcGVjLgotICAgICAg
ICBJY29uVVJMIG5ld1VSTChsaW5rRWxlbWVudC0+aHJlZigpLCBsaW5rRWxlbWVudC0+aWNvblNp
emVzKCksIGxpbmtFbGVtZW50LT50eXBlKCksIGxpbmtFbGVtZW50LT5pY29uVHlwZSgpKTsKLSAg
ICAgICAgbV9pY29uVVJMcy5wcmVwZW5kKG5ld1VSTCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1f
aWNvblVSTHM7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmFkZEljb25VUkwoY29uc3QgU3RyaW5nJiB1
cmwsIGNvbnN0IFN0cmluZyYgbWltZVR5cGUsIGNvbnN0IFN0cmluZyYgc2l6ZXMsIEljb25UeXBl
IGljb25UeXBlKQotewotICAgIGlmICh1cmwuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0K
LSAgICAvLyBGSVhNRSAtIDxyZGFyOi8vcHJvYmxlbS80NzI3NjQ1PiAtIEF0IHNvbWUgcG9pbnQg
aW4gdGhlIGZ1dHVyZSwgd2UgbWlnaHQgYWN0dWFsbHkgaG9ub3IgdGhlICJtaW1lVHlwZSIKLSAg
ICBJY29uVVJMIG5ld1VSTChLVVJMKFBhcnNlZFVSTFN0cmluZywgdXJsKSwgc2l6ZXMsIG1pbWVU
eXBlLCBpY29uVHlwZSk7Ci0KLSAgICBpZiAoRnJhbWUqIGYgPSBmcmFtZSgpKSB7Ci0gICAgICAg
IEljb25VUkwgaWNvblVSTCA9IGYtPmxvYWRlcigpLT5pY29uKCktPmljb25VUkwoaWNvblR5cGUp
OwotICAgICAgICBpZiAoaWNvblVSTCA9PSBuZXdVUkwpCi0gICAgICAgICAgICBmLT5sb2FkZXIo
KS0+ZGlkQ2hhbmdlSWNvbnMoaWNvblR5cGUpOwotICAgIH0KLX0KLQotdm9pZCBEb2N1bWVudDo6
c2V0VXNlU2VjdXJlS2V5Ym9hcmRFbnRyeVdoZW5BY3RpdmUoYm9vbCB1c2VzU2VjdXJlS2V5Ym9h
cmQpCi17Ci0gICAgaWYgKG1fdXNlU2VjdXJlS2V5Ym9hcmRFbnRyeVdoZW5BY3RpdmUgPT0gdXNl
c1NlY3VyZUtleWJvYXJkKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX3VzZVNlY3VyZUtleWJv
YXJkRW50cnlXaGVuQWN0aXZlID0gdXNlc1NlY3VyZUtleWJvYXJkOwotICAgIG1fZnJhbWUtPnNl
bGVjdGlvbigpLT51cGRhdGVTZWN1cmVLZXlib2FyZEVudHJ5SWZBY3RpdmUoKTsKLX0KLQotYm9v
bCBEb2N1bWVudDo6dXNlU2VjdXJlS2V5Ym9hcmRFbnRyeVdoZW5BY3RpdmUoKSBjb25zdAotewot
ICAgIHJldHVybiBtX3VzZVNlY3VyZUtleWJvYXJkRW50cnlXaGVuQWN0aXZlOwotfQotCi1zdGF0
aWMgYm9vbCBpc0VsaWdpYmxlRm9yU2VhbWxlc3MoRG9jdW1lbnQqIHBhcmVudCwgRG9jdW1lbnQq
IGNoaWxkKQotewotICAgIC8vIEl0IHNob3VsZCBub3QgbWF0dGVyIHdoYXQgd2UgcmV0dXJuIGZv
ciB0aGUgdG9wLW1vc3QgZG9jdW1lbnQuCi0gICAgaWYgKCFwYXJlbnQpCi0gICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICBpZiAocGFyZW50LT5pc1NhbmRib3hlZChTYW5kYm94U2VhbWxlc3NJZnJh
bWVzKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChjaGlsZC0+aXNTcmNkb2NEb2N1
bWVudCgpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICBpZiAocGFyZW50LT5zZWN1cml0eU9y
aWdpbigpLT5jYW5BY2Nlc3MoY2hpbGQtPnNlY3VyaXR5T3JpZ2luKCkpKQotICAgICAgICByZXR1
cm4gdHJ1ZTsKLSAgICByZXR1cm4gcGFyZW50LT5zZWN1cml0eU9yaWdpbigpLT5jYW5SZXF1ZXN0
KGNoaWxkLT51cmwoKSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmluaXRTZWN1cml0eUNvbnRleHQo
KQotewotICAgIGlmIChoYXZlSW5pdGlhbGl6ZWRTZWN1cml0eU9yaWdpbigpKSB7Ci0gICAgICAg
IEFTU0VSVChzZWN1cml0eU9yaWdpbigpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAg
IGlmICghbV9mcmFtZSkgewotICAgICAgICAvLyBObyBzb3VyY2UgZm9yIGEgc2VjdXJpdHkgY29u
dGV4dC4KLSAgICAgICAgLy8gVGhpcyBjYW4gb2NjdXIgdmlhIGRvY3VtZW50LmltcGxlbWVudGF0
aW9uLmNyZWF0ZURvY3VtZW50KCkuCi0gICAgICAgIG1fY29va2llVVJMID0gS1VSTChQYXJzZWRV
UkxTdHJpbmcsIGVtcHR5U3RyaW5nKCkpOwotICAgICAgICBzZXRTZWN1cml0eU9yaWdpbihTZWN1
cml0eU9yaWdpbjo6Y3JlYXRlVW5pcXVlKCkpOwotICAgICAgICBzZXRDb250ZW50U2VjdXJpdHlQ
b2xpY3koQ29udGVudFNlY3VyaXR5UG9saWN5OjpjcmVhdGUodGhpcykpOwotICAgICAgICByZXR1
cm47Ci0gICAgfQotCi0gICAgLy8gSW4gdGhlIGNvbW1vbiBjYXNlLCBjcmVhdGUgdGhlIHNlY3Vy
aXR5IGNvbnRleHQgZnJvbSB0aGUgY3VycmVudGx5Ci0gICAgLy8gbG9hZGluZyBVUkwgd2l0aCBh
IGZyZXNoIGNvbnRlbnQgc2VjdXJpdHkgcG9saWN5LgotICAgIG1fY29va2llVVJMID0gbV91cmw7
Ci0gICAgZW5mb3JjZVNhbmRib3hGbGFncyhtX2ZyYW1lLT5sb2FkZXIoKS0+ZWZmZWN0aXZlU2Fu
ZGJveEZsYWdzKCkpOwotICAgIHNldFNlY3VyaXR5T3JpZ2luKGlzU2FuZGJveGVkKFNhbmRib3hP
cmlnaW4pID8gU2VjdXJpdHlPcmlnaW46OmNyZWF0ZVVuaXF1ZSgpIDogU2VjdXJpdHlPcmlnaW46
OmNyZWF0ZShtX3VybCkpOwotICAgIHNldENvbnRlbnRTZWN1cml0eVBvbGljeShDb250ZW50U2Vj
dXJpdHlQb2xpY3k6OmNyZWF0ZSh0aGlzKSk7Ci0KLSAgICBpZiAoU2VjdXJpdHlQb2xpY3k6OmFs
bG93U3Vic3RpdHV0ZURhdGFBY2Nlc3NUb0xvY2FsKCkpIHsKLSAgICAgICAgLy8gSWYgdGhpcyBk
b2N1bWVudCB3YXMgbG9hZGVkIHdpdGggc3Vic3RpdHV0ZURhdGEsIHRoZW4gdGhlIGRvY3VtZW50
IGNhbgotICAgICAgICAvLyBsb2FkIGxvY2FsIHJlc291cmNlcy4gIFNlZSBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTY3NTYKLSAgICAgICAgLy8gYW5kIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xOTc2MCBmb3IgZnVydGhlcgotICAgICAg
ICAvLyBkaXNjdXNzaW9uLgotICAgICAgICAKLSAgICAgICAgRG9jdW1lbnRMb2FkZXIqIGRvY3Vt
ZW50TG9hZGVyID0gbG9hZGVyKCk7Ci0gICAgICAgIGlmIChkb2N1bWVudExvYWRlciAmJiBkb2N1
bWVudExvYWRlci0+c3Vic3RpdHV0ZURhdGEoKS5pc1ZhbGlkKCkpCi0gICAgICAgICAgICBzZWN1
cml0eU9yaWdpbigpLT5ncmFudExvYWRMb2NhbFJlc291cmNlcygpOwotICAgIH0KLQotICAgIGlm
IChTZXR0aW5ncyogc2V0dGluZ3MgPSB0aGlzLT5zZXR0aW5ncygpKSB7Ci0gICAgICAgIGlmICgh
c2V0dGluZ3MtPmlzV2ViU2VjdXJpdHlFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIC8vIFdlYiBz
ZWN1cml0eSBpcyB0dXJuZWQgb2ZmLiBXZSBzaG91bGQgbGV0IHRoaXMgZG9jdW1lbnQgYWNjZXNz
IGV2ZXJ5IG90aGVyIGRvY3VtZW50LiBUaGlzIGlzIHVzZWQgcHJpbWFyeSBieSB0ZXN0aW5nCi0g
ICAgICAgICAgICAvLyBoYXJuZXNzZXMgZm9yIHdlYiBzaXRlcy4KLSAgICAgICAgICAgIHNlY3Vy
aXR5T3JpZ2luKCktPmdyYW50VW5pdmVyc2FsQWNjZXNzKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAo
c2VjdXJpdHlPcmlnaW4oKS0+aXNMb2NhbCgpKSB7Ci0gICAgICAgICAgICBpZiAoc2V0dGluZ3Mt
PmFsbG93VW5pdmVyc2FsQWNjZXNzRnJvbUZpbGVVUkxzKCkgfHwgbV9mcmFtZS0+bG9hZGVyKCkt
PmNsaWVudCgpLT5zaG91bGRGb3JjZVVuaXZlcnNhbEFjY2Vzc0Zyb21Mb2NhbFVSTChtX3VybCkp
IHsKLSAgICAgICAgICAgICAgICAvLyBTb21lIGNsaWVudHMgd2FudCBsb2NhbCBVUkxzIHRvIGhh
dmUgdW5pdmVyc2FsIGFjY2VzcywgYnV0IHRoYXQgc2V0dGluZyBpcyBkYW5nZXJvdXMgZm9yIG90
aGVyIGNsaWVudHMuCi0gICAgICAgICAgICAgICAgc2VjdXJpdHlPcmlnaW4oKS0+Z3JhbnRVbml2
ZXJzYWxBY2Nlc3MoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXNldHRpbmdzLT5hbGxvd0Zp
bGVBY2Nlc3NGcm9tRmlsZVVSTHMoKSkgewotICAgICAgICAgICAgICAgIC8vIFNvbWUgY2xpZW50
cyB3YW50IGxvY2FsIFVSTHMgdG8gaGF2ZSBldmVuIHRpZ2h0ZXIgcmVzdHJpY3Rpb25zIGJ5IGRl
ZmF1bHQsIGFuZCBub3QgYmUgYWJsZSB0byBhY2Nlc3Mgb3RoZXIgbG9jYWwgZmlsZXMuCi0gICAg
ICAgICAgICAgICAgLy8gRklYTUUgODE1Nzg6IFRoZSBuYW1pbmcgb2YgdGhpcyBpcyBjb25mdXNp
bmcuIEZpbGVzIHdpdGggcmVzdHJpY3RlZCBhY2Nlc3MgdG8gb3RoZXIgbG9jYWwgZmlsZXMKLSAg
ICAgICAgICAgICAgICAvLyBzdGlsbCBjYW4gaGF2ZSBvdGhlciBwcml2aWxlZ2VzIHRoYXQgY2Fu
IGJlIHJlbWVtYmVyZWQsIHRoZXJlYnkgbm90IG1ha2luZyB0aGVtIHVuaXF1ZSBvcmlnaW5zLgot
ICAgICAgICAgICAgICAgIHNlY3VyaXR5T3JpZ2luKCktPmVuZm9yY2VGaWxlUGF0aFNlcGFyYXRp
b24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzZWN1cml0eU9yaWdpbigp
LT5zZXRTdG9yYWdlQmxvY2tpbmdQb2xpY3koc2V0dGluZ3MtPnN0b3JhZ2VCbG9ja2luZ1BvbGlj
eSgpKTsKLSAgICB9Ci0KLSAgICBEb2N1bWVudCogcGFyZW50RG9jdW1lbnQgPSBvd25lckVsZW1l
bnQoKSA/IG93bmVyRWxlbWVudCgpLT5kb2N1bWVudCgpIDogMDsKLSAgICBpZiAocGFyZW50RG9j
dW1lbnQgJiYgbV9mcmFtZS0+bG9hZGVyKCktPnNob3VsZFRyZWF0VVJMQXNTcmNkb2NEb2N1bWVu
dCh1cmwoKSkpIHsKLSAgICAgICAgbV9pc1NyY2RvY0RvY3VtZW50ID0gdHJ1ZTsKLSAgICAgICAg
c2V0QmFzZVVSTE92ZXJyaWRlKHBhcmVudERvY3VtZW50LT5iYXNlVVJMKCkpOwotICAgIH0KLQot
ICAgIC8vIEZJWE1FOiBXaGF0IGhhcHBlbnMgaWYgd2UgaW5oZXJpdCB0aGUgc2VjdXJpdHkgb3Jp
Z2luPyBUaGlzIGNoZWNrIG1heSBuZWVkIHRvIGJlIGxhdGVyLgotICAgIC8vIDxpZnJhbWUgc2Vh
bWxlc3Mgc3JjPSJhYm91dDpibGFuayI+IGxpa2VseSB3b24ndCB3b3JrIGFzLWlzLgotICAgIG1f
bWF5RGlzcGxheVNlYW1sZXNzV2l0aFBhcmVudCA9IGlzRWxpZ2libGVGb3JTZWFtbGVzcyhwYXJl
bnREb2N1bWVudCwgdGhpcyk7Ci0KLSAgICBpZiAoIXNob3VsZEluaGVyaXRTZWN1cml0eU9yaWdp
bkZyb21Pd25lcihtX3VybCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIElmIHdlIGRvIG5v
dCBvYnRhaW4gYSBtZWFuaW5nZnVsIG9yaWdpbiBmcm9tIHRoZSBVUkwsIHRoZW4gd2UgdHJ5IHRv
Ci0gICAgLy8gZmluZCBvbmUgdmlhIHRoZSBmcmFtZSBoaWVyYXJjaHkuCi0KLSAgICBGcmFtZSog
b3duZXJGcmFtZSA9IG1fZnJhbWUtPnRyZWUoKS0+cGFyZW50KCk7Ci0gICAgaWYgKCFvd25lckZy
YW1lKQotICAgICAgICBvd25lckZyYW1lID0gbV9mcmFtZS0+bG9hZGVyKCktPm9wZW5lcigpOwot
Ci0gICAgaWYgKCFvd25lckZyYW1lKSB7Ci0gICAgICAgIGRpZEZhaWxUb0luaXRpYWxpemVTZWN1
cml0eU9yaWdpbigpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGlzU2FuZGJv
eGVkKFNhbmRib3hPcmlnaW4pKSB7Ci0gICAgICAgIC8vIElmIHdlJ3JlIHN1cHBvc2VkIHRvIGlu
aGVyaXQgb3VyIHNlY3VyaXR5IG9yaWdpbiBmcm9tIG91ciBvd25lciwKLSAgICAgICAgLy8gYnV0
IHdlJ3JlIGFsc28gc2FuZGJveGVkLCB0aGUgb25seSB0aGluZyB3ZSBpbmhlcml0IGlzIHRoZSBh
YmlsaXR5Ci0gICAgICAgIC8vIHRvIGxvYWQgbG9jYWwgcmVzb3VyY2VzLiBUaGlzIGxldHMgYWJv
dXQ6YmxhbmsgaWZyYW1lcyBpbiBmaWxlOi8vCi0gICAgICAgIC8vIFVSTCBkb2N1bWVudHMgbG9h
ZCBpbWFnZXMgYW5kIG90aGVyIHJlc291cmNlcyBmcm9tIHRoZSBmaWxlIHN5c3RlbS4KLSAgICAg
ICAgaWYgKG93bmVyRnJhbWUtPmRvY3VtZW50KCktPnNlY3VyaXR5T3JpZ2luKCktPmNhbkxvYWRM
b2NhbFJlc291cmNlcygpKQotICAgICAgICAgICAgc2VjdXJpdHlPcmlnaW4oKS0+Z3JhbnRMb2Fk
TG9jYWxSZXNvdXJjZXMoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1fY29va2ll
VVJMID0gb3duZXJGcmFtZS0+ZG9jdW1lbnQoKS0+Y29va2llVVJMKCk7Ci0gICAgLy8gV2UgYWxp
YXMgdGhlIFNlY3VyaXR5T3JpZ2lucyB0byBtYXRjaCBGaXJlZm94LCBzZWUgQnVnIDE1MzEzCi0g
ICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1MzEzCi0gICAg
c2V0U2VjdXJpdHlPcmlnaW4ob3duZXJGcmFtZS0+ZG9jdW1lbnQoKS0+c2VjdXJpdHlPcmlnaW4o
KSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmluaXRDb250ZW50U2VjdXJpdHlQb2xpY3koKQotewot
ICAgIGlmICghbV9mcmFtZS0+dHJlZSgpLT5wYXJlbnQoKSB8fCAoIXNob3VsZEluaGVyaXRTZWN1
cml0eU9yaWdpbkZyb21Pd25lcihtX3VybCkgJiYgIWlzUGx1Z2luRG9jdW1lbnQoKSkpCi0gICAg
ICAgIHJldHVybjsKLQotICAgIGNvbnRlbnRTZWN1cml0eVBvbGljeSgpLT5jb3B5U3RhdGVGcm9t
KG1fZnJhbWUtPnRyZWUoKS0+cGFyZW50KCktPmRvY3VtZW50KCktPmNvbnRlbnRTZWN1cml0eVBv
bGljeSgpKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6ZGlkVXBkYXRlU2VjdXJpdHlPcmlnaW4oKQot
ewotICAgIGlmICghbV9mcmFtZSkKLSAgICAgICAgcmV0dXJuOwotICAgIG1fZnJhbWUtPnNjcmlw
dCgpLT51cGRhdGVTZWN1cml0eU9yaWdpbigpOwotfQotCi1ib29sIERvY3VtZW50Ojppc0NvbnRl
eHRUaHJlYWQoKSBjb25zdAotewotICAgIHJldHVybiBpc01haW5UaHJlYWQoKTsKLX0KLQotdm9p
ZCBEb2N1bWVudDo6dXBkYXRlVVJMRm9yUHVzaE9yUmVwbGFjZVN0YXRlKGNvbnN0IEtVUkwmIHVy
bCkKLXsKLSAgICBGcmFtZSogZiA9IGZyYW1lKCk7Ci0gICAgaWYgKCFmKQotICAgICAgICByZXR1
cm47Ci0KLSAgICBzZXRVUkwodXJsKTsKLSAgICBmLT5sb2FkZXIoKS0+c2V0T3V0Z29pbmdSZWZl
cnJlcih1cmwpOwotCi0gICAgaWYgKERvY3VtZW50TG9hZGVyKiBkb2N1bWVudExvYWRlciA9IGxv
YWRlcigpKQotICAgICAgICBkb2N1bWVudExvYWRlci0+cmVwbGFjZVJlcXVlc3RVUkxGb3JTYW1l
RG9jdW1lbnROYXZpZ2F0aW9uKHVybCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnN0YXRlUG9wcGVk
KFBhc3NSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiBzdGF0ZU9iamVjdCkKLXsKLSAgICBp
ZiAoIWZyYW1lKCkpCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICAvLyBQZXIgc3RlcCAxMSBv
ZiBzZWN0aW9uIDYuNS45IChoaXN0b3J5IHRyYXZlcnNhbCkgb2YgdGhlIEhUTUw1IHNwZWMsIHdl
IAotICAgIC8vIGRlZmVyIGZpcmluZyBvZiBwb3BzdGF0ZSB1bnRpbCB3ZSdyZSBpbiB0aGUgY29t
cGxldGUgc3RhdGUuCi0gICAgaWYgKG1fcmVhZHlTdGF0ZSA9PSBDb21wbGV0ZSkKLSAgICAgICAg
ZW5xdWV1ZVBvcHN0YXRlRXZlbnQoc3RhdGVPYmplY3QpOwotICAgIGVsc2UKLSAgICAgICAgbV9w
ZW5kaW5nU3RhdGVPYmplY3QgPSBzdGF0ZU9iamVjdDsKLX0KLQotdm9pZCBEb2N1bWVudDo6dXBk
YXRlRm9jdXNBcHBlYXJhbmNlU29vbihib29sIHJlc3RvcmVQcmV2aW91c1NlbGVjdGlvbikKLXsK
LSAgICBtX3VwZGF0ZUZvY3VzQXBwZWFyYW5jZVJlc3RvcmVzU2VsZWN0aW9uID0gcmVzdG9yZVBy
ZXZpb3VzU2VsZWN0aW9uOwotICAgIGlmICghbV91cGRhdGVGb2N1c0FwcGVhcmFuY2VUaW1lci5p
c0FjdGl2ZSgpKQotICAgICAgICBtX3VwZGF0ZUZvY3VzQXBwZWFyYW5jZVRpbWVyLnN0YXJ0T25l
U2hvdCgwKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6Y2FuY2VsRm9jdXNBcHBlYXJhbmNlVXBkYXRl
KCkKLXsKLSAgICBtX3VwZGF0ZUZvY3VzQXBwZWFyYW5jZVRpbWVyLnN0b3AoKTsKLX0KLQotdm9p
ZCBEb2N1bWVudDo6dXBkYXRlRm9jdXNBcHBlYXJhbmNlVGltZXJGaXJlZChUaW1lcjxEb2N1bWVu
dD4qKQotewotICAgIE5vZGUqIG5vZGUgPSBmb2N1c2VkTm9kZSgpOwotICAgIGlmICghbm9kZSkK
LSAgICAgICAgcmV0dXJuOwotICAgIGlmICghbm9kZS0+aXNFbGVtZW50Tm9kZSgpKQotICAgICAg
ICByZXR1cm47Ci0KLSAgICB1cGRhdGVMYXlvdXQoKTsKLQotICAgIEVsZW1lbnQqIGVsZW1lbnQg
PSBzdGF0aWNfY2FzdDxFbGVtZW50Kj4obm9kZSk7Ci0gICAgaWYgKGVsZW1lbnQtPmlzRm9jdXNh
YmxlKCkpCi0gICAgICAgIGVsZW1lbnQtPnVwZGF0ZUZvY3VzQXBwZWFyYW5jZShtX3VwZGF0ZUZv
Y3VzQXBwZWFyYW5jZVJlc3RvcmVzU2VsZWN0aW9uKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6YXR0
YWNoUmFuZ2UoUmFuZ2UqIHJhbmdlKQotewotICAgIEFTU0VSVCghbV9yYW5nZXMuY29udGFpbnMo
cmFuZ2UpKTsKLSAgICBtX3Jhbmdlcy5hZGQocmFuZ2UpOwotfQotCi12b2lkIERvY3VtZW50Ojpk
ZXRhY2hSYW5nZShSYW5nZSogcmFuZ2UpCi17Ci0gICAgLy8gV2UgZG9uJ3QgQVNTRVJUIG1fcmFu
Z2VzLmNvbnRhaW5zKHJhbmdlKSB0byBhbGxvdyB1cyB0byBjYWxsIHRoaXMKLSAgICAvLyB1bmNv
bmRpdGlvbmFsbHkgdG8gZml4OiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9MjYwNDQKLSAgICBtX3Jhbmdlcy5yZW1vdmUocmFuZ2UpOwotfQotCi1DYW52YXNSZW5kZXJp
bmdDb250ZXh0KiBEb2N1bWVudDo6Z2V0Q1NTQ2FudmFzQ29udGV4dChjb25zdCBTdHJpbmcmIHR5
cGUsIGNvbnN0IFN0cmluZyYgbmFtZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQotewotICAgIEhU
TUxDYW52YXNFbGVtZW50KiBlbGVtZW50ID0gZ2V0Q1NTQ2FudmFzRWxlbWVudChuYW1lKTsKLSAg
ICBpZiAoIWVsZW1lbnQpCi0gICAgICAgIHJldHVybiAwOwotICAgIGVsZW1lbnQtPnNldFNpemUo
SW50U2l6ZSh3aWR0aCwgaGVpZ2h0KSk7Ci0gICAgcmV0dXJuIGVsZW1lbnQtPmdldENvbnRleHQo
dHlwZSk7Ci19Ci0KLUhUTUxDYW52YXNFbGVtZW50KiBEb2N1bWVudDo6Z2V0Q1NTQ2FudmFzRWxl
bWVudChjb25zdCBTdHJpbmcmIG5hbWUpCi17Ci0gICAgUmVmUHRyPEhUTUxDYW52YXNFbGVtZW50
PiYgZWxlbWVudCA9IG1fY3NzQ2FudmFzRWxlbWVudHMuYWRkKG5hbWUsIDApLml0ZXJhdG9yLT5z
ZWNvbmQ7Ci0gICAgaWYgKCFlbGVtZW50KQotICAgICAgICBlbGVtZW50ID0gSFRNTENhbnZhc0Vs
ZW1lbnQ6OmNyZWF0ZSh0aGlzKTsKLSAgICByZXR1cm4gZWxlbWVudC5nZXQoKTsKLX0KLQotdm9p
ZCBEb2N1bWVudDo6aW5pdEROU1ByZWZldGNoKCkKLXsKLSAgICBTZXR0aW5ncyogc2V0dGluZ3Mg
PSB0aGlzLT5zZXR0aW5ncygpOwotCi0gICAgbV9oYXZlRXhwbGljaXRseURpc2FibGVkRE5TUHJl
ZmV0Y2ggPSBmYWxzZTsKLSAgICBtX2lzRE5TUHJlZmV0Y2hFbmFibGVkID0gc2V0dGluZ3MgJiYg
c2V0dGluZ3MtPmRuc1ByZWZldGNoaW5nRW5hYmxlZCgpICYmIHNlY3VyaXR5T3JpZ2luKCktPnBy
b3RvY29sKCkgPT0gImh0dHAiOwotCi0gICAgLy8gSW5oZXJpdCBETlMgcHJlZmV0Y2ggb3B0LW91
dCBmcm9tIHBhcmVudCBmcmFtZSAgICAKLSAgICBpZiAoRG9jdW1lbnQqIHBhcmVudCA9IHBhcmVu
dERvY3VtZW50KCkpIHsKLSAgICAgICAgaWYgKCFwYXJlbnQtPmlzRE5TUHJlZmV0Y2hFbmFibGVk
KCkpCi0gICAgICAgICAgICBtX2lzRE5TUHJlZmV0Y2hFbmFibGVkID0gZmFsc2U7Ci0gICAgfQot
fQotCi12b2lkIERvY3VtZW50OjpwYXJzZUROU1ByZWZldGNoQ29udHJvbEhlYWRlcihjb25zdCBT
dHJpbmcmIGRuc1ByZWZldGNoQ29udHJvbCkKLXsKLSAgICBpZiAoZXF1YWxJZ25vcmluZ0Nhc2Uo
ZG5zUHJlZmV0Y2hDb250cm9sLCAib24iKSAmJiAhbV9oYXZlRXhwbGljaXRseURpc2FibGVkRE5T
UHJlZmV0Y2gpIHsKLSAgICAgICAgbV9pc0ROU1ByZWZldGNoRW5hYmxlZCA9IHRydWU7Ci0gICAg
ICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtX2lzRE5TUHJlZmV0Y2hFbmFibGVkID0gZmFsc2U7
Ci0gICAgbV9oYXZlRXhwbGljaXRseURpc2FibGVkRE5TUHJlZmV0Y2ggPSB0cnVlOwotfQotCi12
b2lkIERvY3VtZW50OjphZGRNZXNzYWdlKE1lc3NhZ2VTb3VyY2Ugc291cmNlLCBNZXNzYWdlVHlw
ZSB0eXBlLCBNZXNzYWdlTGV2ZWwgbGV2ZWwsIGNvbnN0IFN0cmluZyYgbWVzc2FnZSwgY29uc3Qg
U3RyaW5nJiBzb3VyY2VVUkwsIHVuc2lnbmVkIGxpbmVOdW1iZXIsIFBhc3NSZWZQdHI8U2NyaXB0
Q2FsbFN0YWNrPiBjYWxsU3RhY2spCi17Ci0gICAgaWYgKCFpc0NvbnRleHRUaHJlYWQoKSkgewot
ICAgICAgICBwb3N0VGFzayhBZGRDb25zb2xlTWVzc2FnZVRhc2s6OmNyZWF0ZShzb3VyY2UsIHR5
cGUsIGxldmVsLCBtZXNzYWdlKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAo
RE9NV2luZG93KiB3aW5kb3cgPSBkb21XaW5kb3coKSkKLSAgICAgICAgd2luZG93LT5jb25zb2xl
KCktPmFkZE1lc3NhZ2Uoc291cmNlLCB0eXBlLCBsZXZlbCwgbWVzc2FnZSwgc291cmNlVVJMLCBs
aW5lTnVtYmVyLCBjYWxsU3RhY2spOwotfQotCi1zdHJ1Y3QgUGVyZm9ybVRhc2tDb250ZXh0IHsK
LSAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShQZXJmb3JtVGFza0NvbnRleHQpOyBXVEZfTUFLRV9G
QVNUX0FMTE9DQVRFRDsKLXB1YmxpYzoKLSAgICBQZXJmb3JtVGFza0NvbnRleHQoUGFzc1JlZlB0
cjxEb2N1bWVudFdlYWtSZWZlcmVuY2U+IGRvY3VtZW50UmVmZXJlbmNlLCBQYXNzT3duUHRyPFNj
cmlwdEV4ZWN1dGlvbkNvbnRleHQ6OlRhc2s+IHRhc2spCi0gICAgICAgIDogZG9jdW1lbnRSZWZl
cmVuY2UoZG9jdW1lbnRSZWZlcmVuY2UpCi0gICAgICAgICwgdGFzayh0YXNrKQotICAgIHsKLSAg
ICB9Ci0KLSAgICBSZWZQdHI8RG9jdW1lbnRXZWFrUmVmZXJlbmNlPiBkb2N1bWVudFJlZmVyZW5j
ZTsKLSAgICBPd25QdHI8U2NyaXB0RXhlY3V0aW9uQ29udGV4dDo6VGFzaz4gdGFzazsKLX07Ci0K
LXZvaWQgRG9jdW1lbnQ6OmRpZFJlY2VpdmVUYXNrKHZvaWQqIHVudHlwZWRDb250ZXh0KQotewot
ICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7Ci0KLSAgICBPd25QdHI8UGVyZm9ybVRhc2tDb250
ZXh0PiBjb250ZXh0ID0gYWRvcHRQdHIoc3RhdGljX2Nhc3Q8UGVyZm9ybVRhc2tDb250ZXh0Kj4o
dW50eXBlZENvbnRleHQpKTsKLSAgICBBU1NFUlQoY29udGV4dCk7Ci0KLSAgICBEb2N1bWVudCog
ZG9jdW1lbnQgPSBjb250ZXh0LT5kb2N1bWVudFJlZmVyZW5jZS0+ZG9jdW1lbnQoKTsKLSAgICBp
ZiAoIWRvY3VtZW50KQotICAgICAgICByZXR1cm47Ci0KLSAgICBQYWdlKiBwYWdlID0gZG9jdW1l
bnQtPnBhZ2UoKTsKLSAgICBpZiAoKHBhZ2UgJiYgcGFnZS0+ZGVmZXJzTG9hZGluZygpKSB8fCAh
ZG9jdW1lbnQtPm1fcGVuZGluZ1Rhc2tzLmlzRW1wdHkoKSkgewotICAgICAgICBkb2N1bWVudC0+
bV9wZW5kaW5nVGFza3MuYXBwZW5kKGNvbnRleHQtPnRhc2sucmVsZWFzZSgpKTsKLSAgICAgICAg
cmV0dXJuOwotICAgIH0KLQotICAgIGNvbnRleHQtPnRhc2stPnBlcmZvcm1UYXNrKGRvY3VtZW50
KTsKLX0KLQotdm9pZCBEb2N1bWVudDo6cG9zdFRhc2soUGFzc093blB0cjxUYXNrPiB0YXNrKQot
ewotICAgIGNhbGxPbk1haW5UaHJlYWQoZGlkUmVjZWl2ZVRhc2ssIG5ldyBQZXJmb3JtVGFza0Nv
bnRleHQobV93ZWFrUmVmZXJlbmNlLCB0YXNrKSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnBlbmRp
bmdUYXNrc1RpbWVyRmlyZWQoVGltZXI8RG9jdW1lbnQ+KikKLXsKLSAgICB3aGlsZSAoIW1fcGVu
ZGluZ1Rhc2tzLmlzRW1wdHkoKSkgewotICAgICAgICBPd25QdHI8VGFzaz4gdGFzayA9IG1fcGVu
ZGluZ1Rhc2tzWzBdLnJlbGVhc2UoKTsKLSAgICAgICAgbV9wZW5kaW5nVGFza3MucmVtb3ZlKDAp
OwotICAgICAgICB0YXNrLT5wZXJmb3JtVGFzayh0aGlzKTsKLSAgICB9Ci19Ci0KLXZvaWQgRG9j
dW1lbnQ6OnN1c3BlbmRTY2hlZHVsZWRUYXNrcyhBY3RpdmVET01PYmplY3Q6OlJlYXNvbkZvclN1
c3BlbnNpb24gcmVhc29uKQotewotICAgIEFTU0VSVCghbV9zY2hlZHVsZWRUYXNrc0FyZVN1c3Bl
bmRlZCk7Ci0KLSAgICBzdXNwZW5kU2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyQ2FsbGJhY2tz
KCk7Ci0gICAgc3VzcGVuZEFjdGl2ZURPTU9iamVjdHMocmVhc29uKTsKLSAgICBzY3JpcHRSdW5u
ZXIoKS0+c3VzcGVuZCgpOwotICAgIG1fcGVuZGluZ1Rhc2tzVGltZXIuc3RvcCgpOwotICAgIGlm
IChtX3BhcnNlcikKLSAgICAgICAgbV9wYXJzZXItPnN1c3BlbmRTY2hlZHVsZWRUYXNrcygpOwot
Ci0gICAgbV9zY2hlZHVsZWRUYXNrc0FyZVN1c3BlbmRlZCA9IHRydWU7Ci19Ci0KLXZvaWQgRG9j
dW1lbnQ6OnJlc3VtZVNjaGVkdWxlZFRhc2tzKCkKLXsKLSAgICBBU1NFUlQobV9zY2hlZHVsZWRU
YXNrc0FyZVN1c3BlbmRlZCk7Ci0KLSAgICBpZiAobV9wYXJzZXIpCi0gICAgICAgIG1fcGFyc2Vy
LT5yZXN1bWVTY2hlZHVsZWRUYXNrcygpOwotICAgIGlmICghbV9wZW5kaW5nVGFza3MuaXNFbXB0
eSgpKQotICAgICAgICBtX3BlbmRpbmdUYXNrc1RpbWVyLnN0YXJ0T25lU2hvdCgwKTsKLSAgICBz
Y3JpcHRSdW5uZXIoKS0+cmVzdW1lKCk7Ci0gICAgcmVzdW1lQWN0aXZlRE9NT2JqZWN0cygpOwot
ICAgIHJlc3VtZVNjcmlwdGVkQW5pbWF0aW9uQ29udHJvbGxlckNhbGxiYWNrcygpOwotICAgIAot
ICAgIG1fc2NoZWR1bGVkVGFza3NBcmVTdXNwZW5kZWQgPSBmYWxzZTsKLX0KLQotdm9pZCBEb2N1
bWVudDo6c3VzcGVuZFNjcmlwdGVkQW5pbWF0aW9uQ29udHJvbGxlckNhbGxiYWNrcygpCi17Ci0j
aWYgRU5BQkxFKFJFUVVFU1RfQU5JTUFUSU9OX0ZSQU1FKQotICAgIGlmIChtX3NjcmlwdGVkQW5p
bWF0aW9uQ29udHJvbGxlcikKLSAgICAgICAgbV9zY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXIt
PnN1c3BlbmQoKTsKLSNlbmRpZgotfQotCi12b2lkIERvY3VtZW50OjpyZXN1bWVTY3JpcHRlZEFu
aW1hdGlvbkNvbnRyb2xsZXJDYWxsYmFja3MoKQotewotI2lmIEVOQUJMRShSRVFVRVNUX0FOSU1B
VElPTl9GUkFNRSkKLSAgICBpZiAobV9zY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXIpCi0gICAg
ICAgIG1fc2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyLT5yZXN1bWUoKTsKLSNlbmRpZgotfQot
Ci12b2lkIERvY3VtZW50Ojp3aW5kb3dTY3JlZW5EaWRDaGFuZ2UoUGxhdGZvcm1EaXNwbGF5SUQg
ZGlzcGxheUlEKQotewotI2lmIEVOQUJMRShSRVFVRVNUX0FOSU1BVElPTl9GUkFNRSkKLSAgICBp
ZiAobV9zY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXIpCi0gICAgICAgIG1fc2NyaXB0ZWRBbmlt
YXRpb25Db250cm9sbGVyLT53aW5kb3dTY3JlZW5EaWRDaGFuZ2UoZGlzcGxheUlEKTsKLSNlbHNl
Ci0gICAgVU5VU0VEX1BBUkFNKGRpc3BsYXlJRCk7Ci0jZW5kaWYKLX0KLQotCi1TdHJpbmcgRG9j
dW1lbnQ6OmRpc3BsYXlTdHJpbmdNb2RpZmllZEJ5RW5jb2RpbmcoY29uc3QgU3RyaW5nJiBzdHIp
IGNvbnN0Ci17Ci0gICAgaWYgKG1fZGVjb2RlcikKLSAgICAgICAgcmV0dXJuIG1fZGVjb2Rlci0+
ZW5jb2RpbmcoKS5kaXNwbGF5U3RyaW5nKHN0ci5pbXBsKCkpOwotICAgIHJldHVybiBzdHI7Ci19
Ci0KLVBhc3NSZWZQdHI8U3RyaW5nSW1wbD4gRG9jdW1lbnQ6OmRpc3BsYXlTdHJpbmdNb2RpZmll
ZEJ5RW5jb2RpbmcoUGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBzdHIpIGNvbnN0Ci17Ci0gICAgaWYg
KG1fZGVjb2RlcikKLSAgICAgICAgcmV0dXJuIG1fZGVjb2Rlci0+ZW5jb2RpbmcoKS5kaXNwbGF5
U3RyaW5nKHN0cik7Ci0gICAgcmV0dXJuIHN0cjsKLX0KLQotdm9pZCBEb2N1bWVudDo6ZGlzcGxh
eUJ1ZmZlck1vZGlmaWVkQnlFbmNvZGluZyhVQ2hhciogYnVmZmVyLCB1bnNpZ25lZCBsZW4pIGNv
bnN0Ci17Ci0gICAgaWYgKG1fZGVjb2RlcikKLSAgICAgICAgbV9kZWNvZGVyLT5lbmNvZGluZygp
LmRpc3BsYXlCdWZmZXIoYnVmZmVyLCBsZW4pOwotfQotCi12b2lkIERvY3VtZW50OjplbnF1ZXVl
UGFnZXNob3dFdmVudChQYWdlc2hvd0V2ZW50UGVyc2lzdGVuY2UgcGVyc2lzdGVkKQotewotICAg
IC8vIEZJWE1FOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzYzMzQg
UGFnZXNob3cgZXZlbnQgbmVlZHMgdG8gZmlyZSBhc3luY2hyb25vdXNseS4KLSAgICBkaXNwYXRj
aFdpbmRvd0V2ZW50KFBhZ2VUcmFuc2l0aW9uRXZlbnQ6OmNyZWF0ZShldmVudE5hbWVzKCkucGFn
ZXNob3dFdmVudCwgcGVyc2lzdGVkKSwgdGhpcyk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmVucXVl
dWVIYXNoY2hhbmdlRXZlbnQoY29uc3QgU3RyaW5nJiBvbGRVUkwsIGNvbnN0IFN0cmluZyYgbmV3
VVJMKQotewotICAgIGVucXVldWVXaW5kb3dFdmVudChIYXNoQ2hhbmdlRXZlbnQ6OmNyZWF0ZShv
bGRVUkwsIG5ld1VSTCkpOwotfQotCi12b2lkIERvY3VtZW50OjplbnF1ZXVlUG9wc3RhdGVFdmVu
dChQYXNzUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gc3RhdGVPYmplY3QpCi17Ci0gICAg
Ly8gRklYTUU6IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zNjIwMiBQ
b3BzdGF0ZSBldmVudCBuZWVkcyB0byBmaXJlIGFzeW5jaHJvbm91c2x5Ci0gICAgZGlzcGF0Y2hX
aW5kb3dFdmVudChQb3BTdGF0ZUV2ZW50OjpjcmVhdGUoc3RhdGVPYmplY3QsIGRvbVdpbmRvdygp
ID8gZG9tV2luZG93KCktPmhpc3RvcnkoKSA6IDApKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6YWRk
TWVkaWFDYW5TdGFydExpc3RlbmVyKE1lZGlhQ2FuU3RhcnRMaXN0ZW5lciogbGlzdGVuZXIpCi17
Ci0gICAgQVNTRVJUKCFtX21lZGlhQ2FuU3RhcnRMaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIp
KTsKLSAgICBtX21lZGlhQ2FuU3RhcnRMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLX0KLQotdm9p
ZCBEb2N1bWVudDo6cmVtb3ZlTWVkaWFDYW5TdGFydExpc3RlbmVyKE1lZGlhQ2FuU3RhcnRMaXN0
ZW5lciogbGlzdGVuZXIpCi17Ci0gICAgQVNTRVJUKG1fbWVkaWFDYW5TdGFydExpc3RlbmVycy5j
b250YWlucyhsaXN0ZW5lcikpOwotICAgIG1fbWVkaWFDYW5TdGFydExpc3RlbmVycy5yZW1vdmUo
bGlzdGVuZXIpOwotfQotCi1NZWRpYUNhblN0YXJ0TGlzdGVuZXIqIERvY3VtZW50Ojp0YWtlQW55
TWVkaWFDYW5TdGFydExpc3RlbmVyKCkKLXsKLSAgICBIYXNoU2V0PE1lZGlhQ2FuU3RhcnRMaXN0
ZW5lcio+OjppdGVyYXRvciBzbG90ID0gbV9tZWRpYUNhblN0YXJ0TGlzdGVuZXJzLmJlZ2luKCk7
Ci0gICAgaWYgKHNsb3QgPT0gbV9tZWRpYUNhblN0YXJ0TGlzdGVuZXJzLmVuZCgpKQotICAgICAg
ICByZXR1cm4gMDsKLSAgICBNZWRpYUNhblN0YXJ0TGlzdGVuZXIqIGxpc3RlbmVyID0gKnNsb3Q7
Ci0gICAgbV9tZWRpYUNhblN0YXJ0TGlzdGVuZXJzLnJlbW92ZShzbG90KTsKLSAgICByZXR1cm4g
bGlzdGVuZXI7Ci19Ci0KLSNpZiBFTkFCTEUoRlVMTFNDUkVFTl9BUEkpCi1ib29sIERvY3VtZW50
OjpmdWxsU2NyZWVuSXNBbGxvd2VkRm9yRWxlbWVudChFbGVtZW50KiBlbGVtZW50KSBjb25zdAot
ewotICAgIEFTU0VSVChlbGVtZW50KTsKLSAgICByZXR1cm4gaXNBdHRyaWJ1dGVPbkFsbE93bmVy
cyh3ZWJraXRhbGxvd2Z1bGxzY3JlZW5BdHRyLCBlbGVtZW50LT5kb2N1bWVudCgpLT5vd25lckVs
ZW1lbnQoKSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnJlcXVlc3RGdWxsU2NyZWVuRm9yRWxlbWVu
dChFbGVtZW50KiBlbGVtZW50LCB1bnNpZ25lZCBzaG9ydCBmbGFncywgRnVsbFNjcmVlbkNoZWNr
VHlwZSBjaGVja1R5cGUpCi17Ci0gICAgLy8gVGhlIE1vemlsbGEgRnVsbCBTY3JlZW4gQVBJIDxo
dHRwczovL3dpa2kubW96aWxsYS5vcmcvR2Vja286RnVsbFNjcmVlbkFQST4gaGFzIGRpZmZlcmVu
dCByZXF1aXJlbWVudHMKLSAgICAvLyBmb3IgZnVsbCBzY3JlZW4gbW9kZSwgYW5kIGRvIG5vdCBo
YXZlIHRoZSBjb25jZXB0IG9mIGEgZnVsbCBzY3JlZW4gZWxlbWVudCBzdGFjay4KLSAgICBib29s
IGluTGVnYWN5TW96aWxsYU1vZGUgPSAoZmxhZ3MgJiBFbGVtZW50OjpMRUdBQ1lfTU9aSUxMQV9S
RVFVRVNUKTsKLQotICAgIGRvIHsKLSAgICAgICAgaWYgKCFlbGVtZW50KQotICAgICAgICAgICAg
ZWxlbWVudCA9IGRvY3VtZW50RWxlbWVudCgpOwotIAotICAgICAgICAvLyAxLiBJZiBhbnkgb2Yg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSB0cnVlLCB0ZXJtaW5hdGUgdGhlc2Ugc3RlcHMg
YW5kIHF1ZXVlIGEgdGFzayB0byBmaXJlCi0gICAgICAgIC8vIGFuIGV2ZW50IG5hbWVkIGZ1bGxz
Y3JlZW5lcnJvciB3aXRoIGl0cyBidWJibGVzIGF0dHJpYnV0ZSBzZXQgdG8gdHJ1ZSBvbiB0aGUg
Y29udGV4dCBvYmplY3QncyAKLSAgICAgICAgLy8gbm9kZSBkb2N1bWVudDoKLQotICAgICAgICAv
LyBUaGUgY29udGV4dCBvYmplY3QgaXMgbm90IGluIGEgZG9jdW1lbnQuCi0gICAgICAgIGlmICgh
ZWxlbWVudC0+aW5Eb2N1bWVudCgpKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLy8g
VGhlIGNvbnRleHQgb2JqZWN0J3Mgbm9kZSBkb2N1bWVudCwgb3IgYW4gYW5jZXN0b3IgYnJvd3Np
bmcgY29udGV4dCdzIGRvY3VtZW50IGRvZXMgbm90IGhhdmUKLSAgICAgICAgLy8gdGhlIGZ1bGxz
Y3JlZW4gZW5hYmxlZCBmbGFnIHNldC4KLSAgICAgICAgaWYgKGNoZWNrVHlwZSA9PSBFbmZvcmNl
SUZyYW1lQWxsb3dGdWxsU2NyZWVuUmVxdWlyZW1lbnQgJiYgIWZ1bGxTY3JlZW5Jc0FsbG93ZWRG
b3JFbGVtZW50KGVsZW1lbnQpKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLy8gVGhl
IGNvbnRleHQgb2JqZWN0J3Mgbm9kZSBkb2N1bWVudCBmdWxsc2NyZWVuIGVsZW1lbnQgc3RhY2sg
aXMgbm90IGVtcHR5IGFuZCBpdHMgdG9wIGVsZW1lbnQKLSAgICAgICAgLy8gaXMgbm90IGFuIGFu
Y2VzdG9yIG9mIHRoZSBjb250ZXh0IG9iamVjdC4gKE5PVEU6IElnbm9yZSB0aGlzIHJlcXVpcmVt
ZW50IGlmIHRoZSByZXF1ZXN0IHdhcwotICAgICAgICAvLyBtYWRlIHZpYSB0aGUgbGVnYWN5IE1v
emlsbGEtc3R5bGUgQVBJLikKLSAgICAgICAgaWYgKCFtX2Z1bGxTY3JlZW5FbGVtZW50U3RhY2su
aXNFbXB0eSgpICYmICFtX2Z1bGxTY3JlZW5FbGVtZW50U3RhY2suZmlyc3QoKS0+Y29udGFpbnMo
ZWxlbWVudCkgJiYgIWluTGVnYWN5TW96aWxsYU1vZGUpCi0gICAgICAgICAgICBicmVhazsKLQot
ICAgICAgICAvLyBBIGRlc2NlbmRhbnQgYnJvd3NpbmcgY29udGV4dCdzIGRvY3VtZW50IGhhcyBh
IG5vbi1lbXB0eSBmdWxsc2NyZWVuIGVsZW1lbnQgc3RhY2suCi0gICAgICAgIGJvb2wgZGVzY2Vu
ZGVudEhhc05vbkVtcHR5U3RhY2sgPSBmYWxzZTsKLSAgICAgICAgZm9yIChGcmFtZSogZGVzY2Vu
ZGFudCA9IGZyYW1lKCkgPyBmcmFtZSgpLT50cmVlKCktPnRyYXZlcnNlTmV4dCgpIDogMDsgZGVz
Y2VuZGFudDsgZGVzY2VuZGFudCA9IGRlc2NlbmRhbnQtPnRyZWUoKS0+dHJhdmVyc2VOZXh0KCkp
IHsKLSAgICAgICAgICAgIGlmIChkZXNjZW5kYW50LT5kb2N1bWVudCgpLT53ZWJraXRGdWxsc2Ny
ZWVuRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgZGVzY2VuZGVudEhhc05vbkVtcHR5U3Rh
Y2sgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAg
ICB9Ci0gICAgICAgIGlmIChkZXNjZW5kZW50SGFzTm9uRW1wdHlTdGFjayAmJiAhaW5MZWdhY3lN
b3ppbGxhTW9kZSkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8vIFRoaXMgYWxnb3Jp
dGhtIGlzIG5vdCBhbGxvd2VkIHRvIHNob3cgYSBwb3AtdXA6Ci0gICAgICAgIC8vICAgQW4gYWxn
b3JpdGhtIGlzIGFsbG93ZWQgdG8gc2hvdyBhIHBvcC11cCBpZiwgaW4gdGhlIHRhc2sgaW4gd2hp
Y2ggdGhlIGFsZ29yaXRobSBpcyBydW5uaW5nLCBlaXRoZXI6Ci0gICAgICAgIC8vICAgLSBhbiBh
Y3RpdmF0aW9uIGJlaGF2aW9yIGlzIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQgd2hvc2UgY2xp
Y2sgZXZlbnQgd2FzIHRydXN0ZWQsIG9yCi0gICAgICAgIC8vICAgLSB0aGUgZXZlbnQgbGlzdGVu
ZXIgZm9yIGEgdHJ1c3RlZCBjbGljayBldmVudCBpcyBiZWluZyBoYW5kbGVkLgotICAgICAgICBp
ZiAoIVNjcmlwdENvbnRyb2xsZXI6OnByb2Nlc3NpbmdVc2VyR2VzdHVyZSgpKQotICAgICAgICAg
ICAgYnJlYWs7Ci0KLSAgICAgICAgLy8gVGhlcmUgaXMgYSBwcmV2aW91c2x5LWVzdGFibGlzaGVk
IHVzZXIgcHJlZmVyZW5jZSwgc2VjdXJpdHkgcmlzaywgb3IgcGxhdGZvcm0gbGltaXRhdGlvbi4K
LSAgICAgICAgaWYgKCFwYWdlKCkgfHwgIXBhZ2UoKS0+c2V0dGluZ3MoKS0+ZnVsbFNjcmVlbkVu
YWJsZWQoKSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAKLSAgICAgICAgaWYgKCFwYWdl
KCktPmNocm9tZSgpLT5jbGllbnQoKS0+c3VwcG9ydHNGdWxsU2NyZWVuRm9yRWxlbWVudChlbGVt
ZW50LCBmbGFncyAmIEVsZW1lbnQ6OkFMTE9XX0tFWUJPQVJEX0lOUFVUKSkKLSAgICAgICAgICAg
IGJyZWFrOwotCi0gICAgICAgIC8vIDIuIExldCBkb2MgYmUgZWxlbWVudCdzIG5vZGUgZG9jdW1l
bnQuIChpLmUuICJ0aGlzIikKLSAgICAgICAgRG9jdW1lbnQqIGN1cnJlbnREb2MgPSB0aGlzOwot
Ci0gICAgICAgIC8vIDMuIExldCBkb2NzIGJlIGFsbCBkb2MncyBhbmNlc3RvciBicm93c2luZyBj
b250ZXh0J3MgZG9jdW1lbnRzIChpZiBhbnkpIGFuZCBkb2MuCi0gICAgICAgIERlcXVlPERvY3Vt
ZW50Kj4gZG9jczsKLQotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBkb2NzLnByZXBlbmQoY3Vy
cmVudERvYyk7Ci0gICAgICAgICAgICBjdXJyZW50RG9jID0gY3VycmVudERvYy0+b3duZXJFbGVt
ZW50KCkgPyBjdXJyZW50RG9jLT5vd25lckVsZW1lbnQoKS0+ZG9jdW1lbnQoKSA6IDA7Ci0gICAg
ICAgIH0gd2hpbGUgKGN1cnJlbnREb2MpOwotCi0gICAgICAgIC8vIDQuIEZvciBlYWNoIGRvY3Vt
ZW50IGluIGRvY3MsIHJ1biB0aGVzZSBzdWJzdGVwczoKLSAgICAgICAgRGVxdWU8RG9jdW1lbnQq
Pjo6aXRlcmF0b3IgY3VycmVudCA9IGRvY3MuYmVnaW4oKSwgZm9sbG93aW5nID0gZG9jcy5iZWdp
bigpOwotCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgICsrZm9sbG93aW5nOwotCi0gICAgICAg
ICAgICAvLyAxLiBMZXQgZm9sbG93aW5nIGRvY3VtZW50IGJlIHRoZSBkb2N1bWVudCBhZnRlciBk
b2N1bWVudCBpbiBkb2NzLCBvciBudWxsIGlmIHRoZXJlIGlzIG5vCi0gICAgICAgICAgICAvLyBz
dWNoIGRvY3VtZW50LgotICAgICAgICAgICAgRG9jdW1lbnQqIGN1cnJlbnREb2MgPSAqY3VycmVu
dDsKLSAgICAgICAgICAgIERvY3VtZW50KiBmb2xsb3dpbmdEb2MgPSBmb2xsb3dpbmcgIT0gZG9j
cy5lbmQoKSA/ICpmb2xsb3dpbmcgOiAwOwotCi0gICAgICAgICAgICAvLyAyLiBJZiBmb2xsb3dp
bmcgZG9jdW1lbnQgaXMgbnVsbCwgcHVzaCBjb250ZXh0IG9iamVjdCBvbiBkb2N1bWVudCdzIGZ1
bGxzY3JlZW4gZWxlbWVudAotICAgICAgICAgICAgLy8gc3RhY2ssIGFuZCBxdWV1ZSBhIHRhc2sg
dG8gZmlyZSBhbiBldmVudCBuYW1lZCBmdWxsc2NyZWVuY2hhbmdlIHdpdGggaXRzIGJ1YmJsZXMg
YXR0cmlidXRlCi0gICAgICAgICAgICAvLyBzZXQgdG8gdHJ1ZSBvbiB0aGUgZG9jdW1lbnQuCi0g
ICAgICAgICAgICBpZiAoIWZvbGxvd2luZ0RvYykgewotICAgICAgICAgICAgICAgIGN1cnJlbnRE
b2MtPnB1c2hGdWxsc2NyZWVuRWxlbWVudFN0YWNrKGVsZW1lbnQpOwotICAgICAgICAgICAgICAg
IGFkZERvY3VtZW50VG9GdWxsU2NyZWVuQ2hhbmdlRXZlbnRRdWV1ZShjdXJyZW50RG9jKTsKLSAg
ICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8g
My4gT3RoZXJ3aXNlLCBpZiBkb2N1bWVudCdzIGZ1bGxzY3JlZW4gZWxlbWVudCBzdGFjayBpcyBl
aXRoZXIgZW1wdHkgb3IgaXRzIHRvcCBlbGVtZW50Ci0gICAgICAgICAgICAvLyBpcyBub3QgZm9s
bG93aW5nIGRvY3VtZW50J3MgYnJvd3NpbmcgY29udGV4dCBjb250YWluZXIsCi0gICAgICAgICAg
ICBFbGVtZW50KiB0b3BFbGVtZW50ID0gY3VycmVudERvYy0+d2Via2l0RnVsbHNjcmVlbkVsZW1l
bnQoKTsKLSAgICAgICAgICAgIGlmICghdG9wRWxlbWVudCB8fCB0b3BFbGVtZW50ICE9IGZvbGxv
d2luZ0RvYy0+b3duZXJFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAvLyAuLi5wdXNoIGZv
bGxvd2luZyBkb2N1bWVudCdzIGJyb3dzaW5nIGNvbnRleHQgY29udGFpbmVyIG9uIGRvY3VtZW50
J3MgZnVsbHNjcmVlbiBlbGVtZW50Ci0gICAgICAgICAgICAgICAgLy8gc3RhY2ssIGFuZCBxdWV1
ZSBhIHRhc2sgdG8gZmlyZSBhbiBldmVudCBuYW1lZCBmdWxsc2NyZWVuY2hhbmdlIHdpdGggaXRz
IGJ1YmJsZXMgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgLy8gc2V0IHRvIHRydWUgb24gZG9j
dW1lbnQuCi0gICAgICAgICAgICAgICAgY3VycmVudERvYy0+cHVzaEZ1bGxzY3JlZW5FbGVtZW50
U3RhY2soZm9sbG93aW5nRG9jLT5vd25lckVsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgICAgYWRk
RG9jdW1lbnRUb0Z1bGxTY3JlZW5DaGFuZ2VFdmVudFF1ZXVlKGN1cnJlbnREb2MpOwotICAgICAg
ICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyA0LiBP
dGhlcndpc2UsIGRvIG5vdGhpbmcgZm9yIHRoaXMgZG9jdW1lbnQuIEl0IHN0YXlzIHRoZSBzYW1l
LgotICAgICAgICB9IHdoaWxlICgrK2N1cnJlbnQgIT0gZG9jcy5lbmQoKSk7Ci0KLSAgICAgICAg
Ly8gNS4gUmV0dXJuLCBhbmQgcnVuIHRoZSByZW1haW5pbmcgc3RlcHMgYXN5bmNocm9ub3VzbHku
Ci0gICAgICAgIC8vIDYuIE9wdGlvbmFsbHksIHBlcmZvcm0gc29tZSBhbmltYXRpb24uCi0gICAg
ICAgIG1fYXJlS2V5c0VuYWJsZWRJbkZ1bGxTY3JlZW4gPSBmbGFncyAmIEVsZW1lbnQ6OkFMTE9X
X0tFWUJPQVJEX0lOUFVUOwotICAgICAgICBwYWdlKCktPmNocm9tZSgpLT5jbGllbnQoKS0+ZW50
ZXJGdWxsU2NyZWVuRm9yRWxlbWVudChlbGVtZW50KTsKLQotICAgICAgICAvLyA3LiBPcHRpb25h
bGx5LCBkaXNwbGF5IGEgbWVzc2FnZSBpbmRpY2F0aW5nIGhvdyB0aGUgdXNlciBjYW4gZXhpdCBk
aXNwbGF5aW5nIHRoZSBjb250ZXh0IG9iamVjdCBmdWxsc2NyZWVuLgotICAgICAgICByZXR1cm47
Ci0gICAgfSB3aGlsZSAoMCk7Ci0KLSAgICBtX2Z1bGxTY3JlZW5FcnJvckV2ZW50VGFyZ2V0UXVl
dWUuYXBwZW5kKGVsZW1lbnQgPyBlbGVtZW50IDogZG9jdW1lbnRFbGVtZW50KCkpOwotICAgIG1f
ZnVsbFNjcmVlbkNoYW5nZURlbGF5VGltZXIuc3RhcnRPbmVTaG90KDApOwotfQotCi12b2lkIERv
Y3VtZW50Ojp3ZWJraXRDYW5jZWxGdWxsU2NyZWVuKCkKLXsKLSAgICAvLyBUaGUgTW96aWxsYSAi
Y2FuY2VsRnVsbFNjcmVlbigpIiBBUEkgYmVoYXZlcyBsaWtlIHRoZSBXM0MgImZ1bGx5IGV4aXQg
ZnVsbHNjcmVlbiIgYmVoYXZpb3IsIHdoaWNoCi0gICAgLy8gaXMgZGVmaW5lZCBhczogCi0gICAg
Ly8gIlRvIGZ1bGx5IGV4aXQgZnVsbHNjcmVlbiBhY3QgYXMgaWYgdGhlIGV4aXRGdWxsc2NyZWVu
KCkgbWV0aG9kIHdhcyBpbnZva2VkIG9uIHRoZSB0b3AtbGV2ZWwgYnJvd3NpbmcKLSAgICAvLyBj
b250ZXh0J3MgZG9jdW1lbnQgYW5kIHN1YnNlcXVlbnRseSBlbXB0eSB0aGF0IGRvY3VtZW50J3Mg
ZnVsbHNjcmVlbiBlbGVtZW50IHN0YWNrLiIKLSAgICBpZiAoIXRvcERvY3VtZW50KCktPndlYmtp
dEZ1bGxzY3JlZW5FbGVtZW50KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIFRvIGFjaGll
dmUgdGhhdCBhaW0sIHJlbW92ZSBhbGwgdGhlIGVsZW1lbnRzIGZyb20gdGhlIHRvcCBkb2N1bWVu
dCdzIHN0YWNrIGV4Y2VwdCBmb3IgdGhlIGZpcnN0IGJlZm9yZQotICAgIC8vIGNhbGxpbmcgd2Vi
a2l0RXhpdEZ1bGxzY3JlZW4oKToKLSAgICBEZXF1ZTxSZWZQdHI8RWxlbWVudD4gPiByZXBsYWNl
bWVudEZ1bGxzY3JlZW5FbGVtZW50U3RhY2s7Ci0gICAgcmVwbGFjZW1lbnRGdWxsc2NyZWVuRWxl
bWVudFN0YWNrLnByZXBlbmQodG9wRG9jdW1lbnQoKS0+d2Via2l0RnVsbHNjcmVlbkVsZW1lbnQo
KSk7Ci0gICAgdG9wRG9jdW1lbnQoKS0+bV9mdWxsU2NyZWVuRWxlbWVudFN0YWNrLnN3YXAocmVw
bGFjZW1lbnRGdWxsc2NyZWVuRWxlbWVudFN0YWNrKTsKLQotICAgIHRvcERvY3VtZW50KCktPndl
YmtpdEV4aXRGdWxsc2NyZWVuKCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OndlYmtpdEV4aXRGdWxs
c2NyZWVuKCkKLXsKLSAgICAvLyBUaGUgZXhpdEZ1bGxzY3JlZW4oKSBtZXRob2QgbXVzdCBydW4g
dGhlc2Ugc3RlcHM6Ci0gICAgCi0gICAgLy8gMS4gTGV0IGRvYyBiZSB0aGUgY29udGV4dCBvYmpl
Y3QuIChpLmUuICJ0aGlzIikKLSAgICBEb2N1bWVudCogY3VycmVudERvYyA9IHRoaXM7Ci0KLSAg
ICAvLyAyLiBJZiBkb2MncyBmdWxsc2NyZWVuIGVsZW1lbnQgc3RhY2sgaXMgZW1wdHksIHRlcm1p
bmF0ZSB0aGVzZSBzdGVwcy4KLSAgICBpZiAobV9mdWxsU2NyZWVuRWxlbWVudFN0YWNrLmlzRW1w
dHkoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIC8vIDMuIExldCBkZXNjZW5kYW50cyBi
ZSBhbGwgdGhlIGRvYydzIGRlc2NlbmRhbnQgYnJvd3NpbmcgY29udGV4dCdzIGRvY3VtZW50cyB3
aXRoIGEgbm9uLWVtcHR5IGZ1bGxzY3JlZW4KLSAgICAvLyBlbGVtZW50IHN0YWNrIChpZiBhbnkp
LCBvcmRlcmVkIHNvIHRoYXQgdGhlIGNoaWxkIG9mIHRoZSBkb2MgaXMgbGFzdCBhbmQgdGhlIGRv
Y3VtZW50IGZ1cnRoZXN0Ci0gICAgLy8gYXdheSBmcm9tIHRoZSBkb2MgaXMgZmlyc3QuCi0gICAg
RGVxdWU8UmVmUHRyPERvY3VtZW50PiA+IGRlc2NlbmRhbnRzOwotICAgIGZvciAoRnJhbWUqIGRl
c2NlbmRhbnQgPSBmcmFtZSgpID8gZnJhbWUoKS0+dHJlZSgpLT50cmF2ZXJzZU5leHQoKSA6IDA7
IGRlc2NlbmRhbnQ7IGRlc2NlbmRhbnQgPSBkZXNjZW5kYW50LT50cmVlKCktPnRyYXZlcnNlTmV4
dCgpKSB7Ci0gICAgICAgIGlmIChkZXNjZW5kYW50LT5kb2N1bWVudCgpLT53ZWJraXRGdWxsc2Ny
ZWVuRWxlbWVudCgpKQotICAgICAgICAgICAgZGVzY2VuZGFudHMucHJlcGVuZChkZXNjZW5kYW50
LT5kb2N1bWVudCgpKTsKLSAgICB9Ci0gICAgICAgIAotICAgIC8vIDQuIEZvciBlYWNoIGRlc2Nl
bmRhbnQgaW4gZGVzY2VuZGFudHMsIGVtcHR5IGRlc2NlbmRhbnQncyBmdWxsc2NyZWVuIGVsZW1l
bnQgc3RhY2ssIGFuZCBxdWV1ZSBhCi0gICAgLy8gdGFzayB0byBmaXJlIGFuIGV2ZW50IG5hbWVk
IGZ1bGxzY3JlZW5jaGFuZ2Ugd2l0aCBpdHMgYnViYmxlcyBhdHRyaWJ1dGUgc2V0IHRvIHRydWUg
b24gZGVzY2VuZGFudC4KLSAgICBmb3IgKERlcXVlPFJlZlB0cjxEb2N1bWVudD4gPjo6aXRlcmF0
b3IgaSA9IGRlc2NlbmRhbnRzLmJlZ2luKCk7IGkgIT0gZGVzY2VuZGFudHMuZW5kKCk7ICsraSkg
ewotICAgICAgICAoKmkpLT5jbGVhckZ1bGxzY3JlZW5FbGVtZW50U3RhY2soKTsKLSAgICAgICAg
YWRkRG9jdW1lbnRUb0Z1bGxTY3JlZW5DaGFuZ2VFdmVudFF1ZXVlKGktPmdldCgpKTsKLSAgICB9
Ci0KLSAgICAvLyA1LiBXaGlsZSBkb2MgaXMgbm90IG51bGwsIHJ1biB0aGVzZSBzdWJzdGVwczoK
LSAgICBFbGVtZW50KiBuZXdUb3AgPSAwOwotICAgIHdoaWxlIChjdXJyZW50RG9jKSB7Ci0gICAg
ICAgIC8vIDEuIFBvcCB0aGUgdG9wIGVsZW1lbnQgb2YgZG9jJ3MgZnVsbHNjcmVlbiBlbGVtZW50
IHN0YWNrLgotICAgICAgICBjdXJyZW50RG9jLT5wb3BGdWxsc2NyZWVuRWxlbWVudFN0YWNrKCk7
Ci0KLSAgICAgICAgLy8gICAgSWYgZG9jJ3MgZnVsbHNjcmVlbiBlbGVtZW50IHN0YWNrIGlzIG5v
bi1lbXB0eSBhbmQgdGhlIGVsZW1lbnQgbm93IGF0IHRoZSB0b3AgaXMgZWl0aGVyCi0gICAgICAg
IC8vICAgIG5vdCBpbiBhIGRvY3VtZW50IG9yIGl0cyBub2RlIGRvY3VtZW50IGlzIG5vdCBkb2Ms
IHJlcGVhdCB0aGlzIHN1YnN0ZXAuCi0gICAgICAgIG5ld1RvcCA9IGN1cnJlbnREb2MtPndlYmtp
dEZ1bGxzY3JlZW5FbGVtZW50KCk7Ci0gICAgICAgIGlmIChuZXdUb3AgJiYgKCFuZXdUb3AtPmlu
RG9jdW1lbnQoKSB8fCBuZXdUb3AtPmRvY3VtZW50KCkgIT0gY3VycmVudERvYykpCi0gICAgICAg
ICAgICBjb250aW51ZTsKLQotICAgICAgICAvLyAyLiBRdWV1ZSBhIHRhc2sgdG8gZmlyZSBhbiBl
dmVudCBuYW1lZCBmdWxsc2NyZWVuY2hhbmdlIHdpdGggaXRzIGJ1YmJsZXMgYXR0cmlidXRlIHNl
dCB0byB0cnVlCi0gICAgICAgIC8vIG9uIGRvYy4KLSAgICAgICAgYWRkRG9jdW1lbnRUb0Z1bGxT
Y3JlZW5DaGFuZ2VFdmVudFF1ZXVlKGN1cnJlbnREb2MpOwotCi0gICAgICAgIC8vIDMuIElmIGRv
YydzIGZ1bGxzY3JlZW4gZWxlbWVudCBzdGFjayBpcyBlbXB0eSBhbmQgZG9jJ3MgYnJvd3Npbmcg
Y29udGV4dCBoYXMgYSBicm93c2luZyBjb250ZXh0Ci0gICAgICAgIC8vIGNvbnRhaW5lciwgc2V0
IGRvYyB0byB0aGF0IGJyb3dzaW5nIGNvbnRleHQgY29udGFpbmVyJ3Mgbm9kZSBkb2N1bWVudC4K
LSAgICAgICAgaWYgKCFuZXdUb3AgJiYgY3VycmVudERvYy0+b3duZXJFbGVtZW50KCkpIHsKLSAg
ICAgICAgICAgIGN1cnJlbnREb2MgPSBjdXJyZW50RG9jLT5vd25lckVsZW1lbnQoKS0+ZG9jdW1l
bnQoKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gNC4g
T3RoZXJ3aXNlLCBzZXQgZG9jIHRvIG51bGwuCi0gICAgICAgIGN1cnJlbnREb2MgPSAwOwotICAg
IH0KLQotICAgIC8vIDYuIFJldHVybiwgYW5kIHJ1biB0aGUgcmVtYWluaW5nIHN0ZXBzIGFzeW5j
aHJvbm91c2x5LgotICAgIC8vIDcuIE9wdGlvbmFsbHksIHBlcmZvcm0gc29tZSBhbmltYXRpb24u
Ci0KLSAgICAvLyBPbmx5IGV4aXQgb3V0IG9mIGZ1bGwgc2NyZWVuIHdpbmRvdyBtb2RlIGlmIHRo
ZXJlIGFyZSBubyByZW1haW5pbmcgZWxlbWVudHMgaW4gdGhlIAotICAgIC8vIGZ1bGwgc2NyZWVu
IHN0YWNrLgotICAgIGlmICghbmV3VG9wKSB7Ci0gICAgICAgIHBhZ2UoKS0+Y2hyb21lKCktPmNs
aWVudCgpLT5leGl0RnVsbFNjcmVlbkZvckVsZW1lbnQobV9mdWxsU2NyZWVuRWxlbWVudC5nZXQo
KSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBPdGhlcndpc2UsIG5vdGlmeSB0
aGUgY2hyb21lIG9mIHRoZSBuZXcgZnVsbCBzY3JlZW4gZWxlbWVudC4KLSAgICBwYWdlKCktPmNo
cm9tZSgpLT5jbGllbnQoKS0+ZW50ZXJGdWxsU2NyZWVuRm9yRWxlbWVudChuZXdUb3ApOyAgICAg
IAotfQotCi1ib29sIERvY3VtZW50Ojp3ZWJraXRGdWxsc2NyZWVuRW5hYmxlZCgpIGNvbnN0Ci17
Ci0gICAgLy8gNC4gVGhlIGZ1bGxzY3JlZW5FbmFibGVkIGF0dHJpYnV0ZSBtdXN0IHJldHVybiB0
cnVlIGlmIHRoZSBjb250ZXh0IG9iamVjdCBhbmQgYWxsIGFuY2VzdG9yCi0gICAgLy8gYnJvd3Np
bmcgY29udGV4dCdzIGRvY3VtZW50cyBoYXZlIHRoZWlyIGZ1bGxzY3JlZW4gZW5hYmxlZCBmbGFn
IHNldCwgb3IgZmFsc2Ugb3RoZXJ3aXNlLgotCi0gICAgLy8gVG9wLWxldmVsIGJyb3dzaW5nIGNv
bnRleHRzIGFyZSBpbXBsaWVkIHRvIGhhdmUgdGhlaXIgYWxsb3dGdWxsU2NyZWVuIGF0dHJpYnV0
ZSBzZXQuCi0gICAgcmV0dXJuIGlzQXR0cmlidXRlT25BbGxPd25lcnMod2Via2l0YWxsb3dmdWxs
c2NyZWVuQXR0ciwgb3duZXJFbGVtZW50KCkpOwotfQotCi12b2lkIERvY3VtZW50Ojp3ZWJraXRX
aWxsRW50ZXJGdWxsU2NyZWVuRm9yRWxlbWVudChFbGVtZW50KiBlbGVtZW50KQotewotICAgIGlm
ICghYXR0YWNoZWQoKSB8fCBpblBhZ2VDYWNoZSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBB
U1NFUlQoZWxlbWVudCk7Ci0KLSAgICAvLyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgY2FsbGVkIGFm
dGVyIHRoZSBkb2N1bWVudCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHBhZ2UuCi0gICAgaWYg
KCFwYWdlKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIEFTU0VSVChwYWdlKCktPnNldHRpbmdz
KCktPmZ1bGxTY3JlZW5FbmFibGVkKCkpOwotCi0gICAgaWYgKG1fZnVsbFNjcmVlblJlbmRlcmVy
KQotICAgICAgICBtX2Z1bGxTY3JlZW5SZW5kZXJlci0+dW53cmFwUmVuZGVyZXIoKTsKLQotICAg
IG1fZnVsbFNjcmVlbkVsZW1lbnQgPSBlbGVtZW50OwotCi0jaWYgVVNFKE5BVElWRV9GVUxMU0NS
RUVOX1ZJREVPKQotICAgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQtPmlzTWVkaWFFbGVtZW50KCkp
Ci0gICAgICAgIHJldHVybjsKLSNlbmRpZgotCi0gICAgLy8gQ3JlYXRlIGEgcGxhY2Vob2xkZXIg
YmxvY2sgZm9yIGEgdGhlIGZ1bGwtc2NyZWVuIGVsZW1lbnQsIHRvIGtlZXAgdGhlIHBhZ2UgZnJv
bSByZWZsb3dpbmcKLSAgICAvLyB3aGVuIHRoZSBlbGVtZW50IGlzIHJlbW92ZWQgZnJvbSB0aGUg
bm9ybWFsIGZsb3cuICBPbmx5IGRvIHRoaXMgZm9yIGEgUmVuZGVyQm94LCBhcyBvbmx5IAotICAg
IC8vIGEgYm94IHdpbGwgaGF2ZSBhIGZyYW1lUmVjdC4gIFRoZSBwbGFjZWhvbGRlciB3aWxsIGJl
IGNyZWF0ZWQgaW4gc2V0RnVsbFNjcmVlblJlbmRlcmVyKCkKLSAgICAvLyBkdXJpbmcgbGF5b3V0
LgotICAgIFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSBtX2Z1bGxTY3JlZW5FbGVtZW50LT5yZW5k
ZXJlcigpOwotICAgIGJvb2wgc2hvdWxkQ3JlYXRlUGxhY2Vob2xkZXIgPSByZW5kZXJlciAmJiBy
ZW5kZXJlci0+aXNCb3goKTsKLSAgICBpZiAoc2hvdWxkQ3JlYXRlUGxhY2Vob2xkZXIpIHsKLSAg
ICAgICAgbV9zYXZlZFBsYWNlaG9sZGVyRnJhbWVSZWN0ID0gdG9SZW5kZXJCb3gocmVuZGVyZXIp
LT5mcmFtZVJlY3QoKTsKLSAgICAgICAgbV9zYXZlZFBsYWNlaG9sZGVyUmVuZGVyU3R5bGUgPSBS
ZW5kZXJTdHlsZTo6Y2xvbmUocmVuZGVyZXItPnN0eWxlKCkpOwotICAgIH0KLQotICAgIGlmICht
X2Z1bGxTY3JlZW5FbGVtZW50ICE9IGRvY3VtZW50RWxlbWVudCgpKQotICAgICAgICBSZW5kZXJG
dWxsU2NyZWVuOjp3cmFwUmVuZGVyZXIocmVuZGVyZXIsIHJlbmRlcmVyID8gcmVuZGVyZXItPnBh
cmVudCgpIDogMCwgdGhpcyk7Ci0KLSAgICBtX2Z1bGxTY3JlZW5FbGVtZW50LT5zZXRDb250YWlu
c0Z1bGxTY3JlZW5FbGVtZW50T25BbmNlc3RvcnNDcm9zc2luZ0ZyYW1lQm91bmRhcmllcyh0cnVl
KTsKLSAgICAKLSAgICByZWNhbGNTdHlsZShGb3JjZSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6Ondl
YmtpdERpZEVudGVyRnVsbFNjcmVlbkZvckVsZW1lbnQoRWxlbWVudCopCi17Ci0gICAgaWYgKCFt
X2Z1bGxTY3JlZW5FbGVtZW50KQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAoIWF0dGFjaGVk
KCkgfHwgaW5QYWdlQ2FjaGUoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9mdWxsU2NyZWVu
RWxlbWVudC0+ZGlkQmVjb21lRnVsbHNjcmVlbkVsZW1lbnQoKTsKLQotICAgIG1fZnVsbFNjcmVl
bkNoYW5nZURlbGF5VGltZXIuc3RhcnRPbmVTaG90KDApOwotfQotCi12b2lkIERvY3VtZW50Ojp3
ZWJraXRXaWxsRXhpdEZ1bGxTY3JlZW5Gb3JFbGVtZW50KEVsZW1lbnQqKQotewotICAgIGlmICgh
bV9mdWxsU2NyZWVuRWxlbWVudCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKCFhdHRhY2hl
ZCgpIHx8IGluUGFnZUNhY2hlKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fZnVsbFNjcmVl
bkVsZW1lbnQtPndpbGxTdG9wQmVpbmdGdWxsc2NyZWVuRWxlbWVudCgpOwotfQotCi12b2lkIERv
Y3VtZW50Ojp3ZWJraXREaWRFeGl0RnVsbFNjcmVlbkZvckVsZW1lbnQoRWxlbWVudCopCi17Ci0g
ICAgaWYgKCFtX2Z1bGxTY3JlZW5FbGVtZW50KQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAo
IWF0dGFjaGVkKCkgfHwgaW5QYWdlQ2FjaGUoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9m
dWxsU2NyZWVuRWxlbWVudC0+c2V0Q29udGFpbnNGdWxsU2NyZWVuRWxlbWVudE9uQW5jZXN0b3Jz
Q3Jvc3NpbmdGcmFtZUJvdW5kYXJpZXMoZmFsc2UpOwotCi0gICAgbV9hcmVLZXlzRW5hYmxlZElu
RnVsbFNjcmVlbiA9IGZhbHNlOwotICAgIAotICAgIGlmIChtX2Z1bGxTY3JlZW5SZW5kZXJlcikK
LSAgICAgICAgbV9mdWxsU2NyZWVuUmVuZGVyZXItPnVud3JhcFJlbmRlcmVyKCk7Ci0KLSAgICBt
X2Z1bGxTY3JlZW5FbGVtZW50ID0gMDsKLSAgICBzY2hlZHVsZUZvcmNlZFN0eWxlUmVjYWxjKCk7
Ci0gICAgCi0gICAgLy8gV2hlbiB3ZWJraXRDYW5jZWxGdWxsU2NyZWVuIGlzIGNhbGxlZCwgd2Ug
Y2FsbCB3ZWJraXRFeGl0RnVsbFNjcmVlbiBvbiB0aGUgdG9wRG9jdW1lbnQoKS4gVGhhdAotICAg
IC8vIG1lYW5zIHRoYXQgdGhlIGV2ZW50cyB3aWxsIGJlIHF1ZXVlZCB0aGVyZS4gU28gaWYgd2Ug
aGF2ZSBubyBldmVudHMgaGVyZSwgc3RhcnQgdGhlIHRpbWVyIG9uCi0gICAgLy8gdGhlIGV4aXRp
bmcgZG9jdW1lbnQuCi0gICAgRG9jdW1lbnQqIGV4aXRpbmdEb2N1bWVudCA9IHRoaXM7Ci0gICAg
aWYgKG1fZnVsbFNjcmVlbkNoYW5nZUV2ZW50VGFyZ2V0UXVldWUuaXNFbXB0eSgpICYmIG1fZnVs
bFNjcmVlbkVycm9yRXZlbnRUYXJnZXRRdWV1ZS5pc0VtcHR5KCkpCi0gICAgICAgIGV4aXRpbmdE
b2N1bWVudCA9IHRvcERvY3VtZW50KCk7Ci0gICAgZXhpdGluZ0RvY3VtZW50LT5tX2Z1bGxTY3Jl
ZW5DaGFuZ2VEZWxheVRpbWVyLnN0YXJ0T25lU2hvdCgwKTsKLX0KLSAgICAKLXZvaWQgRG9jdW1l
bnQ6OnNldEZ1bGxTY3JlZW5SZW5kZXJlcihSZW5kZXJGdWxsU2NyZWVuKiByZW5kZXJlcikKLXsK
LSAgICBpZiAocmVuZGVyZXIgPT0gbV9mdWxsU2NyZWVuUmVuZGVyZXIpCi0gICAgICAgIHJldHVy
bjsKLQotICAgIGlmIChyZW5kZXJlciAmJiBtX3NhdmVkUGxhY2Vob2xkZXJSZW5kZXJTdHlsZSkg
Ci0gICAgICAgIHJlbmRlcmVyLT5jcmVhdGVQbGFjZWhvbGRlcihtX3NhdmVkUGxhY2Vob2xkZXJS
ZW5kZXJTdHlsZS5yZWxlYXNlKCksIG1fc2F2ZWRQbGFjZWhvbGRlckZyYW1lUmVjdCk7Ci0gICAg
ZWxzZSBpZiAocmVuZGVyZXIgJiYgbV9mdWxsU2NyZWVuUmVuZGVyZXIgJiYgbV9mdWxsU2NyZWVu
UmVuZGVyZXItPnBsYWNlaG9sZGVyKCkpIHsKLSAgICAgICAgUmVuZGVyQmxvY2sqIHBsYWNlaG9s
ZGVyID0gbV9mdWxsU2NyZWVuUmVuZGVyZXItPnBsYWNlaG9sZGVyKCk7Ci0gICAgICAgIHJlbmRl
cmVyLT5jcmVhdGVQbGFjZWhvbGRlcihSZW5kZXJTdHlsZTo6Y2xvbmUocGxhY2Vob2xkZXItPnN0
eWxlKCkpLCBwbGFjZWhvbGRlci0+ZnJhbWVSZWN0KCkpOwotICAgIH0KLQotICAgIGlmIChtX2Z1
bGxTY3JlZW5SZW5kZXJlcikKLSAgICAgICAgbV9mdWxsU2NyZWVuUmVuZGVyZXItPmRlc3Ryb3ko
KTsKLSAgICBBU1NFUlQoIW1fZnVsbFNjcmVlblJlbmRlcmVyKTsKLQotICAgIG1fZnVsbFNjcmVl
blJlbmRlcmVyID0gcmVuZGVyZXI7Ci0gICAgCi0gICAgLy8gVGhpcyBub3RpZmljYXRpb24gY2Fu
IGNvbWUgaW4gYWZ0ZXIgdGhlIHBhZ2UgaGFzIGJlZW4gZGVzdHJveWVkLgotICAgIGlmIChwYWdl
KCkpCi0gICAgICAgIHBhZ2UoKS0+Y2hyb21lKCktPmNsaWVudCgpLT5mdWxsU2NyZWVuUmVuZGVy
ZXJDaGFuZ2VkKG1fZnVsbFNjcmVlblJlbmRlcmVyKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6ZnVs
bFNjcmVlblJlbmRlcmVyRGVzdHJveWVkKCkKLXsKLSAgICBtX2Z1bGxTY3JlZW5SZW5kZXJlciA9
IDA7Ci0KLSAgICBpZiAocGFnZSgpKQotICAgICAgICBwYWdlKCktPmNocm9tZSgpLT5jbGllbnQo
KS0+ZnVsbFNjcmVlblJlbmRlcmVyQ2hhbmdlZCgwKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6c2V0
RnVsbFNjcmVlblJlbmRlcmVyU2l6ZShjb25zdCBJbnRTaXplJiBzaXplKQotewotICAgIEFTU0VS
VChtX2Z1bGxTY3JlZW5SZW5kZXJlcik7Ci0gICAgaWYgKCFtX2Z1bGxTY3JlZW5SZW5kZXJlcikK
LSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIGlmIChtX2Z1bGxTY3JlZW5SZW5kZXJlcikgewot
ICAgICAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IG5ld1N0eWxlID0gUmVuZGVyU3R5bGU6OmNsb25l
KG1fZnVsbFNjcmVlblJlbmRlcmVyLT5zdHlsZSgpKTsKLSAgICAgICAgbmV3U3R5bGUtPnNldFdp
ZHRoKExlbmd0aChzaXplLndpZHRoKCksIFdlYkNvcmU6OkZpeGVkKSk7Ci0gICAgICAgIG5ld1N0
eWxlLT5zZXRIZWlnaHQoTGVuZ3RoKHNpemUuaGVpZ2h0KCksIFdlYkNvcmU6OkZpeGVkKSk7Ci0g
ICAgICAgIG5ld1N0eWxlLT5zZXRUb3AoTGVuZ3RoKDAsIFdlYkNvcmU6OkZpeGVkKSk7Ci0gICAg
ICAgIG5ld1N0eWxlLT5zZXRMZWZ0KExlbmd0aCgwLCBXZWJDb3JlOjpGaXhlZCkpOwotICAgICAg
ICBtX2Z1bGxTY3JlZW5SZW5kZXJlci0+c2V0U3R5bGUobmV3U3R5bGUpOwotICAgICAgICB1cGRh
dGVMYXlvdXQoKTsKLSAgICB9Ci19Ci0gICAgCi12b2lkIERvY3VtZW50OjpzZXRGdWxsU2NyZWVu
UmVuZGVyZXJCYWNrZ3JvdW5kQ29sb3IoQ29sb3IgYmFja2dyb3VuZENvbG9yKQotewotICAgIGlm
ICghbV9mdWxsU2NyZWVuUmVuZGVyZXIpCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBSZWZQ
dHI8UmVuZGVyU3R5bGU+IG5ld1N0eWxlID0gUmVuZGVyU3R5bGU6OmNsb25lKG1fZnVsbFNjcmVl
blJlbmRlcmVyLT5zdHlsZSgpKTsKLSAgICBuZXdTdHlsZS0+c2V0QmFja2dyb3VuZENvbG9yKGJh
Y2tncm91bmRDb2xvcik7Ci0gICAgbV9mdWxsU2NyZWVuUmVuZGVyZXItPnNldFN0eWxlKG5ld1N0
eWxlKTsKLX0KLSAgICAKLXZvaWQgRG9jdW1lbnQ6OmZ1bGxTY3JlZW5DaGFuZ2VEZWxheVRpbWVy
RmlyZWQoVGltZXI8RG9jdW1lbnQ+KikKLXsKLSAgICAvLyBTaW5jZSB3ZSBkaXNwYXRjaCBldmVu
dHMgaW4gdGhpcyBmdW5jdGlvbiwgaXQncyBwb3NzaWJsZSB0aGF0IHRoZQotICAgIC8vIGRvY3Vt
ZW50IHdpbGwgYmUgZGV0YWNoZWQgYW5kIEdDJ2QuIFdlIHByb3RlY3QgaXQgaGVyZSB0byBtYWtl
IHN1cmUgd2UKLSAgICAvLyBjYW4gZmluaXNoIHRoZSBmdW5jdGlvbiBzdWNjZXNzZnVsbHkuCi0g
ICAgUmVmUHRyPERvY3VtZW50PiBwcm90ZWN0RG9jdW1lbnQodGhpcyk7Ci0gICAgRGVxdWU8UmVm
UHRyPE5vZGU+ID4gY2hhbmdlUXVldWU7Ci0gICAgbV9mdWxsU2NyZWVuQ2hhbmdlRXZlbnRUYXJn
ZXRRdWV1ZS5zd2FwKGNoYW5nZVF1ZXVlKTsKLQotICAgIHdoaWxlICghY2hhbmdlUXVldWUuaXNF
bXB0eSgpKSB7Ci0gICAgICAgIFJlZlB0cjxOb2RlPiBub2RlID0gY2hhbmdlUXVldWUudGFrZUZp
cnN0KCk7Ci0gICAgICAgIGlmICghbm9kZSkKLSAgICAgICAgICAgIG5vZGUgPSBkb2N1bWVudEVs
ZW1lbnQoKTsKLSAgICAgICAgLy8gVGhlIGRpc3BhdGNoRXZlbnQgYmVsb3cgbWF5IGhhdmUgYmxv
d24gYXdheSBvdXIgZG9jdW1lbnRFbGVtZW50LgotICAgICAgICBpZiAoIW5vZGUpCi0gICAgICAg
ICAgICBjb250aW51ZTsKLQotICAgICAgICAvLyBJZiB0aGUgZWxlbWVudCB3YXMgcmVtb3ZlZCBm
cm9tIG91ciB0cmVlLCBhbHNvIG1lc3NhZ2UgdGhlIGRvY3VtZW50RWxlbWVudC4gU2luY2Ugd2Ug
bWF5Ci0gICAgICAgIC8vIGhhdmUgYSBkb2N1bWVudCBoaWVyYXJjaHksIGNoZWNrIHRoYXQgbm9k
ZSBpc24ndCBpbiBhbm90aGVyIGRvY3VtZW50LgotICAgICAgICBpZiAoIWNvbnRhaW5zKG5vZGUu
Z2V0KCkpICYmICFub2RlLT5pbkRvY3VtZW50KCkpCi0gICAgICAgICAgICBjaGFuZ2VRdWV1ZS5h
cHBlbmQoZG9jdW1lbnRFbGVtZW50KCkpOwotICAgICAgICAKLSAgICAgICAgbm9kZS0+ZGlzcGF0
Y2hFdmVudChFdmVudDo6Y3JlYXRlKGV2ZW50TmFtZXMoKS53ZWJraXRmdWxsc2NyZWVuY2hhbmdl
RXZlbnQsIHRydWUsIGZhbHNlKSk7Ci0gICAgfQotCi0gICAgRGVxdWU8UmVmUHRyPE5vZGU+ID4g
ZXJyb3JRdWV1ZTsKLSAgICBtX2Z1bGxTY3JlZW5FcnJvckV2ZW50VGFyZ2V0UXVldWUuc3dhcChl
cnJvclF1ZXVlKTsKLSAgICAKLSAgICB3aGlsZSAoIWVycm9yUXVldWUuaXNFbXB0eSgpKSB7Ci0g
ICAgICAgIFJlZlB0cjxOb2RlPiBub2RlID0gZXJyb3JRdWV1ZS50YWtlRmlyc3QoKTsKLSAgICAg
ICAgaWYgKCFub2RlKQotICAgICAgICAgICAgbm9kZSA9IGRvY3VtZW50RWxlbWVudCgpOwotICAg
ICAgICAvLyBUaGUgZGlzcGF0Y2hFdmVudCBiZWxvdyBtYXkgaGF2ZSBibG93biBhd2F5IG91ciBk
b2N1bWVudEVsZW1lbnQuCi0gICAgICAgIGlmICghbm9kZSkKLSAgICAgICAgICAgIGNvbnRpbnVl
OwotICAgICAgICAKLSAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgd2FzIHJlbW92ZWQgZnJvbSBv
dXIgdHJlZSwgYWxzbyBtZXNzYWdlIHRoZSBkb2N1bWVudEVsZW1lbnQuIFNpbmNlIHdlIG1heQot
ICAgICAgICAvLyBoYXZlIGEgZG9jdW1lbnQgaGllcmFyY2h5LCBjaGVjayB0aGF0IG5vZGUgaXNu
J3QgaW4gYW5vdGhlciBkb2N1bWVudC4KLSAgICAgICAgaWYgKCFjb250YWlucyhub2RlLmdldCgp
KSAmJiAhbm9kZS0+aW5Eb2N1bWVudCgpKQotICAgICAgICAgICAgZXJyb3JRdWV1ZS5hcHBlbmQo
ZG9jdW1lbnRFbGVtZW50KCkpOwotICAgICAgICAKLSAgICAgICAgbm9kZS0+ZGlzcGF0Y2hFdmVu
dChFdmVudDo6Y3JlYXRlKGV2ZW50TmFtZXMoKS53ZWJraXRmdWxsc2NyZWVuZXJyb3JFdmVudCwg
dHJ1ZSwgZmFsc2UpKTsKLSAgICB9Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmZ1bGxTY3JlZW5FbGVt
ZW50UmVtb3ZlZCgpCi17Ci0gICAgbV9mdWxsU2NyZWVuRWxlbWVudC0+c2V0Q29udGFpbnNGdWxs
U2NyZWVuRWxlbWVudE9uQW5jZXN0b3JzQ3Jvc3NpbmdGcmFtZUJvdW5kYXJpZXMoZmFsc2UpOwot
ICAgIHdlYmtpdENhbmNlbEZ1bGxTY3JlZW4oKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6cmVtb3Zl
RnVsbFNjcmVlbkVsZW1lbnRPZlN1YnRyZWUoTm9kZSogbm9kZSwgYm9vbCBhbW9uZ0NoaWxkcmVu
T25seSkKLXsKLSAgICBpZiAoIW1fZnVsbFNjcmVlbkVsZW1lbnQpCisgICAgaWYgKCFub2RlLT5p
bkRvY3VtZW50KCkpCiAgICAgICAgIHJldHVybjsKICAgICAKLSAgICBib29sIGVsZW1lbnRJblN1
YnRyZWUgPSBmYWxzZTsKLSAgICBpZiAoYW1vbmdDaGlsZHJlbk9ubHkpCi0gICAgICAgIGVsZW1l
bnRJblN1YnRyZWUgPSBtX2Z1bGxTY3JlZW5FbGVtZW50LT5pc0Rlc2NlbmRhbnRPZihub2RlKTsK
LSAgICBlbHNlCi0gICAgICAgIGVsZW1lbnRJblN1YnRyZWUgPSAobV9mdWxsU2NyZWVuRWxlbWVu
dCA9PSBub2RlKSB8fCBtX2Z1bGxTY3JlZW5FbGVtZW50LT5pc0Rlc2NlbmRhbnRPZihub2RlKTsK
LSAgICAKLSAgICBpZiAoZWxlbWVudEluU3VidHJlZSkKLSAgICAgICAgZnVsbFNjcmVlbkVsZW1l
bnRSZW1vdmVkKCk7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6OmlzQW5pbWF0aW5nRnVsbFNjcmVlbigp
IGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1faXNBbmltYXRpbmdGdWxsU2NyZWVuOwotfQotCi12b2lk
IERvY3VtZW50OjpzZXRBbmltYXRpbmdGdWxsU2NyZWVuKGJvb2wgZmxhZykKLXsKLSAgICBpZiAo
bV9pc0FuaW1hdGluZ0Z1bGxTY3JlZW4gPT0gZmxhZykKLSAgICAgICAgcmV0dXJuOwotICAgIG1f
aXNBbmltYXRpbmdGdWxsU2NyZWVuID0gZmxhZzsKLQotICAgIGlmIChtX2Z1bGxTY3JlZW5FbGVt
ZW50ICYmIG1fZnVsbFNjcmVlbkVsZW1lbnQtPmlzRGVzY2VuZGFudE9mKHRoaXMpKSB7Ci0gICAg
ICAgIG1fZnVsbFNjcmVlbkVsZW1lbnQtPnNldE5lZWRzU3R5bGVSZWNhbGMoKTsKLSAgICAgICAg
c2NoZWR1bGVGb3JjZWRTdHlsZVJlY2FsYygpOwotICAgIH0KLX0KLQotdm9pZCBEb2N1bWVudDo6
Y2xlYXJGdWxsc2NyZWVuRWxlbWVudFN0YWNrKCkKLXsKLSAgICBtX2Z1bGxTY3JlZW5FbGVtZW50
U3RhY2suY2xlYXIoKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6cG9wRnVsbHNjcmVlbkVsZW1lbnRT
dGFjaygpCi17Ci0gICAgaWYgKG1fZnVsbFNjcmVlbkVsZW1lbnRTdGFjay5pc0VtcHR5KCkpCi0g
ICAgICAgIHJldHVybjsKLQotICAgIG1fZnVsbFNjcmVlbkVsZW1lbnRTdGFjay5yZW1vdmVGaXJz
dCgpOwotfQotCi12b2lkIERvY3VtZW50OjpwdXNoRnVsbHNjcmVlbkVsZW1lbnRTdGFjayhFbGVt
ZW50KiBlbGVtZW50KQotewotICAgIG1fZnVsbFNjcmVlbkVsZW1lbnRTdGFjay5wcmVwZW5kKGVs
ZW1lbnQpOwotfQotCi12b2lkIERvY3VtZW50OjphZGREb2N1bWVudFRvRnVsbFNjcmVlbkNoYW5n
ZUV2ZW50UXVldWUoRG9jdW1lbnQqIGRvYykKLXsKLSAgICBBU1NFUlQoZG9jKTsKLSAgICBOb2Rl
KiB0YXJnZXQgPSBkb2MtPndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50KCk7Ci0gICAgaWYgKCF0YXJn
ZXQpCi0gICAgICAgIHRhcmdldCA9IGRvYy0+d2Via2l0Q3VycmVudEZ1bGxTY3JlZW5FbGVtZW50
KCk7Ci0gICAgaWYgKCF0YXJnZXQpCi0gICAgICAgIHRhcmdldCA9IGRvYzsKLSAgICBtX2Z1bGxT
Y3JlZW5DaGFuZ2VFdmVudFRhcmdldFF1ZXVlLmFwcGVuZCh0YXJnZXQpOwotfQotI2VuZGlmCi0K
LSNpZiBFTkFCTEUoUE9JTlRFUl9MT0NLKQotdm9pZCBEb2N1bWVudDo6d2Via2l0RXhpdFBvaW50
ZXJMb2NrKCkKLXsKLSAgICBpZiAoIXBhZ2UoKSkKKyAgICAvLyBVbnRpbCB0aGUgPGJvZHk+IGV4
aXN0cywgd2UgaGF2ZSBubyBjaG9pY2UgYnV0IHRvIGNvbXBhcmUgZG9jdW1lbnQgcG9zaXRpb25z
LAorICAgIC8vIHNpbmNlIHN0eWxlcyBvdXRzaWRlIG9mIHRoZSBib2R5IGFuZCBoZWFkIGNvbnRp
bnVlIHRvIGJlIHNodW50ZWQgaW50byB0aGUgaGVhZAorICAgIC8vIChhbmQgdGh1cyBjYW4gc2hp
ZnQgdG8gZW5kIHVwIGJlZm9yZSBkeW5hbWljYWxseSBhZGRlZCBET00gY29udGVudCB0aGF0IGlz
IGFsc28KKyAgICAvLyBvdXRzaWRlIHRoZSBib2R5KS4KKyAgICBpZiAoKGNyZWF0ZWRCeVBhcnNl
ciAmJiBtX2RvY3VtZW50LT5ib2R5KCkpIHx8IG1fc3R5bGVTaGVldENhbmRpZGF0ZU5vZGVzLmlz
RW1wdHkoKSkgeworICAgICAgICBtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcy5hZGQobm9kZSk7
CiAgICAgICAgIHJldHVybjsKLSAgICBpZiAoRWxlbWVudCogdGFyZ2V0ID0gcGFnZSgpLT5wb2lu
dGVyTG9ja0NvbnRyb2xsZXIoKS0+ZWxlbWVudCgpKSB7Ci0gICAgICAgIGlmICh0YXJnZXQtPmRv
Y3VtZW50KCkgIT0gdGhpcykKLSAgICAgICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcGFnZSgp
LT5wb2ludGVyTG9ja0NvbnRyb2xsZXIoKS0+cmVxdWVzdFBvaW50ZXJVbmxvY2soKTsKLX0KLQot
RWxlbWVudCogRG9jdW1lbnQ6OndlYmtpdFBvaW50ZXJMb2NrRWxlbWVudCgpIGNvbnN0Ci17Ci0g
ICAgaWYgKCFwYWdlKCkgfHwgcGFnZSgpLT5wb2ludGVyTG9ja0NvbnRyb2xsZXIoKS0+bG9ja1Bl
bmRpbmcoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKEVsZW1lbnQqIGVsZW1lbnQgPSBw
YWdlKCktPnBvaW50ZXJMb2NrQ29udHJvbGxlcigpLT5lbGVtZW50KCkpIHsKLSAgICAgICAgaWYg
KGVsZW1lbnQtPmRvY3VtZW50KCkgPT0gdGhpcykKLSAgICAgICAgICAgIHJldHVybiBlbGVtZW50
OwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLSNlbmRpZgotCi12b2lkIERvY3VtZW50OjpkZWNy
ZW1lbnRMb2FkRXZlbnREZWxheUNvdW50KCkKLXsKLSAgICBBU1NFUlQobV9sb2FkRXZlbnREZWxh
eUNvdW50KTsKLSAgICAtLW1fbG9hZEV2ZW50RGVsYXlDb3VudDsKLQotICAgIGlmIChmcmFtZSgp
ICYmICFtX2xvYWRFdmVudERlbGF5Q291bnQgJiYgIW1fbG9hZEV2ZW50RGVsYXlUaW1lci5pc0Fj
dGl2ZSgpKQotICAgICAgICBtX2xvYWRFdmVudERlbGF5VGltZXIuc3RhcnRPbmVTaG90KDApOwot
fQotCi12b2lkIERvY3VtZW50Ojpsb2FkRXZlbnREZWxheVRpbWVyRmlyZWQoVGltZXI8RG9jdW1l
bnQ+KikKLXsKLSAgICBpZiAoZnJhbWUoKSkKLSAgICAgICAgZnJhbWUoKS0+bG9hZGVyKCktPmNo
ZWNrQ29tcGxldGVkKCk7Ci19Ci0KLSNpZiBFTkFCTEUoUkVRVUVTVF9BTklNQVRJT05fRlJBTUUp
Ci1pbnQgRG9jdW1lbnQ6OndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZShQYXNzUmVmUHRyPFJl
cXVlc3RBbmltYXRpb25GcmFtZUNhbGxiYWNrPiBjYWxsYmFjaykKLXsKLSAgICBpZiAoIW1fc2Ny
aXB0ZWRBbmltYXRpb25Db250cm9sbGVyKSB7Ci0jaWYgVVNFKFJFUVVFU1RfQU5JTUFUSU9OX0ZS
QU1FX0RJU1BMQVlfTU9OSVRPUikKLSAgICAgICAgbV9zY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xs
ZXIgPSBTY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXI6OmNyZWF0ZSh0aGlzLCBwYWdlKCkgPyBw
YWdlKCktPmRpc3BsYXlJRCgpIDogMCk7Ci0jZWxzZQotICAgICAgICBtX3NjcmlwdGVkQW5pbWF0
aW9uQ29udHJvbGxlciA9IFNjcmlwdGVkQW5pbWF0aW9uQ29udHJvbGxlcjo6Y3JlYXRlKHRoaXMs
IDApOwotI2VuZGlmCi0gICAgICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB0aGUgUGFnZSBtYXkg
aGF2ZSBzdXNwZW5kZWQgc2NyaXB0ZWQgYW5pbWF0aW9ucyBiZWZvcmUKLSAgICAgICAgLy8gd2Ug
d2VyZSBjcmVhdGVkLiBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGRvbid0IHN0YXJ0IHVw
IHRoZSBhbmltYXRpb24KLSAgICAgICAgLy8gY29udHJvbGxlciBvbiBhIGJhY2tncm91bmQgdGFi
LCBmb3IgZXhhbXBsZS4KLSAgICAgICAgaWYgKCFwYWdlKCkgfHwgcGFnZSgpLT5zY3JpcHRlZEFu
aW1hdGlvbnNTdXNwZW5kZWQoKSkKLSAgICAgICAgICAgIG1fc2NyaXB0ZWRBbmltYXRpb25Db250
cm9sbGVyLT5zdXNwZW5kKCk7CiAgICAgfQogCi0gICAgcmV0dXJuIG1fc2NyaXB0ZWRBbmltYXRp
b25Db250cm9sbGVyLT5yZWdpc3RlckNhbGxiYWNrKGNhbGxiYWNrKTsKKyAgICAvLyBEZXRlcm1p
bmUgYW4gYXBwcm9wcmlhdGUgaW5zZXJ0aW9uIHBvaW50LgorICAgIFN0eWxlU2hlZXRDYW5kaWRh
dGVMaXN0SGFzaFNldDo6aXRlcmF0b3IgYmVnaW4gPSBtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rl
cy5iZWdpbigpOworICAgIFN0eWxlU2hlZXRDYW5kaWRhdGVMaXN0SGFzaFNldDo6aXRlcmF0b3Ig
ZW5kID0gbV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMuZW5kKCk7CisgICAgU3R5bGVTaGVldENh
bmRpZGF0ZUxpc3RIYXNoU2V0OjppdGVyYXRvciBpdCA9IGVuZDsKKyAgICBOb2RlKiBmb2xsb3dp
bmdOb2RlID0gMDsKKyAgICBkbyB7CisgICAgICAgIC0taXQ7CisgICAgICAgIE5vZGUqIG4gPSAq
aXQ7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IHBvc2l0aW9uID0gbi0+Y29tcGFyZURvY3VtZW50
UG9zaXRpb24obm9kZSk7CisgICAgICAgIGlmIChwb3NpdGlvbiA9PSBOb2RlOjpET0NVTUVOVF9Q
T1NJVElPTl9GT0xMT1dJTkcpIHsKKyAgICAgICAgICAgIG1fc3R5bGVTaGVldENhbmRpZGF0ZU5v
ZGVzLmluc2VydEJlZm9yZShmb2xsb3dpbmdOb2RlLCBub2RlKTsKKyAgICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgfQorICAgICAgICBmb2xsb3dpbmdOb2RlID0gbjsKKyAgICB9IHdoaWxlIChp
dCAhPSBiZWdpbik7CisgICAgCisgICAgbV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMuaW5zZXJ0
QmVmb3JlKGZvbGxvd2luZ05vZGUsIG5vZGUpOwogfQogCi12b2lkIERvY3VtZW50Ojp3ZWJraXRD
YW5jZWxBbmltYXRpb25GcmFtZShpbnQgaWQpCit2b2lkIERvY3VtZW50U3R5bGVTaGVldENvbGxl
Y3Rpb246OnJlbW92ZVN0eWxlU2hlZXRDYW5kaWRhdGVOb2RlKE5vZGUqIG5vZGUpCiB7Ci0gICAg
aWYgKCFtX3NjcmlwdGVkQW5pbWF0aW9uQ29udHJvbGxlcikKLSAgICAgICAgcmV0dXJuOwotICAg
IG1fc2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyLT5jYW5jZWxDYWxsYmFjayhpZCk7CisgICAg
bV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMucmVtb3ZlKG5vZGUpOwogfQogCi12b2lkIERvY3Vt
ZW50OjpzZXJ2aWNlU2NyaXB0ZWRBbmltYXRpb25zKERPTVRpbWVTdGFtcCB0aW1lKQordm9pZCBE
b2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjpjb2xsZWN0QWN0aXZlU3R5bGVTaGVldHMoVmVj
dG9yPFJlZlB0cjxTdHlsZVNoZWV0PiA+JiBzaGVldHMpCiB7Ci0gICAgaWYgKCFtX3NjcmlwdGVk
QW5pbWF0aW9uQ29udHJvbGxlcikKKyAgICBpZiAobV9kb2N1bWVudC0+c2V0dGluZ3MoKSAmJiAh
bV9kb2N1bWVudC0+c2V0dGluZ3MoKS0+YXV0aG9yQW5kVXNlclN0eWxlc0VuYWJsZWQoKSkKICAg
ICAgICAgcmV0dXJuOwotICAgIG1fc2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyLT5zZXJ2aWNl
U2NyaXB0ZWRBbmltYXRpb25zKHRpbWUpOwotfQotI2VuZGlmCiAKLSNpZiBFTkFCTEUoVE9VQ0hf
RVZFTlRTKQotUGFzc1JlZlB0cjxUb3VjaD4gRG9jdW1lbnQ6OmNyZWF0ZVRvdWNoKERPTVdpbmRv
dyogd2luZG93LCBFdmVudFRhcmdldCogdGFyZ2V0LCBpbnQgaWRlbnRpZmllciwgaW50IHBhZ2VY
LCBpbnQgcGFnZVksIGludCBzY3JlZW5YLCBpbnQgc2NyZWVuWSwgaW50IHJhZGl1c1gsIGludCBy
YWRpdXNZLCBmbG9hdCByb3RhdGlvbkFuZ2xlLCBmbG9hdCBmb3JjZSwgRXhjZXB0aW9uQ29kZSYp
IGNvbnN0Ci17Ci0gICAgLy8gRklYTUU6IEl0J3Mgbm90IGNsZWFyIGZyb20gdGhlIGRvY3VtZW50
YXRpb24gYXQKLSAgICAvLyBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9saWJyYXJ5L3NhZmFy
aS8jZG9jdW1lbnRhdGlvbi9Vc2VyRXhwZXJpZW5jZS9SZWZlcmVuY2UvRG9jdW1lbnRBZGRpdGlv
bnNSZWZlcmVuY2UvRG9jdW1lbnRBZGRpdGlvbnMvRG9jdW1lbnRBZGRpdGlvbnMuaHRtbAotICAg
IC8vIHdoZW4gdGhpcyBtZXRob2Qgc2hvdWxkIHRocm93IGFuZCBub3IgaXMgaXQgYnkgaW5zcGVj
dGlvbiBvZiBpT1MgYmVoYXZpb3IuIEl0IHdvdWxkIGJlIG5pY2UgdG8gdmVyaWZ5IGFueSBjYXNl
cyB3aGVyZSBpdCB0aHJvd3MgdW5kZXIgaU9TCi0gICAgLy8gYW5kIGltcGxlbWVudCB0aGVtIGhl
cmUuIFNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDc4MTkKLSAg
ICBGcmFtZSogZnJhbWUgPSB3aW5kb3cgPyB3aW5kb3ctPmZyYW1lKCkgOiB0aGlzLT5mcmFtZSgp
OwotICAgIHJldHVybiBUb3VjaDo6Y3JlYXRlKGZyYW1lLCB0YXJnZXQsIGlkZW50aWZpZXIsIHNj
cmVlblgsIHNjcmVlblksIHBhZ2VYLCBwYWdlWSwgcmFkaXVzWCwgcmFkaXVzWSwgcm90YXRpb25B
bmdsZSwgZm9yY2UpOwotfQorICAgIFN0eWxlU2hlZXRDYW5kaWRhdGVMaXN0SGFzaFNldDo6aXRl
cmF0b3IgYmVnaW4gPSBtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcy5iZWdpbigpOworICAgIFN0
eWxlU2hlZXRDYW5kaWRhdGVMaXN0SGFzaFNldDo6aXRlcmF0b3IgZW5kID0gbV9zdHlsZVNoZWV0
Q2FuZGlkYXRlTm9kZXMuZW5kKCk7CisgICAgZm9yIChTdHlsZVNoZWV0Q2FuZGlkYXRlTGlzdEhh
c2hTZXQ6Oml0ZXJhdG9yIGl0ID0gYmVnaW47IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBO
b2RlKiBuID0gKml0OworICAgICAgICBTdHlsZVNoZWV0KiBzaGVldCA9IDA7CisgICAgICAgIGlm
IChuLT5ub2RlVHlwZSgpID09IE5vZGU6OlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSkgewor
ICAgICAgICAgICAgLy8gUHJvY2Vzc2luZyBpbnN0cnVjdGlvbiAoWE1MIGRvY3VtZW50cyBvbmx5
KS4KKyAgICAgICAgICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgbGlua2luZyB0byBlbWJlZGRlZCBD
U1Mgc3R5bGVzaGVldHMsIHNlZSA8aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTQ5MjgxPiBmb3IgZGlzY3Vzc2lvbi4KKyAgICAgICAgICAgIFByb2Nlc3NpbmdJbnN0cnVj
dGlvbiogcGkgPSBzdGF0aWNfY2FzdDxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24qPihuKTsKKyAgICAg
ICAgICAgIHNoZWV0ID0gcGktPnNoZWV0KCk7CisjaWYgRU5BQkxFKFhTTFQpCisgICAgICAgICAg
ICAvLyBEb24ndCBhcHBseSBYU0wgdHJhbnNmb3JtcyB0byBhbHJlYWR5IHRyYW5zZm9ybWVkIGRv
Y3VtZW50cyAtLSA8cmRhcjovL3Byb2JsZW0vNDEzMjgwNj4KKyAgICAgICAgICAgIGlmIChwaS0+
aXNYU0woKSAmJiAhbV9kb2N1bWVudC0+dHJhbnNmb3JtU291cmNlRG9jdW1lbnQoKSkgeworICAg
ICAgICAgICAgICAgIC8vIERvbid0IGFwcGx5IFhTTCB0cmFuc2Zvcm1zIHVudGlsIGxvYWRpbmcg
aXMgZmluaXNoZWQuCisgICAgICAgICAgICAgICAgaWYgKCFtX2RvY3VtZW50LT5wYXJzaW5nKCkp
CisgICAgICAgICAgICAgICAgICAgIG1fZG9jdW1lbnQtPmFwcGx5WFNMVHJhbnNmb3JtKHBpKTsK
KyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CiAjZW5kaWYKKyAgICAgICAg
fSBlbHNlIGlmICgobi0+aXNIVE1MRWxlbWVudCgpICYmIChuLT5oYXNUYWdOYW1lKGxpbmtUYWcp
IHx8IG4tPmhhc1RhZ05hbWUoc3R5bGVUYWcpKSkKKyNpZiBFTkFCTEUoU1ZHKQorICAgICAgICAg
ICAgICAgICAgIHx8ICAobi0+aXNTVkdFbGVtZW50KCkgJiYgbi0+aGFzVGFnTmFtZShTVkdOYW1l
czo6c3R5bGVUYWcpKQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAg
ICBFbGVtZW50KiBlID0gc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG4pOworICAgICAgICAgICAgQXRv
bWljU3RyaW5nIHRpdGxlID0gZS0+Z2V0QXR0cmlidXRlKHRpdGxlQXR0cik7CisgICAgICAgICAg
ICBib29sIGVuYWJsZWRWaWFTY3JpcHQgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChlLT5oYXNM
b2NhbE5hbWUobGlua1RhZykpIHsKKyAgICAgICAgICAgICAgICAvLyA8TElOSz4gZWxlbWVudAor
ICAgICAgICAgICAgICAgIEhUTUxMaW5rRWxlbWVudCogbGlua0VsZW1lbnQgPSBzdGF0aWNfY2Fz
dDxIVE1MTGlua0VsZW1lbnQqPihuKTsKKyAgICAgICAgICAgICAgICBpZiAobGlua0VsZW1lbnQt
PmlzRGlzYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAg
ICAgICAgZW5hYmxlZFZpYVNjcmlwdCA9IGxpbmtFbGVtZW50LT5pc0VuYWJsZWRWaWFTY3JpcHQo
KTsKKyAgICAgICAgICAgICAgICBpZiAobGlua0VsZW1lbnQtPnN0eWxlU2hlZXRJc0xvYWRpbmco
KSkgeworICAgICAgICAgICAgICAgICAgICAvLyBpdCBpcyBsb2FkaW5nIGJ1dCB3ZSBzaG91bGQg
c3RpbGwgZGVjaWRlIHdoaWNoIHN0eWxlIHNoZWV0IHNldCB0byB1c2UKKyAgICAgICAgICAgICAg
ICAgICAgaWYgKCFlbmFibGVkVmlhU2NyaXB0ICYmICF0aXRsZS5pc0VtcHR5KCkgJiYgbV9wcmVm
ZXJyZWRTdHlsZXNoZWV0U2V0TmFtZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGNvbnN0IEF0b21pY1N0cmluZyYgcmVsID0gZS0+Z2V0QXR0cmlidXRlKHJlbEF0dHIpOwor
ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWwuY29udGFpbnMoImFsdGVybmF0ZSIpKSB7
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wcmVmZXJyZWRTdHlsZXNoZWV0U2V0TmFt
ZSA9IHRpdGxlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc2VsZWN0ZWRTdHlsZXNo
ZWV0U2V0TmFtZSA9IHRpdGxlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWxpbmtFbGVtZW50LT5zaGVldCgpKQorICAgICAg
ICAgICAgICAgICAgICB0aXRsZSA9IG51bGxBdG9tOworICAgICAgICAgICAgfQorICAgICAgICAg
ICAgLy8gR2V0IHRoZSBjdXJyZW50IHByZWZlcnJlZCBzdHlsZXNldC4gVGhpcyBpcyB0aGUKKyAg
ICAgICAgICAgIC8vIHNldCBvZiBzaGVldHMgdGhhdCB3aWxsIGJlIGVuYWJsZWQuCisjaWYgRU5B
QkxFKFNWRykKKyAgICAgICAgICAgIGlmIChuLT5pc1NWR0VsZW1lbnQoKSAmJiBuLT5oYXNUYWdO
YW1lKFNWR05hbWVzOjpzdHlsZVRhZykpCisgICAgICAgICAgICAgICAgc2hlZXQgPSBzdGF0aWNf
Y2FzdDxTVkdTdHlsZUVsZW1lbnQqPihuKS0+c2hlZXQoKTsKKyAgICAgICAgICAgIGVsc2UKKyNl
bmRpZgorICAgICAgICAgICAgaWYgKGUtPmhhc0xvY2FsTmFtZShsaW5rVGFnKSkKKyAgICAgICAg
ICAgICAgICBzaGVldCA9IHN0YXRpY19jYXN0PEhUTUxMaW5rRWxlbWVudCo+KG4pLT5zaGVldCgp
OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIC8vIDxTVFlMRT4gZWxlbWVudAor
ICAgICAgICAgICAgICAgIHNoZWV0ID0gc3RhdGljX2Nhc3Q8SFRNTFN0eWxlRWxlbWVudCo+KG4p
LT5zaGVldCgpOworICAgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoaXMgc2hlZXQgYmVs
b25ncyB0byBhIHN0eWxlc2V0CisgICAgICAgICAgICAvLyAodGh1cyBtYWtpbmcgaXQgUFJFRkVS
UkVEIG9yIEFMVEVSTkFURSByYXRoZXIgdGhhbgorICAgICAgICAgICAgLy8gUEVSU0lTVEVOVCku
CisgICAgICAgICAgICBBdG9taWNTdHJpbmcgcmVsID0gZS0+Z2V0QXR0cmlidXRlKHJlbEF0dHIp
OworICAgICAgICAgICAgaWYgKCFlbmFibGVkVmlhU2NyaXB0ICYmICF0aXRsZS5pc0VtcHR5KCkp
IHsKKyAgICAgICAgICAgICAgICAvLyBZZXMsIHdlIGhhdmUgYSB0aXRsZS4KKyAgICAgICAgICAg
ICAgICBpZiAobV9wcmVmZXJyZWRTdHlsZXNoZWV0U2V0TmFtZS5pc0VtcHR5KCkpIHsKKyAgICAg
ICAgICAgICAgICAgICAgLy8gTm8gcHJlZmVycmVkIHNldCBoYXMgYmVlbiBlc3RhYmxpc2hlZC4g
SWYKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgYXJlIE5PVCBhbiBhbHRlcm5hdGUgc2hlZXQs
IHRoZW4gZXN0YWJsaXNoCisgICAgICAgICAgICAgICAgICAgIC8vIHVzIGFzIHRoZSBwcmVmZXJy
ZWQgc2V0LiBPdGhlcndpc2UsIGp1c3QgaWdub3JlCisgICAgICAgICAgICAgICAgICAgIC8vIHRo
aXMgc2hlZXQuCisgICAgICAgICAgICAgICAgICAgIGlmIChlLT5oYXNMb2NhbE5hbWUoc3R5bGVU
YWcpIHx8ICFyZWwuY29udGFpbnMoImFsdGVybmF0ZSIpKQorICAgICAgICAgICAgICAgICAgICAg
ICAgbV9wcmVmZXJyZWRTdHlsZXNoZWV0U2V0TmFtZSA9IG1fc2VsZWN0ZWRTdHlsZXNoZWV0U2V0
TmFtZSA9IHRpdGxlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodGl0
bGUgIT0gbV9wcmVmZXJyZWRTdHlsZXNoZWV0U2V0TmFtZSkKKyAgICAgICAgICAgICAgICAgICAg
c2hlZXQgPSAwOworICAgICAgICAgICAgfQogCi1zdGF0aWMgdm9pZCB3aGVlbEV2ZW50SGFuZGxl
ckNvdW50Q2hhbmdlZChEb2N1bWVudCogZG9jdW1lbnQpCi17Ci0gICAgUGFnZSogcGFnZSA9IGRv
Y3VtZW50LT5wYWdlKCk7Ci0gICAgaWYgKCFwYWdlKQotICAgICAgICByZXR1cm47Ci0KLSAgICBT
Y3JvbGxpbmdDb29yZGluYXRvciogc2Nyb2xsaW5nQ29vcmRpbmF0b3IgPSBwYWdlLT5zY3JvbGxp
bmdDb29yZGluYXRvcigpOwotICAgIGlmICghc2Nyb2xsaW5nQ29vcmRpbmF0b3IpCi0gICAgICAg
IHJldHVybjsKLQotICAgIEZyYW1lVmlldyogZnJhbWVWaWV3ID0gZG9jdW1lbnQtPnZpZXcoKTsK
LSAgICBpZiAoIWZyYW1lVmlldykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgc2Nyb2xsaW5nQ29v
cmRpbmF0b3ItPmZyYW1lVmlld1doZWVsRXZlbnRIYW5kbGVyQ291bnRDaGFuZ2VkKGZyYW1lVmll
dyk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmRpZEFkZFdoZWVsRXZlbnRIYW5kbGVyKCkKLXsKLSAg
ICArK21fd2hlZWxFdmVudEhhbmRsZXJDb3VudDsKLSAgICBGcmFtZSogbWFpbkZyYW1lID0gcGFn
ZSgpID8gcGFnZSgpLT5tYWluRnJhbWUoKSA6IDA7Ci0gICAgaWYgKG1haW5GcmFtZSkKLSAgICAg
ICAgbWFpbkZyYW1lLT5ub3RpZnlDaHJvbWVDbGllbnRXaGVlbEV2ZW50SGFuZGxlckNvdW50Q2hh
bmdlZCgpOwotCi0gICAgd2hlZWxFdmVudEhhbmRsZXJDb3VudENoYW5nZWQodGhpcyk7CisgICAg
ICAgICAgICBpZiAocmVsLmNvbnRhaW5zKCJhbHRlcm5hdGUiKSAmJiB0aXRsZS5pc0VtcHR5KCkp
CisgICAgICAgICAgICAgICAgc2hlZXQgPSAwOworICAgICAgICB9CisgICAgICAgIGlmIChzaGVl
dCkKKyAgICAgICAgICAgIHNoZWV0cy5hcHBlbmQoc2hlZXQpOworICAgIH0KIH0KIAotdm9pZCBE
b2N1bWVudDo6ZGlkUmVtb3ZlV2hlZWxFdmVudEhhbmRsZXIoKQorYm9vbCBEb2N1bWVudFN0eWxl
U2hlZXRDb2xsZWN0aW9uOjp0ZXN0QWRkZWRTdHlsZVNoZWV0UmVxdWlyZXNTdHlsZVJlY2FsYyhT
dHlsZVNoZWV0Q29udGVudHMqIHN0eWxlc2hlZXQpCiB7Ci0gICAgQVNTRVJUKG1fd2hlZWxFdmVu
dEhhbmRsZXJDb3VudCA+IDApOwotICAgIC0tbV93aGVlbEV2ZW50SGFuZGxlckNvdW50OwotICAg
IEZyYW1lKiBtYWluRnJhbWUgPSBwYWdlKCkgPyBwYWdlKCktPm1haW5GcmFtZSgpIDogMDsKLSAg
ICBpZiAobWFpbkZyYW1lKQotICAgICAgICBtYWluRnJhbWUtPm5vdGlmeUNocm9tZUNsaWVudFdo
ZWVsRXZlbnRIYW5kbGVyQ291bnRDaGFuZ2VkKCk7Ci0KLSAgICB3aGVlbEV2ZW50SGFuZGxlckNv
dW50Q2hhbmdlZCh0aGlzKTsKKyAgICAvLyBTZWUgaWYgYWxsIHJ1bGVzIG9uIHRoZSBzaGVldCBh
cmUgc2NvcGVkIHRvIHNvbWUgc3BlY2lmaWMgaWRzIG9yIGNsYXNzZXMuCisgICAgLy8gVGhlbiB0
ZXN0IGlmIHdlIGFjdHVhbGx5IGhhdmUgYW55IG9mIHRob3NlIGluIHRoZSB0cmVlIGF0IHRoZSBt
b21lbnQuCisgICAgSGFzaFNldDxBdG9taWNTdHJpbmdJbXBsKj4gaWRTY29wZXM7IAorICAgIEhh
c2hTZXQ8QXRvbWljU3RyaW5nSW1wbCo+IGNsYXNzU2NvcGVzOworICAgIGlmICghU3R5bGVSZXNv
bHZlcjo6ZGV0ZXJtaW5lU3R5bGVzaGVldFNlbGVjdG9yU2NvcGVzKHN0eWxlc2hlZXQsIGlkU2Nv
cGVzLCBjbGFzc1Njb3BlcykpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIC8vIEludmFsaWRh
dGUgdGhlIHN1YnRyZWVzIHRoYXQgbWF0Y2ggdGhlIHNjb3Blcy4KKyAgICBOb2RlKiBub2RlID0g
bV9kb2N1bWVudC0+Zmlyc3RDaGlsZCgpOworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIGlm
ICghbm9kZS0+aXNTdHlsZWRFbGVtZW50KCkpIHsKKyAgICAgICAgICAgIG5vZGUgPSBub2RlLT50
cmF2ZXJzZU5leHROb2RlKCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAg
ICAgICBTdHlsZWRFbGVtZW50KiBlbGVtZW50ID0gc3RhdGljX2Nhc3Q8U3R5bGVkRWxlbWVudCo+
KG5vZGUpOworICAgICAgICBpZiAoU2VsZWN0b3JDaGVja2VyOjplbGVtZW50TWF0Y2hlc1NlbGVj
dG9yU2NvcGVzKGVsZW1lbnQsIGlkU2NvcGVzLCBjbGFzc1Njb3BlcykpIHsKKyAgICAgICAgICAg
IGVsZW1lbnQtPnNldE5lZWRzU3R5bGVSZWNhbGMoKTsKKyAgICAgICAgICAgIC8vIFRoZSB3aG9s
ZSBzdWJ0cmVlIGlzIG5vdyBpbnZhbGlkYXRlZCwgd2UgY2FuIHNraXAgdG8gdGhlIG5leHQgc2li
bGluZy4KKyAgICAgICAgICAgIG5vZGUgPSBub2RlLT50cmF2ZXJzZU5leHRTaWJsaW5nKCk7Cisg
ICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBub2RlID0gbm9kZS0+dHJh
dmVyc2VOZXh0Tm9kZSgpOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXZvaWQgRG9j
dW1lbnQ6OmRpZEFkZFRvdWNoRXZlbnRIYW5kbGVyKCkKK3ZvaWQgRG9jdW1lbnRTdHlsZVNoZWV0
Q29sbGVjdGlvbjo6YW5hbHl6ZVN0eWxlU2hlZXRDaGFuZ2UoVXBkYXRlRmxhZyB1cGRhdGVGbGFn
LCBjb25zdCBWZWN0b3I8UmVmUHRyPFN0eWxlU2hlZXQ+ID4mIG5ld1N0eWxlc2hlZXRzLCBib29s
JiByZXF1aXJlc1N0eWxlUmVzb2x2ZXJSZXNldCwgYm9vbCYgcmVxdWlyZXNGdWxsU3R5bGVSZWNh
bGMpCiB7Ci0jaWYgRU5BQkxFKFRPVUNIX0VWRU5UUykKLSAgICArK21fdG91Y2hFdmVudEhhbmRs
ZXJDb3VudDsKLSAgICBpZiAobV90b3VjaEV2ZW50SGFuZGxlckNvdW50ID4gMSkKKyAgICByZXF1
aXJlc1N0eWxlUmVzb2x2ZXJSZXNldCA9IHRydWU7CisgICAgcmVxdWlyZXNGdWxsU3R5bGVSZWNh
bGMgPSB0cnVlOworICAgIAorICAgIC8vIFN0eWxlc2hlZXRzIG9mIDxzdHlsZT4gZWxlbWVudHMg
dGhhdCBAaW1wb3J0IHN0eWxlc2hlZXRzIGFyZSBhY3RpdmUgYnV0IGxvYWRpbmcuIFdlIG5lZWQg
dG8gdHJpZ2dlciBhIGZ1bGwgcmVjYWxjIHdoZW4gc3VjaCBsb2FkcyBhcmUgZG9uZS4KKyAgICBi
b29sIGhhc0FjdGl2ZUxvYWRpbmdTdHlsZXNoZWV0ID0gZmFsc2U7CisgICAgdW5zaWduZWQgbmV3
U3R5bGVzaGVldENvdW50ID0gbmV3U3R5bGVzaGVldHMuc2l6ZSgpOworICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBuZXdTdHlsZXNoZWV0Q291bnQ7ICsraSkgeworICAgICAgICBpZiAobmV3
U3R5bGVzaGVldHNbaV0tPmlzTG9hZGluZygpKQorICAgICAgICAgICAgaGFzQWN0aXZlTG9hZGlu
Z1N0eWxlc2hlZXQgPSB0cnVlOworICAgIH0KKyAgICBpZiAobV9oYWRBY3RpdmVMb2FkaW5nU3R5
bGVzaGVldCAmJiAhaGFzQWN0aXZlTG9hZGluZ1N0eWxlc2hlZXQpIHsKKyAgICAgICAgbV9oYWRB
Y3RpdmVMb2FkaW5nU3R5bGVzaGVldCA9IGZhbHNlOwogICAgICAgICByZXR1cm47Ci0gICAgaWYg
KFBhZ2UqIHBhZ2UgPSB0aGlzLT5wYWdlKCkpCi0gICAgICAgIHBhZ2UtPmNocm9tZSgpLT5jbGll
bnQoKS0+bmVlZFRvdWNoRXZlbnRzKHRydWUpOwotI2VuZGlmCi19CisgICAgfQorICAgIG1faGFk
QWN0aXZlTG9hZGluZ1N0eWxlc2hlZXQgPSBoYXNBY3RpdmVMb2FkaW5nU3R5bGVzaGVldDsKIAot
dm9pZCBEb2N1bWVudDo6ZGlkUmVtb3ZlVG91Y2hFdmVudEhhbmRsZXIoKQotewotI2lmIEVOQUJM
RShUT1VDSF9FVkVOVFMpCi0gICAgQVNTRVJUKG1fdG91Y2hFdmVudEhhbmRsZXJDb3VudCk7Ci0g
ICAgLS1tX3RvdWNoRXZlbnRIYW5kbGVyQ291bnQ7Ci0gICAgaWYgKG1fdG91Y2hFdmVudEhhbmRs
ZXJDb3VudCkKKyAgICBpZiAodXBkYXRlRmxhZyAhPSBPcHRpbWl6ZWRVcGRhdGUpCisgICAgICAg
IHJldHVybjsKKyAgICBpZiAoIW1fZG9jdW1lbnQtPnN0eWxlUmVzb2x2ZXJJZkV4aXN0cygpKQog
ICAgICAgICByZXR1cm47CiAKLSAgICBQYWdlKiBwYWdlID0gdGhpcy0+cGFnZSgpOwotICAgIGlm
ICghcGFnZSkKKyAgICAvLyBTZWUgaWYgd2UgYXJlIGp1c3QgYWRkaW5nIHN0eWxlc2hlZXRzLgor
ICAgIHVuc2lnbmVkIG9sZFN0eWxlc2hlZXRDb3VudCA9IG1fYXV0aG9yU3R5bGVTaGVldHMtPmxl
bmd0aCgpOworICAgIGlmIChuZXdTdHlsZXNoZWV0Q291bnQgPCBvbGRTdHlsZXNoZWV0Q291bnQp
CiAgICAgICAgIHJldHVybjsKLSAgICBmb3IgKGNvbnN0IEZyYW1lKiBmcmFtZSA9IHBhZ2UtPm1h
aW5GcmFtZSgpOyBmcmFtZTsgZnJhbWUgPSBmcmFtZS0+dHJlZSgpLT50cmF2ZXJzZU5leHQoKSkg
ewotICAgICAgICBpZiAoZnJhbWUtPmRvY3VtZW50KCkgJiYgZnJhbWUtPmRvY3VtZW50KCktPnRv
dWNoRXZlbnRIYW5kbGVyQ291bnQoKSkKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgb2xk
U3R5bGVzaGVldENvdW50OyArK2kpIHsKKyAgICAgICAgaWYgKG1fYXV0aG9yU3R5bGVTaGVldHMt
Pml0ZW0oaSkgIT0gbmV3U3R5bGVzaGVldHNbaV0pCiAgICAgICAgICAgICByZXR1cm47CiAgICAg
fQotICAgIHBhZ2UtPmNocm9tZSgpLT5jbGllbnQoKS0+bmVlZFRvdWNoRXZlbnRzKGZhbHNlKTsK
LSNlbmRpZgotfQotCi1IVE1MSUZyYW1lRWxlbWVudCogRG9jdW1lbnQ6OnNlYW1sZXNzUGFyZW50
SUZyYW1lKCkgY29uc3QKLXsKLSAgICBpZiAoIXNob3VsZERpc3BsYXlTZWFtbGVzc2x5V2l0aFBh
cmVudCgpKQotICAgICAgICByZXR1cm4gMDsKKyAgICByZXF1aXJlc1N0eWxlUmVzb2x2ZXJSZXNl
dCA9IGZhbHNlOwogCi0gICAgSFRNTEZyYW1lT3duZXJFbGVtZW50KiBvd25lckVsZW1lbnQgPSB0
aGlzLT5vd25lckVsZW1lbnQoKTsKLSAgICBBU1NFUlQob3duZXJFbGVtZW50LT5oYXNUYWdOYW1l
KGlmcmFtZVRhZykpOwotICAgIHJldHVybiBzdGF0aWNfY2FzdDxIVE1MSUZyYW1lRWxlbWVudCo+
KG93bmVyRWxlbWVudCk7CisgICAgLy8gSWYgd2UgYXJlIGFscmVhZHkgcGFyc2luZyB0aGUgYm9k
eSBhbmQgc28gbWF5IGhhdmUgc2lnbmlmaWNhbnQgYW1vdW50IG9mIGVsZW1lbnRzLCBwdXQgc29t
ZSBlZmZvcnQgaW50byB0cnlpbmcgdG8gYXZvaWQgc3R5bGUgcmVjYWxjcy4KKyAgICBpZiAoIW1f
ZG9jdW1lbnQtPmJvZHkoKSB8fCBtX2RvY3VtZW50LT5oYXNOb2Rlc1dpdGhQbGFjZWhvbGRlclN0
eWxlKCkpCisgICAgICAgIHJldHVybjsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSBvbGRTdHlsZXNo
ZWV0Q291bnQ7IGkgPCBuZXdTdHlsZXNoZWV0Q291bnQ7ICsraSkgeworICAgICAgICBpZiAoIW5l
d1N0eWxlc2hlZXRzW2ldLT5pc0NTU1N0eWxlU2hlZXQoKSkKKyAgICAgICAgICAgIHJldHVybjsK
KyAgICAgICAgaWYgKG5ld1N0eWxlc2hlZXRzW2ldLT5kaXNhYmxlZCgpKQorICAgICAgICAgICAg
Y29udGludWU7CisgICAgICAgIGlmICh0ZXN0QWRkZWRTdHlsZVNoZWV0UmVxdWlyZXNTdHlsZVJl
Y2FsYyhzdGF0aWNfY2FzdDxDU1NTdHlsZVNoZWV0Kj4obmV3U3R5bGVzaGVldHNbaV0uZ2V0KCkp
LT5jb250ZW50cygpKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcmVxdWlyZXNG
dWxsU3R5bGVSZWNhbGMgPSBmYWxzZTsKIH0KIAotYm9vbCBEb2N1bWVudDo6c2hvdWxkRGlzcGxh
eVNlYW1sZXNzbHlXaXRoUGFyZW50KCkgY29uc3QKK3N0YXRpYyBib29sIHN0eWxlU2hlZXRzVXNl
UmVtVW5pdHMoY29uc3QgVmVjdG9yPFJlZlB0cjxTdHlsZVNoZWV0PiA+JiBzaGVldHMpCiB7Ci0j
aWYgRU5BQkxFKElGUkFNRV9TRUFNTEVTUykKLSAgICBIVE1MRnJhbWVPd25lckVsZW1lbnQqIG93
bmVyRWxlbWVudCA9IHRoaXMtPm93bmVyRWxlbWVudCgpOwotICAgIGlmICghb3duZXJFbGVtZW50
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIG1fbWF5RGlzcGxheVNlYW1sZXNz
V2l0aFBhcmVudCAmJiBvd25lckVsZW1lbnQtPmhhc1RhZ05hbWUoaWZyYW1lVGFnKSAmJiBvd25l
ckVsZW1lbnQtPmZhc3RIYXNBdHRyaWJ1dGUoc2VhbWxlc3NBdHRyKTsKLSNlbHNlCisgICAgZm9y
ICh1bnNpZ25lZCBpID0gMDsgaSA8IHNoZWV0cy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAo
IXNoZWV0c1tpXS0+aXNDU1NTdHlsZVNoZWV0KCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAg
ICAgICAgaWYgKHN0YXRpY19jYXN0PENTU1N0eWxlU2hlZXQqPihzaGVldHNbaV0uZ2V0KCkpLT5j
b250ZW50cygpLT51c2VzUmVtVW5pdHMoKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAg
IH0KICAgICByZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLX0KLQotRG9jdW1lbnRMb2FkZXIqIERvY3Vt
ZW50Ojpsb2FkZXIoKSBjb25zdAotewotICAgIGlmICghbV9mcmFtZSkKLSAgICAgICAgcmV0dXJu
IDA7Ci0gICAgCi0gICAgRG9jdW1lbnRMb2FkZXIqIGxvYWRlciA9IG1fZnJhbWUtPmxvYWRlcigp
LT5kb2N1bWVudExvYWRlcigpOwotICAgIGlmICghbG9hZGVyKQotICAgICAgICByZXR1cm4gMDsK
LSAgICAKLSAgICBpZiAobV9mcmFtZS0+ZG9jdW1lbnQoKSAhPSB0aGlzKQotICAgICAgICByZXR1
cm4gMDsKLSAgICAKLSAgICByZXR1cm4gbG9hZGVyOwotfQotCi0jaWYgRU5BQkxFKE1JQ1JPREFU
QSkKLVBhc3NSZWZQdHI8Tm9kZUxpc3Q+IERvY3VtZW50OjpnZXRJdGVtcyhjb25zdCBTdHJpbmcm
IHR5cGVOYW1lcykKLXsKLSAgICAvLyBTaW5jZSBkb2N1bWV0LmdldEl0ZW0oKSBpcyBhbGxvd2Vk
IGZvciBtaWNyb2RhdGEsIHR5cGVOYW1lcyB3aWxsIGJlIG51bGwgc3RyaW5nLgotICAgIC8vIElu
IHRoaXMgY2FzZSB3ZSBuZWVkIHRvIGNyZWF0ZSBhbiBlbXB0eSBzdHJpbmcgaWRlbnRpZmllciB0
byBtYXAgc3VjaCByZXF1ZXN0IGluIHRoZSBjYWNoZS4KLSAgICBTdHJpbmcgbG9jYWxUeXBlTmFt
ZXMgPSB0eXBlTmFtZXMuaXNOdWxsKCkgPyBNaWNyb0RhdGFJdGVtTGlzdDo6dW5kZWZpbmVkSXRl
bVR5cGUoKSA6IHR5cGVOYW1lczsKLQotICAgIHJldHVybiBlbnN1cmVSYXJlRGF0YSgpLT5lbnN1
cmVOb2RlTGlzdHMoKS0+YWRkQ2FjaGVXaXRoTmFtZTxNaWNyb0RhdGFJdGVtTGlzdD4odGhpcywg
RHluYW1pY05vZGVMaXN0OjpNaWNyb0RhdGFJdGVtTGlzdFR5cGUsIGxvY2FsVHlwZU5hbWVzKTsK
IH0KLSNlbmRpZgogCi1JbnRTaXplIERvY3VtZW50Ojp2aWV3cG9ydFNpemUoKSBjb25zdAorYm9v
bCBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjp1cGRhdGVBY3RpdmVTdHlsZVNoZWV0cyhV
cGRhdGVGbGFnIHVwZGF0ZUZsYWcpCiB7Ci0gICAgaWYgKCF2aWV3KCkpCi0gICAgICAgIHJldHVy
biBJbnRTaXplKCk7Ci0gICAgcmV0dXJuIHZpZXcoKS0+dmlzaWJsZUNvbnRlbnRSZWN0KC8qIGlu
Y2x1ZGVTY3JvbGxiYXJzICovIHRydWUpLnNpemUoKTsKLX0KKyAgICBpZiAobV9kb2N1bWVudC0+
aW5TdHlsZVJlY2FsYygpKSB7CisgICAgICAgIC8vIFNWRyA8dXNlPiBlbGVtZW50IG1heSBtYW5h
Z2UgdG8gaW52YWxpZGF0ZSBzdHlsZSBzZWxlY3RvciBpbiB0aGUgbWlkZGxlIG9mIGEgc3R5bGUg
cmVjYWxjLgorICAgICAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9NTQzNDQKKyAgICAgICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIGJlIGZpeGVkIGluIFNWRyBh
bmQgdGhlIGNhbGwgc2l0ZSByZXBsYWNlZCBieSBBU1NFUlQoIW1faW5TdHlsZVJlY2FsYykuCisg
ICAgICAgIG1fbmVlZHNVcGRhdGVBY3RpdmVTdHlsZXNoZWV0c09uU3R5bGVSZWNhbGMgPSB0cnVl
OworICAgICAgICBtX2RvY3VtZW50LT5zY2hlZHVsZUZvcmNlZFN0eWxlUmVjYWxjKCk7CisgICAg
ICAgIHJldHVybiBmYWxzZTsKIAotTm9kZSogZXZlbnRUYXJnZXROb2RlRm9yRG9jdW1lbnQoRG9j
dW1lbnQqIGRvYykKLXsKLSAgICBpZiAoIWRvYykKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgTm9k
ZSogbm9kZSA9IGRvYy0+Zm9jdXNlZE5vZGUoKTsKLSAgICBpZiAoIW5vZGUgJiYgZG9jLT5pc1Bs
dWdpbkRvY3VtZW50KCkpIHsKLSAgICAgICAgUGx1Z2luRG9jdW1lbnQqIHBsdWdpbkRvY3VtZW50
ID0gc3RhdGljX2Nhc3Q8UGx1Z2luRG9jdW1lbnQqPihkb2MpOwotICAgICAgICBub2RlID0gIHBs
dWdpbkRvY3VtZW50LT5wbHVnaW5Ob2RlKCk7CiAgICAgfQotICAgIGlmICghbm9kZSAmJiBkb2Mt
PmlzSFRNTERvY3VtZW50KCkpCi0gICAgICAgIG5vZGUgPSBkb2MtPmJvZHkoKTsKLSAgICBpZiAo
IW5vZGUpCi0gICAgICAgIG5vZGUgPSBkb2MtPmRvY3VtZW50RWxlbWVudCgpOwotICAgIHJldHVy
biBub2RlOwotfQorICAgIGlmICghbV9kb2N1bWVudC0+cmVuZGVyZXIoKSB8fCAhbV9kb2N1bWVu
dC0+YXR0YWNoZWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCi12b2lkIERvY3VtZW50Ojph
ZGp1c3RGbG9hdFF1YWRzRm9yU2Nyb2xsQW5kQWJzb2x1dGVab29tQW5kRnJhbWVTY2FsZShWZWN0
b3I8RmxvYXRRdWFkPiYgcXVhZHMsIFJlbmRlck9iamVjdCogcmVuZGVyZXIpCi17Ci0gICAgaWYg
KCF2aWV3KCkpCi0gICAgICAgIHJldHVybjsKKyAgICBTdHlsZVNoZWV0VmVjdG9yIG5ld1N0eWxl
c2hlZXRzOworICAgIGNvbGxlY3RBY3RpdmVTdHlsZVNoZWV0cyhuZXdTdHlsZXNoZWV0cyk7CisK
KyAgICBib29sIHJlcXVpcmVzU3R5bGVSZXNvbHZlclJlc2V0OworICAgIGJvb2wgcmVxdWlyZXNG
dWxsU3R5bGVSZWNhbGM7CisgICAgYW5hbHl6ZVN0eWxlU2hlZXRDaGFuZ2UodXBkYXRlRmxhZywg
bmV3U3R5bGVzaGVldHMsIHJlcXVpcmVzU3R5bGVSZXNvbHZlclJlc2V0LCByZXF1aXJlc0Z1bGxT
dHlsZVJlY2FsYyk7CiAKLSAgICBmbG9hdCBpbnZlcnNlRnJhbWVTY2FsZSA9IDE7Ci0gICAgaWYg
KGZyYW1lKCkpCi0gICAgICAgIGludmVyc2VGcmFtZVNjYWxlID0gMSAvIGZyYW1lKCktPmZyYW1l
U2NhbGVGYWN0b3IoKTsKLQotICAgIExheW91dFJlY3QgdmlzaWJsZUNvbnRlbnRSZWN0ID0gdmll
dygpLT52aXNpYmxlQ29udGVudFJlY3QoKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHF1
YWRzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIHF1YWRzW2ldLm1vdmUoLXZpc2libGVDb250ZW50
UmVjdC54KCksIC12aXNpYmxlQ29udGVudFJlY3QueSgpKTsKLSAgICAgICAgYWRqdXN0RmxvYXRR
dWFkRm9yQWJzb2x1dGVab29tKHF1YWRzW2ldLCByZW5kZXJlcik7Ci0gICAgICAgIGlmIChpbnZl
cnNlRnJhbWVTY2FsZSAhPSAxKQotICAgICAgICAgICAgcXVhZHNbaV0uc2NhbGUoaW52ZXJzZUZy
YW1lU2NhbGUsIGludmVyc2VGcmFtZVNjYWxlKTsKKyAgICBpZiAocmVxdWlyZXNTdHlsZVJlc29s
dmVyUmVzZXQpCisgICAgICAgIG1fZG9jdW1lbnQtPmNsZWFyU3R5bGVSZXNvbHZlcigpOworICAg
IGVsc2UgeworICAgICAgICBtX2RvY3VtZW50LT5zdHlsZVJlc29sdmVyKCktPmFwcGVuZEF1dGhv
clN0eWxlc2hlZXRzKG1fYXV0aG9yU3R5bGVTaGVldHMtPmxlbmd0aCgpLCBuZXdTdHlsZXNoZWV0
cyk7CisgICAgICAgIHJlc2V0Q1NTRmVhdHVyZUZsYWdzKCk7CiAgICAgfQotfQorICAgIG1fYXV0
aG9yU3R5bGVTaGVldHMtPnN3YXAobmV3U3R5bGVzaGVldHMpOwogCi12b2lkIERvY3VtZW50Ojph
ZGp1c3RGbG9hdFJlY3RGb3JTY3JvbGxBbmRBYnNvbHV0ZVpvb21BbmRGcmFtZVNjYWxlKEZsb2F0
UmVjdCYgcmVjdCwgUmVuZGVyT2JqZWN0KiByZW5kZXJlcikKLXsKLSAgICBpZiAoIXZpZXcoKSkK
LSAgICAgICAgcmV0dXJuOworICAgIG1fdXNlc1JlbVVuaXRzID0gc3R5bGVTaGVldHNVc2VSZW1V
bml0cyhtX2F1dGhvclN0eWxlU2hlZXRzLT52ZWN0b3IoKSk7CisgICAgbV9uZWVkc1VwZGF0ZUFj
dGl2ZVN0eWxlc2hlZXRzT25TdHlsZVJlY2FsYyA9IGZhbHNlOwogCi0gICAgZmxvYXQgaW52ZXJz
ZUZyYW1lU2NhbGUgPSAxOwotICAgIGlmIChmcmFtZSgpKQotICAgICAgICBpbnZlcnNlRnJhbWVT
Y2FsZSA9IDEgLyBmcmFtZSgpLT5mcmFtZVNjYWxlRmFjdG9yKCk7Ci0KLSAgICBMYXlvdXRSZWN0
IHZpc2libGVDb250ZW50UmVjdCA9IHZpZXcoKS0+dmlzaWJsZUNvbnRlbnRSZWN0KCk7Ci0gICAg
cmVjdC5tb3ZlKC12aXNpYmxlQ29udGVudFJlY3QueCgpLCAtdmlzaWJsZUNvbnRlbnRSZWN0Lnko
KSk7Ci0gICAgYWRqdXN0RmxvYXRSZWN0Rm9yQWJzb2x1dGVab29tKHJlY3QsIHJlbmRlcmVyKTsK
LSAgICBpZiAoaW52ZXJzZUZyYW1lU2NhbGUgIT0gMSkKLSAgICAgICAgcmVjdC5zY2FsZShpbnZl
cnNlRnJhbWVTY2FsZSk7Ci19CisgICAgbV9kb2N1bWVudC0+bm90aWZ5U2VhbWxlc3NDaGlsZERv
Y3VtZW50c09mU3R5bGVzaGVldFVwZGF0ZSgpOwogCi12b2lkIERvY3VtZW50OjpzZXRDb250ZXh0
RmVhdHVyZXMoUGFzc1JlZlB0cjxDb250ZXh0RmVhdHVyZXM+IGZlYXR1cmVzKQotewotICAgIG1f
Y29udGV4dEZlYXR1cmVzID0gZmVhdHVyZXM7CisgICAgcmV0dXJuIHJlcXVpcmVzRnVsbFN0eWxl
UmVjYWxjOwogfQogCi1zdGF0aWMgUmVuZGVyT2JqZWN0KiBuZWFyZXN0Q29tbW9uSG92ZXJBbmNl
c3RvcihSZW5kZXJPYmplY3QqIG9iajEsIFJlbmRlck9iamVjdCogb2JqMikKK3ZvaWQgRG9jdW1l
bnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6Y29tYmluZUNTU0ZlYXR1cmVGbGFncygpCiB7Ci0gICAg
aWYgKCFvYmoxIHx8ICFvYmoyKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGZvciAoUmVuZGVy
T2JqZWN0KiBjdXJyT2JqMSA9IG9iajE7IGN1cnJPYmoxOyBjdXJyT2JqMSA9IGN1cnJPYmoxLT5o
b3ZlckFuY2VzdG9yKCkpIHsKLSAgICAgICAgZm9yIChSZW5kZXJPYmplY3QqIGN1cnJPYmoyID0g
b2JqMjsgY3Vyck9iajI7IGN1cnJPYmoyID0gY3Vyck9iajItPmhvdmVyQW5jZXN0b3IoKSkgewot
ICAgICAgICAgICAgaWYgKGN1cnJPYmoxID09IGN1cnJPYmoyKQotICAgICAgICAgICAgICAgIHJl
dHVybiBjdXJyT2JqMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAwOworICAgIC8v
IERlbGF5IHJlc2V0dGluZyB0aGUgZmxhZ3MgdW50aWwgYWZ0ZXIgbmV4dCBzdHlsZSByZWNhbGMg
c2luY2UgdW5hcHBseWluZyB0aGUgc3R5bGUgbWF5IG5vdCB3b3JrIHdpdGhvdXQgdGhlc2Ugc2V0
ICh0aGlzIGlzIHRydWUgYXQgbGVhc3Qgd2l0aCBiZWZvcmUvYWZ0ZXIpLgorICAgIFN0eWxlUmVz
b2x2ZXIqIHN0eWxlUmVzb2x2ZXIgPSBtX2RvY3VtZW50LT5zdHlsZVJlc29sdmVyKCk7CisgICAg
bV91c2VzU2libGluZ1J1bGVzID0gbV91c2VzU2libGluZ1J1bGVzIHx8IHN0eWxlUmVzb2x2ZXIt
PnVzZXNTaWJsaW5nUnVsZXMoKTsKKyAgICBtX3VzZXNGaXJzdExpbmVSdWxlcyA9IG1fdXNlc0Zp
cnN0TGluZVJ1bGVzIHx8IHN0eWxlUmVzb2x2ZXItPnVzZXNGaXJzdExpbmVSdWxlcygpOworICAg
IG1fdXNlc0JlZm9yZUFmdGVyUnVsZXMgPSBtX3VzZXNCZWZvcmVBZnRlclJ1bGVzIHx8IHN0eWxl
UmVzb2x2ZXItPnVzZXNCZWZvcmVBZnRlclJ1bGVzKCk7CiB9CiAKLXZvaWQgRG9jdW1lbnQ6OnVw
ZGF0ZUhvdmVyQWN0aXZlU3RhdGUoY29uc3QgSGl0VGVzdFJlcXVlc3QmIHJlcXVlc3QsIEhpdFRl
c3RSZXN1bHQmIHJlc3VsdCkKK3ZvaWQgRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6cmVz
ZXRDU1NGZWF0dXJlRmxhZ3MoKQogewotICAgIC8vIFdlIGRvbid0IHVwZGF0ZSA6aG92ZXIvOmFj
dGl2ZSBzdGF0ZSB3aGVuIHRoZSByZXN1bHQgaXMgbWFya2VkIGFzIHJlYWRPbmx5LgotICAgIGlm
IChyZXF1ZXN0LnJlYWRPbmx5KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIE5vZGUqIGlubmVy
Tm9kZUluRG9jdW1lbnQgPSByZXN1bHQuaW5uZXJOb2RlKCk7Ci0gICAgQVNTRVJUKCFpbm5lck5v
ZGVJbkRvY3VtZW50IHx8IGlubmVyTm9kZUluRG9jdW1lbnQtPmRvY3VtZW50KCkgPT0gdGhpcyk7
Ci0KLSAgICBOb2RlKiBvbGRBY3RpdmVOb2RlID0gYWN0aXZlTm9kZSgpOwotICAgIGlmIChvbGRB
Y3RpdmVOb2RlICYmICFyZXF1ZXN0LmFjdGl2ZSgpKSB7Ci0gICAgICAgIC8vIFdlIGFyZSBjbGVh
cmluZyB0aGUgOmFjdGl2ZSBjaGFpbiBiZWNhdXNlIHRoZSBtb3VzZSBoYXMgYmVlbiByZWxlYXNl
ZC4KLSAgICAgICAgZm9yIChSZW5kZXJPYmplY3QqIGN1cnIgPSBvbGRBY3RpdmVOb2RlLT5yZW5k
ZXJlcigpOyBjdXJyOyBjdXJyID0gY3Vyci0+cGFyZW50KCkpIHsKLSAgICAgICAgICAgIGlmIChj
dXJyLT5ub2RlKCkgJiYgIWN1cnItPmlzVGV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgY3Vyci0+
bm9kZSgpLT5zZXRBY3RpdmUoZmFsc2UpOwotICAgICAgICAgICAgICAgIGN1cnItPm5vZGUoKS0+
Y2xlYXJJbkFjdGl2ZUNoYWluKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAg
c2V0QWN0aXZlTm9kZSgwKTsKLSAgICB9IGVsc2UgewotICAgICAgICBOb2RlKiBuZXdBY3RpdmVO
b2RlID0gaW5uZXJOb2RlSW5Eb2N1bWVudDsKLSAgICAgICAgaWYgKCFvbGRBY3RpdmVOb2RlICYm
IG5ld0FjdGl2ZU5vZGUgJiYgcmVxdWVzdC5hY3RpdmUoKSAmJiAhcmVxdWVzdC50b3VjaE1vdmUo
KSkgewotICAgICAgICAgICAgLy8gV2UgYXJlIHNldHRpbmcgdGhlIDphY3RpdmUgY2hhaW4gYW5k
IGZyZWV6aW5nIGl0LiBJZiBmdXR1cmUgbW92ZXMgaGFwcGVuLCB0aGV5Ci0gICAgICAgICAgICAv
LyB3aWxsIG5lZWQgdG8gcmVmZXJlbmNlIHRoaXMgY2hhaW4uCi0gICAgICAgICAgICBmb3IgKFJl
bmRlck9iamVjdCogY3VyciA9IG5ld0FjdGl2ZU5vZGUtPnJlbmRlcmVyKCk7IGN1cnI7IGN1cnIg
PSBjdXJyLT5wYXJlbnQoKSkgewotICAgICAgICAgICAgICAgIGlmIChjdXJyLT5ub2RlKCkgJiYg
IWN1cnItPmlzVGV4dCgpKQotICAgICAgICAgICAgICAgICAgICBjdXJyLT5ub2RlKCktPnNldElu
QWN0aXZlQ2hhaW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldEFjdGl2ZU5vZGUo
bmV3QWN0aXZlTm9kZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gSWYgdGhlIG1vdXNlIGhh
cyBqdXN0IGJlZW4gcHJlc3NlZCwgc2V0IDphY3RpdmUgb24gdGhlIGNoYWluLiBUaG9zZSAoYW5k
IG9ubHkgdGhvc2UpCi0gICAgLy8gbm9kZXMgc2hvdWxkIHJlbWFpbiA6YWN0aXZlIHVudGlsIHRo
ZSBtb3VzZSBpcyByZWxlYXNlZC4KLSAgICBib29sIGFsbG93QWN0aXZlQ2hhbmdlcyA9ICFvbGRB
Y3RpdmVOb2RlICYmIGFjdGl2ZU5vZGUoKTsKLQotICAgIC8vIElmIHRoZSBtb3VzZSBpcyBkb3du
IGFuZCBpZiB0aGlzIGlzIGEgbW91c2UgbW92ZSBldmVudCwgd2Ugd2FudCB0byByZXN0cmljdCBj
aGFuZ2VzIGluCi0gICAgLy8gOmhvdmVyLzphY3RpdmUgdG8gb25seSBhcHBseSB0byBlbGVtZW50
cyB0aGF0IGFyZSBpbiB0aGUgOmFjdGl2ZSBjaGFpbiB0aGF0IHdlIGZyb3plCi0gICAgLy8gYXQg
dGhlIHRpbWUgdGhlIG1vdXNlIHdlbnQgZG93bi4KLSAgICBib29sIG11c3RCZUluQWN0aXZlQ2hh
aW4gPSByZXF1ZXN0LmFjdGl2ZSgpICYmIHJlcXVlc3QubW92ZSgpOwotCi0gICAgUmVmUHRyPE5v
ZGU+IG9sZEhvdmVyTm9kZSA9IGhvdmVyTm9kZSgpOwotICAgIC8vIENsZWFyIHRoZSA6aG92ZXIg
Y2hhaW4gd2hlbiB0aGUgdG91Y2ggZ2VzdHVyZSBpcyBvdmVyLgotICAgIGlmIChyZXF1ZXN0LnRv
dWNoUmVsZWFzZSgpKSB7Ci0gICAgICAgIGlmIChvbGRIb3Zlck5vZGUpIHsKLSAgICAgICAgICAg
IGZvciAoUmVuZGVyT2JqZWN0KiBjdXJyID0gb2xkSG92ZXJOb2RlLT5yZW5kZXJlcigpOyBjdXJy
OyBjdXJyID0gY3Vyci0+aG92ZXJBbmNlc3RvcigpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGN1
cnItPm5vZGUoKSAmJiAhY3Vyci0+aXNUZXh0KCkpCi0gICAgICAgICAgICAgICAgICAgIGN1cnIt
Pm5vZGUoKS0+c2V0SG92ZXJlZChmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBz
ZXRIb3Zlck5vZGUoMCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQSB0b3VjaCByZWxlYXNlIGNh
biBub3Qgc2V0IG5ldyBob3ZlciBvciBhY3RpdmUgdGFyZ2V0LgotICAgICAgICByZXR1cm47Ci0g
ICAgfQotCi0gICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBob3ZlcmVkIG5vZGUgaGFzIGNoYW5n
ZWQuCi0gICAgLy8gSWYgaXQgaGFzbid0LCB3ZSBkbyBub3QgbmVlZCB0byBkbyBhbnl0aGluZy4K
LSAgICBOb2RlKiBuZXdIb3Zlck5vZGUgPSBpbm5lck5vZGVJbkRvY3VtZW50OwotICAgIHdoaWxl
IChuZXdIb3Zlck5vZGUgJiYgIW5ld0hvdmVyTm9kZS0+cmVuZGVyZXIoKSkKLSAgICAgICAgbmV3
SG92ZXJOb2RlID0gbmV3SG92ZXJOb2RlLT5wYXJlbnRPckhvc3ROb2RlKCk7Ci0KLSAgICAvLyBV
cGRhdGUgb3VyIGN1cnJlbnQgaG92ZXIgbm9kZS4KLSAgICBzZXRIb3Zlck5vZGUobmV3SG92ZXJO
b2RlKTsKLQotICAgIC8vIFdlIGhhdmUgdHdvIGRpZmZlcmVudCBvYmplY3RzLiBGZXRjaCB0aGVp
ciByZW5kZXJlcnMuCi0gICAgUmVuZGVyT2JqZWN0KiBvbGRIb3Zlck9iaiA9IG9sZEhvdmVyTm9k
ZSA/IG9sZEhvdmVyTm9kZS0+cmVuZGVyZXIoKSA6IDA7Ci0gICAgUmVuZGVyT2JqZWN0KiBuZXdI
b3Zlck9iaiA9IG5ld0hvdmVyTm9kZSA/IG5ld0hvdmVyTm9kZS0+cmVuZGVyZXIoKSA6IDA7Ci0K
LSAgICAvLyBMb2NhdGUgdGhlIGNvbW1vbiBhbmNlc3RvciByZW5kZXIgb2JqZWN0IGZvciB0aGUg
dHdvIHJlbmRlcmVycy4KLSAgICBSZW5kZXJPYmplY3QqIGFuY2VzdG9yID0gbmVhcmVzdENvbW1v
bkhvdmVyQW5jZXN0b3Iob2xkSG92ZXJPYmosIG5ld0hvdmVyT2JqKTsKLQotICAgIFZlY3RvcjxS
ZWZQdHI8Tm9kZT4sIDMyPiBub2Rlc1RvUmVtb3ZlRnJvbUNoYWluOwotICAgIFZlY3RvcjxSZWZQ
dHI8Tm9kZT4sIDMyPiBub2Rlc1RvQWRkVG9DaGFpbjsKLQotICAgIGlmIChvbGRIb3Zlck9iaiAh
PSBuZXdIb3Zlck9iaikgewotICAgICAgICAvLyBUaGUgb2xkIGhvdmVyIHBhdGggb25seSBuZWVk
cyB0byBiZSBjbGVhcmVkIHVwIHRvIChhbmQgbm90IGluY2x1ZGluZykgdGhlIGNvbW1vbiBhbmNl
c3RvcjsKLSAgICAgICAgZm9yIChSZW5kZXJPYmplY3QqIGN1cnIgPSBvbGRIb3Zlck9iajsgY3Vy
ciAmJiBjdXJyICE9IGFuY2VzdG9yOyBjdXJyID0gY3Vyci0+aG92ZXJBbmNlc3RvcigpKSB7Ci0g
ICAgICAgICAgICBpZiAoY3Vyci0+bm9kZSgpICYmICFjdXJyLT5pc1RleHQoKSAmJiAoIW11c3RC
ZUluQWN0aXZlQ2hhaW4gfHwgY3Vyci0+bm9kZSgpLT5pbkFjdGl2ZUNoYWluKCkpKQotICAgICAg
ICAgICAgICAgIG5vZGVzVG9SZW1vdmVGcm9tQ2hhaW4uYXBwZW5kKGN1cnItPm5vZGUoKSk7Ci0g
ICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBOb3cgc2V0IHRoZSBob3ZlciBzdGF0ZSBmb3Igb3Vy
IG5ldyBvYmplY3QgdXAgdG8gdGhlIHJvb3QuCi0gICAgZm9yIChSZW5kZXJPYmplY3QqIGN1cnIg
PSBuZXdIb3Zlck9iajsgY3VycjsgY3VyciA9IGN1cnItPmhvdmVyQW5jZXN0b3IoKSkgewotICAg
ICAgICBpZiAoY3Vyci0+bm9kZSgpICYmICFjdXJyLT5pc1RleHQoKSAmJiAoIW11c3RCZUluQWN0
aXZlQ2hhaW4gfHwgY3Vyci0+bm9kZSgpLT5pbkFjdGl2ZUNoYWluKCkpKQotICAgICAgICAgICAg
bm9kZXNUb0FkZFRvQ2hhaW4uYXBwZW5kKGN1cnItPm5vZGUoKSk7Ci0gICAgfQotCi0gICAgc2l6
ZV90IHJlbW92ZUNvdW50ID0gbm9kZXNUb1JlbW92ZUZyb21DaGFpbi5zaXplKCk7Ci0gICAgZm9y
IChzaXplX3QgaSA9IDA7IGkgPCByZW1vdmVDb3VudDsgKytpKQotICAgICAgICBub2Rlc1RvUmVt
b3ZlRnJvbUNoYWluW2ldLT5zZXRIb3ZlcmVkKGZhbHNlKTsKLQotICAgIHNpemVfdCBhZGRDb3Vu
dCA9IG5vZGVzVG9BZGRUb0NoYWluLnNpemUoKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8
IGFkZENvdW50OyArK2kpIHsKLSAgICAgICAgaWYgKGFsbG93QWN0aXZlQ2hhbmdlcykKLSAgICAg
ICAgICAgIG5vZGVzVG9BZGRUb0NoYWluW2ldLT5zZXRBY3RpdmUodHJ1ZSk7Ci0gICAgICAgIG5v
ZGVzVG9BZGRUb0NoYWluW2ldLT5zZXRIb3ZlcmVkKHRydWUpOwotICAgIH0KKyAgICBTdHlsZVJl
c29sdmVyKiBzdHlsZVJlc29sdmVyID0gbV9kb2N1bWVudC0+c3R5bGVSZXNvbHZlcigpOworICAg
IG1fdXNlc1NpYmxpbmdSdWxlcyA9IHN0eWxlUmVzb2x2ZXItPnVzZXNTaWJsaW5nUnVsZXMoKTsK
KyAgICBtX3VzZXNGaXJzdExpbmVSdWxlcyA9IHN0eWxlUmVzb2x2ZXItPnVzZXNGaXJzdExpbmVS
dWxlcygpOworICAgIG1fdXNlc0JlZm9yZUFmdGVyUnVsZXMgPSBzdHlsZVJlc29sdmVyLT51c2Vz
QmVmb3JlQWZ0ZXJSdWxlcygpOwogfQogCi12b2lkIERvY3VtZW50OjpyZXBvcnRNZW1vcnlVc2Fn
ZShNZW1vcnlPYmplY3RJbmZvKiBtZW1vcnlPYmplY3RJbmZvKSBjb25zdAordm9pZCBEb2N1bWVu
dFN0eWxlU2hlZXRDb2xsZWN0aW9uOjpyZXBvcnRNZW1vcnlVc2FnZShNZW1vcnlPYmplY3RJbmZv
KiBtZW1vcnlPYmplY3RJbmZvKSBjb25zdAogewogICAgIE1lbW9yeUNsYXNzSW5mbyBpbmZvKG1l
bW9yeU9iamVjdEluZm8sIHRoaXMsIFdlYkNvcmVNZW1vcnlUeXBlczo6RE9NKTsKLSAgICBpbmZv
LmFkZE1lbWJlcihtX3N0eWxlUmVzb2x2ZXIpOwotICAgIENvbnRhaW5lck5vZGU6OnJlcG9ydE1l
bW9yeVVzYWdlKG1lbW9yeU9iamVjdEluZm8pOwotICAgIGluZm8uYWRkVmVjdG9yKG1fY3VzdG9t
Rm9udHMpOwotICAgIGluZm8uYWRkTWVtYmVyKG1fdXJsKTsKLSAgICBpbmZvLmFkZE1lbWJlciht
X2Jhc2VVUkwpOwotICAgIGluZm8uYWRkTWVtYmVyKG1fYmFzZVVSTE92ZXJyaWRlKTsKLSAgICBp
bmZvLmFkZE1lbWJlcihtX2Jhc2VFbGVtZW50VVJMKTsKLSAgICBpbmZvLmFkZE1lbWJlcihtX2Nv
b2tpZVVSTCk7Ci0gICAgaW5mby5hZGRNZW1iZXIobV9maXJzdFBhcnR5Rm9yQ29va2llcyk7Ci0g
ICAgaW5mby5hZGRNZW1iZXIobV9kb2N1bWVudFVSSSk7Ci0gICAgaW5mby5hZGRNZW1iZXIobV9i
YXNlVGFyZ2V0KTsKLSAgICBpbmZvLmFkZE1lbWJlcihtX2ZyYW1lKTsKLSAgICBpbmZvLmFkZE1l
bWJlcihtX2NhY2hlZFJlc291cmNlTG9hZGVyKTsKLSAgICBpbmZvLmFkZE1lbWJlcihtX2VsZW1T
aGVldCk7CiAgICAgaW5mby5hZGRNZW1iZXIobV9wYWdlVXNlclNoZWV0KTsKICAgICBpZiAobV9w
YWdlR3JvdXBVc2VyU2hlZXRzKQogICAgICAgICBpbmZvLmFkZEluc3RydW1lbnRlZFZlY3RvclB0
cihtX3BhZ2VHcm91cFVzZXJTaGVldHMpOwogICAgIGlmIChtX3VzZXJTaGVldHMpCiAgICAgICAg
IGluZm8uYWRkSW5zdHJ1bWVudGVkVmVjdG9yUHRyKG1fdXNlclNoZWV0cyk7Ci0gICAgaW5mby5h
ZGRIYXNoU2V0KG1fbm9kZUl0ZXJhdG9ycyk7Ci0gICAgaW5mby5hZGRIYXNoU2V0KG1fcmFuZ2Vz
KTsKICAgICBpbmZvLmFkZExpc3RIYXNoU2V0KG1fc3R5bGVTaGVldENhbmRpZGF0ZU5vZGVzKTsK
LSAgICBpbmZvLmFkZE1lbWJlcihtX3ByZWZlcnJlZFN0eWxlc2hlZXRTZXQpOwotICAgIGluZm8u
YWRkTWVtYmVyKG1fc2VsZWN0ZWRTdHlsZXNoZWV0U2V0KTsKLSAgICBpbmZvLmFkZE1lbWJlciht
X3RpdGxlLnN0cmluZygpKTsKLSAgICBpbmZvLmFkZE1lbWJlcihtX3Jhd1RpdGxlLnN0cmluZygp
KTsKLSAgICBpbmZvLmFkZE1lbWJlcihtX3htbEVuY29kaW5nKTsKLSAgICBpbmZvLmFkZE1lbWJl
cihtX3htbFZlcnNpb24pOwotICAgIGluZm8uYWRkTWVtYmVyKG1fY29udGVudExhbmd1YWdlKTsK
LSAgICBpbmZvLmFkZEhhc2hNYXAobV9kb2N1bWVudE5hbWVkSXRlbUNvbGxlY3Rpb25zKTsKLSAg
ICBpbmZvLmFkZEhhc2hNYXAobV93aW5kb3dOYW1lZEl0ZW1Db2xsZWN0aW9ucyk7Ci0jaWYgRU5B
QkxFKERBU0hCT0FSRF9TVVBQT1JUKQotICAgIGluZm8uYWRkVmVjdG9yKG1fZGFzaGJvYXJkUmVn
aW9ucyk7Ci0jZW5kaWYKLSAgICBpbmZvLmFkZEhhc2hNYXAobV9jc3NDYW52YXNFbGVtZW50cyk7
Ci0gICAgaW5mby5hZGRWZWN0b3IobV9pY29uVVJMcyk7Ci0gICAgaW5mby5hZGRIYXNoU2V0KG1f
ZG9jdW1lbnRTdXNwZW5zaW9uQ2FsbGJhY2tFbGVtZW50cyk7Ci0gICAgaW5mby5hZGRIYXNoU2V0
KG1fbWVkaWFWb2x1bWVDYWxsYmFja0VsZW1lbnRzKTsKLSAgICBpbmZvLmFkZEhhc2hTZXQobV9w
cml2YXRlQnJvd3NpbmdTdGF0ZUNoYW5nZWRFbGVtZW50cyk7Ci0gICAgaW5mby5hZGRIYXNoTWFw
KG1fZWxlbWVudHNCeUFjY2Vzc0tleSk7Ci0gICAgaW5mby5hZGRNZW1iZXIobV9ldmVudFF1ZXVl
KTsKLSAgICBpbmZvLmFkZEhhc2hTZXQobV9tZWRpYUNhblN0YXJ0TGlzdGVuZXJzKTsKLSAgICBp
bmZvLmFkZFZlY3RvcihtX3BlbmRpbmdUYXNrcyk7Ci19Ci0KLSNpZiBFTkFCTEUoVU5ET19NQU5B
R0VSKQotUGFzc1JlZlB0cjxVbmRvTWFuYWdlcj4gRG9jdW1lbnQ6OnVuZG9NYW5hZ2VyKCkKLXsK
LSAgICBpZiAoIW1fdW5kb01hbmFnZXIpCi0gICAgICAgIG1fdW5kb01hbmFnZXIgPSBVbmRvTWFu
YWdlcjo6Y3JlYXRlKHRoaXMpOwotICAgIHJldHVybiBtX3VuZG9NYW5hZ2VyOwotfQotI2VuZGlm
Ci0KLWNsYXNzIEltbXV0YWJsZUF0dHJpYnV0ZURhdGFDYWNoZUtleSB7Ci0gICAgV1RGX01BS0Vf
RkFTVF9BTExPQ0FURUQ7Ci1wdWJsaWM6Ci0gICAgSW1tdXRhYmxlQXR0cmlidXRlRGF0YUNhY2hl
S2V5KCkKLSAgICAgICAgOiBtX2xvY2FsTmFtZSgwKQotICAgICAgICAsIG1fYXR0cmlidXRlcygw
KQotICAgICAgICAsIG1fYXR0cmlidXRlQ291bnQoMCkKLSAgICB7IH0KLQotICAgIEltbXV0YWJs
ZUF0dHJpYnV0ZURhdGFDYWNoZUtleShjb25zdCBBdG9taWNTdHJpbmcmIGxvY2FsTmFtZSwgY29u
c3QgQXR0cmlidXRlKiBhdHRyaWJ1dGVzLCB1bnNpZ25lZCBhdHRyaWJ1dGVDb3VudCkKLSAgICAg
ICAgOiBtX2xvY2FsTmFtZShsb2NhbE5hbWUuaW1wbCgpKQotICAgICAgICAsIG1fYXR0cmlidXRl
cyhhdHRyaWJ1dGVzKQotICAgICAgICAsIG1fYXR0cmlidXRlQ291bnQoYXR0cmlidXRlQ291bnQp
Ci0gICAgeyB9Ci0KLSAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgSW1tdXRhYmxlQXR0cmlidXRl
RGF0YUNhY2hlS2V5JiBvdGhlcikgY29uc3QKLSAgICB7Ci0gICAgICAgIGlmIChtX2xvY2FsTmFt
ZSAhPSBvdGhlci5tX2xvY2FsTmFtZSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAg
ICBpZiAobV9hdHRyaWJ1dGVDb3VudCAhPSBvdGhlci5tX2F0dHJpYnV0ZUNvdW50KQotICAgICAg
ICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIHJldHVybiBtZW1jbXAobV9hdHRyaWJ1dGVzLCBv
dGhlci5tX2F0dHJpYnV0ZXMsIHNpemVvZihBdHRyaWJ1dGUpICogbV9hdHRyaWJ1dGVDb3VudCk7
Ci0gICAgfQotCi0gICAgdW5zaWduZWQgaGFzaCgpIGNvbnN0Ci0gICAgewotICAgICAgICB1bnNp
Z25lZCBhdHRyaWJ1dGVIYXNoID0gU3RyaW5nSGFzaGVyOjpoYXNoTWVtb3J5KG1fYXR0cmlidXRl
cywgbV9hdHRyaWJ1dGVDb3VudCAqIHNpemVvZihBdHRyaWJ1dGUpKTsKLSAgICAgICAgcmV0dXJu
IFdURjo6cGFpckludEhhc2gobV9sb2NhbE5hbWUtPmV4aXN0aW5nSGFzaCgpLCBhdHRyaWJ1dGVI
YXNoKTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgQXRvbWljU3RyaW5nSW1wbCogbV9sb2NhbE5h
bWU7Ci0gICAgY29uc3QgQXR0cmlidXRlKiBtX2F0dHJpYnV0ZXM7Ci0gICAgdW5zaWduZWQgbV9h
dHRyaWJ1dGVDb3VudDsKLX07Ci0KLXN0cnVjdCBJbW11dGFibGVBdHRyaWJ1dGVEYXRhQ2FjaGVF
bnRyeSB7Ci0gICAgSW1tdXRhYmxlQXR0cmlidXRlRGF0YUNhY2hlS2V5IGtleTsKLSAgICBSZWZQ
dHI8RWxlbWVudEF0dHJpYnV0ZURhdGE+IHZhbHVlOwotfTsKLQotUGFzc1JlZlB0cjxFbGVtZW50
QXR0cmlidXRlRGF0YT4gRG9jdW1lbnQ6OmNhY2hlZEltbXV0YWJsZUF0dHJpYnV0ZURhdGEoY29u
c3QgRWxlbWVudCogZWxlbWVudCwgY29uc3QgVmVjdG9yPEF0dHJpYnV0ZT4mIGF0dHJpYnV0ZXMp
Ci17Ci0gICAgQVNTRVJUKCFhdHRyaWJ1dGVzLmlzRW1wdHkoKSk7Ci0KLSAgICBJbW11dGFibGVB
dHRyaWJ1dGVEYXRhQ2FjaGVLZXkgY2FjaGVLZXkoZWxlbWVudC0+bG9jYWxOYW1lKCksIGF0dHJp
YnV0ZXMuZGF0YSgpLCBhdHRyaWJ1dGVzLnNpemUoKSk7Ci0gICAgdW5zaWduZWQgY2FjaGVIYXNo
ID0gY2FjaGVLZXkuaGFzaCgpOwotCi0gICAgSW1tdXRhYmxlQXR0cmlidXRlRGF0YUNhY2hlOjpp
dGVyYXRvciBjYWNoZUl0ZXJhdG9yID0gbV9pbW11dGFibGVBdHRyaWJ1dGVEYXRhQ2FjaGUuYWRk
KGNhY2hlSGFzaCwgbnVsbHB0cikuaXRlcmF0b3I7Ci0gICAgaWYgKGNhY2hlSXRlcmF0b3ItPnNl
Y29uZCAmJiBjYWNoZUl0ZXJhdG9yLT5zZWNvbmQtPmtleSAhPSBjYWNoZUtleSkKLSAgICAgICAg
Y2FjaGVIYXNoID0gMDsKLQotICAgIFJlZlB0cjxFbGVtZW50QXR0cmlidXRlRGF0YT4gYXR0cmli
dXRlRGF0YTsKLSAgICBpZiAoY2FjaGVIYXNoICYmIGNhY2hlSXRlcmF0b3ItPnNlY29uZCkKLSAg
ICAgICAgYXR0cmlidXRlRGF0YSA9IGNhY2hlSXRlcmF0b3ItPnNlY29uZC0+dmFsdWU7Ci0gICAg
ZWxzZQotICAgICAgICBhdHRyaWJ1dGVEYXRhID0gRWxlbWVudEF0dHJpYnV0ZURhdGE6OmNyZWF0
ZUltbXV0YWJsZShhdHRyaWJ1dGVzKTsKLQotICAgIGlmICghY2FjaGVIYXNoIHx8IGNhY2hlSXRl
cmF0b3ItPnNlY29uZCkKLSAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZURhdGEucmVsZWFzZSgpOwot
Ci0gICAgT3duUHRyPEltbXV0YWJsZUF0dHJpYnV0ZURhdGFDYWNoZUVudHJ5PiBuZXdFbnRyeSA9
IGFkb3B0UHRyKG5ldyBJbW11dGFibGVBdHRyaWJ1dGVEYXRhQ2FjaGVFbnRyeSk7Ci0gICAgbmV3
RW50cnktPmtleSA9IEltbXV0YWJsZUF0dHJpYnV0ZURhdGFDYWNoZUtleShlbGVtZW50LT5sb2Nh
bE5hbWUoKSwgY29uc3RfY2FzdDxjb25zdCBFbGVtZW50QXR0cmlidXRlRGF0YSo+KGF0dHJpYnV0
ZURhdGEuZ2V0KCkpLT5hdHRyaWJ1dGVJdGVtKDApLCBhdHRyaWJ1dGVEYXRhLT5sZW5ndGgoKSk7
Ci0gICAgbmV3RW50cnktPnZhbHVlID0gYXR0cmlidXRlRGF0YTsKLQotICAgIGNhY2hlSXRlcmF0
b3ItPnNlY29uZCA9IG5ld0VudHJ5LnJlbGVhc2UoKTsKLQotICAgIHJldHVybiBhdHRyaWJ1dGVE
YXRhLnJlbGVhc2UoKTsKKyAgICBpbmZvLmFkZE1lbWJlcihtX3ByZWZlcnJlZFN0eWxlc2hlZXRT
ZXROYW1lKTsKKyAgICBpbmZvLmFkZE1lbWJlcihtX3NlbGVjdGVkU3R5bGVzaGVldFNldE5hbWUp
OwogfQogCi1Mb2NhbGl6ZXImIERvY3VtZW50OjpnZXRMb2NhbGl6ZXIoY29uc3QgQXRvbWljU3Ry
aW5nJiBsb2NhbGUpCi17Ci0gICAgQXRvbWljU3RyaW5nIGxvY2FsZUtleSA9IGxvY2FsZTsKLSAg
ICBpZiAobG9jYWxlLmlzRW1wdHkoKSB8fCAhUnVudGltZUVuYWJsZWRGZWF0dXJlczo6bGFuZ0F0
dHJpYnV0ZUF3YXJlRm9ybUNvbnRyb2xVSUVuYWJsZWQoKSkKLSAgICAgICAgbG9jYWxlS2V5ID0g
ZGVmYXVsdExhbmd1YWdlKCk7Ci0gICAgTG9jYWxlVG9Mb2NhbGl6ZXJNYXA6OkFkZFJlc3VsdCBy
ZXN1bHQgPSBtX2xvY2FsaXplckNhY2hlLmFkZChsb2NhbGVLZXksIG51bGxwdHIpOwotICAgIGlm
IChyZXN1bHQuaXNOZXdFbnRyeSkKLSAgICAgICAgcmVzdWx0Lml0ZXJhdG9yLT5zZWNvbmQgPSBM
b2NhbGl6ZXI6OmNyZWF0ZShsb2NhbGVLZXkpOwotICAgIHJldHVybiAqKHJlc3VsdC5pdGVyYXRv
ci0+c2Vjb25kKTsKIH0KLQotfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogU291cmNlL1dl
YkNvcmUvZG9tL0RvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViQ29yZS9kb20vRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5oCShyZXZpc2lv
biAwKQorKysgU291cmNlL1dlYkNvcmUvZG9tL0RvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24u
aAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5
OTkgTGFycyBLbm9sbCAoa25vbGxAa2RlLm9yZykKKyAqICAgICAgICAgICAoQykgMTk5OSBBbnR0
aSBLb2l2aXN0byAoa29pdmlzdG9Aa2RlLm9yZykKKyAqICAgICAgICAgICAoQykgMjAwMSBEaXJr
IE11ZWxsZXIgKG11ZWxsZXJAa2RlLm9yZykKKyAqICAgICAgICAgICAoQykgMjAwNiBBbGV4ZXkg
UHJvc2t1cnlha292IChhcEB3ZWJraXQub3JnKQorICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1
LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDEyIEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSBUb3JjaCBNb2JpbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLiAoaHR0cDovL3d3dy50b3JjaG1vYmlsZS5jb20vKQorICog
Q29weXJpZ2h0IChDKSAyMDEwIE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFy
eSgtaWVzKQorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVk
aXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg
R05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBM
aWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRo
aXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNl
ZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxp
ZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQg
YSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9u
ZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3
cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmts
aW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgor
ICoKKyAqLworCisjaWZuZGVmIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb25faAorI2RlZmlu
ZSBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uX2gKKworI2luY2x1ZGUgPHd0Zi9GYXN0QWxs
b2NCYXNlLmg+CisjaW5jbHVkZSA8d3RmL0xpc3RIYXNoU2V0Lmg+CisjaW5jbHVkZSA8d3RmL1Jl
ZlB0ci5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9XVEZT
dHJpbmcuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBDU1NTdHlsZVNoZWV0Owor
Y2xhc3MgRG9jdW1lbnQ7CitjbGFzcyBOb2RlOworY2xhc3MgU3R5bGVTaGVldDsKK2NsYXNzIFN0
eWxlU2hlZXRDb250ZW50czsKK2NsYXNzIFN0eWxlU2hlZXRMaXN0OworCitjbGFzcyBEb2N1bWVu
dFN0eWxlU2hlZXRDb2xsZWN0aW9uIHsKKyAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKK3B1
YmxpYzoKKyAgICBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uKERvY3VtZW50Kik7CisgICAg
fkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24oKTsKKworICAgIFN0eWxlU2hlZXRMaXN0KiBh
dXRob3JTdHlsZVNoZWV0cygpIHsgcmV0dXJuIG1fYXV0aG9yU3R5bGVTaGVldHMuZ2V0KCk7IH0K
KworICAgIENTU1N0eWxlU2hlZXQqIHBhZ2VVc2VyU2hlZXQoKTsKKyAgICBjb25zdCBWZWN0b3I8
UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4qIHBhZ2VHcm91cFVzZXJTaGVldHMoKSBjb25zdDsKKyAg
ICBjb25zdCBWZWN0b3I8UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4qIGRvY3VtZW50VXNlclNoZWV0
cygpIGNvbnN0IHsgcmV0dXJuIG1fdXNlclNoZWV0cy5nZXQoKTsgfQorCisgICAgdm9pZCBhZGRT
dHlsZVNoZWV0Q2FuZGlkYXRlTm9kZShOb2RlKiwgYm9vbCBjcmVhdGVkQnlQYXJzZXIpOworICAg
IHZvaWQgcmVtb3ZlU3R5bGVTaGVldENhbmRpZGF0ZU5vZGUoTm9kZSopOworCisgICAgdm9pZCBj
bGVhclBhZ2VVc2VyU2hlZXQoKTsKKyAgICB2b2lkIHVwZGF0ZVBhZ2VVc2VyU2hlZXQoKTsKKyAg
ICB2b2lkIGNsZWFyUGFnZUdyb3VwVXNlclNoZWV0cygpOworICAgIHZvaWQgdXBkYXRlUGFnZUdy
b3VwVXNlclNoZWV0cygpOworCisgICAgdm9pZCBhZGRVc2VyU2hlZXQoUGFzc1JlZlB0cjxTdHls
ZVNoZWV0Q29udGVudHM+IHVzZXJTaGVldCk7CisKKyAgICBib29sIG5lZWRzVXBkYXRlQWN0aXZl
U3R5bGVzaGVldHNPblN0eWxlUmVjYWxjKCkgeyByZXR1cm4gbV9uZWVkc1VwZGF0ZUFjdGl2ZVN0
eWxlc2hlZXRzT25TdHlsZVJlY2FsYzsgfQorCisgICAgZW51bSBVcGRhdGVGbGFnIHsgRnVsbFVw
ZGF0ZSwgT3B0aW1pemVkVXBkYXRlIH07CisgICAgYm9vbCB1cGRhdGVBY3RpdmVTdHlsZVNoZWV0
cyhVcGRhdGVGbGFnKTsKKworICAgIFN0cmluZyBwcmVmZXJyZWRTdHlsZXNoZWV0U2V0TmFtZSgp
IGNvbnN0IHsgcmV0dXJuIG1fcHJlZmVycmVkU3R5bGVzaGVldFNldE5hbWU7IH0KKyAgICBTdHJp
bmcgc2VsZWN0ZWRTdHlsZXNoZWV0U2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fc2VsZWN0ZWRT
dHlsZXNoZWV0U2V0TmFtZTsgfQorICAgIHZvaWQgc2V0UHJlZmVycmVkU3R5bGVzaGVldFNldE5h
bWUoY29uc3QgU3RyaW5nJiBuYW1lKSB7IG1fcHJlZmVycmVkU3R5bGVzaGVldFNldE5hbWUgPSBu
YW1lOyB9CisgICAgdm9pZCBzZXRTZWxlY3RlZFN0eWxlc2hlZXRTZXROYW1lKGNvbnN0IFN0cmlu
ZyYgbmFtZSkgeyBtX3NlbGVjdGVkU3R5bGVzaGVldFNldE5hbWUgPSBuYW1lOyB9CisKKyAgICB2
b2lkIGFkZFBlbmRpbmdTaGVldCgpIHsgbV9wZW5kaW5nU3R5bGVzaGVldHMrKzsgfQorICAgIGVu
dW0gUmVtb3ZlUGVuZGluZ1NoZWV0Tm90aWZpY2F0aW9uVHlwZSB7CisgICAgICAgIFJlbW92ZVBl
bmRpbmdTaGVldE5vdGlmeUltbWVkaWF0ZWx5LAorICAgICAgICBSZW1vdmVQZW5kaW5nU2hlZXRO
b3RpZnlMYXRlcgorICAgIH07CisgICAgdm9pZCByZW1vdmVQZW5kaW5nU2hlZXQoUmVtb3ZlUGVu
ZGluZ1NoZWV0Tm90aWZpY2F0aW9uVHlwZSA9IFJlbW92ZVBlbmRpbmdTaGVldE5vdGlmeUltbWVk
aWF0ZWx5KTsKKworICAgIGJvb2wgaGFzUGVuZGluZ1NoZWV0cygpIGNvbnN0IHsgcmV0dXJuIG1f
cGVuZGluZ1N0eWxlc2hlZXRzID4gMDsgfQorCisgICAgYm9vbCB1c2VzU2libGluZ1J1bGVzKCkg
Y29uc3QgeyByZXR1cm4gbV91c2VzU2libGluZ1J1bGVzIHx8IG1fdXNlc1NpYmxpbmdSdWxlc092
ZXJyaWRlOyB9CisgICAgdm9pZCBzZXRVc2VzU2libGluZ1J1bGVzT3ZlcnJpZGUoYm9vbCBiKSB7
IG1fdXNlc1NpYmxpbmdSdWxlc092ZXJyaWRlID0gYjsgfQorICAgIGJvb2wgdXNlc0ZpcnN0TGlu
ZVJ1bGVzKCkgY29uc3QgeyByZXR1cm4gbV91c2VzRmlyc3RMaW5lUnVsZXM7IH0KKyAgICBib29s
IHVzZXNGaXJzdExldHRlclJ1bGVzKCkgY29uc3QgeyByZXR1cm4gbV91c2VzRmlyc3RMZXR0ZXJS
dWxlczsgfQorICAgIHZvaWQgc2V0VXNlc0ZpcnN0TGV0dGVyUnVsZXMoYm9vbCBiKSB7IG1fdXNl
c0ZpcnN0TGV0dGVyUnVsZXMgPSBiOyB9CisgICAgYm9vbCB1c2VzQmVmb3JlQWZ0ZXJSdWxlcygp
IGNvbnN0IHsgcmV0dXJuIG1fdXNlc0JlZm9yZUFmdGVyUnVsZXMgfHwgbV91c2VzQmVmb3JlQWZ0
ZXJSdWxlc092ZXJyaWRlOyB9CisgICAgdm9pZCBzZXRVc2VzQmVmb3JlQWZ0ZXJSdWxlc092ZXJy
aWRlKGJvb2wgYikgeyBtX3VzZXNCZWZvcmVBZnRlclJ1bGVzT3ZlcnJpZGUgPSBiOyB9CisgICAg
Ym9vbCB1c2VzUmVtVW5pdHMoKSBjb25zdCB7IHJldHVybiBtX3VzZXNSZW1Vbml0czsgfQorICAg
IHZvaWQgc2V0VXNlc1JlbVVuaXQoYm9vbCBiKSB7IG1fdXNlc1JlbVVuaXRzID0gYjsgfQorCisg
ICAgdm9pZCBjb21iaW5lQ1NTRmVhdHVyZUZsYWdzKCk7CisgICAgdm9pZCByZXNldENTU0ZlYXR1
cmVGbGFncygpOworCisgICAgdm9pZCByZXBvcnRNZW1vcnlVc2FnZShNZW1vcnlPYmplY3RJbmZv
KikgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgdm9pZCBjb2xsZWN0QWN0aXZlU3R5bGVTaGVldHMo
VmVjdG9yPFJlZlB0cjxTdHlsZVNoZWV0PiA+Jik7CisgICAgYm9vbCB0ZXN0QWRkZWRTdHlsZVNo
ZWV0UmVxdWlyZXNTdHlsZVJlY2FsYyhTdHlsZVNoZWV0Q29udGVudHMqKTsKKyAgICB2b2lkIGFu
YWx5emVTdHlsZVNoZWV0Q2hhbmdlKFVwZGF0ZUZsYWcsIGNvbnN0IFZlY3RvcjxSZWZQdHI8U3R5
bGVTaGVldD4gPiYgbmV3U3R5bGVzaGVldHMsIGJvb2wmIHJlcXVpcmVzU3R5bGVSZXNvbHZlclJl
c2V0LCBib29sJiByZXF1aXJlc0Z1bGxTdHlsZVJlY2FsYyk7CisKKyAgICBEb2N1bWVudCogbV9k
b2N1bWVudDsKKworICAgIFJlZlB0cjxTdHlsZVNoZWV0TGlzdD4gbV9hdXRob3JTdHlsZVNoZWV0
czsKKworICAgIC8vIFRyYWNrIHRoZSBudW1iZXIgb2YgY3VycmVudGx5IGxvYWRpbmcgdG9wLWxl
dmVsIHN0eWxlc2hlZXRzIG5lZWRlZCBmb3IgcmVuZGVyaW5nLgorICAgIC8vIFNoZWV0cyBsb2Fk
ZWQgdXNpbmcgdGhlIEBpbXBvcnQgZGlyZWN0aXZlIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhpcyBj
b3VudC4KKyAgICAvLyBXZSB1c2UgdGhpcyBjb3VudCBvZiBwZW5kaW5nIHNoZWV0cyB0byBkZXRl
Y3Qgd2hlbiB3ZSBjYW4gYmVnaW4gYXR0YWNoaW5nCisgICAgLy8gZWxlbWVudHMgYW5kIHdoZW4g
aXQgaXMgc2FmZSB0byBleGVjdXRlIHNjcmlwdHMuCisgICAgaW50IG1fcGVuZGluZ1N0eWxlc2hl
ZXRzOworCisgICAgUmVmUHRyPENTU1N0eWxlU2hlZXQ+IG1fcGFnZVVzZXJTaGVldDsKKyAgICBt
dXRhYmxlIE93blB0cjxWZWN0b3I8UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4gPiBtX3BhZ2VHcm91
cFVzZXJTaGVldHM7CisgICAgT3duUHRyPFZlY3RvcjxSZWZQdHI8Q1NTU3R5bGVTaGVldD4gPiA+
IG1fdXNlclNoZWV0czsKKyAgICBtdXRhYmxlIGJvb2wgbV9wYWdlR3JvdXBVc2VyU2hlZXRDYWNo
ZVZhbGlkOworCisgICAgYm9vbCBtX2hhZEFjdGl2ZUxvYWRpbmdTdHlsZXNoZWV0OworICAgIGJv
b2wgbV9uZWVkc1VwZGF0ZUFjdGl2ZVN0eWxlc2hlZXRzT25TdHlsZVJlY2FsYzsKKworICAgIHR5
cGVkZWYgTGlzdEhhc2hTZXQ8Tm9kZSosIDMyPiBTdHlsZVNoZWV0Q2FuZGlkYXRlTGlzdEhhc2hT
ZXQ7CisgICAgU3R5bGVTaGVldENhbmRpZGF0ZUxpc3RIYXNoU2V0IG1fc3R5bGVTaGVldENhbmRp
ZGF0ZU5vZGVzOworCisgICAgU3RyaW5nIG1fcHJlZmVycmVkU3R5bGVzaGVldFNldE5hbWU7Cisg
ICAgU3RyaW5nIG1fc2VsZWN0ZWRTdHlsZXNoZWV0U2V0TmFtZTsKKworICAgIGJvb2wgbV91c2Vz
U2libGluZ1J1bGVzOworICAgIGJvb2wgbV91c2VzU2libGluZ1J1bGVzT3ZlcnJpZGU7CisgICAg
Ym9vbCBtX3VzZXNGaXJzdExpbmVSdWxlczsKKyAgICBib29sIG1fdXNlc0ZpcnN0TGV0dGVyUnVs
ZXM7CisgICAgYm9vbCBtX3VzZXNCZWZvcmVBZnRlclJ1bGVzOworICAgIGJvb2wgbV91c2VzQmVm
b3JlQWZ0ZXJSdWxlc092ZXJyaWRlOworICAgIGJvb2wgbV91c2VzUmVtVW5pdHM7Cit9OworCit9
CisKKyNlbmRpZgorCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9kb20vRWxlbWVudC5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYkNvcmUvZG9tL0VsZW1lbnQuY3BwCShyZXZpc2lvbiAxMjkzMDMp
CisrKyBTb3VyY2UvV2ViQ29yZS9kb20vRWxlbWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEx
NzksNyArMTE3OSw3IEBAIHZvaWQgRWxlbWVudDo6cmVjYWxjU3R5bGUoU3R5bGVDaGFuZ2UgY2gK
IAogICAgICAgICAvLyBJZiAicmVtIiB1bml0cyBhcmUgdXNlZCBhbnl3aGVyZSBpbiB0aGUgZG9j
dW1lbnQsIGFuZCBpZiB0aGUgZG9jdW1lbnQgZWxlbWVudCdzIGZvbnQgc2l6ZSBjaGFuZ2VzLCB0
aGVuIGdvIGFoZWFkIGFuZCBmb3JjZSBmb250IHVwZGF0aW5nCiAgICAgICAgIC8vIGFsbCB0aGUg
d2F5IGRvd24gdGhlIHRyZWUuIFRoaXMgaXMgc2ltcGxlciB0aGFuIGhhdmluZyB0byBtYWludGFp
biBhIGNhY2hlIG9mIG9iamVjdHMgKGFuZCBzdWNoIGZvbnQgc2l6ZSBjaGFuZ2VzIHNob3VsZCBi
ZSByYXJlIGFueXdheSkuCi0gICAgICAgIGlmIChkb2N1bWVudCgpLT51c2VzUmVtVW5pdHMoKSAm
JiBkb2N1bWVudCgpLT5kb2N1bWVudEVsZW1lbnQoKSA9PSB0aGlzICYmIGNoICE9IE5vQ2hhbmdl
ICYmIGN1cnJlbnRTdHlsZSAmJiBuZXdTdHlsZSAmJiBjdXJyZW50U3R5bGUtPmZvbnRTaXplKCkg
IT0gbmV3U3R5bGUtPmZvbnRTaXplKCkpIHsKKyAgICAgICAgaWYgKGRvY3VtZW50KCktPnN0eWxl
U2hlZXRDb2xsZWN0aW9uKCktPnVzZXNSZW1Vbml0cygpICYmIGRvY3VtZW50KCktPmRvY3VtZW50
RWxlbWVudCgpID09IHRoaXMgJiYgY2ggIT0gTm9DaGFuZ2UgJiYgY3VycmVudFN0eWxlICYmIG5l
d1N0eWxlICYmIGN1cnJlbnRTdHlsZS0+Zm9udFNpemUoKSAhPSBuZXdTdHlsZS0+Zm9udFNpemUo
KSkgewogICAgICAgICAgICAgLy8gQ2FjaGVkIFJlbmRlclN0eWxlcyBtYXkgZGVwZW5kIG9uIHRo
ZSByZW0gdW5pdHMuCiAgICAgICAgICAgICBkb2N1bWVudCgpLT5zdHlsZVJlc29sdmVyKCktPmlu
dmFsaWRhdGVNYXRjaGVkUHJvcGVydGllc0NhY2hlKCk7CiAgICAgICAgICAgICBjaGFuZ2UgPSBG
b3JjZTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2RvbS9Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb24uY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2RvbS9Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb24u
Y3BwCShyZXZpc2lvbiAxMjkzMDMpCisrKyBTb3VyY2UvV2ViQ29yZS9kb20vUHJvY2Vzc2luZ0lu
c3RydWN0aW9uLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjMsOSArMjMsMTAgQEAKIAogI2luY2x1
ZGUgIkNTU1N0eWxlU2hlZXQuaCIKICNpbmNsdWRlICJDYWNoZWRDU1NTdHlsZVNoZWV0LmgiCisj
aW5jbHVkZSAiQ2FjaGVkUmVzb3VyY2VMb2FkZXIuaCIKICNpbmNsdWRlICJDYWNoZWRYU0xTdHls
ZVNoZWV0LmgiCiAjaW5jbHVkZSAiRG9jdW1lbnQuaCIKLSNpbmNsdWRlICJDYWNoZWRSZXNvdXJj
ZUxvYWRlci5oIgorI2luY2x1ZGUgIkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uaCIKICNp
bmNsdWRlICJFeGNlcHRpb25Db2RlLmgiCiAjaW5jbHVkZSAiRnJhbWUuaCIKICNpbmNsdWRlICJG
cmFtZUxvYWRlci5oIgpAQCAtNjUsNyArNjYsNyBAQCBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb246On5Q
cm9jZXNzaW5nSW5zdHJ1CiAgICAgICAgIG1fY2FjaGVkU2hlZXQtPnJlbW92ZUNsaWVudCh0aGlz
KTsKIAogICAgIGlmIChpbkRvY3VtZW50KCkpCi0gICAgICAgIGRvY3VtZW50KCktPnJlbW92ZVN0
eWxlU2hlZXRDYW5kaWRhdGVOb2RlKHRoaXMpOworICAgICAgICBkb2N1bWVudCgpLT5zdHlsZVNo
ZWV0Q29sbGVjdGlvbigpLT5yZW1vdmVTdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZSh0aGlzKTsKIH0K
IAogdm9pZCBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb246OnNldERhdGEoY29uc3QgU3RyaW5nJiBkYXRh
LCBFeGNlcHRpb25Db2RlJikKQEAgLTE2MCw3ICsxNjEsNyBAQCB2b2lkIFByb2Nlc3NpbmdJbnN0
cnVjdGlvbjo6Y2hlY2tTdHlsZVNoCiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAg
ICAgCiAgICAgICAgICAgICBtX2xvYWRpbmcgPSB0cnVlOwotICAgICAgICAgICAgZG9jdW1lbnQo
KS0+YWRkUGVuZGluZ1NoZWV0KCk7CisgICAgICAgICAgICBkb2N1bWVudCgpLT5zdHlsZVNoZWV0
Q29sbGVjdGlvbigpLT5hZGRQZW5kaW5nU2hlZXQoKTsKICAgICAgICAgICAgIAogICAgICAgICAg
ICAgUmVzb3VyY2VSZXF1ZXN0IHJlcXVlc3QoZG9jdW1lbnQoKS0+Y29tcGxldGVVUkwoaHJlZikp
OwogI2lmIEVOQUJMRShYU0xUKQpAQCAtMTgwLDcgKzE4MSw3IEBAIHZvaWQgUHJvY2Vzc2luZ0lu
c3RydWN0aW9uOjpjaGVja1N0eWxlU2gKICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAg
ICAgIC8vIFRoZSByZXF1ZXN0IG1heSBoYXZlIGJlZW4gZGVuaWVkIGlmIChmb3IgZXhhbXBsZSkg
dGhlIHN0eWxlc2hlZXQgaXMgbG9jYWwgYW5kIHRoZSBkb2N1bWVudCBpcyByZW1vdGUuCiAgICAg
ICAgICAgICAgICAgbV9sb2FkaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZG9jdW1lbnQo
KS0+cmVtb3ZlUGVuZGluZ1NoZWV0KCk7CisgICAgICAgICAgICAgICAgZG9jdW1lbnQoKS0+c3R5
bGVTaGVldENvbGxlY3Rpb24oKS0+cmVtb3ZlUGVuZGluZ1NoZWV0KCk7CiAgICAgICAgICAgICB9
CiAgICAgICAgIH0KICAgICB9CkBAIC0xOTgsNyArMTk5LDcgQEAgYm9vbCBQcm9jZXNzaW5nSW5z
dHJ1Y3Rpb246OmlzTG9hZGluZygpIAogYm9vbCBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb246OnNoZWV0
TG9hZGVkKCkKIHsKICAgICBpZiAoIWlzTG9hZGluZygpKSB7Ci0gICAgICAgIGRvY3VtZW50KCkt
PnJlbW92ZVBlbmRpbmdTaGVldCgpOworICAgICAgICBkb2N1bWVudCgpLT5zdHlsZVNoZWV0Q29s
bGVjdGlvbigpLT5yZW1vdmVQZW5kaW5nU2hlZXQoKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAg
ICAgfQogICAgIHJldHVybiBmYWxzZTsKQEAgLTI5Myw3ICsyOTQsNyBAQCBOb2RlOjpJbnNlcnRp
b25Ob3RpZmljYXRpb25SZXF1ZXN0IFByb2NlCiAgICAgTm9kZTo6aW5zZXJ0ZWRJbnRvKGluc2Vy
dGlvblBvaW50KTsKICAgICBpZiAoIWluc2VydGlvblBvaW50LT5pbkRvY3VtZW50KCkpCiAgICAg
ICAgIHJldHVybiBJbnNlcnRpb25Eb25lOwotICAgIGRvY3VtZW50KCktPmFkZFN0eWxlU2hlZXRD
YW5kaWRhdGVOb2RlKHRoaXMsIG1fY3JlYXRlZEJ5UGFyc2VyKTsKKyAgICBkb2N1bWVudCgpLT5z
dHlsZVNoZWV0Q29sbGVjdGlvbigpLT5hZGRTdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZSh0aGlzLCBt
X2NyZWF0ZWRCeVBhcnNlcik7CiAgICAgY2hlY2tTdHlsZVNoZWV0KCk7CiAgICAgcmV0dXJuIElu
c2VydGlvbkRvbmU7CiB9CkBAIC0zMDQsNyArMzA1LDcgQEAgdm9pZCBQcm9jZXNzaW5nSW5zdHJ1
Y3Rpb246OnJlbW92ZWRGcm9tKAogICAgIGlmICghaW5zZXJ0aW9uUG9pbnQtPmluRG9jdW1lbnQo
KSkKICAgICAgICAgcmV0dXJuOwogICAgIAotICAgIGRvY3VtZW50KCktPnJlbW92ZVN0eWxlU2hl
ZXRDYW5kaWRhdGVOb2RlKHRoaXMpOworICAgIGRvY3VtZW50KCktPnN0eWxlU2hlZXRDb2xsZWN0
aW9uKCktPnJlbW92ZVN0eWxlU2hlZXRDYW5kaWRhdGVOb2RlKHRoaXMpOwogCiAgICAgaWYgKG1f
c2hlZXQpIHsKICAgICAgICAgQVNTRVJUKG1fc2hlZXQtPm93bmVyTm9kZSgpID09IHRoaXMpOwpJ
bmRleDogU291cmNlL1dlYkNvcmUvZG9tL1N0eWxlRWxlbWVudC5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYkNvcmUvZG9tL1N0eWxlRWxlbWVudC5jcHAJKHJldmlzaW9uIDEyOTMwMykKKysr
IFNvdXJjZS9XZWJDb3JlL2RvbS9TdHlsZUVsZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0y
NCw2ICsyNCw3IEBACiAjaW5jbHVkZSAiQXR0cmlidXRlLmgiCiAjaW5jbHVkZSAiQ29udGVudFNl
Y3VyaXR5UG9saWN5LmgiCiAjaW5jbHVkZSAiRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJEb2N1bWVu
dFN0eWxlU2hlZXRDb2xsZWN0aW9uLmgiCiAjaW5jbHVkZSAiRWxlbWVudC5oIgogI2luY2x1ZGUg
Ik1lZGlhTGlzdC5oIgogI2luY2x1ZGUgIk1lZGlhUXVlcnlFdmFsdWF0b3IuaCIKQEAgLTYzLDcg
KzY0LDcgQEAgdm9pZCBTdHlsZUVsZW1lbnQ6Omluc2VydGVkSW50b0RvY3VtZW50KAogewogICAg
IEFTU0VSVChkb2N1bWVudCk7CiAgICAgQVNTRVJUKGVsZW1lbnQpOwotICAgIGRvY3VtZW50LT5h
ZGRTdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZShlbGVtZW50LCBtX2NyZWF0ZWRCeVBhcnNlcik7Cisg
ICAgZG9jdW1lbnQtPnN0eWxlU2hlZXRDb2xsZWN0aW9uKCktPmFkZFN0eWxlU2hlZXRDYW5kaWRh
dGVOb2RlKGVsZW1lbnQsIG1fY3JlYXRlZEJ5UGFyc2VyKTsKICAgICBpZiAobV9jcmVhdGVkQnlQ
YXJzZXIpCiAgICAgICAgIHJldHVybjsKIApAQCAtNzQsNyArNzUsNyBAQCB2b2lkIFN0eWxlRWxl
bWVudDo6cmVtb3ZlZEZyb21Eb2N1bWVudChECiB7CiAgICAgQVNTRVJUKGRvY3VtZW50KTsKICAg
ICBBU1NFUlQoZWxlbWVudCk7Ci0gICAgZG9jdW1lbnQtPnJlbW92ZVN0eWxlU2hlZXRDYW5kaWRh
dGVOb2RlKGVsZW1lbnQpOworICAgIGRvY3VtZW50LT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpLT5y
ZW1vdmVTdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZShlbGVtZW50KTsKIAogICAgIGlmIChtX3NoZWV0
KQogICAgICAgICBjbGVhclNoZWV0KCk7CkBAIC05MCw3ICs5MSw3IEBAIHZvaWQgU3R5bGVFbGVt
ZW50OjpjbGVhckRvY3VtZW50RGF0YShEb2MKICAgICAgICAgbV9zaGVldC0+Y2xlYXJPd25lck5v
ZGUoKTsKIAogICAgIGlmIChlbGVtZW50LT5pbkRvY3VtZW50KCkpCi0gICAgICAgIGRvY3VtZW50
LT5yZW1vdmVTdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZShlbGVtZW50KTsKKyAgICAgICAgZG9jdW1l
bnQtPnN0eWxlU2hlZXRDb2xsZWN0aW9uKCktPnJlbW92ZVN0eWxlU2hlZXRDYW5kaWRhdGVOb2Rl
KGVsZW1lbnQpOwogfQogCiB2b2lkIFN0eWxlRWxlbWVudDo6Y2hpbGRyZW5DaGFuZ2VkKEVsZW1l
bnQqIGVsZW1lbnQpCkBAIC0xNTIsNyArMTUzLDcgQEAgdm9pZCBTdHlsZUVsZW1lbnQ6OmNyZWF0
ZVNoZWV0KEVsZW1lbnQqIAogICAgIERvY3VtZW50KiBkb2N1bWVudCA9IGUtPmRvY3VtZW50KCk7
CiAgICAgaWYgKG1fc2hlZXQpIHsKICAgICAgICAgaWYgKG1fc2hlZXQtPmlzTG9hZGluZygpKQot
ICAgICAgICAgICAgZG9jdW1lbnQtPnJlbW92ZVBlbmRpbmdTaGVldCgpOworICAgICAgICAgICAg
ZG9jdW1lbnQtPnN0eWxlU2hlZXRDb2xsZWN0aW9uKCktPnJlbW92ZVBlbmRpbmdTaGVldCgpOwog
ICAgICAgICBjbGVhclNoZWV0KCk7CiAgICAgfQogCkBAIC0xNjgsNyArMTY5LDcgQEAgdm9pZCBT
dHlsZUVsZW1lbnQ6OmNyZWF0ZVNoZWV0KEVsZW1lbnQqIAogICAgICAgICBNZWRpYVF1ZXJ5RXZh
bHVhdG9yIHNjcmVlbkV2YWwoInNjcmVlbiIsIHRydWUpOwogICAgICAgICBNZWRpYVF1ZXJ5RXZh
bHVhdG9yIHByaW50RXZhbCgicHJpbnQiLCB0cnVlKTsKICAgICAgICAgaWYgKHNjcmVlbkV2YWwu
ZXZhbChtZWRpYVF1ZXJpZXMuZ2V0KCkpIHx8IHByaW50RXZhbC5ldmFsKG1lZGlhUXVlcmllcy5n
ZXQoKSkpIHsKLSAgICAgICAgICAgIGRvY3VtZW50LT5hZGRQZW5kaW5nU2hlZXQoKTsKKyAgICAg
ICAgICAgIGRvY3VtZW50LT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpLT5hZGRQZW5kaW5nU2hlZXQo
KTsKICAgICAgICAgICAgIG1fbG9hZGluZyA9IHRydWU7CiAKICAgICAgICAgICAgIG1fc2hlZXQg
PSBDU1NTdHlsZVNoZWV0OjpjcmVhdGVJbmxpbmUoZSwgS1VSTCgpLCBkb2N1bWVudC0+aW5wdXRF
bmNvZGluZygpKTsKQEAgLTE5NywxNCArMTk4LDE0IEBAIGJvb2wgU3R5bGVFbGVtZW50OjpzaGVl
dExvYWRlZChEb2N1bWVudCoKICAgICBpZiAoaXNMb2FkaW5nKCkpCiAgICAgICAgIHJldHVybiBm
YWxzZTsKIAotICAgIGRvY3VtZW50LT5yZW1vdmVQZW5kaW5nU2hlZXQoKTsKKyAgICBkb2N1bWVu
dC0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+cmVtb3ZlUGVuZGluZ1NoZWV0KCk7CiAgICAgcmV0
dXJuIHRydWU7CiB9CiAKIHZvaWQgU3R5bGVFbGVtZW50OjpzdGFydExvYWRpbmdEeW5hbWljU2hl
ZXQoRG9jdW1lbnQqIGRvY3VtZW50KQogewogICAgIEFTU0VSVChkb2N1bWVudCk7Ci0gICAgZG9j
dW1lbnQtPmFkZFBlbmRpbmdTaGVldCgpOworICAgIGRvY3VtZW50LT5zdHlsZVNoZWV0Q29sbGVj
dGlvbigpLT5hZGRQZW5kaW5nU2hlZXQoKTsKIH0KIAogfQpJbmRleDogU291cmNlL1dlYkNvcmUv
aHRtbC9IVE1MTGlua0VsZW1lbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2h0
bWwvSFRNTExpbmtFbGVtZW50LmNwcAkocmV2aXNpb24gMTI5MzAzKQorKysgU291cmNlL1dlYkNv
cmUvaHRtbC9IVE1MTGlua0VsZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMCw2ICszMCw3
IEBACiAjaW5jbHVkZSAiQ2FjaGVkUmVzb3VyY2UuaCIKICNpbmNsdWRlICJDYWNoZWRSZXNvdXJj
ZUxvYWRlci5oIgogI2luY2x1ZGUgIkRvY3VtZW50LmgiCisjaW5jbHVkZSAiRG9jdW1lbnRTdHls
ZVNoZWV0Q29sbGVjdGlvbi5oIgogI2luY2x1ZGUgIkV2ZW50U2VuZGVyLmgiCiAjaW5jbHVkZSAi
RnJhbWUuaCIKICNpbmNsdWRlICJGcmFtZUxvYWRlci5oIgpAQCAtODcsNyArODgsNyBAQCBIVE1M
TGlua0VsZW1lbnQ6On5IVE1MTGlua0VsZW1lbnQoKQogICAgICAgICBtX2NhY2hlZFNoZWV0LT5y
ZW1vdmVDbGllbnQodGhpcyk7CiAKICAgICBpZiAoaW5Eb2N1bWVudCgpKQotICAgICAgICBkb2N1
bWVudCgpLT5yZW1vdmVTdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZSh0aGlzKTsKKyAgICAgICAgZG9j
dW1lbnQoKS0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+cmVtb3ZlU3R5bGVTaGVldENhbmRpZGF0
ZU5vZGUodGhpcyk7CiAKICAgICBsaW5rTG9hZEV2ZW50U2VuZGVyKCkuY2FuY2VsRXZlbnQodGhp
cyk7CiB9CkBAIC0yNTQsNyArMjU1LDcgQEAgTm9kZTo6SW5zZXJ0aW9uTm90aWZpY2F0aW9uUmVx
dWVzdCBIVE1MTAogICAgIGlmIChtX2lzSW5TaGFkb3dUcmVlKQogICAgICAgICByZXR1cm4gSW5z
ZXJ0aW9uRG9uZTsKIAotICAgIGRvY3VtZW50KCktPmFkZFN0eWxlU2hlZXRDYW5kaWRhdGVOb2Rl
KHRoaXMsIG1fY3JlYXRlZEJ5UGFyc2VyKTsKKyAgICBkb2N1bWVudCgpLT5zdHlsZVNoZWV0Q29s
bGVjdGlvbigpLT5hZGRTdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZSh0aGlzLCBtX2NyZWF0ZWRCeVBh
cnNlcik7CiAKICAgICBwcm9jZXNzKCk7CiAgICAgcmV0dXJuIEluc2VydGlvbkRvbmU7CkBAIC0y
NzIsNyArMjczLDcgQEAgdm9pZCBIVE1MTGlua0VsZW1lbnQ6OnJlbW92ZWRGcm9tKENvbnRhaQog
ICAgICAgICBBU1NFUlQoIW1fc2hlZXQpOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGRv
Y3VtZW50KCktPnJlbW92ZVN0eWxlU2hlZXRDYW5kaWRhdGVOb2RlKHRoaXMpOworICAgIGRvY3Vt
ZW50KCktPnN0eWxlU2hlZXRDb2xsZWN0aW9uKCktPnJlbW92ZVN0eWxlU2hlZXRDYW5kaWRhdGVO
b2RlKHRoaXMpOwogCiAgICAgaWYgKG1fc2hlZXQpCiAgICAgICAgIGNsZWFyU2hlZXQoKTsKQEAg
LTQ1NSw3ICs0NTYsNyBAQCB2b2lkIEhUTUxMaW5rRWxlbWVudDo6YWRkUGVuZGluZ1NoZWV0KFBl
CiAKICAgICBpZiAobV9wZW5kaW5nU2hlZXRUeXBlID09IE5vbkJsb2NraW5nKQogICAgICAgICBy
ZXR1cm47Ci0gICAgZG9jdW1lbnQoKS0+YWRkUGVuZGluZ1NoZWV0KCk7CisgICAgZG9jdW1lbnQo
KS0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+YWRkUGVuZGluZ1NoZWV0KCk7CiB9CiAKIHZvaWQg
SFRNTExpbmtFbGVtZW50OjpyZW1vdmVQZW5kaW5nU2hlZXQoUmVtb3ZlUGVuZGluZ1NoZWV0Tm90
aWZpY2F0aW9uVHlwZSBub3RpZmljYXRpb24pCkBAIC00NzEsMTAgKzQ3MiwxMCBAQCB2b2lkIEhU
TUxMaW5rRWxlbWVudDo6cmVtb3ZlUGVuZGluZ1NoZWV0CiAgICAgICAgIHJldHVybjsKICAgICB9
CiAKLSAgICBkb2N1bWVudCgpLT5yZW1vdmVQZW5kaW5nU2hlZXQoCisgICAgZG9jdW1lbnQoKS0+
c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+cmVtb3ZlUGVuZGluZ1NoZWV0KAogICAgICAgICBub3Rp
ZmljYXRpb24gPT0gUmVtb3ZlUGVuZGluZ1NoZWV0Tm90aWZ5SW1tZWRpYXRlbHkKLSAgICAgICAg
PyBEb2N1bWVudDo6UmVtb3ZlUGVuZGluZ1NoZWV0Tm90aWZ5SW1tZWRpYXRlbHkKLSAgICAgICAg
OiBEb2N1bWVudDo6UmVtb3ZlUGVuZGluZ1NoZWV0Tm90aWZ5TGF0ZXIpOworICAgICAgICA/IERv
Y3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OlJlbW92ZVBlbmRpbmdTaGVldE5vdGlmeUltbWVk
aWF0ZWx5CisgICAgICAgIDogRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6UmVtb3ZlUGVu
ZGluZ1NoZWV0Tm90aWZ5TGF0ZXIpOwogfQogCiBET01TZXR0YWJsZVRva2VuTGlzdCogSFRNTExp
bmtFbGVtZW50OjpzaXplcygpIGNvbnN0CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxR
dW90ZUVsZW1lbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2h0bWwvSFRNTFF1
b3RlRWxlbWVudC5jcHAJKHJldmlzaW9uIDEyOTMwMykKKysrIFNvdXJjZS9XZWJDb3JlL2h0bWwv
SFRNTFF1b3RlRWxlbWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI0LDYgKzI0LDcgQEAKICNp
bmNsdWRlICJIVE1MUXVvdGVFbGVtZW50LmgiCiAKICNpbmNsdWRlICJEb2N1bWVudC5oIgorI2lu
Y2x1ZGUgIkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uaCIKICNpbmNsdWRlICJIVE1MTmFt
ZXMuaCIKIAogbmFtZXNwYWNlIFdlYkNvcmUgewpAQCAtNDQsNyArNDUsNyBAQCBQYXNzUmVmUHRy
PEhUTUxRdW90ZUVsZW1lbnQ+IEhUTUxRdW90ZUVsCiBOb2RlOjpJbnNlcnRpb25Ob3RpZmljYXRp
b25SZXF1ZXN0IEhUTUxRdW90ZUVsZW1lbnQ6Omluc2VydGVkSW50byhDb250YWluZXJOb2RlKiBp
bnNlcnRpb25Qb2ludCkKIHsKICAgICBpZiAoaGFzVGFnTmFtZShxVGFnKSkKLSAgICAgICAgZG9j
dW1lbnQoKS0+c2V0VXNlc0JlZm9yZUFmdGVyUnVsZXModHJ1ZSk7CisgICAgICAgIGRvY3VtZW50
KCktPnN0eWxlU2hlZXRDb2xsZWN0aW9uKCktPnNldFVzZXNCZWZvcmVBZnRlclJ1bGVzT3ZlcnJp
ZGUodHJ1ZSk7CiAKICAgICByZXR1cm4gSFRNTEVsZW1lbnQ6Omluc2VydGVkSW50byhpbnNlcnRp
b25Qb2ludCk7CiB9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxWaWV3U291cmNlRG9j
dW1lbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2h0bWwvSFRNTFZpZXdTb3Vy
Y2VEb2N1bWVudC5jcHAJKHJldmlzaW9uIDEyOTMwMykKKysrIFNvdXJjZS9XZWJDb3JlL2h0bWwv
SFRNTFZpZXdTb3VyY2VEb2N1bWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI3LDYgKzI3LDcg
QEAKIAogI2luY2x1ZGUgIkF0dHJpYnV0ZS5oIgogI2luY2x1ZGUgIkRPTUltcGxlbWVudGF0aW9u
LmgiCisjaW5jbHVkZSAiRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5oIgogI2luY2x1ZGUg
IkhUTUxBbmNob3JFbGVtZW50LmgiCiAjaW5jbHVkZSAiSFRNTEJSRWxlbWVudC5oIgogI2luY2x1
ZGUgIkhUTUxCYXNlRWxlbWVudC5oIgpAQCAtNTIsNyArNTMsNyBAQCBIVE1MVmlld1NvdXJjZURv
Y3VtZW50OjpIVE1MVmlld1NvdXJjZURvCiAgICAgOiBIVE1MRG9jdW1lbnQoZnJhbWUsIHVybCkK
ICAgICAsIG1fdHlwZShtaW1lVHlwZSkKIHsKLSAgICBzZXRVc2VzQmVmb3JlQWZ0ZXJSdWxlcyh0
cnVlKTsKKyAgICBzdHlsZVNoZWV0Q29sbGVjdGlvbigpLT5zZXRVc2VzQmVmb3JlQWZ0ZXJSdWxl
c092ZXJyaWRlKHRydWUpOwogICAgIHNldElzVmlld1NvdXJjZSh0cnVlKTsKIAogICAgIHNldENv
bXBhdGliaWxpdHlNb2RlKFF1aXJrc01vZGUpOwpJbmRleDogU291cmNlL1dlYkNvcmUvbWF0aG1s
L01hdGhNTE1hdGhFbGVtZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9tYXRo
bWwvTWF0aE1MTWF0aEVsZW1lbnQuY3BwCShyZXZpc2lvbiAxMjkzMDMpCisrKyBTb3VyY2UvV2Vi
Q29yZS9tYXRobWwvTWF0aE1MTWF0aEVsZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00Nyw3
ICs0Nyw3IEBAIE5vZGU6Okluc2VydGlvbk5vdGlmaWNhdGlvblJlcXVlc3QgTWF0aE0KIHsKICAg
ICAvLyBUaGVyZSBhcmUgc2libGluZyBydWxlcyBpbiB0aGUgTWF0aE1MIGRlZmF1bHQgc3R5bGUu
CiAgICAgaWYgKGluc2VydGlvblBvaW50LT5pbkRvY3VtZW50KCkpCi0gICAgICAgIGRvY3VtZW50
KCktPnNldFVzZXNTaWJsaW5nUnVsZXModHJ1ZSk7CisgICAgICAgIGRvY3VtZW50KCktPnN0eWxl
U2hlZXRDb2xsZWN0aW9uKCktPnNldFVzZXNTaWJsaW5nUnVsZXNPdmVycmlkZSh0cnVlKTsKICAg
ICByZXR1cm4gTWF0aE1MSW5saW5lQ29udGFpbmVyRWxlbWVudDo6aW5zZXJ0ZWRJbnRvKGluc2Vy
dGlvblBvaW50KTsKIH0KIApJbmRleDogU291cmNlL1dlYkNvcmUvcGFnZS9QYWdlLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wYWdlL1BhZ2UuY3BwCShyZXZpc2lvbiAxMjkzMDMp
CisrKyBTb3VyY2UvV2ViQ29yZS9wYWdlL1BhZ2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yOSw2
ICsyOSw3IEBACiAjaW5jbHVkZSAiQ29udGV4dE1lbnVDb250cm9sbGVyLmgiCiAjaW5jbHVkZSAi
RE9NV2luZG93LmgiCiAjaW5jbHVkZSAiRG9jdW1lbnRNYXJrZXJDb250cm9sbGVyLmgiCisjaW5j
bHVkZSAiRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5oIgogI2luY2x1ZGUgIkRyYWdDb250
cm9sbGVyLmgiCiAjaW5jbHVkZSAiRWRpdG9yQ2xpZW50LmgiCiAjaW5jbHVkZSAiRXZlbnQuaCIK
QEAgLTgzOCw3ICs4MzksNyBAQCB2b2lkIFBhZ2U6OnVzZXJTdHlsZVNoZWV0TG9jYXRpb25DaGFu
Z2VkCiAKICAgICBmb3IgKEZyYW1lKiBmcmFtZSA9IG1haW5GcmFtZSgpOyBmcmFtZTsgZnJhbWUg
PSBmcmFtZS0+dHJlZSgpLT50cmF2ZXJzZU5leHQoKSkgewogICAgICAgICBpZiAoZnJhbWUtPmRv
Y3VtZW50KCkpCi0gICAgICAgICAgICBmcmFtZS0+ZG9jdW1lbnQoKS0+dXBkYXRlUGFnZVVzZXJT
aGVldCgpOworICAgICAgICAgICAgZnJhbWUtPmRvY3VtZW50KCktPnN0eWxlU2hlZXRDb2xsZWN0
aW9uKCktPnVwZGF0ZVBhZ2VVc2VyU2hlZXQoKTsKICAgICB9CiB9CiAKSW5kZXg6IFNvdXJjZS9X
ZWJDb3JlL3BhZ2UvUGFnZUdyb3VwLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9w
YWdlL1BhZ2VHcm91cC5jcHAJKHJldmlzaW9uIDEyOTMwMykKKysrIFNvdXJjZS9XZWJDb3JlL3Bh
Z2UvUGFnZUdyb3VwLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjksNiArMjksNyBAQAogI2luY2x1
ZGUgIkNocm9tZS5oIgogI2luY2x1ZGUgIkNocm9tZUNsaWVudC5oIgogI2luY2x1ZGUgIkRvY3Vt
ZW50LmgiCisjaW5jbHVkZSAiRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5oIgogI2luY2x1
ZGUgIkZyYW1lLmgiCiAjaW5jbHVkZSAiR3JvdXBTZXR0aW5ncy5oIgogI2luY2x1ZGUgIlBhZ2Uu
aCIKQEAgLTM5MSw3ICszOTIsNyBAQCB2b2lkIFBhZ2VHcm91cDo6cmVzZXRVc2VyU3R5bGVDYWNo
ZUluQWxsCiAgICAgSGFzaFNldDxQYWdlKj46OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fcGFnZXMu
ZW5kKCk7CiAgICAgZm9yIChIYXNoU2V0PFBhZ2UqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3Bh
Z2VzLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgewogICAgICAgICBmb3IgKEZyYW1lKiBmcmFt
ZSA9ICgqaXQpLT5tYWluRnJhbWUoKTsgZnJhbWU7IGZyYW1lID0gZnJhbWUtPnRyZWUoKS0+dHJh
dmVyc2VOZXh0KCkpCi0gICAgICAgICAgICBmcmFtZS0+ZG9jdW1lbnQoKS0+dXBkYXRlUGFnZUdy
b3VwVXNlclNoZWV0cygpOworICAgICAgICAgICAgZnJhbWUtPmRvY3VtZW50KCktPnN0eWxlU2hl
ZXRDb2xsZWN0aW9uKCktPnVwZGF0ZVBhZ2VHcm91cFVzZXJTaGVldHMoKTsKICAgICB9CiB9CiAK
SW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCUi5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJSLmNwcAkocmV2aXNpb24gMTI5MzAz
KQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJSLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtNDAsNyArNDAsNyBAQCBSZW5kZXJCUjo6flJlbmRlckJSKCkKIAogaW50IFJlbmRlckJS
OjpsaW5lSGVpZ2h0KGJvb2wgZmlyc3RMaW5lKSBjb25zdAogewotICAgIGlmIChmaXJzdExpbmUg
JiYgZG9jdW1lbnQoKS0+dXNlc0ZpcnN0TGluZVJ1bGVzKCkpIHsKKyAgICBpZiAoZmlyc3RMaW5l
ICYmIGRvY3VtZW50KCktPnN0eWxlU2hlZXRDb2xsZWN0aW9uKCktPnVzZXNGaXJzdExpbmVSdWxl
cygpKSB7CiAgICAgICAgIFJlbmRlclN0eWxlKiBzID0gc3R5bGUoZmlyc3RMaW5lKTsKICAgICAg
ICAgaWYgKHMgIT0gc3R5bGUoKSkKICAgICAgICAgICAgIHJldHVybiBzLT5jb21wdXRlZExpbmVI
ZWlnaHQodmlldygpKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9j
ay5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2Nr
LmNwcAkocmV2aXNpb24gMTI5MzAzKQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRl
ckJsb2NrLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzQ3LDcgKzM0Nyw3IEBAIHZvaWQgUmVuZGVy
QmxvY2s6OnN0eWxlRGlkQ2hhbmdlKFN0eWxlRGkKICAgICBtX2xpbmVIZWlnaHQgPSAtMTsKIAog
ICAgIC8vIFVwZGF0ZSBwc2V1ZG9zIGZvciA6YmVmb3JlIGFuZCA6YWZ0ZXIgbm93LgotICAgIGlm
ICghaXNBbm9ueW1vdXMoKSAmJiBkb2N1bWVudCgpLT51c2VzQmVmb3JlQWZ0ZXJSdWxlcygpICYm
IGNhbkhhdmVHZW5lcmF0ZWRDaGlsZHJlbigpKSB7CisgICAgaWYgKCFpc0Fub255bW91cygpICYm
IGRvY3VtZW50KCktPnN0eWxlU2hlZXRDb2xsZWN0aW9uKCktPnVzZXNCZWZvcmVBZnRlclJ1bGVz
KCkgJiYgY2FuSGF2ZUdlbmVyYXRlZENoaWxkcmVuKCkpIHsKICAgICAgICAgdXBkYXRlQmVmb3Jl
QWZ0ZXJDb250ZW50KEJFRk9SRSk7CiAgICAgICAgIHVwZGF0ZUJlZm9yZUFmdGVyQ29udGVudChB
RlRFUik7CiAgICAgfQpAQCAtNjAyLDcgKzYwMiw3IEBAIHZvaWQgUmVuZGVyQmxvY2s6OnNwbGl0
QmxvY2tzKFJlbmRlckJsb2MKICAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogY3VyciA9IHRvUmVu
ZGVyQm94TW9kZWxPYmplY3QocGFyZW50KCkpOwogICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBj
dXJyQ2hpbGQgPSB0aGlzOwogICAgIFJlbmRlck9iamVjdCogY3VyckNoaWxkTmV4dFNpYmxpbmcg
PSBjdXJyQ2hpbGQtPm5leHRTaWJsaW5nKCk7Ci0gICAgYm9vbCBkb2N1bWVudFVzZXNCZWZvcmVB
ZnRlclJ1bGVzID0gZG9jdW1lbnQoKS0+dXNlc0JlZm9yZUFmdGVyUnVsZXMoKTsgCisgICAgYm9v
bCBkb2N1bWVudFVzZXNCZWZvcmVBZnRlclJ1bGVzID0gZG9jdW1lbnQoKS0+c3R5bGVTaGVldENv
bGxlY3Rpb24oKS0+dXNlc0JlZm9yZUFmdGVyUnVsZXMoKTsKIAogICAgIC8vIE5vdGU6IHx0aGlz
fCBjYW4gYmUgZGVzdHJveWVkIGluc2lkZSB0aGlzIGxvb3AgaWYgaXQgaXMgYW4gZW1wdHkgYW5v
bnltb3VzCiAgICAgLy8gYmxvY2sgYW5kIHdlIHRyeSB0byBjYWxsIHVwZGF0ZUJlZm9yZUFmdGVy
Q29udGVudCBpbnNpZGUgd2hpY2ggcmVtb3ZlcyB0aGUKQEAgLTg3Nyw3ICs4NzcsNyBAQCB2b2lk
IFJlbmRlckJsb2NrOjphZGRDaGlsZElnbm9yaW5nQW5vbnltCiAgICAgICAgICAgICAvLyBjb250
ZW50IGdldHMgcHJvcGVybHkgZGVzdHJveWVkLgogICAgICAgICAgICAgYm9vbCBpc0ZpcnN0Q2hp
bGQgPSAoYmVmb3JlQ2hpbGQgPT0gZmlyc3RDaGlsZCgpKTsKICAgICAgICAgICAgIGJvb2wgaXNM
YXN0Q2hpbGQgPSAoYmVmb3JlQ2hpbGQgPT0gbGFzdENoaWxkKCkpOwotICAgICAgICAgICAgaWYg
KGRvY3VtZW50KCktPnVzZXNCZWZvcmVBZnRlclJ1bGVzKCkpCisgICAgICAgICAgICBpZiAoZG9j
dW1lbnQoKS0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+dXNlc0JlZm9yZUFmdGVyUnVsZXMoKSkK
ICAgICAgICAgICAgICAgICBjaGlsZHJlbigpLT51cGRhdGVCZWZvcmVBZnRlckNvbnRlbnQodGhp
cywgQUZURVIpOwogICAgICAgICAgICAgaWYgKGlzTGFzdENoaWxkICYmIGJlZm9yZUNoaWxkICE9
IGxhc3RDaGlsZCgpKSB7CiAgICAgICAgICAgICAgICAgLy8gV2UgZGVzdHJveWVkIHRoZSBsYXN0
IGNoaWxkLCBzbyBub3cgd2UgbmVlZCB0byB1cGRhdGUgb3VyIGluc2VydGlvbgpAQCAtNjE1Myw3
ICs2MTUzLDcgQEAgTGF5b3V0VW5pdCBSZW5kZXJCbG9jazo6bGluZUhlaWdodChib29sIAogICAg
IGlmIChpc1JlcGxhY2VkKCkgJiYgbGluZVBvc2l0aW9uTW9kZSA9PSBQb3NpdGlvbk9uQ29udGFp
bmluZ0xpbmUpCiAgICAgICAgIHJldHVybiBSZW5kZXJCb3g6OmxpbmVIZWlnaHQoZmlyc3RMaW5l
LCBkaXJlY3Rpb24sIGxpbmVQb3NpdGlvbk1vZGUpOwogCi0gICAgaWYgKGZpcnN0TGluZSAmJiBk
b2N1bWVudCgpLT51c2VzRmlyc3RMaW5lUnVsZXMoKSkgeworICAgIGlmIChmaXJzdExpbmUgJiYg
ZG9jdW1lbnQoKS0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+dXNlc0ZpcnN0TGluZVJ1bGVzKCkp
IHsKICAgICAgICAgUmVuZGVyU3R5bGUqIHMgPSBzdHlsZShmaXJzdExpbmUpOwogICAgICAgICBp
ZiAocyAhPSBzdHlsZSgpKQogICAgICAgICAgICAgcmV0dXJuIHMtPmNvbXB1dGVkTGluZUhlaWdo
dCh2aWV3KCkpOwpAQCAtNjQ2MSw3ICs2NDYxLDcgQEAgdm9pZCBSZW5kZXJCbG9jazo6Y3JlYXRl
Rmlyc3RMZXR0ZXJSZW5kZQogCiB2b2lkIFJlbmRlckJsb2NrOjp1cGRhdGVGaXJzdExldHRlcigp
CiB7Ci0gICAgaWYgKCFkb2N1bWVudCgpLT51c2VzRmlyc3RMZXR0ZXJSdWxlcygpKQorICAgIGlm
ICghZG9jdW1lbnQoKS0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+dXNlc0ZpcnN0TGV0dGVyUnVs
ZXMoKSkKICAgICAgICAgcmV0dXJuOwogICAgIC8vIERvbid0IHJlY3VyCiAgICAgaWYgKHN0eWxl
KCktPnN0eWxlVHlwZSgpID09IEZJUlNUX0xFVFRFUikKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3Jl
bmRlcmluZy9SZW5kZXJJbmxpbmUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3Jl
bmRlcmluZy9SZW5kZXJJbmxpbmUuY3BwCShyZXZpc2lvbiAxMjkzMDMpCisrKyBTb3VyY2UvV2Vi
Q29yZS9yZW5kZXJpbmcvUmVuZGVySW5saW5lLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTk0LDcg
KzE5NCw3IEBAIHZvaWQgUmVuZGVySW5saW5lOjpzdHlsZURpZENoYW5nZShTdHlsZUQKICAgICB9
CiAKICAgICAvLyBVcGRhdGUgcHNldWRvcyBmb3IgOmJlZm9yZSBhbmQgOmFmdGVyIG5vdy4KLSAg
ICBpZiAoIWlzQW5vbnltb3VzKCkgJiYgZG9jdW1lbnQoKS0+dXNlc0JlZm9yZUFmdGVyUnVsZXMo
KSkgeworICAgIGlmICghaXNBbm9ueW1vdXMoKSAmJiBkb2N1bWVudCgpLT5zdHlsZVNoZWV0Q29s
bGVjdGlvbigpLT51c2VzQmVmb3JlQWZ0ZXJSdWxlcygpKSB7CiAgICAgICAgIGNoaWxkcmVuKCkt
PnVwZGF0ZUJlZm9yZUFmdGVyQ29udGVudCh0aGlzLCBCRUZPUkUpOwogICAgICAgICBjaGlsZHJl
bigpLT51cGRhdGVCZWZvcmVBZnRlckNvbnRlbnQodGhpcywgQUZURVIpOwogICAgIH0KQEAgLTIx
OCw3ICsyMTgsNyBAQCB2b2lkIFJlbmRlcklubGluZTo6dXBkYXRlQWx3YXlzQ3JlYXRlTGluCiAg
ICAgICAgIHx8IHBhcmVudFN0eWxlLT5saW5lSGVpZ2h0KCkgIT0gc3R5bGUoKS0+bGluZUhlaWdo
dCgpKSkKICAgICAgICAgfHwgKGluUmVuZGVyRmxvd1RocmVhZCgpICYmIGVuY2xvc2luZ1JlbmRl
ckZsb3dUaHJlYWQoKS0+aGFzUmVnaW9uc1dpdGhTdHlsaW5nKCkpOwogCi0gICAgaWYgKCFhbHdh
eXNDcmVhdGVMaW5lQm94ZXMgJiYgY2hlY2tGb250cyAmJiBkb2N1bWVudCgpLT51c2VzRmlyc3RM
aW5lUnVsZXMoKSkgeworICAgIGlmICghYWx3YXlzQ3JlYXRlTGluZUJveGVzICYmIGNoZWNrRm9u
dHMgJiYgZG9jdW1lbnQoKS0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+dXNlc0ZpcnN0TGluZVJ1
bGVzKCkpIHsKICAgICAgICAgLy8gSGF2ZSB0byBjaGVjayB0aGUgZmlyc3QgbGluZSBzdHlsZSBh
cyB3ZWxsLgogICAgICAgICBwYXJlbnRTdHlsZSA9IHBhcmVudCgpLT5zdHlsZSh0cnVlKTsKICAg
ICAgICAgUmVuZGVyU3R5bGUqIGNoaWxkU3R5bGUgPSBzdHlsZSh0cnVlKTsKQEAgLTMyNCw3ICsz
MjQsNyBAQCB2b2lkIFJlbmRlcklubGluZTo6YWRkQ2hpbGRJZ25vcmluZ0NvbnRpCiAgICAgICAg
IC8vIGhhcyB0byBtb3ZlIGludG8gdGhlIGlubGluZSBjb250aW51YXRpb24uICBDYWxsIHVwZGF0
ZUJlZm9yZUFmdGVyQ29udGVudCB0byBlbnN1cmUgdGhhdCBvdXIgOmFmdGVyCiAgICAgICAgIC8v
IGNvbnRlbnQgZ2V0cyBwcm9wZXJseSBkZXN0cm95ZWQuCiAgICAgICAgIGJvb2wgaXNMYXN0Q2hp
bGQgPSAoYmVmb3JlQ2hpbGQgPT0gbGFzdENoaWxkKCkpOwotICAgICAgICBpZiAoZG9jdW1lbnQo
KS0+dXNlc0JlZm9yZUFmdGVyUnVsZXMoKSkKKyAgICAgICAgaWYgKGRvY3VtZW50KCktPnN0eWxl
U2hlZXRDb2xsZWN0aW9uKCktPnVzZXNCZWZvcmVBZnRlclJ1bGVzKCkpCiAgICAgICAgICAgICBj
aGlsZHJlbigpLT51cGRhdGVCZWZvcmVBZnRlckNvbnRlbnQodGhpcywgQUZURVIpOwogICAgICAg
ICBpZiAoaXNMYXN0Q2hpbGQgJiYgYmVmb3JlQ2hpbGQgIT0gbGFzdENoaWxkKCkpCiAgICAgICAg
ICAgICBiZWZvcmVDaGlsZCA9IDA7IC8vIFdlIGRlc3Ryb3llZCB0aGUgbGFzdCBjaGlsZCwgc28g
bm93IHdlIG5lZWQgdG8gdXBkYXRlIG91ciBpbnNlcnRpb24KQEAgLTM5OSw3ICszOTksNyBAQCB2
b2lkIFJlbmRlcklubGluZTo6c3BsaXRJbmxpbmVzKFJlbmRlckJsCiAgICAgICAgICAgICAvLyBT
b21lb25lIG1heSBoYXZlIGluZGlyZWN0bHkgY2F1c2VkIGEgPHE+IHRvIHNwbGl0LiAgV2hlbiB0
aGlzIGhhcHBlbnMsIHRoZSA6YWZ0ZXIgY29udGVudAogICAgICAgICAgICAgLy8gaGFzIHRvIG1v
dmUgaW50byB0aGUgaW5saW5lIGNvbnRpbnVhdGlvbi4gIENhbGwgdXBkYXRlQmVmb3JlQWZ0ZXJD
b250ZW50IHRvIGVuc3VyZSB0aGF0IHRoZSBpbmxpbmUncyA6YWZ0ZXIKICAgICAgICAgICAgIC8v
IGNvbnRlbnQgZ2V0cyBwcm9wZXJseSBkZXN0cm95ZWQuCi0gICAgICAgICAgICBpZiAoZG9jdW1l
bnQoKS0+dXNlc0JlZm9yZUFmdGVyUnVsZXMoKSkKKyAgICAgICAgICAgIGlmIChkb2N1bWVudCgp
LT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpLT51c2VzQmVmb3JlQWZ0ZXJSdWxlcygpKQogICAgICAg
ICAgICAgICAgIGlubGluZUN1cnItPmNoaWxkcmVuKCktPnVwZGF0ZUJlZm9yZUFmdGVyQ29udGVu
dChpbmxpbmVDdXJyLCBBRlRFUik7CiAKICAgICAgICAgICAgIC8vIE5vdyB3ZSBuZWVkIHRvIHRh
a2UgYWxsIG9mIHRoZSBjaGlsZHJlbiBzdGFydGluZyBmcm9tIHRoZSBmaXJzdCBjaGlsZApAQCAt
MTI4Myw3ICsxMjgzLDcgQEAgSW5saW5lRmxvd0JveCogUmVuZGVySW5saW5lOjpjcmVhdGVBbmRB
cAogCiBMYXlvdXRVbml0IFJlbmRlcklubGluZTo6bGluZUhlaWdodChib29sIGZpcnN0TGluZSwg
TGluZURpcmVjdGlvbk1vZGUgLypkaXJlY3Rpb24qLywgTGluZVBvc2l0aW9uTW9kZSAvKmxpbmVQ
b3NpdGlvbk1vZGUqLykgY29uc3QKIHsKLSAgICBpZiAoZmlyc3RMaW5lICYmIGRvY3VtZW50KCkt
PnVzZXNGaXJzdExpbmVSdWxlcygpKSB7CisgICAgaWYgKGZpcnN0TGluZSAmJiBkb2N1bWVudCgp
LT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpLT51c2VzRmlyc3RMaW5lUnVsZXMoKSkgewogICAgICAg
ICBSZW5kZXJTdHlsZSogcyA9IHN0eWxlKGZpcnN0TGluZSk7CiAgICAgICAgIGlmIChzICE9IHN0
eWxlKCkpCiAgICAgICAgICAgICByZXR1cm4gcy0+Y29tcHV0ZWRMaW5lSGVpZ2h0KHZpZXcoKSk7
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmNwcAkocmV2aXNp
b24gMTI5MzAzKQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdC5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTI1OTcsNyArMjU5Nyw3IEBAIHZvaWQgUmVuZGVyT2JqZWN0Ojps
YXlvdXQoKQogCiBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBSZW5kZXJPYmplY3Q6OnVuY2FjaGVk
Rmlyc3RMaW5lU3R5bGUoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAogewotICAgIGlmICghZG9j
dW1lbnQoKS0+dXNlc0ZpcnN0TGluZVJ1bGVzKCkpCisgICAgaWYgKCFkb2N1bWVudCgpLT5zdHls
ZVNoZWV0Q29sbGVjdGlvbigpLT51c2VzRmlyc3RMaW5lUnVsZXMoKSkKICAgICAgICAgcmV0dXJu
IDA7CiAKICAgICBBU1NFUlQoIWlzVGV4dCgpKTsKQEAgLTI2MTgsNyArMjYxOCw3IEBAIFBhc3NS
ZWZQdHI8UmVuZGVyU3R5bGU+IFJlbmRlck9iamVjdDo6dW4KIAogUmVuZGVyU3R5bGUqIFJlbmRl
ck9iamVjdDo6Zmlyc3RMaW5lU3R5bGVTbG93Q2FzZSgpIGNvbnN0CiB7Ci0gICAgQVNTRVJUKGRv
Y3VtZW50KCktPnVzZXNGaXJzdExpbmVSdWxlcygpKTsKKyAgICBBU1NFUlQoZG9jdW1lbnQoKS0+
c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+dXNlc0ZpcnN0TGluZVJ1bGVzKCkpOwogCiAgICAgUmVu
ZGVyU3R5bGUqIHN0eWxlID0gbV9zdHlsZS5nZXQoKTsKICAgICBjb25zdCBSZW5kZXJPYmplY3Qq
IHJlbmRlcmVyID0gaXNUZXh0KCkgPyBwYXJlbnQoKSA6IHRoaXM7CkluZGV4OiBTb3VyY2UvV2Vi
Q29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdC5oCShyZXZpc2lvbiAxMjkzMDMpCisrKyBTb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmgJKHdvcmtpbmcgY29weSkKQEAgLTI3LDYg
KzI3LDcgQEAKICNkZWZpbmUgUmVuZGVyT2JqZWN0X2gKIAogI2luY2x1ZGUgIkNhY2hlZEltYWdl
Q2xpZW50LmgiCisjaW5jbHVkZSAiRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5oIgogI2lu
Y2x1ZGUgIkVsZW1lbnQuaCIKICNpbmNsdWRlICJGcmFjdGlvbmFsTGF5b3V0VW5pdC5oIgogI2lu
Y2x1ZGUgIkZsb2F0UXVhZC5oIgpAQCAtNzM1LDcgKzczNiw3IEBAIHB1YmxpYzoKICAgICB2aXJ0
dWFsIExheW91dFVuaXQgbWF4UHJlZmVycmVkTG9naWNhbFdpZHRoKCkgY29uc3QgeyByZXR1cm4g
MDsgfQogCiAgICAgUmVuZGVyU3R5bGUqIHN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9zdHlsZS5n
ZXQoKTsgfQotICAgIFJlbmRlclN0eWxlKiBmaXJzdExpbmVTdHlsZSgpIGNvbnN0IHsgcmV0dXJu
IGRvY3VtZW50KCktPnVzZXNGaXJzdExpbmVSdWxlcygpID8gZmlyc3RMaW5lU3R5bGVTbG93Q2Fz
ZSgpIDogc3R5bGUoKTsgfQorICAgIFJlbmRlclN0eWxlKiBmaXJzdExpbmVTdHlsZSgpIGNvbnN0
IHsgcmV0dXJuIGRvY3VtZW50KCktPnN0eWxlU2hlZXRDb2xsZWN0aW9uKCktPnVzZXNGaXJzdExp
bmVSdWxlcygpID8gZmlyc3RMaW5lU3R5bGVTbG93Q2FzZSgpIDogc3R5bGUoKTsgfQogICAgIFJl
bmRlclN0eWxlKiBzdHlsZShib29sIGZpcnN0TGluZSkgY29uc3QgeyByZXR1cm4gZmlyc3RMaW5l
ID8gZmlyc3RMaW5lU3R5bGUoKSA6IHN0eWxlKCk7IH0KIAogICAgIC8vIFVzZWQgb25seSBieSBF
bGVtZW50Ojpwc2V1ZG9TdHlsZUNhY2hlSXNJbnZhbGlkIHRvIGdldCBhIGZpcnN0IGxpbmUgc3R5
bGUgYmFzZWQgb2ZmIG9mIGEKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJP
YmplY3RDaGlsZExpc3QuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmlu
Zy9SZW5kZXJPYmplY3RDaGlsZExpc3QuY3BwCShyZXZpc2lvbiAxMjkzMDMpCisrKyBTb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0Q2hpbGRMaXN0LmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMzY5LDcgKzM2OSw3IEBAIHN0YXRpYyBSZW5kZXJPYmplY3QqIGVuc3VyZUJlZm9yZUFm
dGVyQ28KIHZvaWQgUmVuZGVyT2JqZWN0Q2hpbGRMaXN0Ojp1cGRhdGVCZWZvcmVBZnRlckNvbnRl
bnQoUmVuZGVyT2JqZWN0KiBvd25lciwgUHNldWRvSWQgdHlwZSwgY29uc3QgUmVuZGVyT2JqZWN0
KiBzdHlsZWRPYmplY3QpCiB7CiAgICAgLy8gRG91YmxlIGNoZWNrIHRoYXQgdGhlIGRvY3VtZW50
IGRpZCBpbiBmYWN0IHVzZSBnZW5lcmF0ZWQgY29udGVudCBydWxlcy4gIE90aGVyd2lzZSB3ZSBz
aG91bGQgbm90IGhhdmUgYmVlbiBjYWxsZWQuCi0gICAgQVNTRVJUKG93bmVyLT5kb2N1bWVudCgp
LT51c2VzQmVmb3JlQWZ0ZXJSdWxlcygpKTsKKyAgICBBU1NFUlQob3duZXItPmRvY3VtZW50KCkt
PnN0eWxlU2hlZXRDb2xsZWN0aW9uKCktPnVzZXNCZWZvcmVBZnRlclJ1bGVzKCkpOwogCiAgICAg
Ly8gSW4gQ1NTMiwgYmVmb3JlL2FmdGVyIHBzZXVkby1jb250ZW50IGNhbm5vdCBuZXN0LiAgQ2hl
Y2sgdGhpcyBmaXJzdC4KICAgICBpZiAob3duZXItPnN0eWxlKCktPnN0eWxlVHlwZSgpID09IEJF
Rk9SRSB8fCBvd25lci0+c3R5bGUoKS0+c3R5bGVUeXBlKCkgPT0gQUZURVIpCkluZGV4OiBTb3Vy
Y2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGFibGVSb3cuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUYWJsZVJvdy5jcHAJKHJldmlzaW9uIDEyOTMw
MykKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUYWJsZVJvdy5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTU1LDcgKzU1LDcgQEAgdm9pZCBSZW5kZXJUYWJsZVJvdzo6d2lsbEJlUmVt
b3ZlZEZyb21UcgogCiB2b2lkIFJlbmRlclRhYmxlUm93Ojp1cGRhdGVCZWZvcmVBbmRBZnRlckNv
bnRlbnQoKQogewotICAgIGlmICghaXNBbm9ueW1vdXMoKSAmJiBkb2N1bWVudCgpLT51c2VzQmVm
b3JlQWZ0ZXJSdWxlcygpKSB7CisgICAgaWYgKCFpc0Fub255bW91cygpICYmIGRvY3VtZW50KCkt
PnN0eWxlU2hlZXRDb2xsZWN0aW9uKCktPnVzZXNCZWZvcmVBZnRlclJ1bGVzKCkpIHsKICAgICAg
ICAgY2hpbGRyZW4oKS0+dXBkYXRlQmVmb3JlQWZ0ZXJDb250ZW50KHRoaXMsIEJFRk9SRSk7CiAg
ICAgICAgIGNoaWxkcmVuKCktPnVwZGF0ZUJlZm9yZUFmdGVyQ29udGVudCh0aGlzLCBBRlRFUik7
CiAgICAgfQpJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1Jvb3RJbmxpbmVCb3guY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9Sb290SW5saW5lQm94LmNw
cAkocmV2aXNpb24gMTI5MzAzKQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1Jvb3RJbmxp
bmVCb3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC04NDYsNyArODQ2LDcgQEAgTGF5b3V0VW5pdCBS
b290SW5saW5lQm94Ojp2ZXJ0aWNhbFBvc2l0aQogCiAgICAgLy8gVGhpcyBtZXRob2QgZGV0ZXJt
aW5lcyB0aGUgdmVydGljYWwgcG9zaXRpb24gZm9yIGlubGluZSBlbGVtZW50cy4KICAgICBib29s
IGZpcnN0TGluZSA9IGlzRmlyc3RMaW5lU3R5bGUoKTsKLSAgICBpZiAoZmlyc3RMaW5lICYmICFy
ZW5kZXJlci0+ZG9jdW1lbnQoKS0+dXNlc0ZpcnN0TGluZVJ1bGVzKCkpCisgICAgaWYgKGZpcnN0
TGluZSAmJiAhcmVuZGVyZXItPmRvY3VtZW50KCktPnN0eWxlU2hlZXRDb2xsZWN0aW9uKCktPnVz
ZXNGaXJzdExpbmVSdWxlcygpKQogICAgICAgICBmaXJzdExpbmUgPSBmYWxzZTsKIAogICAgIC8v
IENoZWNrIHRoZSBjYWNoZS4KSW5kZXg6IFNvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYkRv
Y3VtZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJE
b2N1bWVudC5jcHAJKHJldmlzaW9uIDEyOTMwMykKKysrIFNvdXJjZS9XZWJLaXQvY2hyb21pdW0v
c3JjL1dlYkRvY3VtZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzUsNiArMzUsNyBAQAogI2lu
Y2x1ZGUgIkNTU1BhcnNlck1vZGUuaCIKICNpbmNsdWRlICJEb2N1bWVudC5oIgogI2luY2x1ZGUg
IkRvY3VtZW50TG9hZGVyLmgiCisjaW5jbHVkZSAiRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlv
bi5oIgogI2luY2x1ZGUgIkRvY3VtZW50VHlwZS5oIgogI2luY2x1ZGUgIkVsZW1lbnQuaCIKICNp
bmNsdWRlICJIVE1MQWxsQ29sbGVjdGlvbi5oIgpAQCAtMTk2LDcgKzE5Nyw3IEBAIHZvaWQgV2Vi
RG9jdW1lbnQ6Omluc2VydFVzZXJTdHlsZVNoZWV0KGMKICAgICBSZWZQdHI8U3R5bGVTaGVldENv
bnRlbnRzPiBwYXJzZWRTaGVldCA9IFN0eWxlU2hlZXRDb250ZW50czo6Y3JlYXRlKGRvY3VtZW50
LmdldCgpKTsKICAgICBwYXJzZWRTaGVldC0+c2V0SXNVc2VyU3R5bGVTaGVldChsZXZlbCA9PSBV
c2VyU3R5bGVVc2VyTGV2ZWwpOwogICAgIHBhcnNlZFNoZWV0LT5wYXJzZVN0cmluZyhzb3VyY2VD
b2RlKTsKLSAgICBkb2N1bWVudC0+YWRkVXNlclNoZWV0KHBhcnNlZFNoZWV0LnJlbGVhc2UoKSk7
CisgICAgZG9jdW1lbnQtPnN0eWxlU2hlZXRDb2xsZWN0aW9uKCktPmFkZFVzZXJTaGVldChwYXJz
ZWRTaGVldC5yZWxlYXNlKCkpOwogfQogCiB2b2lkIFdlYkRvY3VtZW50OjpjYW5jZWxGdWxsU2Ny
ZWVuKCkK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>165423</attachid>
            <date>2012-09-24 12:03:33 -0700</date>
            <delta_ts>2012-09-24 12:16:22 -0700</delta_ts>
            <desc>update to tot</desc>
            <filename>document-stylesheet-split-9.patch</filename>
            <type>text/plain</type>
            <size>541343</size>
            <attacher name="Antti Koivisto">koivisto</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEyOTM5NykKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE1MyBAQAorMjAxMi0wOS0yMSAgQW50dGkg
S29pdmlzdG8gIDxhbnR0aUBhcHBsZS5jb20+CisKKyAgICAgICAgU3BsaXQgc3R5bGVzaGVldCBy
ZWxhdGVkIGNvZGUgb3V0IGZyb20gRG9jdW1lbnQgCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD05NzM1MworCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgIERvY3VtZW50IGlzIGJpZyBhbmQgdW53aWVsZHkuIFRoZSBj
b2RlIHJlbGF0ZWQgdG8gdHJhY2tpbmcgYWN0aXZlIHN0eWxlc2hlZXRzIGNhbiBiZSBmYWN0b3Jl
ZCBvdXQuCisgICAgICAgIAorICAgICAgICBUaGUgcGF0Y2ggbW92ZXMgc3R5bGVzaGVldCB1cGtl
ZXAsIGNvbGxlY3Rpb24gYW5kIGludmFsaWRhdGlvbiBjb2RlIGZyb20gRG9jdW1lbnQgdG8gYSBz
ZXBhcmF0ZQorICAgICAgICBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uIGNsYXNzLiBUaGVy
ZSBhcmUgbm8gZnVuY3Rpb25hbCBjaGFuZ2VzLgorICAgICAgICAKKyAgICAgICAgVGhlIHVzZXNM
aW5rUnVsZXMgc3R5bGVzaGVldCBmZWF0dXJlIGJpdCBhbmQgdGhlIHJlbGF0ZWQgY29kZSBpcyBy
ZW1vdmVkIGFzIG5vIG9uZSB3YXMgdXNpbmcgaXQuCisKKyAgICAgICAgKiBXZWJDb3JlLnhjb2Rl
cHJvai9wcm9qZWN0LnBieHByb2o6CisgICAgICAgICogY3NzL1NlbGVjdG9yQ2hlY2tlci5jcHA6
CisgICAgICAgIChXZWJDb3JlOjpTZWxlY3RvckNoZWNrZXI6OmNoZWNrT25lU2VsZWN0b3IpOgor
ICAgICAgICAqIGNzcy9TdHlsZVJlc29sdmVyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxl
UmVzb2x2ZXI6OlN0eWxlUmVzb2x2ZXIpOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVSZXNvbHZl
cjo6RmVhdHVyZXM6OkZlYXR1cmVzKToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6
OkZlYXR1cmVzOjphZGQpOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVSZXNvbHZlcjo6RmVhdHVy
ZXM6OmNsZWFyKToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OmNvbGxlY3RNYXRj
aGluZ1J1bGVzRm9yTGlzdCk6CisgICAgICAgICogY3NzL1N0eWxlUmVzb2x2ZXIuaDoKKyAgICAg
ICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OnVzZXNCZWZvcmVBZnRlclJ1bGVzKToKKyAgICAg
ICAgKEZlYXR1cmVzKToKKyAgICAgICAgKiBkb20vRG9jdW1lbnQuY3BwOgorICAgICAgICAoV2Vi
Q29yZTo6RG9jdW1lbnQ6OkRvY3VtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50Ojp+
RG9jdW1lbnQpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnQ6OnNldENvbXBhdGliaWxpdHlN
b2RlKToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50OjpyZWNhbGNTdHlsZSk6CisgICAgICAg
IChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50OjpjcmVhdGVTdHlsZVJlc29s
dmVyKToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50OjpzZWFtbGVzc1BhcmVudFVwZGF0ZWRT
dHlsZXNoZWV0cyk6CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudDo6ZGlkUmVtb3ZlQWxsUGVu
ZGluZ1N0eWxlc2hlZXQpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnQ6OnByb2Nlc3NIdHRw
RXF1aXYpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnQ6OnN0eWxlU2hlZXRzKToKKyAgICAg
ICAgKFdlYkNvcmU6OkRvY3VtZW50OjpwcmVmZXJyZWRTdHlsZXNoZWV0U2V0KToKKyAgICAgICAg
KFdlYkNvcmU6OkRvY3VtZW50OjpzZWxlY3RlZFN0eWxlc2hlZXRTZXQpOgorICAgICAgICAoV2Vi
Q29yZTo6RG9jdW1lbnQ6OnNldFNlbGVjdGVkU3R5bGVzaGVldFNldCk6CisgICAgICAgIChXZWJD
b3JlOjpEb2N1bWVudDo6c3R5bGVSZXNvbHZlckNoYW5nZWQpOgorICAgICAgICAoV2ViQ29yZTo6
RG9jdW1lbnQ6OnJlcG9ydE1lbW9yeVVzYWdlKToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50
OjpoYXZlU3R5bGVzaGVldHNMb2FkZWQpOgorICAgICAgICAqIGRvbS9Eb2N1bWVudC5oOgorICAg
ICAgICAoV2ViQ29yZSk6CisgICAgICAgIChEb2N1bWVudCk6CisgICAgICAgIChXZWJDb3JlOjpE
b2N1bWVudDo6c3R5bGVTaGVldENvbGxlY3Rpb24pOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1l
bnQ6Omhhc05vZGVzV2l0aFBsYWNlaG9sZGVyU3R5bGUpOgorICAgICAgICAoV2ViQ29yZTo6RG9j
dW1lbnQ6OnNldE5lZWRzTm90aWZ5UmVtb3ZlQWxsUGVuZGluZ1N0eWxlc2hlZXQpOgorICAgICAg
ICAoV2ViQ29yZTo6RG9jdW1lbnQ6OmluU3R5bGVSZWNhbGMpOgorICAgICAgICAqIGRvbS9Eb2N1
bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlKToK
KyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OkRvY3VtZW50
U3R5bGVTaGVldENvbGxlY3Rpb24pOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNo
ZWV0Q29sbGVjdGlvbjo6fkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24pOgorICAgICAgICAo
V2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6cGFnZVVzZXJTaGVldCk6Cisg
ICAgICAgIChXZWJDb3JlOjpEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjpjbGVhclBhZ2VV
c2VyU2hlZXQpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlv
bjo6dXBkYXRlUGFnZVVzZXJTaGVldCk6CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudFN0eWxl
U2hlZXRDb2xsZWN0aW9uOjpwYWdlR3JvdXBVc2VyU2hlZXRzKToKKyAgICAgICAgKFdlYkNvcmU6
OkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OmNsZWFyUGFnZUdyb3VwVXNlclNoZWV0cyk6
CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjp1cGRhdGVQ
YWdlR3JvdXBVc2VyU2hlZXRzKToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50U3R5bGVTaGVl
dENvbGxlY3Rpb246OmFkZFVzZXJTaGVldCk6CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudFN0
eWxlU2hlZXRDb2xsZWN0aW9uOjpyZW1vdmVQZW5kaW5nU2hlZXQpOgorICAgICAgICAoV2ViQ29y
ZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6YWRkU3R5bGVTaGVldENhbmRpZGF0ZU5v
ZGUpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6cmVt
b3ZlU3R5bGVTaGVldENhbmRpZGF0ZU5vZGUpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRT
dHlsZVNoZWV0Q29sbGVjdGlvbjo6Y29sbGVjdEFjdGl2ZVN0eWxlU2hlZXRzKToKKyAgICAgICAg
KFdlYkNvcmU6OkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OnRlc3RBZGRlZFN0eWxlU2hl
ZXRSZXF1aXJlc1N0eWxlUmVjYWxjKToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50U3R5bGVT
aGVldENvbGxlY3Rpb246OmFuYWx5emVTdHlsZVNoZWV0Q2hhbmdlKToKKyAgICAgICAgKFdlYkNv
cmU6OnN0eWxlU2hlZXRzVXNlUmVtVW5pdHMpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRT
dHlsZVNoZWV0Q29sbGVjdGlvbjo6dXBkYXRlQWN0aXZlU3R5bGVTaGVldHMpOgorICAgICAgICAo
V2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6Y29tYmluZUNTU0ZlYXR1cmVG
bGFncyk6CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjpy
ZXNldENTU0ZlYXR1cmVGbGFncyk6CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudFN0eWxlU2hl
ZXRDb2xsZWN0aW9uOjpyZXBvcnRNZW1vcnlVc2FnZSk6CisgICAgICAgICogZG9tL0RvY3VtZW50
U3R5bGVTaGVldENvbGxlY3Rpb24uaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlKToKKyAgICAg
ICAgKERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24pOgorICAgICAgICAoV2ViQ29yZTo6RG9j
dW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6YXV0aG9yU3R5bGVTaGVldHMpOgorICAgICAgICAo
V2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6ZG9jdW1lbnRVc2VyU2hlZXRz
KToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246Om5lZWRz
VXBkYXRlQWN0aXZlU3R5bGVzaGVldHNPblN0eWxlUmVjYWxjKToKKyAgICAgICAgKFdlYkNvcmU6
OkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OnByZWZlcnJlZFN0eWxlc2hlZXRTZXROYW1l
KToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OnNlbGVj
dGVkU3R5bGVzaGVldFNldE5hbWUpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNo
ZWV0Q29sbGVjdGlvbjo6c2V0UHJlZmVycmVkU3R5bGVzaGVldFNldE5hbWUpOgorICAgICAgICAo
V2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6c2V0U2VsZWN0ZWRTdHlsZXNo
ZWV0U2V0TmFtZSk6CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0
aW9uOjphZGRQZW5kaW5nU2hlZXQpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNo
ZWV0Q29sbGVjdGlvbjo6aGFzUGVuZGluZ1NoZWV0cyk6CisgICAgICAgIChXZWJDb3JlOjpEb2N1
bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjp1c2VzU2libGluZ1J1bGVzKToKKyAgICAgICAgKFdl
YkNvcmU6OkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OnNldFVzZXNTaWJsaW5nUnVsZXNP
dmVycmlkZSk6CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9u
Ojp1c2VzRmlyc3RMaW5lUnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNo
ZWV0Q29sbGVjdGlvbjo6dXNlc0ZpcnN0TGV0dGVyUnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6
RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6c2V0VXNlc0ZpcnN0TGV0dGVyUnVsZXMpOgor
ICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6dXNlc0JlZm9y
ZUFmdGVyUnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVj
dGlvbjo6c2V0VXNlc0JlZm9yZUFmdGVyUnVsZXNPdmVycmlkZSk6CisgICAgICAgIChXZWJDb3Jl
OjpEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjp1c2VzUmVtVW5pdHMpOgorICAgICAgICAo
V2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6c2V0VXNlc1JlbVVuaXQpOgor
ICAgICAgICAqIGRvbS9FbGVtZW50LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnQ6OnJl
Y2FsY1N0eWxlKToKKyAgICAgICAgKiBkb20vUHJvY2Vzc2luZ0luc3RydWN0aW9uLmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OlByb2Nlc3NpbmdJbnN0cnVjdGlvbjo6flByb2Nlc3NpbmdJbnN0cnVj
dGlvbik6CisgICAgICAgIChXZWJDb3JlOjpQcm9jZXNzaW5nSW5zdHJ1Y3Rpb246OmNoZWNrU3R5
bGVTaGVldCk6CisgICAgICAgIChXZWJDb3JlOjpQcm9jZXNzaW5nSW5zdHJ1Y3Rpb246OnNoZWV0
TG9hZGVkKToKKyAgICAgICAgKFdlYkNvcmU6OlByb2Nlc3NpbmdJbnN0cnVjdGlvbjo6aW5zZXJ0
ZWRJbnRvKToKKyAgICAgICAgKFdlYkNvcmU6OlByb2Nlc3NpbmdJbnN0cnVjdGlvbjo6cmVtb3Zl
ZEZyb20pOgorICAgICAgICAqIGRvbS9TdHlsZUVsZW1lbnQuY3BwOgorICAgICAgICAoV2ViQ29y
ZTo6U3R5bGVFbGVtZW50OjppbnNlcnRlZEludG9Eb2N1bWVudCk6CisgICAgICAgIChXZWJDb3Jl
OjpTdHlsZUVsZW1lbnQ6OnJlbW92ZWRGcm9tRG9jdW1lbnQpOgorICAgICAgICAoV2ViQ29yZTo6
U3R5bGVFbGVtZW50OjpjbGVhckRvY3VtZW50RGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpTdHls
ZUVsZW1lbnQ6OmNyZWF0ZVNoZWV0KToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlRWxlbWVudDo6
c2hlZXRMb2FkZWQpOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVFbGVtZW50OjpzdGFydExvYWRp
bmdEeW5hbWljU2hlZXQpOgorICAgICAgICAqIGh0bWwvSFRNTExpbmtFbGVtZW50LmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OkhUTUxMaW5rRWxlbWVudDo6fkhUTUxMaW5rRWxlbWVudCk6CisgICAg
ICAgIChXZWJDb3JlOjpIVE1MTGlua0VsZW1lbnQ6Omluc2VydGVkSW50byk6CisgICAgICAgIChX
ZWJDb3JlOjpIVE1MTGlua0VsZW1lbnQ6OnJlbW92ZWRGcm9tKToKKyAgICAgICAgKFdlYkNvcmU6
OkhUTUxMaW5rRWxlbWVudDo6YWRkUGVuZGluZ1NoZWV0KToKKyAgICAgICAgKFdlYkNvcmU6OkhU
TUxMaW5rRWxlbWVudDo6cmVtb3ZlUGVuZGluZ1NoZWV0KToKKyAgICAgICAgKiBodG1sL0hUTUxR
dW90ZUVsZW1lbnQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6SFRNTFF1b3RlRWxlbWVudDo6aW5z
ZXJ0ZWRJbnRvKToKKyAgICAgICAgKiBodG1sL0hUTUxWaWV3U291cmNlRG9jdW1lbnQuY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6SFRNTFZpZXdTb3VyY2VEb2N1bWVudDo6SFRNTFZpZXdTb3VyY2VE
b2N1bWVudCk6CisgICAgICAgICogbWF0aG1sL01hdGhNTE1hdGhFbGVtZW50LmNwcDoKKyAgICAg
ICAgKFdlYkNvcmU6Ok1hdGhNTE1hdGhFbGVtZW50OjppbnNlcnRlZEludG8pOgorICAgICAgICAq
IHBhZ2UvUGFnZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpQYWdlOjp1c2VyU3R5bGVTaGVldExv
Y2F0aW9uQ2hhbmdlZCk6CisgICAgICAgICogcGFnZS9QYWdlR3JvdXAuY3BwOgorICAgICAgICAo
V2ViQ29yZTo6UGFnZUdyb3VwOjpyZXNldFVzZXJTdHlsZUNhY2hlSW5BbGxGcmFtZXMpOgorICAg
ICAgICAqIHJlbmRlcmluZy9SZW5kZXJCUi5jcHA6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJC
Ujo6bGluZUhlaWdodCk6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlckJsb2NrLmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrOjpzdHlsZURpZENoYW5nZSk6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJCbG9jazo6c3BsaXRCbG9ja3MpOgorICAgICAgICAoV2ViQ29yZTo6UmVu
ZGVyQmxvY2s6OmFkZENoaWxkSWdub3JpbmdBbm9ueW1vdXNDb2x1bW5CbG9ja3MpOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6OmxpbmVIZWlnaHQpOgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyQmxvY2s6OnVwZGF0ZUZpcnN0TGV0dGVyKToKKyAgICAgICAgKiByZW5kZXJpbmcvUmVu
ZGVySW5saW5lLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlcklubGluZTo6c3R5bGVEaWRD
aGFuZ2UpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVySW5saW5lOjp1cGRhdGVBbHdheXNDcmVh
dGVMaW5lQm94ZXMpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVySW5saW5lOjphZGRDaGlsZEln
bm9yaW5nQ29udGludWF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlcklubGluZTo6c3Bs
aXRJbmxpbmVzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlcklubGluZTo6bGluZUhlaWdodCk6
CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlck9iamVjdC5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJPYmplY3Q6OnVuY2FjaGVkRmlyc3RMaW5lU3R5bGUpOgorICAgICAgICAoV2ViQ29y
ZTo6UmVuZGVyT2JqZWN0OjpmaXJzdExpbmVTdHlsZVNsb3dDYXNlKToKKyAgICAgICAgKiByZW5k
ZXJpbmcvUmVuZGVyT2JqZWN0Lmg6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJPYmplY3Q6OmZp
cnN0TGluZVN0eWxlKToKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyT2JqZWN0Q2hpbGRMaXN0
LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck9iamVjdENoaWxkTGlzdDo6dXBkYXRlQmVm
b3JlQWZ0ZXJDb250ZW50KToKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyVGFibGVSb3cuY3Bw
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGFibGVSb3c6OnVwZGF0ZUJlZm9yZUFuZEFmdGVy
Q29udGVudCk6CisgICAgICAgICogcmVuZGVyaW5nL1Jvb3RJbmxpbmVCb3guY3BwOgorICAgICAg
ICAoV2ViQ29yZTo6Um9vdElubGluZUJveDo6dmVydGljYWxQb3NpdGlvbkZvckJveCk6CisKIDIw
MTItMDktMjQgIFRvbW15IFdpZGVuZmx5Y2h0ICA8dG9tbXl3QGdvb2dsZS5jb20+CiAKICAgICAg
ICAgTWVkaWFTdHJlYW0gQVBJOiBGaXggdGhlIGluY29ycmVjdGx5IHNwZWxsZWQgUlRDUGVlckNv
bm5lY3Rpb246Om9ubmVnb3RpYXRpb25uZWVkZWQgY2FsbGJhY2sKSW5kZXg6IFNvdXJjZS9XZWJD
b3JlL0NNYWtlTGlzdHMudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL0NNYWtlTGlz
dHMudHh0CShyZXZpc2lvbiAxMjkzOTcpCisrKyBTb3VyY2UvV2ViQ29yZS9DTWFrZUxpc3RzLnR4
dAkod29ya2luZyBjb3B5KQpAQCAtMTEyNSw2ICsxMTI1LDcgQEAgU0VUKFdlYkNvcmVfU09VUkNF
UwogICAgIGRvbS9Eb2N1bWVudEZyYWdtZW50LmNwcAogICAgIGRvbS9Eb2N1bWVudFBhcnNlci5j
cHAKICAgICBkb20vRG9jdW1lbnRPcmRlcmVkTWFwLmNwcAorICAgIGRvbS9Eb2N1bWVudFN0eWxl
U2hlZXRDb2xsZWN0aW9uLmNwcAogICAgIGRvbS9Eb2N1bWVudFR5cGUuY3BwCiAgICAgZG9tL0R5
bmFtaWNOb2RlTGlzdC5jcHAKICAgICBkb20vRWRpdGluZ1RleHQuY3BwCkluZGV4OiBTb3VyY2Uv
V2ViQ29yZS9HTlVtYWtlZmlsZS5saXN0LmFtCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3Jl
L0dOVW1ha2VmaWxlLmxpc3QuYW0JKHJldmlzaW9uIDEyOTM5NykKKysrIFNvdXJjZS9XZWJDb3Jl
L0dOVW1ha2VmaWxlLmxpc3QuYW0JKHdvcmtpbmcgY29weSkKQEAgLTI3MzQsNiArMjczNCw4IEBA
IHdlYmNvcmVfc291cmNlcyArPSBcCiAJU291cmNlL1dlYkNvcmUvZG9tL0RvY3VtZW50T3JkZXJl
ZE1hcC5oIFwKIAlTb3VyY2UvV2ViQ29yZS9kb20vRG9jdW1lbnRQYXJzZXIuY3BwIFwKIAlTb3Vy
Y2UvV2ViQ29yZS9kb20vRG9jdW1lbnRQYXJzZXIuaCBcCisgICAgU291cmNlL1dlYkNvcmUvZG9t
L0RvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uY3BwIFwKKyAgICBTb3VyY2UvV2ViQ29yZS9k
b20vRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5oIFwKIAlTb3VyY2UvV2ViQ29yZS9kb20v
RG9jdW1lbnRUaW1pbmcuaCBcCiAJU291cmNlL1dlYkNvcmUvZG9tL0RvY3VtZW50VHlwZS5jcHAg
XAogCVNvdXJjZS9XZWJDb3JlL2RvbS9Eb2N1bWVudFR5cGUuaCBcCkluZGV4OiBTb3VyY2UvV2Vi
Q29yZS9UYXJnZXQucHJpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL1RhcmdldC5wcmkJ
KHJldmlzaW9uIDEyOTM5NykKKysrIFNvdXJjZS9XZWJDb3JlL1RhcmdldC5wcmkJKHdvcmtpbmcg
Y29weSkKQEAgLTM3MSw2ICszNzEsNyBAQCBTT1VSQ0VTICs9IFwKICAgICBkb20vRG9jdW1lbnRN
YXJrZXIuY3BwIFwKICAgICBkb20vRG9jdW1lbnRPcmRlcmVkTWFwLmNwcCBcCiAgICAgZG9tL0Rv
Y3VtZW50UGFyc2VyLmNwcCBcCisgICAgZG9tL0RvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24u
Y3BwIFwKICAgICBkb20vRG9jdW1lbnRUeXBlLmNwcCBcCiAgICAgZG9tL0RPTUNvcmVFeGNlcHRp
b24uY3BwIFwKICAgICBkb20vRE9NRXJyb3IuY3BwIFwKQEAgLTE1MjgsNiArMTUyOSw3IEBAIEhF
QURFUlMgKz0gXAogICAgIGRvbS9Eb2N1bWVudE1hcmtlci5oIFwKICAgICBkb20vRG9jdW1lbnRN
YXJrZXJDb250cm9sbGVyLmggXAogICAgIGRvbS9Eb2N1bWVudE9yZGVyZWRNYXAuaCBcCisgICAg
ZG9tL0RvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uaCBcCiAgICAgZG9tL0RvY3VtZW50VHlw
ZS5oIFwKICAgICBkb20vRE9NRXJyb3IuaCBcCiAgICAgZG9tL0RPTUltcGxlbWVudGF0aW9uLmgg
XApJbmRleDogU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBpCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQkocmV2aXNpb24gMTI5Mzk3KQorKysgU291cmNlL1dlYkNv
cmUvV2ViQ29yZS5neXBpCSh3b3JraW5nIGNvcHkpCkBAIC02NTcsNiArNjU3LDcgQEAKICAgICAg
ICAgICAgICdkb20vRG9jdW1lbnRNYXJrZXJDb250cm9sbGVyLmgnLAogICAgICAgICAgICAgJ2Rv
bS9Eb2N1bWVudE9yZGVyZWRNYXAuaCcsCiAgICAgICAgICAgICAnZG9tL0RvY3VtZW50UGFyc2Vy
LmgnLAorICAgICAgICAgICAgJ2RvbS9Eb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmgnLAog
ICAgICAgICAgICAgJ2RvbS9Eb2N1bWVudFRpbWluZy5oJywKICAgICAgICAgICAgICdkb20vRG9j
dW1lbnRUeXBlLmgnLAogICAgICAgICAgICAgJ2RvbS9FbGVtZW50LmgnLApAQCAtMzgxNiw2ICsz
ODE3LDcgQEAKICAgICAgICAgICAgICdkb20vRG9jdW1lbnRNYXJrZXIuY3BwJywKICAgICAgICAg
ICAgICdkb20vRG9jdW1lbnRPcmRlcmVkTWFwLmNwcCcsCiAgICAgICAgICAgICAnZG9tL0RvY3Vt
ZW50UGFyc2VyLmNwcCcsCisgICAgICAgICAgICAnZG9tL0RvY3VtZW50U3R5bGVTaGVldENvbGxl
Y3Rpb24uY3BwJywKICAgICAgICAgICAgICdkb20vRG9jdW1lbnRUeXBlLmNwcCcsCiAgICAgICAg
ICAgICAnZG9tL0R5bmFtaWNOb2RlTGlzdC5jcHAnLAogICAgICAgICAgICAgJ2RvbS9EeW5hbWlj
Tm9kZUxpc3QuaCcsCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3Jl
LnZjcHJvago9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJD
b3JlLnZjcHJvagkocmV2aXNpb24gMTI5Mzk3KQorKysgU291cmNlL1dlYkNvcmUvV2ViQ29yZS52
Y3Byb2ovV2ViQ29yZS52Y3Byb2oJKHdvcmtpbmcgY29weSkKQEAgLTUwNDA2LDYgKzUwNDA2LDE0
IEBACiAJCQkJUmVsYXRpdmVQYXRoPSIuLlxkb21cRG9jdW1lbnRQYXJzZXIuaCIKIAkJCQk+CiAJ
CQk8L0ZpbGU+CisgICAgICAgICAgICA8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cZG9tXERv
Y3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uY3BwIgorCQkJCT4KKwkJCTwvRmlsZT4KKyAgICAg
ICAgICAgIDxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxkb21cRG9jdW1lbnRTdHlsZVNoZWV0
Q29sbGVjdGlvbi5oIgorCQkJCT4KKwkJCTwvRmlsZT4KIAkJCTxGaWxlCiAJCQkJUmVsYXRpdmVQ
YXRoPSIuLlxkb21cRG9jdW1lbnRUaW1pbmcuaCIKIAkJCQk+CkluZGV4OiBTb3VyY2UvV2ViQ29y
ZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShyZXZpc2lvbiAxMjkz
OTcpCisrKyBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJ
KHdvcmtpbmcgY29weSkKQEAgLTYxNDEsNiArNjE0MSw4IEBACiAJCUU0Nzc4QjgwMTE1QTU4MUEw
MEI1RDM3MiAvKiBKU0N1c3RvbUV2ZW50LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSBFNDc3OEI3RTExNUE1ODFBMDBCNUQzNzIgLyogSlNDdXN0b21FdmVu
dC5oICovOyB9OwogCQlFNDdCNEJFODBFNzEyNDE2MDAwMzg4NTQgLyogQ2FjaGVkUmVzb3VyY2VI
YW5kbGUuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEU0
N0I0QkU2MEU3MTI0MTYwMDAzODg1NCAvKiBDYWNoZWRSZXNvdXJjZUhhbmRsZS5oICovOyBzZXR0
aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCUU0N0I0QkU5MEU3MTI0
MTYwMDAzODg1NCAvKiBDYWNoZWRSZXNvdXJjZUhhbmRsZS5jcHAgaW4gU291cmNlcyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFNDdCNEJFNzBFNzEyNDE2MDAwMzg4NTQgLyog
Q2FjaGVkUmVzb3VyY2VIYW5kbGUuY3BwICovOyB9OworCQlFNDdFMjc2NTE2MDM2RUQyMDBFRTJB
RkIgLyogRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5oIGluIEhlYWRlcnMgKi8gPSB7aXNh
ID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRTQ3RTI3NjQxNjAzNkVEMjAwRUUyQUZCIC8qIERv
Y3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9
IChQcml2YXRlLCApOyB9OyB9OworCQlFNDdFMjc2ODE2MDM2RURDMDBFRTJBRkIgLyogRG9jdW1l
bnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSBFNDdFMjc2NzE2MDM2RURDMDBFRTJBRkIgLyogRG9jdW1lbnRTdHls
ZVNoZWV0Q29sbGVjdGlvbi5jcHAgKi87IH07CiAJCUU0OTQ2RUFFMTU2RTY0REQwMEQzMjk3RiAv
KiBTdHlsZVJ1bGVJbXBvcnQuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gRTQ5NDZFQUMxNTZFNjRERDAwRDMyOTdGIC8qIFN0eWxlUnVsZUltcG9ydC5j
cHAgKi87IH07CiAJCUU0OTQ2RUFGMTU2RTY0REQwMEQzMjk3RiAvKiBTdHlsZVJ1bGVJbXBvcnQu
aCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEU0OTQ2RUFE
MTU2RTY0REQwMEQzMjk3RiAvKiBTdHlsZVJ1bGVJbXBvcnQuaCAqLzsgfTsKIAkJRTQ5QkQ5RkEx
MzFGRDJFRDAwM0M1NkYwIC8qIENTU1ZhbHVlUG9vbC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0g
UEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRTQ5QkQ5RjkxMzFGRDJFRDAwM0M1NkYwIC8qIENTU1Zh
bHVlUG9vbC5oICovOyB9OwpAQCAtMTM1MjAsNiArMTM1MjIsOCBAQAogCQlFNDc3OEI3RTExNUE1
ODFBMDBCNUQzNzIgLyogSlNDdXN0b21FdmVudC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7
IHBhdGggPSBKU0N1c3RvbUV2ZW50Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUU0
N0I0QkU2MEU3MTI0MTYwMDAzODg1NCAvKiBDYWNoZWRSZXNvdXJjZUhhbmRsZS5oICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBDYWNoZWRSZXNvdXJjZUhhbmRsZS5oOyBzb3VyY2VU
cmVlID0gIjxncm91cD4iOyB9OwogCQlFNDdCNEJFNzBFNzEyNDE2MDAwMzg4NTQgLyogQ2FjaGVk
UmVzb3VyY2VIYW5kbGUuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNv
ZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0g
Q2FjaGVkUmVzb3VyY2VIYW5kbGUuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlF
NDdFMjc2NDE2MDM2RUQyMDBFRTJBRkIgLyogRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5o
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93
bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBEb2N1bWVudFN0eWxlU2hlZXRDb2xs
ZWN0aW9uLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUU0N0UyNzY3MTYwMzZFREMw
MEVFMkFGQiAvKiBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmNwcCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uY3Bw
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlFNDk0NkVBQzE1NkU2NEREMDBEMzI5N0Yg
LyogU3R5bGVSdWxlSW1wb3J0LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0
aCA9IFN0eWxlUnVsZUltcG9ydC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUU0
OTQ2RUFEMTU2RTY0REQwMEQzMjk3RiAvKiBTdHlsZVJ1bGVJbXBvcnQuaCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuYy5oOyBwYXRoID0gU3R5bGVSdWxlSW1wb3J0Lmg7IHNvdXJjZVRyZWUgPSAiPGdy
b3VwPiI7IH07CiAJCUU0OUJEOUY5MTMxRkQyRUQwMDNDNTZGMCAvKiBDU1NWYWx1ZVBvb2wuaCAq
LyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25G
aWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQ1NTVmFsdWVQb29sLmg7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CkBAIC0yMTY3MSw2ICsyMTY3NSw4IEBACiAJCQkJMTQ5NDdGRkMx
MkY4MENEMjAwQTBGNjMxIC8qIERvY3VtZW50T3JkZXJlZE1hcC5oICovLAogCQkJCUE4QzIyODBE
MTFENEE1OTcwMEQ1QTdEMyAvKiBEb2N1bWVudFBhcnNlci5jcHAgKi8sCiAJCQkJQkNDRkJBRTcw
QjUxNTJFRDAwMDFGMUQ3IC8qIERvY3VtZW50UGFyc2VyLmggKi8sCisJCQkJRTQ3RTI3NjcxNjAz
NkVEQzAwRUUyQUZCIC8qIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uY3BwICovLAorCQkJ
CUU0N0UyNzY0MTYwMzZFRDIwMEVFMkFGQiAvKiBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9u
LmggKi8sCiAJCQkJODZEOTgyRjYxMjVDMTU0MDAwQUQ5RTNEIC8qIERvY3VtZW50VGltaW5nLmgg
Ki8sCiAJCQkJQTgxODVGMzIwOTc2NTc2NTAwNTgyNkQ5IC8qIERvY3VtZW50VHlwZS5jcHAgKi8s
CiAJCQkJQTgxODVGMzEwOTc2NTc2NTAwNTgyNkQ5IC8qIERvY3VtZW50VHlwZS5oICovLApAQCAt
MjIyNzUsNiArMjIyODEsNyBAQAogCQkJaXNhID0gUEJYSGVhZGVyc0J1aWxkUGhhc2U7CiAJCQli
dWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OwogCQkJZmlsZXMgPSAoCisJCQkJRTQ3RTI3NjUx
NjAzNkVEMjAwRUUyQUZCIC8qIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uaCBpbiBIZWFk
ZXJzICovLAogCQkJCTk3QkM2OURCMTUwNUYwNzYwMDFCNzRBQyAvKiBBYnN0cmFjdERhdGFiYXNl
LmggaW4gSGVhZGVycyAqLywKIAkJCQk0MUUxQjFEMTBGRjU5ODY5MDA1NzZCM0IgLyogQWJzdHJh
Y3RXb3JrZXIuaCBpbiBIZWFkZXJzICovLAogCQkJCTI5QTgxMjJFMEZCQjlDMUQwMDUxMDI5MyAv
KiBBY2Nlc3NpYmlsaXR5QVJJQUdyaWRDZWxsLmggaW4gSGVhZGVycyAqLywKQEAgLTI4NjY4LDYg
KzI4Njc1LDcgQEAKIAkJCQlFMUJFNTEyRDBDRjZDNTEyMDAyRUE5NTkgLyogWFNMVFVuaWNvZGVT
b3J0LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTk3N0UyRTBFMTJGMEZDOUMwMEMxMzM3OSAvKiBY
U1NBdWRpdG9yLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUZENTM3MzUyMTM3QjY1MTgwMDAwOERD
RSAvKiBaZXJvUG9sZS5jcHAgaW4gU291cmNlcyAqLywKKwkJCQlFNDdFMjc2ODE2MDM2RURDMDBF
RTJBRkIgLyogRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5jcHAgaW4gU291cmNlcyAqLywK
IAkJCQk0RjFEMTFCRjE1RkYzNzIwMDAyNkU5MDggLyogUGxhdGZvcm1NZW1vcnlJbnN0cnVtZW50
YXRpb24uY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkpOwogCQkJcnVuT25seUZvckRlcGxveW1lbnRQ
b3N0cHJvY2Vzc2luZyA9IDA7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9jc3MvU2VsZWN0b3JDaGVj
a2VyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9jc3MvU2VsZWN0b3JDaGVja2Vy
LmNwcAkocmV2aXNpb24gMTI5Mzk3KQorKysgU291cmNlL1dlYkNvcmUvY3NzL1NlbGVjdG9yQ2hl
Y2tlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlICJDU1NT
ZWxlY3Rvci5oIgogI2luY2x1ZGUgIkNTU1NlbGVjdG9yTGlzdC5oIgogI2luY2x1ZGUgIkRvY3Vt
ZW50LmgiCisjaW5jbHVkZSAiRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5oIgogI2luY2x1
ZGUgIkZvY3VzQ29udHJvbGxlci5oIgogI2luY2x1ZGUgIkZyYW1lLmgiCiAjaW5jbHVkZSAiRnJh
bWVTZWxlY3Rpb24uaCIKQEAgLTc4Myw3ICs3ODQsNyBAQCBib29sIFNlbGVjdG9yQ2hlY2tlcjo6
Y2hlY2tPbmVTZWxlY3RvcihjCiAgICAgICAgICAgICAgICAgaWYgKG1fbW9kZSA9PSBSZXNvbHZp
bmdTdHlsZSkgewogICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5lbGVtZW50U3R5bGUp
CiAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnRTdHlsZS0+c2V0RW1wdHlT
dGF0ZShyZXN1bHQpOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChlbGVtZW50LT5yZW5k
ZXJTdHlsZSgpICYmIChlbGVtZW50LT5kb2N1bWVudCgpLT51c2VzU2libGluZ1J1bGVzKCkgfHwg
ZWxlbWVudC0+cmVuZGVyU3R5bGUoKS0+dW5pcXVlKCkpKQorICAgICAgICAgICAgICAgICAgICBl
bHNlIGlmIChlbGVtZW50LT5yZW5kZXJTdHlsZSgpICYmIChlbGVtZW50LT5kb2N1bWVudCgpLT5z
dHlsZVNoZWV0Q29sbGVjdGlvbigpLT51c2VzU2libGluZ1J1bGVzKCkgfHwgZWxlbWVudC0+cmVu
ZGVyU3R5bGUoKS0+dW5pcXVlKCkpKQogICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC0+
cmVuZGVyU3R5bGUoKS0+c2V0RW1wdHlTdGF0ZShyZXN1bHQpOwogICAgICAgICAgICAgICAgIH0K
ICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwpAQCAtMTE4Nyw3ICsxMTg4LDcgQEAgYm9v
bCBTZWxlY3RvckNoZWNrZXI6OmNoZWNrT25lU2VsZWN0b3IoYwogICAgICAgICBQc2V1ZG9JZCBw
c2V1ZG9JZCA9IENTU1NlbGVjdG9yOjpwc2V1ZG9JZChzZWxlY3Rvci0+cHNldWRvVHlwZSgpKTsK
ICAgICAgICAgaWYgKHBzZXVkb0lkID09IEZJUlNUX0xFVFRFUikgewogICAgICAgICAgICAgaWYg
KERvY3VtZW50KiBkb2N1bWVudCA9IGVsZW1lbnQtPmRvY3VtZW50KCkpCi0gICAgICAgICAgICAg
ICAgZG9jdW1lbnQtPnNldFVzZXNGaXJzdExldHRlclJ1bGVzKHRydWUpOworICAgICAgICAgICAg
ICAgIGRvY3VtZW50LT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpLT5zZXRVc2VzRmlyc3RMZXR0ZXJS
dWxlcyh0cnVlKTsKICAgICAgICAgfQogICAgICAgICBpZiAocHNldWRvSWQgIT0gTk9QU0VVRE8p
CiAgICAgICAgICAgICBkeW5hbWljUHNldWRvID0gcHNldWRvSWQ7CkluZGV4OiBTb3VyY2UvV2Vi
Q29yZS9jc3MvU3R5bGVSZXNvbHZlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUv
Y3NzL1N0eWxlUmVzb2x2ZXIuY3BwCShyZXZpc2lvbiAxMjkzOTcpCisrKyBTb3VyY2UvV2ViQ29y
ZS9jc3MvU3R5bGVSZXNvbHZlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTYwLDYgKzYwLDcgQEAK
ICNpbmNsdWRlICJDb3VudGVyLmgiCiAjaW5jbHVkZSAiQ291bnRlckNvbnRlbnQuaCIKICNpbmNs
dWRlICJDdXJzb3JMaXN0LmgiCisjaW5jbHVkZSAiRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlv
bi5oIgogI2luY2x1ZGUgIkZvbnRGZWF0dXJlVmFsdWUuaCIKICNpbmNsdWRlICJGb250VmFsdWUu
aCIKICNpbmNsdWRlICJGcmFtZS5oIgpAQCAtNDI4LDEyICs0MjksMTMgQEAgU3R5bGVSZXNvbHZl
cjo6U3R5bGVSZXNvbHZlcihEb2N1bWVudCogZAogICAgIC8vIE5vdGUgdGhhdCB0aGVyZSB1c3Vh
bGx5IGlzIG9ubHkgMSBzaGVldCBmb3Igc2NvcGVkIHJ1bGVzLCBzbyBhdXRvLXNocmluay10by1m
aXQgaXMgZmluZS4KICAgICBtX2F1dGhvclN0eWxlLT5kaXNhYmxlQXV0b1Nocmlua1RvRml0KCk7
CiAKKyAgICBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uKiBzdHlsZVNoZWV0Q29sbGVjdGlv
biA9IGRvY3VtZW50LT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpOwogICAgIC8vIEZJWE1FOiBUaGlz
IHN1Y2tzISBUaGUgdXNlciBzaGVldCBpcyByZXBhcnNlZCBldmVyeSB0aW1lIQogICAgIE93blB0
cjxSdWxlU2V0PiB0ZW1wVXNlclN0eWxlID0gUnVsZVNldDo6Y3JlYXRlKCk7Ci0gICAgaWYgKENT
U1N0eWxlU2hlZXQqIHBhZ2VVc2VyU2hlZXQgPSBkb2N1bWVudC0+cGFnZVVzZXJTaGVldCgpKQor
ICAgIGlmIChDU1NTdHlsZVNoZWV0KiBwYWdlVXNlclNoZWV0ID0gc3R5bGVTaGVldENvbGxlY3Rp
b24tPnBhZ2VVc2VyU2hlZXQoKSkKICAgICAgICAgdGVtcFVzZXJTdHlsZS0+YWRkUnVsZXNGcm9t
U2hlZXQocGFnZVVzZXJTaGVldC0+Y29udGVudHMoKSwgKm1fbWVkaXVtLCB0aGlzKTsKLSAgICBh
ZGRBdXRob3JSdWxlc0FuZENvbGxlY3RVc2VyUnVsZXNGcm9tU2hlZXRzKGRvY3VtZW50LT5wYWdl
R3JvdXBVc2VyU2hlZXRzKCksICp0ZW1wVXNlclN0eWxlKTsKLSAgICBhZGRBdXRob3JSdWxlc0Fu
ZENvbGxlY3RVc2VyUnVsZXNGcm9tU2hlZXRzKGRvY3VtZW50LT5kb2N1bWVudFVzZXJTaGVldHMo
KSwgKnRlbXBVc2VyU3R5bGUpOworICAgIGFkZEF1dGhvclJ1bGVzQW5kQ29sbGVjdFVzZXJSdWxl
c0Zyb21TaGVldHMoc3R5bGVTaGVldENvbGxlY3Rpb24tPnBhZ2VHcm91cFVzZXJTaGVldHMoKSwg
KnRlbXBVc2VyU3R5bGUpOworICAgIGFkZEF1dGhvclJ1bGVzQW5kQ29sbGVjdFVzZXJSdWxlc0Zy
b21TaGVldHMoc3R5bGVTaGVldENvbGxlY3Rpb24tPmRvY3VtZW50VXNlclNoZWV0cygpLCAqdGVt
cFVzZXJTdHlsZSk7CiAgICAgaWYgKHRlbXBVc2VyU3R5bGUtPm1fcnVsZUNvdW50ID4gMCB8fCB0
ZW1wVXNlclN0eWxlLT5tX3BhZ2VSdWxlcy5zaXplKCkgPiAwKQogICAgICAgICBtX3VzZXJTdHls
ZSA9IHRlbXBVc2VyU3R5bGUucmVsZWFzZSgpOwogCkBAIC00NDcsNyArNDQ5LDcgQEAgU3R5bGVS
ZXNvbHZlcjo6U3R5bGVSZXNvbHZlcihEb2N1bWVudCogZAogI2VuZGlmCiAKICAgICBhZGRTdHls
ZXNoZWV0c0Zyb21TZWFtbGVzc1BhcmVudHMoKTsKLSAgICBhcHBlbmRBdXRob3JTdHlsZXNoZWV0
cygwLCBkb2N1bWVudC0+c3R5bGVTaGVldHMoKS0+dmVjdG9yKCkpOworICAgIGFwcGVuZEF1dGhv
clN0eWxlc2hlZXRzKDAsIHN0eWxlU2hlZXRDb2xsZWN0aW9uLT5hdXRob3JTdHlsZVNoZWV0cygp
LT52ZWN0b3IoKSk7CiB9CiAKIHZvaWQgU3R5bGVSZXNvbHZlcjo6YWRkU3R5bGVzaGVldHNGcm9t
U2VhbWxlc3NQYXJlbnRzKCkKQEAgLTcwOCw3ICs3MTAsNiBAQCB2b2lkIFN0eWxlUmVzb2x2ZXI6
OnN3ZWVwTWF0Y2hlZFByb3BlcnRpCiBTdHlsZVJlc29sdmVyOjpGZWF0dXJlczo6RmVhdHVyZXMo
KQogICAgIDogdXNlc0ZpcnN0TGluZVJ1bGVzKGZhbHNlKQogICAgICwgdXNlc0JlZm9yZUFmdGVy
UnVsZXMoZmFsc2UpCi0gICAgLCB1c2VzTGlua1J1bGVzKGZhbHNlKQogewogfQogCkBAIC03Mjgs
NyArNzI5LDYgQEAgdm9pZCBTdHlsZVJlc29sdmVyOjpGZWF0dXJlczo6YWRkKGNvbnN0IAogICAg
IHVuY29tbW9uQXR0cmlidXRlUnVsZXMuYXBwZW5kKG90aGVyLnVuY29tbW9uQXR0cmlidXRlUnVs
ZXMpOwogICAgIHVzZXNGaXJzdExpbmVSdWxlcyA9IHVzZXNGaXJzdExpbmVSdWxlcyB8fCBvdGhl
ci51c2VzRmlyc3RMaW5lUnVsZXM7CiAgICAgdXNlc0JlZm9yZUFmdGVyUnVsZXMgPSB1c2VzQmVm
b3JlQWZ0ZXJSdWxlcyB8fCBvdGhlci51c2VzQmVmb3JlQWZ0ZXJSdWxlczsKLSAgICB1c2VzTGlu
a1J1bGVzID0gdXNlc0xpbmtSdWxlcyB8fCBvdGhlci51c2VzTGlua1J1bGVzOwogfQogCiB2b2lk
IFN0eWxlUmVzb2x2ZXI6OkZlYXR1cmVzOjpjbGVhcigpCkBAIC03MzksNyArNzM5LDYgQEAgdm9p
ZCBTdHlsZVJlc29sdmVyOjpGZWF0dXJlczo6Y2xlYXIoKQogICAgIHVuY29tbW9uQXR0cmlidXRl
UnVsZXMuY2xlYXIoKTsKICAgICB1c2VzRmlyc3RMaW5lUnVsZXMgPSBmYWxzZTsKICAgICB1c2Vz
QmVmb3JlQWZ0ZXJSdWxlcyA9IGZhbHNlOwotICAgIHVzZXNMaW5rUnVsZXMgPSBmYWxzZTsKIH0K
IAogdm9pZCBTdHlsZVJlc29sdmVyOjpGZWF0dXJlczo6cmVwb3J0TWVtb3J5VXNhZ2UoTWVtb3J5
T2JqZWN0SW5mbyogbWVtb3J5T2JqZWN0SW5mbykgY29uc3QKQEAgLTI2MDUsMTAgKzI2MDQsNiBA
QCBzdGF0aWMgaW5saW5lIHZvaWQgY29sbGVjdEZlYXR1cmVzRnJvbVNlCiAgICAgY2FzZSBDU1NT
ZWxlY3Rvcjo6UHNldWRvQWZ0ZXI6CiAgICAgICAgIGZlYXR1cmVzLnVzZXNCZWZvcmVBZnRlclJ1
bGVzID0gdHJ1ZTsKICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDU1NTZWxlY3Rvcjo6UHNldWRv
TGluazoKLSAgICBjYXNlIENTU1NlbGVjdG9yOjpQc2V1ZG9WaXNpdGVkOgotICAgICAgICBmZWF0
dXJlcy51c2VzTGlua1J1bGVzID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoK
ICAgICAgICAgYnJlYWs7CiAgICAgfQpAQCAtMzE4MSwyNSArMzE3NiwyNSBAQCBzdGF0aWMgdm9p
ZCBjb2xsZWN0Q1NTT01XcmFwcGVycyhIYXNoTWFwCiAgICAgY29sbGVjdENTU09NV3JhcHBlcnMo
d3JhcHBlck1hcCwgc3R5bGVTaGVldFdyYXBwZXIuZ2V0KCkpOwogfQogCi1zdGF0aWMgdm9pZCBj
b2xsZWN0Q1NTT01XcmFwcGVycyhIYXNoTWFwPFN0eWxlUnVsZSosIFJlZlB0cjxDU1NTdHlsZVJ1
bGU+ID4mIHdyYXBwZXJNYXAsIERvY3VtZW50KiBkb2N1bWVudCkKK3N0YXRpYyB2b2lkIGNvbGxl
Y3RDU1NPTVdyYXBwZXJzKEhhc2hNYXA8U3R5bGVSdWxlKiwgUmVmUHRyPENTU1N0eWxlUnVsZT4g
PiYgd3JhcHBlck1hcCwgRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbiogc3R5bGVTaGVldENv
bGxlY3Rpb24pCiB7Ci0gICAgY29uc3QgVmVjdG9yPFJlZlB0cjxTdHlsZVNoZWV0PiA+JiBzdHls
ZVNoZWV0cyA9IGRvY3VtZW50LT5zdHlsZVNoZWV0cygpLT52ZWN0b3IoKTsKKyAgICBjb25zdCBW
ZWN0b3I8UmVmUHRyPFN0eWxlU2hlZXQ+ID4mIHN0eWxlU2hlZXRzID0gc3R5bGVTaGVldENvbGxl
Y3Rpb24tPmF1dGhvclN0eWxlU2hlZXRzKCktPnZlY3RvcigpOwogICAgIGZvciAodW5zaWduZWQg
aSA9IDA7IGkgPCBzdHlsZVNoZWV0cy5zaXplKCk7ICsraSkgewogICAgICAgICBTdHlsZVNoZWV0
KiBzdHlsZVNoZWV0ID0gc3R5bGVTaGVldHNbaV0uZ2V0KCk7CiAgICAgICAgIGlmICghc3R5bGVT
aGVldC0+aXNDU1NTdHlsZVNoZWV0KCkpCiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAg
Y29sbGVjdENTU09NV3JhcHBlcnMod3JhcHBlck1hcCwgc3RhdGljX2Nhc3Q8Q1NTU3R5bGVTaGVl
dCo+KHN0eWxlU2hlZXQpKTsKICAgICB9Ci0gICAgY29sbGVjdENTU09NV3JhcHBlcnMod3JhcHBl
ck1hcCwgZG9jdW1lbnQtPnBhZ2VVc2VyU2hlZXQoKSk7CisgICAgY29sbGVjdENTU09NV3JhcHBl
cnMod3JhcHBlck1hcCwgc3R5bGVTaGVldENvbGxlY3Rpb24tPnBhZ2VVc2VyU2hlZXQoKSk7CiAg
ICAgewotICAgICAgICBjb25zdCBWZWN0b3I8UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4qIHBhZ2VH
cm91cFVzZXJTaGVldHMgPSBkb2N1bWVudC0+cGFnZUdyb3VwVXNlclNoZWV0cygpOworICAgICAg
ICBjb25zdCBWZWN0b3I8UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4qIHBhZ2VHcm91cFVzZXJTaGVl
dHMgPSBzdHlsZVNoZWV0Q29sbGVjdGlvbi0+cGFnZUdyb3VwVXNlclNoZWV0cygpOwogICAgICAg
ICBpZiAocGFnZUdyb3VwVXNlclNoZWV0cykgewogICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9
IDAsIHNpemUgPSBwYWdlR3JvdXBVc2VyU2hlZXRzLT5zaXplKCk7IGkgPCBzaXplOyArK2kpCiAg
ICAgICAgICAgICAgICAgY29sbGVjdENTU09NV3JhcHBlcnMod3JhcHBlck1hcCwgcGFnZUdyb3Vw
VXNlclNoZWV0cy0+YXQoaSkuZ2V0KCkpOwogICAgICAgICB9CiAgICAgfQogICAgIHsKLSAgICAg
ICAgY29uc3QgVmVjdG9yPFJlZlB0cjxDU1NTdHlsZVNoZWV0PiA+KiBkb2N1bWVudFVzZXJTaGVl
dHMgPSBkb2N1bWVudC0+ZG9jdW1lbnRVc2VyU2hlZXRzKCk7CisgICAgICAgIGNvbnN0IFZlY3Rv
cjxSZWZQdHI8Q1NTU3R5bGVTaGVldD4gPiogZG9jdW1lbnRVc2VyU2hlZXRzID0gc3R5bGVTaGVl
dENvbGxlY3Rpb24tPmRvY3VtZW50VXNlclNoZWV0cygpOwogICAgICAgICBpZiAoZG9jdW1lbnRV
c2VyU2hlZXRzKSB7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMCwgc2l6ZSA9IGRvY3Vt
ZW50VXNlclNoZWV0cy0+c2l6ZSgpOyBpIDwgc2l6ZTsgKytpKQogICAgICAgICAgICAgICAgIGNv
bGxlY3RDU1NPTVdyYXBwZXJzKHdyYXBwZXJNYXAsIGRvY3VtZW50VXNlclNoZWV0cy0+YXQoaSku
Z2V0KCkpOwpAQCAtMzIxOCw3ICszMjEzLDcgQEAgQ1NTU3R5bGVSdWxlKiBTdHlsZVJlc29sdmVy
OjplbnN1cmVGdWxsQwogICAgICAgICBjb2xsZWN0Q1NTT01XcmFwcGVycyhtX3N0eWxlUnVsZVRv
Q1NTT01XcmFwcGVyTWFwLCBtX3N0eWxlU2hlZXRDU1NPTVdyYXBwZXJTZXQsIG1lZGlhQ29udHJv
bHNTdHlsZVNoZWV0KTsKICAgICAgICAgY29sbGVjdENTU09NV3JhcHBlcnMobV9zdHlsZVJ1bGVU
b0NTU09NV3JhcHBlck1hcCwgbV9zdHlsZVNoZWV0Q1NTT01XcmFwcGVyU2V0LCBmdWxsc2NyZWVu
U3R5bGVTaGVldCk7CiAKLSAgICAgICAgY29sbGVjdENTU09NV3JhcHBlcnMobV9zdHlsZVJ1bGVU
b0NTU09NV3JhcHBlck1hcCwgZG9jdW1lbnQoKSk7CisgICAgICAgIGNvbGxlY3RDU1NPTVdyYXBw
ZXJzKG1fc3R5bGVSdWxlVG9DU1NPTVdyYXBwZXJNYXAsIGRvY3VtZW50KCktPnN0eWxlU2hlZXRD
b2xsZWN0aW9uKCkpOwogICAgIH0KICAgICByZXR1cm4gbV9zdHlsZVJ1bGVUb0NTU09NV3JhcHBl
ck1hcC5nZXQocnVsZSkuZ2V0KCk7CiB9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9jc3MvU3R5bGVS
ZXNvbHZlci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2Nzcy9TdHlsZVJlc29sdmVy
LmgJKHJldmlzaW9uIDEyOTM5NykKKysrIFNvdXJjZS9XZWJDb3JlL2Nzcy9TdHlsZVJlc29sdmVy
LmgJKHdvcmtpbmcgY29weSkKQEAgLTI0NCw3ICsyNDQsNiBAQCBwdWJsaWM6CiAgICAgYm9vbCB1
c2VzU2libGluZ1J1bGVzKCkgY29uc3QgeyByZXR1cm4gIW1fZmVhdHVyZXMuc2libGluZ1J1bGVz
LmlzRW1wdHkoKTsgfQogICAgIGJvb2wgdXNlc0ZpcnN0TGluZVJ1bGVzKCkgY29uc3QgeyByZXR1
cm4gbV9mZWF0dXJlcy51c2VzRmlyc3RMaW5lUnVsZXM7IH0KICAgICBib29sIHVzZXNCZWZvcmVB
ZnRlclJ1bGVzKCkgY29uc3QgeyByZXR1cm4gbV9mZWF0dXJlcy51c2VzQmVmb3JlQWZ0ZXJSdWxl
czsgfQotICAgIGJvb2wgdXNlc0xpbmtSdWxlcygpIGNvbnN0IHsgcmV0dXJuIG1fZmVhdHVyZXMu
dXNlc0xpbmtSdWxlczsgfQogCiAgICAgc3RhdGljIGJvb2wgY3JlYXRlVHJhbnNmb3JtT3BlcmF0
aW9ucyhDU1NWYWx1ZSogaW5WYWx1ZSwgUmVuZGVyU3R5bGUqIGluU3R5bGUsIFJlbmRlclN0eWxl
KiByb290U3R5bGUsIFRyYW5zZm9ybU9wZXJhdGlvbnMmIG91dE9wZXJhdGlvbnMpOwogICAgIApA
QCAtMjk3LDcgKzI5Niw2IEBAIHB1YmxpYzoKICAgICAgICAgVmVjdG9yPFJ1bGVGZWF0dXJlPiB1
bmNvbW1vbkF0dHJpYnV0ZVJ1bGVzOwogICAgICAgICBib29sIHVzZXNGaXJzdExpbmVSdWxlczsK
ICAgICAgICAgYm9vbCB1c2VzQmVmb3JlQWZ0ZXJSdWxlczsKLSAgICAgICAgYm9vbCB1c2VzTGlu
a1J1bGVzOwogICAgIH07CiAKIHByaXZhdGU6CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9kb20vRG9j
dW1lbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2RvbS9Eb2N1bWVudC5jcHAJ
KHJldmlzaW9uIDEyOTM5NykKKysrIFNvdXJjZS9XZWJDb3JlL2RvbS9Eb2N1bWVudC5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTU3LDYgKzU3LDcgQEAKICNpbmNsdWRlICJEb2N1bWVudEZyYWdtZW50
LmgiCiAjaW5jbHVkZSAiRG9jdW1lbnRMb2FkZXIuaCIKICNpbmNsdWRlICJEb2N1bWVudE1hcmtl
ckNvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmgi
CiAjaW5jbHVkZSAiRG9jdW1lbnRUeXBlLmgiCiAjaW5jbHVkZSAiRWRpdGluZ1RleHQuaCIKICNp
bmNsdWRlICJFZGl0b3IuaCIKQEAgLTQzNyw4ICs0MzgsNyBAQCBEb2N1bWVudDo6RG9jdW1lbnQo
RnJhbWUqIGZyYW1lLCBjb25zdCBLCiAjaWYgRU5BQkxFKE1VVEFUSU9OX09CU0VSVkVSUykKICAg
ICAsIG1fbXV0YXRpb25PYnNlcnZlclR5cGVzKDApCiAjZW5kaWYKLSAgICAsIG1fc3R5bGVTaGVl
dHMoU3R5bGVTaGVldExpc3Q6OmNyZWF0ZSh0aGlzKSkKLSAgICAsIG1faGFkQWN0aXZlTG9hZGlu
Z1N0eWxlc2hlZXQoZmFsc2UpCisgICAgLCBtX3N0eWxlU2hlZXRDb2xsZWN0aW9uKGFkb3B0UHRy
KG5ldyBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uKHRoaXMpKSkKICAgICAsIG1fcmVhZHlT
dGF0ZShDb21wbGV0ZSkKICAgICAsIG1fc3R5bGVSZWNhbGNUaW1lcih0aGlzLCAmRG9jdW1lbnQ6
OnN0eWxlUmVjYWxjVGltZXJGaXJlZCkKICAgICAsIG1fcGVuZGluZ1N0eWxlUmVjYWxjU2hvdWxk
Rm9yY2UoZmFsc2UpCkBAIC01MDQsOCArNTA0LDYgQEAgRG9jdW1lbnQ6OkRvY3VtZW50KEZyYW1l
KiBmcmFtZSwgY29uc3QgSwogewogICAgIG1fZG9jdW1lbnQgPSB0aGlzOwogCi0gICAgbV9wYWdl
R3JvdXBVc2VyU2hlZXRDYWNoZVZhbGlkID0gZmFsc2U7Ci0KICAgICBtX3ByaW50aW5nID0gZmFs
c2U7CiAgICAgbV9wYWdpbmF0ZWRGb3JTY3JlZW4gPSBmYWxzZTsKIApAQCAtNTQzLDIwICs1NDEs
OSBAQCBEb2N1bWVudDo6RG9jdW1lbnQoRnJhbWUqIGZyYW1lLCBjb25zdCBLCiAgICAgbV9pblN0
eWxlUmVjYWxjID0gZmFsc2U7CiAgICAgbV9jbG9zZUFmdGVyU3R5bGVSZWNhbGMgPSBmYWxzZTsK
IAotICAgIG1fdXNlc1NpYmxpbmdSdWxlcyA9IGZhbHNlOwotICAgIG1fdXNlc1NpYmxpbmdSdWxl
c092ZXJyaWRlID0gZmFsc2U7Ci0gICAgbV91c2VzRmlyc3RMaW5lUnVsZXMgPSBmYWxzZTsKLSAg
ICBtX3VzZXNGaXJzdExldHRlclJ1bGVzID0gZmFsc2U7Ci0gICAgbV91c2VzQmVmb3JlQWZ0ZXJS
dWxlcyA9IGZhbHNlOwotICAgIG1fdXNlc0JlZm9yZUFmdGVyUnVsZXNPdmVycmlkZSA9IGZhbHNl
OwotICAgIG1fdXNlc1JlbVVuaXRzID0gZmFsc2U7Ci0gICAgbV91c2VzTGlua1J1bGVzID0gZmFs
c2U7Ci0KICAgICBtX2dvdG9BbmNob3JOZWVkZWRBZnRlclN0eWxlc2hlZXRzTG9hZCA9IGZhbHNl
OwogCiAgICAgbV9kaWRDYWxjdWxhdGVTdHlsZVJlc29sdmVyID0gZmFsc2U7Ci0gICAgbV9oYXNE
aXJ0eVN0eWxlUmVzb2x2ZXIgPSBmYWxzZTsKLSAgICBtX3BlbmRpbmdTdHlsZXNoZWV0cyA9IDA7
CiAgICAgbV9pZ25vcmVQZW5kaW5nU3R5bGVzaGVldHMgPSBmYWxzZTsKICAgICBtX25lZWRzTm90
aWZ5UmVtb3ZlQWxsUGVuZGluZ1N0eWxlc2hlZXQgPSBmYWxzZTsKICAgICBtX2hhc05vZGVzV2l0
aFBsYWNlaG9sZGVyU3R5bGUgPSBmYWxzZTsKQEAgLTY0MywyNCArNjMwLDEzIEBAIERvY3VtZW50
Ojp+RG9jdW1lbnQoKQogCiAgICAgbV9kZWNvZGVyID0gMDsKIAotICAgIGlmIChtX3N0eWxlU2hl
ZXRzKQotICAgICAgICBtX3N0eWxlU2hlZXRzLT5kb2N1bWVudERlc3Ryb3llZCgpOworICAgIG1f
c3R5bGVTaGVldENvbGxlY3Rpb24uY2xlYXIoKTsKIAogICAgIGlmIChtX25hbWVkRmxvd3MpCiAg
ICAgICAgIG1fbmFtZWRGbG93cy0+ZG9jdW1lbnREZXN0cm95ZWQoKTsKIAogICAgIGlmIChtX2Vs
ZW1TaGVldCkKICAgICAgICAgbV9lbGVtU2hlZXQtPmNsZWFyT3duZXJOb2RlKCk7Ci0gICAgaWYg
KG1fcGFnZVVzZXJTaGVldCkKLSAgICAgICAgbV9wYWdlVXNlclNoZWV0LT5jbGVhck93bmVyTm9k
ZSgpOwotICAgIGlmIChtX3BhZ2VHcm91cFVzZXJTaGVldHMpIHsKLSAgICAgICAgZm9yIChzaXpl
X3QgaSA9IDA7IGkgPCBtX3BhZ2VHcm91cFVzZXJTaGVldHMtPnNpemUoKTsgKytpKQotICAgICAg
ICAgICAgKCptX3BhZ2VHcm91cFVzZXJTaGVldHMpW2ldLT5jbGVhck93bmVyTm9kZSgpOwotICAg
IH0KLSAgICBpZiAobV91c2VyU2hlZXRzKSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBp
IDwgbV91c2VyU2hlZXRzLT5zaXplKCk7ICsraSkKLSAgICAgICAgICAgICgqbV91c2VyU2hlZXRz
KVtpXS0+Y2xlYXJPd25lck5vZGUoKTsKLSAgICB9CiAKICAgICBkZWxldGVDdXN0b21Gb250cygp
OwogCkBAIC04MDIsMTQgKzc3OCwxNCBAQCB2b2lkIERvY3VtZW50OjpzZXRDb21wYXRpYmlsaXR5
TW9kZShDb21wCiB7CiAgICAgaWYgKG1fY29tcGF0aWJpbGl0eU1vZGVMb2NrZWQgfHwgbW9kZSA9
PSBtX2NvbXBhdGliaWxpdHlNb2RlKQogICAgICAgICByZXR1cm47Ci0gICAgQVNTRVJUKCFtX3N0
eWxlU2hlZXRzLT5sZW5ndGgoKSk7CisgICAgQVNTRVJUKCFtX3N0eWxlU2hlZXRDb2xsZWN0aW9u
LT5hdXRob3JTdHlsZVNoZWV0cygpLT5sZW5ndGgoKSk7CiAgICAgYm9vbCB3YXNJblF1aXJrc01v
ZGUgPSBpblF1aXJrc01vZGUoKTsKICAgICBtX2NvbXBhdGliaWxpdHlNb2RlID0gbW9kZTsKICAg
ICBzZWxlY3RvclF1ZXJ5Q2FjaGUoKS0+aW52YWxpZGF0ZSgpOwogICAgIGlmIChpblF1aXJrc01v
ZGUoKSAhPSB3YXNJblF1aXJrc01vZGUpIHsKICAgICAgICAgLy8gQWxsIHVzZXIgc3R5bGVzaGVl
dHMgaGF2ZSB0byByZXBhcnNlIHVzaW5nIHRoZSBkaWZmZXJlbnQgbW9kZS4KLSAgICAgICAgY2xl
YXJQYWdlVXNlclNoZWV0KCk7Ci0gICAgICAgIGNsZWFyUGFnZUdyb3VwVXNlclNoZWV0cygpOwor
ICAgICAgICBtX3N0eWxlU2hlZXRDb2xsZWN0aW9uLT5jbGVhclBhZ2VVc2VyU2hlZXQoKTsKKyAg
ICAgICAgbV9zdHlsZVNoZWV0Q29sbGVjdGlvbi0+Y2xlYXJQYWdlR3JvdXBVc2VyU2hlZXRzKCk7
CiAgICAgfQogfQogCkBAIC0xODIyLDEzICsxNzk4LDEzIEBAIHZvaWQgRG9jdW1lbnQ6OnJlY2Fs
Y1N0eWxlKFN0eWxlQ2hhbmdlIGMKICAgICAvLyByZS1hdHRhY2hpbmcgb3VyIGNvbnRhaW5pbmcg
aWZyYW1lLCB3aGljaCB3aGVuIGFza2VkIEhUTUxGcmFtZUVsZW1lbnRCYXNlOjppc1VSTEFsbG93
ZWQKICAgICAvLyBoaXRzIGEgbnVsbC1kZXJlZmVyZW5jZSBkdWUgdG8gc2VjdXJpdHkgY29kZSBh
bHdheXMgYXNzdW1pbmcgdGhlIGRvY3VtZW50IGhhcyBhIFNlY3VyaXR5T3JpZ2luLgogCi0gICAg
aWYgKG1faGFzRGlydHlTdHlsZVJlc29sdmVyKQotICAgICAgICB1cGRhdGVBY3RpdmVTdHlsZXNo
ZWV0cyhSZWNhbGNTdHlsZUltbWVkaWF0ZWx5KTsKKyAgICBpZiAobV9zdHlsZVNoZWV0Q29sbGVj
dGlvbi0+bmVlZHNVcGRhdGVBY3RpdmVTdHlsZXNoZWV0c09uU3R5bGVSZWNhbGMoKSkKKyAgICAg
ICAgbV9zdHlsZVNoZWV0Q29sbGVjdGlvbi0+dXBkYXRlQWN0aXZlU3R5bGVTaGVldHMoRG9jdW1l
bnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6RnVsbFVwZGF0ZSk7CiAKICAgICBJbnNwZWN0b3JJbnN0
cnVtZW50YXRpb25Db29raWUgY29va2llID0gSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjp3aWxs
UmVjYWxjdWxhdGVTdHlsZSh0aGlzKTsKIAogICAgIGlmIChtX2VsZW1TaGVldCAmJiBtX2VsZW1T
aGVldC0+Y29udGVudHMoKS0+dXNlc1JlbVVuaXRzKCkpCi0gICAgICAgIG1fdXNlc1JlbVVuaXRz
ID0gdHJ1ZTsKKyAgICAgICAgbV9zdHlsZVNoZWV0Q29sbGVjdGlvbi0+c2V0VXNlc1JlbVVuaXQo
dHJ1ZSk7CiAKICAgICBtX2luU3R5bGVSZWNhbGMgPSB0cnVlOwogICAgIHN1c3BlbmRQb3N0QXR0
YWNoQ2FsbGJhY2tzKCk7CkBAIC0xODg0LDcgKzE4NjAsNyBAQCBiYWlsX291dDoKICAgICAKICAg
ICAvLyBQc2V1ZG8gZWxlbWVudCByZW1vdmFsIGFuZCBzaW1pbGFyIG1heSBvbmx5IHdvcmsgd2l0
aCB0aGVzZSBmbGFncyBzdGlsbCBzZXQuIFJlc2V0IHRoZW0gYWZ0ZXIgdGhlIHN0eWxlIHJlY2Fs
Yy4KICAgICBpZiAobV9zdHlsZVJlc29sdmVyKQotICAgICAgICByZXNldENTU0ZlYXR1cmVGbGFn
cygpOworICAgICAgICBtX3N0eWxlU2hlZXRDb2xsZWN0aW9uLT5yZXNldENTU0ZlYXR1cmVGbGFn
cygpOwogCiAgICAgaWYgKGZyYW1lVmlldykgewogICAgICAgICBmcmFtZVZpZXctPnJlc3VtZVNj
aGVkdWxlZEV2ZW50cygpOwpAQCAtMjA2NywzMyArMjA0MywxNiBAQCB2b2lkIERvY3VtZW50Ojpz
ZXRJc1ZpZXdTb3VyY2UoYm9vbCBpc1ZpCiAgICAgZGlkVXBkYXRlU2VjdXJpdHlPcmlnaW4oKTsK
IH0KIAotdm9pZCBEb2N1bWVudDo6Y29tYmluZUNTU0ZlYXR1cmVGbGFncygpCi17Ci0gICAgLy8g
RGVsYXkgcmVzZXR0aW5nIHRoZSBmbGFncyB1bnRpbCBhZnRlciBuZXh0IHN0eWxlIHJlY2FsYyBz
aW5jZSB1bmFwcGx5aW5nIHRoZSBzdHlsZSBtYXkgbm90IHdvcmsgd2l0aG91dCB0aGVzZSBzZXQg
KHRoaXMgaXMgdHJ1ZSBhdCBsZWFzdCB3aXRoIGJlZm9yZS9hZnRlcikuCi0gICAgbV91c2VzU2li
bGluZ1J1bGVzID0gbV91c2VzU2libGluZ1J1bGVzIHx8IG1fc3R5bGVSZXNvbHZlci0+dXNlc1Np
YmxpbmdSdWxlcygpOwotICAgIG1fdXNlc0ZpcnN0TGluZVJ1bGVzID0gbV91c2VzRmlyc3RMaW5l
UnVsZXMgfHwgbV9zdHlsZVJlc29sdmVyLT51c2VzRmlyc3RMaW5lUnVsZXMoKTsKLSAgICBtX3Vz
ZXNCZWZvcmVBZnRlclJ1bGVzID0gbV91c2VzQmVmb3JlQWZ0ZXJSdWxlcyB8fCBtX3N0eWxlUmVz
b2x2ZXItPnVzZXNCZWZvcmVBZnRlclJ1bGVzKCk7Ci0gICAgbV91c2VzTGlua1J1bGVzID0gbV91
c2VzTGlua1J1bGVzIHx8IG1fc3R5bGVSZXNvbHZlci0+dXNlc0xpbmtSdWxlcygpOwotfQotCi12
b2lkIERvY3VtZW50OjpyZXNldENTU0ZlYXR1cmVGbGFncygpCi17Ci0gICAgbV91c2VzU2libGlu
Z1J1bGVzID0gbV9zdHlsZVJlc29sdmVyLT51c2VzU2libGluZ1J1bGVzKCk7Ci0gICAgbV91c2Vz
Rmlyc3RMaW5lUnVsZXMgPSBtX3N0eWxlUmVzb2x2ZXItPnVzZXNGaXJzdExpbmVSdWxlcygpOwot
ICAgIG1fdXNlc0JlZm9yZUFmdGVyUnVsZXMgPSBtX3N0eWxlUmVzb2x2ZXItPnVzZXNCZWZvcmVB
ZnRlclJ1bGVzKCk7Ci0gICAgbV91c2VzTGlua1J1bGVzID0gbV9zdHlsZVJlc29sdmVyLT51c2Vz
TGlua1J1bGVzKCk7Ci19Ci0KIHZvaWQgRG9jdW1lbnQ6OmNyZWF0ZVN0eWxlUmVzb2x2ZXIoKQog
ewogICAgIGJvb2wgbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzID0gdHJ1ZTsKICAgICBpZiAoU2V0
dGluZ3MqIGRvY1NldHRpbmdzID0gc2V0dGluZ3MoKSkKICAgICAgICAgbWF0Y2hBdXRob3JBbmRV
c2VyU3R5bGVzID0gZG9jU2V0dGluZ3MtPmF1dGhvckFuZFVzZXJTdHlsZXNFbmFibGVkKCk7CiAg
ICAgbV9zdHlsZVJlc29sdmVyID0gYWRvcHRQdHIobmV3IFN0eWxlUmVzb2x2ZXIodGhpcywgbWF0
Y2hBdXRob3JBbmRVc2VyU3R5bGVzKSk7Ci0gICAgY29tYmluZUNTU0ZlYXR1cmVGbGFncygpOwor
ICAgIG1fc3R5bGVTaGVldENvbGxlY3Rpb24tPmNvbWJpbmVDU1NGZWF0dXJlRmxhZ3MoKTsKIH0K
IAotaW5saW5lIHZvaWQgRG9jdW1lbnQ6OmNsZWFyU3R5bGVSZXNvbHZlcigpCit2b2lkIERvY3Vt
ZW50OjpjbGVhclN0eWxlUmVzb2x2ZXIoKQogewogICAgIG1fc3R5bGVSZXNvbHZlci5jbGVhcigp
OwogfQpAQCAtMjkwMywxMDUgKzI4NjIsMjMgQEAgRnJhbWUqIERvY3VtZW50OjpmaW5kVW5zYWZl
UGFyZW50U2Nyb2xsUAogICAgIHJldHVybiAwOwogfQogCi1DU1NTdHlsZVNoZWV0KiBEb2N1bWVu
dDo6cGFnZVVzZXJTaGVldCgpCi17Ci0gICAgaWYgKG1fcGFnZVVzZXJTaGVldCkKLSAgICAgICAg
cmV0dXJuIG1fcGFnZVVzZXJTaGVldC5nZXQoKTsKLSAgICAKLSAgICBQYWdlKiBvd25pbmdQYWdl
ID0gcGFnZSgpOwotICAgIGlmICghb3duaW5nUGFnZSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAg
Ci0gICAgU3RyaW5nIHVzZXJTaGVldFRleHQgPSBvd25pbmdQYWdlLT51c2VyU3R5bGVTaGVldCgp
OwotICAgIGlmICh1c2VyU2hlZXRUZXh0LmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0g
ICAgCi0gICAgLy8gUGFyc2UgdGhlIHNoZWV0IGFuZCBjYWNoZSBpdC4KLSAgICBtX3BhZ2VVc2Vy
U2hlZXQgPSBDU1NTdHlsZVNoZWV0OjpjcmVhdGVJbmxpbmUodGhpcywgc2V0dGluZ3MoKS0+dXNl
clN0eWxlU2hlZXRMb2NhdGlvbigpKTsKLSAgICBtX3BhZ2VVc2VyU2hlZXQtPmNvbnRlbnRzKCkt
PnNldElzVXNlclN0eWxlU2hlZXQodHJ1ZSk7Ci0gICAgbV9wYWdlVXNlclNoZWV0LT5jb250ZW50
cygpLT5wYXJzZVN0cmluZyh1c2VyU2hlZXRUZXh0KTsKLSAgICByZXR1cm4gbV9wYWdlVXNlclNo
ZWV0LmdldCgpOwotfQotCi12b2lkIERvY3VtZW50OjpjbGVhclBhZ2VVc2VyU2hlZXQoKQotewot
ICAgIGlmIChtX3BhZ2VVc2VyU2hlZXQpIHsKLSAgICAgICAgbV9wYWdlVXNlclNoZWV0ID0gMDsK
LSAgICAgICAgc3R5bGVSZXNvbHZlckNoYW5nZWQoRGVmZXJSZWNhbGNTdHlsZSk7Ci0gICAgfQot
fQotCi12b2lkIERvY3VtZW50Ojp1cGRhdGVQYWdlVXNlclNoZWV0KCkKLXsKLSAgICBjbGVhclBh
Z2VVc2VyU2hlZXQoKTsKLSAgICBpZiAocGFnZVVzZXJTaGVldCgpKQotICAgICAgICBzdHlsZVJl
c29sdmVyQ2hhbmdlZChSZWNhbGNTdHlsZUltbWVkaWF0ZWx5KTsKLX0KIAotY29uc3QgVmVjdG9y
PFJlZlB0cjxDU1NTdHlsZVNoZWV0PiA+KiBEb2N1bWVudDo6cGFnZUdyb3VwVXNlclNoZWV0cygp
IGNvbnN0Cit2b2lkIERvY3VtZW50OjpzZWFtbGVzc1BhcmVudFVwZGF0ZWRTdHlsZXNoZWV0cygp
CiB7Ci0gICAgaWYgKG1fcGFnZUdyb3VwVXNlclNoZWV0Q2FjaGVWYWxpZCkKLSAgICAgICAgcmV0
dXJuIG1fcGFnZUdyb3VwVXNlclNoZWV0cy5nZXQoKTsKLSAgICAKLSAgICBtX3BhZ2VHcm91cFVz
ZXJTaGVldENhY2hlVmFsaWQgPSB0cnVlOwotICAgIAotICAgIFBhZ2UqIG93bmluZ1BhZ2UgPSBw
YWdlKCk7Ci0gICAgaWYgKCFvd25pbmdQYWdlKQotICAgICAgICByZXR1cm4gMDsKLSAgICAgICAg
Ci0gICAgY29uc3QgUGFnZUdyb3VwJiBwYWdlR3JvdXAgPSBvd25pbmdQYWdlLT5ncm91cCgpOwot
ICAgIGNvbnN0IFVzZXJTdHlsZVNoZWV0TWFwKiBzaGVldHNNYXAgPSBwYWdlR3JvdXAudXNlclN0
eWxlU2hlZXRzKCk7Ci0gICAgaWYgKCFzaGVldHNNYXApCi0gICAgICAgIHJldHVybiAwOwotCi0g
ICAgVXNlclN0eWxlU2hlZXRNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IHNoZWV0c01hcC0+ZW5k
KCk7Ci0gICAgZm9yIChVc2VyU3R5bGVTaGVldE1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzaGVl
dHNNYXAtPmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICBjb25zdCBVc2VyU3R5
bGVTaGVldFZlY3Rvciogc2hlZXRzID0gaXQtPnNlY29uZC5nZXQoKTsKLSAgICAgICAgZm9yICh1
bnNpZ25lZCBpID0gMDsgaSA8IHNoZWV0cy0+c2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIGNv
bnN0IFVzZXJTdHlsZVNoZWV0KiBzaGVldCA9IHNoZWV0cy0+YXQoaSkuZ2V0KCk7Ci0gICAgICAg
ICAgICBpZiAoc2hlZXQtPmluamVjdGVkRnJhbWVzKCkgPT0gSW5qZWN0SW5Ub3BGcmFtZU9ubHkg
JiYgb3duZXJFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAg
ICBpZiAoIVVzZXJDb250ZW50VVJMUGF0dGVybjo6bWF0Y2hlc1BhdHRlcm5zKHVybCgpLCBzaGVl
dC0+d2hpdGVsaXN0KCksIHNoZWV0LT5ibGFja2xpc3QoKSkpCi0gICAgICAgICAgICAgICAgY29u
dGludWU7Ci0gICAgICAgICAgICBSZWZQdHI8Q1NTU3R5bGVTaGVldD4gZ3JvdXBTaGVldCA9IENT
U1N0eWxlU2hlZXQ6OmNyZWF0ZUlubGluZShjb25zdF9jYXN0PERvY3VtZW50Kj4odGhpcyksIHNo
ZWV0LT51cmwoKSk7Ci0gICAgICAgICAgICBpZiAoIW1fcGFnZUdyb3VwVXNlclNoZWV0cykKLSAg
ICAgICAgICAgICAgICBtX3BhZ2VHcm91cFVzZXJTaGVldHMgPSBhZG9wdFB0cihuZXcgVmVjdG9y
PFJlZlB0cjxDU1NTdHlsZVNoZWV0PiA+KTsKLSAgICAgICAgICAgIG1fcGFnZUdyb3VwVXNlclNo
ZWV0cy0+YXBwZW5kKGdyb3VwU2hlZXQpOwotICAgICAgICAgICAgZ3JvdXBTaGVldC0+Y29udGVu
dHMoKS0+c2V0SXNVc2VyU3R5bGVTaGVldChzaGVldC0+bGV2ZWwoKSA9PSBVc2VyU3R5bGVVc2Vy
TGV2ZWwpOwotICAgICAgICAgICAgZ3JvdXBTaGVldC0+Y29udGVudHMoKS0+cGFyc2VTdHJpbmco
c2hlZXQtPnNvdXJjZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBtX3BhZ2VH
cm91cFVzZXJTaGVldHMuZ2V0KCk7CisgICAgc3R5bGVSZXNvbHZlckNoYW5nZWQoUmVjYWxjU3R5
bGVJbW1lZGlhdGVseSk7CiB9CiAKLXZvaWQgRG9jdW1lbnQ6OmNsZWFyUGFnZUdyb3VwVXNlclNo
ZWV0cygpCit2b2lkIERvY3VtZW50OjpkaWRSZW1vdmVBbGxQZW5kaW5nU3R5bGVzaGVldCgpCiB7
Ci0gICAgbV9wYWdlR3JvdXBVc2VyU2hlZXRDYWNoZVZhbGlkID0gZmFsc2U7Ci0gICAgaWYgKG1f
cGFnZUdyb3VwVXNlclNoZWV0cyAmJiBtX3BhZ2VHcm91cFVzZXJTaGVldHMtPnNpemUoKSkgewot
ICAgICAgICBtX3BhZ2VHcm91cFVzZXJTaGVldHMtPmNsZWFyKCk7Ci0gICAgICAgIHN0eWxlUmVz
b2x2ZXJDaGFuZ2VkKERlZmVyUmVjYWxjU3R5bGUpOwotICAgIH0KLX0KKyAgICBtX25lZWRzTm90
aWZ5UmVtb3ZlQWxsUGVuZGluZ1N0eWxlc2hlZXQgPSBmYWxzZTsKIAotdm9pZCBEb2N1bWVudDo6
dXBkYXRlUGFnZUdyb3VwVXNlclNoZWV0cygpCi17Ci0gICAgY2xlYXJQYWdlR3JvdXBVc2VyU2hl
ZXRzKCk7Ci0gICAgaWYgKHBhZ2VHcm91cFVzZXJTaGVldHMoKSAmJiBwYWdlR3JvdXBVc2VyU2hl
ZXRzKCktPnNpemUoKSkKLSAgICAgICAgc3R5bGVSZXNvbHZlckNoYW5nZWQoUmVjYWxjU3R5bGVJ
bW1lZGlhdGVseSk7Ci19CisgICAgc3R5bGVSZXNvbHZlckNoYW5nZWQoUmVjYWxjU3R5bGVJZk5l
ZWRlZCk7CiAKLXZvaWQgRG9jdW1lbnQ6OmFkZFVzZXJTaGVldChQYXNzUmVmUHRyPFN0eWxlU2hl
ZXRDb250ZW50cz4gdXNlclNoZWV0KQotewotICAgIGlmICghbV91c2VyU2hlZXRzKQotICAgICAg
ICBtX3VzZXJTaGVldHMgPSBhZG9wdFB0cihuZXcgVmVjdG9yPFJlZlB0cjxDU1NTdHlsZVNoZWV0
PiA+KTsKLSAgICBtX3VzZXJTaGVldHMtPmFwcGVuZChDU1NTdHlsZVNoZWV0OjpjcmVhdGUodXNl
clNoZWV0LCB0aGlzKSk7Ci0gICAgc3R5bGVSZXNvbHZlckNoYW5nZWQoUmVjYWxjU3R5bGVJbW1l
ZGlhdGVseSk7Ci19CisgICAgaWYgKFNjcmlwdGFibGVEb2N1bWVudFBhcnNlciogcGFyc2VyID0g
c2NyaXB0YWJsZURvY3VtZW50UGFyc2VyKCkpCisgICAgICAgIHBhcnNlci0+ZXhlY3V0ZVNjcmlw
dHNXYWl0aW5nRm9yU3R5bGVzaGVldHMoKTsKIAotdm9pZCBEb2N1bWVudDo6c2VhbWxlc3NQYXJl
bnRVcGRhdGVkU3R5bGVzaGVldHMoKQotewotICAgIHN0eWxlUmVzb2x2ZXJDaGFuZ2VkKFJlY2Fs
Y1N0eWxlSW1tZWRpYXRlbHkpOworICAgIGlmIChtX2dvdG9BbmNob3JOZWVkZWRBZnRlclN0eWxl
c2hlZXRzTG9hZCAmJiB2aWV3KCkpCisgICAgICAgIHZpZXcoKS0+c2Nyb2xsVG9GcmFnbWVudCht
X3VybCk7CiB9CiAKIENTU1N0eWxlU2hlZXQqIERvY3VtZW50OjplbGVtZW50U2hlZXQoKQpAQCAt
MzA0Miw4ICsyOTE5LDggQEAgdm9pZCBEb2N1bWVudDo6cHJvY2Vzc0h0dHBFcXVpdihjb25zdCBT
dAogICAgICAgICAvLyBGb3IgbW9yZSBpbmZvLCBzZWUgdGhlIHRlc3QgYXQ6CiAgICAgICAgIC8v
IGh0dHA6Ly93d3cuaGl4aWUuY2gvdGVzdHMvZXZpbC9jc3MvaW1wb3J0L21haW4vcHJlZmVycmVk
Lmh0bWwKICAgICAgICAgLy8gLWR3aAotICAgICAgICBtX3NlbGVjdGVkU3R5bGVzaGVldFNldCA9
IGNvbnRlbnQ7Ci0gICAgICAgIG1fcHJlZmVycmVkU3R5bGVzaGVldFNldCA9IGNvbnRlbnQ7Cisg
ICAgICAgIG1fc3R5bGVTaGVldENvbGxlY3Rpb24tPnNldFNlbGVjdGVkU3R5bGVzaGVldFNldE5h
bWUoY29udGVudCk7CisgICAgICAgIG1fc3R5bGVTaGVldENvbGxlY3Rpb24tPnNldFByZWZlcnJl
ZFN0eWxlc2hlZXRTZXROYW1lKGNvbnRlbnQpOwogICAgICAgICBzdHlsZVJlc29sdmVyQ2hhbmdl
ZChEZWZlclJlY2FsY1N0eWxlKTsKICAgICB9IGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGVx
dWl2LCAicmVmcmVzaCIpKSB7CiAgICAgICAgIGRvdWJsZSBkZWxheTsKQEAgLTMzMTUsNjMgKzMx
OTIsMjUgQEAgUGFzc1JlZlB0cjxOb2RlPiBEb2N1bWVudDo6Y2xvbmVOb2RlKGJvbwogCiBTdHls
ZVNoZWV0TGlzdCogRG9jdW1lbnQ6OnN0eWxlU2hlZXRzKCkKIHsKLSAgICByZXR1cm4gbV9zdHls
ZVNoZWV0cy5nZXQoKTsKKyAgICByZXR1cm4gbV9zdHlsZVNoZWV0Q29sbGVjdGlvbi0+YXV0aG9y
U3R5bGVTaGVldHMoKTsKIH0KIAogU3RyaW5nIERvY3VtZW50OjpwcmVmZXJyZWRTdHlsZXNoZWV0
U2V0KCkgY29uc3QKIHsKLSAgICByZXR1cm4gbV9wcmVmZXJyZWRTdHlsZXNoZWV0U2V0OworICAg
IHJldHVybiBtX3N0eWxlU2hlZXRDb2xsZWN0aW9uLT5wcmVmZXJyZWRTdHlsZXNoZWV0U2V0TmFt
ZSgpOwogfQogCiBTdHJpbmcgRG9jdW1lbnQ6OnNlbGVjdGVkU3R5bGVzaGVldFNldCgpIGNvbnN0
CiB7Ci0gICAgcmV0dXJuIG1fc2VsZWN0ZWRTdHlsZXNoZWV0U2V0OworICAgIHJldHVybiBtX3N0
eWxlU2hlZXRDb2xsZWN0aW9uLT5zZWxlY3RlZFN0eWxlc2hlZXRTZXROYW1lKCk7CiB9CiAKIHZv
aWQgRG9jdW1lbnQ6OnNldFNlbGVjdGVkU3R5bGVzaGVldFNldChjb25zdCBTdHJpbmcmIGFTdHJp
bmcpCiB7Ci0gICAgbV9zZWxlY3RlZFN0eWxlc2hlZXRTZXQgPSBhU3RyaW5nOworICAgIG1fc3R5
bGVTaGVldENvbGxlY3Rpb24tPnNldFNlbGVjdGVkU3R5bGVzaGVldFNldE5hbWUoYVN0cmluZyk7
CiAgICAgc3R5bGVSZXNvbHZlckNoYW5nZWQoRGVmZXJSZWNhbGNTdHlsZSk7CiB9CiAKLS8vIFRo
aXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuZXZlciBhIHRvcC1sZXZlbCBzdHlsZXNoZWV0IGhhcyBm
aW5pc2hlZCBsb2FkaW5nLgotdm9pZCBEb2N1bWVudDo6cmVtb3ZlUGVuZGluZ1NoZWV0KFJlbW92
ZVBlbmRpbmdTaGVldE5vdGlmaWNhdGlvblR5cGUgbm90aWZpY2F0aW9uKQotewotICAgIC8vIE1h
a2Ugc3VyZSB3ZSBrbmV3IHRoaXMgc2hlZXQgd2FzIHBlbmRpbmcsIGFuZCB0aGF0IG91ciBjb3Vu
dCBpc24ndCBvdXQgb2Ygc3luYy4KLSAgICBBU1NFUlQobV9wZW5kaW5nU3R5bGVzaGVldHMgPiAw
KTsKLQotICAgIG1fcGVuZGluZ1N0eWxlc2hlZXRzLS07Ci0gICAgCi0jaWZkZWYgSU5TVFJVTUVO
VF9MQVlPVVRfU0NIRURVTElORwotICAgIGlmICghb3duZXJFbGVtZW50KCkpCi0gICAgICAgIHBy
aW50ZigiU3R5bGVzaGVldCBsb2FkZWQgYXQgdGltZSAlZC4gJWQgc3R5bGVzaGVldHMgc3RpbGwg
cmVtYWluLlxuIiwgZWxhcHNlZFRpbWUoKSwgbV9wZW5kaW5nU3R5bGVzaGVldHMpOwotI2VuZGlm
Ci0KLSAgICBpZiAobV9wZW5kaW5nU3R5bGVzaGVldHMpCi0gICAgICAgIHJldHVybjsKLQotICAg
IGlmIChub3RpZmljYXRpb24gPT0gUmVtb3ZlUGVuZGluZ1NoZWV0Tm90aWZ5TGF0ZXIpIHsKLSAg
ICAgICAgc2V0TmVlZHNOb3RpZnlSZW1vdmVBbGxQZW5kaW5nU3R5bGVzaGVldCgpOwotICAgICAg
ICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIGRpZFJlbW92ZUFsbFBlbmRpbmdTdHlsZXNoZWV0
KCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmRpZFJlbW92ZUFsbFBlbmRpbmdTdHlsZXNoZWV0KCkK
LXsKLSAgICBtX25lZWRzTm90aWZ5UmVtb3ZlQWxsUGVuZGluZ1N0eWxlc2hlZXQgPSBmYWxzZTsK
LQotICAgIHN0eWxlUmVzb2x2ZXJDaGFuZ2VkKFJlY2FsY1N0eWxlSWZOZWVkZWQpOwotCi0gICAg
aWYgKFNjcmlwdGFibGVEb2N1bWVudFBhcnNlciogcGFyc2VyID0gc2NyaXB0YWJsZURvY3VtZW50
UGFyc2VyKCkpCi0gICAgICAgIHBhcnNlci0+ZXhlY3V0ZVNjcmlwdHNXYWl0aW5nRm9yU3R5bGVz
aGVldHMoKTsKLQotICAgIGlmIChtX2dvdG9BbmNob3JOZWVkZWRBZnRlclN0eWxlc2hlZXRzTG9h
ZCAmJiB2aWV3KCkpCi0gICAgICAgIHZpZXcoKS0+c2Nyb2xsVG9GcmFnbWVudChtX3VybCk7Ci19
Ci0KLQogdm9pZCBEb2N1bWVudDo6ZXZhbHVhdGVNZWRpYVF1ZXJ5TGlzdCgpCiB7CiAgICAgaWYg
KG1fbWVkaWFRdWVyeU1hdGNoZXIpCkBAIC0zMzg2LDIwICszMjI1LDI0IEBAIHZvaWQgRG9jdW1l
bnQ6OnN0eWxlUmVzb2x2ZXJDaGFuZ2VkKFN0eWwKICAgICAgICAgbV9zdHlsZVJlc29sdmVyLmNs
ZWFyKCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CisgICAgbV9kaWRDYWxjdWxhdGVTdHlsZVJl
c29sdmVyID0gdHJ1ZTsKIAogI2lmZGVmIElOU1RSVU1FTlRfTEFZT1VUX1NDSEVEVUxJTkcKICAg
ICBpZiAoIW93bmVyRWxlbWVudCgpKQogICAgICAgICBwcmludGYoIkJlZ2lubmluZyB1cGRhdGUg
b2Ygc3R5bGUgc2VsZWN0b3IgYXQgdGltZSAlZC5cbiIsIGVsYXBzZWRUaW1lKCkpOwogI2VuZGlm
CiAKLSAgICBib29sIHN0eWxlc2hlZXRDaGFuZ2VSZXF1aXJlc1N0eWxlUmVjYWxjID0gdXBkYXRl
QWN0aXZlU3R5bGVzaGVldHModXBkYXRlRmxhZyk7CisgICAgRG9jdW1lbnRTdHlsZVNoZWV0Q29s
bGVjdGlvbjo6VXBkYXRlRmxhZyBzdHlsZVNoZWV0VXBkYXRlID0gKHVwZGF0ZUZsYWcgPT0gUmVj
YWxjU3R5bGVJZk5lZWRlZCkKKyAgICAgICAgPyBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9u
OjpPcHRpbWl6ZWRVcGRhdGUKKyAgICAgICAgOiBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9u
OjpGdWxsVXBkYXRlOworICAgIGJvb2wgc3R5bGVzaGVldENoYW5nZVJlcXVpcmVzU3R5bGVSZWNh
bGMgPSBtX3N0eWxlU2hlZXRDb2xsZWN0aW9uLT51cGRhdGVBY3RpdmVTdHlsZVNoZWV0cyhzdHls
ZVNoZWV0VXBkYXRlKTsKIAogICAgIGlmICh1cGRhdGVGbGFnID09IERlZmVyUmVjYWxjU3R5bGUp
IHsKICAgICAgICAgc2NoZWR1bGVGb3JjZWRTdHlsZVJlY2FsYygpOwogICAgICAgICByZXR1cm47
CiAgICAgfQogCi0gICAgaWYgKGRpZExheW91dFdpdGhQZW5kaW5nU3R5bGVzaGVldHMoKSAmJiBt
X3BlbmRpbmdTdHlsZXNoZWV0cyA8PSAwKSB7CisgICAgaWYgKGRpZExheW91dFdpdGhQZW5kaW5n
U3R5bGVzaGVldHMoKSAmJiAhbV9zdHlsZVNoZWV0Q29sbGVjdGlvbi0+aGFzUGVuZGluZ1NoZWV0
cygpKSB7CiAgICAgICAgIG1fcGVuZGluZ1NoZWV0TGF5b3V0ID0gSWdub3JlTGF5b3V0V2l0aFBl
bmRpbmdTaGVldHM7CiAgICAgICAgIGlmIChyZW5kZXJlcigpKQogICAgICAgICAgICAgcmVuZGVy
ZXIoKS0+cmVwYWludCgpOwpAQCAtMzQyOSwyMTkgKzMyNzIsNiBAQCB2b2lkIERvY3VtZW50Ojpz
dHlsZVJlc29sdmVyQ2hhbmdlZChTdHlsCiAgICAgZXZhbHVhdGVNZWRpYVF1ZXJ5TGlzdCgpOwog
fQogCi12b2lkIERvY3VtZW50OjphZGRTdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZShOb2RlKiBub2Rl
LCBib29sIGNyZWF0ZWRCeVBhcnNlcikKLXsKLSAgICBpZiAoIW5vZGUtPmluRG9jdW1lbnQoKSkK
LSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIC8vIFVudGlsIHRoZSA8Ym9keT4gZXhpc3RzLCB3
ZSBoYXZlIG5vIGNob2ljZSBidXQgdG8gY29tcGFyZSBkb2N1bWVudCBwb3NpdGlvbnMsCi0gICAg
Ly8gc2luY2Ugc3R5bGVzIG91dHNpZGUgb2YgdGhlIGJvZHkgYW5kIGhlYWQgY29udGludWUgdG8g
YmUgc2h1bnRlZCBpbnRvIHRoZSBoZWFkCi0gICAgLy8gKGFuZCB0aHVzIGNhbiBzaGlmdCB0byBl
bmQgdXAgYmVmb3JlIGR5bmFtaWNhbGx5IGFkZGVkIERPTSBjb250ZW50IHRoYXQgaXMgYWxzbwot
ICAgIC8vIG91dHNpZGUgdGhlIGJvZHkpLgotICAgIGlmICgoY3JlYXRlZEJ5UGFyc2VyICYmIGJv
ZHkoKSkgfHwgbV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAg
IG1fc3R5bGVTaGVldENhbmRpZGF0ZU5vZGVzLmFkZChub2RlKTsKLSAgICAgICAgcmV0dXJuOwot
ICAgIH0KLQotICAgIC8vIERldGVybWluZSBhbiBhcHByb3ByaWF0ZSBpbnNlcnRpb24gcG9pbnQu
Ci0gICAgU3R5bGVTaGVldENhbmRpZGF0ZUxpc3RIYXNoU2V0OjppdGVyYXRvciBiZWdpbiA9IG1f
c3R5bGVTaGVldENhbmRpZGF0ZU5vZGVzLmJlZ2luKCk7Ci0gICAgU3R5bGVTaGVldENhbmRpZGF0
ZUxpc3RIYXNoU2V0OjppdGVyYXRvciBlbmQgPSBtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcy5l
bmQoKTsKLSAgICBTdHlsZVNoZWV0Q2FuZGlkYXRlTGlzdEhhc2hTZXQ6Oml0ZXJhdG9yIGl0ID0g
ZW5kOwotICAgIE5vZGUqIGZvbGxvd2luZ05vZGUgPSAwOwotICAgIGRvIHsKLSAgICAgICAgLS1p
dDsKLSAgICAgICAgTm9kZSogbiA9ICppdDsKLSAgICAgICAgdW5zaWduZWQgc2hvcnQgcG9zaXRp
b24gPSBuLT5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihub2RlKTsKLSAgICAgICAgaWYgKHBvc2l0
aW9uID09IERPQ1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lORykgewotICAgICAgICAgICAgbV9zdHls
ZVNoZWV0Q2FuZGlkYXRlTm9kZXMuaW5zZXJ0QmVmb3JlKGZvbGxvd2luZ05vZGUsIG5vZGUpOwot
ICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZvbGxvd2luZ05vZGUgPSBu
OwotICAgIH0gd2hpbGUgKGl0ICE9IGJlZ2luKTsKLSAgICAKLSAgICBtX3N0eWxlU2hlZXRDYW5k
aWRhdGVOb2Rlcy5pbnNlcnRCZWZvcmUoZm9sbG93aW5nTm9kZSwgbm9kZSk7Ci19Ci0KLXZvaWQg
RG9jdW1lbnQ6OnJlbW92ZVN0eWxlU2hlZXRDYW5kaWRhdGVOb2RlKE5vZGUqIG5vZGUpCi17Ci0g
ICAgbV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMucmVtb3ZlKG5vZGUpOwotfQotCi12b2lkIERv
Y3VtZW50Ojpjb2xsZWN0QWN0aXZlU3R5bGVzaGVldHMoVmVjdG9yPFJlZlB0cjxTdHlsZVNoZWV0
PiA+JiBzaGVldHMpCi17Ci0gICAgaWYgKHNldHRpbmdzKCkgJiYgIXNldHRpbmdzKCktPmF1dGhv
ckFuZFVzZXJTdHlsZXNFbmFibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIFN0eWxlU2hl
ZXRDYW5kaWRhdGVMaXN0SGFzaFNldDo6aXRlcmF0b3IgYmVnaW4gPSBtX3N0eWxlU2hlZXRDYW5k
aWRhdGVOb2Rlcy5iZWdpbigpOwotICAgIFN0eWxlU2hlZXRDYW5kaWRhdGVMaXN0SGFzaFNldDo6
aXRlcmF0b3IgZW5kID0gbV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMuZW5kKCk7Ci0gICAgZm9y
IChTdHlsZVNoZWV0Q2FuZGlkYXRlTGlzdEhhc2hTZXQ6Oml0ZXJhdG9yIGl0ID0gYmVnaW47IGl0
ICE9IGVuZDsgKytpdCkgewotICAgICAgICBOb2RlKiBuID0gKml0OwotICAgICAgICBTdHlsZVNo
ZWV0KiBzaGVldCA9IDA7Ci0gICAgICAgIGlmIChuLT5ub2RlVHlwZSgpID09IFBST0NFU1NJTkdf
SU5TVFJVQ1RJT05fTk9ERSkgewotICAgICAgICAgICAgLy8gUHJvY2Vzc2luZyBpbnN0cnVjdGlv
biAoWE1MIGRvY3VtZW50cyBvbmx5KS4KLSAgICAgICAgICAgIC8vIFdlIGRvbid0IHN1cHBvcnQg
bGlua2luZyB0byBlbWJlZGRlZCBDU1Mgc3R5bGVzaGVldHMsIHNlZSA8aHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQ5MjgxPiBmb3IgZGlzY3Vzc2lvbi4KLSAgICAgICAg
ICAgIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiogcGkgPSBzdGF0aWNfY2FzdDxQcm9jZXNzaW5nSW5z
dHJ1Y3Rpb24qPihuKTsKLSAgICAgICAgICAgIHNoZWV0ID0gcGktPnNoZWV0KCk7Ci0jaWYgRU5B
QkxFKFhTTFQpCi0gICAgICAgICAgICAvLyBEb24ndCBhcHBseSBYU0wgdHJhbnNmb3JtcyB0byBh
bHJlYWR5IHRyYW5zZm9ybWVkIGRvY3VtZW50cyAtLSA8cmRhcjovL3Byb2JsZW0vNDEzMjgwNj4K
LSAgICAgICAgICAgIGlmIChwaS0+aXNYU0woKSAmJiAhdHJhbnNmb3JtU291cmNlRG9jdW1lbnQo
KSkgewotICAgICAgICAgICAgICAgIC8vIERvbid0IGFwcGx5IFhTTCB0cmFuc2Zvcm1zIHVudGls
IGxvYWRpbmcgaXMgZmluaXNoZWQuCi0gICAgICAgICAgICAgICAgaWYgKCFwYXJzaW5nKCkpCi0g
ICAgICAgICAgICAgICAgICAgIGFwcGx5WFNMVHJhbnNmb3JtKHBpKTsKLSAgICAgICAgICAgICAg
ICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgfSBlbHNlIGlmICgobi0+
aXNIVE1MRWxlbWVudCgpICYmIChuLT5oYXNUYWdOYW1lKGxpbmtUYWcpIHx8IG4tPmhhc1RhZ05h
bWUoc3R5bGVUYWcpKSkKLSNpZiBFTkFCTEUoU1ZHKQotICAgICAgICAgICAgICAgICAgIHx8ICAo
bi0+aXNTVkdFbGVtZW50KCkgJiYgbi0+aGFzVGFnTmFtZShTVkdOYW1lczo6c3R5bGVUYWcpKQot
I2VuZGlmCi0gICAgICAgICAgICAgICAgICAgKSB7Ci0gICAgICAgICAgICBFbGVtZW50KiBlID0g
c3RhdGljX2Nhc3Q8RWxlbWVudCo+KG4pOwotICAgICAgICAgICAgQXRvbWljU3RyaW5nIHRpdGxl
ID0gZS0+Z2V0QXR0cmlidXRlKHRpdGxlQXR0cik7Ci0gICAgICAgICAgICBib29sIGVuYWJsZWRW
aWFTY3JpcHQgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChlLT5oYXNMb2NhbE5hbWUobGlua1Rh
ZykpIHsKLSAgICAgICAgICAgICAgICAvLyA8TElOSz4gZWxlbWVudAotICAgICAgICAgICAgICAg
IEhUTUxMaW5rRWxlbWVudCogbGlua0VsZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MTGlua0VsZW1l
bnQqPihuKTsKLSAgICAgICAgICAgICAgICBpZiAobGlua0VsZW1lbnQtPmlzRGlzYWJsZWQoKSkK
LSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgZW5hYmxlZFZp
YVNjcmlwdCA9IGxpbmtFbGVtZW50LT5pc0VuYWJsZWRWaWFTY3JpcHQoKTsKLSAgICAgICAgICAg
ICAgICBpZiAobGlua0VsZW1lbnQtPnN0eWxlU2hlZXRJc0xvYWRpbmcoKSkgewotICAgICAgICAg
ICAgICAgICAgICAvLyBpdCBpcyBsb2FkaW5nIGJ1dCB3ZSBzaG91bGQgc3RpbGwgZGVjaWRlIHdo
aWNoIHN0eWxlIHNoZWV0IHNldCB0byB1c2UKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFlbmFi
bGVkVmlhU2NyaXB0ICYmICF0aXRsZS5pc0VtcHR5KCkgJiYgbV9wcmVmZXJyZWRTdHlsZXNoZWV0
U2V0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXRvbWljU3Ry
aW5nJiByZWwgPSBlLT5nZXRBdHRyaWJ1dGUocmVsQXR0cik7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICBpZiAoIXJlbC5jb250YWlucygiYWx0ZXJuYXRlIikpIHsKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBtX3ByZWZlcnJlZFN0eWxlc2hlZXRTZXQgPSB0aXRsZTsKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBtX3NlbGVjdGVkU3R5bGVzaGVldFNldCA9IHRpdGxlOwotICAgICAg
ICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAo
IWxpbmtFbGVtZW50LT5zaGVldCgpKQotICAgICAgICAgICAgICAgICAgICB0aXRsZSA9IG51bGxB
dG9tOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gR2V0IHRoZSBjdXJyZW50IHByZWZl
cnJlZCBzdHlsZXNldC4gIFRoaXMgaXMgdGhlCi0gICAgICAgICAgICAvLyBzZXQgb2Ygc2hlZXRz
IHRoYXQgd2lsbCBiZSBlbmFibGVkLgotI2lmIEVOQUJMRShTVkcpCi0gICAgICAgICAgICBpZiAo
bi0+aXNTVkdFbGVtZW50KCkgJiYgbi0+aGFzVGFnTmFtZShTVkdOYW1lczo6c3R5bGVUYWcpKQot
ICAgICAgICAgICAgICAgIHNoZWV0ID0gc3RhdGljX2Nhc3Q8U1ZHU3R5bGVFbGVtZW50Kj4obikt
PnNoZWV0KCk7Ci0gICAgICAgICAgICBlbHNlCi0jZW5kaWYKLSAgICAgICAgICAgIGlmIChlLT5o
YXNMb2NhbE5hbWUobGlua1RhZykpCi0gICAgICAgICAgICAgICAgc2hlZXQgPSBzdGF0aWNfY2Fz
dDxIVE1MTGlua0VsZW1lbnQqPihuKS0+c2hlZXQoKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAg
ICAgICAgICAgICAvLyA8U1RZTEU+IGVsZW1lbnQKLSAgICAgICAgICAgICAgICBzaGVldCA9IHN0
YXRpY19jYXN0PEhUTUxTdHlsZUVsZW1lbnQqPihuKS0+c2hlZXQoKTsKLSAgICAgICAgICAgIC8v
IENoZWNrIHRvIHNlZSBpZiB0aGlzIHNoZWV0IGJlbG9uZ3MgdG8gYSBzdHlsZXNldAotICAgICAg
ICAgICAgLy8gKHRodXMgbWFraW5nIGl0IFBSRUZFUlJFRCBvciBBTFRFUk5BVEUgcmF0aGVyIHRo
YW4KLSAgICAgICAgICAgIC8vIFBFUlNJU1RFTlQpLgotICAgICAgICAgICAgQXRvbWljU3RyaW5n
IHJlbCA9IGUtPmdldEF0dHJpYnV0ZShyZWxBdHRyKTsKLSAgICAgICAgICAgIGlmICghZW5hYmxl
ZFZpYVNjcmlwdCAmJiAhdGl0bGUuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gWWVz
LCB3ZSBoYXZlIGEgdGl0bGUuCi0gICAgICAgICAgICAgICAgaWYgKG1fcHJlZmVycmVkU3R5bGVz
aGVldFNldC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gTm8gcHJlZmVycmVk
IHNldCBoYXMgYmVlbiBlc3RhYmxpc2hlZC4gIElmCi0gICAgICAgICAgICAgICAgICAgIC8vIHdl
IGFyZSBOT1QgYW4gYWx0ZXJuYXRlIHNoZWV0LCB0aGVuIGVzdGFibGlzaAotICAgICAgICAgICAg
ICAgICAgICAvLyB1cyBhcyB0aGUgcHJlZmVycmVkIHNldC4gIE90aGVyd2lzZSwganVzdCBpZ25v
cmUKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBzaGVldC4KLSAgICAgICAgICAgICAgICAg
ICAgaWYgKGUtPmhhc0xvY2FsTmFtZShzdHlsZVRhZykgfHwgIXJlbC5jb250YWlucygiYWx0ZXJu
YXRlIikpCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3ByZWZlcnJlZFN0eWxlc2hlZXRTZXQg
PSBtX3NlbGVjdGVkU3R5bGVzaGVldFNldCA9IHRpdGxlOwotICAgICAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgICAgICBpZiAodGl0bGUgIT0gbV9wcmVmZXJyZWRTdHlsZXNoZWV0U2V0KQotICAg
ICAgICAgICAgICAgICAgICBzaGVldCA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAg
IGlmIChyZWwuY29udGFpbnMoImFsdGVybmF0ZSIpICYmIHRpdGxlLmlzRW1wdHkoKSkKLSAgICAg
ICAgICAgICAgICBzaGVldCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNoZWV0KQotICAg
ICAgICAgICAgc2hlZXRzLmFwcGVuZChzaGVldCk7Ci0gICAgfQotfQotCi1ib29sIERvY3VtZW50
Ojp0ZXN0QWRkZWRTdHlsZXNoZWV0UmVxdWlyZXNTdHlsZVJlY2FsYyhTdHlsZVNoZWV0Q29udGVu
dHMqIHN0eWxlc2hlZXQpCi17Ci0gICAgLy8gU2VlIGlmIGFsbCBydWxlcyBvbiB0aGUgc2hlZXQg
YXJlIHNjb3BlZCB0byBzb21lIHNwZWNpZmljIGlkcyBvciBjbGFzc2VzLgotICAgIC8vIFRoZW4g
dGVzdCBpZiB3ZSBhY3R1YWxseSBoYXZlIGFueSBvZiB0aG9zZSBpbiB0aGUgdHJlZSBhdCB0aGUg
bW9tZW50LgotICAgIEhhc2hTZXQ8QXRvbWljU3RyaW5nSW1wbCo+IGlkU2NvcGVzOyAKLSAgICBI
YXNoU2V0PEF0b21pY1N0cmluZ0ltcGwqPiBjbGFzc1Njb3BlczsKLSAgICBpZiAoIVN0eWxlUmVz
b2x2ZXI6OmRldGVybWluZVN0eWxlc2hlZXRTZWxlY3RvclNjb3BlcyhzdHlsZXNoZWV0LCBpZFNj
b3BlcywgY2xhc3NTY29wZXMpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAvLyBJbnZhbGlk
YXRlIHRoZSBzdWJ0cmVlcyB0aGF0IG1hdGNoIHRoZSBzY29wZXMuCi0gICAgTm9kZSogbm9kZSA9
IGZpcnN0Q2hpbGQoKTsKLSAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBpZiAoIW5vZGUtPmlz
U3R5bGVkRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICBub2RlID0gbm9kZS0+dHJhdmVyc2VOZXh0
Tm9kZSgpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgU3R5bGVk
RWxlbWVudCogZWxlbWVudCA9IHN0YXRpY19jYXN0PFN0eWxlZEVsZW1lbnQqPihub2RlKTsKLSAg
ICAgICAgaWYgKFNlbGVjdG9yQ2hlY2tlcjo6ZWxlbWVudE1hdGNoZXNTZWxlY3RvclNjb3Blcyhl
bGVtZW50LCBpZFNjb3BlcywgY2xhc3NTY29wZXMpKSB7Ci0gICAgICAgICAgICBlbGVtZW50LT5z
ZXROZWVkc1N0eWxlUmVjYWxjKCk7Ci0gICAgICAgICAgICAvLyBUaGUgd2hvbGUgc3VidHJlZSBp
cyBub3cgaW52YWxpZGF0ZWQsIHdlIGNhbiBza2lwIHRvIHRoZSBuZXh0IHNpYmxpbmcuCi0gICAg
ICAgICAgICBub2RlID0gbm9kZS0+dHJhdmVyc2VOZXh0U2libGluZygpOwotICAgICAgICAgICAg
Y29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgbm9kZSA9IG5vZGUtPnRyYXZlcnNlTmV4dE5v
ZGUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIERvY3VtZW50OjphbmFs
eXplU3R5bGVzaGVldENoYW5nZShTdHlsZVJlc29sdmVyVXBkYXRlRmxhZyB1cGRhdGVGbGFnLCBj
b25zdCBWZWN0b3I8UmVmUHRyPFN0eWxlU2hlZXQ+ID4mIG5ld1N0eWxlc2hlZXRzLCBib29sJiBy
ZXF1aXJlc1N0eWxlUmVzb2x2ZXJSZXNldCwgYm9vbCYgcmVxdWlyZXNGdWxsU3R5bGVSZWNhbGMp
Ci17Ci0gICAgcmVxdWlyZXNTdHlsZVJlc29sdmVyUmVzZXQgPSB0cnVlOwotICAgIHJlcXVpcmVz
RnVsbFN0eWxlUmVjYWxjID0gdHJ1ZTsKLSAgICAKLSAgICAvLyBTdHlsZXNoZWV0cyBvZiA8c3R5
bGU+IGVsZW1lbnRzIHRoYXQgQGltcG9ydCBzdHlsZXNoZWV0cyBhcmUgYWN0aXZlIGJ1dCBsb2Fk
aW5nLiBXZSBuZWVkIHRvIHRyaWdnZXIgYSBmdWxsIHJlY2FsYyB3aGVuIHN1Y2ggbG9hZHMgYXJl
IGRvbmUuCi0gICAgYm9vbCBoYXNBY3RpdmVMb2FkaW5nU3R5bGVzaGVldCA9IGZhbHNlOwotICAg
IHVuc2lnbmVkIG5ld1N0eWxlc2hlZXRDb3VudCA9IG5ld1N0eWxlc2hlZXRzLnNpemUoKTsKLSAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbmV3U3R5bGVzaGVldENvdW50OyArK2kpIHsKLSAg
ICAgICAgaWYgKG5ld1N0eWxlc2hlZXRzW2ldLT5pc0xvYWRpbmcoKSkKLSAgICAgICAgICAgIGhh
c0FjdGl2ZUxvYWRpbmdTdHlsZXNoZWV0ID0gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKG1faGFkQWN0
aXZlTG9hZGluZ1N0eWxlc2hlZXQgJiYgIWhhc0FjdGl2ZUxvYWRpbmdTdHlsZXNoZWV0KSB7Ci0g
ICAgICAgIG1faGFkQWN0aXZlTG9hZGluZ1N0eWxlc2hlZXQgPSBmYWxzZTsKLSAgICAgICAgcmV0
dXJuOwotICAgIH0KLSAgICBtX2hhZEFjdGl2ZUxvYWRpbmdTdHlsZXNoZWV0ID0gaGFzQWN0aXZl
TG9hZGluZ1N0eWxlc2hlZXQ7Ci0KLSAgICBpZiAodXBkYXRlRmxhZyAhPSBSZWNhbGNTdHlsZUlm
TmVlZGVkKQotICAgICAgICByZXR1cm47Ci0gICAgaWYgKCFtX3N0eWxlUmVzb2x2ZXIpCi0gICAg
ICAgIHJldHVybjsKLQotICAgIC8vIFNlZSBpZiB3ZSBhcmUganVzdCBhZGRpbmcgc3R5bGVzaGVl
dHMuCi0gICAgdW5zaWduZWQgb2xkU3R5bGVzaGVldENvdW50ID0gbV9zdHlsZVNoZWV0cy0+bGVu
Z3RoKCk7Ci0gICAgaWYgKG5ld1N0eWxlc2hlZXRDb3VudCA8IG9sZFN0eWxlc2hlZXRDb3VudCkK
LSAgICAgICAgcmV0dXJuOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBvbGRTdHlsZXNo
ZWV0Q291bnQ7ICsraSkgewotICAgICAgICBpZiAobV9zdHlsZVNoZWV0cy0+aXRlbShpKSAhPSBu
ZXdTdHlsZXNoZWV0c1tpXSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcmVxdWly
ZXNTdHlsZVJlc29sdmVyUmVzZXQgPSBmYWxzZTsKLQotICAgIC8vIElmIHdlIGFyZSBhbHJlYWR5
IHBhcnNpbmcgdGhlIGJvZHkgYW5kIHNvIG1heSBoYXZlIHNpZ25pZmljYW50IGFtb3VudCBvZiBl
bGVtZW50cywgcHV0IHNvbWUgZWZmb3J0IGludG8gdHJ5aW5nIHRvIGF2b2lkIHN0eWxlIHJlY2Fs
Y3MuCi0gICAgaWYgKCFib2R5KCkgfHwgbV9oYXNOb2Rlc1dpdGhQbGFjZWhvbGRlclN0eWxlKQot
ICAgICAgICByZXR1cm47Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gb2xkU3R5bGVzaGVldENvdW50
OyBpIDwgbmV3U3R5bGVzaGVldENvdW50OyArK2kpIHsKLSAgICAgICAgaWYgKCFuZXdTdHlsZXNo
ZWV0c1tpXS0+aXNDU1NTdHlsZVNoZWV0KCkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAg
IGlmIChuZXdTdHlsZXNoZWV0c1tpXS0+ZGlzYWJsZWQoKSkKLSAgICAgICAgICAgIGNvbnRpbnVl
OwotICAgICAgICBpZiAodGVzdEFkZGVkU3R5bGVzaGVldFJlcXVpcmVzU3R5bGVSZWNhbGMoc3Rh
dGljX2Nhc3Q8Q1NTU3R5bGVTaGVldCo+KG5ld1N0eWxlc2hlZXRzW2ldLmdldCgpKS0+Y29udGVu
dHMoKSkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHJlcXVpcmVzRnVsbFN0eWxl
UmVjYWxjID0gZmFsc2U7Ci19Ci0KLXN0YXRpYyBib29sIHN0eWxlU2hlZXRzVXNlUmVtVW5pdHMo
Y29uc3QgVmVjdG9yPFJlZlB0cjxTdHlsZVNoZWV0PiA+JiBzaGVldHMpCi17Ci0gICAgZm9yICh1
bnNpZ25lZCBpID0gMDsgaSA8IHNoZWV0cy5zaXplKCk7ICsraSkgewotICAgICAgICBpZiAoIXNo
ZWV0c1tpXS0+aXNDU1NTdHlsZVNoZWV0KCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAg
ICAgaWYgKHN0YXRpY19jYXN0PENTU1N0eWxlU2hlZXQqPihzaGVldHNbaV0uZ2V0KCkpLT5jb250
ZW50cygpLT51c2VzUmVtVW5pdHMoKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0K
LSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KIHZvaWQgRG9jdW1lbnQ6Om5vdGlmeVNlYW1sZXNzQ2hp
bGREb2N1bWVudHNPZlN0eWxlc2hlZXRVcGRhdGUoKSBjb25zdAogewogICAgIC8vIElmIHdlJ3Jl
IG5vdCBpbiBhIGZyYW1lIHlldCBhbnkgcG90ZW50aWFsIGNoaWxkIGRvY3VtZW50cyB3b24ndCBo
YXZlIGEgU3R5bGVSZXNvbHZlciB0byB1cGRhdGUuCkBAIC0zNjU4LDQzICszMjg4LDYgQEAgdm9p
ZCBEb2N1bWVudDo6bm90aWZ5U2VhbWxlc3NDaGlsZERvY3VtZQogICAgIH0KIH0KIAotYm9vbCBE
b2N1bWVudDo6dXBkYXRlQWN0aXZlU3R5bGVzaGVldHMoU3R5bGVSZXNvbHZlclVwZGF0ZUZsYWcg
dXBkYXRlRmxhZykKLXsKLSAgICBpZiAobV9pblN0eWxlUmVjYWxjKSB7Ci0gICAgICAgIC8vIFNW
RyA8dXNlPiBlbGVtZW50IG1heSBtYW5hZ2UgdG8gaW52YWxpZGF0ZSBzdHlsZSBzZWxlY3RvciBp
biB0aGUgbWlkZGxlIG9mIGEgc3R5bGUgcmVjYWxjLgotICAgICAgICAvLyBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTQzNDQKLSAgICAgICAgLy8gRklYTUU6IFRoaXMg
c2hvdWxkIGJlIGZpeGVkIGluIFNWRyBhbmQgdGhpcyBjb2RlIHJlcGxhY2VkIHdpdGggQVNTRVJU
KCFtX2luU3R5bGVSZWNhbGMpLgotICAgICAgICBtX2hhc0RpcnR5U3R5bGVSZXNvbHZlciA9IHRy
dWU7Ci0gICAgICAgIHNjaGVkdWxlRm9yY2VkU3R5bGVSZWNhbGMoKTsKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgIH0KLSAgICBpZiAoIXJlbmRlcmVyKCkgfHwgIWF0dGFjaGVkKCkpCi0gICAg
ICAgIHJldHVybiBmYWxzZTsKLQotICAgIFN0eWxlU2hlZXRWZWN0b3IgbmV3U3R5bGVzaGVldHM7
Ci0gICAgY29sbGVjdEFjdGl2ZVN0eWxlc2hlZXRzKG5ld1N0eWxlc2hlZXRzKTsKLQotICAgIGJv
b2wgcmVxdWlyZXNTdHlsZVJlc29sdmVyUmVzZXQ7Ci0gICAgYm9vbCByZXF1aXJlc0Z1bGxTdHls
ZVJlY2FsYzsKLSAgICBhbmFseXplU3R5bGVzaGVldENoYW5nZSh1cGRhdGVGbGFnLCBuZXdTdHls
ZXNoZWV0cywgcmVxdWlyZXNTdHlsZVJlc29sdmVyUmVzZXQsIHJlcXVpcmVzRnVsbFN0eWxlUmVj
YWxjKTsKLQotICAgIGlmIChyZXF1aXJlc1N0eWxlUmVzb2x2ZXJSZXNldCkKLSAgICAgICAgY2xl
YXJTdHlsZVJlc29sdmVyKCk7Ci0gICAgZWxzZSB7Ci0gICAgICAgIG1fc3R5bGVSZXNvbHZlci0+
YXBwZW5kQXV0aG9yU3R5bGVzaGVldHMobV9zdHlsZVNoZWV0cy0+bGVuZ3RoKCksIG5ld1N0eWxl
c2hlZXRzKTsKLSAgICAgICAgcmVzZXRDU1NGZWF0dXJlRmxhZ3MoKTsKLSAgICB9Ci0gICAgbV9z
dHlsZVNoZWV0cy0+c3dhcChuZXdTdHlsZXNoZWV0cyk7Ci0KLSAgICBtX3VzZXNSZW1Vbml0cyA9
IHN0eWxlU2hlZXRzVXNlUmVtVW5pdHMobV9zdHlsZVNoZWV0cy0+dmVjdG9yKCkpOwotICAgIG1f
ZGlkQ2FsY3VsYXRlU3R5bGVSZXNvbHZlciA9IHRydWU7Ci0gICAgbV9oYXNEaXJ0eVN0eWxlUmVz
b2x2ZXIgPSBmYWxzZTsKLQotICAgIG5vdGlmeVNlYW1sZXNzQ2hpbGREb2N1bWVudHNPZlN0eWxl
c2hlZXRVcGRhdGUoKTsKLQotICAgIHJldHVybiByZXF1aXJlc0Z1bGxTdHlsZVJlY2FsYzsKLX0K
LQogdm9pZCBEb2N1bWVudDo6c2V0SG92ZXJOb2RlKFBhc3NSZWZQdHI8Tm9kZT4gbmV3SG92ZXJO
b2RlKQogewogICAgIG1faG92ZXJOb2RlID0gbmV3SG92ZXJOb2RlOwpAQCAtNjI3NCwxNiArNTg2
Nyw5IEBAIHZvaWQgRG9jdW1lbnQ6OnJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU8KICAgICBpbmZv
LmFkZE1lbWJlcihtX2ZyYW1lKTsKICAgICBpbmZvLmFkZE1lbWJlcihtX2NhY2hlZFJlc291cmNl
TG9hZGVyKTsKICAgICBpbmZvLmFkZE1lbWJlcihtX2VsZW1TaGVldCk7Ci0gICAgaW5mby5hZGRN
ZW1iZXIobV9wYWdlVXNlclNoZWV0KTsKLSAgICBpZiAobV9wYWdlR3JvdXBVc2VyU2hlZXRzKQot
ICAgICAgICBpbmZvLmFkZEluc3RydW1lbnRlZFZlY3RvclB0cihtX3BhZ2VHcm91cFVzZXJTaGVl
dHMpOwotICAgIGlmIChtX3VzZXJTaGVldHMpCi0gICAgICAgIGluZm8uYWRkSW5zdHJ1bWVudGVk
VmVjdG9yUHRyKG1fdXNlclNoZWV0cyk7CisgICAgaW5mby5hZGRNZW1iZXIobV9zdHlsZVNoZWV0
Q29sbGVjdGlvbik7CiAgICAgaW5mby5hZGRIYXNoU2V0KG1fbm9kZUl0ZXJhdG9ycyk7CiAgICAg
aW5mby5hZGRIYXNoU2V0KG1fcmFuZ2VzKTsKLSAgICBpbmZvLmFkZExpc3RIYXNoU2V0KG1fc3R5
bGVTaGVldENhbmRpZGF0ZU5vZGVzKTsKLSAgICBpbmZvLmFkZE1lbWJlcihtX3ByZWZlcnJlZFN0
eWxlc2hlZXRTZXQpOwotICAgIGluZm8uYWRkTWVtYmVyKG1fc2VsZWN0ZWRTdHlsZXNoZWV0U2V0
KTsKICAgICBpbmZvLmFkZE1lbWJlcihtX3RpdGxlLnN0cmluZygpKTsKICAgICBpbmZvLmFkZE1l
bWJlcihtX3Jhd1RpdGxlLnN0cmluZygpKTsKICAgICBpbmZvLmFkZE1lbWJlcihtX3htbEVuY29k
aW5nKTsKQEAgLTYzNzgsNiArNTk2NCwxMSBAQCBQYXNzUmVmUHRyPEVsZW1lbnRBdHRyaWJ1dGVE
YXRhPiBEb2N1bWVuCiAgICAgcmV0dXJuIGF0dHJpYnV0ZURhdGEucmVsZWFzZSgpOwogfQogCiti
b29sIERvY3VtZW50OjpoYXZlU3R5bGVzaGVldHNMb2FkZWQoKSBjb25zdAoreworICAgIHJldHVy
biAhbV9zdHlsZVNoZWV0Q29sbGVjdGlvbi0+aGFzUGVuZGluZ1NoZWV0cygpIHx8IG1faWdub3Jl
UGVuZGluZ1N0eWxlc2hlZXRzOworfQorCiBMb2NhbGl6ZXImIERvY3VtZW50OjpnZXRMb2NhbGl6
ZXIoY29uc3QgQXRvbWljU3RyaW5nJiBsb2NhbGUpCiB7CiAgICAgQXRvbWljU3RyaW5nIGxvY2Fs
ZUtleSA9IGxvY2FsZTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2RvbS9Eb2N1bWVudC5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2RvbS9Eb2N1bWVudC5oCShyZXZpc2lvbiAxMjkzOTcp
CisrKyBTb3VyY2UvV2ViQ29yZS9kb20vRG9jdW1lbnQuaAkod29ya2luZyBjb3B5KQpAQCAtNzgs
NiArNzgsNyBAQCBjbGFzcyBEb2N1bWVudEZyYWdtZW50OwogY2xhc3MgRG9jdW1lbnRMb2FkZXI7
CiBjbGFzcyBEb2N1bWVudE1hcmtlckNvbnRyb2xsZXI7CiBjbGFzcyBEb2N1bWVudFBhcnNlcjsK
K2NsYXNzIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb247CiBjbGFzcyBEb2N1bWVudFR5cGU7
CiBjbGFzcyBEb2N1bWVudFdlYWtSZWZlcmVuY2U7CiBjbGFzcyBEeW5hbWljTm9kZUxpc3RDYWNo
ZUJhc2U7CkBAIC00ODUsMzQgKzQ4NiwxNCBAQCBwdWJsaWM6CiAgICAgICAgIHJldHVybiBtX3N0
eWxlUmVzb2x2ZXIuZ2V0KCk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUg
cGVuZGluZyBzaGVldCBjb3VudCBhbmQgdGhlbiBjYWxscyB1cGRhdGVBY3RpdmVTdHlsZXNoZWV0
cy4KLSAgICAgKi8KLSAgICBlbnVtIFJlbW92ZVBlbmRpbmdTaGVldE5vdGlmaWNhdGlvblR5cGUg
ewotICAgICAgICBSZW1vdmVQZW5kaW5nU2hlZXROb3RpZnlJbW1lZGlhdGVseSwKLSAgICAgICAg
UmVtb3ZlUGVuZGluZ1NoZWV0Tm90aWZ5TGF0ZXIKLSAgICB9OwotCi0gICAgdm9pZCByZW1vdmVQ
ZW5kaW5nU2hlZXQoUmVtb3ZlUGVuZGluZ1NoZWV0Tm90aWZpY2F0aW9uVHlwZSA9IFJlbW92ZVBl
bmRpbmdTaGVldE5vdGlmeUltbWVkaWF0ZWx5KTsKICAgICB2b2lkIG5vdGlmeVJlbW92ZVBlbmRp
bmdTaGVldElmTmVlZGVkKCk7CiAKLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5z
IHRydWUgaWYgYWxsIHRvcC1sZXZlbCBzdHlsZXNoZWV0cyBoYXZlIGxvYWRlZCAoaW5jbHVkaW5n
Ci0gICAgICogYW55IEBpbXBvcnRzIHRoYXQgdGhleSBtYXkgYmUgbG9hZGluZykuCi0gICAgICov
Ci0gICAgYm9vbCBoYXZlU3R5bGVzaGVldHNMb2FkZWQoKSBjb25zdAotICAgIHsKLSAgICAgICAg
cmV0dXJuIG1fcGVuZGluZ1N0eWxlc2hlZXRzIDw9IDAgfHwgbV9pZ25vcmVQZW5kaW5nU3R5bGVz
aGVldHM7Ci0gICAgfQorICAgIGJvb2wgaGF2ZVN0eWxlc2hlZXRzTG9hZGVkKCkgY29uc3Q7CiAK
LSAgICAvKioKLSAgICAgKiBJbmNyZW1lbnRzIHRoZSBudW1iZXIgb2YgcGVuZGluZyBzaGVldHMu
ICBUaGUgPGxpbms+IGVsZW1lbnRzCi0gICAgICogaW52b2tlIHRoaXMgdG8gYWRkIHRoZW1zZWx2
ZXMgdG8gdGhlIGxvYWRpbmcgbGlzdC4KLSAgICAgKi8KLSAgICB2b2lkIGFkZFBlbmRpbmdTaGVl
dCgpIHsgbV9wZW5kaW5nU3R5bGVzaGVldHMrKzsgfQorICAgIC8vIFRoaXMgaXMgYSBET00gZnVu
Y3Rpb24uCisgICAgU3R5bGVTaGVldExpc3QqIHN0eWxlU2hlZXRzKCk7CiAKLSAgICB2b2lkIGFk
ZFN0eWxlU2hlZXRDYW5kaWRhdGVOb2RlKE5vZGUqLCBib29sIGNyZWF0ZWRCeVBhcnNlcik7Ci0g
ICAgdm9pZCByZW1vdmVTdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZShOb2RlKik7CisgICAgRG9jdW1l
bnRTdHlsZVNoZWV0Q29sbGVjdGlvbiogc3R5bGVTaGVldENvbGxlY3Rpb24oKSB7IHJldHVybiBt
X3N0eWxlU2hlZXRDb2xsZWN0aW9uLmdldCgpOyB9CiAKICAgICBib29sIGdvdG9BbmNob3JOZWVk
ZWRBZnRlclN0eWxlc2hlZXRzTG9hZCgpIHsgcmV0dXJuIG1fZ290b0FuY2hvck5lZWRlZEFmdGVy
U3R5bGVzaGVldHNMb2FkOyB9CiAgICAgdm9pZCBzZXRHb3RvQW5jaG9yTmVlZGVkQWZ0ZXJTdHls
ZXNoZWV0c0xvYWQoYm9vbCBiKSB7IG1fZ290b0FuY2hvck5lZWRlZEFmdGVyU3R5bGVzaGVldHNM
b2FkID0gYjsgfQpAQCAtNTMwLDE3ICs1MTEsNiBAQCBwdWJsaWM6CiAKICAgICB2b2lkIGV2YWx1
YXRlTWVkaWFRdWVyeUxpc3QoKTsKIAotICAgIGJvb2wgdXNlc1NpYmxpbmdSdWxlcygpIGNvbnN0
IHsgcmV0dXJuIG1fdXNlc1NpYmxpbmdSdWxlcyB8fCBtX3VzZXNTaWJsaW5nUnVsZXNPdmVycmlk
ZTsgfQotICAgIHZvaWQgc2V0VXNlc1NpYmxpbmdSdWxlcyhib29sIGIpIHsgbV91c2VzU2libGlu
Z1J1bGVzT3ZlcnJpZGUgPSBiOyB9Ci0gICAgYm9vbCB1c2VzRmlyc3RMaW5lUnVsZXMoKSBjb25z
dCB7IHJldHVybiBtX3VzZXNGaXJzdExpbmVSdWxlczsgfQotICAgIGJvb2wgdXNlc0ZpcnN0TGV0
dGVyUnVsZXMoKSBjb25zdCB7IHJldHVybiBtX3VzZXNGaXJzdExldHRlclJ1bGVzOyB9Ci0gICAg
dm9pZCBzZXRVc2VzRmlyc3RMZXR0ZXJSdWxlcyhib29sIGIpIHsgbV91c2VzRmlyc3RMZXR0ZXJS
dWxlcyA9IGI7IH0KLSAgICBib29sIHVzZXNCZWZvcmVBZnRlclJ1bGVzKCkgY29uc3QgeyByZXR1
cm4gbV91c2VzQmVmb3JlQWZ0ZXJSdWxlcyB8fCBtX3VzZXNCZWZvcmVBZnRlclJ1bGVzT3ZlcnJp
ZGU7IH0KLSAgICB2b2lkIHNldFVzZXNCZWZvcmVBZnRlclJ1bGVzKGJvb2wgYikgeyBtX3VzZXNC
ZWZvcmVBZnRlclJ1bGVzT3ZlcnJpZGUgPSBiOyB9Ci0gICAgYm9vbCB1c2VzUmVtVW5pdHMoKSBj
b25zdCB7IHJldHVybiBtX3VzZXNSZW1Vbml0czsgfQotICAgIGJvb2wgdXNlc0xpbmtSdWxlcygp
IGNvbnN0IHsgcmV0dXJuIGxpbmtDb2xvcigpICE9IHZpc2l0ZWRMaW5rQ29sb3IoKSB8fCBtX3Vz
ZXNMaW5rUnVsZXM7IH0KLSAgICB2b2lkIHNldFVzZXNMaW5rUnVsZXMoYm9vbCBiKSB7IG1fdXNl
c0xpbmtSdWxlcyA9IGI7IH0KLQogICAgIC8vIE5ldmVyIHJldHVybnMgMC4KICAgICBGb3JtQ29u
dHJvbGxlciogZm9ybUNvbnRyb2xsZXIoKTsKICAgICBWZWN0b3I8U3RyaW5nPiBmb3JtRWxlbWVu
dHNTdGF0ZSgpIGNvbnN0OwpAQCAtNTU2LDcgKzUyNiw3IEBAIHB1YmxpYzoKICAgICBQYXNzUmVm
UHRyPE5vZGVJdGVyYXRvcj4gY3JlYXRlTm9kZUl0ZXJhdG9yKE5vZGUqIHJvb3QsIHVuc2lnbmVk
IHdoYXRUb1Nob3csCiAgICAgICAgIFBhc3NSZWZQdHI8Tm9kZUZpbHRlcj4sIGJvb2wgZXhwYW5k
RW50aXR5UmVmZXJlbmNlcywgRXhjZXB0aW9uQ29kZSYpOwogCi0gICAgUGFzc1JlZlB0cjxUcmVl
V2Fsa2VyPiBjcmVhdGVUcmVlV2Fsa2VyKE5vZGUqIHJvb3QsIHVuc2lnbmVkIHdoYXRUb1Nob3cs
IAorICAgIFBhc3NSZWZQdHI8VHJlZVdhbGtlcj4gY3JlYXRlVHJlZVdhbGtlcihOb2RlKiByb290
LCB1bnNpZ25lZCB3aGF0VG9TaG93LAogICAgICAgICBQYXNzUmVmUHRyPE5vZGVGaWx0ZXI+LCBi
b29sIGV4cGFuZEVudGl0eVJlZmVyZW5jZXMsIEV4Y2VwdGlvbkNvZGUmKTsKIAogICAgIC8vIFNw
ZWNpYWwgc3VwcG9ydCBmb3IgZWRpdGluZwpAQCAtNjQ5LDE3ICs2MTksNiBAQCBwdWJsaWM6CiAg
ICAgYm9vbCBjYW5OYXZpZ2F0ZShGcmFtZSogdGFyZ2V0RnJhbWUpOwogICAgIEZyYW1lKiBmaW5k
VW5zYWZlUGFyZW50U2Nyb2xsUHJvcGFnYXRpb25Cb3VuZGFyeSgpOwogCi0gICAgQ1NTU3R5bGVT
aGVldCogcGFnZVVzZXJTaGVldCgpOwotICAgIHZvaWQgY2xlYXJQYWdlVXNlclNoZWV0KCk7Ci0g
ICAgdm9pZCB1cGRhdGVQYWdlVXNlclNoZWV0KCk7Ci0KLSAgICBjb25zdCBWZWN0b3I8UmVmUHRy
PENTU1N0eWxlU2hlZXQ+ID4qIHBhZ2VHcm91cFVzZXJTaGVldHMoKSBjb25zdDsKLSAgICB2b2lk
IGNsZWFyUGFnZUdyb3VwVXNlclNoZWV0cygpOwotICAgIHZvaWQgdXBkYXRlUGFnZUdyb3VwVXNl
clNoZWV0cygpOwotCi0gICAgY29uc3QgVmVjdG9yPFJlZlB0cjxDU1NTdHlsZVNoZWV0PiA+KiBk
b2N1bWVudFVzZXJTaGVldHMoKSBjb25zdCB7IHJldHVybiBtX3VzZXJTaGVldHMuZ2V0KCk7IH0K
LSAgICB2b2lkIGFkZFVzZXJTaGVldChQYXNzUmVmUHRyPFN0eWxlU2hlZXRDb250ZW50cz4gdXNl
clNoZWV0KTsKLQogICAgIENTU1N0eWxlU2hlZXQqIGVsZW1lbnRTaGVldCgpOwogICAgIAogICAg
IHZpcnR1YWwgUGFzc1JlZlB0cjxEb2N1bWVudFBhcnNlcj4gY3JlYXRlUGFyc2VyKCk7CkBAIC03
MTYsOCArNjc1LDYgQEAgcHVibGljOgogICAgIAogICAgIE1vdXNlRXZlbnRXaXRoSGl0VGVzdFJl
c3VsdHMgcHJlcGFyZU1vdXNlRXZlbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmLCBjb25zdCBMYXlv
dXRQb2ludCYsIGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYpOwogCi0gICAgU3R5bGVTaGVldExp
c3QqIHN0eWxlU2hlZXRzKCk7Ci0KICAgICAvKiBOZXdseSBwcm9wb3NlZCBDU1MzIG1lY2hhbmlz
bSBmb3Igc2VsZWN0aW5nIGFsdGVybmF0ZQogICAgICAgIHN0eWxlc2hlZXRzIHVzaW5nIHRoZSBE
T00uIE1heSBiZSBzdWJqZWN0IHRvIGNoYW5nZSBhcwogICAgICAgIHNwZWMgbWF0dXJlcy4gLSBk
d2gKQEAgLTk3NCw3ICs5MzEsOCBAQCBwdWJsaWM6CiAgICAgZW51bSBQZW5kaW5nU2hlZXRMYXlv
dXQgeyBOb0xheW91dFdpdGhQZW5kaW5nU2hlZXRzLCBEaWRMYXlvdXRXaXRoUGVuZGluZ1NoZWV0
cywgSWdub3JlTGF5b3V0V2l0aFBlbmRpbmdTaGVldHMgfTsKIAogICAgIGJvb2wgZGlkTGF5b3V0
V2l0aFBlbmRpbmdTdHlsZXNoZWV0cygpIGNvbnN0IHsgcmV0dXJuIG1fcGVuZGluZ1NoZWV0TGF5
b3V0ID09IERpZExheW91dFdpdGhQZW5kaW5nU2hlZXRzOyB9Ci0gICAgCisKKyAgICBib29sIGhh
c05vZGVzV2l0aFBsYWNlaG9sZGVyU3R5bGUoKSBjb25zdCB7IHJldHVybiBtX2hhc05vZGVzV2l0
aFBsYWNlaG9sZGVyU3R5bGU7IH0KICAgICB2b2lkIHNldEhhc05vZGVzV2l0aFBsYWNlaG9sZGVy
U3R5bGUoKSB7IG1faGFzTm9kZXNXaXRoUGxhY2Vob2xkZXJTdHlsZSA9IHRydWU7IH0KIAogICAg
IGNvbnN0IFZlY3RvcjxJY29uVVJMPiYgaWNvblVSTHMoKTsKQEAgLTExOTQsNiArMTE1MiwxMyBA
QCBwdWJsaWM6CiAKICAgICBQYXNzUmVmUHRyPEVsZW1lbnRBdHRyaWJ1dGVEYXRhPiBjYWNoZWRJ
bW11dGFibGVBdHRyaWJ1dGVEYXRhKGNvbnN0IEVsZW1lbnQqLCBjb25zdCBWZWN0b3I8QXR0cmli
dXRlPiYpOwogCisgICAgdm9pZCBkaWRSZW1vdmVBbGxQZW5kaW5nU3R5bGVzaGVldCgpOworICAg
IHZvaWQgc2V0TmVlZHNOb3RpZnlSZW1vdmVBbGxQZW5kaW5nU3R5bGVzaGVldCgpIHsgbV9uZWVk
c05vdGlmeVJlbW92ZUFsbFBlbmRpbmdTdHlsZXNoZWV0ID0gdHJ1ZTsgfQorICAgIHZvaWQgY2xl
YXJTdHlsZVJlc29sdmVyKCk7CisgICAgdm9pZCBub3RpZnlTZWFtbGVzc0NoaWxkRG9jdW1lbnRz
T2ZTdHlsZXNoZWV0VXBkYXRlKCkgY29uc3Q7CisKKyAgICBib29sIGluU3R5bGVSZWNhbGMoKSB7
IHJldHVybiBtX2luU3R5bGVSZWNhbGM7IH0KKwogICAgIExvY2FsaXplciYgZ2V0TG9jYWxpemVy
KGNvbnN0IEF0b21pY1N0cmluZyYgbG9jYWxlKTsKIAogcHJvdGVjdGVkOgpAQCAtMTI0MSwxOSAr
MTIwNiw4IEBAIHByaXZhdGU6CiAgICAgdm9pZCBidWlsZEFjY2Vzc0tleU1hcChUcmVlU2NvcGUq
IHJvb3QpOwogCiAgICAgdm9pZCBjcmVhdGVTdHlsZVJlc29sdmVyKCk7Ci0gICAgdm9pZCBjbGVh
clN0eWxlUmVzb2x2ZXIoKTsKLSAgICB2b2lkIGNvbWJpbmVDU1NGZWF0dXJlRmxhZ3MoKTsKLSAg
ICB2b2lkIHJlc2V0Q1NTRmVhdHVyZUZsYWdzKCk7Ci0gICAgCi0gICAgYm9vbCB1cGRhdGVBY3Rp
dmVTdHlsZXNoZWV0cyhTdHlsZVJlc29sdmVyVXBkYXRlRmxhZyk7Ci0gICAgdm9pZCBjb2xsZWN0
QWN0aXZlU3R5bGVzaGVldHMoVmVjdG9yPFJlZlB0cjxTdHlsZVNoZWV0PiA+Jik7Ci0gICAgYm9v
bCB0ZXN0QWRkZWRTdHlsZXNoZWV0UmVxdWlyZXNTdHlsZVJlY2FsYyhTdHlsZVNoZWV0Q29udGVu
dHMqKTsKLSAgICB2b2lkIGFuYWx5emVTdHlsZXNoZWV0Q2hhbmdlKFN0eWxlUmVzb2x2ZXJVcGRh
dGVGbGFnLCBjb25zdCBWZWN0b3I8UmVmUHRyPFN0eWxlU2hlZXQ+ID4mIG5ld1N0eWxlc2hlZXRz
LCBib29sJiByZXF1aXJlc1N0eWxlUmVzb2x2ZXJSZXNldCwgYm9vbCYgcmVxdWlyZXNGdWxsU3R5
bGVSZWNhbGMpOwotICAgIHZvaWQgZGlkUmVtb3ZlQWxsUGVuZGluZ1N0eWxlc2hlZXQoKTsKLSAg
ICB2b2lkIHNldE5lZWRzTm90aWZ5UmVtb3ZlQWxsUGVuZGluZ1N0eWxlc2hlZXQoKSB7IG1fbmVl
ZHNOb3RpZnlSZW1vdmVBbGxQZW5kaW5nU3R5bGVzaGVldCA9IHRydWU7IH0KIAogICAgIHZvaWQg
c2VhbWxlc3NQYXJlbnRVcGRhdGVkU3R5bGVzaGVldHMoKTsKLSAgICB2b2lkIG5vdGlmeVNlYW1s
ZXNzQ2hpbGREb2N1bWVudHNPZlN0eWxlc2hlZXRVcGRhdGUoKSBjb25zdDsKIAogICAgIHZvaWQg
ZGVsZXRlQ3VzdG9tRm9udHMoKTsKIApAQCAtMTI5MCw2ICsxMjQ0LDE3IEBAIHByaXZhdGU6CiAg
ICAgT3duUHRyPFN0eWxlUmVzb2x2ZXI+IG1fc3R5bGVSZXNvbHZlcjsKICAgICBib29sIG1fZGlk
Q2FsY3VsYXRlU3R5bGVSZXNvbHZlcjsKICAgICBib29sIG1faGFzRGlydHlTdHlsZVJlc29sdmVy
OworICAgIGJvb2wgbV9oYXNOb2Rlc1dpdGhQbGFjZWhvbGRlclN0eWxlOworICAgIGJvb2wgbV9u
ZWVkc05vdGlmeVJlbW92ZUFsbFBlbmRpbmdTdHlsZXNoZWV0OworICAgIC8vIEJ1dCBzb21ldGlt
ZXMgeW91IG5lZWQgdG8gaWdub3JlIHBlbmRpbmcgc3R5bGVzaGVldCBjb3VudCB0bworICAgIC8v
IGZvcmNlIGFuIGltbWVkaWF0ZSBsYXlvdXQgd2hlbiByZXF1ZXN0ZWQgYnkgSlMuCisgICAgYm9v
bCBtX2lnbm9yZVBlbmRpbmdTdHlsZXNoZWV0czsKKworICAgIC8vIElmIHdlIGRvIGlnbm9yZSB0
aGUgcGVuZGluZyBzdHlsZXNoZWV0IGNvdW50LCB0aGVuIHdlIG5lZWQgdG8gYWRkIGEgYm9vbGVh
bgorICAgIC8vIHRvIHRyYWNrIHRoYXQgdGhpcyBoYXBwZW5lZCBzbyB0aGF0IHdlIGNhbiBkbyBh
IGZ1bGwgcmVwYWludCB3aGVuIHRoZSBzdHlsZXNoZWV0cworICAgIC8vIGRvIGV2ZW50dWFsbHkg
bG9hZC4KKyAgICBQZW5kaW5nU2hlZXRMYXlvdXQgbV9wZW5kaW5nU2hlZXRMYXlvdXQ7CisKICAg
ICBWZWN0b3I8T3duUHRyPEZvbnREYXRhPiA+IG1fY3VzdG9tRm9udHM7CiAKICAgICBGcmFtZSog
bV9mcmFtZTsKQEAgLTEzMjMsMjkgKzEyODgsNyBAQCBwcml2YXRlOgogICAgIFJlZlB0cjxEb2N1
bWVudFR5cGU+IG1fZG9jVHlwZTsKICAgICBPd25QdHI8RE9NSW1wbGVtZW50YXRpb24+IG1faW1w
bGVtZW50YXRpb247CiAKLSAgICAvLyBUcmFjayB0aGUgbnVtYmVyIG9mIGN1cnJlbnRseSBsb2Fk
aW5nIHRvcC1sZXZlbCBzdHlsZXNoZWV0cyBuZWVkZWQgZm9yIHJlbmRlcmluZy4KLSAgICAvLyBT
aGVldHMgbG9hZGVkIHVzaW5nIHRoZSBAaW1wb3J0IGRpcmVjdGl2ZSBhcmUgbm90IGluY2x1ZGVk
IGluIHRoaXMgY291bnQuCi0gICAgLy8gV2UgdXNlIHRoaXMgY291bnQgb2YgcGVuZGluZyBzaGVl
dHMgdG8gZGV0ZWN0IHdoZW4gd2UgY2FuIGJlZ2luIGF0dGFjaGluZwotICAgIC8vIGVsZW1lbnRz
IGFuZCB3aGVuIGl0IGlzIHNhZmUgdG8gZXhlY3V0ZSBzY3JpcHRzLgotICAgIGludCBtX3BlbmRp
bmdTdHlsZXNoZWV0czsKLQotICAgIC8vIEJ1dCBzb21ldGltZXMgeW91IG5lZWQgdG8gaWdub3Jl
IHBlbmRpbmcgc3R5bGVzaGVldCBjb3VudCB0bwotICAgIC8vIGZvcmNlIGFuIGltbWVkaWF0ZSBs
YXlvdXQgd2hlbiByZXF1ZXN0ZWQgYnkgSlMuCi0gICAgYm9vbCBtX2lnbm9yZVBlbmRpbmdTdHls
ZXNoZWV0cyA6IDE7Ci0gICAgYm9vbCBtX25lZWRzTm90aWZ5UmVtb3ZlQWxsUGVuZGluZ1N0eWxl
c2hlZXQgOiAxOwotCi0gICAgLy8gSWYgd2UgZG8gaWdub3JlIHRoZSBwZW5kaW5nIHN0eWxlc2hl
ZXQgY291bnQsIHRoZW4gd2UgbmVlZCB0byBhZGQgYSBib29sZWFuCi0gICAgLy8gdG8gdHJhY2sg
dGhhdCB0aGlzIGhhcHBlbmVkIHNvIHRoYXQgd2UgY2FuIGRvIGEgZnVsbCByZXBhaW50IHdoZW4g
dGhlIHN0eWxlc2hlZXRzCi0gICAgLy8gZG8gZXZlbnR1YWxseSBsb2FkLgotICAgIFBlbmRpbmdT
aGVldExheW91dCBtX3BlbmRpbmdTaGVldExheW91dDsKLSAgICAKLSAgICBib29sIG1faGFzTm9k
ZXNXaXRoUGxhY2Vob2xkZXJTdHlsZTsKLQogICAgIFJlZlB0cjxDU1NTdHlsZVNoZWV0PiBtX2Vs
ZW1TaGVldDsKLSAgICBSZWZQdHI8Q1NTU3R5bGVTaGVldD4gbV9wYWdlVXNlclNoZWV0OwotICAg
IG11dGFibGUgT3duUHRyPFZlY3RvcjxSZWZQdHI8Q1NTU3R5bGVTaGVldD4gPiA+IG1fcGFnZUdy
b3VwVXNlclNoZWV0czsKLSAgICBPd25QdHI8VmVjdG9yPFJlZlB0cjxDU1NTdHlsZVNoZWV0PiA+
ID4gbV91c2VyU2hlZXRzOwotICAgIG11dGFibGUgYm9vbCBtX3BhZ2VHcm91cFVzZXJTaGVldENh
Y2hlVmFsaWQ7CiAKICAgICBib29sIG1fcHJpbnRpbmc7CiAgICAgYm9vbCBtX3BhZ2luYXRlZEZv
clNjcmVlbjsKQEAgLTEzNzQsMTEgKzEzMTcsOCBAQCBwcml2YXRlOgogICAgIE11dGF0aW9uT2Jz
ZXJ2ZXJPcHRpb25zIG1fbXV0YXRpb25PYnNlcnZlclR5cGVzOwogI2VuZGlmCiAKLSAgICBSZWZQ
dHI8U3R5bGVTaGVldExpc3Q+IG1fc3R5bGVTaGVldHM7IC8vIEFsbCBvZiB0aGUgc3R5bGVzaGVl
dHMgdGhhdCBhcmUgY3VycmVudGx5IGluIGVmZmVjdCBmb3Igb3VyIG1lZGlhIHR5cGUgYW5kIHN0
eWxlc2hlZXQgc2V0LgotICAgIGJvb2wgbV9oYWRBY3RpdmVMb2FkaW5nU3R5bGVzaGVldDsKLSAg
ICAKLSAgICB0eXBlZGVmIExpc3RIYXNoU2V0PE5vZGUqLCAzMj4gU3R5bGVTaGVldENhbmRpZGF0
ZUxpc3RIYXNoU2V0OwotICAgIFN0eWxlU2hlZXRDYW5kaWRhdGVMaXN0SGFzaFNldCBtX3N0eWxl
U2hlZXRDYW5kaWRhdGVOb2RlczsgLy8gQWxsIG9mIHRoZSBub2RlcyB0aGF0IGNvdWxkIHBvdGVu
dGlhbGx5IHByb3ZpZGUgc3R5bGVzaGVldHMgdG8gdGhlIGRvY3VtZW50ICg8bGluaz4sIDxzdHls
ZT4sIDw/eG1sLXN0eWxlc2hlZXQ+KQorCisgICAgT3duUHRyPERvY3VtZW50U3R5bGVTaGVldENv
bGxlY3Rpb24+IG1fc3R5bGVTaGVldENvbGxlY3Rpb247CiAKICAgICBPd25QdHI8Rm9ybUNvbnRy
b2xsZXI+IG1fZm9ybUNvbnRyb2xsZXI7CiAKQEAgLTEzODYsOSArMTMyNiw2IEBAIHByaXZhdGU6
CiAgICAgQ29sb3IgbV92aXNpdGVkTGlua0NvbG9yOwogICAgIENvbG9yIG1fYWN0aXZlTGlua0Nv
bG9yOwogCi0gICAgU3RyaW5nIG1fcHJlZmVycmVkU3R5bGVzaGVldFNldDsKLSAgICBTdHJpbmcg
bV9zZWxlY3RlZFN0eWxlc2hlZXRTZXQ7Ci0KICAgICBib29sIG1fbG9hZGluZ1NoZWV0OwogICAg
IGJvb2wgbV92aXN1YWxseU9yZGVyZWQ7CiAgICAgUmVhZHlTdGF0ZSBtX3JlYWR5U3RhdGU7CkBA
IC0xMzk5LDE0ICsxMzM2LDYgQEAgcHJpdmF0ZToKICAgICBib29sIG1faW5TdHlsZVJlY2FsYzsK
ICAgICBib29sIG1fY2xvc2VBZnRlclN0eWxlUmVjYWxjOwogCi0gICAgYm9vbCBtX3VzZXNTaWJs
aW5nUnVsZXM7Ci0gICAgYm9vbCBtX3VzZXNTaWJsaW5nUnVsZXNPdmVycmlkZTsKLSAgICBib29s
IG1fdXNlc0ZpcnN0TGluZVJ1bGVzOwotICAgIGJvb2wgbV91c2VzRmlyc3RMZXR0ZXJSdWxlczsK
LSAgICBib29sIG1fdXNlc0JlZm9yZUFmdGVyUnVsZXM7Ci0gICAgYm9vbCBtX3VzZXNCZWZvcmVB
ZnRlclJ1bGVzT3ZlcnJpZGU7Ci0gICAgYm9vbCBtX3VzZXNSZW1Vbml0czsKLSAgICBib29sIG1f
dXNlc0xpbmtSdWxlczsKICAgICBib29sIG1fZ290b0FuY2hvck5lZWRlZEFmdGVyU3R5bGVzaGVl
dHNMb2FkOwogICAgIGJvb2wgbV9pc0ROU1ByZWZldGNoRW5hYmxlZDsKICAgICBib29sIG1faGF2
ZUV4cGxpY2l0bHlEaXNhYmxlZEROU1ByZWZldGNoOwpJbmRleDogU291cmNlL1dlYkNvcmUvZG9t
L0RvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL2RvbS9Eb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmNwcAkocmV2aXNpb24gMTI5
MzAzKQkoZnJvbSBTb3VyY2UvV2ViQ29yZS9kb20vRG9jdW1lbnQuY3BwOjEyOTMwMykKKysrIFNv
dXJjZS9XZWJDb3JlL2RvbS9Eb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDYzOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgTGFy
cyBLbm9sbCAoa25vbGxAa2RlLm9yZykKKyAqICAgICAgICAgICAoQykgMTk5OSBBbnR0aSBLb2l2
aXN0byAoa29pdmlzdG9Aa2RlLm9yZykKKyAqICAgICAgICAgICAoQykgMjAwMSBEaXJrIE11ZWxs
ZXIgKG11ZWxsZXJAa2RlLm9yZykKKyAqICAgICAgICAgICAoQykgMjAwNiBBbGV4ZXkgUHJvc2t1
cnlha292IChhcEB3ZWJraXQub3JnKQorICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA2
LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDExLCAyMDEyIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSBUb3JjaCBNb2JpbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLiAoaHR0cDovL3d3dy50b3JjaG1vYmlsZS5jb20vKQorICogQ29weXJp
Z2h0IChDKSAyMDA4LCAyMDA5LCAyMDExLCAyMDEyIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0
cyBzdWJzaWRpYXJ5KC1pZXMpCisgKiBDb3B5cmlnaHQgKEMpIFJlc2VhcmNoIEluIE1vdGlvbiBM
aW1pdGVkIDIwMTAtMjAxMS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJh
cnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBt
b2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1Ymxp
YworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv
bjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlv
bikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVk
IGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkg
V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hB
TlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBH
TlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgor
ICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUg
dGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAor
ICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5o
IgorI2luY2x1ZGUgIkRvY3VtZW50LmgiCisKKyNpbmNsdWRlICJBWE9iamVjdENhY2hlLmgiCisj
aW5jbHVkZSAiQW5pbWF0aW9uQ29udHJvbGxlci5oIgorI2luY2x1ZGUgIkF0dHIuaCIKKyNpbmNs
dWRlICJBdHRyaWJ1dGUuaCIKKyNpbmNsdWRlICJDREFUQVNlY3Rpb24uaCIKKyNpbmNsdWRlICJD
U1NQYXJzZXIuaCIKKyNpbmNsdWRlICJDU1NTdHlsZURlY2xhcmF0aW9uLmgiCisjaW5jbHVkZSAi
Q1NTU3R5bGVTaGVldC5oIgorI2luY2x1ZGUgIkNTU1ZhbHVlS2V5d29yZHMuaCIKKyNpbmNsdWRl
ICJDYWNoZWRDU1NTdHlsZVNoZWV0LmgiCisjaW5jbHVkZSAiQ2FjaGVkUmVzb3VyY2VMb2FkZXIu
aCIKKyNpbmNsdWRlICJDaHJvbWUuaCIKKyNpbmNsdWRlICJDaHJvbWVDbGllbnQuaCIKKyNpbmNs
dWRlICJDb21tZW50LmgiCisjaW5jbHVkZSAiQ29uc29sZS5oIgorI2luY2x1ZGUgIkNvbnRlbnRT
ZWN1cml0eVBvbGljeS5oIgorI2luY2x1ZGUgIkNvbnRleHRGZWF0dXJlcy5oIgorI2luY2x1ZGUg
IkNvb2tpZUphci5oIgorI2luY2x1ZGUgIkRPTUltcGxlbWVudGF0aW9uLmgiCisjaW5jbHVkZSAi
RE9NTmFtZWRGbG93Q29sbGVjdGlvbi5oIgorI2luY2x1ZGUgIkRPTVNlbGVjdGlvbi5oIgorI2lu
Y2x1ZGUgIkRPTVdpbmRvdy5oIgorI2luY2x1ZGUgIkRhdGVDb21wb25lbnRzLmgiCisjaW5jbHVk
ZSAiRGV2aWNlTW90aW9uQ29udHJvbGxlci5oIgorI2luY2x1ZGUgIkRldmljZU9yaWVudGF0aW9u
Q29udHJvbGxlci5oIgorI2luY2x1ZGUgIkRvY3VtZW50RXZlbnRRdWV1ZS5oIgorI2luY2x1ZGUg
IkRvY3VtZW50RnJhZ21lbnQuaCIKKyNpbmNsdWRlICJEb2N1bWVudExvYWRlci5oIgorI2luY2x1
ZGUgIkRvY3VtZW50TWFya2VyQ29udHJvbGxlci5oIgorI2luY2x1ZGUgIkRvY3VtZW50VHlwZS5o
IgorI2luY2x1ZGUgIkVkaXRpbmdUZXh0LmgiCisjaW5jbHVkZSAiRWRpdG9yLmgiCisjaW5jbHVk
ZSAiRWxlbWVudC5oIgorI2luY2x1ZGUgIkVsZW1lbnRTaGFkb3cuaCIKKyNpbmNsdWRlICJFbnRp
dHlSZWZlcmVuY2UuaCIKKyNpbmNsdWRlICJFdmVudC5oIgorI2luY2x1ZGUgIkV2ZW50RmFjdG9y
eS5oIgorI2luY2x1ZGUgIkV2ZW50SGFuZGxlci5oIgorI2luY2x1ZGUgIkV2ZW50TGlzdGVuZXIu
aCIKKyNpbmNsdWRlICJFdmVudE5hbWVzLmgiCisjaW5jbHVkZSAiRXhjZXB0aW9uQ29kZS5oIgor
I2luY2x1ZGUgIkZsb3dUaHJlYWRDb250cm9sbGVyLmgiCisjaW5jbHVkZSAiRm9jdXNDb250cm9s
bGVyLmgiCisjaW5jbHVkZSAiRm9ybUNvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJGcmFtZS5oIgor
I2luY2x1ZGUgIkZyYW1lTG9hZGVyLmgiCisjaW5jbHVkZSAiRnJhbWVMb2FkZXJDbGllbnQuaCIK
KyNpbmNsdWRlICJGcmFtZVNlbGVjdGlvbi5oIgorI2luY2x1ZGUgIkZyYW1lVHJlZS5oIgorI2lu
Y2x1ZGUgIkZyYW1lVmlldy5oIgorI2luY2x1ZGUgIkdlb2xvY2F0aW9uQ29udHJvbGxlci5oIgor
I2luY2x1ZGUgIkhhc2hDaGFuZ2VFdmVudC5oIgorI2luY2x1ZGUgIkhpc3RvZ3JhbVN1cHBvcnQu
aCIKKyNpbmNsdWRlICJIaXN0b3J5LmgiCisjaW5jbHVkZSAiSFRNTEFsbENvbGxlY3Rpb24uaCIK
KyNpbmNsdWRlICJIVE1MQW5jaG9yRWxlbWVudC5oIgorI2luY2x1ZGUgIkhUTUxCb2R5RWxlbWVu
dC5oIgorI2luY2x1ZGUgIkhUTUxDYW52YXNFbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTENvbGxl
Y3Rpb24uaCIKKyNpbmNsdWRlICJIVE1MRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJIVE1MRWxlbWVu
dEZhY3RvcnkuaCIKKyNpbmNsdWRlICJIVE1MRnJhbWVPd25lckVsZW1lbnQuaCIKKyNpbmNsdWRl
ICJIVE1MSGVhZEVsZW1lbnQuaCIKKyNpbmNsdWRlICJIVE1MSUZyYW1lRWxlbWVudC5oIgorI2lu
Y2x1ZGUgIkhUTUxMaW5rRWxlbWVudC5oIgorI2luY2x1ZGUgIkhUTUxNYXBFbGVtZW50LmgiCisj
aW5jbHVkZSAiSFRNTE5hbWVDb2xsZWN0aW9uLmgiCisjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCisj
aW5jbHVkZSAiSFRNTFBhcnNlcklkaW9tcy5oIgorI2luY2x1ZGUgIkhUTUxTdHlsZUVsZW1lbnQu
aCIKKyNpbmNsdWRlICJIVE1MVGl0bGVFbGVtZW50LmgiCisjaW5jbHVkZSAiSFRUUFBhcnNlcnMu
aCIKKyNpbmNsdWRlICJIaXRUZXN0UmVxdWVzdC5oIgorI2luY2x1ZGUgIkhpdFRlc3RSZXN1bHQu
aCIKKyNpbmNsdWRlICJJbWFnZUxvYWRlci5oIgorI2luY2x1ZGUgIkluc3BlY3RvckNvdW50ZXJz
LmgiCisjaW5jbHVkZSAiSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uLmgiCisjaW5jbHVkZSAiTGFu
Z3VhZ2UuaCIKKyNpbmNsdWRlICJMb2NhbGl6ZXIuaCIKKyNpbmNsdWRlICJMb2dnaW5nLmgiCisj
aW5jbHVkZSAiTWVkaWFRdWVyeUxpc3QuaCIKKyNpbmNsdWRlICJNZWRpYVF1ZXJ5TWF0Y2hlci5o
IgorI2luY2x1ZGUgIk1vdXNlRXZlbnRXaXRoSGl0VGVzdFJlc3VsdHMuaCIKKyNpbmNsdWRlICJO
YW1lTm9kZUxpc3QuaCIKKyNpbmNsdWRlICJOYW1lZEZsb3dDb2xsZWN0aW9uLmgiCisjaW5jbHVk
ZSAiTmVzdGluZ0xldmVsSW5jcmVtZW50ZXIuaCIKKyNpbmNsdWRlICJOZXdYTUxEb2N1bWVudFBh
cnNlci5oIgorI2luY2x1ZGUgIk5vZGVGaWx0ZXIuaCIKKyNpbmNsdWRlICJOb2RlSXRlcmF0b3Iu
aCIKKyNpbmNsdWRlICJOb2RlUmFyZURhdGEuaCIKKyNpbmNsdWRlICJOb2RlV2l0aEluZGV4Lmgi
CisjaW5jbHVkZSAiUGFnZS5oIgorI2luY2x1ZGUgIlBhZ2VHcm91cC5oIgorI2luY2x1ZGUgIlBh
Z2VUcmFuc2l0aW9uRXZlbnQuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybUtleWJvYXJkRXZlbnQuaCIK
KyNpbmNsdWRlICJQbHVnaW5Eb2N1bWVudC5oIgorI2luY2x1ZGUgIlBvaW50ZXJMb2NrQ29udHJv
bGxlci5oIgorI2luY2x1ZGUgIlBvcFN0YXRlRXZlbnQuaCIKKyNpbmNsdWRlICJQcm9jZXNzaW5n
SW5zdHJ1Y3Rpb24uaCIKKyNpbmNsdWRlICJRdWFsaWZpZWROYW1lLmgiCisjaW5jbHVkZSAiUmVn
aXN0ZXJlZEV2ZW50TGlzdGVuZXIuaCIKKyNpbmNsdWRlICJSZW5kZXJBcmVuYS5oIgorI2luY2x1
ZGUgIlJlbmRlck5hbWVkRmxvd1RocmVhZC5oIgorI2luY2x1ZGUgIlJlbmRlclRleHRDb250cm9s
LmgiCisjaW5jbHVkZSAiUmVuZGVyVmlldy5oIgorI2luY2x1ZGUgIlJlbmRlcldpZGdldC5oIgor
I2luY2x1ZGUgIlJ1bnRpbWVFbmFibGVkRmVhdHVyZXMuaCIKKyNpbmNsdWRlICJTY2hlbWVSZWdp
c3RyeS5oIgorI2luY2x1ZGUgIlNjb3BlZEV2ZW50UXVldWUuaCIKKyNpbmNsdWRlICJTY3JpcHRD
YWxsU3RhY2suaCIKKyNpbmNsdWRlICJTY3JpcHRDb250cm9sbGVyLmgiCisjaW5jbHVkZSAiU2Ny
aXB0RWxlbWVudC5oIgorI2luY2x1ZGUgIlNjcmlwdEV2ZW50TGlzdGVuZXIuaCIKKyNpbmNsdWRl
ICJTY3JpcHRSdW5uZXIuaCIKKyNpbmNsdWRlICJTY3JvbGxpbmdDb29yZGluYXRvci5oIgorI2lu
Y2x1ZGUgIlNlY3VyaXR5T3JpZ2luLmgiCisjaW5jbHVkZSAiU2VjdXJpdHlQb2xpY3kuaCIKKyNp
bmNsdWRlICJTZWdtZW50ZWRTdHJpbmcuaCIKKyNpbmNsdWRlICJTZWxlY3RvclF1ZXJ5LmgiCisj
aW5jbHVkZSAiU2V0dGluZ3MuaCIKKyNpbmNsdWRlICJTaGFkb3dSb290LmgiCisjaW5jbHVkZSAi
U3RhdGljSGFzaFNldE5vZGVMaXN0LmgiCisjaW5jbHVkZSAiU3R5bGVSZXNvbHZlci5oIgorI2lu
Y2x1ZGUgIlN0eWxlU2hlZXRDb250ZW50cy5oIgorI2luY2x1ZGUgIlN0eWxlU2hlZXRMaXN0Lmgi
CisjaW5jbHVkZSAiVGV4dFJlc291cmNlRGVjb2Rlci5oIgorI2luY2x1ZGUgIlRpbWVyLmgiCisj
aW5jbHVkZSAiVHJhbnNmb3JtU291cmNlLmgiCisjaW5jbHVkZSAiVHJlZVdhbGtlci5oIgorI2lu
Y2x1ZGUgIlVuZG9NYW5hZ2VyLmgiCisjaW5jbHVkZSAiVXNlckNvbnRlbnRVUkxQYXR0ZXJuLmgi
CisjaW5jbHVkZSAiV2ViQ29yZU1lbW9yeUluc3RydW1lbnRhdGlvbi5oIgorI2luY2x1ZGUgIldl
YktpdE5hbWVkRmxvdy5oIgorI2luY2x1ZGUgIlhNTERvY3VtZW50UGFyc2VyLmgiCisjaW5jbHVk
ZSAiWE1MSHR0cFJlcXVlc3QuaCIKKyNpbmNsdWRlICJYTUxOU05hbWVzLmgiCisjaW5jbHVkZSAi
WE1MTmFtZXMuaCIKKyNpbmNsdWRlICJYUGF0aEV2YWx1YXRvci5oIgorI2luY2x1ZGUgIlhQYXRo
RXhwcmVzc2lvbi5oIgorI2luY2x1ZGUgIlhQYXRoTlNSZXNvbHZlci5oIgorI2luY2x1ZGUgIlhQ
YXRoUmVzdWx0LmgiCisjaW5jbHVkZSAiaHRtbGVkaXRpbmcuaCIKKyNpbmNsdWRlIDx3dGYvQ3Vy
cmVudFRpbWUuaD4KKyNpbmNsdWRlIDx3dGYvSGFzaEZ1bmN0aW9ucy5oPgorI2luY2x1ZGUgPHd0
Zi9NYWluVGhyZWFkLmg+CisjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIuaD4KKyNpbmNsdWRlIDx3
dGYvU3RkTGliRXh0cmFzLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nQnVmZmVyLmg+CisK
KyNpZiBFTkFCTEUoU0hBUkVEX1dPUktFUlMpCisjaW5jbHVkZSAiU2hhcmVkV29ya2VyUmVwb3Np
dG9yeS5oIgorI2VuZGlmCisKKyNpZiBFTkFCTEUoWFNMVCkKKyNpbmNsdWRlICJYU0xUUHJvY2Vz
c29yLmgiCisjZW5kaWYKKworI2lmIEVOQUJMRShTVkcpCisjaW5jbHVkZSAiU1ZHRG9jdW1lbnRF
eHRlbnNpb25zLmgiCisjaW5jbHVkZSAiU1ZHRWxlbWVudEZhY3RvcnkuaCIKKyNpbmNsdWRlICJT
VkdOYW1lcy5oIgorI2luY2x1ZGUgIlNWR1NWR0VsZW1lbnQuaCIKKyNpbmNsdWRlICJTVkdTdHls
ZUVsZW1lbnQuaCIKKyNlbmRpZgorCisjaWYgRU5BQkxFKFRPVUNIX0VWRU5UUykKKyNpbmNsdWRl
ICJUb3VjaExpc3QuaCIKKyNlbmRpZgorCisjaWYgRU5BQkxFKE1BVEhNTCkKKyNpbmNsdWRlICJN
YXRoTUxFbGVtZW50LmgiCisjaW5jbHVkZSAiTWF0aE1MRWxlbWVudEZhY3RvcnkuaCIKKyNpbmNs
dWRlICJNYXRoTUxOYW1lcy5oIgorI2VuZGlmCisKKyNpZiBFTkFCTEUoRlVMTFNDUkVFTl9BUEkp
CisjaW5jbHVkZSAiUmVuZGVyRnVsbFNjcmVlbi5oIgorI2VuZGlmCisKKyNpZiBFTkFCTEUoUkVR
VUVTVF9BTklNQVRJT05fRlJBTUUpCisjaW5jbHVkZSAiUmVxdWVzdEFuaW1hdGlvbkZyYW1lQ2Fs
bGJhY2suaCIKKyNpbmNsdWRlICJTY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXIuaCIKKyNlbmRp
ZgorCisjaWYgRU5BQkxFKE1JQ1JPREFUQSkKKyNpbmNsdWRlICJNaWNyb0RhdGFJdGVtTGlzdC5o
IgorI2luY2x1ZGUgIk5vZGVSYXJlRGF0YS5oIgorI2VuZGlmCisKKyNpZiBFTkFCTEUoTElOS19Q
UkVSRU5ERVIpCisjaW5jbHVkZSAiUHJlcmVuZGVyZXIuaCIKKyNlbmRpZgorCisjaWYgRU5BQkxF
KFRFWFRfQVVUT1NJWklORykKKyNpbmNsdWRlICJUZXh0QXV0b3NpemVyLmgiCisjZW5kaWYKKwor
I2lmIEVOQUJMRShDU1BfTkVYVCkKKyNpbmNsdWRlICJET01TZWN1cml0eVBvbGljeS5oIgorI2Vu
ZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgV1RGOwordXNpbmcg
bmFtZXNwYWNlIFVuaWNvZGU7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwordXNpbmcgbmFtZXNw
YWNlIEhUTUxOYW1lczsKKworLy8gI2RlZmluZSBJTlNUUlVNRU5UX0xBWU9VVF9TQ0hFRFVMSU5H
IDEKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNNYXhXcml0ZVJlY3Vyc2lvbkRlcHRoID0gMjE7
CisKKy8vIFRoaXMgYW1vdW50IG9mIHRpbWUgbXVzdCBoYXZlIGVsYXBzZWQgYmVmb3JlIHdlIHdp
bGwgZXZlbiBjb25zaWRlciBzY2hlZHVsaW5nIGEgbGF5b3V0IHdpdGhvdXQgYSBkZWxheS4KKy8v
IEZJWE1FOiBGb3IgZmFzdGVyIG1hY2hpbmVzIHRoaXMgdmFsdWUgY2FuIHJlYWxseSBiZSBsb3dl
cmVkIHRvIDIwMC4gIDI1MCBpcyBhZGVxdWF0ZSwgYnV0IGEgbGl0dGxlIGhpZ2gKKy8vIGZvciBk
dWFsIEc1cy4gOikKK3N0YXRpYyBjb25zdCBpbnQgY0xheW91dFNjaGVkdWxlVGhyZXNob2xkID0g
MjUwOworCisvLyBET00gTGV2ZWwgMiBzYXlzIChsZXR0ZXJzIGFkZGVkKToKKy8vCisvLyBhKSBO
YW1lIHN0YXJ0IGNoYXJhY3RlcnMgbXVzdCBoYXZlIG9uZSBvZiB0aGUgY2F0ZWdvcmllcyBMbCwg
THUsIExvLCBMdCwgTmwuCisvLyBiKSBOYW1lIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiBOYW1lLXN0
YXJ0IGNoYXJhY3RlcnMgbXVzdCBoYXZlIG9uZSBvZiB0aGUgY2F0ZWdvcmllcyBNYywgTWUsIE1u
LCBMbSwgb3IgTmQuCisvLyBjKSBDaGFyYWN0ZXJzIGluIHRoZSBjb21wYXRpYmlsaXR5IGFyZWEg
KGkuZS4gd2l0aCBjaGFyYWN0ZXIgY29kZSBncmVhdGVyIHRoYW4gI3hGOTAwIGFuZCBsZXNzIHRo
YW4gI3hGRkZFKSBhcmUgbm90IGFsbG93ZWQgaW4gWE1MIG5hbWVzLgorLy8gZCkgQ2hhcmFjdGVy
cyB3aGljaCBoYXZlIGEgZm9udCBvciBjb21wYXRpYmlsaXR5IGRlY29tcG9zaXRpb24gKGkuZS4g
dGhvc2Ugd2l0aCBhICJjb21wYXRpYmlsaXR5IGZvcm1hdHRpbmcgdGFnIiBpbiBmaWVsZCA1IG9m
IHRoZSBkYXRhYmFzZSAtLSBtYXJrZWQgYnkgZmllbGQgNSBiZWdpbm5pbmcgd2l0aCBhICI8Iikg
YXJlIG5vdCBhbGxvd2VkLgorLy8gZSkgVGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzIGFyZSB0cmVh
dGVkIGFzIG5hbWUtc3RhcnQgY2hhcmFjdGVycyByYXRoZXIgdGhhbiBuYW1lIGNoYXJhY3RlcnMs
IGJlY2F1c2UgdGhlIHByb3BlcnR5IGZpbGUgY2xhc3NpZmllcyB0aGVtIGFzIEFscGhhYmV0aWM6
IFsjeDAyQkItI3gwMkMxXSwgI3gwNTU5LCAjeDA2RTUsICN4MDZFNi4KKy8vIGYpIENoYXJhY3Rl
cnMgI3gyMERELSN4MjBFMCBhcmUgZXhjbHVkZWQgKGluIGFjY29yZGFuY2Ugd2l0aCBVbmljb2Rl
LCBzZWN0aW9uIDUuMTQpLgorLy8gZykgQ2hhcmFjdGVyICN4MDBCNyBpcyBjbGFzc2lmaWVkIGFz
IGFuIGV4dGVuZGVyLCBiZWNhdXNlIHRoZSBwcm9wZXJ0eSBsaXN0IHNvIGlkZW50aWZpZXMgaXQu
CisvLyBoKSBDaGFyYWN0ZXIgI3gwMzg3IGlzIGFkZGVkIGFzIGEgbmFtZSBjaGFyYWN0ZXIsIGJl
Y2F1c2UgI3gwMEI3IGlzIGl0cyBjYW5vbmljYWwgZXF1aXZhbGVudC4KKy8vIGkpIENoYXJhY3Rl
cnMgJzonIGFuZCAnXycgYXJlIGFsbG93ZWQgYXMgbmFtZS1zdGFydCBjaGFyYWN0ZXJzLgorLy8g
aikgQ2hhcmFjdGVycyAnLScgYW5kICcuJyBhcmUgYWxsb3dlZCBhcyBuYW1lIGNoYXJhY3RlcnMu
CisvLworLy8gSXQgYWxzbyBjb250YWlucyBjb21wbGV0ZSB0YWJsZXMuIElmIHdlIGRlY2lkZSBp
dCdzIGJldHRlciwgd2UgY291bGQgaW5jbHVkZSB0aG9zZSBpbnN0ZWFkIG9mIHRoZSBmb2xsb3dp
bmcgY29kZS4KKworc3RhdGljIGlubGluZSBib29sIGlzVmFsaWROYW1lU3RhcnQoVUNoYXIzMiBj
KQoreworICAgIC8vIHJ1bGUgKGUpIGFib3ZlCisgICAgaWYgKChjID49IDB4MDJCQiAmJiBjIDw9
IDB4MDJDMSkgfHwgYyA9PSAweDU1OSB8fCBjID09IDB4NkU1IHx8IGMgPT0gMHg2RTYpCisgICAg
ICAgIHJldHVybiB0cnVlOworCisgICAgLy8gcnVsZSAoaSkgYWJvdmUKKyAgICBpZiAoYyA9PSAn
OicgfHwgYyA9PSAnXycpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gcnVsZXMgKGEp
IGFuZCAoZikgYWJvdmUKKyAgICBjb25zdCB1aW50MzJfdCBuYW1lU3RhcnRNYXNrID0gTGV0dGVy
X0xvd2VyY2FzZSB8IExldHRlcl9VcHBlcmNhc2UgfCBMZXR0ZXJfT3RoZXIgfCBMZXR0ZXJfVGl0
bGVjYXNlIHwgTnVtYmVyX0xldHRlcjsKKyAgICBpZiAoIShVbmljb2RlOjpjYXRlZ29yeShjKSAm
IG5hbWVTdGFydE1hc2spKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBydWxlIChj
KSBhYm92ZQorICAgIGlmIChjID49IDB4RjkwMCAmJiBjIDwgMHhGRkZFKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICAvLyBydWxlIChkKSBhYm92ZQorICAgIERlY29tcG9zaXRpb25UeXBl
IGRlY29tcFR5cGUgPSBkZWNvbXBvc2l0aW9uVHlwZShjKTsKKyAgICBpZiAoZGVjb21wVHlwZSA9
PSBEZWNvbXBvc2l0aW9uRm9udCB8fCBkZWNvbXBUeXBlID09IERlY29tcG9zaXRpb25Db21wYXQp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMg
aW5saW5lIGJvb2wgaXNWYWxpZE5hbWVQYXJ0KFVDaGFyMzIgYykKK3sKKyAgICAvLyBydWxlcyAo
YSksIChlKSwgYW5kIChpKSBhYm92ZQorICAgIGlmIChpc1ZhbGlkTmFtZVN0YXJ0KGMpKQorICAg
ICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIHJ1bGVzIChnKSBhbmQgKGgpIGFib3ZlCisgICAg
aWYgKGMgPT0gMHgwMEI3IHx8IGMgPT0gMHgwMzg3KQorICAgICAgICByZXR1cm4gdHJ1ZTsKKwor
ICAgIC8vIHJ1bGUgKGopIGFib3ZlCisgICAgaWYgKGMgPT0gJy0nIHx8IGMgPT0gJy4nKQorICAg
ICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIHJ1bGVzIChiKSBhbmQgKGYpIGFib3ZlCisgICAg
Y29uc3QgdWludDMyX3Qgb3RoZXJOYW1lUGFydE1hc2sgPSBNYXJrX05vblNwYWNpbmcgfCBNYXJr
X0VuY2xvc2luZyB8IE1hcmtfU3BhY2luZ0NvbWJpbmluZyB8IExldHRlcl9Nb2RpZmllciB8IE51
bWJlcl9EZWNpbWFsRGlnaXQ7CisgICAgaWYgKCEoVW5pY29kZTo6Y2F0ZWdvcnkoYykgJiBvdGhl
ck5hbWVQYXJ0TWFzaykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIHJ1bGUgKGMp
IGFib3ZlCisgICAgaWYgKGMgPj0gMHhGOTAwICYmIGMgPCAweEZGRkUpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIC8vIHJ1bGUgKGQpIGFib3ZlCisgICAgRGVjb21wb3NpdGlvblR5cGUg
ZGVjb21wVHlwZSA9IGRlY29tcG9zaXRpb25UeXBlKGMpOworICAgIGlmIChkZWNvbXBUeXBlID09
IERlY29tcG9zaXRpb25Gb250IHx8IGRlY29tcFR5cGUgPT0gRGVjb21wb3NpdGlvbkNvbXBhdCkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBi
b29sIHNob3VsZEluaGVyaXRTZWN1cml0eU9yaWdpbkZyb21Pd25lcihjb25zdCBLVVJMJiB1cmwp
Cit7CisgICAgLy8gaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQt
d29yay8jb3JpZ2luLTAKKyAgICAvLworICAgIC8vIElmIGEgRG9jdW1lbnQgaGFzIHRoZSBhZGRy
ZXNzICJhYm91dDpibGFuayIKKyAgICAvLyAgICAgVGhlIG9yaWdpbiBvZiB0aGUgRG9jdW1lbnQg
aXMgdGhlIG9yaWdpbiBpdCB3YXMgYXNzaWduZWQgd2hlbiBpdHMgYnJvd3NpbmcgY29udGV4dCB3
YXMgY3JlYXRlZC4KKyAgICAvLworICAgIC8vIE5vdGU6IFdlIGdlbmVyYWxpemUgdGhpcyB0byBh
bGwgImJsYW5rIiBVUkxzIGFuZCBpbnZhbGlkIFVSTHMgYmVjYXVzZSB3ZQorICAgIC8vIHRyZWF0
IGFsbCBvZiB0aGVzZSBVUkxzIGFzIGFib3V0OmJsYW5rLgorICAgIC8vCisgICAgcmV0dXJuICF1
cmwuaXNWYWxpZCgpIHx8IHVybC5pc0JsYW5rVVJMKCk7Cit9CisKK3N0YXRpYyBXaWRnZXQqIHdp
ZGdldEZvck5vZGUoTm9kZSogZm9jdXNlZE5vZGUpCit7CisgICAgaWYgKCFmb2N1c2VkTm9kZSkK
KyAgICAgICAgcmV0dXJuIDA7CisgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IGZvY3VzZWRO
b2RlLT5yZW5kZXJlcigpOworICAgIGlmICghcmVuZGVyZXIgfHwgIXJlbmRlcmVyLT5pc1dpZGdl
dCgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gdG9SZW5kZXJXaWRnZXQocmVuZGVy
ZXIpLT53aWRnZXQoKTsKK30KKworc3RhdGljIGJvb2wgYWNjZXB0c0VkaXRpbmdGb2N1cyhOb2Rl
KiBub2RlKQoreworICAgIEFTU0VSVChub2RlKTsKKyAgICBBU1NFUlQobm9kZS0+cmVuZGVyZXJJ
c0VkaXRhYmxlKCkpOworCisgICAgTm9kZSogcm9vdCA9IG5vZGUtPnJvb3RFZGl0YWJsZUVsZW1l
bnQoKTsKKyAgICBGcmFtZSogZnJhbWUgPSBub2RlLT5kb2N1bWVudCgpLT5mcmFtZSgpOworICAg
IGlmICghZnJhbWUgfHwgIXJvb3QpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVy
biBmcmFtZS0+ZWRpdG9yKCktPnNob3VsZEJlZ2luRWRpdGluZyhyYW5nZU9mQ29udGVudHMocm9v
dCkuZ2V0KCkpOworfQorCitzdGF0aWMgYm9vbCBjYW5BY2Nlc3NBbmNlc3Rvcihjb25zdCBTZWN1
cml0eU9yaWdpbiogYWN0aXZlU2VjdXJpdHlPcmlnaW4sIEZyYW1lKiB0YXJnZXRGcmFtZSkKK3sK
KyAgICAvLyB0YXJnZXRGcmFtZSBjYW4gYmUgMCB3aGVuIHdlJ3JlIHRyeWluZyB0byBuYXZpZ2F0
ZSBhIHRvcC1sZXZlbCBmcmFtZQorICAgIC8vIHRoYXQgaGFzIGEgMCBvcGVuZXIuCisgICAgaWYg
KCF0YXJnZXRGcmFtZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgY29uc3QgYm9vbCBp
c0xvY2FsQWN0aXZlT3JpZ2luID0gYWN0aXZlU2VjdXJpdHlPcmlnaW4tPmlzTG9jYWwoKTsKKyAg
ICBmb3IgKEZyYW1lKiBhbmNlc3RvckZyYW1lID0gdGFyZ2V0RnJhbWU7IGFuY2VzdG9yRnJhbWU7
IGFuY2VzdG9yRnJhbWUgPSBhbmNlc3RvckZyYW1lLT50cmVlKCktPnBhcmVudCgpKSB7CisgICAg
ICAgIERvY3VtZW50KiBhbmNlc3RvckRvY3VtZW50ID0gYW5jZXN0b3JGcmFtZS0+ZG9jdW1lbnQo
KTsKKyAgICAgICAgLy8gRklYTUU6IFNob3VsZCBiZSBhbiBBU1NFUlQ/IEZyYW1lcyBzaG91bGQg
YWx3YXkgaGF2ZSBkb2N1bWVudHMuCisgICAgICAgIGlmICghYW5jZXN0b3JEb2N1bWVudCkKKyAg
ICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIGNvbnN0IFNlY3VyaXR5T3JpZ2luKiBh
bmNlc3RvclNlY3VyaXR5T3JpZ2luID0gYW5jZXN0b3JEb2N1bWVudC0+c2VjdXJpdHlPcmlnaW4o
KTsKKyAgICAgICAgaWYgKGFjdGl2ZVNlY3VyaXR5T3JpZ2luLT5jYW5BY2Nlc3MoYW5jZXN0b3JT
ZWN1cml0eU9yaWdpbikpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgCisgICAg
ICAgIC8vIEFsbG93IGZpbGUgVVJMIGRlc2NlbmRhbnQgbmF2aWdhdGlvbiBldmVuIHdoZW4gYWxs
b3dGaWxlQWNjZXNzRnJvbUZpbGVVUkxzIGlzIGZhbHNlLgorICAgICAgICAvLyBGSVhNRTogSXQn
cyBhIGJpdCBzdHJhbmdlIHRvIHNwZWNpYWwtY2FzZSBsb2NhbCBvcmlnaW5zIGhlcmUuIFNob3Vs
ZCB3ZSBiZSBkb2luZworICAgICAgICAvLyBzb21ldGhpbmcgbW9yZSBnZW5lcmFsIGluc3RlYWQ/
CisgICAgICAgIGlmIChpc0xvY2FsQWN0aXZlT3JpZ2luICYmIGFuY2VzdG9yU2VjdXJpdHlPcmln
aW4tPmlzTG9jYWwoKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJl
dHVybiBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgcHJpbnROYXZpZ2F0aW9uRXJyb3JNZXNzYWdl
KEZyYW1lKiBmcmFtZSwgY29uc3QgS1VSTCYgYWN0aXZlVVJMKQoreworICAgIC8vIEZJWE1FOiB0
aGlzIGVycm9yIG1lc3NhZ2Ugc2hvdWxkIGNvbnRhaW4gbW9yZSBzcGVjaWZpY3Mgb2Ygd2h5IHRo
ZSBuYXZpZ2F0aW9uIGNoYW5nZSBpcyBub3QgYWxsb3dlZC4KKyAgICBTdHJpbmcgbWVzc2FnZSA9
ICJVbnNhZmUgSmF2YVNjcmlwdCBhdHRlbXB0IHRvIGluaXRpYXRlIGEgbmF2aWdhdGlvbiBjaGFu
Z2UgZm9yIGZyYW1lIHdpdGggVVJMICIgKworICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPmRv
Y3VtZW50KCktPnVybCgpLnN0cmluZygpICsgIiBmcm9tIGZyYW1lIHdpdGggVVJMICIgKyBhY3Rp
dmVVUkwuc3RyaW5nKCkgKyAiLlxuIjsKKworICAgIC8vIEZJWE1FOiBzaG91bGQgd2UgcHJpbnQg
dG8gdGhlIGNvbnNvbGUgb2YgdGhlIGRvY3VtZW50IHBlcmZvcm1pbmcgdGhlIG5hdmlnYXRpb24g
aW5zdGVhZD8KKyAgICBmcmFtZS0+ZG9jdW1lbnQoKS0+ZG9tV2luZG93KCktPnByaW50RXJyb3JN
ZXNzYWdlKG1lc3NhZ2UpOworfQorCitzdGF0aWMgSGFzaFNldDxEb2N1bWVudCo+KiBkb2N1bWVu
dHNUaGF0TmVlZFN0eWxlUmVjYWxjID0gMDsKKworY2xhc3MgRG9jdW1lbnRXZWFrUmVmZXJlbmNl
IDogcHVibGljIFRocmVhZFNhZmVSZWZDb3VudGVkPERvY3VtZW50V2Vha1JlZmVyZW5jZT4gewor
cHVibGljOgorICAgIHN0YXRpYyBQYXNzUmVmUHRyPERvY3VtZW50V2Vha1JlZmVyZW5jZT4gY3Jl
YXRlKERvY3VtZW50KiBkb2N1bWVudCkKKyAgICB7CisgICAgICAgIHJldHVybiBhZG9wdFJlZihu
ZXcgRG9jdW1lbnRXZWFrUmVmZXJlbmNlKGRvY3VtZW50KSk7CisgICAgfQorCisgICAgRG9jdW1l
bnQqIGRvY3VtZW50KCkKKyAgICB7CisgICAgICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7Cisg
ICAgICAgIHJldHVybiBtX2RvY3VtZW50OworICAgIH0KKworICAgIHZvaWQgY2xlYXIoKQorICAg
IHsKKyAgICAgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKyAgICAgICAgbV9kb2N1bWVudCA9
IDA7CisgICAgfQorCitwcml2YXRlOgorICAgIERvY3VtZW50V2Vha1JlZmVyZW5jZShEb2N1bWVu
dCogZG9jdW1lbnQpCisgICAgICAgIDogbV9kb2N1bWVudChkb2N1bWVudCkKKyAgICB7CisgICAg
ICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisgICAgfQorCisgICAgRG9jdW1lbnQqIG1fZG9j
dW1lbnQ7Cit9OworCit1aW50NjRfdCBEb2N1bWVudDo6c19nbG9iYWxUcmVlVmVyc2lvbiA9IDA7
CisKK0RvY3VtZW50OjpEb2N1bWVudChGcmFtZSogZnJhbWUsIGNvbnN0IEtVUkwmIHVybCwgYm9v
bCBpc1hIVE1MLCBib29sIGlzSFRNTCkKKyAgICA6IENvbnRhaW5lck5vZGUoMCwgQ3JlYXRlRG9j
dW1lbnQpCisgICAgLCBUcmVlU2NvcGUodGhpcykKKyAgICAsIG1fZ3VhcmRSZWZDb3VudCgwKQor
ICAgICwgbV9jb250ZXh0RmVhdHVyZXMoQ29udGV4dEZlYXR1cmVzOjpkZWZhdWx0U3dpdGNoKCkp
CisgICAgLCBtX2NvbXBhdGliaWxpdHlNb2RlKE5vUXVpcmtzTW9kZSkKKyAgICAsIG1fY29tcGF0
aWJpbGl0eU1vZGVMb2NrZWQoZmFsc2UpCisgICAgLCBtX2RvbVRyZWVWZXJzaW9uKCsrc19nbG9i
YWxUcmVlVmVyc2lvbikKKyNpZiBFTkFCTEUoTVVUQVRJT05fT0JTRVJWRVJTKQorICAgICwgbV9t
dXRhdGlvbk9ic2VydmVyVHlwZXMoMCkKKyNlbmRpZgorICAgICwgbV9zdHlsZVNoZWV0cyhTdHls
ZVNoZWV0TGlzdDo6Y3JlYXRlKHRoaXMpKQorICAgICwgbV9oYWRBY3RpdmVMb2FkaW5nU3R5bGVz
aGVldChmYWxzZSkKKyAgICAsIG1fcmVhZHlTdGF0ZShDb21wbGV0ZSkKKyAgICAsIG1fc3R5bGVS
ZWNhbGNUaW1lcih0aGlzLCAmRG9jdW1lbnQ6OnN0eWxlUmVjYWxjVGltZXJGaXJlZCkKKyAgICAs
IG1fcGVuZGluZ1N0eWxlUmVjYWxjU2hvdWxkRm9yY2UoZmFsc2UpCisgICAgLCBtX2ZyYW1lRWxl
bWVudHNTaG91bGRJZ25vcmVTY3JvbGxpbmcoZmFsc2UpCisgICAgLCBtX2NvbnRhaW5zVmFsaWRp
dHlTdHlsZVJ1bGVzKGZhbHNlKQorICAgICwgbV91cGRhdGVGb2N1c0FwcGVhcmFuY2VSZXN0b3Jl
c1NlbGVjdGlvbihmYWxzZSkKKyAgICAsIG1faWdub3JlRGVzdHJ1Y3RpdmVXcml0ZUNvdW50KDAp
CisgICAgLCBtX3RpdGxlU2V0RXhwbGljaXRseShmYWxzZSkKKyAgICAsIG1fdXBkYXRlRm9jdXNB
cHBlYXJhbmNlVGltZXIodGhpcywgJkRvY3VtZW50Ojp1cGRhdGVGb2N1c0FwcGVhcmFuY2VUaW1l
ckZpcmVkKQorICAgICwgbV9sb2FkRXZlbnRGaW5pc2hlZChmYWxzZSkKKyAgICAsIG1fc3RhcnRU
aW1lKGN1cnJlbnRUaW1lKCkpCisgICAgLCBtX292ZXJNaW5pbXVtTGF5b3V0VGhyZXNob2xkKGZh
bHNlKQorICAgICwgbV9zY3JpcHRSdW5uZXIoU2NyaXB0UnVubmVyOjpjcmVhdGUodGhpcykpCisg
ICAgLCBtX3htbFZlcnNpb24oIjEuMCIpCisgICAgLCBtX3htbFN0YW5kYWxvbmUoU3RhbmRhbG9u
ZVVuc3BlY2lmaWVkKQorICAgICwgbV9oYXNYTUxEZWNsYXJhdGlvbigwKQorICAgICwgbV9zYXZl
ZFJlbmRlcmVyKDApCisgICAgLCBtX2Rlc2lnbk1vZGUoaW5oZXJpdCkKKyNpZiBFTkFCTEUoREFT
SEJPQVJEX1NVUFBPUlQpIHx8IEVOQUJMRShXSURHRVRfUkVHSU9OKQorICAgICwgbV9oYXNEYXNo
Ym9hcmRSZWdpb25zKGZhbHNlKQorICAgICwgbV9kYXNoYm9hcmRSZWdpb25zRGlydHkoZmFsc2Up
CisjZW5kaWYKKyAgICAsIG1fY3JlYXRlUmVuZGVyZXJzKHRydWUpCisgICAgLCBtX2luUGFnZUNh
Y2hlKGZhbHNlKQorICAgICwgbV9hY2Nlc3NLZXlNYXBWYWxpZChmYWxzZSkKKyAgICAsIG1fdXNl
U2VjdXJlS2V5Ym9hcmRFbnRyeVdoZW5BY3RpdmUoZmFsc2UpCisgICAgLCBtX2lzWEhUTUwoaXNY
SFRNTCkKKyAgICAsIG1faXNIVE1MKGlzSFRNTCkKKyAgICAsIG1faXNWaWV3U291cmNlKGZhbHNl
KQorICAgICwgbV9zYXdFbGVtZW50c0luS25vd25OYW1lc3BhY2VzKGZhbHNlKQorICAgICwgbV9p
c1NyY2RvY0RvY3VtZW50KGZhbHNlKQorICAgICwgbV9kb2N1bWVudFJhcmVEYXRhKDApCisgICAg
LCBtX2V2ZW50UXVldWUoRG9jdW1lbnRFdmVudFF1ZXVlOjpjcmVhdGUodGhpcykpCisgICAgLCBt
X3dlYWtSZWZlcmVuY2UoRG9jdW1lbnRXZWFrUmVmZXJlbmNlOjpjcmVhdGUodGhpcykpCisgICAg
LCBtX2lkQXR0cmlidXRlTmFtZShpZEF0dHIpCisjaWYgRU5BQkxFKEZVTExTQ1JFRU5fQVBJKQor
ICAgICwgbV9hcmVLZXlzRW5hYmxlZEluRnVsbFNjcmVlbigwKQorICAgICwgbV9mdWxsU2NyZWVu
UmVuZGVyZXIoMCkKKyAgICAsIG1fZnVsbFNjcmVlbkNoYW5nZURlbGF5VGltZXIodGhpcywgJkRv
Y3VtZW50OjpmdWxsU2NyZWVuQ2hhbmdlRGVsYXlUaW1lckZpcmVkKQorICAgICwgbV9pc0FuaW1h
dGluZ0Z1bGxTY3JlZW4oZmFsc2UpCisjZW5kaWYKKyAgICAsIG1fbG9hZEV2ZW50RGVsYXlDb3Vu
dCgwKQorICAgICwgbV9sb2FkRXZlbnREZWxheVRpbWVyKHRoaXMsICZEb2N1bWVudDo6bG9hZEV2
ZW50RGVsYXlUaW1lckZpcmVkKQorICAgICwgbV9yZWZlcnJlclBvbGljeShSZWZlcnJlclBvbGlj
eURlZmF1bHQpCisgICAgLCBtX2RpcmVjdGlvblNldE9uRG9jdW1lbnRFbGVtZW50KGZhbHNlKQor
ICAgICwgbV93cml0aW5nTW9kZVNldE9uRG9jdW1lbnRFbGVtZW50KGZhbHNlKQorICAgICwgbV93
cml0ZVJlY3Vyc2lvbklzVG9vRGVlcChmYWxzZSkKKyAgICAsIG1fd3JpdGVSZWN1cnNpb25EZXB0
aCgwKQorICAgICwgbV93aGVlbEV2ZW50SGFuZGxlckNvdW50KDApCisjaWYgRU5BQkxFKFRPVUNI
X0VWRU5UUykKKyAgICAsIG1fdG91Y2hFdmVudEhhbmRsZXJDb3VudCgwKQorI2VuZGlmCisjaWYg
RU5BQkxFKFVORE9fTUFOQUdFUikKKyAgICAsIG1fdW5kb01hbmFnZXIoMCkKKyNlbmRpZgorICAg
ICwgbV9wZW5kaW5nVGFza3NUaW1lcih0aGlzLCAmRG9jdW1lbnQ6OnBlbmRpbmdUYXNrc1RpbWVy
RmlyZWQpCisgICAgLCBtX3NjaGVkdWxlZFRhc2tzQXJlU3VzcGVuZGVkKGZhbHNlKQorICAgICwg
bV92aXN1YWxVcGRhdGVzQWxsb3dlZCh0cnVlKQorICAgICwgbV92aXN1YWxVcGRhdGVzU3VwcHJl
c3Npb25UaW1lcih0aGlzLCAmRG9jdW1lbnQ6OnZpc3VhbFVwZGF0ZXNTdXBwcmVzc2lvblRpbWVy
RmlyZWQpCisjaWZuZGVmIE5ERUJVRworICAgICwgbV9kaWREaXNwYXRjaFZpZXdwb3J0UHJvcGVy
dGllc0NoYW5nZWQoZmFsc2UpCisjZW5kaWYKK3sKKyAgICBtX2RvY3VtZW50ID0gdGhpczsKKwor
ICAgIG1fcGFnZUdyb3VwVXNlclNoZWV0Q2FjaGVWYWxpZCA9IGZhbHNlOworCisgICAgbV9wcmlu
dGluZyA9IGZhbHNlOworICAgIG1fcGFnaW5hdGVkRm9yU2NyZWVuID0gZmFsc2U7CisKKyAgICBt
X2lnbm9yZUF1dG9mb2N1cyA9IGZhbHNlOworCisgICAgbV9mcmFtZSA9IGZyYW1lOworICAgIGlm
IChtX2ZyYW1lKQorICAgICAgICBwcm92aWRlQ29udGV4dEZlYXR1cmVzVG9Eb2N1bWVudEZyb20o
dGhpcywgbV9mcmFtZS0+cGFnZSgpKTsKKworICAgIC8vIFdlIGRlcGVuZCBvbiB0aGUgdXJsIGdl
dHRpbmcgaW1tZWRpYXRlbHkgc2V0IGluIHN1YmZyYW1lcywgYnV0IHdlCisgICAgLy8gYWxzbyBk
ZXBlbmQgb24gdGhlIHVybCBOT1QgZ2V0dGluZyBpbW1lZGlhdGVseSBzZXQgaW4gb3BlbmVkIHdp
bmRvd3MuCisgICAgLy8gU2VlIGZhc3QvZG9tL2Vhcmx5LWZyYW1lLXVybC5odG1sCisgICAgLy8g
YW5kIGZhc3QvZG9tL2xvY2F0aW9uLW5ldy13aW5kb3ctbm8tY3Jhc2guaHRtbCwgcmVzcGVjdGl2
ZWx5LgorICAgIC8vIEZJWE1FOiBDYW4vc2hvdWxkIHdlIHVuaWZ5IHRoaXMgYmVoYXZpb3I/Cisg
ICAgaWYgKChmcmFtZSAmJiBmcmFtZS0+b3duZXJFbGVtZW50KCkpIHx8ICF1cmwuaXNFbXB0eSgp
KQorICAgICAgICBzZXRVUkwodXJsKTsKKworICAgIG1fYXhPYmplY3RDYWNoZSA9IDA7CisKKyAg
ICBtX21hcmtlcnMgPSBhZG9wdFB0cihuZXcgRG9jdW1lbnRNYXJrZXJDb250cm9sbGVyKTsKKwor
ICAgIG1fY2FjaGVkUmVzb3VyY2VMb2FkZXIgPSBhZG9wdFB0cihuZXcgQ2FjaGVkUmVzb3VyY2VM
b2FkZXIodGhpcykpOworI2lmIEVOQUJMRShMSU5LX1BSRVJFTkRFUikKKyAgICBtX3ByZXJlbmRl
cmVyID0gUHJlcmVuZGVyZXI6OmNyZWF0ZSh0aGlzKTsKKyNlbmRpZgorI2lmIEVOQUJMRShURVhU
X0FVVE9TSVpJTkcpCisgICAgbV90ZXh0QXV0b3NpemVyID0gVGV4dEF1dG9zaXplcjo6Y3JlYXRl
KHRoaXMpOworI2VuZGlmCisgICAgbV92aXN1YWxseU9yZGVyZWQgPSBmYWxzZTsKKyAgICBtX2JQ
YXJzaW5nID0gZmFsc2U7CisgICAgbV93ZWxsRm9ybWVkID0gZmFsc2U7CisKKyAgICBtX3RleHRD
b2xvciA9IENvbG9yOjpibGFjazsKKyAgICBtX2xpc3RlbmVyVHlwZXMgPSAwOworICAgIG1faW5T
dHlsZVJlY2FsYyA9IGZhbHNlOworICAgIG1fY2xvc2VBZnRlclN0eWxlUmVjYWxjID0gZmFsc2U7
CisKKyAgICBtX3VzZXNTaWJsaW5nUnVsZXMgPSBmYWxzZTsKKyAgICBtX3VzZXNTaWJsaW5nUnVs
ZXNPdmVycmlkZSA9IGZhbHNlOworICAgIG1fdXNlc0ZpcnN0TGluZVJ1bGVzID0gZmFsc2U7Cisg
ICAgbV91c2VzRmlyc3RMZXR0ZXJSdWxlcyA9IGZhbHNlOworICAgIG1fdXNlc0JlZm9yZUFmdGVy
UnVsZXMgPSBmYWxzZTsKKyAgICBtX3VzZXNCZWZvcmVBZnRlclJ1bGVzT3ZlcnJpZGUgPSBmYWxz
ZTsKKyAgICBtX3VzZXNSZW1Vbml0cyA9IGZhbHNlOworICAgIG1fdXNlc0xpbmtSdWxlcyA9IGZh
bHNlOworCisgICAgbV9nb3RvQW5jaG9yTmVlZGVkQWZ0ZXJTdHlsZXNoZWV0c0xvYWQgPSBmYWxz
ZTsKKworICAgIG1fZGlkQ2FsY3VsYXRlU3R5bGVSZXNvbHZlciA9IGZhbHNlOworICAgIG1faGFz
RGlydHlTdHlsZVJlc29sdmVyID0gZmFsc2U7CisgICAgbV9wZW5kaW5nU3R5bGVzaGVldHMgPSAw
OworICAgIG1faWdub3JlUGVuZGluZ1N0eWxlc2hlZXRzID0gZmFsc2U7CisgICAgbV9uZWVkc05v
dGlmeVJlbW92ZUFsbFBlbmRpbmdTdHlsZXNoZWV0ID0gZmFsc2U7CisgICAgbV9oYXNOb2Rlc1dp
dGhQbGFjZWhvbGRlclN0eWxlID0gZmFsc2U7CisgICAgbV9wZW5kaW5nU2hlZXRMYXlvdXQgPSBO
b0xheW91dFdpdGhQZW5kaW5nU2hlZXRzOworCisgICAgbV9jc3NUYXJnZXQgPSAwOworCisgICAg
cmVzZXRMaW5rQ29sb3IoKTsKKyAgICByZXNldFZpc2l0ZWRMaW5rQ29sb3IoKTsKKyAgICByZXNl
dEFjdGl2ZUxpbmtDb2xvcigpOworCisgICAgbV9wcm9jZXNzaW5nTG9hZEV2ZW50ID0gZmFsc2U7
CisgICAgCisgICAgaW5pdFNlY3VyaXR5Q29udGV4dCgpOworICAgIGluaXRETlNQcmVmZXRjaCgp
OworCisgICAgc3RhdGljIGludCBkb2NJRCA9IDA7CisgICAgbV9kb2NJRCA9IGRvY0lEKys7CisK
KyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgV1RGX0FSUkFZX0xFTkdUSChtX25vZGVMaXN0
Q291bnRzKTsgaSsrKQorICAgICAgICBtX25vZGVMaXN0Q291bnRzW2ldID0gMDsKKworICAgIGZv
ciAodW5zaWduZWQgaSA9IDA7IGkgPCBXVEZfQVJSQVlfTEVOR1RIKG1fY29sbGVjdGlvbnMpOyBp
KyspCisgICAgICAgIG1fY29sbGVjdGlvbnNbaV0gPSAwOworCisgICAgSW5zcGVjdG9yQ291bnRl
cnM6OmluY3JlbWVudENvdW50ZXIoSW5zcGVjdG9yQ291bnRlcnM6OkRvY3VtZW50Q291bnRlcik7
Cit9CisKK3N0YXRpYyB2b2lkIGhpc3RvZ3JhbU11dGF0aW9uRXZlbnRVc2FnZShjb25zdCB1bnNp
Z25lZCBzaG9ydCYgbGlzdGVuZXJUeXBlcykKK3sKKyAgICBIaXN0b2dyYW1TdXBwb3J0OjpoaXN0
b2dyYW1FbnVtZXJhdGlvbigiRE9NQVBJLlBlckRvY3VtZW50TXV0YXRpb25FdmVudFVzYWdlLkRP
TVN1YnRyZWVNb2RpZmllZCIsIHN0YXRpY19jYXN0PGJvb2w+KGxpc3RlbmVyVHlwZXMgJiBEb2N1
bWVudDo6RE9NU1VCVFJFRU1PRElGSUVEX0xJU1RFTkVSKSwgMik7CisgICAgSGlzdG9ncmFtU3Vw
cG9ydDo6aGlzdG9ncmFtRW51bWVyYXRpb24oIkRPTUFQSS5QZXJEb2N1bWVudE11dGF0aW9uRXZl
bnRVc2FnZS5ET01Ob2RlSW5zZXJ0ZWQiLCBzdGF0aWNfY2FzdDxib29sPihsaXN0ZW5lclR5cGVz
ICYgRG9jdW1lbnQ6OkRPTU5PREVJTlNFUlRFRF9MSVNURU5FUiksIDIpOworICAgIEhpc3RvZ3Jh
bVN1cHBvcnQ6Omhpc3RvZ3JhbUVudW1lcmF0aW9uKCJET01BUEkuUGVyRG9jdW1lbnRNdXRhdGlv
bkV2ZW50VXNhZ2UuRE9NTm9kZVJlbW92ZWQiLCBzdGF0aWNfY2FzdDxib29sPihsaXN0ZW5lclR5
cGVzICYgRG9jdW1lbnQ6OkRPTU5PREVSRU1PVkVEX0xJU1RFTkVSKSwgMik7CisgICAgSGlzdG9n
cmFtU3VwcG9ydDo6aGlzdG9ncmFtRW51bWVyYXRpb24oIkRPTUFQSS5QZXJEb2N1bWVudE11dGF0
aW9uRXZlbnRVc2FnZS5ET01Ob2RlUmVtb3ZlZEZyb21Eb2N1bWVudCIsIHN0YXRpY19jYXN0PGJv
b2w+KGxpc3RlbmVyVHlwZXMgJiBEb2N1bWVudDo6RE9NTk9ERVJFTU9WRURGUk9NRE9DVU1FTlRf
TElTVEVORVIpLCAyKTsKKyAgICBIaXN0b2dyYW1TdXBwb3J0OjpoaXN0b2dyYW1FbnVtZXJhdGlv
bigiRE9NQVBJLlBlckRvY3VtZW50TXV0YXRpb25FdmVudFVzYWdlLkRPTU5vZGVJbnNlcnRlZElu
dG9Eb2N1bWVudCIsIHN0YXRpY19jYXN0PGJvb2w+KGxpc3RlbmVyVHlwZXMgJiBEb2N1bWVudDo6
RE9NTk9ERUlOU0VSVEVESU5UT0RPQ1VNRU5UX0xJU1RFTkVSKSwgMik7CisgICAgSGlzdG9ncmFt
U3VwcG9ydDo6aGlzdG9ncmFtRW51bWVyYXRpb24oIkRPTUFQSS5QZXJEb2N1bWVudE11dGF0aW9u
RXZlbnRVc2FnZS5ET01DaGFyYWN0ZXJEYXRhTW9kaWZpZWQiLCBzdGF0aWNfY2FzdDxib29sPihs
aXN0ZW5lclR5cGVzICYgRG9jdW1lbnQ6OkRPTUNIQVJBQ1RFUkRBVEFNT0RJRklFRF9MSVNURU5F
UiksIDIpOworfQorCisjaWYgRU5BQkxFKEZVTExTQ1JFRU5fQVBJKQorc3RhdGljIGJvb2wgaXNB
dHRyaWJ1dGVPbkFsbE93bmVycyhjb25zdCBXZWJDb3JlOjpRdWFsaWZpZWROYW1lJiBhdHRyaWJ1
dGUsIGNvbnN0IEhUTUxGcmFtZU93bmVyRWxlbWVudCogb3duZXIpCit7CisgICAgaWYgKCFvd25l
cikKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgZG8geworICAgICAgICBpZiAoIW93bmVyLT5o
YXNBdHRyaWJ1dGUoYXR0cmlidXRlKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9
IHdoaWxlICgob3duZXIgPSBvd25lci0+ZG9jdW1lbnQoKS0+b3duZXJFbGVtZW50KCkpKTsKKyAg
ICByZXR1cm4gdHJ1ZTsKK30KKyNlbmRpZgorCitEb2N1bWVudDo6fkRvY3VtZW50KCkKK3sKKyAg
ICBBU1NFUlQoIXJlbmRlcmVyKCkpOworICAgIEFTU0VSVCghbV9pblBhZ2VDYWNoZSk7CisgICAg
QVNTRVJUKCFtX3NhdmVkUmVuZGVyZXIpOworICAgIEFTU0VSVChtX3Jhbmdlcy5pc0VtcHR5KCkp
OworICAgIEFTU0VSVCghbV9zdHlsZVJlY2FsY1RpbWVyLmlzQWN0aXZlKCkpOworICAgIEFTU0VS
VCghbV9wYXJlbnRUcmVlU2NvcGUpOworICAgIEFTU0VSVCghbV9ndWFyZFJlZkNvdW50KTsKKwor
ICAgIC8vIEZJWE1FOiBTaG91bGQgd2UgcmVzZXQgbV9kb21XaW5kb3cgd2hlbiB3ZSBkZXRhY2gg
ZnJvbSB0aGUgRnJhbWU/CisgICAgaWYgKG1fZG9tV2luZG93KQorICAgICAgICBtX2RvbVdpbmRv
dy0+cmVzZXRVbmxlc3NTdXNwZW5kZWRGb3JQYWdlQ2FjaGUoKTsKKworICAgIG1fc2NyaXB0UnVu
bmVyLmNsZWFyKCk7CisKKyAgICBoaXN0b2dyYW1NdXRhdGlvbkV2ZW50VXNhZ2UobV9saXN0ZW5l
clR5cGVzKTsKKworICAgIHJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzKCk7CisKKyAgICAvLyBDdXJy
ZW50bHkgd2UgYmVsaWV2ZSB0aGF0IERvY3VtZW50IGNhbiBuZXZlciBvdXRsaXZlIHRoZSBwYXJz
ZXIuCisgICAgLy8gQWx0aG91Z2ggdGhlIERvY3VtZW50IG1heSBiZSByZXBsYWNlZCBzeW5jaHJv
bm91c2x5LCBEb2N1bWVudFBhcnNlcnMKKyAgICAvLyBnZW5lcmFsbHkga2VlcCBhdCBsZWFzdCBv
bmUgcmVmZXJlbmNlIHRvIGFuIEVsZW1lbnQgd2hpY2ggd291bGQgaW4gdHVybgorICAgIC8vIGhh
cyBhIHJlZmVyZW5jZSB0byB0aGUgRG9jdW1lbnQuICBJZiB5b3UgaGl0IHRoaXMgQVNTRVJULCB0
aGVuIHRoYXQKKyAgICAvLyBhc3N1bXB0aW9uIGlzIHdyb25nLiAgRG9jdW1lbnRQYXJzZXI6OmRl
dGFjaCgpIHNob3VsZCBlbnN1cmUgdGhhdCBldmVuCisgICAgLy8gaWYgdGhlIERvY3VtZW50UGFy
c2VyIG91dGxpdmVzIHRoZSBEb2N1bWVudCBpdCB3b24ndCBjYXVzZSBiYWRuZXNzLgorICAgIEFT
U0VSVCghbV9wYXJzZXIgfHwgbV9wYXJzZXItPnJlZkNvdW50KCkgPT0gMSk7CisgICAgZGV0YWNo
UGFyc2VyKCk7CisKKyAgICBtX3JlbmRlckFyZW5hLmNsZWFyKCk7CisKKyAgICBjbGVhckFYT2Jq
ZWN0Q2FjaGUoKTsKKworICAgIG1fZGVjb2RlciA9IDA7CisKKyAgICBpZiAobV9zdHlsZVNoZWV0
cykKKyAgICAgICAgbV9zdHlsZVNoZWV0cy0+ZG9jdW1lbnREZXN0cm95ZWQoKTsKKworICAgIGlm
IChtX25hbWVkRmxvd3MpCisgICAgICAgIG1fbmFtZWRGbG93cy0+ZG9jdW1lbnREZXN0cm95ZWQo
KTsKKworICAgIGlmIChtX2VsZW1TaGVldCkKKyAgICAgICAgbV9lbGVtU2hlZXQtPmNsZWFyT3du
ZXJOb2RlKCk7CisgICAgaWYgKG1fcGFnZVVzZXJTaGVldCkKKyAgICAgICAgbV9wYWdlVXNlclNo
ZWV0LT5jbGVhck93bmVyTm9kZSgpOworICAgIGlmIChtX3BhZ2VHcm91cFVzZXJTaGVldHMpIHsK
KyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX3BhZ2VHcm91cFVzZXJTaGVldHMtPnNp
emUoKTsgKytpKQorICAgICAgICAgICAgKCptX3BhZ2VHcm91cFVzZXJTaGVldHMpW2ldLT5jbGVh
ck93bmVyTm9kZSgpOworICAgIH0KKyAgICBpZiAobV91c2VyU2hlZXRzKSB7CisgICAgICAgIGZv
ciAoc2l6ZV90IGkgPSAwOyBpIDwgbV91c2VyU2hlZXRzLT5zaXplKCk7ICsraSkKKyAgICAgICAg
ICAgICgqbV91c2VyU2hlZXRzKVtpXS0+Y2xlYXJPd25lck5vZGUoKTsKKyAgICB9CisKKyAgICBk
ZWxldGVDdXN0b21Gb250cygpOworCisgICAgbV93ZWFrUmVmZXJlbmNlLT5jbGVhcigpOworCisg
ICAgaWYgKG1fbWVkaWFRdWVyeU1hdGNoZXIpCisgICAgICAgIG1fbWVkaWFRdWVyeU1hdGNoZXIt
PmRvY3VtZW50RGVzdHJveWVkKCk7CisKKyAgICBjbGVhclN0eWxlUmVzb2x2ZXIoKTsgLy8gV2Ug
bmVlZCB0byBkZXN0b3J5IENTU0ZvbnRTZWxlY3RvciBiZWZvcmUgZGVzdHJveWluZyBtX2NhY2hl
ZFJlc291cmNlTG9hZGVyLgorICAgIG1fY2FjaGVkUmVzb3VyY2VMb2FkZXIuY2xlYXIoKTsKKwor
ICAgIC8vIFdlIG11c3QgY2FsbCBjbGVhclJhcmVEYXRhKCkgaGVyZSBzaW5jZSBhIERvY3VtZW50
IGNsYXNzIGluaGVyaXRzIFRyZWVTY29wZQorICAgIC8vIGFzIHdlbGwgYXMgTm9kZS4gU2VlIGEg
Y29tbWVudCBvbiBUcmVlU2NvcGUuaCBmb3IgdGhlIHJlYXNvbi4KKyAgICBpZiAoaGFzUmFyZURh
dGEoKSkKKyAgICAgICAgY2xlYXJSYXJlRGF0YSgpOworCisgICAgQVNTRVJUKCFtX2xpc3RzSW52
YWxpZGF0ZWRBdERvY3VtZW50LnNpemUoKSk7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp
IDwgV1RGX0FSUkFZX0xFTkdUSChtX25vZGVMaXN0Q291bnRzKTsgaSsrKQorICAgICAgICBBU1NF
UlQoIW1fbm9kZUxpc3RDb3VudHNbaV0pOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8
IFdURl9BUlJBWV9MRU5HVEgobV9jb2xsZWN0aW9ucyk7IGkrKykKKyAgICAgICAgQVNTRVJUKCFt
X2NvbGxlY3Rpb25zW2ldKTsKKworICAgIG1fZG9jdW1lbnQgPSAwOworCisgICAgSW5zcGVjdG9y
Q291bnRlcnM6OmRlY3JlbWVudENvdW50ZXIoSW5zcGVjdG9yQ291bnRlcnM6OkRvY3VtZW50Q291
bnRlcik7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnJlbW92ZWRMYXN0UmVmKCkKK3sKKyAgICBBU1NF
UlQoIW1fZGVsZXRpb25IYXNCZWd1bik7CisgICAgaWYgKG1fZ3VhcmRSZWZDb3VudCkgeworICAg
ICAgICAvLyBJZiByZW1vdmluZyBhIGNoaWxkIHJlbW92ZXMgdGhlIGxhc3Qgc2VsZi1vbmx5IHJl
Ziwgd2UgZG9uJ3QKKyAgICAgICAgLy8gd2FudCB0aGUgc2NvcGUgdG8gYmUgZGVzdHJ1Y3RlZCB1
bnRpbCBhZnRlcgorICAgICAgICAvLyByZW1vdmVBbGxDaGlsZHJlbiByZXR1cm5zLCBzbyB3ZSBn
dWFyZCBvdXJzZWx2ZXMgd2l0aCBhbgorICAgICAgICAvLyBleHRyYSBzZWxmLW9ubHkgcmVmLgor
ICAgICAgICBndWFyZFJlZigpOworCisgICAgICAgIC8vIFdlIG11c3QgbWFrZSBzdXJlIG5vdCB0
byBiZSByZXRhaW5pbmcgYW55IG9mIG91ciBjaGlsZHJlbiB0aHJvdWdoCisgICAgICAgIC8vIHRo
ZXNlIGV4dHJhIHBvaW50ZXJzIG9yIHdlIHdpbGwgY3JlYXRlIGEgcmVmZXJlbmNlIGN5Y2xlLgor
ICAgICAgICBtX2RvY1R5cGUgPSAwOworICAgICAgICBtX2ZvY3VzZWROb2RlID0gMDsKKyAgICAg
ICAgbV9ob3Zlck5vZGUgPSAwOworICAgICAgICBtX2FjdGl2ZU5vZGUgPSAwOworICAgICAgICBt
X3RpdGxlRWxlbWVudCA9IDA7CisgICAgICAgIG1fZG9jdW1lbnRFbGVtZW50ID0gMDsKKyAgICAg
ICAgbV9jb250ZXh0RmVhdHVyZXMgPSBDb250ZXh0RmVhdHVyZXM6OmRlZmF1bHRTd2l0Y2goKTsK
KyNpZiBFTkFCTEUoRlVMTFNDUkVFTl9BUEkpCisgICAgICAgIG1fZnVsbFNjcmVlbkVsZW1lbnQg
PSAwOworICAgICAgICBtX2Z1bGxTY3JlZW5FbGVtZW50U3RhY2suY2xlYXIoKTsKKyNlbmRpZgor
CisgICAgICAgIGRldGFjaFBhcnNlcigpOworCisgICAgICAgIC8vIHJlbW92ZUFsbENoaWxkcmVu
KCkgZG9lc24ndCBhbHdheXMgdW5yZWdpc3RlciBJRHMsCisgICAgICAgIC8vIHNvIHRlYXIgZG93
biBzY29wZSBpbmZvcm1hdGlvbiB1cGZyb250IHRvIGF2b2lkIGhhdmluZyBzdGFsZSByZWZlcmVu
Y2VzIGluIHRoZSBtYXAuCisgICAgICAgIGRlc3Ryb3lUcmVlU2NvcGVEYXRhKCk7CisgICAgICAg
IHJlbW92ZUFsbENoaWxkcmVuKCk7CisKKyAgICAgICAgbV9tYXJrZXJzLT5kZXRhY2goKTsKKwor
ICAgICAgICBtX2Nzc0NhbnZhc0VsZW1lbnRzLmNsZWFyKCk7CisKKyNpZiBFTkFCTEUoUkVRVUVT
VF9BTklNQVRJT05fRlJBTUUpCisgICAgICAgIC8vIEZJWE1FOiBjb25zaWRlciB1c2luZyBBY3Rp
dmVET01PYmplY3QuCisgICAgICAgIGlmIChtX3NjcmlwdGVkQW5pbWF0aW9uQ29udHJvbGxlcikK
KyAgICAgICAgICAgIG1fc2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyLT5jbGVhckRvY3VtZW50
UG9pbnRlcigpOworICAgICAgICBtX3NjcmlwdGVkQW5pbWF0aW9uQ29udHJvbGxlci5jbGVhcigp
OworI2VuZGlmCisKKyNpZm5kZWYgTkRFQlVHCisgICAgICAgIG1faW5SZW1vdmVkTGFzdFJlZkZ1
bmN0aW9uID0gZmFsc2U7CisjZW5kaWYKKworICAgICAgICBndWFyZERlcmVmKCk7CisgICAgfSBl
bHNlIHsKKyNpZm5kZWYgTkRFQlVHIAorICAgICAgICBtX2RlbGV0aW9uSGFzQmVndW4gPSB0cnVl
OyAKKyNlbmRpZiAKKyAgICAgICAgZGVsZXRlIHRoaXM7CisgICAgfQorfQorCitFbGVtZW50KiBE
b2N1bWVudDo6Z2V0RWxlbWVudEJ5SWQoY29uc3QgQXRvbWljU3RyaW5nJiBpZCkgY29uc3QKK3sK
KyAgICByZXR1cm4gVHJlZVNjb3BlOjpnZXRFbGVtZW50QnlJZChpZCk7Cit9CisKK0VsZW1lbnQq
IERvY3VtZW50OjpnZXRFbGVtZW50QnlBY2Nlc3NLZXkoY29uc3QgU3RyaW5nJiBrZXkpCit7Cisg
ICAgaWYgKGtleS5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiAwOworICAgIGlmICghbV9hY2Nl
c3NLZXlNYXBWYWxpZCkgeworICAgICAgICBidWlsZEFjY2Vzc0tleU1hcCh0aGlzKTsKKyAgICAg
ICAgbV9hY2Nlc3NLZXlNYXBWYWxpZCA9IHRydWU7CisgICAgfQorICAgIHJldHVybiBtX2VsZW1l
bnRzQnlBY2Nlc3NLZXkuZ2V0KGtleS5pbXBsKCkpOworfQorCit2b2lkIERvY3VtZW50OjpidWls
ZEFjY2Vzc0tleU1hcChUcmVlU2NvcGUqIHNjb3BlKQoreworICAgIEFTU0VSVChzY29wZSk7Cisg
ICAgTm9kZSogcm9vdE5vZGUgPSBzY29wZS0+cm9vdE5vZGUoKTsKKyAgICBmb3IgKE5vZGUqIG5v
ZGUgPSByb290Tm9kZTsgbm9kZTsgbm9kZSA9IG5vZGUtPnRyYXZlcnNlTmV4dE5vZGUocm9vdE5v
ZGUpKSB7CisgICAgICAgIGlmICghbm9kZS0+aXNFbGVtZW50Tm9kZSgpKQorICAgICAgICAgICAg
Y29udGludWU7CisgICAgICAgIEVsZW1lbnQqIGVsZW1lbnQgPSBzdGF0aWNfY2FzdDxFbGVtZW50
Kj4obm9kZSk7CisgICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyYgYWNjZXNzS2V5ID0gZWxlbWVu
dC0+Z2V0QXR0cmlidXRlKGFjY2Vzc2tleUF0dHIpOworICAgICAgICBpZiAoIWFjY2Vzc0tleS5p
c0VtcHR5KCkpCisgICAgICAgICAgICBtX2VsZW1lbnRzQnlBY2Nlc3NLZXkuc2V0KGFjY2Vzc0tl
eS5pbXBsKCksIGVsZW1lbnQpOworCisgICAgICAgIGZvciAoU2hhZG93Um9vdCogcm9vdCA9IG5v
ZGUtPnlvdW5nZXN0U2hhZG93Um9vdCgpOyByb290OyByb290ID0gcm9vdC0+b2xkZXJTaGFkb3dS
b290KCkpCisgICAgICAgICAgICBidWlsZEFjY2Vzc0tleU1hcChyb290KTsKKyAgICB9Cit9CisK
K3ZvaWQgRG9jdW1lbnQ6OmludmFsaWRhdGVBY2Nlc3NLZXlNYXAoKQoreworICAgIG1fYWNjZXNz
S2V5TWFwVmFsaWQgPSBmYWxzZTsKKyAgICBtX2VsZW1lbnRzQnlBY2Nlc3NLZXkuY2xlYXIoKTsK
K30KKworU2VsZWN0b3JRdWVyeUNhY2hlKiBEb2N1bWVudDo6c2VsZWN0b3JRdWVyeUNhY2hlKCkK
K3sKKyAgICBpZiAoIW1fc2VsZWN0b3JRdWVyeUNhY2hlKQorICAgICAgICBtX3NlbGVjdG9yUXVl
cnlDYWNoZSA9IGFkb3B0UHRyKG5ldyBTZWxlY3RvclF1ZXJ5Q2FjaGUoKSk7CisgICAgcmV0dXJu
IG1fc2VsZWN0b3JRdWVyeUNhY2hlLmdldCgpOworfQorCitNZWRpYVF1ZXJ5TWF0Y2hlciogRG9j
dW1lbnQ6Om1lZGlhUXVlcnlNYXRjaGVyKCkKK3sKKyAgICBpZiAoIW1fbWVkaWFRdWVyeU1hdGNo
ZXIpCisgICAgICAgIG1fbWVkaWFRdWVyeU1hdGNoZXIgPSBNZWRpYVF1ZXJ5TWF0Y2hlcjo6Y3Jl
YXRlKHRoaXMpOworICAgIHJldHVybiBtX21lZGlhUXVlcnlNYXRjaGVyLmdldCgpOworfQorCit2
b2lkIERvY3VtZW50OjpzZXRDb21wYXRpYmlsaXR5TW9kZShDb21wYXRpYmlsaXR5TW9kZSBtb2Rl
KQoreworICAgIGlmIChtX2NvbXBhdGliaWxpdHlNb2RlTG9ja2VkIHx8IG1vZGUgPT0gbV9jb21w
YXRpYmlsaXR5TW9kZSkKKyAgICAgICAgcmV0dXJuOworICAgIEFTU0VSVCghbV9zdHlsZVNoZWV0
cy0+bGVuZ3RoKCkpOworICAgIGJvb2wgd2FzSW5RdWlya3NNb2RlID0gaW5RdWlya3NNb2RlKCk7
CisgICAgbV9jb21wYXRpYmlsaXR5TW9kZSA9IG1vZGU7CisgICAgc2VsZWN0b3JRdWVyeUNhY2hl
KCktPmludmFsaWRhdGUoKTsKKyAgICBpZiAoaW5RdWlya3NNb2RlKCkgIT0gd2FzSW5RdWlya3NN
b2RlKSB7CisgICAgICAgIC8vIEFsbCB1c2VyIHN0eWxlc2hlZXRzIGhhdmUgdG8gcmVwYXJzZSB1
c2luZyB0aGUgZGlmZmVyZW50IG1vZGUuCisgICAgICAgIGNsZWFyUGFnZVVzZXJTaGVldCgpOwor
ICAgICAgICBjbGVhclBhZ2VHcm91cFVzZXJTaGVldHMoKTsKKyAgICB9Cit9CisKK1N0cmluZyBE
b2N1bWVudDo6Y29tcGF0TW9kZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGluUXVpcmtzTW9kZSgp
ID8gIkJhY2tDb21wYXQiIDogIkNTUzFDb21wYXQiOworfQorCit2b2lkIERvY3VtZW50OjpyZXNl
dExpbmtDb2xvcigpCit7CisgICAgbV9saW5rQ29sb3IgPSBDb2xvcigwLCAwLCAyMzgpOworfQor
Cit2b2lkIERvY3VtZW50OjpyZXNldFZpc2l0ZWRMaW5rQ29sb3IoKQoreworICAgIG1fdmlzaXRl
ZExpbmtDb2xvciA9IENvbG9yKDg1LCAyNiwgMTM5KTsgICAgCit9CisKK3ZvaWQgRG9jdW1lbnQ6
OnJlc2V0QWN0aXZlTGlua0NvbG9yKCkKK3sKKyAgICBtX2FjdGl2ZUxpbmtDb2xvci5zZXROYW1l
ZENvbG9yKCJyZWQiKTsKK30KKwordm9pZCBEb2N1bWVudDo6c2V0RG9jVHlwZShQYXNzUmVmUHRy
PERvY3VtZW50VHlwZT4gZG9jVHlwZSkKK3sKKyAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBiZSBj
YWxsZWQgbW9yZSB0aGFuIG9uY2UuCisgICAgQVNTRVJUKCFtX2RvY1R5cGUgfHwgIWRvY1R5cGUp
OworICAgIG1fZG9jVHlwZSA9IGRvY1R5cGU7CisgICAgaWYgKG1fZG9jVHlwZSkgeworICAgICAg
ICB0aGlzLT5hZG9wdElmTmVlZGVkKG1fZG9jVHlwZS5nZXQoKSk7CisjaWYgRU5BQkxFKExFR0FD
WV9WSUVXUE9SVF9BREFQVElPTikKKyAgICAgICAgaWYgKG1fZG9jVHlwZS0+cHVibGljSWQoKS5z
dGFydHNXaXRoKCItLy93YXBmb3J1bS8vZHRkIHhodG1sIG1vYmlsZSAxLiIsIC8qIGNhc2VTZW5z
aXRpdmUgKi8gZmFsc2UpKQorICAgICAgICAgICAgcHJvY2Vzc1ZpZXdwb3J0KCJ3aWR0aD1kZXZp
Y2Utd2lkdGgsIGhlaWdodD1kZXZpY2UtaGVpZ2h0IiwgVmlld3BvcnRBcmd1bWVudHM6OlhIVE1M
TW9iaWxlUHJvZmlsZSk7CisjZW5kaWYKKyAgICB9CisgICAgLy8gRG9jdHlwZSBhZmZlY3RzIHRo
ZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgc3R5bGVzaGVldHMuCisgICAgY2xlYXJTdHlsZVJlc29s
dmVyKCk7Cit9CisKK0RPTUltcGxlbWVudGF0aW9uKiBEb2N1bWVudDo6aW1wbGVtZW50YXRpb24o
KQoreworICAgIGlmICghbV9pbXBsZW1lbnRhdGlvbikKKyAgICAgICAgbV9pbXBsZW1lbnRhdGlv
biA9IERPTUltcGxlbWVudGF0aW9uOjpjcmVhdGUodGhpcyk7CisgICAgcmV0dXJuIG1faW1wbGVt
ZW50YXRpb24uZ2V0KCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmNoaWxkcmVuQ2hhbmdlZChib29s
IGNoYW5nZWRCeVBhcnNlciwgTm9kZSogYmVmb3JlQ2hhbmdlLCBOb2RlKiBhZnRlckNoYW5nZSwg
aW50IGNoaWxkQ291bnREZWx0YSkKK3sKKyAgICBDb250YWluZXJOb2RlOjpjaGlsZHJlbkNoYW5n
ZWQoY2hhbmdlZEJ5UGFyc2VyLCBiZWZvcmVDaGFuZ2UsIGFmdGVyQ2hhbmdlLCBjaGlsZENvdW50
RGVsdGEpOworICAgIAorICAgIEVsZW1lbnQqIG5ld0RvY3VtZW50RWxlbWVudCA9IGZpcnN0RWxl
bWVudENoaWxkKHRoaXMpOworICAgIGlmIChuZXdEb2N1bWVudEVsZW1lbnQgPT0gbV9kb2N1bWVu
dEVsZW1lbnQpCisgICAgICAgIHJldHVybjsKKyAgICBtX2RvY3VtZW50RWxlbWVudCA9IG5ld0Rv
Y3VtZW50RWxlbWVudDsKKyAgICAvLyBUaGUgcm9vdCBzdHlsZSB1c2VkIGZvciBtZWRpYSBxdWVy
eSBtYXRjaGluZyBkZXBlbmRzIG9uIHRoZSBkb2N1bWVudCBlbGVtZW50LgorICAgIGNsZWFyU3R5
bGVSZXNvbHZlcigpOworfQorCitQYXNzUmVmUHRyPEVsZW1lbnQ+IERvY3VtZW50OjpjcmVhdGVF
bGVtZW50KGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSwgRXhjZXB0aW9uQ29kZSYgZWMpCit7Cisg
ICAgaWYgKCFpc1ZhbGlkTmFtZShuYW1lKSkgeworICAgICAgICBlYyA9IElOVkFMSURfQ0hBUkFD
VEVSX0VSUjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKG1faXNYSFRNTCkK
KyAgICAgICAgcmV0dXJuIEhUTUxFbGVtZW50RmFjdG9yeTo6Y3JlYXRlSFRNTEVsZW1lbnQoUXVh
bGlmaWVkTmFtZShudWxsQXRvbSwgbmFtZSwgeGh0bWxOYW1lc3BhY2VVUkkpLCB0aGlzLCAwLCBm
YWxzZSk7CisKKyAgICByZXR1cm4gY3JlYXRlRWxlbWVudChRdWFsaWZpZWROYW1lKG51bGxBdG9t
LCBuYW1lLCBudWxsQXRvbSksIGZhbHNlKTsKK30KKworUGFzc1JlZlB0cjxEb2N1bWVudEZyYWdt
ZW50PiBEb2N1bWVudDo6Y3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpCit7CisgICAgcmV0dXJuIERv
Y3VtZW50RnJhZ21lbnQ6OmNyZWF0ZShkb2N1bWVudCgpKTsKK30KKworUGFzc1JlZlB0cjxUZXh0
PiBEb2N1bWVudDo6Y3JlYXRlVGV4dE5vZGUoY29uc3QgU3RyaW5nJiBkYXRhKQoreworICAgIHJl
dHVybiBUZXh0OjpjcmVhdGUodGhpcywgZGF0YSk7Cit9CisKK1Bhc3NSZWZQdHI8Q29tbWVudD4g
RG9jdW1lbnQ6OmNyZWF0ZUNvbW1lbnQoY29uc3QgU3RyaW5nJiBkYXRhKQoreworICAgIHJldHVy
biBDb21tZW50OjpjcmVhdGUodGhpcywgZGF0YSk7Cit9CisKK1Bhc3NSZWZQdHI8Q0RBVEFTZWN0
aW9uPiBEb2N1bWVudDo6Y3JlYXRlQ0RBVEFTZWN0aW9uKGNvbnN0IFN0cmluZyYgZGF0YSwgRXhj
ZXB0aW9uQ29kZSYgZWMpCit7CisgICAgaWYgKGlzSFRNTERvY3VtZW50KCkpIHsKKyAgICAgICAg
ZWMgPSBOT1RfU1VQUE9SVEVEX0VSUjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJl
dHVybiBDREFUQVNlY3Rpb246OmNyZWF0ZSh0aGlzLCBkYXRhKTsKK30KKworUGFzc1JlZlB0cjxQ
cm9jZXNzaW5nSW5zdHJ1Y3Rpb24+IERvY3VtZW50OjpjcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rp
b24oY29uc3QgU3RyaW5nJiB0YXJnZXQsIGNvbnN0IFN0cmluZyYgZGF0YSwgRXhjZXB0aW9uQ29k
ZSYgZWMpCit7CisgICAgaWYgKCFpc1ZhbGlkTmFtZSh0YXJnZXQpKSB7CisgICAgICAgIGVjID0g
SU5WQUxJRF9DSEFSQUNURVJfRVJSOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYg
KGlzSFRNTERvY3VtZW50KCkpIHsKKyAgICAgICAgZWMgPSBOT1RfU1VQUE9SVEVEX0VSUjsKKyAg
ICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb246
OmNyZWF0ZSh0aGlzLCB0YXJnZXQsIGRhdGEpOworfQorCitQYXNzUmVmUHRyPEVudGl0eVJlZmVy
ZW5jZT4gRG9jdW1lbnQ6OmNyZWF0ZUVudGl0eVJlZmVyZW5jZShjb25zdCBTdHJpbmcmIG5hbWUs
IEV4Y2VwdGlvbkNvZGUmIGVjKQoreworICAgIGlmICghaXNWYWxpZE5hbWUobmFtZSkpIHsKKyAg
ICAgICAgZWMgPSBJTlZBTElEX0NIQVJBQ1RFUl9FUlI7CisgICAgICAgIHJldHVybiAwOworICAg
IH0KKyAgICBpZiAoaXNIVE1MRG9jdW1lbnQoKSkgeworICAgICAgICBlYyA9IE5PVF9TVVBQT1JU
RURfRVJSOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIEVudGl0eVJlZmVy
ZW5jZTo6Y3JlYXRlKHRoaXMsIG5hbWUpOworfQorCitQYXNzUmVmUHRyPEVkaXRpbmdUZXh0PiBE
b2N1bWVudDo6Y3JlYXRlRWRpdGluZ1RleHROb2RlKGNvbnN0IFN0cmluZyYgdGV4dCkKK3sKKyAg
ICByZXR1cm4gRWRpdGluZ1RleHQ6OmNyZWF0ZSh0aGlzLCB0ZXh0KTsKK30KKworUGFzc1JlZlB0
cjxDU1NTdHlsZURlY2xhcmF0aW9uPiBEb2N1bWVudDo6Y3JlYXRlQ1NTU3R5bGVEZWNsYXJhdGlv
bigpCit7CisgICAgcmV0dXJuIFN0eWxlUHJvcGVydHlTZXQ6OmNyZWF0ZSgpLT5lbnN1cmVDU1NT
dHlsZURlY2xhcmF0aW9uKCk7Cit9CisKK1Bhc3NSZWZQdHI8Tm9kZT4gRG9jdW1lbnQ6OmltcG9y
dE5vZGUoTm9kZSogaW1wb3J0ZWROb2RlLCBib29sIGRlZXAsIEV4Y2VwdGlvbkNvZGUmIGVjKQor
eworICAgIGVjID0gMDsKKyAgICAKKyAgICBpZiAoIWltcG9ydGVkTm9kZSkgeworICAgICAgICBl
YyA9IE5PVF9TVVBQT1JURURfRVJSOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBz
d2l0Y2ggKGltcG9ydGVkTm9kZS0+bm9kZVR5cGUoKSkgeworICAgIGNhc2UgVEVYVF9OT0RFOgor
ICAgICAgICByZXR1cm4gY3JlYXRlVGV4dE5vZGUoaW1wb3J0ZWROb2RlLT5ub2RlVmFsdWUoKSk7
CisgICAgY2FzZSBDREFUQV9TRUNUSU9OX05PREU6CisgICAgICAgIHJldHVybiBjcmVhdGVDREFU
QVNlY3Rpb24oaW1wb3J0ZWROb2RlLT5ub2RlVmFsdWUoKSwgZWMpOworICAgIGNhc2UgRU5USVRZ
X1JFRkVSRU5DRV9OT0RFOgorICAgICAgICByZXR1cm4gY3JlYXRlRW50aXR5UmVmZXJlbmNlKGlt
cG9ydGVkTm9kZS0+bm9kZU5hbWUoKSwgZWMpOworICAgIGNhc2UgUFJPQ0VTU0lOR19JTlNUUlVD
VElPTl9OT0RFOgorICAgICAgICByZXR1cm4gY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKGlt
cG9ydGVkTm9kZS0+bm9kZU5hbWUoKSwgaW1wb3J0ZWROb2RlLT5ub2RlVmFsdWUoKSwgZWMpOwor
ICAgIGNhc2UgQ09NTUVOVF9OT0RFOgorICAgICAgICByZXR1cm4gY3JlYXRlQ29tbWVudChpbXBv
cnRlZE5vZGUtPm5vZGVWYWx1ZSgpKTsKKyAgICBjYXNlIEVMRU1FTlRfTk9ERTogeworICAgICAg
ICBFbGVtZW50KiBvbGRFbGVtZW50ID0gc3RhdGljX2Nhc3Q8RWxlbWVudCo+KGltcG9ydGVkTm9k
ZSk7CisgICAgICAgIC8vIEZJWE1FOiBUaGUgZm9sbG93aW5nIGNoZWNrIG1pZ2h0IGJlIHVubmVj
ZXNzYXJ5LiBJcyBpdCBwb3NzaWJsZSB0aGF0CisgICAgICAgIC8vIG9sZEVsZW1lbnQgaGFzIG1p
c21hdGNoZWQgcHJlZml4L25hbWVzcGFjZT8KKyAgICAgICAgaWYgKCFoYXNWYWxpZE5hbWVzcGFj
ZUZvckVsZW1lbnRzKG9sZEVsZW1lbnQtPnRhZ1FOYW1lKCkpKSB7CisgICAgICAgICAgICBlYyA9
IE5BTUVTUEFDRV9FUlI7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAg
ICBSZWZQdHI8RWxlbWVudD4gbmV3RWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQob2xkRWxlbWVudC0+
dGFnUU5hbWUoKSwgZWMpOworICAgICAgICBpZiAoZWMpCisgICAgICAgICAgICByZXR1cm4gMDsK
KworICAgICAgICBuZXdFbGVtZW50LT5jbG9uZURhdGFGcm9tRWxlbWVudCgqb2xkRWxlbWVudCk7
CisKKyAgICAgICAgaWYgKGRlZXApIHsKKyAgICAgICAgICAgIGZvciAoTm9kZSogb2xkQ2hpbGQg
PSBvbGRFbGVtZW50LT5maXJzdENoaWxkKCk7IG9sZENoaWxkOyBvbGRDaGlsZCA9IG9sZENoaWxk
LT5uZXh0U2libGluZygpKSB7CisgICAgICAgICAgICAgICAgUmVmUHRyPE5vZGU+IG5ld0NoaWxk
ID0gaW1wb3J0Tm9kZShvbGRDaGlsZCwgdHJ1ZSwgZWMpOworICAgICAgICAgICAgICAgIGlmIChl
YykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgbmV3RWxl
bWVudC0+YXBwZW5kQ2hpbGQobmV3Q2hpbGQucmVsZWFzZSgpLCBlYyk7CisgICAgICAgICAgICAg
ICAgaWYgKGVjKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXdFbGVtZW50LnJlbGVhc2UoKTsKKyAgICB9
CisgICAgY2FzZSBBVFRSSUJVVEVfTk9ERToKKyAgICAgICAgcmV0dXJuIEF0dHI6OmNyZWF0ZSh0
aGlzLCBRdWFsaWZpZWROYW1lKG51bGxBdG9tLCBzdGF0aWNfY2FzdDxBdHRyKj4oaW1wb3J0ZWRO
b2RlKS0+bmFtZSgpLCBudWxsQXRvbSksIHN0YXRpY19jYXN0PEF0dHIqPihpbXBvcnRlZE5vZGUp
LT52YWx1ZSgpKTsKKyAgICBjYXNlIERPQ1VNRU5UX0ZSQUdNRU5UX05PREU6IHsKKyAgICAgICAg
aWYgKGltcG9ydGVkTm9kZS0+aXNTaGFkb3dSb290KCkpIHsKKyAgICAgICAgICAgIC8vIFNoYWRv
d1Jvb3Qgbm9kZXMgc2hvdWxkIG5vdCBiZSBleHBsaWNpdGx5IGltcG9ydGFibGUuCisgICAgICAg
ICAgICAvLyBFaXRoZXIgdGhleSBhcmUgaW1wb3J0ZWQgYWxvbmcgd2l0aCB0aGVpciBob3N0IG5v
ZGUsIG9yIGNyZWF0ZWQgaW1wbGljaXRseS4KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9
CisgICAgICAgIERvY3VtZW50RnJhZ21lbnQqIG9sZEZyYWdtZW50ID0gc3RhdGljX2Nhc3Q8RG9j
dW1lbnRGcmFnbWVudCo+KGltcG9ydGVkTm9kZSk7CisgICAgICAgIFJlZlB0cjxEb2N1bWVudEZy
YWdtZW50PiBuZXdGcmFnbWVudCA9IGNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKKyAgICAgICAg
aWYgKGRlZXApIHsKKyAgICAgICAgICAgIGZvciAoTm9kZSogb2xkQ2hpbGQgPSBvbGRGcmFnbWVu
dC0+Zmlyc3RDaGlsZCgpOyBvbGRDaGlsZDsgb2xkQ2hpbGQgPSBvbGRDaGlsZC0+bmV4dFNpYmxp
bmcoKSkgeworICAgICAgICAgICAgICAgIFJlZlB0cjxOb2RlPiBuZXdDaGlsZCA9IGltcG9ydE5v
ZGUob2xkQ2hpbGQsIHRydWUsIGVjKTsKKyAgICAgICAgICAgICAgICBpZiAoZWMpCisgICAgICAg
ICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIG5ld0ZyYWdtZW50LT5hcHBl
bmRDaGlsZChuZXdDaGlsZC5yZWxlYXNlKCksIGVjKTsKKyAgICAgICAgICAgICAgICBpZiAoZWMp
CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9
CisgICAgICAgIAorICAgICAgICByZXR1cm4gbmV3RnJhZ21lbnQucmVsZWFzZSgpOworICAgIH0K
KyAgICBjYXNlIEVOVElUWV9OT0RFOgorICAgIGNhc2UgTk9UQVRJT05fTk9ERToKKyAgICAgICAg
Ly8gRklYTUU6IEl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBpbXBvcnQgdGhlc2Ugbm9kZSB0eXBl
cywgaG93ZXZlciBpbiBET00zIHRoZSBEb2N1bWVudFR5cGUgaXMgcmVhZG9ubHksIHNvIHRoZXJl
IGlzbid0IG11Y2ggc2Vuc2UgaW4gZG9pbmcgdGhhdC4KKyAgICAgICAgLy8gQWJpbGl0eSB0byBh
ZGQgdGhlc2UgaW1wb3J0ZWQgbm9kZXMgdG8gYSBEb2N1bWVudFR5cGUgd2lsbCBiZSBjb25zaWRl
cmVkIGZvciBhZGRpdGlvbiB0byBhIGZ1dHVyZSByZWxlYXNlIG9mIHRoZSBET00uCisgICAgY2Fz
ZSBET0NVTUVOVF9OT0RFOgorICAgIGNhc2UgRE9DVU1FTlRfVFlQRV9OT0RFOgorICAgIGNhc2Ug
WFBBVEhfTkFNRVNQQUNFX05PREU6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBlYyA9IE5P
VF9TVVBQT1JURURfRVJSOworICAgIHJldHVybiAwOworfQorCisKK1Bhc3NSZWZQdHI8Tm9kZT4g
RG9jdW1lbnQ6OmFkb3B0Tm9kZShQYXNzUmVmUHRyPE5vZGU+IHNvdXJjZSwgRXhjZXB0aW9uQ29k
ZSYgZWMpCit7CisgICAgaWYgKCFzb3VyY2UpIHsKKyAgICAgICAgZWMgPSBOT1RfU1VQUE9SVEVE
X0VSUjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKHNvdXJjZS0+aXNSZWFk
T25seU5vZGUoKSkgeworICAgICAgICBlYyA9IE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjsK
KyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgRXZlbnRRdWV1ZVNjb3BlIHNjb3BlOwor
CisgICAgc3dpdGNoIChzb3VyY2UtPm5vZGVUeXBlKCkpIHsKKyAgICBjYXNlIEVOVElUWV9OT0RF
OgorICAgIGNhc2UgTk9UQVRJT05fTk9ERToKKyAgICBjYXNlIERPQ1VNRU5UX05PREU6CisgICAg
Y2FzZSBET0NVTUVOVF9UWVBFX05PREU6CisgICAgY2FzZSBYUEFUSF9OQU1FU1BBQ0VfTk9ERToK
KyAgICAgICAgZWMgPSBOT1RfU1VQUE9SVEVEX0VSUjsKKyAgICAgICAgcmV0dXJuIDA7ICAgICAg
ICAgICAgCisgICAgY2FzZSBBVFRSSUJVVEVfTk9ERTogeyAgICAgICAgICAgICAgICAgICAKKyAg
ICAgICAgQXR0ciogYXR0ciA9IHN0YXRpY19jYXN0PEF0dHIqPihzb3VyY2UuZ2V0KCkpOworICAg
ICAgICBpZiAoYXR0ci0+b3duZXJFbGVtZW50KCkpCisgICAgICAgICAgICBhdHRyLT5vd25lckVs
ZW1lbnQoKS0+cmVtb3ZlQXR0cmlidXRlTm9kZShhdHRyLCBlYyk7CisgICAgICAgIGF0dHItPnNl
dFNwZWNpZmllZCh0cnVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfSAgICAgICAKKyAgICBkZWZh
dWx0OgorICAgICAgICBpZiAoc291cmNlLT5pc1NoYWRvd1Jvb3QoKSkgeworICAgICAgICAgICAg
Ly8gU2hhZG93Um9vdCBjYW5ub3QgZGlzY29ubmVjdCBpdHNlbGYgZnJvbSB0aGUgaG9zdCBub2Rl
LgorICAgICAgICAgICAgZWMgPSBISUVSQVJDSFlfUkVRVUVTVF9FUlI7CisgICAgICAgICAgICBy
ZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZJWE1FOiBXaGF0IGFib3V0IDxmcmFt
ZT4gYW5kIDxvYmplY3Q+PworICAgICAgICBpZiAoc291cmNlLT5oYXNUYWdOYW1lKGlmcmFtZVRh
ZykpIHsKKyAgICAgICAgICAgIEhUTUxJRnJhbWVFbGVtZW50KiBpZnJhbWUgPSBzdGF0aWNfY2Fz
dDxIVE1MSUZyYW1lRWxlbWVudCo+KHNvdXJjZS5nZXQoKSk7CisgICAgICAgICAgICBpZiAoZnJh
bWUoKSAmJiBmcmFtZSgpLT50cmVlKCktPmlzRGVzY2VuZGFudE9mKGlmcmFtZS0+Y29udGVudEZy
YW1lKCkpKSB7CisgICAgICAgICAgICAgICAgZWMgPSBISUVSQVJDSFlfUkVRVUVTVF9FUlI7Cisg
ICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAg
ICAgaWYgKHNvdXJjZS0+cGFyZW50Tm9kZSgpKQorICAgICAgICAgICAgc291cmNlLT5wYXJlbnRO
b2RlKCktPnJlbW92ZUNoaWxkKHNvdXJjZS5nZXQoKSwgZWMpOworICAgIH0KKworICAgIHRoaXMt
PmFkb3B0SWZOZWVkZWQoc291cmNlLmdldCgpKTsKKworICAgIHJldHVybiBzb3VyY2U7Cit9CisK
K2Jvb2wgRG9jdW1lbnQ6Omhhc1ZhbGlkTmFtZXNwYWNlRm9yRWxlbWVudHMoY29uc3QgUXVhbGlm
aWVkTmFtZSYgcU5hbWUpCit7CisgICAgLy8gVGhlc2UgY2hlY2tzIGFyZSBmcm9tIERPTSBDb3Jl
IExldmVsIDIsIGNyZWF0ZUVsZW1lbnROUworICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0RP
TS1MZXZlbC0yLUNvcmUvY29yZS5odG1sI0lELURvY0NyRWxOUworICAgIGlmICghcU5hbWUucHJl
Zml4KCkuaXNFbXB0eSgpICYmIHFOYW1lLm5hbWVzcGFjZVVSSSgpLmlzTnVsbCgpKSAvLyBjcmVh
dGVFbGVtZW50TlMobnVsbCwgImh0bWw6ZGl2IikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
IGlmIChxTmFtZS5wcmVmaXgoKSA9PSB4bWxBdG9tICYmIHFOYW1lLm5hbWVzcGFjZVVSSSgpICE9
IFhNTE5hbWVzOjp4bWxOYW1lc3BhY2VVUkkpIC8vIGNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3
dy5leGFtcGxlLmNvbSIsICJ4bWw6bGFuZyIpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
IC8vIFJlcXVpcmVkIGJ5IERPTSBMZXZlbCAzIENvcmUgYW5kIHVuc3BlY2lmaWVkIGJ5IERPTSBM
ZXZlbCAyIENvcmU6CisgICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAwNC9SRUMtRE9NLUxl
dmVsLTMtQ29yZS0yMDA0MDQwNy9jb3JlLmh0bWwjSUQtRG9jQ3JFbE5TCisgICAgLy8gY3JlYXRl
RWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyIsICJmb286YmFyIiksIGNy
ZWF0ZUVsZW1lbnROUyhudWxsLCAieG1sbnM6YmFyIikKKyAgICBpZiAoKHFOYW1lLnByZWZpeCgp
ID09IHhtbG5zQXRvbSAmJiBxTmFtZS5uYW1lc3BhY2VVUkkoKSAhPSBYTUxOU05hbWVzOjp4bWxu
c05hbWVzcGFjZVVSSSkgfHwgKHFOYW1lLnByZWZpeCgpICE9IHhtbG5zQXRvbSAmJiBxTmFtZS5u
YW1lc3BhY2VVUkkoKSA9PSBYTUxOU05hbWVzOjp4bWxuc05hbWVzcGFjZVVSSSkpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIERvY3VtZW50Ojpo
YXNWYWxpZE5hbWVzcGFjZUZvckF0dHJpYnV0ZXMoY29uc3QgUXVhbGlmaWVkTmFtZSYgcU5hbWUp
Cit7CisgICAgLy8gU3BlYzogRE9NIExldmVsIDIgQ29yZTogaHR0cDovL3d3dy53My5vcmcvVFIv
RE9NLUxldmVsLTItQ29yZS9jb3JlLmh0bWwjSUQtRWxTZXRBdHRyTlMKKyAgICBpZiAocU5hbWUu
cHJlZml4KCkuaXNFbXB0eSgpICYmIHFOYW1lLmxvY2FsTmFtZSgpID09IHhtbG5zQXRvbSkgewor
ICAgICAgICAvLyBOb3RlOiBUaGUgY2FzZSBvZiBhbiAieG1sbnMiIHF1YWxpZmllZCBuYW1lIHdp
dGggYSBuYW1lc3BhY2Ugb2YKKyAgICAgICAgLy8geG1sbnNOYW1lc3BhY2VVUkkgaXMgc3BlY2lm
aWNhbGx5IGFsbG93ZWQgKFNlZSA8aHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8+KS4KKyAg
ICAgICAgcmV0dXJuIHFOYW1lLm5hbWVzcGFjZVVSSSgpID09IFhNTE5TTmFtZXM6OnhtbG5zTmFt
ZXNwYWNlVVJJOworICAgIH0KKyAgICByZXR1cm4gaGFzVmFsaWROYW1lc3BhY2VGb3JFbGVtZW50
cyhxTmFtZSk7Cit9CisKKy8vIEZJWE1FOiBUaGlzIHNob3VsZCByZWFsbHkgYmUgaW4gYSBwb3Nz
aWJsZSBFbGVtZW50RmFjdG9yeSBjbGFzcworUGFzc1JlZlB0cjxFbGVtZW50PiBEb2N1bWVudDo6
Y3JlYXRlRWxlbWVudChjb25zdCBRdWFsaWZpZWROYW1lJiBxTmFtZSwgYm9vbCBjcmVhdGVkQnlQ
YXJzZXIpCit7CisgICAgUmVmUHRyPEVsZW1lbnQ+IGU7CisKKyAgICAvLyBGSVhNRTogVXNlIHJl
Z2lzdGVyZWQgbmFtZXNwYWNlcyBhbmQgbG9vayB1cCBpbiBhIGhhc2ggdG8gZmluZCB0aGUgcmln
aHQgZmFjdG9yeS4KKyAgICBpZiAocU5hbWUubmFtZXNwYWNlVVJJKCkgPT0geGh0bWxOYW1lc3Bh
Y2VVUkkpCisgICAgICAgIGUgPSBIVE1MRWxlbWVudEZhY3Rvcnk6OmNyZWF0ZUhUTUxFbGVtZW50
KHFOYW1lLCB0aGlzLCAwLCBjcmVhdGVkQnlQYXJzZXIpOworI2lmIEVOQUJMRShTVkcpCisgICAg
ZWxzZSBpZiAocU5hbWUubmFtZXNwYWNlVVJJKCkgPT0gU1ZHTmFtZXM6OnN2Z05hbWVzcGFjZVVS
SSkKKyAgICAgICAgZSA9IFNWR0VsZW1lbnRGYWN0b3J5OjpjcmVhdGVTVkdFbGVtZW50KHFOYW1l
LCB0aGlzLCBjcmVhdGVkQnlQYXJzZXIpOworI2VuZGlmCisjaWYgRU5BQkxFKE1BVEhNTCkKKyAg
ICBlbHNlIGlmIChxTmFtZS5uYW1lc3BhY2VVUkkoKSA9PSBNYXRoTUxOYW1lczo6bWF0aG1sTmFt
ZXNwYWNlVVJJKQorICAgICAgICBlID0gTWF0aE1MRWxlbWVudEZhY3Rvcnk6OmNyZWF0ZU1hdGhN
TEVsZW1lbnQocU5hbWUsIHRoaXMsIGNyZWF0ZWRCeVBhcnNlcik7CisjZW5kaWYKKworICAgIGlm
IChlKQorICAgICAgICBtX3Nhd0VsZW1lbnRzSW5Lbm93bk5hbWVzcGFjZXMgPSB0cnVlOworICAg
IGVsc2UKKyAgICAgICAgZSA9IEVsZW1lbnQ6OmNyZWF0ZShxTmFtZSwgZG9jdW1lbnQoKSk7CisK
KyAgICAvLyA8aW1hZ2U+IHVzZXMgaW1nVGFnIHNvIHdlIG5lZWQgYSBzcGVjaWFsIHJ1bGUuCisg
ICAgQVNTRVJUKChxTmFtZS5tYXRjaGVzKGltYWdlVGFnKSAmJiBlLT50YWdRTmFtZSgpLm1hdGNo
ZXMoaW1nVGFnKSAmJiBlLT50YWdRTmFtZSgpLnByZWZpeCgpID09IHFOYW1lLnByZWZpeCgpKSB8
fCBxTmFtZSA9PSBlLT50YWdRTmFtZSgpKTsKKworICAgIHJldHVybiBlLnJlbGVhc2UoKTsKK30K
KworYm9vbCBEb2N1bWVudDo6cmVnaW9uQmFzZWRDb2x1bW5zRW5hYmxlZCgpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIHNldHRpbmdzKCkgJiYgc2V0dGluZ3MoKS0+cmVnaW9uQmFzZWRDb2x1bW5zRW5h
YmxlZCgpOyAKK30KKworYm9vbCBEb2N1bWVudDo6Y3NzU3RpY2t5UG9zaXRpb25FbmFibGVkKCkg
Y29uc3QKK3sKKyAgICByZXR1cm4gc2V0dGluZ3MoKSAmJiBzZXR0aW5ncygpLT5jc3NTdGlja3lQ
b3NpdGlvbkVuYWJsZWQoKTsgCit9CisKK2Jvb2wgRG9jdW1lbnQ6OmNzc1JlZ2lvbnNFbmFibGVk
KCkgY29uc3QKK3sKKyAgICByZXR1cm4gc2V0dGluZ3MoKSAmJiBzZXR0aW5ncygpLT5jc3NSZWdp
b25zRW5hYmxlZCgpOyAKK30KKworYm9vbCBEb2N1bWVudDo6Y3NzR3JpZExheW91dEVuYWJsZWQo
KSBjb25zdAoreworICAgIHJldHVybiBzZXR0aW5ncygpICYmIHNldHRpbmdzKCktPmNzc0dyaWRM
YXlvdXRFbmFibGVkKCk7Cit9CisKKyNpZiBFTkFCTEUoQ1NTX1JFR0lPTlMpCisKK1Bhc3NSZWZQ
dHI8V2ViS2l0TmFtZWRGbG93PiBEb2N1bWVudDo6d2Via2l0R2V0Rmxvd0J5TmFtZShjb25zdCBT
dHJpbmcmIGZsb3dOYW1lKQoreworICAgIGlmICghY3NzUmVnaW9uc0VuYWJsZWQoKSB8fCAhcmVu
ZGVyZXIoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvLyBJdCdzIHBvc3NpYmxlIHRvIGhh
dmUgcGVuZGluZyBzdHlsZXMgbm90IGFwcGxpZWQgdGhhdCBhZmZlY3QgdGhlIGV4aXN0aW5nIGZs
b3dzLgorICAgIHVwZGF0ZVN0eWxlSWZOZWVkZWQoKTsKKworICAgIHJldHVybiBuYW1lZEZsb3dz
KCktPmZsb3dCeU5hbWUoZmxvd05hbWUpOworfQorCitQYXNzUmVmUHRyPERPTU5hbWVkRmxvd0Nv
bGxlY3Rpb24+IERvY3VtZW50Ojp3ZWJraXRHZXROYW1lZEZsb3dzKCkKK3sKKyAgICBpZiAoIWNz
c1JlZ2lvbnNFbmFibGVkKCkgfHwgIXJlbmRlcmVyKCkpCisgICAgICAgIHJldHVybiAwOworCisg
ICAgdXBkYXRlU3R5bGVJZk5lZWRlZCgpOworCisgICAgcmV0dXJuIG5hbWVkRmxvd3MoKS0+Y3Jl
YXRlQ1NTT01TbmFwc2hvdCgpOworfQorCisjZW5kaWYKKworTmFtZWRGbG93Q29sbGVjdGlvbiog
RG9jdW1lbnQ6Om5hbWVkRmxvd3MoKQoreworICAgIGlmICghbV9uYW1lZEZsb3dzKQorICAgICAg
ICBtX25hbWVkRmxvd3MgPSBOYW1lZEZsb3dDb2xsZWN0aW9uOjpjcmVhdGUodGhpcyk7CisKKyAg
ICByZXR1cm4gbV9uYW1lZEZsb3dzLmdldCgpOworfQorCitQYXNzUmVmUHRyPEVsZW1lbnQ+IERv
Y3VtZW50OjpjcmVhdGVFbGVtZW50TlMoY29uc3QgU3RyaW5nJiBuYW1lc3BhY2VVUkksIGNvbnN0
IFN0cmluZyYgcXVhbGlmaWVkTmFtZSwgRXhjZXB0aW9uQ29kZSYgZWMpCit7CisgICAgU3RyaW5n
IHByZWZpeCwgbG9jYWxOYW1lOworICAgIGlmICghcGFyc2VRdWFsaWZpZWROYW1lKHF1YWxpZmll
ZE5hbWUsIHByZWZpeCwgbG9jYWxOYW1lLCBlYykpCisgICAgICAgIHJldHVybiAwOworCisgICAg
UXVhbGlmaWVkTmFtZSBxTmFtZShwcmVmaXgsIGxvY2FsTmFtZSwgbmFtZXNwYWNlVVJJKTsKKyAg
ICBpZiAoIWhhc1ZhbGlkTmFtZXNwYWNlRm9yRWxlbWVudHMocU5hbWUpKSB7CisgICAgICAgIGVj
ID0gTkFNRVNQQUNFX0VSUjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJu
IGNyZWF0ZUVsZW1lbnQocU5hbWUsIGZhbHNlKTsKK30KKworU3RyaW5nIERvY3VtZW50OjpyZWFk
eVN0YXRlKCkgY29uc3QKK3sKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKGNvbnN0IFN0cmluZywg
bG9hZGluZywgKEFTQ0lJTGl0ZXJhbCgibG9hZGluZyIpKSk7CisgICAgREVGSU5FX1NUQVRJQ19M
T0NBTChjb25zdCBTdHJpbmcsIGludGVyYWN0aXZlLCAoQVNDSUlMaXRlcmFsKCJpbnRlcmFjdGl2
ZSIpKSk7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChjb25zdCBTdHJpbmcsIGNvbXBsZXRlLCAo
QVNDSUlMaXRlcmFsKCJjb21wbGV0ZSIpKSk7CisKKyAgICBzd2l0Y2ggKG1fcmVhZHlTdGF0ZSkg
eworICAgIGNhc2UgTG9hZGluZzoKKyAgICAgICAgcmV0dXJuIGxvYWRpbmc7CisgICAgY2FzZSBJ
bnRlcmFjdGl2ZToKKyAgICAgICAgcmV0dXJuIGludGVyYWN0aXZlOworICAgIGNhc2UgQ29tcGxl
dGU6CisgICAgICAgIHJldHVybiBjb21wbGV0ZTsKKyAgICB9CisKKyAgICBBU1NFUlRfTk9UX1JF
QUNIRUQoKTsKKyAgICByZXR1cm4gU3RyaW5nKCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnNldFJl
YWR5U3RhdGUoUmVhZHlTdGF0ZSByZWFkeVN0YXRlKQoreworICAgIGlmIChyZWFkeVN0YXRlID09
IG1fcmVhZHlTdGF0ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgc3dpdGNoIChyZWFkeVN0YXRl
KSB7CisgICAgY2FzZSBMb2FkaW5nOgorICAgICAgICBpZiAoIW1fZG9jdW1lbnRUaW1pbmcuZG9t
TG9hZGluZykKKyAgICAgICAgICAgIG1fZG9jdW1lbnRUaW1pbmcuZG9tTG9hZGluZyA9IG1vbm90
b25pY2FsbHlJbmNyZWFzaW5nVGltZSgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEludGVy
YWN0aXZlOgorICAgICAgICBpZiAoIW1fZG9jdW1lbnRUaW1pbmcuZG9tSW50ZXJhY3RpdmUpCisg
ICAgICAgICAgICBtX2RvY3VtZW50VGltaW5nLmRvbUludGVyYWN0aXZlID0gbW9ub3RvbmljYWxs
eUluY3JlYXNpbmdUaW1lKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ29tcGxldGU6Cisg
ICAgICAgIGlmICghbV9kb2N1bWVudFRpbWluZy5kb21Db21wbGV0ZSkKKyAgICAgICAgICAgIG1f
ZG9jdW1lbnRUaW1pbmcuZG9tQ29tcGxldGUgPSBtb25vdG9uaWNhbGx5SW5jcmVhc2luZ1RpbWUo
KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgbV9yZWFkeVN0YXRlID0gcmVhZHlTdGF0
ZTsKKyAgICBkaXNwYXRjaEV2ZW50KEV2ZW50OjpjcmVhdGUoZXZlbnROYW1lcygpLnJlYWR5c3Rh
dGVjaGFuZ2VFdmVudCwgZmFsc2UsIGZhbHNlKSk7CisgICAgCisgICAgaWYgKHNldHRpbmdzKCkg
JiYgc2V0dGluZ3MoKS0+c3VwcHJlc3Nlc0luY3JlbWVudGFsUmVuZGVyaW5nKCkpCisgICAgICAg
IHNldFZpc3VhbFVwZGF0ZXNBbGxvd2VkKHJlYWR5U3RhdGUpOworfQorCit2b2lkIERvY3VtZW50
OjpzZXRWaXN1YWxVcGRhdGVzQWxsb3dlZChSZWFkeVN0YXRlIHJlYWR5U3RhdGUpCit7CisgICAg
QVNTRVJUKHNldHRpbmdzKCkgJiYgc2V0dGluZ3MoKS0+c3VwcHJlc3Nlc0luY3JlbWVudGFsUmVu
ZGVyaW5nKCkpOworICAgIHN3aXRjaCAocmVhZHlTdGF0ZSkgeworICAgIGNhc2UgTG9hZGluZzoK
KyAgICAgICAgQVNTRVJUKCFtX3Zpc3VhbFVwZGF0ZXNTdXBwcmVzc2lvblRpbWVyLmlzQWN0aXZl
KCkpOworICAgICAgICBBU1NFUlQobV92aXN1YWxVcGRhdGVzQWxsb3dlZCk7CisgICAgICAgIG1f
dmlzdWFsVXBkYXRlc1N1cHByZXNzaW9uVGltZXIuc3RhcnRPbmVTaG90KHNldHRpbmdzKCktPmlu
Y3JlbWVudGFsUmVuZGVyaW5nU3VwcHJlc3Npb25UaW1lb3V0SW5TZWNvbmRzKCkpOworICAgICAg
ICBzZXRWaXN1YWxVcGRhdGVzQWxsb3dlZChmYWxzZSk7CisgICAgICAgIGJyZWFrOworICAgIGNh
c2UgSW50ZXJhY3RpdmU6CisgICAgICAgIEFTU0VSVChtX3Zpc3VhbFVwZGF0ZXNTdXBwcmVzc2lv
blRpbWVyLmlzQWN0aXZlKCkgfHwgbV92aXN1YWxVcGRhdGVzQWxsb3dlZCk7CisgICAgICAgIGJy
ZWFrOworICAgIGNhc2UgQ29tcGxldGU6CisgICAgICAgIGlmIChtX3Zpc3VhbFVwZGF0ZXNTdXBw
cmVzc2lvblRpbWVyLmlzQWN0aXZlKCkpIHsKKyAgICAgICAgICAgIEFTU0VSVCghbV92aXN1YWxV
cGRhdGVzQWxsb3dlZCk7CisgICAgICAgICAgICBtX3Zpc3VhbFVwZGF0ZXNTdXBwcmVzc2lvblRp
bWVyLnN0b3AoKTsKKyAgICAgICAgICAgIHNldFZpc3VhbFVwZGF0ZXNBbGxvd2VkKHRydWUpOwor
ICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIEFTU0VSVChtX3Zpc3VhbFVwZGF0ZXNBbGxvd2Vk
KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorICAgIAordm9pZCBEb2N1bWVudDo6c2V0Vmlz
dWFsVXBkYXRlc0FsbG93ZWQoYm9vbCB2aXN1YWxVcGRhdGVzQWxsb3dlZCkKK3sKKyAgICBpZiAo
bV92aXN1YWxVcGRhdGVzQWxsb3dlZCA9PSB2aXN1YWxVcGRhdGVzQWxsb3dlZCkKKyAgICAgICAg
cmV0dXJuOworCisgICAgbV92aXN1YWxVcGRhdGVzQWxsb3dlZCA9IHZpc3VhbFVwZGF0ZXNBbGxv
d2VkOworCisgICAgaWYgKCF2aXN1YWxVcGRhdGVzQWxsb3dlZCkKKyAgICAgICAgcmV0dXJuOwor
CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgIGlmICh2aWV3KCkpCisgICAg
ICAgIHZpZXcoKS0+dXBkYXRlQ29tcG9zaXRpbmdMYXllcnNBZnRlckxheW91dCgpOworI2VuZGlm
CisKKyAgICBpZiAocmVuZGVyZXIoKSkKKyAgICAgICAgcmVuZGVyZXIoKS0+cmVwYWludCgpOwor
fQorCit2b2lkIERvY3VtZW50Ojp2aXN1YWxVcGRhdGVzU3VwcHJlc3Npb25UaW1lckZpcmVkKFRp
bWVyPERvY3VtZW50PiopCit7CisgICAgQVNTRVJUKCFtX3Zpc3VhbFVwZGF0ZXNBbGxvd2VkKTsK
KyAgICBzZXRWaXN1YWxVcGRhdGVzQWxsb3dlZCh0cnVlKTsKK30KKworU3RyaW5nIERvY3VtZW50
OjplbmNvZGluZygpIGNvbnN0Cit7CisgICAgaWYgKFRleHRSZXNvdXJjZURlY29kZXIqIGQgPSBk
ZWNvZGVyKCkpCisgICAgICAgIHJldHVybiBkLT5lbmNvZGluZygpLmRvbU5hbWUoKTsKKyAgICBy
ZXR1cm4gU3RyaW5nKCk7Cit9CisKK1N0cmluZyBEb2N1bWVudDo6ZGVmYXVsdENoYXJzZXQoKSBj
b25zdAoreworICAgIGlmIChTZXR0aW5ncyogc2V0dGluZ3MgPSB0aGlzLT5zZXR0aW5ncygpKQor
ICAgICAgICByZXR1cm4gc2V0dGluZ3MtPmRlZmF1bHRUZXh0RW5jb2RpbmdOYW1lKCk7CisgICAg
cmV0dXJuIFN0cmluZygpOworfQorCit2b2lkIERvY3VtZW50OjpzZXRDaGFyc2V0KGNvbnN0IFN0
cmluZyYgY2hhcnNldCkKK3sKKyAgICBpZiAoIWRlY29kZXIoKSkKKyAgICAgICAgcmV0dXJuOwor
ICAgIGRlY29kZXIoKS0+c2V0RW5jb2RpbmcoY2hhcnNldCwgVGV4dFJlc291cmNlRGVjb2Rlcjo6
VXNlckNob3NlbkVuY29kaW5nKTsKK30KKwordm9pZCBEb2N1bWVudDo6c2V0Q29udGVudExhbmd1
YWdlKGNvbnN0IFN0cmluZyYgbGFuZ3VhZ2UpCit7CisgICAgaWYgKG1fY29udGVudExhbmd1YWdl
ID09IGxhbmd1YWdlKQorICAgICAgICByZXR1cm47CisgICAgbV9jb250ZW50TGFuZ3VhZ2UgPSBs
YW5ndWFnZTsKKworICAgIC8vIFJlY2FsY3VsYXRlIHN0eWxlIHNvIGxhbmd1YWdlIGlzIHVzZWQg
d2hlbiBzZWxlY3RpbmcgdGhlIGluaXRpYWwgZm9udC4KKyAgICBzdHlsZVJlc29sdmVyQ2hhbmdl
ZChEZWZlclJlY2FsY1N0eWxlKTsKK30KKwordm9pZCBEb2N1bWVudDo6c2V0WE1MVmVyc2lvbihj
b25zdCBTdHJpbmcmIHZlcnNpb24sIEV4Y2VwdGlvbkNvZGUmIGVjKQoreworICAgIGlmICghaW1w
bGVtZW50YXRpb24oKS0+aGFzRmVhdHVyZSgiWE1MIiwgU3RyaW5nKCkpKSB7CisgICAgICAgIGVj
ID0gTk9UX1NVUFBPUlRFRF9FUlI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAo
IVhNTERvY3VtZW50UGFyc2VyOjpzdXBwb3J0c1hNTFZlcnNpb24odmVyc2lvbikpIHsKKyAgICAg
ICAgZWMgPSBOT1RfU1VQUE9SVEVEX0VSUjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAg
IG1feG1sVmVyc2lvbiA9IHZlcnNpb247Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnNldFhNTFN0YW5k
YWxvbmUoYm9vbCBzdGFuZGFsb25lLCBFeGNlcHRpb25Db2RlJiBlYykKK3sKKyAgICBpZiAoIWlt
cGxlbWVudGF0aW9uKCktPmhhc0ZlYXR1cmUoIlhNTCIsIFN0cmluZygpKSkgeworICAgICAgICBl
YyA9IE5PVF9TVVBQT1JURURfRVJSOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbV94
bWxTdGFuZGFsb25lID0gc3RhbmRhbG9uZSA/IFN0YW5kYWxvbmUgOiBOb3RTdGFuZGFsb25lOwor
fQorCit2b2lkIERvY3VtZW50OjpzZXREb2N1bWVudFVSSShjb25zdCBTdHJpbmcmIHVyaSkKK3sK
KyAgICAvLyBUaGlzIHByb3BlcnR5IGlzIHJlYWQtb25seSBmcm9tIEphdmFTY3JpcHQsIGJ1dCB3
cml0YWJsZSBmcm9tIE9iamVjdGl2ZS1DLgorICAgIG1fZG9jdW1lbnRVUkkgPSB1cmk7CisgICAg
dXBkYXRlQmFzZVVSTCgpOworfQorCitLVVJMIERvY3VtZW50OjpiYXNlVVJJKCkgY29uc3QKK3sK
KyAgICByZXR1cm4gbV9iYXNlVVJMOworfQorCit2b2lkIERvY3VtZW50OjpzZXRDb250ZW50KGNv
bnN0IFN0cmluZyYgY29udGVudCkKK3sKKyAgICBvcGVuKCk7CisgICAgbV9wYXJzZXItPmFwcGVu
ZChjb250ZW50KTsKKyAgICBjbG9zZSgpOworfQorCitTdHJpbmcgRG9jdW1lbnQ6OnN1Z2dlc3Rl
ZE1JTUVUeXBlKCkgY29uc3QKK3sKKyAgICBpZiAobV9kb2N1bWVudC0+aXNYSFRNTERvY3VtZW50
KCkpCisgICAgICAgIHJldHVybiAiYXBwbGljYXRpb24veGh0bWwreG1sIjsKKyAgICBpZiAobV9k
b2N1bWVudC0+aXNTVkdEb2N1bWVudCgpKQorICAgICAgICByZXR1cm4gImltYWdlL3N2Zyt4bWwi
OworICAgIGlmIChtX2RvY3VtZW50LT54bWxTdGFuZGFsb25lKCkpCisgICAgICAgIHJldHVybiAi
dGV4dC94bWwiOworICAgIGlmIChtX2RvY3VtZW50LT5pc0hUTUxEb2N1bWVudCgpKQorICAgICAg
ICByZXR1cm4gInRleHQvaHRtbCI7CisKKyAgICBpZiAoRG9jdW1lbnRMb2FkZXIqIGRvY3VtZW50
TG9hZGVyID0gbG9hZGVyKCkpCisgICAgICAgIHJldHVybiBkb2N1bWVudExvYWRlci0+cmVzcG9u
c2VNSU1FVHlwZSgpOworICAgIHJldHVybiBTdHJpbmcoKTsKK30KKworLy8gRklYTUU6IFdlIG5l
ZWQgdG8gZGlzY3VzcyB0aGUgRE9NIEFQSSBoZXJlIGF0IHNvbWUgcG9pbnQuIElkZWFzOgorLy8g
KiBtYWtpbmcgaXQgcmVjZWl2ZSBhIHJlY3QgYXMgcGFyYW1ldGVyLCBpLmUuIG5vZGVzRnJvbVJl
Y3QoeCwgeSwgdywgaCk7CisvLyAqIG1ha2luZyBpdCByZWNlaXZlIHRoZSBleHBhZGluZyBzaXpl
IG9mIGVhY2ggZGlyZWN0aW9uIHNlcGFyYXRlbHksCisvLyAgIGkuZS4gbm9kZXNGcm9tUmVjdCh4
LCB5LCB0b3BTaXplLCByaWdodFNpemUsIGJvdHRvbVNpemUsIGxlZnRTaXplKTsKK1Bhc3NSZWZQ
dHI8Tm9kZUxpc3Q+IERvY3VtZW50Ojpub2Rlc0Zyb21SZWN0KGludCBjZW50ZXJYLCBpbnQgY2Vu
dGVyWSwgdW5zaWduZWQgdG9wUGFkZGluZywgdW5zaWduZWQgcmlnaHRQYWRkaW5nLCB1bnNpZ25l
ZCBib3R0b21QYWRkaW5nLCB1bnNpZ25lZCBsZWZ0UGFkZGluZywgYm9vbCBpZ25vcmVDbGlwcGlu
ZywgYm9vbCBhbGxvd1NoYWRvd0NvbnRlbnQpIGNvbnN0Cit7CisgICAgLy8gRklYTUU6IFNoYXJl
IGNvZGUgYmV0d2VlbiB0aGlzLCBlbGVtZW50RnJvbVBvaW50IGFuZCBjYXJldFJhbmdlRnJvbVBv
aW50LgorICAgIGlmICghcmVuZGVyZXIoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgRnJhbWUq
IGZyYW1lID0gdGhpcy0+ZnJhbWUoKTsKKyAgICBpZiAoIWZyYW1lKQorICAgICAgICByZXR1cm4g
MDsKKyAgICBGcmFtZVZpZXcqIGZyYW1lVmlldyA9IGZyYW1lLT52aWV3KCk7CisgICAgaWYgKCFm
cmFtZVZpZXcpCisgICAgICAgIHJldHVybiAwOworCisgICAgZmxvYXQgem9vbUZhY3RvciA9IGZy
YW1lLT5wYWdlWm9vbUZhY3RvcigpOworICAgIExheW91dFBvaW50IHBvaW50ID0gcm91bmRlZExh
eW91dFBvaW50KEZsb2F0UG9pbnQoY2VudGVyWCAqIHpvb21GYWN0b3IgKyB2aWV3KCktPnNjcm9s
bFgoKSwgY2VudGVyWSAqIHpvb21GYWN0b3IgKyB2aWV3KCktPnNjcm9sbFkoKSkpOworCisgICAg
aW50IHR5cGUgPSBIaXRUZXN0UmVxdWVzdDo6UmVhZE9ubHkgfCBIaXRUZXN0UmVxdWVzdDo6QWN0
aXZlOworCisgICAgLy8gV2hlbiBpZ25vcmVDbGlwcGluZyBpcyBmYWxzZSwgdGhpcyBtZXRob2Qg
cmV0dXJucyBudWxsIGZvciBjb29yZGluYXRlcyBvdXRzaWRlIG9mIHRoZSB2aWV3cG9ydC4KKyAg
ICBpZiAoaWdub3JlQ2xpcHBpbmcpCisgICAgICAgIHR5cGUgfD0gSGl0VGVzdFJlcXVlc3Q6Okln
bm9yZUNsaXBwaW5nOworICAgIGVsc2UgaWYgKCFmcmFtZVZpZXctPnZpc2libGVDb250ZW50UmVj
dCgpLmludGVyc2VjdHMoSGl0VGVzdFJlc3VsdDo6cmVjdEZvclBvaW50KHBvaW50LCB0b3BQYWRk
aW5nLCByaWdodFBhZGRpbmcsIGJvdHRvbVBhZGRpbmcsIGxlZnRQYWRkaW5nKSkpCisgICAgICAg
IHJldHVybiAwOworICAgIGlmIChhbGxvd1NoYWRvd0NvbnRlbnQpCisgICAgICAgIHR5cGUgfD0g
SGl0VGVzdFJlcXVlc3Q6OkFsbG93U2hhZG93Q29udGVudDsKKworICAgIEhpdFRlc3RSZXF1ZXN0
IHJlcXVlc3QodHlwZSk7CisKKyAgICAvLyBQYXNzaW5nIGEgemVybyBwYWRkaW5nIHdpbGwgdHJp
Z2dlciBhIHJlY3QgaGl0IHRlc3QsIGhvd2V2ZXIgZm9yIHRoZSBwdXJwb3NlcyBvZiBub2Rlc0Zy
b21SZWN0LAorICAgIC8vIHdlIHNwZWNpYWwgaGFuZGxlIHRoaXMgY2FzZSBpbiBvcmRlciB0byBy
ZXR1cm4gYSB2YWxpZCBOb2RlTGlzdC4KKyAgICBpZiAoIXRvcFBhZGRpbmcgJiYgIXJpZ2h0UGFk
ZGluZyAmJiAhYm90dG9tUGFkZGluZyAmJiAhbGVmdFBhZGRpbmcpIHsKKyAgICAgICAgSGl0VGVz
dFJlc3VsdCByZXN1bHQocG9pbnQpOworICAgICAgICByZXR1cm4gaGFuZGxlWmVyb1BhZGRpbmco
cmVxdWVzdCwgcmVzdWx0KTsKKyAgICB9CisKKyAgICBIaXRUZXN0UmVzdWx0IHJlc3VsdChwb2lu
dCwgdG9wUGFkZGluZywgcmlnaHRQYWRkaW5nLCBib3R0b21QYWRkaW5nLCBsZWZ0UGFkZGluZyk7
CisgICAgcmVuZGVyVmlldygpLT5oaXRUZXN0KHJlcXVlc3QsIHJlc3VsdCk7CisKKyAgICByZXR1
cm4gU3RhdGljSGFzaFNldE5vZGVMaXN0OjphZG9wdChyZXN1bHQucmVjdEJhc2VkVGVzdFJlc3Vs
dCgpKTsKK30KKworUGFzc1JlZlB0cjxOb2RlTGlzdD4gRG9jdW1lbnQ6OmhhbmRsZVplcm9QYWRk
aW5nKGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiByZXF1ZXN0LCBIaXRUZXN0UmVzdWx0JiByZXN1bHQp
IGNvbnN0Cit7CisgICAgcmVuZGVyVmlldygpLT5oaXRUZXN0KHJlcXVlc3QsIHJlc3VsdCk7CisK
KyAgICBOb2RlKiBub2RlID0gcmVzdWx0LmlubmVyTm9kZSgpOworICAgIGlmICghbm9kZSkKKyAg
ICAgICAgcmV0dXJuIDA7CisKKyAgICBub2RlID0gbm9kZS0+c2hhZG93QW5jZXN0b3JOb2RlKCk7
CisgICAgTGlzdEhhc2hTZXQ8UmVmUHRyPE5vZGU+ID4gbGlzdDsKKyAgICBsaXN0LmFkZChub2Rl
KTsKKyAgICByZXR1cm4gU3RhdGljSGFzaFNldE5vZGVMaXN0OjphZG9wdChsaXN0KTsKK30KKwor
c3RhdGljIE5vZGUqIG5vZGVGcm9tUG9pbnQoRnJhbWUqIGZyYW1lLCBSZW5kZXJWaWV3KiByZW5k
ZXJWaWV3LCBpbnQgeCwgaW50IHksIExheW91dFBvaW50KiBsb2NhbFBvaW50ID0gMCkKK3sKKyAg
ICBpZiAoIWZyYW1lKQorICAgICAgICByZXR1cm4gMDsKKyAgICBGcmFtZVZpZXcqIGZyYW1lVmll
dyA9IGZyYW1lLT52aWV3KCk7CisgICAgaWYgKCFmcmFtZVZpZXcpCisgICAgICAgIHJldHVybiAw
OworCisgICAgZmxvYXQgem9vbUZhY3RvciA9IGZyYW1lLT5wYWdlWm9vbUZhY3RvcigpOworICAg
IEludFBvaW50IHBvaW50ID0gcm91bmRlZEludFBvaW50KEZsb2F0UG9pbnQoeCAqIHpvb21GYWN0
b3IgICsgZnJhbWVWaWV3LT5zY3JvbGxYKCksIHkgKiB6b29tRmFjdG9yICsgZnJhbWVWaWV3LT5z
Y3JvbGxZKCkpKTsKKworICAgIGlmICghZnJhbWVWaWV3LT52aXNpYmxlQ29udGVudFJlY3QoKS5j
b250YWlucyhwb2ludCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgSGl0VGVzdFJlcXVlc3Qg
cmVxdWVzdChIaXRUZXN0UmVxdWVzdDo6UmVhZE9ubHkgfCBIaXRUZXN0UmVxdWVzdDo6QWN0aXZl
KTsKKyAgICBIaXRUZXN0UmVzdWx0IHJlc3VsdChwb2ludCk7CisgICAgcmVuZGVyVmlldy0+aGl0
VGVzdChyZXF1ZXN0LCByZXN1bHQpOworCisgICAgaWYgKGxvY2FsUG9pbnQpCisgICAgICAgICps
b2NhbFBvaW50ID0gcmVzdWx0LmxvY2FsUG9pbnQoKTsKKworICAgIHJldHVybiByZXN1bHQuaW5u
ZXJOb2RlKCk7Cit9CisKK0VsZW1lbnQqIERvY3VtZW50OjplbGVtZW50RnJvbVBvaW50KGludCB4
LCBpbnQgeSkgY29uc3QKK3sKKyAgICBpZiAoIXJlbmRlcmVyKCkpCisgICAgICAgIHJldHVybiAw
OworICAgIE5vZGUqIG5vZGUgPSBub2RlRnJvbVBvaW50KGZyYW1lKCksIHJlbmRlclZpZXcoKSwg
eCwgeSk7CisgICAgd2hpbGUgKG5vZGUgJiYgIW5vZGUtPmlzRWxlbWVudE5vZGUoKSkKKyAgICAg
ICAgbm9kZSA9IG5vZGUtPnBhcmVudE5vZGUoKTsKKyAgICBpZiAobm9kZSkKKyAgICAgICAgbm9k
ZSA9IGFuY2VzdG9ySW5UaGlzU2NvcGUobm9kZSk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEVs
ZW1lbnQqPihub2RlKTsKK30KKworUGFzc1JlZlB0cjxSYW5nZT4gRG9jdW1lbnQ6OmNhcmV0UmFu
Z2VGcm9tUG9pbnQoaW50IHgsIGludCB5KQoreworICAgIGlmICghcmVuZGVyZXIoKSkKKyAgICAg
ICAgcmV0dXJuIDA7CisgICAgTGF5b3V0UG9pbnQgbG9jYWxQb2ludDsKKyAgICBOb2RlKiBub2Rl
ID0gbm9kZUZyb21Qb2ludChmcmFtZSgpLCByZW5kZXJWaWV3KCksIHgsIHksICZsb2NhbFBvaW50
KTsKKyAgICBpZiAoIW5vZGUpCisgICAgICAgIHJldHVybiAwOworCisgICAgTm9kZSogc2hhZG93
QW5jZXN0b3JOb2RlID0gYW5jZXN0b3JJblRoaXNTY29wZShub2RlKTsKKyAgICBpZiAoc2hhZG93
QW5jZXN0b3JOb2RlICE9IG5vZGUpIHsKKyAgICAgICAgdW5zaWduZWQgb2Zmc2V0ID0gc2hhZG93
QW5jZXN0b3JOb2RlLT5ub2RlSW5kZXgoKTsKKyAgICAgICAgQ29udGFpbmVyTm9kZSogY29udGFp
bmVyID0gc2hhZG93QW5jZXN0b3JOb2RlLT5wYXJlbnROb2RlKCk7CisgICAgICAgIHJldHVybiBS
YW5nZTo6Y3JlYXRlKHRoaXMsIGNvbnRhaW5lciwgb2Zmc2V0LCBjb250YWluZXIsIG9mZnNldCk7
CisgICAgfQorCisgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IG5vZGUtPnJlbmRlcmVyKCk7
CisgICAgaWYgKCFyZW5kZXJlcikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgVmlzaWJsZVBvc2l0
aW9uIHZpc2libGVQb3NpdGlvbiA9IHJlbmRlcmVyLT5wb3NpdGlvbkZvclBvaW50KGxvY2FsUG9p
bnQpOworICAgIGlmICh2aXNpYmxlUG9zaXRpb24uaXNOdWxsKCkpCisgICAgICAgIHJldHVybiAw
OworCisgICAgUG9zaXRpb24gcmFuZ2VDb21wbGlhbnRQb3NpdGlvbiA9IHZpc2libGVQb3NpdGlv
bi5kZWVwRXF1aXZhbGVudCgpLnBhcmVudEFuY2hvcmVkRXF1aXZhbGVudCgpOworICAgIHJldHVy
biBSYW5nZTo6Y3JlYXRlKHRoaXMsIHJhbmdlQ29tcGxpYW50UG9zaXRpb24sIHJhbmdlQ29tcGxp
YW50UG9zaXRpb24pOworfQorCisvKgorICogUGVyZm9ybXMgdGhyZWUgb3BlcmF0aW9uczoKKyAq
ICAxLiBDb252ZXJ0IGNvbnRyb2wgY2hhcmFjdGVycyB0byBzcGFjZXMKKyAqICAyLiBUcmltIGxl
YWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlcworICogIDMuIENvbGxhcHNlIGludGVybmFsIHdoaXRl
c3BhY2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgU3RyaW5nV2l0aERpcmVjdGlvbiBjYW5vbmljYWxp
emVkVGl0bGUoRG9jdW1lbnQqIGRvY3VtZW50LCBjb25zdCBTdHJpbmdXaXRoRGlyZWN0aW9uJiB0
aXRsZVdpdGhEaXJlY3Rpb24pCit7CisgICAgY29uc3QgU3RyaW5nJiB0aXRsZSA9IHRpdGxlV2l0
aERpcmVjdGlvbi5zdHJpbmcoKTsKKyAgICBjb25zdCBVQ2hhciogY2hhcmFjdGVycyA9IHRpdGxl
LmNoYXJhY3RlcnMoKTsKKyAgICB1bnNpZ25lZCBsZW5ndGggPSB0aXRsZS5sZW5ndGgoKTsKKyAg
ICB1bnNpZ25lZCBpOworCisgICAgU3RyaW5nQnVmZmVyPFVDaGFyPiBidWZmZXIobGVuZ3RoKTsK
KyAgICB1bnNpZ25lZCBidWlsZGVySW5kZXggPSAwOworCisgICAgLy8gU2tpcCBsZWFkaW5nIHNw
YWNlcyBhbmQgbGVhZGluZyBjaGFyYWN0ZXJzIHRoYXQgd291bGQgY29udmVydCB0byBzcGFjZXMK
KyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgVUNoYXIgYyA9IGNo
YXJhY3RlcnNbaV07CisgICAgICAgIGlmICghKGMgPD0gMHgyMCB8fCBjID09IDB4N0YpKQorICAg
ICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGkgPT0gbGVuZ3RoKQorICAgICAgICBy
ZXR1cm4gU3RyaW5nV2l0aERpcmVjdGlvbigpOworCisgICAgLy8gUmVwbGFjZSBjb250cm9sIGNo
YXJhY3RlcnMgd2l0aCBzcGFjZXMsIGFuZCBiYWNrc2xhc2hlcyB3aXRoIGN1cnJlbmN5IHN5bWJv
bHMsIGFuZCBjb2xsYXBzZSB3aGl0ZXNwYWNlLgorICAgIGJvb2wgcHJldmlvdXNDaGFyV2FzV1Mg
PSBmYWxzZTsKKyAgICBmb3IgKDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgICAgIFVDaGFyIGMg
PSBjaGFyYWN0ZXJzW2ldOworICAgICAgICBpZiAoYyA8PSAweDIwIHx8IGMgPT0gMHg3RiB8fCAo
V1RGOjpVbmljb2RlOjpjYXRlZ29yeShjKSAmIChXVEY6OlVuaWNvZGU6OlNlcGFyYXRvcl9MaW5l
IHwgV1RGOjpVbmljb2RlOjpTZXBhcmF0b3JfUGFyYWdyYXBoKSkpIHsKKyAgICAgICAgICAgIGlm
IChwcmV2aW91c0NoYXJXYXNXUykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
ICAgIGJ1ZmZlcltidWlsZGVySW5kZXgrK10gPSAnICc7CisgICAgICAgICAgICBwcmV2aW91c0No
YXJXYXNXUyA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidWZmZXJbYnVp
bGRlckluZGV4KytdID0gYzsKKyAgICAgICAgICAgIHByZXZpb3VzQ2hhcldhc1dTID0gZmFsc2U7
CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTdHJpcCB0cmFpbGluZyBzcGFjZXMKKyAgICB3
aGlsZSAoYnVpbGRlckluZGV4ID4gMCkgeworICAgICAgICAtLWJ1aWxkZXJJbmRleDsKKyAgICAg
ICAgaWYgKGJ1ZmZlcltidWlsZGVySW5kZXhdICE9ICcgJykKKyAgICAgICAgICAgIGJyZWFrOwor
ICAgIH0KKworICAgIGlmICghYnVpbGRlckluZGV4ICYmIGJ1ZmZlcltidWlsZGVySW5kZXhdID09
ICcgJykKKyAgICAgICAgcmV0dXJuIFN0cmluZ1dpdGhEaXJlY3Rpb24oKTsKKworICAgIGJ1ZmZl
ci5zaHJpbmsoYnVpbGRlckluZGV4ICsgMSk7CisKKyAgICAvLyBSZXBsYWNlIHRoZSBiYWNrc2xh
c2hlcyB3aXRoIGN1cnJlbmN5IHN5bWJvbHMgaWYgdGhlIGVuY29kaW5nIHJlcXVpcmVzIGl0Lgor
ICAgIGRvY3VtZW50LT5kaXNwbGF5QnVmZmVyTW9kaWZpZWRCeUVuY29kaW5nKGJ1ZmZlci5jaGFy
YWN0ZXJzKCksIGJ1ZmZlci5sZW5ndGgoKSk7CisgICAgCisgICAgcmV0dXJuIFN0cmluZ1dpdGhE
aXJlY3Rpb24oU3RyaW5nOjphZG9wdChidWZmZXIpLCB0aXRsZVdpdGhEaXJlY3Rpb24uZGlyZWN0
aW9uKCkpOworfQorCit2b2lkIERvY3VtZW50Ojp1cGRhdGVUaXRsZShjb25zdCBTdHJpbmdXaXRo
RGlyZWN0aW9uJiB0aXRsZSkKK3sKKyAgICBpZiAobV9yYXdUaXRsZSA9PSB0aXRsZSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgbV9yYXdUaXRsZSA9IHRpdGxlOworICAgIG1fdGl0bGUgPSBjYW5v
bmljYWxpemVkVGl0bGUodGhpcywgbV9yYXdUaXRsZSk7CisgICAgaWYgKEZyYW1lKiBmID0gZnJh
bWUoKSkKKyAgICAgICAgZi0+bG9hZGVyKCktPnNldFRpdGxlKG1fdGl0bGUpOworfQorCit2b2lk
IERvY3VtZW50OjpzZXRUaXRsZShjb25zdCBTdHJpbmcmIHRpdGxlKQoreworICAgIC8vIFRpdGxl
IHNldCBieSBKYXZhU2NyaXB0IC0tIG92ZXJyaWRlcyBhbnkgdGl0bGUgZWxlbWVudHMuCisgICAg
bV90aXRsZVNldEV4cGxpY2l0bHkgPSB0cnVlOworICAgIGlmICghaXNIVE1MRG9jdW1lbnQoKSAm
JiAhaXNYSFRNTERvY3VtZW50KCkpCisgICAgICAgIG1fdGl0bGVFbGVtZW50ID0gMDsKKyAgICBl
bHNlIGlmICghbV90aXRsZUVsZW1lbnQpIHsKKyAgICAgICAgaWYgKEhUTUxFbGVtZW50KiBoZWFk
RWxlbWVudCA9IGhlYWQoKSkgeworICAgICAgICAgICAgbV90aXRsZUVsZW1lbnQgPSBjcmVhdGVF
bGVtZW50KHRpdGxlVGFnLCBmYWxzZSk7CisgICAgICAgICAgICBFeGNlcHRpb25Db2RlIGVjID0g
MDsKKyAgICAgICAgICAgIGhlYWRFbGVtZW50LT5hcHBlbmRDaGlsZChtX3RpdGxlRWxlbWVudCwg
ZWMpOworICAgICAgICAgICAgQVNTRVJUKCFlYyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAv
LyBUaGUgRE9NIEFQSSBoYXMgbm8gbWV0aG9kIG9mIHNwZWNpZnlpbmcgZGlyZWN0aW9uLCBzbyBh
c3N1bWUgTFRSLgorICAgIHVwZGF0ZVRpdGxlKFN0cmluZ1dpdGhEaXJlY3Rpb24odGl0bGUsIExU
UikpOworCisgICAgaWYgKG1fdGl0bGVFbGVtZW50KSB7CisgICAgICAgIEFTU0VSVChtX3RpdGxl
RWxlbWVudC0+aGFzVGFnTmFtZSh0aXRsZVRhZykpOworICAgICAgICBpZiAobV90aXRsZUVsZW1l
bnQtPmhhc1RhZ05hbWUodGl0bGVUYWcpKQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTFRp
dGxlRWxlbWVudCo+KG1fdGl0bGVFbGVtZW50LmdldCgpKS0+c2V0VGV4dCh0aXRsZSk7CisgICAg
fQorfQorCit2b2lkIERvY3VtZW50OjpzZXRUaXRsZUVsZW1lbnQoY29uc3QgU3RyaW5nV2l0aERp
cmVjdGlvbiYgdGl0bGUsIEVsZW1lbnQqIHRpdGxlRWxlbWVudCkKK3sKKyAgICBpZiAodGl0bGVF
bGVtZW50ICE9IG1fdGl0bGVFbGVtZW50KSB7CisgICAgICAgIGlmIChtX3RpdGxlRWxlbWVudCB8
fCBtX3RpdGxlU2V0RXhwbGljaXRseSkKKyAgICAgICAgICAgIC8vIE9ubHkgYWxsb3cgdGhlIGZp
cnN0IHRpdGxlIGVsZW1lbnQgdG8gY2hhbmdlIHRoZSB0aXRsZSAtLSBvdGhlcnMgaGF2ZSBubyBl
ZmZlY3QuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIG1fdGl0bGVFbGVtZW50ID0gdGl0
bGVFbGVtZW50OworICAgIH0KKworICAgIHVwZGF0ZVRpdGxlKHRpdGxlKTsKK30KKwordm9pZCBE
b2N1bWVudDo6cmVtb3ZlVGl0bGUoRWxlbWVudCogdGl0bGVFbGVtZW50KQoreworICAgIGlmICht
X3RpdGxlRWxlbWVudCAhPSB0aXRsZUVsZW1lbnQpCisgICAgICAgIHJldHVybjsKKworICAgIG1f
dGl0bGVFbGVtZW50ID0gMDsKKyAgICBtX3RpdGxlU2V0RXhwbGljaXRseSA9IGZhbHNlOworCisg
ICAgLy8gVXBkYXRlIHRpdGxlIGJhc2VkIG9uIGZpcnN0IHRpdGxlIGVsZW1lbnQgaW4gdGhlIGhl
YWQsIGlmIG9uZSBleGlzdHMuCisgICAgaWYgKEhUTUxFbGVtZW50KiBoZWFkRWxlbWVudCA9IGhl
YWQoKSkgeworICAgICAgICBmb3IgKE5vZGUqIGUgPSBoZWFkRWxlbWVudC0+Zmlyc3RDaGlsZCgp
OyBlOyBlID0gZS0+bmV4dFNpYmxpbmcoKSkKKyAgICAgICAgICAgIGlmIChlLT5oYXNUYWdOYW1l
KHRpdGxlVGFnKSkgeworICAgICAgICAgICAgICAgIEhUTUxUaXRsZUVsZW1lbnQqIHRpdGxlRWxl
bWVudCA9IHN0YXRpY19jYXN0PEhUTUxUaXRsZUVsZW1lbnQqPihlKTsKKyAgICAgICAgICAgICAg
ICBzZXRUaXRsZUVsZW1lbnQodGl0bGVFbGVtZW50LT50ZXh0V2l0aERpcmVjdGlvbigpLCB0aXRs
ZUVsZW1lbnQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgIH0K
KworICAgIGlmICghbV90aXRsZUVsZW1lbnQpCisgICAgICAgIHVwZGF0ZVRpdGxlKFN0cmluZ1dp
dGhEaXJlY3Rpb24oKSk7Cit9CisKKyNpZiBFTkFCTEUoUEFHRV9WSVNJQklMSVRZX0FQSSkKK1Bh
Z2VWaXNpYmlsaXR5U3RhdGUgRG9jdW1lbnQ6OnZpc2liaWxpdHlTdGF0ZSgpIGNvbnN0Cit7Cisg
ICAgLy8gVGhlIHZpc2liaWxpdHkgb2YgdGhlIGRvY3VtZW50IGlzIGluaGVyaXRlZCBmcm9tIHRo
ZSB2aXNpYmlsaXR5IG9mIHRoZQorICAgIC8vIHBhZ2UuIElmIHRoZXJlIGlzIG5vIHBhZ2UgYXNz
b2NpYXRlZCB3aXRoIHRoZSBkb2N1bWVudCwgd2Ugd2lsbCBhc3N1bWUKKyAgICAvLyB0aGF0IHRo
ZSBwYWdlIGlzIHZpc2libGUgaS5lLiBpbnZpc2liaWxpdHkgaGFzIHRvIGJlIGV4cGxpY2l0bHkK
KyAgICAvLyBzcGVjaWZpZWQgYnkgdGhlIGVtYmVkZGVyLgorICAgIGlmICghbV9mcmFtZSB8fCAh
bV9mcmFtZS0+cGFnZSgpKQorICAgICAgICByZXR1cm4gUGFnZVZpc2liaWxpdHlTdGF0ZVZpc2li
bGU7CisgICAgcmV0dXJuIG1fZnJhbWUtPnBhZ2UoKS0+dmlzaWJpbGl0eVN0YXRlKCk7Cit9CisK
K1N0cmluZyBEb2N1bWVudDo6d2Via2l0VmlzaWJpbGl0eVN0YXRlKCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gcGFnZVZpc2liaWxpdHlTdGF0ZVN0cmluZyh2aXNpYmlsaXR5U3RhdGUoKSk7Cit9CisK
K2Jvb2wgRG9jdW1lbnQ6OndlYmtpdEhpZGRlbigpIGNvbnN0Cit7CisgICAgcmV0dXJuIHZpc2li
aWxpdHlTdGF0ZSgpICE9IFBhZ2VWaXNpYmlsaXR5U3RhdGVWaXNpYmxlOworfQorCit2b2lkIERv
Y3VtZW50OjpkaXNwYXRjaFZpc2liaWxpdHlTdGF0ZUNoYW5nZUV2ZW50KCkKK3sKKyAgICBkaXNw
YXRjaEV2ZW50KEV2ZW50OjpjcmVhdGUoZXZlbnROYW1lcygpLndlYmtpdHZpc2liaWxpdHljaGFu
Z2VFdmVudCwgZmFsc2UsIGZhbHNlKSk7Cit9CisjZW5kaWYKKworI2lmIEVOQUJMRShDU1BfTkVY
VCkKK0RPTVNlY3VyaXR5UG9saWN5KiBEb2N1bWVudDo6c2VjdXJpdHlQb2xpY3koKQoreworICAg
IGlmICghbV9kb21TZWN1cml0eVBvbGljeSkKKyAgICAgICAgbV9kb21TZWN1cml0eVBvbGljeSA9
IERPTVNlY3VyaXR5UG9saWN5OjpjcmVhdGUodGhpcyk7CisgICAgcmV0dXJuIG1fZG9tU2VjdXJp
dHlQb2xpY3kuZ2V0KCk7Cit9CisjZW5kaWYKKworU3RyaW5nIERvY3VtZW50Ojpub2RlTmFtZSgp
IGNvbnN0Cit7CisgICAgcmV0dXJuICIjZG9jdW1lbnQiOworfQorCitOb2RlOjpOb2RlVHlwZSBE
b2N1bWVudDo6bm9kZVR5cGUoKSBjb25zdAoreworICAgIHJldHVybiBET0NVTUVOVF9OT0RFOwor
fQorCitGb3JtQ29udHJvbGxlciogRG9jdW1lbnQ6OmZvcm1Db250cm9sbGVyKCkKK3sKKyAgICBp
ZiAoIW1fZm9ybUNvbnRyb2xsZXIpCisgICAgICAgIG1fZm9ybUNvbnRyb2xsZXIgPSBGb3JtQ29u
dHJvbGxlcjo6Y3JlYXRlKCk7CisgICAgcmV0dXJuIG1fZm9ybUNvbnRyb2xsZXIuZ2V0KCk7Cit9
CisKK1ZlY3RvcjxTdHJpbmc+IERvY3VtZW50Ojpmb3JtRWxlbWVudHNTdGF0ZSgpIGNvbnN0Cit7
CisgICAgaWYgKCFtX2Zvcm1Db250cm9sbGVyKQorICAgICAgICByZXR1cm4gVmVjdG9yPFN0cmlu
Zz4oKTsKKyAgICByZXR1cm4gbV9mb3JtQ29udHJvbGxlci0+Zm9ybUVsZW1lbnRzU3RhdGUoKTsK
K30KKwordm9pZCBEb2N1bWVudDo6c2V0U3RhdGVGb3JOZXdGb3JtRWxlbWVudHMoY29uc3QgVmVj
dG9yPFN0cmluZz4mIHN0YXRlVmVjdG9yKQoreworICAgIGlmICghc3RhdGVWZWN0b3Iuc2l6ZSgp
ICYmICFtX2Zvcm1Db250cm9sbGVyKQorICAgICAgICByZXR1cm47CisgICAgZm9ybUNvbnRyb2xs
ZXIoKS0+c2V0U3RhdGVGb3JOZXdGb3JtRWxlbWVudHMoc3RhdGVWZWN0b3IpOworfQorCitGcmFt
ZVZpZXcqIERvY3VtZW50Ojp2aWV3KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9mcmFtZSA/IG1f
ZnJhbWUtPnZpZXcoKSA6IDA7Cit9CisKK1BhZ2UqIERvY3VtZW50OjpwYWdlKCkgY29uc3QKK3sK
KyAgICByZXR1cm4gbV9mcmFtZSA/IG1fZnJhbWUtPnBhZ2UoKSA6IDA7ICAgIAorfQorCitTZXR0
aW5ncyogRG9jdW1lbnQ6OnNldHRpbmdzKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9mcmFtZSA/
IG1fZnJhbWUtPnNldHRpbmdzKCkgOiAwOworfQorCitQYXNzUmVmUHRyPFJhbmdlPiBEb2N1bWVu
dDo6Y3JlYXRlUmFuZ2UoKQoreworICAgIHJldHVybiBSYW5nZTo6Y3JlYXRlKHRoaXMpOworfQor
CitQYXNzUmVmUHRyPE5vZGVJdGVyYXRvcj4gRG9jdW1lbnQ6OmNyZWF0ZU5vZGVJdGVyYXRvcihO
b2RlKiByb290LCB1bnNpZ25lZCB3aGF0VG9TaG93LCAKKyAgICBQYXNzUmVmUHRyPE5vZGVGaWx0
ZXI+IGZpbHRlciwgYm9vbCBleHBhbmRFbnRpdHlSZWZlcmVuY2VzLCBFeGNlcHRpb25Db2RlJiBl
YykKK3sKKyAgICBpZiAoIXJvb3QpIHsKKyAgICAgICAgZWMgPSBOT1RfU1VQUE9SVEVEX0VSUjsK
KyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBOb2RlSXRlcmF0b3I6OmNyZWF0
ZShyb290LCB3aGF0VG9TaG93LCBmaWx0ZXIsIGV4cGFuZEVudGl0eVJlZmVyZW5jZXMpOworfQor
CitQYXNzUmVmUHRyPFRyZWVXYWxrZXI+IERvY3VtZW50OjpjcmVhdGVUcmVlV2Fsa2VyKE5vZGUq
IHJvb3QsIHVuc2lnbmVkIHdoYXRUb1Nob3csIAorICAgIFBhc3NSZWZQdHI8Tm9kZUZpbHRlcj4g
ZmlsdGVyLCBib29sIGV4cGFuZEVudGl0eVJlZmVyZW5jZXMsIEV4Y2VwdGlvbkNvZGUmIGVjKQor
eworICAgIGlmICghcm9vdCkgeworICAgICAgICBlYyA9IE5PVF9TVVBQT1JURURfRVJSOworICAg
ICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIFRyZWVXYWxrZXI6OmNyZWF0ZShyb290
LCB3aGF0VG9TaG93LCBmaWx0ZXIsIGV4cGFuZEVudGl0eVJlZmVyZW5jZXMpOworfQorCit2b2lk
IERvY3VtZW50OjpzY2hlZHVsZUZvcmNlZFN0eWxlUmVjYWxjKCkKK3sKKyAgICBtX3BlbmRpbmdT
dHlsZVJlY2FsY1Nob3VsZEZvcmNlID0gdHJ1ZTsKKyAgICBzY2hlZHVsZVN0eWxlUmVjYWxjKCk7
Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnNjaGVkdWxlU3R5bGVSZWNhbGMoKQoreworICAgIGlmIChz
aG91bGREaXNwbGF5U2VhbWxlc3NseVdpdGhQYXJlbnQoKSkgeworICAgICAgICAvLyBXaGVuIHdl
J3JlIHNlYW1sZXNzLCBvdXIgcGFyZW50IGRvY3VtZW50IG1hbmFnZXMgb3VyIHN0eWxlIHJlY2Fs
Y3MuCisgICAgICAgIG93bmVyRWxlbWVudCgpLT5zZXROZWVkc1N0eWxlUmVjYWxjKCk7CisgICAg
ICAgIG93bmVyRWxlbWVudCgpLT5kb2N1bWVudCgpLT5zY2hlZHVsZVN0eWxlUmVjYWxjKCk7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobV9zdHlsZVJlY2FsY1RpbWVyLmlzQWN0
aXZlKCkgfHwgaW5QYWdlQ2FjaGUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgQVNTRVJUKGNo
aWxkTmVlZHNTdHlsZVJlY2FsYygpIHx8IG1fcGVuZGluZ1N0eWxlUmVjYWxjU2hvdWxkRm9yY2Up
OworCisgICAgaWYgKCFkb2N1bWVudHNUaGF0TmVlZFN0eWxlUmVjYWxjKQorICAgICAgICBkb2N1
bWVudHNUaGF0TmVlZFN0eWxlUmVjYWxjID0gbmV3IEhhc2hTZXQ8RG9jdW1lbnQqPjsKKyAgICBk
b2N1bWVudHNUaGF0TmVlZFN0eWxlUmVjYWxjLT5hZGQodGhpcyk7CisgICAgCisgICAgLy8gRklY
TUU6IFdoeSBvbiBlYXJ0aCBpcyB0aGlzIGhlcmU/IFRoaXMgaXMgY2xlYXJseSBtaXNwbGFjZWQu
CisgICAgaW52YWxpZGF0ZUFjY2Vzc0tleU1hcCgpOworICAgIAorICAgIG1fc3R5bGVSZWNhbGNU
aW1lci5zdGFydE9uZVNob3QoMCk7CisKKyAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRp
ZFNjaGVkdWxlU3R5bGVSZWNhbGN1bGF0aW9uKHRoaXMpOworfQorCit2b2lkIERvY3VtZW50Ojp1
bnNjaGVkdWxlU3R5bGVSZWNhbGMoKQoreworICAgIEFTU0VSVCghY2hpbGROZWVkc1N0eWxlUmVj
YWxjKCkpOworCisgICAgaWYgKGRvY3VtZW50c1RoYXROZWVkU3R5bGVSZWNhbGMpCisgICAgICAg
IGRvY3VtZW50c1RoYXROZWVkU3R5bGVSZWNhbGMtPnJlbW92ZSh0aGlzKTsKKworICAgIG1fc3R5
bGVSZWNhbGNUaW1lci5zdG9wKCk7CisgICAgbV9wZW5kaW5nU3R5bGVSZWNhbGNTaG91bGRGb3Jj
ZSA9IGZhbHNlOworfQorCitib29sIERvY3VtZW50Ojppc1BlbmRpbmdTdHlsZVJlY2FsYygpIGNv
bnN0Cit7CisgICAgcmV0dXJuIG1fc3R5bGVSZWNhbGNUaW1lci5pc0FjdGl2ZSgpICYmICFtX2lu
U3R5bGVSZWNhbGM7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnN0eWxlUmVjYWxjVGltZXJGaXJlZChU
aW1lcjxEb2N1bWVudD4qKQoreworICAgIHVwZGF0ZVN0eWxlSWZOZWVkZWQoKTsKK30KKworYm9v
bCBEb2N1bWVudDo6Y2hpbGROZWVkc0FuZE5vdEluU3R5bGVSZWNhbGMoKQoreworICAgIHJldHVy
biBjaGlsZE5lZWRzU3R5bGVSZWNhbGMoKSAmJiAhbV9pblN0eWxlUmVjYWxjOworfQorCit2b2lk
IERvY3VtZW50OjpyZWNhbGNTdHlsZShTdHlsZUNoYW5nZSBjaGFuZ2UpCit7CisgICAgLy8gd2Ug
c2hvdWxkIG5vdCBlbnRlciBzdHlsZSByZWNhbGMgd2hpbGUgcGFpbnRpbmcKKyAgICBBU1NFUlQo
IXZpZXcoKSB8fCAhdmlldygpLT5pc1BhaW50aW5nKCkpOworICAgIGlmICh2aWV3KCkgJiYgdmll
dygpLT5pc1BhaW50aW5nKCkpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICBpZiAobV9pblN0
eWxlUmVjYWxjKQorICAgICAgICByZXR1cm47IC8vIEd1YXJkIGFnYWluc3QgcmUtZW50cmFuY3ku
IC1kd2gKKworICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgdXBkYXRlIHN0eWxlIG9uIG91ciBhbmNl
c3RvciBjaGFpbiBiZWZvcmUgcHJvY2VlZGluZyAoZXNwZWNpYWxseSBmb3Igc2VhbWxlc3MpLAor
ICAgIC8vIGhvd2V2ZXIgZG9pbmcgc28gY3VycmVudGx5IGNhdXNlcyBzZXZlcmFsIHRlc3RzIHRv
IGNyYXNoLCBhcyBGcmFtZTo6c2V0RG9jdW1lbnQgY2FsbHMgRG9jdW1lbnQ6OmF0dGFjaAorICAg
IC8vIGJlZm9yZSBzZXR0aW5nIHRoZSBET01XaW5kb3cgb24gdGhlIEZyYW1lLCBvciB0aGUgU2Vj
dXJpdHlPcmlnaW4gb24gdGhlIGRvY3VtZW50LiBUaGUgYXR0YWNoLCBpbiB0dXJuCisgICAgLy8g
cmVzb2x2ZXMgc3R5bGUgKGhlcmUpIGFuZCB0aGVuIHdoZW4gd2UgcmVzb2x2ZSBzdHlsZSBvbiB0
aGUgcGFyZW50IGNoYWluLCB3ZSBtYXkgZW5kIHVwCisgICAgLy8gcmUtYXR0YWNoaW5nIG91ciBj
b250YWluaW5nIGlmcmFtZSwgd2hpY2ggd2hlbiBhc2tlZCBIVE1MRnJhbWVFbGVtZW50QmFzZTo6
aXNVUkxBbGxvd2VkCisgICAgLy8gaGl0cyBhIG51bGwtZGVyZWZlcmVuY2UgZHVlIHRvIHNlY3Vy
aXR5IGNvZGUgYWx3YXlzIGFzc3VtaW5nIHRoZSBkb2N1bWVudCBoYXMgYSBTZWN1cml0eU9yaWdp
bi4KKworICAgIGlmIChtX2hhc0RpcnR5U3R5bGVSZXNvbHZlcikKKyAgICAgICAgdXBkYXRlQWN0
aXZlU3R5bGVzaGVldHMoUmVjYWxjU3R5bGVJbW1lZGlhdGVseSk7CisKKyAgICBJbnNwZWN0b3JJ
bnN0cnVtZW50YXRpb25Db29raWUgY29va2llID0gSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjp3
aWxsUmVjYWxjdWxhdGVTdHlsZSh0aGlzKTsKKworICAgIGlmIChtX2VsZW1TaGVldCAmJiBtX2Vs
ZW1TaGVldC0+Y29udGVudHMoKS0+dXNlc1JlbVVuaXRzKCkpCisgICAgICAgIG1fdXNlc1JlbVVu
aXRzID0gdHJ1ZTsKKworICAgIG1faW5TdHlsZVJlY2FsYyA9IHRydWU7CisgICAgc3VzcGVuZFBv
c3RBdHRhY2hDYWxsYmFja3MoKTsKKyAgICBSZW5kZXJXaWRnZXQ6OnN1c3BlbmRXaWRnZXRIaWVy
YXJjaHlVcGRhdGVzKCk7CisgICAgCisgICAgUmVmUHRyPEZyYW1lVmlldz4gZnJhbWVWaWV3ID0g
dmlldygpOworICAgIGlmIChmcmFtZVZpZXcpIHsKKyAgICAgICAgZnJhbWVWaWV3LT5wYXVzZVNj
aGVkdWxlZEV2ZW50cygpOworICAgICAgICBmcmFtZVZpZXctPmJlZ2luRGVmZXJyZWRSZXBhaW50
cygpOworICAgIH0KKworICAgIEFTU0VSVCghcmVuZGVyZXIoKSB8fCByZW5kZXJBcmVuYSgpKTsK
KyAgICBpZiAoIXJlbmRlcmVyKCkgfHwgIXJlbmRlckFyZW5hKCkpCisgICAgICAgIGdvdG8gYmFp
bF9vdXQ7CisKKyAgICBpZiAobV9wZW5kaW5nU3R5bGVSZWNhbGNTaG91bGRGb3JjZSkKKyAgICAg
ICAgY2hhbmdlID0gRm9yY2U7CisKKyAgICAvLyBSZWNhbGN1bGF0aW5nIHRoZSByb290IHN0eWxl
IChvbiB0aGUgZG9jdW1lbnQpIGlzIG5vdCBuZWVkZWQgaW4gdGhlIGNvbW1vbiBjYXNlLgorICAg
IGlmICgoY2hhbmdlID09IEZvcmNlKSB8fCAoc2hvdWxkRGlzcGxheVNlYW1sZXNzbHlXaXRoUGFy
ZW50KCkgJiYgKGNoYW5nZSA+PSBJbmhlcml0KSkpIHsKKyAgICAgICAgLy8gc3R5bGUgc2VsZWN0
b3IgbWF5IHNldCB0aGlzIGFnYWluIGR1cmluZyByZWNhbGMKKyAgICAgICAgbV9oYXNOb2Rlc1dp
dGhQbGFjZWhvbGRlclN0eWxlID0gZmFsc2U7CisgICAgICAgIAorICAgICAgICBSZWZQdHI8UmVu
ZGVyU3R5bGU+IGRvY3VtZW50U3R5bGUgPSBTdHlsZVJlc29sdmVyOjpzdHlsZUZvckRvY3VtZW50
KHRoaXMsIG1fc3R5bGVSZXNvbHZlciA/IG1fc3R5bGVSZXNvbHZlci0+Zm9udFNlbGVjdG9yKCkg
OiAwKTsKKyAgICAgICAgU3R5bGVDaGFuZ2UgY2ggPSBOb2RlOjpkaWZmKGRvY3VtZW50U3R5bGUu
Z2V0KCksIHJlbmRlcmVyKCktPnN0eWxlKCksIHRoaXMpOworICAgICAgICBpZiAoY2ggIT0gTm9D
aGFuZ2UpCisgICAgICAgICAgICByZW5kZXJlcigpLT5zZXRTdHlsZShkb2N1bWVudFN0eWxlLnJl
bGVhc2UoKSk7CisgICAgfQorCisgICAgZm9yIChOb2RlKiBuID0gZmlyc3RDaGlsZCgpOyBuOyBu
ID0gbi0+bmV4dFNpYmxpbmcoKSkgeworICAgICAgICBpZiAoIW4tPmlzRWxlbWVudE5vZGUoKSkK
KyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBFbGVtZW50KiBlbGVtZW50ID0gc3RhdGlj
X2Nhc3Q8RWxlbWVudCo+KG4pOworICAgICAgICBpZiAoY2hhbmdlID49IEluaGVyaXQgfHwgZWxl
bWVudC0+Y2hpbGROZWVkc1N0eWxlUmVjYWxjKCkgfHwgZWxlbWVudC0+bmVlZHNTdHlsZVJlY2Fs
YygpKQorICAgICAgICAgICAgZWxlbWVudC0+cmVjYWxjU3R5bGUoY2hhbmdlKTsKKyAgICB9CisK
KyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgaWYgKHZpZXcoKSkgeworICAg
ICAgICBib29sIGxheW91dFBlbmRpbmcgPSB2aWV3KCktPmxheW91dFBlbmRpbmcoKSB8fCByZW5k
ZXJlcigpLT5uZWVkc0xheW91dCgpOworICAgICAgICAvLyBJZiB3ZSBkaWRuJ3QgdXBkYXRlIGNv
bXBvc2l0aW5nIGxheWVycyBiZWNhdXNlIG9mIGxheW91dCgpLCB3ZSBuZWVkIHRvIGRvIHNvIGhl
cmUuCisgICAgICAgIGlmICghbGF5b3V0UGVuZGluZykKKyAgICAgICAgICAgIHZpZXcoKS0+dXBk
YXRlQ29tcG9zaXRpbmdMYXllcnNBZnRlclN0eWxlQ2hhbmdlKCk7CisgICAgfQorI2VuZGlmCisK
K2JhaWxfb3V0OgorICAgIGNsZWFyTmVlZHNTdHlsZVJlY2FsYygpOworICAgIGNsZWFyQ2hpbGRO
ZWVkc1N0eWxlUmVjYWxjKCk7CisgICAgdW5zY2hlZHVsZVN0eWxlUmVjYWxjKCk7CisKKyAgICBt
X2luU3R5bGVSZWNhbGMgPSBmYWxzZTsKKyAgICAKKyAgICAvLyBQc2V1ZG8gZWxlbWVudCByZW1v
dmFsIGFuZCBzaW1pbGFyIG1heSBvbmx5IHdvcmsgd2l0aCB0aGVzZSBmbGFncyBzdGlsbCBzZXQu
IFJlc2V0IHRoZW0gYWZ0ZXIgdGhlIHN0eWxlIHJlY2FsYy4KKyAgICBpZiAobV9zdHlsZVJlc29s
dmVyKQorICAgICAgICByZXNldENTU0ZlYXR1cmVGbGFncygpOworCisgICAgaWYgKGZyYW1lVmll
dykgeworICAgICAgICBmcmFtZVZpZXctPnJlc3VtZVNjaGVkdWxlZEV2ZW50cygpOworICAgICAg
ICBmcmFtZVZpZXctPmVuZERlZmVycmVkUmVwYWludHMoKTsKKyAgICB9CisgICAgUmVuZGVyV2lk
Z2V0OjpyZXN1bWVXaWRnZXRIaWVyYXJjaHlVcGRhdGVzKCk7CisgICAgcmVzdW1lUG9zdEF0dGFj
aENhbGxiYWNrcygpOworCisgICAgLy8gSWYgd2Ugd2FudGVkIHRvIGNhbGwgaW1wbGljaXRDbG9z
ZSgpIGR1cmluZyByZWNhbGNTdHlsZSwgZG8gc28gbm93IHRoYXQgd2UncmUgZmluaXNoZWQuCisg
ICAgaWYgKG1fY2xvc2VBZnRlclN0eWxlUmVjYWxjKSB7CisgICAgICAgIG1fY2xvc2VBZnRlclN0
eWxlUmVjYWxjID0gZmFsc2U7CisgICAgICAgIGltcGxpY2l0Q2xvc2UoKTsKKyAgICB9CisKKyAg
ICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZFJlY2FsY3VsYXRlU3R5bGUoY29va2llKTsK
K30KKwordm9pZCBEb2N1bWVudDo6dXBkYXRlU3R5bGVJZk5lZWRlZCgpCit7CisgICAgQVNTRVJU
KGlzTWFpblRocmVhZCgpKTsKKyAgICBBU1NFUlQoIXZpZXcoKSB8fCAoIXZpZXcoKS0+aXNJbkxh
eW91dCgpICYmICF2aWV3KCktPmlzUGFpbnRpbmcoKSkpOworICAgIAorICAgIGlmICgoIW1fcGVu
ZGluZ1N0eWxlUmVjYWxjU2hvdWxkRm9yY2UgJiYgIWNoaWxkTmVlZHNTdHlsZVJlY2FsYygpKSB8
fCBpblBhZ2VDYWNoZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBBbmltYXRpb25VcGRhdGVC
bG9jayBhbmltYXRpb25VcGRhdGVCbG9jayhtX2ZyYW1lID8gbV9mcmFtZS0+YW5pbWF0aW9uKCkg
OiAwKTsKKyAgICByZWNhbGNTdHlsZShOb0NoYW5nZSk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnVw
ZGF0ZVN0eWxlRm9yQWxsRG9jdW1lbnRzKCkKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkp
OworICAgIGlmICghZG9jdW1lbnRzVGhhdE5lZWRTdHlsZVJlY2FsYykKKyAgICAgICAgcmV0dXJu
OworCisgICAgd2hpbGUgKGRvY3VtZW50c1RoYXROZWVkU3R5bGVSZWNhbGMtPnNpemUoKSkgewor
ICAgICAgICBIYXNoU2V0PERvY3VtZW50Kj46Oml0ZXJhdG9yIGl0ID0gZG9jdW1lbnRzVGhhdE5l
ZWRTdHlsZVJlY2FsYy0+YmVnaW4oKTsKKyAgICAgICAgRG9jdW1lbnQqIGRvYyA9ICppdDsKKyAg
ICAgICAgZG9jdW1lbnRzVGhhdE5lZWRTdHlsZVJlY2FsYy0+cmVtb3ZlKGRvYyk7CisgICAgICAg
IGRvYy0+dXBkYXRlU3R5bGVJZk5lZWRlZCgpOworICAgIH0KK30KKwordm9pZCBEb2N1bWVudDo6
dXBkYXRlTGF5b3V0KCkKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworICAgIGlmIChF
bGVtZW50KiBvZSA9IG93bmVyRWxlbWVudCgpKQorICAgICAgICBvZS0+ZG9jdW1lbnQoKS0+dXBk
YXRlTGF5b3V0KCk7CisKKyAgICB1cGRhdGVTdHlsZUlmTmVlZGVkKCk7CisKKyAgICAvLyBPbmx5
IGRvIGEgbGF5b3V0IGlmIGNoYW5nZXMgaGF2ZSBvY2N1cnJlZCB0aGF0IG1ha2UgaXQgbmVjZXNz
YXJ5LiAgICAgIAorICAgIEZyYW1lVmlldyogdiA9IHZpZXcoKTsKKyAgICBpZiAodiAmJiByZW5k
ZXJlcigpICYmICh2LT5sYXlvdXRQZW5kaW5nKCkgfHwgcmVuZGVyZXIoKS0+bmVlZHNMYXlvdXQo
KSkpCisgICAgICAgIHYtPmxheW91dCgpOworfQorCisvLyBGSVhNRTogVGhpcyBpcyBhIGJhZCBp
ZGVhIGFuZCBuZWVkcyB0byBiZSByZW1vdmVkIGV2ZW50dWFsbHkuCisvLyBPdGhlciBicm93c2Vy
cyBsb2FkIHN0eWxlc2hlZXRzIGJlZm9yZSB0aGV5IGNvbnRpbnVlIHBhcnNpbmcgdGhlIHdlYiBw
YWdlLgorLy8gU2luY2Ugd2UgZG9uJ3QsIHdlIGNhbiBydW4gSmF2YVNjcmlwdCBjb2RlIHRoYXQg
bmVlZHMgYW5zd2VycyBiZWZvcmUgdGhlCisvLyBzdHlsZXNoZWV0cyBhcmUgbG9hZGVkLiBEb2lu
ZyBhIGxheW91dCBpZ25vcmluZyB0aGUgcGVuZGluZyBzdHlsZXNoZWV0cworLy8gbGV0cyB1cyBn
ZXQgcmVhc29uYWJsZSBhbnN3ZXJzLiBUaGUgbG9uZyB0ZXJtIHNvbHV0aW9uIHRvIHRoaXMgcHJv
YmxlbSBpcworLy8gdG8gaW5zdGVhZCBzdXNwZW5kIEphdmFTY3JpcHQgZXhlY3V0aW9uLgordm9p
ZCBEb2N1bWVudDo6dXBkYXRlTGF5b3V0SWdub3JlUGVuZGluZ1N0eWxlc2hlZXRzKCkKK3sKKyAg
ICBib29sIG9sZElnbm9yZSA9IG1faWdub3JlUGVuZGluZ1N0eWxlc2hlZXRzOworICAgIAorICAg
IGlmICghaGF2ZVN0eWxlc2hlZXRzTG9hZGVkKCkpIHsKKyAgICAgICAgbV9pZ25vcmVQZW5kaW5n
U3R5bGVzaGVldHMgPSB0cnVlOworICAgICAgICAvLyBGSVhNRTogV2UgYXJlIHdpbGxpbmcgdG8g
YXR0ZW1wdCB0byBzdXBwcmVzcyBwYWludGluZyB3aXRoIG91dGRhdGVkIHN0eWxlIGluZm8gb25s
eSBvbmNlLiAgT3VyIGFzc3VtcHRpb24gaXMgdGhhdCBpdCB3b3VsZCBiZQorICAgICAgICAvLyBk
YW5nZXJvdXMgdG8gdHJ5IHRvIHN0b3AgaXQgYSBzZWNvbmQgdGltZSwgYWZ0ZXIgcGFnZSBjb250
ZW50IGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkIGFuZCBkaXNwbGF5ZWQKKyAgICAgICAgLy8gd2l0
aCBhY2N1cmF0ZSBzdHlsZSBpbmZvcm1hdGlvbi4gIChPdXIgc3VwcHJlc3Npb24gaW52b2x2ZXMg
YmxhbmtpbmcgdGhlIHdob2xlIHBhZ2UgYXQgdGhlCisgICAgICAgIC8vIG1vbWVudC4gIElmIGl0
IHdlcmUgbW9yZSByZWZpbmVkLCB3ZSBtaWdodCBiZSBhYmxlIHRvIGRvIHNvbWV0aGluZyBiZXR0
ZXIuKQorICAgICAgICAvLyBJdCdzIHdvcnRoIG5vdGluZyB0aG91Z2ggdGhhdCB0aGlzIGVudGly
ZSBtZXRob2QgaXMgYSBoYWNrLCBzaW5jZSB3aGF0IHdlIHJlYWxseSB3YW50IHRvIGRvIGlzCisg
ICAgICAgIC8vIHN1c3BlbmQgSlMgaW5zdGVhZCBvZiBkb2luZyBhIGxheW91dCB3aXRoIGluYWNj
dXJhdGUgaW5mb3JtYXRpb24uCisgICAgICAgIEhUTUxFbGVtZW50KiBib2R5RWxlbWVudCA9IGJv
ZHkoKTsKKyAgICAgICAgaWYgKGJvZHlFbGVtZW50ICYmICFib2R5RWxlbWVudC0+cmVuZGVyZXIo
KSAmJiBtX3BlbmRpbmdTaGVldExheW91dCA9PSBOb0xheW91dFdpdGhQZW5kaW5nU2hlZXRzKSB7
CisgICAgICAgICAgICBtX3BlbmRpbmdTaGVldExheW91dCA9IERpZExheW91dFdpdGhQZW5kaW5n
U2hlZXRzOworICAgICAgICAgICAgc3R5bGVSZXNvbHZlckNoYW5nZWQoUmVjYWxjU3R5bGVJbW1l
ZGlhdGVseSk7CisgICAgICAgIH0gZWxzZSBpZiAobV9oYXNOb2Rlc1dpdGhQbGFjZWhvbGRlclN0
eWxlKQorICAgICAgICAgICAgLy8gSWYgbmV3IG5vZGVzIGhhdmUgYmVlbiBhZGRlZCBvciBzdHls
ZSByZWNhbGMgaGFzIGJlZW4gZG9uZSB3aXRoIHN0eWxlIHNoZWV0cyBzdGlsbCBwZW5kaW5nLCBz
b21lIG5vZGVzIAorICAgICAgICAgICAgLy8gbWF5IG5vdCBoYXZlIGhhZCB0aGVpciByZWFsIHN0
eWxlIGNhbGN1bGF0ZWQgeWV0LiBOb3JtYWxseSB0aGlzIGdldHMgY2xlYW5lZCB3aGVuIHN0eWxl
IHNoZWV0cyBhcnJpdmUgCisgICAgICAgICAgICAvLyBidXQgaGVyZSB3ZSBuZWVkIHVwLXRvLWRh
dGUgc3R5bGUgaW1tZWRpYXRlbHkuCisgICAgICAgICAgICByZWNhbGNTdHlsZShGb3JjZSk7Cisg
ICAgfQorCisgICAgdXBkYXRlTGF5b3V0KCk7CisKKyAgICBtX2lnbm9yZVBlbmRpbmdTdHlsZXNo
ZWV0cyA9IG9sZElnbm9yZTsKK30KKworUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gRG9jdW1lbnQ6
OnN0eWxlRm9yRWxlbWVudElnbm9yaW5nUGVuZGluZ1N0eWxlc2hlZXRzKEVsZW1lbnQqIGVsZW1l
bnQpCit7CisgICAgQVNTRVJUX0FSRyhlbGVtZW50LCBlbGVtZW50LT5kb2N1bWVudCgpID09IHRo
aXMpOworCisgICAgYm9vbCBvbGRJZ25vcmUgPSBtX2lnbm9yZVBlbmRpbmdTdHlsZXNoZWV0czsK
KyAgICBtX2lnbm9yZVBlbmRpbmdTdHlsZXNoZWV0cyA9IHRydWU7CisgICAgUmVmUHRyPFJlbmRl
clN0eWxlPiBzdHlsZSA9IHN0eWxlUmVzb2x2ZXIoKS0+c3R5bGVGb3JFbGVtZW50KGVsZW1lbnQs
IGVsZW1lbnQtPnBhcmVudE5vZGUoKSA/IGVsZW1lbnQtPnBhcmVudE5vZGUoKS0+Y29tcHV0ZWRT
dHlsZSgpIDogMCk7CisgICAgbV9pZ25vcmVQZW5kaW5nU3R5bGVzaGVldHMgPSBvbGRJZ25vcmU7
CisgICAgcmV0dXJuIHN0eWxlLnJlbGVhc2UoKTsKK30KKworUGFzc1JlZlB0cjxSZW5kZXJTdHls
ZT4gRG9jdW1lbnQ6OnN0eWxlRm9yUGFnZShpbnQgcGFnZUluZGV4KQoreworICAgIFJlZlB0cjxS
ZW5kZXJTdHlsZT4gc3R5bGUgPSBzdHlsZVJlc29sdmVyKCktPnN0eWxlRm9yUGFnZShwYWdlSW5k
ZXgpOworICAgIHJldHVybiBzdHlsZS5yZWxlYXNlKCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnJl
Z2lzdGVyQ3VzdG9tRm9udChQYXNzT3duUHRyPEZvbnREYXRhPiBmb250RGF0YSkKK3sKKyAgICBt
X2N1c3RvbUZvbnRzLmFwcGVuZChmb250RGF0YSk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmRlbGV0
ZUN1c3RvbUZvbnRzKCkKK3sKKyAgICBzaXplX3Qgc2l6ZSA9IG1fY3VzdG9tRm9udHMuc2l6ZSgp
OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKQorICAgICAgICBHbHlwaFBh
Z2VUcmVlTm9kZTo6cHJ1bmVUcmVlQ3VzdG9tRm9udERhdGEobV9jdXN0b21Gb250c1tpXS5nZXQo
KSk7CisKKyAgICBtX2N1c3RvbUZvbnRzLmNsZWFyKCk7Cit9CisKK2Jvb2wgRG9jdW1lbnQ6Omlz
UGFnZUJveFZpc2libGUoaW50IHBhZ2VJbmRleCkKK3sKKyAgICBSZWZQdHI8UmVuZGVyU3R5bGU+
IHN0eWxlID0gc3R5bGVGb3JQYWdlKHBhZ2VJbmRleCk7CisgICAgcmV0dXJuIHN0eWxlLT52aXNp
YmlsaXR5KCkgIT0gSElEREVOOyAvLyBkaXNwbGF5IHByb3BlcnR5IGRvZXNuJ3QgYXBwbHkgdG8g
QHBhZ2UuCit9CisKK3ZvaWQgRG9jdW1lbnQ6OnBhZ2VTaXplQW5kTWFyZ2luc0luUGl4ZWxzKGlu
dCBwYWdlSW5kZXgsIEludFNpemUmIHBhZ2VTaXplLCBpbnQmIG1hcmdpblRvcCwgaW50JiBtYXJn
aW5SaWdodCwgaW50JiBtYXJnaW5Cb3R0b20sIGludCYgbWFyZ2luTGVmdCkKK3sKKyAgICBSZWZQ
dHI8UmVuZGVyU3R5bGU+IHN0eWxlID0gc3R5bGVGb3JQYWdlKHBhZ2VJbmRleCk7CisgICAgUmVu
ZGVyVmlldyogdmlldyA9IHJlbmRlclZpZXcoKTsKKworICAgIGludCB3aWR0aCA9IHBhZ2VTaXpl
LndpZHRoKCk7CisgICAgaW50IGhlaWdodCA9IHBhZ2VTaXplLmhlaWdodCgpOworICAgIHN3aXRj
aCAoc3R5bGUtPnBhZ2VTaXplVHlwZSgpKSB7CisgICAgY2FzZSBQQUdFX1NJWkVfQVVUTzoKKyAg
ICAgICAgYnJlYWs7CisgICAgY2FzZSBQQUdFX1NJWkVfQVVUT19MQU5EU0NBUEU6CisgICAgICAg
IGlmICh3aWR0aCA8IGhlaWdodCkKKyAgICAgICAgICAgIHN0ZDo6c3dhcCh3aWR0aCwgaGVpZ2h0
KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQQUdFX1NJWkVfQVVUT19QT1JUUkFJVDoKKyAg
ICAgICAgaWYgKHdpZHRoID4gaGVpZ2h0KQorICAgICAgICAgICAgc3RkOjpzd2FwKHdpZHRoLCBo
ZWlnaHQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBBR0VfU0laRV9SRVNPTFZFRDogewor
ICAgICAgICBMZW5ndGhTaXplIHNpemUgPSBzdHlsZS0+cGFnZVNpemUoKTsKKyAgICAgICAgQVNT
RVJUKHNpemUud2lkdGgoKS5pc0ZpeGVkKCkpOworICAgICAgICBBU1NFUlQoc2l6ZS5oZWlnaHQo
KS5pc0ZpeGVkKCkpOworICAgICAgICB3aWR0aCA9IHZhbHVlRm9yTGVuZ3RoKHNpemUud2lkdGgo
KSwgMCwgdmlldyk7CisgICAgICAgIGhlaWdodCA9IHZhbHVlRm9yTGVuZ3RoKHNpemUuaGVpZ2h0
KCksIDAsIHZpZXcpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAg
ICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgfQorICAgIHBhZ2VTaXplID0gSW50U2l6ZSh3
aWR0aCwgaGVpZ2h0KTsKKworICAgIC8vIFRoZSBwZXJjZW50YWdlIGlzIGNhbGN1bGF0ZWQgd2l0
aCByZXNwZWN0IHRvIHRoZSB3aWR0aCBldmVuIGZvciBtYXJnaW4gdG9wIGFuZCBib3R0b20uCisg
ICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvQ1NTMi9ib3guaHRtbCNtYXJnaW4tcHJvcGVydGll
cworICAgIG1hcmdpblRvcCA9IHN0eWxlLT5tYXJnaW5Ub3AoKS5pc0F1dG8oKSA/IG1hcmdpblRv
cCA6IGludFZhbHVlRm9yTGVuZ3RoKHN0eWxlLT5tYXJnaW5Ub3AoKSwgd2lkdGgsIHZpZXcpOwor
ICAgIG1hcmdpblJpZ2h0ID0gc3R5bGUtPm1hcmdpblJpZ2h0KCkuaXNBdXRvKCkgPyBtYXJnaW5S
aWdodCA6IGludFZhbHVlRm9yTGVuZ3RoKHN0eWxlLT5tYXJnaW5SaWdodCgpLCB3aWR0aCwgdmll
dyk7CisgICAgbWFyZ2luQm90dG9tID0gc3R5bGUtPm1hcmdpbkJvdHRvbSgpLmlzQXV0bygpID8g
bWFyZ2luQm90dG9tIDogaW50VmFsdWVGb3JMZW5ndGgoc3R5bGUtPm1hcmdpbkJvdHRvbSgpLCB3
aWR0aCwgdmlldyk7CisgICAgbWFyZ2luTGVmdCA9IHN0eWxlLT5tYXJnaW5MZWZ0KCkuaXNBdXRv
KCkgPyBtYXJnaW5MZWZ0IDogaW50VmFsdWVGb3JMZW5ndGgoc3R5bGUtPm1hcmdpbkxlZnQoKSwg
d2lkdGgsIHZpZXcpOworfQorCit2b2lkIERvY3VtZW50OjpzZXREb2N1bWVudFJhcmVEYXRhKE5v
ZGVSYXJlRGF0YSogcmFyZURhdGEpCit7CisgICAgbV9kb2N1bWVudFJhcmVEYXRhID0gcmFyZURh
dGE7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnNldElzVmlld1NvdXJjZShib29sIGlzVmlld1NvdXJj
ZSkKK3sKKyAgICBtX2lzVmlld1NvdXJjZSA9IGlzVmlld1NvdXJjZTsKKyAgICBpZiAoIW1faXNW
aWV3U291cmNlKQorICAgICAgICByZXR1cm47CisKKyAgICBzZXRTZWN1cml0eU9yaWdpbihTZWN1
cml0eU9yaWdpbjo6Y3JlYXRlVW5pcXVlKCkpOworICAgIGRpZFVwZGF0ZVNlY3VyaXR5T3JpZ2lu
KCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmNvbWJpbmVDU1NGZWF0dXJlRmxhZ3MoKQoreworICAg
IC8vIERlbGF5IHJlc2V0dGluZyB0aGUgZmxhZ3MgdW50aWwgYWZ0ZXIgbmV4dCBzdHlsZSByZWNh
bGMgc2luY2UgdW5hcHBseWluZyB0aGUgc3R5bGUgbWF5IG5vdCB3b3JrIHdpdGhvdXQgdGhlc2Ug
c2V0ICh0aGlzIGlzIHRydWUgYXQgbGVhc3Qgd2l0aCBiZWZvcmUvYWZ0ZXIpLgorICAgIG1fdXNl
c1NpYmxpbmdSdWxlcyA9IG1fdXNlc1NpYmxpbmdSdWxlcyB8fCBtX3N0eWxlUmVzb2x2ZXItPnVz
ZXNTaWJsaW5nUnVsZXMoKTsKKyAgICBtX3VzZXNGaXJzdExpbmVSdWxlcyA9IG1fdXNlc0ZpcnN0
TGluZVJ1bGVzIHx8IG1fc3R5bGVSZXNvbHZlci0+dXNlc0ZpcnN0TGluZVJ1bGVzKCk7CisgICAg
bV91c2VzQmVmb3JlQWZ0ZXJSdWxlcyA9IG1fdXNlc0JlZm9yZUFmdGVyUnVsZXMgfHwgbV9zdHls
ZVJlc29sdmVyLT51c2VzQmVmb3JlQWZ0ZXJSdWxlcygpOworICAgIG1fdXNlc0xpbmtSdWxlcyA9
IG1fdXNlc0xpbmtSdWxlcyB8fCBtX3N0eWxlUmVzb2x2ZXItPnVzZXNMaW5rUnVsZXMoKTsKK30K
Kwordm9pZCBEb2N1bWVudDo6cmVzZXRDU1NGZWF0dXJlRmxhZ3MoKQoreworICAgIG1fdXNlc1Np
YmxpbmdSdWxlcyA9IG1fc3R5bGVSZXNvbHZlci0+dXNlc1NpYmxpbmdSdWxlcygpOworICAgIG1f
dXNlc0ZpcnN0TGluZVJ1bGVzID0gbV9zdHlsZVJlc29sdmVyLT51c2VzRmlyc3RMaW5lUnVsZXMo
KTsKKyAgICBtX3VzZXNCZWZvcmVBZnRlclJ1bGVzID0gbV9zdHlsZVJlc29sdmVyLT51c2VzQmVm
b3JlQWZ0ZXJSdWxlcygpOworICAgIG1fdXNlc0xpbmtSdWxlcyA9IG1fc3R5bGVSZXNvbHZlci0+
dXNlc0xpbmtSdWxlcygpOworfQorCit2b2lkIERvY3VtZW50OjpjcmVhdGVTdHlsZVJlc29sdmVy
KCkKK3sKKyAgICBib29sIG1hdGNoQXV0aG9yQW5kVXNlclN0eWxlcyA9IHRydWU7CisgICAgaWYg
KFNldHRpbmdzKiBkb2NTZXR0aW5ncyA9IHNldHRpbmdzKCkpCisgICAgICAgIG1hdGNoQXV0aG9y
QW5kVXNlclN0eWxlcyA9IGRvY1NldHRpbmdzLT5hdXRob3JBbmRVc2VyU3R5bGVzRW5hYmxlZCgp
OworICAgIG1fc3R5bGVSZXNvbHZlciA9IGFkb3B0UHRyKG5ldyBTdHlsZVJlc29sdmVyKHRoaXMs
IG1hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykpOworICAgIGNvbWJpbmVDU1NGZWF0dXJlRmxhZ3Mo
KTsKK30KKworaW5saW5lIHZvaWQgRG9jdW1lbnQ6OmNsZWFyU3R5bGVSZXNvbHZlcigpCit7Cisg
ICAgbV9zdHlsZVJlc29sdmVyLmNsZWFyKCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmF0dGFjaCgp
Cit7CisgICAgQVNTRVJUKCFhdHRhY2hlZCgpKTsKKyAgICBBU1NFUlQoIW1faW5QYWdlQ2FjaGUp
OworICAgIEFTU0VSVCghbV9heE9iamVjdENhY2hlIHx8IHRoaXMgIT0gdG9wRG9jdW1lbnQoKSk7
CisKKyAgICBpZiAoIW1fcmVuZGVyQXJlbmEpCisgICAgICAgIG1fcmVuZGVyQXJlbmEgPSBhZG9w
dFB0cihuZXcgUmVuZGVyQXJlbmEpOworICAgIAorICAgIC8vIENyZWF0ZSB0aGUgcmVuZGVyaW5n
IHRyZWUKKyAgICBzZXRSZW5kZXJlcihuZXcgKG1fcmVuZGVyQXJlbmEuZ2V0KCkpIFJlbmRlclZp
ZXcodGhpcywgdmlldygpKSk7CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAg
IHJlbmRlclZpZXcoKS0+ZGlkTW92ZU9uc2NyZWVuKCk7CisjZW5kaWYKKworICAgIHJlY2FsY1N0
eWxlKEZvcmNlKTsKKworICAgIFJlbmRlck9iamVjdCogcmVuZGVyID0gcmVuZGVyZXIoKTsKKyAg
ICBzZXRSZW5kZXJlcigwKTsKKworICAgIENvbnRhaW5lck5vZGU6OmF0dGFjaCgpOworCisgICAg
c2V0UmVuZGVyZXIocmVuZGVyKTsKK30KKwordm9pZCBEb2N1bWVudDo6ZGV0YWNoKCkKK3sKKyAg
ICBBU1NFUlQoYXR0YWNoZWQoKSk7CisgICAgQVNTRVJUKCFtX2luUGFnZUNhY2hlKTsKKworI2lm
IEVOQUJMRShQT0lOVEVSX0xPQ0spCisgICAgaWYgKHBhZ2UoKSkKKyAgICAgICAgcGFnZSgpLT5w
b2ludGVyTG9ja0NvbnRyb2xsZXIoKS0+ZG9jdW1lbnREZXRhY2hlZCh0aGlzKTsKKyNlbmRpZgor
CisgICAgaWYgKHRoaXMgPT0gdG9wRG9jdW1lbnQoKSkKKyAgICAgICAgY2xlYXJBWE9iamVjdENh
Y2hlKCk7CisKKyAgICBzdG9wQWN0aXZlRE9NT2JqZWN0cygpOworICAgIG1fZXZlbnRRdWV1ZS0+
Y2xvc2UoKTsKKyNpZiBFTkFCTEUoRlVMTFNDUkVFTl9BUEkpCisgICAgbV9mdWxsU2NyZWVuQ2hh
bmdlRXZlbnRUYXJnZXRRdWV1ZS5jbGVhcigpOworICAgIG1fZnVsbFNjcmVlbkVycm9yRXZlbnRU
YXJnZXRRdWV1ZS5jbGVhcigpOworI2VuZGlmCisKKyNpZiBFTkFCTEUoUkVRVUVTVF9BTklNQVRJ
T05fRlJBTUUpCisgICAgLy8gRklYTUU6IGNvbnNpZGVyIHVzaW5nIEFjdGl2ZURPTU9iamVjdC4K
KyAgICBpZiAobV9zY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXIpCisgICAgICAgIG1fc2NyaXB0
ZWRBbmltYXRpb25Db250cm9sbGVyLT5jbGVhckRvY3VtZW50UG9pbnRlcigpOworICAgIG1fc2Ny
aXB0ZWRBbmltYXRpb25Db250cm9sbGVyLmNsZWFyKCk7CisjZW5kaWYKKworICAgIFJlbmRlck9i
amVjdCogcmVuZGVyID0gcmVuZGVyZXIoKTsKKworICAgIGRvY3VtZW50V2lsbEJlY29tZUluYWN0
aXZlKCk7CisKKyNpZiBFTkFCTEUoU0hBUkVEX1dPUktFUlMpCisgICAgU2hhcmVkV29ya2VyUmVw
b3NpdG9yeTo6ZG9jdW1lbnREZXRhY2hlZCh0aGlzKTsKKyNlbmRpZgorCisgICAgaWYgKG1fZnJh
bWUpIHsKKyAgICAgICAgRnJhbWVWaWV3KiB2aWV3ID0gbV9mcmFtZS0+dmlldygpOworICAgICAg
ICBpZiAodmlldykKKyAgICAgICAgICAgIHZpZXctPmRldGFjaEN1c3RvbVNjcm9sbGJhcnMoKTsK
KworICAgIH0KKworICAgIC8vIGluZGljYXRlIGRlc3RydWN0aW9uIG1vZGUsICBpLmUuIGF0dGFj
aGVkKCkgYnV0IHJlbmRlcmVyID09IDAKKyAgICBzZXRSZW5kZXJlcigwKTsKKyAgICAKKyNpZiBF
TkFCTEUoRlVMTFNDUkVFTl9BUEkpCisgICAgaWYgKG1fZnVsbFNjcmVlblJlbmRlcmVyKQorICAg
ICAgICBzZXRGdWxsU2NyZWVuUmVuZGVyZXIoMCk7CisjZW5kaWYKKworICAgIG1faG92ZXJOb2Rl
ID0gMDsKKyAgICBtX2ZvY3VzZWROb2RlID0gMDsKKyAgICBtX2FjdGl2ZU5vZGUgPSAwOworCisg
ICAgQ29udGFpbmVyTm9kZTo6ZGV0YWNoKCk7CisKKyAgICB1bnNjaGVkdWxlU3R5bGVSZWNhbGMo
KTsKKworICAgIGlmIChyZW5kZXIpCisgICAgICAgIHJlbmRlci0+ZGVzdHJveSgpOworCisgICAg
Ly8gVGhpcyBpcyByZXF1aXJlZCwgYXMgb3VyIEZyYW1lIG1pZ2h0IGRlbGV0ZSBpdHNlbGYgYXMg
c29vbiBhcyBpdCBkZXRhY2hlcworICAgIC8vIHVzLiBIb3dldmVyLCB0aGlzIHZpb2xhdGVzIE5v
ZGU6OmRldGFjaCgpIHNlbWFudGljcywgYXMgaXQncyBuZXZlcgorICAgIC8vIHBvc3NpYmxlIHRv
IHJlLWF0dGFjaC4gRXZlbnR1YWxseSBEb2N1bWVudDo6ZGV0YWNoKCkgc2hvdWxkIGJlIHJlbmFt
ZWQsCisgICAgLy8gb3IgdGhpcyBzZXR0aW5nIG9mIHRoZSBmcmFtZSB0byAwIGNvdWxkIGJlIG1h
ZGUgZXhwbGljaXQgaW4gZWFjaCBvZiB0aGUKKyAgICAvLyBjYWxsZXJzIG9mIERvY3VtZW50Ojpk
ZXRhY2goKS4KKyAgICBtX2ZyYW1lID0gMDsKKyAgICBtX3JlbmRlckFyZW5hLmNsZWFyKCk7Cit9
CisKK3ZvaWQgRG9jdW1lbnQ6OnByZXBhcmVGb3JEZXN0cnVjdGlvbigpCit7CisgICAgZGlzY29u
bmVjdERlc2NlbmRhbnRGcmFtZXMoKTsKKyAgICBpZiAoRE9NV2luZG93KiB3aW5kb3cgPSB0aGlz
LT5kb21XaW5kb3coKSkKKyAgICAgICAgd2luZG93LT53aWxsRGV0YWNoRG9jdW1lbnRGcm9tRnJh
bWUoKTsKKyAgICBkZXRhY2goKTsKK30KKwordm9pZCBEb2N1bWVudDo6cmVtb3ZlQWxsRXZlbnRM
aXN0ZW5lcnMoKQoreworICAgIEV2ZW50VGFyZ2V0OjpyZW1vdmVBbGxFdmVudExpc3RlbmVycygp
OworCisgICAgaWYgKERPTVdpbmRvdyogZG9tV2luZG93ID0gdGhpcy0+ZG9tV2luZG93KCkpCisg
ICAgICAgIGRvbVdpbmRvdy0+cmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnMoKTsKKyAgICBmb3IgKE5v
ZGUqIG5vZGUgPSBmaXJzdENoaWxkKCk7IG5vZGU7IG5vZGUgPSBub2RlLT50cmF2ZXJzZU5leHRO
b2RlKCkpCisgICAgICAgIG5vZGUtPnJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzKCk7Cit9CisKK3Zv
aWQgRG9jdW1lbnQ6OnN1c3BlbmRBY3RpdmVET01PYmplY3RzKEFjdGl2ZURPTU9iamVjdDo6UmVh
c29uRm9yU3VzcGVuc2lvbiB3aHkpCit7CisgICAgU2NyaXB0RXhlY3V0aW9uQ29udGV4dDo6c3Vz
cGVuZEFjdGl2ZURPTU9iamVjdHMod2h5KTsKKworI2lmIEVOQUJMRShERVZJQ0VfT1JJRU5UQVRJ
T04pCisgICAgaWYgKCFwYWdlKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChEZXZpY2VN
b3Rpb25Db250cm9sbGVyKiBjb250cm9sbGVyID0gRGV2aWNlTW90aW9uQ29udHJvbGxlcjo6ZnJv
bShwYWdlKCkpKQorICAgICAgICBjb250cm9sbGVyLT5zdXNwZW5kRXZlbnRzRm9yQWxsTGlzdGVu
ZXJzKGRvbVdpbmRvdygpKTsKKyAgICBpZiAoRGV2aWNlT3JpZW50YXRpb25Db250cm9sbGVyKiBj
b250cm9sbGVyID0gRGV2aWNlT3JpZW50YXRpb25Db250cm9sbGVyOjpmcm9tKHBhZ2UoKSkpCisg
ICAgICAgIGNvbnRyb2xsZXItPnN1c3BlbmRFdmVudHNGb3JBbGxMaXN0ZW5lcnMoZG9tV2luZG93
KCkpOworCisjZW5kaWYKK30KKwordm9pZCBEb2N1bWVudDo6cmVzdW1lQWN0aXZlRE9NT2JqZWN0
cygpCit7CisgICAgU2NyaXB0RXhlY3V0aW9uQ29udGV4dDo6cmVzdW1lQWN0aXZlRE9NT2JqZWN0
cygpOworCisjaWYgRU5BQkxFKERFVklDRV9PUklFTlRBVElPTikKKyAgICBpZiAoIXBhZ2UoKSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKERldmljZU1vdGlvbkNvbnRyb2xsZXIqIGNvbnRy
b2xsZXIgPSBEZXZpY2VNb3Rpb25Db250cm9sbGVyOjpmcm9tKHBhZ2UoKSkpCisgICAgICAgIGNv
bnRyb2xsZXItPnJlc3VtZUV2ZW50c0ZvckFsbExpc3RlbmVycyhkb21XaW5kb3coKSk7CisgICAg
aWYgKERldmljZU9yaWVudGF0aW9uQ29udHJvbGxlciogY29udHJvbGxlciA9IERldmljZU9yaWVu
dGF0aW9uQ29udHJvbGxlcjo6ZnJvbShwYWdlKCkpKQorICAgICAgICBjb250cm9sbGVyLT5yZXN1
bWVFdmVudHNGb3JBbGxMaXN0ZW5lcnMoZG9tV2luZG93KCkpOworI2VuZGlmCit9CisKK1JlbmRl
clZpZXcqIERvY3VtZW50OjpyZW5kZXJWaWV3KCkgY29uc3QKK3sKKyAgICByZXR1cm4gdG9SZW5k
ZXJWaWV3KHJlbmRlcmVyKCkpOworfQorCit2b2lkIERvY3VtZW50OjpjbGVhckFYT2JqZWN0Q2Fj
aGUoKQoreworICAgIC8vIGNsZWFyIGNhY2hlIGluIHRvcCBkb2N1bWVudAorICAgIGlmIChtX2F4
T2JqZWN0Q2FjaGUpIHsKKyAgICAgICAgLy8gQ2xlYXIgdGhlIGNhY2hlIG1lbWJlciB2YXJpYWJs
ZSBiZWZvcmUgY2FsbGluZyBkZWxldGUgYmVjYXVzZSBhdHRlbXB0cworICAgICAgICAvLyBhcmUg
bWFkZSB0byBhY2Nlc3MgaXQgZHVyaW5nIGRlc3RydWN0aW9uLgorICAgICAgICBBWE9iamVjdENh
Y2hlKiBheE9iamVjdENhY2hlID0gbV9heE9iamVjdENhY2hlOworICAgICAgICBtX2F4T2JqZWN0
Q2FjaGUgPSAwOworICAgICAgICBkZWxldGUgYXhPYmplY3RDYWNoZTsKKyAgICAgICAgcmV0dXJu
OworICAgIH0KKyAgICAKKyAgICAvLyBhc2sgdGhlIHRvcC1sZXZlbCBkb2N1bWVudCB0byBjbGVh
ciBpdHMgY2FjaGUKKyAgICBEb2N1bWVudCogZG9jID0gdG9wRG9jdW1lbnQoKTsKKyAgICBpZiAo
ZG9jICE9IHRoaXMpCisgICAgICAgIGRvYy0+Y2xlYXJBWE9iamVjdENhY2hlKCk7Cit9CisKK2Jv
b2wgRG9jdW1lbnQ6OmF4T2JqZWN0Q2FjaGVFeGlzdHMoKSBjb25zdAoreworICAgIGlmIChtX2F4
T2JqZWN0Q2FjaGUpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIAorICAgIERvY3VtZW50KiBk
b2MgPSB0b3BEb2N1bWVudCgpOworICAgIGlmIChkb2MgIT0gdGhpcykKKyAgICAgICAgcmV0dXJu
IGRvYy0+YXhPYmplY3RDYWNoZUV4aXN0cygpOworICAgIAorICAgIHJldHVybiBmYWxzZTsKK30K
KyAgICAKK0FYT2JqZWN0Q2FjaGUqIERvY3VtZW50OjpheE9iamVjdENhY2hlKCkgY29uc3QKK3sK
KyAgICAvLyBUaGUgb25seSBkb2N1bWVudCB0aGF0IGFjdHVhbGx5IGhhcyBhIEFYT2JqZWN0Q2Fj
aGUgaXMgdGhlIHRvcC1sZXZlbAorICAgIC8vIGRvY3VtZW50LiAgVGhpcyBpcyBiZWNhdXNlIHdl
IG5lZWQgdG8gYmUgYWJsZSB0byBnZXQgZnJvbSBhbnkgV2ViQ29yZUFYT2JqZWN0CisgICAgLy8g
dG8gYW55IG90aGVyIFdlYkNvcmVBWE9iamVjdCBvbiB0aGUgc2FtZSBwYWdlLiAgVXNpbmcgYSBz
aW5nbGUgY2FjaGUgYWxsb3dzCisgICAgLy8gbG9va3VwcyBhY3Jvc3MgbmVzdGVkIHdlYmFyZWFz
IChpLmUuIG11bHRpcGxlIGRvY3VtZW50cykuCisgICAgCisgICAgaWYgKG1fYXhPYmplY3RDYWNo
ZSkgeworICAgICAgICAvLyByZXR1cm4gYWxyZWFkeSBrbm93biB0b3AtbGV2ZWwgY2FjaGUKKyAg
ICAgICAgaWYgKCFvd25lckVsZW1lbnQoKSkKKyAgICAgICAgICAgIHJldHVybiBtX2F4T2JqZWN0
Q2FjaGU7CisgICAgICAgIAorICAgICAgICAvLyBJbiBzb21lIHBhZ2VzIHdpdGggZnJhbWVzLCB0
aGUgY2FjaGUgaXMgY3JlYXRlZCBiZWZvcmUgdGhlIHN1Yi13ZWJhcmVhIGlzCisgICAgICAgIC8v
IGluc2VydGVkIGludG8gdGhlIHRyZWUuICBIZXJlLCB3ZSBjYXRjaCB0aGF0IGNhc2UgYW5kIGp1
c3QgdG9zcyB0aGUgb2xkCisgICAgICAgIC8vIGNhY2hlIGFuZCBzdGFydCBvdmVyLgorICAgICAg
ICAvLyBOT1RFOiBUaGlzIHJlY292ZXJ5IG1heSBubyBsb25nZXIgYmUgbmVlZGVkLiBJIGhhdmUg
YmVlbiB1bmFibGUgdG8gdHJpZ2dlcgorICAgICAgICAvLyBpdCBhZ2Fpbi4gU2VlIHJkYXI6Ly81
Nzk0NDU0CisgICAgICAgIC8vIEZJWE1FOiBDYW4gdGhpcyBiZSBmaXhlZCB3aGVuIGluc2VydGlu
ZyB0aGUgc3ViZnJhbWUgaW5zdGVhZCBvZiBub3c/CisgICAgICAgIC8vIEZJWE1FOiBJZiB0aGlz
IGZ1bmN0aW9uIHdhcyBjYWxsZWQgdG8gZ2V0IHRoZSBjYWNoZSBpbiBvcmRlciB0byByZW1vdmUK
KyAgICAgICAgLy8gYW4gQVhPYmplY3QsIHdlIGFyZSBub3cgZGVsZXRpbmcgdGhlIGNhY2hlIGFz
IGEgd2hvbGUgYW5kIHJldHVybmluZyBhCisgICAgICAgIC8vIG5ldyBlbXB0eSBjYWNoZSB0aGF0
IGRvZXMgbm90IGNvbnRhaW4gdGhlIEFYT2JqZWN0ISBUaGF0IHNob3VsZCBhY3R1YWxseQorICAg
ICAgICAvLyBiZSBPSy4gSSBhbSBjb25jZXJuZWQgYWJvdXQgb3RoZXIgY2FzZXMgbGlrZSB0aGlz
IHdoZXJlIGFjY2Vzc2luZyB0aGUKKyAgICAgICAgLy8gY2FjaGUgYmxvd3MgYXdheSB0aGUgQVhP
YmplY3QgYmVpbmcgb3BlcmF0ZWQgb24uCisgICAgICAgIGRlbGV0ZSBtX2F4T2JqZWN0Q2FjaGU7
CisgICAgICAgIG1fYXhPYmplY3RDYWNoZSA9IDA7CisgICAgfQorCisgICAgLy8gYXNrIHRoZSB0
b3AtbGV2ZWwgZG9jdW1lbnQgZm9yIGl0cyBjYWNoZQorICAgIERvY3VtZW50KiBkb2MgPSB0b3BE
b2N1bWVudCgpOworICAgIGlmIChkb2MgIT0gdGhpcykKKyAgICAgICAgcmV0dXJuIGRvYy0+YXhP
YmplY3RDYWNoZSgpOworICAgIAorICAgIC8vIHRoaXMgaXMgdGhlIHRvcC1sZXZlbCBkb2N1bWVu
dCwgc28gaW5zdGFsbCBhIG5ldyBjYWNoZQorICAgIG1fYXhPYmplY3RDYWNoZSA9IG5ldyBBWE9i
amVjdENhY2hlKHRoaXMpOworICAgIHJldHVybiBtX2F4T2JqZWN0Q2FjaGU7Cit9CisKK3ZvaWQg
RG9jdW1lbnQ6OnNldFZpc3VhbGx5T3JkZXJlZCgpCit7CisgICAgbV92aXN1YWxseU9yZGVyZWQg
PSB0cnVlOworICAgIGlmIChyZW5kZXJlcigpKQorICAgICAgICByZW5kZXJlcigpLT5zdHlsZSgp
LT5zZXRSVExPcmRlcmluZyhWaXN1YWxPcmRlcik7Cit9CisKK1Bhc3NSZWZQdHI8RG9jdW1lbnRQ
YXJzZXI+IERvY3VtZW50OjpjcmVhdGVQYXJzZXIoKQoreworICAgIC8vIEZJWE1FOiB0aGlzIHNo
b3VsZCBwcm9iYWJseSBwYXNzIHRoZSBmcmFtZSBpbnN0ZWFkCisjaWYgRU5BQkxFKE5FV19YTUwp
CisgICAgcmV0dXJuIE5ld1hNTERvY3VtZW50UGFyc2VyOjpjcmVhdGUodGhpcyk7CisjZWxzZQor
ICAgIHJldHVybiBYTUxEb2N1bWVudFBhcnNlcjo6Y3JlYXRlKHRoaXMsIHZpZXcoKSk7CisjZW5k
aWYKK30KKworU2NyaXB0YWJsZURvY3VtZW50UGFyc2VyKiBEb2N1bWVudDo6c2NyaXB0YWJsZURv
Y3VtZW50UGFyc2VyKCkgY29uc3QKK3sKKyAgICByZXR1cm4gcGFyc2VyKCkgPyBwYXJzZXIoKS0+
YXNTY3JpcHRhYmxlRG9jdW1lbnRQYXJzZXIoKSA6IDA7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6Om9w
ZW4oRG9jdW1lbnQqIG93bmVyRG9jdW1lbnQpCit7CisgICAgaWYgKG93bmVyRG9jdW1lbnQpIHsK
KyAgICAgICAgc2V0VVJMKG93bmVyRG9jdW1lbnQtPnVybCgpKTsKKyAgICAgICAgbV9jb29raWVV
UkwgPSBvd25lckRvY3VtZW50LT5jb29raWVVUkwoKTsKKyAgICAgICAgc2V0U2VjdXJpdHlPcmln
aW4ob3duZXJEb2N1bWVudC0+c2VjdXJpdHlPcmlnaW4oKSk7CisgICAgfQorCisgICAgaWYgKG1f
ZnJhbWUpIHsKKyAgICAgICAgaWYgKFNjcmlwdGFibGVEb2N1bWVudFBhcnNlciogcGFyc2VyID0g
c2NyaXB0YWJsZURvY3VtZW50UGFyc2VyKCkpIHsKKyAgICAgICAgICAgIGlmIChwYXJzZXItPmlz
UGFyc2luZygpKSB7CisgICAgICAgICAgICAgICAgLy8gRklYTUU6IEhUTUw1IGRvZXNuJ3QgdGVs
bCB1cyB0byBjaGVjayB0aGlzLCBpdCBtaWdodCBub3QgYmUgY29ycmVjdC4KKyAgICAgICAgICAg
ICAgICBpZiAocGFyc2VyLT5pc0V4ZWN1dGluZ1NjcmlwdCgpKQorICAgICAgICAgICAgICAgICAg
ICByZXR1cm47CisKKyAgICAgICAgICAgICAgICBpZiAoIXBhcnNlci0+d2FzQ3JlYXRlZEJ5U2Ny
aXB0KCkgJiYgcGFyc2VyLT5oYXNJbnNlcnRpb25Qb2ludCgpKQorICAgICAgICAgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobV9mcmFt
ZS0+bG9hZGVyKCktPnN0YXRlKCkgPT0gRnJhbWVTdGF0ZVByb3Zpc2lvbmFsKQorICAgICAgICAg
ICAgbV9mcmFtZS0+bG9hZGVyKCktPnN0b3BBbGxMb2FkZXJzKCk7CisgICAgfQorCisgICAgcmVt
b3ZlQWxsRXZlbnRMaXN0ZW5lcnMoKTsKKyAgICBpbXBsaWNpdE9wZW4oKTsKKyAgICBpZiAoU2Ny
aXB0YWJsZURvY3VtZW50UGFyc2VyKiBwYXJzZXIgPSBzY3JpcHRhYmxlRG9jdW1lbnRQYXJzZXIo
KSkKKyAgICAgICAgcGFyc2VyLT5zZXRXYXNDcmVhdGVkQnlTY3JpcHQodHJ1ZSk7CisKKyAgICBp
ZiAoRE9NV2luZG93KiBkb21XaW5kb3cgPSB0aGlzLT5kb21XaW5kb3coKSkKKyAgICAgICAgZG9t
V2luZG93LT5yZW1vdmVBbGxFdmVudExpc3RlbmVycygpOworCisgICAgaWYgKG1fZnJhbWUpCisg
ICAgICAgIG1fZnJhbWUtPmxvYWRlcigpLT5kaWRFeHBsaWNpdE9wZW4oKTsKK30KKwordm9pZCBE
b2N1bWVudDo6ZGV0YWNoUGFyc2VyKCkKK3sKKyAgICBpZiAoIW1fcGFyc2VyKQorICAgICAgICBy
ZXR1cm47CisgICAgbV9wYXJzZXItPmRldGFjaCgpOworICAgIG1fcGFyc2VyLmNsZWFyKCk7Cit9
CisKK3ZvaWQgRG9jdW1lbnQ6OmNhbmNlbFBhcnNpbmcoKQoreworICAgIGlmICghbV9wYXJzZXIp
CisgICAgICAgIHJldHVybjsKKworICAgIC8vIFdlIGhhdmUgdG8gY2xlYXIgdGhlIHBhcnNlciB0
byBhdm9pZCBwb3NzaWJseSB0cmlnZ2VyaW5nCisgICAgLy8gdGhlIG9ubG9hZCBoYW5kbGVyIHdo
ZW4gY2xvc2luZyBhcyBhIHNpZGUgZWZmZWN0IG9mIGEgY2FuY2VsLXN0eWxlCisgICAgLy8gY2hh
bmdlLCBzdWNoIGFzIG9wZW5pbmcgYSBuZXcgZG9jdW1lbnQgb3IgY2xvc2luZyB0aGUgd2luZG93
IHdoaWxlCisgICAgLy8gc3RpbGwgcGFyc2luZworICAgIGRldGFjaFBhcnNlcigpOworICAgIGV4
cGxpY2l0Q2xvc2UoKTsKK30KKwordm9pZCBEb2N1bWVudDo6aW1wbGljaXRPcGVuKCkKK3sKKyAg
ICBjYW5jZWxQYXJzaW5nKCk7CisKKyAgICByZW1vdmVDaGlsZHJlbigpOworCisgICAgc2V0Q29t
cGF0aWJpbGl0eU1vZGUoTm9RdWlya3NNb2RlKTsKKworICAgIG1fcGFyc2VyID0gY3JlYXRlUGFy
c2VyKCk7CisgICAgc2V0UGFyc2luZyh0cnVlKTsKKyAgICBzZXRSZWFkeVN0YXRlKExvYWRpbmcp
OworfQorCitIVE1MRWxlbWVudCogRG9jdW1lbnQ6OmJvZHkoKSBjb25zdAoreworICAgIE5vZGUq
IGRlID0gZG9jdW1lbnRFbGVtZW50KCk7CisgICAgaWYgKCFkZSkKKyAgICAgICAgcmV0dXJuIDA7
CisgICAgCisgICAgLy8gdHJ5IHRvIHByZWZlciBhIEZSQU1FU0VUIGVsZW1lbnQgb3ZlciBCT0RZ
CisgICAgTm9kZSogYm9keSA9IDA7CisgICAgZm9yIChOb2RlKiBpID0gZGUtPmZpcnN0Q2hpbGQo
KTsgaTsgaSA9IGktPm5leHRTaWJsaW5nKCkpIHsKKyAgICAgICAgaWYgKGktPmhhc1RhZ05hbWUo
ZnJhbWVzZXRUYWcpKQorICAgICAgICAgICAgcmV0dXJuIHRvSFRNTEVsZW1lbnQoaSk7CisgICAg
ICAgIAorICAgICAgICBpZiAoaS0+aGFzVGFnTmFtZShib2R5VGFnKSAmJiAhYm9keSkKKyAgICAg
ICAgICAgIGJvZHkgPSBpOworICAgIH0KKyAgICByZXR1cm4gdG9IVE1MRWxlbWVudChib2R5KTsK
K30KKwordm9pZCBEb2N1bWVudDo6c2V0Qm9keShQYXNzUmVmUHRyPEhUTUxFbGVtZW50PiBwcnBO
ZXdCb2R5LCBFeGNlcHRpb25Db2RlJiBlYykKK3sKKyAgICBSZWZQdHI8SFRNTEVsZW1lbnQ+IG5l
d0JvZHkgPSBwcnBOZXdCb2R5OworCisgICAgaWYgKCFuZXdCb2R5IHx8ICFkb2N1bWVudEVsZW1l
bnQoKSB8fCAhbmV3Qm9keS0+aGFzVGFnTmFtZShib2R5VGFnKSkgeyAKKyAgICAgICAgZWMgPSBI
SUVSQVJDSFlfUkVRVUVTVF9FUlI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAo
bmV3Qm9keS0+ZG9jdW1lbnQoKSAmJiBuZXdCb2R5LT5kb2N1bWVudCgpICE9IHRoaXMpIHsKKyAg
ICAgICAgZWMgPSAwOworICAgICAgICBSZWZQdHI8Tm9kZT4gbm9kZSA9IGltcG9ydE5vZGUobmV3
Qm9keS5nZXQoKSwgdHJ1ZSwgZWMpOworICAgICAgICBpZiAoZWMpCisgICAgICAgICAgICByZXR1
cm47CisgICAgICAgIAorICAgICAgICBuZXdCb2R5ID0gdG9IVE1MRWxlbWVudChub2RlLmdldCgp
KTsKKyAgICB9CisKKyAgICBIVE1MRWxlbWVudCogYiA9IGJvZHkoKTsKKyAgICBpZiAoIWIpCisg
ICAgICAgIGRvY3VtZW50RWxlbWVudCgpLT5hcHBlbmRDaGlsZChuZXdCb2R5LnJlbGVhc2UoKSwg
ZWMpOworICAgIGVsc2UKKyAgICAgICAgZG9jdW1lbnRFbGVtZW50KCktPnJlcGxhY2VDaGlsZChu
ZXdCb2R5LnJlbGVhc2UoKSwgYiwgZWMpOworfQorCitIVE1MSGVhZEVsZW1lbnQqIERvY3VtZW50
OjpoZWFkKCkKK3sKKyAgICBOb2RlKiBkZSA9IGRvY3VtZW50RWxlbWVudCgpOworICAgIGlmICgh
ZGUpCisgICAgICAgIHJldHVybiAwOworCisgICAgZm9yIChOb2RlKiBlID0gZGUtPmZpcnN0Q2hp
bGQoKTsgZTsgZSA9IGUtPm5leHRTaWJsaW5nKCkpCisgICAgICAgIGlmIChlLT5oYXNUYWdOYW1l
KGhlYWRUYWcpKQorICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEhUTUxIZWFkRWxlbWVu
dCo+KGUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmNsb3NlKCkKK3sK
KyAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIGZvbGxvdyB0aGUgc3BlY2lmaWNhdGlvbiBtb3JlIGNs
b3NlbHk6CisgICAgLy8gICAgICAgIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBw
cy9jdXJyZW50LXdvcmsvI2RvbS1kb2N1bWVudC1jbG9zZQorCisgICAgaWYgKCFzY3JpcHRhYmxl
RG9jdW1lbnRQYXJzZXIoKSB8fCAhc2NyaXB0YWJsZURvY3VtZW50UGFyc2VyKCktPndhc0NyZWF0
ZWRCeVNjcmlwdCgpIHx8ICFzY3JpcHRhYmxlRG9jdW1lbnRQYXJzZXIoKS0+aXNQYXJzaW5nKCkp
CisgICAgICAgIHJldHVybjsKKworICAgIGV4cGxpY2l0Q2xvc2UoKTsKK30KKwordm9pZCBEb2N1
bWVudDo6ZXhwbGljaXRDbG9zZSgpCit7CisgICAgaWYgKG1fcGFyc2VyKQorICAgICAgICBtX3Bh
cnNlci0+ZmluaXNoKCk7CisKKyAgICBpZiAoIW1fZnJhbWUpIHsKKyAgICAgICAgLy8gQmVjYXVz
ZSB3ZSBoYXZlIG5vIGZyYW1lLCB3ZSBkb24ndCBrbm93IGlmIGFsbCBsb2FkaW5nIGhhcyBjb21w
bGV0ZWQsCisgICAgICAgIC8vIHNvIHdlIGp1c3QgY2FsbCBpbXBsaWNpdENsb3NlKCkgaW1tZWRp
YXRlbHkuIEZJWE1FOiBUaGlzIG1pZ2h0IGZpcmUKKyAgICAgICAgLy8gdGhlIGxvYWQgZXZlbnQg
cHJlbWF0dXJlbHkgPGh0dHA6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE0NTY4
Pi4KKyAgICAgICAgaW1wbGljaXRDbG9zZSgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisg
ICAgbV9mcmFtZS0+bG9hZGVyKCktPmNoZWNrQ29tcGxldGVkKCk7Cit9CisKK3ZvaWQgRG9jdW1l
bnQ6OmltcGxpY2l0Q2xvc2UoKQoreworICAgIC8vIElmIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2Yg
cmVjYWxjU3R5bGUsIHdlIG5lZWQgdG8gZGVmZXIgdGhlIGNsb3NlIHVudGlsIHRoZSBzdHlsZSBp
bmZvcm1hdGlvbiBpcyBhY2N1cmF0ZSBhbmQgYWxsIGVsZW1lbnRzIGFyZSByZS1hdHRhY2hlZC4K
KyAgICBpZiAobV9pblN0eWxlUmVjYWxjKSB7CisgICAgICAgIG1fY2xvc2VBZnRlclN0eWxlUmVj
YWxjID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgd2FzTG9jYXRp
b25DaGFuZ2VQZW5kaW5nID0gZnJhbWUoKSAmJiBmcmFtZSgpLT5uYXZpZ2F0aW9uU2NoZWR1bGVy
KCktPmxvY2F0aW9uQ2hhbmdlUGVuZGluZygpOworICAgIGJvb2wgZG9sb2FkID0gIXBhcnNpbmco
KSAmJiBtX3BhcnNlciAmJiAhbV9wcm9jZXNzaW5nTG9hZEV2ZW50ICYmICF3YXNMb2NhdGlvbkNo
YW5nZVBlbmRpbmc7CisgICAgCisgICAgaWYgKCFkb2xvYWQpCisgICAgICAgIHJldHVybjsKKwor
ICAgIG1fcHJvY2Vzc2luZ0xvYWRFdmVudCA9IHRydWU7CisKKyAgICBTY3JpcHRhYmxlRG9jdW1l
bnRQYXJzZXIqIHBhcnNlciA9IHNjcmlwdGFibGVEb2N1bWVudFBhcnNlcigpOworICAgIG1fd2Vs
bEZvcm1lZCA9IHBhcnNlciAmJiBwYXJzZXItPndlbGxGb3JtZWQoKTsKKworICAgIC8vIFdlIGhh
dmUgdG8gY2xlYXIgdGhlIHBhcnNlciwgaW4gY2FzZSBzb21lb25lIGRvY3VtZW50LndyaXRlKClz
IGZyb20gdGhlCisgICAgLy8gb25Mb2FkIGV2ZW50IGhhbmRsZXIsIGFzIGluIFJhZGFyIDMyMDY1
MjQuCisgICAgZGV0YWNoUGFyc2VyKCk7CisKKyAgICAvLyBQYXJzZXIgc2hvdWxkIGhhdmUgcGlj
a2VkIHVwIGFsbCBwcmVsb2FkcyBieSBub3cKKyAgICBtX2NhY2hlZFJlc291cmNlTG9hZGVyLT5j
bGVhclByZWxvYWRzKCk7CisKKyAgICAvLyBGSVhNRTogV2Uga2ljayBvZmYgdGhlIGljb24gbG9h
ZGVyIHdoZW4gdGhlIERvY3VtZW50IGlzIGRvbmUgcGFyc2luZy4KKyAgICAvLyBUaGVyZSBhcmUg
ZWFybGllciBvcHBvcnR1bml0aWVzIHdlIGNvdWxkIHN0YXJ0IGl0OgorICAgIC8vICAtV2hlbiB0
aGUgPGhlYWQ+IGZpbmlzaGVzIHBhcnNpbmcKKyAgICAvLyAgLVdoZW4gYW55IG5ldyBIVE1MTGlu
a0VsZW1lbnQgaXMgaW5zZXJ0ZWQgaW50byB0aGUgZG9jdW1lbnQKKyAgICAvLyBCdXQgdGhvc2Ug
YWRkIGEgZHluYW1pYyBjb21wb25lbnQgdG8gdGhlIGZhdmljb24gdGhhdCBoYXMgVUkgCisgICAg
Ly8gcmFtaWZpY2F0aW9ucywgYW5kIHdlIG5lZWQgdG8gZGVjaWRlIHdoYXQgaXMgdGhlIFJpZ2h0
IFRoaW5nIFRvIERvKHRtKQorICAgIEZyYW1lKiBmID0gZnJhbWUoKTsKKyAgICBpZiAoZikgewor
ICAgICAgICBmLT5sb2FkZXIoKS0+aWNvbigpLT5zdGFydExvYWRlcigpOworICAgICAgICBmLT5h
bmltYXRpb24oKS0+cmVzdW1lQW5pbWF0aW9uc0ZvckRvY3VtZW50KHRoaXMpOworICAgIH0KKwor
ICAgIEltYWdlTG9hZGVyOjpkaXNwYXRjaFBlbmRpbmdCZWZvcmVMb2FkRXZlbnRzKCk7CisgICAg
SW1hZ2VMb2FkZXI6OmRpc3BhdGNoUGVuZGluZ0xvYWRFdmVudHMoKTsKKyAgICBJbWFnZUxvYWRl
cjo6ZGlzcGF0Y2hQZW5kaW5nRXJyb3JFdmVudHMoKTsKKworICAgIEhUTUxMaW5rRWxlbWVudDo6
ZGlzcGF0Y2hQZW5kaW5nTG9hZEV2ZW50cygpOworICAgIEhUTUxTdHlsZUVsZW1lbnQ6OmRpc3Bh
dGNoUGVuZGluZ0xvYWRFdmVudHMoKTsKKworI2lmIEVOQUJMRShTVkcpCisgICAgLy8gVG8gYWxp
Z24gdGhlIEhUTUwgbG9hZCBldmVudCBhbmQgdGhlIFNWR0xvYWQgZXZlbnQgZm9yIHRoZSBvdXRl
cm1vc3QgPHN2Zz4gZWxlbWVudCwgZmlyZSBpdCBmcm9tCisgICAgLy8gaGVyZSwgaW5zdGVhZCBv
ZiBkb2luZyBpdCBmcm9tIFNWR0VsZW1lbnQ6OmZpbmlzaGVkUGFyc2luZ0NoaWxkcmVuIChpZiBl
eHRlcm5hbFJlc291cmNlc1JlcXVpcmVkPSJmYWxzZSIsCisgICAgLy8gd2hpY2ggaXMgdGhlIGRl
ZmF1bHQsIGZvciA9J3RydWUnIGl0cyBmaXJlZCBhdCBhIGxhdGVyIHRpbWUsIG9uY2UgYWxsIGV4
dGVybmFsIHJlc291cmNlcyBmaW5pc2hlZCBsb2FkaW5nKS4KKyAgICBpZiAoc3ZnRXh0ZW5zaW9u
cygpKQorICAgICAgICBhY2Nlc3NTVkdFeHRlbnNpb25zKCktPmRpc3BhdGNoU1ZHTG9hZEV2ZW50
VG9PdXRlcm1vc3RTVkdFbGVtZW50cygpOworI2VuZGlmCisKKyAgICBkaXNwYXRjaFdpbmRvd0xv
YWRFdmVudCgpOworICAgIGVucXVldWVQYWdlc2hvd0V2ZW50KFBhZ2VzaG93RXZlbnROb3RQZXJz
aXN0ZWQpOworICAgIGVucXVldWVQb3BzdGF0ZUV2ZW50KG1fcGVuZGluZ1N0YXRlT2JqZWN0ID8g
bV9wZW5kaW5nU3RhdGVPYmplY3QucmVsZWFzZSgpIDogU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpu
dWxsVmFsdWUoKSk7CisgICAgCisgICAgaWYgKGYpCisgICAgICAgIGYtPmxvYWRlcigpLT5oYW5k
bGVkT25sb2FkRXZlbnRzKCk7CisjaWZkZWYgSU5TVFJVTUVOVF9MQVlPVVRfU0NIRURVTElORwor
ICAgIGlmICghb3duZXJFbGVtZW50KCkpCisgICAgICAgIHByaW50Zigib25sb2FkIGZpcmVkIGF0
ICVkXG4iLCBlbGFwc2VkVGltZSgpKTsKKyNlbmRpZgorCisgICAgLy8gQW4gZXZlbnQgaGFuZGxl
ciBtYXkgaGF2ZSByZW1vdmVkIHRoZSBmcmFtZQorICAgIGlmICghZnJhbWUoKSkgeworICAgICAg
ICBtX3Byb2Nlc3NpbmdMb2FkRXZlbnQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0K
KworICAgIC8vIE1ha2Ugc3VyZSBib3RoIHRoZSBpbml0aWFsIGxheW91dCBhbmQgcmVmbG93IGhh
cHBlbiBhZnRlciB0aGUgb25sb2FkCisgICAgLy8gZmlyZXMuIFRoaXMgd2lsbCBpbXByb3ZlIG9u
bG9hZCBzY29yZXMsIGFuZCBvdGhlciBicm93c2VycyBkbyBpdC4KKyAgICAvLyBJZiB0aGV5IHdh
bm5hIGNoZWF0LCB3ZSBjYW4gdG9vLiAtZHdoCisKKyAgICBpZiAoZnJhbWUoKS0+bmF2aWdhdGlv
blNjaGVkdWxlcigpLT5sb2NhdGlvbkNoYW5nZVBlbmRpbmcoKSAmJiBlbGFwc2VkVGltZSgpIDwg
Y0xheW91dFNjaGVkdWxlVGhyZXNob2xkKSB7CisgICAgICAgIC8vIEp1c3QgYmFpbCBvdXQuIEJl
Zm9yZSBvciBkdXJpbmcgdGhlIG9ubG9hZCB3ZSB3ZXJlIHNoaWZ0ZWQgdG8gYW5vdGhlciBwYWdl
LgorICAgICAgICAvLyBUaGUgb2xkIGktQmVuY2ggc3VpdGUgZG9lcyB0aGlzLiBXaGVuIHRoaXMg
aGFwcGVucyBkb24ndCBib3RoZXIgcGFpbnRpbmcgb3IgbGF5aW5nIG91dC4gICAgICAgIAorICAg
ICAgICBtX3Byb2Nlc3NpbmdMb2FkRXZlbnQgPSBmYWxzZTsKKyAgICAgICAgdmlldygpLT51bnNj
aGVkdWxlUmVsYXlvdXQoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZyYW1lKCkt
PmxvYWRlcigpLT5jaGVja0NhbGxJbXBsaWNpdENsb3NlKCk7CisgICAgUmVuZGVyT2JqZWN0KiBy
ZW5kZXJPYmplY3QgPSByZW5kZXJlcigpOworICAgIAorICAgIC8vIFdlIHVzZWQgdG8gZm9yY2Ug
YSBzeW5jaHJvbm91cyBkaXNwbGF5IGFuZCBmbHVzaCBoZXJlLiAgVGhpcyByZWFsbHkgaXNuJ3QK
KyAgICAvLyBuZWNlc3NhcnkgYW5kIGNhbiBpbiBmYWN0IGJlIGFjdGl2ZWx5IGhhcm1mdWwgaWYg
cGFnZXMgYXJlIGxvYWRpbmcgYXQgYSByYXRlIG9mID4gNjBmcHMKKyAgICAvLyAoaWYgeW91ciBw
bGF0Zm9ybSBpcyBzeW5jaW5nIGZsdXNoZXMgYW5kIGxpbWl0aW5nIHRoZW0gdG8gNjBmcHMpLgor
ICAgIG1fb3Zlck1pbmltdW1MYXlvdXRUaHJlc2hvbGQgPSB0cnVlOworICAgIGlmICghb3duZXJF
bGVtZW50KCkgfHwgKG93bmVyRWxlbWVudCgpLT5yZW5kZXJlcigpICYmICFvd25lckVsZW1lbnQo
KS0+cmVuZGVyZXIoKS0+bmVlZHNMYXlvdXQoKSkpIHsKKyAgICAgICAgdXBkYXRlU3R5bGVJZk5l
ZWRlZCgpOworICAgICAgICAKKyAgICAgICAgLy8gQWx3YXlzIGRvIGEgbGF5b3V0IGFmdGVyIGxv
YWRpbmcgaWYgbmVlZGVkLgorICAgICAgICBpZiAodmlldygpICYmIHJlbmRlck9iamVjdCAmJiAo
IXJlbmRlck9iamVjdC0+Zmlyc3RDaGlsZCgpIHx8IHJlbmRlck9iamVjdC0+bmVlZHNMYXlvdXQo
KSkpCisgICAgICAgICAgICB2aWV3KCktPmxheW91dCgpOworICAgIH0KKworICAgIG1fcHJvY2Vz
c2luZ0xvYWRFdmVudCA9IGZhbHNlOworCisjaWYgUExBVEZPUk0oTUFDKSB8fCBQTEFURk9STShD
SFJPTUlVTSkKKyAgICBpZiAoZiAmJiByZW5kZXJPYmplY3QgJiYgQVhPYmplY3RDYWNoZTo6YWNj
ZXNzaWJpbGl0eUVuYWJsZWQoKSkgeworICAgICAgICAvLyBUaGUgQVggY2FjaGUgbWF5IGhhdmUg
YmVlbiBjbGVhcmVkIGF0IHRoaXMgcG9pbnQsIGJ1dCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSBpdCBj
b250YWlucyBhbgorICAgICAgICAvLyBBWCBvYmplY3QgdG8gc2VuZCB0aGUgbm90aWZpY2F0aW9u
IHRvLiBnZXRPckNyZWF0ZSB3aWxsIG1ha2Ugc3VyZSB0aGF0IGFuIHZhbGlkIEFYIG9iamVjdAor
ICAgICAgICAvLyBleGlzdHMgaW4gdGhlIGNhY2hlICh3ZSBpZ25vcmUgdGhlIHJldHVybiB2YWx1
ZSBiZWNhdXNlIHdlIGRvbid0IG5lZWQgaXQgaGVyZSkuIFRoaXMgaXMgCisgICAgICAgIC8vIG9u
bHkgc2FmZSB0byBjYWxsIHdoZW4gYSBsYXlvdXQgaXMgbm90IGluIHByb2dyZXNzLCBzbyBpdCBj
YW4gbm90IGJlIHVzZWQgaW4gcG9zdE5vdGlmaWNhdGlvbi4gICAgCisgICAgICAgIGF4T2JqZWN0
Q2FjaGUoKS0+Z2V0T3JDcmVhdGUocmVuZGVyT2JqZWN0KTsKKyAgICAgICAgaWYgKHRoaXMgPT0g
dG9wRG9jdW1lbnQoKSkKKyAgICAgICAgICAgIGF4T2JqZWN0Q2FjaGUoKS0+cG9zdE5vdGlmaWNh
dGlvbihyZW5kZXJPYmplY3QsIEFYT2JqZWN0Q2FjaGU6OkFYTG9hZENvbXBsZXRlLCB0cnVlKTsK
KyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyBBWExvYWRDb21wbGV0ZSBjYW4gb25seSBi
ZSBwb3N0ZWQgb24gdGhlIHRvcCBkb2N1bWVudCwgc28gaWYgaXQncyBhIGRvY3VtZW50CisgICAg
ICAgICAgICAvLyBpbiBhbiBpZnJhbWUgdGhhdCBqdXN0IGZpbmlzaGVkIGxvYWRpbmcsIHBvc3Qg
QVhMYXlvdXRDb21wbGV0ZSBpbnN0ZWFkLgorICAgICAgICAgICAgYXhPYmplY3RDYWNoZSgpLT5w
b3N0Tm90aWZpY2F0aW9uKHJlbmRlck9iamVjdCwgQVhPYmplY3RDYWNoZTo6QVhMYXlvdXRDb21w
bGV0ZSwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworI2lmIEVOQUJMRShTVkcp
CisgICAgaWYgKHN2Z0V4dGVuc2lvbnMoKSkKKyAgICAgICAgYWNjZXNzU1ZHRXh0ZW5zaW9ucygp
LT5zdGFydEFuaW1hdGlvbnMoKTsKKyNlbmRpZgorfQorCit2b2lkIERvY3VtZW50OjpzZXRQYXJz
aW5nKGJvb2wgYikKK3sKKyAgICBtX2JQYXJzaW5nID0gYjsKKyAgICBpZiAoIW1fYlBhcnNpbmcg
JiYgdmlldygpKQorICAgICAgICB2aWV3KCktPnNjaGVkdWxlUmVsYXlvdXQoKTsKKworI2lmZGVm
IElOU1RSVU1FTlRfTEFZT1VUX1NDSEVEVUxJTkcKKyAgICBpZiAoIW93bmVyRWxlbWVudCgpICYm
ICFtX2JQYXJzaW5nKQorICAgICAgICBwcmludGYoIlBhcnNpbmcgZmluaXNoZWQgYXQgJWRcbiIs
IGVsYXBzZWRUaW1lKCkpOworI2VuZGlmCit9CisKK2Jvb2wgRG9jdW1lbnQ6OnNob3VsZFNjaGVk
dWxlTGF5b3V0KCkKK3sKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgb25seSBiZSBjYWxsZWQg
d2hlbiBGcmFtZVZpZXcgdGhpbmtzIGEgbGF5b3V0IGlzIG5lZWRlZC4KKyAgICAvLyBUaGlzIGVu
Zm9yY2VzIGEgY291cGxlIGV4dHJhIHJ1bGVzLgorICAgIC8vCisgICAgLy8gICAgKGEpIE9ubHkg
c2NoZWR1bGUgYSBsYXlvdXQgb25jZSB0aGUgc3R5bGVzaGVldHMgYXJlIGxvYWRlZC4KKyAgICAv
LyAgICAoYikgT25seSBzY2hlZHVsZSBsYXlvdXQgb25jZSB3ZSBoYXZlIGEgYm9keSBlbGVtZW50
LgorCisgICAgcmV0dXJuIChoYXZlU3R5bGVzaGVldHNMb2FkZWQoKSAmJiBib2R5KCkpCisgICAg
ICAgIHx8IChkb2N1bWVudEVsZW1lbnQoKSAmJiAhZG9jdW1lbnRFbGVtZW50KCktPmhhc1RhZ05h
bWUoaHRtbFRhZykpOworfQorICAgIAorYm9vbCBEb2N1bWVudDo6aXNMYXlvdXRUaW1lckFjdGl2
ZSgpCit7CisgICAgcmV0dXJuIHZpZXcoKSAmJiB2aWV3KCktPmxheW91dFBlbmRpbmcoKSAmJiAh
bWluaW11bUxheW91dERlbGF5KCk7Cit9CisKK2ludCBEb2N1bWVudDo6bWluaW11bUxheW91dERl
bGF5KCkKK3sKKyAgICBpZiAobV9vdmVyTWluaW11bUxheW91dFRocmVzaG9sZCkKKyAgICAgICAg
cmV0dXJuIDA7CisgICAgCisgICAgaW50IGVsYXBzZWQgPSBlbGFwc2VkVGltZSgpOworICAgIG1f
b3Zlck1pbmltdW1MYXlvdXRUaHJlc2hvbGQgPSBlbGFwc2VkID4gY0xheW91dFNjaGVkdWxlVGhy
ZXNob2xkOworICAgIAorICAgIC8vIFdlJ2xsIHdhbnQgdG8gc2NoZWR1bGUgdGhlIHRpbWVyIHRv
IGZpcmUgYXQgdGhlIG1pbmltdW0gbGF5b3V0IHRocmVzaG9sZC4KKyAgICByZXR1cm4gbWF4KDAs
IGNMYXlvdXRTY2hlZHVsZVRocmVzaG9sZCAtIGVsYXBzZWQpOworfQorCitpbnQgRG9jdW1lbnQ6
OmVsYXBzZWRUaW1lKCkgY29uc3QKK3sKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PigoY3Vy
cmVudFRpbWUoKSAtIG1fc3RhcnRUaW1lKSAqIDEwMDApOworfQorCit2b2lkIERvY3VtZW50Ojp3
cml0ZShjb25zdCBTZWdtZW50ZWRTdHJpbmcmIHRleHQsIERvY3VtZW50KiBvd25lckRvY3VtZW50
KQoreworICAgIE5lc3RpbmdMZXZlbEluY3JlbWVudGVyIG5lc3RpbmdMZXZlbEluY3JlbWVudGVy
KG1fd3JpdGVSZWN1cnNpb25EZXB0aCk7CisKKyAgICBtX3dyaXRlUmVjdXJzaW9uSXNUb29EZWVw
ID0gKG1fd3JpdGVSZWN1cnNpb25EZXB0aCA+IDEpICYmIG1fd3JpdGVSZWN1cnNpb25Jc1Rvb0Rl
ZXA7CisgICAgbV93cml0ZVJlY3Vyc2lvbklzVG9vRGVlcCA9IChtX3dyaXRlUmVjdXJzaW9uRGVw
dGggPiBjTWF4V3JpdGVSZWN1cnNpb25EZXB0aCkgfHwgbV93cml0ZVJlY3Vyc2lvbklzVG9vRGVl
cDsKKworICAgIGlmIChtX3dyaXRlUmVjdXJzaW9uSXNUb29EZWVwKQorICAgICAgIHJldHVybjsK
KworI2lmZGVmIElOU1RSVU1FTlRfTEFZT1VUX1NDSEVEVUxJTkcKKyAgICBpZiAoIW93bmVyRWxl
bWVudCgpKQorICAgICAgICBwcmludGYoIkJlZ2lubmluZyBhIGRvY3VtZW50LndyaXRlIGF0ICVk
XG4iLCBlbGFwc2VkVGltZSgpKTsKKyNlbmRpZgorCisgICAgYm9vbCBoYXNJbnNlcnRpb25Qb2lu
dCA9IG1fcGFyc2VyICYmIG1fcGFyc2VyLT5oYXNJbnNlcnRpb25Qb2ludCgpOworICAgIGlmICgh
aGFzSW5zZXJ0aW9uUG9pbnQgJiYgbV9pZ25vcmVEZXN0cnVjdGl2ZVdyaXRlQ291bnQpCisgICAg
ICAgIHJldHVybjsKKworICAgIGlmICghaGFzSW5zZXJ0aW9uUG9pbnQpCisgICAgICAgIG9wZW4o
b3duZXJEb2N1bWVudCk7CisKKyAgICBBU1NFUlQobV9wYXJzZXIpOworICAgIG1fcGFyc2VyLT5p
bnNlcnQodGV4dCk7CisKKyNpZmRlZiBJTlNUUlVNRU5UX0xBWU9VVF9TQ0hFRFVMSU5HCisgICAg
aWYgKCFvd25lckVsZW1lbnQoKSkKKyAgICAgICAgcHJpbnRmKCJFbmRpbmcgYSBkb2N1bWVudC53
cml0ZSBhdCAlZFxuIiwgZWxhcHNlZFRpbWUoKSk7CisjZW5kaWYgICAgCit9CisKK3ZvaWQgRG9j
dW1lbnQ6OndyaXRlKGNvbnN0IFN0cmluZyYgdGV4dCwgRG9jdW1lbnQqIG93bmVyRG9jdW1lbnQp
Cit7CisgICAgd3JpdGUoU2VnbWVudGVkU3RyaW5nKHRleHQpLCBvd25lckRvY3VtZW50KTsKK30K
Kwordm9pZCBEb2N1bWVudDo6d3JpdGVsbihjb25zdCBTdHJpbmcmIHRleHQsIERvY3VtZW50KiBv
d25lckRvY3VtZW50KQoreworICAgIHdyaXRlKHRleHQsIG93bmVyRG9jdW1lbnQpOworICAgIHdy
aXRlKCJcbiIsIG93bmVyRG9jdW1lbnQpOworfQorCitjb25zdCBLVVJMJiBEb2N1bWVudDo6dmly
dHVhbFVSTCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fdXJsOworfQorCitLVVJMIERvY3VtZW50
Ojp2aXJ0dWFsQ29tcGxldGVVUkwoY29uc3QgU3RyaW5nJiB1cmwpIGNvbnN0Cit7CisgICAgcmV0
dXJuIGNvbXBsZXRlVVJMKHVybCk7Cit9CisKK2RvdWJsZSBEb2N1bWVudDo6bWluaW11bVRpbWVy
SW50ZXJ2YWwoKSBjb25zdAoreworICAgIFBhZ2UqIHAgPSBwYWdlKCk7CisgICAgaWYgKCFwKQor
ICAgICAgICByZXR1cm4gU2NyaXB0RXhlY3V0aW9uQ29udGV4dDo6bWluaW11bVRpbWVySW50ZXJ2
YWwoKTsKKyAgICByZXR1cm4gcC0+c2V0dGluZ3MoKS0+bWluRE9NVGltZXJJbnRlcnZhbCgpOwor
fQorCitFdmVudFRhcmdldCogRG9jdW1lbnQ6OmVycm9yRXZlbnRUYXJnZXQoKQoreworICAgIHJl
dHVybiBkb21XaW5kb3coKTsKK30KKwordm9pZCBEb2N1bWVudDo6bG9nRXhjZXB0aW9uVG9Db25z
b2xlKGNvbnN0IFN0cmluZyYgZXJyb3JNZXNzYWdlLCBjb25zdCBTdHJpbmcmIHNvdXJjZVVSTCwg
aW50IGxpbmVOdW1iZXIsIFBhc3NSZWZQdHI8U2NyaXB0Q2FsbFN0YWNrPiBjYWxsU3RhY2spCit7
CisgICAgYWRkQ29uc29sZU1lc3NhZ2UoSlNNZXNzYWdlU291cmNlLCBMb2dNZXNzYWdlVHlwZSwg
RXJyb3JNZXNzYWdlTGV2ZWwsIGVycm9yTWVzc2FnZSwgc291cmNlVVJMLCBsaW5lTnVtYmVyLCBj
YWxsU3RhY2spOworfQorCit2b2lkIERvY3VtZW50OjpzZXRVUkwoY29uc3QgS1VSTCYgdXJsKQor
eworICAgIGNvbnN0IEtVUkwmIG5ld1VSTCA9IHVybC5pc0VtcHR5KCkgPyBibGFua1VSTCgpIDog
dXJsOworICAgIGlmIChuZXdVUkwgPT0gbV91cmwpCisgICAgICAgIHJldHVybjsKKworICAgIG1f
dXJsID0gbmV3VVJMOworICAgIG1fZG9jdW1lbnRVUkkgPSBtX3VybC5zdHJpbmcoKTsKKyAgICB1
cGRhdGVCYXNlVVJMKCk7CisgICAgY29udGV4dEZlYXR1cmVzKCktPnVybERpZENoYW5nZSh0aGlz
KTsKK30KKwordm9pZCBEb2N1bWVudDo6dXBkYXRlQmFzZVVSTCgpCit7CisgICAgS1VSTCBvbGRC
YXNlVVJMID0gbV9iYXNlVVJMOworICAgIC8vIERPTSAzIENvcmU6IFdoZW4gdGhlIERvY3VtZW50
IHN1cHBvcnRzIHRoZSBmZWF0dXJlICJIVE1MIiBbRE9NIExldmVsIDIgSFRNTF0sIHRoZSBiYXNl
IFVSSSBpcyBjb21wdXRlZCB1c2luZworICAgIC8vIGZpcnN0IHRoZSB2YWx1ZSBvZiB0aGUgaHJl
ZiBhdHRyaWJ1dGUgb2YgdGhlIEhUTUwgQkFTRSBlbGVtZW50IGlmIGFueSwgYW5kIHRoZSB2YWx1
ZSBvZiB0aGUgZG9jdW1lbnRVUkkgYXR0cmlidXRlCisgICAgLy8gZnJvbSB0aGUgRG9jdW1lbnQg
aW50ZXJmYWNlIG90aGVyd2lzZS4KKyAgICBpZiAoIW1fYmFzZUVsZW1lbnRVUkwuaXNFbXB0eSgp
KQorICAgICAgICBtX2Jhc2VVUkwgPSBtX2Jhc2VFbGVtZW50VVJMOworICAgIGVsc2UgaWYgKCFt
X2Jhc2VVUkxPdmVycmlkZS5pc0VtcHR5KCkpCisgICAgICAgIG1fYmFzZVVSTCA9IG1fYmFzZVVS
TE92ZXJyaWRlOworICAgIGVsc2UgeworICAgICAgICAvLyBUaGUgZG9jdW1lbnRVUkkgYXR0cmli
dXRlIGlzIHJlYWQtb25seSBmcm9tIEphdmFTY3JpcHQsIGJ1dCB3cml0YWJsZSBmcm9tIE9iamVj
dGl2ZSBDLCBzbyB3ZSBuZWVkIHRvIHJldGFpbgorICAgICAgICAvLyB0aGlzIGZhbGxiYWNrIGJl
aGF2aW9yLiBXZSB1c2UgYSBudWxsIGJhc2UgVVJMLCBzaW5jZSB0aGUgZG9jdW1lbnRVUkkgYXR0
cmlidXRlIGlzIGFuIGFyYml0cmFyeSBzdHJpbmcKKyAgICAgICAgLy8gYW5kIERPTSAzIENvcmUg
ZG9lcyBub3Qgc3BlY2lmeSBob3cgaXQgc2hvdWxkIGJlIHJlc29sdmVkLgorICAgICAgICBtX2Jh
c2VVUkwgPSBLVVJMKEtVUkwoKSwgZG9jdW1lbnRVUkkoKSk7CisgICAgfQorICAgIHNlbGVjdG9y
UXVlcnlDYWNoZSgpLT5pbnZhbGlkYXRlKCk7CisKKyAgICBpZiAoIW1fYmFzZVVSTC5pc1ZhbGlk
KCkpCisgICAgICAgIG1fYmFzZVVSTCA9IEtVUkwoKTsKKworICAgIGlmIChtX2VsZW1TaGVldCkg
eworICAgICAgICAvLyBFbGVtZW50IHNoZWV0IGlzIHNpbGx5LiBJdCBuZXZlciBjb250YWlucyBh
bnl0aGluZy4KKyAgICAgICAgQVNTRVJUKCFtX2VsZW1TaGVldC0+Y29udGVudHMoKS0+cnVsZUNv
dW50KCkpOworICAgICAgICBib29sIHVzZXNSZW1Vbml0cyA9IG1fZWxlbVNoZWV0LT5jb250ZW50
cygpLT51c2VzUmVtVW5pdHMoKTsKKyAgICAgICAgbV9lbGVtU2hlZXQgPSBDU1NTdHlsZVNoZWV0
OjpjcmVhdGVJbmxpbmUodGhpcywgbV9iYXNlVVJMKTsKKyAgICAgICAgLy8gRklYTUU6IFNvIHdl
IGFyZSBub3QgcmVhbGx5IHRoZSBwYXJzZXIuIFRoZSByaWdodCBmaXggaXMgdG8gZWxpbWluYXRl
IHRoZSBlbGVtZW50IHNoZWV0IGNvbXBsZXRlbHkuCisgICAgICAgIG1fZWxlbVNoZWV0LT5jb250
ZW50cygpLT5wYXJzZXJTZXRVc2VzUmVtVW5pdHModXNlc1JlbVVuaXRzKTsKKyAgICB9CisKKyAg
ICBpZiAoIWVxdWFsSWdub3JpbmdGcmFnbWVudElkZW50aWZpZXIob2xkQmFzZVVSTCwgbV9iYXNl
VVJMKSkgeworICAgICAgICAvLyBCYXNlIFVSTCBjaGFuZ2UgY2hhbmdlcyBhbnkgcmVsYXRpdmUg
dmlzaXRlZCBsaW5rcy4KKyAgICAgICAgLy8gRklYTUU6IFRoZXJlIGFyZSBvdGhlciBVUkxzIGlu
IHRoZSB0cmVlIHRoYXQgd291bGQgbmVlZCB0byBiZSByZS1ldmFsdWF0ZWQgb24gZHluYW1pYyBi
YXNlIFVSTCBjaGFuZ2UuIFN0eWxlIHNob3VsZCBiZSBpbnZhbGlkYXRlZCB0b28uCisgICAgICAg
IGZvciAoTm9kZSogbm9kZSA9IGZpcnN0Q2hpbGQoKTsgbm9kZTsgbm9kZSA9IG5vZGUtPnRyYXZl
cnNlTmV4dE5vZGUoKSkgeworICAgICAgICAgICAgaWYgKG5vZGUtPmhhc1RhZ05hbWUoYVRhZykp
CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTEFuY2hvckVsZW1lbnQqPihub2RlKS0+
aW52YWxpZGF0ZUNhY2hlZFZpc2l0ZWRMaW5rSGFzaCgpOworICAgICAgICB9CisgICAgfQorfQor
Cit2b2lkIERvY3VtZW50OjpzZXRCYXNlVVJMT3ZlcnJpZGUoY29uc3QgS1VSTCYgdXJsKQorewor
ICAgIG1fYmFzZVVSTE92ZXJyaWRlID0gdXJsOworICAgIHVwZGF0ZUJhc2VVUkwoKTsKK30KKwor
dm9pZCBEb2N1bWVudDo6cHJvY2Vzc0Jhc2VFbGVtZW50KCkKK3sKKyAgICAvLyBGaW5kIHRoZSBm
aXJzdCBocmVmIGF0dHJpYnV0ZSBpbiBhIGJhc2UgZWxlbWVudCBhbmQgdGhlIGZpcnN0IHRhcmdl
dCBhdHRyaWJ1dGUgaW4gYSBiYXNlIGVsZW1lbnQuCisgICAgY29uc3QgQXRvbWljU3RyaW5nKiBo
cmVmID0gMDsKKyAgICBjb25zdCBBdG9taWNTdHJpbmcqIHRhcmdldCA9IDA7CisgICAgZm9yIChO
b2RlKiBub2RlID0gZG9jdW1lbnQoKS0+Zmlyc3RDaGlsZCgpOyBub2RlICYmICghaHJlZiB8fCAh
dGFyZ2V0KTsgbm9kZSA9IG5vZGUtPnRyYXZlcnNlTmV4dE5vZGUoKSkgeworICAgICAgICBpZiAo
bm9kZS0+aGFzVGFnTmFtZShiYXNlVGFnKSkgeworICAgICAgICAgICAgaWYgKCFocmVmKSB7Cisg
ICAgICAgICAgICAgICAgY29uc3QgQXRvbWljU3RyaW5nJiB2YWx1ZSA9IHN0YXRpY19jYXN0PEVs
ZW1lbnQqPihub2RlKS0+ZmFzdEdldEF0dHJpYnV0ZShocmVmQXR0cik7CisgICAgICAgICAgICAg
ICAgaWYgKCF2YWx1ZS5pc051bGwoKSkKKyAgICAgICAgICAgICAgICAgICAgaHJlZiA9ICZ2YWx1
ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghdGFyZ2V0KSB7CisgICAgICAgICAg
ICAgICAgY29uc3QgQXRvbWljU3RyaW5nJiB2YWx1ZSA9IHN0YXRpY19jYXN0PEVsZW1lbnQqPihu
b2RlKS0+ZmFzdEdldEF0dHJpYnV0ZSh0YXJnZXRBdHRyKTsKKyAgICAgICAgICAgICAgICBpZiAo
IXZhbHVlLmlzTnVsbCgpKQorICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSAmdmFsdWU7Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBGSVhNRTogU2luY2UgdGhp
cyBkb2Vzbid0IHNoYXJlIGNvZGUgd2l0aCBjb21wbGV0ZVVSTCBpdCBtYXkgbm90IGhhbmRsZSBl
bmNvZGluZ3MgY29ycmVjdGx5LgorICAgIEtVUkwgYmFzZUVsZW1lbnRVUkw7CisgICAgaWYgKGhy
ZWYpIHsKKyAgICAgICAgU3RyaW5nIHN0cmlwcGVkSHJlZiA9IHN0cmlwTGVhZGluZ0FuZFRyYWls
aW5nSFRNTFNwYWNlcygqaHJlZik7CisgICAgICAgIGlmICghc3RyaXBwZWRIcmVmLmlzRW1wdHko
KSkKKyAgICAgICAgICAgIGJhc2VFbGVtZW50VVJMID0gS1VSTCh1cmwoKSwgc3RyaXBwZWRIcmVm
KTsKKyAgICB9CisgICAgaWYgKG1fYmFzZUVsZW1lbnRVUkwgIT0gYmFzZUVsZW1lbnRVUkwpIHsK
KyAgICAgICAgbV9iYXNlRWxlbWVudFVSTCA9IGJhc2VFbGVtZW50VVJMOworICAgICAgICB1cGRh
dGVCYXNlVVJMKCk7CisgICAgfQorCisgICAgbV9iYXNlVGFyZ2V0ID0gdGFyZ2V0ID8gKnRhcmdl
dCA6IG51bGxBdG9tOworfQorCitTdHJpbmcgRG9jdW1lbnQ6OnVzZXJBZ2VudChjb25zdCBLVVJM
JiB1cmwpIGNvbnN0Cit7CisgICAgcmV0dXJuIGZyYW1lKCkgPyBmcmFtZSgpLT5sb2FkZXIoKS0+
dXNlckFnZW50KHVybCkgOiBTdHJpbmcoKTsKK30KKwordm9pZCBEb2N1bWVudDo6ZGlzYWJsZUV2
YWwoY29uc3QgU3RyaW5nJiBlcnJvck1lc3NhZ2UpCit7CisgICAgaWYgKCFmcmFtZSgpKQorICAg
ICAgICByZXR1cm47CisKKyAgICBmcmFtZSgpLT5zY3JpcHQoKS0+ZGlzYWJsZUV2YWwoZXJyb3JN
ZXNzYWdlKTsKK30KKworYm9vbCBEb2N1bWVudDo6Y2FuTmF2aWdhdGUoRnJhbWUqIHRhcmdldEZy
YW1lKQoreworICAgIGlmICghbV9mcmFtZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
Ly8gRklYTUU6IFdlIHNob3VsZG4ndCBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aG91dCBhIHRhcmdl
dCBmcmFtZSwgYnV0CisgICAgLy8gZmFzdC9mb3Jtcy9zdWJtaXQtdG8tYmxhbmstbXVsdGlwbGUt
dGltZXMuaHRtbCBkZXBlbmRzIG9uIHRoaXMgZnVuY3Rpb24KKyAgICAvLyByZXR1cm5pbmcgdHJ1
ZSB3aGVuIHN1cHBsaWVkIHdpdGggYSAwIHRhcmdldEZyYW1lLgorICAgIGlmICghdGFyZ2V0RnJh
bWUpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gRnJhbWUtYnVzdGluZyBpcyBnZW5l
cmFsbHkgYWxsb3dlZCAodW5sZXNzIHdlJ3JlIHNhbmRib3hlZCBhbmQgcHJldmVudCBmcm9tIGZy
YW1lLWJ1c3RpbmcpLgorICAgIGlmICghaXNTYW5kYm94ZWQoU2FuZGJveFRvcE5hdmlnYXRpb24p
ICYmIHRhcmdldEZyYW1lID09IG1fZnJhbWUtPnRyZWUoKS0+dG9wKCkpCisgICAgICAgIHJldHVy
biB0cnVlOworCisgICAgaWYgKGlzU2FuZGJveGVkKFNhbmRib3hOYXZpZ2F0aW9uKSkgeworICAg
ICAgICBpZiAodGFyZ2V0RnJhbWUtPnRyZWUoKS0+aXNEZXNjZW5kYW50T2YobV9mcmFtZSkpCisg
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICBwcmludE5hdmlnYXRpb25FcnJvck1l
c3NhZ2UodGFyZ2V0RnJhbWUsIHVybCgpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0K
KworICAgIC8vIFRoaXMgaXMgdGhlIG5vcm1hbCBjYXNlLiBBIGRvY3VtZW50IGNhbiBuYXZpZ2F0
ZSBpdHMgZGVjZW5kYW50IGZyYW1lcywKKyAgICAvLyBvciwgbW9yZSBnZW5lcmFsbHksIGEgZG9j
dW1lbnQgY2FuIG5hdmlnYXRlIGEgZnJhbWUgaWYgdGhlIGRvY3VtZW50IGlzCisgICAgLy8gaW4g
dGhlIHNhbWUgb3JpZ2luIGFzIGFueSBvZiB0aGF0IGZyYW1lJ3MgYW5jZXN0b3JzIChpbiB0aGUg
ZnJhbWUKKyAgICAvLyBoaWVyYXJjaHkpLgorICAgIC8vCisgICAgLy8gU2VlIGh0dHA6Ly93d3cu
YWRhbWJhcnRoLmNvbS9wYXBlcnMvMjAwOC9iYXJ0aC1qYWNrc29uLW1pdGNoZWxsLnBkZiBmb3IK
KyAgICAvLyBoaXN0b3JpY2FsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgc2VjdXJpdHkgY2hlY2su
CisgICAgaWYgKGNhbkFjY2Vzc0FuY2VzdG9yKHNlY3VyaXR5T3JpZ2luKCksIHRhcmdldEZyYW1l
KSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBUb3AtbGV2ZWwgZnJhbWVzIGFyZSBl
YXNpZXIgdG8gbmF2aWdhdGUgdGhhbiBvdGhlciBmcmFtZXMgYmVjYXVzZSB0aGV5CisgICAgLy8g
ZGlzcGxheSB0aGVpciBVUkxzIGluIHRoZSBhZGRyZXNzIGJhciAoaW4gbW9zdCBicm93c2Vycyku
IEhvd2V2ZXIsIHRoZXJlCisgICAgLy8gYXJlIHN0aWxsIHNvbWUgcmVzdHJpY3Rpb25zIG9uIG5h
dmlnYXRpb24gdG8gYXZvaWQgbnVpc2FuY2UgYXR0YWNrcy4KKyAgICAvLyBTcGVjaWZpY2FsbHks
IGEgZG9jdW1lbnQgY2FuIG5hdmlnYXRlIGEgdG9wLWxldmVsIGZyYW1lIGlmIHRoYXQgZnJhbWUK
KyAgICAvLyBvcGVuZWQgdGhlIGRvY3VtZW50IG9yIGlmIHRoZSBkb2N1bWVudCBpcyB0aGUgc2Ft
ZS1vcmlnaW4gd2l0aCBhbnkgb2YKKyAgICAvLyB0aGUgdG9wLWxldmVsIGZyYW1lJ3Mgb3BlbmVy
J3MgYW5jZXN0b3JzIChpbiB0aGUgZnJhbWUgaGllcmFyY2h5KS4KKyAgICAvLworICAgIC8vIElu
IGJvdGggb2YgdGhlc2UgY2FzZXMsIHRoZSBkb2N1bWVudCBwZXJmb3JtaW5nIHRoZSBuYXZpZ2F0
aW9uIGlzIGluCisgICAgLy8gc29tZSB3YXkgcmVsYXRlZCB0byB0aGUgZnJhbWUgYmVpbmcgbmF2
aWdhdGUgKGUuZy4sIGJ5IHRoZSAib3BlbmVyIgorICAgIC8vIGFuZC9vciAicGFyZW50IiByZWxh
dGlvbikuIFJlcXVpcmluZyBzb21lIHNvcnQgb2YgcmVsYXRpb24gcHJldmVudHMgYQorICAgIC8v
IGRvY3VtZW50IGZyb20gbmF2aWdhdGluZyBhcmJpdHJhcnksIHVucmVsYXRlZCB0b3AtbGV2ZWwg
ZnJhbWVzLgorICAgIGlmICghdGFyZ2V0RnJhbWUtPnRyZWUoKS0+cGFyZW50KCkpIHsKKyAgICAg
ICAgaWYgKHRhcmdldEZyYW1lID09IG1fZnJhbWUtPmxvYWRlcigpLT5vcGVuZXIoKSkKKyAgICAg
ICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIGlmIChjYW5BY2Nlc3NBbmNlc3RvcihzZWN1
cml0eU9yaWdpbigpLCB0YXJnZXRGcmFtZS0+bG9hZGVyKCktPm9wZW5lcigpKSkKKyAgICAgICAg
ICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaW50TmF2aWdhdGlvbkVycm9yTWVzc2Fn
ZSh0YXJnZXRGcmFtZSwgdXJsKCkpOworICAgIHJldHVybiBmYWxzZTsKK30KKworRnJhbWUqIERv
Y3VtZW50OjpmaW5kVW5zYWZlUGFyZW50U2Nyb2xsUHJvcGFnYXRpb25Cb3VuZGFyeSgpCit7Cisg
ICAgRnJhbWUqIGN1cnJlbnRGcmFtZSA9IG1fZnJhbWU7CisgICAgRnJhbWUqIGFuY2VzdG9yRnJh
bWUgPSBjdXJyZW50RnJhbWUtPnRyZWUoKS0+cGFyZW50KCk7IAorCisgICAgd2hpbGUgKGFuY2Vz
dG9yRnJhbWUpIHsKKyAgICAgICAgaWYgKCFhbmNlc3RvckZyYW1lLT5kb2N1bWVudCgpLT5zZWN1
cml0eU9yaWdpbigpLT5jYW5BY2Nlc3Moc2VjdXJpdHlPcmlnaW4oKSkpCisgICAgICAgICAgICBy
ZXR1cm4gY3VycmVudEZyYW1lOworICAgICAgICBjdXJyZW50RnJhbWUgPSBhbmNlc3RvckZyYW1l
OworICAgICAgICBhbmNlc3RvckZyYW1lID0gYW5jZXN0b3JGcmFtZS0+dHJlZSgpLT5wYXJlbnQo
KTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK0NTU1N0eWxlU2hlZXQqIERvY3VtZW50Ojpw
YWdlVXNlclNoZWV0KCkKK3sKKyAgICBpZiAobV9wYWdlVXNlclNoZWV0KQorICAgICAgICByZXR1
cm4gbV9wYWdlVXNlclNoZWV0LmdldCgpOworICAgIAorICAgIFBhZ2UqIG93bmluZ1BhZ2UgPSBw
YWdlKCk7CisgICAgaWYgKCFvd25pbmdQYWdlKQorICAgICAgICByZXR1cm4gMDsKKyAgICAKKyAg
ICBTdHJpbmcgdXNlclNoZWV0VGV4dCA9IG93bmluZ1BhZ2UtPnVzZXJTdHlsZVNoZWV0KCk7Cisg
ICAgaWYgKHVzZXJTaGVldFRleHQuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICAK
KyAgICAvLyBQYXJzZSB0aGUgc2hlZXQgYW5kIGNhY2hlIGl0LgorICAgIG1fcGFnZVVzZXJTaGVl
dCA9IENTU1N0eWxlU2hlZXQ6OmNyZWF0ZUlubGluZSh0aGlzLCBzZXR0aW5ncygpLT51c2VyU3R5
bGVTaGVldExvY2F0aW9uKCkpOworICAgIG1fcGFnZVVzZXJTaGVldC0+Y29udGVudHMoKS0+c2V0
SXNVc2VyU3R5bGVTaGVldCh0cnVlKTsKKyAgICBtX3BhZ2VVc2VyU2hlZXQtPmNvbnRlbnRzKCkt
PnBhcnNlU3RyaW5nKHVzZXJTaGVldFRleHQpOworICAgIHJldHVybiBtX3BhZ2VVc2VyU2hlZXQu
Z2V0KCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmNsZWFyUGFnZVVzZXJTaGVldCgpCit7CisgICAg
aWYgKG1fcGFnZVVzZXJTaGVldCkgeworICAgICAgICBtX3BhZ2VVc2VyU2hlZXQgPSAwOworICAg
ICAgICBzdHlsZVJlc29sdmVyQ2hhbmdlZChEZWZlclJlY2FsY1N0eWxlKTsKKyAgICB9Cit9CisK
K3ZvaWQgRG9jdW1lbnQ6OnVwZGF0ZVBhZ2VVc2VyU2hlZXQoKQoreworICAgIGNsZWFyUGFnZVVz
ZXJTaGVldCgpOworICAgIGlmIChwYWdlVXNlclNoZWV0KCkpCisgICAgICAgIHN0eWxlUmVzb2x2
ZXJDaGFuZ2VkKFJlY2FsY1N0eWxlSW1tZWRpYXRlbHkpOworfQorCitjb25zdCBWZWN0b3I8UmVm
UHRyPENTU1N0eWxlU2hlZXQ+ID4qIERvY3VtZW50OjpwYWdlR3JvdXBVc2VyU2hlZXRzKCkgY29u
c3QKK3sKKyAgICBpZiAobV9wYWdlR3JvdXBVc2VyU2hlZXRDYWNoZVZhbGlkKQorICAgICAgICBy
ZXR1cm4gbV9wYWdlR3JvdXBVc2VyU2hlZXRzLmdldCgpOworICAgIAorICAgIG1fcGFnZUdyb3Vw
VXNlclNoZWV0Q2FjaGVWYWxpZCA9IHRydWU7CisgICAgCisgICAgUGFnZSogb3duaW5nUGFnZSA9
IHBhZ2UoKTsKKyAgICBpZiAoIW93bmluZ1BhZ2UpCisgICAgICAgIHJldHVybiAwOworICAgICAg
ICAKKyAgICBjb25zdCBQYWdlR3JvdXAmIHBhZ2VHcm91cCA9IG93bmluZ1BhZ2UtPmdyb3VwKCk7
CisgICAgY29uc3QgVXNlclN0eWxlU2hlZXRNYXAqIHNoZWV0c01hcCA9IHBhZ2VHcm91cC51c2Vy
U3R5bGVTaGVldHMoKTsKKyAgICBpZiAoIXNoZWV0c01hcCkKKyAgICAgICAgcmV0dXJuIDA7CisK
KyAgICBVc2VyU3R5bGVTaGVldE1hcDo6Y29uc3RfaXRlcmF0b3IgZW5kID0gc2hlZXRzTWFwLT5l
bmQoKTsKKyAgICBmb3IgKFVzZXJTdHlsZVNoZWV0TWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IHNo
ZWV0c01hcC0+YmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgIGNvbnN0IFVzZXJT
dHlsZVNoZWV0VmVjdG9yKiBzaGVldHMgPSBpdC0+c2Vjb25kLmdldCgpOworICAgICAgICBmb3Ig
KHVuc2lnbmVkIGkgPSAwOyBpIDwgc2hlZXRzLT5zaXplKCk7ICsraSkgeworICAgICAgICAgICAg
Y29uc3QgVXNlclN0eWxlU2hlZXQqIHNoZWV0ID0gc2hlZXRzLT5hdChpKS5nZXQoKTsKKyAgICAg
ICAgICAgIGlmIChzaGVldC0+aW5qZWN0ZWRGcmFtZXMoKSA9PSBJbmplY3RJblRvcEZyYW1lT25s
eSAmJiBvd25lckVsZW1lbnQoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
ICAgIGlmICghVXNlckNvbnRlbnRVUkxQYXR0ZXJuOjptYXRjaGVzUGF0dGVybnModXJsKCksIHNo
ZWV0LT53aGl0ZWxpc3QoKSwgc2hlZXQtPmJsYWNrbGlzdCgpKSkKKyAgICAgICAgICAgICAgICBj
b250aW51ZTsKKyAgICAgICAgICAgIFJlZlB0cjxDU1NTdHlsZVNoZWV0PiBncm91cFNoZWV0ID0g
Q1NTU3R5bGVTaGVldDo6Y3JlYXRlSW5saW5lKGNvbnN0X2Nhc3Q8RG9jdW1lbnQqPih0aGlzKSwg
c2hlZXQtPnVybCgpKTsKKyAgICAgICAgICAgIGlmICghbV9wYWdlR3JvdXBVc2VyU2hlZXRzKQor
ICAgICAgICAgICAgICAgIG1fcGFnZUdyb3VwVXNlclNoZWV0cyA9IGFkb3B0UHRyKG5ldyBWZWN0
b3I8UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4pOworICAgICAgICAgICAgbV9wYWdlR3JvdXBVc2Vy
U2hlZXRzLT5hcHBlbmQoZ3JvdXBTaGVldCk7CisgICAgICAgICAgICBncm91cFNoZWV0LT5jb250
ZW50cygpLT5zZXRJc1VzZXJTdHlsZVNoZWV0KHNoZWV0LT5sZXZlbCgpID09IFVzZXJTdHlsZVVz
ZXJMZXZlbCk7CisgICAgICAgICAgICBncm91cFNoZWV0LT5jb250ZW50cygpLT5wYXJzZVN0cmlu
ZyhzaGVldC0+c291cmNlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG1fcGFn
ZUdyb3VwVXNlclNoZWV0cy5nZXQoKTsKK30KKwordm9pZCBEb2N1bWVudDo6Y2xlYXJQYWdlR3Jv
dXBVc2VyU2hlZXRzKCkKK3sKKyAgICBtX3BhZ2VHcm91cFVzZXJTaGVldENhY2hlVmFsaWQgPSBm
YWxzZTsKKyAgICBpZiAobV9wYWdlR3JvdXBVc2VyU2hlZXRzICYmIG1fcGFnZUdyb3VwVXNlclNo
ZWV0cy0+c2l6ZSgpKSB7CisgICAgICAgIG1fcGFnZUdyb3VwVXNlclNoZWV0cy0+Y2xlYXIoKTsK
KyAgICAgICAgc3R5bGVSZXNvbHZlckNoYW5nZWQoRGVmZXJSZWNhbGNTdHlsZSk7CisgICAgfQor
fQorCit2b2lkIERvY3VtZW50Ojp1cGRhdGVQYWdlR3JvdXBVc2VyU2hlZXRzKCkKK3sKKyAgICBj
bGVhclBhZ2VHcm91cFVzZXJTaGVldHMoKTsKKyAgICBpZiAocGFnZUdyb3VwVXNlclNoZWV0cygp
ICYmIHBhZ2VHcm91cFVzZXJTaGVldHMoKS0+c2l6ZSgpKQorICAgICAgICBzdHlsZVJlc29sdmVy
Q2hhbmdlZChSZWNhbGNTdHlsZUltbWVkaWF0ZWx5KTsKK30KKwordm9pZCBEb2N1bWVudDo6YWRk
VXNlclNoZWV0KFBhc3NSZWZQdHI8U3R5bGVTaGVldENvbnRlbnRzPiB1c2VyU2hlZXQpCit7Cisg
ICAgaWYgKCFtX3VzZXJTaGVldHMpCisgICAgICAgIG1fdXNlclNoZWV0cyA9IGFkb3B0UHRyKG5l
dyBWZWN0b3I8UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4pOworICAgIG1fdXNlclNoZWV0cy0+YXBw
ZW5kKENTU1N0eWxlU2hlZXQ6OmNyZWF0ZSh1c2VyU2hlZXQsIHRoaXMpKTsKKyAgICBzdHlsZVJl
c29sdmVyQ2hhbmdlZChSZWNhbGNTdHlsZUltbWVkaWF0ZWx5KTsKK30KKwordm9pZCBEb2N1bWVu
dDo6c2VhbWxlc3NQYXJlbnRVcGRhdGVkU3R5bGVzaGVldHMoKQoreworICAgIHN0eWxlUmVzb2x2
ZXJDaGFuZ2VkKFJlY2FsY1N0eWxlSW1tZWRpYXRlbHkpOworfQorCitDU1NTdHlsZVNoZWV0KiBE
b2N1bWVudDo6ZWxlbWVudFNoZWV0KCkKK3sKKyAgICBpZiAoIW1fZWxlbVNoZWV0KQorICAgICAg
ICBtX2VsZW1TaGVldCA9IENTU1N0eWxlU2hlZXQ6OmNyZWF0ZUlubGluZSh0aGlzLCBtX2Jhc2VV
UkwpOworICAgIHJldHVybiBtX2VsZW1TaGVldC5nZXQoKTsKK30KKworaW50IERvY3VtZW50Ojpu
b2RlQWJzSW5kZXgoTm9kZSAqbm9kZSkKK3sKKyAgICBBU1NFUlQobm9kZS0+ZG9jdW1lbnQoKSA9
PSB0aGlzKTsKKworICAgIGludCBhYnNJbmRleCA9IDA7CisgICAgZm9yIChOb2RlKiBuID0gbm9k
ZTsgbiAmJiBuICE9IHRoaXM7IG4gPSBuLT50cmF2ZXJzZVByZXZpb3VzTm9kZSgpKQorICAgICAg
ICBhYnNJbmRleCsrOworICAgIHJldHVybiBhYnNJbmRleDsKK30KKworTm9kZSogRG9jdW1lbnQ6
Om5vZGVXaXRoQWJzSW5kZXgoaW50IGFic0luZGV4KQoreworICAgIE5vZGUqIG4gPSB0aGlzOwor
ICAgIGZvciAoaW50IGkgPSAwOyBuICYmIChpIDwgYWJzSW5kZXgpOyBpKyspCisgICAgICAgIG4g
PSBuLT50cmF2ZXJzZU5leHROb2RlKCk7CisgICAgcmV0dXJuIG47Cit9CisKK3ZvaWQgRG9jdW1l
bnQ6OnByb2Nlc3NIdHRwRXF1aXYoY29uc3QgU3RyaW5nJiBlcXVpdiwgY29uc3QgU3RyaW5nJiBj
b250ZW50KQoreworICAgIEFTU0VSVCghZXF1aXYuaXNOdWxsKCkgJiYgIWNvbnRlbnQuaXNOdWxs
KCkpOworCisgICAgRnJhbWUqIGZyYW1lID0gdGhpcy0+ZnJhbWUoKTsKKworICAgIGlmIChlcXVh
bElnbm9yaW5nQ2FzZShlcXVpdiwgImRlZmF1bHQtc3R5bGUiKSkgeworICAgICAgICAvLyBUaGUg
cHJlZmVycmVkIHN0eWxlIHNldCBoYXMgYmVlbiBvdmVycmlkZGVuIGFzIHBlciBzZWN0aW9uIAor
ICAgICAgICAvLyAxNC4zLjIgb2YgdGhlIEhUTUw0LjAgc3BlY2lmaWNhdGlvbi4gIFdlIG5lZWQg
dG8gdXBkYXRlIHRoZQorICAgICAgICAvLyBzaGVldCB1c2VkIHZhcmlhYmxlIGFuZCB0aGVuIHVw
ZGF0ZSBvdXIgc3R5bGUgc2VsZWN0b3IuIAorICAgICAgICAvLyBGb3IgbW9yZSBpbmZvLCBzZWUg
dGhlIHRlc3QgYXQ6CisgICAgICAgIC8vIGh0dHA6Ly93d3cuaGl4aWUuY2gvdGVzdHMvZXZpbC9j
c3MvaW1wb3J0L21haW4vcHJlZmVycmVkLmh0bWwKKyAgICAgICAgLy8gLWR3aAorICAgICAgICBt
X3NlbGVjdGVkU3R5bGVzaGVldFNldCA9IGNvbnRlbnQ7CisgICAgICAgIG1fcHJlZmVycmVkU3R5
bGVzaGVldFNldCA9IGNvbnRlbnQ7CisgICAgICAgIHN0eWxlUmVzb2x2ZXJDaGFuZ2VkKERlZmVy
UmVjYWxjU3R5bGUpOworICAgIH0gZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoZXF1aXYsICJy
ZWZyZXNoIikpIHsKKyAgICAgICAgZG91YmxlIGRlbGF5OworICAgICAgICBTdHJpbmcgdXJsOwor
ICAgICAgICBpZiAoZnJhbWUgJiYgcGFyc2VIVFRQUmVmcmVzaChjb250ZW50LCB0cnVlLCBkZWxh
eSwgdXJsKSkgeworICAgICAgICAgICAgaWYgKHVybC5pc0VtcHR5KCkpCisgICAgICAgICAgICAg
ICAgdXJsID0gbV91cmwuc3RyaW5nKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAg
ICAgdXJsID0gY29tcGxldGVVUkwodXJsKS5zdHJpbmcoKTsKKyAgICAgICAgICAgIGZyYW1lLT5u
YXZpZ2F0aW9uU2NoZWR1bGVyKCktPnNjaGVkdWxlUmVkaXJlY3QoZGVsYXksIHVybCk7CisgICAg
ICAgIH0KKyAgICB9IGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGVxdWl2LCAic2V0LWNvb2tp
ZSIpKSB7CisgICAgICAgIC8vIEZJWE1FOiBtYWtlIHNldENvb2tpZSB3b3JrIG9uIFhNTCBkb2N1
bWVudHMgdG9vOyBlLmcuIGluIGNhc2Ugb2YgPGh0bWw6bWV0YSAuLi4uLj4KKyAgICAgICAgaWYg
KGlzSFRNTERvY3VtZW50KCkpIHsKKyAgICAgICAgICAgIEV4Y2VwdGlvbkNvZGUgZWM7IC8vIEV4
Y2VwdGlvbiAoZm9yIHNhbmRib3hlZCBkb2N1bWVudHMpIGlnbm9yZWQuCisgICAgICAgICAgICBz
dGF0aWNfY2FzdDxIVE1MRG9jdW1lbnQqPih0aGlzKS0+c2V0Q29va2llKGNvbnRlbnQsIGVjKTsK
KyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoZXF1aXYsICJjb250
ZW50LWxhbmd1YWdlIikpCisgICAgICAgIHNldENvbnRlbnRMYW5ndWFnZShjb250ZW50KTsKKyAg
ICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZShlcXVpdiwgIngtZG5zLXByZWZldGNoLWNvbnRy
b2wiKSkKKyAgICAgICAgcGFyc2VETlNQcmVmZXRjaENvbnRyb2xIZWFkZXIoY29udGVudCk7Cisg
ICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoZXF1aXYsICJ4LWZyYW1lLW9wdGlvbnMiKSkg
eworICAgICAgICBpZiAoZnJhbWUpIHsKKyAgICAgICAgICAgIEZyYW1lTG9hZGVyKiBmcmFtZUxv
YWRlciA9IGZyYW1lLT5sb2FkZXIoKTsKKyAgICAgICAgICAgIGlmIChmcmFtZUxvYWRlci0+c2hv
dWxkSW50ZXJydXB0TG9hZEZvclhGcmFtZU9wdGlvbnMoY29udGVudCwgdXJsKCkpKSB7CisgICAg
ICAgICAgICAgICAgZnJhbWVMb2FkZXItPnN0b3BBbGxMb2FkZXJzKCk7CisgICAgICAgICAgICAg
ICAgZnJhbWUtPm5hdmlnYXRpb25TY2hlZHVsZXIoKS0+c2NoZWR1bGVMb2NhdGlvbkNoYW5nZShz
ZWN1cml0eU9yaWdpbigpLCBibGFua1VSTCgpLCBTdHJpbmcoKSk7CisKKyAgICAgICAgICAgICAg
ICBERUZJTkVfU1RBVElDX0xPQ0FMKFN0cmluZywgY29uc29sZU1lc3NhZ2UsIChBU0NJSUxpdGVy
YWwoIlJlZnVzZWQgdG8gZGlzcGxheSBkb2N1bWVudCBiZWNhdXNlIGRpc3BsYXkgZm9yYmlkZGVu
IGJ5IFgtRnJhbWUtT3B0aW9ucy5cbiIpKSk7CisgICAgICAgICAgICAgICAgYWRkQ29uc29sZU1l
c3NhZ2UoSlNNZXNzYWdlU291cmNlLCBMb2dNZXNzYWdlVHlwZSwgRXJyb3JNZXNzYWdlTGV2ZWws
IGNvbnNvbGVNZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBp
ZiAoZXF1YWxJZ25vcmluZ0Nhc2UoZXF1aXYsICJ4LXdlYmtpdC1jc3AiKSkKKyAgICAgICAgY29u
dGVudFNlY3VyaXR5UG9saWN5KCktPmRpZFJlY2VpdmVIZWFkZXIoY29udGVudCwgQ29udGVudFNl
Y3VyaXR5UG9saWN5OjpFbmZvcmNlUG9saWN5KTsKKyAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5n
Q2FzZShlcXVpdiwgIngtd2Via2l0LWNzcC1yZXBvcnQtb25seSIpKQorICAgICAgICBjb250ZW50
U2VjdXJpdHlQb2xpY3koKS0+ZGlkUmVjZWl2ZUhlYWRlcihjb250ZW50LCBDb250ZW50U2VjdXJp
dHlQb2xpY3k6OlJlcG9ydE9ubHkpOworfQorCisvLyBUaG91Z2ggaXNzcGFjZSgpIGNvbnNpZGVy
cyBcdCBhbmQgXHYgdG8gYmUgd2hpdGVzcGFjZSwgV2luIElFIGRvZXNuJ3QuCitzdGF0aWMgYm9v
bCBpc1NlcGFyYXRvcihVQ2hhciBjKQoreworICAgIHJldHVybiBjID09ICcgJyB8fCBjID09ICdc
dCcgfHwgYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJyB8fCBjID09ICc9JyB8fCBjID09ICcsJyB8fCBj
ID09ICdcMCc7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnByb2Nlc3NBcmd1bWVudHMoY29uc3QgU3Ry
aW5nJiBmZWF0dXJlcywgdm9pZCogZGF0YSwgQXJndW1lbnRzQ2FsbGJhY2sgY2FsbGJhY2spCit7
CisgICAgLy8gVHJlYWQgbGlnaHRseSBpbiB0aGlzIGNvZGUgLS0gaXQgd2FzIHNwZWNpZmljYWxs
eSBkZXNpZ25lZCB0byBtaW1pYyBXaW4gSUUncyBwYXJzaW5nIGJlaGF2aW9yLgorICAgIGludCBr
ZXlCZWdpbiwga2V5RW5kOworICAgIGludCB2YWx1ZUJlZ2luLCB2YWx1ZUVuZDsKKworICAgIGlu
dCBpID0gMDsKKyAgICBpbnQgbGVuZ3RoID0gZmVhdHVyZXMubGVuZ3RoKCk7CisgICAgU3RyaW5n
IGJ1ZmZlciA9IGZlYXR1cmVzLmxvd2VyKCk7CisgICAgd2hpbGUgKGkgPCBsZW5ndGgpIHsKKyAg
ICAgICAgLy8gc2tpcCB0byBmaXJzdCBub24tc2VwYXJhdG9yLCBidXQgZG9uJ3Qgc2tpcCBwYXN0
IHRoZSBlbmQgb2YgdGhlIHN0cmluZworICAgICAgICB3aGlsZSAoaXNTZXBhcmF0b3IoYnVmZmVy
W2ldKSkgeworICAgICAgICAgICAgaWYgKGkgPj0gbGVuZ3RoKQorICAgICAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgICAgIGtleUJlZ2luID0gaTsK
KworICAgICAgICAvLyBza2lwIHRvIGZpcnN0IHNlcGFyYXRvcgorICAgICAgICB3aGlsZSAoIWlz
U2VwYXJhdG9yKGJ1ZmZlcltpXSkpCisgICAgICAgICAgICBpKys7CisgICAgICAgIGtleUVuZCA9
IGk7CisKKyAgICAgICAgLy8gc2tpcCB0byBmaXJzdCAnPScsIGJ1dCBkb24ndCBza2lwIHBhc3Qg
YSAnLCcgb3IgdGhlIGVuZCBvZiB0aGUgc3RyaW5nCisgICAgICAgIHdoaWxlIChidWZmZXJbaV0g
IT0gJz0nKSB7CisgICAgICAgICAgICBpZiAoYnVmZmVyW2ldID09ICcsJyB8fCBpID49IGxlbmd0
aCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQor
CisgICAgICAgIC8vIHNraXAgdG8gZmlyc3Qgbm9uLXNlcGFyYXRvciwgYnV0IGRvbid0IHNraXAg
cGFzdCBhICcsJyBvciB0aGUgZW5kIG9mIHRoZSBzdHJpbmcKKyAgICAgICAgd2hpbGUgKGlzU2Vw
YXJhdG9yKGJ1ZmZlcltpXSkpIHsKKyAgICAgICAgICAgIGlmIChidWZmZXJbaV0gPT0gJywnIHx8
IGkgPj0gbGVuZ3RoKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaSsrOwor
ICAgICAgICB9CisgICAgICAgIHZhbHVlQmVnaW4gPSBpOworCisgICAgICAgIC8vIHNraXAgdG8g
Zmlyc3Qgc2VwYXJhdG9yCisgICAgICAgIHdoaWxlICghaXNTZXBhcmF0b3IoYnVmZmVyW2ldKSkK
KyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgdmFsdWVFbmQgPSBpOworCisgICAgICAgIEFTU0VS
VChpIDw9IGxlbmd0aCk7CisKKyAgICAgICAgU3RyaW5nIGtleVN0cmluZyA9IGJ1ZmZlci5zdWJz
dHJpbmcoa2V5QmVnaW4sIGtleUVuZCAtIGtleUJlZ2luKTsKKyAgICAgICAgU3RyaW5nIHZhbHVl
U3RyaW5nID0gYnVmZmVyLnN1YnN0cmluZyh2YWx1ZUJlZ2luLCB2YWx1ZUVuZCAtIHZhbHVlQmVn
aW4pOworICAgICAgICBjYWxsYmFjayhrZXlTdHJpbmcsIHZhbHVlU3RyaW5nLCB0aGlzLCBkYXRh
KTsKKyAgICB9Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnByb2Nlc3NWaWV3cG9ydChjb25zdCBTdHJp
bmcmIGZlYXR1cmVzLCBWaWV3cG9ydEFyZ3VtZW50czo6VHlwZSBvcmlnaW4pCit7CisgICAgQVNT
RVJUKCFmZWF0dXJlcy5pc051bGwoKSk7CisKKyAgICBpZiAob3JpZ2luIDwgbV92aWV3cG9ydEFy
Z3VtZW50cy50eXBlKQorICAgICAgICByZXR1cm47CisKKyAgICBtX3ZpZXdwb3J0QXJndW1lbnRz
ID0gVmlld3BvcnRBcmd1bWVudHMob3JpZ2luKTsKKyAgICBwcm9jZXNzQXJndW1lbnRzKGZlYXR1
cmVzLCAodm9pZCopJm1fdmlld3BvcnRBcmd1bWVudHMsICZzZXRWaWV3cG9ydEZlYXR1cmUpOwor
CisgICAgdXBkYXRlVmlld3BvcnRBcmd1bWVudHMoKTsKK30KKwordm9pZCBEb2N1bWVudDo6dXBk
YXRlVmlld3BvcnRBcmd1bWVudHMoKQoreworICAgIGlmIChwYWdlKCkgJiYgcGFnZSgpLT5tYWlu
RnJhbWUoKSA9PSBmcmFtZSgpKSB7CisjaWZuZGVmIE5ERUJVRworICAgICAgICBtX2RpZERpc3Bh
dGNoVmlld3BvcnRQcm9wZXJ0aWVzQ2hhbmdlZCA9IHRydWU7CisjZW5kaWYKKyAgICAgICAgcGFn
ZSgpLT5jaHJvbWUoKS0+ZGlzcGF0Y2hWaWV3cG9ydFByb3BlcnRpZXNEaWRDaGFuZ2UobV92aWV3
cG9ydEFyZ3VtZW50cyk7CisgICAgfQorfQorCit2b2lkIERvY3VtZW50Ojpwcm9jZXNzUmVmZXJy
ZXJQb2xpY3koY29uc3QgU3RyaW5nJiBwb2xpY3kpCit7CisgICAgQVNTRVJUKCFwb2xpY3kuaXNO
dWxsKCkpOworCisgICAgbV9yZWZlcnJlclBvbGljeSA9IFJlZmVycmVyUG9saWN5RGVmYXVsdDsK
KworICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZShwb2xpY3ksICJuZXZlciIpKQorICAgICAgICBt
X3JlZmVycmVyUG9saWN5ID0gUmVmZXJyZXJQb2xpY3lOZXZlcjsKKyAgICBlbHNlIGlmIChlcXVh
bElnbm9yaW5nQ2FzZShwb2xpY3ksICJhbHdheXMiKSkKKyAgICAgICAgbV9yZWZlcnJlclBvbGlj
eSA9IFJlZmVycmVyUG9saWN5QWx3YXlzOworICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNl
KHBvbGljeSwgIm9yaWdpbiIpKQorICAgICAgICBtX3JlZmVycmVyUG9saWN5ID0gUmVmZXJyZXJQ
b2xpY3lPcmlnaW47Cit9CisKK01vdXNlRXZlbnRXaXRoSGl0VGVzdFJlc3VsdHMgRG9jdW1lbnQ6
OnByZXBhcmVNb3VzZUV2ZW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiByZXF1ZXN0LCBjb25zdCBM
YXlvdXRQb2ludCYgZG9jdW1lbnRQb2ludCwgY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBldmVu
dCkKK3sKKyAgICBBU1NFUlQoIXJlbmRlcmVyKCkgfHwgcmVuZGVyZXIoKS0+aXNSZW5kZXJWaWV3
KCkpOworCisgICAgaWYgKCFyZW5kZXJlcigpKQorICAgICAgICByZXR1cm4gTW91c2VFdmVudFdp
dGhIaXRUZXN0UmVzdWx0cyhldmVudCwgSGl0VGVzdFJlc3VsdChMYXlvdXRQb2ludCgpKSk7CisK
KyAgICBIaXRUZXN0UmVzdWx0IHJlc3VsdChkb2N1bWVudFBvaW50KTsKKyAgICByZW5kZXJWaWV3
KCktPmhpdFRlc3QocmVxdWVzdCwgcmVzdWx0KTsKKworICAgIGlmICghcmVxdWVzdC5yZWFkT25s
eSgpKQorICAgICAgICB1cGRhdGVTdHlsZUlmTmVlZGVkKCk7CisKKyAgICByZXR1cm4gTW91c2VF
dmVudFdpdGhIaXRUZXN0UmVzdWx0cyhldmVudCwgcmVzdWx0KTsKK30KKworLy8gRE9NIFNlY3Rp
b24gMS4xLjEKK2Jvb2wgRG9jdW1lbnQ6OmNoaWxkVHlwZUFsbG93ZWQoTm9kZVR5cGUgdHlwZSkg
Y29uc3QKK3sKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEFUVFJJQlVURV9OT0RFOgor
ICAgIGNhc2UgQ0RBVEFfU0VDVElPTl9OT0RFOgorICAgIGNhc2UgRE9DVU1FTlRfRlJBR01FTlRf
Tk9ERToKKyAgICBjYXNlIERPQ1VNRU5UX05PREU6CisgICAgY2FzZSBFTlRJVFlfTk9ERToKKyAg
ICBjYXNlIEVOVElUWV9SRUZFUkVOQ0VfTk9ERToKKyAgICBjYXNlIE5PVEFUSU9OX05PREU6Cisg
ICAgY2FzZSBURVhUX05PREU6CisgICAgY2FzZSBYUEFUSF9OQU1FU1BBQ0VfTk9ERToKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgIGNhc2UgQ09NTUVOVF9OT0RFOgorICAgIGNhc2UgUFJPQ0VT
U0lOR19JTlNUUlVDVElPTl9OT0RFOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlIERP
Q1VNRU5UX1RZUEVfTk9ERToKKyAgICBjYXNlIEVMRU1FTlRfTk9ERToKKyAgICAgICAgLy8gRG9j
dW1lbnRzIG1heSBjb250YWluIG5vIG1vcmUgdGhhbiBvbmUgb2YgZWFjaCBvZiB0aGVzZS4KKyAg
ICAgICAgLy8gKE9uZSBFbGVtZW50IGFuZCBvbmUgRG9jdW1lbnRUeXBlLikKKyAgICAgICAgZm9y
IChOb2RlKiBjID0gZmlyc3RDaGlsZCgpOyBjOyBjID0gYy0+bmV4dFNpYmxpbmcoKSkKKyAgICAg
ICAgICAgIGlmIChjLT5ub2RlVHlwZSgpID09IHR5cGUpCisgICAgICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOwor
fQorCitib29sIERvY3VtZW50OjpjYW5SZXBsYWNlQ2hpbGQoTm9kZSogbmV3Q2hpbGQsIE5vZGUq
IG9sZENoaWxkKQoreworICAgIGlmICghb2xkQ2hpbGQpCisgICAgICAgIC8vIENvbnRhaW5lck5v
ZGU6OnJlcGxhY2VDaGlsZCB3aWxsIHJhaXNlIGEgTk9UX0ZPVU5EX0VSUi4KKyAgICAgICAgcmV0
dXJuIHRydWU7CisKKyAgICBpZiAob2xkQ2hpbGQtPm5vZGVUeXBlKCkgPT0gbmV3Q2hpbGQtPm5v
ZGVUeXBlKCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgaW50IG51bURvY3R5cGVzID0g
MDsKKyAgICBpbnQgbnVtRWxlbWVudHMgPSAwOworCisgICAgLy8gRmlyc3QsIGNoZWNrIGhvdyBt
YW55IGRvY3R5cGVzIGFuZCBlbGVtZW50cyB3ZSBoYXZlLCBub3QgY291bnRpbmcKKyAgICAvLyB0
aGUgY2hpbGQgd2UncmUgYWJvdXQgdG8gcmVtb3ZlLgorICAgIGZvciAoTm9kZSogYyA9IGZpcnN0
Q2hpbGQoKTsgYzsgYyA9IGMtPm5leHRTaWJsaW5nKCkpIHsKKyAgICAgICAgaWYgKGMgPT0gb2xk
Q2hpbGQpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgCisgICAgICAgIHN3aXRjaCAo
Yy0+bm9kZVR5cGUoKSkgeworICAgICAgICBjYXNlIERPQ1VNRU5UX1RZUEVfTk9ERToKKyAgICAg
ICAgICAgIG51bURvY3R5cGVzKys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBF
TEVNRU5UX05PREU6CisgICAgICAgICAgICBudW1FbGVtZW50cysrOworICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAg
IH0KKyAgICAKKyAgICAvLyBUaGVuLCBzZWUgaG93IG1hbnkgZG9jdHlwZXMgYW5kIGVsZW1lbnRz
IG1pZ2h0IGJlIGFkZGVkIGJ5IHRoZSBuZXcgY2hpbGQuCisgICAgaWYgKG5ld0NoaWxkLT5ub2Rl
VHlwZSgpID09IERPQ1VNRU5UX0ZSQUdNRU5UX05PREUpIHsKKyAgICAgICAgZm9yIChOb2RlKiBj
ID0gbmV3Q2hpbGQtPmZpcnN0Q2hpbGQoKTsgYzsgYyA9IGMtPm5leHRTaWJsaW5nKCkpIHsKKyAg
ICAgICAgICAgIHN3aXRjaCAoYy0+bm9kZVR5cGUoKSkgeworICAgICAgICAgICAgY2FzZSBBVFRS
SUJVVEVfTk9ERToKKyAgICAgICAgICAgIGNhc2UgQ0RBVEFfU0VDVElPTl9OT0RFOgorICAgICAg
ICAgICAgY2FzZSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFOgorICAgICAgICAgICAgY2FzZSBET0NV
TUVOVF9OT0RFOgorICAgICAgICAgICAgY2FzZSBFTlRJVFlfTk9ERToKKyAgICAgICAgICAgIGNh
c2UgRU5USVRZX1JFRkVSRU5DRV9OT0RFOgorICAgICAgICAgICAgY2FzZSBOT1RBVElPTl9OT0RF
OgorICAgICAgICAgICAgY2FzZSBURVhUX05PREU6CisgICAgICAgICAgICBjYXNlIFhQQVRIX05B
TUVTUEFDRV9OT0RFOgorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAg
IGNhc2UgQ09NTUVOVF9OT0RFOgorICAgICAgICAgICAgY2FzZSBQUk9DRVNTSU5HX0lOU1RSVUNU
SU9OX05PREU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERPQ1VN
RU5UX1RZUEVfTk9ERToKKyAgICAgICAgICAgICAgICBudW1Eb2N0eXBlcysrOworICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFTEVNRU5UX05PREU6CisgICAgICAgICAg
ICAgICAgbnVtRWxlbWVudHMrKzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAobmV3Q2hpbGQtPm5v
ZGVUeXBlKCkpIHsKKyAgICAgICAgY2FzZSBBVFRSSUJVVEVfTk9ERToKKyAgICAgICAgY2FzZSBD
REFUQV9TRUNUSU9OX05PREU6CisgICAgICAgIGNhc2UgRE9DVU1FTlRfRlJBR01FTlRfTk9ERToK
KyAgICAgICAgY2FzZSBET0NVTUVOVF9OT0RFOgorICAgICAgICBjYXNlIEVOVElUWV9OT0RFOgor
ICAgICAgICBjYXNlIEVOVElUWV9SRUZFUkVOQ0VfTk9ERToKKyAgICAgICAgY2FzZSBOT1RBVElP
Tl9OT0RFOgorICAgICAgICBjYXNlIFRFWFRfTk9ERToKKyAgICAgICAgY2FzZSBYUEFUSF9OQU1F
U1BBQ0VfTk9ERToKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgY2FzZSBDT01N
RU5UX05PREU6CisgICAgICAgIGNhc2UgUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFOgorICAg
ICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgRE9DVU1FTlRfVFlQRV9OT0RFOgor
ICAgICAgICAgICAgbnVtRG9jdHlwZXMrKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBj
YXNlIEVMRU1FTlRfTk9ERToKKyAgICAgICAgICAgIG51bUVsZW1lbnRzKys7CisgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgfSAgICAgICAgICAgICAgICAKKyAgICB9CisgICAgICAgIAorICAg
IGlmIChudW1FbGVtZW50cyA+IDEgfHwgbnVtRG9jdHlwZXMgPiAxKQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgCisgICAgcmV0dXJuIHRydWU7Cit9CisKK1Bhc3NSZWZQdHI8Tm9kZT4gRG9j
dW1lbnQ6OmNsb25lTm9kZShib29sIC8qZGVlcCovKQoreworICAgIC8vIFNwZWMgc2F5cyBjbG9u
aW5nIERvY3VtZW50IG5vZGVzIGlzICJpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQiCisgICAgLy8g
c28gd2UgZG8gbm90IHN1cHBvcnQgaXQuLi4KKyAgICByZXR1cm4gMDsKK30KKworU3R5bGVTaGVl
dExpc3QqIERvY3VtZW50OjpzdHlsZVNoZWV0cygpCit7CisgICAgcmV0dXJuIG1fc3R5bGVTaGVl
dHMuZ2V0KCk7Cit9CisKK1N0cmluZyBEb2N1bWVudDo6cHJlZmVycmVkU3R5bGVzaGVldFNldCgp
IGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcHJlZmVycmVkU3R5bGVzaGVldFNldDsKK30KKworU3Ry
aW5nIERvY3VtZW50OjpzZWxlY3RlZFN0eWxlc2hlZXRTZXQoKSBjb25zdAoreworICAgIHJldHVy
biBtX3NlbGVjdGVkU3R5bGVzaGVldFNldDsKK30KKwordm9pZCBEb2N1bWVudDo6c2V0U2VsZWN0
ZWRTdHlsZXNoZWV0U2V0KGNvbnN0IFN0cmluZyYgYVN0cmluZykKK3sKKyAgICBtX3NlbGVjdGVk
U3R5bGVzaGVldFNldCA9IGFTdHJpbmc7CisgICAgc3R5bGVSZXNvbHZlckNoYW5nZWQoRGVmZXJS
ZWNhbGNTdHlsZSk7Cit9CisKKy8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuZXZlciBhIHRv
cC1sZXZlbCBzdHlsZXNoZWV0IGhhcyBmaW5pc2hlZCBsb2FkaW5nLgordm9pZCBEb2N1bWVudDo6
cmVtb3ZlUGVuZGluZ1NoZWV0KFJlbW92ZVBlbmRpbmdTaGVldE5vdGlmaWNhdGlvblR5cGUgbm90
aWZpY2F0aW9uKQoreworICAgIC8vIE1ha2Ugc3VyZSB3ZSBrbmV3IHRoaXMgc2hlZXQgd2FzIHBl
bmRpbmcsIGFuZCB0aGF0IG91ciBjb3VudCBpc24ndCBvdXQgb2Ygc3luYy4KKyAgICBBU1NFUlQo
bV9wZW5kaW5nU3R5bGVzaGVldHMgPiAwKTsKKworICAgIG1fcGVuZGluZ1N0eWxlc2hlZXRzLS07
CisgICAgCisjaWZkZWYgSU5TVFJVTUVOVF9MQVlPVVRfU0NIRURVTElORworICAgIGlmICghb3du
ZXJFbGVtZW50KCkpCisgICAgICAgIHByaW50ZigiU3R5bGVzaGVldCBsb2FkZWQgYXQgdGltZSAl
ZC4gJWQgc3R5bGVzaGVldHMgc3RpbGwgcmVtYWluLlxuIiwgZWxhcHNlZFRpbWUoKSwgbV9wZW5k
aW5nU3R5bGVzaGVldHMpOworI2VuZGlmCisKKyAgICBpZiAobV9wZW5kaW5nU3R5bGVzaGVldHMp
CisgICAgICAgIHJldHVybjsKKworICAgIGlmIChub3RpZmljYXRpb24gPT0gUmVtb3ZlUGVuZGlu
Z1NoZWV0Tm90aWZ5TGF0ZXIpIHsKKyAgICAgICAgc2V0TmVlZHNOb3RpZnlSZW1vdmVBbGxQZW5k
aW5nU3R5bGVzaGVldCgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIGRpZFJl
bW92ZUFsbFBlbmRpbmdTdHlsZXNoZWV0KCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmRpZFJlbW92
ZUFsbFBlbmRpbmdTdHlsZXNoZWV0KCkKK3sKKyAgICBtX25lZWRzTm90aWZ5UmVtb3ZlQWxsUGVu
ZGluZ1N0eWxlc2hlZXQgPSBmYWxzZTsKKworICAgIHN0eWxlUmVzb2x2ZXJDaGFuZ2VkKFJlY2Fs
Y1N0eWxlSWZOZWVkZWQpOworCisgICAgaWYgKFNjcmlwdGFibGVEb2N1bWVudFBhcnNlciogcGFy
c2VyID0gc2NyaXB0YWJsZURvY3VtZW50UGFyc2VyKCkpCisgICAgICAgIHBhcnNlci0+ZXhlY3V0
ZVNjcmlwdHNXYWl0aW5nRm9yU3R5bGVzaGVldHMoKTsKKworICAgIGlmIChtX2dvdG9BbmNob3JO
ZWVkZWRBZnRlclN0eWxlc2hlZXRzTG9hZCAmJiB2aWV3KCkpCisgICAgICAgIHZpZXcoKS0+c2Ny
b2xsVG9GcmFnbWVudChtX3VybCk7Cit9CisKKwordm9pZCBEb2N1bWVudDo6ZXZhbHVhdGVNZWRp
YVF1ZXJ5TGlzdCgpCit7CisgICAgaWYgKG1fbWVkaWFRdWVyeU1hdGNoZXIpCisgICAgICAgIG1f
bWVkaWFRdWVyeU1hdGNoZXItPnN0eWxlUmVzb2x2ZXJDaGFuZ2VkKCk7Cit9CisKK3ZvaWQgRG9j
dW1lbnQ6OnN0eWxlUmVzb2x2ZXJDaGFuZ2VkKFN0eWxlUmVzb2x2ZXJVcGRhdGVGbGFnIHVwZGF0
ZUZsYWcpCit7CisgICAgLy8gRG9uJ3QgYm90aGVyIHVwZGF0aW5nLCBzaW5jZSB3ZSBoYXZlbid0
IGxvYWRlZCBhbGwgb3VyIHN0eWxlIGluZm8geWV0CisgICAgLy8gYW5kIGhhdmVuJ3QgY2FsY3Vs
YXRlZCB0aGUgc3R5bGUgc2VsZWN0b3IgZm9yIHRoZSBmaXJzdCB0aW1lLgorICAgIGlmICghYXR0
YWNoZWQoKSB8fCAoIW1fZGlkQ2FsY3VsYXRlU3R5bGVSZXNvbHZlciAmJiAhaGF2ZVN0eWxlc2hl
ZXRzTG9hZGVkKCkpKSB7CisgICAgICAgIG1fc3R5bGVSZXNvbHZlci5jbGVhcigpOworICAgICAg
ICByZXR1cm47CisgICAgfQorCisjaWZkZWYgSU5TVFJVTUVOVF9MQVlPVVRfU0NIRURVTElORwor
ICAgIGlmICghb3duZXJFbGVtZW50KCkpCisgICAgICAgIHByaW50ZigiQmVnaW5uaW5nIHVwZGF0
ZSBvZiBzdHlsZSBzZWxlY3RvciBhdCB0aW1lICVkLlxuIiwgZWxhcHNlZFRpbWUoKSk7CisjZW5k
aWYKKworICAgIGJvb2wgc3R5bGVzaGVldENoYW5nZVJlcXVpcmVzU3R5bGVSZWNhbGMgPSB1cGRh
dGVBY3RpdmVTdHlsZXNoZWV0cyh1cGRhdGVGbGFnKTsKKworICAgIGlmICh1cGRhdGVGbGFnID09
IERlZmVyUmVjYWxjU3R5bGUpIHsKKyAgICAgICAgc2NoZWR1bGVGb3JjZWRTdHlsZVJlY2FsYygp
OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGRpZExheW91dFdpdGhQZW5kaW5n
U3R5bGVzaGVldHMoKSAmJiBtX3BlbmRpbmdTdHlsZXNoZWV0cyA8PSAwKSB7CisgICAgICAgIG1f
cGVuZGluZ1NoZWV0TGF5b3V0ID0gSWdub3JlTGF5b3V0V2l0aFBlbmRpbmdTaGVldHM7CisgICAg
ICAgIGlmIChyZW5kZXJlcigpKQorICAgICAgICAgICAgcmVuZGVyZXIoKS0+cmVwYWludCgpOwor
ICAgIH0KKworICAgIGlmICghc3R5bGVzaGVldENoYW5nZVJlcXVpcmVzU3R5bGVSZWNhbGMpCisg
ICAgICAgIHJldHVybjsKKworICAgIC8vIFRoaXMgcmVjYWxjU3R5bGUgaW5pdGlhdGVzIGEgbmV3
IHJlY2FsYyBjeWNsZS4gV2UgbmVlZCB0byBicmFja2V0IGl0IHRvCisgICAgLy8gbWFrZSBzdXJl
IGFuaW1hdGlvbnMgZ2V0IHRoZSBjb3JyZWN0IHVwZGF0ZSB0aW1lCisgICAgeworICAgICAgICBB
bmltYXRpb25VcGRhdGVCbG9jayBhbmltYXRpb25VcGRhdGVCbG9jayhtX2ZyYW1lID8gbV9mcmFt
ZS0+YW5pbWF0aW9uKCkgOiAwKTsKKyAgICAgICAgcmVjYWxjU3R5bGUoRm9yY2UpOworICAgIH0K
KworI2lmZGVmIElOU1RSVU1FTlRfTEFZT1VUX1NDSEVEVUxJTkcKKyAgICBpZiAoIW93bmVyRWxl
bWVudCgpKQorICAgICAgICBwcmludGYoIkZpbmlzaGVkIHVwZGF0ZSBvZiBzdHlsZSBzZWxlY3Rv
ciBhdCB0aW1lICVkXG4iLCBlbGFwc2VkVGltZSgpKTsKKyNlbmRpZgorCisgICAgaWYgKHJlbmRl
cmVyKCkpIHsKKyAgICAgICAgcmVuZGVyZXIoKS0+c2V0TmVlZHNMYXlvdXRBbmRQcmVmV2lkdGhz
UmVjYWxjKCk7CisgICAgICAgIGlmICh2aWV3KCkpCisgICAgICAgICAgICB2aWV3KCktPnNjaGVk
dWxlUmVsYXlvdXQoKTsKKyAgICB9CisKKyAgICBldmFsdWF0ZU1lZGlhUXVlcnlMaXN0KCk7Cit9
CisKK3ZvaWQgRG9jdW1lbnQ6OmFkZFN0eWxlU2hlZXRDYW5kaWRhdGVOb2RlKE5vZGUqIG5vZGUs
IGJvb2wgY3JlYXRlZEJ5UGFyc2VyKQoreworICAgIGlmICghbm9kZS0+aW5Eb2N1bWVudCgpKQor
ICAgICAgICByZXR1cm47CisgICAgCisgICAgLy8gVW50aWwgdGhlIDxib2R5PiBleGlzdHMsIHdl
IGhhdmUgbm8gY2hvaWNlIGJ1dCB0byBjb21wYXJlIGRvY3VtZW50IHBvc2l0aW9ucywKKyAgICAv
LyBzaW5jZSBzdHlsZXMgb3V0c2lkZSBvZiB0aGUgYm9keSBhbmQgaGVhZCBjb250aW51ZSB0byBi
ZSBzaHVudGVkIGludG8gdGhlIGhlYWQKKyAgICAvLyAoYW5kIHRodXMgY2FuIHNoaWZ0IHRvIGVu
ZCB1cCBiZWZvcmUgZHluYW1pY2FsbHkgYWRkZWQgRE9NIGNvbnRlbnQgdGhhdCBpcyBhbHNvCisg
ICAgLy8gb3V0c2lkZSB0aGUgYm9keSkuCisgICAgaWYgKChjcmVhdGVkQnlQYXJzZXIgJiYgYm9k
eSgpKSB8fCBtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAg
bV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMuYWRkKG5vZGUpOworICAgICAgICByZXR1cm47Cisg
ICAgfQorCisgICAgLy8gRGV0ZXJtaW5lIGFuIGFwcHJvcHJpYXRlIGluc2VydGlvbiBwb2ludC4K
KyAgICBTdHlsZVNoZWV0Q2FuZGlkYXRlTGlzdEhhc2hTZXQ6Oml0ZXJhdG9yIGJlZ2luID0gbV9z
dHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMuYmVnaW4oKTsKKyAgICBTdHlsZVNoZWV0Q2FuZGlkYXRl
TGlzdEhhc2hTZXQ6Oml0ZXJhdG9yIGVuZCA9IG1fc3R5bGVTaGVldENhbmRpZGF0ZU5vZGVzLmVu
ZCgpOworICAgIFN0eWxlU2hlZXRDYW5kaWRhdGVMaXN0SGFzaFNldDo6aXRlcmF0b3IgaXQgPSBl
bmQ7CisgICAgTm9kZSogZm9sbG93aW5nTm9kZSA9IDA7CisgICAgZG8geworICAgICAgICAtLWl0
OworICAgICAgICBOb2RlKiBuID0gKml0OworICAgICAgICB1bnNpZ25lZCBzaG9ydCBwb3NpdGlv
biA9IG4tPmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKG5vZGUpOworICAgICAgICBpZiAocG9zaXRp
b24gPT0gRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HKSB7CisgICAgICAgICAgICBtX3N0eWxl
U2hlZXRDYW5kaWRhdGVOb2Rlcy5pbnNlcnRCZWZvcmUoZm9sbG93aW5nTm9kZSwgbm9kZSk7Cisg
ICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZm9sbG93aW5nTm9kZSA9IG47
CisgICAgfSB3aGlsZSAoaXQgIT0gYmVnaW4pOworICAgIAorICAgIG1fc3R5bGVTaGVldENhbmRp
ZGF0ZU5vZGVzLmluc2VydEJlZm9yZShmb2xsb3dpbmdOb2RlLCBub2RlKTsKK30KKwordm9pZCBE
b2N1bWVudDo6cmVtb3ZlU3R5bGVTaGVldENhbmRpZGF0ZU5vZGUoTm9kZSogbm9kZSkKK3sKKyAg
ICBtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcy5yZW1vdmUobm9kZSk7Cit9CisKK3ZvaWQgRG9j
dW1lbnQ6OmNvbGxlY3RBY3RpdmVTdHlsZXNoZWV0cyhWZWN0b3I8UmVmUHRyPFN0eWxlU2hlZXQ+
ID4mIHNoZWV0cykKK3sKKyAgICBpZiAoc2V0dGluZ3MoKSAmJiAhc2V0dGluZ3MoKS0+YXV0aG9y
QW5kVXNlclN0eWxlc0VuYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgU3R5bGVTaGVl
dENhbmRpZGF0ZUxpc3RIYXNoU2V0OjppdGVyYXRvciBiZWdpbiA9IG1fc3R5bGVTaGVldENhbmRp
ZGF0ZU5vZGVzLmJlZ2luKCk7CisgICAgU3R5bGVTaGVldENhbmRpZGF0ZUxpc3RIYXNoU2V0Ojpp
dGVyYXRvciBlbmQgPSBtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcy5lbmQoKTsKKyAgICBmb3Ig
KFN0eWxlU2hlZXRDYW5kaWRhdGVMaXN0SGFzaFNldDo6aXRlcmF0b3IgaXQgPSBiZWdpbjsgaXQg
IT0gZW5kOyArK2l0KSB7CisgICAgICAgIE5vZGUqIG4gPSAqaXQ7CisgICAgICAgIFN0eWxlU2hl
ZXQqIHNoZWV0ID0gMDsKKyAgICAgICAgaWYgKG4tPm5vZGVUeXBlKCkgPT0gUFJPQ0VTU0lOR19J
TlNUUlVDVElPTl9OT0RFKSB7CisgICAgICAgICAgICAvLyBQcm9jZXNzaW5nIGluc3RydWN0aW9u
IChYTUwgZG9jdW1lbnRzIG9ubHkpLgorICAgICAgICAgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCBs
aW5raW5nIHRvIGVtYmVkZGVkIENTUyBzdHlsZXNoZWV0cywgc2VlIDxodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDkyODE+IGZvciBkaXNjdXNzaW9uLgorICAgICAgICAg
ICAgUHJvY2Vzc2luZ0luc3RydWN0aW9uKiBwaSA9IHN0YXRpY19jYXN0PFByb2Nlc3NpbmdJbnN0
cnVjdGlvbio+KG4pOworICAgICAgICAgICAgc2hlZXQgPSBwaS0+c2hlZXQoKTsKKyNpZiBFTkFC
TEUoWFNMVCkKKyAgICAgICAgICAgIC8vIERvbid0IGFwcGx5IFhTTCB0cmFuc2Zvcm1zIHRvIGFs
cmVhZHkgdHJhbnNmb3JtZWQgZG9jdW1lbnRzIC0tIDxyZGFyOi8vcHJvYmxlbS80MTMyODA2Pgor
ICAgICAgICAgICAgaWYgKHBpLT5pc1hTTCgpICYmICF0cmFuc2Zvcm1Tb3VyY2VEb2N1bWVudCgp
KSB7CisgICAgICAgICAgICAgICAgLy8gRG9uJ3QgYXBwbHkgWFNMIHRyYW5zZm9ybXMgdW50aWwg
bG9hZGluZyBpcyBmaW5pc2hlZC4KKyAgICAgICAgICAgICAgICBpZiAoIXBhcnNpbmcoKSkKKyAg
ICAgICAgICAgICAgICAgICAgYXBwbHlYU0xUcmFuc2Zvcm0ocGkpOworICAgICAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9IGVsc2UgaWYgKChuLT5p
c0hUTUxFbGVtZW50KCkgJiYgKG4tPmhhc1RhZ05hbWUobGlua1RhZykgfHwgbi0+aGFzVGFnTmFt
ZShzdHlsZVRhZykpKQorI2lmIEVOQUJMRShTVkcpCisgICAgICAgICAgICAgICAgICAgfHwgIChu
LT5pc1NWR0VsZW1lbnQoKSAmJiBuLT5oYXNUYWdOYW1lKFNWR05hbWVzOjpzdHlsZVRhZykpCisj
ZW5kaWYKKyAgICAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgIEVsZW1lbnQqIGUgPSBz
dGF0aWNfY2FzdDxFbGVtZW50Kj4obik7CisgICAgICAgICAgICBBdG9taWNTdHJpbmcgdGl0bGUg
PSBlLT5nZXRBdHRyaWJ1dGUodGl0bGVBdHRyKTsKKyAgICAgICAgICAgIGJvb2wgZW5hYmxlZFZp
YVNjcmlwdCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKGUtPmhhc0xvY2FsTmFtZShsaW5rVGFn
KSkgeworICAgICAgICAgICAgICAgIC8vIDxMSU5LPiBlbGVtZW50CisgICAgICAgICAgICAgICAg
SFRNTExpbmtFbGVtZW50KiBsaW5rRWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxMaW5rRWxlbWVu
dCo+KG4pOworICAgICAgICAgICAgICAgIGlmIChsaW5rRWxlbWVudC0+aXNEaXNhYmxlZCgpKQor
ICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBlbmFibGVkVmlh
U2NyaXB0ID0gbGlua0VsZW1lbnQtPmlzRW5hYmxlZFZpYVNjcmlwdCgpOworICAgICAgICAgICAg
ICAgIGlmIChsaW5rRWxlbWVudC0+c3R5bGVTaGVldElzTG9hZGluZygpKSB7CisgICAgICAgICAg
ICAgICAgICAgIC8vIGl0IGlzIGxvYWRpbmcgYnV0IHdlIHNob3VsZCBzdGlsbCBkZWNpZGUgd2hp
Y2ggc3R5bGUgc2hlZXQgc2V0IHRvIHVzZQorICAgICAgICAgICAgICAgICAgICBpZiAoIWVuYWJs
ZWRWaWFTY3JpcHQgJiYgIXRpdGxlLmlzRW1wdHkoKSAmJiBtX3ByZWZlcnJlZFN0eWxlc2hlZXRT
ZXQuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdG9taWNTdHJp
bmcmIHJlbCA9IGUtPmdldEF0dHJpYnV0ZShyZWxBdHRyKTsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGlmICghcmVsLmNvbnRhaW5zKCJhbHRlcm5hdGUiKSkgeworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIG1fcHJlZmVycmVkU3R5bGVzaGVldFNldCA9IHRpdGxlOworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIG1fc2VsZWN0ZWRTdHlsZXNoZWV0U2V0ID0gdGl0bGU7CisgICAgICAg
ICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg
ICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgh
bGlua0VsZW1lbnQtPnNoZWV0KCkpCisgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gbnVsbEF0
b207CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgcHJlZmVy
cmVkIHN0eWxlc2V0LiAgVGhpcyBpcyB0aGUKKyAgICAgICAgICAgIC8vIHNldCBvZiBzaGVldHMg
dGhhdCB3aWxsIGJlIGVuYWJsZWQuCisjaWYgRU5BQkxFKFNWRykKKyAgICAgICAgICAgIGlmIChu
LT5pc1NWR0VsZW1lbnQoKSAmJiBuLT5oYXNUYWdOYW1lKFNWR05hbWVzOjpzdHlsZVRhZykpCisg
ICAgICAgICAgICAgICAgc2hlZXQgPSBzdGF0aWNfY2FzdDxTVkdTdHlsZUVsZW1lbnQqPihuKS0+
c2hlZXQoKTsKKyAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgaWYgKGUtPmhh
c0xvY2FsTmFtZShsaW5rVGFnKSkKKyAgICAgICAgICAgICAgICBzaGVldCA9IHN0YXRpY19jYXN0
PEhUTUxMaW5rRWxlbWVudCo+KG4pLT5zaGVldCgpOworICAgICAgICAgICAgZWxzZQorICAgICAg
ICAgICAgICAgIC8vIDxTVFlMRT4gZWxlbWVudAorICAgICAgICAgICAgICAgIHNoZWV0ID0gc3Rh
dGljX2Nhc3Q8SFRNTFN0eWxlRWxlbWVudCo+KG4pLT5zaGVldCgpOworICAgICAgICAgICAgLy8g
Q2hlY2sgdG8gc2VlIGlmIHRoaXMgc2hlZXQgYmVsb25ncyB0byBhIHN0eWxlc2V0CisgICAgICAg
ICAgICAvLyAodGh1cyBtYWtpbmcgaXQgUFJFRkVSUkVEIG9yIEFMVEVSTkFURSByYXRoZXIgdGhh
bgorICAgICAgICAgICAgLy8gUEVSU0lTVEVOVCkuCisgICAgICAgICAgICBBdG9taWNTdHJpbmcg
cmVsID0gZS0+Z2V0QXR0cmlidXRlKHJlbEF0dHIpOworICAgICAgICAgICAgaWYgKCFlbmFibGVk
VmlhU2NyaXB0ICYmICF0aXRsZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBZZXMs
IHdlIGhhdmUgYSB0aXRsZS4KKyAgICAgICAgICAgICAgICBpZiAobV9wcmVmZXJyZWRTdHlsZXNo
ZWV0U2V0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBObyBwcmVmZXJyZWQg
c2V0IGhhcyBiZWVuIGVzdGFibGlzaGVkLiAgSWYKKyAgICAgICAgICAgICAgICAgICAgLy8gd2Ug
YXJlIE5PVCBhbiBhbHRlcm5hdGUgc2hlZXQsIHRoZW4gZXN0YWJsaXNoCisgICAgICAgICAgICAg
ICAgICAgIC8vIHVzIGFzIHRoZSBwcmVmZXJyZWQgc2V0LiAgT3RoZXJ3aXNlLCBqdXN0IGlnbm9y
ZQorICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHNoZWV0LgorICAgICAgICAgICAgICAgICAg
ICBpZiAoZS0+aGFzTG9jYWxOYW1lKHN0eWxlVGFnKSB8fCAhcmVsLmNvbnRhaW5zKCJhbHRlcm5h
dGUiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcHJlZmVycmVkU3R5bGVzaGVldFNldCA9
IG1fc2VsZWN0ZWRTdHlsZXNoZWV0U2V0ID0gdGl0bGU7CisgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgICAgIGlmICh0aXRsZSAhPSBtX3ByZWZlcnJlZFN0eWxlc2hlZXRTZXQpCisgICAg
ICAgICAgICAgICAgICAgIHNoZWV0ID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
aWYgKHJlbC5jb250YWlucygiYWx0ZXJuYXRlIikgJiYgdGl0bGUuaXNFbXB0eSgpKQorICAgICAg
ICAgICAgICAgIHNoZWV0ID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2hlZXQpCisgICAg
ICAgICAgICBzaGVldHMuYXBwZW5kKHNoZWV0KTsKKyAgICB9Cit9CisKK2Jvb2wgRG9jdW1lbnQ6
OnRlc3RBZGRlZFN0eWxlc2hlZXRSZXF1aXJlc1N0eWxlUmVjYWxjKFN0eWxlU2hlZXRDb250ZW50
cyogc3R5bGVzaGVldCkKK3sKKyAgICAvLyBTZWUgaWYgYWxsIHJ1bGVzIG9uIHRoZSBzaGVldCBh
cmUgc2NvcGVkIHRvIHNvbWUgc3BlY2lmaWMgaWRzIG9yIGNsYXNzZXMuCisgICAgLy8gVGhlbiB0
ZXN0IGlmIHdlIGFjdHVhbGx5IGhhdmUgYW55IG9mIHRob3NlIGluIHRoZSB0cmVlIGF0IHRoZSBt
b21lbnQuCisgICAgSGFzaFNldDxBdG9taWNTdHJpbmdJbXBsKj4gaWRTY29wZXM7IAorICAgIEhh
c2hTZXQ8QXRvbWljU3RyaW5nSW1wbCo+IGNsYXNzU2NvcGVzOworICAgIGlmICghU3R5bGVSZXNv
bHZlcjo6ZGV0ZXJtaW5lU3R5bGVzaGVldFNlbGVjdG9yU2NvcGVzKHN0eWxlc2hlZXQsIGlkU2Nv
cGVzLCBjbGFzc1Njb3BlcykpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIC8vIEludmFsaWRh
dGUgdGhlIHN1YnRyZWVzIHRoYXQgbWF0Y2ggdGhlIHNjb3Blcy4KKyAgICBOb2RlKiBub2RlID0g
Zmlyc3RDaGlsZCgpOworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIGlmICghbm9kZS0+aXNT
dHlsZWRFbGVtZW50KCkpIHsKKyAgICAgICAgICAgIG5vZGUgPSBub2RlLT50cmF2ZXJzZU5leHRO
b2RlKCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBTdHlsZWRF
bGVtZW50KiBlbGVtZW50ID0gc3RhdGljX2Nhc3Q8U3R5bGVkRWxlbWVudCo+KG5vZGUpOworICAg
ICAgICBpZiAoU2VsZWN0b3JDaGVja2VyOjplbGVtZW50TWF0Y2hlc1NlbGVjdG9yU2NvcGVzKGVs
ZW1lbnQsIGlkU2NvcGVzLCBjbGFzc1Njb3BlcykpIHsKKyAgICAgICAgICAgIGVsZW1lbnQtPnNl
dE5lZWRzU3R5bGVSZWNhbGMoKTsKKyAgICAgICAgICAgIC8vIFRoZSB3aG9sZSBzdWJ0cmVlIGlz
IG5vdyBpbnZhbGlkYXRlZCwgd2UgY2FuIHNraXAgdG8gdGhlIG5leHQgc2libGluZy4KKyAgICAg
ICAgICAgIG5vZGUgPSBub2RlLT50cmF2ZXJzZU5leHRTaWJsaW5nKCk7CisgICAgICAgICAgICBj
b250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBub2RlID0gbm9kZS0+dHJhdmVyc2VOZXh0Tm9k
ZSgpOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmFuYWx5
emVTdHlsZXNoZWV0Q2hhbmdlKFN0eWxlUmVzb2x2ZXJVcGRhdGVGbGFnIHVwZGF0ZUZsYWcsIGNv
bnN0IFZlY3RvcjxSZWZQdHI8U3R5bGVTaGVldD4gPiYgbmV3U3R5bGVzaGVldHMsIGJvb2wmIHJl
cXVpcmVzU3R5bGVSZXNvbHZlclJlc2V0LCBib29sJiByZXF1aXJlc0Z1bGxTdHlsZVJlY2FsYykK
K3sKKyAgICByZXF1aXJlc1N0eWxlUmVzb2x2ZXJSZXNldCA9IHRydWU7CisgICAgcmVxdWlyZXNG
dWxsU3R5bGVSZWNhbGMgPSB0cnVlOworICAgIAorICAgIC8vIFN0eWxlc2hlZXRzIG9mIDxzdHls
ZT4gZWxlbWVudHMgdGhhdCBAaW1wb3J0IHN0eWxlc2hlZXRzIGFyZSBhY3RpdmUgYnV0IGxvYWRp
bmcuIFdlIG5lZWQgdG8gdHJpZ2dlciBhIGZ1bGwgcmVjYWxjIHdoZW4gc3VjaCBsb2FkcyBhcmUg
ZG9uZS4KKyAgICBib29sIGhhc0FjdGl2ZUxvYWRpbmdTdHlsZXNoZWV0ID0gZmFsc2U7CisgICAg
dW5zaWduZWQgbmV3U3R5bGVzaGVldENvdW50ID0gbmV3U3R5bGVzaGVldHMuc2l6ZSgpOworICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuZXdTdHlsZXNoZWV0Q291bnQ7ICsraSkgeworICAg
ICAgICBpZiAobmV3U3R5bGVzaGVldHNbaV0tPmlzTG9hZGluZygpKQorICAgICAgICAgICAgaGFz
QWN0aXZlTG9hZGluZ1N0eWxlc2hlZXQgPSB0cnVlOworICAgIH0KKyAgICBpZiAobV9oYWRBY3Rp
dmVMb2FkaW5nU3R5bGVzaGVldCAmJiAhaGFzQWN0aXZlTG9hZGluZ1N0eWxlc2hlZXQpIHsKKyAg
ICAgICAgbV9oYWRBY3RpdmVMb2FkaW5nU3R5bGVzaGVldCA9IGZhbHNlOworICAgICAgICByZXR1
cm47CisgICAgfQorICAgIG1faGFkQWN0aXZlTG9hZGluZ1N0eWxlc2hlZXQgPSBoYXNBY3RpdmVM
b2FkaW5nU3R5bGVzaGVldDsKKworICAgIGlmICh1cGRhdGVGbGFnICE9IFJlY2FsY1N0eWxlSWZO
ZWVkZWQpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoIW1fc3R5bGVSZXNvbHZlcikKKyAgICAg
ICAgcmV0dXJuOworCisgICAgLy8gU2VlIGlmIHdlIGFyZSBqdXN0IGFkZGluZyBzdHlsZXNoZWV0
cy4KKyAgICB1bnNpZ25lZCBvbGRTdHlsZXNoZWV0Q291bnQgPSBtX3N0eWxlU2hlZXRzLT5sZW5n
dGgoKTsKKyAgICBpZiAobmV3U3R5bGVzaGVldENvdW50IDwgb2xkU3R5bGVzaGVldENvdW50KQor
ICAgICAgICByZXR1cm47CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG9sZFN0eWxlc2hl
ZXRDb3VudDsgKytpKSB7CisgICAgICAgIGlmIChtX3N0eWxlU2hlZXRzLT5pdGVtKGkpICE9IG5l
d1N0eWxlc2hlZXRzW2ldKQorICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICByZXF1aXJl
c1N0eWxlUmVzb2x2ZXJSZXNldCA9IGZhbHNlOworCisgICAgLy8gSWYgd2UgYXJlIGFscmVhZHkg
cGFyc2luZyB0aGUgYm9keSBhbmQgc28gbWF5IGhhdmUgc2lnbmlmaWNhbnQgYW1vdW50IG9mIGVs
ZW1lbnRzLCBwdXQgc29tZSBlZmZvcnQgaW50byB0cnlpbmcgdG8gYXZvaWQgc3R5bGUgcmVjYWxj
cy4KKyAgICBpZiAoIWJvZHkoKSB8fCBtX2hhc05vZGVzV2l0aFBsYWNlaG9sZGVyU3R5bGUpCisg
ICAgICAgIHJldHVybjsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSBvbGRTdHlsZXNoZWV0Q291bnQ7
IGkgPCBuZXdTdHlsZXNoZWV0Q291bnQ7ICsraSkgeworICAgICAgICBpZiAoIW5ld1N0eWxlc2hl
ZXRzW2ldLT5pc0NTU1N0eWxlU2hlZXQoKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
aWYgKG5ld1N0eWxlc2hlZXRzW2ldLT5kaXNhYmxlZCgpKQorICAgICAgICAgICAgY29udGludWU7
CisgICAgICAgIGlmICh0ZXN0QWRkZWRTdHlsZXNoZWV0UmVxdWlyZXNTdHlsZVJlY2FsYyhzdGF0
aWNfY2FzdDxDU1NTdHlsZVNoZWV0Kj4obmV3U3R5bGVzaGVldHNbaV0uZ2V0KCkpLT5jb250ZW50
cygpKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcmVxdWlyZXNGdWxsU3R5bGVS
ZWNhbGMgPSBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgc3R5bGVTaGVldHNVc2VSZW1Vbml0cyhj
b25zdCBWZWN0b3I8UmVmUHRyPFN0eWxlU2hlZXQ+ID4mIHNoZWV0cykKK3sKKyAgICBmb3IgKHVu
c2lnbmVkIGkgPSAwOyBpIDwgc2hlZXRzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmICghc2hl
ZXRzW2ldLT5pc0NTU1N0eWxlU2hlZXQoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAg
ICBpZiAoc3RhdGljX2Nhc3Q8Q1NTU3R5bGVTaGVldCo+KHNoZWV0c1tpXS5nZXQoKSktPmNvbnRl
bnRzKCktPnVzZXNSZW1Vbml0cygpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQor
ICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBEb2N1bWVudDo6bm90aWZ5U2VhbWxlc3NDaGls
ZERvY3VtZW50c09mU3R5bGVzaGVldFVwZGF0ZSgpIGNvbnN0Cit7CisgICAgLy8gSWYgd2UncmUg
bm90IGluIGEgZnJhbWUgeWV0IGFueSBwb3RlbnRpYWwgY2hpbGQgZG9jdW1lbnRzIHdvbid0IGhh
dmUgYSBTdHlsZVJlc29sdmVyIHRvIHVwZGF0ZS4KKyAgICBpZiAoIWZyYW1lKCkpCisgICAgICAg
IHJldHVybjsKKworICAgIC8vIFNlYW1sZXNzIGNoaWxkIGZyYW1lcyBhcmUgZXhwZWN0ZWQgdG8g
bm90aWZ5IHRoZWlyIHNlYW1sZXNzIGNoaWxkcmVuIHJlY3Vyc2l2ZWx5LCBzbyB3ZSBvbmx5IGRv
IGRpcmVjdCBjaGlsZHJlbi4KKyAgICBmb3IgKEZyYW1lKiBjaGlsZCA9IGZyYW1lKCktPnRyZWUo
KS0+Zmlyc3RDaGlsZCgpOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+dHJlZSgpLT5uZXh0U2libGlu
ZygpKSB7CisgICAgICAgIERvY3VtZW50KiBjaGlsZERvY3VtZW50ID0gY2hpbGQtPmRvY3VtZW50
KCk7CisgICAgICAgIGlmIChjaGlsZERvY3VtZW50LT5zaG91bGREaXNwbGF5U2VhbWxlc3NseVdp
dGhQYXJlbnQoKSkgeworICAgICAgICAgICAgQVNTRVJUKGNoaWxkRG9jdW1lbnQtPnNlYW1sZXNz
UGFyZW50SUZyYW1lKCktPmRvY3VtZW50KCkgPT0gdGhpcyk7CisgICAgICAgICAgICBjaGlsZERv
Y3VtZW50LT5zZWFtbGVzc1BhcmVudFVwZGF0ZWRTdHlsZXNoZWV0cygpOworICAgICAgICB9Cisg
ICAgfQorfQorCitib29sIERvY3VtZW50Ojp1cGRhdGVBY3RpdmVTdHlsZXNoZWV0cyhTdHlsZVJl
c29sdmVyVXBkYXRlRmxhZyB1cGRhdGVGbGFnKQoreworICAgIGlmIChtX2luU3R5bGVSZWNhbGMp
IHsKKyAgICAgICAgLy8gU1ZHIDx1c2U+IGVsZW1lbnQgbWF5IG1hbmFnZSB0byBpbnZhbGlkYXRl
IHN0eWxlIHNlbGVjdG9yIGluIHRoZSBtaWRkbGUgb2YgYSBzdHlsZSByZWNhbGMuCisgICAgICAg
IC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD01NDM0NAorICAgICAg
ICAvLyBGSVhNRTogVGhpcyBzaG91bGQgYmUgZml4ZWQgaW4gU1ZHIGFuZCB0aGlzIGNvZGUgcmVw
bGFjZWQgd2l0aCBBU1NFUlQoIW1faW5TdHlsZVJlY2FsYykuCisgICAgICAgIG1faGFzRGlydHlT
dHlsZVJlc29sdmVyID0gdHJ1ZTsKKyAgICAgICAgc2NoZWR1bGVGb3JjZWRTdHlsZVJlY2FsYygp
OworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghcmVuZGVyZXIoKSB8fCAh
YXR0YWNoZWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgU3R5bGVTaGVldFZlY3Rv
ciBuZXdTdHlsZXNoZWV0czsKKyAgICBjb2xsZWN0QWN0aXZlU3R5bGVzaGVldHMobmV3U3R5bGVz
aGVldHMpOworCisgICAgYm9vbCByZXF1aXJlc1N0eWxlUmVzb2x2ZXJSZXNldDsKKyAgICBib29s
IHJlcXVpcmVzRnVsbFN0eWxlUmVjYWxjOworICAgIGFuYWx5emVTdHlsZXNoZWV0Q2hhbmdlKHVw
ZGF0ZUZsYWcsIG5ld1N0eWxlc2hlZXRzLCByZXF1aXJlc1N0eWxlUmVzb2x2ZXJSZXNldCwgcmVx
dWlyZXNGdWxsU3R5bGVSZWNhbGMpOworCisgICAgaWYgKHJlcXVpcmVzU3R5bGVSZXNvbHZlclJl
c2V0KQorICAgICAgICBjbGVhclN0eWxlUmVzb2x2ZXIoKTsKKyAgICBlbHNlIHsKKyAgICAgICAg
bV9zdHlsZVJlc29sdmVyLT5hcHBlbmRBdXRob3JTdHlsZXNoZWV0cyhtX3N0eWxlU2hlZXRzLT5s
ZW5ndGgoKSwgbmV3U3R5bGVzaGVldHMpOworICAgICAgICByZXNldENTU0ZlYXR1cmVGbGFncygp
OworICAgIH0KKyAgICBtX3N0eWxlU2hlZXRzLT5zd2FwKG5ld1N0eWxlc2hlZXRzKTsKKworICAg
IG1fdXNlc1JlbVVuaXRzID0gc3R5bGVTaGVldHNVc2VSZW1Vbml0cyhtX3N0eWxlU2hlZXRzLT52
ZWN0b3IoKSk7CisgICAgbV9kaWRDYWxjdWxhdGVTdHlsZVJlc29sdmVyID0gdHJ1ZTsKKyAgICBt
X2hhc0RpcnR5U3R5bGVSZXNvbHZlciA9IGZhbHNlOworCisgICAgbm90aWZ5U2VhbWxlc3NDaGls
ZERvY3VtZW50c09mU3R5bGVzaGVldFVwZGF0ZSgpOworCisgICAgcmV0dXJuIHJlcXVpcmVzRnVs
bFN0eWxlUmVjYWxjOworfQorCit2b2lkIERvY3VtZW50OjpzZXRIb3Zlck5vZGUoUGFzc1JlZlB0
cjxOb2RlPiBuZXdIb3Zlck5vZGUpCit7CisgICAgbV9ob3Zlck5vZGUgPSBuZXdIb3Zlck5vZGU7
Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnNldEFjdGl2ZU5vZGUoUGFzc1JlZlB0cjxOb2RlPiBuZXdB
Y3RpdmVOb2RlKQoreworICAgIG1fYWN0aXZlTm9kZSA9IG5ld0FjdGl2ZU5vZGU7Cit9CisKK3Zv
aWQgRG9jdW1lbnQ6OmZvY3VzZWROb2RlUmVtb3ZlZCgpCit7CisgICAgc2V0Rm9jdXNlZE5vZGUo
MCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnJlbW92ZUZvY3VzZWROb2RlT2ZTdWJ0cmVlKE5vZGUq
IG5vZGUsIGJvb2wgYW1vbmdDaGlsZHJlbk9ubHkpCit7CisgICAgaWYgKCFtX2ZvY3VzZWROb2Rl
IHx8IHRoaXMtPmluUGFnZUNhY2hlKCkpIC8vIElmIHRoZSBkb2N1bWVudCBpcyBpbiB0aGUgcGFn
ZSBjYWNoZSwgdGhlbiB3ZSBkb24ndCBuZWVkIHRvIGNsZWFyIG91dCB0aGUgZm9jdXNlZCBub2Rl
LgorICAgICAgICByZXR1cm47CisgICAgICAgIAorICAgIGJvb2wgbm9kZUluU3VidHJlZSA9IGZh
bHNlOworICAgIGlmIChhbW9uZ0NoaWxkcmVuT25seSkKKyAgICAgICAgbm9kZUluU3VidHJlZSA9
IG1fZm9jdXNlZE5vZGUtPmlzRGVzY2VuZGFudE9mKG5vZGUpOworICAgIGVsc2UKKyAgICAgICAg
bm9kZUluU3VidHJlZSA9IChtX2ZvY3VzZWROb2RlID09IG5vZGUpIHx8IG1fZm9jdXNlZE5vZGUt
PmlzRGVzY2VuZGFudE9mKG5vZGUpOworICAgIAorICAgIGlmIChub2RlSW5TdWJ0cmVlKQorICAg
ICAgICBkb2N1bWVudCgpLT5mb2N1c2VkTm9kZVJlbW92ZWQoKTsKK30KKwordm9pZCBEb2N1bWVu
dDo6aG92ZXJlZE5vZGVEZXRhY2hlZChOb2RlKiBub2RlKQoreworICAgIGlmICghbV9ob3Zlck5v
ZGUgfHwgKG5vZGUgIT0gbV9ob3Zlck5vZGUgJiYgKCFtX2hvdmVyTm9kZS0+aXNUZXh0Tm9kZSgp
IHx8IG5vZGUgIT0gbV9ob3Zlck5vZGUtPnBhcmVudE5vZGUoKSkpKQorICAgICAgICByZXR1cm47
CisKKyAgICBtX2hvdmVyTm9kZSA9IG5vZGUtPnBhcmVudE5vZGUoKTsKKyAgICB3aGlsZSAobV9o
b3Zlck5vZGUgJiYgIW1faG92ZXJOb2RlLT5yZW5kZXJlcigpKQorICAgICAgICBtX2hvdmVyTm9k
ZSA9IG1faG92ZXJOb2RlLT5wYXJlbnROb2RlKCk7CisgICAgaWYgKGZyYW1lKCkpCisgICAgICAg
IGZyYW1lKCktPmV2ZW50SGFuZGxlcigpLT5zY2hlZHVsZUhvdmVyU3RhdGVVcGRhdGUoKTsKK30K
Kwordm9pZCBEb2N1bWVudDo6YWN0aXZlQ2hhaW5Ob2RlRGV0YWNoZWQoTm9kZSogbm9kZSkKK3sK
KyAgICBpZiAoIW1fYWN0aXZlTm9kZSB8fCAobm9kZSAhPSBtX2FjdGl2ZU5vZGUgJiYgKCFtX2Fj
dGl2ZU5vZGUtPmlzVGV4dE5vZGUoKSB8fCBub2RlICE9IG1fYWN0aXZlTm9kZS0+cGFyZW50Tm9k
ZSgpKSkpCisgICAgICAgIHJldHVybjsKKworICAgIG1fYWN0aXZlTm9kZSA9IG5vZGUtPnBhcmVu
dE5vZGUoKTsKKyAgICB3aGlsZSAobV9hY3RpdmVOb2RlICYmICFtX2FjdGl2ZU5vZGUtPnJlbmRl
cmVyKCkpCisgICAgICAgIG1fYWN0aXZlTm9kZSA9IG1fYWN0aXZlTm9kZS0+cGFyZW50Tm9kZSgp
OworfQorCisjaWYgRU5BQkxFKERBU0hCT0FSRF9TVVBQT1JUKSB8fCBFTkFCTEUoV0lER0VUX1JF
R0lPTikKK2NvbnN0IFZlY3RvcjxEYXNoYm9hcmRSZWdpb25WYWx1ZT4mIERvY3VtZW50OjpkYXNo
Ym9hcmRSZWdpb25zKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9kYXNoYm9hcmRSZWdpb25zOwor
fQorCit2b2lkIERvY3VtZW50OjpzZXREYXNoYm9hcmRSZWdpb25zKGNvbnN0IFZlY3RvcjxEYXNo
Ym9hcmRSZWdpb25WYWx1ZT4mIHJlZ2lvbnMpCit7CisgICAgbV9kYXNoYm9hcmRSZWdpb25zID0g
cmVnaW9uczsKKyAgICBzZXREYXNoYm9hcmRSZWdpb25zRGlydHkoZmFsc2UpOworfQorI2VuZGlm
CisKK2Jvb2wgRG9jdW1lbnQ6OnNldEZvY3VzZWROb2RlKFBhc3NSZWZQdHI8Tm9kZT4gcHJwTmV3
Rm9jdXNlZE5vZGUpCit7CisgICAgUmVmUHRyPE5vZGU+IG5ld0ZvY3VzZWROb2RlID0gcHJwTmV3
Rm9jdXNlZE5vZGU7CisKKyAgICAvLyBNYWtlIHN1cmUgbmV3Rm9jdXNlZE5vZGUgaXMgYWN0dWFs
bHkgaW4gdGhpcyBkb2N1bWVudAorICAgIGlmIChuZXdGb2N1c2VkTm9kZSAmJiAobmV3Rm9jdXNl
ZE5vZGUtPmRvY3VtZW50KCkgIT0gdGhpcykpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAg
aWYgKG1fZm9jdXNlZE5vZGUgPT0gbmV3Rm9jdXNlZE5vZGUpCisgICAgICAgIHJldHVybiB0cnVl
OworCisgICAgaWYgKG1faW5QYWdlQ2FjaGUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
IGJvb2wgZm9jdXNDaGFuZ2VCbG9ja2VkID0gZmFsc2U7CisgICAgUmVmUHRyPE5vZGU+IG9sZEZv
Y3VzZWROb2RlID0gbV9mb2N1c2VkTm9kZTsKKyAgICBtX2ZvY3VzZWROb2RlID0gMDsKKworICAg
IC8vIFJlbW92ZSBmb2N1cyBmcm9tIHRoZSBleGlzdGluZyBmb2N1cyBub2RlIChpZiBhbnkpCisg
ICAgaWYgKG9sZEZvY3VzZWROb2RlKSB7CisgICAgICAgIEFTU0VSVCghb2xkRm9jdXNlZE5vZGUt
PmluRGV0YWNoKCkpOworCisgICAgICAgIGlmIChvbGRGb2N1c2VkTm9kZS0+YWN0aXZlKCkpCisg
ICAgICAgICAgICBvbGRGb2N1c2VkTm9kZS0+c2V0QWN0aXZlKGZhbHNlKTsKKworICAgICAgICBv
bGRGb2N1c2VkTm9kZS0+c2V0Rm9jdXMoZmFsc2UpOworCisgICAgICAgIC8vIERpc3BhdGNoIGEg
Y2hhbmdlIGV2ZW50IGZvciB0ZXh0IGZpZWxkcyBvciB0ZXh0YXJlYXMgdGhhdCBoYXZlIGJlZW4g
ZWRpdGVkCisgICAgICAgIGlmIChvbGRGb2N1c2VkTm9kZS0+aXNFbGVtZW50Tm9kZSgpKSB7Cisg
ICAgICAgICAgICBFbGVtZW50KiBlbGVtZW50ID0gc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG9sZEZv
Y3VzZWROb2RlLmdldCgpKTsKKyAgICAgICAgICAgIGlmIChlbGVtZW50LT53YXNDaGFuZ2VkU2lu
Y2VMYXN0Rm9ybUNvbnRyb2xDaGFuZ2VFdmVudCgpKQorICAgICAgICAgICAgICAgIGVsZW1lbnQt
PmRpc3BhdGNoRm9ybUNvbnRyb2xDaGFuZ2VFdmVudCgpOworICAgICAgICB9CisKKyAgICAgICAg
Ly8gRGlzcGF0Y2ggdGhlIGJsdXIgZXZlbnQgYW5kIGxldCB0aGUgbm9kZSBkbyBhbnkgb3RoZXIg
Ymx1ciByZWxhdGVkIGFjdGl2aXRpZXMgKGltcG9ydGFudCBmb3IgdGV4dCBmaWVsZHMpCisgICAg
ICAgIG9sZEZvY3VzZWROb2RlLT5kaXNwYXRjaEJsdXJFdmVudChuZXdGb2N1c2VkTm9kZSk7CisK
KyAgICAgICAgaWYgKG1fZm9jdXNlZE5vZGUpIHsKKyAgICAgICAgICAgIC8vIGhhbmRsZXIgc2hp
ZnRlZCBmb2N1cworICAgICAgICAgICAgZm9jdXNDaGFuZ2VCbG9ja2VkID0gdHJ1ZTsKKyAgICAg
ICAgICAgIG5ld0ZvY3VzZWROb2RlID0gMDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAg
b2xkRm9jdXNlZE5vZGUtPmRpc3BhdGNoRm9jdXNPdXRFdmVudChldmVudE5hbWVzKCkuZm9jdXNv
dXRFdmVudCwgbmV3Rm9jdXNlZE5vZGUpOyAvLyBET00gbGV2ZWwgMyBuYW1lIGZvciB0aGUgYnVi
YmxpbmcgYmx1ciBldmVudC4KKyAgICAgICAgLy8gRklYTUU6IFdlIHNob3VsZCByZW1vdmUgZmly
aW5nIERPTUZvY3VzT3V0RXZlbnQgZXZlbnQgd2hlbiB3ZSBhcmUgc3VyZSBubyBjb250ZW50IGRl
cGVuZHMKKyAgICAgICAgLy8gb24gaXQsIHByb2JhYmx5IHdoZW4gPHJkYXI6Ly9wcm9ibGVtLzg1
MDM5NTg+IGlzIHJlc29sdmVkLgorICAgICAgICBvbGRGb2N1c2VkTm9kZS0+ZGlzcGF0Y2hGb2N1
c091dEV2ZW50KGV2ZW50TmFtZXMoKS5ET01Gb2N1c091dEV2ZW50LCBuZXdGb2N1c2VkTm9kZSk7
IC8vIERPTSBsZXZlbCAyIG5hbWUgZm9yIGNvbXBhdGliaWxpdHkuCisKKyAgICAgICAgaWYgKG1f
Zm9jdXNlZE5vZGUpIHsKKyAgICAgICAgICAgIC8vIGhhbmRsZXIgc2hpZnRlZCBmb2N1cworICAg
ICAgICAgICAgZm9jdXNDaGFuZ2VCbG9ja2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIG5ld0ZvY3Vz
ZWROb2RlID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAob2xkRm9jdXNlZE5vZGUgPT0gdGhp
cyAmJiBvbGRGb2N1c2VkTm9kZS0+aGFzT25lUmVmKCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICAgICAgICAgIAorICAgICAgICBpZiAob2xkRm9jdXNlZE5vZGUtPmlzUm9vdEVkaXRh
YmxlRWxlbWVudCgpKQorICAgICAgICAgICAgZnJhbWUoKS0+ZWRpdG9yKCktPmRpZEVuZEVkaXRp
bmcoKTsKKworICAgICAgICBpZiAodmlldygpKSB7CisgICAgICAgICAgICBXaWRnZXQqIG9sZFdp
ZGdldCA9IHdpZGdldEZvck5vZGUob2xkRm9jdXNlZE5vZGUuZ2V0KCkpOworICAgICAgICAgICAg
aWYgKG9sZFdpZGdldCkKKyAgICAgICAgICAgICAgICBvbGRXaWRnZXQtPnNldEZvY3VzKGZhbHNl
KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB2aWV3KCktPnNldEZvY3VzKGZh
bHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChuZXdGb2N1c2VkTm9kZSkgeworICAg
ICAgICBpZiAobmV3Rm9jdXNlZE5vZGUtPmlzUm9vdEVkaXRhYmxlRWxlbWVudCgpICYmICFhY2Nl
cHRzRWRpdGluZ0ZvY3VzKG5ld0ZvY3VzZWROb2RlLmdldCgpKSkgeworICAgICAgICAgICAgLy8g
ZGVsZWdhdGUgYmxvY2tzIGZvY3VzIGNoYW5nZQorICAgICAgICAgICAgZm9jdXNDaGFuZ2VCbG9j
a2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIGdvdG8gU2V0Rm9jdXNlZE5vZGVEb25lOworICAgICAg
ICB9CisgICAgICAgIC8vIFNldCBmb2N1cyBvbiB0aGUgbmV3IG5vZGUKKyAgICAgICAgbV9mb2N1
c2VkTm9kZSA9IG5ld0ZvY3VzZWROb2RlOworCisgICAgICAgIC8vIERpc3BhdGNoIHRoZSBmb2N1
cyBldmVudCBhbmQgbGV0IHRoZSBub2RlIGRvIGFueSBvdGhlciBmb2N1cyByZWxhdGVkIGFjdGl2
aXRpZXMgKGltcG9ydGFudCBmb3IgdGV4dCBmaWVsZHMpCisgICAgICAgIG1fZm9jdXNlZE5vZGUt
PmRpc3BhdGNoRm9jdXNFdmVudChvbGRGb2N1c2VkTm9kZSk7CisKKyAgICAgICAgaWYgKG1fZm9j
dXNlZE5vZGUgIT0gbmV3Rm9jdXNlZE5vZGUpIHsKKyAgICAgICAgICAgIC8vIGhhbmRsZXIgc2hp
ZnRlZCBmb2N1cworICAgICAgICAgICAgZm9jdXNDaGFuZ2VCbG9ja2VkID0gdHJ1ZTsKKyAgICAg
ICAgICAgIGdvdG8gU2V0Rm9jdXNlZE5vZGVEb25lOworICAgICAgICB9CisKKyAgICAgICAgbV9m
b2N1c2VkTm9kZS0+ZGlzcGF0Y2hGb2N1c0luRXZlbnQoZXZlbnROYW1lcygpLmZvY3VzaW5FdmVu
dCwgb2xkRm9jdXNlZE5vZGUpOyAvLyBET00gbGV2ZWwgMyBidWJibGluZyBmb2N1cyBldmVudC4K
KworICAgICAgICBpZiAobV9mb2N1c2VkTm9kZSAhPSBuZXdGb2N1c2VkTm9kZSkgeworICAgICAg
ICAgICAgLy8gaGFuZGxlciBzaGlmdGVkIGZvY3VzCisgICAgICAgICAgICBmb2N1c0NoYW5nZUJs
b2NrZWQgPSB0cnVlOworICAgICAgICAgICAgZ290byBTZXRGb2N1c2VkTm9kZURvbmU7CisgICAg
ICAgIH0KKworICAgICAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIHJlbW92ZSBmaXJpbmcgRE9NRm9j
dXNJbkV2ZW50IGV2ZW50IHdoZW4gd2UgYXJlIHN1cmUgbm8gY29udGVudCBkZXBlbmRzCisgICAg
ICAgIC8vIG9uIGl0LCBwcm9iYWJseSB3aGVuIDxyZGFyOi8vcHJvYmxlbS84NTAzOTU4PiBpcyBt
LgorICAgICAgICBtX2ZvY3VzZWROb2RlLT5kaXNwYXRjaEZvY3VzSW5FdmVudChldmVudE5hbWVz
KCkuRE9NRm9jdXNJbkV2ZW50LCBvbGRGb2N1c2VkTm9kZSk7IC8vIERPTSBsZXZlbCAyIGZvciBj
b21wYXRpYmlsaXR5LgorCisgICAgICAgIGlmIChtX2ZvY3VzZWROb2RlICE9IG5ld0ZvY3VzZWRO
b2RlKSB7IAorICAgICAgICAgICAgLy8gaGFuZGxlciBzaGlmdGVkIGZvY3VzCisgICAgICAgICAg
ICBmb2N1c0NoYW5nZUJsb2NrZWQgPSB0cnVlOworICAgICAgICAgICAgZ290byBTZXRGb2N1c2Vk
Tm9kZURvbmU7CisgICAgICAgIH0KKyAgICAgICAgbV9mb2N1c2VkTm9kZS0+c2V0Rm9jdXModHJ1
ZSk7CisKKyAgICAgICAgaWYgKG1fZm9jdXNlZE5vZGUtPmlzUm9vdEVkaXRhYmxlRWxlbWVudCgp
KQorICAgICAgICAgICAgZnJhbWUoKS0+ZWRpdG9yKCktPmRpZEJlZ2luRWRpdGluZygpOworCisg
ICAgICAgIC8vIGV3dywgSSBzdWNrLiBzZXQgdGhlIHF0IGZvY3VzIGNvcnJlY3RseQorICAgICAg
ICAvLyAjIyMgZmluZCBhIGJldHRlciBwbGFjZSBpbiB0aGUgY29kZSBmb3IgdGhpcworICAgICAg
ICBpZiAodmlldygpKSB7CisgICAgICAgICAgICBXaWRnZXQqIGZvY3VzV2lkZ2V0ID0gd2lkZ2V0
Rm9yTm9kZShtX2ZvY3VzZWROb2RlLmdldCgpKTsKKyAgICAgICAgICAgIGlmIChmb2N1c1dpZGdl
dCkgeworICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBhIHdpZGdldCBoYXMgdGhlIHJpZ2h0
IHNpemUgYmVmb3JlIGdpdmluZyBpdCBmb2N1cy4KKyAgICAgICAgICAgICAgICAvLyBPdGhlcndp
c2UsIHdlIGFyZSB0ZXN0aW5nIGVkZ2UgY2FzZXMgb2YgdGhlIFdpZGdldCBjb2RlLgorICAgICAg
ICAgICAgICAgIC8vIFNwZWNpZmljYWxseSwgaW4gV2ViQ29yZSB0aGlzIGRvZXMgbm90IHdvcmsg
d2VsbCBmb3IgdGV4dCBmaWVsZHMuCisgICAgICAgICAgICAgICAgdXBkYXRlTGF5b3V0KCk7Cisg
ICAgICAgICAgICAgICAgLy8gUmUtZ2V0IHRoZSB3aWRnZXQgaW4gY2FzZSB1cGRhdGluZyB0aGUg
bGF5b3V0IGNoYW5nZWQgdGhpbmdzLgorICAgICAgICAgICAgICAgIGZvY3VzV2lkZ2V0ID0gd2lk
Z2V0Rm9yTm9kZShtX2ZvY3VzZWROb2RlLmdldCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIGlmIChmb2N1c1dpZGdldCkKKyAgICAgICAgICAgICAgICBmb2N1c1dpZGdldC0+c2V0Rm9j
dXModHJ1ZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdmlldygpLT5zZXRG
b2N1cyh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworI2lmIFBMQVRGT1JNKE1BQykgfHwgUExB
VEZPUk0oV0lOKSB8fCBQTEFURk9STShHVEspIHx8IFBMQVRGT1JNKENIUk9NSVVNKQorICAgIGlm
ICghZm9jdXNDaGFuZ2VCbG9ja2VkICYmIG1fZm9jdXNlZE5vZGUgJiYgQVhPYmplY3RDYWNoZTo6
YWNjZXNzaWJpbGl0eUVuYWJsZWQoKSkKKyAgICAgICAgYXhPYmplY3RDYWNoZSgpLT5oYW5kbGVG
b2N1c2VkVUlFbGVtZW50Q2hhbmdlZChvbGRGb2N1c2VkTm9kZS5nZXQoKSwgbmV3Rm9jdXNlZE5v
ZGUuZ2V0KCkpOworI2VuZGlmCisgICAgaWYgKCFmb2N1c0NoYW5nZUJsb2NrZWQpCisgICAgICAg
IHBhZ2UoKS0+Y2hyb21lKCktPmZvY3VzZWROb2RlQ2hhbmdlZChtX2ZvY3VzZWROb2RlLmdldCgp
KTsKKworU2V0Rm9jdXNlZE5vZGVEb25lOgorICAgIHVwZGF0ZVN0eWxlSWZOZWVkZWQoKTsKKyAg
ICByZXR1cm4gIWZvY3VzQ2hhbmdlQmxvY2tlZDsKK30KKyAgICAKK3ZvaWQgRG9jdW1lbnQ6Omdl
dEZvY3VzYWJsZU5vZGVzKFZlY3RvcjxSZWZQdHI8Tm9kZT4gPiYgbm9kZXMpCit7CisgICAgdXBk
YXRlTGF5b3V0KCk7CisKKyAgICBmb3IgKE5vZGUqIG5vZGUgPSBmaXJzdENoaWxkKCk7IG5vZGU7
IG5vZGUgPSBub2RlLT50cmF2ZXJzZU5leHROb2RlKCkpIHsKKyAgICAgICAgaWYgKG5vZGUtPmlz
Rm9jdXNhYmxlKCkpCisgICAgICAgICAgICBub2Rlcy5hcHBlbmQobm9kZSk7CisgICAgfQorfQor
ICAKK3ZvaWQgRG9jdW1lbnQ6OnNldENTU1RhcmdldChFbGVtZW50KiBuKQoreworICAgIGlmICht
X2Nzc1RhcmdldCkKKyAgICAgICAgbV9jc3NUYXJnZXQtPnNldE5lZWRzU3R5bGVSZWNhbGMoKTsK
KyAgICBtX2Nzc1RhcmdldCA9IG47CisgICAgaWYgKG4pCisgICAgICAgIG4tPnNldE5lZWRzU3R5
bGVSZWNhbGMoKTsKK30KKwordm9pZCBEb2N1bWVudDo6cmVnaXN0ZXJOb2RlTGlzdENhY2hlKER5
bmFtaWNOb2RlTGlzdENhY2hlQmFzZSogbGlzdCkKK3sKKyAgICBpZiAobGlzdC0+dHlwZSgpICE9
IE5vZGVMaXN0Q29sbGVjdGlvblR5cGUpCisgICAgICAgIG1fbm9kZUxpc3RDb3VudHNbSW52YWxp
ZGF0ZU9uSWROYW1lQXR0ckNoYW5nZV0rKzsKKyAgICBtX25vZGVMaXN0Q291bnRzW2xpc3QtPmlu
dmFsaWRhdGlvblR5cGUoKV0rKzsKKyAgICBpZiAobGlzdC0+aXNSb290ZWRBdERvY3VtZW50KCkp
CisgICAgICAgIG1fbGlzdHNJbnZhbGlkYXRlZEF0RG9jdW1lbnQuYWRkKGxpc3QpOworfQorCit2
b2lkIERvY3VtZW50Ojp1bnJlZ2lzdGVyTm9kZUxpc3RDYWNoZShEeW5hbWljTm9kZUxpc3RDYWNo
ZUJhc2UqIGxpc3QpCit7CisgICAgaWYgKGxpc3QtPnR5cGUoKSAhPSBOb2RlTGlzdENvbGxlY3Rp
b25UeXBlKQorICAgICAgICBtX25vZGVMaXN0Q291bnRzW0ludmFsaWRhdGVPbklkTmFtZUF0dHJD
aGFuZ2VdLS07CisgICAgbV9ub2RlTGlzdENvdW50c1tsaXN0LT5pbnZhbGlkYXRpb25UeXBlKCld
LS07CisgICAgaWYgKGxpc3QtPmlzUm9vdGVkQXREb2N1bWVudCgpKSB7CisgICAgICAgIEFTU0VS
VChtX2xpc3RzSW52YWxpZGF0ZWRBdERvY3VtZW50LmNvbnRhaW5zKGxpc3QpKTsKKyAgICAgICAg
bV9saXN0c0ludmFsaWRhdGVkQXREb2N1bWVudC5yZW1vdmUobGlzdCk7CisgICAgfQorfQorCit2
b2lkIERvY3VtZW50OjphdHRhY2hOb2RlSXRlcmF0b3IoTm9kZUl0ZXJhdG9yKiBuaSkKK3sKKyAg
ICBtX25vZGVJdGVyYXRvcnMuYWRkKG5pKTsKK30KKwordm9pZCBEb2N1bWVudDo6ZGV0YWNoTm9k
ZUl0ZXJhdG9yKE5vZGVJdGVyYXRvciogbmkpCit7CisgICAgLy8gVGhlIG5vZGUgaXRlcmF0b3Ig
Y2FuIGJlIGRldGFjaGVkIHdpdGhvdXQgaGF2aW5nIGJlZW4gYXR0YWNoZWQgaWYgaXRzIHJvb3Qg
bm9kZSBkaWRuJ3QgaGF2ZSBhIGRvY3VtZW50CisgICAgLy8gd2hlbiB0aGUgaXRlcmF0b3Igd2Fz
IGNyZWF0ZWQsIGJ1dCBoYXMgaXQgbm93LgorICAgIG1fbm9kZUl0ZXJhdG9ycy5yZW1vdmUobmkp
OworfQorCit2b2lkIERvY3VtZW50Ojptb3ZlTm9kZUl0ZXJhdG9yc1RvTmV3RG9jdW1lbnQoTm9k
ZSogbm9kZSwgRG9jdW1lbnQqIG5ld0RvY3VtZW50KQoreworICAgIEhhc2hTZXQ8Tm9kZUl0ZXJh
dG9yKj4gbm9kZUl0ZXJhdG9yc0xpc3QgPSBtX25vZGVJdGVyYXRvcnM7CisgICAgSGFzaFNldDxO
b2RlSXRlcmF0b3IqPjo6Y29uc3RfaXRlcmF0b3Igbm9kZUl0ZXJhdG9yc0VuZCA9IG5vZGVJdGVy
YXRvcnNMaXN0LmVuZCgpOworICAgIGZvciAoSGFzaFNldDxOb2RlSXRlcmF0b3IqPjo6Y29uc3Rf
aXRlcmF0b3IgaXQgPSBub2RlSXRlcmF0b3JzTGlzdC5iZWdpbigpOyBpdCAhPSBub2RlSXRlcmF0
b3JzRW5kOyArK2l0KSB7CisgICAgICAgIGlmICgoKml0KS0+cm9vdCgpID09IG5vZGUpIHsKKyAg
ICAgICAgICAgIGRldGFjaE5vZGVJdGVyYXRvcigqaXQpOworICAgICAgICAgICAgbmV3RG9jdW1l
bnQtPmF0dGFjaE5vZGVJdGVyYXRvcigqaXQpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lk
IERvY3VtZW50Ojp1cGRhdGVSYW5nZXNBZnRlckNoaWxkcmVuQ2hhbmdlZChDb250YWluZXJOb2Rl
KiBjb250YWluZXIpCit7CisgICAgaWYgKCFtX3Jhbmdlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAg
SGFzaFNldDxSYW5nZSo+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBtX3Jhbmdlcy5lbmQoKTsKKyAg
ICAgICAgZm9yIChIYXNoU2V0PFJhbmdlKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yYW5nZXMu
YmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KQorICAgICAgICAgICAgKCppdCktPm5vZGVDaGlsZHJl
bkNoYW5nZWQoY29udGFpbmVyKTsKKyAgICB9Cit9CisKK3ZvaWQgRG9jdW1lbnQ6Om5vZGVDaGls
ZHJlbldpbGxCZVJlbW92ZWQoQ29udGFpbmVyTm9kZSogY29udGFpbmVyKQoreworICAgIGlmICgh
bV9yYW5nZXMuaXNFbXB0eSgpKSB7CisgICAgICAgIEhhc2hTZXQ8UmFuZ2UqPjo6Y29uc3RfaXRl
cmF0b3IgZW5kID0gbV9yYW5nZXMuZW5kKCk7CisgICAgICAgIGZvciAoSGFzaFNldDxSYW5nZSo+
Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmFuZ2VzLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkK
KyAgICAgICAgICAgICgqaXQpLT5ub2RlQ2hpbGRyZW5XaWxsQmVSZW1vdmVkKGNvbnRhaW5lcik7
CisgICAgfQorCisgICAgSGFzaFNldDxOb2RlSXRlcmF0b3IqPjo6Y29uc3RfaXRlcmF0b3Igbm9k
ZUl0ZXJhdG9yc0VuZCA9IG1fbm9kZUl0ZXJhdG9ycy5lbmQoKTsKKyAgICBmb3IgKEhhc2hTZXQ8
Tm9kZUl0ZXJhdG9yKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9ub2RlSXRlcmF0b3JzLmJlZ2lu
KCk7IGl0ICE9IG5vZGVJdGVyYXRvcnNFbmQ7ICsraXQpIHsKKyAgICAgICAgZm9yIChOb2RlKiBu
ID0gY29udGFpbmVyLT5maXJzdENoaWxkKCk7IG47IG4gPSBuLT5uZXh0U2libGluZygpKQorICAg
ICAgICAgICAgKCppdCktPm5vZGVXaWxsQmVSZW1vdmVkKG4pOworICAgIH0KKworICAgIGlmIChG
cmFtZSogZnJhbWUgPSB0aGlzLT5mcmFtZSgpKSB7CisgICAgICAgIGZvciAoTm9kZSogbiA9IGNv
bnRhaW5lci0+Zmlyc3RDaGlsZCgpOyBuOyBuID0gbi0+bmV4dFNpYmxpbmcoKSkgeworICAgICAg
ICAgICAgZnJhbWUtPmV2ZW50SGFuZGxlcigpLT5ub2RlV2lsbEJlUmVtb3ZlZChuKTsKKyAgICAg
ICAgICAgIGZyYW1lLT5zZWxlY3Rpb24oKS0+bm9kZVdpbGxCZVJlbW92ZWQobik7CisgICAgICAg
ICAgICBmcmFtZS0+cGFnZSgpLT5kcmFnQ2FyZXRDb250cm9sbGVyKCktPm5vZGVXaWxsQmVSZW1v
dmVkKG4pOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIERvY3VtZW50Ojpub2RlV2lsbEJl
UmVtb3ZlZChOb2RlKiBuKQoreworICAgIEhhc2hTZXQ8Tm9kZUl0ZXJhdG9yKj46OmNvbnN0X2l0
ZXJhdG9yIG5vZGVJdGVyYXRvcnNFbmQgPSBtX25vZGVJdGVyYXRvcnMuZW5kKCk7CisgICAgZm9y
IChIYXNoU2V0PE5vZGVJdGVyYXRvcio+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fbm9kZUl0ZXJh
dG9ycy5iZWdpbigpOyBpdCAhPSBub2RlSXRlcmF0b3JzRW5kOyArK2l0KQorICAgICAgICAoKml0
KS0+bm9kZVdpbGxCZVJlbW92ZWQobik7CisKKyAgICBpZiAoIW1fcmFuZ2VzLmlzRW1wdHkoKSkg
eworICAgICAgICBIYXNoU2V0PFJhbmdlKj46OmNvbnN0X2l0ZXJhdG9yIHJhbmdlc0VuZCA9IG1f
cmFuZ2VzLmVuZCgpOworICAgICAgICBmb3IgKEhhc2hTZXQ8UmFuZ2UqPjo6Y29uc3RfaXRlcmF0
b3IgaXQgPSBtX3Jhbmdlcy5iZWdpbigpOyBpdCAhPSByYW5nZXNFbmQ7ICsraXQpCisgICAgICAg
ICAgICAoKml0KS0+bm9kZVdpbGxCZVJlbW92ZWQobik7CisgICAgfQorCisgICAgaWYgKEZyYW1l
KiBmcmFtZSA9IHRoaXMtPmZyYW1lKCkpIHsKKyAgICAgICAgZnJhbWUtPmV2ZW50SGFuZGxlcigp
LT5ub2RlV2lsbEJlUmVtb3ZlZChuKTsKKyAgICAgICAgZnJhbWUtPnNlbGVjdGlvbigpLT5ub2Rl
V2lsbEJlUmVtb3ZlZChuKTsKKyAgICAgICAgZnJhbWUtPnBhZ2UoKS0+ZHJhZ0NhcmV0Q29udHJv
bGxlcigpLT5ub2RlV2lsbEJlUmVtb3ZlZChuKTsKKyAgICB9Cit9CisKK3ZvaWQgRG9jdW1lbnQ6
OnRleHRJbnNlcnRlZChOb2RlKiB0ZXh0LCB1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIGxlbmd0
aCkKK3sKKyAgICBpZiAoIW1fcmFuZ2VzLmlzRW1wdHkoKSkgeworICAgICAgICBIYXNoU2V0PFJh
bmdlKj46OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fcmFuZ2VzLmVuZCgpOworICAgICAgICBmb3Ig
KEhhc2hTZXQ8UmFuZ2UqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3Jhbmdlcy5iZWdpbigpOyBp
dCAhPSBlbmQ7ICsraXQpCisgICAgICAgICAgICAoKml0KS0+dGV4dEluc2VydGVkKHRleHQsIG9m
ZnNldCwgbGVuZ3RoKTsKKyAgICB9CisKKyAgICAvLyBVcGRhdGUgdGhlIG1hcmtlcnMgZm9yIHNw
ZWxsaW5nIGFuZCBncmFtbWFyIGNoZWNraW5nLgorICAgIG1fbWFya2Vycy0+c2hpZnRNYXJrZXJz
KHRleHQsIG9mZnNldCwgbGVuZ3RoKTsKK30KKwordm9pZCBEb2N1bWVudDo6dGV4dFJlbW92ZWQo
Tm9kZSogdGV4dCwgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBsZW5ndGgpCit7CisgICAgaWYg
KCFtX3Jhbmdlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgSGFzaFNldDxSYW5nZSo+Ojpjb25zdF9p
dGVyYXRvciBlbmQgPSBtX3Jhbmdlcy5lbmQoKTsKKyAgICAgICAgZm9yIChIYXNoU2V0PFJhbmdl
Kj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yYW5nZXMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0
KQorICAgICAgICAgICAgKCppdCktPnRleHRSZW1vdmVkKHRleHQsIG9mZnNldCwgbGVuZ3RoKTsK
KyAgICB9CisKKyAgICAvLyBVcGRhdGUgdGhlIG1hcmtlcnMgZm9yIHNwZWxsaW5nIGFuZCBncmFt
bWFyIGNoZWNraW5nLgorICAgIG1fbWFya2Vycy0+cmVtb3ZlTWFya2Vycyh0ZXh0LCBvZmZzZXQs
IGxlbmd0aCk7CisgICAgbV9tYXJrZXJzLT5zaGlmdE1hcmtlcnModGV4dCwgb2Zmc2V0ICsgbGVu
Z3RoLCAwIC0gbGVuZ3RoKTsKK30KKwordm9pZCBEb2N1bWVudDo6dGV4dE5vZGVzTWVyZ2VkKFRl
eHQqIG9sZE5vZGUsIHVuc2lnbmVkIG9mZnNldCkKK3sKKyAgICBpZiAoIW1fcmFuZ2VzLmlzRW1w
dHkoKSkgeworICAgICAgICBOb2RlV2l0aEluZGV4IG9sZE5vZGVXaXRoSW5kZXgob2xkTm9kZSk7
CisgICAgICAgIEhhc2hTZXQ8UmFuZ2UqPjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV9yYW5nZXMu
ZW5kKCk7CisgICAgICAgIGZvciAoSGFzaFNldDxSYW5nZSo+Ojpjb25zdF9pdGVyYXRvciBpdCA9
IG1fcmFuZ2VzLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkKKyAgICAgICAgICAgICgqaXQpLT50
ZXh0Tm9kZXNNZXJnZWQob2xkTm9kZVdpdGhJbmRleCwgb2Zmc2V0KTsKKyAgICB9CisKKyAgICAv
LyBGSVhNRTogVGhpcyBzaG91bGQgdXBkYXRlIG1hcmtlcnMgZm9yIHNwZWxsaW5nIGFuZCBncmFt
bWFyIGNoZWNraW5nLgorfQorCit2b2lkIERvY3VtZW50Ojp0ZXh0Tm9kZVNwbGl0KFRleHQqIG9s
ZE5vZGUpCit7CisgICAgaWYgKCFtX3Jhbmdlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgSGFzaFNl
dDxSYW5nZSo+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBtX3Jhbmdlcy5lbmQoKTsKKyAgICAgICAg
Zm9yIChIYXNoU2V0PFJhbmdlKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yYW5nZXMuYmVnaW4o
KTsgaXQgIT0gZW5kOyArK2l0KQorICAgICAgICAgICAgKCppdCktPnRleHROb2RlU3BsaXQob2xk
Tm9kZSk7CisgICAgfQorCisgICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIHVwZGF0ZSBtYXJrZXJz
IGZvciBzcGVsbGluZyBhbmQgZ3JhbW1hciBjaGVja2luZy4KK30KKwordm9pZCBEb2N1bWVudDo6
Y3JlYXRlRE9NV2luZG93KCkKK3sKKyAgICBBU1NFUlQobV9mcmFtZSk7CisgICAgQVNTRVJUKCFt
X2RvbVdpbmRvdyk7CisKKyAgICBtX2RvbVdpbmRvdyA9IERPTVdpbmRvdzo6Y3JlYXRlKHRoaXMp
OworCisgICAgQVNTRVJUKG1fZG9tV2luZG93LT5kb2N1bWVudCgpID09IHRoaXMpOworICAgIEFT
U0VSVChtX2RvbVdpbmRvdy0+ZnJhbWUoKSA9PSBtX2ZyYW1lKTsKK30KKwordm9pZCBEb2N1bWVu
dDo6dGFrZURPTVdpbmRvd0Zyb20oRG9jdW1lbnQqIGRvY3VtZW50KQoreworICAgIEFTU0VSVCht
X2ZyYW1lKTsKKyAgICBBU1NFUlQoIW1fZG9tV2luZG93KTsKKyAgICBBU1NFUlQoZG9jdW1lbnQt
PmRvbVdpbmRvdygpKTsKKworICAgIG1fZG9tV2luZG93ID0gZG9jdW1lbnQtPm1fZG9tV2luZG93
LnJlbGVhc2UoKTsKKyAgICBtX2RvbVdpbmRvdy0+ZGlkU2VjdXJlVHJhbnNpdGlvblRvKHRoaXMp
OworCisgICAgQVNTRVJUKG1fZG9tV2luZG93LT5kb2N1bWVudCgpID09IHRoaXMpOworICAgIEFT
U0VSVChtX2RvbVdpbmRvdy0+ZnJhbWUoKSA9PSBtX2ZyYW1lKTsKK30KKwordm9pZCBEb2N1bWVu
dDo6c2V0V2luZG93QXR0cmlidXRlRXZlbnRMaXN0ZW5lcihjb25zdCBBdG9taWNTdHJpbmcmIGV2
ZW50VHlwZSwgUGFzc1JlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lcikKK3sKKyAgICBET01X
aW5kb3cqIGRvbVdpbmRvdyA9IHRoaXMtPmRvbVdpbmRvdygpOworICAgIGlmICghZG9tV2luZG93
KQorICAgICAgICByZXR1cm47CisgICAgZG9tV2luZG93LT5zZXRBdHRyaWJ1dGVFdmVudExpc3Rl
bmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIpOworfQorCitFdmVudExpc3RlbmVyKiBEb2N1bWVudDo6
Z2V0V2luZG93QXR0cmlidXRlRXZlbnRMaXN0ZW5lcihjb25zdCBBdG9taWNTdHJpbmcmIGV2ZW50
VHlwZSkKK3sKKyAgICBET01XaW5kb3cqIGRvbVdpbmRvdyA9IHRoaXMtPmRvbVdpbmRvdygpOwor
ICAgIGlmICghZG9tV2luZG93KQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gZG9tV2lu
ZG93LT5nZXRBdHRyaWJ1dGVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSk7Cit9CisKK3ZvaWQgRG9j
dW1lbnQ6OmRpc3BhdGNoV2luZG93RXZlbnQoUGFzc1JlZlB0cjxFdmVudD4gZXZlbnQsICBQYXNz
UmVmUHRyPEV2ZW50VGFyZ2V0PiB0YXJnZXQpCit7CisgICAgQVNTRVJUKCFldmVudERpc3BhdGNo
Rm9yYmlkZGVuKCkpOworICAgIERPTVdpbmRvdyogZG9tV2luZG93ID0gdGhpcy0+ZG9tV2luZG93
KCk7CisgICAgaWYgKCFkb21XaW5kb3cpCisgICAgICAgIHJldHVybjsKKyAgICBkb21XaW5kb3ct
PmRpc3BhdGNoRXZlbnQoZXZlbnQsIHRhcmdldCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmRpc3Bh
dGNoV2luZG93TG9hZEV2ZW50KCkKK3sKKyAgICBBU1NFUlQoIWV2ZW50RGlzcGF0Y2hGb3JiaWRk
ZW4oKSk7CisgICAgRE9NV2luZG93KiBkb21XaW5kb3cgPSB0aGlzLT5kb21XaW5kb3coKTsKKyAg
ICBpZiAoIWRvbVdpbmRvdykKKyAgICAgICAgcmV0dXJuOworICAgIGRvbVdpbmRvdy0+ZGlzcGF0
Y2hMb2FkRXZlbnQoKTsKKyAgICBtX2xvYWRFdmVudEZpbmlzaGVkID0gdHJ1ZTsKK30KKwordm9p
ZCBEb2N1bWVudDo6ZW5xdWV1ZVdpbmRvd0V2ZW50KFBhc3NSZWZQdHI8RXZlbnQ+IGV2ZW50KQor
eworICAgIGV2ZW50LT5zZXRUYXJnZXQoZG9tV2luZG93KCkpOworICAgIG1fZXZlbnRRdWV1ZS0+
ZW5xdWV1ZUV2ZW50KGV2ZW50KTsKK30KKwordm9pZCBEb2N1bWVudDo6ZW5xdWV1ZURvY3VtZW50
RXZlbnQoUGFzc1JlZlB0cjxFdmVudD4gZXZlbnQpCit7CisgICAgZXZlbnQtPnNldFRhcmdldCh0
aGlzKTsKKyAgICBtX2V2ZW50UXVldWUtPmVucXVldWVFdmVudChldmVudCk7Cit9CisKK1Bhc3NS
ZWZQdHI8RXZlbnQ+IERvY3VtZW50OjpjcmVhdGVFdmVudChjb25zdCBTdHJpbmcmIGV2ZW50VHlw
ZSwgRXhjZXB0aW9uQ29kZSYgZWMpCit7CisgICAgUmVmUHRyPEV2ZW50PiBldmVudCA9IEV2ZW50
RmFjdG9yeTo6Y3JlYXRlKGV2ZW50VHlwZSk7CisgICAgaWYgKGV2ZW50KQorICAgICAgICByZXR1
cm4gZXZlbnQucmVsZWFzZSgpOworCisgICAgZWMgPSBOT1RfU1VQUE9SVEVEX0VSUjsKKyAgICBy
ZXR1cm4gMDsKK30KKwordm9pZCBEb2N1bWVudDo6YWRkTXV0YXRpb25FdmVudExpc3RlbmVyVHlw
ZUlmRW5hYmxlZChMaXN0ZW5lclR5cGUgbGlzdGVuZXJUeXBlKQoreworICAgIGlmIChDb250ZXh0
RmVhdHVyZXM6Om11dGF0aW9uRXZlbnRzRW5hYmxlZCh0aGlzKSkKKyAgICAgICAgYWRkTGlzdGVu
ZXJUeXBlKGxpc3RlbmVyVHlwZSk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmFkZExpc3RlbmVyVHlw
ZUlmTmVlZGVkKGNvbnN0IEF0b21pY1N0cmluZyYgZXZlbnRUeXBlKQoreworICAgIGlmIChldmVu
dFR5cGUgPT0gZXZlbnROYW1lcygpLkRPTVN1YnRyZWVNb2RpZmllZEV2ZW50KQorICAgICAgICBh
ZGRNdXRhdGlvbkV2ZW50TGlzdGVuZXJUeXBlSWZFbmFibGVkKERPTVNVQlRSRUVNT0RJRklFRF9M
SVNURU5FUik7CisgICAgZWxzZSBpZiAoZXZlbnRUeXBlID09IGV2ZW50TmFtZXMoKS5ET01Ob2Rl
SW5zZXJ0ZWRFdmVudCkKKyAgICAgICAgYWRkTXV0YXRpb25FdmVudExpc3RlbmVyVHlwZUlmRW5h
YmxlZChET01OT0RFSU5TRVJURURfTElTVEVORVIpOworICAgIGVsc2UgaWYgKGV2ZW50VHlwZSA9
PSBldmVudE5hbWVzKCkuRE9NTm9kZVJlbW92ZWRFdmVudCkKKyAgICAgICAgYWRkTXV0YXRpb25F
dmVudExpc3RlbmVyVHlwZUlmRW5hYmxlZChET01OT0RFUkVNT1ZFRF9MSVNURU5FUik7CisgICAg
ZWxzZSBpZiAoZXZlbnRUeXBlID09IGV2ZW50TmFtZXMoKS5ET01Ob2RlUmVtb3ZlZEZyb21Eb2N1
bWVudEV2ZW50KQorICAgICAgICBhZGRNdXRhdGlvbkV2ZW50TGlzdGVuZXJUeXBlSWZFbmFibGVk
KERPTU5PREVSRU1PVkVERlJPTURPQ1VNRU5UX0xJU1RFTkVSKTsKKyAgICBlbHNlIGlmIChldmVu
dFR5cGUgPT0gZXZlbnROYW1lcygpLkRPTU5vZGVJbnNlcnRlZEludG9Eb2N1bWVudEV2ZW50KQor
ICAgICAgICBhZGRNdXRhdGlvbkV2ZW50TGlzdGVuZXJUeXBlSWZFbmFibGVkKERPTU5PREVJTlNF
UlRFRElOVE9ET0NVTUVOVF9MSVNURU5FUik7CisgICAgZWxzZSBpZiAoZXZlbnRUeXBlID09IGV2
ZW50TmFtZXMoKS5ET01BdHRyTW9kaWZpZWRFdmVudCkKKyAgICAgICAgYWRkTXV0YXRpb25FdmVu
dExpc3RlbmVyVHlwZUlmRW5hYmxlZChET01BVFRSTU9ESUZJRURfTElTVEVORVIpOworICAgIGVs
c2UgaWYgKGV2ZW50VHlwZSA9PSBldmVudE5hbWVzKCkuRE9NQ2hhcmFjdGVyRGF0YU1vZGlmaWVk
RXZlbnQpCisgICAgICAgIGFkZE11dGF0aW9uRXZlbnRMaXN0ZW5lclR5cGVJZkVuYWJsZWQoRE9N
Q0hBUkFDVEVSREFUQU1PRElGSUVEX0xJU1RFTkVSKTsKKyAgICBlbHNlIGlmIChldmVudFR5cGUg
PT0gZXZlbnROYW1lcygpLm92ZXJmbG93Y2hhbmdlZEV2ZW50KQorICAgICAgICBhZGRMaXN0ZW5l
clR5cGUoT1ZFUkZMT1dDSEFOR0VEX0xJU1RFTkVSKTsKKyAgICBlbHNlIGlmIChldmVudFR5cGUg
PT0gZXZlbnROYW1lcygpLndlYmtpdEFuaW1hdGlvblN0YXJ0RXZlbnQpCisgICAgICAgIGFkZExp
c3RlbmVyVHlwZShBTklNQVRJT05TVEFSVF9MSVNURU5FUik7CisgICAgZWxzZSBpZiAoZXZlbnRU
eXBlID09IGV2ZW50TmFtZXMoKS53ZWJraXRBbmltYXRpb25FbmRFdmVudCkKKyAgICAgICAgYWRk
TGlzdGVuZXJUeXBlKEFOSU1BVElPTkVORF9MSVNURU5FUik7CisgICAgZWxzZSBpZiAoZXZlbnRU
eXBlID09IGV2ZW50TmFtZXMoKS53ZWJraXRBbmltYXRpb25JdGVyYXRpb25FdmVudCkKKyAgICAg
ICAgYWRkTGlzdGVuZXJUeXBlKEFOSU1BVElPTklURVJBVElPTl9MSVNURU5FUik7CisgICAgZWxz
ZSBpZiAoZXZlbnRUeXBlID09IGV2ZW50TmFtZXMoKS53ZWJraXRUcmFuc2l0aW9uRW5kRXZlbnQp
CisgICAgICAgIGFkZExpc3RlbmVyVHlwZShUUkFOU0lUSU9ORU5EX0xJU1RFTkVSKTsKKyAgICBl
bHNlIGlmIChldmVudFR5cGUgPT0gZXZlbnROYW1lcygpLmJlZm9yZWxvYWRFdmVudCkKKyAgICAg
ICAgYWRkTGlzdGVuZXJUeXBlKEJFRk9SRUxPQURfTElTVEVORVIpOworICAgIGVsc2UgaWYgKGV2
ZW50VHlwZSA9PSBldmVudE5hbWVzKCkuc2Nyb2xsRXZlbnQpCisgICAgICAgIGFkZExpc3RlbmVy
VHlwZShTQ1JPTExfTElTVEVORVIpOworfQorCitDU1NTdHlsZURlY2xhcmF0aW9uKiBEb2N1bWVu
dDo6Z2V0T3ZlcnJpZGVTdHlsZShFbGVtZW50KiwgY29uc3QgU3RyaW5nJikKK3sKKyAgICByZXR1
cm4gMDsKK30KKworSFRNTEZyYW1lT3duZXJFbGVtZW50KiBEb2N1bWVudDo6b3duZXJFbGVtZW50
KCkgY29uc3QKK3sKKyAgICBpZiAoIWZyYW1lKCkpCisgICAgICAgIHJldHVybiAwOworICAgIHJl
dHVybiBmcmFtZSgpLT5vd25lckVsZW1lbnQoKTsKK30KKworU3RyaW5nIERvY3VtZW50Ojpjb29r
aWUoRXhjZXB0aW9uQ29kZSYgZWMpIGNvbnN0Cit7CisgICAgaWYgKHBhZ2UoKSAmJiAhcGFnZSgp
LT5zZXR0aW5ncygpLT5jb29raWVFbmFibGVkKCkpCisgICAgICAgIHJldHVybiBTdHJpbmcoKTsK
KworICAgIC8vIEZJWE1FOiBUaGUgSFRNTDUgRE9NIHNwZWMgc3RhdGVzIHRoYXQgdGhpcyBhdHRy
aWJ1dGUgY2FuIHJhaXNlIGFuCisgICAgLy8gSU5WQUxJRF9TVEFURV9FUlIgZXhjZXB0aW9uIG9u
IGdldHRpbmcgaWYgdGhlIERvY3VtZW50IGhhcyBubworICAgIC8vIGJyb3dzaW5nIGNvbnRleHQu
CisKKyAgICBpZiAoIXNlY3VyaXR5T3JpZ2luKCktPmNhbkFjY2Vzc0Nvb2tpZXMoKSkgeworICAg
ICAgICBlYyA9IFNFQ1VSSVRZX0VSUjsKKyAgICAgICAgcmV0dXJuIFN0cmluZygpOworICAgIH0K
KworICAgIEtVUkwgY29va2llVVJMID0gdGhpcy0+Y29va2llVVJMKCk7CisgICAgaWYgKGNvb2tp
ZVVSTC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBTdHJpbmcoKTsKKworICAgIHJldHVybiBj
b29raWVzKHRoaXMsIGNvb2tpZVVSTCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnNldENvb2tpZShj
b25zdCBTdHJpbmcmIHZhbHVlLCBFeGNlcHRpb25Db2RlJiBlYykKK3sKKyAgICBpZiAocGFnZSgp
ICYmICFwYWdlKCktPnNldHRpbmdzKCktPmNvb2tpZUVuYWJsZWQoKSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgLy8gRklYTUU6IFRoZSBIVE1MNSBET00gc3BlYyBzdGF0ZXMgdGhhdCB0aGlzIGF0
dHJpYnV0ZSBjYW4gcmFpc2UgYW4KKyAgICAvLyBJTlZBTElEX1NUQVRFX0VSUiBleGNlcHRpb24g
b24gc2V0dGluZyBpZiB0aGUgRG9jdW1lbnQgaGFzIG5vCisgICAgLy8gYnJvd3NpbmcgY29udGV4
dC4KKworICAgIGlmICghc2VjdXJpdHlPcmlnaW4oKS0+Y2FuQWNjZXNzQ29va2llcygpKSB7Cisg
ICAgICAgIGVjID0gU0VDVVJJVFlfRVJSOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAg
S1VSTCBjb29raWVVUkwgPSB0aGlzLT5jb29raWVVUkwoKTsKKyAgICBpZiAoY29va2llVVJMLmlz
RW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgc2V0Q29va2llcyh0aGlzLCBjb29raWVV
UkwsIHZhbHVlKTsKK30KKworU3RyaW5nIERvY3VtZW50OjpyZWZlcnJlcigpIGNvbnN0Cit7Cisg
ICAgaWYgKGZyYW1lKCkpCisgICAgICAgIHJldHVybiBmcmFtZSgpLT5sb2FkZXIoKS0+cmVmZXJy
ZXIoKTsKKyAgICByZXR1cm4gU3RyaW5nKCk7Cit9CisKK1N0cmluZyBEb2N1bWVudDo6ZG9tYWlu
KCkgY29uc3QKK3sKKyAgICByZXR1cm4gc2VjdXJpdHlPcmlnaW4oKS0+ZG9tYWluKCk7Cit9CisK
K3ZvaWQgRG9jdW1lbnQ6OnNldERvbWFpbihjb25zdCBTdHJpbmcmIG5ld0RvbWFpbiwgRXhjZXB0
aW9uQ29kZSYgZWMpCit7CisgICAgaWYgKFNjaGVtZVJlZ2lzdHJ5Ojppc0RvbWFpblJlbGF4YXRp
b25Gb3JiaWRkZW5Gb3JVUkxTY2hlbWUoc2VjdXJpdHlPcmlnaW4oKS0+cHJvdG9jb2woKSkpIHsK
KyAgICAgICAgZWMgPSBTRUNVUklUWV9FUlI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAg
ICAvLyBCb3RoIE5TIGFuZCBJRSBzcGVjaWZ5IHRoYXQgY2hhbmdpbmcgdGhlIGRvbWFpbiBpcyBv
bmx5IGFsbG93ZWQgd2hlbgorICAgIC8vIHRoZSBuZXcgZG9tYWluIGlzIGEgc3VmZml4IG9mIHRo
ZSBvbGQgZG9tYWluLgorCisgICAgLy8gRklYTUU6IFdlIHNob3VsZCBhZGQgbG9nZ2luZyBpbmRp
Y2F0aW5nIHdoeSBhIGRvbWFpbiB3YXMgbm90IGFsbG93ZWQuCisKKyAgICAvLyBJZiB0aGUgbmV3
IGRvbWFpbiBpcyB0aGUgc2FtZSBhcyB0aGUgb2xkIGRvbWFpbiwgc3RpbGwgY2FsbAorICAgIC8v
IHNlY3VyaXR5T3JpZ2luKCktPnNldERvbWFpbkZvckRPTS4gVGhpcyB3aWxsIGNoYW5nZSB0aGUK
KyAgICAvLyBzZWN1cml0eSBjaGVjayBiZWhhdmlvci4gRm9yIGV4YW1wbGUsIGlmIGEgcGFnZSBs
b2FkZWQgb24gcG9ydCA4MDAwCisgICAgLy8gYXNzaWducyBpdHMgY3VycmVudCBkb21haW4gdXNp
bmcgZG9jdW1lbnQuZG9tYWluLCB0aGUgcGFnZSB3aWxsCisgICAgLy8gYWxsb3cgb3RoZXIgcGFn
ZXMgbG9hZGVkIG9uIGRpZmZlcmVudCBwb3J0cyBpbiB0aGUgc2FtZSBkb21haW4gdGhhdAorICAg
IC8vIGhhdmUgYWxzbyBhc3NpZ25lZCB0byBhY2Nlc3MgdGhpcyBwYWdlLgorICAgIGlmIChlcXVh
bElnbm9yaW5nQ2FzZShkb21haW4oKSwgbmV3RG9tYWluKSkgeworICAgICAgICBzZWN1cml0eU9y
aWdpbigpLT5zZXREb21haW5Gcm9tRE9NKG5ld0RvbWFpbik7CisgICAgICAgIGlmIChtX2ZyYW1l
KQorICAgICAgICAgICAgbV9mcmFtZS0+c2NyaXB0KCktPnVwZGF0ZVNlY3VyaXR5T3JpZ2luKCk7
CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQgb2xkTGVuZ3RoID0gZG9tYWluKCku
bGVuZ3RoKCk7CisgICAgaW50IG5ld0xlbmd0aCA9IG5ld0RvbWFpbi5sZW5ndGgoKTsKKyAgICAv
LyBlLmcuIG5ld0RvbWFpbiA9IHdlYmtpdC5vcmcgKDEwKSBhbmQgZG9tYWluKCkgPSB3d3cud2Vi
a2l0Lm9yZyAoMTQpCisgICAgaWYgKG5ld0xlbmd0aCA+PSBvbGRMZW5ndGgpIHsKKyAgICAgICAg
ZWMgPSBTRUNVUklUWV9FUlI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBTdHJpbmcg
dGVzdCA9IGRvbWFpbigpOworICAgIC8vIENoZWNrIHRoYXQgaXQncyBhIHN1YmRvbWFpbiwgbm90
IGUuZy4gImVia2l0Lm9yZyIKKyAgICBpZiAodGVzdFtvbGRMZW5ndGggLSBuZXdMZW5ndGggLSAx
XSAhPSAnLicpIHsKKyAgICAgICAgZWMgPSBTRUNVUklUWV9FUlI7CisgICAgICAgIHJldHVybjsK
KyAgICB9CisKKyAgICAvLyBOb3cgdGVzdCBpcyAid2Via2l0Lm9yZyIgZnJvbSBkb21haW4oKQor
ICAgIC8vIGFuZCB3ZSBjaGVjayB0aGF0IGl0J3MgdGhlIHNhbWUgdGhpbmcgYXMgbmV3RG9tYWlu
CisgICAgdGVzdC5yZW1vdmUoMCwgb2xkTGVuZ3RoIC0gbmV3TGVuZ3RoKTsKKyAgICBpZiAodGVz
dCAhPSBuZXdEb21haW4pIHsKKyAgICAgICAgZWMgPSBTRUNVUklUWV9FUlI7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisKKyAgICBzZWN1cml0eU9yaWdpbigpLT5zZXREb21haW5Gcm9tRE9NKG5l
d0RvbWFpbik7CisgICAgaWYgKG1fZnJhbWUpCisgICAgICAgIG1fZnJhbWUtPnNjcmlwdCgpLT51
cGRhdGVTZWN1cml0eU9yaWdpbigpOworfQorCisvLyBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3Bl
Y3Mvd2ViLWFwcHMvY3VycmVudC13b3JrLyNkb20tZG9jdW1lbnQtbGFzdG1vZGlmaWVkCitTdHJp
bmcgRG9jdW1lbnQ6Omxhc3RNb2RpZmllZCgpIGNvbnN0Cit7CisgICAgRGF0ZUNvbXBvbmVudHMg
ZGF0ZTsKKyAgICBib29sIGZvdW5kRGF0ZSA9IGZhbHNlOworICAgIGlmIChtX2ZyYW1lKSB7Cisg
ICAgICAgIFN0cmluZyBodHRwTGFzdE1vZGlmaWVkOworICAgICAgICBpZiAoRG9jdW1lbnRMb2Fk
ZXIqIGRvY3VtZW50TG9hZGVyID0gbG9hZGVyKCkpIAorICAgICAgICAgICAgaHR0cExhc3RNb2Rp
ZmllZCA9IGRvY3VtZW50TG9hZGVyLT5yZXNwb25zZSgpLmh0dHBIZWFkZXJGaWVsZCgiTGFzdC1N
b2RpZmllZCIpOworICAgICAgICBpZiAoIWh0dHBMYXN0TW9kaWZpZWQuaXNFbXB0eSgpKSB7Cisg
ICAgICAgICAgICBkYXRlLnNldE1pbGxpc2Vjb25kc1NpbmNlRXBvY2hGb3JEYXRlVGltZShwYXJz
ZURhdGUoaHR0cExhc3RNb2RpZmllZCkpOworICAgICAgICAgICAgZm91bmREYXRlID0gdHJ1ZTsK
KyAgICAgICAgfQorICAgIH0KKyAgICAvLyBGSVhNRTogSWYgdGhpcyBkb2N1bWVudCBjYW1lIGZy
b20gdGhlIGZpbGUgc3lzdGVtLCB0aGUgSFRNTDUKKyAgICAvLyBzcGVjaWZpY2lhdGlvbiB0ZWxs
cyB1cyB0byByZWFkIHRoZSBsYXN0IG1vZGlmaWNhdGlvbiBkYXRlIGZyb20gdGhlIGZpbGUKKyAg
ICAvLyBzeXN0ZW0uCisgICAgaWYgKCFmb3VuZERhdGUpCisgICAgICAgIGRhdGUuc2V0TWlsbGlz
ZWNvbmRzU2luY2VFcG9jaEZvckRhdGVUaW1lKGN1cnJlbnRUaW1lTVMoKSk7CisgICAgcmV0dXJu
IFN0cmluZzo6Zm9ybWF0KCIlMDJkLyUwMmQvJTA0ZCAlMDJkOiUwMmQ6JTAyZCIsIGRhdGUubW9u
dGgoKSArIDEsIGRhdGUubW9udGhEYXkoKSwgZGF0ZS5mdWxsWWVhcigpLCBkYXRlLmhvdXIoKSwg
ZGF0ZS5taW51dGUoKSwgZGF0ZS5zZWNvbmQoKSk7Cit9CisKK3N0YXRpYyBib29sIGlzVmFsaWRO
YW1lTm9uQVNDSUkoY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMsIHVuc2lnbmVkIGxlbmd0aCkKK3sK
KyAgICB1bnNpZ25lZCBpID0gMDsKKworICAgIFVDaGFyMzIgYzsKKyAgICBVMTZfTkVYVChjaGFy
YWN0ZXJzLCBpLCBsZW5ndGgsIGMpCisgICAgaWYgKCFpc1ZhbGlkTmFtZVN0YXJ0KGMpKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICB3aGlsZSAoaSA8IGxlbmd0aCkgeworICAgICAgICBV
MTZfTkVYVChjaGFyYWN0ZXJzLCBpLCBsZW5ndGgsIGMpCisgICAgICAgIGlmICghaXNWYWxpZE5h
bWVQYXJ0KGMpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVy
biB0cnVlOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBDaGFyVHlwZT4KK3N0YXRpYyBpbmxpbmUg
Ym9vbCBpc1ZhbGlkTmFtZUFTQ0lJKGNvbnN0IENoYXJUeXBlKiBjaGFyYWN0ZXJzLCB1bnNpZ25l
ZCBsZW5ndGgpCit7CisgICAgQ2hhclR5cGUgYyA9IGNoYXJhY3RlcnNbMF07CisgICAgaWYgKCEo
aXNBU0NJSUFscGhhKGMpIHx8IGMgPT0gJzonIHx8IGMgPT0gJ18nKSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8IGxlbmd0aDsgKytpKSB7Cisg
ICAgICAgIGMgPSBjaGFyYWN0ZXJzW2ldOworICAgICAgICBpZiAoIShpc0FTQ0lJQWxwaGFudW1l
cmljKGMpIHx8IGMgPT0gJzonIHx8IGMgPT0gJ18nIHx8IGMgPT0gJy0nIHx8IGMgPT0gJy4nKSkK
KyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30K
KworYm9vbCBEb2N1bWVudDo6aXNWYWxpZE5hbWUoY29uc3QgU3RyaW5nJiBuYW1lKQoreworICAg
IHVuc2lnbmVkIGxlbmd0aCA9IG5hbWUubGVuZ3RoKCk7CisgICAgaWYgKCFsZW5ndGgpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgIGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzOworICAgIGlm
IChuYW1lLmlzOEJpdCgpKSB7CisgICAgICAgIGlmIChpc1ZhbGlkTmFtZUFTQ0lJKG5hbWUuY2hh
cmFjdGVyczgoKSwgbGVuZ3RoKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBj
aGFyYWN0ZXJzID0gbmFtZS5jaGFyYWN0ZXJzKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2hh
cmFjdGVycyA9IG5hbWUuY2hhcmFjdGVyczE2KCk7CisgICAgICAgIGlmIChpc1ZhbGlkTmFtZUFT
Q0lJKGNoYXJhY3RlcnMsIGxlbmd0aCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9
CisgICAgcmV0dXJuIGlzVmFsaWROYW1lTm9uQVNDSUkoY2hhcmFjdGVycywgbGVuZ3RoKTsKK30K
KworYm9vbCBEb2N1bWVudDo6cGFyc2VRdWFsaWZpZWROYW1lKGNvbnN0IFN0cmluZyYgcXVhbGlm
aWVkTmFtZSwgU3RyaW5nJiBwcmVmaXgsIFN0cmluZyYgbG9jYWxOYW1lLCBFeGNlcHRpb25Db2Rl
JiBlYykKK3sKKyAgICB1bnNpZ25lZCBsZW5ndGggPSBxdWFsaWZpZWROYW1lLmxlbmd0aCgpOwor
CisgICAgaWYgKCFsZW5ndGgpIHsKKyAgICAgICAgZWMgPSBJTlZBTElEX0NIQVJBQ1RFUl9FUlI7
CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIG5hbWVTdGFydCA9IHRy
dWU7CisgICAgYm9vbCBzYXdDb2xvbiA9IGZhbHNlOworICAgIGludCBjb2xvblBvcyA9IDA7CisK
KyAgICBjb25zdCBVQ2hhciogcyA9IHF1YWxpZmllZE5hbWUuY2hhcmFjdGVycygpOworICAgIGZv
ciAodW5zaWduZWQgaSA9IDA7IGkgPCBsZW5ndGg7KSB7CisgICAgICAgIFVDaGFyMzIgYzsKKyAg
ICAgICAgVTE2X05FWFQocywgaSwgbGVuZ3RoLCBjKQorICAgICAgICBpZiAoYyA9PSAnOicpIHsK
KyAgICAgICAgICAgIGlmIChzYXdDb2xvbikgeworICAgICAgICAgICAgICAgIGVjID0gTkFNRVNQ
QUNFX0VSUjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIG11bHRpcGxlIGNvbG9u
czogbm90IGFsbG93ZWQKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5hbWVTdGFydCA9IHRy
dWU7CisgICAgICAgICAgICBzYXdDb2xvbiA9IHRydWU7CisgICAgICAgICAgICBjb2xvblBvcyA9
IGkgLSAxOworICAgICAgICB9IGVsc2UgaWYgKG5hbWVTdGFydCkgeworICAgICAgICAgICAgaWYg
KCFpc1ZhbGlkTmFtZVN0YXJ0KGMpKSB7CisgICAgICAgICAgICAgICAgZWMgPSBJTlZBTElEX0NI
QVJBQ1RFUl9FUlI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAg
fQorICAgICAgICAgICAgbmFtZVN0YXJ0ID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAg
ICAgICAgICBpZiAoIWlzVmFsaWROYW1lUGFydChjKSkgeworICAgICAgICAgICAgICAgIGVjID0g
SU5WQUxJRF9DSEFSQUNURVJfRVJSOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghc2F3Q29sb24pIHsKKyAg
ICAgICAgcHJlZml4ID0gU3RyaW5nKCk7CisgICAgICAgIGxvY2FsTmFtZSA9IHF1YWxpZmllZE5h
bWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJlZml4ID0gcXVhbGlmaWVkTmFtZS5zdWJzdHJp
bmcoMCwgY29sb25Qb3MpOworICAgICAgICBpZiAocHJlZml4LmlzRW1wdHkoKSkgeworICAgICAg
ICAgICAgZWMgPSBOQU1FU1BBQ0VfRVJSOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgICB9CisgICAgICAgIGxvY2FsTmFtZSA9IHF1YWxpZmllZE5hbWUuc3Vic3RyaW5nKGNvbG9u
UG9zICsgMSk7CisgICAgfQorCisgICAgaWYgKGxvY2FsTmFtZS5pc0VtcHR5KCkpIHsKKyAgICAg
ICAgZWMgPSBOQU1FU1BBQ0VfRVJSOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisg
ICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnNldERlY29kZXIoUGFzc1JlZlB0
cjxUZXh0UmVzb3VyY2VEZWNvZGVyPiBkZWNvZGVyKQoreworICAgIG1fZGVjb2RlciA9IGRlY29k
ZXI7Cit9CisKK0tVUkwgRG9jdW1lbnQ6OmNvbXBsZXRlVVJMKGNvbnN0IFN0cmluZyYgdXJsLCBj
b25zdCBLVVJMJiBiYXNlVVJMT3ZlcnJpZGUpIGNvbnN0Cit7CisgICAgLy8gQWx3YXlzIHJldHVy
biBhIG51bGwgVVJMIHdoZW4gcGFzc2VkIGEgbnVsbCBzdHJpbmcuCisgICAgLy8gRklYTUU6IFNo
b3VsZCB3ZSBjaGFuZ2UgdGhlIEtVUkwgY29uc3RydWN0b3IgdG8gaGF2ZSB0aGlzIGJlaGF2aW9y
PworICAgIC8vIFNlZSBhbHNvIFtDU1NdU3R5bGVTaGVldDo6Y29tcGxldGVVUkwoY29uc3QgU3Ry
aW5nJikKKyAgICBpZiAodXJsLmlzTnVsbCgpKQorICAgICAgICByZXR1cm4gS1VSTCgpOworICAg
IGNvbnN0IEtVUkwmIGJhc2VVUkwgPSAoKGJhc2VVUkxPdmVycmlkZS5pc0VtcHR5KCkgfHwgYmFz
ZVVSTE92ZXJyaWRlID09IGJsYW5rVVJMKCkpICYmIHBhcmVudERvY3VtZW50KCkpID8gcGFyZW50
RG9jdW1lbnQoKS0+YmFzZVVSTCgpIDogYmFzZVVSTE92ZXJyaWRlOworICAgIGlmICghbV9kZWNv
ZGVyKQorICAgICAgICByZXR1cm4gS1VSTChiYXNlVVJMLCB1cmwpOworICAgIHJldHVybiBLVVJM
KGJhc2VVUkwsIHVybCwgbV9kZWNvZGVyLT5lbmNvZGluZygpKTsKK30KKworS1VSTCBEb2N1bWVu
dDo6Y29tcGxldGVVUkwoY29uc3QgU3RyaW5nJiB1cmwpIGNvbnN0Cit7CisgICAgcmV0dXJuIGNv
bXBsZXRlVVJMKHVybCwgbV9iYXNlVVJMKTsKK30KKwordm9pZCBEb2N1bWVudDo6c2V0SW5QYWdl
Q2FjaGUoYm9vbCBmbGFnKQoreworICAgIGlmIChtX2luUGFnZUNhY2hlID09IGZsYWcpCisgICAg
ICAgIHJldHVybjsKKworICAgIG1faW5QYWdlQ2FjaGUgPSBmbGFnOworCisgICAgRnJhbWVWaWV3
KiB2ID0gdmlldygpOworICAgIGlmIChmbGFnKSB7CisgICAgICAgIEFTU0VSVCghbV9zYXZlZFJl
bmRlcmVyKTsKKyAgICAgICAgbV9zYXZlZFJlbmRlcmVyID0gcmVuZGVyZXIoKTsKKyAgICAgICAg
aWYgKHYpIHsKKyAgICAgICAgICAgIHYtPmNhY2hlQ3VycmVudFNjcm9sbFBvc2l0aW9uKCk7Cisg
ICAgICAgICAgICBpZiAocGFnZSgpICYmIHBhZ2UoKS0+bWFpbkZyYW1lKCkgPT0gbV9mcmFtZSkK
KyAgICAgICAgICAgICAgICB2LT5yZXNldFNjcm9sbGJhcnNBbmRDbGVhckNvbnRlbnRzU2l6ZSgp
OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHYtPnJlc2V0U2Nyb2xsYmFycygp
OworICAgICAgICB9CisgICAgICAgIG1fc3R5bGVSZWNhbGNUaW1lci5zdG9wKCk7CisgICAgfSBl
bHNlIHsKKyAgICAgICAgQVNTRVJUKCFyZW5kZXJlcigpIHx8IHJlbmRlcmVyKCkgPT0gbV9zYXZl
ZFJlbmRlcmVyKTsKKyAgICAgICAgQVNTRVJUKG1fcmVuZGVyQXJlbmEpOworICAgICAgICBzZXRS
ZW5kZXJlcihtX3NhdmVkUmVuZGVyZXIpOworICAgICAgICBtX3NhdmVkUmVuZGVyZXIgPSAwOwor
CisgICAgICAgIGlmIChjaGlsZE5lZWRzU3R5bGVSZWNhbGMoKSkKKyAgICAgICAgICAgIHNjaGVk
dWxlU3R5bGVSZWNhbGMoKTsKKyAgICB9Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmRvY3VtZW50V2ls
bEJlY29tZUluYWN0aXZlKCkKK3sKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisg
ICAgaWYgKHJlbmRlcmVyKCkpCisgICAgICAgIHJlbmRlclZpZXcoKS0+d2lsbE1vdmVPZmZzY3Jl
ZW4oKTsKKyNlbmRpZgorfQorCit2b2lkIERvY3VtZW50Ojpkb2N1bWVudFdpbGxTdXNwZW5kRm9y
UGFnZUNhY2hlKCkKK3sKKyAgICBkb2N1bWVudFdpbGxCZWNvbWVJbmFjdGl2ZSgpOworCisgICAg
SGFzaFNldDxFbGVtZW50Kj46Oml0ZXJhdG9yIGVuZCA9IG1fZG9jdW1lbnRTdXNwZW5zaW9uQ2Fs
bGJhY2tFbGVtZW50cy5lbmQoKTsKKyAgICBmb3IgKEhhc2hTZXQ8RWxlbWVudCo+OjppdGVyYXRv
ciBpID0gbV9kb2N1bWVudFN1c3BlbnNpb25DYWxsYmFja0VsZW1lbnRzLmJlZ2luKCk7IGkgIT0g
ZW5kOyArK2kpCisgICAgICAgICgqaSktPmRvY3VtZW50V2lsbFN1c3BlbmRGb3JQYWdlQ2FjaGUo
KTsKKworI2lmbmRlZiBOREVCVUcKKyAgICAvLyBDbGVhciB0aGUgdXBkYXRlIGZsYWcgdG8gYmUg
YWJsZSB0byBjaGVjayBpZiB0aGUgdmlld3BvcnQgYXJndW1lbnRzIHVwZGF0ZQorICAgIC8vIGlz
IGRpc3BhdGNoZWQsIGFmdGVyIHRoZSBkb2N1bWVudCBpcyByZXN0b3JlZCBmcm9tIHRoZSBwYWdl
IGNhY2hlLgorICAgIG1fZGlkRGlzcGF0Y2hWaWV3cG9ydFByb3BlcnRpZXNDaGFuZ2VkID0gZmFs
c2U7CisjZW5kaWYKK30KKwordm9pZCBEb2N1bWVudDo6ZG9jdW1lbnREaWRSZXN1bWVGcm9tUGFn
ZUNhY2hlKCkgCit7CisgICAgVmVjdG9yPEVsZW1lbnQqPiBlbGVtZW50czsKKyAgICBjb3B5VG9W
ZWN0b3IobV9kb2N1bWVudFN1c3BlbnNpb25DYWxsYmFja0VsZW1lbnRzLCBlbGVtZW50cyk7Cisg
ICAgVmVjdG9yPEVsZW1lbnQqPjo6aXRlcmF0b3IgZW5kID0gZWxlbWVudHMuZW5kKCk7CisgICAg
Zm9yIChWZWN0b3I8RWxlbWVudCo+OjppdGVyYXRvciBpID0gZWxlbWVudHMuYmVnaW4oKTsgaSAh
PSBlbmQ7ICsraSkKKyAgICAgICAgKCppKS0+ZG9jdW1lbnREaWRSZXN1bWVGcm9tUGFnZUNhY2hl
KCk7CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgaWYgKHJlbmRlcmVy
KCkpCisgICAgICAgIHJlbmRlclZpZXcoKS0+ZGlkTW92ZU9uc2NyZWVuKCk7CisjZW5kaWYKKwor
ICAgIGlmIChGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHZpZXcoKSkKKyAgICAgICAgZnJhbWVWaWV3
LT5zZXRBbmltYXRvcnNBcmVBY3RpdmUoKTsKKworICAgIEFTU0VSVChtX2ZyYW1lKTsKKyAgICBt
X2ZyYW1lLT5sb2FkZXIoKS0+Y2xpZW50KCktPmRpc3BhdGNoRGlkQmVjb21lRnJhbWVzZXQoaXNG
cmFtZVNldCgpKTsKK30KKwordm9pZCBEb2N1bWVudDo6cmVnaXN0ZXJGb3JQYWdlQ2FjaGVTdXNw
ZW5zaW9uQ2FsbGJhY2tzKEVsZW1lbnQqIGUpCit7CisgICAgbV9kb2N1bWVudFN1c3BlbnNpb25D
YWxsYmFja0VsZW1lbnRzLmFkZChlKTsKK30KKwordm9pZCBEb2N1bWVudDo6dW5yZWdpc3RlckZv
clBhZ2VDYWNoZVN1c3BlbnNpb25DYWxsYmFja3MoRWxlbWVudCogZSkKK3sKKyAgICBtX2RvY3Vt
ZW50U3VzcGVuc2lvbkNhbGxiYWNrRWxlbWVudHMucmVtb3ZlKGUpOworfQorCit2b2lkIERvY3Vt
ZW50OjptZWRpYVZvbHVtZURpZENoYW5nZSgpIAoreworICAgIEhhc2hTZXQ8RWxlbWVudCo+Ojpp
dGVyYXRvciBlbmQgPSBtX21lZGlhVm9sdW1lQ2FsbGJhY2tFbGVtZW50cy5lbmQoKTsKKyAgICBm
b3IgKEhhc2hTZXQ8RWxlbWVudCo+OjppdGVyYXRvciBpID0gbV9tZWRpYVZvbHVtZUNhbGxiYWNr
RWxlbWVudHMuYmVnaW4oKTsgaSAhPSBlbmQ7ICsraSkKKyAgICAgICAgKCppKS0+bWVkaWFWb2x1
bWVEaWRDaGFuZ2UoKTsKK30KKwordm9pZCBEb2N1bWVudDo6cmVnaXN0ZXJGb3JNZWRpYVZvbHVt
ZUNhbGxiYWNrcyhFbGVtZW50KiBlKQoreworICAgIG1fbWVkaWFWb2x1bWVDYWxsYmFja0VsZW1l
bnRzLmFkZChlKTsKK30KKwordm9pZCBEb2N1bWVudDo6dW5yZWdpc3RlckZvck1lZGlhVm9sdW1l
Q2FsbGJhY2tzKEVsZW1lbnQqIGUpCit7CisgICAgbV9tZWRpYVZvbHVtZUNhbGxiYWNrRWxlbWVu
dHMucmVtb3ZlKGUpOworfQorCit2b2lkIERvY3VtZW50OjpzdG9yYWdlQmxvY2tpbmdTdGF0ZURp
ZENoYW5nZSgpCit7CisgICAgaWYgKFNldHRpbmdzKiBzZXR0aW5ncyA9IHRoaXMtPnNldHRpbmdz
KCkpCisgICAgICAgIHNlY3VyaXR5T3JpZ2luKCktPnNldFN0b3JhZ2VCbG9ja2luZ1BvbGljeShz
ZXR0aW5ncy0+c3RvcmFnZUJsb2NraW5nUG9saWN5KCkpOworfQorCit2b2lkIERvY3VtZW50Ojpw
cml2YXRlQnJvd3NpbmdTdGF0ZURpZENoYW5nZSgpIAoreworICAgIEhhc2hTZXQ8RWxlbWVudCo+
OjppdGVyYXRvciBlbmQgPSBtX3ByaXZhdGVCcm93c2luZ1N0YXRlQ2hhbmdlZEVsZW1lbnRzLmVu
ZCgpOworICAgIGZvciAoSGFzaFNldDxFbGVtZW50Kj46Oml0ZXJhdG9yIGl0ID0gbV9wcml2YXRl
QnJvd3NpbmdTdGF0ZUNoYW5nZWRFbGVtZW50cy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpCisg
ICAgICAgICgqaXQpLT5wcml2YXRlQnJvd3NpbmdTdGF0ZURpZENoYW5nZSgpOworfQorCit2b2lk
IERvY3VtZW50OjpyZWdpc3RlckZvclByaXZhdGVCcm93c2luZ1N0YXRlQ2hhbmdlZENhbGxiYWNr
cyhFbGVtZW50KiBlKQoreworICAgIG1fcHJpdmF0ZUJyb3dzaW5nU3RhdGVDaGFuZ2VkRWxlbWVu
dHMuYWRkKGUpOworfQorCit2b2lkIERvY3VtZW50Ojp1bnJlZ2lzdGVyRm9yUHJpdmF0ZUJyb3dz
aW5nU3RhdGVDaGFuZ2VkQ2FsbGJhY2tzKEVsZW1lbnQqIGUpCit7CisgICAgbV9wcml2YXRlQnJv
d3NpbmdTdGF0ZUNoYW5nZWRFbGVtZW50cy5yZW1vdmUoZSk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6
OnNldFNob3VsZENyZWF0ZVJlbmRlcmVycyhib29sIGYpCit7CisgICAgbV9jcmVhdGVSZW5kZXJl
cnMgPSBmOworfQorCitib29sIERvY3VtZW50OjpzaG91bGRDcmVhdGVSZW5kZXJlcnMoKQorewor
ICAgIHJldHVybiBtX2NyZWF0ZVJlbmRlcmVyczsKK30KKworLy8gU3VwcG9ydCBmb3IgSmF2YXNj
cmlwdCBleGVjQ29tbWFuZCwgYW5kIHJlbGF0ZWQgbWV0aG9kcworCitzdGF0aWMgRWRpdG9yOjpD
b21tYW5kIGNvbW1hbmQoRG9jdW1lbnQqIGRvY3VtZW50LCBjb25zdCBTdHJpbmcmIGNvbW1hbmRO
YW1lLCBib29sIHVzZXJJbnRlcmZhY2UgPSBmYWxzZSkKK3sKKyAgICBGcmFtZSogZnJhbWUgPSBk
b2N1bWVudC0+ZnJhbWUoKTsKKyAgICBpZiAoIWZyYW1lIHx8IGZyYW1lLT5kb2N1bWVudCgpICE9
IGRvY3VtZW50KQorICAgICAgICByZXR1cm4gRWRpdG9yOjpDb21tYW5kKCk7CisKKyAgICBkb2N1
bWVudC0+dXBkYXRlU3R5bGVJZk5lZWRlZCgpOworCisgICAgcmV0dXJuIGZyYW1lLT5lZGl0b3Io
KS0+Y29tbWFuZChjb21tYW5kTmFtZSwKKyAgICAgICAgdXNlckludGVyZmFjZSA/IENvbW1hbmRG
cm9tRE9NV2l0aFVzZXJJbnRlcmZhY2UgOiBDb21tYW5kRnJvbURPTSk7Cit9CisKK2Jvb2wgRG9j
dW1lbnQ6OmV4ZWNDb21tYW5kKGNvbnN0IFN0cmluZyYgY29tbWFuZE5hbWUsIGJvb2wgdXNlcklu
dGVyZmFjZSwgY29uc3QgU3RyaW5nJiB2YWx1ZSkKK3sKKyAgICByZXR1cm4gY29tbWFuZCh0aGlz
LCBjb21tYW5kTmFtZSwgdXNlckludGVyZmFjZSkuZXhlY3V0ZSh2YWx1ZSk7Cit9CisKK2Jvb2wg
RG9jdW1lbnQ6OnF1ZXJ5Q29tbWFuZEVuYWJsZWQoY29uc3QgU3RyaW5nJiBjb21tYW5kTmFtZSkK
K3sKKyAgICByZXR1cm4gY29tbWFuZCh0aGlzLCBjb21tYW5kTmFtZSkuaXNFbmFibGVkKCk7Cit9
CisKK2Jvb2wgRG9jdW1lbnQ6OnF1ZXJ5Q29tbWFuZEluZGV0ZXJtKGNvbnN0IFN0cmluZyYgY29t
bWFuZE5hbWUpCit7CisgICAgcmV0dXJuIGNvbW1hbmQodGhpcywgY29tbWFuZE5hbWUpLnN0YXRl
KCkgPT0gTWl4ZWRUcmlTdGF0ZTsKK30KKworYm9vbCBEb2N1bWVudDo6cXVlcnlDb21tYW5kU3Rh
dGUoY29uc3QgU3RyaW5nJiBjb21tYW5kTmFtZSkKK3sKKyAgICByZXR1cm4gY29tbWFuZCh0aGlz
LCBjb21tYW5kTmFtZSkuc3RhdGUoKSA9PSBUcnVlVHJpU3RhdGU7Cit9CisKK2Jvb2wgRG9jdW1l
bnQ6OnF1ZXJ5Q29tbWFuZFN1cHBvcnRlZChjb25zdCBTdHJpbmcmIGNvbW1hbmROYW1lKQorewor
ICAgIHJldHVybiBjb21tYW5kKHRoaXMsIGNvbW1hbmROYW1lKS5pc1N1cHBvcnRlZCgpOworfQor
CitTdHJpbmcgRG9jdW1lbnQ6OnF1ZXJ5Q29tbWFuZFZhbHVlKGNvbnN0IFN0cmluZyYgY29tbWFu
ZE5hbWUpCit7CisgICAgcmV0dXJuIGNvbW1hbmQodGhpcywgY29tbWFuZE5hbWUpLnZhbHVlKCk7
Cit9CisKK0tVUkwgRG9jdW1lbnQ6Om9wZW5TZWFyY2hEZXNjcmlwdGlvblVSTCgpCit7CisgICAg
c3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IG9wZW5TZWFyY2hNSU1FVHlwZSA9ICJhcHBsaWNhdGlv
bi9vcGVuc2VhcmNoZGVzY3JpcHRpb24reG1sIjsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogY29u
c3Qgb3BlblNlYXJjaFJlbGF0aW9uID0gInNlYXJjaCI7CisKKyAgICAvLyBGSVhNRTogV2h5IGRv
IG9ubHkgdG9wLWxldmVsIGZyYW1lcyBoYXZlIG9wZW5TZWFyY2hEZXNjcmlwdGlvblVSTHM/Cisg
ICAgaWYgKCFmcmFtZSgpIHx8IGZyYW1lKCktPnRyZWUoKS0+cGFyZW50KCkpCisgICAgICAgIHJl
dHVybiBLVVJMKCk7CisKKyAgICAvLyBGSVhNRTogV2h5IGRvIHdlIG5lZWQgdG8gd2FpdCBmb3Ig
RnJhbWVTdGF0ZUNvbXBsZXRlPworICAgIGlmIChmcmFtZSgpLT5sb2FkZXIoKS0+c3RhdGUoKSAh
PSBGcmFtZVN0YXRlQ29tcGxldGUpCisgICAgICAgIHJldHVybiBLVVJMKCk7CisKKyAgICBpZiAo
IWhlYWQoKSkKKyAgICAgICAgcmV0dXJuIEtVUkwoKTsKKworICAgIFJlZlB0cjxIVE1MQ29sbGVj
dGlvbj4gY2hpbGRyZW4gPSBoZWFkKCktPmNoaWxkcmVuKCk7CisgICAgZm9yICh1bnNpZ25lZCBp
ID0gMDsgTm9kZSogY2hpbGQgPSBjaGlsZHJlbi0+aXRlbShpKTsgaSsrKSB7CisgICAgICAgIGlm
ICghY2hpbGQtPmhhc1RhZ05hbWUobGlua1RhZykpCisgICAgICAgICAgICBjb250aW51ZTsKKyAg
ICAgICAgSFRNTExpbmtFbGVtZW50KiBsaW5rRWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxMaW5r
RWxlbWVudCo+KGNoaWxkKTsKKyAgICAgICAgaWYgKCFlcXVhbElnbm9yaW5nQ2FzZShsaW5rRWxl
bWVudC0+dHlwZSgpLCBvcGVuU2VhcmNoTUlNRVR5cGUpIHx8ICFlcXVhbElnbm9yaW5nQ2FzZShs
aW5rRWxlbWVudC0+cmVsKCksIG9wZW5TZWFyY2hSZWxhdGlvbikpCisgICAgICAgICAgICBjb250
aW51ZTsKKyAgICAgICAgaWYgKGxpbmtFbGVtZW50LT5ocmVmKCkuaXNFbXB0eSgpKQorICAgICAg
ICAgICAgY29udGludWU7CisgICAgICAgIHJldHVybiBsaW5rRWxlbWVudC0+aHJlZigpOworICAg
IH0KKworICAgIHJldHVybiBLVVJMKCk7Cit9CisKKyNpZiBFTkFCTEUoWFNMVCkKKwordm9pZCBE
b2N1bWVudDo6YXBwbHlYU0xUcmFuc2Zvcm0oUHJvY2Vzc2luZ0luc3RydWN0aW9uKiBwaSkKK3sK
KyAgICBSZWZQdHI8WFNMVFByb2Nlc3Nvcj4gcHJvY2Vzc29yID0gWFNMVFByb2Nlc3Nvcjo6Y3Jl
YXRlKCk7CisgICAgcHJvY2Vzc29yLT5zZXRYU0xTdHlsZVNoZWV0KHN0YXRpY19jYXN0PFhTTFN0
eWxlU2hlZXQqPihwaS0+c2hlZXQoKSkpOworICAgIFN0cmluZyByZXN1bHRNSU1FVHlwZTsKKyAg
ICBTdHJpbmcgbmV3U291cmNlOworICAgIFN0cmluZyByZXN1bHRFbmNvZGluZzsKKyAgICBpZiAo
IXByb2Nlc3Nvci0+dHJhbnNmb3JtVG9TdHJpbmcodGhpcywgcmVzdWx0TUlNRVR5cGUsIG5ld1Nv
dXJjZSwgcmVzdWx0RW5jb2RpbmcpKQorICAgICAgICByZXR1cm47CisgICAgLy8gRklYTUU6IElm
IHRoZSB0cmFuc2Zvcm0gZmFpbGVkIHdlIHNob3VsZCBwcm9iYWJseSByZXBvcnQgYW4gZXJyb3Ig
KGxpa2UgTW96aWxsYSBkb2VzKS4KKyAgICBwcm9jZXNzb3ItPmNyZWF0ZURvY3VtZW50RnJvbVNv
dXJjZShuZXdTb3VyY2UsIHJlc3VsdEVuY29kaW5nLCByZXN1bHRNSU1FVHlwZSwgdGhpcywgZnJh
bWUoKSk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnNldFRyYW5zZm9ybVNvdXJjZShQYXNzT3duUHRy
PFRyYW5zZm9ybVNvdXJjZT4gc291cmNlKQoreworICAgIG1fdHJhbnNmb3JtU291cmNlID0gc291
cmNlOworfQorCisjZW5kaWYKKwordm9pZCBEb2N1bWVudDo6c2V0RGVzaWduTW9kZShJbmhlcml0
ZWRCb29sIHZhbHVlKQoreworICAgIG1fZGVzaWduTW9kZSA9IHZhbHVlOworICAgIGZvciAoRnJh
bWUqIGZyYW1lID0gbV9mcmFtZTsgZnJhbWUgJiYgZnJhbWUtPmRvY3VtZW50KCk7IGZyYW1lID0g
ZnJhbWUtPnRyZWUoKS0+dHJhdmVyc2VOZXh0KG1fZnJhbWUpKQorICAgICAgICBmcmFtZS0+ZG9j
dW1lbnQoKS0+c2NoZWR1bGVGb3JjZWRTdHlsZVJlY2FsYygpOworfQorCitEb2N1bWVudDo6SW5o
ZXJpdGVkQm9vbCBEb2N1bWVudDo6Z2V0RGVzaWduTW9kZSgpIGNvbnN0Cit7CisgICAgcmV0dXJu
IG1fZGVzaWduTW9kZTsKK30KKworYm9vbCBEb2N1bWVudDo6aW5EZXNpZ25Nb2RlKCkgY29uc3QK
K3sKKyAgICBmb3IgKGNvbnN0IERvY3VtZW50KiBkID0gdGhpczsgZDsgZCA9IGQtPnBhcmVudERv
Y3VtZW50KCkpIHsKKyAgICAgICAgaWYgKGQtPm1fZGVzaWduTW9kZSAhPSBpbmhlcml0KQorICAg
ICAgICAgICAgcmV0dXJuIGQtPm1fZGVzaWduTW9kZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNl
OworfQorCitEb2N1bWVudCogRG9jdW1lbnQ6OnBhcmVudERvY3VtZW50KCkgY29uc3QKK3sKKyAg
ICBpZiAoIW1fZnJhbWUpCisgICAgICAgIHJldHVybiAwOworICAgIEZyYW1lKiBwYXJlbnQgPSBt
X2ZyYW1lLT50cmVlKCktPnBhcmVudCgpOworICAgIGlmICghcGFyZW50KQorICAgICAgICByZXR1
cm4gMDsKKyAgICByZXR1cm4gcGFyZW50LT5kb2N1bWVudCgpOworfQorCitEb2N1bWVudCogRG9j
dW1lbnQ6OnRvcERvY3VtZW50KCkgY29uc3QKK3sKKyAgICBEb2N1bWVudCogZG9jID0gY29uc3Rf
Y2FzdDxEb2N1bWVudCAqPih0aGlzKTsKKyAgICBFbGVtZW50KiBlbGVtZW50OworICAgIHdoaWxl
ICgoZWxlbWVudCA9IGRvYy0+b3duZXJFbGVtZW50KCkpKQorICAgICAgICBkb2MgPSBlbGVtZW50
LT5kb2N1bWVudCgpOworICAgIAorICAgIHJldHVybiBkb2M7Cit9CisKK1Bhc3NSZWZQdHI8QXR0
cj4gRG9jdW1lbnQ6OmNyZWF0ZUF0dHJpYnV0ZShjb25zdCBTdHJpbmcmIG5hbWUsIEV4Y2VwdGlv
bkNvZGUmIGVjKQoreworICAgIHJldHVybiBjcmVhdGVBdHRyaWJ1dGVOUyhTdHJpbmcoKSwgbmFt
ZSwgZWMsIHRydWUpOworfQorCitQYXNzUmVmUHRyPEF0dHI+IERvY3VtZW50OjpjcmVhdGVBdHRy
aWJ1dGVOUyhjb25zdCBTdHJpbmcmIG5hbWVzcGFjZVVSSSwgY29uc3QgU3RyaW5nJiBxdWFsaWZp
ZWROYW1lLCBFeGNlcHRpb25Db2RlJiBlYywgYm9vbCBzaG91bGRJZ25vcmVOYW1lc3BhY2VDaGVj
a3MpCit7CisgICAgU3RyaW5nIHByZWZpeCwgbG9jYWxOYW1lOworICAgIGlmICghcGFyc2VRdWFs
aWZpZWROYW1lKHF1YWxpZmllZE5hbWUsIHByZWZpeCwgbG9jYWxOYW1lLCBlYykpCisgICAgICAg
IHJldHVybiAwOworCisgICAgUXVhbGlmaWVkTmFtZSBxTmFtZShwcmVmaXgsIGxvY2FsTmFtZSwg
bmFtZXNwYWNlVVJJKTsKKworICAgIGlmICghc2hvdWxkSWdub3JlTmFtZXNwYWNlQ2hlY2tzICYm
ICFoYXNWYWxpZE5hbWVzcGFjZUZvckF0dHJpYnV0ZXMocU5hbWUpKSB7CisgICAgICAgIGVjID0g
TkFNRVNQQUNFX0VSUjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIEF0
dHI6OmNyZWF0ZSh0aGlzLCBxTmFtZSwgZW1wdHlTdHJpbmcoKSk7Cit9CisKKyNpZiBFTkFCTEUo
U1ZHKQorY29uc3QgU1ZHRG9jdW1lbnRFeHRlbnNpb25zKiBEb2N1bWVudDo6c3ZnRXh0ZW5zaW9u
cygpCit7CisgICAgcmV0dXJuIG1fc3ZnRXh0ZW5zaW9ucy5nZXQoKTsKK30KKworU1ZHRG9jdW1l
bnRFeHRlbnNpb25zKiBEb2N1bWVudDo6YWNjZXNzU1ZHRXh0ZW5zaW9ucygpCit7CisgICAgaWYg
KCFtX3N2Z0V4dGVuc2lvbnMpCisgICAgICAgIG1fc3ZnRXh0ZW5zaW9ucyA9IGFkb3B0UHRyKG5l
dyBTVkdEb2N1bWVudEV4dGVuc2lvbnModGhpcykpOworICAgIHJldHVybiBtX3N2Z0V4dGVuc2lv
bnMuZ2V0KCk7Cit9CisKK2Jvb2wgRG9jdW1lbnQ6Omhhc1NWR1Jvb3ROb2RlKCkgY29uc3QKK3sK
KyAgICByZXR1cm4gZG9jdW1lbnRFbGVtZW50KCkgJiYgZG9jdW1lbnRFbGVtZW50KCktPmhhc1Rh
Z05hbWUoU1ZHTmFtZXM6OnN2Z1RhZyk7Cit9CisjZW5kaWYKKworLy8gRklYTUU6IFRoaXMgY2Fj
aGluZyBtZWNoYW5pc20gc2hvdWxkIGJlIG1lcmdlZCB0aGF0IG9mIER5bmFtaWNOb2RlTGlzdCBp
biBOb2RlUmFyZURhdGEuCitQYXNzUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBEb2N1bWVudDo6Y2Fj
aGVkQ29sbGVjdGlvbihDb2xsZWN0aW9uVHlwZSB0eXBlKQoreworICAgIEFTU0VSVChzdGF0aWNf
Y2FzdDx1bnNpZ25lZD4odHlwZSkgPCBOdW1Vbm5hbWVkRG9jdW1lbnRDYWNoZWRUeXBlcyk7Cisg
ICAgaWYgKG1fY29sbGVjdGlvbnNbdHlwZV0pCisgICAgICAgIHJldHVybiBtX2NvbGxlY3Rpb25z
W3R5cGVdOworCisgICAgUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBjb2xsZWN0aW9uOworICAgIGlm
ICh0eXBlID09IERvY0FsbCkKKyAgICAgICAgY29sbGVjdGlvbiA9IEhUTUxBbGxDb2xsZWN0aW9u
OjpjcmVhdGUodGhpcyk7CisgICAgZWxzZQorICAgICAgICBjb2xsZWN0aW9uID0gSFRNTENvbGxl
Y3Rpb246OmNyZWF0ZSh0aGlzLCB0eXBlKTsKKyAgICBtX2NvbGxlY3Rpb25zW3R5cGVdID0gY29s
bGVjdGlvbi5nZXQoKTsKKworICAgIHJldHVybiBjb2xsZWN0aW9uLnJlbGVhc2UoKTsKK30KKwor
dm9pZCBEb2N1bWVudDo6cmVtb3ZlQ2FjaGVkSFRNTENvbGxlY3Rpb24oSFRNTENvbGxlY3Rpb24q
IGNvbGxlY3Rpb24sIENvbGxlY3Rpb25UeXBlIHR5cGUpCit7CisgICAgQVNTRVJUX1VOVVNFRChj
b2xsZWN0aW9uLCBtX2NvbGxlY3Rpb25zW3R5cGVdID09IGNvbGxlY3Rpb24pOworICAgIG1fY29s
bGVjdGlvbnNbdHlwZV0gPSAwOworfQorCitQYXNzUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBEb2N1
bWVudDo6aW1hZ2VzKCkKK3sKKyAgICByZXR1cm4gY2FjaGVkQ29sbGVjdGlvbihEb2NJbWFnZXMp
OworfQorCitQYXNzUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBEb2N1bWVudDo6YXBwbGV0cygpCit7
CisgICAgcmV0dXJuIGNhY2hlZENvbGxlY3Rpb24oRG9jQXBwbGV0cyk7Cit9CisKK1Bhc3NSZWZQ
dHI8SFRNTENvbGxlY3Rpb24+IERvY3VtZW50OjplbWJlZHMoKQoreworICAgIHJldHVybiBjYWNo
ZWRDb2xsZWN0aW9uKERvY0VtYmVkcyk7Cit9CisKK1Bhc3NSZWZQdHI8SFRNTENvbGxlY3Rpb24+
IERvY3VtZW50OjpwbHVnaW5zKCkKK3sKKyAgICAvLyBUaGlzIGlzIGFuIGFsaWFzIGZvciBlbWJl
ZHMoKSByZXF1aXJlZCBmb3IgdGhlIEpTIERPTSBiaW5kaW5ncy4KKyAgICByZXR1cm4gY2FjaGVk
Q29sbGVjdGlvbihEb2NFbWJlZHMpOworfQorCitQYXNzUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBE
b2N1bWVudDo6b2JqZWN0cygpCit7CisgICAgcmV0dXJuIGNhY2hlZENvbGxlY3Rpb24oRG9jT2Jq
ZWN0cyk7Cit9CisKK1Bhc3NSZWZQdHI8SFRNTENvbGxlY3Rpb24+IERvY3VtZW50OjpzY3JpcHRz
KCkKK3sKKyAgICByZXR1cm4gY2FjaGVkQ29sbGVjdGlvbihEb2NTY3JpcHRzKTsKK30KKworUGFz
c1JlZlB0cjxIVE1MQ29sbGVjdGlvbj4gRG9jdW1lbnQ6OmxpbmtzKCkKK3sKKyAgICByZXR1cm4g
Y2FjaGVkQ29sbGVjdGlvbihEb2NMaW5rcyk7Cit9CisKK1Bhc3NSZWZQdHI8SFRNTENvbGxlY3Rp
b24+IERvY3VtZW50Ojpmb3JtcygpCit7CisgICAgcmV0dXJuIGNhY2hlZENvbGxlY3Rpb24oRG9j
Rm9ybXMpOworfQorCitQYXNzUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBEb2N1bWVudDo6YW5jaG9y
cygpCit7CisgICAgcmV0dXJuIGNhY2hlZENvbGxlY3Rpb24oRG9jQW5jaG9ycyk7Cit9CisKK1Bh
c3NSZWZQdHI8SFRNTENvbGxlY3Rpb24+IERvY3VtZW50OjphbGwoKQoreworICAgIHJldHVybiBj
YWNoZWRDb2xsZWN0aW9uKERvY0FsbCk7Cit9CisKK1Bhc3NSZWZQdHI8SFRNTENvbGxlY3Rpb24+
IERvY3VtZW50Ojp3aW5kb3dOYW1lZEl0ZW1zKGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSkKK3sK
KyAgICBOYW1lZENvbGxlY3Rpb25NYXA6OkFkZFJlc3VsdCByZXN1bHQgPSBtX3dpbmRvd05hbWVk
SXRlbUNvbGxlY3Rpb25zLmFkZChuYW1lLCAwKTsKKyAgICBpZiAoIXJlc3VsdC5pc05ld0VudHJ5
KQorICAgICAgICByZXR1cm4gcmVzdWx0Lml0ZXJhdG9yLT5zZWNvbmQ7CisKKyAgICBSZWZQdHI8
SFRNTE5hbWVDb2xsZWN0aW9uPiBjb2xsZWN0aW9uID0gSFRNTE5hbWVDb2xsZWN0aW9uOjpjcmVh
dGUodGhpcywgV2luZG93TmFtZWRJdGVtcywgbmFtZSk7CisgICAgcmVzdWx0Lml0ZXJhdG9yLT5z
ZWNvbmQgPSBjb2xsZWN0aW9uLmdldCgpOworICAgIHJldHVybiBjb2xsZWN0aW9uLnJlbGVhc2Uo
KTsKK30KKworUGFzc1JlZlB0cjxIVE1MQ29sbGVjdGlvbj4gRG9jdW1lbnQ6OmRvY3VtZW50TmFt
ZWRJdGVtcyhjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUpCit7CisgICAgTmFtZWRDb2xsZWN0aW9u
TWFwOjpBZGRSZXN1bHQgcmVzdWx0ID0gbV9kb2N1bWVudE5hbWVkSXRlbUNvbGxlY3Rpb25zLmFk
ZChuYW1lLCAwKTsKKyAgICBpZiAoIXJlc3VsdC5pc05ld0VudHJ5KQorICAgICAgICByZXR1cm4g
cmVzdWx0Lml0ZXJhdG9yLT5zZWNvbmQ7CisKKyAgICBSZWZQdHI8SFRNTE5hbWVDb2xsZWN0aW9u
PiBjb2xsZWN0aW9uID0gSFRNTE5hbWVDb2xsZWN0aW9uOjpjcmVhdGUodGhpcywgRG9jdW1lbnRO
YW1lZEl0ZW1zLCBuYW1lKTsKKyAgICByZXN1bHQuaXRlcmF0b3ItPnNlY29uZCA9IGNvbGxlY3Rp
b24uZ2V0KCk7CisgICAgcmV0dXJuIGNvbGxlY3Rpb24ucmVsZWFzZSgpOworfQorCisvLyBGSVhN
RTogVGhpcyBjYWNoaW5nIG1lY2hhbmlzbSBzaG91bGQgYmUgbWVyZ2VkIHRoYXQgb2YgRHluYW1p
Y05vZGVMaXN0IGluIE5vZGVSYXJlRGF0YS4KK3ZvaWQgRG9jdW1lbnQ6OnJlbW92ZVdpbmRvd05h
bWVkSXRlbUNhY2hlKEhUTUxDb2xsZWN0aW9uKiBjb2xsZWN0aW9uLCBjb25zdCBBdG9taWNTdHJp
bmcmIG5hbWUpCit7CisgICAgQVNTRVJUX1VOVVNFRChjb2xsZWN0aW9uLCBtX3dpbmRvd05hbWVk
SXRlbUNvbGxlY3Rpb25zLmdldChuYW1lKSA9PSBjb2xsZWN0aW9uKTsKKyAgICBtX3dpbmRvd05h
bWVkSXRlbUNvbGxlY3Rpb25zLnJlbW92ZShuYW1lKTsKK30KKwordm9pZCBEb2N1bWVudDo6cmVt
b3ZlRG9jdW1lbnROYW1lZEl0ZW1DYWNoZShIVE1MQ29sbGVjdGlvbiogY29sbGVjdGlvbiwgY29u
c3QgQXRvbWljU3RyaW5nJiBuYW1lKQoreworICAgIEFTU0VSVF9VTlVTRUQoY29sbGVjdGlvbiwg
bV9kb2N1bWVudE5hbWVkSXRlbUNvbGxlY3Rpb25zLmdldChuYW1lKSA9PSBjb2xsZWN0aW9uKTsK
KyAgICBtX2RvY3VtZW50TmFtZWRJdGVtQ29sbGVjdGlvbnMucmVtb3ZlKG5hbWUpOworfQorCit2
b2lkIERvY3VtZW50OjpmaW5pc2hlZFBhcnNpbmcoKQoreworICAgIEFTU0VSVCghc2NyaXB0YWJs
ZURvY3VtZW50UGFyc2VyKCkgfHwgIW1fcGFyc2VyLT5pc1BhcnNpbmcoKSk7CisgICAgQVNTRVJU
KCFzY3JpcHRhYmxlRG9jdW1lbnRQYXJzZXIoKSB8fCBtX3JlYWR5U3RhdGUgIT0gTG9hZGluZyk7
CisgICAgc2V0UGFyc2luZyhmYWxzZSk7CisgICAgaWYgKCFtX2RvY3VtZW50VGltaW5nLmRvbUNv
bnRlbnRMb2FkZWRFdmVudFN0YXJ0KQorICAgICAgICBtX2RvY3VtZW50VGltaW5nLmRvbUNvbnRl
bnRMb2FkZWRFdmVudFN0YXJ0ID0gbW9ub3RvbmljYWxseUluY3JlYXNpbmdUaW1lKCk7CisgICAg
ZGlzcGF0Y2hFdmVudChFdmVudDo6Y3JlYXRlKGV2ZW50TmFtZXMoKS5ET01Db250ZW50TG9hZGVk
RXZlbnQsIHRydWUsIGZhbHNlKSk7CisgICAgaWYgKCFtX2RvY3VtZW50VGltaW5nLmRvbUNvbnRl
bnRMb2FkZWRFdmVudEVuZCkKKyAgICAgICAgbV9kb2N1bWVudFRpbWluZy5kb21Db250ZW50TG9h
ZGVkRXZlbnRFbmQgPSBtb25vdG9uaWNhbGx5SW5jcmVhc2luZ1RpbWUoKTsKKworICAgIGlmIChS
ZWZQdHI8RnJhbWU+IGYgPSBmcmFtZSgpKSB7CisgICAgICAgIC8vIEZyYW1lTG9hZGVyOjpmaW5p
c2hlZFBhcnNpbmcoKSBtaWdodCBlbmQgdXAgY2FsbGluZyBEb2N1bWVudDo6aW1wbGljaXRDbG9z
ZSgpIGlmIGFsbAorICAgICAgICAvLyByZXNvdXJjZSBsb2FkcyBhcmUgY29tcGxldGUuIEhUTUxP
YmplY3RFbGVtZW50cyBjYW4gc3RhcnQgbG9hZGluZyB0aGVpciByZXNvdXJjZXMgZnJvbQorICAg
ICAgICAvLyBwb3N0IGF0dGFjaCBjYWxsYmFja3MgdHJpZ2dlcmVkIGJ5IHJlY2FsY1N0eWxlKCku
ICBUaGlzIG1lYW5zIGlmIHdlIHBhcnNlIG91dCBhbiA8b2JqZWN0PgorICAgICAgICAvLyB0YWcg
YW5kIHRoZW4gcmVhY2ggdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQgd2l0aG91dCB1cGRhdGluZyBz
dHlsZXMsIHdlIG1pZ2h0IG5vdCBoYXZlIHlldAorICAgICAgICAvLyBzdGFydGVkIHRoZSByZXNv
dXJjZSBsb2FkIGFuZCBtaWdodCBmaXJlIHRoZSB3aW5kb3cgbG9hZCBldmVudCB0b28gZWFybHku
ICBUbyBhdm9pZCB0aGlzCisgICAgICAgIC8vIHdlIGZvcmNlIHRoZSBzdHlsZXMgdG8gYmUgdXAg
dG8gZGF0ZSBiZWZvcmUgY2FsbGluZyBGcmFtZUxvYWRlcjo6ZmluaXNoZWRQYXJzaW5nKCkuCisg
ICAgICAgIC8vIFNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzY4
NjQgc3RhcnRpbmcgYXJvdW5kIGNvbW1lbnQgMzUuCisgICAgICAgIHVwZGF0ZVN0eWxlSWZOZWVk
ZWQoKTsKKworICAgICAgICBmLT5sb2FkZXIoKS0+ZmluaXNoZWRQYXJzaW5nKCk7CisKKyAgICAg
ICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpkb21Db250ZW50TG9hZGVkRXZlbnRGaXJlZChm
LmdldCgpKTsKKyAgICB9CisKKyAgICAvLyBUaGUgRWxlbWVudEF0dHJpYnV0ZURhdGEgc2hhcmlu
ZyBjYWNoZSBpcyBvbmx5IHVzZWQgZHVyaW5nIHBhcnNpbmcgc2luY2UKKyAgICAvLyB0aGF0J3Mg
d2hlbiB0aGUgbWFqb3JpdHkgb2YgaW1tdXRhYmxlIGF0dHJpYnV0ZSBkYXRhIHdpbGwgYmUgY3Jl
YXRlZC4KKyAgICBtX2ltbXV0YWJsZUF0dHJpYnV0ZURhdGFDYWNoZS5jbGVhcigpOworfQorCitQ
YXNzUmVmUHRyPFhQYXRoRXhwcmVzc2lvbj4gRG9jdW1lbnQ6OmNyZWF0ZUV4cHJlc3Npb24oY29u
c3QgU3RyaW5nJiBleHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIFhQYXRoTlNSZXNvbHZlciogcmVzb2x2ZXIsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9u
Q29kZSYgZWMpCit7CisgICAgaWYgKCFtX3hwYXRoRXZhbHVhdG9yKQorICAgICAgICBtX3hwYXRo
RXZhbHVhdG9yID0gWFBhdGhFdmFsdWF0b3I6OmNyZWF0ZSgpOworICAgIHJldHVybiBtX3hwYXRo
RXZhbHVhdG9yLT5jcmVhdGVFeHByZXNzaW9uKGV4cHJlc3Npb24sIHJlc29sdmVyLCBlYyk7Cit9
CisKK1Bhc3NSZWZQdHI8WFBhdGhOU1Jlc29sdmVyPiBEb2N1bWVudDo6Y3JlYXRlTlNSZXNvbHZl
cihOb2RlKiBub2RlUmVzb2x2ZXIpCit7CisgICAgaWYgKCFtX3hwYXRoRXZhbHVhdG9yKQorICAg
ICAgICBtX3hwYXRoRXZhbHVhdG9yID0gWFBhdGhFdmFsdWF0b3I6OmNyZWF0ZSgpOworICAgIHJl
dHVybiBtX3hwYXRoRXZhbHVhdG9yLT5jcmVhdGVOU1Jlc29sdmVyKG5vZGVSZXNvbHZlcik7Cit9
CisKK1Bhc3NSZWZQdHI8WFBhdGhSZXN1bHQ+IERvY3VtZW50OjpldmFsdWF0ZShjb25zdCBTdHJp
bmcmIGV4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgTm9kZSogY29udGV4dE5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgWFBhdGhOU1Jlc29sdmVyKiByZXNvbHZlciwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCB0eXBlLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhQYXRoUmVzdWx0KiByZXN1bHQsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uQ29kZSYgZWMp
Cit7CisgICAgaWYgKCFtX3hwYXRoRXZhbHVhdG9yKQorICAgICAgICBtX3hwYXRoRXZhbHVhdG9y
ID0gWFBhdGhFdmFsdWF0b3I6OmNyZWF0ZSgpOworICAgIHJldHVybiBtX3hwYXRoRXZhbHVhdG9y
LT5ldmFsdWF0ZShleHByZXNzaW9uLCBjb250ZXh0Tm9kZSwgcmVzb2x2ZXIsIHR5cGUsIHJlc3Vs
dCwgZWMpOworfQorCitjb25zdCBWZWN0b3I8SWNvblVSTD4mIERvY3VtZW50OjppY29uVVJMcygp
Cit7CisgICAgbV9pY29uVVJMcy5jbGVhcigpOworCisgICAgaWYgKCFoZWFkKCkgfHwgIShoZWFk
KCktPmNoaWxkcmVuKCkpKQorICAgICAgICByZXR1cm4gbV9pY29uVVJMczsKKworICAgIC8vIElu
Y2x1ZGUgYW55IGljb25zIHdoZXJlIHR5cGUgPSBsaW5rLCByZWwgPSAic2hvcnRjdXQgaWNvbiIu
CisgICAgUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBjaGlsZHJlbiA9IGhlYWQoKS0+Y2hpbGRyZW4o
KTsKKyAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoID0gY2hpbGRyZW4tPmxlbmd0aCgpOworICAgIGZv
ciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgTm9kZSog
Y2hpbGQgPSBjaGlsZHJlbi0+aXRlbShpKTsKKyAgICAgICAgaWYgKCFjaGlsZC0+aGFzVGFnTmFt
ZShsaW5rVGFnKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBIVE1MTGlua0VsZW1l
bnQqIGxpbmtFbGVtZW50ID0gc3RhdGljX2Nhc3Q8SFRNTExpbmtFbGVtZW50Kj4oY2hpbGQpOwor
ICAgICAgICBpZiAobGlua0VsZW1lbnQtPmljb25UeXBlKCkgIT0gRmF2aWNvbikKKyAgICAgICAg
ICAgIGNvbnRpbnVlOworICAgICAgICBpZiAobGlua0VsZW1lbnQtPmhyZWYoKS5pc0VtcHR5KCkp
CisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAvLyBQdXQgaXQgYXQgdGhlIGZyb250
IHRvIGVuc3VyZSB0aGF0IGljb25zIHNlZW4gbGF0ZXIgdGFrZSBwcmVjZWRlbmNlIGFzIHJlcXVp
cmVkIGJ5IHRoZSBzcGVjLgorICAgICAgICBJY29uVVJMIG5ld1VSTChsaW5rRWxlbWVudC0+aHJl
ZigpLCBsaW5rRWxlbWVudC0+aWNvblNpemVzKCksIGxpbmtFbGVtZW50LT50eXBlKCksIGxpbmtF
bGVtZW50LT5pY29uVHlwZSgpKTsKKyAgICAgICAgbV9pY29uVVJMcy5wcmVwZW5kKG5ld1VSTCk7
CisgICAgfQorCisgICAgcmV0dXJuIG1faWNvblVSTHM7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmFk
ZEljb25VUkwoY29uc3QgU3RyaW5nJiB1cmwsIGNvbnN0IFN0cmluZyYgbWltZVR5cGUsIGNvbnN0
IFN0cmluZyYgc2l6ZXMsIEljb25UeXBlIGljb25UeXBlKQoreworICAgIGlmICh1cmwuaXNFbXB0
eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBGSVhNRSAtIDxyZGFyOi8vcHJvYmxlbS80
NzI3NjQ1PiAtIEF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZSwgd2UgbWlnaHQgYWN0dWFsbHkg
aG9ub3IgdGhlICJtaW1lVHlwZSIKKyAgICBJY29uVVJMIG5ld1VSTChLVVJMKFBhcnNlZFVSTFN0
cmluZywgdXJsKSwgc2l6ZXMsIG1pbWVUeXBlLCBpY29uVHlwZSk7CisKKyAgICBpZiAoRnJhbWUq
IGYgPSBmcmFtZSgpKSB7CisgICAgICAgIEljb25VUkwgaWNvblVSTCA9IGYtPmxvYWRlcigpLT5p
Y29uKCktPmljb25VUkwoaWNvblR5cGUpOworICAgICAgICBpZiAoaWNvblVSTCA9PSBuZXdVUkwp
CisgICAgICAgICAgICBmLT5sb2FkZXIoKS0+ZGlkQ2hhbmdlSWNvbnMoaWNvblR5cGUpOworICAg
IH0KK30KKwordm9pZCBEb2N1bWVudDo6c2V0VXNlU2VjdXJlS2V5Ym9hcmRFbnRyeVdoZW5BY3Rp
dmUoYm9vbCB1c2VzU2VjdXJlS2V5Ym9hcmQpCit7CisgICAgaWYgKG1fdXNlU2VjdXJlS2V5Ym9h
cmRFbnRyeVdoZW5BY3RpdmUgPT0gdXNlc1NlY3VyZUtleWJvYXJkKQorICAgICAgICByZXR1cm47
CisKKyAgICBtX3VzZVNlY3VyZUtleWJvYXJkRW50cnlXaGVuQWN0aXZlID0gdXNlc1NlY3VyZUtl
eWJvYXJkOworICAgIG1fZnJhbWUtPnNlbGVjdGlvbigpLT51cGRhdGVTZWN1cmVLZXlib2FyZEVu
dHJ5SWZBY3RpdmUoKTsKK30KKworYm9vbCBEb2N1bWVudDo6dXNlU2VjdXJlS2V5Ym9hcmRFbnRy
eVdoZW5BY3RpdmUoKSBjb25zdAoreworICAgIHJldHVybiBtX3VzZVNlY3VyZUtleWJvYXJkRW50
cnlXaGVuQWN0aXZlOworfQorCitzdGF0aWMgYm9vbCBpc0VsaWdpYmxlRm9yU2VhbWxlc3MoRG9j
dW1lbnQqIHBhcmVudCwgRG9jdW1lbnQqIGNoaWxkKQoreworICAgIC8vIEl0IHNob3VsZCBub3Qg
bWF0dGVyIHdoYXQgd2UgcmV0dXJuIGZvciB0aGUgdG9wLW1vc3QgZG9jdW1lbnQuCisgICAgaWYg
KCFwYXJlbnQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAocGFyZW50LT5pc1NhbmRi
b3hlZChTYW5kYm94U2VhbWxlc3NJZnJhbWVzKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
IGlmIChjaGlsZC0+aXNTcmNkb2NEb2N1bWVudCgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICBpZiAocGFyZW50LT5zZWN1cml0eU9yaWdpbigpLT5jYW5BY2Nlc3MoY2hpbGQtPnNlY3VyaXR5
T3JpZ2luKCkpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gcGFyZW50LT5zZWN1
cml0eU9yaWdpbigpLT5jYW5SZXF1ZXN0KGNoaWxkLT51cmwoKSk7Cit9CisKK3ZvaWQgRG9jdW1l
bnQ6OmluaXRTZWN1cml0eUNvbnRleHQoKQoreworICAgIGlmIChoYXZlSW5pdGlhbGl6ZWRTZWN1
cml0eU9yaWdpbigpKSB7CisgICAgICAgIEFTU0VSVChzZWN1cml0eU9yaWdpbigpKTsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghbV9mcmFtZSkgeworICAgICAgICAvLyBObyBz
b3VyY2UgZm9yIGEgc2VjdXJpdHkgY29udGV4dC4KKyAgICAgICAgLy8gVGhpcyBjYW4gb2NjdXIg
dmlhIGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZURvY3VtZW50KCkuCisgICAgICAgIG1f
Y29va2llVVJMID0gS1VSTChQYXJzZWRVUkxTdHJpbmcsIGVtcHR5U3RyaW5nKCkpOworICAgICAg
ICBzZXRTZWN1cml0eU9yaWdpbihTZWN1cml0eU9yaWdpbjo6Y3JlYXRlVW5pcXVlKCkpOworICAg
ICAgICBzZXRDb250ZW50U2VjdXJpdHlQb2xpY3koQ29udGVudFNlY3VyaXR5UG9saWN5OjpjcmVh
dGUodGhpcykpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gSW4gdGhlIGNvbW1v
biBjYXNlLCBjcmVhdGUgdGhlIHNlY3VyaXR5IGNvbnRleHQgZnJvbSB0aGUgY3VycmVudGx5Cisg
ICAgLy8gbG9hZGluZyBVUkwgd2l0aCBhIGZyZXNoIGNvbnRlbnQgc2VjdXJpdHkgcG9saWN5Lgor
ICAgIG1fY29va2llVVJMID0gbV91cmw7CisgICAgZW5mb3JjZVNhbmRib3hGbGFncyhtX2ZyYW1l
LT5sb2FkZXIoKS0+ZWZmZWN0aXZlU2FuZGJveEZsYWdzKCkpOworICAgIHNldFNlY3VyaXR5T3Jp
Z2luKGlzU2FuZGJveGVkKFNhbmRib3hPcmlnaW4pID8gU2VjdXJpdHlPcmlnaW46OmNyZWF0ZVVu
aXF1ZSgpIDogU2VjdXJpdHlPcmlnaW46OmNyZWF0ZShtX3VybCkpOworICAgIHNldENvbnRlbnRT
ZWN1cml0eVBvbGljeShDb250ZW50U2VjdXJpdHlQb2xpY3k6OmNyZWF0ZSh0aGlzKSk7CisKKyAg
ICBpZiAoU2VjdXJpdHlQb2xpY3k6OmFsbG93U3Vic3RpdHV0ZURhdGFBY2Nlc3NUb0xvY2FsKCkp
IHsKKyAgICAgICAgLy8gSWYgdGhpcyBkb2N1bWVudCB3YXMgbG9hZGVkIHdpdGggc3Vic3RpdHV0
ZURhdGEsIHRoZW4gdGhlIGRvY3VtZW50IGNhbgorICAgICAgICAvLyBsb2FkIGxvY2FsIHJlc291
cmNlcy4gIFNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTY3NTYK
KyAgICAgICAgLy8gYW5kIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0x
OTc2MCBmb3IgZnVydGhlcgorICAgICAgICAvLyBkaXNjdXNzaW9uLgorICAgICAgICAKKyAgICAg
ICAgRG9jdW1lbnRMb2FkZXIqIGRvY3VtZW50TG9hZGVyID0gbG9hZGVyKCk7CisgICAgICAgIGlm
IChkb2N1bWVudExvYWRlciAmJiBkb2N1bWVudExvYWRlci0+c3Vic3RpdHV0ZURhdGEoKS5pc1Zh
bGlkKCkpCisgICAgICAgICAgICBzZWN1cml0eU9yaWdpbigpLT5ncmFudExvYWRMb2NhbFJlc291
cmNlcygpOworICAgIH0KKworICAgIGlmIChTZXR0aW5ncyogc2V0dGluZ3MgPSB0aGlzLT5zZXR0
aW5ncygpKSB7CisgICAgICAgIGlmICghc2V0dGluZ3MtPmlzV2ViU2VjdXJpdHlFbmFibGVkKCkp
IHsKKyAgICAgICAgICAgIC8vIFdlYiBzZWN1cml0eSBpcyB0dXJuZWQgb2ZmLiBXZSBzaG91bGQg
bGV0IHRoaXMgZG9jdW1lbnQgYWNjZXNzIGV2ZXJ5IG90aGVyIGRvY3VtZW50LiBUaGlzIGlzIHVz
ZWQgcHJpbWFyeSBieSB0ZXN0aW5nCisgICAgICAgICAgICAvLyBoYXJuZXNzZXMgZm9yIHdlYiBz
aXRlcy4KKyAgICAgICAgICAgIHNlY3VyaXR5T3JpZ2luKCktPmdyYW50VW5pdmVyc2FsQWNjZXNz
KCk7CisgICAgICAgIH0gZWxzZSBpZiAoc2VjdXJpdHlPcmlnaW4oKS0+aXNMb2NhbCgpKSB7Cisg
ICAgICAgICAgICBpZiAoc2V0dGluZ3MtPmFsbG93VW5pdmVyc2FsQWNjZXNzRnJvbUZpbGVVUkxz
KCkgfHwgbV9mcmFtZS0+bG9hZGVyKCktPmNsaWVudCgpLT5zaG91bGRGb3JjZVVuaXZlcnNhbEFj
Y2Vzc0Zyb21Mb2NhbFVSTChtX3VybCkpIHsKKyAgICAgICAgICAgICAgICAvLyBTb21lIGNsaWVu
dHMgd2FudCBsb2NhbCBVUkxzIHRvIGhhdmUgdW5pdmVyc2FsIGFjY2VzcywgYnV0IHRoYXQgc2V0
dGluZyBpcyBkYW5nZXJvdXMgZm9yIG90aGVyIGNsaWVudHMuCisgICAgICAgICAgICAgICAgc2Vj
dXJpdHlPcmlnaW4oKS0+Z3JhbnRVbml2ZXJzYWxBY2Nlc3MoKTsKKyAgICAgICAgICAgIH0gZWxz
ZSBpZiAoIXNldHRpbmdzLT5hbGxvd0ZpbGVBY2Nlc3NGcm9tRmlsZVVSTHMoKSkgeworICAgICAg
ICAgICAgICAgIC8vIFNvbWUgY2xpZW50cyB3YW50IGxvY2FsIFVSTHMgdG8gaGF2ZSBldmVuIHRp
Z2h0ZXIgcmVzdHJpY3Rpb25zIGJ5IGRlZmF1bHQsIGFuZCBub3QgYmUgYWJsZSB0byBhY2Nlc3Mg
b3RoZXIgbG9jYWwgZmlsZXMuCisgICAgICAgICAgICAgICAgLy8gRklYTUUgODE1Nzg6IFRoZSBu
YW1pbmcgb2YgdGhpcyBpcyBjb25mdXNpbmcuIEZpbGVzIHdpdGggcmVzdHJpY3RlZCBhY2Nlc3Mg
dG8gb3RoZXIgbG9jYWwgZmlsZXMKKyAgICAgICAgICAgICAgICAvLyBzdGlsbCBjYW4gaGF2ZSBv
dGhlciBwcml2aWxlZ2VzIHRoYXQgY2FuIGJlIHJlbWVtYmVyZWQsIHRoZXJlYnkgbm90IG1ha2lu
ZyB0aGVtIHVuaXF1ZSBvcmlnaW5zLgorICAgICAgICAgICAgICAgIHNlY3VyaXR5T3JpZ2luKCkt
PmVuZm9yY2VGaWxlUGF0aFNlcGFyYXRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQor
ICAgICAgICBzZWN1cml0eU9yaWdpbigpLT5zZXRTdG9yYWdlQmxvY2tpbmdQb2xpY3koc2V0dGlu
Z3MtPnN0b3JhZ2VCbG9ja2luZ1BvbGljeSgpKTsKKyAgICB9CisKKyAgICBEb2N1bWVudCogcGFy
ZW50RG9jdW1lbnQgPSBvd25lckVsZW1lbnQoKSA/IG93bmVyRWxlbWVudCgpLT5kb2N1bWVudCgp
IDogMDsKKyAgICBpZiAocGFyZW50RG9jdW1lbnQgJiYgbV9mcmFtZS0+bG9hZGVyKCktPnNob3Vs
ZFRyZWF0VVJMQXNTcmNkb2NEb2N1bWVudCh1cmwoKSkpIHsKKyAgICAgICAgbV9pc1NyY2RvY0Rv
Y3VtZW50ID0gdHJ1ZTsKKyAgICAgICAgc2V0QmFzZVVSTE92ZXJyaWRlKHBhcmVudERvY3VtZW50
LT5iYXNlVVJMKCkpOworICAgIH0KKworICAgIC8vIEZJWE1FOiBXaGF0IGhhcHBlbnMgaWYgd2Ug
aW5oZXJpdCB0aGUgc2VjdXJpdHkgb3JpZ2luPyBUaGlzIGNoZWNrIG1heSBuZWVkIHRvIGJlIGxh
dGVyLgorICAgIC8vIDxpZnJhbWUgc2VhbWxlc3Mgc3JjPSJhYm91dDpibGFuayI+IGxpa2VseSB3
b24ndCB3b3JrIGFzLWlzLgorICAgIG1fbWF5RGlzcGxheVNlYW1sZXNzV2l0aFBhcmVudCA9IGlz
RWxpZ2libGVGb3JTZWFtbGVzcyhwYXJlbnREb2N1bWVudCwgdGhpcyk7CisKKyAgICBpZiAoIXNo
b3VsZEluaGVyaXRTZWN1cml0eU9yaWdpbkZyb21Pd25lcihtX3VybCkpCisgICAgICAgIHJldHVy
bjsKKworICAgIC8vIElmIHdlIGRvIG5vdCBvYnRhaW4gYSBtZWFuaW5nZnVsIG9yaWdpbiBmcm9t
IHRoZSBVUkwsIHRoZW4gd2UgdHJ5IHRvCisgICAgLy8gZmluZCBvbmUgdmlhIHRoZSBmcmFtZSBo
aWVyYXJjaHkuCisKKyAgICBGcmFtZSogb3duZXJGcmFtZSA9IG1fZnJhbWUtPnRyZWUoKS0+cGFy
ZW50KCk7CisgICAgaWYgKCFvd25lckZyYW1lKQorICAgICAgICBvd25lckZyYW1lID0gbV9mcmFt
ZS0+bG9hZGVyKCktPm9wZW5lcigpOworCisgICAgaWYgKCFvd25lckZyYW1lKSB7CisgICAgICAg
IGRpZEZhaWxUb0luaXRpYWxpemVTZWN1cml0eU9yaWdpbigpOworICAgICAgICByZXR1cm47Cisg
ICAgfQorCisgICAgaWYgKGlzU2FuZGJveGVkKFNhbmRib3hPcmlnaW4pKSB7CisgICAgICAgIC8v
IElmIHdlJ3JlIHN1cHBvc2VkIHRvIGluaGVyaXQgb3VyIHNlY3VyaXR5IG9yaWdpbiBmcm9tIG91
ciBvd25lciwKKyAgICAgICAgLy8gYnV0IHdlJ3JlIGFsc28gc2FuZGJveGVkLCB0aGUgb25seSB0
aGluZyB3ZSBpbmhlcml0IGlzIHRoZSBhYmlsaXR5CisgICAgICAgIC8vIHRvIGxvYWQgbG9jYWwg
cmVzb3VyY2VzLiBUaGlzIGxldHMgYWJvdXQ6YmxhbmsgaWZyYW1lcyBpbiBmaWxlOi8vCisgICAg
ICAgIC8vIFVSTCBkb2N1bWVudHMgbG9hZCBpbWFnZXMgYW5kIG90aGVyIHJlc291cmNlcyBmcm9t
IHRoZSBmaWxlIHN5c3RlbS4KKyAgICAgICAgaWYgKG93bmVyRnJhbWUtPmRvY3VtZW50KCktPnNl
Y3VyaXR5T3JpZ2luKCktPmNhbkxvYWRMb2NhbFJlc291cmNlcygpKQorICAgICAgICAgICAgc2Vj
dXJpdHlPcmlnaW4oKS0+Z3JhbnRMb2FkTG9jYWxSZXNvdXJjZXMoKTsKKyAgICAgICAgcmV0dXJu
OworICAgIH0KKworICAgIG1fY29va2llVVJMID0gb3duZXJGcmFtZS0+ZG9jdW1lbnQoKS0+Y29v
a2llVVJMKCk7CisgICAgLy8gV2UgYWxpYXMgdGhlIFNlY3VyaXR5T3JpZ2lucyB0byBtYXRjaCBG
aXJlZm94LCBzZWUgQnVnIDE1MzEzCisgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTE1MzEzCisgICAgc2V0U2VjdXJpdHlPcmlnaW4ob3duZXJGcmFtZS0+ZG9j
dW1lbnQoKS0+c2VjdXJpdHlPcmlnaW4oKSk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmluaXRDb250
ZW50U2VjdXJpdHlQb2xpY3koKQoreworICAgIGlmICghbV9mcmFtZS0+dHJlZSgpLT5wYXJlbnQo
KSB8fCAoIXNob3VsZEluaGVyaXRTZWN1cml0eU9yaWdpbkZyb21Pd25lcihtX3VybCkgJiYgIWlz
UGx1Z2luRG9jdW1lbnQoKSkpCisgICAgICAgIHJldHVybjsKKworICAgIGNvbnRlbnRTZWN1cml0
eVBvbGljeSgpLT5jb3B5U3RhdGVGcm9tKG1fZnJhbWUtPnRyZWUoKS0+cGFyZW50KCktPmRvY3Vt
ZW50KCktPmNvbnRlbnRTZWN1cml0eVBvbGljeSgpKTsKK30KKwordm9pZCBEb2N1bWVudDo6ZGlk
VXBkYXRlU2VjdXJpdHlPcmlnaW4oKQoreworICAgIGlmICghbV9mcmFtZSkKKyAgICAgICAgcmV0
dXJuOworICAgIG1fZnJhbWUtPnNjcmlwdCgpLT51cGRhdGVTZWN1cml0eU9yaWdpbigpOworfQor
Citib29sIERvY3VtZW50Ojppc0NvbnRleHRUaHJlYWQoKSBjb25zdAoreworICAgIHJldHVybiBp
c01haW5UaHJlYWQoKTsKK30KKwordm9pZCBEb2N1bWVudDo6dXBkYXRlVVJMRm9yUHVzaE9yUmVw
bGFjZVN0YXRlKGNvbnN0IEtVUkwmIHVybCkKK3sKKyAgICBGcmFtZSogZiA9IGZyYW1lKCk7Cisg
ICAgaWYgKCFmKQorICAgICAgICByZXR1cm47CisKKyAgICBzZXRVUkwodXJsKTsKKyAgICBmLT5s
b2FkZXIoKS0+c2V0T3V0Z29pbmdSZWZlcnJlcih1cmwpOworCisgICAgaWYgKERvY3VtZW50TG9h
ZGVyKiBkb2N1bWVudExvYWRlciA9IGxvYWRlcigpKQorICAgICAgICBkb2N1bWVudExvYWRlci0+
cmVwbGFjZVJlcXVlc3RVUkxGb3JTYW1lRG9jdW1lbnROYXZpZ2F0aW9uKHVybCk7Cit9CisKK3Zv
aWQgRG9jdW1lbnQ6OnN0YXRlUG9wcGVkKFBhc3NSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVl
PiBzdGF0ZU9iamVjdCkKK3sKKyAgICBpZiAoIWZyYW1lKCkpCisgICAgICAgIHJldHVybjsKKyAg
ICAKKyAgICAvLyBQZXIgc3RlcCAxMSBvZiBzZWN0aW9uIDYuNS45IChoaXN0b3J5IHRyYXZlcnNh
bCkgb2YgdGhlIEhUTUw1IHNwZWMsIHdlIAorICAgIC8vIGRlZmVyIGZpcmluZyBvZiBwb3BzdGF0
ZSB1bnRpbCB3ZSdyZSBpbiB0aGUgY29tcGxldGUgc3RhdGUuCisgICAgaWYgKG1fcmVhZHlTdGF0
ZSA9PSBDb21wbGV0ZSkKKyAgICAgICAgZW5xdWV1ZVBvcHN0YXRlRXZlbnQoc3RhdGVPYmplY3Qp
OworICAgIGVsc2UKKyAgICAgICAgbV9wZW5kaW5nU3RhdGVPYmplY3QgPSBzdGF0ZU9iamVjdDsK
K30KKwordm9pZCBEb2N1bWVudDo6dXBkYXRlRm9jdXNBcHBlYXJhbmNlU29vbihib29sIHJlc3Rv
cmVQcmV2aW91c1NlbGVjdGlvbikKK3sKKyAgICBtX3VwZGF0ZUZvY3VzQXBwZWFyYW5jZVJlc3Rv
cmVzU2VsZWN0aW9uID0gcmVzdG9yZVByZXZpb3VzU2VsZWN0aW9uOworICAgIGlmICghbV91cGRh
dGVGb2N1c0FwcGVhcmFuY2VUaW1lci5pc0FjdGl2ZSgpKQorICAgICAgICBtX3VwZGF0ZUZvY3Vz
QXBwZWFyYW5jZVRpbWVyLnN0YXJ0T25lU2hvdCgwKTsKK30KKwordm9pZCBEb2N1bWVudDo6Y2Fu
Y2VsRm9jdXNBcHBlYXJhbmNlVXBkYXRlKCkKK3sKKyAgICBtX3VwZGF0ZUZvY3VzQXBwZWFyYW5j
ZVRpbWVyLnN0b3AoKTsKK30KKwordm9pZCBEb2N1bWVudDo6dXBkYXRlRm9jdXNBcHBlYXJhbmNl
VGltZXJGaXJlZChUaW1lcjxEb2N1bWVudD4qKQoreworICAgIE5vZGUqIG5vZGUgPSBmb2N1c2Vk
Tm9kZSgpOworICAgIGlmICghbm9kZSkKKyAgICAgICAgcmV0dXJuOworICAgIGlmICghbm9kZS0+
aXNFbGVtZW50Tm9kZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICB1cGRhdGVMYXlvdXQoKTsK
KworICAgIEVsZW1lbnQqIGVsZW1lbnQgPSBzdGF0aWNfY2FzdDxFbGVtZW50Kj4obm9kZSk7Cisg
ICAgaWYgKGVsZW1lbnQtPmlzRm9jdXNhYmxlKCkpCisgICAgICAgIGVsZW1lbnQtPnVwZGF0ZUZv
Y3VzQXBwZWFyYW5jZShtX3VwZGF0ZUZvY3VzQXBwZWFyYW5jZVJlc3RvcmVzU2VsZWN0aW9uKTsK
K30KKwordm9pZCBEb2N1bWVudDo6YXR0YWNoUmFuZ2UoUmFuZ2UqIHJhbmdlKQoreworICAgIEFT
U0VSVCghbV9yYW5nZXMuY29udGFpbnMocmFuZ2UpKTsKKyAgICBtX3Jhbmdlcy5hZGQocmFuZ2Up
OworfQorCit2b2lkIERvY3VtZW50OjpkZXRhY2hSYW5nZShSYW5nZSogcmFuZ2UpCit7CisgICAg
Ly8gV2UgZG9uJ3QgQVNTRVJUIG1fcmFuZ2VzLmNvbnRhaW5zKHJhbmdlKSB0byBhbGxvdyB1cyB0
byBjYWxsIHRoaXMKKyAgICAvLyB1bmNvbmRpdGlvbmFsbHkgdG8gZml4OiBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjYwNDQKKyAgICBtX3Jhbmdlcy5yZW1vdmUocmFu
Z2UpOworfQorCitDYW52YXNSZW5kZXJpbmdDb250ZXh0KiBEb2N1bWVudDo6Z2V0Q1NTQ2FudmFz
Q29udGV4dChjb25zdCBTdHJpbmcmIHR5cGUsIGNvbnN0IFN0cmluZyYgbmFtZSwgaW50IHdpZHRo
LCBpbnQgaGVpZ2h0KQoreworICAgIEhUTUxDYW52YXNFbGVtZW50KiBlbGVtZW50ID0gZ2V0Q1NT
Q2FudmFzRWxlbWVudChuYW1lKTsKKyAgICBpZiAoIWVsZW1lbnQpCisgICAgICAgIHJldHVybiAw
OworICAgIGVsZW1lbnQtPnNldFNpemUoSW50U2l6ZSh3aWR0aCwgaGVpZ2h0KSk7CisgICAgcmV0
dXJuIGVsZW1lbnQtPmdldENvbnRleHQodHlwZSk7Cit9CisKK0hUTUxDYW52YXNFbGVtZW50KiBE
b2N1bWVudDo6Z2V0Q1NTQ2FudmFzRWxlbWVudChjb25zdCBTdHJpbmcmIG5hbWUpCit7CisgICAg
UmVmUHRyPEhUTUxDYW52YXNFbGVtZW50PiYgZWxlbWVudCA9IG1fY3NzQ2FudmFzRWxlbWVudHMu
YWRkKG5hbWUsIDApLml0ZXJhdG9yLT5zZWNvbmQ7CisgICAgaWYgKCFlbGVtZW50KQorICAgICAg
ICBlbGVtZW50ID0gSFRNTENhbnZhc0VsZW1lbnQ6OmNyZWF0ZSh0aGlzKTsKKyAgICByZXR1cm4g
ZWxlbWVudC5nZXQoKTsKK30KKwordm9pZCBEb2N1bWVudDo6aW5pdEROU1ByZWZldGNoKCkKK3sK
KyAgICBTZXR0aW5ncyogc2V0dGluZ3MgPSB0aGlzLT5zZXR0aW5ncygpOworCisgICAgbV9oYXZl
RXhwbGljaXRseURpc2FibGVkRE5TUHJlZmV0Y2ggPSBmYWxzZTsKKyAgICBtX2lzRE5TUHJlZmV0
Y2hFbmFibGVkID0gc2V0dGluZ3MgJiYgc2V0dGluZ3MtPmRuc1ByZWZldGNoaW5nRW5hYmxlZCgp
ICYmIHNlY3VyaXR5T3JpZ2luKCktPnByb3RvY29sKCkgPT0gImh0dHAiOworCisgICAgLy8gSW5o
ZXJpdCBETlMgcHJlZmV0Y2ggb3B0LW91dCBmcm9tIHBhcmVudCBmcmFtZSAgICAKKyAgICBpZiAo
RG9jdW1lbnQqIHBhcmVudCA9IHBhcmVudERvY3VtZW50KCkpIHsKKyAgICAgICAgaWYgKCFwYXJl
bnQtPmlzRE5TUHJlZmV0Y2hFbmFibGVkKCkpCisgICAgICAgICAgICBtX2lzRE5TUHJlZmV0Y2hF
bmFibGVkID0gZmFsc2U7CisgICAgfQorfQorCit2b2lkIERvY3VtZW50OjpwYXJzZUROU1ByZWZl
dGNoQ29udHJvbEhlYWRlcihjb25zdCBTdHJpbmcmIGRuc1ByZWZldGNoQ29udHJvbCkKK3sKKyAg
ICBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoZG5zUHJlZmV0Y2hDb250cm9sLCAib24iKSAmJiAhbV9o
YXZlRXhwbGljaXRseURpc2FibGVkRE5TUHJlZmV0Y2gpIHsKKyAgICAgICAgbV9pc0ROU1ByZWZl
dGNoRW5hYmxlZCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtX2lzRE5T
UHJlZmV0Y2hFbmFibGVkID0gZmFsc2U7CisgICAgbV9oYXZlRXhwbGljaXRseURpc2FibGVkRE5T
UHJlZmV0Y2ggPSB0cnVlOworfQorCit2b2lkIERvY3VtZW50OjphZGRNZXNzYWdlKE1lc3NhZ2VT
b3VyY2Ugc291cmNlLCBNZXNzYWdlVHlwZSB0eXBlLCBNZXNzYWdlTGV2ZWwgbGV2ZWwsIGNvbnN0
IFN0cmluZyYgbWVzc2FnZSwgY29uc3QgU3RyaW5nJiBzb3VyY2VVUkwsIHVuc2lnbmVkIGxpbmVO
dW1iZXIsIFBhc3NSZWZQdHI8U2NyaXB0Q2FsbFN0YWNrPiBjYWxsU3RhY2spCit7CisgICAgaWYg
KCFpc0NvbnRleHRUaHJlYWQoKSkgeworICAgICAgICBwb3N0VGFzayhBZGRDb25zb2xlTWVzc2Fn
ZVRhc2s6OmNyZWF0ZShzb3VyY2UsIHR5cGUsIGxldmVsLCBtZXNzYWdlKSk7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisKKyAgICBpZiAoRE9NV2luZG93KiB3aW5kb3cgPSBkb21XaW5kb3coKSkK
KyAgICAgICAgd2luZG93LT5jb25zb2xlKCktPmFkZE1lc3NhZ2Uoc291cmNlLCB0eXBlLCBsZXZl
bCwgbWVzc2FnZSwgc291cmNlVVJMLCBsaW5lTnVtYmVyLCBjYWxsU3RhY2spOworfQorCitzdHJ1
Y3QgUGVyZm9ybVRhc2tDb250ZXh0IHsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShQZXJmb3Jt
VGFza0NvbnRleHQpOyBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKK3B1YmxpYzoKKyAgICBQZXJm
b3JtVGFza0NvbnRleHQoUGFzc1JlZlB0cjxEb2N1bWVudFdlYWtSZWZlcmVuY2U+IGRvY3VtZW50
UmVmZXJlbmNlLCBQYXNzT3duUHRyPFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQ6OlRhc2s+IHRhc2sp
CisgICAgICAgIDogZG9jdW1lbnRSZWZlcmVuY2UoZG9jdW1lbnRSZWZlcmVuY2UpCisgICAgICAg
ICwgdGFzayh0YXNrKQorICAgIHsKKyAgICB9CisKKyAgICBSZWZQdHI8RG9jdW1lbnRXZWFrUmVm
ZXJlbmNlPiBkb2N1bWVudFJlZmVyZW5jZTsKKyAgICBPd25QdHI8U2NyaXB0RXhlY3V0aW9uQ29u
dGV4dDo6VGFzaz4gdGFzazsKK307CisKK3ZvaWQgRG9jdW1lbnQ6OmRpZFJlY2VpdmVUYXNrKHZv
aWQqIHVudHlwZWRDb250ZXh0KQoreworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisKKyAg
ICBPd25QdHI8UGVyZm9ybVRhc2tDb250ZXh0PiBjb250ZXh0ID0gYWRvcHRQdHIoc3RhdGljX2Nh
c3Q8UGVyZm9ybVRhc2tDb250ZXh0Kj4odW50eXBlZENvbnRleHQpKTsKKyAgICBBU1NFUlQoY29u
dGV4dCk7CisKKyAgICBEb2N1bWVudCogZG9jdW1lbnQgPSBjb250ZXh0LT5kb2N1bWVudFJlZmVy
ZW5jZS0+ZG9jdW1lbnQoKTsKKyAgICBpZiAoIWRvY3VtZW50KQorICAgICAgICByZXR1cm47CisK
KyAgICBQYWdlKiBwYWdlID0gZG9jdW1lbnQtPnBhZ2UoKTsKKyAgICBpZiAoKHBhZ2UgJiYgcGFn
ZS0+ZGVmZXJzTG9hZGluZygpKSB8fCAhZG9jdW1lbnQtPm1fcGVuZGluZ1Rhc2tzLmlzRW1wdHko
KSkgeworICAgICAgICBkb2N1bWVudC0+bV9wZW5kaW5nVGFza3MuYXBwZW5kKGNvbnRleHQtPnRh
c2sucmVsZWFzZSgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnRleHQtPnRh
c2stPnBlcmZvcm1UYXNrKGRvY3VtZW50KTsKK30KKwordm9pZCBEb2N1bWVudDo6cG9zdFRhc2so
UGFzc093blB0cjxUYXNrPiB0YXNrKQoreworICAgIGNhbGxPbk1haW5UaHJlYWQoZGlkUmVjZWl2
ZVRhc2ssIG5ldyBQZXJmb3JtVGFza0NvbnRleHQobV93ZWFrUmVmZXJlbmNlLCB0YXNrKSk7Cit9
CisKK3ZvaWQgRG9jdW1lbnQ6OnBlbmRpbmdUYXNrc1RpbWVyRmlyZWQoVGltZXI8RG9jdW1lbnQ+
KikKK3sKKyAgICB3aGlsZSAoIW1fcGVuZGluZ1Rhc2tzLmlzRW1wdHkoKSkgeworICAgICAgICBP
d25QdHI8VGFzaz4gdGFzayA9IG1fcGVuZGluZ1Rhc2tzWzBdLnJlbGVhc2UoKTsKKyAgICAgICAg
bV9wZW5kaW5nVGFza3MucmVtb3ZlKDApOworICAgICAgICB0YXNrLT5wZXJmb3JtVGFzayh0aGlz
KTsKKyAgICB9Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnN1c3BlbmRTY2hlZHVsZWRUYXNrcyhBY3Rp
dmVET01PYmplY3Q6OlJlYXNvbkZvclN1c3BlbnNpb24gcmVhc29uKQoreworICAgIEFTU0VSVCgh
bV9zY2hlZHVsZWRUYXNrc0FyZVN1c3BlbmRlZCk7CisKKyAgICBzdXNwZW5kU2NyaXB0ZWRBbmlt
YXRpb25Db250cm9sbGVyQ2FsbGJhY2tzKCk7CisgICAgc3VzcGVuZEFjdGl2ZURPTU9iamVjdHMo
cmVhc29uKTsKKyAgICBzY3JpcHRSdW5uZXIoKS0+c3VzcGVuZCgpOworICAgIG1fcGVuZGluZ1Rh
c2tzVGltZXIuc3RvcCgpOworICAgIGlmIChtX3BhcnNlcikKKyAgICAgICAgbV9wYXJzZXItPnN1
c3BlbmRTY2hlZHVsZWRUYXNrcygpOworCisgICAgbV9zY2hlZHVsZWRUYXNrc0FyZVN1c3BlbmRl
ZCA9IHRydWU7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnJlc3VtZVNjaGVkdWxlZFRhc2tzKCkKK3sK
KyAgICBBU1NFUlQobV9zY2hlZHVsZWRUYXNrc0FyZVN1c3BlbmRlZCk7CisKKyAgICBpZiAobV9w
YXJzZXIpCisgICAgICAgIG1fcGFyc2VyLT5yZXN1bWVTY2hlZHVsZWRUYXNrcygpOworICAgIGlm
ICghbV9wZW5kaW5nVGFza3MuaXNFbXB0eSgpKQorICAgICAgICBtX3BlbmRpbmdUYXNrc1RpbWVy
LnN0YXJ0T25lU2hvdCgwKTsKKyAgICBzY3JpcHRSdW5uZXIoKS0+cmVzdW1lKCk7CisgICAgcmVz
dW1lQWN0aXZlRE9NT2JqZWN0cygpOworICAgIHJlc3VtZVNjcmlwdGVkQW5pbWF0aW9uQ29udHJv
bGxlckNhbGxiYWNrcygpOworICAgIAorICAgIG1fc2NoZWR1bGVkVGFza3NBcmVTdXNwZW5kZWQg
PSBmYWxzZTsKK30KKwordm9pZCBEb2N1bWVudDo6c3VzcGVuZFNjcmlwdGVkQW5pbWF0aW9uQ29u
dHJvbGxlckNhbGxiYWNrcygpCit7CisjaWYgRU5BQkxFKFJFUVVFU1RfQU5JTUFUSU9OX0ZSQU1F
KQorICAgIGlmIChtX3NjcmlwdGVkQW5pbWF0aW9uQ29udHJvbGxlcikKKyAgICAgICAgbV9zY3Jp
cHRlZEFuaW1hdGlvbkNvbnRyb2xsZXItPnN1c3BlbmQoKTsKKyNlbmRpZgorfQorCit2b2lkIERv
Y3VtZW50OjpyZXN1bWVTY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXJDYWxsYmFja3MoKQorewor
I2lmIEVOQUJMRShSRVFVRVNUX0FOSU1BVElPTl9GUkFNRSkKKyAgICBpZiAobV9zY3JpcHRlZEFu
aW1hdGlvbkNvbnRyb2xsZXIpCisgICAgICAgIG1fc2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVy
LT5yZXN1bWUoKTsKKyNlbmRpZgorfQorCit2b2lkIERvY3VtZW50Ojp3aW5kb3dTY3JlZW5EaWRD
aGFuZ2UoUGxhdGZvcm1EaXNwbGF5SUQgZGlzcGxheUlEKQoreworI2lmIEVOQUJMRShSRVFVRVNU
X0FOSU1BVElPTl9GUkFNRSkKKyAgICBpZiAobV9zY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXIp
CisgICAgICAgIG1fc2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyLT53aW5kb3dTY3JlZW5EaWRD
aGFuZ2UoZGlzcGxheUlEKTsKKyNlbHNlCisgICAgVU5VU0VEX1BBUkFNKGRpc3BsYXlJRCk7Cisj
ZW5kaWYKK30KKworCitTdHJpbmcgRG9jdW1lbnQ6OmRpc3BsYXlTdHJpbmdNb2RpZmllZEJ5RW5j
b2RpbmcoY29uc3QgU3RyaW5nJiBzdHIpIGNvbnN0Cit7CisgICAgaWYgKG1fZGVjb2RlcikKKyAg
ICAgICAgcmV0dXJuIG1fZGVjb2Rlci0+ZW5jb2RpbmcoKS5kaXNwbGF5U3RyaW5nKHN0ci5pbXBs
KCkpOworICAgIHJldHVybiBzdHI7Cit9CisKK1Bhc3NSZWZQdHI8U3RyaW5nSW1wbD4gRG9jdW1l
bnQ6OmRpc3BsYXlTdHJpbmdNb2RpZmllZEJ5RW5jb2RpbmcoUGFzc1JlZlB0cjxTdHJpbmdJbXBs
PiBzdHIpIGNvbnN0Cit7CisgICAgaWYgKG1fZGVjb2RlcikKKyAgICAgICAgcmV0dXJuIG1fZGVj
b2Rlci0+ZW5jb2RpbmcoKS5kaXNwbGF5U3RyaW5nKHN0cik7CisgICAgcmV0dXJuIHN0cjsKK30K
Kwordm9pZCBEb2N1bWVudDo6ZGlzcGxheUJ1ZmZlck1vZGlmaWVkQnlFbmNvZGluZyhVQ2hhciog
YnVmZmVyLCB1bnNpZ25lZCBsZW4pIGNvbnN0Cit7CisgICAgaWYgKG1fZGVjb2RlcikKKyAgICAg
ICAgbV9kZWNvZGVyLT5lbmNvZGluZygpLmRpc3BsYXlCdWZmZXIoYnVmZmVyLCBsZW4pOworfQor
Cit2b2lkIERvY3VtZW50OjplbnF1ZXVlUGFnZXNob3dFdmVudChQYWdlc2hvd0V2ZW50UGVyc2lz
dGVuY2UgcGVyc2lzdGVkKQoreworICAgIC8vIEZJWE1FOiBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9MzYzMzQgUGFnZXNob3cgZXZlbnQgbmVlZHMgdG8gZmlyZSBhc3lu
Y2hyb25vdXNseS4KKyAgICBkaXNwYXRjaFdpbmRvd0V2ZW50KFBhZ2VUcmFuc2l0aW9uRXZlbnQ6
OmNyZWF0ZShldmVudE5hbWVzKCkucGFnZXNob3dFdmVudCwgcGVyc2lzdGVkKSwgdGhpcyk7Cit9
CisKK3ZvaWQgRG9jdW1lbnQ6OmVucXVldWVIYXNoY2hhbmdlRXZlbnQoY29uc3QgU3RyaW5nJiBv
bGRVUkwsIGNvbnN0IFN0cmluZyYgbmV3VVJMKQoreworICAgIGVucXVldWVXaW5kb3dFdmVudChI
YXNoQ2hhbmdlRXZlbnQ6OmNyZWF0ZShvbGRVUkwsIG5ld1VSTCkpOworfQorCit2b2lkIERvY3Vt
ZW50OjplbnF1ZXVlUG9wc3RhdGVFdmVudChQYXNzUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1
ZT4gc3RhdGVPYmplY3QpCit7CisgICAgLy8gRklYTUU6IGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD0zNjIwMiBQb3BzdGF0ZSBldmVudCBuZWVkcyB0byBmaXJlIGFzeW5j
aHJvbm91c2x5CisgICAgZGlzcGF0Y2hXaW5kb3dFdmVudChQb3BTdGF0ZUV2ZW50OjpjcmVhdGUo
c3RhdGVPYmplY3QsIGRvbVdpbmRvdygpID8gZG9tV2luZG93KCktPmhpc3RvcnkoKSA6IDApKTsK
K30KKwordm9pZCBEb2N1bWVudDo6YWRkTWVkaWFDYW5TdGFydExpc3RlbmVyKE1lZGlhQ2FuU3Rh
cnRMaXN0ZW5lciogbGlzdGVuZXIpCit7CisgICAgQVNTRVJUKCFtX21lZGlhQ2FuU3RhcnRMaXN0
ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKTsKKyAgICBtX21lZGlhQ2FuU3RhcnRMaXN0ZW5lcnMu
YWRkKGxpc3RlbmVyKTsKK30KKwordm9pZCBEb2N1bWVudDo6cmVtb3ZlTWVkaWFDYW5TdGFydExp
c3RlbmVyKE1lZGlhQ2FuU3RhcnRMaXN0ZW5lciogbGlzdGVuZXIpCit7CisgICAgQVNTRVJUKG1f
bWVkaWFDYW5TdGFydExpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpOworICAgIG1fbWVkaWFD
YW5TdGFydExpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworfQorCitNZWRpYUNhblN0YXJ0TGlz
dGVuZXIqIERvY3VtZW50Ojp0YWtlQW55TWVkaWFDYW5TdGFydExpc3RlbmVyKCkKK3sKKyAgICBI
YXNoU2V0PE1lZGlhQ2FuU3RhcnRMaXN0ZW5lcio+OjppdGVyYXRvciBzbG90ID0gbV9tZWRpYUNh
blN0YXJ0TGlzdGVuZXJzLmJlZ2luKCk7CisgICAgaWYgKHNsb3QgPT0gbV9tZWRpYUNhblN0YXJ0
TGlzdGVuZXJzLmVuZCgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBNZWRpYUNhblN0YXJ0TGlz
dGVuZXIqIGxpc3RlbmVyID0gKnNsb3Q7CisgICAgbV9tZWRpYUNhblN0YXJ0TGlzdGVuZXJzLnJl
bW92ZShzbG90KTsKKyAgICByZXR1cm4gbGlzdGVuZXI7Cit9CisKKyNpZiBFTkFCTEUoRlVMTFND
UkVFTl9BUEkpCitib29sIERvY3VtZW50OjpmdWxsU2NyZWVuSXNBbGxvd2VkRm9yRWxlbWVudChF
bGVtZW50KiBlbGVtZW50KSBjb25zdAoreworICAgIEFTU0VSVChlbGVtZW50KTsKKyAgICByZXR1
cm4gaXNBdHRyaWJ1dGVPbkFsbE93bmVycyh3ZWJraXRhbGxvd2Z1bGxzY3JlZW5BdHRyLCBlbGVt
ZW50LT5kb2N1bWVudCgpLT5vd25lckVsZW1lbnQoKSk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnJl
cXVlc3RGdWxsU2NyZWVuRm9yRWxlbWVudChFbGVtZW50KiBlbGVtZW50LCB1bnNpZ25lZCBzaG9y
dCBmbGFncywgRnVsbFNjcmVlbkNoZWNrVHlwZSBjaGVja1R5cGUpCit7CisgICAgLy8gVGhlIE1v
emlsbGEgRnVsbCBTY3JlZW4gQVBJIDxodHRwczovL3dpa2kubW96aWxsYS5vcmcvR2Vja286RnVs
bFNjcmVlbkFQST4gaGFzIGRpZmZlcmVudCByZXF1aXJlbWVudHMKKyAgICAvLyBmb3IgZnVsbCBz
Y3JlZW4gbW9kZSwgYW5kIGRvIG5vdCBoYXZlIHRoZSBjb25jZXB0IG9mIGEgZnVsbCBzY3JlZW4g
ZWxlbWVudCBzdGFjay4KKyAgICBib29sIGluTGVnYWN5TW96aWxsYU1vZGUgPSAoZmxhZ3MgJiBF
bGVtZW50OjpMRUdBQ1lfTU9aSUxMQV9SRVFVRVNUKTsKKworICAgIGRvIHsKKyAgICAgICAgaWYg
KCFlbGVtZW50KQorICAgICAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50RWxlbWVudCgpOworIAor
ICAgICAgICAvLyAxLiBJZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSB0cnVl
LCB0ZXJtaW5hdGUgdGhlc2Ugc3RlcHMgYW5kIHF1ZXVlIGEgdGFzayB0byBmaXJlCisgICAgICAg
IC8vIGFuIGV2ZW50IG5hbWVkIGZ1bGxzY3JlZW5lcnJvciB3aXRoIGl0cyBidWJibGVzIGF0dHJp
YnV0ZSBzZXQgdG8gdHJ1ZSBvbiB0aGUgY29udGV4dCBvYmplY3QncyAKKyAgICAgICAgLy8gbm9k
ZSBkb2N1bWVudDoKKworICAgICAgICAvLyBUaGUgY29udGV4dCBvYmplY3QgaXMgbm90IGluIGEg
ZG9jdW1lbnQuCisgICAgICAgIGlmICghZWxlbWVudC0+aW5Eb2N1bWVudCgpKQorICAgICAgICAg
ICAgYnJlYWs7CisKKyAgICAgICAgLy8gVGhlIGNvbnRleHQgb2JqZWN0J3Mgbm9kZSBkb2N1bWVu
dCwgb3IgYW4gYW5jZXN0b3IgYnJvd3NpbmcgY29udGV4dCdzIGRvY3VtZW50IGRvZXMgbm90IGhh
dmUKKyAgICAgICAgLy8gdGhlIGZ1bGxzY3JlZW4gZW5hYmxlZCBmbGFnIHNldC4KKyAgICAgICAg
aWYgKGNoZWNrVHlwZSA9PSBFbmZvcmNlSUZyYW1lQWxsb3dGdWxsU2NyZWVuUmVxdWlyZW1lbnQg
JiYgIWZ1bGxTY3JlZW5Jc0FsbG93ZWRGb3JFbGVtZW50KGVsZW1lbnQpKQorICAgICAgICAgICAg
YnJlYWs7CisKKyAgICAgICAgLy8gVGhlIGNvbnRleHQgb2JqZWN0J3Mgbm9kZSBkb2N1bWVudCBm
dWxsc2NyZWVuIGVsZW1lbnQgc3RhY2sgaXMgbm90IGVtcHR5IGFuZCBpdHMgdG9wIGVsZW1lbnQK
KyAgICAgICAgLy8gaXMgbm90IGFuIGFuY2VzdG9yIG9mIHRoZSBjb250ZXh0IG9iamVjdC4gKE5P
VEU6IElnbm9yZSB0aGlzIHJlcXVpcmVtZW50IGlmIHRoZSByZXF1ZXN0IHdhcworICAgICAgICAv
LyBtYWRlIHZpYSB0aGUgbGVnYWN5IE1vemlsbGEtc3R5bGUgQVBJLikKKyAgICAgICAgaWYgKCFt
X2Z1bGxTY3JlZW5FbGVtZW50U3RhY2suaXNFbXB0eSgpICYmICFtX2Z1bGxTY3JlZW5FbGVtZW50
U3RhY2suZmlyc3QoKS0+Y29udGFpbnMoZWxlbWVudCkgJiYgIWluTGVnYWN5TW96aWxsYU1vZGUp
CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvLyBBIGRlc2NlbmRhbnQgYnJvd3Npbmcg
Y29udGV4dCdzIGRvY3VtZW50IGhhcyBhIG5vbi1lbXB0eSBmdWxsc2NyZWVuIGVsZW1lbnQgc3Rh
Y2suCisgICAgICAgIGJvb2wgZGVzY2VuZGVudEhhc05vbkVtcHR5U3RhY2sgPSBmYWxzZTsKKyAg
ICAgICAgZm9yIChGcmFtZSogZGVzY2VuZGFudCA9IGZyYW1lKCkgPyBmcmFtZSgpLT50cmVlKCkt
PnRyYXZlcnNlTmV4dCgpIDogMDsgZGVzY2VuZGFudDsgZGVzY2VuZGFudCA9IGRlc2NlbmRhbnQt
PnRyZWUoKS0+dHJhdmVyc2VOZXh0KCkpIHsKKyAgICAgICAgICAgIGlmIChkZXNjZW5kYW50LT5k
b2N1bWVudCgpLT53ZWJraXRGdWxsc2NyZWVuRWxlbWVudCgpKSB7CisgICAgICAgICAgICAgICAg
ZGVzY2VuZGVudEhhc05vbkVtcHR5U3RhY2sgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChkZXNjZW5kZW50SGFzTm9u
RW1wdHlTdGFjayAmJiAhaW5MZWdhY3lNb3ppbGxhTW9kZSkKKyAgICAgICAgICAgIGJyZWFrOwor
CisgICAgICAgIC8vIFRoaXMgYWxnb3JpdGhtIGlzIG5vdCBhbGxvd2VkIHRvIHNob3cgYSBwb3At
dXA6CisgICAgICAgIC8vICAgQW4gYWxnb3JpdGhtIGlzIGFsbG93ZWQgdG8gc2hvdyBhIHBvcC11
cCBpZiwgaW4gdGhlIHRhc2sgaW4gd2hpY2ggdGhlIGFsZ29yaXRobSBpcyBydW5uaW5nLCBlaXRo
ZXI6CisgICAgICAgIC8vICAgLSBhbiBhY3RpdmF0aW9uIGJlaGF2aW9yIGlzIGN1cnJlbnRseSBi
ZWluZyBwcm9jZXNzZWQgd2hvc2UgY2xpY2sgZXZlbnQgd2FzIHRydXN0ZWQsIG9yCisgICAgICAg
IC8vICAgLSB0aGUgZXZlbnQgbGlzdGVuZXIgZm9yIGEgdHJ1c3RlZCBjbGljayBldmVudCBpcyBi
ZWluZyBoYW5kbGVkLgorICAgICAgICBpZiAoIVNjcmlwdENvbnRyb2xsZXI6OnByb2Nlc3NpbmdV
c2VyR2VzdHVyZSgpKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLy8gVGhlcmUgaXMg
YSBwcmV2aW91c2x5LWVzdGFibGlzaGVkIHVzZXIgcHJlZmVyZW5jZSwgc2VjdXJpdHkgcmlzaywg
b3IgcGxhdGZvcm0gbGltaXRhdGlvbi4KKyAgICAgICAgaWYgKCFwYWdlKCkgfHwgIXBhZ2UoKS0+
c2V0dGluZ3MoKS0+ZnVsbFNjcmVlbkVuYWJsZWQoKSkKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAKKyAgICAgICAgaWYgKCFwYWdlKCktPmNocm9tZSgpLT5jbGllbnQoKS0+c3VwcG9ydHNG
dWxsU2NyZWVuRm9yRWxlbWVudChlbGVtZW50LCBmbGFncyAmIEVsZW1lbnQ6OkFMTE9XX0tFWUJP
QVJEX0lOUFVUKSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8vIDIuIExldCBkb2Mg
YmUgZWxlbWVudCdzIG5vZGUgZG9jdW1lbnQuIChpLmUuICJ0aGlzIikKKyAgICAgICAgRG9jdW1l
bnQqIGN1cnJlbnREb2MgPSB0aGlzOworCisgICAgICAgIC8vIDMuIExldCBkb2NzIGJlIGFsbCBk
b2MncyBhbmNlc3RvciBicm93c2luZyBjb250ZXh0J3MgZG9jdW1lbnRzIChpZiBhbnkpIGFuZCBk
b2MuCisgICAgICAgIERlcXVlPERvY3VtZW50Kj4gZG9jczsKKworICAgICAgICBkbyB7CisgICAg
ICAgICAgICBkb2NzLnByZXBlbmQoY3VycmVudERvYyk7CisgICAgICAgICAgICBjdXJyZW50RG9j
ID0gY3VycmVudERvYy0+b3duZXJFbGVtZW50KCkgPyBjdXJyZW50RG9jLT5vd25lckVsZW1lbnQo
KS0+ZG9jdW1lbnQoKSA6IDA7CisgICAgICAgIH0gd2hpbGUgKGN1cnJlbnREb2MpOworCisgICAg
ICAgIC8vIDQuIEZvciBlYWNoIGRvY3VtZW50IGluIGRvY3MsIHJ1biB0aGVzZSBzdWJzdGVwczoK
KyAgICAgICAgRGVxdWU8RG9jdW1lbnQqPjo6aXRlcmF0b3IgY3VycmVudCA9IGRvY3MuYmVnaW4o
KSwgZm9sbG93aW5nID0gZG9jcy5iZWdpbigpOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAg
ICsrZm9sbG93aW5nOworCisgICAgICAgICAgICAvLyAxLiBMZXQgZm9sbG93aW5nIGRvY3VtZW50
IGJlIHRoZSBkb2N1bWVudCBhZnRlciBkb2N1bWVudCBpbiBkb2NzLCBvciBudWxsIGlmIHRoZXJl
IGlzIG5vCisgICAgICAgICAgICAvLyBzdWNoIGRvY3VtZW50LgorICAgICAgICAgICAgRG9jdW1l
bnQqIGN1cnJlbnREb2MgPSAqY3VycmVudDsKKyAgICAgICAgICAgIERvY3VtZW50KiBmb2xsb3dp
bmdEb2MgPSBmb2xsb3dpbmcgIT0gZG9jcy5lbmQoKSA/ICpmb2xsb3dpbmcgOiAwOworCisgICAg
ICAgICAgICAvLyAyLiBJZiBmb2xsb3dpbmcgZG9jdW1lbnQgaXMgbnVsbCwgcHVzaCBjb250ZXh0
IG9iamVjdCBvbiBkb2N1bWVudCdzIGZ1bGxzY3JlZW4gZWxlbWVudAorICAgICAgICAgICAgLy8g
c3RhY2ssIGFuZCBxdWV1ZSBhIHRhc2sgdG8gZmlyZSBhbiBldmVudCBuYW1lZCBmdWxsc2NyZWVu
Y2hhbmdlIHdpdGggaXRzIGJ1YmJsZXMgYXR0cmlidXRlCisgICAgICAgICAgICAvLyBzZXQgdG8g
dHJ1ZSBvbiB0aGUgZG9jdW1lbnQuCisgICAgICAgICAgICBpZiAoIWZvbGxvd2luZ0RvYykgewor
ICAgICAgICAgICAgICAgIGN1cnJlbnREb2MtPnB1c2hGdWxsc2NyZWVuRWxlbWVudFN0YWNrKGVs
ZW1lbnQpOworICAgICAgICAgICAgICAgIGFkZERvY3VtZW50VG9GdWxsU2NyZWVuQ2hhbmdlRXZl
bnRRdWV1ZShjdXJyZW50RG9jKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgLy8gMy4gT3RoZXJ3aXNlLCBpZiBkb2N1bWVudCdzIGZ1bGxz
Y3JlZW4gZWxlbWVudCBzdGFjayBpcyBlaXRoZXIgZW1wdHkgb3IgaXRzIHRvcCBlbGVtZW50Cisg
ICAgICAgICAgICAvLyBpcyBub3QgZm9sbG93aW5nIGRvY3VtZW50J3MgYnJvd3NpbmcgY29udGV4
dCBjb250YWluZXIsCisgICAgICAgICAgICBFbGVtZW50KiB0b3BFbGVtZW50ID0gY3VycmVudERv
Yy0+d2Via2l0RnVsbHNjcmVlbkVsZW1lbnQoKTsKKyAgICAgICAgICAgIGlmICghdG9wRWxlbWVu
dCB8fCB0b3BFbGVtZW50ICE9IGZvbGxvd2luZ0RvYy0+b3duZXJFbGVtZW50KCkpIHsKKyAgICAg
ICAgICAgICAgICAvLyAuLi5wdXNoIGZvbGxvd2luZyBkb2N1bWVudCdzIGJyb3dzaW5nIGNvbnRl
eHQgY29udGFpbmVyIG9uIGRvY3VtZW50J3MgZnVsbHNjcmVlbiBlbGVtZW50CisgICAgICAgICAg
ICAgICAgLy8gc3RhY2ssIGFuZCBxdWV1ZSBhIHRhc2sgdG8gZmlyZSBhbiBldmVudCBuYW1lZCBm
dWxsc2NyZWVuY2hhbmdlIHdpdGggaXRzIGJ1YmJsZXMgYXR0cmlidXRlCisgICAgICAgICAgICAg
ICAgLy8gc2V0IHRvIHRydWUgb24gZG9jdW1lbnQuCisgICAgICAgICAgICAgICAgY3VycmVudERv
Yy0+cHVzaEZ1bGxzY3JlZW5FbGVtZW50U3RhY2soZm9sbG93aW5nRG9jLT5vd25lckVsZW1lbnQo
KSk7CisgICAgICAgICAgICAgICAgYWRkRG9jdW1lbnRUb0Z1bGxTY3JlZW5DaGFuZ2VFdmVudFF1
ZXVlKGN1cnJlbnREb2MpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAg
fQorCisgICAgICAgICAgICAvLyA0LiBPdGhlcndpc2UsIGRvIG5vdGhpbmcgZm9yIHRoaXMgZG9j
dW1lbnQuIEl0IHN0YXlzIHRoZSBzYW1lLgorICAgICAgICB9IHdoaWxlICgrK2N1cnJlbnQgIT0g
ZG9jcy5lbmQoKSk7CisKKyAgICAgICAgLy8gNS4gUmV0dXJuLCBhbmQgcnVuIHRoZSByZW1haW5p
bmcgc3RlcHMgYXN5bmNocm9ub3VzbHkuCisgICAgICAgIC8vIDYuIE9wdGlvbmFsbHksIHBlcmZv
cm0gc29tZSBhbmltYXRpb24uCisgICAgICAgIG1fYXJlS2V5c0VuYWJsZWRJbkZ1bGxTY3JlZW4g
PSBmbGFncyAmIEVsZW1lbnQ6OkFMTE9XX0tFWUJPQVJEX0lOUFVUOworICAgICAgICBwYWdlKCkt
PmNocm9tZSgpLT5jbGllbnQoKS0+ZW50ZXJGdWxsU2NyZWVuRm9yRWxlbWVudChlbGVtZW50KTsK
KworICAgICAgICAvLyA3LiBPcHRpb25hbGx5LCBkaXNwbGF5IGEgbWVzc2FnZSBpbmRpY2F0aW5n
IGhvdyB0aGUgdXNlciBjYW4gZXhpdCBkaXNwbGF5aW5nIHRoZSBjb250ZXh0IG9iamVjdCBmdWxs
c2NyZWVuLgorICAgICAgICByZXR1cm47CisgICAgfSB3aGlsZSAoMCk7CisKKyAgICBtX2Z1bGxT
Y3JlZW5FcnJvckV2ZW50VGFyZ2V0UXVldWUuYXBwZW5kKGVsZW1lbnQgPyBlbGVtZW50IDogZG9j
dW1lbnRFbGVtZW50KCkpOworICAgIG1fZnVsbFNjcmVlbkNoYW5nZURlbGF5VGltZXIuc3RhcnRP
bmVTaG90KDApOworfQorCit2b2lkIERvY3VtZW50Ojp3ZWJraXRDYW5jZWxGdWxsU2NyZWVuKCkK
K3sKKyAgICAvLyBUaGUgTW96aWxsYSAiY2FuY2VsRnVsbFNjcmVlbigpIiBBUEkgYmVoYXZlcyBs
aWtlIHRoZSBXM0MgImZ1bGx5IGV4aXQgZnVsbHNjcmVlbiIgYmVoYXZpb3IsIHdoaWNoCisgICAg
Ly8gaXMgZGVmaW5lZCBhczogCisgICAgLy8gIlRvIGZ1bGx5IGV4aXQgZnVsbHNjcmVlbiBhY3Qg
YXMgaWYgdGhlIGV4aXRGdWxsc2NyZWVuKCkgbWV0aG9kIHdhcyBpbnZva2VkIG9uIHRoZSB0b3At
bGV2ZWwgYnJvd3NpbmcKKyAgICAvLyBjb250ZXh0J3MgZG9jdW1lbnQgYW5kIHN1YnNlcXVlbnRs
eSBlbXB0eSB0aGF0IGRvY3VtZW50J3MgZnVsbHNjcmVlbiBlbGVtZW50IHN0YWNrLiIKKyAgICBp
ZiAoIXRvcERvY3VtZW50KCktPndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50KCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIC8vIFRvIGFjaGlldmUgdGhhdCBhaW0sIHJlbW92ZSBhbGwgdGhlIGVsZW1l
bnRzIGZyb20gdGhlIHRvcCBkb2N1bWVudCdzIHN0YWNrIGV4Y2VwdCBmb3IgdGhlIGZpcnN0IGJl
Zm9yZQorICAgIC8vIGNhbGxpbmcgd2Via2l0RXhpdEZ1bGxzY3JlZW4oKToKKyAgICBEZXF1ZTxS
ZWZQdHI8RWxlbWVudD4gPiByZXBsYWNlbWVudEZ1bGxzY3JlZW5FbGVtZW50U3RhY2s7CisgICAg
cmVwbGFjZW1lbnRGdWxsc2NyZWVuRWxlbWVudFN0YWNrLnByZXBlbmQodG9wRG9jdW1lbnQoKS0+
d2Via2l0RnVsbHNjcmVlbkVsZW1lbnQoKSk7CisgICAgdG9wRG9jdW1lbnQoKS0+bV9mdWxsU2Ny
ZWVuRWxlbWVudFN0YWNrLnN3YXAocmVwbGFjZW1lbnRGdWxsc2NyZWVuRWxlbWVudFN0YWNrKTsK
KworICAgIHRvcERvY3VtZW50KCktPndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7Cit9CisKK3ZvaWQg
RG9jdW1lbnQ6OndlYmtpdEV4aXRGdWxsc2NyZWVuKCkKK3sKKyAgICAvLyBUaGUgZXhpdEZ1bGxz
Y3JlZW4oKSBtZXRob2QgbXVzdCBydW4gdGhlc2Ugc3RlcHM6CisgICAgCisgICAgLy8gMS4gTGV0
IGRvYyBiZSB0aGUgY29udGV4dCBvYmplY3QuIChpLmUuICJ0aGlzIikKKyAgICBEb2N1bWVudCog
Y3VycmVudERvYyA9IHRoaXM7CisKKyAgICAvLyAyLiBJZiBkb2MncyBmdWxsc2NyZWVuIGVsZW1l
bnQgc3RhY2sgaXMgZW1wdHksIHRlcm1pbmF0ZSB0aGVzZSBzdGVwcy4KKyAgICBpZiAobV9mdWxs
U2NyZWVuRWxlbWVudFN0YWNrLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworICAgIAorICAg
IC8vIDMuIExldCBkZXNjZW5kYW50cyBiZSBhbGwgdGhlIGRvYydzIGRlc2NlbmRhbnQgYnJvd3Np
bmcgY29udGV4dCdzIGRvY3VtZW50cyB3aXRoIGEgbm9uLWVtcHR5IGZ1bGxzY3JlZW4KKyAgICAv
LyBlbGVtZW50IHN0YWNrIChpZiBhbnkpLCBvcmRlcmVkIHNvIHRoYXQgdGhlIGNoaWxkIG9mIHRo
ZSBkb2MgaXMgbGFzdCBhbmQgdGhlIGRvY3VtZW50IGZ1cnRoZXN0CisgICAgLy8gYXdheSBmcm9t
IHRoZSBkb2MgaXMgZmlyc3QuCisgICAgRGVxdWU8UmVmUHRyPERvY3VtZW50PiA+IGRlc2NlbmRh
bnRzOworICAgIGZvciAoRnJhbWUqIGRlc2NlbmRhbnQgPSBmcmFtZSgpID8gZnJhbWUoKS0+dHJl
ZSgpLT50cmF2ZXJzZU5leHQoKSA6IDA7IGRlc2NlbmRhbnQ7IGRlc2NlbmRhbnQgPSBkZXNjZW5k
YW50LT50cmVlKCktPnRyYXZlcnNlTmV4dCgpKSB7CisgICAgICAgIGlmIChkZXNjZW5kYW50LT5k
b2N1bWVudCgpLT53ZWJraXRGdWxsc2NyZWVuRWxlbWVudCgpKQorICAgICAgICAgICAgZGVzY2Vu
ZGFudHMucHJlcGVuZChkZXNjZW5kYW50LT5kb2N1bWVudCgpKTsKKyAgICB9CisgICAgICAgIAor
ICAgIC8vIDQuIEZvciBlYWNoIGRlc2NlbmRhbnQgaW4gZGVzY2VuZGFudHMsIGVtcHR5IGRlc2Nl
bmRhbnQncyBmdWxsc2NyZWVuIGVsZW1lbnQgc3RhY2ssIGFuZCBxdWV1ZSBhCisgICAgLy8gdGFz
ayB0byBmaXJlIGFuIGV2ZW50IG5hbWVkIGZ1bGxzY3JlZW5jaGFuZ2Ugd2l0aCBpdHMgYnViYmxl
cyBhdHRyaWJ1dGUgc2V0IHRvIHRydWUgb24gZGVzY2VuZGFudC4KKyAgICBmb3IgKERlcXVlPFJl
ZlB0cjxEb2N1bWVudD4gPjo6aXRlcmF0b3IgaSA9IGRlc2NlbmRhbnRzLmJlZ2luKCk7IGkgIT0g
ZGVzY2VuZGFudHMuZW5kKCk7ICsraSkgeworICAgICAgICAoKmkpLT5jbGVhckZ1bGxzY3JlZW5F
bGVtZW50U3RhY2soKTsKKyAgICAgICAgYWRkRG9jdW1lbnRUb0Z1bGxTY3JlZW5DaGFuZ2VFdmVu
dFF1ZXVlKGktPmdldCgpKTsKKyAgICB9CisKKyAgICAvLyA1LiBXaGlsZSBkb2MgaXMgbm90IG51
bGwsIHJ1biB0aGVzZSBzdWJzdGVwczoKKyAgICBFbGVtZW50KiBuZXdUb3AgPSAwOworICAgIHdo
aWxlIChjdXJyZW50RG9jKSB7CisgICAgICAgIC8vIDEuIFBvcCB0aGUgdG9wIGVsZW1lbnQgb2Yg
ZG9jJ3MgZnVsbHNjcmVlbiBlbGVtZW50IHN0YWNrLgorICAgICAgICBjdXJyZW50RG9jLT5wb3BG
dWxsc2NyZWVuRWxlbWVudFN0YWNrKCk7CisKKyAgICAgICAgLy8gICAgSWYgZG9jJ3MgZnVsbHNj
cmVlbiBlbGVtZW50IHN0YWNrIGlzIG5vbi1lbXB0eSBhbmQgdGhlIGVsZW1lbnQgbm93IGF0IHRo
ZSB0b3AgaXMgZWl0aGVyCisgICAgICAgIC8vICAgIG5vdCBpbiBhIGRvY3VtZW50IG9yIGl0cyBu
b2RlIGRvY3VtZW50IGlzIG5vdCBkb2MsIHJlcGVhdCB0aGlzIHN1YnN0ZXAuCisgICAgICAgIG5l
d1RvcCA9IGN1cnJlbnREb2MtPndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50KCk7CisgICAgICAgIGlm
IChuZXdUb3AgJiYgKCFuZXdUb3AtPmluRG9jdW1lbnQoKSB8fCBuZXdUb3AtPmRvY3VtZW50KCkg
IT0gY3VycmVudERvYykpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAvLyAyLiBR
dWV1ZSBhIHRhc2sgdG8gZmlyZSBhbiBldmVudCBuYW1lZCBmdWxsc2NyZWVuY2hhbmdlIHdpdGgg
aXRzIGJ1YmJsZXMgYXR0cmlidXRlIHNldCB0byB0cnVlCisgICAgICAgIC8vIG9uIGRvYy4KKyAg
ICAgICAgYWRkRG9jdW1lbnRUb0Z1bGxTY3JlZW5DaGFuZ2VFdmVudFF1ZXVlKGN1cnJlbnREb2Mp
OworCisgICAgICAgIC8vIDMuIElmIGRvYydzIGZ1bGxzY3JlZW4gZWxlbWVudCBzdGFjayBpcyBl
bXB0eSBhbmQgZG9jJ3MgYnJvd3NpbmcgY29udGV4dCBoYXMgYSBicm93c2luZyBjb250ZXh0Cisg
ICAgICAgIC8vIGNvbnRhaW5lciwgc2V0IGRvYyB0byB0aGF0IGJyb3dzaW5nIGNvbnRleHQgY29u
dGFpbmVyJ3Mgbm9kZSBkb2N1bWVudC4KKyAgICAgICAgaWYgKCFuZXdUb3AgJiYgY3VycmVudERv
Yy0+b3duZXJFbGVtZW50KCkpIHsKKyAgICAgICAgICAgIGN1cnJlbnREb2MgPSBjdXJyZW50RG9j
LT5vd25lckVsZW1lbnQoKS0+ZG9jdW1lbnQoKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAg
ICAgICB9CisKKyAgICAgICAgLy8gNC4gT3RoZXJ3aXNlLCBzZXQgZG9jIHRvIG51bGwuCisgICAg
ICAgIGN1cnJlbnREb2MgPSAwOworICAgIH0KKworICAgIC8vIDYuIFJldHVybiwgYW5kIHJ1biB0
aGUgcmVtYWluaW5nIHN0ZXBzIGFzeW5jaHJvbm91c2x5LgorICAgIC8vIDcuIE9wdGlvbmFsbHks
IHBlcmZvcm0gc29tZSBhbmltYXRpb24uCisKKyAgICAvLyBPbmx5IGV4aXQgb3V0IG9mIGZ1bGwg
c2NyZWVuIHdpbmRvdyBtb2RlIGlmIHRoZXJlIGFyZSBubyByZW1haW5pbmcgZWxlbWVudHMgaW4g
dGhlIAorICAgIC8vIGZ1bGwgc2NyZWVuIHN0YWNrLgorICAgIGlmICghbmV3VG9wKSB7CisgICAg
ICAgIHBhZ2UoKS0+Y2hyb21lKCktPmNsaWVudCgpLT5leGl0RnVsbFNjcmVlbkZvckVsZW1lbnQo
bV9mdWxsU2NyZWVuRWxlbWVudC5nZXQoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAg
ICAvLyBPdGhlcndpc2UsIG5vdGlmeSB0aGUgY2hyb21lIG9mIHRoZSBuZXcgZnVsbCBzY3JlZW4g
ZWxlbWVudC4KKyAgICBwYWdlKCktPmNocm9tZSgpLT5jbGllbnQoKS0+ZW50ZXJGdWxsU2NyZWVu
Rm9yRWxlbWVudChuZXdUb3ApOyAgICAgIAorfQorCitib29sIERvY3VtZW50Ojp3ZWJraXRGdWxs
c2NyZWVuRW5hYmxlZCgpIGNvbnN0Cit7CisgICAgLy8gNC4gVGhlIGZ1bGxzY3JlZW5FbmFibGVk
IGF0dHJpYnV0ZSBtdXN0IHJldHVybiB0cnVlIGlmIHRoZSBjb250ZXh0IG9iamVjdCBhbmQgYWxs
IGFuY2VzdG9yCisgICAgLy8gYnJvd3NpbmcgY29udGV4dCdzIGRvY3VtZW50cyBoYXZlIHRoZWly
IGZ1bGxzY3JlZW4gZW5hYmxlZCBmbGFnIHNldCwgb3IgZmFsc2Ugb3RoZXJ3aXNlLgorCisgICAg
Ly8gVG9wLWxldmVsIGJyb3dzaW5nIGNvbnRleHRzIGFyZSBpbXBsaWVkIHRvIGhhdmUgdGhlaXIg
YWxsb3dGdWxsU2NyZWVuIGF0dHJpYnV0ZSBzZXQuCisgICAgcmV0dXJuIGlzQXR0cmlidXRlT25B
bGxPd25lcnMod2Via2l0YWxsb3dmdWxsc2NyZWVuQXR0ciwgb3duZXJFbGVtZW50KCkpOworfQor
Cit2b2lkIERvY3VtZW50Ojp3ZWJraXRXaWxsRW50ZXJGdWxsU2NyZWVuRm9yRWxlbWVudChFbGVt
ZW50KiBlbGVtZW50KQoreworICAgIGlmICghYXR0YWNoZWQoKSB8fCBpblBhZ2VDYWNoZSgpKQor
ICAgICAgICByZXR1cm47CisKKyAgICBBU1NFUlQoZWxlbWVudCk7CisKKyAgICAvLyBQcm90ZWN0
IGFnYWluc3QgYmVpbmcgY2FsbGVkIGFmdGVyIHRoZSBkb2N1bWVudCBoYXMgYmVlbiByZW1vdmVk
IGZyb20gdGhlIHBhZ2UuCisgICAgaWYgKCFwYWdlKCkpCisgICAgICAgIHJldHVybjsKKworICAg
IEFTU0VSVChwYWdlKCktPnNldHRpbmdzKCktPmZ1bGxTY3JlZW5FbmFibGVkKCkpOworCisgICAg
aWYgKG1fZnVsbFNjcmVlblJlbmRlcmVyKQorICAgICAgICBtX2Z1bGxTY3JlZW5SZW5kZXJlci0+
dW53cmFwUmVuZGVyZXIoKTsKKworICAgIG1fZnVsbFNjcmVlbkVsZW1lbnQgPSBlbGVtZW50Owor
CisjaWYgVVNFKE5BVElWRV9GVUxMU0NSRUVOX1ZJREVPKQorICAgIGlmIChlbGVtZW50ICYmIGVs
ZW1lbnQtPmlzTWVkaWFFbGVtZW50KCkpCisgICAgICAgIHJldHVybjsKKyNlbmRpZgorCisgICAg
Ly8gQ3JlYXRlIGEgcGxhY2Vob2xkZXIgYmxvY2sgZm9yIGEgdGhlIGZ1bGwtc2NyZWVuIGVsZW1l
bnQsIHRvIGtlZXAgdGhlIHBhZ2UgZnJvbSByZWZsb3dpbmcKKyAgICAvLyB3aGVuIHRoZSBlbGVt
ZW50IGlzIHJlbW92ZWQgZnJvbSB0aGUgbm9ybWFsIGZsb3cuICBPbmx5IGRvIHRoaXMgZm9yIGEg
UmVuZGVyQm94LCBhcyBvbmx5IAorICAgIC8vIGEgYm94IHdpbGwgaGF2ZSBhIGZyYW1lUmVjdC4g
IFRoZSBwbGFjZWhvbGRlciB3aWxsIGJlIGNyZWF0ZWQgaW4gc2V0RnVsbFNjcmVlblJlbmRlcmVy
KCkKKyAgICAvLyBkdXJpbmcgbGF5b3V0LgorICAgIFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSBt
X2Z1bGxTY3JlZW5FbGVtZW50LT5yZW5kZXJlcigpOworICAgIGJvb2wgc2hvdWxkQ3JlYXRlUGxh
Y2Vob2xkZXIgPSByZW5kZXJlciAmJiByZW5kZXJlci0+aXNCb3goKTsKKyAgICBpZiAoc2hvdWxk
Q3JlYXRlUGxhY2Vob2xkZXIpIHsKKyAgICAgICAgbV9zYXZlZFBsYWNlaG9sZGVyRnJhbWVSZWN0
ID0gdG9SZW5kZXJCb3gocmVuZGVyZXIpLT5mcmFtZVJlY3QoKTsKKyAgICAgICAgbV9zYXZlZFBs
YWNlaG9sZGVyUmVuZGVyU3R5bGUgPSBSZW5kZXJTdHlsZTo6Y2xvbmUocmVuZGVyZXItPnN0eWxl
KCkpOworICAgIH0KKworICAgIGlmIChtX2Z1bGxTY3JlZW5FbGVtZW50ICE9IGRvY3VtZW50RWxl
bWVudCgpKQorICAgICAgICBSZW5kZXJGdWxsU2NyZWVuOjp3cmFwUmVuZGVyZXIocmVuZGVyZXIs
IHJlbmRlcmVyID8gcmVuZGVyZXItPnBhcmVudCgpIDogMCwgdGhpcyk7CisKKyAgICBtX2Z1bGxT
Y3JlZW5FbGVtZW50LT5zZXRDb250YWluc0Z1bGxTY3JlZW5FbGVtZW50T25BbmNlc3RvcnNDcm9z
c2luZ0ZyYW1lQm91bmRhcmllcyh0cnVlKTsKKyAgICAKKyAgICByZWNhbGNTdHlsZShGb3JjZSk7
Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OndlYmtpdERpZEVudGVyRnVsbFNjcmVlbkZvckVsZW1lbnQo
RWxlbWVudCopCit7CisgICAgaWYgKCFtX2Z1bGxTY3JlZW5FbGVtZW50KQorICAgICAgICByZXR1
cm47CisKKyAgICBpZiAoIWF0dGFjaGVkKCkgfHwgaW5QYWdlQ2FjaGUoKSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgbV9mdWxsU2NyZWVuRWxlbWVudC0+ZGlkQmVjb21lRnVsbHNjcmVlbkVsZW1l
bnQoKTsKKworICAgIG1fZnVsbFNjcmVlbkNoYW5nZURlbGF5VGltZXIuc3RhcnRPbmVTaG90KDAp
OworfQorCit2b2lkIERvY3VtZW50Ojp3ZWJraXRXaWxsRXhpdEZ1bGxTY3JlZW5Gb3JFbGVtZW50
KEVsZW1lbnQqKQoreworICAgIGlmICghbV9mdWxsU2NyZWVuRWxlbWVudCkKKyAgICAgICAgcmV0
dXJuOworCisgICAgaWYgKCFhdHRhY2hlZCgpIHx8IGluUGFnZUNhY2hlKCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIG1fZnVsbFNjcmVlbkVsZW1lbnQtPndpbGxTdG9wQmVpbmdGdWxsc2NyZWVu
RWxlbWVudCgpOworfQorCit2b2lkIERvY3VtZW50Ojp3ZWJraXREaWRFeGl0RnVsbFNjcmVlbkZv
ckVsZW1lbnQoRWxlbWVudCopCit7CisgICAgaWYgKCFtX2Z1bGxTY3JlZW5FbGVtZW50KQorICAg
ICAgICByZXR1cm47CisKKyAgICBpZiAoIWF0dGFjaGVkKCkgfHwgaW5QYWdlQ2FjaGUoKSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgbV9mdWxsU2NyZWVuRWxlbWVudC0+c2V0Q29udGFpbnNGdWxs
U2NyZWVuRWxlbWVudE9uQW5jZXN0b3JzQ3Jvc3NpbmdGcmFtZUJvdW5kYXJpZXMoZmFsc2UpOwor
CisgICAgbV9hcmVLZXlzRW5hYmxlZEluRnVsbFNjcmVlbiA9IGZhbHNlOworICAgIAorICAgIGlm
IChtX2Z1bGxTY3JlZW5SZW5kZXJlcikKKyAgICAgICAgbV9mdWxsU2NyZWVuUmVuZGVyZXItPnVu
d3JhcFJlbmRlcmVyKCk7CisKKyAgICBtX2Z1bGxTY3JlZW5FbGVtZW50ID0gMDsKKyAgICBzY2hl
ZHVsZUZvcmNlZFN0eWxlUmVjYWxjKCk7CisgICAgCisgICAgLy8gV2hlbiB3ZWJraXRDYW5jZWxG
dWxsU2NyZWVuIGlzIGNhbGxlZCwgd2UgY2FsbCB3ZWJraXRFeGl0RnVsbFNjcmVlbiBvbiB0aGUg
dG9wRG9jdW1lbnQoKS4gVGhhdAorICAgIC8vIG1lYW5zIHRoYXQgdGhlIGV2ZW50cyB3aWxsIGJl
IHF1ZXVlZCB0aGVyZS4gU28gaWYgd2UgaGF2ZSBubyBldmVudHMgaGVyZSwgc3RhcnQgdGhlIHRp
bWVyIG9uCisgICAgLy8gdGhlIGV4aXRpbmcgZG9jdW1lbnQuCisgICAgRG9jdW1lbnQqIGV4aXRp
bmdEb2N1bWVudCA9IHRoaXM7CisgICAgaWYgKG1fZnVsbFNjcmVlbkNoYW5nZUV2ZW50VGFyZ2V0
UXVldWUuaXNFbXB0eSgpICYmIG1fZnVsbFNjcmVlbkVycm9yRXZlbnRUYXJnZXRRdWV1ZS5pc0Vt
cHR5KCkpCisgICAgICAgIGV4aXRpbmdEb2N1bWVudCA9IHRvcERvY3VtZW50KCk7CisgICAgZXhp
dGluZ0RvY3VtZW50LT5tX2Z1bGxTY3JlZW5DaGFuZ2VEZWxheVRpbWVyLnN0YXJ0T25lU2hvdCgw
KTsKK30KKyAgICAKK3ZvaWQgRG9jdW1lbnQ6OnNldEZ1bGxTY3JlZW5SZW5kZXJlcihSZW5kZXJG
dWxsU2NyZWVuKiByZW5kZXJlcikKK3sKKyAgICBpZiAocmVuZGVyZXIgPT0gbV9mdWxsU2NyZWVu
UmVuZGVyZXIpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChyZW5kZXJlciAmJiBtX3NhdmVk
UGxhY2Vob2xkZXJSZW5kZXJTdHlsZSkgCisgICAgICAgIHJlbmRlcmVyLT5jcmVhdGVQbGFjZWhv
bGRlcihtX3NhdmVkUGxhY2Vob2xkZXJSZW5kZXJTdHlsZS5yZWxlYXNlKCksIG1fc2F2ZWRQbGFj
ZWhvbGRlckZyYW1lUmVjdCk7CisgICAgZWxzZSBpZiAocmVuZGVyZXIgJiYgbV9mdWxsU2NyZWVu
UmVuZGVyZXIgJiYgbV9mdWxsU2NyZWVuUmVuZGVyZXItPnBsYWNlaG9sZGVyKCkpIHsKKyAgICAg
ICAgUmVuZGVyQmxvY2sqIHBsYWNlaG9sZGVyID0gbV9mdWxsU2NyZWVuUmVuZGVyZXItPnBsYWNl
aG9sZGVyKCk7CisgICAgICAgIHJlbmRlcmVyLT5jcmVhdGVQbGFjZWhvbGRlcihSZW5kZXJTdHls
ZTo6Y2xvbmUocGxhY2Vob2xkZXItPnN0eWxlKCkpLCBwbGFjZWhvbGRlci0+ZnJhbWVSZWN0KCkp
OworICAgIH0KKworICAgIGlmIChtX2Z1bGxTY3JlZW5SZW5kZXJlcikKKyAgICAgICAgbV9mdWxs
U2NyZWVuUmVuZGVyZXItPmRlc3Ryb3koKTsKKyAgICBBU1NFUlQoIW1fZnVsbFNjcmVlblJlbmRl
cmVyKTsKKworICAgIG1fZnVsbFNjcmVlblJlbmRlcmVyID0gcmVuZGVyZXI7CisgICAgCisgICAg
Ly8gVGhpcyBub3RpZmljYXRpb24gY2FuIGNvbWUgaW4gYWZ0ZXIgdGhlIHBhZ2UgaGFzIGJlZW4g
ZGVzdHJveWVkLgorICAgIGlmIChwYWdlKCkpCisgICAgICAgIHBhZ2UoKS0+Y2hyb21lKCktPmNs
aWVudCgpLT5mdWxsU2NyZWVuUmVuZGVyZXJDaGFuZ2VkKG1fZnVsbFNjcmVlblJlbmRlcmVyKTsK
K30KKwordm9pZCBEb2N1bWVudDo6ZnVsbFNjcmVlblJlbmRlcmVyRGVzdHJveWVkKCkKK3sKKyAg
ICBtX2Z1bGxTY3JlZW5SZW5kZXJlciA9IDA7CisKKyAgICBpZiAocGFnZSgpKQorICAgICAgICBw
YWdlKCktPmNocm9tZSgpLT5jbGllbnQoKS0+ZnVsbFNjcmVlblJlbmRlcmVyQ2hhbmdlZCgwKTsK
K30KKwordm9pZCBEb2N1bWVudDo6c2V0RnVsbFNjcmVlblJlbmRlcmVyU2l6ZShjb25zdCBJbnRT
aXplJiBzaXplKQoreworICAgIEFTU0VSVChtX2Z1bGxTY3JlZW5SZW5kZXJlcik7CisgICAgaWYg
KCFtX2Z1bGxTY3JlZW5SZW5kZXJlcikKKyAgICAgICAgcmV0dXJuOworICAgIAorICAgIGlmICht
X2Z1bGxTY3JlZW5SZW5kZXJlcikgeworICAgICAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IG5ld1N0
eWxlID0gUmVuZGVyU3R5bGU6OmNsb25lKG1fZnVsbFNjcmVlblJlbmRlcmVyLT5zdHlsZSgpKTsK
KyAgICAgICAgbmV3U3R5bGUtPnNldFdpZHRoKExlbmd0aChzaXplLndpZHRoKCksIFdlYkNvcmU6
OkZpeGVkKSk7CisgICAgICAgIG5ld1N0eWxlLT5zZXRIZWlnaHQoTGVuZ3RoKHNpemUuaGVpZ2h0
KCksIFdlYkNvcmU6OkZpeGVkKSk7CisgICAgICAgIG5ld1N0eWxlLT5zZXRUb3AoTGVuZ3RoKDAs
IFdlYkNvcmU6OkZpeGVkKSk7CisgICAgICAgIG5ld1N0eWxlLT5zZXRMZWZ0KExlbmd0aCgwLCBX
ZWJDb3JlOjpGaXhlZCkpOworICAgICAgICBtX2Z1bGxTY3JlZW5SZW5kZXJlci0+c2V0U3R5bGUo
bmV3U3R5bGUpOworICAgICAgICB1cGRhdGVMYXlvdXQoKTsKKyAgICB9Cit9CisgICAgCit2b2lk
IERvY3VtZW50OjpzZXRGdWxsU2NyZWVuUmVuZGVyZXJCYWNrZ3JvdW5kQ29sb3IoQ29sb3IgYmFj
a2dyb3VuZENvbG9yKQoreworICAgIGlmICghbV9mdWxsU2NyZWVuUmVuZGVyZXIpCisgICAgICAg
IHJldHVybjsKKyAgICAKKyAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IG5ld1N0eWxlID0gUmVuZGVy
U3R5bGU6OmNsb25lKG1fZnVsbFNjcmVlblJlbmRlcmVyLT5zdHlsZSgpKTsKKyAgICBuZXdTdHls
ZS0+c2V0QmFja2dyb3VuZENvbG9yKGJhY2tncm91bmRDb2xvcik7CisgICAgbV9mdWxsU2NyZWVu
UmVuZGVyZXItPnNldFN0eWxlKG5ld1N0eWxlKTsKK30KKyAgICAKK3ZvaWQgRG9jdW1lbnQ6OmZ1
bGxTY3JlZW5DaGFuZ2VEZWxheVRpbWVyRmlyZWQoVGltZXI8RG9jdW1lbnQ+KikKK3sKKyAgICAv
LyBTaW5jZSB3ZSBkaXNwYXRjaCBldmVudHMgaW4gdGhpcyBmdW5jdGlvbiwgaXQncyBwb3NzaWJs
ZSB0aGF0IHRoZQorICAgIC8vIGRvY3VtZW50IHdpbGwgYmUgZGV0YWNoZWQgYW5kIEdDJ2QuIFdl
IHByb3RlY3QgaXQgaGVyZSB0byBtYWtlIHN1cmUgd2UKKyAgICAvLyBjYW4gZmluaXNoIHRoZSBm
dW5jdGlvbiBzdWNjZXNzZnVsbHkuCisgICAgUmVmUHRyPERvY3VtZW50PiBwcm90ZWN0RG9jdW1l
bnQodGhpcyk7CisgICAgRGVxdWU8UmVmUHRyPE5vZGU+ID4gY2hhbmdlUXVldWU7CisgICAgbV9m
dWxsU2NyZWVuQ2hhbmdlRXZlbnRUYXJnZXRRdWV1ZS5zd2FwKGNoYW5nZVF1ZXVlKTsKKworICAg
IHdoaWxlICghY2hhbmdlUXVldWUuaXNFbXB0eSgpKSB7CisgICAgICAgIFJlZlB0cjxOb2RlPiBu
b2RlID0gY2hhbmdlUXVldWUudGFrZUZpcnN0KCk7CisgICAgICAgIGlmICghbm9kZSkKKyAgICAg
ICAgICAgIG5vZGUgPSBkb2N1bWVudEVsZW1lbnQoKTsKKyAgICAgICAgLy8gVGhlIGRpc3BhdGNo
RXZlbnQgYmVsb3cgbWF5IGhhdmUgYmxvd24gYXdheSBvdXIgZG9jdW1lbnRFbGVtZW50LgorICAg
ICAgICBpZiAoIW5vZGUpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAvLyBJZiB0
aGUgZWxlbWVudCB3YXMgcmVtb3ZlZCBmcm9tIG91ciB0cmVlLCBhbHNvIG1lc3NhZ2UgdGhlIGRv
Y3VtZW50RWxlbWVudC4gU2luY2Ugd2UgbWF5CisgICAgICAgIC8vIGhhdmUgYSBkb2N1bWVudCBo
aWVyYXJjaHksIGNoZWNrIHRoYXQgbm9kZSBpc24ndCBpbiBhbm90aGVyIGRvY3VtZW50LgorICAg
ICAgICBpZiAoIWNvbnRhaW5zKG5vZGUuZ2V0KCkpICYmICFub2RlLT5pbkRvY3VtZW50KCkpCisg
ICAgICAgICAgICBjaGFuZ2VRdWV1ZS5hcHBlbmQoZG9jdW1lbnRFbGVtZW50KCkpOworICAgICAg
ICAKKyAgICAgICAgbm9kZS0+ZGlzcGF0Y2hFdmVudChFdmVudDo6Y3JlYXRlKGV2ZW50TmFtZXMo
KS53ZWJraXRmdWxsc2NyZWVuY2hhbmdlRXZlbnQsIHRydWUsIGZhbHNlKSk7CisgICAgfQorCisg
ICAgRGVxdWU8UmVmUHRyPE5vZGU+ID4gZXJyb3JRdWV1ZTsKKyAgICBtX2Z1bGxTY3JlZW5FcnJv
ckV2ZW50VGFyZ2V0UXVldWUuc3dhcChlcnJvclF1ZXVlKTsKKyAgICAKKyAgICB3aGlsZSAoIWVy
cm9yUXVldWUuaXNFbXB0eSgpKSB7CisgICAgICAgIFJlZlB0cjxOb2RlPiBub2RlID0gZXJyb3JR
dWV1ZS50YWtlRmlyc3QoKTsKKyAgICAgICAgaWYgKCFub2RlKQorICAgICAgICAgICAgbm9kZSA9
IGRvY3VtZW50RWxlbWVudCgpOworICAgICAgICAvLyBUaGUgZGlzcGF0Y2hFdmVudCBiZWxvdyBt
YXkgaGF2ZSBibG93biBhd2F5IG91ciBkb2N1bWVudEVsZW1lbnQuCisgICAgICAgIGlmICghbm9k
ZSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAKKyAgICAgICAgLy8gSWYgdGhlIGVs
ZW1lbnQgd2FzIHJlbW92ZWQgZnJvbSBvdXIgdHJlZSwgYWxzbyBtZXNzYWdlIHRoZSBkb2N1bWVu
dEVsZW1lbnQuIFNpbmNlIHdlIG1heQorICAgICAgICAvLyBoYXZlIGEgZG9jdW1lbnQgaGllcmFy
Y2h5LCBjaGVjayB0aGF0IG5vZGUgaXNuJ3QgaW4gYW5vdGhlciBkb2N1bWVudC4KKyAgICAgICAg
aWYgKCFjb250YWlucyhub2RlLmdldCgpKSAmJiAhbm9kZS0+aW5Eb2N1bWVudCgpKQorICAgICAg
ICAgICAgZXJyb3JRdWV1ZS5hcHBlbmQoZG9jdW1lbnRFbGVtZW50KCkpOworICAgICAgICAKKyAg
ICAgICAgbm9kZS0+ZGlzcGF0Y2hFdmVudChFdmVudDo6Y3JlYXRlKGV2ZW50TmFtZXMoKS53ZWJr
aXRmdWxsc2NyZWVuZXJyb3JFdmVudCwgdHJ1ZSwgZmFsc2UpKTsKKyAgICB9Cit9CisKK3ZvaWQg
RG9jdW1lbnQ6OmZ1bGxTY3JlZW5FbGVtZW50UmVtb3ZlZCgpCit7CisgICAgbV9mdWxsU2NyZWVu
RWxlbWVudC0+c2V0Q29udGFpbnNGdWxsU2NyZWVuRWxlbWVudE9uQW5jZXN0b3JzQ3Jvc3NpbmdG
cmFtZUJvdW5kYXJpZXMoZmFsc2UpOworICAgIHdlYmtpdENhbmNlbEZ1bGxTY3JlZW4oKTsKK30K
Kwordm9pZCBEb2N1bWVudDo6cmVtb3ZlRnVsbFNjcmVlbkVsZW1lbnRPZlN1YnRyZWUoTm9kZSog
bm9kZSwgYm9vbCBhbW9uZ0NoaWxkcmVuT25seSkKK3sKKyAgICBpZiAoIW1fZnVsbFNjcmVlbkVs
ZW1lbnQpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICBib29sIGVsZW1lbnRJblN1YnRyZWUg
PSBmYWxzZTsKKyAgICBpZiAoYW1vbmdDaGlsZHJlbk9ubHkpCisgICAgICAgIGVsZW1lbnRJblN1
YnRyZWUgPSBtX2Z1bGxTY3JlZW5FbGVtZW50LT5pc0Rlc2NlbmRhbnRPZihub2RlKTsKKyAgICBl
bHNlCisgICAgICAgIGVsZW1lbnRJblN1YnRyZWUgPSAobV9mdWxsU2NyZWVuRWxlbWVudCA9PSBu
b2RlKSB8fCBtX2Z1bGxTY3JlZW5FbGVtZW50LT5pc0Rlc2NlbmRhbnRPZihub2RlKTsKKyAgICAK
KyAgICBpZiAoZWxlbWVudEluU3VidHJlZSkKKyAgICAgICAgZnVsbFNjcmVlbkVsZW1lbnRSZW1v
dmVkKCk7Cit9CisKK2Jvb2wgRG9jdW1lbnQ6OmlzQW5pbWF0aW5nRnVsbFNjcmVlbigpIGNvbnN0
Cit7CisgICAgcmV0dXJuIG1faXNBbmltYXRpbmdGdWxsU2NyZWVuOworfQorCit2b2lkIERvY3Vt
ZW50OjpzZXRBbmltYXRpbmdGdWxsU2NyZWVuKGJvb2wgZmxhZykKK3sKKyAgICBpZiAobV9pc0Fu
aW1hdGluZ0Z1bGxTY3JlZW4gPT0gZmxhZykKKyAgICAgICAgcmV0dXJuOworICAgIG1faXNBbmlt
YXRpbmdGdWxsU2NyZWVuID0gZmxhZzsKKworICAgIGlmIChtX2Z1bGxTY3JlZW5FbGVtZW50ICYm
IG1fZnVsbFNjcmVlbkVsZW1lbnQtPmlzRGVzY2VuZGFudE9mKHRoaXMpKSB7CisgICAgICAgIG1f
ZnVsbFNjcmVlbkVsZW1lbnQtPnNldE5lZWRzU3R5bGVSZWNhbGMoKTsKKyAgICAgICAgc2NoZWR1
bGVGb3JjZWRTdHlsZVJlY2FsYygpOworICAgIH0KK30KKwordm9pZCBEb2N1bWVudDo6Y2xlYXJG
dWxsc2NyZWVuRWxlbWVudFN0YWNrKCkKK3sKKyAgICBtX2Z1bGxTY3JlZW5FbGVtZW50U3RhY2su
Y2xlYXIoKTsKK30KKwordm9pZCBEb2N1bWVudDo6cG9wRnVsbHNjcmVlbkVsZW1lbnRTdGFjaygp
Cit7CisgICAgaWYgKG1fZnVsbFNjcmVlbkVsZW1lbnRTdGFjay5pc0VtcHR5KCkpCisgICAgICAg
IHJldHVybjsKKworICAgIG1fZnVsbFNjcmVlbkVsZW1lbnRTdGFjay5yZW1vdmVGaXJzdCgpOwor
fQorCit2b2lkIERvY3VtZW50OjpwdXNoRnVsbHNjcmVlbkVsZW1lbnRTdGFjayhFbGVtZW50KiBl
bGVtZW50KQoreworICAgIG1fZnVsbFNjcmVlbkVsZW1lbnRTdGFjay5wcmVwZW5kKGVsZW1lbnQp
OworfQorCit2b2lkIERvY3VtZW50OjphZGREb2N1bWVudFRvRnVsbFNjcmVlbkNoYW5nZUV2ZW50
UXVldWUoRG9jdW1lbnQqIGRvYykKK3sKKyAgICBBU1NFUlQoZG9jKTsKKyAgICBOb2RlKiB0YXJn
ZXQgPSBkb2MtPndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50KCk7CisgICAgaWYgKCF0YXJnZXQpCisg
ICAgICAgIHRhcmdldCA9IGRvYy0+d2Via2l0Q3VycmVudEZ1bGxTY3JlZW5FbGVtZW50KCk7Cisg
ICAgaWYgKCF0YXJnZXQpCisgICAgICAgIHRhcmdldCA9IGRvYzsKKyAgICBtX2Z1bGxTY3JlZW5D
aGFuZ2VFdmVudFRhcmdldFF1ZXVlLmFwcGVuZCh0YXJnZXQpOworfQorI2VuZGlmCisKKyNpZiBF
TkFCTEUoUE9JTlRFUl9MT0NLKQordm9pZCBEb2N1bWVudDo6d2Via2l0RXhpdFBvaW50ZXJMb2Nr
KCkKK3sKKyAgICBpZiAoIXBhZ2UoKSkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChFbGVtZW50
KiB0YXJnZXQgPSBwYWdlKCktPnBvaW50ZXJMb2NrQ29udHJvbGxlcigpLT5lbGVtZW50KCkpIHsK
KyAgICAgICAgaWYgKHRhcmdldC0+ZG9jdW1lbnQoKSAhPSB0aGlzKQorICAgICAgICAgICAgcmV0
dXJuOworICAgIH0KKyAgICBwYWdlKCktPnBvaW50ZXJMb2NrQ29udHJvbGxlcigpLT5yZXF1ZXN0
UG9pbnRlclVubG9jaygpOworfQorCitFbGVtZW50KiBEb2N1bWVudDo6d2Via2l0UG9pbnRlckxv
Y2tFbGVtZW50KCkgY29uc3QKK3sKKyAgICBpZiAoIXBhZ2UoKSB8fCBwYWdlKCktPnBvaW50ZXJM
b2NrQ29udHJvbGxlcigpLT5sb2NrUGVuZGluZygpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBp
ZiAoRWxlbWVudCogZWxlbWVudCA9IHBhZ2UoKS0+cG9pbnRlckxvY2tDb250cm9sbGVyKCktPmVs
ZW1lbnQoKSkgeworICAgICAgICBpZiAoZWxlbWVudC0+ZG9jdW1lbnQoKSA9PSB0aGlzKQorICAg
ICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CisgICAgfQorICAgIHJldHVybiAwOworfQorI2VuZGlm
CisKK3ZvaWQgRG9jdW1lbnQ6OmRlY3JlbWVudExvYWRFdmVudERlbGF5Q291bnQoKQoreworICAg
IEFTU0VSVChtX2xvYWRFdmVudERlbGF5Q291bnQpOworICAgIC0tbV9sb2FkRXZlbnREZWxheUNv
dW50OworCisgICAgaWYgKGZyYW1lKCkgJiYgIW1fbG9hZEV2ZW50RGVsYXlDb3VudCAmJiAhbV9s
b2FkRXZlbnREZWxheVRpbWVyLmlzQWN0aXZlKCkpCisgICAgICAgIG1fbG9hZEV2ZW50RGVsYXlU
aW1lci5zdGFydE9uZVNob3QoMCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmxvYWRFdmVudERlbGF5
VGltZXJGaXJlZChUaW1lcjxEb2N1bWVudD4qKQoreworICAgIGlmIChmcmFtZSgpKQorICAgICAg
ICBmcmFtZSgpLT5sb2FkZXIoKS0+Y2hlY2tDb21wbGV0ZWQoKTsKK30KKworI2lmIEVOQUJMRShS
RVFVRVNUX0FOSU1BVElPTl9GUkFNRSkKK2ludCBEb2N1bWVudDo6d2Via2l0UmVxdWVzdEFuaW1h
dGlvbkZyYW1lKFBhc3NSZWZQdHI8UmVxdWVzdEFuaW1hdGlvbkZyYW1lQ2FsbGJhY2s+IGNhbGxi
YWNrKQoreworICAgIGlmICghbV9zY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXIpIHsKKyNpZiBV
U0UoUkVRVUVTVF9BTklNQVRJT05fRlJBTUVfRElTUExBWV9NT05JVE9SKQorICAgICAgICBtX3Nj
cmlwdGVkQW5pbWF0aW9uQ29udHJvbGxlciA9IFNjcmlwdGVkQW5pbWF0aW9uQ29udHJvbGxlcjo6
Y3JlYXRlKHRoaXMsIHBhZ2UoKSA/IHBhZ2UoKS0+ZGlzcGxheUlEKCkgOiAwKTsKKyNlbHNlCisg
ICAgICAgIG1fc2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyID0gU2NyaXB0ZWRBbmltYXRpb25D
b250cm9sbGVyOjpjcmVhdGUodGhpcywgMCk7CisjZW5kaWYKKyAgICAgICAgLy8gSXQncyBwb3Nz
aWJsZSB0aGF0IHRoZSBQYWdlIG1heSBoYXZlIHN1c3BlbmRlZCBzY3JpcHRlZCBhbmltYXRpb25z
IGJlZm9yZQorICAgICAgICAvLyB3ZSB3ZXJlIGNyZWF0ZWQuIFdlIG5lZWQgdG8gbWFrZSBzdXJl
IHRoYXQgd2UgZG9uJ3Qgc3RhcnQgdXAgdGhlIGFuaW1hdGlvbgorICAgICAgICAvLyBjb250cm9s
bGVyIG9uIGEgYmFja2dyb3VuZCB0YWIsIGZvciBleGFtcGxlLgorICAgICAgICBpZiAoIXBhZ2Uo
KSB8fCBwYWdlKCktPnNjcmlwdGVkQW5pbWF0aW9uc1N1c3BlbmRlZCgpKQorICAgICAgICAgICAg
bV9zY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXItPnN1c3BlbmQoKTsKKyAgICB9CisKKyAgICBy
ZXR1cm4gbV9zY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXItPnJlZ2lzdGVyQ2FsbGJhY2soY2Fs
bGJhY2spOworfQorCit2b2lkIERvY3VtZW50Ojp3ZWJraXRDYW5jZWxBbmltYXRpb25GcmFtZShp
bnQgaWQpCit7CisgICAgaWYgKCFtX3NjcmlwdGVkQW5pbWF0aW9uQ29udHJvbGxlcikKKyAgICAg
ICAgcmV0dXJuOworICAgIG1fc2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyLT5jYW5jZWxDYWxs
YmFjayhpZCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnNlcnZpY2VTY3JpcHRlZEFuaW1hdGlvbnMo
RE9NVGltZVN0YW1wIHRpbWUpCit7CisgICAgaWYgKCFtX3NjcmlwdGVkQW5pbWF0aW9uQ29udHJv
bGxlcikKKyAgICAgICAgcmV0dXJuOworICAgIG1fc2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVy
LT5zZXJ2aWNlU2NyaXB0ZWRBbmltYXRpb25zKHRpbWUpOworfQorI2VuZGlmCisKKyNpZiBFTkFC
TEUoVE9VQ0hfRVZFTlRTKQorUGFzc1JlZlB0cjxUb3VjaD4gRG9jdW1lbnQ6OmNyZWF0ZVRvdWNo
KERPTVdpbmRvdyogd2luZG93LCBFdmVudFRhcmdldCogdGFyZ2V0LCBpbnQgaWRlbnRpZmllciwg
aW50IHBhZ2VYLCBpbnQgcGFnZVksIGludCBzY3JlZW5YLCBpbnQgc2NyZWVuWSwgaW50IHJhZGl1
c1gsIGludCByYWRpdXNZLCBmbG9hdCByb3RhdGlvbkFuZ2xlLCBmbG9hdCBmb3JjZSwgRXhjZXB0
aW9uQ29kZSYpIGNvbnN0Cit7CisgICAgLy8gRklYTUU6IEl0J3Mgbm90IGNsZWFyIGZyb20gdGhl
IGRvY3VtZW50YXRpb24gYXQKKyAgICAvLyBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9saWJy
YXJ5L3NhZmFyaS8jZG9jdW1lbnRhdGlvbi9Vc2VyRXhwZXJpZW5jZS9SZWZlcmVuY2UvRG9jdW1l
bnRBZGRpdGlvbnNSZWZlcmVuY2UvRG9jdW1lbnRBZGRpdGlvbnMvRG9jdW1lbnRBZGRpdGlvbnMu
aHRtbAorICAgIC8vIHdoZW4gdGhpcyBtZXRob2Qgc2hvdWxkIHRocm93IGFuZCBub3IgaXMgaXQg
YnkgaW5zcGVjdGlvbiBvZiBpT1MgYmVoYXZpb3IuIEl0IHdvdWxkIGJlIG5pY2UgdG8gdmVyaWZ5
IGFueSBjYXNlcyB3aGVyZSBpdCB0aHJvd3MgdW5kZXIgaU9TCisgICAgLy8gYW5kIGltcGxlbWVu
dCB0aGVtIGhlcmUuIFNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
NDc4MTkKKyAgICBGcmFtZSogZnJhbWUgPSB3aW5kb3cgPyB3aW5kb3ctPmZyYW1lKCkgOiB0aGlz
LT5mcmFtZSgpOworICAgIHJldHVybiBUb3VjaDo6Y3JlYXRlKGZyYW1lLCB0YXJnZXQsIGlkZW50
aWZpZXIsIHNjcmVlblgsIHNjcmVlblksIHBhZ2VYLCBwYWdlWSwgcmFkaXVzWCwgcmFkaXVzWSwg
cm90YXRpb25BbmdsZSwgZm9yY2UpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHdoZWVsRXZl
bnRIYW5kbGVyQ291bnRDaGFuZ2VkKERvY3VtZW50KiBkb2N1bWVudCkKK3sKKyAgICBQYWdlKiBw
YWdlID0gZG9jdW1lbnQtPnBhZ2UoKTsKKyAgICBpZiAoIXBhZ2UpCisgICAgICAgIHJldHVybjsK
KworICAgIFNjcm9sbGluZ0Nvb3JkaW5hdG9yKiBzY3JvbGxpbmdDb29yZGluYXRvciA9IHBhZ2Ut
PnNjcm9sbGluZ0Nvb3JkaW5hdG9yKCk7CisgICAgaWYgKCFzY3JvbGxpbmdDb29yZGluYXRvcikK
KyAgICAgICAgcmV0dXJuOworCisgICAgRnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBkb2N1bWVudC0+
dmlldygpOworICAgIGlmICghZnJhbWVWaWV3KQorICAgICAgICByZXR1cm47CisKKyAgICBzY3Jv
bGxpbmdDb29yZGluYXRvci0+ZnJhbWVWaWV3V2hlZWxFdmVudEhhbmRsZXJDb3VudENoYW5nZWQo
ZnJhbWVWaWV3KTsKK30KKwordm9pZCBEb2N1bWVudDo6ZGlkQWRkV2hlZWxFdmVudEhhbmRsZXIo
KQoreworICAgICsrbV93aGVlbEV2ZW50SGFuZGxlckNvdW50OworICAgIEZyYW1lKiBtYWluRnJh
bWUgPSBwYWdlKCkgPyBwYWdlKCktPm1haW5GcmFtZSgpIDogMDsKKyAgICBpZiAobWFpbkZyYW1l
KQorICAgICAgICBtYWluRnJhbWUtPm5vdGlmeUNocm9tZUNsaWVudFdoZWVsRXZlbnRIYW5kbGVy
Q291bnRDaGFuZ2VkKCk7CisKKyAgICB3aGVlbEV2ZW50SGFuZGxlckNvdW50Q2hhbmdlZCh0aGlz
KTsKK30KKwordm9pZCBEb2N1bWVudDo6ZGlkUmVtb3ZlV2hlZWxFdmVudEhhbmRsZXIoKQorewor
ICAgIEFTU0VSVChtX3doZWVsRXZlbnRIYW5kbGVyQ291bnQgPiAwKTsKKyAgICAtLW1fd2hlZWxF
dmVudEhhbmRsZXJDb3VudDsKKyAgICBGcmFtZSogbWFpbkZyYW1lID0gcGFnZSgpID8gcGFnZSgp
LT5tYWluRnJhbWUoKSA6IDA7CisgICAgaWYgKG1haW5GcmFtZSkKKyAgICAgICAgbWFpbkZyYW1l
LT5ub3RpZnlDaHJvbWVDbGllbnRXaGVlbEV2ZW50SGFuZGxlckNvdW50Q2hhbmdlZCgpOworCisg
ICAgd2hlZWxFdmVudEhhbmRsZXJDb3VudENoYW5nZWQodGhpcyk7Cit9CisKK3ZvaWQgRG9jdW1l
bnQ6OmRpZEFkZFRvdWNoRXZlbnRIYW5kbGVyKCkKK3sKKyNpZiBFTkFCTEUoVE9VQ0hfRVZFTlRT
KQorICAgICsrbV90b3VjaEV2ZW50SGFuZGxlckNvdW50OworICAgIGlmIChtX3RvdWNoRXZlbnRI
YW5kbGVyQ291bnQgPiAxKQorICAgICAgICByZXR1cm47CisgICAgaWYgKFBhZ2UqIHBhZ2UgPSB0
aGlzLT5wYWdlKCkpCisgICAgICAgIHBhZ2UtPmNocm9tZSgpLT5jbGllbnQoKS0+bmVlZFRvdWNo
RXZlbnRzKHRydWUpOworI2VuZGlmCit9CisKK3ZvaWQgRG9jdW1lbnQ6OmRpZFJlbW92ZVRvdWNo
RXZlbnRIYW5kbGVyKCkKK3sKKyNpZiBFTkFCTEUoVE9VQ0hfRVZFTlRTKQorICAgIEFTU0VSVCht
X3RvdWNoRXZlbnRIYW5kbGVyQ291bnQpOworICAgIC0tbV90b3VjaEV2ZW50SGFuZGxlckNvdW50
OworICAgIGlmIChtX3RvdWNoRXZlbnRIYW5kbGVyQ291bnQpCisgICAgICAgIHJldHVybjsKKwor
ICAgIFBhZ2UqIHBhZ2UgPSB0aGlzLT5wYWdlKCk7CisgICAgaWYgKCFwYWdlKQorICAgICAgICBy
ZXR1cm47CisgICAgZm9yIChjb25zdCBGcmFtZSogZnJhbWUgPSBwYWdlLT5tYWluRnJhbWUoKTsg
ZnJhbWU7IGZyYW1lID0gZnJhbWUtPnRyZWUoKS0+dHJhdmVyc2VOZXh0KCkpIHsKKyAgICAgICAg
aWYgKGZyYW1lLT5kb2N1bWVudCgpICYmIGZyYW1lLT5kb2N1bWVudCgpLT50b3VjaEV2ZW50SGFu
ZGxlckNvdW50KCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgfQorICAgIHBhZ2UtPmNocm9t
ZSgpLT5jbGllbnQoKS0+bmVlZFRvdWNoRXZlbnRzKGZhbHNlKTsKKyNlbmRpZgorfQorCitIVE1M
SUZyYW1lRWxlbWVudCogRG9jdW1lbnQ6OnNlYW1sZXNzUGFyZW50SUZyYW1lKCkgY29uc3QKK3sK
KyAgICBpZiAoIXNob3VsZERpc3BsYXlTZWFtbGVzc2x5V2l0aFBhcmVudCgpKQorICAgICAgICBy
ZXR1cm4gMDsKKworICAgIEhUTUxGcmFtZU93bmVyRWxlbWVudCogb3duZXJFbGVtZW50ID0gdGhp
cy0+b3duZXJFbGVtZW50KCk7CisgICAgQVNTRVJUKG93bmVyRWxlbWVudC0+aGFzVGFnTmFtZShp
ZnJhbWVUYWcpKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SFRNTElGcmFtZUVsZW1lbnQqPihv
d25lckVsZW1lbnQpOworfQorCitib29sIERvY3VtZW50OjpzaG91bGREaXNwbGF5U2VhbWxlc3Ns
eVdpdGhQYXJlbnQoKSBjb25zdAoreworI2lmIEVOQUJMRShJRlJBTUVfU0VBTUxFU1MpCisgICAg
SFRNTEZyYW1lT3duZXJFbGVtZW50KiBvd25lckVsZW1lbnQgPSB0aGlzLT5vd25lckVsZW1lbnQo
KTsKKyAgICBpZiAoIW93bmVyRWxlbWVudCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJl
dHVybiBtX21heURpc3BsYXlTZWFtbGVzc1dpdGhQYXJlbnQgJiYgb3duZXJFbGVtZW50LT5oYXNU
YWdOYW1lKGlmcmFtZVRhZykgJiYgb3duZXJFbGVtZW50LT5mYXN0SGFzQXR0cmlidXRlKHNlYW1s
ZXNzQXR0cik7CisjZWxzZQorICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorfQorCitEb2N1bWVu
dExvYWRlciogRG9jdW1lbnQ6OmxvYWRlcigpIGNvbnN0Cit7CisgICAgaWYgKCFtX2ZyYW1lKQor
ICAgICAgICByZXR1cm4gMDsKKyAgICAKKyAgICBEb2N1bWVudExvYWRlciogbG9hZGVyID0gbV9m
cmFtZS0+bG9hZGVyKCktPmRvY3VtZW50TG9hZGVyKCk7CisgICAgaWYgKCFsb2FkZXIpCisgICAg
ICAgIHJldHVybiAwOworICAgIAorICAgIGlmIChtX2ZyYW1lLT5kb2N1bWVudCgpICE9IHRoaXMp
CisgICAgICAgIHJldHVybiAwOworICAgIAorICAgIHJldHVybiBsb2FkZXI7Cit9CisKKyNpZiBF
TkFCTEUoTUlDUk9EQVRBKQorUGFzc1JlZlB0cjxOb2RlTGlzdD4gRG9jdW1lbnQ6OmdldEl0ZW1z
KGNvbnN0IFN0cmluZyYgdHlwZU5hbWVzKQoreworICAgIC8vIFNpbmNlIGRvY3VtZXQuZ2V0SXRl
bSgpIGlzIGFsbG93ZWQgZm9yIG1pY3JvZGF0YSwgdHlwZU5hbWVzIHdpbGwgYmUgbnVsbCBzdHJp
bmcuCisgICAgLy8gSW4gdGhpcyBjYXNlIHdlIG5lZWQgdG8gY3JlYXRlIGFuIGVtcHR5IHN0cmlu
ZyBpZGVudGlmaWVyIHRvIG1hcCBzdWNoIHJlcXVlc3QgaW4gdGhlIGNhY2hlLgorICAgIFN0cmlu
ZyBsb2NhbFR5cGVOYW1lcyA9IHR5cGVOYW1lcy5pc051bGwoKSA/IE1pY3JvRGF0YUl0ZW1MaXN0
Ojp1bmRlZmluZWRJdGVtVHlwZSgpIDogdHlwZU5hbWVzOworCisgICAgcmV0dXJuIGVuc3VyZVJh
cmVEYXRhKCktPmVuc3VyZU5vZGVMaXN0cygpLT5hZGRDYWNoZVdpdGhOYW1lPE1pY3JvRGF0YUl0
ZW1MaXN0Pih0aGlzLCBEeW5hbWljTm9kZUxpc3Q6Ok1pY3JvRGF0YUl0ZW1MaXN0VHlwZSwgbG9j
YWxUeXBlTmFtZXMpOworfQorI2VuZGlmCisKK0ludFNpemUgRG9jdW1lbnQ6OnZpZXdwb3J0U2l6
ZSgpIGNvbnN0Cit7CisgICAgaWYgKCF2aWV3KCkpCisgICAgICAgIHJldHVybiBJbnRTaXplKCk7
CisgICAgcmV0dXJuIHZpZXcoKS0+dmlzaWJsZUNvbnRlbnRSZWN0KC8qIGluY2x1ZGVTY3JvbGxi
YXJzICovIHRydWUpLnNpemUoKTsKK30KKworTm9kZSogZXZlbnRUYXJnZXROb2RlRm9yRG9jdW1l
bnQoRG9jdW1lbnQqIGRvYykKK3sKKyAgICBpZiAoIWRvYykKKyAgICAgICAgcmV0dXJuIDA7Cisg
ICAgTm9kZSogbm9kZSA9IGRvYy0+Zm9jdXNlZE5vZGUoKTsKKyAgICBpZiAoIW5vZGUgJiYgZG9j
LT5pc1BsdWdpbkRvY3VtZW50KCkpIHsKKyAgICAgICAgUGx1Z2luRG9jdW1lbnQqIHBsdWdpbkRv
Y3VtZW50ID0gc3RhdGljX2Nhc3Q8UGx1Z2luRG9jdW1lbnQqPihkb2MpOworICAgICAgICBub2Rl
ID0gIHBsdWdpbkRvY3VtZW50LT5wbHVnaW5Ob2RlKCk7CisgICAgfQorICAgIGlmICghbm9kZSAm
JiBkb2MtPmlzSFRNTERvY3VtZW50KCkpCisgICAgICAgIG5vZGUgPSBkb2MtPmJvZHkoKTsKKyAg
ICBpZiAoIW5vZGUpCisgICAgICAgIG5vZGUgPSBkb2MtPmRvY3VtZW50RWxlbWVudCgpOworICAg
IHJldHVybiBub2RlOworfQorCit2b2lkIERvY3VtZW50OjphZGp1c3RGbG9hdFF1YWRzRm9yU2Ny
b2xsQW5kQWJzb2x1dGVab29tQW5kRnJhbWVTY2FsZShWZWN0b3I8RmxvYXRRdWFkPiYgcXVhZHMs
IFJlbmRlck9iamVjdCogcmVuZGVyZXIpCit7CisgICAgaWYgKCF2aWV3KCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIGZsb2F0IGludmVyc2VGcmFtZVNjYWxlID0gMTsKKyAgICBpZiAoZnJhbWUo
KSkKKyAgICAgICAgaW52ZXJzZUZyYW1lU2NhbGUgPSAxIC8gZnJhbWUoKS0+ZnJhbWVTY2FsZUZh
Y3RvcigpOworCisgICAgTGF5b3V0UmVjdCB2aXNpYmxlQ29udGVudFJlY3QgPSB2aWV3KCktPnZp
c2libGVDb250ZW50UmVjdCgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcXVhZHMuc2l6
ZSgpOyArK2kpIHsKKyAgICAgICAgcXVhZHNbaV0ubW92ZSgtdmlzaWJsZUNvbnRlbnRSZWN0Lngo
KSwgLXZpc2libGVDb250ZW50UmVjdC55KCkpOworICAgICAgICBhZGp1c3RGbG9hdFF1YWRGb3JB
YnNvbHV0ZVpvb20ocXVhZHNbaV0sIHJlbmRlcmVyKTsKKyAgICAgICAgaWYgKGludmVyc2VGcmFt
ZVNjYWxlICE9IDEpCisgICAgICAgICAgICBxdWFkc1tpXS5zY2FsZShpbnZlcnNlRnJhbWVTY2Fs
ZSwgaW52ZXJzZUZyYW1lU2NhbGUpOworICAgIH0KK30KKwordm9pZCBEb2N1bWVudDo6YWRqdXN0
RmxvYXRSZWN0Rm9yU2Nyb2xsQW5kQWJzb2x1dGVab29tQW5kRnJhbWVTY2FsZShGbG9hdFJlY3Qm
IHJlY3QsIFJlbmRlck9iamVjdCogcmVuZGVyZXIpCit7CisgICAgaWYgKCF2aWV3KCkpCisgICAg
ICAgIHJldHVybjsKKworICAgIGZsb2F0IGludmVyc2VGcmFtZVNjYWxlID0gMTsKKyAgICBpZiAo
ZnJhbWUoKSkKKyAgICAgICAgaW52ZXJzZUZyYW1lU2NhbGUgPSAxIC8gZnJhbWUoKS0+ZnJhbWVT
Y2FsZUZhY3RvcigpOworCisgICAgTGF5b3V0UmVjdCB2aXNpYmxlQ29udGVudFJlY3QgPSB2aWV3
KCktPnZpc2libGVDb250ZW50UmVjdCgpOworICAgIHJlY3QubW92ZSgtdmlzaWJsZUNvbnRlbnRS
ZWN0LngoKSwgLXZpc2libGVDb250ZW50UmVjdC55KCkpOworICAgIGFkanVzdEZsb2F0UmVjdEZv
ckFic29sdXRlWm9vbShyZWN0LCByZW5kZXJlcik7CisgICAgaWYgKGludmVyc2VGcmFtZVNjYWxl
ICE9IDEpCisgICAgICAgIHJlY3Quc2NhbGUoaW52ZXJzZUZyYW1lU2NhbGUpOworfQorCit2b2lk
IERvY3VtZW50OjpzZXRDb250ZXh0RmVhdHVyZXMoUGFzc1JlZlB0cjxDb250ZXh0RmVhdHVyZXM+
IGZlYXR1cmVzKQoreworICAgIG1fY29udGV4dEZlYXR1cmVzID0gZmVhdHVyZXM7Cit9CisKK3N0
YXRpYyBSZW5kZXJPYmplY3QqIG5lYXJlc3RDb21tb25Ib3ZlckFuY2VzdG9yKFJlbmRlck9iamVj
dCogb2JqMSwgUmVuZGVyT2JqZWN0KiBvYmoyKQoreworICAgIGlmICghb2JqMSB8fCAhb2JqMikK
KyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBmb3IgKFJlbmRlck9iamVjdCogY3Vyck9iajEgPSBv
YmoxOyBjdXJyT2JqMTsgY3Vyck9iajEgPSBjdXJyT2JqMS0+aG92ZXJBbmNlc3RvcigpKSB7Cisg
ICAgICAgIGZvciAoUmVuZGVyT2JqZWN0KiBjdXJyT2JqMiA9IG9iajI7IGN1cnJPYmoyOyBjdXJy
T2JqMiA9IGN1cnJPYmoyLT5ob3ZlckFuY2VzdG9yKCkpIHsKKyAgICAgICAgICAgIGlmIChjdXJy
T2JqMSA9PSBjdXJyT2JqMikKKyAgICAgICAgICAgICAgICByZXR1cm4gY3Vyck9iajE7CisgICAg
ICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBEb2N1bWVudDo6dXBkYXRl
SG92ZXJBY3RpdmVTdGF0ZShjb25zdCBIaXRUZXN0UmVxdWVzdCYgcmVxdWVzdCwgSGl0VGVzdFJl
c3VsdCYgcmVzdWx0KQoreworICAgIC8vIFdlIGRvbid0IHVwZGF0ZSA6aG92ZXIvOmFjdGl2ZSBz
dGF0ZSB3aGVuIHRoZSByZXN1bHQgaXMgbWFya2VkIGFzIHJlYWRPbmx5LgorICAgIGlmIChyZXF1
ZXN0LnJlYWRPbmx5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIE5vZGUqIGlubmVyTm9kZUlu
RG9jdW1lbnQgPSByZXN1bHQuaW5uZXJOb2RlKCk7CisgICAgQVNTRVJUKCFpbm5lck5vZGVJbkRv
Y3VtZW50IHx8IGlubmVyTm9kZUluRG9jdW1lbnQtPmRvY3VtZW50KCkgPT0gdGhpcyk7CisKKyAg
ICBOb2RlKiBvbGRBY3RpdmVOb2RlID0gYWN0aXZlTm9kZSgpOworICAgIGlmIChvbGRBY3RpdmVO
b2RlICYmICFyZXF1ZXN0LmFjdGl2ZSgpKSB7CisgICAgICAgIC8vIFdlIGFyZSBjbGVhcmluZyB0
aGUgOmFjdGl2ZSBjaGFpbiBiZWNhdXNlIHRoZSBtb3VzZSBoYXMgYmVlbiByZWxlYXNlZC4KKyAg
ICAgICAgZm9yIChSZW5kZXJPYmplY3QqIGN1cnIgPSBvbGRBY3RpdmVOb2RlLT5yZW5kZXJlcigp
OyBjdXJyOyBjdXJyID0gY3Vyci0+cGFyZW50KCkpIHsKKyAgICAgICAgICAgIGlmIChjdXJyLT5u
b2RlKCkgJiYgIWN1cnItPmlzVGV4dCgpKSB7CisgICAgICAgICAgICAgICAgY3Vyci0+bm9kZSgp
LT5zZXRBY3RpdmUoZmFsc2UpOworICAgICAgICAgICAgICAgIGN1cnItPm5vZGUoKS0+Y2xlYXJJ
bkFjdGl2ZUNoYWluKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2V0QWN0
aXZlTm9kZSgwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBOb2RlKiBuZXdBY3RpdmVOb2RlID0g
aW5uZXJOb2RlSW5Eb2N1bWVudDsKKyAgICAgICAgaWYgKCFvbGRBY3RpdmVOb2RlICYmIG5ld0Fj
dGl2ZU5vZGUgJiYgcmVxdWVzdC5hY3RpdmUoKSAmJiAhcmVxdWVzdC50b3VjaE1vdmUoKSkgewor
ICAgICAgICAgICAgLy8gV2UgYXJlIHNldHRpbmcgdGhlIDphY3RpdmUgY2hhaW4gYW5kIGZyZWV6
aW5nIGl0LiBJZiBmdXR1cmUgbW92ZXMgaGFwcGVuLCB0aGV5CisgICAgICAgICAgICAvLyB3aWxs
IG5lZWQgdG8gcmVmZXJlbmNlIHRoaXMgY2hhaW4uCisgICAgICAgICAgICBmb3IgKFJlbmRlck9i
amVjdCogY3VyciA9IG5ld0FjdGl2ZU5vZGUtPnJlbmRlcmVyKCk7IGN1cnI7IGN1cnIgPSBjdXJy
LT5wYXJlbnQoKSkgeworICAgICAgICAgICAgICAgIGlmIChjdXJyLT5ub2RlKCkgJiYgIWN1cnIt
PmlzVGV4dCgpKQorICAgICAgICAgICAgICAgICAgICBjdXJyLT5ub2RlKCktPnNldEluQWN0aXZl
Q2hhaW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldEFjdGl2ZU5vZGUobmV3QWN0
aXZlTm9kZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gSWYgdGhlIG1vdXNlIGhhcyBqdXN0
IGJlZW4gcHJlc3NlZCwgc2V0IDphY3RpdmUgb24gdGhlIGNoYWluLiBUaG9zZSAoYW5kIG9ubHkg
dGhvc2UpCisgICAgLy8gbm9kZXMgc2hvdWxkIHJlbWFpbiA6YWN0aXZlIHVudGlsIHRoZSBtb3Vz
ZSBpcyByZWxlYXNlZC4KKyAgICBib29sIGFsbG93QWN0aXZlQ2hhbmdlcyA9ICFvbGRBY3RpdmVO
b2RlICYmIGFjdGl2ZU5vZGUoKTsKKworICAgIC8vIElmIHRoZSBtb3VzZSBpcyBkb3duIGFuZCBp
ZiB0aGlzIGlzIGEgbW91c2UgbW92ZSBldmVudCwgd2Ugd2FudCB0byByZXN0cmljdCBjaGFuZ2Vz
IGluCisgICAgLy8gOmhvdmVyLzphY3RpdmUgdG8gb25seSBhcHBseSB0byBlbGVtZW50cyB0aGF0
IGFyZSBpbiB0aGUgOmFjdGl2ZSBjaGFpbiB0aGF0IHdlIGZyb3plCisgICAgLy8gYXQgdGhlIHRp
bWUgdGhlIG1vdXNlIHdlbnQgZG93bi4KKyAgICBib29sIG11c3RCZUluQWN0aXZlQ2hhaW4gPSBy
ZXF1ZXN0LmFjdGl2ZSgpICYmIHJlcXVlc3QubW92ZSgpOworCisgICAgUmVmUHRyPE5vZGU+IG9s
ZEhvdmVyTm9kZSA9IGhvdmVyTm9kZSgpOworICAgIC8vIENsZWFyIHRoZSA6aG92ZXIgY2hhaW4g
d2hlbiB0aGUgdG91Y2ggZ2VzdHVyZSBpcyBvdmVyLgorICAgIGlmIChyZXF1ZXN0LnRvdWNoUmVs
ZWFzZSgpKSB7CisgICAgICAgIGlmIChvbGRIb3Zlck5vZGUpIHsKKyAgICAgICAgICAgIGZvciAo
UmVuZGVyT2JqZWN0KiBjdXJyID0gb2xkSG92ZXJOb2RlLT5yZW5kZXJlcigpOyBjdXJyOyBjdXJy
ID0gY3Vyci0+aG92ZXJBbmNlc3RvcigpKSB7CisgICAgICAgICAgICAgICAgaWYgKGN1cnItPm5v
ZGUoKSAmJiAhY3Vyci0+aXNUZXh0KCkpCisgICAgICAgICAgICAgICAgICAgIGN1cnItPm5vZGUo
KS0+c2V0SG92ZXJlZChmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRIb3Zl
ck5vZGUoMCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gQSB0b3VjaCByZWxlYXNlIGNhbiBub3Qg
c2V0IG5ldyBob3ZlciBvciBhY3RpdmUgdGFyZ2V0LgorICAgICAgICByZXR1cm47CisgICAgfQor
CisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBob3ZlcmVkIG5vZGUgaGFzIGNoYW5nZWQuCisg
ICAgLy8gSWYgaXQgaGFzbid0LCB3ZSBkbyBub3QgbmVlZCB0byBkbyBhbnl0aGluZy4KKyAgICBO
b2RlKiBuZXdIb3Zlck5vZGUgPSBpbm5lck5vZGVJbkRvY3VtZW50OworICAgIHdoaWxlIChuZXdI
b3Zlck5vZGUgJiYgIW5ld0hvdmVyTm9kZS0+cmVuZGVyZXIoKSkKKyAgICAgICAgbmV3SG92ZXJO
b2RlID0gbmV3SG92ZXJOb2RlLT5wYXJlbnRPckhvc3ROb2RlKCk7CisKKyAgICAvLyBVcGRhdGUg
b3VyIGN1cnJlbnQgaG92ZXIgbm9kZS4KKyAgICBzZXRIb3Zlck5vZGUobmV3SG92ZXJOb2RlKTsK
KworICAgIC8vIFdlIGhhdmUgdHdvIGRpZmZlcmVudCBvYmplY3RzLiBGZXRjaCB0aGVpciByZW5k
ZXJlcnMuCisgICAgUmVuZGVyT2JqZWN0KiBvbGRIb3Zlck9iaiA9IG9sZEhvdmVyTm9kZSA/IG9s
ZEhvdmVyTm9kZS0+cmVuZGVyZXIoKSA6IDA7CisgICAgUmVuZGVyT2JqZWN0KiBuZXdIb3Zlck9i
aiA9IG5ld0hvdmVyTm9kZSA/IG5ld0hvdmVyTm9kZS0+cmVuZGVyZXIoKSA6IDA7CisKKyAgICAv
LyBMb2NhdGUgdGhlIGNvbW1vbiBhbmNlc3RvciByZW5kZXIgb2JqZWN0IGZvciB0aGUgdHdvIHJl
bmRlcmVycy4KKyAgICBSZW5kZXJPYmplY3QqIGFuY2VzdG9yID0gbmVhcmVzdENvbW1vbkhvdmVy
QW5jZXN0b3Iob2xkSG92ZXJPYmosIG5ld0hvdmVyT2JqKTsKKworICAgIFZlY3RvcjxSZWZQdHI8
Tm9kZT4sIDMyPiBub2Rlc1RvUmVtb3ZlRnJvbUNoYWluOworICAgIFZlY3RvcjxSZWZQdHI8Tm9k
ZT4sIDMyPiBub2Rlc1RvQWRkVG9DaGFpbjsKKworICAgIGlmIChvbGRIb3Zlck9iaiAhPSBuZXdI
b3Zlck9iaikgeworICAgICAgICAvLyBUaGUgb2xkIGhvdmVyIHBhdGggb25seSBuZWVkcyB0byBi
ZSBjbGVhcmVkIHVwIHRvIChhbmQgbm90IGluY2x1ZGluZykgdGhlIGNvbW1vbiBhbmNlc3RvcjsK
KyAgICAgICAgZm9yIChSZW5kZXJPYmplY3QqIGN1cnIgPSBvbGRIb3Zlck9iajsgY3VyciAmJiBj
dXJyICE9IGFuY2VzdG9yOyBjdXJyID0gY3Vyci0+aG92ZXJBbmNlc3RvcigpKSB7CisgICAgICAg
ICAgICBpZiAoY3Vyci0+bm9kZSgpICYmICFjdXJyLT5pc1RleHQoKSAmJiAoIW11c3RCZUluQWN0
aXZlQ2hhaW4gfHwgY3Vyci0+bm9kZSgpLT5pbkFjdGl2ZUNoYWluKCkpKQorICAgICAgICAgICAg
ICAgIG5vZGVzVG9SZW1vdmVGcm9tQ2hhaW4uYXBwZW5kKGN1cnItPm5vZGUoKSk7CisgICAgICAg
IH0KKyAgICB9CisKKyAgICAvLyBOb3cgc2V0IHRoZSBob3ZlciBzdGF0ZSBmb3Igb3VyIG5ldyBv
YmplY3QgdXAgdG8gdGhlIHJvb3QuCisgICAgZm9yIChSZW5kZXJPYmplY3QqIGN1cnIgPSBuZXdI
b3Zlck9iajsgY3VycjsgY3VyciA9IGN1cnItPmhvdmVyQW5jZXN0b3IoKSkgeworICAgICAgICBp
ZiAoY3Vyci0+bm9kZSgpICYmICFjdXJyLT5pc1RleHQoKSAmJiAoIW11c3RCZUluQWN0aXZlQ2hh
aW4gfHwgY3Vyci0+bm9kZSgpLT5pbkFjdGl2ZUNoYWluKCkpKQorICAgICAgICAgICAgbm9kZXNU
b0FkZFRvQ2hhaW4uYXBwZW5kKGN1cnItPm5vZGUoKSk7CisgICAgfQorCisgICAgc2l6ZV90IHJl
bW92ZUNvdW50ID0gbm9kZXNUb1JlbW92ZUZyb21DaGFpbi5zaXplKCk7CisgICAgZm9yIChzaXpl
X3QgaSA9IDA7IGkgPCByZW1vdmVDb3VudDsgKytpKQorICAgICAgICBub2Rlc1RvUmVtb3ZlRnJv
bUNoYWluW2ldLT5zZXRIb3ZlcmVkKGZhbHNlKTsKKworICAgIHNpemVfdCBhZGRDb3VudCA9IG5v
ZGVzVG9BZGRUb0NoYWluLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFkZENv
dW50OyArK2kpIHsKKyAgICAgICAgaWYgKGFsbG93QWN0aXZlQ2hhbmdlcykKKyAgICAgICAgICAg
IG5vZGVzVG9BZGRUb0NoYWluW2ldLT5zZXRBY3RpdmUodHJ1ZSk7CisgICAgICAgIG5vZGVzVG9B
ZGRUb0NoYWluW2ldLT5zZXRIb3ZlcmVkKHRydWUpOworICAgIH0KK30KKwordm9pZCBEb2N1bWVu
dDo6cmVwb3J0TWVtb3J5VXNhZ2UoTWVtb3J5T2JqZWN0SW5mbyogbWVtb3J5T2JqZWN0SW5mbykg
Y29uc3QKK3sKKyAgICBNZW1vcnlDbGFzc0luZm8gaW5mbyhtZW1vcnlPYmplY3RJbmZvLCB0aGlz
LCBXZWJDb3JlTWVtb3J5VHlwZXM6OkRPTSk7CisgICAgaW5mby5hZGRNZW1iZXIobV9zdHlsZVJl
c29sdmVyKTsKKyAgICBDb250YWluZXJOb2RlOjpyZXBvcnRNZW1vcnlVc2FnZShtZW1vcnlPYmpl
Y3RJbmZvKTsKKyAgICBpbmZvLmFkZFZlY3RvcihtX2N1c3RvbUZvbnRzKTsKKyAgICBpbmZvLmFk
ZE1lbWJlcihtX3VybCk7CisgICAgaW5mby5hZGRNZW1iZXIobV9iYXNlVVJMKTsKKyAgICBpbmZv
LmFkZE1lbWJlcihtX2Jhc2VVUkxPdmVycmlkZSk7CisgICAgaW5mby5hZGRNZW1iZXIobV9iYXNl
RWxlbWVudFVSTCk7CisgICAgaW5mby5hZGRNZW1iZXIobV9jb29raWVVUkwpOworICAgIGluZm8u
YWRkTWVtYmVyKG1fZmlyc3RQYXJ0eUZvckNvb2tpZXMpOworICAgIGluZm8uYWRkTWVtYmVyKG1f
ZG9jdW1lbnRVUkkpOworICAgIGluZm8uYWRkTWVtYmVyKG1fYmFzZVRhcmdldCk7CisgICAgaW5m
by5hZGRNZW1iZXIobV9mcmFtZSk7CisgICAgaW5mby5hZGRNZW1iZXIobV9jYWNoZWRSZXNvdXJj
ZUxvYWRlcik7CisgICAgaW5mby5hZGRNZW1iZXIobV9lbGVtU2hlZXQpOworICAgIGluZm8uYWRk
TWVtYmVyKG1fcGFnZVVzZXJTaGVldCk7CisgICAgaWYgKG1fcGFnZUdyb3VwVXNlclNoZWV0cykK
KyAgICAgICAgaW5mby5hZGRJbnN0cnVtZW50ZWRWZWN0b3JQdHIobV9wYWdlR3JvdXBVc2VyU2hl
ZXRzKTsKKyAgICBpZiAobV91c2VyU2hlZXRzKQorICAgICAgICBpbmZvLmFkZEluc3RydW1lbnRl
ZFZlY3RvclB0cihtX3VzZXJTaGVldHMpOworICAgIGluZm8uYWRkSGFzaFNldChtX25vZGVJdGVy
YXRvcnMpOworICAgIGluZm8uYWRkSGFzaFNldChtX3Jhbmdlcyk7CisgICAgaW5mby5hZGRMaXN0
SGFzaFNldChtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcyk7CisgICAgaW5mby5hZGRNZW1iZXIo
bV9wcmVmZXJyZWRTdHlsZXNoZWV0U2V0KTsKKyAgICBpbmZvLmFkZE1lbWJlcihtX3NlbGVjdGVk
U3R5bGVzaGVldFNldCk7CisgICAgaW5mby5hZGRNZW1iZXIobV90aXRsZS5zdHJpbmcoKSk7Cisg
ICAgaW5mby5hZGRNZW1iZXIobV9yYXdUaXRsZS5zdHJpbmcoKSk7CisgICAgaW5mby5hZGRNZW1i
ZXIobV94bWxFbmNvZGluZyk7CisgICAgaW5mby5hZGRNZW1iZXIobV94bWxWZXJzaW9uKTsKKyAg
ICBpbmZvLmFkZE1lbWJlcihtX2NvbnRlbnRMYW5ndWFnZSk7CisgICAgaW5mby5hZGRIYXNoTWFw
KG1fZG9jdW1lbnROYW1lZEl0ZW1Db2xsZWN0aW9ucyk7CisgICAgaW5mby5hZGRIYXNoTWFwKG1f
d2luZG93TmFtZWRJdGVtQ29sbGVjdGlvbnMpOworI2lmIEVOQUJMRShEQVNIQk9BUkRfU1VQUE9S
VCkKKyAgICBpbmZvLmFkZFZlY3RvcihtX2Rhc2hib2FyZFJlZ2lvbnMpOworI2VuZGlmCisgICAg
aW5mby5hZGRIYXNoTWFwKG1fY3NzQ2FudmFzRWxlbWVudHMpOworICAgIGluZm8uYWRkVmVjdG9y
KG1faWNvblVSTHMpOworICAgIGluZm8uYWRkSGFzaFNldChtX2RvY3VtZW50U3VzcGVuc2lvbkNh
bGxiYWNrRWxlbWVudHMpOworICAgIGluZm8uYWRkSGFzaFNldChtX21lZGlhVm9sdW1lQ2FsbGJh
Y2tFbGVtZW50cyk7CisgICAgaW5mby5hZGRIYXNoU2V0KG1fcHJpdmF0ZUJyb3dzaW5nU3RhdGVD
aGFuZ2VkRWxlbWVudHMpOworICAgIGluZm8uYWRkSGFzaE1hcChtX2VsZW1lbnRzQnlBY2Nlc3NL
ZXkpOworICAgIGluZm8uYWRkTWVtYmVyKG1fZXZlbnRRdWV1ZSk7CisgICAgaW5mby5hZGRIYXNo
U2V0KG1fbWVkaWFDYW5TdGFydExpc3RlbmVycyk7CisgICAgaW5mby5hZGRWZWN0b3IobV9wZW5k
aW5nVGFza3MpOworfQorCisjaWYgRU5BQkxFKFVORE9fTUFOQUdFUikKK1Bhc3NSZWZQdHI8VW5k
b01hbmFnZXI+IERvY3VtZW50Ojp1bmRvTWFuYWdlcigpCit7CisgICAgaWYgKCFtX3VuZG9NYW5h
Z2VyKQorICAgICAgICBtX3VuZG9NYW5hZ2VyID0gVW5kb01hbmFnZXI6OmNyZWF0ZSh0aGlzKTsK
KyAgICByZXR1cm4gbV91bmRvTWFuYWdlcjsKK30KKyNlbmRpZgorCitjbGFzcyBJbW11dGFibGVB
dHRyaWJ1dGVEYXRhQ2FjaGVLZXkgeworcHVibGljOgorICAgIEltbXV0YWJsZUF0dHJpYnV0ZURh
dGFDYWNoZUtleShjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lLCBjb25zdCBBdHRyaWJ1dGUq
IGF0dHJpYnV0ZXMsIHVuc2lnbmVkIGF0dHJpYnV0ZUNvdW50KQorICAgICAgICA6IG1fdGFnUU5h
bWUodGFnTmFtZSkKKyAgICAgICAgLCBtX2F0dHJpYnV0ZXMoYXR0cmlidXRlcykKKyAgICAgICAg
LCBtX2F0dHJpYnV0ZUNvdW50KGF0dHJpYnV0ZUNvdW50KQorICAgIHsgfQorCisgICAgYm9vbCBv
cGVyYXRvciE9KGNvbnN0IEltbXV0YWJsZUF0dHJpYnV0ZURhdGFDYWNoZUtleSYgb3RoZXIpIGNv
bnN0CisgICAgeworICAgICAgICBpZiAobV90YWdRTmFtZSAhPSBvdGhlci5tX3RhZ1FOYW1lKQor
ICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChtX2F0dHJpYnV0ZUNvdW50ICE9
IG90aGVyLm1fYXR0cmlidXRlQ291bnQpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAg
ICAgcmV0dXJuIG1lbWNtcChtX2F0dHJpYnV0ZXMsIG90aGVyLm1fYXR0cmlidXRlcywgc2l6ZW9m
KEF0dHJpYnV0ZSkgKiBtX2F0dHJpYnV0ZUNvdW50KTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBo
YXNoKCkgY29uc3QKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIGF0dHJpYnV0ZUhhc2ggPSBTdHJp
bmdIYXNoZXI6Omhhc2hNZW1vcnkobV9hdHRyaWJ1dGVzLCBtX2F0dHJpYnV0ZUNvdW50ICogc2l6
ZW9mKEF0dHJpYnV0ZSkpOworICAgICAgICByZXR1cm4gV1RGOjpwYWlySW50SGFzaChtX3RhZ1FO
YW1lLmxvY2FsTmFtZSgpLmltcGwoKS0+ZXhpc3RpbmdIYXNoKCksIGF0dHJpYnV0ZUhhc2gpOwor
ICAgIH0KKworcHJpdmF0ZToKKyAgICBRdWFsaWZpZWROYW1lIG1fdGFnUU5hbWU7CisgICAgY29u
c3QgQXR0cmlidXRlKiBtX2F0dHJpYnV0ZXM7CisgICAgdW5zaWduZWQgbV9hdHRyaWJ1dGVDb3Vu
dDsKK307CisKK3N0cnVjdCBJbW11dGFibGVBdHRyaWJ1dGVEYXRhQ2FjaGVFbnRyeSB7CisgICAg
SW1tdXRhYmxlQXR0cmlidXRlRGF0YUNhY2hlRW50cnkoY29uc3QgSW1tdXRhYmxlQXR0cmlidXRl
RGF0YUNhY2hlS2V5JiBrLCBQYXNzUmVmUHRyPEVsZW1lbnRBdHRyaWJ1dGVEYXRhPiB2KQorICAg
ICAgICA6IGtleShrKQorICAgICAgICAsIHZhbHVlKHYpCisgICAgeyB9CisKKyAgICBJbW11dGFi
bGVBdHRyaWJ1dGVEYXRhQ2FjaGVLZXkga2V5OworICAgIFJlZlB0cjxFbGVtZW50QXR0cmlidXRl
RGF0YT4gdmFsdWU7Cit9OworCitQYXNzUmVmUHRyPEVsZW1lbnRBdHRyaWJ1dGVEYXRhPiBEb2N1
bWVudDo6Y2FjaGVkSW1tdXRhYmxlQXR0cmlidXRlRGF0YShjb25zdCBFbGVtZW50KiBlbGVtZW50
LCBjb25zdCBWZWN0b3I8QXR0cmlidXRlPiYgYXR0cmlidXRlcykKK3sKKyAgICBBU1NFUlQoIWF0
dHJpYnV0ZXMuaXNFbXB0eSgpKTsKKworICAgIEltbXV0YWJsZUF0dHJpYnV0ZURhdGFDYWNoZUtl
eSBjYWNoZUtleShlbGVtZW50LT50YWdRTmFtZSgpLCBhdHRyaWJ1dGVzLmRhdGEoKSwgYXR0cmli
dXRlcy5zaXplKCkpOworICAgIHVuc2lnbmVkIGNhY2hlSGFzaCA9IGNhY2hlS2V5Lmhhc2goKTsK
KworICAgIEltbXV0YWJsZUF0dHJpYnV0ZURhdGFDYWNoZTo6aXRlcmF0b3IgY2FjaGVJdGVyYXRv
ciA9IG1faW1tdXRhYmxlQXR0cmlidXRlRGF0YUNhY2hlLmFkZChjYWNoZUhhc2gsIG51bGxwdHIp
Lml0ZXJhdG9yOworICAgIGlmIChjYWNoZUl0ZXJhdG9yLT5zZWNvbmQgJiYgY2FjaGVJdGVyYXRv
ci0+c2Vjb25kLT5rZXkgIT0gY2FjaGVLZXkpCisgICAgICAgIGNhY2hlSGFzaCA9IDA7CisKKyAg
ICBSZWZQdHI8RWxlbWVudEF0dHJpYnV0ZURhdGE+IGF0dHJpYnV0ZURhdGE7CisgICAgaWYgKGNh
Y2hlSGFzaCAmJiBjYWNoZUl0ZXJhdG9yLT5zZWNvbmQpCisgICAgICAgIGF0dHJpYnV0ZURhdGEg
PSBjYWNoZUl0ZXJhdG9yLT5zZWNvbmQtPnZhbHVlOworICAgIGVsc2UKKyAgICAgICAgYXR0cmli
dXRlRGF0YSA9IEVsZW1lbnRBdHRyaWJ1dGVEYXRhOjpjcmVhdGVJbW11dGFibGUoYXR0cmlidXRl
cyk7CisKKyAgICBpZiAoIWNhY2hlSGFzaCB8fCBjYWNoZUl0ZXJhdG9yLT5zZWNvbmQpCisgICAg
ICAgIHJldHVybiBhdHRyaWJ1dGVEYXRhLnJlbGVhc2UoKTsKKworICAgIGNhY2hlSXRlcmF0b3It
PnNlY29uZCA9IGFkb3B0UHRyKG5ldyBJbW11dGFibGVBdHRyaWJ1dGVEYXRhQ2FjaGVFbnRyeShJ
bW11dGFibGVBdHRyaWJ1dGVEYXRhQ2FjaGVLZXkoZWxlbWVudC0+dGFnUU5hbWUoKSwgYXR0cmli
dXRlRGF0YS0+aW1tdXRhYmxlQXR0cmlidXRlQXJyYXkoKSwgYXR0cmlidXRlRGF0YS0+bGVuZ3Ro
KCkpLCBhdHRyaWJ1dGVEYXRhKSk7CisKKyAgICByZXR1cm4gYXR0cmlidXRlRGF0YS5yZWxlYXNl
KCk7Cit9CisKK0xvY2FsaXplciYgRG9jdW1lbnQ6OmdldExvY2FsaXplcihjb25zdCBBdG9taWNT
dHJpbmcmIGxvY2FsZSkKK3sKKyAgICBBdG9taWNTdHJpbmcgbG9jYWxlS2V5ID0gbG9jYWxlOwor
ICAgIGlmIChsb2NhbGUuaXNFbXB0eSgpIHx8ICFSdW50aW1lRW5hYmxlZEZlYXR1cmVzOjpsYW5n
QXR0cmlidXRlQXdhcmVGb3JtQ29udHJvbFVJRW5hYmxlZCgpKQorICAgICAgICBsb2NhbGVLZXkg
PSBkZWZhdWx0TGFuZ3VhZ2UoKTsKKyAgICBMb2NhbGVUb0xvY2FsaXplck1hcDo6QWRkUmVzdWx0
IHJlc3VsdCA9IG1fbG9jYWxpemVyQ2FjaGUuYWRkKGxvY2FsZUtleSwgbnVsbHB0cik7CisgICAg
aWYgKHJlc3VsdC5pc05ld0VudHJ5KQorICAgICAgICByZXN1bHQuaXRlcmF0b3ItPnNlY29uZCA9
IExvY2FsaXplcjo6Y3JlYXRlKGxvY2FsZUtleSk7CisgICAgcmV0dXJuICoocmVzdWx0Lml0ZXJh
dG9yLT5zZWNvbmQpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBTb3VyY2Uv
V2ViQ29yZS9kb20vRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYkNvcmUvZG9tL0RvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uY3BwCShy
ZXZpc2lvbiAxMjkzMDMpCisrKyBTb3VyY2UvV2ViQ29yZS9kb20vRG9jdW1lbnRTdHlsZVNoZWV0
Q29sbGVjdGlvbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI2LDYzMCArMjYsNTIgQEAKICAqLwog
CiAjaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJE
b2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmgiCiAKLSNpbmNsdWRlICJBWE9iamVjdENhY2hl
LmgiCi0jaW5jbHVkZSAiQW5pbWF0aW9uQ29udHJvbGxlci5oIgotI2luY2x1ZGUgIkF0dHIuaCIK
LSNpbmNsdWRlICJBdHRyaWJ1dGUuaCIKLSNpbmNsdWRlICJDREFUQVNlY3Rpb24uaCIKLSNpbmNs
dWRlICJDU1NQYXJzZXIuaCIKLSNpbmNsdWRlICJDU1NTdHlsZURlY2xhcmF0aW9uLmgiCiAjaW5j
bHVkZSAiQ1NTU3R5bGVTaGVldC5oIgotI2luY2x1ZGUgIkNTU1ZhbHVlS2V5d29yZHMuaCIKLSNp
bmNsdWRlICJDYWNoZWRDU1NTdHlsZVNoZWV0LmgiCi0jaW5jbHVkZSAiQ2FjaGVkUmVzb3VyY2VM
b2FkZXIuaCIKLSNpbmNsdWRlICJDaHJvbWUuaCIKLSNpbmNsdWRlICJDaHJvbWVDbGllbnQuaCIK
LSNpbmNsdWRlICJDb21tZW50LmgiCi0jaW5jbHVkZSAiQ29uc29sZS5oIgotI2luY2x1ZGUgIkNv
bnRlbnRTZWN1cml0eVBvbGljeS5oIgotI2luY2x1ZGUgIkNvbnRleHRGZWF0dXJlcy5oIgotI2lu
Y2x1ZGUgIkNvb2tpZUphci5oIgotI2luY2x1ZGUgIkRPTUltcGxlbWVudGF0aW9uLmgiCi0jaW5j
bHVkZSAiRE9NTmFtZWRGbG93Q29sbGVjdGlvbi5oIgotI2luY2x1ZGUgIkRPTVNlbGVjdGlvbi5o
IgotI2luY2x1ZGUgIkRPTVdpbmRvdy5oIgotI2luY2x1ZGUgIkRhdGVDb21wb25lbnRzLmgiCi0j
aW5jbHVkZSAiRGV2aWNlTW90aW9uQ29udHJvbGxlci5oIgotI2luY2x1ZGUgIkRldmljZU9yaWVu
dGF0aW9uQ29udHJvbGxlci5oIgotI2luY2x1ZGUgIkRvY3VtZW50RXZlbnRRdWV1ZS5oIgotI2lu
Y2x1ZGUgIkRvY3VtZW50RnJhZ21lbnQuaCIKLSNpbmNsdWRlICJEb2N1bWVudExvYWRlci5oIgot
I2luY2x1ZGUgIkRvY3VtZW50TWFya2VyQ29udHJvbGxlci5oIgotI2luY2x1ZGUgIkRvY3VtZW50
VHlwZS5oIgotI2luY2x1ZGUgIkVkaXRpbmdUZXh0LmgiCi0jaW5jbHVkZSAiRWRpdG9yLmgiCisj
aW5jbHVkZSAiRG9jdW1lbnQuaCIKICNpbmNsdWRlICJFbGVtZW50LmgiCi0jaW5jbHVkZSAiRWxl
bWVudFNoYWRvdy5oIgotI2luY2x1ZGUgIkVudGl0eVJlZmVyZW5jZS5oIgotI2luY2x1ZGUgIkV2
ZW50LmgiCi0jaW5jbHVkZSAiRXZlbnRGYWN0b3J5LmgiCi0jaW5jbHVkZSAiRXZlbnRIYW5kbGVy
LmgiCi0jaW5jbHVkZSAiRXZlbnRMaXN0ZW5lci5oIgotI2luY2x1ZGUgIkV2ZW50TmFtZXMuaCIK
LSNpbmNsdWRlICJFeGNlcHRpb25Db2RlLmgiCi0jaW5jbHVkZSAiRmxvd1RocmVhZENvbnRyb2xs
ZXIuaCIKLSNpbmNsdWRlICJGb2N1c0NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJGb3JtQ29udHJv
bGxlci5oIgotI2luY2x1ZGUgIkZyYW1lLmgiCi0jaW5jbHVkZSAiRnJhbWVMb2FkZXIuaCIKLSNp
bmNsdWRlICJGcmFtZUxvYWRlckNsaWVudC5oIgotI2luY2x1ZGUgIkZyYW1lU2VsZWN0aW9uLmgi
Ci0jaW5jbHVkZSAiRnJhbWVUcmVlLmgiCi0jaW5jbHVkZSAiRnJhbWVWaWV3LmgiCi0jaW5jbHVk
ZSAiR2VvbG9jYXRpb25Db250cm9sbGVyLmgiCi0jaW5jbHVkZSAiSGFzaENoYW5nZUV2ZW50Lmgi
Ci0jaW5jbHVkZSAiSGlzdG9ncmFtU3VwcG9ydC5oIgotI2luY2x1ZGUgIkhpc3RvcnkuaCIKLSNp
bmNsdWRlICJIVE1MQWxsQ29sbGVjdGlvbi5oIgotI2luY2x1ZGUgIkhUTUxBbmNob3JFbGVtZW50
LmgiCi0jaW5jbHVkZSAiSFRNTEJvZHlFbGVtZW50LmgiCi0jaW5jbHVkZSAiSFRNTENhbnZhc0Vs
ZW1lbnQuaCIKLSNpbmNsdWRlICJIVE1MQ29sbGVjdGlvbi5oIgotI2luY2x1ZGUgIkhUTUxEb2N1
bWVudC5oIgotI2luY2x1ZGUgIkhUTUxFbGVtZW50RmFjdG9yeS5oIgotI2luY2x1ZGUgIkhUTUxG
cmFtZU93bmVyRWxlbWVudC5oIgotI2luY2x1ZGUgIkhUTUxIZWFkRWxlbWVudC5oIgotI2luY2x1
ZGUgIkhUTUxJRnJhbWVFbGVtZW50LmgiCiAjaW5jbHVkZSAiSFRNTExpbmtFbGVtZW50LmgiCi0j
aW5jbHVkZSAiSFRNTE1hcEVsZW1lbnQuaCIKLSNpbmNsdWRlICJIVE1MTmFtZUNvbGxlY3Rpb24u
aCIKICNpbmNsdWRlICJIVE1MTmFtZXMuaCIKLSNpbmNsdWRlICJIVE1MUGFyc2VySWRpb21zLmgi
CiAjaW5jbHVkZSAiSFRNTFN0eWxlRWxlbWVudC5oIgotI2luY2x1ZGUgIkhUTUxUaXRsZUVsZW1l
bnQuaCIKLSNpbmNsdWRlICJIVFRQUGFyc2Vycy5oIgotI2luY2x1ZGUgIkhpdFRlc3RSZXF1ZXN0
LmgiCi0jaW5jbHVkZSAiSGl0VGVzdFJlc3VsdC5oIgotI2luY2x1ZGUgIkltYWdlTG9hZGVyLmgi
Ci0jaW5jbHVkZSAiSW5zcGVjdG9yQ291bnRlcnMuaCIKLSNpbmNsdWRlICJJbnNwZWN0b3JJbnN0
cnVtZW50YXRpb24uaCIKLSNpbmNsdWRlICJMYW5ndWFnZS5oIgotI2luY2x1ZGUgIkxvY2FsaXpl
ci5oIgotI2luY2x1ZGUgIkxvZ2dpbmcuaCIKLSNpbmNsdWRlICJNZWRpYVF1ZXJ5TGlzdC5oIgot
I2luY2x1ZGUgIk1lZGlhUXVlcnlNYXRjaGVyLmgiCi0jaW5jbHVkZSAiTW91c2VFdmVudFdpdGhI
aXRUZXN0UmVzdWx0cy5oIgotI2luY2x1ZGUgIk5hbWVOb2RlTGlzdC5oIgotI2luY2x1ZGUgIk5h
bWVkRmxvd0NvbGxlY3Rpb24uaCIKLSNpbmNsdWRlICJOZXN0aW5nTGV2ZWxJbmNyZW1lbnRlci5o
IgotI2luY2x1ZGUgIk5ld1hNTERvY3VtZW50UGFyc2VyLmgiCi0jaW5jbHVkZSAiTm9kZUZpbHRl
ci5oIgotI2luY2x1ZGUgIk5vZGVJdGVyYXRvci5oIgotI2luY2x1ZGUgIk5vZGVSYXJlRGF0YS5o
IgotI2luY2x1ZGUgIk5vZGVXaXRoSW5kZXguaCIKICNpbmNsdWRlICJQYWdlLmgiCiAjaW5jbHVk
ZSAiUGFnZUdyb3VwLmgiCi0jaW5jbHVkZSAiUGFnZVRyYW5zaXRpb25FdmVudC5oIgotI2luY2x1
ZGUgIlBsYXRmb3JtS2V5Ym9hcmRFdmVudC5oIgotI2luY2x1ZGUgIlBsdWdpbkRvY3VtZW50Lmgi
Ci0jaW5jbHVkZSAiUG9pbnRlckxvY2tDb250cm9sbGVyLmgiCi0jaW5jbHVkZSAiUG9wU3RhdGVF
dmVudC5oIgogI2luY2x1ZGUgIlByb2Nlc3NpbmdJbnN0cnVjdGlvbi5oIgotI2luY2x1ZGUgIlJl
Z2lzdGVyZWRFdmVudExpc3RlbmVyLmgiCi0jaW5jbHVkZSAiUmVuZGVyQXJlbmEuaCIKLSNpbmNs
dWRlICJSZW5kZXJOYW1lZEZsb3dUaHJlYWQuaCIKLSNpbmNsdWRlICJSZW5kZXJUZXh0Q29udHJv
bC5oIgotI2luY2x1ZGUgIlJlbmRlclZpZXcuaCIKLSNpbmNsdWRlICJSZW5kZXJXaWRnZXQuaCIK
LSNpbmNsdWRlICJSdW50aW1lRW5hYmxlZEZlYXR1cmVzLmgiCi0jaW5jbHVkZSAiU2NoZW1lUmVn
aXN0cnkuaCIKLSNpbmNsdWRlICJTY29wZWRFdmVudFF1ZXVlLmgiCi0jaW5jbHVkZSAiU2NyaXB0
Q2FsbFN0YWNrLmgiCi0jaW5jbHVkZSAiU2NyaXB0Q29udHJvbGxlci5oIgotI2luY2x1ZGUgIlNj
cmlwdEVsZW1lbnQuaCIKLSNpbmNsdWRlICJTY3JpcHRFdmVudExpc3RlbmVyLmgiCi0jaW5jbHVk
ZSAiU2NyaXB0UnVubmVyLmgiCi0jaW5jbHVkZSAiU2Nyb2xsaW5nQ29vcmRpbmF0b3IuaCIKLSNp
bmNsdWRlICJTZWN1cml0eU9yaWdpbi5oIgotI2luY2x1ZGUgIlNlY3VyaXR5UG9saWN5LmgiCi0j
aW5jbHVkZSAiU2VnbWVudGVkU3RyaW5nLmgiCi0jaW5jbHVkZSAiU2VsZWN0b3JRdWVyeS5oIgor
I2luY2x1ZGUgIlNWR05hbWVzLmgiCisjaW5jbHVkZSAiU1ZHU3R5bGVFbGVtZW50LmgiCisjaW5j
bHVkZSAiU2VsZWN0b3JDaGVja2VyLmgiCiAjaW5jbHVkZSAiU2V0dGluZ3MuaCIKLSNpbmNsdWRl
ICJTaGFkb3dSb290LmgiCi0jaW5jbHVkZSAiU3RhdGljSGFzaFNldE5vZGVMaXN0LmgiCiAjaW5j
bHVkZSAiU3R5bGVSZXNvbHZlci5oIgogI2luY2x1ZGUgIlN0eWxlU2hlZXRDb250ZW50cy5oIgog
I2luY2x1ZGUgIlN0eWxlU2hlZXRMaXN0LmgiCi0jaW5jbHVkZSAiVGV4dFJlc291cmNlRGVjb2Rl
ci5oIgotI2luY2x1ZGUgIlRpbWVyLmgiCi0jaW5jbHVkZSAiVHJhbnNmb3JtU291cmNlLmgiCi0j
aW5jbHVkZSAiVHJlZVdhbGtlci5oIgotI2luY2x1ZGUgIlVuZG9NYW5hZ2VyLmgiCiAjaW5jbHVk
ZSAiVXNlckNvbnRlbnRVUkxQYXR0ZXJuLmgiCiAjaW5jbHVkZSAiV2ViQ29yZU1lbW9yeUluc3Ry
dW1lbnRhdGlvbi5oIgotI2luY2x1ZGUgIldlYktpdE5hbWVkRmxvdy5oIgotI2luY2x1ZGUgIlhN
TERvY3VtZW50UGFyc2VyLmgiCi0jaW5jbHVkZSAiWE1MSHR0cFJlcXVlc3QuaCIKLSNpbmNsdWRl
ICJYTUxOU05hbWVzLmgiCi0jaW5jbHVkZSAiWE1MTmFtZXMuaCIKLSNpbmNsdWRlICJYUGF0aEV2
YWx1YXRvci5oIgotI2luY2x1ZGUgIlhQYXRoRXhwcmVzc2lvbi5oIgotI2luY2x1ZGUgIlhQYXRo
TlNSZXNvbHZlci5oIgotI2luY2x1ZGUgIlhQYXRoUmVzdWx0LmgiCi0jaW5jbHVkZSAiaHRtbGVk
aXRpbmcuaCIKLSNpbmNsdWRlIDx3dGYvQ3VycmVudFRpbWUuaD4KLSNpbmNsdWRlIDx3dGYvSGFz
aEZ1bmN0aW9ucy5oPgotI2luY2x1ZGUgPHd0Zi9NYWluVGhyZWFkLmg+Ci0jaW5jbHVkZSA8d3Rm
L1Bhc3NSZWZQdHIuaD4KLSNpbmNsdWRlIDx3dGYvU3RkTGliRXh0cmFzLmg+Ci0jaW5jbHVkZSA8
d3RmL3RleHQvU3RyaW5nQnVmZmVyLmg+Ci0KLSNpZiBFTkFCTEUoU0hBUkVEX1dPUktFUlMpCi0j
aW5jbHVkZSAiU2hhcmVkV29ya2VyUmVwb3NpdG9yeS5oIgotI2VuZGlmCi0KLSNpZiBFTkFCTEUo
WFNMVCkKLSNpbmNsdWRlICJYU0xUUHJvY2Vzc29yLmgiCi0jZW5kaWYKLQotI2lmIEVOQUJMRShT
VkcpCi0jaW5jbHVkZSAiU1ZHRG9jdW1lbnRFeHRlbnNpb25zLmgiCi0jaW5jbHVkZSAiU1ZHRWxl
bWVudEZhY3RvcnkuaCIKLSNpbmNsdWRlICJTVkdOYW1lcy5oIgotI2luY2x1ZGUgIlNWR1NWR0Vs
ZW1lbnQuaCIKLSNpbmNsdWRlICJTVkdTdHlsZUVsZW1lbnQuaCIKLSNlbmRpZgotCi0jaWYgRU5B
QkxFKFRPVUNIX0VWRU5UUykKLSNpbmNsdWRlICJUb3VjaExpc3QuaCIKLSNlbmRpZgotCi0jaWYg
RU5BQkxFKE1BVEhNTCkKLSNpbmNsdWRlICJNYXRoTUxFbGVtZW50LmgiCi0jaW5jbHVkZSAiTWF0
aE1MRWxlbWVudEZhY3RvcnkuaCIKLSNpbmNsdWRlICJNYXRoTUxOYW1lcy5oIgotI2VuZGlmCi0K
LSNpZiBFTkFCTEUoRlVMTFNDUkVFTl9BUEkpCi0jaW5jbHVkZSAiUmVuZGVyRnVsbFNjcmVlbi5o
IgotI2VuZGlmCi0KLSNpZiBFTkFCTEUoUkVRVUVTVF9BTklNQVRJT05fRlJBTUUpCi0jaW5jbHVk
ZSAiUmVxdWVzdEFuaW1hdGlvbkZyYW1lQ2FsbGJhY2suaCIKLSNpbmNsdWRlICJTY3JpcHRlZEFu
aW1hdGlvbkNvbnRyb2xsZXIuaCIKLSNlbmRpZgotCi0jaWYgRU5BQkxFKE1JQ1JPREFUQSkKLSNp
bmNsdWRlICJNaWNyb0RhdGFJdGVtTGlzdC5oIgotI2luY2x1ZGUgIk5vZGVSYXJlRGF0YS5oIgot
I2VuZGlmCi0KLSNpZiBFTkFCTEUoTElOS19QUkVSRU5ERVIpCi0jaW5jbHVkZSAiUHJlcmVuZGVy
ZXIuaCIKLSNlbmRpZgotCi0jaWYgRU5BQkxFKFRFWFRfQVVUT1NJWklORykKLSNpbmNsdWRlICJU
ZXh0QXV0b3NpemVyLmgiCi0jZW5kaWYKLQotI2lmIEVOQUJMRShDU1BfTkVYVCkKLSNpbmNsdWRl
ICJET01TZWN1cml0eVBvbGljeS5oIgotI2VuZGlmCi0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11
c2luZyBuYW1lc3BhY2UgV1RGOwotdXNpbmcgbmFtZXNwYWNlIFVuaWNvZGU7CiAKIG5hbWVzcGFj
ZSBXZWJDb3JlIHsKIAogdXNpbmcgbmFtZXNwYWNlIEhUTUxOYW1lczsKIAotLy8gI2RlZmluZSBJ
TlNUUlVNRU5UX0xBWU9VVF9TQ0hFRFVMSU5HIDEKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNN
YXhXcml0ZVJlY3Vyc2lvbkRlcHRoID0gMjE7Ci0KLS8vIFRoaXMgYW1vdW50IG9mIHRpbWUgbXVz
dCBoYXZlIGVsYXBzZWQgYmVmb3JlIHdlIHdpbGwgZXZlbiBjb25zaWRlciBzY2hlZHVsaW5nIGEg
bGF5b3V0IHdpdGhvdXQgYSBkZWxheS4KLS8vIEZJWE1FOiBGb3IgZmFzdGVyIG1hY2hpbmVzIHRo
aXMgdmFsdWUgY2FuIHJlYWxseSBiZSBsb3dlcmVkIHRvIDIwMC4gIDI1MCBpcyBhZGVxdWF0ZSwg
YnV0IGEgbGl0dGxlIGhpZ2gKLS8vIGZvciBkdWFsIEc1cy4gOikKLXN0YXRpYyBjb25zdCBpbnQg
Y0xheW91dFNjaGVkdWxlVGhyZXNob2xkID0gMjUwOwotCi0vLyBET00gTGV2ZWwgMiBzYXlzIChs
ZXR0ZXJzIGFkZGVkKToKLS8vCi0vLyBhKSBOYW1lIHN0YXJ0IGNoYXJhY3RlcnMgbXVzdCBoYXZl
IG9uZSBvZiB0aGUgY2F0ZWdvcmllcyBMbCwgTHUsIExvLCBMdCwgTmwuCi0vLyBiKSBOYW1lIGNo
YXJhY3RlcnMgb3RoZXIgdGhhbiBOYW1lLXN0YXJ0IGNoYXJhY3RlcnMgbXVzdCBoYXZlIG9uZSBv
ZiB0aGUgY2F0ZWdvcmllcyBNYywgTWUsIE1uLCBMbSwgb3IgTmQuCi0vLyBjKSBDaGFyYWN0ZXJz
IGluIHRoZSBjb21wYXRpYmlsaXR5IGFyZWEgKGkuZS4gd2l0aCBjaGFyYWN0ZXIgY29kZSBncmVh
dGVyIHRoYW4gI3hGOTAwIGFuZCBsZXNzIHRoYW4gI3hGRkZFKSBhcmUgbm90IGFsbG93ZWQgaW4g
WE1MIG5hbWVzLgotLy8gZCkgQ2hhcmFjdGVycyB3aGljaCBoYXZlIGEgZm9udCBvciBjb21wYXRp
YmlsaXR5IGRlY29tcG9zaXRpb24gKGkuZS4gdGhvc2Ugd2l0aCBhICJjb21wYXRpYmlsaXR5IGZv
cm1hdHRpbmcgdGFnIiBpbiBmaWVsZCA1IG9mIHRoZSBkYXRhYmFzZSAtLSBtYXJrZWQgYnkgZmll
bGQgNSBiZWdpbm5pbmcgd2l0aCBhICI8IikgYXJlIG5vdCBhbGxvd2VkLgotLy8gZSkgVGhlIGZv
bGxvd2luZyBjaGFyYWN0ZXJzIGFyZSB0cmVhdGVkIGFzIG5hbWUtc3RhcnQgY2hhcmFjdGVycyBy
YXRoZXIgdGhhbiBuYW1lIGNoYXJhY3RlcnMsIGJlY2F1c2UgdGhlIHByb3BlcnR5IGZpbGUgY2xh
c3NpZmllcyB0aGVtIGFzIEFscGhhYmV0aWM6IFsjeDAyQkItI3gwMkMxXSwgI3gwNTU5LCAjeDA2
RTUsICN4MDZFNi4KLS8vIGYpIENoYXJhY3RlcnMgI3gyMERELSN4MjBFMCBhcmUgZXhjbHVkZWQg
KGluIGFjY29yZGFuY2Ugd2l0aCBVbmljb2RlLCBzZWN0aW9uIDUuMTQpLgotLy8gZykgQ2hhcmFj
dGVyICN4MDBCNyBpcyBjbGFzc2lmaWVkIGFzIGFuIGV4dGVuZGVyLCBiZWNhdXNlIHRoZSBwcm9w
ZXJ0eSBsaXN0IHNvIGlkZW50aWZpZXMgaXQuCi0vLyBoKSBDaGFyYWN0ZXIgI3gwMzg3IGlzIGFk
ZGVkIGFzIGEgbmFtZSBjaGFyYWN0ZXIsIGJlY2F1c2UgI3gwMEI3IGlzIGl0cyBjYW5vbmljYWwg
ZXF1aXZhbGVudC4KLS8vIGkpIENoYXJhY3RlcnMgJzonIGFuZCAnXycgYXJlIGFsbG93ZWQgYXMg
bmFtZS1zdGFydCBjaGFyYWN0ZXJzLgotLy8gaikgQ2hhcmFjdGVycyAnLScgYW5kICcuJyBhcmUg
YWxsb3dlZCBhcyBuYW1lIGNoYXJhY3RlcnMuCi0vLwotLy8gSXQgYWxzbyBjb250YWlucyBjb21w
bGV0ZSB0YWJsZXMuIElmIHdlIGRlY2lkZSBpdCdzIGJldHRlciwgd2UgY291bGQgaW5jbHVkZSB0
aG9zZSBpbnN0ZWFkIG9mIHRoZSBmb2xsb3dpbmcgY29kZS4KLQotc3RhdGljIGlubGluZSBib29s
IGlzVmFsaWROYW1lU3RhcnQoVUNoYXIzMiBjKQotewotICAgIC8vIHJ1bGUgKGUpIGFib3ZlCi0g
ICAgaWYgKChjID49IDB4MDJCQiAmJiBjIDw9IDB4MDJDMSkgfHwgYyA9PSAweDU1OSB8fCBjID09
IDB4NkU1IHx8IGMgPT0gMHg2RTYpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgLy8gcnVs
ZSAoaSkgYWJvdmUKLSAgICBpZiAoYyA9PSAnOicgfHwgYyA9PSAnXycpCi0gICAgICAgIHJldHVy
biB0cnVlOwotCi0gICAgLy8gcnVsZXMgKGEpIGFuZCAoZikgYWJvdmUKLSAgICBjb25zdCB1aW50
MzJfdCBuYW1lU3RhcnRNYXNrID0gTGV0dGVyX0xvd2VyY2FzZSB8IExldHRlcl9VcHBlcmNhc2Ug
fCBMZXR0ZXJfT3RoZXIgfCBMZXR0ZXJfVGl0bGVjYXNlIHwgTnVtYmVyX0xldHRlcjsKLSAgICBp
ZiAoIShVbmljb2RlOjpjYXRlZ29yeShjKSAmIG5hbWVTdGFydE1hc2spKQotICAgICAgICByZXR1
cm4gZmFsc2U7Ci0KLSAgICAvLyBydWxlIChjKSBhYm92ZQotICAgIGlmIChjID49IDB4RjkwMCAm
JiBjIDwgMHhGRkZFKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBydWxlIChkKSBh
Ym92ZQotICAgIERlY29tcG9zaXRpb25UeXBlIGRlY29tcFR5cGUgPSBkZWNvbXBvc2l0aW9uVHlw
ZShjKTsKLSAgICBpZiAoZGVjb21wVHlwZSA9PSBEZWNvbXBvc2l0aW9uRm9udCB8fCBkZWNvbXBU
eXBlID09IERlY29tcG9zaXRpb25Db21wYXQpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAg
IHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgaXNWYWxpZE5hbWVQYXJ0KFVD
aGFyMzIgYykKLXsKLSAgICAvLyBydWxlcyAoYSksIChlKSwgYW5kIChpKSBhYm92ZQotICAgIGlm
IChpc1ZhbGlkTmFtZVN0YXJ0KGMpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIC8vIHJ1
bGVzIChnKSBhbmQgKGgpIGFib3ZlCi0gICAgaWYgKGMgPT0gMHgwMEI3IHx8IGMgPT0gMHgwMzg3
KQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIC8vIHJ1bGUgKGopIGFib3ZlCi0gICAgaWYg
KGMgPT0gJy0nIHx8IGMgPT0gJy4nKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIC8vIHJ1
bGVzIChiKSBhbmQgKGYpIGFib3ZlCi0gICAgY29uc3QgdWludDMyX3Qgb3RoZXJOYW1lUGFydE1h
c2sgPSBNYXJrX05vblNwYWNpbmcgfCBNYXJrX0VuY2xvc2luZyB8IE1hcmtfU3BhY2luZ0NvbWJp
bmluZyB8IExldHRlcl9Nb2RpZmllciB8IE51bWJlcl9EZWNpbWFsRGlnaXQ7Ci0gICAgaWYgKCEo
VW5pY29kZTo6Y2F0ZWdvcnkoYykgJiBvdGhlck5hbWVQYXJ0TWFzaykpCi0gICAgICAgIHJldHVy
biBmYWxzZTsKLQotICAgIC8vIHJ1bGUgKGMpIGFib3ZlCi0gICAgaWYgKGMgPj0gMHhGOTAwICYm
IGMgPCAweEZGRkUpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIHJ1bGUgKGQpIGFi
b3ZlCi0gICAgRGVjb21wb3NpdGlvblR5cGUgZGVjb21wVHlwZSA9IGRlY29tcG9zaXRpb25UeXBl
KGMpOwotICAgIGlmIChkZWNvbXBUeXBlID09IERlY29tcG9zaXRpb25Gb250IHx8IGRlY29tcFR5
cGUgPT0gRGVjb21wb3NpdGlvbkNvbXBhdCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAg
cmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sIHNob3VsZEluaGVyaXRTZWN1cml0eU9yaWdp
bkZyb21Pd25lcihjb25zdCBLVVJMJiB1cmwpCi17Ci0gICAgLy8gaHR0cDovL3d3dy53aGF0d2cu
b3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay8jb3JpZ2luLTAKLSAgICAvLwotICAgIC8v
IElmIGEgRG9jdW1lbnQgaGFzIHRoZSBhZGRyZXNzICJhYm91dDpibGFuayIKLSAgICAvLyAgICAg
VGhlIG9yaWdpbiBvZiB0aGUgRG9jdW1lbnQgaXMgdGhlIG9yaWdpbiBpdCB3YXMgYXNzaWduZWQg
d2hlbiBpdHMgYnJvd3NpbmcgY29udGV4dCB3YXMgY3JlYXRlZC4KLSAgICAvLwotICAgIC8vIE5v
dGU6IFdlIGdlbmVyYWxpemUgdGhpcyB0byBhbGwgImJsYW5rIiBVUkxzIGFuZCBpbnZhbGlkIFVS
THMgYmVjYXVzZSB3ZQotICAgIC8vIHRyZWF0IGFsbCBvZiB0aGVzZSBVUkxzIGFzIGFib3V0OmJs
YW5rLgotICAgIC8vCi0gICAgcmV0dXJuICF1cmwuaXNWYWxpZCgpIHx8IHVybC5pc0JsYW5rVVJM
KCk7Ci19Ci0KLXN0YXRpYyBXaWRnZXQqIHdpZGdldEZvck5vZGUoTm9kZSogZm9jdXNlZE5vZGUp
Ci17Ci0gICAgaWYgKCFmb2N1c2VkTm9kZSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgUmVuZGVy
T2JqZWN0KiByZW5kZXJlciA9IGZvY3VzZWROb2RlLT5yZW5kZXJlcigpOwotICAgIGlmICghcmVu
ZGVyZXIgfHwgIXJlbmRlcmVyLT5pc1dpZGdldCgpKQotICAgICAgICByZXR1cm4gMDsKLSAgICBy
ZXR1cm4gdG9SZW5kZXJXaWRnZXQocmVuZGVyZXIpLT53aWRnZXQoKTsKLX0KLQotc3RhdGljIGJv
b2wgYWNjZXB0c0VkaXRpbmdGb2N1cyhOb2RlKiBub2RlKQotewotICAgIEFTU0VSVChub2RlKTsK
LSAgICBBU1NFUlQobm9kZS0+cmVuZGVyZXJJc0VkaXRhYmxlKCkpOwotCi0gICAgTm9kZSogcm9v
dCA9IG5vZGUtPnJvb3RFZGl0YWJsZUVsZW1lbnQoKTsKLSAgICBGcmFtZSogZnJhbWUgPSBub2Rl
LT5kb2N1bWVudCgpLT5mcmFtZSgpOwotICAgIGlmICghZnJhbWUgfHwgIXJvb3QpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLQotICAgIHJldHVybiBmcmFtZS0+ZWRpdG9yKCktPnNob3VsZEJlZ2lu
RWRpdGluZyhyYW5nZU9mQ29udGVudHMocm9vdCkuZ2V0KCkpOwotfQotCi1zdGF0aWMgYm9vbCBj
YW5BY2Nlc3NBbmNlc3Rvcihjb25zdCBTZWN1cml0eU9yaWdpbiogYWN0aXZlU2VjdXJpdHlPcmln
aW4sIEZyYW1lKiB0YXJnZXRGcmFtZSkKLXsKLSAgICAvLyB0YXJnZXRGcmFtZSBjYW4gYmUgMCB3
aGVuIHdlJ3JlIHRyeWluZyB0byBuYXZpZ2F0ZSBhIHRvcC1sZXZlbCBmcmFtZQotICAgIC8vIHRo
YXQgaGFzIGEgMCBvcGVuZXIuCi0gICAgaWYgKCF0YXJnZXRGcmFtZSkKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotCi0gICAgY29uc3QgYm9vbCBpc0xvY2FsQWN0aXZlT3JpZ2luID0gYWN0aXZlU2Vj
dXJpdHlPcmlnaW4tPmlzTG9jYWwoKTsKLSAgICBmb3IgKEZyYW1lKiBhbmNlc3RvckZyYW1lID0g
dGFyZ2V0RnJhbWU7IGFuY2VzdG9yRnJhbWU7IGFuY2VzdG9yRnJhbWUgPSBhbmNlc3RvckZyYW1l
LT50cmVlKCktPnBhcmVudCgpKSB7Ci0gICAgICAgIERvY3VtZW50KiBhbmNlc3RvckRvY3VtZW50
ID0gYW5jZXN0b3JGcmFtZS0+ZG9jdW1lbnQoKTsKLSAgICAgICAgLy8gRklYTUU6IFNob3VsZCBi
ZSBhbiBBU1NFUlQ/IEZyYW1lcyBzaG91bGQgYWx3YXkgaGF2ZSBkb2N1bWVudHMuCi0gICAgICAg
IGlmICghYW5jZXN0b3JEb2N1bWVudCkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAg
ICAgIGNvbnN0IFNlY3VyaXR5T3JpZ2luKiBhbmNlc3RvclNlY3VyaXR5T3JpZ2luID0gYW5jZXN0
b3JEb2N1bWVudC0+c2VjdXJpdHlPcmlnaW4oKTsKLSAgICAgICAgaWYgKGFjdGl2ZVNlY3VyaXR5
T3JpZ2luLT5jYW5BY2Nlc3MoYW5jZXN0b3JTZWN1cml0eU9yaWdpbikpCi0gICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKLSAgICAgICAgCi0gICAgICAgIC8vIEFsbG93IGZpbGUgVVJMIGRlc2NlbmRh
bnQgbmF2aWdhdGlvbiBldmVuIHdoZW4gYWxsb3dGaWxlQWNjZXNzRnJvbUZpbGVVUkxzIGlzIGZh
bHNlLgotICAgICAgICAvLyBGSVhNRTogSXQncyBhIGJpdCBzdHJhbmdlIHRvIHNwZWNpYWwtY2Fz
ZSBsb2NhbCBvcmlnaW5zIGhlcmUuIFNob3VsZCB3ZSBiZSBkb2luZwotICAgICAgICAvLyBzb21l
dGhpbmcgbW9yZSBnZW5lcmFsIGluc3RlYWQ/Ci0gICAgICAgIGlmIChpc0xvY2FsQWN0aXZlT3Jp
Z2luICYmIGFuY2VzdG9yU2VjdXJpdHlPcmlnaW4tPmlzTG9jYWwoKSkKLSAgICAgICAgICAgIHJl
dHVybiB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIHZvaWQg
cHJpbnROYXZpZ2F0aW9uRXJyb3JNZXNzYWdlKEZyYW1lKiBmcmFtZSwgY29uc3QgS1VSTCYgYWN0
aXZlVVJMKQotewotICAgIC8vIEZJWE1FOiB0aGlzIGVycm9yIG1lc3NhZ2Ugc2hvdWxkIGNvbnRh
aW4gbW9yZSBzcGVjaWZpY3Mgb2Ygd2h5IHRoZSBuYXZpZ2F0aW9uIGNoYW5nZSBpcyBub3QgYWxs
b3dlZC4KLSAgICBTdHJpbmcgbWVzc2FnZSA9ICJVbnNhZmUgSmF2YVNjcmlwdCBhdHRlbXB0IHRv
IGluaXRpYXRlIGEgbmF2aWdhdGlvbiBjaGFuZ2UgZm9yIGZyYW1lIHdpdGggVVJMICIgKwotICAg
ICAgICAgICAgICAgICAgICAgZnJhbWUtPmRvY3VtZW50KCktPnVybCgpLnN0cmluZygpICsgIiBm
cm9tIGZyYW1lIHdpdGggVVJMICIgKyBhY3RpdmVVUkwuc3RyaW5nKCkgKyAiLlxuIjsKLQotICAg
IC8vIEZJWE1FOiBzaG91bGQgd2UgcHJpbnQgdG8gdGhlIGNvbnNvbGUgb2YgdGhlIGRvY3VtZW50
IHBlcmZvcm1pbmcgdGhlIG5hdmlnYXRpb24gaW5zdGVhZD8KLSAgICBmcmFtZS0+ZG9jdW1lbnQo
KS0+ZG9tV2luZG93KCktPnByaW50RXJyb3JNZXNzYWdlKG1lc3NhZ2UpOwotfQotCi1zdGF0aWMg
SGFzaFNldDxEb2N1bWVudCo+KiBkb2N1bWVudHNUaGF0TmVlZFN0eWxlUmVjYWxjID0gMDsKLQot
Y2xhc3MgRG9jdW1lbnRXZWFrUmVmZXJlbmNlIDogcHVibGljIFRocmVhZFNhZmVSZWZDb3VudGVk
PERvY3VtZW50V2Vha1JlZmVyZW5jZT4gewotcHVibGljOgotICAgIHN0YXRpYyBQYXNzUmVmUHRy
PERvY3VtZW50V2Vha1JlZmVyZW5jZT4gY3JlYXRlKERvY3VtZW50KiBkb2N1bWVudCkKLSAgICB7
Ci0gICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgRG9jdW1lbnRXZWFrUmVmZXJlbmNlKGRvY3Vt
ZW50KSk7Ci0gICAgfQotCi0gICAgRG9jdW1lbnQqIGRvY3VtZW50KCkKLSAgICB7Ci0gICAgICAg
IEFTU0VSVChpc01haW5UaHJlYWQoKSk7Ci0gICAgICAgIHJldHVybiBtX2RvY3VtZW50OwotICAg
IH0KLQotICAgIHZvaWQgY2xlYXIoKQotICAgIHsKLSAgICAgICAgQVNTRVJUKGlzTWFpblRocmVh
ZCgpKTsKLSAgICAgICAgbV9kb2N1bWVudCA9IDA7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIERv
Y3VtZW50V2Vha1JlZmVyZW5jZShEb2N1bWVudCogZG9jdW1lbnQpCi0gICAgICAgIDogbV9kb2N1
bWVudChkb2N1bWVudCkKLSAgICB7Ci0gICAgICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7Ci0g
ICAgfQotCi0gICAgRG9jdW1lbnQqIG1fZG9jdW1lbnQ7Ci19OwotCi11aW50NjRfdCBEb2N1bWVu
dDo6c19nbG9iYWxUcmVlVmVyc2lvbiA9IDA7Ci0KLURvY3VtZW50OjpEb2N1bWVudChGcmFtZSog
ZnJhbWUsIGNvbnN0IEtVUkwmIHVybCwgYm9vbCBpc1hIVE1MLCBib29sIGlzSFRNTCkKLSAgICA6
IENvbnRhaW5lck5vZGUoMCwgQ3JlYXRlRG9jdW1lbnQpCi0gICAgLCBUcmVlU2NvcGUodGhpcykK
LSAgICAsIG1fZ3VhcmRSZWZDb3VudCgwKQotICAgICwgbV9jb250ZXh0RmVhdHVyZXMoQ29udGV4
dEZlYXR1cmVzOjpkZWZhdWx0U3dpdGNoKCkpCi0gICAgLCBtX2NvbXBhdGliaWxpdHlNb2RlKE5v
UXVpcmtzTW9kZSkKLSAgICAsIG1fY29tcGF0aWJpbGl0eU1vZGVMb2NrZWQoZmFsc2UpCi0gICAg
LCBtX2RvbVRyZWVWZXJzaW9uKCsrc19nbG9iYWxUcmVlVmVyc2lvbikKLSNpZiBFTkFCTEUoTVVU
QVRJT05fT0JTRVJWRVJTKQotICAgICwgbV9tdXRhdGlvbk9ic2VydmVyVHlwZXMoMCkKLSNlbmRp
ZgotICAgICwgbV9zdHlsZVNoZWV0cyhTdHlsZVNoZWV0TGlzdDo6Y3JlYXRlKHRoaXMpKQorRG9j
dW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbihE
b2N1bWVudCogZG9jdW1lbnQpCisgICAgOiBtX2RvY3VtZW50KGRvY3VtZW50KQorICAgICwgbV9h
dXRob3JTdHlsZVNoZWV0cyhTdHlsZVNoZWV0TGlzdDo6Y3JlYXRlKGRvY3VtZW50KSkKKyAgICAs
IG1fcGVuZGluZ1N0eWxlc2hlZXRzKDApCisgICAgLCBtX3BhZ2VHcm91cFVzZXJTaGVldENhY2hl
VmFsaWQoZmFsc2UpCiAgICAgLCBtX2hhZEFjdGl2ZUxvYWRpbmdTdHlsZXNoZWV0KGZhbHNlKQot
ICAgICwgbV9yZWFkeVN0YXRlKENvbXBsZXRlKQotICAgICwgbV9zdHlsZVJlY2FsY1RpbWVyKHRo
aXMsICZEb2N1bWVudDo6c3R5bGVSZWNhbGNUaW1lckZpcmVkKQotICAgICwgbV9wZW5kaW5nU3R5
bGVSZWNhbGNTaG91bGRGb3JjZShmYWxzZSkKLSAgICAsIG1fZnJhbWVFbGVtZW50c1Nob3VsZEln
bm9yZVNjcm9sbGluZyhmYWxzZSkKLSAgICAsIG1fY29udGFpbnNWYWxpZGl0eVN0eWxlUnVsZXMo
ZmFsc2UpCi0gICAgLCBtX3VwZGF0ZUZvY3VzQXBwZWFyYW5jZVJlc3RvcmVzU2VsZWN0aW9uKGZh
bHNlKQotICAgICwgbV9pZ25vcmVEZXN0cnVjdGl2ZVdyaXRlQ291bnQoMCkKLSAgICAsIG1fdGl0
bGVTZXRFeHBsaWNpdGx5KGZhbHNlKQotICAgICwgbV91cGRhdGVGb2N1c0FwcGVhcmFuY2VUaW1l
cih0aGlzLCAmRG9jdW1lbnQ6OnVwZGF0ZUZvY3VzQXBwZWFyYW5jZVRpbWVyRmlyZWQpCi0gICAg
LCBtX2xvYWRFdmVudEZpbmlzaGVkKGZhbHNlKQotICAgICwgbV9zdGFydFRpbWUoY3VycmVudFRp
bWUoKSkKLSAgICAsIG1fb3Zlck1pbmltdW1MYXlvdXRUaHJlc2hvbGQoZmFsc2UpCi0gICAgLCBt
X3NjcmlwdFJ1bm5lcihTY3JpcHRSdW5uZXI6OmNyZWF0ZSh0aGlzKSkKLSAgICAsIG1feG1sVmVy
c2lvbigiMS4wIikKLSAgICAsIG1feG1sU3RhbmRhbG9uZShTdGFuZGFsb25lVW5zcGVjaWZpZWQp
Ci0gICAgLCBtX2hhc1hNTERlY2xhcmF0aW9uKDApCi0gICAgLCBtX3NhdmVkUmVuZGVyZXIoMCkK
LSAgICAsIG1fZGVzaWduTW9kZShpbmhlcml0KQotI2lmIEVOQUJMRShEQVNIQk9BUkRfU1VQUE9S
VCkgfHwgRU5BQkxFKFdJREdFVF9SRUdJT04pCi0gICAgLCBtX2hhc0Rhc2hib2FyZFJlZ2lvbnMo
ZmFsc2UpCi0gICAgLCBtX2Rhc2hib2FyZFJlZ2lvbnNEaXJ0eShmYWxzZSkKLSNlbmRpZgotICAg
ICwgbV9jcmVhdGVSZW5kZXJlcnModHJ1ZSkKLSAgICAsIG1faW5QYWdlQ2FjaGUoZmFsc2UpCi0g
ICAgLCBtX2FjY2Vzc0tleU1hcFZhbGlkKGZhbHNlKQotICAgICwgbV91c2VTZWN1cmVLZXlib2Fy
ZEVudHJ5V2hlbkFjdGl2ZShmYWxzZSkKLSAgICAsIG1faXNYSFRNTChpc1hIVE1MKQotICAgICwg
bV9pc0hUTUwoaXNIVE1MKQotICAgICwgbV9pc1ZpZXdTb3VyY2UoZmFsc2UpCi0gICAgLCBtX3Nh
d0VsZW1lbnRzSW5Lbm93bk5hbWVzcGFjZXMoZmFsc2UpCi0gICAgLCBtX2lzU3JjZG9jRG9jdW1l
bnQoZmFsc2UpCi0gICAgLCBtX2RvY3VtZW50UmFyZURhdGEoMCkKLSAgICAsIG1fZXZlbnRRdWV1
ZShEb2N1bWVudEV2ZW50UXVldWU6OmNyZWF0ZSh0aGlzKSkKLSAgICAsIG1fd2Vha1JlZmVyZW5j
ZShEb2N1bWVudFdlYWtSZWZlcmVuY2U6OmNyZWF0ZSh0aGlzKSkKLSAgICAsIG1faWRBdHRyaWJ1
dGVOYW1lKGlkQXR0cikKLSNpZiBFTkFCTEUoRlVMTFNDUkVFTl9BUEkpCi0gICAgLCBtX2FyZUtl
eXNFbmFibGVkSW5GdWxsU2NyZWVuKDApCi0gICAgLCBtX2Z1bGxTY3JlZW5SZW5kZXJlcigwKQot
ICAgICwgbV9mdWxsU2NyZWVuQ2hhbmdlRGVsYXlUaW1lcih0aGlzLCAmRG9jdW1lbnQ6OmZ1bGxT
Y3JlZW5DaGFuZ2VEZWxheVRpbWVyRmlyZWQpCi0gICAgLCBtX2lzQW5pbWF0aW5nRnVsbFNjcmVl
bihmYWxzZSkKLSNlbmRpZgotICAgICwgbV9sb2FkRXZlbnREZWxheUNvdW50KDApCi0gICAgLCBt
X2xvYWRFdmVudERlbGF5VGltZXIodGhpcywgJkRvY3VtZW50Ojpsb2FkRXZlbnREZWxheVRpbWVy
RmlyZWQpCi0gICAgLCBtX3JlZmVycmVyUG9saWN5KFJlZmVycmVyUG9saWN5RGVmYXVsdCkKLSAg
ICAsIG1fZGlyZWN0aW9uU2V0T25Eb2N1bWVudEVsZW1lbnQoZmFsc2UpCi0gICAgLCBtX3dyaXRp
bmdNb2RlU2V0T25Eb2N1bWVudEVsZW1lbnQoZmFsc2UpCi0gICAgLCBtX3dyaXRlUmVjdXJzaW9u
SXNUb29EZWVwKGZhbHNlKQotICAgICwgbV93cml0ZVJlY3Vyc2lvbkRlcHRoKDApCi0gICAgLCBt
X3doZWVsRXZlbnRIYW5kbGVyQ291bnQoMCkKLSNpZiBFTkFCTEUoVE9VQ0hfRVZFTlRTKQotICAg
ICwgbV90b3VjaEV2ZW50SGFuZGxlckNvdW50KDApCi0jZW5kaWYKLSNpZiBFTkFCTEUoVU5ET19N
QU5BR0VSKQotICAgICwgbV91bmRvTWFuYWdlcigwKQotI2VuZGlmCi0gICAgLCBtX3BlbmRpbmdU
YXNrc1RpbWVyKHRoaXMsICZEb2N1bWVudDo6cGVuZGluZ1Rhc2tzVGltZXJGaXJlZCkKLSAgICAs
IG1fc2NoZWR1bGVkVGFza3NBcmVTdXNwZW5kZWQoZmFsc2UpCi0gICAgLCBtX3Zpc3VhbFVwZGF0
ZXNBbGxvd2VkKHRydWUpCi0gICAgLCBtX3Zpc3VhbFVwZGF0ZXNTdXBwcmVzc2lvblRpbWVyKHRo
aXMsICZEb2N1bWVudDo6dmlzdWFsVXBkYXRlc1N1cHByZXNzaW9uVGltZXJGaXJlZCkKLSNpZm5k
ZWYgTkRFQlVHCi0gICAgLCBtX2RpZERpc3BhdGNoVmlld3BvcnRQcm9wZXJ0aWVzQ2hhbmdlZChm
YWxzZSkKLSNlbmRpZgotewotICAgIG1fZG9jdW1lbnQgPSB0aGlzOwotCi0gICAgbV9wYWdlR3Jv
dXBVc2VyU2hlZXRDYWNoZVZhbGlkID0gZmFsc2U7Ci0KLSAgICBtX3ByaW50aW5nID0gZmFsc2U7
Ci0gICAgbV9wYWdpbmF0ZWRGb3JTY3JlZW4gPSBmYWxzZTsKLQotICAgIG1faWdub3JlQXV0b2Zv
Y3VzID0gZmFsc2U7Ci0KLSAgICBtX2ZyYW1lID0gZnJhbWU7Ci0gICAgaWYgKG1fZnJhbWUpCi0g
ICAgICAgIHByb3ZpZGVDb250ZXh0RmVhdHVyZXNUb0RvY3VtZW50RnJvbSh0aGlzLCBtX2ZyYW1l
LT5wYWdlKCkpOwotCi0gICAgLy8gV2UgZGVwZW5kIG9uIHRoZSB1cmwgZ2V0dGluZyBpbW1lZGlh
dGVseSBzZXQgaW4gc3ViZnJhbWVzLCBidXQgd2UKLSAgICAvLyBhbHNvIGRlcGVuZCBvbiB0aGUg
dXJsIE5PVCBnZXR0aW5nIGltbWVkaWF0ZWx5IHNldCBpbiBvcGVuZWQgd2luZG93cy4KLSAgICAv
LyBTZWUgZmFzdC9kb20vZWFybHktZnJhbWUtdXJsLmh0bWwKLSAgICAvLyBhbmQgZmFzdC9kb20v
bG9jYXRpb24tbmV3LXdpbmRvdy1uby1jcmFzaC5odG1sLCByZXNwZWN0aXZlbHkuCi0gICAgLy8g
RklYTUU6IENhbi9zaG91bGQgd2UgdW5pZnkgdGhpcyBiZWhhdmlvcj8KLSAgICBpZiAoKGZyYW1l
ICYmIGZyYW1lLT5vd25lckVsZW1lbnQoKSkgfHwgIXVybC5pc0VtcHR5KCkpCi0gICAgICAgIHNl
dFVSTCh1cmwpOwotCi0gICAgbV9heE9iamVjdENhY2hlID0gMDsKLQotICAgIG1fbWFya2VycyA9
IGFkb3B0UHRyKG5ldyBEb2N1bWVudE1hcmtlckNvbnRyb2xsZXIpOwotCi0gICAgbV9jYWNoZWRS
ZXNvdXJjZUxvYWRlciA9IGFkb3B0UHRyKG5ldyBDYWNoZWRSZXNvdXJjZUxvYWRlcih0aGlzKSk7
Ci0jaWYgRU5BQkxFKExJTktfUFJFUkVOREVSKQotICAgIG1fcHJlcmVuZGVyZXIgPSBQcmVyZW5k
ZXJlcjo6Y3JlYXRlKHRoaXMpOwotI2VuZGlmCi0jaWYgRU5BQkxFKFRFWFRfQVVUT1NJWklORykK
LSAgICBtX3RleHRBdXRvc2l6ZXIgPSBUZXh0QXV0b3NpemVyOjpjcmVhdGUodGhpcyk7Ci0jZW5k
aWYKLSAgICBtX3Zpc3VhbGx5T3JkZXJlZCA9IGZhbHNlOwotICAgIG1fYlBhcnNpbmcgPSBmYWxz
ZTsKLSAgICBtX3dlbGxGb3JtZWQgPSBmYWxzZTsKLQotICAgIG1fdGV4dENvbG9yID0gQ29sb3I6
OmJsYWNrOwotICAgIG1fbGlzdGVuZXJUeXBlcyA9IDA7Ci0gICAgbV9pblN0eWxlUmVjYWxjID0g
ZmFsc2U7Ci0gICAgbV9jbG9zZUFmdGVyU3R5bGVSZWNhbGMgPSBmYWxzZTsKLQotICAgIG1fdXNl
c1NpYmxpbmdSdWxlcyA9IGZhbHNlOwotICAgIG1fdXNlc1NpYmxpbmdSdWxlc092ZXJyaWRlID0g
ZmFsc2U7Ci0gICAgbV91c2VzRmlyc3RMaW5lUnVsZXMgPSBmYWxzZTsKLSAgICBtX3VzZXNGaXJz
dExldHRlclJ1bGVzID0gZmFsc2U7Ci0gICAgbV91c2VzQmVmb3JlQWZ0ZXJSdWxlcyA9IGZhbHNl
OwotICAgIG1fdXNlc0JlZm9yZUFmdGVyUnVsZXNPdmVycmlkZSA9IGZhbHNlOwotICAgIG1fdXNl
c1JlbVVuaXRzID0gZmFsc2U7Ci0gICAgbV91c2VzTGlua1J1bGVzID0gZmFsc2U7Ci0KLSAgICBt
X2dvdG9BbmNob3JOZWVkZWRBZnRlclN0eWxlc2hlZXRzTG9hZCA9IGZhbHNlOwotCi0gICAgbV9k
aWRDYWxjdWxhdGVTdHlsZVJlc29sdmVyID0gZmFsc2U7Ci0gICAgbV9oYXNEaXJ0eVN0eWxlUmVz
b2x2ZXIgPSBmYWxzZTsKLSAgICBtX3BlbmRpbmdTdHlsZXNoZWV0cyA9IDA7Ci0gICAgbV9pZ25v
cmVQZW5kaW5nU3R5bGVzaGVldHMgPSBmYWxzZTsKLSAgICBtX25lZWRzTm90aWZ5UmVtb3ZlQWxs
UGVuZGluZ1N0eWxlc2hlZXQgPSBmYWxzZTsKLSAgICBtX2hhc05vZGVzV2l0aFBsYWNlaG9sZGVy
U3R5bGUgPSBmYWxzZTsKLSAgICBtX3BlbmRpbmdTaGVldExheW91dCA9IE5vTGF5b3V0V2l0aFBl
bmRpbmdTaGVldHM7Ci0KLSAgICBtX2Nzc1RhcmdldCA9IDA7Ci0KLSAgICByZXNldExpbmtDb2xv
cigpOwotICAgIHJlc2V0VmlzaXRlZExpbmtDb2xvcigpOwotICAgIHJlc2V0QWN0aXZlTGlua0Nv
bG9yKCk7Ci0KLSAgICBtX3Byb2Nlc3NpbmdMb2FkRXZlbnQgPSBmYWxzZTsKLSAgICAKLSAgICBp
bml0U2VjdXJpdHlDb250ZXh0KCk7Ci0gICAgaW5pdEROU1ByZWZldGNoKCk7Ci0KLSAgICBzdGF0
aWMgaW50IGRvY0lEID0gMDsKLSAgICBtX2RvY0lEID0gZG9jSUQrKzsKLQotICAgIGZvciAodW5z
aWduZWQgaSA9IDA7IGkgPCBXVEZfQVJSQVlfTEVOR1RIKG1fbm9kZUxpc3RDb3VudHMpOyBpKysp
Ci0gICAgICAgIG1fbm9kZUxpc3RDb3VudHNbaV0gPSAwOwotCi0gICAgZm9yICh1bnNpZ25lZCBp
ID0gMDsgaSA8IFdURl9BUlJBWV9MRU5HVEgobV9jb2xsZWN0aW9ucyk7IGkrKykKLSAgICAgICAg
bV9jb2xsZWN0aW9uc1tpXSA9IDA7Ci0KLSAgICBJbnNwZWN0b3JDb3VudGVyczo6aW5jcmVtZW50
Q291bnRlcihJbnNwZWN0b3JDb3VudGVyczo6RG9jdW1lbnRDb3VudGVyKTsKLX0KLQotc3RhdGlj
IHZvaWQgaGlzdG9ncmFtTXV0YXRpb25FdmVudFVzYWdlKGNvbnN0IHVuc2lnbmVkIHNob3J0JiBs
aXN0ZW5lclR5cGVzKQotewotICAgIEhpc3RvZ3JhbVN1cHBvcnQ6Omhpc3RvZ3JhbUVudW1lcmF0
aW9uKCJET01BUEkuUGVyRG9jdW1lbnRNdXRhdGlvbkV2ZW50VXNhZ2UuRE9NU3VidHJlZU1vZGlm
aWVkIiwgc3RhdGljX2Nhc3Q8Ym9vbD4obGlzdGVuZXJUeXBlcyAmIERvY3VtZW50OjpET01TVUJU
UkVFTU9ESUZJRURfTElTVEVORVIpLCAyKTsKLSAgICBIaXN0b2dyYW1TdXBwb3J0OjpoaXN0b2dy
YW1FbnVtZXJhdGlvbigiRE9NQVBJLlBlckRvY3VtZW50TXV0YXRpb25FdmVudFVzYWdlLkRPTU5v
ZGVJbnNlcnRlZCIsIHN0YXRpY19jYXN0PGJvb2w+KGxpc3RlbmVyVHlwZXMgJiBEb2N1bWVudDo6
RE9NTk9ERUlOU0VSVEVEX0xJU1RFTkVSKSwgMik7Ci0gICAgSGlzdG9ncmFtU3VwcG9ydDo6aGlz
dG9ncmFtRW51bWVyYXRpb24oIkRPTUFQSS5QZXJEb2N1bWVudE11dGF0aW9uRXZlbnRVc2FnZS5E
T01Ob2RlUmVtb3ZlZCIsIHN0YXRpY19jYXN0PGJvb2w+KGxpc3RlbmVyVHlwZXMgJiBEb2N1bWVu
dDo6RE9NTk9ERVJFTU9WRURfTElTVEVORVIpLCAyKTsKLSAgICBIaXN0b2dyYW1TdXBwb3J0Ojpo
aXN0b2dyYW1FbnVtZXJhdGlvbigiRE9NQVBJLlBlckRvY3VtZW50TXV0YXRpb25FdmVudFVzYWdl
LkRPTU5vZGVSZW1vdmVkRnJvbURvY3VtZW50Iiwgc3RhdGljX2Nhc3Q8Ym9vbD4obGlzdGVuZXJU
eXBlcyAmIERvY3VtZW50OjpET01OT0RFUkVNT1ZFREZST01ET0NVTUVOVF9MSVNURU5FUiksIDIp
OwotICAgIEhpc3RvZ3JhbVN1cHBvcnQ6Omhpc3RvZ3JhbUVudW1lcmF0aW9uKCJET01BUEkuUGVy
RG9jdW1lbnRNdXRhdGlvbkV2ZW50VXNhZ2UuRE9NTm9kZUluc2VydGVkSW50b0RvY3VtZW50Iiwg
c3RhdGljX2Nhc3Q8Ym9vbD4obGlzdGVuZXJUeXBlcyAmIERvY3VtZW50OjpET01OT0RFSU5TRVJU
RURJTlRPRE9DVU1FTlRfTElTVEVORVIpLCAyKTsKLSAgICBIaXN0b2dyYW1TdXBwb3J0OjpoaXN0
b2dyYW1FbnVtZXJhdGlvbigiRE9NQVBJLlBlckRvY3VtZW50TXV0YXRpb25FdmVudFVzYWdlLkRP
TUNoYXJhY3RlckRhdGFNb2RpZmllZCIsIHN0YXRpY19jYXN0PGJvb2w+KGxpc3RlbmVyVHlwZXMg
JiBEb2N1bWVudDo6RE9NQ0hBUkFDVEVSREFUQU1PRElGSUVEX0xJU1RFTkVSKSwgMik7Ci19Ci0K
LSNpZiBFTkFCTEUoRlVMTFNDUkVFTl9BUEkpCi1zdGF0aWMgYm9vbCBpc0F0dHJpYnV0ZU9uQWxs
T3duZXJzKGNvbnN0IFdlYkNvcmU6OlF1YWxpZmllZE5hbWUmIGF0dHJpYnV0ZSwgY29uc3QgSFRN
TEZyYW1lT3duZXJFbGVtZW50KiBvd25lcikKKyAgICAsIG1fbmVlZHNVcGRhdGVBY3RpdmVTdHls
ZXNoZWV0c09uU3R5bGVSZWNhbGMoZmFsc2UpCisgICAgLCBtX3VzZXNTaWJsaW5nUnVsZXMoZmFs
c2UpCisgICAgLCBtX3VzZXNTaWJsaW5nUnVsZXNPdmVycmlkZShmYWxzZSkKKyAgICAsIG1fdXNl
c0ZpcnN0TGluZVJ1bGVzKGZhbHNlKQorICAgICwgbV91c2VzRmlyc3RMZXR0ZXJSdWxlcyhmYWxz
ZSkKKyAgICAsIG1fdXNlc0JlZm9yZUFmdGVyUnVsZXMoZmFsc2UpCisgICAgLCBtX3VzZXNCZWZv
cmVBZnRlclJ1bGVzT3ZlcnJpZGUoZmFsc2UpCisgICAgLCBtX3VzZXNSZW1Vbml0cyhmYWxzZSkK
IHsKLSAgICBpZiAoIW93bmVyKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICBkbyB7Ci0gICAg
ICAgIGlmICghb3duZXItPmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGUpKQotICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgIH0gd2hpbGUgKChvd25lciA9IG93bmVyLT5kb2N1bWVudCgpLT5vd25l
ckVsZW1lbnQoKSkpOwotICAgIHJldHVybiB0cnVlOwogfQotI2VuZGlmCiAKLURvY3VtZW50Ojp+
RG9jdW1lbnQoKQorRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6fkRvY3VtZW50U3R5bGVT
aGVldENvbGxlY3Rpb24oKQogewotICAgIEFTU0VSVCghcmVuZGVyZXIoKSk7Ci0gICAgQVNTRVJU
KCFtX2luUGFnZUNhY2hlKTsKLSAgICBBU1NFUlQoIW1fc2F2ZWRSZW5kZXJlcik7Ci0gICAgQVNT
RVJUKG1fcmFuZ2VzLmlzRW1wdHkoKSk7Ci0gICAgQVNTRVJUKCFtX3N0eWxlUmVjYWxjVGltZXIu
aXNBY3RpdmUoKSk7Ci0gICAgQVNTRVJUKCFtX3BhcmVudFRyZWVTY29wZSk7Ci0gICAgQVNTRVJU
KCFtX2d1YXJkUmVmQ291bnQpOwotCi0gICAgLy8gRklYTUU6IFNob3VsZCB3ZSByZXNldCBtX2Rv
bVdpbmRvdyB3aGVuIHdlIGRldGFjaCBmcm9tIHRoZSBGcmFtZT8KLSAgICBpZiAobV9kb21XaW5k
b3cpCi0gICAgICAgIG1fZG9tV2luZG93LT5yZXNldFVubGVzc1N1c3BlbmRlZEZvclBhZ2VDYWNo
ZSgpOwotCi0gICAgbV9zY3JpcHRSdW5uZXIuY2xlYXIoKTsKLQotICAgIGhpc3RvZ3JhbU11dGF0
aW9uRXZlbnRVc2FnZShtX2xpc3RlbmVyVHlwZXMpOwotCi0gICAgcmVtb3ZlQWxsRXZlbnRMaXN0
ZW5lcnMoKTsKKyAgICBtX2F1dGhvclN0eWxlU2hlZXRzLT5kb2N1bWVudERlc3Ryb3llZCgpOwog
Ci0gICAgLy8gQ3VycmVudGx5IHdlIGJlbGlldmUgdGhhdCBEb2N1bWVudCBjYW4gbmV2ZXIgb3V0
bGl2ZSB0aGUgcGFyc2VyLgotICAgIC8vIEFsdGhvdWdoIHRoZSBEb2N1bWVudCBtYXkgYmUgcmVw
bGFjZWQgc3luY2hyb25vdXNseSwgRG9jdW1lbnRQYXJzZXJzCi0gICAgLy8gZ2VuZXJhbGx5IGtl
ZXAgYXQgbGVhc3Qgb25lIHJlZmVyZW5jZSB0byBhbiBFbGVtZW50IHdoaWNoIHdvdWxkIGluIHR1
cm4KLSAgICAvLyBoYXMgYSByZWZlcmVuY2UgdG8gdGhlIERvY3VtZW50LiAgSWYgeW91IGhpdCB0
aGlzIEFTU0VSVCwgdGhlbiB0aGF0Ci0gICAgLy8gYXNzdW1wdGlvbiBpcyB3cm9uZy4gIERvY3Vt
ZW50UGFyc2VyOjpkZXRhY2goKSBzaG91bGQgZW5zdXJlIHRoYXQgZXZlbgotICAgIC8vIGlmIHRo
ZSBEb2N1bWVudFBhcnNlciBvdXRsaXZlcyB0aGUgRG9jdW1lbnQgaXQgd29uJ3QgY2F1c2UgYmFk
bmVzcy4KLSAgICBBU1NFUlQoIW1fcGFyc2VyIHx8IG1fcGFyc2VyLT5yZWZDb3VudCgpID09IDEp
OwotICAgIGRldGFjaFBhcnNlcigpOwotCi0gICAgbV9yZW5kZXJBcmVuYS5jbGVhcigpOwotCi0g
ICAgY2xlYXJBWE9iamVjdENhY2hlKCk7Ci0KLSAgICBtX2RlY29kZXIgPSAwOwotCi0gICAgaWYg
KG1fc3R5bGVTaGVldHMpCi0gICAgICAgIG1fc3R5bGVTaGVldHMtPmRvY3VtZW50RGVzdHJveWVk
KCk7Ci0KLSAgICBpZiAobV9uYW1lZEZsb3dzKQotICAgICAgICBtX25hbWVkRmxvd3MtPmRvY3Vt
ZW50RGVzdHJveWVkKCk7Ci0KLSAgICBpZiAobV9lbGVtU2hlZXQpCi0gICAgICAgIG1fZWxlbVNo
ZWV0LT5jbGVhck93bmVyTm9kZSgpOwogICAgIGlmIChtX3BhZ2VVc2VyU2hlZXQpCiAgICAgICAg
IG1fcGFnZVVzZXJTaGVldC0+Y2xlYXJPd25lck5vZGUoKTsKICAgICBpZiAobV9wYWdlR3JvdXBV
c2VyU2hlZXRzKSB7CkBAIC02NjAsNTczOCArODIsNDA2IEBAIERvY3VtZW50Ojp+RG9jdW1lbnQo
KQogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fdXNlclNoZWV0cy0+c2l6ZSgpOyAr
K2kpCiAgICAgICAgICAgICAoKm1fdXNlclNoZWV0cylbaV0tPmNsZWFyT3duZXJOb2RlKCk7CiAg
ICAgfQotCi0gICAgZGVsZXRlQ3VzdG9tRm9udHMoKTsKLQotICAgIG1fd2Vha1JlZmVyZW5jZS0+
Y2xlYXIoKTsKLQotICAgIGlmIChtX21lZGlhUXVlcnlNYXRjaGVyKQotICAgICAgICBtX21lZGlh
UXVlcnlNYXRjaGVyLT5kb2N1bWVudERlc3Ryb3llZCgpOwotCi0gICAgY2xlYXJTdHlsZVJlc29s
dmVyKCk7IC8vIFdlIG5lZWQgdG8gZGVzdG9yeSBDU1NGb250U2VsZWN0b3IgYmVmb3JlIGRlc3Ry
b3lpbmcgbV9jYWNoZWRSZXNvdXJjZUxvYWRlci4KLSAgICBtX2NhY2hlZFJlc291cmNlTG9hZGVy
LmNsZWFyKCk7Ci0KLSAgICAvLyBXZSBtdXN0IGNhbGwgY2xlYXJSYXJlRGF0YSgpIGhlcmUgc2lu
Y2UgYSBEb2N1bWVudCBjbGFzcyBpbmhlcml0cyBUcmVlU2NvcGUKLSAgICAvLyBhcyB3ZWxsIGFz
IE5vZGUuIFNlZSBhIGNvbW1lbnQgb24gVHJlZVNjb3BlLmggZm9yIHRoZSByZWFzb24uCi0gICAg
aWYgKGhhc1JhcmVEYXRhKCkpCi0gICAgICAgIGNsZWFyUmFyZURhdGEoKTsKLQotICAgIEFTU0VS
VCghbV9saXN0c0ludmFsaWRhdGVkQXREb2N1bWVudC5zaXplKCkpOwotCi0gICAgZm9yICh1bnNp
Z25lZCBpID0gMDsgaSA8IFdURl9BUlJBWV9MRU5HVEgobV9ub2RlTGlzdENvdW50cyk7IGkrKykK
LSAgICAgICAgQVNTRVJUKCFtX25vZGVMaXN0Q291bnRzW2ldKTsKLQotICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBXVEZfQVJSQVlfTEVOR1RIKG1fY29sbGVjdGlvbnMpOyBpKyspCi0gICAg
ICAgIEFTU0VSVCghbV9jb2xsZWN0aW9uc1tpXSk7Ci0KLSAgICBtX2RvY3VtZW50ID0gMDsKLQot
ICAgIEluc3BlY3RvckNvdW50ZXJzOjpkZWNyZW1lbnRDb3VudGVyKEluc3BlY3RvckNvdW50ZXJz
OjpEb2N1bWVudENvdW50ZXIpOwotfQotCi12b2lkIERvY3VtZW50OjpyZW1vdmVkTGFzdFJlZigp
Ci17Ci0gICAgQVNTRVJUKCFtX2RlbGV0aW9uSGFzQmVndW4pOwotICAgIGlmIChtX2d1YXJkUmVm
Q291bnQpIHsKLSAgICAgICAgLy8gSWYgcmVtb3ZpbmcgYSBjaGlsZCByZW1vdmVzIHRoZSBsYXN0
IHNlbGYtb25seSByZWYsIHdlIGRvbid0Ci0gICAgICAgIC8vIHdhbnQgdGhlIHNjb3BlIHRvIGJl
IGRlc3RydWN0ZWQgdW50aWwgYWZ0ZXIKLSAgICAgICAgLy8gcmVtb3ZlQWxsQ2hpbGRyZW4gcmV0
dXJucywgc28gd2UgZ3VhcmQgb3Vyc2VsdmVzIHdpdGggYW4KLSAgICAgICAgLy8gZXh0cmEgc2Vs
Zi1vbmx5IHJlZi4KLSAgICAgICAgZ3VhcmRSZWYoKTsKLQotICAgICAgICAvLyBXZSBtdXN0IG1h
a2Ugc3VyZSBub3QgdG8gYmUgcmV0YWluaW5nIGFueSBvZiBvdXIgY2hpbGRyZW4gdGhyb3VnaAot
ICAgICAgICAvLyB0aGVzZSBleHRyYSBwb2ludGVycyBvciB3ZSB3aWxsIGNyZWF0ZSBhIHJlZmVy
ZW5jZSBjeWNsZS4KLSAgICAgICAgbV9kb2NUeXBlID0gMDsKLSAgICAgICAgbV9mb2N1c2VkTm9k
ZSA9IDA7Ci0gICAgICAgIG1faG92ZXJOb2RlID0gMDsKLSAgICAgICAgbV9hY3RpdmVOb2RlID0g
MDsKLSAgICAgICAgbV90aXRsZUVsZW1lbnQgPSAwOwotICAgICAgICBtX2RvY3VtZW50RWxlbWVu
dCA9IDA7Ci0gICAgICAgIG1fY29udGV4dEZlYXR1cmVzID0gQ29udGV4dEZlYXR1cmVzOjpkZWZh
dWx0U3dpdGNoKCk7Ci0jaWYgRU5BQkxFKEZVTExTQ1JFRU5fQVBJKQotICAgICAgICBtX2Z1bGxT
Y3JlZW5FbGVtZW50ID0gMDsKLSAgICAgICAgbV9mdWxsU2NyZWVuRWxlbWVudFN0YWNrLmNsZWFy
KCk7Ci0jZW5kaWYKLQotICAgICAgICBkZXRhY2hQYXJzZXIoKTsKLQotICAgICAgICAvLyByZW1v
dmVBbGxDaGlsZHJlbigpIGRvZXNuJ3QgYWx3YXlzIHVucmVnaXN0ZXIgSURzLAotICAgICAgICAv
LyBzbyB0ZWFyIGRvd24gc2NvcGUgaW5mb3JtYXRpb24gdXBmcm9udCB0byBhdm9pZCBoYXZpbmcg
c3RhbGUgcmVmZXJlbmNlcyBpbiB0aGUgbWFwLgotICAgICAgICBkZXN0cm95VHJlZVNjb3BlRGF0
YSgpOwotICAgICAgICByZW1vdmVBbGxDaGlsZHJlbigpOwotCi0gICAgICAgIG1fbWFya2Vycy0+
ZGV0YWNoKCk7Ci0KLSAgICAgICAgbV9jc3NDYW52YXNFbGVtZW50cy5jbGVhcigpOwotCi0jaWYg
RU5BQkxFKFJFUVVFU1RfQU5JTUFUSU9OX0ZSQU1FKQotICAgICAgICAvLyBGSVhNRTogY29uc2lk
ZXIgdXNpbmcgQWN0aXZlRE9NT2JqZWN0LgotICAgICAgICBpZiAobV9zY3JpcHRlZEFuaW1hdGlv
bkNvbnRyb2xsZXIpCi0gICAgICAgICAgICBtX3NjcmlwdGVkQW5pbWF0aW9uQ29udHJvbGxlci0+
Y2xlYXJEb2N1bWVudFBvaW50ZXIoKTsKLSAgICAgICAgbV9zY3JpcHRlZEFuaW1hdGlvbkNvbnRy
b2xsZXIuY2xlYXIoKTsKLSNlbmRpZgotCi0jaWZuZGVmIE5ERUJVRwotICAgICAgICBtX2luUmVt
b3ZlZExhc3RSZWZGdW5jdGlvbiA9IGZhbHNlOwotI2VuZGlmCi0KLSAgICAgICAgZ3VhcmREZXJl
ZigpOwotICAgIH0gZWxzZSB7Ci0jaWZuZGVmIE5ERUJVRyAKLSAgICAgICAgbV9kZWxldGlvbkhh
c0JlZ3VuID0gdHJ1ZTsgCi0jZW5kaWYgCi0gICAgICAgIGRlbGV0ZSB0aGlzOwotICAgIH0KLX0K
LQotRWxlbWVudCogRG9jdW1lbnQ6OmdldEVsZW1lbnRCeUlkKGNvbnN0IEF0b21pY1N0cmluZyYg
aWQpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIFRyZWVTY29wZTo6Z2V0RWxlbWVudEJ5SWQoaWQpOwog
fQogCi1FbGVtZW50KiBEb2N1bWVudDo6Z2V0RWxlbWVudEJ5QWNjZXNzS2V5KGNvbnN0IFN0cmlu
ZyYga2V5KQorQ1NTU3R5bGVTaGVldCogRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6cGFn
ZVVzZXJTaGVldCgpCiB7Ci0gICAgaWYgKGtleS5pc0VtcHR5KCkpCisgICAgaWYgKG1fcGFnZVVz
ZXJTaGVldCkKKyAgICAgICAgcmV0dXJuIG1fcGFnZVVzZXJTaGVldC5nZXQoKTsKKyAgICAKKyAg
ICBQYWdlKiBvd25pbmdQYWdlID0gbV9kb2N1bWVudC0+cGFnZSgpOworICAgIGlmICghb3duaW5n
UGFnZSkKICAgICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKCFtX2FjY2Vzc0tleU1hcFZhbGlkKSB7
Ci0gICAgICAgIGJ1aWxkQWNjZXNzS2V5TWFwKHRoaXMpOwotICAgICAgICBtX2FjY2Vzc0tleU1h
cFZhbGlkID0gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIG1fZWxlbWVudHNCeUFjY2Vzc0tleS5n
ZXQoa2V5LmltcGwoKSk7CisgICAgCisgICAgU3RyaW5nIHVzZXJTaGVldFRleHQgPSBvd25pbmdQ
YWdlLT51c2VyU3R5bGVTaGVldCgpOworICAgIGlmICh1c2VyU2hlZXRUZXh0LmlzRW1wdHkoKSkK
KyAgICAgICAgcmV0dXJuIDA7CisgICAgCisgICAgLy8gUGFyc2UgdGhlIHNoZWV0IGFuZCBjYWNo
ZSBpdC4KKyAgICBtX3BhZ2VVc2VyU2hlZXQgPSBDU1NTdHlsZVNoZWV0OjpjcmVhdGVJbmxpbmUo
bV9kb2N1bWVudCwgbV9kb2N1bWVudC0+c2V0dGluZ3MoKS0+dXNlclN0eWxlU2hlZXRMb2NhdGlv
bigpKTsKKyAgICBtX3BhZ2VVc2VyU2hlZXQtPmNvbnRlbnRzKCktPnNldElzVXNlclN0eWxlU2hl
ZXQodHJ1ZSk7CisgICAgbV9wYWdlVXNlclNoZWV0LT5jb250ZW50cygpLT5wYXJzZVN0cmluZyh1
c2VyU2hlZXRUZXh0KTsKKyAgICByZXR1cm4gbV9wYWdlVXNlclNoZWV0LmdldCgpOwogfQogCi12
b2lkIERvY3VtZW50OjpidWlsZEFjY2Vzc0tleU1hcChUcmVlU2NvcGUqIHNjb3BlKQordm9pZCBE
b2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjpjbGVhclBhZ2VVc2VyU2hlZXQoKQogewotICAg
IEFTU0VSVChzY29wZSk7Ci0gICAgTm9kZSogcm9vdE5vZGUgPSBzY29wZS0+cm9vdE5vZGUoKTsK
LSAgICBmb3IgKE5vZGUqIG5vZGUgPSByb290Tm9kZTsgbm9kZTsgbm9kZSA9IG5vZGUtPnRyYXZl
cnNlTmV4dE5vZGUocm9vdE5vZGUpKSB7Ci0gICAgICAgIGlmICghbm9kZS0+aXNFbGVtZW50Tm9k
ZSgpKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIEVsZW1lbnQqIGVsZW1lbnQgPSBz
dGF0aWNfY2FzdDxFbGVtZW50Kj4obm9kZSk7Ci0gICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyYg
YWNjZXNzS2V5ID0gZWxlbWVudC0+Z2V0QXR0cmlidXRlKGFjY2Vzc2tleUF0dHIpOwotICAgICAg
ICBpZiAoIWFjY2Vzc0tleS5pc0VtcHR5KCkpCi0gICAgICAgICAgICBtX2VsZW1lbnRzQnlBY2Nl
c3NLZXkuc2V0KGFjY2Vzc0tleS5pbXBsKCksIGVsZW1lbnQpOwotCi0gICAgICAgIGZvciAoU2hh
ZG93Um9vdCogcm9vdCA9IG5vZGUtPnlvdW5nZXN0U2hhZG93Um9vdCgpOyByb290OyByb290ID0g
cm9vdC0+b2xkZXJTaGFkb3dSb290KCkpCi0gICAgICAgICAgICBidWlsZEFjY2Vzc0tleU1hcChy
b290KTsKKyAgICBpZiAobV9wYWdlVXNlclNoZWV0KSB7CisgICAgICAgIG1fcGFnZVVzZXJTaGVl
dCA9IDA7CisgICAgICAgIG1fZG9jdW1lbnQtPnN0eWxlUmVzb2x2ZXJDaGFuZ2VkKERlZmVyUmVj
YWxjU3R5bGUpOwogICAgIH0KIH0KIAotdm9pZCBEb2N1bWVudDo6aW52YWxpZGF0ZUFjY2Vzc0tl
eU1hcCgpCit2b2lkIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OnVwZGF0ZVBhZ2VVc2Vy
U2hlZXQoKQogewotICAgIG1fYWNjZXNzS2V5TWFwVmFsaWQgPSBmYWxzZTsKLSAgICBtX2VsZW1l
bnRzQnlBY2Nlc3NLZXkuY2xlYXIoKTsKLX0KLQotU2VsZWN0b3JRdWVyeUNhY2hlKiBEb2N1bWVu
dDo6c2VsZWN0b3JRdWVyeUNhY2hlKCkKLXsKLSAgICBpZiAoIW1fc2VsZWN0b3JRdWVyeUNhY2hl
KQotICAgICAgICBtX3NlbGVjdG9yUXVlcnlDYWNoZSA9IGFkb3B0UHRyKG5ldyBTZWxlY3RvclF1
ZXJ5Q2FjaGUoKSk7Ci0gICAgcmV0dXJuIG1fc2VsZWN0b3JRdWVyeUNhY2hlLmdldCgpOworICAg
IGNsZWFyUGFnZVVzZXJTaGVldCgpOworICAgIGlmIChwYWdlVXNlclNoZWV0KCkpCisgICAgICAg
IG1fZG9jdW1lbnQtPnN0eWxlUmVzb2x2ZXJDaGFuZ2VkKFJlY2FsY1N0eWxlSW1tZWRpYXRlbHkp
OwogfQogCi1NZWRpYVF1ZXJ5TWF0Y2hlciogRG9jdW1lbnQ6Om1lZGlhUXVlcnlNYXRjaGVyKCkK
K2NvbnN0IFZlY3RvcjxSZWZQdHI8Q1NTU3R5bGVTaGVldD4gPiogRG9jdW1lbnRTdHlsZVNoZWV0
Q29sbGVjdGlvbjo6cGFnZUdyb3VwVXNlclNoZWV0cygpIGNvbnN0CiB7Ci0gICAgaWYgKCFtX21l
ZGlhUXVlcnlNYXRjaGVyKQotICAgICAgICBtX21lZGlhUXVlcnlNYXRjaGVyID0gTWVkaWFRdWVy
eU1hdGNoZXI6OmNyZWF0ZSh0aGlzKTsKLSAgICByZXR1cm4gbV9tZWRpYVF1ZXJ5TWF0Y2hlci5n
ZXQoKTsKLX0KKyAgICBpZiAobV9wYWdlR3JvdXBVc2VyU2hlZXRDYWNoZVZhbGlkKQorICAgICAg
ICByZXR1cm4gbV9wYWdlR3JvdXBVc2VyU2hlZXRzLmdldCgpOworICAgIAorICAgIG1fcGFnZUdy
b3VwVXNlclNoZWV0Q2FjaGVWYWxpZCA9IHRydWU7CisgICAgCisgICAgUGFnZSogb3duaW5nUGFn
ZSA9IG1fZG9jdW1lbnQtPnBhZ2UoKTsKKyAgICBpZiAoIW93bmluZ1BhZ2UpCisgICAgICAgIHJl
dHVybiAwOworICAgICAgICAKKyAgICBjb25zdCBQYWdlR3JvdXAmIHBhZ2VHcm91cCA9IG93bmlu
Z1BhZ2UtPmdyb3VwKCk7CisgICAgY29uc3QgVXNlclN0eWxlU2hlZXRNYXAqIHNoZWV0c01hcCA9
IHBhZ2VHcm91cC51c2VyU3R5bGVTaGVldHMoKTsKKyAgICBpZiAoIXNoZWV0c01hcCkKKyAgICAg
ICAgcmV0dXJuIDA7CiAKLXZvaWQgRG9jdW1lbnQ6OnNldENvbXBhdGliaWxpdHlNb2RlKENvbXBh
dGliaWxpdHlNb2RlIG1vZGUpCi17Ci0gICAgaWYgKG1fY29tcGF0aWJpbGl0eU1vZGVMb2NrZWQg
fHwgbW9kZSA9PSBtX2NvbXBhdGliaWxpdHlNb2RlKQotICAgICAgICByZXR1cm47Ci0gICAgQVNT
RVJUKCFtX3N0eWxlU2hlZXRzLT5sZW5ndGgoKSk7Ci0gICAgYm9vbCB3YXNJblF1aXJrc01vZGUg
PSBpblF1aXJrc01vZGUoKTsKLSAgICBtX2NvbXBhdGliaWxpdHlNb2RlID0gbW9kZTsKLSAgICBz
ZWxlY3RvclF1ZXJ5Q2FjaGUoKS0+aW52YWxpZGF0ZSgpOwotICAgIGlmIChpblF1aXJrc01vZGUo
KSAhPSB3YXNJblF1aXJrc01vZGUpIHsKLSAgICAgICAgLy8gQWxsIHVzZXIgc3R5bGVzaGVldHMg
aGF2ZSB0byByZXBhcnNlIHVzaW5nIHRoZSBkaWZmZXJlbnQgbW9kZS4KLSAgICAgICAgY2xlYXJQ
YWdlVXNlclNoZWV0KCk7Ci0gICAgICAgIGNsZWFyUGFnZUdyb3VwVXNlclNoZWV0cygpOworICAg
IFVzZXJTdHlsZVNoZWV0TWFwOjpjb25zdF9pdGVyYXRvciBlbmQgPSBzaGVldHNNYXAtPmVuZCgp
OworICAgIGZvciAoVXNlclN0eWxlU2hlZXRNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gc2hlZXRz
TWFwLT5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgY29uc3QgVXNlclN0eWxl
U2hlZXRWZWN0b3IqIHNoZWV0cyA9IGl0LT5zZWNvbmQuZ2V0KCk7CisgICAgICAgIGZvciAodW5z
aWduZWQgaSA9IDA7IGkgPCBzaGVldHMtPnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBjb25z
dCBVc2VyU3R5bGVTaGVldCogc2hlZXQgPSBzaGVldHMtPmF0KGkpLmdldCgpOworICAgICAgICAg
ICAgaWYgKHNoZWV0LT5pbmplY3RlZEZyYW1lcygpID09IEluamVjdEluVG9wRnJhbWVPbmx5ICYm
IG1fZG9jdW1lbnQtPm93bmVyRWxlbWVudCgpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOwor
ICAgICAgICAgICAgaWYgKCFVc2VyQ29udGVudFVSTFBhdHRlcm46Om1hdGNoZXNQYXR0ZXJucyht
X2RvY3VtZW50LT51cmwoKSwgc2hlZXQtPndoaXRlbGlzdCgpLCBzaGVldC0+YmxhY2tsaXN0KCkp
KQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgUmVmUHRyPENTU1N0eWxl
U2hlZXQ+IGdyb3VwU2hlZXQgPSBDU1NTdHlsZVNoZWV0OjpjcmVhdGVJbmxpbmUoY29uc3RfY2Fz
dDxEb2N1bWVudCo+KG1fZG9jdW1lbnQpLCBzaGVldC0+dXJsKCkpOworICAgICAgICAgICAgaWYg
KCFtX3BhZ2VHcm91cFVzZXJTaGVldHMpCisgICAgICAgICAgICAgICAgbV9wYWdlR3JvdXBVc2Vy
U2hlZXRzID0gYWRvcHRQdHIobmV3IFZlY3RvcjxSZWZQdHI8Q1NTU3R5bGVTaGVldD4gPik7Cisg
ICAgICAgICAgICBtX3BhZ2VHcm91cFVzZXJTaGVldHMtPmFwcGVuZChncm91cFNoZWV0KTsKKyAg
ICAgICAgICAgIGdyb3VwU2hlZXQtPmNvbnRlbnRzKCktPnNldElzVXNlclN0eWxlU2hlZXQoc2hl
ZXQtPmxldmVsKCkgPT0gVXNlclN0eWxlVXNlckxldmVsKTsKKyAgICAgICAgICAgIGdyb3VwU2hl
ZXQtPmNvbnRlbnRzKCktPnBhcnNlU3RyaW5nKHNoZWV0LT5zb3VyY2UoKSk7CisgICAgICAgIH0K
ICAgICB9Ci19Ci0KLVN0cmluZyBEb2N1bWVudDo6Y29tcGF0TW9kZSgpIGNvbnN0Ci17Ci0gICAg
cmV0dXJuIGluUXVpcmtzTW9kZSgpID8gIkJhY2tDb21wYXQiIDogIkNTUzFDb21wYXQiOwotfQog
Ci12b2lkIERvY3VtZW50OjpyZXNldExpbmtDb2xvcigpCi17Ci0gICAgbV9saW5rQ29sb3IgPSBD
b2xvcigwLCAwLCAyMzgpOworICAgIHJldHVybiBtX3BhZ2VHcm91cFVzZXJTaGVldHMuZ2V0KCk7
CiB9CiAKLXZvaWQgRG9jdW1lbnQ6OnJlc2V0VmlzaXRlZExpbmtDb2xvcigpCit2b2lkIERvY3Vt
ZW50U3R5bGVTaGVldENvbGxlY3Rpb246OmNsZWFyUGFnZUdyb3VwVXNlclNoZWV0cygpCiB7Ci0g
ICAgbV92aXNpdGVkTGlua0NvbG9yID0gQ29sb3IoODUsIDI2LCAxMzkpOyAgICAKKyAgICBtX3Bh
Z2VHcm91cFVzZXJTaGVldENhY2hlVmFsaWQgPSBmYWxzZTsKKyAgICBpZiAobV9wYWdlR3JvdXBV
c2VyU2hlZXRzICYmIG1fcGFnZUdyb3VwVXNlclNoZWV0cy0+c2l6ZSgpKSB7CisgICAgICAgIG1f
cGFnZUdyb3VwVXNlclNoZWV0cy0+Y2xlYXIoKTsKKyAgICAgICAgbV9kb2N1bWVudC0+c3R5bGVS
ZXNvbHZlckNoYW5nZWQoRGVmZXJSZWNhbGNTdHlsZSk7CisgICAgfQogfQogCi12b2lkIERvY3Vt
ZW50OjpyZXNldEFjdGl2ZUxpbmtDb2xvcigpCit2b2lkIERvY3VtZW50U3R5bGVTaGVldENvbGxl
Y3Rpb246OnVwZGF0ZVBhZ2VHcm91cFVzZXJTaGVldHMoKQogewotICAgIG1fYWN0aXZlTGlua0Nv
bG9yLnNldE5hbWVkQ29sb3IoInJlZCIpOworICAgIGNsZWFyUGFnZUdyb3VwVXNlclNoZWV0cygp
OworICAgIGlmIChwYWdlR3JvdXBVc2VyU2hlZXRzKCkgJiYgcGFnZUdyb3VwVXNlclNoZWV0cygp
LT5zaXplKCkpCisgICAgICAgIG1fZG9jdW1lbnQtPnN0eWxlUmVzb2x2ZXJDaGFuZ2VkKFJlY2Fs
Y1N0eWxlSW1tZWRpYXRlbHkpOwogfQogCi12b2lkIERvY3VtZW50OjpzZXREb2NUeXBlKFBhc3NS
ZWZQdHI8RG9jdW1lbnRUeXBlPiBkb2NUeXBlKQordm9pZCBEb2N1bWVudFN0eWxlU2hlZXRDb2xs
ZWN0aW9uOjphZGRVc2VyU2hlZXQoUGFzc1JlZlB0cjxTdHlsZVNoZWV0Q29udGVudHM+IHVzZXJT
aGVldCkKIHsKLSAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgbW9yZSB0aGFuIG9u
Y2UuCi0gICAgQVNTRVJUKCFtX2RvY1R5cGUgfHwgIWRvY1R5cGUpOwotICAgIG1fZG9jVHlwZSA9
IGRvY1R5cGU7Ci0gICAgaWYgKG1fZG9jVHlwZSkgewotICAgICAgICB0aGlzLT5hZG9wdElmTmVl
ZGVkKG1fZG9jVHlwZS5nZXQoKSk7Ci0jaWYgRU5BQkxFKExFR0FDWV9WSUVXUE9SVF9BREFQVElP
TikKLSAgICAgICAgaWYgKG1fZG9jVHlwZS0+cHVibGljSWQoKS5zdGFydHNXaXRoKCItLy93YXBm
b3J1bS8vZHRkIHhodG1sIG1vYmlsZSAxLiIsIC8qIGNhc2VTZW5zaXRpdmUgKi8gZmFsc2UpKQot
ICAgICAgICAgICAgcHJvY2Vzc1ZpZXdwb3J0KCJ3aWR0aD1kZXZpY2Utd2lkdGgsIGhlaWdodD1k
ZXZpY2UtaGVpZ2h0IiwgVmlld3BvcnRBcmd1bWVudHM6OlhIVE1MTW9iaWxlUHJvZmlsZSk7Ci0j
ZW5kaWYKLSAgICB9Ci0gICAgLy8gRG9jdHlwZSBhZmZlY3RzIHRoZSBpbnRlcnByZXRhdGlvbiBv
ZiB0aGUgc3R5bGVzaGVldHMuCi0gICAgY2xlYXJTdHlsZVJlc29sdmVyKCk7CisgICAgaWYgKCFt
X3VzZXJTaGVldHMpCisgICAgICAgIG1fdXNlclNoZWV0cyA9IGFkb3B0UHRyKG5ldyBWZWN0b3I8
UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4pOworICAgIG1fdXNlclNoZWV0cy0+YXBwZW5kKENTU1N0
eWxlU2hlZXQ6OmNyZWF0ZSh1c2VyU2hlZXQsIG1fZG9jdW1lbnQpKTsKKyAgICBtX2RvY3VtZW50
LT5zdHlsZVJlc29sdmVyQ2hhbmdlZChSZWNhbGNTdHlsZUltbWVkaWF0ZWx5KTsKIH0KIAotRE9N
SW1wbGVtZW50YXRpb24qIERvY3VtZW50OjppbXBsZW1lbnRhdGlvbigpCisvLyBUaGlzIG1ldGhv
ZCBpcyBjYWxsZWQgd2hlbmV2ZXIgYSB0b3AtbGV2ZWwgc3R5bGVzaGVldCBoYXMgZmluaXNoZWQg
bG9hZGluZy4KK3ZvaWQgRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6cmVtb3ZlUGVuZGlu
Z1NoZWV0KFJlbW92ZVBlbmRpbmdTaGVldE5vdGlmaWNhdGlvblR5cGUgbm90aWZpY2F0aW9uKQog
ewotICAgIGlmICghbV9pbXBsZW1lbnRhdGlvbikKLSAgICAgICAgbV9pbXBsZW1lbnRhdGlvbiA9
IERPTUltcGxlbWVudGF0aW9uOjpjcmVhdGUodGhpcyk7Ci0gICAgcmV0dXJuIG1faW1wbGVtZW50
YXRpb24uZ2V0KCk7Ci19CisgICAgLy8gTWFrZSBzdXJlIHdlIGtuZXcgdGhpcyBzaGVldCB3YXMg
cGVuZGluZywgYW5kIHRoYXQgb3VyIGNvdW50IGlzbid0IG91dCBvZiBzeW5jLgorICAgIEFTU0VS
VChtX3BlbmRpbmdTdHlsZXNoZWV0cyA+IDApOwogCi12b2lkIERvY3VtZW50OjpjaGlsZHJlbkNo
YW5nZWQoYm9vbCBjaGFuZ2VkQnlQYXJzZXIsIE5vZGUqIGJlZm9yZUNoYW5nZSwgTm9kZSogYWZ0
ZXJDaGFuZ2UsIGludCBjaGlsZENvdW50RGVsdGEpCi17Ci0gICAgQ29udGFpbmVyTm9kZTo6Y2hp
bGRyZW5DaGFuZ2VkKGNoYW5nZWRCeVBhcnNlciwgYmVmb3JlQ2hhbmdlLCBhZnRlckNoYW5nZSwg
Y2hpbGRDb3VudERlbHRhKTsKKyAgICBtX3BlbmRpbmdTdHlsZXNoZWV0cy0tOwogICAgIAotICAg
IEVsZW1lbnQqIG5ld0RvY3VtZW50RWxlbWVudCA9IGZpcnN0RWxlbWVudENoaWxkKHRoaXMpOwot
ICAgIGlmIChuZXdEb2N1bWVudEVsZW1lbnQgPT0gbV9kb2N1bWVudEVsZW1lbnQpCisjaWZkZWYg
SU5TVFJVTUVOVF9MQVlPVVRfU0NIRURVTElORworICAgIGlmICghb3duZXJFbGVtZW50KCkpCisg
ICAgICAgIHByaW50ZigiU3R5bGVzaGVldCBsb2FkZWQgYXQgdGltZSAlZC4gJWQgc3R5bGVzaGVl
dHMgc3RpbGwgcmVtYWluLlxuIiwgZWxhcHNlZFRpbWUoKSwgbV9wZW5kaW5nU3R5bGVzaGVldHMp
OworI2VuZGlmCisKKyAgICBpZiAobV9wZW5kaW5nU3R5bGVzaGVldHMpCiAgICAgICAgIHJldHVy
bjsKLSAgICBtX2RvY3VtZW50RWxlbWVudCA9IG5ld0RvY3VtZW50RWxlbWVudDsKLSAgICAvLyBU
aGUgcm9vdCBzdHlsZSB1c2VkIGZvciBtZWRpYSBxdWVyeSBtYXRjaGluZyBkZXBlbmRzIG9uIHRo
ZSBkb2N1bWVudCBlbGVtZW50LgotICAgIGNsZWFyU3R5bGVSZXNvbHZlcigpOwotfQogCi1QYXNz
UmVmUHRyPEVsZW1lbnQ+IERvY3VtZW50OjpjcmVhdGVFbGVtZW50KGNvbnN0IEF0b21pY1N0cmlu
ZyYgbmFtZSwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgaWYgKCFpc1ZhbGlkTmFtZShuYW1l
KSkgewotICAgICAgICBlYyA9IElOVkFMSURfQ0hBUkFDVEVSX0VSUjsKLSAgICAgICAgcmV0dXJu
IDA7CisgICAgaWYgKG5vdGlmaWNhdGlvbiA9PSBSZW1vdmVQZW5kaW5nU2hlZXROb3RpZnlMYXRl
cikgeworICAgICAgICBtX2RvY3VtZW50LT5zZXROZWVkc05vdGlmeVJlbW92ZUFsbFBlbmRpbmdT
dHlsZXNoZWV0KCk7CisgICAgICAgIHJldHVybjsKICAgICB9Ci0KLSAgICBpZiAobV9pc1hIVE1M
KQotICAgICAgICByZXR1cm4gSFRNTEVsZW1lbnRGYWN0b3J5OjpjcmVhdGVIVE1MRWxlbWVudChR
dWFsaWZpZWROYW1lKG51bGxBdG9tLCBuYW1lLCB4aHRtbE5hbWVzcGFjZVVSSSksIHRoaXMsIDAs
IGZhbHNlKTsKLQotICAgIHJldHVybiBjcmVhdGVFbGVtZW50KFF1YWxpZmllZE5hbWUobnVsbEF0
b20sIG5hbWUsIG51bGxBdG9tKSwgZmFsc2UpOwotfQotCi1QYXNzUmVmUHRyPERvY3VtZW50RnJh
Z21lbnQ+IERvY3VtZW50OjpjcmVhdGVEb2N1bWVudEZyYWdtZW50KCkKLXsKLSAgICByZXR1cm4g
RG9jdW1lbnRGcmFnbWVudDo6Y3JlYXRlKGRvY3VtZW50KCkpOworICAgIAorICAgIG1fZG9jdW1l
bnQtPmRpZFJlbW92ZUFsbFBlbmRpbmdTdHlsZXNoZWV0KCk7CiB9CiAKLVBhc3NSZWZQdHI8VGV4
dD4gRG9jdW1lbnQ6OmNyZWF0ZVRleHROb2RlKGNvbnN0IFN0cmluZyYgZGF0YSkKK3ZvaWQgRG9j
dW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6YWRkU3R5bGVTaGVldENhbmRpZGF0ZU5vZGUoTm9k
ZSogbm9kZSwgYm9vbCBjcmVhdGVkQnlQYXJzZXIpCiB7Ci0gICAgcmV0dXJuIFRleHQ6OmNyZWF0
ZSh0aGlzLCBkYXRhKTsKLX0KLQotUGFzc1JlZlB0cjxDb21tZW50PiBEb2N1bWVudDo6Y3JlYXRl
Q29tbWVudChjb25zdCBTdHJpbmcmIGRhdGEpCi17Ci0gICAgcmV0dXJuIENvbW1lbnQ6OmNyZWF0
ZSh0aGlzLCBkYXRhKTsKLX0KLQotUGFzc1JlZlB0cjxDREFUQVNlY3Rpb24+IERvY3VtZW50Ojpj
cmVhdGVDREFUQVNlY3Rpb24oY29uc3QgU3RyaW5nJiBkYXRhLCBFeGNlcHRpb25Db2RlJiBlYykK
LXsKLSAgICBpZiAoaXNIVE1MRG9jdW1lbnQoKSkgewotICAgICAgICBlYyA9IE5PVF9TVVBQT1JU
RURfRVJSOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIENEQVRBU2VjdGlv
bjo6Y3JlYXRlKHRoaXMsIGRhdGEpOwotfQotCi1QYXNzUmVmUHRyPFByb2Nlc3NpbmdJbnN0cnVj
dGlvbj4gRG9jdW1lbnQ6OmNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihjb25zdCBTdHJpbmcm
IHRhcmdldCwgY29uc3QgU3RyaW5nJiBkYXRhLCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICBp
ZiAoIWlzVmFsaWROYW1lKHRhcmdldCkpIHsKLSAgICAgICAgZWMgPSBJTlZBTElEX0NIQVJBQ1RF
Ul9FUlI7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAoaXNIVE1MRG9jdW1lbnQo
KSkgewotICAgICAgICBlYyA9IE5PVF9TVVBQT1JURURfRVJSOwotICAgICAgICByZXR1cm4gMDsK
LSAgICB9Ci0gICAgcmV0dXJuIFByb2Nlc3NpbmdJbnN0cnVjdGlvbjo6Y3JlYXRlKHRoaXMsIHRh
cmdldCwgZGF0YSk7Ci19Ci0KLVBhc3NSZWZQdHI8RW50aXR5UmVmZXJlbmNlPiBEb2N1bWVudDo6
Y3JlYXRlRW50aXR5UmVmZXJlbmNlKGNvbnN0IFN0cmluZyYgbmFtZSwgRXhjZXB0aW9uQ29kZSYg
ZWMpCi17Ci0gICAgaWYgKCFpc1ZhbGlkTmFtZShuYW1lKSkgewotICAgICAgICBlYyA9IElOVkFM
SURfQ0hBUkFDVEVSX0VSUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChpc0hU
TUxEb2N1bWVudCgpKSB7Ci0gICAgICAgIGVjID0gTk9UX1NVUFBPUlRFRF9FUlI7Ci0gICAgICAg
IHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gRW50aXR5UmVmZXJlbmNlOjpjcmVhdGUodGhp
cywgbmFtZSk7Ci19Ci0KLVBhc3NSZWZQdHI8RWRpdGluZ1RleHQ+IERvY3VtZW50OjpjcmVhdGVF
ZGl0aW5nVGV4dE5vZGUoY29uc3QgU3RyaW5nJiB0ZXh0KQotewotICAgIHJldHVybiBFZGl0aW5n
VGV4dDo6Y3JlYXRlKHRoaXMsIHRleHQpOwotfQotCi1QYXNzUmVmUHRyPENTU1N0eWxlRGVjbGFy
YXRpb24+IERvY3VtZW50OjpjcmVhdGVDU1NTdHlsZURlY2xhcmF0aW9uKCkKLXsKLSAgICByZXR1
cm4gU3R5bGVQcm9wZXJ0eVNldDo6Y3JlYXRlKCktPmVuc3VyZUNTU1N0eWxlRGVjbGFyYXRpb24o
KTsKLX0KLQotUGFzc1JlZlB0cjxOb2RlPiBEb2N1bWVudDo6aW1wb3J0Tm9kZShOb2RlKiBpbXBv
cnRlZE5vZGUsIGJvb2wgZGVlcCwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgZWMgPSAwOwot
ICAgIAotICAgIGlmICghaW1wb3J0ZWROb2RlKSB7Ci0gICAgICAgIGVjID0gTk9UX1NVUFBPUlRF
RF9FUlI7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHN3aXRjaCAoaW1wb3J0ZWRO
b2RlLT5ub2RlVHlwZSgpKSB7Ci0gICAgY2FzZSBURVhUX05PREU6Ci0gICAgICAgIHJldHVybiBj
cmVhdGVUZXh0Tm9kZShpbXBvcnRlZE5vZGUtPm5vZGVWYWx1ZSgpKTsKLSAgICBjYXNlIENEQVRB
X1NFQ1RJT05fTk9ERToKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUNEQVRBU2VjdGlvbihpbXBvcnRl
ZE5vZGUtPm5vZGVWYWx1ZSgpLCBlYyk7Ci0gICAgY2FzZSBFTlRJVFlfUkVGRVJFTkNFX05PREU6
Ci0gICAgICAgIHJldHVybiBjcmVhdGVFbnRpdHlSZWZlcmVuY2UoaW1wb3J0ZWROb2RlLT5ub2Rl
TmFtZSgpLCBlYyk7Ci0gICAgY2FzZSBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU6Ci0gICAg
ICAgIHJldHVybiBjcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oaW1wb3J0ZWROb2RlLT5ub2Rl
TmFtZSgpLCBpbXBvcnRlZE5vZGUtPm5vZGVWYWx1ZSgpLCBlYyk7Ci0gICAgY2FzZSBDT01NRU5U
X05PREU6Ci0gICAgICAgIHJldHVybiBjcmVhdGVDb21tZW50KGltcG9ydGVkTm9kZS0+bm9kZVZh
bHVlKCkpOwotICAgIGNhc2UgRUxFTUVOVF9OT0RFOiB7Ci0gICAgICAgIEVsZW1lbnQqIG9sZEVs
ZW1lbnQgPSBzdGF0aWNfY2FzdDxFbGVtZW50Kj4oaW1wb3J0ZWROb2RlKTsKLSAgICAgICAgLy8g
RklYTUU6IFRoZSBmb2xsb3dpbmcgY2hlY2sgbWlnaHQgYmUgdW5uZWNlc3NhcnkuIElzIGl0IHBv
c3NpYmxlIHRoYXQKLSAgICAgICAgLy8gb2xkRWxlbWVudCBoYXMgbWlzbWF0Y2hlZCBwcmVmaXgv
bmFtZXNwYWNlPwotICAgICAgICBpZiAoIWhhc1ZhbGlkTmFtZXNwYWNlRm9yRWxlbWVudHMob2xk
RWxlbWVudC0+dGFnUU5hbWUoKSkpIHsKLSAgICAgICAgICAgIGVjID0gTkFNRVNQQUNFX0VSUjsK
LSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIFJlZlB0cjxFbGVtZW50
PiBuZXdFbGVtZW50ID0gY3JlYXRlRWxlbWVudChvbGRFbGVtZW50LT50YWdRTmFtZSgpLCBlYyk7
Ci0gICAgICAgIGlmIChlYykKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIG5ld0Vs
ZW1lbnQtPmNsb25lRGF0YUZyb21FbGVtZW50KCpvbGRFbGVtZW50KTsKLQotICAgICAgICBpZiAo
ZGVlcCkgewotICAgICAgICAgICAgZm9yIChOb2RlKiBvbGRDaGlsZCA9IG9sZEVsZW1lbnQtPmZp
cnN0Q2hpbGQoKTsgb2xkQ2hpbGQ7IG9sZENoaWxkID0gb2xkQ2hpbGQtPm5leHRTaWJsaW5nKCkp
IHsKLSAgICAgICAgICAgICAgICBSZWZQdHI8Tm9kZT4gbmV3Q2hpbGQgPSBpbXBvcnROb2RlKG9s
ZENoaWxkLCB0cnVlLCBlYyk7Ci0gICAgICAgICAgICAgICAgaWYgKGVjKQotICAgICAgICAgICAg
ICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICBuZXdFbGVtZW50LT5hcHBlbmRDaGls
ZChuZXdDaGlsZC5yZWxlYXNlKCksIGVjKTsKLSAgICAgICAgICAgICAgICBpZiAoZWMpCi0gICAg
ICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAg
ICAgICAgcmV0dXJuIG5ld0VsZW1lbnQucmVsZWFzZSgpOwotICAgIH0KLSAgICBjYXNlIEFUVFJJ
QlVURV9OT0RFOgotICAgICAgICByZXR1cm4gQXR0cjo6Y3JlYXRlKHRoaXMsIFF1YWxpZmllZE5h
bWUobnVsbEF0b20sIHN0YXRpY19jYXN0PEF0dHIqPihpbXBvcnRlZE5vZGUpLT5uYW1lKCksIG51
bGxBdG9tKSwgc3RhdGljX2Nhc3Q8QXR0cio+KGltcG9ydGVkTm9kZSktPnZhbHVlKCkpOwotICAg
IGNhc2UgRE9DVU1FTlRfRlJBR01FTlRfTk9ERTogewotICAgICAgICBpZiAoaW1wb3J0ZWROb2Rl
LT5pc1NoYWRvd1Jvb3QoKSkgewotICAgICAgICAgICAgLy8gU2hhZG93Um9vdCBub2RlcyBzaG91
bGQgbm90IGJlIGV4cGxpY2l0bHkgaW1wb3J0YWJsZS4KLSAgICAgICAgICAgIC8vIEVpdGhlciB0
aGV5IGFyZSBpbXBvcnRlZCBhbG9uZyB3aXRoIHRoZWlyIGhvc3Qgbm9kZSwgb3IgY3JlYXRlZCBp
bXBsaWNpdGx5LgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgRG9jdW1l
bnRGcmFnbWVudCogb2xkRnJhZ21lbnQgPSBzdGF0aWNfY2FzdDxEb2N1bWVudEZyYWdtZW50Kj4o
aW1wb3J0ZWROb2RlKTsKLSAgICAgICAgUmVmUHRyPERvY3VtZW50RnJhZ21lbnQ+IG5ld0ZyYWdt
ZW50ID0gY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOwotICAgICAgICBpZiAoZGVlcCkgewotICAg
ICAgICAgICAgZm9yIChOb2RlKiBvbGRDaGlsZCA9IG9sZEZyYWdtZW50LT5maXJzdENoaWxkKCk7
IG9sZENoaWxkOyBvbGRDaGlsZCA9IG9sZENoaWxkLT5uZXh0U2libGluZygpKSB7Ci0gICAgICAg
ICAgICAgICAgUmVmUHRyPE5vZGU+IG5ld0NoaWxkID0gaW1wb3J0Tm9kZShvbGRDaGlsZCwgdHJ1
ZSwgZWMpOwotICAgICAgICAgICAgICAgIGlmIChlYykKLSAgICAgICAgICAgICAgICAgICAgcmV0
dXJuIDA7Ci0gICAgICAgICAgICAgICAgbmV3RnJhZ21lbnQtPmFwcGVuZENoaWxkKG5ld0NoaWxk
LnJlbGVhc2UoKSwgZWMpOwotICAgICAgICAgICAgICAgIGlmIChlYykKLSAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAg
ICAgIHJldHVybiBuZXdGcmFnbWVudC5yZWxlYXNlKCk7Ci0gICAgfQotICAgIGNhc2UgRU5USVRZ
X05PREU6Ci0gICAgY2FzZSBOT1RBVElPTl9OT0RFOgotICAgICAgICAvLyBGSVhNRTogSXQgc2hv
dWxkIGJlIHBvc3NpYmxlIHRvIGltcG9ydCB0aGVzZSBub2RlIHR5cGVzLCBob3dldmVyIGluIERP
TTMgdGhlIERvY3VtZW50VHlwZSBpcyByZWFkb25seSwgc28gdGhlcmUgaXNuJ3QgbXVjaCBzZW5z
ZSBpbiBkb2luZyB0aGF0LgotICAgICAgICAvLyBBYmlsaXR5IHRvIGFkZCB0aGVzZSBpbXBvcnRl
ZCBub2RlcyB0byBhIERvY3VtZW50VHlwZSB3aWxsIGJlIGNvbnNpZGVyZWQgZm9yIGFkZGl0aW9u
IHRvIGEgZnV0dXJlIHJlbGVhc2Ugb2YgdGhlIERPTS4KLSAgICBjYXNlIERPQ1VNRU5UX05PREU6
Ci0gICAgY2FzZSBET0NVTUVOVF9UWVBFX05PREU6Ci0gICAgY2FzZSBYUEFUSF9OQU1FU1BBQ0Vf
Tk9ERToKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGVjID0gTk9UX1NVUFBPUlRFRF9FUlI7
Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLQotUGFzc1JlZlB0cjxOb2RlPiBEb2N1bWVudDo6YWRvcHRO
b2RlKFBhc3NSZWZQdHI8Tm9kZT4gc291cmNlLCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICBp
ZiAoIXNvdXJjZSkgewotICAgICAgICBlYyA9IE5PVF9TVVBQT1JURURfRVJSOwotICAgICAgICBy
ZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZiAoc291cmNlLT5pc1JlYWRPbmx5Tm9kZSgpKSB7Ci0g
ICAgICAgIGVjID0gTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOwotICAgICAgICByZXR1cm4g
MDsKLSAgICB9Ci0KLSAgICBFdmVudFF1ZXVlU2NvcGUgc2NvcGU7Ci0KLSAgICBzd2l0Y2ggKHNv
dXJjZS0+bm9kZVR5cGUoKSkgewotICAgIGNhc2UgRU5USVRZX05PREU6Ci0gICAgY2FzZSBOT1RB
VElPTl9OT0RFOgotICAgIGNhc2UgRE9DVU1FTlRfTk9ERToKLSAgICBjYXNlIERPQ1VNRU5UX1RZ
UEVfTk9ERToKLSAgICBjYXNlIFhQQVRIX05BTUVTUEFDRV9OT0RFOgotICAgICAgICBlYyA9IE5P
VF9TVVBQT1JURURfRVJSOwotICAgICAgICByZXR1cm4gMDsgICAgICAgICAgICAKLSAgICBjYXNl
IEFUVFJJQlVURV9OT0RFOiB7ICAgICAgICAgICAgICAgICAgIAotICAgICAgICBBdHRyKiBhdHRy
ID0gc3RhdGljX2Nhc3Q8QXR0cio+KHNvdXJjZS5nZXQoKSk7Ci0gICAgICAgIGlmIChhdHRyLT5v
d25lckVsZW1lbnQoKSkKLSAgICAgICAgICAgIGF0dHItPm93bmVyRWxlbWVudCgpLT5yZW1vdmVB
dHRyaWJ1dGVOb2RlKGF0dHIsIGVjKTsKLSAgICAgICAgYXR0ci0+c2V0U3BlY2lmaWVkKHRydWUp
OwotICAgICAgICBicmVhazsKLSAgICB9ICAgICAgIAotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGlm
IChzb3VyY2UtPmlzU2hhZG93Um9vdCgpKSB7Ci0gICAgICAgICAgICAvLyBTaGFkb3dSb290IGNh
bm5vdCBkaXNjb25uZWN0IGl0c2VsZiBmcm9tIHRoZSBob3N0IG5vZGUuCi0gICAgICAgICAgICBl
YyA9IEhJRVJBUkNIWV9SRVFVRVNUX0VSUjsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAg
ICB9Ci0KLSAgICAgICAgLy8gRklYTUU6IFdoYXQgYWJvdXQgPGZyYW1lPiBhbmQgPG9iamVjdD4/
Ci0gICAgICAgIGlmIChzb3VyY2UtPmhhc1RhZ05hbWUoaWZyYW1lVGFnKSkgewotICAgICAgICAg
ICAgSFRNTElGcmFtZUVsZW1lbnQqIGlmcmFtZSA9IHN0YXRpY19jYXN0PEhUTUxJRnJhbWVFbGVt
ZW50Kj4oc291cmNlLmdldCgpKTsKLSAgICAgICAgICAgIGlmIChmcmFtZSgpICYmIGZyYW1lKCkt
PnRyZWUoKS0+aXNEZXNjZW5kYW50T2YoaWZyYW1lLT5jb250ZW50RnJhbWUoKSkpIHsKLSAgICAg
ICAgICAgICAgICBlYyA9IEhJRVJBUkNIWV9SRVFVRVNUX0VSUjsKLSAgICAgICAgICAgICAgICBy
ZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoc291cmNlLT5w
YXJlbnROb2RlKCkpCi0gICAgICAgICAgICBzb3VyY2UtPnBhcmVudE5vZGUoKS0+cmVtb3ZlQ2hp
bGQoc291cmNlLmdldCgpLCBlYyk7Ci0gICAgfQotCi0gICAgdGhpcy0+YWRvcHRJZk5lZWRlZChz
b3VyY2UuZ2V0KCkpOwotCi0gICAgcmV0dXJuIHNvdXJjZTsKLX0KLQotYm9vbCBEb2N1bWVudDo6
aGFzVmFsaWROYW1lc3BhY2VGb3JFbGVtZW50cyhjb25zdCBRdWFsaWZpZWROYW1lJiBxTmFtZSkK
LXsKLSAgICAvLyBUaGVzZSBjaGVja3MgYXJlIGZyb20gRE9NIENvcmUgTGV2ZWwgMiwgY3JlYXRl
RWxlbWVudE5TCi0gICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9j
b3JlLmh0bWwjSUQtRG9jQ3JFbE5TCi0gICAgaWYgKCFxTmFtZS5wcmVmaXgoKS5pc0VtcHR5KCkg
JiYgcU5hbWUubmFtZXNwYWNlVVJJKCkuaXNOdWxsKCkpIC8vIGNyZWF0ZUVsZW1lbnROUyhudWxs
LCAiaHRtbDpkaXYiKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKHFOYW1lLnByZWZp
eCgpID09IHhtbEF0b20gJiYgcU5hbWUubmFtZXNwYWNlVVJJKCkgIT0gWE1MTmFtZXM6OnhtbE5h
bWVzcGFjZVVSSSkgLy8gY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LmV4YW1wbGUuY29tIiwg
InhtbDpsYW5nIikKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gUmVxdWlyZWQgYnkg
RE9NIExldmVsIDMgQ29yZSBhbmQgdW5zcGVjaWZpZWQgYnkgRE9NIExldmVsIDIgQ29yZToKLSAg
ICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA0L1JFQy1ET00tTGV2ZWwtMy1Db3JlLTIwMDQw
NDA3L2NvcmUuaHRtbCNJRC1Eb2NDckVsTlMKLSAgICAvLyBjcmVhdGVFbGVtZW50TlMoImh0dHA6
Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIiwgImZvbzpiYXIiKSwgY3JlYXRlRWxlbWVudE5TKG51
bGwsICJ4bWxuczpiYXIiKQotICAgIGlmICgocU5hbWUucHJlZml4KCkgPT0geG1sbnNBdG9tICYm
IHFOYW1lLm5hbWVzcGFjZVVSSSgpICE9IFhNTE5TTmFtZXM6OnhtbG5zTmFtZXNwYWNlVVJJKSB8
fCAocU5hbWUucHJlZml4KCkgIT0geG1sbnNBdG9tICYmIHFOYW1lLm5hbWVzcGFjZVVSSSgpID09
IFhNTE5TTmFtZXM6OnhtbG5zTmFtZXNwYWNlVVJJKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6Omhhc1ZhbGlkTmFtZXNwYWNl
Rm9yQXR0cmlidXRlcyhjb25zdCBRdWFsaWZpZWROYW1lJiBxTmFtZSkKLXsKLSAgICAvLyBTcGVj
OiBET00gTGV2ZWwgMiBDb3JlOiBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3Jl
L2NvcmUuaHRtbCNJRC1FbFNldEF0dHJOUwotICAgIGlmIChxTmFtZS5wcmVmaXgoKS5pc0VtcHR5
KCkgJiYgcU5hbWUubG9jYWxOYW1lKCkgPT0geG1sbnNBdG9tKSB7Ci0gICAgICAgIC8vIE5vdGU6
IFRoZSBjYXNlIG9mIGFuICJ4bWxucyIgcXVhbGlmaWVkIG5hbWUgd2l0aCBhIG5hbWVzcGFjZSBv
ZgotICAgICAgICAvLyB4bWxuc05hbWVzcGFjZVVSSSBpcyBzcGVjaWZpY2FsbHkgYWxsb3dlZCAo
U2VlIDxodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLz4pLgotICAgICAgICByZXR1cm4gcU5h
bWUubmFtZXNwYWNlVVJJKCkgPT0gWE1MTlNOYW1lczo6eG1sbnNOYW1lc3BhY2VVUkk7Ci0gICAg
fQotICAgIHJldHVybiBoYXNWYWxpZE5hbWVzcGFjZUZvckVsZW1lbnRzKHFOYW1lKTsKLX0KLQot
Ly8gRklYTUU6IFRoaXMgc2hvdWxkIHJlYWxseSBiZSBpbiBhIHBvc3NpYmxlIEVsZW1lbnRGYWN0
b3J5IGNsYXNzCi1QYXNzUmVmUHRyPEVsZW1lbnQ+IERvY3VtZW50OjpjcmVhdGVFbGVtZW50KGNv
bnN0IFF1YWxpZmllZE5hbWUmIHFOYW1lLCBib29sIGNyZWF0ZWRCeVBhcnNlcikKLXsKLSAgICBS
ZWZQdHI8RWxlbWVudD4gZTsKLQotICAgIC8vIEZJWE1FOiBVc2UgcmVnaXN0ZXJlZCBuYW1lc3Bh
Y2VzIGFuZCBsb29rIHVwIGluIGEgaGFzaCB0byBmaW5kIHRoZSByaWdodCBmYWN0b3J5LgotICAg
IGlmIChxTmFtZS5uYW1lc3BhY2VVUkkoKSA9PSB4aHRtbE5hbWVzcGFjZVVSSSkKLSAgICAgICAg
ZSA9IEhUTUxFbGVtZW50RmFjdG9yeTo6Y3JlYXRlSFRNTEVsZW1lbnQocU5hbWUsIHRoaXMsIDAs
IGNyZWF0ZWRCeVBhcnNlcik7Ci0jaWYgRU5BQkxFKFNWRykKLSAgICBlbHNlIGlmIChxTmFtZS5u
YW1lc3BhY2VVUkkoKSA9PSBTVkdOYW1lczo6c3ZnTmFtZXNwYWNlVVJJKQotICAgICAgICBlID0g
U1ZHRWxlbWVudEZhY3Rvcnk6OmNyZWF0ZVNWR0VsZW1lbnQocU5hbWUsIHRoaXMsIGNyZWF0ZWRC
eVBhcnNlcik7Ci0jZW5kaWYKLSNpZiBFTkFCTEUoTUFUSE1MKQotICAgIGVsc2UgaWYgKHFOYW1l
Lm5hbWVzcGFjZVVSSSgpID09IE1hdGhNTE5hbWVzOjptYXRobWxOYW1lc3BhY2VVUkkpCi0gICAg
ICAgIGUgPSBNYXRoTUxFbGVtZW50RmFjdG9yeTo6Y3JlYXRlTWF0aE1MRWxlbWVudChxTmFtZSwg
dGhpcywgY3JlYXRlZEJ5UGFyc2VyKTsKLSNlbmRpZgotCi0gICAgaWYgKGUpCi0gICAgICAgIG1f
c2F3RWxlbWVudHNJbktub3duTmFtZXNwYWNlcyA9IHRydWU7Ci0gICAgZWxzZQotICAgICAgICBl
ID0gRWxlbWVudDo6Y3JlYXRlKHFOYW1lLCBkb2N1bWVudCgpKTsKLQotICAgIC8vIDxpbWFnZT4g
dXNlcyBpbWdUYWcgc28gd2UgbmVlZCBhIHNwZWNpYWwgcnVsZS4KLSAgICBBU1NFUlQoKHFOYW1l
Lm1hdGNoZXMoaW1hZ2VUYWcpICYmIGUtPnRhZ1FOYW1lKCkubWF0Y2hlcyhpbWdUYWcpICYmIGUt
PnRhZ1FOYW1lKCkucHJlZml4KCkgPT0gcU5hbWUucHJlZml4KCkpIHx8IHFOYW1lID09IGUtPnRh
Z1FOYW1lKCkpOwotCi0gICAgcmV0dXJuIGUucmVsZWFzZSgpOwotfQotCi1ib29sIERvY3VtZW50
OjpyZWdpb25CYXNlZENvbHVtbnNFbmFibGVkKCkgY29uc3QKLXsKLSAgICByZXR1cm4gc2V0dGlu
Z3MoKSAmJiBzZXR0aW5ncygpLT5yZWdpb25CYXNlZENvbHVtbnNFbmFibGVkKCk7IAotfQotCi1i
b29sIERvY3VtZW50Ojpjc3NTdGlja3lQb3NpdGlvbkVuYWJsZWQoKSBjb25zdAotewotICAgIHJl
dHVybiBzZXR0aW5ncygpICYmIHNldHRpbmdzKCktPmNzc1N0aWNreVBvc2l0aW9uRW5hYmxlZCgp
OyAKLX0KLQotYm9vbCBEb2N1bWVudDo6Y3NzUmVnaW9uc0VuYWJsZWQoKSBjb25zdAotewotICAg
IHJldHVybiBzZXR0aW5ncygpICYmIHNldHRpbmdzKCktPmNzc1JlZ2lvbnNFbmFibGVkKCk7IAot
fQotCi1ib29sIERvY3VtZW50Ojpjc3NHcmlkTGF5b3V0RW5hYmxlZCgpIGNvbnN0Ci17Ci0gICAg
cmV0dXJuIHNldHRpbmdzKCkgJiYgc2V0dGluZ3MoKS0+Y3NzR3JpZExheW91dEVuYWJsZWQoKTsK
LX0KLQotI2lmIEVOQUJMRShDU1NfUkVHSU9OUykKLQotUGFzc1JlZlB0cjxXZWJLaXROYW1lZEZs
b3c+IERvY3VtZW50Ojp3ZWJraXRHZXRGbG93QnlOYW1lKGNvbnN0IFN0cmluZyYgZmxvd05hbWUp
Ci17Ci0gICAgaWYgKCFjc3NSZWdpb25zRW5hYmxlZCgpIHx8ICFyZW5kZXJlcigpKQotICAgICAg
ICByZXR1cm4gMDsKLQotICAgIC8vIEl0J3MgcG9zc2libGUgdG8gaGF2ZSBwZW5kaW5nIHN0eWxl
cyBub3QgYXBwbGllZCB0aGF0IGFmZmVjdCB0aGUgZXhpc3RpbmcgZmxvd3MuCi0gICAgdXBkYXRl
U3R5bGVJZk5lZWRlZCgpOwotCi0gICAgcmV0dXJuIG5hbWVkRmxvd3MoKS0+Zmxvd0J5TmFtZShm
bG93TmFtZSk7Ci19Ci0KLVBhc3NSZWZQdHI8RE9NTmFtZWRGbG93Q29sbGVjdGlvbj4gRG9jdW1l
bnQ6OndlYmtpdEdldE5hbWVkRmxvd3MoKQotewotICAgIGlmICghY3NzUmVnaW9uc0VuYWJsZWQo
KSB8fCAhcmVuZGVyZXIoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICB1cGRhdGVTdHlsZUlm
TmVlZGVkKCk7Ci0KLSAgICByZXR1cm4gbmFtZWRGbG93cygpLT5jcmVhdGVDU1NPTVNuYXBzaG90
KCk7Ci19Ci0KLSNlbmRpZgotCi1OYW1lZEZsb3dDb2xsZWN0aW9uKiBEb2N1bWVudDo6bmFtZWRG
bG93cygpCi17Ci0gICAgaWYgKCFtX25hbWVkRmxvd3MpCi0gICAgICAgIG1fbmFtZWRGbG93cyA9
IE5hbWVkRmxvd0NvbGxlY3Rpb246OmNyZWF0ZSh0aGlzKTsKLQotICAgIHJldHVybiBtX25hbWVk
Rmxvd3MuZ2V0KCk7Ci19Ci0KLVBhc3NSZWZQdHI8RWxlbWVudD4gRG9jdW1lbnQ6OmNyZWF0ZUVs
ZW1lbnROUyhjb25zdCBTdHJpbmcmIG5hbWVzcGFjZVVSSSwgY29uc3QgU3RyaW5nJiBxdWFsaWZp
ZWROYW1lLCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICBTdHJpbmcgcHJlZml4LCBsb2NhbE5h
bWU7Ci0gICAgaWYgKCFwYXJzZVF1YWxpZmllZE5hbWUocXVhbGlmaWVkTmFtZSwgcHJlZml4LCBs
b2NhbE5hbWUsIGVjKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBRdWFsaWZpZWROYW1lIHFO
YW1lKHByZWZpeCwgbG9jYWxOYW1lLCBuYW1lc3BhY2VVUkkpOwotICAgIGlmICghaGFzVmFsaWRO
YW1lc3BhY2VGb3JFbGVtZW50cyhxTmFtZSkpIHsKLSAgICAgICAgZWMgPSBOQU1FU1BBQ0VfRVJS
OwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gY3JlYXRlRWxlbWVudChx
TmFtZSwgZmFsc2UpOwotfQotCi1TdHJpbmcgRG9jdW1lbnQ6OnJlYWR5U3RhdGUoKSBjb25zdAot
ewotICAgIERFRklORV9TVEFUSUNfTE9DQUwoY29uc3QgU3RyaW5nLCBsb2FkaW5nLCAoQVNDSUlM
aXRlcmFsKCJsb2FkaW5nIikpKTsKLSAgICBERUZJTkVfU1RBVElDX0xPQ0FMKGNvbnN0IFN0cmlu
ZywgaW50ZXJhY3RpdmUsIChBU0NJSUxpdGVyYWwoImludGVyYWN0aXZlIikpKTsKLSAgICBERUZJ
TkVfU1RBVElDX0xPQ0FMKGNvbnN0IFN0cmluZywgY29tcGxldGUsIChBU0NJSUxpdGVyYWwoImNv
bXBsZXRlIikpKTsKLQotICAgIHN3aXRjaCAobV9yZWFkeVN0YXRlKSB7Ci0gICAgY2FzZSBMb2Fk
aW5nOgotICAgICAgICByZXR1cm4gbG9hZGluZzsKLSAgICBjYXNlIEludGVyYWN0aXZlOgotICAg
ICAgICByZXR1cm4gaW50ZXJhY3RpdmU7Ci0gICAgY2FzZSBDb21wbGV0ZToKLSAgICAgICAgcmV0
dXJuIGNvbXBsZXRlOwotICAgIH0KLQotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgIHJl
dHVybiBTdHJpbmcoKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6c2V0UmVhZHlTdGF0ZShSZWFkeVN0
YXRlIHJlYWR5U3RhdGUpCi17Ci0gICAgaWYgKHJlYWR5U3RhdGUgPT0gbV9yZWFkeVN0YXRlKQot
ICAgICAgICByZXR1cm47Ci0KLSAgICBzd2l0Y2ggKHJlYWR5U3RhdGUpIHsKLSAgICBjYXNlIExv
YWRpbmc6Ci0gICAgICAgIGlmICghbV9kb2N1bWVudFRpbWluZy5kb21Mb2FkaW5nKQotICAgICAg
ICAgICAgbV9kb2N1bWVudFRpbWluZy5kb21Mb2FkaW5nID0gbW9ub3RvbmljYWxseUluY3JlYXNp
bmdUaW1lKCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgSW50ZXJhY3RpdmU6Ci0gICAgICAg
IGlmICghbV9kb2N1bWVudFRpbWluZy5kb21JbnRlcmFjdGl2ZSkKLSAgICAgICAgICAgIG1fZG9j
dW1lbnRUaW1pbmcuZG9tSW50ZXJhY3RpdmUgPSBtb25vdG9uaWNhbGx5SW5jcmVhc2luZ1RpbWUo
KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDb21wbGV0ZToKLSAgICAgICAgaWYgKCFtX2Rv
Y3VtZW50VGltaW5nLmRvbUNvbXBsZXRlKQotICAgICAgICAgICAgbV9kb2N1bWVudFRpbWluZy5k
b21Db21wbGV0ZSA9IG1vbm90b25pY2FsbHlJbmNyZWFzaW5nVGltZSgpOwotICAgICAgICBicmVh
azsKLSAgICB9Ci0KLSAgICBtX3JlYWR5U3RhdGUgPSByZWFkeVN0YXRlOwotICAgIGRpc3BhdGNo
RXZlbnQoRXZlbnQ6OmNyZWF0ZShldmVudE5hbWVzKCkucmVhZHlzdGF0ZWNoYW5nZUV2ZW50LCBm
YWxzZSwgZmFsc2UpKTsKLSAgICAKLSAgICBpZiAoc2V0dGluZ3MoKSAmJiBzZXR0aW5ncygpLT5z
dXBwcmVzc2VzSW5jcmVtZW50YWxSZW5kZXJpbmcoKSkKLSAgICAgICAgc2V0VmlzdWFsVXBkYXRl
c0FsbG93ZWQocmVhZHlTdGF0ZSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnNldFZpc3VhbFVwZGF0
ZXNBbGxvd2VkKFJlYWR5U3RhdGUgcmVhZHlTdGF0ZSkKLXsKLSAgICBBU1NFUlQoc2V0dGluZ3Mo
KSAmJiBzZXR0aW5ncygpLT5zdXBwcmVzc2VzSW5jcmVtZW50YWxSZW5kZXJpbmcoKSk7Ci0gICAg
c3dpdGNoIChyZWFkeVN0YXRlKSB7Ci0gICAgY2FzZSBMb2FkaW5nOgotICAgICAgICBBU1NFUlQo
IW1fdmlzdWFsVXBkYXRlc1N1cHByZXNzaW9uVGltZXIuaXNBY3RpdmUoKSk7Ci0gICAgICAgIEFT
U0VSVChtX3Zpc3VhbFVwZGF0ZXNBbGxvd2VkKTsKLSAgICAgICAgbV92aXN1YWxVcGRhdGVzU3Vw
cHJlc3Npb25UaW1lci5zdGFydE9uZVNob3Qoc2V0dGluZ3MoKS0+aW5jcmVtZW50YWxSZW5kZXJp
bmdTdXBwcmVzc2lvblRpbWVvdXRJblNlY29uZHMoKSk7Ci0gICAgICAgIHNldFZpc3VhbFVwZGF0
ZXNBbGxvd2VkKGZhbHNlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJbnRlcmFjdGl2ZToK
LSAgICAgICAgQVNTRVJUKG1fdmlzdWFsVXBkYXRlc1N1cHByZXNzaW9uVGltZXIuaXNBY3RpdmUo
KSB8fCBtX3Zpc3VhbFVwZGF0ZXNBbGxvd2VkKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBD
b21wbGV0ZToKLSAgICAgICAgaWYgKG1fdmlzdWFsVXBkYXRlc1N1cHByZXNzaW9uVGltZXIuaXNB
Y3RpdmUoKSkgewotICAgICAgICAgICAgQVNTRVJUKCFtX3Zpc3VhbFVwZGF0ZXNBbGxvd2VkKTsK
LSAgICAgICAgICAgIG1fdmlzdWFsVXBkYXRlc1N1cHByZXNzaW9uVGltZXIuc3RvcCgpOwotICAg
ICAgICAgICAgc2V0VmlzdWFsVXBkYXRlc0FsbG93ZWQodHJ1ZSk7Ci0gICAgICAgIH0gZWxzZQot
ICAgICAgICAgICAgQVNTRVJUKG1fdmlzdWFsVXBkYXRlc0FsbG93ZWQpOwotICAgICAgICBicmVh
azsKLSAgICB9Ci19Ci0gICAgCi12b2lkIERvY3VtZW50OjpzZXRWaXN1YWxVcGRhdGVzQWxsb3dl
ZChib29sIHZpc3VhbFVwZGF0ZXNBbGxvd2VkKQotewotICAgIGlmIChtX3Zpc3VhbFVwZGF0ZXNB
bGxvd2VkID09IHZpc3VhbFVwZGF0ZXNBbGxvd2VkKQotICAgICAgICByZXR1cm47Ci0KLSAgICBt
X3Zpc3VhbFVwZGF0ZXNBbGxvd2VkID0gdmlzdWFsVXBkYXRlc0FsbG93ZWQ7Ci0KLSAgICBpZiAo
IXZpc3VhbFVwZGF0ZXNBbGxvd2VkKQotICAgICAgICByZXR1cm47Ci0KLSNpZiBVU0UoQUNDRUxF
UkFURURfQ09NUE9TSVRJTkcpCi0gICAgaWYgKHZpZXcoKSkKLSAgICAgICAgdmlldygpLT51cGRh
dGVDb21wb3NpdGluZ0xheWVyc0FmdGVyTGF5b3V0KCk7Ci0jZW5kaWYKLQotICAgIGlmIChyZW5k
ZXJlcigpKQotICAgICAgICByZW5kZXJlcigpLT5yZXBhaW50KCk7Ci19Ci0KLXZvaWQgRG9jdW1l
bnQ6OnZpc3VhbFVwZGF0ZXNTdXBwcmVzc2lvblRpbWVyRmlyZWQoVGltZXI8RG9jdW1lbnQ+KikK
LXsKLSAgICBBU1NFUlQoIW1fdmlzdWFsVXBkYXRlc0FsbG93ZWQpOwotICAgIHNldFZpc3VhbFVw
ZGF0ZXNBbGxvd2VkKHRydWUpOwotfQotCi1TdHJpbmcgRG9jdW1lbnQ6OmVuY29kaW5nKCkgY29u
c3QKLXsKLSAgICBpZiAoVGV4dFJlc291cmNlRGVjb2RlciogZCA9IGRlY29kZXIoKSkKLSAgICAg
ICAgcmV0dXJuIGQtPmVuY29kaW5nKCkuZG9tTmFtZSgpOwotICAgIHJldHVybiBTdHJpbmcoKTsK
LX0KLQotU3RyaW5nIERvY3VtZW50OjpkZWZhdWx0Q2hhcnNldCgpIGNvbnN0Ci17Ci0gICAgaWYg
KFNldHRpbmdzKiBzZXR0aW5ncyA9IHRoaXMtPnNldHRpbmdzKCkpCi0gICAgICAgIHJldHVybiBz
ZXR0aW5ncy0+ZGVmYXVsdFRleHRFbmNvZGluZ05hbWUoKTsKLSAgICByZXR1cm4gU3RyaW5nKCk7
Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnNldENoYXJzZXQoY29uc3QgU3RyaW5nJiBjaGFyc2V0KQot
ewotICAgIGlmICghZGVjb2RlcigpKQotICAgICAgICByZXR1cm47Ci0gICAgZGVjb2RlcigpLT5z
ZXRFbmNvZGluZyhjaGFyc2V0LCBUZXh0UmVzb3VyY2VEZWNvZGVyOjpVc2VyQ2hvc2VuRW5jb2Rp
bmcpOwotfQotCi12b2lkIERvY3VtZW50OjpzZXRDb250ZW50TGFuZ3VhZ2UoY29uc3QgU3RyaW5n
JiBsYW5ndWFnZSkKLXsKLSAgICBpZiAobV9jb250ZW50TGFuZ3VhZ2UgPT0gbGFuZ3VhZ2UpCi0g
ICAgICAgIHJldHVybjsKLSAgICBtX2NvbnRlbnRMYW5ndWFnZSA9IGxhbmd1YWdlOwotCi0gICAg
Ly8gUmVjYWxjdWxhdGUgc3R5bGUgc28gbGFuZ3VhZ2UgaXMgdXNlZCB3aGVuIHNlbGVjdGluZyB0
aGUgaW5pdGlhbCBmb250LgotICAgIHN0eWxlUmVzb2x2ZXJDaGFuZ2VkKERlZmVyUmVjYWxjU3R5
bGUpOwotfQotCi12b2lkIERvY3VtZW50OjpzZXRYTUxWZXJzaW9uKGNvbnN0IFN0cmluZyYgdmVy
c2lvbiwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgaWYgKCFpbXBsZW1lbnRhdGlvbigpLT5o
YXNGZWF0dXJlKCJYTUwiLCBTdHJpbmcoKSkpIHsKLSAgICAgICAgZWMgPSBOT1RfU1VQUE9SVEVE
X0VSUjsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICghWE1MRG9jdW1lbnRQYXJz
ZXI6OnN1cHBvcnRzWE1MVmVyc2lvbih2ZXJzaW9uKSkgewotICAgICAgICBlYyA9IE5PVF9TVVBQ
T1JURURfRVJSOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbV94bWxWZXJzaW9uID0g
dmVyc2lvbjsKLX0KLQotdm9pZCBEb2N1bWVudDo6c2V0WE1MU3RhbmRhbG9uZShib29sIHN0YW5k
YWxvbmUsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIGlmICghaW1wbGVtZW50YXRpb24oKS0+
aGFzRmVhdHVyZSgiWE1MIiwgU3RyaW5nKCkpKSB7Ci0gICAgICAgIGVjID0gTk9UX1NVUFBPUlRF
RF9FUlI7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtX3htbFN0YW5kYWxvbmUgPSBz
dGFuZGFsb25lID8gU3RhbmRhbG9uZSA6IE5vdFN0YW5kYWxvbmU7Ci19Ci0KLXZvaWQgRG9jdW1l
bnQ6OnNldERvY3VtZW50VVJJKGNvbnN0IFN0cmluZyYgdXJpKQotewotICAgIC8vIFRoaXMgcHJv
cGVydHkgaXMgcmVhZC1vbmx5IGZyb20gSmF2YVNjcmlwdCwgYnV0IHdyaXRhYmxlIGZyb20gT2Jq
ZWN0aXZlLUMuCi0gICAgbV9kb2N1bWVudFVSSSA9IHVyaTsKLSAgICB1cGRhdGVCYXNlVVJMKCk7
Ci19Ci0KLUtVUkwgRG9jdW1lbnQ6OmJhc2VVUkkoKSBjb25zdAotewotICAgIHJldHVybiBtX2Jh
c2VVUkw7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnNldENvbnRlbnQoY29uc3QgU3RyaW5nJiBjb250
ZW50KQotewotICAgIG9wZW4oKTsKLSAgICBtX3BhcnNlci0+YXBwZW5kKGNvbnRlbnQpOwotICAg
IGNsb3NlKCk7Ci19Ci0KLVN0cmluZyBEb2N1bWVudDo6c3VnZ2VzdGVkTUlNRVR5cGUoKSBjb25z
dAotewotICAgIGlmIChtX2RvY3VtZW50LT5pc1hIVE1MRG9jdW1lbnQoKSkKLSAgICAgICAgcmV0
dXJuICJhcHBsaWNhdGlvbi94aHRtbCt4bWwiOwotICAgIGlmIChtX2RvY3VtZW50LT5pc1NWR0Rv
Y3VtZW50KCkpCi0gICAgICAgIHJldHVybiAiaW1hZ2Uvc3ZnK3htbCI7Ci0gICAgaWYgKG1fZG9j
dW1lbnQtPnhtbFN0YW5kYWxvbmUoKSkKLSAgICAgICAgcmV0dXJuICJ0ZXh0L3htbCI7Ci0gICAg
aWYgKG1fZG9jdW1lbnQtPmlzSFRNTERvY3VtZW50KCkpCi0gICAgICAgIHJldHVybiAidGV4dC9o
dG1sIjsKLQotICAgIGlmIChEb2N1bWVudExvYWRlciogZG9jdW1lbnRMb2FkZXIgPSBsb2FkZXIo
KSkKLSAgICAgICAgcmV0dXJuIGRvY3VtZW50TG9hZGVyLT5yZXNwb25zZU1JTUVUeXBlKCk7Ci0g
ICAgcmV0dXJuIFN0cmluZygpOwotfQotCi0vLyBGSVhNRTogV2UgbmVlZCB0byBkaXNjdXNzIHRo
ZSBET00gQVBJIGhlcmUgYXQgc29tZSBwb2ludC4gSWRlYXM6Ci0vLyAqIG1ha2luZyBpdCByZWNl
aXZlIGEgcmVjdCBhcyBwYXJhbWV0ZXIsIGkuZS4gbm9kZXNGcm9tUmVjdCh4LCB5LCB3LCBoKTsK
LS8vICogbWFraW5nIGl0IHJlY2VpdmUgdGhlIGV4cGFkaW5nIHNpemUgb2YgZWFjaCBkaXJlY3Rp
b24gc2VwYXJhdGVseSwKLS8vICAgaS5lLiBub2Rlc0Zyb21SZWN0KHgsIHksIHRvcFNpemUsIHJp
Z2h0U2l6ZSwgYm90dG9tU2l6ZSwgbGVmdFNpemUpOwotUGFzc1JlZlB0cjxOb2RlTGlzdD4gRG9j
dW1lbnQ6Om5vZGVzRnJvbVJlY3QoaW50IGNlbnRlclgsIGludCBjZW50ZXJZLCB1bnNpZ25lZCB0
b3BQYWRkaW5nLCB1bnNpZ25lZCByaWdodFBhZGRpbmcsIHVuc2lnbmVkIGJvdHRvbVBhZGRpbmcs
IHVuc2lnbmVkIGxlZnRQYWRkaW5nLCBib29sIGlnbm9yZUNsaXBwaW5nLCBib29sIGFsbG93U2hh
ZG93Q29udGVudCkgY29uc3QKLXsKLSAgICAvLyBGSVhNRTogU2hhcmUgY29kZSBiZXR3ZWVuIHRo
aXMsIGVsZW1lbnRGcm9tUG9pbnQgYW5kIGNhcmV0UmFuZ2VGcm9tUG9pbnQuCi0gICAgaWYgKCFy
ZW5kZXJlcigpKQotICAgICAgICByZXR1cm4gMDsKLSAgICBGcmFtZSogZnJhbWUgPSB0aGlzLT5m
cmFtZSgpOwotICAgIGlmICghZnJhbWUpCi0gICAgICAgIHJldHVybiAwOwotICAgIEZyYW1lVmll
dyogZnJhbWVWaWV3ID0gZnJhbWUtPnZpZXcoKTsKLSAgICBpZiAoIWZyYW1lVmlldykKLSAgICAg
ICAgcmV0dXJuIDA7Ci0KLSAgICBmbG9hdCB6b29tRmFjdG9yID0gZnJhbWUtPnBhZ2Vab29tRmFj
dG9yKCk7Ci0gICAgTGF5b3V0UG9pbnQgcG9pbnQgPSByb3VuZGVkTGF5b3V0UG9pbnQoRmxvYXRQ
b2ludChjZW50ZXJYICogem9vbUZhY3RvciArIHZpZXcoKS0+c2Nyb2xsWCgpLCBjZW50ZXJZICog
em9vbUZhY3RvciArIHZpZXcoKS0+c2Nyb2xsWSgpKSk7Ci0KLSAgICBpbnQgdHlwZSA9IEhpdFRl
c3RSZXF1ZXN0OjpSZWFkT25seSB8IEhpdFRlc3RSZXF1ZXN0OjpBY3RpdmU7Ci0KLSAgICAvLyBX
aGVuIGlnbm9yZUNsaXBwaW5nIGlzIGZhbHNlLCB0aGlzIG1ldGhvZCByZXR1cm5zIG51bGwgZm9y
IGNvb3JkaW5hdGVzIG91dHNpZGUgb2YgdGhlIHZpZXdwb3J0LgotICAgIGlmIChpZ25vcmVDbGlw
cGluZykKLSAgICAgICAgdHlwZSB8PSBIaXRUZXN0UmVxdWVzdDo6SWdub3JlQ2xpcHBpbmc7Ci0g
ICAgZWxzZSBpZiAoIWZyYW1lVmlldy0+dmlzaWJsZUNvbnRlbnRSZWN0KCkuaW50ZXJzZWN0cyhI
aXRUZXN0UmVzdWx0OjpyZWN0Rm9yUG9pbnQocG9pbnQsIHRvcFBhZGRpbmcsIHJpZ2h0UGFkZGlu
ZywgYm90dG9tUGFkZGluZywgbGVmdFBhZGRpbmcpKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAg
aWYgKGFsbG93U2hhZG93Q29udGVudCkKLSAgICAgICAgdHlwZSB8PSBIaXRUZXN0UmVxdWVzdDo6
QWxsb3dTaGFkb3dDb250ZW50OwotCi0gICAgSGl0VGVzdFJlcXVlc3QgcmVxdWVzdCh0eXBlKTsK
LQotICAgIC8vIFBhc3NpbmcgYSB6ZXJvIHBhZGRpbmcgd2lsbCB0cmlnZ2VyIGEgcmVjdCBoaXQg
dGVzdCwgaG93ZXZlciBmb3IgdGhlIHB1cnBvc2VzIG9mIG5vZGVzRnJvbVJlY3QsCi0gICAgLy8g
d2Ugc3BlY2lhbCBoYW5kbGUgdGhpcyBjYXNlIGluIG9yZGVyIHRvIHJldHVybiBhIHZhbGlkIE5v
ZGVMaXN0LgotICAgIGlmICghdG9wUGFkZGluZyAmJiAhcmlnaHRQYWRkaW5nICYmICFib3R0b21Q
YWRkaW5nICYmICFsZWZ0UGFkZGluZykgewotICAgICAgICBIaXRUZXN0UmVzdWx0IHJlc3VsdChw
b2ludCk7Ci0gICAgICAgIHJldHVybiBoYW5kbGVaZXJvUGFkZGluZyhyZXF1ZXN0LCByZXN1bHQp
OwotICAgIH0KLQotICAgIEhpdFRlc3RSZXN1bHQgcmVzdWx0KHBvaW50LCB0b3BQYWRkaW5nLCBy
aWdodFBhZGRpbmcsIGJvdHRvbVBhZGRpbmcsIGxlZnRQYWRkaW5nKTsKLSAgICByZW5kZXJWaWV3
KCktPmhpdFRlc3QocmVxdWVzdCwgcmVzdWx0KTsKLQotICAgIHJldHVybiBTdGF0aWNIYXNoU2V0
Tm9kZUxpc3Q6OmFkb3B0KHJlc3VsdC5yZWN0QmFzZWRUZXN0UmVzdWx0KCkpOwotfQotCi1QYXNz
UmVmUHRyPE5vZGVMaXN0PiBEb2N1bWVudDo6aGFuZGxlWmVyb1BhZGRpbmcoY29uc3QgSGl0VGVz
dFJlcXVlc3QmIHJlcXVlc3QsIEhpdFRlc3RSZXN1bHQmIHJlc3VsdCkgY29uc3QKLXsKLSAgICBy
ZW5kZXJWaWV3KCktPmhpdFRlc3QocmVxdWVzdCwgcmVzdWx0KTsKLQotICAgIE5vZGUqIG5vZGUg
PSByZXN1bHQuaW5uZXJOb2RlKCk7Ci0gICAgaWYgKCFub2RlKQotICAgICAgICByZXR1cm4gMDsK
LQotICAgIG5vZGUgPSBub2RlLT5zaGFkb3dBbmNlc3Rvck5vZGUoKTsKLSAgICBMaXN0SGFzaFNl
dDxSZWZQdHI8Tm9kZT4gPiBsaXN0OwotICAgIGxpc3QuYWRkKG5vZGUpOwotICAgIHJldHVybiBT
dGF0aWNIYXNoU2V0Tm9kZUxpc3Q6OmFkb3B0KGxpc3QpOwotfQotCi1zdGF0aWMgTm9kZSogbm9k
ZUZyb21Qb2ludChGcmFtZSogZnJhbWUsIFJlbmRlclZpZXcqIHJlbmRlclZpZXcsIGludCB4LCBp
bnQgeSwgTGF5b3V0UG9pbnQqIGxvY2FsUG9pbnQgPSAwKQotewotICAgIGlmICghZnJhbWUpCi0g
ICAgICAgIHJldHVybiAwOwotICAgIEZyYW1lVmlldyogZnJhbWVWaWV3ID0gZnJhbWUtPnZpZXco
KTsKLSAgICBpZiAoIWZyYW1lVmlldykKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBmbG9hdCB6
b29tRmFjdG9yID0gZnJhbWUtPnBhZ2Vab29tRmFjdG9yKCk7Ci0gICAgSW50UG9pbnQgcG9pbnQg
PSByb3VuZGVkSW50UG9pbnQoRmxvYXRQb2ludCh4ICogem9vbUZhY3RvciAgKyBmcmFtZVZpZXct
PnNjcm9sbFgoKSwgeSAqIHpvb21GYWN0b3IgKyBmcmFtZVZpZXctPnNjcm9sbFkoKSkpOwotCi0g
ICAgaWYgKCFmcmFtZVZpZXctPnZpc2libGVDb250ZW50UmVjdCgpLmNvbnRhaW5zKHBvaW50KSkK
LSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBIaXRUZXN0UmVxdWVzdCByZXF1ZXN0KEhpdFRlc3RS
ZXF1ZXN0OjpSZWFkT25seSB8IEhpdFRlc3RSZXF1ZXN0OjpBY3RpdmUpOwotICAgIEhpdFRlc3RS
ZXN1bHQgcmVzdWx0KHBvaW50KTsKLSAgICByZW5kZXJWaWV3LT5oaXRUZXN0KHJlcXVlc3QsIHJl
c3VsdCk7Ci0KLSAgICBpZiAobG9jYWxQb2ludCkKLSAgICAgICAgKmxvY2FsUG9pbnQgPSByZXN1
bHQubG9jYWxQb2ludCgpOwotCi0gICAgcmV0dXJuIHJlc3VsdC5pbm5lck5vZGUoKTsKLX0KLQot
RWxlbWVudCogRG9jdW1lbnQ6OmVsZW1lbnRGcm9tUG9pbnQoaW50IHgsIGludCB5KSBjb25zdAot
ewotICAgIGlmICghcmVuZGVyZXIoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgTm9kZSogbm9k
ZSA9IG5vZGVGcm9tUG9pbnQoZnJhbWUoKSwgcmVuZGVyVmlldygpLCB4LCB5KTsKLSAgICB3aGls
ZSAobm9kZSAmJiAhbm9kZS0+aXNFbGVtZW50Tm9kZSgpKQotICAgICAgICBub2RlID0gbm9kZS0+
cGFyZW50Tm9kZSgpOwotICAgIGlmIChub2RlKQotICAgICAgICBub2RlID0gYW5jZXN0b3JJblRo
aXNTY29wZShub2RlKTsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG5vZGUpOwot
fQotCi1QYXNzUmVmUHRyPFJhbmdlPiBEb2N1bWVudDo6Y2FyZXRSYW5nZUZyb21Qb2ludChpbnQg
eCwgaW50IHkpCi17Ci0gICAgaWYgKCFyZW5kZXJlcigpKQotICAgICAgICByZXR1cm4gMDsKLSAg
ICBMYXlvdXRQb2ludCBsb2NhbFBvaW50OwotICAgIE5vZGUqIG5vZGUgPSBub2RlRnJvbVBvaW50
KGZyYW1lKCksIHJlbmRlclZpZXcoKSwgeCwgeSwgJmxvY2FsUG9pbnQpOwotICAgIGlmICghbm9k
ZSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBOb2RlKiBzaGFkb3dBbmNlc3Rvck5vZGUgPSBh
bmNlc3RvckluVGhpc1Njb3BlKG5vZGUpOwotICAgIGlmIChzaGFkb3dBbmNlc3Rvck5vZGUgIT0g
bm9kZSkgewotICAgICAgICB1bnNpZ25lZCBvZmZzZXQgPSBzaGFkb3dBbmNlc3Rvck5vZGUtPm5v
ZGVJbmRleCgpOwotICAgICAgICBDb250YWluZXJOb2RlKiBjb250YWluZXIgPSBzaGFkb3dBbmNl
c3Rvck5vZGUtPnBhcmVudE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIFJhbmdlOjpjcmVhdGUodGhp
cywgY29udGFpbmVyLCBvZmZzZXQsIGNvbnRhaW5lciwgb2Zmc2V0KTsKLSAgICB9Ci0KLSAgICBS
ZW5kZXJPYmplY3QqIHJlbmRlcmVyID0gbm9kZS0+cmVuZGVyZXIoKTsKLSAgICBpZiAoIXJlbmRl
cmVyKQotICAgICAgICByZXR1cm4gMDsKLSAgICBWaXNpYmxlUG9zaXRpb24gdmlzaWJsZVBvc2l0
aW9uID0gcmVuZGVyZXItPnBvc2l0aW9uRm9yUG9pbnQobG9jYWxQb2ludCk7Ci0gICAgaWYgKHZp
c2libGVQb3NpdGlvbi5pc051bGwoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBQb3NpdGlv
biByYW5nZUNvbXBsaWFudFBvc2l0aW9uID0gdmlzaWJsZVBvc2l0aW9uLmRlZXBFcXVpdmFsZW50
KCkucGFyZW50QW5jaG9yZWRFcXVpdmFsZW50KCk7Ci0gICAgcmV0dXJuIFJhbmdlOjpjcmVhdGUo
dGhpcywgcmFuZ2VDb21wbGlhbnRQb3NpdGlvbiwgcmFuZ2VDb21wbGlhbnRQb3NpdGlvbik7Ci19
Ci0KLS8qCi0gKiBQZXJmb3JtcyB0aHJlZSBvcGVyYXRpb25zOgotICogIDEuIENvbnZlcnQgY29u
dHJvbCBjaGFyYWN0ZXJzIHRvIHNwYWNlcwotICogIDIuIFRyaW0gbGVhZGluZyBhbmQgdHJhaWxp
bmcgc3BhY2VzCi0gKiAgMy4gQ29sbGFwc2UgaW50ZXJuYWwgd2hpdGVzcGFjZS4KLSAqLwotc3Rh
dGljIGlubGluZSBTdHJpbmdXaXRoRGlyZWN0aW9uIGNhbm9uaWNhbGl6ZWRUaXRsZShEb2N1bWVu
dCogZG9jdW1lbnQsIGNvbnN0IFN0cmluZ1dpdGhEaXJlY3Rpb24mIHRpdGxlV2l0aERpcmVjdGlv
bikKLXsKLSAgICBjb25zdCBTdHJpbmcmIHRpdGxlID0gdGl0bGVXaXRoRGlyZWN0aW9uLnN0cmlu
ZygpOwotICAgIGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzID0gdGl0bGUuY2hhcmFjdGVycygpOwot
ICAgIHVuc2lnbmVkIGxlbmd0aCA9IHRpdGxlLmxlbmd0aCgpOwotICAgIHVuc2lnbmVkIGk7Ci0K
LSAgICBTdHJpbmdCdWZmZXI8VUNoYXI+IGJ1ZmZlcihsZW5ndGgpOwotICAgIHVuc2lnbmVkIGJ1
aWxkZXJJbmRleCA9IDA7Ci0KLSAgICAvLyBTa2lwIGxlYWRpbmcgc3BhY2VzIGFuZCBsZWFkaW5n
IGNoYXJhY3RlcnMgdGhhdCB3b3VsZCBjb252ZXJ0IHRvIHNwYWNlcwotICAgIGZvciAoaSA9IDA7
IGkgPCBsZW5ndGg7ICsraSkgewotICAgICAgICBVQ2hhciBjID0gY2hhcmFjdGVyc1tpXTsKLSAg
ICAgICAgaWYgKCEoYyA8PSAweDIwIHx8IGMgPT0gMHg3RikpCi0gICAgICAgICAgICBicmVhazsK
LSAgICB9Ci0KLSAgICBpZiAoaSA9PSBsZW5ndGgpCi0gICAgICAgIHJldHVybiBTdHJpbmdXaXRo
RGlyZWN0aW9uKCk7Ci0KLSAgICAvLyBSZXBsYWNlIGNvbnRyb2wgY2hhcmFjdGVycyB3aXRoIHNw
YWNlcywgYW5kIGJhY2tzbGFzaGVzIHdpdGggY3VycmVuY3kgc3ltYm9scywgYW5kIGNvbGxhcHNl
IHdoaXRlc3BhY2UuCi0gICAgYm9vbCBwcmV2aW91c0NoYXJXYXNXUyA9IGZhbHNlOwotICAgIGZv
ciAoOyBpIDwgbGVuZ3RoOyArK2kpIHsKLSAgICAgICAgVUNoYXIgYyA9IGNoYXJhY3RlcnNbaV07
Ci0gICAgICAgIGlmIChjIDw9IDB4MjAgfHwgYyA9PSAweDdGIHx8IChXVEY6OlVuaWNvZGU6OmNh
dGVnb3J5KGMpICYgKFdURjo6VW5pY29kZTo6U2VwYXJhdG9yX0xpbmUgfCBXVEY6OlVuaWNvZGU6
OlNlcGFyYXRvcl9QYXJhZ3JhcGgpKSkgewotICAgICAgICAgICAgaWYgKHByZXZpb3VzQ2hhcldh
c1dTKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgYnVmZmVyW2J1aWxk
ZXJJbmRleCsrXSA9ICcgJzsKLSAgICAgICAgICAgIHByZXZpb3VzQ2hhcldhc1dTID0gdHJ1ZTsK
LSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJ1ZmZlcltidWlsZGVySW5kZXgrK10gPSBj
OwotICAgICAgICAgICAgcHJldmlvdXNDaGFyV2FzV1MgPSBmYWxzZTsKLSAgICAgICAgfQotICAg
IH0KLQotICAgIC8vIFN0cmlwIHRyYWlsaW5nIHNwYWNlcwotICAgIHdoaWxlIChidWlsZGVySW5k
ZXggPiAwKSB7Ci0gICAgICAgIC0tYnVpbGRlckluZGV4OwotICAgICAgICBpZiAoYnVmZmVyW2J1
aWxkZXJJbmRleF0gIT0gJyAnKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYg
KCFidWlsZGVySW5kZXggJiYgYnVmZmVyW2J1aWxkZXJJbmRleF0gPT0gJyAnKQotICAgICAgICBy
ZXR1cm4gU3RyaW5nV2l0aERpcmVjdGlvbigpOwotCi0gICAgYnVmZmVyLnNocmluayhidWlsZGVy
SW5kZXggKyAxKTsKLQotICAgIC8vIFJlcGxhY2UgdGhlIGJhY2tzbGFzaGVzIHdpdGggY3VycmVu
Y3kgc3ltYm9scyBpZiB0aGUgZW5jb2RpbmcgcmVxdWlyZXMgaXQuCi0gICAgZG9jdW1lbnQtPmRp
c3BsYXlCdWZmZXJNb2RpZmllZEJ5RW5jb2RpbmcoYnVmZmVyLmNoYXJhY3RlcnMoKSwgYnVmZmVy
Lmxlbmd0aCgpKTsKLSAgICAKLSAgICByZXR1cm4gU3RyaW5nV2l0aERpcmVjdGlvbihTdHJpbmc6
OmFkb3B0KGJ1ZmZlciksIHRpdGxlV2l0aERpcmVjdGlvbi5kaXJlY3Rpb24oKSk7Ci19Ci0KLXZv
aWQgRG9jdW1lbnQ6OnVwZGF0ZVRpdGxlKGNvbnN0IFN0cmluZ1dpdGhEaXJlY3Rpb24mIHRpdGxl
KQotewotICAgIGlmIChtX3Jhd1RpdGxlID09IHRpdGxlKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICBtX3Jhd1RpdGxlID0gdGl0bGU7Ci0gICAgbV90aXRsZSA9IGNhbm9uaWNhbGl6ZWRUaXRsZSh0
aGlzLCBtX3Jhd1RpdGxlKTsKLSAgICBpZiAoRnJhbWUqIGYgPSBmcmFtZSgpKQotICAgICAgICBm
LT5sb2FkZXIoKS0+c2V0VGl0bGUobV90aXRsZSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnNldFRp
dGxlKGNvbnN0IFN0cmluZyYgdGl0bGUpCi17Ci0gICAgLy8gVGl0bGUgc2V0IGJ5IEphdmFTY3Jp
cHQgLS0gb3ZlcnJpZGVzIGFueSB0aXRsZSBlbGVtZW50cy4KLSAgICBtX3RpdGxlU2V0RXhwbGlj
aXRseSA9IHRydWU7Ci0gICAgaWYgKCFpc0hUTUxEb2N1bWVudCgpICYmICFpc1hIVE1MRG9jdW1l
bnQoKSkKLSAgICAgICAgbV90aXRsZUVsZW1lbnQgPSAwOwotICAgIGVsc2UgaWYgKCFtX3RpdGxl
RWxlbWVudCkgewotICAgICAgICBpZiAoSFRNTEVsZW1lbnQqIGhlYWRFbGVtZW50ID0gaGVhZCgp
KSB7Ci0gICAgICAgICAgICBtX3RpdGxlRWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQodGl0bGVUYWcs
IGZhbHNlKTsKLSAgICAgICAgICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwotICAgICAgICAgICAg
aGVhZEVsZW1lbnQtPmFwcGVuZENoaWxkKG1fdGl0bGVFbGVtZW50LCBlYyk7Ci0gICAgICAgICAg
ICBBU1NFUlQoIWVjKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFRoZSBET00gQVBJIGhh
cyBubyBtZXRob2Qgb2Ygc3BlY2lmeWluZyBkaXJlY3Rpb24sIHNvIGFzc3VtZSBMVFIuCi0gICAg
dXBkYXRlVGl0bGUoU3RyaW5nV2l0aERpcmVjdGlvbih0aXRsZSwgTFRSKSk7Ci0KLSAgICBpZiAo
bV90aXRsZUVsZW1lbnQpIHsKLSAgICAgICAgQVNTRVJUKG1fdGl0bGVFbGVtZW50LT5oYXNUYWdO
YW1lKHRpdGxlVGFnKSk7Ci0gICAgICAgIGlmIChtX3RpdGxlRWxlbWVudC0+aGFzVGFnTmFtZSh0
aXRsZVRhZykpCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxIVE1MVGl0bGVFbGVtZW50Kj4obV90
aXRsZUVsZW1lbnQuZ2V0KCkpLT5zZXRUZXh0KHRpdGxlKTsKLSAgICB9Ci19Ci0KLXZvaWQgRG9j
dW1lbnQ6OnNldFRpdGxlRWxlbWVudChjb25zdCBTdHJpbmdXaXRoRGlyZWN0aW9uJiB0aXRsZSwg
RWxlbWVudCogdGl0bGVFbGVtZW50KQotewotICAgIGlmICh0aXRsZUVsZW1lbnQgIT0gbV90aXRs
ZUVsZW1lbnQpIHsKLSAgICAgICAgaWYgKG1fdGl0bGVFbGVtZW50IHx8IG1fdGl0bGVTZXRFeHBs
aWNpdGx5KQotICAgICAgICAgICAgLy8gT25seSBhbGxvdyB0aGUgZmlyc3QgdGl0bGUgZWxlbWVu
dCB0byBjaGFuZ2UgdGhlIHRpdGxlIC0tIG90aGVycyBoYXZlIG5vIGVmZmVjdC4KLSAgICAgICAg
ICAgIHJldHVybjsKLSAgICAgICAgbV90aXRsZUVsZW1lbnQgPSB0aXRsZUVsZW1lbnQ7Ci0gICAg
fQotCi0gICAgdXBkYXRlVGl0bGUodGl0bGUpOwotfQotCi12b2lkIERvY3VtZW50OjpyZW1vdmVU
aXRsZShFbGVtZW50KiB0aXRsZUVsZW1lbnQpCi17Ci0gICAgaWYgKG1fdGl0bGVFbGVtZW50ICE9
IHRpdGxlRWxlbWVudCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV90aXRsZUVsZW1lbnQgPSAw
OwotICAgIG1fdGl0bGVTZXRFeHBsaWNpdGx5ID0gZmFsc2U7Ci0KLSAgICAvLyBVcGRhdGUgdGl0
bGUgYmFzZWQgb24gZmlyc3QgdGl0bGUgZWxlbWVudCBpbiB0aGUgaGVhZCwgaWYgb25lIGV4aXN0
cy4KLSAgICBpZiAoSFRNTEVsZW1lbnQqIGhlYWRFbGVtZW50ID0gaGVhZCgpKSB7Ci0gICAgICAg
IGZvciAoTm9kZSogZSA9IGhlYWRFbGVtZW50LT5maXJzdENoaWxkKCk7IGU7IGUgPSBlLT5uZXh0
U2libGluZygpKQotICAgICAgICAgICAgaWYgKGUtPmhhc1RhZ05hbWUodGl0bGVUYWcpKSB7Ci0g
ICAgICAgICAgICAgICAgSFRNTFRpdGxlRWxlbWVudCogdGl0bGVFbGVtZW50ID0gc3RhdGljX2Nh
c3Q8SFRNTFRpdGxlRWxlbWVudCo+KGUpOwotICAgICAgICAgICAgICAgIHNldFRpdGxlRWxlbWVu
dCh0aXRsZUVsZW1lbnQtPnRleHRXaXRoRGlyZWN0aW9uKCksIHRpdGxlRWxlbWVudCk7Ci0gICAg
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFtX3Rp
dGxlRWxlbWVudCkKLSAgICAgICAgdXBkYXRlVGl0bGUoU3RyaW5nV2l0aERpcmVjdGlvbigpKTsK
LX0KLQotI2lmIEVOQUJMRShQQUdFX1ZJU0lCSUxJVFlfQVBJKQotUGFnZVZpc2liaWxpdHlTdGF0
ZSBEb2N1bWVudDo6dmlzaWJpbGl0eVN0YXRlKCkgY29uc3QKLXsKLSAgICAvLyBUaGUgdmlzaWJp
bGl0eSBvZiB0aGUgZG9jdW1lbnQgaXMgaW5oZXJpdGVkIGZyb20gdGhlIHZpc2liaWxpdHkgb2Yg
dGhlCi0gICAgLy8gcGFnZS4gSWYgdGhlcmUgaXMgbm8gcGFnZSBhc3NvY2lhdGVkIHdpdGggdGhl
IGRvY3VtZW50LCB3ZSB3aWxsIGFzc3VtZQotICAgIC8vIHRoYXQgdGhlIHBhZ2UgaXMgdmlzaWJs
ZSBpLmUuIGludmlzaWJpbGl0eSBoYXMgdG8gYmUgZXhwbGljaXRseQotICAgIC8vIHNwZWNpZmll
ZCBieSB0aGUgZW1iZWRkZXIuCi0gICAgaWYgKCFtX2ZyYW1lIHx8ICFtX2ZyYW1lLT5wYWdlKCkp
Ci0gICAgICAgIHJldHVybiBQYWdlVmlzaWJpbGl0eVN0YXRlVmlzaWJsZTsKLSAgICByZXR1cm4g
bV9mcmFtZS0+cGFnZSgpLT52aXNpYmlsaXR5U3RhdGUoKTsKLX0KLQotU3RyaW5nIERvY3VtZW50
Ojp3ZWJraXRWaXNpYmlsaXR5U3RhdGUoKSBjb25zdAotewotICAgIHJldHVybiBwYWdlVmlzaWJp
bGl0eVN0YXRlU3RyaW5nKHZpc2liaWxpdHlTdGF0ZSgpKTsKLX0KLQotYm9vbCBEb2N1bWVudDo6
d2Via2l0SGlkZGVuKCkgY29uc3QKLXsKLSAgICByZXR1cm4gdmlzaWJpbGl0eVN0YXRlKCkgIT0g
UGFnZVZpc2liaWxpdHlTdGF0ZVZpc2libGU7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmRpc3BhdGNo
VmlzaWJpbGl0eVN0YXRlQ2hhbmdlRXZlbnQoKQotewotICAgIGRpc3BhdGNoRXZlbnQoRXZlbnQ6
OmNyZWF0ZShldmVudE5hbWVzKCkud2Via2l0dmlzaWJpbGl0eWNoYW5nZUV2ZW50LCBmYWxzZSwg
ZmFsc2UpKTsKLX0KLSNlbmRpZgotCi0jaWYgRU5BQkxFKENTUF9ORVhUKQotRE9NU2VjdXJpdHlQ
b2xpY3kqIERvY3VtZW50OjpzZWN1cml0eVBvbGljeSgpCi17Ci0gICAgaWYgKCFtX2RvbVNlY3Vy
aXR5UG9saWN5KQotICAgICAgICBtX2RvbVNlY3VyaXR5UG9saWN5ID0gRE9NU2VjdXJpdHlQb2xp
Y3k6OmNyZWF0ZSh0aGlzKTsKLSAgICByZXR1cm4gbV9kb21TZWN1cml0eVBvbGljeS5nZXQoKTsK
LX0KLSNlbmRpZgotCi1TdHJpbmcgRG9jdW1lbnQ6Om5vZGVOYW1lKCkgY29uc3QKLXsKLSAgICBy
ZXR1cm4gIiNkb2N1bWVudCI7Ci19Ci0KLU5vZGU6Ok5vZGVUeXBlIERvY3VtZW50Ojpub2RlVHlw
ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIERPQ1VNRU5UX05PREU7Ci19Ci0KLUZvcm1Db250cm9s
bGVyKiBEb2N1bWVudDo6Zm9ybUNvbnRyb2xsZXIoKQotewotICAgIGlmICghbV9mb3JtQ29udHJv
bGxlcikKLSAgICAgICAgbV9mb3JtQ29udHJvbGxlciA9IEZvcm1Db250cm9sbGVyOjpjcmVhdGUo
KTsKLSAgICByZXR1cm4gbV9mb3JtQ29udHJvbGxlci5nZXQoKTsKLX0KLQotVmVjdG9yPFN0cmlu
Zz4gRG9jdW1lbnQ6OmZvcm1FbGVtZW50c1N0YXRlKCkgY29uc3QKLXsKLSAgICBpZiAoIW1fZm9y
bUNvbnRyb2xsZXIpCi0gICAgICAgIHJldHVybiBWZWN0b3I8U3RyaW5nPigpOwotICAgIHJldHVy
biBtX2Zvcm1Db250cm9sbGVyLT5mb3JtRWxlbWVudHNTdGF0ZSgpOwotfQotCi12b2lkIERvY3Vt
ZW50OjpzZXRTdGF0ZUZvck5ld0Zvcm1FbGVtZW50cyhjb25zdCBWZWN0b3I8U3RyaW5nPiYgc3Rh
dGVWZWN0b3IpCi17Ci0gICAgaWYgKCFzdGF0ZVZlY3Rvci5zaXplKCkgJiYgIW1fZm9ybUNvbnRy
b2xsZXIpCi0gICAgICAgIHJldHVybjsKLSAgICBmb3JtQ29udHJvbGxlcigpLT5zZXRTdGF0ZUZv
ck5ld0Zvcm1FbGVtZW50cyhzdGF0ZVZlY3Rvcik7Ci19Ci0KLUZyYW1lVmlldyogRG9jdW1lbnQ6
OnZpZXcoKSBjb25zdAotewotICAgIHJldHVybiBtX2ZyYW1lID8gbV9mcmFtZS0+dmlldygpIDog
MDsKLX0KLQotUGFnZSogRG9jdW1lbnQ6OnBhZ2UoKSBjb25zdAotewotICAgIHJldHVybiBtX2Zy
YW1lID8gbV9mcmFtZS0+cGFnZSgpIDogMDsgICAgCi19Ci0KLVNldHRpbmdzKiBEb2N1bWVudDo6
c2V0dGluZ3MoKSBjb25zdAotewotICAgIHJldHVybiBtX2ZyYW1lID8gbV9mcmFtZS0+c2V0dGlu
Z3MoKSA6IDA7Ci19Ci0KLVBhc3NSZWZQdHI8UmFuZ2U+IERvY3VtZW50OjpjcmVhdGVSYW5nZSgp
Ci17Ci0gICAgcmV0dXJuIFJhbmdlOjpjcmVhdGUodGhpcyk7Ci19Ci0KLVBhc3NSZWZQdHI8Tm9k
ZUl0ZXJhdG9yPiBEb2N1bWVudDo6Y3JlYXRlTm9kZUl0ZXJhdG9yKE5vZGUqIHJvb3QsIHVuc2ln
bmVkIHdoYXRUb1Nob3csIAotICAgIFBhc3NSZWZQdHI8Tm9kZUZpbHRlcj4gZmlsdGVyLCBib29s
IGV4cGFuZEVudGl0eVJlZmVyZW5jZXMsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIGlmICgh
cm9vdCkgewotICAgICAgICBlYyA9IE5PVF9TVVBQT1JURURfRVJSOwotICAgICAgICByZXR1cm4g
MDsKLSAgICB9Ci0gICAgcmV0dXJuIE5vZGVJdGVyYXRvcjo6Y3JlYXRlKHJvb3QsIHdoYXRUb1No
b3csIGZpbHRlciwgZXhwYW5kRW50aXR5UmVmZXJlbmNlcyk7Ci19Ci0KLVBhc3NSZWZQdHI8VHJl
ZVdhbGtlcj4gRG9jdW1lbnQ6OmNyZWF0ZVRyZWVXYWxrZXIoTm9kZSogcm9vdCwgdW5zaWduZWQg
d2hhdFRvU2hvdywgCi0gICAgUGFzc1JlZlB0cjxOb2RlRmlsdGVyPiBmaWx0ZXIsIGJvb2wgZXhw
YW5kRW50aXR5UmVmZXJlbmNlcywgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgaWYgKCFyb290
KSB7Ci0gICAgICAgIGVjID0gTk9UX1NVUFBPUlRFRF9FUlI7Ci0gICAgICAgIHJldHVybiAwOwot
ICAgIH0KLSAgICByZXR1cm4gVHJlZVdhbGtlcjo6Y3JlYXRlKHJvb3QsIHdoYXRUb1Nob3csIGZp
bHRlciwgZXhwYW5kRW50aXR5UmVmZXJlbmNlcyk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnNjaGVk
dWxlRm9yY2VkU3R5bGVSZWNhbGMoKQotewotICAgIG1fcGVuZGluZ1N0eWxlUmVjYWxjU2hvdWxk
Rm9yY2UgPSB0cnVlOwotICAgIHNjaGVkdWxlU3R5bGVSZWNhbGMoKTsKLX0KLQotdm9pZCBEb2N1
bWVudDo6c2NoZWR1bGVTdHlsZVJlY2FsYygpCi17Ci0gICAgaWYgKHNob3VsZERpc3BsYXlTZWFt
bGVzc2x5V2l0aFBhcmVudCgpKSB7Ci0gICAgICAgIC8vIFdoZW4gd2UncmUgc2VhbWxlc3MsIG91
ciBwYXJlbnQgZG9jdW1lbnQgbWFuYWdlcyBvdXIgc3R5bGUgcmVjYWxjcy4KLSAgICAgICAgb3du
ZXJFbGVtZW50KCktPnNldE5lZWRzU3R5bGVSZWNhbGMoKTsKLSAgICAgICAgb3duZXJFbGVtZW50
KCktPmRvY3VtZW50KCktPnNjaGVkdWxlU3R5bGVSZWNhbGMoKTsKLSAgICAgICAgcmV0dXJuOwot
ICAgIH0KLQotICAgIGlmIChtX3N0eWxlUmVjYWxjVGltZXIuaXNBY3RpdmUoKSB8fCBpblBhZ2VD
YWNoZSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBBU1NFUlQoY2hpbGROZWVkc1N0eWxlUmVj
YWxjKCkgfHwgbV9wZW5kaW5nU3R5bGVSZWNhbGNTaG91bGRGb3JjZSk7Ci0KLSAgICBpZiAoIWRv
Y3VtZW50c1RoYXROZWVkU3R5bGVSZWNhbGMpCi0gICAgICAgIGRvY3VtZW50c1RoYXROZWVkU3R5
bGVSZWNhbGMgPSBuZXcgSGFzaFNldDxEb2N1bWVudCo+OwotICAgIGRvY3VtZW50c1RoYXROZWVk
U3R5bGVSZWNhbGMtPmFkZCh0aGlzKTsKLSAgICAKLSAgICAvLyBGSVhNRTogV2h5IG9uIGVhcnRo
IGlzIHRoaXMgaGVyZT8gVGhpcyBpcyBjbGVhcmx5IG1pc3BsYWNlZC4KLSAgICBpbnZhbGlkYXRl
QWNjZXNzS2V5TWFwKCk7Ci0gICAgCi0gICAgbV9zdHlsZVJlY2FsY1RpbWVyLnN0YXJ0T25lU2hv
dCgwKTsKLQotICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkU2NoZWR1bGVTdHlsZVJl
Y2FsY3VsYXRpb24odGhpcyk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnVuc2NoZWR1bGVTdHlsZVJl
Y2FsYygpCi17Ci0gICAgQVNTRVJUKCFjaGlsZE5lZWRzU3R5bGVSZWNhbGMoKSk7Ci0KLSAgICBp
ZiAoZG9jdW1lbnRzVGhhdE5lZWRTdHlsZVJlY2FsYykKLSAgICAgICAgZG9jdW1lbnRzVGhhdE5l
ZWRTdHlsZVJlY2FsYy0+cmVtb3ZlKHRoaXMpOwotCi0gICAgbV9zdHlsZVJlY2FsY1RpbWVyLnN0
b3AoKTsKLSAgICBtX3BlbmRpbmdTdHlsZVJlY2FsY1Nob3VsZEZvcmNlID0gZmFsc2U7Ci19Ci0K
LWJvb2wgRG9jdW1lbnQ6OmlzUGVuZGluZ1N0eWxlUmVjYWxjKCkgY29uc3QKLXsKLSAgICByZXR1
cm4gbV9zdHlsZVJlY2FsY1RpbWVyLmlzQWN0aXZlKCkgJiYgIW1faW5TdHlsZVJlY2FsYzsKLX0K
LQotdm9pZCBEb2N1bWVudDo6c3R5bGVSZWNhbGNUaW1lckZpcmVkKFRpbWVyPERvY3VtZW50Piop
Ci17Ci0gICAgdXBkYXRlU3R5bGVJZk5lZWRlZCgpOwotfQotCi1ib29sIERvY3VtZW50OjpjaGls
ZE5lZWRzQW5kTm90SW5TdHlsZVJlY2FsYygpCi17Ci0gICAgcmV0dXJuIGNoaWxkTmVlZHNTdHls
ZVJlY2FsYygpICYmICFtX2luU3R5bGVSZWNhbGM7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnJlY2Fs
Y1N0eWxlKFN0eWxlQ2hhbmdlIGNoYW5nZSkKLXsKLSAgICAvLyB3ZSBzaG91bGQgbm90IGVudGVy
IHN0eWxlIHJlY2FsYyB3aGlsZSBwYWludGluZwotICAgIEFTU0VSVCghdmlldygpIHx8ICF2aWV3
KCktPmlzUGFpbnRpbmcoKSk7Ci0gICAgaWYgKHZpZXcoKSAmJiB2aWV3KCktPmlzUGFpbnRpbmco
KSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIGlmIChtX2luU3R5bGVSZWNhbGMpCi0gICAg
ICAgIHJldHVybjsgLy8gR3VhcmQgYWdhaW5zdCByZS1lbnRyYW5jeS4gLWR3aAotCi0gICAgLy8g
RklYTUU6IFdlIHNob3VsZCB1cGRhdGUgc3R5bGUgb24gb3VyIGFuY2VzdG9yIGNoYWluIGJlZm9y
ZSBwcm9jZWVkaW5nIChlc3BlY2lhbGx5IGZvciBzZWFtbGVzcyksCi0gICAgLy8gaG93ZXZlciBk
b2luZyBzbyBjdXJyZW50bHkgY2F1c2VzIHNldmVyYWwgdGVzdHMgdG8gY3Jhc2gsIGFzIEZyYW1l
OjpzZXREb2N1bWVudCBjYWxscyBEb2N1bWVudDo6YXR0YWNoCi0gICAgLy8gYmVmb3JlIHNldHRp
bmcgdGhlIERPTVdpbmRvdyBvbiB0aGUgRnJhbWUsIG9yIHRoZSBTZWN1cml0eU9yaWdpbiBvbiB0
aGUgZG9jdW1lbnQuIFRoZSBhdHRhY2gsIGluIHR1cm4KLSAgICAvLyByZXNvbHZlcyBzdHlsZSAo
aGVyZSkgYW5kIHRoZW4gd2hlbiB3ZSByZXNvbHZlIHN0eWxlIG9uIHRoZSBwYXJlbnQgY2hhaW4s
IHdlIG1heSBlbmQgdXAKLSAgICAvLyByZS1hdHRhY2hpbmcgb3VyIGNvbnRhaW5pbmcgaWZyYW1l
LCB3aGljaCB3aGVuIGFza2VkIEhUTUxGcmFtZUVsZW1lbnRCYXNlOjppc1VSTEFsbG93ZWQKLSAg
ICAvLyBoaXRzIGEgbnVsbC1kZXJlZmVyZW5jZSBkdWUgdG8gc2VjdXJpdHkgY29kZSBhbHdheXMg
YXNzdW1pbmcgdGhlIGRvY3VtZW50IGhhcyBhIFNlY3VyaXR5T3JpZ2luLgotCi0gICAgaWYgKG1f
aGFzRGlydHlTdHlsZVJlc29sdmVyKQotICAgICAgICB1cGRhdGVBY3RpdmVTdHlsZXNoZWV0cyhS
ZWNhbGNTdHlsZUltbWVkaWF0ZWx5KTsKLQotICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbkNv
b2tpZSBjb29raWUgPSBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OndpbGxSZWNhbGN1bGF0ZVN0
eWxlKHRoaXMpOwotCi0gICAgaWYgKG1fZWxlbVNoZWV0ICYmIG1fZWxlbVNoZWV0LT5jb250ZW50
cygpLT51c2VzUmVtVW5pdHMoKSkKLSAgICAgICAgbV91c2VzUmVtVW5pdHMgPSB0cnVlOwotCi0g
ICAgbV9pblN0eWxlUmVjYWxjID0gdHJ1ZTsKLSAgICBzdXNwZW5kUG9zdEF0dGFjaENhbGxiYWNr
cygpOwotICAgIFJlbmRlcldpZGdldDo6c3VzcGVuZFdpZGdldEhpZXJhcmNoeVVwZGF0ZXMoKTsK
LSAgICAKLSAgICBSZWZQdHI8RnJhbWVWaWV3PiBmcmFtZVZpZXcgPSB2aWV3KCk7Ci0gICAgaWYg
KGZyYW1lVmlldykgewotICAgICAgICBmcmFtZVZpZXctPnBhdXNlU2NoZWR1bGVkRXZlbnRzKCk7
Ci0gICAgICAgIGZyYW1lVmlldy0+YmVnaW5EZWZlcnJlZFJlcGFpbnRzKCk7Ci0gICAgfQotCi0g
ICAgQVNTRVJUKCFyZW5kZXJlcigpIHx8IHJlbmRlckFyZW5hKCkpOwotICAgIGlmICghcmVuZGVy
ZXIoKSB8fCAhcmVuZGVyQXJlbmEoKSkKLSAgICAgICAgZ290byBiYWlsX291dDsKLQotICAgIGlm
IChtX3BlbmRpbmdTdHlsZVJlY2FsY1Nob3VsZEZvcmNlKQotICAgICAgICBjaGFuZ2UgPSBGb3Jj
ZTsKLQotICAgIC8vIFJlY2FsY3VsYXRpbmcgdGhlIHJvb3Qgc3R5bGUgKG9uIHRoZSBkb2N1bWVu
dCkgaXMgbm90IG5lZWRlZCBpbiB0aGUgY29tbW9uIGNhc2UuCi0gICAgaWYgKChjaGFuZ2UgPT0g
Rm9yY2UpIHx8IChzaG91bGREaXNwbGF5U2VhbWxlc3NseVdpdGhQYXJlbnQoKSAmJiAoY2hhbmdl
ID49IEluaGVyaXQpKSkgewotICAgICAgICAvLyBzdHlsZSBzZWxlY3RvciBtYXkgc2V0IHRoaXMg
YWdhaW4gZHVyaW5nIHJlY2FsYwotICAgICAgICBtX2hhc05vZGVzV2l0aFBsYWNlaG9sZGVyU3R5
bGUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gZG9jdW1l
bnRTdHlsZSA9IFN0eWxlUmVzb2x2ZXI6OnN0eWxlRm9yRG9jdW1lbnQodGhpcywgbV9zdHlsZVJl
c29sdmVyID8gbV9zdHlsZVJlc29sdmVyLT5mb250U2VsZWN0b3IoKSA6IDApOwotICAgICAgICBT
dHlsZUNoYW5nZSBjaCA9IE5vZGU6OmRpZmYoZG9jdW1lbnRTdHlsZS5nZXQoKSwgcmVuZGVyZXIo
KS0+c3R5bGUoKSwgdGhpcyk7Ci0gICAgICAgIGlmIChjaCAhPSBOb0NoYW5nZSkKLSAgICAgICAg
ICAgIHJlbmRlcmVyKCktPnNldFN0eWxlKGRvY3VtZW50U3R5bGUucmVsZWFzZSgpKTsKLSAgICB9
Ci0KLSAgICBmb3IgKE5vZGUqIG4gPSBmaXJzdENoaWxkKCk7IG47IG4gPSBuLT5uZXh0U2libGlu
ZygpKSB7Ci0gICAgICAgIGlmICghbi0+aXNFbGVtZW50Tm9kZSgpKQotICAgICAgICAgICAgY29u
dGludWU7Ci0gICAgICAgIEVsZW1lbnQqIGVsZW1lbnQgPSBzdGF0aWNfY2FzdDxFbGVtZW50Kj4o
bik7Ci0gICAgICAgIGlmIChjaGFuZ2UgPj0gSW5oZXJpdCB8fCBlbGVtZW50LT5jaGlsZE5lZWRz
U3R5bGVSZWNhbGMoKSB8fCBlbGVtZW50LT5uZWVkc1N0eWxlUmVjYWxjKCkpCi0gICAgICAgICAg
ICBlbGVtZW50LT5yZWNhbGNTdHlsZShjaGFuZ2UpOwotICAgIH0KLQotI2lmIFVTRShBQ0NFTEVS
QVRFRF9DT01QT1NJVElORykKLSAgICBpZiAodmlldygpKSB7Ci0gICAgICAgIGJvb2wgbGF5b3V0
UGVuZGluZyA9IHZpZXcoKS0+bGF5b3V0UGVuZGluZygpIHx8IHJlbmRlcmVyKCktPm5lZWRzTGF5
b3V0KCk7Ci0gICAgICAgIC8vIElmIHdlIGRpZG4ndCB1cGRhdGUgY29tcG9zaXRpbmcgbGF5ZXJz
IGJlY2F1c2Ugb2YgbGF5b3V0KCksIHdlIG5lZWQgdG8gZG8gc28gaGVyZS4KLSAgICAgICAgaWYg
KCFsYXlvdXRQZW5kaW5nKQotICAgICAgICAgICAgdmlldygpLT51cGRhdGVDb21wb3NpdGluZ0xh
eWVyc0FmdGVyU3R5bGVDaGFuZ2UoKTsKLSAgICB9Ci0jZW5kaWYKLQotYmFpbF9vdXQ6Ci0gICAg
Y2xlYXJOZWVkc1N0eWxlUmVjYWxjKCk7Ci0gICAgY2xlYXJDaGlsZE5lZWRzU3R5bGVSZWNhbGMo
KTsKLSAgICB1bnNjaGVkdWxlU3R5bGVSZWNhbGMoKTsKLQotICAgIG1faW5TdHlsZVJlY2FsYyA9
IGZhbHNlOwotICAgIAotICAgIC8vIFBzZXVkbyBlbGVtZW50IHJlbW92YWwgYW5kIHNpbWlsYXIg
bWF5IG9ubHkgd29yayB3aXRoIHRoZXNlIGZsYWdzIHN0aWxsIHNldC4gUmVzZXQgdGhlbSBhZnRl
ciB0aGUgc3R5bGUgcmVjYWxjLgotICAgIGlmIChtX3N0eWxlUmVzb2x2ZXIpCi0gICAgICAgIHJl
c2V0Q1NTRmVhdHVyZUZsYWdzKCk7Ci0KLSAgICBpZiAoZnJhbWVWaWV3KSB7Ci0gICAgICAgIGZy
YW1lVmlldy0+cmVzdW1lU2NoZWR1bGVkRXZlbnRzKCk7Ci0gICAgICAgIGZyYW1lVmlldy0+ZW5k
RGVmZXJyZWRSZXBhaW50cygpOwotICAgIH0KLSAgICBSZW5kZXJXaWRnZXQ6OnJlc3VtZVdpZGdl
dEhpZXJhcmNoeVVwZGF0ZXMoKTsKLSAgICByZXN1bWVQb3N0QXR0YWNoQ2FsbGJhY2tzKCk7Ci0K
LSAgICAvLyBJZiB3ZSB3YW50ZWQgdG8gY2FsbCBpbXBsaWNpdENsb3NlKCkgZHVyaW5nIHJlY2Fs
Y1N0eWxlLCBkbyBzbyBub3cgdGhhdCB3ZSdyZSBmaW5pc2hlZC4KLSAgICBpZiAobV9jbG9zZUFm
dGVyU3R5bGVSZWNhbGMpIHsKLSAgICAgICAgbV9jbG9zZUFmdGVyU3R5bGVSZWNhbGMgPSBmYWxz
ZTsKLSAgICAgICAgaW1wbGljaXRDbG9zZSgpOwotICAgIH0KLQotICAgIEluc3BlY3Rvckluc3Ry
dW1lbnRhdGlvbjo6ZGlkUmVjYWxjdWxhdGVTdHlsZShjb29raWUpOwotfQotCi12b2lkIERvY3Vt
ZW50Ojp1cGRhdGVTdHlsZUlmTmVlZGVkKCkKLXsKLSAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkp
OwotICAgIEFTU0VSVCghdmlldygpIHx8ICghdmlldygpLT5pc0luTGF5b3V0KCkgJiYgIXZpZXco
KS0+aXNQYWludGluZygpKSk7Ci0gICAgCi0gICAgaWYgKCghbV9wZW5kaW5nU3R5bGVSZWNhbGNT
aG91bGRGb3JjZSAmJiAhY2hpbGROZWVkc1N0eWxlUmVjYWxjKCkpIHx8IGluUGFnZUNhY2hlKCkp
Ci0gICAgICAgIHJldHVybjsKLQotICAgIEFuaW1hdGlvblVwZGF0ZUJsb2NrIGFuaW1hdGlvblVw
ZGF0ZUJsb2NrKG1fZnJhbWUgPyBtX2ZyYW1lLT5hbmltYXRpb24oKSA6IDApOwotICAgIHJlY2Fs
Y1N0eWxlKE5vQ2hhbmdlKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6dXBkYXRlU3R5bGVGb3JBbGxE
b2N1bWVudHMoKQotewotICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7Ci0gICAgaWYgKCFkb2N1
bWVudHNUaGF0TmVlZFN0eWxlUmVjYWxjKQotICAgICAgICByZXR1cm47Ci0KLSAgICB3aGlsZSAo
ZG9jdW1lbnRzVGhhdE5lZWRTdHlsZVJlY2FsYy0+c2l6ZSgpKSB7Ci0gICAgICAgIEhhc2hTZXQ8
RG9jdW1lbnQqPjo6aXRlcmF0b3IgaXQgPSBkb2N1bWVudHNUaGF0TmVlZFN0eWxlUmVjYWxjLT5i
ZWdpbigpOwotICAgICAgICBEb2N1bWVudCogZG9jID0gKml0OwotICAgICAgICBkb2N1bWVudHNU
aGF0TmVlZFN0eWxlUmVjYWxjLT5yZW1vdmUoZG9jKTsKLSAgICAgICAgZG9jLT51cGRhdGVTdHls
ZUlmTmVlZGVkKCk7Ci0gICAgfQotfQotCi12b2lkIERvY3VtZW50Ojp1cGRhdGVMYXlvdXQoKQot
ewotICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7Ci0gICAgaWYgKEVsZW1lbnQqIG9lID0gb3du
ZXJFbGVtZW50KCkpCi0gICAgICAgIG9lLT5kb2N1bWVudCgpLT51cGRhdGVMYXlvdXQoKTsKLQot
ICAgIHVwZGF0ZVN0eWxlSWZOZWVkZWQoKTsKLQotICAgIC8vIE9ubHkgZG8gYSBsYXlvdXQgaWYg
Y2hhbmdlcyBoYXZlIG9jY3VycmVkIHRoYXQgbWFrZSBpdCBuZWNlc3NhcnkuICAgICAgCi0gICAg
RnJhbWVWaWV3KiB2ID0gdmlldygpOwotICAgIGlmICh2ICYmIHJlbmRlcmVyKCkgJiYgKHYtPmxh
eW91dFBlbmRpbmcoKSB8fCByZW5kZXJlcigpLT5uZWVkc0xheW91dCgpKSkKLSAgICAgICAgdi0+
bGF5b3V0KCk7Ci19Ci0KLS8vIEZJWE1FOiBUaGlzIGlzIGEgYmFkIGlkZWEgYW5kIG5lZWRzIHRv
IGJlIHJlbW92ZWQgZXZlbnR1YWxseS4KLS8vIE90aGVyIGJyb3dzZXJzIGxvYWQgc3R5bGVzaGVl
dHMgYmVmb3JlIHRoZXkgY29udGludWUgcGFyc2luZyB0aGUgd2ViIHBhZ2UuCi0vLyBTaW5jZSB3
ZSBkb24ndCwgd2UgY2FuIHJ1biBKYXZhU2NyaXB0IGNvZGUgdGhhdCBuZWVkcyBhbnN3ZXJzIGJl
Zm9yZSB0aGUKLS8vIHN0eWxlc2hlZXRzIGFyZSBsb2FkZWQuIERvaW5nIGEgbGF5b3V0IGlnbm9y
aW5nIHRoZSBwZW5kaW5nIHN0eWxlc2hlZXRzCi0vLyBsZXRzIHVzIGdldCByZWFzb25hYmxlIGFu
c3dlcnMuIFRoZSBsb25nIHRlcm0gc29sdXRpb24gdG8gdGhpcyBwcm9ibGVtIGlzCi0vLyB0byBp
bnN0ZWFkIHN1c3BlbmQgSmF2YVNjcmlwdCBleGVjdXRpb24uCi12b2lkIERvY3VtZW50Ojp1cGRh
dGVMYXlvdXRJZ25vcmVQZW5kaW5nU3R5bGVzaGVldHMoKQotewotICAgIGJvb2wgb2xkSWdub3Jl
ID0gbV9pZ25vcmVQZW5kaW5nU3R5bGVzaGVldHM7Ci0gICAgCi0gICAgaWYgKCFoYXZlU3R5bGVz
aGVldHNMb2FkZWQoKSkgewotICAgICAgICBtX2lnbm9yZVBlbmRpbmdTdHlsZXNoZWV0cyA9IHRy
dWU7Ci0gICAgICAgIC8vIEZJWE1FOiBXZSBhcmUgd2lsbGluZyB0byBhdHRlbXB0IHRvIHN1cHBy
ZXNzIHBhaW50aW5nIHdpdGggb3V0ZGF0ZWQgc3R5bGUgaW5mbyBvbmx5IG9uY2UuICBPdXIgYXNz
dW1wdGlvbiBpcyB0aGF0IGl0IHdvdWxkIGJlCi0gICAgICAgIC8vIGRhbmdlcm91cyB0byB0cnkg
dG8gc3RvcCBpdCBhIHNlY29uZCB0aW1lLCBhZnRlciBwYWdlIGNvbnRlbnQgaGFzIGFscmVhZHkg
YmVlbiBsb2FkZWQgYW5kIGRpc3BsYXllZAotICAgICAgICAvLyB3aXRoIGFjY3VyYXRlIHN0eWxl
IGluZm9ybWF0aW9uLiAgKE91ciBzdXBwcmVzc2lvbiBpbnZvbHZlcyBibGFua2luZyB0aGUgd2hv
bGUgcGFnZSBhdCB0aGUKLSAgICAgICAgLy8gbW9tZW50LiAgSWYgaXQgd2VyZSBtb3JlIHJlZmlu
ZWQsIHdlIG1pZ2h0IGJlIGFibGUgdG8gZG8gc29tZXRoaW5nIGJldHRlci4pCi0gICAgICAgIC8v
IEl0J3Mgd29ydGggbm90aW5nIHRob3VnaCB0aGF0IHRoaXMgZW50aXJlIG1ldGhvZCBpcyBhIGhh
Y2ssIHNpbmNlIHdoYXQgd2UgcmVhbGx5IHdhbnQgdG8gZG8gaXMKLSAgICAgICAgLy8gc3VzcGVu
ZCBKUyBpbnN0ZWFkIG9mIGRvaW5nIGEgbGF5b3V0IHdpdGggaW5hY2N1cmF0ZSBpbmZvcm1hdGlv
bi4KLSAgICAgICAgSFRNTEVsZW1lbnQqIGJvZHlFbGVtZW50ID0gYm9keSgpOwotICAgICAgICBp
ZiAoYm9keUVsZW1lbnQgJiYgIWJvZHlFbGVtZW50LT5yZW5kZXJlcigpICYmIG1fcGVuZGluZ1No
ZWV0TGF5b3V0ID09IE5vTGF5b3V0V2l0aFBlbmRpbmdTaGVldHMpIHsKLSAgICAgICAgICAgIG1f
cGVuZGluZ1NoZWV0TGF5b3V0ID0gRGlkTGF5b3V0V2l0aFBlbmRpbmdTaGVldHM7Ci0gICAgICAg
ICAgICBzdHlsZVJlc29sdmVyQ2hhbmdlZChSZWNhbGNTdHlsZUltbWVkaWF0ZWx5KTsKLSAgICAg
ICAgfSBlbHNlIGlmIChtX2hhc05vZGVzV2l0aFBsYWNlaG9sZGVyU3R5bGUpCi0gICAgICAgICAg
ICAvLyBJZiBuZXcgbm9kZXMgaGF2ZSBiZWVuIGFkZGVkIG9yIHN0eWxlIHJlY2FsYyBoYXMgYmVl
biBkb25lIHdpdGggc3R5bGUgc2hlZXRzIHN0aWxsIHBlbmRpbmcsIHNvbWUgbm9kZXMgCi0gICAg
ICAgICAgICAvLyBtYXkgbm90IGhhdmUgaGFkIHRoZWlyIHJlYWwgc3R5bGUgY2FsY3VsYXRlZCB5
ZXQuIE5vcm1hbGx5IHRoaXMgZ2V0cyBjbGVhbmVkIHdoZW4gc3R5bGUgc2hlZXRzIGFycml2ZSAK
LSAgICAgICAgICAgIC8vIGJ1dCBoZXJlIHdlIG5lZWQgdXAtdG8tZGF0ZSBzdHlsZSBpbW1lZGlh
dGVseS4KLSAgICAgICAgICAgIHJlY2FsY1N0eWxlKEZvcmNlKTsKLSAgICB9Ci0KLSAgICB1cGRh
dGVMYXlvdXQoKTsKLQotICAgIG1faWdub3JlUGVuZGluZ1N0eWxlc2hlZXRzID0gb2xkSWdub3Jl
OwotfQotCi1QYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBEb2N1bWVudDo6c3R5bGVGb3JFbGVtZW50
SWdub3JpbmdQZW5kaW5nU3R5bGVzaGVldHMoRWxlbWVudCogZWxlbWVudCkKLXsKLSAgICBBU1NF
UlRfQVJHKGVsZW1lbnQsIGVsZW1lbnQtPmRvY3VtZW50KCkgPT0gdGhpcyk7Ci0KLSAgICBib29s
IG9sZElnbm9yZSA9IG1faWdub3JlUGVuZGluZ1N0eWxlc2hlZXRzOwotICAgIG1faWdub3JlUGVu
ZGluZ1N0eWxlc2hlZXRzID0gdHJ1ZTsKLSAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IHN0eWxlID0g
c3R5bGVSZXNvbHZlcigpLT5zdHlsZUZvckVsZW1lbnQoZWxlbWVudCwgZWxlbWVudC0+cGFyZW50
Tm9kZSgpID8gZWxlbWVudC0+cGFyZW50Tm9kZSgpLT5jb21wdXRlZFN0eWxlKCkgOiAwKTsKLSAg
ICBtX2lnbm9yZVBlbmRpbmdTdHlsZXNoZWV0cyA9IG9sZElnbm9yZTsKLSAgICByZXR1cm4gc3R5
bGUucmVsZWFzZSgpOwotfQotCi1QYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBEb2N1bWVudDo6c3R5
bGVGb3JQYWdlKGludCBwYWdlSW5kZXgpCi17Ci0gICAgUmVmUHRyPFJlbmRlclN0eWxlPiBzdHls
ZSA9IHN0eWxlUmVzb2x2ZXIoKS0+c3R5bGVGb3JQYWdlKHBhZ2VJbmRleCk7Ci0gICAgcmV0dXJu
IHN0eWxlLnJlbGVhc2UoKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6cmVnaXN0ZXJDdXN0b21Gb250
KFBhc3NPd25QdHI8Rm9udERhdGE+IGZvbnREYXRhKQotewotICAgIG1fY3VzdG9tRm9udHMuYXBw
ZW5kKGZvbnREYXRhKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6ZGVsZXRlQ3VzdG9tRm9udHMoKQot
ewotICAgIHNpemVfdCBzaXplID0gbV9jdXN0b21Gb250cy5zaXplKCk7Ci0gICAgZm9yIChzaXpl
X3QgaSA9IDA7IGkgPCBzaXplOyArK2kpCi0gICAgICAgIEdseXBoUGFnZVRyZWVOb2RlOjpwcnVu
ZVRyZWVDdXN0b21Gb250RGF0YShtX2N1c3RvbUZvbnRzW2ldLmdldCgpKTsKLQotICAgIG1fY3Vz
dG9tRm9udHMuY2xlYXIoKTsKLX0KLQotYm9vbCBEb2N1bWVudDo6aXNQYWdlQm94VmlzaWJsZShp
bnQgcGFnZUluZGV4KQotewotICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gc3R5bGUgPSBzdHlsZUZv
clBhZ2UocGFnZUluZGV4KTsKLSAgICByZXR1cm4gc3R5bGUtPnZpc2liaWxpdHkoKSAhPSBISURE
RU47IC8vIGRpc3BsYXkgcHJvcGVydHkgZG9lc24ndCBhcHBseSB0byBAcGFnZS4KLX0KLQotdm9p
ZCBEb2N1bWVudDo6cGFnZVNpemVBbmRNYXJnaW5zSW5QaXhlbHMoaW50IHBhZ2VJbmRleCwgSW50
U2l6ZSYgcGFnZVNpemUsIGludCYgbWFyZ2luVG9wLCBpbnQmIG1hcmdpblJpZ2h0LCBpbnQmIG1h
cmdpbkJvdHRvbSwgaW50JiBtYXJnaW5MZWZ0KQotewotICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4g
c3R5bGUgPSBzdHlsZUZvclBhZ2UocGFnZUluZGV4KTsKLSAgICBSZW5kZXJWaWV3KiB2aWV3ID0g
cmVuZGVyVmlldygpOwotCi0gICAgaW50IHdpZHRoID0gcGFnZVNpemUud2lkdGgoKTsKLSAgICBp
bnQgaGVpZ2h0ID0gcGFnZVNpemUuaGVpZ2h0KCk7Ci0gICAgc3dpdGNoIChzdHlsZS0+cGFnZVNp
emVUeXBlKCkpIHsKLSAgICBjYXNlIFBBR0VfU0laRV9BVVRPOgotICAgICAgICBicmVhazsKLSAg
ICBjYXNlIFBBR0VfU0laRV9BVVRPX0xBTkRTQ0FQRToKLSAgICAgICAgaWYgKHdpZHRoIDwgaGVp
Z2h0KQotICAgICAgICAgICAgc3RkOjpzd2FwKHdpZHRoLCBoZWlnaHQpOwotICAgICAgICBicmVh
azsKLSAgICBjYXNlIFBBR0VfU0laRV9BVVRPX1BPUlRSQUlUOgotICAgICAgICBpZiAod2lkdGgg
PiBoZWlnaHQpCi0gICAgICAgICAgICBzdGQ6OnN3YXAod2lkdGgsIGhlaWdodCk7Ci0gICAgICAg
IGJyZWFrOwotICAgIGNhc2UgUEFHRV9TSVpFX1JFU09MVkVEOiB7Ci0gICAgICAgIExlbmd0aFNp
emUgc2l6ZSA9IHN0eWxlLT5wYWdlU2l6ZSgpOwotICAgICAgICBBU1NFUlQoc2l6ZS53aWR0aCgp
LmlzRml4ZWQoKSk7Ci0gICAgICAgIEFTU0VSVChzaXplLmhlaWdodCgpLmlzRml4ZWQoKSk7Ci0g
ICAgICAgIHdpZHRoID0gdmFsdWVGb3JMZW5ndGgoc2l6ZS53aWR0aCgpLCAwLCB2aWV3KTsKLSAg
ICAgICAgaGVpZ2h0ID0gdmFsdWVGb3JMZW5ndGgoc2l6ZS5oZWlnaHQoKSwgMCwgdmlldyk7Ci0g
ICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgICBBU1NFUlRfTk9UX1JF
QUNIRUQoKTsKLSAgICB9Ci0gICAgcGFnZVNpemUgPSBJbnRTaXplKHdpZHRoLCBoZWlnaHQpOwot
Ci0gICAgLy8gVGhlIHBlcmNlbnRhZ2UgaXMgY2FsY3VsYXRlZCB3aXRoIHJlc3BlY3QgdG8gdGhl
IHdpZHRoIGV2ZW4gZm9yIG1hcmdpbiB0b3AgYW5kIGJvdHRvbS4KLSAgICAvLyBodHRwOi8vd3d3
LnczLm9yZy9UUi9DU1MyL2JveC5odG1sI21hcmdpbi1wcm9wZXJ0aWVzCi0gICAgbWFyZ2luVG9w
ID0gc3R5bGUtPm1hcmdpblRvcCgpLmlzQXV0bygpID8gbWFyZ2luVG9wIDogaW50VmFsdWVGb3JM
ZW5ndGgoc3R5bGUtPm1hcmdpblRvcCgpLCB3aWR0aCwgdmlldyk7Ci0gICAgbWFyZ2luUmlnaHQg
PSBzdHlsZS0+bWFyZ2luUmlnaHQoKS5pc0F1dG8oKSA/IG1hcmdpblJpZ2h0IDogaW50VmFsdWVG
b3JMZW5ndGgoc3R5bGUtPm1hcmdpblJpZ2h0KCksIHdpZHRoLCB2aWV3KTsKLSAgICBtYXJnaW5C
b3R0b20gPSBzdHlsZS0+bWFyZ2luQm90dG9tKCkuaXNBdXRvKCkgPyBtYXJnaW5Cb3R0b20gOiBp
bnRWYWx1ZUZvckxlbmd0aChzdHlsZS0+bWFyZ2luQm90dG9tKCksIHdpZHRoLCB2aWV3KTsKLSAg
ICBtYXJnaW5MZWZ0ID0gc3R5bGUtPm1hcmdpbkxlZnQoKS5pc0F1dG8oKSA/IG1hcmdpbkxlZnQg
OiBpbnRWYWx1ZUZvckxlbmd0aChzdHlsZS0+bWFyZ2luTGVmdCgpLCB3aWR0aCwgdmlldyk7Ci19
Ci0KLXZvaWQgRG9jdW1lbnQ6OnNldERvY3VtZW50UmFyZURhdGEoTm9kZVJhcmVEYXRhKiByYXJl
RGF0YSkKLXsKLSAgICBtX2RvY3VtZW50UmFyZURhdGEgPSByYXJlRGF0YTsKLX0KLQotdm9pZCBE
b2N1bWVudDo6c2V0SXNWaWV3U291cmNlKGJvb2wgaXNWaWV3U291cmNlKQotewotICAgIG1faXNW
aWV3U291cmNlID0gaXNWaWV3U291cmNlOwotICAgIGlmICghbV9pc1ZpZXdTb3VyY2UpCi0gICAg
ICAgIHJldHVybjsKLQotICAgIHNldFNlY3VyaXR5T3JpZ2luKFNlY3VyaXR5T3JpZ2luOjpjcmVh
dGVVbmlxdWUoKSk7Ci0gICAgZGlkVXBkYXRlU2VjdXJpdHlPcmlnaW4oKTsKLX0KLQotdm9pZCBE
b2N1bWVudDo6Y29tYmluZUNTU0ZlYXR1cmVGbGFncygpCi17Ci0gICAgLy8gRGVsYXkgcmVzZXR0
aW5nIHRoZSBmbGFncyB1bnRpbCBhZnRlciBuZXh0IHN0eWxlIHJlY2FsYyBzaW5jZSB1bmFwcGx5
aW5nIHRoZSBzdHlsZSBtYXkgbm90IHdvcmsgd2l0aG91dCB0aGVzZSBzZXQgKHRoaXMgaXMgdHJ1
ZSBhdCBsZWFzdCB3aXRoIGJlZm9yZS9hZnRlcikuCi0gICAgbV91c2VzU2libGluZ1J1bGVzID0g
bV91c2VzU2libGluZ1J1bGVzIHx8IG1fc3R5bGVSZXNvbHZlci0+dXNlc1NpYmxpbmdSdWxlcygp
OwotICAgIG1fdXNlc0ZpcnN0TGluZVJ1bGVzID0gbV91c2VzRmlyc3RMaW5lUnVsZXMgfHwgbV9z
dHlsZVJlc29sdmVyLT51c2VzRmlyc3RMaW5lUnVsZXMoKTsKLSAgICBtX3VzZXNCZWZvcmVBZnRl
clJ1bGVzID0gbV91c2VzQmVmb3JlQWZ0ZXJSdWxlcyB8fCBtX3N0eWxlUmVzb2x2ZXItPnVzZXNC
ZWZvcmVBZnRlclJ1bGVzKCk7Ci0gICAgbV91c2VzTGlua1J1bGVzID0gbV91c2VzTGlua1J1bGVz
IHx8IG1fc3R5bGVSZXNvbHZlci0+dXNlc0xpbmtSdWxlcygpOwotfQotCi12b2lkIERvY3VtZW50
OjpyZXNldENTU0ZlYXR1cmVGbGFncygpCi17Ci0gICAgbV91c2VzU2libGluZ1J1bGVzID0gbV9z
dHlsZVJlc29sdmVyLT51c2VzU2libGluZ1J1bGVzKCk7Ci0gICAgbV91c2VzRmlyc3RMaW5lUnVs
ZXMgPSBtX3N0eWxlUmVzb2x2ZXItPnVzZXNGaXJzdExpbmVSdWxlcygpOwotICAgIG1fdXNlc0Jl
Zm9yZUFmdGVyUnVsZXMgPSBtX3N0eWxlUmVzb2x2ZXItPnVzZXNCZWZvcmVBZnRlclJ1bGVzKCk7
Ci0gICAgbV91c2VzTGlua1J1bGVzID0gbV9zdHlsZVJlc29sdmVyLT51c2VzTGlua1J1bGVzKCk7
Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmNyZWF0ZVN0eWxlUmVzb2x2ZXIoKQotewotICAgIGJvb2wg
bWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzID0gdHJ1ZTsKLSAgICBpZiAoU2V0dGluZ3MqIGRvY1Nl
dHRpbmdzID0gc2V0dGluZ3MoKSkKLSAgICAgICAgbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzID0g
ZG9jU2V0dGluZ3MtPmF1dGhvckFuZFVzZXJTdHlsZXNFbmFibGVkKCk7Ci0gICAgbV9zdHlsZVJl
c29sdmVyID0gYWRvcHRQdHIobmV3IFN0eWxlUmVzb2x2ZXIodGhpcywgbWF0Y2hBdXRob3JBbmRV
c2VyU3R5bGVzKSk7Ci0gICAgY29tYmluZUNTU0ZlYXR1cmVGbGFncygpOwotfQotCi1pbmxpbmUg
dm9pZCBEb2N1bWVudDo6Y2xlYXJTdHlsZVJlc29sdmVyKCkKLXsKLSAgICBtX3N0eWxlUmVzb2x2
ZXIuY2xlYXIoKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6YXR0YWNoKCkKLXsKLSAgICBBU1NFUlQo
IWF0dGFjaGVkKCkpOwotICAgIEFTU0VSVCghbV9pblBhZ2VDYWNoZSk7Ci0gICAgQVNTRVJUKCFt
X2F4T2JqZWN0Q2FjaGUgfHwgdGhpcyAhPSB0b3BEb2N1bWVudCgpKTsKLQotICAgIGlmICghbV9y
ZW5kZXJBcmVuYSkKLSAgICAgICAgbV9yZW5kZXJBcmVuYSA9IGFkb3B0UHRyKG5ldyBSZW5kZXJB
cmVuYSk7Ci0gICAgCi0gICAgLy8gQ3JlYXRlIHRoZSByZW5kZXJpbmcgdHJlZQotICAgIHNldFJl
bmRlcmVyKG5ldyAobV9yZW5kZXJBcmVuYS5nZXQoKSkgUmVuZGVyVmlldyh0aGlzLCB2aWV3KCkp
KTsKLSNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCi0gICAgcmVuZGVyVmlldygpLT5k
aWRNb3ZlT25zY3JlZW4oKTsKLSNlbmRpZgotCi0gICAgcmVjYWxjU3R5bGUoRm9yY2UpOwotCi0g
ICAgUmVuZGVyT2JqZWN0KiByZW5kZXIgPSByZW5kZXJlcigpOwotICAgIHNldFJlbmRlcmVyKDAp
OwotCi0gICAgQ29udGFpbmVyTm9kZTo6YXR0YWNoKCk7Ci0KLSAgICBzZXRSZW5kZXJlcihyZW5k
ZXIpOwotfQotCi12b2lkIERvY3VtZW50OjpkZXRhY2goKQotewotICAgIEFTU0VSVChhdHRhY2hl
ZCgpKTsKLSAgICBBU1NFUlQoIW1faW5QYWdlQ2FjaGUpOwotCi0jaWYgRU5BQkxFKFBPSU5URVJf
TE9DSykKLSAgICBpZiAocGFnZSgpKQotICAgICAgICBwYWdlKCktPnBvaW50ZXJMb2NrQ29udHJv
bGxlcigpLT5kb2N1bWVudERldGFjaGVkKHRoaXMpOwotI2VuZGlmCi0KLSAgICBpZiAodGhpcyA9
PSB0b3BEb2N1bWVudCgpKQotICAgICAgICBjbGVhckFYT2JqZWN0Q2FjaGUoKTsKLQotICAgIHN0
b3BBY3RpdmVET01PYmplY3RzKCk7Ci0gICAgbV9ldmVudFF1ZXVlLT5jbG9zZSgpOwotI2lmIEVO
QUJMRShGVUxMU0NSRUVOX0FQSSkKLSAgICBtX2Z1bGxTY3JlZW5DaGFuZ2VFdmVudFRhcmdldFF1
ZXVlLmNsZWFyKCk7Ci0gICAgbV9mdWxsU2NyZWVuRXJyb3JFdmVudFRhcmdldFF1ZXVlLmNsZWFy
KCk7Ci0jZW5kaWYKLQotI2lmIEVOQUJMRShSRVFVRVNUX0FOSU1BVElPTl9GUkFNRSkKLSAgICAv
LyBGSVhNRTogY29uc2lkZXIgdXNpbmcgQWN0aXZlRE9NT2JqZWN0LgotICAgIGlmIChtX3Njcmlw
dGVkQW5pbWF0aW9uQ29udHJvbGxlcikKLSAgICAgICAgbV9zY3JpcHRlZEFuaW1hdGlvbkNvbnRy
b2xsZXItPmNsZWFyRG9jdW1lbnRQb2ludGVyKCk7Ci0gICAgbV9zY3JpcHRlZEFuaW1hdGlvbkNv
bnRyb2xsZXIuY2xlYXIoKTsKLSNlbmRpZgotCi0gICAgUmVuZGVyT2JqZWN0KiByZW5kZXIgPSBy
ZW5kZXJlcigpOwotCi0gICAgZG9jdW1lbnRXaWxsQmVjb21lSW5hY3RpdmUoKTsKLQotI2lmIEVO
QUJMRShTSEFSRURfV09SS0VSUykKLSAgICBTaGFyZWRXb3JrZXJSZXBvc2l0b3J5Ojpkb2N1bWVu
dERldGFjaGVkKHRoaXMpOwotI2VuZGlmCi0KLSAgICBpZiAobV9mcmFtZSkgewotICAgICAgICBG
cmFtZVZpZXcqIHZpZXcgPSBtX2ZyYW1lLT52aWV3KCk7Ci0gICAgICAgIGlmICh2aWV3KQotICAg
ICAgICAgICAgdmlldy0+ZGV0YWNoQ3VzdG9tU2Nyb2xsYmFycygpOwotCi0gICAgfQotCi0gICAg
Ly8gaW5kaWNhdGUgZGVzdHJ1Y3Rpb24gbW9kZSwgIGkuZS4gYXR0YWNoZWQoKSBidXQgcmVuZGVy
ZXIgPT0gMAotICAgIHNldFJlbmRlcmVyKDApOwotICAgIAotI2lmIEVOQUJMRShGVUxMU0NSRUVO
X0FQSSkKLSAgICBpZiAobV9mdWxsU2NyZWVuUmVuZGVyZXIpCi0gICAgICAgIHNldEZ1bGxTY3Jl
ZW5SZW5kZXJlcigwKTsKLSNlbmRpZgotCi0gICAgbV9ob3Zlck5vZGUgPSAwOwotICAgIG1fZm9j
dXNlZE5vZGUgPSAwOwotICAgIG1fYWN0aXZlTm9kZSA9IDA7Ci0KLSAgICBDb250YWluZXJOb2Rl
OjpkZXRhY2goKTsKLQotICAgIHVuc2NoZWR1bGVTdHlsZVJlY2FsYygpOwotCi0gICAgaWYgKHJl
bmRlcikKLSAgICAgICAgcmVuZGVyLT5kZXN0cm95KCk7Ci0KLSAgICAvLyBUaGlzIGlzIHJlcXVp
cmVkLCBhcyBvdXIgRnJhbWUgbWlnaHQgZGVsZXRlIGl0c2VsZiBhcyBzb29uIGFzIGl0IGRldGFj
aGVzCi0gICAgLy8gdXMuIEhvd2V2ZXIsIHRoaXMgdmlvbGF0ZXMgTm9kZTo6ZGV0YWNoKCkgc2Vt
YW50aWNzLCBhcyBpdCdzIG5ldmVyCi0gICAgLy8gcG9zc2libGUgdG8gcmUtYXR0YWNoLiBFdmVu
dHVhbGx5IERvY3VtZW50OjpkZXRhY2goKSBzaG91bGQgYmUgcmVuYW1lZCwKLSAgICAvLyBvciB0
aGlzIHNldHRpbmcgb2YgdGhlIGZyYW1lIHRvIDAgY291bGQgYmUgbWFkZSBleHBsaWNpdCBpbiBl
YWNoIG9mIHRoZQotICAgIC8vIGNhbGxlcnMgb2YgRG9jdW1lbnQ6OmRldGFjaCgpLgotICAgIG1f
ZnJhbWUgPSAwOwotICAgIG1fcmVuZGVyQXJlbmEuY2xlYXIoKTsKLX0KLQotdm9pZCBEb2N1bWVu
dDo6cHJlcGFyZUZvckRlc3RydWN0aW9uKCkKLXsKLSAgICBkaXNjb25uZWN0RGVzY2VuZGFudEZy
YW1lcygpOwotICAgIGlmIChET01XaW5kb3cqIHdpbmRvdyA9IHRoaXMtPmRvbVdpbmRvdygpKQot
ICAgICAgICB3aW5kb3ctPndpbGxEZXRhY2hEb2N1bWVudEZyb21GcmFtZSgpOwotICAgIGRldGFj
aCgpOwotfQotCi12b2lkIERvY3VtZW50OjpyZW1vdmVBbGxFdmVudExpc3RlbmVycygpCi17Ci0g
ICAgRXZlbnRUYXJnZXQ6OnJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzKCk7Ci0KLSAgICBpZiAoRE9N
V2luZG93KiBkb21XaW5kb3cgPSB0aGlzLT5kb21XaW5kb3coKSkKLSAgICAgICAgZG9tV2luZG93
LT5yZW1vdmVBbGxFdmVudExpc3RlbmVycygpOwotICAgIGZvciAoTm9kZSogbm9kZSA9IGZpcnN0
Q2hpbGQoKTsgbm9kZTsgbm9kZSA9IG5vZGUtPnRyYXZlcnNlTmV4dE5vZGUoKSkKLSAgICAgICAg
bm9kZS0+cmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnMoKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6c3Vz
cGVuZEFjdGl2ZURPTU9iamVjdHMoQWN0aXZlRE9NT2JqZWN0OjpSZWFzb25Gb3JTdXNwZW5zaW9u
IHdoeSkKLXsKLSAgICBTY3JpcHRFeGVjdXRpb25Db250ZXh0OjpzdXNwZW5kQWN0aXZlRE9NT2Jq
ZWN0cyh3aHkpOwotCi0jaWYgRU5BQkxFKERFVklDRV9PUklFTlRBVElPTikKLSAgICBpZiAoIXBh
Z2UoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKERldmljZU1vdGlvbkNvbnRyb2xsZXIq
IGNvbnRyb2xsZXIgPSBEZXZpY2VNb3Rpb25Db250cm9sbGVyOjpmcm9tKHBhZ2UoKSkpCi0gICAg
ICAgIGNvbnRyb2xsZXItPnN1c3BlbmRFdmVudHNGb3JBbGxMaXN0ZW5lcnMoZG9tV2luZG93KCkp
OwotICAgIGlmIChEZXZpY2VPcmllbnRhdGlvbkNvbnRyb2xsZXIqIGNvbnRyb2xsZXIgPSBEZXZp
Y2VPcmllbnRhdGlvbkNvbnRyb2xsZXI6OmZyb20ocGFnZSgpKSkKLSAgICAgICAgY29udHJvbGxl
ci0+c3VzcGVuZEV2ZW50c0ZvckFsbExpc3RlbmVycyhkb21XaW5kb3coKSk7Ci0KLSNlbmRpZgot
fQotCi12b2lkIERvY3VtZW50OjpyZXN1bWVBY3RpdmVET01PYmplY3RzKCkKLXsKLSAgICBTY3Jp
cHRFeGVjdXRpb25Db250ZXh0OjpyZXN1bWVBY3RpdmVET01PYmplY3RzKCk7Ci0KLSNpZiBFTkFC
TEUoREVWSUNFX09SSUVOVEFUSU9OKQotICAgIGlmICghcGFnZSgpKQotICAgICAgICByZXR1cm47
Ci0KLSAgICBpZiAoRGV2aWNlTW90aW9uQ29udHJvbGxlciogY29udHJvbGxlciA9IERldmljZU1v
dGlvbkNvbnRyb2xsZXI6OmZyb20ocGFnZSgpKSkKLSAgICAgICAgY29udHJvbGxlci0+cmVzdW1l
RXZlbnRzRm9yQWxsTGlzdGVuZXJzKGRvbVdpbmRvdygpKTsKLSAgICBpZiAoRGV2aWNlT3JpZW50
YXRpb25Db250cm9sbGVyKiBjb250cm9sbGVyID0gRGV2aWNlT3JpZW50YXRpb25Db250cm9sbGVy
Ojpmcm9tKHBhZ2UoKSkpCi0gICAgICAgIGNvbnRyb2xsZXItPnJlc3VtZUV2ZW50c0ZvckFsbExp
c3RlbmVycyhkb21XaW5kb3coKSk7Ci0jZW5kaWYKLX0KLQotUmVuZGVyVmlldyogRG9jdW1lbnQ6
OnJlbmRlclZpZXcoKSBjb25zdAotewotICAgIHJldHVybiB0b1JlbmRlclZpZXcocmVuZGVyZXIo
KSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmNsZWFyQVhPYmplY3RDYWNoZSgpCi17Ci0gICAgLy8g
Y2xlYXIgY2FjaGUgaW4gdG9wIGRvY3VtZW50Ci0gICAgaWYgKG1fYXhPYmplY3RDYWNoZSkgewot
ICAgICAgICAvLyBDbGVhciB0aGUgY2FjaGUgbWVtYmVyIHZhcmlhYmxlIGJlZm9yZSBjYWxsaW5n
IGRlbGV0ZSBiZWNhdXNlIGF0dGVtcHRzCi0gICAgICAgIC8vIGFyZSBtYWRlIHRvIGFjY2VzcyBp
dCBkdXJpbmcgZGVzdHJ1Y3Rpb24uCi0gICAgICAgIEFYT2JqZWN0Q2FjaGUqIGF4T2JqZWN0Q2Fj
aGUgPSBtX2F4T2JqZWN0Q2FjaGU7Ci0gICAgICAgIG1fYXhPYmplY3RDYWNoZSA9IDA7Ci0gICAg
ICAgIGRlbGV0ZSBheE9iamVjdENhY2hlOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIAot
ICAgIC8vIGFzayB0aGUgdG9wLWxldmVsIGRvY3VtZW50IHRvIGNsZWFyIGl0cyBjYWNoZQotICAg
IERvY3VtZW50KiBkb2MgPSB0b3BEb2N1bWVudCgpOwotICAgIGlmIChkb2MgIT0gdGhpcykKLSAg
ICAgICAgZG9jLT5jbGVhckFYT2JqZWN0Q2FjaGUoKTsKLX0KLQotYm9vbCBEb2N1bWVudDo6YXhP
YmplY3RDYWNoZUV4aXN0cygpIGNvbnN0Ci17Ci0gICAgaWYgKG1fYXhPYmplY3RDYWNoZSkKLSAg
ICAgICAgcmV0dXJuIHRydWU7Ci0gICAgCi0gICAgRG9jdW1lbnQqIGRvYyA9IHRvcERvY3VtZW50
KCk7Ci0gICAgaWYgKGRvYyAhPSB0aGlzKQotICAgICAgICByZXR1cm4gZG9jLT5heE9iamVjdENh
Y2hlRXhpc3RzKCk7Ci0gICAgCi0gICAgcmV0dXJuIGZhbHNlOwotfQotICAgIAotQVhPYmplY3RD
YWNoZSogRG9jdW1lbnQ6OmF4T2JqZWN0Q2FjaGUoKSBjb25zdAotewotICAgIC8vIFRoZSBvbmx5
IGRvY3VtZW50IHRoYXQgYWN0dWFsbHkgaGFzIGEgQVhPYmplY3RDYWNoZSBpcyB0aGUgdG9wLWxl
dmVsCi0gICAgLy8gZG9jdW1lbnQuICBUaGlzIGlzIGJlY2F1c2Ugd2UgbmVlZCB0byBiZSBhYmxl
IHRvIGdldCBmcm9tIGFueSBXZWJDb3JlQVhPYmplY3QKLSAgICAvLyB0byBhbnkgb3RoZXIgV2Vi
Q29yZUFYT2JqZWN0IG9uIHRoZSBzYW1lIHBhZ2UuICBVc2luZyBhIHNpbmdsZSBjYWNoZSBhbGxv
d3MKLSAgICAvLyBsb29rdXBzIGFjcm9zcyBuZXN0ZWQgd2ViYXJlYXMgKGkuZS4gbXVsdGlwbGUg
ZG9jdW1lbnRzKS4KLSAgICAKLSAgICBpZiAobV9heE9iamVjdENhY2hlKSB7Ci0gICAgICAgIC8v
IHJldHVybiBhbHJlYWR5IGtub3duIHRvcC1sZXZlbCBjYWNoZQotICAgICAgICBpZiAoIW93bmVy
RWxlbWVudCgpKQotICAgICAgICAgICAgcmV0dXJuIG1fYXhPYmplY3RDYWNoZTsKLSAgICAgICAg
Ci0gICAgICAgIC8vIEluIHNvbWUgcGFnZXMgd2l0aCBmcmFtZXMsIHRoZSBjYWNoZSBpcyBjcmVh
dGVkIGJlZm9yZSB0aGUgc3ViLXdlYmFyZWEgaXMKLSAgICAgICAgLy8gaW5zZXJ0ZWQgaW50byB0
aGUgdHJlZS4gIEhlcmUsIHdlIGNhdGNoIHRoYXQgY2FzZSBhbmQganVzdCB0b3NzIHRoZSBvbGQK
LSAgICAgICAgLy8gY2FjaGUgYW5kIHN0YXJ0IG92ZXIuCi0gICAgICAgIC8vIE5PVEU6IFRoaXMg
cmVjb3ZlcnkgbWF5IG5vIGxvbmdlciBiZSBuZWVkZWQuIEkgaGF2ZSBiZWVuIHVuYWJsZSB0byB0
cmlnZ2VyCi0gICAgICAgIC8vIGl0IGFnYWluLiBTZWUgcmRhcjovLzU3OTQ0NTQKLSAgICAgICAg
Ly8gRklYTUU6IENhbiB0aGlzIGJlIGZpeGVkIHdoZW4gaW5zZXJ0aW5nIHRoZSBzdWJmcmFtZSBp
bnN0ZWFkIG9mIG5vdz8KLSAgICAgICAgLy8gRklYTUU6IElmIHRoaXMgZnVuY3Rpb24gd2FzIGNh
bGxlZCB0byBnZXQgdGhlIGNhY2hlIGluIG9yZGVyIHRvIHJlbW92ZQotICAgICAgICAvLyBhbiBB
WE9iamVjdCwgd2UgYXJlIG5vdyBkZWxldGluZyB0aGUgY2FjaGUgYXMgYSB3aG9sZSBhbmQgcmV0
dXJuaW5nIGEKLSAgICAgICAgLy8gbmV3IGVtcHR5IGNhY2hlIHRoYXQgZG9lcyBub3QgY29udGFp
biB0aGUgQVhPYmplY3QhIFRoYXQgc2hvdWxkIGFjdHVhbGx5Ci0gICAgICAgIC8vIGJlIE9LLiBJ
IGFtIGNvbmNlcm5lZCBhYm91dCBvdGhlciBjYXNlcyBsaWtlIHRoaXMgd2hlcmUgYWNjZXNzaW5n
IHRoZQotICAgICAgICAvLyBjYWNoZSBibG93cyBhd2F5IHRoZSBBWE9iamVjdCBiZWluZyBvcGVy
YXRlZCBvbi4KLSAgICAgICAgZGVsZXRlIG1fYXhPYmplY3RDYWNoZTsKLSAgICAgICAgbV9heE9i
amVjdENhY2hlID0gMDsKLSAgICB9Ci0KLSAgICAvLyBhc2sgdGhlIHRvcC1sZXZlbCBkb2N1bWVu
dCBmb3IgaXRzIGNhY2hlCi0gICAgRG9jdW1lbnQqIGRvYyA9IHRvcERvY3VtZW50KCk7Ci0gICAg
aWYgKGRvYyAhPSB0aGlzKQotICAgICAgICByZXR1cm4gZG9jLT5heE9iamVjdENhY2hlKCk7Ci0g
ICAgCi0gICAgLy8gdGhpcyBpcyB0aGUgdG9wLWxldmVsIGRvY3VtZW50LCBzbyBpbnN0YWxsIGEg
bmV3IGNhY2hlCi0gICAgbV9heE9iamVjdENhY2hlID0gbmV3IEFYT2JqZWN0Q2FjaGUodGhpcyk7
Ci0gICAgcmV0dXJuIG1fYXhPYmplY3RDYWNoZTsKLX0KLQotdm9pZCBEb2N1bWVudDo6c2V0Vmlz
dWFsbHlPcmRlcmVkKCkKLXsKLSAgICBtX3Zpc3VhbGx5T3JkZXJlZCA9IHRydWU7Ci0gICAgaWYg
KHJlbmRlcmVyKCkpCi0gICAgICAgIHJlbmRlcmVyKCktPnN0eWxlKCktPnNldFJUTE9yZGVyaW5n
KFZpc3VhbE9yZGVyKTsKLX0KLQotUGFzc1JlZlB0cjxEb2N1bWVudFBhcnNlcj4gRG9jdW1lbnQ6
OmNyZWF0ZVBhcnNlcigpCi17Ci0gICAgLy8gRklYTUU6IHRoaXMgc2hvdWxkIHByb2JhYmx5IHBh
c3MgdGhlIGZyYW1lIGluc3RlYWQKLSNpZiBFTkFCTEUoTkVXX1hNTCkKLSAgICByZXR1cm4gTmV3
WE1MRG9jdW1lbnRQYXJzZXI6OmNyZWF0ZSh0aGlzKTsKLSNlbHNlCi0gICAgcmV0dXJuIFhNTERv
Y3VtZW50UGFyc2VyOjpjcmVhdGUodGhpcywgdmlldygpKTsKLSNlbmRpZgotfQotCi1TY3JpcHRh
YmxlRG9jdW1lbnRQYXJzZXIqIERvY3VtZW50OjpzY3JpcHRhYmxlRG9jdW1lbnRQYXJzZXIoKSBj
b25zdAotewotICAgIHJldHVybiBwYXJzZXIoKSA/IHBhcnNlcigpLT5hc1NjcmlwdGFibGVEb2N1
bWVudFBhcnNlcigpIDogMDsKLX0KLQotdm9pZCBEb2N1bWVudDo6b3BlbihEb2N1bWVudCogb3du
ZXJEb2N1bWVudCkKLXsKLSAgICBpZiAob3duZXJEb2N1bWVudCkgewotICAgICAgICBzZXRVUkwo
b3duZXJEb2N1bWVudC0+dXJsKCkpOwotICAgICAgICBtX2Nvb2tpZVVSTCA9IG93bmVyRG9jdW1l
bnQtPmNvb2tpZVVSTCgpOwotICAgICAgICBzZXRTZWN1cml0eU9yaWdpbihvd25lckRvY3VtZW50
LT5zZWN1cml0eU9yaWdpbigpKTsKLSAgICB9Ci0KLSAgICBpZiAobV9mcmFtZSkgewotICAgICAg
ICBpZiAoU2NyaXB0YWJsZURvY3VtZW50UGFyc2VyKiBwYXJzZXIgPSBzY3JpcHRhYmxlRG9jdW1l
bnRQYXJzZXIoKSkgewotICAgICAgICAgICAgaWYgKHBhcnNlci0+aXNQYXJzaW5nKCkpIHsKLSAg
ICAgICAgICAgICAgICAvLyBGSVhNRTogSFRNTDUgZG9lc24ndCB0ZWxsIHVzIHRvIGNoZWNrIHRo
aXMsIGl0IG1pZ2h0IG5vdCBiZSBjb3JyZWN0LgotICAgICAgICAgICAgICAgIGlmIChwYXJzZXIt
PmlzRXhlY3V0aW5nU2NyaXB0KCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAg
ICAgICAgICAgICAgIGlmICghcGFyc2VyLT53YXNDcmVhdGVkQnlTY3JpcHQoKSAmJiBwYXJzZXIt
Pmhhc0luc2VydGlvblBvaW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtX2ZyYW1lLT5sb2FkZXIoKS0+c3Rh
dGUoKSA9PSBGcmFtZVN0YXRlUHJvdmlzaW9uYWwpCi0gICAgICAgICAgICBtX2ZyYW1lLT5sb2Fk
ZXIoKS0+c3RvcEFsbExvYWRlcnMoKTsKLSAgICB9Ci0KLSAgICByZW1vdmVBbGxFdmVudExpc3Rl
bmVycygpOwotICAgIGltcGxpY2l0T3BlbigpOwotICAgIGlmIChTY3JpcHRhYmxlRG9jdW1lbnRQ
YXJzZXIqIHBhcnNlciA9IHNjcmlwdGFibGVEb2N1bWVudFBhcnNlcigpKQotICAgICAgICBwYXJz
ZXItPnNldFdhc0NyZWF0ZWRCeVNjcmlwdCh0cnVlKTsKLQotICAgIGlmIChET01XaW5kb3cqIGRv
bVdpbmRvdyA9IHRoaXMtPmRvbVdpbmRvdygpKQotICAgICAgICBkb21XaW5kb3ctPnJlbW92ZUFs
bEV2ZW50TGlzdGVuZXJzKCk7Ci0KLSAgICBpZiAobV9mcmFtZSkKLSAgICAgICAgbV9mcmFtZS0+
bG9hZGVyKCktPmRpZEV4cGxpY2l0T3BlbigpOwotfQotCi12b2lkIERvY3VtZW50OjpkZXRhY2hQ
YXJzZXIoKQotewotICAgIGlmICghbV9wYXJzZXIpCi0gICAgICAgIHJldHVybjsKLSAgICBtX3Bh
cnNlci0+ZGV0YWNoKCk7Ci0gICAgbV9wYXJzZXIuY2xlYXIoKTsKLX0KLQotdm9pZCBEb2N1bWVu
dDo6Y2FuY2VsUGFyc2luZygpCi17Ci0gICAgaWYgKCFtX3BhcnNlcikKLSAgICAgICAgcmV0dXJu
OwotCi0gICAgLy8gV2UgaGF2ZSB0byBjbGVhciB0aGUgcGFyc2VyIHRvIGF2b2lkIHBvc3NpYmx5
IHRyaWdnZXJpbmcKLSAgICAvLyB0aGUgb25sb2FkIGhhbmRsZXIgd2hlbiBjbG9zaW5nIGFzIGEg
c2lkZSBlZmZlY3Qgb2YgYSBjYW5jZWwtc3R5bGUKLSAgICAvLyBjaGFuZ2UsIHN1Y2ggYXMgb3Bl
bmluZyBhIG5ldyBkb2N1bWVudCBvciBjbG9zaW5nIHRoZSB3aW5kb3cgd2hpbGUKLSAgICAvLyBz
dGlsbCBwYXJzaW5nCi0gICAgZGV0YWNoUGFyc2VyKCk7Ci0gICAgZXhwbGljaXRDbG9zZSgpOwot
fQotCi12b2lkIERvY3VtZW50OjppbXBsaWNpdE9wZW4oKQotewotICAgIGNhbmNlbFBhcnNpbmco
KTsKLQotICAgIHJlbW92ZUNoaWxkcmVuKCk7Ci0KLSAgICBzZXRDb21wYXRpYmlsaXR5TW9kZShO
b1F1aXJrc01vZGUpOwotCi0gICAgbV9wYXJzZXIgPSBjcmVhdGVQYXJzZXIoKTsKLSAgICBzZXRQ
YXJzaW5nKHRydWUpOwotICAgIHNldFJlYWR5U3RhdGUoTG9hZGluZyk7Ci19Ci0KLUhUTUxFbGVt
ZW50KiBEb2N1bWVudDo6Ym9keSgpIGNvbnN0Ci17Ci0gICAgTm9kZSogZGUgPSBkb2N1bWVudEVs
ZW1lbnQoKTsKLSAgICBpZiAoIWRlKQotICAgICAgICByZXR1cm4gMDsKLSAgICAKLSAgICAvLyB0
cnkgdG8gcHJlZmVyIGEgRlJBTUVTRVQgZWxlbWVudCBvdmVyIEJPRFkKLSAgICBOb2RlKiBib2R5
ID0gMDsKLSAgICBmb3IgKE5vZGUqIGkgPSBkZS0+Zmlyc3RDaGlsZCgpOyBpOyBpID0gaS0+bmV4
dFNpYmxpbmcoKSkgewotICAgICAgICBpZiAoaS0+aGFzVGFnTmFtZShmcmFtZXNldFRhZykpCi0g
ICAgICAgICAgICByZXR1cm4gdG9IVE1MRWxlbWVudChpKTsKLSAgICAgICAgCi0gICAgICAgIGlm
IChpLT5oYXNUYWdOYW1lKGJvZHlUYWcpICYmICFib2R5KQotICAgICAgICAgICAgYm9keSA9IGk7
Ci0gICAgfQotICAgIHJldHVybiB0b0hUTUxFbGVtZW50KGJvZHkpOwotfQotCi12b2lkIERvY3Vt
ZW50OjpzZXRCb2R5KFBhc3NSZWZQdHI8SFRNTEVsZW1lbnQ+IHBycE5ld0JvZHksIEV4Y2VwdGlv
bkNvZGUmIGVjKQotewotICAgIFJlZlB0cjxIVE1MRWxlbWVudD4gbmV3Qm9keSA9IHBycE5ld0Jv
ZHk7Ci0KLSAgICBpZiAoIW5ld0JvZHkgfHwgIWRvY3VtZW50RWxlbWVudCgpIHx8ICFuZXdCb2R5
LT5oYXNUYWdOYW1lKGJvZHlUYWcpKSB7IAotICAgICAgICBlYyA9IEhJRVJBUkNIWV9SRVFVRVNU
X0VSUjsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChuZXdCb2R5LT5kb2N1bWVu
dCgpICYmIG5ld0JvZHktPmRvY3VtZW50KCkgIT0gdGhpcykgewotICAgICAgICBlYyA9IDA7Ci0g
ICAgICAgIFJlZlB0cjxOb2RlPiBub2RlID0gaW1wb3J0Tm9kZShuZXdCb2R5LmdldCgpLCB0cnVl
LCBlYyk7Ci0gICAgICAgIGlmIChlYykKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgCi0g
ICAgICAgIG5ld0JvZHkgPSB0b0hUTUxFbGVtZW50KG5vZGUuZ2V0KCkpOwotICAgIH0KLQotICAg
IEhUTUxFbGVtZW50KiBiID0gYm9keSgpOwotICAgIGlmICghYikKLSAgICAgICAgZG9jdW1lbnRF
bGVtZW50KCktPmFwcGVuZENoaWxkKG5ld0JvZHkucmVsZWFzZSgpLCBlYyk7Ci0gICAgZWxzZQot
ICAgICAgICBkb2N1bWVudEVsZW1lbnQoKS0+cmVwbGFjZUNoaWxkKG5ld0JvZHkucmVsZWFzZSgp
LCBiLCBlYyk7Ci19Ci0KLUhUTUxIZWFkRWxlbWVudCogRG9jdW1lbnQ6OmhlYWQoKQotewotICAg
IE5vZGUqIGRlID0gZG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgaWYgKCFkZSkKLSAgICAgICAgcmV0
dXJuIDA7Ci0KLSAgICBmb3IgKE5vZGUqIGUgPSBkZS0+Zmlyc3RDaGlsZCgpOyBlOyBlID0gZS0+
bmV4dFNpYmxpbmcoKSkKLSAgICAgICAgaWYgKGUtPmhhc1RhZ05hbWUoaGVhZFRhZykpCi0gICAg
ICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SFRNTEhlYWRFbGVtZW50Kj4oZSk7Ci0KLSAgICBy
ZXR1cm4gMDsKLX0KLQotdm9pZCBEb2N1bWVudDo6Y2xvc2UoKQotewotICAgIC8vIEZJWE1FOiBX
ZSBzaG91bGQgZm9sbG93IHRoZSBzcGVjaWZpY2F0aW9uIG1vcmUgY2xvc2VseToKLSAgICAvLyAg
ICAgICAgaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay8j
ZG9tLWRvY3VtZW50LWNsb3NlCi0KLSAgICBpZiAoIXNjcmlwdGFibGVEb2N1bWVudFBhcnNlcigp
IHx8ICFzY3JpcHRhYmxlRG9jdW1lbnRQYXJzZXIoKS0+d2FzQ3JlYXRlZEJ5U2NyaXB0KCkgfHwg
IXNjcmlwdGFibGVEb2N1bWVudFBhcnNlcigpLT5pc1BhcnNpbmcoKSkKLSAgICAgICAgcmV0dXJu
OwotCi0gICAgZXhwbGljaXRDbG9zZSgpOwotfQotCi12b2lkIERvY3VtZW50OjpleHBsaWNpdENs
b3NlKCkKLXsKLSAgICBpZiAobV9wYXJzZXIpCi0gICAgICAgIG1fcGFyc2VyLT5maW5pc2goKTsK
LQotICAgIGlmICghbV9mcmFtZSkgewotICAgICAgICAvLyBCZWNhdXNlIHdlIGhhdmUgbm8gZnJh
bWUsIHdlIGRvbid0IGtub3cgaWYgYWxsIGxvYWRpbmcgaGFzIGNvbXBsZXRlZCwKLSAgICAgICAg
Ly8gc28gd2UganVzdCBjYWxsIGltcGxpY2l0Q2xvc2UoKSBpbW1lZGlhdGVseS4gRklYTUU6IFRo
aXMgbWlnaHQgZmlyZQotICAgICAgICAvLyB0aGUgbG9hZCBldmVudCBwcmVtYXR1cmVseSA8aHR0
cDovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQ1Njg+LgotICAgICAgICBpbXBs
aWNpdENsb3NlKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtX2ZyYW1lLT5sb2Fk
ZXIoKS0+Y2hlY2tDb21wbGV0ZWQoKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6aW1wbGljaXRDbG9z
ZSgpCi17Ci0gICAgLy8gSWYgd2UncmUgaW4gdGhlIG1pZGRsZSBvZiByZWNhbGNTdHlsZSwgd2Ug
bmVlZCB0byBkZWZlciB0aGUgY2xvc2UgdW50aWwgdGhlIHN0eWxlIGluZm9ybWF0aW9uIGlzIGFj
Y3VyYXRlIGFuZCBhbGwgZWxlbWVudHMgYXJlIHJlLWF0dGFjaGVkLgotICAgIGlmIChtX2luU3R5
bGVSZWNhbGMpIHsKLSAgICAgICAgbV9jbG9zZUFmdGVyU3R5bGVSZWNhbGMgPSB0cnVlOwotICAg
ICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYm9vbCB3YXNMb2NhdGlvbkNoYW5nZVBlbmRpbmcg
PSBmcmFtZSgpICYmIGZyYW1lKCktPm5hdmlnYXRpb25TY2hlZHVsZXIoKS0+bG9jYXRpb25DaGFu
Z2VQZW5kaW5nKCk7Ci0gICAgYm9vbCBkb2xvYWQgPSAhcGFyc2luZygpICYmIG1fcGFyc2VyICYm
ICFtX3Byb2Nlc3NpbmdMb2FkRXZlbnQgJiYgIXdhc0xvY2F0aW9uQ2hhbmdlUGVuZGluZzsKLSAg
ICAKLSAgICBpZiAoIWRvbG9hZCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9wcm9jZXNzaW5n
TG9hZEV2ZW50ID0gdHJ1ZTsKLQotICAgIFNjcmlwdGFibGVEb2N1bWVudFBhcnNlciogcGFyc2Vy
ID0gc2NyaXB0YWJsZURvY3VtZW50UGFyc2VyKCk7Ci0gICAgbV93ZWxsRm9ybWVkID0gcGFyc2Vy
ICYmIHBhcnNlci0+d2VsbEZvcm1lZCgpOwotCi0gICAgLy8gV2UgaGF2ZSB0byBjbGVhciB0aGUg
cGFyc2VyLCBpbiBjYXNlIHNvbWVvbmUgZG9jdW1lbnQud3JpdGUoKXMgZnJvbSB0aGUKLSAgICAv
LyBvbkxvYWQgZXZlbnQgaGFuZGxlciwgYXMgaW4gUmFkYXIgMzIwNjUyNC4KLSAgICBkZXRhY2hQ
YXJzZXIoKTsKLQotICAgIC8vIFBhcnNlciBzaG91bGQgaGF2ZSBwaWNrZWQgdXAgYWxsIHByZWxv
YWRzIGJ5IG5vdwotICAgIG1fY2FjaGVkUmVzb3VyY2VMb2FkZXItPmNsZWFyUHJlbG9hZHMoKTsK
LQotICAgIC8vIEZJWE1FOiBXZSBraWNrIG9mZiB0aGUgaWNvbiBsb2FkZXIgd2hlbiB0aGUgRG9j
dW1lbnQgaXMgZG9uZSBwYXJzaW5nLgotICAgIC8vIFRoZXJlIGFyZSBlYXJsaWVyIG9wcG9ydHVu
aXRpZXMgd2UgY291bGQgc3RhcnQgaXQ6Ci0gICAgLy8gIC1XaGVuIHRoZSA8aGVhZD4gZmluaXNo
ZXMgcGFyc2luZwotICAgIC8vICAtV2hlbiBhbnkgbmV3IEhUTUxMaW5rRWxlbWVudCBpcyBpbnNl
cnRlZCBpbnRvIHRoZSBkb2N1bWVudAotICAgIC8vIEJ1dCB0aG9zZSBhZGQgYSBkeW5hbWljIGNv
bXBvbmVudCB0byB0aGUgZmF2aWNvbiB0aGF0IGhhcyBVSSAKLSAgICAvLyByYW1pZmljYXRpb25z
LCBhbmQgd2UgbmVlZCB0byBkZWNpZGUgd2hhdCBpcyB0aGUgUmlnaHQgVGhpbmcgVG8gRG8odG0p
Ci0gICAgRnJhbWUqIGYgPSBmcmFtZSgpOwotICAgIGlmIChmKSB7Ci0gICAgICAgIGYtPmxvYWRl
cigpLT5pY29uKCktPnN0YXJ0TG9hZGVyKCk7Ci0gICAgICAgIGYtPmFuaW1hdGlvbigpLT5yZXN1
bWVBbmltYXRpb25zRm9yRG9jdW1lbnQodGhpcyk7Ci0gICAgfQotCi0gICAgSW1hZ2VMb2FkZXI6
OmRpc3BhdGNoUGVuZGluZ0JlZm9yZUxvYWRFdmVudHMoKTsKLSAgICBJbWFnZUxvYWRlcjo6ZGlz
cGF0Y2hQZW5kaW5nTG9hZEV2ZW50cygpOwotICAgIEltYWdlTG9hZGVyOjpkaXNwYXRjaFBlbmRp
bmdFcnJvckV2ZW50cygpOwotCi0gICAgSFRNTExpbmtFbGVtZW50OjpkaXNwYXRjaFBlbmRpbmdM
b2FkRXZlbnRzKCk7Ci0gICAgSFRNTFN0eWxlRWxlbWVudDo6ZGlzcGF0Y2hQZW5kaW5nTG9hZEV2
ZW50cygpOwotCi0jaWYgRU5BQkxFKFNWRykKLSAgICAvLyBUbyBhbGlnbiB0aGUgSFRNTCBsb2Fk
IGV2ZW50IGFuZCB0aGUgU1ZHTG9hZCBldmVudCBmb3IgdGhlIG91dGVybW9zdCA8c3ZnPiBlbGVt
ZW50LCBmaXJlIGl0IGZyb20KLSAgICAvLyBoZXJlLCBpbnN0ZWFkIG9mIGRvaW5nIGl0IGZyb20g
U1ZHRWxlbWVudDo6ZmluaXNoZWRQYXJzaW5nQ2hpbGRyZW4gKGlmIGV4dGVybmFsUmVzb3VyY2Vz
UmVxdWlyZWQ9ImZhbHNlIiwKLSAgICAvLyB3aGljaCBpcyB0aGUgZGVmYXVsdCwgZm9yID0ndHJ1
ZScgaXRzIGZpcmVkIGF0IGEgbGF0ZXIgdGltZSwgb25jZSBhbGwgZXh0ZXJuYWwgcmVzb3VyY2Vz
IGZpbmlzaGVkIGxvYWRpbmcpLgotICAgIGlmIChzdmdFeHRlbnNpb25zKCkpCi0gICAgICAgIGFj
Y2Vzc1NWR0V4dGVuc2lvbnMoKS0+ZGlzcGF0Y2hTVkdMb2FkRXZlbnRUb091dGVybW9zdFNWR0Vs
ZW1lbnRzKCk7Ci0jZW5kaWYKLQotICAgIGRpc3BhdGNoV2luZG93TG9hZEV2ZW50KCk7Ci0gICAg
ZW5xdWV1ZVBhZ2VzaG93RXZlbnQoUGFnZXNob3dFdmVudE5vdFBlcnNpc3RlZCk7Ci0gICAgZW5x
dWV1ZVBvcHN0YXRlRXZlbnQobV9wZW5kaW5nU3RhdGVPYmplY3QgPyBtX3BlbmRpbmdTdGF0ZU9i
amVjdC5yZWxlYXNlKCkgOiBTZXJpYWxpemVkU2NyaXB0VmFsdWU6Om51bGxWYWx1ZSgpKTsKLSAg
ICAKLSAgICBpZiAoZikKLSAgICAgICAgZi0+bG9hZGVyKCktPmhhbmRsZWRPbmxvYWRFdmVudHMo
KTsKLSNpZmRlZiBJTlNUUlVNRU5UX0xBWU9VVF9TQ0hFRFVMSU5HCi0gICAgaWYgKCFvd25lckVs
ZW1lbnQoKSkKLSAgICAgICAgcHJpbnRmKCJvbmxvYWQgZmlyZWQgYXQgJWRcbiIsIGVsYXBzZWRU
aW1lKCkpOwotI2VuZGlmCi0KLSAgICAvLyBBbiBldmVudCBoYW5kbGVyIG1heSBoYXZlIHJlbW92
ZWQgdGhlIGZyYW1lCi0gICAgaWYgKCFmcmFtZSgpKSB7Ci0gICAgICAgIG1fcHJvY2Vzc2luZ0xv
YWRFdmVudCA9IGZhbHNlOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gTWFrZSBz
dXJlIGJvdGggdGhlIGluaXRpYWwgbGF5b3V0IGFuZCByZWZsb3cgaGFwcGVuIGFmdGVyIHRoZSBv
bmxvYWQKLSAgICAvLyBmaXJlcy4gVGhpcyB3aWxsIGltcHJvdmUgb25sb2FkIHNjb3JlcywgYW5k
IG90aGVyIGJyb3dzZXJzIGRvIGl0LgotICAgIC8vIElmIHRoZXkgd2FubmEgY2hlYXQsIHdlIGNh
biB0b28uIC1kd2gKLQotICAgIGlmIChmcmFtZSgpLT5uYXZpZ2F0aW9uU2NoZWR1bGVyKCktPmxv
Y2F0aW9uQ2hhbmdlUGVuZGluZygpICYmIGVsYXBzZWRUaW1lKCkgPCBjTGF5b3V0U2NoZWR1bGVU
aHJlc2hvbGQpIHsKLSAgICAgICAgLy8gSnVzdCBiYWlsIG91dC4gQmVmb3JlIG9yIGR1cmluZyB0
aGUgb25sb2FkIHdlIHdlcmUgc2hpZnRlZCB0byBhbm90aGVyIHBhZ2UuCi0gICAgICAgIC8vIFRo
ZSBvbGQgaS1CZW5jaCBzdWl0ZSBkb2VzIHRoaXMuIFdoZW4gdGhpcyBoYXBwZW5zIGRvbid0IGJv
dGhlciBwYWludGluZyBvciBsYXlpbmcgb3V0LiAgICAgICAgCi0gICAgICAgIG1fcHJvY2Vzc2lu
Z0xvYWRFdmVudCA9IGZhbHNlOwotICAgICAgICB2aWV3KCktPnVuc2NoZWR1bGVSZWxheW91dCgp
OwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZnJhbWUoKS0+bG9hZGVyKCktPmNoZWNr
Q2FsbEltcGxpY2l0Q2xvc2UoKTsKLSAgICBSZW5kZXJPYmplY3QqIHJlbmRlck9iamVjdCA9IHJl
bmRlcmVyKCk7Ci0gICAgCi0gICAgLy8gV2UgdXNlZCB0byBmb3JjZSBhIHN5bmNocm9ub3VzIGRp
c3BsYXkgYW5kIGZsdXNoIGhlcmUuICBUaGlzIHJlYWxseSBpc24ndAotICAgIC8vIG5lY2Vzc2Fy
eSBhbmQgY2FuIGluIGZhY3QgYmUgYWN0aXZlbHkgaGFybWZ1bCBpZiBwYWdlcyBhcmUgbG9hZGlu
ZyBhdCBhIHJhdGUgb2YgPiA2MGZwcwotICAgIC8vIChpZiB5b3VyIHBsYXRmb3JtIGlzIHN5bmNp
bmcgZmx1c2hlcyBhbmQgbGltaXRpbmcgdGhlbSB0byA2MGZwcykuCi0gICAgbV9vdmVyTWluaW11
bUxheW91dFRocmVzaG9sZCA9IHRydWU7Ci0gICAgaWYgKCFvd25lckVsZW1lbnQoKSB8fCAob3du
ZXJFbGVtZW50KCktPnJlbmRlcmVyKCkgJiYgIW93bmVyRWxlbWVudCgpLT5yZW5kZXJlcigpLT5u
ZWVkc0xheW91dCgpKSkgewotICAgICAgICB1cGRhdGVTdHlsZUlmTmVlZGVkKCk7Ci0gICAgICAg
IAotICAgICAgICAvLyBBbHdheXMgZG8gYSBsYXlvdXQgYWZ0ZXIgbG9hZGluZyBpZiBuZWVkZWQu
Ci0gICAgICAgIGlmICh2aWV3KCkgJiYgcmVuZGVyT2JqZWN0ICYmICghcmVuZGVyT2JqZWN0LT5m
aXJzdENoaWxkKCkgfHwgcmVuZGVyT2JqZWN0LT5uZWVkc0xheW91dCgpKSkKLSAgICAgICAgICAg
IHZpZXcoKS0+bGF5b3V0KCk7Ci0gICAgfQotCi0gICAgbV9wcm9jZXNzaW5nTG9hZEV2ZW50ID0g
ZmFsc2U7Ci0KLSNpZiBQTEFURk9STShNQUMpIHx8IFBMQVRGT1JNKENIUk9NSVVNKQotICAgIGlm
IChmICYmIHJlbmRlck9iamVjdCAmJiBBWE9iamVjdENhY2hlOjphY2Nlc3NpYmlsaXR5RW5hYmxl
ZCgpKSB7Ci0gICAgICAgIC8vIFRoZSBBWCBjYWNoZSBtYXkgaGF2ZSBiZWVuIGNsZWFyZWQgYXQg
dGhpcyBwb2ludCwgYnV0IHdlIG5lZWQgdG8gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGFuCi0gICAg
ICAgIC8vIEFYIG9iamVjdCB0byBzZW5kIHRoZSBub3RpZmljYXRpb24gdG8uIGdldE9yQ3JlYXRl
IHdpbGwgbWFrZSBzdXJlIHRoYXQgYW4gdmFsaWQgQVggb2JqZWN0Ci0gICAgICAgIC8vIGV4aXN0
cyBpbiB0aGUgY2FjaGUgKHdlIGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlIGJlY2F1c2Ugd2UgZG9u
J3QgbmVlZCBpdCBoZXJlKS4gVGhpcyBpcyAKLSAgICAgICAgLy8gb25seSBzYWZlIHRvIGNhbGwg
d2hlbiBhIGxheW91dCBpcyBub3QgaW4gcHJvZ3Jlc3MsIHNvIGl0IGNhbiBub3QgYmUgdXNlZCBp
biBwb3N0Tm90aWZpY2F0aW9uLiAgICAKLSAgICAgICAgYXhPYmplY3RDYWNoZSgpLT5nZXRPckNy
ZWF0ZShyZW5kZXJPYmplY3QpOwotICAgICAgICBpZiAodGhpcyA9PSB0b3BEb2N1bWVudCgpKQot
ICAgICAgICAgICAgYXhPYmplY3RDYWNoZSgpLT5wb3N0Tm90aWZpY2F0aW9uKHJlbmRlck9iamVj
dCwgQVhPYmplY3RDYWNoZTo6QVhMb2FkQ29tcGxldGUsIHRydWUpOwotICAgICAgICBlbHNlIHsK
LSAgICAgICAgICAgIC8vIEFYTG9hZENvbXBsZXRlIGNhbiBvbmx5IGJlIHBvc3RlZCBvbiB0aGUg
dG9wIGRvY3VtZW50LCBzbyBpZiBpdCdzIGEgZG9jdW1lbnQKLSAgICAgICAgICAgIC8vIGluIGFu
IGlmcmFtZSB0aGF0IGp1c3QgZmluaXNoZWQgbG9hZGluZywgcG9zdCBBWExheW91dENvbXBsZXRl
IGluc3RlYWQuCi0gICAgICAgICAgICBheE9iamVjdENhY2hlKCktPnBvc3ROb3RpZmljYXRpb24o
cmVuZGVyT2JqZWN0LCBBWE9iamVjdENhY2hlOjpBWExheW91dENvbXBsZXRlLCB0cnVlKTsKLSAg
ICAgICAgfQotICAgIH0KLSNlbmRpZgotCi0jaWYgRU5BQkxFKFNWRykKLSAgICBpZiAoc3ZnRXh0
ZW5zaW9ucygpKQotICAgICAgICBhY2Nlc3NTVkdFeHRlbnNpb25zKCktPnN0YXJ0QW5pbWF0aW9u
cygpOwotI2VuZGlmCi19Ci0KLXZvaWQgRG9jdW1lbnQ6OnNldFBhcnNpbmcoYm9vbCBiKQotewot
ICAgIG1fYlBhcnNpbmcgPSBiOwotICAgIGlmICghbV9iUGFyc2luZyAmJiB2aWV3KCkpCi0gICAg
ICAgIHZpZXcoKS0+c2NoZWR1bGVSZWxheW91dCgpOwotCi0jaWZkZWYgSU5TVFJVTUVOVF9MQVlP
VVRfU0NIRURVTElORwotICAgIGlmICghb3duZXJFbGVtZW50KCkgJiYgIW1fYlBhcnNpbmcpCi0g
ICAgICAgIHByaW50ZigiUGFyc2luZyBmaW5pc2hlZCBhdCAlZFxuIiwgZWxhcHNlZFRpbWUoKSk7
Ci0jZW5kaWYKLX0KLQotYm9vbCBEb2N1bWVudDo6c2hvdWxkU2NoZWR1bGVMYXlvdXQoKQotewot
ICAgIC8vIFRoaXMgZnVuY3Rpb24gd2lsbCBvbmx5IGJlIGNhbGxlZCB3aGVuIEZyYW1lVmlldyB0
aGlua3MgYSBsYXlvdXQgaXMgbmVlZGVkLgotICAgIC8vIFRoaXMgZW5mb3JjZXMgYSBjb3VwbGUg
ZXh0cmEgcnVsZXMuCi0gICAgLy8KLSAgICAvLyAgICAoYSkgT25seSBzY2hlZHVsZSBhIGxheW91
dCBvbmNlIHRoZSBzdHlsZXNoZWV0cyBhcmUgbG9hZGVkLgotICAgIC8vICAgIChiKSBPbmx5IHNj
aGVkdWxlIGxheW91dCBvbmNlIHdlIGhhdmUgYSBib2R5IGVsZW1lbnQuCi0KLSAgICByZXR1cm4g
KGhhdmVTdHlsZXNoZWV0c0xvYWRlZCgpICYmIGJvZHkoKSkKLSAgICAgICAgfHwgKGRvY3VtZW50
RWxlbWVudCgpICYmICFkb2N1bWVudEVsZW1lbnQoKS0+aGFzVGFnTmFtZShodG1sVGFnKSk7Ci19
Ci0gICAgCi1ib29sIERvY3VtZW50Ojppc0xheW91dFRpbWVyQWN0aXZlKCkKLXsKLSAgICByZXR1
cm4gdmlldygpICYmIHZpZXcoKS0+bGF5b3V0UGVuZGluZygpICYmICFtaW5pbXVtTGF5b3V0RGVs
YXkoKTsKLX0KLQotaW50IERvY3VtZW50OjptaW5pbXVtTGF5b3V0RGVsYXkoKQotewotICAgIGlm
IChtX292ZXJNaW5pbXVtTGF5b3V0VGhyZXNob2xkKQotICAgICAgICByZXR1cm4gMDsKLSAgICAK
LSAgICBpbnQgZWxhcHNlZCA9IGVsYXBzZWRUaW1lKCk7Ci0gICAgbV9vdmVyTWluaW11bUxheW91
dFRocmVzaG9sZCA9IGVsYXBzZWQgPiBjTGF5b3V0U2NoZWR1bGVUaHJlc2hvbGQ7Ci0gICAgCi0g
ICAgLy8gV2UnbGwgd2FudCB0byBzY2hlZHVsZSB0aGUgdGltZXIgdG8gZmlyZSBhdCB0aGUgbWlu
aW11bSBsYXlvdXQgdGhyZXNob2xkLgotICAgIHJldHVybiBtYXgoMCwgY0xheW91dFNjaGVkdWxl
VGhyZXNob2xkIC0gZWxhcHNlZCk7Ci19Ci0KLWludCBEb2N1bWVudDo6ZWxhcHNlZFRpbWUoKSBj
b25zdAotewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KChjdXJyZW50VGltZSgpIC0gbV9z
dGFydFRpbWUpICogMTAwMCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OndyaXRlKGNvbnN0IFNlZ21l
bnRlZFN0cmluZyYgdGV4dCwgRG9jdW1lbnQqIG93bmVyRG9jdW1lbnQpCi17Ci0gICAgTmVzdGlu
Z0xldmVsSW5jcmVtZW50ZXIgbmVzdGluZ0xldmVsSW5jcmVtZW50ZXIobV93cml0ZVJlY3Vyc2lv
bkRlcHRoKTsKLQotICAgIG1fd3JpdGVSZWN1cnNpb25Jc1Rvb0RlZXAgPSAobV93cml0ZVJlY3Vy
c2lvbkRlcHRoID4gMSkgJiYgbV93cml0ZVJlY3Vyc2lvbklzVG9vRGVlcDsKLSAgICBtX3dyaXRl
UmVjdXJzaW9uSXNUb29EZWVwID0gKG1fd3JpdGVSZWN1cnNpb25EZXB0aCA+IGNNYXhXcml0ZVJl
Y3Vyc2lvbkRlcHRoKSB8fCBtX3dyaXRlUmVjdXJzaW9uSXNUb29EZWVwOwotCi0gICAgaWYgKG1f
d3JpdGVSZWN1cnNpb25Jc1Rvb0RlZXApCi0gICAgICAgcmV0dXJuOwotCi0jaWZkZWYgSU5TVFJV
TUVOVF9MQVlPVVRfU0NIRURVTElORwotICAgIGlmICghb3duZXJFbGVtZW50KCkpCi0gICAgICAg
IHByaW50ZigiQmVnaW5uaW5nIGEgZG9jdW1lbnQud3JpdGUgYXQgJWRcbiIsIGVsYXBzZWRUaW1l
KCkpOwotI2VuZGlmCi0KLSAgICBib29sIGhhc0luc2VydGlvblBvaW50ID0gbV9wYXJzZXIgJiYg
bV9wYXJzZXItPmhhc0luc2VydGlvblBvaW50KCk7Ci0gICAgaWYgKCFoYXNJbnNlcnRpb25Qb2lu
dCAmJiBtX2lnbm9yZURlc3RydWN0aXZlV3JpdGVDb3VudCkKLSAgICAgICAgcmV0dXJuOwotCi0g
ICAgaWYgKCFoYXNJbnNlcnRpb25Qb2ludCkKLSAgICAgICAgb3Blbihvd25lckRvY3VtZW50KTsK
LQotICAgIEFTU0VSVChtX3BhcnNlcik7Ci0gICAgbV9wYXJzZXItPmluc2VydCh0ZXh0KTsKLQot
I2lmZGVmIElOU1RSVU1FTlRfTEFZT1VUX1NDSEVEVUxJTkcKLSAgICBpZiAoIW93bmVyRWxlbWVu
dCgpKQotICAgICAgICBwcmludGYoIkVuZGluZyBhIGRvY3VtZW50LndyaXRlIGF0ICVkXG4iLCBl
bGFwc2VkVGltZSgpKTsKLSNlbmRpZiAgICAKLX0KLQotdm9pZCBEb2N1bWVudDo6d3JpdGUoY29u
c3QgU3RyaW5nJiB0ZXh0LCBEb2N1bWVudCogb3duZXJEb2N1bWVudCkKLXsKLSAgICB3cml0ZShT
ZWdtZW50ZWRTdHJpbmcodGV4dCksIG93bmVyRG9jdW1lbnQpOwotfQotCi12b2lkIERvY3VtZW50
Ojp3cml0ZWxuKGNvbnN0IFN0cmluZyYgdGV4dCwgRG9jdW1lbnQqIG93bmVyRG9jdW1lbnQpCi17
Ci0gICAgd3JpdGUodGV4dCwgb3duZXJEb2N1bWVudCk7Ci0gICAgd3JpdGUoIlxuIiwgb3duZXJE
b2N1bWVudCk7Ci19Ci0KLWNvbnN0IEtVUkwmIERvY3VtZW50Ojp2aXJ0dWFsVVJMKCkgY29uc3QK
LXsKLSAgICByZXR1cm4gbV91cmw7Ci19Ci0KLUtVUkwgRG9jdW1lbnQ6OnZpcnR1YWxDb21wbGV0
ZVVSTChjb25zdCBTdHJpbmcmIHVybCkgY29uc3QKLXsKLSAgICByZXR1cm4gY29tcGxldGVVUkwo
dXJsKTsKLX0KLQotZG91YmxlIERvY3VtZW50OjptaW5pbXVtVGltZXJJbnRlcnZhbCgpIGNvbnN0
Ci17Ci0gICAgUGFnZSogcCA9IHBhZ2UoKTsKLSAgICBpZiAoIXApCi0gICAgICAgIHJldHVybiBT
Y3JpcHRFeGVjdXRpb25Db250ZXh0OjptaW5pbXVtVGltZXJJbnRlcnZhbCgpOwotICAgIHJldHVy
biBwLT5zZXR0aW5ncygpLT5taW5ET01UaW1lckludGVydmFsKCk7Ci19Ci0KLUV2ZW50VGFyZ2V0
KiBEb2N1bWVudDo6ZXJyb3JFdmVudFRhcmdldCgpCi17Ci0gICAgcmV0dXJuIGRvbVdpbmRvdygp
OwotfQotCi12b2lkIERvY3VtZW50Ojpsb2dFeGNlcHRpb25Ub0NvbnNvbGUoY29uc3QgU3RyaW5n
JiBlcnJvck1lc3NhZ2UsIGNvbnN0IFN0cmluZyYgc291cmNlVVJMLCBpbnQgbGluZU51bWJlciwg
UGFzc1JlZlB0cjxTY3JpcHRDYWxsU3RhY2s+IGNhbGxTdGFjaykKLXsKLSAgICBhZGRDb25zb2xl
TWVzc2FnZShKU01lc3NhZ2VTb3VyY2UsIExvZ01lc3NhZ2VUeXBlLCBFcnJvck1lc3NhZ2VMZXZl
bCwgZXJyb3JNZXNzYWdlLCBzb3VyY2VVUkwsIGxpbmVOdW1iZXIsIGNhbGxTdGFjayk7Ci19Ci0K
LXZvaWQgRG9jdW1lbnQ6OnNldFVSTChjb25zdCBLVVJMJiB1cmwpCi17Ci0gICAgY29uc3QgS1VS
TCYgbmV3VVJMID0gdXJsLmlzRW1wdHkoKSA/IGJsYW5rVVJMKCkgOiB1cmw7Ci0gICAgaWYgKG5l
d1VSTCA9PSBtX3VybCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV91cmwgPSBuZXdVUkw7Ci0g
ICAgbV9kb2N1bWVudFVSSSA9IG1fdXJsLnN0cmluZygpOwotICAgIHVwZGF0ZUJhc2VVUkwoKTsK
LSAgICBjb250ZXh0RmVhdHVyZXMoKS0+dXJsRGlkQ2hhbmdlKHRoaXMpOwotfQotCi12b2lkIERv
Y3VtZW50Ojp1cGRhdGVCYXNlVVJMKCkKLXsKLSAgICBLVVJMIG9sZEJhc2VVUkwgPSBtX2Jhc2VV
Ukw7Ci0gICAgLy8gRE9NIDMgQ29yZTogV2hlbiB0aGUgRG9jdW1lbnQgc3VwcG9ydHMgdGhlIGZl
YXR1cmUgIkhUTUwiIFtET00gTGV2ZWwgMiBIVE1MXSwgdGhlIGJhc2UgVVJJIGlzIGNvbXB1dGVk
IHVzaW5nCi0gICAgLy8gZmlyc3QgdGhlIHZhbHVlIG9mIHRoZSBocmVmIGF0dHJpYnV0ZSBvZiB0
aGUgSFRNTCBCQVNFIGVsZW1lbnQgaWYgYW55LCBhbmQgdGhlIHZhbHVlIG9mIHRoZSBkb2N1bWVu
dFVSSSBhdHRyaWJ1dGUKLSAgICAvLyBmcm9tIHRoZSBEb2N1bWVudCBpbnRlcmZhY2Ugb3RoZXJ3
aXNlLgotICAgIGlmICghbV9iYXNlRWxlbWVudFVSTC5pc0VtcHR5KCkpCi0gICAgICAgIG1fYmFz
ZVVSTCA9IG1fYmFzZUVsZW1lbnRVUkw7Ci0gICAgZWxzZSBpZiAoIW1fYmFzZVVSTE92ZXJyaWRl
LmlzRW1wdHkoKSkKLSAgICAgICAgbV9iYXNlVVJMID0gbV9iYXNlVVJMT3ZlcnJpZGU7Ci0gICAg
ZWxzZSB7Ci0gICAgICAgIC8vIFRoZSBkb2N1bWVudFVSSSBhdHRyaWJ1dGUgaXMgcmVhZC1vbmx5
IGZyb20gSmF2YVNjcmlwdCwgYnV0IHdyaXRhYmxlIGZyb20gT2JqZWN0aXZlIEMsIHNvIHdlIG5l
ZWQgdG8gcmV0YWluCi0gICAgICAgIC8vIHRoaXMgZmFsbGJhY2sgYmVoYXZpb3IuIFdlIHVzZSBh
IG51bGwgYmFzZSBVUkwsIHNpbmNlIHRoZSBkb2N1bWVudFVSSSBhdHRyaWJ1dGUgaXMgYW4gYXJi
aXRyYXJ5IHN0cmluZwotICAgICAgICAvLyBhbmQgRE9NIDMgQ29yZSBkb2VzIG5vdCBzcGVjaWZ5
IGhvdyBpdCBzaG91bGQgYmUgcmVzb2x2ZWQuCi0gICAgICAgIG1fYmFzZVVSTCA9IEtVUkwoS1VS
TCgpLCBkb2N1bWVudFVSSSgpKTsKLSAgICB9Ci0gICAgc2VsZWN0b3JRdWVyeUNhY2hlKCktPmlu
dmFsaWRhdGUoKTsKLQotICAgIGlmICghbV9iYXNlVVJMLmlzVmFsaWQoKSkKLSAgICAgICAgbV9i
YXNlVVJMID0gS1VSTCgpOwotCi0gICAgaWYgKG1fZWxlbVNoZWV0KSB7Ci0gICAgICAgIC8vIEVs
ZW1lbnQgc2hlZXQgaXMgc2lsbHkuIEl0IG5ldmVyIGNvbnRhaW5zIGFueXRoaW5nLgotICAgICAg
ICBBU1NFUlQoIW1fZWxlbVNoZWV0LT5jb250ZW50cygpLT5ydWxlQ291bnQoKSk7Ci0gICAgICAg
IGJvb2wgdXNlc1JlbVVuaXRzID0gbV9lbGVtU2hlZXQtPmNvbnRlbnRzKCktPnVzZXNSZW1Vbml0
cygpOwotICAgICAgICBtX2VsZW1TaGVldCA9IENTU1N0eWxlU2hlZXQ6OmNyZWF0ZUlubGluZSh0
aGlzLCBtX2Jhc2VVUkwpOwotICAgICAgICAvLyBGSVhNRTogU28gd2UgYXJlIG5vdCByZWFsbHkg
dGhlIHBhcnNlci4gVGhlIHJpZ2h0IGZpeCBpcyB0byBlbGltaW5hdGUgdGhlIGVsZW1lbnQgc2hl
ZXQgY29tcGxldGVseS4KLSAgICAgICAgbV9lbGVtU2hlZXQtPmNvbnRlbnRzKCktPnBhcnNlclNl
dFVzZXNSZW1Vbml0cyh1c2VzUmVtVW5pdHMpOwotICAgIH0KLQotICAgIGlmICghZXF1YWxJZ25v
cmluZ0ZyYWdtZW50SWRlbnRpZmllcihvbGRCYXNlVVJMLCBtX2Jhc2VVUkwpKSB7Ci0gICAgICAg
IC8vIEJhc2UgVVJMIGNoYW5nZSBjaGFuZ2VzIGFueSByZWxhdGl2ZSB2aXNpdGVkIGxpbmtzLgot
ICAgICAgICAvLyBGSVhNRTogVGhlcmUgYXJlIG90aGVyIFVSTHMgaW4gdGhlIHRyZWUgdGhhdCB3
b3VsZCBuZWVkIHRvIGJlIHJlLWV2YWx1YXRlZCBvbiBkeW5hbWljIGJhc2UgVVJMIGNoYW5nZS4g
U3R5bGUgc2hvdWxkIGJlIGludmFsaWRhdGVkIHRvby4KLSAgICAgICAgZm9yIChOb2RlKiBub2Rl
ID0gZmlyc3RDaGlsZCgpOyBub2RlOyBub2RlID0gbm9kZS0+dHJhdmVyc2VOZXh0Tm9kZSgpKSB7
Ci0gICAgICAgICAgICBpZiAobm9kZS0+aGFzVGFnTmFtZShhVGFnKSkKLSAgICAgICAgICAgICAg
ICBzdGF0aWNfY2FzdDxIVE1MQW5jaG9yRWxlbWVudCo+KG5vZGUpLT5pbnZhbGlkYXRlQ2FjaGVk
VmlzaXRlZExpbmtIYXNoKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6
OnNldEJhc2VVUkxPdmVycmlkZShjb25zdCBLVVJMJiB1cmwpCi17Ci0gICAgbV9iYXNlVVJMT3Zl
cnJpZGUgPSB1cmw7Ci0gICAgdXBkYXRlQmFzZVVSTCgpOwotfQotCi12b2lkIERvY3VtZW50Ojpw
cm9jZXNzQmFzZUVsZW1lbnQoKQotewotICAgIC8vIEZpbmQgdGhlIGZpcnN0IGhyZWYgYXR0cmli
dXRlIGluIGEgYmFzZSBlbGVtZW50IGFuZCB0aGUgZmlyc3QgdGFyZ2V0IGF0dHJpYnV0ZSBpbiBh
IGJhc2UgZWxlbWVudC4KLSAgICBjb25zdCBBdG9taWNTdHJpbmcqIGhyZWYgPSAwOwotICAgIGNv
bnN0IEF0b21pY1N0cmluZyogdGFyZ2V0ID0gMDsKLSAgICBmb3IgKE5vZGUqIG5vZGUgPSBkb2N1
bWVudCgpLT5maXJzdENoaWxkKCk7IG5vZGUgJiYgKCFocmVmIHx8ICF0YXJnZXQpOyBub2RlID0g
bm9kZS0+dHJhdmVyc2VOZXh0Tm9kZSgpKSB7Ci0gICAgICAgIGlmIChub2RlLT5oYXNUYWdOYW1l
KGJhc2VUYWcpKSB7Ci0gICAgICAgICAgICBpZiAoIWhyZWYpIHsKLSAgICAgICAgICAgICAgICBj
b25zdCBBdG9taWNTdHJpbmcmIHZhbHVlID0gc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG5vZGUpLT5m
YXN0R2V0QXR0cmlidXRlKGhyZWZBdHRyKTsKLSAgICAgICAgICAgICAgICBpZiAoIXZhbHVlLmlz
TnVsbCgpKQotICAgICAgICAgICAgICAgICAgICBocmVmID0gJnZhbHVlOwotICAgICAgICAgICAg
fQotICAgICAgICAgICAgaWYgKCF0YXJnZXQpIHsKLSAgICAgICAgICAgICAgICBjb25zdCBBdG9t
aWNTdHJpbmcmIHZhbHVlID0gc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG5vZGUpLT5mYXN0R2V0QXR0
cmlidXRlKHRhcmdldEF0dHIpOwotICAgICAgICAgICAgICAgIGlmICghdmFsdWUuaXNOdWxsKCkp
Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldCA9ICZ2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAg
ICAgICAgfQotICAgIH0KLQotICAgIC8vIEZJWE1FOiBTaW5jZSB0aGlzIGRvZXNuJ3Qgc2hhcmUg
Y29kZSB3aXRoIGNvbXBsZXRlVVJMIGl0IG1heSBub3QgaGFuZGxlIGVuY29kaW5ncyBjb3JyZWN0
bHkuCi0gICAgS1VSTCBiYXNlRWxlbWVudFVSTDsKLSAgICBpZiAoaHJlZikgewotICAgICAgICBT
dHJpbmcgc3RyaXBwZWRIcmVmID0gc3RyaXBMZWFkaW5nQW5kVHJhaWxpbmdIVE1MU3BhY2VzKCpo
cmVmKTsKLSAgICAgICAgaWYgKCFzdHJpcHBlZEhyZWYuaXNFbXB0eSgpKQotICAgICAgICAgICAg
YmFzZUVsZW1lbnRVUkwgPSBLVVJMKHVybCgpLCBzdHJpcHBlZEhyZWYpOwotICAgIH0KLSAgICBp
ZiAobV9iYXNlRWxlbWVudFVSTCAhPSBiYXNlRWxlbWVudFVSTCkgewotICAgICAgICBtX2Jhc2VF
bGVtZW50VVJMID0gYmFzZUVsZW1lbnRVUkw7Ci0gICAgICAgIHVwZGF0ZUJhc2VVUkwoKTsKLSAg
ICB9Ci0KLSAgICBtX2Jhc2VUYXJnZXQgPSB0YXJnZXQgPyAqdGFyZ2V0IDogbnVsbEF0b207Ci19
Ci0KLVN0cmluZyBEb2N1bWVudDo6dXNlckFnZW50KGNvbnN0IEtVUkwmIHVybCkgY29uc3QKLXsK
LSAgICByZXR1cm4gZnJhbWUoKSA/IGZyYW1lKCktPmxvYWRlcigpLT51c2VyQWdlbnQodXJsKSA6
IFN0cmluZygpOwotfQotCi12b2lkIERvY3VtZW50OjpkaXNhYmxlRXZhbChjb25zdCBTdHJpbmcm
IGVycm9yTWVzc2FnZSkKLXsKLSAgICBpZiAoIWZyYW1lKCkpCi0gICAgICAgIHJldHVybjsKLQot
ICAgIGZyYW1lKCktPnNjcmlwdCgpLT5kaXNhYmxlRXZhbChlcnJvck1lc3NhZ2UpOwotfQotCi1i
b29sIERvY3VtZW50OjpjYW5OYXZpZ2F0ZShGcmFtZSogdGFyZ2V0RnJhbWUpCi17Ci0gICAgaWYg
KCFtX2ZyYW1lKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBGSVhNRTogV2Ugc2hv
dWxkbid0IGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRob3V0IGEgdGFyZ2V0IGZyYW1lLCBidXQKLSAg
ICAvLyBmYXN0L2Zvcm1zL3N1Ym1pdC10by1ibGFuay1tdWx0aXBsZS10aW1lcy5odG1sIGRlcGVu
ZHMgb24gdGhpcyBmdW5jdGlvbgotICAgIC8vIHJldHVybmluZyB0cnVlIHdoZW4gc3VwcGxpZWQg
d2l0aCBhIDAgdGFyZ2V0RnJhbWUuCi0gICAgaWYgKCF0YXJnZXRGcmFtZSkKLSAgICAgICAgcmV0
dXJuIHRydWU7Ci0KLSAgICAvLyBGcmFtZS1idXN0aW5nIGlzIGdlbmVyYWxseSBhbGxvd2VkICh1
bmxlc3Mgd2UncmUgc2FuZGJveGVkIGFuZCBwcmV2ZW50IGZyb20gZnJhbWUtYnVzdGluZykuCi0g
ICAgaWYgKCFpc1NhbmRib3hlZChTYW5kYm94VG9wTmF2aWdhdGlvbikgJiYgdGFyZ2V0RnJhbWUg
PT0gbV9mcmFtZS0+dHJlZSgpLT50b3AoKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBp
ZiAoaXNTYW5kYm94ZWQoU2FuZGJveE5hdmlnYXRpb24pKSB7Ci0gICAgICAgIGlmICh0YXJnZXRG
cmFtZS0+dHJlZSgpLT5pc0Rlc2NlbmRhbnRPZihtX2ZyYW1lKSkKLSAgICAgICAgICAgIHJldHVy
biB0cnVlOwotCi0gICAgICAgIHByaW50TmF2aWdhdGlvbkVycm9yTWVzc2FnZSh0YXJnZXRGcmFt
ZSwgdXJsKCkpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gVGhpcyBp
cyB0aGUgbm9ybWFsIGNhc2UuIEEgZG9jdW1lbnQgY2FuIG5hdmlnYXRlIGl0cyBkZWNlbmRhbnQg
ZnJhbWVzLAotICAgIC8vIG9yLCBtb3JlIGdlbmVyYWxseSwgYSBkb2N1bWVudCBjYW4gbmF2aWdh
dGUgYSBmcmFtZSBpZiB0aGUgZG9jdW1lbnQgaXMKLSAgICAvLyBpbiB0aGUgc2FtZSBvcmlnaW4g
YXMgYW55IG9mIHRoYXQgZnJhbWUncyBhbmNlc3RvcnMgKGluIHRoZSBmcmFtZQotICAgIC8vIGhp
ZXJhcmNoeSkuCi0gICAgLy8KLSAgICAvLyBTZWUgaHR0cDovL3d3dy5hZGFtYmFydGguY29tL3Bh
cGVycy8yMDA4L2JhcnRoLWphY2tzb24tbWl0Y2hlbGwucGRmIGZvcgotICAgIC8vIGhpc3Rvcmlj
YWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBzZWN1cml0eSBjaGVjay4KLSAgICBpZiAoY2FuQWNj
ZXNzQW5jZXN0b3Ioc2VjdXJpdHlPcmlnaW4oKSwgdGFyZ2V0RnJhbWUpKQotICAgICAgICByZXR1
cm4gdHJ1ZTsKLQotICAgIC8vIFRvcC1sZXZlbCBmcmFtZXMgYXJlIGVhc2llciB0byBuYXZpZ2F0
ZSB0aGFuIG90aGVyIGZyYW1lcyBiZWNhdXNlIHRoZXkKLSAgICAvLyBkaXNwbGF5IHRoZWlyIFVS
THMgaW4gdGhlIGFkZHJlc3MgYmFyIChpbiBtb3N0IGJyb3dzZXJzKS4gSG93ZXZlciwgdGhlcmUK
LSAgICAvLyBhcmUgc3RpbGwgc29tZSByZXN0cmljdGlvbnMgb24gbmF2aWdhdGlvbiB0byBhdm9p
ZCBudWlzYW5jZSBhdHRhY2tzLgotICAgIC8vIFNwZWNpZmljYWxseSwgYSBkb2N1bWVudCBjYW4g
bmF2aWdhdGUgYSB0b3AtbGV2ZWwgZnJhbWUgaWYgdGhhdCBmcmFtZQotICAgIC8vIG9wZW5lZCB0
aGUgZG9jdW1lbnQgb3IgaWYgdGhlIGRvY3VtZW50IGlzIHRoZSBzYW1lLW9yaWdpbiB3aXRoIGFu
eSBvZgotICAgIC8vIHRoZSB0b3AtbGV2ZWwgZnJhbWUncyBvcGVuZXIncyBhbmNlc3RvcnMgKGlu
IHRoZSBmcmFtZSBoaWVyYXJjaHkpLgotICAgIC8vCi0gICAgLy8gSW4gYm90aCBvZiB0aGVzZSBj
YXNlcywgdGhlIGRvY3VtZW50IHBlcmZvcm1pbmcgdGhlIG5hdmlnYXRpb24gaXMgaW4KLSAgICAv
LyBzb21lIHdheSByZWxhdGVkIHRvIHRoZSBmcmFtZSBiZWluZyBuYXZpZ2F0ZSAoZS5nLiwgYnkg
dGhlICJvcGVuZXIiCi0gICAgLy8gYW5kL29yICJwYXJlbnQiIHJlbGF0aW9uKS4gUmVxdWlyaW5n
IHNvbWUgc29ydCBvZiByZWxhdGlvbiBwcmV2ZW50cyBhCi0gICAgLy8gZG9jdW1lbnQgZnJvbSBu
YXZpZ2F0aW5nIGFyYml0cmFyeSwgdW5yZWxhdGVkIHRvcC1sZXZlbCBmcmFtZXMuCi0gICAgaWYg
KCF0YXJnZXRGcmFtZS0+dHJlZSgpLT5wYXJlbnQoKSkgewotICAgICAgICBpZiAodGFyZ2V0RnJh
bWUgPT0gbV9mcmFtZS0+bG9hZGVyKCktPm9wZW5lcigpKQotICAgICAgICAgICAgcmV0dXJuIHRy
dWU7Ci0KLSAgICAgICAgaWYgKGNhbkFjY2Vzc0FuY2VzdG9yKHNlY3VyaXR5T3JpZ2luKCksIHRh
cmdldEZyYW1lLT5sb2FkZXIoKS0+b3BlbmVyKCkpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7
Ci0gICAgfQotCi0gICAgcHJpbnROYXZpZ2F0aW9uRXJyb3JNZXNzYWdlKHRhcmdldEZyYW1lLCB1
cmwoKSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1GcmFtZSogRG9jdW1lbnQ6OmZpbmRVbnNh
ZmVQYXJlbnRTY3JvbGxQcm9wYWdhdGlvbkJvdW5kYXJ5KCkKLXsKLSAgICBGcmFtZSogY3VycmVu
dEZyYW1lID0gbV9mcmFtZTsKLSAgICBGcmFtZSogYW5jZXN0b3JGcmFtZSA9IGN1cnJlbnRGcmFt
ZS0+dHJlZSgpLT5wYXJlbnQoKTsgCi0KLSAgICB3aGlsZSAoYW5jZXN0b3JGcmFtZSkgewotICAg
ICAgICBpZiAoIWFuY2VzdG9yRnJhbWUtPmRvY3VtZW50KCktPnNlY3VyaXR5T3JpZ2luKCktPmNh
bkFjY2VzcyhzZWN1cml0eU9yaWdpbigpKSkKLSAgICAgICAgICAgIHJldHVybiBjdXJyZW50RnJh
bWU7Ci0gICAgICAgIGN1cnJlbnRGcmFtZSA9IGFuY2VzdG9yRnJhbWU7Ci0gICAgICAgIGFuY2Vz
dG9yRnJhbWUgPSBhbmNlc3RvckZyYW1lLT50cmVlKCktPnBhcmVudCgpOwotICAgIH0KLSAgICBy
ZXR1cm4gMDsKLX0KLQotQ1NTU3R5bGVTaGVldCogRG9jdW1lbnQ6OnBhZ2VVc2VyU2hlZXQoKQot
ewotICAgIGlmIChtX3BhZ2VVc2VyU2hlZXQpCi0gICAgICAgIHJldHVybiBtX3BhZ2VVc2VyU2hl
ZXQuZ2V0KCk7Ci0gICAgCi0gICAgUGFnZSogb3duaW5nUGFnZSA9IHBhZ2UoKTsKLSAgICBpZiAo
IW93bmluZ1BhZ2UpCi0gICAgICAgIHJldHVybiAwOwotICAgIAotICAgIFN0cmluZyB1c2VyU2hl
ZXRUZXh0ID0gb3duaW5nUGFnZS0+dXNlclN0eWxlU2hlZXQoKTsKLSAgICBpZiAodXNlclNoZWV0
VGV4dC5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiAwOwotICAgIAotICAgIC8vIFBhcnNlIHRo
ZSBzaGVldCBhbmQgY2FjaGUgaXQuCi0gICAgbV9wYWdlVXNlclNoZWV0ID0gQ1NTU3R5bGVTaGVl
dDo6Y3JlYXRlSW5saW5lKHRoaXMsIHNldHRpbmdzKCktPnVzZXJTdHlsZVNoZWV0TG9jYXRpb24o
KSk7Ci0gICAgbV9wYWdlVXNlclNoZWV0LT5jb250ZW50cygpLT5zZXRJc1VzZXJTdHlsZVNoZWV0
KHRydWUpOwotICAgIG1fcGFnZVVzZXJTaGVldC0+Y29udGVudHMoKS0+cGFyc2VTdHJpbmcodXNl
clNoZWV0VGV4dCk7Ci0gICAgcmV0dXJuIG1fcGFnZVVzZXJTaGVldC5nZXQoKTsKLX0KLQotdm9p
ZCBEb2N1bWVudDo6Y2xlYXJQYWdlVXNlclNoZWV0KCkKLXsKLSAgICBpZiAobV9wYWdlVXNlclNo
ZWV0KSB7Ci0gICAgICAgIG1fcGFnZVVzZXJTaGVldCA9IDA7Ci0gICAgICAgIHN0eWxlUmVzb2x2
ZXJDaGFuZ2VkKERlZmVyUmVjYWxjU3R5bGUpOwotICAgIH0KLX0KLQotdm9pZCBEb2N1bWVudDo6
dXBkYXRlUGFnZVVzZXJTaGVldCgpCi17Ci0gICAgY2xlYXJQYWdlVXNlclNoZWV0KCk7Ci0gICAg
aWYgKHBhZ2VVc2VyU2hlZXQoKSkKLSAgICAgICAgc3R5bGVSZXNvbHZlckNoYW5nZWQoUmVjYWxj
U3R5bGVJbW1lZGlhdGVseSk7Ci19Ci0KLWNvbnN0IFZlY3RvcjxSZWZQdHI8Q1NTU3R5bGVTaGVl
dD4gPiogRG9jdW1lbnQ6OnBhZ2VHcm91cFVzZXJTaGVldHMoKSBjb25zdAotewotICAgIGlmICht
X3BhZ2VHcm91cFVzZXJTaGVldENhY2hlVmFsaWQpCi0gICAgICAgIHJldHVybiBtX3BhZ2VHcm91
cFVzZXJTaGVldHMuZ2V0KCk7Ci0gICAgCi0gICAgbV9wYWdlR3JvdXBVc2VyU2hlZXRDYWNoZVZh
bGlkID0gdHJ1ZTsKLSAgICAKLSAgICBQYWdlKiBvd25pbmdQYWdlID0gcGFnZSgpOwotICAgIGlm
ICghb3duaW5nUGFnZSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIAotICAgIGNvbnN0IFBh
Z2VHcm91cCYgcGFnZUdyb3VwID0gb3duaW5nUGFnZS0+Z3JvdXAoKTsKLSAgICBjb25zdCBVc2Vy
U3R5bGVTaGVldE1hcCogc2hlZXRzTWFwID0gcGFnZUdyb3VwLnVzZXJTdHlsZVNoZWV0cygpOwot
ICAgIGlmICghc2hlZXRzTWFwKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIFVzZXJTdHlsZVNo
ZWV0TWFwOjpjb25zdF9pdGVyYXRvciBlbmQgPSBzaGVldHNNYXAtPmVuZCgpOwotICAgIGZvciAo
VXNlclN0eWxlU2hlZXRNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gc2hlZXRzTWFwLT5iZWdpbigp
OyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgY29uc3QgVXNlclN0eWxlU2hlZXRWZWN0b3Iq
IHNoZWV0cyA9IGl0LT5zZWNvbmQuZ2V0KCk7Ci0gICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7
IGkgPCBzaGVldHMtPnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICBjb25zdCBVc2VyU3R5bGVT
aGVldCogc2hlZXQgPSBzaGVldHMtPmF0KGkpLmdldCgpOwotICAgICAgICAgICAgaWYgKHNoZWV0
LT5pbmplY3RlZEZyYW1lcygpID09IEluamVjdEluVG9wRnJhbWVPbmx5ICYmIG93bmVyRWxlbWVu
dCgpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgaWYgKCFVc2VyQ29u
dGVudFVSTFBhdHRlcm46Om1hdGNoZXNQYXR0ZXJucyh1cmwoKSwgc2hlZXQtPndoaXRlbGlzdCgp
LCBzaGVldC0+YmxhY2tsaXN0KCkpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAg
ICAgICAgUmVmUHRyPENTU1N0eWxlU2hlZXQ+IGdyb3VwU2hlZXQgPSBDU1NTdHlsZVNoZWV0Ojpj
cmVhdGVJbmxpbmUoY29uc3RfY2FzdDxEb2N1bWVudCo+KHRoaXMpLCBzaGVldC0+dXJsKCkpOwot
ICAgICAgICAgICAgaWYgKCFtX3BhZ2VHcm91cFVzZXJTaGVldHMpCi0gICAgICAgICAgICAgICAg
bV9wYWdlR3JvdXBVc2VyU2hlZXRzID0gYWRvcHRQdHIobmV3IFZlY3RvcjxSZWZQdHI8Q1NTU3R5
bGVTaGVldD4gPik7Ci0gICAgICAgICAgICBtX3BhZ2VHcm91cFVzZXJTaGVldHMtPmFwcGVuZChn
cm91cFNoZWV0KTsKLSAgICAgICAgICAgIGdyb3VwU2hlZXQtPmNvbnRlbnRzKCktPnNldElzVXNl
clN0eWxlU2hlZXQoc2hlZXQtPmxldmVsKCkgPT0gVXNlclN0eWxlVXNlckxldmVsKTsKLSAgICAg
ICAgICAgIGdyb3VwU2hlZXQtPmNvbnRlbnRzKCktPnBhcnNlU3RyaW5nKHNoZWV0LT5zb3VyY2Uo
KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbV9wYWdlR3JvdXBVc2VyU2hlZXRz
LmdldCgpOwotfQotCi12b2lkIERvY3VtZW50OjpjbGVhclBhZ2VHcm91cFVzZXJTaGVldHMoKQot
ewotICAgIG1fcGFnZUdyb3VwVXNlclNoZWV0Q2FjaGVWYWxpZCA9IGZhbHNlOwotICAgIGlmICht
X3BhZ2VHcm91cFVzZXJTaGVldHMgJiYgbV9wYWdlR3JvdXBVc2VyU2hlZXRzLT5zaXplKCkpIHsK
LSAgICAgICAgbV9wYWdlR3JvdXBVc2VyU2hlZXRzLT5jbGVhcigpOwotICAgICAgICBzdHlsZVJl
c29sdmVyQ2hhbmdlZChEZWZlclJlY2FsY1N0eWxlKTsKLSAgICB9Ci19Ci0KLXZvaWQgRG9jdW1l
bnQ6OnVwZGF0ZVBhZ2VHcm91cFVzZXJTaGVldHMoKQotewotICAgIGNsZWFyUGFnZUdyb3VwVXNl
clNoZWV0cygpOwotICAgIGlmIChwYWdlR3JvdXBVc2VyU2hlZXRzKCkgJiYgcGFnZUdyb3VwVXNl
clNoZWV0cygpLT5zaXplKCkpCi0gICAgICAgIHN0eWxlUmVzb2x2ZXJDaGFuZ2VkKFJlY2FsY1N0
eWxlSW1tZWRpYXRlbHkpOwotfQotCi12b2lkIERvY3VtZW50OjphZGRVc2VyU2hlZXQoUGFzc1Jl
ZlB0cjxTdHlsZVNoZWV0Q29udGVudHM+IHVzZXJTaGVldCkKLXsKLSAgICBpZiAoIW1fdXNlclNo
ZWV0cykKLSAgICAgICAgbV91c2VyU2hlZXRzID0gYWRvcHRQdHIobmV3IFZlY3RvcjxSZWZQdHI8
Q1NTU3R5bGVTaGVldD4gPik7Ci0gICAgbV91c2VyU2hlZXRzLT5hcHBlbmQoQ1NTU3R5bGVTaGVl
dDo6Y3JlYXRlKHVzZXJTaGVldCwgdGhpcykpOwotICAgIHN0eWxlUmVzb2x2ZXJDaGFuZ2VkKFJl
Y2FsY1N0eWxlSW1tZWRpYXRlbHkpOwotfQotCi12b2lkIERvY3VtZW50OjpzZWFtbGVzc1BhcmVu
dFVwZGF0ZWRTdHlsZXNoZWV0cygpCi17Ci0gICAgc3R5bGVSZXNvbHZlckNoYW5nZWQoUmVjYWxj
U3R5bGVJbW1lZGlhdGVseSk7Ci19Ci0KLUNTU1N0eWxlU2hlZXQqIERvY3VtZW50OjplbGVtZW50
U2hlZXQoKQotewotICAgIGlmICghbV9lbGVtU2hlZXQpCi0gICAgICAgIG1fZWxlbVNoZWV0ID0g
Q1NTU3R5bGVTaGVldDo6Y3JlYXRlSW5saW5lKHRoaXMsIG1fYmFzZVVSTCk7Ci0gICAgcmV0dXJu
IG1fZWxlbVNoZWV0LmdldCgpOwotfQotCi1pbnQgRG9jdW1lbnQ6Om5vZGVBYnNJbmRleChOb2Rl
ICpub2RlKQotewotICAgIEFTU0VSVChub2RlLT5kb2N1bWVudCgpID09IHRoaXMpOwotCi0gICAg
aW50IGFic0luZGV4ID0gMDsKLSAgICBmb3IgKE5vZGUqIG4gPSBub2RlOyBuICYmIG4gIT0gdGhp
czsgbiA9IG4tPnRyYXZlcnNlUHJldmlvdXNOb2RlKCkpCi0gICAgICAgIGFic0luZGV4Kys7Ci0g
ICAgcmV0dXJuIGFic0luZGV4OwotfQotCi1Ob2RlKiBEb2N1bWVudDo6bm9kZVdpdGhBYnNJbmRl
eChpbnQgYWJzSW5kZXgpCi17Ci0gICAgTm9kZSogbiA9IHRoaXM7Ci0gICAgZm9yIChpbnQgaSA9
IDA7IG4gJiYgKGkgPCBhYnNJbmRleCk7IGkrKykKLSAgICAgICAgbiA9IG4tPnRyYXZlcnNlTmV4
dE5vZGUoKTsKLSAgICByZXR1cm4gbjsKLX0KLQotdm9pZCBEb2N1bWVudDo6cHJvY2Vzc0h0dHBF
cXVpdihjb25zdCBTdHJpbmcmIGVxdWl2LCBjb25zdCBTdHJpbmcmIGNvbnRlbnQpCi17Ci0gICAg
QVNTRVJUKCFlcXVpdi5pc051bGwoKSAmJiAhY29udGVudC5pc051bGwoKSk7Ci0KLSAgICBGcmFt
ZSogZnJhbWUgPSB0aGlzLT5mcmFtZSgpOwotCi0gICAgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGVx
dWl2LCAiZGVmYXVsdC1zdHlsZSIpKSB7Ci0gICAgICAgIC8vIFRoZSBwcmVmZXJyZWQgc3R5bGUg
c2V0IGhhcyBiZWVuIG92ZXJyaWRkZW4gYXMgcGVyIHNlY3Rpb24gCi0gICAgICAgIC8vIDE0LjMu
MiBvZiB0aGUgSFRNTDQuMCBzcGVjaWZpY2F0aW9uLiAgV2UgbmVlZCB0byB1cGRhdGUgdGhlCi0g
ICAgICAgIC8vIHNoZWV0IHVzZWQgdmFyaWFibGUgYW5kIHRoZW4gdXBkYXRlIG91ciBzdHlsZSBz
ZWxlY3Rvci4gCi0gICAgICAgIC8vIEZvciBtb3JlIGluZm8sIHNlZSB0aGUgdGVzdCBhdDoKLSAg
ICAgICAgLy8gaHR0cDovL3d3dy5oaXhpZS5jaC90ZXN0cy9ldmlsL2Nzcy9pbXBvcnQvbWFpbi9w
cmVmZXJyZWQuaHRtbAotICAgICAgICAvLyAtZHdoCi0gICAgICAgIG1fc2VsZWN0ZWRTdHlsZXNo
ZWV0U2V0ID0gY29udGVudDsKLSAgICAgICAgbV9wcmVmZXJyZWRTdHlsZXNoZWV0U2V0ID0gY29u
dGVudDsKLSAgICAgICAgc3R5bGVSZXNvbHZlckNoYW5nZWQoRGVmZXJSZWNhbGNTdHlsZSk7Ci0g
ICAgfSBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZShlcXVpdiwgInJlZnJlc2giKSkgewotICAg
ICAgICBkb3VibGUgZGVsYXk7Ci0gICAgICAgIFN0cmluZyB1cmw7Ci0gICAgICAgIGlmIChmcmFt
ZSAmJiBwYXJzZUhUVFBSZWZyZXNoKGNvbnRlbnQsIHRydWUsIGRlbGF5LCB1cmwpKSB7Ci0gICAg
ICAgICAgICBpZiAodXJsLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICB1cmwgPSBtX3VybC5z
dHJpbmcoKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB1cmwgPSBjb21wbGV0
ZVVSTCh1cmwpLnN0cmluZygpOwotICAgICAgICAgICAgZnJhbWUtPm5hdmlnYXRpb25TY2hlZHVs
ZXIoKS0+c2NoZWR1bGVSZWRpcmVjdChkZWxheSwgdXJsKTsKLSAgICAgICAgfQotICAgIH0gZWxz
ZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoZXF1aXYsICJzZXQtY29va2llIikpIHsKLSAgICAgICAg
Ly8gRklYTUU6IG1ha2Ugc2V0Q29va2llIHdvcmsgb24gWE1MIGRvY3VtZW50cyB0b287IGUuZy4g
aW4gY2FzZSBvZiA8aHRtbDptZXRhIC4uLi4uPgotICAgICAgICBpZiAoaXNIVE1MRG9jdW1lbnQo
KSkgewotICAgICAgICAgICAgRXhjZXB0aW9uQ29kZSBlYzsgLy8gRXhjZXB0aW9uIChmb3Igc2Fu
ZGJveGVkIGRvY3VtZW50cykgaWdub3JlZC4KLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEhUTUxE
b2N1bWVudCo+KHRoaXMpLT5zZXRDb29raWUoY29udGVudCwgZWMpOwotICAgICAgICB9Ci0gICAg
fSBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZShlcXVpdiwgImNvbnRlbnQtbGFuZ3VhZ2UiKSkK
LSAgICAgICAgc2V0Q29udGVudExhbmd1YWdlKGNvbnRlbnQpOwotICAgIGVsc2UgaWYgKGVxdWFs
SWdub3JpbmdDYXNlKGVxdWl2LCAieC1kbnMtcHJlZmV0Y2gtY29udHJvbCIpKQotICAgICAgICBw
YXJzZUROU1ByZWZldGNoQ29udHJvbEhlYWRlcihjb250ZW50KTsKLSAgICBlbHNlIGlmIChlcXVh
bElnbm9yaW5nQ2FzZShlcXVpdiwgIngtZnJhbWUtb3B0aW9ucyIpKSB7Ci0gICAgICAgIGlmIChm
cmFtZSkgewotICAgICAgICAgICAgRnJhbWVMb2FkZXIqIGZyYW1lTG9hZGVyID0gZnJhbWUtPmxv
YWRlcigpOwotICAgICAgICAgICAgaWYgKGZyYW1lTG9hZGVyLT5zaG91bGRJbnRlcnJ1cHRMb2Fk
Rm9yWEZyYW1lT3B0aW9ucyhjb250ZW50LCB1cmwoKSkpIHsKLSAgICAgICAgICAgICAgICBmcmFt
ZUxvYWRlci0+c3RvcEFsbExvYWRlcnMoKTsKLSAgICAgICAgICAgICAgICBmcmFtZS0+bmF2aWdh
dGlvblNjaGVkdWxlcigpLT5zY2hlZHVsZUxvY2F0aW9uQ2hhbmdlKHNlY3VyaXR5T3JpZ2luKCks
IGJsYW5rVVJMKCksIFN0cmluZygpKTsKLQotICAgICAgICAgICAgICAgIERFRklORV9TVEFUSUNf
TE9DQUwoU3RyaW5nLCBjb25zb2xlTWVzc2FnZSwgKEFTQ0lJTGl0ZXJhbCgiUmVmdXNlZCB0byBk
aXNwbGF5IGRvY3VtZW50IGJlY2F1c2UgZGlzcGxheSBmb3JiaWRkZW4gYnkgWC1GcmFtZS1PcHRp
b25zLlxuIikpKTsKLSAgICAgICAgICAgICAgICBhZGRDb25zb2xlTWVzc2FnZShKU01lc3NhZ2VT
b3VyY2UsIExvZ01lc3NhZ2VUeXBlLCBFcnJvck1lc3NhZ2VMZXZlbCwgY29uc29sZU1lc3NhZ2Up
OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChlcXVhbElnbm9yaW5n
Q2FzZShlcXVpdiwgIngtd2Via2l0LWNzcCIpKQotICAgICAgICBjb250ZW50U2VjdXJpdHlQb2xp
Y3koKS0+ZGlkUmVjZWl2ZUhlYWRlcihjb250ZW50LCBDb250ZW50U2VjdXJpdHlQb2xpY3k6OkVu
Zm9yY2VQb2xpY3kpOwotICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGVxdWl2LCAieC13
ZWJraXQtY3NwLXJlcG9ydC1vbmx5IikpCi0gICAgICAgIGNvbnRlbnRTZWN1cml0eVBvbGljeSgp
LT5kaWRSZWNlaXZlSGVhZGVyKGNvbnRlbnQsIENvbnRlbnRTZWN1cml0eVBvbGljeTo6UmVwb3J0
T25seSk7Ci19Ci0KLS8vIFRob3VnaCBpc3NwYWNlKCkgY29uc2lkZXJzIFx0IGFuZCBcdiB0byBi
ZSB3aGl0ZXNwYWNlLCBXaW4gSUUgZG9lc24ndC4KLXN0YXRpYyBib29sIGlzU2VwYXJhdG9yKFVD
aGFyIGMpCi17Ci0gICAgcmV0dXJuIGMgPT0gJyAnIHx8IGMgPT0gJ1x0JyB8fCBjID09ICdcbicg
fHwgYyA9PSAnXHInIHx8IGMgPT0gJz0nIHx8IGMgPT0gJywnIHx8IGMgPT0gJ1wwJzsKLX0KLQot
dm9pZCBEb2N1bWVudDo6cHJvY2Vzc0FyZ3VtZW50cyhjb25zdCBTdHJpbmcmIGZlYXR1cmVzLCB2
b2lkKiBkYXRhLCBBcmd1bWVudHNDYWxsYmFjayBjYWxsYmFjaykKLXsKLSAgICAvLyBUcmVhZCBs
aWdodGx5IGluIHRoaXMgY29kZSAtLSBpdCB3YXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIG1p
bWljIFdpbiBJRSdzIHBhcnNpbmcgYmVoYXZpb3IuCi0gICAgaW50IGtleUJlZ2luLCBrZXlFbmQ7
Ci0gICAgaW50IHZhbHVlQmVnaW4sIHZhbHVlRW5kOwotCi0gICAgaW50IGkgPSAwOwotICAgIGlu
dCBsZW5ndGggPSBmZWF0dXJlcy5sZW5ndGgoKTsKLSAgICBTdHJpbmcgYnVmZmVyID0gZmVhdHVy
ZXMubG93ZXIoKTsKLSAgICB3aGlsZSAoaSA8IGxlbmd0aCkgewotICAgICAgICAvLyBza2lwIHRv
IGZpcnN0IG5vbi1zZXBhcmF0b3IsIGJ1dCBkb24ndCBza2lwIHBhc3QgdGhlIGVuZCBvZiB0aGUg
c3RyaW5nCi0gICAgICAgIHdoaWxlIChpc1NlcGFyYXRvcihidWZmZXJbaV0pKSB7Ci0gICAgICAg
ICAgICBpZiAoaSA+PSBsZW5ndGgpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAg
ICBpKys7Ci0gICAgICAgIH0KLSAgICAgICAga2V5QmVnaW4gPSBpOwotCi0gICAgICAgIC8vIHNr
aXAgdG8gZmlyc3Qgc2VwYXJhdG9yCi0gICAgICAgIHdoaWxlICghaXNTZXBhcmF0b3IoYnVmZmVy
W2ldKSkKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAga2V5RW5kID0gaTsKLQotICAgICAgICAv
LyBza2lwIHRvIGZpcnN0ICc9JywgYnV0IGRvbid0IHNraXAgcGFzdCBhICcsJyBvciB0aGUgZW5k
IG9mIHRoZSBzdHJpbmcKLSAgICAgICAgd2hpbGUgKGJ1ZmZlcltpXSAhPSAnPScpIHsKLSAgICAg
ICAgICAgIGlmIChidWZmZXJbaV0gPT0gJywnIHx8IGkgPj0gbGVuZ3RoKQotICAgICAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICAgICAgaSsrOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2tp
cCB0byBmaXJzdCBub24tc2VwYXJhdG9yLCBidXQgZG9uJ3Qgc2tpcCBwYXN0IGEgJywnIG9yIHRo
ZSBlbmQgb2YgdGhlIHN0cmluZwotICAgICAgICB3aGlsZSAoaXNTZXBhcmF0b3IoYnVmZmVyW2ld
KSkgewotICAgICAgICAgICAgaWYgKGJ1ZmZlcltpXSA9PSAnLCcgfHwgaSA+PSBsZW5ndGgpCi0g
ICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLSAgICAg
ICAgdmFsdWVCZWdpbiA9IGk7Ci0KLSAgICAgICAgLy8gc2tpcCB0byBmaXJzdCBzZXBhcmF0b3IK
LSAgICAgICAgd2hpbGUgKCFpc1NlcGFyYXRvcihidWZmZXJbaV0pKQotICAgICAgICAgICAgaSsr
OwotICAgICAgICB2YWx1ZUVuZCA9IGk7Ci0KLSAgICAgICAgQVNTRVJUKGkgPD0gbGVuZ3RoKTsK
LQotICAgICAgICBTdHJpbmcga2V5U3RyaW5nID0gYnVmZmVyLnN1YnN0cmluZyhrZXlCZWdpbiwg
a2V5RW5kIC0ga2V5QmVnaW4pOwotICAgICAgICBTdHJpbmcgdmFsdWVTdHJpbmcgPSBidWZmZXIu
c3Vic3RyaW5nKHZhbHVlQmVnaW4sIHZhbHVlRW5kIC0gdmFsdWVCZWdpbik7Ci0gICAgICAgIGNh
bGxiYWNrKGtleVN0cmluZywgdmFsdWVTdHJpbmcsIHRoaXMsIGRhdGEpOwotICAgIH0KLX0KLQot
dm9pZCBEb2N1bWVudDo6cHJvY2Vzc1ZpZXdwb3J0KGNvbnN0IFN0cmluZyYgZmVhdHVyZXMsIFZp
ZXdwb3J0QXJndW1lbnRzOjpUeXBlIG9yaWdpbikKLXsKLSAgICBBU1NFUlQoIWZlYXR1cmVzLmlz
TnVsbCgpKTsKLQotICAgIGlmIChvcmlnaW4gPCBtX3ZpZXdwb3J0QXJndW1lbnRzLnR5cGUpCi0g
ICAgICAgIHJldHVybjsKLQotICAgIG1fdmlld3BvcnRBcmd1bWVudHMgPSBWaWV3cG9ydEFyZ3Vt
ZW50cyhvcmlnaW4pOwotICAgIHByb2Nlc3NBcmd1bWVudHMoZmVhdHVyZXMsICh2b2lkKikmbV92
aWV3cG9ydEFyZ3VtZW50cywgJnNldFZpZXdwb3J0RmVhdHVyZSk7Ci0KLSAgICB1cGRhdGVWaWV3
cG9ydEFyZ3VtZW50cygpOwotfQotCi12b2lkIERvY3VtZW50Ojp1cGRhdGVWaWV3cG9ydEFyZ3Vt
ZW50cygpCi17Ci0gICAgaWYgKHBhZ2UoKSAmJiBwYWdlKCktPm1haW5GcmFtZSgpID09IGZyYW1l
KCkpIHsKLSNpZm5kZWYgTkRFQlVHCi0gICAgICAgIG1fZGlkRGlzcGF0Y2hWaWV3cG9ydFByb3Bl
cnRpZXNDaGFuZ2VkID0gdHJ1ZTsKLSNlbmRpZgotICAgICAgICBwYWdlKCktPmNocm9tZSgpLT5k
aXNwYXRjaFZpZXdwb3J0UHJvcGVydGllc0RpZENoYW5nZShtX3ZpZXdwb3J0QXJndW1lbnRzKTsK
LSAgICB9Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnByb2Nlc3NSZWZlcnJlclBvbGljeShjb25zdCBT
dHJpbmcmIHBvbGljeSkKLXsKLSAgICBBU1NFUlQoIXBvbGljeS5pc051bGwoKSk7Ci0KLSAgICBt
X3JlZmVycmVyUG9saWN5ID0gUmVmZXJyZXJQb2xpY3lEZWZhdWx0OwotCi0gICAgaWYgKGVxdWFs
SWdub3JpbmdDYXNlKHBvbGljeSwgIm5ldmVyIikpCi0gICAgICAgIG1fcmVmZXJyZXJQb2xpY3kg
PSBSZWZlcnJlclBvbGljeU5ldmVyOwotICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHBv
bGljeSwgImFsd2F5cyIpKQotICAgICAgICBtX3JlZmVycmVyUG9saWN5ID0gUmVmZXJyZXJQb2xp
Y3lBbHdheXM7Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UocG9saWN5LCAib3JpZ2lu
IikpCi0gICAgICAgIG1fcmVmZXJyZXJQb2xpY3kgPSBSZWZlcnJlclBvbGljeU9yaWdpbjsKLX0K
LQotTW91c2VFdmVudFdpdGhIaXRUZXN0UmVzdWx0cyBEb2N1bWVudDo6cHJlcGFyZU1vdXNlRXZl
bnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmIHJlcXVlc3QsIGNvbnN0IExheW91dFBvaW50JiBkb2N1
bWVudFBvaW50LCBjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmIGV2ZW50KQotewotICAgIEFTU0VS
VCghcmVuZGVyZXIoKSB8fCByZW5kZXJlcigpLT5pc1JlbmRlclZpZXcoKSk7Ci0KLSAgICBpZiAo
IXJlbmRlcmVyKCkpCi0gICAgICAgIHJldHVybiBNb3VzZUV2ZW50V2l0aEhpdFRlc3RSZXN1bHRz
KGV2ZW50LCBIaXRUZXN0UmVzdWx0KExheW91dFBvaW50KCkpKTsKLQotICAgIEhpdFRlc3RSZXN1
bHQgcmVzdWx0KGRvY3VtZW50UG9pbnQpOwotICAgIHJlbmRlclZpZXcoKS0+aGl0VGVzdChyZXF1
ZXN0LCByZXN1bHQpOwotCi0gICAgaWYgKCFyZXF1ZXN0LnJlYWRPbmx5KCkpCi0gICAgICAgIHVw
ZGF0ZVN0eWxlSWZOZWVkZWQoKTsKLQotICAgIHJldHVybiBNb3VzZUV2ZW50V2l0aEhpdFRlc3RS
ZXN1bHRzKGV2ZW50LCByZXN1bHQpOwotfQotCi0vLyBET00gU2VjdGlvbiAxLjEuMQotYm9vbCBE
b2N1bWVudDo6Y2hpbGRUeXBlQWxsb3dlZChOb2RlVHlwZSB0eXBlKSBjb25zdAotewotICAgIHN3
aXRjaCAodHlwZSkgewotICAgIGNhc2UgQVRUUklCVVRFX05PREU6Ci0gICAgY2FzZSBDREFUQV9T
RUNUSU9OX05PREU6Ci0gICAgY2FzZSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFOgotICAgIGNhc2Ug
RE9DVU1FTlRfTk9ERToKLSAgICBjYXNlIEVOVElUWV9OT0RFOgotICAgIGNhc2UgRU5USVRZX1JF
RkVSRU5DRV9OT0RFOgotICAgIGNhc2UgTk9UQVRJT05fTk9ERToKLSAgICBjYXNlIFRFWFRfTk9E
RToKLSAgICBjYXNlIFhQQVRIX05BTUVTUEFDRV9OT0RFOgotICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgY2FzZSBDT01NRU5UX05PREU6Ci0gICAgY2FzZSBQUk9DRVNTSU5HX0lOU1RSVUNUSU9O
X05PREU6Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIGNhc2UgRE9DVU1FTlRfVFlQRV9OT0RF
OgotICAgIGNhc2UgRUxFTUVOVF9OT0RFOgotICAgICAgICAvLyBEb2N1bWVudHMgbWF5IGNvbnRh
aW4gbm8gbW9yZSB0aGFuIG9uZSBvZiBlYWNoIG9mIHRoZXNlLgotICAgICAgICAvLyAoT25lIEVs
ZW1lbnQgYW5kIG9uZSBEb2N1bWVudFR5cGUuKQotICAgICAgICBmb3IgKE5vZGUqIGMgPSBmaXJz
dENoaWxkKCk7IGM7IGMgPSBjLT5uZXh0U2libGluZygpKQotICAgICAgICAgICAgaWYgKGMtPm5v
ZGVUeXBlKCkgPT0gdHlwZSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAg
IHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgRG9jdW1l
bnQ6OmNhblJlcGxhY2VDaGlsZChOb2RlKiBuZXdDaGlsZCwgTm9kZSogb2xkQ2hpbGQpCi17Ci0g
ICAgaWYgKCFvbGRDaGlsZCkKLSAgICAgICAgLy8gQ29udGFpbmVyTm9kZTo6cmVwbGFjZUNoaWxk
IHdpbGwgcmFpc2UgYSBOT1RfRk9VTkRfRVJSLgotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAg
IGlmIChvbGRDaGlsZC0+bm9kZVR5cGUoKSA9PSBuZXdDaGlsZC0+bm9kZVR5cGUoKSkKLSAgICAg
ICAgcmV0dXJuIHRydWU7Ci0KLSAgICBpbnQgbnVtRG9jdHlwZXMgPSAwOwotICAgIGludCBudW1F
bGVtZW50cyA9IDA7Ci0KLSAgICAvLyBGaXJzdCwgY2hlY2sgaG93IG1hbnkgZG9jdHlwZXMgYW5k
IGVsZW1lbnRzIHdlIGhhdmUsIG5vdCBjb3VudGluZwotICAgIC8vIHRoZSBjaGlsZCB3ZSdyZSBh
Ym91dCB0byByZW1vdmUuCi0gICAgZm9yIChOb2RlKiBjID0gZmlyc3RDaGlsZCgpOyBjOyBjID0g
Yy0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICBpZiAoYyA9PSBvbGRDaGlsZCkKLSAgICAgICAg
ICAgIGNvbnRpbnVlOwotICAgICAgICAKLSAgICAgICAgc3dpdGNoIChjLT5ub2RlVHlwZSgpKSB7
Ci0gICAgICAgIGNhc2UgRE9DVU1FTlRfVFlQRV9OT0RFOgotICAgICAgICAgICAgbnVtRG9jdHlw
ZXMrKzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVMRU1FTlRfTk9ERToKLSAg
ICAgICAgICAgIG51bUVsZW1lbnRzKys7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVm
YXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8v
IFRoZW4sIHNlZSBob3cgbWFueSBkb2N0eXBlcyBhbmQgZWxlbWVudHMgbWlnaHQgYmUgYWRkZWQg
YnkgdGhlIG5ldyBjaGlsZC4KLSAgICBpZiAobmV3Q2hpbGQtPm5vZGVUeXBlKCkgPT0gRE9DVU1F
TlRfRlJBR01FTlRfTk9ERSkgewotICAgICAgICBmb3IgKE5vZGUqIGMgPSBuZXdDaGlsZC0+Zmly
c3RDaGlsZCgpOyBjOyBjID0gYy0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICAgICAgc3dpdGNo
IChjLT5ub2RlVHlwZSgpKSB7Ci0gICAgICAgICAgICBjYXNlIEFUVFJJQlVURV9OT0RFOgotICAg
ICAgICAgICAgY2FzZSBDREFUQV9TRUNUSU9OX05PREU6Ci0gICAgICAgICAgICBjYXNlIERPQ1VN
RU5UX0ZSQUdNRU5UX05PREU6Ci0gICAgICAgICAgICBjYXNlIERPQ1VNRU5UX05PREU6Ci0gICAg
ICAgICAgICBjYXNlIEVOVElUWV9OT0RFOgotICAgICAgICAgICAgY2FzZSBFTlRJVFlfUkVGRVJF
TkNFX05PREU6Ci0gICAgICAgICAgICBjYXNlIE5PVEFUSU9OX05PREU6Ci0gICAgICAgICAgICBj
YXNlIFRFWFRfTk9ERToKLSAgICAgICAgICAgIGNhc2UgWFBBVEhfTkFNRVNQQUNFX05PREU6Ci0g
ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgY2FzZSBDT01NRU5UX05P
REU6Ci0gICAgICAgICAgICBjYXNlIFBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERToKLSAgICAg
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRE9DVU1FTlRfVFlQRV9OT0RFOgot
ICAgICAgICAgICAgICAgIG51bURvY3R5cGVzKys7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgICAgICBjYXNlIEVMRU1FTlRfTk9ERToKLSAgICAgICAgICAgICAgICBudW1FbGVtZW50
cysrOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0g
ICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoIChuZXdDaGlsZC0+bm9kZVR5cGUoKSkgewotICAg
ICAgICBjYXNlIEFUVFJJQlVURV9OT0RFOgotICAgICAgICBjYXNlIENEQVRBX1NFQ1RJT05fTk9E
RToKLSAgICAgICAgY2FzZSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFOgotICAgICAgICBjYXNlIERP
Q1VNRU5UX05PREU6Ci0gICAgICAgIGNhc2UgRU5USVRZX05PREU6Ci0gICAgICAgIGNhc2UgRU5U
SVRZX1JFRkVSRU5DRV9OT0RFOgotICAgICAgICBjYXNlIE5PVEFUSU9OX05PREU6Ci0gICAgICAg
IGNhc2UgVEVYVF9OT0RFOgotICAgICAgICBjYXNlIFhQQVRIX05BTUVTUEFDRV9OT0RFOgotICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBjYXNlIENPTU1FTlRfTk9ERToKLSAgICAg
ICAgY2FzZSBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU6Ci0gICAgICAgICAgICByZXR1cm4g
dHJ1ZTsKLSAgICAgICAgY2FzZSBET0NVTUVOVF9UWVBFX05PREU6Ci0gICAgICAgICAgICBudW1E
b2N0eXBlcysrOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRUxFTUVOVF9OT0RF
OgotICAgICAgICAgICAgbnVtRWxlbWVudHMrKzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICB9ICAgICAgICAgICAgICAgIAotICAgIH0KLSAgICAgICAgCi0gICAgaWYgKG51bUVsZW1lbnRz
ID4gMSB8fCBudW1Eb2N0eXBlcyA+IDEpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAg
ICByZXR1cm4gdHJ1ZTsKLX0KLQotUGFzc1JlZlB0cjxOb2RlPiBEb2N1bWVudDo6Y2xvbmVOb2Rl
KGJvb2wgLypkZWVwKi8pCi17Ci0gICAgLy8gU3BlYyBzYXlzIGNsb25pbmcgRG9jdW1lbnQgbm9k
ZXMgaXMgImltcGxlbWVudGF0aW9uIGRlcGVuZGVudCIKLSAgICAvLyBzbyB3ZSBkbyBub3Qgc3Vw
cG9ydCBpdC4uLgotICAgIHJldHVybiAwOwotfQotCi1TdHlsZVNoZWV0TGlzdCogRG9jdW1lbnQ6
OnN0eWxlU2hlZXRzKCkKLXsKLSAgICByZXR1cm4gbV9zdHlsZVNoZWV0cy5nZXQoKTsKLX0KLQot
U3RyaW5nIERvY3VtZW50OjpwcmVmZXJyZWRTdHlsZXNoZWV0U2V0KCkgY29uc3QKLXsKLSAgICBy
ZXR1cm4gbV9wcmVmZXJyZWRTdHlsZXNoZWV0U2V0OwotfQotCi1TdHJpbmcgRG9jdW1lbnQ6OnNl
bGVjdGVkU3R5bGVzaGVldFNldCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fc2VsZWN0ZWRTdHls
ZXNoZWV0U2V0OwotfQotCi12b2lkIERvY3VtZW50OjpzZXRTZWxlY3RlZFN0eWxlc2hlZXRTZXQo
Y29uc3QgU3RyaW5nJiBhU3RyaW5nKQotewotICAgIG1fc2VsZWN0ZWRTdHlsZXNoZWV0U2V0ID0g
YVN0cmluZzsKLSAgICBzdHlsZVJlc29sdmVyQ2hhbmdlZChEZWZlclJlY2FsY1N0eWxlKTsKLX0K
LQotLy8gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW5ldmVyIGEgdG9wLWxldmVsIHN0eWxlc2hl
ZXQgaGFzIGZpbmlzaGVkIGxvYWRpbmcuCi12b2lkIERvY3VtZW50OjpyZW1vdmVQZW5kaW5nU2hl
ZXQoUmVtb3ZlUGVuZGluZ1NoZWV0Tm90aWZpY2F0aW9uVHlwZSBub3RpZmljYXRpb24pCi17Ci0g
ICAgLy8gTWFrZSBzdXJlIHdlIGtuZXcgdGhpcyBzaGVldCB3YXMgcGVuZGluZywgYW5kIHRoYXQg
b3VyIGNvdW50IGlzbid0IG91dCBvZiBzeW5jLgotICAgIEFTU0VSVChtX3BlbmRpbmdTdHlsZXNo
ZWV0cyA+IDApOwotCi0gICAgbV9wZW5kaW5nU3R5bGVzaGVldHMtLTsKLSAgICAKLSNpZmRlZiBJ
TlNUUlVNRU5UX0xBWU9VVF9TQ0hFRFVMSU5HCi0gICAgaWYgKCFvd25lckVsZW1lbnQoKSkKLSAg
ICAgICAgcHJpbnRmKCJTdHlsZXNoZWV0IGxvYWRlZCBhdCB0aW1lICVkLiAlZCBzdHlsZXNoZWV0
cyBzdGlsbCByZW1haW4uXG4iLCBlbGFwc2VkVGltZSgpLCBtX3BlbmRpbmdTdHlsZXNoZWV0cyk7
Ci0jZW5kaWYKLQotICAgIGlmIChtX3BlbmRpbmdTdHlsZXNoZWV0cykKLSAgICAgICAgcmV0dXJu
OwotCi0gICAgaWYgKG5vdGlmaWNhdGlvbiA9PSBSZW1vdmVQZW5kaW5nU2hlZXROb3RpZnlMYXRl
cikgewotICAgICAgICBzZXROZWVkc05vdGlmeVJlbW92ZUFsbFBlbmRpbmdTdHlsZXNoZWV0KCk7
Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0gICAgZGlkUmVtb3ZlQWxsUGVuZGluZ1N0
eWxlc2hlZXQoKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6ZGlkUmVtb3ZlQWxsUGVuZGluZ1N0eWxl
c2hlZXQoKQotewotICAgIG1fbmVlZHNOb3RpZnlSZW1vdmVBbGxQZW5kaW5nU3R5bGVzaGVldCA9
IGZhbHNlOwotCi0gICAgc3R5bGVSZXNvbHZlckNoYW5nZWQoUmVjYWxjU3R5bGVJZk5lZWRlZCk7
Ci0KLSAgICBpZiAoU2NyaXB0YWJsZURvY3VtZW50UGFyc2VyKiBwYXJzZXIgPSBzY3JpcHRhYmxl
RG9jdW1lbnRQYXJzZXIoKSkKLSAgICAgICAgcGFyc2VyLT5leGVjdXRlU2NyaXB0c1dhaXRpbmdG
b3JTdHlsZXNoZWV0cygpOwotCi0gICAgaWYgKG1fZ290b0FuY2hvck5lZWRlZEFmdGVyU3R5bGVz
aGVldHNMb2FkICYmIHZpZXcoKSkKLSAgICAgICAgdmlldygpLT5zY3JvbGxUb0ZyYWdtZW50KG1f
dXJsKTsKLX0KLQotCi12b2lkIERvY3VtZW50OjpldmFsdWF0ZU1lZGlhUXVlcnlMaXN0KCkKLXsK
LSAgICBpZiAobV9tZWRpYVF1ZXJ5TWF0Y2hlcikKLSAgICAgICAgbV9tZWRpYVF1ZXJ5TWF0Y2hl
ci0+c3R5bGVSZXNvbHZlckNoYW5nZWQoKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6c3R5bGVSZXNv
bHZlckNoYW5nZWQoU3R5bGVSZXNvbHZlclVwZGF0ZUZsYWcgdXBkYXRlRmxhZykKLXsKLSAgICAv
LyBEb24ndCBib3RoZXIgdXBkYXRpbmcsIHNpbmNlIHdlIGhhdmVuJ3QgbG9hZGVkIGFsbCBvdXIg
c3R5bGUgaW5mbyB5ZXQKLSAgICAvLyBhbmQgaGF2ZW4ndCBjYWxjdWxhdGVkIHRoZSBzdHlsZSBz
ZWxlY3RvciBmb3IgdGhlIGZpcnN0IHRpbWUuCi0gICAgaWYgKCFhdHRhY2hlZCgpIHx8ICghbV9k
aWRDYWxjdWxhdGVTdHlsZVJlc29sdmVyICYmICFoYXZlU3R5bGVzaGVldHNMb2FkZWQoKSkpIHsK
LSAgICAgICAgbV9zdHlsZVJlc29sdmVyLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9
Ci0KLSNpZmRlZiBJTlNUUlVNRU5UX0xBWU9VVF9TQ0hFRFVMSU5HCi0gICAgaWYgKCFvd25lckVs
ZW1lbnQoKSkKLSAgICAgICAgcHJpbnRmKCJCZWdpbm5pbmcgdXBkYXRlIG9mIHN0eWxlIHNlbGVj
dG9yIGF0IHRpbWUgJWQuXG4iLCBlbGFwc2VkVGltZSgpKTsKLSNlbmRpZgotCi0gICAgYm9vbCBz
dHlsZXNoZWV0Q2hhbmdlUmVxdWlyZXNTdHlsZVJlY2FsYyA9IHVwZGF0ZUFjdGl2ZVN0eWxlc2hl
ZXRzKHVwZGF0ZUZsYWcpOwotCi0gICAgaWYgKHVwZGF0ZUZsYWcgPT0gRGVmZXJSZWNhbGNTdHls
ZSkgewotICAgICAgICBzY2hlZHVsZUZvcmNlZFN0eWxlUmVjYWxjKCk7Ci0gICAgICAgIHJldHVy
bjsKLSAgICB9Ci0KLSAgICBpZiAoZGlkTGF5b3V0V2l0aFBlbmRpbmdTdHlsZXNoZWV0cygpICYm
IG1fcGVuZGluZ1N0eWxlc2hlZXRzIDw9IDApIHsKLSAgICAgICAgbV9wZW5kaW5nU2hlZXRMYXlv
dXQgPSBJZ25vcmVMYXlvdXRXaXRoUGVuZGluZ1NoZWV0czsKLSAgICAgICAgaWYgKHJlbmRlcmVy
KCkpCi0gICAgICAgICAgICByZW5kZXJlcigpLT5yZXBhaW50KCk7Ci0gICAgfQotCi0gICAgaWYg
KCFzdHlsZXNoZWV0Q2hhbmdlUmVxdWlyZXNTdHlsZVJlY2FsYykKLSAgICAgICAgcmV0dXJuOwot
Ci0gICAgLy8gVGhpcyByZWNhbGNTdHlsZSBpbml0aWF0ZXMgYSBuZXcgcmVjYWxjIGN5Y2xlLiBX
ZSBuZWVkIHRvIGJyYWNrZXQgaXQgdG8KLSAgICAvLyBtYWtlIHN1cmUgYW5pbWF0aW9ucyBnZXQg
dGhlIGNvcnJlY3QgdXBkYXRlIHRpbWUKLSAgICB7Ci0gICAgICAgIEFuaW1hdGlvblVwZGF0ZUJs
b2NrIGFuaW1hdGlvblVwZGF0ZUJsb2NrKG1fZnJhbWUgPyBtX2ZyYW1lLT5hbmltYXRpb24oKSA6
IDApOwotICAgICAgICByZWNhbGNTdHlsZShGb3JjZSk7Ci0gICAgfQotCi0jaWZkZWYgSU5TVFJV
TUVOVF9MQVlPVVRfU0NIRURVTElORwotICAgIGlmICghb3duZXJFbGVtZW50KCkpCi0gICAgICAg
IHByaW50ZigiRmluaXNoZWQgdXBkYXRlIG9mIHN0eWxlIHNlbGVjdG9yIGF0IHRpbWUgJWRcbiIs
IGVsYXBzZWRUaW1lKCkpOwotI2VuZGlmCi0KLSAgICBpZiAocmVuZGVyZXIoKSkgewotICAgICAg
ICByZW5kZXJlcigpLT5zZXROZWVkc0xheW91dEFuZFByZWZXaWR0aHNSZWNhbGMoKTsKLSAgICAg
ICAgaWYgKHZpZXcoKSkKLSAgICAgICAgICAgIHZpZXcoKS0+c2NoZWR1bGVSZWxheW91dCgpOwot
ICAgIH0KLQotICAgIGV2YWx1YXRlTWVkaWFRdWVyeUxpc3QoKTsKLX0KLQotdm9pZCBEb2N1bWVu
dDo6YWRkU3R5bGVTaGVldENhbmRpZGF0ZU5vZGUoTm9kZSogbm9kZSwgYm9vbCBjcmVhdGVkQnlQ
YXJzZXIpCi17Ci0gICAgaWYgKCFub2RlLT5pbkRvY3VtZW50KCkpCi0gICAgICAgIHJldHVybjsK
LSAgICAKLSAgICAvLyBVbnRpbCB0aGUgPGJvZHk+IGV4aXN0cywgd2UgaGF2ZSBubyBjaG9pY2Ug
YnV0IHRvIGNvbXBhcmUgZG9jdW1lbnQgcG9zaXRpb25zLAotICAgIC8vIHNpbmNlIHN0eWxlcyBv
dXRzaWRlIG9mIHRoZSBib2R5IGFuZCBoZWFkIGNvbnRpbnVlIHRvIGJlIHNodW50ZWQgaW50byB0
aGUgaGVhZAotICAgIC8vIChhbmQgdGh1cyBjYW4gc2hpZnQgdG8gZW5kIHVwIGJlZm9yZSBkeW5h
bWljYWxseSBhZGRlZCBET00gY29udGVudCB0aGF0IGlzIGFsc28KLSAgICAvLyBvdXRzaWRlIHRo
ZSBib2R5KS4KLSAgICBpZiAoKGNyZWF0ZWRCeVBhcnNlciAmJiBib2R5KCkpIHx8IG1fc3R5bGVT
aGVldENhbmRpZGF0ZU5vZGVzLmlzRW1wdHkoKSkgewotICAgICAgICBtX3N0eWxlU2hlZXRDYW5k
aWRhdGVOb2Rlcy5hZGQobm9kZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBE
ZXRlcm1pbmUgYW4gYXBwcm9wcmlhdGUgaW5zZXJ0aW9uIHBvaW50LgotICAgIFN0eWxlU2hlZXRD
YW5kaWRhdGVMaXN0SGFzaFNldDo6aXRlcmF0b3IgYmVnaW4gPSBtX3N0eWxlU2hlZXRDYW5kaWRh
dGVOb2Rlcy5iZWdpbigpOwotICAgIFN0eWxlU2hlZXRDYW5kaWRhdGVMaXN0SGFzaFNldDo6aXRl
cmF0b3IgZW5kID0gbV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMuZW5kKCk7Ci0gICAgU3R5bGVT
aGVldENhbmRpZGF0ZUxpc3RIYXNoU2V0OjppdGVyYXRvciBpdCA9IGVuZDsKLSAgICBOb2RlKiBm
b2xsb3dpbmdOb2RlID0gMDsKLSAgICBkbyB7Ci0gICAgICAgIC0taXQ7Ci0gICAgICAgIE5vZGUq
IG4gPSAqaXQ7Ci0gICAgICAgIHVuc2lnbmVkIHNob3J0IHBvc2l0aW9uID0gbi0+Y29tcGFyZURv
Y3VtZW50UG9zaXRpb24obm9kZSk7Ci0gICAgICAgIGlmIChwb3NpdGlvbiA9PSBET0NVTUVOVF9Q
T1NJVElPTl9GT0xMT1dJTkcpIHsKLSAgICAgICAgICAgIG1fc3R5bGVTaGVldENhbmRpZGF0ZU5v
ZGVzLmluc2VydEJlZm9yZShmb2xsb3dpbmdOb2RlLCBub2RlKTsKLSAgICAgICAgICAgIHJldHVy
bjsKLSAgICAgICAgfQotICAgICAgICBmb2xsb3dpbmdOb2RlID0gbjsKLSAgICB9IHdoaWxlIChp
dCAhPSBiZWdpbik7Ci0gICAgCi0gICAgbV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMuaW5zZXJ0
QmVmb3JlKGZvbGxvd2luZ05vZGUsIG5vZGUpOwotfQotCi12b2lkIERvY3VtZW50OjpyZW1vdmVT
dHlsZVNoZWV0Q2FuZGlkYXRlTm9kZShOb2RlKiBub2RlKQotewotICAgIG1fc3R5bGVTaGVldENh
bmRpZGF0ZU5vZGVzLnJlbW92ZShub2RlKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6Y29sbGVjdEFj
dGl2ZVN0eWxlc2hlZXRzKFZlY3RvcjxSZWZQdHI8U3R5bGVTaGVldD4gPiYgc2hlZXRzKQotewot
ICAgIGlmIChzZXR0aW5ncygpICYmICFzZXR0aW5ncygpLT5hdXRob3JBbmRVc2VyU3R5bGVzRW5h
YmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBTdHlsZVNoZWV0Q2FuZGlkYXRlTGlzdEhh
c2hTZXQ6Oml0ZXJhdG9yIGJlZ2luID0gbV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMuYmVnaW4o
KTsKLSAgICBTdHlsZVNoZWV0Q2FuZGlkYXRlTGlzdEhhc2hTZXQ6Oml0ZXJhdG9yIGVuZCA9IG1f
c3R5bGVTaGVldENhbmRpZGF0ZU5vZGVzLmVuZCgpOwotICAgIGZvciAoU3R5bGVTaGVldENhbmRp
ZGF0ZUxpc3RIYXNoU2V0OjppdGVyYXRvciBpdCA9IGJlZ2luOyBpdCAhPSBlbmQ7ICsraXQpIHsK
LSAgICAgICAgTm9kZSogbiA9ICppdDsKLSAgICAgICAgU3R5bGVTaGVldCogc2hlZXQgPSAwOwot
ICAgICAgICBpZiAobi0+bm9kZVR5cGUoKSA9PSBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUp
IHsKLSAgICAgICAgICAgIC8vIFByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gKFhNTCBkb2N1bWVudHMg
b25seSkuCi0gICAgICAgICAgICAvLyBXZSBkb24ndCBzdXBwb3J0IGxpbmtpbmcgdG8gZW1iZWRk
ZWQgQ1NTIHN0eWxlc2hlZXRzLCBzZWUgPGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD00OTI4MT4gZm9yIGRpc2N1c3Npb24uCi0gICAgICAgICAgICBQcm9jZXNzaW5nSW5z
dHJ1Y3Rpb24qIHBpID0gc3RhdGljX2Nhc3Q8UHJvY2Vzc2luZ0luc3RydWN0aW9uKj4obik7Ci0g
ICAgICAgICAgICBzaGVldCA9IHBpLT5zaGVldCgpOwotI2lmIEVOQUJMRShYU0xUKQotICAgICAg
ICAgICAgLy8gRG9uJ3QgYXBwbHkgWFNMIHRyYW5zZm9ybXMgdG8gYWxyZWFkeSB0cmFuc2Zvcm1l
ZCBkb2N1bWVudHMgLS0gPHJkYXI6Ly9wcm9ibGVtLzQxMzI4MDY+Ci0gICAgICAgICAgICBpZiAo
cGktPmlzWFNMKCkgJiYgIXRyYW5zZm9ybVNvdXJjZURvY3VtZW50KCkpIHsKLSAgICAgICAgICAg
ICAgICAvLyBEb24ndCBhcHBseSBYU0wgdHJhbnNmb3JtcyB1bnRpbCBsb2FkaW5nIGlzIGZpbmlz
aGVkLgotICAgICAgICAgICAgICAgIGlmICghcGFyc2luZygpKQotICAgICAgICAgICAgICAgICAg
ICBhcHBseVhTTFRyYW5zZm9ybShwaSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAg
ICAgICAgfQotI2VuZGlmCi0gICAgICAgIH0gZWxzZSBpZiAoKG4tPmlzSFRNTEVsZW1lbnQoKSAm
JiAobi0+aGFzVGFnTmFtZShsaW5rVGFnKSB8fCBuLT5oYXNUYWdOYW1lKHN0eWxlVGFnKSkpCi0j
aWYgRU5BQkxFKFNWRykKLSAgICAgICAgICAgICAgICAgICB8fCAgKG4tPmlzU1ZHRWxlbWVudCgp
ICYmIG4tPmhhc1RhZ05hbWUoU1ZHTmFtZXM6OnN0eWxlVGFnKSkKLSNlbmRpZgotICAgICAgICAg
ICAgICAgICAgICkgewotICAgICAgICAgICAgRWxlbWVudCogZSA9IHN0YXRpY19jYXN0PEVsZW1l
bnQqPihuKTsKLSAgICAgICAgICAgIEF0b21pY1N0cmluZyB0aXRsZSA9IGUtPmdldEF0dHJpYnV0
ZSh0aXRsZUF0dHIpOwotICAgICAgICAgICAgYm9vbCBlbmFibGVkVmlhU2NyaXB0ID0gZmFsc2U7
Ci0gICAgICAgICAgICBpZiAoZS0+aGFzTG9jYWxOYW1lKGxpbmtUYWcpKSB7Ci0gICAgICAgICAg
ICAgICAgLy8gPExJTks+IGVsZW1lbnQKLSAgICAgICAgICAgICAgICBIVE1MTGlua0VsZW1lbnQq
IGxpbmtFbGVtZW50ID0gc3RhdGljX2Nhc3Q8SFRNTExpbmtFbGVtZW50Kj4obik7Ci0gICAgICAg
ICAgICAgICAgaWYgKGxpbmtFbGVtZW50LT5pc0Rpc2FibGVkKCkpCi0gICAgICAgICAgICAgICAg
ICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIGVuYWJsZWRWaWFTY3JpcHQgPSBsaW5rRWxl
bWVudC0+aXNFbmFibGVkVmlhU2NyaXB0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmtFbGVt
ZW50LT5zdHlsZVNoZWV0SXNMb2FkaW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaXQg
aXMgbG9hZGluZyBidXQgd2Ugc2hvdWxkIHN0aWxsIGRlY2lkZSB3aGljaCBzdHlsZSBzaGVldCBz
ZXQgdG8gdXNlCi0gICAgICAgICAgICAgICAgICAgIGlmICghZW5hYmxlZFZpYVNjcmlwdCAmJiAh
dGl0bGUuaXNFbXB0eSgpICYmIG1fcHJlZmVycmVkU3R5bGVzaGVldFNldC5pc0VtcHR5KCkpIHsK
LSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyYgcmVsID0gZS0+Z2V0
QXR0cmlidXRlKHJlbEF0dHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWwuY29u
dGFpbnMoImFsdGVybmF0ZSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wcmVm
ZXJyZWRTdHlsZXNoZWV0U2V0ID0gdGl0bGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
bV9zZWxlY3RlZFN0eWxlc2hlZXRTZXQgPSB0aXRsZTsKLSAgICAgICAgICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsK
LSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFsaW5rRWxlbWVudC0+c2hl
ZXQoKSkKLSAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSBudWxsQXRvbTsKLSAgICAgICAgICAg
IH0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgY3VycmVudCBwcmVmZXJyZWQgc3R5bGVzZXQuICBU
aGlzIGlzIHRoZQotICAgICAgICAgICAgLy8gc2V0IG9mIHNoZWV0cyB0aGF0IHdpbGwgYmUgZW5h
YmxlZC4KLSNpZiBFTkFCTEUoU1ZHKQotICAgICAgICAgICAgaWYgKG4tPmlzU1ZHRWxlbWVudCgp
ICYmIG4tPmhhc1RhZ05hbWUoU1ZHTmFtZXM6OnN0eWxlVGFnKSkKLSAgICAgICAgICAgICAgICBz
aGVldCA9IHN0YXRpY19jYXN0PFNWR1N0eWxlRWxlbWVudCo+KG4pLT5zaGVldCgpOwotICAgICAg
ICAgICAgZWxzZQotI2VuZGlmCi0gICAgICAgICAgICBpZiAoZS0+aGFzTG9jYWxOYW1lKGxpbmtU
YWcpKQotICAgICAgICAgICAgICAgIHNoZWV0ID0gc3RhdGljX2Nhc3Q8SFRNTExpbmtFbGVtZW50
Kj4obiktPnNoZWV0KCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgLy8gPFNU
WUxFPiBlbGVtZW50Ci0gICAgICAgICAgICAgICAgc2hlZXQgPSBzdGF0aWNfY2FzdDxIVE1MU3R5
bGVFbGVtZW50Kj4obiktPnNoZWV0KCk7Ci0gICAgICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYg
dGhpcyBzaGVldCBiZWxvbmdzIHRvIGEgc3R5bGVzZXQKLSAgICAgICAgICAgIC8vICh0aHVzIG1h
a2luZyBpdCBQUkVGRVJSRUQgb3IgQUxURVJOQVRFIHJhdGhlciB0aGFuCi0gICAgICAgICAgICAv
LyBQRVJTSVNURU5UKS4KLSAgICAgICAgICAgIEF0b21pY1N0cmluZyByZWwgPSBlLT5nZXRBdHRy
aWJ1dGUocmVsQXR0cik7Ci0gICAgICAgICAgICBpZiAoIWVuYWJsZWRWaWFTY3JpcHQgJiYgIXRp
dGxlLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIC8vIFllcywgd2UgaGF2ZSBhIHRpdGxl
LgotICAgICAgICAgICAgICAgIGlmIChtX3ByZWZlcnJlZFN0eWxlc2hlZXRTZXQuaXNFbXB0eSgp
KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE5vIHByZWZlcnJlZCBzZXQgaGFzIGJlZW4gZXN0
YWJsaXNoZWQuICBJZgotICAgICAgICAgICAgICAgICAgICAvLyB3ZSBhcmUgTk9UIGFuIGFsdGVy
bmF0ZSBzaGVldCwgdGhlbiBlc3RhYmxpc2gKLSAgICAgICAgICAgICAgICAgICAgLy8gdXMgYXMg
dGhlIHByZWZlcnJlZCBzZXQuICBPdGhlcndpc2UsIGp1c3QgaWdub3JlCi0gICAgICAgICAgICAg
ICAgICAgIC8vIHRoaXMgc2hlZXQuCi0gICAgICAgICAgICAgICAgICAgIGlmIChlLT5oYXNMb2Nh
bE5hbWUoc3R5bGVUYWcpIHx8ICFyZWwuY29udGFpbnMoImFsdGVybmF0ZSIpKQotICAgICAgICAg
ICAgICAgICAgICAgICAgbV9wcmVmZXJyZWRTdHlsZXNoZWV0U2V0ID0gbV9zZWxlY3RlZFN0eWxl
c2hlZXRTZXQgPSB0aXRsZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYg
KHRpdGxlICE9IG1fcHJlZmVycmVkU3R5bGVzaGVldFNldCkKLSAgICAgICAgICAgICAgICAgICAg
c2hlZXQgPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocmVsLmNvbnRhaW5z
KCJhbHRlcm5hdGUiKSAmJiB0aXRsZS5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgc2hlZXQg
PSAwOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzaGVldCkKLSAgICAgICAgICAgIHNoZWV0cy5h
cHBlbmQoc2hlZXQpOwotICAgIH0KLX0KLQotYm9vbCBEb2N1bWVudDo6dGVzdEFkZGVkU3R5bGVz
aGVldFJlcXVpcmVzU3R5bGVSZWNhbGMoU3R5bGVTaGVldENvbnRlbnRzKiBzdHlsZXNoZWV0KQot
ewotICAgIC8vIFNlZSBpZiBhbGwgcnVsZXMgb24gdGhlIHNoZWV0IGFyZSBzY29wZWQgdG8gc29t
ZSBzcGVjaWZpYyBpZHMgb3IgY2xhc3Nlcy4KLSAgICAvLyBUaGVuIHRlc3QgaWYgd2UgYWN0dWFs
bHkgaGF2ZSBhbnkgb2YgdGhvc2UgaW4gdGhlIHRyZWUgYXQgdGhlIG1vbWVudC4KLSAgICBIYXNo
U2V0PEF0b21pY1N0cmluZ0ltcGwqPiBpZFNjb3BlczsgCi0gICAgSGFzaFNldDxBdG9taWNTdHJp
bmdJbXBsKj4gY2xhc3NTY29wZXM7Ci0gICAgaWYgKCFTdHlsZVJlc29sdmVyOjpkZXRlcm1pbmVT
dHlsZXNoZWV0U2VsZWN0b3JTY29wZXMoc3R5bGVzaGVldCwgaWRTY29wZXMsIGNsYXNzU2NvcGVz
KSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgLy8gSW52YWxpZGF0ZSB0aGUgc3VidHJlZXMg
dGhhdCBtYXRjaCB0aGUgc2NvcGVzLgotICAgIE5vZGUqIG5vZGUgPSBmaXJzdENoaWxkKCk7Ci0g
ICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgaWYgKCFub2RlLT5pc1N0eWxlZEVsZW1lbnQoKSkg
ewotICAgICAgICAgICAgbm9kZSA9IG5vZGUtPnRyYXZlcnNlTmV4dE5vZGUoKTsKLSAgICAgICAg
ICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIFN0eWxlZEVsZW1lbnQqIGVsZW1lbnQg
PSBzdGF0aWNfY2FzdDxTdHlsZWRFbGVtZW50Kj4obm9kZSk7Ci0gICAgICAgIGlmIChTZWxlY3Rv
ckNoZWNrZXI6OmVsZW1lbnRNYXRjaGVzU2VsZWN0b3JTY29wZXMoZWxlbWVudCwgaWRTY29wZXMs
IGNsYXNzU2NvcGVzKSkgewotICAgICAgICAgICAgZWxlbWVudC0+c2V0TmVlZHNTdHlsZVJlY2Fs
YygpOwotICAgICAgICAgICAgLy8gVGhlIHdob2xlIHN1YnRyZWUgaXMgbm93IGludmFsaWRhdGVk
LCB3ZSBjYW4gc2tpcCB0byB0aGUgbmV4dCBzaWJsaW5nLgotICAgICAgICAgICAgbm9kZSA9IG5v
ZGUtPnRyYXZlcnNlTmV4dFNpYmxpbmcoKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAg
ICB9Ci0gICAgICAgIG5vZGUgPSBub2RlLT50cmF2ZXJzZU5leHROb2RlKCk7Ci0gICAgfQotICAg
IHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBEb2N1bWVudDo6YW5hbHl6ZVN0eWxlc2hlZXRDaGFu
Z2UoU3R5bGVSZXNvbHZlclVwZGF0ZUZsYWcgdXBkYXRlRmxhZywgY29uc3QgVmVjdG9yPFJlZlB0
cjxTdHlsZVNoZWV0PiA+JiBuZXdTdHlsZXNoZWV0cywgYm9vbCYgcmVxdWlyZXNTdHlsZVJlc29s
dmVyUmVzZXQsIGJvb2wmIHJlcXVpcmVzRnVsbFN0eWxlUmVjYWxjKQotewotICAgIHJlcXVpcmVz
U3R5bGVSZXNvbHZlclJlc2V0ID0gdHJ1ZTsKLSAgICByZXF1aXJlc0Z1bGxTdHlsZVJlY2FsYyA9
IHRydWU7Ci0gICAgCi0gICAgLy8gU3R5bGVzaGVldHMgb2YgPHN0eWxlPiBlbGVtZW50cyB0aGF0
IEBpbXBvcnQgc3R5bGVzaGVldHMgYXJlIGFjdGl2ZSBidXQgbG9hZGluZy4gV2UgbmVlZCB0byB0
cmlnZ2VyIGEgZnVsbCByZWNhbGMgd2hlbiBzdWNoIGxvYWRzIGFyZSBkb25lLgotICAgIGJvb2wg
aGFzQWN0aXZlTG9hZGluZ1N0eWxlc2hlZXQgPSBmYWxzZTsKLSAgICB1bnNpZ25lZCBuZXdTdHls
ZXNoZWV0Q291bnQgPSBuZXdTdHlsZXNoZWV0cy5zaXplKCk7Ci0gICAgZm9yICh1bnNpZ25lZCBp
ID0gMDsgaSA8IG5ld1N0eWxlc2hlZXRDb3VudDsgKytpKSB7Ci0gICAgICAgIGlmIChuZXdTdHls
ZXNoZWV0c1tpXS0+aXNMb2FkaW5nKCkpCi0gICAgICAgICAgICBoYXNBY3RpdmVMb2FkaW5nU3R5
bGVzaGVldCA9IHRydWU7Ci0gICAgfQotICAgIGlmIChtX2hhZEFjdGl2ZUxvYWRpbmdTdHlsZXNo
ZWV0ICYmICFoYXNBY3RpdmVMb2FkaW5nU3R5bGVzaGVldCkgewotICAgICAgICBtX2hhZEFjdGl2
ZUxvYWRpbmdTdHlsZXNoZWV0ID0gZmFsc2U7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAg
bV9oYWRBY3RpdmVMb2FkaW5nU3R5bGVzaGVldCA9IGhhc0FjdGl2ZUxvYWRpbmdTdHlsZXNoZWV0
OwotCi0gICAgaWYgKHVwZGF0ZUZsYWcgIT0gUmVjYWxjU3R5bGVJZk5lZWRlZCkKLSAgICAgICAg
cmV0dXJuOwotICAgIGlmICghbV9zdHlsZVJlc29sdmVyKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICAvLyBTZWUgaWYgd2UgYXJlIGp1c3QgYWRkaW5nIHN0eWxlc2hlZXRzLgotICAgIHVuc2lnbmVk
IG9sZFN0eWxlc2hlZXRDb3VudCA9IG1fc3R5bGVTaGVldHMtPmxlbmd0aCgpOwotICAgIGlmIChu
ZXdTdHlsZXNoZWV0Q291bnQgPCBvbGRTdHlsZXNoZWV0Q291bnQpCi0gICAgICAgIHJldHVybjsK
LSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgb2xkU3R5bGVzaGVldENvdW50OyArK2kpIHsK
LSAgICAgICAgaWYgKG1fc3R5bGVTaGVldHMtPml0ZW0oaSkgIT0gbmV3U3R5bGVzaGVldHNbaV0p
Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHJlcXVpcmVzU3R5bGVSZXNvbHZlclJl
c2V0ID0gZmFsc2U7Ci0KLSAgICAvLyBJZiB3ZSBhcmUgYWxyZWFkeSBwYXJzaW5nIHRoZSBib2R5
IGFuZCBzbyBtYXkgaGF2ZSBzaWduaWZpY2FudCBhbW91bnQgb2YgZWxlbWVudHMsIHB1dCBzb21l
IGVmZm9ydCBpbnRvIHRyeWluZyB0byBhdm9pZCBzdHlsZSByZWNhbGNzLgotICAgIGlmICghYm9k
eSgpIHx8IG1faGFzTm9kZXNXaXRoUGxhY2Vob2xkZXJTdHlsZSkKLSAgICAgICAgcmV0dXJuOwot
ICAgIGZvciAodW5zaWduZWQgaSA9IG9sZFN0eWxlc2hlZXRDb3VudDsgaSA8IG5ld1N0eWxlc2hl
ZXRDb3VudDsgKytpKSB7Ci0gICAgICAgIGlmICghbmV3U3R5bGVzaGVldHNbaV0tPmlzQ1NTU3R5
bGVTaGVldCgpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpZiAobmV3U3R5bGVzaGVl
dHNbaV0tPmRpc2FibGVkKCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgaWYgKHRl
c3RBZGRlZFN0eWxlc2hlZXRSZXF1aXJlc1N0eWxlUmVjYWxjKHN0YXRpY19jYXN0PENTU1N0eWxl
U2hlZXQqPihuZXdTdHlsZXNoZWV0c1tpXS5nZXQoKSktPmNvbnRlbnRzKCkpKQotICAgICAgICAg
ICAgcmV0dXJuOwotICAgIH0KLSAgICByZXF1aXJlc0Z1bGxTdHlsZVJlY2FsYyA9IGZhbHNlOwot
fQotCi1zdGF0aWMgYm9vbCBzdHlsZVNoZWV0c1VzZVJlbVVuaXRzKGNvbnN0IFZlY3RvcjxSZWZQ
dHI8U3R5bGVTaGVldD4gPiYgc2hlZXRzKQotewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBzaGVldHMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgaWYgKCFzaGVldHNbaV0tPmlzQ1NTU3R5
bGVTaGVldCgpKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGlmIChzdGF0aWNfY2Fz
dDxDU1NTdHlsZVNoZWV0Kj4oc2hlZXRzW2ldLmdldCgpKS0+Y29udGVudHMoKS0+dXNlc1JlbVVu
aXRzKCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNl
OwotfQotCi12b2lkIERvY3VtZW50Ojpub3RpZnlTZWFtbGVzc0NoaWxkRG9jdW1lbnRzT2ZTdHls
ZXNoZWV0VXBkYXRlKCkgY29uc3QKLXsKLSAgICAvLyBJZiB3ZSdyZSBub3QgaW4gYSBmcmFtZSB5
ZXQgYW55IHBvdGVudGlhbCBjaGlsZCBkb2N1bWVudHMgd29uJ3QgaGF2ZSBhIFN0eWxlUmVzb2x2
ZXIgdG8gdXBkYXRlLgotICAgIGlmICghZnJhbWUoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAg
Ly8gU2VhbWxlc3MgY2hpbGQgZnJhbWVzIGFyZSBleHBlY3RlZCB0byBub3RpZnkgdGhlaXIgc2Vh
bWxlc3MgY2hpbGRyZW4gcmVjdXJzaXZlbHksIHNvIHdlIG9ubHkgZG8gZGlyZWN0IGNoaWxkcmVu
LgotICAgIGZvciAoRnJhbWUqIGNoaWxkID0gZnJhbWUoKS0+dHJlZSgpLT5maXJzdENoaWxkKCk7
IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT50cmVlKCktPm5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAg
RG9jdW1lbnQqIGNoaWxkRG9jdW1lbnQgPSBjaGlsZC0+ZG9jdW1lbnQoKTsKLSAgICAgICAgaWYg
KGNoaWxkRG9jdW1lbnQtPnNob3VsZERpc3BsYXlTZWFtbGVzc2x5V2l0aFBhcmVudCgpKSB7Ci0g
ICAgICAgICAgICBBU1NFUlQoY2hpbGREb2N1bWVudC0+c2VhbWxlc3NQYXJlbnRJRnJhbWUoKS0+
ZG9jdW1lbnQoKSA9PSB0aGlzKTsKLSAgICAgICAgICAgIGNoaWxkRG9jdW1lbnQtPnNlYW1sZXNz
UGFyZW50VXBkYXRlZFN0eWxlc2hlZXRzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWJvb2wg
RG9jdW1lbnQ6OnVwZGF0ZUFjdGl2ZVN0eWxlc2hlZXRzKFN0eWxlUmVzb2x2ZXJVcGRhdGVGbGFn
IHVwZGF0ZUZsYWcpCi17Ci0gICAgaWYgKG1faW5TdHlsZVJlY2FsYykgewotICAgICAgICAvLyBT
VkcgPHVzZT4gZWxlbWVudCBtYXkgbWFuYWdlIHRvIGludmFsaWRhdGUgc3R5bGUgc2VsZWN0b3Ig
aW4gdGhlIG1pZGRsZSBvZiBhIHN0eWxlIHJlY2FsYy4KLSAgICAgICAgLy8gaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTU0MzQ0Ci0gICAgICAgIC8vIEZJWE1FOiBUaGlz
IHNob3VsZCBiZSBmaXhlZCBpbiBTVkcgYW5kIHRoaXMgY29kZSByZXBsYWNlZCB3aXRoIEFTU0VS
VCghbV9pblN0eWxlUmVjYWxjKS4KLSAgICAgICAgbV9oYXNEaXJ0eVN0eWxlUmVzb2x2ZXIgPSB0
cnVlOwotICAgICAgICBzY2hlZHVsZUZvcmNlZFN0eWxlUmVjYWxjKCk7Ci0gICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKCFyZW5kZXJlcigpIHx8ICFhdHRhY2hlZCgpKQotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBTdHlsZVNoZWV0VmVjdG9yIG5ld1N0eWxlc2hlZXRz
OwotICAgIGNvbGxlY3RBY3RpdmVTdHlsZXNoZWV0cyhuZXdTdHlsZXNoZWV0cyk7Ci0KLSAgICBi
b29sIHJlcXVpcmVzU3R5bGVSZXNvbHZlclJlc2V0OwotICAgIGJvb2wgcmVxdWlyZXNGdWxsU3R5
bGVSZWNhbGM7Ci0gICAgYW5hbHl6ZVN0eWxlc2hlZXRDaGFuZ2UodXBkYXRlRmxhZywgbmV3U3R5
bGVzaGVldHMsIHJlcXVpcmVzU3R5bGVSZXNvbHZlclJlc2V0LCByZXF1aXJlc0Z1bGxTdHlsZVJl
Y2FsYyk7Ci0KLSAgICBpZiAocmVxdWlyZXNTdHlsZVJlc29sdmVyUmVzZXQpCi0gICAgICAgIGNs
ZWFyU3R5bGVSZXNvbHZlcigpOwotICAgIGVsc2UgewotICAgICAgICBtX3N0eWxlUmVzb2x2ZXIt
PmFwcGVuZEF1dGhvclN0eWxlc2hlZXRzKG1fc3R5bGVTaGVldHMtPmxlbmd0aCgpLCBuZXdTdHls
ZXNoZWV0cyk7Ci0gICAgICAgIHJlc2V0Q1NTRmVhdHVyZUZsYWdzKCk7Ci0gICAgfQotICAgIG1f
c3R5bGVTaGVldHMtPnN3YXAobmV3U3R5bGVzaGVldHMpOwotCi0gICAgbV91c2VzUmVtVW5pdHMg
PSBzdHlsZVNoZWV0c1VzZVJlbVVuaXRzKG1fc3R5bGVTaGVldHMtPnZlY3RvcigpKTsKLSAgICBt
X2RpZENhbGN1bGF0ZVN0eWxlUmVzb2x2ZXIgPSB0cnVlOwotICAgIG1faGFzRGlydHlTdHlsZVJl
c29sdmVyID0gZmFsc2U7Ci0KLSAgICBub3RpZnlTZWFtbGVzc0NoaWxkRG9jdW1lbnRzT2ZTdHls
ZXNoZWV0VXBkYXRlKCk7Ci0KLSAgICByZXR1cm4gcmVxdWlyZXNGdWxsU3R5bGVSZWNhbGM7Ci19
Ci0KLXZvaWQgRG9jdW1lbnQ6OnNldEhvdmVyTm9kZShQYXNzUmVmUHRyPE5vZGU+IG5ld0hvdmVy
Tm9kZSkKLXsKLSAgICBtX2hvdmVyTm9kZSA9IG5ld0hvdmVyTm9kZTsKLX0KLQotdm9pZCBEb2N1
bWVudDo6c2V0QWN0aXZlTm9kZShQYXNzUmVmUHRyPE5vZGU+IG5ld0FjdGl2ZU5vZGUpCi17Ci0g
ICAgbV9hY3RpdmVOb2RlID0gbmV3QWN0aXZlTm9kZTsKLX0KLQotdm9pZCBEb2N1bWVudDo6Zm9j
dXNlZE5vZGVSZW1vdmVkKCkKLXsKLSAgICBzZXRGb2N1c2VkTm9kZSgwKTsKLX0KLQotdm9pZCBE
b2N1bWVudDo6cmVtb3ZlRm9jdXNlZE5vZGVPZlN1YnRyZWUoTm9kZSogbm9kZSwgYm9vbCBhbW9u
Z0NoaWxkcmVuT25seSkKLXsKLSAgICBpZiAoIW1fZm9jdXNlZE5vZGUgfHwgdGhpcy0+aW5QYWdl
Q2FjaGUoKSkgLy8gSWYgdGhlIGRvY3VtZW50IGlzIGluIHRoZSBwYWdlIGNhY2hlLCB0aGVuIHdl
IGRvbid0IG5lZWQgdG8gY2xlYXIgb3V0IHRoZSBmb2N1c2VkIG5vZGUuCi0gICAgICAgIHJldHVy
bjsKLSAgICAgICAgCi0gICAgYm9vbCBub2RlSW5TdWJ0cmVlID0gZmFsc2U7Ci0gICAgaWYgKGFt
b25nQ2hpbGRyZW5Pbmx5KQotICAgICAgICBub2RlSW5TdWJ0cmVlID0gbV9mb2N1c2VkTm9kZS0+
aXNEZXNjZW5kYW50T2Yobm9kZSk7Ci0gICAgZWxzZQotICAgICAgICBub2RlSW5TdWJ0cmVlID0g
KG1fZm9jdXNlZE5vZGUgPT0gbm9kZSkgfHwgbV9mb2N1c2VkTm9kZS0+aXNEZXNjZW5kYW50T2Yo
bm9kZSk7Ci0gICAgCi0gICAgaWYgKG5vZGVJblN1YnRyZWUpCi0gICAgICAgIGRvY3VtZW50KCkt
PmZvY3VzZWROb2RlUmVtb3ZlZCgpOwotfQotCi12b2lkIERvY3VtZW50Ojpob3ZlcmVkTm9kZURl
dGFjaGVkKE5vZGUqIG5vZGUpCi17Ci0gICAgaWYgKCFtX2hvdmVyTm9kZSB8fCAobm9kZSAhPSBt
X2hvdmVyTm9kZSAmJiAoIW1faG92ZXJOb2RlLT5pc1RleHROb2RlKCkgfHwgbm9kZSAhPSBtX2hv
dmVyTm9kZS0+cGFyZW50Tm9kZSgpKSkpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1faG92ZXJO
b2RlID0gbm9kZS0+cGFyZW50Tm9kZSgpOwotICAgIHdoaWxlIChtX2hvdmVyTm9kZSAmJiAhbV9o
b3Zlck5vZGUtPnJlbmRlcmVyKCkpCi0gICAgICAgIG1faG92ZXJOb2RlID0gbV9ob3Zlck5vZGUt
PnBhcmVudE5vZGUoKTsKLSAgICBpZiAoZnJhbWUoKSkKLSAgICAgICAgZnJhbWUoKS0+ZXZlbnRI
YW5kbGVyKCktPnNjaGVkdWxlSG92ZXJTdGF0ZVVwZGF0ZSgpOwotfQotCi12b2lkIERvY3VtZW50
OjphY3RpdmVDaGFpbk5vZGVEZXRhY2hlZChOb2RlKiBub2RlKQotewotICAgIGlmICghbV9hY3Rp
dmVOb2RlIHx8IChub2RlICE9IG1fYWN0aXZlTm9kZSAmJiAoIW1fYWN0aXZlTm9kZS0+aXNUZXh0
Tm9kZSgpIHx8IG5vZGUgIT0gbV9hY3RpdmVOb2RlLT5wYXJlbnROb2RlKCkpKSkKLSAgICAgICAg
cmV0dXJuOwotCi0gICAgbV9hY3RpdmVOb2RlID0gbm9kZS0+cGFyZW50Tm9kZSgpOwotICAgIHdo
aWxlIChtX2FjdGl2ZU5vZGUgJiYgIW1fYWN0aXZlTm9kZS0+cmVuZGVyZXIoKSkKLSAgICAgICAg
bV9hY3RpdmVOb2RlID0gbV9hY3RpdmVOb2RlLT5wYXJlbnROb2RlKCk7Ci19Ci0KLSNpZiBFTkFC
TEUoREFTSEJPQVJEX1NVUFBPUlQpIHx8IEVOQUJMRShXSURHRVRfUkVHSU9OKQotY29uc3QgVmVj
dG9yPERhc2hib2FyZFJlZ2lvblZhbHVlPiYgRG9jdW1lbnQ6OmRhc2hib2FyZFJlZ2lvbnMoKSBj
b25zdAotewotICAgIHJldHVybiBtX2Rhc2hib2FyZFJlZ2lvbnM7Ci19Ci0KLXZvaWQgRG9jdW1l
bnQ6OnNldERhc2hib2FyZFJlZ2lvbnMoY29uc3QgVmVjdG9yPERhc2hib2FyZFJlZ2lvblZhbHVl
PiYgcmVnaW9ucykKLXsKLSAgICBtX2Rhc2hib2FyZFJlZ2lvbnMgPSByZWdpb25zOwotICAgIHNl
dERhc2hib2FyZFJlZ2lvbnNEaXJ0eShmYWxzZSk7Ci19Ci0jZW5kaWYKLQotYm9vbCBEb2N1bWVu
dDo6c2V0Rm9jdXNlZE5vZGUoUGFzc1JlZlB0cjxOb2RlPiBwcnBOZXdGb2N1c2VkTm9kZSkKLXsK
LSAgICBSZWZQdHI8Tm9kZT4gbmV3Rm9jdXNlZE5vZGUgPSBwcnBOZXdGb2N1c2VkTm9kZTsKLQot
ICAgIC8vIE1ha2Ugc3VyZSBuZXdGb2N1c2VkTm9kZSBpcyBhY3R1YWxseSBpbiB0aGlzIGRvY3Vt
ZW50Ci0gICAgaWYgKG5ld0ZvY3VzZWROb2RlICYmIChuZXdGb2N1c2VkTm9kZS0+ZG9jdW1lbnQo
KSAhPSB0aGlzKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBpZiAobV9mb2N1c2VkTm9k
ZSA9PSBuZXdGb2N1c2VkTm9kZSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBpZiAobV9p
blBhZ2VDYWNoZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgYm9vbCBmb2N1c0NoYW5n
ZUJsb2NrZWQgPSBmYWxzZTsKLSAgICBSZWZQdHI8Tm9kZT4gb2xkRm9jdXNlZE5vZGUgPSBtX2Zv
Y3VzZWROb2RlOwotICAgIG1fZm9jdXNlZE5vZGUgPSAwOwotCi0gICAgLy8gUmVtb3ZlIGZvY3Vz
IGZyb20gdGhlIGV4aXN0aW5nIGZvY3VzIG5vZGUgKGlmIGFueSkKLSAgICBpZiAob2xkRm9jdXNl
ZE5vZGUpIHsKLSAgICAgICAgQVNTRVJUKCFvbGRGb2N1c2VkTm9kZS0+aW5EZXRhY2goKSk7Ci0K
LSAgICAgICAgaWYgKG9sZEZvY3VzZWROb2RlLT5hY3RpdmUoKSkKLSAgICAgICAgICAgIG9sZEZv
Y3VzZWROb2RlLT5zZXRBY3RpdmUoZmFsc2UpOwotCi0gICAgICAgIG9sZEZvY3VzZWROb2RlLT5z
ZXRGb2N1cyhmYWxzZSk7Ci0KLSAgICAgICAgLy8gRGlzcGF0Y2ggYSBjaGFuZ2UgZXZlbnQgZm9y
IHRleHQgZmllbGRzIG9yIHRleHRhcmVhcyB0aGF0IGhhdmUgYmVlbiBlZGl0ZWQKLSAgICAgICAg
aWYgKG9sZEZvY3VzZWROb2RlLT5pc0VsZW1lbnROb2RlKCkpIHsKLSAgICAgICAgICAgIEVsZW1l
bnQqIGVsZW1lbnQgPSBzdGF0aWNfY2FzdDxFbGVtZW50Kj4ob2xkRm9jdXNlZE5vZGUuZ2V0KCkp
OwotICAgICAgICAgICAgaWYgKGVsZW1lbnQtPndhc0NoYW5nZWRTaW5jZUxhc3RGb3JtQ29udHJv
bENoYW5nZUV2ZW50KCkpCi0gICAgICAgICAgICAgICAgZWxlbWVudC0+ZGlzcGF0Y2hGb3JtQ29u
dHJvbENoYW5nZUV2ZW50KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBEaXNwYXRjaCB0aGUg
Ymx1ciBldmVudCBhbmQgbGV0IHRoZSBub2RlIGRvIGFueSBvdGhlciBibHVyIHJlbGF0ZWQgYWN0
aXZpdGllcyAoaW1wb3J0YW50IGZvciB0ZXh0IGZpZWxkcykKLSAgICAgICAgb2xkRm9jdXNlZE5v
ZGUtPmRpc3BhdGNoQmx1ckV2ZW50KG5ld0ZvY3VzZWROb2RlKTsKLQotICAgICAgICBpZiAobV9m
b2N1c2VkTm9kZSkgewotICAgICAgICAgICAgLy8gaGFuZGxlciBzaGlmdGVkIGZvY3VzCi0gICAg
ICAgICAgICBmb2N1c0NoYW5nZUJsb2NrZWQgPSB0cnVlOwotICAgICAgICAgICAgbmV3Rm9jdXNl
ZE5vZGUgPSAwOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBvbGRGb2N1c2VkTm9kZS0+
ZGlzcGF0Y2hGb2N1c091dEV2ZW50KGV2ZW50TmFtZXMoKS5mb2N1c291dEV2ZW50LCBuZXdGb2N1
c2VkTm9kZSk7IC8vIERPTSBsZXZlbCAzIG5hbWUgZm9yIHRoZSBidWJibGluZyBibHVyIGV2ZW50
LgotICAgICAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIHJlbW92ZSBmaXJpbmcgRE9NRm9jdXNPdXRF
dmVudCBldmVudCB3aGVuIHdlIGFyZSBzdXJlIG5vIGNvbnRlbnQgZGVwZW5kcwotICAgICAgICAv
LyBvbiBpdCwgcHJvYmFibHkgd2hlbiA8cmRhcjovL3Byb2JsZW0vODUwMzk1OD4gaXMgcmVzb2x2
ZWQuCi0gICAgICAgIG9sZEZvY3VzZWROb2RlLT5kaXNwYXRjaEZvY3VzT3V0RXZlbnQoZXZlbnRO
YW1lcygpLkRPTUZvY3VzT3V0RXZlbnQsIG5ld0ZvY3VzZWROb2RlKTsgLy8gRE9NIGxldmVsIDIg
bmFtZSBmb3IgY29tcGF0aWJpbGl0eS4KLQotICAgICAgICBpZiAobV9mb2N1c2VkTm9kZSkgewot
ICAgICAgICAgICAgLy8gaGFuZGxlciBzaGlmdGVkIGZvY3VzCi0gICAgICAgICAgICBmb2N1c0No
YW5nZUJsb2NrZWQgPSB0cnVlOwotICAgICAgICAgICAgbmV3Rm9jdXNlZE5vZGUgPSAwOwotICAg
ICAgICB9Ci0gICAgICAgIGlmIChvbGRGb2N1c2VkTm9kZSA9PSB0aGlzICYmIG9sZEZvY3VzZWRO
b2RlLT5oYXNPbmVSZWYoKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAg
Ci0gICAgICAgIGlmIChvbGRGb2N1c2VkTm9kZS0+aXNSb290RWRpdGFibGVFbGVtZW50KCkpCi0g
ICAgICAgICAgICBmcmFtZSgpLT5lZGl0b3IoKS0+ZGlkRW5kRWRpdGluZygpOwotCi0gICAgICAg
IGlmICh2aWV3KCkpIHsKLSAgICAgICAgICAgIFdpZGdldCogb2xkV2lkZ2V0ID0gd2lkZ2V0Rm9y
Tm9kZShvbGRGb2N1c2VkTm9kZS5nZXQoKSk7Ci0gICAgICAgICAgICBpZiAob2xkV2lkZ2V0KQot
ICAgICAgICAgICAgICAgIG9sZFdpZGdldC0+c2V0Rm9jdXMoZmFsc2UpOwotICAgICAgICAgICAg
ZWxzZQotICAgICAgICAgICAgICAgIHZpZXcoKS0+c2V0Rm9jdXMoZmFsc2UpOwotICAgICAgICB9
Ci0gICAgfQotCi0gICAgaWYgKG5ld0ZvY3VzZWROb2RlKSB7Ci0gICAgICAgIGlmIChuZXdGb2N1
c2VkTm9kZS0+aXNSb290RWRpdGFibGVFbGVtZW50KCkgJiYgIWFjY2VwdHNFZGl0aW5nRm9jdXMo
bmV3Rm9jdXNlZE5vZGUuZ2V0KCkpKSB7Ci0gICAgICAgICAgICAvLyBkZWxlZ2F0ZSBibG9ja3Mg
Zm9jdXMgY2hhbmdlCi0gICAgICAgICAgICBmb2N1c0NoYW5nZUJsb2NrZWQgPSB0cnVlOwotICAg
ICAgICAgICAgZ290byBTZXRGb2N1c2VkTm9kZURvbmU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8g
U2V0IGZvY3VzIG9uIHRoZSBuZXcgbm9kZQotICAgICAgICBtX2ZvY3VzZWROb2RlID0gbmV3Rm9j
dXNlZE5vZGU7Ci0KLSAgICAgICAgLy8gRGlzcGF0Y2ggdGhlIGZvY3VzIGV2ZW50IGFuZCBsZXQg
dGhlIG5vZGUgZG8gYW55IG90aGVyIGZvY3VzIHJlbGF0ZWQgYWN0aXZpdGllcyAoaW1wb3J0YW50
IGZvciB0ZXh0IGZpZWxkcykKLSAgICAgICAgbV9mb2N1c2VkTm9kZS0+ZGlzcGF0Y2hGb2N1c0V2
ZW50KG9sZEZvY3VzZWROb2RlKTsKLQotICAgICAgICBpZiAobV9mb2N1c2VkTm9kZSAhPSBuZXdG
b2N1c2VkTm9kZSkgewotICAgICAgICAgICAgLy8gaGFuZGxlciBzaGlmdGVkIGZvY3VzCi0gICAg
ICAgICAgICBmb2N1c0NoYW5nZUJsb2NrZWQgPSB0cnVlOwotICAgICAgICAgICAgZ290byBTZXRG
b2N1c2VkTm9kZURvbmU7Ci0gICAgICAgIH0KLQotICAgICAgICBtX2ZvY3VzZWROb2RlLT5kaXNw
YXRjaEZvY3VzSW5FdmVudChldmVudE5hbWVzKCkuZm9jdXNpbkV2ZW50LCBvbGRGb2N1c2VkTm9k
ZSk7IC8vIERPTSBsZXZlbCAzIGJ1YmJsaW5nIGZvY3VzIGV2ZW50LgotCi0gICAgICAgIGlmICht
X2ZvY3VzZWROb2RlICE9IG5ld0ZvY3VzZWROb2RlKSB7Ci0gICAgICAgICAgICAvLyBoYW5kbGVy
IHNoaWZ0ZWQgZm9jdXMKLSAgICAgICAgICAgIGZvY3VzQ2hhbmdlQmxvY2tlZCA9IHRydWU7Ci0g
ICAgICAgICAgICBnb3RvIFNldEZvY3VzZWROb2RlRG9uZTsKLSAgICAgICAgfQotCi0gICAgICAg
IC8vIEZJWE1FOiBXZSBzaG91bGQgcmVtb3ZlIGZpcmluZyBET01Gb2N1c0luRXZlbnQgZXZlbnQg
d2hlbiB3ZSBhcmUgc3VyZSBubyBjb250ZW50IGRlcGVuZHMKLSAgICAgICAgLy8gb24gaXQsIHBy
b2JhYmx5IHdoZW4gPHJkYXI6Ly9wcm9ibGVtLzg1MDM5NTg+IGlzIG0uCi0gICAgICAgIG1fZm9j
dXNlZE5vZGUtPmRpc3BhdGNoRm9jdXNJbkV2ZW50KGV2ZW50TmFtZXMoKS5ET01Gb2N1c0luRXZl
bnQsIG9sZEZvY3VzZWROb2RlKTsgLy8gRE9NIGxldmVsIDIgZm9yIGNvbXBhdGliaWxpdHkuCi0K
LSAgICAgICAgaWYgKG1fZm9jdXNlZE5vZGUgIT0gbmV3Rm9jdXNlZE5vZGUpIHsgCi0gICAgICAg
ICAgICAvLyBoYW5kbGVyIHNoaWZ0ZWQgZm9jdXMKLSAgICAgICAgICAgIGZvY3VzQ2hhbmdlQmxv
Y2tlZCA9IHRydWU7Ci0gICAgICAgICAgICBnb3RvIFNldEZvY3VzZWROb2RlRG9uZTsKLSAgICAg
ICAgfQotICAgICAgICBtX2ZvY3VzZWROb2RlLT5zZXRGb2N1cyh0cnVlKTsKLQotICAgICAgICBp
ZiAobV9mb2N1c2VkTm9kZS0+aXNSb290RWRpdGFibGVFbGVtZW50KCkpCi0gICAgICAgICAgICBm
cmFtZSgpLT5lZGl0b3IoKS0+ZGlkQmVnaW5FZGl0aW5nKCk7Ci0KLSAgICAgICAgLy8gZXd3LCBJ
IHN1Y2suIHNldCB0aGUgcXQgZm9jdXMgY29ycmVjdGx5Ci0gICAgICAgIC8vICMjIyBmaW5kIGEg
YmV0dGVyIHBsYWNlIGluIHRoZSBjb2RlIGZvciB0aGlzCi0gICAgICAgIGlmICh2aWV3KCkpIHsK
LSAgICAgICAgICAgIFdpZGdldCogZm9jdXNXaWRnZXQgPSB3aWRnZXRGb3JOb2RlKG1fZm9jdXNl
ZE5vZGUuZ2V0KCkpOwotICAgICAgICAgICAgaWYgKGZvY3VzV2lkZ2V0KSB7Ci0gICAgICAgICAg
ICAgICAgLy8gTWFrZSBzdXJlIGEgd2lkZ2V0IGhhcyB0aGUgcmlnaHQgc2l6ZSBiZWZvcmUgZ2l2
aW5nIGl0IGZvY3VzLgotICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgd2UgYXJlIHRlc3Rp
bmcgZWRnZSBjYXNlcyBvZiB0aGUgV2lkZ2V0IGNvZGUuCi0gICAgICAgICAgICAgICAgLy8gU3Bl
Y2lmaWNhbGx5LCBpbiBXZWJDb3JlIHRoaXMgZG9lcyBub3Qgd29yayB3ZWxsIGZvciB0ZXh0IGZp
ZWxkcy4KLSAgICAgICAgICAgICAgICB1cGRhdGVMYXlvdXQoKTsKLSAgICAgICAgICAgICAgICAv
LyBSZS1nZXQgdGhlIHdpZGdldCBpbiBjYXNlIHVwZGF0aW5nIHRoZSBsYXlvdXQgY2hhbmdlZCB0
aGluZ3MuCi0gICAgICAgICAgICAgICAgZm9jdXNXaWRnZXQgPSB3aWRnZXRGb3JOb2RlKG1fZm9j
dXNlZE5vZGUuZ2V0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGZvY3VzV2lk
Z2V0KQotICAgICAgICAgICAgICAgIGZvY3VzV2lkZ2V0LT5zZXRGb2N1cyh0cnVlKTsKLSAgICAg
ICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB2aWV3KCktPnNldEZvY3VzKHRydWUpOwotICAg
ICAgICB9Ci0gICAgfQotCi0jaWYgUExBVEZPUk0oTUFDKSB8fCBQTEFURk9STShXSU4pIHx8IFBM
QVRGT1JNKEdUSykgfHwgUExBVEZPUk0oQ0hST01JVU0pCi0gICAgaWYgKCFmb2N1c0NoYW5nZUJs
b2NrZWQgJiYgbV9mb2N1c2VkTm9kZSAmJiBBWE9iamVjdENhY2hlOjphY2Nlc3NpYmlsaXR5RW5h
YmxlZCgpKQotICAgICAgICBheE9iamVjdENhY2hlKCktPmhhbmRsZUZvY3VzZWRVSUVsZW1lbnRD
aGFuZ2VkKG9sZEZvY3VzZWROb2RlLmdldCgpLCBuZXdGb2N1c2VkTm9kZS5nZXQoKSk7Ci0jZW5k
aWYKLSAgICBpZiAoIWZvY3VzQ2hhbmdlQmxvY2tlZCkKLSAgICAgICAgcGFnZSgpLT5jaHJvbWUo
KS0+Zm9jdXNlZE5vZGVDaGFuZ2VkKG1fZm9jdXNlZE5vZGUuZ2V0KCkpOwotCi1TZXRGb2N1c2Vk
Tm9kZURvbmU6Ci0gICAgdXBkYXRlU3R5bGVJZk5lZWRlZCgpOwotICAgIHJldHVybiAhZm9jdXND
aGFuZ2VCbG9ja2VkOwotfQotICAgIAotdm9pZCBEb2N1bWVudDo6Z2V0Rm9jdXNhYmxlTm9kZXMo
VmVjdG9yPFJlZlB0cjxOb2RlPiA+JiBub2RlcykKLXsKLSAgICB1cGRhdGVMYXlvdXQoKTsKLQot
ICAgIGZvciAoTm9kZSogbm9kZSA9IGZpcnN0Q2hpbGQoKTsgbm9kZTsgbm9kZSA9IG5vZGUtPnRy
YXZlcnNlTmV4dE5vZGUoKSkgewotICAgICAgICBpZiAobm9kZS0+aXNGb2N1c2FibGUoKSkKLSAg
ICAgICAgICAgIG5vZGVzLmFwcGVuZChub2RlKTsKLSAgICB9Ci19Ci0gIAotdm9pZCBEb2N1bWVu
dDo6c2V0Q1NTVGFyZ2V0KEVsZW1lbnQqIG4pCi17Ci0gICAgaWYgKG1fY3NzVGFyZ2V0KQotICAg
ICAgICBtX2Nzc1RhcmdldC0+c2V0TmVlZHNTdHlsZVJlY2FsYygpOwotICAgIG1fY3NzVGFyZ2V0
ID0gbjsKLSAgICBpZiAobikKLSAgICAgICAgbi0+c2V0TmVlZHNTdHlsZVJlY2FsYygpOwotfQot
Ci12b2lkIERvY3VtZW50OjpyZWdpc3Rlck5vZGVMaXN0Q2FjaGUoRHluYW1pY05vZGVMaXN0Q2Fj
aGVCYXNlKiBsaXN0KQotewotICAgIGlmIChsaXN0LT50eXBlKCkgIT0gTm9kZUxpc3RDb2xsZWN0
aW9uVHlwZSkKLSAgICAgICAgbV9ub2RlTGlzdENvdW50c1tJbnZhbGlkYXRlT25JZE5hbWVBdHRy
Q2hhbmdlXSsrOwotICAgIG1fbm9kZUxpc3RDb3VudHNbbGlzdC0+aW52YWxpZGF0aW9uVHlwZSgp
XSsrOwotICAgIGlmIChsaXN0LT5pc1Jvb3RlZEF0RG9jdW1lbnQoKSkKLSAgICAgICAgbV9saXN0
c0ludmFsaWRhdGVkQXREb2N1bWVudC5hZGQobGlzdCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnVu
cmVnaXN0ZXJOb2RlTGlzdENhY2hlKER5bmFtaWNOb2RlTGlzdENhY2hlQmFzZSogbGlzdCkKLXsK
LSAgICBpZiAobGlzdC0+dHlwZSgpICE9IE5vZGVMaXN0Q29sbGVjdGlvblR5cGUpCi0gICAgICAg
IG1fbm9kZUxpc3RDb3VudHNbSW52YWxpZGF0ZU9uSWROYW1lQXR0ckNoYW5nZV0tLTsKLSAgICBt
X25vZGVMaXN0Q291bnRzW2xpc3QtPmludmFsaWRhdGlvblR5cGUoKV0tLTsKLSAgICBpZiAobGlz
dC0+aXNSb290ZWRBdERvY3VtZW50KCkpIHsKLSAgICAgICAgQVNTRVJUKG1fbGlzdHNJbnZhbGlk
YXRlZEF0RG9jdW1lbnQuY29udGFpbnMobGlzdCkpOwotICAgICAgICBtX2xpc3RzSW52YWxpZGF0
ZWRBdERvY3VtZW50LnJlbW92ZShsaXN0KTsKLSAgICB9Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmF0
dGFjaE5vZGVJdGVyYXRvcihOb2RlSXRlcmF0b3IqIG5pKQotewotICAgIG1fbm9kZUl0ZXJhdG9y
cy5hZGQobmkpOwotfQotCi12b2lkIERvY3VtZW50OjpkZXRhY2hOb2RlSXRlcmF0b3IoTm9kZUl0
ZXJhdG9yKiBuaSkKLXsKLSAgICAvLyBUaGUgbm9kZSBpdGVyYXRvciBjYW4gYmUgZGV0YWNoZWQg
d2l0aG91dCBoYXZpbmcgYmVlbiBhdHRhY2hlZCBpZiBpdHMgcm9vdCBub2RlIGRpZG4ndCBoYXZl
IGEgZG9jdW1lbnQKLSAgICAvLyB3aGVuIHRoZSBpdGVyYXRvciB3YXMgY3JlYXRlZCwgYnV0IGhh
cyBpdCBub3cuCi0gICAgbV9ub2RlSXRlcmF0b3JzLnJlbW92ZShuaSk7Ci19Ci0KLXZvaWQgRG9j
dW1lbnQ6Om1vdmVOb2RlSXRlcmF0b3JzVG9OZXdEb2N1bWVudChOb2RlKiBub2RlLCBEb2N1bWVu
dCogbmV3RG9jdW1lbnQpCi17Ci0gICAgSGFzaFNldDxOb2RlSXRlcmF0b3IqPiBub2RlSXRlcmF0
b3JzTGlzdCA9IG1fbm9kZUl0ZXJhdG9yczsKLSAgICBIYXNoU2V0PE5vZGVJdGVyYXRvcio+Ojpj
b25zdF9pdGVyYXRvciBub2RlSXRlcmF0b3JzRW5kID0gbm9kZUl0ZXJhdG9yc0xpc3QuZW5kKCk7
Ci0gICAgZm9yIChIYXNoU2V0PE5vZGVJdGVyYXRvcio+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG5v
ZGVJdGVyYXRvcnNMaXN0LmJlZ2luKCk7IGl0ICE9IG5vZGVJdGVyYXRvcnNFbmQ7ICsraXQpIHsK
LSAgICAgICAgaWYgKCgqaXQpLT5yb290KCkgPT0gbm9kZSkgewotICAgICAgICAgICAgZGV0YWNo
Tm9kZUl0ZXJhdG9yKCppdCk7Ci0gICAgICAgICAgICBuZXdEb2N1bWVudC0+YXR0YWNoTm9kZUl0
ZXJhdG9yKCppdCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnVwZGF0
ZVJhbmdlc0FmdGVyQ2hpbGRyZW5DaGFuZ2VkKENvbnRhaW5lck5vZGUqIGNvbnRhaW5lcikKLXsK
LSAgICBpZiAoIW1fcmFuZ2VzLmlzRW1wdHkoKSkgewotICAgICAgICBIYXNoU2V0PFJhbmdlKj46
OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fcmFuZ2VzLmVuZCgpOwotICAgICAgICBmb3IgKEhhc2hT
ZXQ8UmFuZ2UqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3Jhbmdlcy5iZWdpbigpOyBpdCAhPSBl
bmQ7ICsraXQpCi0gICAgICAgICAgICAoKml0KS0+bm9kZUNoaWxkcmVuQ2hhbmdlZChjb250YWlu
ZXIpOwotICAgIH0KLX0KLQotdm9pZCBEb2N1bWVudDo6bm9kZUNoaWxkcmVuV2lsbEJlUmVtb3Zl
ZChDb250YWluZXJOb2RlKiBjb250YWluZXIpCi17Ci0gICAgaWYgKCFtX3Jhbmdlcy5pc0VtcHR5
KCkpIHsKLSAgICAgICAgSGFzaFNldDxSYW5nZSo+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBtX3Jh
bmdlcy5lbmQoKTsKLSAgICAgICAgZm9yIChIYXNoU2V0PFJhbmdlKj46OmNvbnN0X2l0ZXJhdG9y
IGl0ID0gbV9yYW5nZXMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KQotICAgICAgICAgICAgKCpp
dCktPm5vZGVDaGlsZHJlbldpbGxCZVJlbW92ZWQoY29udGFpbmVyKTsKLSAgICB9Ci0KLSAgICBI
YXNoU2V0PE5vZGVJdGVyYXRvcio+Ojpjb25zdF9pdGVyYXRvciBub2RlSXRlcmF0b3JzRW5kID0g
bV9ub2RlSXRlcmF0b3JzLmVuZCgpOwotICAgIGZvciAoSGFzaFNldDxOb2RlSXRlcmF0b3IqPjo6
Y29uc3RfaXRlcmF0b3IgaXQgPSBtX25vZGVJdGVyYXRvcnMuYmVnaW4oKTsgaXQgIT0gbm9kZUl0
ZXJhdG9yc0VuZDsgKytpdCkgewotICAgICAgICBmb3IgKE5vZGUqIG4gPSBjb250YWluZXItPmZp
cnN0Q2hpbGQoKTsgbjsgbiA9IG4tPm5leHRTaWJsaW5nKCkpCi0gICAgICAgICAgICAoKml0KS0+
bm9kZVdpbGxCZVJlbW92ZWQobik7Ci0gICAgfQotCi0gICAgaWYgKEZyYW1lKiBmcmFtZSA9IHRo
aXMtPmZyYW1lKCkpIHsKLSAgICAgICAgZm9yIChOb2RlKiBuID0gY29udGFpbmVyLT5maXJzdENo
aWxkKCk7IG47IG4gPSBuLT5uZXh0U2libGluZygpKSB7Ci0gICAgICAgICAgICBmcmFtZS0+ZXZl
bnRIYW5kbGVyKCktPm5vZGVXaWxsQmVSZW1vdmVkKG4pOwotICAgICAgICAgICAgZnJhbWUtPnNl
bGVjdGlvbigpLT5ub2RlV2lsbEJlUmVtb3ZlZChuKTsKLSAgICAgICAgICAgIGZyYW1lLT5wYWdl
KCktPmRyYWdDYXJldENvbnRyb2xsZXIoKS0+bm9kZVdpbGxCZVJlbW92ZWQobik7Ci0gICAgICAg
IH0KLSAgICB9Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6Om5vZGVXaWxsQmVSZW1vdmVkKE5vZGUqIG4p
Ci17Ci0gICAgSGFzaFNldDxOb2RlSXRlcmF0b3IqPjo6Y29uc3RfaXRlcmF0b3Igbm9kZUl0ZXJh
dG9yc0VuZCA9IG1fbm9kZUl0ZXJhdG9ycy5lbmQoKTsKLSAgICBmb3IgKEhhc2hTZXQ8Tm9kZUl0
ZXJhdG9yKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9ub2RlSXRlcmF0b3JzLmJlZ2luKCk7IGl0
ICE9IG5vZGVJdGVyYXRvcnNFbmQ7ICsraXQpCi0gICAgICAgICgqaXQpLT5ub2RlV2lsbEJlUmVt
b3ZlZChuKTsKLQotICAgIGlmICghbV9yYW5nZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIEhhc2hT
ZXQ8UmFuZ2UqPjo6Y29uc3RfaXRlcmF0b3IgcmFuZ2VzRW5kID0gbV9yYW5nZXMuZW5kKCk7Ci0g
ICAgICAgIGZvciAoSGFzaFNldDxSYW5nZSo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmFuZ2Vz
LmJlZ2luKCk7IGl0ICE9IHJhbmdlc0VuZDsgKytpdCkKLSAgICAgICAgICAgICgqaXQpLT5ub2Rl
V2lsbEJlUmVtb3ZlZChuKTsKLSAgICB9Ci0KLSAgICBpZiAoRnJhbWUqIGZyYW1lID0gdGhpcy0+
ZnJhbWUoKSkgewotICAgICAgICBmcmFtZS0+ZXZlbnRIYW5kbGVyKCktPm5vZGVXaWxsQmVSZW1v
dmVkKG4pOwotICAgICAgICBmcmFtZS0+c2VsZWN0aW9uKCktPm5vZGVXaWxsQmVSZW1vdmVkKG4p
OwotICAgICAgICBmcmFtZS0+cGFnZSgpLT5kcmFnQ2FyZXRDb250cm9sbGVyKCktPm5vZGVXaWxs
QmVSZW1vdmVkKG4pOwotICAgIH0KLX0KLQotdm9pZCBEb2N1bWVudDo6dGV4dEluc2VydGVkKE5v
ZGUqIHRleHQsIHVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgbGVuZ3RoKQotewotICAgIGlmICgh
bV9yYW5nZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIEhhc2hTZXQ8UmFuZ2UqPjo6Y29uc3RfaXRl
cmF0b3IgZW5kID0gbV9yYW5nZXMuZW5kKCk7Ci0gICAgICAgIGZvciAoSGFzaFNldDxSYW5nZSo+
Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmFuZ2VzLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkK
LSAgICAgICAgICAgICgqaXQpLT50ZXh0SW5zZXJ0ZWQodGV4dCwgb2Zmc2V0LCBsZW5ndGgpOwot
ICAgIH0KLQotICAgIC8vIFVwZGF0ZSB0aGUgbWFya2VycyBmb3Igc3BlbGxpbmcgYW5kIGdyYW1t
YXIgY2hlY2tpbmcuCi0gICAgbV9tYXJrZXJzLT5zaGlmdE1hcmtlcnModGV4dCwgb2Zmc2V0LCBs
ZW5ndGgpOwotfQotCi12b2lkIERvY3VtZW50Ojp0ZXh0UmVtb3ZlZChOb2RlKiB0ZXh0LCB1bnNp
Z25lZCBvZmZzZXQsIHVuc2lnbmVkIGxlbmd0aCkKLXsKLSAgICBpZiAoIW1fcmFuZ2VzLmlzRW1w
dHkoKSkgewotICAgICAgICBIYXNoU2V0PFJhbmdlKj46OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1f
cmFuZ2VzLmVuZCgpOwotICAgICAgICBmb3IgKEhhc2hTZXQ8UmFuZ2UqPjo6Y29uc3RfaXRlcmF0
b3IgaXQgPSBtX3Jhbmdlcy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpCi0gICAgICAgICAgICAo
Kml0KS0+dGV4dFJlbW92ZWQodGV4dCwgb2Zmc2V0LCBsZW5ndGgpOwotICAgIH0KLQotICAgIC8v
IFVwZGF0ZSB0aGUgbWFya2VycyBmb3Igc3BlbGxpbmcgYW5kIGdyYW1tYXIgY2hlY2tpbmcuCi0g
ICAgbV9tYXJrZXJzLT5yZW1vdmVNYXJrZXJzKHRleHQsIG9mZnNldCwgbGVuZ3RoKTsKLSAgICBt
X21hcmtlcnMtPnNoaWZ0TWFya2Vycyh0ZXh0LCBvZmZzZXQgKyBsZW5ndGgsIDAgLSBsZW5ndGgp
OwotfQotCi12b2lkIERvY3VtZW50Ojp0ZXh0Tm9kZXNNZXJnZWQoVGV4dCogb2xkTm9kZSwgdW5z
aWduZWQgb2Zmc2V0KQotewotICAgIGlmICghbV9yYW5nZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAg
IE5vZGVXaXRoSW5kZXggb2xkTm9kZVdpdGhJbmRleChvbGROb2RlKTsKLSAgICAgICAgSGFzaFNl
dDxSYW5nZSo+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBtX3Jhbmdlcy5lbmQoKTsKLSAgICAgICAg
Zm9yIChIYXNoU2V0PFJhbmdlKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yYW5nZXMuYmVnaW4o
KTsgaXQgIT0gZW5kOyArK2l0KQotICAgICAgICAgICAgKCppdCktPnRleHROb2Rlc01lcmdlZChv
bGROb2RlV2l0aEluZGV4LCBvZmZzZXQpOwotICAgIH0KLQotICAgIC8vIEZJWE1FOiBUaGlzIHNo
b3VsZCB1cGRhdGUgbWFya2VycyBmb3Igc3BlbGxpbmcgYW5kIGdyYW1tYXIgY2hlY2tpbmcuCi19
Ci0KLXZvaWQgRG9jdW1lbnQ6OnRleHROb2RlU3BsaXQoVGV4dCogb2xkTm9kZSkKLXsKLSAgICBp
ZiAoIW1fcmFuZ2VzLmlzRW1wdHkoKSkgewotICAgICAgICBIYXNoU2V0PFJhbmdlKj46OmNvbnN0
X2l0ZXJhdG9yIGVuZCA9IG1fcmFuZ2VzLmVuZCgpOwotICAgICAgICBmb3IgKEhhc2hTZXQ8UmFu
Z2UqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3Jhbmdlcy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsr
aXQpCi0gICAgICAgICAgICAoKml0KS0+dGV4dE5vZGVTcGxpdChvbGROb2RlKTsKLSAgICB9Ci0K
LSAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgdXBkYXRlIG1hcmtlcnMgZm9yIHNwZWxsaW5nIGFu
ZCBncmFtbWFyIGNoZWNraW5nLgotfQotCi12b2lkIERvY3VtZW50OjpjcmVhdGVET01XaW5kb3co
KQotewotICAgIEFTU0VSVChtX2ZyYW1lKTsKLSAgICBBU1NFUlQoIW1fZG9tV2luZG93KTsKLQot
ICAgIG1fZG9tV2luZG93ID0gRE9NV2luZG93OjpjcmVhdGUodGhpcyk7Ci0KLSAgICBBU1NFUlQo
bV9kb21XaW5kb3ctPmRvY3VtZW50KCkgPT0gdGhpcyk7Ci0gICAgQVNTRVJUKG1fZG9tV2luZG93
LT5mcmFtZSgpID09IG1fZnJhbWUpOwotfQotCi12b2lkIERvY3VtZW50Ojp0YWtlRE9NV2luZG93
RnJvbShEb2N1bWVudCogZG9jdW1lbnQpCi17Ci0gICAgQVNTRVJUKG1fZnJhbWUpOwotICAgIEFT
U0VSVCghbV9kb21XaW5kb3cpOwotICAgIEFTU0VSVChkb2N1bWVudC0+ZG9tV2luZG93KCkpOwot
Ci0gICAgbV9kb21XaW5kb3cgPSBkb2N1bWVudC0+bV9kb21XaW5kb3cucmVsZWFzZSgpOwotICAg
IG1fZG9tV2luZG93LT5kaWRTZWN1cmVUcmFuc2l0aW9uVG8odGhpcyk7Ci0KLSAgICBBU1NFUlQo
bV9kb21XaW5kb3ctPmRvY3VtZW50KCkgPT0gdGhpcyk7Ci0gICAgQVNTRVJUKG1fZG9tV2luZG93
LT5mcmFtZSgpID09IG1fZnJhbWUpOwotfQotCi12b2lkIERvY3VtZW50OjpzZXRXaW5kb3dBdHRy
aWJ1dGVFdmVudExpc3RlbmVyKGNvbnN0IEF0b21pY1N0cmluZyYgZXZlbnRUeXBlLCBQYXNzUmVm
UHRyPEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyKQotewotICAgIERPTVdpbmRvdyogZG9tV2luZG93
ID0gdGhpcy0+ZG9tV2luZG93KCk7Ci0gICAgaWYgKCFkb21XaW5kb3cpCi0gICAgICAgIHJldHVy
bjsKLSAgICBkb21XaW5kb3ctPnNldEF0dHJpYnV0ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBs
aXN0ZW5lcik7Ci19Ci0KLUV2ZW50TGlzdGVuZXIqIERvY3VtZW50OjpnZXRXaW5kb3dBdHRyaWJ1
dGVFdmVudExpc3RlbmVyKGNvbnN0IEF0b21pY1N0cmluZyYgZXZlbnRUeXBlKQotewotICAgIERP
TVdpbmRvdyogZG9tV2luZG93ID0gdGhpcy0+ZG9tV2luZG93KCk7Ci0gICAgaWYgKCFkb21XaW5k
b3cpCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiBkb21XaW5kb3ctPmdldEF0dHJpYnV0
ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6ZGlzcGF0Y2hX
aW5kb3dFdmVudChQYXNzUmVmUHRyPEV2ZW50PiBldmVudCwgIFBhc3NSZWZQdHI8RXZlbnRUYXJn
ZXQ+IHRhcmdldCkKLXsKLSAgICBBU1NFUlQoIWV2ZW50RGlzcGF0Y2hGb3JiaWRkZW4oKSk7Ci0g
ICAgRE9NV2luZG93KiBkb21XaW5kb3cgPSB0aGlzLT5kb21XaW5kb3coKTsKLSAgICBpZiAoIWRv
bVdpbmRvdykKLSAgICAgICAgcmV0dXJuOwotICAgIGRvbVdpbmRvdy0+ZGlzcGF0Y2hFdmVudChl
dmVudCwgdGFyZ2V0KTsKLX0KLQotdm9pZCBEb2N1bWVudDo6ZGlzcGF0Y2hXaW5kb3dMb2FkRXZl
bnQoKQotewotICAgIEFTU0VSVCghZXZlbnREaXNwYXRjaEZvcmJpZGRlbigpKTsKLSAgICBET01X
aW5kb3cqIGRvbVdpbmRvdyA9IHRoaXMtPmRvbVdpbmRvdygpOwotICAgIGlmICghZG9tV2luZG93
KQotICAgICAgICByZXR1cm47Ci0gICAgZG9tV2luZG93LT5kaXNwYXRjaExvYWRFdmVudCgpOwot
ICAgIG1fbG9hZEV2ZW50RmluaXNoZWQgPSB0cnVlOwotfQotCi12b2lkIERvY3VtZW50OjplbnF1
ZXVlV2luZG93RXZlbnQoUGFzc1JlZlB0cjxFdmVudD4gZXZlbnQpCi17Ci0gICAgZXZlbnQtPnNl
dFRhcmdldChkb21XaW5kb3coKSk7Ci0gICAgbV9ldmVudFF1ZXVlLT5lbnF1ZXVlRXZlbnQoZXZl
bnQpOwotfQotCi12b2lkIERvY3VtZW50OjplbnF1ZXVlRG9jdW1lbnRFdmVudChQYXNzUmVmUHRy
PEV2ZW50PiBldmVudCkKLXsKLSAgICBldmVudC0+c2V0VGFyZ2V0KHRoaXMpOwotICAgIG1fZXZl
bnRRdWV1ZS0+ZW5xdWV1ZUV2ZW50KGV2ZW50KTsKLX0KLQotUGFzc1JlZlB0cjxFdmVudD4gRG9j
dW1lbnQ6OmNyZWF0ZUV2ZW50KGNvbnN0IFN0cmluZyYgZXZlbnRUeXBlLCBFeGNlcHRpb25Db2Rl
JiBlYykKLXsKLSAgICBSZWZQdHI8RXZlbnQ+IGV2ZW50ID0gRXZlbnRGYWN0b3J5OjpjcmVhdGUo
ZXZlbnRUeXBlKTsKLSAgICBpZiAoZXZlbnQpCi0gICAgICAgIHJldHVybiBldmVudC5yZWxlYXNl
KCk7Ci0KLSAgICBlYyA9IE5PVF9TVVBQT1JURURfRVJSOwotICAgIHJldHVybiAwOwotfQotCi12
b2lkIERvY3VtZW50OjphZGRNdXRhdGlvbkV2ZW50TGlzdGVuZXJUeXBlSWZFbmFibGVkKExpc3Rl
bmVyVHlwZSBsaXN0ZW5lclR5cGUpCi17Ci0gICAgaWYgKENvbnRleHRGZWF0dXJlczo6bXV0YXRp
b25FdmVudHNFbmFibGVkKHRoaXMpKQotICAgICAgICBhZGRMaXN0ZW5lclR5cGUobGlzdGVuZXJU
eXBlKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6YWRkTGlzdGVuZXJUeXBlSWZOZWVkZWQoY29uc3Qg
QXRvbWljU3RyaW5nJiBldmVudFR5cGUpCi17Ci0gICAgaWYgKGV2ZW50VHlwZSA9PSBldmVudE5h
bWVzKCkuRE9NU3VidHJlZU1vZGlmaWVkRXZlbnQpCi0gICAgICAgIGFkZE11dGF0aW9uRXZlbnRM
aXN0ZW5lclR5cGVJZkVuYWJsZWQoRE9NU1VCVFJFRU1PRElGSUVEX0xJU1RFTkVSKTsKLSAgICBl
bHNlIGlmIChldmVudFR5cGUgPT0gZXZlbnROYW1lcygpLkRPTU5vZGVJbnNlcnRlZEV2ZW50KQot
ICAgICAgICBhZGRNdXRhdGlvbkV2ZW50TGlzdGVuZXJUeXBlSWZFbmFibGVkKERPTU5PREVJTlNF
UlRFRF9MSVNURU5FUik7Ci0gICAgZWxzZSBpZiAoZXZlbnRUeXBlID09IGV2ZW50TmFtZXMoKS5E
T01Ob2RlUmVtb3ZlZEV2ZW50KQotICAgICAgICBhZGRNdXRhdGlvbkV2ZW50TGlzdGVuZXJUeXBl
SWZFbmFibGVkKERPTU5PREVSRU1PVkVEX0xJU1RFTkVSKTsKLSAgICBlbHNlIGlmIChldmVudFR5
cGUgPT0gZXZlbnROYW1lcygpLkRPTU5vZGVSZW1vdmVkRnJvbURvY3VtZW50RXZlbnQpCi0gICAg
ICAgIGFkZE11dGF0aW9uRXZlbnRMaXN0ZW5lclR5cGVJZkVuYWJsZWQoRE9NTk9ERVJFTU9WRURG
Uk9NRE9DVU1FTlRfTElTVEVORVIpOwotICAgIGVsc2UgaWYgKGV2ZW50VHlwZSA9PSBldmVudE5h
bWVzKCkuRE9NTm9kZUluc2VydGVkSW50b0RvY3VtZW50RXZlbnQpCi0gICAgICAgIGFkZE11dGF0
aW9uRXZlbnRMaXN0ZW5lclR5cGVJZkVuYWJsZWQoRE9NTk9ERUlOU0VSVEVESU5UT0RPQ1VNRU5U
X0xJU1RFTkVSKTsKLSAgICBlbHNlIGlmIChldmVudFR5cGUgPT0gZXZlbnROYW1lcygpLkRPTUF0
dHJNb2RpZmllZEV2ZW50KQotICAgICAgICBhZGRNdXRhdGlvbkV2ZW50TGlzdGVuZXJUeXBlSWZF
bmFibGVkKERPTUFUVFJNT0RJRklFRF9MSVNURU5FUik7Ci0gICAgZWxzZSBpZiAoZXZlbnRUeXBl
ID09IGV2ZW50TmFtZXMoKS5ET01DaGFyYWN0ZXJEYXRhTW9kaWZpZWRFdmVudCkKLSAgICAgICAg
YWRkTXV0YXRpb25FdmVudExpc3RlbmVyVHlwZUlmRW5hYmxlZChET01DSEFSQUNURVJEQVRBTU9E
SUZJRURfTElTVEVORVIpOwotICAgIGVsc2UgaWYgKGV2ZW50VHlwZSA9PSBldmVudE5hbWVzKCku
b3ZlcmZsb3djaGFuZ2VkRXZlbnQpCi0gICAgICAgIGFkZExpc3RlbmVyVHlwZShPVkVSRkxPV0NI
QU5HRURfTElTVEVORVIpOwotICAgIGVsc2UgaWYgKGV2ZW50VHlwZSA9PSBldmVudE5hbWVzKCku
d2Via2l0QW5pbWF0aW9uU3RhcnRFdmVudCkKLSAgICAgICAgYWRkTGlzdGVuZXJUeXBlKEFOSU1B
VElPTlNUQVJUX0xJU1RFTkVSKTsKLSAgICBlbHNlIGlmIChldmVudFR5cGUgPT0gZXZlbnROYW1l
cygpLndlYmtpdEFuaW1hdGlvbkVuZEV2ZW50KQotICAgICAgICBhZGRMaXN0ZW5lclR5cGUoQU5J
TUFUSU9ORU5EX0xJU1RFTkVSKTsKLSAgICBlbHNlIGlmIChldmVudFR5cGUgPT0gZXZlbnROYW1l
cygpLndlYmtpdEFuaW1hdGlvbkl0ZXJhdGlvbkV2ZW50KQotICAgICAgICBhZGRMaXN0ZW5lclR5
cGUoQU5JTUFUSU9OSVRFUkFUSU9OX0xJU1RFTkVSKTsKLSAgICBlbHNlIGlmIChldmVudFR5cGUg
PT0gZXZlbnROYW1lcygpLndlYmtpdFRyYW5zaXRpb25FbmRFdmVudCkKLSAgICAgICAgYWRkTGlz
dGVuZXJUeXBlKFRSQU5TSVRJT05FTkRfTElTVEVORVIpOwotICAgIGVsc2UgaWYgKGV2ZW50VHlw
ZSA9PSBldmVudE5hbWVzKCkuYmVmb3JlbG9hZEV2ZW50KQotICAgICAgICBhZGRMaXN0ZW5lclR5
cGUoQkVGT1JFTE9BRF9MSVNURU5FUik7Ci0gICAgZWxzZSBpZiAoZXZlbnRUeXBlID09IGV2ZW50
TmFtZXMoKS5zY3JvbGxFdmVudCkKLSAgICAgICAgYWRkTGlzdGVuZXJUeXBlKFNDUk9MTF9MSVNU
RU5FUik7Ci19Ci0KLUNTU1N0eWxlRGVjbGFyYXRpb24qIERvY3VtZW50OjpnZXRPdmVycmlkZVN0
eWxlKEVsZW1lbnQqLCBjb25zdCBTdHJpbmcmKQotewotICAgIHJldHVybiAwOwotfQotCi1IVE1M
RnJhbWVPd25lckVsZW1lbnQqIERvY3VtZW50Ojpvd25lckVsZW1lbnQoKSBjb25zdAotewotICAg
IGlmICghZnJhbWUoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIGZyYW1lKCktPm93
bmVyRWxlbWVudCgpOwotfQotCi1TdHJpbmcgRG9jdW1lbnQ6OmNvb2tpZShFeGNlcHRpb25Db2Rl
JiBlYykgY29uc3QKLXsKLSAgICBpZiAocGFnZSgpICYmICFwYWdlKCktPnNldHRpbmdzKCktPmNv
b2tpZUVuYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuIFN0cmluZygpOwotCi0gICAgLy8gRklYTUU6
IFRoZSBIVE1MNSBET00gc3BlYyBzdGF0ZXMgdGhhdCB0aGlzIGF0dHJpYnV0ZSBjYW4gcmFpc2Ug
YW4KLSAgICAvLyBJTlZBTElEX1NUQVRFX0VSUiBleGNlcHRpb24gb24gZ2V0dGluZyBpZiB0aGUg
RG9jdW1lbnQgaGFzIG5vCi0gICAgLy8gYnJvd3NpbmcgY29udGV4dC4KLQotICAgIGlmICghc2Vj
dXJpdHlPcmlnaW4oKS0+Y2FuQWNjZXNzQ29va2llcygpKSB7Ci0gICAgICAgIGVjID0gU0VDVVJJ
VFlfRVJSOwotICAgICAgICByZXR1cm4gU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgS1VSTCBjb29r
aWVVUkwgPSB0aGlzLT5jb29raWVVUkwoKTsKLSAgICBpZiAoY29va2llVVJMLmlzRW1wdHkoKSkK
LSAgICAgICAgcmV0dXJuIFN0cmluZygpOwotCi0gICAgcmV0dXJuIGNvb2tpZXModGhpcywgY29v
a2llVVJMKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6c2V0Q29va2llKGNvbnN0IFN0cmluZyYgdmFs
dWUsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIGlmIChwYWdlKCkgJiYgIXBhZ2UoKS0+c2V0
dGluZ3MoKS0+Y29va2llRW5hYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBGSVhN
RTogVGhlIEhUTUw1IERPTSBzcGVjIHN0YXRlcyB0aGF0IHRoaXMgYXR0cmlidXRlIGNhbiByYWlz
ZSBhbgotICAgIC8vIElOVkFMSURfU1RBVEVfRVJSIGV4Y2VwdGlvbiBvbiBzZXR0aW5nIGlmIHRo
ZSBEb2N1bWVudCBoYXMgbm8KLSAgICAvLyBicm93c2luZyBjb250ZXh0LgotCi0gICAgaWYgKCFz
ZWN1cml0eU9yaWdpbigpLT5jYW5BY2Nlc3NDb29raWVzKCkpIHsKLSAgICAgICAgZWMgPSBTRUNV
UklUWV9FUlI7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBLVVJMIGNvb2tpZVVSTCA9
IHRoaXMtPmNvb2tpZVVSTCgpOwotICAgIGlmIChjb29raWVVUkwuaXNFbXB0eSgpKQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBzZXRDb29raWVzKHRoaXMsIGNvb2tpZVVSTCwgdmFsdWUpOwotfQot
Ci1TdHJpbmcgRG9jdW1lbnQ6OnJlZmVycmVyKCkgY29uc3QKLXsKLSAgICBpZiAoZnJhbWUoKSkK
LSAgICAgICAgcmV0dXJuIGZyYW1lKCktPmxvYWRlcigpLT5yZWZlcnJlcigpOwotICAgIHJldHVy
biBTdHJpbmcoKTsKLX0KLQotU3RyaW5nIERvY3VtZW50Ojpkb21haW4oKSBjb25zdAotewotICAg
IHJldHVybiBzZWN1cml0eU9yaWdpbigpLT5kb21haW4oKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6
c2V0RG9tYWluKGNvbnN0IFN0cmluZyYgbmV3RG9tYWluLCBFeGNlcHRpb25Db2RlJiBlYykKLXsK
LSAgICBpZiAoU2NoZW1lUmVnaXN0cnk6OmlzRG9tYWluUmVsYXhhdGlvbkZvcmJpZGRlbkZvclVS
TFNjaGVtZShzZWN1cml0eU9yaWdpbigpLT5wcm90b2NvbCgpKSkgewotICAgICAgICBlYyA9IFNF
Q1VSSVRZX0VSUjsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIEJvdGggTlMgYW5k
IElFIHNwZWNpZnkgdGhhdCBjaGFuZ2luZyB0aGUgZG9tYWluIGlzIG9ubHkgYWxsb3dlZCB3aGVu
Ci0gICAgLy8gdGhlIG5ldyBkb21haW4gaXMgYSBzdWZmaXggb2YgdGhlIG9sZCBkb21haW4uCi0K
LSAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIGFkZCBsb2dnaW5nIGluZGljYXRpbmcgd2h5IGEgZG9t
YWluIHdhcyBub3QgYWxsb3dlZC4KLQotICAgIC8vIElmIHRoZSBuZXcgZG9tYWluIGlzIHRoZSBz
YW1lIGFzIHRoZSBvbGQgZG9tYWluLCBzdGlsbCBjYWxsCi0gICAgLy8gc2VjdXJpdHlPcmlnaW4o
KS0+c2V0RG9tYWluRm9yRE9NLiBUaGlzIHdpbGwgY2hhbmdlIHRoZQotICAgIC8vIHNlY3VyaXR5
IGNoZWNrIGJlaGF2aW9yLiBGb3IgZXhhbXBsZSwgaWYgYSBwYWdlIGxvYWRlZCBvbiBwb3J0IDgw
MDAKLSAgICAvLyBhc3NpZ25zIGl0cyBjdXJyZW50IGRvbWFpbiB1c2luZyBkb2N1bWVudC5kb21h
aW4sIHRoZSBwYWdlIHdpbGwKLSAgICAvLyBhbGxvdyBvdGhlciBwYWdlcyBsb2FkZWQgb24gZGlm
ZmVyZW50IHBvcnRzIGluIHRoZSBzYW1lIGRvbWFpbiB0aGF0Ci0gICAgLy8gaGF2ZSBhbHNvIGFz
c2lnbmVkIHRvIGFjY2VzcyB0aGlzIHBhZ2UuCi0gICAgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGRv
bWFpbigpLCBuZXdEb21haW4pKSB7Ci0gICAgICAgIHNlY3VyaXR5T3JpZ2luKCktPnNldERvbWFp
bkZyb21ET00obmV3RG9tYWluKTsKLSAgICAgICAgaWYgKG1fZnJhbWUpCi0gICAgICAgICAgICBt
X2ZyYW1lLT5zY3JpcHQoKS0+dXBkYXRlU2VjdXJpdHlPcmlnaW4oKTsKLSAgICAgICAgcmV0dXJu
OwotICAgIH0KLQotICAgIGludCBvbGRMZW5ndGggPSBkb21haW4oKS5sZW5ndGgoKTsKLSAgICBp
bnQgbmV3TGVuZ3RoID0gbmV3RG9tYWluLmxlbmd0aCgpOwotICAgIC8vIGUuZy4gbmV3RG9tYWlu
ID0gd2Via2l0Lm9yZyAoMTApIGFuZCBkb21haW4oKSA9IHd3dy53ZWJraXQub3JnICgxNCkKLSAg
ICBpZiAobmV3TGVuZ3RoID49IG9sZExlbmd0aCkgewotICAgICAgICBlYyA9IFNFQ1VSSVRZX0VS
UjsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIFN0cmluZyB0ZXN0ID0gZG9tYWluKCk7
Ci0gICAgLy8gQ2hlY2sgdGhhdCBpdCdzIGEgc3ViZG9tYWluLCBub3QgZS5nLiAiZWJraXQub3Jn
IgotICAgIGlmICh0ZXN0W29sZExlbmd0aCAtIG5ld0xlbmd0aCAtIDFdICE9ICcuJykgewotICAg
ICAgICBlYyA9IFNFQ1VSSVRZX0VSUjsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8v
IE5vdyB0ZXN0IGlzICJ3ZWJraXQub3JnIiBmcm9tIGRvbWFpbigpCi0gICAgLy8gYW5kIHdlIGNo
ZWNrIHRoYXQgaXQncyB0aGUgc2FtZSB0aGluZyBhcyBuZXdEb21haW4KLSAgICB0ZXN0LnJlbW92
ZSgwLCBvbGRMZW5ndGggLSBuZXdMZW5ndGgpOwotICAgIGlmICh0ZXN0ICE9IG5ld0RvbWFpbikg
ewotICAgICAgICBlYyA9IFNFQ1VSSVRZX0VSUjsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQot
ICAgIHNlY3VyaXR5T3JpZ2luKCktPnNldERvbWFpbkZyb21ET00obmV3RG9tYWluKTsKLSAgICBp
ZiAobV9mcmFtZSkKLSAgICAgICAgbV9mcmFtZS0+c2NyaXB0KCktPnVwZGF0ZVNlY3VyaXR5T3Jp
Z2luKCk7Ci19Ci0KLS8vIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJy
ZW50LXdvcmsvI2RvbS1kb2N1bWVudC1sYXN0bW9kaWZpZWQKLVN0cmluZyBEb2N1bWVudDo6bGFz
dE1vZGlmaWVkKCkgY29uc3QKLXsKLSAgICBEYXRlQ29tcG9uZW50cyBkYXRlOwotICAgIGJvb2wg
Zm91bmREYXRlID0gZmFsc2U7Ci0gICAgaWYgKG1fZnJhbWUpIHsKLSAgICAgICAgU3RyaW5nIGh0
dHBMYXN0TW9kaWZpZWQ7Ci0gICAgICAgIGlmIChEb2N1bWVudExvYWRlciogZG9jdW1lbnRMb2Fk
ZXIgPSBsb2FkZXIoKSkgCi0gICAgICAgICAgICBodHRwTGFzdE1vZGlmaWVkID0gZG9jdW1lbnRM
b2FkZXItPnJlc3BvbnNlKCkuaHR0cEhlYWRlckZpZWxkKCJMYXN0LU1vZGlmaWVkIik7Ci0gICAg
ICAgIGlmICghaHR0cExhc3RNb2RpZmllZC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGRhdGUu
c2V0TWlsbGlzZWNvbmRzU2luY2VFcG9jaEZvckRhdGVUaW1lKHBhcnNlRGF0ZShodHRwTGFzdE1v
ZGlmaWVkKSk7Ci0gICAgICAgICAgICBmb3VuZERhdGUgPSB0cnVlOwotICAgICAgICB9Ci0gICAg
fQotICAgIC8vIEZJWE1FOiBJZiB0aGlzIGRvY3VtZW50IGNhbWUgZnJvbSB0aGUgZmlsZSBzeXN0
ZW0sIHRoZSBIVE1MNQotICAgIC8vIHNwZWNpZmljaWF0aW9uIHRlbGxzIHVzIHRvIHJlYWQgdGhl
IGxhc3QgbW9kaWZpY2F0aW9uIGRhdGUgZnJvbSB0aGUgZmlsZQotICAgIC8vIHN5c3RlbS4KLSAg
ICBpZiAoIWZvdW5kRGF0ZSkKLSAgICAgICAgZGF0ZS5zZXRNaWxsaXNlY29uZHNTaW5jZUVwb2No
Rm9yRGF0ZVRpbWUoY3VycmVudFRpbWVNUygpKTsKLSAgICByZXR1cm4gU3RyaW5nOjpmb3JtYXQo
IiUwMmQvJTAyZC8lMDRkICUwMmQ6JTAyZDolMDJkIiwgZGF0ZS5tb250aCgpICsgMSwgZGF0ZS5t
b250aERheSgpLCBkYXRlLmZ1bGxZZWFyKCksIGRhdGUuaG91cigpLCBkYXRlLm1pbnV0ZSgpLCBk
YXRlLnNlY29uZCgpKTsKLX0KLQotc3RhdGljIGJvb2wgaXNWYWxpZE5hbWVOb25BU0NJSShjb25z
dCBVQ2hhciogY2hhcmFjdGVycywgdW5zaWduZWQgbGVuZ3RoKQotewotICAgIHVuc2lnbmVkIGkg
PSAwOwotCi0gICAgVUNoYXIzMiBjOwotICAgIFUxNl9ORVhUKGNoYXJhY3RlcnMsIGksIGxlbmd0
aCwgYykKLSAgICBpZiAoIWlzVmFsaWROYW1lU3RhcnQoYykpCi0gICAgICAgIHJldHVybiBmYWxz
ZTsKLQotICAgIHdoaWxlIChpIDwgbGVuZ3RoKSB7Ci0gICAgICAgIFUxNl9ORVhUKGNoYXJhY3Rl
cnMsIGksIGxlbmd0aCwgYykKLSAgICAgICAgaWYgKCFpc1ZhbGlkTmFtZVBhcnQoYykpCi0gICAg
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXRl
bXBsYXRlPHR5cGVuYW1lIENoYXJUeXBlPgotc3RhdGljIGlubGluZSBib29sIGlzVmFsaWROYW1l
QVNDSUkoY29uc3QgQ2hhclR5cGUqIGNoYXJhY3RlcnMsIHVuc2lnbmVkIGxlbmd0aCkKLXsKLSAg
ICBDaGFyVHlwZSBjID0gY2hhcmFjdGVyc1swXTsKLSAgICBpZiAoIShpc0FTQ0lJQWxwaGEoYykg
fHwgYyA9PSAnOicgfHwgYyA9PSAnXycpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBm
b3IgKHVuc2lnbmVkIGkgPSAxOyBpIDwgbGVuZ3RoOyArK2kpIHsKLSAgICAgICAgYyA9IGNoYXJh
Y3RlcnNbaV07Ci0gICAgICAgIGlmICghKGlzQVNDSUlBbHBoYW51bWVyaWMoYykgfHwgYyA9PSAn
OicgfHwgYyA9PSAnXycgfHwgYyA9PSAnLScgfHwgYyA9PSAnLicpKQotICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIERvY3VtZW50
Ojppc1ZhbGlkTmFtZShjb25zdCBTdHJpbmcmIG5hbWUpCi17Ci0gICAgdW5zaWduZWQgbGVuZ3Ro
ID0gbmFtZS5sZW5ndGgoKTsKLSAgICBpZiAoIWxlbmd0aCkKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotCi0gICAgY29uc3QgVUNoYXIqIGNoYXJhY3RlcnM7Ci0gICAgaWYgKG5hbWUuaXM4Qml0KCkp
IHsKLSAgICAgICAgaWYgKGlzVmFsaWROYW1lQVNDSUkobmFtZS5jaGFyYWN0ZXJzOCgpLCBsZW5n
dGgpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGNoYXJhY3RlcnMgPSBuYW1l
LmNoYXJhY3RlcnMoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBjaGFyYWN0ZXJzID0gbmFtZS5j
aGFyYWN0ZXJzMTYoKTsKLSAgICAgICAgaWYgKGlzVmFsaWROYW1lQVNDSUkoY2hhcmFjdGVycywg
bGVuZ3RoKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gaXNW
YWxpZE5hbWVOb25BU0NJSShjaGFyYWN0ZXJzLCBsZW5ndGgpOwotfQotCi1ib29sIERvY3VtZW50
OjpwYXJzZVF1YWxpZmllZE5hbWUoY29uc3QgU3RyaW5nJiBxdWFsaWZpZWROYW1lLCBTdHJpbmcm
IHByZWZpeCwgU3RyaW5nJiBsb2NhbE5hbWUsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIHVu
c2lnbmVkIGxlbmd0aCA9IHF1YWxpZmllZE5hbWUubGVuZ3RoKCk7Ci0KLSAgICBpZiAoIWxlbmd0
aCkgewotICAgICAgICBlYyA9IElOVkFMSURfQ0hBUkFDVEVSX0VSUjsKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgIH0KLQotICAgIGJvb2wgbmFtZVN0YXJ0ID0gdHJ1ZTsKLSAgICBib29sIHNh
d0NvbG9uID0gZmFsc2U7Ci0gICAgaW50IGNvbG9uUG9zID0gMDsKLQotICAgIGNvbnN0IFVDaGFy
KiBzID0gcXVhbGlmaWVkTmFtZS5jaGFyYWN0ZXJzKCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSA8IGxlbmd0aDspIHsKLSAgICAgICAgVUNoYXIzMiBjOwotICAgICAgICBVMTZfTkVYVChz
LCBpLCBsZW5ndGgsIGMpCi0gICAgICAgIGlmIChjID09ICc6JykgewotICAgICAgICAgICAgaWYg
KHNhd0NvbG9uKSB7Ci0gICAgICAgICAgICAgICAgZWMgPSBOQU1FU1BBQ0VfRVJSOwotICAgICAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gbXVsdGlwbGUgY29sb25zOiBub3QgYWxsb3dlZAot
ICAgICAgICAgICAgfQotICAgICAgICAgICAgbmFtZVN0YXJ0ID0gdHJ1ZTsKLSAgICAgICAgICAg
IHNhd0NvbG9uID0gdHJ1ZTsKLSAgICAgICAgICAgIGNvbG9uUG9zID0gaSAtIDE7Ci0gICAgICAg
IH0gZWxzZSBpZiAobmFtZVN0YXJ0KSB7Ci0gICAgICAgICAgICBpZiAoIWlzVmFsaWROYW1lU3Rh
cnQoYykpIHsKLSAgICAgICAgICAgICAgICBlYyA9IElOVkFMSURfQ0hBUkFDVEVSX0VSUjsKLSAg
ICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBu
YW1lU3RhcnQgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICghaXNW
YWxpZE5hbWVQYXJ0KGMpKSB7Ci0gICAgICAgICAgICAgICAgZWMgPSBJTlZBTElEX0NIQVJBQ1RF
Ul9FUlI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAg
ICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFzYXdDb2xvbikgewotICAgICAgICBwcmVmaXggPSBT
dHJpbmcoKTsKLSAgICAgICAgbG9jYWxOYW1lID0gcXVhbGlmaWVkTmFtZTsKLSAgICB9IGVsc2Ug
ewotICAgICAgICBwcmVmaXggPSBxdWFsaWZpZWROYW1lLnN1YnN0cmluZygwLCBjb2xvblBvcyk7
Ci0gICAgICAgIGlmIChwcmVmaXguaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBlYyA9IE5BTUVT
UEFDRV9FUlI7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAg
bG9jYWxOYW1lID0gcXVhbGlmaWVkTmFtZS5zdWJzdHJpbmcoY29sb25Qb3MgKyAxKTsKLSAgICB9
Ci0KLSAgICBpZiAobG9jYWxOYW1lLmlzRW1wdHkoKSkgewotICAgICAgICBlYyA9IE5BTUVTUEFD
RV9FUlI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsK
LX0KLQotdm9pZCBEb2N1bWVudDo6c2V0RGVjb2RlcihQYXNzUmVmUHRyPFRleHRSZXNvdXJjZURl
Y29kZXI+IGRlY29kZXIpCi17Ci0gICAgbV9kZWNvZGVyID0gZGVjb2RlcjsKLX0KLQotS1VSTCBE
b2N1bWVudDo6Y29tcGxldGVVUkwoY29uc3QgU3RyaW5nJiB1cmwsIGNvbnN0IEtVUkwmIGJhc2VV
UkxPdmVycmlkZSkgY29uc3QKLXsKLSAgICAvLyBBbHdheXMgcmV0dXJuIGEgbnVsbCBVUkwgd2hl
biBwYXNzZWQgYSBudWxsIHN0cmluZy4KLSAgICAvLyBGSVhNRTogU2hvdWxkIHdlIGNoYW5nZSB0
aGUgS1VSTCBjb25zdHJ1Y3RvciB0byBoYXZlIHRoaXMgYmVoYXZpb3I/Ci0gICAgLy8gU2VlIGFs
c28gW0NTU11TdHlsZVNoZWV0Ojpjb21wbGV0ZVVSTChjb25zdCBTdHJpbmcmKQotICAgIGlmICh1
cmwuaXNOdWxsKCkpCi0gICAgICAgIHJldHVybiBLVVJMKCk7Ci0gICAgY29uc3QgS1VSTCYgYmFz
ZVVSTCA9ICgoYmFzZVVSTE92ZXJyaWRlLmlzRW1wdHkoKSB8fCBiYXNlVVJMT3ZlcnJpZGUgPT0g
YmxhbmtVUkwoKSkgJiYgcGFyZW50RG9jdW1lbnQoKSkgPyBwYXJlbnREb2N1bWVudCgpLT5iYXNl
VVJMKCkgOiBiYXNlVVJMT3ZlcnJpZGU7Ci0gICAgaWYgKCFtX2RlY29kZXIpCi0gICAgICAgIHJl
dHVybiBLVVJMKGJhc2VVUkwsIHVybCk7Ci0gICAgcmV0dXJuIEtVUkwoYmFzZVVSTCwgdXJsLCBt
X2RlY29kZXItPmVuY29kaW5nKCkpOwotfQotCi1LVVJMIERvY3VtZW50Ojpjb21wbGV0ZVVSTChj
b25zdCBTdHJpbmcmIHVybCkgY29uc3QKLXsKLSAgICByZXR1cm4gY29tcGxldGVVUkwodXJsLCBt
X2Jhc2VVUkwpOwotfQotCi12b2lkIERvY3VtZW50OjpzZXRJblBhZ2VDYWNoZShib29sIGZsYWcp
Ci17Ci0gICAgaWYgKG1faW5QYWdlQ2FjaGUgPT0gZmxhZykKLSAgICAgICAgcmV0dXJuOwotCi0g
ICAgbV9pblBhZ2VDYWNoZSA9IGZsYWc7Ci0KLSAgICBGcmFtZVZpZXcqIHYgPSB2aWV3KCk7Ci0g
ICAgaWYgKGZsYWcpIHsKLSAgICAgICAgQVNTRVJUKCFtX3NhdmVkUmVuZGVyZXIpOwotICAgICAg
ICBtX3NhdmVkUmVuZGVyZXIgPSByZW5kZXJlcigpOwotICAgICAgICBpZiAodikgewotICAgICAg
ICAgICAgdi0+Y2FjaGVDdXJyZW50U2Nyb2xsUG9zaXRpb24oKTsKLSAgICAgICAgICAgIGlmIChw
YWdlKCkgJiYgcGFnZSgpLT5tYWluRnJhbWUoKSA9PSBtX2ZyYW1lKQotICAgICAgICAgICAgICAg
IHYtPnJlc2V0U2Nyb2xsYmFyc0FuZENsZWFyQ29udGVudHNTaXplKCk7Ci0gICAgICAgICAgICBl
bHNlCi0gICAgICAgICAgICAgICAgdi0+cmVzZXRTY3JvbGxiYXJzKCk7Ci0gICAgICAgIH0KLSAg
ICAgICAgbV9zdHlsZVJlY2FsY1RpbWVyLnN0b3AoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBB
U1NFUlQoIXJlbmRlcmVyKCkgfHwgcmVuZGVyZXIoKSA9PSBtX3NhdmVkUmVuZGVyZXIpOwotICAg
ICAgICBBU1NFUlQobV9yZW5kZXJBcmVuYSk7Ci0gICAgICAgIHNldFJlbmRlcmVyKG1fc2F2ZWRS
ZW5kZXJlcik7Ci0gICAgICAgIG1fc2F2ZWRSZW5kZXJlciA9IDA7Ci0KLSAgICAgICAgaWYgKGNo
aWxkTmVlZHNTdHlsZVJlY2FsYygpKQotICAgICAgICAgICAgc2NoZWR1bGVTdHlsZVJlY2FsYygp
OwotICAgIH0KLX0KLQotdm9pZCBEb2N1bWVudDo6ZG9jdW1lbnRXaWxsQmVjb21lSW5hY3RpdmUo
KQotewotI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKLSAgICBpZiAocmVuZGVyZXIo
KSkKLSAgICAgICAgcmVuZGVyVmlldygpLT53aWxsTW92ZU9mZnNjcmVlbigpOwotI2VuZGlmCi19
Ci0KLXZvaWQgRG9jdW1lbnQ6OmRvY3VtZW50V2lsbFN1c3BlbmRGb3JQYWdlQ2FjaGUoKQotewot
ICAgIGRvY3VtZW50V2lsbEJlY29tZUluYWN0aXZlKCk7Ci0KLSAgICBIYXNoU2V0PEVsZW1lbnQq
Pjo6aXRlcmF0b3IgZW5kID0gbV9kb2N1bWVudFN1c3BlbnNpb25DYWxsYmFja0VsZW1lbnRzLmVu
ZCgpOwotICAgIGZvciAoSGFzaFNldDxFbGVtZW50Kj46Oml0ZXJhdG9yIGkgPSBtX2RvY3VtZW50
U3VzcGVuc2lvbkNhbGxiYWNrRWxlbWVudHMuYmVnaW4oKTsgaSAhPSBlbmQ7ICsraSkKLSAgICAg
ICAgKCppKS0+ZG9jdW1lbnRXaWxsU3VzcGVuZEZvclBhZ2VDYWNoZSgpOwotCi0jaWZuZGVmIE5E
RUJVRwotICAgIC8vIENsZWFyIHRoZSB1cGRhdGUgZmxhZyB0byBiZSBhYmxlIHRvIGNoZWNrIGlm
IHRoZSB2aWV3cG9ydCBhcmd1bWVudHMgdXBkYXRlCi0gICAgLy8gaXMgZGlzcGF0Y2hlZCwgYWZ0
ZXIgdGhlIGRvY3VtZW50IGlzIHJlc3RvcmVkIGZyb20gdGhlIHBhZ2UgY2FjaGUuCi0gICAgbV9k
aWREaXNwYXRjaFZpZXdwb3J0UHJvcGVydGllc0NoYW5nZWQgPSBmYWxzZTsKLSNlbmRpZgotfQot
Ci12b2lkIERvY3VtZW50Ojpkb2N1bWVudERpZFJlc3VtZUZyb21QYWdlQ2FjaGUoKSAKLXsKLSAg
ICBWZWN0b3I8RWxlbWVudCo+IGVsZW1lbnRzOwotICAgIGNvcHlUb1ZlY3RvcihtX2RvY3VtZW50
U3VzcGVuc2lvbkNhbGxiYWNrRWxlbWVudHMsIGVsZW1lbnRzKTsKLSAgICBWZWN0b3I8RWxlbWVu
dCo+OjppdGVyYXRvciBlbmQgPSBlbGVtZW50cy5lbmQoKTsKLSAgICBmb3IgKFZlY3RvcjxFbGVt
ZW50Kj46Oml0ZXJhdG9yIGkgPSBlbGVtZW50cy5iZWdpbigpOyBpICE9IGVuZDsgKytpKQotICAg
ICAgICAoKmkpLT5kb2N1bWVudERpZFJlc3VtZUZyb21QYWdlQ2FjaGUoKTsKLQotI2lmIFVTRShB
Q0NFTEVSQVRFRF9DT01QT1NJVElORykKLSAgICBpZiAocmVuZGVyZXIoKSkKLSAgICAgICAgcmVu
ZGVyVmlldygpLT5kaWRNb3ZlT25zY3JlZW4oKTsKLSNlbmRpZgotCi0gICAgaWYgKEZyYW1lVmll
dyogZnJhbWVWaWV3ID0gdmlldygpKQotICAgICAgICBmcmFtZVZpZXctPnNldEFuaW1hdG9yc0Fy
ZUFjdGl2ZSgpOwotCi0gICAgQVNTRVJUKG1fZnJhbWUpOwotICAgIG1fZnJhbWUtPmxvYWRlcigp
LT5jbGllbnQoKS0+ZGlzcGF0Y2hEaWRCZWNvbWVGcmFtZXNldChpc0ZyYW1lU2V0KCkpOwotfQot
Ci12b2lkIERvY3VtZW50OjpyZWdpc3RlckZvclBhZ2VDYWNoZVN1c3BlbnNpb25DYWxsYmFja3Mo
RWxlbWVudCogZSkKLXsKLSAgICBtX2RvY3VtZW50U3VzcGVuc2lvbkNhbGxiYWNrRWxlbWVudHMu
YWRkKGUpOwotfQotCi12b2lkIERvY3VtZW50Ojp1bnJlZ2lzdGVyRm9yUGFnZUNhY2hlU3VzcGVu
c2lvbkNhbGxiYWNrcyhFbGVtZW50KiBlKQotewotICAgIG1fZG9jdW1lbnRTdXNwZW5zaW9uQ2Fs
bGJhY2tFbGVtZW50cy5yZW1vdmUoZSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6Om1lZGlhVm9sdW1l
RGlkQ2hhbmdlKCkgCi17Ci0gICAgSGFzaFNldDxFbGVtZW50Kj46Oml0ZXJhdG9yIGVuZCA9IG1f
bWVkaWFWb2x1bWVDYWxsYmFja0VsZW1lbnRzLmVuZCgpOwotICAgIGZvciAoSGFzaFNldDxFbGVt
ZW50Kj46Oml0ZXJhdG9yIGkgPSBtX21lZGlhVm9sdW1lQ2FsbGJhY2tFbGVtZW50cy5iZWdpbigp
OyBpICE9IGVuZDsgKytpKQotICAgICAgICAoKmkpLT5tZWRpYVZvbHVtZURpZENoYW5nZSgpOwot
fQotCi12b2lkIERvY3VtZW50OjpyZWdpc3RlckZvck1lZGlhVm9sdW1lQ2FsbGJhY2tzKEVsZW1l
bnQqIGUpCi17Ci0gICAgbV9tZWRpYVZvbHVtZUNhbGxiYWNrRWxlbWVudHMuYWRkKGUpOwotfQot
Ci12b2lkIERvY3VtZW50Ojp1bnJlZ2lzdGVyRm9yTWVkaWFWb2x1bWVDYWxsYmFja3MoRWxlbWVu
dCogZSkKLXsKLSAgICBtX21lZGlhVm9sdW1lQ2FsbGJhY2tFbGVtZW50cy5yZW1vdmUoZSk7Ci19
Ci0KLXZvaWQgRG9jdW1lbnQ6OnN0b3JhZ2VCbG9ja2luZ1N0YXRlRGlkQ2hhbmdlKCkKLXsKLSAg
ICBpZiAoU2V0dGluZ3MqIHNldHRpbmdzID0gdGhpcy0+c2V0dGluZ3MoKSkKLSAgICAgICAgc2Vj
dXJpdHlPcmlnaW4oKS0+c2V0U3RvcmFnZUJsb2NraW5nUG9saWN5KHNldHRpbmdzLT5zdG9yYWdl
QmxvY2tpbmdQb2xpY3koKSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnByaXZhdGVCcm93c2luZ1N0
YXRlRGlkQ2hhbmdlKCkgCi17Ci0gICAgSGFzaFNldDxFbGVtZW50Kj46Oml0ZXJhdG9yIGVuZCA9
IG1fcHJpdmF0ZUJyb3dzaW5nU3RhdGVDaGFuZ2VkRWxlbWVudHMuZW5kKCk7Ci0gICAgZm9yIChI
YXNoU2V0PEVsZW1lbnQqPjo6aXRlcmF0b3IgaXQgPSBtX3ByaXZhdGVCcm93c2luZ1N0YXRlQ2hh
bmdlZEVsZW1lbnRzLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkKLSAgICAgICAgKCppdCktPnBy
aXZhdGVCcm93c2luZ1N0YXRlRGlkQ2hhbmdlKCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnJlZ2lz
dGVyRm9yUHJpdmF0ZUJyb3dzaW5nU3RhdGVDaGFuZ2VkQ2FsbGJhY2tzKEVsZW1lbnQqIGUpCi17
Ci0gICAgbV9wcml2YXRlQnJvd3NpbmdTdGF0ZUNoYW5nZWRFbGVtZW50cy5hZGQoZSk7Ci19Ci0K
LXZvaWQgRG9jdW1lbnQ6OnVucmVnaXN0ZXJGb3JQcml2YXRlQnJvd3NpbmdTdGF0ZUNoYW5nZWRD
YWxsYmFja3MoRWxlbWVudCogZSkKLXsKLSAgICBtX3ByaXZhdGVCcm93c2luZ1N0YXRlQ2hhbmdl
ZEVsZW1lbnRzLnJlbW92ZShlKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6c2V0U2hvdWxkQ3JlYXRl
UmVuZGVyZXJzKGJvb2wgZikKLXsKLSAgICBtX2NyZWF0ZVJlbmRlcmVycyA9IGY7Ci19Ci0KLWJv
b2wgRG9jdW1lbnQ6OnNob3VsZENyZWF0ZVJlbmRlcmVycygpCi17Ci0gICAgcmV0dXJuIG1fY3Jl
YXRlUmVuZGVyZXJzOwotfQotCi0vLyBTdXBwb3J0IGZvciBKYXZhc2NyaXB0IGV4ZWNDb21tYW5k
LCBhbmQgcmVsYXRlZCBtZXRob2RzCi0KLXN0YXRpYyBFZGl0b3I6OkNvbW1hbmQgY29tbWFuZChE
b2N1bWVudCogZG9jdW1lbnQsIGNvbnN0IFN0cmluZyYgY29tbWFuZE5hbWUsIGJvb2wgdXNlcklu
dGVyZmFjZSA9IGZhbHNlKQotewotICAgIEZyYW1lKiBmcmFtZSA9IGRvY3VtZW50LT5mcmFtZSgp
OwotICAgIGlmICghZnJhbWUgfHwgZnJhbWUtPmRvY3VtZW50KCkgIT0gZG9jdW1lbnQpCi0gICAg
ICAgIHJldHVybiBFZGl0b3I6OkNvbW1hbmQoKTsKLQotICAgIGRvY3VtZW50LT51cGRhdGVTdHls
ZUlmTmVlZGVkKCk7Ci0KLSAgICByZXR1cm4gZnJhbWUtPmVkaXRvcigpLT5jb21tYW5kKGNvbW1h
bmROYW1lLAotICAgICAgICB1c2VySW50ZXJmYWNlID8gQ29tbWFuZEZyb21ET01XaXRoVXNlcklu
dGVyZmFjZSA6IENvbW1hbmRGcm9tRE9NKTsKLX0KLQotYm9vbCBEb2N1bWVudDo6ZXhlY0NvbW1h
bmQoY29uc3QgU3RyaW5nJiBjb21tYW5kTmFtZSwgYm9vbCB1c2VySW50ZXJmYWNlLCBjb25zdCBT
dHJpbmcmIHZhbHVlKQotewotICAgIHJldHVybiBjb21tYW5kKHRoaXMsIGNvbW1hbmROYW1lLCB1
c2VySW50ZXJmYWNlKS5leGVjdXRlKHZhbHVlKTsKLX0KLQotYm9vbCBEb2N1bWVudDo6cXVlcnlD
b21tYW5kRW5hYmxlZChjb25zdCBTdHJpbmcmIGNvbW1hbmROYW1lKQotewotICAgIHJldHVybiBj
b21tYW5kKHRoaXMsIGNvbW1hbmROYW1lKS5pc0VuYWJsZWQoKTsKLX0KLQotYm9vbCBEb2N1bWVu
dDo6cXVlcnlDb21tYW5kSW5kZXRlcm0oY29uc3QgU3RyaW5nJiBjb21tYW5kTmFtZSkKLXsKLSAg
ICByZXR1cm4gY29tbWFuZCh0aGlzLCBjb21tYW5kTmFtZSkuc3RhdGUoKSA9PSBNaXhlZFRyaVN0
YXRlOwotfQotCi1ib29sIERvY3VtZW50OjpxdWVyeUNvbW1hbmRTdGF0ZShjb25zdCBTdHJpbmcm
IGNvbW1hbmROYW1lKQotewotICAgIHJldHVybiBjb21tYW5kKHRoaXMsIGNvbW1hbmROYW1lKS5z
dGF0ZSgpID09IFRydWVUcmlTdGF0ZTsKLX0KLQotYm9vbCBEb2N1bWVudDo6cXVlcnlDb21tYW5k
U3VwcG9ydGVkKGNvbnN0IFN0cmluZyYgY29tbWFuZE5hbWUpCi17Ci0gICAgcmV0dXJuIGNvbW1h
bmQodGhpcywgY29tbWFuZE5hbWUpLmlzU3VwcG9ydGVkKCk7Ci19Ci0KLVN0cmluZyBEb2N1bWVu
dDo6cXVlcnlDb21tYW5kVmFsdWUoY29uc3QgU3RyaW5nJiBjb21tYW5kTmFtZSkKLXsKLSAgICBy
ZXR1cm4gY29tbWFuZCh0aGlzLCBjb21tYW5kTmFtZSkudmFsdWUoKTsKLX0KLQotS1VSTCBEb2N1
bWVudDo6b3BlblNlYXJjaERlc2NyaXB0aW9uVVJMKCkKLXsKLSAgICBzdGF0aWMgY29uc3QgY2hh
ciogY29uc3Qgb3BlblNlYXJjaE1JTUVUeXBlID0gImFwcGxpY2F0aW9uL29wZW5zZWFyY2hkZXNj
cmlwdGlvbit4bWwiOwotICAgIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBvcGVuU2VhcmNoUmVs
YXRpb24gPSAic2VhcmNoIjsKLQotICAgIC8vIEZJWE1FOiBXaHkgZG8gb25seSB0b3AtbGV2ZWwg
ZnJhbWVzIGhhdmUgb3BlblNlYXJjaERlc2NyaXB0aW9uVVJMcz8KLSAgICBpZiAoIWZyYW1lKCkg
fHwgZnJhbWUoKS0+dHJlZSgpLT5wYXJlbnQoKSkKLSAgICAgICAgcmV0dXJuIEtVUkwoKTsKLQot
ICAgIC8vIEZJWE1FOiBXaHkgZG8gd2UgbmVlZCB0byB3YWl0IGZvciBGcmFtZVN0YXRlQ29tcGxl
dGU/Ci0gICAgaWYgKGZyYW1lKCktPmxvYWRlcigpLT5zdGF0ZSgpICE9IEZyYW1lU3RhdGVDb21w
bGV0ZSkKLSAgICAgICAgcmV0dXJuIEtVUkwoKTsKLQotICAgIGlmICghaGVhZCgpKQotICAgICAg
ICByZXR1cm4gS1VSTCgpOwotCi0gICAgUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBjaGlsZHJlbiA9
IGhlYWQoKS0+Y2hpbGRyZW4oKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBOb2RlKiBjaGls
ZCA9IGNoaWxkcmVuLT5pdGVtKGkpOyBpKyspIHsKLSAgICAgICAgaWYgKCFjaGlsZC0+aGFzVGFn
TmFtZShsaW5rVGFnKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBIVE1MTGlua0Vs
ZW1lbnQqIGxpbmtFbGVtZW50ID0gc3RhdGljX2Nhc3Q8SFRNTExpbmtFbGVtZW50Kj4oY2hpbGQp
OwotICAgICAgICBpZiAoIWVxdWFsSWdub3JpbmdDYXNlKGxpbmtFbGVtZW50LT50eXBlKCksIG9w
ZW5TZWFyY2hNSU1FVHlwZSkgfHwgIWVxdWFsSWdub3JpbmdDYXNlKGxpbmtFbGVtZW50LT5yZWwo
KSwgb3BlblNlYXJjaFJlbGF0aW9uKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBp
ZiAobGlua0VsZW1lbnQtPmhyZWYoKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICBjb250aW51ZTsK
LSAgICAgICAgcmV0dXJuIGxpbmtFbGVtZW50LT5ocmVmKCk7Ci0gICAgfQotCi0gICAgcmV0dXJu
IEtVUkwoKTsKLX0KLQotI2lmIEVOQUJMRShYU0xUKQotCi12b2lkIERvY3VtZW50OjphcHBseVhT
TFRyYW5zZm9ybShQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24qIHBpKQotewotICAgIFJlZlB0cjxYU0xU
UHJvY2Vzc29yPiBwcm9jZXNzb3IgPSBYU0xUUHJvY2Vzc29yOjpjcmVhdGUoKTsKLSAgICBwcm9j
ZXNzb3ItPnNldFhTTFN0eWxlU2hlZXQoc3RhdGljX2Nhc3Q8WFNMU3R5bGVTaGVldCo+KHBpLT5z
aGVldCgpKSk7Ci0gICAgU3RyaW5nIHJlc3VsdE1JTUVUeXBlOwotICAgIFN0cmluZyBuZXdTb3Vy
Y2U7Ci0gICAgU3RyaW5nIHJlc3VsdEVuY29kaW5nOwotICAgIGlmICghcHJvY2Vzc29yLT50cmFu
c2Zvcm1Ub1N0cmluZyh0aGlzLCByZXN1bHRNSU1FVHlwZSwgbmV3U291cmNlLCByZXN1bHRFbmNv
ZGluZykpCi0gICAgICAgIHJldHVybjsKLSAgICAvLyBGSVhNRTogSWYgdGhlIHRyYW5zZm9ybSBm
YWlsZWQgd2Ugc2hvdWxkIHByb2JhYmx5IHJlcG9ydCBhbiBlcnJvciAobGlrZSBNb3ppbGxhIGRv
ZXMpLgotICAgIHByb2Nlc3Nvci0+Y3JlYXRlRG9jdW1lbnRGcm9tU291cmNlKG5ld1NvdXJjZSwg
cmVzdWx0RW5jb2RpbmcsIHJlc3VsdE1JTUVUeXBlLCB0aGlzLCBmcmFtZSgpKTsKLX0KLQotdm9p
ZCBEb2N1bWVudDo6c2V0VHJhbnNmb3JtU291cmNlKFBhc3NPd25QdHI8VHJhbnNmb3JtU291cmNl
PiBzb3VyY2UpCi17Ci0gICAgbV90cmFuc2Zvcm1Tb3VyY2UgPSBzb3VyY2U7Ci19Ci0KLSNlbmRp
ZgotCi12b2lkIERvY3VtZW50OjpzZXREZXNpZ25Nb2RlKEluaGVyaXRlZEJvb2wgdmFsdWUpCi17
Ci0gICAgbV9kZXNpZ25Nb2RlID0gdmFsdWU7Ci0gICAgZm9yIChGcmFtZSogZnJhbWUgPSBtX2Zy
YW1lOyBmcmFtZSAmJiBmcmFtZS0+ZG9jdW1lbnQoKTsgZnJhbWUgPSBmcmFtZS0+dHJlZSgpLT50
cmF2ZXJzZU5leHQobV9mcmFtZSkpCi0gICAgICAgIGZyYW1lLT5kb2N1bWVudCgpLT5zY2hlZHVs
ZUZvcmNlZFN0eWxlUmVjYWxjKCk7Ci19Ci0KLURvY3VtZW50OjpJbmhlcml0ZWRCb29sIERvY3Vt
ZW50OjpnZXREZXNpZ25Nb2RlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9kZXNpZ25Nb2RlOwot
fQotCi1ib29sIERvY3VtZW50OjppbkRlc2lnbk1vZGUoKSBjb25zdAotewotICAgIGZvciAoY29u
c3QgRG9jdW1lbnQqIGQgPSB0aGlzOyBkOyBkID0gZC0+cGFyZW50RG9jdW1lbnQoKSkgewotICAg
ICAgICBpZiAoZC0+bV9kZXNpZ25Nb2RlICE9IGluaGVyaXQpCi0gICAgICAgICAgICByZXR1cm4g
ZC0+bV9kZXNpZ25Nb2RlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLURvY3VtZW50
KiBEb2N1bWVudDo6cGFyZW50RG9jdW1lbnQoKSBjb25zdAotewotICAgIGlmICghbV9mcmFtZSkK
LSAgICAgICAgcmV0dXJuIDA7Ci0gICAgRnJhbWUqIHBhcmVudCA9IG1fZnJhbWUtPnRyZWUoKS0+
cGFyZW50KCk7Ci0gICAgaWYgKCFwYXJlbnQpCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVy
biBwYXJlbnQtPmRvY3VtZW50KCk7Ci19Ci0KLURvY3VtZW50KiBEb2N1bWVudDo6dG9wRG9jdW1l
bnQoKSBjb25zdAotewotICAgIERvY3VtZW50KiBkb2MgPSBjb25zdF9jYXN0PERvY3VtZW50ICo+
KHRoaXMpOwotICAgIEVsZW1lbnQqIGVsZW1lbnQ7Ci0gICAgd2hpbGUgKChlbGVtZW50ID0gZG9j
LT5vd25lckVsZW1lbnQoKSkpCi0gICAgICAgIGRvYyA9IGVsZW1lbnQtPmRvY3VtZW50KCk7Ci0g
ICAgCi0gICAgcmV0dXJuIGRvYzsKLX0KLQotUGFzc1JlZlB0cjxBdHRyPiBEb2N1bWVudDo6Y3Jl
YXRlQXR0cmlidXRlKGNvbnN0IFN0cmluZyYgbmFtZSwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0g
ICAgcmV0dXJuIGNyZWF0ZUF0dHJpYnV0ZU5TKFN0cmluZygpLCBuYW1lLCBlYywgdHJ1ZSk7Ci19
Ci0KLVBhc3NSZWZQdHI8QXR0cj4gRG9jdW1lbnQ6OmNyZWF0ZUF0dHJpYnV0ZU5TKGNvbnN0IFN0
cmluZyYgbmFtZXNwYWNlVVJJLCBjb25zdCBTdHJpbmcmIHF1YWxpZmllZE5hbWUsIEV4Y2VwdGlv
bkNvZGUmIGVjLCBib29sIHNob3VsZElnbm9yZU5hbWVzcGFjZUNoZWNrcykKLXsKLSAgICBTdHJp
bmcgcHJlZml4LCBsb2NhbE5hbWU7Ci0gICAgaWYgKCFwYXJzZVF1YWxpZmllZE5hbWUocXVhbGlm
aWVkTmFtZSwgcHJlZml4LCBsb2NhbE5hbWUsIGVjKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAg
ICBRdWFsaWZpZWROYW1lIHFOYW1lKHByZWZpeCwgbG9jYWxOYW1lLCBuYW1lc3BhY2VVUkkpOwot
Ci0gICAgaWYgKCFzaG91bGRJZ25vcmVOYW1lc3BhY2VDaGVja3MgJiYgIWhhc1ZhbGlkTmFtZXNw
YWNlRm9yQXR0cmlidXRlcyhxTmFtZSkpIHsKLSAgICAgICAgZWMgPSBOQU1FU1BBQ0VfRVJSOwot
ICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gQXR0cjo6Y3JlYXRlKHRoaXMs
IHFOYW1lLCBlbXB0eVN0cmluZygpKTsKLX0KLQotI2lmIEVOQUJMRShTVkcpCi1jb25zdCBTVkdE
b2N1bWVudEV4dGVuc2lvbnMqIERvY3VtZW50OjpzdmdFeHRlbnNpb25zKCkKLXsKLSAgICByZXR1
cm4gbV9zdmdFeHRlbnNpb25zLmdldCgpOwotfQotCi1TVkdEb2N1bWVudEV4dGVuc2lvbnMqIERv
Y3VtZW50OjphY2Nlc3NTVkdFeHRlbnNpb25zKCkKLXsKLSAgICBpZiAoIW1fc3ZnRXh0ZW5zaW9u
cykKLSAgICAgICAgbV9zdmdFeHRlbnNpb25zID0gYWRvcHRQdHIobmV3IFNWR0RvY3VtZW50RXh0
ZW5zaW9ucyh0aGlzKSk7Ci0gICAgcmV0dXJuIG1fc3ZnRXh0ZW5zaW9ucy5nZXQoKTsKLX0KLQot
Ym9vbCBEb2N1bWVudDo6aGFzU1ZHUm9vdE5vZGUoKSBjb25zdAotewotICAgIHJldHVybiBkb2N1
bWVudEVsZW1lbnQoKSAmJiBkb2N1bWVudEVsZW1lbnQoKS0+aGFzVGFnTmFtZShTVkdOYW1lczo6
c3ZnVGFnKTsKLX0KLSNlbmRpZgotCi0vLyBGSVhNRTogVGhpcyBjYWNoaW5nIG1lY2hhbmlzbSBz
aG91bGQgYmUgbWVyZ2VkIHRoYXQgb2YgRHluYW1pY05vZGVMaXN0IGluIE5vZGVSYXJlRGF0YS4K
LVBhc3NSZWZQdHI8SFRNTENvbGxlY3Rpb24+IERvY3VtZW50OjpjYWNoZWRDb2xsZWN0aW9uKENv
bGxlY3Rpb25UeXBlIHR5cGUpCi17Ci0gICAgQVNTRVJUKHN0YXRpY19jYXN0PHVuc2lnbmVkPih0
eXBlKSA8IE51bVVubmFtZWREb2N1bWVudENhY2hlZFR5cGVzKTsKLSAgICBpZiAobV9jb2xsZWN0
aW9uc1t0eXBlXSkKLSAgICAgICAgcmV0dXJuIG1fY29sbGVjdGlvbnNbdHlwZV07Ci0KLSAgICBS
ZWZQdHI8SFRNTENvbGxlY3Rpb24+IGNvbGxlY3Rpb247Ci0gICAgaWYgKHR5cGUgPT0gRG9jQWxs
KQotICAgICAgICBjb2xsZWN0aW9uID0gSFRNTEFsbENvbGxlY3Rpb246OmNyZWF0ZSh0aGlzKTsK
LSAgICBlbHNlCi0gICAgICAgIGNvbGxlY3Rpb24gPSBIVE1MQ29sbGVjdGlvbjo6Y3JlYXRlKHRo
aXMsIHR5cGUpOwotICAgIG1fY29sbGVjdGlvbnNbdHlwZV0gPSBjb2xsZWN0aW9uLmdldCgpOwot
Ci0gICAgcmV0dXJuIGNvbGxlY3Rpb24ucmVsZWFzZSgpOwotfQotCi12b2lkIERvY3VtZW50Ojpy
ZW1vdmVDYWNoZWRIVE1MQ29sbGVjdGlvbihIVE1MQ29sbGVjdGlvbiogY29sbGVjdGlvbiwgQ29s
bGVjdGlvblR5cGUgdHlwZSkKLXsKLSAgICBBU1NFUlRfVU5VU0VEKGNvbGxlY3Rpb24sIG1fY29s
bGVjdGlvbnNbdHlwZV0gPT0gY29sbGVjdGlvbik7Ci0gICAgbV9jb2xsZWN0aW9uc1t0eXBlXSA9
IDA7Ci19Ci0KLVBhc3NSZWZQdHI8SFRNTENvbGxlY3Rpb24+IERvY3VtZW50OjppbWFnZXMoKQot
ewotICAgIHJldHVybiBjYWNoZWRDb2xsZWN0aW9uKERvY0ltYWdlcyk7Ci19Ci0KLVBhc3NSZWZQ
dHI8SFRNTENvbGxlY3Rpb24+IERvY3VtZW50OjphcHBsZXRzKCkKLXsKLSAgICByZXR1cm4gY2Fj
aGVkQ29sbGVjdGlvbihEb2NBcHBsZXRzKTsKLX0KLQotUGFzc1JlZlB0cjxIVE1MQ29sbGVjdGlv
bj4gRG9jdW1lbnQ6OmVtYmVkcygpCi17Ci0gICAgcmV0dXJuIGNhY2hlZENvbGxlY3Rpb24oRG9j
RW1iZWRzKTsKLX0KLQotUGFzc1JlZlB0cjxIVE1MQ29sbGVjdGlvbj4gRG9jdW1lbnQ6OnBsdWdp
bnMoKQotewotICAgIC8vIFRoaXMgaXMgYW4gYWxpYXMgZm9yIGVtYmVkcygpIHJlcXVpcmVkIGZv
ciB0aGUgSlMgRE9NIGJpbmRpbmdzLgotICAgIHJldHVybiBjYWNoZWRDb2xsZWN0aW9uKERvY0Vt
YmVkcyk7Ci19Ci0KLVBhc3NSZWZQdHI8SFRNTENvbGxlY3Rpb24+IERvY3VtZW50OjpvYmplY3Rz
KCkKLXsKLSAgICByZXR1cm4gY2FjaGVkQ29sbGVjdGlvbihEb2NPYmplY3RzKTsKLX0KLQotUGFz
c1JlZlB0cjxIVE1MQ29sbGVjdGlvbj4gRG9jdW1lbnQ6OnNjcmlwdHMoKQotewotICAgIHJldHVy
biBjYWNoZWRDb2xsZWN0aW9uKERvY1NjcmlwdHMpOwotfQotCi1QYXNzUmVmUHRyPEhUTUxDb2xs
ZWN0aW9uPiBEb2N1bWVudDo6bGlua3MoKQotewotICAgIHJldHVybiBjYWNoZWRDb2xsZWN0aW9u
KERvY0xpbmtzKTsKLX0KLQotUGFzc1JlZlB0cjxIVE1MQ29sbGVjdGlvbj4gRG9jdW1lbnQ6OmZv
cm1zKCkKLXsKLSAgICByZXR1cm4gY2FjaGVkQ29sbGVjdGlvbihEb2NGb3Jtcyk7Ci19Ci0KLVBh
c3NSZWZQdHI8SFRNTENvbGxlY3Rpb24+IERvY3VtZW50OjphbmNob3JzKCkKLXsKLSAgICByZXR1
cm4gY2FjaGVkQ29sbGVjdGlvbihEb2NBbmNob3JzKTsKLX0KLQotUGFzc1JlZlB0cjxIVE1MQ29s
bGVjdGlvbj4gRG9jdW1lbnQ6OmFsbCgpCi17Ci0gICAgcmV0dXJuIGNhY2hlZENvbGxlY3Rpb24o
RG9jQWxsKTsKLX0KLQotUGFzc1JlZlB0cjxIVE1MQ29sbGVjdGlvbj4gRG9jdW1lbnQ6OndpbmRv
d05hbWVkSXRlbXMoY29uc3QgQXRvbWljU3RyaW5nJiBuYW1lKQotewotICAgIE5hbWVkQ29sbGVj
dGlvbk1hcDo6QWRkUmVzdWx0IHJlc3VsdCA9IG1fd2luZG93TmFtZWRJdGVtQ29sbGVjdGlvbnMu
YWRkKG5hbWUsIDApOwotICAgIGlmICghcmVzdWx0LmlzTmV3RW50cnkpCi0gICAgICAgIHJldHVy
biByZXN1bHQuaXRlcmF0b3ItPnNlY29uZDsKLQotICAgIFJlZlB0cjxIVE1MTmFtZUNvbGxlY3Rp
b24+IGNvbGxlY3Rpb24gPSBIVE1MTmFtZUNvbGxlY3Rpb246OmNyZWF0ZSh0aGlzLCBXaW5kb3dO
YW1lZEl0ZW1zLCBuYW1lKTsKLSAgICByZXN1bHQuaXRlcmF0b3ItPnNlY29uZCA9IGNvbGxlY3Rp
b24uZ2V0KCk7Ci0gICAgcmV0dXJuIGNvbGxlY3Rpb24ucmVsZWFzZSgpOwotfQotCi1QYXNzUmVm
UHRyPEhUTUxDb2xsZWN0aW9uPiBEb2N1bWVudDo6ZG9jdW1lbnROYW1lZEl0ZW1zKGNvbnN0IEF0
b21pY1N0cmluZyYgbmFtZSkKLXsKLSAgICBOYW1lZENvbGxlY3Rpb25NYXA6OkFkZFJlc3VsdCBy
ZXN1bHQgPSBtX2RvY3VtZW50TmFtZWRJdGVtQ29sbGVjdGlvbnMuYWRkKG5hbWUsIDApOwotICAg
IGlmICghcmVzdWx0LmlzTmV3RW50cnkpCi0gICAgICAgIHJldHVybiByZXN1bHQuaXRlcmF0b3It
PnNlY29uZDsKLQotICAgIFJlZlB0cjxIVE1MTmFtZUNvbGxlY3Rpb24+IGNvbGxlY3Rpb24gPSBI
VE1MTmFtZUNvbGxlY3Rpb246OmNyZWF0ZSh0aGlzLCBEb2N1bWVudE5hbWVkSXRlbXMsIG5hbWUp
OwotICAgIHJlc3VsdC5pdGVyYXRvci0+c2Vjb25kID0gY29sbGVjdGlvbi5nZXQoKTsKLSAgICBy
ZXR1cm4gY29sbGVjdGlvbi5yZWxlYXNlKCk7Ci19Ci0KLS8vIEZJWE1FOiBUaGlzIGNhY2hpbmcg
bWVjaGFuaXNtIHNob3VsZCBiZSBtZXJnZWQgdGhhdCBvZiBEeW5hbWljTm9kZUxpc3QgaW4gTm9k
ZVJhcmVEYXRhLgotdm9pZCBEb2N1bWVudDo6cmVtb3ZlV2luZG93TmFtZWRJdGVtQ2FjaGUoSFRN
TENvbGxlY3Rpb24qIGNvbGxlY3Rpb24sIGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSkKLXsKLSAg
ICBBU1NFUlRfVU5VU0VEKGNvbGxlY3Rpb24sIG1fd2luZG93TmFtZWRJdGVtQ29sbGVjdGlvbnMu
Z2V0KG5hbWUpID09IGNvbGxlY3Rpb24pOwotICAgIG1fd2luZG93TmFtZWRJdGVtQ29sbGVjdGlv
bnMucmVtb3ZlKG5hbWUpOwotfQotCi12b2lkIERvY3VtZW50OjpyZW1vdmVEb2N1bWVudE5hbWVk
SXRlbUNhY2hlKEhUTUxDb2xsZWN0aW9uKiBjb2xsZWN0aW9uLCBjb25zdCBBdG9taWNTdHJpbmcm
IG5hbWUpCi17Ci0gICAgQVNTRVJUX1VOVVNFRChjb2xsZWN0aW9uLCBtX2RvY3VtZW50TmFtZWRJ
dGVtQ29sbGVjdGlvbnMuZ2V0KG5hbWUpID09IGNvbGxlY3Rpb24pOwotICAgIG1fZG9jdW1lbnRO
YW1lZEl0ZW1Db2xsZWN0aW9ucy5yZW1vdmUobmFtZSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmZp
bmlzaGVkUGFyc2luZygpCi17Ci0gICAgQVNTRVJUKCFzY3JpcHRhYmxlRG9jdW1lbnRQYXJzZXIo
KSB8fCAhbV9wYXJzZXItPmlzUGFyc2luZygpKTsKLSAgICBBU1NFUlQoIXNjcmlwdGFibGVEb2N1
bWVudFBhcnNlcigpIHx8IG1fcmVhZHlTdGF0ZSAhPSBMb2FkaW5nKTsKLSAgICBzZXRQYXJzaW5n
KGZhbHNlKTsKLSAgICBpZiAoIW1fZG9jdW1lbnRUaW1pbmcuZG9tQ29udGVudExvYWRlZEV2ZW50
U3RhcnQpCi0gICAgICAgIG1fZG9jdW1lbnRUaW1pbmcuZG9tQ29udGVudExvYWRlZEV2ZW50U3Rh
cnQgPSBtb25vdG9uaWNhbGx5SW5jcmVhc2luZ1RpbWUoKTsKLSAgICBkaXNwYXRjaEV2ZW50KEV2
ZW50OjpjcmVhdGUoZXZlbnROYW1lcygpLkRPTUNvbnRlbnRMb2FkZWRFdmVudCwgdHJ1ZSwgZmFs
c2UpKTsKLSAgICBpZiAoIW1fZG9jdW1lbnRUaW1pbmcuZG9tQ29udGVudExvYWRlZEV2ZW50RW5k
KQotICAgICAgICBtX2RvY3VtZW50VGltaW5nLmRvbUNvbnRlbnRMb2FkZWRFdmVudEVuZCA9IG1v
bm90b25pY2FsbHlJbmNyZWFzaW5nVGltZSgpOwotCi0gICAgaWYgKFJlZlB0cjxGcmFtZT4gZiA9
IGZyYW1lKCkpIHsKLSAgICAgICAgLy8gRnJhbWVMb2FkZXI6OmZpbmlzaGVkUGFyc2luZygpIG1p
Z2h0IGVuZCB1cCBjYWxsaW5nIERvY3VtZW50OjppbXBsaWNpdENsb3NlKCkgaWYgYWxsCi0gICAg
ICAgIC8vIHJlc291cmNlIGxvYWRzIGFyZSBjb21wbGV0ZS4gSFRNTE9iamVjdEVsZW1lbnRzIGNh
biBzdGFydCBsb2FkaW5nIHRoZWlyIHJlc291cmNlcyBmcm9tCi0gICAgICAgIC8vIHBvc3QgYXR0
YWNoIGNhbGxiYWNrcyB0cmlnZ2VyZWQgYnkgcmVjYWxjU3R5bGUoKS4gIFRoaXMgbWVhbnMgaWYg
d2UgcGFyc2Ugb3V0IGFuIDxvYmplY3Q+Ci0gICAgICAgIC8vIHRhZyBhbmQgdGhlbiByZWFjaCB0
aGUgZW5kIG9mIHRoZSBkb2N1bWVudCB3aXRob3V0IHVwZGF0aW5nIHN0eWxlcywgd2UgbWlnaHQg
bm90IGhhdmUgeWV0Ci0gICAgICAgIC8vIHN0YXJ0ZWQgdGhlIHJlc291cmNlIGxvYWQgYW5kIG1p
Z2h0IGZpcmUgdGhlIHdpbmRvdyBsb2FkIGV2ZW50IHRvbyBlYXJseS4gIFRvIGF2b2lkIHRoaXMK
LSAgICAgICAgLy8gd2UgZm9yY2UgdGhlIHN0eWxlcyB0byBiZSB1cCB0byBkYXRlIGJlZm9yZSBj
YWxsaW5nIEZyYW1lTG9hZGVyOjpmaW5pc2hlZFBhcnNpbmcoKS4KLSAgICAgICAgLy8gU2VlIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zNjg2NCBzdGFydGluZyBhcm91
bmQgY29tbWVudCAzNS4KLSAgICAgICAgdXBkYXRlU3R5bGVJZk5lZWRlZCgpOwotCi0gICAgICAg
IGYtPmxvYWRlcigpLT5maW5pc2hlZFBhcnNpbmcoKTsKLQotICAgICAgICBJbnNwZWN0b3JJbnN0
cnVtZW50YXRpb246OmRvbUNvbnRlbnRMb2FkZWRFdmVudEZpcmVkKGYuZ2V0KCkpOwotICAgIH0K
LQotICAgIC8vIFRoZSBFbGVtZW50QXR0cmlidXRlRGF0YSBzaGFyaW5nIGNhY2hlIGlzIG9ubHkg
dXNlZCBkdXJpbmcgcGFyc2luZyBzaW5jZQotICAgIC8vIHRoYXQncyB3aGVuIHRoZSBtYWpvcml0
eSBvZiBpbW11dGFibGUgYXR0cmlidXRlIGRhdGEgd2lsbCBiZSBjcmVhdGVkLgotICAgIG1faW1t
dXRhYmxlQXR0cmlidXRlRGF0YUNhY2hlLmNsZWFyKCk7Ci19Ci0KLVBhc3NSZWZQdHI8WFBhdGhF
eHByZXNzaW9uPiBEb2N1bWVudDo6Y3JlYXRlRXhwcmVzc2lvbihjb25zdCBTdHJpbmcmIGV4cHJl
c3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgWFBhdGhOU1Jlc29sdmVyKiByZXNvbHZlciwKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAg
ICBpZiAoIW1feHBhdGhFdmFsdWF0b3IpCi0gICAgICAgIG1feHBhdGhFdmFsdWF0b3IgPSBYUGF0
aEV2YWx1YXRvcjo6Y3JlYXRlKCk7Ci0gICAgcmV0dXJuIG1feHBhdGhFdmFsdWF0b3ItPmNyZWF0
ZUV4cHJlc3Npb24oZXhwcmVzc2lvbiwgcmVzb2x2ZXIsIGVjKTsKLX0KLQotUGFzc1JlZlB0cjxY
UGF0aE5TUmVzb2x2ZXI+IERvY3VtZW50OjpjcmVhdGVOU1Jlc29sdmVyKE5vZGUqIG5vZGVSZXNv
bHZlcikKLXsKLSAgICBpZiAoIW1feHBhdGhFdmFsdWF0b3IpCi0gICAgICAgIG1feHBhdGhFdmFs
dWF0b3IgPSBYUGF0aEV2YWx1YXRvcjo6Y3JlYXRlKCk7Ci0gICAgcmV0dXJuIG1feHBhdGhFdmFs
dWF0b3ItPmNyZWF0ZU5TUmVzb2x2ZXIobm9kZVJlc29sdmVyKTsKLX0KLQotUGFzc1JlZlB0cjxY
UGF0aFJlc3VsdD4gRG9jdW1lbnQ6OmV2YWx1YXRlKGNvbnN0IFN0cmluZyYgZXhwcmVzc2lvbiwK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlKiBjb250ZXh0
Tm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYUGF0aE5T
UmVzb2x2ZXIqIHJlc29sdmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHVuc2lnbmVkIHNob3J0IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgWFBhdGhSZXN1bHQqIHJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICBpZiAoIW1f
eHBhdGhFdmFsdWF0b3IpCi0gICAgICAgIG1feHBhdGhFdmFsdWF0b3IgPSBYUGF0aEV2YWx1YXRv
cjo6Y3JlYXRlKCk7Ci0gICAgcmV0dXJuIG1feHBhdGhFdmFsdWF0b3ItPmV2YWx1YXRlKGV4cHJl
c3Npb24sIGNvbnRleHROb2RlLCByZXNvbHZlciwgdHlwZSwgcmVzdWx0LCBlYyk7Ci19Ci0KLWNv
bnN0IFZlY3RvcjxJY29uVVJMPiYgRG9jdW1lbnQ6Omljb25VUkxzKCkKLXsKLSAgICBtX2ljb25V
UkxzLmNsZWFyKCk7Ci0KLSAgICBpZiAoIWhlYWQoKSB8fCAhKGhlYWQoKS0+Y2hpbGRyZW4oKSkp
Ci0gICAgICAgIHJldHVybiBtX2ljb25VUkxzOwotCi0gICAgLy8gSW5jbHVkZSBhbnkgaWNvbnMg
d2hlcmUgdHlwZSA9IGxpbmssIHJlbCA9ICJzaG9ydGN1dCBpY29uIi4KLSAgICBSZWZQdHI8SFRN
TENvbGxlY3Rpb24+IGNoaWxkcmVuID0gaGVhZCgpLT5jaGlsZHJlbigpOwotICAgIHVuc2lnbmVk
IGludCBsZW5ndGggPSBjaGlsZHJlbi0+bGVuZ3RoKCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpbnQg
aSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewotICAgICAgICBOb2RlKiBjaGlsZCA9IGNoaWxkcmVu
LT5pdGVtKGkpOwotICAgICAgICBpZiAoIWNoaWxkLT5oYXNUYWdOYW1lKGxpbmtUYWcpKQotICAg
ICAgICAgICAgY29udGludWU7Ci0gICAgICAgIEhUTUxMaW5rRWxlbWVudCogbGlua0VsZW1lbnQg
PSBzdGF0aWNfY2FzdDxIVE1MTGlua0VsZW1lbnQqPihjaGlsZCk7Ci0gICAgICAgIGlmIChsaW5r
RWxlbWVudC0+aWNvblR5cGUoKSAhPSBGYXZpY29uKQotICAgICAgICAgICAgY29udGludWU7Ci0g
ICAgICAgIGlmIChsaW5rRWxlbWVudC0+aHJlZigpLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIGNv
bnRpbnVlOwotCi0gICAgICAgIC8vIFB1dCBpdCBhdCB0aGUgZnJvbnQgdG8gZW5zdXJlIHRoYXQg
aWNvbnMgc2VlbiBsYXRlciB0YWtlIHByZWNlZGVuY2UgYXMgcmVxdWlyZWQgYnkgdGhlIHNwZWMu
Ci0gICAgICAgIEljb25VUkwgbmV3VVJMKGxpbmtFbGVtZW50LT5ocmVmKCksIGxpbmtFbGVtZW50
LT5pY29uU2l6ZXMoKSwgbGlua0VsZW1lbnQtPnR5cGUoKSwgbGlua0VsZW1lbnQtPmljb25UeXBl
KCkpOwotICAgICAgICBtX2ljb25VUkxzLnByZXBlbmQobmV3VVJMKTsKLSAgICB9Ci0KLSAgICBy
ZXR1cm4gbV9pY29uVVJMczsKLX0KLQotdm9pZCBEb2N1bWVudDo6YWRkSWNvblVSTChjb25zdCBT
dHJpbmcmIHVybCwgY29uc3QgU3RyaW5nJiBtaW1lVHlwZSwgY29uc3QgU3RyaW5nJiBzaXplcywg
SWNvblR5cGUgaWNvblR5cGUpCi17Ci0gICAgaWYgKHVybC5pc0VtcHR5KCkpCi0gICAgICAgIHJl
dHVybjsKLQotICAgIC8vIEZJWE1FIC0gPHJkYXI6Ly9wcm9ibGVtLzQ3Mjc2NDU+IC0gQXQgc29t
ZSBwb2ludCBpbiB0aGUgZnV0dXJlLCB3ZSBtaWdodCBhY3R1YWxseSBob25vciB0aGUgIm1pbWVU
eXBlIgotICAgIEljb25VUkwgbmV3VVJMKEtVUkwoUGFyc2VkVVJMU3RyaW5nLCB1cmwpLCBzaXpl
cywgbWltZVR5cGUsIGljb25UeXBlKTsKLQotICAgIGlmIChGcmFtZSogZiA9IGZyYW1lKCkpIHsK
LSAgICAgICAgSWNvblVSTCBpY29uVVJMID0gZi0+bG9hZGVyKCktPmljb24oKS0+aWNvblVSTChp
Y29uVHlwZSk7Ci0gICAgICAgIGlmIChpY29uVVJMID09IG5ld1VSTCkKLSAgICAgICAgICAgIGYt
PmxvYWRlcigpLT5kaWRDaGFuZ2VJY29ucyhpY29uVHlwZSk7Ci0gICAgfQotfQotCi12b2lkIERv
Y3VtZW50OjpzZXRVc2VTZWN1cmVLZXlib2FyZEVudHJ5V2hlbkFjdGl2ZShib29sIHVzZXNTZWN1
cmVLZXlib2FyZCkKLXsKLSAgICBpZiAobV91c2VTZWN1cmVLZXlib2FyZEVudHJ5V2hlbkFjdGl2
ZSA9PSB1c2VzU2VjdXJlS2V5Ym9hcmQpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fdXNlU2Vj
dXJlS2V5Ym9hcmRFbnRyeVdoZW5BY3RpdmUgPSB1c2VzU2VjdXJlS2V5Ym9hcmQ7Ci0gICAgbV9m
cmFtZS0+c2VsZWN0aW9uKCktPnVwZGF0ZVNlY3VyZUtleWJvYXJkRW50cnlJZkFjdGl2ZSgpOwot
fQotCi1ib29sIERvY3VtZW50Ojp1c2VTZWN1cmVLZXlib2FyZEVudHJ5V2hlbkFjdGl2ZSgpIGNv
bnN0Ci17Ci0gICAgcmV0dXJuIG1fdXNlU2VjdXJlS2V5Ym9hcmRFbnRyeVdoZW5BY3RpdmU7Ci19
Ci0KLXN0YXRpYyBib29sIGlzRWxpZ2libGVGb3JTZWFtbGVzcyhEb2N1bWVudCogcGFyZW50LCBE
b2N1bWVudCogY2hpbGQpCi17Ci0gICAgLy8gSXQgc2hvdWxkIG5vdCBtYXR0ZXIgd2hhdCB3ZSBy
ZXR1cm4gZm9yIHRoZSB0b3AtbW9zdCBkb2N1bWVudC4KLSAgICBpZiAoIXBhcmVudCkKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChwYXJlbnQtPmlzU2FuZGJveGVkKFNhbmRib3hTZWFt
bGVzc0lmcmFtZXMpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKGNoaWxkLT5pc1Ny
Y2RvY0RvY3VtZW50KCkpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIGlmIChwYXJlbnQtPnNl
Y3VyaXR5T3JpZ2luKCktPmNhbkFjY2VzcyhjaGlsZC0+c2VjdXJpdHlPcmlnaW4oKSkpCi0gICAg
ICAgIHJldHVybiB0cnVlOwotICAgIHJldHVybiBwYXJlbnQtPnNlY3VyaXR5T3JpZ2luKCktPmNh
blJlcXVlc3QoY2hpbGQtPnVybCgpKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6aW5pdFNlY3VyaXR5
Q29udGV4dCgpCi17Ci0gICAgaWYgKGhhdmVJbml0aWFsaXplZFNlY3VyaXR5T3JpZ2luKCkpIHsK
LSAgICAgICAgQVNTRVJUKHNlY3VyaXR5T3JpZ2luKCkpOwotICAgICAgICByZXR1cm47Ci0gICAg
fQotCi0gICAgaWYgKCFtX2ZyYW1lKSB7Ci0gICAgICAgIC8vIE5vIHNvdXJjZSBmb3IgYSBzZWN1
cml0eSBjb250ZXh0LgotICAgICAgICAvLyBUaGlzIGNhbiBvY2N1ciB2aWEgZG9jdW1lbnQuaW1w
bGVtZW50YXRpb24uY3JlYXRlRG9jdW1lbnQoKS4KLSAgICAgICAgbV9jb29raWVVUkwgPSBLVVJM
KFBhcnNlZFVSTFN0cmluZywgZW1wdHlTdHJpbmcoKSk7Ci0gICAgICAgIHNldFNlY3VyaXR5T3Jp
Z2luKFNlY3VyaXR5T3JpZ2luOjpjcmVhdGVVbmlxdWUoKSk7Ci0gICAgICAgIHNldENvbnRlbnRT
ZWN1cml0eVBvbGljeShDb250ZW50U2VjdXJpdHlQb2xpY3k6OmNyZWF0ZSh0aGlzKSk7Ci0gICAg
ICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBJbiB0aGUgY29tbW9uIGNhc2UsIGNyZWF0ZSB0
aGUgc2VjdXJpdHkgY29udGV4dCBmcm9tIHRoZSBjdXJyZW50bHkKLSAgICAvLyBsb2FkaW5nIFVS
TCB3aXRoIGEgZnJlc2ggY29udGVudCBzZWN1cml0eSBwb2xpY3kuCi0gICAgbV9jb29raWVVUkwg
PSBtX3VybDsKLSAgICBlbmZvcmNlU2FuZGJveEZsYWdzKG1fZnJhbWUtPmxvYWRlcigpLT5lZmZl
Y3RpdmVTYW5kYm94RmxhZ3MoKSk7Ci0gICAgc2V0U2VjdXJpdHlPcmlnaW4oaXNTYW5kYm94ZWQo
U2FuZGJveE9yaWdpbikgPyBTZWN1cml0eU9yaWdpbjo6Y3JlYXRlVW5pcXVlKCkgOiBTZWN1cml0
eU9yaWdpbjo6Y3JlYXRlKG1fdXJsKSk7Ci0gICAgc2V0Q29udGVudFNlY3VyaXR5UG9saWN5KENv
bnRlbnRTZWN1cml0eVBvbGljeTo6Y3JlYXRlKHRoaXMpKTsKLQotICAgIGlmIChTZWN1cml0eVBv
bGljeTo6YWxsb3dTdWJzdGl0dXRlRGF0YUFjY2Vzc1RvTG9jYWwoKSkgewotICAgICAgICAvLyBJ
ZiB0aGlzIGRvY3VtZW50IHdhcyBsb2FkZWQgd2l0aCBzdWJzdGl0dXRlRGF0YSwgdGhlbiB0aGUg
ZG9jdW1lbnQgY2FuCi0gICAgICAgIC8vIGxvYWQgbG9jYWwgcmVzb3VyY2VzLiAgU2VlIGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjc1NgotICAgICAgICAvLyBhbmQg
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE5NzYwIGZvciBmdXJ0aGVy
Ci0gICAgICAgIC8vIGRpc2N1c3Npb24uCi0gICAgICAgIAotICAgICAgICBEb2N1bWVudExvYWRl
ciogZG9jdW1lbnRMb2FkZXIgPSBsb2FkZXIoKTsKLSAgICAgICAgaWYgKGRvY3VtZW50TG9hZGVy
ICYmIGRvY3VtZW50TG9hZGVyLT5zdWJzdGl0dXRlRGF0YSgpLmlzVmFsaWQoKSkKLSAgICAgICAg
ICAgIHNlY3VyaXR5T3JpZ2luKCktPmdyYW50TG9hZExvY2FsUmVzb3VyY2VzKCk7Ci0gICAgfQot
Ci0gICAgaWYgKFNldHRpbmdzKiBzZXR0aW5ncyA9IHRoaXMtPnNldHRpbmdzKCkpIHsKLSAgICAg
ICAgaWYgKCFzZXR0aW5ncy0+aXNXZWJTZWN1cml0eUVuYWJsZWQoKSkgewotICAgICAgICAgICAg
Ly8gV2ViIHNlY3VyaXR5IGlzIHR1cm5lZCBvZmYuIFdlIHNob3VsZCBsZXQgdGhpcyBkb2N1bWVu
dCBhY2Nlc3MgZXZlcnkgb3RoZXIgZG9jdW1lbnQuIFRoaXMgaXMgdXNlZCBwcmltYXJ5IGJ5IHRl
c3RpbmcKLSAgICAgICAgICAgIC8vIGhhcm5lc3NlcyBmb3Igd2ViIHNpdGVzLgotICAgICAgICAg
ICAgc2VjdXJpdHlPcmlnaW4oKS0+Z3JhbnRVbml2ZXJzYWxBY2Nlc3MoKTsKLSAgICAgICAgfSBl
bHNlIGlmIChzZWN1cml0eU9yaWdpbigpLT5pc0xvY2FsKCkpIHsKLSAgICAgICAgICAgIGlmIChz
ZXR0aW5ncy0+YWxsb3dVbml2ZXJzYWxBY2Nlc3NGcm9tRmlsZVVSTHMoKSB8fCBtX2ZyYW1lLT5s
b2FkZXIoKS0+Y2xpZW50KCktPnNob3VsZEZvcmNlVW5pdmVyc2FsQWNjZXNzRnJvbUxvY2FsVVJM
KG1fdXJsKSkgewotICAgICAgICAgICAgICAgIC8vIFNvbWUgY2xpZW50cyB3YW50IGxvY2FsIFVS
THMgdG8gaGF2ZSB1bml2ZXJzYWwgYWNjZXNzLCBidXQgdGhhdCBzZXR0aW5nIGlzIGRhbmdlcm91
cyBmb3Igb3RoZXIgY2xpZW50cy4KLSAgICAgICAgICAgICAgICBzZWN1cml0eU9yaWdpbigpLT5n
cmFudFVuaXZlcnNhbEFjY2VzcygpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc2V0dGluZ3Mt
PmFsbG93RmlsZUFjY2Vzc0Zyb21GaWxlVVJMcygpKSB7Ci0gICAgICAgICAgICAgICAgLy8gU29t
ZSBjbGllbnRzIHdhbnQgbG9jYWwgVVJMcyB0byBoYXZlIGV2ZW4gdGlnaHRlciByZXN0cmljdGlv
bnMgYnkgZGVmYXVsdCwgYW5kIG5vdCBiZSBhYmxlIHRvIGFjY2VzcyBvdGhlciBsb2NhbCBmaWxl
cy4KLSAgICAgICAgICAgICAgICAvLyBGSVhNRSA4MTU3ODogVGhlIG5hbWluZyBvZiB0aGlzIGlz
IGNvbmZ1c2luZy4gRmlsZXMgd2l0aCByZXN0cmljdGVkIGFjY2VzcyB0byBvdGhlciBsb2NhbCBm
aWxlcwotICAgICAgICAgICAgICAgIC8vIHN0aWxsIGNhbiBoYXZlIG90aGVyIHByaXZpbGVnZXMg
dGhhdCBjYW4gYmUgcmVtZW1iZXJlZCwgdGhlcmVieSBub3QgbWFraW5nIHRoZW0gdW5pcXVlIG9y
aWdpbnMuCi0gICAgICAgICAgICAgICAgc2VjdXJpdHlPcmlnaW4oKS0+ZW5mb3JjZUZpbGVQYXRo
U2VwYXJhdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHNlY3VyaXR5
T3JpZ2luKCktPnNldFN0b3JhZ2VCbG9ja2luZ1BvbGljeShzZXR0aW5ncy0+c3RvcmFnZUJsb2Nr
aW5nUG9saWN5KCkpOwotICAgIH0KLQotICAgIERvY3VtZW50KiBwYXJlbnREb2N1bWVudCA9IG93
bmVyRWxlbWVudCgpID8gb3duZXJFbGVtZW50KCktPmRvY3VtZW50KCkgOiAwOwotICAgIGlmIChw
YXJlbnREb2N1bWVudCAmJiBtX2ZyYW1lLT5sb2FkZXIoKS0+c2hvdWxkVHJlYXRVUkxBc1NyY2Rv
Y0RvY3VtZW50KHVybCgpKSkgewotICAgICAgICBtX2lzU3JjZG9jRG9jdW1lbnQgPSB0cnVlOwot
ICAgICAgICBzZXRCYXNlVVJMT3ZlcnJpZGUocGFyZW50RG9jdW1lbnQtPmJhc2VVUkwoKSk7Ci0g
ICAgfQotCi0gICAgLy8gRklYTUU6IFdoYXQgaGFwcGVucyBpZiB3ZSBpbmhlcml0IHRoZSBzZWN1
cml0eSBvcmlnaW4/IFRoaXMgY2hlY2sgbWF5IG5lZWQgdG8gYmUgbGF0ZXIuCi0gICAgLy8gPGlm
cmFtZSBzZWFtbGVzcyBzcmM9ImFib3V0OmJsYW5rIj4gbGlrZWx5IHdvbid0IHdvcmsgYXMtaXMu
Ci0gICAgbV9tYXlEaXNwbGF5U2VhbWxlc3NXaXRoUGFyZW50ID0gaXNFbGlnaWJsZUZvclNlYW1s
ZXNzKHBhcmVudERvY3VtZW50LCB0aGlzKTsKLQotICAgIGlmICghc2hvdWxkSW5oZXJpdFNlY3Vy
aXR5T3JpZ2luRnJvbU93bmVyKG1fdXJsKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gSWYg
d2UgZG8gbm90IG9idGFpbiBhIG1lYW5pbmdmdWwgb3JpZ2luIGZyb20gdGhlIFVSTCwgdGhlbiB3
ZSB0cnkgdG8KLSAgICAvLyBmaW5kIG9uZSB2aWEgdGhlIGZyYW1lIGhpZXJhcmNoeS4KLQotICAg
IEZyYW1lKiBvd25lckZyYW1lID0gbV9mcmFtZS0+dHJlZSgpLT5wYXJlbnQoKTsKLSAgICBpZiAo
IW93bmVyRnJhbWUpCi0gICAgICAgIG93bmVyRnJhbWUgPSBtX2ZyYW1lLT5sb2FkZXIoKS0+b3Bl
bmVyKCk7Ci0KLSAgICBpZiAoIW93bmVyRnJhbWUpIHsKLSAgICAgICAgZGlkRmFpbFRvSW5pdGlh
bGl6ZVNlY3VyaXR5T3JpZ2luKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAo
aXNTYW5kYm94ZWQoU2FuZGJveE9yaWdpbikpIHsKLSAgICAgICAgLy8gSWYgd2UncmUgc3VwcG9z
ZWQgdG8gaW5oZXJpdCBvdXIgc2VjdXJpdHkgb3JpZ2luIGZyb20gb3VyIG93bmVyLAotICAgICAg
ICAvLyBidXQgd2UncmUgYWxzbyBzYW5kYm94ZWQsIHRoZSBvbmx5IHRoaW5nIHdlIGluaGVyaXQg
aXMgdGhlIGFiaWxpdHkKLSAgICAgICAgLy8gdG8gbG9hZCBsb2NhbCByZXNvdXJjZXMuIFRoaXMg
bGV0cyBhYm91dDpibGFuayBpZnJhbWVzIGluIGZpbGU6Ly8KLSAgICAgICAgLy8gVVJMIGRvY3Vt
ZW50cyBsb2FkIGltYWdlcyBhbmQgb3RoZXIgcmVzb3VyY2VzIGZyb20gdGhlIGZpbGUgc3lzdGVt
LgotICAgICAgICBpZiAob3duZXJGcmFtZS0+ZG9jdW1lbnQoKS0+c2VjdXJpdHlPcmlnaW4oKS0+
Y2FuTG9hZExvY2FsUmVzb3VyY2VzKCkpCi0gICAgICAgICAgICBzZWN1cml0eU9yaWdpbigpLT5n
cmFudExvYWRMb2NhbFJlc291cmNlcygpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAg
bV9jb29raWVVUkwgPSBvd25lckZyYW1lLT5kb2N1bWVudCgpLT5jb29raWVVUkwoKTsKLSAgICAv
LyBXZSBhbGlhcyB0aGUgU2VjdXJpdHlPcmlnaW5zIHRvIG1hdGNoIEZpcmVmb3gsIHNlZSBCdWcg
MTUzMTMKLSAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTUz
MTMKLSAgICBzZXRTZWN1cml0eU9yaWdpbihvd25lckZyYW1lLT5kb2N1bWVudCgpLT5zZWN1cml0
eU9yaWdpbigpKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6aW5pdENvbnRlbnRTZWN1cml0eVBvbGlj
eSgpCi17Ci0gICAgaWYgKCFtX2ZyYW1lLT50cmVlKCktPnBhcmVudCgpIHx8ICghc2hvdWxkSW5o
ZXJpdFNlY3VyaXR5T3JpZ2luRnJvbU93bmVyKG1fdXJsKSAmJiAhaXNQbHVnaW5Eb2N1bWVudCgp
KSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY29udGVudFNlY3VyaXR5UG9saWN5KCktPmNvcHlT
dGF0ZUZyb20obV9mcmFtZS0+dHJlZSgpLT5wYXJlbnQoKS0+ZG9jdW1lbnQoKS0+Y29udGVudFNl
Y3VyaXR5UG9saWN5KCkpOwotfQotCi12b2lkIERvY3VtZW50OjpkaWRVcGRhdGVTZWN1cml0eU9y
aWdpbigpCi17Ci0gICAgaWYgKCFtX2ZyYW1lKQotICAgICAgICByZXR1cm47Ci0gICAgbV9mcmFt
ZS0+c2NyaXB0KCktPnVwZGF0ZVNlY3VyaXR5T3JpZ2luKCk7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6
OmlzQ29udGV4dFRocmVhZCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGlzTWFpblRocmVhZCgpOwot
fQotCi12b2lkIERvY3VtZW50Ojp1cGRhdGVVUkxGb3JQdXNoT3JSZXBsYWNlU3RhdGUoY29uc3Qg
S1VSTCYgdXJsKQotewotICAgIEZyYW1lKiBmID0gZnJhbWUoKTsKLSAgICBpZiAoIWYpCi0gICAg
ICAgIHJldHVybjsKLQotICAgIHNldFVSTCh1cmwpOwotICAgIGYtPmxvYWRlcigpLT5zZXRPdXRn
b2luZ1JlZmVycmVyKHVybCk7Ci0KLSAgICBpZiAoRG9jdW1lbnRMb2FkZXIqIGRvY3VtZW50TG9h
ZGVyID0gbG9hZGVyKCkpCi0gICAgICAgIGRvY3VtZW50TG9hZGVyLT5yZXBsYWNlUmVxdWVzdFVS
TEZvclNhbWVEb2N1bWVudE5hdmlnYXRpb24odXJsKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6c3Rh
dGVQb3BwZWQoUGFzc1JlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IHN0YXRlT2JqZWN0KQot
ewotICAgIGlmICghZnJhbWUoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIC8vIFBlciBz
dGVwIDExIG9mIHNlY3Rpb24gNi41LjkgKGhpc3RvcnkgdHJhdmVyc2FsKSBvZiB0aGUgSFRNTDUg
c3BlYywgd2UgCi0gICAgLy8gZGVmZXIgZmlyaW5nIG9mIHBvcHN0YXRlIHVudGlsIHdlJ3JlIGlu
IHRoZSBjb21wbGV0ZSBzdGF0ZS4KLSAgICBpZiAobV9yZWFkeVN0YXRlID09IENvbXBsZXRlKQot
ICAgICAgICBlbnF1ZXVlUG9wc3RhdGVFdmVudChzdGF0ZU9iamVjdCk7Ci0gICAgZWxzZQotICAg
ICAgICBtX3BlbmRpbmdTdGF0ZU9iamVjdCA9IHN0YXRlT2JqZWN0OwotfQotCi12b2lkIERvY3Vt
ZW50Ojp1cGRhdGVGb2N1c0FwcGVhcmFuY2VTb29uKGJvb2wgcmVzdG9yZVByZXZpb3VzU2VsZWN0
aW9uKQotewotICAgIG1fdXBkYXRlRm9jdXNBcHBlYXJhbmNlUmVzdG9yZXNTZWxlY3Rpb24gPSBy
ZXN0b3JlUHJldmlvdXNTZWxlY3Rpb247Ci0gICAgaWYgKCFtX3VwZGF0ZUZvY3VzQXBwZWFyYW5j
ZVRpbWVyLmlzQWN0aXZlKCkpCi0gICAgICAgIG1fdXBkYXRlRm9jdXNBcHBlYXJhbmNlVGltZXIu
c3RhcnRPbmVTaG90KDApOwotfQotCi12b2lkIERvY3VtZW50OjpjYW5jZWxGb2N1c0FwcGVhcmFu
Y2VVcGRhdGUoKQotewotICAgIG1fdXBkYXRlRm9jdXNBcHBlYXJhbmNlVGltZXIuc3RvcCgpOwot
fQotCi12b2lkIERvY3VtZW50Ojp1cGRhdGVGb2N1c0FwcGVhcmFuY2VUaW1lckZpcmVkKFRpbWVy
PERvY3VtZW50PiopCi17Ci0gICAgTm9kZSogbm9kZSA9IGZvY3VzZWROb2RlKCk7Ci0gICAgaWYg
KCFub2RlKQotICAgICAgICByZXR1cm47Ci0gICAgaWYgKCFub2RlLT5pc0VsZW1lbnROb2RlKCkp
Ci0gICAgICAgIHJldHVybjsKLQotICAgIHVwZGF0ZUxheW91dCgpOwotCi0gICAgRWxlbWVudCog
ZWxlbWVudCA9IHN0YXRpY19jYXN0PEVsZW1lbnQqPihub2RlKTsKLSAgICBpZiAoZWxlbWVudC0+
aXNGb2N1c2FibGUoKSkKLSAgICAgICAgZWxlbWVudC0+dXBkYXRlRm9jdXNBcHBlYXJhbmNlKG1f
dXBkYXRlRm9jdXNBcHBlYXJhbmNlUmVzdG9yZXNTZWxlY3Rpb24pOwotfQotCi12b2lkIERvY3Vt
ZW50OjphdHRhY2hSYW5nZShSYW5nZSogcmFuZ2UpCi17Ci0gICAgQVNTRVJUKCFtX3Jhbmdlcy5j
b250YWlucyhyYW5nZSkpOwotICAgIG1fcmFuZ2VzLmFkZChyYW5nZSk7Ci19Ci0KLXZvaWQgRG9j
dW1lbnQ6OmRldGFjaFJhbmdlKFJhbmdlKiByYW5nZSkKLXsKLSAgICAvLyBXZSBkb24ndCBBU1NF
UlQgbV9yYW5nZXMuY29udGFpbnMocmFuZ2UpIHRvIGFsbG93IHVzIHRvIGNhbGwgdGhpcwotICAg
IC8vIHVuY29uZGl0aW9uYWxseSB0byBmaXg6IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD0yNjA0NAotICAgIG1fcmFuZ2VzLnJlbW92ZShyYW5nZSk7Ci19Ci0KLUNhbnZh
c1JlbmRlcmluZ0NvbnRleHQqIERvY3VtZW50OjpnZXRDU1NDYW52YXNDb250ZXh0KGNvbnN0IFN0
cmluZyYgdHlwZSwgY29uc3QgU3RyaW5nJiBuYW1lLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCi17
Ci0gICAgSFRNTENhbnZhc0VsZW1lbnQqIGVsZW1lbnQgPSBnZXRDU1NDYW52YXNFbGVtZW50KG5h
bWUpOwotICAgIGlmICghZWxlbWVudCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgZWxlbWVudC0+
c2V0U2l6ZShJbnRTaXplKHdpZHRoLCBoZWlnaHQpKTsKLSAgICByZXR1cm4gZWxlbWVudC0+Z2V0
Q29udGV4dCh0eXBlKTsKLX0KLQotSFRNTENhbnZhc0VsZW1lbnQqIERvY3VtZW50OjpnZXRDU1ND
YW52YXNFbGVtZW50KGNvbnN0IFN0cmluZyYgbmFtZSkKLXsKLSAgICBSZWZQdHI8SFRNTENhbnZh
c0VsZW1lbnQ+JiBlbGVtZW50ID0gbV9jc3NDYW52YXNFbGVtZW50cy5hZGQobmFtZSwgMCkuaXRl
cmF0b3ItPnNlY29uZDsKLSAgICBpZiAoIWVsZW1lbnQpCi0gICAgICAgIGVsZW1lbnQgPSBIVE1M
Q2FudmFzRWxlbWVudDo6Y3JlYXRlKHRoaXMpOwotICAgIHJldHVybiBlbGVtZW50LmdldCgpOwot
fQotCi12b2lkIERvY3VtZW50Ojppbml0RE5TUHJlZmV0Y2goKQotewotICAgIFNldHRpbmdzKiBz
ZXR0aW5ncyA9IHRoaXMtPnNldHRpbmdzKCk7Ci0KLSAgICBtX2hhdmVFeHBsaWNpdGx5RGlzYWJs
ZWRETlNQcmVmZXRjaCA9IGZhbHNlOwotICAgIG1faXNETlNQcmVmZXRjaEVuYWJsZWQgPSBzZXR0
aW5ncyAmJiBzZXR0aW5ncy0+ZG5zUHJlZmV0Y2hpbmdFbmFibGVkKCkgJiYgc2VjdXJpdHlPcmln
aW4oKS0+cHJvdG9jb2woKSA9PSAiaHR0cCI7Ci0KLSAgICAvLyBJbmhlcml0IEROUyBwcmVmZXRj
aCBvcHQtb3V0IGZyb20gcGFyZW50IGZyYW1lICAgIAotICAgIGlmIChEb2N1bWVudCogcGFyZW50
ID0gcGFyZW50RG9jdW1lbnQoKSkgewotICAgICAgICBpZiAoIXBhcmVudC0+aXNETlNQcmVmZXRj
aEVuYWJsZWQoKSkKLSAgICAgICAgICAgIG1faXNETlNQcmVmZXRjaEVuYWJsZWQgPSBmYWxzZTsK
LSAgICB9Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnBhcnNlRE5TUHJlZmV0Y2hDb250cm9sSGVhZGVy
KGNvbnN0IFN0cmluZyYgZG5zUHJlZmV0Y2hDb250cm9sKQotewotICAgIGlmIChlcXVhbElnbm9y
aW5nQ2FzZShkbnNQcmVmZXRjaENvbnRyb2wsICJvbiIpICYmICFtX2hhdmVFeHBsaWNpdGx5RGlz
YWJsZWRETlNQcmVmZXRjaCkgewotICAgICAgICBtX2lzRE5TUHJlZmV0Y2hFbmFibGVkID0gdHJ1
ZTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1faXNETlNQcmVmZXRjaEVuYWJsZWQg
PSBmYWxzZTsKLSAgICBtX2hhdmVFeHBsaWNpdGx5RGlzYWJsZWRETlNQcmVmZXRjaCA9IHRydWU7
Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmFkZE1lc3NhZ2UoTWVzc2FnZVNvdXJjZSBzb3VyY2UsIE1l
c3NhZ2VUeXBlIHR5cGUsIE1lc3NhZ2VMZXZlbCBsZXZlbCwgY29uc3QgU3RyaW5nJiBtZXNzYWdl
LCBjb25zdCBTdHJpbmcmIHNvdXJjZVVSTCwgdW5zaWduZWQgbGluZU51bWJlciwgUGFzc1JlZlB0
cjxTY3JpcHRDYWxsU3RhY2s+IGNhbGxTdGFjaykKLXsKLSAgICBpZiAoIWlzQ29udGV4dFRocmVh
ZCgpKSB7Ci0gICAgICAgIHBvc3RUYXNrKEFkZENvbnNvbGVNZXNzYWdlVGFzazo6Y3JlYXRlKHNv
dXJjZSwgdHlwZSwgbGV2ZWwsIG1lc3NhZ2UpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQot
ICAgIGlmIChET01XaW5kb3cqIHdpbmRvdyA9IGRvbVdpbmRvdygpKQotICAgICAgICB3aW5kb3ct
PmNvbnNvbGUoKS0+YWRkTWVzc2FnZShzb3VyY2UsIHR5cGUsIGxldmVsLCBtZXNzYWdlLCBzb3Vy
Y2VVUkwsIGxpbmVOdW1iZXIsIGNhbGxTdGFjayk7Ci19Ci0KLXN0cnVjdCBQZXJmb3JtVGFza0Nv
bnRleHQgewotICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKFBlcmZvcm1UYXNrQ29udGV4dCk7IFdU
Rl9NQUtFX0ZBU1RfQUxMT0NBVEVEOwotcHVibGljOgotICAgIFBlcmZvcm1UYXNrQ29udGV4dChQ
YXNzUmVmUHRyPERvY3VtZW50V2Vha1JlZmVyZW5jZT4gZG9jdW1lbnRSZWZlcmVuY2UsIFBhc3NP
d25QdHI8U2NyaXB0RXhlY3V0aW9uQ29udGV4dDo6VGFzaz4gdGFzaykKLSAgICAgICAgOiBkb2N1
bWVudFJlZmVyZW5jZShkb2N1bWVudFJlZmVyZW5jZSkKLSAgICAgICAgLCB0YXNrKHRhc2spCi0g
ICAgewotICAgIH0KLQotICAgIFJlZlB0cjxEb2N1bWVudFdlYWtSZWZlcmVuY2U+IGRvY3VtZW50
UmVmZXJlbmNlOwotICAgIE93blB0cjxTY3JpcHRFeGVjdXRpb25Db250ZXh0OjpUYXNrPiB0YXNr
OwotfTsKLQotdm9pZCBEb2N1bWVudDo6ZGlkUmVjZWl2ZVRhc2sodm9pZCogdW50eXBlZENvbnRl
eHQpCi17Ci0gICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKLQotICAgIE93blB0cjxQZXJmb3Jt
VGFza0NvbnRleHQ+IGNvbnRleHQgPSBhZG9wdFB0cihzdGF0aWNfY2FzdDxQZXJmb3JtVGFza0Nv
bnRleHQqPih1bnR5cGVkQ29udGV4dCkpOwotICAgIEFTU0VSVChjb250ZXh0KTsKLQotICAgIERv
Y3VtZW50KiBkb2N1bWVudCA9IGNvbnRleHQtPmRvY3VtZW50UmVmZXJlbmNlLT5kb2N1bWVudCgp
OwotICAgIGlmICghZG9jdW1lbnQpCi0gICAgICAgIHJldHVybjsKLQotICAgIFBhZ2UqIHBhZ2Ug
PSBkb2N1bWVudC0+cGFnZSgpOwotICAgIGlmICgocGFnZSAmJiBwYWdlLT5kZWZlcnNMb2FkaW5n
KCkpIHx8ICFkb2N1bWVudC0+bV9wZW5kaW5nVGFza3MuaXNFbXB0eSgpKSB7Ci0gICAgICAgIGRv
Y3VtZW50LT5tX3BlbmRpbmdUYXNrcy5hcHBlbmQoY29udGV4dC0+dGFzay5yZWxlYXNlKCkpOwot
ICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgY29udGV4dC0+dGFzay0+cGVyZm9ybVRhc2so
ZG9jdW1lbnQpOwotfQotCi12b2lkIERvY3VtZW50Ojpwb3N0VGFzayhQYXNzT3duUHRyPFRhc2s+
IHRhc2spCi17Ci0gICAgY2FsbE9uTWFpblRocmVhZChkaWRSZWNlaXZlVGFzaywgbmV3IFBlcmZv
cm1UYXNrQ29udGV4dChtX3dlYWtSZWZlcmVuY2UsIHRhc2spKTsKLX0KLQotdm9pZCBEb2N1bWVu
dDo6cGVuZGluZ1Rhc2tzVGltZXJGaXJlZChUaW1lcjxEb2N1bWVudD4qKQotewotICAgIHdoaWxl
ICghbV9wZW5kaW5nVGFza3MuaXNFbXB0eSgpKSB7Ci0gICAgICAgIE93blB0cjxUYXNrPiB0YXNr
ID0gbV9wZW5kaW5nVGFza3NbMF0ucmVsZWFzZSgpOwotICAgICAgICBtX3BlbmRpbmdUYXNrcy5y
ZW1vdmUoMCk7Ci0gICAgICAgIHRhc2stPnBlcmZvcm1UYXNrKHRoaXMpOwotICAgIH0KLX0KLQot
dm9pZCBEb2N1bWVudDo6c3VzcGVuZFNjaGVkdWxlZFRhc2tzKEFjdGl2ZURPTU9iamVjdDo6UmVh
c29uRm9yU3VzcGVuc2lvbiByZWFzb24pCi17Ci0gICAgQVNTRVJUKCFtX3NjaGVkdWxlZFRhc2tz
QXJlU3VzcGVuZGVkKTsKLQotICAgIHN1c3BlbmRTY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXJD
YWxsYmFja3MoKTsKLSAgICBzdXNwZW5kQWN0aXZlRE9NT2JqZWN0cyhyZWFzb24pOwotICAgIHNj
cmlwdFJ1bm5lcigpLT5zdXNwZW5kKCk7Ci0gICAgbV9wZW5kaW5nVGFza3NUaW1lci5zdG9wKCk7
Ci0gICAgaWYgKG1fcGFyc2VyKQotICAgICAgICBtX3BhcnNlci0+c3VzcGVuZFNjaGVkdWxlZFRh
c2tzKCk7Ci0KLSAgICBtX3NjaGVkdWxlZFRhc2tzQXJlU3VzcGVuZGVkID0gdHJ1ZTsKLX0KLQot
dm9pZCBEb2N1bWVudDo6cmVzdW1lU2NoZWR1bGVkVGFza3MoKQotewotICAgIEFTU0VSVChtX3Nj
aGVkdWxlZFRhc2tzQXJlU3VzcGVuZGVkKTsKLQotICAgIGlmIChtX3BhcnNlcikKLSAgICAgICAg
bV9wYXJzZXItPnJlc3VtZVNjaGVkdWxlZFRhc2tzKCk7Ci0gICAgaWYgKCFtX3BlbmRpbmdUYXNr
cy5pc0VtcHR5KCkpCi0gICAgICAgIG1fcGVuZGluZ1Rhc2tzVGltZXIuc3RhcnRPbmVTaG90KDAp
OwotICAgIHNjcmlwdFJ1bm5lcigpLT5yZXN1bWUoKTsKLSAgICByZXN1bWVBY3RpdmVET01PYmpl
Y3RzKCk7Ci0gICAgcmVzdW1lU2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyQ2FsbGJhY2tzKCk7
Ci0gICAgCi0gICAgbV9zY2hlZHVsZWRUYXNrc0FyZVN1c3BlbmRlZCA9IGZhbHNlOwotfQotCi12
b2lkIERvY3VtZW50OjpzdXNwZW5kU2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyQ2FsbGJhY2tz
KCkKLXsKLSNpZiBFTkFCTEUoUkVRVUVTVF9BTklNQVRJT05fRlJBTUUpCi0gICAgaWYgKG1fc2Ny
aXB0ZWRBbmltYXRpb25Db250cm9sbGVyKQotICAgICAgICBtX3NjcmlwdGVkQW5pbWF0aW9uQ29u
dHJvbGxlci0+c3VzcGVuZCgpOwotI2VuZGlmCi19Ci0KLXZvaWQgRG9jdW1lbnQ6OnJlc3VtZVNj
cmlwdGVkQW5pbWF0aW9uQ29udHJvbGxlckNhbGxiYWNrcygpCi17Ci0jaWYgRU5BQkxFKFJFUVVF
U1RfQU5JTUFUSU9OX0ZSQU1FKQotICAgIGlmIChtX3NjcmlwdGVkQW5pbWF0aW9uQ29udHJvbGxl
cikKLSAgICAgICAgbV9zY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXItPnJlc3VtZSgpOwotI2Vu
ZGlmCi19Ci0KLXZvaWQgRG9jdW1lbnQ6OndpbmRvd1NjcmVlbkRpZENoYW5nZShQbGF0Zm9ybURp
c3BsYXlJRCBkaXNwbGF5SUQpCi17Ci0jaWYgRU5BQkxFKFJFUVVFU1RfQU5JTUFUSU9OX0ZSQU1F
KQotICAgIGlmIChtX3NjcmlwdGVkQW5pbWF0aW9uQ29udHJvbGxlcikKLSAgICAgICAgbV9zY3Jp
cHRlZEFuaW1hdGlvbkNvbnRyb2xsZXItPndpbmRvd1NjcmVlbkRpZENoYW5nZShkaXNwbGF5SUQp
OwotI2Vsc2UKLSAgICBVTlVTRURfUEFSQU0oZGlzcGxheUlEKTsKLSNlbmRpZgotfQotCi0KLVN0
cmluZyBEb2N1bWVudDo6ZGlzcGxheVN0cmluZ01vZGlmaWVkQnlFbmNvZGluZyhjb25zdCBTdHJp
bmcmIHN0cikgY29uc3QKLXsKLSAgICBpZiAobV9kZWNvZGVyKQotICAgICAgICByZXR1cm4gbV9k
ZWNvZGVyLT5lbmNvZGluZygpLmRpc3BsYXlTdHJpbmcoc3RyLmltcGwoKSk7Ci0gICAgcmV0dXJu
IHN0cjsKLX0KLQotUGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBEb2N1bWVudDo6ZGlzcGxheVN0cmlu
Z01vZGlmaWVkQnlFbmNvZGluZyhQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IHN0cikgY29uc3QKLXsK
LSAgICBpZiAobV9kZWNvZGVyKQotICAgICAgICByZXR1cm4gbV9kZWNvZGVyLT5lbmNvZGluZygp
LmRpc3BsYXlTdHJpbmcoc3RyKTsKLSAgICByZXR1cm4gc3RyOwotfQotCi12b2lkIERvY3VtZW50
OjpkaXNwbGF5QnVmZmVyTW9kaWZpZWRCeUVuY29kaW5nKFVDaGFyKiBidWZmZXIsIHVuc2lnbmVk
IGxlbikgY29uc3QKLXsKLSAgICBpZiAobV9kZWNvZGVyKQotICAgICAgICBtX2RlY29kZXItPmVu
Y29kaW5nKCkuZGlzcGxheUJ1ZmZlcihidWZmZXIsIGxlbik7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6
OmVucXVldWVQYWdlc2hvd0V2ZW50KFBhZ2VzaG93RXZlbnRQZXJzaXN0ZW5jZSBwZXJzaXN0ZWQp
Ci17Ci0gICAgLy8gRklYTUU6IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD0zNjMzNCBQYWdlc2hvdyBldmVudCBuZWVkcyB0byBmaXJlIGFzeW5jaHJvbm91c2x5LgotICAg
IGRpc3BhdGNoV2luZG93RXZlbnQoUGFnZVRyYW5zaXRpb25FdmVudDo6Y3JlYXRlKGV2ZW50TmFt
ZXMoKS5wYWdlc2hvd0V2ZW50LCBwZXJzaXN0ZWQpLCB0aGlzKTsKLX0KLQotdm9pZCBEb2N1bWVu
dDo6ZW5xdWV1ZUhhc2hjaGFuZ2VFdmVudChjb25zdCBTdHJpbmcmIG9sZFVSTCwgY29uc3QgU3Ry
aW5nJiBuZXdVUkwpCi17Ci0gICAgZW5xdWV1ZVdpbmRvd0V2ZW50KEhhc2hDaGFuZ2VFdmVudDo6
Y3JlYXRlKG9sZFVSTCwgbmV3VVJMKSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmVucXVldWVQb3Bz
dGF0ZUV2ZW50KFBhc3NSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiBzdGF0ZU9iamVjdCkK
LXsKLSAgICAvLyBGSVhNRTogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTM2MjAyIFBvcHN0YXRlIGV2ZW50IG5lZWRzIHRvIGZpcmUgYXN5bmNocm9ub3VzbHkKLSAgICBk
aXNwYXRjaFdpbmRvd0V2ZW50KFBvcFN0YXRlRXZlbnQ6OmNyZWF0ZShzdGF0ZU9iamVjdCwgZG9t
V2luZG93KCkgPyBkb21XaW5kb3coKS0+aGlzdG9yeSgpIDogMCkpOwotfQotCi12b2lkIERvY3Vt
ZW50OjphZGRNZWRpYUNhblN0YXJ0TGlzdGVuZXIoTWVkaWFDYW5TdGFydExpc3RlbmVyKiBsaXN0
ZW5lcikKLXsKLSAgICBBU1NFUlQoIW1fbWVkaWFDYW5TdGFydExpc3RlbmVycy5jb250YWlucyhs
aXN0ZW5lcikpOwotICAgIG1fbWVkaWFDYW5TdGFydExpc3RlbmVycy5hZGQobGlzdGVuZXIpOwot
fQotCi12b2lkIERvY3VtZW50OjpyZW1vdmVNZWRpYUNhblN0YXJ0TGlzdGVuZXIoTWVkaWFDYW5T
dGFydExpc3RlbmVyKiBsaXN0ZW5lcikKLXsKLSAgICBBU1NFUlQobV9tZWRpYUNhblN0YXJ0TGlz
dGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSk7Ci0gICAgbV9tZWRpYUNhblN0YXJ0TGlzdGVuZXJz
LnJlbW92ZShsaXN0ZW5lcik7Ci19Ci0KLU1lZGlhQ2FuU3RhcnRMaXN0ZW5lciogRG9jdW1lbnQ6
OnRha2VBbnlNZWRpYUNhblN0YXJ0TGlzdGVuZXIoKQotewotICAgIEhhc2hTZXQ8TWVkaWFDYW5T
dGFydExpc3RlbmVyKj46Oml0ZXJhdG9yIHNsb3QgPSBtX21lZGlhQ2FuU3RhcnRMaXN0ZW5lcnMu
YmVnaW4oKTsKLSAgICBpZiAoc2xvdCA9PSBtX21lZGlhQ2FuU3RhcnRMaXN0ZW5lcnMuZW5kKCkp
Ci0gICAgICAgIHJldHVybiAwOwotICAgIE1lZGlhQ2FuU3RhcnRMaXN0ZW5lciogbGlzdGVuZXIg
PSAqc2xvdDsKLSAgICBtX21lZGlhQ2FuU3RhcnRMaXN0ZW5lcnMucmVtb3ZlKHNsb3QpOwotICAg
IHJldHVybiBsaXN0ZW5lcjsKLX0KLQotI2lmIEVOQUJMRShGVUxMU0NSRUVOX0FQSSkKLWJvb2wg
RG9jdW1lbnQ6OmZ1bGxTY3JlZW5Jc0FsbG93ZWRGb3JFbGVtZW50KEVsZW1lbnQqIGVsZW1lbnQp
IGNvbnN0Ci17Ci0gICAgQVNTRVJUKGVsZW1lbnQpOwotICAgIHJldHVybiBpc0F0dHJpYnV0ZU9u
QWxsT3duZXJzKHdlYmtpdGFsbG93ZnVsbHNjcmVlbkF0dHIsIGVsZW1lbnQtPmRvY3VtZW50KCkt
Pm93bmVyRWxlbWVudCgpKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6cmVxdWVzdEZ1bGxTY3JlZW5G
b3JFbGVtZW50KEVsZW1lbnQqIGVsZW1lbnQsIHVuc2lnbmVkIHNob3J0IGZsYWdzLCBGdWxsU2Ny
ZWVuQ2hlY2tUeXBlIGNoZWNrVHlwZSkKLXsKLSAgICAvLyBUaGUgTW96aWxsYSBGdWxsIFNjcmVl
biBBUEkgPGh0dHBzOi8vd2lraS5tb3ppbGxhLm9yZy9HZWNrbzpGdWxsU2NyZWVuQVBJPiBoYXMg
ZGlmZmVyZW50IHJlcXVpcmVtZW50cwotICAgIC8vIGZvciBmdWxsIHNjcmVlbiBtb2RlLCBhbmQg
ZG8gbm90IGhhdmUgdGhlIGNvbmNlcHQgb2YgYSBmdWxsIHNjcmVlbiBlbGVtZW50IHN0YWNrLgot
ICAgIGJvb2wgaW5MZWdhY3lNb3ppbGxhTW9kZSA9IChmbGFncyAmIEVsZW1lbnQ6OkxFR0FDWV9N
T1pJTExBX1JFUVVFU1QpOwotCi0gICAgZG8gewotICAgICAgICBpZiAoIWVsZW1lbnQpCi0gICAg
ICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnRFbGVtZW50KCk7Ci0gCi0gICAgICAgIC8vIDEuIElm
IGFueSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIHRydWUsIHRlcm1pbmF0ZSB0aGVz
ZSBzdGVwcyBhbmQgcXVldWUgYSB0YXNrIHRvIGZpcmUKLSAgICAgICAgLy8gYW4gZXZlbnQgbmFt
ZWQgZnVsbHNjcmVlbmVycm9yIHdpdGggaXRzIGJ1YmJsZXMgYXR0cmlidXRlIHNldCB0byB0cnVl
IG9uIHRoZSBjb250ZXh0IG9iamVjdCdzIAotICAgICAgICAvLyBub2RlIGRvY3VtZW50OgotCi0g
ICAgICAgIC8vIFRoZSBjb250ZXh0IG9iamVjdCBpcyBub3QgaW4gYSBkb2N1bWVudC4KLSAgICAg
ICAgaWYgKCFlbGVtZW50LT5pbkRvY3VtZW50KCkpCi0gICAgICAgICAgICBicmVhazsKLQotICAg
ICAgICAvLyBUaGUgY29udGV4dCBvYmplY3QncyBub2RlIGRvY3VtZW50LCBvciBhbiBhbmNlc3Rv
ciBicm93c2luZyBjb250ZXh0J3MgZG9jdW1lbnQgZG9lcyBub3QgaGF2ZQotICAgICAgICAvLyB0
aGUgZnVsbHNjcmVlbiBlbmFibGVkIGZsYWcgc2V0LgotICAgICAgICBpZiAoY2hlY2tUeXBlID09
IEVuZm9yY2VJRnJhbWVBbGxvd0Z1bGxTY3JlZW5SZXF1aXJlbWVudCAmJiAhZnVsbFNjcmVlbklz
QWxsb3dlZEZvckVsZW1lbnQoZWxlbWVudCkpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAg
ICAvLyBUaGUgY29udGV4dCBvYmplY3QncyBub2RlIGRvY3VtZW50IGZ1bGxzY3JlZW4gZWxlbWVu
dCBzdGFjayBpcyBub3QgZW1wdHkgYW5kIGl0cyB0b3AgZWxlbWVudAotICAgICAgICAvLyBpcyBu
b3QgYW4gYW5jZXN0b3Igb2YgdGhlIGNvbnRleHQgb2JqZWN0LiAoTk9URTogSWdub3JlIHRoaXMg
cmVxdWlyZW1lbnQgaWYgdGhlIHJlcXVlc3Qgd2FzCi0gICAgICAgIC8vIG1hZGUgdmlhIHRoZSBs
ZWdhY3kgTW96aWxsYS1zdHlsZSBBUEkuKQotICAgICAgICBpZiAoIW1fZnVsbFNjcmVlbkVsZW1l
bnRTdGFjay5pc0VtcHR5KCkgJiYgIW1fZnVsbFNjcmVlbkVsZW1lbnRTdGFjay5maXJzdCgpLT5j
b250YWlucyhlbGVtZW50KSAmJiAhaW5MZWdhY3lNb3ppbGxhTW9kZSkKLSAgICAgICAgICAgIGJy
ZWFrOwotCi0gICAgICAgIC8vIEEgZGVzY2VuZGFudCBicm93c2luZyBjb250ZXh0J3MgZG9jdW1l
bnQgaGFzIGEgbm9uLWVtcHR5IGZ1bGxzY3JlZW4gZWxlbWVudCBzdGFjay4KLSAgICAgICAgYm9v
bCBkZXNjZW5kZW50SGFzTm9uRW1wdHlTdGFjayA9IGZhbHNlOwotICAgICAgICBmb3IgKEZyYW1l
KiBkZXNjZW5kYW50ID0gZnJhbWUoKSA/IGZyYW1lKCktPnRyZWUoKS0+dHJhdmVyc2VOZXh0KCkg
OiAwOyBkZXNjZW5kYW50OyBkZXNjZW5kYW50ID0gZGVzY2VuZGFudC0+dHJlZSgpLT50cmF2ZXJz
ZU5leHQoKSkgewotICAgICAgICAgICAgaWYgKGRlc2NlbmRhbnQtPmRvY3VtZW50KCktPndlYmtp
dEZ1bGxzY3JlZW5FbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICBkZXNjZW5kZW50SGFzTm9u
RW1wdHlTdGFjayA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRlc2NlbmRlbnRIYXNOb25FbXB0eVN0YWNrICYmICFp
bkxlZ2FjeU1vemlsbGFNb2RlKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLy8gVGhp
cyBhbGdvcml0aG0gaXMgbm90IGFsbG93ZWQgdG8gc2hvdyBhIHBvcC11cDoKLSAgICAgICAgLy8g
ICBBbiBhbGdvcml0aG0gaXMgYWxsb3dlZCB0byBzaG93IGEgcG9wLXVwIGlmLCBpbiB0aGUgdGFz
ayBpbiB3aGljaCB0aGUgYWxnb3JpdGhtIGlzIHJ1bm5pbmcsIGVpdGhlcjoKLSAgICAgICAgLy8g
ICAtIGFuIGFjdGl2YXRpb24gYmVoYXZpb3IgaXMgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZCB3
aG9zZSBjbGljayBldmVudCB3YXMgdHJ1c3RlZCwgb3IKLSAgICAgICAgLy8gICAtIHRoZSBldmVu
dCBsaXN0ZW5lciBmb3IgYSB0cnVzdGVkIGNsaWNrIGV2ZW50IGlzIGJlaW5nIGhhbmRsZWQuCi0g
ICAgICAgIGlmICghU2NyaXB0Q29udHJvbGxlcjo6cHJvY2Vzc2luZ1VzZXJHZXN0dXJlKCkpCi0g
ICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvLyBUaGVyZSBpcyBhIHByZXZpb3VzbHktZXN0
YWJsaXNoZWQgdXNlciBwcmVmZXJlbmNlLCBzZWN1cml0eSByaXNrLCBvciBwbGF0Zm9ybSBsaW1p
dGF0aW9uLgotICAgICAgICBpZiAoIXBhZ2UoKSB8fCAhcGFnZSgpLT5zZXR0aW5ncygpLT5mdWxs
U2NyZWVuRW5hYmxlZCgpKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIAotICAgICAgICBp
ZiAoIXBhZ2UoKS0+Y2hyb21lKCktPmNsaWVudCgpLT5zdXBwb3J0c0Z1bGxTY3JlZW5Gb3JFbGVt
ZW50KGVsZW1lbnQsIGZsYWdzICYgRWxlbWVudDo6QUxMT1dfS0VZQk9BUkRfSU5QVVQpKQotICAg
ICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLy8gMi4gTGV0IGRvYyBiZSBlbGVtZW50J3Mgbm9k
ZSBkb2N1bWVudC4gKGkuZS4gInRoaXMiKQotICAgICAgICBEb2N1bWVudCogY3VycmVudERvYyA9
IHRoaXM7Ci0KLSAgICAgICAgLy8gMy4gTGV0IGRvY3MgYmUgYWxsIGRvYydzIGFuY2VzdG9yIGJy
b3dzaW5nIGNvbnRleHQncyBkb2N1bWVudHMgKGlmIGFueSkgYW5kIGRvYy4KLSAgICAgICAgRGVx
dWU8RG9jdW1lbnQqPiBkb2NzOwotCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGRvY3MucHJl
cGVuZChjdXJyZW50RG9jKTsKLSAgICAgICAgICAgIGN1cnJlbnREb2MgPSBjdXJyZW50RG9jLT5v
d25lckVsZW1lbnQoKSA/IGN1cnJlbnREb2MtPm93bmVyRWxlbWVudCgpLT5kb2N1bWVudCgpIDog
MDsKLSAgICAgICAgfSB3aGlsZSAoY3VycmVudERvYyk7Ci0KLSAgICAgICAgLy8gNC4gRm9yIGVh
Y2ggZG9jdW1lbnQgaW4gZG9jcywgcnVuIHRoZXNlIHN1YnN0ZXBzOgotICAgICAgICBEZXF1ZTxE
b2N1bWVudCo+OjppdGVyYXRvciBjdXJyZW50ID0gZG9jcy5iZWdpbigpLCBmb2xsb3dpbmcgPSBk
b2NzLmJlZ2luKCk7Ci0KLSAgICAgICAgZG8gewotICAgICAgICAgICAgKytmb2xsb3dpbmc7Ci0K
LSAgICAgICAgICAgIC8vIDEuIExldCBmb2xsb3dpbmcgZG9jdW1lbnQgYmUgdGhlIGRvY3VtZW50
IGFmdGVyIGRvY3VtZW50IGluIGRvY3MsIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8KLSAgICAgICAg
ICAgIC8vIHN1Y2ggZG9jdW1lbnQuCi0gICAgICAgICAgICBEb2N1bWVudCogY3VycmVudERvYyA9
ICpjdXJyZW50OwotICAgICAgICAgICAgRG9jdW1lbnQqIGZvbGxvd2luZ0RvYyA9IGZvbGxvd2lu
ZyAhPSBkb2NzLmVuZCgpID8gKmZvbGxvd2luZyA6IDA7Ci0KLSAgICAgICAgICAgIC8vIDIuIElm
IGZvbGxvd2luZyBkb2N1bWVudCBpcyBudWxsLCBwdXNoIGNvbnRleHQgb2JqZWN0IG9uIGRvY3Vt
ZW50J3MgZnVsbHNjcmVlbiBlbGVtZW50Ci0gICAgICAgICAgICAvLyBzdGFjaywgYW5kIHF1ZXVl
IGEgdGFzayB0byBmaXJlIGFuIGV2ZW50IG5hbWVkIGZ1bGxzY3JlZW5jaGFuZ2Ugd2l0aCBpdHMg
YnViYmxlcyBhdHRyaWJ1dGUKLSAgICAgICAgICAgIC8vIHNldCB0byB0cnVlIG9uIHRoZSBkb2N1
bWVudC4KLSAgICAgICAgICAgIGlmICghZm9sbG93aW5nRG9jKSB7Ci0gICAgICAgICAgICAgICAg
Y3VycmVudERvYy0+cHVzaEZ1bGxzY3JlZW5FbGVtZW50U3RhY2soZWxlbWVudCk7Ci0gICAgICAg
ICAgICAgICAgYWRkRG9jdW1lbnRUb0Z1bGxTY3JlZW5DaGFuZ2VFdmVudFF1ZXVlKGN1cnJlbnRE
b2MpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAg
ICAgICAvLyAzLiBPdGhlcndpc2UsIGlmIGRvY3VtZW50J3MgZnVsbHNjcmVlbiBlbGVtZW50IHN0
YWNrIGlzIGVpdGhlciBlbXB0eSBvciBpdHMgdG9wIGVsZW1lbnQKLSAgICAgICAgICAgIC8vIGlz
IG5vdCBmb2xsb3dpbmcgZG9jdW1lbnQncyBicm93c2luZyBjb250ZXh0IGNvbnRhaW5lciwKLSAg
ICAgICAgICAgIEVsZW1lbnQqIHRvcEVsZW1lbnQgPSBjdXJyZW50RG9jLT53ZWJraXRGdWxsc2Ny
ZWVuRWxlbWVudCgpOwotICAgICAgICAgICAgaWYgKCF0b3BFbGVtZW50IHx8IHRvcEVsZW1lbnQg
IT0gZm9sbG93aW5nRG9jLT5vd25lckVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgIC8vIC4u
LnB1c2ggZm9sbG93aW5nIGRvY3VtZW50J3MgYnJvd3NpbmcgY29udGV4dCBjb250YWluZXIgb24g
ZG9jdW1lbnQncyBmdWxsc2NyZWVuIGVsZW1lbnQKLSAgICAgICAgICAgICAgICAvLyBzdGFjaywg
YW5kIHF1ZXVlIGEgdGFzayB0byBmaXJlIGFuIGV2ZW50IG5hbWVkIGZ1bGxzY3JlZW5jaGFuZ2Ug
d2l0aCBpdHMgYnViYmxlcyBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAvLyBzZXQgdG8gdHJ1
ZSBvbiBkb2N1bWVudC4KLSAgICAgICAgICAgICAgICBjdXJyZW50RG9jLT5wdXNoRnVsbHNjcmVl
bkVsZW1lbnRTdGFjayhmb2xsb3dpbmdEb2MtPm93bmVyRWxlbWVudCgpKTsKLSAgICAgICAgICAg
ICAgICBhZGREb2N1bWVudFRvRnVsbFNjcmVlbkNoYW5nZUV2ZW50UXVldWUoY3VycmVudERvYyk7
Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAg
IC8vIDQuIE90aGVyd2lzZSwgZG8gbm90aGluZyBmb3IgdGhpcyBkb2N1bWVudC4gSXQgc3RheXMg
dGhlIHNhbWUuCi0gICAgICAgIH0gd2hpbGUgKCsrY3VycmVudCAhPSBkb2NzLmVuZCgpKTsKLQot
ICAgICAgICAvLyA1LiBSZXR1cm4sIGFuZCBydW4gdGhlIHJlbWFpbmluZyBzdGVwcyBhc3luY2hy
b25vdXNseS4KLSAgICAgICAgLy8gNi4gT3B0aW9uYWxseSwgcGVyZm9ybSBzb21lIGFuaW1hdGlv
bi4KLSAgICAgICAgbV9hcmVLZXlzRW5hYmxlZEluRnVsbFNjcmVlbiA9IGZsYWdzICYgRWxlbWVu
dDo6QUxMT1dfS0VZQk9BUkRfSU5QVVQ7Ci0gICAgICAgIHBhZ2UoKS0+Y2hyb21lKCktPmNsaWVu
dCgpLT5lbnRlckZ1bGxTY3JlZW5Gb3JFbGVtZW50KGVsZW1lbnQpOwotCi0gICAgICAgIC8vIDcu
IE9wdGlvbmFsbHksIGRpc3BsYXkgYSBtZXNzYWdlIGluZGljYXRpbmcgaG93IHRoZSB1c2VyIGNh
biBleGl0IGRpc3BsYXlpbmcgdGhlIGNvbnRleHQgb2JqZWN0IGZ1bGxzY3JlZW4uCi0gICAgICAg
IHJldHVybjsKLSAgICB9IHdoaWxlICgwKTsKLQotICAgIG1fZnVsbFNjcmVlbkVycm9yRXZlbnRU
YXJnZXRRdWV1ZS5hcHBlbmQoZWxlbWVudCA/IGVsZW1lbnQgOiBkb2N1bWVudEVsZW1lbnQoKSk7
Ci0gICAgbV9mdWxsU2NyZWVuQ2hhbmdlRGVsYXlUaW1lci5zdGFydE9uZVNob3QoMCk7Ci19Ci0K
LXZvaWQgRG9jdW1lbnQ6OndlYmtpdENhbmNlbEZ1bGxTY3JlZW4oKQotewotICAgIC8vIFRoZSBN
b3ppbGxhICJjYW5jZWxGdWxsU2NyZWVuKCkiIEFQSSBiZWhhdmVzIGxpa2UgdGhlIFczQyAiZnVs
bHkgZXhpdCBmdWxsc2NyZWVuIiBiZWhhdmlvciwgd2hpY2gKLSAgICAvLyBpcyBkZWZpbmVkIGFz
OiAKLSAgICAvLyAiVG8gZnVsbHkgZXhpdCBmdWxsc2NyZWVuIGFjdCBhcyBpZiB0aGUgZXhpdEZ1
bGxzY3JlZW4oKSBtZXRob2Qgd2FzIGludm9rZWQgb24gdGhlIHRvcC1sZXZlbCBicm93c2luZwot
ICAgIC8vIGNvbnRleHQncyBkb2N1bWVudCBhbmQgc3Vic2VxdWVudGx5IGVtcHR5IHRoYXQgZG9j
dW1lbnQncyBmdWxsc2NyZWVuIGVsZW1lbnQgc3RhY2suIgotICAgIGlmICghdG9wRG9jdW1lbnQo
KS0+d2Via2l0RnVsbHNjcmVlbkVsZW1lbnQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8g
VG8gYWNoaWV2ZSB0aGF0IGFpbSwgcmVtb3ZlIGFsbCB0aGUgZWxlbWVudHMgZnJvbSB0aGUgdG9w
IGRvY3VtZW50J3Mgc3RhY2sgZXhjZXB0IGZvciB0aGUgZmlyc3QgYmVmb3JlCi0gICAgLy8gY2Fs
bGluZyB3ZWJraXRFeGl0RnVsbHNjcmVlbigpOgotICAgIERlcXVlPFJlZlB0cjxFbGVtZW50PiA+
IHJlcGxhY2VtZW50RnVsbHNjcmVlbkVsZW1lbnRTdGFjazsKLSAgICByZXBsYWNlbWVudEZ1bGxz
Y3JlZW5FbGVtZW50U3RhY2sucHJlcGVuZCh0b3BEb2N1bWVudCgpLT53ZWJraXRGdWxsc2NyZWVu
RWxlbWVudCgpKTsKLSAgICB0b3BEb2N1bWVudCgpLT5tX2Z1bGxTY3JlZW5FbGVtZW50U3RhY2su
c3dhcChyZXBsYWNlbWVudEZ1bGxzY3JlZW5FbGVtZW50U3RhY2spOwotCi0gICAgdG9wRG9jdW1l
bnQoKS0+d2Via2l0RXhpdEZ1bGxzY3JlZW4oKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6d2Via2l0
RXhpdEZ1bGxzY3JlZW4oKQotewotICAgIC8vIFRoZSBleGl0RnVsbHNjcmVlbigpIG1ldGhvZCBt
dXN0IHJ1biB0aGVzZSBzdGVwczoKLSAgICAKLSAgICAvLyAxLiBMZXQgZG9jIGJlIHRoZSBjb250
ZXh0IG9iamVjdC4gKGkuZS4gInRoaXMiKQotICAgIERvY3VtZW50KiBjdXJyZW50RG9jID0gdGhp
czsKLQotICAgIC8vIDIuIElmIGRvYydzIGZ1bGxzY3JlZW4gZWxlbWVudCBzdGFjayBpcyBlbXB0
eSwgdGVybWluYXRlIHRoZXNlIHN0ZXBzLgotICAgIGlmIChtX2Z1bGxTY3JlZW5FbGVtZW50U3Rh
Y2suaXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgLy8gMy4gTGV0IGRlc2Nl
bmRhbnRzIGJlIGFsbCB0aGUgZG9jJ3MgZGVzY2VuZGFudCBicm93c2luZyBjb250ZXh0J3MgZG9j
dW1lbnRzIHdpdGggYSBub24tZW1wdHkgZnVsbHNjcmVlbgotICAgIC8vIGVsZW1lbnQgc3RhY2sg
KGlmIGFueSksIG9yZGVyZWQgc28gdGhhdCB0aGUgY2hpbGQgb2YgdGhlIGRvYyBpcyBsYXN0IGFu
ZCB0aGUgZG9jdW1lbnQgZnVydGhlc3QKLSAgICAvLyBhd2F5IGZyb20gdGhlIGRvYyBpcyBmaXJz
dC4KLSAgICBEZXF1ZTxSZWZQdHI8RG9jdW1lbnQ+ID4gZGVzY2VuZGFudHM7Ci0gICAgZm9yIChG
cmFtZSogZGVzY2VuZGFudCA9IGZyYW1lKCkgPyBmcmFtZSgpLT50cmVlKCktPnRyYXZlcnNlTmV4
dCgpIDogMDsgZGVzY2VuZGFudDsgZGVzY2VuZGFudCA9IGRlc2NlbmRhbnQtPnRyZWUoKS0+dHJh
dmVyc2VOZXh0KCkpIHsKLSAgICAgICAgaWYgKGRlc2NlbmRhbnQtPmRvY3VtZW50KCktPndlYmtp
dEZ1bGxzY3JlZW5FbGVtZW50KCkpCi0gICAgICAgICAgICBkZXNjZW5kYW50cy5wcmVwZW5kKGRl
c2NlbmRhbnQtPmRvY3VtZW50KCkpOwotICAgIH0KLSAgICAgICAgCi0gICAgLy8gNC4gRm9yIGVh
Y2ggZGVzY2VuZGFudCBpbiBkZXNjZW5kYW50cywgZW1wdHkgZGVzY2VuZGFudCdzIGZ1bGxzY3Jl
ZW4gZWxlbWVudCBzdGFjaywgYW5kIHF1ZXVlIGEKLSAgICAvLyB0YXNrIHRvIGZpcmUgYW4gZXZl
bnQgbmFtZWQgZnVsbHNjcmVlbmNoYW5nZSB3aXRoIGl0cyBidWJibGVzIGF0dHJpYnV0ZSBzZXQg
dG8gdHJ1ZSBvbiBkZXNjZW5kYW50LgotICAgIGZvciAoRGVxdWU8UmVmUHRyPERvY3VtZW50PiA+
OjppdGVyYXRvciBpID0gZGVzY2VuZGFudHMuYmVnaW4oKTsgaSAhPSBkZXNjZW5kYW50cy5lbmQo
KTsgKytpKSB7Ci0gICAgICAgICgqaSktPmNsZWFyRnVsbHNjcmVlbkVsZW1lbnRTdGFjaygpOwot
ICAgICAgICBhZGREb2N1bWVudFRvRnVsbFNjcmVlbkNoYW5nZUV2ZW50UXVldWUoaS0+Z2V0KCkp
OwotICAgIH0KLQotICAgIC8vIDUuIFdoaWxlIGRvYyBpcyBub3QgbnVsbCwgcnVuIHRoZXNlIHN1
YnN0ZXBzOgotICAgIEVsZW1lbnQqIG5ld1RvcCA9IDA7Ci0gICAgd2hpbGUgKGN1cnJlbnREb2Mp
IHsKLSAgICAgICAgLy8gMS4gUG9wIHRoZSB0b3AgZWxlbWVudCBvZiBkb2MncyBmdWxsc2NyZWVu
IGVsZW1lbnQgc3RhY2suCi0gICAgICAgIGN1cnJlbnREb2MtPnBvcEZ1bGxzY3JlZW5FbGVtZW50
U3RhY2soKTsKLQotICAgICAgICAvLyAgICBJZiBkb2MncyBmdWxsc2NyZWVuIGVsZW1lbnQgc3Rh
Y2sgaXMgbm9uLWVtcHR5IGFuZCB0aGUgZWxlbWVudCBub3cgYXQgdGhlIHRvcCBpcyBlaXRoZXIK
LSAgICAgICAgLy8gICAgbm90IGluIGEgZG9jdW1lbnQgb3IgaXRzIG5vZGUgZG9jdW1lbnQgaXMg
bm90IGRvYywgcmVwZWF0IHRoaXMgc3Vic3RlcC4KLSAgICAgICAgbmV3VG9wID0gY3VycmVudERv
Yy0+d2Via2l0RnVsbHNjcmVlbkVsZW1lbnQoKTsKLSAgICAgICAgaWYgKG5ld1RvcCAmJiAoIW5l
d1RvcC0+aW5Eb2N1bWVudCgpIHx8IG5ld1RvcC0+ZG9jdW1lbnQoKSAhPSBjdXJyZW50RG9jKSkK
LSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIC8vIDIuIFF1ZXVlIGEgdGFzayB0byBm
aXJlIGFuIGV2ZW50IG5hbWVkIGZ1bGxzY3JlZW5jaGFuZ2Ugd2l0aCBpdHMgYnViYmxlcyBhdHRy
aWJ1dGUgc2V0IHRvIHRydWUKLSAgICAgICAgLy8gb24gZG9jLgotICAgICAgICBhZGREb2N1bWVu
dFRvRnVsbFNjcmVlbkNoYW5nZUV2ZW50UXVldWUoY3VycmVudERvYyk7Ci0KLSAgICAgICAgLy8g
My4gSWYgZG9jJ3MgZnVsbHNjcmVlbiBlbGVtZW50IHN0YWNrIGlzIGVtcHR5IGFuZCBkb2MncyBi
cm93c2luZyBjb250ZXh0IGhhcyBhIGJyb3dzaW5nIGNvbnRleHQKLSAgICAgICAgLy8gY29udGFp
bmVyLCBzZXQgZG9jIHRvIHRoYXQgYnJvd3NpbmcgY29udGV4dCBjb250YWluZXIncyBub2RlIGRv
Y3VtZW50LgotICAgICAgICBpZiAoIW5ld1RvcCAmJiBjdXJyZW50RG9jLT5vd25lckVsZW1lbnQo
KSkgewotICAgICAgICAgICAgY3VycmVudERvYyA9IGN1cnJlbnREb2MtPm93bmVyRWxlbWVudCgp
LT5kb2N1bWVudCgpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAg
ICAvLyA0LiBPdGhlcndpc2UsIHNldCBkb2MgdG8gbnVsbC4KLSAgICAgICAgY3VycmVudERvYyA9
IDA7Ci0gICAgfQotCi0gICAgLy8gNi4gUmV0dXJuLCBhbmQgcnVuIHRoZSByZW1haW5pbmcgc3Rl
cHMgYXN5bmNocm9ub3VzbHkuCi0gICAgLy8gNy4gT3B0aW9uYWxseSwgcGVyZm9ybSBzb21lIGFu
aW1hdGlvbi4KLQotICAgIC8vIE9ubHkgZXhpdCBvdXQgb2YgZnVsbCBzY3JlZW4gd2luZG93IG1v
ZGUgaWYgdGhlcmUgYXJlIG5vIHJlbWFpbmluZyBlbGVtZW50cyBpbiB0aGUgCi0gICAgLy8gZnVs
bCBzY3JlZW4gc3RhY2suCi0gICAgaWYgKCFuZXdUb3ApIHsKLSAgICAgICAgcGFnZSgpLT5jaHJv
bWUoKS0+Y2xpZW50KCktPmV4aXRGdWxsU2NyZWVuRm9yRWxlbWVudChtX2Z1bGxTY3JlZW5FbGVt
ZW50LmdldCgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIE90aGVyd2lzZSwg
bm90aWZ5IHRoZSBjaHJvbWUgb2YgdGhlIG5ldyBmdWxsIHNjcmVlbiBlbGVtZW50LgotICAgIHBh
Z2UoKS0+Y2hyb21lKCktPmNsaWVudCgpLT5lbnRlckZ1bGxTY3JlZW5Gb3JFbGVtZW50KG5ld1Rv
cCk7ICAgICAgCi19Ci0KLWJvb2wgRG9jdW1lbnQ6OndlYmtpdEZ1bGxzY3JlZW5FbmFibGVkKCkg
Y29uc3QKLXsKLSAgICAvLyA0LiBUaGUgZnVsbHNjcmVlbkVuYWJsZWQgYXR0cmlidXRlIG11c3Qg
cmV0dXJuIHRydWUgaWYgdGhlIGNvbnRleHQgb2JqZWN0IGFuZCBhbGwgYW5jZXN0b3IKLSAgICAv
LyBicm93c2luZyBjb250ZXh0J3MgZG9jdW1lbnRzIGhhdmUgdGhlaXIgZnVsbHNjcmVlbiBlbmFi
bGVkIGZsYWcgc2V0LCBvciBmYWxzZSBvdGhlcndpc2UuCi0KLSAgICAvLyBUb3AtbGV2ZWwgYnJv
d3NpbmcgY29udGV4dHMgYXJlIGltcGxpZWQgdG8gaGF2ZSB0aGVpciBhbGxvd0Z1bGxTY3JlZW4g
YXR0cmlidXRlIHNldC4KLSAgICByZXR1cm4gaXNBdHRyaWJ1dGVPbkFsbE93bmVycyh3ZWJraXRh
bGxvd2Z1bGxzY3JlZW5BdHRyLCBvd25lckVsZW1lbnQoKSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6
OndlYmtpdFdpbGxFbnRlckZ1bGxTY3JlZW5Gb3JFbGVtZW50KEVsZW1lbnQqIGVsZW1lbnQpCi17
Ci0gICAgaWYgKCFhdHRhY2hlZCgpIHx8IGluUGFnZUNhY2hlKCkpCi0gICAgICAgIHJldHVybjsK
LQotICAgIEFTU0VSVChlbGVtZW50KTsKLQotICAgIC8vIFByb3RlY3QgYWdhaW5zdCBiZWluZyBj
YWxsZWQgYWZ0ZXIgdGhlIGRvY3VtZW50IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcGFnZS4K
LSAgICBpZiAoIXBhZ2UoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgQVNTRVJUKHBhZ2UoKS0+
c2V0dGluZ3MoKS0+ZnVsbFNjcmVlbkVuYWJsZWQoKSk7Ci0KLSAgICBpZiAobV9mdWxsU2NyZWVu
UmVuZGVyZXIpCi0gICAgICAgIG1fZnVsbFNjcmVlblJlbmRlcmVyLT51bndyYXBSZW5kZXJlcigp
OwotCi0gICAgbV9mdWxsU2NyZWVuRWxlbWVudCA9IGVsZW1lbnQ7Ci0KLSNpZiBVU0UoTkFUSVZF
X0ZVTExTQ1JFRU5fVklERU8pCi0gICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC0+aXNNZWRpYUVs
ZW1lbnQoKSkKLSAgICAgICAgcmV0dXJuOwotI2VuZGlmCi0KLSAgICAvLyBDcmVhdGUgYSBwbGFj
ZWhvbGRlciBibG9jayBmb3IgYSB0aGUgZnVsbC1zY3JlZW4gZWxlbWVudCwgdG8ga2VlcCB0aGUg
cGFnZSBmcm9tIHJlZmxvd2luZwotICAgIC8vIHdoZW4gdGhlIGVsZW1lbnQgaXMgcmVtb3ZlZCBm
cm9tIHRoZSBub3JtYWwgZmxvdy4gIE9ubHkgZG8gdGhpcyBmb3IgYSBSZW5kZXJCb3gsIGFzIG9u
bHkgCi0gICAgLy8gYSBib3ggd2lsbCBoYXZlIGEgZnJhbWVSZWN0LiAgVGhlIHBsYWNlaG9sZGVy
IHdpbGwgYmUgY3JlYXRlZCBpbiBzZXRGdWxsU2NyZWVuUmVuZGVyZXIoKQotICAgIC8vIGR1cmlu
ZyBsYXlvdXQuCi0gICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IG1fZnVsbFNjcmVlbkVsZW1l
bnQtPnJlbmRlcmVyKCk7Ci0gICAgYm9vbCBzaG91bGRDcmVhdGVQbGFjZWhvbGRlciA9IHJlbmRl
cmVyICYmIHJlbmRlcmVyLT5pc0JveCgpOwotICAgIGlmIChzaG91bGRDcmVhdGVQbGFjZWhvbGRl
cikgewotICAgICAgICBtX3NhdmVkUGxhY2Vob2xkZXJGcmFtZVJlY3QgPSB0b1JlbmRlckJveChy
ZW5kZXJlciktPmZyYW1lUmVjdCgpOwotICAgICAgICBtX3NhdmVkUGxhY2Vob2xkZXJSZW5kZXJT
dHlsZSA9IFJlbmRlclN0eWxlOjpjbG9uZShyZW5kZXJlci0+c3R5bGUoKSk7Ci0gICAgfQotCi0g
ICAgaWYgKG1fZnVsbFNjcmVlbkVsZW1lbnQgIT0gZG9jdW1lbnRFbGVtZW50KCkpCi0gICAgICAg
IFJlbmRlckZ1bGxTY3JlZW46OndyYXBSZW5kZXJlcihyZW5kZXJlciwgcmVuZGVyZXIgPyByZW5k
ZXJlci0+cGFyZW50KCkgOiAwLCB0aGlzKTsKLQotICAgIG1fZnVsbFNjcmVlbkVsZW1lbnQtPnNl
dENvbnRhaW5zRnVsbFNjcmVlbkVsZW1lbnRPbkFuY2VzdG9yc0Nyb3NzaW5nRnJhbWVCb3VuZGFy
aWVzKHRydWUpOwotICAgIAotICAgIHJlY2FsY1N0eWxlKEZvcmNlKTsKLX0KLQotdm9pZCBEb2N1
bWVudDo6d2Via2l0RGlkRW50ZXJGdWxsU2NyZWVuRm9yRWxlbWVudChFbGVtZW50KikKLXsKLSAg
ICBpZiAoIW1fZnVsbFNjcmVlbkVsZW1lbnQpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmICgh
YXR0YWNoZWQoKSB8fCBpblBhZ2VDYWNoZSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX2Z1
bGxTY3JlZW5FbGVtZW50LT5kaWRCZWNvbWVGdWxsc2NyZWVuRWxlbWVudCgpOwotCi0gICAgbV9m
dWxsU2NyZWVuQ2hhbmdlRGVsYXlUaW1lci5zdGFydE9uZVNob3QoMCk7Ci19Ci0KLXZvaWQgRG9j
dW1lbnQ6OndlYmtpdFdpbGxFeGl0RnVsbFNjcmVlbkZvckVsZW1lbnQoRWxlbWVudCopCi17Ci0g
ICAgaWYgKCFtX2Z1bGxTY3JlZW5FbGVtZW50KQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAo
IWF0dGFjaGVkKCkgfHwgaW5QYWdlQ2FjaGUoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9m
dWxsU2NyZWVuRWxlbWVudC0+d2lsbFN0b3BCZWluZ0Z1bGxzY3JlZW5FbGVtZW50KCk7Ci19Ci0K
LXZvaWQgRG9jdW1lbnQ6OndlYmtpdERpZEV4aXRGdWxsU2NyZWVuRm9yRWxlbWVudChFbGVtZW50
KikKLXsKLSAgICBpZiAoIW1fZnVsbFNjcmVlbkVsZW1lbnQpCi0gICAgICAgIHJldHVybjsKLQot
ICAgIGlmICghYXR0YWNoZWQoKSB8fCBpblBhZ2VDYWNoZSgpKQotICAgICAgICByZXR1cm47Ci0K
LSAgICBtX2Z1bGxTY3JlZW5FbGVtZW50LT5zZXRDb250YWluc0Z1bGxTY3JlZW5FbGVtZW50T25B
bmNlc3RvcnNDcm9zc2luZ0ZyYW1lQm91bmRhcmllcyhmYWxzZSk7Ci0KLSAgICBtX2FyZUtleXNF
bmFibGVkSW5GdWxsU2NyZWVuID0gZmFsc2U7Ci0gICAgCi0gICAgaWYgKG1fZnVsbFNjcmVlblJl
bmRlcmVyKQotICAgICAgICBtX2Z1bGxTY3JlZW5SZW5kZXJlci0+dW53cmFwUmVuZGVyZXIoKTsK
LQotICAgIG1fZnVsbFNjcmVlbkVsZW1lbnQgPSAwOwotICAgIHNjaGVkdWxlRm9yY2VkU3R5bGVS
ZWNhbGMoKTsKLSAgICAKLSAgICAvLyBXaGVuIHdlYmtpdENhbmNlbEZ1bGxTY3JlZW4gaXMgY2Fs
bGVkLCB3ZSBjYWxsIHdlYmtpdEV4aXRGdWxsU2NyZWVuIG9uIHRoZSB0b3BEb2N1bWVudCgpLiBU
aGF0Ci0gICAgLy8gbWVhbnMgdGhhdCB0aGUgZXZlbnRzIHdpbGwgYmUgcXVldWVkIHRoZXJlLiBT
byBpZiB3ZSBoYXZlIG5vIGV2ZW50cyBoZXJlLCBzdGFydCB0aGUgdGltZXIgb24KLSAgICAvLyB0
aGUgZXhpdGluZyBkb2N1bWVudC4KLSAgICBEb2N1bWVudCogZXhpdGluZ0RvY3VtZW50ID0gdGhp
czsKLSAgICBpZiAobV9mdWxsU2NyZWVuQ2hhbmdlRXZlbnRUYXJnZXRRdWV1ZS5pc0VtcHR5KCkg
JiYgbV9mdWxsU2NyZWVuRXJyb3JFdmVudFRhcmdldFF1ZXVlLmlzRW1wdHkoKSkKLSAgICAgICAg
ZXhpdGluZ0RvY3VtZW50ID0gdG9wRG9jdW1lbnQoKTsKLSAgICBleGl0aW5nRG9jdW1lbnQtPm1f
ZnVsbFNjcmVlbkNoYW5nZURlbGF5VGltZXIuc3RhcnRPbmVTaG90KDApOwotfQotICAgIAotdm9p
ZCBEb2N1bWVudDo6c2V0RnVsbFNjcmVlblJlbmRlcmVyKFJlbmRlckZ1bGxTY3JlZW4qIHJlbmRl
cmVyKQotewotICAgIGlmIChyZW5kZXJlciA9PSBtX2Z1bGxTY3JlZW5SZW5kZXJlcikKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgaWYgKHJlbmRlcmVyICYmIG1fc2F2ZWRQbGFjZWhvbGRlclJlbmRl
clN0eWxlKSAKLSAgICAgICAgcmVuZGVyZXItPmNyZWF0ZVBsYWNlaG9sZGVyKG1fc2F2ZWRQbGFj
ZWhvbGRlclJlbmRlclN0eWxlLnJlbGVhc2UoKSwgbV9zYXZlZFBsYWNlaG9sZGVyRnJhbWVSZWN0
KTsKLSAgICBlbHNlIGlmIChyZW5kZXJlciAmJiBtX2Z1bGxTY3JlZW5SZW5kZXJlciAmJiBtX2Z1
bGxTY3JlZW5SZW5kZXJlci0+cGxhY2Vob2xkZXIoKSkgewotICAgICAgICBSZW5kZXJCbG9jayog
cGxhY2Vob2xkZXIgPSBtX2Z1bGxTY3JlZW5SZW5kZXJlci0+cGxhY2Vob2xkZXIoKTsKLSAgICAg
ICAgcmVuZGVyZXItPmNyZWF0ZVBsYWNlaG9sZGVyKFJlbmRlclN0eWxlOjpjbG9uZShwbGFjZWhv
bGRlci0+c3R5bGUoKSksIHBsYWNlaG9sZGVyLT5mcmFtZVJlY3QoKSk7Ci0gICAgfQotCi0gICAg
aWYgKG1fZnVsbFNjcmVlblJlbmRlcmVyKQotICAgICAgICBtX2Z1bGxTY3JlZW5SZW5kZXJlci0+
ZGVzdHJveSgpOwotICAgIEFTU0VSVCghbV9mdWxsU2NyZWVuUmVuZGVyZXIpOwotCi0gICAgbV9m
dWxsU2NyZWVuUmVuZGVyZXIgPSByZW5kZXJlcjsKLSAgICAKLSAgICAvLyBUaGlzIG5vdGlmaWNh
dGlvbiBjYW4gY29tZSBpbiBhZnRlciB0aGUgcGFnZSBoYXMgYmVlbiBkZXN0cm95ZWQuCi0gICAg
aWYgKHBhZ2UoKSkKLSAgICAgICAgcGFnZSgpLT5jaHJvbWUoKS0+Y2xpZW50KCktPmZ1bGxTY3Jl
ZW5SZW5kZXJlckNoYW5nZWQobV9mdWxsU2NyZWVuUmVuZGVyZXIpOwotfQotCi12b2lkIERvY3Vt
ZW50OjpmdWxsU2NyZWVuUmVuZGVyZXJEZXN0cm95ZWQoKQotewotICAgIG1fZnVsbFNjcmVlblJl
bmRlcmVyID0gMDsKLQotICAgIGlmIChwYWdlKCkpCi0gICAgICAgIHBhZ2UoKS0+Y2hyb21lKCkt
PmNsaWVudCgpLT5mdWxsU2NyZWVuUmVuZGVyZXJDaGFuZ2VkKDApOwotfQotCi12b2lkIERvY3Vt
ZW50OjpzZXRGdWxsU2NyZWVuUmVuZGVyZXJTaXplKGNvbnN0IEludFNpemUmIHNpemUpCi17Ci0g
ICAgQVNTRVJUKG1fZnVsbFNjcmVlblJlbmRlcmVyKTsKLSAgICBpZiAoIW1fZnVsbFNjcmVlblJl
bmRlcmVyKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgaWYgKG1fZnVsbFNjcmVlblJlbmRl
cmVyKSB7Ci0gICAgICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gbmV3U3R5bGUgPSBSZW5kZXJTdHls
ZTo6Y2xvbmUobV9mdWxsU2NyZWVuUmVuZGVyZXItPnN0eWxlKCkpOwotICAgICAgICBuZXdTdHls
ZS0+c2V0V2lkdGgoTGVuZ3RoKHNpemUud2lkdGgoKSwgV2ViQ29yZTo6Rml4ZWQpKTsKLSAgICAg
ICAgbmV3U3R5bGUtPnNldEhlaWdodChMZW5ndGgoc2l6ZS5oZWlnaHQoKSwgV2ViQ29yZTo6Rml4
ZWQpKTsKLSAgICAgICAgbmV3U3R5bGUtPnNldFRvcChMZW5ndGgoMCwgV2ViQ29yZTo6Rml4ZWQp
KTsKLSAgICAgICAgbmV3U3R5bGUtPnNldExlZnQoTGVuZ3RoKDAsIFdlYkNvcmU6OkZpeGVkKSk7
Ci0gICAgICAgIG1fZnVsbFNjcmVlblJlbmRlcmVyLT5zZXRTdHlsZShuZXdTdHlsZSk7Ci0gICAg
ICAgIHVwZGF0ZUxheW91dCgpOwotICAgIH0KLX0KLSAgICAKLXZvaWQgRG9jdW1lbnQ6OnNldEZ1
bGxTY3JlZW5SZW5kZXJlckJhY2tncm91bmRDb2xvcihDb2xvciBiYWNrZ3JvdW5kQ29sb3IpCi17
Ci0gICAgaWYgKCFtX2Z1bGxTY3JlZW5SZW5kZXJlcikKLSAgICAgICAgcmV0dXJuOwotICAgIAot
ICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gbmV3U3R5bGUgPSBSZW5kZXJTdHlsZTo6Y2xvbmUobV9m
dWxsU2NyZWVuUmVuZGVyZXItPnN0eWxlKCkpOwotICAgIG5ld1N0eWxlLT5zZXRCYWNrZ3JvdW5k
Q29sb3IoYmFja2dyb3VuZENvbG9yKTsKLSAgICBtX2Z1bGxTY3JlZW5SZW5kZXJlci0+c2V0U3R5
bGUobmV3U3R5bGUpOwotfQotICAgIAotdm9pZCBEb2N1bWVudDo6ZnVsbFNjcmVlbkNoYW5nZURl
bGF5VGltZXJGaXJlZChUaW1lcjxEb2N1bWVudD4qKQotewotICAgIC8vIFNpbmNlIHdlIGRpc3Bh
dGNoIGV2ZW50cyBpbiB0aGlzIGZ1bmN0aW9uLCBpdCdzIHBvc3NpYmxlIHRoYXQgdGhlCi0gICAg
Ly8gZG9jdW1lbnQgd2lsbCBiZSBkZXRhY2hlZCBhbmQgR0MnZC4gV2UgcHJvdGVjdCBpdCBoZXJl
IHRvIG1ha2Ugc3VyZSB3ZQotICAgIC8vIGNhbiBmaW5pc2ggdGhlIGZ1bmN0aW9uIHN1Y2Nlc3Nm
dWxseS4KLSAgICBSZWZQdHI8RG9jdW1lbnQ+IHByb3RlY3REb2N1bWVudCh0aGlzKTsKLSAgICBE
ZXF1ZTxSZWZQdHI8Tm9kZT4gPiBjaGFuZ2VRdWV1ZTsKLSAgICBtX2Z1bGxTY3JlZW5DaGFuZ2VF
dmVudFRhcmdldFF1ZXVlLnN3YXAoY2hhbmdlUXVldWUpOwotCi0gICAgd2hpbGUgKCFjaGFuZ2VR
dWV1ZS5pc0VtcHR5KCkpIHsKLSAgICAgICAgUmVmUHRyPE5vZGU+IG5vZGUgPSBjaGFuZ2VRdWV1
ZS50YWtlRmlyc3QoKTsKLSAgICAgICAgaWYgKCFub2RlKQotICAgICAgICAgICAgbm9kZSA9IGRv
Y3VtZW50RWxlbWVudCgpOwotICAgICAgICAvLyBUaGUgZGlzcGF0Y2hFdmVudCBiZWxvdyBtYXkg
aGF2ZSBibG93biBhd2F5IG91ciBkb2N1bWVudEVsZW1lbnQuCi0gICAgICAgIGlmICghbm9kZSkK
LSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIC8vIElmIHRoZSBlbGVtZW50IHdhcyBy
ZW1vdmVkIGZyb20gb3VyIHRyZWUsIGFsc28gbWVzc2FnZSB0aGUgZG9jdW1lbnRFbGVtZW50LiBT
aW5jZSB3ZSBtYXkKLSAgICAgICAgLy8gaGF2ZSBhIGRvY3VtZW50IGhpZXJhcmNoeSwgY2hlY2sg
dGhhdCBub2RlIGlzbid0IGluIGFub3RoZXIgZG9jdW1lbnQuCi0gICAgICAgIGlmICghY29udGFp
bnMobm9kZS5nZXQoKSkgJiYgIW5vZGUtPmluRG9jdW1lbnQoKSkKLSAgICAgICAgICAgIGNoYW5n
ZVF1ZXVlLmFwcGVuZChkb2N1bWVudEVsZW1lbnQoKSk7Ci0gICAgICAgIAotICAgICAgICBub2Rl
LT5kaXNwYXRjaEV2ZW50KEV2ZW50OjpjcmVhdGUoZXZlbnROYW1lcygpLndlYmtpdGZ1bGxzY3Jl
ZW5jaGFuZ2VFdmVudCwgdHJ1ZSwgZmFsc2UpKTsKLSAgICB9Ci0KLSAgICBEZXF1ZTxSZWZQdHI8
Tm9kZT4gPiBlcnJvclF1ZXVlOwotICAgIG1fZnVsbFNjcmVlbkVycm9yRXZlbnRUYXJnZXRRdWV1
ZS5zd2FwKGVycm9yUXVldWUpOwotICAgIAotICAgIHdoaWxlICghZXJyb3JRdWV1ZS5pc0VtcHR5
KCkpIHsKLSAgICAgICAgUmVmUHRyPE5vZGU+IG5vZGUgPSBlcnJvclF1ZXVlLnRha2VGaXJzdCgp
OwotICAgICAgICBpZiAoIW5vZGUpCi0gICAgICAgICAgICBub2RlID0gZG9jdW1lbnRFbGVtZW50
KCk7Ci0gICAgICAgIC8vIFRoZSBkaXNwYXRjaEV2ZW50IGJlbG93IG1heSBoYXZlIGJsb3duIGF3
YXkgb3VyIGRvY3VtZW50RWxlbWVudC4KLSAgICAgICAgaWYgKCFub2RlKQotICAgICAgICAgICAg
Y29udGludWU7Ci0gICAgICAgIAotICAgICAgICAvLyBJZiB0aGUgZWxlbWVudCB3YXMgcmVtb3Zl
ZCBmcm9tIG91ciB0cmVlLCBhbHNvIG1lc3NhZ2UgdGhlIGRvY3VtZW50RWxlbWVudC4gU2luY2Ug
d2UgbWF5Ci0gICAgICAgIC8vIGhhdmUgYSBkb2N1bWVudCBoaWVyYXJjaHksIGNoZWNrIHRoYXQg
bm9kZSBpc24ndCBpbiBhbm90aGVyIGRvY3VtZW50LgotICAgICAgICBpZiAoIWNvbnRhaW5zKG5v
ZGUuZ2V0KCkpICYmICFub2RlLT5pbkRvY3VtZW50KCkpCi0gICAgICAgICAgICBlcnJvclF1ZXVl
LmFwcGVuZChkb2N1bWVudEVsZW1lbnQoKSk7Ci0gICAgICAgIAotICAgICAgICBub2RlLT5kaXNw
YXRjaEV2ZW50KEV2ZW50OjpjcmVhdGUoZXZlbnROYW1lcygpLndlYmtpdGZ1bGxzY3JlZW5lcnJv
ckV2ZW50LCB0cnVlLCBmYWxzZSkpOwotICAgIH0KLX0KLQotdm9pZCBEb2N1bWVudDo6ZnVsbFNj
cmVlbkVsZW1lbnRSZW1vdmVkKCkKLXsKLSAgICBtX2Z1bGxTY3JlZW5FbGVtZW50LT5zZXRDb250
YWluc0Z1bGxTY3JlZW5FbGVtZW50T25BbmNlc3RvcnNDcm9zc2luZ0ZyYW1lQm91bmRhcmllcyhm
YWxzZSk7Ci0gICAgd2Via2l0Q2FuY2VsRnVsbFNjcmVlbigpOwotfQotCi12b2lkIERvY3VtZW50
OjpyZW1vdmVGdWxsU2NyZWVuRWxlbWVudE9mU3VidHJlZShOb2RlKiBub2RlLCBib29sIGFtb25n
Q2hpbGRyZW5Pbmx5KQotewotICAgIGlmICghbV9mdWxsU2NyZWVuRWxlbWVudCkKKyAgICBpZiAo
IW5vZGUtPmluRG9jdW1lbnQoKSkKICAgICAgICAgcmV0dXJuOwogICAgIAotICAgIGJvb2wgZWxl
bWVudEluU3VidHJlZSA9IGZhbHNlOwotICAgIGlmIChhbW9uZ0NoaWxkcmVuT25seSkKLSAgICAg
ICAgZWxlbWVudEluU3VidHJlZSA9IG1fZnVsbFNjcmVlbkVsZW1lbnQtPmlzRGVzY2VuZGFudE9m
KG5vZGUpOwotICAgIGVsc2UKLSAgICAgICAgZWxlbWVudEluU3VidHJlZSA9IChtX2Z1bGxTY3Jl
ZW5FbGVtZW50ID09IG5vZGUpIHx8IG1fZnVsbFNjcmVlbkVsZW1lbnQtPmlzRGVzY2VuZGFudE9m
KG5vZGUpOwotICAgIAotICAgIGlmIChlbGVtZW50SW5TdWJ0cmVlKQotICAgICAgICBmdWxsU2Ny
ZWVuRWxlbWVudFJlbW92ZWQoKTsKLX0KLQotYm9vbCBEb2N1bWVudDo6aXNBbmltYXRpbmdGdWxs
U2NyZWVuKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9pc0FuaW1hdGluZ0Z1bGxTY3JlZW47Ci19
Ci0KLXZvaWQgRG9jdW1lbnQ6OnNldEFuaW1hdGluZ0Z1bGxTY3JlZW4oYm9vbCBmbGFnKQotewot
ICAgIGlmIChtX2lzQW5pbWF0aW5nRnVsbFNjcmVlbiA9PSBmbGFnKQotICAgICAgICByZXR1cm47
Ci0gICAgbV9pc0FuaW1hdGluZ0Z1bGxTY3JlZW4gPSBmbGFnOwotCi0gICAgaWYgKG1fZnVsbFNj
cmVlbkVsZW1lbnQgJiYgbV9mdWxsU2NyZWVuRWxlbWVudC0+aXNEZXNjZW5kYW50T2YodGhpcykp
IHsKLSAgICAgICAgbV9mdWxsU2NyZWVuRWxlbWVudC0+c2V0TmVlZHNTdHlsZVJlY2FsYygpOwot
ICAgICAgICBzY2hlZHVsZUZvcmNlZFN0eWxlUmVjYWxjKCk7Ci0gICAgfQotfQotCi12b2lkIERv
Y3VtZW50OjpjbGVhckZ1bGxzY3JlZW5FbGVtZW50U3RhY2soKQotewotICAgIG1fZnVsbFNjcmVl
bkVsZW1lbnRTdGFjay5jbGVhcigpOwotfQotCi12b2lkIERvY3VtZW50Ojpwb3BGdWxsc2NyZWVu
RWxlbWVudFN0YWNrKCkKLXsKLSAgICBpZiAobV9mdWxsU2NyZWVuRWxlbWVudFN0YWNrLmlzRW1w
dHkoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9mdWxsU2NyZWVuRWxlbWVudFN0YWNrLnJl
bW92ZUZpcnN0KCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnB1c2hGdWxsc2NyZWVuRWxlbWVudFN0
YWNrKEVsZW1lbnQqIGVsZW1lbnQpCi17Ci0gICAgbV9mdWxsU2NyZWVuRWxlbWVudFN0YWNrLnBy
ZXBlbmQoZWxlbWVudCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmFkZERvY3VtZW50VG9GdWxsU2Ny
ZWVuQ2hhbmdlRXZlbnRRdWV1ZShEb2N1bWVudCogZG9jKQotewotICAgIEFTU0VSVChkb2MpOwot
ICAgIE5vZGUqIHRhcmdldCA9IGRvYy0+d2Via2l0RnVsbHNjcmVlbkVsZW1lbnQoKTsKLSAgICBp
ZiAoIXRhcmdldCkKLSAgICAgICAgdGFyZ2V0ID0gZG9jLT53ZWJraXRDdXJyZW50RnVsbFNjcmVl
bkVsZW1lbnQoKTsKLSAgICBpZiAoIXRhcmdldCkKLSAgICAgICAgdGFyZ2V0ID0gZG9jOwotICAg
IG1fZnVsbFNjcmVlbkNoYW5nZUV2ZW50VGFyZ2V0UXVldWUuYXBwZW5kKHRhcmdldCk7Ci19Ci0j
ZW5kaWYKLQotI2lmIEVOQUJMRShQT0lOVEVSX0xPQ0spCi12b2lkIERvY3VtZW50Ojp3ZWJraXRF
eGl0UG9pbnRlckxvY2soKQotewotICAgIGlmICghcGFnZSgpKQorICAgIC8vIFVudGlsIHRoZSA8
Ym9keT4gZXhpc3RzLCB3ZSBoYXZlIG5vIGNob2ljZSBidXQgdG8gY29tcGFyZSBkb2N1bWVudCBw
b3NpdGlvbnMsCisgICAgLy8gc2luY2Ugc3R5bGVzIG91dHNpZGUgb2YgdGhlIGJvZHkgYW5kIGhl
YWQgY29udGludWUgdG8gYmUgc2h1bnRlZCBpbnRvIHRoZSBoZWFkCisgICAgLy8gKGFuZCB0aHVz
IGNhbiBzaGlmdCB0byBlbmQgdXAgYmVmb3JlIGR5bmFtaWNhbGx5IGFkZGVkIERPTSBjb250ZW50
IHRoYXQgaXMgYWxzbworICAgIC8vIG91dHNpZGUgdGhlIGJvZHkpLgorICAgIGlmICgoY3JlYXRl
ZEJ5UGFyc2VyICYmIG1fZG9jdW1lbnQtPmJvZHkoKSkgfHwgbV9zdHlsZVNoZWV0Q2FuZGlkYXRl
Tm9kZXMuaXNFbXB0eSgpKSB7CisgICAgICAgIG1fc3R5bGVTaGVldENhbmRpZGF0ZU5vZGVzLmFk
ZChub2RlKTsKICAgICAgICAgcmV0dXJuOwotICAgIGlmIChFbGVtZW50KiB0YXJnZXQgPSBwYWdl
KCktPnBvaW50ZXJMb2NrQ29udHJvbGxlcigpLT5lbGVtZW50KCkpIHsKLSAgICAgICAgaWYgKHRh
cmdldC0+ZG9jdW1lbnQoKSAhPSB0aGlzKQotICAgICAgICAgICAgcmV0dXJuOwotICAgIH0KLSAg
ICBwYWdlKCktPnBvaW50ZXJMb2NrQ29udHJvbGxlcigpLT5yZXF1ZXN0UG9pbnRlclVubG9jaygp
OwotfQotCi1FbGVtZW50KiBEb2N1bWVudDo6d2Via2l0UG9pbnRlckxvY2tFbGVtZW50KCkgY29u
c3QKLXsKLSAgICBpZiAoIXBhZ2UoKSB8fCBwYWdlKCktPnBvaW50ZXJMb2NrQ29udHJvbGxlcigp
LT5sb2NrUGVuZGluZygpKQotICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAoRWxlbWVudCogZWxl
bWVudCA9IHBhZ2UoKS0+cG9pbnRlckxvY2tDb250cm9sbGVyKCktPmVsZW1lbnQoKSkgewotICAg
ICAgICBpZiAoZWxlbWVudC0+ZG9jdW1lbnQoKSA9PSB0aGlzKQotICAgICAgICAgICAgcmV0dXJu
IGVsZW1lbnQ7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotI2VuZGlmCi0KLXZvaWQgRG9jdW1l
bnQ6OmRlY3JlbWVudExvYWRFdmVudERlbGF5Q291bnQoKQotewotICAgIEFTU0VSVChtX2xvYWRF
dmVudERlbGF5Q291bnQpOwotICAgIC0tbV9sb2FkRXZlbnREZWxheUNvdW50OwotCi0gICAgaWYg
KGZyYW1lKCkgJiYgIW1fbG9hZEV2ZW50RGVsYXlDb3VudCAmJiAhbV9sb2FkRXZlbnREZWxheVRp
bWVyLmlzQWN0aXZlKCkpCi0gICAgICAgIG1fbG9hZEV2ZW50RGVsYXlUaW1lci5zdGFydE9uZVNo
b3QoMCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmxvYWRFdmVudERlbGF5VGltZXJGaXJlZChUaW1l
cjxEb2N1bWVudD4qKQotewotICAgIGlmIChmcmFtZSgpKQotICAgICAgICBmcmFtZSgpLT5sb2Fk
ZXIoKS0+Y2hlY2tDb21wbGV0ZWQoKTsKLX0KLQotI2lmIEVOQUJMRShSRVFVRVNUX0FOSU1BVElP
Tl9GUkFNRSkKLWludCBEb2N1bWVudDo6d2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lKFBhc3NS
ZWZQdHI8UmVxdWVzdEFuaW1hdGlvbkZyYW1lQ2FsbGJhY2s+IGNhbGxiYWNrKQotewotICAgIGlm
ICghbV9zY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXIpIHsKLSNpZiBVU0UoUkVRVUVTVF9BTklN
QVRJT05fRlJBTUVfRElTUExBWV9NT05JVE9SKQotICAgICAgICBtX3NjcmlwdGVkQW5pbWF0aW9u
Q29udHJvbGxlciA9IFNjcmlwdGVkQW5pbWF0aW9uQ29udHJvbGxlcjo6Y3JlYXRlKHRoaXMsIHBh
Z2UoKSA/IHBhZ2UoKS0+ZGlzcGxheUlEKCkgOiAwKTsKLSNlbHNlCi0gICAgICAgIG1fc2NyaXB0
ZWRBbmltYXRpb25Db250cm9sbGVyID0gU2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyOjpjcmVh
dGUodGhpcywgMCk7Ci0jZW5kaWYKLSAgICAgICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHRoZSBQ
YWdlIG1heSBoYXZlIHN1c3BlbmRlZCBzY3JpcHRlZCBhbmltYXRpb25zIGJlZm9yZQotICAgICAg
ICAvLyB3ZSB3ZXJlIGNyZWF0ZWQuIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgd2UgZG9uJ3Qg
c3RhcnQgdXAgdGhlIGFuaW1hdGlvbgotICAgICAgICAvLyBjb250cm9sbGVyIG9uIGEgYmFja2dy
b3VuZCB0YWIsIGZvciBleGFtcGxlLgotICAgICAgICBpZiAoIXBhZ2UoKSB8fCBwYWdlKCktPnNj
cmlwdGVkQW5pbWF0aW9uc1N1c3BlbmRlZCgpKQotICAgICAgICAgICAgbV9zY3JpcHRlZEFuaW1h
dGlvbkNvbnRyb2xsZXItPnN1c3BlbmQoKTsKICAgICB9CiAKLSAgICByZXR1cm4gbV9zY3JpcHRl
ZEFuaW1hdGlvbkNvbnRyb2xsZXItPnJlZ2lzdGVyQ2FsbGJhY2soY2FsbGJhY2spOworICAgIC8v
IERldGVybWluZSBhbiBhcHByb3ByaWF0ZSBpbnNlcnRpb24gcG9pbnQuCisgICAgU3R5bGVTaGVl
dENhbmRpZGF0ZUxpc3RIYXNoU2V0OjppdGVyYXRvciBiZWdpbiA9IG1fc3R5bGVTaGVldENhbmRp
ZGF0ZU5vZGVzLmJlZ2luKCk7CisgICAgU3R5bGVTaGVldENhbmRpZGF0ZUxpc3RIYXNoU2V0Ojpp
dGVyYXRvciBlbmQgPSBtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcy5lbmQoKTsKKyAgICBTdHls
ZVNoZWV0Q2FuZGlkYXRlTGlzdEhhc2hTZXQ6Oml0ZXJhdG9yIGl0ID0gZW5kOworICAgIE5vZGUq
IGZvbGxvd2luZ05vZGUgPSAwOworICAgIGRvIHsKKyAgICAgICAgLS1pdDsKKyAgICAgICAgTm9k
ZSogbiA9ICppdDsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgcG9zaXRpb24gPSBuLT5jb21wYXJl
RG9jdW1lbnRQb3NpdGlvbihub2RlKTsKKyAgICAgICAgaWYgKHBvc2l0aW9uID09IE5vZGU6OkRP
Q1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lORykgeworICAgICAgICAgICAgbV9zdHlsZVNoZWV0Q2Fu
ZGlkYXRlTm9kZXMuaW5zZXJ0QmVmb3JlKGZvbGxvd2luZ05vZGUsIG5vZGUpOworICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZvbGxvd2luZ05vZGUgPSBuOworICAgIH0g
d2hpbGUgKGl0ICE9IGJlZ2luKTsKKyAgICAKKyAgICBtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rl
cy5pbnNlcnRCZWZvcmUoZm9sbG93aW5nTm9kZSwgbm9kZSk7CiB9CiAKLXZvaWQgRG9jdW1lbnQ6
OndlYmtpdENhbmNlbEFuaW1hdGlvbkZyYW1lKGludCBpZCkKK3ZvaWQgRG9jdW1lbnRTdHlsZVNo
ZWV0Q29sbGVjdGlvbjo6cmVtb3ZlU3R5bGVTaGVldENhbmRpZGF0ZU5vZGUoTm9kZSogbm9kZSkK
IHsKLSAgICBpZiAoIW1fc2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyKQotICAgICAgICByZXR1
cm47Ci0gICAgbV9zY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXItPmNhbmNlbENhbGxiYWNrKGlk
KTsKKyAgICBtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcy5yZW1vdmUobm9kZSk7CiB9CiAKLXZv
aWQgRG9jdW1lbnQ6OnNlcnZpY2VTY3JpcHRlZEFuaW1hdGlvbnMoRE9NVGltZVN0YW1wIHRpbWUp
Cit2b2lkIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OmNvbGxlY3RBY3RpdmVTdHlsZVNo
ZWV0cyhWZWN0b3I8UmVmUHRyPFN0eWxlU2hlZXQ+ID4mIHNoZWV0cykKIHsKLSAgICBpZiAoIW1f
c2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyKQorICAgIGlmIChtX2RvY3VtZW50LT5zZXR0aW5n
cygpICYmICFtX2RvY3VtZW50LT5zZXR0aW5ncygpLT5hdXRob3JBbmRVc2VyU3R5bGVzRW5hYmxl
ZCgpKQogICAgICAgICByZXR1cm47Ci0gICAgbV9zY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXIt
PnNlcnZpY2VTY3JpcHRlZEFuaW1hdGlvbnModGltZSk7Ci19Ci0jZW5kaWYKIAotI2lmIEVOQUJM
RShUT1VDSF9FVkVOVFMpCi1QYXNzUmVmUHRyPFRvdWNoPiBEb2N1bWVudDo6Y3JlYXRlVG91Y2go
RE9NV2luZG93KiB3aW5kb3csIEV2ZW50VGFyZ2V0KiB0YXJnZXQsIGludCBpZGVudGlmaWVyLCBp
bnQgcGFnZVgsIGludCBwYWdlWSwgaW50IHNjcmVlblgsIGludCBzY3JlZW5ZLCBpbnQgcmFkaXVz
WCwgaW50IHJhZGl1c1ksIGZsb2F0IHJvdGF0aW9uQW5nbGUsIGZsb2F0IGZvcmNlLCBFeGNlcHRp
b25Db2RlJikgY29uc3QKLXsKLSAgICAvLyBGSVhNRTogSXQncyBub3QgY2xlYXIgZnJvbSB0aGUg
ZG9jdW1lbnRhdGlvbiBhdAotICAgIC8vIGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2xpYnJh
cnkvc2FmYXJpLyNkb2N1bWVudGF0aW9uL1VzZXJFeHBlcmllbmNlL1JlZmVyZW5jZS9Eb2N1bWVu
dEFkZGl0aW9uc1JlZmVyZW5jZS9Eb2N1bWVudEFkZGl0aW9ucy9Eb2N1bWVudEFkZGl0aW9ucy5o
dG1sCi0gICAgLy8gd2hlbiB0aGlzIG1ldGhvZCBzaG91bGQgdGhyb3cgYW5kIG5vciBpcyBpdCBi
eSBpbnNwZWN0aW9uIG9mIGlPUyBiZWhhdmlvci4gSXQgd291bGQgYmUgbmljZSB0byB2ZXJpZnkg
YW55IGNhc2VzIHdoZXJlIGl0IHRocm93cyB1bmRlciBpT1MKLSAgICAvLyBhbmQgaW1wbGVtZW50
IHRoZW0gaGVyZS4gU2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00
NzgxOQotICAgIEZyYW1lKiBmcmFtZSA9IHdpbmRvdyA/IHdpbmRvdy0+ZnJhbWUoKSA6IHRoaXMt
PmZyYW1lKCk7Ci0gICAgcmV0dXJuIFRvdWNoOjpjcmVhdGUoZnJhbWUsIHRhcmdldCwgaWRlbnRp
Zmllciwgc2NyZWVuWCwgc2NyZWVuWSwgcGFnZVgsIHBhZ2VZLCByYWRpdXNYLCByYWRpdXNZLCBy
b3RhdGlvbkFuZ2xlLCBmb3JjZSk7Ci19CisgICAgU3R5bGVTaGVldENhbmRpZGF0ZUxpc3RIYXNo
U2V0OjppdGVyYXRvciBiZWdpbiA9IG1fc3R5bGVTaGVldENhbmRpZGF0ZU5vZGVzLmJlZ2luKCk7
CisgICAgU3R5bGVTaGVldENhbmRpZGF0ZUxpc3RIYXNoU2V0OjppdGVyYXRvciBlbmQgPSBtX3N0
eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcy5lbmQoKTsKKyAgICBmb3IgKFN0eWxlU2hlZXRDYW5kaWRh
dGVMaXN0SGFzaFNldDo6aXRlcmF0b3IgaXQgPSBiZWdpbjsgaXQgIT0gZW5kOyArK2l0KSB7Cisg
ICAgICAgIE5vZGUqIG4gPSAqaXQ7CisgICAgICAgIFN0eWxlU2hlZXQqIHNoZWV0ID0gMDsKKyAg
ICAgICAgaWYgKG4tPm5vZGVUeXBlKCkgPT0gTm9kZTo6UFJPQ0VTU0lOR19JTlNUUlVDVElPTl9O
T0RFKSB7CisgICAgICAgICAgICAvLyBQcm9jZXNzaW5nIGluc3RydWN0aW9uIChYTUwgZG9jdW1l
bnRzIG9ubHkpLgorICAgICAgICAgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCBsaW5raW5nIHRvIGVt
YmVkZGVkIENTUyBzdHlsZXNoZWV0cywgc2VlIDxodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9NDkyODE+IGZvciBkaXNjdXNzaW9uLgorICAgICAgICAgICAgUHJvY2Vzc2lu
Z0luc3RydWN0aW9uKiBwaSA9IHN0YXRpY19jYXN0PFByb2Nlc3NpbmdJbnN0cnVjdGlvbio+KG4p
OworICAgICAgICAgICAgc2hlZXQgPSBwaS0+c2hlZXQoKTsKKyNpZiBFTkFCTEUoWFNMVCkKKyAg
ICAgICAgICAgIC8vIERvbid0IGFwcGx5IFhTTCB0cmFuc2Zvcm1zIHRvIGFscmVhZHkgdHJhbnNm
b3JtZWQgZG9jdW1lbnRzIC0tIDxyZGFyOi8vcHJvYmxlbS80MTMyODA2PgorICAgICAgICAgICAg
aWYgKHBpLT5pc1hTTCgpICYmICFtX2RvY3VtZW50LT50cmFuc2Zvcm1Tb3VyY2VEb2N1bWVudCgp
KSB7CisgICAgICAgICAgICAgICAgLy8gRG9uJ3QgYXBwbHkgWFNMIHRyYW5zZm9ybXMgdW50aWwg
bG9hZGluZyBpcyBmaW5pc2hlZC4KKyAgICAgICAgICAgICAgICBpZiAoIW1fZG9jdW1lbnQtPnBh
cnNpbmcoKSkKKyAgICAgICAgICAgICAgICAgICAgbV9kb2N1bWVudC0+YXBwbHlYU0xUcmFuc2Zv
cm0ocGkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KICNlbmRpZgor
ICAgICAgICB9IGVsc2UgaWYgKChuLT5pc0hUTUxFbGVtZW50KCkgJiYgKG4tPmhhc1RhZ05hbWUo
bGlua1RhZykgfHwgbi0+aGFzVGFnTmFtZShzdHlsZVRhZykpKQorI2lmIEVOQUJMRShTVkcpCisg
ICAgICAgICAgICAgICAgICAgfHwgIChuLT5pc1NWR0VsZW1lbnQoKSAmJiBuLT5oYXNUYWdOYW1l
KFNWR05hbWVzOjpzdHlsZVRhZykpCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICApIHsKKyAg
ICAgICAgICAgIEVsZW1lbnQqIGUgPSBzdGF0aWNfY2FzdDxFbGVtZW50Kj4obik7CisgICAgICAg
ICAgICBBdG9taWNTdHJpbmcgdGl0bGUgPSBlLT5nZXRBdHRyaWJ1dGUodGl0bGVBdHRyKTsKKyAg
ICAgICAgICAgIGJvb2wgZW5hYmxlZFZpYVNjcmlwdCA9IGZhbHNlOworICAgICAgICAgICAgaWYg
KGUtPmhhc0xvY2FsTmFtZShsaW5rVGFnKSkgeworICAgICAgICAgICAgICAgIC8vIDxMSU5LPiBl
bGVtZW50CisgICAgICAgICAgICAgICAgSFRNTExpbmtFbGVtZW50KiBsaW5rRWxlbWVudCA9IHN0
YXRpY19jYXN0PEhUTUxMaW5rRWxlbWVudCo+KG4pOworICAgICAgICAgICAgICAgIGlmIChsaW5r
RWxlbWVudC0+aXNEaXNhYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAg
ICAgICAgICAgICAgICBlbmFibGVkVmlhU2NyaXB0ID0gbGlua0VsZW1lbnQtPmlzRW5hYmxlZFZp
YVNjcmlwdCgpOworICAgICAgICAgICAgICAgIGlmIChsaW5rRWxlbWVudC0+c3R5bGVTaGVldElz
TG9hZGluZygpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGl0IGlzIGxvYWRpbmcgYnV0IHdl
IHNob3VsZCBzdGlsbCBkZWNpZGUgd2hpY2ggc3R5bGUgc2hlZXQgc2V0IHRvIHVzZQorICAgICAg
ICAgICAgICAgICAgICBpZiAoIWVuYWJsZWRWaWFTY3JpcHQgJiYgIXRpdGxlLmlzRW1wdHkoKSAm
JiBtX3ByZWZlcnJlZFN0eWxlc2hlZXRTZXROYW1lLmlzRW1wdHkoKSkgeworICAgICAgICAgICAg
ICAgICAgICAgICAgY29uc3QgQXRvbWljU3RyaW5nJiByZWwgPSBlLT5nZXRBdHRyaWJ1dGUocmVs
QXR0cik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlbC5jb250YWlucygiYWx0ZXJu
YXRlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ByZWZlcnJlZFN0eWxlc2hl
ZXRTZXROYW1lID0gdGl0bGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zZWxlY3Rl
ZFN0eWxlc2hlZXRTZXROYW1lID0gdGl0bGU7CisgICAgICAgICAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghbGlua0VsZW1lbnQtPnNoZWV0KCkp
CisgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gbnVsbEF0b207CisgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgcHJlZmVycmVkIHN0eWxlc2V0LiBUaGlzIGlz
IHRoZQorICAgICAgICAgICAgLy8gc2V0IG9mIHNoZWV0cyB0aGF0IHdpbGwgYmUgZW5hYmxlZC4K
KyNpZiBFTkFCTEUoU1ZHKQorICAgICAgICAgICAgaWYgKG4tPmlzU1ZHRWxlbWVudCgpICYmIG4t
Pmhhc1RhZ05hbWUoU1ZHTmFtZXM6OnN0eWxlVGFnKSkKKyAgICAgICAgICAgICAgICBzaGVldCA9
IHN0YXRpY19jYXN0PFNWR1N0eWxlRWxlbWVudCo+KG4pLT5zaGVldCgpOworICAgICAgICAgICAg
ZWxzZQorI2VuZGlmCisgICAgICAgICAgICBpZiAoZS0+aGFzTG9jYWxOYW1lKGxpbmtUYWcpKQor
ICAgICAgICAgICAgICAgIHNoZWV0ID0gc3RhdGljX2Nhc3Q8SFRNTExpbmtFbGVtZW50Kj4obikt
PnNoZWV0KCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgLy8gPFNUWUxFPiBl
bGVtZW50CisgICAgICAgICAgICAgICAgc2hlZXQgPSBzdGF0aWNfY2FzdDxIVE1MU3R5bGVFbGVt
ZW50Kj4obiktPnNoZWV0KCk7CisgICAgICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBz
aGVldCBiZWxvbmdzIHRvIGEgc3R5bGVzZXQKKyAgICAgICAgICAgIC8vICh0aHVzIG1ha2luZyBp
dCBQUkVGRVJSRUQgb3IgQUxURVJOQVRFIHJhdGhlciB0aGFuCisgICAgICAgICAgICAvLyBQRVJT
SVNURU5UKS4KKyAgICAgICAgICAgIEF0b21pY1N0cmluZyByZWwgPSBlLT5nZXRBdHRyaWJ1dGUo
cmVsQXR0cik7CisgICAgICAgICAgICBpZiAoIWVuYWJsZWRWaWFTY3JpcHQgJiYgIXRpdGxlLmlz
RW1wdHkoKSkgeworICAgICAgICAgICAgICAgIC8vIFllcywgd2UgaGF2ZSBhIHRpdGxlLgorICAg
ICAgICAgICAgICAgIGlmIChtX3ByZWZlcnJlZFN0eWxlc2hlZXRTZXROYW1lLmlzRW1wdHkoKSkg
eworICAgICAgICAgICAgICAgICAgICAvLyBObyBwcmVmZXJyZWQgc2V0IGhhcyBiZWVuIGVzdGFi
bGlzaGVkLiBJZgorICAgICAgICAgICAgICAgICAgICAvLyB3ZSBhcmUgTk9UIGFuIGFsdGVybmF0
ZSBzaGVldCwgdGhlbiBlc3RhYmxpc2gKKyAgICAgICAgICAgICAgICAgICAgLy8gdXMgYXMgdGhl
IHByZWZlcnJlZCBzZXQuIE90aGVyd2lzZSwganVzdCBpZ25vcmUKKyAgICAgICAgICAgICAgICAg
ICAgLy8gdGhpcyBzaGVldC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKGUtPmhhc0xvY2FsTmFt
ZShzdHlsZVRhZykgfHwgIXJlbC5jb250YWlucygiYWx0ZXJuYXRlIikpCisgICAgICAgICAgICAg
ICAgICAgICAgICBtX3ByZWZlcnJlZFN0eWxlc2hlZXRTZXROYW1lID0gbV9zZWxlY3RlZFN0eWxl
c2hlZXRTZXROYW1lID0gdGl0bGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAg
IGlmICh0aXRsZSAhPSBtX3ByZWZlcnJlZFN0eWxlc2hlZXRTZXROYW1lKQorICAgICAgICAgICAg
ICAgICAgICBzaGVldCA9IDA7CisgICAgICAgICAgICB9CiAKLXN0YXRpYyB2b2lkIHdoZWVsRXZl
bnRIYW5kbGVyQ291bnRDaGFuZ2VkKERvY3VtZW50KiBkb2N1bWVudCkKLXsKLSAgICBQYWdlKiBw
YWdlID0gZG9jdW1lbnQtPnBhZ2UoKTsKLSAgICBpZiAoIXBhZ2UpCi0gICAgICAgIHJldHVybjsK
LQotICAgIFNjcm9sbGluZ0Nvb3JkaW5hdG9yKiBzY3JvbGxpbmdDb29yZGluYXRvciA9IHBhZ2Ut
PnNjcm9sbGluZ0Nvb3JkaW5hdG9yKCk7Ci0gICAgaWYgKCFzY3JvbGxpbmdDb29yZGluYXRvcikK
LSAgICAgICAgcmV0dXJuOwotCi0gICAgRnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBkb2N1bWVudC0+
dmlldygpOwotICAgIGlmICghZnJhbWVWaWV3KQotICAgICAgICByZXR1cm47Ci0KLSAgICBzY3Jv
bGxpbmdDb29yZGluYXRvci0+ZnJhbWVWaWV3V2hlZWxFdmVudEhhbmRsZXJDb3VudENoYW5nZWQo
ZnJhbWVWaWV3KTsKLX0KLQotdm9pZCBEb2N1bWVudDo6ZGlkQWRkV2hlZWxFdmVudEhhbmRsZXIo
KQotewotICAgICsrbV93aGVlbEV2ZW50SGFuZGxlckNvdW50OwotICAgIEZyYW1lKiBtYWluRnJh
bWUgPSBwYWdlKCkgPyBwYWdlKCktPm1haW5GcmFtZSgpIDogMDsKLSAgICBpZiAobWFpbkZyYW1l
KQotICAgICAgICBtYWluRnJhbWUtPm5vdGlmeUNocm9tZUNsaWVudFdoZWVsRXZlbnRIYW5kbGVy
Q291bnRDaGFuZ2VkKCk7Ci0KLSAgICB3aGVlbEV2ZW50SGFuZGxlckNvdW50Q2hhbmdlZCh0aGlz
KTsKKyAgICAgICAgICAgIGlmIChyZWwuY29udGFpbnMoImFsdGVybmF0ZSIpICYmIHRpdGxlLmlz
RW1wdHkoKSkKKyAgICAgICAgICAgICAgICBzaGVldCA9IDA7CisgICAgICAgIH0KKyAgICAgICAg
aWYgKHNoZWV0KQorICAgICAgICAgICAgc2hlZXRzLmFwcGVuZChzaGVldCk7CisgICAgfQogfQog
Ci12b2lkIERvY3VtZW50OjpkaWRSZW1vdmVXaGVlbEV2ZW50SGFuZGxlcigpCitib29sIERvY3Vt
ZW50U3R5bGVTaGVldENvbGxlY3Rpb246OnRlc3RBZGRlZFN0eWxlU2hlZXRSZXF1aXJlc1N0eWxl
UmVjYWxjKFN0eWxlU2hlZXRDb250ZW50cyogc3R5bGVzaGVldCkKIHsKLSAgICBBU1NFUlQobV93
aGVlbEV2ZW50SGFuZGxlckNvdW50ID4gMCk7Ci0gICAgLS1tX3doZWVsRXZlbnRIYW5kbGVyQ291
bnQ7Ci0gICAgRnJhbWUqIG1haW5GcmFtZSA9IHBhZ2UoKSA/IHBhZ2UoKS0+bWFpbkZyYW1lKCkg
OiAwOwotICAgIGlmIChtYWluRnJhbWUpCi0gICAgICAgIG1haW5GcmFtZS0+bm90aWZ5Q2hyb21l
Q2xpZW50V2hlZWxFdmVudEhhbmRsZXJDb3VudENoYW5nZWQoKTsKLQotICAgIHdoZWVsRXZlbnRI
YW5kbGVyQ291bnRDaGFuZ2VkKHRoaXMpOworICAgIC8vIFNlZSBpZiBhbGwgcnVsZXMgb24gdGhl
IHNoZWV0IGFyZSBzY29wZWQgdG8gc29tZSBzcGVjaWZpYyBpZHMgb3IgY2xhc3Nlcy4KKyAgICAv
LyBUaGVuIHRlc3QgaWYgd2UgYWN0dWFsbHkgaGF2ZSBhbnkgb2YgdGhvc2UgaW4gdGhlIHRyZWUg
YXQgdGhlIG1vbWVudC4KKyAgICBIYXNoU2V0PEF0b21pY1N0cmluZ0ltcGwqPiBpZFNjb3Blczsg
CisgICAgSGFzaFNldDxBdG9taWNTdHJpbmdJbXBsKj4gY2xhc3NTY29wZXM7CisgICAgaWYgKCFT
dHlsZVJlc29sdmVyOjpkZXRlcm1pbmVTdHlsZXNoZWV0U2VsZWN0b3JTY29wZXMoc3R5bGVzaGVl
dCwgaWRTY29wZXMsIGNsYXNzU2NvcGVzKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgLy8g
SW52YWxpZGF0ZSB0aGUgc3VidHJlZXMgdGhhdCBtYXRjaCB0aGUgc2NvcGVzLgorICAgIE5vZGUq
IG5vZGUgPSBtX2RvY3VtZW50LT5maXJzdENoaWxkKCk7CisgICAgd2hpbGUgKG5vZGUpIHsKKyAg
ICAgICAgaWYgKCFub2RlLT5pc1N0eWxlZEVsZW1lbnQoKSkgeworICAgICAgICAgICAgbm9kZSA9
IG5vZGUtPnRyYXZlcnNlTmV4dE5vZGUoKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAg
ICB9CisgICAgICAgIFN0eWxlZEVsZW1lbnQqIGVsZW1lbnQgPSBzdGF0aWNfY2FzdDxTdHlsZWRF
bGVtZW50Kj4obm9kZSk7CisgICAgICAgIGlmIChTZWxlY3RvckNoZWNrZXI6OmVsZW1lbnRNYXRj
aGVzU2VsZWN0b3JTY29wZXMoZWxlbWVudCwgaWRTY29wZXMsIGNsYXNzU2NvcGVzKSkgeworICAg
ICAgICAgICAgZWxlbWVudC0+c2V0TmVlZHNTdHlsZVJlY2FsYygpOworICAgICAgICAgICAgLy8g
VGhlIHdob2xlIHN1YnRyZWUgaXMgbm93IGludmFsaWRhdGVkLCB3ZSBjYW4gc2tpcCB0byB0aGUg
bmV4dCBzaWJsaW5nLgorICAgICAgICAgICAgbm9kZSA9IG5vZGUtPnRyYXZlcnNlTmV4dFNpYmxp
bmcoKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIG5vZGUgPSBu
b2RlLT50cmF2ZXJzZU5leHROb2RlKCk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKIH0KIAot
dm9pZCBEb2N1bWVudDo6ZGlkQWRkVG91Y2hFdmVudEhhbmRsZXIoKQordm9pZCBEb2N1bWVudFN0
eWxlU2hlZXRDb2xsZWN0aW9uOjphbmFseXplU3R5bGVTaGVldENoYW5nZShVcGRhdGVGbGFnIHVw
ZGF0ZUZsYWcsIGNvbnN0IFZlY3RvcjxSZWZQdHI8U3R5bGVTaGVldD4gPiYgbmV3U3R5bGVzaGVl
dHMsIGJvb2wmIHJlcXVpcmVzU3R5bGVSZXNvbHZlclJlc2V0LCBib29sJiByZXF1aXJlc0Z1bGxT
dHlsZVJlY2FsYykKIHsKLSNpZiBFTkFCTEUoVE9VQ0hfRVZFTlRTKQotICAgICsrbV90b3VjaEV2
ZW50SGFuZGxlckNvdW50OwotICAgIGlmIChtX3RvdWNoRXZlbnRIYW5kbGVyQ291bnQgPiAxKQor
ICAgIHJlcXVpcmVzU3R5bGVSZXNvbHZlclJlc2V0ID0gdHJ1ZTsKKyAgICByZXF1aXJlc0Z1bGxT
dHlsZVJlY2FsYyA9IHRydWU7CisgICAgCisgICAgLy8gU3R5bGVzaGVldHMgb2YgPHN0eWxlPiBl
bGVtZW50cyB0aGF0IEBpbXBvcnQgc3R5bGVzaGVldHMgYXJlIGFjdGl2ZSBidXQgbG9hZGluZy4g
V2UgbmVlZCB0byB0cmlnZ2VyIGEgZnVsbCByZWNhbGMgd2hlbiBzdWNoIGxvYWRzIGFyZSBkb25l
LgorICAgIGJvb2wgaGFzQWN0aXZlTG9hZGluZ1N0eWxlc2hlZXQgPSBmYWxzZTsKKyAgICB1bnNp
Z25lZCBuZXdTdHlsZXNoZWV0Q291bnQgPSBuZXdTdHlsZXNoZWV0cy5zaXplKCk7CisgICAgZm9y
ICh1bnNpZ25lZCBpID0gMDsgaSA8IG5ld1N0eWxlc2hlZXRDb3VudDsgKytpKSB7CisgICAgICAg
IGlmIChuZXdTdHlsZXNoZWV0c1tpXS0+aXNMb2FkaW5nKCkpCisgICAgICAgICAgICBoYXNBY3Rp
dmVMb2FkaW5nU3R5bGVzaGVldCA9IHRydWU7CisgICAgfQorICAgIGlmIChtX2hhZEFjdGl2ZUxv
YWRpbmdTdHlsZXNoZWV0ICYmICFoYXNBY3RpdmVMb2FkaW5nU3R5bGVzaGVldCkgeworICAgICAg
ICBtX2hhZEFjdGl2ZUxvYWRpbmdTdHlsZXNoZWV0ID0gZmFsc2U7CiAgICAgICAgIHJldHVybjsK
LSAgICBpZiAoUGFnZSogcGFnZSA9IHRoaXMtPnBhZ2UoKSkKLSAgICAgICAgcGFnZS0+Y2hyb21l
KCktPmNsaWVudCgpLT5uZWVkVG91Y2hFdmVudHModHJ1ZSk7Ci0jZW5kaWYKLX0KKyAgICB9Cisg
ICAgbV9oYWRBY3RpdmVMb2FkaW5nU3R5bGVzaGVldCA9IGhhc0FjdGl2ZUxvYWRpbmdTdHlsZXNo
ZWV0OwogCi12b2lkIERvY3VtZW50OjpkaWRSZW1vdmVUb3VjaEV2ZW50SGFuZGxlcigpCi17Ci0j
aWYgRU5BQkxFKFRPVUNIX0VWRU5UUykKLSAgICBBU1NFUlQobV90b3VjaEV2ZW50SGFuZGxlckNv
dW50KTsKLSAgICAtLW1fdG91Y2hFdmVudEhhbmRsZXJDb3VudDsKLSAgICBpZiAobV90b3VjaEV2
ZW50SGFuZGxlckNvdW50KQorICAgIGlmICh1cGRhdGVGbGFnICE9IE9wdGltaXplZFVwZGF0ZSkK
KyAgICAgICAgcmV0dXJuOworICAgIGlmICghbV9kb2N1bWVudC0+c3R5bGVSZXNvbHZlcklmRXhp
c3RzKCkpCiAgICAgICAgIHJldHVybjsKIAotICAgIFBhZ2UqIHBhZ2UgPSB0aGlzLT5wYWdlKCk7
Ci0gICAgaWYgKCFwYWdlKQorICAgIC8vIFNlZSBpZiB3ZSBhcmUganVzdCBhZGRpbmcgc3R5bGVz
aGVldHMuCisgICAgdW5zaWduZWQgb2xkU3R5bGVzaGVldENvdW50ID0gbV9hdXRob3JTdHlsZVNo
ZWV0cy0+bGVuZ3RoKCk7CisgICAgaWYgKG5ld1N0eWxlc2hlZXRDb3VudCA8IG9sZFN0eWxlc2hl
ZXRDb3VudCkKICAgICAgICAgcmV0dXJuOwotICAgIGZvciAoY29uc3QgRnJhbWUqIGZyYW1lID0g
cGFnZS0+bWFpbkZyYW1lKCk7IGZyYW1lOyBmcmFtZSA9IGZyYW1lLT50cmVlKCktPnRyYXZlcnNl
TmV4dCgpKSB7Ci0gICAgICAgIGlmIChmcmFtZS0+ZG9jdW1lbnQoKSAmJiBmcmFtZS0+ZG9jdW1l
bnQoKS0+dG91Y2hFdmVudEhhbmRsZXJDb3VudCgpKQorICAgIGZvciAodW5zaWduZWQgaSA9IDA7
IGkgPCBvbGRTdHlsZXNoZWV0Q291bnQ7ICsraSkgeworICAgICAgICBpZiAobV9hdXRob3JTdHls
ZVNoZWV0cy0+aXRlbShpKSAhPSBuZXdTdHlsZXNoZWV0c1tpXSkKICAgICAgICAgICAgIHJldHVy
bjsKICAgICB9Ci0gICAgcGFnZS0+Y2hyb21lKCktPmNsaWVudCgpLT5uZWVkVG91Y2hFdmVudHMo
ZmFsc2UpOwotI2VuZGlmCi19Ci0KLUhUTUxJRnJhbWVFbGVtZW50KiBEb2N1bWVudDo6c2VhbWxl
c3NQYXJlbnRJRnJhbWUoKSBjb25zdAotewotICAgIGlmICghc2hvdWxkRGlzcGxheVNlYW1sZXNz
bHlXaXRoUGFyZW50KCkpCi0gICAgICAgIHJldHVybiAwOworICAgIHJlcXVpcmVzU3R5bGVSZXNv
bHZlclJlc2V0ID0gZmFsc2U7CiAKLSAgICBIVE1MRnJhbWVPd25lckVsZW1lbnQqIG93bmVyRWxl
bWVudCA9IHRoaXMtPm93bmVyRWxlbWVudCgpOwotICAgIEFTU0VSVChvd25lckVsZW1lbnQtPmhh
c1RhZ05hbWUoaWZyYW1lVGFnKSk7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PEhUTUxJRnJhbWVF
bGVtZW50Kj4ob3duZXJFbGVtZW50KTsKKyAgICAvLyBJZiB3ZSBhcmUgYWxyZWFkeSBwYXJzaW5n
IHRoZSBib2R5IGFuZCBzbyBtYXkgaGF2ZSBzaWduaWZpY2FudCBhbW91bnQgb2YgZWxlbWVudHMs
IHB1dCBzb21lIGVmZm9ydCBpbnRvIHRyeWluZyB0byBhdm9pZCBzdHlsZSByZWNhbGNzLgorICAg
IGlmICghbV9kb2N1bWVudC0+Ym9keSgpIHx8IG1fZG9jdW1lbnQtPmhhc05vZGVzV2l0aFBsYWNl
aG9sZGVyU3R5bGUoKSkKKyAgICAgICAgcmV0dXJuOworICAgIGZvciAodW5zaWduZWQgaSA9IG9s
ZFN0eWxlc2hlZXRDb3VudDsgaSA8IG5ld1N0eWxlc2hlZXRDb3VudDsgKytpKSB7CisgICAgICAg
IGlmICghbmV3U3R5bGVzaGVldHNbaV0tPmlzQ1NTU3R5bGVTaGVldCgpKQorICAgICAgICAgICAg
cmV0dXJuOworICAgICAgICBpZiAobmV3U3R5bGVzaGVldHNbaV0tPmRpc2FibGVkKCkpCisgICAg
ICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKHRlc3RBZGRlZFN0eWxlU2hlZXRSZXF1aXJl
c1N0eWxlUmVjYWxjKHN0YXRpY19jYXN0PENTU1N0eWxlU2hlZXQqPihuZXdTdHlsZXNoZWV0c1tp
XS5nZXQoKSktPmNvbnRlbnRzKCkpKQorICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBy
ZXF1aXJlc0Z1bGxTdHlsZVJlY2FsYyA9IGZhbHNlOwogfQogCi1ib29sIERvY3VtZW50OjpzaG91
bGREaXNwbGF5U2VhbWxlc3NseVdpdGhQYXJlbnQoKSBjb25zdAorc3RhdGljIGJvb2wgc3R5bGVT
aGVldHNVc2VSZW1Vbml0cyhjb25zdCBWZWN0b3I8UmVmUHRyPFN0eWxlU2hlZXQ+ID4mIHNoZWV0
cykKIHsKLSNpZiBFTkFCTEUoSUZSQU1FX1NFQU1MRVNTKQotICAgIEhUTUxGcmFtZU93bmVyRWxl
bWVudCogb3duZXJFbGVtZW50ID0gdGhpcy0+b3duZXJFbGVtZW50KCk7Ci0gICAgaWYgKCFvd25l
ckVsZW1lbnQpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gbV9tYXlEaXNwbGF5
U2VhbWxlc3NXaXRoUGFyZW50ICYmIG93bmVyRWxlbWVudC0+aGFzVGFnTmFtZShpZnJhbWVUYWcp
ICYmIG93bmVyRWxlbWVudC0+ZmFzdEhhc0F0dHJpYnV0ZShzZWFtbGVzc0F0dHIpOwotI2Vsc2UK
KyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2hlZXRzLnNpemUoKTsgKytpKSB7CisgICAg
ICAgIGlmICghc2hlZXRzW2ldLT5pc0NTU1N0eWxlU2hlZXQoKSkKKyAgICAgICAgICAgIGNvbnRp
bnVlOworICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8Q1NTU3R5bGVTaGVldCo+KHNoZWV0c1tpXS5n
ZXQoKSktPmNvbnRlbnRzKCktPnVzZXNSZW1Vbml0cygpKQorICAgICAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgfQogICAgIHJldHVybiBmYWxzZTsKLSNlbmRpZgotfQotCi1Eb2N1bWVudExvYWRl
ciogRG9jdW1lbnQ6OmxvYWRlcigpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX2ZyYW1lKQotICAgICAg
ICByZXR1cm4gMDsKLSAgICAKLSAgICBEb2N1bWVudExvYWRlciogbG9hZGVyID0gbV9mcmFtZS0+
bG9hZGVyKCktPmRvY3VtZW50TG9hZGVyKCk7Ci0gICAgaWYgKCFsb2FkZXIpCi0gICAgICAgIHJl
dHVybiAwOwotICAgIAotICAgIGlmIChtX2ZyYW1lLT5kb2N1bWVudCgpICE9IHRoaXMpCi0gICAg
ICAgIHJldHVybiAwOwotICAgIAotICAgIHJldHVybiBsb2FkZXI7Ci19Ci0KLSNpZiBFTkFCTEUo
TUlDUk9EQVRBKQotUGFzc1JlZlB0cjxOb2RlTGlzdD4gRG9jdW1lbnQ6OmdldEl0ZW1zKGNvbnN0
IFN0cmluZyYgdHlwZU5hbWVzKQotewotICAgIC8vIFNpbmNlIGRvY3VtZXQuZ2V0SXRlbSgpIGlz
IGFsbG93ZWQgZm9yIG1pY3JvZGF0YSwgdHlwZU5hbWVzIHdpbGwgYmUgbnVsbCBzdHJpbmcuCi0g
ICAgLy8gSW4gdGhpcyBjYXNlIHdlIG5lZWQgdG8gY3JlYXRlIGFuIGVtcHR5IHN0cmluZyBpZGVu
dGlmaWVyIHRvIG1hcCBzdWNoIHJlcXVlc3QgaW4gdGhlIGNhY2hlLgotICAgIFN0cmluZyBsb2Nh
bFR5cGVOYW1lcyA9IHR5cGVOYW1lcy5pc051bGwoKSA/IE1pY3JvRGF0YUl0ZW1MaXN0Ojp1bmRl
ZmluZWRJdGVtVHlwZSgpIDogdHlwZU5hbWVzOwotCi0gICAgcmV0dXJuIGVuc3VyZVJhcmVEYXRh
KCktPmVuc3VyZU5vZGVMaXN0cygpLT5hZGRDYWNoZVdpdGhOYW1lPE1pY3JvRGF0YUl0ZW1MaXN0
Pih0aGlzLCBEeW5hbWljTm9kZUxpc3Q6Ok1pY3JvRGF0YUl0ZW1MaXN0VHlwZSwgbG9jYWxUeXBl
TmFtZXMpOwogfQotI2VuZGlmCiAKLUludFNpemUgRG9jdW1lbnQ6OnZpZXdwb3J0U2l6ZSgpIGNv
bnN0Citib29sIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OnVwZGF0ZUFjdGl2ZVN0eWxl
U2hlZXRzKFVwZGF0ZUZsYWcgdXBkYXRlRmxhZykKIHsKLSAgICBpZiAoIXZpZXcoKSkKLSAgICAg
ICAgcmV0dXJuIEludFNpemUoKTsKLSAgICByZXR1cm4gdmlldygpLT52aXNpYmxlQ29udGVudFJl
Y3QoLyogaW5jbHVkZVNjcm9sbGJhcnMgKi8gdHJ1ZSkuc2l6ZSgpOwotfQorICAgIGlmIChtX2Rv
Y3VtZW50LT5pblN0eWxlUmVjYWxjKCkpIHsKKyAgICAgICAgLy8gU1ZHIDx1c2U+IGVsZW1lbnQg
bWF5IG1hbmFnZSB0byBpbnZhbGlkYXRlIHN0eWxlIHNlbGVjdG9yIGluIHRoZSBtaWRkbGUgb2Yg
YSBzdHlsZSByZWNhbGMuCisgICAgICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD01NDM0NAorICAgICAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgYmUgZml4ZWQg
aW4gU1ZHIGFuZCB0aGUgY2FsbCBzaXRlIHJlcGxhY2VkIGJ5IEFTU0VSVCghbV9pblN0eWxlUmVj
YWxjKS4KKyAgICAgICAgbV9uZWVkc1VwZGF0ZUFjdGl2ZVN0eWxlc2hlZXRzT25TdHlsZVJlY2Fs
YyA9IHRydWU7CisgICAgICAgIG1fZG9jdW1lbnQtPnNjaGVkdWxlRm9yY2VkU3R5bGVSZWNhbGMo
KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCi1Ob2RlKiBldmVudFRhcmdldE5vZGVGb3JEb2N1
bWVudChEb2N1bWVudCogZG9jKQotewotICAgIGlmICghZG9jKQotICAgICAgICByZXR1cm4gMDsK
LSAgICBOb2RlKiBub2RlID0gZG9jLT5mb2N1c2VkTm9kZSgpOwotICAgIGlmICghbm9kZSAmJiBk
b2MtPmlzUGx1Z2luRG9jdW1lbnQoKSkgewotICAgICAgICBQbHVnaW5Eb2N1bWVudCogcGx1Z2lu
RG9jdW1lbnQgPSBzdGF0aWNfY2FzdDxQbHVnaW5Eb2N1bWVudCo+KGRvYyk7Ci0gICAgICAgIG5v
ZGUgPSAgcGx1Z2luRG9jdW1lbnQtPnBsdWdpbk5vZGUoKTsKICAgICB9Ci0gICAgaWYgKCFub2Rl
ICYmIGRvYy0+aXNIVE1MRG9jdW1lbnQoKSkKLSAgICAgICAgbm9kZSA9IGRvYy0+Ym9keSgpOwot
ICAgIGlmICghbm9kZSkKLSAgICAgICAgbm9kZSA9IGRvYy0+ZG9jdW1lbnRFbGVtZW50KCk7Ci0g
ICAgcmV0dXJuIG5vZGU7Ci19CisgICAgaWYgKCFtX2RvY3VtZW50LT5yZW5kZXJlcigpIHx8ICFt
X2RvY3VtZW50LT5hdHRhY2hlZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CiAKLXZvaWQgRG9j
dW1lbnQ6OmFkanVzdEZsb2F0UXVhZHNGb3JTY3JvbGxBbmRBYnNvbHV0ZVpvb21BbmRGcmFtZVNj
YWxlKFZlY3RvcjxGbG9hdFF1YWQ+JiBxdWFkcywgUmVuZGVyT2JqZWN0KiByZW5kZXJlcikKLXsK
LSAgICBpZiAoIXZpZXcoKSkKLSAgICAgICAgcmV0dXJuOworICAgIFN0eWxlU2hlZXRWZWN0b3Ig
bmV3U3R5bGVzaGVldHM7CisgICAgY29sbGVjdEFjdGl2ZVN0eWxlU2hlZXRzKG5ld1N0eWxlc2hl
ZXRzKTsKKworICAgIGJvb2wgcmVxdWlyZXNTdHlsZVJlc29sdmVyUmVzZXQ7CisgICAgYm9vbCBy
ZXF1aXJlc0Z1bGxTdHlsZVJlY2FsYzsKKyAgICBhbmFseXplU3R5bGVTaGVldENoYW5nZSh1cGRh
dGVGbGFnLCBuZXdTdHlsZXNoZWV0cywgcmVxdWlyZXNTdHlsZVJlc29sdmVyUmVzZXQsIHJlcXVp
cmVzRnVsbFN0eWxlUmVjYWxjKTsKIAotICAgIGZsb2F0IGludmVyc2VGcmFtZVNjYWxlID0gMTsK
LSAgICBpZiAoZnJhbWUoKSkKLSAgICAgICAgaW52ZXJzZUZyYW1lU2NhbGUgPSAxIC8gZnJhbWUo
KS0+ZnJhbWVTY2FsZUZhY3RvcigpOwotCi0gICAgTGF5b3V0UmVjdCB2aXNpYmxlQ29udGVudFJl
Y3QgPSB2aWV3KCktPnZpc2libGVDb250ZW50UmVjdCgpOwotICAgIGZvciAoc2l6ZV90IGkgPSAw
OyBpIDwgcXVhZHMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgcXVhZHNbaV0ubW92ZSgtdmlzaWJs
ZUNvbnRlbnRSZWN0LngoKSwgLXZpc2libGVDb250ZW50UmVjdC55KCkpOwotICAgICAgICBhZGp1
c3RGbG9hdFF1YWRGb3JBYnNvbHV0ZVpvb20ocXVhZHNbaV0sIHJlbmRlcmVyKTsKLSAgICAgICAg
aWYgKGludmVyc2VGcmFtZVNjYWxlICE9IDEpCi0gICAgICAgICAgICBxdWFkc1tpXS5zY2FsZShp
bnZlcnNlRnJhbWVTY2FsZSwgaW52ZXJzZUZyYW1lU2NhbGUpOworICAgIGlmIChyZXF1aXJlc1N0
eWxlUmVzb2x2ZXJSZXNldCkKKyAgICAgICAgbV9kb2N1bWVudC0+Y2xlYXJTdHlsZVJlc29sdmVy
KCk7CisgICAgZWxzZSB7CisgICAgICAgIG1fZG9jdW1lbnQtPnN0eWxlUmVzb2x2ZXIoKS0+YXBw
ZW5kQXV0aG9yU3R5bGVzaGVldHMobV9hdXRob3JTdHlsZVNoZWV0cy0+bGVuZ3RoKCksIG5ld1N0
eWxlc2hlZXRzKTsKKyAgICAgICAgcmVzZXRDU1NGZWF0dXJlRmxhZ3MoKTsKICAgICB9Ci19Cisg
ICAgbV9hdXRob3JTdHlsZVNoZWV0cy0+c3dhcChuZXdTdHlsZXNoZWV0cyk7CiAKLXZvaWQgRG9j
dW1lbnQ6OmFkanVzdEZsb2F0UmVjdEZvclNjcm9sbEFuZEFic29sdXRlWm9vbUFuZEZyYW1lU2Nh
bGUoRmxvYXRSZWN0JiByZWN0LCBSZW5kZXJPYmplY3QqIHJlbmRlcmVyKQotewotICAgIGlmICgh
dmlldygpKQotICAgICAgICByZXR1cm47CisgICAgbV91c2VzUmVtVW5pdHMgPSBzdHlsZVNoZWV0
c1VzZVJlbVVuaXRzKG1fYXV0aG9yU3R5bGVTaGVldHMtPnZlY3RvcigpKTsKKyAgICBtX25lZWRz
VXBkYXRlQWN0aXZlU3R5bGVzaGVldHNPblN0eWxlUmVjYWxjID0gZmFsc2U7CiAKLSAgICBmbG9h
dCBpbnZlcnNlRnJhbWVTY2FsZSA9IDE7Ci0gICAgaWYgKGZyYW1lKCkpCi0gICAgICAgIGludmVy
c2VGcmFtZVNjYWxlID0gMSAvIGZyYW1lKCktPmZyYW1lU2NhbGVGYWN0b3IoKTsKLQotICAgIExh
eW91dFJlY3QgdmlzaWJsZUNvbnRlbnRSZWN0ID0gdmlldygpLT52aXNpYmxlQ29udGVudFJlY3Qo
KTsKLSAgICByZWN0Lm1vdmUoLXZpc2libGVDb250ZW50UmVjdC54KCksIC12aXNpYmxlQ29udGVu
dFJlY3QueSgpKTsKLSAgICBhZGp1c3RGbG9hdFJlY3RGb3JBYnNvbHV0ZVpvb20ocmVjdCwgcmVu
ZGVyZXIpOwotICAgIGlmIChpbnZlcnNlRnJhbWVTY2FsZSAhPSAxKQotICAgICAgICByZWN0LnNj
YWxlKGludmVyc2VGcmFtZVNjYWxlKTsKLX0KKyAgICBtX2RvY3VtZW50LT5ub3RpZnlTZWFtbGVz
c0NoaWxkRG9jdW1lbnRzT2ZTdHlsZXNoZWV0VXBkYXRlKCk7CiAKLXZvaWQgRG9jdW1lbnQ6OnNl
dENvbnRleHRGZWF0dXJlcyhQYXNzUmVmUHRyPENvbnRleHRGZWF0dXJlcz4gZmVhdHVyZXMpCi17
Ci0gICAgbV9jb250ZXh0RmVhdHVyZXMgPSBmZWF0dXJlczsKKyAgICByZXR1cm4gcmVxdWlyZXNG
dWxsU3R5bGVSZWNhbGM7CiB9CiAKLXN0YXRpYyBSZW5kZXJPYmplY3QqIG5lYXJlc3RDb21tb25I
b3ZlckFuY2VzdG9yKFJlbmRlck9iamVjdCogb2JqMSwgUmVuZGVyT2JqZWN0KiBvYmoyKQordm9p
ZCBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjpjb21iaW5lQ1NTRmVhdHVyZUZsYWdzKCkK
IHsKLSAgICBpZiAoIW9iajEgfHwgIW9iajIpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgZm9y
IChSZW5kZXJPYmplY3QqIGN1cnJPYmoxID0gb2JqMTsgY3Vyck9iajE7IGN1cnJPYmoxID0gY3Vy
ck9iajEtPmhvdmVyQW5jZXN0b3IoKSkgewotICAgICAgICBmb3IgKFJlbmRlck9iamVjdCogY3Vy
ck9iajIgPSBvYmoyOyBjdXJyT2JqMjsgY3Vyck9iajIgPSBjdXJyT2JqMi0+aG92ZXJBbmNlc3Rv
cigpKSB7Ci0gICAgICAgICAgICBpZiAoY3Vyck9iajEgPT0gY3Vyck9iajIpCi0gICAgICAgICAg
ICAgICAgcmV0dXJuIGN1cnJPYmoxOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7
CisgICAgLy8gRGVsYXkgcmVzZXR0aW5nIHRoZSBmbGFncyB1bnRpbCBhZnRlciBuZXh0IHN0eWxl
IHJlY2FsYyBzaW5jZSB1bmFwcGx5aW5nIHRoZSBzdHlsZSBtYXkgbm90IHdvcmsgd2l0aG91dCB0
aGVzZSBzZXQgKHRoaXMgaXMgdHJ1ZSBhdCBsZWFzdCB3aXRoIGJlZm9yZS9hZnRlcikuCisgICAg
U3R5bGVSZXNvbHZlciogc3R5bGVSZXNvbHZlciA9IG1fZG9jdW1lbnQtPnN0eWxlUmVzb2x2ZXIo
KTsKKyAgICBtX3VzZXNTaWJsaW5nUnVsZXMgPSBtX3VzZXNTaWJsaW5nUnVsZXMgfHwgc3R5bGVS
ZXNvbHZlci0+dXNlc1NpYmxpbmdSdWxlcygpOworICAgIG1fdXNlc0ZpcnN0TGluZVJ1bGVzID0g
bV91c2VzRmlyc3RMaW5lUnVsZXMgfHwgc3R5bGVSZXNvbHZlci0+dXNlc0ZpcnN0TGluZVJ1bGVz
KCk7CisgICAgbV91c2VzQmVmb3JlQWZ0ZXJSdWxlcyA9IG1fdXNlc0JlZm9yZUFmdGVyUnVsZXMg
fHwgc3R5bGVSZXNvbHZlci0+dXNlc0JlZm9yZUFmdGVyUnVsZXMoKTsKIH0KIAotdm9pZCBEb2N1
bWVudDo6dXBkYXRlSG92ZXJBY3RpdmVTdGF0ZShjb25zdCBIaXRUZXN0UmVxdWVzdCYgcmVxdWVz
dCwgSGl0VGVzdFJlc3VsdCYgcmVzdWx0KQordm9pZCBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0
aW9uOjpyZXNldENTU0ZlYXR1cmVGbGFncygpCiB7Ci0gICAgLy8gV2UgZG9uJ3QgdXBkYXRlIDpo
b3Zlci86YWN0aXZlIHN0YXRlIHdoZW4gdGhlIHJlc3VsdCBpcyBtYXJrZWQgYXMgcmVhZE9ubHku
Ci0gICAgaWYgKHJlcXVlc3QucmVhZE9ubHkoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgTm9k
ZSogaW5uZXJOb2RlSW5Eb2N1bWVudCA9IHJlc3VsdC5pbm5lck5vZGUoKTsKLSAgICBBU1NFUlQo
IWlubmVyTm9kZUluRG9jdW1lbnQgfHwgaW5uZXJOb2RlSW5Eb2N1bWVudC0+ZG9jdW1lbnQoKSA9
PSB0aGlzKTsKLQotICAgIE5vZGUqIG9sZEFjdGl2ZU5vZGUgPSBhY3RpdmVOb2RlKCk7Ci0gICAg
aWYgKG9sZEFjdGl2ZU5vZGUgJiYgIXJlcXVlc3QuYWN0aXZlKCkpIHsKLSAgICAgICAgLy8gV2Ug
YXJlIGNsZWFyaW5nIHRoZSA6YWN0aXZlIGNoYWluIGJlY2F1c2UgdGhlIG1vdXNlIGhhcyBiZWVu
IHJlbGVhc2VkLgotICAgICAgICBmb3IgKFJlbmRlck9iamVjdCogY3VyciA9IG9sZEFjdGl2ZU5v
ZGUtPnJlbmRlcmVyKCk7IGN1cnI7IGN1cnIgPSBjdXJyLT5wYXJlbnQoKSkgewotICAgICAgICAg
ICAgaWYgKGN1cnItPm5vZGUoKSAmJiAhY3Vyci0+aXNUZXh0KCkpIHsKLSAgICAgICAgICAgICAg
ICBjdXJyLT5ub2RlKCktPnNldEFjdGl2ZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgY3Vyci0+
bm9kZSgpLT5jbGVhckluQWN0aXZlQ2hhaW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQot
ICAgICAgICBzZXRBY3RpdmVOb2RlKDApOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIE5vZGUqIG5l
d0FjdGl2ZU5vZGUgPSBpbm5lck5vZGVJbkRvY3VtZW50OwotICAgICAgICBpZiAoIW9sZEFjdGl2
ZU5vZGUgJiYgbmV3QWN0aXZlTm9kZSAmJiByZXF1ZXN0LmFjdGl2ZSgpICYmICFyZXF1ZXN0LnRv
dWNoTW92ZSgpKSB7Ci0gICAgICAgICAgICAvLyBXZSBhcmUgc2V0dGluZyB0aGUgOmFjdGl2ZSBj
aGFpbiBhbmQgZnJlZXppbmcgaXQuIElmIGZ1dHVyZSBtb3ZlcyBoYXBwZW4sIHRoZXkKLSAgICAg
ICAgICAgIC8vIHdpbGwgbmVlZCB0byByZWZlcmVuY2UgdGhpcyBjaGFpbi4KLSAgICAgICAgICAg
IGZvciAoUmVuZGVyT2JqZWN0KiBjdXJyID0gbmV3QWN0aXZlTm9kZS0+cmVuZGVyZXIoKTsgY3Vy
cjsgY3VyciA9IGN1cnItPnBhcmVudCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGN1cnItPm5v
ZGUoKSAmJiAhY3Vyci0+aXNUZXh0KCkpCi0gICAgICAgICAgICAgICAgICAgIGN1cnItPm5vZGUo
KS0+c2V0SW5BY3RpdmVDaGFpbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0QWN0
aXZlTm9kZShuZXdBY3RpdmVOb2RlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvLyBJZiB0aGUg
bW91c2UgaGFzIGp1c3QgYmVlbiBwcmVzc2VkLCBzZXQgOmFjdGl2ZSBvbiB0aGUgY2hhaW4uIFRo
b3NlIChhbmQgb25seSB0aG9zZSkKLSAgICAvLyBub2RlcyBzaG91bGQgcmVtYWluIDphY3RpdmUg
dW50aWwgdGhlIG1vdXNlIGlzIHJlbGVhc2VkLgotICAgIGJvb2wgYWxsb3dBY3RpdmVDaGFuZ2Vz
ID0gIW9sZEFjdGl2ZU5vZGUgJiYgYWN0aXZlTm9kZSgpOwotCi0gICAgLy8gSWYgdGhlIG1vdXNl
IGlzIGRvd24gYW5kIGlmIHRoaXMgaXMgYSBtb3VzZSBtb3ZlIGV2ZW50LCB3ZSB3YW50IHRvIHJl
c3RyaWN0IGNoYW5nZXMgaW4KLSAgICAvLyA6aG92ZXIvOmFjdGl2ZSB0byBvbmx5IGFwcGx5IHRv
IGVsZW1lbnRzIHRoYXQgYXJlIGluIHRoZSA6YWN0aXZlIGNoYWluIHRoYXQgd2UgZnJvemUKLSAg
ICAvLyBhdCB0aGUgdGltZSB0aGUgbW91c2Ugd2VudCBkb3duLgotICAgIGJvb2wgbXVzdEJlSW5B
Y3RpdmVDaGFpbiA9IHJlcXVlc3QuYWN0aXZlKCkgJiYgcmVxdWVzdC5tb3ZlKCk7Ci0KLSAgICBS
ZWZQdHI8Tm9kZT4gb2xkSG92ZXJOb2RlID0gaG92ZXJOb2RlKCk7Ci0gICAgLy8gQ2xlYXIgdGhl
IDpob3ZlciBjaGFpbiB3aGVuIHRoZSB0b3VjaCBnZXN0dXJlIGlzIG92ZXIuCi0gICAgaWYgKHJl
cXVlc3QudG91Y2hSZWxlYXNlKCkpIHsKLSAgICAgICAgaWYgKG9sZEhvdmVyTm9kZSkgewotICAg
ICAgICAgICAgZm9yIChSZW5kZXJPYmplY3QqIGN1cnIgPSBvbGRIb3Zlck5vZGUtPnJlbmRlcmVy
KCk7IGN1cnI7IGN1cnIgPSBjdXJyLT5ob3ZlckFuY2VzdG9yKCkpIHsKLSAgICAgICAgICAgICAg
ICBpZiAoY3Vyci0+bm9kZSgpICYmICFjdXJyLT5pc1RleHQoKSkKLSAgICAgICAgICAgICAgICAg
ICAgY3Vyci0+bm9kZSgpLT5zZXRIb3ZlcmVkKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIHNldEhvdmVyTm9kZSgwKTsKLSAgICAgICAgfQotICAgICAgICAvLyBBIHRvdWNoIHJl
bGVhc2UgY2FuIG5vdCBzZXQgbmV3IGhvdmVyIG9yIGFjdGl2ZSB0YXJnZXQuCi0gICAgICAgIHJl
dHVybjsKLSAgICB9Ci0KLSAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIGhvdmVyZWQgbm9kZSBo
YXMgY2hhbmdlZC4KLSAgICAvLyBJZiBpdCBoYXNuJ3QsIHdlIGRvIG5vdCBuZWVkIHRvIGRvIGFu
eXRoaW5nLgotICAgIE5vZGUqIG5ld0hvdmVyTm9kZSA9IGlubmVyTm9kZUluRG9jdW1lbnQ7Ci0g
ICAgd2hpbGUgKG5ld0hvdmVyTm9kZSAmJiAhbmV3SG92ZXJOb2RlLT5yZW5kZXJlcigpKQotICAg
ICAgICBuZXdIb3Zlck5vZGUgPSBuZXdIb3Zlck5vZGUtPnBhcmVudE9ySG9zdE5vZGUoKTsKLQot
ICAgIC8vIFVwZGF0ZSBvdXIgY3VycmVudCBob3ZlciBub2RlLgotICAgIHNldEhvdmVyTm9kZShu
ZXdIb3Zlck5vZGUpOwotCi0gICAgLy8gV2UgaGF2ZSB0d28gZGlmZmVyZW50IG9iamVjdHMuIEZl
dGNoIHRoZWlyIHJlbmRlcmVycy4KLSAgICBSZW5kZXJPYmplY3QqIG9sZEhvdmVyT2JqID0gb2xk
SG92ZXJOb2RlID8gb2xkSG92ZXJOb2RlLT5yZW5kZXJlcigpIDogMDsKLSAgICBSZW5kZXJPYmpl
Y3QqIG5ld0hvdmVyT2JqID0gbmV3SG92ZXJOb2RlID8gbmV3SG92ZXJOb2RlLT5yZW5kZXJlcigp
IDogMDsKLQotICAgIC8vIExvY2F0ZSB0aGUgY29tbW9uIGFuY2VzdG9yIHJlbmRlciBvYmplY3Qg
Zm9yIHRoZSB0d28gcmVuZGVyZXJzLgotICAgIFJlbmRlck9iamVjdCogYW5jZXN0b3IgPSBuZWFy
ZXN0Q29tbW9uSG92ZXJBbmNlc3RvcihvbGRIb3Zlck9iaiwgbmV3SG92ZXJPYmopOwotCi0gICAg
VmVjdG9yPFJlZlB0cjxOb2RlPiwgMzI+IG5vZGVzVG9SZW1vdmVGcm9tQ2hhaW47Ci0gICAgVmVj
dG9yPFJlZlB0cjxOb2RlPiwgMzI+IG5vZGVzVG9BZGRUb0NoYWluOwotCi0gICAgaWYgKG9sZEhv
dmVyT2JqICE9IG5ld0hvdmVyT2JqKSB7Ci0gICAgICAgIC8vIFRoZSBvbGQgaG92ZXIgcGF0aCBv
bmx5IG5lZWRzIHRvIGJlIGNsZWFyZWQgdXAgdG8gKGFuZCBub3QgaW5jbHVkaW5nKSB0aGUgY29t
bW9uIGFuY2VzdG9yOwotICAgICAgICBmb3IgKFJlbmRlck9iamVjdCogY3VyciA9IG9sZEhvdmVy
T2JqOyBjdXJyICYmIGN1cnIgIT0gYW5jZXN0b3I7IGN1cnIgPSBjdXJyLT5ob3ZlckFuY2VzdG9y
KCkpIHsKLSAgICAgICAgICAgIGlmIChjdXJyLT5ub2RlKCkgJiYgIWN1cnItPmlzVGV4dCgpICYm
ICghbXVzdEJlSW5BY3RpdmVDaGFpbiB8fCBjdXJyLT5ub2RlKCktPmluQWN0aXZlQ2hhaW4oKSkp
Ci0gICAgICAgICAgICAgICAgbm9kZXNUb1JlbW92ZUZyb21DaGFpbi5hcHBlbmQoY3Vyci0+bm9k
ZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIE5vdyBzZXQgdGhlIGhvdmVyIHN0YXRl
IGZvciBvdXIgbmV3IG9iamVjdCB1cCB0byB0aGUgcm9vdC4KLSAgICBmb3IgKFJlbmRlck9iamVj
dCogY3VyciA9IG5ld0hvdmVyT2JqOyBjdXJyOyBjdXJyID0gY3Vyci0+aG92ZXJBbmNlc3Rvcigp
KSB7Ci0gICAgICAgIGlmIChjdXJyLT5ub2RlKCkgJiYgIWN1cnItPmlzVGV4dCgpICYmICghbXVz
dEJlSW5BY3RpdmVDaGFpbiB8fCBjdXJyLT5ub2RlKCktPmluQWN0aXZlQ2hhaW4oKSkpCi0gICAg
ICAgICAgICBub2Rlc1RvQWRkVG9DaGFpbi5hcHBlbmQoY3Vyci0+bm9kZSgpKTsKLSAgICB9Ci0K
LSAgICBzaXplX3QgcmVtb3ZlQ291bnQgPSBub2Rlc1RvUmVtb3ZlRnJvbUNoYWluLnNpemUoKTsK
LSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlbW92ZUNvdW50OyArK2kpCi0gICAgICAgIG5v
ZGVzVG9SZW1vdmVGcm9tQ2hhaW5baV0tPnNldEhvdmVyZWQoZmFsc2UpOwotCi0gICAgc2l6ZV90
IGFkZENvdW50ID0gbm9kZXNUb0FkZFRvQ2hhaW4uc2l6ZSgpOwotICAgIGZvciAoc2l6ZV90IGkg
PSAwOyBpIDwgYWRkQ291bnQ7ICsraSkgewotICAgICAgICBpZiAoYWxsb3dBY3RpdmVDaGFuZ2Vz
KQotICAgICAgICAgICAgbm9kZXNUb0FkZFRvQ2hhaW5baV0tPnNldEFjdGl2ZSh0cnVlKTsKLSAg
ICAgICAgbm9kZXNUb0FkZFRvQ2hhaW5baV0tPnNldEhvdmVyZWQodHJ1ZSk7Ci0gICAgfQorICAg
IFN0eWxlUmVzb2x2ZXIqIHN0eWxlUmVzb2x2ZXIgPSBtX2RvY3VtZW50LT5zdHlsZVJlc29sdmVy
KCk7CisgICAgbV91c2VzU2libGluZ1J1bGVzID0gc3R5bGVSZXNvbHZlci0+dXNlc1NpYmxpbmdS
dWxlcygpOworICAgIG1fdXNlc0ZpcnN0TGluZVJ1bGVzID0gc3R5bGVSZXNvbHZlci0+dXNlc0Zp
cnN0TGluZVJ1bGVzKCk7CisgICAgbV91c2VzQmVmb3JlQWZ0ZXJSdWxlcyA9IHN0eWxlUmVzb2x2
ZXItPnVzZXNCZWZvcmVBZnRlclJ1bGVzKCk7CiB9CiAKLXZvaWQgRG9jdW1lbnQ6OnJlcG9ydE1l
bW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qIG1lbW9yeU9iamVjdEluZm8pIGNvbnN0Cit2b2lk
IERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OnJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9i
amVjdEluZm8qIG1lbW9yeU9iamVjdEluZm8pIGNvbnN0CiB7CiAgICAgTWVtb3J5Q2xhc3NJbmZv
IGluZm8obWVtb3J5T2JqZWN0SW5mbywgdGhpcywgV2ViQ29yZU1lbW9yeVR5cGVzOjpET00pOwot
ICAgIGluZm8uYWRkTWVtYmVyKG1fc3R5bGVSZXNvbHZlcik7Ci0gICAgQ29udGFpbmVyTm9kZTo6
cmVwb3J0TWVtb3J5VXNhZ2UobWVtb3J5T2JqZWN0SW5mbyk7Ci0gICAgaW5mby5hZGRWZWN0b3Io
bV9jdXN0b21Gb250cyk7Ci0gICAgaW5mby5hZGRNZW1iZXIobV91cmwpOwotICAgIGluZm8uYWRk
TWVtYmVyKG1fYmFzZVVSTCk7Ci0gICAgaW5mby5hZGRNZW1iZXIobV9iYXNlVVJMT3ZlcnJpZGUp
OwotICAgIGluZm8uYWRkTWVtYmVyKG1fYmFzZUVsZW1lbnRVUkwpOwotICAgIGluZm8uYWRkTWVt
YmVyKG1fY29va2llVVJMKTsKLSAgICBpbmZvLmFkZE1lbWJlcihtX2ZpcnN0UGFydHlGb3JDb29r
aWVzKTsKLSAgICBpbmZvLmFkZE1lbWJlcihtX2RvY3VtZW50VVJJKTsKLSAgICBpbmZvLmFkZE1l
bWJlcihtX2Jhc2VUYXJnZXQpOwotICAgIGluZm8uYWRkTWVtYmVyKG1fZnJhbWUpOwotICAgIGlu
Zm8uYWRkTWVtYmVyKG1fY2FjaGVkUmVzb3VyY2VMb2FkZXIpOwotICAgIGluZm8uYWRkTWVtYmVy
KG1fZWxlbVNoZWV0KTsKICAgICBpbmZvLmFkZE1lbWJlcihtX3BhZ2VVc2VyU2hlZXQpOwogICAg
IGlmIChtX3BhZ2VHcm91cFVzZXJTaGVldHMpCiAgICAgICAgIGluZm8uYWRkSW5zdHJ1bWVudGVk
VmVjdG9yUHRyKG1fcGFnZUdyb3VwVXNlclNoZWV0cyk7CiAgICAgaWYgKG1fdXNlclNoZWV0cykK
ICAgICAgICAgaW5mby5hZGRJbnN0cnVtZW50ZWRWZWN0b3JQdHIobV91c2VyU2hlZXRzKTsKLSAg
ICBpbmZvLmFkZEhhc2hTZXQobV9ub2RlSXRlcmF0b3JzKTsKLSAgICBpbmZvLmFkZEhhc2hTZXQo
bV9yYW5nZXMpOwogICAgIGluZm8uYWRkTGlzdEhhc2hTZXQobV9zdHlsZVNoZWV0Q2FuZGlkYXRl
Tm9kZXMpOwotICAgIGluZm8uYWRkTWVtYmVyKG1fcHJlZmVycmVkU3R5bGVzaGVldFNldCk7Ci0g
ICAgaW5mby5hZGRNZW1iZXIobV9zZWxlY3RlZFN0eWxlc2hlZXRTZXQpOwotICAgIGluZm8uYWRk
TWVtYmVyKG1fdGl0bGUuc3RyaW5nKCkpOwotICAgIGluZm8uYWRkTWVtYmVyKG1fcmF3VGl0bGUu
c3RyaW5nKCkpOwotICAgIGluZm8uYWRkTWVtYmVyKG1feG1sRW5jb2RpbmcpOwotICAgIGluZm8u
YWRkTWVtYmVyKG1feG1sVmVyc2lvbik7Ci0gICAgaW5mby5hZGRNZW1iZXIobV9jb250ZW50TGFu
Z3VhZ2UpOwotICAgIGluZm8uYWRkSGFzaE1hcChtX2RvY3VtZW50TmFtZWRJdGVtQ29sbGVjdGlv
bnMpOwotICAgIGluZm8uYWRkSGFzaE1hcChtX3dpbmRvd05hbWVkSXRlbUNvbGxlY3Rpb25zKTsK
LSNpZiBFTkFCTEUoREFTSEJPQVJEX1NVUFBPUlQpCi0gICAgaW5mby5hZGRWZWN0b3IobV9kYXNo
Ym9hcmRSZWdpb25zKTsKLSNlbmRpZgotICAgIGluZm8uYWRkSGFzaE1hcChtX2Nzc0NhbnZhc0Vs
ZW1lbnRzKTsKLSAgICBpbmZvLmFkZFZlY3RvcihtX2ljb25VUkxzKTsKLSAgICBpbmZvLmFkZEhh
c2hTZXQobV9kb2N1bWVudFN1c3BlbnNpb25DYWxsYmFja0VsZW1lbnRzKTsKLSAgICBpbmZvLmFk
ZEhhc2hTZXQobV9tZWRpYVZvbHVtZUNhbGxiYWNrRWxlbWVudHMpOwotICAgIGluZm8uYWRkSGFz
aFNldChtX3ByaXZhdGVCcm93c2luZ1N0YXRlQ2hhbmdlZEVsZW1lbnRzKTsKLSAgICBpbmZvLmFk
ZEhhc2hNYXAobV9lbGVtZW50c0J5QWNjZXNzS2V5KTsKLSAgICBpbmZvLmFkZE1lbWJlcihtX2V2
ZW50UXVldWUpOwotICAgIGluZm8uYWRkSGFzaFNldChtX21lZGlhQ2FuU3RhcnRMaXN0ZW5lcnMp
OwotICAgIGluZm8uYWRkVmVjdG9yKG1fcGVuZGluZ1Rhc2tzKTsKLX0KLQotI2lmIEVOQUJMRShV
TkRPX01BTkFHRVIpCi1QYXNzUmVmUHRyPFVuZG9NYW5hZ2VyPiBEb2N1bWVudDo6dW5kb01hbmFn
ZXIoKQotewotICAgIGlmICghbV91bmRvTWFuYWdlcikKLSAgICAgICAgbV91bmRvTWFuYWdlciA9
IFVuZG9NYW5hZ2VyOjpjcmVhdGUodGhpcyk7Ci0gICAgcmV0dXJuIG1fdW5kb01hbmFnZXI7Ci19
Ci0jZW5kaWYKLQotY2xhc3MgSW1tdXRhYmxlQXR0cmlidXRlRGF0YUNhY2hlS2V5IHsKLSAgICBX
VEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKLXB1YmxpYzoKLSAgICBJbW11dGFibGVBdHRyaWJ1dGVE
YXRhQ2FjaGVLZXkoKQotICAgICAgICA6IG1fbG9jYWxOYW1lKDApCi0gICAgICAgICwgbV9hdHRy
aWJ1dGVzKDApCi0gICAgICAgICwgbV9hdHRyaWJ1dGVDb3VudCgwKQotICAgIHsgfQotCi0gICAg
SW1tdXRhYmxlQXR0cmlidXRlRGF0YUNhY2hlS2V5KGNvbnN0IEF0b21pY1N0cmluZyYgbG9jYWxO
YW1lLCBjb25zdCBBdHRyaWJ1dGUqIGF0dHJpYnV0ZXMsIHVuc2lnbmVkIGF0dHJpYnV0ZUNvdW50
KQotICAgICAgICA6IG1fbG9jYWxOYW1lKGxvY2FsTmFtZS5pbXBsKCkpCi0gICAgICAgICwgbV9h
dHRyaWJ1dGVzKGF0dHJpYnV0ZXMpCi0gICAgICAgICwgbV9hdHRyaWJ1dGVDb3VudChhdHRyaWJ1
dGVDb3VudCkKLSAgICB7IH0KLQotICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBJbW11dGFibGVB
dHRyaWJ1dGVEYXRhQ2FjaGVLZXkmIG90aGVyKSBjb25zdAotICAgIHsKLSAgICAgICAgaWYgKG1f
bG9jYWxOYW1lICE9IG90aGVyLm1fbG9jYWxOYW1lKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7
Ci0gICAgICAgIGlmIChtX2F0dHJpYnV0ZUNvdW50ICE9IG90aGVyLm1fYXR0cmlidXRlQ291bnQp
Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIG1lbWNtcChtX2F0dHJp
YnV0ZXMsIG90aGVyLm1fYXR0cmlidXRlcywgc2l6ZW9mKEF0dHJpYnV0ZSkgKiBtX2F0dHJpYnV0
ZUNvdW50KTsKLSAgICB9Ci0KLSAgICB1bnNpZ25lZCBoYXNoKCkgY29uc3QKLSAgICB7Ci0gICAg
ICAgIHVuc2lnbmVkIGF0dHJpYnV0ZUhhc2ggPSBTdHJpbmdIYXNoZXI6Omhhc2hNZW1vcnkobV9h
dHRyaWJ1dGVzLCBtX2F0dHJpYnV0ZUNvdW50ICogc2l6ZW9mKEF0dHJpYnV0ZSkpOwotICAgICAg
ICByZXR1cm4gV1RGOjpwYWlySW50SGFzaChtX2xvY2FsTmFtZS0+ZXhpc3RpbmdIYXNoKCksIGF0
dHJpYnV0ZUhhc2gpOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBBdG9taWNTdHJpbmdJbXBsKiBt
X2xvY2FsTmFtZTsKLSAgICBjb25zdCBBdHRyaWJ1dGUqIG1fYXR0cmlidXRlczsKLSAgICB1bnNp
Z25lZCBtX2F0dHJpYnV0ZUNvdW50OwotfTsKLQotc3RydWN0IEltbXV0YWJsZUF0dHJpYnV0ZURh
dGFDYWNoZUVudHJ5IHsKLSAgICBJbW11dGFibGVBdHRyaWJ1dGVEYXRhQ2FjaGVLZXkga2V5Owot
ICAgIFJlZlB0cjxFbGVtZW50QXR0cmlidXRlRGF0YT4gdmFsdWU7Ci19OwotCi1QYXNzUmVmUHRy
PEVsZW1lbnRBdHRyaWJ1dGVEYXRhPiBEb2N1bWVudDo6Y2FjaGVkSW1tdXRhYmxlQXR0cmlidXRl
RGF0YShjb25zdCBFbGVtZW50KiBlbGVtZW50LCBjb25zdCBWZWN0b3I8QXR0cmlidXRlPiYgYXR0
cmlidXRlcykKLXsKLSAgICBBU1NFUlQoIWF0dHJpYnV0ZXMuaXNFbXB0eSgpKTsKLQotICAgIElt
bXV0YWJsZUF0dHJpYnV0ZURhdGFDYWNoZUtleSBjYWNoZUtleShlbGVtZW50LT5sb2NhbE5hbWUo
KSwgYXR0cmlidXRlcy5kYXRhKCksIGF0dHJpYnV0ZXMuc2l6ZSgpKTsKLSAgICB1bnNpZ25lZCBj
YWNoZUhhc2ggPSBjYWNoZUtleS5oYXNoKCk7Ci0KLSAgICBJbW11dGFibGVBdHRyaWJ1dGVEYXRh
Q2FjaGU6Oml0ZXJhdG9yIGNhY2hlSXRlcmF0b3IgPSBtX2ltbXV0YWJsZUF0dHJpYnV0ZURhdGFD
YWNoZS5hZGQoY2FjaGVIYXNoLCBudWxscHRyKS5pdGVyYXRvcjsKLSAgICBpZiAoY2FjaGVJdGVy
YXRvci0+c2Vjb25kICYmIGNhY2hlSXRlcmF0b3ItPnNlY29uZC0+a2V5ICE9IGNhY2hlS2V5KQot
ICAgICAgICBjYWNoZUhhc2ggPSAwOwotCi0gICAgUmVmUHRyPEVsZW1lbnRBdHRyaWJ1dGVEYXRh
PiBhdHRyaWJ1dGVEYXRhOwotICAgIGlmIChjYWNoZUhhc2ggJiYgY2FjaGVJdGVyYXRvci0+c2Vj
b25kKQotICAgICAgICBhdHRyaWJ1dGVEYXRhID0gY2FjaGVJdGVyYXRvci0+c2Vjb25kLT52YWx1
ZTsKLSAgICBlbHNlCi0gICAgICAgIGF0dHJpYnV0ZURhdGEgPSBFbGVtZW50QXR0cmlidXRlRGF0
YTo6Y3JlYXRlSW1tdXRhYmxlKGF0dHJpYnV0ZXMpOwotCi0gICAgaWYgKCFjYWNoZUhhc2ggfHwg
Y2FjaGVJdGVyYXRvci0+c2Vjb25kKQotICAgICAgICByZXR1cm4gYXR0cmlidXRlRGF0YS5yZWxl
YXNlKCk7Ci0KLSAgICBPd25QdHI8SW1tdXRhYmxlQXR0cmlidXRlRGF0YUNhY2hlRW50cnk+IG5l
d0VudHJ5ID0gYWRvcHRQdHIobmV3IEltbXV0YWJsZUF0dHJpYnV0ZURhdGFDYWNoZUVudHJ5KTsK
LSAgICBuZXdFbnRyeS0+a2V5ID0gSW1tdXRhYmxlQXR0cmlidXRlRGF0YUNhY2hlS2V5KGVsZW1l
bnQtPmxvY2FsTmFtZSgpLCBjb25zdF9jYXN0PGNvbnN0IEVsZW1lbnRBdHRyaWJ1dGVEYXRhKj4o
YXR0cmlidXRlRGF0YS5nZXQoKSktPmF0dHJpYnV0ZUl0ZW0oMCksIGF0dHJpYnV0ZURhdGEtPmxl
bmd0aCgpKTsKLSAgICBuZXdFbnRyeS0+dmFsdWUgPSBhdHRyaWJ1dGVEYXRhOwotCi0gICAgY2Fj
aGVJdGVyYXRvci0+c2Vjb25kID0gbmV3RW50cnkucmVsZWFzZSgpOwotCi0gICAgcmV0dXJuIGF0
dHJpYnV0ZURhdGEucmVsZWFzZSgpOworICAgIGluZm8uYWRkTWVtYmVyKG1fcHJlZmVycmVkU3R5
bGVzaGVldFNldE5hbWUpOworICAgIGluZm8uYWRkTWVtYmVyKG1fc2VsZWN0ZWRTdHlsZXNoZWV0
U2V0TmFtZSk7CiB9CiAKLUxvY2FsaXplciYgRG9jdW1lbnQ6OmdldExvY2FsaXplcihjb25zdCBB
dG9taWNTdHJpbmcmIGxvY2FsZSkKLXsKLSAgICBBdG9taWNTdHJpbmcgbG9jYWxlS2V5ID0gbG9j
YWxlOwotICAgIGlmIChsb2NhbGUuaXNFbXB0eSgpIHx8ICFSdW50aW1lRW5hYmxlZEZlYXR1cmVz
OjpsYW5nQXR0cmlidXRlQXdhcmVGb3JtQ29udHJvbFVJRW5hYmxlZCgpKQotICAgICAgICBsb2Nh
bGVLZXkgPSBkZWZhdWx0TGFuZ3VhZ2UoKTsKLSAgICBMb2NhbGVUb0xvY2FsaXplck1hcDo6QWRk
UmVzdWx0IHJlc3VsdCA9IG1fbG9jYWxpemVyQ2FjaGUuYWRkKGxvY2FsZUtleSwgbnVsbHB0cik7
Ci0gICAgaWYgKHJlc3VsdC5pc05ld0VudHJ5KQotICAgICAgICByZXN1bHQuaXRlcmF0b3ItPnNl
Y29uZCA9IExvY2FsaXplcjo6Y3JlYXRlKGxvY2FsZUtleSk7Ci0gICAgcmV0dXJuICoocmVzdWx0
Lml0ZXJhdG9yLT5zZWNvbmQpOwogfQotCi19IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9kb20vRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2RvbS9Eb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmgJ
KHJldmlzaW9uIDApCisrKyBTb3VyY2UvV2ViQ29yZS9kb20vRG9jdW1lbnRTdHlsZVNoZWV0Q29s
bGVjdGlvbi5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMTk5OSBMYXJzIEtub2xsIChrbm9sbEBrZGUub3JnKQorICogICAgICAgICAgIChDKSAx
OTk5IEFudHRpIEtvaXZpc3RvIChrb2l2aXN0b0BrZGUub3JnKQorICogICAgICAgICAgIChDKSAy
MDAxIERpcmsgTXVlbGxlciAobXVlbGxlckBrZGUub3JnKQorICogICAgICAgICAgIChDKSAyMDA2
IEFsZXhleSBQcm9za3VyeWFrb3YgKGFwQHdlYmtpdC5vcmcpCisgKiBDb3B5cmlnaHQgKEMpIDIw
MDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTIgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5IFRvcmNoIE1v
YmlsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIChodHRwOi8vd3d3LnRvcmNobW9iaWxlLmNv
bS8pCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBz
dWJzaWRpYXJ5KC1pZXMpCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91
IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1z
IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNo
ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIg
b2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisg
KgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2ls
bCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0
aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSBy
ZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UK
KyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJ
ZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1
MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAx
LCBVU0EuCisgKgorICovCisKKyNpZm5kZWYgRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbl9o
CisjZGVmaW5lIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb25faAorCisjaW5jbHVkZSA8d3Rm
L0Zhc3RBbGxvY0Jhc2UuaD4KKyNpbmNsdWRlIDx3dGYvTGlzdEhhc2hTZXQuaD4KKyNpbmNsdWRl
IDx3dGYvUmVmUHRyLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHd0Zi90
ZXh0L1dURlN0cmluZy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIENTU1N0eWxl
U2hlZXQ7CitjbGFzcyBEb2N1bWVudDsKK2NsYXNzIE5vZGU7CitjbGFzcyBTdHlsZVNoZWV0Owor
Y2xhc3MgU3R5bGVTaGVldENvbnRlbnRzOworY2xhc3MgU3R5bGVTaGVldExpc3Q7CisKK2NsYXNz
IERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24geworICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NB
VEVEOworcHVibGljOgorICAgIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24oRG9jdW1lbnQq
KTsKKyAgICB+RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbigpOworCisgICAgU3R5bGVTaGVl
dExpc3QqIGF1dGhvclN0eWxlU2hlZXRzKCkgeyByZXR1cm4gbV9hdXRob3JTdHlsZVNoZWV0cy5n
ZXQoKTsgfQorCisgICAgQ1NTU3R5bGVTaGVldCogcGFnZVVzZXJTaGVldCgpOworICAgIGNvbnN0
IFZlY3RvcjxSZWZQdHI8Q1NTU3R5bGVTaGVldD4gPiogcGFnZUdyb3VwVXNlclNoZWV0cygpIGNv
bnN0OworICAgIGNvbnN0IFZlY3RvcjxSZWZQdHI8Q1NTU3R5bGVTaGVldD4gPiogZG9jdW1lbnRV
c2VyU2hlZXRzKCkgY29uc3QgeyByZXR1cm4gbV91c2VyU2hlZXRzLmdldCgpOyB9CisKKyAgICB2
b2lkIGFkZFN0eWxlU2hlZXRDYW5kaWRhdGVOb2RlKE5vZGUqLCBib29sIGNyZWF0ZWRCeVBhcnNl
cik7CisgICAgdm9pZCByZW1vdmVTdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZShOb2RlKik7CisKKyAg
ICB2b2lkIGNsZWFyUGFnZVVzZXJTaGVldCgpOworICAgIHZvaWQgdXBkYXRlUGFnZVVzZXJTaGVl
dCgpOworICAgIHZvaWQgY2xlYXJQYWdlR3JvdXBVc2VyU2hlZXRzKCk7CisgICAgdm9pZCB1cGRh
dGVQYWdlR3JvdXBVc2VyU2hlZXRzKCk7CisKKyAgICB2b2lkIGFkZFVzZXJTaGVldChQYXNzUmVm
UHRyPFN0eWxlU2hlZXRDb250ZW50cz4gdXNlclNoZWV0KTsKKworICAgIGJvb2wgbmVlZHNVcGRh
dGVBY3RpdmVTdHlsZXNoZWV0c09uU3R5bGVSZWNhbGMoKSB7IHJldHVybiBtX25lZWRzVXBkYXRl
QWN0aXZlU3R5bGVzaGVldHNPblN0eWxlUmVjYWxjOyB9CisKKyAgICBlbnVtIFVwZGF0ZUZsYWcg
eyBGdWxsVXBkYXRlLCBPcHRpbWl6ZWRVcGRhdGUgfTsKKyAgICBib29sIHVwZGF0ZUFjdGl2ZVN0
eWxlU2hlZXRzKFVwZGF0ZUZsYWcpOworCisgICAgU3RyaW5nIHByZWZlcnJlZFN0eWxlc2hlZXRT
ZXROYW1lKCkgY29uc3QgeyByZXR1cm4gbV9wcmVmZXJyZWRTdHlsZXNoZWV0U2V0TmFtZTsgfQor
ICAgIFN0cmluZyBzZWxlY3RlZFN0eWxlc2hlZXRTZXROYW1lKCkgY29uc3QgeyByZXR1cm4gbV9z
ZWxlY3RlZFN0eWxlc2hlZXRTZXROYW1lOyB9CisgICAgdm9pZCBzZXRQcmVmZXJyZWRTdHlsZXNo
ZWV0U2V0TmFtZShjb25zdCBTdHJpbmcmIG5hbWUpIHsgbV9wcmVmZXJyZWRTdHlsZXNoZWV0U2V0
TmFtZSA9IG5hbWU7IH0KKyAgICB2b2lkIHNldFNlbGVjdGVkU3R5bGVzaGVldFNldE5hbWUoY29u
c3QgU3RyaW5nJiBuYW1lKSB7IG1fc2VsZWN0ZWRTdHlsZXNoZWV0U2V0TmFtZSA9IG5hbWU7IH0K
KworICAgIHZvaWQgYWRkUGVuZGluZ1NoZWV0KCkgeyBtX3BlbmRpbmdTdHlsZXNoZWV0cysrOyB9
CisgICAgZW51bSBSZW1vdmVQZW5kaW5nU2hlZXROb3RpZmljYXRpb25UeXBlIHsKKyAgICAgICAg
UmVtb3ZlUGVuZGluZ1NoZWV0Tm90aWZ5SW1tZWRpYXRlbHksCisgICAgICAgIFJlbW92ZVBlbmRp
bmdTaGVldE5vdGlmeUxhdGVyCisgICAgfTsKKyAgICB2b2lkIHJlbW92ZVBlbmRpbmdTaGVldChS
ZW1vdmVQZW5kaW5nU2hlZXROb3RpZmljYXRpb25UeXBlID0gUmVtb3ZlUGVuZGluZ1NoZWV0Tm90
aWZ5SW1tZWRpYXRlbHkpOworCisgICAgYm9vbCBoYXNQZW5kaW5nU2hlZXRzKCkgY29uc3QgeyBy
ZXR1cm4gbV9wZW5kaW5nU3R5bGVzaGVldHMgPiAwOyB9CisKKyAgICBib29sIHVzZXNTaWJsaW5n
UnVsZXMoKSBjb25zdCB7IHJldHVybiBtX3VzZXNTaWJsaW5nUnVsZXMgfHwgbV91c2VzU2libGlu
Z1J1bGVzT3ZlcnJpZGU7IH0KKyAgICB2b2lkIHNldFVzZXNTaWJsaW5nUnVsZXNPdmVycmlkZShi
b29sIGIpIHsgbV91c2VzU2libGluZ1J1bGVzT3ZlcnJpZGUgPSBiOyB9CisgICAgYm9vbCB1c2Vz
Rmlyc3RMaW5lUnVsZXMoKSBjb25zdCB7IHJldHVybiBtX3VzZXNGaXJzdExpbmVSdWxlczsgfQor
ICAgIGJvb2wgdXNlc0ZpcnN0TGV0dGVyUnVsZXMoKSBjb25zdCB7IHJldHVybiBtX3VzZXNGaXJz
dExldHRlclJ1bGVzOyB9CisgICAgdm9pZCBzZXRVc2VzRmlyc3RMZXR0ZXJSdWxlcyhib29sIGIp
IHsgbV91c2VzRmlyc3RMZXR0ZXJSdWxlcyA9IGI7IH0KKyAgICBib29sIHVzZXNCZWZvcmVBZnRl
clJ1bGVzKCkgY29uc3QgeyByZXR1cm4gbV91c2VzQmVmb3JlQWZ0ZXJSdWxlcyB8fCBtX3VzZXNC
ZWZvcmVBZnRlclJ1bGVzT3ZlcnJpZGU7IH0KKyAgICB2b2lkIHNldFVzZXNCZWZvcmVBZnRlclJ1
bGVzT3ZlcnJpZGUoYm9vbCBiKSB7IG1fdXNlc0JlZm9yZUFmdGVyUnVsZXNPdmVycmlkZSA9IGI7
IH0KKyAgICBib29sIHVzZXNSZW1Vbml0cygpIGNvbnN0IHsgcmV0dXJuIG1fdXNlc1JlbVVuaXRz
OyB9CisgICAgdm9pZCBzZXRVc2VzUmVtVW5pdChib29sIGIpIHsgbV91c2VzUmVtVW5pdHMgPSBi
OyB9CisKKyAgICB2b2lkIGNvbWJpbmVDU1NGZWF0dXJlRmxhZ3MoKTsKKyAgICB2b2lkIHJlc2V0
Q1NTRmVhdHVyZUZsYWdzKCk7CisKKyAgICB2b2lkIHJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9i
amVjdEluZm8qKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICB2b2lkIGNvbGxlY3RBY3RpdmVTdHls
ZVNoZWV0cyhWZWN0b3I8UmVmUHRyPFN0eWxlU2hlZXQ+ID4mKTsKKyAgICBib29sIHRlc3RBZGRl
ZFN0eWxlU2hlZXRSZXF1aXJlc1N0eWxlUmVjYWxjKFN0eWxlU2hlZXRDb250ZW50cyopOworICAg
IHZvaWQgYW5hbHl6ZVN0eWxlU2hlZXRDaGFuZ2UoVXBkYXRlRmxhZywgY29uc3QgVmVjdG9yPFJl
ZlB0cjxTdHlsZVNoZWV0PiA+JiBuZXdTdHlsZXNoZWV0cywgYm9vbCYgcmVxdWlyZXNTdHlsZVJl
c29sdmVyUmVzZXQsIGJvb2wmIHJlcXVpcmVzRnVsbFN0eWxlUmVjYWxjKTsKKworICAgIERvY3Vt
ZW50KiBtX2RvY3VtZW50OworCisgICAgUmVmUHRyPFN0eWxlU2hlZXRMaXN0PiBtX2F1dGhvclN0
eWxlU2hlZXRzOworCisgICAgLy8gVHJhY2sgdGhlIG51bWJlciBvZiBjdXJyZW50bHkgbG9hZGlu
ZyB0b3AtbGV2ZWwgc3R5bGVzaGVldHMgbmVlZGVkIGZvciByZW5kZXJpbmcuCisgICAgLy8gU2hl
ZXRzIGxvYWRlZCB1c2luZyB0aGUgQGltcG9ydCBkaXJlY3RpdmUgYXJlIG5vdCBpbmNsdWRlZCBp
biB0aGlzIGNvdW50LgorICAgIC8vIFdlIHVzZSB0aGlzIGNvdW50IG9mIHBlbmRpbmcgc2hlZXRz
IHRvIGRldGVjdCB3aGVuIHdlIGNhbiBiZWdpbiBhdHRhY2hpbmcKKyAgICAvLyBlbGVtZW50cyBh
bmQgd2hlbiBpdCBpcyBzYWZlIHRvIGV4ZWN1dGUgc2NyaXB0cy4KKyAgICBpbnQgbV9wZW5kaW5n
U3R5bGVzaGVldHM7CisKKyAgICBSZWZQdHI8Q1NTU3R5bGVTaGVldD4gbV9wYWdlVXNlclNoZWV0
OworICAgIG11dGFibGUgT3duUHRyPFZlY3RvcjxSZWZQdHI8Q1NTU3R5bGVTaGVldD4gPiA+IG1f
cGFnZUdyb3VwVXNlclNoZWV0czsKKyAgICBPd25QdHI8VmVjdG9yPFJlZlB0cjxDU1NTdHlsZVNo
ZWV0PiA+ID4gbV91c2VyU2hlZXRzOworICAgIG11dGFibGUgYm9vbCBtX3BhZ2VHcm91cFVzZXJT
aGVldENhY2hlVmFsaWQ7CisKKyAgICBib29sIG1faGFkQWN0aXZlTG9hZGluZ1N0eWxlc2hlZXQ7
CisgICAgYm9vbCBtX25lZWRzVXBkYXRlQWN0aXZlU3R5bGVzaGVldHNPblN0eWxlUmVjYWxjOwor
CisgICAgdHlwZWRlZiBMaXN0SGFzaFNldDxOb2RlKiwgMzI+IFN0eWxlU2hlZXRDYW5kaWRhdGVM
aXN0SGFzaFNldDsKKyAgICBTdHlsZVNoZWV0Q2FuZGlkYXRlTGlzdEhhc2hTZXQgbV9zdHlsZVNo
ZWV0Q2FuZGlkYXRlTm9kZXM7CisKKyAgICBTdHJpbmcgbV9wcmVmZXJyZWRTdHlsZXNoZWV0U2V0
TmFtZTsKKyAgICBTdHJpbmcgbV9zZWxlY3RlZFN0eWxlc2hlZXRTZXROYW1lOworCisgICAgYm9v
bCBtX3VzZXNTaWJsaW5nUnVsZXM7CisgICAgYm9vbCBtX3VzZXNTaWJsaW5nUnVsZXNPdmVycmlk
ZTsKKyAgICBib29sIG1fdXNlc0ZpcnN0TGluZVJ1bGVzOworICAgIGJvb2wgbV91c2VzRmlyc3RM
ZXR0ZXJSdWxlczsKKyAgICBib29sIG1fdXNlc0JlZm9yZUFmdGVyUnVsZXM7CisgICAgYm9vbCBt
X3VzZXNCZWZvcmVBZnRlclJ1bGVzT3ZlcnJpZGU7CisgICAgYm9vbCBtX3VzZXNSZW1Vbml0czsK
K307CisKK30KKworI2VuZGlmCisKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2RvbS9FbGVtZW50LmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9kb20vRWxlbWVudC5jcHAJKHJldmlzaW9u
IDEyOTM5NykKKysrIFNvdXJjZS9XZWJDb3JlL2RvbS9FbGVtZW50LmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMTE3Niw3ICsxMTc2LDcgQEAgdm9pZCBFbGVtZW50OjpyZWNhbGNTdHlsZShTdHlsZUNo
YW5nZSBjaAogCiAgICAgICAgIC8vIElmICJyZW0iIHVuaXRzIGFyZSB1c2VkIGFueXdoZXJlIGlu
IHRoZSBkb2N1bWVudCwgYW5kIGlmIHRoZSBkb2N1bWVudCBlbGVtZW50J3MgZm9udCBzaXplIGNo
YW5nZXMsIHRoZW4gZ28gYWhlYWQgYW5kIGZvcmNlIGZvbnQgdXBkYXRpbmcKICAgICAgICAgLy8g
YWxsIHRoZSB3YXkgZG93biB0aGUgdHJlZS4gVGhpcyBpcyBzaW1wbGVyIHRoYW4gaGF2aW5nIHRv
IG1haW50YWluIGEgY2FjaGUgb2Ygb2JqZWN0cyAoYW5kIHN1Y2ggZm9udCBzaXplIGNoYW5nZXMg
c2hvdWxkIGJlIHJhcmUgYW55d2F5KS4KLSAgICAgICAgaWYgKGRvY3VtZW50KCktPnVzZXNSZW1V
bml0cygpICYmIGRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpID09IHRoaXMgJiYgY2ggIT0g
Tm9DaGFuZ2UgJiYgY3VycmVudFN0eWxlICYmIG5ld1N0eWxlICYmIGN1cnJlbnRTdHlsZS0+Zm9u
dFNpemUoKSAhPSBuZXdTdHlsZS0+Zm9udFNpemUoKSkgeworICAgICAgICBpZiAoZG9jdW1lbnQo
KS0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+dXNlc1JlbVVuaXRzKCkgJiYgZG9jdW1lbnQoKS0+
ZG9jdW1lbnRFbGVtZW50KCkgPT0gdGhpcyAmJiBjaCAhPSBOb0NoYW5nZSAmJiBjdXJyZW50U3R5
bGUgJiYgbmV3U3R5bGUgJiYgY3VycmVudFN0eWxlLT5mb250U2l6ZSgpICE9IG5ld1N0eWxlLT5m
b250U2l6ZSgpKSB7CiAgICAgICAgICAgICAvLyBDYWNoZWQgUmVuZGVyU3R5bGVzIG1heSBkZXBl
bmQgb24gdGhlIHJlbSB1bml0cy4KICAgICAgICAgICAgIGRvY3VtZW50KCktPnN0eWxlUmVzb2x2
ZXIoKS0+aW52YWxpZGF0ZU1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUoKTsKICAgICAgICAgICAgIGNo
YW5nZSA9IEZvcmNlOwpJbmRleDogU291cmNlL1dlYkNvcmUvZG9tL1Byb2Nlc3NpbmdJbnN0cnVj
dGlvbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZG9tL1Byb2Nlc3NpbmdJbnN0
cnVjdGlvbi5jcHAJKHJldmlzaW9uIDEyOTM5NykKKysrIFNvdXJjZS9XZWJDb3JlL2RvbS9Qcm9j
ZXNzaW5nSW5zdHJ1Y3Rpb24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMyw5ICsyMywxMCBAQAog
CiAjaW5jbHVkZSAiQ1NTU3R5bGVTaGVldC5oIgogI2luY2x1ZGUgIkNhY2hlZENTU1N0eWxlU2hl
ZXQuaCIKKyNpbmNsdWRlICJDYWNoZWRSZXNvdXJjZUxvYWRlci5oIgogI2luY2x1ZGUgIkNhY2hl
ZFhTTFN0eWxlU2hlZXQuaCIKICNpbmNsdWRlICJEb2N1bWVudC5oIgotI2luY2x1ZGUgIkNhY2hl
ZFJlc291cmNlTG9hZGVyLmgiCisjaW5jbHVkZSAiRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlv
bi5oIgogI2luY2x1ZGUgIkV4Y2VwdGlvbkNvZGUuaCIKICNpbmNsdWRlICJGcmFtZS5oIgogI2lu
Y2x1ZGUgIkZyYW1lTG9hZGVyLmgiCkBAIC02NSw3ICs2Niw3IEBAIFByb2Nlc3NpbmdJbnN0cnVj
dGlvbjo6flByb2Nlc3NpbmdJbnN0cnUKICAgICAgICAgbV9jYWNoZWRTaGVldC0+cmVtb3ZlQ2xp
ZW50KHRoaXMpOwogCiAgICAgaWYgKGluRG9jdW1lbnQoKSkKLSAgICAgICAgZG9jdW1lbnQoKS0+
cmVtb3ZlU3R5bGVTaGVldENhbmRpZGF0ZU5vZGUodGhpcyk7CisgICAgICAgIGRvY3VtZW50KCkt
PnN0eWxlU2hlZXRDb2xsZWN0aW9uKCktPnJlbW92ZVN0eWxlU2hlZXRDYW5kaWRhdGVOb2RlKHRo
aXMpOwogfQogCiB2b2lkIFByb2Nlc3NpbmdJbnN0cnVjdGlvbjo6c2V0RGF0YShjb25zdCBTdHJp
bmcmIGRhdGEsIEV4Y2VwdGlvbkNvZGUmKQpAQCAtMTYwLDcgKzE2MSw3IEBAIHZvaWQgUHJvY2Vz
c2luZ0luc3RydWN0aW9uOjpjaGVja1N0eWxlU2gKICAgICAgICAgICAgICAgICByZXR1cm47CiAg
ICAgICAgICAgICAKICAgICAgICAgICAgIG1fbG9hZGluZyA9IHRydWU7Ci0gICAgICAgICAgICBk
b2N1bWVudCgpLT5hZGRQZW5kaW5nU2hlZXQoKTsKKyAgICAgICAgICAgIGRvY3VtZW50KCktPnN0
eWxlU2hlZXRDb2xsZWN0aW9uKCktPmFkZFBlbmRpbmdTaGVldCgpOwogICAgICAgICAgICAgCiAg
ICAgICAgICAgICBSZXNvdXJjZVJlcXVlc3QgcmVxdWVzdChkb2N1bWVudCgpLT5jb21wbGV0ZVVS
TChocmVmKSk7CiAjaWYgRU5BQkxFKFhTTFQpCkBAIC0xODAsNyArMTgxLDcgQEAgdm9pZCBQcm9j
ZXNzaW5nSW5zdHJ1Y3Rpb246OmNoZWNrU3R5bGVTaAogICAgICAgICAgICAgZWxzZSB7CiAgICAg
ICAgICAgICAgICAgLy8gVGhlIHJlcXVlc3QgbWF5IGhhdmUgYmVlbiBkZW5pZWQgaWYgKGZvciBl
eGFtcGxlKSB0aGUgc3R5bGVzaGVldCBpcyBsb2NhbCBhbmQgdGhlIGRvY3VtZW50IGlzIHJlbW90
ZS4KICAgICAgICAgICAgICAgICBtX2xvYWRpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBk
b2N1bWVudCgpLT5yZW1vdmVQZW5kaW5nU2hlZXQoKTsKKyAgICAgICAgICAgICAgICBkb2N1bWVu
dCgpLT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpLT5yZW1vdmVQZW5kaW5nU2hlZXQoKTsKICAgICAg
ICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTE5OCw3ICsxOTksNyBAQCBib29sIFByb2Nl
c3NpbmdJbnN0cnVjdGlvbjo6aXNMb2FkaW5nKCkgCiBib29sIFByb2Nlc3NpbmdJbnN0cnVjdGlv
bjo6c2hlZXRMb2FkZWQoKQogewogICAgIGlmICghaXNMb2FkaW5nKCkpIHsKLSAgICAgICAgZG9j
dW1lbnQoKS0+cmVtb3ZlUGVuZGluZ1NoZWV0KCk7CisgICAgICAgIGRvY3VtZW50KCktPnN0eWxl
U2hlZXRDb2xsZWN0aW9uKCktPnJlbW92ZVBlbmRpbmdTaGVldCgpOwogICAgICAgICByZXR1cm4g
dHJ1ZTsKICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMjkzLDcgKzI5NCw3IEBAIE5vZGU6
Okluc2VydGlvbk5vdGlmaWNhdGlvblJlcXVlc3QgUHJvY2UKICAgICBOb2RlOjppbnNlcnRlZElu
dG8oaW5zZXJ0aW9uUG9pbnQpOwogICAgIGlmICghaW5zZXJ0aW9uUG9pbnQtPmluRG9jdW1lbnQo
KSkKICAgICAgICAgcmV0dXJuIEluc2VydGlvbkRvbmU7Ci0gICAgZG9jdW1lbnQoKS0+YWRkU3R5
bGVTaGVldENhbmRpZGF0ZU5vZGUodGhpcywgbV9jcmVhdGVkQnlQYXJzZXIpOworICAgIGRvY3Vt
ZW50KCktPnN0eWxlU2hlZXRDb2xsZWN0aW9uKCktPmFkZFN0eWxlU2hlZXRDYW5kaWRhdGVOb2Rl
KHRoaXMsIG1fY3JlYXRlZEJ5UGFyc2VyKTsKICAgICBjaGVja1N0eWxlU2hlZXQoKTsKICAgICBy
ZXR1cm4gSW5zZXJ0aW9uRG9uZTsKIH0KQEAgLTMwNCw3ICszMDUsNyBAQCB2b2lkIFByb2Nlc3Np
bmdJbnN0cnVjdGlvbjo6cmVtb3ZlZEZyb20oCiAgICAgaWYgKCFpbnNlcnRpb25Qb2ludC0+aW5E
b2N1bWVudCgpKQogICAgICAgICByZXR1cm47CiAgICAgCi0gICAgZG9jdW1lbnQoKS0+cmVtb3Zl
U3R5bGVTaGVldENhbmRpZGF0ZU5vZGUodGhpcyk7CisgICAgZG9jdW1lbnQoKS0+c3R5bGVTaGVl
dENvbGxlY3Rpb24oKS0+cmVtb3ZlU3R5bGVTaGVldENhbmRpZGF0ZU5vZGUodGhpcyk7CiAKICAg
ICBpZiAobV9zaGVldCkgewogICAgICAgICBBU1NFUlQobV9zaGVldC0+b3duZXJOb2RlKCkgPT0g
dGhpcyk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9kb20vU3R5bGVFbGVtZW50LmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9kb20vU3R5bGVFbGVtZW50LmNwcAkocmV2aXNpb24gMTI5
Mzk3KQorKysgU291cmNlL1dlYkNvcmUvZG9tL1N0eWxlRWxlbWVudC5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlICJBdHRyaWJ1dGUuaCIKICNpbmNsdWRlICJD
b250ZW50U2VjdXJpdHlQb2xpY3kuaCIKICNpbmNsdWRlICJEb2N1bWVudC5oIgorI2luY2x1ZGUg
IkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uaCIKICNpbmNsdWRlICJFbGVtZW50LmgiCiAj
aW5jbHVkZSAiTWVkaWFMaXN0LmgiCiAjaW5jbHVkZSAiTWVkaWFRdWVyeUV2YWx1YXRvci5oIgpA
QCAtNjMsNyArNjQsNyBAQCB2b2lkIFN0eWxlRWxlbWVudDo6aW5zZXJ0ZWRJbnRvRG9jdW1lbnQo
CiB7CiAgICAgQVNTRVJUKGRvY3VtZW50KTsKICAgICBBU1NFUlQoZWxlbWVudCk7Ci0gICAgZG9j
dW1lbnQtPmFkZFN0eWxlU2hlZXRDYW5kaWRhdGVOb2RlKGVsZW1lbnQsIG1fY3JlYXRlZEJ5UGFy
c2VyKTsKKyAgICBkb2N1bWVudC0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+YWRkU3R5bGVTaGVl
dENhbmRpZGF0ZU5vZGUoZWxlbWVudCwgbV9jcmVhdGVkQnlQYXJzZXIpOwogICAgIGlmIChtX2Ny
ZWF0ZWRCeVBhcnNlcikKICAgICAgICAgcmV0dXJuOwogCkBAIC03NCw3ICs3NSw3IEBAIHZvaWQg
U3R5bGVFbGVtZW50OjpyZW1vdmVkRnJvbURvY3VtZW50KEQKIHsKICAgICBBU1NFUlQoZG9jdW1l
bnQpOwogICAgIEFTU0VSVChlbGVtZW50KTsKLSAgICBkb2N1bWVudC0+cmVtb3ZlU3R5bGVTaGVl
dENhbmRpZGF0ZU5vZGUoZWxlbWVudCk7CisgICAgZG9jdW1lbnQtPnN0eWxlU2hlZXRDb2xsZWN0
aW9uKCktPnJlbW92ZVN0eWxlU2hlZXRDYW5kaWRhdGVOb2RlKGVsZW1lbnQpOwogCiAgICAgaWYg
KG1fc2hlZXQpCiAgICAgICAgIGNsZWFyU2hlZXQoKTsKQEAgLTkwLDcgKzkxLDcgQEAgdm9pZCBT
dHlsZUVsZW1lbnQ6OmNsZWFyRG9jdW1lbnREYXRhKERvYwogICAgICAgICBtX3NoZWV0LT5jbGVh
ck93bmVyTm9kZSgpOwogCiAgICAgaWYgKGVsZW1lbnQtPmluRG9jdW1lbnQoKSkKLSAgICAgICAg
ZG9jdW1lbnQtPnJlbW92ZVN0eWxlU2hlZXRDYW5kaWRhdGVOb2RlKGVsZW1lbnQpOworICAgICAg
ICBkb2N1bWVudC0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+cmVtb3ZlU3R5bGVTaGVldENhbmRp
ZGF0ZU5vZGUoZWxlbWVudCk7CiB9CiAKIHZvaWQgU3R5bGVFbGVtZW50OjpjaGlsZHJlbkNoYW5n
ZWQoRWxlbWVudCogZWxlbWVudCkKQEAgLTE1Miw3ICsxNTMsNyBAQCB2b2lkIFN0eWxlRWxlbWVu
dDo6Y3JlYXRlU2hlZXQoRWxlbWVudCogCiAgICAgRG9jdW1lbnQqIGRvY3VtZW50ID0gZS0+ZG9j
dW1lbnQoKTsKICAgICBpZiAobV9zaGVldCkgewogICAgICAgICBpZiAobV9zaGVldC0+aXNMb2Fk
aW5nKCkpCi0gICAgICAgICAgICBkb2N1bWVudC0+cmVtb3ZlUGVuZGluZ1NoZWV0KCk7CisgICAg
ICAgICAgICBkb2N1bWVudC0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+cmVtb3ZlUGVuZGluZ1No
ZWV0KCk7CiAgICAgICAgIGNsZWFyU2hlZXQoKTsKICAgICB9CiAKQEAgLTE2OCw3ICsxNjksNyBA
QCB2b2lkIFN0eWxlRWxlbWVudDo6Y3JlYXRlU2hlZXQoRWxlbWVudCogCiAgICAgICAgIE1lZGlh
UXVlcnlFdmFsdWF0b3Igc2NyZWVuRXZhbCgic2NyZWVuIiwgdHJ1ZSk7CiAgICAgICAgIE1lZGlh
UXVlcnlFdmFsdWF0b3IgcHJpbnRFdmFsKCJwcmludCIsIHRydWUpOwogICAgICAgICBpZiAoc2Ny
ZWVuRXZhbC5ldmFsKG1lZGlhUXVlcmllcy5nZXQoKSkgfHwgcHJpbnRFdmFsLmV2YWwobWVkaWFR
dWVyaWVzLmdldCgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQtPmFkZFBlbmRpbmdTaGVldCgp
OworICAgICAgICAgICAgZG9jdW1lbnQtPnN0eWxlU2hlZXRDb2xsZWN0aW9uKCktPmFkZFBlbmRp
bmdTaGVldCgpOwogICAgICAgICAgICAgbV9sb2FkaW5nID0gdHJ1ZTsKIAogICAgICAgICAgICAg
bV9zaGVldCA9IENTU1N0eWxlU2hlZXQ6OmNyZWF0ZUlubGluZShlLCBLVVJMKCksIGRvY3VtZW50
LT5pbnB1dEVuY29kaW5nKCkpOwpAQCAtMTk3LDE0ICsxOTgsMTQgQEAgYm9vbCBTdHlsZUVsZW1l
bnQ6OnNoZWV0TG9hZGVkKERvY3VtZW50KgogICAgIGlmIChpc0xvYWRpbmcoKSkKICAgICAgICAg
cmV0dXJuIGZhbHNlOwogCi0gICAgZG9jdW1lbnQtPnJlbW92ZVBlbmRpbmdTaGVldCgpOworICAg
IGRvY3VtZW50LT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpLT5yZW1vdmVQZW5kaW5nU2hlZXQoKTsK
ICAgICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBTdHlsZUVsZW1lbnQ6OnN0YXJ0TG9hZGluZ0R5
bmFtaWNTaGVldChEb2N1bWVudCogZG9jdW1lbnQpCiB7CiAgICAgQVNTRVJUKGRvY3VtZW50KTsK
LSAgICBkb2N1bWVudC0+YWRkUGVuZGluZ1NoZWV0KCk7CisgICAgZG9jdW1lbnQtPnN0eWxlU2hl
ZXRDb2xsZWN0aW9uKCktPmFkZFBlbmRpbmdTaGVldCgpOwogfQogCiB9CkluZGV4OiBTb3VyY2Uv
V2ViQ29yZS9odG1sL0hUTUxMaW5rRWxlbWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dl
YkNvcmUvaHRtbC9IVE1MTGlua0VsZW1lbnQuY3BwCShyZXZpc2lvbiAxMjkzOTcpCisrKyBTb3Vy
Y2UvV2ViQ29yZS9odG1sL0hUTUxMaW5rRWxlbWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMw
LDYgKzMwLDcgQEAKICNpbmNsdWRlICJDYWNoZWRSZXNvdXJjZS5oIgogI2luY2x1ZGUgIkNhY2hl
ZFJlc291cmNlTG9hZGVyLmgiCiAjaW5jbHVkZSAiRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJEb2N1
bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmgiCiAjaW5jbHVkZSAiRXZlbnRTZW5kZXIuaCIKICNp
bmNsdWRlICJGcmFtZS5oIgogI2luY2x1ZGUgIkZyYW1lTG9hZGVyLmgiCkBAIC04Nyw3ICs4OCw3
IEBAIEhUTUxMaW5rRWxlbWVudDo6fkhUTUxMaW5rRWxlbWVudCgpCiAgICAgICAgIG1fY2FjaGVk
U2hlZXQtPnJlbW92ZUNsaWVudCh0aGlzKTsKIAogICAgIGlmIChpbkRvY3VtZW50KCkpCi0gICAg
ICAgIGRvY3VtZW50KCktPnJlbW92ZVN0eWxlU2hlZXRDYW5kaWRhdGVOb2RlKHRoaXMpOworICAg
ICAgICBkb2N1bWVudCgpLT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpLT5yZW1vdmVTdHlsZVNoZWV0
Q2FuZGlkYXRlTm9kZSh0aGlzKTsKIAogICAgIGxpbmtMb2FkRXZlbnRTZW5kZXIoKS5jYW5jZWxF
dmVudCh0aGlzKTsKIH0KQEAgLTI1NCw3ICsyNTUsNyBAQCBOb2RlOjpJbnNlcnRpb25Ob3RpZmlj
YXRpb25SZXF1ZXN0IEhUTUxMCiAgICAgaWYgKG1faXNJblNoYWRvd1RyZWUpCiAgICAgICAgIHJl
dHVybiBJbnNlcnRpb25Eb25lOwogCi0gICAgZG9jdW1lbnQoKS0+YWRkU3R5bGVTaGVldENhbmRp
ZGF0ZU5vZGUodGhpcywgbV9jcmVhdGVkQnlQYXJzZXIpOworICAgIGRvY3VtZW50KCktPnN0eWxl
U2hlZXRDb2xsZWN0aW9uKCktPmFkZFN0eWxlU2hlZXRDYW5kaWRhdGVOb2RlKHRoaXMsIG1fY3Jl
YXRlZEJ5UGFyc2VyKTsKIAogICAgIHByb2Nlc3MoKTsKICAgICByZXR1cm4gSW5zZXJ0aW9uRG9u
ZTsKQEAgLTI3Miw3ICsyNzMsNyBAQCB2b2lkIEhUTUxMaW5rRWxlbWVudDo6cmVtb3ZlZEZyb20o
Q29udGFpCiAgICAgICAgIEFTU0VSVCghbV9zaGVldCk7CiAgICAgICAgIHJldHVybjsKICAgICB9
Ci0gICAgZG9jdW1lbnQoKS0+cmVtb3ZlU3R5bGVTaGVldENhbmRpZGF0ZU5vZGUodGhpcyk7Cisg
ICAgZG9jdW1lbnQoKS0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+cmVtb3ZlU3R5bGVTaGVldENh
bmRpZGF0ZU5vZGUodGhpcyk7CiAKICAgICBpZiAobV9zaGVldCkKICAgICAgICAgY2xlYXJTaGVl
dCgpOwpAQCAtNDU1LDcgKzQ1Niw3IEBAIHZvaWQgSFRNTExpbmtFbGVtZW50OjphZGRQZW5kaW5n
U2hlZXQoUGUKIAogICAgIGlmIChtX3BlbmRpbmdTaGVldFR5cGUgPT0gTm9uQmxvY2tpbmcpCiAg
ICAgICAgIHJldHVybjsKLSAgICBkb2N1bWVudCgpLT5hZGRQZW5kaW5nU2hlZXQoKTsKKyAgICBk
b2N1bWVudCgpLT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpLT5hZGRQZW5kaW5nU2hlZXQoKTsKIH0K
IAogdm9pZCBIVE1MTGlua0VsZW1lbnQ6OnJlbW92ZVBlbmRpbmdTaGVldChSZW1vdmVQZW5kaW5n
U2hlZXROb3RpZmljYXRpb25UeXBlIG5vdGlmaWNhdGlvbikKQEAgLTQ3MSwxMCArNDcyLDEwIEBA
IHZvaWQgSFRNTExpbmtFbGVtZW50OjpyZW1vdmVQZW5kaW5nU2hlZXQKICAgICAgICAgcmV0dXJu
OwogICAgIH0KIAotICAgIGRvY3VtZW50KCktPnJlbW92ZVBlbmRpbmdTaGVldCgKKyAgICBkb2N1
bWVudCgpLT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpLT5yZW1vdmVQZW5kaW5nU2hlZXQoCiAgICAg
ICAgIG5vdGlmaWNhdGlvbiA9PSBSZW1vdmVQZW5kaW5nU2hlZXROb3RpZnlJbW1lZGlhdGVseQot
ICAgICAgICA/IERvY3VtZW50OjpSZW1vdmVQZW5kaW5nU2hlZXROb3RpZnlJbW1lZGlhdGVseQot
ICAgICAgICA6IERvY3VtZW50OjpSZW1vdmVQZW5kaW5nU2hlZXROb3RpZnlMYXRlcik7CisgICAg
ICAgID8gRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6UmVtb3ZlUGVuZGluZ1NoZWV0Tm90
aWZ5SW1tZWRpYXRlbHkKKyAgICAgICAgOiBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjpS
ZW1vdmVQZW5kaW5nU2hlZXROb3RpZnlMYXRlcik7CiB9CiAKIERPTVNldHRhYmxlVG9rZW5MaXN0
KiBIVE1MTGlua0VsZW1lbnQ6OnNpemVzKCkgY29uc3QKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2h0
bWwvSFRNTFF1b3RlRWxlbWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvaHRt
bC9IVE1MUXVvdGVFbGVtZW50LmNwcAkocmV2aXNpb24gMTI5Mzk3KQorKysgU291cmNlL1dlYkNv
cmUvaHRtbC9IVE1MUXVvdGVFbGVtZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjQsNiArMjQs
NyBAQAogI2luY2x1ZGUgIkhUTUxRdW90ZUVsZW1lbnQuaCIKIAogI2luY2x1ZGUgIkRvY3VtZW50
LmgiCisjaW5jbHVkZSAiRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5oIgogI2luY2x1ZGUg
IkhUTUxOYW1lcy5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CkBAIC00NCw3ICs0NSw3IEBAIFBh
c3NSZWZQdHI8SFRNTFF1b3RlRWxlbWVudD4gSFRNTFF1b3RlRWwKIE5vZGU6Okluc2VydGlvbk5v
dGlmaWNhdGlvblJlcXVlc3QgSFRNTFF1b3RlRWxlbWVudDo6aW5zZXJ0ZWRJbnRvKENvbnRhaW5l
ck5vZGUqIGluc2VydGlvblBvaW50KQogewogICAgIGlmIChoYXNUYWdOYW1lKHFUYWcpKQotICAg
ICAgICBkb2N1bWVudCgpLT5zZXRVc2VzQmVmb3JlQWZ0ZXJSdWxlcyh0cnVlKTsKKyAgICAgICAg
ZG9jdW1lbnQoKS0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+c2V0VXNlc0JlZm9yZUFmdGVyUnVs
ZXNPdmVycmlkZSh0cnVlKTsKIAogICAgIHJldHVybiBIVE1MRWxlbWVudDo6aW5zZXJ0ZWRJbnRv
KGluc2VydGlvblBvaW50KTsKIH0KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2h0bWwvSFRNTFZpZXdT
b3VyY2VEb2N1bWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvaHRtbC9IVE1M
Vmlld1NvdXJjZURvY3VtZW50LmNwcAkocmV2aXNpb24gMTI5Mzk3KQorKysgU291cmNlL1dlYkNv
cmUvaHRtbC9IVE1MVmlld1NvdXJjZURvY3VtZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjcs
NiArMjcsNyBAQAogCiAjaW5jbHVkZSAiQXR0cmlidXRlLmgiCiAjaW5jbHVkZSAiRE9NSW1wbGVt
ZW50YXRpb24uaCIKKyNpbmNsdWRlICJEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmgiCiAj
aW5jbHVkZSAiSFRNTEFuY2hvckVsZW1lbnQuaCIKICNpbmNsdWRlICJIVE1MQlJFbGVtZW50Lmgi
CiAjaW5jbHVkZSAiSFRNTEJhc2VFbGVtZW50LmgiCkBAIC01Miw3ICs1Myw3IEBAIEhUTUxWaWV3
U291cmNlRG9jdW1lbnQ6OkhUTUxWaWV3U291cmNlRG8KICAgICA6IEhUTUxEb2N1bWVudChmcmFt
ZSwgdXJsKQogICAgICwgbV90eXBlKG1pbWVUeXBlKQogewotICAgIHNldFVzZXNCZWZvcmVBZnRl
clJ1bGVzKHRydWUpOworICAgIHN0eWxlU2hlZXRDb2xsZWN0aW9uKCktPnNldFVzZXNCZWZvcmVB
ZnRlclJ1bGVzT3ZlcnJpZGUodHJ1ZSk7CiAgICAgc2V0SXNWaWV3U291cmNlKHRydWUpOwogCiAg
ICAgc2V0Q29tcGF0aWJpbGl0eU1vZGUoUXVpcmtzTW9kZSk7CkluZGV4OiBTb3VyY2UvV2ViQ29y
ZS9tYXRobWwvTWF0aE1MTWF0aEVsZW1lbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJD
b3JlL21hdGhtbC9NYXRoTUxNYXRoRWxlbWVudC5jcHAJKHJldmlzaW9uIDEyOTM5NykKKysrIFNv
dXJjZS9XZWJDb3JlL21hdGhtbC9NYXRoTUxNYXRoRWxlbWVudC5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTQ3LDcgKzQ3LDcgQEAgTm9kZTo6SW5zZXJ0aW9uTm90aWZpY2F0aW9uUmVxdWVzdCBNYXRo
TQogewogICAgIC8vIFRoZXJlIGFyZSBzaWJsaW5nIHJ1bGVzIGluIHRoZSBNYXRoTUwgZGVmYXVs
dCBzdHlsZS4KICAgICBpZiAoaW5zZXJ0aW9uUG9pbnQtPmluRG9jdW1lbnQoKSkKLSAgICAgICAg
ZG9jdW1lbnQoKS0+c2V0VXNlc1NpYmxpbmdSdWxlcyh0cnVlKTsKKyAgICAgICAgZG9jdW1lbnQo
KS0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+c2V0VXNlc1NpYmxpbmdSdWxlc092ZXJyaWRlKHRy
dWUpOwogICAgIHJldHVybiBNYXRoTUxJbmxpbmVDb250YWluZXJFbGVtZW50OjppbnNlcnRlZElu
dG8oaW5zZXJ0aW9uUG9pbnQpOwogfQogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wYWdlL1BhZ2Uu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BhZ2UvUGFnZS5jcHAJKHJldmlzaW9u
IDEyOTM5NykKKysrIFNvdXJjZS9XZWJDb3JlL3BhZ2UvUGFnZS5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlICJDb250ZXh0TWVudUNvbnRyb2xsZXIuaCIKICNp
bmNsdWRlICJET01XaW5kb3cuaCIKICNpbmNsdWRlICJEb2N1bWVudE1hcmtlckNvbnRyb2xsZXIu
aCIKKyNpbmNsdWRlICJEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmgiCiAjaW5jbHVkZSAi
RHJhZ0NvbnRyb2xsZXIuaCIKICNpbmNsdWRlICJFZGl0b3JDbGllbnQuaCIKICNpbmNsdWRlICJF
dmVudC5oIgpAQCAtODM4LDcgKzgzOSw3IEBAIHZvaWQgUGFnZTo6dXNlclN0eWxlU2hlZXRMb2Nh
dGlvbkNoYW5nZWQKIAogICAgIGZvciAoRnJhbWUqIGZyYW1lID0gbWFpbkZyYW1lKCk7IGZyYW1l
OyBmcmFtZSA9IGZyYW1lLT50cmVlKCktPnRyYXZlcnNlTmV4dCgpKSB7CiAgICAgICAgIGlmIChm
cmFtZS0+ZG9jdW1lbnQoKSkKLSAgICAgICAgICAgIGZyYW1lLT5kb2N1bWVudCgpLT51cGRhdGVQ
YWdlVXNlclNoZWV0KCk7CisgICAgICAgICAgICBmcmFtZS0+ZG9jdW1lbnQoKS0+c3R5bGVTaGVl
dENvbGxlY3Rpb24oKS0+dXBkYXRlUGFnZVVzZXJTaGVldCgpOwogICAgIH0KIH0KIApJbmRleDog
U291cmNlL1dlYkNvcmUvcGFnZS9QYWdlR3JvdXAuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL3BhZ2UvUGFnZUdyb3VwLmNwcAkocmV2aXNpb24gMTI5Mzk3KQorKysgU291cmNlL1dl
YkNvcmUvcGFnZS9QYWdlR3JvdXAuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yOSw2ICsyOSw3IEBA
CiAjaW5jbHVkZSAiQ2hyb21lLmgiCiAjaW5jbHVkZSAiQ2hyb21lQ2xpZW50LmgiCiAjaW5jbHVk
ZSAiRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmgi
CiAjaW5jbHVkZSAiRnJhbWUuaCIKICNpbmNsdWRlICJHcm91cFNldHRpbmdzLmgiCiAjaW5jbHVk
ZSAiUGFnZS5oIgpAQCAtMzkxLDcgKzM5Miw3IEBAIHZvaWQgUGFnZUdyb3VwOjpyZXNldFVzZXJT
dHlsZUNhY2hlSW5BbGwKICAgICBIYXNoU2V0PFBhZ2UqPjo6Y29uc3RfaXRlcmF0b3IgZW5kID0g
bV9wYWdlcy5lbmQoKTsKICAgICBmb3IgKEhhc2hTZXQ8UGFnZSo+Ojpjb25zdF9pdGVyYXRvciBp
dCA9IG1fcGFnZXMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CiAgICAgICAgIGZvciAoRnJh
bWUqIGZyYW1lID0gKCppdCktPm1haW5GcmFtZSgpOyBmcmFtZTsgZnJhbWUgPSBmcmFtZS0+dHJl
ZSgpLT50cmF2ZXJzZU5leHQoKSkKLSAgICAgICAgICAgIGZyYW1lLT5kb2N1bWVudCgpLT51cGRh
dGVQYWdlR3JvdXBVc2VyU2hlZXRzKCk7CisgICAgICAgICAgICBmcmFtZS0+ZG9jdW1lbnQoKS0+
c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+dXBkYXRlUGFnZUdyb3VwVXNlclNoZWV0cygpOwogICAg
IH0KIH0KIApJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJSLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQlIuY3BwCShyZXZpc2lv
biAxMjkzOTcpCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQlIuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC00MCw3ICs0MCw3IEBAIFJlbmRlckJSOjp+UmVuZGVyQlIoKQogCiBpbnQg
UmVuZGVyQlI6OmxpbmVIZWlnaHQoYm9vbCBmaXJzdExpbmUpIGNvbnN0CiB7Ci0gICAgaWYgKGZp
cnN0TGluZSAmJiBkb2N1bWVudCgpLT51c2VzRmlyc3RMaW5lUnVsZXMoKSkgeworICAgIGlmIChm
aXJzdExpbmUgJiYgZG9jdW1lbnQoKS0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+dXNlc0ZpcnN0
TGluZVJ1bGVzKCkpIHsKICAgICAgICAgUmVuZGVyU3R5bGUqIHMgPSBzdHlsZShmaXJzdExpbmUp
OwogICAgICAgICBpZiAocyAhPSBzdHlsZSgpKQogICAgICAgICAgICAgcmV0dXJuIHMtPmNvbXB1
dGVkTGluZUhlaWdodCh2aWV3KCkpOwpJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1Jl
bmRlckJsb2NrLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVu
ZGVyQmxvY2suY3BwCShyZXZpc2lvbiAxMjkzOTcpCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJp
bmcvUmVuZGVyQmxvY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNDcsNyArMzQ3LDcgQEAgdm9p
ZCBSZW5kZXJCbG9jazo6c3R5bGVEaWRDaGFuZ2UoU3R5bGVEaQogICAgIG1fbGluZUhlaWdodCA9
IC0xOwogCiAgICAgLy8gVXBkYXRlIHBzZXVkb3MgZm9yIDpiZWZvcmUgYW5kIDphZnRlciBub3cu
Ci0gICAgaWYgKCFpc0Fub255bW91cygpICYmIGRvY3VtZW50KCktPnVzZXNCZWZvcmVBZnRlclJ1
bGVzKCkgJiYgY2FuSGF2ZUdlbmVyYXRlZENoaWxkcmVuKCkpIHsKKyAgICBpZiAoIWlzQW5vbnlt
b3VzKCkgJiYgZG9jdW1lbnQoKS0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+dXNlc0JlZm9yZUFm
dGVyUnVsZXMoKSAmJiBjYW5IYXZlR2VuZXJhdGVkQ2hpbGRyZW4oKSkgewogICAgICAgICB1cGRh
dGVCZWZvcmVBZnRlckNvbnRlbnQoQkVGT1JFKTsKICAgICAgICAgdXBkYXRlQmVmb3JlQWZ0ZXJD
b250ZW50KEFGVEVSKTsKICAgICB9CkBAIC02MDIsNyArNjAyLDcgQEAgdm9pZCBSZW5kZXJCbG9j
azo6c3BsaXRCbG9ja3MoUmVuZGVyQmxvYwogICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBjdXJy
ID0gdG9SZW5kZXJCb3hNb2RlbE9iamVjdChwYXJlbnQoKSk7CiAgICAgUmVuZGVyQm94TW9kZWxP
YmplY3QqIGN1cnJDaGlsZCA9IHRoaXM7CiAgICAgUmVuZGVyT2JqZWN0KiBjdXJyQ2hpbGROZXh0
U2libGluZyA9IGN1cnJDaGlsZC0+bmV4dFNpYmxpbmcoKTsKLSAgICBib29sIGRvY3VtZW50VXNl
c0JlZm9yZUFmdGVyUnVsZXMgPSBkb2N1bWVudCgpLT51c2VzQmVmb3JlQWZ0ZXJSdWxlcygpOyAK
KyAgICBib29sIGRvY3VtZW50VXNlc0JlZm9yZUFmdGVyUnVsZXMgPSBkb2N1bWVudCgpLT5zdHls
ZVNoZWV0Q29sbGVjdGlvbigpLT51c2VzQmVmb3JlQWZ0ZXJSdWxlcygpOwogCiAgICAgLy8gTm90
ZTogfHRoaXN8IGNhbiBiZSBkZXN0cm95ZWQgaW5zaWRlIHRoaXMgbG9vcCBpZiBpdCBpcyBhbiBl
bXB0eSBhbm9ueW1vdXMKICAgICAvLyBibG9jayBhbmQgd2UgdHJ5IHRvIGNhbGwgdXBkYXRlQmVm
b3JlQWZ0ZXJDb250ZW50IGluc2lkZSB3aGljaCByZW1vdmVzIHRoZQpAQCAtODc3LDcgKzg3Nyw3
IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmFkZENoaWxkSWdub3JpbmdBbm9ueW0KICAgICAgICAgICAg
IC8vIGNvbnRlbnQgZ2V0cyBwcm9wZXJseSBkZXN0cm95ZWQuCiAgICAgICAgICAgICBib29sIGlz
Rmlyc3RDaGlsZCA9IChiZWZvcmVDaGlsZCA9PSBmaXJzdENoaWxkKCkpOwogICAgICAgICAgICAg
Ym9vbCBpc0xhc3RDaGlsZCA9IChiZWZvcmVDaGlsZCA9PSBsYXN0Q2hpbGQoKSk7Ci0gICAgICAg
ICAgICBpZiAoZG9jdW1lbnQoKS0+dXNlc0JlZm9yZUFmdGVyUnVsZXMoKSkKKyAgICAgICAgICAg
IGlmIChkb2N1bWVudCgpLT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpLT51c2VzQmVmb3JlQWZ0ZXJS
dWxlcygpKQogICAgICAgICAgICAgICAgIGNoaWxkcmVuKCktPnVwZGF0ZUJlZm9yZUFmdGVyQ29u
dGVudCh0aGlzLCBBRlRFUik7CiAgICAgICAgICAgICBpZiAoaXNMYXN0Q2hpbGQgJiYgYmVmb3Jl
Q2hpbGQgIT0gbGFzdENoaWxkKCkpIHsKICAgICAgICAgICAgICAgICAvLyBXZSBkZXN0cm95ZWQg
dGhlIGxhc3QgY2hpbGQsIHNvIG5vdyB3ZSBuZWVkIHRvIHVwZGF0ZSBvdXIgaW5zZXJ0aW9uCkBA
IC02MTUzLDcgKzYxNTMsNyBAQCBMYXlvdXRVbml0IFJlbmRlckJsb2NrOjpsaW5lSGVpZ2h0KGJv
b2wgCiAgICAgaWYgKGlzUmVwbGFjZWQoKSAmJiBsaW5lUG9zaXRpb25Nb2RlID09IFBvc2l0aW9u
T25Db250YWluaW5nTGluZSkKICAgICAgICAgcmV0dXJuIFJlbmRlckJveDo6bGluZUhlaWdodChm
aXJzdExpbmUsIGRpcmVjdGlvbiwgbGluZVBvc2l0aW9uTW9kZSk7CiAKLSAgICBpZiAoZmlyc3RM
aW5lICYmIGRvY3VtZW50KCktPnVzZXNGaXJzdExpbmVSdWxlcygpKSB7CisgICAgaWYgKGZpcnN0
TGluZSAmJiBkb2N1bWVudCgpLT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpLT51c2VzRmlyc3RMaW5l
UnVsZXMoKSkgewogICAgICAgICBSZW5kZXJTdHlsZSogcyA9IHN0eWxlKGZpcnN0TGluZSk7CiAg
ICAgICAgIGlmIChzICE9IHN0eWxlKCkpCiAgICAgICAgICAgICByZXR1cm4gcy0+Y29tcHV0ZWRM
aW5lSGVpZ2h0KHZpZXcoKSk7CkBAIC02NDYxLDcgKzY0NjEsNyBAQCB2b2lkIFJlbmRlckJsb2Nr
OjpjcmVhdGVGaXJzdExldHRlclJlbmRlCiAKIHZvaWQgUmVuZGVyQmxvY2s6OnVwZGF0ZUZpcnN0
TGV0dGVyKCkKIHsKLSAgICBpZiAoIWRvY3VtZW50KCktPnVzZXNGaXJzdExldHRlclJ1bGVzKCkp
CisgICAgaWYgKCFkb2N1bWVudCgpLT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpLT51c2VzRmlyc3RM
ZXR0ZXJSdWxlcygpKQogICAgICAgICByZXR1cm47CiAgICAgLy8gRG9uJ3QgcmVjdXIKICAgICBp
ZiAoc3R5bGUoKS0+c3R5bGVUeXBlKCkgPT0gRklSU1RfTEVUVEVSKQpJbmRleDogU291cmNlL1dl
YkNvcmUvcmVuZGVyaW5nL1JlbmRlcklubGluZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dl
YkNvcmUvcmVuZGVyaW5nL1JlbmRlcklubGluZS5jcHAJKHJldmlzaW9uIDEyOTM5NykKKysrIFNv
dXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJJbmxpbmUuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0xOTQsNyArMTk0LDcgQEAgdm9pZCBSZW5kZXJJbmxpbmU6OnN0eWxlRGlkQ2hhbmdlKFN0eWxl
RAogICAgIH0KIAogICAgIC8vIFVwZGF0ZSBwc2V1ZG9zIGZvciA6YmVmb3JlIGFuZCA6YWZ0ZXIg
bm93LgotICAgIGlmICghaXNBbm9ueW1vdXMoKSAmJiBkb2N1bWVudCgpLT51c2VzQmVmb3JlQWZ0
ZXJSdWxlcygpKSB7CisgICAgaWYgKCFpc0Fub255bW91cygpICYmIGRvY3VtZW50KCktPnN0eWxl
U2hlZXRDb2xsZWN0aW9uKCktPnVzZXNCZWZvcmVBZnRlclJ1bGVzKCkpIHsKICAgICAgICAgY2hp
bGRyZW4oKS0+dXBkYXRlQmVmb3JlQWZ0ZXJDb250ZW50KHRoaXMsIEJFRk9SRSk7CiAgICAgICAg
IGNoaWxkcmVuKCktPnVwZGF0ZUJlZm9yZUFmdGVyQ29udGVudCh0aGlzLCBBRlRFUik7CiAgICAg
fQpAQCAtMjE4LDcgKzIxOCw3IEBAIHZvaWQgUmVuZGVySW5saW5lOjp1cGRhdGVBbHdheXNDcmVh
dGVMaW4KICAgICAgICAgfHwgcGFyZW50U3R5bGUtPmxpbmVIZWlnaHQoKSAhPSBzdHlsZSgpLT5s
aW5lSGVpZ2h0KCkpKQogICAgICAgICB8fCAoaW5SZW5kZXJGbG93VGhyZWFkKCkgJiYgZW5jbG9z
aW5nUmVuZGVyRmxvd1RocmVhZCgpLT5oYXNSZWdpb25zV2l0aFN0eWxpbmcoKSk7CiAKLSAgICBp
ZiAoIWFsd2F5c0NyZWF0ZUxpbmVCb3hlcyAmJiBjaGVja0ZvbnRzICYmIGRvY3VtZW50KCktPnVz
ZXNGaXJzdExpbmVSdWxlcygpKSB7CisgICAgaWYgKCFhbHdheXNDcmVhdGVMaW5lQm94ZXMgJiYg
Y2hlY2tGb250cyAmJiBkb2N1bWVudCgpLT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpLT51c2VzRmly
c3RMaW5lUnVsZXMoKSkgewogICAgICAgICAvLyBIYXZlIHRvIGNoZWNrIHRoZSBmaXJzdCBsaW5l
IHN0eWxlIGFzIHdlbGwuCiAgICAgICAgIHBhcmVudFN0eWxlID0gcGFyZW50KCktPnN0eWxlKHRy
dWUpOwogICAgICAgICBSZW5kZXJTdHlsZSogY2hpbGRTdHlsZSA9IHN0eWxlKHRydWUpOwpAQCAt
MzI0LDcgKzMyNCw3IEBAIHZvaWQgUmVuZGVySW5saW5lOjphZGRDaGlsZElnbm9yaW5nQ29udGkK
ICAgICAgICAgLy8gaGFzIHRvIG1vdmUgaW50byB0aGUgaW5saW5lIGNvbnRpbnVhdGlvbi4gIENh
bGwgdXBkYXRlQmVmb3JlQWZ0ZXJDb250ZW50IHRvIGVuc3VyZSB0aGF0IG91ciA6YWZ0ZXIKICAg
ICAgICAgLy8gY29udGVudCBnZXRzIHByb3Blcmx5IGRlc3Ryb3llZC4KICAgICAgICAgYm9vbCBp
c0xhc3RDaGlsZCA9IChiZWZvcmVDaGlsZCA9PSBsYXN0Q2hpbGQoKSk7Ci0gICAgICAgIGlmIChk
b2N1bWVudCgpLT51c2VzQmVmb3JlQWZ0ZXJSdWxlcygpKQorICAgICAgICBpZiAoZG9jdW1lbnQo
KS0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+dXNlc0JlZm9yZUFmdGVyUnVsZXMoKSkKICAgICAg
ICAgICAgIGNoaWxkcmVuKCktPnVwZGF0ZUJlZm9yZUFmdGVyQ29udGVudCh0aGlzLCBBRlRFUik7
CiAgICAgICAgIGlmIChpc0xhc3RDaGlsZCAmJiBiZWZvcmVDaGlsZCAhPSBsYXN0Q2hpbGQoKSkK
ICAgICAgICAgICAgIGJlZm9yZUNoaWxkID0gMDsgLy8gV2UgZGVzdHJveWVkIHRoZSBsYXN0IGNo
aWxkLCBzbyBub3cgd2UgbmVlZCB0byB1cGRhdGUgb3VyIGluc2VydGlvbgpAQCAtMzk5LDcgKzM5
OSw3IEBAIHZvaWQgUmVuZGVySW5saW5lOjpzcGxpdElubGluZXMoUmVuZGVyQmwKICAgICAgICAg
ICAgIC8vIFNvbWVvbmUgbWF5IGhhdmUgaW5kaXJlY3RseSBjYXVzZWQgYSA8cT4gdG8gc3BsaXQu
ICBXaGVuIHRoaXMgaGFwcGVucywgdGhlIDphZnRlciBjb250ZW50CiAgICAgICAgICAgICAvLyBo
YXMgdG8gbW92ZSBpbnRvIHRoZSBpbmxpbmUgY29udGludWF0aW9uLiAgQ2FsbCB1cGRhdGVCZWZv
cmVBZnRlckNvbnRlbnQgdG8gZW5zdXJlIHRoYXQgdGhlIGlubGluZSdzIDphZnRlcgogICAgICAg
ICAgICAgLy8gY29udGVudCBnZXRzIHByb3Blcmx5IGRlc3Ryb3llZC4KLSAgICAgICAgICAgIGlm
IChkb2N1bWVudCgpLT51c2VzQmVmb3JlQWZ0ZXJSdWxlcygpKQorICAgICAgICAgICAgaWYgKGRv
Y3VtZW50KCktPnN0eWxlU2hlZXRDb2xsZWN0aW9uKCktPnVzZXNCZWZvcmVBZnRlclJ1bGVzKCkp
CiAgICAgICAgICAgICAgICAgaW5saW5lQ3Vyci0+Y2hpbGRyZW4oKS0+dXBkYXRlQmVmb3JlQWZ0
ZXJDb250ZW50KGlubGluZUN1cnIsIEFGVEVSKTsKIAogICAgICAgICAgICAgLy8gTm93IHdlIG5l
ZWQgdG8gdGFrZSBhbGwgb2YgdGhlIGNoaWxkcmVuIHN0YXJ0aW5nIGZyb20gdGhlIGZpcnN0IGNo
aWxkCkBAIC0xMjgzLDcgKzEyODMsNyBAQCBJbmxpbmVGbG93Qm94KiBSZW5kZXJJbmxpbmU6OmNy
ZWF0ZUFuZEFwCiAKIExheW91dFVuaXQgUmVuZGVySW5saW5lOjpsaW5lSGVpZ2h0KGJvb2wgZmly
c3RMaW5lLCBMaW5lRGlyZWN0aW9uTW9kZSAvKmRpcmVjdGlvbiovLCBMaW5lUG9zaXRpb25Nb2Rl
IC8qbGluZVBvc2l0aW9uTW9kZSovKSBjb25zdAogewotICAgIGlmIChmaXJzdExpbmUgJiYgZG9j
dW1lbnQoKS0+dXNlc0ZpcnN0TGluZVJ1bGVzKCkpIHsKKyAgICBpZiAoZmlyc3RMaW5lICYmIGRv
Y3VtZW50KCktPnN0eWxlU2hlZXRDb2xsZWN0aW9uKCktPnVzZXNGaXJzdExpbmVSdWxlcygpKSB7
CiAgICAgICAgIFJlbmRlclN0eWxlKiBzID0gc3R5bGUoZmlyc3RMaW5lKTsKICAgICAgICAgaWYg
KHMgIT0gc3R5bGUoKSkKICAgICAgICAgICAgIHJldHVybiBzLT5jb21wdXRlZExpbmVIZWlnaHQo
dmlldygpKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3QuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3QuY3Bw
CShyZXZpc2lvbiAxMjkzOTcpCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2Jq
ZWN0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjU5Nyw3ICsyNTk3LDcgQEAgdm9pZCBSZW5kZXJP
YmplY3Q6OmxheW91dCgpCiAKIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFJlbmRlck9iamVjdDo6
dW5jYWNoZWRGaXJzdExpbmVTdHlsZShSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0CiB7Ci0gICAg
aWYgKCFkb2N1bWVudCgpLT51c2VzRmlyc3RMaW5lUnVsZXMoKSkKKyAgICBpZiAoIWRvY3VtZW50
KCktPnN0eWxlU2hlZXRDb2xsZWN0aW9uKCktPnVzZXNGaXJzdExpbmVSdWxlcygpKQogICAgICAg
ICByZXR1cm4gMDsKIAogICAgIEFTU0VSVCghaXNUZXh0KCkpOwpAQCAtMjYxOCw3ICsyNjE4LDcg
QEAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gUmVuZGVyT2JqZWN0Ojp1bgogCiBSZW5kZXJTdHls
ZSogUmVuZGVyT2JqZWN0OjpmaXJzdExpbmVTdHlsZVNsb3dDYXNlKCkgY29uc3QKIHsKLSAgICBB
U1NFUlQoZG9jdW1lbnQoKS0+dXNlc0ZpcnN0TGluZVJ1bGVzKCkpOworICAgIEFTU0VSVChkb2N1
bWVudCgpLT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpLT51c2VzRmlyc3RMaW5lUnVsZXMoKSk7CiAK
ICAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSBtX3N0eWxlLmdldCgpOwogICAgIGNvbnN0IFJlbmRl
ck9iamVjdCogcmVuZGVyZXIgPSBpc1RleHQoKSA/IHBhcmVudCgpIDogdGhpczsKSW5kZXg6IFNv
dXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3QuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmgJKHJldmlzaW9uIDEyOTM5NykKKysr
IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3QuaAkod29ya2luZyBjb3B5KQpA
QCAtMjcsNiArMjcsNyBAQAogI2RlZmluZSBSZW5kZXJPYmplY3RfaAogCiAjaW5jbHVkZSAiQ2Fj
aGVkSW1hZ2VDbGllbnQuaCIKKyNpbmNsdWRlICJEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9u
LmgiCiAjaW5jbHVkZSAiRWxlbWVudC5oIgogI2luY2x1ZGUgIkZyYWN0aW9uYWxMYXlvdXRVbml0
LmgiCiAjaW5jbHVkZSAiRmxvYXRRdWFkLmgiCkBAIC03MzUsNyArNzM2LDcgQEAgcHVibGljOgog
ICAgIHZpcnR1YWwgTGF5b3V0VW5pdCBtYXhQcmVmZXJyZWRMb2dpY2FsV2lkdGgoKSBjb25zdCB7
IHJldHVybiAwOyB9CiAKICAgICBSZW5kZXJTdHlsZSogc3R5bGUoKSBjb25zdCB7IHJldHVybiBt
X3N0eWxlLmdldCgpOyB9Ci0gICAgUmVuZGVyU3R5bGUqIGZpcnN0TGluZVN0eWxlKCkgY29uc3Qg
eyByZXR1cm4gZG9jdW1lbnQoKS0+dXNlc0ZpcnN0TGluZVJ1bGVzKCkgPyBmaXJzdExpbmVTdHls
ZVNsb3dDYXNlKCkgOiBzdHlsZSgpOyB9CisgICAgUmVuZGVyU3R5bGUqIGZpcnN0TGluZVN0eWxl
KCkgY29uc3QgeyByZXR1cm4gZG9jdW1lbnQoKS0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+dXNl
c0ZpcnN0TGluZVJ1bGVzKCkgPyBmaXJzdExpbmVTdHlsZVNsb3dDYXNlKCkgOiBzdHlsZSgpOyB9
CiAgICAgUmVuZGVyU3R5bGUqIHN0eWxlKGJvb2wgZmlyc3RMaW5lKSBjb25zdCB7IHJldHVybiBm
aXJzdExpbmUgPyBmaXJzdExpbmVTdHlsZSgpIDogc3R5bGUoKTsgfQogCiAgICAgLy8gVXNlZCBv
bmx5IGJ5IEVsZW1lbnQ6OnBzZXVkb1N0eWxlQ2FjaGVJc0ludmFsaWQgdG8gZ2V0IGEgZmlyc3Qg
bGluZSBzdHlsZSBiYXNlZCBvZmYgb2YgYQpJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5n
L1JlbmRlck9iamVjdENoaWxkTGlzdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUv
cmVuZGVyaW5nL1JlbmRlck9iamVjdENoaWxkTGlzdC5jcHAJKHJldmlzaW9uIDEyOTM5NykKKysr
IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3RDaGlsZExpc3QuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0zNjksNyArMzY5LDcgQEAgc3RhdGljIFJlbmRlck9iamVjdCogZW5zdXJl
QmVmb3JlQWZ0ZXJDbwogdm9pZCBSZW5kZXJPYmplY3RDaGlsZExpc3Q6OnVwZGF0ZUJlZm9yZUFm
dGVyQ29udGVudChSZW5kZXJPYmplY3QqIG93bmVyLCBQc2V1ZG9JZCB0eXBlLCBjb25zdCBSZW5k
ZXJPYmplY3QqIHN0eWxlZE9iamVjdCkKIHsKICAgICAvLyBEb3VibGUgY2hlY2sgdGhhdCB0aGUg
ZG9jdW1lbnQgZGlkIGluIGZhY3QgdXNlIGdlbmVyYXRlZCBjb250ZW50IHJ1bGVzLiAgT3RoZXJ3
aXNlIHdlIHNob3VsZCBub3QgaGF2ZSBiZWVuIGNhbGxlZC4KLSAgICBBU1NFUlQob3duZXItPmRv
Y3VtZW50KCktPnVzZXNCZWZvcmVBZnRlclJ1bGVzKCkpOworICAgIEFTU0VSVChvd25lci0+ZG9j
dW1lbnQoKS0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+dXNlc0JlZm9yZUFmdGVyUnVsZXMoKSk7
CiAKICAgICAvLyBJbiBDU1MyLCBiZWZvcmUvYWZ0ZXIgcHNldWRvLWNvbnRlbnQgY2Fubm90IG5l
c3QuICBDaGVjayB0aGlzIGZpcnN0LgogICAgIGlmIChvd25lci0+c3R5bGUoKS0+c3R5bGVUeXBl
KCkgPT0gQkVGT1JFIHx8IG93bmVyLT5zdHlsZSgpLT5zdHlsZVR5cGUoKSA9PSBBRlRFUikKSW5k
ZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUYWJsZVJvdy5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRhYmxlUm93LmNwcAkocmV2aXNp
b24gMTI5Mzk3KQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRhYmxlUm93LmNw
cAkod29ya2luZyBjb3B5KQpAQCAtNTUsNyArNTUsNyBAQCB2b2lkIFJlbmRlclRhYmxlUm93Ojp3
aWxsQmVSZW1vdmVkRnJvbVRyCiAKIHZvaWQgUmVuZGVyVGFibGVSb3c6OnVwZGF0ZUJlZm9yZUFu
ZEFmdGVyQ29udGVudCgpCiB7Ci0gICAgaWYgKCFpc0Fub255bW91cygpICYmIGRvY3VtZW50KCkt
PnVzZXNCZWZvcmVBZnRlclJ1bGVzKCkpIHsKKyAgICBpZiAoIWlzQW5vbnltb3VzKCkgJiYgZG9j
dW1lbnQoKS0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+dXNlc0JlZm9yZUFmdGVyUnVsZXMoKSkg
ewogICAgICAgICBjaGlsZHJlbigpLT51cGRhdGVCZWZvcmVBZnRlckNvbnRlbnQodGhpcywgQkVG
T1JFKTsKICAgICAgICAgY2hpbGRyZW4oKS0+dXBkYXRlQmVmb3JlQWZ0ZXJDb250ZW50KHRoaXMs
IEFGVEVSKTsKICAgICB9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUm9vdElubGlu
ZUJveC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1Jvb3RJbmxp
bmVCb3guY3BwCShyZXZpc2lvbiAxMjkzOTcpCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcv
Um9vdElubGluZUJveC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTg0Niw3ICs4NDYsNyBAQCBMYXlv
dXRVbml0IFJvb3RJbmxpbmVCb3g6OnZlcnRpY2FsUG9zaXRpCiAKICAgICAvLyBUaGlzIG1ldGhv
ZCBkZXRlcm1pbmVzIHRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBmb3IgaW5saW5lIGVsZW1lbnRzLgog
ICAgIGJvb2wgZmlyc3RMaW5lID0gaXNGaXJzdExpbmVTdHlsZSgpOwotICAgIGlmIChmaXJzdExp
bmUgJiYgIXJlbmRlcmVyLT5kb2N1bWVudCgpLT51c2VzRmlyc3RMaW5lUnVsZXMoKSkKKyAgICBp
ZiAoZmlyc3RMaW5lICYmICFyZW5kZXJlci0+ZG9jdW1lbnQoKS0+c3R5bGVTaGVldENvbGxlY3Rp
b24oKS0+dXNlc0ZpcnN0TGluZVJ1bGVzKCkpCiAgICAgICAgIGZpcnN0TGluZSA9IGZhbHNlOwog
CiAgICAgLy8gQ2hlY2sgdGhlIGNhY2hlLgpJbmRleDogU291cmNlL1dlYktpdC9jaHJvbWl1bS9z
cmMvV2ViRG9jdW1lbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQvY2hyb21pdW0v
c3JjL1dlYkRvY3VtZW50LmNwcAkocmV2aXNpb24gMTI5Mzk3KQorKysgU291cmNlL1dlYktpdC9j
aHJvbWl1bS9zcmMvV2ViRG9jdW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNSw2ICszNSw3
IEBACiAjaW5jbHVkZSAiQ1NTUGFyc2VyTW9kZS5oIgogI2luY2x1ZGUgIkRvY3VtZW50LmgiCiAj
aW5jbHVkZSAiRG9jdW1lbnRMb2FkZXIuaCIKKyNpbmNsdWRlICJEb2N1bWVudFN0eWxlU2hlZXRD
b2xsZWN0aW9uLmgiCiAjaW5jbHVkZSAiRG9jdW1lbnRUeXBlLmgiCiAjaW5jbHVkZSAiRWxlbWVu
dC5oIgogI2luY2x1ZGUgIkhUTUxBbGxDb2xsZWN0aW9uLmgiCkBAIC0xOTYsNyArMTk3LDcgQEAg
dm9pZCBXZWJEb2N1bWVudDo6aW5zZXJ0VXNlclN0eWxlU2hlZXQoYwogICAgIFJlZlB0cjxTdHls
ZVNoZWV0Q29udGVudHM+IHBhcnNlZFNoZWV0ID0gU3R5bGVTaGVldENvbnRlbnRzOjpjcmVhdGUo
ZG9jdW1lbnQuZ2V0KCkpOwogICAgIHBhcnNlZFNoZWV0LT5zZXRJc1VzZXJTdHlsZVNoZWV0KGxl
dmVsID09IFVzZXJTdHlsZVVzZXJMZXZlbCk7CiAgICAgcGFyc2VkU2hlZXQtPnBhcnNlU3RyaW5n
KHNvdXJjZUNvZGUpOwotICAgIGRvY3VtZW50LT5hZGRVc2VyU2hlZXQocGFyc2VkU2hlZXQucmVs
ZWFzZSgpKTsKKyAgICBkb2N1bWVudC0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+YWRkVXNlclNo
ZWV0KHBhcnNlZFNoZWV0LnJlbGVhc2UoKSk7CiB9CiAKIHZvaWQgV2ViRG9jdW1lbnQ6OmNhbmNl
bEZ1bGxTY3JlZW4oKQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>165426</attachid>
            <date>2012-09-24 12:16:22 -0700</date>
            <delta_ts>2012-09-24 13:57:12 -0700</delta_ts>
            <desc>another try</desc>
            <filename>document-stylesheet-split-10.patch</filename>
            <type>text/plain</type>
            <size>541226</size>
            <attacher name="Antti Koivisto">koivisto</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEyOTM5NykKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE1MyBAQAorMjAxMi0wOS0yMSAgQW50dGkg
S29pdmlzdG8gIDxhbnR0aUBhcHBsZS5jb20+CisKKyAgICAgICAgU3BsaXQgc3R5bGVzaGVldCBy
ZWxhdGVkIGNvZGUgb3V0IGZyb20gRG9jdW1lbnQgCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD05NzM1MworCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgIERvY3VtZW50IGlzIGJpZyBhbmQgdW53aWVsZHkuIFRoZSBj
b2RlIHJlbGF0ZWQgdG8gdHJhY2tpbmcgYWN0aXZlIHN0eWxlc2hlZXRzIGNhbiBiZSBmYWN0b3Jl
ZCBvdXQuCisgICAgICAgIAorICAgICAgICBUaGUgcGF0Y2ggbW92ZXMgc3R5bGVzaGVldCB1cGtl
ZXAsIGNvbGxlY3Rpb24gYW5kIGludmFsaWRhdGlvbiBjb2RlIGZyb20gRG9jdW1lbnQgdG8gYSBz
ZXBhcmF0ZQorICAgICAgICBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uIGNsYXNzLiBUaGVy
ZSBhcmUgbm8gZnVuY3Rpb25hbCBjaGFuZ2VzLgorICAgICAgICAKKyAgICAgICAgVGhlIHVzZXNM
aW5rUnVsZXMgc3R5bGVzaGVldCBmZWF0dXJlIGJpdCBhbmQgdGhlIHJlbGF0ZWQgY29kZSBpcyBy
ZW1vdmVkIGFzIG5vIG9uZSB3YXMgdXNpbmcgaXQuCisKKyAgICAgICAgKiBXZWJDb3JlLnhjb2Rl
cHJvai9wcm9qZWN0LnBieHByb2o6CisgICAgICAgICogY3NzL1NlbGVjdG9yQ2hlY2tlci5jcHA6
CisgICAgICAgIChXZWJDb3JlOjpTZWxlY3RvckNoZWNrZXI6OmNoZWNrT25lU2VsZWN0b3IpOgor
ICAgICAgICAqIGNzcy9TdHlsZVJlc29sdmVyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxl
UmVzb2x2ZXI6OlN0eWxlUmVzb2x2ZXIpOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVSZXNvbHZl
cjo6RmVhdHVyZXM6OkZlYXR1cmVzKToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6
OkZlYXR1cmVzOjphZGQpOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVSZXNvbHZlcjo6RmVhdHVy
ZXM6OmNsZWFyKToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OmNvbGxlY3RNYXRj
aGluZ1J1bGVzRm9yTGlzdCk6CisgICAgICAgICogY3NzL1N0eWxlUmVzb2x2ZXIuaDoKKyAgICAg
ICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OnVzZXNCZWZvcmVBZnRlclJ1bGVzKToKKyAgICAg
ICAgKEZlYXR1cmVzKToKKyAgICAgICAgKiBkb20vRG9jdW1lbnQuY3BwOgorICAgICAgICAoV2Vi
Q29yZTo6RG9jdW1lbnQ6OkRvY3VtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50Ojp+
RG9jdW1lbnQpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnQ6OnNldENvbXBhdGliaWxpdHlN
b2RlKToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50OjpyZWNhbGNTdHlsZSk6CisgICAgICAg
IChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50OjpjcmVhdGVTdHlsZVJlc29s
dmVyKToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50OjpzZWFtbGVzc1BhcmVudFVwZGF0ZWRT
dHlsZXNoZWV0cyk6CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudDo6ZGlkUmVtb3ZlQWxsUGVu
ZGluZ1N0eWxlc2hlZXQpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnQ6OnByb2Nlc3NIdHRw
RXF1aXYpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnQ6OnN0eWxlU2hlZXRzKToKKyAgICAg
ICAgKFdlYkNvcmU6OkRvY3VtZW50OjpwcmVmZXJyZWRTdHlsZXNoZWV0U2V0KToKKyAgICAgICAg
KFdlYkNvcmU6OkRvY3VtZW50OjpzZWxlY3RlZFN0eWxlc2hlZXRTZXQpOgorICAgICAgICAoV2Vi
Q29yZTo6RG9jdW1lbnQ6OnNldFNlbGVjdGVkU3R5bGVzaGVldFNldCk6CisgICAgICAgIChXZWJD
b3JlOjpEb2N1bWVudDo6c3R5bGVSZXNvbHZlckNoYW5nZWQpOgorICAgICAgICAoV2ViQ29yZTo6
RG9jdW1lbnQ6OnJlcG9ydE1lbW9yeVVzYWdlKToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50
OjpoYXZlU3R5bGVzaGVldHNMb2FkZWQpOgorICAgICAgICAqIGRvbS9Eb2N1bWVudC5oOgorICAg
ICAgICAoV2ViQ29yZSk6CisgICAgICAgIChEb2N1bWVudCk6CisgICAgICAgIChXZWJDb3JlOjpE
b2N1bWVudDo6c3R5bGVTaGVldENvbGxlY3Rpb24pOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1l
bnQ6Omhhc05vZGVzV2l0aFBsYWNlaG9sZGVyU3R5bGUpOgorICAgICAgICAoV2ViQ29yZTo6RG9j
dW1lbnQ6OnNldE5lZWRzTm90aWZ5UmVtb3ZlQWxsUGVuZGluZ1N0eWxlc2hlZXQpOgorICAgICAg
ICAoV2ViQ29yZTo6RG9jdW1lbnQ6OmluU3R5bGVSZWNhbGMpOgorICAgICAgICAqIGRvbS9Eb2N1
bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlKToK
KyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OkRvY3VtZW50
U3R5bGVTaGVldENvbGxlY3Rpb24pOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNo
ZWV0Q29sbGVjdGlvbjo6fkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24pOgorICAgICAgICAo
V2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6cGFnZVVzZXJTaGVldCk6Cisg
ICAgICAgIChXZWJDb3JlOjpEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjpjbGVhclBhZ2VV
c2VyU2hlZXQpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlv
bjo6dXBkYXRlUGFnZVVzZXJTaGVldCk6CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudFN0eWxl
U2hlZXRDb2xsZWN0aW9uOjpwYWdlR3JvdXBVc2VyU2hlZXRzKToKKyAgICAgICAgKFdlYkNvcmU6
OkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OmNsZWFyUGFnZUdyb3VwVXNlclNoZWV0cyk6
CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjp1cGRhdGVQ
YWdlR3JvdXBVc2VyU2hlZXRzKToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50U3R5bGVTaGVl
dENvbGxlY3Rpb246OmFkZFVzZXJTaGVldCk6CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudFN0
eWxlU2hlZXRDb2xsZWN0aW9uOjpyZW1vdmVQZW5kaW5nU2hlZXQpOgorICAgICAgICAoV2ViQ29y
ZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6YWRkU3R5bGVTaGVldENhbmRpZGF0ZU5v
ZGUpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6cmVt
b3ZlU3R5bGVTaGVldENhbmRpZGF0ZU5vZGUpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRT
dHlsZVNoZWV0Q29sbGVjdGlvbjo6Y29sbGVjdEFjdGl2ZVN0eWxlU2hlZXRzKToKKyAgICAgICAg
KFdlYkNvcmU6OkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OnRlc3RBZGRlZFN0eWxlU2hl
ZXRSZXF1aXJlc1N0eWxlUmVjYWxjKToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50U3R5bGVT
aGVldENvbGxlY3Rpb246OmFuYWx5emVTdHlsZVNoZWV0Q2hhbmdlKToKKyAgICAgICAgKFdlYkNv
cmU6OnN0eWxlU2hlZXRzVXNlUmVtVW5pdHMpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRT
dHlsZVNoZWV0Q29sbGVjdGlvbjo6dXBkYXRlQWN0aXZlU3R5bGVTaGVldHMpOgorICAgICAgICAo
V2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6Y29tYmluZUNTU0ZlYXR1cmVG
bGFncyk6CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjpy
ZXNldENTU0ZlYXR1cmVGbGFncyk6CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudFN0eWxlU2hl
ZXRDb2xsZWN0aW9uOjpyZXBvcnRNZW1vcnlVc2FnZSk6CisgICAgICAgICogZG9tL0RvY3VtZW50
U3R5bGVTaGVldENvbGxlY3Rpb24uaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlKToKKyAgICAg
ICAgKERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24pOgorICAgICAgICAoV2ViQ29yZTo6RG9j
dW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6YXV0aG9yU3R5bGVTaGVldHMpOgorICAgICAgICAo
V2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6ZG9jdW1lbnRVc2VyU2hlZXRz
KToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246Om5lZWRz
VXBkYXRlQWN0aXZlU3R5bGVzaGVldHNPblN0eWxlUmVjYWxjKToKKyAgICAgICAgKFdlYkNvcmU6
OkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OnByZWZlcnJlZFN0eWxlc2hlZXRTZXROYW1l
KToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OnNlbGVj
dGVkU3R5bGVzaGVldFNldE5hbWUpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNo
ZWV0Q29sbGVjdGlvbjo6c2V0UHJlZmVycmVkU3R5bGVzaGVldFNldE5hbWUpOgorICAgICAgICAo
V2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6c2V0U2VsZWN0ZWRTdHlsZXNo
ZWV0U2V0TmFtZSk6CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0
aW9uOjphZGRQZW5kaW5nU2hlZXQpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNo
ZWV0Q29sbGVjdGlvbjo6aGFzUGVuZGluZ1NoZWV0cyk6CisgICAgICAgIChXZWJDb3JlOjpEb2N1
bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjp1c2VzU2libGluZ1J1bGVzKToKKyAgICAgICAgKFdl
YkNvcmU6OkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OnNldFVzZXNTaWJsaW5nUnVsZXNP
dmVycmlkZSk6CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9u
Ojp1c2VzRmlyc3RMaW5lUnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNo
ZWV0Q29sbGVjdGlvbjo6dXNlc0ZpcnN0TGV0dGVyUnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6
RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6c2V0VXNlc0ZpcnN0TGV0dGVyUnVsZXMpOgor
ICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6dXNlc0JlZm9y
ZUFmdGVyUnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVj
dGlvbjo6c2V0VXNlc0JlZm9yZUFmdGVyUnVsZXNPdmVycmlkZSk6CisgICAgICAgIChXZWJDb3Jl
OjpEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjp1c2VzUmVtVW5pdHMpOgorICAgICAgICAo
V2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6c2V0VXNlc1JlbVVuaXQpOgor
ICAgICAgICAqIGRvbS9FbGVtZW50LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnQ6OnJl
Y2FsY1N0eWxlKToKKyAgICAgICAgKiBkb20vUHJvY2Vzc2luZ0luc3RydWN0aW9uLmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OlByb2Nlc3NpbmdJbnN0cnVjdGlvbjo6flByb2Nlc3NpbmdJbnN0cnVj
dGlvbik6CisgICAgICAgIChXZWJDb3JlOjpQcm9jZXNzaW5nSW5zdHJ1Y3Rpb246OmNoZWNrU3R5
bGVTaGVldCk6CisgICAgICAgIChXZWJDb3JlOjpQcm9jZXNzaW5nSW5zdHJ1Y3Rpb246OnNoZWV0
TG9hZGVkKToKKyAgICAgICAgKFdlYkNvcmU6OlByb2Nlc3NpbmdJbnN0cnVjdGlvbjo6aW5zZXJ0
ZWRJbnRvKToKKyAgICAgICAgKFdlYkNvcmU6OlByb2Nlc3NpbmdJbnN0cnVjdGlvbjo6cmVtb3Zl
ZEZyb20pOgorICAgICAgICAqIGRvbS9TdHlsZUVsZW1lbnQuY3BwOgorICAgICAgICAoV2ViQ29y
ZTo6U3R5bGVFbGVtZW50OjppbnNlcnRlZEludG9Eb2N1bWVudCk6CisgICAgICAgIChXZWJDb3Jl
OjpTdHlsZUVsZW1lbnQ6OnJlbW92ZWRGcm9tRG9jdW1lbnQpOgorICAgICAgICAoV2ViQ29yZTo6
U3R5bGVFbGVtZW50OjpjbGVhckRvY3VtZW50RGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpTdHls
ZUVsZW1lbnQ6OmNyZWF0ZVNoZWV0KToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlRWxlbWVudDo6
c2hlZXRMb2FkZWQpOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVFbGVtZW50OjpzdGFydExvYWRp
bmdEeW5hbWljU2hlZXQpOgorICAgICAgICAqIGh0bWwvSFRNTExpbmtFbGVtZW50LmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OkhUTUxMaW5rRWxlbWVudDo6fkhUTUxMaW5rRWxlbWVudCk6CisgICAg
ICAgIChXZWJDb3JlOjpIVE1MTGlua0VsZW1lbnQ6Omluc2VydGVkSW50byk6CisgICAgICAgIChX
ZWJDb3JlOjpIVE1MTGlua0VsZW1lbnQ6OnJlbW92ZWRGcm9tKToKKyAgICAgICAgKFdlYkNvcmU6
OkhUTUxMaW5rRWxlbWVudDo6YWRkUGVuZGluZ1NoZWV0KToKKyAgICAgICAgKFdlYkNvcmU6OkhU
TUxMaW5rRWxlbWVudDo6cmVtb3ZlUGVuZGluZ1NoZWV0KToKKyAgICAgICAgKiBodG1sL0hUTUxR
dW90ZUVsZW1lbnQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6SFRNTFF1b3RlRWxlbWVudDo6aW5z
ZXJ0ZWRJbnRvKToKKyAgICAgICAgKiBodG1sL0hUTUxWaWV3U291cmNlRG9jdW1lbnQuY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6SFRNTFZpZXdTb3VyY2VEb2N1bWVudDo6SFRNTFZpZXdTb3VyY2VE
b2N1bWVudCk6CisgICAgICAgICogbWF0aG1sL01hdGhNTE1hdGhFbGVtZW50LmNwcDoKKyAgICAg
ICAgKFdlYkNvcmU6Ok1hdGhNTE1hdGhFbGVtZW50OjppbnNlcnRlZEludG8pOgorICAgICAgICAq
IHBhZ2UvUGFnZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpQYWdlOjp1c2VyU3R5bGVTaGVldExv
Y2F0aW9uQ2hhbmdlZCk6CisgICAgICAgICogcGFnZS9QYWdlR3JvdXAuY3BwOgorICAgICAgICAo
V2ViQ29yZTo6UGFnZUdyb3VwOjpyZXNldFVzZXJTdHlsZUNhY2hlSW5BbGxGcmFtZXMpOgorICAg
ICAgICAqIHJlbmRlcmluZy9SZW5kZXJCUi5jcHA6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJC
Ujo6bGluZUhlaWdodCk6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlckJsb2NrLmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrOjpzdHlsZURpZENoYW5nZSk6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJCbG9jazo6c3BsaXRCbG9ja3MpOgorICAgICAgICAoV2ViQ29yZTo6UmVu
ZGVyQmxvY2s6OmFkZENoaWxkSWdub3JpbmdBbm9ueW1vdXNDb2x1bW5CbG9ja3MpOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6OmxpbmVIZWlnaHQpOgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyQmxvY2s6OnVwZGF0ZUZpcnN0TGV0dGVyKToKKyAgICAgICAgKiByZW5kZXJpbmcvUmVu
ZGVySW5saW5lLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlcklubGluZTo6c3R5bGVEaWRD
aGFuZ2UpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVySW5saW5lOjp1cGRhdGVBbHdheXNDcmVh
dGVMaW5lQm94ZXMpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVySW5saW5lOjphZGRDaGlsZEln
bm9yaW5nQ29udGludWF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlcklubGluZTo6c3Bs
aXRJbmxpbmVzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlcklubGluZTo6bGluZUhlaWdodCk6
CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlck9iamVjdC5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJPYmplY3Q6OnVuY2FjaGVkRmlyc3RMaW5lU3R5bGUpOgorICAgICAgICAoV2ViQ29y
ZTo6UmVuZGVyT2JqZWN0OjpmaXJzdExpbmVTdHlsZVNsb3dDYXNlKToKKyAgICAgICAgKiByZW5k
ZXJpbmcvUmVuZGVyT2JqZWN0Lmg6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJPYmplY3Q6OmZp
cnN0TGluZVN0eWxlKToKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyT2JqZWN0Q2hpbGRMaXN0
LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck9iamVjdENoaWxkTGlzdDo6dXBkYXRlQmVm
b3JlQWZ0ZXJDb250ZW50KToKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyVGFibGVSb3cuY3Bw
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGFibGVSb3c6OnVwZGF0ZUJlZm9yZUFuZEFmdGVy
Q29udGVudCk6CisgICAgICAgICogcmVuZGVyaW5nL1Jvb3RJbmxpbmVCb3guY3BwOgorICAgICAg
ICAoV2ViQ29yZTo6Um9vdElubGluZUJveDo6dmVydGljYWxQb3NpdGlvbkZvckJveCk6CisKIDIw
MTItMDktMjQgIFRvbW15IFdpZGVuZmx5Y2h0ICA8dG9tbXl3QGdvb2dsZS5jb20+CiAKICAgICAg
ICAgTWVkaWFTdHJlYW0gQVBJOiBGaXggdGhlIGluY29ycmVjdGx5IHNwZWxsZWQgUlRDUGVlckNv
bm5lY3Rpb246Om9ubmVnb3RpYXRpb25uZWVkZWQgY2FsbGJhY2sKSW5kZXg6IFNvdXJjZS9XZWJD
b3JlL0NNYWtlTGlzdHMudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL0NNYWtlTGlz
dHMudHh0CShyZXZpc2lvbiAxMjkzOTcpCisrKyBTb3VyY2UvV2ViQ29yZS9DTWFrZUxpc3RzLnR4
dAkod29ya2luZyBjb3B5KQpAQCAtMTEyNSw2ICsxMTI1LDcgQEAgU0VUKFdlYkNvcmVfU09VUkNF
UwogICAgIGRvbS9Eb2N1bWVudEZyYWdtZW50LmNwcAogICAgIGRvbS9Eb2N1bWVudFBhcnNlci5j
cHAKICAgICBkb20vRG9jdW1lbnRPcmRlcmVkTWFwLmNwcAorICAgIGRvbS9Eb2N1bWVudFN0eWxl
U2hlZXRDb2xsZWN0aW9uLmNwcAogICAgIGRvbS9Eb2N1bWVudFR5cGUuY3BwCiAgICAgZG9tL0R5
bmFtaWNOb2RlTGlzdC5jcHAKICAgICBkb20vRWRpdGluZ1RleHQuY3BwCkluZGV4OiBTb3VyY2Uv
V2ViQ29yZS9HTlVtYWtlZmlsZS5saXN0LmFtCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3Jl
L0dOVW1ha2VmaWxlLmxpc3QuYW0JKHJldmlzaW9uIDEyOTM5NykKKysrIFNvdXJjZS9XZWJDb3Jl
L0dOVW1ha2VmaWxlLmxpc3QuYW0JKHdvcmtpbmcgY29weSkKQEAgLTI3MzQsNiArMjczNCw4IEBA
IHdlYmNvcmVfc291cmNlcyArPSBcCiAJU291cmNlL1dlYkNvcmUvZG9tL0RvY3VtZW50T3JkZXJl
ZE1hcC5oIFwKIAlTb3VyY2UvV2ViQ29yZS9kb20vRG9jdW1lbnRQYXJzZXIuY3BwIFwKIAlTb3Vy
Y2UvV2ViQ29yZS9kb20vRG9jdW1lbnRQYXJzZXIuaCBcCisgICAgU291cmNlL1dlYkNvcmUvZG9t
L0RvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uY3BwIFwKKyAgICBTb3VyY2UvV2ViQ29yZS9k
b20vRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5oIFwKIAlTb3VyY2UvV2ViQ29yZS9kb20v
RG9jdW1lbnRUaW1pbmcuaCBcCiAJU291cmNlL1dlYkNvcmUvZG9tL0RvY3VtZW50VHlwZS5jcHAg
XAogCVNvdXJjZS9XZWJDb3JlL2RvbS9Eb2N1bWVudFR5cGUuaCBcCkluZGV4OiBTb3VyY2UvV2Vi
Q29yZS9UYXJnZXQucHJpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL1RhcmdldC5wcmkJ
KHJldmlzaW9uIDEyOTM5NykKKysrIFNvdXJjZS9XZWJDb3JlL1RhcmdldC5wcmkJKHdvcmtpbmcg
Y29weSkKQEAgLTM3MSw2ICszNzEsNyBAQCBTT1VSQ0VTICs9IFwKICAgICBkb20vRG9jdW1lbnRN
YXJrZXIuY3BwIFwKICAgICBkb20vRG9jdW1lbnRPcmRlcmVkTWFwLmNwcCBcCiAgICAgZG9tL0Rv
Y3VtZW50UGFyc2VyLmNwcCBcCisgICAgZG9tL0RvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24u
Y3BwIFwKICAgICBkb20vRG9jdW1lbnRUeXBlLmNwcCBcCiAgICAgZG9tL0RPTUNvcmVFeGNlcHRp
b24uY3BwIFwKICAgICBkb20vRE9NRXJyb3IuY3BwIFwKQEAgLTE1MjgsNiArMTUyOSw3IEBAIEhF
QURFUlMgKz0gXAogICAgIGRvbS9Eb2N1bWVudE1hcmtlci5oIFwKICAgICBkb20vRG9jdW1lbnRN
YXJrZXJDb250cm9sbGVyLmggXAogICAgIGRvbS9Eb2N1bWVudE9yZGVyZWRNYXAuaCBcCisgICAg
ZG9tL0RvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uaCBcCiAgICAgZG9tL0RvY3VtZW50VHlw
ZS5oIFwKICAgICBkb20vRE9NRXJyb3IuaCBcCiAgICAgZG9tL0RPTUltcGxlbWVudGF0aW9uLmgg
XApJbmRleDogU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBpCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQkocmV2aXNpb24gMTI5Mzk3KQorKysgU291cmNlL1dlYkNv
cmUvV2ViQ29yZS5neXBpCSh3b3JraW5nIGNvcHkpCkBAIC02NTcsNiArNjU3LDcgQEAKICAgICAg
ICAgICAgICdkb20vRG9jdW1lbnRNYXJrZXJDb250cm9sbGVyLmgnLAogICAgICAgICAgICAgJ2Rv
bS9Eb2N1bWVudE9yZGVyZWRNYXAuaCcsCiAgICAgICAgICAgICAnZG9tL0RvY3VtZW50UGFyc2Vy
LmgnLAorICAgICAgICAgICAgJ2RvbS9Eb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmgnLAog
ICAgICAgICAgICAgJ2RvbS9Eb2N1bWVudFRpbWluZy5oJywKICAgICAgICAgICAgICdkb20vRG9j
dW1lbnRUeXBlLmgnLAogICAgICAgICAgICAgJ2RvbS9FbGVtZW50LmgnLApAQCAtMzgxNiw2ICsz
ODE3LDcgQEAKICAgICAgICAgICAgICdkb20vRG9jdW1lbnRNYXJrZXIuY3BwJywKICAgICAgICAg
ICAgICdkb20vRG9jdW1lbnRPcmRlcmVkTWFwLmNwcCcsCiAgICAgICAgICAgICAnZG9tL0RvY3Vt
ZW50UGFyc2VyLmNwcCcsCisgICAgICAgICAgICAnZG9tL0RvY3VtZW50U3R5bGVTaGVldENvbGxl
Y3Rpb24uY3BwJywKICAgICAgICAgICAgICdkb20vRG9jdW1lbnRUeXBlLmNwcCcsCiAgICAgICAg
ICAgICAnZG9tL0R5bmFtaWNOb2RlTGlzdC5jcHAnLAogICAgICAgICAgICAgJ2RvbS9EeW5hbWlj
Tm9kZUxpc3QuaCcsCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3Jl
LnZjcHJvago9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJD
b3JlLnZjcHJvagkocmV2aXNpb24gMTI5Mzk3KQorKysgU291cmNlL1dlYkNvcmUvV2ViQ29yZS52
Y3Byb2ovV2ViQ29yZS52Y3Byb2oJKHdvcmtpbmcgY29weSkKQEAgLTUwNDA2LDYgKzUwNDA2LDE0
IEBACiAJCQkJUmVsYXRpdmVQYXRoPSIuLlxkb21cRG9jdW1lbnRQYXJzZXIuaCIKIAkJCQk+CiAJ
CQk8L0ZpbGU+CisgICAgICAgICAgICA8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cZG9tXERv
Y3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uY3BwIgorCQkJCT4KKwkJCTwvRmlsZT4KKyAgICAg
ICAgICAgIDxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxkb21cRG9jdW1lbnRTdHlsZVNoZWV0
Q29sbGVjdGlvbi5oIgorCQkJCT4KKwkJCTwvRmlsZT4KIAkJCTxGaWxlCiAJCQkJUmVsYXRpdmVQ
YXRoPSIuLlxkb21cRG9jdW1lbnRUaW1pbmcuaCIKIAkJCQk+CkluZGV4OiBTb3VyY2UvV2ViQ29y
ZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShyZXZpc2lvbiAxMjkz
OTcpCisrKyBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJ
KHdvcmtpbmcgY29weSkKQEAgLTYxNDEsNiArNjE0MSw4IEBACiAJCUU0Nzc4QjgwMTE1QTU4MUEw
MEI1RDM3MiAvKiBKU0N1c3RvbUV2ZW50LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSBFNDc3OEI3RTExNUE1ODFBMDBCNUQzNzIgLyogSlNDdXN0b21FdmVu
dC5oICovOyB9OwogCQlFNDdCNEJFODBFNzEyNDE2MDAwMzg4NTQgLyogQ2FjaGVkUmVzb3VyY2VI
YW5kbGUuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEU0
N0I0QkU2MEU3MTI0MTYwMDAzODg1NCAvKiBDYWNoZWRSZXNvdXJjZUhhbmRsZS5oICovOyBzZXR0
aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCUU0N0I0QkU5MEU3MTI0
MTYwMDAzODg1NCAvKiBDYWNoZWRSZXNvdXJjZUhhbmRsZS5jcHAgaW4gU291cmNlcyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFNDdCNEJFNzBFNzEyNDE2MDAwMzg4NTQgLyog
Q2FjaGVkUmVzb3VyY2VIYW5kbGUuY3BwICovOyB9OworCQlFNDdFMjc2NTE2MDM2RUQyMDBFRTJB
RkIgLyogRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5oIGluIEhlYWRlcnMgKi8gPSB7aXNh
ID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRTQ3RTI3NjQxNjAzNkVEMjAwRUUyQUZCIC8qIERv
Y3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9
IChQcml2YXRlLCApOyB9OyB9OworCQlFNDdFMjc2ODE2MDM2RURDMDBFRTJBRkIgLyogRG9jdW1l
bnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSBFNDdFMjc2NzE2MDM2RURDMDBFRTJBRkIgLyogRG9jdW1lbnRTdHls
ZVNoZWV0Q29sbGVjdGlvbi5jcHAgKi87IH07CiAJCUU0OTQ2RUFFMTU2RTY0REQwMEQzMjk3RiAv
KiBTdHlsZVJ1bGVJbXBvcnQuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gRTQ5NDZFQUMxNTZFNjRERDAwRDMyOTdGIC8qIFN0eWxlUnVsZUltcG9ydC5j
cHAgKi87IH07CiAJCUU0OTQ2RUFGMTU2RTY0REQwMEQzMjk3RiAvKiBTdHlsZVJ1bGVJbXBvcnQu
aCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEU0OTQ2RUFE
MTU2RTY0REQwMEQzMjk3RiAvKiBTdHlsZVJ1bGVJbXBvcnQuaCAqLzsgfTsKIAkJRTQ5QkQ5RkEx
MzFGRDJFRDAwM0M1NkYwIC8qIENTU1ZhbHVlUG9vbC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0g
UEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRTQ5QkQ5RjkxMzFGRDJFRDAwM0M1NkYwIC8qIENTU1Zh
bHVlUG9vbC5oICovOyB9OwpAQCAtMTM1MjAsNiArMTM1MjIsOCBAQAogCQlFNDc3OEI3RTExNUE1
ODFBMDBCNUQzNzIgLyogSlNDdXN0b21FdmVudC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7
IHBhdGggPSBKU0N1c3RvbUV2ZW50Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUU0
N0I0QkU2MEU3MTI0MTYwMDAzODg1NCAvKiBDYWNoZWRSZXNvdXJjZUhhbmRsZS5oICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBDYWNoZWRSZXNvdXJjZUhhbmRsZS5oOyBzb3VyY2VU
cmVlID0gIjxncm91cD4iOyB9OwogCQlFNDdCNEJFNzBFNzEyNDE2MDAwMzg4NTQgLyogQ2FjaGVk
UmVzb3VyY2VIYW5kbGUuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNv
ZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0g
Q2FjaGVkUmVzb3VyY2VIYW5kbGUuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlF
NDdFMjc2NDE2MDM2RUQyMDBFRTJBRkIgLyogRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5o
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93
bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBEb2N1bWVudFN0eWxlU2hlZXRDb2xs
ZWN0aW9uLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUU0N0UyNzY3MTYwMzZFREMw
MEVFMkFGQiAvKiBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmNwcCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uY3Bw
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlFNDk0NkVBQzE1NkU2NEREMDBEMzI5N0Yg
LyogU3R5bGVSdWxlSW1wb3J0LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0
aCA9IFN0eWxlUnVsZUltcG9ydC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUU0
OTQ2RUFEMTU2RTY0REQwMEQzMjk3RiAvKiBTdHlsZVJ1bGVJbXBvcnQuaCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuYy5oOyBwYXRoID0gU3R5bGVSdWxlSW1wb3J0Lmg7IHNvdXJjZVRyZWUgPSAiPGdy
b3VwPiI7IH07CiAJCUU0OUJEOUY5MTMxRkQyRUQwMDNDNTZGMCAvKiBDU1NWYWx1ZVBvb2wuaCAq
LyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25G
aWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQ1NTVmFsdWVQb29sLmg7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CkBAIC0yMTY3MSw2ICsyMTY3NSw4IEBACiAJCQkJMTQ5NDdGRkMx
MkY4MENEMjAwQTBGNjMxIC8qIERvY3VtZW50T3JkZXJlZE1hcC5oICovLAogCQkJCUE4QzIyODBE
MTFENEE1OTcwMEQ1QTdEMyAvKiBEb2N1bWVudFBhcnNlci5jcHAgKi8sCiAJCQkJQkNDRkJBRTcw
QjUxNTJFRDAwMDFGMUQ3IC8qIERvY3VtZW50UGFyc2VyLmggKi8sCisJCQkJRTQ3RTI3NjcxNjAz
NkVEQzAwRUUyQUZCIC8qIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uY3BwICovLAorCQkJ
CUU0N0UyNzY0MTYwMzZFRDIwMEVFMkFGQiAvKiBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9u
LmggKi8sCiAJCQkJODZEOTgyRjYxMjVDMTU0MDAwQUQ5RTNEIC8qIERvY3VtZW50VGltaW5nLmgg
Ki8sCiAJCQkJQTgxODVGMzIwOTc2NTc2NTAwNTgyNkQ5IC8qIERvY3VtZW50VHlwZS5jcHAgKi8s
CiAJCQkJQTgxODVGMzEwOTc2NTc2NTAwNTgyNkQ5IC8qIERvY3VtZW50VHlwZS5oICovLApAQCAt
MjIyNzUsNiArMjIyODEsNyBAQAogCQkJaXNhID0gUEJYSGVhZGVyc0J1aWxkUGhhc2U7CiAJCQli
dWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OwogCQkJZmlsZXMgPSAoCisJCQkJRTQ3RTI3NjUx
NjAzNkVEMjAwRUUyQUZCIC8qIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uaCBpbiBIZWFk
ZXJzICovLAogCQkJCTk3QkM2OURCMTUwNUYwNzYwMDFCNzRBQyAvKiBBYnN0cmFjdERhdGFiYXNl
LmggaW4gSGVhZGVycyAqLywKIAkJCQk0MUUxQjFEMTBGRjU5ODY5MDA1NzZCM0IgLyogQWJzdHJh
Y3RXb3JrZXIuaCBpbiBIZWFkZXJzICovLAogCQkJCTI5QTgxMjJFMEZCQjlDMUQwMDUxMDI5MyAv
KiBBY2Nlc3NpYmlsaXR5QVJJQUdyaWRDZWxsLmggaW4gSGVhZGVycyAqLywKQEAgLTI4NjY4LDYg
KzI4Njc1LDcgQEAKIAkJCQlFMUJFNTEyRDBDRjZDNTEyMDAyRUE5NTkgLyogWFNMVFVuaWNvZGVT
b3J0LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTk3N0UyRTBFMTJGMEZDOUMwMEMxMzM3OSAvKiBY
U1NBdWRpdG9yLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUZENTM3MzUyMTM3QjY1MTgwMDAwOERD
RSAvKiBaZXJvUG9sZS5jcHAgaW4gU291cmNlcyAqLywKKwkJCQlFNDdFMjc2ODE2MDM2RURDMDBF
RTJBRkIgLyogRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5jcHAgaW4gU291cmNlcyAqLywK
IAkJCQk0RjFEMTFCRjE1RkYzNzIwMDAyNkU5MDggLyogUGxhdGZvcm1NZW1vcnlJbnN0cnVtZW50
YXRpb24uY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkpOwogCQkJcnVuT25seUZvckRlcGxveW1lbnRQ
b3N0cHJvY2Vzc2luZyA9IDA7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9jc3MvU2VsZWN0b3JDaGVj
a2VyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9jc3MvU2VsZWN0b3JDaGVja2Vy
LmNwcAkocmV2aXNpb24gMTI5Mzk3KQorKysgU291cmNlL1dlYkNvcmUvY3NzL1NlbGVjdG9yQ2hl
Y2tlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlICJDU1NT
ZWxlY3Rvci5oIgogI2luY2x1ZGUgIkNTU1NlbGVjdG9yTGlzdC5oIgogI2luY2x1ZGUgIkRvY3Vt
ZW50LmgiCisjaW5jbHVkZSAiRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5oIgogI2luY2x1
ZGUgIkZvY3VzQ29udHJvbGxlci5oIgogI2luY2x1ZGUgIkZyYW1lLmgiCiAjaW5jbHVkZSAiRnJh
bWVTZWxlY3Rpb24uaCIKQEAgLTc4Myw3ICs3ODQsNyBAQCBib29sIFNlbGVjdG9yQ2hlY2tlcjo6
Y2hlY2tPbmVTZWxlY3RvcihjCiAgICAgICAgICAgICAgICAgaWYgKG1fbW9kZSA9PSBSZXNvbHZp
bmdTdHlsZSkgewogICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5lbGVtZW50U3R5bGUp
CiAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnRTdHlsZS0+c2V0RW1wdHlT
dGF0ZShyZXN1bHQpOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChlbGVtZW50LT5yZW5k
ZXJTdHlsZSgpICYmIChlbGVtZW50LT5kb2N1bWVudCgpLT51c2VzU2libGluZ1J1bGVzKCkgfHwg
ZWxlbWVudC0+cmVuZGVyU3R5bGUoKS0+dW5pcXVlKCkpKQorICAgICAgICAgICAgICAgICAgICBl
bHNlIGlmIChlbGVtZW50LT5yZW5kZXJTdHlsZSgpICYmIChlbGVtZW50LT5kb2N1bWVudCgpLT5z
dHlsZVNoZWV0Q29sbGVjdGlvbigpLT51c2VzU2libGluZ1J1bGVzKCkgfHwgZWxlbWVudC0+cmVu
ZGVyU3R5bGUoKS0+dW5pcXVlKCkpKQogICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC0+
cmVuZGVyU3R5bGUoKS0+c2V0RW1wdHlTdGF0ZShyZXN1bHQpOwogICAgICAgICAgICAgICAgIH0K
ICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwpAQCAtMTE4Nyw3ICsxMTg4LDcgQEAgYm9v
bCBTZWxlY3RvckNoZWNrZXI6OmNoZWNrT25lU2VsZWN0b3IoYwogICAgICAgICBQc2V1ZG9JZCBw
c2V1ZG9JZCA9IENTU1NlbGVjdG9yOjpwc2V1ZG9JZChzZWxlY3Rvci0+cHNldWRvVHlwZSgpKTsK
ICAgICAgICAgaWYgKHBzZXVkb0lkID09IEZJUlNUX0xFVFRFUikgewogICAgICAgICAgICAgaWYg
KERvY3VtZW50KiBkb2N1bWVudCA9IGVsZW1lbnQtPmRvY3VtZW50KCkpCi0gICAgICAgICAgICAg
ICAgZG9jdW1lbnQtPnNldFVzZXNGaXJzdExldHRlclJ1bGVzKHRydWUpOworICAgICAgICAgICAg
ICAgIGRvY3VtZW50LT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpLT5zZXRVc2VzRmlyc3RMZXR0ZXJS
dWxlcyh0cnVlKTsKICAgICAgICAgfQogICAgICAgICBpZiAocHNldWRvSWQgIT0gTk9QU0VVRE8p
CiAgICAgICAgICAgICBkeW5hbWljUHNldWRvID0gcHNldWRvSWQ7CkluZGV4OiBTb3VyY2UvV2Vi
Q29yZS9jc3MvU3R5bGVSZXNvbHZlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUv
Y3NzL1N0eWxlUmVzb2x2ZXIuY3BwCShyZXZpc2lvbiAxMjkzOTcpCisrKyBTb3VyY2UvV2ViQ29y
ZS9jc3MvU3R5bGVSZXNvbHZlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTYwLDYgKzYwLDcgQEAK
ICNpbmNsdWRlICJDb3VudGVyLmgiCiAjaW5jbHVkZSAiQ291bnRlckNvbnRlbnQuaCIKICNpbmNs
dWRlICJDdXJzb3JMaXN0LmgiCisjaW5jbHVkZSAiRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlv
bi5oIgogI2luY2x1ZGUgIkZvbnRGZWF0dXJlVmFsdWUuaCIKICNpbmNsdWRlICJGb250VmFsdWUu
aCIKICNpbmNsdWRlICJGcmFtZS5oIgpAQCAtNDI4LDEyICs0MjksMTMgQEAgU3R5bGVSZXNvbHZl
cjo6U3R5bGVSZXNvbHZlcihEb2N1bWVudCogZAogICAgIC8vIE5vdGUgdGhhdCB0aGVyZSB1c3Vh
bGx5IGlzIG9ubHkgMSBzaGVldCBmb3Igc2NvcGVkIHJ1bGVzLCBzbyBhdXRvLXNocmluay10by1m
aXQgaXMgZmluZS4KICAgICBtX2F1dGhvclN0eWxlLT5kaXNhYmxlQXV0b1Nocmlua1RvRml0KCk7
CiAKKyAgICBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uKiBzdHlsZVNoZWV0Q29sbGVjdGlv
biA9IGRvY3VtZW50LT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpOwogICAgIC8vIEZJWE1FOiBUaGlz
IHN1Y2tzISBUaGUgdXNlciBzaGVldCBpcyByZXBhcnNlZCBldmVyeSB0aW1lIQogICAgIE93blB0
cjxSdWxlU2V0PiB0ZW1wVXNlclN0eWxlID0gUnVsZVNldDo6Y3JlYXRlKCk7Ci0gICAgaWYgKENT
U1N0eWxlU2hlZXQqIHBhZ2VVc2VyU2hlZXQgPSBkb2N1bWVudC0+cGFnZVVzZXJTaGVldCgpKQor
ICAgIGlmIChDU1NTdHlsZVNoZWV0KiBwYWdlVXNlclNoZWV0ID0gc3R5bGVTaGVldENvbGxlY3Rp
b24tPnBhZ2VVc2VyU2hlZXQoKSkKICAgICAgICAgdGVtcFVzZXJTdHlsZS0+YWRkUnVsZXNGcm9t
U2hlZXQocGFnZVVzZXJTaGVldC0+Y29udGVudHMoKSwgKm1fbWVkaXVtLCB0aGlzKTsKLSAgICBh
ZGRBdXRob3JSdWxlc0FuZENvbGxlY3RVc2VyUnVsZXNGcm9tU2hlZXRzKGRvY3VtZW50LT5wYWdl
R3JvdXBVc2VyU2hlZXRzKCksICp0ZW1wVXNlclN0eWxlKTsKLSAgICBhZGRBdXRob3JSdWxlc0Fu
ZENvbGxlY3RVc2VyUnVsZXNGcm9tU2hlZXRzKGRvY3VtZW50LT5kb2N1bWVudFVzZXJTaGVldHMo
KSwgKnRlbXBVc2VyU3R5bGUpOworICAgIGFkZEF1dGhvclJ1bGVzQW5kQ29sbGVjdFVzZXJSdWxl
c0Zyb21TaGVldHMoc3R5bGVTaGVldENvbGxlY3Rpb24tPnBhZ2VHcm91cFVzZXJTaGVldHMoKSwg
KnRlbXBVc2VyU3R5bGUpOworICAgIGFkZEF1dGhvclJ1bGVzQW5kQ29sbGVjdFVzZXJSdWxlc0Zy
b21TaGVldHMoc3R5bGVTaGVldENvbGxlY3Rpb24tPmRvY3VtZW50VXNlclNoZWV0cygpLCAqdGVt
cFVzZXJTdHlsZSk7CiAgICAgaWYgKHRlbXBVc2VyU3R5bGUtPm1fcnVsZUNvdW50ID4gMCB8fCB0
ZW1wVXNlclN0eWxlLT5tX3BhZ2VSdWxlcy5zaXplKCkgPiAwKQogICAgICAgICBtX3VzZXJTdHls
ZSA9IHRlbXBVc2VyU3R5bGUucmVsZWFzZSgpOwogCkBAIC00NDcsNyArNDQ5LDcgQEAgU3R5bGVS
ZXNvbHZlcjo6U3R5bGVSZXNvbHZlcihEb2N1bWVudCogZAogI2VuZGlmCiAKICAgICBhZGRTdHls
ZXNoZWV0c0Zyb21TZWFtbGVzc1BhcmVudHMoKTsKLSAgICBhcHBlbmRBdXRob3JTdHlsZXNoZWV0
cygwLCBkb2N1bWVudC0+c3R5bGVTaGVldHMoKS0+dmVjdG9yKCkpOworICAgIGFwcGVuZEF1dGhv
clN0eWxlc2hlZXRzKDAsIHN0eWxlU2hlZXRDb2xsZWN0aW9uLT5hdXRob3JTdHlsZVNoZWV0cygp
LT52ZWN0b3IoKSk7CiB9CiAKIHZvaWQgU3R5bGVSZXNvbHZlcjo6YWRkU3R5bGVzaGVldHNGcm9t
U2VhbWxlc3NQYXJlbnRzKCkKQEAgLTcwOCw3ICs3MTAsNiBAQCB2b2lkIFN0eWxlUmVzb2x2ZXI6
OnN3ZWVwTWF0Y2hlZFByb3BlcnRpCiBTdHlsZVJlc29sdmVyOjpGZWF0dXJlczo6RmVhdHVyZXMo
KQogICAgIDogdXNlc0ZpcnN0TGluZVJ1bGVzKGZhbHNlKQogICAgICwgdXNlc0JlZm9yZUFmdGVy
UnVsZXMoZmFsc2UpCi0gICAgLCB1c2VzTGlua1J1bGVzKGZhbHNlKQogewogfQogCkBAIC03Mjgs
NyArNzI5LDYgQEAgdm9pZCBTdHlsZVJlc29sdmVyOjpGZWF0dXJlczo6YWRkKGNvbnN0IAogICAg
IHVuY29tbW9uQXR0cmlidXRlUnVsZXMuYXBwZW5kKG90aGVyLnVuY29tbW9uQXR0cmlidXRlUnVs
ZXMpOwogICAgIHVzZXNGaXJzdExpbmVSdWxlcyA9IHVzZXNGaXJzdExpbmVSdWxlcyB8fCBvdGhl
ci51c2VzRmlyc3RMaW5lUnVsZXM7CiAgICAgdXNlc0JlZm9yZUFmdGVyUnVsZXMgPSB1c2VzQmVm
b3JlQWZ0ZXJSdWxlcyB8fCBvdGhlci51c2VzQmVmb3JlQWZ0ZXJSdWxlczsKLSAgICB1c2VzTGlu
a1J1bGVzID0gdXNlc0xpbmtSdWxlcyB8fCBvdGhlci51c2VzTGlua1J1bGVzOwogfQogCiB2b2lk
IFN0eWxlUmVzb2x2ZXI6OkZlYXR1cmVzOjpjbGVhcigpCkBAIC03MzksNyArNzM5LDYgQEAgdm9p
ZCBTdHlsZVJlc29sdmVyOjpGZWF0dXJlczo6Y2xlYXIoKQogICAgIHVuY29tbW9uQXR0cmlidXRl
UnVsZXMuY2xlYXIoKTsKICAgICB1c2VzRmlyc3RMaW5lUnVsZXMgPSBmYWxzZTsKICAgICB1c2Vz
QmVmb3JlQWZ0ZXJSdWxlcyA9IGZhbHNlOwotICAgIHVzZXNMaW5rUnVsZXMgPSBmYWxzZTsKIH0K
IAogdm9pZCBTdHlsZVJlc29sdmVyOjpGZWF0dXJlczo6cmVwb3J0TWVtb3J5VXNhZ2UoTWVtb3J5
T2JqZWN0SW5mbyogbWVtb3J5T2JqZWN0SW5mbykgY29uc3QKQEAgLTI2MDUsMTAgKzI2MDQsNiBA
QCBzdGF0aWMgaW5saW5lIHZvaWQgY29sbGVjdEZlYXR1cmVzRnJvbVNlCiAgICAgY2FzZSBDU1NT
ZWxlY3Rvcjo6UHNldWRvQWZ0ZXI6CiAgICAgICAgIGZlYXR1cmVzLnVzZXNCZWZvcmVBZnRlclJ1
bGVzID0gdHJ1ZTsKICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDU1NTZWxlY3Rvcjo6UHNldWRv
TGluazoKLSAgICBjYXNlIENTU1NlbGVjdG9yOjpQc2V1ZG9WaXNpdGVkOgotICAgICAgICBmZWF0
dXJlcy51c2VzTGlua1J1bGVzID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoK
ICAgICAgICAgYnJlYWs7CiAgICAgfQpAQCAtMzE4MSwyNSArMzE3NiwyNSBAQCBzdGF0aWMgdm9p
ZCBjb2xsZWN0Q1NTT01XcmFwcGVycyhIYXNoTWFwCiAgICAgY29sbGVjdENTU09NV3JhcHBlcnMo
d3JhcHBlck1hcCwgc3R5bGVTaGVldFdyYXBwZXIuZ2V0KCkpOwogfQogCi1zdGF0aWMgdm9pZCBj
b2xsZWN0Q1NTT01XcmFwcGVycyhIYXNoTWFwPFN0eWxlUnVsZSosIFJlZlB0cjxDU1NTdHlsZVJ1
bGU+ID4mIHdyYXBwZXJNYXAsIERvY3VtZW50KiBkb2N1bWVudCkKK3N0YXRpYyB2b2lkIGNvbGxl
Y3RDU1NPTVdyYXBwZXJzKEhhc2hNYXA8U3R5bGVSdWxlKiwgUmVmUHRyPENTU1N0eWxlUnVsZT4g
PiYgd3JhcHBlck1hcCwgRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbiogc3R5bGVTaGVldENv
bGxlY3Rpb24pCiB7Ci0gICAgY29uc3QgVmVjdG9yPFJlZlB0cjxTdHlsZVNoZWV0PiA+JiBzdHls
ZVNoZWV0cyA9IGRvY3VtZW50LT5zdHlsZVNoZWV0cygpLT52ZWN0b3IoKTsKKyAgICBjb25zdCBW
ZWN0b3I8UmVmUHRyPFN0eWxlU2hlZXQ+ID4mIHN0eWxlU2hlZXRzID0gc3R5bGVTaGVldENvbGxl
Y3Rpb24tPmF1dGhvclN0eWxlU2hlZXRzKCktPnZlY3RvcigpOwogICAgIGZvciAodW5zaWduZWQg
aSA9IDA7IGkgPCBzdHlsZVNoZWV0cy5zaXplKCk7ICsraSkgewogICAgICAgICBTdHlsZVNoZWV0
KiBzdHlsZVNoZWV0ID0gc3R5bGVTaGVldHNbaV0uZ2V0KCk7CiAgICAgICAgIGlmICghc3R5bGVT
aGVldC0+aXNDU1NTdHlsZVNoZWV0KCkpCiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAg
Y29sbGVjdENTU09NV3JhcHBlcnMod3JhcHBlck1hcCwgc3RhdGljX2Nhc3Q8Q1NTU3R5bGVTaGVl
dCo+KHN0eWxlU2hlZXQpKTsKICAgICB9Ci0gICAgY29sbGVjdENTU09NV3JhcHBlcnMod3JhcHBl
ck1hcCwgZG9jdW1lbnQtPnBhZ2VVc2VyU2hlZXQoKSk7CisgICAgY29sbGVjdENTU09NV3JhcHBl
cnMod3JhcHBlck1hcCwgc3R5bGVTaGVldENvbGxlY3Rpb24tPnBhZ2VVc2VyU2hlZXQoKSk7CiAg
ICAgewotICAgICAgICBjb25zdCBWZWN0b3I8UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4qIHBhZ2VH
cm91cFVzZXJTaGVldHMgPSBkb2N1bWVudC0+cGFnZUdyb3VwVXNlclNoZWV0cygpOworICAgICAg
ICBjb25zdCBWZWN0b3I8UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4qIHBhZ2VHcm91cFVzZXJTaGVl
dHMgPSBzdHlsZVNoZWV0Q29sbGVjdGlvbi0+cGFnZUdyb3VwVXNlclNoZWV0cygpOwogICAgICAg
ICBpZiAocGFnZUdyb3VwVXNlclNoZWV0cykgewogICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9
IDAsIHNpemUgPSBwYWdlR3JvdXBVc2VyU2hlZXRzLT5zaXplKCk7IGkgPCBzaXplOyArK2kpCiAg
ICAgICAgICAgICAgICAgY29sbGVjdENTU09NV3JhcHBlcnMod3JhcHBlck1hcCwgcGFnZUdyb3Vw
VXNlclNoZWV0cy0+YXQoaSkuZ2V0KCkpOwogICAgICAgICB9CiAgICAgfQogICAgIHsKLSAgICAg
ICAgY29uc3QgVmVjdG9yPFJlZlB0cjxDU1NTdHlsZVNoZWV0PiA+KiBkb2N1bWVudFVzZXJTaGVl
dHMgPSBkb2N1bWVudC0+ZG9jdW1lbnRVc2VyU2hlZXRzKCk7CisgICAgICAgIGNvbnN0IFZlY3Rv
cjxSZWZQdHI8Q1NTU3R5bGVTaGVldD4gPiogZG9jdW1lbnRVc2VyU2hlZXRzID0gc3R5bGVTaGVl
dENvbGxlY3Rpb24tPmRvY3VtZW50VXNlclNoZWV0cygpOwogICAgICAgICBpZiAoZG9jdW1lbnRV
c2VyU2hlZXRzKSB7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMCwgc2l6ZSA9IGRvY3Vt
ZW50VXNlclNoZWV0cy0+c2l6ZSgpOyBpIDwgc2l6ZTsgKytpKQogICAgICAgICAgICAgICAgIGNv
bGxlY3RDU1NPTVdyYXBwZXJzKHdyYXBwZXJNYXAsIGRvY3VtZW50VXNlclNoZWV0cy0+YXQoaSku
Z2V0KCkpOwpAQCAtMzIxOCw3ICszMjEzLDcgQEAgQ1NTU3R5bGVSdWxlKiBTdHlsZVJlc29sdmVy
OjplbnN1cmVGdWxsQwogICAgICAgICBjb2xsZWN0Q1NTT01XcmFwcGVycyhtX3N0eWxlUnVsZVRv
Q1NTT01XcmFwcGVyTWFwLCBtX3N0eWxlU2hlZXRDU1NPTVdyYXBwZXJTZXQsIG1lZGlhQ29udHJv
bHNTdHlsZVNoZWV0KTsKICAgICAgICAgY29sbGVjdENTU09NV3JhcHBlcnMobV9zdHlsZVJ1bGVU
b0NTU09NV3JhcHBlck1hcCwgbV9zdHlsZVNoZWV0Q1NTT01XcmFwcGVyU2V0LCBmdWxsc2NyZWVu
U3R5bGVTaGVldCk7CiAKLSAgICAgICAgY29sbGVjdENTU09NV3JhcHBlcnMobV9zdHlsZVJ1bGVU
b0NTU09NV3JhcHBlck1hcCwgZG9jdW1lbnQoKSk7CisgICAgICAgIGNvbGxlY3RDU1NPTVdyYXBw
ZXJzKG1fc3R5bGVSdWxlVG9DU1NPTVdyYXBwZXJNYXAsIGRvY3VtZW50KCktPnN0eWxlU2hlZXRD
b2xsZWN0aW9uKCkpOwogICAgIH0KICAgICByZXR1cm4gbV9zdHlsZVJ1bGVUb0NTU09NV3JhcHBl
ck1hcC5nZXQocnVsZSkuZ2V0KCk7CiB9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9jc3MvU3R5bGVS
ZXNvbHZlci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2Nzcy9TdHlsZVJlc29sdmVy
LmgJKHJldmlzaW9uIDEyOTM5NykKKysrIFNvdXJjZS9XZWJDb3JlL2Nzcy9TdHlsZVJlc29sdmVy
LmgJKHdvcmtpbmcgY29weSkKQEAgLTI0NCw3ICsyNDQsNiBAQCBwdWJsaWM6CiAgICAgYm9vbCB1
c2VzU2libGluZ1J1bGVzKCkgY29uc3QgeyByZXR1cm4gIW1fZmVhdHVyZXMuc2libGluZ1J1bGVz
LmlzRW1wdHkoKTsgfQogICAgIGJvb2wgdXNlc0ZpcnN0TGluZVJ1bGVzKCkgY29uc3QgeyByZXR1
cm4gbV9mZWF0dXJlcy51c2VzRmlyc3RMaW5lUnVsZXM7IH0KICAgICBib29sIHVzZXNCZWZvcmVB
ZnRlclJ1bGVzKCkgY29uc3QgeyByZXR1cm4gbV9mZWF0dXJlcy51c2VzQmVmb3JlQWZ0ZXJSdWxl
czsgfQotICAgIGJvb2wgdXNlc0xpbmtSdWxlcygpIGNvbnN0IHsgcmV0dXJuIG1fZmVhdHVyZXMu
dXNlc0xpbmtSdWxlczsgfQogCiAgICAgc3RhdGljIGJvb2wgY3JlYXRlVHJhbnNmb3JtT3BlcmF0
aW9ucyhDU1NWYWx1ZSogaW5WYWx1ZSwgUmVuZGVyU3R5bGUqIGluU3R5bGUsIFJlbmRlclN0eWxl
KiByb290U3R5bGUsIFRyYW5zZm9ybU9wZXJhdGlvbnMmIG91dE9wZXJhdGlvbnMpOwogICAgIApA
QCAtMjk3LDcgKzI5Niw2IEBAIHB1YmxpYzoKICAgICAgICAgVmVjdG9yPFJ1bGVGZWF0dXJlPiB1
bmNvbW1vbkF0dHJpYnV0ZVJ1bGVzOwogICAgICAgICBib29sIHVzZXNGaXJzdExpbmVSdWxlczsK
ICAgICAgICAgYm9vbCB1c2VzQmVmb3JlQWZ0ZXJSdWxlczsKLSAgICAgICAgYm9vbCB1c2VzTGlu
a1J1bGVzOwogICAgIH07CiAKIHByaXZhdGU6CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9kb20vRG9j
dW1lbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2RvbS9Eb2N1bWVudC5jcHAJ
KHJldmlzaW9uIDEyOTM5NykKKysrIFNvdXJjZS9XZWJDb3JlL2RvbS9Eb2N1bWVudC5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTU3LDYgKzU3LDcgQEAKICNpbmNsdWRlICJEb2N1bWVudEZyYWdtZW50
LmgiCiAjaW5jbHVkZSAiRG9jdW1lbnRMb2FkZXIuaCIKICNpbmNsdWRlICJEb2N1bWVudE1hcmtl
ckNvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmgi
CiAjaW5jbHVkZSAiRG9jdW1lbnRUeXBlLmgiCiAjaW5jbHVkZSAiRWRpdGluZ1RleHQuaCIKICNp
bmNsdWRlICJFZGl0b3IuaCIKQEAgLTQzNyw4ICs0MzgsNyBAQCBEb2N1bWVudDo6RG9jdW1lbnQo
RnJhbWUqIGZyYW1lLCBjb25zdCBLCiAjaWYgRU5BQkxFKE1VVEFUSU9OX09CU0VSVkVSUykKICAg
ICAsIG1fbXV0YXRpb25PYnNlcnZlclR5cGVzKDApCiAjZW5kaWYKLSAgICAsIG1fc3R5bGVTaGVl
dHMoU3R5bGVTaGVldExpc3Q6OmNyZWF0ZSh0aGlzKSkKLSAgICAsIG1faGFkQWN0aXZlTG9hZGlu
Z1N0eWxlc2hlZXQoZmFsc2UpCisgICAgLCBtX3N0eWxlU2hlZXRDb2xsZWN0aW9uKGFkb3B0UHRy
KG5ldyBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uKHRoaXMpKSkKICAgICAsIG1fcmVhZHlT
dGF0ZShDb21wbGV0ZSkKICAgICAsIG1fc3R5bGVSZWNhbGNUaW1lcih0aGlzLCAmRG9jdW1lbnQ6
OnN0eWxlUmVjYWxjVGltZXJGaXJlZCkKICAgICAsIG1fcGVuZGluZ1N0eWxlUmVjYWxjU2hvdWxk
Rm9yY2UoZmFsc2UpCkBAIC01MDQsOCArNTA0LDYgQEAgRG9jdW1lbnQ6OkRvY3VtZW50KEZyYW1l
KiBmcmFtZSwgY29uc3QgSwogewogICAgIG1fZG9jdW1lbnQgPSB0aGlzOwogCi0gICAgbV9wYWdl
R3JvdXBVc2VyU2hlZXRDYWNoZVZhbGlkID0gZmFsc2U7Ci0KICAgICBtX3ByaW50aW5nID0gZmFs
c2U7CiAgICAgbV9wYWdpbmF0ZWRGb3JTY3JlZW4gPSBmYWxzZTsKIApAQCAtNTQzLDIwICs1NDEs
OSBAQCBEb2N1bWVudDo6RG9jdW1lbnQoRnJhbWUqIGZyYW1lLCBjb25zdCBLCiAgICAgbV9pblN0
eWxlUmVjYWxjID0gZmFsc2U7CiAgICAgbV9jbG9zZUFmdGVyU3R5bGVSZWNhbGMgPSBmYWxzZTsK
IAotICAgIG1fdXNlc1NpYmxpbmdSdWxlcyA9IGZhbHNlOwotICAgIG1fdXNlc1NpYmxpbmdSdWxl
c092ZXJyaWRlID0gZmFsc2U7Ci0gICAgbV91c2VzRmlyc3RMaW5lUnVsZXMgPSBmYWxzZTsKLSAg
ICBtX3VzZXNGaXJzdExldHRlclJ1bGVzID0gZmFsc2U7Ci0gICAgbV91c2VzQmVmb3JlQWZ0ZXJS
dWxlcyA9IGZhbHNlOwotICAgIG1fdXNlc0JlZm9yZUFmdGVyUnVsZXNPdmVycmlkZSA9IGZhbHNl
OwotICAgIG1fdXNlc1JlbVVuaXRzID0gZmFsc2U7Ci0gICAgbV91c2VzTGlua1J1bGVzID0gZmFs
c2U7Ci0KICAgICBtX2dvdG9BbmNob3JOZWVkZWRBZnRlclN0eWxlc2hlZXRzTG9hZCA9IGZhbHNl
OwogCiAgICAgbV9kaWRDYWxjdWxhdGVTdHlsZVJlc29sdmVyID0gZmFsc2U7Ci0gICAgbV9oYXNE
aXJ0eVN0eWxlUmVzb2x2ZXIgPSBmYWxzZTsKLSAgICBtX3BlbmRpbmdTdHlsZXNoZWV0cyA9IDA7
CiAgICAgbV9pZ25vcmVQZW5kaW5nU3R5bGVzaGVldHMgPSBmYWxzZTsKICAgICBtX25lZWRzTm90
aWZ5UmVtb3ZlQWxsUGVuZGluZ1N0eWxlc2hlZXQgPSBmYWxzZTsKICAgICBtX2hhc05vZGVzV2l0
aFBsYWNlaG9sZGVyU3R5bGUgPSBmYWxzZTsKQEAgLTY0MywyNCArNjMwLDEzIEBAIERvY3VtZW50
Ojp+RG9jdW1lbnQoKQogCiAgICAgbV9kZWNvZGVyID0gMDsKIAotICAgIGlmIChtX3N0eWxlU2hl
ZXRzKQotICAgICAgICBtX3N0eWxlU2hlZXRzLT5kb2N1bWVudERlc3Ryb3llZCgpOworICAgIG1f
c3R5bGVTaGVldENvbGxlY3Rpb24uY2xlYXIoKTsKIAogICAgIGlmIChtX25hbWVkRmxvd3MpCiAg
ICAgICAgIG1fbmFtZWRGbG93cy0+ZG9jdW1lbnREZXN0cm95ZWQoKTsKIAogICAgIGlmIChtX2Vs
ZW1TaGVldCkKICAgICAgICAgbV9lbGVtU2hlZXQtPmNsZWFyT3duZXJOb2RlKCk7Ci0gICAgaWYg
KG1fcGFnZVVzZXJTaGVldCkKLSAgICAgICAgbV9wYWdlVXNlclNoZWV0LT5jbGVhck93bmVyTm9k
ZSgpOwotICAgIGlmIChtX3BhZ2VHcm91cFVzZXJTaGVldHMpIHsKLSAgICAgICAgZm9yIChzaXpl
X3QgaSA9IDA7IGkgPCBtX3BhZ2VHcm91cFVzZXJTaGVldHMtPnNpemUoKTsgKytpKQotICAgICAg
ICAgICAgKCptX3BhZ2VHcm91cFVzZXJTaGVldHMpW2ldLT5jbGVhck93bmVyTm9kZSgpOwotICAg
IH0KLSAgICBpZiAobV91c2VyU2hlZXRzKSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBp
IDwgbV91c2VyU2hlZXRzLT5zaXplKCk7ICsraSkKLSAgICAgICAgICAgICgqbV91c2VyU2hlZXRz
KVtpXS0+Y2xlYXJPd25lck5vZGUoKTsKLSAgICB9CiAKICAgICBkZWxldGVDdXN0b21Gb250cygp
OwogCkBAIC04MDIsMTQgKzc3OCwxNCBAQCB2b2lkIERvY3VtZW50OjpzZXRDb21wYXRpYmlsaXR5
TW9kZShDb21wCiB7CiAgICAgaWYgKG1fY29tcGF0aWJpbGl0eU1vZGVMb2NrZWQgfHwgbW9kZSA9
PSBtX2NvbXBhdGliaWxpdHlNb2RlKQogICAgICAgICByZXR1cm47Ci0gICAgQVNTRVJUKCFtX3N0
eWxlU2hlZXRzLT5sZW5ndGgoKSk7CisgICAgQVNTRVJUKCFtX3N0eWxlU2hlZXRDb2xsZWN0aW9u
LT5hdXRob3JTdHlsZVNoZWV0cygpLT5sZW5ndGgoKSk7CiAgICAgYm9vbCB3YXNJblF1aXJrc01v
ZGUgPSBpblF1aXJrc01vZGUoKTsKICAgICBtX2NvbXBhdGliaWxpdHlNb2RlID0gbW9kZTsKICAg
ICBzZWxlY3RvclF1ZXJ5Q2FjaGUoKS0+aW52YWxpZGF0ZSgpOwogICAgIGlmIChpblF1aXJrc01v
ZGUoKSAhPSB3YXNJblF1aXJrc01vZGUpIHsKICAgICAgICAgLy8gQWxsIHVzZXIgc3R5bGVzaGVl
dHMgaGF2ZSB0byByZXBhcnNlIHVzaW5nIHRoZSBkaWZmZXJlbnQgbW9kZS4KLSAgICAgICAgY2xl
YXJQYWdlVXNlclNoZWV0KCk7Ci0gICAgICAgIGNsZWFyUGFnZUdyb3VwVXNlclNoZWV0cygpOwor
ICAgICAgICBtX3N0eWxlU2hlZXRDb2xsZWN0aW9uLT5jbGVhclBhZ2VVc2VyU2hlZXQoKTsKKyAg
ICAgICAgbV9zdHlsZVNoZWV0Q29sbGVjdGlvbi0+Y2xlYXJQYWdlR3JvdXBVc2VyU2hlZXRzKCk7
CiAgICAgfQogfQogCkBAIC0xODIyLDEzICsxNzk4LDEzIEBAIHZvaWQgRG9jdW1lbnQ6OnJlY2Fs
Y1N0eWxlKFN0eWxlQ2hhbmdlIGMKICAgICAvLyByZS1hdHRhY2hpbmcgb3VyIGNvbnRhaW5pbmcg
aWZyYW1lLCB3aGljaCB3aGVuIGFza2VkIEhUTUxGcmFtZUVsZW1lbnRCYXNlOjppc1VSTEFsbG93
ZWQKICAgICAvLyBoaXRzIGEgbnVsbC1kZXJlZmVyZW5jZSBkdWUgdG8gc2VjdXJpdHkgY29kZSBh
bHdheXMgYXNzdW1pbmcgdGhlIGRvY3VtZW50IGhhcyBhIFNlY3VyaXR5T3JpZ2luLgogCi0gICAg
aWYgKG1faGFzRGlydHlTdHlsZVJlc29sdmVyKQotICAgICAgICB1cGRhdGVBY3RpdmVTdHlsZXNo
ZWV0cyhSZWNhbGNTdHlsZUltbWVkaWF0ZWx5KTsKKyAgICBpZiAobV9zdHlsZVNoZWV0Q29sbGVj
dGlvbi0+bmVlZHNVcGRhdGVBY3RpdmVTdHlsZXNoZWV0c09uU3R5bGVSZWNhbGMoKSkKKyAgICAg
ICAgbV9zdHlsZVNoZWV0Q29sbGVjdGlvbi0+dXBkYXRlQWN0aXZlU3R5bGVTaGVldHMoRG9jdW1l
bnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6RnVsbFVwZGF0ZSk7CiAKICAgICBJbnNwZWN0b3JJbnN0
cnVtZW50YXRpb25Db29raWUgY29va2llID0gSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjp3aWxs
UmVjYWxjdWxhdGVTdHlsZSh0aGlzKTsKIAogICAgIGlmIChtX2VsZW1TaGVldCAmJiBtX2VsZW1T
aGVldC0+Y29udGVudHMoKS0+dXNlc1JlbVVuaXRzKCkpCi0gICAgICAgIG1fdXNlc1JlbVVuaXRz
ID0gdHJ1ZTsKKyAgICAgICAgbV9zdHlsZVNoZWV0Q29sbGVjdGlvbi0+c2V0VXNlc1JlbVVuaXQo
dHJ1ZSk7CiAKICAgICBtX2luU3R5bGVSZWNhbGMgPSB0cnVlOwogICAgIHN1c3BlbmRQb3N0QXR0
YWNoQ2FsbGJhY2tzKCk7CkBAIC0xODg0LDcgKzE4NjAsNyBAQCBiYWlsX291dDoKICAgICAKICAg
ICAvLyBQc2V1ZG8gZWxlbWVudCByZW1vdmFsIGFuZCBzaW1pbGFyIG1heSBvbmx5IHdvcmsgd2l0
aCB0aGVzZSBmbGFncyBzdGlsbCBzZXQuIFJlc2V0IHRoZW0gYWZ0ZXIgdGhlIHN0eWxlIHJlY2Fs
Yy4KICAgICBpZiAobV9zdHlsZVJlc29sdmVyKQotICAgICAgICByZXNldENTU0ZlYXR1cmVGbGFn
cygpOworICAgICAgICBtX3N0eWxlU2hlZXRDb2xsZWN0aW9uLT5yZXNldENTU0ZlYXR1cmVGbGFn
cygpOwogCiAgICAgaWYgKGZyYW1lVmlldykgewogICAgICAgICBmcmFtZVZpZXctPnJlc3VtZVNj
aGVkdWxlZEV2ZW50cygpOwpAQCAtMjA2NywzMyArMjA0MywxNiBAQCB2b2lkIERvY3VtZW50Ojpz
ZXRJc1ZpZXdTb3VyY2UoYm9vbCBpc1ZpCiAgICAgZGlkVXBkYXRlU2VjdXJpdHlPcmlnaW4oKTsK
IH0KIAotdm9pZCBEb2N1bWVudDo6Y29tYmluZUNTU0ZlYXR1cmVGbGFncygpCi17Ci0gICAgLy8g
RGVsYXkgcmVzZXR0aW5nIHRoZSBmbGFncyB1bnRpbCBhZnRlciBuZXh0IHN0eWxlIHJlY2FsYyBz
aW5jZSB1bmFwcGx5aW5nIHRoZSBzdHlsZSBtYXkgbm90IHdvcmsgd2l0aG91dCB0aGVzZSBzZXQg
KHRoaXMgaXMgdHJ1ZSBhdCBsZWFzdCB3aXRoIGJlZm9yZS9hZnRlcikuCi0gICAgbV91c2VzU2li
bGluZ1J1bGVzID0gbV91c2VzU2libGluZ1J1bGVzIHx8IG1fc3R5bGVSZXNvbHZlci0+dXNlc1Np
YmxpbmdSdWxlcygpOwotICAgIG1fdXNlc0ZpcnN0TGluZVJ1bGVzID0gbV91c2VzRmlyc3RMaW5l
UnVsZXMgfHwgbV9zdHlsZVJlc29sdmVyLT51c2VzRmlyc3RMaW5lUnVsZXMoKTsKLSAgICBtX3Vz
ZXNCZWZvcmVBZnRlclJ1bGVzID0gbV91c2VzQmVmb3JlQWZ0ZXJSdWxlcyB8fCBtX3N0eWxlUmVz
b2x2ZXItPnVzZXNCZWZvcmVBZnRlclJ1bGVzKCk7Ci0gICAgbV91c2VzTGlua1J1bGVzID0gbV91
c2VzTGlua1J1bGVzIHx8IG1fc3R5bGVSZXNvbHZlci0+dXNlc0xpbmtSdWxlcygpOwotfQotCi12
b2lkIERvY3VtZW50OjpyZXNldENTU0ZlYXR1cmVGbGFncygpCi17Ci0gICAgbV91c2VzU2libGlu
Z1J1bGVzID0gbV9zdHlsZVJlc29sdmVyLT51c2VzU2libGluZ1J1bGVzKCk7Ci0gICAgbV91c2Vz
Rmlyc3RMaW5lUnVsZXMgPSBtX3N0eWxlUmVzb2x2ZXItPnVzZXNGaXJzdExpbmVSdWxlcygpOwot
ICAgIG1fdXNlc0JlZm9yZUFmdGVyUnVsZXMgPSBtX3N0eWxlUmVzb2x2ZXItPnVzZXNCZWZvcmVB
ZnRlclJ1bGVzKCk7Ci0gICAgbV91c2VzTGlua1J1bGVzID0gbV9zdHlsZVJlc29sdmVyLT51c2Vz
TGlua1J1bGVzKCk7Ci19Ci0KIHZvaWQgRG9jdW1lbnQ6OmNyZWF0ZVN0eWxlUmVzb2x2ZXIoKQog
ewogICAgIGJvb2wgbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzID0gdHJ1ZTsKICAgICBpZiAoU2V0
dGluZ3MqIGRvY1NldHRpbmdzID0gc2V0dGluZ3MoKSkKICAgICAgICAgbWF0Y2hBdXRob3JBbmRV
c2VyU3R5bGVzID0gZG9jU2V0dGluZ3MtPmF1dGhvckFuZFVzZXJTdHlsZXNFbmFibGVkKCk7CiAg
ICAgbV9zdHlsZVJlc29sdmVyID0gYWRvcHRQdHIobmV3IFN0eWxlUmVzb2x2ZXIodGhpcywgbWF0
Y2hBdXRob3JBbmRVc2VyU3R5bGVzKSk7Ci0gICAgY29tYmluZUNTU0ZlYXR1cmVGbGFncygpOwor
ICAgIG1fc3R5bGVTaGVldENvbGxlY3Rpb24tPmNvbWJpbmVDU1NGZWF0dXJlRmxhZ3MoKTsKIH0K
IAotaW5saW5lIHZvaWQgRG9jdW1lbnQ6OmNsZWFyU3R5bGVSZXNvbHZlcigpCit2b2lkIERvY3Vt
ZW50OjpjbGVhclN0eWxlUmVzb2x2ZXIoKQogewogICAgIG1fc3R5bGVSZXNvbHZlci5jbGVhcigp
OwogfQpAQCAtMjkwMywxMDUgKzI4NjIsMjMgQEAgRnJhbWUqIERvY3VtZW50OjpmaW5kVW5zYWZl
UGFyZW50U2Nyb2xsUAogICAgIHJldHVybiAwOwogfQogCi1DU1NTdHlsZVNoZWV0KiBEb2N1bWVu
dDo6cGFnZVVzZXJTaGVldCgpCi17Ci0gICAgaWYgKG1fcGFnZVVzZXJTaGVldCkKLSAgICAgICAg
cmV0dXJuIG1fcGFnZVVzZXJTaGVldC5nZXQoKTsKLSAgICAKLSAgICBQYWdlKiBvd25pbmdQYWdl
ID0gcGFnZSgpOwotICAgIGlmICghb3duaW5nUGFnZSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAg
Ci0gICAgU3RyaW5nIHVzZXJTaGVldFRleHQgPSBvd25pbmdQYWdlLT51c2VyU3R5bGVTaGVldCgp
OwotICAgIGlmICh1c2VyU2hlZXRUZXh0LmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0g
ICAgCi0gICAgLy8gUGFyc2UgdGhlIHNoZWV0IGFuZCBjYWNoZSBpdC4KLSAgICBtX3BhZ2VVc2Vy
U2hlZXQgPSBDU1NTdHlsZVNoZWV0OjpjcmVhdGVJbmxpbmUodGhpcywgc2V0dGluZ3MoKS0+dXNl
clN0eWxlU2hlZXRMb2NhdGlvbigpKTsKLSAgICBtX3BhZ2VVc2VyU2hlZXQtPmNvbnRlbnRzKCkt
PnNldElzVXNlclN0eWxlU2hlZXQodHJ1ZSk7Ci0gICAgbV9wYWdlVXNlclNoZWV0LT5jb250ZW50
cygpLT5wYXJzZVN0cmluZyh1c2VyU2hlZXRUZXh0KTsKLSAgICByZXR1cm4gbV9wYWdlVXNlclNo
ZWV0LmdldCgpOwotfQotCi12b2lkIERvY3VtZW50OjpjbGVhclBhZ2VVc2VyU2hlZXQoKQotewot
ICAgIGlmIChtX3BhZ2VVc2VyU2hlZXQpIHsKLSAgICAgICAgbV9wYWdlVXNlclNoZWV0ID0gMDsK
LSAgICAgICAgc3R5bGVSZXNvbHZlckNoYW5nZWQoRGVmZXJSZWNhbGNTdHlsZSk7Ci0gICAgfQot
fQotCi12b2lkIERvY3VtZW50Ojp1cGRhdGVQYWdlVXNlclNoZWV0KCkKLXsKLSAgICBjbGVhclBh
Z2VVc2VyU2hlZXQoKTsKLSAgICBpZiAocGFnZVVzZXJTaGVldCgpKQotICAgICAgICBzdHlsZVJl
c29sdmVyQ2hhbmdlZChSZWNhbGNTdHlsZUltbWVkaWF0ZWx5KTsKLX0KIAotY29uc3QgVmVjdG9y
PFJlZlB0cjxDU1NTdHlsZVNoZWV0PiA+KiBEb2N1bWVudDo6cGFnZUdyb3VwVXNlclNoZWV0cygp
IGNvbnN0Cit2b2lkIERvY3VtZW50OjpzZWFtbGVzc1BhcmVudFVwZGF0ZWRTdHlsZXNoZWV0cygp
CiB7Ci0gICAgaWYgKG1fcGFnZUdyb3VwVXNlclNoZWV0Q2FjaGVWYWxpZCkKLSAgICAgICAgcmV0
dXJuIG1fcGFnZUdyb3VwVXNlclNoZWV0cy5nZXQoKTsKLSAgICAKLSAgICBtX3BhZ2VHcm91cFVz
ZXJTaGVldENhY2hlVmFsaWQgPSB0cnVlOwotICAgIAotICAgIFBhZ2UqIG93bmluZ1BhZ2UgPSBw
YWdlKCk7Ci0gICAgaWYgKCFvd25pbmdQYWdlKQotICAgICAgICByZXR1cm4gMDsKLSAgICAgICAg
Ci0gICAgY29uc3QgUGFnZUdyb3VwJiBwYWdlR3JvdXAgPSBvd25pbmdQYWdlLT5ncm91cCgpOwot
ICAgIGNvbnN0IFVzZXJTdHlsZVNoZWV0TWFwKiBzaGVldHNNYXAgPSBwYWdlR3JvdXAudXNlclN0
eWxlU2hlZXRzKCk7Ci0gICAgaWYgKCFzaGVldHNNYXApCi0gICAgICAgIHJldHVybiAwOwotCi0g
ICAgVXNlclN0eWxlU2hlZXRNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IHNoZWV0c01hcC0+ZW5k
KCk7Ci0gICAgZm9yIChVc2VyU3R5bGVTaGVldE1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzaGVl
dHNNYXAtPmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICBjb25zdCBVc2VyU3R5
bGVTaGVldFZlY3Rvciogc2hlZXRzID0gaXQtPnNlY29uZC5nZXQoKTsKLSAgICAgICAgZm9yICh1
bnNpZ25lZCBpID0gMDsgaSA8IHNoZWV0cy0+c2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIGNv
bnN0IFVzZXJTdHlsZVNoZWV0KiBzaGVldCA9IHNoZWV0cy0+YXQoaSkuZ2V0KCk7Ci0gICAgICAg
ICAgICBpZiAoc2hlZXQtPmluamVjdGVkRnJhbWVzKCkgPT0gSW5qZWN0SW5Ub3BGcmFtZU9ubHkg
JiYgb3duZXJFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAg
ICBpZiAoIVVzZXJDb250ZW50VVJMUGF0dGVybjo6bWF0Y2hlc1BhdHRlcm5zKHVybCgpLCBzaGVl
dC0+d2hpdGVsaXN0KCksIHNoZWV0LT5ibGFja2xpc3QoKSkpCi0gICAgICAgICAgICAgICAgY29u
dGludWU7Ci0gICAgICAgICAgICBSZWZQdHI8Q1NTU3R5bGVTaGVldD4gZ3JvdXBTaGVldCA9IENT
U1N0eWxlU2hlZXQ6OmNyZWF0ZUlubGluZShjb25zdF9jYXN0PERvY3VtZW50Kj4odGhpcyksIHNo
ZWV0LT51cmwoKSk7Ci0gICAgICAgICAgICBpZiAoIW1fcGFnZUdyb3VwVXNlclNoZWV0cykKLSAg
ICAgICAgICAgICAgICBtX3BhZ2VHcm91cFVzZXJTaGVldHMgPSBhZG9wdFB0cihuZXcgVmVjdG9y
PFJlZlB0cjxDU1NTdHlsZVNoZWV0PiA+KTsKLSAgICAgICAgICAgIG1fcGFnZUdyb3VwVXNlclNo
ZWV0cy0+YXBwZW5kKGdyb3VwU2hlZXQpOwotICAgICAgICAgICAgZ3JvdXBTaGVldC0+Y29udGVu
dHMoKS0+c2V0SXNVc2VyU3R5bGVTaGVldChzaGVldC0+bGV2ZWwoKSA9PSBVc2VyU3R5bGVVc2Vy
TGV2ZWwpOwotICAgICAgICAgICAgZ3JvdXBTaGVldC0+Y29udGVudHMoKS0+cGFyc2VTdHJpbmco
c2hlZXQtPnNvdXJjZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBtX3BhZ2VH
cm91cFVzZXJTaGVldHMuZ2V0KCk7CisgICAgc3R5bGVSZXNvbHZlckNoYW5nZWQoUmVjYWxjU3R5
bGVJbW1lZGlhdGVseSk7CiB9CiAKLXZvaWQgRG9jdW1lbnQ6OmNsZWFyUGFnZUdyb3VwVXNlclNo
ZWV0cygpCit2b2lkIERvY3VtZW50OjpkaWRSZW1vdmVBbGxQZW5kaW5nU3R5bGVzaGVldCgpCiB7
Ci0gICAgbV9wYWdlR3JvdXBVc2VyU2hlZXRDYWNoZVZhbGlkID0gZmFsc2U7Ci0gICAgaWYgKG1f
cGFnZUdyb3VwVXNlclNoZWV0cyAmJiBtX3BhZ2VHcm91cFVzZXJTaGVldHMtPnNpemUoKSkgewot
ICAgICAgICBtX3BhZ2VHcm91cFVzZXJTaGVldHMtPmNsZWFyKCk7Ci0gICAgICAgIHN0eWxlUmVz
b2x2ZXJDaGFuZ2VkKERlZmVyUmVjYWxjU3R5bGUpOwotICAgIH0KLX0KKyAgICBtX25lZWRzTm90
aWZ5UmVtb3ZlQWxsUGVuZGluZ1N0eWxlc2hlZXQgPSBmYWxzZTsKIAotdm9pZCBEb2N1bWVudDo6
dXBkYXRlUGFnZUdyb3VwVXNlclNoZWV0cygpCi17Ci0gICAgY2xlYXJQYWdlR3JvdXBVc2VyU2hl
ZXRzKCk7Ci0gICAgaWYgKHBhZ2VHcm91cFVzZXJTaGVldHMoKSAmJiBwYWdlR3JvdXBVc2VyU2hl
ZXRzKCktPnNpemUoKSkKLSAgICAgICAgc3R5bGVSZXNvbHZlckNoYW5nZWQoUmVjYWxjU3R5bGVJ
bW1lZGlhdGVseSk7Ci19CisgICAgc3R5bGVSZXNvbHZlckNoYW5nZWQoUmVjYWxjU3R5bGVJZk5l
ZWRlZCk7CiAKLXZvaWQgRG9jdW1lbnQ6OmFkZFVzZXJTaGVldChQYXNzUmVmUHRyPFN0eWxlU2hl
ZXRDb250ZW50cz4gdXNlclNoZWV0KQotewotICAgIGlmICghbV91c2VyU2hlZXRzKQotICAgICAg
ICBtX3VzZXJTaGVldHMgPSBhZG9wdFB0cihuZXcgVmVjdG9yPFJlZlB0cjxDU1NTdHlsZVNoZWV0
PiA+KTsKLSAgICBtX3VzZXJTaGVldHMtPmFwcGVuZChDU1NTdHlsZVNoZWV0OjpjcmVhdGUodXNl
clNoZWV0LCB0aGlzKSk7Ci0gICAgc3R5bGVSZXNvbHZlckNoYW5nZWQoUmVjYWxjU3R5bGVJbW1l
ZGlhdGVseSk7Ci19CisgICAgaWYgKFNjcmlwdGFibGVEb2N1bWVudFBhcnNlciogcGFyc2VyID0g
c2NyaXB0YWJsZURvY3VtZW50UGFyc2VyKCkpCisgICAgICAgIHBhcnNlci0+ZXhlY3V0ZVNjcmlw
dHNXYWl0aW5nRm9yU3R5bGVzaGVldHMoKTsKIAotdm9pZCBEb2N1bWVudDo6c2VhbWxlc3NQYXJl
bnRVcGRhdGVkU3R5bGVzaGVldHMoKQotewotICAgIHN0eWxlUmVzb2x2ZXJDaGFuZ2VkKFJlY2Fs
Y1N0eWxlSW1tZWRpYXRlbHkpOworICAgIGlmIChtX2dvdG9BbmNob3JOZWVkZWRBZnRlclN0eWxl
c2hlZXRzTG9hZCAmJiB2aWV3KCkpCisgICAgICAgIHZpZXcoKS0+c2Nyb2xsVG9GcmFnbWVudCht
X3VybCk7CiB9CiAKIENTU1N0eWxlU2hlZXQqIERvY3VtZW50OjplbGVtZW50U2hlZXQoKQpAQCAt
MzA0Miw4ICsyOTE5LDggQEAgdm9pZCBEb2N1bWVudDo6cHJvY2Vzc0h0dHBFcXVpdihjb25zdCBT
dAogICAgICAgICAvLyBGb3IgbW9yZSBpbmZvLCBzZWUgdGhlIHRlc3QgYXQ6CiAgICAgICAgIC8v
IGh0dHA6Ly93d3cuaGl4aWUuY2gvdGVzdHMvZXZpbC9jc3MvaW1wb3J0L21haW4vcHJlZmVycmVk
Lmh0bWwKICAgICAgICAgLy8gLWR3aAotICAgICAgICBtX3NlbGVjdGVkU3R5bGVzaGVldFNldCA9
IGNvbnRlbnQ7Ci0gICAgICAgIG1fcHJlZmVycmVkU3R5bGVzaGVldFNldCA9IGNvbnRlbnQ7Cisg
ICAgICAgIG1fc3R5bGVTaGVldENvbGxlY3Rpb24tPnNldFNlbGVjdGVkU3R5bGVzaGVldFNldE5h
bWUoY29udGVudCk7CisgICAgICAgIG1fc3R5bGVTaGVldENvbGxlY3Rpb24tPnNldFByZWZlcnJl
ZFN0eWxlc2hlZXRTZXROYW1lKGNvbnRlbnQpOwogICAgICAgICBzdHlsZVJlc29sdmVyQ2hhbmdl
ZChEZWZlclJlY2FsY1N0eWxlKTsKICAgICB9IGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGVx
dWl2LCAicmVmcmVzaCIpKSB7CiAgICAgICAgIGRvdWJsZSBkZWxheTsKQEAgLTMzMTUsNjMgKzMx
OTIsMjUgQEAgUGFzc1JlZlB0cjxOb2RlPiBEb2N1bWVudDo6Y2xvbmVOb2RlKGJvbwogCiBTdHls
ZVNoZWV0TGlzdCogRG9jdW1lbnQ6OnN0eWxlU2hlZXRzKCkKIHsKLSAgICByZXR1cm4gbV9zdHls
ZVNoZWV0cy5nZXQoKTsKKyAgICByZXR1cm4gbV9zdHlsZVNoZWV0Q29sbGVjdGlvbi0+YXV0aG9y
U3R5bGVTaGVldHMoKTsKIH0KIAogU3RyaW5nIERvY3VtZW50OjpwcmVmZXJyZWRTdHlsZXNoZWV0
U2V0KCkgY29uc3QKIHsKLSAgICByZXR1cm4gbV9wcmVmZXJyZWRTdHlsZXNoZWV0U2V0OworICAg
IHJldHVybiBtX3N0eWxlU2hlZXRDb2xsZWN0aW9uLT5wcmVmZXJyZWRTdHlsZXNoZWV0U2V0TmFt
ZSgpOwogfQogCiBTdHJpbmcgRG9jdW1lbnQ6OnNlbGVjdGVkU3R5bGVzaGVldFNldCgpIGNvbnN0
CiB7Ci0gICAgcmV0dXJuIG1fc2VsZWN0ZWRTdHlsZXNoZWV0U2V0OworICAgIHJldHVybiBtX3N0
eWxlU2hlZXRDb2xsZWN0aW9uLT5zZWxlY3RlZFN0eWxlc2hlZXRTZXROYW1lKCk7CiB9CiAKIHZv
aWQgRG9jdW1lbnQ6OnNldFNlbGVjdGVkU3R5bGVzaGVldFNldChjb25zdCBTdHJpbmcmIGFTdHJp
bmcpCiB7Ci0gICAgbV9zZWxlY3RlZFN0eWxlc2hlZXRTZXQgPSBhU3RyaW5nOworICAgIG1fc3R5
bGVTaGVldENvbGxlY3Rpb24tPnNldFNlbGVjdGVkU3R5bGVzaGVldFNldE5hbWUoYVN0cmluZyk7
CiAgICAgc3R5bGVSZXNvbHZlckNoYW5nZWQoRGVmZXJSZWNhbGNTdHlsZSk7CiB9CiAKLS8vIFRo
aXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuZXZlciBhIHRvcC1sZXZlbCBzdHlsZXNoZWV0IGhhcyBm
aW5pc2hlZCBsb2FkaW5nLgotdm9pZCBEb2N1bWVudDo6cmVtb3ZlUGVuZGluZ1NoZWV0KFJlbW92
ZVBlbmRpbmdTaGVldE5vdGlmaWNhdGlvblR5cGUgbm90aWZpY2F0aW9uKQotewotICAgIC8vIE1h
a2Ugc3VyZSB3ZSBrbmV3IHRoaXMgc2hlZXQgd2FzIHBlbmRpbmcsIGFuZCB0aGF0IG91ciBjb3Vu
dCBpc24ndCBvdXQgb2Ygc3luYy4KLSAgICBBU1NFUlQobV9wZW5kaW5nU3R5bGVzaGVldHMgPiAw
KTsKLQotICAgIG1fcGVuZGluZ1N0eWxlc2hlZXRzLS07Ci0gICAgCi0jaWZkZWYgSU5TVFJVTUVO
VF9MQVlPVVRfU0NIRURVTElORwotICAgIGlmICghb3duZXJFbGVtZW50KCkpCi0gICAgICAgIHBy
aW50ZigiU3R5bGVzaGVldCBsb2FkZWQgYXQgdGltZSAlZC4gJWQgc3R5bGVzaGVldHMgc3RpbGwg
cmVtYWluLlxuIiwgZWxhcHNlZFRpbWUoKSwgbV9wZW5kaW5nU3R5bGVzaGVldHMpOwotI2VuZGlm
Ci0KLSAgICBpZiAobV9wZW5kaW5nU3R5bGVzaGVldHMpCi0gICAgICAgIHJldHVybjsKLQotICAg
IGlmIChub3RpZmljYXRpb24gPT0gUmVtb3ZlUGVuZGluZ1NoZWV0Tm90aWZ5TGF0ZXIpIHsKLSAg
ICAgICAgc2V0TmVlZHNOb3RpZnlSZW1vdmVBbGxQZW5kaW5nU3R5bGVzaGVldCgpOwotICAgICAg
ICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIGRpZFJlbW92ZUFsbFBlbmRpbmdTdHlsZXNoZWV0
KCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmRpZFJlbW92ZUFsbFBlbmRpbmdTdHlsZXNoZWV0KCkK
LXsKLSAgICBtX25lZWRzTm90aWZ5UmVtb3ZlQWxsUGVuZGluZ1N0eWxlc2hlZXQgPSBmYWxzZTsK
LQotICAgIHN0eWxlUmVzb2x2ZXJDaGFuZ2VkKFJlY2FsY1N0eWxlSWZOZWVkZWQpOwotCi0gICAg
aWYgKFNjcmlwdGFibGVEb2N1bWVudFBhcnNlciogcGFyc2VyID0gc2NyaXB0YWJsZURvY3VtZW50
UGFyc2VyKCkpCi0gICAgICAgIHBhcnNlci0+ZXhlY3V0ZVNjcmlwdHNXYWl0aW5nRm9yU3R5bGVz
aGVldHMoKTsKLQotICAgIGlmIChtX2dvdG9BbmNob3JOZWVkZWRBZnRlclN0eWxlc2hlZXRzTG9h
ZCAmJiB2aWV3KCkpCi0gICAgICAgIHZpZXcoKS0+c2Nyb2xsVG9GcmFnbWVudChtX3VybCk7Ci19
Ci0KLQogdm9pZCBEb2N1bWVudDo6ZXZhbHVhdGVNZWRpYVF1ZXJ5TGlzdCgpCiB7CiAgICAgaWYg
KG1fbWVkaWFRdWVyeU1hdGNoZXIpCkBAIC0zMzg2LDIwICszMjI1LDI0IEBAIHZvaWQgRG9jdW1l
bnQ6OnN0eWxlUmVzb2x2ZXJDaGFuZ2VkKFN0eWwKICAgICAgICAgbV9zdHlsZVJlc29sdmVyLmNs
ZWFyKCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CisgICAgbV9kaWRDYWxjdWxhdGVTdHlsZVJl
c29sdmVyID0gdHJ1ZTsKIAogI2lmZGVmIElOU1RSVU1FTlRfTEFZT1VUX1NDSEVEVUxJTkcKICAg
ICBpZiAoIW93bmVyRWxlbWVudCgpKQogICAgICAgICBwcmludGYoIkJlZ2lubmluZyB1cGRhdGUg
b2Ygc3R5bGUgc2VsZWN0b3IgYXQgdGltZSAlZC5cbiIsIGVsYXBzZWRUaW1lKCkpOwogI2VuZGlm
CiAKLSAgICBib29sIHN0eWxlc2hlZXRDaGFuZ2VSZXF1aXJlc1N0eWxlUmVjYWxjID0gdXBkYXRl
QWN0aXZlU3R5bGVzaGVldHModXBkYXRlRmxhZyk7CisgICAgRG9jdW1lbnRTdHlsZVNoZWV0Q29s
bGVjdGlvbjo6VXBkYXRlRmxhZyBzdHlsZVNoZWV0VXBkYXRlID0gKHVwZGF0ZUZsYWcgPT0gUmVj
YWxjU3R5bGVJZk5lZWRlZCkKKyAgICAgICAgPyBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9u
OjpPcHRpbWl6ZWRVcGRhdGUKKyAgICAgICAgOiBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9u
OjpGdWxsVXBkYXRlOworICAgIGJvb2wgc3R5bGVzaGVldENoYW5nZVJlcXVpcmVzU3R5bGVSZWNh
bGMgPSBtX3N0eWxlU2hlZXRDb2xsZWN0aW9uLT51cGRhdGVBY3RpdmVTdHlsZVNoZWV0cyhzdHls
ZVNoZWV0VXBkYXRlKTsKIAogICAgIGlmICh1cGRhdGVGbGFnID09IERlZmVyUmVjYWxjU3R5bGUp
IHsKICAgICAgICAgc2NoZWR1bGVGb3JjZWRTdHlsZVJlY2FsYygpOwogICAgICAgICByZXR1cm47
CiAgICAgfQogCi0gICAgaWYgKGRpZExheW91dFdpdGhQZW5kaW5nU3R5bGVzaGVldHMoKSAmJiBt
X3BlbmRpbmdTdHlsZXNoZWV0cyA8PSAwKSB7CisgICAgaWYgKGRpZExheW91dFdpdGhQZW5kaW5n
U3R5bGVzaGVldHMoKSAmJiAhbV9zdHlsZVNoZWV0Q29sbGVjdGlvbi0+aGFzUGVuZGluZ1NoZWV0
cygpKSB7CiAgICAgICAgIG1fcGVuZGluZ1NoZWV0TGF5b3V0ID0gSWdub3JlTGF5b3V0V2l0aFBl
bmRpbmdTaGVldHM7CiAgICAgICAgIGlmIChyZW5kZXJlcigpKQogICAgICAgICAgICAgcmVuZGVy
ZXIoKS0+cmVwYWludCgpOwpAQCAtMzQyOSwyMTkgKzMyNzIsNiBAQCB2b2lkIERvY3VtZW50Ojpz
dHlsZVJlc29sdmVyQ2hhbmdlZChTdHlsCiAgICAgZXZhbHVhdGVNZWRpYVF1ZXJ5TGlzdCgpOwog
fQogCi12b2lkIERvY3VtZW50OjphZGRTdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZShOb2RlKiBub2Rl
LCBib29sIGNyZWF0ZWRCeVBhcnNlcikKLXsKLSAgICBpZiAoIW5vZGUtPmluRG9jdW1lbnQoKSkK
LSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIC8vIFVudGlsIHRoZSA8Ym9keT4gZXhpc3RzLCB3
ZSBoYXZlIG5vIGNob2ljZSBidXQgdG8gY29tcGFyZSBkb2N1bWVudCBwb3NpdGlvbnMsCi0gICAg
Ly8gc2luY2Ugc3R5bGVzIG91dHNpZGUgb2YgdGhlIGJvZHkgYW5kIGhlYWQgY29udGludWUgdG8g
YmUgc2h1bnRlZCBpbnRvIHRoZSBoZWFkCi0gICAgLy8gKGFuZCB0aHVzIGNhbiBzaGlmdCB0byBl
bmQgdXAgYmVmb3JlIGR5bmFtaWNhbGx5IGFkZGVkIERPTSBjb250ZW50IHRoYXQgaXMgYWxzbwot
ICAgIC8vIG91dHNpZGUgdGhlIGJvZHkpLgotICAgIGlmICgoY3JlYXRlZEJ5UGFyc2VyICYmIGJv
ZHkoKSkgfHwgbV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAg
IG1fc3R5bGVTaGVldENhbmRpZGF0ZU5vZGVzLmFkZChub2RlKTsKLSAgICAgICAgcmV0dXJuOwot
ICAgIH0KLQotICAgIC8vIERldGVybWluZSBhbiBhcHByb3ByaWF0ZSBpbnNlcnRpb24gcG9pbnQu
Ci0gICAgU3R5bGVTaGVldENhbmRpZGF0ZUxpc3RIYXNoU2V0OjppdGVyYXRvciBiZWdpbiA9IG1f
c3R5bGVTaGVldENhbmRpZGF0ZU5vZGVzLmJlZ2luKCk7Ci0gICAgU3R5bGVTaGVldENhbmRpZGF0
ZUxpc3RIYXNoU2V0OjppdGVyYXRvciBlbmQgPSBtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcy5l
bmQoKTsKLSAgICBTdHlsZVNoZWV0Q2FuZGlkYXRlTGlzdEhhc2hTZXQ6Oml0ZXJhdG9yIGl0ID0g
ZW5kOwotICAgIE5vZGUqIGZvbGxvd2luZ05vZGUgPSAwOwotICAgIGRvIHsKLSAgICAgICAgLS1p
dDsKLSAgICAgICAgTm9kZSogbiA9ICppdDsKLSAgICAgICAgdW5zaWduZWQgc2hvcnQgcG9zaXRp
b24gPSBuLT5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihub2RlKTsKLSAgICAgICAgaWYgKHBvc2l0
aW9uID09IERPQ1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lORykgewotICAgICAgICAgICAgbV9zdHls
ZVNoZWV0Q2FuZGlkYXRlTm9kZXMuaW5zZXJ0QmVmb3JlKGZvbGxvd2luZ05vZGUsIG5vZGUpOwot
ICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZvbGxvd2luZ05vZGUgPSBu
OwotICAgIH0gd2hpbGUgKGl0ICE9IGJlZ2luKTsKLSAgICAKLSAgICBtX3N0eWxlU2hlZXRDYW5k
aWRhdGVOb2Rlcy5pbnNlcnRCZWZvcmUoZm9sbG93aW5nTm9kZSwgbm9kZSk7Ci19Ci0KLXZvaWQg
RG9jdW1lbnQ6OnJlbW92ZVN0eWxlU2hlZXRDYW5kaWRhdGVOb2RlKE5vZGUqIG5vZGUpCi17Ci0g
ICAgbV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMucmVtb3ZlKG5vZGUpOwotfQotCi12b2lkIERv
Y3VtZW50Ojpjb2xsZWN0QWN0aXZlU3R5bGVzaGVldHMoVmVjdG9yPFJlZlB0cjxTdHlsZVNoZWV0
PiA+JiBzaGVldHMpCi17Ci0gICAgaWYgKHNldHRpbmdzKCkgJiYgIXNldHRpbmdzKCktPmF1dGhv
ckFuZFVzZXJTdHlsZXNFbmFibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIFN0eWxlU2hl
ZXRDYW5kaWRhdGVMaXN0SGFzaFNldDo6aXRlcmF0b3IgYmVnaW4gPSBtX3N0eWxlU2hlZXRDYW5k
aWRhdGVOb2Rlcy5iZWdpbigpOwotICAgIFN0eWxlU2hlZXRDYW5kaWRhdGVMaXN0SGFzaFNldDo6
aXRlcmF0b3IgZW5kID0gbV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMuZW5kKCk7Ci0gICAgZm9y
IChTdHlsZVNoZWV0Q2FuZGlkYXRlTGlzdEhhc2hTZXQ6Oml0ZXJhdG9yIGl0ID0gYmVnaW47IGl0
ICE9IGVuZDsgKytpdCkgewotICAgICAgICBOb2RlKiBuID0gKml0OwotICAgICAgICBTdHlsZVNo
ZWV0KiBzaGVldCA9IDA7Ci0gICAgICAgIGlmIChuLT5ub2RlVHlwZSgpID09IFBST0NFU1NJTkdf
SU5TVFJVQ1RJT05fTk9ERSkgewotICAgICAgICAgICAgLy8gUHJvY2Vzc2luZyBpbnN0cnVjdGlv
biAoWE1MIGRvY3VtZW50cyBvbmx5KS4KLSAgICAgICAgICAgIC8vIFdlIGRvbid0IHN1cHBvcnQg
bGlua2luZyB0byBlbWJlZGRlZCBDU1Mgc3R5bGVzaGVldHMsIHNlZSA8aHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQ5MjgxPiBmb3IgZGlzY3Vzc2lvbi4KLSAgICAgICAg
ICAgIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiogcGkgPSBzdGF0aWNfY2FzdDxQcm9jZXNzaW5nSW5z
dHJ1Y3Rpb24qPihuKTsKLSAgICAgICAgICAgIHNoZWV0ID0gcGktPnNoZWV0KCk7Ci0jaWYgRU5B
QkxFKFhTTFQpCi0gICAgICAgICAgICAvLyBEb24ndCBhcHBseSBYU0wgdHJhbnNmb3JtcyB0byBh
bHJlYWR5IHRyYW5zZm9ybWVkIGRvY3VtZW50cyAtLSA8cmRhcjovL3Byb2JsZW0vNDEzMjgwNj4K
LSAgICAgICAgICAgIGlmIChwaS0+aXNYU0woKSAmJiAhdHJhbnNmb3JtU291cmNlRG9jdW1lbnQo
KSkgewotICAgICAgICAgICAgICAgIC8vIERvbid0IGFwcGx5IFhTTCB0cmFuc2Zvcm1zIHVudGls
IGxvYWRpbmcgaXMgZmluaXNoZWQuCi0gICAgICAgICAgICAgICAgaWYgKCFwYXJzaW5nKCkpCi0g
ICAgICAgICAgICAgICAgICAgIGFwcGx5WFNMVHJhbnNmb3JtKHBpKTsKLSAgICAgICAgICAgICAg
ICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgfSBlbHNlIGlmICgobi0+
aXNIVE1MRWxlbWVudCgpICYmIChuLT5oYXNUYWdOYW1lKGxpbmtUYWcpIHx8IG4tPmhhc1RhZ05h
bWUoc3R5bGVUYWcpKSkKLSNpZiBFTkFCTEUoU1ZHKQotICAgICAgICAgICAgICAgICAgIHx8ICAo
bi0+aXNTVkdFbGVtZW50KCkgJiYgbi0+aGFzVGFnTmFtZShTVkdOYW1lczo6c3R5bGVUYWcpKQot
I2VuZGlmCi0gICAgICAgICAgICAgICAgICAgKSB7Ci0gICAgICAgICAgICBFbGVtZW50KiBlID0g
c3RhdGljX2Nhc3Q8RWxlbWVudCo+KG4pOwotICAgICAgICAgICAgQXRvbWljU3RyaW5nIHRpdGxl
ID0gZS0+Z2V0QXR0cmlidXRlKHRpdGxlQXR0cik7Ci0gICAgICAgICAgICBib29sIGVuYWJsZWRW
aWFTY3JpcHQgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChlLT5oYXNMb2NhbE5hbWUobGlua1Rh
ZykpIHsKLSAgICAgICAgICAgICAgICAvLyA8TElOSz4gZWxlbWVudAotICAgICAgICAgICAgICAg
IEhUTUxMaW5rRWxlbWVudCogbGlua0VsZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MTGlua0VsZW1l
bnQqPihuKTsKLSAgICAgICAgICAgICAgICBpZiAobGlua0VsZW1lbnQtPmlzRGlzYWJsZWQoKSkK
LSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgZW5hYmxlZFZp
YVNjcmlwdCA9IGxpbmtFbGVtZW50LT5pc0VuYWJsZWRWaWFTY3JpcHQoKTsKLSAgICAgICAgICAg
ICAgICBpZiAobGlua0VsZW1lbnQtPnN0eWxlU2hlZXRJc0xvYWRpbmcoKSkgewotICAgICAgICAg
ICAgICAgICAgICAvLyBpdCBpcyBsb2FkaW5nIGJ1dCB3ZSBzaG91bGQgc3RpbGwgZGVjaWRlIHdo
aWNoIHN0eWxlIHNoZWV0IHNldCB0byB1c2UKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFlbmFi
bGVkVmlhU2NyaXB0ICYmICF0aXRsZS5pc0VtcHR5KCkgJiYgbV9wcmVmZXJyZWRTdHlsZXNoZWV0
U2V0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXRvbWljU3Ry
aW5nJiByZWwgPSBlLT5nZXRBdHRyaWJ1dGUocmVsQXR0cik7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICBpZiAoIXJlbC5jb250YWlucygiYWx0ZXJuYXRlIikpIHsKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBtX3ByZWZlcnJlZFN0eWxlc2hlZXRTZXQgPSB0aXRsZTsKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBtX3NlbGVjdGVkU3R5bGVzaGVldFNldCA9IHRpdGxlOwotICAgICAg
ICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAo
IWxpbmtFbGVtZW50LT5zaGVldCgpKQotICAgICAgICAgICAgICAgICAgICB0aXRsZSA9IG51bGxB
dG9tOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gR2V0IHRoZSBjdXJyZW50IHByZWZl
cnJlZCBzdHlsZXNldC4gIFRoaXMgaXMgdGhlCi0gICAgICAgICAgICAvLyBzZXQgb2Ygc2hlZXRz
IHRoYXQgd2lsbCBiZSBlbmFibGVkLgotI2lmIEVOQUJMRShTVkcpCi0gICAgICAgICAgICBpZiAo
bi0+aXNTVkdFbGVtZW50KCkgJiYgbi0+aGFzVGFnTmFtZShTVkdOYW1lczo6c3R5bGVUYWcpKQot
ICAgICAgICAgICAgICAgIHNoZWV0ID0gc3RhdGljX2Nhc3Q8U1ZHU3R5bGVFbGVtZW50Kj4obikt
PnNoZWV0KCk7Ci0gICAgICAgICAgICBlbHNlCi0jZW5kaWYKLSAgICAgICAgICAgIGlmIChlLT5o
YXNMb2NhbE5hbWUobGlua1RhZykpCi0gICAgICAgICAgICAgICAgc2hlZXQgPSBzdGF0aWNfY2Fz
dDxIVE1MTGlua0VsZW1lbnQqPihuKS0+c2hlZXQoKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAg
ICAgICAgICAgICAvLyA8U1RZTEU+IGVsZW1lbnQKLSAgICAgICAgICAgICAgICBzaGVldCA9IHN0
YXRpY19jYXN0PEhUTUxTdHlsZUVsZW1lbnQqPihuKS0+c2hlZXQoKTsKLSAgICAgICAgICAgIC8v
IENoZWNrIHRvIHNlZSBpZiB0aGlzIHNoZWV0IGJlbG9uZ3MgdG8gYSBzdHlsZXNldAotICAgICAg
ICAgICAgLy8gKHRodXMgbWFraW5nIGl0IFBSRUZFUlJFRCBvciBBTFRFUk5BVEUgcmF0aGVyIHRo
YW4KLSAgICAgICAgICAgIC8vIFBFUlNJU1RFTlQpLgotICAgICAgICAgICAgQXRvbWljU3RyaW5n
IHJlbCA9IGUtPmdldEF0dHJpYnV0ZShyZWxBdHRyKTsKLSAgICAgICAgICAgIGlmICghZW5hYmxl
ZFZpYVNjcmlwdCAmJiAhdGl0bGUuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gWWVz
LCB3ZSBoYXZlIGEgdGl0bGUuCi0gICAgICAgICAgICAgICAgaWYgKG1fcHJlZmVycmVkU3R5bGVz
aGVldFNldC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gTm8gcHJlZmVycmVk
IHNldCBoYXMgYmVlbiBlc3RhYmxpc2hlZC4gIElmCi0gICAgICAgICAgICAgICAgICAgIC8vIHdl
IGFyZSBOT1QgYW4gYWx0ZXJuYXRlIHNoZWV0LCB0aGVuIGVzdGFibGlzaAotICAgICAgICAgICAg
ICAgICAgICAvLyB1cyBhcyB0aGUgcHJlZmVycmVkIHNldC4gIE90aGVyd2lzZSwganVzdCBpZ25v
cmUKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBzaGVldC4KLSAgICAgICAgICAgICAgICAg
ICAgaWYgKGUtPmhhc0xvY2FsTmFtZShzdHlsZVRhZykgfHwgIXJlbC5jb250YWlucygiYWx0ZXJu
YXRlIikpCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3ByZWZlcnJlZFN0eWxlc2hlZXRTZXQg
PSBtX3NlbGVjdGVkU3R5bGVzaGVldFNldCA9IHRpdGxlOwotICAgICAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgICAgICBpZiAodGl0bGUgIT0gbV9wcmVmZXJyZWRTdHlsZXNoZWV0U2V0KQotICAg
ICAgICAgICAgICAgICAgICBzaGVldCA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAg
IGlmIChyZWwuY29udGFpbnMoImFsdGVybmF0ZSIpICYmIHRpdGxlLmlzRW1wdHkoKSkKLSAgICAg
ICAgICAgICAgICBzaGVldCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNoZWV0KQotICAg
ICAgICAgICAgc2hlZXRzLmFwcGVuZChzaGVldCk7Ci0gICAgfQotfQotCi1ib29sIERvY3VtZW50
Ojp0ZXN0QWRkZWRTdHlsZXNoZWV0UmVxdWlyZXNTdHlsZVJlY2FsYyhTdHlsZVNoZWV0Q29udGVu
dHMqIHN0eWxlc2hlZXQpCi17Ci0gICAgLy8gU2VlIGlmIGFsbCBydWxlcyBvbiB0aGUgc2hlZXQg
YXJlIHNjb3BlZCB0byBzb21lIHNwZWNpZmljIGlkcyBvciBjbGFzc2VzLgotICAgIC8vIFRoZW4g
dGVzdCBpZiB3ZSBhY3R1YWxseSBoYXZlIGFueSBvZiB0aG9zZSBpbiB0aGUgdHJlZSBhdCB0aGUg
bW9tZW50LgotICAgIEhhc2hTZXQ8QXRvbWljU3RyaW5nSW1wbCo+IGlkU2NvcGVzOyAKLSAgICBI
YXNoU2V0PEF0b21pY1N0cmluZ0ltcGwqPiBjbGFzc1Njb3BlczsKLSAgICBpZiAoIVN0eWxlUmVz
b2x2ZXI6OmRldGVybWluZVN0eWxlc2hlZXRTZWxlY3RvclNjb3BlcyhzdHlsZXNoZWV0LCBpZFNj
b3BlcywgY2xhc3NTY29wZXMpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAvLyBJbnZhbGlk
YXRlIHRoZSBzdWJ0cmVlcyB0aGF0IG1hdGNoIHRoZSBzY29wZXMuCi0gICAgTm9kZSogbm9kZSA9
IGZpcnN0Q2hpbGQoKTsKLSAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBpZiAoIW5vZGUtPmlz
U3R5bGVkRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICBub2RlID0gbm9kZS0+dHJhdmVyc2VOZXh0
Tm9kZSgpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgU3R5bGVk
RWxlbWVudCogZWxlbWVudCA9IHN0YXRpY19jYXN0PFN0eWxlZEVsZW1lbnQqPihub2RlKTsKLSAg
ICAgICAgaWYgKFNlbGVjdG9yQ2hlY2tlcjo6ZWxlbWVudE1hdGNoZXNTZWxlY3RvclNjb3Blcyhl
bGVtZW50LCBpZFNjb3BlcywgY2xhc3NTY29wZXMpKSB7Ci0gICAgICAgICAgICBlbGVtZW50LT5z
ZXROZWVkc1N0eWxlUmVjYWxjKCk7Ci0gICAgICAgICAgICAvLyBUaGUgd2hvbGUgc3VidHJlZSBp
cyBub3cgaW52YWxpZGF0ZWQsIHdlIGNhbiBza2lwIHRvIHRoZSBuZXh0IHNpYmxpbmcuCi0gICAg
ICAgICAgICBub2RlID0gbm9kZS0+dHJhdmVyc2VOZXh0U2libGluZygpOwotICAgICAgICAgICAg
Y29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgbm9kZSA9IG5vZGUtPnRyYXZlcnNlTmV4dE5v
ZGUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIERvY3VtZW50OjphbmFs
eXplU3R5bGVzaGVldENoYW5nZShTdHlsZVJlc29sdmVyVXBkYXRlRmxhZyB1cGRhdGVGbGFnLCBj
b25zdCBWZWN0b3I8UmVmUHRyPFN0eWxlU2hlZXQ+ID4mIG5ld1N0eWxlc2hlZXRzLCBib29sJiBy
ZXF1aXJlc1N0eWxlUmVzb2x2ZXJSZXNldCwgYm9vbCYgcmVxdWlyZXNGdWxsU3R5bGVSZWNhbGMp
Ci17Ci0gICAgcmVxdWlyZXNTdHlsZVJlc29sdmVyUmVzZXQgPSB0cnVlOwotICAgIHJlcXVpcmVz
RnVsbFN0eWxlUmVjYWxjID0gdHJ1ZTsKLSAgICAKLSAgICAvLyBTdHlsZXNoZWV0cyBvZiA8c3R5
bGU+IGVsZW1lbnRzIHRoYXQgQGltcG9ydCBzdHlsZXNoZWV0cyBhcmUgYWN0aXZlIGJ1dCBsb2Fk
aW5nLiBXZSBuZWVkIHRvIHRyaWdnZXIgYSBmdWxsIHJlY2FsYyB3aGVuIHN1Y2ggbG9hZHMgYXJl
IGRvbmUuCi0gICAgYm9vbCBoYXNBY3RpdmVMb2FkaW5nU3R5bGVzaGVldCA9IGZhbHNlOwotICAg
IHVuc2lnbmVkIG5ld1N0eWxlc2hlZXRDb3VudCA9IG5ld1N0eWxlc2hlZXRzLnNpemUoKTsKLSAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbmV3U3R5bGVzaGVldENvdW50OyArK2kpIHsKLSAg
ICAgICAgaWYgKG5ld1N0eWxlc2hlZXRzW2ldLT5pc0xvYWRpbmcoKSkKLSAgICAgICAgICAgIGhh
c0FjdGl2ZUxvYWRpbmdTdHlsZXNoZWV0ID0gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKG1faGFkQWN0
aXZlTG9hZGluZ1N0eWxlc2hlZXQgJiYgIWhhc0FjdGl2ZUxvYWRpbmdTdHlsZXNoZWV0KSB7Ci0g
ICAgICAgIG1faGFkQWN0aXZlTG9hZGluZ1N0eWxlc2hlZXQgPSBmYWxzZTsKLSAgICAgICAgcmV0
dXJuOwotICAgIH0KLSAgICBtX2hhZEFjdGl2ZUxvYWRpbmdTdHlsZXNoZWV0ID0gaGFzQWN0aXZl
TG9hZGluZ1N0eWxlc2hlZXQ7Ci0KLSAgICBpZiAodXBkYXRlRmxhZyAhPSBSZWNhbGNTdHlsZUlm
TmVlZGVkKQotICAgICAgICByZXR1cm47Ci0gICAgaWYgKCFtX3N0eWxlUmVzb2x2ZXIpCi0gICAg
ICAgIHJldHVybjsKLQotICAgIC8vIFNlZSBpZiB3ZSBhcmUganVzdCBhZGRpbmcgc3R5bGVzaGVl
dHMuCi0gICAgdW5zaWduZWQgb2xkU3R5bGVzaGVldENvdW50ID0gbV9zdHlsZVNoZWV0cy0+bGVu
Z3RoKCk7Ci0gICAgaWYgKG5ld1N0eWxlc2hlZXRDb3VudCA8IG9sZFN0eWxlc2hlZXRDb3VudCkK
LSAgICAgICAgcmV0dXJuOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBvbGRTdHlsZXNo
ZWV0Q291bnQ7ICsraSkgewotICAgICAgICBpZiAobV9zdHlsZVNoZWV0cy0+aXRlbShpKSAhPSBu
ZXdTdHlsZXNoZWV0c1tpXSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcmVxdWly
ZXNTdHlsZVJlc29sdmVyUmVzZXQgPSBmYWxzZTsKLQotICAgIC8vIElmIHdlIGFyZSBhbHJlYWR5
IHBhcnNpbmcgdGhlIGJvZHkgYW5kIHNvIG1heSBoYXZlIHNpZ25pZmljYW50IGFtb3VudCBvZiBl
bGVtZW50cywgcHV0IHNvbWUgZWZmb3J0IGludG8gdHJ5aW5nIHRvIGF2b2lkIHN0eWxlIHJlY2Fs
Y3MuCi0gICAgaWYgKCFib2R5KCkgfHwgbV9oYXNOb2Rlc1dpdGhQbGFjZWhvbGRlclN0eWxlKQot
ICAgICAgICByZXR1cm47Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gb2xkU3R5bGVzaGVldENvdW50
OyBpIDwgbmV3U3R5bGVzaGVldENvdW50OyArK2kpIHsKLSAgICAgICAgaWYgKCFuZXdTdHlsZXNo
ZWV0c1tpXS0+aXNDU1NTdHlsZVNoZWV0KCkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAg
IGlmIChuZXdTdHlsZXNoZWV0c1tpXS0+ZGlzYWJsZWQoKSkKLSAgICAgICAgICAgIGNvbnRpbnVl
OwotICAgICAgICBpZiAodGVzdEFkZGVkU3R5bGVzaGVldFJlcXVpcmVzU3R5bGVSZWNhbGMoc3Rh
dGljX2Nhc3Q8Q1NTU3R5bGVTaGVldCo+KG5ld1N0eWxlc2hlZXRzW2ldLmdldCgpKS0+Y29udGVu
dHMoKSkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHJlcXVpcmVzRnVsbFN0eWxl
UmVjYWxjID0gZmFsc2U7Ci19Ci0KLXN0YXRpYyBib29sIHN0eWxlU2hlZXRzVXNlUmVtVW5pdHMo
Y29uc3QgVmVjdG9yPFJlZlB0cjxTdHlsZVNoZWV0PiA+JiBzaGVldHMpCi17Ci0gICAgZm9yICh1
bnNpZ25lZCBpID0gMDsgaSA8IHNoZWV0cy5zaXplKCk7ICsraSkgewotICAgICAgICBpZiAoIXNo
ZWV0c1tpXS0+aXNDU1NTdHlsZVNoZWV0KCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAg
ICAgaWYgKHN0YXRpY19jYXN0PENTU1N0eWxlU2hlZXQqPihzaGVldHNbaV0uZ2V0KCkpLT5jb250
ZW50cygpLT51c2VzUmVtVW5pdHMoKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0K
LSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KIHZvaWQgRG9jdW1lbnQ6Om5vdGlmeVNlYW1sZXNzQ2hp
bGREb2N1bWVudHNPZlN0eWxlc2hlZXRVcGRhdGUoKSBjb25zdAogewogICAgIC8vIElmIHdlJ3Jl
IG5vdCBpbiBhIGZyYW1lIHlldCBhbnkgcG90ZW50aWFsIGNoaWxkIGRvY3VtZW50cyB3b24ndCBo
YXZlIGEgU3R5bGVSZXNvbHZlciB0byB1cGRhdGUuCkBAIC0zNjU4LDQzICszMjg4LDYgQEAgdm9p
ZCBEb2N1bWVudDo6bm90aWZ5U2VhbWxlc3NDaGlsZERvY3VtZQogICAgIH0KIH0KIAotYm9vbCBE
b2N1bWVudDo6dXBkYXRlQWN0aXZlU3R5bGVzaGVldHMoU3R5bGVSZXNvbHZlclVwZGF0ZUZsYWcg
dXBkYXRlRmxhZykKLXsKLSAgICBpZiAobV9pblN0eWxlUmVjYWxjKSB7Ci0gICAgICAgIC8vIFNW
RyA8dXNlPiBlbGVtZW50IG1heSBtYW5hZ2UgdG8gaW52YWxpZGF0ZSBzdHlsZSBzZWxlY3RvciBp
biB0aGUgbWlkZGxlIG9mIGEgc3R5bGUgcmVjYWxjLgotICAgICAgICAvLyBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTQzNDQKLSAgICAgICAgLy8gRklYTUU6IFRoaXMg
c2hvdWxkIGJlIGZpeGVkIGluIFNWRyBhbmQgdGhpcyBjb2RlIHJlcGxhY2VkIHdpdGggQVNTRVJU
KCFtX2luU3R5bGVSZWNhbGMpLgotICAgICAgICBtX2hhc0RpcnR5U3R5bGVSZXNvbHZlciA9IHRy
dWU7Ci0gICAgICAgIHNjaGVkdWxlRm9yY2VkU3R5bGVSZWNhbGMoKTsKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgIH0KLSAgICBpZiAoIXJlbmRlcmVyKCkgfHwgIWF0dGFjaGVkKCkpCi0gICAg
ICAgIHJldHVybiBmYWxzZTsKLQotICAgIFN0eWxlU2hlZXRWZWN0b3IgbmV3U3R5bGVzaGVldHM7
Ci0gICAgY29sbGVjdEFjdGl2ZVN0eWxlc2hlZXRzKG5ld1N0eWxlc2hlZXRzKTsKLQotICAgIGJv
b2wgcmVxdWlyZXNTdHlsZVJlc29sdmVyUmVzZXQ7Ci0gICAgYm9vbCByZXF1aXJlc0Z1bGxTdHls
ZVJlY2FsYzsKLSAgICBhbmFseXplU3R5bGVzaGVldENoYW5nZSh1cGRhdGVGbGFnLCBuZXdTdHls
ZXNoZWV0cywgcmVxdWlyZXNTdHlsZVJlc29sdmVyUmVzZXQsIHJlcXVpcmVzRnVsbFN0eWxlUmVj
YWxjKTsKLQotICAgIGlmIChyZXF1aXJlc1N0eWxlUmVzb2x2ZXJSZXNldCkKLSAgICAgICAgY2xl
YXJTdHlsZVJlc29sdmVyKCk7Ci0gICAgZWxzZSB7Ci0gICAgICAgIG1fc3R5bGVSZXNvbHZlci0+
YXBwZW5kQXV0aG9yU3R5bGVzaGVldHMobV9zdHlsZVNoZWV0cy0+bGVuZ3RoKCksIG5ld1N0eWxl
c2hlZXRzKTsKLSAgICAgICAgcmVzZXRDU1NGZWF0dXJlRmxhZ3MoKTsKLSAgICB9Ci0gICAgbV9z
dHlsZVNoZWV0cy0+c3dhcChuZXdTdHlsZXNoZWV0cyk7Ci0KLSAgICBtX3VzZXNSZW1Vbml0cyA9
IHN0eWxlU2hlZXRzVXNlUmVtVW5pdHMobV9zdHlsZVNoZWV0cy0+dmVjdG9yKCkpOwotICAgIG1f
ZGlkQ2FsY3VsYXRlU3R5bGVSZXNvbHZlciA9IHRydWU7Ci0gICAgbV9oYXNEaXJ0eVN0eWxlUmVz
b2x2ZXIgPSBmYWxzZTsKLQotICAgIG5vdGlmeVNlYW1sZXNzQ2hpbGREb2N1bWVudHNPZlN0eWxl
c2hlZXRVcGRhdGUoKTsKLQotICAgIHJldHVybiByZXF1aXJlc0Z1bGxTdHlsZVJlY2FsYzsKLX0K
LQogdm9pZCBEb2N1bWVudDo6c2V0SG92ZXJOb2RlKFBhc3NSZWZQdHI8Tm9kZT4gbmV3SG92ZXJO
b2RlKQogewogICAgIG1faG92ZXJOb2RlID0gbmV3SG92ZXJOb2RlOwpAQCAtNjI3NCwxNiArNTg2
Nyw5IEBAIHZvaWQgRG9jdW1lbnQ6OnJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU8KICAgICBpbmZv
LmFkZE1lbWJlcihtX2ZyYW1lKTsKICAgICBpbmZvLmFkZE1lbWJlcihtX2NhY2hlZFJlc291cmNl
TG9hZGVyKTsKICAgICBpbmZvLmFkZE1lbWJlcihtX2VsZW1TaGVldCk7Ci0gICAgaW5mby5hZGRN
ZW1iZXIobV9wYWdlVXNlclNoZWV0KTsKLSAgICBpZiAobV9wYWdlR3JvdXBVc2VyU2hlZXRzKQot
ICAgICAgICBpbmZvLmFkZEluc3RydW1lbnRlZFZlY3RvclB0cihtX3BhZ2VHcm91cFVzZXJTaGVl
dHMpOwotICAgIGlmIChtX3VzZXJTaGVldHMpCi0gICAgICAgIGluZm8uYWRkSW5zdHJ1bWVudGVk
VmVjdG9yUHRyKG1fdXNlclNoZWV0cyk7CisgICAgaW5mby5hZGRNZW1iZXIobV9zdHlsZVNoZWV0
Q29sbGVjdGlvbik7CiAgICAgaW5mby5hZGRIYXNoU2V0KG1fbm9kZUl0ZXJhdG9ycyk7CiAgICAg
aW5mby5hZGRIYXNoU2V0KG1fcmFuZ2VzKTsKLSAgICBpbmZvLmFkZExpc3RIYXNoU2V0KG1fc3R5
bGVTaGVldENhbmRpZGF0ZU5vZGVzKTsKLSAgICBpbmZvLmFkZE1lbWJlcihtX3ByZWZlcnJlZFN0
eWxlc2hlZXRTZXQpOwotICAgIGluZm8uYWRkTWVtYmVyKG1fc2VsZWN0ZWRTdHlsZXNoZWV0U2V0
KTsKICAgICBpbmZvLmFkZE1lbWJlcihtX3RpdGxlLnN0cmluZygpKTsKICAgICBpbmZvLmFkZE1l
bWJlcihtX3Jhd1RpdGxlLnN0cmluZygpKTsKICAgICBpbmZvLmFkZE1lbWJlcihtX3htbEVuY29k
aW5nKTsKQEAgLTYzNzgsNiArNTk2NCwxMSBAQCBQYXNzUmVmUHRyPEVsZW1lbnRBdHRyaWJ1dGVE
YXRhPiBEb2N1bWVuCiAgICAgcmV0dXJuIGF0dHJpYnV0ZURhdGEucmVsZWFzZSgpOwogfQogCiti
b29sIERvY3VtZW50OjpoYXZlU3R5bGVzaGVldHNMb2FkZWQoKSBjb25zdAoreworICAgIHJldHVy
biAhbV9zdHlsZVNoZWV0Q29sbGVjdGlvbi0+aGFzUGVuZGluZ1NoZWV0cygpIHx8IG1faWdub3Jl
UGVuZGluZ1N0eWxlc2hlZXRzOworfQorCiBMb2NhbGl6ZXImIERvY3VtZW50OjpnZXRMb2NhbGl6
ZXIoY29uc3QgQXRvbWljU3RyaW5nJiBsb2NhbGUpCiB7CiAgICAgQXRvbWljU3RyaW5nIGxvY2Fs
ZUtleSA9IGxvY2FsZTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2RvbS9Eb2N1bWVudC5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2RvbS9Eb2N1bWVudC5oCShyZXZpc2lvbiAxMjkzOTcp
CisrKyBTb3VyY2UvV2ViQ29yZS9kb20vRG9jdW1lbnQuaAkod29ya2luZyBjb3B5KQpAQCAtNzgs
NiArNzgsNyBAQCBjbGFzcyBEb2N1bWVudEZyYWdtZW50OwogY2xhc3MgRG9jdW1lbnRMb2FkZXI7
CiBjbGFzcyBEb2N1bWVudE1hcmtlckNvbnRyb2xsZXI7CiBjbGFzcyBEb2N1bWVudFBhcnNlcjsK
K2NsYXNzIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb247CiBjbGFzcyBEb2N1bWVudFR5cGU7
CiBjbGFzcyBEb2N1bWVudFdlYWtSZWZlcmVuY2U7CiBjbGFzcyBEeW5hbWljTm9kZUxpc3RDYWNo
ZUJhc2U7CkBAIC00ODUsMzQgKzQ4NiwxNCBAQCBwdWJsaWM6CiAgICAgICAgIHJldHVybiBtX3N0
eWxlUmVzb2x2ZXIuZ2V0KCk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUg
cGVuZGluZyBzaGVldCBjb3VudCBhbmQgdGhlbiBjYWxscyB1cGRhdGVBY3RpdmVTdHlsZXNoZWV0
cy4KLSAgICAgKi8KLSAgICBlbnVtIFJlbW92ZVBlbmRpbmdTaGVldE5vdGlmaWNhdGlvblR5cGUg
ewotICAgICAgICBSZW1vdmVQZW5kaW5nU2hlZXROb3RpZnlJbW1lZGlhdGVseSwKLSAgICAgICAg
UmVtb3ZlUGVuZGluZ1NoZWV0Tm90aWZ5TGF0ZXIKLSAgICB9OwotCi0gICAgdm9pZCByZW1vdmVQ
ZW5kaW5nU2hlZXQoUmVtb3ZlUGVuZGluZ1NoZWV0Tm90aWZpY2F0aW9uVHlwZSA9IFJlbW92ZVBl
bmRpbmdTaGVldE5vdGlmeUltbWVkaWF0ZWx5KTsKICAgICB2b2lkIG5vdGlmeVJlbW92ZVBlbmRp
bmdTaGVldElmTmVlZGVkKCk7CiAKLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5z
IHRydWUgaWYgYWxsIHRvcC1sZXZlbCBzdHlsZXNoZWV0cyBoYXZlIGxvYWRlZCAoaW5jbHVkaW5n
Ci0gICAgICogYW55IEBpbXBvcnRzIHRoYXQgdGhleSBtYXkgYmUgbG9hZGluZykuCi0gICAgICov
Ci0gICAgYm9vbCBoYXZlU3R5bGVzaGVldHNMb2FkZWQoKSBjb25zdAotICAgIHsKLSAgICAgICAg
cmV0dXJuIG1fcGVuZGluZ1N0eWxlc2hlZXRzIDw9IDAgfHwgbV9pZ25vcmVQZW5kaW5nU3R5bGVz
aGVldHM7Ci0gICAgfQorICAgIGJvb2wgaGF2ZVN0eWxlc2hlZXRzTG9hZGVkKCkgY29uc3Q7CiAK
LSAgICAvKioKLSAgICAgKiBJbmNyZW1lbnRzIHRoZSBudW1iZXIgb2YgcGVuZGluZyBzaGVldHMu
ICBUaGUgPGxpbms+IGVsZW1lbnRzCi0gICAgICogaW52b2tlIHRoaXMgdG8gYWRkIHRoZW1zZWx2
ZXMgdG8gdGhlIGxvYWRpbmcgbGlzdC4KLSAgICAgKi8KLSAgICB2b2lkIGFkZFBlbmRpbmdTaGVl
dCgpIHsgbV9wZW5kaW5nU3R5bGVzaGVldHMrKzsgfQorICAgIC8vIFRoaXMgaXMgYSBET00gZnVu
Y3Rpb24uCisgICAgU3R5bGVTaGVldExpc3QqIHN0eWxlU2hlZXRzKCk7CiAKLSAgICB2b2lkIGFk
ZFN0eWxlU2hlZXRDYW5kaWRhdGVOb2RlKE5vZGUqLCBib29sIGNyZWF0ZWRCeVBhcnNlcik7Ci0g
ICAgdm9pZCByZW1vdmVTdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZShOb2RlKik7CisgICAgRG9jdW1l
bnRTdHlsZVNoZWV0Q29sbGVjdGlvbiogc3R5bGVTaGVldENvbGxlY3Rpb24oKSB7IHJldHVybiBt
X3N0eWxlU2hlZXRDb2xsZWN0aW9uLmdldCgpOyB9CiAKICAgICBib29sIGdvdG9BbmNob3JOZWVk
ZWRBZnRlclN0eWxlc2hlZXRzTG9hZCgpIHsgcmV0dXJuIG1fZ290b0FuY2hvck5lZWRlZEFmdGVy
U3R5bGVzaGVldHNMb2FkOyB9CiAgICAgdm9pZCBzZXRHb3RvQW5jaG9yTmVlZGVkQWZ0ZXJTdHls
ZXNoZWV0c0xvYWQoYm9vbCBiKSB7IG1fZ290b0FuY2hvck5lZWRlZEFmdGVyU3R5bGVzaGVldHNM
b2FkID0gYjsgfQpAQCAtNTMwLDE3ICs1MTEsNiBAQCBwdWJsaWM6CiAKICAgICB2b2lkIGV2YWx1
YXRlTWVkaWFRdWVyeUxpc3QoKTsKIAotICAgIGJvb2wgdXNlc1NpYmxpbmdSdWxlcygpIGNvbnN0
IHsgcmV0dXJuIG1fdXNlc1NpYmxpbmdSdWxlcyB8fCBtX3VzZXNTaWJsaW5nUnVsZXNPdmVycmlk
ZTsgfQotICAgIHZvaWQgc2V0VXNlc1NpYmxpbmdSdWxlcyhib29sIGIpIHsgbV91c2VzU2libGlu
Z1J1bGVzT3ZlcnJpZGUgPSBiOyB9Ci0gICAgYm9vbCB1c2VzRmlyc3RMaW5lUnVsZXMoKSBjb25z
dCB7IHJldHVybiBtX3VzZXNGaXJzdExpbmVSdWxlczsgfQotICAgIGJvb2wgdXNlc0ZpcnN0TGV0
dGVyUnVsZXMoKSBjb25zdCB7IHJldHVybiBtX3VzZXNGaXJzdExldHRlclJ1bGVzOyB9Ci0gICAg
dm9pZCBzZXRVc2VzRmlyc3RMZXR0ZXJSdWxlcyhib29sIGIpIHsgbV91c2VzRmlyc3RMZXR0ZXJS
dWxlcyA9IGI7IH0KLSAgICBib29sIHVzZXNCZWZvcmVBZnRlclJ1bGVzKCkgY29uc3QgeyByZXR1
cm4gbV91c2VzQmVmb3JlQWZ0ZXJSdWxlcyB8fCBtX3VzZXNCZWZvcmVBZnRlclJ1bGVzT3ZlcnJp
ZGU7IH0KLSAgICB2b2lkIHNldFVzZXNCZWZvcmVBZnRlclJ1bGVzKGJvb2wgYikgeyBtX3VzZXNC
ZWZvcmVBZnRlclJ1bGVzT3ZlcnJpZGUgPSBiOyB9Ci0gICAgYm9vbCB1c2VzUmVtVW5pdHMoKSBj
b25zdCB7IHJldHVybiBtX3VzZXNSZW1Vbml0czsgfQotICAgIGJvb2wgdXNlc0xpbmtSdWxlcygp
IGNvbnN0IHsgcmV0dXJuIGxpbmtDb2xvcigpICE9IHZpc2l0ZWRMaW5rQ29sb3IoKSB8fCBtX3Vz
ZXNMaW5rUnVsZXM7IH0KLSAgICB2b2lkIHNldFVzZXNMaW5rUnVsZXMoYm9vbCBiKSB7IG1fdXNl
c0xpbmtSdWxlcyA9IGI7IH0KLQogICAgIC8vIE5ldmVyIHJldHVybnMgMC4KICAgICBGb3JtQ29u
dHJvbGxlciogZm9ybUNvbnRyb2xsZXIoKTsKICAgICBWZWN0b3I8U3RyaW5nPiBmb3JtRWxlbWVu
dHNTdGF0ZSgpIGNvbnN0OwpAQCAtNTU2LDcgKzUyNiw3IEBAIHB1YmxpYzoKICAgICBQYXNzUmVm
UHRyPE5vZGVJdGVyYXRvcj4gY3JlYXRlTm9kZUl0ZXJhdG9yKE5vZGUqIHJvb3QsIHVuc2lnbmVk
IHdoYXRUb1Nob3csCiAgICAgICAgIFBhc3NSZWZQdHI8Tm9kZUZpbHRlcj4sIGJvb2wgZXhwYW5k
RW50aXR5UmVmZXJlbmNlcywgRXhjZXB0aW9uQ29kZSYpOwogCi0gICAgUGFzc1JlZlB0cjxUcmVl
V2Fsa2VyPiBjcmVhdGVUcmVlV2Fsa2VyKE5vZGUqIHJvb3QsIHVuc2lnbmVkIHdoYXRUb1Nob3cs
IAorICAgIFBhc3NSZWZQdHI8VHJlZVdhbGtlcj4gY3JlYXRlVHJlZVdhbGtlcihOb2RlKiByb290
LCB1bnNpZ25lZCB3aGF0VG9TaG93LAogICAgICAgICBQYXNzUmVmUHRyPE5vZGVGaWx0ZXI+LCBi
b29sIGV4cGFuZEVudGl0eVJlZmVyZW5jZXMsIEV4Y2VwdGlvbkNvZGUmKTsKIAogICAgIC8vIFNw
ZWNpYWwgc3VwcG9ydCBmb3IgZWRpdGluZwpAQCAtNjQ5LDE3ICs2MTksNiBAQCBwdWJsaWM6CiAg
ICAgYm9vbCBjYW5OYXZpZ2F0ZShGcmFtZSogdGFyZ2V0RnJhbWUpOwogICAgIEZyYW1lKiBmaW5k
VW5zYWZlUGFyZW50U2Nyb2xsUHJvcGFnYXRpb25Cb3VuZGFyeSgpOwogCi0gICAgQ1NTU3R5bGVT
aGVldCogcGFnZVVzZXJTaGVldCgpOwotICAgIHZvaWQgY2xlYXJQYWdlVXNlclNoZWV0KCk7Ci0g
ICAgdm9pZCB1cGRhdGVQYWdlVXNlclNoZWV0KCk7Ci0KLSAgICBjb25zdCBWZWN0b3I8UmVmUHRy
PENTU1N0eWxlU2hlZXQ+ID4qIHBhZ2VHcm91cFVzZXJTaGVldHMoKSBjb25zdDsKLSAgICB2b2lk
IGNsZWFyUGFnZUdyb3VwVXNlclNoZWV0cygpOwotICAgIHZvaWQgdXBkYXRlUGFnZUdyb3VwVXNl
clNoZWV0cygpOwotCi0gICAgY29uc3QgVmVjdG9yPFJlZlB0cjxDU1NTdHlsZVNoZWV0PiA+KiBk
b2N1bWVudFVzZXJTaGVldHMoKSBjb25zdCB7IHJldHVybiBtX3VzZXJTaGVldHMuZ2V0KCk7IH0K
LSAgICB2b2lkIGFkZFVzZXJTaGVldChQYXNzUmVmUHRyPFN0eWxlU2hlZXRDb250ZW50cz4gdXNl
clNoZWV0KTsKLQogICAgIENTU1N0eWxlU2hlZXQqIGVsZW1lbnRTaGVldCgpOwogICAgIAogICAg
IHZpcnR1YWwgUGFzc1JlZlB0cjxEb2N1bWVudFBhcnNlcj4gY3JlYXRlUGFyc2VyKCk7CkBAIC03
MTYsOCArNjc1LDYgQEAgcHVibGljOgogICAgIAogICAgIE1vdXNlRXZlbnRXaXRoSGl0VGVzdFJl
c3VsdHMgcHJlcGFyZU1vdXNlRXZlbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmLCBjb25zdCBMYXlv
dXRQb2ludCYsIGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYpOwogCi0gICAgU3R5bGVTaGVldExp
c3QqIHN0eWxlU2hlZXRzKCk7Ci0KICAgICAvKiBOZXdseSBwcm9wb3NlZCBDU1MzIG1lY2hhbmlz
bSBmb3Igc2VsZWN0aW5nIGFsdGVybmF0ZQogICAgICAgIHN0eWxlc2hlZXRzIHVzaW5nIHRoZSBE
T00uIE1heSBiZSBzdWJqZWN0IHRvIGNoYW5nZSBhcwogICAgICAgIHNwZWMgbWF0dXJlcy4gLSBk
d2gKQEAgLTk3NCw3ICs5MzEsOCBAQCBwdWJsaWM6CiAgICAgZW51bSBQZW5kaW5nU2hlZXRMYXlv
dXQgeyBOb0xheW91dFdpdGhQZW5kaW5nU2hlZXRzLCBEaWRMYXlvdXRXaXRoUGVuZGluZ1NoZWV0
cywgSWdub3JlTGF5b3V0V2l0aFBlbmRpbmdTaGVldHMgfTsKIAogICAgIGJvb2wgZGlkTGF5b3V0
V2l0aFBlbmRpbmdTdHlsZXNoZWV0cygpIGNvbnN0IHsgcmV0dXJuIG1fcGVuZGluZ1NoZWV0TGF5
b3V0ID09IERpZExheW91dFdpdGhQZW5kaW5nU2hlZXRzOyB9Ci0gICAgCisKKyAgICBib29sIGhh
c05vZGVzV2l0aFBsYWNlaG9sZGVyU3R5bGUoKSBjb25zdCB7IHJldHVybiBtX2hhc05vZGVzV2l0
aFBsYWNlaG9sZGVyU3R5bGU7IH0KICAgICB2b2lkIHNldEhhc05vZGVzV2l0aFBsYWNlaG9sZGVy
U3R5bGUoKSB7IG1faGFzTm9kZXNXaXRoUGxhY2Vob2xkZXJTdHlsZSA9IHRydWU7IH0KIAogICAg
IGNvbnN0IFZlY3RvcjxJY29uVVJMPiYgaWNvblVSTHMoKTsKQEAgLTExOTQsNiArMTE1MiwxMyBA
QCBwdWJsaWM6CiAKICAgICBQYXNzUmVmUHRyPEVsZW1lbnRBdHRyaWJ1dGVEYXRhPiBjYWNoZWRJ
bW11dGFibGVBdHRyaWJ1dGVEYXRhKGNvbnN0IEVsZW1lbnQqLCBjb25zdCBWZWN0b3I8QXR0cmli
dXRlPiYpOwogCisgICAgdm9pZCBkaWRSZW1vdmVBbGxQZW5kaW5nU3R5bGVzaGVldCgpOworICAg
IHZvaWQgc2V0TmVlZHNOb3RpZnlSZW1vdmVBbGxQZW5kaW5nU3R5bGVzaGVldCgpIHsgbV9uZWVk
c05vdGlmeVJlbW92ZUFsbFBlbmRpbmdTdHlsZXNoZWV0ID0gdHJ1ZTsgfQorICAgIHZvaWQgY2xl
YXJTdHlsZVJlc29sdmVyKCk7CisgICAgdm9pZCBub3RpZnlTZWFtbGVzc0NoaWxkRG9jdW1lbnRz
T2ZTdHlsZXNoZWV0VXBkYXRlKCkgY29uc3Q7CisKKyAgICBib29sIGluU3R5bGVSZWNhbGMoKSB7
IHJldHVybiBtX2luU3R5bGVSZWNhbGM7IH0KKwogICAgIExvY2FsaXplciYgZ2V0TG9jYWxpemVy
KGNvbnN0IEF0b21pY1N0cmluZyYgbG9jYWxlKTsKIAogcHJvdGVjdGVkOgpAQCAtMTI0MSwxOSAr
MTIwNiw4IEBAIHByaXZhdGU6CiAgICAgdm9pZCBidWlsZEFjY2Vzc0tleU1hcChUcmVlU2NvcGUq
IHJvb3QpOwogCiAgICAgdm9pZCBjcmVhdGVTdHlsZVJlc29sdmVyKCk7Ci0gICAgdm9pZCBjbGVh
clN0eWxlUmVzb2x2ZXIoKTsKLSAgICB2b2lkIGNvbWJpbmVDU1NGZWF0dXJlRmxhZ3MoKTsKLSAg
ICB2b2lkIHJlc2V0Q1NTRmVhdHVyZUZsYWdzKCk7Ci0gICAgCi0gICAgYm9vbCB1cGRhdGVBY3Rp
dmVTdHlsZXNoZWV0cyhTdHlsZVJlc29sdmVyVXBkYXRlRmxhZyk7Ci0gICAgdm9pZCBjb2xsZWN0
QWN0aXZlU3R5bGVzaGVldHMoVmVjdG9yPFJlZlB0cjxTdHlsZVNoZWV0PiA+Jik7Ci0gICAgYm9v
bCB0ZXN0QWRkZWRTdHlsZXNoZWV0UmVxdWlyZXNTdHlsZVJlY2FsYyhTdHlsZVNoZWV0Q29udGVu
dHMqKTsKLSAgICB2b2lkIGFuYWx5emVTdHlsZXNoZWV0Q2hhbmdlKFN0eWxlUmVzb2x2ZXJVcGRh
dGVGbGFnLCBjb25zdCBWZWN0b3I8UmVmUHRyPFN0eWxlU2hlZXQ+ID4mIG5ld1N0eWxlc2hlZXRz
LCBib29sJiByZXF1aXJlc1N0eWxlUmVzb2x2ZXJSZXNldCwgYm9vbCYgcmVxdWlyZXNGdWxsU3R5
bGVSZWNhbGMpOwotICAgIHZvaWQgZGlkUmVtb3ZlQWxsUGVuZGluZ1N0eWxlc2hlZXQoKTsKLSAg
ICB2b2lkIHNldE5lZWRzTm90aWZ5UmVtb3ZlQWxsUGVuZGluZ1N0eWxlc2hlZXQoKSB7IG1fbmVl
ZHNOb3RpZnlSZW1vdmVBbGxQZW5kaW5nU3R5bGVzaGVldCA9IHRydWU7IH0KIAogICAgIHZvaWQg
c2VhbWxlc3NQYXJlbnRVcGRhdGVkU3R5bGVzaGVldHMoKTsKLSAgICB2b2lkIG5vdGlmeVNlYW1s
ZXNzQ2hpbGREb2N1bWVudHNPZlN0eWxlc2hlZXRVcGRhdGUoKSBjb25zdDsKIAogICAgIHZvaWQg
ZGVsZXRlQ3VzdG9tRm9udHMoKTsKIApAQCAtMTI5MCw2ICsxMjQ0LDE3IEBAIHByaXZhdGU6CiAg
ICAgT3duUHRyPFN0eWxlUmVzb2x2ZXI+IG1fc3R5bGVSZXNvbHZlcjsKICAgICBib29sIG1fZGlk
Q2FsY3VsYXRlU3R5bGVSZXNvbHZlcjsKICAgICBib29sIG1faGFzRGlydHlTdHlsZVJlc29sdmVy
OworICAgIGJvb2wgbV9oYXNOb2Rlc1dpdGhQbGFjZWhvbGRlclN0eWxlOworICAgIGJvb2wgbV9u
ZWVkc05vdGlmeVJlbW92ZUFsbFBlbmRpbmdTdHlsZXNoZWV0OworICAgIC8vIEJ1dCBzb21ldGlt
ZXMgeW91IG5lZWQgdG8gaWdub3JlIHBlbmRpbmcgc3R5bGVzaGVldCBjb3VudCB0bworICAgIC8v
IGZvcmNlIGFuIGltbWVkaWF0ZSBsYXlvdXQgd2hlbiByZXF1ZXN0ZWQgYnkgSlMuCisgICAgYm9v
bCBtX2lnbm9yZVBlbmRpbmdTdHlsZXNoZWV0czsKKworICAgIC8vIElmIHdlIGRvIGlnbm9yZSB0
aGUgcGVuZGluZyBzdHlsZXNoZWV0IGNvdW50LCB0aGVuIHdlIG5lZWQgdG8gYWRkIGEgYm9vbGVh
bgorICAgIC8vIHRvIHRyYWNrIHRoYXQgdGhpcyBoYXBwZW5lZCBzbyB0aGF0IHdlIGNhbiBkbyBh
IGZ1bGwgcmVwYWludCB3aGVuIHRoZSBzdHlsZXNoZWV0cworICAgIC8vIGRvIGV2ZW50dWFsbHkg
bG9hZC4KKyAgICBQZW5kaW5nU2hlZXRMYXlvdXQgbV9wZW5kaW5nU2hlZXRMYXlvdXQ7CisKICAg
ICBWZWN0b3I8T3duUHRyPEZvbnREYXRhPiA+IG1fY3VzdG9tRm9udHM7CiAKICAgICBGcmFtZSog
bV9mcmFtZTsKQEAgLTEzMjMsMjkgKzEyODgsNyBAQCBwcml2YXRlOgogICAgIFJlZlB0cjxEb2N1
bWVudFR5cGU+IG1fZG9jVHlwZTsKICAgICBPd25QdHI8RE9NSW1wbGVtZW50YXRpb24+IG1faW1w
bGVtZW50YXRpb247CiAKLSAgICAvLyBUcmFjayB0aGUgbnVtYmVyIG9mIGN1cnJlbnRseSBsb2Fk
aW5nIHRvcC1sZXZlbCBzdHlsZXNoZWV0cyBuZWVkZWQgZm9yIHJlbmRlcmluZy4KLSAgICAvLyBT
aGVldHMgbG9hZGVkIHVzaW5nIHRoZSBAaW1wb3J0IGRpcmVjdGl2ZSBhcmUgbm90IGluY2x1ZGVk
IGluIHRoaXMgY291bnQuCi0gICAgLy8gV2UgdXNlIHRoaXMgY291bnQgb2YgcGVuZGluZyBzaGVl
dHMgdG8gZGV0ZWN0IHdoZW4gd2UgY2FuIGJlZ2luIGF0dGFjaGluZwotICAgIC8vIGVsZW1lbnRz
IGFuZCB3aGVuIGl0IGlzIHNhZmUgdG8gZXhlY3V0ZSBzY3JpcHRzLgotICAgIGludCBtX3BlbmRp
bmdTdHlsZXNoZWV0czsKLQotICAgIC8vIEJ1dCBzb21ldGltZXMgeW91IG5lZWQgdG8gaWdub3Jl
IHBlbmRpbmcgc3R5bGVzaGVldCBjb3VudCB0bwotICAgIC8vIGZvcmNlIGFuIGltbWVkaWF0ZSBs
YXlvdXQgd2hlbiByZXF1ZXN0ZWQgYnkgSlMuCi0gICAgYm9vbCBtX2lnbm9yZVBlbmRpbmdTdHls
ZXNoZWV0cyA6IDE7Ci0gICAgYm9vbCBtX25lZWRzTm90aWZ5UmVtb3ZlQWxsUGVuZGluZ1N0eWxl
c2hlZXQgOiAxOwotCi0gICAgLy8gSWYgd2UgZG8gaWdub3JlIHRoZSBwZW5kaW5nIHN0eWxlc2hl
ZXQgY291bnQsIHRoZW4gd2UgbmVlZCB0byBhZGQgYSBib29sZWFuCi0gICAgLy8gdG8gdHJhY2sg
dGhhdCB0aGlzIGhhcHBlbmVkIHNvIHRoYXQgd2UgY2FuIGRvIGEgZnVsbCByZXBhaW50IHdoZW4g
dGhlIHN0eWxlc2hlZXRzCi0gICAgLy8gZG8gZXZlbnR1YWxseSBsb2FkLgotICAgIFBlbmRpbmdT
aGVldExheW91dCBtX3BlbmRpbmdTaGVldExheW91dDsKLSAgICAKLSAgICBib29sIG1faGFzTm9k
ZXNXaXRoUGxhY2Vob2xkZXJTdHlsZTsKLQogICAgIFJlZlB0cjxDU1NTdHlsZVNoZWV0PiBtX2Vs
ZW1TaGVldDsKLSAgICBSZWZQdHI8Q1NTU3R5bGVTaGVldD4gbV9wYWdlVXNlclNoZWV0OwotICAg
IG11dGFibGUgT3duUHRyPFZlY3RvcjxSZWZQdHI8Q1NTU3R5bGVTaGVldD4gPiA+IG1fcGFnZUdy
b3VwVXNlclNoZWV0czsKLSAgICBPd25QdHI8VmVjdG9yPFJlZlB0cjxDU1NTdHlsZVNoZWV0PiA+
ID4gbV91c2VyU2hlZXRzOwotICAgIG11dGFibGUgYm9vbCBtX3BhZ2VHcm91cFVzZXJTaGVldENh
Y2hlVmFsaWQ7CiAKICAgICBib29sIG1fcHJpbnRpbmc7CiAgICAgYm9vbCBtX3BhZ2luYXRlZEZv
clNjcmVlbjsKQEAgLTEzNzQsMTEgKzEzMTcsOCBAQCBwcml2YXRlOgogICAgIE11dGF0aW9uT2Jz
ZXJ2ZXJPcHRpb25zIG1fbXV0YXRpb25PYnNlcnZlclR5cGVzOwogI2VuZGlmCiAKLSAgICBSZWZQ
dHI8U3R5bGVTaGVldExpc3Q+IG1fc3R5bGVTaGVldHM7IC8vIEFsbCBvZiB0aGUgc3R5bGVzaGVl
dHMgdGhhdCBhcmUgY3VycmVudGx5IGluIGVmZmVjdCBmb3Igb3VyIG1lZGlhIHR5cGUgYW5kIHN0
eWxlc2hlZXQgc2V0LgotICAgIGJvb2wgbV9oYWRBY3RpdmVMb2FkaW5nU3R5bGVzaGVldDsKLSAg
ICAKLSAgICB0eXBlZGVmIExpc3RIYXNoU2V0PE5vZGUqLCAzMj4gU3R5bGVTaGVldENhbmRpZGF0
ZUxpc3RIYXNoU2V0OwotICAgIFN0eWxlU2hlZXRDYW5kaWRhdGVMaXN0SGFzaFNldCBtX3N0eWxl
U2hlZXRDYW5kaWRhdGVOb2RlczsgLy8gQWxsIG9mIHRoZSBub2RlcyB0aGF0IGNvdWxkIHBvdGVu
dGlhbGx5IHByb3ZpZGUgc3R5bGVzaGVldHMgdG8gdGhlIGRvY3VtZW50ICg8bGluaz4sIDxzdHls
ZT4sIDw/eG1sLXN0eWxlc2hlZXQ+KQorCisgICAgT3duUHRyPERvY3VtZW50U3R5bGVTaGVldENv
bGxlY3Rpb24+IG1fc3R5bGVTaGVldENvbGxlY3Rpb247CiAKICAgICBPd25QdHI8Rm9ybUNvbnRy
b2xsZXI+IG1fZm9ybUNvbnRyb2xsZXI7CiAKQEAgLTEzODYsOSArMTMyNiw2IEBAIHByaXZhdGU6
CiAgICAgQ29sb3IgbV92aXNpdGVkTGlua0NvbG9yOwogICAgIENvbG9yIG1fYWN0aXZlTGlua0Nv
bG9yOwogCi0gICAgU3RyaW5nIG1fcHJlZmVycmVkU3R5bGVzaGVldFNldDsKLSAgICBTdHJpbmcg
bV9zZWxlY3RlZFN0eWxlc2hlZXRTZXQ7Ci0KICAgICBib29sIG1fbG9hZGluZ1NoZWV0OwogICAg
IGJvb2wgbV92aXN1YWxseU9yZGVyZWQ7CiAgICAgUmVhZHlTdGF0ZSBtX3JlYWR5U3RhdGU7CkBA
IC0xMzk5LDE0ICsxMzM2LDYgQEAgcHJpdmF0ZToKICAgICBib29sIG1faW5TdHlsZVJlY2FsYzsK
ICAgICBib29sIG1fY2xvc2VBZnRlclN0eWxlUmVjYWxjOwogCi0gICAgYm9vbCBtX3VzZXNTaWJs
aW5nUnVsZXM7Ci0gICAgYm9vbCBtX3VzZXNTaWJsaW5nUnVsZXNPdmVycmlkZTsKLSAgICBib29s
IG1fdXNlc0ZpcnN0TGluZVJ1bGVzOwotICAgIGJvb2wgbV91c2VzRmlyc3RMZXR0ZXJSdWxlczsK
LSAgICBib29sIG1fdXNlc0JlZm9yZUFmdGVyUnVsZXM7Ci0gICAgYm9vbCBtX3VzZXNCZWZvcmVB
ZnRlclJ1bGVzT3ZlcnJpZGU7Ci0gICAgYm9vbCBtX3VzZXNSZW1Vbml0czsKLSAgICBib29sIG1f
dXNlc0xpbmtSdWxlczsKICAgICBib29sIG1fZ290b0FuY2hvck5lZWRlZEFmdGVyU3R5bGVzaGVl
dHNMb2FkOwogICAgIGJvb2wgbV9pc0ROU1ByZWZldGNoRW5hYmxlZDsKICAgICBib29sIG1faGF2
ZUV4cGxpY2l0bHlEaXNhYmxlZEROU1ByZWZldGNoOwpJbmRleDogU291cmNlL1dlYkNvcmUvZG9t
L0RvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL2RvbS9Eb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmNwcAkocmV2aXNpb24gMTI5
Mzk3KQkoZnJvbSBTb3VyY2UvV2ViQ29yZS9kb20vRG9jdW1lbnQuY3BwOjEyOTM5NykKKysrIFNv
dXJjZS9XZWJDb3JlL2RvbS9Eb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDYzOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgTGFy
cyBLbm9sbCAoa25vbGxAa2RlLm9yZykKKyAqICAgICAgICAgICAoQykgMTk5OSBBbnR0aSBLb2l2
aXN0byAoa29pdmlzdG9Aa2RlLm9yZykKKyAqICAgICAgICAgICAoQykgMjAwMSBEaXJrIE11ZWxs
ZXIgKG11ZWxsZXJAa2RlLm9yZykKKyAqICAgICAgICAgICAoQykgMjAwNiBBbGV4ZXkgUHJvc2t1
cnlha292IChhcEB3ZWJraXQub3JnKQorICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA2
LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDExLCAyMDEyIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSBUb3JjaCBNb2JpbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLiAoaHR0cDovL3d3dy50b3JjaG1vYmlsZS5jb20vKQorICogQ29weXJp
Z2h0IChDKSAyMDA4LCAyMDA5LCAyMDExLCAyMDEyIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0
cyBzdWJzaWRpYXJ5KC1pZXMpCisgKiBDb3B5cmlnaHQgKEMpIFJlc2VhcmNoIEluIE1vdGlvbiBM
aW1pdGVkIDIwMTAtMjAxMS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJh
cnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBt
b2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1Ymxp
YworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv
bjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlv
bikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVk
IGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkg
V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hB
TlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBH
TlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgor
ICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUg
dGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAor
ICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5o
IgorI2luY2x1ZGUgIkRvY3VtZW50LmgiCisKKyNpbmNsdWRlICJBWE9iamVjdENhY2hlLmgiCisj
aW5jbHVkZSAiQW5pbWF0aW9uQ29udHJvbGxlci5oIgorI2luY2x1ZGUgIkF0dHIuaCIKKyNpbmNs
dWRlICJBdHRyaWJ1dGUuaCIKKyNpbmNsdWRlICJDREFUQVNlY3Rpb24uaCIKKyNpbmNsdWRlICJD
U1NQYXJzZXIuaCIKKyNpbmNsdWRlICJDU1NTdHlsZURlY2xhcmF0aW9uLmgiCisjaW5jbHVkZSAi
Q1NTU3R5bGVTaGVldC5oIgorI2luY2x1ZGUgIkNTU1ZhbHVlS2V5d29yZHMuaCIKKyNpbmNsdWRl
ICJDYWNoZWRDU1NTdHlsZVNoZWV0LmgiCisjaW5jbHVkZSAiQ2FjaGVkUmVzb3VyY2VMb2FkZXIu
aCIKKyNpbmNsdWRlICJDaHJvbWUuaCIKKyNpbmNsdWRlICJDaHJvbWVDbGllbnQuaCIKKyNpbmNs
dWRlICJDb21tZW50LmgiCisjaW5jbHVkZSAiQ29uc29sZS5oIgorI2luY2x1ZGUgIkNvbnRlbnRT
ZWN1cml0eVBvbGljeS5oIgorI2luY2x1ZGUgIkNvbnRleHRGZWF0dXJlcy5oIgorI2luY2x1ZGUg
IkNvb2tpZUphci5oIgorI2luY2x1ZGUgIkRPTUltcGxlbWVudGF0aW9uLmgiCisjaW5jbHVkZSAi
RE9NTmFtZWRGbG93Q29sbGVjdGlvbi5oIgorI2luY2x1ZGUgIkRPTVNlbGVjdGlvbi5oIgorI2lu
Y2x1ZGUgIkRPTVdpbmRvdy5oIgorI2luY2x1ZGUgIkRhdGVDb21wb25lbnRzLmgiCisjaW5jbHVk
ZSAiRGV2aWNlTW90aW9uQ29udHJvbGxlci5oIgorI2luY2x1ZGUgIkRldmljZU9yaWVudGF0aW9u
Q29udHJvbGxlci5oIgorI2luY2x1ZGUgIkRvY3VtZW50RXZlbnRRdWV1ZS5oIgorI2luY2x1ZGUg
IkRvY3VtZW50RnJhZ21lbnQuaCIKKyNpbmNsdWRlICJEb2N1bWVudExvYWRlci5oIgorI2luY2x1
ZGUgIkRvY3VtZW50TWFya2VyQ29udHJvbGxlci5oIgorI2luY2x1ZGUgIkRvY3VtZW50VHlwZS5o
IgorI2luY2x1ZGUgIkVkaXRpbmdUZXh0LmgiCisjaW5jbHVkZSAiRWRpdG9yLmgiCisjaW5jbHVk
ZSAiRWxlbWVudC5oIgorI2luY2x1ZGUgIkVsZW1lbnRTaGFkb3cuaCIKKyNpbmNsdWRlICJFbnRp
dHlSZWZlcmVuY2UuaCIKKyNpbmNsdWRlICJFdmVudC5oIgorI2luY2x1ZGUgIkV2ZW50RmFjdG9y
eS5oIgorI2luY2x1ZGUgIkV2ZW50SGFuZGxlci5oIgorI2luY2x1ZGUgIkV2ZW50TGlzdGVuZXIu
aCIKKyNpbmNsdWRlICJFdmVudE5hbWVzLmgiCisjaW5jbHVkZSAiRXhjZXB0aW9uQ29kZS5oIgor
I2luY2x1ZGUgIkZsb3dUaHJlYWRDb250cm9sbGVyLmgiCisjaW5jbHVkZSAiRm9jdXNDb250cm9s
bGVyLmgiCisjaW5jbHVkZSAiRm9ybUNvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJGcmFtZS5oIgor
I2luY2x1ZGUgIkZyYW1lTG9hZGVyLmgiCisjaW5jbHVkZSAiRnJhbWVMb2FkZXJDbGllbnQuaCIK
KyNpbmNsdWRlICJGcmFtZVNlbGVjdGlvbi5oIgorI2luY2x1ZGUgIkZyYW1lVHJlZS5oIgorI2lu
Y2x1ZGUgIkZyYW1lVmlldy5oIgorI2luY2x1ZGUgIkdlb2xvY2F0aW9uQ29udHJvbGxlci5oIgor
I2luY2x1ZGUgIkhhc2hDaGFuZ2VFdmVudC5oIgorI2luY2x1ZGUgIkhpc3RvZ3JhbVN1cHBvcnQu
aCIKKyNpbmNsdWRlICJIaXN0b3J5LmgiCisjaW5jbHVkZSAiSFRNTEFsbENvbGxlY3Rpb24uaCIK
KyNpbmNsdWRlICJIVE1MQW5jaG9yRWxlbWVudC5oIgorI2luY2x1ZGUgIkhUTUxCb2R5RWxlbWVu
dC5oIgorI2luY2x1ZGUgIkhUTUxDYW52YXNFbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTENvbGxl
Y3Rpb24uaCIKKyNpbmNsdWRlICJIVE1MRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJIVE1MRWxlbWVu
dEZhY3RvcnkuaCIKKyNpbmNsdWRlICJIVE1MRnJhbWVPd25lckVsZW1lbnQuaCIKKyNpbmNsdWRl
ICJIVE1MSGVhZEVsZW1lbnQuaCIKKyNpbmNsdWRlICJIVE1MSUZyYW1lRWxlbWVudC5oIgorI2lu
Y2x1ZGUgIkhUTUxMaW5rRWxlbWVudC5oIgorI2luY2x1ZGUgIkhUTUxNYXBFbGVtZW50LmgiCisj
aW5jbHVkZSAiSFRNTE5hbWVDb2xsZWN0aW9uLmgiCisjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCisj
aW5jbHVkZSAiSFRNTFBhcnNlcklkaW9tcy5oIgorI2luY2x1ZGUgIkhUTUxTdHlsZUVsZW1lbnQu
aCIKKyNpbmNsdWRlICJIVE1MVGl0bGVFbGVtZW50LmgiCisjaW5jbHVkZSAiSFRUUFBhcnNlcnMu
aCIKKyNpbmNsdWRlICJIaXRUZXN0UmVxdWVzdC5oIgorI2luY2x1ZGUgIkhpdFRlc3RSZXN1bHQu
aCIKKyNpbmNsdWRlICJJbWFnZUxvYWRlci5oIgorI2luY2x1ZGUgIkluc3BlY3RvckNvdW50ZXJz
LmgiCisjaW5jbHVkZSAiSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uLmgiCisjaW5jbHVkZSAiTGFu
Z3VhZ2UuaCIKKyNpbmNsdWRlICJMb2NhbGl6ZXIuaCIKKyNpbmNsdWRlICJMb2dnaW5nLmgiCisj
aW5jbHVkZSAiTWVkaWFRdWVyeUxpc3QuaCIKKyNpbmNsdWRlICJNZWRpYVF1ZXJ5TWF0Y2hlci5o
IgorI2luY2x1ZGUgIk1vdXNlRXZlbnRXaXRoSGl0VGVzdFJlc3VsdHMuaCIKKyNpbmNsdWRlICJO
YW1lTm9kZUxpc3QuaCIKKyNpbmNsdWRlICJOYW1lZEZsb3dDb2xsZWN0aW9uLmgiCisjaW5jbHVk
ZSAiTmVzdGluZ0xldmVsSW5jcmVtZW50ZXIuaCIKKyNpbmNsdWRlICJOZXdYTUxEb2N1bWVudFBh
cnNlci5oIgorI2luY2x1ZGUgIk5vZGVGaWx0ZXIuaCIKKyNpbmNsdWRlICJOb2RlSXRlcmF0b3Iu
aCIKKyNpbmNsdWRlICJOb2RlUmFyZURhdGEuaCIKKyNpbmNsdWRlICJOb2RlV2l0aEluZGV4Lmgi
CisjaW5jbHVkZSAiUGFnZS5oIgorI2luY2x1ZGUgIlBhZ2VHcm91cC5oIgorI2luY2x1ZGUgIlBh
Z2VUcmFuc2l0aW9uRXZlbnQuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybUtleWJvYXJkRXZlbnQuaCIK
KyNpbmNsdWRlICJQbHVnaW5Eb2N1bWVudC5oIgorI2luY2x1ZGUgIlBvaW50ZXJMb2NrQ29udHJv
bGxlci5oIgorI2luY2x1ZGUgIlBvcFN0YXRlRXZlbnQuaCIKKyNpbmNsdWRlICJQcm9jZXNzaW5n
SW5zdHJ1Y3Rpb24uaCIKKyNpbmNsdWRlICJRdWFsaWZpZWROYW1lLmgiCisjaW5jbHVkZSAiUmVn
aXN0ZXJlZEV2ZW50TGlzdGVuZXIuaCIKKyNpbmNsdWRlICJSZW5kZXJBcmVuYS5oIgorI2luY2x1
ZGUgIlJlbmRlck5hbWVkRmxvd1RocmVhZC5oIgorI2luY2x1ZGUgIlJlbmRlclRleHRDb250cm9s
LmgiCisjaW5jbHVkZSAiUmVuZGVyVmlldy5oIgorI2luY2x1ZGUgIlJlbmRlcldpZGdldC5oIgor
I2luY2x1ZGUgIlJ1bnRpbWVFbmFibGVkRmVhdHVyZXMuaCIKKyNpbmNsdWRlICJTY2hlbWVSZWdp
c3RyeS5oIgorI2luY2x1ZGUgIlNjb3BlZEV2ZW50UXVldWUuaCIKKyNpbmNsdWRlICJTY3JpcHRD
YWxsU3RhY2suaCIKKyNpbmNsdWRlICJTY3JpcHRDb250cm9sbGVyLmgiCisjaW5jbHVkZSAiU2Ny
aXB0RWxlbWVudC5oIgorI2luY2x1ZGUgIlNjcmlwdEV2ZW50TGlzdGVuZXIuaCIKKyNpbmNsdWRl
ICJTY3JpcHRSdW5uZXIuaCIKKyNpbmNsdWRlICJTY3JvbGxpbmdDb29yZGluYXRvci5oIgorI2lu
Y2x1ZGUgIlNlY3VyaXR5T3JpZ2luLmgiCisjaW5jbHVkZSAiU2VjdXJpdHlQb2xpY3kuaCIKKyNp
bmNsdWRlICJTZWdtZW50ZWRTdHJpbmcuaCIKKyNpbmNsdWRlICJTZWxlY3RvclF1ZXJ5LmgiCisj
aW5jbHVkZSAiU2V0dGluZ3MuaCIKKyNpbmNsdWRlICJTaGFkb3dSb290LmgiCisjaW5jbHVkZSAi
U3RhdGljSGFzaFNldE5vZGVMaXN0LmgiCisjaW5jbHVkZSAiU3R5bGVSZXNvbHZlci5oIgorI2lu
Y2x1ZGUgIlN0eWxlU2hlZXRDb250ZW50cy5oIgorI2luY2x1ZGUgIlN0eWxlU2hlZXRMaXN0Lmgi
CisjaW5jbHVkZSAiVGV4dFJlc291cmNlRGVjb2Rlci5oIgorI2luY2x1ZGUgIlRpbWVyLmgiCisj
aW5jbHVkZSAiVHJhbnNmb3JtU291cmNlLmgiCisjaW5jbHVkZSAiVHJlZVdhbGtlci5oIgorI2lu
Y2x1ZGUgIlVuZG9NYW5hZ2VyLmgiCisjaW5jbHVkZSAiVXNlckNvbnRlbnRVUkxQYXR0ZXJuLmgi
CisjaW5jbHVkZSAiV2ViQ29yZU1lbW9yeUluc3RydW1lbnRhdGlvbi5oIgorI2luY2x1ZGUgIldl
YktpdE5hbWVkRmxvdy5oIgorI2luY2x1ZGUgIlhNTERvY3VtZW50UGFyc2VyLmgiCisjaW5jbHVk
ZSAiWE1MSHR0cFJlcXVlc3QuaCIKKyNpbmNsdWRlICJYTUxOU05hbWVzLmgiCisjaW5jbHVkZSAi
WE1MTmFtZXMuaCIKKyNpbmNsdWRlICJYUGF0aEV2YWx1YXRvci5oIgorI2luY2x1ZGUgIlhQYXRo
RXhwcmVzc2lvbi5oIgorI2luY2x1ZGUgIlhQYXRoTlNSZXNvbHZlci5oIgorI2luY2x1ZGUgIlhQ
YXRoUmVzdWx0LmgiCisjaW5jbHVkZSAiaHRtbGVkaXRpbmcuaCIKKyNpbmNsdWRlIDx3dGYvQ3Vy
cmVudFRpbWUuaD4KKyNpbmNsdWRlIDx3dGYvSGFzaEZ1bmN0aW9ucy5oPgorI2luY2x1ZGUgPHd0
Zi9NYWluVGhyZWFkLmg+CisjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIuaD4KKyNpbmNsdWRlIDx3
dGYvU3RkTGliRXh0cmFzLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nQnVmZmVyLmg+CisK
KyNpZiBFTkFCTEUoU0hBUkVEX1dPUktFUlMpCisjaW5jbHVkZSAiU2hhcmVkV29ya2VyUmVwb3Np
dG9yeS5oIgorI2VuZGlmCisKKyNpZiBFTkFCTEUoWFNMVCkKKyNpbmNsdWRlICJYU0xUUHJvY2Vz
c29yLmgiCisjZW5kaWYKKworI2lmIEVOQUJMRShTVkcpCisjaW5jbHVkZSAiU1ZHRG9jdW1lbnRF
eHRlbnNpb25zLmgiCisjaW5jbHVkZSAiU1ZHRWxlbWVudEZhY3RvcnkuaCIKKyNpbmNsdWRlICJT
VkdOYW1lcy5oIgorI2luY2x1ZGUgIlNWR1NWR0VsZW1lbnQuaCIKKyNpbmNsdWRlICJTVkdTdHls
ZUVsZW1lbnQuaCIKKyNlbmRpZgorCisjaWYgRU5BQkxFKFRPVUNIX0VWRU5UUykKKyNpbmNsdWRl
ICJUb3VjaExpc3QuaCIKKyNlbmRpZgorCisjaWYgRU5BQkxFKE1BVEhNTCkKKyNpbmNsdWRlICJN
YXRoTUxFbGVtZW50LmgiCisjaW5jbHVkZSAiTWF0aE1MRWxlbWVudEZhY3RvcnkuaCIKKyNpbmNs
dWRlICJNYXRoTUxOYW1lcy5oIgorI2VuZGlmCisKKyNpZiBFTkFCTEUoRlVMTFNDUkVFTl9BUEkp
CisjaW5jbHVkZSAiUmVuZGVyRnVsbFNjcmVlbi5oIgorI2VuZGlmCisKKyNpZiBFTkFCTEUoUkVR
VUVTVF9BTklNQVRJT05fRlJBTUUpCisjaW5jbHVkZSAiUmVxdWVzdEFuaW1hdGlvbkZyYW1lQ2Fs
bGJhY2suaCIKKyNpbmNsdWRlICJTY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXIuaCIKKyNlbmRp
ZgorCisjaWYgRU5BQkxFKE1JQ1JPREFUQSkKKyNpbmNsdWRlICJNaWNyb0RhdGFJdGVtTGlzdC5o
IgorI2luY2x1ZGUgIk5vZGVSYXJlRGF0YS5oIgorI2VuZGlmCisKKyNpZiBFTkFCTEUoTElOS19Q
UkVSRU5ERVIpCisjaW5jbHVkZSAiUHJlcmVuZGVyZXIuaCIKKyNlbmRpZgorCisjaWYgRU5BQkxF
KFRFWFRfQVVUT1NJWklORykKKyNpbmNsdWRlICJUZXh0QXV0b3NpemVyLmgiCisjZW5kaWYKKwor
I2lmIEVOQUJMRShDU1BfTkVYVCkKKyNpbmNsdWRlICJET01TZWN1cml0eVBvbGljeS5oIgorI2Vu
ZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgV1RGOwordXNpbmcg
bmFtZXNwYWNlIFVuaWNvZGU7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwordXNpbmcgbmFtZXNw
YWNlIEhUTUxOYW1lczsKKworLy8gI2RlZmluZSBJTlNUUlVNRU5UX0xBWU9VVF9TQ0hFRFVMSU5H
IDEKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNNYXhXcml0ZVJlY3Vyc2lvbkRlcHRoID0gMjE7
CisKKy8vIFRoaXMgYW1vdW50IG9mIHRpbWUgbXVzdCBoYXZlIGVsYXBzZWQgYmVmb3JlIHdlIHdp
bGwgZXZlbiBjb25zaWRlciBzY2hlZHVsaW5nIGEgbGF5b3V0IHdpdGhvdXQgYSBkZWxheS4KKy8v
IEZJWE1FOiBGb3IgZmFzdGVyIG1hY2hpbmVzIHRoaXMgdmFsdWUgY2FuIHJlYWxseSBiZSBsb3dl
cmVkIHRvIDIwMC4gIDI1MCBpcyBhZGVxdWF0ZSwgYnV0IGEgbGl0dGxlIGhpZ2gKKy8vIGZvciBk
dWFsIEc1cy4gOikKK3N0YXRpYyBjb25zdCBpbnQgY0xheW91dFNjaGVkdWxlVGhyZXNob2xkID0g
MjUwOworCisvLyBET00gTGV2ZWwgMiBzYXlzIChsZXR0ZXJzIGFkZGVkKToKKy8vCisvLyBhKSBO
YW1lIHN0YXJ0IGNoYXJhY3RlcnMgbXVzdCBoYXZlIG9uZSBvZiB0aGUgY2F0ZWdvcmllcyBMbCwg
THUsIExvLCBMdCwgTmwuCisvLyBiKSBOYW1lIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiBOYW1lLXN0
YXJ0IGNoYXJhY3RlcnMgbXVzdCBoYXZlIG9uZSBvZiB0aGUgY2F0ZWdvcmllcyBNYywgTWUsIE1u
LCBMbSwgb3IgTmQuCisvLyBjKSBDaGFyYWN0ZXJzIGluIHRoZSBjb21wYXRpYmlsaXR5IGFyZWEg
KGkuZS4gd2l0aCBjaGFyYWN0ZXIgY29kZSBncmVhdGVyIHRoYW4gI3hGOTAwIGFuZCBsZXNzIHRo
YW4gI3hGRkZFKSBhcmUgbm90IGFsbG93ZWQgaW4gWE1MIG5hbWVzLgorLy8gZCkgQ2hhcmFjdGVy
cyB3aGljaCBoYXZlIGEgZm9udCBvciBjb21wYXRpYmlsaXR5IGRlY29tcG9zaXRpb24gKGkuZS4g
dGhvc2Ugd2l0aCBhICJjb21wYXRpYmlsaXR5IGZvcm1hdHRpbmcgdGFnIiBpbiBmaWVsZCA1IG9m
IHRoZSBkYXRhYmFzZSAtLSBtYXJrZWQgYnkgZmllbGQgNSBiZWdpbm5pbmcgd2l0aCBhICI8Iikg
YXJlIG5vdCBhbGxvd2VkLgorLy8gZSkgVGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzIGFyZSB0cmVh
dGVkIGFzIG5hbWUtc3RhcnQgY2hhcmFjdGVycyByYXRoZXIgdGhhbiBuYW1lIGNoYXJhY3RlcnMs
IGJlY2F1c2UgdGhlIHByb3BlcnR5IGZpbGUgY2xhc3NpZmllcyB0aGVtIGFzIEFscGhhYmV0aWM6
IFsjeDAyQkItI3gwMkMxXSwgI3gwNTU5LCAjeDA2RTUsICN4MDZFNi4KKy8vIGYpIENoYXJhY3Rl
cnMgI3gyMERELSN4MjBFMCBhcmUgZXhjbHVkZWQgKGluIGFjY29yZGFuY2Ugd2l0aCBVbmljb2Rl
LCBzZWN0aW9uIDUuMTQpLgorLy8gZykgQ2hhcmFjdGVyICN4MDBCNyBpcyBjbGFzc2lmaWVkIGFz
IGFuIGV4dGVuZGVyLCBiZWNhdXNlIHRoZSBwcm9wZXJ0eSBsaXN0IHNvIGlkZW50aWZpZXMgaXQu
CisvLyBoKSBDaGFyYWN0ZXIgI3gwMzg3IGlzIGFkZGVkIGFzIGEgbmFtZSBjaGFyYWN0ZXIsIGJl
Y2F1c2UgI3gwMEI3IGlzIGl0cyBjYW5vbmljYWwgZXF1aXZhbGVudC4KKy8vIGkpIENoYXJhY3Rl
cnMgJzonIGFuZCAnXycgYXJlIGFsbG93ZWQgYXMgbmFtZS1zdGFydCBjaGFyYWN0ZXJzLgorLy8g
aikgQ2hhcmFjdGVycyAnLScgYW5kICcuJyBhcmUgYWxsb3dlZCBhcyBuYW1lIGNoYXJhY3RlcnMu
CisvLworLy8gSXQgYWxzbyBjb250YWlucyBjb21wbGV0ZSB0YWJsZXMuIElmIHdlIGRlY2lkZSBp
dCdzIGJldHRlciwgd2UgY291bGQgaW5jbHVkZSB0aG9zZSBpbnN0ZWFkIG9mIHRoZSBmb2xsb3dp
bmcgY29kZS4KKworc3RhdGljIGlubGluZSBib29sIGlzVmFsaWROYW1lU3RhcnQoVUNoYXIzMiBj
KQoreworICAgIC8vIHJ1bGUgKGUpIGFib3ZlCisgICAgaWYgKChjID49IDB4MDJCQiAmJiBjIDw9
IDB4MDJDMSkgfHwgYyA9PSAweDU1OSB8fCBjID09IDB4NkU1IHx8IGMgPT0gMHg2RTYpCisgICAg
ICAgIHJldHVybiB0cnVlOworCisgICAgLy8gcnVsZSAoaSkgYWJvdmUKKyAgICBpZiAoYyA9PSAn
OicgfHwgYyA9PSAnXycpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gcnVsZXMgKGEp
IGFuZCAoZikgYWJvdmUKKyAgICBjb25zdCB1aW50MzJfdCBuYW1lU3RhcnRNYXNrID0gTGV0dGVy
X0xvd2VyY2FzZSB8IExldHRlcl9VcHBlcmNhc2UgfCBMZXR0ZXJfT3RoZXIgfCBMZXR0ZXJfVGl0
bGVjYXNlIHwgTnVtYmVyX0xldHRlcjsKKyAgICBpZiAoIShVbmljb2RlOjpjYXRlZ29yeShjKSAm
IG5hbWVTdGFydE1hc2spKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBydWxlIChj
KSBhYm92ZQorICAgIGlmIChjID49IDB4RjkwMCAmJiBjIDwgMHhGRkZFKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICAvLyBydWxlIChkKSBhYm92ZQorICAgIERlY29tcG9zaXRpb25UeXBl
IGRlY29tcFR5cGUgPSBkZWNvbXBvc2l0aW9uVHlwZShjKTsKKyAgICBpZiAoZGVjb21wVHlwZSA9
PSBEZWNvbXBvc2l0aW9uRm9udCB8fCBkZWNvbXBUeXBlID09IERlY29tcG9zaXRpb25Db21wYXQp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMg
aW5saW5lIGJvb2wgaXNWYWxpZE5hbWVQYXJ0KFVDaGFyMzIgYykKK3sKKyAgICAvLyBydWxlcyAo
YSksIChlKSwgYW5kIChpKSBhYm92ZQorICAgIGlmIChpc1ZhbGlkTmFtZVN0YXJ0KGMpKQorICAg
ICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIHJ1bGVzIChnKSBhbmQgKGgpIGFib3ZlCisgICAg
aWYgKGMgPT0gMHgwMEI3IHx8IGMgPT0gMHgwMzg3KQorICAgICAgICByZXR1cm4gdHJ1ZTsKKwor
ICAgIC8vIHJ1bGUgKGopIGFib3ZlCisgICAgaWYgKGMgPT0gJy0nIHx8IGMgPT0gJy4nKQorICAg
ICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIHJ1bGVzIChiKSBhbmQgKGYpIGFib3ZlCisgICAg
Y29uc3QgdWludDMyX3Qgb3RoZXJOYW1lUGFydE1hc2sgPSBNYXJrX05vblNwYWNpbmcgfCBNYXJr
X0VuY2xvc2luZyB8IE1hcmtfU3BhY2luZ0NvbWJpbmluZyB8IExldHRlcl9Nb2RpZmllciB8IE51
bWJlcl9EZWNpbWFsRGlnaXQ7CisgICAgaWYgKCEoVW5pY29kZTo6Y2F0ZWdvcnkoYykgJiBvdGhl
ck5hbWVQYXJ0TWFzaykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIHJ1bGUgKGMp
IGFib3ZlCisgICAgaWYgKGMgPj0gMHhGOTAwICYmIGMgPCAweEZGRkUpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIC8vIHJ1bGUgKGQpIGFib3ZlCisgICAgRGVjb21wb3NpdGlvblR5cGUg
ZGVjb21wVHlwZSA9IGRlY29tcG9zaXRpb25UeXBlKGMpOworICAgIGlmIChkZWNvbXBUeXBlID09
IERlY29tcG9zaXRpb25Gb250IHx8IGRlY29tcFR5cGUgPT0gRGVjb21wb3NpdGlvbkNvbXBhdCkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBi
b29sIHNob3VsZEluaGVyaXRTZWN1cml0eU9yaWdpbkZyb21Pd25lcihjb25zdCBLVVJMJiB1cmwp
Cit7CisgICAgLy8gaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQt
d29yay8jb3JpZ2luLTAKKyAgICAvLworICAgIC8vIElmIGEgRG9jdW1lbnQgaGFzIHRoZSBhZGRy
ZXNzICJhYm91dDpibGFuayIKKyAgICAvLyAgICAgVGhlIG9yaWdpbiBvZiB0aGUgRG9jdW1lbnQg
aXMgdGhlIG9yaWdpbiBpdCB3YXMgYXNzaWduZWQgd2hlbiBpdHMgYnJvd3NpbmcgY29udGV4dCB3
YXMgY3JlYXRlZC4KKyAgICAvLworICAgIC8vIE5vdGU6IFdlIGdlbmVyYWxpemUgdGhpcyB0byBh
bGwgImJsYW5rIiBVUkxzIGFuZCBpbnZhbGlkIFVSTHMgYmVjYXVzZSB3ZQorICAgIC8vIHRyZWF0
IGFsbCBvZiB0aGVzZSBVUkxzIGFzIGFib3V0OmJsYW5rLgorICAgIC8vCisgICAgcmV0dXJuICF1
cmwuaXNWYWxpZCgpIHx8IHVybC5pc0JsYW5rVVJMKCk7Cit9CisKK3N0YXRpYyBXaWRnZXQqIHdp
ZGdldEZvck5vZGUoTm9kZSogZm9jdXNlZE5vZGUpCit7CisgICAgaWYgKCFmb2N1c2VkTm9kZSkK
KyAgICAgICAgcmV0dXJuIDA7CisgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IGZvY3VzZWRO
b2RlLT5yZW5kZXJlcigpOworICAgIGlmICghcmVuZGVyZXIgfHwgIXJlbmRlcmVyLT5pc1dpZGdl
dCgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gdG9SZW5kZXJXaWRnZXQocmVuZGVy
ZXIpLT53aWRnZXQoKTsKK30KKworc3RhdGljIGJvb2wgYWNjZXB0c0VkaXRpbmdGb2N1cyhOb2Rl
KiBub2RlKQoreworICAgIEFTU0VSVChub2RlKTsKKyAgICBBU1NFUlQobm9kZS0+cmVuZGVyZXJJ
c0VkaXRhYmxlKCkpOworCisgICAgTm9kZSogcm9vdCA9IG5vZGUtPnJvb3RFZGl0YWJsZUVsZW1l
bnQoKTsKKyAgICBGcmFtZSogZnJhbWUgPSBub2RlLT5kb2N1bWVudCgpLT5mcmFtZSgpOworICAg
IGlmICghZnJhbWUgfHwgIXJvb3QpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVy
biBmcmFtZS0+ZWRpdG9yKCktPnNob3VsZEJlZ2luRWRpdGluZyhyYW5nZU9mQ29udGVudHMocm9v
dCkuZ2V0KCkpOworfQorCitzdGF0aWMgYm9vbCBjYW5BY2Nlc3NBbmNlc3Rvcihjb25zdCBTZWN1
cml0eU9yaWdpbiogYWN0aXZlU2VjdXJpdHlPcmlnaW4sIEZyYW1lKiB0YXJnZXRGcmFtZSkKK3sK
KyAgICAvLyB0YXJnZXRGcmFtZSBjYW4gYmUgMCB3aGVuIHdlJ3JlIHRyeWluZyB0byBuYXZpZ2F0
ZSBhIHRvcC1sZXZlbCBmcmFtZQorICAgIC8vIHRoYXQgaGFzIGEgMCBvcGVuZXIuCisgICAgaWYg
KCF0YXJnZXRGcmFtZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgY29uc3QgYm9vbCBp
c0xvY2FsQWN0aXZlT3JpZ2luID0gYWN0aXZlU2VjdXJpdHlPcmlnaW4tPmlzTG9jYWwoKTsKKyAg
ICBmb3IgKEZyYW1lKiBhbmNlc3RvckZyYW1lID0gdGFyZ2V0RnJhbWU7IGFuY2VzdG9yRnJhbWU7
IGFuY2VzdG9yRnJhbWUgPSBhbmNlc3RvckZyYW1lLT50cmVlKCktPnBhcmVudCgpKSB7CisgICAg
ICAgIERvY3VtZW50KiBhbmNlc3RvckRvY3VtZW50ID0gYW5jZXN0b3JGcmFtZS0+ZG9jdW1lbnQo
KTsKKyAgICAgICAgLy8gRklYTUU6IFNob3VsZCBiZSBhbiBBU1NFUlQ/IEZyYW1lcyBzaG91bGQg
YWx3YXkgaGF2ZSBkb2N1bWVudHMuCisgICAgICAgIGlmICghYW5jZXN0b3JEb2N1bWVudCkKKyAg
ICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIGNvbnN0IFNlY3VyaXR5T3JpZ2luKiBh
bmNlc3RvclNlY3VyaXR5T3JpZ2luID0gYW5jZXN0b3JEb2N1bWVudC0+c2VjdXJpdHlPcmlnaW4o
KTsKKyAgICAgICAgaWYgKGFjdGl2ZVNlY3VyaXR5T3JpZ2luLT5jYW5BY2Nlc3MoYW5jZXN0b3JT
ZWN1cml0eU9yaWdpbikpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgCisgICAg
ICAgIC8vIEFsbG93IGZpbGUgVVJMIGRlc2NlbmRhbnQgbmF2aWdhdGlvbiBldmVuIHdoZW4gYWxs
b3dGaWxlQWNjZXNzRnJvbUZpbGVVUkxzIGlzIGZhbHNlLgorICAgICAgICAvLyBGSVhNRTogSXQn
cyBhIGJpdCBzdHJhbmdlIHRvIHNwZWNpYWwtY2FzZSBsb2NhbCBvcmlnaW5zIGhlcmUuIFNob3Vs
ZCB3ZSBiZSBkb2luZworICAgICAgICAvLyBzb21ldGhpbmcgbW9yZSBnZW5lcmFsIGluc3RlYWQ/
CisgICAgICAgIGlmIChpc0xvY2FsQWN0aXZlT3JpZ2luICYmIGFuY2VzdG9yU2VjdXJpdHlPcmln
aW4tPmlzTG9jYWwoKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJl
dHVybiBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgcHJpbnROYXZpZ2F0aW9uRXJyb3JNZXNzYWdl
KEZyYW1lKiBmcmFtZSwgY29uc3QgS1VSTCYgYWN0aXZlVVJMKQoreworICAgIC8vIEZJWE1FOiB0
aGlzIGVycm9yIG1lc3NhZ2Ugc2hvdWxkIGNvbnRhaW4gbW9yZSBzcGVjaWZpY3Mgb2Ygd2h5IHRo
ZSBuYXZpZ2F0aW9uIGNoYW5nZSBpcyBub3QgYWxsb3dlZC4KKyAgICBTdHJpbmcgbWVzc2FnZSA9
ICJVbnNhZmUgSmF2YVNjcmlwdCBhdHRlbXB0IHRvIGluaXRpYXRlIGEgbmF2aWdhdGlvbiBjaGFu
Z2UgZm9yIGZyYW1lIHdpdGggVVJMICIgKworICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPmRv
Y3VtZW50KCktPnVybCgpLnN0cmluZygpICsgIiBmcm9tIGZyYW1lIHdpdGggVVJMICIgKyBhY3Rp
dmVVUkwuc3RyaW5nKCkgKyAiLlxuIjsKKworICAgIC8vIEZJWE1FOiBzaG91bGQgd2UgcHJpbnQg
dG8gdGhlIGNvbnNvbGUgb2YgdGhlIGRvY3VtZW50IHBlcmZvcm1pbmcgdGhlIG5hdmlnYXRpb24g
aW5zdGVhZD8KKyAgICBmcmFtZS0+ZG9jdW1lbnQoKS0+ZG9tV2luZG93KCktPnByaW50RXJyb3JN
ZXNzYWdlKG1lc3NhZ2UpOworfQorCitzdGF0aWMgSGFzaFNldDxEb2N1bWVudCo+KiBkb2N1bWVu
dHNUaGF0TmVlZFN0eWxlUmVjYWxjID0gMDsKKworY2xhc3MgRG9jdW1lbnRXZWFrUmVmZXJlbmNl
IDogcHVibGljIFRocmVhZFNhZmVSZWZDb3VudGVkPERvY3VtZW50V2Vha1JlZmVyZW5jZT4gewor
cHVibGljOgorICAgIHN0YXRpYyBQYXNzUmVmUHRyPERvY3VtZW50V2Vha1JlZmVyZW5jZT4gY3Jl
YXRlKERvY3VtZW50KiBkb2N1bWVudCkKKyAgICB7CisgICAgICAgIHJldHVybiBhZG9wdFJlZihu
ZXcgRG9jdW1lbnRXZWFrUmVmZXJlbmNlKGRvY3VtZW50KSk7CisgICAgfQorCisgICAgRG9jdW1l
bnQqIGRvY3VtZW50KCkKKyAgICB7CisgICAgICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7Cisg
ICAgICAgIHJldHVybiBtX2RvY3VtZW50OworICAgIH0KKworICAgIHZvaWQgY2xlYXIoKQorICAg
IHsKKyAgICAgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKyAgICAgICAgbV9kb2N1bWVudCA9
IDA7CisgICAgfQorCitwcml2YXRlOgorICAgIERvY3VtZW50V2Vha1JlZmVyZW5jZShEb2N1bWVu
dCogZG9jdW1lbnQpCisgICAgICAgIDogbV9kb2N1bWVudChkb2N1bWVudCkKKyAgICB7CisgICAg
ICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisgICAgfQorCisgICAgRG9jdW1lbnQqIG1fZG9j
dW1lbnQ7Cit9OworCit1aW50NjRfdCBEb2N1bWVudDo6c19nbG9iYWxUcmVlVmVyc2lvbiA9IDA7
CisKK0RvY3VtZW50OjpEb2N1bWVudChGcmFtZSogZnJhbWUsIGNvbnN0IEtVUkwmIHVybCwgYm9v
bCBpc1hIVE1MLCBib29sIGlzSFRNTCkKKyAgICA6IENvbnRhaW5lck5vZGUoMCwgQ3JlYXRlRG9j
dW1lbnQpCisgICAgLCBUcmVlU2NvcGUodGhpcykKKyAgICAsIG1fZ3VhcmRSZWZDb3VudCgwKQor
ICAgICwgbV9jb250ZXh0RmVhdHVyZXMoQ29udGV4dEZlYXR1cmVzOjpkZWZhdWx0U3dpdGNoKCkp
CisgICAgLCBtX2NvbXBhdGliaWxpdHlNb2RlKE5vUXVpcmtzTW9kZSkKKyAgICAsIG1fY29tcGF0
aWJpbGl0eU1vZGVMb2NrZWQoZmFsc2UpCisgICAgLCBtX2RvbVRyZWVWZXJzaW9uKCsrc19nbG9i
YWxUcmVlVmVyc2lvbikKKyNpZiBFTkFCTEUoTVVUQVRJT05fT0JTRVJWRVJTKQorICAgICwgbV9t
dXRhdGlvbk9ic2VydmVyVHlwZXMoMCkKKyNlbmRpZgorICAgICwgbV9zdHlsZVNoZWV0cyhTdHls
ZVNoZWV0TGlzdDo6Y3JlYXRlKHRoaXMpKQorICAgICwgbV9oYWRBY3RpdmVMb2FkaW5nU3R5bGVz
aGVldChmYWxzZSkKKyAgICAsIG1fcmVhZHlTdGF0ZShDb21wbGV0ZSkKKyAgICAsIG1fc3R5bGVS
ZWNhbGNUaW1lcih0aGlzLCAmRG9jdW1lbnQ6OnN0eWxlUmVjYWxjVGltZXJGaXJlZCkKKyAgICAs
IG1fcGVuZGluZ1N0eWxlUmVjYWxjU2hvdWxkRm9yY2UoZmFsc2UpCisgICAgLCBtX2ZyYW1lRWxl
bWVudHNTaG91bGRJZ25vcmVTY3JvbGxpbmcoZmFsc2UpCisgICAgLCBtX2NvbnRhaW5zVmFsaWRp
dHlTdHlsZVJ1bGVzKGZhbHNlKQorICAgICwgbV91cGRhdGVGb2N1c0FwcGVhcmFuY2VSZXN0b3Jl
c1NlbGVjdGlvbihmYWxzZSkKKyAgICAsIG1faWdub3JlRGVzdHJ1Y3RpdmVXcml0ZUNvdW50KDAp
CisgICAgLCBtX3RpdGxlU2V0RXhwbGljaXRseShmYWxzZSkKKyAgICAsIG1fdXBkYXRlRm9jdXNB
cHBlYXJhbmNlVGltZXIodGhpcywgJkRvY3VtZW50Ojp1cGRhdGVGb2N1c0FwcGVhcmFuY2VUaW1l
ckZpcmVkKQorICAgICwgbV9sb2FkRXZlbnRGaW5pc2hlZChmYWxzZSkKKyAgICAsIG1fc3RhcnRU
aW1lKGN1cnJlbnRUaW1lKCkpCisgICAgLCBtX292ZXJNaW5pbXVtTGF5b3V0VGhyZXNob2xkKGZh
bHNlKQorICAgICwgbV9zY3JpcHRSdW5uZXIoU2NyaXB0UnVubmVyOjpjcmVhdGUodGhpcykpCisg
ICAgLCBtX3htbFZlcnNpb24oIjEuMCIpCisgICAgLCBtX3htbFN0YW5kYWxvbmUoU3RhbmRhbG9u
ZVVuc3BlY2lmaWVkKQorICAgICwgbV9oYXNYTUxEZWNsYXJhdGlvbigwKQorICAgICwgbV9zYXZl
ZFJlbmRlcmVyKDApCisgICAgLCBtX2Rlc2lnbk1vZGUoaW5oZXJpdCkKKyNpZiBFTkFCTEUoREFT
SEJPQVJEX1NVUFBPUlQpIHx8IEVOQUJMRShXSURHRVRfUkVHSU9OKQorICAgICwgbV9oYXNEYXNo
Ym9hcmRSZWdpb25zKGZhbHNlKQorICAgICwgbV9kYXNoYm9hcmRSZWdpb25zRGlydHkoZmFsc2Up
CisjZW5kaWYKKyAgICAsIG1fY3JlYXRlUmVuZGVyZXJzKHRydWUpCisgICAgLCBtX2luUGFnZUNh
Y2hlKGZhbHNlKQorICAgICwgbV9hY2Nlc3NLZXlNYXBWYWxpZChmYWxzZSkKKyAgICAsIG1fdXNl
U2VjdXJlS2V5Ym9hcmRFbnRyeVdoZW5BY3RpdmUoZmFsc2UpCisgICAgLCBtX2lzWEhUTUwoaXNY
SFRNTCkKKyAgICAsIG1faXNIVE1MKGlzSFRNTCkKKyAgICAsIG1faXNWaWV3U291cmNlKGZhbHNl
KQorICAgICwgbV9zYXdFbGVtZW50c0luS25vd25OYW1lc3BhY2VzKGZhbHNlKQorICAgICwgbV9p
c1NyY2RvY0RvY3VtZW50KGZhbHNlKQorICAgICwgbV9kb2N1bWVudFJhcmVEYXRhKDApCisgICAg
LCBtX2V2ZW50UXVldWUoRG9jdW1lbnRFdmVudFF1ZXVlOjpjcmVhdGUodGhpcykpCisgICAgLCBt
X3dlYWtSZWZlcmVuY2UoRG9jdW1lbnRXZWFrUmVmZXJlbmNlOjpjcmVhdGUodGhpcykpCisgICAg
LCBtX2lkQXR0cmlidXRlTmFtZShpZEF0dHIpCisjaWYgRU5BQkxFKEZVTExTQ1JFRU5fQVBJKQor
ICAgICwgbV9hcmVLZXlzRW5hYmxlZEluRnVsbFNjcmVlbigwKQorICAgICwgbV9mdWxsU2NyZWVu
UmVuZGVyZXIoMCkKKyAgICAsIG1fZnVsbFNjcmVlbkNoYW5nZURlbGF5VGltZXIodGhpcywgJkRv
Y3VtZW50OjpmdWxsU2NyZWVuQ2hhbmdlRGVsYXlUaW1lckZpcmVkKQorICAgICwgbV9pc0FuaW1h
dGluZ0Z1bGxTY3JlZW4oZmFsc2UpCisjZW5kaWYKKyAgICAsIG1fbG9hZEV2ZW50RGVsYXlDb3Vu
dCgwKQorICAgICwgbV9sb2FkRXZlbnREZWxheVRpbWVyKHRoaXMsICZEb2N1bWVudDo6bG9hZEV2
ZW50RGVsYXlUaW1lckZpcmVkKQorICAgICwgbV9yZWZlcnJlclBvbGljeShSZWZlcnJlclBvbGlj
eURlZmF1bHQpCisgICAgLCBtX2RpcmVjdGlvblNldE9uRG9jdW1lbnRFbGVtZW50KGZhbHNlKQor
ICAgICwgbV93cml0aW5nTW9kZVNldE9uRG9jdW1lbnRFbGVtZW50KGZhbHNlKQorICAgICwgbV93
cml0ZVJlY3Vyc2lvbklzVG9vRGVlcChmYWxzZSkKKyAgICAsIG1fd3JpdGVSZWN1cnNpb25EZXB0
aCgwKQorICAgICwgbV93aGVlbEV2ZW50SGFuZGxlckNvdW50KDApCisjaWYgRU5BQkxFKFRPVUNI
X0VWRU5UUykKKyAgICAsIG1fdG91Y2hFdmVudEhhbmRsZXJDb3VudCgwKQorI2VuZGlmCisjaWYg
RU5BQkxFKFVORE9fTUFOQUdFUikKKyAgICAsIG1fdW5kb01hbmFnZXIoMCkKKyNlbmRpZgorICAg
ICwgbV9wZW5kaW5nVGFza3NUaW1lcih0aGlzLCAmRG9jdW1lbnQ6OnBlbmRpbmdUYXNrc1RpbWVy
RmlyZWQpCisgICAgLCBtX3NjaGVkdWxlZFRhc2tzQXJlU3VzcGVuZGVkKGZhbHNlKQorICAgICwg
bV92aXN1YWxVcGRhdGVzQWxsb3dlZCh0cnVlKQorICAgICwgbV92aXN1YWxVcGRhdGVzU3VwcHJl
c3Npb25UaW1lcih0aGlzLCAmRG9jdW1lbnQ6OnZpc3VhbFVwZGF0ZXNTdXBwcmVzc2lvblRpbWVy
RmlyZWQpCisjaWZuZGVmIE5ERUJVRworICAgICwgbV9kaWREaXNwYXRjaFZpZXdwb3J0UHJvcGVy
dGllc0NoYW5nZWQoZmFsc2UpCisjZW5kaWYKK3sKKyAgICBtX2RvY3VtZW50ID0gdGhpczsKKwor
ICAgIG1fcGFnZUdyb3VwVXNlclNoZWV0Q2FjaGVWYWxpZCA9IGZhbHNlOworCisgICAgbV9wcmlu
dGluZyA9IGZhbHNlOworICAgIG1fcGFnaW5hdGVkRm9yU2NyZWVuID0gZmFsc2U7CisKKyAgICBt
X2lnbm9yZUF1dG9mb2N1cyA9IGZhbHNlOworCisgICAgbV9mcmFtZSA9IGZyYW1lOworICAgIGlm
IChtX2ZyYW1lKQorICAgICAgICBwcm92aWRlQ29udGV4dEZlYXR1cmVzVG9Eb2N1bWVudEZyb20o
dGhpcywgbV9mcmFtZS0+cGFnZSgpKTsKKworICAgIC8vIFdlIGRlcGVuZCBvbiB0aGUgdXJsIGdl
dHRpbmcgaW1tZWRpYXRlbHkgc2V0IGluIHN1YmZyYW1lcywgYnV0IHdlCisgICAgLy8gYWxzbyBk
ZXBlbmQgb24gdGhlIHVybCBOT1QgZ2V0dGluZyBpbW1lZGlhdGVseSBzZXQgaW4gb3BlbmVkIHdp
bmRvd3MuCisgICAgLy8gU2VlIGZhc3QvZG9tL2Vhcmx5LWZyYW1lLXVybC5odG1sCisgICAgLy8g
YW5kIGZhc3QvZG9tL2xvY2F0aW9uLW5ldy13aW5kb3ctbm8tY3Jhc2guaHRtbCwgcmVzcGVjdGl2
ZWx5LgorICAgIC8vIEZJWE1FOiBDYW4vc2hvdWxkIHdlIHVuaWZ5IHRoaXMgYmVoYXZpb3I/Cisg
ICAgaWYgKChmcmFtZSAmJiBmcmFtZS0+b3duZXJFbGVtZW50KCkpIHx8ICF1cmwuaXNFbXB0eSgp
KQorICAgICAgICBzZXRVUkwodXJsKTsKKworICAgIG1fYXhPYmplY3RDYWNoZSA9IDA7CisKKyAg
ICBtX21hcmtlcnMgPSBhZG9wdFB0cihuZXcgRG9jdW1lbnRNYXJrZXJDb250cm9sbGVyKTsKKwor
ICAgIG1fY2FjaGVkUmVzb3VyY2VMb2FkZXIgPSBhZG9wdFB0cihuZXcgQ2FjaGVkUmVzb3VyY2VM
b2FkZXIodGhpcykpOworI2lmIEVOQUJMRShMSU5LX1BSRVJFTkRFUikKKyAgICBtX3ByZXJlbmRl
cmVyID0gUHJlcmVuZGVyZXI6OmNyZWF0ZSh0aGlzKTsKKyNlbmRpZgorI2lmIEVOQUJMRShURVhU
X0FVVE9TSVpJTkcpCisgICAgbV90ZXh0QXV0b3NpemVyID0gVGV4dEF1dG9zaXplcjo6Y3JlYXRl
KHRoaXMpOworI2VuZGlmCisgICAgbV92aXN1YWxseU9yZGVyZWQgPSBmYWxzZTsKKyAgICBtX2JQ
YXJzaW5nID0gZmFsc2U7CisgICAgbV93ZWxsRm9ybWVkID0gZmFsc2U7CisKKyAgICBtX3RleHRD
b2xvciA9IENvbG9yOjpibGFjazsKKyAgICBtX2xpc3RlbmVyVHlwZXMgPSAwOworICAgIG1faW5T
dHlsZVJlY2FsYyA9IGZhbHNlOworICAgIG1fY2xvc2VBZnRlclN0eWxlUmVjYWxjID0gZmFsc2U7
CisKKyAgICBtX3VzZXNTaWJsaW5nUnVsZXMgPSBmYWxzZTsKKyAgICBtX3VzZXNTaWJsaW5nUnVs
ZXNPdmVycmlkZSA9IGZhbHNlOworICAgIG1fdXNlc0ZpcnN0TGluZVJ1bGVzID0gZmFsc2U7Cisg
ICAgbV91c2VzRmlyc3RMZXR0ZXJSdWxlcyA9IGZhbHNlOworICAgIG1fdXNlc0JlZm9yZUFmdGVy
UnVsZXMgPSBmYWxzZTsKKyAgICBtX3VzZXNCZWZvcmVBZnRlclJ1bGVzT3ZlcnJpZGUgPSBmYWxz
ZTsKKyAgICBtX3VzZXNSZW1Vbml0cyA9IGZhbHNlOworICAgIG1fdXNlc0xpbmtSdWxlcyA9IGZh
bHNlOworCisgICAgbV9nb3RvQW5jaG9yTmVlZGVkQWZ0ZXJTdHlsZXNoZWV0c0xvYWQgPSBmYWxz
ZTsKKworICAgIG1fZGlkQ2FsY3VsYXRlU3R5bGVSZXNvbHZlciA9IGZhbHNlOworICAgIG1faGFz
RGlydHlTdHlsZVJlc29sdmVyID0gZmFsc2U7CisgICAgbV9wZW5kaW5nU3R5bGVzaGVldHMgPSAw
OworICAgIG1faWdub3JlUGVuZGluZ1N0eWxlc2hlZXRzID0gZmFsc2U7CisgICAgbV9uZWVkc05v
dGlmeVJlbW92ZUFsbFBlbmRpbmdTdHlsZXNoZWV0ID0gZmFsc2U7CisgICAgbV9oYXNOb2Rlc1dp
dGhQbGFjZWhvbGRlclN0eWxlID0gZmFsc2U7CisgICAgbV9wZW5kaW5nU2hlZXRMYXlvdXQgPSBO
b0xheW91dFdpdGhQZW5kaW5nU2hlZXRzOworCisgICAgbV9jc3NUYXJnZXQgPSAwOworCisgICAg
cmVzZXRMaW5rQ29sb3IoKTsKKyAgICByZXNldFZpc2l0ZWRMaW5rQ29sb3IoKTsKKyAgICByZXNl
dEFjdGl2ZUxpbmtDb2xvcigpOworCisgICAgbV9wcm9jZXNzaW5nTG9hZEV2ZW50ID0gZmFsc2U7
CisgICAgCisgICAgaW5pdFNlY3VyaXR5Q29udGV4dCgpOworICAgIGluaXRETlNQcmVmZXRjaCgp
OworCisgICAgc3RhdGljIGludCBkb2NJRCA9IDA7CisgICAgbV9kb2NJRCA9IGRvY0lEKys7CisK
KyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgV1RGX0FSUkFZX0xFTkdUSChtX25vZGVMaXN0
Q291bnRzKTsgaSsrKQorICAgICAgICBtX25vZGVMaXN0Q291bnRzW2ldID0gMDsKKworICAgIGZv
ciAodW5zaWduZWQgaSA9IDA7IGkgPCBXVEZfQVJSQVlfTEVOR1RIKG1fY29sbGVjdGlvbnMpOyBp
KyspCisgICAgICAgIG1fY29sbGVjdGlvbnNbaV0gPSAwOworCisgICAgSW5zcGVjdG9yQ291bnRl
cnM6OmluY3JlbWVudENvdW50ZXIoSW5zcGVjdG9yQ291bnRlcnM6OkRvY3VtZW50Q291bnRlcik7
Cit9CisKK3N0YXRpYyB2b2lkIGhpc3RvZ3JhbU11dGF0aW9uRXZlbnRVc2FnZShjb25zdCB1bnNp
Z25lZCBzaG9ydCYgbGlzdGVuZXJUeXBlcykKK3sKKyAgICBIaXN0b2dyYW1TdXBwb3J0OjpoaXN0
b2dyYW1FbnVtZXJhdGlvbigiRE9NQVBJLlBlckRvY3VtZW50TXV0YXRpb25FdmVudFVzYWdlLkRP
TVN1YnRyZWVNb2RpZmllZCIsIHN0YXRpY19jYXN0PGJvb2w+KGxpc3RlbmVyVHlwZXMgJiBEb2N1
bWVudDo6RE9NU1VCVFJFRU1PRElGSUVEX0xJU1RFTkVSKSwgMik7CisgICAgSGlzdG9ncmFtU3Vw
cG9ydDo6aGlzdG9ncmFtRW51bWVyYXRpb24oIkRPTUFQSS5QZXJEb2N1bWVudE11dGF0aW9uRXZl
bnRVc2FnZS5ET01Ob2RlSW5zZXJ0ZWQiLCBzdGF0aWNfY2FzdDxib29sPihsaXN0ZW5lclR5cGVz
ICYgRG9jdW1lbnQ6OkRPTU5PREVJTlNFUlRFRF9MSVNURU5FUiksIDIpOworICAgIEhpc3RvZ3Jh
bVN1cHBvcnQ6Omhpc3RvZ3JhbUVudW1lcmF0aW9uKCJET01BUEkuUGVyRG9jdW1lbnRNdXRhdGlv
bkV2ZW50VXNhZ2UuRE9NTm9kZVJlbW92ZWQiLCBzdGF0aWNfY2FzdDxib29sPihsaXN0ZW5lclR5
cGVzICYgRG9jdW1lbnQ6OkRPTU5PREVSRU1PVkVEX0xJU1RFTkVSKSwgMik7CisgICAgSGlzdG9n
cmFtU3VwcG9ydDo6aGlzdG9ncmFtRW51bWVyYXRpb24oIkRPTUFQSS5QZXJEb2N1bWVudE11dGF0
aW9uRXZlbnRVc2FnZS5ET01Ob2RlUmVtb3ZlZEZyb21Eb2N1bWVudCIsIHN0YXRpY19jYXN0PGJv
b2w+KGxpc3RlbmVyVHlwZXMgJiBEb2N1bWVudDo6RE9NTk9ERVJFTU9WRURGUk9NRE9DVU1FTlRf
TElTVEVORVIpLCAyKTsKKyAgICBIaXN0b2dyYW1TdXBwb3J0OjpoaXN0b2dyYW1FbnVtZXJhdGlv
bigiRE9NQVBJLlBlckRvY3VtZW50TXV0YXRpb25FdmVudFVzYWdlLkRPTU5vZGVJbnNlcnRlZElu
dG9Eb2N1bWVudCIsIHN0YXRpY19jYXN0PGJvb2w+KGxpc3RlbmVyVHlwZXMgJiBEb2N1bWVudDo6
RE9NTk9ERUlOU0VSVEVESU5UT0RPQ1VNRU5UX0xJU1RFTkVSKSwgMik7CisgICAgSGlzdG9ncmFt
U3VwcG9ydDo6aGlzdG9ncmFtRW51bWVyYXRpb24oIkRPTUFQSS5QZXJEb2N1bWVudE11dGF0aW9u
RXZlbnRVc2FnZS5ET01DaGFyYWN0ZXJEYXRhTW9kaWZpZWQiLCBzdGF0aWNfY2FzdDxib29sPihs
aXN0ZW5lclR5cGVzICYgRG9jdW1lbnQ6OkRPTUNIQVJBQ1RFUkRBVEFNT0RJRklFRF9MSVNURU5F
UiksIDIpOworfQorCisjaWYgRU5BQkxFKEZVTExTQ1JFRU5fQVBJKQorc3RhdGljIGJvb2wgaXNB
dHRyaWJ1dGVPbkFsbE93bmVycyhjb25zdCBXZWJDb3JlOjpRdWFsaWZpZWROYW1lJiBhdHRyaWJ1
dGUsIGNvbnN0IEhUTUxGcmFtZU93bmVyRWxlbWVudCogb3duZXIpCit7CisgICAgaWYgKCFvd25l
cikKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgZG8geworICAgICAgICBpZiAoIW93bmVyLT5o
YXNBdHRyaWJ1dGUoYXR0cmlidXRlKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9
IHdoaWxlICgob3duZXIgPSBvd25lci0+ZG9jdW1lbnQoKS0+b3duZXJFbGVtZW50KCkpKTsKKyAg
ICByZXR1cm4gdHJ1ZTsKK30KKyNlbmRpZgorCitEb2N1bWVudDo6fkRvY3VtZW50KCkKK3sKKyAg
ICBBU1NFUlQoIXJlbmRlcmVyKCkpOworICAgIEFTU0VSVCghbV9pblBhZ2VDYWNoZSk7CisgICAg
QVNTRVJUKCFtX3NhdmVkUmVuZGVyZXIpOworICAgIEFTU0VSVChtX3Jhbmdlcy5pc0VtcHR5KCkp
OworICAgIEFTU0VSVCghbV9zdHlsZVJlY2FsY1RpbWVyLmlzQWN0aXZlKCkpOworICAgIEFTU0VS
VCghbV9wYXJlbnRUcmVlU2NvcGUpOworICAgIEFTU0VSVCghbV9ndWFyZFJlZkNvdW50KTsKKwor
ICAgIC8vIEZJWE1FOiBTaG91bGQgd2UgcmVzZXQgbV9kb21XaW5kb3cgd2hlbiB3ZSBkZXRhY2gg
ZnJvbSB0aGUgRnJhbWU/CisgICAgaWYgKG1fZG9tV2luZG93KQorICAgICAgICBtX2RvbVdpbmRv
dy0+cmVzZXRVbmxlc3NTdXNwZW5kZWRGb3JQYWdlQ2FjaGUoKTsKKworICAgIG1fc2NyaXB0UnVu
bmVyLmNsZWFyKCk7CisKKyAgICBoaXN0b2dyYW1NdXRhdGlvbkV2ZW50VXNhZ2UobV9saXN0ZW5l
clR5cGVzKTsKKworICAgIHJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzKCk7CisKKyAgICAvLyBDdXJy
ZW50bHkgd2UgYmVsaWV2ZSB0aGF0IERvY3VtZW50IGNhbiBuZXZlciBvdXRsaXZlIHRoZSBwYXJz
ZXIuCisgICAgLy8gQWx0aG91Z2ggdGhlIERvY3VtZW50IG1heSBiZSByZXBsYWNlZCBzeW5jaHJv
bm91c2x5LCBEb2N1bWVudFBhcnNlcnMKKyAgICAvLyBnZW5lcmFsbHkga2VlcCBhdCBsZWFzdCBv
bmUgcmVmZXJlbmNlIHRvIGFuIEVsZW1lbnQgd2hpY2ggd291bGQgaW4gdHVybgorICAgIC8vIGhh
cyBhIHJlZmVyZW5jZSB0byB0aGUgRG9jdW1lbnQuICBJZiB5b3UgaGl0IHRoaXMgQVNTRVJULCB0
aGVuIHRoYXQKKyAgICAvLyBhc3N1bXB0aW9uIGlzIHdyb25nLiAgRG9jdW1lbnRQYXJzZXI6OmRl
dGFjaCgpIHNob3VsZCBlbnN1cmUgdGhhdCBldmVuCisgICAgLy8gaWYgdGhlIERvY3VtZW50UGFy
c2VyIG91dGxpdmVzIHRoZSBEb2N1bWVudCBpdCB3b24ndCBjYXVzZSBiYWRuZXNzLgorICAgIEFT
U0VSVCghbV9wYXJzZXIgfHwgbV9wYXJzZXItPnJlZkNvdW50KCkgPT0gMSk7CisgICAgZGV0YWNo
UGFyc2VyKCk7CisKKyAgICBtX3JlbmRlckFyZW5hLmNsZWFyKCk7CisKKyAgICBjbGVhckFYT2Jq
ZWN0Q2FjaGUoKTsKKworICAgIG1fZGVjb2RlciA9IDA7CisKKyAgICBpZiAobV9zdHlsZVNoZWV0
cykKKyAgICAgICAgbV9zdHlsZVNoZWV0cy0+ZG9jdW1lbnREZXN0cm95ZWQoKTsKKworICAgIGlm
IChtX25hbWVkRmxvd3MpCisgICAgICAgIG1fbmFtZWRGbG93cy0+ZG9jdW1lbnREZXN0cm95ZWQo
KTsKKworICAgIGlmIChtX2VsZW1TaGVldCkKKyAgICAgICAgbV9lbGVtU2hlZXQtPmNsZWFyT3du
ZXJOb2RlKCk7CisgICAgaWYgKG1fcGFnZVVzZXJTaGVldCkKKyAgICAgICAgbV9wYWdlVXNlclNo
ZWV0LT5jbGVhck93bmVyTm9kZSgpOworICAgIGlmIChtX3BhZ2VHcm91cFVzZXJTaGVldHMpIHsK
KyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX3BhZ2VHcm91cFVzZXJTaGVldHMtPnNp
emUoKTsgKytpKQorICAgICAgICAgICAgKCptX3BhZ2VHcm91cFVzZXJTaGVldHMpW2ldLT5jbGVh
ck93bmVyTm9kZSgpOworICAgIH0KKyAgICBpZiAobV91c2VyU2hlZXRzKSB7CisgICAgICAgIGZv
ciAoc2l6ZV90IGkgPSAwOyBpIDwgbV91c2VyU2hlZXRzLT5zaXplKCk7ICsraSkKKyAgICAgICAg
ICAgICgqbV91c2VyU2hlZXRzKVtpXS0+Y2xlYXJPd25lck5vZGUoKTsKKyAgICB9CisKKyAgICBk
ZWxldGVDdXN0b21Gb250cygpOworCisgICAgbV93ZWFrUmVmZXJlbmNlLT5jbGVhcigpOworCisg
ICAgaWYgKG1fbWVkaWFRdWVyeU1hdGNoZXIpCisgICAgICAgIG1fbWVkaWFRdWVyeU1hdGNoZXIt
PmRvY3VtZW50RGVzdHJveWVkKCk7CisKKyAgICBjbGVhclN0eWxlUmVzb2x2ZXIoKTsgLy8gV2Ug
bmVlZCB0byBkZXN0b3J5IENTU0ZvbnRTZWxlY3RvciBiZWZvcmUgZGVzdHJveWluZyBtX2NhY2hl
ZFJlc291cmNlTG9hZGVyLgorICAgIG1fY2FjaGVkUmVzb3VyY2VMb2FkZXIuY2xlYXIoKTsKKwor
ICAgIC8vIFdlIG11c3QgY2FsbCBjbGVhclJhcmVEYXRhKCkgaGVyZSBzaW5jZSBhIERvY3VtZW50
IGNsYXNzIGluaGVyaXRzIFRyZWVTY29wZQorICAgIC8vIGFzIHdlbGwgYXMgTm9kZS4gU2VlIGEg
Y29tbWVudCBvbiBUcmVlU2NvcGUuaCBmb3IgdGhlIHJlYXNvbi4KKyAgICBpZiAoaGFzUmFyZURh
dGEoKSkKKyAgICAgICAgY2xlYXJSYXJlRGF0YSgpOworCisgICAgQVNTRVJUKCFtX2xpc3RzSW52
YWxpZGF0ZWRBdERvY3VtZW50LnNpemUoKSk7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp
IDwgV1RGX0FSUkFZX0xFTkdUSChtX25vZGVMaXN0Q291bnRzKTsgaSsrKQorICAgICAgICBBU1NF
UlQoIW1fbm9kZUxpc3RDb3VudHNbaV0pOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8
IFdURl9BUlJBWV9MRU5HVEgobV9jb2xsZWN0aW9ucyk7IGkrKykKKyAgICAgICAgQVNTRVJUKCFt
X2NvbGxlY3Rpb25zW2ldKTsKKworICAgIG1fZG9jdW1lbnQgPSAwOworCisgICAgSW5zcGVjdG9y
Q291bnRlcnM6OmRlY3JlbWVudENvdW50ZXIoSW5zcGVjdG9yQ291bnRlcnM6OkRvY3VtZW50Q291
bnRlcik7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnJlbW92ZWRMYXN0UmVmKCkKK3sKKyAgICBBU1NF
UlQoIW1fZGVsZXRpb25IYXNCZWd1bik7CisgICAgaWYgKG1fZ3VhcmRSZWZDb3VudCkgeworICAg
ICAgICAvLyBJZiByZW1vdmluZyBhIGNoaWxkIHJlbW92ZXMgdGhlIGxhc3Qgc2VsZi1vbmx5IHJl
Ziwgd2UgZG9uJ3QKKyAgICAgICAgLy8gd2FudCB0aGUgc2NvcGUgdG8gYmUgZGVzdHJ1Y3RlZCB1
bnRpbCBhZnRlcgorICAgICAgICAvLyByZW1vdmVBbGxDaGlsZHJlbiByZXR1cm5zLCBzbyB3ZSBn
dWFyZCBvdXJzZWx2ZXMgd2l0aCBhbgorICAgICAgICAvLyBleHRyYSBzZWxmLW9ubHkgcmVmLgor
ICAgICAgICBndWFyZFJlZigpOworCisgICAgICAgIC8vIFdlIG11c3QgbWFrZSBzdXJlIG5vdCB0
byBiZSByZXRhaW5pbmcgYW55IG9mIG91ciBjaGlsZHJlbiB0aHJvdWdoCisgICAgICAgIC8vIHRo
ZXNlIGV4dHJhIHBvaW50ZXJzIG9yIHdlIHdpbGwgY3JlYXRlIGEgcmVmZXJlbmNlIGN5Y2xlLgor
ICAgICAgICBtX2RvY1R5cGUgPSAwOworICAgICAgICBtX2ZvY3VzZWROb2RlID0gMDsKKyAgICAg
ICAgbV9ob3Zlck5vZGUgPSAwOworICAgICAgICBtX2FjdGl2ZU5vZGUgPSAwOworICAgICAgICBt
X3RpdGxlRWxlbWVudCA9IDA7CisgICAgICAgIG1fZG9jdW1lbnRFbGVtZW50ID0gMDsKKyAgICAg
ICAgbV9jb250ZXh0RmVhdHVyZXMgPSBDb250ZXh0RmVhdHVyZXM6OmRlZmF1bHRTd2l0Y2goKTsK
KyNpZiBFTkFCTEUoRlVMTFNDUkVFTl9BUEkpCisgICAgICAgIG1fZnVsbFNjcmVlbkVsZW1lbnQg
PSAwOworICAgICAgICBtX2Z1bGxTY3JlZW5FbGVtZW50U3RhY2suY2xlYXIoKTsKKyNlbmRpZgor
CisgICAgICAgIGRldGFjaFBhcnNlcigpOworCisgICAgICAgIC8vIHJlbW92ZUFsbENoaWxkcmVu
KCkgZG9lc24ndCBhbHdheXMgdW5yZWdpc3RlciBJRHMsCisgICAgICAgIC8vIHNvIHRlYXIgZG93
biBzY29wZSBpbmZvcm1hdGlvbiB1cGZyb250IHRvIGF2b2lkIGhhdmluZyBzdGFsZSByZWZlcmVu
Y2VzIGluIHRoZSBtYXAuCisgICAgICAgIGRlc3Ryb3lUcmVlU2NvcGVEYXRhKCk7CisgICAgICAg
IHJlbW92ZUFsbENoaWxkcmVuKCk7CisKKyAgICAgICAgbV9tYXJrZXJzLT5kZXRhY2goKTsKKwor
ICAgICAgICBtX2Nzc0NhbnZhc0VsZW1lbnRzLmNsZWFyKCk7CisKKyNpZiBFTkFCTEUoUkVRVUVT
VF9BTklNQVRJT05fRlJBTUUpCisgICAgICAgIC8vIEZJWE1FOiBjb25zaWRlciB1c2luZyBBY3Rp
dmVET01PYmplY3QuCisgICAgICAgIGlmIChtX3NjcmlwdGVkQW5pbWF0aW9uQ29udHJvbGxlcikK
KyAgICAgICAgICAgIG1fc2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyLT5jbGVhckRvY3VtZW50
UG9pbnRlcigpOworICAgICAgICBtX3NjcmlwdGVkQW5pbWF0aW9uQ29udHJvbGxlci5jbGVhcigp
OworI2VuZGlmCisKKyNpZm5kZWYgTkRFQlVHCisgICAgICAgIG1faW5SZW1vdmVkTGFzdFJlZkZ1
bmN0aW9uID0gZmFsc2U7CisjZW5kaWYKKworICAgICAgICBndWFyZERlcmVmKCk7CisgICAgfSBl
bHNlIHsKKyNpZm5kZWYgTkRFQlVHIAorICAgICAgICBtX2RlbGV0aW9uSGFzQmVndW4gPSB0cnVl
OyAKKyNlbmRpZiAKKyAgICAgICAgZGVsZXRlIHRoaXM7CisgICAgfQorfQorCitFbGVtZW50KiBE
b2N1bWVudDo6Z2V0RWxlbWVudEJ5SWQoY29uc3QgQXRvbWljU3RyaW5nJiBpZCkgY29uc3QKK3sK
KyAgICByZXR1cm4gVHJlZVNjb3BlOjpnZXRFbGVtZW50QnlJZChpZCk7Cit9CisKK0VsZW1lbnQq
IERvY3VtZW50OjpnZXRFbGVtZW50QnlBY2Nlc3NLZXkoY29uc3QgU3RyaW5nJiBrZXkpCit7Cisg
ICAgaWYgKGtleS5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiAwOworICAgIGlmICghbV9hY2Nl
c3NLZXlNYXBWYWxpZCkgeworICAgICAgICBidWlsZEFjY2Vzc0tleU1hcCh0aGlzKTsKKyAgICAg
ICAgbV9hY2Nlc3NLZXlNYXBWYWxpZCA9IHRydWU7CisgICAgfQorICAgIHJldHVybiBtX2VsZW1l
bnRzQnlBY2Nlc3NLZXkuZ2V0KGtleS5pbXBsKCkpOworfQorCit2b2lkIERvY3VtZW50OjpidWls
ZEFjY2Vzc0tleU1hcChUcmVlU2NvcGUqIHNjb3BlKQoreworICAgIEFTU0VSVChzY29wZSk7Cisg
ICAgTm9kZSogcm9vdE5vZGUgPSBzY29wZS0+cm9vdE5vZGUoKTsKKyAgICBmb3IgKE5vZGUqIG5v
ZGUgPSByb290Tm9kZTsgbm9kZTsgbm9kZSA9IG5vZGUtPnRyYXZlcnNlTmV4dE5vZGUocm9vdE5v
ZGUpKSB7CisgICAgICAgIGlmICghbm9kZS0+aXNFbGVtZW50Tm9kZSgpKQorICAgICAgICAgICAg
Y29udGludWU7CisgICAgICAgIEVsZW1lbnQqIGVsZW1lbnQgPSBzdGF0aWNfY2FzdDxFbGVtZW50
Kj4obm9kZSk7CisgICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyYgYWNjZXNzS2V5ID0gZWxlbWVu
dC0+Z2V0QXR0cmlidXRlKGFjY2Vzc2tleUF0dHIpOworICAgICAgICBpZiAoIWFjY2Vzc0tleS5p
c0VtcHR5KCkpCisgICAgICAgICAgICBtX2VsZW1lbnRzQnlBY2Nlc3NLZXkuc2V0KGFjY2Vzc0tl
eS5pbXBsKCksIGVsZW1lbnQpOworCisgICAgICAgIGZvciAoU2hhZG93Um9vdCogcm9vdCA9IG5v
ZGUtPnlvdW5nZXN0U2hhZG93Um9vdCgpOyByb290OyByb290ID0gcm9vdC0+b2xkZXJTaGFkb3dS
b290KCkpCisgICAgICAgICAgICBidWlsZEFjY2Vzc0tleU1hcChyb290KTsKKyAgICB9Cit9CisK
K3ZvaWQgRG9jdW1lbnQ6OmludmFsaWRhdGVBY2Nlc3NLZXlNYXAoKQoreworICAgIG1fYWNjZXNz
S2V5TWFwVmFsaWQgPSBmYWxzZTsKKyAgICBtX2VsZW1lbnRzQnlBY2Nlc3NLZXkuY2xlYXIoKTsK
K30KKworU2VsZWN0b3JRdWVyeUNhY2hlKiBEb2N1bWVudDo6c2VsZWN0b3JRdWVyeUNhY2hlKCkK
K3sKKyAgICBpZiAoIW1fc2VsZWN0b3JRdWVyeUNhY2hlKQorICAgICAgICBtX3NlbGVjdG9yUXVl
cnlDYWNoZSA9IGFkb3B0UHRyKG5ldyBTZWxlY3RvclF1ZXJ5Q2FjaGUoKSk7CisgICAgcmV0dXJu
IG1fc2VsZWN0b3JRdWVyeUNhY2hlLmdldCgpOworfQorCitNZWRpYVF1ZXJ5TWF0Y2hlciogRG9j
dW1lbnQ6Om1lZGlhUXVlcnlNYXRjaGVyKCkKK3sKKyAgICBpZiAoIW1fbWVkaWFRdWVyeU1hdGNo
ZXIpCisgICAgICAgIG1fbWVkaWFRdWVyeU1hdGNoZXIgPSBNZWRpYVF1ZXJ5TWF0Y2hlcjo6Y3Jl
YXRlKHRoaXMpOworICAgIHJldHVybiBtX21lZGlhUXVlcnlNYXRjaGVyLmdldCgpOworfQorCit2
b2lkIERvY3VtZW50OjpzZXRDb21wYXRpYmlsaXR5TW9kZShDb21wYXRpYmlsaXR5TW9kZSBtb2Rl
KQoreworICAgIGlmIChtX2NvbXBhdGliaWxpdHlNb2RlTG9ja2VkIHx8IG1vZGUgPT0gbV9jb21w
YXRpYmlsaXR5TW9kZSkKKyAgICAgICAgcmV0dXJuOworICAgIEFTU0VSVCghbV9zdHlsZVNoZWV0
cy0+bGVuZ3RoKCkpOworICAgIGJvb2wgd2FzSW5RdWlya3NNb2RlID0gaW5RdWlya3NNb2RlKCk7
CisgICAgbV9jb21wYXRpYmlsaXR5TW9kZSA9IG1vZGU7CisgICAgc2VsZWN0b3JRdWVyeUNhY2hl
KCktPmludmFsaWRhdGUoKTsKKyAgICBpZiAoaW5RdWlya3NNb2RlKCkgIT0gd2FzSW5RdWlya3NN
b2RlKSB7CisgICAgICAgIC8vIEFsbCB1c2VyIHN0eWxlc2hlZXRzIGhhdmUgdG8gcmVwYXJzZSB1
c2luZyB0aGUgZGlmZmVyZW50IG1vZGUuCisgICAgICAgIGNsZWFyUGFnZVVzZXJTaGVldCgpOwor
ICAgICAgICBjbGVhclBhZ2VHcm91cFVzZXJTaGVldHMoKTsKKyAgICB9Cit9CisKK1N0cmluZyBE
b2N1bWVudDo6Y29tcGF0TW9kZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGluUXVpcmtzTW9kZSgp
ID8gIkJhY2tDb21wYXQiIDogIkNTUzFDb21wYXQiOworfQorCit2b2lkIERvY3VtZW50OjpyZXNl
dExpbmtDb2xvcigpCit7CisgICAgbV9saW5rQ29sb3IgPSBDb2xvcigwLCAwLCAyMzgpOworfQor
Cit2b2lkIERvY3VtZW50OjpyZXNldFZpc2l0ZWRMaW5rQ29sb3IoKQoreworICAgIG1fdmlzaXRl
ZExpbmtDb2xvciA9IENvbG9yKDg1LCAyNiwgMTM5KTsgICAgCit9CisKK3ZvaWQgRG9jdW1lbnQ6
OnJlc2V0QWN0aXZlTGlua0NvbG9yKCkKK3sKKyAgICBtX2FjdGl2ZUxpbmtDb2xvci5zZXROYW1l
ZENvbG9yKCJyZWQiKTsKK30KKwordm9pZCBEb2N1bWVudDo6c2V0RG9jVHlwZShQYXNzUmVmUHRy
PERvY3VtZW50VHlwZT4gZG9jVHlwZSkKK3sKKyAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBiZSBj
YWxsZWQgbW9yZSB0aGFuIG9uY2UuCisgICAgQVNTRVJUKCFtX2RvY1R5cGUgfHwgIWRvY1R5cGUp
OworICAgIG1fZG9jVHlwZSA9IGRvY1R5cGU7CisgICAgaWYgKG1fZG9jVHlwZSkgeworICAgICAg
ICB0aGlzLT5hZG9wdElmTmVlZGVkKG1fZG9jVHlwZS5nZXQoKSk7CisjaWYgRU5BQkxFKExFR0FD
WV9WSUVXUE9SVF9BREFQVElPTikKKyAgICAgICAgaWYgKG1fZG9jVHlwZS0+cHVibGljSWQoKS5z
dGFydHNXaXRoKCItLy93YXBmb3J1bS8vZHRkIHhodG1sIG1vYmlsZSAxLiIsIC8qIGNhc2VTZW5z
aXRpdmUgKi8gZmFsc2UpKQorICAgICAgICAgICAgcHJvY2Vzc1ZpZXdwb3J0KCJ3aWR0aD1kZXZp
Y2Utd2lkdGgsIGhlaWdodD1kZXZpY2UtaGVpZ2h0IiwgVmlld3BvcnRBcmd1bWVudHM6OlhIVE1M
TW9iaWxlUHJvZmlsZSk7CisjZW5kaWYKKyAgICB9CisgICAgLy8gRG9jdHlwZSBhZmZlY3RzIHRo
ZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgc3R5bGVzaGVldHMuCisgICAgY2xlYXJTdHlsZVJlc29s
dmVyKCk7Cit9CisKK0RPTUltcGxlbWVudGF0aW9uKiBEb2N1bWVudDo6aW1wbGVtZW50YXRpb24o
KQoreworICAgIGlmICghbV9pbXBsZW1lbnRhdGlvbikKKyAgICAgICAgbV9pbXBsZW1lbnRhdGlv
biA9IERPTUltcGxlbWVudGF0aW9uOjpjcmVhdGUodGhpcyk7CisgICAgcmV0dXJuIG1faW1wbGVt
ZW50YXRpb24uZ2V0KCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmNoaWxkcmVuQ2hhbmdlZChib29s
IGNoYW5nZWRCeVBhcnNlciwgTm9kZSogYmVmb3JlQ2hhbmdlLCBOb2RlKiBhZnRlckNoYW5nZSwg
aW50IGNoaWxkQ291bnREZWx0YSkKK3sKKyAgICBDb250YWluZXJOb2RlOjpjaGlsZHJlbkNoYW5n
ZWQoY2hhbmdlZEJ5UGFyc2VyLCBiZWZvcmVDaGFuZ2UsIGFmdGVyQ2hhbmdlLCBjaGlsZENvdW50
RGVsdGEpOworICAgIAorICAgIEVsZW1lbnQqIG5ld0RvY3VtZW50RWxlbWVudCA9IGZpcnN0RWxl
bWVudENoaWxkKHRoaXMpOworICAgIGlmIChuZXdEb2N1bWVudEVsZW1lbnQgPT0gbV9kb2N1bWVu
dEVsZW1lbnQpCisgICAgICAgIHJldHVybjsKKyAgICBtX2RvY3VtZW50RWxlbWVudCA9IG5ld0Rv
Y3VtZW50RWxlbWVudDsKKyAgICAvLyBUaGUgcm9vdCBzdHlsZSB1c2VkIGZvciBtZWRpYSBxdWVy
eSBtYXRjaGluZyBkZXBlbmRzIG9uIHRoZSBkb2N1bWVudCBlbGVtZW50LgorICAgIGNsZWFyU3R5
bGVSZXNvbHZlcigpOworfQorCitQYXNzUmVmUHRyPEVsZW1lbnQ+IERvY3VtZW50OjpjcmVhdGVF
bGVtZW50KGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSwgRXhjZXB0aW9uQ29kZSYgZWMpCit7Cisg
ICAgaWYgKCFpc1ZhbGlkTmFtZShuYW1lKSkgeworICAgICAgICBlYyA9IElOVkFMSURfQ0hBUkFD
VEVSX0VSUjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKG1faXNYSFRNTCkK
KyAgICAgICAgcmV0dXJuIEhUTUxFbGVtZW50RmFjdG9yeTo6Y3JlYXRlSFRNTEVsZW1lbnQoUXVh
bGlmaWVkTmFtZShudWxsQXRvbSwgbmFtZSwgeGh0bWxOYW1lc3BhY2VVUkkpLCB0aGlzLCAwLCBm
YWxzZSk7CisKKyAgICByZXR1cm4gY3JlYXRlRWxlbWVudChRdWFsaWZpZWROYW1lKG51bGxBdG9t
LCBuYW1lLCBudWxsQXRvbSksIGZhbHNlKTsKK30KKworUGFzc1JlZlB0cjxEb2N1bWVudEZyYWdt
ZW50PiBEb2N1bWVudDo6Y3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpCit7CisgICAgcmV0dXJuIERv
Y3VtZW50RnJhZ21lbnQ6OmNyZWF0ZShkb2N1bWVudCgpKTsKK30KKworUGFzc1JlZlB0cjxUZXh0
PiBEb2N1bWVudDo6Y3JlYXRlVGV4dE5vZGUoY29uc3QgU3RyaW5nJiBkYXRhKQoreworICAgIHJl
dHVybiBUZXh0OjpjcmVhdGUodGhpcywgZGF0YSk7Cit9CisKK1Bhc3NSZWZQdHI8Q29tbWVudD4g
RG9jdW1lbnQ6OmNyZWF0ZUNvbW1lbnQoY29uc3QgU3RyaW5nJiBkYXRhKQoreworICAgIHJldHVy
biBDb21tZW50OjpjcmVhdGUodGhpcywgZGF0YSk7Cit9CisKK1Bhc3NSZWZQdHI8Q0RBVEFTZWN0
aW9uPiBEb2N1bWVudDo6Y3JlYXRlQ0RBVEFTZWN0aW9uKGNvbnN0IFN0cmluZyYgZGF0YSwgRXhj
ZXB0aW9uQ29kZSYgZWMpCit7CisgICAgaWYgKGlzSFRNTERvY3VtZW50KCkpIHsKKyAgICAgICAg
ZWMgPSBOT1RfU1VQUE9SVEVEX0VSUjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJl
dHVybiBDREFUQVNlY3Rpb246OmNyZWF0ZSh0aGlzLCBkYXRhKTsKK30KKworUGFzc1JlZlB0cjxQ
cm9jZXNzaW5nSW5zdHJ1Y3Rpb24+IERvY3VtZW50OjpjcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rp
b24oY29uc3QgU3RyaW5nJiB0YXJnZXQsIGNvbnN0IFN0cmluZyYgZGF0YSwgRXhjZXB0aW9uQ29k
ZSYgZWMpCit7CisgICAgaWYgKCFpc1ZhbGlkTmFtZSh0YXJnZXQpKSB7CisgICAgICAgIGVjID0g
SU5WQUxJRF9DSEFSQUNURVJfRVJSOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYg
KGlzSFRNTERvY3VtZW50KCkpIHsKKyAgICAgICAgZWMgPSBOT1RfU1VQUE9SVEVEX0VSUjsKKyAg
ICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb246
OmNyZWF0ZSh0aGlzLCB0YXJnZXQsIGRhdGEpOworfQorCitQYXNzUmVmUHRyPEVudGl0eVJlZmVy
ZW5jZT4gRG9jdW1lbnQ6OmNyZWF0ZUVudGl0eVJlZmVyZW5jZShjb25zdCBTdHJpbmcmIG5hbWUs
IEV4Y2VwdGlvbkNvZGUmIGVjKQoreworICAgIGlmICghaXNWYWxpZE5hbWUobmFtZSkpIHsKKyAg
ICAgICAgZWMgPSBJTlZBTElEX0NIQVJBQ1RFUl9FUlI7CisgICAgICAgIHJldHVybiAwOworICAg
IH0KKyAgICBpZiAoaXNIVE1MRG9jdW1lbnQoKSkgeworICAgICAgICBlYyA9IE5PVF9TVVBQT1JU
RURfRVJSOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIEVudGl0eVJlZmVy
ZW5jZTo6Y3JlYXRlKHRoaXMsIG5hbWUpOworfQorCitQYXNzUmVmUHRyPEVkaXRpbmdUZXh0PiBE
b2N1bWVudDo6Y3JlYXRlRWRpdGluZ1RleHROb2RlKGNvbnN0IFN0cmluZyYgdGV4dCkKK3sKKyAg
ICByZXR1cm4gRWRpdGluZ1RleHQ6OmNyZWF0ZSh0aGlzLCB0ZXh0KTsKK30KKworUGFzc1JlZlB0
cjxDU1NTdHlsZURlY2xhcmF0aW9uPiBEb2N1bWVudDo6Y3JlYXRlQ1NTU3R5bGVEZWNsYXJhdGlv
bigpCit7CisgICAgcmV0dXJuIFN0eWxlUHJvcGVydHlTZXQ6OmNyZWF0ZSgpLT5lbnN1cmVDU1NT
dHlsZURlY2xhcmF0aW9uKCk7Cit9CisKK1Bhc3NSZWZQdHI8Tm9kZT4gRG9jdW1lbnQ6OmltcG9y
dE5vZGUoTm9kZSogaW1wb3J0ZWROb2RlLCBib29sIGRlZXAsIEV4Y2VwdGlvbkNvZGUmIGVjKQor
eworICAgIGVjID0gMDsKKyAgICAKKyAgICBpZiAoIWltcG9ydGVkTm9kZSkgeworICAgICAgICBl
YyA9IE5PVF9TVVBQT1JURURfRVJSOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBz
d2l0Y2ggKGltcG9ydGVkTm9kZS0+bm9kZVR5cGUoKSkgeworICAgIGNhc2UgVEVYVF9OT0RFOgor
ICAgICAgICByZXR1cm4gY3JlYXRlVGV4dE5vZGUoaW1wb3J0ZWROb2RlLT5ub2RlVmFsdWUoKSk7
CisgICAgY2FzZSBDREFUQV9TRUNUSU9OX05PREU6CisgICAgICAgIHJldHVybiBjcmVhdGVDREFU
QVNlY3Rpb24oaW1wb3J0ZWROb2RlLT5ub2RlVmFsdWUoKSwgZWMpOworICAgIGNhc2UgRU5USVRZ
X1JFRkVSRU5DRV9OT0RFOgorICAgICAgICByZXR1cm4gY3JlYXRlRW50aXR5UmVmZXJlbmNlKGlt
cG9ydGVkTm9kZS0+bm9kZU5hbWUoKSwgZWMpOworICAgIGNhc2UgUFJPQ0VTU0lOR19JTlNUUlVD
VElPTl9OT0RFOgorICAgICAgICByZXR1cm4gY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKGlt
cG9ydGVkTm9kZS0+bm9kZU5hbWUoKSwgaW1wb3J0ZWROb2RlLT5ub2RlVmFsdWUoKSwgZWMpOwor
ICAgIGNhc2UgQ09NTUVOVF9OT0RFOgorICAgICAgICByZXR1cm4gY3JlYXRlQ29tbWVudChpbXBv
cnRlZE5vZGUtPm5vZGVWYWx1ZSgpKTsKKyAgICBjYXNlIEVMRU1FTlRfTk9ERTogeworICAgICAg
ICBFbGVtZW50KiBvbGRFbGVtZW50ID0gc3RhdGljX2Nhc3Q8RWxlbWVudCo+KGltcG9ydGVkTm9k
ZSk7CisgICAgICAgIC8vIEZJWE1FOiBUaGUgZm9sbG93aW5nIGNoZWNrIG1pZ2h0IGJlIHVubmVj
ZXNzYXJ5LiBJcyBpdCBwb3NzaWJsZSB0aGF0CisgICAgICAgIC8vIG9sZEVsZW1lbnQgaGFzIG1p
c21hdGNoZWQgcHJlZml4L25hbWVzcGFjZT8KKyAgICAgICAgaWYgKCFoYXNWYWxpZE5hbWVzcGFj
ZUZvckVsZW1lbnRzKG9sZEVsZW1lbnQtPnRhZ1FOYW1lKCkpKSB7CisgICAgICAgICAgICBlYyA9
IE5BTUVTUEFDRV9FUlI7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAg
ICBSZWZQdHI8RWxlbWVudD4gbmV3RWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQob2xkRWxlbWVudC0+
dGFnUU5hbWUoKSwgZWMpOworICAgICAgICBpZiAoZWMpCisgICAgICAgICAgICByZXR1cm4gMDsK
KworICAgICAgICBuZXdFbGVtZW50LT5jbG9uZURhdGFGcm9tRWxlbWVudCgqb2xkRWxlbWVudCk7
CisKKyAgICAgICAgaWYgKGRlZXApIHsKKyAgICAgICAgICAgIGZvciAoTm9kZSogb2xkQ2hpbGQg
PSBvbGRFbGVtZW50LT5maXJzdENoaWxkKCk7IG9sZENoaWxkOyBvbGRDaGlsZCA9IG9sZENoaWxk
LT5uZXh0U2libGluZygpKSB7CisgICAgICAgICAgICAgICAgUmVmUHRyPE5vZGU+IG5ld0NoaWxk
ID0gaW1wb3J0Tm9kZShvbGRDaGlsZCwgdHJ1ZSwgZWMpOworICAgICAgICAgICAgICAgIGlmIChl
YykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgbmV3RWxl
bWVudC0+YXBwZW5kQ2hpbGQobmV3Q2hpbGQucmVsZWFzZSgpLCBlYyk7CisgICAgICAgICAgICAg
ICAgaWYgKGVjKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXdFbGVtZW50LnJlbGVhc2UoKTsKKyAgICB9
CisgICAgY2FzZSBBVFRSSUJVVEVfTk9ERToKKyAgICAgICAgcmV0dXJuIEF0dHI6OmNyZWF0ZSh0
aGlzLCBRdWFsaWZpZWROYW1lKG51bGxBdG9tLCBzdGF0aWNfY2FzdDxBdHRyKj4oaW1wb3J0ZWRO
b2RlKS0+bmFtZSgpLCBudWxsQXRvbSksIHN0YXRpY19jYXN0PEF0dHIqPihpbXBvcnRlZE5vZGUp
LT52YWx1ZSgpKTsKKyAgICBjYXNlIERPQ1VNRU5UX0ZSQUdNRU5UX05PREU6IHsKKyAgICAgICAg
aWYgKGltcG9ydGVkTm9kZS0+aXNTaGFkb3dSb290KCkpIHsKKyAgICAgICAgICAgIC8vIFNoYWRv
d1Jvb3Qgbm9kZXMgc2hvdWxkIG5vdCBiZSBleHBsaWNpdGx5IGltcG9ydGFibGUuCisgICAgICAg
ICAgICAvLyBFaXRoZXIgdGhleSBhcmUgaW1wb3J0ZWQgYWxvbmcgd2l0aCB0aGVpciBob3N0IG5v
ZGUsIG9yIGNyZWF0ZWQgaW1wbGljaXRseS4KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9
CisgICAgICAgIERvY3VtZW50RnJhZ21lbnQqIG9sZEZyYWdtZW50ID0gc3RhdGljX2Nhc3Q8RG9j
dW1lbnRGcmFnbWVudCo+KGltcG9ydGVkTm9kZSk7CisgICAgICAgIFJlZlB0cjxEb2N1bWVudEZy
YWdtZW50PiBuZXdGcmFnbWVudCA9IGNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKKyAgICAgICAg
aWYgKGRlZXApIHsKKyAgICAgICAgICAgIGZvciAoTm9kZSogb2xkQ2hpbGQgPSBvbGRGcmFnbWVu
dC0+Zmlyc3RDaGlsZCgpOyBvbGRDaGlsZDsgb2xkQ2hpbGQgPSBvbGRDaGlsZC0+bmV4dFNpYmxp
bmcoKSkgeworICAgICAgICAgICAgICAgIFJlZlB0cjxOb2RlPiBuZXdDaGlsZCA9IGltcG9ydE5v
ZGUob2xkQ2hpbGQsIHRydWUsIGVjKTsKKyAgICAgICAgICAgICAgICBpZiAoZWMpCisgICAgICAg
ICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIG5ld0ZyYWdtZW50LT5hcHBl
bmRDaGlsZChuZXdDaGlsZC5yZWxlYXNlKCksIGVjKTsKKyAgICAgICAgICAgICAgICBpZiAoZWMp
CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9
CisgICAgICAgIAorICAgICAgICByZXR1cm4gbmV3RnJhZ21lbnQucmVsZWFzZSgpOworICAgIH0K
KyAgICBjYXNlIEVOVElUWV9OT0RFOgorICAgIGNhc2UgTk9UQVRJT05fTk9ERToKKyAgICAgICAg
Ly8gRklYTUU6IEl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBpbXBvcnQgdGhlc2Ugbm9kZSB0eXBl
cywgaG93ZXZlciBpbiBET00zIHRoZSBEb2N1bWVudFR5cGUgaXMgcmVhZG9ubHksIHNvIHRoZXJl
IGlzbid0IG11Y2ggc2Vuc2UgaW4gZG9pbmcgdGhhdC4KKyAgICAgICAgLy8gQWJpbGl0eSB0byBh
ZGQgdGhlc2UgaW1wb3J0ZWQgbm9kZXMgdG8gYSBEb2N1bWVudFR5cGUgd2lsbCBiZSBjb25zaWRl
cmVkIGZvciBhZGRpdGlvbiB0byBhIGZ1dHVyZSByZWxlYXNlIG9mIHRoZSBET00uCisgICAgY2Fz
ZSBET0NVTUVOVF9OT0RFOgorICAgIGNhc2UgRE9DVU1FTlRfVFlQRV9OT0RFOgorICAgIGNhc2Ug
WFBBVEhfTkFNRVNQQUNFX05PREU6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBlYyA9IE5P
VF9TVVBQT1JURURfRVJSOworICAgIHJldHVybiAwOworfQorCisKK1Bhc3NSZWZQdHI8Tm9kZT4g
RG9jdW1lbnQ6OmFkb3B0Tm9kZShQYXNzUmVmUHRyPE5vZGU+IHNvdXJjZSwgRXhjZXB0aW9uQ29k
ZSYgZWMpCit7CisgICAgaWYgKCFzb3VyY2UpIHsKKyAgICAgICAgZWMgPSBOT1RfU1VQUE9SVEVE
X0VSUjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKHNvdXJjZS0+aXNSZWFk
T25seU5vZGUoKSkgeworICAgICAgICBlYyA9IE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjsK
KyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgRXZlbnRRdWV1ZVNjb3BlIHNjb3BlOwor
CisgICAgc3dpdGNoIChzb3VyY2UtPm5vZGVUeXBlKCkpIHsKKyAgICBjYXNlIEVOVElUWV9OT0RF
OgorICAgIGNhc2UgTk9UQVRJT05fTk9ERToKKyAgICBjYXNlIERPQ1VNRU5UX05PREU6CisgICAg
Y2FzZSBET0NVTUVOVF9UWVBFX05PREU6CisgICAgY2FzZSBYUEFUSF9OQU1FU1BBQ0VfTk9ERToK
KyAgICAgICAgZWMgPSBOT1RfU1VQUE9SVEVEX0VSUjsKKyAgICAgICAgcmV0dXJuIDA7ICAgICAg
ICAgICAgCisgICAgY2FzZSBBVFRSSUJVVEVfTk9ERTogeyAgICAgICAgICAgICAgICAgICAKKyAg
ICAgICAgQXR0ciogYXR0ciA9IHN0YXRpY19jYXN0PEF0dHIqPihzb3VyY2UuZ2V0KCkpOworICAg
ICAgICBpZiAoYXR0ci0+b3duZXJFbGVtZW50KCkpCisgICAgICAgICAgICBhdHRyLT5vd25lckVs
ZW1lbnQoKS0+cmVtb3ZlQXR0cmlidXRlTm9kZShhdHRyLCBlYyk7CisgICAgICAgIGF0dHItPnNl
dFNwZWNpZmllZCh0cnVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfSAgICAgICAKKyAgICBkZWZh
dWx0OgorICAgICAgICBpZiAoc291cmNlLT5pc1NoYWRvd1Jvb3QoKSkgeworICAgICAgICAgICAg
Ly8gU2hhZG93Um9vdCBjYW5ub3QgZGlzY29ubmVjdCBpdHNlbGYgZnJvbSB0aGUgaG9zdCBub2Rl
LgorICAgICAgICAgICAgZWMgPSBISUVSQVJDSFlfUkVRVUVTVF9FUlI7CisgICAgICAgICAgICBy
ZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZJWE1FOiBXaGF0IGFib3V0IDxmcmFt
ZT4gYW5kIDxvYmplY3Q+PworICAgICAgICBpZiAoc291cmNlLT5oYXNUYWdOYW1lKGlmcmFtZVRh
ZykpIHsKKyAgICAgICAgICAgIEhUTUxJRnJhbWVFbGVtZW50KiBpZnJhbWUgPSBzdGF0aWNfY2Fz
dDxIVE1MSUZyYW1lRWxlbWVudCo+KHNvdXJjZS5nZXQoKSk7CisgICAgICAgICAgICBpZiAoZnJh
bWUoKSAmJiBmcmFtZSgpLT50cmVlKCktPmlzRGVzY2VuZGFudE9mKGlmcmFtZS0+Y29udGVudEZy
YW1lKCkpKSB7CisgICAgICAgICAgICAgICAgZWMgPSBISUVSQVJDSFlfUkVRVUVTVF9FUlI7Cisg
ICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAg
ICAgaWYgKHNvdXJjZS0+cGFyZW50Tm9kZSgpKQorICAgICAgICAgICAgc291cmNlLT5wYXJlbnRO
b2RlKCktPnJlbW92ZUNoaWxkKHNvdXJjZS5nZXQoKSwgZWMpOworICAgIH0KKworICAgIHRoaXMt
PmFkb3B0SWZOZWVkZWQoc291cmNlLmdldCgpKTsKKworICAgIHJldHVybiBzb3VyY2U7Cit9CisK
K2Jvb2wgRG9jdW1lbnQ6Omhhc1ZhbGlkTmFtZXNwYWNlRm9yRWxlbWVudHMoY29uc3QgUXVhbGlm
aWVkTmFtZSYgcU5hbWUpCit7CisgICAgLy8gVGhlc2UgY2hlY2tzIGFyZSBmcm9tIERPTSBDb3Jl
IExldmVsIDIsIGNyZWF0ZUVsZW1lbnROUworICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0RP
TS1MZXZlbC0yLUNvcmUvY29yZS5odG1sI0lELURvY0NyRWxOUworICAgIGlmICghcU5hbWUucHJl
Zml4KCkuaXNFbXB0eSgpICYmIHFOYW1lLm5hbWVzcGFjZVVSSSgpLmlzTnVsbCgpKSAvLyBjcmVh
dGVFbGVtZW50TlMobnVsbCwgImh0bWw6ZGl2IikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
IGlmIChxTmFtZS5wcmVmaXgoKSA9PSB4bWxBdG9tICYmIHFOYW1lLm5hbWVzcGFjZVVSSSgpICE9
IFhNTE5hbWVzOjp4bWxOYW1lc3BhY2VVUkkpIC8vIGNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3
dy5leGFtcGxlLmNvbSIsICJ4bWw6bGFuZyIpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
IC8vIFJlcXVpcmVkIGJ5IERPTSBMZXZlbCAzIENvcmUgYW5kIHVuc3BlY2lmaWVkIGJ5IERPTSBM
ZXZlbCAyIENvcmU6CisgICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAwNC9SRUMtRE9NLUxl
dmVsLTMtQ29yZS0yMDA0MDQwNy9jb3JlLmh0bWwjSUQtRG9jQ3JFbE5TCisgICAgLy8gY3JlYXRl
RWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyIsICJmb286YmFyIiksIGNy
ZWF0ZUVsZW1lbnROUyhudWxsLCAieG1sbnM6YmFyIikKKyAgICBpZiAoKHFOYW1lLnByZWZpeCgp
ID09IHhtbG5zQXRvbSAmJiBxTmFtZS5uYW1lc3BhY2VVUkkoKSAhPSBYTUxOU05hbWVzOjp4bWxu
c05hbWVzcGFjZVVSSSkgfHwgKHFOYW1lLnByZWZpeCgpICE9IHhtbG5zQXRvbSAmJiBxTmFtZS5u
YW1lc3BhY2VVUkkoKSA9PSBYTUxOU05hbWVzOjp4bWxuc05hbWVzcGFjZVVSSSkpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIERvY3VtZW50Ojpo
YXNWYWxpZE5hbWVzcGFjZUZvckF0dHJpYnV0ZXMoY29uc3QgUXVhbGlmaWVkTmFtZSYgcU5hbWUp
Cit7CisgICAgLy8gU3BlYzogRE9NIExldmVsIDIgQ29yZTogaHR0cDovL3d3dy53My5vcmcvVFIv
RE9NLUxldmVsLTItQ29yZS9jb3JlLmh0bWwjSUQtRWxTZXRBdHRyTlMKKyAgICBpZiAocU5hbWUu
cHJlZml4KCkuaXNFbXB0eSgpICYmIHFOYW1lLmxvY2FsTmFtZSgpID09IHhtbG5zQXRvbSkgewor
ICAgICAgICAvLyBOb3RlOiBUaGUgY2FzZSBvZiBhbiAieG1sbnMiIHF1YWxpZmllZCBuYW1lIHdp
dGggYSBuYW1lc3BhY2Ugb2YKKyAgICAgICAgLy8geG1sbnNOYW1lc3BhY2VVUkkgaXMgc3BlY2lm
aWNhbGx5IGFsbG93ZWQgKFNlZSA8aHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8+KS4KKyAg
ICAgICAgcmV0dXJuIHFOYW1lLm5hbWVzcGFjZVVSSSgpID09IFhNTE5TTmFtZXM6OnhtbG5zTmFt
ZXNwYWNlVVJJOworICAgIH0KKyAgICByZXR1cm4gaGFzVmFsaWROYW1lc3BhY2VGb3JFbGVtZW50
cyhxTmFtZSk7Cit9CisKKy8vIEZJWE1FOiBUaGlzIHNob3VsZCByZWFsbHkgYmUgaW4gYSBwb3Nz
aWJsZSBFbGVtZW50RmFjdG9yeSBjbGFzcworUGFzc1JlZlB0cjxFbGVtZW50PiBEb2N1bWVudDo6
Y3JlYXRlRWxlbWVudChjb25zdCBRdWFsaWZpZWROYW1lJiBxTmFtZSwgYm9vbCBjcmVhdGVkQnlQ
YXJzZXIpCit7CisgICAgUmVmUHRyPEVsZW1lbnQ+IGU7CisKKyAgICAvLyBGSVhNRTogVXNlIHJl
Z2lzdGVyZWQgbmFtZXNwYWNlcyBhbmQgbG9vayB1cCBpbiBhIGhhc2ggdG8gZmluZCB0aGUgcmln
aHQgZmFjdG9yeS4KKyAgICBpZiAocU5hbWUubmFtZXNwYWNlVVJJKCkgPT0geGh0bWxOYW1lc3Bh
Y2VVUkkpCisgICAgICAgIGUgPSBIVE1MRWxlbWVudEZhY3Rvcnk6OmNyZWF0ZUhUTUxFbGVtZW50
KHFOYW1lLCB0aGlzLCAwLCBjcmVhdGVkQnlQYXJzZXIpOworI2lmIEVOQUJMRShTVkcpCisgICAg
ZWxzZSBpZiAocU5hbWUubmFtZXNwYWNlVVJJKCkgPT0gU1ZHTmFtZXM6OnN2Z05hbWVzcGFjZVVS
SSkKKyAgICAgICAgZSA9IFNWR0VsZW1lbnRGYWN0b3J5OjpjcmVhdGVTVkdFbGVtZW50KHFOYW1l
LCB0aGlzLCBjcmVhdGVkQnlQYXJzZXIpOworI2VuZGlmCisjaWYgRU5BQkxFKE1BVEhNTCkKKyAg
ICBlbHNlIGlmIChxTmFtZS5uYW1lc3BhY2VVUkkoKSA9PSBNYXRoTUxOYW1lczo6bWF0aG1sTmFt
ZXNwYWNlVVJJKQorICAgICAgICBlID0gTWF0aE1MRWxlbWVudEZhY3Rvcnk6OmNyZWF0ZU1hdGhN
TEVsZW1lbnQocU5hbWUsIHRoaXMsIGNyZWF0ZWRCeVBhcnNlcik7CisjZW5kaWYKKworICAgIGlm
IChlKQorICAgICAgICBtX3Nhd0VsZW1lbnRzSW5Lbm93bk5hbWVzcGFjZXMgPSB0cnVlOworICAg
IGVsc2UKKyAgICAgICAgZSA9IEVsZW1lbnQ6OmNyZWF0ZShxTmFtZSwgZG9jdW1lbnQoKSk7CisK
KyAgICAvLyA8aW1hZ2U+IHVzZXMgaW1nVGFnIHNvIHdlIG5lZWQgYSBzcGVjaWFsIHJ1bGUuCisg
ICAgQVNTRVJUKChxTmFtZS5tYXRjaGVzKGltYWdlVGFnKSAmJiBlLT50YWdRTmFtZSgpLm1hdGNo
ZXMoaW1nVGFnKSAmJiBlLT50YWdRTmFtZSgpLnByZWZpeCgpID09IHFOYW1lLnByZWZpeCgpKSB8
fCBxTmFtZSA9PSBlLT50YWdRTmFtZSgpKTsKKworICAgIHJldHVybiBlLnJlbGVhc2UoKTsKK30K
KworYm9vbCBEb2N1bWVudDo6cmVnaW9uQmFzZWRDb2x1bW5zRW5hYmxlZCgpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIHNldHRpbmdzKCkgJiYgc2V0dGluZ3MoKS0+cmVnaW9uQmFzZWRDb2x1bW5zRW5h
YmxlZCgpOyAKK30KKworYm9vbCBEb2N1bWVudDo6Y3NzU3RpY2t5UG9zaXRpb25FbmFibGVkKCkg
Y29uc3QKK3sKKyAgICByZXR1cm4gc2V0dGluZ3MoKSAmJiBzZXR0aW5ncygpLT5jc3NTdGlja3lQ
b3NpdGlvbkVuYWJsZWQoKTsgCit9CisKK2Jvb2wgRG9jdW1lbnQ6OmNzc1JlZ2lvbnNFbmFibGVk
KCkgY29uc3QKK3sKKyAgICByZXR1cm4gc2V0dGluZ3MoKSAmJiBzZXR0aW5ncygpLT5jc3NSZWdp
b25zRW5hYmxlZCgpOyAKK30KKworYm9vbCBEb2N1bWVudDo6Y3NzR3JpZExheW91dEVuYWJsZWQo
KSBjb25zdAoreworICAgIHJldHVybiBzZXR0aW5ncygpICYmIHNldHRpbmdzKCktPmNzc0dyaWRM
YXlvdXRFbmFibGVkKCk7Cit9CisKKyNpZiBFTkFCTEUoQ1NTX1JFR0lPTlMpCisKK1Bhc3NSZWZQ
dHI8V2ViS2l0TmFtZWRGbG93PiBEb2N1bWVudDo6d2Via2l0R2V0Rmxvd0J5TmFtZShjb25zdCBT
dHJpbmcmIGZsb3dOYW1lKQoreworICAgIGlmICghY3NzUmVnaW9uc0VuYWJsZWQoKSB8fCAhcmVu
ZGVyZXIoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvLyBJdCdzIHBvc3NpYmxlIHRvIGhh
dmUgcGVuZGluZyBzdHlsZXMgbm90IGFwcGxpZWQgdGhhdCBhZmZlY3QgdGhlIGV4aXN0aW5nIGZs
b3dzLgorICAgIHVwZGF0ZVN0eWxlSWZOZWVkZWQoKTsKKworICAgIHJldHVybiBuYW1lZEZsb3dz
KCktPmZsb3dCeU5hbWUoZmxvd05hbWUpOworfQorCitQYXNzUmVmUHRyPERPTU5hbWVkRmxvd0Nv
bGxlY3Rpb24+IERvY3VtZW50Ojp3ZWJraXRHZXROYW1lZEZsb3dzKCkKK3sKKyAgICBpZiAoIWNz
c1JlZ2lvbnNFbmFibGVkKCkgfHwgIXJlbmRlcmVyKCkpCisgICAgICAgIHJldHVybiAwOworCisg
ICAgdXBkYXRlU3R5bGVJZk5lZWRlZCgpOworCisgICAgcmV0dXJuIG5hbWVkRmxvd3MoKS0+Y3Jl
YXRlQ1NTT01TbmFwc2hvdCgpOworfQorCisjZW5kaWYKKworTmFtZWRGbG93Q29sbGVjdGlvbiog
RG9jdW1lbnQ6Om5hbWVkRmxvd3MoKQoreworICAgIGlmICghbV9uYW1lZEZsb3dzKQorICAgICAg
ICBtX25hbWVkRmxvd3MgPSBOYW1lZEZsb3dDb2xsZWN0aW9uOjpjcmVhdGUodGhpcyk7CisKKyAg
ICByZXR1cm4gbV9uYW1lZEZsb3dzLmdldCgpOworfQorCitQYXNzUmVmUHRyPEVsZW1lbnQ+IERv
Y3VtZW50OjpjcmVhdGVFbGVtZW50TlMoY29uc3QgU3RyaW5nJiBuYW1lc3BhY2VVUkksIGNvbnN0
IFN0cmluZyYgcXVhbGlmaWVkTmFtZSwgRXhjZXB0aW9uQ29kZSYgZWMpCit7CisgICAgU3RyaW5n
IHByZWZpeCwgbG9jYWxOYW1lOworICAgIGlmICghcGFyc2VRdWFsaWZpZWROYW1lKHF1YWxpZmll
ZE5hbWUsIHByZWZpeCwgbG9jYWxOYW1lLCBlYykpCisgICAgICAgIHJldHVybiAwOworCisgICAg
UXVhbGlmaWVkTmFtZSBxTmFtZShwcmVmaXgsIGxvY2FsTmFtZSwgbmFtZXNwYWNlVVJJKTsKKyAg
ICBpZiAoIWhhc1ZhbGlkTmFtZXNwYWNlRm9yRWxlbWVudHMocU5hbWUpKSB7CisgICAgICAgIGVj
ID0gTkFNRVNQQUNFX0VSUjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJu
IGNyZWF0ZUVsZW1lbnQocU5hbWUsIGZhbHNlKTsKK30KKworU3RyaW5nIERvY3VtZW50OjpyZWFk
eVN0YXRlKCkgY29uc3QKK3sKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKGNvbnN0IFN0cmluZywg
bG9hZGluZywgKEFTQ0lJTGl0ZXJhbCgibG9hZGluZyIpKSk7CisgICAgREVGSU5FX1NUQVRJQ19M
T0NBTChjb25zdCBTdHJpbmcsIGludGVyYWN0aXZlLCAoQVNDSUlMaXRlcmFsKCJpbnRlcmFjdGl2
ZSIpKSk7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChjb25zdCBTdHJpbmcsIGNvbXBsZXRlLCAo
QVNDSUlMaXRlcmFsKCJjb21wbGV0ZSIpKSk7CisKKyAgICBzd2l0Y2ggKG1fcmVhZHlTdGF0ZSkg
eworICAgIGNhc2UgTG9hZGluZzoKKyAgICAgICAgcmV0dXJuIGxvYWRpbmc7CisgICAgY2FzZSBJ
bnRlcmFjdGl2ZToKKyAgICAgICAgcmV0dXJuIGludGVyYWN0aXZlOworICAgIGNhc2UgQ29tcGxl
dGU6CisgICAgICAgIHJldHVybiBjb21wbGV0ZTsKKyAgICB9CisKKyAgICBBU1NFUlRfTk9UX1JF
QUNIRUQoKTsKKyAgICByZXR1cm4gU3RyaW5nKCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnNldFJl
YWR5U3RhdGUoUmVhZHlTdGF0ZSByZWFkeVN0YXRlKQoreworICAgIGlmIChyZWFkeVN0YXRlID09
IG1fcmVhZHlTdGF0ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgc3dpdGNoIChyZWFkeVN0YXRl
KSB7CisgICAgY2FzZSBMb2FkaW5nOgorICAgICAgICBpZiAoIW1fZG9jdW1lbnRUaW1pbmcuZG9t
TG9hZGluZykKKyAgICAgICAgICAgIG1fZG9jdW1lbnRUaW1pbmcuZG9tTG9hZGluZyA9IG1vbm90
b25pY2FsbHlJbmNyZWFzaW5nVGltZSgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEludGVy
YWN0aXZlOgorICAgICAgICBpZiAoIW1fZG9jdW1lbnRUaW1pbmcuZG9tSW50ZXJhY3RpdmUpCisg
ICAgICAgICAgICBtX2RvY3VtZW50VGltaW5nLmRvbUludGVyYWN0aXZlID0gbW9ub3RvbmljYWxs
eUluY3JlYXNpbmdUaW1lKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ29tcGxldGU6Cisg
ICAgICAgIGlmICghbV9kb2N1bWVudFRpbWluZy5kb21Db21wbGV0ZSkKKyAgICAgICAgICAgIG1f
ZG9jdW1lbnRUaW1pbmcuZG9tQ29tcGxldGUgPSBtb25vdG9uaWNhbGx5SW5jcmVhc2luZ1RpbWUo
KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgbV9yZWFkeVN0YXRlID0gcmVhZHlTdGF0
ZTsKKyAgICBkaXNwYXRjaEV2ZW50KEV2ZW50OjpjcmVhdGUoZXZlbnROYW1lcygpLnJlYWR5c3Rh
dGVjaGFuZ2VFdmVudCwgZmFsc2UsIGZhbHNlKSk7CisgICAgCisgICAgaWYgKHNldHRpbmdzKCkg
JiYgc2V0dGluZ3MoKS0+c3VwcHJlc3Nlc0luY3JlbWVudGFsUmVuZGVyaW5nKCkpCisgICAgICAg
IHNldFZpc3VhbFVwZGF0ZXNBbGxvd2VkKHJlYWR5U3RhdGUpOworfQorCit2b2lkIERvY3VtZW50
OjpzZXRWaXN1YWxVcGRhdGVzQWxsb3dlZChSZWFkeVN0YXRlIHJlYWR5U3RhdGUpCit7CisgICAg
QVNTRVJUKHNldHRpbmdzKCkgJiYgc2V0dGluZ3MoKS0+c3VwcHJlc3Nlc0luY3JlbWVudGFsUmVu
ZGVyaW5nKCkpOworICAgIHN3aXRjaCAocmVhZHlTdGF0ZSkgeworICAgIGNhc2UgTG9hZGluZzoK
KyAgICAgICAgQVNTRVJUKCFtX3Zpc3VhbFVwZGF0ZXNTdXBwcmVzc2lvblRpbWVyLmlzQWN0aXZl
KCkpOworICAgICAgICBBU1NFUlQobV92aXN1YWxVcGRhdGVzQWxsb3dlZCk7CisgICAgICAgIG1f
dmlzdWFsVXBkYXRlc1N1cHByZXNzaW9uVGltZXIuc3RhcnRPbmVTaG90KHNldHRpbmdzKCktPmlu
Y3JlbWVudGFsUmVuZGVyaW5nU3VwcHJlc3Npb25UaW1lb3V0SW5TZWNvbmRzKCkpOworICAgICAg
ICBzZXRWaXN1YWxVcGRhdGVzQWxsb3dlZChmYWxzZSk7CisgICAgICAgIGJyZWFrOworICAgIGNh
c2UgSW50ZXJhY3RpdmU6CisgICAgICAgIEFTU0VSVChtX3Zpc3VhbFVwZGF0ZXNTdXBwcmVzc2lv
blRpbWVyLmlzQWN0aXZlKCkgfHwgbV92aXN1YWxVcGRhdGVzQWxsb3dlZCk7CisgICAgICAgIGJy
ZWFrOworICAgIGNhc2UgQ29tcGxldGU6CisgICAgICAgIGlmIChtX3Zpc3VhbFVwZGF0ZXNTdXBw
cmVzc2lvblRpbWVyLmlzQWN0aXZlKCkpIHsKKyAgICAgICAgICAgIEFTU0VSVCghbV92aXN1YWxV
cGRhdGVzQWxsb3dlZCk7CisgICAgICAgICAgICBtX3Zpc3VhbFVwZGF0ZXNTdXBwcmVzc2lvblRp
bWVyLnN0b3AoKTsKKyAgICAgICAgICAgIHNldFZpc3VhbFVwZGF0ZXNBbGxvd2VkKHRydWUpOwor
ICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIEFTU0VSVChtX3Zpc3VhbFVwZGF0ZXNBbGxvd2Vk
KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorICAgIAordm9pZCBEb2N1bWVudDo6c2V0Vmlz
dWFsVXBkYXRlc0FsbG93ZWQoYm9vbCB2aXN1YWxVcGRhdGVzQWxsb3dlZCkKK3sKKyAgICBpZiAo
bV92aXN1YWxVcGRhdGVzQWxsb3dlZCA9PSB2aXN1YWxVcGRhdGVzQWxsb3dlZCkKKyAgICAgICAg
cmV0dXJuOworCisgICAgbV92aXN1YWxVcGRhdGVzQWxsb3dlZCA9IHZpc3VhbFVwZGF0ZXNBbGxv
d2VkOworCisgICAgaWYgKCF2aXN1YWxVcGRhdGVzQWxsb3dlZCkKKyAgICAgICAgcmV0dXJuOwor
CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgIGlmICh2aWV3KCkpCisgICAg
ICAgIHZpZXcoKS0+dXBkYXRlQ29tcG9zaXRpbmdMYXllcnNBZnRlckxheW91dCgpOworI2VuZGlm
CisKKyAgICBpZiAocmVuZGVyZXIoKSkKKyAgICAgICAgcmVuZGVyZXIoKS0+cmVwYWludCgpOwor
fQorCit2b2lkIERvY3VtZW50Ojp2aXN1YWxVcGRhdGVzU3VwcHJlc3Npb25UaW1lckZpcmVkKFRp
bWVyPERvY3VtZW50PiopCit7CisgICAgQVNTRVJUKCFtX3Zpc3VhbFVwZGF0ZXNBbGxvd2VkKTsK
KyAgICBzZXRWaXN1YWxVcGRhdGVzQWxsb3dlZCh0cnVlKTsKK30KKworU3RyaW5nIERvY3VtZW50
OjplbmNvZGluZygpIGNvbnN0Cit7CisgICAgaWYgKFRleHRSZXNvdXJjZURlY29kZXIqIGQgPSBk
ZWNvZGVyKCkpCisgICAgICAgIHJldHVybiBkLT5lbmNvZGluZygpLmRvbU5hbWUoKTsKKyAgICBy
ZXR1cm4gU3RyaW5nKCk7Cit9CisKK1N0cmluZyBEb2N1bWVudDo6ZGVmYXVsdENoYXJzZXQoKSBj
b25zdAoreworICAgIGlmIChTZXR0aW5ncyogc2V0dGluZ3MgPSB0aGlzLT5zZXR0aW5ncygpKQor
ICAgICAgICByZXR1cm4gc2V0dGluZ3MtPmRlZmF1bHRUZXh0RW5jb2RpbmdOYW1lKCk7CisgICAg
cmV0dXJuIFN0cmluZygpOworfQorCit2b2lkIERvY3VtZW50OjpzZXRDaGFyc2V0KGNvbnN0IFN0
cmluZyYgY2hhcnNldCkKK3sKKyAgICBpZiAoIWRlY29kZXIoKSkKKyAgICAgICAgcmV0dXJuOwor
ICAgIGRlY29kZXIoKS0+c2V0RW5jb2RpbmcoY2hhcnNldCwgVGV4dFJlc291cmNlRGVjb2Rlcjo6
VXNlckNob3NlbkVuY29kaW5nKTsKK30KKwordm9pZCBEb2N1bWVudDo6c2V0Q29udGVudExhbmd1
YWdlKGNvbnN0IFN0cmluZyYgbGFuZ3VhZ2UpCit7CisgICAgaWYgKG1fY29udGVudExhbmd1YWdl
ID09IGxhbmd1YWdlKQorICAgICAgICByZXR1cm47CisgICAgbV9jb250ZW50TGFuZ3VhZ2UgPSBs
YW5ndWFnZTsKKworICAgIC8vIFJlY2FsY3VsYXRlIHN0eWxlIHNvIGxhbmd1YWdlIGlzIHVzZWQg
d2hlbiBzZWxlY3RpbmcgdGhlIGluaXRpYWwgZm9udC4KKyAgICBzdHlsZVJlc29sdmVyQ2hhbmdl
ZChEZWZlclJlY2FsY1N0eWxlKTsKK30KKwordm9pZCBEb2N1bWVudDo6c2V0WE1MVmVyc2lvbihj
b25zdCBTdHJpbmcmIHZlcnNpb24sIEV4Y2VwdGlvbkNvZGUmIGVjKQoreworICAgIGlmICghaW1w
bGVtZW50YXRpb24oKS0+aGFzRmVhdHVyZSgiWE1MIiwgU3RyaW5nKCkpKSB7CisgICAgICAgIGVj
ID0gTk9UX1NVUFBPUlRFRF9FUlI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAo
IVhNTERvY3VtZW50UGFyc2VyOjpzdXBwb3J0c1hNTFZlcnNpb24odmVyc2lvbikpIHsKKyAgICAg
ICAgZWMgPSBOT1RfU1VQUE9SVEVEX0VSUjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAg
IG1feG1sVmVyc2lvbiA9IHZlcnNpb247Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnNldFhNTFN0YW5k
YWxvbmUoYm9vbCBzdGFuZGFsb25lLCBFeGNlcHRpb25Db2RlJiBlYykKK3sKKyAgICBpZiAoIWlt
cGxlbWVudGF0aW9uKCktPmhhc0ZlYXR1cmUoIlhNTCIsIFN0cmluZygpKSkgeworICAgICAgICBl
YyA9IE5PVF9TVVBQT1JURURfRVJSOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbV94
bWxTdGFuZGFsb25lID0gc3RhbmRhbG9uZSA/IFN0YW5kYWxvbmUgOiBOb3RTdGFuZGFsb25lOwor
fQorCit2b2lkIERvY3VtZW50OjpzZXREb2N1bWVudFVSSShjb25zdCBTdHJpbmcmIHVyaSkKK3sK
KyAgICAvLyBUaGlzIHByb3BlcnR5IGlzIHJlYWQtb25seSBmcm9tIEphdmFTY3JpcHQsIGJ1dCB3
cml0YWJsZSBmcm9tIE9iamVjdGl2ZS1DLgorICAgIG1fZG9jdW1lbnRVUkkgPSB1cmk7CisgICAg
dXBkYXRlQmFzZVVSTCgpOworfQorCitLVVJMIERvY3VtZW50OjpiYXNlVVJJKCkgY29uc3QKK3sK
KyAgICByZXR1cm4gbV9iYXNlVVJMOworfQorCit2b2lkIERvY3VtZW50OjpzZXRDb250ZW50KGNv
bnN0IFN0cmluZyYgY29udGVudCkKK3sKKyAgICBvcGVuKCk7CisgICAgbV9wYXJzZXItPmFwcGVu
ZChjb250ZW50KTsKKyAgICBjbG9zZSgpOworfQorCitTdHJpbmcgRG9jdW1lbnQ6OnN1Z2dlc3Rl
ZE1JTUVUeXBlKCkgY29uc3QKK3sKKyAgICBpZiAobV9kb2N1bWVudC0+aXNYSFRNTERvY3VtZW50
KCkpCisgICAgICAgIHJldHVybiAiYXBwbGljYXRpb24veGh0bWwreG1sIjsKKyAgICBpZiAobV9k
b2N1bWVudC0+aXNTVkdEb2N1bWVudCgpKQorICAgICAgICByZXR1cm4gImltYWdlL3N2Zyt4bWwi
OworICAgIGlmIChtX2RvY3VtZW50LT54bWxTdGFuZGFsb25lKCkpCisgICAgICAgIHJldHVybiAi
dGV4dC94bWwiOworICAgIGlmIChtX2RvY3VtZW50LT5pc0hUTUxEb2N1bWVudCgpKQorICAgICAg
ICByZXR1cm4gInRleHQvaHRtbCI7CisKKyAgICBpZiAoRG9jdW1lbnRMb2FkZXIqIGRvY3VtZW50
TG9hZGVyID0gbG9hZGVyKCkpCisgICAgICAgIHJldHVybiBkb2N1bWVudExvYWRlci0+cmVzcG9u
c2VNSU1FVHlwZSgpOworICAgIHJldHVybiBTdHJpbmcoKTsKK30KKworLy8gRklYTUU6IFdlIG5l
ZWQgdG8gZGlzY3VzcyB0aGUgRE9NIEFQSSBoZXJlIGF0IHNvbWUgcG9pbnQuIElkZWFzOgorLy8g
KiBtYWtpbmcgaXQgcmVjZWl2ZSBhIHJlY3QgYXMgcGFyYW1ldGVyLCBpLmUuIG5vZGVzRnJvbVJl
Y3QoeCwgeSwgdywgaCk7CisvLyAqIG1ha2luZyBpdCByZWNlaXZlIHRoZSBleHBhZGluZyBzaXpl
IG9mIGVhY2ggZGlyZWN0aW9uIHNlcGFyYXRlbHksCisvLyAgIGkuZS4gbm9kZXNGcm9tUmVjdCh4
LCB5LCB0b3BTaXplLCByaWdodFNpemUsIGJvdHRvbVNpemUsIGxlZnRTaXplKTsKK1Bhc3NSZWZQ
dHI8Tm9kZUxpc3Q+IERvY3VtZW50Ojpub2Rlc0Zyb21SZWN0KGludCBjZW50ZXJYLCBpbnQgY2Vu
dGVyWSwgdW5zaWduZWQgdG9wUGFkZGluZywgdW5zaWduZWQgcmlnaHRQYWRkaW5nLCB1bnNpZ25l
ZCBib3R0b21QYWRkaW5nLCB1bnNpZ25lZCBsZWZ0UGFkZGluZywgYm9vbCBpZ25vcmVDbGlwcGlu
ZywgYm9vbCBhbGxvd1NoYWRvd0NvbnRlbnQpIGNvbnN0Cit7CisgICAgLy8gRklYTUU6IFNoYXJl
IGNvZGUgYmV0d2VlbiB0aGlzLCBlbGVtZW50RnJvbVBvaW50IGFuZCBjYXJldFJhbmdlRnJvbVBv
aW50LgorICAgIGlmICghcmVuZGVyZXIoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgRnJhbWUq
IGZyYW1lID0gdGhpcy0+ZnJhbWUoKTsKKyAgICBpZiAoIWZyYW1lKQorICAgICAgICByZXR1cm4g
MDsKKyAgICBGcmFtZVZpZXcqIGZyYW1lVmlldyA9IGZyYW1lLT52aWV3KCk7CisgICAgaWYgKCFm
cmFtZVZpZXcpCisgICAgICAgIHJldHVybiAwOworCisgICAgZmxvYXQgem9vbUZhY3RvciA9IGZy
YW1lLT5wYWdlWm9vbUZhY3RvcigpOworICAgIExheW91dFBvaW50IHBvaW50ID0gcm91bmRlZExh
eW91dFBvaW50KEZsb2F0UG9pbnQoY2VudGVyWCAqIHpvb21GYWN0b3IgKyB2aWV3KCktPnNjcm9s
bFgoKSwgY2VudGVyWSAqIHpvb21GYWN0b3IgKyB2aWV3KCktPnNjcm9sbFkoKSkpOworCisgICAg
aW50IHR5cGUgPSBIaXRUZXN0UmVxdWVzdDo6UmVhZE9ubHkgfCBIaXRUZXN0UmVxdWVzdDo6QWN0
aXZlOworCisgICAgLy8gV2hlbiBpZ25vcmVDbGlwcGluZyBpcyBmYWxzZSwgdGhpcyBtZXRob2Qg
cmV0dXJucyBudWxsIGZvciBjb29yZGluYXRlcyBvdXRzaWRlIG9mIHRoZSB2aWV3cG9ydC4KKyAg
ICBpZiAoaWdub3JlQ2xpcHBpbmcpCisgICAgICAgIHR5cGUgfD0gSGl0VGVzdFJlcXVlc3Q6Okln
bm9yZUNsaXBwaW5nOworICAgIGVsc2UgaWYgKCFmcmFtZVZpZXctPnZpc2libGVDb250ZW50UmVj
dCgpLmludGVyc2VjdHMoSGl0VGVzdFJlc3VsdDo6cmVjdEZvclBvaW50KHBvaW50LCB0b3BQYWRk
aW5nLCByaWdodFBhZGRpbmcsIGJvdHRvbVBhZGRpbmcsIGxlZnRQYWRkaW5nKSkpCisgICAgICAg
IHJldHVybiAwOworICAgIGlmIChhbGxvd1NoYWRvd0NvbnRlbnQpCisgICAgICAgIHR5cGUgfD0g
SGl0VGVzdFJlcXVlc3Q6OkFsbG93U2hhZG93Q29udGVudDsKKworICAgIEhpdFRlc3RSZXF1ZXN0
IHJlcXVlc3QodHlwZSk7CisKKyAgICAvLyBQYXNzaW5nIGEgemVybyBwYWRkaW5nIHdpbGwgdHJp
Z2dlciBhIHJlY3QgaGl0IHRlc3QsIGhvd2V2ZXIgZm9yIHRoZSBwdXJwb3NlcyBvZiBub2Rlc0Zy
b21SZWN0LAorICAgIC8vIHdlIHNwZWNpYWwgaGFuZGxlIHRoaXMgY2FzZSBpbiBvcmRlciB0byBy
ZXR1cm4gYSB2YWxpZCBOb2RlTGlzdC4KKyAgICBpZiAoIXRvcFBhZGRpbmcgJiYgIXJpZ2h0UGFk
ZGluZyAmJiAhYm90dG9tUGFkZGluZyAmJiAhbGVmdFBhZGRpbmcpIHsKKyAgICAgICAgSGl0VGVz
dFJlc3VsdCByZXN1bHQocG9pbnQpOworICAgICAgICByZXR1cm4gaGFuZGxlWmVyb1BhZGRpbmco
cmVxdWVzdCwgcmVzdWx0KTsKKyAgICB9CisKKyAgICBIaXRUZXN0UmVzdWx0IHJlc3VsdChwb2lu
dCwgdG9wUGFkZGluZywgcmlnaHRQYWRkaW5nLCBib3R0b21QYWRkaW5nLCBsZWZ0UGFkZGluZyk7
CisgICAgcmVuZGVyVmlldygpLT5oaXRUZXN0KHJlcXVlc3QsIHJlc3VsdCk7CisKKyAgICByZXR1
cm4gU3RhdGljSGFzaFNldE5vZGVMaXN0OjphZG9wdChyZXN1bHQucmVjdEJhc2VkVGVzdFJlc3Vs
dCgpKTsKK30KKworUGFzc1JlZlB0cjxOb2RlTGlzdD4gRG9jdW1lbnQ6OmhhbmRsZVplcm9QYWRk
aW5nKGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiByZXF1ZXN0LCBIaXRUZXN0UmVzdWx0JiByZXN1bHQp
IGNvbnN0Cit7CisgICAgcmVuZGVyVmlldygpLT5oaXRUZXN0KHJlcXVlc3QsIHJlc3VsdCk7CisK
KyAgICBOb2RlKiBub2RlID0gcmVzdWx0LmlubmVyTm9kZSgpOworICAgIGlmICghbm9kZSkKKyAg
ICAgICAgcmV0dXJuIDA7CisKKyAgICBub2RlID0gbm9kZS0+c2hhZG93QW5jZXN0b3JOb2RlKCk7
CisgICAgTGlzdEhhc2hTZXQ8UmVmUHRyPE5vZGU+ID4gbGlzdDsKKyAgICBsaXN0LmFkZChub2Rl
KTsKKyAgICByZXR1cm4gU3RhdGljSGFzaFNldE5vZGVMaXN0OjphZG9wdChsaXN0KTsKK30KKwor
c3RhdGljIE5vZGUqIG5vZGVGcm9tUG9pbnQoRnJhbWUqIGZyYW1lLCBSZW5kZXJWaWV3KiByZW5k
ZXJWaWV3LCBpbnQgeCwgaW50IHksIExheW91dFBvaW50KiBsb2NhbFBvaW50ID0gMCkKK3sKKyAg
ICBpZiAoIWZyYW1lKQorICAgICAgICByZXR1cm4gMDsKKyAgICBGcmFtZVZpZXcqIGZyYW1lVmll
dyA9IGZyYW1lLT52aWV3KCk7CisgICAgaWYgKCFmcmFtZVZpZXcpCisgICAgICAgIHJldHVybiAw
OworCisgICAgZmxvYXQgem9vbUZhY3RvciA9IGZyYW1lLT5wYWdlWm9vbUZhY3RvcigpOworICAg
IEludFBvaW50IHBvaW50ID0gcm91bmRlZEludFBvaW50KEZsb2F0UG9pbnQoeCAqIHpvb21GYWN0
b3IgICsgZnJhbWVWaWV3LT5zY3JvbGxYKCksIHkgKiB6b29tRmFjdG9yICsgZnJhbWVWaWV3LT5z
Y3JvbGxZKCkpKTsKKworICAgIGlmICghZnJhbWVWaWV3LT52aXNpYmxlQ29udGVudFJlY3QoKS5j
b250YWlucyhwb2ludCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgSGl0VGVzdFJlcXVlc3Qg
cmVxdWVzdChIaXRUZXN0UmVxdWVzdDo6UmVhZE9ubHkgfCBIaXRUZXN0UmVxdWVzdDo6QWN0aXZl
KTsKKyAgICBIaXRUZXN0UmVzdWx0IHJlc3VsdChwb2ludCk7CisgICAgcmVuZGVyVmlldy0+aGl0
VGVzdChyZXF1ZXN0LCByZXN1bHQpOworCisgICAgaWYgKGxvY2FsUG9pbnQpCisgICAgICAgICps
b2NhbFBvaW50ID0gcmVzdWx0LmxvY2FsUG9pbnQoKTsKKworICAgIHJldHVybiByZXN1bHQuaW5u
ZXJOb2RlKCk7Cit9CisKK0VsZW1lbnQqIERvY3VtZW50OjplbGVtZW50RnJvbVBvaW50KGludCB4
LCBpbnQgeSkgY29uc3QKK3sKKyAgICBpZiAoIXJlbmRlcmVyKCkpCisgICAgICAgIHJldHVybiAw
OworICAgIE5vZGUqIG5vZGUgPSBub2RlRnJvbVBvaW50KGZyYW1lKCksIHJlbmRlclZpZXcoKSwg
eCwgeSk7CisgICAgd2hpbGUgKG5vZGUgJiYgIW5vZGUtPmlzRWxlbWVudE5vZGUoKSkKKyAgICAg
ICAgbm9kZSA9IG5vZGUtPnBhcmVudE5vZGUoKTsKKyAgICBpZiAobm9kZSkKKyAgICAgICAgbm9k
ZSA9IGFuY2VzdG9ySW5UaGlzU2NvcGUobm9kZSk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEVs
ZW1lbnQqPihub2RlKTsKK30KKworUGFzc1JlZlB0cjxSYW5nZT4gRG9jdW1lbnQ6OmNhcmV0UmFu
Z2VGcm9tUG9pbnQoaW50IHgsIGludCB5KQoreworICAgIGlmICghcmVuZGVyZXIoKSkKKyAgICAg
ICAgcmV0dXJuIDA7CisgICAgTGF5b3V0UG9pbnQgbG9jYWxQb2ludDsKKyAgICBOb2RlKiBub2Rl
ID0gbm9kZUZyb21Qb2ludChmcmFtZSgpLCByZW5kZXJWaWV3KCksIHgsIHksICZsb2NhbFBvaW50
KTsKKyAgICBpZiAoIW5vZGUpCisgICAgICAgIHJldHVybiAwOworCisgICAgTm9kZSogc2hhZG93
QW5jZXN0b3JOb2RlID0gYW5jZXN0b3JJblRoaXNTY29wZShub2RlKTsKKyAgICBpZiAoc2hhZG93
QW5jZXN0b3JOb2RlICE9IG5vZGUpIHsKKyAgICAgICAgdW5zaWduZWQgb2Zmc2V0ID0gc2hhZG93
QW5jZXN0b3JOb2RlLT5ub2RlSW5kZXgoKTsKKyAgICAgICAgQ29udGFpbmVyTm9kZSogY29udGFp
bmVyID0gc2hhZG93QW5jZXN0b3JOb2RlLT5wYXJlbnROb2RlKCk7CisgICAgICAgIHJldHVybiBS
YW5nZTo6Y3JlYXRlKHRoaXMsIGNvbnRhaW5lciwgb2Zmc2V0LCBjb250YWluZXIsIG9mZnNldCk7
CisgICAgfQorCisgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IG5vZGUtPnJlbmRlcmVyKCk7
CisgICAgaWYgKCFyZW5kZXJlcikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgVmlzaWJsZVBvc2l0
aW9uIHZpc2libGVQb3NpdGlvbiA9IHJlbmRlcmVyLT5wb3NpdGlvbkZvclBvaW50KGxvY2FsUG9p
bnQpOworICAgIGlmICh2aXNpYmxlUG9zaXRpb24uaXNOdWxsKCkpCisgICAgICAgIHJldHVybiAw
OworCisgICAgUG9zaXRpb24gcmFuZ2VDb21wbGlhbnRQb3NpdGlvbiA9IHZpc2libGVQb3NpdGlv
bi5kZWVwRXF1aXZhbGVudCgpLnBhcmVudEFuY2hvcmVkRXF1aXZhbGVudCgpOworICAgIHJldHVy
biBSYW5nZTo6Y3JlYXRlKHRoaXMsIHJhbmdlQ29tcGxpYW50UG9zaXRpb24sIHJhbmdlQ29tcGxp
YW50UG9zaXRpb24pOworfQorCisvKgorICogUGVyZm9ybXMgdGhyZWUgb3BlcmF0aW9uczoKKyAq
ICAxLiBDb252ZXJ0IGNvbnRyb2wgY2hhcmFjdGVycyB0byBzcGFjZXMKKyAqICAyLiBUcmltIGxl
YWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlcworICogIDMuIENvbGxhcHNlIGludGVybmFsIHdoaXRl
c3BhY2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgU3RyaW5nV2l0aERpcmVjdGlvbiBjYW5vbmljYWxp
emVkVGl0bGUoRG9jdW1lbnQqIGRvY3VtZW50LCBjb25zdCBTdHJpbmdXaXRoRGlyZWN0aW9uJiB0
aXRsZVdpdGhEaXJlY3Rpb24pCit7CisgICAgY29uc3QgU3RyaW5nJiB0aXRsZSA9IHRpdGxlV2l0
aERpcmVjdGlvbi5zdHJpbmcoKTsKKyAgICBjb25zdCBVQ2hhciogY2hhcmFjdGVycyA9IHRpdGxl
LmNoYXJhY3RlcnMoKTsKKyAgICB1bnNpZ25lZCBsZW5ndGggPSB0aXRsZS5sZW5ndGgoKTsKKyAg
ICB1bnNpZ25lZCBpOworCisgICAgU3RyaW5nQnVmZmVyPFVDaGFyPiBidWZmZXIobGVuZ3RoKTsK
KyAgICB1bnNpZ25lZCBidWlsZGVySW5kZXggPSAwOworCisgICAgLy8gU2tpcCBsZWFkaW5nIHNw
YWNlcyBhbmQgbGVhZGluZyBjaGFyYWN0ZXJzIHRoYXQgd291bGQgY29udmVydCB0byBzcGFjZXMK
KyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgVUNoYXIgYyA9IGNo
YXJhY3RlcnNbaV07CisgICAgICAgIGlmICghKGMgPD0gMHgyMCB8fCBjID09IDB4N0YpKQorICAg
ICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGkgPT0gbGVuZ3RoKQorICAgICAgICBy
ZXR1cm4gU3RyaW5nV2l0aERpcmVjdGlvbigpOworCisgICAgLy8gUmVwbGFjZSBjb250cm9sIGNo
YXJhY3RlcnMgd2l0aCBzcGFjZXMsIGFuZCBiYWNrc2xhc2hlcyB3aXRoIGN1cnJlbmN5IHN5bWJv
bHMsIGFuZCBjb2xsYXBzZSB3aGl0ZXNwYWNlLgorICAgIGJvb2wgcHJldmlvdXNDaGFyV2FzV1Mg
PSBmYWxzZTsKKyAgICBmb3IgKDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgICAgIFVDaGFyIGMg
PSBjaGFyYWN0ZXJzW2ldOworICAgICAgICBpZiAoYyA8PSAweDIwIHx8IGMgPT0gMHg3RiB8fCAo
V1RGOjpVbmljb2RlOjpjYXRlZ29yeShjKSAmIChXVEY6OlVuaWNvZGU6OlNlcGFyYXRvcl9MaW5l
IHwgV1RGOjpVbmljb2RlOjpTZXBhcmF0b3JfUGFyYWdyYXBoKSkpIHsKKyAgICAgICAgICAgIGlm
IChwcmV2aW91c0NoYXJXYXNXUykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
ICAgIGJ1ZmZlcltidWlsZGVySW5kZXgrK10gPSAnICc7CisgICAgICAgICAgICBwcmV2aW91c0No
YXJXYXNXUyA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidWZmZXJbYnVp
bGRlckluZGV4KytdID0gYzsKKyAgICAgICAgICAgIHByZXZpb3VzQ2hhcldhc1dTID0gZmFsc2U7
CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTdHJpcCB0cmFpbGluZyBzcGFjZXMKKyAgICB3
aGlsZSAoYnVpbGRlckluZGV4ID4gMCkgeworICAgICAgICAtLWJ1aWxkZXJJbmRleDsKKyAgICAg
ICAgaWYgKGJ1ZmZlcltidWlsZGVySW5kZXhdICE9ICcgJykKKyAgICAgICAgICAgIGJyZWFrOwor
ICAgIH0KKworICAgIGlmICghYnVpbGRlckluZGV4ICYmIGJ1ZmZlcltidWlsZGVySW5kZXhdID09
ICcgJykKKyAgICAgICAgcmV0dXJuIFN0cmluZ1dpdGhEaXJlY3Rpb24oKTsKKworICAgIGJ1ZmZl
ci5zaHJpbmsoYnVpbGRlckluZGV4ICsgMSk7CisKKyAgICAvLyBSZXBsYWNlIHRoZSBiYWNrc2xh
c2hlcyB3aXRoIGN1cnJlbmN5IHN5bWJvbHMgaWYgdGhlIGVuY29kaW5nIHJlcXVpcmVzIGl0Lgor
ICAgIGRvY3VtZW50LT5kaXNwbGF5QnVmZmVyTW9kaWZpZWRCeUVuY29kaW5nKGJ1ZmZlci5jaGFy
YWN0ZXJzKCksIGJ1ZmZlci5sZW5ndGgoKSk7CisgICAgCisgICAgcmV0dXJuIFN0cmluZ1dpdGhE
aXJlY3Rpb24oU3RyaW5nOjphZG9wdChidWZmZXIpLCB0aXRsZVdpdGhEaXJlY3Rpb24uZGlyZWN0
aW9uKCkpOworfQorCit2b2lkIERvY3VtZW50Ojp1cGRhdGVUaXRsZShjb25zdCBTdHJpbmdXaXRo
RGlyZWN0aW9uJiB0aXRsZSkKK3sKKyAgICBpZiAobV9yYXdUaXRsZSA9PSB0aXRsZSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgbV9yYXdUaXRsZSA9IHRpdGxlOworICAgIG1fdGl0bGUgPSBjYW5v
bmljYWxpemVkVGl0bGUodGhpcywgbV9yYXdUaXRsZSk7CisgICAgaWYgKEZyYW1lKiBmID0gZnJh
bWUoKSkKKyAgICAgICAgZi0+bG9hZGVyKCktPnNldFRpdGxlKG1fdGl0bGUpOworfQorCit2b2lk
IERvY3VtZW50OjpzZXRUaXRsZShjb25zdCBTdHJpbmcmIHRpdGxlKQoreworICAgIC8vIFRpdGxl
IHNldCBieSBKYXZhU2NyaXB0IC0tIG92ZXJyaWRlcyBhbnkgdGl0bGUgZWxlbWVudHMuCisgICAg
bV90aXRsZVNldEV4cGxpY2l0bHkgPSB0cnVlOworICAgIGlmICghaXNIVE1MRG9jdW1lbnQoKSAm
JiAhaXNYSFRNTERvY3VtZW50KCkpCisgICAgICAgIG1fdGl0bGVFbGVtZW50ID0gMDsKKyAgICBl
bHNlIGlmICghbV90aXRsZUVsZW1lbnQpIHsKKyAgICAgICAgaWYgKEhUTUxFbGVtZW50KiBoZWFk
RWxlbWVudCA9IGhlYWQoKSkgeworICAgICAgICAgICAgbV90aXRsZUVsZW1lbnQgPSBjcmVhdGVF
bGVtZW50KHRpdGxlVGFnLCBmYWxzZSk7CisgICAgICAgICAgICBFeGNlcHRpb25Db2RlIGVjID0g
MDsKKyAgICAgICAgICAgIGhlYWRFbGVtZW50LT5hcHBlbmRDaGlsZChtX3RpdGxlRWxlbWVudCwg
ZWMpOworICAgICAgICAgICAgQVNTRVJUKCFlYyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAv
LyBUaGUgRE9NIEFQSSBoYXMgbm8gbWV0aG9kIG9mIHNwZWNpZnlpbmcgZGlyZWN0aW9uLCBzbyBh
c3N1bWUgTFRSLgorICAgIHVwZGF0ZVRpdGxlKFN0cmluZ1dpdGhEaXJlY3Rpb24odGl0bGUsIExU
UikpOworCisgICAgaWYgKG1fdGl0bGVFbGVtZW50KSB7CisgICAgICAgIEFTU0VSVChtX3RpdGxl
RWxlbWVudC0+aGFzVGFnTmFtZSh0aXRsZVRhZykpOworICAgICAgICBpZiAobV90aXRsZUVsZW1l
bnQtPmhhc1RhZ05hbWUodGl0bGVUYWcpKQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTFRp
dGxlRWxlbWVudCo+KG1fdGl0bGVFbGVtZW50LmdldCgpKS0+c2V0VGV4dCh0aXRsZSk7CisgICAg
fQorfQorCit2b2lkIERvY3VtZW50OjpzZXRUaXRsZUVsZW1lbnQoY29uc3QgU3RyaW5nV2l0aERp
cmVjdGlvbiYgdGl0bGUsIEVsZW1lbnQqIHRpdGxlRWxlbWVudCkKK3sKKyAgICBpZiAodGl0bGVF
bGVtZW50ICE9IG1fdGl0bGVFbGVtZW50KSB7CisgICAgICAgIGlmIChtX3RpdGxlRWxlbWVudCB8
fCBtX3RpdGxlU2V0RXhwbGljaXRseSkKKyAgICAgICAgICAgIC8vIE9ubHkgYWxsb3cgdGhlIGZp
cnN0IHRpdGxlIGVsZW1lbnQgdG8gY2hhbmdlIHRoZSB0aXRsZSAtLSBvdGhlcnMgaGF2ZSBubyBl
ZmZlY3QuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIG1fdGl0bGVFbGVtZW50ID0gdGl0
bGVFbGVtZW50OworICAgIH0KKworICAgIHVwZGF0ZVRpdGxlKHRpdGxlKTsKK30KKwordm9pZCBE
b2N1bWVudDo6cmVtb3ZlVGl0bGUoRWxlbWVudCogdGl0bGVFbGVtZW50KQoreworICAgIGlmICht
X3RpdGxlRWxlbWVudCAhPSB0aXRsZUVsZW1lbnQpCisgICAgICAgIHJldHVybjsKKworICAgIG1f
dGl0bGVFbGVtZW50ID0gMDsKKyAgICBtX3RpdGxlU2V0RXhwbGljaXRseSA9IGZhbHNlOworCisg
ICAgLy8gVXBkYXRlIHRpdGxlIGJhc2VkIG9uIGZpcnN0IHRpdGxlIGVsZW1lbnQgaW4gdGhlIGhl
YWQsIGlmIG9uZSBleGlzdHMuCisgICAgaWYgKEhUTUxFbGVtZW50KiBoZWFkRWxlbWVudCA9IGhl
YWQoKSkgeworICAgICAgICBmb3IgKE5vZGUqIGUgPSBoZWFkRWxlbWVudC0+Zmlyc3RDaGlsZCgp
OyBlOyBlID0gZS0+bmV4dFNpYmxpbmcoKSkKKyAgICAgICAgICAgIGlmIChlLT5oYXNUYWdOYW1l
KHRpdGxlVGFnKSkgeworICAgICAgICAgICAgICAgIEhUTUxUaXRsZUVsZW1lbnQqIHRpdGxlRWxl
bWVudCA9IHN0YXRpY19jYXN0PEhUTUxUaXRsZUVsZW1lbnQqPihlKTsKKyAgICAgICAgICAgICAg
ICBzZXRUaXRsZUVsZW1lbnQodGl0bGVFbGVtZW50LT50ZXh0V2l0aERpcmVjdGlvbigpLCB0aXRs
ZUVsZW1lbnQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgIH0K
KworICAgIGlmICghbV90aXRsZUVsZW1lbnQpCisgICAgICAgIHVwZGF0ZVRpdGxlKFN0cmluZ1dp
dGhEaXJlY3Rpb24oKSk7Cit9CisKKyNpZiBFTkFCTEUoUEFHRV9WSVNJQklMSVRZX0FQSSkKK1Bh
Z2VWaXNpYmlsaXR5U3RhdGUgRG9jdW1lbnQ6OnZpc2liaWxpdHlTdGF0ZSgpIGNvbnN0Cit7Cisg
ICAgLy8gVGhlIHZpc2liaWxpdHkgb2YgdGhlIGRvY3VtZW50IGlzIGluaGVyaXRlZCBmcm9tIHRo
ZSB2aXNpYmlsaXR5IG9mIHRoZQorICAgIC8vIHBhZ2UuIElmIHRoZXJlIGlzIG5vIHBhZ2UgYXNz
b2NpYXRlZCB3aXRoIHRoZSBkb2N1bWVudCwgd2Ugd2lsbCBhc3N1bWUKKyAgICAvLyB0aGF0IHRo
ZSBwYWdlIGlzIHZpc2libGUgaS5lLiBpbnZpc2liaWxpdHkgaGFzIHRvIGJlIGV4cGxpY2l0bHkK
KyAgICAvLyBzcGVjaWZpZWQgYnkgdGhlIGVtYmVkZGVyLgorICAgIGlmICghbV9mcmFtZSB8fCAh
bV9mcmFtZS0+cGFnZSgpKQorICAgICAgICByZXR1cm4gUGFnZVZpc2liaWxpdHlTdGF0ZVZpc2li
bGU7CisgICAgcmV0dXJuIG1fZnJhbWUtPnBhZ2UoKS0+dmlzaWJpbGl0eVN0YXRlKCk7Cit9CisK
K1N0cmluZyBEb2N1bWVudDo6d2Via2l0VmlzaWJpbGl0eVN0YXRlKCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gcGFnZVZpc2liaWxpdHlTdGF0ZVN0cmluZyh2aXNpYmlsaXR5U3RhdGUoKSk7Cit9CisK
K2Jvb2wgRG9jdW1lbnQ6OndlYmtpdEhpZGRlbigpIGNvbnN0Cit7CisgICAgcmV0dXJuIHZpc2li
aWxpdHlTdGF0ZSgpICE9IFBhZ2VWaXNpYmlsaXR5U3RhdGVWaXNpYmxlOworfQorCit2b2lkIERv
Y3VtZW50OjpkaXNwYXRjaFZpc2liaWxpdHlTdGF0ZUNoYW5nZUV2ZW50KCkKK3sKKyAgICBkaXNw
YXRjaEV2ZW50KEV2ZW50OjpjcmVhdGUoZXZlbnROYW1lcygpLndlYmtpdHZpc2liaWxpdHljaGFu
Z2VFdmVudCwgZmFsc2UsIGZhbHNlKSk7Cit9CisjZW5kaWYKKworI2lmIEVOQUJMRShDU1BfTkVY
VCkKK0RPTVNlY3VyaXR5UG9saWN5KiBEb2N1bWVudDo6c2VjdXJpdHlQb2xpY3koKQoreworICAg
IGlmICghbV9kb21TZWN1cml0eVBvbGljeSkKKyAgICAgICAgbV9kb21TZWN1cml0eVBvbGljeSA9
IERPTVNlY3VyaXR5UG9saWN5OjpjcmVhdGUodGhpcyk7CisgICAgcmV0dXJuIG1fZG9tU2VjdXJp
dHlQb2xpY3kuZ2V0KCk7Cit9CisjZW5kaWYKKworU3RyaW5nIERvY3VtZW50Ojpub2RlTmFtZSgp
IGNvbnN0Cit7CisgICAgcmV0dXJuICIjZG9jdW1lbnQiOworfQorCitOb2RlOjpOb2RlVHlwZSBE
b2N1bWVudDo6bm9kZVR5cGUoKSBjb25zdAoreworICAgIHJldHVybiBET0NVTUVOVF9OT0RFOwor
fQorCitGb3JtQ29udHJvbGxlciogRG9jdW1lbnQ6OmZvcm1Db250cm9sbGVyKCkKK3sKKyAgICBp
ZiAoIW1fZm9ybUNvbnRyb2xsZXIpCisgICAgICAgIG1fZm9ybUNvbnRyb2xsZXIgPSBGb3JtQ29u
dHJvbGxlcjo6Y3JlYXRlKCk7CisgICAgcmV0dXJuIG1fZm9ybUNvbnRyb2xsZXIuZ2V0KCk7Cit9
CisKK1ZlY3RvcjxTdHJpbmc+IERvY3VtZW50Ojpmb3JtRWxlbWVudHNTdGF0ZSgpIGNvbnN0Cit7
CisgICAgaWYgKCFtX2Zvcm1Db250cm9sbGVyKQorICAgICAgICByZXR1cm4gVmVjdG9yPFN0cmlu
Zz4oKTsKKyAgICByZXR1cm4gbV9mb3JtQ29udHJvbGxlci0+Zm9ybUVsZW1lbnRzU3RhdGUoKTsK
K30KKwordm9pZCBEb2N1bWVudDo6c2V0U3RhdGVGb3JOZXdGb3JtRWxlbWVudHMoY29uc3QgVmVj
dG9yPFN0cmluZz4mIHN0YXRlVmVjdG9yKQoreworICAgIGlmICghc3RhdGVWZWN0b3Iuc2l6ZSgp
ICYmICFtX2Zvcm1Db250cm9sbGVyKQorICAgICAgICByZXR1cm47CisgICAgZm9ybUNvbnRyb2xs
ZXIoKS0+c2V0U3RhdGVGb3JOZXdGb3JtRWxlbWVudHMoc3RhdGVWZWN0b3IpOworfQorCitGcmFt
ZVZpZXcqIERvY3VtZW50Ojp2aWV3KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9mcmFtZSA/IG1f
ZnJhbWUtPnZpZXcoKSA6IDA7Cit9CisKK1BhZ2UqIERvY3VtZW50OjpwYWdlKCkgY29uc3QKK3sK
KyAgICByZXR1cm4gbV9mcmFtZSA/IG1fZnJhbWUtPnBhZ2UoKSA6IDA7ICAgIAorfQorCitTZXR0
aW5ncyogRG9jdW1lbnQ6OnNldHRpbmdzKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9mcmFtZSA/
IG1fZnJhbWUtPnNldHRpbmdzKCkgOiAwOworfQorCitQYXNzUmVmUHRyPFJhbmdlPiBEb2N1bWVu
dDo6Y3JlYXRlUmFuZ2UoKQoreworICAgIHJldHVybiBSYW5nZTo6Y3JlYXRlKHRoaXMpOworfQor
CitQYXNzUmVmUHRyPE5vZGVJdGVyYXRvcj4gRG9jdW1lbnQ6OmNyZWF0ZU5vZGVJdGVyYXRvcihO
b2RlKiByb290LCB1bnNpZ25lZCB3aGF0VG9TaG93LCAKKyAgICBQYXNzUmVmUHRyPE5vZGVGaWx0
ZXI+IGZpbHRlciwgYm9vbCBleHBhbmRFbnRpdHlSZWZlcmVuY2VzLCBFeGNlcHRpb25Db2RlJiBl
YykKK3sKKyAgICBpZiAoIXJvb3QpIHsKKyAgICAgICAgZWMgPSBOT1RfU1VQUE9SVEVEX0VSUjsK
KyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBOb2RlSXRlcmF0b3I6OmNyZWF0
ZShyb290LCB3aGF0VG9TaG93LCBmaWx0ZXIsIGV4cGFuZEVudGl0eVJlZmVyZW5jZXMpOworfQor
CitQYXNzUmVmUHRyPFRyZWVXYWxrZXI+IERvY3VtZW50OjpjcmVhdGVUcmVlV2Fsa2VyKE5vZGUq
IHJvb3QsIHVuc2lnbmVkIHdoYXRUb1Nob3csIAorICAgIFBhc3NSZWZQdHI8Tm9kZUZpbHRlcj4g
ZmlsdGVyLCBib29sIGV4cGFuZEVudGl0eVJlZmVyZW5jZXMsIEV4Y2VwdGlvbkNvZGUmIGVjKQor
eworICAgIGlmICghcm9vdCkgeworICAgICAgICBlYyA9IE5PVF9TVVBQT1JURURfRVJSOworICAg
ICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIFRyZWVXYWxrZXI6OmNyZWF0ZShyb290
LCB3aGF0VG9TaG93LCBmaWx0ZXIsIGV4cGFuZEVudGl0eVJlZmVyZW5jZXMpOworfQorCit2b2lk
IERvY3VtZW50OjpzY2hlZHVsZUZvcmNlZFN0eWxlUmVjYWxjKCkKK3sKKyAgICBtX3BlbmRpbmdT
dHlsZVJlY2FsY1Nob3VsZEZvcmNlID0gdHJ1ZTsKKyAgICBzY2hlZHVsZVN0eWxlUmVjYWxjKCk7
Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnNjaGVkdWxlU3R5bGVSZWNhbGMoKQoreworICAgIGlmIChz
aG91bGREaXNwbGF5U2VhbWxlc3NseVdpdGhQYXJlbnQoKSkgeworICAgICAgICAvLyBXaGVuIHdl
J3JlIHNlYW1sZXNzLCBvdXIgcGFyZW50IGRvY3VtZW50IG1hbmFnZXMgb3VyIHN0eWxlIHJlY2Fs
Y3MuCisgICAgICAgIG93bmVyRWxlbWVudCgpLT5zZXROZWVkc1N0eWxlUmVjYWxjKCk7CisgICAg
ICAgIG93bmVyRWxlbWVudCgpLT5kb2N1bWVudCgpLT5zY2hlZHVsZVN0eWxlUmVjYWxjKCk7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobV9zdHlsZVJlY2FsY1RpbWVyLmlzQWN0
aXZlKCkgfHwgaW5QYWdlQ2FjaGUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgQVNTRVJUKGNo
aWxkTmVlZHNTdHlsZVJlY2FsYygpIHx8IG1fcGVuZGluZ1N0eWxlUmVjYWxjU2hvdWxkRm9yY2Up
OworCisgICAgaWYgKCFkb2N1bWVudHNUaGF0TmVlZFN0eWxlUmVjYWxjKQorICAgICAgICBkb2N1
bWVudHNUaGF0TmVlZFN0eWxlUmVjYWxjID0gbmV3IEhhc2hTZXQ8RG9jdW1lbnQqPjsKKyAgICBk
b2N1bWVudHNUaGF0TmVlZFN0eWxlUmVjYWxjLT5hZGQodGhpcyk7CisgICAgCisgICAgLy8gRklY
TUU6IFdoeSBvbiBlYXJ0aCBpcyB0aGlzIGhlcmU/IFRoaXMgaXMgY2xlYXJseSBtaXNwbGFjZWQu
CisgICAgaW52YWxpZGF0ZUFjY2Vzc0tleU1hcCgpOworICAgIAorICAgIG1fc3R5bGVSZWNhbGNU
aW1lci5zdGFydE9uZVNob3QoMCk7CisKKyAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRp
ZFNjaGVkdWxlU3R5bGVSZWNhbGN1bGF0aW9uKHRoaXMpOworfQorCit2b2lkIERvY3VtZW50Ojp1
bnNjaGVkdWxlU3R5bGVSZWNhbGMoKQoreworICAgIEFTU0VSVCghY2hpbGROZWVkc1N0eWxlUmVj
YWxjKCkpOworCisgICAgaWYgKGRvY3VtZW50c1RoYXROZWVkU3R5bGVSZWNhbGMpCisgICAgICAg
IGRvY3VtZW50c1RoYXROZWVkU3R5bGVSZWNhbGMtPnJlbW92ZSh0aGlzKTsKKworICAgIG1fc3R5
bGVSZWNhbGNUaW1lci5zdG9wKCk7CisgICAgbV9wZW5kaW5nU3R5bGVSZWNhbGNTaG91bGRGb3Jj
ZSA9IGZhbHNlOworfQorCitib29sIERvY3VtZW50Ojppc1BlbmRpbmdTdHlsZVJlY2FsYygpIGNv
bnN0Cit7CisgICAgcmV0dXJuIG1fc3R5bGVSZWNhbGNUaW1lci5pc0FjdGl2ZSgpICYmICFtX2lu
U3R5bGVSZWNhbGM7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnN0eWxlUmVjYWxjVGltZXJGaXJlZChU
aW1lcjxEb2N1bWVudD4qKQoreworICAgIHVwZGF0ZVN0eWxlSWZOZWVkZWQoKTsKK30KKworYm9v
bCBEb2N1bWVudDo6Y2hpbGROZWVkc0FuZE5vdEluU3R5bGVSZWNhbGMoKQoreworICAgIHJldHVy
biBjaGlsZE5lZWRzU3R5bGVSZWNhbGMoKSAmJiAhbV9pblN0eWxlUmVjYWxjOworfQorCit2b2lk
IERvY3VtZW50OjpyZWNhbGNTdHlsZShTdHlsZUNoYW5nZSBjaGFuZ2UpCit7CisgICAgLy8gd2Ug
c2hvdWxkIG5vdCBlbnRlciBzdHlsZSByZWNhbGMgd2hpbGUgcGFpbnRpbmcKKyAgICBBU1NFUlQo
IXZpZXcoKSB8fCAhdmlldygpLT5pc1BhaW50aW5nKCkpOworICAgIGlmICh2aWV3KCkgJiYgdmll
dygpLT5pc1BhaW50aW5nKCkpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICBpZiAobV9pblN0
eWxlUmVjYWxjKQorICAgICAgICByZXR1cm47IC8vIEd1YXJkIGFnYWluc3QgcmUtZW50cmFuY3ku
IC1kd2gKKworICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgdXBkYXRlIHN0eWxlIG9uIG91ciBhbmNl
c3RvciBjaGFpbiBiZWZvcmUgcHJvY2VlZGluZyAoZXNwZWNpYWxseSBmb3Igc2VhbWxlc3MpLAor
ICAgIC8vIGhvd2V2ZXIgZG9pbmcgc28gY3VycmVudGx5IGNhdXNlcyBzZXZlcmFsIHRlc3RzIHRv
IGNyYXNoLCBhcyBGcmFtZTo6c2V0RG9jdW1lbnQgY2FsbHMgRG9jdW1lbnQ6OmF0dGFjaAorICAg
IC8vIGJlZm9yZSBzZXR0aW5nIHRoZSBET01XaW5kb3cgb24gdGhlIEZyYW1lLCBvciB0aGUgU2Vj
dXJpdHlPcmlnaW4gb24gdGhlIGRvY3VtZW50LiBUaGUgYXR0YWNoLCBpbiB0dXJuCisgICAgLy8g
cmVzb2x2ZXMgc3R5bGUgKGhlcmUpIGFuZCB0aGVuIHdoZW4gd2UgcmVzb2x2ZSBzdHlsZSBvbiB0
aGUgcGFyZW50IGNoYWluLCB3ZSBtYXkgZW5kIHVwCisgICAgLy8gcmUtYXR0YWNoaW5nIG91ciBj
b250YWluaW5nIGlmcmFtZSwgd2hpY2ggd2hlbiBhc2tlZCBIVE1MRnJhbWVFbGVtZW50QmFzZTo6
aXNVUkxBbGxvd2VkCisgICAgLy8gaGl0cyBhIG51bGwtZGVyZWZlcmVuY2UgZHVlIHRvIHNlY3Vy
aXR5IGNvZGUgYWx3YXlzIGFzc3VtaW5nIHRoZSBkb2N1bWVudCBoYXMgYSBTZWN1cml0eU9yaWdp
bi4KKworICAgIGlmIChtX2hhc0RpcnR5U3R5bGVSZXNvbHZlcikKKyAgICAgICAgdXBkYXRlQWN0
aXZlU3R5bGVzaGVldHMoUmVjYWxjU3R5bGVJbW1lZGlhdGVseSk7CisKKyAgICBJbnNwZWN0b3JJ
bnN0cnVtZW50YXRpb25Db29raWUgY29va2llID0gSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjp3
aWxsUmVjYWxjdWxhdGVTdHlsZSh0aGlzKTsKKworICAgIGlmIChtX2VsZW1TaGVldCAmJiBtX2Vs
ZW1TaGVldC0+Y29udGVudHMoKS0+dXNlc1JlbVVuaXRzKCkpCisgICAgICAgIG1fdXNlc1JlbVVu
aXRzID0gdHJ1ZTsKKworICAgIG1faW5TdHlsZVJlY2FsYyA9IHRydWU7CisgICAgc3VzcGVuZFBv
c3RBdHRhY2hDYWxsYmFja3MoKTsKKyAgICBSZW5kZXJXaWRnZXQ6OnN1c3BlbmRXaWRnZXRIaWVy
YXJjaHlVcGRhdGVzKCk7CisgICAgCisgICAgUmVmUHRyPEZyYW1lVmlldz4gZnJhbWVWaWV3ID0g
dmlldygpOworICAgIGlmIChmcmFtZVZpZXcpIHsKKyAgICAgICAgZnJhbWVWaWV3LT5wYXVzZVNj
aGVkdWxlZEV2ZW50cygpOworICAgICAgICBmcmFtZVZpZXctPmJlZ2luRGVmZXJyZWRSZXBhaW50
cygpOworICAgIH0KKworICAgIEFTU0VSVCghcmVuZGVyZXIoKSB8fCByZW5kZXJBcmVuYSgpKTsK
KyAgICBpZiAoIXJlbmRlcmVyKCkgfHwgIXJlbmRlckFyZW5hKCkpCisgICAgICAgIGdvdG8gYmFp
bF9vdXQ7CisKKyAgICBpZiAobV9wZW5kaW5nU3R5bGVSZWNhbGNTaG91bGRGb3JjZSkKKyAgICAg
ICAgY2hhbmdlID0gRm9yY2U7CisKKyAgICAvLyBSZWNhbGN1bGF0aW5nIHRoZSByb290IHN0eWxl
IChvbiB0aGUgZG9jdW1lbnQpIGlzIG5vdCBuZWVkZWQgaW4gdGhlIGNvbW1vbiBjYXNlLgorICAg
IGlmICgoY2hhbmdlID09IEZvcmNlKSB8fCAoc2hvdWxkRGlzcGxheVNlYW1sZXNzbHlXaXRoUGFy
ZW50KCkgJiYgKGNoYW5nZSA+PSBJbmhlcml0KSkpIHsKKyAgICAgICAgLy8gc3R5bGUgc2VsZWN0
b3IgbWF5IHNldCB0aGlzIGFnYWluIGR1cmluZyByZWNhbGMKKyAgICAgICAgbV9oYXNOb2Rlc1dp
dGhQbGFjZWhvbGRlclN0eWxlID0gZmFsc2U7CisgICAgICAgIAorICAgICAgICBSZWZQdHI8UmVu
ZGVyU3R5bGU+IGRvY3VtZW50U3R5bGUgPSBTdHlsZVJlc29sdmVyOjpzdHlsZUZvckRvY3VtZW50
KHRoaXMsIG1fc3R5bGVSZXNvbHZlciA/IG1fc3R5bGVSZXNvbHZlci0+Zm9udFNlbGVjdG9yKCkg
OiAwKTsKKyAgICAgICAgU3R5bGVDaGFuZ2UgY2ggPSBOb2RlOjpkaWZmKGRvY3VtZW50U3R5bGUu
Z2V0KCksIHJlbmRlcmVyKCktPnN0eWxlKCksIHRoaXMpOworICAgICAgICBpZiAoY2ggIT0gTm9D
aGFuZ2UpCisgICAgICAgICAgICByZW5kZXJlcigpLT5zZXRTdHlsZShkb2N1bWVudFN0eWxlLnJl
bGVhc2UoKSk7CisgICAgfQorCisgICAgZm9yIChOb2RlKiBuID0gZmlyc3RDaGlsZCgpOyBuOyBu
ID0gbi0+bmV4dFNpYmxpbmcoKSkgeworICAgICAgICBpZiAoIW4tPmlzRWxlbWVudE5vZGUoKSkK
KyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBFbGVtZW50KiBlbGVtZW50ID0gc3RhdGlj
X2Nhc3Q8RWxlbWVudCo+KG4pOworICAgICAgICBpZiAoY2hhbmdlID49IEluaGVyaXQgfHwgZWxl
bWVudC0+Y2hpbGROZWVkc1N0eWxlUmVjYWxjKCkgfHwgZWxlbWVudC0+bmVlZHNTdHlsZVJlY2Fs
YygpKQorICAgICAgICAgICAgZWxlbWVudC0+cmVjYWxjU3R5bGUoY2hhbmdlKTsKKyAgICB9CisK
KyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgaWYgKHZpZXcoKSkgeworICAg
ICAgICBib29sIGxheW91dFBlbmRpbmcgPSB2aWV3KCktPmxheW91dFBlbmRpbmcoKSB8fCByZW5k
ZXJlcigpLT5uZWVkc0xheW91dCgpOworICAgICAgICAvLyBJZiB3ZSBkaWRuJ3QgdXBkYXRlIGNv
bXBvc2l0aW5nIGxheWVycyBiZWNhdXNlIG9mIGxheW91dCgpLCB3ZSBuZWVkIHRvIGRvIHNvIGhl
cmUuCisgICAgICAgIGlmICghbGF5b3V0UGVuZGluZykKKyAgICAgICAgICAgIHZpZXcoKS0+dXBk
YXRlQ29tcG9zaXRpbmdMYXllcnNBZnRlclN0eWxlQ2hhbmdlKCk7CisgICAgfQorI2VuZGlmCisK
K2JhaWxfb3V0OgorICAgIGNsZWFyTmVlZHNTdHlsZVJlY2FsYygpOworICAgIGNsZWFyQ2hpbGRO
ZWVkc1N0eWxlUmVjYWxjKCk7CisgICAgdW5zY2hlZHVsZVN0eWxlUmVjYWxjKCk7CisKKyAgICBt
X2luU3R5bGVSZWNhbGMgPSBmYWxzZTsKKyAgICAKKyAgICAvLyBQc2V1ZG8gZWxlbWVudCByZW1v
dmFsIGFuZCBzaW1pbGFyIG1heSBvbmx5IHdvcmsgd2l0aCB0aGVzZSBmbGFncyBzdGlsbCBzZXQu
IFJlc2V0IHRoZW0gYWZ0ZXIgdGhlIHN0eWxlIHJlY2FsYy4KKyAgICBpZiAobV9zdHlsZVJlc29s
dmVyKQorICAgICAgICByZXNldENTU0ZlYXR1cmVGbGFncygpOworCisgICAgaWYgKGZyYW1lVmll
dykgeworICAgICAgICBmcmFtZVZpZXctPnJlc3VtZVNjaGVkdWxlZEV2ZW50cygpOworICAgICAg
ICBmcmFtZVZpZXctPmVuZERlZmVycmVkUmVwYWludHMoKTsKKyAgICB9CisgICAgUmVuZGVyV2lk
Z2V0OjpyZXN1bWVXaWRnZXRIaWVyYXJjaHlVcGRhdGVzKCk7CisgICAgcmVzdW1lUG9zdEF0dGFj
aENhbGxiYWNrcygpOworCisgICAgLy8gSWYgd2Ugd2FudGVkIHRvIGNhbGwgaW1wbGljaXRDbG9z
ZSgpIGR1cmluZyByZWNhbGNTdHlsZSwgZG8gc28gbm93IHRoYXQgd2UncmUgZmluaXNoZWQuCisg
ICAgaWYgKG1fY2xvc2VBZnRlclN0eWxlUmVjYWxjKSB7CisgICAgICAgIG1fY2xvc2VBZnRlclN0
eWxlUmVjYWxjID0gZmFsc2U7CisgICAgICAgIGltcGxpY2l0Q2xvc2UoKTsKKyAgICB9CisKKyAg
ICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZFJlY2FsY3VsYXRlU3R5bGUoY29va2llKTsK
K30KKwordm9pZCBEb2N1bWVudDo6dXBkYXRlU3R5bGVJZk5lZWRlZCgpCit7CisgICAgQVNTRVJU
KGlzTWFpblRocmVhZCgpKTsKKyAgICBBU1NFUlQoIXZpZXcoKSB8fCAoIXZpZXcoKS0+aXNJbkxh
eW91dCgpICYmICF2aWV3KCktPmlzUGFpbnRpbmcoKSkpOworICAgIAorICAgIGlmICgoIW1fcGVu
ZGluZ1N0eWxlUmVjYWxjU2hvdWxkRm9yY2UgJiYgIWNoaWxkTmVlZHNTdHlsZVJlY2FsYygpKSB8
fCBpblBhZ2VDYWNoZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBBbmltYXRpb25VcGRhdGVC
bG9jayBhbmltYXRpb25VcGRhdGVCbG9jayhtX2ZyYW1lID8gbV9mcmFtZS0+YW5pbWF0aW9uKCkg
OiAwKTsKKyAgICByZWNhbGNTdHlsZShOb0NoYW5nZSk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnVw
ZGF0ZVN0eWxlRm9yQWxsRG9jdW1lbnRzKCkKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkp
OworICAgIGlmICghZG9jdW1lbnRzVGhhdE5lZWRTdHlsZVJlY2FsYykKKyAgICAgICAgcmV0dXJu
OworCisgICAgd2hpbGUgKGRvY3VtZW50c1RoYXROZWVkU3R5bGVSZWNhbGMtPnNpemUoKSkgewor
ICAgICAgICBIYXNoU2V0PERvY3VtZW50Kj46Oml0ZXJhdG9yIGl0ID0gZG9jdW1lbnRzVGhhdE5l
ZWRTdHlsZVJlY2FsYy0+YmVnaW4oKTsKKyAgICAgICAgRG9jdW1lbnQqIGRvYyA9ICppdDsKKyAg
ICAgICAgZG9jdW1lbnRzVGhhdE5lZWRTdHlsZVJlY2FsYy0+cmVtb3ZlKGRvYyk7CisgICAgICAg
IGRvYy0+dXBkYXRlU3R5bGVJZk5lZWRlZCgpOworICAgIH0KK30KKwordm9pZCBEb2N1bWVudDo6
dXBkYXRlTGF5b3V0KCkKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworICAgIGlmIChF
bGVtZW50KiBvZSA9IG93bmVyRWxlbWVudCgpKQorICAgICAgICBvZS0+ZG9jdW1lbnQoKS0+dXBk
YXRlTGF5b3V0KCk7CisKKyAgICB1cGRhdGVTdHlsZUlmTmVlZGVkKCk7CisKKyAgICAvLyBPbmx5
IGRvIGEgbGF5b3V0IGlmIGNoYW5nZXMgaGF2ZSBvY2N1cnJlZCB0aGF0IG1ha2UgaXQgbmVjZXNz
YXJ5LiAgICAgIAorICAgIEZyYW1lVmlldyogdiA9IHZpZXcoKTsKKyAgICBpZiAodiAmJiByZW5k
ZXJlcigpICYmICh2LT5sYXlvdXRQZW5kaW5nKCkgfHwgcmVuZGVyZXIoKS0+bmVlZHNMYXlvdXQo
KSkpCisgICAgICAgIHYtPmxheW91dCgpOworfQorCisvLyBGSVhNRTogVGhpcyBpcyBhIGJhZCBp
ZGVhIGFuZCBuZWVkcyB0byBiZSByZW1vdmVkIGV2ZW50dWFsbHkuCisvLyBPdGhlciBicm93c2Vy
cyBsb2FkIHN0eWxlc2hlZXRzIGJlZm9yZSB0aGV5IGNvbnRpbnVlIHBhcnNpbmcgdGhlIHdlYiBw
YWdlLgorLy8gU2luY2Ugd2UgZG9uJ3QsIHdlIGNhbiBydW4gSmF2YVNjcmlwdCBjb2RlIHRoYXQg
bmVlZHMgYW5zd2VycyBiZWZvcmUgdGhlCisvLyBzdHlsZXNoZWV0cyBhcmUgbG9hZGVkLiBEb2lu
ZyBhIGxheW91dCBpZ25vcmluZyB0aGUgcGVuZGluZyBzdHlsZXNoZWV0cworLy8gbGV0cyB1cyBn
ZXQgcmVhc29uYWJsZSBhbnN3ZXJzLiBUaGUgbG9uZyB0ZXJtIHNvbHV0aW9uIHRvIHRoaXMgcHJv
YmxlbSBpcworLy8gdG8gaW5zdGVhZCBzdXNwZW5kIEphdmFTY3JpcHQgZXhlY3V0aW9uLgordm9p
ZCBEb2N1bWVudDo6dXBkYXRlTGF5b3V0SWdub3JlUGVuZGluZ1N0eWxlc2hlZXRzKCkKK3sKKyAg
ICBib29sIG9sZElnbm9yZSA9IG1faWdub3JlUGVuZGluZ1N0eWxlc2hlZXRzOworICAgIAorICAg
IGlmICghaGF2ZVN0eWxlc2hlZXRzTG9hZGVkKCkpIHsKKyAgICAgICAgbV9pZ25vcmVQZW5kaW5n
U3R5bGVzaGVldHMgPSB0cnVlOworICAgICAgICAvLyBGSVhNRTogV2UgYXJlIHdpbGxpbmcgdG8g
YXR0ZW1wdCB0byBzdXBwcmVzcyBwYWludGluZyB3aXRoIG91dGRhdGVkIHN0eWxlIGluZm8gb25s
eSBvbmNlLiAgT3VyIGFzc3VtcHRpb24gaXMgdGhhdCBpdCB3b3VsZCBiZQorICAgICAgICAvLyBk
YW5nZXJvdXMgdG8gdHJ5IHRvIHN0b3AgaXQgYSBzZWNvbmQgdGltZSwgYWZ0ZXIgcGFnZSBjb250
ZW50IGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkIGFuZCBkaXNwbGF5ZWQKKyAgICAgICAgLy8gd2l0
aCBhY2N1cmF0ZSBzdHlsZSBpbmZvcm1hdGlvbi4gIChPdXIgc3VwcHJlc3Npb24gaW52b2x2ZXMg
YmxhbmtpbmcgdGhlIHdob2xlIHBhZ2UgYXQgdGhlCisgICAgICAgIC8vIG1vbWVudC4gIElmIGl0
IHdlcmUgbW9yZSByZWZpbmVkLCB3ZSBtaWdodCBiZSBhYmxlIHRvIGRvIHNvbWV0aGluZyBiZXR0
ZXIuKQorICAgICAgICAvLyBJdCdzIHdvcnRoIG5vdGluZyB0aG91Z2ggdGhhdCB0aGlzIGVudGly
ZSBtZXRob2QgaXMgYSBoYWNrLCBzaW5jZSB3aGF0IHdlIHJlYWxseSB3YW50IHRvIGRvIGlzCisg
ICAgICAgIC8vIHN1c3BlbmQgSlMgaW5zdGVhZCBvZiBkb2luZyBhIGxheW91dCB3aXRoIGluYWNj
dXJhdGUgaW5mb3JtYXRpb24uCisgICAgICAgIEhUTUxFbGVtZW50KiBib2R5RWxlbWVudCA9IGJv
ZHkoKTsKKyAgICAgICAgaWYgKGJvZHlFbGVtZW50ICYmICFib2R5RWxlbWVudC0+cmVuZGVyZXIo
KSAmJiBtX3BlbmRpbmdTaGVldExheW91dCA9PSBOb0xheW91dFdpdGhQZW5kaW5nU2hlZXRzKSB7
CisgICAgICAgICAgICBtX3BlbmRpbmdTaGVldExheW91dCA9IERpZExheW91dFdpdGhQZW5kaW5n
U2hlZXRzOworICAgICAgICAgICAgc3R5bGVSZXNvbHZlckNoYW5nZWQoUmVjYWxjU3R5bGVJbW1l
ZGlhdGVseSk7CisgICAgICAgIH0gZWxzZSBpZiAobV9oYXNOb2Rlc1dpdGhQbGFjZWhvbGRlclN0
eWxlKQorICAgICAgICAgICAgLy8gSWYgbmV3IG5vZGVzIGhhdmUgYmVlbiBhZGRlZCBvciBzdHls
ZSByZWNhbGMgaGFzIGJlZW4gZG9uZSB3aXRoIHN0eWxlIHNoZWV0cyBzdGlsbCBwZW5kaW5nLCBz
b21lIG5vZGVzIAorICAgICAgICAgICAgLy8gbWF5IG5vdCBoYXZlIGhhZCB0aGVpciByZWFsIHN0
eWxlIGNhbGN1bGF0ZWQgeWV0LiBOb3JtYWxseSB0aGlzIGdldHMgY2xlYW5lZCB3aGVuIHN0eWxl
IHNoZWV0cyBhcnJpdmUgCisgICAgICAgICAgICAvLyBidXQgaGVyZSB3ZSBuZWVkIHVwLXRvLWRh
dGUgc3R5bGUgaW1tZWRpYXRlbHkuCisgICAgICAgICAgICByZWNhbGNTdHlsZShGb3JjZSk7Cisg
ICAgfQorCisgICAgdXBkYXRlTGF5b3V0KCk7CisKKyAgICBtX2lnbm9yZVBlbmRpbmdTdHlsZXNo
ZWV0cyA9IG9sZElnbm9yZTsKK30KKworUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gRG9jdW1lbnQ6
OnN0eWxlRm9yRWxlbWVudElnbm9yaW5nUGVuZGluZ1N0eWxlc2hlZXRzKEVsZW1lbnQqIGVsZW1l
bnQpCit7CisgICAgQVNTRVJUX0FSRyhlbGVtZW50LCBlbGVtZW50LT5kb2N1bWVudCgpID09IHRo
aXMpOworCisgICAgYm9vbCBvbGRJZ25vcmUgPSBtX2lnbm9yZVBlbmRpbmdTdHlsZXNoZWV0czsK
KyAgICBtX2lnbm9yZVBlbmRpbmdTdHlsZXNoZWV0cyA9IHRydWU7CisgICAgUmVmUHRyPFJlbmRl
clN0eWxlPiBzdHlsZSA9IHN0eWxlUmVzb2x2ZXIoKS0+c3R5bGVGb3JFbGVtZW50KGVsZW1lbnQs
IGVsZW1lbnQtPnBhcmVudE5vZGUoKSA/IGVsZW1lbnQtPnBhcmVudE5vZGUoKS0+Y29tcHV0ZWRT
dHlsZSgpIDogMCk7CisgICAgbV9pZ25vcmVQZW5kaW5nU3R5bGVzaGVldHMgPSBvbGRJZ25vcmU7
CisgICAgcmV0dXJuIHN0eWxlLnJlbGVhc2UoKTsKK30KKworUGFzc1JlZlB0cjxSZW5kZXJTdHls
ZT4gRG9jdW1lbnQ6OnN0eWxlRm9yUGFnZShpbnQgcGFnZUluZGV4KQoreworICAgIFJlZlB0cjxS
ZW5kZXJTdHlsZT4gc3R5bGUgPSBzdHlsZVJlc29sdmVyKCktPnN0eWxlRm9yUGFnZShwYWdlSW5k
ZXgpOworICAgIHJldHVybiBzdHlsZS5yZWxlYXNlKCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnJl
Z2lzdGVyQ3VzdG9tRm9udChQYXNzT3duUHRyPEZvbnREYXRhPiBmb250RGF0YSkKK3sKKyAgICBt
X2N1c3RvbUZvbnRzLmFwcGVuZChmb250RGF0YSk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmRlbGV0
ZUN1c3RvbUZvbnRzKCkKK3sKKyAgICBzaXplX3Qgc2l6ZSA9IG1fY3VzdG9tRm9udHMuc2l6ZSgp
OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKQorICAgICAgICBHbHlwaFBh
Z2VUcmVlTm9kZTo6cHJ1bmVUcmVlQ3VzdG9tRm9udERhdGEobV9jdXN0b21Gb250c1tpXS5nZXQo
KSk7CisKKyAgICBtX2N1c3RvbUZvbnRzLmNsZWFyKCk7Cit9CisKK2Jvb2wgRG9jdW1lbnQ6Omlz
UGFnZUJveFZpc2libGUoaW50IHBhZ2VJbmRleCkKK3sKKyAgICBSZWZQdHI8UmVuZGVyU3R5bGU+
IHN0eWxlID0gc3R5bGVGb3JQYWdlKHBhZ2VJbmRleCk7CisgICAgcmV0dXJuIHN0eWxlLT52aXNp
YmlsaXR5KCkgIT0gSElEREVOOyAvLyBkaXNwbGF5IHByb3BlcnR5IGRvZXNuJ3QgYXBwbHkgdG8g
QHBhZ2UuCit9CisKK3ZvaWQgRG9jdW1lbnQ6OnBhZ2VTaXplQW5kTWFyZ2luc0luUGl4ZWxzKGlu
dCBwYWdlSW5kZXgsIEludFNpemUmIHBhZ2VTaXplLCBpbnQmIG1hcmdpblRvcCwgaW50JiBtYXJn
aW5SaWdodCwgaW50JiBtYXJnaW5Cb3R0b20sIGludCYgbWFyZ2luTGVmdCkKK3sKKyAgICBSZWZQ
dHI8UmVuZGVyU3R5bGU+IHN0eWxlID0gc3R5bGVGb3JQYWdlKHBhZ2VJbmRleCk7CisgICAgUmVu
ZGVyVmlldyogdmlldyA9IHJlbmRlclZpZXcoKTsKKworICAgIGludCB3aWR0aCA9IHBhZ2VTaXpl
LndpZHRoKCk7CisgICAgaW50IGhlaWdodCA9IHBhZ2VTaXplLmhlaWdodCgpOworICAgIHN3aXRj
aCAoc3R5bGUtPnBhZ2VTaXplVHlwZSgpKSB7CisgICAgY2FzZSBQQUdFX1NJWkVfQVVUTzoKKyAg
ICAgICAgYnJlYWs7CisgICAgY2FzZSBQQUdFX1NJWkVfQVVUT19MQU5EU0NBUEU6CisgICAgICAg
IGlmICh3aWR0aCA8IGhlaWdodCkKKyAgICAgICAgICAgIHN0ZDo6c3dhcCh3aWR0aCwgaGVpZ2h0
KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQQUdFX1NJWkVfQVVUT19QT1JUUkFJVDoKKyAg
ICAgICAgaWYgKHdpZHRoID4gaGVpZ2h0KQorICAgICAgICAgICAgc3RkOjpzd2FwKHdpZHRoLCBo
ZWlnaHQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBBR0VfU0laRV9SRVNPTFZFRDogewor
ICAgICAgICBMZW5ndGhTaXplIHNpemUgPSBzdHlsZS0+cGFnZVNpemUoKTsKKyAgICAgICAgQVNT
RVJUKHNpemUud2lkdGgoKS5pc0ZpeGVkKCkpOworICAgICAgICBBU1NFUlQoc2l6ZS5oZWlnaHQo
KS5pc0ZpeGVkKCkpOworICAgICAgICB3aWR0aCA9IHZhbHVlRm9yTGVuZ3RoKHNpemUud2lkdGgo
KSwgMCwgdmlldyk7CisgICAgICAgIGhlaWdodCA9IHZhbHVlRm9yTGVuZ3RoKHNpemUuaGVpZ2h0
KCksIDAsIHZpZXcpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAg
ICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgfQorICAgIHBhZ2VTaXplID0gSW50U2l6ZSh3
aWR0aCwgaGVpZ2h0KTsKKworICAgIC8vIFRoZSBwZXJjZW50YWdlIGlzIGNhbGN1bGF0ZWQgd2l0
aCByZXNwZWN0IHRvIHRoZSB3aWR0aCBldmVuIGZvciBtYXJnaW4gdG9wIGFuZCBib3R0b20uCisg
ICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvQ1NTMi9ib3guaHRtbCNtYXJnaW4tcHJvcGVydGll
cworICAgIG1hcmdpblRvcCA9IHN0eWxlLT5tYXJnaW5Ub3AoKS5pc0F1dG8oKSA/IG1hcmdpblRv
cCA6IGludFZhbHVlRm9yTGVuZ3RoKHN0eWxlLT5tYXJnaW5Ub3AoKSwgd2lkdGgsIHZpZXcpOwor
ICAgIG1hcmdpblJpZ2h0ID0gc3R5bGUtPm1hcmdpblJpZ2h0KCkuaXNBdXRvKCkgPyBtYXJnaW5S
aWdodCA6IGludFZhbHVlRm9yTGVuZ3RoKHN0eWxlLT5tYXJnaW5SaWdodCgpLCB3aWR0aCwgdmll
dyk7CisgICAgbWFyZ2luQm90dG9tID0gc3R5bGUtPm1hcmdpbkJvdHRvbSgpLmlzQXV0bygpID8g
bWFyZ2luQm90dG9tIDogaW50VmFsdWVGb3JMZW5ndGgoc3R5bGUtPm1hcmdpbkJvdHRvbSgpLCB3
aWR0aCwgdmlldyk7CisgICAgbWFyZ2luTGVmdCA9IHN0eWxlLT5tYXJnaW5MZWZ0KCkuaXNBdXRv
KCkgPyBtYXJnaW5MZWZ0IDogaW50VmFsdWVGb3JMZW5ndGgoc3R5bGUtPm1hcmdpbkxlZnQoKSwg
d2lkdGgsIHZpZXcpOworfQorCit2b2lkIERvY3VtZW50OjpzZXREb2N1bWVudFJhcmVEYXRhKE5v
ZGVSYXJlRGF0YSogcmFyZURhdGEpCit7CisgICAgbV9kb2N1bWVudFJhcmVEYXRhID0gcmFyZURh
dGE7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnNldElzVmlld1NvdXJjZShib29sIGlzVmlld1NvdXJj
ZSkKK3sKKyAgICBtX2lzVmlld1NvdXJjZSA9IGlzVmlld1NvdXJjZTsKKyAgICBpZiAoIW1faXNW
aWV3U291cmNlKQorICAgICAgICByZXR1cm47CisKKyAgICBzZXRTZWN1cml0eU9yaWdpbihTZWN1
cml0eU9yaWdpbjo6Y3JlYXRlVW5pcXVlKCkpOworICAgIGRpZFVwZGF0ZVNlY3VyaXR5T3JpZ2lu
KCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmNvbWJpbmVDU1NGZWF0dXJlRmxhZ3MoKQoreworICAg
IC8vIERlbGF5IHJlc2V0dGluZyB0aGUgZmxhZ3MgdW50aWwgYWZ0ZXIgbmV4dCBzdHlsZSByZWNh
bGMgc2luY2UgdW5hcHBseWluZyB0aGUgc3R5bGUgbWF5IG5vdCB3b3JrIHdpdGhvdXQgdGhlc2Ug
c2V0ICh0aGlzIGlzIHRydWUgYXQgbGVhc3Qgd2l0aCBiZWZvcmUvYWZ0ZXIpLgorICAgIG1fdXNl
c1NpYmxpbmdSdWxlcyA9IG1fdXNlc1NpYmxpbmdSdWxlcyB8fCBtX3N0eWxlUmVzb2x2ZXItPnVz
ZXNTaWJsaW5nUnVsZXMoKTsKKyAgICBtX3VzZXNGaXJzdExpbmVSdWxlcyA9IG1fdXNlc0ZpcnN0
TGluZVJ1bGVzIHx8IG1fc3R5bGVSZXNvbHZlci0+dXNlc0ZpcnN0TGluZVJ1bGVzKCk7CisgICAg
bV91c2VzQmVmb3JlQWZ0ZXJSdWxlcyA9IG1fdXNlc0JlZm9yZUFmdGVyUnVsZXMgfHwgbV9zdHls
ZVJlc29sdmVyLT51c2VzQmVmb3JlQWZ0ZXJSdWxlcygpOworICAgIG1fdXNlc0xpbmtSdWxlcyA9
IG1fdXNlc0xpbmtSdWxlcyB8fCBtX3N0eWxlUmVzb2x2ZXItPnVzZXNMaW5rUnVsZXMoKTsKK30K
Kwordm9pZCBEb2N1bWVudDo6cmVzZXRDU1NGZWF0dXJlRmxhZ3MoKQoreworICAgIG1fdXNlc1Np
YmxpbmdSdWxlcyA9IG1fc3R5bGVSZXNvbHZlci0+dXNlc1NpYmxpbmdSdWxlcygpOworICAgIG1f
dXNlc0ZpcnN0TGluZVJ1bGVzID0gbV9zdHlsZVJlc29sdmVyLT51c2VzRmlyc3RMaW5lUnVsZXMo
KTsKKyAgICBtX3VzZXNCZWZvcmVBZnRlclJ1bGVzID0gbV9zdHlsZVJlc29sdmVyLT51c2VzQmVm
b3JlQWZ0ZXJSdWxlcygpOworICAgIG1fdXNlc0xpbmtSdWxlcyA9IG1fc3R5bGVSZXNvbHZlci0+
dXNlc0xpbmtSdWxlcygpOworfQorCit2b2lkIERvY3VtZW50OjpjcmVhdGVTdHlsZVJlc29sdmVy
KCkKK3sKKyAgICBib29sIG1hdGNoQXV0aG9yQW5kVXNlclN0eWxlcyA9IHRydWU7CisgICAgaWYg
KFNldHRpbmdzKiBkb2NTZXR0aW5ncyA9IHNldHRpbmdzKCkpCisgICAgICAgIG1hdGNoQXV0aG9y
QW5kVXNlclN0eWxlcyA9IGRvY1NldHRpbmdzLT5hdXRob3JBbmRVc2VyU3R5bGVzRW5hYmxlZCgp
OworICAgIG1fc3R5bGVSZXNvbHZlciA9IGFkb3B0UHRyKG5ldyBTdHlsZVJlc29sdmVyKHRoaXMs
IG1hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykpOworICAgIGNvbWJpbmVDU1NGZWF0dXJlRmxhZ3Mo
KTsKK30KKworaW5saW5lIHZvaWQgRG9jdW1lbnQ6OmNsZWFyU3R5bGVSZXNvbHZlcigpCit7Cisg
ICAgbV9zdHlsZVJlc29sdmVyLmNsZWFyKCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmF0dGFjaCgp
Cit7CisgICAgQVNTRVJUKCFhdHRhY2hlZCgpKTsKKyAgICBBU1NFUlQoIW1faW5QYWdlQ2FjaGUp
OworICAgIEFTU0VSVCghbV9heE9iamVjdENhY2hlIHx8IHRoaXMgIT0gdG9wRG9jdW1lbnQoKSk7
CisKKyAgICBpZiAoIW1fcmVuZGVyQXJlbmEpCisgICAgICAgIG1fcmVuZGVyQXJlbmEgPSBhZG9w
dFB0cihuZXcgUmVuZGVyQXJlbmEpOworICAgIAorICAgIC8vIENyZWF0ZSB0aGUgcmVuZGVyaW5n
IHRyZWUKKyAgICBzZXRSZW5kZXJlcihuZXcgKG1fcmVuZGVyQXJlbmEuZ2V0KCkpIFJlbmRlclZp
ZXcodGhpcywgdmlldygpKSk7CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAg
IHJlbmRlclZpZXcoKS0+ZGlkTW92ZU9uc2NyZWVuKCk7CisjZW5kaWYKKworICAgIHJlY2FsY1N0
eWxlKEZvcmNlKTsKKworICAgIFJlbmRlck9iamVjdCogcmVuZGVyID0gcmVuZGVyZXIoKTsKKyAg
ICBzZXRSZW5kZXJlcigwKTsKKworICAgIENvbnRhaW5lck5vZGU6OmF0dGFjaCgpOworCisgICAg
c2V0UmVuZGVyZXIocmVuZGVyKTsKK30KKwordm9pZCBEb2N1bWVudDo6ZGV0YWNoKCkKK3sKKyAg
ICBBU1NFUlQoYXR0YWNoZWQoKSk7CisgICAgQVNTRVJUKCFtX2luUGFnZUNhY2hlKTsKKworI2lm
IEVOQUJMRShQT0lOVEVSX0xPQ0spCisgICAgaWYgKHBhZ2UoKSkKKyAgICAgICAgcGFnZSgpLT5w
b2ludGVyTG9ja0NvbnRyb2xsZXIoKS0+ZG9jdW1lbnREZXRhY2hlZCh0aGlzKTsKKyNlbmRpZgor
CisgICAgaWYgKHRoaXMgPT0gdG9wRG9jdW1lbnQoKSkKKyAgICAgICAgY2xlYXJBWE9iamVjdENh
Y2hlKCk7CisKKyAgICBzdG9wQWN0aXZlRE9NT2JqZWN0cygpOworICAgIG1fZXZlbnRRdWV1ZS0+
Y2xvc2UoKTsKKyNpZiBFTkFCTEUoRlVMTFNDUkVFTl9BUEkpCisgICAgbV9mdWxsU2NyZWVuQ2hh
bmdlRXZlbnRUYXJnZXRRdWV1ZS5jbGVhcigpOworICAgIG1fZnVsbFNjcmVlbkVycm9yRXZlbnRU
YXJnZXRRdWV1ZS5jbGVhcigpOworI2VuZGlmCisKKyNpZiBFTkFCTEUoUkVRVUVTVF9BTklNQVRJ
T05fRlJBTUUpCisgICAgLy8gRklYTUU6IGNvbnNpZGVyIHVzaW5nIEFjdGl2ZURPTU9iamVjdC4K
KyAgICBpZiAobV9zY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXIpCisgICAgICAgIG1fc2NyaXB0
ZWRBbmltYXRpb25Db250cm9sbGVyLT5jbGVhckRvY3VtZW50UG9pbnRlcigpOworICAgIG1fc2Ny
aXB0ZWRBbmltYXRpb25Db250cm9sbGVyLmNsZWFyKCk7CisjZW5kaWYKKworICAgIFJlbmRlck9i
amVjdCogcmVuZGVyID0gcmVuZGVyZXIoKTsKKworICAgIGRvY3VtZW50V2lsbEJlY29tZUluYWN0
aXZlKCk7CisKKyNpZiBFTkFCTEUoU0hBUkVEX1dPUktFUlMpCisgICAgU2hhcmVkV29ya2VyUmVw
b3NpdG9yeTo6ZG9jdW1lbnREZXRhY2hlZCh0aGlzKTsKKyNlbmRpZgorCisgICAgaWYgKG1fZnJh
bWUpIHsKKyAgICAgICAgRnJhbWVWaWV3KiB2aWV3ID0gbV9mcmFtZS0+dmlldygpOworICAgICAg
ICBpZiAodmlldykKKyAgICAgICAgICAgIHZpZXctPmRldGFjaEN1c3RvbVNjcm9sbGJhcnMoKTsK
KworICAgIH0KKworICAgIC8vIGluZGljYXRlIGRlc3RydWN0aW9uIG1vZGUsICBpLmUuIGF0dGFj
aGVkKCkgYnV0IHJlbmRlcmVyID09IDAKKyAgICBzZXRSZW5kZXJlcigwKTsKKyAgICAKKyNpZiBF
TkFCTEUoRlVMTFNDUkVFTl9BUEkpCisgICAgaWYgKG1fZnVsbFNjcmVlblJlbmRlcmVyKQorICAg
ICAgICBzZXRGdWxsU2NyZWVuUmVuZGVyZXIoMCk7CisjZW5kaWYKKworICAgIG1faG92ZXJOb2Rl
ID0gMDsKKyAgICBtX2ZvY3VzZWROb2RlID0gMDsKKyAgICBtX2FjdGl2ZU5vZGUgPSAwOworCisg
ICAgQ29udGFpbmVyTm9kZTo6ZGV0YWNoKCk7CisKKyAgICB1bnNjaGVkdWxlU3R5bGVSZWNhbGMo
KTsKKworICAgIGlmIChyZW5kZXIpCisgICAgICAgIHJlbmRlci0+ZGVzdHJveSgpOworCisgICAg
Ly8gVGhpcyBpcyByZXF1aXJlZCwgYXMgb3VyIEZyYW1lIG1pZ2h0IGRlbGV0ZSBpdHNlbGYgYXMg
c29vbiBhcyBpdCBkZXRhY2hlcworICAgIC8vIHVzLiBIb3dldmVyLCB0aGlzIHZpb2xhdGVzIE5v
ZGU6OmRldGFjaCgpIHNlbWFudGljcywgYXMgaXQncyBuZXZlcgorICAgIC8vIHBvc3NpYmxlIHRv
IHJlLWF0dGFjaC4gRXZlbnR1YWxseSBEb2N1bWVudDo6ZGV0YWNoKCkgc2hvdWxkIGJlIHJlbmFt
ZWQsCisgICAgLy8gb3IgdGhpcyBzZXR0aW5nIG9mIHRoZSBmcmFtZSB0byAwIGNvdWxkIGJlIG1h
ZGUgZXhwbGljaXQgaW4gZWFjaCBvZiB0aGUKKyAgICAvLyBjYWxsZXJzIG9mIERvY3VtZW50Ojpk
ZXRhY2goKS4KKyAgICBtX2ZyYW1lID0gMDsKKyAgICBtX3JlbmRlckFyZW5hLmNsZWFyKCk7Cit9
CisKK3ZvaWQgRG9jdW1lbnQ6OnByZXBhcmVGb3JEZXN0cnVjdGlvbigpCit7CisgICAgZGlzY29u
bmVjdERlc2NlbmRhbnRGcmFtZXMoKTsKKyAgICBpZiAoRE9NV2luZG93KiB3aW5kb3cgPSB0aGlz
LT5kb21XaW5kb3coKSkKKyAgICAgICAgd2luZG93LT53aWxsRGV0YWNoRG9jdW1lbnRGcm9tRnJh
bWUoKTsKKyAgICBkZXRhY2goKTsKK30KKwordm9pZCBEb2N1bWVudDo6cmVtb3ZlQWxsRXZlbnRM
aXN0ZW5lcnMoKQoreworICAgIEV2ZW50VGFyZ2V0OjpyZW1vdmVBbGxFdmVudExpc3RlbmVycygp
OworCisgICAgaWYgKERPTVdpbmRvdyogZG9tV2luZG93ID0gdGhpcy0+ZG9tV2luZG93KCkpCisg
ICAgICAgIGRvbVdpbmRvdy0+cmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnMoKTsKKyAgICBmb3IgKE5v
ZGUqIG5vZGUgPSBmaXJzdENoaWxkKCk7IG5vZGU7IG5vZGUgPSBub2RlLT50cmF2ZXJzZU5leHRO
b2RlKCkpCisgICAgICAgIG5vZGUtPnJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzKCk7Cit9CisKK3Zv
aWQgRG9jdW1lbnQ6OnN1c3BlbmRBY3RpdmVET01PYmplY3RzKEFjdGl2ZURPTU9iamVjdDo6UmVh
c29uRm9yU3VzcGVuc2lvbiB3aHkpCit7CisgICAgU2NyaXB0RXhlY3V0aW9uQ29udGV4dDo6c3Vz
cGVuZEFjdGl2ZURPTU9iamVjdHMod2h5KTsKKworI2lmIEVOQUJMRShERVZJQ0VfT1JJRU5UQVRJ
T04pCisgICAgaWYgKCFwYWdlKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChEZXZpY2VN
b3Rpb25Db250cm9sbGVyKiBjb250cm9sbGVyID0gRGV2aWNlTW90aW9uQ29udHJvbGxlcjo6ZnJv
bShwYWdlKCkpKQorICAgICAgICBjb250cm9sbGVyLT5zdXNwZW5kRXZlbnRzRm9yQWxsTGlzdGVu
ZXJzKGRvbVdpbmRvdygpKTsKKyAgICBpZiAoRGV2aWNlT3JpZW50YXRpb25Db250cm9sbGVyKiBj
b250cm9sbGVyID0gRGV2aWNlT3JpZW50YXRpb25Db250cm9sbGVyOjpmcm9tKHBhZ2UoKSkpCisg
ICAgICAgIGNvbnRyb2xsZXItPnN1c3BlbmRFdmVudHNGb3JBbGxMaXN0ZW5lcnMoZG9tV2luZG93
KCkpOworCisjZW5kaWYKK30KKwordm9pZCBEb2N1bWVudDo6cmVzdW1lQWN0aXZlRE9NT2JqZWN0
cygpCit7CisgICAgU2NyaXB0RXhlY3V0aW9uQ29udGV4dDo6cmVzdW1lQWN0aXZlRE9NT2JqZWN0
cygpOworCisjaWYgRU5BQkxFKERFVklDRV9PUklFTlRBVElPTikKKyAgICBpZiAoIXBhZ2UoKSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKERldmljZU1vdGlvbkNvbnRyb2xsZXIqIGNvbnRy
b2xsZXIgPSBEZXZpY2VNb3Rpb25Db250cm9sbGVyOjpmcm9tKHBhZ2UoKSkpCisgICAgICAgIGNv
bnRyb2xsZXItPnJlc3VtZUV2ZW50c0ZvckFsbExpc3RlbmVycyhkb21XaW5kb3coKSk7CisgICAg
aWYgKERldmljZU9yaWVudGF0aW9uQ29udHJvbGxlciogY29udHJvbGxlciA9IERldmljZU9yaWVu
dGF0aW9uQ29udHJvbGxlcjo6ZnJvbShwYWdlKCkpKQorICAgICAgICBjb250cm9sbGVyLT5yZXN1
bWVFdmVudHNGb3JBbGxMaXN0ZW5lcnMoZG9tV2luZG93KCkpOworI2VuZGlmCit9CisKK1JlbmRl
clZpZXcqIERvY3VtZW50OjpyZW5kZXJWaWV3KCkgY29uc3QKK3sKKyAgICByZXR1cm4gdG9SZW5k
ZXJWaWV3KHJlbmRlcmVyKCkpOworfQorCit2b2lkIERvY3VtZW50OjpjbGVhckFYT2JqZWN0Q2Fj
aGUoKQoreworICAgIC8vIGNsZWFyIGNhY2hlIGluIHRvcCBkb2N1bWVudAorICAgIGlmIChtX2F4
T2JqZWN0Q2FjaGUpIHsKKyAgICAgICAgLy8gQ2xlYXIgdGhlIGNhY2hlIG1lbWJlciB2YXJpYWJs
ZSBiZWZvcmUgY2FsbGluZyBkZWxldGUgYmVjYXVzZSBhdHRlbXB0cworICAgICAgICAvLyBhcmUg
bWFkZSB0byBhY2Nlc3MgaXQgZHVyaW5nIGRlc3RydWN0aW9uLgorICAgICAgICBBWE9iamVjdENh
Y2hlKiBheE9iamVjdENhY2hlID0gbV9heE9iamVjdENhY2hlOworICAgICAgICBtX2F4T2JqZWN0
Q2FjaGUgPSAwOworICAgICAgICBkZWxldGUgYXhPYmplY3RDYWNoZTsKKyAgICAgICAgcmV0dXJu
OworICAgIH0KKyAgICAKKyAgICAvLyBhc2sgdGhlIHRvcC1sZXZlbCBkb2N1bWVudCB0byBjbGVh
ciBpdHMgY2FjaGUKKyAgICBEb2N1bWVudCogZG9jID0gdG9wRG9jdW1lbnQoKTsKKyAgICBpZiAo
ZG9jICE9IHRoaXMpCisgICAgICAgIGRvYy0+Y2xlYXJBWE9iamVjdENhY2hlKCk7Cit9CisKK2Jv
b2wgRG9jdW1lbnQ6OmF4T2JqZWN0Q2FjaGVFeGlzdHMoKSBjb25zdAoreworICAgIGlmIChtX2F4
T2JqZWN0Q2FjaGUpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIAorICAgIERvY3VtZW50KiBk
b2MgPSB0b3BEb2N1bWVudCgpOworICAgIGlmIChkb2MgIT0gdGhpcykKKyAgICAgICAgcmV0dXJu
IGRvYy0+YXhPYmplY3RDYWNoZUV4aXN0cygpOworICAgIAorICAgIHJldHVybiBmYWxzZTsKK30K
KyAgICAKK0FYT2JqZWN0Q2FjaGUqIERvY3VtZW50OjpheE9iamVjdENhY2hlKCkgY29uc3QKK3sK
KyAgICAvLyBUaGUgb25seSBkb2N1bWVudCB0aGF0IGFjdHVhbGx5IGhhcyBhIEFYT2JqZWN0Q2Fj
aGUgaXMgdGhlIHRvcC1sZXZlbAorICAgIC8vIGRvY3VtZW50LiAgVGhpcyBpcyBiZWNhdXNlIHdl
IG5lZWQgdG8gYmUgYWJsZSB0byBnZXQgZnJvbSBhbnkgV2ViQ29yZUFYT2JqZWN0CisgICAgLy8g
dG8gYW55IG90aGVyIFdlYkNvcmVBWE9iamVjdCBvbiB0aGUgc2FtZSBwYWdlLiAgVXNpbmcgYSBz
aW5nbGUgY2FjaGUgYWxsb3dzCisgICAgLy8gbG9va3VwcyBhY3Jvc3MgbmVzdGVkIHdlYmFyZWFz
IChpLmUuIG11bHRpcGxlIGRvY3VtZW50cykuCisgICAgCisgICAgaWYgKG1fYXhPYmplY3RDYWNo
ZSkgeworICAgICAgICAvLyByZXR1cm4gYWxyZWFkeSBrbm93biB0b3AtbGV2ZWwgY2FjaGUKKyAg
ICAgICAgaWYgKCFvd25lckVsZW1lbnQoKSkKKyAgICAgICAgICAgIHJldHVybiBtX2F4T2JqZWN0
Q2FjaGU7CisgICAgICAgIAorICAgICAgICAvLyBJbiBzb21lIHBhZ2VzIHdpdGggZnJhbWVzLCB0
aGUgY2FjaGUgaXMgY3JlYXRlZCBiZWZvcmUgdGhlIHN1Yi13ZWJhcmVhIGlzCisgICAgICAgIC8v
IGluc2VydGVkIGludG8gdGhlIHRyZWUuICBIZXJlLCB3ZSBjYXRjaCB0aGF0IGNhc2UgYW5kIGp1
c3QgdG9zcyB0aGUgb2xkCisgICAgICAgIC8vIGNhY2hlIGFuZCBzdGFydCBvdmVyLgorICAgICAg
ICAvLyBOT1RFOiBUaGlzIHJlY292ZXJ5IG1heSBubyBsb25nZXIgYmUgbmVlZGVkLiBJIGhhdmUg
YmVlbiB1bmFibGUgdG8gdHJpZ2dlcgorICAgICAgICAvLyBpdCBhZ2Fpbi4gU2VlIHJkYXI6Ly81
Nzk0NDU0CisgICAgICAgIC8vIEZJWE1FOiBDYW4gdGhpcyBiZSBmaXhlZCB3aGVuIGluc2VydGlu
ZyB0aGUgc3ViZnJhbWUgaW5zdGVhZCBvZiBub3c/CisgICAgICAgIC8vIEZJWE1FOiBJZiB0aGlz
IGZ1bmN0aW9uIHdhcyBjYWxsZWQgdG8gZ2V0IHRoZSBjYWNoZSBpbiBvcmRlciB0byByZW1vdmUK
KyAgICAgICAgLy8gYW4gQVhPYmplY3QsIHdlIGFyZSBub3cgZGVsZXRpbmcgdGhlIGNhY2hlIGFz
IGEgd2hvbGUgYW5kIHJldHVybmluZyBhCisgICAgICAgIC8vIG5ldyBlbXB0eSBjYWNoZSB0aGF0
IGRvZXMgbm90IGNvbnRhaW4gdGhlIEFYT2JqZWN0ISBUaGF0IHNob3VsZCBhY3R1YWxseQorICAg
ICAgICAvLyBiZSBPSy4gSSBhbSBjb25jZXJuZWQgYWJvdXQgb3RoZXIgY2FzZXMgbGlrZSB0aGlz
IHdoZXJlIGFjY2Vzc2luZyB0aGUKKyAgICAgICAgLy8gY2FjaGUgYmxvd3MgYXdheSB0aGUgQVhP
YmplY3QgYmVpbmcgb3BlcmF0ZWQgb24uCisgICAgICAgIGRlbGV0ZSBtX2F4T2JqZWN0Q2FjaGU7
CisgICAgICAgIG1fYXhPYmplY3RDYWNoZSA9IDA7CisgICAgfQorCisgICAgLy8gYXNrIHRoZSB0
b3AtbGV2ZWwgZG9jdW1lbnQgZm9yIGl0cyBjYWNoZQorICAgIERvY3VtZW50KiBkb2MgPSB0b3BE
b2N1bWVudCgpOworICAgIGlmIChkb2MgIT0gdGhpcykKKyAgICAgICAgcmV0dXJuIGRvYy0+YXhP
YmplY3RDYWNoZSgpOworICAgIAorICAgIC8vIHRoaXMgaXMgdGhlIHRvcC1sZXZlbCBkb2N1bWVu
dCwgc28gaW5zdGFsbCBhIG5ldyBjYWNoZQorICAgIG1fYXhPYmplY3RDYWNoZSA9IG5ldyBBWE9i
amVjdENhY2hlKHRoaXMpOworICAgIHJldHVybiBtX2F4T2JqZWN0Q2FjaGU7Cit9CisKK3ZvaWQg
RG9jdW1lbnQ6OnNldFZpc3VhbGx5T3JkZXJlZCgpCit7CisgICAgbV92aXN1YWxseU9yZGVyZWQg
PSB0cnVlOworICAgIGlmIChyZW5kZXJlcigpKQorICAgICAgICByZW5kZXJlcigpLT5zdHlsZSgp
LT5zZXRSVExPcmRlcmluZyhWaXN1YWxPcmRlcik7Cit9CisKK1Bhc3NSZWZQdHI8RG9jdW1lbnRQ
YXJzZXI+IERvY3VtZW50OjpjcmVhdGVQYXJzZXIoKQoreworICAgIC8vIEZJWE1FOiB0aGlzIHNo
b3VsZCBwcm9iYWJseSBwYXNzIHRoZSBmcmFtZSBpbnN0ZWFkCisjaWYgRU5BQkxFKE5FV19YTUwp
CisgICAgcmV0dXJuIE5ld1hNTERvY3VtZW50UGFyc2VyOjpjcmVhdGUodGhpcyk7CisjZWxzZQor
ICAgIHJldHVybiBYTUxEb2N1bWVudFBhcnNlcjo6Y3JlYXRlKHRoaXMsIHZpZXcoKSk7CisjZW5k
aWYKK30KKworU2NyaXB0YWJsZURvY3VtZW50UGFyc2VyKiBEb2N1bWVudDo6c2NyaXB0YWJsZURv
Y3VtZW50UGFyc2VyKCkgY29uc3QKK3sKKyAgICByZXR1cm4gcGFyc2VyKCkgPyBwYXJzZXIoKS0+
YXNTY3JpcHRhYmxlRG9jdW1lbnRQYXJzZXIoKSA6IDA7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6Om9w
ZW4oRG9jdW1lbnQqIG93bmVyRG9jdW1lbnQpCit7CisgICAgaWYgKG93bmVyRG9jdW1lbnQpIHsK
KyAgICAgICAgc2V0VVJMKG93bmVyRG9jdW1lbnQtPnVybCgpKTsKKyAgICAgICAgbV9jb29raWVV
UkwgPSBvd25lckRvY3VtZW50LT5jb29raWVVUkwoKTsKKyAgICAgICAgc2V0U2VjdXJpdHlPcmln
aW4ob3duZXJEb2N1bWVudC0+c2VjdXJpdHlPcmlnaW4oKSk7CisgICAgfQorCisgICAgaWYgKG1f
ZnJhbWUpIHsKKyAgICAgICAgaWYgKFNjcmlwdGFibGVEb2N1bWVudFBhcnNlciogcGFyc2VyID0g
c2NyaXB0YWJsZURvY3VtZW50UGFyc2VyKCkpIHsKKyAgICAgICAgICAgIGlmIChwYXJzZXItPmlz
UGFyc2luZygpKSB7CisgICAgICAgICAgICAgICAgLy8gRklYTUU6IEhUTUw1IGRvZXNuJ3QgdGVs
bCB1cyB0byBjaGVjayB0aGlzLCBpdCBtaWdodCBub3QgYmUgY29ycmVjdC4KKyAgICAgICAgICAg
ICAgICBpZiAocGFyc2VyLT5pc0V4ZWN1dGluZ1NjcmlwdCgpKQorICAgICAgICAgICAgICAgICAg
ICByZXR1cm47CisKKyAgICAgICAgICAgICAgICBpZiAoIXBhcnNlci0+d2FzQ3JlYXRlZEJ5U2Ny
aXB0KCkgJiYgcGFyc2VyLT5oYXNJbnNlcnRpb25Qb2ludCgpKQorICAgICAgICAgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobV9mcmFt
ZS0+bG9hZGVyKCktPnN0YXRlKCkgPT0gRnJhbWVTdGF0ZVByb3Zpc2lvbmFsKQorICAgICAgICAg
ICAgbV9mcmFtZS0+bG9hZGVyKCktPnN0b3BBbGxMb2FkZXJzKCk7CisgICAgfQorCisgICAgcmVt
b3ZlQWxsRXZlbnRMaXN0ZW5lcnMoKTsKKyAgICBpbXBsaWNpdE9wZW4oKTsKKyAgICBpZiAoU2Ny
aXB0YWJsZURvY3VtZW50UGFyc2VyKiBwYXJzZXIgPSBzY3JpcHRhYmxlRG9jdW1lbnRQYXJzZXIo
KSkKKyAgICAgICAgcGFyc2VyLT5zZXRXYXNDcmVhdGVkQnlTY3JpcHQodHJ1ZSk7CisKKyAgICBp
ZiAoRE9NV2luZG93KiBkb21XaW5kb3cgPSB0aGlzLT5kb21XaW5kb3coKSkKKyAgICAgICAgZG9t
V2luZG93LT5yZW1vdmVBbGxFdmVudExpc3RlbmVycygpOworCisgICAgaWYgKG1fZnJhbWUpCisg
ICAgICAgIG1fZnJhbWUtPmxvYWRlcigpLT5kaWRFeHBsaWNpdE9wZW4oKTsKK30KKwordm9pZCBE
b2N1bWVudDo6ZGV0YWNoUGFyc2VyKCkKK3sKKyAgICBpZiAoIW1fcGFyc2VyKQorICAgICAgICBy
ZXR1cm47CisgICAgbV9wYXJzZXItPmRldGFjaCgpOworICAgIG1fcGFyc2VyLmNsZWFyKCk7Cit9
CisKK3ZvaWQgRG9jdW1lbnQ6OmNhbmNlbFBhcnNpbmcoKQoreworICAgIGlmICghbV9wYXJzZXIp
CisgICAgICAgIHJldHVybjsKKworICAgIC8vIFdlIGhhdmUgdG8gY2xlYXIgdGhlIHBhcnNlciB0
byBhdm9pZCBwb3NzaWJseSB0cmlnZ2VyaW5nCisgICAgLy8gdGhlIG9ubG9hZCBoYW5kbGVyIHdo
ZW4gY2xvc2luZyBhcyBhIHNpZGUgZWZmZWN0IG9mIGEgY2FuY2VsLXN0eWxlCisgICAgLy8gY2hh
bmdlLCBzdWNoIGFzIG9wZW5pbmcgYSBuZXcgZG9jdW1lbnQgb3IgY2xvc2luZyB0aGUgd2luZG93
IHdoaWxlCisgICAgLy8gc3RpbGwgcGFyc2luZworICAgIGRldGFjaFBhcnNlcigpOworICAgIGV4
cGxpY2l0Q2xvc2UoKTsKK30KKwordm9pZCBEb2N1bWVudDo6aW1wbGljaXRPcGVuKCkKK3sKKyAg
ICBjYW5jZWxQYXJzaW5nKCk7CisKKyAgICByZW1vdmVDaGlsZHJlbigpOworCisgICAgc2V0Q29t
cGF0aWJpbGl0eU1vZGUoTm9RdWlya3NNb2RlKTsKKworICAgIG1fcGFyc2VyID0gY3JlYXRlUGFy
c2VyKCk7CisgICAgc2V0UGFyc2luZyh0cnVlKTsKKyAgICBzZXRSZWFkeVN0YXRlKExvYWRpbmcp
OworfQorCitIVE1MRWxlbWVudCogRG9jdW1lbnQ6OmJvZHkoKSBjb25zdAoreworICAgIE5vZGUq
IGRlID0gZG9jdW1lbnRFbGVtZW50KCk7CisgICAgaWYgKCFkZSkKKyAgICAgICAgcmV0dXJuIDA7
CisgICAgCisgICAgLy8gdHJ5IHRvIHByZWZlciBhIEZSQU1FU0VUIGVsZW1lbnQgb3ZlciBCT0RZ
CisgICAgTm9kZSogYm9keSA9IDA7CisgICAgZm9yIChOb2RlKiBpID0gZGUtPmZpcnN0Q2hpbGQo
KTsgaTsgaSA9IGktPm5leHRTaWJsaW5nKCkpIHsKKyAgICAgICAgaWYgKGktPmhhc1RhZ05hbWUo
ZnJhbWVzZXRUYWcpKQorICAgICAgICAgICAgcmV0dXJuIHRvSFRNTEVsZW1lbnQoaSk7CisgICAg
ICAgIAorICAgICAgICBpZiAoaS0+aGFzVGFnTmFtZShib2R5VGFnKSAmJiAhYm9keSkKKyAgICAg
ICAgICAgIGJvZHkgPSBpOworICAgIH0KKyAgICByZXR1cm4gdG9IVE1MRWxlbWVudChib2R5KTsK
K30KKwordm9pZCBEb2N1bWVudDo6c2V0Qm9keShQYXNzUmVmUHRyPEhUTUxFbGVtZW50PiBwcnBO
ZXdCb2R5LCBFeGNlcHRpb25Db2RlJiBlYykKK3sKKyAgICBSZWZQdHI8SFRNTEVsZW1lbnQ+IG5l
d0JvZHkgPSBwcnBOZXdCb2R5OworCisgICAgaWYgKCFuZXdCb2R5IHx8ICFkb2N1bWVudEVsZW1l
bnQoKSB8fCAhbmV3Qm9keS0+aGFzVGFnTmFtZShib2R5VGFnKSkgeyAKKyAgICAgICAgZWMgPSBI
SUVSQVJDSFlfUkVRVUVTVF9FUlI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAo
bmV3Qm9keS0+ZG9jdW1lbnQoKSAmJiBuZXdCb2R5LT5kb2N1bWVudCgpICE9IHRoaXMpIHsKKyAg
ICAgICAgZWMgPSAwOworICAgICAgICBSZWZQdHI8Tm9kZT4gbm9kZSA9IGltcG9ydE5vZGUobmV3
Qm9keS5nZXQoKSwgdHJ1ZSwgZWMpOworICAgICAgICBpZiAoZWMpCisgICAgICAgICAgICByZXR1
cm47CisgICAgICAgIAorICAgICAgICBuZXdCb2R5ID0gdG9IVE1MRWxlbWVudChub2RlLmdldCgp
KTsKKyAgICB9CisKKyAgICBIVE1MRWxlbWVudCogYiA9IGJvZHkoKTsKKyAgICBpZiAoIWIpCisg
ICAgICAgIGRvY3VtZW50RWxlbWVudCgpLT5hcHBlbmRDaGlsZChuZXdCb2R5LnJlbGVhc2UoKSwg
ZWMpOworICAgIGVsc2UKKyAgICAgICAgZG9jdW1lbnRFbGVtZW50KCktPnJlcGxhY2VDaGlsZChu
ZXdCb2R5LnJlbGVhc2UoKSwgYiwgZWMpOworfQorCitIVE1MSGVhZEVsZW1lbnQqIERvY3VtZW50
OjpoZWFkKCkKK3sKKyAgICBOb2RlKiBkZSA9IGRvY3VtZW50RWxlbWVudCgpOworICAgIGlmICgh
ZGUpCisgICAgICAgIHJldHVybiAwOworCisgICAgZm9yIChOb2RlKiBlID0gZGUtPmZpcnN0Q2hp
bGQoKTsgZTsgZSA9IGUtPm5leHRTaWJsaW5nKCkpCisgICAgICAgIGlmIChlLT5oYXNUYWdOYW1l
KGhlYWRUYWcpKQorICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEhUTUxIZWFkRWxlbWVu
dCo+KGUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmNsb3NlKCkKK3sK
KyAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIGZvbGxvdyB0aGUgc3BlY2lmaWNhdGlvbiBtb3JlIGNs
b3NlbHk6CisgICAgLy8gICAgICAgIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBw
cy9jdXJyZW50LXdvcmsvI2RvbS1kb2N1bWVudC1jbG9zZQorCisgICAgaWYgKCFzY3JpcHRhYmxl
RG9jdW1lbnRQYXJzZXIoKSB8fCAhc2NyaXB0YWJsZURvY3VtZW50UGFyc2VyKCktPndhc0NyZWF0
ZWRCeVNjcmlwdCgpIHx8ICFzY3JpcHRhYmxlRG9jdW1lbnRQYXJzZXIoKS0+aXNQYXJzaW5nKCkp
CisgICAgICAgIHJldHVybjsKKworICAgIGV4cGxpY2l0Q2xvc2UoKTsKK30KKwordm9pZCBEb2N1
bWVudDo6ZXhwbGljaXRDbG9zZSgpCit7CisgICAgaWYgKG1fcGFyc2VyKQorICAgICAgICBtX3Bh
cnNlci0+ZmluaXNoKCk7CisKKyAgICBpZiAoIW1fZnJhbWUpIHsKKyAgICAgICAgLy8gQmVjYXVz
ZSB3ZSBoYXZlIG5vIGZyYW1lLCB3ZSBkb24ndCBrbm93IGlmIGFsbCBsb2FkaW5nIGhhcyBjb21w
bGV0ZWQsCisgICAgICAgIC8vIHNvIHdlIGp1c3QgY2FsbCBpbXBsaWNpdENsb3NlKCkgaW1tZWRp
YXRlbHkuIEZJWE1FOiBUaGlzIG1pZ2h0IGZpcmUKKyAgICAgICAgLy8gdGhlIGxvYWQgZXZlbnQg
cHJlbWF0dXJlbHkgPGh0dHA6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE0NTY4
Pi4KKyAgICAgICAgaW1wbGljaXRDbG9zZSgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisg
ICAgbV9mcmFtZS0+bG9hZGVyKCktPmNoZWNrQ29tcGxldGVkKCk7Cit9CisKK3ZvaWQgRG9jdW1l
bnQ6OmltcGxpY2l0Q2xvc2UoKQoreworICAgIC8vIElmIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2Yg
cmVjYWxjU3R5bGUsIHdlIG5lZWQgdG8gZGVmZXIgdGhlIGNsb3NlIHVudGlsIHRoZSBzdHlsZSBp
bmZvcm1hdGlvbiBpcyBhY2N1cmF0ZSBhbmQgYWxsIGVsZW1lbnRzIGFyZSByZS1hdHRhY2hlZC4K
KyAgICBpZiAobV9pblN0eWxlUmVjYWxjKSB7CisgICAgICAgIG1fY2xvc2VBZnRlclN0eWxlUmVj
YWxjID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgd2FzTG9jYXRp
b25DaGFuZ2VQZW5kaW5nID0gZnJhbWUoKSAmJiBmcmFtZSgpLT5uYXZpZ2F0aW9uU2NoZWR1bGVy
KCktPmxvY2F0aW9uQ2hhbmdlUGVuZGluZygpOworICAgIGJvb2wgZG9sb2FkID0gIXBhcnNpbmco
KSAmJiBtX3BhcnNlciAmJiAhbV9wcm9jZXNzaW5nTG9hZEV2ZW50ICYmICF3YXNMb2NhdGlvbkNo
YW5nZVBlbmRpbmc7CisgICAgCisgICAgaWYgKCFkb2xvYWQpCisgICAgICAgIHJldHVybjsKKwor
ICAgIG1fcHJvY2Vzc2luZ0xvYWRFdmVudCA9IHRydWU7CisKKyAgICBTY3JpcHRhYmxlRG9jdW1l
bnRQYXJzZXIqIHBhcnNlciA9IHNjcmlwdGFibGVEb2N1bWVudFBhcnNlcigpOworICAgIG1fd2Vs
bEZvcm1lZCA9IHBhcnNlciAmJiBwYXJzZXItPndlbGxGb3JtZWQoKTsKKworICAgIC8vIFdlIGhh
dmUgdG8gY2xlYXIgdGhlIHBhcnNlciwgaW4gY2FzZSBzb21lb25lIGRvY3VtZW50LndyaXRlKClz
IGZyb20gdGhlCisgICAgLy8gb25Mb2FkIGV2ZW50IGhhbmRsZXIsIGFzIGluIFJhZGFyIDMyMDY1
MjQuCisgICAgZGV0YWNoUGFyc2VyKCk7CisKKyAgICAvLyBQYXJzZXIgc2hvdWxkIGhhdmUgcGlj
a2VkIHVwIGFsbCBwcmVsb2FkcyBieSBub3cKKyAgICBtX2NhY2hlZFJlc291cmNlTG9hZGVyLT5j
bGVhclByZWxvYWRzKCk7CisKKyAgICAvLyBGSVhNRTogV2Uga2ljayBvZmYgdGhlIGljb24gbG9h
ZGVyIHdoZW4gdGhlIERvY3VtZW50IGlzIGRvbmUgcGFyc2luZy4KKyAgICAvLyBUaGVyZSBhcmUg
ZWFybGllciBvcHBvcnR1bml0aWVzIHdlIGNvdWxkIHN0YXJ0IGl0OgorICAgIC8vICAtV2hlbiB0
aGUgPGhlYWQ+IGZpbmlzaGVzIHBhcnNpbmcKKyAgICAvLyAgLVdoZW4gYW55IG5ldyBIVE1MTGlu
a0VsZW1lbnQgaXMgaW5zZXJ0ZWQgaW50byB0aGUgZG9jdW1lbnQKKyAgICAvLyBCdXQgdGhvc2Ug
YWRkIGEgZHluYW1pYyBjb21wb25lbnQgdG8gdGhlIGZhdmljb24gdGhhdCBoYXMgVUkgCisgICAg
Ly8gcmFtaWZpY2F0aW9ucywgYW5kIHdlIG5lZWQgdG8gZGVjaWRlIHdoYXQgaXMgdGhlIFJpZ2h0
IFRoaW5nIFRvIERvKHRtKQorICAgIEZyYW1lKiBmID0gZnJhbWUoKTsKKyAgICBpZiAoZikgewor
ICAgICAgICBmLT5sb2FkZXIoKS0+aWNvbigpLT5zdGFydExvYWRlcigpOworICAgICAgICBmLT5h
bmltYXRpb24oKS0+cmVzdW1lQW5pbWF0aW9uc0ZvckRvY3VtZW50KHRoaXMpOworICAgIH0KKwor
ICAgIEltYWdlTG9hZGVyOjpkaXNwYXRjaFBlbmRpbmdCZWZvcmVMb2FkRXZlbnRzKCk7CisgICAg
SW1hZ2VMb2FkZXI6OmRpc3BhdGNoUGVuZGluZ0xvYWRFdmVudHMoKTsKKyAgICBJbWFnZUxvYWRl
cjo6ZGlzcGF0Y2hQZW5kaW5nRXJyb3JFdmVudHMoKTsKKworICAgIEhUTUxMaW5rRWxlbWVudDo6
ZGlzcGF0Y2hQZW5kaW5nTG9hZEV2ZW50cygpOworICAgIEhUTUxTdHlsZUVsZW1lbnQ6OmRpc3Bh
dGNoUGVuZGluZ0xvYWRFdmVudHMoKTsKKworI2lmIEVOQUJMRShTVkcpCisgICAgLy8gVG8gYWxp
Z24gdGhlIEhUTUwgbG9hZCBldmVudCBhbmQgdGhlIFNWR0xvYWQgZXZlbnQgZm9yIHRoZSBvdXRl
cm1vc3QgPHN2Zz4gZWxlbWVudCwgZmlyZSBpdCBmcm9tCisgICAgLy8gaGVyZSwgaW5zdGVhZCBv
ZiBkb2luZyBpdCBmcm9tIFNWR0VsZW1lbnQ6OmZpbmlzaGVkUGFyc2luZ0NoaWxkcmVuIChpZiBl
eHRlcm5hbFJlc291cmNlc1JlcXVpcmVkPSJmYWxzZSIsCisgICAgLy8gd2hpY2ggaXMgdGhlIGRl
ZmF1bHQsIGZvciA9J3RydWUnIGl0cyBmaXJlZCBhdCBhIGxhdGVyIHRpbWUsIG9uY2UgYWxsIGV4
dGVybmFsIHJlc291cmNlcyBmaW5pc2hlZCBsb2FkaW5nKS4KKyAgICBpZiAoc3ZnRXh0ZW5zaW9u
cygpKQorICAgICAgICBhY2Nlc3NTVkdFeHRlbnNpb25zKCktPmRpc3BhdGNoU1ZHTG9hZEV2ZW50
VG9PdXRlcm1vc3RTVkdFbGVtZW50cygpOworI2VuZGlmCisKKyAgICBkaXNwYXRjaFdpbmRvd0xv
YWRFdmVudCgpOworICAgIGVucXVldWVQYWdlc2hvd0V2ZW50KFBhZ2VzaG93RXZlbnROb3RQZXJz
aXN0ZWQpOworICAgIGVucXVldWVQb3BzdGF0ZUV2ZW50KG1fcGVuZGluZ1N0YXRlT2JqZWN0ID8g
bV9wZW5kaW5nU3RhdGVPYmplY3QucmVsZWFzZSgpIDogU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpu
dWxsVmFsdWUoKSk7CisgICAgCisgICAgaWYgKGYpCisgICAgICAgIGYtPmxvYWRlcigpLT5oYW5k
bGVkT25sb2FkRXZlbnRzKCk7CisjaWZkZWYgSU5TVFJVTUVOVF9MQVlPVVRfU0NIRURVTElORwor
ICAgIGlmICghb3duZXJFbGVtZW50KCkpCisgICAgICAgIHByaW50Zigib25sb2FkIGZpcmVkIGF0
ICVkXG4iLCBlbGFwc2VkVGltZSgpKTsKKyNlbmRpZgorCisgICAgLy8gQW4gZXZlbnQgaGFuZGxl
ciBtYXkgaGF2ZSByZW1vdmVkIHRoZSBmcmFtZQorICAgIGlmICghZnJhbWUoKSkgeworICAgICAg
ICBtX3Byb2Nlc3NpbmdMb2FkRXZlbnQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0K
KworICAgIC8vIE1ha2Ugc3VyZSBib3RoIHRoZSBpbml0aWFsIGxheW91dCBhbmQgcmVmbG93IGhh
cHBlbiBhZnRlciB0aGUgb25sb2FkCisgICAgLy8gZmlyZXMuIFRoaXMgd2lsbCBpbXByb3ZlIG9u
bG9hZCBzY29yZXMsIGFuZCBvdGhlciBicm93c2VycyBkbyBpdC4KKyAgICAvLyBJZiB0aGV5IHdh
bm5hIGNoZWF0LCB3ZSBjYW4gdG9vLiAtZHdoCisKKyAgICBpZiAoZnJhbWUoKS0+bmF2aWdhdGlv
blNjaGVkdWxlcigpLT5sb2NhdGlvbkNoYW5nZVBlbmRpbmcoKSAmJiBlbGFwc2VkVGltZSgpIDwg
Y0xheW91dFNjaGVkdWxlVGhyZXNob2xkKSB7CisgICAgICAgIC8vIEp1c3QgYmFpbCBvdXQuIEJl
Zm9yZSBvciBkdXJpbmcgdGhlIG9ubG9hZCB3ZSB3ZXJlIHNoaWZ0ZWQgdG8gYW5vdGhlciBwYWdl
LgorICAgICAgICAvLyBUaGUgb2xkIGktQmVuY2ggc3VpdGUgZG9lcyB0aGlzLiBXaGVuIHRoaXMg
aGFwcGVucyBkb24ndCBib3RoZXIgcGFpbnRpbmcgb3IgbGF5aW5nIG91dC4gICAgICAgIAorICAg
ICAgICBtX3Byb2Nlc3NpbmdMb2FkRXZlbnQgPSBmYWxzZTsKKyAgICAgICAgdmlldygpLT51bnNj
aGVkdWxlUmVsYXlvdXQoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZyYW1lKCkt
PmxvYWRlcigpLT5jaGVja0NhbGxJbXBsaWNpdENsb3NlKCk7CisgICAgUmVuZGVyT2JqZWN0KiBy
ZW5kZXJPYmplY3QgPSByZW5kZXJlcigpOworICAgIAorICAgIC8vIFdlIHVzZWQgdG8gZm9yY2Ug
YSBzeW5jaHJvbm91cyBkaXNwbGF5IGFuZCBmbHVzaCBoZXJlLiAgVGhpcyByZWFsbHkgaXNuJ3QK
KyAgICAvLyBuZWNlc3NhcnkgYW5kIGNhbiBpbiBmYWN0IGJlIGFjdGl2ZWx5IGhhcm1mdWwgaWYg
cGFnZXMgYXJlIGxvYWRpbmcgYXQgYSByYXRlIG9mID4gNjBmcHMKKyAgICAvLyAoaWYgeW91ciBw
bGF0Zm9ybSBpcyBzeW5jaW5nIGZsdXNoZXMgYW5kIGxpbWl0aW5nIHRoZW0gdG8gNjBmcHMpLgor
ICAgIG1fb3Zlck1pbmltdW1MYXlvdXRUaHJlc2hvbGQgPSB0cnVlOworICAgIGlmICghb3duZXJF
bGVtZW50KCkgfHwgKG93bmVyRWxlbWVudCgpLT5yZW5kZXJlcigpICYmICFvd25lckVsZW1lbnQo
KS0+cmVuZGVyZXIoKS0+bmVlZHNMYXlvdXQoKSkpIHsKKyAgICAgICAgdXBkYXRlU3R5bGVJZk5l
ZWRlZCgpOworICAgICAgICAKKyAgICAgICAgLy8gQWx3YXlzIGRvIGEgbGF5b3V0IGFmdGVyIGxv
YWRpbmcgaWYgbmVlZGVkLgorICAgICAgICBpZiAodmlldygpICYmIHJlbmRlck9iamVjdCAmJiAo
IXJlbmRlck9iamVjdC0+Zmlyc3RDaGlsZCgpIHx8IHJlbmRlck9iamVjdC0+bmVlZHNMYXlvdXQo
KSkpCisgICAgICAgICAgICB2aWV3KCktPmxheW91dCgpOworICAgIH0KKworICAgIG1fcHJvY2Vz
c2luZ0xvYWRFdmVudCA9IGZhbHNlOworCisjaWYgUExBVEZPUk0oTUFDKSB8fCBQTEFURk9STShD
SFJPTUlVTSkKKyAgICBpZiAoZiAmJiByZW5kZXJPYmplY3QgJiYgQVhPYmplY3RDYWNoZTo6YWNj
ZXNzaWJpbGl0eUVuYWJsZWQoKSkgeworICAgICAgICAvLyBUaGUgQVggY2FjaGUgbWF5IGhhdmUg
YmVlbiBjbGVhcmVkIGF0IHRoaXMgcG9pbnQsIGJ1dCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSBpdCBj
b250YWlucyBhbgorICAgICAgICAvLyBBWCBvYmplY3QgdG8gc2VuZCB0aGUgbm90aWZpY2F0aW9u
IHRvLiBnZXRPckNyZWF0ZSB3aWxsIG1ha2Ugc3VyZSB0aGF0IGFuIHZhbGlkIEFYIG9iamVjdAor
ICAgICAgICAvLyBleGlzdHMgaW4gdGhlIGNhY2hlICh3ZSBpZ25vcmUgdGhlIHJldHVybiB2YWx1
ZSBiZWNhdXNlIHdlIGRvbid0IG5lZWQgaXQgaGVyZSkuIFRoaXMgaXMgCisgICAgICAgIC8vIG9u
bHkgc2FmZSB0byBjYWxsIHdoZW4gYSBsYXlvdXQgaXMgbm90IGluIHByb2dyZXNzLCBzbyBpdCBj
YW4gbm90IGJlIHVzZWQgaW4gcG9zdE5vdGlmaWNhdGlvbi4gICAgCisgICAgICAgIGF4T2JqZWN0
Q2FjaGUoKS0+Z2V0T3JDcmVhdGUocmVuZGVyT2JqZWN0KTsKKyAgICAgICAgaWYgKHRoaXMgPT0g
dG9wRG9jdW1lbnQoKSkKKyAgICAgICAgICAgIGF4T2JqZWN0Q2FjaGUoKS0+cG9zdE5vdGlmaWNh
dGlvbihyZW5kZXJPYmplY3QsIEFYT2JqZWN0Q2FjaGU6OkFYTG9hZENvbXBsZXRlLCB0cnVlKTsK
KyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyBBWExvYWRDb21wbGV0ZSBjYW4gb25seSBi
ZSBwb3N0ZWQgb24gdGhlIHRvcCBkb2N1bWVudCwgc28gaWYgaXQncyBhIGRvY3VtZW50CisgICAg
ICAgICAgICAvLyBpbiBhbiBpZnJhbWUgdGhhdCBqdXN0IGZpbmlzaGVkIGxvYWRpbmcsIHBvc3Qg
QVhMYXlvdXRDb21wbGV0ZSBpbnN0ZWFkLgorICAgICAgICAgICAgYXhPYmplY3RDYWNoZSgpLT5w
b3N0Tm90aWZpY2F0aW9uKHJlbmRlck9iamVjdCwgQVhPYmplY3RDYWNoZTo6QVhMYXlvdXRDb21w
bGV0ZSwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworI2lmIEVOQUJMRShTVkcp
CisgICAgaWYgKHN2Z0V4dGVuc2lvbnMoKSkKKyAgICAgICAgYWNjZXNzU1ZHRXh0ZW5zaW9ucygp
LT5zdGFydEFuaW1hdGlvbnMoKTsKKyNlbmRpZgorfQorCit2b2lkIERvY3VtZW50OjpzZXRQYXJz
aW5nKGJvb2wgYikKK3sKKyAgICBtX2JQYXJzaW5nID0gYjsKKyAgICBpZiAoIW1fYlBhcnNpbmcg
JiYgdmlldygpKQorICAgICAgICB2aWV3KCktPnNjaGVkdWxlUmVsYXlvdXQoKTsKKworI2lmZGVm
IElOU1RSVU1FTlRfTEFZT1VUX1NDSEVEVUxJTkcKKyAgICBpZiAoIW93bmVyRWxlbWVudCgpICYm
ICFtX2JQYXJzaW5nKQorICAgICAgICBwcmludGYoIlBhcnNpbmcgZmluaXNoZWQgYXQgJWRcbiIs
IGVsYXBzZWRUaW1lKCkpOworI2VuZGlmCit9CisKK2Jvb2wgRG9jdW1lbnQ6OnNob3VsZFNjaGVk
dWxlTGF5b3V0KCkKK3sKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgb25seSBiZSBjYWxsZWQg
d2hlbiBGcmFtZVZpZXcgdGhpbmtzIGEgbGF5b3V0IGlzIG5lZWRlZC4KKyAgICAvLyBUaGlzIGVu
Zm9yY2VzIGEgY291cGxlIGV4dHJhIHJ1bGVzLgorICAgIC8vCisgICAgLy8gICAgKGEpIE9ubHkg
c2NoZWR1bGUgYSBsYXlvdXQgb25jZSB0aGUgc3R5bGVzaGVldHMgYXJlIGxvYWRlZC4KKyAgICAv
LyAgICAoYikgT25seSBzY2hlZHVsZSBsYXlvdXQgb25jZSB3ZSBoYXZlIGEgYm9keSBlbGVtZW50
LgorCisgICAgcmV0dXJuIChoYXZlU3R5bGVzaGVldHNMb2FkZWQoKSAmJiBib2R5KCkpCisgICAg
ICAgIHx8IChkb2N1bWVudEVsZW1lbnQoKSAmJiAhZG9jdW1lbnRFbGVtZW50KCktPmhhc1RhZ05h
bWUoaHRtbFRhZykpOworfQorICAgIAorYm9vbCBEb2N1bWVudDo6aXNMYXlvdXRUaW1lckFjdGl2
ZSgpCit7CisgICAgcmV0dXJuIHZpZXcoKSAmJiB2aWV3KCktPmxheW91dFBlbmRpbmcoKSAmJiAh
bWluaW11bUxheW91dERlbGF5KCk7Cit9CisKK2ludCBEb2N1bWVudDo6bWluaW11bUxheW91dERl
bGF5KCkKK3sKKyAgICBpZiAobV9vdmVyTWluaW11bUxheW91dFRocmVzaG9sZCkKKyAgICAgICAg
cmV0dXJuIDA7CisgICAgCisgICAgaW50IGVsYXBzZWQgPSBlbGFwc2VkVGltZSgpOworICAgIG1f
b3Zlck1pbmltdW1MYXlvdXRUaHJlc2hvbGQgPSBlbGFwc2VkID4gY0xheW91dFNjaGVkdWxlVGhy
ZXNob2xkOworICAgIAorICAgIC8vIFdlJ2xsIHdhbnQgdG8gc2NoZWR1bGUgdGhlIHRpbWVyIHRv
IGZpcmUgYXQgdGhlIG1pbmltdW0gbGF5b3V0IHRocmVzaG9sZC4KKyAgICByZXR1cm4gbWF4KDAs
IGNMYXlvdXRTY2hlZHVsZVRocmVzaG9sZCAtIGVsYXBzZWQpOworfQorCitpbnQgRG9jdW1lbnQ6
OmVsYXBzZWRUaW1lKCkgY29uc3QKK3sKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PigoY3Vy
cmVudFRpbWUoKSAtIG1fc3RhcnRUaW1lKSAqIDEwMDApOworfQorCit2b2lkIERvY3VtZW50Ojp3
cml0ZShjb25zdCBTZWdtZW50ZWRTdHJpbmcmIHRleHQsIERvY3VtZW50KiBvd25lckRvY3VtZW50
KQoreworICAgIE5lc3RpbmdMZXZlbEluY3JlbWVudGVyIG5lc3RpbmdMZXZlbEluY3JlbWVudGVy
KG1fd3JpdGVSZWN1cnNpb25EZXB0aCk7CisKKyAgICBtX3dyaXRlUmVjdXJzaW9uSXNUb29EZWVw
ID0gKG1fd3JpdGVSZWN1cnNpb25EZXB0aCA+IDEpICYmIG1fd3JpdGVSZWN1cnNpb25Jc1Rvb0Rl
ZXA7CisgICAgbV93cml0ZVJlY3Vyc2lvbklzVG9vRGVlcCA9IChtX3dyaXRlUmVjdXJzaW9uRGVw
dGggPiBjTWF4V3JpdGVSZWN1cnNpb25EZXB0aCkgfHwgbV93cml0ZVJlY3Vyc2lvbklzVG9vRGVl
cDsKKworICAgIGlmIChtX3dyaXRlUmVjdXJzaW9uSXNUb29EZWVwKQorICAgICAgIHJldHVybjsK
KworI2lmZGVmIElOU1RSVU1FTlRfTEFZT1VUX1NDSEVEVUxJTkcKKyAgICBpZiAoIW93bmVyRWxl
bWVudCgpKQorICAgICAgICBwcmludGYoIkJlZ2lubmluZyBhIGRvY3VtZW50LndyaXRlIGF0ICVk
XG4iLCBlbGFwc2VkVGltZSgpKTsKKyNlbmRpZgorCisgICAgYm9vbCBoYXNJbnNlcnRpb25Qb2lu
dCA9IG1fcGFyc2VyICYmIG1fcGFyc2VyLT5oYXNJbnNlcnRpb25Qb2ludCgpOworICAgIGlmICgh
aGFzSW5zZXJ0aW9uUG9pbnQgJiYgbV9pZ25vcmVEZXN0cnVjdGl2ZVdyaXRlQ291bnQpCisgICAg
ICAgIHJldHVybjsKKworICAgIGlmICghaGFzSW5zZXJ0aW9uUG9pbnQpCisgICAgICAgIG9wZW4o
b3duZXJEb2N1bWVudCk7CisKKyAgICBBU1NFUlQobV9wYXJzZXIpOworICAgIG1fcGFyc2VyLT5p
bnNlcnQodGV4dCk7CisKKyNpZmRlZiBJTlNUUlVNRU5UX0xBWU9VVF9TQ0hFRFVMSU5HCisgICAg
aWYgKCFvd25lckVsZW1lbnQoKSkKKyAgICAgICAgcHJpbnRmKCJFbmRpbmcgYSBkb2N1bWVudC53
cml0ZSBhdCAlZFxuIiwgZWxhcHNlZFRpbWUoKSk7CisjZW5kaWYgICAgCit9CisKK3ZvaWQgRG9j
dW1lbnQ6OndyaXRlKGNvbnN0IFN0cmluZyYgdGV4dCwgRG9jdW1lbnQqIG93bmVyRG9jdW1lbnQp
Cit7CisgICAgd3JpdGUoU2VnbWVudGVkU3RyaW5nKHRleHQpLCBvd25lckRvY3VtZW50KTsKK30K
Kwordm9pZCBEb2N1bWVudDo6d3JpdGVsbihjb25zdCBTdHJpbmcmIHRleHQsIERvY3VtZW50KiBv
d25lckRvY3VtZW50KQoreworICAgIHdyaXRlKHRleHQsIG93bmVyRG9jdW1lbnQpOworICAgIHdy
aXRlKCJcbiIsIG93bmVyRG9jdW1lbnQpOworfQorCitjb25zdCBLVVJMJiBEb2N1bWVudDo6dmly
dHVhbFVSTCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fdXJsOworfQorCitLVVJMIERvY3VtZW50
Ojp2aXJ0dWFsQ29tcGxldGVVUkwoY29uc3QgU3RyaW5nJiB1cmwpIGNvbnN0Cit7CisgICAgcmV0
dXJuIGNvbXBsZXRlVVJMKHVybCk7Cit9CisKK2RvdWJsZSBEb2N1bWVudDo6bWluaW11bVRpbWVy
SW50ZXJ2YWwoKSBjb25zdAoreworICAgIFBhZ2UqIHAgPSBwYWdlKCk7CisgICAgaWYgKCFwKQor
ICAgICAgICByZXR1cm4gU2NyaXB0RXhlY3V0aW9uQ29udGV4dDo6bWluaW11bVRpbWVySW50ZXJ2
YWwoKTsKKyAgICByZXR1cm4gcC0+c2V0dGluZ3MoKS0+bWluRE9NVGltZXJJbnRlcnZhbCgpOwor
fQorCitFdmVudFRhcmdldCogRG9jdW1lbnQ6OmVycm9yRXZlbnRUYXJnZXQoKQoreworICAgIHJl
dHVybiBkb21XaW5kb3coKTsKK30KKwordm9pZCBEb2N1bWVudDo6bG9nRXhjZXB0aW9uVG9Db25z
b2xlKGNvbnN0IFN0cmluZyYgZXJyb3JNZXNzYWdlLCBjb25zdCBTdHJpbmcmIHNvdXJjZVVSTCwg
aW50IGxpbmVOdW1iZXIsIFBhc3NSZWZQdHI8U2NyaXB0Q2FsbFN0YWNrPiBjYWxsU3RhY2spCit7
CisgICAgYWRkQ29uc29sZU1lc3NhZ2UoSlNNZXNzYWdlU291cmNlLCBMb2dNZXNzYWdlVHlwZSwg
RXJyb3JNZXNzYWdlTGV2ZWwsIGVycm9yTWVzc2FnZSwgc291cmNlVVJMLCBsaW5lTnVtYmVyLCBj
YWxsU3RhY2spOworfQorCit2b2lkIERvY3VtZW50OjpzZXRVUkwoY29uc3QgS1VSTCYgdXJsKQor
eworICAgIGNvbnN0IEtVUkwmIG5ld1VSTCA9IHVybC5pc0VtcHR5KCkgPyBibGFua1VSTCgpIDog
dXJsOworICAgIGlmIChuZXdVUkwgPT0gbV91cmwpCisgICAgICAgIHJldHVybjsKKworICAgIG1f
dXJsID0gbmV3VVJMOworICAgIG1fZG9jdW1lbnRVUkkgPSBtX3VybC5zdHJpbmcoKTsKKyAgICB1
cGRhdGVCYXNlVVJMKCk7CisgICAgY29udGV4dEZlYXR1cmVzKCktPnVybERpZENoYW5nZSh0aGlz
KTsKK30KKwordm9pZCBEb2N1bWVudDo6dXBkYXRlQmFzZVVSTCgpCit7CisgICAgS1VSTCBvbGRC
YXNlVVJMID0gbV9iYXNlVVJMOworICAgIC8vIERPTSAzIENvcmU6IFdoZW4gdGhlIERvY3VtZW50
IHN1cHBvcnRzIHRoZSBmZWF0dXJlICJIVE1MIiBbRE9NIExldmVsIDIgSFRNTF0sIHRoZSBiYXNl
IFVSSSBpcyBjb21wdXRlZCB1c2luZworICAgIC8vIGZpcnN0IHRoZSB2YWx1ZSBvZiB0aGUgaHJl
ZiBhdHRyaWJ1dGUgb2YgdGhlIEhUTUwgQkFTRSBlbGVtZW50IGlmIGFueSwgYW5kIHRoZSB2YWx1
ZSBvZiB0aGUgZG9jdW1lbnRVUkkgYXR0cmlidXRlCisgICAgLy8gZnJvbSB0aGUgRG9jdW1lbnQg
aW50ZXJmYWNlIG90aGVyd2lzZS4KKyAgICBpZiAoIW1fYmFzZUVsZW1lbnRVUkwuaXNFbXB0eSgp
KQorICAgICAgICBtX2Jhc2VVUkwgPSBtX2Jhc2VFbGVtZW50VVJMOworICAgIGVsc2UgaWYgKCFt
X2Jhc2VVUkxPdmVycmlkZS5pc0VtcHR5KCkpCisgICAgICAgIG1fYmFzZVVSTCA9IG1fYmFzZVVS
TE92ZXJyaWRlOworICAgIGVsc2UgeworICAgICAgICAvLyBUaGUgZG9jdW1lbnRVUkkgYXR0cmli
dXRlIGlzIHJlYWQtb25seSBmcm9tIEphdmFTY3JpcHQsIGJ1dCB3cml0YWJsZSBmcm9tIE9iamVj
dGl2ZSBDLCBzbyB3ZSBuZWVkIHRvIHJldGFpbgorICAgICAgICAvLyB0aGlzIGZhbGxiYWNrIGJl
aGF2aW9yLiBXZSB1c2UgYSBudWxsIGJhc2UgVVJMLCBzaW5jZSB0aGUgZG9jdW1lbnRVUkkgYXR0
cmlidXRlIGlzIGFuIGFyYml0cmFyeSBzdHJpbmcKKyAgICAgICAgLy8gYW5kIERPTSAzIENvcmUg
ZG9lcyBub3Qgc3BlY2lmeSBob3cgaXQgc2hvdWxkIGJlIHJlc29sdmVkLgorICAgICAgICBtX2Jh
c2VVUkwgPSBLVVJMKEtVUkwoKSwgZG9jdW1lbnRVUkkoKSk7CisgICAgfQorICAgIHNlbGVjdG9y
UXVlcnlDYWNoZSgpLT5pbnZhbGlkYXRlKCk7CisKKyAgICBpZiAoIW1fYmFzZVVSTC5pc1ZhbGlk
KCkpCisgICAgICAgIG1fYmFzZVVSTCA9IEtVUkwoKTsKKworICAgIGlmIChtX2VsZW1TaGVldCkg
eworICAgICAgICAvLyBFbGVtZW50IHNoZWV0IGlzIHNpbGx5LiBJdCBuZXZlciBjb250YWlucyBh
bnl0aGluZy4KKyAgICAgICAgQVNTRVJUKCFtX2VsZW1TaGVldC0+Y29udGVudHMoKS0+cnVsZUNv
dW50KCkpOworICAgICAgICBib29sIHVzZXNSZW1Vbml0cyA9IG1fZWxlbVNoZWV0LT5jb250ZW50
cygpLT51c2VzUmVtVW5pdHMoKTsKKyAgICAgICAgbV9lbGVtU2hlZXQgPSBDU1NTdHlsZVNoZWV0
OjpjcmVhdGVJbmxpbmUodGhpcywgbV9iYXNlVVJMKTsKKyAgICAgICAgLy8gRklYTUU6IFNvIHdl
IGFyZSBub3QgcmVhbGx5IHRoZSBwYXJzZXIuIFRoZSByaWdodCBmaXggaXMgdG8gZWxpbWluYXRl
IHRoZSBlbGVtZW50IHNoZWV0IGNvbXBsZXRlbHkuCisgICAgICAgIG1fZWxlbVNoZWV0LT5jb250
ZW50cygpLT5wYXJzZXJTZXRVc2VzUmVtVW5pdHModXNlc1JlbVVuaXRzKTsKKyAgICB9CisKKyAg
ICBpZiAoIWVxdWFsSWdub3JpbmdGcmFnbWVudElkZW50aWZpZXIob2xkQmFzZVVSTCwgbV9iYXNl
VVJMKSkgeworICAgICAgICAvLyBCYXNlIFVSTCBjaGFuZ2UgY2hhbmdlcyBhbnkgcmVsYXRpdmUg
dmlzaXRlZCBsaW5rcy4KKyAgICAgICAgLy8gRklYTUU6IFRoZXJlIGFyZSBvdGhlciBVUkxzIGlu
IHRoZSB0cmVlIHRoYXQgd291bGQgbmVlZCB0byBiZSByZS1ldmFsdWF0ZWQgb24gZHluYW1pYyBi
YXNlIFVSTCBjaGFuZ2UuIFN0eWxlIHNob3VsZCBiZSBpbnZhbGlkYXRlZCB0b28uCisgICAgICAg
IGZvciAoTm9kZSogbm9kZSA9IGZpcnN0Q2hpbGQoKTsgbm9kZTsgbm9kZSA9IG5vZGUtPnRyYXZl
cnNlTmV4dE5vZGUoKSkgeworICAgICAgICAgICAgaWYgKG5vZGUtPmhhc1RhZ05hbWUoYVRhZykp
CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTEFuY2hvckVsZW1lbnQqPihub2RlKS0+
aW52YWxpZGF0ZUNhY2hlZFZpc2l0ZWRMaW5rSGFzaCgpOworICAgICAgICB9CisgICAgfQorfQor
Cit2b2lkIERvY3VtZW50OjpzZXRCYXNlVVJMT3ZlcnJpZGUoY29uc3QgS1VSTCYgdXJsKQorewor
ICAgIG1fYmFzZVVSTE92ZXJyaWRlID0gdXJsOworICAgIHVwZGF0ZUJhc2VVUkwoKTsKK30KKwor
dm9pZCBEb2N1bWVudDo6cHJvY2Vzc0Jhc2VFbGVtZW50KCkKK3sKKyAgICAvLyBGaW5kIHRoZSBm
aXJzdCBocmVmIGF0dHJpYnV0ZSBpbiBhIGJhc2UgZWxlbWVudCBhbmQgdGhlIGZpcnN0IHRhcmdl
dCBhdHRyaWJ1dGUgaW4gYSBiYXNlIGVsZW1lbnQuCisgICAgY29uc3QgQXRvbWljU3RyaW5nKiBo
cmVmID0gMDsKKyAgICBjb25zdCBBdG9taWNTdHJpbmcqIHRhcmdldCA9IDA7CisgICAgZm9yIChO
b2RlKiBub2RlID0gZG9jdW1lbnQoKS0+Zmlyc3RDaGlsZCgpOyBub2RlICYmICghaHJlZiB8fCAh
dGFyZ2V0KTsgbm9kZSA9IG5vZGUtPnRyYXZlcnNlTmV4dE5vZGUoKSkgeworICAgICAgICBpZiAo
bm9kZS0+aGFzVGFnTmFtZShiYXNlVGFnKSkgeworICAgICAgICAgICAgaWYgKCFocmVmKSB7Cisg
ICAgICAgICAgICAgICAgY29uc3QgQXRvbWljU3RyaW5nJiB2YWx1ZSA9IHN0YXRpY19jYXN0PEVs
ZW1lbnQqPihub2RlKS0+ZmFzdEdldEF0dHJpYnV0ZShocmVmQXR0cik7CisgICAgICAgICAgICAg
ICAgaWYgKCF2YWx1ZS5pc051bGwoKSkKKyAgICAgICAgICAgICAgICAgICAgaHJlZiA9ICZ2YWx1
ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghdGFyZ2V0KSB7CisgICAgICAgICAg
ICAgICAgY29uc3QgQXRvbWljU3RyaW5nJiB2YWx1ZSA9IHN0YXRpY19jYXN0PEVsZW1lbnQqPihu
b2RlKS0+ZmFzdEdldEF0dHJpYnV0ZSh0YXJnZXRBdHRyKTsKKyAgICAgICAgICAgICAgICBpZiAo
IXZhbHVlLmlzTnVsbCgpKQorICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSAmdmFsdWU7Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBGSVhNRTogU2luY2UgdGhp
cyBkb2Vzbid0IHNoYXJlIGNvZGUgd2l0aCBjb21wbGV0ZVVSTCBpdCBtYXkgbm90IGhhbmRsZSBl
bmNvZGluZ3MgY29ycmVjdGx5LgorICAgIEtVUkwgYmFzZUVsZW1lbnRVUkw7CisgICAgaWYgKGhy
ZWYpIHsKKyAgICAgICAgU3RyaW5nIHN0cmlwcGVkSHJlZiA9IHN0cmlwTGVhZGluZ0FuZFRyYWls
aW5nSFRNTFNwYWNlcygqaHJlZik7CisgICAgICAgIGlmICghc3RyaXBwZWRIcmVmLmlzRW1wdHko
KSkKKyAgICAgICAgICAgIGJhc2VFbGVtZW50VVJMID0gS1VSTCh1cmwoKSwgc3RyaXBwZWRIcmVm
KTsKKyAgICB9CisgICAgaWYgKG1fYmFzZUVsZW1lbnRVUkwgIT0gYmFzZUVsZW1lbnRVUkwpIHsK
KyAgICAgICAgbV9iYXNlRWxlbWVudFVSTCA9IGJhc2VFbGVtZW50VVJMOworICAgICAgICB1cGRh
dGVCYXNlVVJMKCk7CisgICAgfQorCisgICAgbV9iYXNlVGFyZ2V0ID0gdGFyZ2V0ID8gKnRhcmdl
dCA6IG51bGxBdG9tOworfQorCitTdHJpbmcgRG9jdW1lbnQ6OnVzZXJBZ2VudChjb25zdCBLVVJM
JiB1cmwpIGNvbnN0Cit7CisgICAgcmV0dXJuIGZyYW1lKCkgPyBmcmFtZSgpLT5sb2FkZXIoKS0+
dXNlckFnZW50KHVybCkgOiBTdHJpbmcoKTsKK30KKwordm9pZCBEb2N1bWVudDo6ZGlzYWJsZUV2
YWwoY29uc3QgU3RyaW5nJiBlcnJvck1lc3NhZ2UpCit7CisgICAgaWYgKCFmcmFtZSgpKQorICAg
ICAgICByZXR1cm47CisKKyAgICBmcmFtZSgpLT5zY3JpcHQoKS0+ZGlzYWJsZUV2YWwoZXJyb3JN
ZXNzYWdlKTsKK30KKworYm9vbCBEb2N1bWVudDo6Y2FuTmF2aWdhdGUoRnJhbWUqIHRhcmdldEZy
YW1lKQoreworICAgIGlmICghbV9mcmFtZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
Ly8gRklYTUU6IFdlIHNob3VsZG4ndCBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aG91dCBhIHRhcmdl
dCBmcmFtZSwgYnV0CisgICAgLy8gZmFzdC9mb3Jtcy9zdWJtaXQtdG8tYmxhbmstbXVsdGlwbGUt
dGltZXMuaHRtbCBkZXBlbmRzIG9uIHRoaXMgZnVuY3Rpb24KKyAgICAvLyByZXR1cm5pbmcgdHJ1
ZSB3aGVuIHN1cHBsaWVkIHdpdGggYSAwIHRhcmdldEZyYW1lLgorICAgIGlmICghdGFyZ2V0RnJh
bWUpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gRnJhbWUtYnVzdGluZyBpcyBnZW5l
cmFsbHkgYWxsb3dlZCAodW5sZXNzIHdlJ3JlIHNhbmRib3hlZCBhbmQgcHJldmVudCBmcm9tIGZy
YW1lLWJ1c3RpbmcpLgorICAgIGlmICghaXNTYW5kYm94ZWQoU2FuZGJveFRvcE5hdmlnYXRpb24p
ICYmIHRhcmdldEZyYW1lID09IG1fZnJhbWUtPnRyZWUoKS0+dG9wKCkpCisgICAgICAgIHJldHVy
biB0cnVlOworCisgICAgaWYgKGlzU2FuZGJveGVkKFNhbmRib3hOYXZpZ2F0aW9uKSkgeworICAg
ICAgICBpZiAodGFyZ2V0RnJhbWUtPnRyZWUoKS0+aXNEZXNjZW5kYW50T2YobV9mcmFtZSkpCisg
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICBwcmludE5hdmlnYXRpb25FcnJvck1l
c3NhZ2UodGFyZ2V0RnJhbWUsIHVybCgpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0K
KworICAgIC8vIFRoaXMgaXMgdGhlIG5vcm1hbCBjYXNlLiBBIGRvY3VtZW50IGNhbiBuYXZpZ2F0
ZSBpdHMgZGVjZW5kYW50IGZyYW1lcywKKyAgICAvLyBvciwgbW9yZSBnZW5lcmFsbHksIGEgZG9j
dW1lbnQgY2FuIG5hdmlnYXRlIGEgZnJhbWUgaWYgdGhlIGRvY3VtZW50IGlzCisgICAgLy8gaW4g
dGhlIHNhbWUgb3JpZ2luIGFzIGFueSBvZiB0aGF0IGZyYW1lJ3MgYW5jZXN0b3JzIChpbiB0aGUg
ZnJhbWUKKyAgICAvLyBoaWVyYXJjaHkpLgorICAgIC8vCisgICAgLy8gU2VlIGh0dHA6Ly93d3cu
YWRhbWJhcnRoLmNvbS9wYXBlcnMvMjAwOC9iYXJ0aC1qYWNrc29uLW1pdGNoZWxsLnBkZiBmb3IK
KyAgICAvLyBoaXN0b3JpY2FsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgc2VjdXJpdHkgY2hlY2su
CisgICAgaWYgKGNhbkFjY2Vzc0FuY2VzdG9yKHNlY3VyaXR5T3JpZ2luKCksIHRhcmdldEZyYW1l
KSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBUb3AtbGV2ZWwgZnJhbWVzIGFyZSBl
YXNpZXIgdG8gbmF2aWdhdGUgdGhhbiBvdGhlciBmcmFtZXMgYmVjYXVzZSB0aGV5CisgICAgLy8g
ZGlzcGxheSB0aGVpciBVUkxzIGluIHRoZSBhZGRyZXNzIGJhciAoaW4gbW9zdCBicm93c2Vycyku
IEhvd2V2ZXIsIHRoZXJlCisgICAgLy8gYXJlIHN0aWxsIHNvbWUgcmVzdHJpY3Rpb25zIG9uIG5h
dmlnYXRpb24gdG8gYXZvaWQgbnVpc2FuY2UgYXR0YWNrcy4KKyAgICAvLyBTcGVjaWZpY2FsbHks
IGEgZG9jdW1lbnQgY2FuIG5hdmlnYXRlIGEgdG9wLWxldmVsIGZyYW1lIGlmIHRoYXQgZnJhbWUK
KyAgICAvLyBvcGVuZWQgdGhlIGRvY3VtZW50IG9yIGlmIHRoZSBkb2N1bWVudCBpcyB0aGUgc2Ft
ZS1vcmlnaW4gd2l0aCBhbnkgb2YKKyAgICAvLyB0aGUgdG9wLWxldmVsIGZyYW1lJ3Mgb3BlbmVy
J3MgYW5jZXN0b3JzIChpbiB0aGUgZnJhbWUgaGllcmFyY2h5KS4KKyAgICAvLworICAgIC8vIElu
IGJvdGggb2YgdGhlc2UgY2FzZXMsIHRoZSBkb2N1bWVudCBwZXJmb3JtaW5nIHRoZSBuYXZpZ2F0
aW9uIGlzIGluCisgICAgLy8gc29tZSB3YXkgcmVsYXRlZCB0byB0aGUgZnJhbWUgYmVpbmcgbmF2
aWdhdGUgKGUuZy4sIGJ5IHRoZSAib3BlbmVyIgorICAgIC8vIGFuZC9vciAicGFyZW50IiByZWxh
dGlvbikuIFJlcXVpcmluZyBzb21lIHNvcnQgb2YgcmVsYXRpb24gcHJldmVudHMgYQorICAgIC8v
IGRvY3VtZW50IGZyb20gbmF2aWdhdGluZyBhcmJpdHJhcnksIHVucmVsYXRlZCB0b3AtbGV2ZWwg
ZnJhbWVzLgorICAgIGlmICghdGFyZ2V0RnJhbWUtPnRyZWUoKS0+cGFyZW50KCkpIHsKKyAgICAg
ICAgaWYgKHRhcmdldEZyYW1lID09IG1fZnJhbWUtPmxvYWRlcigpLT5vcGVuZXIoKSkKKyAgICAg
ICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIGlmIChjYW5BY2Nlc3NBbmNlc3RvcihzZWN1
cml0eU9yaWdpbigpLCB0YXJnZXRGcmFtZS0+bG9hZGVyKCktPm9wZW5lcigpKSkKKyAgICAgICAg
ICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaW50TmF2aWdhdGlvbkVycm9yTWVzc2Fn
ZSh0YXJnZXRGcmFtZSwgdXJsKCkpOworICAgIHJldHVybiBmYWxzZTsKK30KKworRnJhbWUqIERv
Y3VtZW50OjpmaW5kVW5zYWZlUGFyZW50U2Nyb2xsUHJvcGFnYXRpb25Cb3VuZGFyeSgpCit7Cisg
ICAgRnJhbWUqIGN1cnJlbnRGcmFtZSA9IG1fZnJhbWU7CisgICAgRnJhbWUqIGFuY2VzdG9yRnJh
bWUgPSBjdXJyZW50RnJhbWUtPnRyZWUoKS0+cGFyZW50KCk7IAorCisgICAgd2hpbGUgKGFuY2Vz
dG9yRnJhbWUpIHsKKyAgICAgICAgaWYgKCFhbmNlc3RvckZyYW1lLT5kb2N1bWVudCgpLT5zZWN1
cml0eU9yaWdpbigpLT5jYW5BY2Nlc3Moc2VjdXJpdHlPcmlnaW4oKSkpCisgICAgICAgICAgICBy
ZXR1cm4gY3VycmVudEZyYW1lOworICAgICAgICBjdXJyZW50RnJhbWUgPSBhbmNlc3RvckZyYW1l
OworICAgICAgICBhbmNlc3RvckZyYW1lID0gYW5jZXN0b3JGcmFtZS0+dHJlZSgpLT5wYXJlbnQo
KTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK0NTU1N0eWxlU2hlZXQqIERvY3VtZW50Ojpw
YWdlVXNlclNoZWV0KCkKK3sKKyAgICBpZiAobV9wYWdlVXNlclNoZWV0KQorICAgICAgICByZXR1
cm4gbV9wYWdlVXNlclNoZWV0LmdldCgpOworICAgIAorICAgIFBhZ2UqIG93bmluZ1BhZ2UgPSBw
YWdlKCk7CisgICAgaWYgKCFvd25pbmdQYWdlKQorICAgICAgICByZXR1cm4gMDsKKyAgICAKKyAg
ICBTdHJpbmcgdXNlclNoZWV0VGV4dCA9IG93bmluZ1BhZ2UtPnVzZXJTdHlsZVNoZWV0KCk7Cisg
ICAgaWYgKHVzZXJTaGVldFRleHQuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICAK
KyAgICAvLyBQYXJzZSB0aGUgc2hlZXQgYW5kIGNhY2hlIGl0LgorICAgIG1fcGFnZVVzZXJTaGVl
dCA9IENTU1N0eWxlU2hlZXQ6OmNyZWF0ZUlubGluZSh0aGlzLCBzZXR0aW5ncygpLT51c2VyU3R5
bGVTaGVldExvY2F0aW9uKCkpOworICAgIG1fcGFnZVVzZXJTaGVldC0+Y29udGVudHMoKS0+c2V0
SXNVc2VyU3R5bGVTaGVldCh0cnVlKTsKKyAgICBtX3BhZ2VVc2VyU2hlZXQtPmNvbnRlbnRzKCkt
PnBhcnNlU3RyaW5nKHVzZXJTaGVldFRleHQpOworICAgIHJldHVybiBtX3BhZ2VVc2VyU2hlZXQu
Z2V0KCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmNsZWFyUGFnZVVzZXJTaGVldCgpCit7CisgICAg
aWYgKG1fcGFnZVVzZXJTaGVldCkgeworICAgICAgICBtX3BhZ2VVc2VyU2hlZXQgPSAwOworICAg
ICAgICBzdHlsZVJlc29sdmVyQ2hhbmdlZChEZWZlclJlY2FsY1N0eWxlKTsKKyAgICB9Cit9CisK
K3ZvaWQgRG9jdW1lbnQ6OnVwZGF0ZVBhZ2VVc2VyU2hlZXQoKQoreworICAgIGNsZWFyUGFnZVVz
ZXJTaGVldCgpOworICAgIGlmIChwYWdlVXNlclNoZWV0KCkpCisgICAgICAgIHN0eWxlUmVzb2x2
ZXJDaGFuZ2VkKFJlY2FsY1N0eWxlSW1tZWRpYXRlbHkpOworfQorCitjb25zdCBWZWN0b3I8UmVm
UHRyPENTU1N0eWxlU2hlZXQ+ID4qIERvY3VtZW50OjpwYWdlR3JvdXBVc2VyU2hlZXRzKCkgY29u
c3QKK3sKKyAgICBpZiAobV9wYWdlR3JvdXBVc2VyU2hlZXRDYWNoZVZhbGlkKQorICAgICAgICBy
ZXR1cm4gbV9wYWdlR3JvdXBVc2VyU2hlZXRzLmdldCgpOworICAgIAorICAgIG1fcGFnZUdyb3Vw
VXNlclNoZWV0Q2FjaGVWYWxpZCA9IHRydWU7CisgICAgCisgICAgUGFnZSogb3duaW5nUGFnZSA9
IHBhZ2UoKTsKKyAgICBpZiAoIW93bmluZ1BhZ2UpCisgICAgICAgIHJldHVybiAwOworICAgICAg
ICAKKyAgICBjb25zdCBQYWdlR3JvdXAmIHBhZ2VHcm91cCA9IG93bmluZ1BhZ2UtPmdyb3VwKCk7
CisgICAgY29uc3QgVXNlclN0eWxlU2hlZXRNYXAqIHNoZWV0c01hcCA9IHBhZ2VHcm91cC51c2Vy
U3R5bGVTaGVldHMoKTsKKyAgICBpZiAoIXNoZWV0c01hcCkKKyAgICAgICAgcmV0dXJuIDA7CisK
KyAgICBVc2VyU3R5bGVTaGVldE1hcDo6Y29uc3RfaXRlcmF0b3IgZW5kID0gc2hlZXRzTWFwLT5l
bmQoKTsKKyAgICBmb3IgKFVzZXJTdHlsZVNoZWV0TWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IHNo
ZWV0c01hcC0+YmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgIGNvbnN0IFVzZXJT
dHlsZVNoZWV0VmVjdG9yKiBzaGVldHMgPSBpdC0+c2Vjb25kLmdldCgpOworICAgICAgICBmb3Ig
KHVuc2lnbmVkIGkgPSAwOyBpIDwgc2hlZXRzLT5zaXplKCk7ICsraSkgeworICAgICAgICAgICAg
Y29uc3QgVXNlclN0eWxlU2hlZXQqIHNoZWV0ID0gc2hlZXRzLT5hdChpKS5nZXQoKTsKKyAgICAg
ICAgICAgIGlmIChzaGVldC0+aW5qZWN0ZWRGcmFtZXMoKSA9PSBJbmplY3RJblRvcEZyYW1lT25s
eSAmJiBvd25lckVsZW1lbnQoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
ICAgIGlmICghVXNlckNvbnRlbnRVUkxQYXR0ZXJuOjptYXRjaGVzUGF0dGVybnModXJsKCksIHNo
ZWV0LT53aGl0ZWxpc3QoKSwgc2hlZXQtPmJsYWNrbGlzdCgpKSkKKyAgICAgICAgICAgICAgICBj
b250aW51ZTsKKyAgICAgICAgICAgIFJlZlB0cjxDU1NTdHlsZVNoZWV0PiBncm91cFNoZWV0ID0g
Q1NTU3R5bGVTaGVldDo6Y3JlYXRlSW5saW5lKGNvbnN0X2Nhc3Q8RG9jdW1lbnQqPih0aGlzKSwg
c2hlZXQtPnVybCgpKTsKKyAgICAgICAgICAgIGlmICghbV9wYWdlR3JvdXBVc2VyU2hlZXRzKQor
ICAgICAgICAgICAgICAgIG1fcGFnZUdyb3VwVXNlclNoZWV0cyA9IGFkb3B0UHRyKG5ldyBWZWN0
b3I8UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4pOworICAgICAgICAgICAgbV9wYWdlR3JvdXBVc2Vy
U2hlZXRzLT5hcHBlbmQoZ3JvdXBTaGVldCk7CisgICAgICAgICAgICBncm91cFNoZWV0LT5jb250
ZW50cygpLT5zZXRJc1VzZXJTdHlsZVNoZWV0KHNoZWV0LT5sZXZlbCgpID09IFVzZXJTdHlsZVVz
ZXJMZXZlbCk7CisgICAgICAgICAgICBncm91cFNoZWV0LT5jb250ZW50cygpLT5wYXJzZVN0cmlu
ZyhzaGVldC0+c291cmNlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG1fcGFn
ZUdyb3VwVXNlclNoZWV0cy5nZXQoKTsKK30KKwordm9pZCBEb2N1bWVudDo6Y2xlYXJQYWdlR3Jv
dXBVc2VyU2hlZXRzKCkKK3sKKyAgICBtX3BhZ2VHcm91cFVzZXJTaGVldENhY2hlVmFsaWQgPSBm
YWxzZTsKKyAgICBpZiAobV9wYWdlR3JvdXBVc2VyU2hlZXRzICYmIG1fcGFnZUdyb3VwVXNlclNo
ZWV0cy0+c2l6ZSgpKSB7CisgICAgICAgIG1fcGFnZUdyb3VwVXNlclNoZWV0cy0+Y2xlYXIoKTsK
KyAgICAgICAgc3R5bGVSZXNvbHZlckNoYW5nZWQoRGVmZXJSZWNhbGNTdHlsZSk7CisgICAgfQor
fQorCit2b2lkIERvY3VtZW50Ojp1cGRhdGVQYWdlR3JvdXBVc2VyU2hlZXRzKCkKK3sKKyAgICBj
bGVhclBhZ2VHcm91cFVzZXJTaGVldHMoKTsKKyAgICBpZiAocGFnZUdyb3VwVXNlclNoZWV0cygp
ICYmIHBhZ2VHcm91cFVzZXJTaGVldHMoKS0+c2l6ZSgpKQorICAgICAgICBzdHlsZVJlc29sdmVy
Q2hhbmdlZChSZWNhbGNTdHlsZUltbWVkaWF0ZWx5KTsKK30KKwordm9pZCBEb2N1bWVudDo6YWRk
VXNlclNoZWV0KFBhc3NSZWZQdHI8U3R5bGVTaGVldENvbnRlbnRzPiB1c2VyU2hlZXQpCit7Cisg
ICAgaWYgKCFtX3VzZXJTaGVldHMpCisgICAgICAgIG1fdXNlclNoZWV0cyA9IGFkb3B0UHRyKG5l
dyBWZWN0b3I8UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4pOworICAgIG1fdXNlclNoZWV0cy0+YXBw
ZW5kKENTU1N0eWxlU2hlZXQ6OmNyZWF0ZSh1c2VyU2hlZXQsIHRoaXMpKTsKKyAgICBzdHlsZVJl
c29sdmVyQ2hhbmdlZChSZWNhbGNTdHlsZUltbWVkaWF0ZWx5KTsKK30KKwordm9pZCBEb2N1bWVu
dDo6c2VhbWxlc3NQYXJlbnRVcGRhdGVkU3R5bGVzaGVldHMoKQoreworICAgIHN0eWxlUmVzb2x2
ZXJDaGFuZ2VkKFJlY2FsY1N0eWxlSW1tZWRpYXRlbHkpOworfQorCitDU1NTdHlsZVNoZWV0KiBE
b2N1bWVudDo6ZWxlbWVudFNoZWV0KCkKK3sKKyAgICBpZiAoIW1fZWxlbVNoZWV0KQorICAgICAg
ICBtX2VsZW1TaGVldCA9IENTU1N0eWxlU2hlZXQ6OmNyZWF0ZUlubGluZSh0aGlzLCBtX2Jhc2VV
UkwpOworICAgIHJldHVybiBtX2VsZW1TaGVldC5nZXQoKTsKK30KKworaW50IERvY3VtZW50Ojpu
b2RlQWJzSW5kZXgoTm9kZSAqbm9kZSkKK3sKKyAgICBBU1NFUlQobm9kZS0+ZG9jdW1lbnQoKSA9
PSB0aGlzKTsKKworICAgIGludCBhYnNJbmRleCA9IDA7CisgICAgZm9yIChOb2RlKiBuID0gbm9k
ZTsgbiAmJiBuICE9IHRoaXM7IG4gPSBuLT50cmF2ZXJzZVByZXZpb3VzTm9kZSgpKQorICAgICAg
ICBhYnNJbmRleCsrOworICAgIHJldHVybiBhYnNJbmRleDsKK30KKworTm9kZSogRG9jdW1lbnQ6
Om5vZGVXaXRoQWJzSW5kZXgoaW50IGFic0luZGV4KQoreworICAgIE5vZGUqIG4gPSB0aGlzOwor
ICAgIGZvciAoaW50IGkgPSAwOyBuICYmIChpIDwgYWJzSW5kZXgpOyBpKyspCisgICAgICAgIG4g
PSBuLT50cmF2ZXJzZU5leHROb2RlKCk7CisgICAgcmV0dXJuIG47Cit9CisKK3ZvaWQgRG9jdW1l
bnQ6OnByb2Nlc3NIdHRwRXF1aXYoY29uc3QgU3RyaW5nJiBlcXVpdiwgY29uc3QgU3RyaW5nJiBj
b250ZW50KQoreworICAgIEFTU0VSVCghZXF1aXYuaXNOdWxsKCkgJiYgIWNvbnRlbnQuaXNOdWxs
KCkpOworCisgICAgRnJhbWUqIGZyYW1lID0gdGhpcy0+ZnJhbWUoKTsKKworICAgIGlmIChlcXVh
bElnbm9yaW5nQ2FzZShlcXVpdiwgImRlZmF1bHQtc3R5bGUiKSkgeworICAgICAgICAvLyBUaGUg
cHJlZmVycmVkIHN0eWxlIHNldCBoYXMgYmVlbiBvdmVycmlkZGVuIGFzIHBlciBzZWN0aW9uIAor
ICAgICAgICAvLyAxNC4zLjIgb2YgdGhlIEhUTUw0LjAgc3BlY2lmaWNhdGlvbi4gIFdlIG5lZWQg
dG8gdXBkYXRlIHRoZQorICAgICAgICAvLyBzaGVldCB1c2VkIHZhcmlhYmxlIGFuZCB0aGVuIHVw
ZGF0ZSBvdXIgc3R5bGUgc2VsZWN0b3IuIAorICAgICAgICAvLyBGb3IgbW9yZSBpbmZvLCBzZWUg
dGhlIHRlc3QgYXQ6CisgICAgICAgIC8vIGh0dHA6Ly93d3cuaGl4aWUuY2gvdGVzdHMvZXZpbC9j
c3MvaW1wb3J0L21haW4vcHJlZmVycmVkLmh0bWwKKyAgICAgICAgLy8gLWR3aAorICAgICAgICBt
X3NlbGVjdGVkU3R5bGVzaGVldFNldCA9IGNvbnRlbnQ7CisgICAgICAgIG1fcHJlZmVycmVkU3R5
bGVzaGVldFNldCA9IGNvbnRlbnQ7CisgICAgICAgIHN0eWxlUmVzb2x2ZXJDaGFuZ2VkKERlZmVy
UmVjYWxjU3R5bGUpOworICAgIH0gZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoZXF1aXYsICJy
ZWZyZXNoIikpIHsKKyAgICAgICAgZG91YmxlIGRlbGF5OworICAgICAgICBTdHJpbmcgdXJsOwor
ICAgICAgICBpZiAoZnJhbWUgJiYgcGFyc2VIVFRQUmVmcmVzaChjb250ZW50LCB0cnVlLCBkZWxh
eSwgdXJsKSkgeworICAgICAgICAgICAgaWYgKHVybC5pc0VtcHR5KCkpCisgICAgICAgICAgICAg
ICAgdXJsID0gbV91cmwuc3RyaW5nKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAg
ICAgdXJsID0gY29tcGxldGVVUkwodXJsKS5zdHJpbmcoKTsKKyAgICAgICAgICAgIGZyYW1lLT5u
YXZpZ2F0aW9uU2NoZWR1bGVyKCktPnNjaGVkdWxlUmVkaXJlY3QoZGVsYXksIHVybCk7CisgICAg
ICAgIH0KKyAgICB9IGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGVxdWl2LCAic2V0LWNvb2tp
ZSIpKSB7CisgICAgICAgIC8vIEZJWE1FOiBtYWtlIHNldENvb2tpZSB3b3JrIG9uIFhNTCBkb2N1
bWVudHMgdG9vOyBlLmcuIGluIGNhc2Ugb2YgPGh0bWw6bWV0YSAuLi4uLj4KKyAgICAgICAgaWYg
KGlzSFRNTERvY3VtZW50KCkpIHsKKyAgICAgICAgICAgIEV4Y2VwdGlvbkNvZGUgZWM7IC8vIEV4
Y2VwdGlvbiAoZm9yIHNhbmRib3hlZCBkb2N1bWVudHMpIGlnbm9yZWQuCisgICAgICAgICAgICBz
dGF0aWNfY2FzdDxIVE1MRG9jdW1lbnQqPih0aGlzKS0+c2V0Q29va2llKGNvbnRlbnQsIGVjKTsK
KyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoZXF1aXYsICJjb250
ZW50LWxhbmd1YWdlIikpCisgICAgICAgIHNldENvbnRlbnRMYW5ndWFnZShjb250ZW50KTsKKyAg
ICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZShlcXVpdiwgIngtZG5zLXByZWZldGNoLWNvbnRy
b2wiKSkKKyAgICAgICAgcGFyc2VETlNQcmVmZXRjaENvbnRyb2xIZWFkZXIoY29udGVudCk7Cisg
ICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoZXF1aXYsICJ4LWZyYW1lLW9wdGlvbnMiKSkg
eworICAgICAgICBpZiAoZnJhbWUpIHsKKyAgICAgICAgICAgIEZyYW1lTG9hZGVyKiBmcmFtZUxv
YWRlciA9IGZyYW1lLT5sb2FkZXIoKTsKKyAgICAgICAgICAgIGlmIChmcmFtZUxvYWRlci0+c2hv
dWxkSW50ZXJydXB0TG9hZEZvclhGcmFtZU9wdGlvbnMoY29udGVudCwgdXJsKCkpKSB7CisgICAg
ICAgICAgICAgICAgZnJhbWVMb2FkZXItPnN0b3BBbGxMb2FkZXJzKCk7CisgICAgICAgICAgICAg
ICAgZnJhbWUtPm5hdmlnYXRpb25TY2hlZHVsZXIoKS0+c2NoZWR1bGVMb2NhdGlvbkNoYW5nZShz
ZWN1cml0eU9yaWdpbigpLCBibGFua1VSTCgpLCBTdHJpbmcoKSk7CisKKyAgICAgICAgICAgICAg
ICBERUZJTkVfU1RBVElDX0xPQ0FMKFN0cmluZywgY29uc29sZU1lc3NhZ2UsIChBU0NJSUxpdGVy
YWwoIlJlZnVzZWQgdG8gZGlzcGxheSBkb2N1bWVudCBiZWNhdXNlIGRpc3BsYXkgZm9yYmlkZGVu
IGJ5IFgtRnJhbWUtT3B0aW9ucy5cbiIpKSk7CisgICAgICAgICAgICAgICAgYWRkQ29uc29sZU1l
c3NhZ2UoSlNNZXNzYWdlU291cmNlLCBMb2dNZXNzYWdlVHlwZSwgRXJyb3JNZXNzYWdlTGV2ZWws
IGNvbnNvbGVNZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBp
ZiAoZXF1YWxJZ25vcmluZ0Nhc2UoZXF1aXYsICJ4LXdlYmtpdC1jc3AiKSkKKyAgICAgICAgY29u
dGVudFNlY3VyaXR5UG9saWN5KCktPmRpZFJlY2VpdmVIZWFkZXIoY29udGVudCwgQ29udGVudFNl
Y3VyaXR5UG9saWN5OjpFbmZvcmNlUG9saWN5KTsKKyAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5n
Q2FzZShlcXVpdiwgIngtd2Via2l0LWNzcC1yZXBvcnQtb25seSIpKQorICAgICAgICBjb250ZW50
U2VjdXJpdHlQb2xpY3koKS0+ZGlkUmVjZWl2ZUhlYWRlcihjb250ZW50LCBDb250ZW50U2VjdXJp
dHlQb2xpY3k6OlJlcG9ydE9ubHkpOworfQorCisvLyBUaG91Z2ggaXNzcGFjZSgpIGNvbnNpZGVy
cyBcdCBhbmQgXHYgdG8gYmUgd2hpdGVzcGFjZSwgV2luIElFIGRvZXNuJ3QuCitzdGF0aWMgYm9v
bCBpc1NlcGFyYXRvcihVQ2hhciBjKQoreworICAgIHJldHVybiBjID09ICcgJyB8fCBjID09ICdc
dCcgfHwgYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJyB8fCBjID09ICc9JyB8fCBjID09ICcsJyB8fCBj
ID09ICdcMCc7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnByb2Nlc3NBcmd1bWVudHMoY29uc3QgU3Ry
aW5nJiBmZWF0dXJlcywgdm9pZCogZGF0YSwgQXJndW1lbnRzQ2FsbGJhY2sgY2FsbGJhY2spCit7
CisgICAgLy8gVHJlYWQgbGlnaHRseSBpbiB0aGlzIGNvZGUgLS0gaXQgd2FzIHNwZWNpZmljYWxs
eSBkZXNpZ25lZCB0byBtaW1pYyBXaW4gSUUncyBwYXJzaW5nIGJlaGF2aW9yLgorICAgIGludCBr
ZXlCZWdpbiwga2V5RW5kOworICAgIGludCB2YWx1ZUJlZ2luLCB2YWx1ZUVuZDsKKworICAgIGlu
dCBpID0gMDsKKyAgICBpbnQgbGVuZ3RoID0gZmVhdHVyZXMubGVuZ3RoKCk7CisgICAgU3RyaW5n
IGJ1ZmZlciA9IGZlYXR1cmVzLmxvd2VyKCk7CisgICAgd2hpbGUgKGkgPCBsZW5ndGgpIHsKKyAg
ICAgICAgLy8gc2tpcCB0byBmaXJzdCBub24tc2VwYXJhdG9yLCBidXQgZG9uJ3Qgc2tpcCBwYXN0
IHRoZSBlbmQgb2YgdGhlIHN0cmluZworICAgICAgICB3aGlsZSAoaXNTZXBhcmF0b3IoYnVmZmVy
W2ldKSkgeworICAgICAgICAgICAgaWYgKGkgPj0gbGVuZ3RoKQorICAgICAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgICAgIGtleUJlZ2luID0gaTsK
KworICAgICAgICAvLyBza2lwIHRvIGZpcnN0IHNlcGFyYXRvcgorICAgICAgICB3aGlsZSAoIWlz
U2VwYXJhdG9yKGJ1ZmZlcltpXSkpCisgICAgICAgICAgICBpKys7CisgICAgICAgIGtleUVuZCA9
IGk7CisKKyAgICAgICAgLy8gc2tpcCB0byBmaXJzdCAnPScsIGJ1dCBkb24ndCBza2lwIHBhc3Qg
YSAnLCcgb3IgdGhlIGVuZCBvZiB0aGUgc3RyaW5nCisgICAgICAgIHdoaWxlIChidWZmZXJbaV0g
IT0gJz0nKSB7CisgICAgICAgICAgICBpZiAoYnVmZmVyW2ldID09ICcsJyB8fCBpID49IGxlbmd0
aCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQor
CisgICAgICAgIC8vIHNraXAgdG8gZmlyc3Qgbm9uLXNlcGFyYXRvciwgYnV0IGRvbid0IHNraXAg
cGFzdCBhICcsJyBvciB0aGUgZW5kIG9mIHRoZSBzdHJpbmcKKyAgICAgICAgd2hpbGUgKGlzU2Vw
YXJhdG9yKGJ1ZmZlcltpXSkpIHsKKyAgICAgICAgICAgIGlmIChidWZmZXJbaV0gPT0gJywnIHx8
IGkgPj0gbGVuZ3RoKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaSsrOwor
ICAgICAgICB9CisgICAgICAgIHZhbHVlQmVnaW4gPSBpOworCisgICAgICAgIC8vIHNraXAgdG8g
Zmlyc3Qgc2VwYXJhdG9yCisgICAgICAgIHdoaWxlICghaXNTZXBhcmF0b3IoYnVmZmVyW2ldKSkK
KyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgdmFsdWVFbmQgPSBpOworCisgICAgICAgIEFTU0VS
VChpIDw9IGxlbmd0aCk7CisKKyAgICAgICAgU3RyaW5nIGtleVN0cmluZyA9IGJ1ZmZlci5zdWJz
dHJpbmcoa2V5QmVnaW4sIGtleUVuZCAtIGtleUJlZ2luKTsKKyAgICAgICAgU3RyaW5nIHZhbHVl
U3RyaW5nID0gYnVmZmVyLnN1YnN0cmluZyh2YWx1ZUJlZ2luLCB2YWx1ZUVuZCAtIHZhbHVlQmVn
aW4pOworICAgICAgICBjYWxsYmFjayhrZXlTdHJpbmcsIHZhbHVlU3RyaW5nLCB0aGlzLCBkYXRh
KTsKKyAgICB9Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnByb2Nlc3NWaWV3cG9ydChjb25zdCBTdHJp
bmcmIGZlYXR1cmVzLCBWaWV3cG9ydEFyZ3VtZW50czo6VHlwZSBvcmlnaW4pCit7CisgICAgQVNT
RVJUKCFmZWF0dXJlcy5pc051bGwoKSk7CisKKyAgICBpZiAob3JpZ2luIDwgbV92aWV3cG9ydEFy
Z3VtZW50cy50eXBlKQorICAgICAgICByZXR1cm47CisKKyAgICBtX3ZpZXdwb3J0QXJndW1lbnRz
ID0gVmlld3BvcnRBcmd1bWVudHMob3JpZ2luKTsKKyAgICBwcm9jZXNzQXJndW1lbnRzKGZlYXR1
cmVzLCAodm9pZCopJm1fdmlld3BvcnRBcmd1bWVudHMsICZzZXRWaWV3cG9ydEZlYXR1cmUpOwor
CisgICAgdXBkYXRlVmlld3BvcnRBcmd1bWVudHMoKTsKK30KKwordm9pZCBEb2N1bWVudDo6dXBk
YXRlVmlld3BvcnRBcmd1bWVudHMoKQoreworICAgIGlmIChwYWdlKCkgJiYgcGFnZSgpLT5tYWlu
RnJhbWUoKSA9PSBmcmFtZSgpKSB7CisjaWZuZGVmIE5ERUJVRworICAgICAgICBtX2RpZERpc3Bh
dGNoVmlld3BvcnRQcm9wZXJ0aWVzQ2hhbmdlZCA9IHRydWU7CisjZW5kaWYKKyAgICAgICAgcGFn
ZSgpLT5jaHJvbWUoKS0+ZGlzcGF0Y2hWaWV3cG9ydFByb3BlcnRpZXNEaWRDaGFuZ2UobV92aWV3
cG9ydEFyZ3VtZW50cyk7CisgICAgfQorfQorCit2b2lkIERvY3VtZW50Ojpwcm9jZXNzUmVmZXJy
ZXJQb2xpY3koY29uc3QgU3RyaW5nJiBwb2xpY3kpCit7CisgICAgQVNTRVJUKCFwb2xpY3kuaXNO
dWxsKCkpOworCisgICAgbV9yZWZlcnJlclBvbGljeSA9IFJlZmVycmVyUG9saWN5RGVmYXVsdDsK
KworICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZShwb2xpY3ksICJuZXZlciIpKQorICAgICAgICBt
X3JlZmVycmVyUG9saWN5ID0gUmVmZXJyZXJQb2xpY3lOZXZlcjsKKyAgICBlbHNlIGlmIChlcXVh
bElnbm9yaW5nQ2FzZShwb2xpY3ksICJhbHdheXMiKSkKKyAgICAgICAgbV9yZWZlcnJlclBvbGlj
eSA9IFJlZmVycmVyUG9saWN5QWx3YXlzOworICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNl
KHBvbGljeSwgIm9yaWdpbiIpKQorICAgICAgICBtX3JlZmVycmVyUG9saWN5ID0gUmVmZXJyZXJQ
b2xpY3lPcmlnaW47Cit9CisKK01vdXNlRXZlbnRXaXRoSGl0VGVzdFJlc3VsdHMgRG9jdW1lbnQ6
OnByZXBhcmVNb3VzZUV2ZW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiByZXF1ZXN0LCBjb25zdCBM
YXlvdXRQb2ludCYgZG9jdW1lbnRQb2ludCwgY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBldmVu
dCkKK3sKKyAgICBBU1NFUlQoIXJlbmRlcmVyKCkgfHwgcmVuZGVyZXIoKS0+aXNSZW5kZXJWaWV3
KCkpOworCisgICAgaWYgKCFyZW5kZXJlcigpKQorICAgICAgICByZXR1cm4gTW91c2VFdmVudFdp
dGhIaXRUZXN0UmVzdWx0cyhldmVudCwgSGl0VGVzdFJlc3VsdChMYXlvdXRQb2ludCgpKSk7CisK
KyAgICBIaXRUZXN0UmVzdWx0IHJlc3VsdChkb2N1bWVudFBvaW50KTsKKyAgICByZW5kZXJWaWV3
KCktPmhpdFRlc3QocmVxdWVzdCwgcmVzdWx0KTsKKworICAgIGlmICghcmVxdWVzdC5yZWFkT25s
eSgpKQorICAgICAgICB1cGRhdGVTdHlsZUlmTmVlZGVkKCk7CisKKyAgICByZXR1cm4gTW91c2VF
dmVudFdpdGhIaXRUZXN0UmVzdWx0cyhldmVudCwgcmVzdWx0KTsKK30KKworLy8gRE9NIFNlY3Rp
b24gMS4xLjEKK2Jvb2wgRG9jdW1lbnQ6OmNoaWxkVHlwZUFsbG93ZWQoTm9kZVR5cGUgdHlwZSkg
Y29uc3QKK3sKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEFUVFJJQlVURV9OT0RFOgor
ICAgIGNhc2UgQ0RBVEFfU0VDVElPTl9OT0RFOgorICAgIGNhc2UgRE9DVU1FTlRfRlJBR01FTlRf
Tk9ERToKKyAgICBjYXNlIERPQ1VNRU5UX05PREU6CisgICAgY2FzZSBFTlRJVFlfTk9ERToKKyAg
ICBjYXNlIEVOVElUWV9SRUZFUkVOQ0VfTk9ERToKKyAgICBjYXNlIE5PVEFUSU9OX05PREU6Cisg
ICAgY2FzZSBURVhUX05PREU6CisgICAgY2FzZSBYUEFUSF9OQU1FU1BBQ0VfTk9ERToKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgIGNhc2UgQ09NTUVOVF9OT0RFOgorICAgIGNhc2UgUFJPQ0VT
U0lOR19JTlNUUlVDVElPTl9OT0RFOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlIERP
Q1VNRU5UX1RZUEVfTk9ERToKKyAgICBjYXNlIEVMRU1FTlRfTk9ERToKKyAgICAgICAgLy8gRG9j
dW1lbnRzIG1heSBjb250YWluIG5vIG1vcmUgdGhhbiBvbmUgb2YgZWFjaCBvZiB0aGVzZS4KKyAg
ICAgICAgLy8gKE9uZSBFbGVtZW50IGFuZCBvbmUgRG9jdW1lbnRUeXBlLikKKyAgICAgICAgZm9y
IChOb2RlKiBjID0gZmlyc3RDaGlsZCgpOyBjOyBjID0gYy0+bmV4dFNpYmxpbmcoKSkKKyAgICAg
ICAgICAgIGlmIChjLT5ub2RlVHlwZSgpID09IHR5cGUpCisgICAgICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOwor
fQorCitib29sIERvY3VtZW50OjpjYW5SZXBsYWNlQ2hpbGQoTm9kZSogbmV3Q2hpbGQsIE5vZGUq
IG9sZENoaWxkKQoreworICAgIGlmICghb2xkQ2hpbGQpCisgICAgICAgIC8vIENvbnRhaW5lck5v
ZGU6OnJlcGxhY2VDaGlsZCB3aWxsIHJhaXNlIGEgTk9UX0ZPVU5EX0VSUi4KKyAgICAgICAgcmV0
dXJuIHRydWU7CisKKyAgICBpZiAob2xkQ2hpbGQtPm5vZGVUeXBlKCkgPT0gbmV3Q2hpbGQtPm5v
ZGVUeXBlKCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgaW50IG51bURvY3R5cGVzID0g
MDsKKyAgICBpbnQgbnVtRWxlbWVudHMgPSAwOworCisgICAgLy8gRmlyc3QsIGNoZWNrIGhvdyBt
YW55IGRvY3R5cGVzIGFuZCBlbGVtZW50cyB3ZSBoYXZlLCBub3QgY291bnRpbmcKKyAgICAvLyB0
aGUgY2hpbGQgd2UncmUgYWJvdXQgdG8gcmVtb3ZlLgorICAgIGZvciAoTm9kZSogYyA9IGZpcnN0
Q2hpbGQoKTsgYzsgYyA9IGMtPm5leHRTaWJsaW5nKCkpIHsKKyAgICAgICAgaWYgKGMgPT0gb2xk
Q2hpbGQpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgCisgICAgICAgIHN3aXRjaCAo
Yy0+bm9kZVR5cGUoKSkgeworICAgICAgICBjYXNlIERPQ1VNRU5UX1RZUEVfTk9ERToKKyAgICAg
ICAgICAgIG51bURvY3R5cGVzKys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBF
TEVNRU5UX05PREU6CisgICAgICAgICAgICBudW1FbGVtZW50cysrOworICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAg
IH0KKyAgICAKKyAgICAvLyBUaGVuLCBzZWUgaG93IG1hbnkgZG9jdHlwZXMgYW5kIGVsZW1lbnRz
IG1pZ2h0IGJlIGFkZGVkIGJ5IHRoZSBuZXcgY2hpbGQuCisgICAgaWYgKG5ld0NoaWxkLT5ub2Rl
VHlwZSgpID09IERPQ1VNRU5UX0ZSQUdNRU5UX05PREUpIHsKKyAgICAgICAgZm9yIChOb2RlKiBj
ID0gbmV3Q2hpbGQtPmZpcnN0Q2hpbGQoKTsgYzsgYyA9IGMtPm5leHRTaWJsaW5nKCkpIHsKKyAg
ICAgICAgICAgIHN3aXRjaCAoYy0+bm9kZVR5cGUoKSkgeworICAgICAgICAgICAgY2FzZSBBVFRS
SUJVVEVfTk9ERToKKyAgICAgICAgICAgIGNhc2UgQ0RBVEFfU0VDVElPTl9OT0RFOgorICAgICAg
ICAgICAgY2FzZSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFOgorICAgICAgICAgICAgY2FzZSBET0NV
TUVOVF9OT0RFOgorICAgICAgICAgICAgY2FzZSBFTlRJVFlfTk9ERToKKyAgICAgICAgICAgIGNh
c2UgRU5USVRZX1JFRkVSRU5DRV9OT0RFOgorICAgICAgICAgICAgY2FzZSBOT1RBVElPTl9OT0RF
OgorICAgICAgICAgICAgY2FzZSBURVhUX05PREU6CisgICAgICAgICAgICBjYXNlIFhQQVRIX05B
TUVTUEFDRV9OT0RFOgorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAg
IGNhc2UgQ09NTUVOVF9OT0RFOgorICAgICAgICAgICAgY2FzZSBQUk9DRVNTSU5HX0lOU1RSVUNU
SU9OX05PREU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERPQ1VN
RU5UX1RZUEVfTk9ERToKKyAgICAgICAgICAgICAgICBudW1Eb2N0eXBlcysrOworICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFTEVNRU5UX05PREU6CisgICAgICAgICAg
ICAgICAgbnVtRWxlbWVudHMrKzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAobmV3Q2hpbGQtPm5v
ZGVUeXBlKCkpIHsKKyAgICAgICAgY2FzZSBBVFRSSUJVVEVfTk9ERToKKyAgICAgICAgY2FzZSBD
REFUQV9TRUNUSU9OX05PREU6CisgICAgICAgIGNhc2UgRE9DVU1FTlRfRlJBR01FTlRfTk9ERToK
KyAgICAgICAgY2FzZSBET0NVTUVOVF9OT0RFOgorICAgICAgICBjYXNlIEVOVElUWV9OT0RFOgor
ICAgICAgICBjYXNlIEVOVElUWV9SRUZFUkVOQ0VfTk9ERToKKyAgICAgICAgY2FzZSBOT1RBVElP
Tl9OT0RFOgorICAgICAgICBjYXNlIFRFWFRfTk9ERToKKyAgICAgICAgY2FzZSBYUEFUSF9OQU1F
U1BBQ0VfTk9ERToKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgY2FzZSBDT01N
RU5UX05PREU6CisgICAgICAgIGNhc2UgUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFOgorICAg
ICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgRE9DVU1FTlRfVFlQRV9OT0RFOgor
ICAgICAgICAgICAgbnVtRG9jdHlwZXMrKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBj
YXNlIEVMRU1FTlRfTk9ERToKKyAgICAgICAgICAgIG51bUVsZW1lbnRzKys7CisgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgfSAgICAgICAgICAgICAgICAKKyAgICB9CisgICAgICAgIAorICAg
IGlmIChudW1FbGVtZW50cyA+IDEgfHwgbnVtRG9jdHlwZXMgPiAxKQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgCisgICAgcmV0dXJuIHRydWU7Cit9CisKK1Bhc3NSZWZQdHI8Tm9kZT4gRG9j
dW1lbnQ6OmNsb25lTm9kZShib29sIC8qZGVlcCovKQoreworICAgIC8vIFNwZWMgc2F5cyBjbG9u
aW5nIERvY3VtZW50IG5vZGVzIGlzICJpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQiCisgICAgLy8g
c28gd2UgZG8gbm90IHN1cHBvcnQgaXQuLi4KKyAgICByZXR1cm4gMDsKK30KKworU3R5bGVTaGVl
dExpc3QqIERvY3VtZW50OjpzdHlsZVNoZWV0cygpCit7CisgICAgcmV0dXJuIG1fc3R5bGVTaGVl
dHMuZ2V0KCk7Cit9CisKK1N0cmluZyBEb2N1bWVudDo6cHJlZmVycmVkU3R5bGVzaGVldFNldCgp
IGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcHJlZmVycmVkU3R5bGVzaGVldFNldDsKK30KKworU3Ry
aW5nIERvY3VtZW50OjpzZWxlY3RlZFN0eWxlc2hlZXRTZXQoKSBjb25zdAoreworICAgIHJldHVy
biBtX3NlbGVjdGVkU3R5bGVzaGVldFNldDsKK30KKwordm9pZCBEb2N1bWVudDo6c2V0U2VsZWN0
ZWRTdHlsZXNoZWV0U2V0KGNvbnN0IFN0cmluZyYgYVN0cmluZykKK3sKKyAgICBtX3NlbGVjdGVk
U3R5bGVzaGVldFNldCA9IGFTdHJpbmc7CisgICAgc3R5bGVSZXNvbHZlckNoYW5nZWQoRGVmZXJS
ZWNhbGNTdHlsZSk7Cit9CisKKy8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuZXZlciBhIHRv
cC1sZXZlbCBzdHlsZXNoZWV0IGhhcyBmaW5pc2hlZCBsb2FkaW5nLgordm9pZCBEb2N1bWVudDo6
cmVtb3ZlUGVuZGluZ1NoZWV0KFJlbW92ZVBlbmRpbmdTaGVldE5vdGlmaWNhdGlvblR5cGUgbm90
aWZpY2F0aW9uKQoreworICAgIC8vIE1ha2Ugc3VyZSB3ZSBrbmV3IHRoaXMgc2hlZXQgd2FzIHBl
bmRpbmcsIGFuZCB0aGF0IG91ciBjb3VudCBpc24ndCBvdXQgb2Ygc3luYy4KKyAgICBBU1NFUlQo
bV9wZW5kaW5nU3R5bGVzaGVldHMgPiAwKTsKKworICAgIG1fcGVuZGluZ1N0eWxlc2hlZXRzLS07
CisgICAgCisjaWZkZWYgSU5TVFJVTUVOVF9MQVlPVVRfU0NIRURVTElORworICAgIGlmICghb3du
ZXJFbGVtZW50KCkpCisgICAgICAgIHByaW50ZigiU3R5bGVzaGVldCBsb2FkZWQgYXQgdGltZSAl
ZC4gJWQgc3R5bGVzaGVldHMgc3RpbGwgcmVtYWluLlxuIiwgZWxhcHNlZFRpbWUoKSwgbV9wZW5k
aW5nU3R5bGVzaGVldHMpOworI2VuZGlmCisKKyAgICBpZiAobV9wZW5kaW5nU3R5bGVzaGVldHMp
CisgICAgICAgIHJldHVybjsKKworICAgIGlmIChub3RpZmljYXRpb24gPT0gUmVtb3ZlUGVuZGlu
Z1NoZWV0Tm90aWZ5TGF0ZXIpIHsKKyAgICAgICAgc2V0TmVlZHNOb3RpZnlSZW1vdmVBbGxQZW5k
aW5nU3R5bGVzaGVldCgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIGRpZFJl
bW92ZUFsbFBlbmRpbmdTdHlsZXNoZWV0KCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmRpZFJlbW92
ZUFsbFBlbmRpbmdTdHlsZXNoZWV0KCkKK3sKKyAgICBtX25lZWRzTm90aWZ5UmVtb3ZlQWxsUGVu
ZGluZ1N0eWxlc2hlZXQgPSBmYWxzZTsKKworICAgIHN0eWxlUmVzb2x2ZXJDaGFuZ2VkKFJlY2Fs
Y1N0eWxlSWZOZWVkZWQpOworCisgICAgaWYgKFNjcmlwdGFibGVEb2N1bWVudFBhcnNlciogcGFy
c2VyID0gc2NyaXB0YWJsZURvY3VtZW50UGFyc2VyKCkpCisgICAgICAgIHBhcnNlci0+ZXhlY3V0
ZVNjcmlwdHNXYWl0aW5nRm9yU3R5bGVzaGVldHMoKTsKKworICAgIGlmIChtX2dvdG9BbmNob3JO
ZWVkZWRBZnRlclN0eWxlc2hlZXRzTG9hZCAmJiB2aWV3KCkpCisgICAgICAgIHZpZXcoKS0+c2Ny
b2xsVG9GcmFnbWVudChtX3VybCk7Cit9CisKKwordm9pZCBEb2N1bWVudDo6ZXZhbHVhdGVNZWRp
YVF1ZXJ5TGlzdCgpCit7CisgICAgaWYgKG1fbWVkaWFRdWVyeU1hdGNoZXIpCisgICAgICAgIG1f
bWVkaWFRdWVyeU1hdGNoZXItPnN0eWxlUmVzb2x2ZXJDaGFuZ2VkKCk7Cit9CisKK3ZvaWQgRG9j
dW1lbnQ6OnN0eWxlUmVzb2x2ZXJDaGFuZ2VkKFN0eWxlUmVzb2x2ZXJVcGRhdGVGbGFnIHVwZGF0
ZUZsYWcpCit7CisgICAgLy8gRG9uJ3QgYm90aGVyIHVwZGF0aW5nLCBzaW5jZSB3ZSBoYXZlbid0
IGxvYWRlZCBhbGwgb3VyIHN0eWxlIGluZm8geWV0CisgICAgLy8gYW5kIGhhdmVuJ3QgY2FsY3Vs
YXRlZCB0aGUgc3R5bGUgc2VsZWN0b3IgZm9yIHRoZSBmaXJzdCB0aW1lLgorICAgIGlmICghYXR0
YWNoZWQoKSB8fCAoIW1fZGlkQ2FsY3VsYXRlU3R5bGVSZXNvbHZlciAmJiAhaGF2ZVN0eWxlc2hl
ZXRzTG9hZGVkKCkpKSB7CisgICAgICAgIG1fc3R5bGVSZXNvbHZlci5jbGVhcigpOworICAgICAg
ICByZXR1cm47CisgICAgfQorCisjaWZkZWYgSU5TVFJVTUVOVF9MQVlPVVRfU0NIRURVTElORwor
ICAgIGlmICghb3duZXJFbGVtZW50KCkpCisgICAgICAgIHByaW50ZigiQmVnaW5uaW5nIHVwZGF0
ZSBvZiBzdHlsZSBzZWxlY3RvciBhdCB0aW1lICVkLlxuIiwgZWxhcHNlZFRpbWUoKSk7CisjZW5k
aWYKKworICAgIGJvb2wgc3R5bGVzaGVldENoYW5nZVJlcXVpcmVzU3R5bGVSZWNhbGMgPSB1cGRh
dGVBY3RpdmVTdHlsZXNoZWV0cyh1cGRhdGVGbGFnKTsKKworICAgIGlmICh1cGRhdGVGbGFnID09
IERlZmVyUmVjYWxjU3R5bGUpIHsKKyAgICAgICAgc2NoZWR1bGVGb3JjZWRTdHlsZVJlY2FsYygp
OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGRpZExheW91dFdpdGhQZW5kaW5n
U3R5bGVzaGVldHMoKSAmJiBtX3BlbmRpbmdTdHlsZXNoZWV0cyA8PSAwKSB7CisgICAgICAgIG1f
cGVuZGluZ1NoZWV0TGF5b3V0ID0gSWdub3JlTGF5b3V0V2l0aFBlbmRpbmdTaGVldHM7CisgICAg
ICAgIGlmIChyZW5kZXJlcigpKQorICAgICAgICAgICAgcmVuZGVyZXIoKS0+cmVwYWludCgpOwor
ICAgIH0KKworICAgIGlmICghc3R5bGVzaGVldENoYW5nZVJlcXVpcmVzU3R5bGVSZWNhbGMpCisg
ICAgICAgIHJldHVybjsKKworICAgIC8vIFRoaXMgcmVjYWxjU3R5bGUgaW5pdGlhdGVzIGEgbmV3
IHJlY2FsYyBjeWNsZS4gV2UgbmVlZCB0byBicmFja2V0IGl0IHRvCisgICAgLy8gbWFrZSBzdXJl
IGFuaW1hdGlvbnMgZ2V0IHRoZSBjb3JyZWN0IHVwZGF0ZSB0aW1lCisgICAgeworICAgICAgICBB
bmltYXRpb25VcGRhdGVCbG9jayBhbmltYXRpb25VcGRhdGVCbG9jayhtX2ZyYW1lID8gbV9mcmFt
ZS0+YW5pbWF0aW9uKCkgOiAwKTsKKyAgICAgICAgcmVjYWxjU3R5bGUoRm9yY2UpOworICAgIH0K
KworI2lmZGVmIElOU1RSVU1FTlRfTEFZT1VUX1NDSEVEVUxJTkcKKyAgICBpZiAoIW93bmVyRWxl
bWVudCgpKQorICAgICAgICBwcmludGYoIkZpbmlzaGVkIHVwZGF0ZSBvZiBzdHlsZSBzZWxlY3Rv
ciBhdCB0aW1lICVkXG4iLCBlbGFwc2VkVGltZSgpKTsKKyNlbmRpZgorCisgICAgaWYgKHJlbmRl
cmVyKCkpIHsKKyAgICAgICAgcmVuZGVyZXIoKS0+c2V0TmVlZHNMYXlvdXRBbmRQcmVmV2lkdGhz
UmVjYWxjKCk7CisgICAgICAgIGlmICh2aWV3KCkpCisgICAgICAgICAgICB2aWV3KCktPnNjaGVk
dWxlUmVsYXlvdXQoKTsKKyAgICB9CisKKyAgICBldmFsdWF0ZU1lZGlhUXVlcnlMaXN0KCk7Cit9
CisKK3ZvaWQgRG9jdW1lbnQ6OmFkZFN0eWxlU2hlZXRDYW5kaWRhdGVOb2RlKE5vZGUqIG5vZGUs
IGJvb2wgY3JlYXRlZEJ5UGFyc2VyKQoreworICAgIGlmICghbm9kZS0+aW5Eb2N1bWVudCgpKQor
ICAgICAgICByZXR1cm47CisgICAgCisgICAgLy8gVW50aWwgdGhlIDxib2R5PiBleGlzdHMsIHdl
IGhhdmUgbm8gY2hvaWNlIGJ1dCB0byBjb21wYXJlIGRvY3VtZW50IHBvc2l0aW9ucywKKyAgICAv
LyBzaW5jZSBzdHlsZXMgb3V0c2lkZSBvZiB0aGUgYm9keSBhbmQgaGVhZCBjb250aW51ZSB0byBi
ZSBzaHVudGVkIGludG8gdGhlIGhlYWQKKyAgICAvLyAoYW5kIHRodXMgY2FuIHNoaWZ0IHRvIGVu
ZCB1cCBiZWZvcmUgZHluYW1pY2FsbHkgYWRkZWQgRE9NIGNvbnRlbnQgdGhhdCBpcyBhbHNvCisg
ICAgLy8gb3V0c2lkZSB0aGUgYm9keSkuCisgICAgaWYgKChjcmVhdGVkQnlQYXJzZXIgJiYgYm9k
eSgpKSB8fCBtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAg
bV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMuYWRkKG5vZGUpOworICAgICAgICByZXR1cm47Cisg
ICAgfQorCisgICAgLy8gRGV0ZXJtaW5lIGFuIGFwcHJvcHJpYXRlIGluc2VydGlvbiBwb2ludC4K
KyAgICBTdHlsZVNoZWV0Q2FuZGlkYXRlTGlzdEhhc2hTZXQ6Oml0ZXJhdG9yIGJlZ2luID0gbV9z
dHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMuYmVnaW4oKTsKKyAgICBTdHlsZVNoZWV0Q2FuZGlkYXRl
TGlzdEhhc2hTZXQ6Oml0ZXJhdG9yIGVuZCA9IG1fc3R5bGVTaGVldENhbmRpZGF0ZU5vZGVzLmVu
ZCgpOworICAgIFN0eWxlU2hlZXRDYW5kaWRhdGVMaXN0SGFzaFNldDo6aXRlcmF0b3IgaXQgPSBl
bmQ7CisgICAgTm9kZSogZm9sbG93aW5nTm9kZSA9IDA7CisgICAgZG8geworICAgICAgICAtLWl0
OworICAgICAgICBOb2RlKiBuID0gKml0OworICAgICAgICB1bnNpZ25lZCBzaG9ydCBwb3NpdGlv
biA9IG4tPmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKG5vZGUpOworICAgICAgICBpZiAocG9zaXRp
b24gPT0gRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HKSB7CisgICAgICAgICAgICBtX3N0eWxl
U2hlZXRDYW5kaWRhdGVOb2Rlcy5pbnNlcnRCZWZvcmUoZm9sbG93aW5nTm9kZSwgbm9kZSk7Cisg
ICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZm9sbG93aW5nTm9kZSA9IG47
CisgICAgfSB3aGlsZSAoaXQgIT0gYmVnaW4pOworICAgIAorICAgIG1fc3R5bGVTaGVldENhbmRp
ZGF0ZU5vZGVzLmluc2VydEJlZm9yZShmb2xsb3dpbmdOb2RlLCBub2RlKTsKK30KKwordm9pZCBE
b2N1bWVudDo6cmVtb3ZlU3R5bGVTaGVldENhbmRpZGF0ZU5vZGUoTm9kZSogbm9kZSkKK3sKKyAg
ICBtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcy5yZW1vdmUobm9kZSk7Cit9CisKK3ZvaWQgRG9j
dW1lbnQ6OmNvbGxlY3RBY3RpdmVTdHlsZXNoZWV0cyhWZWN0b3I8UmVmUHRyPFN0eWxlU2hlZXQ+
ID4mIHNoZWV0cykKK3sKKyAgICBpZiAoc2V0dGluZ3MoKSAmJiAhc2V0dGluZ3MoKS0+YXV0aG9y
QW5kVXNlclN0eWxlc0VuYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgU3R5bGVTaGVl
dENhbmRpZGF0ZUxpc3RIYXNoU2V0OjppdGVyYXRvciBiZWdpbiA9IG1fc3R5bGVTaGVldENhbmRp
ZGF0ZU5vZGVzLmJlZ2luKCk7CisgICAgU3R5bGVTaGVldENhbmRpZGF0ZUxpc3RIYXNoU2V0Ojpp
dGVyYXRvciBlbmQgPSBtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcy5lbmQoKTsKKyAgICBmb3Ig
KFN0eWxlU2hlZXRDYW5kaWRhdGVMaXN0SGFzaFNldDo6aXRlcmF0b3IgaXQgPSBiZWdpbjsgaXQg
IT0gZW5kOyArK2l0KSB7CisgICAgICAgIE5vZGUqIG4gPSAqaXQ7CisgICAgICAgIFN0eWxlU2hl
ZXQqIHNoZWV0ID0gMDsKKyAgICAgICAgaWYgKG4tPm5vZGVUeXBlKCkgPT0gUFJPQ0VTU0lOR19J
TlNUUlVDVElPTl9OT0RFKSB7CisgICAgICAgICAgICAvLyBQcm9jZXNzaW5nIGluc3RydWN0aW9u
IChYTUwgZG9jdW1lbnRzIG9ubHkpLgorICAgICAgICAgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCBs
aW5raW5nIHRvIGVtYmVkZGVkIENTUyBzdHlsZXNoZWV0cywgc2VlIDxodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDkyODE+IGZvciBkaXNjdXNzaW9uLgorICAgICAgICAg
ICAgUHJvY2Vzc2luZ0luc3RydWN0aW9uKiBwaSA9IHN0YXRpY19jYXN0PFByb2Nlc3NpbmdJbnN0
cnVjdGlvbio+KG4pOworICAgICAgICAgICAgc2hlZXQgPSBwaS0+c2hlZXQoKTsKKyNpZiBFTkFC
TEUoWFNMVCkKKyAgICAgICAgICAgIC8vIERvbid0IGFwcGx5IFhTTCB0cmFuc2Zvcm1zIHRvIGFs
cmVhZHkgdHJhbnNmb3JtZWQgZG9jdW1lbnRzIC0tIDxyZGFyOi8vcHJvYmxlbS80MTMyODA2Pgor
ICAgICAgICAgICAgaWYgKHBpLT5pc1hTTCgpICYmICF0cmFuc2Zvcm1Tb3VyY2VEb2N1bWVudCgp
KSB7CisgICAgICAgICAgICAgICAgLy8gRG9uJ3QgYXBwbHkgWFNMIHRyYW5zZm9ybXMgdW50aWwg
bG9hZGluZyBpcyBmaW5pc2hlZC4KKyAgICAgICAgICAgICAgICBpZiAoIXBhcnNpbmcoKSkKKyAg
ICAgICAgICAgICAgICAgICAgYXBwbHlYU0xUcmFuc2Zvcm0ocGkpOworICAgICAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9IGVsc2UgaWYgKChuLT5p
c0hUTUxFbGVtZW50KCkgJiYgKG4tPmhhc1RhZ05hbWUobGlua1RhZykgfHwgbi0+aGFzVGFnTmFt
ZShzdHlsZVRhZykpKQorI2lmIEVOQUJMRShTVkcpCisgICAgICAgICAgICAgICAgICAgfHwgIChu
LT5pc1NWR0VsZW1lbnQoKSAmJiBuLT5oYXNUYWdOYW1lKFNWR05hbWVzOjpzdHlsZVRhZykpCisj
ZW5kaWYKKyAgICAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgIEVsZW1lbnQqIGUgPSBz
dGF0aWNfY2FzdDxFbGVtZW50Kj4obik7CisgICAgICAgICAgICBBdG9taWNTdHJpbmcgdGl0bGUg
PSBlLT5nZXRBdHRyaWJ1dGUodGl0bGVBdHRyKTsKKyAgICAgICAgICAgIGJvb2wgZW5hYmxlZFZp
YVNjcmlwdCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKGUtPmhhc0xvY2FsTmFtZShsaW5rVGFn
KSkgeworICAgICAgICAgICAgICAgIC8vIDxMSU5LPiBlbGVtZW50CisgICAgICAgICAgICAgICAg
SFRNTExpbmtFbGVtZW50KiBsaW5rRWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxMaW5rRWxlbWVu
dCo+KG4pOworICAgICAgICAgICAgICAgIGlmIChsaW5rRWxlbWVudC0+aXNEaXNhYmxlZCgpKQor
ICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBlbmFibGVkVmlh
U2NyaXB0ID0gbGlua0VsZW1lbnQtPmlzRW5hYmxlZFZpYVNjcmlwdCgpOworICAgICAgICAgICAg
ICAgIGlmIChsaW5rRWxlbWVudC0+c3R5bGVTaGVldElzTG9hZGluZygpKSB7CisgICAgICAgICAg
ICAgICAgICAgIC8vIGl0IGlzIGxvYWRpbmcgYnV0IHdlIHNob3VsZCBzdGlsbCBkZWNpZGUgd2hp
Y2ggc3R5bGUgc2hlZXQgc2V0IHRvIHVzZQorICAgICAgICAgICAgICAgICAgICBpZiAoIWVuYWJs
ZWRWaWFTY3JpcHQgJiYgIXRpdGxlLmlzRW1wdHkoKSAmJiBtX3ByZWZlcnJlZFN0eWxlc2hlZXRT
ZXQuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdG9taWNTdHJp
bmcmIHJlbCA9IGUtPmdldEF0dHJpYnV0ZShyZWxBdHRyKTsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGlmICghcmVsLmNvbnRhaW5zKCJhbHRlcm5hdGUiKSkgeworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIG1fcHJlZmVycmVkU3R5bGVzaGVldFNldCA9IHRpdGxlOworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIG1fc2VsZWN0ZWRTdHlsZXNoZWV0U2V0ID0gdGl0bGU7CisgICAgICAg
ICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg
ICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgh
bGlua0VsZW1lbnQtPnNoZWV0KCkpCisgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gbnVsbEF0
b207CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgcHJlZmVy
cmVkIHN0eWxlc2V0LiAgVGhpcyBpcyB0aGUKKyAgICAgICAgICAgIC8vIHNldCBvZiBzaGVldHMg
dGhhdCB3aWxsIGJlIGVuYWJsZWQuCisjaWYgRU5BQkxFKFNWRykKKyAgICAgICAgICAgIGlmIChu
LT5pc1NWR0VsZW1lbnQoKSAmJiBuLT5oYXNUYWdOYW1lKFNWR05hbWVzOjpzdHlsZVRhZykpCisg
ICAgICAgICAgICAgICAgc2hlZXQgPSBzdGF0aWNfY2FzdDxTVkdTdHlsZUVsZW1lbnQqPihuKS0+
c2hlZXQoKTsKKyAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgaWYgKGUtPmhh
c0xvY2FsTmFtZShsaW5rVGFnKSkKKyAgICAgICAgICAgICAgICBzaGVldCA9IHN0YXRpY19jYXN0
PEhUTUxMaW5rRWxlbWVudCo+KG4pLT5zaGVldCgpOworICAgICAgICAgICAgZWxzZQorICAgICAg
ICAgICAgICAgIC8vIDxTVFlMRT4gZWxlbWVudAorICAgICAgICAgICAgICAgIHNoZWV0ID0gc3Rh
dGljX2Nhc3Q8SFRNTFN0eWxlRWxlbWVudCo+KG4pLT5zaGVldCgpOworICAgICAgICAgICAgLy8g
Q2hlY2sgdG8gc2VlIGlmIHRoaXMgc2hlZXQgYmVsb25ncyB0byBhIHN0eWxlc2V0CisgICAgICAg
ICAgICAvLyAodGh1cyBtYWtpbmcgaXQgUFJFRkVSUkVEIG9yIEFMVEVSTkFURSByYXRoZXIgdGhh
bgorICAgICAgICAgICAgLy8gUEVSU0lTVEVOVCkuCisgICAgICAgICAgICBBdG9taWNTdHJpbmcg
cmVsID0gZS0+Z2V0QXR0cmlidXRlKHJlbEF0dHIpOworICAgICAgICAgICAgaWYgKCFlbmFibGVk
VmlhU2NyaXB0ICYmICF0aXRsZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBZZXMs
IHdlIGhhdmUgYSB0aXRsZS4KKyAgICAgICAgICAgICAgICBpZiAobV9wcmVmZXJyZWRTdHlsZXNo
ZWV0U2V0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBObyBwcmVmZXJyZWQg
c2V0IGhhcyBiZWVuIGVzdGFibGlzaGVkLiAgSWYKKyAgICAgICAgICAgICAgICAgICAgLy8gd2Ug
YXJlIE5PVCBhbiBhbHRlcm5hdGUgc2hlZXQsIHRoZW4gZXN0YWJsaXNoCisgICAgICAgICAgICAg
ICAgICAgIC8vIHVzIGFzIHRoZSBwcmVmZXJyZWQgc2V0LiAgT3RoZXJ3aXNlLCBqdXN0IGlnbm9y
ZQorICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHNoZWV0LgorICAgICAgICAgICAgICAgICAg
ICBpZiAoZS0+aGFzTG9jYWxOYW1lKHN0eWxlVGFnKSB8fCAhcmVsLmNvbnRhaW5zKCJhbHRlcm5h
dGUiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcHJlZmVycmVkU3R5bGVzaGVldFNldCA9
IG1fc2VsZWN0ZWRTdHlsZXNoZWV0U2V0ID0gdGl0bGU7CisgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgICAgIGlmICh0aXRsZSAhPSBtX3ByZWZlcnJlZFN0eWxlc2hlZXRTZXQpCisgICAg
ICAgICAgICAgICAgICAgIHNoZWV0ID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
aWYgKHJlbC5jb250YWlucygiYWx0ZXJuYXRlIikgJiYgdGl0bGUuaXNFbXB0eSgpKQorICAgICAg
ICAgICAgICAgIHNoZWV0ID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2hlZXQpCisgICAg
ICAgICAgICBzaGVldHMuYXBwZW5kKHNoZWV0KTsKKyAgICB9Cit9CisKK2Jvb2wgRG9jdW1lbnQ6
OnRlc3RBZGRlZFN0eWxlc2hlZXRSZXF1aXJlc1N0eWxlUmVjYWxjKFN0eWxlU2hlZXRDb250ZW50
cyogc3R5bGVzaGVldCkKK3sKKyAgICAvLyBTZWUgaWYgYWxsIHJ1bGVzIG9uIHRoZSBzaGVldCBh
cmUgc2NvcGVkIHRvIHNvbWUgc3BlY2lmaWMgaWRzIG9yIGNsYXNzZXMuCisgICAgLy8gVGhlbiB0
ZXN0IGlmIHdlIGFjdHVhbGx5IGhhdmUgYW55IG9mIHRob3NlIGluIHRoZSB0cmVlIGF0IHRoZSBt
b21lbnQuCisgICAgSGFzaFNldDxBdG9taWNTdHJpbmdJbXBsKj4gaWRTY29wZXM7IAorICAgIEhh
c2hTZXQ8QXRvbWljU3RyaW5nSW1wbCo+IGNsYXNzU2NvcGVzOworICAgIGlmICghU3R5bGVSZXNv
bHZlcjo6ZGV0ZXJtaW5lU3R5bGVzaGVldFNlbGVjdG9yU2NvcGVzKHN0eWxlc2hlZXQsIGlkU2Nv
cGVzLCBjbGFzc1Njb3BlcykpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIC8vIEludmFsaWRh
dGUgdGhlIHN1YnRyZWVzIHRoYXQgbWF0Y2ggdGhlIHNjb3Blcy4KKyAgICBOb2RlKiBub2RlID0g
Zmlyc3RDaGlsZCgpOworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIGlmICghbm9kZS0+aXNT
dHlsZWRFbGVtZW50KCkpIHsKKyAgICAgICAgICAgIG5vZGUgPSBub2RlLT50cmF2ZXJzZU5leHRO
b2RlKCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBTdHlsZWRF
bGVtZW50KiBlbGVtZW50ID0gc3RhdGljX2Nhc3Q8U3R5bGVkRWxlbWVudCo+KG5vZGUpOworICAg
ICAgICBpZiAoU2VsZWN0b3JDaGVja2VyOjplbGVtZW50TWF0Y2hlc1NlbGVjdG9yU2NvcGVzKGVs
ZW1lbnQsIGlkU2NvcGVzLCBjbGFzc1Njb3BlcykpIHsKKyAgICAgICAgICAgIGVsZW1lbnQtPnNl
dE5lZWRzU3R5bGVSZWNhbGMoKTsKKyAgICAgICAgICAgIC8vIFRoZSB3aG9sZSBzdWJ0cmVlIGlz
IG5vdyBpbnZhbGlkYXRlZCwgd2UgY2FuIHNraXAgdG8gdGhlIG5leHQgc2libGluZy4KKyAgICAg
ICAgICAgIG5vZGUgPSBub2RlLT50cmF2ZXJzZU5leHRTaWJsaW5nKCk7CisgICAgICAgICAgICBj
b250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBub2RlID0gbm9kZS0+dHJhdmVyc2VOZXh0Tm9k
ZSgpOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmFuYWx5
emVTdHlsZXNoZWV0Q2hhbmdlKFN0eWxlUmVzb2x2ZXJVcGRhdGVGbGFnIHVwZGF0ZUZsYWcsIGNv
bnN0IFZlY3RvcjxSZWZQdHI8U3R5bGVTaGVldD4gPiYgbmV3U3R5bGVzaGVldHMsIGJvb2wmIHJl
cXVpcmVzU3R5bGVSZXNvbHZlclJlc2V0LCBib29sJiByZXF1aXJlc0Z1bGxTdHlsZVJlY2FsYykK
K3sKKyAgICByZXF1aXJlc1N0eWxlUmVzb2x2ZXJSZXNldCA9IHRydWU7CisgICAgcmVxdWlyZXNG
dWxsU3R5bGVSZWNhbGMgPSB0cnVlOworICAgIAorICAgIC8vIFN0eWxlc2hlZXRzIG9mIDxzdHls
ZT4gZWxlbWVudHMgdGhhdCBAaW1wb3J0IHN0eWxlc2hlZXRzIGFyZSBhY3RpdmUgYnV0IGxvYWRp
bmcuIFdlIG5lZWQgdG8gdHJpZ2dlciBhIGZ1bGwgcmVjYWxjIHdoZW4gc3VjaCBsb2FkcyBhcmUg
ZG9uZS4KKyAgICBib29sIGhhc0FjdGl2ZUxvYWRpbmdTdHlsZXNoZWV0ID0gZmFsc2U7CisgICAg
dW5zaWduZWQgbmV3U3R5bGVzaGVldENvdW50ID0gbmV3U3R5bGVzaGVldHMuc2l6ZSgpOworICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuZXdTdHlsZXNoZWV0Q291bnQ7ICsraSkgeworICAg
ICAgICBpZiAobmV3U3R5bGVzaGVldHNbaV0tPmlzTG9hZGluZygpKQorICAgICAgICAgICAgaGFz
QWN0aXZlTG9hZGluZ1N0eWxlc2hlZXQgPSB0cnVlOworICAgIH0KKyAgICBpZiAobV9oYWRBY3Rp
dmVMb2FkaW5nU3R5bGVzaGVldCAmJiAhaGFzQWN0aXZlTG9hZGluZ1N0eWxlc2hlZXQpIHsKKyAg
ICAgICAgbV9oYWRBY3RpdmVMb2FkaW5nU3R5bGVzaGVldCA9IGZhbHNlOworICAgICAgICByZXR1
cm47CisgICAgfQorICAgIG1faGFkQWN0aXZlTG9hZGluZ1N0eWxlc2hlZXQgPSBoYXNBY3RpdmVM
b2FkaW5nU3R5bGVzaGVldDsKKworICAgIGlmICh1cGRhdGVGbGFnICE9IFJlY2FsY1N0eWxlSWZO
ZWVkZWQpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoIW1fc3R5bGVSZXNvbHZlcikKKyAgICAg
ICAgcmV0dXJuOworCisgICAgLy8gU2VlIGlmIHdlIGFyZSBqdXN0IGFkZGluZyBzdHlsZXNoZWV0
cy4KKyAgICB1bnNpZ25lZCBvbGRTdHlsZXNoZWV0Q291bnQgPSBtX3N0eWxlU2hlZXRzLT5sZW5n
dGgoKTsKKyAgICBpZiAobmV3U3R5bGVzaGVldENvdW50IDwgb2xkU3R5bGVzaGVldENvdW50KQor
ICAgICAgICByZXR1cm47CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG9sZFN0eWxlc2hl
ZXRDb3VudDsgKytpKSB7CisgICAgICAgIGlmIChtX3N0eWxlU2hlZXRzLT5pdGVtKGkpICE9IG5l
d1N0eWxlc2hlZXRzW2ldKQorICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICByZXF1aXJl
c1N0eWxlUmVzb2x2ZXJSZXNldCA9IGZhbHNlOworCisgICAgLy8gSWYgd2UgYXJlIGFscmVhZHkg
cGFyc2luZyB0aGUgYm9keSBhbmQgc28gbWF5IGhhdmUgc2lnbmlmaWNhbnQgYW1vdW50IG9mIGVs
ZW1lbnRzLCBwdXQgc29tZSBlZmZvcnQgaW50byB0cnlpbmcgdG8gYXZvaWQgc3R5bGUgcmVjYWxj
cy4KKyAgICBpZiAoIWJvZHkoKSB8fCBtX2hhc05vZGVzV2l0aFBsYWNlaG9sZGVyU3R5bGUpCisg
ICAgICAgIHJldHVybjsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSBvbGRTdHlsZXNoZWV0Q291bnQ7
IGkgPCBuZXdTdHlsZXNoZWV0Q291bnQ7ICsraSkgeworICAgICAgICBpZiAoIW5ld1N0eWxlc2hl
ZXRzW2ldLT5pc0NTU1N0eWxlU2hlZXQoKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
aWYgKG5ld1N0eWxlc2hlZXRzW2ldLT5kaXNhYmxlZCgpKQorICAgICAgICAgICAgY29udGludWU7
CisgICAgICAgIGlmICh0ZXN0QWRkZWRTdHlsZXNoZWV0UmVxdWlyZXNTdHlsZVJlY2FsYyhzdGF0
aWNfY2FzdDxDU1NTdHlsZVNoZWV0Kj4obmV3U3R5bGVzaGVldHNbaV0uZ2V0KCkpLT5jb250ZW50
cygpKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcmVxdWlyZXNGdWxsU3R5bGVS
ZWNhbGMgPSBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgc3R5bGVTaGVldHNVc2VSZW1Vbml0cyhj
b25zdCBWZWN0b3I8UmVmUHRyPFN0eWxlU2hlZXQ+ID4mIHNoZWV0cykKK3sKKyAgICBmb3IgKHVu
c2lnbmVkIGkgPSAwOyBpIDwgc2hlZXRzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmICghc2hl
ZXRzW2ldLT5pc0NTU1N0eWxlU2hlZXQoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAg
ICBpZiAoc3RhdGljX2Nhc3Q8Q1NTU3R5bGVTaGVldCo+KHNoZWV0c1tpXS5nZXQoKSktPmNvbnRl
bnRzKCktPnVzZXNSZW1Vbml0cygpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQor
ICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBEb2N1bWVudDo6bm90aWZ5U2VhbWxlc3NDaGls
ZERvY3VtZW50c09mU3R5bGVzaGVldFVwZGF0ZSgpIGNvbnN0Cit7CisgICAgLy8gSWYgd2UncmUg
bm90IGluIGEgZnJhbWUgeWV0IGFueSBwb3RlbnRpYWwgY2hpbGQgZG9jdW1lbnRzIHdvbid0IGhh
dmUgYSBTdHlsZVJlc29sdmVyIHRvIHVwZGF0ZS4KKyAgICBpZiAoIWZyYW1lKCkpCisgICAgICAg
IHJldHVybjsKKworICAgIC8vIFNlYW1sZXNzIGNoaWxkIGZyYW1lcyBhcmUgZXhwZWN0ZWQgdG8g
bm90aWZ5IHRoZWlyIHNlYW1sZXNzIGNoaWxkcmVuIHJlY3Vyc2l2ZWx5LCBzbyB3ZSBvbmx5IGRv
IGRpcmVjdCBjaGlsZHJlbi4KKyAgICBmb3IgKEZyYW1lKiBjaGlsZCA9IGZyYW1lKCktPnRyZWUo
KS0+Zmlyc3RDaGlsZCgpOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+dHJlZSgpLT5uZXh0U2libGlu
ZygpKSB7CisgICAgICAgIERvY3VtZW50KiBjaGlsZERvY3VtZW50ID0gY2hpbGQtPmRvY3VtZW50
KCk7CisgICAgICAgIGlmIChjaGlsZERvY3VtZW50LT5zaG91bGREaXNwbGF5U2VhbWxlc3NseVdp
dGhQYXJlbnQoKSkgeworICAgICAgICAgICAgQVNTRVJUKGNoaWxkRG9jdW1lbnQtPnNlYW1sZXNz
UGFyZW50SUZyYW1lKCktPmRvY3VtZW50KCkgPT0gdGhpcyk7CisgICAgICAgICAgICBjaGlsZERv
Y3VtZW50LT5zZWFtbGVzc1BhcmVudFVwZGF0ZWRTdHlsZXNoZWV0cygpOworICAgICAgICB9Cisg
ICAgfQorfQorCitib29sIERvY3VtZW50Ojp1cGRhdGVBY3RpdmVTdHlsZXNoZWV0cyhTdHlsZVJl
c29sdmVyVXBkYXRlRmxhZyB1cGRhdGVGbGFnKQoreworICAgIGlmIChtX2luU3R5bGVSZWNhbGMp
IHsKKyAgICAgICAgLy8gU1ZHIDx1c2U+IGVsZW1lbnQgbWF5IG1hbmFnZSB0byBpbnZhbGlkYXRl
IHN0eWxlIHNlbGVjdG9yIGluIHRoZSBtaWRkbGUgb2YgYSBzdHlsZSByZWNhbGMuCisgICAgICAg
IC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD01NDM0NAorICAgICAg
ICAvLyBGSVhNRTogVGhpcyBzaG91bGQgYmUgZml4ZWQgaW4gU1ZHIGFuZCB0aGlzIGNvZGUgcmVw
bGFjZWQgd2l0aCBBU1NFUlQoIW1faW5TdHlsZVJlY2FsYykuCisgICAgICAgIG1faGFzRGlydHlT
dHlsZVJlc29sdmVyID0gdHJ1ZTsKKyAgICAgICAgc2NoZWR1bGVGb3JjZWRTdHlsZVJlY2FsYygp
OworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghcmVuZGVyZXIoKSB8fCAh
YXR0YWNoZWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgU3R5bGVTaGVldFZlY3Rv
ciBuZXdTdHlsZXNoZWV0czsKKyAgICBjb2xsZWN0QWN0aXZlU3R5bGVzaGVldHMobmV3U3R5bGVz
aGVldHMpOworCisgICAgYm9vbCByZXF1aXJlc1N0eWxlUmVzb2x2ZXJSZXNldDsKKyAgICBib29s
IHJlcXVpcmVzRnVsbFN0eWxlUmVjYWxjOworICAgIGFuYWx5emVTdHlsZXNoZWV0Q2hhbmdlKHVw
ZGF0ZUZsYWcsIG5ld1N0eWxlc2hlZXRzLCByZXF1aXJlc1N0eWxlUmVzb2x2ZXJSZXNldCwgcmVx
dWlyZXNGdWxsU3R5bGVSZWNhbGMpOworCisgICAgaWYgKHJlcXVpcmVzU3R5bGVSZXNvbHZlclJl
c2V0KQorICAgICAgICBjbGVhclN0eWxlUmVzb2x2ZXIoKTsKKyAgICBlbHNlIHsKKyAgICAgICAg
bV9zdHlsZVJlc29sdmVyLT5hcHBlbmRBdXRob3JTdHlsZXNoZWV0cyhtX3N0eWxlU2hlZXRzLT5s
ZW5ndGgoKSwgbmV3U3R5bGVzaGVldHMpOworICAgICAgICByZXNldENTU0ZlYXR1cmVGbGFncygp
OworICAgIH0KKyAgICBtX3N0eWxlU2hlZXRzLT5zd2FwKG5ld1N0eWxlc2hlZXRzKTsKKworICAg
IG1fdXNlc1JlbVVuaXRzID0gc3R5bGVTaGVldHNVc2VSZW1Vbml0cyhtX3N0eWxlU2hlZXRzLT52
ZWN0b3IoKSk7CisgICAgbV9kaWRDYWxjdWxhdGVTdHlsZVJlc29sdmVyID0gdHJ1ZTsKKyAgICBt
X2hhc0RpcnR5U3R5bGVSZXNvbHZlciA9IGZhbHNlOworCisgICAgbm90aWZ5U2VhbWxlc3NDaGls
ZERvY3VtZW50c09mU3R5bGVzaGVldFVwZGF0ZSgpOworCisgICAgcmV0dXJuIHJlcXVpcmVzRnVs
bFN0eWxlUmVjYWxjOworfQorCit2b2lkIERvY3VtZW50OjpzZXRIb3Zlck5vZGUoUGFzc1JlZlB0
cjxOb2RlPiBuZXdIb3Zlck5vZGUpCit7CisgICAgbV9ob3Zlck5vZGUgPSBuZXdIb3Zlck5vZGU7
Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnNldEFjdGl2ZU5vZGUoUGFzc1JlZlB0cjxOb2RlPiBuZXdB
Y3RpdmVOb2RlKQoreworICAgIG1fYWN0aXZlTm9kZSA9IG5ld0FjdGl2ZU5vZGU7Cit9CisKK3Zv
aWQgRG9jdW1lbnQ6OmZvY3VzZWROb2RlUmVtb3ZlZCgpCit7CisgICAgc2V0Rm9jdXNlZE5vZGUo
MCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnJlbW92ZUZvY3VzZWROb2RlT2ZTdWJ0cmVlKE5vZGUq
IG5vZGUsIGJvb2wgYW1vbmdDaGlsZHJlbk9ubHkpCit7CisgICAgaWYgKCFtX2ZvY3VzZWROb2Rl
IHx8IHRoaXMtPmluUGFnZUNhY2hlKCkpIC8vIElmIHRoZSBkb2N1bWVudCBpcyBpbiB0aGUgcGFn
ZSBjYWNoZSwgdGhlbiB3ZSBkb24ndCBuZWVkIHRvIGNsZWFyIG91dCB0aGUgZm9jdXNlZCBub2Rl
LgorICAgICAgICByZXR1cm47CisgICAgICAgIAorICAgIGJvb2wgbm9kZUluU3VidHJlZSA9IGZh
bHNlOworICAgIGlmIChhbW9uZ0NoaWxkcmVuT25seSkKKyAgICAgICAgbm9kZUluU3VidHJlZSA9
IG1fZm9jdXNlZE5vZGUtPmlzRGVzY2VuZGFudE9mKG5vZGUpOworICAgIGVsc2UKKyAgICAgICAg
bm9kZUluU3VidHJlZSA9IChtX2ZvY3VzZWROb2RlID09IG5vZGUpIHx8IG1fZm9jdXNlZE5vZGUt
PmlzRGVzY2VuZGFudE9mKG5vZGUpOworICAgIAorICAgIGlmIChub2RlSW5TdWJ0cmVlKQorICAg
ICAgICBkb2N1bWVudCgpLT5mb2N1c2VkTm9kZVJlbW92ZWQoKTsKK30KKwordm9pZCBEb2N1bWVu
dDo6aG92ZXJlZE5vZGVEZXRhY2hlZChOb2RlKiBub2RlKQoreworICAgIGlmICghbV9ob3Zlck5v
ZGUgfHwgKG5vZGUgIT0gbV9ob3Zlck5vZGUgJiYgKCFtX2hvdmVyTm9kZS0+aXNUZXh0Tm9kZSgp
IHx8IG5vZGUgIT0gbV9ob3Zlck5vZGUtPnBhcmVudE5vZGUoKSkpKQorICAgICAgICByZXR1cm47
CisKKyAgICBtX2hvdmVyTm9kZSA9IG5vZGUtPnBhcmVudE5vZGUoKTsKKyAgICB3aGlsZSAobV9o
b3Zlck5vZGUgJiYgIW1faG92ZXJOb2RlLT5yZW5kZXJlcigpKQorICAgICAgICBtX2hvdmVyTm9k
ZSA9IG1faG92ZXJOb2RlLT5wYXJlbnROb2RlKCk7CisgICAgaWYgKGZyYW1lKCkpCisgICAgICAg
IGZyYW1lKCktPmV2ZW50SGFuZGxlcigpLT5zY2hlZHVsZUhvdmVyU3RhdGVVcGRhdGUoKTsKK30K
Kwordm9pZCBEb2N1bWVudDo6YWN0aXZlQ2hhaW5Ob2RlRGV0YWNoZWQoTm9kZSogbm9kZSkKK3sK
KyAgICBpZiAoIW1fYWN0aXZlTm9kZSB8fCAobm9kZSAhPSBtX2FjdGl2ZU5vZGUgJiYgKCFtX2Fj
dGl2ZU5vZGUtPmlzVGV4dE5vZGUoKSB8fCBub2RlICE9IG1fYWN0aXZlTm9kZS0+cGFyZW50Tm9k
ZSgpKSkpCisgICAgICAgIHJldHVybjsKKworICAgIG1fYWN0aXZlTm9kZSA9IG5vZGUtPnBhcmVu
dE5vZGUoKTsKKyAgICB3aGlsZSAobV9hY3RpdmVOb2RlICYmICFtX2FjdGl2ZU5vZGUtPnJlbmRl
cmVyKCkpCisgICAgICAgIG1fYWN0aXZlTm9kZSA9IG1fYWN0aXZlTm9kZS0+cGFyZW50Tm9kZSgp
OworfQorCisjaWYgRU5BQkxFKERBU0hCT0FSRF9TVVBQT1JUKSB8fCBFTkFCTEUoV0lER0VUX1JF
R0lPTikKK2NvbnN0IFZlY3RvcjxEYXNoYm9hcmRSZWdpb25WYWx1ZT4mIERvY3VtZW50OjpkYXNo
Ym9hcmRSZWdpb25zKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9kYXNoYm9hcmRSZWdpb25zOwor
fQorCit2b2lkIERvY3VtZW50OjpzZXREYXNoYm9hcmRSZWdpb25zKGNvbnN0IFZlY3RvcjxEYXNo
Ym9hcmRSZWdpb25WYWx1ZT4mIHJlZ2lvbnMpCit7CisgICAgbV9kYXNoYm9hcmRSZWdpb25zID0g
cmVnaW9uczsKKyAgICBzZXREYXNoYm9hcmRSZWdpb25zRGlydHkoZmFsc2UpOworfQorI2VuZGlm
CisKK2Jvb2wgRG9jdW1lbnQ6OnNldEZvY3VzZWROb2RlKFBhc3NSZWZQdHI8Tm9kZT4gcHJwTmV3
Rm9jdXNlZE5vZGUpCit7CisgICAgUmVmUHRyPE5vZGU+IG5ld0ZvY3VzZWROb2RlID0gcHJwTmV3
Rm9jdXNlZE5vZGU7CisKKyAgICAvLyBNYWtlIHN1cmUgbmV3Rm9jdXNlZE5vZGUgaXMgYWN0dWFs
bHkgaW4gdGhpcyBkb2N1bWVudAorICAgIGlmIChuZXdGb2N1c2VkTm9kZSAmJiAobmV3Rm9jdXNl
ZE5vZGUtPmRvY3VtZW50KCkgIT0gdGhpcykpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAg
aWYgKG1fZm9jdXNlZE5vZGUgPT0gbmV3Rm9jdXNlZE5vZGUpCisgICAgICAgIHJldHVybiB0cnVl
OworCisgICAgaWYgKG1faW5QYWdlQ2FjaGUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
IGJvb2wgZm9jdXNDaGFuZ2VCbG9ja2VkID0gZmFsc2U7CisgICAgUmVmUHRyPE5vZGU+IG9sZEZv
Y3VzZWROb2RlID0gbV9mb2N1c2VkTm9kZTsKKyAgICBtX2ZvY3VzZWROb2RlID0gMDsKKworICAg
IC8vIFJlbW92ZSBmb2N1cyBmcm9tIHRoZSBleGlzdGluZyBmb2N1cyBub2RlIChpZiBhbnkpCisg
ICAgaWYgKG9sZEZvY3VzZWROb2RlKSB7CisgICAgICAgIEFTU0VSVCghb2xkRm9jdXNlZE5vZGUt
PmluRGV0YWNoKCkpOworCisgICAgICAgIGlmIChvbGRGb2N1c2VkTm9kZS0+YWN0aXZlKCkpCisg
ICAgICAgICAgICBvbGRGb2N1c2VkTm9kZS0+c2V0QWN0aXZlKGZhbHNlKTsKKworICAgICAgICBv
bGRGb2N1c2VkTm9kZS0+c2V0Rm9jdXMoZmFsc2UpOworCisgICAgICAgIC8vIERpc3BhdGNoIGEg
Y2hhbmdlIGV2ZW50IGZvciB0ZXh0IGZpZWxkcyBvciB0ZXh0YXJlYXMgdGhhdCBoYXZlIGJlZW4g
ZWRpdGVkCisgICAgICAgIGlmIChvbGRGb2N1c2VkTm9kZS0+aXNFbGVtZW50Tm9kZSgpKSB7Cisg
ICAgICAgICAgICBFbGVtZW50KiBlbGVtZW50ID0gc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG9sZEZv
Y3VzZWROb2RlLmdldCgpKTsKKyAgICAgICAgICAgIGlmIChlbGVtZW50LT53YXNDaGFuZ2VkU2lu
Y2VMYXN0Rm9ybUNvbnRyb2xDaGFuZ2VFdmVudCgpKQorICAgICAgICAgICAgICAgIGVsZW1lbnQt
PmRpc3BhdGNoRm9ybUNvbnRyb2xDaGFuZ2VFdmVudCgpOworICAgICAgICB9CisKKyAgICAgICAg
Ly8gRGlzcGF0Y2ggdGhlIGJsdXIgZXZlbnQgYW5kIGxldCB0aGUgbm9kZSBkbyBhbnkgb3RoZXIg
Ymx1ciByZWxhdGVkIGFjdGl2aXRpZXMgKGltcG9ydGFudCBmb3IgdGV4dCBmaWVsZHMpCisgICAg
ICAgIG9sZEZvY3VzZWROb2RlLT5kaXNwYXRjaEJsdXJFdmVudChuZXdGb2N1c2VkTm9kZSk7CisK
KyAgICAgICAgaWYgKG1fZm9jdXNlZE5vZGUpIHsKKyAgICAgICAgICAgIC8vIGhhbmRsZXIgc2hp
ZnRlZCBmb2N1cworICAgICAgICAgICAgZm9jdXNDaGFuZ2VCbG9ja2VkID0gdHJ1ZTsKKyAgICAg
ICAgICAgIG5ld0ZvY3VzZWROb2RlID0gMDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAg
b2xkRm9jdXNlZE5vZGUtPmRpc3BhdGNoRm9jdXNPdXRFdmVudChldmVudE5hbWVzKCkuZm9jdXNv
dXRFdmVudCwgbmV3Rm9jdXNlZE5vZGUpOyAvLyBET00gbGV2ZWwgMyBuYW1lIGZvciB0aGUgYnVi
YmxpbmcgYmx1ciBldmVudC4KKyAgICAgICAgLy8gRklYTUU6IFdlIHNob3VsZCByZW1vdmUgZmly
aW5nIERPTUZvY3VzT3V0RXZlbnQgZXZlbnQgd2hlbiB3ZSBhcmUgc3VyZSBubyBjb250ZW50IGRl
cGVuZHMKKyAgICAgICAgLy8gb24gaXQsIHByb2JhYmx5IHdoZW4gPHJkYXI6Ly9wcm9ibGVtLzg1
MDM5NTg+IGlzIHJlc29sdmVkLgorICAgICAgICBvbGRGb2N1c2VkTm9kZS0+ZGlzcGF0Y2hGb2N1
c091dEV2ZW50KGV2ZW50TmFtZXMoKS5ET01Gb2N1c091dEV2ZW50LCBuZXdGb2N1c2VkTm9kZSk7
IC8vIERPTSBsZXZlbCAyIG5hbWUgZm9yIGNvbXBhdGliaWxpdHkuCisKKyAgICAgICAgaWYgKG1f
Zm9jdXNlZE5vZGUpIHsKKyAgICAgICAgICAgIC8vIGhhbmRsZXIgc2hpZnRlZCBmb2N1cworICAg
ICAgICAgICAgZm9jdXNDaGFuZ2VCbG9ja2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIG5ld0ZvY3Vz
ZWROb2RlID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAob2xkRm9jdXNlZE5vZGUgPT0gdGhp
cyAmJiBvbGRGb2N1c2VkTm9kZS0+aGFzT25lUmVmKCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICAgICAgICAgIAorICAgICAgICBpZiAob2xkRm9jdXNlZE5vZGUtPmlzUm9vdEVkaXRh
YmxlRWxlbWVudCgpKQorICAgICAgICAgICAgZnJhbWUoKS0+ZWRpdG9yKCktPmRpZEVuZEVkaXRp
bmcoKTsKKworICAgICAgICBpZiAodmlldygpKSB7CisgICAgICAgICAgICBXaWRnZXQqIG9sZFdp
ZGdldCA9IHdpZGdldEZvck5vZGUob2xkRm9jdXNlZE5vZGUuZ2V0KCkpOworICAgICAgICAgICAg
aWYgKG9sZFdpZGdldCkKKyAgICAgICAgICAgICAgICBvbGRXaWRnZXQtPnNldEZvY3VzKGZhbHNl
KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB2aWV3KCktPnNldEZvY3VzKGZh
bHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChuZXdGb2N1c2VkTm9kZSkgeworICAg
ICAgICBpZiAobmV3Rm9jdXNlZE5vZGUtPmlzUm9vdEVkaXRhYmxlRWxlbWVudCgpICYmICFhY2Nl
cHRzRWRpdGluZ0ZvY3VzKG5ld0ZvY3VzZWROb2RlLmdldCgpKSkgeworICAgICAgICAgICAgLy8g
ZGVsZWdhdGUgYmxvY2tzIGZvY3VzIGNoYW5nZQorICAgICAgICAgICAgZm9jdXNDaGFuZ2VCbG9j
a2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIGdvdG8gU2V0Rm9jdXNlZE5vZGVEb25lOworICAgICAg
ICB9CisgICAgICAgIC8vIFNldCBmb2N1cyBvbiB0aGUgbmV3IG5vZGUKKyAgICAgICAgbV9mb2N1
c2VkTm9kZSA9IG5ld0ZvY3VzZWROb2RlOworCisgICAgICAgIC8vIERpc3BhdGNoIHRoZSBmb2N1
cyBldmVudCBhbmQgbGV0IHRoZSBub2RlIGRvIGFueSBvdGhlciBmb2N1cyByZWxhdGVkIGFjdGl2
aXRpZXMgKGltcG9ydGFudCBmb3IgdGV4dCBmaWVsZHMpCisgICAgICAgIG1fZm9jdXNlZE5vZGUt
PmRpc3BhdGNoRm9jdXNFdmVudChvbGRGb2N1c2VkTm9kZSk7CisKKyAgICAgICAgaWYgKG1fZm9j
dXNlZE5vZGUgIT0gbmV3Rm9jdXNlZE5vZGUpIHsKKyAgICAgICAgICAgIC8vIGhhbmRsZXIgc2hp
ZnRlZCBmb2N1cworICAgICAgICAgICAgZm9jdXNDaGFuZ2VCbG9ja2VkID0gdHJ1ZTsKKyAgICAg
ICAgICAgIGdvdG8gU2V0Rm9jdXNlZE5vZGVEb25lOworICAgICAgICB9CisKKyAgICAgICAgbV9m
b2N1c2VkTm9kZS0+ZGlzcGF0Y2hGb2N1c0luRXZlbnQoZXZlbnROYW1lcygpLmZvY3VzaW5FdmVu
dCwgb2xkRm9jdXNlZE5vZGUpOyAvLyBET00gbGV2ZWwgMyBidWJibGluZyBmb2N1cyBldmVudC4K
KworICAgICAgICBpZiAobV9mb2N1c2VkTm9kZSAhPSBuZXdGb2N1c2VkTm9kZSkgeworICAgICAg
ICAgICAgLy8gaGFuZGxlciBzaGlmdGVkIGZvY3VzCisgICAgICAgICAgICBmb2N1c0NoYW5nZUJs
b2NrZWQgPSB0cnVlOworICAgICAgICAgICAgZ290byBTZXRGb2N1c2VkTm9kZURvbmU7CisgICAg
ICAgIH0KKworICAgICAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIHJlbW92ZSBmaXJpbmcgRE9NRm9j
dXNJbkV2ZW50IGV2ZW50IHdoZW4gd2UgYXJlIHN1cmUgbm8gY29udGVudCBkZXBlbmRzCisgICAg
ICAgIC8vIG9uIGl0LCBwcm9iYWJseSB3aGVuIDxyZGFyOi8vcHJvYmxlbS84NTAzOTU4PiBpcyBt
LgorICAgICAgICBtX2ZvY3VzZWROb2RlLT5kaXNwYXRjaEZvY3VzSW5FdmVudChldmVudE5hbWVz
KCkuRE9NRm9jdXNJbkV2ZW50LCBvbGRGb2N1c2VkTm9kZSk7IC8vIERPTSBsZXZlbCAyIGZvciBj
b21wYXRpYmlsaXR5LgorCisgICAgICAgIGlmIChtX2ZvY3VzZWROb2RlICE9IG5ld0ZvY3VzZWRO
b2RlKSB7IAorICAgICAgICAgICAgLy8gaGFuZGxlciBzaGlmdGVkIGZvY3VzCisgICAgICAgICAg
ICBmb2N1c0NoYW5nZUJsb2NrZWQgPSB0cnVlOworICAgICAgICAgICAgZ290byBTZXRGb2N1c2Vk
Tm9kZURvbmU7CisgICAgICAgIH0KKyAgICAgICAgbV9mb2N1c2VkTm9kZS0+c2V0Rm9jdXModHJ1
ZSk7CisKKyAgICAgICAgaWYgKG1fZm9jdXNlZE5vZGUtPmlzUm9vdEVkaXRhYmxlRWxlbWVudCgp
KQorICAgICAgICAgICAgZnJhbWUoKS0+ZWRpdG9yKCktPmRpZEJlZ2luRWRpdGluZygpOworCisg
ICAgICAgIC8vIGV3dywgSSBzdWNrLiBzZXQgdGhlIHF0IGZvY3VzIGNvcnJlY3RseQorICAgICAg
ICAvLyAjIyMgZmluZCBhIGJldHRlciBwbGFjZSBpbiB0aGUgY29kZSBmb3IgdGhpcworICAgICAg
ICBpZiAodmlldygpKSB7CisgICAgICAgICAgICBXaWRnZXQqIGZvY3VzV2lkZ2V0ID0gd2lkZ2V0
Rm9yTm9kZShtX2ZvY3VzZWROb2RlLmdldCgpKTsKKyAgICAgICAgICAgIGlmIChmb2N1c1dpZGdl
dCkgeworICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBhIHdpZGdldCBoYXMgdGhlIHJpZ2h0
IHNpemUgYmVmb3JlIGdpdmluZyBpdCBmb2N1cy4KKyAgICAgICAgICAgICAgICAvLyBPdGhlcndp
c2UsIHdlIGFyZSB0ZXN0aW5nIGVkZ2UgY2FzZXMgb2YgdGhlIFdpZGdldCBjb2RlLgorICAgICAg
ICAgICAgICAgIC8vIFNwZWNpZmljYWxseSwgaW4gV2ViQ29yZSB0aGlzIGRvZXMgbm90IHdvcmsg
d2VsbCBmb3IgdGV4dCBmaWVsZHMuCisgICAgICAgICAgICAgICAgdXBkYXRlTGF5b3V0KCk7Cisg
ICAgICAgICAgICAgICAgLy8gUmUtZ2V0IHRoZSB3aWRnZXQgaW4gY2FzZSB1cGRhdGluZyB0aGUg
bGF5b3V0IGNoYW5nZWQgdGhpbmdzLgorICAgICAgICAgICAgICAgIGZvY3VzV2lkZ2V0ID0gd2lk
Z2V0Rm9yTm9kZShtX2ZvY3VzZWROb2RlLmdldCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIGlmIChmb2N1c1dpZGdldCkKKyAgICAgICAgICAgICAgICBmb2N1c1dpZGdldC0+c2V0Rm9j
dXModHJ1ZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdmlldygpLT5zZXRG
b2N1cyh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworI2lmIFBMQVRGT1JNKE1BQykgfHwgUExB
VEZPUk0oV0lOKSB8fCBQTEFURk9STShHVEspIHx8IFBMQVRGT1JNKENIUk9NSVVNKQorICAgIGlm
ICghZm9jdXNDaGFuZ2VCbG9ja2VkICYmIG1fZm9jdXNlZE5vZGUgJiYgQVhPYmplY3RDYWNoZTo6
YWNjZXNzaWJpbGl0eUVuYWJsZWQoKSkKKyAgICAgICAgYXhPYmplY3RDYWNoZSgpLT5oYW5kbGVG
b2N1c2VkVUlFbGVtZW50Q2hhbmdlZChvbGRGb2N1c2VkTm9kZS5nZXQoKSwgbmV3Rm9jdXNlZE5v
ZGUuZ2V0KCkpOworI2VuZGlmCisgICAgaWYgKCFmb2N1c0NoYW5nZUJsb2NrZWQpCisgICAgICAg
IHBhZ2UoKS0+Y2hyb21lKCktPmZvY3VzZWROb2RlQ2hhbmdlZChtX2ZvY3VzZWROb2RlLmdldCgp
KTsKKworU2V0Rm9jdXNlZE5vZGVEb25lOgorICAgIHVwZGF0ZVN0eWxlSWZOZWVkZWQoKTsKKyAg
ICByZXR1cm4gIWZvY3VzQ2hhbmdlQmxvY2tlZDsKK30KKyAgICAKK3ZvaWQgRG9jdW1lbnQ6Omdl
dEZvY3VzYWJsZU5vZGVzKFZlY3RvcjxSZWZQdHI8Tm9kZT4gPiYgbm9kZXMpCit7CisgICAgdXBk
YXRlTGF5b3V0KCk7CisKKyAgICBmb3IgKE5vZGUqIG5vZGUgPSBmaXJzdENoaWxkKCk7IG5vZGU7
IG5vZGUgPSBub2RlLT50cmF2ZXJzZU5leHROb2RlKCkpIHsKKyAgICAgICAgaWYgKG5vZGUtPmlz
Rm9jdXNhYmxlKCkpCisgICAgICAgICAgICBub2Rlcy5hcHBlbmQobm9kZSk7CisgICAgfQorfQor
ICAKK3ZvaWQgRG9jdW1lbnQ6OnNldENTU1RhcmdldChFbGVtZW50KiBuKQoreworICAgIGlmICht
X2Nzc1RhcmdldCkKKyAgICAgICAgbV9jc3NUYXJnZXQtPnNldE5lZWRzU3R5bGVSZWNhbGMoKTsK
KyAgICBtX2Nzc1RhcmdldCA9IG47CisgICAgaWYgKG4pCisgICAgICAgIG4tPnNldE5lZWRzU3R5
bGVSZWNhbGMoKTsKK30KKwordm9pZCBEb2N1bWVudDo6cmVnaXN0ZXJOb2RlTGlzdENhY2hlKER5
bmFtaWNOb2RlTGlzdENhY2hlQmFzZSogbGlzdCkKK3sKKyAgICBpZiAobGlzdC0+dHlwZSgpICE9
IE5vZGVMaXN0Q29sbGVjdGlvblR5cGUpCisgICAgICAgIG1fbm9kZUxpc3RDb3VudHNbSW52YWxp
ZGF0ZU9uSWROYW1lQXR0ckNoYW5nZV0rKzsKKyAgICBtX25vZGVMaXN0Q291bnRzW2xpc3QtPmlu
dmFsaWRhdGlvblR5cGUoKV0rKzsKKyAgICBpZiAobGlzdC0+aXNSb290ZWRBdERvY3VtZW50KCkp
CisgICAgICAgIG1fbGlzdHNJbnZhbGlkYXRlZEF0RG9jdW1lbnQuYWRkKGxpc3QpOworfQorCit2
b2lkIERvY3VtZW50Ojp1bnJlZ2lzdGVyTm9kZUxpc3RDYWNoZShEeW5hbWljTm9kZUxpc3RDYWNo
ZUJhc2UqIGxpc3QpCit7CisgICAgaWYgKGxpc3QtPnR5cGUoKSAhPSBOb2RlTGlzdENvbGxlY3Rp
b25UeXBlKQorICAgICAgICBtX25vZGVMaXN0Q291bnRzW0ludmFsaWRhdGVPbklkTmFtZUF0dHJD
aGFuZ2VdLS07CisgICAgbV9ub2RlTGlzdENvdW50c1tsaXN0LT5pbnZhbGlkYXRpb25UeXBlKCld
LS07CisgICAgaWYgKGxpc3QtPmlzUm9vdGVkQXREb2N1bWVudCgpKSB7CisgICAgICAgIEFTU0VS
VChtX2xpc3RzSW52YWxpZGF0ZWRBdERvY3VtZW50LmNvbnRhaW5zKGxpc3QpKTsKKyAgICAgICAg
bV9saXN0c0ludmFsaWRhdGVkQXREb2N1bWVudC5yZW1vdmUobGlzdCk7CisgICAgfQorfQorCit2
b2lkIERvY3VtZW50OjphdHRhY2hOb2RlSXRlcmF0b3IoTm9kZUl0ZXJhdG9yKiBuaSkKK3sKKyAg
ICBtX25vZGVJdGVyYXRvcnMuYWRkKG5pKTsKK30KKwordm9pZCBEb2N1bWVudDo6ZGV0YWNoTm9k
ZUl0ZXJhdG9yKE5vZGVJdGVyYXRvciogbmkpCit7CisgICAgLy8gVGhlIG5vZGUgaXRlcmF0b3Ig
Y2FuIGJlIGRldGFjaGVkIHdpdGhvdXQgaGF2aW5nIGJlZW4gYXR0YWNoZWQgaWYgaXRzIHJvb3Qg
bm9kZSBkaWRuJ3QgaGF2ZSBhIGRvY3VtZW50CisgICAgLy8gd2hlbiB0aGUgaXRlcmF0b3Igd2Fz
IGNyZWF0ZWQsIGJ1dCBoYXMgaXQgbm93LgorICAgIG1fbm9kZUl0ZXJhdG9ycy5yZW1vdmUobmkp
OworfQorCit2b2lkIERvY3VtZW50Ojptb3ZlTm9kZUl0ZXJhdG9yc1RvTmV3RG9jdW1lbnQoTm9k
ZSogbm9kZSwgRG9jdW1lbnQqIG5ld0RvY3VtZW50KQoreworICAgIEhhc2hTZXQ8Tm9kZUl0ZXJh
dG9yKj4gbm9kZUl0ZXJhdG9yc0xpc3QgPSBtX25vZGVJdGVyYXRvcnM7CisgICAgSGFzaFNldDxO
b2RlSXRlcmF0b3IqPjo6Y29uc3RfaXRlcmF0b3Igbm9kZUl0ZXJhdG9yc0VuZCA9IG5vZGVJdGVy
YXRvcnNMaXN0LmVuZCgpOworICAgIGZvciAoSGFzaFNldDxOb2RlSXRlcmF0b3IqPjo6Y29uc3Rf
aXRlcmF0b3IgaXQgPSBub2RlSXRlcmF0b3JzTGlzdC5iZWdpbigpOyBpdCAhPSBub2RlSXRlcmF0
b3JzRW5kOyArK2l0KSB7CisgICAgICAgIGlmICgoKml0KS0+cm9vdCgpID09IG5vZGUpIHsKKyAg
ICAgICAgICAgIGRldGFjaE5vZGVJdGVyYXRvcigqaXQpOworICAgICAgICAgICAgbmV3RG9jdW1l
bnQtPmF0dGFjaE5vZGVJdGVyYXRvcigqaXQpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lk
IERvY3VtZW50Ojp1cGRhdGVSYW5nZXNBZnRlckNoaWxkcmVuQ2hhbmdlZChDb250YWluZXJOb2Rl
KiBjb250YWluZXIpCit7CisgICAgaWYgKCFtX3Jhbmdlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAg
SGFzaFNldDxSYW5nZSo+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBtX3Jhbmdlcy5lbmQoKTsKKyAg
ICAgICAgZm9yIChIYXNoU2V0PFJhbmdlKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yYW5nZXMu
YmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KQorICAgICAgICAgICAgKCppdCktPm5vZGVDaGlsZHJl
bkNoYW5nZWQoY29udGFpbmVyKTsKKyAgICB9Cit9CisKK3ZvaWQgRG9jdW1lbnQ6Om5vZGVDaGls
ZHJlbldpbGxCZVJlbW92ZWQoQ29udGFpbmVyTm9kZSogY29udGFpbmVyKQoreworICAgIGlmICgh
bV9yYW5nZXMuaXNFbXB0eSgpKSB7CisgICAgICAgIEhhc2hTZXQ8UmFuZ2UqPjo6Y29uc3RfaXRl
cmF0b3IgZW5kID0gbV9yYW5nZXMuZW5kKCk7CisgICAgICAgIGZvciAoSGFzaFNldDxSYW5nZSo+
Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmFuZ2VzLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkK
KyAgICAgICAgICAgICgqaXQpLT5ub2RlQ2hpbGRyZW5XaWxsQmVSZW1vdmVkKGNvbnRhaW5lcik7
CisgICAgfQorCisgICAgSGFzaFNldDxOb2RlSXRlcmF0b3IqPjo6Y29uc3RfaXRlcmF0b3Igbm9k
ZUl0ZXJhdG9yc0VuZCA9IG1fbm9kZUl0ZXJhdG9ycy5lbmQoKTsKKyAgICBmb3IgKEhhc2hTZXQ8
Tm9kZUl0ZXJhdG9yKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9ub2RlSXRlcmF0b3JzLmJlZ2lu
KCk7IGl0ICE9IG5vZGVJdGVyYXRvcnNFbmQ7ICsraXQpIHsKKyAgICAgICAgZm9yIChOb2RlKiBu
ID0gY29udGFpbmVyLT5maXJzdENoaWxkKCk7IG47IG4gPSBuLT5uZXh0U2libGluZygpKQorICAg
ICAgICAgICAgKCppdCktPm5vZGVXaWxsQmVSZW1vdmVkKG4pOworICAgIH0KKworICAgIGlmIChG
cmFtZSogZnJhbWUgPSB0aGlzLT5mcmFtZSgpKSB7CisgICAgICAgIGZvciAoTm9kZSogbiA9IGNv
bnRhaW5lci0+Zmlyc3RDaGlsZCgpOyBuOyBuID0gbi0+bmV4dFNpYmxpbmcoKSkgeworICAgICAg
ICAgICAgZnJhbWUtPmV2ZW50SGFuZGxlcigpLT5ub2RlV2lsbEJlUmVtb3ZlZChuKTsKKyAgICAg
ICAgICAgIGZyYW1lLT5zZWxlY3Rpb24oKS0+bm9kZVdpbGxCZVJlbW92ZWQobik7CisgICAgICAg
ICAgICBmcmFtZS0+cGFnZSgpLT5kcmFnQ2FyZXRDb250cm9sbGVyKCktPm5vZGVXaWxsQmVSZW1v
dmVkKG4pOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIERvY3VtZW50Ojpub2RlV2lsbEJl
UmVtb3ZlZChOb2RlKiBuKQoreworICAgIEhhc2hTZXQ8Tm9kZUl0ZXJhdG9yKj46OmNvbnN0X2l0
ZXJhdG9yIG5vZGVJdGVyYXRvcnNFbmQgPSBtX25vZGVJdGVyYXRvcnMuZW5kKCk7CisgICAgZm9y
IChIYXNoU2V0PE5vZGVJdGVyYXRvcio+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fbm9kZUl0ZXJh
dG9ycy5iZWdpbigpOyBpdCAhPSBub2RlSXRlcmF0b3JzRW5kOyArK2l0KQorICAgICAgICAoKml0
KS0+bm9kZVdpbGxCZVJlbW92ZWQobik7CisKKyAgICBpZiAoIW1fcmFuZ2VzLmlzRW1wdHkoKSkg
eworICAgICAgICBIYXNoU2V0PFJhbmdlKj46OmNvbnN0X2l0ZXJhdG9yIHJhbmdlc0VuZCA9IG1f
cmFuZ2VzLmVuZCgpOworICAgICAgICBmb3IgKEhhc2hTZXQ8UmFuZ2UqPjo6Y29uc3RfaXRlcmF0
b3IgaXQgPSBtX3Jhbmdlcy5iZWdpbigpOyBpdCAhPSByYW5nZXNFbmQ7ICsraXQpCisgICAgICAg
ICAgICAoKml0KS0+bm9kZVdpbGxCZVJlbW92ZWQobik7CisgICAgfQorCisgICAgaWYgKEZyYW1l
KiBmcmFtZSA9IHRoaXMtPmZyYW1lKCkpIHsKKyAgICAgICAgZnJhbWUtPmV2ZW50SGFuZGxlcigp
LT5ub2RlV2lsbEJlUmVtb3ZlZChuKTsKKyAgICAgICAgZnJhbWUtPnNlbGVjdGlvbigpLT5ub2Rl
V2lsbEJlUmVtb3ZlZChuKTsKKyAgICAgICAgZnJhbWUtPnBhZ2UoKS0+ZHJhZ0NhcmV0Q29udHJv
bGxlcigpLT5ub2RlV2lsbEJlUmVtb3ZlZChuKTsKKyAgICB9Cit9CisKK3ZvaWQgRG9jdW1lbnQ6
OnRleHRJbnNlcnRlZChOb2RlKiB0ZXh0LCB1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIGxlbmd0
aCkKK3sKKyAgICBpZiAoIW1fcmFuZ2VzLmlzRW1wdHkoKSkgeworICAgICAgICBIYXNoU2V0PFJh
bmdlKj46OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fcmFuZ2VzLmVuZCgpOworICAgICAgICBmb3Ig
KEhhc2hTZXQ8UmFuZ2UqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3Jhbmdlcy5iZWdpbigpOyBp
dCAhPSBlbmQ7ICsraXQpCisgICAgICAgICAgICAoKml0KS0+dGV4dEluc2VydGVkKHRleHQsIG9m
ZnNldCwgbGVuZ3RoKTsKKyAgICB9CisKKyAgICAvLyBVcGRhdGUgdGhlIG1hcmtlcnMgZm9yIHNw
ZWxsaW5nIGFuZCBncmFtbWFyIGNoZWNraW5nLgorICAgIG1fbWFya2Vycy0+c2hpZnRNYXJrZXJz
KHRleHQsIG9mZnNldCwgbGVuZ3RoKTsKK30KKwordm9pZCBEb2N1bWVudDo6dGV4dFJlbW92ZWQo
Tm9kZSogdGV4dCwgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBsZW5ndGgpCit7CisgICAgaWYg
KCFtX3Jhbmdlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgSGFzaFNldDxSYW5nZSo+Ojpjb25zdF9p
dGVyYXRvciBlbmQgPSBtX3Jhbmdlcy5lbmQoKTsKKyAgICAgICAgZm9yIChIYXNoU2V0PFJhbmdl
Kj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yYW5nZXMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0
KQorICAgICAgICAgICAgKCppdCktPnRleHRSZW1vdmVkKHRleHQsIG9mZnNldCwgbGVuZ3RoKTsK
KyAgICB9CisKKyAgICAvLyBVcGRhdGUgdGhlIG1hcmtlcnMgZm9yIHNwZWxsaW5nIGFuZCBncmFt
bWFyIGNoZWNraW5nLgorICAgIG1fbWFya2Vycy0+cmVtb3ZlTWFya2Vycyh0ZXh0LCBvZmZzZXQs
IGxlbmd0aCk7CisgICAgbV9tYXJrZXJzLT5zaGlmdE1hcmtlcnModGV4dCwgb2Zmc2V0ICsgbGVu
Z3RoLCAwIC0gbGVuZ3RoKTsKK30KKwordm9pZCBEb2N1bWVudDo6dGV4dE5vZGVzTWVyZ2VkKFRl
eHQqIG9sZE5vZGUsIHVuc2lnbmVkIG9mZnNldCkKK3sKKyAgICBpZiAoIW1fcmFuZ2VzLmlzRW1w
dHkoKSkgeworICAgICAgICBOb2RlV2l0aEluZGV4IG9sZE5vZGVXaXRoSW5kZXgob2xkTm9kZSk7
CisgICAgICAgIEhhc2hTZXQ8UmFuZ2UqPjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV9yYW5nZXMu
ZW5kKCk7CisgICAgICAgIGZvciAoSGFzaFNldDxSYW5nZSo+Ojpjb25zdF9pdGVyYXRvciBpdCA9
IG1fcmFuZ2VzLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkKKyAgICAgICAgICAgICgqaXQpLT50
ZXh0Tm9kZXNNZXJnZWQob2xkTm9kZVdpdGhJbmRleCwgb2Zmc2V0KTsKKyAgICB9CisKKyAgICAv
LyBGSVhNRTogVGhpcyBzaG91bGQgdXBkYXRlIG1hcmtlcnMgZm9yIHNwZWxsaW5nIGFuZCBncmFt
bWFyIGNoZWNraW5nLgorfQorCit2b2lkIERvY3VtZW50Ojp0ZXh0Tm9kZVNwbGl0KFRleHQqIG9s
ZE5vZGUpCit7CisgICAgaWYgKCFtX3Jhbmdlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgSGFzaFNl
dDxSYW5nZSo+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBtX3Jhbmdlcy5lbmQoKTsKKyAgICAgICAg
Zm9yIChIYXNoU2V0PFJhbmdlKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yYW5nZXMuYmVnaW4o
KTsgaXQgIT0gZW5kOyArK2l0KQorICAgICAgICAgICAgKCppdCktPnRleHROb2RlU3BsaXQob2xk
Tm9kZSk7CisgICAgfQorCisgICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIHVwZGF0ZSBtYXJrZXJz
IGZvciBzcGVsbGluZyBhbmQgZ3JhbW1hciBjaGVja2luZy4KK30KKwordm9pZCBEb2N1bWVudDo6
Y3JlYXRlRE9NV2luZG93KCkKK3sKKyAgICBBU1NFUlQobV9mcmFtZSk7CisgICAgQVNTRVJUKCFt
X2RvbVdpbmRvdyk7CisKKyAgICBtX2RvbVdpbmRvdyA9IERPTVdpbmRvdzo6Y3JlYXRlKHRoaXMp
OworCisgICAgQVNTRVJUKG1fZG9tV2luZG93LT5kb2N1bWVudCgpID09IHRoaXMpOworICAgIEFT
U0VSVChtX2RvbVdpbmRvdy0+ZnJhbWUoKSA9PSBtX2ZyYW1lKTsKK30KKwordm9pZCBEb2N1bWVu
dDo6dGFrZURPTVdpbmRvd0Zyb20oRG9jdW1lbnQqIGRvY3VtZW50KQoreworICAgIEFTU0VSVCht
X2ZyYW1lKTsKKyAgICBBU1NFUlQoIW1fZG9tV2luZG93KTsKKyAgICBBU1NFUlQoZG9jdW1lbnQt
PmRvbVdpbmRvdygpKTsKKworICAgIG1fZG9tV2luZG93ID0gZG9jdW1lbnQtPm1fZG9tV2luZG93
LnJlbGVhc2UoKTsKKyAgICBtX2RvbVdpbmRvdy0+ZGlkU2VjdXJlVHJhbnNpdGlvblRvKHRoaXMp
OworCisgICAgQVNTRVJUKG1fZG9tV2luZG93LT5kb2N1bWVudCgpID09IHRoaXMpOworICAgIEFT
U0VSVChtX2RvbVdpbmRvdy0+ZnJhbWUoKSA9PSBtX2ZyYW1lKTsKK30KKwordm9pZCBEb2N1bWVu
dDo6c2V0V2luZG93QXR0cmlidXRlRXZlbnRMaXN0ZW5lcihjb25zdCBBdG9taWNTdHJpbmcmIGV2
ZW50VHlwZSwgUGFzc1JlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lcikKK3sKKyAgICBET01X
aW5kb3cqIGRvbVdpbmRvdyA9IHRoaXMtPmRvbVdpbmRvdygpOworICAgIGlmICghZG9tV2luZG93
KQorICAgICAgICByZXR1cm47CisgICAgZG9tV2luZG93LT5zZXRBdHRyaWJ1dGVFdmVudExpc3Rl
bmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIpOworfQorCitFdmVudExpc3RlbmVyKiBEb2N1bWVudDo6
Z2V0V2luZG93QXR0cmlidXRlRXZlbnRMaXN0ZW5lcihjb25zdCBBdG9taWNTdHJpbmcmIGV2ZW50
VHlwZSkKK3sKKyAgICBET01XaW5kb3cqIGRvbVdpbmRvdyA9IHRoaXMtPmRvbVdpbmRvdygpOwor
ICAgIGlmICghZG9tV2luZG93KQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gZG9tV2lu
ZG93LT5nZXRBdHRyaWJ1dGVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSk7Cit9CisKK3ZvaWQgRG9j
dW1lbnQ6OmRpc3BhdGNoV2luZG93RXZlbnQoUGFzc1JlZlB0cjxFdmVudD4gZXZlbnQsICBQYXNz
UmVmUHRyPEV2ZW50VGFyZ2V0PiB0YXJnZXQpCit7CisgICAgQVNTRVJUKCFldmVudERpc3BhdGNo
Rm9yYmlkZGVuKCkpOworICAgIERPTVdpbmRvdyogZG9tV2luZG93ID0gdGhpcy0+ZG9tV2luZG93
KCk7CisgICAgaWYgKCFkb21XaW5kb3cpCisgICAgICAgIHJldHVybjsKKyAgICBkb21XaW5kb3ct
PmRpc3BhdGNoRXZlbnQoZXZlbnQsIHRhcmdldCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmRpc3Bh
dGNoV2luZG93TG9hZEV2ZW50KCkKK3sKKyAgICBBU1NFUlQoIWV2ZW50RGlzcGF0Y2hGb3JiaWRk
ZW4oKSk7CisgICAgRE9NV2luZG93KiBkb21XaW5kb3cgPSB0aGlzLT5kb21XaW5kb3coKTsKKyAg
ICBpZiAoIWRvbVdpbmRvdykKKyAgICAgICAgcmV0dXJuOworICAgIGRvbVdpbmRvdy0+ZGlzcGF0
Y2hMb2FkRXZlbnQoKTsKKyAgICBtX2xvYWRFdmVudEZpbmlzaGVkID0gdHJ1ZTsKK30KKwordm9p
ZCBEb2N1bWVudDo6ZW5xdWV1ZVdpbmRvd0V2ZW50KFBhc3NSZWZQdHI8RXZlbnQ+IGV2ZW50KQor
eworICAgIGV2ZW50LT5zZXRUYXJnZXQoZG9tV2luZG93KCkpOworICAgIG1fZXZlbnRRdWV1ZS0+
ZW5xdWV1ZUV2ZW50KGV2ZW50KTsKK30KKwordm9pZCBEb2N1bWVudDo6ZW5xdWV1ZURvY3VtZW50
RXZlbnQoUGFzc1JlZlB0cjxFdmVudD4gZXZlbnQpCit7CisgICAgZXZlbnQtPnNldFRhcmdldCh0
aGlzKTsKKyAgICBtX2V2ZW50UXVldWUtPmVucXVldWVFdmVudChldmVudCk7Cit9CisKK1Bhc3NS
ZWZQdHI8RXZlbnQ+IERvY3VtZW50OjpjcmVhdGVFdmVudChjb25zdCBTdHJpbmcmIGV2ZW50VHlw
ZSwgRXhjZXB0aW9uQ29kZSYgZWMpCit7CisgICAgUmVmUHRyPEV2ZW50PiBldmVudCA9IEV2ZW50
RmFjdG9yeTo6Y3JlYXRlKGV2ZW50VHlwZSk7CisgICAgaWYgKGV2ZW50KQorICAgICAgICByZXR1
cm4gZXZlbnQucmVsZWFzZSgpOworCisgICAgZWMgPSBOT1RfU1VQUE9SVEVEX0VSUjsKKyAgICBy
ZXR1cm4gMDsKK30KKwordm9pZCBEb2N1bWVudDo6YWRkTXV0YXRpb25FdmVudExpc3RlbmVyVHlw
ZUlmRW5hYmxlZChMaXN0ZW5lclR5cGUgbGlzdGVuZXJUeXBlKQoreworICAgIGlmIChDb250ZXh0
RmVhdHVyZXM6Om11dGF0aW9uRXZlbnRzRW5hYmxlZCh0aGlzKSkKKyAgICAgICAgYWRkTGlzdGVu
ZXJUeXBlKGxpc3RlbmVyVHlwZSk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmFkZExpc3RlbmVyVHlw
ZUlmTmVlZGVkKGNvbnN0IEF0b21pY1N0cmluZyYgZXZlbnRUeXBlKQoreworICAgIGlmIChldmVu
dFR5cGUgPT0gZXZlbnROYW1lcygpLkRPTVN1YnRyZWVNb2RpZmllZEV2ZW50KQorICAgICAgICBh
ZGRNdXRhdGlvbkV2ZW50TGlzdGVuZXJUeXBlSWZFbmFibGVkKERPTVNVQlRSRUVNT0RJRklFRF9M
SVNURU5FUik7CisgICAgZWxzZSBpZiAoZXZlbnRUeXBlID09IGV2ZW50TmFtZXMoKS5ET01Ob2Rl
SW5zZXJ0ZWRFdmVudCkKKyAgICAgICAgYWRkTXV0YXRpb25FdmVudExpc3RlbmVyVHlwZUlmRW5h
YmxlZChET01OT0RFSU5TRVJURURfTElTVEVORVIpOworICAgIGVsc2UgaWYgKGV2ZW50VHlwZSA9
PSBldmVudE5hbWVzKCkuRE9NTm9kZVJlbW92ZWRFdmVudCkKKyAgICAgICAgYWRkTXV0YXRpb25F
dmVudExpc3RlbmVyVHlwZUlmRW5hYmxlZChET01OT0RFUkVNT1ZFRF9MSVNURU5FUik7CisgICAg
ZWxzZSBpZiAoZXZlbnRUeXBlID09IGV2ZW50TmFtZXMoKS5ET01Ob2RlUmVtb3ZlZEZyb21Eb2N1
bWVudEV2ZW50KQorICAgICAgICBhZGRNdXRhdGlvbkV2ZW50TGlzdGVuZXJUeXBlSWZFbmFibGVk
KERPTU5PREVSRU1PVkVERlJPTURPQ1VNRU5UX0xJU1RFTkVSKTsKKyAgICBlbHNlIGlmIChldmVu
dFR5cGUgPT0gZXZlbnROYW1lcygpLkRPTU5vZGVJbnNlcnRlZEludG9Eb2N1bWVudEV2ZW50KQor
ICAgICAgICBhZGRNdXRhdGlvbkV2ZW50TGlzdGVuZXJUeXBlSWZFbmFibGVkKERPTU5PREVJTlNF
UlRFRElOVE9ET0NVTUVOVF9MSVNURU5FUik7CisgICAgZWxzZSBpZiAoZXZlbnRUeXBlID09IGV2
ZW50TmFtZXMoKS5ET01BdHRyTW9kaWZpZWRFdmVudCkKKyAgICAgICAgYWRkTXV0YXRpb25FdmVu
dExpc3RlbmVyVHlwZUlmRW5hYmxlZChET01BVFRSTU9ESUZJRURfTElTVEVORVIpOworICAgIGVs
c2UgaWYgKGV2ZW50VHlwZSA9PSBldmVudE5hbWVzKCkuRE9NQ2hhcmFjdGVyRGF0YU1vZGlmaWVk
RXZlbnQpCisgICAgICAgIGFkZE11dGF0aW9uRXZlbnRMaXN0ZW5lclR5cGVJZkVuYWJsZWQoRE9N
Q0hBUkFDVEVSREFUQU1PRElGSUVEX0xJU1RFTkVSKTsKKyAgICBlbHNlIGlmIChldmVudFR5cGUg
PT0gZXZlbnROYW1lcygpLm92ZXJmbG93Y2hhbmdlZEV2ZW50KQorICAgICAgICBhZGRMaXN0ZW5l
clR5cGUoT1ZFUkZMT1dDSEFOR0VEX0xJU1RFTkVSKTsKKyAgICBlbHNlIGlmIChldmVudFR5cGUg
PT0gZXZlbnROYW1lcygpLndlYmtpdEFuaW1hdGlvblN0YXJ0RXZlbnQpCisgICAgICAgIGFkZExp
c3RlbmVyVHlwZShBTklNQVRJT05TVEFSVF9MSVNURU5FUik7CisgICAgZWxzZSBpZiAoZXZlbnRU
eXBlID09IGV2ZW50TmFtZXMoKS53ZWJraXRBbmltYXRpb25FbmRFdmVudCkKKyAgICAgICAgYWRk
TGlzdGVuZXJUeXBlKEFOSU1BVElPTkVORF9MSVNURU5FUik7CisgICAgZWxzZSBpZiAoZXZlbnRU
eXBlID09IGV2ZW50TmFtZXMoKS53ZWJraXRBbmltYXRpb25JdGVyYXRpb25FdmVudCkKKyAgICAg
ICAgYWRkTGlzdGVuZXJUeXBlKEFOSU1BVElPTklURVJBVElPTl9MSVNURU5FUik7CisgICAgZWxz
ZSBpZiAoZXZlbnRUeXBlID09IGV2ZW50TmFtZXMoKS53ZWJraXRUcmFuc2l0aW9uRW5kRXZlbnQp
CisgICAgICAgIGFkZExpc3RlbmVyVHlwZShUUkFOU0lUSU9ORU5EX0xJU1RFTkVSKTsKKyAgICBl
bHNlIGlmIChldmVudFR5cGUgPT0gZXZlbnROYW1lcygpLmJlZm9yZWxvYWRFdmVudCkKKyAgICAg
ICAgYWRkTGlzdGVuZXJUeXBlKEJFRk9SRUxPQURfTElTVEVORVIpOworICAgIGVsc2UgaWYgKGV2
ZW50VHlwZSA9PSBldmVudE5hbWVzKCkuc2Nyb2xsRXZlbnQpCisgICAgICAgIGFkZExpc3RlbmVy
VHlwZShTQ1JPTExfTElTVEVORVIpOworfQorCitDU1NTdHlsZURlY2xhcmF0aW9uKiBEb2N1bWVu
dDo6Z2V0T3ZlcnJpZGVTdHlsZShFbGVtZW50KiwgY29uc3QgU3RyaW5nJikKK3sKKyAgICByZXR1
cm4gMDsKK30KKworSFRNTEZyYW1lT3duZXJFbGVtZW50KiBEb2N1bWVudDo6b3duZXJFbGVtZW50
KCkgY29uc3QKK3sKKyAgICBpZiAoIWZyYW1lKCkpCisgICAgICAgIHJldHVybiAwOworICAgIHJl
dHVybiBmcmFtZSgpLT5vd25lckVsZW1lbnQoKTsKK30KKworU3RyaW5nIERvY3VtZW50Ojpjb29r
aWUoRXhjZXB0aW9uQ29kZSYgZWMpIGNvbnN0Cit7CisgICAgaWYgKHBhZ2UoKSAmJiAhcGFnZSgp
LT5zZXR0aW5ncygpLT5jb29raWVFbmFibGVkKCkpCisgICAgICAgIHJldHVybiBTdHJpbmcoKTsK
KworICAgIC8vIEZJWE1FOiBUaGUgSFRNTDUgRE9NIHNwZWMgc3RhdGVzIHRoYXQgdGhpcyBhdHRy
aWJ1dGUgY2FuIHJhaXNlIGFuCisgICAgLy8gSU5WQUxJRF9TVEFURV9FUlIgZXhjZXB0aW9uIG9u
IGdldHRpbmcgaWYgdGhlIERvY3VtZW50IGhhcyBubworICAgIC8vIGJyb3dzaW5nIGNvbnRleHQu
CisKKyAgICBpZiAoIXNlY3VyaXR5T3JpZ2luKCktPmNhbkFjY2Vzc0Nvb2tpZXMoKSkgeworICAg
ICAgICBlYyA9IFNFQ1VSSVRZX0VSUjsKKyAgICAgICAgcmV0dXJuIFN0cmluZygpOworICAgIH0K
KworICAgIEtVUkwgY29va2llVVJMID0gdGhpcy0+Y29va2llVVJMKCk7CisgICAgaWYgKGNvb2tp
ZVVSTC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBTdHJpbmcoKTsKKworICAgIHJldHVybiBj
b29raWVzKHRoaXMsIGNvb2tpZVVSTCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnNldENvb2tpZShj
b25zdCBTdHJpbmcmIHZhbHVlLCBFeGNlcHRpb25Db2RlJiBlYykKK3sKKyAgICBpZiAocGFnZSgp
ICYmICFwYWdlKCktPnNldHRpbmdzKCktPmNvb2tpZUVuYWJsZWQoKSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgLy8gRklYTUU6IFRoZSBIVE1MNSBET00gc3BlYyBzdGF0ZXMgdGhhdCB0aGlzIGF0
dHJpYnV0ZSBjYW4gcmFpc2UgYW4KKyAgICAvLyBJTlZBTElEX1NUQVRFX0VSUiBleGNlcHRpb24g
b24gc2V0dGluZyBpZiB0aGUgRG9jdW1lbnQgaGFzIG5vCisgICAgLy8gYnJvd3NpbmcgY29udGV4
dC4KKworICAgIGlmICghc2VjdXJpdHlPcmlnaW4oKS0+Y2FuQWNjZXNzQ29va2llcygpKSB7Cisg
ICAgICAgIGVjID0gU0VDVVJJVFlfRVJSOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAg
S1VSTCBjb29raWVVUkwgPSB0aGlzLT5jb29raWVVUkwoKTsKKyAgICBpZiAoY29va2llVVJMLmlz
RW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgc2V0Q29va2llcyh0aGlzLCBjb29raWVV
UkwsIHZhbHVlKTsKK30KKworU3RyaW5nIERvY3VtZW50OjpyZWZlcnJlcigpIGNvbnN0Cit7Cisg
ICAgaWYgKGZyYW1lKCkpCisgICAgICAgIHJldHVybiBmcmFtZSgpLT5sb2FkZXIoKS0+cmVmZXJy
ZXIoKTsKKyAgICByZXR1cm4gU3RyaW5nKCk7Cit9CisKK1N0cmluZyBEb2N1bWVudDo6ZG9tYWlu
KCkgY29uc3QKK3sKKyAgICByZXR1cm4gc2VjdXJpdHlPcmlnaW4oKS0+ZG9tYWluKCk7Cit9CisK
K3ZvaWQgRG9jdW1lbnQ6OnNldERvbWFpbihjb25zdCBTdHJpbmcmIG5ld0RvbWFpbiwgRXhjZXB0
aW9uQ29kZSYgZWMpCit7CisgICAgaWYgKFNjaGVtZVJlZ2lzdHJ5Ojppc0RvbWFpblJlbGF4YXRp
b25Gb3JiaWRkZW5Gb3JVUkxTY2hlbWUoc2VjdXJpdHlPcmlnaW4oKS0+cHJvdG9jb2woKSkpIHsK
KyAgICAgICAgZWMgPSBTRUNVUklUWV9FUlI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAg
ICAvLyBCb3RoIE5TIGFuZCBJRSBzcGVjaWZ5IHRoYXQgY2hhbmdpbmcgdGhlIGRvbWFpbiBpcyBv
bmx5IGFsbG93ZWQgd2hlbgorICAgIC8vIHRoZSBuZXcgZG9tYWluIGlzIGEgc3VmZml4IG9mIHRo
ZSBvbGQgZG9tYWluLgorCisgICAgLy8gRklYTUU6IFdlIHNob3VsZCBhZGQgbG9nZ2luZyBpbmRp
Y2F0aW5nIHdoeSBhIGRvbWFpbiB3YXMgbm90IGFsbG93ZWQuCisKKyAgICAvLyBJZiB0aGUgbmV3
IGRvbWFpbiBpcyB0aGUgc2FtZSBhcyB0aGUgb2xkIGRvbWFpbiwgc3RpbGwgY2FsbAorICAgIC8v
IHNlY3VyaXR5T3JpZ2luKCktPnNldERvbWFpbkZvckRPTS4gVGhpcyB3aWxsIGNoYW5nZSB0aGUK
KyAgICAvLyBzZWN1cml0eSBjaGVjayBiZWhhdmlvci4gRm9yIGV4YW1wbGUsIGlmIGEgcGFnZSBs
b2FkZWQgb24gcG9ydCA4MDAwCisgICAgLy8gYXNzaWducyBpdHMgY3VycmVudCBkb21haW4gdXNp
bmcgZG9jdW1lbnQuZG9tYWluLCB0aGUgcGFnZSB3aWxsCisgICAgLy8gYWxsb3cgb3RoZXIgcGFn
ZXMgbG9hZGVkIG9uIGRpZmZlcmVudCBwb3J0cyBpbiB0aGUgc2FtZSBkb21haW4gdGhhdAorICAg
IC8vIGhhdmUgYWxzbyBhc3NpZ25lZCB0byBhY2Nlc3MgdGhpcyBwYWdlLgorICAgIGlmIChlcXVh
bElnbm9yaW5nQ2FzZShkb21haW4oKSwgbmV3RG9tYWluKSkgeworICAgICAgICBzZWN1cml0eU9y
aWdpbigpLT5zZXREb21haW5Gcm9tRE9NKG5ld0RvbWFpbik7CisgICAgICAgIGlmIChtX2ZyYW1l
KQorICAgICAgICAgICAgbV9mcmFtZS0+c2NyaXB0KCktPnVwZGF0ZVNlY3VyaXR5T3JpZ2luKCk7
CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQgb2xkTGVuZ3RoID0gZG9tYWluKCku
bGVuZ3RoKCk7CisgICAgaW50IG5ld0xlbmd0aCA9IG5ld0RvbWFpbi5sZW5ndGgoKTsKKyAgICAv
LyBlLmcuIG5ld0RvbWFpbiA9IHdlYmtpdC5vcmcgKDEwKSBhbmQgZG9tYWluKCkgPSB3d3cud2Vi
a2l0Lm9yZyAoMTQpCisgICAgaWYgKG5ld0xlbmd0aCA+PSBvbGRMZW5ndGgpIHsKKyAgICAgICAg
ZWMgPSBTRUNVUklUWV9FUlI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBTdHJpbmcg
dGVzdCA9IGRvbWFpbigpOworICAgIC8vIENoZWNrIHRoYXQgaXQncyBhIHN1YmRvbWFpbiwgbm90
IGUuZy4gImVia2l0Lm9yZyIKKyAgICBpZiAodGVzdFtvbGRMZW5ndGggLSBuZXdMZW5ndGggLSAx
XSAhPSAnLicpIHsKKyAgICAgICAgZWMgPSBTRUNVUklUWV9FUlI7CisgICAgICAgIHJldHVybjsK
KyAgICB9CisKKyAgICAvLyBOb3cgdGVzdCBpcyAid2Via2l0Lm9yZyIgZnJvbSBkb21haW4oKQor
ICAgIC8vIGFuZCB3ZSBjaGVjayB0aGF0IGl0J3MgdGhlIHNhbWUgdGhpbmcgYXMgbmV3RG9tYWlu
CisgICAgdGVzdC5yZW1vdmUoMCwgb2xkTGVuZ3RoIC0gbmV3TGVuZ3RoKTsKKyAgICBpZiAodGVz
dCAhPSBuZXdEb21haW4pIHsKKyAgICAgICAgZWMgPSBTRUNVUklUWV9FUlI7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisKKyAgICBzZWN1cml0eU9yaWdpbigpLT5zZXREb21haW5Gcm9tRE9NKG5l
d0RvbWFpbik7CisgICAgaWYgKG1fZnJhbWUpCisgICAgICAgIG1fZnJhbWUtPnNjcmlwdCgpLT51
cGRhdGVTZWN1cml0eU9yaWdpbigpOworfQorCisvLyBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3Bl
Y3Mvd2ViLWFwcHMvY3VycmVudC13b3JrLyNkb20tZG9jdW1lbnQtbGFzdG1vZGlmaWVkCitTdHJp
bmcgRG9jdW1lbnQ6Omxhc3RNb2RpZmllZCgpIGNvbnN0Cit7CisgICAgRGF0ZUNvbXBvbmVudHMg
ZGF0ZTsKKyAgICBib29sIGZvdW5kRGF0ZSA9IGZhbHNlOworICAgIGlmIChtX2ZyYW1lKSB7Cisg
ICAgICAgIFN0cmluZyBodHRwTGFzdE1vZGlmaWVkOworICAgICAgICBpZiAoRG9jdW1lbnRMb2Fk
ZXIqIGRvY3VtZW50TG9hZGVyID0gbG9hZGVyKCkpIAorICAgICAgICAgICAgaHR0cExhc3RNb2Rp
ZmllZCA9IGRvY3VtZW50TG9hZGVyLT5yZXNwb25zZSgpLmh0dHBIZWFkZXJGaWVsZCgiTGFzdC1N
b2RpZmllZCIpOworICAgICAgICBpZiAoIWh0dHBMYXN0TW9kaWZpZWQuaXNFbXB0eSgpKSB7Cisg
ICAgICAgICAgICBkYXRlLnNldE1pbGxpc2Vjb25kc1NpbmNlRXBvY2hGb3JEYXRlVGltZShwYXJz
ZURhdGUoaHR0cExhc3RNb2RpZmllZCkpOworICAgICAgICAgICAgZm91bmREYXRlID0gdHJ1ZTsK
KyAgICAgICAgfQorICAgIH0KKyAgICAvLyBGSVhNRTogSWYgdGhpcyBkb2N1bWVudCBjYW1lIGZy
b20gdGhlIGZpbGUgc3lzdGVtLCB0aGUgSFRNTDUKKyAgICAvLyBzcGVjaWZpY2lhdGlvbiB0ZWxs
cyB1cyB0byByZWFkIHRoZSBsYXN0IG1vZGlmaWNhdGlvbiBkYXRlIGZyb20gdGhlIGZpbGUKKyAg
ICAvLyBzeXN0ZW0uCisgICAgaWYgKCFmb3VuZERhdGUpCisgICAgICAgIGRhdGUuc2V0TWlsbGlz
ZWNvbmRzU2luY2VFcG9jaEZvckRhdGVUaW1lKGN1cnJlbnRUaW1lTVMoKSk7CisgICAgcmV0dXJu
IFN0cmluZzo6Zm9ybWF0KCIlMDJkLyUwMmQvJTA0ZCAlMDJkOiUwMmQ6JTAyZCIsIGRhdGUubW9u
dGgoKSArIDEsIGRhdGUubW9udGhEYXkoKSwgZGF0ZS5mdWxsWWVhcigpLCBkYXRlLmhvdXIoKSwg
ZGF0ZS5taW51dGUoKSwgZGF0ZS5zZWNvbmQoKSk7Cit9CisKK3N0YXRpYyBib29sIGlzVmFsaWRO
YW1lTm9uQVNDSUkoY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMsIHVuc2lnbmVkIGxlbmd0aCkKK3sK
KyAgICB1bnNpZ25lZCBpID0gMDsKKworICAgIFVDaGFyMzIgYzsKKyAgICBVMTZfTkVYVChjaGFy
YWN0ZXJzLCBpLCBsZW5ndGgsIGMpCisgICAgaWYgKCFpc1ZhbGlkTmFtZVN0YXJ0KGMpKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICB3aGlsZSAoaSA8IGxlbmd0aCkgeworICAgICAgICBV
MTZfTkVYVChjaGFyYWN0ZXJzLCBpLCBsZW5ndGgsIGMpCisgICAgICAgIGlmICghaXNWYWxpZE5h
bWVQYXJ0KGMpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVy
biB0cnVlOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBDaGFyVHlwZT4KK3N0YXRpYyBpbmxpbmUg
Ym9vbCBpc1ZhbGlkTmFtZUFTQ0lJKGNvbnN0IENoYXJUeXBlKiBjaGFyYWN0ZXJzLCB1bnNpZ25l
ZCBsZW5ndGgpCit7CisgICAgQ2hhclR5cGUgYyA9IGNoYXJhY3RlcnNbMF07CisgICAgaWYgKCEo
aXNBU0NJSUFscGhhKGMpIHx8IGMgPT0gJzonIHx8IGMgPT0gJ18nKSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8IGxlbmd0aDsgKytpKSB7Cisg
ICAgICAgIGMgPSBjaGFyYWN0ZXJzW2ldOworICAgICAgICBpZiAoIShpc0FTQ0lJQWxwaGFudW1l
cmljKGMpIHx8IGMgPT0gJzonIHx8IGMgPT0gJ18nIHx8IGMgPT0gJy0nIHx8IGMgPT0gJy4nKSkK
KyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30K
KworYm9vbCBEb2N1bWVudDo6aXNWYWxpZE5hbWUoY29uc3QgU3RyaW5nJiBuYW1lKQoreworICAg
IHVuc2lnbmVkIGxlbmd0aCA9IG5hbWUubGVuZ3RoKCk7CisgICAgaWYgKCFsZW5ndGgpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgIGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzOworICAgIGlm
IChuYW1lLmlzOEJpdCgpKSB7CisgICAgICAgIGlmIChpc1ZhbGlkTmFtZUFTQ0lJKG5hbWUuY2hh
cmFjdGVyczgoKSwgbGVuZ3RoKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBj
aGFyYWN0ZXJzID0gbmFtZS5jaGFyYWN0ZXJzKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2hh
cmFjdGVycyA9IG5hbWUuY2hhcmFjdGVyczE2KCk7CisgICAgICAgIGlmIChpc1ZhbGlkTmFtZUFT
Q0lJKGNoYXJhY3RlcnMsIGxlbmd0aCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9
CisgICAgcmV0dXJuIGlzVmFsaWROYW1lTm9uQVNDSUkoY2hhcmFjdGVycywgbGVuZ3RoKTsKK30K
KworYm9vbCBEb2N1bWVudDo6cGFyc2VRdWFsaWZpZWROYW1lKGNvbnN0IFN0cmluZyYgcXVhbGlm
aWVkTmFtZSwgU3RyaW5nJiBwcmVmaXgsIFN0cmluZyYgbG9jYWxOYW1lLCBFeGNlcHRpb25Db2Rl
JiBlYykKK3sKKyAgICB1bnNpZ25lZCBsZW5ndGggPSBxdWFsaWZpZWROYW1lLmxlbmd0aCgpOwor
CisgICAgaWYgKCFsZW5ndGgpIHsKKyAgICAgICAgZWMgPSBJTlZBTElEX0NIQVJBQ1RFUl9FUlI7
CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIG5hbWVTdGFydCA9IHRy
dWU7CisgICAgYm9vbCBzYXdDb2xvbiA9IGZhbHNlOworICAgIGludCBjb2xvblBvcyA9IDA7CisK
KyAgICBjb25zdCBVQ2hhciogcyA9IHF1YWxpZmllZE5hbWUuY2hhcmFjdGVycygpOworICAgIGZv
ciAodW5zaWduZWQgaSA9IDA7IGkgPCBsZW5ndGg7KSB7CisgICAgICAgIFVDaGFyMzIgYzsKKyAg
ICAgICAgVTE2X05FWFQocywgaSwgbGVuZ3RoLCBjKQorICAgICAgICBpZiAoYyA9PSAnOicpIHsK
KyAgICAgICAgICAgIGlmIChzYXdDb2xvbikgeworICAgICAgICAgICAgICAgIGVjID0gTkFNRVNQ
QUNFX0VSUjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIG11bHRpcGxlIGNvbG9u
czogbm90IGFsbG93ZWQKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5hbWVTdGFydCA9IHRy
dWU7CisgICAgICAgICAgICBzYXdDb2xvbiA9IHRydWU7CisgICAgICAgICAgICBjb2xvblBvcyA9
IGkgLSAxOworICAgICAgICB9IGVsc2UgaWYgKG5hbWVTdGFydCkgeworICAgICAgICAgICAgaWYg
KCFpc1ZhbGlkTmFtZVN0YXJ0KGMpKSB7CisgICAgICAgICAgICAgICAgZWMgPSBJTlZBTElEX0NI
QVJBQ1RFUl9FUlI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAg
fQorICAgICAgICAgICAgbmFtZVN0YXJ0ID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAg
ICAgICAgICBpZiAoIWlzVmFsaWROYW1lUGFydChjKSkgeworICAgICAgICAgICAgICAgIGVjID0g
SU5WQUxJRF9DSEFSQUNURVJfRVJSOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghc2F3Q29sb24pIHsKKyAg
ICAgICAgcHJlZml4ID0gU3RyaW5nKCk7CisgICAgICAgIGxvY2FsTmFtZSA9IHF1YWxpZmllZE5h
bWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJlZml4ID0gcXVhbGlmaWVkTmFtZS5zdWJzdHJp
bmcoMCwgY29sb25Qb3MpOworICAgICAgICBpZiAocHJlZml4LmlzRW1wdHkoKSkgeworICAgICAg
ICAgICAgZWMgPSBOQU1FU1BBQ0VfRVJSOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgICB9CisgICAgICAgIGxvY2FsTmFtZSA9IHF1YWxpZmllZE5hbWUuc3Vic3RyaW5nKGNvbG9u
UG9zICsgMSk7CisgICAgfQorCisgICAgaWYgKGxvY2FsTmFtZS5pc0VtcHR5KCkpIHsKKyAgICAg
ICAgZWMgPSBOQU1FU1BBQ0VfRVJSOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisg
ICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnNldERlY29kZXIoUGFzc1JlZlB0
cjxUZXh0UmVzb3VyY2VEZWNvZGVyPiBkZWNvZGVyKQoreworICAgIG1fZGVjb2RlciA9IGRlY29k
ZXI7Cit9CisKK0tVUkwgRG9jdW1lbnQ6OmNvbXBsZXRlVVJMKGNvbnN0IFN0cmluZyYgdXJsLCBj
b25zdCBLVVJMJiBiYXNlVVJMT3ZlcnJpZGUpIGNvbnN0Cit7CisgICAgLy8gQWx3YXlzIHJldHVy
biBhIG51bGwgVVJMIHdoZW4gcGFzc2VkIGEgbnVsbCBzdHJpbmcuCisgICAgLy8gRklYTUU6IFNo
b3VsZCB3ZSBjaGFuZ2UgdGhlIEtVUkwgY29uc3RydWN0b3IgdG8gaGF2ZSB0aGlzIGJlaGF2aW9y
PworICAgIC8vIFNlZSBhbHNvIFtDU1NdU3R5bGVTaGVldDo6Y29tcGxldGVVUkwoY29uc3QgU3Ry
aW5nJikKKyAgICBpZiAodXJsLmlzTnVsbCgpKQorICAgICAgICByZXR1cm4gS1VSTCgpOworICAg
IGNvbnN0IEtVUkwmIGJhc2VVUkwgPSAoKGJhc2VVUkxPdmVycmlkZS5pc0VtcHR5KCkgfHwgYmFz
ZVVSTE92ZXJyaWRlID09IGJsYW5rVVJMKCkpICYmIHBhcmVudERvY3VtZW50KCkpID8gcGFyZW50
RG9jdW1lbnQoKS0+YmFzZVVSTCgpIDogYmFzZVVSTE92ZXJyaWRlOworICAgIGlmICghbV9kZWNv
ZGVyKQorICAgICAgICByZXR1cm4gS1VSTChiYXNlVVJMLCB1cmwpOworICAgIHJldHVybiBLVVJM
KGJhc2VVUkwsIHVybCwgbV9kZWNvZGVyLT5lbmNvZGluZygpKTsKK30KKworS1VSTCBEb2N1bWVu
dDo6Y29tcGxldGVVUkwoY29uc3QgU3RyaW5nJiB1cmwpIGNvbnN0Cit7CisgICAgcmV0dXJuIGNv
bXBsZXRlVVJMKHVybCwgbV9iYXNlVVJMKTsKK30KKwordm9pZCBEb2N1bWVudDo6c2V0SW5QYWdl
Q2FjaGUoYm9vbCBmbGFnKQoreworICAgIGlmIChtX2luUGFnZUNhY2hlID09IGZsYWcpCisgICAg
ICAgIHJldHVybjsKKworICAgIG1faW5QYWdlQ2FjaGUgPSBmbGFnOworCisgICAgRnJhbWVWaWV3
KiB2ID0gdmlldygpOworICAgIGlmIChmbGFnKSB7CisgICAgICAgIEFTU0VSVCghbV9zYXZlZFJl
bmRlcmVyKTsKKyAgICAgICAgbV9zYXZlZFJlbmRlcmVyID0gcmVuZGVyZXIoKTsKKyAgICAgICAg
aWYgKHYpIHsKKyAgICAgICAgICAgIHYtPmNhY2hlQ3VycmVudFNjcm9sbFBvc2l0aW9uKCk7Cisg
ICAgICAgICAgICBpZiAocGFnZSgpICYmIHBhZ2UoKS0+bWFpbkZyYW1lKCkgPT0gbV9mcmFtZSkK
KyAgICAgICAgICAgICAgICB2LT5yZXNldFNjcm9sbGJhcnNBbmRDbGVhckNvbnRlbnRzU2l6ZSgp
OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHYtPnJlc2V0U2Nyb2xsYmFycygp
OworICAgICAgICB9CisgICAgICAgIG1fc3R5bGVSZWNhbGNUaW1lci5zdG9wKCk7CisgICAgfSBl
bHNlIHsKKyAgICAgICAgQVNTRVJUKCFyZW5kZXJlcigpIHx8IHJlbmRlcmVyKCkgPT0gbV9zYXZl
ZFJlbmRlcmVyKTsKKyAgICAgICAgQVNTRVJUKG1fcmVuZGVyQXJlbmEpOworICAgICAgICBzZXRS
ZW5kZXJlcihtX3NhdmVkUmVuZGVyZXIpOworICAgICAgICBtX3NhdmVkUmVuZGVyZXIgPSAwOwor
CisgICAgICAgIGlmIChjaGlsZE5lZWRzU3R5bGVSZWNhbGMoKSkKKyAgICAgICAgICAgIHNjaGVk
dWxlU3R5bGVSZWNhbGMoKTsKKyAgICB9Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmRvY3VtZW50V2ls
bEJlY29tZUluYWN0aXZlKCkKK3sKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisg
ICAgaWYgKHJlbmRlcmVyKCkpCisgICAgICAgIHJlbmRlclZpZXcoKS0+d2lsbE1vdmVPZmZzY3Jl
ZW4oKTsKKyNlbmRpZgorfQorCit2b2lkIERvY3VtZW50Ojpkb2N1bWVudFdpbGxTdXNwZW5kRm9y
UGFnZUNhY2hlKCkKK3sKKyAgICBkb2N1bWVudFdpbGxCZWNvbWVJbmFjdGl2ZSgpOworCisgICAg
SGFzaFNldDxFbGVtZW50Kj46Oml0ZXJhdG9yIGVuZCA9IG1fZG9jdW1lbnRTdXNwZW5zaW9uQ2Fs
bGJhY2tFbGVtZW50cy5lbmQoKTsKKyAgICBmb3IgKEhhc2hTZXQ8RWxlbWVudCo+OjppdGVyYXRv
ciBpID0gbV9kb2N1bWVudFN1c3BlbnNpb25DYWxsYmFja0VsZW1lbnRzLmJlZ2luKCk7IGkgIT0g
ZW5kOyArK2kpCisgICAgICAgICgqaSktPmRvY3VtZW50V2lsbFN1c3BlbmRGb3JQYWdlQ2FjaGUo
KTsKKworI2lmbmRlZiBOREVCVUcKKyAgICAvLyBDbGVhciB0aGUgdXBkYXRlIGZsYWcgdG8gYmUg
YWJsZSB0byBjaGVjayBpZiB0aGUgdmlld3BvcnQgYXJndW1lbnRzIHVwZGF0ZQorICAgIC8vIGlz
IGRpc3BhdGNoZWQsIGFmdGVyIHRoZSBkb2N1bWVudCBpcyByZXN0b3JlZCBmcm9tIHRoZSBwYWdl
IGNhY2hlLgorICAgIG1fZGlkRGlzcGF0Y2hWaWV3cG9ydFByb3BlcnRpZXNDaGFuZ2VkID0gZmFs
c2U7CisjZW5kaWYKK30KKwordm9pZCBEb2N1bWVudDo6ZG9jdW1lbnREaWRSZXN1bWVGcm9tUGFn
ZUNhY2hlKCkgCit7CisgICAgVmVjdG9yPEVsZW1lbnQqPiBlbGVtZW50czsKKyAgICBjb3B5VG9W
ZWN0b3IobV9kb2N1bWVudFN1c3BlbnNpb25DYWxsYmFja0VsZW1lbnRzLCBlbGVtZW50cyk7Cisg
ICAgVmVjdG9yPEVsZW1lbnQqPjo6aXRlcmF0b3IgZW5kID0gZWxlbWVudHMuZW5kKCk7CisgICAg
Zm9yIChWZWN0b3I8RWxlbWVudCo+OjppdGVyYXRvciBpID0gZWxlbWVudHMuYmVnaW4oKTsgaSAh
PSBlbmQ7ICsraSkKKyAgICAgICAgKCppKS0+ZG9jdW1lbnREaWRSZXN1bWVGcm9tUGFnZUNhY2hl
KCk7CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgaWYgKHJlbmRlcmVy
KCkpCisgICAgICAgIHJlbmRlclZpZXcoKS0+ZGlkTW92ZU9uc2NyZWVuKCk7CisjZW5kaWYKKwor
ICAgIGlmIChGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHZpZXcoKSkKKyAgICAgICAgZnJhbWVWaWV3
LT5zZXRBbmltYXRvcnNBcmVBY3RpdmUoKTsKKworICAgIEFTU0VSVChtX2ZyYW1lKTsKKyAgICBt
X2ZyYW1lLT5sb2FkZXIoKS0+Y2xpZW50KCktPmRpc3BhdGNoRGlkQmVjb21lRnJhbWVzZXQoaXNG
cmFtZVNldCgpKTsKK30KKwordm9pZCBEb2N1bWVudDo6cmVnaXN0ZXJGb3JQYWdlQ2FjaGVTdXNw
ZW5zaW9uQ2FsbGJhY2tzKEVsZW1lbnQqIGUpCit7CisgICAgbV9kb2N1bWVudFN1c3BlbnNpb25D
YWxsYmFja0VsZW1lbnRzLmFkZChlKTsKK30KKwordm9pZCBEb2N1bWVudDo6dW5yZWdpc3RlckZv
clBhZ2VDYWNoZVN1c3BlbnNpb25DYWxsYmFja3MoRWxlbWVudCogZSkKK3sKKyAgICBtX2RvY3Vt
ZW50U3VzcGVuc2lvbkNhbGxiYWNrRWxlbWVudHMucmVtb3ZlKGUpOworfQorCit2b2lkIERvY3Vt
ZW50OjptZWRpYVZvbHVtZURpZENoYW5nZSgpIAoreworICAgIEhhc2hTZXQ8RWxlbWVudCo+Ojpp
dGVyYXRvciBlbmQgPSBtX21lZGlhVm9sdW1lQ2FsbGJhY2tFbGVtZW50cy5lbmQoKTsKKyAgICBm
b3IgKEhhc2hTZXQ8RWxlbWVudCo+OjppdGVyYXRvciBpID0gbV9tZWRpYVZvbHVtZUNhbGxiYWNr
RWxlbWVudHMuYmVnaW4oKTsgaSAhPSBlbmQ7ICsraSkKKyAgICAgICAgKCppKS0+bWVkaWFWb2x1
bWVEaWRDaGFuZ2UoKTsKK30KKwordm9pZCBEb2N1bWVudDo6cmVnaXN0ZXJGb3JNZWRpYVZvbHVt
ZUNhbGxiYWNrcyhFbGVtZW50KiBlKQoreworICAgIG1fbWVkaWFWb2x1bWVDYWxsYmFja0VsZW1l
bnRzLmFkZChlKTsKK30KKwordm9pZCBEb2N1bWVudDo6dW5yZWdpc3RlckZvck1lZGlhVm9sdW1l
Q2FsbGJhY2tzKEVsZW1lbnQqIGUpCit7CisgICAgbV9tZWRpYVZvbHVtZUNhbGxiYWNrRWxlbWVu
dHMucmVtb3ZlKGUpOworfQorCit2b2lkIERvY3VtZW50OjpzdG9yYWdlQmxvY2tpbmdTdGF0ZURp
ZENoYW5nZSgpCit7CisgICAgaWYgKFNldHRpbmdzKiBzZXR0aW5ncyA9IHRoaXMtPnNldHRpbmdz
KCkpCisgICAgICAgIHNlY3VyaXR5T3JpZ2luKCktPnNldFN0b3JhZ2VCbG9ja2luZ1BvbGljeShz
ZXR0aW5ncy0+c3RvcmFnZUJsb2NraW5nUG9saWN5KCkpOworfQorCit2b2lkIERvY3VtZW50Ojpw
cml2YXRlQnJvd3NpbmdTdGF0ZURpZENoYW5nZSgpIAoreworICAgIEhhc2hTZXQ8RWxlbWVudCo+
OjppdGVyYXRvciBlbmQgPSBtX3ByaXZhdGVCcm93c2luZ1N0YXRlQ2hhbmdlZEVsZW1lbnRzLmVu
ZCgpOworICAgIGZvciAoSGFzaFNldDxFbGVtZW50Kj46Oml0ZXJhdG9yIGl0ID0gbV9wcml2YXRl
QnJvd3NpbmdTdGF0ZUNoYW5nZWRFbGVtZW50cy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpCisg
ICAgICAgICgqaXQpLT5wcml2YXRlQnJvd3NpbmdTdGF0ZURpZENoYW5nZSgpOworfQorCit2b2lk
IERvY3VtZW50OjpyZWdpc3RlckZvclByaXZhdGVCcm93c2luZ1N0YXRlQ2hhbmdlZENhbGxiYWNr
cyhFbGVtZW50KiBlKQoreworICAgIG1fcHJpdmF0ZUJyb3dzaW5nU3RhdGVDaGFuZ2VkRWxlbWVu
dHMuYWRkKGUpOworfQorCit2b2lkIERvY3VtZW50Ojp1bnJlZ2lzdGVyRm9yUHJpdmF0ZUJyb3dz
aW5nU3RhdGVDaGFuZ2VkQ2FsbGJhY2tzKEVsZW1lbnQqIGUpCit7CisgICAgbV9wcml2YXRlQnJv
d3NpbmdTdGF0ZUNoYW5nZWRFbGVtZW50cy5yZW1vdmUoZSk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6
OnNldFNob3VsZENyZWF0ZVJlbmRlcmVycyhib29sIGYpCit7CisgICAgbV9jcmVhdGVSZW5kZXJl
cnMgPSBmOworfQorCitib29sIERvY3VtZW50OjpzaG91bGRDcmVhdGVSZW5kZXJlcnMoKQorewor
ICAgIHJldHVybiBtX2NyZWF0ZVJlbmRlcmVyczsKK30KKworLy8gU3VwcG9ydCBmb3IgSmF2YXNj
cmlwdCBleGVjQ29tbWFuZCwgYW5kIHJlbGF0ZWQgbWV0aG9kcworCitzdGF0aWMgRWRpdG9yOjpD
b21tYW5kIGNvbW1hbmQoRG9jdW1lbnQqIGRvY3VtZW50LCBjb25zdCBTdHJpbmcmIGNvbW1hbmRO
YW1lLCBib29sIHVzZXJJbnRlcmZhY2UgPSBmYWxzZSkKK3sKKyAgICBGcmFtZSogZnJhbWUgPSBk
b2N1bWVudC0+ZnJhbWUoKTsKKyAgICBpZiAoIWZyYW1lIHx8IGZyYW1lLT5kb2N1bWVudCgpICE9
IGRvY3VtZW50KQorICAgICAgICByZXR1cm4gRWRpdG9yOjpDb21tYW5kKCk7CisKKyAgICBkb2N1
bWVudC0+dXBkYXRlU3R5bGVJZk5lZWRlZCgpOworCisgICAgcmV0dXJuIGZyYW1lLT5lZGl0b3Io
KS0+Y29tbWFuZChjb21tYW5kTmFtZSwKKyAgICAgICAgdXNlckludGVyZmFjZSA/IENvbW1hbmRG
cm9tRE9NV2l0aFVzZXJJbnRlcmZhY2UgOiBDb21tYW5kRnJvbURPTSk7Cit9CisKK2Jvb2wgRG9j
dW1lbnQ6OmV4ZWNDb21tYW5kKGNvbnN0IFN0cmluZyYgY29tbWFuZE5hbWUsIGJvb2wgdXNlcklu
dGVyZmFjZSwgY29uc3QgU3RyaW5nJiB2YWx1ZSkKK3sKKyAgICByZXR1cm4gY29tbWFuZCh0aGlz
LCBjb21tYW5kTmFtZSwgdXNlckludGVyZmFjZSkuZXhlY3V0ZSh2YWx1ZSk7Cit9CisKK2Jvb2wg
RG9jdW1lbnQ6OnF1ZXJ5Q29tbWFuZEVuYWJsZWQoY29uc3QgU3RyaW5nJiBjb21tYW5kTmFtZSkK
K3sKKyAgICByZXR1cm4gY29tbWFuZCh0aGlzLCBjb21tYW5kTmFtZSkuaXNFbmFibGVkKCk7Cit9
CisKK2Jvb2wgRG9jdW1lbnQ6OnF1ZXJ5Q29tbWFuZEluZGV0ZXJtKGNvbnN0IFN0cmluZyYgY29t
bWFuZE5hbWUpCit7CisgICAgcmV0dXJuIGNvbW1hbmQodGhpcywgY29tbWFuZE5hbWUpLnN0YXRl
KCkgPT0gTWl4ZWRUcmlTdGF0ZTsKK30KKworYm9vbCBEb2N1bWVudDo6cXVlcnlDb21tYW5kU3Rh
dGUoY29uc3QgU3RyaW5nJiBjb21tYW5kTmFtZSkKK3sKKyAgICByZXR1cm4gY29tbWFuZCh0aGlz
LCBjb21tYW5kTmFtZSkuc3RhdGUoKSA9PSBUcnVlVHJpU3RhdGU7Cit9CisKK2Jvb2wgRG9jdW1l
bnQ6OnF1ZXJ5Q29tbWFuZFN1cHBvcnRlZChjb25zdCBTdHJpbmcmIGNvbW1hbmROYW1lKQorewor
ICAgIHJldHVybiBjb21tYW5kKHRoaXMsIGNvbW1hbmROYW1lKS5pc1N1cHBvcnRlZCgpOworfQor
CitTdHJpbmcgRG9jdW1lbnQ6OnF1ZXJ5Q29tbWFuZFZhbHVlKGNvbnN0IFN0cmluZyYgY29tbWFu
ZE5hbWUpCit7CisgICAgcmV0dXJuIGNvbW1hbmQodGhpcywgY29tbWFuZE5hbWUpLnZhbHVlKCk7
Cit9CisKK0tVUkwgRG9jdW1lbnQ6Om9wZW5TZWFyY2hEZXNjcmlwdGlvblVSTCgpCit7CisgICAg
c3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IG9wZW5TZWFyY2hNSU1FVHlwZSA9ICJhcHBsaWNhdGlv
bi9vcGVuc2VhcmNoZGVzY3JpcHRpb24reG1sIjsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogY29u
c3Qgb3BlblNlYXJjaFJlbGF0aW9uID0gInNlYXJjaCI7CisKKyAgICAvLyBGSVhNRTogV2h5IGRv
IG9ubHkgdG9wLWxldmVsIGZyYW1lcyBoYXZlIG9wZW5TZWFyY2hEZXNjcmlwdGlvblVSTHM/Cisg
ICAgaWYgKCFmcmFtZSgpIHx8IGZyYW1lKCktPnRyZWUoKS0+cGFyZW50KCkpCisgICAgICAgIHJl
dHVybiBLVVJMKCk7CisKKyAgICAvLyBGSVhNRTogV2h5IGRvIHdlIG5lZWQgdG8gd2FpdCBmb3Ig
RnJhbWVTdGF0ZUNvbXBsZXRlPworICAgIGlmIChmcmFtZSgpLT5sb2FkZXIoKS0+c3RhdGUoKSAh
PSBGcmFtZVN0YXRlQ29tcGxldGUpCisgICAgICAgIHJldHVybiBLVVJMKCk7CisKKyAgICBpZiAo
IWhlYWQoKSkKKyAgICAgICAgcmV0dXJuIEtVUkwoKTsKKworICAgIFJlZlB0cjxIVE1MQ29sbGVj
dGlvbj4gY2hpbGRyZW4gPSBoZWFkKCktPmNoaWxkcmVuKCk7CisgICAgZm9yICh1bnNpZ25lZCBp
ID0gMDsgTm9kZSogY2hpbGQgPSBjaGlsZHJlbi0+aXRlbShpKTsgaSsrKSB7CisgICAgICAgIGlm
ICghY2hpbGQtPmhhc1RhZ05hbWUobGlua1RhZykpCisgICAgICAgICAgICBjb250aW51ZTsKKyAg
ICAgICAgSFRNTExpbmtFbGVtZW50KiBsaW5rRWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxMaW5r
RWxlbWVudCo+KGNoaWxkKTsKKyAgICAgICAgaWYgKCFlcXVhbElnbm9yaW5nQ2FzZShsaW5rRWxl
bWVudC0+dHlwZSgpLCBvcGVuU2VhcmNoTUlNRVR5cGUpIHx8ICFlcXVhbElnbm9yaW5nQ2FzZShs
aW5rRWxlbWVudC0+cmVsKCksIG9wZW5TZWFyY2hSZWxhdGlvbikpCisgICAgICAgICAgICBjb250
aW51ZTsKKyAgICAgICAgaWYgKGxpbmtFbGVtZW50LT5ocmVmKCkuaXNFbXB0eSgpKQorICAgICAg
ICAgICAgY29udGludWU7CisgICAgICAgIHJldHVybiBsaW5rRWxlbWVudC0+aHJlZigpOworICAg
IH0KKworICAgIHJldHVybiBLVVJMKCk7Cit9CisKKyNpZiBFTkFCTEUoWFNMVCkKKwordm9pZCBE
b2N1bWVudDo6YXBwbHlYU0xUcmFuc2Zvcm0oUHJvY2Vzc2luZ0luc3RydWN0aW9uKiBwaSkKK3sK
KyAgICBSZWZQdHI8WFNMVFByb2Nlc3Nvcj4gcHJvY2Vzc29yID0gWFNMVFByb2Nlc3Nvcjo6Y3Jl
YXRlKCk7CisgICAgcHJvY2Vzc29yLT5zZXRYU0xTdHlsZVNoZWV0KHN0YXRpY19jYXN0PFhTTFN0
eWxlU2hlZXQqPihwaS0+c2hlZXQoKSkpOworICAgIFN0cmluZyByZXN1bHRNSU1FVHlwZTsKKyAg
ICBTdHJpbmcgbmV3U291cmNlOworICAgIFN0cmluZyByZXN1bHRFbmNvZGluZzsKKyAgICBpZiAo
IXByb2Nlc3Nvci0+dHJhbnNmb3JtVG9TdHJpbmcodGhpcywgcmVzdWx0TUlNRVR5cGUsIG5ld1Nv
dXJjZSwgcmVzdWx0RW5jb2RpbmcpKQorICAgICAgICByZXR1cm47CisgICAgLy8gRklYTUU6IElm
IHRoZSB0cmFuc2Zvcm0gZmFpbGVkIHdlIHNob3VsZCBwcm9iYWJseSByZXBvcnQgYW4gZXJyb3Ig
KGxpa2UgTW96aWxsYSBkb2VzKS4KKyAgICBwcm9jZXNzb3ItPmNyZWF0ZURvY3VtZW50RnJvbVNv
dXJjZShuZXdTb3VyY2UsIHJlc3VsdEVuY29kaW5nLCByZXN1bHRNSU1FVHlwZSwgdGhpcywgZnJh
bWUoKSk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnNldFRyYW5zZm9ybVNvdXJjZShQYXNzT3duUHRy
PFRyYW5zZm9ybVNvdXJjZT4gc291cmNlKQoreworICAgIG1fdHJhbnNmb3JtU291cmNlID0gc291
cmNlOworfQorCisjZW5kaWYKKwordm9pZCBEb2N1bWVudDo6c2V0RGVzaWduTW9kZShJbmhlcml0
ZWRCb29sIHZhbHVlKQoreworICAgIG1fZGVzaWduTW9kZSA9IHZhbHVlOworICAgIGZvciAoRnJh
bWUqIGZyYW1lID0gbV9mcmFtZTsgZnJhbWUgJiYgZnJhbWUtPmRvY3VtZW50KCk7IGZyYW1lID0g
ZnJhbWUtPnRyZWUoKS0+dHJhdmVyc2VOZXh0KG1fZnJhbWUpKQorICAgICAgICBmcmFtZS0+ZG9j
dW1lbnQoKS0+c2NoZWR1bGVGb3JjZWRTdHlsZVJlY2FsYygpOworfQorCitEb2N1bWVudDo6SW5o
ZXJpdGVkQm9vbCBEb2N1bWVudDo6Z2V0RGVzaWduTW9kZSgpIGNvbnN0Cit7CisgICAgcmV0dXJu
IG1fZGVzaWduTW9kZTsKK30KKworYm9vbCBEb2N1bWVudDo6aW5EZXNpZ25Nb2RlKCkgY29uc3QK
K3sKKyAgICBmb3IgKGNvbnN0IERvY3VtZW50KiBkID0gdGhpczsgZDsgZCA9IGQtPnBhcmVudERv
Y3VtZW50KCkpIHsKKyAgICAgICAgaWYgKGQtPm1fZGVzaWduTW9kZSAhPSBpbmhlcml0KQorICAg
ICAgICAgICAgcmV0dXJuIGQtPm1fZGVzaWduTW9kZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNl
OworfQorCitEb2N1bWVudCogRG9jdW1lbnQ6OnBhcmVudERvY3VtZW50KCkgY29uc3QKK3sKKyAg
ICBpZiAoIW1fZnJhbWUpCisgICAgICAgIHJldHVybiAwOworICAgIEZyYW1lKiBwYXJlbnQgPSBt
X2ZyYW1lLT50cmVlKCktPnBhcmVudCgpOworICAgIGlmICghcGFyZW50KQorICAgICAgICByZXR1
cm4gMDsKKyAgICByZXR1cm4gcGFyZW50LT5kb2N1bWVudCgpOworfQorCitEb2N1bWVudCogRG9j
dW1lbnQ6OnRvcERvY3VtZW50KCkgY29uc3QKK3sKKyAgICBEb2N1bWVudCogZG9jID0gY29uc3Rf
Y2FzdDxEb2N1bWVudCAqPih0aGlzKTsKKyAgICBFbGVtZW50KiBlbGVtZW50OworICAgIHdoaWxl
ICgoZWxlbWVudCA9IGRvYy0+b3duZXJFbGVtZW50KCkpKQorICAgICAgICBkb2MgPSBlbGVtZW50
LT5kb2N1bWVudCgpOworICAgIAorICAgIHJldHVybiBkb2M7Cit9CisKK1Bhc3NSZWZQdHI8QXR0
cj4gRG9jdW1lbnQ6OmNyZWF0ZUF0dHJpYnV0ZShjb25zdCBTdHJpbmcmIG5hbWUsIEV4Y2VwdGlv
bkNvZGUmIGVjKQoreworICAgIHJldHVybiBjcmVhdGVBdHRyaWJ1dGVOUyhTdHJpbmcoKSwgbmFt
ZSwgZWMsIHRydWUpOworfQorCitQYXNzUmVmUHRyPEF0dHI+IERvY3VtZW50OjpjcmVhdGVBdHRy
aWJ1dGVOUyhjb25zdCBTdHJpbmcmIG5hbWVzcGFjZVVSSSwgY29uc3QgU3RyaW5nJiBxdWFsaWZp
ZWROYW1lLCBFeGNlcHRpb25Db2RlJiBlYywgYm9vbCBzaG91bGRJZ25vcmVOYW1lc3BhY2VDaGVj
a3MpCit7CisgICAgU3RyaW5nIHByZWZpeCwgbG9jYWxOYW1lOworICAgIGlmICghcGFyc2VRdWFs
aWZpZWROYW1lKHF1YWxpZmllZE5hbWUsIHByZWZpeCwgbG9jYWxOYW1lLCBlYykpCisgICAgICAg
IHJldHVybiAwOworCisgICAgUXVhbGlmaWVkTmFtZSBxTmFtZShwcmVmaXgsIGxvY2FsTmFtZSwg
bmFtZXNwYWNlVVJJKTsKKworICAgIGlmICghc2hvdWxkSWdub3JlTmFtZXNwYWNlQ2hlY2tzICYm
ICFoYXNWYWxpZE5hbWVzcGFjZUZvckF0dHJpYnV0ZXMocU5hbWUpKSB7CisgICAgICAgIGVjID0g
TkFNRVNQQUNFX0VSUjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIEF0
dHI6OmNyZWF0ZSh0aGlzLCBxTmFtZSwgZW1wdHlTdHJpbmcoKSk7Cit9CisKKyNpZiBFTkFCTEUo
U1ZHKQorY29uc3QgU1ZHRG9jdW1lbnRFeHRlbnNpb25zKiBEb2N1bWVudDo6c3ZnRXh0ZW5zaW9u
cygpCit7CisgICAgcmV0dXJuIG1fc3ZnRXh0ZW5zaW9ucy5nZXQoKTsKK30KKworU1ZHRG9jdW1l
bnRFeHRlbnNpb25zKiBEb2N1bWVudDo6YWNjZXNzU1ZHRXh0ZW5zaW9ucygpCit7CisgICAgaWYg
KCFtX3N2Z0V4dGVuc2lvbnMpCisgICAgICAgIG1fc3ZnRXh0ZW5zaW9ucyA9IGFkb3B0UHRyKG5l
dyBTVkdEb2N1bWVudEV4dGVuc2lvbnModGhpcykpOworICAgIHJldHVybiBtX3N2Z0V4dGVuc2lv
bnMuZ2V0KCk7Cit9CisKK2Jvb2wgRG9jdW1lbnQ6Omhhc1NWR1Jvb3ROb2RlKCkgY29uc3QKK3sK
KyAgICByZXR1cm4gZG9jdW1lbnRFbGVtZW50KCkgJiYgZG9jdW1lbnRFbGVtZW50KCktPmhhc1Rh
Z05hbWUoU1ZHTmFtZXM6OnN2Z1RhZyk7Cit9CisjZW5kaWYKKworLy8gRklYTUU6IFRoaXMgY2Fj
aGluZyBtZWNoYW5pc20gc2hvdWxkIGJlIG1lcmdlZCB0aGF0IG9mIER5bmFtaWNOb2RlTGlzdCBp
biBOb2RlUmFyZURhdGEuCitQYXNzUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBEb2N1bWVudDo6Y2Fj
aGVkQ29sbGVjdGlvbihDb2xsZWN0aW9uVHlwZSB0eXBlKQoreworICAgIEFTU0VSVChzdGF0aWNf
Y2FzdDx1bnNpZ25lZD4odHlwZSkgPCBOdW1Vbm5hbWVkRG9jdW1lbnRDYWNoZWRUeXBlcyk7Cisg
ICAgaWYgKG1fY29sbGVjdGlvbnNbdHlwZV0pCisgICAgICAgIHJldHVybiBtX2NvbGxlY3Rpb25z
W3R5cGVdOworCisgICAgUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBjb2xsZWN0aW9uOworICAgIGlm
ICh0eXBlID09IERvY0FsbCkKKyAgICAgICAgY29sbGVjdGlvbiA9IEhUTUxBbGxDb2xsZWN0aW9u
OjpjcmVhdGUodGhpcyk7CisgICAgZWxzZQorICAgICAgICBjb2xsZWN0aW9uID0gSFRNTENvbGxl
Y3Rpb246OmNyZWF0ZSh0aGlzLCB0eXBlKTsKKyAgICBtX2NvbGxlY3Rpb25zW3R5cGVdID0gY29s
bGVjdGlvbi5nZXQoKTsKKworICAgIHJldHVybiBjb2xsZWN0aW9uLnJlbGVhc2UoKTsKK30KKwor
dm9pZCBEb2N1bWVudDo6cmVtb3ZlQ2FjaGVkSFRNTENvbGxlY3Rpb24oSFRNTENvbGxlY3Rpb24q
IGNvbGxlY3Rpb24sIENvbGxlY3Rpb25UeXBlIHR5cGUpCit7CisgICAgQVNTRVJUX1VOVVNFRChj
b2xsZWN0aW9uLCBtX2NvbGxlY3Rpb25zW3R5cGVdID09IGNvbGxlY3Rpb24pOworICAgIG1fY29s
bGVjdGlvbnNbdHlwZV0gPSAwOworfQorCitQYXNzUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBEb2N1
bWVudDo6aW1hZ2VzKCkKK3sKKyAgICByZXR1cm4gY2FjaGVkQ29sbGVjdGlvbihEb2NJbWFnZXMp
OworfQorCitQYXNzUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBEb2N1bWVudDo6YXBwbGV0cygpCit7
CisgICAgcmV0dXJuIGNhY2hlZENvbGxlY3Rpb24oRG9jQXBwbGV0cyk7Cit9CisKK1Bhc3NSZWZQ
dHI8SFRNTENvbGxlY3Rpb24+IERvY3VtZW50OjplbWJlZHMoKQoreworICAgIHJldHVybiBjYWNo
ZWRDb2xsZWN0aW9uKERvY0VtYmVkcyk7Cit9CisKK1Bhc3NSZWZQdHI8SFRNTENvbGxlY3Rpb24+
IERvY3VtZW50OjpwbHVnaW5zKCkKK3sKKyAgICAvLyBUaGlzIGlzIGFuIGFsaWFzIGZvciBlbWJl
ZHMoKSByZXF1aXJlZCBmb3IgdGhlIEpTIERPTSBiaW5kaW5ncy4KKyAgICByZXR1cm4gY2FjaGVk
Q29sbGVjdGlvbihEb2NFbWJlZHMpOworfQorCitQYXNzUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBE
b2N1bWVudDo6b2JqZWN0cygpCit7CisgICAgcmV0dXJuIGNhY2hlZENvbGxlY3Rpb24oRG9jT2Jq
ZWN0cyk7Cit9CisKK1Bhc3NSZWZQdHI8SFRNTENvbGxlY3Rpb24+IERvY3VtZW50OjpzY3JpcHRz
KCkKK3sKKyAgICByZXR1cm4gY2FjaGVkQ29sbGVjdGlvbihEb2NTY3JpcHRzKTsKK30KKworUGFz
c1JlZlB0cjxIVE1MQ29sbGVjdGlvbj4gRG9jdW1lbnQ6OmxpbmtzKCkKK3sKKyAgICByZXR1cm4g
Y2FjaGVkQ29sbGVjdGlvbihEb2NMaW5rcyk7Cit9CisKK1Bhc3NSZWZQdHI8SFRNTENvbGxlY3Rp
b24+IERvY3VtZW50Ojpmb3JtcygpCit7CisgICAgcmV0dXJuIGNhY2hlZENvbGxlY3Rpb24oRG9j
Rm9ybXMpOworfQorCitQYXNzUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBEb2N1bWVudDo6YW5jaG9y
cygpCit7CisgICAgcmV0dXJuIGNhY2hlZENvbGxlY3Rpb24oRG9jQW5jaG9ycyk7Cit9CisKK1Bh
c3NSZWZQdHI8SFRNTENvbGxlY3Rpb24+IERvY3VtZW50OjphbGwoKQoreworICAgIHJldHVybiBj
YWNoZWRDb2xsZWN0aW9uKERvY0FsbCk7Cit9CisKK1Bhc3NSZWZQdHI8SFRNTENvbGxlY3Rpb24+
IERvY3VtZW50Ojp3aW5kb3dOYW1lZEl0ZW1zKGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSkKK3sK
KyAgICBOYW1lZENvbGxlY3Rpb25NYXA6OkFkZFJlc3VsdCByZXN1bHQgPSBtX3dpbmRvd05hbWVk
SXRlbUNvbGxlY3Rpb25zLmFkZChuYW1lLCAwKTsKKyAgICBpZiAoIXJlc3VsdC5pc05ld0VudHJ5
KQorICAgICAgICByZXR1cm4gcmVzdWx0Lml0ZXJhdG9yLT5zZWNvbmQ7CisKKyAgICBSZWZQdHI8
SFRNTE5hbWVDb2xsZWN0aW9uPiBjb2xsZWN0aW9uID0gSFRNTE5hbWVDb2xsZWN0aW9uOjpjcmVh
dGUodGhpcywgV2luZG93TmFtZWRJdGVtcywgbmFtZSk7CisgICAgcmVzdWx0Lml0ZXJhdG9yLT5z
ZWNvbmQgPSBjb2xsZWN0aW9uLmdldCgpOworICAgIHJldHVybiBjb2xsZWN0aW9uLnJlbGVhc2Uo
KTsKK30KKworUGFzc1JlZlB0cjxIVE1MQ29sbGVjdGlvbj4gRG9jdW1lbnQ6OmRvY3VtZW50TmFt
ZWRJdGVtcyhjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUpCit7CisgICAgTmFtZWRDb2xsZWN0aW9u
TWFwOjpBZGRSZXN1bHQgcmVzdWx0ID0gbV9kb2N1bWVudE5hbWVkSXRlbUNvbGxlY3Rpb25zLmFk
ZChuYW1lLCAwKTsKKyAgICBpZiAoIXJlc3VsdC5pc05ld0VudHJ5KQorICAgICAgICByZXR1cm4g
cmVzdWx0Lml0ZXJhdG9yLT5zZWNvbmQ7CisKKyAgICBSZWZQdHI8SFRNTE5hbWVDb2xsZWN0aW9u
PiBjb2xsZWN0aW9uID0gSFRNTE5hbWVDb2xsZWN0aW9uOjpjcmVhdGUodGhpcywgRG9jdW1lbnRO
YW1lZEl0ZW1zLCBuYW1lKTsKKyAgICByZXN1bHQuaXRlcmF0b3ItPnNlY29uZCA9IGNvbGxlY3Rp
b24uZ2V0KCk7CisgICAgcmV0dXJuIGNvbGxlY3Rpb24ucmVsZWFzZSgpOworfQorCisvLyBGSVhN
RTogVGhpcyBjYWNoaW5nIG1lY2hhbmlzbSBzaG91bGQgYmUgbWVyZ2VkIHRoYXQgb2YgRHluYW1p
Y05vZGVMaXN0IGluIE5vZGVSYXJlRGF0YS4KK3ZvaWQgRG9jdW1lbnQ6OnJlbW92ZVdpbmRvd05h
bWVkSXRlbUNhY2hlKEhUTUxDb2xsZWN0aW9uKiBjb2xsZWN0aW9uLCBjb25zdCBBdG9taWNTdHJp
bmcmIG5hbWUpCit7CisgICAgQVNTRVJUX1VOVVNFRChjb2xsZWN0aW9uLCBtX3dpbmRvd05hbWVk
SXRlbUNvbGxlY3Rpb25zLmdldChuYW1lKSA9PSBjb2xsZWN0aW9uKTsKKyAgICBtX3dpbmRvd05h
bWVkSXRlbUNvbGxlY3Rpb25zLnJlbW92ZShuYW1lKTsKK30KKwordm9pZCBEb2N1bWVudDo6cmVt
b3ZlRG9jdW1lbnROYW1lZEl0ZW1DYWNoZShIVE1MQ29sbGVjdGlvbiogY29sbGVjdGlvbiwgY29u
c3QgQXRvbWljU3RyaW5nJiBuYW1lKQoreworICAgIEFTU0VSVF9VTlVTRUQoY29sbGVjdGlvbiwg
bV9kb2N1bWVudE5hbWVkSXRlbUNvbGxlY3Rpb25zLmdldChuYW1lKSA9PSBjb2xsZWN0aW9uKTsK
KyAgICBtX2RvY3VtZW50TmFtZWRJdGVtQ29sbGVjdGlvbnMucmVtb3ZlKG5hbWUpOworfQorCit2
b2lkIERvY3VtZW50OjpmaW5pc2hlZFBhcnNpbmcoKQoreworICAgIEFTU0VSVCghc2NyaXB0YWJs
ZURvY3VtZW50UGFyc2VyKCkgfHwgIW1fcGFyc2VyLT5pc1BhcnNpbmcoKSk7CisgICAgQVNTRVJU
KCFzY3JpcHRhYmxlRG9jdW1lbnRQYXJzZXIoKSB8fCBtX3JlYWR5U3RhdGUgIT0gTG9hZGluZyk7
CisgICAgc2V0UGFyc2luZyhmYWxzZSk7CisgICAgaWYgKCFtX2RvY3VtZW50VGltaW5nLmRvbUNv
bnRlbnRMb2FkZWRFdmVudFN0YXJ0KQorICAgICAgICBtX2RvY3VtZW50VGltaW5nLmRvbUNvbnRl
bnRMb2FkZWRFdmVudFN0YXJ0ID0gbW9ub3RvbmljYWxseUluY3JlYXNpbmdUaW1lKCk7CisgICAg
ZGlzcGF0Y2hFdmVudChFdmVudDo6Y3JlYXRlKGV2ZW50TmFtZXMoKS5ET01Db250ZW50TG9hZGVk
RXZlbnQsIHRydWUsIGZhbHNlKSk7CisgICAgaWYgKCFtX2RvY3VtZW50VGltaW5nLmRvbUNvbnRl
bnRMb2FkZWRFdmVudEVuZCkKKyAgICAgICAgbV9kb2N1bWVudFRpbWluZy5kb21Db250ZW50TG9h
ZGVkRXZlbnRFbmQgPSBtb25vdG9uaWNhbGx5SW5jcmVhc2luZ1RpbWUoKTsKKworICAgIGlmIChS
ZWZQdHI8RnJhbWU+IGYgPSBmcmFtZSgpKSB7CisgICAgICAgIC8vIEZyYW1lTG9hZGVyOjpmaW5p
c2hlZFBhcnNpbmcoKSBtaWdodCBlbmQgdXAgY2FsbGluZyBEb2N1bWVudDo6aW1wbGljaXRDbG9z
ZSgpIGlmIGFsbAorICAgICAgICAvLyByZXNvdXJjZSBsb2FkcyBhcmUgY29tcGxldGUuIEhUTUxP
YmplY3RFbGVtZW50cyBjYW4gc3RhcnQgbG9hZGluZyB0aGVpciByZXNvdXJjZXMgZnJvbQorICAg
ICAgICAvLyBwb3N0IGF0dGFjaCBjYWxsYmFja3MgdHJpZ2dlcmVkIGJ5IHJlY2FsY1N0eWxlKCku
ICBUaGlzIG1lYW5zIGlmIHdlIHBhcnNlIG91dCBhbiA8b2JqZWN0PgorICAgICAgICAvLyB0YWcg
YW5kIHRoZW4gcmVhY2ggdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQgd2l0aG91dCB1cGRhdGluZyBz
dHlsZXMsIHdlIG1pZ2h0IG5vdCBoYXZlIHlldAorICAgICAgICAvLyBzdGFydGVkIHRoZSByZXNv
dXJjZSBsb2FkIGFuZCBtaWdodCBmaXJlIHRoZSB3aW5kb3cgbG9hZCBldmVudCB0b28gZWFybHku
ICBUbyBhdm9pZCB0aGlzCisgICAgICAgIC8vIHdlIGZvcmNlIHRoZSBzdHlsZXMgdG8gYmUgdXAg
dG8gZGF0ZSBiZWZvcmUgY2FsbGluZyBGcmFtZUxvYWRlcjo6ZmluaXNoZWRQYXJzaW5nKCkuCisg
ICAgICAgIC8vIFNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzY4
NjQgc3RhcnRpbmcgYXJvdW5kIGNvbW1lbnQgMzUuCisgICAgICAgIHVwZGF0ZVN0eWxlSWZOZWVk
ZWQoKTsKKworICAgICAgICBmLT5sb2FkZXIoKS0+ZmluaXNoZWRQYXJzaW5nKCk7CisKKyAgICAg
ICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpkb21Db250ZW50TG9hZGVkRXZlbnRGaXJlZChm
LmdldCgpKTsKKyAgICB9CisKKyAgICAvLyBUaGUgRWxlbWVudEF0dHJpYnV0ZURhdGEgc2hhcmlu
ZyBjYWNoZSBpcyBvbmx5IHVzZWQgZHVyaW5nIHBhcnNpbmcgc2luY2UKKyAgICAvLyB0aGF0J3Mg
d2hlbiB0aGUgbWFqb3JpdHkgb2YgaW1tdXRhYmxlIGF0dHJpYnV0ZSBkYXRhIHdpbGwgYmUgY3Jl
YXRlZC4KKyAgICBtX2ltbXV0YWJsZUF0dHJpYnV0ZURhdGFDYWNoZS5jbGVhcigpOworfQorCitQ
YXNzUmVmUHRyPFhQYXRoRXhwcmVzc2lvbj4gRG9jdW1lbnQ6OmNyZWF0ZUV4cHJlc3Npb24oY29u
c3QgU3RyaW5nJiBleHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIFhQYXRoTlNSZXNvbHZlciogcmVzb2x2ZXIsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9u
Q29kZSYgZWMpCit7CisgICAgaWYgKCFtX3hwYXRoRXZhbHVhdG9yKQorICAgICAgICBtX3hwYXRo
RXZhbHVhdG9yID0gWFBhdGhFdmFsdWF0b3I6OmNyZWF0ZSgpOworICAgIHJldHVybiBtX3hwYXRo
RXZhbHVhdG9yLT5jcmVhdGVFeHByZXNzaW9uKGV4cHJlc3Npb24sIHJlc29sdmVyLCBlYyk7Cit9
CisKK1Bhc3NSZWZQdHI8WFBhdGhOU1Jlc29sdmVyPiBEb2N1bWVudDo6Y3JlYXRlTlNSZXNvbHZl
cihOb2RlKiBub2RlUmVzb2x2ZXIpCit7CisgICAgaWYgKCFtX3hwYXRoRXZhbHVhdG9yKQorICAg
ICAgICBtX3hwYXRoRXZhbHVhdG9yID0gWFBhdGhFdmFsdWF0b3I6OmNyZWF0ZSgpOworICAgIHJl
dHVybiBtX3hwYXRoRXZhbHVhdG9yLT5jcmVhdGVOU1Jlc29sdmVyKG5vZGVSZXNvbHZlcik7Cit9
CisKK1Bhc3NSZWZQdHI8WFBhdGhSZXN1bHQ+IERvY3VtZW50OjpldmFsdWF0ZShjb25zdCBTdHJp
bmcmIGV4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgTm9kZSogY29udGV4dE5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgWFBhdGhOU1Jlc29sdmVyKiByZXNvbHZlciwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCB0eXBlLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhQYXRoUmVzdWx0KiByZXN1bHQsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uQ29kZSYgZWMp
Cit7CisgICAgaWYgKCFtX3hwYXRoRXZhbHVhdG9yKQorICAgICAgICBtX3hwYXRoRXZhbHVhdG9y
ID0gWFBhdGhFdmFsdWF0b3I6OmNyZWF0ZSgpOworICAgIHJldHVybiBtX3hwYXRoRXZhbHVhdG9y
LT5ldmFsdWF0ZShleHByZXNzaW9uLCBjb250ZXh0Tm9kZSwgcmVzb2x2ZXIsIHR5cGUsIHJlc3Vs
dCwgZWMpOworfQorCitjb25zdCBWZWN0b3I8SWNvblVSTD4mIERvY3VtZW50OjppY29uVVJMcygp
Cit7CisgICAgbV9pY29uVVJMcy5jbGVhcigpOworCisgICAgaWYgKCFoZWFkKCkgfHwgIShoZWFk
KCktPmNoaWxkcmVuKCkpKQorICAgICAgICByZXR1cm4gbV9pY29uVVJMczsKKworICAgIC8vIElu
Y2x1ZGUgYW55IGljb25zIHdoZXJlIHR5cGUgPSBsaW5rLCByZWwgPSAic2hvcnRjdXQgaWNvbiIu
CisgICAgUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBjaGlsZHJlbiA9IGhlYWQoKS0+Y2hpbGRyZW4o
KTsKKyAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoID0gY2hpbGRyZW4tPmxlbmd0aCgpOworICAgIGZv
ciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgTm9kZSog
Y2hpbGQgPSBjaGlsZHJlbi0+aXRlbShpKTsKKyAgICAgICAgaWYgKCFjaGlsZC0+aGFzVGFnTmFt
ZShsaW5rVGFnKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBIVE1MTGlua0VsZW1l
bnQqIGxpbmtFbGVtZW50ID0gc3RhdGljX2Nhc3Q8SFRNTExpbmtFbGVtZW50Kj4oY2hpbGQpOwor
ICAgICAgICBpZiAobGlua0VsZW1lbnQtPmljb25UeXBlKCkgIT0gRmF2aWNvbikKKyAgICAgICAg
ICAgIGNvbnRpbnVlOworICAgICAgICBpZiAobGlua0VsZW1lbnQtPmhyZWYoKS5pc0VtcHR5KCkp
CisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAvLyBQdXQgaXQgYXQgdGhlIGZyb250
IHRvIGVuc3VyZSB0aGF0IGljb25zIHNlZW4gbGF0ZXIgdGFrZSBwcmVjZWRlbmNlIGFzIHJlcXVp
cmVkIGJ5IHRoZSBzcGVjLgorICAgICAgICBJY29uVVJMIG5ld1VSTChsaW5rRWxlbWVudC0+aHJl
ZigpLCBsaW5rRWxlbWVudC0+aWNvblNpemVzKCksIGxpbmtFbGVtZW50LT50eXBlKCksIGxpbmtF
bGVtZW50LT5pY29uVHlwZSgpKTsKKyAgICAgICAgbV9pY29uVVJMcy5wcmVwZW5kKG5ld1VSTCk7
CisgICAgfQorCisgICAgcmV0dXJuIG1faWNvblVSTHM7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmFk
ZEljb25VUkwoY29uc3QgU3RyaW5nJiB1cmwsIGNvbnN0IFN0cmluZyYgbWltZVR5cGUsIGNvbnN0
IFN0cmluZyYgc2l6ZXMsIEljb25UeXBlIGljb25UeXBlKQoreworICAgIGlmICh1cmwuaXNFbXB0
eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBGSVhNRSAtIDxyZGFyOi8vcHJvYmxlbS80
NzI3NjQ1PiAtIEF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZSwgd2UgbWlnaHQgYWN0dWFsbHkg
aG9ub3IgdGhlICJtaW1lVHlwZSIKKyAgICBJY29uVVJMIG5ld1VSTChLVVJMKFBhcnNlZFVSTFN0
cmluZywgdXJsKSwgc2l6ZXMsIG1pbWVUeXBlLCBpY29uVHlwZSk7CisKKyAgICBpZiAoRnJhbWUq
IGYgPSBmcmFtZSgpKSB7CisgICAgICAgIEljb25VUkwgaWNvblVSTCA9IGYtPmxvYWRlcigpLT5p
Y29uKCktPmljb25VUkwoaWNvblR5cGUpOworICAgICAgICBpZiAoaWNvblVSTCA9PSBuZXdVUkwp
CisgICAgICAgICAgICBmLT5sb2FkZXIoKS0+ZGlkQ2hhbmdlSWNvbnMoaWNvblR5cGUpOworICAg
IH0KK30KKwordm9pZCBEb2N1bWVudDo6c2V0VXNlU2VjdXJlS2V5Ym9hcmRFbnRyeVdoZW5BY3Rp
dmUoYm9vbCB1c2VzU2VjdXJlS2V5Ym9hcmQpCit7CisgICAgaWYgKG1fdXNlU2VjdXJlS2V5Ym9h
cmRFbnRyeVdoZW5BY3RpdmUgPT0gdXNlc1NlY3VyZUtleWJvYXJkKQorICAgICAgICByZXR1cm47
CisKKyAgICBtX3VzZVNlY3VyZUtleWJvYXJkRW50cnlXaGVuQWN0aXZlID0gdXNlc1NlY3VyZUtl
eWJvYXJkOworICAgIG1fZnJhbWUtPnNlbGVjdGlvbigpLT51cGRhdGVTZWN1cmVLZXlib2FyZEVu
dHJ5SWZBY3RpdmUoKTsKK30KKworYm9vbCBEb2N1bWVudDo6dXNlU2VjdXJlS2V5Ym9hcmRFbnRy
eVdoZW5BY3RpdmUoKSBjb25zdAoreworICAgIHJldHVybiBtX3VzZVNlY3VyZUtleWJvYXJkRW50
cnlXaGVuQWN0aXZlOworfQorCitzdGF0aWMgYm9vbCBpc0VsaWdpYmxlRm9yU2VhbWxlc3MoRG9j
dW1lbnQqIHBhcmVudCwgRG9jdW1lbnQqIGNoaWxkKQoreworICAgIC8vIEl0IHNob3VsZCBub3Qg
bWF0dGVyIHdoYXQgd2UgcmV0dXJuIGZvciB0aGUgdG9wLW1vc3QgZG9jdW1lbnQuCisgICAgaWYg
KCFwYXJlbnQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAocGFyZW50LT5pc1NhbmRi
b3hlZChTYW5kYm94U2VhbWxlc3NJZnJhbWVzKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
IGlmIChjaGlsZC0+aXNTcmNkb2NEb2N1bWVudCgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICBpZiAocGFyZW50LT5zZWN1cml0eU9yaWdpbigpLT5jYW5BY2Nlc3MoY2hpbGQtPnNlY3VyaXR5
T3JpZ2luKCkpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gcGFyZW50LT5zZWN1
cml0eU9yaWdpbigpLT5jYW5SZXF1ZXN0KGNoaWxkLT51cmwoKSk7Cit9CisKK3ZvaWQgRG9jdW1l
bnQ6OmluaXRTZWN1cml0eUNvbnRleHQoKQoreworICAgIGlmIChoYXZlSW5pdGlhbGl6ZWRTZWN1
cml0eU9yaWdpbigpKSB7CisgICAgICAgIEFTU0VSVChzZWN1cml0eU9yaWdpbigpKTsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghbV9mcmFtZSkgeworICAgICAgICAvLyBObyBz
b3VyY2UgZm9yIGEgc2VjdXJpdHkgY29udGV4dC4KKyAgICAgICAgLy8gVGhpcyBjYW4gb2NjdXIg
dmlhIGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZURvY3VtZW50KCkuCisgICAgICAgIG1f
Y29va2llVVJMID0gS1VSTChQYXJzZWRVUkxTdHJpbmcsIGVtcHR5U3RyaW5nKCkpOworICAgICAg
ICBzZXRTZWN1cml0eU9yaWdpbihTZWN1cml0eU9yaWdpbjo6Y3JlYXRlVW5pcXVlKCkpOworICAg
ICAgICBzZXRDb250ZW50U2VjdXJpdHlQb2xpY3koQ29udGVudFNlY3VyaXR5UG9saWN5OjpjcmVh
dGUodGhpcykpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gSW4gdGhlIGNvbW1v
biBjYXNlLCBjcmVhdGUgdGhlIHNlY3VyaXR5IGNvbnRleHQgZnJvbSB0aGUgY3VycmVudGx5Cisg
ICAgLy8gbG9hZGluZyBVUkwgd2l0aCBhIGZyZXNoIGNvbnRlbnQgc2VjdXJpdHkgcG9saWN5Lgor
ICAgIG1fY29va2llVVJMID0gbV91cmw7CisgICAgZW5mb3JjZVNhbmRib3hGbGFncyhtX2ZyYW1l
LT5sb2FkZXIoKS0+ZWZmZWN0aXZlU2FuZGJveEZsYWdzKCkpOworICAgIHNldFNlY3VyaXR5T3Jp
Z2luKGlzU2FuZGJveGVkKFNhbmRib3hPcmlnaW4pID8gU2VjdXJpdHlPcmlnaW46OmNyZWF0ZVVu
aXF1ZSgpIDogU2VjdXJpdHlPcmlnaW46OmNyZWF0ZShtX3VybCkpOworICAgIHNldENvbnRlbnRT
ZWN1cml0eVBvbGljeShDb250ZW50U2VjdXJpdHlQb2xpY3k6OmNyZWF0ZSh0aGlzKSk7CisKKyAg
ICBpZiAoU2VjdXJpdHlQb2xpY3k6OmFsbG93U3Vic3RpdHV0ZURhdGFBY2Nlc3NUb0xvY2FsKCkp
IHsKKyAgICAgICAgLy8gSWYgdGhpcyBkb2N1bWVudCB3YXMgbG9hZGVkIHdpdGggc3Vic3RpdHV0
ZURhdGEsIHRoZW4gdGhlIGRvY3VtZW50IGNhbgorICAgICAgICAvLyBsb2FkIGxvY2FsIHJlc291
cmNlcy4gIFNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTY3NTYK
KyAgICAgICAgLy8gYW5kIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0x
OTc2MCBmb3IgZnVydGhlcgorICAgICAgICAvLyBkaXNjdXNzaW9uLgorICAgICAgICAKKyAgICAg
ICAgRG9jdW1lbnRMb2FkZXIqIGRvY3VtZW50TG9hZGVyID0gbG9hZGVyKCk7CisgICAgICAgIGlm
IChkb2N1bWVudExvYWRlciAmJiBkb2N1bWVudExvYWRlci0+c3Vic3RpdHV0ZURhdGEoKS5pc1Zh
bGlkKCkpCisgICAgICAgICAgICBzZWN1cml0eU9yaWdpbigpLT5ncmFudExvYWRMb2NhbFJlc291
cmNlcygpOworICAgIH0KKworICAgIGlmIChTZXR0aW5ncyogc2V0dGluZ3MgPSB0aGlzLT5zZXR0
aW5ncygpKSB7CisgICAgICAgIGlmICghc2V0dGluZ3MtPmlzV2ViU2VjdXJpdHlFbmFibGVkKCkp
IHsKKyAgICAgICAgICAgIC8vIFdlYiBzZWN1cml0eSBpcyB0dXJuZWQgb2ZmLiBXZSBzaG91bGQg
bGV0IHRoaXMgZG9jdW1lbnQgYWNjZXNzIGV2ZXJ5IG90aGVyIGRvY3VtZW50LiBUaGlzIGlzIHVz
ZWQgcHJpbWFyeSBieSB0ZXN0aW5nCisgICAgICAgICAgICAvLyBoYXJuZXNzZXMgZm9yIHdlYiBz
aXRlcy4KKyAgICAgICAgICAgIHNlY3VyaXR5T3JpZ2luKCktPmdyYW50VW5pdmVyc2FsQWNjZXNz
KCk7CisgICAgICAgIH0gZWxzZSBpZiAoc2VjdXJpdHlPcmlnaW4oKS0+aXNMb2NhbCgpKSB7Cisg
ICAgICAgICAgICBpZiAoc2V0dGluZ3MtPmFsbG93VW5pdmVyc2FsQWNjZXNzRnJvbUZpbGVVUkxz
KCkgfHwgbV9mcmFtZS0+bG9hZGVyKCktPmNsaWVudCgpLT5zaG91bGRGb3JjZVVuaXZlcnNhbEFj
Y2Vzc0Zyb21Mb2NhbFVSTChtX3VybCkpIHsKKyAgICAgICAgICAgICAgICAvLyBTb21lIGNsaWVu
dHMgd2FudCBsb2NhbCBVUkxzIHRvIGhhdmUgdW5pdmVyc2FsIGFjY2VzcywgYnV0IHRoYXQgc2V0
dGluZyBpcyBkYW5nZXJvdXMgZm9yIG90aGVyIGNsaWVudHMuCisgICAgICAgICAgICAgICAgc2Vj
dXJpdHlPcmlnaW4oKS0+Z3JhbnRVbml2ZXJzYWxBY2Nlc3MoKTsKKyAgICAgICAgICAgIH0gZWxz
ZSBpZiAoIXNldHRpbmdzLT5hbGxvd0ZpbGVBY2Nlc3NGcm9tRmlsZVVSTHMoKSkgeworICAgICAg
ICAgICAgICAgIC8vIFNvbWUgY2xpZW50cyB3YW50IGxvY2FsIFVSTHMgdG8gaGF2ZSBldmVuIHRp
Z2h0ZXIgcmVzdHJpY3Rpb25zIGJ5IGRlZmF1bHQsIGFuZCBub3QgYmUgYWJsZSB0byBhY2Nlc3Mg
b3RoZXIgbG9jYWwgZmlsZXMuCisgICAgICAgICAgICAgICAgLy8gRklYTUUgODE1Nzg6IFRoZSBu
YW1pbmcgb2YgdGhpcyBpcyBjb25mdXNpbmcuIEZpbGVzIHdpdGggcmVzdHJpY3RlZCBhY2Nlc3Mg
dG8gb3RoZXIgbG9jYWwgZmlsZXMKKyAgICAgICAgICAgICAgICAvLyBzdGlsbCBjYW4gaGF2ZSBv
dGhlciBwcml2aWxlZ2VzIHRoYXQgY2FuIGJlIHJlbWVtYmVyZWQsIHRoZXJlYnkgbm90IG1ha2lu
ZyB0aGVtIHVuaXF1ZSBvcmlnaW5zLgorICAgICAgICAgICAgICAgIHNlY3VyaXR5T3JpZ2luKCkt
PmVuZm9yY2VGaWxlUGF0aFNlcGFyYXRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQor
ICAgICAgICBzZWN1cml0eU9yaWdpbigpLT5zZXRTdG9yYWdlQmxvY2tpbmdQb2xpY3koc2V0dGlu
Z3MtPnN0b3JhZ2VCbG9ja2luZ1BvbGljeSgpKTsKKyAgICB9CisKKyAgICBEb2N1bWVudCogcGFy
ZW50RG9jdW1lbnQgPSBvd25lckVsZW1lbnQoKSA/IG93bmVyRWxlbWVudCgpLT5kb2N1bWVudCgp
IDogMDsKKyAgICBpZiAocGFyZW50RG9jdW1lbnQgJiYgbV9mcmFtZS0+bG9hZGVyKCktPnNob3Vs
ZFRyZWF0VVJMQXNTcmNkb2NEb2N1bWVudCh1cmwoKSkpIHsKKyAgICAgICAgbV9pc1NyY2RvY0Rv
Y3VtZW50ID0gdHJ1ZTsKKyAgICAgICAgc2V0QmFzZVVSTE92ZXJyaWRlKHBhcmVudERvY3VtZW50
LT5iYXNlVVJMKCkpOworICAgIH0KKworICAgIC8vIEZJWE1FOiBXaGF0IGhhcHBlbnMgaWYgd2Ug
aW5oZXJpdCB0aGUgc2VjdXJpdHkgb3JpZ2luPyBUaGlzIGNoZWNrIG1heSBuZWVkIHRvIGJlIGxh
dGVyLgorICAgIC8vIDxpZnJhbWUgc2VhbWxlc3Mgc3JjPSJhYm91dDpibGFuayI+IGxpa2VseSB3
b24ndCB3b3JrIGFzLWlzLgorICAgIG1fbWF5RGlzcGxheVNlYW1sZXNzV2l0aFBhcmVudCA9IGlz
RWxpZ2libGVGb3JTZWFtbGVzcyhwYXJlbnREb2N1bWVudCwgdGhpcyk7CisKKyAgICBpZiAoIXNo
b3VsZEluaGVyaXRTZWN1cml0eU9yaWdpbkZyb21Pd25lcihtX3VybCkpCisgICAgICAgIHJldHVy
bjsKKworICAgIC8vIElmIHdlIGRvIG5vdCBvYnRhaW4gYSBtZWFuaW5nZnVsIG9yaWdpbiBmcm9t
IHRoZSBVUkwsIHRoZW4gd2UgdHJ5IHRvCisgICAgLy8gZmluZCBvbmUgdmlhIHRoZSBmcmFtZSBo
aWVyYXJjaHkuCisKKyAgICBGcmFtZSogb3duZXJGcmFtZSA9IG1fZnJhbWUtPnRyZWUoKS0+cGFy
ZW50KCk7CisgICAgaWYgKCFvd25lckZyYW1lKQorICAgICAgICBvd25lckZyYW1lID0gbV9mcmFt
ZS0+bG9hZGVyKCktPm9wZW5lcigpOworCisgICAgaWYgKCFvd25lckZyYW1lKSB7CisgICAgICAg
IGRpZEZhaWxUb0luaXRpYWxpemVTZWN1cml0eU9yaWdpbigpOworICAgICAgICByZXR1cm47Cisg
ICAgfQorCisgICAgaWYgKGlzU2FuZGJveGVkKFNhbmRib3hPcmlnaW4pKSB7CisgICAgICAgIC8v
IElmIHdlJ3JlIHN1cHBvc2VkIHRvIGluaGVyaXQgb3VyIHNlY3VyaXR5IG9yaWdpbiBmcm9tIG91
ciBvd25lciwKKyAgICAgICAgLy8gYnV0IHdlJ3JlIGFsc28gc2FuZGJveGVkLCB0aGUgb25seSB0
aGluZyB3ZSBpbmhlcml0IGlzIHRoZSBhYmlsaXR5CisgICAgICAgIC8vIHRvIGxvYWQgbG9jYWwg
cmVzb3VyY2VzLiBUaGlzIGxldHMgYWJvdXQ6YmxhbmsgaWZyYW1lcyBpbiBmaWxlOi8vCisgICAg
ICAgIC8vIFVSTCBkb2N1bWVudHMgbG9hZCBpbWFnZXMgYW5kIG90aGVyIHJlc291cmNlcyBmcm9t
IHRoZSBmaWxlIHN5c3RlbS4KKyAgICAgICAgaWYgKG93bmVyRnJhbWUtPmRvY3VtZW50KCktPnNl
Y3VyaXR5T3JpZ2luKCktPmNhbkxvYWRMb2NhbFJlc291cmNlcygpKQorICAgICAgICAgICAgc2Vj
dXJpdHlPcmlnaW4oKS0+Z3JhbnRMb2FkTG9jYWxSZXNvdXJjZXMoKTsKKyAgICAgICAgcmV0dXJu
OworICAgIH0KKworICAgIG1fY29va2llVVJMID0gb3duZXJGcmFtZS0+ZG9jdW1lbnQoKS0+Y29v
a2llVVJMKCk7CisgICAgLy8gV2UgYWxpYXMgdGhlIFNlY3VyaXR5T3JpZ2lucyB0byBtYXRjaCBG
aXJlZm94LCBzZWUgQnVnIDE1MzEzCisgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTE1MzEzCisgICAgc2V0U2VjdXJpdHlPcmlnaW4ob3duZXJGcmFtZS0+ZG9j
dW1lbnQoKS0+c2VjdXJpdHlPcmlnaW4oKSk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmluaXRDb250
ZW50U2VjdXJpdHlQb2xpY3koKQoreworICAgIGlmICghbV9mcmFtZS0+dHJlZSgpLT5wYXJlbnQo
KSB8fCAoIXNob3VsZEluaGVyaXRTZWN1cml0eU9yaWdpbkZyb21Pd25lcihtX3VybCkgJiYgIWlz
UGx1Z2luRG9jdW1lbnQoKSkpCisgICAgICAgIHJldHVybjsKKworICAgIGNvbnRlbnRTZWN1cml0
eVBvbGljeSgpLT5jb3B5U3RhdGVGcm9tKG1fZnJhbWUtPnRyZWUoKS0+cGFyZW50KCktPmRvY3Vt
ZW50KCktPmNvbnRlbnRTZWN1cml0eVBvbGljeSgpKTsKK30KKwordm9pZCBEb2N1bWVudDo6ZGlk
VXBkYXRlU2VjdXJpdHlPcmlnaW4oKQoreworICAgIGlmICghbV9mcmFtZSkKKyAgICAgICAgcmV0
dXJuOworICAgIG1fZnJhbWUtPnNjcmlwdCgpLT51cGRhdGVTZWN1cml0eU9yaWdpbigpOworfQor
Citib29sIERvY3VtZW50Ojppc0NvbnRleHRUaHJlYWQoKSBjb25zdAoreworICAgIHJldHVybiBp
c01haW5UaHJlYWQoKTsKK30KKwordm9pZCBEb2N1bWVudDo6dXBkYXRlVVJMRm9yUHVzaE9yUmVw
bGFjZVN0YXRlKGNvbnN0IEtVUkwmIHVybCkKK3sKKyAgICBGcmFtZSogZiA9IGZyYW1lKCk7Cisg
ICAgaWYgKCFmKQorICAgICAgICByZXR1cm47CisKKyAgICBzZXRVUkwodXJsKTsKKyAgICBmLT5s
b2FkZXIoKS0+c2V0T3V0Z29pbmdSZWZlcnJlcih1cmwpOworCisgICAgaWYgKERvY3VtZW50TG9h
ZGVyKiBkb2N1bWVudExvYWRlciA9IGxvYWRlcigpKQorICAgICAgICBkb2N1bWVudExvYWRlci0+
cmVwbGFjZVJlcXVlc3RVUkxGb3JTYW1lRG9jdW1lbnROYXZpZ2F0aW9uKHVybCk7Cit9CisKK3Zv
aWQgRG9jdW1lbnQ6OnN0YXRlUG9wcGVkKFBhc3NSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVl
PiBzdGF0ZU9iamVjdCkKK3sKKyAgICBpZiAoIWZyYW1lKCkpCisgICAgICAgIHJldHVybjsKKyAg
ICAKKyAgICAvLyBQZXIgc3RlcCAxMSBvZiBzZWN0aW9uIDYuNS45IChoaXN0b3J5IHRyYXZlcnNh
bCkgb2YgdGhlIEhUTUw1IHNwZWMsIHdlIAorICAgIC8vIGRlZmVyIGZpcmluZyBvZiBwb3BzdGF0
ZSB1bnRpbCB3ZSdyZSBpbiB0aGUgY29tcGxldGUgc3RhdGUuCisgICAgaWYgKG1fcmVhZHlTdGF0
ZSA9PSBDb21wbGV0ZSkKKyAgICAgICAgZW5xdWV1ZVBvcHN0YXRlRXZlbnQoc3RhdGVPYmplY3Qp
OworICAgIGVsc2UKKyAgICAgICAgbV9wZW5kaW5nU3RhdGVPYmplY3QgPSBzdGF0ZU9iamVjdDsK
K30KKwordm9pZCBEb2N1bWVudDo6dXBkYXRlRm9jdXNBcHBlYXJhbmNlU29vbihib29sIHJlc3Rv
cmVQcmV2aW91c1NlbGVjdGlvbikKK3sKKyAgICBtX3VwZGF0ZUZvY3VzQXBwZWFyYW5jZVJlc3Rv
cmVzU2VsZWN0aW9uID0gcmVzdG9yZVByZXZpb3VzU2VsZWN0aW9uOworICAgIGlmICghbV91cGRh
dGVGb2N1c0FwcGVhcmFuY2VUaW1lci5pc0FjdGl2ZSgpKQorICAgICAgICBtX3VwZGF0ZUZvY3Vz
QXBwZWFyYW5jZVRpbWVyLnN0YXJ0T25lU2hvdCgwKTsKK30KKwordm9pZCBEb2N1bWVudDo6Y2Fu
Y2VsRm9jdXNBcHBlYXJhbmNlVXBkYXRlKCkKK3sKKyAgICBtX3VwZGF0ZUZvY3VzQXBwZWFyYW5j
ZVRpbWVyLnN0b3AoKTsKK30KKwordm9pZCBEb2N1bWVudDo6dXBkYXRlRm9jdXNBcHBlYXJhbmNl
VGltZXJGaXJlZChUaW1lcjxEb2N1bWVudD4qKQoreworICAgIE5vZGUqIG5vZGUgPSBmb2N1c2Vk
Tm9kZSgpOworICAgIGlmICghbm9kZSkKKyAgICAgICAgcmV0dXJuOworICAgIGlmICghbm9kZS0+
aXNFbGVtZW50Tm9kZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICB1cGRhdGVMYXlvdXQoKTsK
KworICAgIEVsZW1lbnQqIGVsZW1lbnQgPSBzdGF0aWNfY2FzdDxFbGVtZW50Kj4obm9kZSk7Cisg
ICAgaWYgKGVsZW1lbnQtPmlzRm9jdXNhYmxlKCkpCisgICAgICAgIGVsZW1lbnQtPnVwZGF0ZUZv
Y3VzQXBwZWFyYW5jZShtX3VwZGF0ZUZvY3VzQXBwZWFyYW5jZVJlc3RvcmVzU2VsZWN0aW9uKTsK
K30KKwordm9pZCBEb2N1bWVudDo6YXR0YWNoUmFuZ2UoUmFuZ2UqIHJhbmdlKQoreworICAgIEFT
U0VSVCghbV9yYW5nZXMuY29udGFpbnMocmFuZ2UpKTsKKyAgICBtX3Jhbmdlcy5hZGQocmFuZ2Up
OworfQorCit2b2lkIERvY3VtZW50OjpkZXRhY2hSYW5nZShSYW5nZSogcmFuZ2UpCit7CisgICAg
Ly8gV2UgZG9uJ3QgQVNTRVJUIG1fcmFuZ2VzLmNvbnRhaW5zKHJhbmdlKSB0byBhbGxvdyB1cyB0
byBjYWxsIHRoaXMKKyAgICAvLyB1bmNvbmRpdGlvbmFsbHkgdG8gZml4OiBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjYwNDQKKyAgICBtX3Jhbmdlcy5yZW1vdmUocmFu
Z2UpOworfQorCitDYW52YXNSZW5kZXJpbmdDb250ZXh0KiBEb2N1bWVudDo6Z2V0Q1NTQ2FudmFz
Q29udGV4dChjb25zdCBTdHJpbmcmIHR5cGUsIGNvbnN0IFN0cmluZyYgbmFtZSwgaW50IHdpZHRo
LCBpbnQgaGVpZ2h0KQoreworICAgIEhUTUxDYW52YXNFbGVtZW50KiBlbGVtZW50ID0gZ2V0Q1NT
Q2FudmFzRWxlbWVudChuYW1lKTsKKyAgICBpZiAoIWVsZW1lbnQpCisgICAgICAgIHJldHVybiAw
OworICAgIGVsZW1lbnQtPnNldFNpemUoSW50U2l6ZSh3aWR0aCwgaGVpZ2h0KSk7CisgICAgcmV0
dXJuIGVsZW1lbnQtPmdldENvbnRleHQodHlwZSk7Cit9CisKK0hUTUxDYW52YXNFbGVtZW50KiBE
b2N1bWVudDo6Z2V0Q1NTQ2FudmFzRWxlbWVudChjb25zdCBTdHJpbmcmIG5hbWUpCit7CisgICAg
UmVmUHRyPEhUTUxDYW52YXNFbGVtZW50PiYgZWxlbWVudCA9IG1fY3NzQ2FudmFzRWxlbWVudHMu
YWRkKG5hbWUsIDApLml0ZXJhdG9yLT5zZWNvbmQ7CisgICAgaWYgKCFlbGVtZW50KQorICAgICAg
ICBlbGVtZW50ID0gSFRNTENhbnZhc0VsZW1lbnQ6OmNyZWF0ZSh0aGlzKTsKKyAgICByZXR1cm4g
ZWxlbWVudC5nZXQoKTsKK30KKwordm9pZCBEb2N1bWVudDo6aW5pdEROU1ByZWZldGNoKCkKK3sK
KyAgICBTZXR0aW5ncyogc2V0dGluZ3MgPSB0aGlzLT5zZXR0aW5ncygpOworCisgICAgbV9oYXZl
RXhwbGljaXRseURpc2FibGVkRE5TUHJlZmV0Y2ggPSBmYWxzZTsKKyAgICBtX2lzRE5TUHJlZmV0
Y2hFbmFibGVkID0gc2V0dGluZ3MgJiYgc2V0dGluZ3MtPmRuc1ByZWZldGNoaW5nRW5hYmxlZCgp
ICYmIHNlY3VyaXR5T3JpZ2luKCktPnByb3RvY29sKCkgPT0gImh0dHAiOworCisgICAgLy8gSW5o
ZXJpdCBETlMgcHJlZmV0Y2ggb3B0LW91dCBmcm9tIHBhcmVudCBmcmFtZSAgICAKKyAgICBpZiAo
RG9jdW1lbnQqIHBhcmVudCA9IHBhcmVudERvY3VtZW50KCkpIHsKKyAgICAgICAgaWYgKCFwYXJl
bnQtPmlzRE5TUHJlZmV0Y2hFbmFibGVkKCkpCisgICAgICAgICAgICBtX2lzRE5TUHJlZmV0Y2hF
bmFibGVkID0gZmFsc2U7CisgICAgfQorfQorCit2b2lkIERvY3VtZW50OjpwYXJzZUROU1ByZWZl
dGNoQ29udHJvbEhlYWRlcihjb25zdCBTdHJpbmcmIGRuc1ByZWZldGNoQ29udHJvbCkKK3sKKyAg
ICBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoZG5zUHJlZmV0Y2hDb250cm9sLCAib24iKSAmJiAhbV9o
YXZlRXhwbGljaXRseURpc2FibGVkRE5TUHJlZmV0Y2gpIHsKKyAgICAgICAgbV9pc0ROU1ByZWZl
dGNoRW5hYmxlZCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtX2lzRE5T
UHJlZmV0Y2hFbmFibGVkID0gZmFsc2U7CisgICAgbV9oYXZlRXhwbGljaXRseURpc2FibGVkRE5T
UHJlZmV0Y2ggPSB0cnVlOworfQorCit2b2lkIERvY3VtZW50OjphZGRNZXNzYWdlKE1lc3NhZ2VT
b3VyY2Ugc291cmNlLCBNZXNzYWdlVHlwZSB0eXBlLCBNZXNzYWdlTGV2ZWwgbGV2ZWwsIGNvbnN0
IFN0cmluZyYgbWVzc2FnZSwgY29uc3QgU3RyaW5nJiBzb3VyY2VVUkwsIHVuc2lnbmVkIGxpbmVO
dW1iZXIsIFBhc3NSZWZQdHI8U2NyaXB0Q2FsbFN0YWNrPiBjYWxsU3RhY2spCit7CisgICAgaWYg
KCFpc0NvbnRleHRUaHJlYWQoKSkgeworICAgICAgICBwb3N0VGFzayhBZGRDb25zb2xlTWVzc2Fn
ZVRhc2s6OmNyZWF0ZShzb3VyY2UsIHR5cGUsIGxldmVsLCBtZXNzYWdlKSk7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisKKyAgICBpZiAoRE9NV2luZG93KiB3aW5kb3cgPSBkb21XaW5kb3coKSkK
KyAgICAgICAgd2luZG93LT5jb25zb2xlKCktPmFkZE1lc3NhZ2Uoc291cmNlLCB0eXBlLCBsZXZl
bCwgbWVzc2FnZSwgc291cmNlVVJMLCBsaW5lTnVtYmVyLCBjYWxsU3RhY2spOworfQorCitzdHJ1
Y3QgUGVyZm9ybVRhc2tDb250ZXh0IHsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShQZXJmb3Jt
VGFza0NvbnRleHQpOyBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKK3B1YmxpYzoKKyAgICBQZXJm
b3JtVGFza0NvbnRleHQoUGFzc1JlZlB0cjxEb2N1bWVudFdlYWtSZWZlcmVuY2U+IGRvY3VtZW50
UmVmZXJlbmNlLCBQYXNzT3duUHRyPFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQ6OlRhc2s+IHRhc2sp
CisgICAgICAgIDogZG9jdW1lbnRSZWZlcmVuY2UoZG9jdW1lbnRSZWZlcmVuY2UpCisgICAgICAg
ICwgdGFzayh0YXNrKQorICAgIHsKKyAgICB9CisKKyAgICBSZWZQdHI8RG9jdW1lbnRXZWFrUmVm
ZXJlbmNlPiBkb2N1bWVudFJlZmVyZW5jZTsKKyAgICBPd25QdHI8U2NyaXB0RXhlY3V0aW9uQ29u
dGV4dDo6VGFzaz4gdGFzazsKK307CisKK3ZvaWQgRG9jdW1lbnQ6OmRpZFJlY2VpdmVUYXNrKHZv
aWQqIHVudHlwZWRDb250ZXh0KQoreworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisKKyAg
ICBPd25QdHI8UGVyZm9ybVRhc2tDb250ZXh0PiBjb250ZXh0ID0gYWRvcHRQdHIoc3RhdGljX2Nh
c3Q8UGVyZm9ybVRhc2tDb250ZXh0Kj4odW50eXBlZENvbnRleHQpKTsKKyAgICBBU1NFUlQoY29u
dGV4dCk7CisKKyAgICBEb2N1bWVudCogZG9jdW1lbnQgPSBjb250ZXh0LT5kb2N1bWVudFJlZmVy
ZW5jZS0+ZG9jdW1lbnQoKTsKKyAgICBpZiAoIWRvY3VtZW50KQorICAgICAgICByZXR1cm47CisK
KyAgICBQYWdlKiBwYWdlID0gZG9jdW1lbnQtPnBhZ2UoKTsKKyAgICBpZiAoKHBhZ2UgJiYgcGFn
ZS0+ZGVmZXJzTG9hZGluZygpKSB8fCAhZG9jdW1lbnQtPm1fcGVuZGluZ1Rhc2tzLmlzRW1wdHko
KSkgeworICAgICAgICBkb2N1bWVudC0+bV9wZW5kaW5nVGFza3MuYXBwZW5kKGNvbnRleHQtPnRh
c2sucmVsZWFzZSgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnRleHQtPnRh
c2stPnBlcmZvcm1UYXNrKGRvY3VtZW50KTsKK30KKwordm9pZCBEb2N1bWVudDo6cG9zdFRhc2so
UGFzc093blB0cjxUYXNrPiB0YXNrKQoreworICAgIGNhbGxPbk1haW5UaHJlYWQoZGlkUmVjZWl2
ZVRhc2ssIG5ldyBQZXJmb3JtVGFza0NvbnRleHQobV93ZWFrUmVmZXJlbmNlLCB0YXNrKSk7Cit9
CisKK3ZvaWQgRG9jdW1lbnQ6OnBlbmRpbmdUYXNrc1RpbWVyRmlyZWQoVGltZXI8RG9jdW1lbnQ+
KikKK3sKKyAgICB3aGlsZSAoIW1fcGVuZGluZ1Rhc2tzLmlzRW1wdHkoKSkgeworICAgICAgICBP
d25QdHI8VGFzaz4gdGFzayA9IG1fcGVuZGluZ1Rhc2tzWzBdLnJlbGVhc2UoKTsKKyAgICAgICAg
bV9wZW5kaW5nVGFza3MucmVtb3ZlKDApOworICAgICAgICB0YXNrLT5wZXJmb3JtVGFzayh0aGlz
KTsKKyAgICB9Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnN1c3BlbmRTY2hlZHVsZWRUYXNrcyhBY3Rp
dmVET01PYmplY3Q6OlJlYXNvbkZvclN1c3BlbnNpb24gcmVhc29uKQoreworICAgIEFTU0VSVCgh
bV9zY2hlZHVsZWRUYXNrc0FyZVN1c3BlbmRlZCk7CisKKyAgICBzdXNwZW5kU2NyaXB0ZWRBbmlt
YXRpb25Db250cm9sbGVyQ2FsbGJhY2tzKCk7CisgICAgc3VzcGVuZEFjdGl2ZURPTU9iamVjdHMo
cmVhc29uKTsKKyAgICBzY3JpcHRSdW5uZXIoKS0+c3VzcGVuZCgpOworICAgIG1fcGVuZGluZ1Rh
c2tzVGltZXIuc3RvcCgpOworICAgIGlmIChtX3BhcnNlcikKKyAgICAgICAgbV9wYXJzZXItPnN1
c3BlbmRTY2hlZHVsZWRUYXNrcygpOworCisgICAgbV9zY2hlZHVsZWRUYXNrc0FyZVN1c3BlbmRl
ZCA9IHRydWU7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnJlc3VtZVNjaGVkdWxlZFRhc2tzKCkKK3sK
KyAgICBBU1NFUlQobV9zY2hlZHVsZWRUYXNrc0FyZVN1c3BlbmRlZCk7CisKKyAgICBpZiAobV9w
YXJzZXIpCisgICAgICAgIG1fcGFyc2VyLT5yZXN1bWVTY2hlZHVsZWRUYXNrcygpOworICAgIGlm
ICghbV9wZW5kaW5nVGFza3MuaXNFbXB0eSgpKQorICAgICAgICBtX3BlbmRpbmdUYXNrc1RpbWVy
LnN0YXJ0T25lU2hvdCgwKTsKKyAgICBzY3JpcHRSdW5uZXIoKS0+cmVzdW1lKCk7CisgICAgcmVz
dW1lQWN0aXZlRE9NT2JqZWN0cygpOworICAgIHJlc3VtZVNjcmlwdGVkQW5pbWF0aW9uQ29udHJv
bGxlckNhbGxiYWNrcygpOworICAgIAorICAgIG1fc2NoZWR1bGVkVGFza3NBcmVTdXNwZW5kZWQg
PSBmYWxzZTsKK30KKwordm9pZCBEb2N1bWVudDo6c3VzcGVuZFNjcmlwdGVkQW5pbWF0aW9uQ29u
dHJvbGxlckNhbGxiYWNrcygpCit7CisjaWYgRU5BQkxFKFJFUVVFU1RfQU5JTUFUSU9OX0ZSQU1F
KQorICAgIGlmIChtX3NjcmlwdGVkQW5pbWF0aW9uQ29udHJvbGxlcikKKyAgICAgICAgbV9zY3Jp
cHRlZEFuaW1hdGlvbkNvbnRyb2xsZXItPnN1c3BlbmQoKTsKKyNlbmRpZgorfQorCit2b2lkIERv
Y3VtZW50OjpyZXN1bWVTY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXJDYWxsYmFja3MoKQorewor
I2lmIEVOQUJMRShSRVFVRVNUX0FOSU1BVElPTl9GUkFNRSkKKyAgICBpZiAobV9zY3JpcHRlZEFu
aW1hdGlvbkNvbnRyb2xsZXIpCisgICAgICAgIG1fc2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVy
LT5yZXN1bWUoKTsKKyNlbmRpZgorfQorCit2b2lkIERvY3VtZW50Ojp3aW5kb3dTY3JlZW5EaWRD
aGFuZ2UoUGxhdGZvcm1EaXNwbGF5SUQgZGlzcGxheUlEKQoreworI2lmIEVOQUJMRShSRVFVRVNU
X0FOSU1BVElPTl9GUkFNRSkKKyAgICBpZiAobV9zY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXIp
CisgICAgICAgIG1fc2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyLT53aW5kb3dTY3JlZW5EaWRD
aGFuZ2UoZGlzcGxheUlEKTsKKyNlbHNlCisgICAgVU5VU0VEX1BBUkFNKGRpc3BsYXlJRCk7Cisj
ZW5kaWYKK30KKworCitTdHJpbmcgRG9jdW1lbnQ6OmRpc3BsYXlTdHJpbmdNb2RpZmllZEJ5RW5j
b2RpbmcoY29uc3QgU3RyaW5nJiBzdHIpIGNvbnN0Cit7CisgICAgaWYgKG1fZGVjb2RlcikKKyAg
ICAgICAgcmV0dXJuIG1fZGVjb2Rlci0+ZW5jb2RpbmcoKS5kaXNwbGF5U3RyaW5nKHN0ci5pbXBs
KCkpOworICAgIHJldHVybiBzdHI7Cit9CisKK1Bhc3NSZWZQdHI8U3RyaW5nSW1wbD4gRG9jdW1l
bnQ6OmRpc3BsYXlTdHJpbmdNb2RpZmllZEJ5RW5jb2RpbmcoUGFzc1JlZlB0cjxTdHJpbmdJbXBs
PiBzdHIpIGNvbnN0Cit7CisgICAgaWYgKG1fZGVjb2RlcikKKyAgICAgICAgcmV0dXJuIG1fZGVj
b2Rlci0+ZW5jb2RpbmcoKS5kaXNwbGF5U3RyaW5nKHN0cik7CisgICAgcmV0dXJuIHN0cjsKK30K
Kwordm9pZCBEb2N1bWVudDo6ZGlzcGxheUJ1ZmZlck1vZGlmaWVkQnlFbmNvZGluZyhVQ2hhciog
YnVmZmVyLCB1bnNpZ25lZCBsZW4pIGNvbnN0Cit7CisgICAgaWYgKG1fZGVjb2RlcikKKyAgICAg
ICAgbV9kZWNvZGVyLT5lbmNvZGluZygpLmRpc3BsYXlCdWZmZXIoYnVmZmVyLCBsZW4pOworfQor
Cit2b2lkIERvY3VtZW50OjplbnF1ZXVlUGFnZXNob3dFdmVudChQYWdlc2hvd0V2ZW50UGVyc2lz
dGVuY2UgcGVyc2lzdGVkKQoreworICAgIC8vIEZJWE1FOiBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9MzYzMzQgUGFnZXNob3cgZXZlbnQgbmVlZHMgdG8gZmlyZSBhc3lu
Y2hyb25vdXNseS4KKyAgICBkaXNwYXRjaFdpbmRvd0V2ZW50KFBhZ2VUcmFuc2l0aW9uRXZlbnQ6
OmNyZWF0ZShldmVudE5hbWVzKCkucGFnZXNob3dFdmVudCwgcGVyc2lzdGVkKSwgdGhpcyk7Cit9
CisKK3ZvaWQgRG9jdW1lbnQ6OmVucXVldWVIYXNoY2hhbmdlRXZlbnQoY29uc3QgU3RyaW5nJiBv
bGRVUkwsIGNvbnN0IFN0cmluZyYgbmV3VVJMKQoreworICAgIGVucXVldWVXaW5kb3dFdmVudChI
YXNoQ2hhbmdlRXZlbnQ6OmNyZWF0ZShvbGRVUkwsIG5ld1VSTCkpOworfQorCit2b2lkIERvY3Vt
ZW50OjplbnF1ZXVlUG9wc3RhdGVFdmVudChQYXNzUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1
ZT4gc3RhdGVPYmplY3QpCit7CisgICAgLy8gRklYTUU6IGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD0zNjIwMiBQb3BzdGF0ZSBldmVudCBuZWVkcyB0byBmaXJlIGFzeW5j
aHJvbm91c2x5CisgICAgZGlzcGF0Y2hXaW5kb3dFdmVudChQb3BTdGF0ZUV2ZW50OjpjcmVhdGUo
c3RhdGVPYmplY3QsIGRvbVdpbmRvdygpID8gZG9tV2luZG93KCktPmhpc3RvcnkoKSA6IDApKTsK
K30KKwordm9pZCBEb2N1bWVudDo6YWRkTWVkaWFDYW5TdGFydExpc3RlbmVyKE1lZGlhQ2FuU3Rh
cnRMaXN0ZW5lciogbGlzdGVuZXIpCit7CisgICAgQVNTRVJUKCFtX21lZGlhQ2FuU3RhcnRMaXN0
ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKTsKKyAgICBtX21lZGlhQ2FuU3RhcnRMaXN0ZW5lcnMu
YWRkKGxpc3RlbmVyKTsKK30KKwordm9pZCBEb2N1bWVudDo6cmVtb3ZlTWVkaWFDYW5TdGFydExp
c3RlbmVyKE1lZGlhQ2FuU3RhcnRMaXN0ZW5lciogbGlzdGVuZXIpCit7CisgICAgQVNTRVJUKG1f
bWVkaWFDYW5TdGFydExpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpOworICAgIG1fbWVkaWFD
YW5TdGFydExpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworfQorCitNZWRpYUNhblN0YXJ0TGlz
dGVuZXIqIERvY3VtZW50Ojp0YWtlQW55TWVkaWFDYW5TdGFydExpc3RlbmVyKCkKK3sKKyAgICBI
YXNoU2V0PE1lZGlhQ2FuU3RhcnRMaXN0ZW5lcio+OjppdGVyYXRvciBzbG90ID0gbV9tZWRpYUNh
blN0YXJ0TGlzdGVuZXJzLmJlZ2luKCk7CisgICAgaWYgKHNsb3QgPT0gbV9tZWRpYUNhblN0YXJ0
TGlzdGVuZXJzLmVuZCgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBNZWRpYUNhblN0YXJ0TGlz
dGVuZXIqIGxpc3RlbmVyID0gKnNsb3Q7CisgICAgbV9tZWRpYUNhblN0YXJ0TGlzdGVuZXJzLnJl
bW92ZShzbG90KTsKKyAgICByZXR1cm4gbGlzdGVuZXI7Cit9CisKKyNpZiBFTkFCTEUoRlVMTFND
UkVFTl9BUEkpCitib29sIERvY3VtZW50OjpmdWxsU2NyZWVuSXNBbGxvd2VkRm9yRWxlbWVudChF
bGVtZW50KiBlbGVtZW50KSBjb25zdAoreworICAgIEFTU0VSVChlbGVtZW50KTsKKyAgICByZXR1
cm4gaXNBdHRyaWJ1dGVPbkFsbE93bmVycyh3ZWJraXRhbGxvd2Z1bGxzY3JlZW5BdHRyLCBlbGVt
ZW50LT5kb2N1bWVudCgpLT5vd25lckVsZW1lbnQoKSk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnJl
cXVlc3RGdWxsU2NyZWVuRm9yRWxlbWVudChFbGVtZW50KiBlbGVtZW50LCB1bnNpZ25lZCBzaG9y
dCBmbGFncywgRnVsbFNjcmVlbkNoZWNrVHlwZSBjaGVja1R5cGUpCit7CisgICAgLy8gVGhlIE1v
emlsbGEgRnVsbCBTY3JlZW4gQVBJIDxodHRwczovL3dpa2kubW96aWxsYS5vcmcvR2Vja286RnVs
bFNjcmVlbkFQST4gaGFzIGRpZmZlcmVudCByZXF1aXJlbWVudHMKKyAgICAvLyBmb3IgZnVsbCBz
Y3JlZW4gbW9kZSwgYW5kIGRvIG5vdCBoYXZlIHRoZSBjb25jZXB0IG9mIGEgZnVsbCBzY3JlZW4g
ZWxlbWVudCBzdGFjay4KKyAgICBib29sIGluTGVnYWN5TW96aWxsYU1vZGUgPSAoZmxhZ3MgJiBF
bGVtZW50OjpMRUdBQ1lfTU9aSUxMQV9SRVFVRVNUKTsKKworICAgIGRvIHsKKyAgICAgICAgaWYg
KCFlbGVtZW50KQorICAgICAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50RWxlbWVudCgpOworIAor
ICAgICAgICAvLyAxLiBJZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSB0cnVl
LCB0ZXJtaW5hdGUgdGhlc2Ugc3RlcHMgYW5kIHF1ZXVlIGEgdGFzayB0byBmaXJlCisgICAgICAg
IC8vIGFuIGV2ZW50IG5hbWVkIGZ1bGxzY3JlZW5lcnJvciB3aXRoIGl0cyBidWJibGVzIGF0dHJp
YnV0ZSBzZXQgdG8gdHJ1ZSBvbiB0aGUgY29udGV4dCBvYmplY3QncyAKKyAgICAgICAgLy8gbm9k
ZSBkb2N1bWVudDoKKworICAgICAgICAvLyBUaGUgY29udGV4dCBvYmplY3QgaXMgbm90IGluIGEg
ZG9jdW1lbnQuCisgICAgICAgIGlmICghZWxlbWVudC0+aW5Eb2N1bWVudCgpKQorICAgICAgICAg
ICAgYnJlYWs7CisKKyAgICAgICAgLy8gVGhlIGNvbnRleHQgb2JqZWN0J3Mgbm9kZSBkb2N1bWVu
dCwgb3IgYW4gYW5jZXN0b3IgYnJvd3NpbmcgY29udGV4dCdzIGRvY3VtZW50IGRvZXMgbm90IGhh
dmUKKyAgICAgICAgLy8gdGhlIGZ1bGxzY3JlZW4gZW5hYmxlZCBmbGFnIHNldC4KKyAgICAgICAg
aWYgKGNoZWNrVHlwZSA9PSBFbmZvcmNlSUZyYW1lQWxsb3dGdWxsU2NyZWVuUmVxdWlyZW1lbnQg
JiYgIWZ1bGxTY3JlZW5Jc0FsbG93ZWRGb3JFbGVtZW50KGVsZW1lbnQpKQorICAgICAgICAgICAg
YnJlYWs7CisKKyAgICAgICAgLy8gVGhlIGNvbnRleHQgb2JqZWN0J3Mgbm9kZSBkb2N1bWVudCBm
dWxsc2NyZWVuIGVsZW1lbnQgc3RhY2sgaXMgbm90IGVtcHR5IGFuZCBpdHMgdG9wIGVsZW1lbnQK
KyAgICAgICAgLy8gaXMgbm90IGFuIGFuY2VzdG9yIG9mIHRoZSBjb250ZXh0IG9iamVjdC4gKE5P
VEU6IElnbm9yZSB0aGlzIHJlcXVpcmVtZW50IGlmIHRoZSByZXF1ZXN0IHdhcworICAgICAgICAv
LyBtYWRlIHZpYSB0aGUgbGVnYWN5IE1vemlsbGEtc3R5bGUgQVBJLikKKyAgICAgICAgaWYgKCFt
X2Z1bGxTY3JlZW5FbGVtZW50U3RhY2suaXNFbXB0eSgpICYmICFtX2Z1bGxTY3JlZW5FbGVtZW50
U3RhY2suZmlyc3QoKS0+Y29udGFpbnMoZWxlbWVudCkgJiYgIWluTGVnYWN5TW96aWxsYU1vZGUp
CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvLyBBIGRlc2NlbmRhbnQgYnJvd3Npbmcg
Y29udGV4dCdzIGRvY3VtZW50IGhhcyBhIG5vbi1lbXB0eSBmdWxsc2NyZWVuIGVsZW1lbnQgc3Rh
Y2suCisgICAgICAgIGJvb2wgZGVzY2VuZGVudEhhc05vbkVtcHR5U3RhY2sgPSBmYWxzZTsKKyAg
ICAgICAgZm9yIChGcmFtZSogZGVzY2VuZGFudCA9IGZyYW1lKCkgPyBmcmFtZSgpLT50cmVlKCkt
PnRyYXZlcnNlTmV4dCgpIDogMDsgZGVzY2VuZGFudDsgZGVzY2VuZGFudCA9IGRlc2NlbmRhbnQt
PnRyZWUoKS0+dHJhdmVyc2VOZXh0KCkpIHsKKyAgICAgICAgICAgIGlmIChkZXNjZW5kYW50LT5k
b2N1bWVudCgpLT53ZWJraXRGdWxsc2NyZWVuRWxlbWVudCgpKSB7CisgICAgICAgICAgICAgICAg
ZGVzY2VuZGVudEhhc05vbkVtcHR5U3RhY2sgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChkZXNjZW5kZW50SGFzTm9u
RW1wdHlTdGFjayAmJiAhaW5MZWdhY3lNb3ppbGxhTW9kZSkKKyAgICAgICAgICAgIGJyZWFrOwor
CisgICAgICAgIC8vIFRoaXMgYWxnb3JpdGhtIGlzIG5vdCBhbGxvd2VkIHRvIHNob3cgYSBwb3At
dXA6CisgICAgICAgIC8vICAgQW4gYWxnb3JpdGhtIGlzIGFsbG93ZWQgdG8gc2hvdyBhIHBvcC11
cCBpZiwgaW4gdGhlIHRhc2sgaW4gd2hpY2ggdGhlIGFsZ29yaXRobSBpcyBydW5uaW5nLCBlaXRo
ZXI6CisgICAgICAgIC8vICAgLSBhbiBhY3RpdmF0aW9uIGJlaGF2aW9yIGlzIGN1cnJlbnRseSBi
ZWluZyBwcm9jZXNzZWQgd2hvc2UgY2xpY2sgZXZlbnQgd2FzIHRydXN0ZWQsIG9yCisgICAgICAg
IC8vICAgLSB0aGUgZXZlbnQgbGlzdGVuZXIgZm9yIGEgdHJ1c3RlZCBjbGljayBldmVudCBpcyBi
ZWluZyBoYW5kbGVkLgorICAgICAgICBpZiAoIVNjcmlwdENvbnRyb2xsZXI6OnByb2Nlc3NpbmdV
c2VyR2VzdHVyZSgpKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLy8gVGhlcmUgaXMg
YSBwcmV2aW91c2x5LWVzdGFibGlzaGVkIHVzZXIgcHJlZmVyZW5jZSwgc2VjdXJpdHkgcmlzaywg
b3IgcGxhdGZvcm0gbGltaXRhdGlvbi4KKyAgICAgICAgaWYgKCFwYWdlKCkgfHwgIXBhZ2UoKS0+
c2V0dGluZ3MoKS0+ZnVsbFNjcmVlbkVuYWJsZWQoKSkKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAKKyAgICAgICAgaWYgKCFwYWdlKCktPmNocm9tZSgpLT5jbGllbnQoKS0+c3VwcG9ydHNG
dWxsU2NyZWVuRm9yRWxlbWVudChlbGVtZW50LCBmbGFncyAmIEVsZW1lbnQ6OkFMTE9XX0tFWUJP
QVJEX0lOUFVUKSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8vIDIuIExldCBkb2Mg
YmUgZWxlbWVudCdzIG5vZGUgZG9jdW1lbnQuIChpLmUuICJ0aGlzIikKKyAgICAgICAgRG9jdW1l
bnQqIGN1cnJlbnREb2MgPSB0aGlzOworCisgICAgICAgIC8vIDMuIExldCBkb2NzIGJlIGFsbCBk
b2MncyBhbmNlc3RvciBicm93c2luZyBjb250ZXh0J3MgZG9jdW1lbnRzIChpZiBhbnkpIGFuZCBk
b2MuCisgICAgICAgIERlcXVlPERvY3VtZW50Kj4gZG9jczsKKworICAgICAgICBkbyB7CisgICAg
ICAgICAgICBkb2NzLnByZXBlbmQoY3VycmVudERvYyk7CisgICAgICAgICAgICBjdXJyZW50RG9j
ID0gY3VycmVudERvYy0+b3duZXJFbGVtZW50KCkgPyBjdXJyZW50RG9jLT5vd25lckVsZW1lbnQo
KS0+ZG9jdW1lbnQoKSA6IDA7CisgICAgICAgIH0gd2hpbGUgKGN1cnJlbnREb2MpOworCisgICAg
ICAgIC8vIDQuIEZvciBlYWNoIGRvY3VtZW50IGluIGRvY3MsIHJ1biB0aGVzZSBzdWJzdGVwczoK
KyAgICAgICAgRGVxdWU8RG9jdW1lbnQqPjo6aXRlcmF0b3IgY3VycmVudCA9IGRvY3MuYmVnaW4o
KSwgZm9sbG93aW5nID0gZG9jcy5iZWdpbigpOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAg
ICsrZm9sbG93aW5nOworCisgICAgICAgICAgICAvLyAxLiBMZXQgZm9sbG93aW5nIGRvY3VtZW50
IGJlIHRoZSBkb2N1bWVudCBhZnRlciBkb2N1bWVudCBpbiBkb2NzLCBvciBudWxsIGlmIHRoZXJl
IGlzIG5vCisgICAgICAgICAgICAvLyBzdWNoIGRvY3VtZW50LgorICAgICAgICAgICAgRG9jdW1l
bnQqIGN1cnJlbnREb2MgPSAqY3VycmVudDsKKyAgICAgICAgICAgIERvY3VtZW50KiBmb2xsb3dp
bmdEb2MgPSBmb2xsb3dpbmcgIT0gZG9jcy5lbmQoKSA/ICpmb2xsb3dpbmcgOiAwOworCisgICAg
ICAgICAgICAvLyAyLiBJZiBmb2xsb3dpbmcgZG9jdW1lbnQgaXMgbnVsbCwgcHVzaCBjb250ZXh0
IG9iamVjdCBvbiBkb2N1bWVudCdzIGZ1bGxzY3JlZW4gZWxlbWVudAorICAgICAgICAgICAgLy8g
c3RhY2ssIGFuZCBxdWV1ZSBhIHRhc2sgdG8gZmlyZSBhbiBldmVudCBuYW1lZCBmdWxsc2NyZWVu
Y2hhbmdlIHdpdGggaXRzIGJ1YmJsZXMgYXR0cmlidXRlCisgICAgICAgICAgICAvLyBzZXQgdG8g
dHJ1ZSBvbiB0aGUgZG9jdW1lbnQuCisgICAgICAgICAgICBpZiAoIWZvbGxvd2luZ0RvYykgewor
ICAgICAgICAgICAgICAgIGN1cnJlbnREb2MtPnB1c2hGdWxsc2NyZWVuRWxlbWVudFN0YWNrKGVs
ZW1lbnQpOworICAgICAgICAgICAgICAgIGFkZERvY3VtZW50VG9GdWxsU2NyZWVuQ2hhbmdlRXZl
bnRRdWV1ZShjdXJyZW50RG9jKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgLy8gMy4gT3RoZXJ3aXNlLCBpZiBkb2N1bWVudCdzIGZ1bGxz
Y3JlZW4gZWxlbWVudCBzdGFjayBpcyBlaXRoZXIgZW1wdHkgb3IgaXRzIHRvcCBlbGVtZW50Cisg
ICAgICAgICAgICAvLyBpcyBub3QgZm9sbG93aW5nIGRvY3VtZW50J3MgYnJvd3NpbmcgY29udGV4
dCBjb250YWluZXIsCisgICAgICAgICAgICBFbGVtZW50KiB0b3BFbGVtZW50ID0gY3VycmVudERv
Yy0+d2Via2l0RnVsbHNjcmVlbkVsZW1lbnQoKTsKKyAgICAgICAgICAgIGlmICghdG9wRWxlbWVu
dCB8fCB0b3BFbGVtZW50ICE9IGZvbGxvd2luZ0RvYy0+b3duZXJFbGVtZW50KCkpIHsKKyAgICAg
ICAgICAgICAgICAvLyAuLi5wdXNoIGZvbGxvd2luZyBkb2N1bWVudCdzIGJyb3dzaW5nIGNvbnRl
eHQgY29udGFpbmVyIG9uIGRvY3VtZW50J3MgZnVsbHNjcmVlbiBlbGVtZW50CisgICAgICAgICAg
ICAgICAgLy8gc3RhY2ssIGFuZCBxdWV1ZSBhIHRhc2sgdG8gZmlyZSBhbiBldmVudCBuYW1lZCBm
dWxsc2NyZWVuY2hhbmdlIHdpdGggaXRzIGJ1YmJsZXMgYXR0cmlidXRlCisgICAgICAgICAgICAg
ICAgLy8gc2V0IHRvIHRydWUgb24gZG9jdW1lbnQuCisgICAgICAgICAgICAgICAgY3VycmVudERv
Yy0+cHVzaEZ1bGxzY3JlZW5FbGVtZW50U3RhY2soZm9sbG93aW5nRG9jLT5vd25lckVsZW1lbnQo
KSk7CisgICAgICAgICAgICAgICAgYWRkRG9jdW1lbnRUb0Z1bGxTY3JlZW5DaGFuZ2VFdmVudFF1
ZXVlKGN1cnJlbnREb2MpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAg
fQorCisgICAgICAgICAgICAvLyA0LiBPdGhlcndpc2UsIGRvIG5vdGhpbmcgZm9yIHRoaXMgZG9j
dW1lbnQuIEl0IHN0YXlzIHRoZSBzYW1lLgorICAgICAgICB9IHdoaWxlICgrK2N1cnJlbnQgIT0g
ZG9jcy5lbmQoKSk7CisKKyAgICAgICAgLy8gNS4gUmV0dXJuLCBhbmQgcnVuIHRoZSByZW1haW5p
bmcgc3RlcHMgYXN5bmNocm9ub3VzbHkuCisgICAgICAgIC8vIDYuIE9wdGlvbmFsbHksIHBlcmZv
cm0gc29tZSBhbmltYXRpb24uCisgICAgICAgIG1fYXJlS2V5c0VuYWJsZWRJbkZ1bGxTY3JlZW4g
PSBmbGFncyAmIEVsZW1lbnQ6OkFMTE9XX0tFWUJPQVJEX0lOUFVUOworICAgICAgICBwYWdlKCkt
PmNocm9tZSgpLT5jbGllbnQoKS0+ZW50ZXJGdWxsU2NyZWVuRm9yRWxlbWVudChlbGVtZW50KTsK
KworICAgICAgICAvLyA3LiBPcHRpb25hbGx5LCBkaXNwbGF5IGEgbWVzc2FnZSBpbmRpY2F0aW5n
IGhvdyB0aGUgdXNlciBjYW4gZXhpdCBkaXNwbGF5aW5nIHRoZSBjb250ZXh0IG9iamVjdCBmdWxs
c2NyZWVuLgorICAgICAgICByZXR1cm47CisgICAgfSB3aGlsZSAoMCk7CisKKyAgICBtX2Z1bGxT
Y3JlZW5FcnJvckV2ZW50VGFyZ2V0UXVldWUuYXBwZW5kKGVsZW1lbnQgPyBlbGVtZW50IDogZG9j
dW1lbnRFbGVtZW50KCkpOworICAgIG1fZnVsbFNjcmVlbkNoYW5nZURlbGF5VGltZXIuc3RhcnRP
bmVTaG90KDApOworfQorCit2b2lkIERvY3VtZW50Ojp3ZWJraXRDYW5jZWxGdWxsU2NyZWVuKCkK
K3sKKyAgICAvLyBUaGUgTW96aWxsYSAiY2FuY2VsRnVsbFNjcmVlbigpIiBBUEkgYmVoYXZlcyBs
aWtlIHRoZSBXM0MgImZ1bGx5IGV4aXQgZnVsbHNjcmVlbiIgYmVoYXZpb3IsIHdoaWNoCisgICAg
Ly8gaXMgZGVmaW5lZCBhczogCisgICAgLy8gIlRvIGZ1bGx5IGV4aXQgZnVsbHNjcmVlbiBhY3Qg
YXMgaWYgdGhlIGV4aXRGdWxsc2NyZWVuKCkgbWV0aG9kIHdhcyBpbnZva2VkIG9uIHRoZSB0b3At
bGV2ZWwgYnJvd3NpbmcKKyAgICAvLyBjb250ZXh0J3MgZG9jdW1lbnQgYW5kIHN1YnNlcXVlbnRs
eSBlbXB0eSB0aGF0IGRvY3VtZW50J3MgZnVsbHNjcmVlbiBlbGVtZW50IHN0YWNrLiIKKyAgICBp
ZiAoIXRvcERvY3VtZW50KCktPndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50KCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIC8vIFRvIGFjaGlldmUgdGhhdCBhaW0sIHJlbW92ZSBhbGwgdGhlIGVsZW1l
bnRzIGZyb20gdGhlIHRvcCBkb2N1bWVudCdzIHN0YWNrIGV4Y2VwdCBmb3IgdGhlIGZpcnN0IGJl
Zm9yZQorICAgIC8vIGNhbGxpbmcgd2Via2l0RXhpdEZ1bGxzY3JlZW4oKToKKyAgICBEZXF1ZTxS
ZWZQdHI8RWxlbWVudD4gPiByZXBsYWNlbWVudEZ1bGxzY3JlZW5FbGVtZW50U3RhY2s7CisgICAg
cmVwbGFjZW1lbnRGdWxsc2NyZWVuRWxlbWVudFN0YWNrLnByZXBlbmQodG9wRG9jdW1lbnQoKS0+
d2Via2l0RnVsbHNjcmVlbkVsZW1lbnQoKSk7CisgICAgdG9wRG9jdW1lbnQoKS0+bV9mdWxsU2Ny
ZWVuRWxlbWVudFN0YWNrLnN3YXAocmVwbGFjZW1lbnRGdWxsc2NyZWVuRWxlbWVudFN0YWNrKTsK
KworICAgIHRvcERvY3VtZW50KCktPndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7Cit9CisKK3ZvaWQg
RG9jdW1lbnQ6OndlYmtpdEV4aXRGdWxsc2NyZWVuKCkKK3sKKyAgICAvLyBUaGUgZXhpdEZ1bGxz
Y3JlZW4oKSBtZXRob2QgbXVzdCBydW4gdGhlc2Ugc3RlcHM6CisgICAgCisgICAgLy8gMS4gTGV0
IGRvYyBiZSB0aGUgY29udGV4dCBvYmplY3QuIChpLmUuICJ0aGlzIikKKyAgICBEb2N1bWVudCog
Y3VycmVudERvYyA9IHRoaXM7CisKKyAgICAvLyAyLiBJZiBkb2MncyBmdWxsc2NyZWVuIGVsZW1l
bnQgc3RhY2sgaXMgZW1wdHksIHRlcm1pbmF0ZSB0aGVzZSBzdGVwcy4KKyAgICBpZiAobV9mdWxs
U2NyZWVuRWxlbWVudFN0YWNrLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworICAgIAorICAg
IC8vIDMuIExldCBkZXNjZW5kYW50cyBiZSBhbGwgdGhlIGRvYydzIGRlc2NlbmRhbnQgYnJvd3Np
bmcgY29udGV4dCdzIGRvY3VtZW50cyB3aXRoIGEgbm9uLWVtcHR5IGZ1bGxzY3JlZW4KKyAgICAv
LyBlbGVtZW50IHN0YWNrIChpZiBhbnkpLCBvcmRlcmVkIHNvIHRoYXQgdGhlIGNoaWxkIG9mIHRo
ZSBkb2MgaXMgbGFzdCBhbmQgdGhlIGRvY3VtZW50IGZ1cnRoZXN0CisgICAgLy8gYXdheSBmcm9t
IHRoZSBkb2MgaXMgZmlyc3QuCisgICAgRGVxdWU8UmVmUHRyPERvY3VtZW50PiA+IGRlc2NlbmRh
bnRzOworICAgIGZvciAoRnJhbWUqIGRlc2NlbmRhbnQgPSBmcmFtZSgpID8gZnJhbWUoKS0+dHJl
ZSgpLT50cmF2ZXJzZU5leHQoKSA6IDA7IGRlc2NlbmRhbnQ7IGRlc2NlbmRhbnQgPSBkZXNjZW5k
YW50LT50cmVlKCktPnRyYXZlcnNlTmV4dCgpKSB7CisgICAgICAgIGlmIChkZXNjZW5kYW50LT5k
b2N1bWVudCgpLT53ZWJraXRGdWxsc2NyZWVuRWxlbWVudCgpKQorICAgICAgICAgICAgZGVzY2Vu
ZGFudHMucHJlcGVuZChkZXNjZW5kYW50LT5kb2N1bWVudCgpKTsKKyAgICB9CisgICAgICAgIAor
ICAgIC8vIDQuIEZvciBlYWNoIGRlc2NlbmRhbnQgaW4gZGVzY2VuZGFudHMsIGVtcHR5IGRlc2Nl
bmRhbnQncyBmdWxsc2NyZWVuIGVsZW1lbnQgc3RhY2ssIGFuZCBxdWV1ZSBhCisgICAgLy8gdGFz
ayB0byBmaXJlIGFuIGV2ZW50IG5hbWVkIGZ1bGxzY3JlZW5jaGFuZ2Ugd2l0aCBpdHMgYnViYmxl
cyBhdHRyaWJ1dGUgc2V0IHRvIHRydWUgb24gZGVzY2VuZGFudC4KKyAgICBmb3IgKERlcXVlPFJl
ZlB0cjxEb2N1bWVudD4gPjo6aXRlcmF0b3IgaSA9IGRlc2NlbmRhbnRzLmJlZ2luKCk7IGkgIT0g
ZGVzY2VuZGFudHMuZW5kKCk7ICsraSkgeworICAgICAgICAoKmkpLT5jbGVhckZ1bGxzY3JlZW5F
bGVtZW50U3RhY2soKTsKKyAgICAgICAgYWRkRG9jdW1lbnRUb0Z1bGxTY3JlZW5DaGFuZ2VFdmVu
dFF1ZXVlKGktPmdldCgpKTsKKyAgICB9CisKKyAgICAvLyA1LiBXaGlsZSBkb2MgaXMgbm90IG51
bGwsIHJ1biB0aGVzZSBzdWJzdGVwczoKKyAgICBFbGVtZW50KiBuZXdUb3AgPSAwOworICAgIHdo
aWxlIChjdXJyZW50RG9jKSB7CisgICAgICAgIC8vIDEuIFBvcCB0aGUgdG9wIGVsZW1lbnQgb2Yg
ZG9jJ3MgZnVsbHNjcmVlbiBlbGVtZW50IHN0YWNrLgorICAgICAgICBjdXJyZW50RG9jLT5wb3BG
dWxsc2NyZWVuRWxlbWVudFN0YWNrKCk7CisKKyAgICAgICAgLy8gICAgSWYgZG9jJ3MgZnVsbHNj
cmVlbiBlbGVtZW50IHN0YWNrIGlzIG5vbi1lbXB0eSBhbmQgdGhlIGVsZW1lbnQgbm93IGF0IHRo
ZSB0b3AgaXMgZWl0aGVyCisgICAgICAgIC8vICAgIG5vdCBpbiBhIGRvY3VtZW50IG9yIGl0cyBu
b2RlIGRvY3VtZW50IGlzIG5vdCBkb2MsIHJlcGVhdCB0aGlzIHN1YnN0ZXAuCisgICAgICAgIG5l
d1RvcCA9IGN1cnJlbnREb2MtPndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50KCk7CisgICAgICAgIGlm
IChuZXdUb3AgJiYgKCFuZXdUb3AtPmluRG9jdW1lbnQoKSB8fCBuZXdUb3AtPmRvY3VtZW50KCkg
IT0gY3VycmVudERvYykpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAvLyAyLiBR
dWV1ZSBhIHRhc2sgdG8gZmlyZSBhbiBldmVudCBuYW1lZCBmdWxsc2NyZWVuY2hhbmdlIHdpdGgg
aXRzIGJ1YmJsZXMgYXR0cmlidXRlIHNldCB0byB0cnVlCisgICAgICAgIC8vIG9uIGRvYy4KKyAg
ICAgICAgYWRkRG9jdW1lbnRUb0Z1bGxTY3JlZW5DaGFuZ2VFdmVudFF1ZXVlKGN1cnJlbnREb2Mp
OworCisgICAgICAgIC8vIDMuIElmIGRvYydzIGZ1bGxzY3JlZW4gZWxlbWVudCBzdGFjayBpcyBl
bXB0eSBhbmQgZG9jJ3MgYnJvd3NpbmcgY29udGV4dCBoYXMgYSBicm93c2luZyBjb250ZXh0Cisg
ICAgICAgIC8vIGNvbnRhaW5lciwgc2V0IGRvYyB0byB0aGF0IGJyb3dzaW5nIGNvbnRleHQgY29u
dGFpbmVyJ3Mgbm9kZSBkb2N1bWVudC4KKyAgICAgICAgaWYgKCFuZXdUb3AgJiYgY3VycmVudERv
Yy0+b3duZXJFbGVtZW50KCkpIHsKKyAgICAgICAgICAgIGN1cnJlbnREb2MgPSBjdXJyZW50RG9j
LT5vd25lckVsZW1lbnQoKS0+ZG9jdW1lbnQoKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAg
ICAgICB9CisKKyAgICAgICAgLy8gNC4gT3RoZXJ3aXNlLCBzZXQgZG9jIHRvIG51bGwuCisgICAg
ICAgIGN1cnJlbnREb2MgPSAwOworICAgIH0KKworICAgIC8vIDYuIFJldHVybiwgYW5kIHJ1biB0
aGUgcmVtYWluaW5nIHN0ZXBzIGFzeW5jaHJvbm91c2x5LgorICAgIC8vIDcuIE9wdGlvbmFsbHks
IHBlcmZvcm0gc29tZSBhbmltYXRpb24uCisKKyAgICAvLyBPbmx5IGV4aXQgb3V0IG9mIGZ1bGwg
c2NyZWVuIHdpbmRvdyBtb2RlIGlmIHRoZXJlIGFyZSBubyByZW1haW5pbmcgZWxlbWVudHMgaW4g
dGhlIAorICAgIC8vIGZ1bGwgc2NyZWVuIHN0YWNrLgorICAgIGlmICghbmV3VG9wKSB7CisgICAg
ICAgIHBhZ2UoKS0+Y2hyb21lKCktPmNsaWVudCgpLT5leGl0RnVsbFNjcmVlbkZvckVsZW1lbnQo
bV9mdWxsU2NyZWVuRWxlbWVudC5nZXQoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAg
ICAvLyBPdGhlcndpc2UsIG5vdGlmeSB0aGUgY2hyb21lIG9mIHRoZSBuZXcgZnVsbCBzY3JlZW4g
ZWxlbWVudC4KKyAgICBwYWdlKCktPmNocm9tZSgpLT5jbGllbnQoKS0+ZW50ZXJGdWxsU2NyZWVu
Rm9yRWxlbWVudChuZXdUb3ApOyAgICAgIAorfQorCitib29sIERvY3VtZW50Ojp3ZWJraXRGdWxs
c2NyZWVuRW5hYmxlZCgpIGNvbnN0Cit7CisgICAgLy8gNC4gVGhlIGZ1bGxzY3JlZW5FbmFibGVk
IGF0dHJpYnV0ZSBtdXN0IHJldHVybiB0cnVlIGlmIHRoZSBjb250ZXh0IG9iamVjdCBhbmQgYWxs
IGFuY2VzdG9yCisgICAgLy8gYnJvd3NpbmcgY29udGV4dCdzIGRvY3VtZW50cyBoYXZlIHRoZWly
IGZ1bGxzY3JlZW4gZW5hYmxlZCBmbGFnIHNldCwgb3IgZmFsc2Ugb3RoZXJ3aXNlLgorCisgICAg
Ly8gVG9wLWxldmVsIGJyb3dzaW5nIGNvbnRleHRzIGFyZSBpbXBsaWVkIHRvIGhhdmUgdGhlaXIg
YWxsb3dGdWxsU2NyZWVuIGF0dHJpYnV0ZSBzZXQuCisgICAgcmV0dXJuIGlzQXR0cmlidXRlT25B
bGxPd25lcnMod2Via2l0YWxsb3dmdWxsc2NyZWVuQXR0ciwgb3duZXJFbGVtZW50KCkpOworfQor
Cit2b2lkIERvY3VtZW50Ojp3ZWJraXRXaWxsRW50ZXJGdWxsU2NyZWVuRm9yRWxlbWVudChFbGVt
ZW50KiBlbGVtZW50KQoreworICAgIGlmICghYXR0YWNoZWQoKSB8fCBpblBhZ2VDYWNoZSgpKQor
ICAgICAgICByZXR1cm47CisKKyAgICBBU1NFUlQoZWxlbWVudCk7CisKKyAgICAvLyBQcm90ZWN0
IGFnYWluc3QgYmVpbmcgY2FsbGVkIGFmdGVyIHRoZSBkb2N1bWVudCBoYXMgYmVlbiByZW1vdmVk
IGZyb20gdGhlIHBhZ2UuCisgICAgaWYgKCFwYWdlKCkpCisgICAgICAgIHJldHVybjsKKworICAg
IEFTU0VSVChwYWdlKCktPnNldHRpbmdzKCktPmZ1bGxTY3JlZW5FbmFibGVkKCkpOworCisgICAg
aWYgKG1fZnVsbFNjcmVlblJlbmRlcmVyKQorICAgICAgICBtX2Z1bGxTY3JlZW5SZW5kZXJlci0+
dW53cmFwUmVuZGVyZXIoKTsKKworICAgIG1fZnVsbFNjcmVlbkVsZW1lbnQgPSBlbGVtZW50Owor
CisjaWYgVVNFKE5BVElWRV9GVUxMU0NSRUVOX1ZJREVPKQorICAgIGlmIChlbGVtZW50ICYmIGVs
ZW1lbnQtPmlzTWVkaWFFbGVtZW50KCkpCisgICAgICAgIHJldHVybjsKKyNlbmRpZgorCisgICAg
Ly8gQ3JlYXRlIGEgcGxhY2Vob2xkZXIgYmxvY2sgZm9yIGEgdGhlIGZ1bGwtc2NyZWVuIGVsZW1l
bnQsIHRvIGtlZXAgdGhlIHBhZ2UgZnJvbSByZWZsb3dpbmcKKyAgICAvLyB3aGVuIHRoZSBlbGVt
ZW50IGlzIHJlbW92ZWQgZnJvbSB0aGUgbm9ybWFsIGZsb3cuICBPbmx5IGRvIHRoaXMgZm9yIGEg
UmVuZGVyQm94LCBhcyBvbmx5IAorICAgIC8vIGEgYm94IHdpbGwgaGF2ZSBhIGZyYW1lUmVjdC4g
IFRoZSBwbGFjZWhvbGRlciB3aWxsIGJlIGNyZWF0ZWQgaW4gc2V0RnVsbFNjcmVlblJlbmRlcmVy
KCkKKyAgICAvLyBkdXJpbmcgbGF5b3V0LgorICAgIFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSBt
X2Z1bGxTY3JlZW5FbGVtZW50LT5yZW5kZXJlcigpOworICAgIGJvb2wgc2hvdWxkQ3JlYXRlUGxh
Y2Vob2xkZXIgPSByZW5kZXJlciAmJiByZW5kZXJlci0+aXNCb3goKTsKKyAgICBpZiAoc2hvdWxk
Q3JlYXRlUGxhY2Vob2xkZXIpIHsKKyAgICAgICAgbV9zYXZlZFBsYWNlaG9sZGVyRnJhbWVSZWN0
ID0gdG9SZW5kZXJCb3gocmVuZGVyZXIpLT5mcmFtZVJlY3QoKTsKKyAgICAgICAgbV9zYXZlZFBs
YWNlaG9sZGVyUmVuZGVyU3R5bGUgPSBSZW5kZXJTdHlsZTo6Y2xvbmUocmVuZGVyZXItPnN0eWxl
KCkpOworICAgIH0KKworICAgIGlmIChtX2Z1bGxTY3JlZW5FbGVtZW50ICE9IGRvY3VtZW50RWxl
bWVudCgpKQorICAgICAgICBSZW5kZXJGdWxsU2NyZWVuOjp3cmFwUmVuZGVyZXIocmVuZGVyZXIs
IHJlbmRlcmVyID8gcmVuZGVyZXItPnBhcmVudCgpIDogMCwgdGhpcyk7CisKKyAgICBtX2Z1bGxT
Y3JlZW5FbGVtZW50LT5zZXRDb250YWluc0Z1bGxTY3JlZW5FbGVtZW50T25BbmNlc3RvcnNDcm9z
c2luZ0ZyYW1lQm91bmRhcmllcyh0cnVlKTsKKyAgICAKKyAgICByZWNhbGNTdHlsZShGb3JjZSk7
Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OndlYmtpdERpZEVudGVyRnVsbFNjcmVlbkZvckVsZW1lbnQo
RWxlbWVudCopCit7CisgICAgaWYgKCFtX2Z1bGxTY3JlZW5FbGVtZW50KQorICAgICAgICByZXR1
cm47CisKKyAgICBpZiAoIWF0dGFjaGVkKCkgfHwgaW5QYWdlQ2FjaGUoKSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgbV9mdWxsU2NyZWVuRWxlbWVudC0+ZGlkQmVjb21lRnVsbHNjcmVlbkVsZW1l
bnQoKTsKKworICAgIG1fZnVsbFNjcmVlbkNoYW5nZURlbGF5VGltZXIuc3RhcnRPbmVTaG90KDAp
OworfQorCit2b2lkIERvY3VtZW50Ojp3ZWJraXRXaWxsRXhpdEZ1bGxTY3JlZW5Gb3JFbGVtZW50
KEVsZW1lbnQqKQoreworICAgIGlmICghbV9mdWxsU2NyZWVuRWxlbWVudCkKKyAgICAgICAgcmV0
dXJuOworCisgICAgaWYgKCFhdHRhY2hlZCgpIHx8IGluUGFnZUNhY2hlKCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIG1fZnVsbFNjcmVlbkVsZW1lbnQtPndpbGxTdG9wQmVpbmdGdWxsc2NyZWVu
RWxlbWVudCgpOworfQorCit2b2lkIERvY3VtZW50Ojp3ZWJraXREaWRFeGl0RnVsbFNjcmVlbkZv
ckVsZW1lbnQoRWxlbWVudCopCit7CisgICAgaWYgKCFtX2Z1bGxTY3JlZW5FbGVtZW50KQorICAg
ICAgICByZXR1cm47CisKKyAgICBpZiAoIWF0dGFjaGVkKCkgfHwgaW5QYWdlQ2FjaGUoKSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgbV9mdWxsU2NyZWVuRWxlbWVudC0+c2V0Q29udGFpbnNGdWxs
U2NyZWVuRWxlbWVudE9uQW5jZXN0b3JzQ3Jvc3NpbmdGcmFtZUJvdW5kYXJpZXMoZmFsc2UpOwor
CisgICAgbV9hcmVLZXlzRW5hYmxlZEluRnVsbFNjcmVlbiA9IGZhbHNlOworICAgIAorICAgIGlm
IChtX2Z1bGxTY3JlZW5SZW5kZXJlcikKKyAgICAgICAgbV9mdWxsU2NyZWVuUmVuZGVyZXItPnVu
d3JhcFJlbmRlcmVyKCk7CisKKyAgICBtX2Z1bGxTY3JlZW5FbGVtZW50ID0gMDsKKyAgICBzY2hl
ZHVsZUZvcmNlZFN0eWxlUmVjYWxjKCk7CisgICAgCisgICAgLy8gV2hlbiB3ZWJraXRDYW5jZWxG
dWxsU2NyZWVuIGlzIGNhbGxlZCwgd2UgY2FsbCB3ZWJraXRFeGl0RnVsbFNjcmVlbiBvbiB0aGUg
dG9wRG9jdW1lbnQoKS4gVGhhdAorICAgIC8vIG1lYW5zIHRoYXQgdGhlIGV2ZW50cyB3aWxsIGJl
IHF1ZXVlZCB0aGVyZS4gU28gaWYgd2UgaGF2ZSBubyBldmVudHMgaGVyZSwgc3RhcnQgdGhlIHRp
bWVyIG9uCisgICAgLy8gdGhlIGV4aXRpbmcgZG9jdW1lbnQuCisgICAgRG9jdW1lbnQqIGV4aXRp
bmdEb2N1bWVudCA9IHRoaXM7CisgICAgaWYgKG1fZnVsbFNjcmVlbkNoYW5nZUV2ZW50VGFyZ2V0
UXVldWUuaXNFbXB0eSgpICYmIG1fZnVsbFNjcmVlbkVycm9yRXZlbnRUYXJnZXRRdWV1ZS5pc0Vt
cHR5KCkpCisgICAgICAgIGV4aXRpbmdEb2N1bWVudCA9IHRvcERvY3VtZW50KCk7CisgICAgZXhp
dGluZ0RvY3VtZW50LT5tX2Z1bGxTY3JlZW5DaGFuZ2VEZWxheVRpbWVyLnN0YXJ0T25lU2hvdCgw
KTsKK30KKyAgICAKK3ZvaWQgRG9jdW1lbnQ6OnNldEZ1bGxTY3JlZW5SZW5kZXJlcihSZW5kZXJG
dWxsU2NyZWVuKiByZW5kZXJlcikKK3sKKyAgICBpZiAocmVuZGVyZXIgPT0gbV9mdWxsU2NyZWVu
UmVuZGVyZXIpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChyZW5kZXJlciAmJiBtX3NhdmVk
UGxhY2Vob2xkZXJSZW5kZXJTdHlsZSkgCisgICAgICAgIHJlbmRlcmVyLT5jcmVhdGVQbGFjZWhv
bGRlcihtX3NhdmVkUGxhY2Vob2xkZXJSZW5kZXJTdHlsZS5yZWxlYXNlKCksIG1fc2F2ZWRQbGFj
ZWhvbGRlckZyYW1lUmVjdCk7CisgICAgZWxzZSBpZiAocmVuZGVyZXIgJiYgbV9mdWxsU2NyZWVu
UmVuZGVyZXIgJiYgbV9mdWxsU2NyZWVuUmVuZGVyZXItPnBsYWNlaG9sZGVyKCkpIHsKKyAgICAg
ICAgUmVuZGVyQmxvY2sqIHBsYWNlaG9sZGVyID0gbV9mdWxsU2NyZWVuUmVuZGVyZXItPnBsYWNl
aG9sZGVyKCk7CisgICAgICAgIHJlbmRlcmVyLT5jcmVhdGVQbGFjZWhvbGRlcihSZW5kZXJTdHls
ZTo6Y2xvbmUocGxhY2Vob2xkZXItPnN0eWxlKCkpLCBwbGFjZWhvbGRlci0+ZnJhbWVSZWN0KCkp
OworICAgIH0KKworICAgIGlmIChtX2Z1bGxTY3JlZW5SZW5kZXJlcikKKyAgICAgICAgbV9mdWxs
U2NyZWVuUmVuZGVyZXItPmRlc3Ryb3koKTsKKyAgICBBU1NFUlQoIW1fZnVsbFNjcmVlblJlbmRl
cmVyKTsKKworICAgIG1fZnVsbFNjcmVlblJlbmRlcmVyID0gcmVuZGVyZXI7CisgICAgCisgICAg
Ly8gVGhpcyBub3RpZmljYXRpb24gY2FuIGNvbWUgaW4gYWZ0ZXIgdGhlIHBhZ2UgaGFzIGJlZW4g
ZGVzdHJveWVkLgorICAgIGlmIChwYWdlKCkpCisgICAgICAgIHBhZ2UoKS0+Y2hyb21lKCktPmNs
aWVudCgpLT5mdWxsU2NyZWVuUmVuZGVyZXJDaGFuZ2VkKG1fZnVsbFNjcmVlblJlbmRlcmVyKTsK
K30KKwordm9pZCBEb2N1bWVudDo6ZnVsbFNjcmVlblJlbmRlcmVyRGVzdHJveWVkKCkKK3sKKyAg
ICBtX2Z1bGxTY3JlZW5SZW5kZXJlciA9IDA7CisKKyAgICBpZiAocGFnZSgpKQorICAgICAgICBw
YWdlKCktPmNocm9tZSgpLT5jbGllbnQoKS0+ZnVsbFNjcmVlblJlbmRlcmVyQ2hhbmdlZCgwKTsK
K30KKwordm9pZCBEb2N1bWVudDo6c2V0RnVsbFNjcmVlblJlbmRlcmVyU2l6ZShjb25zdCBJbnRT
aXplJiBzaXplKQoreworICAgIEFTU0VSVChtX2Z1bGxTY3JlZW5SZW5kZXJlcik7CisgICAgaWYg
KCFtX2Z1bGxTY3JlZW5SZW5kZXJlcikKKyAgICAgICAgcmV0dXJuOworICAgIAorICAgIGlmICht
X2Z1bGxTY3JlZW5SZW5kZXJlcikgeworICAgICAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IG5ld1N0
eWxlID0gUmVuZGVyU3R5bGU6OmNsb25lKG1fZnVsbFNjcmVlblJlbmRlcmVyLT5zdHlsZSgpKTsK
KyAgICAgICAgbmV3U3R5bGUtPnNldFdpZHRoKExlbmd0aChzaXplLndpZHRoKCksIFdlYkNvcmU6
OkZpeGVkKSk7CisgICAgICAgIG5ld1N0eWxlLT5zZXRIZWlnaHQoTGVuZ3RoKHNpemUuaGVpZ2h0
KCksIFdlYkNvcmU6OkZpeGVkKSk7CisgICAgICAgIG5ld1N0eWxlLT5zZXRUb3AoTGVuZ3RoKDAs
IFdlYkNvcmU6OkZpeGVkKSk7CisgICAgICAgIG5ld1N0eWxlLT5zZXRMZWZ0KExlbmd0aCgwLCBX
ZWJDb3JlOjpGaXhlZCkpOworICAgICAgICBtX2Z1bGxTY3JlZW5SZW5kZXJlci0+c2V0U3R5bGUo
bmV3U3R5bGUpOworICAgICAgICB1cGRhdGVMYXlvdXQoKTsKKyAgICB9Cit9CisgICAgCit2b2lk
IERvY3VtZW50OjpzZXRGdWxsU2NyZWVuUmVuZGVyZXJCYWNrZ3JvdW5kQ29sb3IoQ29sb3IgYmFj
a2dyb3VuZENvbG9yKQoreworICAgIGlmICghbV9mdWxsU2NyZWVuUmVuZGVyZXIpCisgICAgICAg
IHJldHVybjsKKyAgICAKKyAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IG5ld1N0eWxlID0gUmVuZGVy
U3R5bGU6OmNsb25lKG1fZnVsbFNjcmVlblJlbmRlcmVyLT5zdHlsZSgpKTsKKyAgICBuZXdTdHls
ZS0+c2V0QmFja2dyb3VuZENvbG9yKGJhY2tncm91bmRDb2xvcik7CisgICAgbV9mdWxsU2NyZWVu
UmVuZGVyZXItPnNldFN0eWxlKG5ld1N0eWxlKTsKK30KKyAgICAKK3ZvaWQgRG9jdW1lbnQ6OmZ1
bGxTY3JlZW5DaGFuZ2VEZWxheVRpbWVyRmlyZWQoVGltZXI8RG9jdW1lbnQ+KikKK3sKKyAgICAv
LyBTaW5jZSB3ZSBkaXNwYXRjaCBldmVudHMgaW4gdGhpcyBmdW5jdGlvbiwgaXQncyBwb3NzaWJs
ZSB0aGF0IHRoZQorICAgIC8vIGRvY3VtZW50IHdpbGwgYmUgZGV0YWNoZWQgYW5kIEdDJ2QuIFdl
IHByb3RlY3QgaXQgaGVyZSB0byBtYWtlIHN1cmUgd2UKKyAgICAvLyBjYW4gZmluaXNoIHRoZSBm
dW5jdGlvbiBzdWNjZXNzZnVsbHkuCisgICAgUmVmUHRyPERvY3VtZW50PiBwcm90ZWN0RG9jdW1l
bnQodGhpcyk7CisgICAgRGVxdWU8UmVmUHRyPE5vZGU+ID4gY2hhbmdlUXVldWU7CisgICAgbV9m
dWxsU2NyZWVuQ2hhbmdlRXZlbnRUYXJnZXRRdWV1ZS5zd2FwKGNoYW5nZVF1ZXVlKTsKKworICAg
IHdoaWxlICghY2hhbmdlUXVldWUuaXNFbXB0eSgpKSB7CisgICAgICAgIFJlZlB0cjxOb2RlPiBu
b2RlID0gY2hhbmdlUXVldWUudGFrZUZpcnN0KCk7CisgICAgICAgIGlmICghbm9kZSkKKyAgICAg
ICAgICAgIG5vZGUgPSBkb2N1bWVudEVsZW1lbnQoKTsKKyAgICAgICAgLy8gVGhlIGRpc3BhdGNo
RXZlbnQgYmVsb3cgbWF5IGhhdmUgYmxvd24gYXdheSBvdXIgZG9jdW1lbnRFbGVtZW50LgorICAg
ICAgICBpZiAoIW5vZGUpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAvLyBJZiB0
aGUgZWxlbWVudCB3YXMgcmVtb3ZlZCBmcm9tIG91ciB0cmVlLCBhbHNvIG1lc3NhZ2UgdGhlIGRv
Y3VtZW50RWxlbWVudC4gU2luY2Ugd2UgbWF5CisgICAgICAgIC8vIGhhdmUgYSBkb2N1bWVudCBo
aWVyYXJjaHksIGNoZWNrIHRoYXQgbm9kZSBpc24ndCBpbiBhbm90aGVyIGRvY3VtZW50LgorICAg
ICAgICBpZiAoIWNvbnRhaW5zKG5vZGUuZ2V0KCkpICYmICFub2RlLT5pbkRvY3VtZW50KCkpCisg
ICAgICAgICAgICBjaGFuZ2VRdWV1ZS5hcHBlbmQoZG9jdW1lbnRFbGVtZW50KCkpOworICAgICAg
ICAKKyAgICAgICAgbm9kZS0+ZGlzcGF0Y2hFdmVudChFdmVudDo6Y3JlYXRlKGV2ZW50TmFtZXMo
KS53ZWJraXRmdWxsc2NyZWVuY2hhbmdlRXZlbnQsIHRydWUsIGZhbHNlKSk7CisgICAgfQorCisg
ICAgRGVxdWU8UmVmUHRyPE5vZGU+ID4gZXJyb3JRdWV1ZTsKKyAgICBtX2Z1bGxTY3JlZW5FcnJv
ckV2ZW50VGFyZ2V0UXVldWUuc3dhcChlcnJvclF1ZXVlKTsKKyAgICAKKyAgICB3aGlsZSAoIWVy
cm9yUXVldWUuaXNFbXB0eSgpKSB7CisgICAgICAgIFJlZlB0cjxOb2RlPiBub2RlID0gZXJyb3JR
dWV1ZS50YWtlRmlyc3QoKTsKKyAgICAgICAgaWYgKCFub2RlKQorICAgICAgICAgICAgbm9kZSA9
IGRvY3VtZW50RWxlbWVudCgpOworICAgICAgICAvLyBUaGUgZGlzcGF0Y2hFdmVudCBiZWxvdyBt
YXkgaGF2ZSBibG93biBhd2F5IG91ciBkb2N1bWVudEVsZW1lbnQuCisgICAgICAgIGlmICghbm9k
ZSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAKKyAgICAgICAgLy8gSWYgdGhlIGVs
ZW1lbnQgd2FzIHJlbW92ZWQgZnJvbSBvdXIgdHJlZSwgYWxzbyBtZXNzYWdlIHRoZSBkb2N1bWVu
dEVsZW1lbnQuIFNpbmNlIHdlIG1heQorICAgICAgICAvLyBoYXZlIGEgZG9jdW1lbnQgaGllcmFy
Y2h5LCBjaGVjayB0aGF0IG5vZGUgaXNuJ3QgaW4gYW5vdGhlciBkb2N1bWVudC4KKyAgICAgICAg
aWYgKCFjb250YWlucyhub2RlLmdldCgpKSAmJiAhbm9kZS0+aW5Eb2N1bWVudCgpKQorICAgICAg
ICAgICAgZXJyb3JRdWV1ZS5hcHBlbmQoZG9jdW1lbnRFbGVtZW50KCkpOworICAgICAgICAKKyAg
ICAgICAgbm9kZS0+ZGlzcGF0Y2hFdmVudChFdmVudDo6Y3JlYXRlKGV2ZW50TmFtZXMoKS53ZWJr
aXRmdWxsc2NyZWVuZXJyb3JFdmVudCwgdHJ1ZSwgZmFsc2UpKTsKKyAgICB9Cit9CisKK3ZvaWQg
RG9jdW1lbnQ6OmZ1bGxTY3JlZW5FbGVtZW50UmVtb3ZlZCgpCit7CisgICAgbV9mdWxsU2NyZWVu
RWxlbWVudC0+c2V0Q29udGFpbnNGdWxsU2NyZWVuRWxlbWVudE9uQW5jZXN0b3JzQ3Jvc3NpbmdG
cmFtZUJvdW5kYXJpZXMoZmFsc2UpOworICAgIHdlYmtpdENhbmNlbEZ1bGxTY3JlZW4oKTsKK30K
Kwordm9pZCBEb2N1bWVudDo6cmVtb3ZlRnVsbFNjcmVlbkVsZW1lbnRPZlN1YnRyZWUoTm9kZSog
bm9kZSwgYm9vbCBhbW9uZ0NoaWxkcmVuT25seSkKK3sKKyAgICBpZiAoIW1fZnVsbFNjcmVlbkVs
ZW1lbnQpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICBib29sIGVsZW1lbnRJblN1YnRyZWUg
PSBmYWxzZTsKKyAgICBpZiAoYW1vbmdDaGlsZHJlbk9ubHkpCisgICAgICAgIGVsZW1lbnRJblN1
YnRyZWUgPSBtX2Z1bGxTY3JlZW5FbGVtZW50LT5pc0Rlc2NlbmRhbnRPZihub2RlKTsKKyAgICBl
bHNlCisgICAgICAgIGVsZW1lbnRJblN1YnRyZWUgPSAobV9mdWxsU2NyZWVuRWxlbWVudCA9PSBu
b2RlKSB8fCBtX2Z1bGxTY3JlZW5FbGVtZW50LT5pc0Rlc2NlbmRhbnRPZihub2RlKTsKKyAgICAK
KyAgICBpZiAoZWxlbWVudEluU3VidHJlZSkKKyAgICAgICAgZnVsbFNjcmVlbkVsZW1lbnRSZW1v
dmVkKCk7Cit9CisKK2Jvb2wgRG9jdW1lbnQ6OmlzQW5pbWF0aW5nRnVsbFNjcmVlbigpIGNvbnN0
Cit7CisgICAgcmV0dXJuIG1faXNBbmltYXRpbmdGdWxsU2NyZWVuOworfQorCit2b2lkIERvY3Vt
ZW50OjpzZXRBbmltYXRpbmdGdWxsU2NyZWVuKGJvb2wgZmxhZykKK3sKKyAgICBpZiAobV9pc0Fu
aW1hdGluZ0Z1bGxTY3JlZW4gPT0gZmxhZykKKyAgICAgICAgcmV0dXJuOworICAgIG1faXNBbmlt
YXRpbmdGdWxsU2NyZWVuID0gZmxhZzsKKworICAgIGlmIChtX2Z1bGxTY3JlZW5FbGVtZW50ICYm
IG1fZnVsbFNjcmVlbkVsZW1lbnQtPmlzRGVzY2VuZGFudE9mKHRoaXMpKSB7CisgICAgICAgIG1f
ZnVsbFNjcmVlbkVsZW1lbnQtPnNldE5lZWRzU3R5bGVSZWNhbGMoKTsKKyAgICAgICAgc2NoZWR1
bGVGb3JjZWRTdHlsZVJlY2FsYygpOworICAgIH0KK30KKwordm9pZCBEb2N1bWVudDo6Y2xlYXJG
dWxsc2NyZWVuRWxlbWVudFN0YWNrKCkKK3sKKyAgICBtX2Z1bGxTY3JlZW5FbGVtZW50U3RhY2su
Y2xlYXIoKTsKK30KKwordm9pZCBEb2N1bWVudDo6cG9wRnVsbHNjcmVlbkVsZW1lbnRTdGFjaygp
Cit7CisgICAgaWYgKG1fZnVsbFNjcmVlbkVsZW1lbnRTdGFjay5pc0VtcHR5KCkpCisgICAgICAg
IHJldHVybjsKKworICAgIG1fZnVsbFNjcmVlbkVsZW1lbnRTdGFjay5yZW1vdmVGaXJzdCgpOwor
fQorCit2b2lkIERvY3VtZW50OjpwdXNoRnVsbHNjcmVlbkVsZW1lbnRTdGFjayhFbGVtZW50KiBl
bGVtZW50KQoreworICAgIG1fZnVsbFNjcmVlbkVsZW1lbnRTdGFjay5wcmVwZW5kKGVsZW1lbnQp
OworfQorCit2b2lkIERvY3VtZW50OjphZGREb2N1bWVudFRvRnVsbFNjcmVlbkNoYW5nZUV2ZW50
UXVldWUoRG9jdW1lbnQqIGRvYykKK3sKKyAgICBBU1NFUlQoZG9jKTsKKyAgICBOb2RlKiB0YXJn
ZXQgPSBkb2MtPndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50KCk7CisgICAgaWYgKCF0YXJnZXQpCisg
ICAgICAgIHRhcmdldCA9IGRvYy0+d2Via2l0Q3VycmVudEZ1bGxTY3JlZW5FbGVtZW50KCk7Cisg
ICAgaWYgKCF0YXJnZXQpCisgICAgICAgIHRhcmdldCA9IGRvYzsKKyAgICBtX2Z1bGxTY3JlZW5D
aGFuZ2VFdmVudFRhcmdldFF1ZXVlLmFwcGVuZCh0YXJnZXQpOworfQorI2VuZGlmCisKKyNpZiBF
TkFCTEUoUE9JTlRFUl9MT0NLKQordm9pZCBEb2N1bWVudDo6d2Via2l0RXhpdFBvaW50ZXJMb2Nr
KCkKK3sKKyAgICBpZiAoIXBhZ2UoKSkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChFbGVtZW50
KiB0YXJnZXQgPSBwYWdlKCktPnBvaW50ZXJMb2NrQ29udHJvbGxlcigpLT5lbGVtZW50KCkpIHsK
KyAgICAgICAgaWYgKHRhcmdldC0+ZG9jdW1lbnQoKSAhPSB0aGlzKQorICAgICAgICAgICAgcmV0
dXJuOworICAgIH0KKyAgICBwYWdlKCktPnBvaW50ZXJMb2NrQ29udHJvbGxlcigpLT5yZXF1ZXN0
UG9pbnRlclVubG9jaygpOworfQorCitFbGVtZW50KiBEb2N1bWVudDo6d2Via2l0UG9pbnRlckxv
Y2tFbGVtZW50KCkgY29uc3QKK3sKKyAgICBpZiAoIXBhZ2UoKSB8fCBwYWdlKCktPnBvaW50ZXJM
b2NrQ29udHJvbGxlcigpLT5sb2NrUGVuZGluZygpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBp
ZiAoRWxlbWVudCogZWxlbWVudCA9IHBhZ2UoKS0+cG9pbnRlckxvY2tDb250cm9sbGVyKCktPmVs
ZW1lbnQoKSkgeworICAgICAgICBpZiAoZWxlbWVudC0+ZG9jdW1lbnQoKSA9PSB0aGlzKQorICAg
ICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CisgICAgfQorICAgIHJldHVybiAwOworfQorI2VuZGlm
CisKK3ZvaWQgRG9jdW1lbnQ6OmRlY3JlbWVudExvYWRFdmVudERlbGF5Q291bnQoKQoreworICAg
IEFTU0VSVChtX2xvYWRFdmVudERlbGF5Q291bnQpOworICAgIC0tbV9sb2FkRXZlbnREZWxheUNv
dW50OworCisgICAgaWYgKGZyYW1lKCkgJiYgIW1fbG9hZEV2ZW50RGVsYXlDb3VudCAmJiAhbV9s
b2FkRXZlbnREZWxheVRpbWVyLmlzQWN0aXZlKCkpCisgICAgICAgIG1fbG9hZEV2ZW50RGVsYXlU
aW1lci5zdGFydE9uZVNob3QoMCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmxvYWRFdmVudERlbGF5
VGltZXJGaXJlZChUaW1lcjxEb2N1bWVudD4qKQoreworICAgIGlmIChmcmFtZSgpKQorICAgICAg
ICBmcmFtZSgpLT5sb2FkZXIoKS0+Y2hlY2tDb21wbGV0ZWQoKTsKK30KKworI2lmIEVOQUJMRShS
RVFVRVNUX0FOSU1BVElPTl9GUkFNRSkKK2ludCBEb2N1bWVudDo6d2Via2l0UmVxdWVzdEFuaW1h
dGlvbkZyYW1lKFBhc3NSZWZQdHI8UmVxdWVzdEFuaW1hdGlvbkZyYW1lQ2FsbGJhY2s+IGNhbGxi
YWNrKQoreworICAgIGlmICghbV9zY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXIpIHsKKyNpZiBV
U0UoUkVRVUVTVF9BTklNQVRJT05fRlJBTUVfRElTUExBWV9NT05JVE9SKQorICAgICAgICBtX3Nj
cmlwdGVkQW5pbWF0aW9uQ29udHJvbGxlciA9IFNjcmlwdGVkQW5pbWF0aW9uQ29udHJvbGxlcjo6
Y3JlYXRlKHRoaXMsIHBhZ2UoKSA/IHBhZ2UoKS0+ZGlzcGxheUlEKCkgOiAwKTsKKyNlbHNlCisg
ICAgICAgIG1fc2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyID0gU2NyaXB0ZWRBbmltYXRpb25D
b250cm9sbGVyOjpjcmVhdGUodGhpcywgMCk7CisjZW5kaWYKKyAgICAgICAgLy8gSXQncyBwb3Nz
aWJsZSB0aGF0IHRoZSBQYWdlIG1heSBoYXZlIHN1c3BlbmRlZCBzY3JpcHRlZCBhbmltYXRpb25z
IGJlZm9yZQorICAgICAgICAvLyB3ZSB3ZXJlIGNyZWF0ZWQuIFdlIG5lZWQgdG8gbWFrZSBzdXJl
IHRoYXQgd2UgZG9uJ3Qgc3RhcnQgdXAgdGhlIGFuaW1hdGlvbgorICAgICAgICAvLyBjb250cm9s
bGVyIG9uIGEgYmFja2dyb3VuZCB0YWIsIGZvciBleGFtcGxlLgorICAgICAgICBpZiAoIXBhZ2Uo
KSB8fCBwYWdlKCktPnNjcmlwdGVkQW5pbWF0aW9uc1N1c3BlbmRlZCgpKQorICAgICAgICAgICAg
bV9zY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXItPnN1c3BlbmQoKTsKKyAgICB9CisKKyAgICBy
ZXR1cm4gbV9zY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXItPnJlZ2lzdGVyQ2FsbGJhY2soY2Fs
bGJhY2spOworfQorCit2b2lkIERvY3VtZW50Ojp3ZWJraXRDYW5jZWxBbmltYXRpb25GcmFtZShp
bnQgaWQpCit7CisgICAgaWYgKCFtX3NjcmlwdGVkQW5pbWF0aW9uQ29udHJvbGxlcikKKyAgICAg
ICAgcmV0dXJuOworICAgIG1fc2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyLT5jYW5jZWxDYWxs
YmFjayhpZCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnNlcnZpY2VTY3JpcHRlZEFuaW1hdGlvbnMo
RE9NVGltZVN0YW1wIHRpbWUpCit7CisgICAgaWYgKCFtX3NjcmlwdGVkQW5pbWF0aW9uQ29udHJv
bGxlcikKKyAgICAgICAgcmV0dXJuOworICAgIG1fc2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVy
LT5zZXJ2aWNlU2NyaXB0ZWRBbmltYXRpb25zKHRpbWUpOworfQorI2VuZGlmCisKKyNpZiBFTkFC
TEUoVE9VQ0hfRVZFTlRTKQorUGFzc1JlZlB0cjxUb3VjaD4gRG9jdW1lbnQ6OmNyZWF0ZVRvdWNo
KERPTVdpbmRvdyogd2luZG93LCBFdmVudFRhcmdldCogdGFyZ2V0LCBpbnQgaWRlbnRpZmllciwg
aW50IHBhZ2VYLCBpbnQgcGFnZVksIGludCBzY3JlZW5YLCBpbnQgc2NyZWVuWSwgaW50IHJhZGl1
c1gsIGludCByYWRpdXNZLCBmbG9hdCByb3RhdGlvbkFuZ2xlLCBmbG9hdCBmb3JjZSwgRXhjZXB0
aW9uQ29kZSYpIGNvbnN0Cit7CisgICAgLy8gRklYTUU6IEl0J3Mgbm90IGNsZWFyIGZyb20gdGhl
IGRvY3VtZW50YXRpb24gYXQKKyAgICAvLyBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9saWJy
YXJ5L3NhZmFyaS8jZG9jdW1lbnRhdGlvbi9Vc2VyRXhwZXJpZW5jZS9SZWZlcmVuY2UvRG9jdW1l
bnRBZGRpdGlvbnNSZWZlcmVuY2UvRG9jdW1lbnRBZGRpdGlvbnMvRG9jdW1lbnRBZGRpdGlvbnMu
aHRtbAorICAgIC8vIHdoZW4gdGhpcyBtZXRob2Qgc2hvdWxkIHRocm93IGFuZCBub3IgaXMgaXQg
YnkgaW5zcGVjdGlvbiBvZiBpT1MgYmVoYXZpb3IuIEl0IHdvdWxkIGJlIG5pY2UgdG8gdmVyaWZ5
IGFueSBjYXNlcyB3aGVyZSBpdCB0aHJvd3MgdW5kZXIgaU9TCisgICAgLy8gYW5kIGltcGxlbWVu
dCB0aGVtIGhlcmUuIFNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
NDc4MTkKKyAgICBGcmFtZSogZnJhbWUgPSB3aW5kb3cgPyB3aW5kb3ctPmZyYW1lKCkgOiB0aGlz
LT5mcmFtZSgpOworICAgIHJldHVybiBUb3VjaDo6Y3JlYXRlKGZyYW1lLCB0YXJnZXQsIGlkZW50
aWZpZXIsIHNjcmVlblgsIHNjcmVlblksIHBhZ2VYLCBwYWdlWSwgcmFkaXVzWCwgcmFkaXVzWSwg
cm90YXRpb25BbmdsZSwgZm9yY2UpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHdoZWVsRXZl
bnRIYW5kbGVyQ291bnRDaGFuZ2VkKERvY3VtZW50KiBkb2N1bWVudCkKK3sKKyAgICBQYWdlKiBw
YWdlID0gZG9jdW1lbnQtPnBhZ2UoKTsKKyAgICBpZiAoIXBhZ2UpCisgICAgICAgIHJldHVybjsK
KworICAgIFNjcm9sbGluZ0Nvb3JkaW5hdG9yKiBzY3JvbGxpbmdDb29yZGluYXRvciA9IHBhZ2Ut
PnNjcm9sbGluZ0Nvb3JkaW5hdG9yKCk7CisgICAgaWYgKCFzY3JvbGxpbmdDb29yZGluYXRvcikK
KyAgICAgICAgcmV0dXJuOworCisgICAgRnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBkb2N1bWVudC0+
dmlldygpOworICAgIGlmICghZnJhbWVWaWV3KQorICAgICAgICByZXR1cm47CisKKyAgICBzY3Jv
bGxpbmdDb29yZGluYXRvci0+ZnJhbWVWaWV3V2hlZWxFdmVudEhhbmRsZXJDb3VudENoYW5nZWQo
ZnJhbWVWaWV3KTsKK30KKwordm9pZCBEb2N1bWVudDo6ZGlkQWRkV2hlZWxFdmVudEhhbmRsZXIo
KQoreworICAgICsrbV93aGVlbEV2ZW50SGFuZGxlckNvdW50OworICAgIEZyYW1lKiBtYWluRnJh
bWUgPSBwYWdlKCkgPyBwYWdlKCktPm1haW5GcmFtZSgpIDogMDsKKyAgICBpZiAobWFpbkZyYW1l
KQorICAgICAgICBtYWluRnJhbWUtPm5vdGlmeUNocm9tZUNsaWVudFdoZWVsRXZlbnRIYW5kbGVy
Q291bnRDaGFuZ2VkKCk7CisKKyAgICB3aGVlbEV2ZW50SGFuZGxlckNvdW50Q2hhbmdlZCh0aGlz
KTsKK30KKwordm9pZCBEb2N1bWVudDo6ZGlkUmVtb3ZlV2hlZWxFdmVudEhhbmRsZXIoKQorewor
ICAgIEFTU0VSVChtX3doZWVsRXZlbnRIYW5kbGVyQ291bnQgPiAwKTsKKyAgICAtLW1fd2hlZWxF
dmVudEhhbmRsZXJDb3VudDsKKyAgICBGcmFtZSogbWFpbkZyYW1lID0gcGFnZSgpID8gcGFnZSgp
LT5tYWluRnJhbWUoKSA6IDA7CisgICAgaWYgKG1haW5GcmFtZSkKKyAgICAgICAgbWFpbkZyYW1l
LT5ub3RpZnlDaHJvbWVDbGllbnRXaGVlbEV2ZW50SGFuZGxlckNvdW50Q2hhbmdlZCgpOworCisg
ICAgd2hlZWxFdmVudEhhbmRsZXJDb3VudENoYW5nZWQodGhpcyk7Cit9CisKK3ZvaWQgRG9jdW1l
bnQ6OmRpZEFkZFRvdWNoRXZlbnRIYW5kbGVyKCkKK3sKKyNpZiBFTkFCTEUoVE9VQ0hfRVZFTlRT
KQorICAgICsrbV90b3VjaEV2ZW50SGFuZGxlckNvdW50OworICAgIGlmIChtX3RvdWNoRXZlbnRI
YW5kbGVyQ291bnQgPiAxKQorICAgICAgICByZXR1cm47CisgICAgaWYgKFBhZ2UqIHBhZ2UgPSB0
aGlzLT5wYWdlKCkpCisgICAgICAgIHBhZ2UtPmNocm9tZSgpLT5jbGllbnQoKS0+bmVlZFRvdWNo
RXZlbnRzKHRydWUpOworI2VuZGlmCit9CisKK3ZvaWQgRG9jdW1lbnQ6OmRpZFJlbW92ZVRvdWNo
RXZlbnRIYW5kbGVyKCkKK3sKKyNpZiBFTkFCTEUoVE9VQ0hfRVZFTlRTKQorICAgIEFTU0VSVCht
X3RvdWNoRXZlbnRIYW5kbGVyQ291bnQpOworICAgIC0tbV90b3VjaEV2ZW50SGFuZGxlckNvdW50
OworICAgIGlmIChtX3RvdWNoRXZlbnRIYW5kbGVyQ291bnQpCisgICAgICAgIHJldHVybjsKKwor
ICAgIFBhZ2UqIHBhZ2UgPSB0aGlzLT5wYWdlKCk7CisgICAgaWYgKCFwYWdlKQorICAgICAgICBy
ZXR1cm47CisgICAgZm9yIChjb25zdCBGcmFtZSogZnJhbWUgPSBwYWdlLT5tYWluRnJhbWUoKTsg
ZnJhbWU7IGZyYW1lID0gZnJhbWUtPnRyZWUoKS0+dHJhdmVyc2VOZXh0KCkpIHsKKyAgICAgICAg
aWYgKGZyYW1lLT5kb2N1bWVudCgpICYmIGZyYW1lLT5kb2N1bWVudCgpLT50b3VjaEV2ZW50SGFu
ZGxlckNvdW50KCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgfQorICAgIHBhZ2UtPmNocm9t
ZSgpLT5jbGllbnQoKS0+bmVlZFRvdWNoRXZlbnRzKGZhbHNlKTsKKyNlbmRpZgorfQorCitIVE1M
SUZyYW1lRWxlbWVudCogRG9jdW1lbnQ6OnNlYW1sZXNzUGFyZW50SUZyYW1lKCkgY29uc3QKK3sK
KyAgICBpZiAoIXNob3VsZERpc3BsYXlTZWFtbGVzc2x5V2l0aFBhcmVudCgpKQorICAgICAgICBy
ZXR1cm4gMDsKKworICAgIEhUTUxGcmFtZU93bmVyRWxlbWVudCogb3duZXJFbGVtZW50ID0gdGhp
cy0+b3duZXJFbGVtZW50KCk7CisgICAgQVNTRVJUKG93bmVyRWxlbWVudC0+aGFzVGFnTmFtZShp
ZnJhbWVUYWcpKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SFRNTElGcmFtZUVsZW1lbnQqPihv
d25lckVsZW1lbnQpOworfQorCitib29sIERvY3VtZW50OjpzaG91bGREaXNwbGF5U2VhbWxlc3Ns
eVdpdGhQYXJlbnQoKSBjb25zdAoreworI2lmIEVOQUJMRShJRlJBTUVfU0VBTUxFU1MpCisgICAg
SFRNTEZyYW1lT3duZXJFbGVtZW50KiBvd25lckVsZW1lbnQgPSB0aGlzLT5vd25lckVsZW1lbnQo
KTsKKyAgICBpZiAoIW93bmVyRWxlbWVudCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJl
dHVybiBtX21heURpc3BsYXlTZWFtbGVzc1dpdGhQYXJlbnQgJiYgb3duZXJFbGVtZW50LT5oYXNU
YWdOYW1lKGlmcmFtZVRhZykgJiYgb3duZXJFbGVtZW50LT5mYXN0SGFzQXR0cmlidXRlKHNlYW1s
ZXNzQXR0cik7CisjZWxzZQorICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorfQorCitEb2N1bWVu
dExvYWRlciogRG9jdW1lbnQ6OmxvYWRlcigpIGNvbnN0Cit7CisgICAgaWYgKCFtX2ZyYW1lKQor
ICAgICAgICByZXR1cm4gMDsKKyAgICAKKyAgICBEb2N1bWVudExvYWRlciogbG9hZGVyID0gbV9m
cmFtZS0+bG9hZGVyKCktPmRvY3VtZW50TG9hZGVyKCk7CisgICAgaWYgKCFsb2FkZXIpCisgICAg
ICAgIHJldHVybiAwOworICAgIAorICAgIGlmIChtX2ZyYW1lLT5kb2N1bWVudCgpICE9IHRoaXMp
CisgICAgICAgIHJldHVybiAwOworICAgIAorICAgIHJldHVybiBsb2FkZXI7Cit9CisKKyNpZiBF
TkFCTEUoTUlDUk9EQVRBKQorUGFzc1JlZlB0cjxOb2RlTGlzdD4gRG9jdW1lbnQ6OmdldEl0ZW1z
KGNvbnN0IFN0cmluZyYgdHlwZU5hbWVzKQoreworICAgIC8vIFNpbmNlIGRvY3VtZXQuZ2V0SXRl
bSgpIGlzIGFsbG93ZWQgZm9yIG1pY3JvZGF0YSwgdHlwZU5hbWVzIHdpbGwgYmUgbnVsbCBzdHJp
bmcuCisgICAgLy8gSW4gdGhpcyBjYXNlIHdlIG5lZWQgdG8gY3JlYXRlIGFuIGVtcHR5IHN0cmlu
ZyBpZGVudGlmaWVyIHRvIG1hcCBzdWNoIHJlcXVlc3QgaW4gdGhlIGNhY2hlLgorICAgIFN0cmlu
ZyBsb2NhbFR5cGVOYW1lcyA9IHR5cGVOYW1lcy5pc051bGwoKSA/IE1pY3JvRGF0YUl0ZW1MaXN0
Ojp1bmRlZmluZWRJdGVtVHlwZSgpIDogdHlwZU5hbWVzOworCisgICAgcmV0dXJuIGVuc3VyZVJh
cmVEYXRhKCktPmVuc3VyZU5vZGVMaXN0cygpLT5hZGRDYWNoZVdpdGhOYW1lPE1pY3JvRGF0YUl0
ZW1MaXN0Pih0aGlzLCBEeW5hbWljTm9kZUxpc3Q6Ok1pY3JvRGF0YUl0ZW1MaXN0VHlwZSwgbG9j
YWxUeXBlTmFtZXMpOworfQorI2VuZGlmCisKK0ludFNpemUgRG9jdW1lbnQ6OnZpZXdwb3J0U2l6
ZSgpIGNvbnN0Cit7CisgICAgaWYgKCF2aWV3KCkpCisgICAgICAgIHJldHVybiBJbnRTaXplKCk7
CisgICAgcmV0dXJuIHZpZXcoKS0+dmlzaWJsZUNvbnRlbnRSZWN0KC8qIGluY2x1ZGVTY3JvbGxi
YXJzICovIHRydWUpLnNpemUoKTsKK30KKworTm9kZSogZXZlbnRUYXJnZXROb2RlRm9yRG9jdW1l
bnQoRG9jdW1lbnQqIGRvYykKK3sKKyAgICBpZiAoIWRvYykKKyAgICAgICAgcmV0dXJuIDA7Cisg
ICAgTm9kZSogbm9kZSA9IGRvYy0+Zm9jdXNlZE5vZGUoKTsKKyAgICBpZiAoIW5vZGUgJiYgZG9j
LT5pc1BsdWdpbkRvY3VtZW50KCkpIHsKKyAgICAgICAgUGx1Z2luRG9jdW1lbnQqIHBsdWdpbkRv
Y3VtZW50ID0gc3RhdGljX2Nhc3Q8UGx1Z2luRG9jdW1lbnQqPihkb2MpOworICAgICAgICBub2Rl
ID0gIHBsdWdpbkRvY3VtZW50LT5wbHVnaW5Ob2RlKCk7CisgICAgfQorICAgIGlmICghbm9kZSAm
JiBkb2MtPmlzSFRNTERvY3VtZW50KCkpCisgICAgICAgIG5vZGUgPSBkb2MtPmJvZHkoKTsKKyAg
ICBpZiAoIW5vZGUpCisgICAgICAgIG5vZGUgPSBkb2MtPmRvY3VtZW50RWxlbWVudCgpOworICAg
IHJldHVybiBub2RlOworfQorCit2b2lkIERvY3VtZW50OjphZGp1c3RGbG9hdFF1YWRzRm9yU2Ny
b2xsQW5kQWJzb2x1dGVab29tQW5kRnJhbWVTY2FsZShWZWN0b3I8RmxvYXRRdWFkPiYgcXVhZHMs
IFJlbmRlck9iamVjdCogcmVuZGVyZXIpCit7CisgICAgaWYgKCF2aWV3KCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIGZsb2F0IGludmVyc2VGcmFtZVNjYWxlID0gMTsKKyAgICBpZiAoZnJhbWUo
KSkKKyAgICAgICAgaW52ZXJzZUZyYW1lU2NhbGUgPSAxIC8gZnJhbWUoKS0+ZnJhbWVTY2FsZUZh
Y3RvcigpOworCisgICAgTGF5b3V0UmVjdCB2aXNpYmxlQ29udGVudFJlY3QgPSB2aWV3KCktPnZp
c2libGVDb250ZW50UmVjdCgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcXVhZHMuc2l6
ZSgpOyArK2kpIHsKKyAgICAgICAgcXVhZHNbaV0ubW92ZSgtdmlzaWJsZUNvbnRlbnRSZWN0Lngo
KSwgLXZpc2libGVDb250ZW50UmVjdC55KCkpOworICAgICAgICBhZGp1c3RGbG9hdFF1YWRGb3JB
YnNvbHV0ZVpvb20ocXVhZHNbaV0sIHJlbmRlcmVyKTsKKyAgICAgICAgaWYgKGludmVyc2VGcmFt
ZVNjYWxlICE9IDEpCisgICAgICAgICAgICBxdWFkc1tpXS5zY2FsZShpbnZlcnNlRnJhbWVTY2Fs
ZSwgaW52ZXJzZUZyYW1lU2NhbGUpOworICAgIH0KK30KKwordm9pZCBEb2N1bWVudDo6YWRqdXN0
RmxvYXRSZWN0Rm9yU2Nyb2xsQW5kQWJzb2x1dGVab29tQW5kRnJhbWVTY2FsZShGbG9hdFJlY3Qm
IHJlY3QsIFJlbmRlck9iamVjdCogcmVuZGVyZXIpCit7CisgICAgaWYgKCF2aWV3KCkpCisgICAg
ICAgIHJldHVybjsKKworICAgIGZsb2F0IGludmVyc2VGcmFtZVNjYWxlID0gMTsKKyAgICBpZiAo
ZnJhbWUoKSkKKyAgICAgICAgaW52ZXJzZUZyYW1lU2NhbGUgPSAxIC8gZnJhbWUoKS0+ZnJhbWVT
Y2FsZUZhY3RvcigpOworCisgICAgTGF5b3V0UmVjdCB2aXNpYmxlQ29udGVudFJlY3QgPSB2aWV3
KCktPnZpc2libGVDb250ZW50UmVjdCgpOworICAgIHJlY3QubW92ZSgtdmlzaWJsZUNvbnRlbnRS
ZWN0LngoKSwgLXZpc2libGVDb250ZW50UmVjdC55KCkpOworICAgIGFkanVzdEZsb2F0UmVjdEZv
ckFic29sdXRlWm9vbShyZWN0LCByZW5kZXJlcik7CisgICAgaWYgKGludmVyc2VGcmFtZVNjYWxl
ICE9IDEpCisgICAgICAgIHJlY3Quc2NhbGUoaW52ZXJzZUZyYW1lU2NhbGUpOworfQorCit2b2lk
IERvY3VtZW50OjpzZXRDb250ZXh0RmVhdHVyZXMoUGFzc1JlZlB0cjxDb250ZXh0RmVhdHVyZXM+
IGZlYXR1cmVzKQoreworICAgIG1fY29udGV4dEZlYXR1cmVzID0gZmVhdHVyZXM7Cit9CisKK3N0
YXRpYyBSZW5kZXJPYmplY3QqIG5lYXJlc3RDb21tb25Ib3ZlckFuY2VzdG9yKFJlbmRlck9iamVj
dCogb2JqMSwgUmVuZGVyT2JqZWN0KiBvYmoyKQoreworICAgIGlmICghb2JqMSB8fCAhb2JqMikK
KyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBmb3IgKFJlbmRlck9iamVjdCogY3Vyck9iajEgPSBv
YmoxOyBjdXJyT2JqMTsgY3Vyck9iajEgPSBjdXJyT2JqMS0+aG92ZXJBbmNlc3RvcigpKSB7Cisg
ICAgICAgIGZvciAoUmVuZGVyT2JqZWN0KiBjdXJyT2JqMiA9IG9iajI7IGN1cnJPYmoyOyBjdXJy
T2JqMiA9IGN1cnJPYmoyLT5ob3ZlckFuY2VzdG9yKCkpIHsKKyAgICAgICAgICAgIGlmIChjdXJy
T2JqMSA9PSBjdXJyT2JqMikKKyAgICAgICAgICAgICAgICByZXR1cm4gY3Vyck9iajE7CisgICAg
ICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBEb2N1bWVudDo6dXBkYXRl
SG92ZXJBY3RpdmVTdGF0ZShjb25zdCBIaXRUZXN0UmVxdWVzdCYgcmVxdWVzdCwgSGl0VGVzdFJl
c3VsdCYgcmVzdWx0KQoreworICAgIC8vIFdlIGRvbid0IHVwZGF0ZSA6aG92ZXIvOmFjdGl2ZSBz
dGF0ZSB3aGVuIHRoZSByZXN1bHQgaXMgbWFya2VkIGFzIHJlYWRPbmx5LgorICAgIGlmIChyZXF1
ZXN0LnJlYWRPbmx5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIE5vZGUqIGlubmVyTm9kZUlu
RG9jdW1lbnQgPSByZXN1bHQuaW5uZXJOb2RlKCk7CisgICAgQVNTRVJUKCFpbm5lck5vZGVJbkRv
Y3VtZW50IHx8IGlubmVyTm9kZUluRG9jdW1lbnQtPmRvY3VtZW50KCkgPT0gdGhpcyk7CisKKyAg
ICBOb2RlKiBvbGRBY3RpdmVOb2RlID0gYWN0aXZlTm9kZSgpOworICAgIGlmIChvbGRBY3RpdmVO
b2RlICYmICFyZXF1ZXN0LmFjdGl2ZSgpKSB7CisgICAgICAgIC8vIFdlIGFyZSBjbGVhcmluZyB0
aGUgOmFjdGl2ZSBjaGFpbiBiZWNhdXNlIHRoZSBtb3VzZSBoYXMgYmVlbiByZWxlYXNlZC4KKyAg
ICAgICAgZm9yIChSZW5kZXJPYmplY3QqIGN1cnIgPSBvbGRBY3RpdmVOb2RlLT5yZW5kZXJlcigp
OyBjdXJyOyBjdXJyID0gY3Vyci0+cGFyZW50KCkpIHsKKyAgICAgICAgICAgIGlmIChjdXJyLT5u
b2RlKCkgJiYgIWN1cnItPmlzVGV4dCgpKSB7CisgICAgICAgICAgICAgICAgY3Vyci0+bm9kZSgp
LT5zZXRBY3RpdmUoZmFsc2UpOworICAgICAgICAgICAgICAgIGN1cnItPm5vZGUoKS0+Y2xlYXJJ
bkFjdGl2ZUNoYWluKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2V0QWN0
aXZlTm9kZSgwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBOb2RlKiBuZXdBY3RpdmVOb2RlID0g
aW5uZXJOb2RlSW5Eb2N1bWVudDsKKyAgICAgICAgaWYgKCFvbGRBY3RpdmVOb2RlICYmIG5ld0Fj
dGl2ZU5vZGUgJiYgcmVxdWVzdC5hY3RpdmUoKSAmJiAhcmVxdWVzdC50b3VjaE1vdmUoKSkgewor
ICAgICAgICAgICAgLy8gV2UgYXJlIHNldHRpbmcgdGhlIDphY3RpdmUgY2hhaW4gYW5kIGZyZWV6
aW5nIGl0LiBJZiBmdXR1cmUgbW92ZXMgaGFwcGVuLCB0aGV5CisgICAgICAgICAgICAvLyB3aWxs
IG5lZWQgdG8gcmVmZXJlbmNlIHRoaXMgY2hhaW4uCisgICAgICAgICAgICBmb3IgKFJlbmRlck9i
amVjdCogY3VyciA9IG5ld0FjdGl2ZU5vZGUtPnJlbmRlcmVyKCk7IGN1cnI7IGN1cnIgPSBjdXJy
LT5wYXJlbnQoKSkgeworICAgICAgICAgICAgICAgIGlmIChjdXJyLT5ub2RlKCkgJiYgIWN1cnIt
PmlzVGV4dCgpKQorICAgICAgICAgICAgICAgICAgICBjdXJyLT5ub2RlKCktPnNldEluQWN0aXZl
Q2hhaW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldEFjdGl2ZU5vZGUobmV3QWN0
aXZlTm9kZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gSWYgdGhlIG1vdXNlIGhhcyBqdXN0
IGJlZW4gcHJlc3NlZCwgc2V0IDphY3RpdmUgb24gdGhlIGNoYWluLiBUaG9zZSAoYW5kIG9ubHkg
dGhvc2UpCisgICAgLy8gbm9kZXMgc2hvdWxkIHJlbWFpbiA6YWN0aXZlIHVudGlsIHRoZSBtb3Vz
ZSBpcyByZWxlYXNlZC4KKyAgICBib29sIGFsbG93QWN0aXZlQ2hhbmdlcyA9ICFvbGRBY3RpdmVO
b2RlICYmIGFjdGl2ZU5vZGUoKTsKKworICAgIC8vIElmIHRoZSBtb3VzZSBpcyBkb3duIGFuZCBp
ZiB0aGlzIGlzIGEgbW91c2UgbW92ZSBldmVudCwgd2Ugd2FudCB0byByZXN0cmljdCBjaGFuZ2Vz
IGluCisgICAgLy8gOmhvdmVyLzphY3RpdmUgdG8gb25seSBhcHBseSB0byBlbGVtZW50cyB0aGF0
IGFyZSBpbiB0aGUgOmFjdGl2ZSBjaGFpbiB0aGF0IHdlIGZyb3plCisgICAgLy8gYXQgdGhlIHRp
bWUgdGhlIG1vdXNlIHdlbnQgZG93bi4KKyAgICBib29sIG11c3RCZUluQWN0aXZlQ2hhaW4gPSBy
ZXF1ZXN0LmFjdGl2ZSgpICYmIHJlcXVlc3QubW92ZSgpOworCisgICAgUmVmUHRyPE5vZGU+IG9s
ZEhvdmVyTm9kZSA9IGhvdmVyTm9kZSgpOworICAgIC8vIENsZWFyIHRoZSA6aG92ZXIgY2hhaW4g
d2hlbiB0aGUgdG91Y2ggZ2VzdHVyZSBpcyBvdmVyLgorICAgIGlmIChyZXF1ZXN0LnRvdWNoUmVs
ZWFzZSgpKSB7CisgICAgICAgIGlmIChvbGRIb3Zlck5vZGUpIHsKKyAgICAgICAgICAgIGZvciAo
UmVuZGVyT2JqZWN0KiBjdXJyID0gb2xkSG92ZXJOb2RlLT5yZW5kZXJlcigpOyBjdXJyOyBjdXJy
ID0gY3Vyci0+aG92ZXJBbmNlc3RvcigpKSB7CisgICAgICAgICAgICAgICAgaWYgKGN1cnItPm5v
ZGUoKSAmJiAhY3Vyci0+aXNUZXh0KCkpCisgICAgICAgICAgICAgICAgICAgIGN1cnItPm5vZGUo
KS0+c2V0SG92ZXJlZChmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRIb3Zl
ck5vZGUoMCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gQSB0b3VjaCByZWxlYXNlIGNhbiBub3Qg
c2V0IG5ldyBob3ZlciBvciBhY3RpdmUgdGFyZ2V0LgorICAgICAgICByZXR1cm47CisgICAgfQor
CisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBob3ZlcmVkIG5vZGUgaGFzIGNoYW5nZWQuCisg
ICAgLy8gSWYgaXQgaGFzbid0LCB3ZSBkbyBub3QgbmVlZCB0byBkbyBhbnl0aGluZy4KKyAgICBO
b2RlKiBuZXdIb3Zlck5vZGUgPSBpbm5lck5vZGVJbkRvY3VtZW50OworICAgIHdoaWxlIChuZXdI
b3Zlck5vZGUgJiYgIW5ld0hvdmVyTm9kZS0+cmVuZGVyZXIoKSkKKyAgICAgICAgbmV3SG92ZXJO
b2RlID0gbmV3SG92ZXJOb2RlLT5wYXJlbnRPckhvc3ROb2RlKCk7CisKKyAgICAvLyBVcGRhdGUg
b3VyIGN1cnJlbnQgaG92ZXIgbm9kZS4KKyAgICBzZXRIb3Zlck5vZGUobmV3SG92ZXJOb2RlKTsK
KworICAgIC8vIFdlIGhhdmUgdHdvIGRpZmZlcmVudCBvYmplY3RzLiBGZXRjaCB0aGVpciByZW5k
ZXJlcnMuCisgICAgUmVuZGVyT2JqZWN0KiBvbGRIb3Zlck9iaiA9IG9sZEhvdmVyTm9kZSA/IG9s
ZEhvdmVyTm9kZS0+cmVuZGVyZXIoKSA6IDA7CisgICAgUmVuZGVyT2JqZWN0KiBuZXdIb3Zlck9i
aiA9IG5ld0hvdmVyTm9kZSA/IG5ld0hvdmVyTm9kZS0+cmVuZGVyZXIoKSA6IDA7CisKKyAgICAv
LyBMb2NhdGUgdGhlIGNvbW1vbiBhbmNlc3RvciByZW5kZXIgb2JqZWN0IGZvciB0aGUgdHdvIHJl
bmRlcmVycy4KKyAgICBSZW5kZXJPYmplY3QqIGFuY2VzdG9yID0gbmVhcmVzdENvbW1vbkhvdmVy
QW5jZXN0b3Iob2xkSG92ZXJPYmosIG5ld0hvdmVyT2JqKTsKKworICAgIFZlY3RvcjxSZWZQdHI8
Tm9kZT4sIDMyPiBub2Rlc1RvUmVtb3ZlRnJvbUNoYWluOworICAgIFZlY3RvcjxSZWZQdHI8Tm9k
ZT4sIDMyPiBub2Rlc1RvQWRkVG9DaGFpbjsKKworICAgIGlmIChvbGRIb3Zlck9iaiAhPSBuZXdI
b3Zlck9iaikgeworICAgICAgICAvLyBUaGUgb2xkIGhvdmVyIHBhdGggb25seSBuZWVkcyB0byBi
ZSBjbGVhcmVkIHVwIHRvIChhbmQgbm90IGluY2x1ZGluZykgdGhlIGNvbW1vbiBhbmNlc3RvcjsK
KyAgICAgICAgZm9yIChSZW5kZXJPYmplY3QqIGN1cnIgPSBvbGRIb3Zlck9iajsgY3VyciAmJiBj
dXJyICE9IGFuY2VzdG9yOyBjdXJyID0gY3Vyci0+aG92ZXJBbmNlc3RvcigpKSB7CisgICAgICAg
ICAgICBpZiAoY3Vyci0+bm9kZSgpICYmICFjdXJyLT5pc1RleHQoKSAmJiAoIW11c3RCZUluQWN0
aXZlQ2hhaW4gfHwgY3Vyci0+bm9kZSgpLT5pbkFjdGl2ZUNoYWluKCkpKQorICAgICAgICAgICAg
ICAgIG5vZGVzVG9SZW1vdmVGcm9tQ2hhaW4uYXBwZW5kKGN1cnItPm5vZGUoKSk7CisgICAgICAg
IH0KKyAgICB9CisKKyAgICAvLyBOb3cgc2V0IHRoZSBob3ZlciBzdGF0ZSBmb3Igb3VyIG5ldyBv
YmplY3QgdXAgdG8gdGhlIHJvb3QuCisgICAgZm9yIChSZW5kZXJPYmplY3QqIGN1cnIgPSBuZXdI
b3Zlck9iajsgY3VycjsgY3VyciA9IGN1cnItPmhvdmVyQW5jZXN0b3IoKSkgeworICAgICAgICBp
ZiAoY3Vyci0+bm9kZSgpICYmICFjdXJyLT5pc1RleHQoKSAmJiAoIW11c3RCZUluQWN0aXZlQ2hh
aW4gfHwgY3Vyci0+bm9kZSgpLT5pbkFjdGl2ZUNoYWluKCkpKQorICAgICAgICAgICAgbm9kZXNU
b0FkZFRvQ2hhaW4uYXBwZW5kKGN1cnItPm5vZGUoKSk7CisgICAgfQorCisgICAgc2l6ZV90IHJl
bW92ZUNvdW50ID0gbm9kZXNUb1JlbW92ZUZyb21DaGFpbi5zaXplKCk7CisgICAgZm9yIChzaXpl
X3QgaSA9IDA7IGkgPCByZW1vdmVDb3VudDsgKytpKQorICAgICAgICBub2Rlc1RvUmVtb3ZlRnJv
bUNoYWluW2ldLT5zZXRIb3ZlcmVkKGZhbHNlKTsKKworICAgIHNpemVfdCBhZGRDb3VudCA9IG5v
ZGVzVG9BZGRUb0NoYWluLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFkZENv
dW50OyArK2kpIHsKKyAgICAgICAgaWYgKGFsbG93QWN0aXZlQ2hhbmdlcykKKyAgICAgICAgICAg
IG5vZGVzVG9BZGRUb0NoYWluW2ldLT5zZXRBY3RpdmUodHJ1ZSk7CisgICAgICAgIG5vZGVzVG9B
ZGRUb0NoYWluW2ldLT5zZXRIb3ZlcmVkKHRydWUpOworICAgIH0KK30KKwordm9pZCBEb2N1bWVu
dDo6cmVwb3J0TWVtb3J5VXNhZ2UoTWVtb3J5T2JqZWN0SW5mbyogbWVtb3J5T2JqZWN0SW5mbykg
Y29uc3QKK3sKKyAgICBNZW1vcnlDbGFzc0luZm8gaW5mbyhtZW1vcnlPYmplY3RJbmZvLCB0aGlz
LCBXZWJDb3JlTWVtb3J5VHlwZXM6OkRPTSk7CisgICAgaW5mby5hZGRNZW1iZXIobV9zdHlsZVJl
c29sdmVyKTsKKyAgICBDb250YWluZXJOb2RlOjpyZXBvcnRNZW1vcnlVc2FnZShtZW1vcnlPYmpl
Y3RJbmZvKTsKKyAgICBpbmZvLmFkZFZlY3RvcihtX2N1c3RvbUZvbnRzKTsKKyAgICBpbmZvLmFk
ZE1lbWJlcihtX3VybCk7CisgICAgaW5mby5hZGRNZW1iZXIobV9iYXNlVVJMKTsKKyAgICBpbmZv
LmFkZE1lbWJlcihtX2Jhc2VVUkxPdmVycmlkZSk7CisgICAgaW5mby5hZGRNZW1iZXIobV9iYXNl
RWxlbWVudFVSTCk7CisgICAgaW5mby5hZGRNZW1iZXIobV9jb29raWVVUkwpOworICAgIGluZm8u
YWRkTWVtYmVyKG1fZmlyc3RQYXJ0eUZvckNvb2tpZXMpOworICAgIGluZm8uYWRkTWVtYmVyKG1f
ZG9jdW1lbnRVUkkpOworICAgIGluZm8uYWRkTWVtYmVyKG1fYmFzZVRhcmdldCk7CisgICAgaW5m
by5hZGRNZW1iZXIobV9mcmFtZSk7CisgICAgaW5mby5hZGRNZW1iZXIobV9jYWNoZWRSZXNvdXJj
ZUxvYWRlcik7CisgICAgaW5mby5hZGRNZW1iZXIobV9lbGVtU2hlZXQpOworICAgIGluZm8uYWRk
TWVtYmVyKG1fcGFnZVVzZXJTaGVldCk7CisgICAgaWYgKG1fcGFnZUdyb3VwVXNlclNoZWV0cykK
KyAgICAgICAgaW5mby5hZGRJbnN0cnVtZW50ZWRWZWN0b3JQdHIobV9wYWdlR3JvdXBVc2VyU2hl
ZXRzKTsKKyAgICBpZiAobV91c2VyU2hlZXRzKQorICAgICAgICBpbmZvLmFkZEluc3RydW1lbnRl
ZFZlY3RvclB0cihtX3VzZXJTaGVldHMpOworICAgIGluZm8uYWRkSGFzaFNldChtX25vZGVJdGVy
YXRvcnMpOworICAgIGluZm8uYWRkSGFzaFNldChtX3Jhbmdlcyk7CisgICAgaW5mby5hZGRMaXN0
SGFzaFNldChtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcyk7CisgICAgaW5mby5hZGRNZW1iZXIo
bV9wcmVmZXJyZWRTdHlsZXNoZWV0U2V0KTsKKyAgICBpbmZvLmFkZE1lbWJlcihtX3NlbGVjdGVk
U3R5bGVzaGVldFNldCk7CisgICAgaW5mby5hZGRNZW1iZXIobV90aXRsZS5zdHJpbmcoKSk7Cisg
ICAgaW5mby5hZGRNZW1iZXIobV9yYXdUaXRsZS5zdHJpbmcoKSk7CisgICAgaW5mby5hZGRNZW1i
ZXIobV94bWxFbmNvZGluZyk7CisgICAgaW5mby5hZGRNZW1iZXIobV94bWxWZXJzaW9uKTsKKyAg
ICBpbmZvLmFkZE1lbWJlcihtX2NvbnRlbnRMYW5ndWFnZSk7CisgICAgaW5mby5hZGRIYXNoTWFw
KG1fZG9jdW1lbnROYW1lZEl0ZW1Db2xsZWN0aW9ucyk7CisgICAgaW5mby5hZGRIYXNoTWFwKG1f
d2luZG93TmFtZWRJdGVtQ29sbGVjdGlvbnMpOworI2lmIEVOQUJMRShEQVNIQk9BUkRfU1VQUE9S
VCkKKyAgICBpbmZvLmFkZFZlY3RvcihtX2Rhc2hib2FyZFJlZ2lvbnMpOworI2VuZGlmCisgICAg
aW5mby5hZGRIYXNoTWFwKG1fY3NzQ2FudmFzRWxlbWVudHMpOworICAgIGluZm8uYWRkVmVjdG9y
KG1faWNvblVSTHMpOworICAgIGluZm8uYWRkSGFzaFNldChtX2RvY3VtZW50U3VzcGVuc2lvbkNh
bGxiYWNrRWxlbWVudHMpOworICAgIGluZm8uYWRkSGFzaFNldChtX21lZGlhVm9sdW1lQ2FsbGJh
Y2tFbGVtZW50cyk7CisgICAgaW5mby5hZGRIYXNoU2V0KG1fcHJpdmF0ZUJyb3dzaW5nU3RhdGVD
aGFuZ2VkRWxlbWVudHMpOworICAgIGluZm8uYWRkSGFzaE1hcChtX2VsZW1lbnRzQnlBY2Nlc3NL
ZXkpOworICAgIGluZm8uYWRkTWVtYmVyKG1fZXZlbnRRdWV1ZSk7CisgICAgaW5mby5hZGRIYXNo
U2V0KG1fbWVkaWFDYW5TdGFydExpc3RlbmVycyk7CisgICAgaW5mby5hZGRWZWN0b3IobV9wZW5k
aW5nVGFza3MpOworfQorCisjaWYgRU5BQkxFKFVORE9fTUFOQUdFUikKK1Bhc3NSZWZQdHI8VW5k
b01hbmFnZXI+IERvY3VtZW50Ojp1bmRvTWFuYWdlcigpCit7CisgICAgaWYgKCFtX3VuZG9NYW5h
Z2VyKQorICAgICAgICBtX3VuZG9NYW5hZ2VyID0gVW5kb01hbmFnZXI6OmNyZWF0ZSh0aGlzKTsK
KyAgICByZXR1cm4gbV91bmRvTWFuYWdlcjsKK30KKyNlbmRpZgorCitjbGFzcyBJbW11dGFibGVB
dHRyaWJ1dGVEYXRhQ2FjaGVLZXkgeworcHVibGljOgorICAgIEltbXV0YWJsZUF0dHJpYnV0ZURh
dGFDYWNoZUtleShjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lLCBjb25zdCBBdHRyaWJ1dGUq
IGF0dHJpYnV0ZXMsIHVuc2lnbmVkIGF0dHJpYnV0ZUNvdW50KQorICAgICAgICA6IG1fdGFnUU5h
bWUodGFnTmFtZSkKKyAgICAgICAgLCBtX2F0dHJpYnV0ZXMoYXR0cmlidXRlcykKKyAgICAgICAg
LCBtX2F0dHJpYnV0ZUNvdW50KGF0dHJpYnV0ZUNvdW50KQorICAgIHsgfQorCisgICAgYm9vbCBv
cGVyYXRvciE9KGNvbnN0IEltbXV0YWJsZUF0dHJpYnV0ZURhdGFDYWNoZUtleSYgb3RoZXIpIGNv
bnN0CisgICAgeworICAgICAgICBpZiAobV90YWdRTmFtZSAhPSBvdGhlci5tX3RhZ1FOYW1lKQor
ICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChtX2F0dHJpYnV0ZUNvdW50ICE9
IG90aGVyLm1fYXR0cmlidXRlQ291bnQpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAg
ICAgcmV0dXJuIG1lbWNtcChtX2F0dHJpYnV0ZXMsIG90aGVyLm1fYXR0cmlidXRlcywgc2l6ZW9m
KEF0dHJpYnV0ZSkgKiBtX2F0dHJpYnV0ZUNvdW50KTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBo
YXNoKCkgY29uc3QKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIGF0dHJpYnV0ZUhhc2ggPSBTdHJp
bmdIYXNoZXI6Omhhc2hNZW1vcnkobV9hdHRyaWJ1dGVzLCBtX2F0dHJpYnV0ZUNvdW50ICogc2l6
ZW9mKEF0dHJpYnV0ZSkpOworICAgICAgICByZXR1cm4gV1RGOjpwYWlySW50SGFzaChtX3RhZ1FO
YW1lLmxvY2FsTmFtZSgpLmltcGwoKS0+ZXhpc3RpbmdIYXNoKCksIGF0dHJpYnV0ZUhhc2gpOwor
ICAgIH0KKworcHJpdmF0ZToKKyAgICBRdWFsaWZpZWROYW1lIG1fdGFnUU5hbWU7CisgICAgY29u
c3QgQXR0cmlidXRlKiBtX2F0dHJpYnV0ZXM7CisgICAgdW5zaWduZWQgbV9hdHRyaWJ1dGVDb3Vu
dDsKK307CisKK3N0cnVjdCBJbW11dGFibGVBdHRyaWJ1dGVEYXRhQ2FjaGVFbnRyeSB7CisgICAg
SW1tdXRhYmxlQXR0cmlidXRlRGF0YUNhY2hlRW50cnkoY29uc3QgSW1tdXRhYmxlQXR0cmlidXRl
RGF0YUNhY2hlS2V5JiBrLCBQYXNzUmVmUHRyPEVsZW1lbnRBdHRyaWJ1dGVEYXRhPiB2KQorICAg
ICAgICA6IGtleShrKQorICAgICAgICAsIHZhbHVlKHYpCisgICAgeyB9CisKKyAgICBJbW11dGFi
bGVBdHRyaWJ1dGVEYXRhQ2FjaGVLZXkga2V5OworICAgIFJlZlB0cjxFbGVtZW50QXR0cmlidXRl
RGF0YT4gdmFsdWU7Cit9OworCitQYXNzUmVmUHRyPEVsZW1lbnRBdHRyaWJ1dGVEYXRhPiBEb2N1
bWVudDo6Y2FjaGVkSW1tdXRhYmxlQXR0cmlidXRlRGF0YShjb25zdCBFbGVtZW50KiBlbGVtZW50
LCBjb25zdCBWZWN0b3I8QXR0cmlidXRlPiYgYXR0cmlidXRlcykKK3sKKyAgICBBU1NFUlQoIWF0
dHJpYnV0ZXMuaXNFbXB0eSgpKTsKKworICAgIEltbXV0YWJsZUF0dHJpYnV0ZURhdGFDYWNoZUtl
eSBjYWNoZUtleShlbGVtZW50LT50YWdRTmFtZSgpLCBhdHRyaWJ1dGVzLmRhdGEoKSwgYXR0cmli
dXRlcy5zaXplKCkpOworICAgIHVuc2lnbmVkIGNhY2hlSGFzaCA9IGNhY2hlS2V5Lmhhc2goKTsK
KworICAgIEltbXV0YWJsZUF0dHJpYnV0ZURhdGFDYWNoZTo6aXRlcmF0b3IgY2FjaGVJdGVyYXRv
ciA9IG1faW1tdXRhYmxlQXR0cmlidXRlRGF0YUNhY2hlLmFkZChjYWNoZUhhc2gsIG51bGxwdHIp
Lml0ZXJhdG9yOworICAgIGlmIChjYWNoZUl0ZXJhdG9yLT5zZWNvbmQgJiYgY2FjaGVJdGVyYXRv
ci0+c2Vjb25kLT5rZXkgIT0gY2FjaGVLZXkpCisgICAgICAgIGNhY2hlSGFzaCA9IDA7CisKKyAg
ICBSZWZQdHI8RWxlbWVudEF0dHJpYnV0ZURhdGE+IGF0dHJpYnV0ZURhdGE7CisgICAgaWYgKGNh
Y2hlSGFzaCAmJiBjYWNoZUl0ZXJhdG9yLT5zZWNvbmQpCisgICAgICAgIGF0dHJpYnV0ZURhdGEg
PSBjYWNoZUl0ZXJhdG9yLT5zZWNvbmQtPnZhbHVlOworICAgIGVsc2UKKyAgICAgICAgYXR0cmli
dXRlRGF0YSA9IEVsZW1lbnRBdHRyaWJ1dGVEYXRhOjpjcmVhdGVJbW11dGFibGUoYXR0cmlidXRl
cyk7CisKKyAgICBpZiAoIWNhY2hlSGFzaCB8fCBjYWNoZUl0ZXJhdG9yLT5zZWNvbmQpCisgICAg
ICAgIHJldHVybiBhdHRyaWJ1dGVEYXRhLnJlbGVhc2UoKTsKKworICAgIGNhY2hlSXRlcmF0b3It
PnNlY29uZCA9IGFkb3B0UHRyKG5ldyBJbW11dGFibGVBdHRyaWJ1dGVEYXRhQ2FjaGVFbnRyeShJ
bW11dGFibGVBdHRyaWJ1dGVEYXRhQ2FjaGVLZXkoZWxlbWVudC0+dGFnUU5hbWUoKSwgYXR0cmli
dXRlRGF0YS0+aW1tdXRhYmxlQXR0cmlidXRlQXJyYXkoKSwgYXR0cmlidXRlRGF0YS0+bGVuZ3Ro
KCkpLCBhdHRyaWJ1dGVEYXRhKSk7CisKKyAgICByZXR1cm4gYXR0cmlidXRlRGF0YS5yZWxlYXNl
KCk7Cit9CisKK0xvY2FsaXplciYgRG9jdW1lbnQ6OmdldExvY2FsaXplcihjb25zdCBBdG9taWNT
dHJpbmcmIGxvY2FsZSkKK3sKKyAgICBBdG9taWNTdHJpbmcgbG9jYWxlS2V5ID0gbG9jYWxlOwor
ICAgIGlmIChsb2NhbGUuaXNFbXB0eSgpIHx8ICFSdW50aW1lRW5hYmxlZEZlYXR1cmVzOjpsYW5n
QXR0cmlidXRlQXdhcmVGb3JtQ29udHJvbFVJRW5hYmxlZCgpKQorICAgICAgICBsb2NhbGVLZXkg
PSBkZWZhdWx0TGFuZ3VhZ2UoKTsKKyAgICBMb2NhbGVUb0xvY2FsaXplck1hcDo6QWRkUmVzdWx0
IHJlc3VsdCA9IG1fbG9jYWxpemVyQ2FjaGUuYWRkKGxvY2FsZUtleSwgbnVsbHB0cik7CisgICAg
aWYgKHJlc3VsdC5pc05ld0VudHJ5KQorICAgICAgICByZXN1bHQuaXRlcmF0b3ItPnNlY29uZCA9
IExvY2FsaXplcjo6Y3JlYXRlKGxvY2FsZUtleSk7CisgICAgcmV0dXJuICoocmVzdWx0Lml0ZXJh
dG9yLT5zZWNvbmQpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBTb3VyY2Uv
V2ViQ29yZS9kb20vRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYkNvcmUvZG9tL0RvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uY3BwCShy
ZXZpc2lvbiAxMjkzOTcpCisrKyBTb3VyY2UvV2ViQ29yZS9kb20vRG9jdW1lbnRTdHlsZVNoZWV0
Q29sbGVjdGlvbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI2LDYzMSArMjYsNTIgQEAKICAqLwog
CiAjaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJE
b2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmgiCiAKLSNpbmNsdWRlICJBWE9iamVjdENhY2hl
LmgiCi0jaW5jbHVkZSAiQW5pbWF0aW9uQ29udHJvbGxlci5oIgotI2luY2x1ZGUgIkF0dHIuaCIK
LSNpbmNsdWRlICJBdHRyaWJ1dGUuaCIKLSNpbmNsdWRlICJDREFUQVNlY3Rpb24uaCIKLSNpbmNs
dWRlICJDU1NQYXJzZXIuaCIKLSNpbmNsdWRlICJDU1NTdHlsZURlY2xhcmF0aW9uLmgiCiAjaW5j
bHVkZSAiQ1NTU3R5bGVTaGVldC5oIgotI2luY2x1ZGUgIkNTU1ZhbHVlS2V5d29yZHMuaCIKLSNp
bmNsdWRlICJDYWNoZWRDU1NTdHlsZVNoZWV0LmgiCi0jaW5jbHVkZSAiQ2FjaGVkUmVzb3VyY2VM
b2FkZXIuaCIKLSNpbmNsdWRlICJDaHJvbWUuaCIKLSNpbmNsdWRlICJDaHJvbWVDbGllbnQuaCIK
LSNpbmNsdWRlICJDb21tZW50LmgiCi0jaW5jbHVkZSAiQ29uc29sZS5oIgotI2luY2x1ZGUgIkNv
bnRlbnRTZWN1cml0eVBvbGljeS5oIgotI2luY2x1ZGUgIkNvbnRleHRGZWF0dXJlcy5oIgotI2lu
Y2x1ZGUgIkNvb2tpZUphci5oIgotI2luY2x1ZGUgIkRPTUltcGxlbWVudGF0aW9uLmgiCi0jaW5j
bHVkZSAiRE9NTmFtZWRGbG93Q29sbGVjdGlvbi5oIgotI2luY2x1ZGUgIkRPTVNlbGVjdGlvbi5o
IgotI2luY2x1ZGUgIkRPTVdpbmRvdy5oIgotI2luY2x1ZGUgIkRhdGVDb21wb25lbnRzLmgiCi0j
aW5jbHVkZSAiRGV2aWNlTW90aW9uQ29udHJvbGxlci5oIgotI2luY2x1ZGUgIkRldmljZU9yaWVu
dGF0aW9uQ29udHJvbGxlci5oIgotI2luY2x1ZGUgIkRvY3VtZW50RXZlbnRRdWV1ZS5oIgotI2lu
Y2x1ZGUgIkRvY3VtZW50RnJhZ21lbnQuaCIKLSNpbmNsdWRlICJEb2N1bWVudExvYWRlci5oIgot
I2luY2x1ZGUgIkRvY3VtZW50TWFya2VyQ29udHJvbGxlci5oIgotI2luY2x1ZGUgIkRvY3VtZW50
VHlwZS5oIgotI2luY2x1ZGUgIkVkaXRpbmdUZXh0LmgiCi0jaW5jbHVkZSAiRWRpdG9yLmgiCisj
aW5jbHVkZSAiRG9jdW1lbnQuaCIKICNpbmNsdWRlICJFbGVtZW50LmgiCi0jaW5jbHVkZSAiRWxl
bWVudFNoYWRvdy5oIgotI2luY2x1ZGUgIkVudGl0eVJlZmVyZW5jZS5oIgotI2luY2x1ZGUgIkV2
ZW50LmgiCi0jaW5jbHVkZSAiRXZlbnRGYWN0b3J5LmgiCi0jaW5jbHVkZSAiRXZlbnRIYW5kbGVy
LmgiCi0jaW5jbHVkZSAiRXZlbnRMaXN0ZW5lci5oIgotI2luY2x1ZGUgIkV2ZW50TmFtZXMuaCIK
LSNpbmNsdWRlICJFeGNlcHRpb25Db2RlLmgiCi0jaW5jbHVkZSAiRmxvd1RocmVhZENvbnRyb2xs
ZXIuaCIKLSNpbmNsdWRlICJGb2N1c0NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJGb3JtQ29udHJv
bGxlci5oIgotI2luY2x1ZGUgIkZyYW1lLmgiCi0jaW5jbHVkZSAiRnJhbWVMb2FkZXIuaCIKLSNp
bmNsdWRlICJGcmFtZUxvYWRlckNsaWVudC5oIgotI2luY2x1ZGUgIkZyYW1lU2VsZWN0aW9uLmgi
Ci0jaW5jbHVkZSAiRnJhbWVUcmVlLmgiCi0jaW5jbHVkZSAiRnJhbWVWaWV3LmgiCi0jaW5jbHVk
ZSAiR2VvbG9jYXRpb25Db250cm9sbGVyLmgiCi0jaW5jbHVkZSAiSGFzaENoYW5nZUV2ZW50Lmgi
Ci0jaW5jbHVkZSAiSGlzdG9ncmFtU3VwcG9ydC5oIgotI2luY2x1ZGUgIkhpc3RvcnkuaCIKLSNp
bmNsdWRlICJIVE1MQWxsQ29sbGVjdGlvbi5oIgotI2luY2x1ZGUgIkhUTUxBbmNob3JFbGVtZW50
LmgiCi0jaW5jbHVkZSAiSFRNTEJvZHlFbGVtZW50LmgiCi0jaW5jbHVkZSAiSFRNTENhbnZhc0Vs
ZW1lbnQuaCIKLSNpbmNsdWRlICJIVE1MQ29sbGVjdGlvbi5oIgotI2luY2x1ZGUgIkhUTUxEb2N1
bWVudC5oIgotI2luY2x1ZGUgIkhUTUxFbGVtZW50RmFjdG9yeS5oIgotI2luY2x1ZGUgIkhUTUxG
cmFtZU93bmVyRWxlbWVudC5oIgotI2luY2x1ZGUgIkhUTUxIZWFkRWxlbWVudC5oIgotI2luY2x1
ZGUgIkhUTUxJRnJhbWVFbGVtZW50LmgiCiAjaW5jbHVkZSAiSFRNTExpbmtFbGVtZW50LmgiCi0j
aW5jbHVkZSAiSFRNTE1hcEVsZW1lbnQuaCIKLSNpbmNsdWRlICJIVE1MTmFtZUNvbGxlY3Rpb24u
aCIKICNpbmNsdWRlICJIVE1MTmFtZXMuaCIKLSNpbmNsdWRlICJIVE1MUGFyc2VySWRpb21zLmgi
CiAjaW5jbHVkZSAiSFRNTFN0eWxlRWxlbWVudC5oIgotI2luY2x1ZGUgIkhUTUxUaXRsZUVsZW1l
bnQuaCIKLSNpbmNsdWRlICJIVFRQUGFyc2Vycy5oIgotI2luY2x1ZGUgIkhpdFRlc3RSZXF1ZXN0
LmgiCi0jaW5jbHVkZSAiSGl0VGVzdFJlc3VsdC5oIgotI2luY2x1ZGUgIkltYWdlTG9hZGVyLmgi
Ci0jaW5jbHVkZSAiSW5zcGVjdG9yQ291bnRlcnMuaCIKLSNpbmNsdWRlICJJbnNwZWN0b3JJbnN0
cnVtZW50YXRpb24uaCIKLSNpbmNsdWRlICJMYW5ndWFnZS5oIgotI2luY2x1ZGUgIkxvY2FsaXpl
ci5oIgotI2luY2x1ZGUgIkxvZ2dpbmcuaCIKLSNpbmNsdWRlICJNZWRpYVF1ZXJ5TGlzdC5oIgot
I2luY2x1ZGUgIk1lZGlhUXVlcnlNYXRjaGVyLmgiCi0jaW5jbHVkZSAiTW91c2VFdmVudFdpdGhI
aXRUZXN0UmVzdWx0cy5oIgotI2luY2x1ZGUgIk5hbWVOb2RlTGlzdC5oIgotI2luY2x1ZGUgIk5h
bWVkRmxvd0NvbGxlY3Rpb24uaCIKLSNpbmNsdWRlICJOZXN0aW5nTGV2ZWxJbmNyZW1lbnRlci5o
IgotI2luY2x1ZGUgIk5ld1hNTERvY3VtZW50UGFyc2VyLmgiCi0jaW5jbHVkZSAiTm9kZUZpbHRl
ci5oIgotI2luY2x1ZGUgIk5vZGVJdGVyYXRvci5oIgotI2luY2x1ZGUgIk5vZGVSYXJlRGF0YS5o
IgotI2luY2x1ZGUgIk5vZGVXaXRoSW5kZXguaCIKICNpbmNsdWRlICJQYWdlLmgiCiAjaW5jbHVk
ZSAiUGFnZUdyb3VwLmgiCi0jaW5jbHVkZSAiUGFnZVRyYW5zaXRpb25FdmVudC5oIgotI2luY2x1
ZGUgIlBsYXRmb3JtS2V5Ym9hcmRFdmVudC5oIgotI2luY2x1ZGUgIlBsdWdpbkRvY3VtZW50Lmgi
Ci0jaW5jbHVkZSAiUG9pbnRlckxvY2tDb250cm9sbGVyLmgiCi0jaW5jbHVkZSAiUG9wU3RhdGVF
dmVudC5oIgogI2luY2x1ZGUgIlByb2Nlc3NpbmdJbnN0cnVjdGlvbi5oIgotI2luY2x1ZGUgIlF1
YWxpZmllZE5hbWUuaCIKLSNpbmNsdWRlICJSZWdpc3RlcmVkRXZlbnRMaXN0ZW5lci5oIgotI2lu
Y2x1ZGUgIlJlbmRlckFyZW5hLmgiCi0jaW5jbHVkZSAiUmVuZGVyTmFtZWRGbG93VGhyZWFkLmgi
Ci0jaW5jbHVkZSAiUmVuZGVyVGV4dENvbnRyb2wuaCIKLSNpbmNsdWRlICJSZW5kZXJWaWV3Lmgi
Ci0jaW5jbHVkZSAiUmVuZGVyV2lkZ2V0LmgiCi0jaW5jbHVkZSAiUnVudGltZUVuYWJsZWRGZWF0
dXJlcy5oIgotI2luY2x1ZGUgIlNjaGVtZVJlZ2lzdHJ5LmgiCi0jaW5jbHVkZSAiU2NvcGVkRXZl
bnRRdWV1ZS5oIgotI2luY2x1ZGUgIlNjcmlwdENhbGxTdGFjay5oIgotI2luY2x1ZGUgIlNjcmlw
dENvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJTY3JpcHRFbGVtZW50LmgiCi0jaW5jbHVkZSAiU2Ny
aXB0RXZlbnRMaXN0ZW5lci5oIgotI2luY2x1ZGUgIlNjcmlwdFJ1bm5lci5oIgotI2luY2x1ZGUg
IlNjcm9sbGluZ0Nvb3JkaW5hdG9yLmgiCi0jaW5jbHVkZSAiU2VjdXJpdHlPcmlnaW4uaCIKLSNp
bmNsdWRlICJTZWN1cml0eVBvbGljeS5oIgotI2luY2x1ZGUgIlNlZ21lbnRlZFN0cmluZy5oIgot
I2luY2x1ZGUgIlNlbGVjdG9yUXVlcnkuaCIKKyNpbmNsdWRlICJTVkdOYW1lcy5oIgorI2luY2x1
ZGUgIlNWR1N0eWxlRWxlbWVudC5oIgorI2luY2x1ZGUgIlNlbGVjdG9yQ2hlY2tlci5oIgogI2lu
Y2x1ZGUgIlNldHRpbmdzLmgiCi0jaW5jbHVkZSAiU2hhZG93Um9vdC5oIgotI2luY2x1ZGUgIlN0
YXRpY0hhc2hTZXROb2RlTGlzdC5oIgogI2luY2x1ZGUgIlN0eWxlUmVzb2x2ZXIuaCIKICNpbmNs
dWRlICJTdHlsZVNoZWV0Q29udGVudHMuaCIKICNpbmNsdWRlICJTdHlsZVNoZWV0TGlzdC5oIgot
I2luY2x1ZGUgIlRleHRSZXNvdXJjZURlY29kZXIuaCIKLSNpbmNsdWRlICJUaW1lci5oIgotI2lu
Y2x1ZGUgIlRyYW5zZm9ybVNvdXJjZS5oIgotI2luY2x1ZGUgIlRyZWVXYWxrZXIuaCIKLSNpbmNs
dWRlICJVbmRvTWFuYWdlci5oIgogI2luY2x1ZGUgIlVzZXJDb250ZW50VVJMUGF0dGVybi5oIgog
I2luY2x1ZGUgIldlYkNvcmVNZW1vcnlJbnN0cnVtZW50YXRpb24uaCIKLSNpbmNsdWRlICJXZWJL
aXROYW1lZEZsb3cuaCIKLSNpbmNsdWRlICJYTUxEb2N1bWVudFBhcnNlci5oIgotI2luY2x1ZGUg
IlhNTEh0dHBSZXF1ZXN0LmgiCi0jaW5jbHVkZSAiWE1MTlNOYW1lcy5oIgotI2luY2x1ZGUgIlhN
TE5hbWVzLmgiCi0jaW5jbHVkZSAiWFBhdGhFdmFsdWF0b3IuaCIKLSNpbmNsdWRlICJYUGF0aEV4
cHJlc3Npb24uaCIKLSNpbmNsdWRlICJYUGF0aE5TUmVzb2x2ZXIuaCIKLSNpbmNsdWRlICJYUGF0
aFJlc3VsdC5oIgotI2luY2x1ZGUgImh0bWxlZGl0aW5nLmgiCi0jaW5jbHVkZSA8d3RmL0N1cnJl
bnRUaW1lLmg+Ci0jaW5jbHVkZSA8d3RmL0hhc2hGdW5jdGlvbnMuaD4KLSNpbmNsdWRlIDx3dGYv
TWFpblRocmVhZC5oPgotI2luY2x1ZGUgPHd0Zi9QYXNzUmVmUHRyLmg+Ci0jaW5jbHVkZSA8d3Rm
L1N0ZExpYkV4dHJhcy5oPgotI2luY2x1ZGUgPHd0Zi90ZXh0L1N0cmluZ0J1ZmZlci5oPgotCi0j
aWYgRU5BQkxFKFNIQVJFRF9XT1JLRVJTKQotI2luY2x1ZGUgIlNoYXJlZFdvcmtlclJlcG9zaXRv
cnkuaCIKLSNlbmRpZgotCi0jaWYgRU5BQkxFKFhTTFQpCi0jaW5jbHVkZSAiWFNMVFByb2Nlc3Nv
ci5oIgotI2VuZGlmCi0KLSNpZiBFTkFCTEUoU1ZHKQotI2luY2x1ZGUgIlNWR0RvY3VtZW50RXh0
ZW5zaW9ucy5oIgotI2luY2x1ZGUgIlNWR0VsZW1lbnRGYWN0b3J5LmgiCi0jaW5jbHVkZSAiU1ZH
TmFtZXMuaCIKLSNpbmNsdWRlICJTVkdTVkdFbGVtZW50LmgiCi0jaW5jbHVkZSAiU1ZHU3R5bGVF
bGVtZW50LmgiCi0jZW5kaWYKLQotI2lmIEVOQUJMRShUT1VDSF9FVkVOVFMpCi0jaW5jbHVkZSAi
VG91Y2hMaXN0LmgiCi0jZW5kaWYKLQotI2lmIEVOQUJMRShNQVRITUwpCi0jaW5jbHVkZSAiTWF0
aE1MRWxlbWVudC5oIgotI2luY2x1ZGUgIk1hdGhNTEVsZW1lbnRGYWN0b3J5LmgiCi0jaW5jbHVk
ZSAiTWF0aE1MTmFtZXMuaCIKLSNlbmRpZgotCi0jaWYgRU5BQkxFKEZVTExTQ1JFRU5fQVBJKQot
I2luY2x1ZGUgIlJlbmRlckZ1bGxTY3JlZW4uaCIKLSNlbmRpZgotCi0jaWYgRU5BQkxFKFJFUVVF
U1RfQU5JTUFUSU9OX0ZSQU1FKQotI2luY2x1ZGUgIlJlcXVlc3RBbmltYXRpb25GcmFtZUNhbGxi
YWNrLmgiCi0jaW5jbHVkZSAiU2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyLmgiCi0jZW5kaWYK
LQotI2lmIEVOQUJMRShNSUNST0RBVEEpCi0jaW5jbHVkZSAiTWljcm9EYXRhSXRlbUxpc3QuaCIK
LSNpbmNsdWRlICJOb2RlUmFyZURhdGEuaCIKLSNlbmRpZgotCi0jaWYgRU5BQkxFKExJTktfUFJF
UkVOREVSKQotI2luY2x1ZGUgIlByZXJlbmRlcmVyLmgiCi0jZW5kaWYKLQotI2lmIEVOQUJMRShU
RVhUX0FVVE9TSVpJTkcpCi0jaW5jbHVkZSAiVGV4dEF1dG9zaXplci5oIgotI2VuZGlmCi0KLSNp
ZiBFTkFCTEUoQ1NQX05FWFQpCi0jaW5jbHVkZSAiRE9NU2VjdXJpdHlQb2xpY3kuaCIKLSNlbmRp
ZgotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotdXNpbmcgbmFtZXNwYWNlIFdURjsKLXVzaW5nIG5h
bWVzcGFjZSBVbmljb2RlOwogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIHVzaW5nIG5hbWVzcGFj
ZSBIVE1MTmFtZXM7CiAKLS8vICNkZWZpbmUgSU5TVFJVTUVOVF9MQVlPVVRfU0NIRURVTElORyAx
Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjTWF4V3JpdGVSZWN1cnNpb25EZXB0aCA9IDIxOwot
Ci0vLyBUaGlzIGFtb3VudCBvZiB0aW1lIG11c3QgaGF2ZSBlbGFwc2VkIGJlZm9yZSB3ZSB3aWxs
IGV2ZW4gY29uc2lkZXIgc2NoZWR1bGluZyBhIGxheW91dCB3aXRob3V0IGEgZGVsYXkuCi0vLyBG
SVhNRTogRm9yIGZhc3RlciBtYWNoaW5lcyB0aGlzIHZhbHVlIGNhbiByZWFsbHkgYmUgbG93ZXJl
ZCB0byAyMDAuICAyNTAgaXMgYWRlcXVhdGUsIGJ1dCBhIGxpdHRsZSBoaWdoCi0vLyBmb3IgZHVh
bCBHNXMuIDopCi1zdGF0aWMgY29uc3QgaW50IGNMYXlvdXRTY2hlZHVsZVRocmVzaG9sZCA9IDI1
MDsKLQotLy8gRE9NIExldmVsIDIgc2F5cyAobGV0dGVycyBhZGRlZCk6Ci0vLwotLy8gYSkgTmFt
ZSBzdGFydCBjaGFyYWN0ZXJzIG11c3QgaGF2ZSBvbmUgb2YgdGhlIGNhdGVnb3JpZXMgTGwsIEx1
LCBMbywgTHQsIE5sLgotLy8gYikgTmFtZSBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gTmFtZS1zdGFy
dCBjaGFyYWN0ZXJzIG11c3QgaGF2ZSBvbmUgb2YgdGhlIGNhdGVnb3JpZXMgTWMsIE1lLCBNbiwg
TG0sIG9yIE5kLgotLy8gYykgQ2hhcmFjdGVycyBpbiB0aGUgY29tcGF0aWJpbGl0eSBhcmVhIChp
LmUuIHdpdGggY2hhcmFjdGVyIGNvZGUgZ3JlYXRlciB0aGFuICN4RjkwMCBhbmQgbGVzcyB0aGFu
ICN4RkZGRSkgYXJlIG5vdCBhbGxvd2VkIGluIFhNTCBuYW1lcy4KLS8vIGQpIENoYXJhY3RlcnMg
d2hpY2ggaGF2ZSBhIGZvbnQgb3IgY29tcGF0aWJpbGl0eSBkZWNvbXBvc2l0aW9uIChpLmUuIHRo
b3NlIHdpdGggYSAiY29tcGF0aWJpbGl0eSBmb3JtYXR0aW5nIHRhZyIgaW4gZmllbGQgNSBvZiB0
aGUgZGF0YWJhc2UgLS0gbWFya2VkIGJ5IGZpZWxkIDUgYmVnaW5uaW5nIHdpdGggYSAiPCIpIGFy
ZSBub3QgYWxsb3dlZC4KLS8vIGUpIFRoZSBmb2xsb3dpbmcgY2hhcmFjdGVycyBhcmUgdHJlYXRl
ZCBhcyBuYW1lLXN0YXJ0IGNoYXJhY3RlcnMgcmF0aGVyIHRoYW4gbmFtZSBjaGFyYWN0ZXJzLCBi
ZWNhdXNlIHRoZSBwcm9wZXJ0eSBmaWxlIGNsYXNzaWZpZXMgdGhlbSBhcyBBbHBoYWJldGljOiBb
I3gwMkJCLSN4MDJDMV0sICN4MDU1OSwgI3gwNkU1LCAjeDA2RTYuCi0vLyBmKSBDaGFyYWN0ZXJz
ICN4MjBERC0jeDIwRTAgYXJlIGV4Y2x1ZGVkIChpbiBhY2NvcmRhbmNlIHdpdGggVW5pY29kZSwg
c2VjdGlvbiA1LjE0KS4KLS8vIGcpIENoYXJhY3RlciAjeDAwQjcgaXMgY2xhc3NpZmllZCBhcyBh
biBleHRlbmRlciwgYmVjYXVzZSB0aGUgcHJvcGVydHkgbGlzdCBzbyBpZGVudGlmaWVzIGl0Lgot
Ly8gaCkgQ2hhcmFjdGVyICN4MDM4NyBpcyBhZGRlZCBhcyBhIG5hbWUgY2hhcmFjdGVyLCBiZWNh
dXNlICN4MDBCNyBpcyBpdHMgY2Fub25pY2FsIGVxdWl2YWxlbnQuCi0vLyBpKSBDaGFyYWN0ZXJz
ICc6JyBhbmQgJ18nIGFyZSBhbGxvd2VkIGFzIG5hbWUtc3RhcnQgY2hhcmFjdGVycy4KLS8vIGop
IENoYXJhY3RlcnMgJy0nIGFuZCAnLicgYXJlIGFsbG93ZWQgYXMgbmFtZSBjaGFyYWN0ZXJzLgot
Ly8KLS8vIEl0IGFsc28gY29udGFpbnMgY29tcGxldGUgdGFibGVzLiBJZiB3ZSBkZWNpZGUgaXQn
cyBiZXR0ZXIsIHdlIGNvdWxkIGluY2x1ZGUgdGhvc2UgaW5zdGVhZCBvZiB0aGUgZm9sbG93aW5n
IGNvZGUuCi0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc1ZhbGlkTmFtZVN0YXJ0KFVDaGFyMzIgYykK
LXsKLSAgICAvLyBydWxlIChlKSBhYm92ZQotICAgIGlmICgoYyA+PSAweDAyQkIgJiYgYyA8PSAw
eDAyQzEpIHx8IGMgPT0gMHg1NTkgfHwgYyA9PSAweDZFNSB8fCBjID09IDB4NkU2KQotICAgICAg
ICByZXR1cm4gdHJ1ZTsKLQotICAgIC8vIHJ1bGUgKGkpIGFib3ZlCi0gICAgaWYgKGMgPT0gJzon
IHx8IGMgPT0gJ18nKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIC8vIHJ1bGVzIChhKSBh
bmQgKGYpIGFib3ZlCi0gICAgY29uc3QgdWludDMyX3QgbmFtZVN0YXJ0TWFzayA9IExldHRlcl9M
b3dlcmNhc2UgfCBMZXR0ZXJfVXBwZXJjYXNlIHwgTGV0dGVyX090aGVyIHwgTGV0dGVyX1RpdGxl
Y2FzZSB8IE51bWJlcl9MZXR0ZXI7Ci0gICAgaWYgKCEoVW5pY29kZTo6Y2F0ZWdvcnkoYykgJiBu
YW1lU3RhcnRNYXNrKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gcnVsZSAoYykg
YWJvdmUKLSAgICBpZiAoYyA+PSAweEY5MDAgJiYgYyA8IDB4RkZGRSkKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotCi0gICAgLy8gcnVsZSAoZCkgYWJvdmUKLSAgICBEZWNvbXBvc2l0aW9uVHlwZSBk
ZWNvbXBUeXBlID0gZGVjb21wb3NpdGlvblR5cGUoYyk7Ci0gICAgaWYgKGRlY29tcFR5cGUgPT0g
RGVjb21wb3NpdGlvbkZvbnQgfHwgZGVjb21wVHlwZSA9PSBEZWNvbXBvc2l0aW9uQ29tcGF0KQot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGlu
bGluZSBib29sIGlzVmFsaWROYW1lUGFydChVQ2hhcjMyIGMpCi17Ci0gICAgLy8gcnVsZXMgKGEp
LCAoZSksIGFuZCAoaSkgYWJvdmUKLSAgICBpZiAoaXNWYWxpZE5hbWVTdGFydChjKSkKLSAgICAg
ICAgcmV0dXJuIHRydWU7Ci0KLSAgICAvLyBydWxlcyAoZykgYW5kIChoKSBhYm92ZQotICAgIGlm
IChjID09IDB4MDBCNyB8fCBjID09IDB4MDM4NykKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAg
ICAvLyBydWxlIChqKSBhYm92ZQotICAgIGlmIChjID09ICctJyB8fCBjID09ICcuJykKLSAgICAg
ICAgcmV0dXJuIHRydWU7Ci0KLSAgICAvLyBydWxlcyAoYikgYW5kIChmKSBhYm92ZQotICAgIGNv
bnN0IHVpbnQzMl90IG90aGVyTmFtZVBhcnRNYXNrID0gTWFya19Ob25TcGFjaW5nIHwgTWFya19F
bmNsb3NpbmcgfCBNYXJrX1NwYWNpbmdDb21iaW5pbmcgfCBMZXR0ZXJfTW9kaWZpZXIgfCBOdW1i
ZXJfRGVjaW1hbERpZ2l0OwotICAgIGlmICghKFVuaWNvZGU6OmNhdGVnb3J5KGMpICYgb3RoZXJO
YW1lUGFydE1hc2spKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBydWxlIChjKSBh
Ym92ZQotICAgIGlmIChjID49IDB4RjkwMCAmJiBjIDwgMHhGRkZFKQotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0KLSAgICAvLyBydWxlIChkKSBhYm92ZQotICAgIERlY29tcG9zaXRpb25UeXBlIGRl
Y29tcFR5cGUgPSBkZWNvbXBvc2l0aW9uVHlwZShjKTsKLSAgICBpZiAoZGVjb21wVHlwZSA9PSBE
ZWNvbXBvc2l0aW9uRm9udCB8fCBkZWNvbXBUeXBlID09IERlY29tcG9zaXRpb25Db21wYXQpCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9v
bCBzaG91bGRJbmhlcml0U2VjdXJpdHlPcmlnaW5Gcm9tT3duZXIoY29uc3QgS1VSTCYgdXJsKQot
ewotICAgIC8vIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdv
cmsvI29yaWdpbi0wCi0gICAgLy8KLSAgICAvLyBJZiBhIERvY3VtZW50IGhhcyB0aGUgYWRkcmVz
cyAiYWJvdXQ6YmxhbmsiCi0gICAgLy8gICAgIFRoZSBvcmlnaW4gb2YgdGhlIERvY3VtZW50IGlz
IHRoZSBvcmlnaW4gaXQgd2FzIGFzc2lnbmVkIHdoZW4gaXRzIGJyb3dzaW5nIGNvbnRleHQgd2Fz
IGNyZWF0ZWQuCi0gICAgLy8KLSAgICAvLyBOb3RlOiBXZSBnZW5lcmFsaXplIHRoaXMgdG8gYWxs
ICJibGFuayIgVVJMcyBhbmQgaW52YWxpZCBVUkxzIGJlY2F1c2Ugd2UKLSAgICAvLyB0cmVhdCBh
bGwgb2YgdGhlc2UgVVJMcyBhcyBhYm91dDpibGFuay4KLSAgICAvLwotICAgIHJldHVybiAhdXJs
LmlzVmFsaWQoKSB8fCB1cmwuaXNCbGFua1VSTCgpOwotfQotCi1zdGF0aWMgV2lkZ2V0KiB3aWRn
ZXRGb3JOb2RlKE5vZGUqIGZvY3VzZWROb2RlKQotewotICAgIGlmICghZm9jdXNlZE5vZGUpCi0g
ICAgICAgIHJldHVybiAwOwotICAgIFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSBmb2N1c2VkTm9k
ZS0+cmVuZGVyZXIoKTsKLSAgICBpZiAoIXJlbmRlcmVyIHx8ICFyZW5kZXJlci0+aXNXaWRnZXQo
KSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIHRvUmVuZGVyV2lkZ2V0KHJlbmRlcmVy
KS0+d2lkZ2V0KCk7Ci19Ci0KLXN0YXRpYyBib29sIGFjY2VwdHNFZGl0aW5nRm9jdXMoTm9kZSog
bm9kZSkKLXsKLSAgICBBU1NFUlQobm9kZSk7Ci0gICAgQVNTRVJUKG5vZGUtPnJlbmRlcmVySXNF
ZGl0YWJsZSgpKTsKLQotICAgIE5vZGUqIHJvb3QgPSBub2RlLT5yb290RWRpdGFibGVFbGVtZW50
KCk7Ci0gICAgRnJhbWUqIGZyYW1lID0gbm9kZS0+ZG9jdW1lbnQoKS0+ZnJhbWUoKTsKLSAgICBp
ZiAoIWZyYW1lIHx8ICFyb290KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICByZXR1cm4g
ZnJhbWUtPmVkaXRvcigpLT5zaG91bGRCZWdpbkVkaXRpbmcocmFuZ2VPZkNvbnRlbnRzKHJvb3Qp
LmdldCgpKTsKLX0KLQotc3RhdGljIGJvb2wgY2FuQWNjZXNzQW5jZXN0b3IoY29uc3QgU2VjdXJp
dHlPcmlnaW4qIGFjdGl2ZVNlY3VyaXR5T3JpZ2luLCBGcmFtZSogdGFyZ2V0RnJhbWUpCi17Ci0g
ICAgLy8gdGFyZ2V0RnJhbWUgY2FuIGJlIDAgd2hlbiB3ZSdyZSB0cnlpbmcgdG8gbmF2aWdhdGUg
YSB0b3AtbGV2ZWwgZnJhbWUKLSAgICAvLyB0aGF0IGhhcyBhIDAgb3BlbmVyLgotICAgIGlmICgh
dGFyZ2V0RnJhbWUpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGNvbnN0IGJvb2wgaXNM
b2NhbEFjdGl2ZU9yaWdpbiA9IGFjdGl2ZVNlY3VyaXR5T3JpZ2luLT5pc0xvY2FsKCk7Ci0gICAg
Zm9yIChGcmFtZSogYW5jZXN0b3JGcmFtZSA9IHRhcmdldEZyYW1lOyBhbmNlc3RvckZyYW1lOyBh
bmNlc3RvckZyYW1lID0gYW5jZXN0b3JGcmFtZS0+dHJlZSgpLT5wYXJlbnQoKSkgewotICAgICAg
ICBEb2N1bWVudCogYW5jZXN0b3JEb2N1bWVudCA9IGFuY2VzdG9yRnJhbWUtPmRvY3VtZW50KCk7
Ci0gICAgICAgIC8vIEZJWE1FOiBTaG91bGQgYmUgYW4gQVNTRVJUPyBGcmFtZXMgc2hvdWxkIGFs
d2F5IGhhdmUgZG9jdW1lbnRzLgotICAgICAgICBpZiAoIWFuY2VzdG9yRG9jdW1lbnQpCi0gICAg
ICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICBjb25zdCBTZWN1cml0eU9yaWdpbiogYW5j
ZXN0b3JTZWN1cml0eU9yaWdpbiA9IGFuY2VzdG9yRG9jdW1lbnQtPnNlY3VyaXR5T3JpZ2luKCk7
Ci0gICAgICAgIGlmIChhY3RpdmVTZWN1cml0eU9yaWdpbi0+Y2FuQWNjZXNzKGFuY2VzdG9yU2Vj
dXJpdHlPcmlnaW4pKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIAotICAgICAg
ICAvLyBBbGxvdyBmaWxlIFVSTCBkZXNjZW5kYW50IG5hdmlnYXRpb24gZXZlbiB3aGVuIGFsbG93
RmlsZUFjY2Vzc0Zyb21GaWxlVVJMcyBpcyBmYWxzZS4KLSAgICAgICAgLy8gRklYTUU6IEl0J3Mg
YSBiaXQgc3RyYW5nZSB0byBzcGVjaWFsLWNhc2UgbG9jYWwgb3JpZ2lucyBoZXJlLiBTaG91bGQg
d2UgYmUgZG9pbmcKLSAgICAgICAgLy8gc29tZXRoaW5nIG1vcmUgZ2VuZXJhbCBpbnN0ZWFkPwot
ICAgICAgICBpZiAoaXNMb2NhbEFjdGl2ZU9yaWdpbiAmJiBhbmNlc3RvclNlY3VyaXR5T3JpZ2lu
LT5pc0xvY2FsKCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1
cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyB2b2lkIHByaW50TmF2aWdhdGlvbkVycm9yTWVzc2FnZShG
cmFtZSogZnJhbWUsIGNvbnN0IEtVUkwmIGFjdGl2ZVVSTCkKLXsKLSAgICAvLyBGSVhNRTogdGhp
cyBlcnJvciBtZXNzYWdlIHNob3VsZCBjb250YWluIG1vcmUgc3BlY2lmaWNzIG9mIHdoeSB0aGUg
bmF2aWdhdGlvbiBjaGFuZ2UgaXMgbm90IGFsbG93ZWQuCi0gICAgU3RyaW5nIG1lc3NhZ2UgPSAi
VW5zYWZlIEphdmFTY3JpcHQgYXR0ZW1wdCB0byBpbml0aWF0ZSBhIG5hdmlnYXRpb24gY2hhbmdl
IGZvciBmcmFtZSB3aXRoIFVSTCAiICsKLSAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5kb2N1
bWVudCgpLT51cmwoKS5zdHJpbmcoKSArICIgZnJvbSBmcmFtZSB3aXRoIFVSTCAiICsgYWN0aXZl
VVJMLnN0cmluZygpICsgIi5cbiI7Ci0KLSAgICAvLyBGSVhNRTogc2hvdWxkIHdlIHByaW50IHRv
IHRoZSBjb25zb2xlIG9mIHRoZSBkb2N1bWVudCBwZXJmb3JtaW5nIHRoZSBuYXZpZ2F0aW9uIGlu
c3RlYWQ/Ci0gICAgZnJhbWUtPmRvY3VtZW50KCktPmRvbVdpbmRvdygpLT5wcmludEVycm9yTWVz
c2FnZShtZXNzYWdlKTsKLX0KLQotc3RhdGljIEhhc2hTZXQ8RG9jdW1lbnQqPiogZG9jdW1lbnRz
VGhhdE5lZWRTdHlsZVJlY2FsYyA9IDA7Ci0KLWNsYXNzIERvY3VtZW50V2Vha1JlZmVyZW5jZSA6
IHB1YmxpYyBUaHJlYWRTYWZlUmVmQ291bnRlZDxEb2N1bWVudFdlYWtSZWZlcmVuY2U+IHsKLXB1
YmxpYzoKLSAgICBzdGF0aWMgUGFzc1JlZlB0cjxEb2N1bWVudFdlYWtSZWZlcmVuY2U+IGNyZWF0
ZShEb2N1bWVudCogZG9jdW1lbnQpCi0gICAgewotICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3
IERvY3VtZW50V2Vha1JlZmVyZW5jZShkb2N1bWVudCkpOwotICAgIH0KLQotICAgIERvY3VtZW50
KiBkb2N1bWVudCgpCi0gICAgewotICAgICAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOwotICAg
ICAgICByZXR1cm4gbV9kb2N1bWVudDsKLSAgICB9Ci0KLSAgICB2b2lkIGNsZWFyKCkKLSAgICB7
Ci0gICAgICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7Ci0gICAgICAgIG1fZG9jdW1lbnQgPSAw
OwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBEb2N1bWVudFdlYWtSZWZlcmVuY2UoRG9jdW1lbnQq
IGRvY3VtZW50KQotICAgICAgICA6IG1fZG9jdW1lbnQoZG9jdW1lbnQpCi0gICAgewotICAgICAg
ICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOwotICAgIH0KLQotICAgIERvY3VtZW50KiBtX2RvY3Vt
ZW50OwotfTsKLQotdWludDY0X3QgRG9jdW1lbnQ6OnNfZ2xvYmFsVHJlZVZlcnNpb24gPSAwOwot
Ci1Eb2N1bWVudDo6RG9jdW1lbnQoRnJhbWUqIGZyYW1lLCBjb25zdCBLVVJMJiB1cmwsIGJvb2wg
aXNYSFRNTCwgYm9vbCBpc0hUTUwpCi0gICAgOiBDb250YWluZXJOb2RlKDAsIENyZWF0ZURvY3Vt
ZW50KQotICAgICwgVHJlZVNjb3BlKHRoaXMpCi0gICAgLCBtX2d1YXJkUmVmQ291bnQoMCkKLSAg
ICAsIG1fY29udGV4dEZlYXR1cmVzKENvbnRleHRGZWF0dXJlczo6ZGVmYXVsdFN3aXRjaCgpKQot
ICAgICwgbV9jb21wYXRpYmlsaXR5TW9kZShOb1F1aXJrc01vZGUpCi0gICAgLCBtX2NvbXBhdGli
aWxpdHlNb2RlTG9ja2VkKGZhbHNlKQotICAgICwgbV9kb21UcmVlVmVyc2lvbigrK3NfZ2xvYmFs
VHJlZVZlcnNpb24pCi0jaWYgRU5BQkxFKE1VVEFUSU9OX09CU0VSVkVSUykKLSAgICAsIG1fbXV0
YXRpb25PYnNlcnZlclR5cGVzKDApCi0jZW5kaWYKLSAgICAsIG1fc3R5bGVTaGVldHMoU3R5bGVT
aGVldExpc3Q6OmNyZWF0ZSh0aGlzKSkKK0RvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OkRv
Y3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24oRG9jdW1lbnQqIGRvY3VtZW50KQorICAgIDogbV9k
b2N1bWVudChkb2N1bWVudCkKKyAgICAsIG1fYXV0aG9yU3R5bGVTaGVldHMoU3R5bGVTaGVldExp
c3Q6OmNyZWF0ZShkb2N1bWVudCkpCisgICAgLCBtX3BlbmRpbmdTdHlsZXNoZWV0cygwKQorICAg
ICwgbV9wYWdlR3JvdXBVc2VyU2hlZXRDYWNoZVZhbGlkKGZhbHNlKQogICAgICwgbV9oYWRBY3Rp
dmVMb2FkaW5nU3R5bGVzaGVldChmYWxzZSkKLSAgICAsIG1fcmVhZHlTdGF0ZShDb21wbGV0ZSkK
LSAgICAsIG1fc3R5bGVSZWNhbGNUaW1lcih0aGlzLCAmRG9jdW1lbnQ6OnN0eWxlUmVjYWxjVGlt
ZXJGaXJlZCkKLSAgICAsIG1fcGVuZGluZ1N0eWxlUmVjYWxjU2hvdWxkRm9yY2UoZmFsc2UpCi0g
ICAgLCBtX2ZyYW1lRWxlbWVudHNTaG91bGRJZ25vcmVTY3JvbGxpbmcoZmFsc2UpCi0gICAgLCBt
X2NvbnRhaW5zVmFsaWRpdHlTdHlsZVJ1bGVzKGZhbHNlKQotICAgICwgbV91cGRhdGVGb2N1c0Fw
cGVhcmFuY2VSZXN0b3Jlc1NlbGVjdGlvbihmYWxzZSkKLSAgICAsIG1faWdub3JlRGVzdHJ1Y3Rp
dmVXcml0ZUNvdW50KDApCi0gICAgLCBtX3RpdGxlU2V0RXhwbGljaXRseShmYWxzZSkKLSAgICAs
IG1fdXBkYXRlRm9jdXNBcHBlYXJhbmNlVGltZXIodGhpcywgJkRvY3VtZW50Ojp1cGRhdGVGb2N1
c0FwcGVhcmFuY2VUaW1lckZpcmVkKQotICAgICwgbV9sb2FkRXZlbnRGaW5pc2hlZChmYWxzZSkK
LSAgICAsIG1fc3RhcnRUaW1lKGN1cnJlbnRUaW1lKCkpCi0gICAgLCBtX292ZXJNaW5pbXVtTGF5
b3V0VGhyZXNob2xkKGZhbHNlKQotICAgICwgbV9zY3JpcHRSdW5uZXIoU2NyaXB0UnVubmVyOjpj
cmVhdGUodGhpcykpCi0gICAgLCBtX3htbFZlcnNpb24oIjEuMCIpCi0gICAgLCBtX3htbFN0YW5k
YWxvbmUoU3RhbmRhbG9uZVVuc3BlY2lmaWVkKQotICAgICwgbV9oYXNYTUxEZWNsYXJhdGlvbigw
KQotICAgICwgbV9zYXZlZFJlbmRlcmVyKDApCi0gICAgLCBtX2Rlc2lnbk1vZGUoaW5oZXJpdCkK
LSNpZiBFTkFCTEUoREFTSEJPQVJEX1NVUFBPUlQpIHx8IEVOQUJMRShXSURHRVRfUkVHSU9OKQot
ICAgICwgbV9oYXNEYXNoYm9hcmRSZWdpb25zKGZhbHNlKQotICAgICwgbV9kYXNoYm9hcmRSZWdp
b25zRGlydHkoZmFsc2UpCi0jZW5kaWYKLSAgICAsIG1fY3JlYXRlUmVuZGVyZXJzKHRydWUpCi0g
ICAgLCBtX2luUGFnZUNhY2hlKGZhbHNlKQotICAgICwgbV9hY2Nlc3NLZXlNYXBWYWxpZChmYWxz
ZSkKLSAgICAsIG1fdXNlU2VjdXJlS2V5Ym9hcmRFbnRyeVdoZW5BY3RpdmUoZmFsc2UpCi0gICAg
LCBtX2lzWEhUTUwoaXNYSFRNTCkKLSAgICAsIG1faXNIVE1MKGlzSFRNTCkKLSAgICAsIG1faXNW
aWV3U291cmNlKGZhbHNlKQotICAgICwgbV9zYXdFbGVtZW50c0luS25vd25OYW1lc3BhY2VzKGZh
bHNlKQotICAgICwgbV9pc1NyY2RvY0RvY3VtZW50KGZhbHNlKQotICAgICwgbV9kb2N1bWVudFJh
cmVEYXRhKDApCi0gICAgLCBtX2V2ZW50UXVldWUoRG9jdW1lbnRFdmVudFF1ZXVlOjpjcmVhdGUo
dGhpcykpCi0gICAgLCBtX3dlYWtSZWZlcmVuY2UoRG9jdW1lbnRXZWFrUmVmZXJlbmNlOjpjcmVh
dGUodGhpcykpCi0gICAgLCBtX2lkQXR0cmlidXRlTmFtZShpZEF0dHIpCi0jaWYgRU5BQkxFKEZV
TExTQ1JFRU5fQVBJKQotICAgICwgbV9hcmVLZXlzRW5hYmxlZEluRnVsbFNjcmVlbigwKQotICAg
ICwgbV9mdWxsU2NyZWVuUmVuZGVyZXIoMCkKLSAgICAsIG1fZnVsbFNjcmVlbkNoYW5nZURlbGF5
VGltZXIodGhpcywgJkRvY3VtZW50OjpmdWxsU2NyZWVuQ2hhbmdlRGVsYXlUaW1lckZpcmVkKQot
ICAgICwgbV9pc0FuaW1hdGluZ0Z1bGxTY3JlZW4oZmFsc2UpCi0jZW5kaWYKLSAgICAsIG1fbG9h
ZEV2ZW50RGVsYXlDb3VudCgwKQotICAgICwgbV9sb2FkRXZlbnREZWxheVRpbWVyKHRoaXMsICZE
b2N1bWVudDo6bG9hZEV2ZW50RGVsYXlUaW1lckZpcmVkKQotICAgICwgbV9yZWZlcnJlclBvbGlj
eShSZWZlcnJlclBvbGljeURlZmF1bHQpCi0gICAgLCBtX2RpcmVjdGlvblNldE9uRG9jdW1lbnRF
bGVtZW50KGZhbHNlKQotICAgICwgbV93cml0aW5nTW9kZVNldE9uRG9jdW1lbnRFbGVtZW50KGZh
bHNlKQotICAgICwgbV93cml0ZVJlY3Vyc2lvbklzVG9vRGVlcChmYWxzZSkKLSAgICAsIG1fd3Jp
dGVSZWN1cnNpb25EZXB0aCgwKQotICAgICwgbV93aGVlbEV2ZW50SGFuZGxlckNvdW50KDApCi0j
aWYgRU5BQkxFKFRPVUNIX0VWRU5UUykKLSAgICAsIG1fdG91Y2hFdmVudEhhbmRsZXJDb3VudCgw
KQotI2VuZGlmCi0jaWYgRU5BQkxFKFVORE9fTUFOQUdFUikKLSAgICAsIG1fdW5kb01hbmFnZXIo
MCkKLSNlbmRpZgotICAgICwgbV9wZW5kaW5nVGFza3NUaW1lcih0aGlzLCAmRG9jdW1lbnQ6OnBl
bmRpbmdUYXNrc1RpbWVyRmlyZWQpCi0gICAgLCBtX3NjaGVkdWxlZFRhc2tzQXJlU3VzcGVuZGVk
KGZhbHNlKQotICAgICwgbV92aXN1YWxVcGRhdGVzQWxsb3dlZCh0cnVlKQotICAgICwgbV92aXN1
YWxVcGRhdGVzU3VwcHJlc3Npb25UaW1lcih0aGlzLCAmRG9jdW1lbnQ6OnZpc3VhbFVwZGF0ZXNT
dXBwcmVzc2lvblRpbWVyRmlyZWQpCi0jaWZuZGVmIE5ERUJVRwotICAgICwgbV9kaWREaXNwYXRj
aFZpZXdwb3J0UHJvcGVydGllc0NoYW5nZWQoZmFsc2UpCi0jZW5kaWYKLXsKLSAgICBtX2RvY3Vt
ZW50ID0gdGhpczsKLQotICAgIG1fcGFnZUdyb3VwVXNlclNoZWV0Q2FjaGVWYWxpZCA9IGZhbHNl
OwotCi0gICAgbV9wcmludGluZyA9IGZhbHNlOwotICAgIG1fcGFnaW5hdGVkRm9yU2NyZWVuID0g
ZmFsc2U7Ci0KLSAgICBtX2lnbm9yZUF1dG9mb2N1cyA9IGZhbHNlOwotCi0gICAgbV9mcmFtZSA9
IGZyYW1lOwotICAgIGlmIChtX2ZyYW1lKQotICAgICAgICBwcm92aWRlQ29udGV4dEZlYXR1cmVz
VG9Eb2N1bWVudEZyb20odGhpcywgbV9mcmFtZS0+cGFnZSgpKTsKLQotICAgIC8vIFdlIGRlcGVu
ZCBvbiB0aGUgdXJsIGdldHRpbmcgaW1tZWRpYXRlbHkgc2V0IGluIHN1YmZyYW1lcywgYnV0IHdl
Ci0gICAgLy8gYWxzbyBkZXBlbmQgb24gdGhlIHVybCBOT1QgZ2V0dGluZyBpbW1lZGlhdGVseSBz
ZXQgaW4gb3BlbmVkIHdpbmRvd3MuCi0gICAgLy8gU2VlIGZhc3QvZG9tL2Vhcmx5LWZyYW1lLXVy
bC5odG1sCi0gICAgLy8gYW5kIGZhc3QvZG9tL2xvY2F0aW9uLW5ldy13aW5kb3ctbm8tY3Jhc2gu
aHRtbCwgcmVzcGVjdGl2ZWx5LgotICAgIC8vIEZJWE1FOiBDYW4vc2hvdWxkIHdlIHVuaWZ5IHRo
aXMgYmVoYXZpb3I/Ci0gICAgaWYgKChmcmFtZSAmJiBmcmFtZS0+b3duZXJFbGVtZW50KCkpIHx8
ICF1cmwuaXNFbXB0eSgpKQotICAgICAgICBzZXRVUkwodXJsKTsKLQotICAgIG1fYXhPYmplY3RD
YWNoZSA9IDA7Ci0KLSAgICBtX21hcmtlcnMgPSBhZG9wdFB0cihuZXcgRG9jdW1lbnRNYXJrZXJD
b250cm9sbGVyKTsKLQotICAgIG1fY2FjaGVkUmVzb3VyY2VMb2FkZXIgPSBhZG9wdFB0cihuZXcg
Q2FjaGVkUmVzb3VyY2VMb2FkZXIodGhpcykpOwotI2lmIEVOQUJMRShMSU5LX1BSRVJFTkRFUikK
LSAgICBtX3ByZXJlbmRlcmVyID0gUHJlcmVuZGVyZXI6OmNyZWF0ZSh0aGlzKTsKLSNlbmRpZgot
I2lmIEVOQUJMRShURVhUX0FVVE9TSVpJTkcpCi0gICAgbV90ZXh0QXV0b3NpemVyID0gVGV4dEF1
dG9zaXplcjo6Y3JlYXRlKHRoaXMpOwotI2VuZGlmCi0gICAgbV92aXN1YWxseU9yZGVyZWQgPSBm
YWxzZTsKLSAgICBtX2JQYXJzaW5nID0gZmFsc2U7Ci0gICAgbV93ZWxsRm9ybWVkID0gZmFsc2U7
Ci0KLSAgICBtX3RleHRDb2xvciA9IENvbG9yOjpibGFjazsKLSAgICBtX2xpc3RlbmVyVHlwZXMg
PSAwOwotICAgIG1faW5TdHlsZVJlY2FsYyA9IGZhbHNlOwotICAgIG1fY2xvc2VBZnRlclN0eWxl
UmVjYWxjID0gZmFsc2U7Ci0KLSAgICBtX3VzZXNTaWJsaW5nUnVsZXMgPSBmYWxzZTsKLSAgICBt
X3VzZXNTaWJsaW5nUnVsZXNPdmVycmlkZSA9IGZhbHNlOwotICAgIG1fdXNlc0ZpcnN0TGluZVJ1
bGVzID0gZmFsc2U7Ci0gICAgbV91c2VzRmlyc3RMZXR0ZXJSdWxlcyA9IGZhbHNlOwotICAgIG1f
dXNlc0JlZm9yZUFmdGVyUnVsZXMgPSBmYWxzZTsKLSAgICBtX3VzZXNCZWZvcmVBZnRlclJ1bGVz
T3ZlcnJpZGUgPSBmYWxzZTsKLSAgICBtX3VzZXNSZW1Vbml0cyA9IGZhbHNlOwotICAgIG1fdXNl
c0xpbmtSdWxlcyA9IGZhbHNlOwotCi0gICAgbV9nb3RvQW5jaG9yTmVlZGVkQWZ0ZXJTdHlsZXNo
ZWV0c0xvYWQgPSBmYWxzZTsKLQotICAgIG1fZGlkQ2FsY3VsYXRlU3R5bGVSZXNvbHZlciA9IGZh
bHNlOwotICAgIG1faGFzRGlydHlTdHlsZVJlc29sdmVyID0gZmFsc2U7Ci0gICAgbV9wZW5kaW5n
U3R5bGVzaGVldHMgPSAwOwotICAgIG1faWdub3JlUGVuZGluZ1N0eWxlc2hlZXRzID0gZmFsc2U7
Ci0gICAgbV9uZWVkc05vdGlmeVJlbW92ZUFsbFBlbmRpbmdTdHlsZXNoZWV0ID0gZmFsc2U7Ci0g
ICAgbV9oYXNOb2Rlc1dpdGhQbGFjZWhvbGRlclN0eWxlID0gZmFsc2U7Ci0gICAgbV9wZW5kaW5n
U2hlZXRMYXlvdXQgPSBOb0xheW91dFdpdGhQZW5kaW5nU2hlZXRzOwotCi0gICAgbV9jc3NUYXJn
ZXQgPSAwOwotCi0gICAgcmVzZXRMaW5rQ29sb3IoKTsKLSAgICByZXNldFZpc2l0ZWRMaW5rQ29s
b3IoKTsKLSAgICByZXNldEFjdGl2ZUxpbmtDb2xvcigpOwotCi0gICAgbV9wcm9jZXNzaW5nTG9h
ZEV2ZW50ID0gZmFsc2U7Ci0gICAgCi0gICAgaW5pdFNlY3VyaXR5Q29udGV4dCgpOwotICAgIGlu
aXRETlNQcmVmZXRjaCgpOwotCi0gICAgc3RhdGljIGludCBkb2NJRCA9IDA7Ci0gICAgbV9kb2NJ
RCA9IGRvY0lEKys7Ci0KLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgV1RGX0FSUkFZX0xF
TkdUSChtX25vZGVMaXN0Q291bnRzKTsgaSsrKQotICAgICAgICBtX25vZGVMaXN0Q291bnRzW2ld
ID0gMDsKLQotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBXVEZfQVJSQVlfTEVOR1RIKG1f
Y29sbGVjdGlvbnMpOyBpKyspCi0gICAgICAgIG1fY29sbGVjdGlvbnNbaV0gPSAwOwotCi0gICAg
SW5zcGVjdG9yQ291bnRlcnM6OmluY3JlbWVudENvdW50ZXIoSW5zcGVjdG9yQ291bnRlcnM6OkRv
Y3VtZW50Q291bnRlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIGhpc3RvZ3JhbU11dGF0aW9uRXZlbnRV
c2FnZShjb25zdCB1bnNpZ25lZCBzaG9ydCYgbGlzdGVuZXJUeXBlcykKLXsKLSAgICBIaXN0b2dy
YW1TdXBwb3J0OjpoaXN0b2dyYW1FbnVtZXJhdGlvbigiRE9NQVBJLlBlckRvY3VtZW50TXV0YXRp
b25FdmVudFVzYWdlLkRPTVN1YnRyZWVNb2RpZmllZCIsIHN0YXRpY19jYXN0PGJvb2w+KGxpc3Rl
bmVyVHlwZXMgJiBEb2N1bWVudDo6RE9NU1VCVFJFRU1PRElGSUVEX0xJU1RFTkVSKSwgMik7Ci0g
ICAgSGlzdG9ncmFtU3VwcG9ydDo6aGlzdG9ncmFtRW51bWVyYXRpb24oIkRPTUFQSS5QZXJEb2N1
bWVudE11dGF0aW9uRXZlbnRVc2FnZS5ET01Ob2RlSW5zZXJ0ZWQiLCBzdGF0aWNfY2FzdDxib29s
PihsaXN0ZW5lclR5cGVzICYgRG9jdW1lbnQ6OkRPTU5PREVJTlNFUlRFRF9MSVNURU5FUiksIDIp
OwotICAgIEhpc3RvZ3JhbVN1cHBvcnQ6Omhpc3RvZ3JhbUVudW1lcmF0aW9uKCJET01BUEkuUGVy
RG9jdW1lbnRNdXRhdGlvbkV2ZW50VXNhZ2UuRE9NTm9kZVJlbW92ZWQiLCBzdGF0aWNfY2FzdDxi
b29sPihsaXN0ZW5lclR5cGVzICYgRG9jdW1lbnQ6OkRPTU5PREVSRU1PVkVEX0xJU1RFTkVSKSwg
Mik7Ci0gICAgSGlzdG9ncmFtU3VwcG9ydDo6aGlzdG9ncmFtRW51bWVyYXRpb24oIkRPTUFQSS5Q
ZXJEb2N1bWVudE11dGF0aW9uRXZlbnRVc2FnZS5ET01Ob2RlUmVtb3ZlZEZyb21Eb2N1bWVudCIs
IHN0YXRpY19jYXN0PGJvb2w+KGxpc3RlbmVyVHlwZXMgJiBEb2N1bWVudDo6RE9NTk9ERVJFTU9W
RURGUk9NRE9DVU1FTlRfTElTVEVORVIpLCAyKTsKLSAgICBIaXN0b2dyYW1TdXBwb3J0OjpoaXN0
b2dyYW1FbnVtZXJhdGlvbigiRE9NQVBJLlBlckRvY3VtZW50TXV0YXRpb25FdmVudFVzYWdlLkRP
TU5vZGVJbnNlcnRlZEludG9Eb2N1bWVudCIsIHN0YXRpY19jYXN0PGJvb2w+KGxpc3RlbmVyVHlw
ZXMgJiBEb2N1bWVudDo6RE9NTk9ERUlOU0VSVEVESU5UT0RPQ1VNRU5UX0xJU1RFTkVSKSwgMik7
Ci0gICAgSGlzdG9ncmFtU3VwcG9ydDo6aGlzdG9ncmFtRW51bWVyYXRpb24oIkRPTUFQSS5QZXJE
b2N1bWVudE11dGF0aW9uRXZlbnRVc2FnZS5ET01DaGFyYWN0ZXJEYXRhTW9kaWZpZWQiLCBzdGF0
aWNfY2FzdDxib29sPihsaXN0ZW5lclR5cGVzICYgRG9jdW1lbnQ6OkRPTUNIQVJBQ1RFUkRBVEFN
T0RJRklFRF9MSVNURU5FUiksIDIpOwotfQotCi0jaWYgRU5BQkxFKEZVTExTQ1JFRU5fQVBJKQot
c3RhdGljIGJvb2wgaXNBdHRyaWJ1dGVPbkFsbE93bmVycyhjb25zdCBXZWJDb3JlOjpRdWFsaWZp
ZWROYW1lJiBhdHRyaWJ1dGUsIGNvbnN0IEhUTUxGcmFtZU93bmVyRWxlbWVudCogb3duZXIpCisg
ICAgLCBtX25lZWRzVXBkYXRlQWN0aXZlU3R5bGVzaGVldHNPblN0eWxlUmVjYWxjKGZhbHNlKQor
ICAgICwgbV91c2VzU2libGluZ1J1bGVzKGZhbHNlKQorICAgICwgbV91c2VzU2libGluZ1J1bGVz
T3ZlcnJpZGUoZmFsc2UpCisgICAgLCBtX3VzZXNGaXJzdExpbmVSdWxlcyhmYWxzZSkKKyAgICAs
IG1fdXNlc0ZpcnN0TGV0dGVyUnVsZXMoZmFsc2UpCisgICAgLCBtX3VzZXNCZWZvcmVBZnRlclJ1
bGVzKGZhbHNlKQorICAgICwgbV91c2VzQmVmb3JlQWZ0ZXJSdWxlc092ZXJyaWRlKGZhbHNlKQor
ICAgICwgbV91c2VzUmVtVW5pdHMoZmFsc2UpCiB7Ci0gICAgaWYgKCFvd25lcikKLSAgICAgICAg
cmV0dXJuIHRydWU7Ci0gICAgZG8gewotICAgICAgICBpZiAoIW93bmVyLT5oYXNBdHRyaWJ1dGUo
YXR0cmlidXRlKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IHdoaWxlICgob3du
ZXIgPSBvd25lci0+ZG9jdW1lbnQoKS0+b3duZXJFbGVtZW50KCkpKTsKLSAgICByZXR1cm4gdHJ1
ZTsKIH0KLSNlbmRpZgogCi1Eb2N1bWVudDo6fkRvY3VtZW50KCkKK0RvY3VtZW50U3R5bGVTaGVl
dENvbGxlY3Rpb246On5Eb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uKCkKIHsKLSAgICBBU1NF
UlQoIXJlbmRlcmVyKCkpOwotICAgIEFTU0VSVCghbV9pblBhZ2VDYWNoZSk7Ci0gICAgQVNTRVJU
KCFtX3NhdmVkUmVuZGVyZXIpOwotICAgIEFTU0VSVChtX3Jhbmdlcy5pc0VtcHR5KCkpOwotICAg
IEFTU0VSVCghbV9zdHlsZVJlY2FsY1RpbWVyLmlzQWN0aXZlKCkpOwotICAgIEFTU0VSVCghbV9w
YXJlbnRUcmVlU2NvcGUpOwotICAgIEFTU0VSVCghbV9ndWFyZFJlZkNvdW50KTsKLQotICAgIC8v
IEZJWE1FOiBTaG91bGQgd2UgcmVzZXQgbV9kb21XaW5kb3cgd2hlbiB3ZSBkZXRhY2ggZnJvbSB0
aGUgRnJhbWU/Ci0gICAgaWYgKG1fZG9tV2luZG93KQotICAgICAgICBtX2RvbVdpbmRvdy0+cmVz
ZXRVbmxlc3NTdXNwZW5kZWRGb3JQYWdlQ2FjaGUoKTsKLQotICAgIG1fc2NyaXB0UnVubmVyLmNs
ZWFyKCk7Ci0KLSAgICBoaXN0b2dyYW1NdXRhdGlvbkV2ZW50VXNhZ2UobV9saXN0ZW5lclR5cGVz
KTsKLQotICAgIHJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzKCk7CisgICAgbV9hdXRob3JTdHlsZVNo
ZWV0cy0+ZG9jdW1lbnREZXN0cm95ZWQoKTsKIAotICAgIC8vIEN1cnJlbnRseSB3ZSBiZWxpZXZl
IHRoYXQgRG9jdW1lbnQgY2FuIG5ldmVyIG91dGxpdmUgdGhlIHBhcnNlci4KLSAgICAvLyBBbHRo
b3VnaCB0aGUgRG9jdW1lbnQgbWF5IGJlIHJlcGxhY2VkIHN5bmNocm9ub3VzbHksIERvY3VtZW50
UGFyc2VycwotICAgIC8vIGdlbmVyYWxseSBrZWVwIGF0IGxlYXN0IG9uZSByZWZlcmVuY2UgdG8g
YW4gRWxlbWVudCB3aGljaCB3b3VsZCBpbiB0dXJuCi0gICAgLy8gaGFzIGEgcmVmZXJlbmNlIHRv
IHRoZSBEb2N1bWVudC4gIElmIHlvdSBoaXQgdGhpcyBBU1NFUlQsIHRoZW4gdGhhdAotICAgIC8v
IGFzc3VtcHRpb24gaXMgd3JvbmcuICBEb2N1bWVudFBhcnNlcjo6ZGV0YWNoKCkgc2hvdWxkIGVu
c3VyZSB0aGF0IGV2ZW4KLSAgICAvLyBpZiB0aGUgRG9jdW1lbnRQYXJzZXIgb3V0bGl2ZXMgdGhl
IERvY3VtZW50IGl0IHdvbid0IGNhdXNlIGJhZG5lc3MuCi0gICAgQVNTRVJUKCFtX3BhcnNlciB8
fCBtX3BhcnNlci0+cmVmQ291bnQoKSA9PSAxKTsKLSAgICBkZXRhY2hQYXJzZXIoKTsKLQotICAg
IG1fcmVuZGVyQXJlbmEuY2xlYXIoKTsKLQotICAgIGNsZWFyQVhPYmplY3RDYWNoZSgpOwotCi0g
ICAgbV9kZWNvZGVyID0gMDsKLQotICAgIGlmIChtX3N0eWxlU2hlZXRzKQotICAgICAgICBtX3N0
eWxlU2hlZXRzLT5kb2N1bWVudERlc3Ryb3llZCgpOwotCi0gICAgaWYgKG1fbmFtZWRGbG93cykK
LSAgICAgICAgbV9uYW1lZEZsb3dzLT5kb2N1bWVudERlc3Ryb3llZCgpOwotCi0gICAgaWYgKG1f
ZWxlbVNoZWV0KQotICAgICAgICBtX2VsZW1TaGVldC0+Y2xlYXJPd25lck5vZGUoKTsKICAgICBp
ZiAobV9wYWdlVXNlclNoZWV0KQogICAgICAgICBtX3BhZ2VVc2VyU2hlZXQtPmNsZWFyT3duZXJO
b2RlKCk7CiAgICAgaWYgKG1fcGFnZUdyb3VwVXNlclNoZWV0cykgewpAQCAtNjYxLDU3MzIgKzgy
LDQwNiBAQCBEb2N1bWVudDo6fkRvY3VtZW50KCkKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7
IGkgPCBtX3VzZXJTaGVldHMtPnNpemUoKTsgKytpKQogICAgICAgICAgICAgKCptX3VzZXJTaGVl
dHMpW2ldLT5jbGVhck93bmVyTm9kZSgpOwogICAgIH0KLQotICAgIGRlbGV0ZUN1c3RvbUZvbnRz
KCk7Ci0KLSAgICBtX3dlYWtSZWZlcmVuY2UtPmNsZWFyKCk7Ci0KLSAgICBpZiAobV9tZWRpYVF1
ZXJ5TWF0Y2hlcikKLSAgICAgICAgbV9tZWRpYVF1ZXJ5TWF0Y2hlci0+ZG9jdW1lbnREZXN0cm95
ZWQoKTsKLQotICAgIGNsZWFyU3R5bGVSZXNvbHZlcigpOyAvLyBXZSBuZWVkIHRvIGRlc3Rvcnkg
Q1NTRm9udFNlbGVjdG9yIGJlZm9yZSBkZXN0cm95aW5nIG1fY2FjaGVkUmVzb3VyY2VMb2FkZXIu
Ci0gICAgbV9jYWNoZWRSZXNvdXJjZUxvYWRlci5jbGVhcigpOwotCi0gICAgLy8gV2UgbXVzdCBj
YWxsIGNsZWFyUmFyZURhdGEoKSBoZXJlIHNpbmNlIGEgRG9jdW1lbnQgY2xhc3MgaW5oZXJpdHMg
VHJlZVNjb3BlCi0gICAgLy8gYXMgd2VsbCBhcyBOb2RlLiBTZWUgYSBjb21tZW50IG9uIFRyZWVT
Y29wZS5oIGZvciB0aGUgcmVhc29uLgotICAgIGlmIChoYXNSYXJlRGF0YSgpKQotICAgICAgICBj
bGVhclJhcmVEYXRhKCk7Ci0KLSAgICBBU1NFUlQoIW1fbGlzdHNJbnZhbGlkYXRlZEF0RG9jdW1l
bnQuc2l6ZSgpKTsKLQotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBXVEZfQVJSQVlfTEVO
R1RIKG1fbm9kZUxpc3RDb3VudHMpOyBpKyspCi0gICAgICAgIEFTU0VSVCghbV9ub2RlTGlzdENv
dW50c1tpXSk7Ci0KLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgV1RGX0FSUkFZX0xFTkdU
SChtX2NvbGxlY3Rpb25zKTsgaSsrKQotICAgICAgICBBU1NFUlQoIW1fY29sbGVjdGlvbnNbaV0p
OwotCi0gICAgbV9kb2N1bWVudCA9IDA7Ci0KLSAgICBJbnNwZWN0b3JDb3VudGVyczo6ZGVjcmVt
ZW50Q291bnRlcihJbnNwZWN0b3JDb3VudGVyczo6RG9jdW1lbnRDb3VudGVyKTsKLX0KLQotdm9p
ZCBEb2N1bWVudDo6cmVtb3ZlZExhc3RSZWYoKQotewotICAgIEFTU0VSVCghbV9kZWxldGlvbkhh
c0JlZ3VuKTsKLSAgICBpZiAobV9ndWFyZFJlZkNvdW50KSB7Ci0gICAgICAgIC8vIElmIHJlbW92
aW5nIGEgY2hpbGQgcmVtb3ZlcyB0aGUgbGFzdCBzZWxmLW9ubHkgcmVmLCB3ZSBkb24ndAotICAg
ICAgICAvLyB3YW50IHRoZSBzY29wZSB0byBiZSBkZXN0cnVjdGVkIHVudGlsIGFmdGVyCi0gICAg
ICAgIC8vIHJlbW92ZUFsbENoaWxkcmVuIHJldHVybnMsIHNvIHdlIGd1YXJkIG91cnNlbHZlcyB3
aXRoIGFuCi0gICAgICAgIC8vIGV4dHJhIHNlbGYtb25seSByZWYuCi0gICAgICAgIGd1YXJkUmVm
KCk7Ci0KLSAgICAgICAgLy8gV2UgbXVzdCBtYWtlIHN1cmUgbm90IHRvIGJlIHJldGFpbmluZyBh
bnkgb2Ygb3VyIGNoaWxkcmVuIHRocm91Z2gKLSAgICAgICAgLy8gdGhlc2UgZXh0cmEgcG9pbnRl
cnMgb3Igd2Ugd2lsbCBjcmVhdGUgYSByZWZlcmVuY2UgY3ljbGUuCi0gICAgICAgIG1fZG9jVHlw
ZSA9IDA7Ci0gICAgICAgIG1fZm9jdXNlZE5vZGUgPSAwOwotICAgICAgICBtX2hvdmVyTm9kZSA9
IDA7Ci0gICAgICAgIG1fYWN0aXZlTm9kZSA9IDA7Ci0gICAgICAgIG1fdGl0bGVFbGVtZW50ID0g
MDsKLSAgICAgICAgbV9kb2N1bWVudEVsZW1lbnQgPSAwOwotICAgICAgICBtX2NvbnRleHRGZWF0
dXJlcyA9IENvbnRleHRGZWF0dXJlczo6ZGVmYXVsdFN3aXRjaCgpOwotI2lmIEVOQUJMRShGVUxM
U0NSRUVOX0FQSSkKLSAgICAgICAgbV9mdWxsU2NyZWVuRWxlbWVudCA9IDA7Ci0gICAgICAgIG1f
ZnVsbFNjcmVlbkVsZW1lbnRTdGFjay5jbGVhcigpOwotI2VuZGlmCi0KLSAgICAgICAgZGV0YWNo
UGFyc2VyKCk7Ci0KLSAgICAgICAgLy8gcmVtb3ZlQWxsQ2hpbGRyZW4oKSBkb2Vzbid0IGFsd2F5
cyB1bnJlZ2lzdGVyIElEcywKLSAgICAgICAgLy8gc28gdGVhciBkb3duIHNjb3BlIGluZm9ybWF0
aW9uIHVwZnJvbnQgdG8gYXZvaWQgaGF2aW5nIHN0YWxlIHJlZmVyZW5jZXMgaW4gdGhlIG1hcC4K
LSAgICAgICAgZGVzdHJveVRyZWVTY29wZURhdGEoKTsKLSAgICAgICAgcmVtb3ZlQWxsQ2hpbGRy
ZW4oKTsKLQotICAgICAgICBtX21hcmtlcnMtPmRldGFjaCgpOwotCi0gICAgICAgIG1fY3NzQ2Fu
dmFzRWxlbWVudHMuY2xlYXIoKTsKLQotI2lmIEVOQUJMRShSRVFVRVNUX0FOSU1BVElPTl9GUkFN
RSkKLSAgICAgICAgLy8gRklYTUU6IGNvbnNpZGVyIHVzaW5nIEFjdGl2ZURPTU9iamVjdC4KLSAg
ICAgICAgaWYgKG1fc2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyKQotICAgICAgICAgICAgbV9z
Y3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXItPmNsZWFyRG9jdW1lbnRQb2ludGVyKCk7Ci0gICAg
ICAgIG1fc2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyLmNsZWFyKCk7Ci0jZW5kaWYKLQotI2lm
bmRlZiBOREVCVUcKLSAgICAgICAgbV9pblJlbW92ZWRMYXN0UmVmRnVuY3Rpb24gPSBmYWxzZTsK
LSNlbmRpZgotCi0gICAgICAgIGd1YXJkRGVyZWYoKTsKLSAgICB9IGVsc2UgewotI2lmbmRlZiBO
REVCVUcgCi0gICAgICAgIG1fZGVsZXRpb25IYXNCZWd1biA9IHRydWU7IAotI2VuZGlmIAotICAg
ICAgICBkZWxldGUgdGhpczsKLSAgICB9Ci19Ci0KLUVsZW1lbnQqIERvY3VtZW50OjpnZXRFbGVt
ZW50QnlJZChjb25zdCBBdG9taWNTdHJpbmcmIGlkKSBjb25zdAotewotICAgIHJldHVybiBUcmVl
U2NvcGU6OmdldEVsZW1lbnRCeUlkKGlkKTsKIH0KIAotRWxlbWVudCogRG9jdW1lbnQ6OmdldEVs
ZW1lbnRCeUFjY2Vzc0tleShjb25zdCBTdHJpbmcmIGtleSkKK0NTU1N0eWxlU2hlZXQqIERvY3Vt
ZW50U3R5bGVTaGVldENvbGxlY3Rpb246OnBhZ2VVc2VyU2hlZXQoKQogewotICAgIGlmIChrZXku
aXNFbXB0eSgpKQorICAgIGlmIChtX3BhZ2VVc2VyU2hlZXQpCisgICAgICAgIHJldHVybiBtX3Bh
Z2VVc2VyU2hlZXQuZ2V0KCk7CisgICAgCisgICAgUGFnZSogb3duaW5nUGFnZSA9IG1fZG9jdW1l
bnQtPnBhZ2UoKTsKKyAgICBpZiAoIW93bmluZ1BhZ2UpCiAgICAgICAgIHJldHVybiAwOwotICAg
IGlmICghbV9hY2Nlc3NLZXlNYXBWYWxpZCkgewotICAgICAgICBidWlsZEFjY2Vzc0tleU1hcCh0
aGlzKTsKLSAgICAgICAgbV9hY2Nlc3NLZXlNYXBWYWxpZCA9IHRydWU7Ci0gICAgfQotICAgIHJl
dHVybiBtX2VsZW1lbnRzQnlBY2Nlc3NLZXkuZ2V0KGtleS5pbXBsKCkpOworICAgIAorICAgIFN0
cmluZyB1c2VyU2hlZXRUZXh0ID0gb3duaW5nUGFnZS0+dXNlclN0eWxlU2hlZXQoKTsKKyAgICBp
ZiAodXNlclNoZWV0VGV4dC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiAwOworICAgIAorICAg
IC8vIFBhcnNlIHRoZSBzaGVldCBhbmQgY2FjaGUgaXQuCisgICAgbV9wYWdlVXNlclNoZWV0ID0g
Q1NTU3R5bGVTaGVldDo6Y3JlYXRlSW5saW5lKG1fZG9jdW1lbnQsIG1fZG9jdW1lbnQtPnNldHRp
bmdzKCktPnVzZXJTdHlsZVNoZWV0TG9jYXRpb24oKSk7CisgICAgbV9wYWdlVXNlclNoZWV0LT5j
b250ZW50cygpLT5zZXRJc1VzZXJTdHlsZVNoZWV0KHRydWUpOworICAgIG1fcGFnZVVzZXJTaGVl
dC0+Y29udGVudHMoKS0+cGFyc2VTdHJpbmcodXNlclNoZWV0VGV4dCk7CisgICAgcmV0dXJuIG1f
cGFnZVVzZXJTaGVldC5nZXQoKTsKIH0KIAotdm9pZCBEb2N1bWVudDo6YnVpbGRBY2Nlc3NLZXlN
YXAoVHJlZVNjb3BlKiBzY29wZSkKK3ZvaWQgRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6
Y2xlYXJQYWdlVXNlclNoZWV0KCkKIHsKLSAgICBBU1NFUlQoc2NvcGUpOwotICAgIE5vZGUqIHJv
b3ROb2RlID0gc2NvcGUtPnJvb3ROb2RlKCk7Ci0gICAgZm9yIChOb2RlKiBub2RlID0gcm9vdE5v
ZGU7IG5vZGU7IG5vZGUgPSBub2RlLT50cmF2ZXJzZU5leHROb2RlKHJvb3ROb2RlKSkgewotICAg
ICAgICBpZiAoIW5vZGUtPmlzRWxlbWVudE5vZGUoKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwot
ICAgICAgICBFbGVtZW50KiBlbGVtZW50ID0gc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG5vZGUpOwot
ICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcmIGFjY2Vzc0tleSA9IGVsZW1lbnQtPmdldEF0dHJp
YnV0ZShhY2Nlc3NrZXlBdHRyKTsKLSAgICAgICAgaWYgKCFhY2Nlc3NLZXkuaXNFbXB0eSgpKQot
ICAgICAgICAgICAgbV9lbGVtZW50c0J5QWNjZXNzS2V5LnNldChhY2Nlc3NLZXkuaW1wbCgpLCBl
bGVtZW50KTsKLQotICAgICAgICBmb3IgKFNoYWRvd1Jvb3QqIHJvb3QgPSBub2RlLT55b3VuZ2Vz
dFNoYWRvd1Jvb3QoKTsgcm9vdDsgcm9vdCA9IHJvb3QtPm9sZGVyU2hhZG93Um9vdCgpKQotICAg
ICAgICAgICAgYnVpbGRBY2Nlc3NLZXlNYXAocm9vdCk7CisgICAgaWYgKG1fcGFnZVVzZXJTaGVl
dCkgeworICAgICAgICBtX3BhZ2VVc2VyU2hlZXQgPSAwOworICAgICAgICBtX2RvY3VtZW50LT5z
dHlsZVJlc29sdmVyQ2hhbmdlZChEZWZlclJlY2FsY1N0eWxlKTsKICAgICB9CiB9CiAKLXZvaWQg
RG9jdW1lbnQ6OmludmFsaWRhdGVBY2Nlc3NLZXlNYXAoKQordm9pZCBEb2N1bWVudFN0eWxlU2hl
ZXRDb2xsZWN0aW9uOjp1cGRhdGVQYWdlVXNlclNoZWV0KCkKIHsKLSAgICBtX2FjY2Vzc0tleU1h
cFZhbGlkID0gZmFsc2U7Ci0gICAgbV9lbGVtZW50c0J5QWNjZXNzS2V5LmNsZWFyKCk7Ci19Ci0K
LVNlbGVjdG9yUXVlcnlDYWNoZSogRG9jdW1lbnQ6OnNlbGVjdG9yUXVlcnlDYWNoZSgpCi17Ci0g
ICAgaWYgKCFtX3NlbGVjdG9yUXVlcnlDYWNoZSkKLSAgICAgICAgbV9zZWxlY3RvclF1ZXJ5Q2Fj
aGUgPSBhZG9wdFB0cihuZXcgU2VsZWN0b3JRdWVyeUNhY2hlKCkpOwotICAgIHJldHVybiBtX3Nl
bGVjdG9yUXVlcnlDYWNoZS5nZXQoKTsKKyAgICBjbGVhclBhZ2VVc2VyU2hlZXQoKTsKKyAgICBp
ZiAocGFnZVVzZXJTaGVldCgpKQorICAgICAgICBtX2RvY3VtZW50LT5zdHlsZVJlc29sdmVyQ2hh
bmdlZChSZWNhbGNTdHlsZUltbWVkaWF0ZWx5KTsKIH0KIAotTWVkaWFRdWVyeU1hdGNoZXIqIERv
Y3VtZW50OjptZWRpYVF1ZXJ5TWF0Y2hlcigpCitjb25zdCBWZWN0b3I8UmVmUHRyPENTU1N0eWxl
U2hlZXQ+ID4qIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OnBhZ2VHcm91cFVzZXJTaGVl
dHMoKSBjb25zdAogewotICAgIGlmICghbV9tZWRpYVF1ZXJ5TWF0Y2hlcikKLSAgICAgICAgbV9t
ZWRpYVF1ZXJ5TWF0Y2hlciA9IE1lZGlhUXVlcnlNYXRjaGVyOjpjcmVhdGUodGhpcyk7Ci0gICAg
cmV0dXJuIG1fbWVkaWFRdWVyeU1hdGNoZXIuZ2V0KCk7Ci19CisgICAgaWYgKG1fcGFnZUdyb3Vw
VXNlclNoZWV0Q2FjaGVWYWxpZCkKKyAgICAgICAgcmV0dXJuIG1fcGFnZUdyb3VwVXNlclNoZWV0
cy5nZXQoKTsKKyAgICAKKyAgICBtX3BhZ2VHcm91cFVzZXJTaGVldENhY2hlVmFsaWQgPSB0cnVl
OworICAgIAorICAgIFBhZ2UqIG93bmluZ1BhZ2UgPSBtX2RvY3VtZW50LT5wYWdlKCk7CisgICAg
aWYgKCFvd25pbmdQYWdlKQorICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgCisgICAgY29uc3Qg
UGFnZUdyb3VwJiBwYWdlR3JvdXAgPSBvd25pbmdQYWdlLT5ncm91cCgpOworICAgIGNvbnN0IFVz
ZXJTdHlsZVNoZWV0TWFwKiBzaGVldHNNYXAgPSBwYWdlR3JvdXAudXNlclN0eWxlU2hlZXRzKCk7
CisgICAgaWYgKCFzaGVldHNNYXApCisgICAgICAgIHJldHVybiAwOwogCi12b2lkIERvY3VtZW50
OjpzZXRDb21wYXRpYmlsaXR5TW9kZShDb21wYXRpYmlsaXR5TW9kZSBtb2RlKQotewotICAgIGlm
IChtX2NvbXBhdGliaWxpdHlNb2RlTG9ja2VkIHx8IG1vZGUgPT0gbV9jb21wYXRpYmlsaXR5TW9k
ZSkKLSAgICAgICAgcmV0dXJuOwotICAgIEFTU0VSVCghbV9zdHlsZVNoZWV0cy0+bGVuZ3RoKCkp
OwotICAgIGJvb2wgd2FzSW5RdWlya3NNb2RlID0gaW5RdWlya3NNb2RlKCk7Ci0gICAgbV9jb21w
YXRpYmlsaXR5TW9kZSA9IG1vZGU7Ci0gICAgc2VsZWN0b3JRdWVyeUNhY2hlKCktPmludmFsaWRh
dGUoKTsKLSAgICBpZiAoaW5RdWlya3NNb2RlKCkgIT0gd2FzSW5RdWlya3NNb2RlKSB7Ci0gICAg
ICAgIC8vIEFsbCB1c2VyIHN0eWxlc2hlZXRzIGhhdmUgdG8gcmVwYXJzZSB1c2luZyB0aGUgZGlm
ZmVyZW50IG1vZGUuCi0gICAgICAgIGNsZWFyUGFnZVVzZXJTaGVldCgpOwotICAgICAgICBjbGVh
clBhZ2VHcm91cFVzZXJTaGVldHMoKTsKKyAgICBVc2VyU3R5bGVTaGVldE1hcDo6Y29uc3RfaXRl
cmF0b3IgZW5kID0gc2hlZXRzTWFwLT5lbmQoKTsKKyAgICBmb3IgKFVzZXJTdHlsZVNoZWV0TWFw
Ojpjb25zdF9pdGVyYXRvciBpdCA9IHNoZWV0c01hcC0+YmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0
KSB7CisgICAgICAgIGNvbnN0IFVzZXJTdHlsZVNoZWV0VmVjdG9yKiBzaGVldHMgPSBpdC0+c2Vj
b25kLmdldCgpOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2hlZXRzLT5zaXpl
KCk7ICsraSkgeworICAgICAgICAgICAgY29uc3QgVXNlclN0eWxlU2hlZXQqIHNoZWV0ID0gc2hl
ZXRzLT5hdChpKS5nZXQoKTsKKyAgICAgICAgICAgIGlmIChzaGVldC0+aW5qZWN0ZWRGcmFtZXMo
KSA9PSBJbmplY3RJblRvcEZyYW1lT25seSAmJiBtX2RvY3VtZW50LT5vd25lckVsZW1lbnQoKSkK
KyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmICghVXNlckNvbnRlbnRV
UkxQYXR0ZXJuOjptYXRjaGVzUGF0dGVybnMobV9kb2N1bWVudC0+dXJsKCksIHNoZWV0LT53aGl0
ZWxpc3QoKSwgc2hlZXQtPmJsYWNrbGlzdCgpKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgICAgIFJlZlB0cjxDU1NTdHlsZVNoZWV0PiBncm91cFNoZWV0ID0gQ1NTU3R5bGVT
aGVldDo6Y3JlYXRlSW5saW5lKGNvbnN0X2Nhc3Q8RG9jdW1lbnQqPihtX2RvY3VtZW50KSwgc2hl
ZXQtPnVybCgpKTsKKyAgICAgICAgICAgIGlmICghbV9wYWdlR3JvdXBVc2VyU2hlZXRzKQorICAg
ICAgICAgICAgICAgIG1fcGFnZUdyb3VwVXNlclNoZWV0cyA9IGFkb3B0UHRyKG5ldyBWZWN0b3I8
UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4pOworICAgICAgICAgICAgbV9wYWdlR3JvdXBVc2VyU2hl
ZXRzLT5hcHBlbmQoZ3JvdXBTaGVldCk7CisgICAgICAgICAgICBncm91cFNoZWV0LT5jb250ZW50
cygpLT5zZXRJc1VzZXJTdHlsZVNoZWV0KHNoZWV0LT5sZXZlbCgpID09IFVzZXJTdHlsZVVzZXJM
ZXZlbCk7CisgICAgICAgICAgICBncm91cFNoZWV0LT5jb250ZW50cygpLT5wYXJzZVN0cmluZyhz
aGVldC0+c291cmNlKCkpOworICAgICAgICB9CiAgICAgfQotfQotCi1TdHJpbmcgRG9jdW1lbnQ6
OmNvbXBhdE1vZGUoKSBjb25zdAotewotICAgIHJldHVybiBpblF1aXJrc01vZGUoKSA/ICJCYWNr
Q29tcGF0IiA6ICJDU1MxQ29tcGF0IjsKLX0KIAotdm9pZCBEb2N1bWVudDo6cmVzZXRMaW5rQ29s
b3IoKQotewotICAgIG1fbGlua0NvbG9yID0gQ29sb3IoMCwgMCwgMjM4KTsKKyAgICByZXR1cm4g
bV9wYWdlR3JvdXBVc2VyU2hlZXRzLmdldCgpOwogfQogCi12b2lkIERvY3VtZW50OjpyZXNldFZp
c2l0ZWRMaW5rQ29sb3IoKQordm9pZCBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjpjbGVh
clBhZ2VHcm91cFVzZXJTaGVldHMoKQogewotICAgIG1fdmlzaXRlZExpbmtDb2xvciA9IENvbG9y
KDg1LCAyNiwgMTM5KTsgICAgCisgICAgbV9wYWdlR3JvdXBVc2VyU2hlZXRDYWNoZVZhbGlkID0g
ZmFsc2U7CisgICAgaWYgKG1fcGFnZUdyb3VwVXNlclNoZWV0cyAmJiBtX3BhZ2VHcm91cFVzZXJT
aGVldHMtPnNpemUoKSkgeworICAgICAgICBtX3BhZ2VHcm91cFVzZXJTaGVldHMtPmNsZWFyKCk7
CisgICAgICAgIG1fZG9jdW1lbnQtPnN0eWxlUmVzb2x2ZXJDaGFuZ2VkKERlZmVyUmVjYWxjU3R5
bGUpOworICAgIH0KIH0KIAotdm9pZCBEb2N1bWVudDo6cmVzZXRBY3RpdmVMaW5rQ29sb3IoKQor
dm9pZCBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjp1cGRhdGVQYWdlR3JvdXBVc2VyU2hl
ZXRzKCkKIHsKLSAgICBtX2FjdGl2ZUxpbmtDb2xvci5zZXROYW1lZENvbG9yKCJyZWQiKTsKKyAg
ICBjbGVhclBhZ2VHcm91cFVzZXJTaGVldHMoKTsKKyAgICBpZiAocGFnZUdyb3VwVXNlclNoZWV0
cygpICYmIHBhZ2VHcm91cFVzZXJTaGVldHMoKS0+c2l6ZSgpKQorICAgICAgICBtX2RvY3VtZW50
LT5zdHlsZVJlc29sdmVyQ2hhbmdlZChSZWNhbGNTdHlsZUltbWVkaWF0ZWx5KTsKIH0KIAotdm9p
ZCBEb2N1bWVudDo6c2V0RG9jVHlwZShQYXNzUmVmUHRyPERvY3VtZW50VHlwZT4gZG9jVHlwZSkK
K3ZvaWQgRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6YWRkVXNlclNoZWV0KFBhc3NSZWZQ
dHI8U3R5bGVTaGVldENvbnRlbnRzPiB1c2VyU2hlZXQpCiB7Ci0gICAgLy8gVGhpcyBzaG91bGQg
bmV2ZXIgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLgotICAgIEFTU0VSVCghbV9kb2NUeXBlIHx8
ICFkb2NUeXBlKTsKLSAgICBtX2RvY1R5cGUgPSBkb2NUeXBlOwotICAgIGlmIChtX2RvY1R5cGUp
IHsKLSAgICAgICAgdGhpcy0+YWRvcHRJZk5lZWRlZChtX2RvY1R5cGUuZ2V0KCkpOwotI2lmIEVO
QUJMRShMRUdBQ1lfVklFV1BPUlRfQURBUFRJT04pCi0gICAgICAgIGlmIChtX2RvY1R5cGUtPnB1
YmxpY0lkKCkuc3RhcnRzV2l0aCgiLS8vd2FwZm9ydW0vL2R0ZCB4aHRtbCBtb2JpbGUgMS4iLCAv
KiBjYXNlU2Vuc2l0aXZlICovIGZhbHNlKSkKLSAgICAgICAgICAgIHByb2Nlc3NWaWV3cG9ydCgi
d2lkdGg9ZGV2aWNlLXdpZHRoLCBoZWlnaHQ9ZGV2aWNlLWhlaWdodCIsIFZpZXdwb3J0QXJndW1l
bnRzOjpYSFRNTE1vYmlsZVByb2ZpbGUpOwotI2VuZGlmCi0gICAgfQotICAgIC8vIERvY3R5cGUg
YWZmZWN0cyB0aGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlIHN0eWxlc2hlZXRzLgotICAgIGNsZWFy
U3R5bGVSZXNvbHZlcigpOworICAgIGlmICghbV91c2VyU2hlZXRzKQorICAgICAgICBtX3VzZXJT
aGVldHMgPSBhZG9wdFB0cihuZXcgVmVjdG9yPFJlZlB0cjxDU1NTdHlsZVNoZWV0PiA+KTsKKyAg
ICBtX3VzZXJTaGVldHMtPmFwcGVuZChDU1NTdHlsZVNoZWV0OjpjcmVhdGUodXNlclNoZWV0LCBt
X2RvY3VtZW50KSk7CisgICAgbV9kb2N1bWVudC0+c3R5bGVSZXNvbHZlckNoYW5nZWQoUmVjYWxj
U3R5bGVJbW1lZGlhdGVseSk7CiB9CiAKLURPTUltcGxlbWVudGF0aW9uKiBEb2N1bWVudDo6aW1w
bGVtZW50YXRpb24oKQorLy8gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW5ldmVyIGEgdG9wLWxl
dmVsIHN0eWxlc2hlZXQgaGFzIGZpbmlzaGVkIGxvYWRpbmcuCit2b2lkIERvY3VtZW50U3R5bGVT
aGVldENvbGxlY3Rpb246OnJlbW92ZVBlbmRpbmdTaGVldChSZW1vdmVQZW5kaW5nU2hlZXROb3Rp
ZmljYXRpb25UeXBlIG5vdGlmaWNhdGlvbikKIHsKLSAgICBpZiAoIW1faW1wbGVtZW50YXRpb24p
Ci0gICAgICAgIG1faW1wbGVtZW50YXRpb24gPSBET01JbXBsZW1lbnRhdGlvbjo6Y3JlYXRlKHRo
aXMpOwotICAgIHJldHVybiBtX2ltcGxlbWVudGF0aW9uLmdldCgpOwotfQorICAgIC8vIE1ha2Ug
c3VyZSB3ZSBrbmV3IHRoaXMgc2hlZXQgd2FzIHBlbmRpbmcsIGFuZCB0aGF0IG91ciBjb3VudCBp
c24ndCBvdXQgb2Ygc3luYy4KKyAgICBBU1NFUlQobV9wZW5kaW5nU3R5bGVzaGVldHMgPiAwKTsK
IAotdm9pZCBEb2N1bWVudDo6Y2hpbGRyZW5DaGFuZ2VkKGJvb2wgY2hhbmdlZEJ5UGFyc2VyLCBO
b2RlKiBiZWZvcmVDaGFuZ2UsIE5vZGUqIGFmdGVyQ2hhbmdlLCBpbnQgY2hpbGRDb3VudERlbHRh
KQotewotICAgIENvbnRhaW5lck5vZGU6OmNoaWxkcmVuQ2hhbmdlZChjaGFuZ2VkQnlQYXJzZXIs
IGJlZm9yZUNoYW5nZSwgYWZ0ZXJDaGFuZ2UsIGNoaWxkQ291bnREZWx0YSk7CisgICAgbV9wZW5k
aW5nU3R5bGVzaGVldHMtLTsKICAgICAKLSAgICBFbGVtZW50KiBuZXdEb2N1bWVudEVsZW1lbnQg
PSBmaXJzdEVsZW1lbnRDaGlsZCh0aGlzKTsKLSAgICBpZiAobmV3RG9jdW1lbnRFbGVtZW50ID09
IG1fZG9jdW1lbnRFbGVtZW50KQorI2lmZGVmIElOU1RSVU1FTlRfTEFZT1VUX1NDSEVEVUxJTkcK
KyAgICBpZiAoIW93bmVyRWxlbWVudCgpKQorICAgICAgICBwcmludGYoIlN0eWxlc2hlZXQgbG9h
ZGVkIGF0IHRpbWUgJWQuICVkIHN0eWxlc2hlZXRzIHN0aWxsIHJlbWFpbi5cbiIsIGVsYXBzZWRU
aW1lKCksIG1fcGVuZGluZ1N0eWxlc2hlZXRzKTsKKyNlbmRpZgorCisgICAgaWYgKG1fcGVuZGlu
Z1N0eWxlc2hlZXRzKQogICAgICAgICByZXR1cm47Ci0gICAgbV9kb2N1bWVudEVsZW1lbnQgPSBu
ZXdEb2N1bWVudEVsZW1lbnQ7Ci0gICAgLy8gVGhlIHJvb3Qgc3R5bGUgdXNlZCBmb3IgbWVkaWEg
cXVlcnkgbWF0Y2hpbmcgZGVwZW5kcyBvbiB0aGUgZG9jdW1lbnQgZWxlbWVudC4KLSAgICBjbGVh
clN0eWxlUmVzb2x2ZXIoKTsKLX0KIAotUGFzc1JlZlB0cjxFbGVtZW50PiBEb2N1bWVudDo6Y3Jl
YXRlRWxlbWVudChjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUsIEV4Y2VwdGlvbkNvZGUmIGVjKQot
ewotICAgIGlmICghaXNWYWxpZE5hbWUobmFtZSkpIHsKLSAgICAgICAgZWMgPSBJTlZBTElEX0NI
QVJBQ1RFUl9FUlI7Ci0gICAgICAgIHJldHVybiAwOworICAgIGlmIChub3RpZmljYXRpb24gPT0g
UmVtb3ZlUGVuZGluZ1NoZWV0Tm90aWZ5TGF0ZXIpIHsKKyAgICAgICAgbV9kb2N1bWVudC0+c2V0
TmVlZHNOb3RpZnlSZW1vdmVBbGxQZW5kaW5nU3R5bGVzaGVldCgpOworICAgICAgICByZXR1cm47
CiAgICAgfQotCi0gICAgaWYgKG1faXNYSFRNTCkKLSAgICAgICAgcmV0dXJuIEhUTUxFbGVtZW50
RmFjdG9yeTo6Y3JlYXRlSFRNTEVsZW1lbnQoUXVhbGlmaWVkTmFtZShudWxsQXRvbSwgbmFtZSwg
eGh0bWxOYW1lc3BhY2VVUkkpLCB0aGlzLCAwLCBmYWxzZSk7Ci0KLSAgICByZXR1cm4gY3JlYXRl
RWxlbWVudChRdWFsaWZpZWROYW1lKG51bGxBdG9tLCBuYW1lLCBudWxsQXRvbSksIGZhbHNlKTsK
LX0KLQotUGFzc1JlZlB0cjxEb2N1bWVudEZyYWdtZW50PiBEb2N1bWVudDo6Y3JlYXRlRG9jdW1l
bnRGcmFnbWVudCgpCi17Ci0gICAgcmV0dXJuIERvY3VtZW50RnJhZ21lbnQ6OmNyZWF0ZShkb2N1
bWVudCgpKTsKKyAgICAKKyAgICBtX2RvY3VtZW50LT5kaWRSZW1vdmVBbGxQZW5kaW5nU3R5bGVz
aGVldCgpOwogfQogCi1QYXNzUmVmUHRyPFRleHQ+IERvY3VtZW50OjpjcmVhdGVUZXh0Tm9kZShj
b25zdCBTdHJpbmcmIGRhdGEpCit2b2lkIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OmFk
ZFN0eWxlU2hlZXRDYW5kaWRhdGVOb2RlKE5vZGUqIG5vZGUsIGJvb2wgY3JlYXRlZEJ5UGFyc2Vy
KQogewotICAgIHJldHVybiBUZXh0OjpjcmVhdGUodGhpcywgZGF0YSk7Ci19Ci0KLVBhc3NSZWZQ
dHI8Q29tbWVudD4gRG9jdW1lbnQ6OmNyZWF0ZUNvbW1lbnQoY29uc3QgU3RyaW5nJiBkYXRhKQot
ewotICAgIHJldHVybiBDb21tZW50OjpjcmVhdGUodGhpcywgZGF0YSk7Ci19Ci0KLVBhc3NSZWZQ
dHI8Q0RBVEFTZWN0aW9uPiBEb2N1bWVudDo6Y3JlYXRlQ0RBVEFTZWN0aW9uKGNvbnN0IFN0cmlu
ZyYgZGF0YSwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgaWYgKGlzSFRNTERvY3VtZW50KCkp
IHsKLSAgICAgICAgZWMgPSBOT1RfU1VQUE9SVEVEX0VSUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0g
ICAgfQotICAgIHJldHVybiBDREFUQVNlY3Rpb246OmNyZWF0ZSh0aGlzLCBkYXRhKTsKLX0KLQot
UGFzc1JlZlB0cjxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24+IERvY3VtZW50OjpjcmVhdGVQcm9jZXNz
aW5nSW5zdHJ1Y3Rpb24oY29uc3QgU3RyaW5nJiB0YXJnZXQsIGNvbnN0IFN0cmluZyYgZGF0YSwg
RXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgaWYgKCFpc1ZhbGlkTmFtZSh0YXJnZXQpKSB7Ci0g
ICAgICAgIGVjID0gSU5WQUxJRF9DSEFSQUNURVJfRVJSOwotICAgICAgICByZXR1cm4gMDsKLSAg
ICB9Ci0gICAgaWYgKGlzSFRNTERvY3VtZW50KCkpIHsKLSAgICAgICAgZWMgPSBOT1RfU1VQUE9S
VEVEX0VSUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBQcm9jZXNzaW5n
SW5zdHJ1Y3Rpb246OmNyZWF0ZSh0aGlzLCB0YXJnZXQsIGRhdGEpOwotfQotCi1QYXNzUmVmUHRy
PEVudGl0eVJlZmVyZW5jZT4gRG9jdW1lbnQ6OmNyZWF0ZUVudGl0eVJlZmVyZW5jZShjb25zdCBT
dHJpbmcmIG5hbWUsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIGlmICghaXNWYWxpZE5hbWUo
bmFtZSkpIHsKLSAgICAgICAgZWMgPSBJTlZBTElEX0NIQVJBQ1RFUl9FUlI7Ci0gICAgICAgIHJl
dHVybiAwOwotICAgIH0KLSAgICBpZiAoaXNIVE1MRG9jdW1lbnQoKSkgewotICAgICAgICBlYyA9
IE5PVF9TVVBQT1JURURfRVJSOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJu
IEVudGl0eVJlZmVyZW5jZTo6Y3JlYXRlKHRoaXMsIG5hbWUpOwotfQotCi1QYXNzUmVmUHRyPEVk
aXRpbmdUZXh0PiBEb2N1bWVudDo6Y3JlYXRlRWRpdGluZ1RleHROb2RlKGNvbnN0IFN0cmluZyYg
dGV4dCkKLXsKLSAgICByZXR1cm4gRWRpdGluZ1RleHQ6OmNyZWF0ZSh0aGlzLCB0ZXh0KTsKLX0K
LQotUGFzc1JlZlB0cjxDU1NTdHlsZURlY2xhcmF0aW9uPiBEb2N1bWVudDo6Y3JlYXRlQ1NTU3R5
bGVEZWNsYXJhdGlvbigpCi17Ci0gICAgcmV0dXJuIFN0eWxlUHJvcGVydHlTZXQ6OmNyZWF0ZSgp
LT5lbnN1cmVDU1NTdHlsZURlY2xhcmF0aW9uKCk7Ci19Ci0KLVBhc3NSZWZQdHI8Tm9kZT4gRG9j
dW1lbnQ6OmltcG9ydE5vZGUoTm9kZSogaW1wb3J0ZWROb2RlLCBib29sIGRlZXAsIEV4Y2VwdGlv
bkNvZGUmIGVjKQotewotICAgIGVjID0gMDsKLSAgICAKLSAgICBpZiAoIWltcG9ydGVkTm9kZSkg
ewotICAgICAgICBlYyA9IE5PVF9TVVBQT1JURURfRVJSOwotICAgICAgICByZXR1cm4gMDsKLSAg
ICB9Ci0KLSAgICBzd2l0Y2ggKGltcG9ydGVkTm9kZS0+bm9kZVR5cGUoKSkgewotICAgIGNhc2Ug
VEVYVF9OT0RFOgotICAgICAgICByZXR1cm4gY3JlYXRlVGV4dE5vZGUoaW1wb3J0ZWROb2RlLT5u
b2RlVmFsdWUoKSk7Ci0gICAgY2FzZSBDREFUQV9TRUNUSU9OX05PREU6Ci0gICAgICAgIHJldHVy
biBjcmVhdGVDREFUQVNlY3Rpb24oaW1wb3J0ZWROb2RlLT5ub2RlVmFsdWUoKSwgZWMpOwotICAg
IGNhc2UgRU5USVRZX1JFRkVSRU5DRV9OT0RFOgotICAgICAgICByZXR1cm4gY3JlYXRlRW50aXR5
UmVmZXJlbmNlKGltcG9ydGVkTm9kZS0+bm9kZU5hbWUoKSwgZWMpOwotICAgIGNhc2UgUFJPQ0VT
U0lOR19JTlNUUlVDVElPTl9OT0RFOgotICAgICAgICByZXR1cm4gY3JlYXRlUHJvY2Vzc2luZ0lu
c3RydWN0aW9uKGltcG9ydGVkTm9kZS0+bm9kZU5hbWUoKSwgaW1wb3J0ZWROb2RlLT5ub2RlVmFs
dWUoKSwgZWMpOwotICAgIGNhc2UgQ09NTUVOVF9OT0RFOgotICAgICAgICByZXR1cm4gY3JlYXRl
Q29tbWVudChpbXBvcnRlZE5vZGUtPm5vZGVWYWx1ZSgpKTsKLSAgICBjYXNlIEVMRU1FTlRfTk9E
RTogewotICAgICAgICBFbGVtZW50KiBvbGRFbGVtZW50ID0gc3RhdGljX2Nhc3Q8RWxlbWVudCo+
KGltcG9ydGVkTm9kZSk7Ci0gICAgICAgIC8vIEZJWE1FOiBUaGUgZm9sbG93aW5nIGNoZWNrIG1p
Z2h0IGJlIHVubmVjZXNzYXJ5LiBJcyBpdCBwb3NzaWJsZSB0aGF0Ci0gICAgICAgIC8vIG9sZEVs
ZW1lbnQgaGFzIG1pc21hdGNoZWQgcHJlZml4L25hbWVzcGFjZT8KLSAgICAgICAgaWYgKCFoYXNW
YWxpZE5hbWVzcGFjZUZvckVsZW1lbnRzKG9sZEVsZW1lbnQtPnRhZ1FOYW1lKCkpKSB7Ci0gICAg
ICAgICAgICBlYyA9IE5BTUVTUEFDRV9FUlI7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAg
ICAgfQotICAgICAgICBSZWZQdHI8RWxlbWVudD4gbmV3RWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQo
b2xkRWxlbWVudC0+dGFnUU5hbWUoKSwgZWMpOwotICAgICAgICBpZiAoZWMpCi0gICAgICAgICAg
ICByZXR1cm4gMDsKLQotICAgICAgICBuZXdFbGVtZW50LT5jbG9uZURhdGFGcm9tRWxlbWVudCgq
b2xkRWxlbWVudCk7Ci0KLSAgICAgICAgaWYgKGRlZXApIHsKLSAgICAgICAgICAgIGZvciAoTm9k
ZSogb2xkQ2hpbGQgPSBvbGRFbGVtZW50LT5maXJzdENoaWxkKCk7IG9sZENoaWxkOyBvbGRDaGls
ZCA9IG9sZENoaWxkLT5uZXh0U2libGluZygpKSB7Ci0gICAgICAgICAgICAgICAgUmVmUHRyPE5v
ZGU+IG5ld0NoaWxkID0gaW1wb3J0Tm9kZShvbGRDaGlsZCwgdHJ1ZSwgZWMpOwotICAgICAgICAg
ICAgICAgIGlmIChlYykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAg
ICAgICAgbmV3RWxlbWVudC0+YXBwZW5kQ2hpbGQobmV3Q2hpbGQucmVsZWFzZSgpLCBlYyk7Ci0g
ICAgICAgICAgICAgICAgaWYgKGVjKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAg
ICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXdFbGVtZW50LnJlbGVh
c2UoKTsKLSAgICB9Ci0gICAgY2FzZSBBVFRSSUJVVEVfTk9ERToKLSAgICAgICAgcmV0dXJuIEF0
dHI6OmNyZWF0ZSh0aGlzLCBRdWFsaWZpZWROYW1lKG51bGxBdG9tLCBzdGF0aWNfY2FzdDxBdHRy
Kj4oaW1wb3J0ZWROb2RlKS0+bmFtZSgpLCBudWxsQXRvbSksIHN0YXRpY19jYXN0PEF0dHIqPihp
bXBvcnRlZE5vZGUpLT52YWx1ZSgpKTsKLSAgICBjYXNlIERPQ1VNRU5UX0ZSQUdNRU5UX05PREU6
IHsKLSAgICAgICAgaWYgKGltcG9ydGVkTm9kZS0+aXNTaGFkb3dSb290KCkpIHsKLSAgICAgICAg
ICAgIC8vIFNoYWRvd1Jvb3Qgbm9kZXMgc2hvdWxkIG5vdCBiZSBleHBsaWNpdGx5IGltcG9ydGFi
bGUuCi0gICAgICAgICAgICAvLyBFaXRoZXIgdGhleSBhcmUgaW1wb3J0ZWQgYWxvbmcgd2l0aCB0
aGVpciBob3N0IG5vZGUsIG9yIGNyZWF0ZWQgaW1wbGljaXRseS4KLSAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICB9Ci0gICAgICAgIERvY3VtZW50RnJhZ21lbnQqIG9sZEZyYWdtZW50ID0gc3Rh
dGljX2Nhc3Q8RG9jdW1lbnRGcmFnbWVudCo+KGltcG9ydGVkTm9kZSk7Ci0gICAgICAgIFJlZlB0
cjxEb2N1bWVudEZyYWdtZW50PiBuZXdGcmFnbWVudCA9IGNyZWF0ZURvY3VtZW50RnJhZ21lbnQo
KTsKLSAgICAgICAgaWYgKGRlZXApIHsKLSAgICAgICAgICAgIGZvciAoTm9kZSogb2xkQ2hpbGQg
PSBvbGRGcmFnbWVudC0+Zmlyc3RDaGlsZCgpOyBvbGRDaGlsZDsgb2xkQ2hpbGQgPSBvbGRDaGls
ZC0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICAgICAgICAgIFJlZlB0cjxOb2RlPiBuZXdDaGls
ZCA9IGltcG9ydE5vZGUob2xkQ2hpbGQsIHRydWUsIGVjKTsKLSAgICAgICAgICAgICAgICBpZiAo
ZWMpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIG5ld0Zy
YWdtZW50LT5hcHBlbmRDaGlsZChuZXdDaGlsZC5yZWxlYXNlKCksIGVjKTsKLSAgICAgICAgICAg
ICAgICBpZiAoZWMpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAg
fQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbmV3RnJhZ21lbnQucmVsZWFz
ZSgpOwotICAgIH0KLSAgICBjYXNlIEVOVElUWV9OT0RFOgotICAgIGNhc2UgTk9UQVRJT05fTk9E
RToKLSAgICAgICAgLy8gRklYTUU6IEl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBpbXBvcnQgdGhl
c2Ugbm9kZSB0eXBlcywgaG93ZXZlciBpbiBET00zIHRoZSBEb2N1bWVudFR5cGUgaXMgcmVhZG9u
bHksIHNvIHRoZXJlIGlzbid0IG11Y2ggc2Vuc2UgaW4gZG9pbmcgdGhhdC4KLSAgICAgICAgLy8g
QWJpbGl0eSB0byBhZGQgdGhlc2UgaW1wb3J0ZWQgbm9kZXMgdG8gYSBEb2N1bWVudFR5cGUgd2ls
bCBiZSBjb25zaWRlcmVkIGZvciBhZGRpdGlvbiB0byBhIGZ1dHVyZSByZWxlYXNlIG9mIHRoZSBE
T00uCi0gICAgY2FzZSBET0NVTUVOVF9OT0RFOgotICAgIGNhc2UgRE9DVU1FTlRfVFlQRV9OT0RF
OgotICAgIGNhc2UgWFBBVEhfTkFNRVNQQUNFX05PREU6Ci0gICAgICAgIGJyZWFrOwotICAgIH0K
LSAgICBlYyA9IE5PVF9TVVBQT1JURURfRVJSOwotICAgIHJldHVybiAwOwotfQotCi0KLVBhc3NS
ZWZQdHI8Tm9kZT4gRG9jdW1lbnQ6OmFkb3B0Tm9kZShQYXNzUmVmUHRyPE5vZGU+IHNvdXJjZSwg
RXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgaWYgKCFzb3VyY2UpIHsKLSAgICAgICAgZWMgPSBO
T1RfU1VQUE9SVEVEX0VSUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKHNv
dXJjZS0+aXNSZWFkT25seU5vZGUoKSkgewotICAgICAgICBlYyA9IE5PX01PRElGSUNBVElPTl9B
TExPV0VEX0VSUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgRXZlbnRRdWV1ZVNj
b3BlIHNjb3BlOwotCi0gICAgc3dpdGNoIChzb3VyY2UtPm5vZGVUeXBlKCkpIHsKLSAgICBjYXNl
IEVOVElUWV9OT0RFOgotICAgIGNhc2UgTk9UQVRJT05fTk9ERToKLSAgICBjYXNlIERPQ1VNRU5U
X05PREU6Ci0gICAgY2FzZSBET0NVTUVOVF9UWVBFX05PREU6Ci0gICAgY2FzZSBYUEFUSF9OQU1F
U1BBQ0VfTk9ERToKLSAgICAgICAgZWMgPSBOT1RfU1VQUE9SVEVEX0VSUjsKLSAgICAgICAgcmV0
dXJuIDA7ICAgICAgICAgICAgCi0gICAgY2FzZSBBVFRSSUJVVEVfTk9ERTogeyAgICAgICAgICAg
ICAgICAgICAKLSAgICAgICAgQXR0ciogYXR0ciA9IHN0YXRpY19jYXN0PEF0dHIqPihzb3VyY2Uu
Z2V0KCkpOwotICAgICAgICBpZiAoYXR0ci0+b3duZXJFbGVtZW50KCkpCi0gICAgICAgICAgICBh
dHRyLT5vd25lckVsZW1lbnQoKS0+cmVtb3ZlQXR0cmlidXRlTm9kZShhdHRyLCBlYyk7Ci0gICAg
ICAgIGF0dHItPnNldFNwZWNpZmllZCh0cnVlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfSAgICAg
ICAKLSAgICBkZWZhdWx0OgotICAgICAgICBpZiAoc291cmNlLT5pc1NoYWRvd1Jvb3QoKSkgewot
ICAgICAgICAgICAgLy8gU2hhZG93Um9vdCBjYW5ub3QgZGlzY29ubmVjdCBpdHNlbGYgZnJvbSB0
aGUgaG9zdCBub2RlLgotICAgICAgICAgICAgZWMgPSBISUVSQVJDSFlfUkVRVUVTVF9FUlI7Ci0g
ICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEZJWE1FOiBXaGF0
IGFib3V0IDxmcmFtZT4gYW5kIDxvYmplY3Q+PwotICAgICAgICBpZiAoc291cmNlLT5oYXNUYWdO
YW1lKGlmcmFtZVRhZykpIHsKLSAgICAgICAgICAgIEhUTUxJRnJhbWVFbGVtZW50KiBpZnJhbWUg
PSBzdGF0aWNfY2FzdDxIVE1MSUZyYW1lRWxlbWVudCo+KHNvdXJjZS5nZXQoKSk7Ci0gICAgICAg
ICAgICBpZiAoZnJhbWUoKSAmJiBmcmFtZSgpLT50cmVlKCktPmlzRGVzY2VuZGFudE9mKGlmcmFt
ZS0+Y29udGVudEZyYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgZWMgPSBISUVSQVJDSFlfUkVR
VUVTVF9FUlI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgIH0KLSAgICAgICAgaWYgKHNvdXJjZS0+cGFyZW50Tm9kZSgpKQotICAgICAgICAgICAgc291
cmNlLT5wYXJlbnROb2RlKCktPnJlbW92ZUNoaWxkKHNvdXJjZS5nZXQoKSwgZWMpOwotICAgIH0K
LQotICAgIHRoaXMtPmFkb3B0SWZOZWVkZWQoc291cmNlLmdldCgpKTsKLQotICAgIHJldHVybiBz
b3VyY2U7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6Omhhc1ZhbGlkTmFtZXNwYWNlRm9yRWxlbWVudHMo
Y29uc3QgUXVhbGlmaWVkTmFtZSYgcU5hbWUpCi17Ci0gICAgLy8gVGhlc2UgY2hlY2tzIGFyZSBm
cm9tIERPTSBDb3JlIExldmVsIDIsIGNyZWF0ZUVsZW1lbnROUwotICAgIC8vIGh0dHA6Ly93d3cu
dzMub3JnL1RSL0RPTS1MZXZlbC0yLUNvcmUvY29yZS5odG1sI0lELURvY0NyRWxOUwotICAgIGlm
ICghcU5hbWUucHJlZml4KCkuaXNFbXB0eSgpICYmIHFOYW1lLm5hbWVzcGFjZVVSSSgpLmlzTnVs
bCgpKSAvLyBjcmVhdGVFbGVtZW50TlMobnVsbCwgImh0bWw6ZGl2IikKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgIGlmIChxTmFtZS5wcmVmaXgoKSA9PSB4bWxBdG9tICYmIHFOYW1lLm5hbWVz
cGFjZVVSSSgpICE9IFhNTE5hbWVzOjp4bWxOYW1lc3BhY2VVUkkpIC8vIGNyZWF0ZUVsZW1lbnRO
UygiaHR0cDovL3d3dy5leGFtcGxlLmNvbSIsICJ4bWw6bGFuZyIpCi0gICAgICAgIHJldHVybiBm
YWxzZTsKLQotICAgIC8vIFJlcXVpcmVkIGJ5IERPTSBMZXZlbCAzIENvcmUgYW5kIHVuc3BlY2lm
aWVkIGJ5IERPTSBMZXZlbCAyIENvcmU6Ci0gICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAw
NC9SRUMtRE9NLUxldmVsLTMtQ29yZS0yMDA0MDQwNy9jb3JlLmh0bWwjSUQtRG9jQ3JFbE5TCi0g
ICAgLy8gY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyIsICJm
b286YmFyIiksIGNyZWF0ZUVsZW1lbnROUyhudWxsLCAieG1sbnM6YmFyIikKLSAgICBpZiAoKHFO
YW1lLnByZWZpeCgpID09IHhtbG5zQXRvbSAmJiBxTmFtZS5uYW1lc3BhY2VVUkkoKSAhPSBYTUxO
U05hbWVzOjp4bWxuc05hbWVzcGFjZVVSSSkgfHwgKHFOYW1lLnByZWZpeCgpICE9IHhtbG5zQXRv
bSAmJiBxTmFtZS5uYW1lc3BhY2VVUkkoKSA9PSBYTUxOU05hbWVzOjp4bWxuc05hbWVzcGFjZVVS
SSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29s
IERvY3VtZW50OjpoYXNWYWxpZE5hbWVzcGFjZUZvckF0dHJpYnV0ZXMoY29uc3QgUXVhbGlmaWVk
TmFtZSYgcU5hbWUpCi17Ci0gICAgLy8gU3BlYzogRE9NIExldmVsIDIgQ29yZTogaHR0cDovL3d3
dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlLmh0bWwjSUQtRWxTZXRBdHRyTlMKLSAg
ICBpZiAocU5hbWUucHJlZml4KCkuaXNFbXB0eSgpICYmIHFOYW1lLmxvY2FsTmFtZSgpID09IHht
bG5zQXRvbSkgewotICAgICAgICAvLyBOb3RlOiBUaGUgY2FzZSBvZiBhbiAieG1sbnMiIHF1YWxp
ZmllZCBuYW1lIHdpdGggYSBuYW1lc3BhY2Ugb2YKLSAgICAgICAgLy8geG1sbnNOYW1lc3BhY2VV
UkkgaXMgc3BlY2lmaWNhbGx5IGFsbG93ZWQgKFNlZSA8aHR0cDovL3d3dy53My5vcmcvMjAwMC94
bWxucy8+KS4KLSAgICAgICAgcmV0dXJuIHFOYW1lLm5hbWVzcGFjZVVSSSgpID09IFhNTE5TTmFt
ZXM6OnhtbG5zTmFtZXNwYWNlVVJJOwotICAgIH0KLSAgICByZXR1cm4gaGFzVmFsaWROYW1lc3Bh
Y2VGb3JFbGVtZW50cyhxTmFtZSk7Ci19Ci0KLS8vIEZJWE1FOiBUaGlzIHNob3VsZCByZWFsbHkg
YmUgaW4gYSBwb3NzaWJsZSBFbGVtZW50RmFjdG9yeSBjbGFzcwotUGFzc1JlZlB0cjxFbGVtZW50
PiBEb2N1bWVudDo6Y3JlYXRlRWxlbWVudChjb25zdCBRdWFsaWZpZWROYW1lJiBxTmFtZSwgYm9v
bCBjcmVhdGVkQnlQYXJzZXIpCi17Ci0gICAgUmVmUHRyPEVsZW1lbnQ+IGU7Ci0KLSAgICAvLyBG
SVhNRTogVXNlIHJlZ2lzdGVyZWQgbmFtZXNwYWNlcyBhbmQgbG9vayB1cCBpbiBhIGhhc2ggdG8g
ZmluZCB0aGUgcmlnaHQgZmFjdG9yeS4KLSAgICBpZiAocU5hbWUubmFtZXNwYWNlVVJJKCkgPT0g
eGh0bWxOYW1lc3BhY2VVUkkpCi0gICAgICAgIGUgPSBIVE1MRWxlbWVudEZhY3Rvcnk6OmNyZWF0
ZUhUTUxFbGVtZW50KHFOYW1lLCB0aGlzLCAwLCBjcmVhdGVkQnlQYXJzZXIpOwotI2lmIEVOQUJM
RShTVkcpCi0gICAgZWxzZSBpZiAocU5hbWUubmFtZXNwYWNlVVJJKCkgPT0gU1ZHTmFtZXM6OnN2
Z05hbWVzcGFjZVVSSSkKLSAgICAgICAgZSA9IFNWR0VsZW1lbnRGYWN0b3J5OjpjcmVhdGVTVkdF
bGVtZW50KHFOYW1lLCB0aGlzLCBjcmVhdGVkQnlQYXJzZXIpOwotI2VuZGlmCi0jaWYgRU5BQkxF
KE1BVEhNTCkKLSAgICBlbHNlIGlmIChxTmFtZS5uYW1lc3BhY2VVUkkoKSA9PSBNYXRoTUxOYW1l
czo6bWF0aG1sTmFtZXNwYWNlVVJJKQotICAgICAgICBlID0gTWF0aE1MRWxlbWVudEZhY3Rvcnk6
OmNyZWF0ZU1hdGhNTEVsZW1lbnQocU5hbWUsIHRoaXMsIGNyZWF0ZWRCeVBhcnNlcik7Ci0jZW5k
aWYKLQotICAgIGlmIChlKQotICAgICAgICBtX3Nhd0VsZW1lbnRzSW5Lbm93bk5hbWVzcGFjZXMg
PSB0cnVlOwotICAgIGVsc2UKLSAgICAgICAgZSA9IEVsZW1lbnQ6OmNyZWF0ZShxTmFtZSwgZG9j
dW1lbnQoKSk7Ci0KLSAgICAvLyA8aW1hZ2U+IHVzZXMgaW1nVGFnIHNvIHdlIG5lZWQgYSBzcGVj
aWFsIHJ1bGUuCi0gICAgQVNTRVJUKChxTmFtZS5tYXRjaGVzKGltYWdlVGFnKSAmJiBlLT50YWdR
TmFtZSgpLm1hdGNoZXMoaW1nVGFnKSAmJiBlLT50YWdRTmFtZSgpLnByZWZpeCgpID09IHFOYW1l
LnByZWZpeCgpKSB8fCBxTmFtZSA9PSBlLT50YWdRTmFtZSgpKTsKLQotICAgIHJldHVybiBlLnJl
bGVhc2UoKTsKLX0KLQotYm9vbCBEb2N1bWVudDo6cmVnaW9uQmFzZWRDb2x1bW5zRW5hYmxlZCgp
IGNvbnN0Ci17Ci0gICAgcmV0dXJuIHNldHRpbmdzKCkgJiYgc2V0dGluZ3MoKS0+cmVnaW9uQmFz
ZWRDb2x1bW5zRW5hYmxlZCgpOyAKLX0KLQotYm9vbCBEb2N1bWVudDo6Y3NzU3RpY2t5UG9zaXRp
b25FbmFibGVkKCkgY29uc3QKLXsKLSAgICByZXR1cm4gc2V0dGluZ3MoKSAmJiBzZXR0aW5ncygp
LT5jc3NTdGlja3lQb3NpdGlvbkVuYWJsZWQoKTsgCi19Ci0KLWJvb2wgRG9jdW1lbnQ6OmNzc1Jl
Z2lvbnNFbmFibGVkKCkgY29uc3QKLXsKLSAgICByZXR1cm4gc2V0dGluZ3MoKSAmJiBzZXR0aW5n
cygpLT5jc3NSZWdpb25zRW5hYmxlZCgpOyAKLX0KLQotYm9vbCBEb2N1bWVudDo6Y3NzR3JpZExh
eW91dEVuYWJsZWQoKSBjb25zdAotewotICAgIHJldHVybiBzZXR0aW5ncygpICYmIHNldHRpbmdz
KCktPmNzc0dyaWRMYXlvdXRFbmFibGVkKCk7Ci19Ci0KLSNpZiBFTkFCTEUoQ1NTX1JFR0lPTlMp
Ci0KLVBhc3NSZWZQdHI8V2ViS2l0TmFtZWRGbG93PiBEb2N1bWVudDo6d2Via2l0R2V0Rmxvd0J5
TmFtZShjb25zdCBTdHJpbmcmIGZsb3dOYW1lKQotewotICAgIGlmICghY3NzUmVnaW9uc0VuYWJs
ZWQoKSB8fCAhcmVuZGVyZXIoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvLyBJdCdzIHBv
c3NpYmxlIHRvIGhhdmUgcGVuZGluZyBzdHlsZXMgbm90IGFwcGxpZWQgdGhhdCBhZmZlY3QgdGhl
IGV4aXN0aW5nIGZsb3dzLgotICAgIHVwZGF0ZVN0eWxlSWZOZWVkZWQoKTsKLQotICAgIHJldHVy
biBuYW1lZEZsb3dzKCktPmZsb3dCeU5hbWUoZmxvd05hbWUpOwotfQotCi1QYXNzUmVmUHRyPERP
TU5hbWVkRmxvd0NvbGxlY3Rpb24+IERvY3VtZW50Ojp3ZWJraXRHZXROYW1lZEZsb3dzKCkKLXsK
LSAgICBpZiAoIWNzc1JlZ2lvbnNFbmFibGVkKCkgfHwgIXJlbmRlcmVyKCkpCi0gICAgICAgIHJl
dHVybiAwOwotCi0gICAgdXBkYXRlU3R5bGVJZk5lZWRlZCgpOwotCi0gICAgcmV0dXJuIG5hbWVk
Rmxvd3MoKS0+Y3JlYXRlQ1NTT01TbmFwc2hvdCgpOwotfQotCi0jZW5kaWYKLQotTmFtZWRGbG93
Q29sbGVjdGlvbiogRG9jdW1lbnQ6Om5hbWVkRmxvd3MoKQotewotICAgIGlmICghbV9uYW1lZEZs
b3dzKQotICAgICAgICBtX25hbWVkRmxvd3MgPSBOYW1lZEZsb3dDb2xsZWN0aW9uOjpjcmVhdGUo
dGhpcyk7Ci0KLSAgICByZXR1cm4gbV9uYW1lZEZsb3dzLmdldCgpOwotfQotCi1QYXNzUmVmUHRy
PEVsZW1lbnQ+IERvY3VtZW50OjpjcmVhdGVFbGVtZW50TlMoY29uc3QgU3RyaW5nJiBuYW1lc3Bh
Y2VVUkksIGNvbnN0IFN0cmluZyYgcXVhbGlmaWVkTmFtZSwgRXhjZXB0aW9uQ29kZSYgZWMpCi17
Ci0gICAgU3RyaW5nIHByZWZpeCwgbG9jYWxOYW1lOwotICAgIGlmICghcGFyc2VRdWFsaWZpZWRO
YW1lKHF1YWxpZmllZE5hbWUsIHByZWZpeCwgbG9jYWxOYW1lLCBlYykpCi0gICAgICAgIHJldHVy
biAwOwotCi0gICAgUXVhbGlmaWVkTmFtZSBxTmFtZShwcmVmaXgsIGxvY2FsTmFtZSwgbmFtZXNw
YWNlVVJJKTsKLSAgICBpZiAoIWhhc1ZhbGlkTmFtZXNwYWNlRm9yRWxlbWVudHMocU5hbWUpKSB7
Ci0gICAgICAgIGVjID0gTkFNRVNQQUNFX0VSUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQot
Ci0gICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQocU5hbWUsIGZhbHNlKTsKLX0KLQotU3RyaW5nIERv
Y3VtZW50OjpyZWFkeVN0YXRlKCkgY29uc3QKLXsKLSAgICBERUZJTkVfU1RBVElDX0xPQ0FMKGNv
bnN0IFN0cmluZywgbG9hZGluZywgKEFTQ0lJTGl0ZXJhbCgibG9hZGluZyIpKSk7Ci0gICAgREVG
SU5FX1NUQVRJQ19MT0NBTChjb25zdCBTdHJpbmcsIGludGVyYWN0aXZlLCAoQVNDSUlMaXRlcmFs
KCJpbnRlcmFjdGl2ZSIpKSk7Ci0gICAgREVGSU5FX1NUQVRJQ19MT0NBTChjb25zdCBTdHJpbmcs
IGNvbXBsZXRlLCAoQVNDSUlMaXRlcmFsKCJjb21wbGV0ZSIpKSk7Ci0KLSAgICBzd2l0Y2ggKG1f
cmVhZHlTdGF0ZSkgewotICAgIGNhc2UgTG9hZGluZzoKLSAgICAgICAgcmV0dXJuIGxvYWRpbmc7
Ci0gICAgY2FzZSBJbnRlcmFjdGl2ZToKLSAgICAgICAgcmV0dXJuIGludGVyYWN0aXZlOwotICAg
IGNhc2UgQ29tcGxldGU6Ci0gICAgICAgIHJldHVybiBjb21wbGV0ZTsKLSAgICB9Ci0KLSAgICBB
U1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICByZXR1cm4gU3RyaW5nKCk7Ci19Ci0KLXZvaWQgRG9j
dW1lbnQ6OnNldFJlYWR5U3RhdGUoUmVhZHlTdGF0ZSByZWFkeVN0YXRlKQotewotICAgIGlmIChy
ZWFkeVN0YXRlID09IG1fcmVhZHlTdGF0ZSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgc3dpdGNo
IChyZWFkeVN0YXRlKSB7Ci0gICAgY2FzZSBMb2FkaW5nOgotICAgICAgICBpZiAoIW1fZG9jdW1l
bnRUaW1pbmcuZG9tTG9hZGluZykKLSAgICAgICAgICAgIG1fZG9jdW1lbnRUaW1pbmcuZG9tTG9h
ZGluZyA9IG1vbm90b25pY2FsbHlJbmNyZWFzaW5nVGltZSgpOwotICAgICAgICBicmVhazsKLSAg
ICBjYXNlIEludGVyYWN0aXZlOgotICAgICAgICBpZiAoIW1fZG9jdW1lbnRUaW1pbmcuZG9tSW50
ZXJhY3RpdmUpCi0gICAgICAgICAgICBtX2RvY3VtZW50VGltaW5nLmRvbUludGVyYWN0aXZlID0g
bW9ub3RvbmljYWxseUluY3JlYXNpbmdUaW1lKCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2Ug
Q29tcGxldGU6Ci0gICAgICAgIGlmICghbV9kb2N1bWVudFRpbWluZy5kb21Db21wbGV0ZSkKLSAg
ICAgICAgICAgIG1fZG9jdW1lbnRUaW1pbmcuZG9tQ29tcGxldGUgPSBtb25vdG9uaWNhbGx5SW5j
cmVhc2luZ1RpbWUoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgbV9yZWFkeVN0YXRl
ID0gcmVhZHlTdGF0ZTsKLSAgICBkaXNwYXRjaEV2ZW50KEV2ZW50OjpjcmVhdGUoZXZlbnROYW1l
cygpLnJlYWR5c3RhdGVjaGFuZ2VFdmVudCwgZmFsc2UsIGZhbHNlKSk7Ci0gICAgCi0gICAgaWYg
KHNldHRpbmdzKCkgJiYgc2V0dGluZ3MoKS0+c3VwcHJlc3Nlc0luY3JlbWVudGFsUmVuZGVyaW5n
KCkpCi0gICAgICAgIHNldFZpc3VhbFVwZGF0ZXNBbGxvd2VkKHJlYWR5U3RhdGUpOwotfQotCi12
b2lkIERvY3VtZW50OjpzZXRWaXN1YWxVcGRhdGVzQWxsb3dlZChSZWFkeVN0YXRlIHJlYWR5U3Rh
dGUpCi17Ci0gICAgQVNTRVJUKHNldHRpbmdzKCkgJiYgc2V0dGluZ3MoKS0+c3VwcHJlc3Nlc0lu
Y3JlbWVudGFsUmVuZGVyaW5nKCkpOwotICAgIHN3aXRjaCAocmVhZHlTdGF0ZSkgewotICAgIGNh
c2UgTG9hZGluZzoKLSAgICAgICAgQVNTRVJUKCFtX3Zpc3VhbFVwZGF0ZXNTdXBwcmVzc2lvblRp
bWVyLmlzQWN0aXZlKCkpOwotICAgICAgICBBU1NFUlQobV92aXN1YWxVcGRhdGVzQWxsb3dlZCk7
Ci0gICAgICAgIG1fdmlzdWFsVXBkYXRlc1N1cHByZXNzaW9uVGltZXIuc3RhcnRPbmVTaG90KHNl
dHRpbmdzKCktPmluY3JlbWVudGFsUmVuZGVyaW5nU3VwcHJlc3Npb25UaW1lb3V0SW5TZWNvbmRz
KCkpOwotICAgICAgICBzZXRWaXN1YWxVcGRhdGVzQWxsb3dlZChmYWxzZSk7Ci0gICAgICAgIGJy
ZWFrOwotICAgIGNhc2UgSW50ZXJhY3RpdmU6Ci0gICAgICAgIEFTU0VSVChtX3Zpc3VhbFVwZGF0
ZXNTdXBwcmVzc2lvblRpbWVyLmlzQWN0aXZlKCkgfHwgbV92aXN1YWxVcGRhdGVzQWxsb3dlZCk7
Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQ29tcGxldGU6Ci0gICAgICAgIGlmIChtX3Zpc3Vh
bFVwZGF0ZXNTdXBwcmVzc2lvblRpbWVyLmlzQWN0aXZlKCkpIHsKLSAgICAgICAgICAgIEFTU0VS
VCghbV92aXN1YWxVcGRhdGVzQWxsb3dlZCk7Ci0gICAgICAgICAgICBtX3Zpc3VhbFVwZGF0ZXNT
dXBwcmVzc2lvblRpbWVyLnN0b3AoKTsKLSAgICAgICAgICAgIHNldFZpc3VhbFVwZGF0ZXNBbGxv
d2VkKHRydWUpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIEFTU0VSVChtX3Zpc3VhbFVw
ZGF0ZXNBbGxvd2VkKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotICAgIAotdm9pZCBEb2N1
bWVudDo6c2V0VmlzdWFsVXBkYXRlc0FsbG93ZWQoYm9vbCB2aXN1YWxVcGRhdGVzQWxsb3dlZCkK
LXsKLSAgICBpZiAobV92aXN1YWxVcGRhdGVzQWxsb3dlZCA9PSB2aXN1YWxVcGRhdGVzQWxsb3dl
ZCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV92aXN1YWxVcGRhdGVzQWxsb3dlZCA9IHZpc3Vh
bFVwZGF0ZXNBbGxvd2VkOwotCi0gICAgaWYgKCF2aXN1YWxVcGRhdGVzQWxsb3dlZCkKLSAgICAg
ICAgcmV0dXJuOwotCi0jaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQotICAgIGlmICh2
aWV3KCkpCi0gICAgICAgIHZpZXcoKS0+dXBkYXRlQ29tcG9zaXRpbmdMYXllcnNBZnRlckxheW91
dCgpOwotI2VuZGlmCi0KLSAgICBpZiAocmVuZGVyZXIoKSkKLSAgICAgICAgcmVuZGVyZXIoKS0+
cmVwYWludCgpOwotfQotCi12b2lkIERvY3VtZW50Ojp2aXN1YWxVcGRhdGVzU3VwcHJlc3Npb25U
aW1lckZpcmVkKFRpbWVyPERvY3VtZW50PiopCi17Ci0gICAgQVNTRVJUKCFtX3Zpc3VhbFVwZGF0
ZXNBbGxvd2VkKTsKLSAgICBzZXRWaXN1YWxVcGRhdGVzQWxsb3dlZCh0cnVlKTsKLX0KLQotU3Ry
aW5nIERvY3VtZW50OjplbmNvZGluZygpIGNvbnN0Ci17Ci0gICAgaWYgKFRleHRSZXNvdXJjZURl
Y29kZXIqIGQgPSBkZWNvZGVyKCkpCi0gICAgICAgIHJldHVybiBkLT5lbmNvZGluZygpLmRvbU5h
bWUoKTsKLSAgICByZXR1cm4gU3RyaW5nKCk7Ci19Ci0KLVN0cmluZyBEb2N1bWVudDo6ZGVmYXVs
dENoYXJzZXQoKSBjb25zdAotewotICAgIGlmIChTZXR0aW5ncyogc2V0dGluZ3MgPSB0aGlzLT5z
ZXR0aW5ncygpKQotICAgICAgICByZXR1cm4gc2V0dGluZ3MtPmRlZmF1bHRUZXh0RW5jb2RpbmdO
YW1lKCk7Ci0gICAgcmV0dXJuIFN0cmluZygpOwotfQotCi12b2lkIERvY3VtZW50OjpzZXRDaGFy
c2V0KGNvbnN0IFN0cmluZyYgY2hhcnNldCkKLXsKLSAgICBpZiAoIWRlY29kZXIoKSkKLSAgICAg
ICAgcmV0dXJuOwotICAgIGRlY29kZXIoKS0+c2V0RW5jb2RpbmcoY2hhcnNldCwgVGV4dFJlc291
cmNlRGVjb2Rlcjo6VXNlckNob3NlbkVuY29kaW5nKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6c2V0
Q29udGVudExhbmd1YWdlKGNvbnN0IFN0cmluZyYgbGFuZ3VhZ2UpCi17Ci0gICAgaWYgKG1fY29u
dGVudExhbmd1YWdlID09IGxhbmd1YWdlKQotICAgICAgICByZXR1cm47Ci0gICAgbV9jb250ZW50
TGFuZ3VhZ2UgPSBsYW5ndWFnZTsKLQotICAgIC8vIFJlY2FsY3VsYXRlIHN0eWxlIHNvIGxhbmd1
YWdlIGlzIHVzZWQgd2hlbiBzZWxlY3RpbmcgdGhlIGluaXRpYWwgZm9udC4KLSAgICBzdHlsZVJl
c29sdmVyQ2hhbmdlZChEZWZlclJlY2FsY1N0eWxlKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6c2V0
WE1MVmVyc2lvbihjb25zdCBTdHJpbmcmIHZlcnNpb24sIEV4Y2VwdGlvbkNvZGUmIGVjKQotewot
ICAgIGlmICghaW1wbGVtZW50YXRpb24oKS0+aGFzRmVhdHVyZSgiWE1MIiwgU3RyaW5nKCkpKSB7
Ci0gICAgICAgIGVjID0gTk9UX1NVUFBPUlRFRF9FUlI7Ci0gICAgICAgIHJldHVybjsKLSAgICB9
Ci0KLSAgICBpZiAoIVhNTERvY3VtZW50UGFyc2VyOjpzdXBwb3J0c1hNTFZlcnNpb24odmVyc2lv
bikpIHsKLSAgICAgICAgZWMgPSBOT1RfU1VQUE9SVEVEX0VSUjsKLSAgICAgICAgcmV0dXJuOwot
ICAgIH0KLQotICAgIG1feG1sVmVyc2lvbiA9IHZlcnNpb247Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6
OnNldFhNTFN0YW5kYWxvbmUoYm9vbCBzdGFuZGFsb25lLCBFeGNlcHRpb25Db2RlJiBlYykKLXsK
LSAgICBpZiAoIWltcGxlbWVudGF0aW9uKCktPmhhc0ZlYXR1cmUoIlhNTCIsIFN0cmluZygpKSkg
ewotICAgICAgICBlYyA9IE5PVF9TVVBQT1JURURfRVJSOwotICAgICAgICByZXR1cm47Ci0gICAg
fQotCi0gICAgbV94bWxTdGFuZGFsb25lID0gc3RhbmRhbG9uZSA/IFN0YW5kYWxvbmUgOiBOb3RT
dGFuZGFsb25lOwotfQotCi12b2lkIERvY3VtZW50OjpzZXREb2N1bWVudFVSSShjb25zdCBTdHJp
bmcmIHVyaSkKLXsKLSAgICAvLyBUaGlzIHByb3BlcnR5IGlzIHJlYWQtb25seSBmcm9tIEphdmFT
Y3JpcHQsIGJ1dCB3cml0YWJsZSBmcm9tIE9iamVjdGl2ZS1DLgotICAgIG1fZG9jdW1lbnRVUkkg
PSB1cmk7Ci0gICAgdXBkYXRlQmFzZVVSTCgpOwotfQotCi1LVVJMIERvY3VtZW50OjpiYXNlVVJJ
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9iYXNlVVJMOwotfQotCi12b2lkIERvY3VtZW50Ojpz
ZXRDb250ZW50KGNvbnN0IFN0cmluZyYgY29udGVudCkKLXsKLSAgICBvcGVuKCk7Ci0gICAgbV9w
YXJzZXItPmFwcGVuZChjb250ZW50KTsKLSAgICBjbG9zZSgpOwotfQotCi1TdHJpbmcgRG9jdW1l
bnQ6OnN1Z2dlc3RlZE1JTUVUeXBlKCkgY29uc3QKLXsKLSAgICBpZiAobV9kb2N1bWVudC0+aXNY
SFRNTERvY3VtZW50KCkpCi0gICAgICAgIHJldHVybiAiYXBwbGljYXRpb24veGh0bWwreG1sIjsK
LSAgICBpZiAobV9kb2N1bWVudC0+aXNTVkdEb2N1bWVudCgpKQotICAgICAgICByZXR1cm4gImlt
YWdlL3N2Zyt4bWwiOwotICAgIGlmIChtX2RvY3VtZW50LT54bWxTdGFuZGFsb25lKCkpCi0gICAg
ICAgIHJldHVybiAidGV4dC94bWwiOwotICAgIGlmIChtX2RvY3VtZW50LT5pc0hUTUxEb2N1bWVu
dCgpKQotICAgICAgICByZXR1cm4gInRleHQvaHRtbCI7Ci0KLSAgICBpZiAoRG9jdW1lbnRMb2Fk
ZXIqIGRvY3VtZW50TG9hZGVyID0gbG9hZGVyKCkpCi0gICAgICAgIHJldHVybiBkb2N1bWVudExv
YWRlci0+cmVzcG9uc2VNSU1FVHlwZSgpOwotICAgIHJldHVybiBTdHJpbmcoKTsKLX0KLQotLy8g
RklYTUU6IFdlIG5lZWQgdG8gZGlzY3VzcyB0aGUgRE9NIEFQSSBoZXJlIGF0IHNvbWUgcG9pbnQu
IElkZWFzOgotLy8gKiBtYWtpbmcgaXQgcmVjZWl2ZSBhIHJlY3QgYXMgcGFyYW1ldGVyLCBpLmUu
IG5vZGVzRnJvbVJlY3QoeCwgeSwgdywgaCk7Ci0vLyAqIG1ha2luZyBpdCByZWNlaXZlIHRoZSBl
eHBhZGluZyBzaXplIG9mIGVhY2ggZGlyZWN0aW9uIHNlcGFyYXRlbHksCi0vLyAgIGkuZS4gbm9k
ZXNGcm9tUmVjdCh4LCB5LCB0b3BTaXplLCByaWdodFNpemUsIGJvdHRvbVNpemUsIGxlZnRTaXpl
KTsKLVBhc3NSZWZQdHI8Tm9kZUxpc3Q+IERvY3VtZW50Ojpub2Rlc0Zyb21SZWN0KGludCBjZW50
ZXJYLCBpbnQgY2VudGVyWSwgdW5zaWduZWQgdG9wUGFkZGluZywgdW5zaWduZWQgcmlnaHRQYWRk
aW5nLCB1bnNpZ25lZCBib3R0b21QYWRkaW5nLCB1bnNpZ25lZCBsZWZ0UGFkZGluZywgYm9vbCBp
Z25vcmVDbGlwcGluZywgYm9vbCBhbGxvd1NoYWRvd0NvbnRlbnQpIGNvbnN0Ci17Ci0gICAgLy8g
RklYTUU6IFNoYXJlIGNvZGUgYmV0d2VlbiB0aGlzLCBlbGVtZW50RnJvbVBvaW50IGFuZCBjYXJl
dFJhbmdlRnJvbVBvaW50LgotICAgIGlmICghcmVuZGVyZXIoKSkKLSAgICAgICAgcmV0dXJuIDA7
Ci0gICAgRnJhbWUqIGZyYW1lID0gdGhpcy0+ZnJhbWUoKTsKLSAgICBpZiAoIWZyYW1lKQotICAg
ICAgICByZXR1cm4gMDsKLSAgICBGcmFtZVZpZXcqIGZyYW1lVmlldyA9IGZyYW1lLT52aWV3KCk7
Ci0gICAgaWYgKCFmcmFtZVZpZXcpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgZmxvYXQgem9v
bUZhY3RvciA9IGZyYW1lLT5wYWdlWm9vbUZhY3RvcigpOwotICAgIExheW91dFBvaW50IHBvaW50
ID0gcm91bmRlZExheW91dFBvaW50KEZsb2F0UG9pbnQoY2VudGVyWCAqIHpvb21GYWN0b3IgKyB2
aWV3KCktPnNjcm9sbFgoKSwgY2VudGVyWSAqIHpvb21GYWN0b3IgKyB2aWV3KCktPnNjcm9sbFko
KSkpOwotCi0gICAgaW50IHR5cGUgPSBIaXRUZXN0UmVxdWVzdDo6UmVhZE9ubHkgfCBIaXRUZXN0
UmVxdWVzdDo6QWN0aXZlOwotCi0gICAgLy8gV2hlbiBpZ25vcmVDbGlwcGluZyBpcyBmYWxzZSwg
dGhpcyBtZXRob2QgcmV0dXJucyBudWxsIGZvciBjb29yZGluYXRlcyBvdXRzaWRlIG9mIHRoZSB2
aWV3cG9ydC4KLSAgICBpZiAoaWdub3JlQ2xpcHBpbmcpCi0gICAgICAgIHR5cGUgfD0gSGl0VGVz
dFJlcXVlc3Q6Oklnbm9yZUNsaXBwaW5nOwotICAgIGVsc2UgaWYgKCFmcmFtZVZpZXctPnZpc2li
bGVDb250ZW50UmVjdCgpLmludGVyc2VjdHMoSGl0VGVzdFJlc3VsdDo6cmVjdEZvclBvaW50KHBv
aW50LCB0b3BQYWRkaW5nLCByaWdodFBhZGRpbmcsIGJvdHRvbVBhZGRpbmcsIGxlZnRQYWRkaW5n
KSkpCi0gICAgICAgIHJldHVybiAwOwotICAgIGlmIChhbGxvd1NoYWRvd0NvbnRlbnQpCi0gICAg
ICAgIHR5cGUgfD0gSGl0VGVzdFJlcXVlc3Q6OkFsbG93U2hhZG93Q29udGVudDsKLQotICAgIEhp
dFRlc3RSZXF1ZXN0IHJlcXVlc3QodHlwZSk7Ci0KLSAgICAvLyBQYXNzaW5nIGEgemVybyBwYWRk
aW5nIHdpbGwgdHJpZ2dlciBhIHJlY3QgaGl0IHRlc3QsIGhvd2V2ZXIgZm9yIHRoZSBwdXJwb3Nl
cyBvZiBub2Rlc0Zyb21SZWN0LAotICAgIC8vIHdlIHNwZWNpYWwgaGFuZGxlIHRoaXMgY2FzZSBp
biBvcmRlciB0byByZXR1cm4gYSB2YWxpZCBOb2RlTGlzdC4KLSAgICBpZiAoIXRvcFBhZGRpbmcg
JiYgIXJpZ2h0UGFkZGluZyAmJiAhYm90dG9tUGFkZGluZyAmJiAhbGVmdFBhZGRpbmcpIHsKLSAg
ICAgICAgSGl0VGVzdFJlc3VsdCByZXN1bHQocG9pbnQpOwotICAgICAgICByZXR1cm4gaGFuZGxl
WmVyb1BhZGRpbmcocmVxdWVzdCwgcmVzdWx0KTsKLSAgICB9Ci0KLSAgICBIaXRUZXN0UmVzdWx0
IHJlc3VsdChwb2ludCwgdG9wUGFkZGluZywgcmlnaHRQYWRkaW5nLCBib3R0b21QYWRkaW5nLCBs
ZWZ0UGFkZGluZyk7Ci0gICAgcmVuZGVyVmlldygpLT5oaXRUZXN0KHJlcXVlc3QsIHJlc3VsdCk7
Ci0KLSAgICByZXR1cm4gU3RhdGljSGFzaFNldE5vZGVMaXN0OjphZG9wdChyZXN1bHQucmVjdEJh
c2VkVGVzdFJlc3VsdCgpKTsKLX0KLQotUGFzc1JlZlB0cjxOb2RlTGlzdD4gRG9jdW1lbnQ6Omhh
bmRsZVplcm9QYWRkaW5nKGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiByZXF1ZXN0LCBIaXRUZXN0UmVz
dWx0JiByZXN1bHQpIGNvbnN0Ci17Ci0gICAgcmVuZGVyVmlldygpLT5oaXRUZXN0KHJlcXVlc3Qs
IHJlc3VsdCk7Ci0KLSAgICBOb2RlKiBub2RlID0gcmVzdWx0LmlubmVyTm9kZSgpOwotICAgIGlm
ICghbm9kZSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBub2RlID0gbm9kZS0+c2hhZG93QW5j
ZXN0b3JOb2RlKCk7Ci0gICAgTGlzdEhhc2hTZXQ8UmVmUHRyPE5vZGU+ID4gbGlzdDsKLSAgICBs
aXN0LmFkZChub2RlKTsKLSAgICByZXR1cm4gU3RhdGljSGFzaFNldE5vZGVMaXN0OjphZG9wdChs
aXN0KTsKLX0KLQotc3RhdGljIE5vZGUqIG5vZGVGcm9tUG9pbnQoRnJhbWUqIGZyYW1lLCBSZW5k
ZXJWaWV3KiByZW5kZXJWaWV3LCBpbnQgeCwgaW50IHksIExheW91dFBvaW50KiBsb2NhbFBvaW50
ID0gMCkKLXsKLSAgICBpZiAoIWZyYW1lKQotICAgICAgICByZXR1cm4gMDsKLSAgICBGcmFtZVZp
ZXcqIGZyYW1lVmlldyA9IGZyYW1lLT52aWV3KCk7Ci0gICAgaWYgKCFmcmFtZVZpZXcpCi0gICAg
ICAgIHJldHVybiAwOwotCi0gICAgZmxvYXQgem9vbUZhY3RvciA9IGZyYW1lLT5wYWdlWm9vbUZh
Y3RvcigpOwotICAgIEludFBvaW50IHBvaW50ID0gcm91bmRlZEludFBvaW50KEZsb2F0UG9pbnQo
eCAqIHpvb21GYWN0b3IgICsgZnJhbWVWaWV3LT5zY3JvbGxYKCksIHkgKiB6b29tRmFjdG9yICsg
ZnJhbWVWaWV3LT5zY3JvbGxZKCkpKTsKLQotICAgIGlmICghZnJhbWVWaWV3LT52aXNpYmxlQ29u
dGVudFJlY3QoKS5jb250YWlucyhwb2ludCkpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgSGl0
VGVzdFJlcXVlc3QgcmVxdWVzdChIaXRUZXN0UmVxdWVzdDo6UmVhZE9ubHkgfCBIaXRUZXN0UmVx
dWVzdDo6QWN0aXZlKTsKLSAgICBIaXRUZXN0UmVzdWx0IHJlc3VsdChwb2ludCk7Ci0gICAgcmVu
ZGVyVmlldy0+aGl0VGVzdChyZXF1ZXN0LCByZXN1bHQpOwotCi0gICAgaWYgKGxvY2FsUG9pbnQp
Ci0gICAgICAgICpsb2NhbFBvaW50ID0gcmVzdWx0LmxvY2FsUG9pbnQoKTsKLQotICAgIHJldHVy
biByZXN1bHQuaW5uZXJOb2RlKCk7Ci19Ci0KLUVsZW1lbnQqIERvY3VtZW50OjplbGVtZW50RnJv
bVBvaW50KGludCB4LCBpbnQgeSkgY29uc3QKLXsKLSAgICBpZiAoIXJlbmRlcmVyKCkpCi0gICAg
ICAgIHJldHVybiAwOwotICAgIE5vZGUqIG5vZGUgPSBub2RlRnJvbVBvaW50KGZyYW1lKCksIHJl
bmRlclZpZXcoKSwgeCwgeSk7Ci0gICAgd2hpbGUgKG5vZGUgJiYgIW5vZGUtPmlzRWxlbWVudE5v
ZGUoKSkKLSAgICAgICAgbm9kZSA9IG5vZGUtPnBhcmVudE5vZGUoKTsKLSAgICBpZiAobm9kZSkK
LSAgICAgICAgbm9kZSA9IGFuY2VzdG9ySW5UaGlzU2NvcGUobm9kZSk7Ci0gICAgcmV0dXJuIHN0
YXRpY19jYXN0PEVsZW1lbnQqPihub2RlKTsKLX0KLQotUGFzc1JlZlB0cjxSYW5nZT4gRG9jdW1l
bnQ6OmNhcmV0UmFuZ2VGcm9tUG9pbnQoaW50IHgsIGludCB5KQotewotICAgIGlmICghcmVuZGVy
ZXIoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgTGF5b3V0UG9pbnQgbG9jYWxQb2ludDsKLSAg
ICBOb2RlKiBub2RlID0gbm9kZUZyb21Qb2ludChmcmFtZSgpLCByZW5kZXJWaWV3KCksIHgsIHks
ICZsb2NhbFBvaW50KTsKLSAgICBpZiAoIW5vZGUpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAg
Tm9kZSogc2hhZG93QW5jZXN0b3JOb2RlID0gYW5jZXN0b3JJblRoaXNTY29wZShub2RlKTsKLSAg
ICBpZiAoc2hhZG93QW5jZXN0b3JOb2RlICE9IG5vZGUpIHsKLSAgICAgICAgdW5zaWduZWQgb2Zm
c2V0ID0gc2hhZG93QW5jZXN0b3JOb2RlLT5ub2RlSW5kZXgoKTsKLSAgICAgICAgQ29udGFpbmVy
Tm9kZSogY29udGFpbmVyID0gc2hhZG93QW5jZXN0b3JOb2RlLT5wYXJlbnROb2RlKCk7Ci0gICAg
ICAgIHJldHVybiBSYW5nZTo6Y3JlYXRlKHRoaXMsIGNvbnRhaW5lciwgb2Zmc2V0LCBjb250YWlu
ZXIsIG9mZnNldCk7Ci0gICAgfQotCi0gICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IG5vZGUt
PnJlbmRlcmVyKCk7Ci0gICAgaWYgKCFyZW5kZXJlcikKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAg
VmlzaWJsZVBvc2l0aW9uIHZpc2libGVQb3NpdGlvbiA9IHJlbmRlcmVyLT5wb3NpdGlvbkZvclBv
aW50KGxvY2FsUG9pbnQpOwotICAgIGlmICh2aXNpYmxlUG9zaXRpb24uaXNOdWxsKCkpCi0gICAg
ICAgIHJldHVybiAwOwotCi0gICAgUG9zaXRpb24gcmFuZ2VDb21wbGlhbnRQb3NpdGlvbiA9IHZp
c2libGVQb3NpdGlvbi5kZWVwRXF1aXZhbGVudCgpLnBhcmVudEFuY2hvcmVkRXF1aXZhbGVudCgp
OwotICAgIHJldHVybiBSYW5nZTo6Y3JlYXRlKHRoaXMsIHJhbmdlQ29tcGxpYW50UG9zaXRpb24s
IHJhbmdlQ29tcGxpYW50UG9zaXRpb24pOwotfQotCi0vKgotICogUGVyZm9ybXMgdGhyZWUgb3Bl
cmF0aW9uczoKLSAqICAxLiBDb252ZXJ0IGNvbnRyb2wgY2hhcmFjdGVycyB0byBzcGFjZXMKLSAq
ICAyLiBUcmltIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlcwotICogIDMuIENvbGxhcHNlIGlu
dGVybmFsIHdoaXRlc3BhY2UuCi0gKi8KLXN0YXRpYyBpbmxpbmUgU3RyaW5nV2l0aERpcmVjdGlv
biBjYW5vbmljYWxpemVkVGl0bGUoRG9jdW1lbnQqIGRvY3VtZW50LCBjb25zdCBTdHJpbmdXaXRo
RGlyZWN0aW9uJiB0aXRsZVdpdGhEaXJlY3Rpb24pCi17Ci0gICAgY29uc3QgU3RyaW5nJiB0aXRs
ZSA9IHRpdGxlV2l0aERpcmVjdGlvbi5zdHJpbmcoKTsKLSAgICBjb25zdCBVQ2hhciogY2hhcmFj
dGVycyA9IHRpdGxlLmNoYXJhY3RlcnMoKTsKLSAgICB1bnNpZ25lZCBsZW5ndGggPSB0aXRsZS5s
ZW5ndGgoKTsKLSAgICB1bnNpZ25lZCBpOwotCi0gICAgU3RyaW5nQnVmZmVyPFVDaGFyPiBidWZm
ZXIobGVuZ3RoKTsKLSAgICB1bnNpZ25lZCBidWlsZGVySW5kZXggPSAwOwotCi0gICAgLy8gU2tp
cCBsZWFkaW5nIHNwYWNlcyBhbmQgbGVhZGluZyBjaGFyYWN0ZXJzIHRoYXQgd291bGQgY29udmVy
dCB0byBzcGFjZXMKLSAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKLSAgICAgICAg
VUNoYXIgYyA9IGNoYXJhY3RlcnNbaV07Ci0gICAgICAgIGlmICghKGMgPD0gMHgyMCB8fCBjID09
IDB4N0YpKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKGkgPT0gbGVuZ3Ro
KQotICAgICAgICByZXR1cm4gU3RyaW5nV2l0aERpcmVjdGlvbigpOwotCi0gICAgLy8gUmVwbGFj
ZSBjb250cm9sIGNoYXJhY3RlcnMgd2l0aCBzcGFjZXMsIGFuZCBiYWNrc2xhc2hlcyB3aXRoIGN1
cnJlbmN5IHN5bWJvbHMsIGFuZCBjb2xsYXBzZSB3aGl0ZXNwYWNlLgotICAgIGJvb2wgcHJldmlv
dXNDaGFyV2FzV1MgPSBmYWxzZTsKLSAgICBmb3IgKDsgaSA8IGxlbmd0aDsgKytpKSB7Ci0gICAg
ICAgIFVDaGFyIGMgPSBjaGFyYWN0ZXJzW2ldOwotICAgICAgICBpZiAoYyA8PSAweDIwIHx8IGMg
PT0gMHg3RiB8fCAoV1RGOjpVbmljb2RlOjpjYXRlZ29yeShjKSAmIChXVEY6OlVuaWNvZGU6OlNl
cGFyYXRvcl9MaW5lIHwgV1RGOjpVbmljb2RlOjpTZXBhcmF0b3JfUGFyYWdyYXBoKSkpIHsKLSAg
ICAgICAgICAgIGlmIChwcmV2aW91c0NoYXJXYXNXUykKLSAgICAgICAgICAgICAgICBjb250aW51
ZTsKLSAgICAgICAgICAgIGJ1ZmZlcltidWlsZGVySW5kZXgrK10gPSAnICc7Ci0gICAgICAgICAg
ICBwcmV2aW91c0NoYXJXYXNXUyA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAg
ICBidWZmZXJbYnVpbGRlckluZGV4KytdID0gYzsKLSAgICAgICAgICAgIHByZXZpb3VzQ2hhcldh
c1dTID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBTdHJpcCB0cmFpbGluZyBz
cGFjZXMKLSAgICB3aGlsZSAoYnVpbGRlckluZGV4ID4gMCkgewotICAgICAgICAtLWJ1aWxkZXJJ
bmRleDsKLSAgICAgICAgaWYgKGJ1ZmZlcltidWlsZGVySW5kZXhdICE9ICcgJykKLSAgICAgICAg
ICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmICghYnVpbGRlckluZGV4ICYmIGJ1ZmZlcltidWls
ZGVySW5kZXhdID09ICcgJykKLSAgICAgICAgcmV0dXJuIFN0cmluZ1dpdGhEaXJlY3Rpb24oKTsK
LQotICAgIGJ1ZmZlci5zaHJpbmsoYnVpbGRlckluZGV4ICsgMSk7Ci0KLSAgICAvLyBSZXBsYWNl
IHRoZSBiYWNrc2xhc2hlcyB3aXRoIGN1cnJlbmN5IHN5bWJvbHMgaWYgdGhlIGVuY29kaW5nIHJl
cXVpcmVzIGl0LgotICAgIGRvY3VtZW50LT5kaXNwbGF5QnVmZmVyTW9kaWZpZWRCeUVuY29kaW5n
KGJ1ZmZlci5jaGFyYWN0ZXJzKCksIGJ1ZmZlci5sZW5ndGgoKSk7Ci0gICAgCi0gICAgcmV0dXJu
IFN0cmluZ1dpdGhEaXJlY3Rpb24oU3RyaW5nOjphZG9wdChidWZmZXIpLCB0aXRsZVdpdGhEaXJl
Y3Rpb24uZGlyZWN0aW9uKCkpOwotfQotCi12b2lkIERvY3VtZW50Ojp1cGRhdGVUaXRsZShjb25z
dCBTdHJpbmdXaXRoRGlyZWN0aW9uJiB0aXRsZSkKLXsKLSAgICBpZiAobV9yYXdUaXRsZSA9PSB0
aXRsZSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9yYXdUaXRsZSA9IHRpdGxlOwotICAgIG1f
dGl0bGUgPSBjYW5vbmljYWxpemVkVGl0bGUodGhpcywgbV9yYXdUaXRsZSk7Ci0gICAgaWYgKEZy
YW1lKiBmID0gZnJhbWUoKSkKLSAgICAgICAgZi0+bG9hZGVyKCktPnNldFRpdGxlKG1fdGl0bGUp
OwotfQotCi12b2lkIERvY3VtZW50OjpzZXRUaXRsZShjb25zdCBTdHJpbmcmIHRpdGxlKQotewot
ICAgIC8vIFRpdGxlIHNldCBieSBKYXZhU2NyaXB0IC0tIG92ZXJyaWRlcyBhbnkgdGl0bGUgZWxl
bWVudHMuCi0gICAgbV90aXRsZVNldEV4cGxpY2l0bHkgPSB0cnVlOwotICAgIGlmICghaXNIVE1M
RG9jdW1lbnQoKSAmJiAhaXNYSFRNTERvY3VtZW50KCkpCi0gICAgICAgIG1fdGl0bGVFbGVtZW50
ID0gMDsKLSAgICBlbHNlIGlmICghbV90aXRsZUVsZW1lbnQpIHsKLSAgICAgICAgaWYgKEhUTUxF
bGVtZW50KiBoZWFkRWxlbWVudCA9IGhlYWQoKSkgewotICAgICAgICAgICAgbV90aXRsZUVsZW1l
bnQgPSBjcmVhdGVFbGVtZW50KHRpdGxlVGFnLCBmYWxzZSk7Ci0gICAgICAgICAgICBFeGNlcHRp
b25Db2RlIGVjID0gMDsKLSAgICAgICAgICAgIGhlYWRFbGVtZW50LT5hcHBlbmRDaGlsZChtX3Rp
dGxlRWxlbWVudCwgZWMpOwotICAgICAgICAgICAgQVNTRVJUKCFlYyk7Ci0gICAgICAgIH0KLSAg
ICB9Ci0KLSAgICAvLyBUaGUgRE9NIEFQSSBoYXMgbm8gbWV0aG9kIG9mIHNwZWNpZnlpbmcgZGly
ZWN0aW9uLCBzbyBhc3N1bWUgTFRSLgotICAgIHVwZGF0ZVRpdGxlKFN0cmluZ1dpdGhEaXJlY3Rp
b24odGl0bGUsIExUUikpOwotCi0gICAgaWYgKG1fdGl0bGVFbGVtZW50KSB7Ci0gICAgICAgIEFT
U0VSVChtX3RpdGxlRWxlbWVudC0+aGFzVGFnTmFtZSh0aXRsZVRhZykpOwotICAgICAgICBpZiAo
bV90aXRsZUVsZW1lbnQtPmhhc1RhZ05hbWUodGl0bGVUYWcpKQotICAgICAgICAgICAgc3RhdGlj
X2Nhc3Q8SFRNTFRpdGxlRWxlbWVudCo+KG1fdGl0bGVFbGVtZW50LmdldCgpKS0+c2V0VGV4dCh0
aXRsZSk7Ci0gICAgfQotfQotCi12b2lkIERvY3VtZW50OjpzZXRUaXRsZUVsZW1lbnQoY29uc3Qg
U3RyaW5nV2l0aERpcmVjdGlvbiYgdGl0bGUsIEVsZW1lbnQqIHRpdGxlRWxlbWVudCkKLXsKLSAg
ICBpZiAodGl0bGVFbGVtZW50ICE9IG1fdGl0bGVFbGVtZW50KSB7Ci0gICAgICAgIGlmIChtX3Rp
dGxlRWxlbWVudCB8fCBtX3RpdGxlU2V0RXhwbGljaXRseSkKLSAgICAgICAgICAgIC8vIE9ubHkg
YWxsb3cgdGhlIGZpcnN0IHRpdGxlIGVsZW1lbnQgdG8gY2hhbmdlIHRoZSB0aXRsZSAtLSBvdGhl
cnMgaGF2ZSBubyBlZmZlY3QuCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIG1fdGl0bGVF
bGVtZW50ID0gdGl0bGVFbGVtZW50OwotICAgIH0KLQotICAgIHVwZGF0ZVRpdGxlKHRpdGxlKTsK
LX0KLQotdm9pZCBEb2N1bWVudDo6cmVtb3ZlVGl0bGUoRWxlbWVudCogdGl0bGVFbGVtZW50KQot
ewotICAgIGlmIChtX3RpdGxlRWxlbWVudCAhPSB0aXRsZUVsZW1lbnQpCi0gICAgICAgIHJldHVy
bjsKLQotICAgIG1fdGl0bGVFbGVtZW50ID0gMDsKLSAgICBtX3RpdGxlU2V0RXhwbGljaXRseSA9
IGZhbHNlOwotCi0gICAgLy8gVXBkYXRlIHRpdGxlIGJhc2VkIG9uIGZpcnN0IHRpdGxlIGVsZW1l
bnQgaW4gdGhlIGhlYWQsIGlmIG9uZSBleGlzdHMuCi0gICAgaWYgKEhUTUxFbGVtZW50KiBoZWFk
RWxlbWVudCA9IGhlYWQoKSkgewotICAgICAgICBmb3IgKE5vZGUqIGUgPSBoZWFkRWxlbWVudC0+
Zmlyc3RDaGlsZCgpOyBlOyBlID0gZS0+bmV4dFNpYmxpbmcoKSkKLSAgICAgICAgICAgIGlmIChl
LT5oYXNUYWdOYW1lKHRpdGxlVGFnKSkgewotICAgICAgICAgICAgICAgIEhUTUxUaXRsZUVsZW1l
bnQqIHRpdGxlRWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxUaXRsZUVsZW1lbnQqPihlKTsKLSAg
ICAgICAgICAgICAgICBzZXRUaXRsZUVsZW1lbnQodGl0bGVFbGVtZW50LT50ZXh0V2l0aERpcmVj
dGlvbigpLCB0aXRsZUVsZW1lbnQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAg
ICAgfQotICAgIH0KLQotICAgIGlmICghbV90aXRsZUVsZW1lbnQpCi0gICAgICAgIHVwZGF0ZVRp
dGxlKFN0cmluZ1dpdGhEaXJlY3Rpb24oKSk7Ci19Ci0KLSNpZiBFTkFCTEUoUEFHRV9WSVNJQklM
SVRZX0FQSSkKLVBhZ2VWaXNpYmlsaXR5U3RhdGUgRG9jdW1lbnQ6OnZpc2liaWxpdHlTdGF0ZSgp
IGNvbnN0Ci17Ci0gICAgLy8gVGhlIHZpc2liaWxpdHkgb2YgdGhlIGRvY3VtZW50IGlzIGluaGVy
aXRlZCBmcm9tIHRoZSB2aXNpYmlsaXR5IG9mIHRoZQotICAgIC8vIHBhZ2UuIElmIHRoZXJlIGlz
IG5vIHBhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBkb2N1bWVudCwgd2Ugd2lsbCBhc3N1bWUKLSAg
ICAvLyB0aGF0IHRoZSBwYWdlIGlzIHZpc2libGUgaS5lLiBpbnZpc2liaWxpdHkgaGFzIHRvIGJl
IGV4cGxpY2l0bHkKLSAgICAvLyBzcGVjaWZpZWQgYnkgdGhlIGVtYmVkZGVyLgotICAgIGlmICgh
bV9mcmFtZSB8fCAhbV9mcmFtZS0+cGFnZSgpKQotICAgICAgICByZXR1cm4gUGFnZVZpc2liaWxp
dHlTdGF0ZVZpc2libGU7Ci0gICAgcmV0dXJuIG1fZnJhbWUtPnBhZ2UoKS0+dmlzaWJpbGl0eVN0
YXRlKCk7Ci19Ci0KLVN0cmluZyBEb2N1bWVudDo6d2Via2l0VmlzaWJpbGl0eVN0YXRlKCkgY29u
c3QKLXsKLSAgICByZXR1cm4gcGFnZVZpc2liaWxpdHlTdGF0ZVN0cmluZyh2aXNpYmlsaXR5U3Rh
dGUoKSk7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6OndlYmtpdEhpZGRlbigpIGNvbnN0Ci17Ci0gICAg
cmV0dXJuIHZpc2liaWxpdHlTdGF0ZSgpICE9IFBhZ2VWaXNpYmlsaXR5U3RhdGVWaXNpYmxlOwot
fQotCi12b2lkIERvY3VtZW50OjpkaXNwYXRjaFZpc2liaWxpdHlTdGF0ZUNoYW5nZUV2ZW50KCkK
LXsKLSAgICBkaXNwYXRjaEV2ZW50KEV2ZW50OjpjcmVhdGUoZXZlbnROYW1lcygpLndlYmtpdHZp
c2liaWxpdHljaGFuZ2VFdmVudCwgZmFsc2UsIGZhbHNlKSk7Ci19Ci0jZW5kaWYKLQotI2lmIEVO
QUJMRShDU1BfTkVYVCkKLURPTVNlY3VyaXR5UG9saWN5KiBEb2N1bWVudDo6c2VjdXJpdHlQb2xp
Y3koKQotewotICAgIGlmICghbV9kb21TZWN1cml0eVBvbGljeSkKLSAgICAgICAgbV9kb21TZWN1
cml0eVBvbGljeSA9IERPTVNlY3VyaXR5UG9saWN5OjpjcmVhdGUodGhpcyk7Ci0gICAgcmV0dXJu
IG1fZG9tU2VjdXJpdHlQb2xpY3kuZ2V0KCk7Ci19Ci0jZW5kaWYKLQotU3RyaW5nIERvY3VtZW50
Ojpub2RlTmFtZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICIjZG9jdW1lbnQiOwotfQotCi1Ob2Rl
OjpOb2RlVHlwZSBEb2N1bWVudDo6bm9kZVR5cGUoKSBjb25zdAotewotICAgIHJldHVybiBET0NV
TUVOVF9OT0RFOwotfQotCi1Gb3JtQ29udHJvbGxlciogRG9jdW1lbnQ6OmZvcm1Db250cm9sbGVy
KCkKLXsKLSAgICBpZiAoIW1fZm9ybUNvbnRyb2xsZXIpCi0gICAgICAgIG1fZm9ybUNvbnRyb2xs
ZXIgPSBGb3JtQ29udHJvbGxlcjo6Y3JlYXRlKCk7Ci0gICAgcmV0dXJuIG1fZm9ybUNvbnRyb2xs
ZXIuZ2V0KCk7Ci19Ci0KLVZlY3RvcjxTdHJpbmc+IERvY3VtZW50Ojpmb3JtRWxlbWVudHNTdGF0
ZSgpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX2Zvcm1Db250cm9sbGVyKQotICAgICAgICByZXR1cm4g
VmVjdG9yPFN0cmluZz4oKTsKLSAgICByZXR1cm4gbV9mb3JtQ29udHJvbGxlci0+Zm9ybUVsZW1l
bnRzU3RhdGUoKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6c2V0U3RhdGVGb3JOZXdGb3JtRWxlbWVu
dHMoY29uc3QgVmVjdG9yPFN0cmluZz4mIHN0YXRlVmVjdG9yKQotewotICAgIGlmICghc3RhdGVW
ZWN0b3Iuc2l6ZSgpICYmICFtX2Zvcm1Db250cm9sbGVyKQotICAgICAgICByZXR1cm47Ci0gICAg
Zm9ybUNvbnRyb2xsZXIoKS0+c2V0U3RhdGVGb3JOZXdGb3JtRWxlbWVudHMoc3RhdGVWZWN0b3Ip
OwotfQotCi1GcmFtZVZpZXcqIERvY3VtZW50Ojp2aWV3KCkgY29uc3QKLXsKLSAgICByZXR1cm4g
bV9mcmFtZSA/IG1fZnJhbWUtPnZpZXcoKSA6IDA7Ci19Ci0KLVBhZ2UqIERvY3VtZW50OjpwYWdl
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9mcmFtZSA/IG1fZnJhbWUtPnBhZ2UoKSA6IDA7ICAg
IAotfQotCi1TZXR0aW5ncyogRG9jdW1lbnQ6OnNldHRpbmdzKCkgY29uc3QKLXsKLSAgICByZXR1
cm4gbV9mcmFtZSA/IG1fZnJhbWUtPnNldHRpbmdzKCkgOiAwOwotfQotCi1QYXNzUmVmUHRyPFJh
bmdlPiBEb2N1bWVudDo6Y3JlYXRlUmFuZ2UoKQotewotICAgIHJldHVybiBSYW5nZTo6Y3JlYXRl
KHRoaXMpOwotfQotCi1QYXNzUmVmUHRyPE5vZGVJdGVyYXRvcj4gRG9jdW1lbnQ6OmNyZWF0ZU5v
ZGVJdGVyYXRvcihOb2RlKiByb290LCB1bnNpZ25lZCB3aGF0VG9TaG93LCAKLSAgICBQYXNzUmVm
UHRyPE5vZGVGaWx0ZXI+IGZpbHRlciwgYm9vbCBleHBhbmRFbnRpdHlSZWZlcmVuY2VzLCBFeGNl
cHRpb25Db2RlJiBlYykKLXsKLSAgICBpZiAoIXJvb3QpIHsKLSAgICAgICAgZWMgPSBOT1RfU1VQ
UE9SVEVEX0VSUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBOb2RlSXRl
cmF0b3I6OmNyZWF0ZShyb290LCB3aGF0VG9TaG93LCBmaWx0ZXIsIGV4cGFuZEVudGl0eVJlZmVy
ZW5jZXMpOwotfQotCi1QYXNzUmVmUHRyPFRyZWVXYWxrZXI+IERvY3VtZW50OjpjcmVhdGVUcmVl
V2Fsa2VyKE5vZGUqIHJvb3QsIHVuc2lnbmVkIHdoYXRUb1Nob3csIAotICAgIFBhc3NSZWZQdHI8
Tm9kZUZpbHRlcj4gZmlsdGVyLCBib29sIGV4cGFuZEVudGl0eVJlZmVyZW5jZXMsIEV4Y2VwdGlv
bkNvZGUmIGVjKQotewotICAgIGlmICghcm9vdCkgewotICAgICAgICBlYyA9IE5PVF9TVVBQT1JU
RURfRVJSOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIFRyZWVXYWxrZXI6
OmNyZWF0ZShyb290LCB3aGF0VG9TaG93LCBmaWx0ZXIsIGV4cGFuZEVudGl0eVJlZmVyZW5jZXMp
OwotfQotCi12b2lkIERvY3VtZW50OjpzY2hlZHVsZUZvcmNlZFN0eWxlUmVjYWxjKCkKLXsKLSAg
ICBtX3BlbmRpbmdTdHlsZVJlY2FsY1Nob3VsZEZvcmNlID0gdHJ1ZTsKLSAgICBzY2hlZHVsZVN0
eWxlUmVjYWxjKCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnNjaGVkdWxlU3R5bGVSZWNhbGMoKQot
ewotICAgIGlmIChzaG91bGREaXNwbGF5U2VhbWxlc3NseVdpdGhQYXJlbnQoKSkgewotICAgICAg
ICAvLyBXaGVuIHdlJ3JlIHNlYW1sZXNzLCBvdXIgcGFyZW50IGRvY3VtZW50IG1hbmFnZXMgb3Vy
IHN0eWxlIHJlY2FsY3MuCi0gICAgICAgIG93bmVyRWxlbWVudCgpLT5zZXROZWVkc1N0eWxlUmVj
YWxjKCk7Ci0gICAgICAgIG93bmVyRWxlbWVudCgpLT5kb2N1bWVudCgpLT5zY2hlZHVsZVN0eWxl
UmVjYWxjKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobV9zdHlsZVJlY2Fs
Y1RpbWVyLmlzQWN0aXZlKCkgfHwgaW5QYWdlQ2FjaGUoKSkKLSAgICAgICAgcmV0dXJuOwotCi0g
ICAgQVNTRVJUKGNoaWxkTmVlZHNTdHlsZVJlY2FsYygpIHx8IG1fcGVuZGluZ1N0eWxlUmVjYWxj
U2hvdWxkRm9yY2UpOwotCi0gICAgaWYgKCFkb2N1bWVudHNUaGF0TmVlZFN0eWxlUmVjYWxjKQot
ICAgICAgICBkb2N1bWVudHNUaGF0TmVlZFN0eWxlUmVjYWxjID0gbmV3IEhhc2hTZXQ8RG9jdW1l
bnQqPjsKLSAgICBkb2N1bWVudHNUaGF0TmVlZFN0eWxlUmVjYWxjLT5hZGQodGhpcyk7Ci0gICAg
Ci0gICAgLy8gRklYTUU6IFdoeSBvbiBlYXJ0aCBpcyB0aGlzIGhlcmU/IFRoaXMgaXMgY2xlYXJs
eSBtaXNwbGFjZWQuCi0gICAgaW52YWxpZGF0ZUFjY2Vzc0tleU1hcCgpOwotICAgIAotICAgIG1f
c3R5bGVSZWNhbGNUaW1lci5zdGFydE9uZVNob3QoMCk7Ci0KLSAgICBJbnNwZWN0b3JJbnN0cnVt
ZW50YXRpb246OmRpZFNjaGVkdWxlU3R5bGVSZWNhbGN1bGF0aW9uKHRoaXMpOwotfQotCi12b2lk
IERvY3VtZW50Ojp1bnNjaGVkdWxlU3R5bGVSZWNhbGMoKQotewotICAgIEFTU0VSVCghY2hpbGRO
ZWVkc1N0eWxlUmVjYWxjKCkpOwotCi0gICAgaWYgKGRvY3VtZW50c1RoYXROZWVkU3R5bGVSZWNh
bGMpCi0gICAgICAgIGRvY3VtZW50c1RoYXROZWVkU3R5bGVSZWNhbGMtPnJlbW92ZSh0aGlzKTsK
LQotICAgIG1fc3R5bGVSZWNhbGNUaW1lci5zdG9wKCk7Ci0gICAgbV9wZW5kaW5nU3R5bGVSZWNh
bGNTaG91bGRGb3JjZSA9IGZhbHNlOwotfQotCi1ib29sIERvY3VtZW50Ojppc1BlbmRpbmdTdHls
ZVJlY2FsYygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fc3R5bGVSZWNhbGNUaW1lci5pc0FjdGl2
ZSgpICYmICFtX2luU3R5bGVSZWNhbGM7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnN0eWxlUmVjYWxj
VGltZXJGaXJlZChUaW1lcjxEb2N1bWVudD4qKQotewotICAgIHVwZGF0ZVN0eWxlSWZOZWVkZWQo
KTsKLX0KLQotYm9vbCBEb2N1bWVudDo6Y2hpbGROZWVkc0FuZE5vdEluU3R5bGVSZWNhbGMoKQot
ewotICAgIHJldHVybiBjaGlsZE5lZWRzU3R5bGVSZWNhbGMoKSAmJiAhbV9pblN0eWxlUmVjYWxj
OwotfQotCi12b2lkIERvY3VtZW50OjpyZWNhbGNTdHlsZShTdHlsZUNoYW5nZSBjaGFuZ2UpCi17
Ci0gICAgLy8gd2Ugc2hvdWxkIG5vdCBlbnRlciBzdHlsZSByZWNhbGMgd2hpbGUgcGFpbnRpbmcK
LSAgICBBU1NFUlQoIXZpZXcoKSB8fCAhdmlldygpLT5pc1BhaW50aW5nKCkpOwotICAgIGlmICh2
aWV3KCkgJiYgdmlldygpLT5pc1BhaW50aW5nKCkpCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAg
ICBpZiAobV9pblN0eWxlUmVjYWxjKQotICAgICAgICByZXR1cm47IC8vIEd1YXJkIGFnYWluc3Qg
cmUtZW50cmFuY3kuIC1kd2gKLQotICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgdXBkYXRlIHN0eWxl
IG9uIG91ciBhbmNlc3RvciBjaGFpbiBiZWZvcmUgcHJvY2VlZGluZyAoZXNwZWNpYWxseSBmb3Ig
c2VhbWxlc3MpLAotICAgIC8vIGhvd2V2ZXIgZG9pbmcgc28gY3VycmVudGx5IGNhdXNlcyBzZXZl
cmFsIHRlc3RzIHRvIGNyYXNoLCBhcyBGcmFtZTo6c2V0RG9jdW1lbnQgY2FsbHMgRG9jdW1lbnQ6
OmF0dGFjaAotICAgIC8vIGJlZm9yZSBzZXR0aW5nIHRoZSBET01XaW5kb3cgb24gdGhlIEZyYW1l
LCBvciB0aGUgU2VjdXJpdHlPcmlnaW4gb24gdGhlIGRvY3VtZW50LiBUaGUgYXR0YWNoLCBpbiB0
dXJuCi0gICAgLy8gcmVzb2x2ZXMgc3R5bGUgKGhlcmUpIGFuZCB0aGVuIHdoZW4gd2UgcmVzb2x2
ZSBzdHlsZSBvbiB0aGUgcGFyZW50IGNoYWluLCB3ZSBtYXkgZW5kIHVwCi0gICAgLy8gcmUtYXR0
YWNoaW5nIG91ciBjb250YWluaW5nIGlmcmFtZSwgd2hpY2ggd2hlbiBhc2tlZCBIVE1MRnJhbWVF
bGVtZW50QmFzZTo6aXNVUkxBbGxvd2VkCi0gICAgLy8gaGl0cyBhIG51bGwtZGVyZWZlcmVuY2Ug
ZHVlIHRvIHNlY3VyaXR5IGNvZGUgYWx3YXlzIGFzc3VtaW5nIHRoZSBkb2N1bWVudCBoYXMgYSBT
ZWN1cml0eU9yaWdpbi4KLQotICAgIGlmIChtX2hhc0RpcnR5U3R5bGVSZXNvbHZlcikKLSAgICAg
ICAgdXBkYXRlQWN0aXZlU3R5bGVzaGVldHMoUmVjYWxjU3R5bGVJbW1lZGlhdGVseSk7Ci0KLSAg
ICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUgY29va2llID0gSW5zcGVjdG9ySW5zdHJ1
bWVudGF0aW9uOjp3aWxsUmVjYWxjdWxhdGVTdHlsZSh0aGlzKTsKLQotICAgIGlmIChtX2VsZW1T
aGVldCAmJiBtX2VsZW1TaGVldC0+Y29udGVudHMoKS0+dXNlc1JlbVVuaXRzKCkpCi0gICAgICAg
IG1fdXNlc1JlbVVuaXRzID0gdHJ1ZTsKLQotICAgIG1faW5TdHlsZVJlY2FsYyA9IHRydWU7Ci0g
ICAgc3VzcGVuZFBvc3RBdHRhY2hDYWxsYmFja3MoKTsKLSAgICBSZW5kZXJXaWRnZXQ6OnN1c3Bl
bmRXaWRnZXRIaWVyYXJjaHlVcGRhdGVzKCk7Ci0gICAgCi0gICAgUmVmUHRyPEZyYW1lVmlldz4g
ZnJhbWVWaWV3ID0gdmlldygpOwotICAgIGlmIChmcmFtZVZpZXcpIHsKLSAgICAgICAgZnJhbWVW
aWV3LT5wYXVzZVNjaGVkdWxlZEV2ZW50cygpOwotICAgICAgICBmcmFtZVZpZXctPmJlZ2luRGVm
ZXJyZWRSZXBhaW50cygpOwotICAgIH0KLQotICAgIEFTU0VSVCghcmVuZGVyZXIoKSB8fCByZW5k
ZXJBcmVuYSgpKTsKLSAgICBpZiAoIXJlbmRlcmVyKCkgfHwgIXJlbmRlckFyZW5hKCkpCi0gICAg
ICAgIGdvdG8gYmFpbF9vdXQ7Ci0KLSAgICBpZiAobV9wZW5kaW5nU3R5bGVSZWNhbGNTaG91bGRG
b3JjZSkKLSAgICAgICAgY2hhbmdlID0gRm9yY2U7Ci0KLSAgICAvLyBSZWNhbGN1bGF0aW5nIHRo
ZSByb290IHN0eWxlIChvbiB0aGUgZG9jdW1lbnQpIGlzIG5vdCBuZWVkZWQgaW4gdGhlIGNvbW1v
biBjYXNlLgotICAgIGlmICgoY2hhbmdlID09IEZvcmNlKSB8fCAoc2hvdWxkRGlzcGxheVNlYW1s
ZXNzbHlXaXRoUGFyZW50KCkgJiYgKGNoYW5nZSA+PSBJbmhlcml0KSkpIHsKLSAgICAgICAgLy8g
c3R5bGUgc2VsZWN0b3IgbWF5IHNldCB0aGlzIGFnYWluIGR1cmluZyByZWNhbGMKLSAgICAgICAg
bV9oYXNOb2Rlc1dpdGhQbGFjZWhvbGRlclN0eWxlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAg
ICBSZWZQdHI8UmVuZGVyU3R5bGU+IGRvY3VtZW50U3R5bGUgPSBTdHlsZVJlc29sdmVyOjpzdHls
ZUZvckRvY3VtZW50KHRoaXMsIG1fc3R5bGVSZXNvbHZlciA/IG1fc3R5bGVSZXNvbHZlci0+Zm9u
dFNlbGVjdG9yKCkgOiAwKTsKLSAgICAgICAgU3R5bGVDaGFuZ2UgY2ggPSBOb2RlOjpkaWZmKGRv
Y3VtZW50U3R5bGUuZ2V0KCksIHJlbmRlcmVyKCktPnN0eWxlKCksIHRoaXMpOwotICAgICAgICBp
ZiAoY2ggIT0gTm9DaGFuZ2UpCi0gICAgICAgICAgICByZW5kZXJlcigpLT5zZXRTdHlsZShkb2N1
bWVudFN0eWxlLnJlbGVhc2UoKSk7Ci0gICAgfQotCi0gICAgZm9yIChOb2RlKiBuID0gZmlyc3RD
aGlsZCgpOyBuOyBuID0gbi0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICBpZiAoIW4tPmlzRWxl
bWVudE5vZGUoKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBFbGVtZW50KiBlbGVt
ZW50ID0gc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG4pOwotICAgICAgICBpZiAoY2hhbmdlID49IElu
aGVyaXQgfHwgZWxlbWVudC0+Y2hpbGROZWVkc1N0eWxlUmVjYWxjKCkgfHwgZWxlbWVudC0+bmVl
ZHNTdHlsZVJlY2FsYygpKQotICAgICAgICAgICAgZWxlbWVudC0+cmVjYWxjU3R5bGUoY2hhbmdl
KTsKLSAgICB9Ci0KLSNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCi0gICAgaWYgKHZp
ZXcoKSkgewotICAgICAgICBib29sIGxheW91dFBlbmRpbmcgPSB2aWV3KCktPmxheW91dFBlbmRp
bmcoKSB8fCByZW5kZXJlcigpLT5uZWVkc0xheW91dCgpOwotICAgICAgICAvLyBJZiB3ZSBkaWRu
J3QgdXBkYXRlIGNvbXBvc2l0aW5nIGxheWVycyBiZWNhdXNlIG9mIGxheW91dCgpLCB3ZSBuZWVk
IHRvIGRvIHNvIGhlcmUuCi0gICAgICAgIGlmICghbGF5b3V0UGVuZGluZykKLSAgICAgICAgICAg
IHZpZXcoKS0+dXBkYXRlQ29tcG9zaXRpbmdMYXllcnNBZnRlclN0eWxlQ2hhbmdlKCk7Ci0gICAg
fQotI2VuZGlmCi0KLWJhaWxfb3V0OgotICAgIGNsZWFyTmVlZHNTdHlsZVJlY2FsYygpOwotICAg
IGNsZWFyQ2hpbGROZWVkc1N0eWxlUmVjYWxjKCk7Ci0gICAgdW5zY2hlZHVsZVN0eWxlUmVjYWxj
KCk7Ci0KLSAgICBtX2luU3R5bGVSZWNhbGMgPSBmYWxzZTsKLSAgICAKLSAgICAvLyBQc2V1ZG8g
ZWxlbWVudCByZW1vdmFsIGFuZCBzaW1pbGFyIG1heSBvbmx5IHdvcmsgd2l0aCB0aGVzZSBmbGFn
cyBzdGlsbCBzZXQuIFJlc2V0IHRoZW0gYWZ0ZXIgdGhlIHN0eWxlIHJlY2FsYy4KLSAgICBpZiAo
bV9zdHlsZVJlc29sdmVyKQotICAgICAgICByZXNldENTU0ZlYXR1cmVGbGFncygpOwotCi0gICAg
aWYgKGZyYW1lVmlldykgewotICAgICAgICBmcmFtZVZpZXctPnJlc3VtZVNjaGVkdWxlZEV2ZW50
cygpOwotICAgICAgICBmcmFtZVZpZXctPmVuZERlZmVycmVkUmVwYWludHMoKTsKLSAgICB9Ci0g
ICAgUmVuZGVyV2lkZ2V0OjpyZXN1bWVXaWRnZXRIaWVyYXJjaHlVcGRhdGVzKCk7Ci0gICAgcmVz
dW1lUG9zdEF0dGFjaENhbGxiYWNrcygpOwotCi0gICAgLy8gSWYgd2Ugd2FudGVkIHRvIGNhbGwg
aW1wbGljaXRDbG9zZSgpIGR1cmluZyByZWNhbGNTdHlsZSwgZG8gc28gbm93IHRoYXQgd2UncmUg
ZmluaXNoZWQuCi0gICAgaWYgKG1fY2xvc2VBZnRlclN0eWxlUmVjYWxjKSB7Ci0gICAgICAgIG1f
Y2xvc2VBZnRlclN0eWxlUmVjYWxjID0gZmFsc2U7Ci0gICAgICAgIGltcGxpY2l0Q2xvc2UoKTsK
LSAgICB9Ci0KLSAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZFJlY2FsY3VsYXRlU3R5
bGUoY29va2llKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6dXBkYXRlU3R5bGVJZk5lZWRlZCgpCi17
Ci0gICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKLSAgICBBU1NFUlQoIXZpZXcoKSB8fCAoIXZp
ZXcoKS0+aXNJbkxheW91dCgpICYmICF2aWV3KCktPmlzUGFpbnRpbmcoKSkpOwotICAgIAotICAg
IGlmICgoIW1fcGVuZGluZ1N0eWxlUmVjYWxjU2hvdWxkRm9yY2UgJiYgIWNoaWxkTmVlZHNTdHls
ZVJlY2FsYygpKSB8fCBpblBhZ2VDYWNoZSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBBbmlt
YXRpb25VcGRhdGVCbG9jayBhbmltYXRpb25VcGRhdGVCbG9jayhtX2ZyYW1lID8gbV9mcmFtZS0+
YW5pbWF0aW9uKCkgOiAwKTsKLSAgICByZWNhbGNTdHlsZShOb0NoYW5nZSk7Ci19Ci0KLXZvaWQg
RG9jdW1lbnQ6OnVwZGF0ZVN0eWxlRm9yQWxsRG9jdW1lbnRzKCkKLXsKLSAgICBBU1NFUlQoaXNN
YWluVGhyZWFkKCkpOwotICAgIGlmICghZG9jdW1lbnRzVGhhdE5lZWRTdHlsZVJlY2FsYykKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgd2hpbGUgKGRvY3VtZW50c1RoYXROZWVkU3R5bGVSZWNhbGMt
PnNpemUoKSkgewotICAgICAgICBIYXNoU2V0PERvY3VtZW50Kj46Oml0ZXJhdG9yIGl0ID0gZG9j
dW1lbnRzVGhhdE5lZWRTdHlsZVJlY2FsYy0+YmVnaW4oKTsKLSAgICAgICAgRG9jdW1lbnQqIGRv
YyA9ICppdDsKLSAgICAgICAgZG9jdW1lbnRzVGhhdE5lZWRTdHlsZVJlY2FsYy0+cmVtb3ZlKGRv
Yyk7Ci0gICAgICAgIGRvYy0+dXBkYXRlU3R5bGVJZk5lZWRlZCgpOwotICAgIH0KLX0KLQotdm9p
ZCBEb2N1bWVudDo6dXBkYXRlTGF5b3V0KCkKLXsKLSAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkp
OwotICAgIGlmIChFbGVtZW50KiBvZSA9IG93bmVyRWxlbWVudCgpKQotICAgICAgICBvZS0+ZG9j
dW1lbnQoKS0+dXBkYXRlTGF5b3V0KCk7Ci0KLSAgICB1cGRhdGVTdHlsZUlmTmVlZGVkKCk7Ci0K
LSAgICAvLyBPbmx5IGRvIGEgbGF5b3V0IGlmIGNoYW5nZXMgaGF2ZSBvY2N1cnJlZCB0aGF0IG1h
a2UgaXQgbmVjZXNzYXJ5LiAgICAgIAotICAgIEZyYW1lVmlldyogdiA9IHZpZXcoKTsKLSAgICBp
ZiAodiAmJiByZW5kZXJlcigpICYmICh2LT5sYXlvdXRQZW5kaW5nKCkgfHwgcmVuZGVyZXIoKS0+
bmVlZHNMYXlvdXQoKSkpCi0gICAgICAgIHYtPmxheW91dCgpOwotfQotCi0vLyBGSVhNRTogVGhp
cyBpcyBhIGJhZCBpZGVhIGFuZCBuZWVkcyB0byBiZSByZW1vdmVkIGV2ZW50dWFsbHkuCi0vLyBP
dGhlciBicm93c2VycyBsb2FkIHN0eWxlc2hlZXRzIGJlZm9yZSB0aGV5IGNvbnRpbnVlIHBhcnNp
bmcgdGhlIHdlYiBwYWdlLgotLy8gU2luY2Ugd2UgZG9uJ3QsIHdlIGNhbiBydW4gSmF2YVNjcmlw
dCBjb2RlIHRoYXQgbmVlZHMgYW5zd2VycyBiZWZvcmUgdGhlCi0vLyBzdHlsZXNoZWV0cyBhcmUg
bG9hZGVkLiBEb2luZyBhIGxheW91dCBpZ25vcmluZyB0aGUgcGVuZGluZyBzdHlsZXNoZWV0cwot
Ly8gbGV0cyB1cyBnZXQgcmVhc29uYWJsZSBhbnN3ZXJzLiBUaGUgbG9uZyB0ZXJtIHNvbHV0aW9u
IHRvIHRoaXMgcHJvYmxlbSBpcwotLy8gdG8gaW5zdGVhZCBzdXNwZW5kIEphdmFTY3JpcHQgZXhl
Y3V0aW9uLgotdm9pZCBEb2N1bWVudDo6dXBkYXRlTGF5b3V0SWdub3JlUGVuZGluZ1N0eWxlc2hl
ZXRzKCkKLXsKLSAgICBib29sIG9sZElnbm9yZSA9IG1faWdub3JlUGVuZGluZ1N0eWxlc2hlZXRz
OwotICAgIAotICAgIGlmICghaGF2ZVN0eWxlc2hlZXRzTG9hZGVkKCkpIHsKLSAgICAgICAgbV9p
Z25vcmVQZW5kaW5nU3R5bGVzaGVldHMgPSB0cnVlOwotICAgICAgICAvLyBGSVhNRTogV2UgYXJl
IHdpbGxpbmcgdG8gYXR0ZW1wdCB0byBzdXBwcmVzcyBwYWludGluZyB3aXRoIG91dGRhdGVkIHN0
eWxlIGluZm8gb25seSBvbmNlLiAgT3VyIGFzc3VtcHRpb24gaXMgdGhhdCBpdCB3b3VsZCBiZQot
ICAgICAgICAvLyBkYW5nZXJvdXMgdG8gdHJ5IHRvIHN0b3AgaXQgYSBzZWNvbmQgdGltZSwgYWZ0
ZXIgcGFnZSBjb250ZW50IGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkIGFuZCBkaXNwbGF5ZWQKLSAg
ICAgICAgLy8gd2l0aCBhY2N1cmF0ZSBzdHlsZSBpbmZvcm1hdGlvbi4gIChPdXIgc3VwcHJlc3Np
b24gaW52b2x2ZXMgYmxhbmtpbmcgdGhlIHdob2xlIHBhZ2UgYXQgdGhlCi0gICAgICAgIC8vIG1v
bWVudC4gIElmIGl0IHdlcmUgbW9yZSByZWZpbmVkLCB3ZSBtaWdodCBiZSBhYmxlIHRvIGRvIHNv
bWV0aGluZyBiZXR0ZXIuKQotICAgICAgICAvLyBJdCdzIHdvcnRoIG5vdGluZyB0aG91Z2ggdGhh
dCB0aGlzIGVudGlyZSBtZXRob2QgaXMgYSBoYWNrLCBzaW5jZSB3aGF0IHdlIHJlYWxseSB3YW50
IHRvIGRvIGlzCi0gICAgICAgIC8vIHN1c3BlbmQgSlMgaW5zdGVhZCBvZiBkb2luZyBhIGxheW91
dCB3aXRoIGluYWNjdXJhdGUgaW5mb3JtYXRpb24uCi0gICAgICAgIEhUTUxFbGVtZW50KiBib2R5
RWxlbWVudCA9IGJvZHkoKTsKLSAgICAgICAgaWYgKGJvZHlFbGVtZW50ICYmICFib2R5RWxlbWVu
dC0+cmVuZGVyZXIoKSAmJiBtX3BlbmRpbmdTaGVldExheW91dCA9PSBOb0xheW91dFdpdGhQZW5k
aW5nU2hlZXRzKSB7Ci0gICAgICAgICAgICBtX3BlbmRpbmdTaGVldExheW91dCA9IERpZExheW91
dFdpdGhQZW5kaW5nU2hlZXRzOwotICAgICAgICAgICAgc3R5bGVSZXNvbHZlckNoYW5nZWQoUmVj
YWxjU3R5bGVJbW1lZGlhdGVseSk7Ci0gICAgICAgIH0gZWxzZSBpZiAobV9oYXNOb2Rlc1dpdGhQ
bGFjZWhvbGRlclN0eWxlKQotICAgICAgICAgICAgLy8gSWYgbmV3IG5vZGVzIGhhdmUgYmVlbiBh
ZGRlZCBvciBzdHlsZSByZWNhbGMgaGFzIGJlZW4gZG9uZSB3aXRoIHN0eWxlIHNoZWV0cyBzdGls
bCBwZW5kaW5nLCBzb21lIG5vZGVzIAotICAgICAgICAgICAgLy8gbWF5IG5vdCBoYXZlIGhhZCB0
aGVpciByZWFsIHN0eWxlIGNhbGN1bGF0ZWQgeWV0LiBOb3JtYWxseSB0aGlzIGdldHMgY2xlYW5l
ZCB3aGVuIHN0eWxlIHNoZWV0cyBhcnJpdmUgCi0gICAgICAgICAgICAvLyBidXQgaGVyZSB3ZSBu
ZWVkIHVwLXRvLWRhdGUgc3R5bGUgaW1tZWRpYXRlbHkuCi0gICAgICAgICAgICByZWNhbGNTdHls
ZShGb3JjZSk7Ci0gICAgfQotCi0gICAgdXBkYXRlTGF5b3V0KCk7Ci0KLSAgICBtX2lnbm9yZVBl
bmRpbmdTdHlsZXNoZWV0cyA9IG9sZElnbm9yZTsKLX0KLQotUGFzc1JlZlB0cjxSZW5kZXJTdHls
ZT4gRG9jdW1lbnQ6OnN0eWxlRm9yRWxlbWVudElnbm9yaW5nUGVuZGluZ1N0eWxlc2hlZXRzKEVs
ZW1lbnQqIGVsZW1lbnQpCi17Ci0gICAgQVNTRVJUX0FSRyhlbGVtZW50LCBlbGVtZW50LT5kb2N1
bWVudCgpID09IHRoaXMpOwotCi0gICAgYm9vbCBvbGRJZ25vcmUgPSBtX2lnbm9yZVBlbmRpbmdT
dHlsZXNoZWV0czsKLSAgICBtX2lnbm9yZVBlbmRpbmdTdHlsZXNoZWV0cyA9IHRydWU7Ci0gICAg
UmVmUHRyPFJlbmRlclN0eWxlPiBzdHlsZSA9IHN0eWxlUmVzb2x2ZXIoKS0+c3R5bGVGb3JFbGVt
ZW50KGVsZW1lbnQsIGVsZW1lbnQtPnBhcmVudE5vZGUoKSA/IGVsZW1lbnQtPnBhcmVudE5vZGUo
KS0+Y29tcHV0ZWRTdHlsZSgpIDogMCk7Ci0gICAgbV9pZ25vcmVQZW5kaW5nU3R5bGVzaGVldHMg
PSBvbGRJZ25vcmU7Ci0gICAgcmV0dXJuIHN0eWxlLnJlbGVhc2UoKTsKLX0KLQotUGFzc1JlZlB0
cjxSZW5kZXJTdHlsZT4gRG9jdW1lbnQ6OnN0eWxlRm9yUGFnZShpbnQgcGFnZUluZGV4KQotewot
ICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gc3R5bGUgPSBzdHlsZVJlc29sdmVyKCktPnN0eWxlRm9y
UGFnZShwYWdlSW5kZXgpOwotICAgIHJldHVybiBzdHlsZS5yZWxlYXNlKCk7Ci19Ci0KLXZvaWQg
RG9jdW1lbnQ6OnJlZ2lzdGVyQ3VzdG9tRm9udChQYXNzT3duUHRyPEZvbnREYXRhPiBmb250RGF0
YSkKLXsKLSAgICBtX2N1c3RvbUZvbnRzLmFwcGVuZChmb250RGF0YSk7Ci19Ci0KLXZvaWQgRG9j
dW1lbnQ6OmRlbGV0ZUN1c3RvbUZvbnRzKCkKLXsKLSAgICBzaXplX3Qgc2l6ZSA9IG1fY3VzdG9t
Rm9udHMuc2l6ZSgpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKQotICAg
ICAgICBHbHlwaFBhZ2VUcmVlTm9kZTo6cHJ1bmVUcmVlQ3VzdG9tRm9udERhdGEobV9jdXN0b21G
b250c1tpXS5nZXQoKSk7Ci0KLSAgICBtX2N1c3RvbUZvbnRzLmNsZWFyKCk7Ci19Ci0KLWJvb2wg
RG9jdW1lbnQ6OmlzUGFnZUJveFZpc2libGUoaW50IHBhZ2VJbmRleCkKLXsKLSAgICBSZWZQdHI8
UmVuZGVyU3R5bGU+IHN0eWxlID0gc3R5bGVGb3JQYWdlKHBhZ2VJbmRleCk7Ci0gICAgcmV0dXJu
IHN0eWxlLT52aXNpYmlsaXR5KCkgIT0gSElEREVOOyAvLyBkaXNwbGF5IHByb3BlcnR5IGRvZXNu
J3QgYXBwbHkgdG8gQHBhZ2UuCi19Ci0KLXZvaWQgRG9jdW1lbnQ6OnBhZ2VTaXplQW5kTWFyZ2lu
c0luUGl4ZWxzKGludCBwYWdlSW5kZXgsIEludFNpemUmIHBhZ2VTaXplLCBpbnQmIG1hcmdpblRv
cCwgaW50JiBtYXJnaW5SaWdodCwgaW50JiBtYXJnaW5Cb3R0b20sIGludCYgbWFyZ2luTGVmdCkK
LXsKLSAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IHN0eWxlID0gc3R5bGVGb3JQYWdlKHBhZ2VJbmRl
eCk7Ci0gICAgUmVuZGVyVmlldyogdmlldyA9IHJlbmRlclZpZXcoKTsKLQotICAgIGludCB3aWR0
aCA9IHBhZ2VTaXplLndpZHRoKCk7Ci0gICAgaW50IGhlaWdodCA9IHBhZ2VTaXplLmhlaWdodCgp
OwotICAgIHN3aXRjaCAoc3R5bGUtPnBhZ2VTaXplVHlwZSgpKSB7Ci0gICAgY2FzZSBQQUdFX1NJ
WkVfQVVUTzoKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQQUdFX1NJWkVfQVVUT19MQU5EU0NB
UEU6Ci0gICAgICAgIGlmICh3aWR0aCA8IGhlaWdodCkKLSAgICAgICAgICAgIHN0ZDo6c3dhcCh3
aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQQUdFX1NJWkVfQVVUT19Q
T1JUUkFJVDoKLSAgICAgICAgaWYgKHdpZHRoID4gaGVpZ2h0KQotICAgICAgICAgICAgc3RkOjpz
d2FwKHdpZHRoLCBoZWlnaHQpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFBBR0VfU0laRV9S
RVNPTFZFRDogewotICAgICAgICBMZW5ndGhTaXplIHNpemUgPSBzdHlsZS0+cGFnZVNpemUoKTsK
LSAgICAgICAgQVNTRVJUKHNpemUud2lkdGgoKS5pc0ZpeGVkKCkpOwotICAgICAgICBBU1NFUlQo
c2l6ZS5oZWlnaHQoKS5pc0ZpeGVkKCkpOwotICAgICAgICB3aWR0aCA9IHZhbHVlRm9yTGVuZ3Ro
KHNpemUud2lkdGgoKSwgMCwgdmlldyk7Ci0gICAgICAgIGhlaWdodCA9IHZhbHVlRm9yTGVuZ3Ro
KHNpemUuaGVpZ2h0KCksIDAsIHZpZXcpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgZGVm
YXVsdDoKLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgfQotICAgIHBhZ2VTaXpl
ID0gSW50U2l6ZSh3aWR0aCwgaGVpZ2h0KTsKLQotICAgIC8vIFRoZSBwZXJjZW50YWdlIGlzIGNh
bGN1bGF0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSB3aWR0aCBldmVuIGZvciBtYXJnaW4gdG9wIGFu
ZCBib3R0b20uCi0gICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvQ1NTMi9ib3guaHRtbCNtYXJn
aW4tcHJvcGVydGllcwotICAgIG1hcmdpblRvcCA9IHN0eWxlLT5tYXJnaW5Ub3AoKS5pc0F1dG8o
KSA/IG1hcmdpblRvcCA6IGludFZhbHVlRm9yTGVuZ3RoKHN0eWxlLT5tYXJnaW5Ub3AoKSwgd2lk
dGgsIHZpZXcpOwotICAgIG1hcmdpblJpZ2h0ID0gc3R5bGUtPm1hcmdpblJpZ2h0KCkuaXNBdXRv
KCkgPyBtYXJnaW5SaWdodCA6IGludFZhbHVlRm9yTGVuZ3RoKHN0eWxlLT5tYXJnaW5SaWdodCgp
LCB3aWR0aCwgdmlldyk7Ci0gICAgbWFyZ2luQm90dG9tID0gc3R5bGUtPm1hcmdpbkJvdHRvbSgp
LmlzQXV0bygpID8gbWFyZ2luQm90dG9tIDogaW50VmFsdWVGb3JMZW5ndGgoc3R5bGUtPm1hcmdp
bkJvdHRvbSgpLCB3aWR0aCwgdmlldyk7Ci0gICAgbWFyZ2luTGVmdCA9IHN0eWxlLT5tYXJnaW5M
ZWZ0KCkuaXNBdXRvKCkgPyBtYXJnaW5MZWZ0IDogaW50VmFsdWVGb3JMZW5ndGgoc3R5bGUtPm1h
cmdpbkxlZnQoKSwgd2lkdGgsIHZpZXcpOwotfQotCi12b2lkIERvY3VtZW50OjpzZXREb2N1bWVu
dFJhcmVEYXRhKE5vZGVSYXJlRGF0YSogcmFyZURhdGEpCi17Ci0gICAgbV9kb2N1bWVudFJhcmVE
YXRhID0gcmFyZURhdGE7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnNldElzVmlld1NvdXJjZShib29s
IGlzVmlld1NvdXJjZSkKLXsKLSAgICBtX2lzVmlld1NvdXJjZSA9IGlzVmlld1NvdXJjZTsKLSAg
ICBpZiAoIW1faXNWaWV3U291cmNlKQotICAgICAgICByZXR1cm47Ci0KLSAgICBzZXRTZWN1cml0
eU9yaWdpbihTZWN1cml0eU9yaWdpbjo6Y3JlYXRlVW5pcXVlKCkpOwotICAgIGRpZFVwZGF0ZVNl
Y3VyaXR5T3JpZ2luKCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmNvbWJpbmVDU1NGZWF0dXJlRmxh
Z3MoKQotewotICAgIC8vIERlbGF5IHJlc2V0dGluZyB0aGUgZmxhZ3MgdW50aWwgYWZ0ZXIgbmV4
dCBzdHlsZSByZWNhbGMgc2luY2UgdW5hcHBseWluZyB0aGUgc3R5bGUgbWF5IG5vdCB3b3JrIHdp
dGhvdXQgdGhlc2Ugc2V0ICh0aGlzIGlzIHRydWUgYXQgbGVhc3Qgd2l0aCBiZWZvcmUvYWZ0ZXIp
LgotICAgIG1fdXNlc1NpYmxpbmdSdWxlcyA9IG1fdXNlc1NpYmxpbmdSdWxlcyB8fCBtX3N0eWxl
UmVzb2x2ZXItPnVzZXNTaWJsaW5nUnVsZXMoKTsKLSAgICBtX3VzZXNGaXJzdExpbmVSdWxlcyA9
IG1fdXNlc0ZpcnN0TGluZVJ1bGVzIHx8IG1fc3R5bGVSZXNvbHZlci0+dXNlc0ZpcnN0TGluZVJ1
bGVzKCk7Ci0gICAgbV91c2VzQmVmb3JlQWZ0ZXJSdWxlcyA9IG1fdXNlc0JlZm9yZUFmdGVyUnVs
ZXMgfHwgbV9zdHlsZVJlc29sdmVyLT51c2VzQmVmb3JlQWZ0ZXJSdWxlcygpOwotICAgIG1fdXNl
c0xpbmtSdWxlcyA9IG1fdXNlc0xpbmtSdWxlcyB8fCBtX3N0eWxlUmVzb2x2ZXItPnVzZXNMaW5r
UnVsZXMoKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6cmVzZXRDU1NGZWF0dXJlRmxhZ3MoKQotewot
ICAgIG1fdXNlc1NpYmxpbmdSdWxlcyA9IG1fc3R5bGVSZXNvbHZlci0+dXNlc1NpYmxpbmdSdWxl
cygpOwotICAgIG1fdXNlc0ZpcnN0TGluZVJ1bGVzID0gbV9zdHlsZVJlc29sdmVyLT51c2VzRmly
c3RMaW5lUnVsZXMoKTsKLSAgICBtX3VzZXNCZWZvcmVBZnRlclJ1bGVzID0gbV9zdHlsZVJlc29s
dmVyLT51c2VzQmVmb3JlQWZ0ZXJSdWxlcygpOwotICAgIG1fdXNlc0xpbmtSdWxlcyA9IG1fc3R5
bGVSZXNvbHZlci0+dXNlc0xpbmtSdWxlcygpOwotfQotCi12b2lkIERvY3VtZW50OjpjcmVhdGVT
dHlsZVJlc29sdmVyKCkKLXsKLSAgICBib29sIG1hdGNoQXV0aG9yQW5kVXNlclN0eWxlcyA9IHRy
dWU7Ci0gICAgaWYgKFNldHRpbmdzKiBkb2NTZXR0aW5ncyA9IHNldHRpbmdzKCkpCi0gICAgICAg
IG1hdGNoQXV0aG9yQW5kVXNlclN0eWxlcyA9IGRvY1NldHRpbmdzLT5hdXRob3JBbmRVc2VyU3R5
bGVzRW5hYmxlZCgpOwotICAgIG1fc3R5bGVSZXNvbHZlciA9IGFkb3B0UHRyKG5ldyBTdHlsZVJl
c29sdmVyKHRoaXMsIG1hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykpOwotICAgIGNvbWJpbmVDU1NG
ZWF0dXJlRmxhZ3MoKTsKLX0KLQotaW5saW5lIHZvaWQgRG9jdW1lbnQ6OmNsZWFyU3R5bGVSZXNv
bHZlcigpCi17Ci0gICAgbV9zdHlsZVJlc29sdmVyLmNsZWFyKCk7Ci19Ci0KLXZvaWQgRG9jdW1l
bnQ6OmF0dGFjaCgpCi17Ci0gICAgQVNTRVJUKCFhdHRhY2hlZCgpKTsKLSAgICBBU1NFUlQoIW1f
aW5QYWdlQ2FjaGUpOwotICAgIEFTU0VSVCghbV9heE9iamVjdENhY2hlIHx8IHRoaXMgIT0gdG9w
RG9jdW1lbnQoKSk7Ci0KLSAgICBpZiAoIW1fcmVuZGVyQXJlbmEpCi0gICAgICAgIG1fcmVuZGVy
QXJlbmEgPSBhZG9wdFB0cihuZXcgUmVuZGVyQXJlbmEpOwotICAgIAotICAgIC8vIENyZWF0ZSB0
aGUgcmVuZGVyaW5nIHRyZWUKLSAgICBzZXRSZW5kZXJlcihuZXcgKG1fcmVuZGVyQXJlbmEuZ2V0
KCkpIFJlbmRlclZpZXcodGhpcywgdmlldygpKSk7Ci0jaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBP
U0lUSU5HKQotICAgIHJlbmRlclZpZXcoKS0+ZGlkTW92ZU9uc2NyZWVuKCk7Ci0jZW5kaWYKLQot
ICAgIHJlY2FsY1N0eWxlKEZvcmNlKTsKLQotICAgIFJlbmRlck9iamVjdCogcmVuZGVyID0gcmVu
ZGVyZXIoKTsKLSAgICBzZXRSZW5kZXJlcigwKTsKLQotICAgIENvbnRhaW5lck5vZGU6OmF0dGFj
aCgpOwotCi0gICAgc2V0UmVuZGVyZXIocmVuZGVyKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6ZGV0
YWNoKCkKLXsKLSAgICBBU1NFUlQoYXR0YWNoZWQoKSk7Ci0gICAgQVNTRVJUKCFtX2luUGFnZUNh
Y2hlKTsKLQotI2lmIEVOQUJMRShQT0lOVEVSX0xPQ0spCi0gICAgaWYgKHBhZ2UoKSkKLSAgICAg
ICAgcGFnZSgpLT5wb2ludGVyTG9ja0NvbnRyb2xsZXIoKS0+ZG9jdW1lbnREZXRhY2hlZCh0aGlz
KTsKLSNlbmRpZgotCi0gICAgaWYgKHRoaXMgPT0gdG9wRG9jdW1lbnQoKSkKLSAgICAgICAgY2xl
YXJBWE9iamVjdENhY2hlKCk7Ci0KLSAgICBzdG9wQWN0aXZlRE9NT2JqZWN0cygpOwotICAgIG1f
ZXZlbnRRdWV1ZS0+Y2xvc2UoKTsKLSNpZiBFTkFCTEUoRlVMTFNDUkVFTl9BUEkpCi0gICAgbV9m
dWxsU2NyZWVuQ2hhbmdlRXZlbnRUYXJnZXRRdWV1ZS5jbGVhcigpOwotICAgIG1fZnVsbFNjcmVl
bkVycm9yRXZlbnRUYXJnZXRRdWV1ZS5jbGVhcigpOwotI2VuZGlmCi0KLSNpZiBFTkFCTEUoUkVR
VUVTVF9BTklNQVRJT05fRlJBTUUpCi0gICAgLy8gRklYTUU6IGNvbnNpZGVyIHVzaW5nIEFjdGl2
ZURPTU9iamVjdC4KLSAgICBpZiAobV9zY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXIpCi0gICAg
ICAgIG1fc2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyLT5jbGVhckRvY3VtZW50UG9pbnRlcigp
OwotICAgIG1fc2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyLmNsZWFyKCk7Ci0jZW5kaWYKLQot
ICAgIFJlbmRlck9iamVjdCogcmVuZGVyID0gcmVuZGVyZXIoKTsKLQotICAgIGRvY3VtZW50V2ls
bEJlY29tZUluYWN0aXZlKCk7Ci0KLSNpZiBFTkFCTEUoU0hBUkVEX1dPUktFUlMpCi0gICAgU2hh
cmVkV29ya2VyUmVwb3NpdG9yeTo6ZG9jdW1lbnREZXRhY2hlZCh0aGlzKTsKLSNlbmRpZgotCi0g
ICAgaWYgKG1fZnJhbWUpIHsKLSAgICAgICAgRnJhbWVWaWV3KiB2aWV3ID0gbV9mcmFtZS0+dmll
dygpOwotICAgICAgICBpZiAodmlldykKLSAgICAgICAgICAgIHZpZXctPmRldGFjaEN1c3RvbVNj
cm9sbGJhcnMoKTsKLQotICAgIH0KLQotICAgIC8vIGluZGljYXRlIGRlc3RydWN0aW9uIG1vZGUs
ICBpLmUuIGF0dGFjaGVkKCkgYnV0IHJlbmRlcmVyID09IDAKLSAgICBzZXRSZW5kZXJlcigwKTsK
LSAgICAKLSNpZiBFTkFCTEUoRlVMTFNDUkVFTl9BUEkpCi0gICAgaWYgKG1fZnVsbFNjcmVlblJl
bmRlcmVyKQotICAgICAgICBzZXRGdWxsU2NyZWVuUmVuZGVyZXIoMCk7Ci0jZW5kaWYKLQotICAg
IG1faG92ZXJOb2RlID0gMDsKLSAgICBtX2ZvY3VzZWROb2RlID0gMDsKLSAgICBtX2FjdGl2ZU5v
ZGUgPSAwOwotCi0gICAgQ29udGFpbmVyTm9kZTo6ZGV0YWNoKCk7Ci0KLSAgICB1bnNjaGVkdWxl
U3R5bGVSZWNhbGMoKTsKLQotICAgIGlmIChyZW5kZXIpCi0gICAgICAgIHJlbmRlci0+ZGVzdHJv
eSgpOwotCi0gICAgLy8gVGhpcyBpcyByZXF1aXJlZCwgYXMgb3VyIEZyYW1lIG1pZ2h0IGRlbGV0
ZSBpdHNlbGYgYXMgc29vbiBhcyBpdCBkZXRhY2hlcwotICAgIC8vIHVzLiBIb3dldmVyLCB0aGlz
IHZpb2xhdGVzIE5vZGU6OmRldGFjaCgpIHNlbWFudGljcywgYXMgaXQncyBuZXZlcgotICAgIC8v
IHBvc3NpYmxlIHRvIHJlLWF0dGFjaC4gRXZlbnR1YWxseSBEb2N1bWVudDo6ZGV0YWNoKCkgc2hv
dWxkIGJlIHJlbmFtZWQsCi0gICAgLy8gb3IgdGhpcyBzZXR0aW5nIG9mIHRoZSBmcmFtZSB0byAw
IGNvdWxkIGJlIG1hZGUgZXhwbGljaXQgaW4gZWFjaCBvZiB0aGUKLSAgICAvLyBjYWxsZXJzIG9m
IERvY3VtZW50OjpkZXRhY2goKS4KLSAgICBtX2ZyYW1lID0gMDsKLSAgICBtX3JlbmRlckFyZW5h
LmNsZWFyKCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnByZXBhcmVGb3JEZXN0cnVjdGlvbigpCi17
Ci0gICAgZGlzY29ubmVjdERlc2NlbmRhbnRGcmFtZXMoKTsKLSAgICBpZiAoRE9NV2luZG93KiB3
aW5kb3cgPSB0aGlzLT5kb21XaW5kb3coKSkKLSAgICAgICAgd2luZG93LT53aWxsRGV0YWNoRG9j
dW1lbnRGcm9tRnJhbWUoKTsKLSAgICBkZXRhY2goKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6cmVt
b3ZlQWxsRXZlbnRMaXN0ZW5lcnMoKQotewotICAgIEV2ZW50VGFyZ2V0OjpyZW1vdmVBbGxFdmVu
dExpc3RlbmVycygpOwotCi0gICAgaWYgKERPTVdpbmRvdyogZG9tV2luZG93ID0gdGhpcy0+ZG9t
V2luZG93KCkpCi0gICAgICAgIGRvbVdpbmRvdy0+cmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnMoKTsK
LSAgICBmb3IgKE5vZGUqIG5vZGUgPSBmaXJzdENoaWxkKCk7IG5vZGU7IG5vZGUgPSBub2RlLT50
cmF2ZXJzZU5leHROb2RlKCkpCi0gICAgICAgIG5vZGUtPnJlbW92ZUFsbEV2ZW50TGlzdGVuZXJz
KCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnN1c3BlbmRBY3RpdmVET01PYmplY3RzKEFjdGl2ZURP
TU9iamVjdDo6UmVhc29uRm9yU3VzcGVuc2lvbiB3aHkpCi17Ci0gICAgU2NyaXB0RXhlY3V0aW9u
Q29udGV4dDo6c3VzcGVuZEFjdGl2ZURPTU9iamVjdHMod2h5KTsKLQotI2lmIEVOQUJMRShERVZJ
Q0VfT1JJRU5UQVRJT04pCi0gICAgaWYgKCFwYWdlKCkpCi0gICAgICAgIHJldHVybjsKLQotICAg
IGlmIChEZXZpY2VNb3Rpb25Db250cm9sbGVyKiBjb250cm9sbGVyID0gRGV2aWNlTW90aW9uQ29u
dHJvbGxlcjo6ZnJvbShwYWdlKCkpKQotICAgICAgICBjb250cm9sbGVyLT5zdXNwZW5kRXZlbnRz
Rm9yQWxsTGlzdGVuZXJzKGRvbVdpbmRvdygpKTsKLSAgICBpZiAoRGV2aWNlT3JpZW50YXRpb25D
b250cm9sbGVyKiBjb250cm9sbGVyID0gRGV2aWNlT3JpZW50YXRpb25Db250cm9sbGVyOjpmcm9t
KHBhZ2UoKSkpCi0gICAgICAgIGNvbnRyb2xsZXItPnN1c3BlbmRFdmVudHNGb3JBbGxMaXN0ZW5l
cnMoZG9tV2luZG93KCkpOwotCi0jZW5kaWYKLX0KLQotdm9pZCBEb2N1bWVudDo6cmVzdW1lQWN0
aXZlRE9NT2JqZWN0cygpCi17Ci0gICAgU2NyaXB0RXhlY3V0aW9uQ29udGV4dDo6cmVzdW1lQWN0
aXZlRE9NT2JqZWN0cygpOwotCi0jaWYgRU5BQkxFKERFVklDRV9PUklFTlRBVElPTikKLSAgICBp
ZiAoIXBhZ2UoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKERldmljZU1vdGlvbkNvbnRy
b2xsZXIqIGNvbnRyb2xsZXIgPSBEZXZpY2VNb3Rpb25Db250cm9sbGVyOjpmcm9tKHBhZ2UoKSkp
Ci0gICAgICAgIGNvbnRyb2xsZXItPnJlc3VtZUV2ZW50c0ZvckFsbExpc3RlbmVycyhkb21XaW5k
b3coKSk7Ci0gICAgaWYgKERldmljZU9yaWVudGF0aW9uQ29udHJvbGxlciogY29udHJvbGxlciA9
IERldmljZU9yaWVudGF0aW9uQ29udHJvbGxlcjo6ZnJvbShwYWdlKCkpKQotICAgICAgICBjb250
cm9sbGVyLT5yZXN1bWVFdmVudHNGb3JBbGxMaXN0ZW5lcnMoZG9tV2luZG93KCkpOwotI2VuZGlm
Ci19Ci0KLVJlbmRlclZpZXcqIERvY3VtZW50OjpyZW5kZXJWaWV3KCkgY29uc3QKLXsKLSAgICBy
ZXR1cm4gdG9SZW5kZXJWaWV3KHJlbmRlcmVyKCkpOwotfQotCi12b2lkIERvY3VtZW50OjpjbGVh
ckFYT2JqZWN0Q2FjaGUoKQotewotICAgIC8vIGNsZWFyIGNhY2hlIGluIHRvcCBkb2N1bWVudAot
ICAgIGlmIChtX2F4T2JqZWN0Q2FjaGUpIHsKLSAgICAgICAgLy8gQ2xlYXIgdGhlIGNhY2hlIG1l
bWJlciB2YXJpYWJsZSBiZWZvcmUgY2FsbGluZyBkZWxldGUgYmVjYXVzZSBhdHRlbXB0cwotICAg
ICAgICAvLyBhcmUgbWFkZSB0byBhY2Nlc3MgaXQgZHVyaW5nIGRlc3RydWN0aW9uLgotICAgICAg
ICBBWE9iamVjdENhY2hlKiBheE9iamVjdENhY2hlID0gbV9heE9iamVjdENhY2hlOwotICAgICAg
ICBtX2F4T2JqZWN0Q2FjaGUgPSAwOwotICAgICAgICBkZWxldGUgYXhPYmplY3RDYWNoZTsKLSAg
ICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICAvLyBhc2sgdGhlIHRvcC1sZXZlbCBkb2N1
bWVudCB0byBjbGVhciBpdHMgY2FjaGUKLSAgICBEb2N1bWVudCogZG9jID0gdG9wRG9jdW1lbnQo
KTsKLSAgICBpZiAoZG9jICE9IHRoaXMpCi0gICAgICAgIGRvYy0+Y2xlYXJBWE9iamVjdENhY2hl
KCk7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6OmF4T2JqZWN0Q2FjaGVFeGlzdHMoKSBjb25zdAotewot
ICAgIGlmIChtX2F4T2JqZWN0Q2FjaGUpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIAotICAg
IERvY3VtZW50KiBkb2MgPSB0b3BEb2N1bWVudCgpOwotICAgIGlmIChkb2MgIT0gdGhpcykKLSAg
ICAgICAgcmV0dXJuIGRvYy0+YXhPYmplY3RDYWNoZUV4aXN0cygpOwotICAgIAotICAgIHJldHVy
biBmYWxzZTsKLX0KLSAgICAKLUFYT2JqZWN0Q2FjaGUqIERvY3VtZW50OjpheE9iamVjdENhY2hl
KCkgY29uc3QKLXsKLSAgICAvLyBUaGUgb25seSBkb2N1bWVudCB0aGF0IGFjdHVhbGx5IGhhcyBh
IEFYT2JqZWN0Q2FjaGUgaXMgdGhlIHRvcC1sZXZlbAotICAgIC8vIGRvY3VtZW50LiAgVGhpcyBp
cyBiZWNhdXNlIHdlIG5lZWQgdG8gYmUgYWJsZSB0byBnZXQgZnJvbSBhbnkgV2ViQ29yZUFYT2Jq
ZWN0Ci0gICAgLy8gdG8gYW55IG90aGVyIFdlYkNvcmVBWE9iamVjdCBvbiB0aGUgc2FtZSBwYWdl
LiAgVXNpbmcgYSBzaW5nbGUgY2FjaGUgYWxsb3dzCi0gICAgLy8gbG9va3VwcyBhY3Jvc3MgbmVz
dGVkIHdlYmFyZWFzIChpLmUuIG11bHRpcGxlIGRvY3VtZW50cykuCi0gICAgCi0gICAgaWYgKG1f
YXhPYmplY3RDYWNoZSkgewotICAgICAgICAvLyByZXR1cm4gYWxyZWFkeSBrbm93biB0b3AtbGV2
ZWwgY2FjaGUKLSAgICAgICAgaWYgKCFvd25lckVsZW1lbnQoKSkKLSAgICAgICAgICAgIHJldHVy
biBtX2F4T2JqZWN0Q2FjaGU7Ci0gICAgICAgIAotICAgICAgICAvLyBJbiBzb21lIHBhZ2VzIHdp
dGggZnJhbWVzLCB0aGUgY2FjaGUgaXMgY3JlYXRlZCBiZWZvcmUgdGhlIHN1Yi13ZWJhcmVhIGlz
Ci0gICAgICAgIC8vIGluc2VydGVkIGludG8gdGhlIHRyZWUuICBIZXJlLCB3ZSBjYXRjaCB0aGF0
IGNhc2UgYW5kIGp1c3QgdG9zcyB0aGUgb2xkCi0gICAgICAgIC8vIGNhY2hlIGFuZCBzdGFydCBv
dmVyLgotICAgICAgICAvLyBOT1RFOiBUaGlzIHJlY292ZXJ5IG1heSBubyBsb25nZXIgYmUgbmVl
ZGVkLiBJIGhhdmUgYmVlbiB1bmFibGUgdG8gdHJpZ2dlcgotICAgICAgICAvLyBpdCBhZ2Fpbi4g
U2VlIHJkYXI6Ly81Nzk0NDU0Ci0gICAgICAgIC8vIEZJWE1FOiBDYW4gdGhpcyBiZSBmaXhlZCB3
aGVuIGluc2VydGluZyB0aGUgc3ViZnJhbWUgaW5zdGVhZCBvZiBub3c/Ci0gICAgICAgIC8vIEZJ
WE1FOiBJZiB0aGlzIGZ1bmN0aW9uIHdhcyBjYWxsZWQgdG8gZ2V0IHRoZSBjYWNoZSBpbiBvcmRl
ciB0byByZW1vdmUKLSAgICAgICAgLy8gYW4gQVhPYmplY3QsIHdlIGFyZSBub3cgZGVsZXRpbmcg
dGhlIGNhY2hlIGFzIGEgd2hvbGUgYW5kIHJldHVybmluZyBhCi0gICAgICAgIC8vIG5ldyBlbXB0
eSBjYWNoZSB0aGF0IGRvZXMgbm90IGNvbnRhaW4gdGhlIEFYT2JqZWN0ISBUaGF0IHNob3VsZCBh
Y3R1YWxseQotICAgICAgICAvLyBiZSBPSy4gSSBhbSBjb25jZXJuZWQgYWJvdXQgb3RoZXIgY2Fz
ZXMgbGlrZSB0aGlzIHdoZXJlIGFjY2Vzc2luZyB0aGUKLSAgICAgICAgLy8gY2FjaGUgYmxvd3Mg
YXdheSB0aGUgQVhPYmplY3QgYmVpbmcgb3BlcmF0ZWQgb24uCi0gICAgICAgIGRlbGV0ZSBtX2F4
T2JqZWN0Q2FjaGU7Ci0gICAgICAgIG1fYXhPYmplY3RDYWNoZSA9IDA7Ci0gICAgfQotCi0gICAg
Ly8gYXNrIHRoZSB0b3AtbGV2ZWwgZG9jdW1lbnQgZm9yIGl0cyBjYWNoZQotICAgIERvY3VtZW50
KiBkb2MgPSB0b3BEb2N1bWVudCgpOwotICAgIGlmIChkb2MgIT0gdGhpcykKLSAgICAgICAgcmV0
dXJuIGRvYy0+YXhPYmplY3RDYWNoZSgpOwotICAgIAotICAgIC8vIHRoaXMgaXMgdGhlIHRvcC1s
ZXZlbCBkb2N1bWVudCwgc28gaW5zdGFsbCBhIG5ldyBjYWNoZQotICAgIG1fYXhPYmplY3RDYWNo
ZSA9IG5ldyBBWE9iamVjdENhY2hlKHRoaXMpOwotICAgIHJldHVybiBtX2F4T2JqZWN0Q2FjaGU7
Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnNldFZpc3VhbGx5T3JkZXJlZCgpCi17Ci0gICAgbV92aXN1
YWxseU9yZGVyZWQgPSB0cnVlOwotICAgIGlmIChyZW5kZXJlcigpKQotICAgICAgICByZW5kZXJl
cigpLT5zdHlsZSgpLT5zZXRSVExPcmRlcmluZyhWaXN1YWxPcmRlcik7Ci19Ci0KLVBhc3NSZWZQ
dHI8RG9jdW1lbnRQYXJzZXI+IERvY3VtZW50OjpjcmVhdGVQYXJzZXIoKQotewotICAgIC8vIEZJ
WE1FOiB0aGlzIHNob3VsZCBwcm9iYWJseSBwYXNzIHRoZSBmcmFtZSBpbnN0ZWFkCi0jaWYgRU5B
QkxFKE5FV19YTUwpCi0gICAgcmV0dXJuIE5ld1hNTERvY3VtZW50UGFyc2VyOjpjcmVhdGUodGhp
cyk7Ci0jZWxzZQotICAgIHJldHVybiBYTUxEb2N1bWVudFBhcnNlcjo6Y3JlYXRlKHRoaXMsIHZp
ZXcoKSk7Ci0jZW5kaWYKLX0KLQotU2NyaXB0YWJsZURvY3VtZW50UGFyc2VyKiBEb2N1bWVudDo6
c2NyaXB0YWJsZURvY3VtZW50UGFyc2VyKCkgY29uc3QKLXsKLSAgICByZXR1cm4gcGFyc2VyKCkg
PyBwYXJzZXIoKS0+YXNTY3JpcHRhYmxlRG9jdW1lbnRQYXJzZXIoKSA6IDA7Ci19Ci0KLXZvaWQg
RG9jdW1lbnQ6Om9wZW4oRG9jdW1lbnQqIG93bmVyRG9jdW1lbnQpCi17Ci0gICAgaWYgKG93bmVy
RG9jdW1lbnQpIHsKLSAgICAgICAgc2V0VVJMKG93bmVyRG9jdW1lbnQtPnVybCgpKTsKLSAgICAg
ICAgbV9jb29raWVVUkwgPSBvd25lckRvY3VtZW50LT5jb29raWVVUkwoKTsKLSAgICAgICAgc2V0
U2VjdXJpdHlPcmlnaW4ob3duZXJEb2N1bWVudC0+c2VjdXJpdHlPcmlnaW4oKSk7Ci0gICAgfQot
Ci0gICAgaWYgKG1fZnJhbWUpIHsKLSAgICAgICAgaWYgKFNjcmlwdGFibGVEb2N1bWVudFBhcnNl
ciogcGFyc2VyID0gc2NyaXB0YWJsZURvY3VtZW50UGFyc2VyKCkpIHsKLSAgICAgICAgICAgIGlm
IChwYXJzZXItPmlzUGFyc2luZygpKSB7Ci0gICAgICAgICAgICAgICAgLy8gRklYTUU6IEhUTUw1
IGRvZXNuJ3QgdGVsbCB1cyB0byBjaGVjayB0aGlzLCBpdCBtaWdodCBub3QgYmUgY29ycmVjdC4K
LSAgICAgICAgICAgICAgICBpZiAocGFyc2VyLT5pc0V4ZWN1dGluZ1NjcmlwdCgpKQotICAgICAg
ICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgICAgICBpZiAoIXBhcnNlci0+d2Fz
Q3JlYXRlZEJ5U2NyaXB0KCkgJiYgcGFyc2VyLT5oYXNJbnNlcnRpb25Qb2ludCgpKQotICAgICAg
ICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAg
ICBpZiAobV9mcmFtZS0+bG9hZGVyKCktPnN0YXRlKCkgPT0gRnJhbWVTdGF0ZVByb3Zpc2lvbmFs
KQotICAgICAgICAgICAgbV9mcmFtZS0+bG9hZGVyKCktPnN0b3BBbGxMb2FkZXJzKCk7Ci0gICAg
fQotCi0gICAgcmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnMoKTsKLSAgICBpbXBsaWNpdE9wZW4oKTsK
LSAgICBpZiAoU2NyaXB0YWJsZURvY3VtZW50UGFyc2VyKiBwYXJzZXIgPSBzY3JpcHRhYmxlRG9j
dW1lbnRQYXJzZXIoKSkKLSAgICAgICAgcGFyc2VyLT5zZXRXYXNDcmVhdGVkQnlTY3JpcHQodHJ1
ZSk7Ci0KLSAgICBpZiAoRE9NV2luZG93KiBkb21XaW5kb3cgPSB0aGlzLT5kb21XaW5kb3coKSkK
LSAgICAgICAgZG9tV2luZG93LT5yZW1vdmVBbGxFdmVudExpc3RlbmVycygpOwotCi0gICAgaWYg
KG1fZnJhbWUpCi0gICAgICAgIG1fZnJhbWUtPmxvYWRlcigpLT5kaWRFeHBsaWNpdE9wZW4oKTsK
LX0KLQotdm9pZCBEb2N1bWVudDo6ZGV0YWNoUGFyc2VyKCkKLXsKLSAgICBpZiAoIW1fcGFyc2Vy
KQotICAgICAgICByZXR1cm47Ci0gICAgbV9wYXJzZXItPmRldGFjaCgpOwotICAgIG1fcGFyc2Vy
LmNsZWFyKCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmNhbmNlbFBhcnNpbmcoKQotewotICAgIGlm
ICghbV9wYXJzZXIpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIFdlIGhhdmUgdG8gY2xlYXIg
dGhlIHBhcnNlciB0byBhdm9pZCBwb3NzaWJseSB0cmlnZ2VyaW5nCi0gICAgLy8gdGhlIG9ubG9h
ZCBoYW5kbGVyIHdoZW4gY2xvc2luZyBhcyBhIHNpZGUgZWZmZWN0IG9mIGEgY2FuY2VsLXN0eWxl
Ci0gICAgLy8gY2hhbmdlLCBzdWNoIGFzIG9wZW5pbmcgYSBuZXcgZG9jdW1lbnQgb3IgY2xvc2lu
ZyB0aGUgd2luZG93IHdoaWxlCi0gICAgLy8gc3RpbGwgcGFyc2luZwotICAgIGRldGFjaFBhcnNl
cigpOwotICAgIGV4cGxpY2l0Q2xvc2UoKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6aW1wbGljaXRP
cGVuKCkKLXsKLSAgICBjYW5jZWxQYXJzaW5nKCk7Ci0KLSAgICByZW1vdmVDaGlsZHJlbigpOwot
Ci0gICAgc2V0Q29tcGF0aWJpbGl0eU1vZGUoTm9RdWlya3NNb2RlKTsKLQotICAgIG1fcGFyc2Vy
ID0gY3JlYXRlUGFyc2VyKCk7Ci0gICAgc2V0UGFyc2luZyh0cnVlKTsKLSAgICBzZXRSZWFkeVN0
YXRlKExvYWRpbmcpOwotfQotCi1IVE1MRWxlbWVudCogRG9jdW1lbnQ6OmJvZHkoKSBjb25zdAot
ewotICAgIE5vZGUqIGRlID0gZG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgaWYgKCFkZSkKLSAgICAg
ICAgcmV0dXJuIDA7Ci0gICAgCi0gICAgLy8gdHJ5IHRvIHByZWZlciBhIEZSQU1FU0VUIGVsZW1l
bnQgb3ZlciBCT0RZCi0gICAgTm9kZSogYm9keSA9IDA7Ci0gICAgZm9yIChOb2RlKiBpID0gZGUt
PmZpcnN0Q2hpbGQoKTsgaTsgaSA9IGktPm5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAgaWYgKGkt
Pmhhc1RhZ05hbWUoZnJhbWVzZXRUYWcpKQotICAgICAgICAgICAgcmV0dXJuIHRvSFRNTEVsZW1l
bnQoaSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoaS0+aGFzVGFnTmFtZShib2R5VGFnKSAmJiAh
Ym9keSkKLSAgICAgICAgICAgIGJvZHkgPSBpOwotICAgIH0KLSAgICByZXR1cm4gdG9IVE1MRWxl
bWVudChib2R5KTsKLX0KLQotdm9pZCBEb2N1bWVudDo6c2V0Qm9keShQYXNzUmVmUHRyPEhUTUxF
bGVtZW50PiBwcnBOZXdCb2R5LCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICBSZWZQdHI8SFRN
TEVsZW1lbnQ+IG5ld0JvZHkgPSBwcnBOZXdCb2R5OwotCi0gICAgaWYgKCFuZXdCb2R5IHx8ICFk
b2N1bWVudEVsZW1lbnQoKSB8fCAhbmV3Qm9keS0+aGFzVGFnTmFtZShib2R5VGFnKSkgeyAKLSAg
ICAgICAgZWMgPSBISUVSQVJDSFlfUkVRVUVTVF9FUlI7Ci0gICAgICAgIHJldHVybjsKLSAgICB9
Ci0KLSAgICBpZiAobmV3Qm9keS0+ZG9jdW1lbnQoKSAmJiBuZXdCb2R5LT5kb2N1bWVudCgpICE9
IHRoaXMpIHsKLSAgICAgICAgZWMgPSAwOwotICAgICAgICBSZWZQdHI8Tm9kZT4gbm9kZSA9IGlt
cG9ydE5vZGUobmV3Qm9keS5nZXQoKSwgdHJ1ZSwgZWMpOwotICAgICAgICBpZiAoZWMpCi0gICAg
ICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgICAgICBuZXdCb2R5ID0gdG9IVE1MRWxlbWVu
dChub2RlLmdldCgpKTsKLSAgICB9Ci0KLSAgICBIVE1MRWxlbWVudCogYiA9IGJvZHkoKTsKLSAg
ICBpZiAoIWIpCi0gICAgICAgIGRvY3VtZW50RWxlbWVudCgpLT5hcHBlbmRDaGlsZChuZXdCb2R5
LnJlbGVhc2UoKSwgZWMpOwotICAgIGVsc2UKLSAgICAgICAgZG9jdW1lbnRFbGVtZW50KCktPnJl
cGxhY2VDaGlsZChuZXdCb2R5LnJlbGVhc2UoKSwgYiwgZWMpOwotfQotCi1IVE1MSGVhZEVsZW1l
bnQqIERvY3VtZW50OjpoZWFkKCkKLXsKLSAgICBOb2RlKiBkZSA9IGRvY3VtZW50RWxlbWVudCgp
OwotICAgIGlmICghZGUpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgZm9yIChOb2RlKiBlID0g
ZGUtPmZpcnN0Q2hpbGQoKTsgZTsgZSA9IGUtPm5leHRTaWJsaW5nKCkpCi0gICAgICAgIGlmIChl
LT5oYXNUYWdOYW1lKGhlYWRUYWcpKQotICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEhU
TUxIZWFkRWxlbWVudCo+KGUpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6
OmNsb3NlKCkKLXsKLSAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIGZvbGxvdyB0aGUgc3BlY2lmaWNh
dGlvbiBtb3JlIGNsb3NlbHk6Ci0gICAgLy8gICAgICAgIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9z
cGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvI2RvbS1kb2N1bWVudC1jbG9zZQotCi0gICAgaWYg
KCFzY3JpcHRhYmxlRG9jdW1lbnRQYXJzZXIoKSB8fCAhc2NyaXB0YWJsZURvY3VtZW50UGFyc2Vy
KCktPndhc0NyZWF0ZWRCeVNjcmlwdCgpIHx8ICFzY3JpcHRhYmxlRG9jdW1lbnRQYXJzZXIoKS0+
aXNQYXJzaW5nKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGV4cGxpY2l0Q2xvc2UoKTsKLX0K
LQotdm9pZCBEb2N1bWVudDo6ZXhwbGljaXRDbG9zZSgpCi17Ci0gICAgaWYgKG1fcGFyc2VyKQot
ICAgICAgICBtX3BhcnNlci0+ZmluaXNoKCk7Ci0KLSAgICBpZiAoIW1fZnJhbWUpIHsKLSAgICAg
ICAgLy8gQmVjYXVzZSB3ZSBoYXZlIG5vIGZyYW1lLCB3ZSBkb24ndCBrbm93IGlmIGFsbCBsb2Fk
aW5nIGhhcyBjb21wbGV0ZWQsCi0gICAgICAgIC8vIHNvIHdlIGp1c3QgY2FsbCBpbXBsaWNpdENs
b3NlKCkgaW1tZWRpYXRlbHkuIEZJWE1FOiBUaGlzIG1pZ2h0IGZpcmUKLSAgICAgICAgLy8gdGhl
IGxvYWQgZXZlbnQgcHJlbWF0dXJlbHkgPGh0dHA6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTE0NTY4Pi4KLSAgICAgICAgaW1wbGljaXRDbG9zZSgpOwotICAgICAgICByZXR1cm47
Ci0gICAgfQotCi0gICAgbV9mcmFtZS0+bG9hZGVyKCktPmNoZWNrQ29tcGxldGVkKCk7Ci19Ci0K
LXZvaWQgRG9jdW1lbnQ6OmltcGxpY2l0Q2xvc2UoKQotewotICAgIC8vIElmIHdlJ3JlIGluIHRo
ZSBtaWRkbGUgb2YgcmVjYWxjU3R5bGUsIHdlIG5lZWQgdG8gZGVmZXIgdGhlIGNsb3NlIHVudGls
IHRoZSBzdHlsZSBpbmZvcm1hdGlvbiBpcyBhY2N1cmF0ZSBhbmQgYWxsIGVsZW1lbnRzIGFyZSBy
ZS1hdHRhY2hlZC4KLSAgICBpZiAobV9pblN0eWxlUmVjYWxjKSB7Ci0gICAgICAgIG1fY2xvc2VB
ZnRlclN0eWxlUmVjYWxjID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGJv
b2wgd2FzTG9jYXRpb25DaGFuZ2VQZW5kaW5nID0gZnJhbWUoKSAmJiBmcmFtZSgpLT5uYXZpZ2F0
aW9uU2NoZWR1bGVyKCktPmxvY2F0aW9uQ2hhbmdlUGVuZGluZygpOwotICAgIGJvb2wgZG9sb2Fk
ID0gIXBhcnNpbmcoKSAmJiBtX3BhcnNlciAmJiAhbV9wcm9jZXNzaW5nTG9hZEV2ZW50ICYmICF3
YXNMb2NhdGlvbkNoYW5nZVBlbmRpbmc7Ci0gICAgCi0gICAgaWYgKCFkb2xvYWQpCi0gICAgICAg
IHJldHVybjsKLQotICAgIG1fcHJvY2Vzc2luZ0xvYWRFdmVudCA9IHRydWU7Ci0KLSAgICBTY3Jp
cHRhYmxlRG9jdW1lbnRQYXJzZXIqIHBhcnNlciA9IHNjcmlwdGFibGVEb2N1bWVudFBhcnNlcigp
OwotICAgIG1fd2VsbEZvcm1lZCA9IHBhcnNlciAmJiBwYXJzZXItPndlbGxGb3JtZWQoKTsKLQot
ICAgIC8vIFdlIGhhdmUgdG8gY2xlYXIgdGhlIHBhcnNlciwgaW4gY2FzZSBzb21lb25lIGRvY3Vt
ZW50LndyaXRlKClzIGZyb20gdGhlCi0gICAgLy8gb25Mb2FkIGV2ZW50IGhhbmRsZXIsIGFzIGlu
IFJhZGFyIDMyMDY1MjQuCi0gICAgZGV0YWNoUGFyc2VyKCk7Ci0KLSAgICAvLyBQYXJzZXIgc2hv
dWxkIGhhdmUgcGlja2VkIHVwIGFsbCBwcmVsb2FkcyBieSBub3cKLSAgICBtX2NhY2hlZFJlc291
cmNlTG9hZGVyLT5jbGVhclByZWxvYWRzKCk7Ci0KLSAgICAvLyBGSVhNRTogV2Uga2ljayBvZmYg
dGhlIGljb24gbG9hZGVyIHdoZW4gdGhlIERvY3VtZW50IGlzIGRvbmUgcGFyc2luZy4KLSAgICAv
LyBUaGVyZSBhcmUgZWFybGllciBvcHBvcnR1bml0aWVzIHdlIGNvdWxkIHN0YXJ0IGl0OgotICAg
IC8vICAtV2hlbiB0aGUgPGhlYWQ+IGZpbmlzaGVzIHBhcnNpbmcKLSAgICAvLyAgLVdoZW4gYW55
IG5ldyBIVE1MTGlua0VsZW1lbnQgaXMgaW5zZXJ0ZWQgaW50byB0aGUgZG9jdW1lbnQKLSAgICAv
LyBCdXQgdGhvc2UgYWRkIGEgZHluYW1pYyBjb21wb25lbnQgdG8gdGhlIGZhdmljb24gdGhhdCBo
YXMgVUkgCi0gICAgLy8gcmFtaWZpY2F0aW9ucywgYW5kIHdlIG5lZWQgdG8gZGVjaWRlIHdoYXQg
aXMgdGhlIFJpZ2h0IFRoaW5nIFRvIERvKHRtKQotICAgIEZyYW1lKiBmID0gZnJhbWUoKTsKLSAg
ICBpZiAoZikgewotICAgICAgICBmLT5sb2FkZXIoKS0+aWNvbigpLT5zdGFydExvYWRlcigpOwot
ICAgICAgICBmLT5hbmltYXRpb24oKS0+cmVzdW1lQW5pbWF0aW9uc0ZvckRvY3VtZW50KHRoaXMp
OwotICAgIH0KLQotICAgIEltYWdlTG9hZGVyOjpkaXNwYXRjaFBlbmRpbmdCZWZvcmVMb2FkRXZl
bnRzKCk7Ci0gICAgSW1hZ2VMb2FkZXI6OmRpc3BhdGNoUGVuZGluZ0xvYWRFdmVudHMoKTsKLSAg
ICBJbWFnZUxvYWRlcjo6ZGlzcGF0Y2hQZW5kaW5nRXJyb3JFdmVudHMoKTsKLQotICAgIEhUTUxM
aW5rRWxlbWVudDo6ZGlzcGF0Y2hQZW5kaW5nTG9hZEV2ZW50cygpOwotICAgIEhUTUxTdHlsZUVs
ZW1lbnQ6OmRpc3BhdGNoUGVuZGluZ0xvYWRFdmVudHMoKTsKLQotI2lmIEVOQUJMRShTVkcpCi0g
ICAgLy8gVG8gYWxpZ24gdGhlIEhUTUwgbG9hZCBldmVudCBhbmQgdGhlIFNWR0xvYWQgZXZlbnQg
Zm9yIHRoZSBvdXRlcm1vc3QgPHN2Zz4gZWxlbWVudCwgZmlyZSBpdCBmcm9tCi0gICAgLy8gaGVy
ZSwgaW5zdGVhZCBvZiBkb2luZyBpdCBmcm9tIFNWR0VsZW1lbnQ6OmZpbmlzaGVkUGFyc2luZ0No
aWxkcmVuIChpZiBleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkPSJmYWxzZSIsCi0gICAgLy8gd2hp
Y2ggaXMgdGhlIGRlZmF1bHQsIGZvciA9J3RydWUnIGl0cyBmaXJlZCBhdCBhIGxhdGVyIHRpbWUs
IG9uY2UgYWxsIGV4dGVybmFsIHJlc291cmNlcyBmaW5pc2hlZCBsb2FkaW5nKS4KLSAgICBpZiAo
c3ZnRXh0ZW5zaW9ucygpKQotICAgICAgICBhY2Nlc3NTVkdFeHRlbnNpb25zKCktPmRpc3BhdGNo
U1ZHTG9hZEV2ZW50VG9PdXRlcm1vc3RTVkdFbGVtZW50cygpOwotI2VuZGlmCi0KLSAgICBkaXNw
YXRjaFdpbmRvd0xvYWRFdmVudCgpOwotICAgIGVucXVldWVQYWdlc2hvd0V2ZW50KFBhZ2VzaG93
RXZlbnROb3RQZXJzaXN0ZWQpOwotICAgIGVucXVldWVQb3BzdGF0ZUV2ZW50KG1fcGVuZGluZ1N0
YXRlT2JqZWN0ID8gbV9wZW5kaW5nU3RhdGVPYmplY3QucmVsZWFzZSgpIDogU2VyaWFsaXplZFNj
cmlwdFZhbHVlOjpudWxsVmFsdWUoKSk7Ci0gICAgCi0gICAgaWYgKGYpCi0gICAgICAgIGYtPmxv
YWRlcigpLT5oYW5kbGVkT25sb2FkRXZlbnRzKCk7Ci0jaWZkZWYgSU5TVFJVTUVOVF9MQVlPVVRf
U0NIRURVTElORwotICAgIGlmICghb3duZXJFbGVtZW50KCkpCi0gICAgICAgIHByaW50Zigib25s
b2FkIGZpcmVkIGF0ICVkXG4iLCBlbGFwc2VkVGltZSgpKTsKLSNlbmRpZgotCi0gICAgLy8gQW4g
ZXZlbnQgaGFuZGxlciBtYXkgaGF2ZSByZW1vdmVkIHRoZSBmcmFtZQotICAgIGlmICghZnJhbWUo
KSkgewotICAgICAgICBtX3Byb2Nlc3NpbmdMb2FkRXZlbnQgPSBmYWxzZTsKLSAgICAgICAgcmV0
dXJuOwotICAgIH0KLQotICAgIC8vIE1ha2Ugc3VyZSBib3RoIHRoZSBpbml0aWFsIGxheW91dCBh
bmQgcmVmbG93IGhhcHBlbiBhZnRlciB0aGUgb25sb2FkCi0gICAgLy8gZmlyZXMuIFRoaXMgd2ls
bCBpbXByb3ZlIG9ubG9hZCBzY29yZXMsIGFuZCBvdGhlciBicm93c2VycyBkbyBpdC4KLSAgICAv
LyBJZiB0aGV5IHdhbm5hIGNoZWF0LCB3ZSBjYW4gdG9vLiAtZHdoCi0KLSAgICBpZiAoZnJhbWUo
KS0+bmF2aWdhdGlvblNjaGVkdWxlcigpLT5sb2NhdGlvbkNoYW5nZVBlbmRpbmcoKSAmJiBlbGFw
c2VkVGltZSgpIDwgY0xheW91dFNjaGVkdWxlVGhyZXNob2xkKSB7Ci0gICAgICAgIC8vIEp1c3Qg
YmFpbCBvdXQuIEJlZm9yZSBvciBkdXJpbmcgdGhlIG9ubG9hZCB3ZSB3ZXJlIHNoaWZ0ZWQgdG8g
YW5vdGhlciBwYWdlLgotICAgICAgICAvLyBUaGUgb2xkIGktQmVuY2ggc3VpdGUgZG9lcyB0aGlz
LiBXaGVuIHRoaXMgaGFwcGVucyBkb24ndCBib3RoZXIgcGFpbnRpbmcgb3IgbGF5aW5nIG91dC4g
ICAgICAgIAotICAgICAgICBtX3Byb2Nlc3NpbmdMb2FkRXZlbnQgPSBmYWxzZTsKLSAgICAgICAg
dmlldygpLT51bnNjaGVkdWxlUmVsYXlvdXQoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQot
ICAgIGZyYW1lKCktPmxvYWRlcigpLT5jaGVja0NhbGxJbXBsaWNpdENsb3NlKCk7Ci0gICAgUmVu
ZGVyT2JqZWN0KiByZW5kZXJPYmplY3QgPSByZW5kZXJlcigpOwotICAgIAotICAgIC8vIFdlIHVz
ZWQgdG8gZm9yY2UgYSBzeW5jaHJvbm91cyBkaXNwbGF5IGFuZCBmbHVzaCBoZXJlLiAgVGhpcyBy
ZWFsbHkgaXNuJ3QKLSAgICAvLyBuZWNlc3NhcnkgYW5kIGNhbiBpbiBmYWN0IGJlIGFjdGl2ZWx5
IGhhcm1mdWwgaWYgcGFnZXMgYXJlIGxvYWRpbmcgYXQgYSByYXRlIG9mID4gNjBmcHMKLSAgICAv
LyAoaWYgeW91ciBwbGF0Zm9ybSBpcyBzeW5jaW5nIGZsdXNoZXMgYW5kIGxpbWl0aW5nIHRoZW0g
dG8gNjBmcHMpLgotICAgIG1fb3Zlck1pbmltdW1MYXlvdXRUaHJlc2hvbGQgPSB0cnVlOwotICAg
IGlmICghb3duZXJFbGVtZW50KCkgfHwgKG93bmVyRWxlbWVudCgpLT5yZW5kZXJlcigpICYmICFv
d25lckVsZW1lbnQoKS0+cmVuZGVyZXIoKS0+bmVlZHNMYXlvdXQoKSkpIHsKLSAgICAgICAgdXBk
YXRlU3R5bGVJZk5lZWRlZCgpOwotICAgICAgICAKLSAgICAgICAgLy8gQWx3YXlzIGRvIGEgbGF5
b3V0IGFmdGVyIGxvYWRpbmcgaWYgbmVlZGVkLgotICAgICAgICBpZiAodmlldygpICYmIHJlbmRl
ck9iamVjdCAmJiAoIXJlbmRlck9iamVjdC0+Zmlyc3RDaGlsZCgpIHx8IHJlbmRlck9iamVjdC0+
bmVlZHNMYXlvdXQoKSkpCi0gICAgICAgICAgICB2aWV3KCktPmxheW91dCgpOwotICAgIH0KLQot
ICAgIG1fcHJvY2Vzc2luZ0xvYWRFdmVudCA9IGZhbHNlOwotCi0jaWYgUExBVEZPUk0oTUFDKSB8
fCBQTEFURk9STShDSFJPTUlVTSkKLSAgICBpZiAoZiAmJiByZW5kZXJPYmplY3QgJiYgQVhPYmpl
Y3RDYWNoZTo6YWNjZXNzaWJpbGl0eUVuYWJsZWQoKSkgewotICAgICAgICAvLyBUaGUgQVggY2Fj
aGUgbWF5IGhhdmUgYmVlbiBjbGVhcmVkIGF0IHRoaXMgcG9pbnQsIGJ1dCB3ZSBuZWVkIHRvIG1h
a2Ugc3VyZSBpdCBjb250YWlucyBhbgotICAgICAgICAvLyBBWCBvYmplY3QgdG8gc2VuZCB0aGUg
bm90aWZpY2F0aW9uIHRvLiBnZXRPckNyZWF0ZSB3aWxsIG1ha2Ugc3VyZSB0aGF0IGFuIHZhbGlk
IEFYIG9iamVjdAotICAgICAgICAvLyBleGlzdHMgaW4gdGhlIGNhY2hlICh3ZSBpZ25vcmUgdGhl
IHJldHVybiB2YWx1ZSBiZWNhdXNlIHdlIGRvbid0IG5lZWQgaXQgaGVyZSkuIFRoaXMgaXMgCi0g
ICAgICAgIC8vIG9ubHkgc2FmZSB0byBjYWxsIHdoZW4gYSBsYXlvdXQgaXMgbm90IGluIHByb2dy
ZXNzLCBzbyBpdCBjYW4gbm90IGJlIHVzZWQgaW4gcG9zdE5vdGlmaWNhdGlvbi4gICAgCi0gICAg
ICAgIGF4T2JqZWN0Q2FjaGUoKS0+Z2V0T3JDcmVhdGUocmVuZGVyT2JqZWN0KTsKLSAgICAgICAg
aWYgKHRoaXMgPT0gdG9wRG9jdW1lbnQoKSkKLSAgICAgICAgICAgIGF4T2JqZWN0Q2FjaGUoKS0+
cG9zdE5vdGlmaWNhdGlvbihyZW5kZXJPYmplY3QsIEFYT2JqZWN0Q2FjaGU6OkFYTG9hZENvbXBs
ZXRlLCB0cnVlKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvLyBBWExvYWRDb21wbGV0
ZSBjYW4gb25seSBiZSBwb3N0ZWQgb24gdGhlIHRvcCBkb2N1bWVudCwgc28gaWYgaXQncyBhIGRv
Y3VtZW50Ci0gICAgICAgICAgICAvLyBpbiBhbiBpZnJhbWUgdGhhdCBqdXN0IGZpbmlzaGVkIGxv
YWRpbmcsIHBvc3QgQVhMYXlvdXRDb21wbGV0ZSBpbnN0ZWFkLgotICAgICAgICAgICAgYXhPYmpl
Y3RDYWNoZSgpLT5wb3N0Tm90aWZpY2F0aW9uKHJlbmRlck9iamVjdCwgQVhPYmplY3RDYWNoZTo6
QVhMYXlvdXRDb21wbGV0ZSwgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0jZW5kaWYKLQotI2lm
IEVOQUJMRShTVkcpCi0gICAgaWYgKHN2Z0V4dGVuc2lvbnMoKSkKLSAgICAgICAgYWNjZXNzU1ZH
RXh0ZW5zaW9ucygpLT5zdGFydEFuaW1hdGlvbnMoKTsKLSNlbmRpZgotfQotCi12b2lkIERvY3Vt
ZW50OjpzZXRQYXJzaW5nKGJvb2wgYikKLXsKLSAgICBtX2JQYXJzaW5nID0gYjsKLSAgICBpZiAo
IW1fYlBhcnNpbmcgJiYgdmlldygpKQotICAgICAgICB2aWV3KCktPnNjaGVkdWxlUmVsYXlvdXQo
KTsKLQotI2lmZGVmIElOU1RSVU1FTlRfTEFZT1VUX1NDSEVEVUxJTkcKLSAgICBpZiAoIW93bmVy
RWxlbWVudCgpICYmICFtX2JQYXJzaW5nKQotICAgICAgICBwcmludGYoIlBhcnNpbmcgZmluaXNo
ZWQgYXQgJWRcbiIsIGVsYXBzZWRUaW1lKCkpOwotI2VuZGlmCi19Ci0KLWJvb2wgRG9jdW1lbnQ6
OnNob3VsZFNjaGVkdWxlTGF5b3V0KCkKLXsKLSAgICAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgb25s
eSBiZSBjYWxsZWQgd2hlbiBGcmFtZVZpZXcgdGhpbmtzIGEgbGF5b3V0IGlzIG5lZWRlZC4KLSAg
ICAvLyBUaGlzIGVuZm9yY2VzIGEgY291cGxlIGV4dHJhIHJ1bGVzLgotICAgIC8vCi0gICAgLy8g
ICAgKGEpIE9ubHkgc2NoZWR1bGUgYSBsYXlvdXQgb25jZSB0aGUgc3R5bGVzaGVldHMgYXJlIGxv
YWRlZC4KLSAgICAvLyAgICAoYikgT25seSBzY2hlZHVsZSBsYXlvdXQgb25jZSB3ZSBoYXZlIGEg
Ym9keSBlbGVtZW50LgotCi0gICAgcmV0dXJuIChoYXZlU3R5bGVzaGVldHNMb2FkZWQoKSAmJiBi
b2R5KCkpCi0gICAgICAgIHx8IChkb2N1bWVudEVsZW1lbnQoKSAmJiAhZG9jdW1lbnRFbGVtZW50
KCktPmhhc1RhZ05hbWUoaHRtbFRhZykpOwotfQotICAgIAotYm9vbCBEb2N1bWVudDo6aXNMYXlv
dXRUaW1lckFjdGl2ZSgpCi17Ci0gICAgcmV0dXJuIHZpZXcoKSAmJiB2aWV3KCktPmxheW91dFBl
bmRpbmcoKSAmJiAhbWluaW11bUxheW91dERlbGF5KCk7Ci19Ci0KLWludCBEb2N1bWVudDo6bWlu
aW11bUxheW91dERlbGF5KCkKLXsKLSAgICBpZiAobV9vdmVyTWluaW11bUxheW91dFRocmVzaG9s
ZCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgCi0gICAgaW50IGVsYXBzZWQgPSBlbGFwc2VkVGlt
ZSgpOwotICAgIG1fb3Zlck1pbmltdW1MYXlvdXRUaHJlc2hvbGQgPSBlbGFwc2VkID4gY0xheW91
dFNjaGVkdWxlVGhyZXNob2xkOwotICAgIAotICAgIC8vIFdlJ2xsIHdhbnQgdG8gc2NoZWR1bGUg
dGhlIHRpbWVyIHRvIGZpcmUgYXQgdGhlIG1pbmltdW0gbGF5b3V0IHRocmVzaG9sZC4KLSAgICBy
ZXR1cm4gbWF4KDAsIGNMYXlvdXRTY2hlZHVsZVRocmVzaG9sZCAtIGVsYXBzZWQpOwotfQotCi1p
bnQgRG9jdW1lbnQ6OmVsYXBzZWRUaW1lKCkgY29uc3QKLXsKLSAgICByZXR1cm4gc3RhdGljX2Nh
c3Q8aW50PigoY3VycmVudFRpbWUoKSAtIG1fc3RhcnRUaW1lKSAqIDEwMDApOwotfQotCi12b2lk
IERvY3VtZW50Ojp3cml0ZShjb25zdCBTZWdtZW50ZWRTdHJpbmcmIHRleHQsIERvY3VtZW50KiBv
d25lckRvY3VtZW50KQotewotICAgIE5lc3RpbmdMZXZlbEluY3JlbWVudGVyIG5lc3RpbmdMZXZl
bEluY3JlbWVudGVyKG1fd3JpdGVSZWN1cnNpb25EZXB0aCk7Ci0KLSAgICBtX3dyaXRlUmVjdXJz
aW9uSXNUb29EZWVwID0gKG1fd3JpdGVSZWN1cnNpb25EZXB0aCA+IDEpICYmIG1fd3JpdGVSZWN1
cnNpb25Jc1Rvb0RlZXA7Ci0gICAgbV93cml0ZVJlY3Vyc2lvbklzVG9vRGVlcCA9IChtX3dyaXRl
UmVjdXJzaW9uRGVwdGggPiBjTWF4V3JpdGVSZWN1cnNpb25EZXB0aCkgfHwgbV93cml0ZVJlY3Vy
c2lvbklzVG9vRGVlcDsKLQotICAgIGlmIChtX3dyaXRlUmVjdXJzaW9uSXNUb29EZWVwKQotICAg
ICAgIHJldHVybjsKLQotI2lmZGVmIElOU1RSVU1FTlRfTEFZT1VUX1NDSEVEVUxJTkcKLSAgICBp
ZiAoIW93bmVyRWxlbWVudCgpKQotICAgICAgICBwcmludGYoIkJlZ2lubmluZyBhIGRvY3VtZW50
LndyaXRlIGF0ICVkXG4iLCBlbGFwc2VkVGltZSgpKTsKLSNlbmRpZgotCi0gICAgYm9vbCBoYXNJ
bnNlcnRpb25Qb2ludCA9IG1fcGFyc2VyICYmIG1fcGFyc2VyLT5oYXNJbnNlcnRpb25Qb2ludCgp
OwotICAgIGlmICghaGFzSW5zZXJ0aW9uUG9pbnQgJiYgbV9pZ25vcmVEZXN0cnVjdGl2ZVdyaXRl
Q291bnQpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmICghaGFzSW5zZXJ0aW9uUG9pbnQpCi0g
ICAgICAgIG9wZW4ob3duZXJEb2N1bWVudCk7Ci0KLSAgICBBU1NFUlQobV9wYXJzZXIpOwotICAg
IG1fcGFyc2VyLT5pbnNlcnQodGV4dCk7Ci0KLSNpZmRlZiBJTlNUUlVNRU5UX0xBWU9VVF9TQ0hF
RFVMSU5HCi0gICAgaWYgKCFvd25lckVsZW1lbnQoKSkKLSAgICAgICAgcHJpbnRmKCJFbmRpbmcg
YSBkb2N1bWVudC53cml0ZSBhdCAlZFxuIiwgZWxhcHNlZFRpbWUoKSk7Ci0jZW5kaWYgICAgCi19
Ci0KLXZvaWQgRG9jdW1lbnQ6OndyaXRlKGNvbnN0IFN0cmluZyYgdGV4dCwgRG9jdW1lbnQqIG93
bmVyRG9jdW1lbnQpCi17Ci0gICAgd3JpdGUoU2VnbWVudGVkU3RyaW5nKHRleHQpLCBvd25lckRv
Y3VtZW50KTsKLX0KLQotdm9pZCBEb2N1bWVudDo6d3JpdGVsbihjb25zdCBTdHJpbmcmIHRleHQs
IERvY3VtZW50KiBvd25lckRvY3VtZW50KQotewotICAgIHdyaXRlKHRleHQsIG93bmVyRG9jdW1l
bnQpOwotICAgIHdyaXRlKCJcbiIsIG93bmVyRG9jdW1lbnQpOwotfQotCi1jb25zdCBLVVJMJiBE
b2N1bWVudDo6dmlydHVhbFVSTCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fdXJsOwotfQotCi1L
VVJMIERvY3VtZW50Ojp2aXJ0dWFsQ29tcGxldGVVUkwoY29uc3QgU3RyaW5nJiB1cmwpIGNvbnN0
Ci17Ci0gICAgcmV0dXJuIGNvbXBsZXRlVVJMKHVybCk7Ci19Ci0KLWRvdWJsZSBEb2N1bWVudDo6
bWluaW11bVRpbWVySW50ZXJ2YWwoKSBjb25zdAotewotICAgIFBhZ2UqIHAgPSBwYWdlKCk7Ci0g
ICAgaWYgKCFwKQotICAgICAgICByZXR1cm4gU2NyaXB0RXhlY3V0aW9uQ29udGV4dDo6bWluaW11
bVRpbWVySW50ZXJ2YWwoKTsKLSAgICByZXR1cm4gcC0+c2V0dGluZ3MoKS0+bWluRE9NVGltZXJJ
bnRlcnZhbCgpOwotfQotCi1FdmVudFRhcmdldCogRG9jdW1lbnQ6OmVycm9yRXZlbnRUYXJnZXQo
KQotewotICAgIHJldHVybiBkb21XaW5kb3coKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6bG9nRXhj
ZXB0aW9uVG9Db25zb2xlKGNvbnN0IFN0cmluZyYgZXJyb3JNZXNzYWdlLCBjb25zdCBTdHJpbmcm
IHNvdXJjZVVSTCwgaW50IGxpbmVOdW1iZXIsIFBhc3NSZWZQdHI8U2NyaXB0Q2FsbFN0YWNrPiBj
YWxsU3RhY2spCi17Ci0gICAgYWRkQ29uc29sZU1lc3NhZ2UoSlNNZXNzYWdlU291cmNlLCBMb2dN
ZXNzYWdlVHlwZSwgRXJyb3JNZXNzYWdlTGV2ZWwsIGVycm9yTWVzc2FnZSwgc291cmNlVVJMLCBs
aW5lTnVtYmVyLCBjYWxsU3RhY2spOwotfQotCi12b2lkIERvY3VtZW50OjpzZXRVUkwoY29uc3Qg
S1VSTCYgdXJsKQotewotICAgIGNvbnN0IEtVUkwmIG5ld1VSTCA9IHVybC5pc0VtcHR5KCkgPyBi
bGFua1VSTCgpIDogdXJsOwotICAgIGlmIChuZXdVUkwgPT0gbV91cmwpCi0gICAgICAgIHJldHVy
bjsKLQotICAgIG1fdXJsID0gbmV3VVJMOwotICAgIG1fZG9jdW1lbnRVUkkgPSBtX3VybC5zdHJp
bmcoKTsKLSAgICB1cGRhdGVCYXNlVVJMKCk7Ci0gICAgY29udGV4dEZlYXR1cmVzKCktPnVybERp
ZENoYW5nZSh0aGlzKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6dXBkYXRlQmFzZVVSTCgpCi17Ci0g
ICAgS1VSTCBvbGRCYXNlVVJMID0gbV9iYXNlVVJMOwotICAgIC8vIERPTSAzIENvcmU6IFdoZW4g
dGhlIERvY3VtZW50IHN1cHBvcnRzIHRoZSBmZWF0dXJlICJIVE1MIiBbRE9NIExldmVsIDIgSFRN
TF0sIHRoZSBiYXNlIFVSSSBpcyBjb21wdXRlZCB1c2luZwotICAgIC8vIGZpcnN0IHRoZSB2YWx1
ZSBvZiB0aGUgaHJlZiBhdHRyaWJ1dGUgb2YgdGhlIEhUTUwgQkFTRSBlbGVtZW50IGlmIGFueSwg
YW5kIHRoZSB2YWx1ZSBvZiB0aGUgZG9jdW1lbnRVUkkgYXR0cmlidXRlCi0gICAgLy8gZnJvbSB0
aGUgRG9jdW1lbnQgaW50ZXJmYWNlIG90aGVyd2lzZS4KLSAgICBpZiAoIW1fYmFzZUVsZW1lbnRV
UkwuaXNFbXB0eSgpKQotICAgICAgICBtX2Jhc2VVUkwgPSBtX2Jhc2VFbGVtZW50VVJMOwotICAg
IGVsc2UgaWYgKCFtX2Jhc2VVUkxPdmVycmlkZS5pc0VtcHR5KCkpCi0gICAgICAgIG1fYmFzZVVS
TCA9IG1fYmFzZVVSTE92ZXJyaWRlOwotICAgIGVsc2UgewotICAgICAgICAvLyBUaGUgZG9jdW1l
bnRVUkkgYXR0cmlidXRlIGlzIHJlYWQtb25seSBmcm9tIEphdmFTY3JpcHQsIGJ1dCB3cml0YWJs
ZSBmcm9tIE9iamVjdGl2ZSBDLCBzbyB3ZSBuZWVkIHRvIHJldGFpbgotICAgICAgICAvLyB0aGlz
IGZhbGxiYWNrIGJlaGF2aW9yLiBXZSB1c2UgYSBudWxsIGJhc2UgVVJMLCBzaW5jZSB0aGUgZG9j
dW1lbnRVUkkgYXR0cmlidXRlIGlzIGFuIGFyYml0cmFyeSBzdHJpbmcKLSAgICAgICAgLy8gYW5k
IERPTSAzIENvcmUgZG9lcyBub3Qgc3BlY2lmeSBob3cgaXQgc2hvdWxkIGJlIHJlc29sdmVkLgot
ICAgICAgICBtX2Jhc2VVUkwgPSBLVVJMKEtVUkwoKSwgZG9jdW1lbnRVUkkoKSk7Ci0gICAgfQot
ICAgIHNlbGVjdG9yUXVlcnlDYWNoZSgpLT5pbnZhbGlkYXRlKCk7Ci0KLSAgICBpZiAoIW1fYmFz
ZVVSTC5pc1ZhbGlkKCkpCi0gICAgICAgIG1fYmFzZVVSTCA9IEtVUkwoKTsKLQotICAgIGlmICht
X2VsZW1TaGVldCkgewotICAgICAgICAvLyBFbGVtZW50IHNoZWV0IGlzIHNpbGx5LiBJdCBuZXZl
ciBjb250YWlucyBhbnl0aGluZy4KLSAgICAgICAgQVNTRVJUKCFtX2VsZW1TaGVldC0+Y29udGVu
dHMoKS0+cnVsZUNvdW50KCkpOwotICAgICAgICBib29sIHVzZXNSZW1Vbml0cyA9IG1fZWxlbVNo
ZWV0LT5jb250ZW50cygpLT51c2VzUmVtVW5pdHMoKTsKLSAgICAgICAgbV9lbGVtU2hlZXQgPSBD
U1NTdHlsZVNoZWV0OjpjcmVhdGVJbmxpbmUodGhpcywgbV9iYXNlVVJMKTsKLSAgICAgICAgLy8g
RklYTUU6IFNvIHdlIGFyZSBub3QgcmVhbGx5IHRoZSBwYXJzZXIuIFRoZSByaWdodCBmaXggaXMg
dG8gZWxpbWluYXRlIHRoZSBlbGVtZW50IHNoZWV0IGNvbXBsZXRlbHkuCi0gICAgICAgIG1fZWxl
bVNoZWV0LT5jb250ZW50cygpLT5wYXJzZXJTZXRVc2VzUmVtVW5pdHModXNlc1JlbVVuaXRzKTsK
LSAgICB9Ci0KLSAgICBpZiAoIWVxdWFsSWdub3JpbmdGcmFnbWVudElkZW50aWZpZXIob2xkQmFz
ZVVSTCwgbV9iYXNlVVJMKSkgewotICAgICAgICAvLyBCYXNlIFVSTCBjaGFuZ2UgY2hhbmdlcyBh
bnkgcmVsYXRpdmUgdmlzaXRlZCBsaW5rcy4KLSAgICAgICAgLy8gRklYTUU6IFRoZXJlIGFyZSBv
dGhlciBVUkxzIGluIHRoZSB0cmVlIHRoYXQgd291bGQgbmVlZCB0byBiZSByZS1ldmFsdWF0ZWQg
b24gZHluYW1pYyBiYXNlIFVSTCBjaGFuZ2UuIFN0eWxlIHNob3VsZCBiZSBpbnZhbGlkYXRlZCB0
b28uCi0gICAgICAgIGZvciAoTm9kZSogbm9kZSA9IGZpcnN0Q2hpbGQoKTsgbm9kZTsgbm9kZSA9
IG5vZGUtPnRyYXZlcnNlTmV4dE5vZGUoKSkgewotICAgICAgICAgICAgaWYgKG5vZGUtPmhhc1Rh
Z05hbWUoYVRhZykpCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTEFuY2hvckVsZW1l
bnQqPihub2RlKS0+aW52YWxpZGF0ZUNhY2hlZFZpc2l0ZWRMaW5rSGFzaCgpOwotICAgICAgICB9
Ci0gICAgfQotfQotCi12b2lkIERvY3VtZW50OjpzZXRCYXNlVVJMT3ZlcnJpZGUoY29uc3QgS1VS
TCYgdXJsKQotewotICAgIG1fYmFzZVVSTE92ZXJyaWRlID0gdXJsOwotICAgIHVwZGF0ZUJhc2VV
UkwoKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6cHJvY2Vzc0Jhc2VFbGVtZW50KCkKLXsKLSAgICAv
LyBGaW5kIHRoZSBmaXJzdCBocmVmIGF0dHJpYnV0ZSBpbiBhIGJhc2UgZWxlbWVudCBhbmQgdGhl
IGZpcnN0IHRhcmdldCBhdHRyaWJ1dGUgaW4gYSBiYXNlIGVsZW1lbnQuCi0gICAgY29uc3QgQXRv
bWljU3RyaW5nKiBocmVmID0gMDsKLSAgICBjb25zdCBBdG9taWNTdHJpbmcqIHRhcmdldCA9IDA7
Ci0gICAgZm9yIChOb2RlKiBub2RlID0gZG9jdW1lbnQoKS0+Zmlyc3RDaGlsZCgpOyBub2RlICYm
ICghaHJlZiB8fCAhdGFyZ2V0KTsgbm9kZSA9IG5vZGUtPnRyYXZlcnNlTmV4dE5vZGUoKSkgewot
ICAgICAgICBpZiAobm9kZS0+aGFzVGFnTmFtZShiYXNlVGFnKSkgewotICAgICAgICAgICAgaWYg
KCFocmVmKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgQXRvbWljU3RyaW5nJiB2YWx1ZSA9IHN0
YXRpY19jYXN0PEVsZW1lbnQqPihub2RlKS0+ZmFzdEdldEF0dHJpYnV0ZShocmVmQXR0cik7Ci0g
ICAgICAgICAgICAgICAgaWYgKCF2YWx1ZS5pc051bGwoKSkKLSAgICAgICAgICAgICAgICAgICAg
aHJlZiA9ICZ2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghdGFyZ2V0KSB7
Ci0gICAgICAgICAgICAgICAgY29uc3QgQXRvbWljU3RyaW5nJiB2YWx1ZSA9IHN0YXRpY19jYXN0
PEVsZW1lbnQqPihub2RlKS0+ZmFzdEdldEF0dHJpYnV0ZSh0YXJnZXRBdHRyKTsKLSAgICAgICAg
ICAgICAgICBpZiAoIXZhbHVlLmlzTnVsbCgpKQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQg
PSAmdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBGSVhN
RTogU2luY2UgdGhpcyBkb2Vzbid0IHNoYXJlIGNvZGUgd2l0aCBjb21wbGV0ZVVSTCBpdCBtYXkg
bm90IGhhbmRsZSBlbmNvZGluZ3MgY29ycmVjdGx5LgotICAgIEtVUkwgYmFzZUVsZW1lbnRVUkw7
Ci0gICAgaWYgKGhyZWYpIHsKLSAgICAgICAgU3RyaW5nIHN0cmlwcGVkSHJlZiA9IHN0cmlwTGVh
ZGluZ0FuZFRyYWlsaW5nSFRNTFNwYWNlcygqaHJlZik7Ci0gICAgICAgIGlmICghc3RyaXBwZWRI
cmVmLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIGJhc2VFbGVtZW50VVJMID0gS1VSTCh1cmwoKSwg
c3RyaXBwZWRIcmVmKTsKLSAgICB9Ci0gICAgaWYgKG1fYmFzZUVsZW1lbnRVUkwgIT0gYmFzZUVs
ZW1lbnRVUkwpIHsKLSAgICAgICAgbV9iYXNlRWxlbWVudFVSTCA9IGJhc2VFbGVtZW50VVJMOwot
ICAgICAgICB1cGRhdGVCYXNlVVJMKCk7Ci0gICAgfQotCi0gICAgbV9iYXNlVGFyZ2V0ID0gdGFy
Z2V0ID8gKnRhcmdldCA6IG51bGxBdG9tOwotfQotCi1TdHJpbmcgRG9jdW1lbnQ6OnVzZXJBZ2Vu
dChjb25zdCBLVVJMJiB1cmwpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZyYW1lKCkgPyBmcmFtZSgp
LT5sb2FkZXIoKS0+dXNlckFnZW50KHVybCkgOiBTdHJpbmcoKTsKLX0KLQotdm9pZCBEb2N1bWVu
dDo6ZGlzYWJsZUV2YWwoY29uc3QgU3RyaW5nJiBlcnJvck1lc3NhZ2UpCi17Ci0gICAgaWYgKCFm
cmFtZSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBmcmFtZSgpLT5zY3JpcHQoKS0+ZGlzYWJs
ZUV2YWwoZXJyb3JNZXNzYWdlKTsKLX0KLQotYm9vbCBEb2N1bWVudDo6Y2FuTmF2aWdhdGUoRnJh
bWUqIHRhcmdldEZyYW1lKQotewotICAgIGlmICghbV9mcmFtZSkKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotCi0gICAgLy8gRklYTUU6IFdlIHNob3VsZG4ndCBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0
aG91dCBhIHRhcmdldCBmcmFtZSwgYnV0Ci0gICAgLy8gZmFzdC9mb3Jtcy9zdWJtaXQtdG8tYmxh
bmstbXVsdGlwbGUtdGltZXMuaHRtbCBkZXBlbmRzIG9uIHRoaXMgZnVuY3Rpb24KLSAgICAvLyBy
ZXR1cm5pbmcgdHJ1ZSB3aGVuIHN1cHBsaWVkIHdpdGggYSAwIHRhcmdldEZyYW1lLgotICAgIGlm
ICghdGFyZ2V0RnJhbWUpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgLy8gRnJhbWUtYnVz
dGluZyBpcyBnZW5lcmFsbHkgYWxsb3dlZCAodW5sZXNzIHdlJ3JlIHNhbmRib3hlZCBhbmQgcHJl
dmVudCBmcm9tIGZyYW1lLWJ1c3RpbmcpLgotICAgIGlmICghaXNTYW5kYm94ZWQoU2FuZGJveFRv
cE5hdmlnYXRpb24pICYmIHRhcmdldEZyYW1lID09IG1fZnJhbWUtPnRyZWUoKS0+dG9wKCkpCi0g
ICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgaWYgKGlzU2FuZGJveGVkKFNhbmRib3hOYXZpZ2F0
aW9uKSkgewotICAgICAgICBpZiAodGFyZ2V0RnJhbWUtPnRyZWUoKS0+aXNEZXNjZW5kYW50T2Yo
bV9mcmFtZSkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICBwcmludE5hdmln
YXRpb25FcnJvck1lc3NhZ2UodGFyZ2V0RnJhbWUsIHVybCgpKTsKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgIH0KLQotICAgIC8vIFRoaXMgaXMgdGhlIG5vcm1hbCBjYXNlLiBBIGRvY3VtZW50
IGNhbiBuYXZpZ2F0ZSBpdHMgZGVjZW5kYW50IGZyYW1lcywKLSAgICAvLyBvciwgbW9yZSBnZW5l
cmFsbHksIGEgZG9jdW1lbnQgY2FuIG5hdmlnYXRlIGEgZnJhbWUgaWYgdGhlIGRvY3VtZW50IGlz
Ci0gICAgLy8gaW4gdGhlIHNhbWUgb3JpZ2luIGFzIGFueSBvZiB0aGF0IGZyYW1lJ3MgYW5jZXN0
b3JzIChpbiB0aGUgZnJhbWUKLSAgICAvLyBoaWVyYXJjaHkpLgotICAgIC8vCi0gICAgLy8gU2Vl
IGh0dHA6Ly93d3cuYWRhbWJhcnRoLmNvbS9wYXBlcnMvMjAwOC9iYXJ0aC1qYWNrc29uLW1pdGNo
ZWxsLnBkZiBmb3IKLSAgICAvLyBoaXN0b3JpY2FsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgc2Vj
dXJpdHkgY2hlY2suCi0gICAgaWYgKGNhbkFjY2Vzc0FuY2VzdG9yKHNlY3VyaXR5T3JpZ2luKCks
IHRhcmdldEZyYW1lKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAvLyBUb3AtbGV2ZWwg
ZnJhbWVzIGFyZSBlYXNpZXIgdG8gbmF2aWdhdGUgdGhhbiBvdGhlciBmcmFtZXMgYmVjYXVzZSB0
aGV5Ci0gICAgLy8gZGlzcGxheSB0aGVpciBVUkxzIGluIHRoZSBhZGRyZXNzIGJhciAoaW4gbW9z
dCBicm93c2VycykuIEhvd2V2ZXIsIHRoZXJlCi0gICAgLy8gYXJlIHN0aWxsIHNvbWUgcmVzdHJp
Y3Rpb25zIG9uIG5hdmlnYXRpb24gdG8gYXZvaWQgbnVpc2FuY2UgYXR0YWNrcy4KLSAgICAvLyBT
cGVjaWZpY2FsbHksIGEgZG9jdW1lbnQgY2FuIG5hdmlnYXRlIGEgdG9wLWxldmVsIGZyYW1lIGlm
IHRoYXQgZnJhbWUKLSAgICAvLyBvcGVuZWQgdGhlIGRvY3VtZW50IG9yIGlmIHRoZSBkb2N1bWVu
dCBpcyB0aGUgc2FtZS1vcmlnaW4gd2l0aCBhbnkgb2YKLSAgICAvLyB0aGUgdG9wLWxldmVsIGZy
YW1lJ3Mgb3BlbmVyJ3MgYW5jZXN0b3JzIChpbiB0aGUgZnJhbWUgaGllcmFyY2h5KS4KLSAgICAv
LwotICAgIC8vIEluIGJvdGggb2YgdGhlc2UgY2FzZXMsIHRoZSBkb2N1bWVudCBwZXJmb3JtaW5n
IHRoZSBuYXZpZ2F0aW9uIGlzIGluCi0gICAgLy8gc29tZSB3YXkgcmVsYXRlZCB0byB0aGUgZnJh
bWUgYmVpbmcgbmF2aWdhdGUgKGUuZy4sIGJ5IHRoZSAib3BlbmVyIgotICAgIC8vIGFuZC9vciAi
cGFyZW50IiByZWxhdGlvbikuIFJlcXVpcmluZyBzb21lIHNvcnQgb2YgcmVsYXRpb24gcHJldmVu
dHMgYQotICAgIC8vIGRvY3VtZW50IGZyb20gbmF2aWdhdGluZyBhcmJpdHJhcnksIHVucmVsYXRl
ZCB0b3AtbGV2ZWwgZnJhbWVzLgotICAgIGlmICghdGFyZ2V0RnJhbWUtPnRyZWUoKS0+cGFyZW50
KCkpIHsKLSAgICAgICAgaWYgKHRhcmdldEZyYW1lID09IG1fZnJhbWUtPmxvYWRlcigpLT5vcGVu
ZXIoKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIGlmIChjYW5BY2Nlc3NB
bmNlc3RvcihzZWN1cml0eU9yaWdpbigpLCB0YXJnZXRGcmFtZS0+bG9hZGVyKCktPm9wZW5lcigp
KSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaW50TmF2aWdhdGlv
bkVycm9yTWVzc2FnZSh0YXJnZXRGcmFtZSwgdXJsKCkpOwotICAgIHJldHVybiBmYWxzZTsKLX0K
LQotRnJhbWUqIERvY3VtZW50OjpmaW5kVW5zYWZlUGFyZW50U2Nyb2xsUHJvcGFnYXRpb25Cb3Vu
ZGFyeSgpCi17Ci0gICAgRnJhbWUqIGN1cnJlbnRGcmFtZSA9IG1fZnJhbWU7Ci0gICAgRnJhbWUq
IGFuY2VzdG9yRnJhbWUgPSBjdXJyZW50RnJhbWUtPnRyZWUoKS0+cGFyZW50KCk7IAotCi0gICAg
d2hpbGUgKGFuY2VzdG9yRnJhbWUpIHsKLSAgICAgICAgaWYgKCFhbmNlc3RvckZyYW1lLT5kb2N1
bWVudCgpLT5zZWN1cml0eU9yaWdpbigpLT5jYW5BY2Nlc3Moc2VjdXJpdHlPcmlnaW4oKSkpCi0g
ICAgICAgICAgICByZXR1cm4gY3VycmVudEZyYW1lOwotICAgICAgICBjdXJyZW50RnJhbWUgPSBh
bmNlc3RvckZyYW1lOwotICAgICAgICBhbmNlc3RvckZyYW1lID0gYW5jZXN0b3JGcmFtZS0+dHJl
ZSgpLT5wYXJlbnQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLUNTU1N0eWxlU2hlZXQq
IERvY3VtZW50OjpwYWdlVXNlclNoZWV0KCkKLXsKLSAgICBpZiAobV9wYWdlVXNlclNoZWV0KQot
ICAgICAgICByZXR1cm4gbV9wYWdlVXNlclNoZWV0LmdldCgpOwotICAgIAotICAgIFBhZ2UqIG93
bmluZ1BhZ2UgPSBwYWdlKCk7Ci0gICAgaWYgKCFvd25pbmdQYWdlKQotICAgICAgICByZXR1cm4g
MDsKLSAgICAKLSAgICBTdHJpbmcgdXNlclNoZWV0VGV4dCA9IG93bmluZ1BhZ2UtPnVzZXJTdHls
ZVNoZWV0KCk7Ci0gICAgaWYgKHVzZXJTaGVldFRleHQuaXNFbXB0eSgpKQotICAgICAgICByZXR1
cm4gMDsKLSAgICAKLSAgICAvLyBQYXJzZSB0aGUgc2hlZXQgYW5kIGNhY2hlIGl0LgotICAgIG1f
cGFnZVVzZXJTaGVldCA9IENTU1N0eWxlU2hlZXQ6OmNyZWF0ZUlubGluZSh0aGlzLCBzZXR0aW5n
cygpLT51c2VyU3R5bGVTaGVldExvY2F0aW9uKCkpOwotICAgIG1fcGFnZVVzZXJTaGVldC0+Y29u
dGVudHMoKS0+c2V0SXNVc2VyU3R5bGVTaGVldCh0cnVlKTsKLSAgICBtX3BhZ2VVc2VyU2hlZXQt
PmNvbnRlbnRzKCktPnBhcnNlU3RyaW5nKHVzZXJTaGVldFRleHQpOwotICAgIHJldHVybiBtX3Bh
Z2VVc2VyU2hlZXQuZ2V0KCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmNsZWFyUGFnZVVzZXJTaGVl
dCgpCi17Ci0gICAgaWYgKG1fcGFnZVVzZXJTaGVldCkgewotICAgICAgICBtX3BhZ2VVc2VyU2hl
ZXQgPSAwOwotICAgICAgICBzdHlsZVJlc29sdmVyQ2hhbmdlZChEZWZlclJlY2FsY1N0eWxlKTsK
LSAgICB9Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnVwZGF0ZVBhZ2VVc2VyU2hlZXQoKQotewotICAg
IGNsZWFyUGFnZVVzZXJTaGVldCgpOwotICAgIGlmIChwYWdlVXNlclNoZWV0KCkpCi0gICAgICAg
IHN0eWxlUmVzb2x2ZXJDaGFuZ2VkKFJlY2FsY1N0eWxlSW1tZWRpYXRlbHkpOwotfQotCi1jb25z
dCBWZWN0b3I8UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4qIERvY3VtZW50OjpwYWdlR3JvdXBVc2Vy
U2hlZXRzKCkgY29uc3QKLXsKLSAgICBpZiAobV9wYWdlR3JvdXBVc2VyU2hlZXRDYWNoZVZhbGlk
KQotICAgICAgICByZXR1cm4gbV9wYWdlR3JvdXBVc2VyU2hlZXRzLmdldCgpOwotICAgIAotICAg
IG1fcGFnZUdyb3VwVXNlclNoZWV0Q2FjaGVWYWxpZCA9IHRydWU7Ci0gICAgCi0gICAgUGFnZSog
b3duaW5nUGFnZSA9IHBhZ2UoKTsKLSAgICBpZiAoIW93bmluZ1BhZ2UpCi0gICAgICAgIHJldHVy
biAwOwotICAgICAgICAKLSAgICBjb25zdCBQYWdlR3JvdXAmIHBhZ2VHcm91cCA9IG93bmluZ1Bh
Z2UtPmdyb3VwKCk7Ci0gICAgY29uc3QgVXNlclN0eWxlU2hlZXRNYXAqIHNoZWV0c01hcCA9IHBh
Z2VHcm91cC51c2VyU3R5bGVTaGVldHMoKTsKLSAgICBpZiAoIXNoZWV0c01hcCkKLSAgICAgICAg
cmV0dXJuIDA7Ci0KLSAgICBVc2VyU3R5bGVTaGVldE1hcDo6Y29uc3RfaXRlcmF0b3IgZW5kID0g
c2hlZXRzTWFwLT5lbmQoKTsKLSAgICBmb3IgKFVzZXJTdHlsZVNoZWV0TWFwOjpjb25zdF9pdGVy
YXRvciBpdCA9IHNoZWV0c01hcC0+YmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAg
IGNvbnN0IFVzZXJTdHlsZVNoZWV0VmVjdG9yKiBzaGVldHMgPSBpdC0+c2Vjb25kLmdldCgpOwot
ICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2hlZXRzLT5zaXplKCk7ICsraSkgewot
ICAgICAgICAgICAgY29uc3QgVXNlclN0eWxlU2hlZXQqIHNoZWV0ID0gc2hlZXRzLT5hdChpKS5n
ZXQoKTsKLSAgICAgICAgICAgIGlmIChzaGVldC0+aW5qZWN0ZWRGcmFtZXMoKSA9PSBJbmplY3RJ
blRvcEZyYW1lT25seSAmJiBvd25lckVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICBjb250aW51
ZTsKLSAgICAgICAgICAgIGlmICghVXNlckNvbnRlbnRVUkxQYXR0ZXJuOjptYXRjaGVzUGF0dGVy
bnModXJsKCksIHNoZWV0LT53aGl0ZWxpc3QoKSwgc2hlZXQtPmJsYWNrbGlzdCgpKSkKLSAgICAg
ICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIFJlZlB0cjxDU1NTdHlsZVNoZWV0PiBn
cm91cFNoZWV0ID0gQ1NTU3R5bGVTaGVldDo6Y3JlYXRlSW5saW5lKGNvbnN0X2Nhc3Q8RG9jdW1l
bnQqPih0aGlzKSwgc2hlZXQtPnVybCgpKTsKLSAgICAgICAgICAgIGlmICghbV9wYWdlR3JvdXBV
c2VyU2hlZXRzKQotICAgICAgICAgICAgICAgIG1fcGFnZUdyb3VwVXNlclNoZWV0cyA9IGFkb3B0
UHRyKG5ldyBWZWN0b3I8UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4pOwotICAgICAgICAgICAgbV9w
YWdlR3JvdXBVc2VyU2hlZXRzLT5hcHBlbmQoZ3JvdXBTaGVldCk7Ci0gICAgICAgICAgICBncm91
cFNoZWV0LT5jb250ZW50cygpLT5zZXRJc1VzZXJTdHlsZVNoZWV0KHNoZWV0LT5sZXZlbCgpID09
IFVzZXJTdHlsZVVzZXJMZXZlbCk7Ci0gICAgICAgICAgICBncm91cFNoZWV0LT5jb250ZW50cygp
LT5wYXJzZVN0cmluZyhzaGVldC0+c291cmNlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAg
cmV0dXJuIG1fcGFnZUdyb3VwVXNlclNoZWV0cy5nZXQoKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6
Y2xlYXJQYWdlR3JvdXBVc2VyU2hlZXRzKCkKLXsKLSAgICBtX3BhZ2VHcm91cFVzZXJTaGVldENh
Y2hlVmFsaWQgPSBmYWxzZTsKLSAgICBpZiAobV9wYWdlR3JvdXBVc2VyU2hlZXRzICYmIG1fcGFn
ZUdyb3VwVXNlclNoZWV0cy0+c2l6ZSgpKSB7Ci0gICAgICAgIG1fcGFnZUdyb3VwVXNlclNoZWV0
cy0+Y2xlYXIoKTsKLSAgICAgICAgc3R5bGVSZXNvbHZlckNoYW5nZWQoRGVmZXJSZWNhbGNTdHls
ZSk7Ci0gICAgfQotfQotCi12b2lkIERvY3VtZW50Ojp1cGRhdGVQYWdlR3JvdXBVc2VyU2hlZXRz
KCkKLXsKLSAgICBjbGVhclBhZ2VHcm91cFVzZXJTaGVldHMoKTsKLSAgICBpZiAocGFnZUdyb3Vw
VXNlclNoZWV0cygpICYmIHBhZ2VHcm91cFVzZXJTaGVldHMoKS0+c2l6ZSgpKQotICAgICAgICBz
dHlsZVJlc29sdmVyQ2hhbmdlZChSZWNhbGNTdHlsZUltbWVkaWF0ZWx5KTsKLX0KLQotdm9pZCBE
b2N1bWVudDo6YWRkVXNlclNoZWV0KFBhc3NSZWZQdHI8U3R5bGVTaGVldENvbnRlbnRzPiB1c2Vy
U2hlZXQpCi17Ci0gICAgaWYgKCFtX3VzZXJTaGVldHMpCi0gICAgICAgIG1fdXNlclNoZWV0cyA9
IGFkb3B0UHRyKG5ldyBWZWN0b3I8UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4pOwotICAgIG1fdXNl
clNoZWV0cy0+YXBwZW5kKENTU1N0eWxlU2hlZXQ6OmNyZWF0ZSh1c2VyU2hlZXQsIHRoaXMpKTsK
LSAgICBzdHlsZVJlc29sdmVyQ2hhbmdlZChSZWNhbGNTdHlsZUltbWVkaWF0ZWx5KTsKLX0KLQot
dm9pZCBEb2N1bWVudDo6c2VhbWxlc3NQYXJlbnRVcGRhdGVkU3R5bGVzaGVldHMoKQotewotICAg
IHN0eWxlUmVzb2x2ZXJDaGFuZ2VkKFJlY2FsY1N0eWxlSW1tZWRpYXRlbHkpOwotfQotCi1DU1NT
dHlsZVNoZWV0KiBEb2N1bWVudDo6ZWxlbWVudFNoZWV0KCkKLXsKLSAgICBpZiAoIW1fZWxlbVNo
ZWV0KQotICAgICAgICBtX2VsZW1TaGVldCA9IENTU1N0eWxlU2hlZXQ6OmNyZWF0ZUlubGluZSh0
aGlzLCBtX2Jhc2VVUkwpOwotICAgIHJldHVybiBtX2VsZW1TaGVldC5nZXQoKTsKLX0KLQotaW50
IERvY3VtZW50Ojpub2RlQWJzSW5kZXgoTm9kZSAqbm9kZSkKLXsKLSAgICBBU1NFUlQobm9kZS0+
ZG9jdW1lbnQoKSA9PSB0aGlzKTsKLQotICAgIGludCBhYnNJbmRleCA9IDA7Ci0gICAgZm9yIChO
b2RlKiBuID0gbm9kZTsgbiAmJiBuICE9IHRoaXM7IG4gPSBuLT50cmF2ZXJzZVByZXZpb3VzTm9k
ZSgpKQotICAgICAgICBhYnNJbmRleCsrOwotICAgIHJldHVybiBhYnNJbmRleDsKLX0KLQotTm9k
ZSogRG9jdW1lbnQ6Om5vZGVXaXRoQWJzSW5kZXgoaW50IGFic0luZGV4KQotewotICAgIE5vZGUq
IG4gPSB0aGlzOwotICAgIGZvciAoaW50IGkgPSAwOyBuICYmIChpIDwgYWJzSW5kZXgpOyBpKysp
Ci0gICAgICAgIG4gPSBuLT50cmF2ZXJzZU5leHROb2RlKCk7Ci0gICAgcmV0dXJuIG47Ci19Ci0K
LXZvaWQgRG9jdW1lbnQ6OnByb2Nlc3NIdHRwRXF1aXYoY29uc3QgU3RyaW5nJiBlcXVpdiwgY29u
c3QgU3RyaW5nJiBjb250ZW50KQotewotICAgIEFTU0VSVCghZXF1aXYuaXNOdWxsKCkgJiYgIWNv
bnRlbnQuaXNOdWxsKCkpOwotCi0gICAgRnJhbWUqIGZyYW1lID0gdGhpcy0+ZnJhbWUoKTsKLQot
ICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZShlcXVpdiwgImRlZmF1bHQtc3R5bGUiKSkgewotICAg
ICAgICAvLyBUaGUgcHJlZmVycmVkIHN0eWxlIHNldCBoYXMgYmVlbiBvdmVycmlkZGVuIGFzIHBl
ciBzZWN0aW9uIAotICAgICAgICAvLyAxNC4zLjIgb2YgdGhlIEhUTUw0LjAgc3BlY2lmaWNhdGlv
bi4gIFdlIG5lZWQgdG8gdXBkYXRlIHRoZQotICAgICAgICAvLyBzaGVldCB1c2VkIHZhcmlhYmxl
IGFuZCB0aGVuIHVwZGF0ZSBvdXIgc3R5bGUgc2VsZWN0b3IuIAotICAgICAgICAvLyBGb3IgbW9y
ZSBpbmZvLCBzZWUgdGhlIHRlc3QgYXQ6Ci0gICAgICAgIC8vIGh0dHA6Ly93d3cuaGl4aWUuY2gv
dGVzdHMvZXZpbC9jc3MvaW1wb3J0L21haW4vcHJlZmVycmVkLmh0bWwKLSAgICAgICAgLy8gLWR3
aAotICAgICAgICBtX3NlbGVjdGVkU3R5bGVzaGVldFNldCA9IGNvbnRlbnQ7Ci0gICAgICAgIG1f
cHJlZmVycmVkU3R5bGVzaGVldFNldCA9IGNvbnRlbnQ7Ci0gICAgICAgIHN0eWxlUmVzb2x2ZXJD
aGFuZ2VkKERlZmVyUmVjYWxjU3R5bGUpOwotICAgIH0gZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nh
c2UoZXF1aXYsICJyZWZyZXNoIikpIHsKLSAgICAgICAgZG91YmxlIGRlbGF5OwotICAgICAgICBT
dHJpbmcgdXJsOwotICAgICAgICBpZiAoZnJhbWUgJiYgcGFyc2VIVFRQUmVmcmVzaChjb250ZW50
LCB0cnVlLCBkZWxheSwgdXJsKSkgewotICAgICAgICAgICAgaWYgKHVybC5pc0VtcHR5KCkpCi0g
ICAgICAgICAgICAgICAgdXJsID0gbV91cmwuc3RyaW5nKCk7Ci0gICAgICAgICAgICBlbHNlCi0g
ICAgICAgICAgICAgICAgdXJsID0gY29tcGxldGVVUkwodXJsKS5zdHJpbmcoKTsKLSAgICAgICAg
ICAgIGZyYW1lLT5uYXZpZ2F0aW9uU2NoZWR1bGVyKCktPnNjaGVkdWxlUmVkaXJlY3QoZGVsYXks
IHVybCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGVxdWl2
LCAic2V0LWNvb2tpZSIpKSB7Ci0gICAgICAgIC8vIEZJWE1FOiBtYWtlIHNldENvb2tpZSB3b3Jr
IG9uIFhNTCBkb2N1bWVudHMgdG9vOyBlLmcuIGluIGNhc2Ugb2YgPGh0bWw6bWV0YSAuLi4uLj4K
LSAgICAgICAgaWYgKGlzSFRNTERvY3VtZW50KCkpIHsKLSAgICAgICAgICAgIEV4Y2VwdGlvbkNv
ZGUgZWM7IC8vIEV4Y2VwdGlvbiAoZm9yIHNhbmRib3hlZCBkb2N1bWVudHMpIGlnbm9yZWQuCi0g
ICAgICAgICAgICBzdGF0aWNfY2FzdDxIVE1MRG9jdW1lbnQqPih0aGlzKS0+c2V0Q29va2llKGNv
bnRlbnQsIGVjKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2Uo
ZXF1aXYsICJjb250ZW50LWxhbmd1YWdlIikpCi0gICAgICAgIHNldENvbnRlbnRMYW5ndWFnZShj
b250ZW50KTsKLSAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZShlcXVpdiwgIngtZG5zLXBy
ZWZldGNoLWNvbnRyb2wiKSkKLSAgICAgICAgcGFyc2VETlNQcmVmZXRjaENvbnRyb2xIZWFkZXIo
Y29udGVudCk7Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoZXF1aXYsICJ4LWZyYW1l
LW9wdGlvbnMiKSkgewotICAgICAgICBpZiAoZnJhbWUpIHsKLSAgICAgICAgICAgIEZyYW1lTG9h
ZGVyKiBmcmFtZUxvYWRlciA9IGZyYW1lLT5sb2FkZXIoKTsKLSAgICAgICAgICAgIGlmIChmcmFt
ZUxvYWRlci0+c2hvdWxkSW50ZXJydXB0TG9hZEZvclhGcmFtZU9wdGlvbnMoY29udGVudCwgdXJs
KCkpKSB7Ci0gICAgICAgICAgICAgICAgZnJhbWVMb2FkZXItPnN0b3BBbGxMb2FkZXJzKCk7Ci0g
ICAgICAgICAgICAgICAgZnJhbWUtPm5hdmlnYXRpb25TY2hlZHVsZXIoKS0+c2NoZWR1bGVMb2Nh
dGlvbkNoYW5nZShzZWN1cml0eU9yaWdpbigpLCBibGFua1VSTCgpLCBTdHJpbmcoKSk7Ci0KLSAg
ICAgICAgICAgICAgICBERUZJTkVfU1RBVElDX0xPQ0FMKFN0cmluZywgY29uc29sZU1lc3NhZ2Us
IChBU0NJSUxpdGVyYWwoIlJlZnVzZWQgdG8gZGlzcGxheSBkb2N1bWVudCBiZWNhdXNlIGRpc3Bs
YXkgZm9yYmlkZGVuIGJ5IFgtRnJhbWUtT3B0aW9ucy5cbiIpKSk7Ci0gICAgICAgICAgICAgICAg
YWRkQ29uc29sZU1lc3NhZ2UoSlNNZXNzYWdlU291cmNlLCBMb2dNZXNzYWdlVHlwZSwgRXJyb3JN
ZXNzYWdlTGV2ZWwsIGNvbnNvbGVNZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQot
ICAgIH0gZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoZXF1aXYsICJ4LXdlYmtpdC1jc3AiKSkK
LSAgICAgICAgY29udGVudFNlY3VyaXR5UG9saWN5KCktPmRpZFJlY2VpdmVIZWFkZXIoY29udGVu
dCwgQ29udGVudFNlY3VyaXR5UG9saWN5OjpFbmZvcmNlUG9saWN5KTsKLSAgICBlbHNlIGlmIChl
cXVhbElnbm9yaW5nQ2FzZShlcXVpdiwgIngtd2Via2l0LWNzcC1yZXBvcnQtb25seSIpKQotICAg
ICAgICBjb250ZW50U2VjdXJpdHlQb2xpY3koKS0+ZGlkUmVjZWl2ZUhlYWRlcihjb250ZW50LCBD
b250ZW50U2VjdXJpdHlQb2xpY3k6OlJlcG9ydE9ubHkpOwotfQotCi0vLyBUaG91Z2ggaXNzcGFj
ZSgpIGNvbnNpZGVycyBcdCBhbmQgXHYgdG8gYmUgd2hpdGVzcGFjZSwgV2luIElFIGRvZXNuJ3Qu
Ci1zdGF0aWMgYm9vbCBpc1NlcGFyYXRvcihVQ2hhciBjKQotewotICAgIHJldHVybiBjID09ICcg
JyB8fCBjID09ICdcdCcgfHwgYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJyB8fCBjID09ICc9JyB8fCBj
ID09ICcsJyB8fCBjID09ICdcMCc7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnByb2Nlc3NBcmd1bWVu
dHMoY29uc3QgU3RyaW5nJiBmZWF0dXJlcywgdm9pZCogZGF0YSwgQXJndW1lbnRzQ2FsbGJhY2sg
Y2FsbGJhY2spCi17Ci0gICAgLy8gVHJlYWQgbGlnaHRseSBpbiB0aGlzIGNvZGUgLS0gaXQgd2Fz
IHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBtaW1pYyBXaW4gSUUncyBwYXJzaW5nIGJlaGF2aW9y
LgotICAgIGludCBrZXlCZWdpbiwga2V5RW5kOwotICAgIGludCB2YWx1ZUJlZ2luLCB2YWx1ZUVu
ZDsKLQotICAgIGludCBpID0gMDsKLSAgICBpbnQgbGVuZ3RoID0gZmVhdHVyZXMubGVuZ3RoKCk7
Ci0gICAgU3RyaW5nIGJ1ZmZlciA9IGZlYXR1cmVzLmxvd2VyKCk7Ci0gICAgd2hpbGUgKGkgPCBs
ZW5ndGgpIHsKLSAgICAgICAgLy8gc2tpcCB0byBmaXJzdCBub24tc2VwYXJhdG9yLCBidXQgZG9u
J3Qgc2tpcCBwYXN0IHRoZSBlbmQgb2YgdGhlIHN0cmluZwotICAgICAgICB3aGlsZSAoaXNTZXBh
cmF0b3IoYnVmZmVyW2ldKSkgewotICAgICAgICAgICAgaWYgKGkgPj0gbGVuZ3RoKQotICAgICAg
ICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgaSsrOwotICAgICAgICB9Ci0gICAgICAgIGtl
eUJlZ2luID0gaTsKLQotICAgICAgICAvLyBza2lwIHRvIGZpcnN0IHNlcGFyYXRvcgotICAgICAg
ICB3aGlsZSAoIWlzU2VwYXJhdG9yKGJ1ZmZlcltpXSkpCi0gICAgICAgICAgICBpKys7Ci0gICAg
ICAgIGtleUVuZCA9IGk7Ci0KLSAgICAgICAgLy8gc2tpcCB0byBmaXJzdCAnPScsIGJ1dCBkb24n
dCBza2lwIHBhc3QgYSAnLCcgb3IgdGhlIGVuZCBvZiB0aGUgc3RyaW5nCi0gICAgICAgIHdoaWxl
IChidWZmZXJbaV0gIT0gJz0nKSB7Ci0gICAgICAgICAgICBpZiAoYnVmZmVyW2ldID09ICcsJyB8
fCBpID49IGxlbmd0aCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGkrKzsK
LSAgICAgICAgfQotCi0gICAgICAgIC8vIHNraXAgdG8gZmlyc3Qgbm9uLXNlcGFyYXRvciwgYnV0
IGRvbid0IHNraXAgcGFzdCBhICcsJyBvciB0aGUgZW5kIG9mIHRoZSBzdHJpbmcKLSAgICAgICAg
d2hpbGUgKGlzU2VwYXJhdG9yKGJ1ZmZlcltpXSkpIHsKLSAgICAgICAgICAgIGlmIChidWZmZXJb
aV0gPT0gJywnIHx8IGkgPj0gbGVuZ3RoKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICAgICAgaSsrOwotICAgICAgICB9Ci0gICAgICAgIHZhbHVlQmVnaW4gPSBpOwotCi0gICAgICAg
IC8vIHNraXAgdG8gZmlyc3Qgc2VwYXJhdG9yCi0gICAgICAgIHdoaWxlICghaXNTZXBhcmF0b3Io
YnVmZmVyW2ldKSkKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgdmFsdWVFbmQgPSBpOwotCi0g
ICAgICAgIEFTU0VSVChpIDw9IGxlbmd0aCk7Ci0KLSAgICAgICAgU3RyaW5nIGtleVN0cmluZyA9
IGJ1ZmZlci5zdWJzdHJpbmcoa2V5QmVnaW4sIGtleUVuZCAtIGtleUJlZ2luKTsKLSAgICAgICAg
U3RyaW5nIHZhbHVlU3RyaW5nID0gYnVmZmVyLnN1YnN0cmluZyh2YWx1ZUJlZ2luLCB2YWx1ZUVu
ZCAtIHZhbHVlQmVnaW4pOwotICAgICAgICBjYWxsYmFjayhrZXlTdHJpbmcsIHZhbHVlU3RyaW5n
LCB0aGlzLCBkYXRhKTsKLSAgICB9Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnByb2Nlc3NWaWV3cG9y
dChjb25zdCBTdHJpbmcmIGZlYXR1cmVzLCBWaWV3cG9ydEFyZ3VtZW50czo6VHlwZSBvcmlnaW4p
Ci17Ci0gICAgQVNTRVJUKCFmZWF0dXJlcy5pc051bGwoKSk7Ci0KLSAgICBpZiAob3JpZ2luIDwg
bV92aWV3cG9ydEFyZ3VtZW50cy50eXBlKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX3ZpZXdw
b3J0QXJndW1lbnRzID0gVmlld3BvcnRBcmd1bWVudHMob3JpZ2luKTsKLSAgICBwcm9jZXNzQXJn
dW1lbnRzKGZlYXR1cmVzLCAodm9pZCopJm1fdmlld3BvcnRBcmd1bWVudHMsICZzZXRWaWV3cG9y
dEZlYXR1cmUpOwotCi0gICAgdXBkYXRlVmlld3BvcnRBcmd1bWVudHMoKTsKLX0KLQotdm9pZCBE
b2N1bWVudDo6dXBkYXRlVmlld3BvcnRBcmd1bWVudHMoKQotewotICAgIGlmIChwYWdlKCkgJiYg
cGFnZSgpLT5tYWluRnJhbWUoKSA9PSBmcmFtZSgpKSB7Ci0jaWZuZGVmIE5ERUJVRwotICAgICAg
ICBtX2RpZERpc3BhdGNoVmlld3BvcnRQcm9wZXJ0aWVzQ2hhbmdlZCA9IHRydWU7Ci0jZW5kaWYK
LSAgICAgICAgcGFnZSgpLT5jaHJvbWUoKS0+ZGlzcGF0Y2hWaWV3cG9ydFByb3BlcnRpZXNEaWRD
aGFuZ2UobV92aWV3cG9ydEFyZ3VtZW50cyk7Ci0gICAgfQotfQotCi12b2lkIERvY3VtZW50Ojpw
cm9jZXNzUmVmZXJyZXJQb2xpY3koY29uc3QgU3RyaW5nJiBwb2xpY3kpCi17Ci0gICAgQVNTRVJU
KCFwb2xpY3kuaXNOdWxsKCkpOwotCi0gICAgbV9yZWZlcnJlclBvbGljeSA9IFJlZmVycmVyUG9s
aWN5RGVmYXVsdDsKLQotICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZShwb2xpY3ksICJuZXZlciIp
KQotICAgICAgICBtX3JlZmVycmVyUG9saWN5ID0gUmVmZXJyZXJQb2xpY3lOZXZlcjsKLSAgICBl
bHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZShwb2xpY3ksICJhbHdheXMiKSkKLSAgICAgICAgbV9y
ZWZlcnJlclBvbGljeSA9IFJlZmVycmVyUG9saWN5QWx3YXlzOwotICAgIGVsc2UgaWYgKGVxdWFs
SWdub3JpbmdDYXNlKHBvbGljeSwgIm9yaWdpbiIpKQotICAgICAgICBtX3JlZmVycmVyUG9saWN5
ID0gUmVmZXJyZXJQb2xpY3lPcmlnaW47Ci19Ci0KLU1vdXNlRXZlbnRXaXRoSGl0VGVzdFJlc3Vs
dHMgRG9jdW1lbnQ6OnByZXBhcmVNb3VzZUV2ZW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiByZXF1
ZXN0LCBjb25zdCBMYXlvdXRQb2ludCYgZG9jdW1lbnRQb2ludCwgY29uc3QgUGxhdGZvcm1Nb3Vz
ZUV2ZW50JiBldmVudCkKLXsKLSAgICBBU1NFUlQoIXJlbmRlcmVyKCkgfHwgcmVuZGVyZXIoKS0+
aXNSZW5kZXJWaWV3KCkpOwotCi0gICAgaWYgKCFyZW5kZXJlcigpKQotICAgICAgICByZXR1cm4g
TW91c2VFdmVudFdpdGhIaXRUZXN0UmVzdWx0cyhldmVudCwgSGl0VGVzdFJlc3VsdChMYXlvdXRQ
b2ludCgpKSk7Ci0KLSAgICBIaXRUZXN0UmVzdWx0IHJlc3VsdChkb2N1bWVudFBvaW50KTsKLSAg
ICByZW5kZXJWaWV3KCktPmhpdFRlc3QocmVxdWVzdCwgcmVzdWx0KTsKLQotICAgIGlmICghcmVx
dWVzdC5yZWFkT25seSgpKQotICAgICAgICB1cGRhdGVTdHlsZUlmTmVlZGVkKCk7Ci0KLSAgICBy
ZXR1cm4gTW91c2VFdmVudFdpdGhIaXRUZXN0UmVzdWx0cyhldmVudCwgcmVzdWx0KTsKLX0KLQot
Ly8gRE9NIFNlY3Rpb24gMS4xLjEKLWJvb2wgRG9jdW1lbnQ6OmNoaWxkVHlwZUFsbG93ZWQoTm9k
ZVR5cGUgdHlwZSkgY29uc3QKLXsKLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIEFUVFJJ
QlVURV9OT0RFOgotICAgIGNhc2UgQ0RBVEFfU0VDVElPTl9OT0RFOgotICAgIGNhc2UgRE9DVU1F
TlRfRlJBR01FTlRfTk9ERToKLSAgICBjYXNlIERPQ1VNRU5UX05PREU6Ci0gICAgY2FzZSBFTlRJ
VFlfTk9ERToKLSAgICBjYXNlIEVOVElUWV9SRUZFUkVOQ0VfTk9ERToKLSAgICBjYXNlIE5PVEFU
SU9OX05PREU6Ci0gICAgY2FzZSBURVhUX05PREU6Ci0gICAgY2FzZSBYUEFUSF9OQU1FU1BBQ0Vf
Tk9ERToKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGNhc2UgQ09NTUVOVF9OT0RFOgotICAg
IGNhc2UgUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFOgotICAgICAgICByZXR1cm4gdHJ1ZTsK
LSAgICBjYXNlIERPQ1VNRU5UX1RZUEVfTk9ERToKLSAgICBjYXNlIEVMRU1FTlRfTk9ERToKLSAg
ICAgICAgLy8gRG9jdW1lbnRzIG1heSBjb250YWluIG5vIG1vcmUgdGhhbiBvbmUgb2YgZWFjaCBv
ZiB0aGVzZS4KLSAgICAgICAgLy8gKE9uZSBFbGVtZW50IGFuZCBvbmUgRG9jdW1lbnRUeXBlLikK
LSAgICAgICAgZm9yIChOb2RlKiBjID0gZmlyc3RDaGlsZCgpOyBjOyBjID0gYy0+bmV4dFNpYmxp
bmcoKSkKLSAgICAgICAgICAgIGlmIChjLT5ub2RlVHlwZSgpID09IHR5cGUpCi0gICAgICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0
dXJuIGZhbHNlOwotfQotCi1ib29sIERvY3VtZW50OjpjYW5SZXBsYWNlQ2hpbGQoTm9kZSogbmV3
Q2hpbGQsIE5vZGUqIG9sZENoaWxkKQotewotICAgIGlmICghb2xkQ2hpbGQpCi0gICAgICAgIC8v
IENvbnRhaW5lck5vZGU6OnJlcGxhY2VDaGlsZCB3aWxsIHJhaXNlIGEgTk9UX0ZPVU5EX0VSUi4K
LSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBpZiAob2xkQ2hpbGQtPm5vZGVUeXBlKCkgPT0g
bmV3Q2hpbGQtPm5vZGVUeXBlKCkpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgaW50IG51
bURvY3R5cGVzID0gMDsKLSAgICBpbnQgbnVtRWxlbWVudHMgPSAwOwotCi0gICAgLy8gRmlyc3Qs
IGNoZWNrIGhvdyBtYW55IGRvY3R5cGVzIGFuZCBlbGVtZW50cyB3ZSBoYXZlLCBub3QgY291bnRp
bmcKLSAgICAvLyB0aGUgY2hpbGQgd2UncmUgYWJvdXQgdG8gcmVtb3ZlLgotICAgIGZvciAoTm9k
ZSogYyA9IGZpcnN0Q2hpbGQoKTsgYzsgYyA9IGMtPm5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAg
aWYgKGMgPT0gb2xkQ2hpbGQpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgCi0gICAg
ICAgIHN3aXRjaCAoYy0+bm9kZVR5cGUoKSkgewotICAgICAgICBjYXNlIERPQ1VNRU5UX1RZUEVf
Tk9ERToKLSAgICAgICAgICAgIG51bURvY3R5cGVzKys7Ci0gICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgY2FzZSBFTEVNRU5UX05PREU6Ci0gICAgICAgICAgICBudW1FbGVtZW50cysrOwotICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvLyBUaGVuLCBzZWUgaG93IG1hbnkgZG9jdHlwZXMg
YW5kIGVsZW1lbnRzIG1pZ2h0IGJlIGFkZGVkIGJ5IHRoZSBuZXcgY2hpbGQuCi0gICAgaWYgKG5l
d0NoaWxkLT5ub2RlVHlwZSgpID09IERPQ1VNRU5UX0ZSQUdNRU5UX05PREUpIHsKLSAgICAgICAg
Zm9yIChOb2RlKiBjID0gbmV3Q2hpbGQtPmZpcnN0Q2hpbGQoKTsgYzsgYyA9IGMtPm5leHRTaWJs
aW5nKCkpIHsKLSAgICAgICAgICAgIHN3aXRjaCAoYy0+bm9kZVR5cGUoKSkgewotICAgICAgICAg
ICAgY2FzZSBBVFRSSUJVVEVfTk9ERToKLSAgICAgICAgICAgIGNhc2UgQ0RBVEFfU0VDVElPTl9O
T0RFOgotICAgICAgICAgICAgY2FzZSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFOgotICAgICAgICAg
ICAgY2FzZSBET0NVTUVOVF9OT0RFOgotICAgICAgICAgICAgY2FzZSBFTlRJVFlfTk9ERToKLSAg
ICAgICAgICAgIGNhc2UgRU5USVRZX1JFRkVSRU5DRV9OT0RFOgotICAgICAgICAgICAgY2FzZSBO
T1RBVElPTl9OT0RFOgotICAgICAgICAgICAgY2FzZSBURVhUX05PREU6Ci0gICAgICAgICAgICBj
YXNlIFhQQVRIX05BTUVTUEFDRV9OT0RFOgotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICAgICAgICAgIGNhc2UgQ09NTUVOVF9OT0RFOgotICAgICAgICAgICAgY2FzZSBQUk9DRVNT
SU5HX0lOU1RSVUNUSU9OX05PREU6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAg
ICBjYXNlIERPQ1VNRU5UX1RZUEVfTk9ERToKLSAgICAgICAgICAgICAgICBudW1Eb2N0eXBlcysr
OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBFTEVNRU5UX05PREU6
Ci0gICAgICAgICAgICAgICAgbnVtRWxlbWVudHMrKzsKLSAgICAgICAgICAgICAgICBicmVhazsK
LSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAo
bmV3Q2hpbGQtPm5vZGVUeXBlKCkpIHsKLSAgICAgICAgY2FzZSBBVFRSSUJVVEVfTk9ERToKLSAg
ICAgICAgY2FzZSBDREFUQV9TRUNUSU9OX05PREU6Ci0gICAgICAgIGNhc2UgRE9DVU1FTlRfRlJB
R01FTlRfTk9ERToKLSAgICAgICAgY2FzZSBET0NVTUVOVF9OT0RFOgotICAgICAgICBjYXNlIEVO
VElUWV9OT0RFOgotICAgICAgICBjYXNlIEVOVElUWV9SRUZFUkVOQ0VfTk9ERToKLSAgICAgICAg
Y2FzZSBOT1RBVElPTl9OT0RFOgotICAgICAgICBjYXNlIFRFWFRfTk9ERToKLSAgICAgICAgY2Fz
ZSBYUEFUSF9OQU1FU1BBQ0VfTk9ERToKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAg
ICAgY2FzZSBDT01NRU5UX05PREU6Ci0gICAgICAgIGNhc2UgUFJPQ0VTU0lOR19JTlNUUlVDVElP
Tl9OT0RFOgotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGNhc2UgRE9DVU1FTlRf
VFlQRV9OT0RFOgotICAgICAgICAgICAgbnVtRG9jdHlwZXMrKzsKLSAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICBjYXNlIEVMRU1FTlRfTk9ERToKLSAgICAgICAgICAgIG51bUVsZW1lbnRzKys7
Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfSAgICAgICAgICAgICAgICAKLSAgICB9Ci0g
ICAgICAgIAotICAgIGlmIChudW1FbGVtZW50cyA+IDEgfHwgbnVtRG9jdHlwZXMgPiAxKQotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLVBhc3NSZWZQ
dHI8Tm9kZT4gRG9jdW1lbnQ6OmNsb25lTm9kZShib29sIC8qZGVlcCovKQotewotICAgIC8vIFNw
ZWMgc2F5cyBjbG9uaW5nIERvY3VtZW50IG5vZGVzIGlzICJpbXBsZW1lbnRhdGlvbiBkZXBlbmRl
bnQiCi0gICAgLy8gc28gd2UgZG8gbm90IHN1cHBvcnQgaXQuLi4KLSAgICByZXR1cm4gMDsKLX0K
LQotU3R5bGVTaGVldExpc3QqIERvY3VtZW50OjpzdHlsZVNoZWV0cygpCi17Ci0gICAgcmV0dXJu
IG1fc3R5bGVTaGVldHMuZ2V0KCk7Ci19Ci0KLVN0cmluZyBEb2N1bWVudDo6cHJlZmVycmVkU3R5
bGVzaGVldFNldCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcHJlZmVycmVkU3R5bGVzaGVldFNl
dDsKLX0KLQotU3RyaW5nIERvY3VtZW50OjpzZWxlY3RlZFN0eWxlc2hlZXRTZXQoKSBjb25zdAot
ewotICAgIHJldHVybiBtX3NlbGVjdGVkU3R5bGVzaGVldFNldDsKLX0KLQotdm9pZCBEb2N1bWVu
dDo6c2V0U2VsZWN0ZWRTdHlsZXNoZWV0U2V0KGNvbnN0IFN0cmluZyYgYVN0cmluZykKLXsKLSAg
ICBtX3NlbGVjdGVkU3R5bGVzaGVldFNldCA9IGFTdHJpbmc7Ci0gICAgc3R5bGVSZXNvbHZlckNo
YW5nZWQoRGVmZXJSZWNhbGNTdHlsZSk7Ci19Ci0KLS8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3
aGVuZXZlciBhIHRvcC1sZXZlbCBzdHlsZXNoZWV0IGhhcyBmaW5pc2hlZCBsb2FkaW5nLgotdm9p
ZCBEb2N1bWVudDo6cmVtb3ZlUGVuZGluZ1NoZWV0KFJlbW92ZVBlbmRpbmdTaGVldE5vdGlmaWNh
dGlvblR5cGUgbm90aWZpY2F0aW9uKQotewotICAgIC8vIE1ha2Ugc3VyZSB3ZSBrbmV3IHRoaXMg
c2hlZXQgd2FzIHBlbmRpbmcsIGFuZCB0aGF0IG91ciBjb3VudCBpc24ndCBvdXQgb2Ygc3luYy4K
LSAgICBBU1NFUlQobV9wZW5kaW5nU3R5bGVzaGVldHMgPiAwKTsKLQotICAgIG1fcGVuZGluZ1N0
eWxlc2hlZXRzLS07Ci0gICAgCi0jaWZkZWYgSU5TVFJVTUVOVF9MQVlPVVRfU0NIRURVTElORwot
ICAgIGlmICghb3duZXJFbGVtZW50KCkpCi0gICAgICAgIHByaW50ZigiU3R5bGVzaGVldCBsb2Fk
ZWQgYXQgdGltZSAlZC4gJWQgc3R5bGVzaGVldHMgc3RpbGwgcmVtYWluLlxuIiwgZWxhcHNlZFRp
bWUoKSwgbV9wZW5kaW5nU3R5bGVzaGVldHMpOwotI2VuZGlmCi0KLSAgICBpZiAobV9wZW5kaW5n
U3R5bGVzaGVldHMpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmIChub3RpZmljYXRpb24gPT0g
UmVtb3ZlUGVuZGluZ1NoZWV0Tm90aWZ5TGF0ZXIpIHsKLSAgICAgICAgc2V0TmVlZHNOb3RpZnlS
ZW1vdmVBbGxQZW5kaW5nU3R5bGVzaGVldCgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAg
IAotICAgIGRpZFJlbW92ZUFsbFBlbmRpbmdTdHlsZXNoZWV0KCk7Ci19Ci0KLXZvaWQgRG9jdW1l
bnQ6OmRpZFJlbW92ZUFsbFBlbmRpbmdTdHlsZXNoZWV0KCkKLXsKLSAgICBtX25lZWRzTm90aWZ5
UmVtb3ZlQWxsUGVuZGluZ1N0eWxlc2hlZXQgPSBmYWxzZTsKLQotICAgIHN0eWxlUmVzb2x2ZXJD
aGFuZ2VkKFJlY2FsY1N0eWxlSWZOZWVkZWQpOwotCi0gICAgaWYgKFNjcmlwdGFibGVEb2N1bWVu
dFBhcnNlciogcGFyc2VyID0gc2NyaXB0YWJsZURvY3VtZW50UGFyc2VyKCkpCi0gICAgICAgIHBh
cnNlci0+ZXhlY3V0ZVNjcmlwdHNXYWl0aW5nRm9yU3R5bGVzaGVldHMoKTsKLQotICAgIGlmICht
X2dvdG9BbmNob3JOZWVkZWRBZnRlclN0eWxlc2hlZXRzTG9hZCAmJiB2aWV3KCkpCi0gICAgICAg
IHZpZXcoKS0+c2Nyb2xsVG9GcmFnbWVudChtX3VybCk7Ci19Ci0KLQotdm9pZCBEb2N1bWVudDo6
ZXZhbHVhdGVNZWRpYVF1ZXJ5TGlzdCgpCi17Ci0gICAgaWYgKG1fbWVkaWFRdWVyeU1hdGNoZXIp
Ci0gICAgICAgIG1fbWVkaWFRdWVyeU1hdGNoZXItPnN0eWxlUmVzb2x2ZXJDaGFuZ2VkKCk7Ci19
Ci0KLXZvaWQgRG9jdW1lbnQ6OnN0eWxlUmVzb2x2ZXJDaGFuZ2VkKFN0eWxlUmVzb2x2ZXJVcGRh
dGVGbGFnIHVwZGF0ZUZsYWcpCi17Ci0gICAgLy8gRG9uJ3QgYm90aGVyIHVwZGF0aW5nLCBzaW5j
ZSB3ZSBoYXZlbid0IGxvYWRlZCBhbGwgb3VyIHN0eWxlIGluZm8geWV0Ci0gICAgLy8gYW5kIGhh
dmVuJ3QgY2FsY3VsYXRlZCB0aGUgc3R5bGUgc2VsZWN0b3IgZm9yIHRoZSBmaXJzdCB0aW1lLgot
ICAgIGlmICghYXR0YWNoZWQoKSB8fCAoIW1fZGlkQ2FsY3VsYXRlU3R5bGVSZXNvbHZlciAmJiAh
aGF2ZVN0eWxlc2hlZXRzTG9hZGVkKCkpKSB7Ci0gICAgICAgIG1fc3R5bGVSZXNvbHZlci5jbGVh
cigpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0jaWZkZWYgSU5TVFJVTUVOVF9MQVlPVVRf
U0NIRURVTElORwotICAgIGlmICghb3duZXJFbGVtZW50KCkpCi0gICAgICAgIHByaW50ZigiQmVn
aW5uaW5nIHVwZGF0ZSBvZiBzdHlsZSBzZWxlY3RvciBhdCB0aW1lICVkLlxuIiwgZWxhcHNlZFRp
bWUoKSk7Ci0jZW5kaWYKLQotICAgIGJvb2wgc3R5bGVzaGVldENoYW5nZVJlcXVpcmVzU3R5bGVS
ZWNhbGMgPSB1cGRhdGVBY3RpdmVTdHlsZXNoZWV0cyh1cGRhdGVGbGFnKTsKLQotICAgIGlmICh1
cGRhdGVGbGFnID09IERlZmVyUmVjYWxjU3R5bGUpIHsKLSAgICAgICAgc2NoZWR1bGVGb3JjZWRT
dHlsZVJlY2FsYygpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGRpZExheW91
dFdpdGhQZW5kaW5nU3R5bGVzaGVldHMoKSAmJiBtX3BlbmRpbmdTdHlsZXNoZWV0cyA8PSAwKSB7
Ci0gICAgICAgIG1fcGVuZGluZ1NoZWV0TGF5b3V0ID0gSWdub3JlTGF5b3V0V2l0aFBlbmRpbmdT
aGVldHM7Ci0gICAgICAgIGlmIChyZW5kZXJlcigpKQotICAgICAgICAgICAgcmVuZGVyZXIoKS0+
cmVwYWludCgpOwotICAgIH0KLQotICAgIGlmICghc3R5bGVzaGVldENoYW5nZVJlcXVpcmVzU3R5
bGVSZWNhbGMpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIFRoaXMgcmVjYWxjU3R5bGUgaW5p
dGlhdGVzIGEgbmV3IHJlY2FsYyBjeWNsZS4gV2UgbmVlZCB0byBicmFja2V0IGl0IHRvCi0gICAg
Ly8gbWFrZSBzdXJlIGFuaW1hdGlvbnMgZ2V0IHRoZSBjb3JyZWN0IHVwZGF0ZSB0aW1lCi0gICAg
ewotICAgICAgICBBbmltYXRpb25VcGRhdGVCbG9jayBhbmltYXRpb25VcGRhdGVCbG9jayhtX2Zy
YW1lID8gbV9mcmFtZS0+YW5pbWF0aW9uKCkgOiAwKTsKLSAgICAgICAgcmVjYWxjU3R5bGUoRm9y
Y2UpOwotICAgIH0KLQotI2lmZGVmIElOU1RSVU1FTlRfTEFZT1VUX1NDSEVEVUxJTkcKLSAgICBp
ZiAoIW93bmVyRWxlbWVudCgpKQotICAgICAgICBwcmludGYoIkZpbmlzaGVkIHVwZGF0ZSBvZiBz
dHlsZSBzZWxlY3RvciBhdCB0aW1lICVkXG4iLCBlbGFwc2VkVGltZSgpKTsKLSNlbmRpZgotCi0g
ICAgaWYgKHJlbmRlcmVyKCkpIHsKLSAgICAgICAgcmVuZGVyZXIoKS0+c2V0TmVlZHNMYXlvdXRB
bmRQcmVmV2lkdGhzUmVjYWxjKCk7Ci0gICAgICAgIGlmICh2aWV3KCkpCi0gICAgICAgICAgICB2
aWV3KCktPnNjaGVkdWxlUmVsYXlvdXQoKTsKLSAgICB9Ci0KLSAgICBldmFsdWF0ZU1lZGlhUXVl
cnlMaXN0KCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmFkZFN0eWxlU2hlZXRDYW5kaWRhdGVOb2Rl
KE5vZGUqIG5vZGUsIGJvb2wgY3JlYXRlZEJ5UGFyc2VyKQotewotICAgIGlmICghbm9kZS0+aW5E
b2N1bWVudCgpKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgLy8gVW50aWwgdGhlIDxib2R5
PiBleGlzdHMsIHdlIGhhdmUgbm8gY2hvaWNlIGJ1dCB0byBjb21wYXJlIGRvY3VtZW50IHBvc2l0
aW9ucywKLSAgICAvLyBzaW5jZSBzdHlsZXMgb3V0c2lkZSBvZiB0aGUgYm9keSBhbmQgaGVhZCBj
b250aW51ZSB0byBiZSBzaHVudGVkIGludG8gdGhlIGhlYWQKLSAgICAvLyAoYW5kIHRodXMgY2Fu
IHNoaWZ0IHRvIGVuZCB1cCBiZWZvcmUgZHluYW1pY2FsbHkgYWRkZWQgRE9NIGNvbnRlbnQgdGhh
dCBpcyBhbHNvCi0gICAgLy8gb3V0c2lkZSB0aGUgYm9keSkuCi0gICAgaWYgKChjcmVhdGVkQnlQ
YXJzZXIgJiYgYm9keSgpKSB8fCBtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcy5pc0VtcHR5KCkp
IHsKLSAgICAgICAgbV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMuYWRkKG5vZGUpOwotICAgICAg
ICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gRGV0ZXJtaW5lIGFuIGFwcHJvcHJpYXRlIGluc2Vy
dGlvbiBwb2ludC4KLSAgICBTdHlsZVNoZWV0Q2FuZGlkYXRlTGlzdEhhc2hTZXQ6Oml0ZXJhdG9y
IGJlZ2luID0gbV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMuYmVnaW4oKTsKLSAgICBTdHlsZVNo
ZWV0Q2FuZGlkYXRlTGlzdEhhc2hTZXQ6Oml0ZXJhdG9yIGVuZCA9IG1fc3R5bGVTaGVldENhbmRp
ZGF0ZU5vZGVzLmVuZCgpOwotICAgIFN0eWxlU2hlZXRDYW5kaWRhdGVMaXN0SGFzaFNldDo6aXRl
cmF0b3IgaXQgPSBlbmQ7Ci0gICAgTm9kZSogZm9sbG93aW5nTm9kZSA9IDA7Ci0gICAgZG8gewot
ICAgICAgICAtLWl0OwotICAgICAgICBOb2RlKiBuID0gKml0OwotICAgICAgICB1bnNpZ25lZCBz
aG9ydCBwb3NpdGlvbiA9IG4tPmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKG5vZGUpOwotICAgICAg
ICBpZiAocG9zaXRpb24gPT0gRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HKSB7Ci0gICAgICAg
ICAgICBtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcy5pbnNlcnRCZWZvcmUoZm9sbG93aW5nTm9k
ZSwgbm9kZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZm9sbG93
aW5nTm9kZSA9IG47Ci0gICAgfSB3aGlsZSAoaXQgIT0gYmVnaW4pOwotICAgIAotICAgIG1fc3R5
bGVTaGVldENhbmRpZGF0ZU5vZGVzLmluc2VydEJlZm9yZShmb2xsb3dpbmdOb2RlLCBub2RlKTsK
LX0KLQotdm9pZCBEb2N1bWVudDo6cmVtb3ZlU3R5bGVTaGVldENhbmRpZGF0ZU5vZGUoTm9kZSog
bm9kZSkKLXsKLSAgICBtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcy5yZW1vdmUobm9kZSk7Ci19
Ci0KLXZvaWQgRG9jdW1lbnQ6OmNvbGxlY3RBY3RpdmVTdHlsZXNoZWV0cyhWZWN0b3I8UmVmUHRy
PFN0eWxlU2hlZXQ+ID4mIHNoZWV0cykKLXsKLSAgICBpZiAoc2V0dGluZ3MoKSAmJiAhc2V0dGlu
Z3MoKS0+YXV0aG9yQW5kVXNlclN0eWxlc0VuYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0g
ICAgU3R5bGVTaGVldENhbmRpZGF0ZUxpc3RIYXNoU2V0OjppdGVyYXRvciBiZWdpbiA9IG1fc3R5
bGVTaGVldENhbmRpZGF0ZU5vZGVzLmJlZ2luKCk7Ci0gICAgU3R5bGVTaGVldENhbmRpZGF0ZUxp
c3RIYXNoU2V0OjppdGVyYXRvciBlbmQgPSBtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcy5lbmQo
KTsKLSAgICBmb3IgKFN0eWxlU2hlZXRDYW5kaWRhdGVMaXN0SGFzaFNldDo6aXRlcmF0b3IgaXQg
PSBiZWdpbjsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgIE5vZGUqIG4gPSAqaXQ7Ci0gICAg
ICAgIFN0eWxlU2hlZXQqIHNoZWV0ID0gMDsKLSAgICAgICAgaWYgKG4tPm5vZGVUeXBlKCkgPT0g
UFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFKSB7Ci0gICAgICAgICAgICAvLyBQcm9jZXNzaW5n
IGluc3RydWN0aW9uIChYTUwgZG9jdW1lbnRzIG9ubHkpLgotICAgICAgICAgICAgLy8gV2UgZG9u
J3Qgc3VwcG9ydCBsaW5raW5nIHRvIGVtYmVkZGVkIENTUyBzdHlsZXNoZWV0cywgc2VlIDxodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDkyODE+IGZvciBkaXNjdXNzaW9u
LgotICAgICAgICAgICAgUHJvY2Vzc2luZ0luc3RydWN0aW9uKiBwaSA9IHN0YXRpY19jYXN0PFBy
b2Nlc3NpbmdJbnN0cnVjdGlvbio+KG4pOwotICAgICAgICAgICAgc2hlZXQgPSBwaS0+c2hlZXQo
KTsKLSNpZiBFTkFCTEUoWFNMVCkKLSAgICAgICAgICAgIC8vIERvbid0IGFwcGx5IFhTTCB0cmFu
c2Zvcm1zIHRvIGFscmVhZHkgdHJhbnNmb3JtZWQgZG9jdW1lbnRzIC0tIDxyZGFyOi8vcHJvYmxl
bS80MTMyODA2PgotICAgICAgICAgICAgaWYgKHBpLT5pc1hTTCgpICYmICF0cmFuc2Zvcm1Tb3Vy
Y2VEb2N1bWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gRG9uJ3QgYXBwbHkgWFNMIHRyYW5z
Zm9ybXMgdW50aWwgbG9hZGluZyBpcyBmaW5pc2hlZC4KLSAgICAgICAgICAgICAgICBpZiAoIXBh
cnNpbmcoKSkKLSAgICAgICAgICAgICAgICAgICAgYXBwbHlYU0xUcmFuc2Zvcm0ocGkpOwotICAg
ICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICB9IGVs
c2UgaWYgKChuLT5pc0hUTUxFbGVtZW50KCkgJiYgKG4tPmhhc1RhZ05hbWUobGlua1RhZykgfHwg
bi0+aGFzVGFnTmFtZShzdHlsZVRhZykpKQotI2lmIEVOQUJMRShTVkcpCi0gICAgICAgICAgICAg
ICAgICAgfHwgIChuLT5pc1NWR0VsZW1lbnQoKSAmJiBuLT5oYXNUYWdOYW1lKFNWR05hbWVzOjpz
dHlsZVRhZykpCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICApIHsKLSAgICAgICAgICAgIEVs
ZW1lbnQqIGUgPSBzdGF0aWNfY2FzdDxFbGVtZW50Kj4obik7Ci0gICAgICAgICAgICBBdG9taWNT
dHJpbmcgdGl0bGUgPSBlLT5nZXRBdHRyaWJ1dGUodGl0bGVBdHRyKTsKLSAgICAgICAgICAgIGJv
b2wgZW5hYmxlZFZpYVNjcmlwdCA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKGUtPmhhc0xvY2Fs
TmFtZShsaW5rVGFnKSkgewotICAgICAgICAgICAgICAgIC8vIDxMSU5LPiBlbGVtZW50Ci0gICAg
ICAgICAgICAgICAgSFRNTExpbmtFbGVtZW50KiBsaW5rRWxlbWVudCA9IHN0YXRpY19jYXN0PEhU
TUxMaW5rRWxlbWVudCo+KG4pOwotICAgICAgICAgICAgICAgIGlmIChsaW5rRWxlbWVudC0+aXNE
aXNhYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAg
ICBlbmFibGVkVmlhU2NyaXB0ID0gbGlua0VsZW1lbnQtPmlzRW5hYmxlZFZpYVNjcmlwdCgpOwot
ICAgICAgICAgICAgICAgIGlmIChsaW5rRWxlbWVudC0+c3R5bGVTaGVldElzTG9hZGluZygpKSB7
Ci0gICAgICAgICAgICAgICAgICAgIC8vIGl0IGlzIGxvYWRpbmcgYnV0IHdlIHNob3VsZCBzdGls
bCBkZWNpZGUgd2hpY2ggc3R5bGUgc2hlZXQgc2V0IHRvIHVzZQotICAgICAgICAgICAgICAgICAg
ICBpZiAoIWVuYWJsZWRWaWFTY3JpcHQgJiYgIXRpdGxlLmlzRW1wdHkoKSAmJiBtX3ByZWZlcnJl
ZFN0eWxlc2hlZXRTZXQuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb25z
dCBBdG9taWNTdHJpbmcmIHJlbCA9IGUtPmdldEF0dHJpYnV0ZShyZWxBdHRyKTsKLSAgICAgICAg
ICAgICAgICAgICAgICAgIGlmICghcmVsLmNvbnRhaW5zKCJhbHRlcm5hdGUiKSkgewotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIG1fcHJlZmVycmVkU3R5bGVzaGVldFNldCA9IHRpdGxlOwot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc2VsZWN0ZWRTdHlsZXNoZWV0U2V0ID0gdGl0
bGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAg
ICAgICAgIGlmICghbGlua0VsZW1lbnQtPnNoZWV0KCkpCi0gICAgICAgICAgICAgICAgICAgIHRp
dGxlID0gbnVsbEF0b207Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBHZXQgdGhlIGN1
cnJlbnQgcHJlZmVycmVkIHN0eWxlc2V0LiAgVGhpcyBpcyB0aGUKLSAgICAgICAgICAgIC8vIHNl
dCBvZiBzaGVldHMgdGhhdCB3aWxsIGJlIGVuYWJsZWQuCi0jaWYgRU5BQkxFKFNWRykKLSAgICAg
ICAgICAgIGlmIChuLT5pc1NWR0VsZW1lbnQoKSAmJiBuLT5oYXNUYWdOYW1lKFNWR05hbWVzOjpz
dHlsZVRhZykpCi0gICAgICAgICAgICAgICAgc2hlZXQgPSBzdGF0aWNfY2FzdDxTVkdTdHlsZUVs
ZW1lbnQqPihuKS0+c2hlZXQoKTsKLSAgICAgICAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgICAg
ICAgaWYgKGUtPmhhc0xvY2FsTmFtZShsaW5rVGFnKSkKLSAgICAgICAgICAgICAgICBzaGVldCA9
IHN0YXRpY19jYXN0PEhUTUxMaW5rRWxlbWVudCo+KG4pLT5zaGVldCgpOwotICAgICAgICAgICAg
ZWxzZQotICAgICAgICAgICAgICAgIC8vIDxTVFlMRT4gZWxlbWVudAotICAgICAgICAgICAgICAg
IHNoZWV0ID0gc3RhdGljX2Nhc3Q8SFRNTFN0eWxlRWxlbWVudCo+KG4pLT5zaGVldCgpOwotICAg
ICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoaXMgc2hlZXQgYmVsb25ncyB0byBhIHN0eWxl
c2V0Ci0gICAgICAgICAgICAvLyAodGh1cyBtYWtpbmcgaXQgUFJFRkVSUkVEIG9yIEFMVEVSTkFU
RSByYXRoZXIgdGhhbgotICAgICAgICAgICAgLy8gUEVSU0lTVEVOVCkuCi0gICAgICAgICAgICBB
dG9taWNTdHJpbmcgcmVsID0gZS0+Z2V0QXR0cmlidXRlKHJlbEF0dHIpOwotICAgICAgICAgICAg
aWYgKCFlbmFibGVkVmlhU2NyaXB0ICYmICF0aXRsZS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAg
ICAgICAvLyBZZXMsIHdlIGhhdmUgYSB0aXRsZS4KLSAgICAgICAgICAgICAgICBpZiAobV9wcmVm
ZXJyZWRTdHlsZXNoZWV0U2V0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBO
byBwcmVmZXJyZWQgc2V0IGhhcyBiZWVuIGVzdGFibGlzaGVkLiAgSWYKLSAgICAgICAgICAgICAg
ICAgICAgLy8gd2UgYXJlIE5PVCBhbiBhbHRlcm5hdGUgc2hlZXQsIHRoZW4gZXN0YWJsaXNoCi0g
ICAgICAgICAgICAgICAgICAgIC8vIHVzIGFzIHRoZSBwcmVmZXJyZWQgc2V0LiAgT3RoZXJ3aXNl
LCBqdXN0IGlnbm9yZQotICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHNoZWV0LgotICAgICAg
ICAgICAgICAgICAgICBpZiAoZS0+aGFzTG9jYWxOYW1lKHN0eWxlVGFnKSB8fCAhcmVsLmNvbnRh
aW5zKCJhbHRlcm5hdGUiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcHJlZmVycmVkU3R5
bGVzaGVldFNldCA9IG1fc2VsZWN0ZWRTdHlsZXNoZWV0U2V0ID0gdGl0bGU7Ci0gICAgICAgICAg
ICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh0aXRsZSAhPSBtX3ByZWZlcnJlZFN0eWxlc2hl
ZXRTZXQpCi0gICAgICAgICAgICAgICAgICAgIHNoZWV0ID0gMDsKLSAgICAgICAgICAgIH0KLQot
ICAgICAgICAgICAgaWYgKHJlbC5jb250YWlucygiYWx0ZXJuYXRlIikgJiYgdGl0bGUuaXNFbXB0
eSgpKQotICAgICAgICAgICAgICAgIHNoZWV0ID0gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAo
c2hlZXQpCi0gICAgICAgICAgICBzaGVldHMuYXBwZW5kKHNoZWV0KTsKLSAgICB9Ci19Ci0KLWJv
b2wgRG9jdW1lbnQ6OnRlc3RBZGRlZFN0eWxlc2hlZXRSZXF1aXJlc1N0eWxlUmVjYWxjKFN0eWxl
U2hlZXRDb250ZW50cyogc3R5bGVzaGVldCkKLXsKLSAgICAvLyBTZWUgaWYgYWxsIHJ1bGVzIG9u
IHRoZSBzaGVldCBhcmUgc2NvcGVkIHRvIHNvbWUgc3BlY2lmaWMgaWRzIG9yIGNsYXNzZXMuCi0g
ICAgLy8gVGhlbiB0ZXN0IGlmIHdlIGFjdHVhbGx5IGhhdmUgYW55IG9mIHRob3NlIGluIHRoZSB0
cmVlIGF0IHRoZSBtb21lbnQuCi0gICAgSGFzaFNldDxBdG9taWNTdHJpbmdJbXBsKj4gaWRTY29w
ZXM7IAotICAgIEhhc2hTZXQ8QXRvbWljU3RyaW5nSW1wbCo+IGNsYXNzU2NvcGVzOwotICAgIGlm
ICghU3R5bGVSZXNvbHZlcjo6ZGV0ZXJtaW5lU3R5bGVzaGVldFNlbGVjdG9yU2NvcGVzKHN0eWxl
c2hlZXQsIGlkU2NvcGVzLCBjbGFzc1Njb3BlcykpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAg
IC8vIEludmFsaWRhdGUgdGhlIHN1YnRyZWVzIHRoYXQgbWF0Y2ggdGhlIHNjb3Blcy4KLSAgICBO
b2RlKiBub2RlID0gZmlyc3RDaGlsZCgpOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGlm
ICghbm9kZS0+aXNTdHlsZWRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgIG5vZGUgPSBub2RlLT50
cmF2ZXJzZU5leHROb2RlKCk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAg
ICAgICBTdHlsZWRFbGVtZW50KiBlbGVtZW50ID0gc3RhdGljX2Nhc3Q8U3R5bGVkRWxlbWVudCo+
KG5vZGUpOwotICAgICAgICBpZiAoU2VsZWN0b3JDaGVja2VyOjplbGVtZW50TWF0Y2hlc1NlbGVj
dG9yU2NvcGVzKGVsZW1lbnQsIGlkU2NvcGVzLCBjbGFzc1Njb3BlcykpIHsKLSAgICAgICAgICAg
IGVsZW1lbnQtPnNldE5lZWRzU3R5bGVSZWNhbGMoKTsKLSAgICAgICAgICAgIC8vIFRoZSB3aG9s
ZSBzdWJ0cmVlIGlzIG5vdyBpbnZhbGlkYXRlZCwgd2UgY2FuIHNraXAgdG8gdGhlIG5leHQgc2li
bGluZy4KLSAgICAgICAgICAgIG5vZGUgPSBub2RlLT50cmF2ZXJzZU5leHRTaWJsaW5nKCk7Ci0g
ICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBub2RlID0gbm9kZS0+dHJh
dmVyc2VOZXh0Tm9kZSgpOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgRG9j
dW1lbnQ6OmFuYWx5emVTdHlsZXNoZWV0Q2hhbmdlKFN0eWxlUmVzb2x2ZXJVcGRhdGVGbGFnIHVw
ZGF0ZUZsYWcsIGNvbnN0IFZlY3RvcjxSZWZQdHI8U3R5bGVTaGVldD4gPiYgbmV3U3R5bGVzaGVl
dHMsIGJvb2wmIHJlcXVpcmVzU3R5bGVSZXNvbHZlclJlc2V0LCBib29sJiByZXF1aXJlc0Z1bGxT
dHlsZVJlY2FsYykKLXsKLSAgICByZXF1aXJlc1N0eWxlUmVzb2x2ZXJSZXNldCA9IHRydWU7Ci0g
ICAgcmVxdWlyZXNGdWxsU3R5bGVSZWNhbGMgPSB0cnVlOwotICAgIAotICAgIC8vIFN0eWxlc2hl
ZXRzIG9mIDxzdHlsZT4gZWxlbWVudHMgdGhhdCBAaW1wb3J0IHN0eWxlc2hlZXRzIGFyZSBhY3Rp
dmUgYnV0IGxvYWRpbmcuIFdlIG5lZWQgdG8gdHJpZ2dlciBhIGZ1bGwgcmVjYWxjIHdoZW4gc3Vj
aCBsb2FkcyBhcmUgZG9uZS4KLSAgICBib29sIGhhc0FjdGl2ZUxvYWRpbmdTdHlsZXNoZWV0ID0g
ZmFsc2U7Ci0gICAgdW5zaWduZWQgbmV3U3R5bGVzaGVldENvdW50ID0gbmV3U3R5bGVzaGVldHMu
c2l6ZSgpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuZXdTdHlsZXNoZWV0Q291bnQ7
ICsraSkgewotICAgICAgICBpZiAobmV3U3R5bGVzaGVldHNbaV0tPmlzTG9hZGluZygpKQotICAg
ICAgICAgICAgaGFzQWN0aXZlTG9hZGluZ1N0eWxlc2hlZXQgPSB0cnVlOwotICAgIH0KLSAgICBp
ZiAobV9oYWRBY3RpdmVMb2FkaW5nU3R5bGVzaGVldCAmJiAhaGFzQWN0aXZlTG9hZGluZ1N0eWxl
c2hlZXQpIHsKLSAgICAgICAgbV9oYWRBY3RpdmVMb2FkaW5nU3R5bGVzaGVldCA9IGZhbHNlOwot
ICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1faGFkQWN0aXZlTG9hZGluZ1N0eWxlc2hlZXQg
PSBoYXNBY3RpdmVMb2FkaW5nU3R5bGVzaGVldDsKLQotICAgIGlmICh1cGRhdGVGbGFnICE9IFJl
Y2FsY1N0eWxlSWZOZWVkZWQpCi0gICAgICAgIHJldHVybjsKLSAgICBpZiAoIW1fc3R5bGVSZXNv
bHZlcikKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gU2VlIGlmIHdlIGFyZSBqdXN0IGFkZGlu
ZyBzdHlsZXNoZWV0cy4KLSAgICB1bnNpZ25lZCBvbGRTdHlsZXNoZWV0Q291bnQgPSBtX3N0eWxl
U2hlZXRzLT5sZW5ndGgoKTsKLSAgICBpZiAobmV3U3R5bGVzaGVldENvdW50IDwgb2xkU3R5bGVz
aGVldENvdW50KQotICAgICAgICByZXR1cm47Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8
IG9sZFN0eWxlc2hlZXRDb3VudDsgKytpKSB7Ci0gICAgICAgIGlmIChtX3N0eWxlU2hlZXRzLT5p
dGVtKGkpICE9IG5ld1N0eWxlc2hlZXRzW2ldKQotICAgICAgICAgICAgcmV0dXJuOwotICAgIH0K
LSAgICByZXF1aXJlc1N0eWxlUmVzb2x2ZXJSZXNldCA9IGZhbHNlOwotCi0gICAgLy8gSWYgd2Ug
YXJlIGFscmVhZHkgcGFyc2luZyB0aGUgYm9keSBhbmQgc28gbWF5IGhhdmUgc2lnbmlmaWNhbnQg
YW1vdW50IG9mIGVsZW1lbnRzLCBwdXQgc29tZSBlZmZvcnQgaW50byB0cnlpbmcgdG8gYXZvaWQg
c3R5bGUgcmVjYWxjcy4KLSAgICBpZiAoIWJvZHkoKSB8fCBtX2hhc05vZGVzV2l0aFBsYWNlaG9s
ZGVyU3R5bGUpCi0gICAgICAgIHJldHVybjsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSBvbGRTdHls
ZXNoZWV0Q291bnQ7IGkgPCBuZXdTdHlsZXNoZWV0Q291bnQ7ICsraSkgewotICAgICAgICBpZiAo
IW5ld1N0eWxlc2hlZXRzW2ldLT5pc0NTU1N0eWxlU2hlZXQoKSkKLSAgICAgICAgICAgIHJldHVy
bjsKLSAgICAgICAgaWYgKG5ld1N0eWxlc2hlZXRzW2ldLT5kaXNhYmxlZCgpKQotICAgICAgICAg
ICAgY29udGludWU7Ci0gICAgICAgIGlmICh0ZXN0QWRkZWRTdHlsZXNoZWV0UmVxdWlyZXNTdHls
ZVJlY2FsYyhzdGF0aWNfY2FzdDxDU1NTdHlsZVNoZWV0Kj4obmV3U3R5bGVzaGVldHNbaV0uZ2V0
KCkpLT5jb250ZW50cygpKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcmVxdWly
ZXNGdWxsU3R5bGVSZWNhbGMgPSBmYWxzZTsKLX0KLQotc3RhdGljIGJvb2wgc3R5bGVTaGVldHNV
c2VSZW1Vbml0cyhjb25zdCBWZWN0b3I8UmVmUHRyPFN0eWxlU2hlZXQ+ID4mIHNoZWV0cykKLXsK
LSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2hlZXRzLnNpemUoKTsgKytpKSB7Ci0gICAg
ICAgIGlmICghc2hlZXRzW2ldLT5pc0NTU1N0eWxlU2hlZXQoKSkKLSAgICAgICAgICAgIGNvbnRp
bnVlOwotICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8Q1NTU3R5bGVTaGVldCo+KHNoZWV0c1tpXS5n
ZXQoKSktPmNvbnRlbnRzKCktPnVzZXNSZW1Vbml0cygpKQotICAgICAgICAgICAgcmV0dXJuIHRy
dWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBEb2N1bWVudDo6bm90aWZ5
U2VhbWxlc3NDaGlsZERvY3VtZW50c09mU3R5bGVzaGVldFVwZGF0ZSgpIGNvbnN0Ci17Ci0gICAg
Ly8gSWYgd2UncmUgbm90IGluIGEgZnJhbWUgeWV0IGFueSBwb3RlbnRpYWwgY2hpbGQgZG9jdW1l
bnRzIHdvbid0IGhhdmUgYSBTdHlsZVJlc29sdmVyIHRvIHVwZGF0ZS4KLSAgICBpZiAoIWZyYW1l
KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIFNlYW1sZXNzIGNoaWxkIGZyYW1lcyBhcmUg
ZXhwZWN0ZWQgdG8gbm90aWZ5IHRoZWlyIHNlYW1sZXNzIGNoaWxkcmVuIHJlY3Vyc2l2ZWx5LCBz
byB3ZSBvbmx5IGRvIGRpcmVjdCBjaGlsZHJlbi4KLSAgICBmb3IgKEZyYW1lKiBjaGlsZCA9IGZy
YW1lKCktPnRyZWUoKS0+Zmlyc3RDaGlsZCgpOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+dHJlZSgp
LT5uZXh0U2libGluZygpKSB7Ci0gICAgICAgIERvY3VtZW50KiBjaGlsZERvY3VtZW50ID0gY2hp
bGQtPmRvY3VtZW50KCk7Ci0gICAgICAgIGlmIChjaGlsZERvY3VtZW50LT5zaG91bGREaXNwbGF5
U2VhbWxlc3NseVdpdGhQYXJlbnQoKSkgewotICAgICAgICAgICAgQVNTRVJUKGNoaWxkRG9jdW1l
bnQtPnNlYW1sZXNzUGFyZW50SUZyYW1lKCktPmRvY3VtZW50KCkgPT0gdGhpcyk7Ci0gICAgICAg
ICAgICBjaGlsZERvY3VtZW50LT5zZWFtbGVzc1BhcmVudFVwZGF0ZWRTdHlsZXNoZWV0cygpOwot
ICAgICAgICB9Ci0gICAgfQotfQotCi1ib29sIERvY3VtZW50Ojp1cGRhdGVBY3RpdmVTdHlsZXNo
ZWV0cyhTdHlsZVJlc29sdmVyVXBkYXRlRmxhZyB1cGRhdGVGbGFnKQotewotICAgIGlmIChtX2lu
U3R5bGVSZWNhbGMpIHsKLSAgICAgICAgLy8gU1ZHIDx1c2U+IGVsZW1lbnQgbWF5IG1hbmFnZSB0
byBpbnZhbGlkYXRlIHN0eWxlIHNlbGVjdG9yIGluIHRoZSBtaWRkbGUgb2YgYSBzdHlsZSByZWNh
bGMuCi0gICAgICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD01
NDM0NAotICAgICAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgYmUgZml4ZWQgaW4gU1ZHIGFuZCB0
aGlzIGNvZGUgcmVwbGFjZWQgd2l0aCBBU1NFUlQoIW1faW5TdHlsZVJlY2FsYykuCi0gICAgICAg
IG1faGFzRGlydHlTdHlsZVJlc29sdmVyID0gdHJ1ZTsKLSAgICAgICAgc2NoZWR1bGVGb3JjZWRT
dHlsZVJlY2FsYygpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmICghcmVu
ZGVyZXIoKSB8fCAhYXR0YWNoZWQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgU3R5
bGVTaGVldFZlY3RvciBuZXdTdHlsZXNoZWV0czsKLSAgICBjb2xsZWN0QWN0aXZlU3R5bGVzaGVl
dHMobmV3U3R5bGVzaGVldHMpOwotCi0gICAgYm9vbCByZXF1aXJlc1N0eWxlUmVzb2x2ZXJSZXNl
dDsKLSAgICBib29sIHJlcXVpcmVzRnVsbFN0eWxlUmVjYWxjOwotICAgIGFuYWx5emVTdHlsZXNo
ZWV0Q2hhbmdlKHVwZGF0ZUZsYWcsIG5ld1N0eWxlc2hlZXRzLCByZXF1aXJlc1N0eWxlUmVzb2x2
ZXJSZXNldCwgcmVxdWlyZXNGdWxsU3R5bGVSZWNhbGMpOwotCi0gICAgaWYgKHJlcXVpcmVzU3R5
bGVSZXNvbHZlclJlc2V0KQotICAgICAgICBjbGVhclN0eWxlUmVzb2x2ZXIoKTsKLSAgICBlbHNl
IHsKLSAgICAgICAgbV9zdHlsZVJlc29sdmVyLT5hcHBlbmRBdXRob3JTdHlsZXNoZWV0cyhtX3N0
eWxlU2hlZXRzLT5sZW5ndGgoKSwgbmV3U3R5bGVzaGVldHMpOwotICAgICAgICByZXNldENTU0Zl
YXR1cmVGbGFncygpOwotICAgIH0KLSAgICBtX3N0eWxlU2hlZXRzLT5zd2FwKG5ld1N0eWxlc2hl
ZXRzKTsKLQotICAgIG1fdXNlc1JlbVVuaXRzID0gc3R5bGVTaGVldHNVc2VSZW1Vbml0cyhtX3N0
eWxlU2hlZXRzLT52ZWN0b3IoKSk7Ci0gICAgbV9kaWRDYWxjdWxhdGVTdHlsZVJlc29sdmVyID0g
dHJ1ZTsKLSAgICBtX2hhc0RpcnR5U3R5bGVSZXNvbHZlciA9IGZhbHNlOwotCi0gICAgbm90aWZ5
U2VhbWxlc3NDaGlsZERvY3VtZW50c09mU3R5bGVzaGVldFVwZGF0ZSgpOwotCi0gICAgcmV0dXJu
IHJlcXVpcmVzRnVsbFN0eWxlUmVjYWxjOwotfQotCi12b2lkIERvY3VtZW50OjpzZXRIb3Zlck5v
ZGUoUGFzc1JlZlB0cjxOb2RlPiBuZXdIb3Zlck5vZGUpCi17Ci0gICAgbV9ob3Zlck5vZGUgPSBu
ZXdIb3Zlck5vZGU7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnNldEFjdGl2ZU5vZGUoUGFzc1JlZlB0
cjxOb2RlPiBuZXdBY3RpdmVOb2RlKQotewotICAgIG1fYWN0aXZlTm9kZSA9IG5ld0FjdGl2ZU5v
ZGU7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmZvY3VzZWROb2RlUmVtb3ZlZCgpCi17Ci0gICAgc2V0
Rm9jdXNlZE5vZGUoMCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnJlbW92ZUZvY3VzZWROb2RlT2ZT
dWJ0cmVlKE5vZGUqIG5vZGUsIGJvb2wgYW1vbmdDaGlsZHJlbk9ubHkpCi17Ci0gICAgaWYgKCFt
X2ZvY3VzZWROb2RlIHx8IHRoaXMtPmluUGFnZUNhY2hlKCkpIC8vIElmIHRoZSBkb2N1bWVudCBp
cyBpbiB0aGUgcGFnZSBjYWNoZSwgdGhlbiB3ZSBkb24ndCBuZWVkIHRvIGNsZWFyIG91dCB0aGUg
Zm9jdXNlZCBub2RlLgotICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgIGJvb2wgbm9kZUlu
U3VidHJlZSA9IGZhbHNlOwotICAgIGlmIChhbW9uZ0NoaWxkcmVuT25seSkKLSAgICAgICAgbm9k
ZUluU3VidHJlZSA9IG1fZm9jdXNlZE5vZGUtPmlzRGVzY2VuZGFudE9mKG5vZGUpOwotICAgIGVs
c2UKLSAgICAgICAgbm9kZUluU3VidHJlZSA9IChtX2ZvY3VzZWROb2RlID09IG5vZGUpIHx8IG1f
Zm9jdXNlZE5vZGUtPmlzRGVzY2VuZGFudE9mKG5vZGUpOwotICAgIAotICAgIGlmIChub2RlSW5T
dWJ0cmVlKQotICAgICAgICBkb2N1bWVudCgpLT5mb2N1c2VkTm9kZVJlbW92ZWQoKTsKLX0KLQot
dm9pZCBEb2N1bWVudDo6aG92ZXJlZE5vZGVEZXRhY2hlZChOb2RlKiBub2RlKQotewotICAgIGlm
ICghbV9ob3Zlck5vZGUgfHwgKG5vZGUgIT0gbV9ob3Zlck5vZGUgJiYgKCFtX2hvdmVyTm9kZS0+
aXNUZXh0Tm9kZSgpIHx8IG5vZGUgIT0gbV9ob3Zlck5vZGUtPnBhcmVudE5vZGUoKSkpKQotICAg
ICAgICByZXR1cm47Ci0KLSAgICBtX2hvdmVyTm9kZSA9IG5vZGUtPnBhcmVudE5vZGUoKTsKLSAg
ICB3aGlsZSAobV9ob3Zlck5vZGUgJiYgIW1faG92ZXJOb2RlLT5yZW5kZXJlcigpKQotICAgICAg
ICBtX2hvdmVyTm9kZSA9IG1faG92ZXJOb2RlLT5wYXJlbnROb2RlKCk7Ci0gICAgaWYgKGZyYW1l
KCkpCi0gICAgICAgIGZyYW1lKCktPmV2ZW50SGFuZGxlcigpLT5zY2hlZHVsZUhvdmVyU3RhdGVV
cGRhdGUoKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6YWN0aXZlQ2hhaW5Ob2RlRGV0YWNoZWQoTm9k
ZSogbm9kZSkKLXsKLSAgICBpZiAoIW1fYWN0aXZlTm9kZSB8fCAobm9kZSAhPSBtX2FjdGl2ZU5v
ZGUgJiYgKCFtX2FjdGl2ZU5vZGUtPmlzVGV4dE5vZGUoKSB8fCBub2RlICE9IG1fYWN0aXZlTm9k
ZS0+cGFyZW50Tm9kZSgpKSkpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fYWN0aXZlTm9kZSA9
IG5vZGUtPnBhcmVudE5vZGUoKTsKLSAgICB3aGlsZSAobV9hY3RpdmVOb2RlICYmICFtX2FjdGl2
ZU5vZGUtPnJlbmRlcmVyKCkpCi0gICAgICAgIG1fYWN0aXZlTm9kZSA9IG1fYWN0aXZlTm9kZS0+
cGFyZW50Tm9kZSgpOwotfQotCi0jaWYgRU5BQkxFKERBU0hCT0FSRF9TVVBQT1JUKSB8fCBFTkFC
TEUoV0lER0VUX1JFR0lPTikKLWNvbnN0IFZlY3RvcjxEYXNoYm9hcmRSZWdpb25WYWx1ZT4mIERv
Y3VtZW50OjpkYXNoYm9hcmRSZWdpb25zKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9kYXNoYm9h
cmRSZWdpb25zOwotfQotCi12b2lkIERvY3VtZW50OjpzZXREYXNoYm9hcmRSZWdpb25zKGNvbnN0
IFZlY3RvcjxEYXNoYm9hcmRSZWdpb25WYWx1ZT4mIHJlZ2lvbnMpCi17Ci0gICAgbV9kYXNoYm9h
cmRSZWdpb25zID0gcmVnaW9uczsKLSAgICBzZXREYXNoYm9hcmRSZWdpb25zRGlydHkoZmFsc2Up
OwotfQotI2VuZGlmCi0KLWJvb2wgRG9jdW1lbnQ6OnNldEZvY3VzZWROb2RlKFBhc3NSZWZQdHI8
Tm9kZT4gcHJwTmV3Rm9jdXNlZE5vZGUpCi17Ci0gICAgUmVmUHRyPE5vZGU+IG5ld0ZvY3VzZWRO
b2RlID0gcHJwTmV3Rm9jdXNlZE5vZGU7Ci0KLSAgICAvLyBNYWtlIHN1cmUgbmV3Rm9jdXNlZE5v
ZGUgaXMgYWN0dWFsbHkgaW4gdGhpcyBkb2N1bWVudAotICAgIGlmIChuZXdGb2N1c2VkTm9kZSAm
JiAobmV3Rm9jdXNlZE5vZGUtPmRvY3VtZW50KCkgIT0gdGhpcykpCi0gICAgICAgIHJldHVybiB0
cnVlOwotCi0gICAgaWYgKG1fZm9jdXNlZE5vZGUgPT0gbmV3Rm9jdXNlZE5vZGUpCi0gICAgICAg
IHJldHVybiB0cnVlOwotCi0gICAgaWYgKG1faW5QYWdlQ2FjaGUpCi0gICAgICAgIHJldHVybiBm
YWxzZTsKLQotICAgIGJvb2wgZm9jdXNDaGFuZ2VCbG9ja2VkID0gZmFsc2U7Ci0gICAgUmVmUHRy
PE5vZGU+IG9sZEZvY3VzZWROb2RlID0gbV9mb2N1c2VkTm9kZTsKLSAgICBtX2ZvY3VzZWROb2Rl
ID0gMDsKLQotICAgIC8vIFJlbW92ZSBmb2N1cyBmcm9tIHRoZSBleGlzdGluZyBmb2N1cyBub2Rl
IChpZiBhbnkpCi0gICAgaWYgKG9sZEZvY3VzZWROb2RlKSB7Ci0gICAgICAgIEFTU0VSVCghb2xk
Rm9jdXNlZE5vZGUtPmluRGV0YWNoKCkpOwotCi0gICAgICAgIGlmIChvbGRGb2N1c2VkTm9kZS0+
YWN0aXZlKCkpCi0gICAgICAgICAgICBvbGRGb2N1c2VkTm9kZS0+c2V0QWN0aXZlKGZhbHNlKTsK
LQotICAgICAgICBvbGRGb2N1c2VkTm9kZS0+c2V0Rm9jdXMoZmFsc2UpOwotCi0gICAgICAgIC8v
IERpc3BhdGNoIGEgY2hhbmdlIGV2ZW50IGZvciB0ZXh0IGZpZWxkcyBvciB0ZXh0YXJlYXMgdGhh
dCBoYXZlIGJlZW4gZWRpdGVkCi0gICAgICAgIGlmIChvbGRGb2N1c2VkTm9kZS0+aXNFbGVtZW50
Tm9kZSgpKSB7Ci0gICAgICAgICAgICBFbGVtZW50KiBlbGVtZW50ID0gc3RhdGljX2Nhc3Q8RWxl
bWVudCo+KG9sZEZvY3VzZWROb2RlLmdldCgpKTsKLSAgICAgICAgICAgIGlmIChlbGVtZW50LT53
YXNDaGFuZ2VkU2luY2VMYXN0Rm9ybUNvbnRyb2xDaGFuZ2VFdmVudCgpKQotICAgICAgICAgICAg
ICAgIGVsZW1lbnQtPmRpc3BhdGNoRm9ybUNvbnRyb2xDaGFuZ2VFdmVudCgpOwotICAgICAgICB9
Ci0KLSAgICAgICAgLy8gRGlzcGF0Y2ggdGhlIGJsdXIgZXZlbnQgYW5kIGxldCB0aGUgbm9kZSBk
byBhbnkgb3RoZXIgYmx1ciByZWxhdGVkIGFjdGl2aXRpZXMgKGltcG9ydGFudCBmb3IgdGV4dCBm
aWVsZHMpCi0gICAgICAgIG9sZEZvY3VzZWROb2RlLT5kaXNwYXRjaEJsdXJFdmVudChuZXdGb2N1
c2VkTm9kZSk7Ci0KLSAgICAgICAgaWYgKG1fZm9jdXNlZE5vZGUpIHsKLSAgICAgICAgICAgIC8v
IGhhbmRsZXIgc2hpZnRlZCBmb2N1cwotICAgICAgICAgICAgZm9jdXNDaGFuZ2VCbG9ja2VkID0g
dHJ1ZTsKLSAgICAgICAgICAgIG5ld0ZvY3VzZWROb2RlID0gMDsKLSAgICAgICAgfQotICAgICAg
ICAKLSAgICAgICAgb2xkRm9jdXNlZE5vZGUtPmRpc3BhdGNoRm9jdXNPdXRFdmVudChldmVudE5h
bWVzKCkuZm9jdXNvdXRFdmVudCwgbmV3Rm9jdXNlZE5vZGUpOyAvLyBET00gbGV2ZWwgMyBuYW1l
IGZvciB0aGUgYnViYmxpbmcgYmx1ciBldmVudC4KLSAgICAgICAgLy8gRklYTUU6IFdlIHNob3Vs
ZCByZW1vdmUgZmlyaW5nIERPTUZvY3VzT3V0RXZlbnQgZXZlbnQgd2hlbiB3ZSBhcmUgc3VyZSBu
byBjb250ZW50IGRlcGVuZHMKLSAgICAgICAgLy8gb24gaXQsIHByb2JhYmx5IHdoZW4gPHJkYXI6
Ly9wcm9ibGVtLzg1MDM5NTg+IGlzIHJlc29sdmVkLgotICAgICAgICBvbGRGb2N1c2VkTm9kZS0+
ZGlzcGF0Y2hGb2N1c091dEV2ZW50KGV2ZW50TmFtZXMoKS5ET01Gb2N1c091dEV2ZW50LCBuZXdG
b2N1c2VkTm9kZSk7IC8vIERPTSBsZXZlbCAyIG5hbWUgZm9yIGNvbXBhdGliaWxpdHkuCi0KLSAg
ICAgICAgaWYgKG1fZm9jdXNlZE5vZGUpIHsKLSAgICAgICAgICAgIC8vIGhhbmRsZXIgc2hpZnRl
ZCBmb2N1cwotICAgICAgICAgICAgZm9jdXNDaGFuZ2VCbG9ja2VkID0gdHJ1ZTsKLSAgICAgICAg
ICAgIG5ld0ZvY3VzZWROb2RlID0gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAob2xkRm9jdXNl
ZE5vZGUgPT0gdGhpcyAmJiBvbGRGb2N1c2VkTm9kZS0+aGFzT25lUmVmKCkpCi0gICAgICAgICAg
ICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIAotICAgICAgICBpZiAob2xkRm9jdXNlZE5vZGUt
PmlzUm9vdEVkaXRhYmxlRWxlbWVudCgpKQotICAgICAgICAgICAgZnJhbWUoKS0+ZWRpdG9yKCkt
PmRpZEVuZEVkaXRpbmcoKTsKLQotICAgICAgICBpZiAodmlldygpKSB7Ci0gICAgICAgICAgICBX
aWRnZXQqIG9sZFdpZGdldCA9IHdpZGdldEZvck5vZGUob2xkRm9jdXNlZE5vZGUuZ2V0KCkpOwot
ICAgICAgICAgICAgaWYgKG9sZFdpZGdldCkKLSAgICAgICAgICAgICAgICBvbGRXaWRnZXQtPnNl
dEZvY3VzKGZhbHNlKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB2aWV3KCkt
PnNldEZvY3VzKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChuZXdGb2N1c2Vk
Tm9kZSkgewotICAgICAgICBpZiAobmV3Rm9jdXNlZE5vZGUtPmlzUm9vdEVkaXRhYmxlRWxlbWVu
dCgpICYmICFhY2NlcHRzRWRpdGluZ0ZvY3VzKG5ld0ZvY3VzZWROb2RlLmdldCgpKSkgewotICAg
ICAgICAgICAgLy8gZGVsZWdhdGUgYmxvY2tzIGZvY3VzIGNoYW5nZQotICAgICAgICAgICAgZm9j
dXNDaGFuZ2VCbG9ja2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIGdvdG8gU2V0Rm9jdXNlZE5vZGVE
b25lOwotICAgICAgICB9Ci0gICAgICAgIC8vIFNldCBmb2N1cyBvbiB0aGUgbmV3IG5vZGUKLSAg
ICAgICAgbV9mb2N1c2VkTm9kZSA9IG5ld0ZvY3VzZWROb2RlOwotCi0gICAgICAgIC8vIERpc3Bh
dGNoIHRoZSBmb2N1cyBldmVudCBhbmQgbGV0IHRoZSBub2RlIGRvIGFueSBvdGhlciBmb2N1cyBy
ZWxhdGVkIGFjdGl2aXRpZXMgKGltcG9ydGFudCBmb3IgdGV4dCBmaWVsZHMpCi0gICAgICAgIG1f
Zm9jdXNlZE5vZGUtPmRpc3BhdGNoRm9jdXNFdmVudChvbGRGb2N1c2VkTm9kZSk7Ci0KLSAgICAg
ICAgaWYgKG1fZm9jdXNlZE5vZGUgIT0gbmV3Rm9jdXNlZE5vZGUpIHsKLSAgICAgICAgICAgIC8v
IGhhbmRsZXIgc2hpZnRlZCBmb2N1cwotICAgICAgICAgICAgZm9jdXNDaGFuZ2VCbG9ja2VkID0g
dHJ1ZTsKLSAgICAgICAgICAgIGdvdG8gU2V0Rm9jdXNlZE5vZGVEb25lOwotICAgICAgICB9Ci0K
LSAgICAgICAgbV9mb2N1c2VkTm9kZS0+ZGlzcGF0Y2hGb2N1c0luRXZlbnQoZXZlbnROYW1lcygp
LmZvY3VzaW5FdmVudCwgb2xkRm9jdXNlZE5vZGUpOyAvLyBET00gbGV2ZWwgMyBidWJibGluZyBm
b2N1cyBldmVudC4KLQotICAgICAgICBpZiAobV9mb2N1c2VkTm9kZSAhPSBuZXdGb2N1c2VkTm9k
ZSkgewotICAgICAgICAgICAgLy8gaGFuZGxlciBzaGlmdGVkIGZvY3VzCi0gICAgICAgICAgICBm
b2N1c0NoYW5nZUJsb2NrZWQgPSB0cnVlOwotICAgICAgICAgICAgZ290byBTZXRGb2N1c2VkTm9k
ZURvbmU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIHJlbW92ZSBm
aXJpbmcgRE9NRm9jdXNJbkV2ZW50IGV2ZW50IHdoZW4gd2UgYXJlIHN1cmUgbm8gY29udGVudCBk
ZXBlbmRzCi0gICAgICAgIC8vIG9uIGl0LCBwcm9iYWJseSB3aGVuIDxyZGFyOi8vcHJvYmxlbS84
NTAzOTU4PiBpcyBtLgotICAgICAgICBtX2ZvY3VzZWROb2RlLT5kaXNwYXRjaEZvY3VzSW5FdmVu
dChldmVudE5hbWVzKCkuRE9NRm9jdXNJbkV2ZW50LCBvbGRGb2N1c2VkTm9kZSk7IC8vIERPTSBs
ZXZlbCAyIGZvciBjb21wYXRpYmlsaXR5LgotCi0gICAgICAgIGlmIChtX2ZvY3VzZWROb2RlICE9
IG5ld0ZvY3VzZWROb2RlKSB7IAotICAgICAgICAgICAgLy8gaGFuZGxlciBzaGlmdGVkIGZvY3Vz
Ci0gICAgICAgICAgICBmb2N1c0NoYW5nZUJsb2NrZWQgPSB0cnVlOwotICAgICAgICAgICAgZ290
byBTZXRGb2N1c2VkTm9kZURvbmU7Ci0gICAgICAgIH0KLSAgICAgICAgbV9mb2N1c2VkTm9kZS0+
c2V0Rm9jdXModHJ1ZSk7Ci0KLSAgICAgICAgaWYgKG1fZm9jdXNlZE5vZGUtPmlzUm9vdEVkaXRh
YmxlRWxlbWVudCgpKQotICAgICAgICAgICAgZnJhbWUoKS0+ZWRpdG9yKCktPmRpZEJlZ2luRWRp
dGluZygpOwotCi0gICAgICAgIC8vIGV3dywgSSBzdWNrLiBzZXQgdGhlIHF0IGZvY3VzIGNvcnJl
Y3RseQotICAgICAgICAvLyAjIyMgZmluZCBhIGJldHRlciBwbGFjZSBpbiB0aGUgY29kZSBmb3Ig
dGhpcwotICAgICAgICBpZiAodmlldygpKSB7Ci0gICAgICAgICAgICBXaWRnZXQqIGZvY3VzV2lk
Z2V0ID0gd2lkZ2V0Rm9yTm9kZShtX2ZvY3VzZWROb2RlLmdldCgpKTsKLSAgICAgICAgICAgIGlm
IChmb2N1c1dpZGdldCkgewotICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBhIHdpZGdldCBo
YXMgdGhlIHJpZ2h0IHNpemUgYmVmb3JlIGdpdmluZyBpdCBmb2N1cy4KLSAgICAgICAgICAgICAg
ICAvLyBPdGhlcndpc2UsIHdlIGFyZSB0ZXN0aW5nIGVkZ2UgY2FzZXMgb2YgdGhlIFdpZGdldCBj
b2RlLgotICAgICAgICAgICAgICAgIC8vIFNwZWNpZmljYWxseSwgaW4gV2ViQ29yZSB0aGlzIGRv
ZXMgbm90IHdvcmsgd2VsbCBmb3IgdGV4dCBmaWVsZHMuCi0gICAgICAgICAgICAgICAgdXBkYXRl
TGF5b3V0KCk7Ci0gICAgICAgICAgICAgICAgLy8gUmUtZ2V0IHRoZSB3aWRnZXQgaW4gY2FzZSB1
cGRhdGluZyB0aGUgbGF5b3V0IGNoYW5nZWQgdGhpbmdzLgotICAgICAgICAgICAgICAgIGZvY3Vz
V2lkZ2V0ID0gd2lkZ2V0Rm9yTm9kZShtX2ZvY3VzZWROb2RlLmdldCgpKTsKLSAgICAgICAgICAg
IH0KLSAgICAgICAgICAgIGlmIChmb2N1c1dpZGdldCkKLSAgICAgICAgICAgICAgICBmb2N1c1dp
ZGdldC0+c2V0Rm9jdXModHJ1ZSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAg
dmlldygpLT5zZXRGb2N1cyh0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotI2lmIFBMQVRGT1JN
KE1BQykgfHwgUExBVEZPUk0oV0lOKSB8fCBQTEFURk9STShHVEspIHx8IFBMQVRGT1JNKENIUk9N
SVVNKQotICAgIGlmICghZm9jdXNDaGFuZ2VCbG9ja2VkICYmIG1fZm9jdXNlZE5vZGUgJiYgQVhP
YmplY3RDYWNoZTo6YWNjZXNzaWJpbGl0eUVuYWJsZWQoKSkKLSAgICAgICAgYXhPYmplY3RDYWNo
ZSgpLT5oYW5kbGVGb2N1c2VkVUlFbGVtZW50Q2hhbmdlZChvbGRGb2N1c2VkTm9kZS5nZXQoKSwg
bmV3Rm9jdXNlZE5vZGUuZ2V0KCkpOwotI2VuZGlmCi0gICAgaWYgKCFmb2N1c0NoYW5nZUJsb2Nr
ZWQpCi0gICAgICAgIHBhZ2UoKS0+Y2hyb21lKCktPmZvY3VzZWROb2RlQ2hhbmdlZChtX2ZvY3Vz
ZWROb2RlLmdldCgpKTsKLQotU2V0Rm9jdXNlZE5vZGVEb25lOgotICAgIHVwZGF0ZVN0eWxlSWZO
ZWVkZWQoKTsKLSAgICByZXR1cm4gIWZvY3VzQ2hhbmdlQmxvY2tlZDsKLX0KLSAgICAKLXZvaWQg
RG9jdW1lbnQ6OmdldEZvY3VzYWJsZU5vZGVzKFZlY3RvcjxSZWZQdHI8Tm9kZT4gPiYgbm9kZXMp
Ci17Ci0gICAgdXBkYXRlTGF5b3V0KCk7Ci0KLSAgICBmb3IgKE5vZGUqIG5vZGUgPSBmaXJzdENo
aWxkKCk7IG5vZGU7IG5vZGUgPSBub2RlLT50cmF2ZXJzZU5leHROb2RlKCkpIHsKLSAgICAgICAg
aWYgKG5vZGUtPmlzRm9jdXNhYmxlKCkpCi0gICAgICAgICAgICBub2Rlcy5hcHBlbmQobm9kZSk7
Ci0gICAgfQotfQotICAKLXZvaWQgRG9jdW1lbnQ6OnNldENTU1RhcmdldChFbGVtZW50KiBuKQot
ewotICAgIGlmIChtX2Nzc1RhcmdldCkKLSAgICAgICAgbV9jc3NUYXJnZXQtPnNldE5lZWRzU3R5
bGVSZWNhbGMoKTsKLSAgICBtX2Nzc1RhcmdldCA9IG47Ci0gICAgaWYgKG4pCi0gICAgICAgIG4t
PnNldE5lZWRzU3R5bGVSZWNhbGMoKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6cmVnaXN0ZXJOb2Rl
TGlzdENhY2hlKER5bmFtaWNOb2RlTGlzdENhY2hlQmFzZSogbGlzdCkKLXsKLSAgICBpZiAobGlz
dC0+dHlwZSgpICE9IE5vZGVMaXN0Q29sbGVjdGlvblR5cGUpCi0gICAgICAgIG1fbm9kZUxpc3RD
b3VudHNbSW52YWxpZGF0ZU9uSWROYW1lQXR0ckNoYW5nZV0rKzsKLSAgICBtX25vZGVMaXN0Q291
bnRzW2xpc3QtPmludmFsaWRhdGlvblR5cGUoKV0rKzsKLSAgICBpZiAobGlzdC0+aXNSb290ZWRB
dERvY3VtZW50KCkpCi0gICAgICAgIG1fbGlzdHNJbnZhbGlkYXRlZEF0RG9jdW1lbnQuYWRkKGxp
c3QpOwotfQotCi12b2lkIERvY3VtZW50Ojp1bnJlZ2lzdGVyTm9kZUxpc3RDYWNoZShEeW5hbWlj
Tm9kZUxpc3RDYWNoZUJhc2UqIGxpc3QpCi17Ci0gICAgaWYgKGxpc3QtPnR5cGUoKSAhPSBOb2Rl
TGlzdENvbGxlY3Rpb25UeXBlKQotICAgICAgICBtX25vZGVMaXN0Q291bnRzW0ludmFsaWRhdGVP
bklkTmFtZUF0dHJDaGFuZ2VdLS07Ci0gICAgbV9ub2RlTGlzdENvdW50c1tsaXN0LT5pbnZhbGlk
YXRpb25UeXBlKCldLS07Ci0gICAgaWYgKGxpc3QtPmlzUm9vdGVkQXREb2N1bWVudCgpKSB7Ci0g
ICAgICAgIEFTU0VSVChtX2xpc3RzSW52YWxpZGF0ZWRBdERvY3VtZW50LmNvbnRhaW5zKGxpc3Qp
KTsKLSAgICAgICAgbV9saXN0c0ludmFsaWRhdGVkQXREb2N1bWVudC5yZW1vdmUobGlzdCk7Ci0g
ICAgfQotfQotCi12b2lkIERvY3VtZW50OjphdHRhY2hOb2RlSXRlcmF0b3IoTm9kZUl0ZXJhdG9y
KiBuaSkKLXsKLSAgICBtX25vZGVJdGVyYXRvcnMuYWRkKG5pKTsKLX0KLQotdm9pZCBEb2N1bWVu
dDo6ZGV0YWNoTm9kZUl0ZXJhdG9yKE5vZGVJdGVyYXRvciogbmkpCi17Ci0gICAgLy8gVGhlIG5v
ZGUgaXRlcmF0b3IgY2FuIGJlIGRldGFjaGVkIHdpdGhvdXQgaGF2aW5nIGJlZW4gYXR0YWNoZWQg
aWYgaXRzIHJvb3Qgbm9kZSBkaWRuJ3QgaGF2ZSBhIGRvY3VtZW50Ci0gICAgLy8gd2hlbiB0aGUg
aXRlcmF0b3Igd2FzIGNyZWF0ZWQsIGJ1dCBoYXMgaXQgbm93LgotICAgIG1fbm9kZUl0ZXJhdG9y
cy5yZW1vdmUobmkpOwotfQotCi12b2lkIERvY3VtZW50Ojptb3ZlTm9kZUl0ZXJhdG9yc1RvTmV3
RG9jdW1lbnQoTm9kZSogbm9kZSwgRG9jdW1lbnQqIG5ld0RvY3VtZW50KQotewotICAgIEhhc2hT
ZXQ8Tm9kZUl0ZXJhdG9yKj4gbm9kZUl0ZXJhdG9yc0xpc3QgPSBtX25vZGVJdGVyYXRvcnM7Ci0g
ICAgSGFzaFNldDxOb2RlSXRlcmF0b3IqPjo6Y29uc3RfaXRlcmF0b3Igbm9kZUl0ZXJhdG9yc0Vu
ZCA9IG5vZGVJdGVyYXRvcnNMaXN0LmVuZCgpOwotICAgIGZvciAoSGFzaFNldDxOb2RlSXRlcmF0
b3IqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBub2RlSXRlcmF0b3JzTGlzdC5iZWdpbigpOyBpdCAh
PSBub2RlSXRlcmF0b3JzRW5kOyArK2l0KSB7Ci0gICAgICAgIGlmICgoKml0KS0+cm9vdCgpID09
IG5vZGUpIHsKLSAgICAgICAgICAgIGRldGFjaE5vZGVJdGVyYXRvcigqaXQpOwotICAgICAgICAg
ICAgbmV3RG9jdW1lbnQtPmF0dGFjaE5vZGVJdGVyYXRvcigqaXQpOwotICAgICAgICB9Ci0gICAg
fQotfQotCi12b2lkIERvY3VtZW50Ojp1cGRhdGVSYW5nZXNBZnRlckNoaWxkcmVuQ2hhbmdlZChD
b250YWluZXJOb2RlKiBjb250YWluZXIpCi17Ci0gICAgaWYgKCFtX3Jhbmdlcy5pc0VtcHR5KCkp
IHsKLSAgICAgICAgSGFzaFNldDxSYW5nZSo+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBtX3Jhbmdl
cy5lbmQoKTsKLSAgICAgICAgZm9yIChIYXNoU2V0PFJhbmdlKj46OmNvbnN0X2l0ZXJhdG9yIGl0
ID0gbV9yYW5nZXMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KQotICAgICAgICAgICAgKCppdCkt
Pm5vZGVDaGlsZHJlbkNoYW5nZWQoY29udGFpbmVyKTsKLSAgICB9Ci19Ci0KLXZvaWQgRG9jdW1l
bnQ6Om5vZGVDaGlsZHJlbldpbGxCZVJlbW92ZWQoQ29udGFpbmVyTm9kZSogY29udGFpbmVyKQot
ewotICAgIGlmICghbV9yYW5nZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIEhhc2hTZXQ8UmFuZ2Uq
Pjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV9yYW5nZXMuZW5kKCk7Ci0gICAgICAgIGZvciAoSGFz
aFNldDxSYW5nZSo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmFuZ2VzLmJlZ2luKCk7IGl0ICE9
IGVuZDsgKytpdCkKLSAgICAgICAgICAgICgqaXQpLT5ub2RlQ2hpbGRyZW5XaWxsQmVSZW1vdmVk
KGNvbnRhaW5lcik7Ci0gICAgfQotCi0gICAgSGFzaFNldDxOb2RlSXRlcmF0b3IqPjo6Y29uc3Rf
aXRlcmF0b3Igbm9kZUl0ZXJhdG9yc0VuZCA9IG1fbm9kZUl0ZXJhdG9ycy5lbmQoKTsKLSAgICBm
b3IgKEhhc2hTZXQ8Tm9kZUl0ZXJhdG9yKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9ub2RlSXRl
cmF0b3JzLmJlZ2luKCk7IGl0ICE9IG5vZGVJdGVyYXRvcnNFbmQ7ICsraXQpIHsKLSAgICAgICAg
Zm9yIChOb2RlKiBuID0gY29udGFpbmVyLT5maXJzdENoaWxkKCk7IG47IG4gPSBuLT5uZXh0U2li
bGluZygpKQotICAgICAgICAgICAgKCppdCktPm5vZGVXaWxsQmVSZW1vdmVkKG4pOwotICAgIH0K
LQotICAgIGlmIChGcmFtZSogZnJhbWUgPSB0aGlzLT5mcmFtZSgpKSB7Ci0gICAgICAgIGZvciAo
Tm9kZSogbiA9IGNvbnRhaW5lci0+Zmlyc3RDaGlsZCgpOyBuOyBuID0gbi0+bmV4dFNpYmxpbmco
KSkgewotICAgICAgICAgICAgZnJhbWUtPmV2ZW50SGFuZGxlcigpLT5ub2RlV2lsbEJlUmVtb3Zl
ZChuKTsKLSAgICAgICAgICAgIGZyYW1lLT5zZWxlY3Rpb24oKS0+bm9kZVdpbGxCZVJlbW92ZWQo
bik7Ci0gICAgICAgICAgICBmcmFtZS0+cGFnZSgpLT5kcmFnQ2FyZXRDb250cm9sbGVyKCktPm5v
ZGVXaWxsQmVSZW1vdmVkKG4pOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIERvY3VtZW50
Ojpub2RlV2lsbEJlUmVtb3ZlZChOb2RlKiBuKQotewotICAgIEhhc2hTZXQ8Tm9kZUl0ZXJhdG9y
Kj46OmNvbnN0X2l0ZXJhdG9yIG5vZGVJdGVyYXRvcnNFbmQgPSBtX25vZGVJdGVyYXRvcnMuZW5k
KCk7Ci0gICAgZm9yIChIYXNoU2V0PE5vZGVJdGVyYXRvcio+Ojpjb25zdF9pdGVyYXRvciBpdCA9
IG1fbm9kZUl0ZXJhdG9ycy5iZWdpbigpOyBpdCAhPSBub2RlSXRlcmF0b3JzRW5kOyArK2l0KQot
ICAgICAgICAoKml0KS0+bm9kZVdpbGxCZVJlbW92ZWQobik7Ci0KLSAgICBpZiAoIW1fcmFuZ2Vz
LmlzRW1wdHkoKSkgewotICAgICAgICBIYXNoU2V0PFJhbmdlKj46OmNvbnN0X2l0ZXJhdG9yIHJh
bmdlc0VuZCA9IG1fcmFuZ2VzLmVuZCgpOwotICAgICAgICBmb3IgKEhhc2hTZXQ8UmFuZ2UqPjo6
Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3Jhbmdlcy5iZWdpbigpOyBpdCAhPSByYW5nZXNFbmQ7ICsr
aXQpCi0gICAgICAgICAgICAoKml0KS0+bm9kZVdpbGxCZVJlbW92ZWQobik7Ci0gICAgfQotCi0g
ICAgaWYgKEZyYW1lKiBmcmFtZSA9IHRoaXMtPmZyYW1lKCkpIHsKLSAgICAgICAgZnJhbWUtPmV2
ZW50SGFuZGxlcigpLT5ub2RlV2lsbEJlUmVtb3ZlZChuKTsKLSAgICAgICAgZnJhbWUtPnNlbGVj
dGlvbigpLT5ub2RlV2lsbEJlUmVtb3ZlZChuKTsKLSAgICAgICAgZnJhbWUtPnBhZ2UoKS0+ZHJh
Z0NhcmV0Q29udHJvbGxlcigpLT5ub2RlV2lsbEJlUmVtb3ZlZChuKTsKLSAgICB9Ci19Ci0KLXZv
aWQgRG9jdW1lbnQ6OnRleHRJbnNlcnRlZChOb2RlKiB0ZXh0LCB1bnNpZ25lZCBvZmZzZXQsIHVu
c2lnbmVkIGxlbmd0aCkKLXsKLSAgICBpZiAoIW1fcmFuZ2VzLmlzRW1wdHkoKSkgewotICAgICAg
ICBIYXNoU2V0PFJhbmdlKj46OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fcmFuZ2VzLmVuZCgpOwot
ICAgICAgICBmb3IgKEhhc2hTZXQ8UmFuZ2UqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3Jhbmdl
cy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpCi0gICAgICAgICAgICAoKml0KS0+dGV4dEluc2Vy
dGVkKHRleHQsIG9mZnNldCwgbGVuZ3RoKTsKLSAgICB9Ci0KLSAgICAvLyBVcGRhdGUgdGhlIG1h
cmtlcnMgZm9yIHNwZWxsaW5nIGFuZCBncmFtbWFyIGNoZWNraW5nLgotICAgIG1fbWFya2Vycy0+
c2hpZnRNYXJrZXJzKHRleHQsIG9mZnNldCwgbGVuZ3RoKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6
dGV4dFJlbW92ZWQoTm9kZSogdGV4dCwgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBsZW5ndGgp
Ci17Ci0gICAgaWYgKCFtX3Jhbmdlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgSGFzaFNldDxSYW5n
ZSo+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBtX3Jhbmdlcy5lbmQoKTsKLSAgICAgICAgZm9yIChI
YXNoU2V0PFJhbmdlKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yYW5nZXMuYmVnaW4oKTsgaXQg
IT0gZW5kOyArK2l0KQotICAgICAgICAgICAgKCppdCktPnRleHRSZW1vdmVkKHRleHQsIG9mZnNl
dCwgbGVuZ3RoKTsKLSAgICB9Ci0KLSAgICAvLyBVcGRhdGUgdGhlIG1hcmtlcnMgZm9yIHNwZWxs
aW5nIGFuZCBncmFtbWFyIGNoZWNraW5nLgotICAgIG1fbWFya2Vycy0+cmVtb3ZlTWFya2Vycyh0
ZXh0LCBvZmZzZXQsIGxlbmd0aCk7Ci0gICAgbV9tYXJrZXJzLT5zaGlmdE1hcmtlcnModGV4dCwg
b2Zmc2V0ICsgbGVuZ3RoLCAwIC0gbGVuZ3RoKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6dGV4dE5v
ZGVzTWVyZ2VkKFRleHQqIG9sZE5vZGUsIHVuc2lnbmVkIG9mZnNldCkKLXsKLSAgICBpZiAoIW1f
cmFuZ2VzLmlzRW1wdHkoKSkgewotICAgICAgICBOb2RlV2l0aEluZGV4IG9sZE5vZGVXaXRoSW5k
ZXgob2xkTm9kZSk7Ci0gICAgICAgIEhhc2hTZXQ8UmFuZ2UqPjo6Y29uc3RfaXRlcmF0b3IgZW5k
ID0gbV9yYW5nZXMuZW5kKCk7Ci0gICAgICAgIGZvciAoSGFzaFNldDxSYW5nZSo+Ojpjb25zdF9p
dGVyYXRvciBpdCA9IG1fcmFuZ2VzLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkKLSAgICAgICAg
ICAgICgqaXQpLT50ZXh0Tm9kZXNNZXJnZWQob2xkTm9kZVdpdGhJbmRleCwgb2Zmc2V0KTsKLSAg
ICB9Ci0KLSAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgdXBkYXRlIG1hcmtlcnMgZm9yIHNwZWxs
aW5nIGFuZCBncmFtbWFyIGNoZWNraW5nLgotfQotCi12b2lkIERvY3VtZW50Ojp0ZXh0Tm9kZVNw
bGl0KFRleHQqIG9sZE5vZGUpCi17Ci0gICAgaWYgKCFtX3Jhbmdlcy5pc0VtcHR5KCkpIHsKLSAg
ICAgICAgSGFzaFNldDxSYW5nZSo+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBtX3Jhbmdlcy5lbmQo
KTsKLSAgICAgICAgZm9yIChIYXNoU2V0PFJhbmdlKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9y
YW5nZXMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KQotICAgICAgICAgICAgKCppdCktPnRleHRO
b2RlU3BsaXQob2xkTm9kZSk7Ci0gICAgfQotCi0gICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIHVw
ZGF0ZSBtYXJrZXJzIGZvciBzcGVsbGluZyBhbmQgZ3JhbW1hciBjaGVja2luZy4KLX0KLQotdm9p
ZCBEb2N1bWVudDo6Y3JlYXRlRE9NV2luZG93KCkKLXsKLSAgICBBU1NFUlQobV9mcmFtZSk7Ci0g
ICAgQVNTRVJUKCFtX2RvbVdpbmRvdyk7Ci0KLSAgICBtX2RvbVdpbmRvdyA9IERPTVdpbmRvdzo6
Y3JlYXRlKHRoaXMpOwotCi0gICAgQVNTRVJUKG1fZG9tV2luZG93LT5kb2N1bWVudCgpID09IHRo
aXMpOwotICAgIEFTU0VSVChtX2RvbVdpbmRvdy0+ZnJhbWUoKSA9PSBtX2ZyYW1lKTsKLX0KLQot
dm9pZCBEb2N1bWVudDo6dGFrZURPTVdpbmRvd0Zyb20oRG9jdW1lbnQqIGRvY3VtZW50KQotewot
ICAgIEFTU0VSVChtX2ZyYW1lKTsKLSAgICBBU1NFUlQoIW1fZG9tV2luZG93KTsKLSAgICBBU1NF
UlQoZG9jdW1lbnQtPmRvbVdpbmRvdygpKTsKLQotICAgIG1fZG9tV2luZG93ID0gZG9jdW1lbnQt
Pm1fZG9tV2luZG93LnJlbGVhc2UoKTsKLSAgICBtX2RvbVdpbmRvdy0+ZGlkU2VjdXJlVHJhbnNp
dGlvblRvKHRoaXMpOwotCi0gICAgQVNTRVJUKG1fZG9tV2luZG93LT5kb2N1bWVudCgpID09IHRo
aXMpOwotICAgIEFTU0VSVChtX2RvbVdpbmRvdy0+ZnJhbWUoKSA9PSBtX2ZyYW1lKTsKLX0KLQot
dm9pZCBEb2N1bWVudDo6c2V0V2luZG93QXR0cmlidXRlRXZlbnRMaXN0ZW5lcihjb25zdCBBdG9t
aWNTdHJpbmcmIGV2ZW50VHlwZSwgUGFzc1JlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lcikK
LXsKLSAgICBET01XaW5kb3cqIGRvbVdpbmRvdyA9IHRoaXMtPmRvbVdpbmRvdygpOwotICAgIGlm
ICghZG9tV2luZG93KQotICAgICAgICByZXR1cm47Ci0gICAgZG9tV2luZG93LT5zZXRBdHRyaWJ1
dGVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIpOwotfQotCi1FdmVudExpc3RlbmVy
KiBEb2N1bWVudDo6Z2V0V2luZG93QXR0cmlidXRlRXZlbnRMaXN0ZW5lcihjb25zdCBBdG9taWNT
dHJpbmcmIGV2ZW50VHlwZSkKLXsKLSAgICBET01XaW5kb3cqIGRvbVdpbmRvdyA9IHRoaXMtPmRv
bVdpbmRvdygpOwotICAgIGlmICghZG9tV2luZG93KQotICAgICAgICByZXR1cm4gMDsKLSAgICBy
ZXR1cm4gZG9tV2luZG93LT5nZXRBdHRyaWJ1dGVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSk7Ci19
Ci0KLXZvaWQgRG9jdW1lbnQ6OmRpc3BhdGNoV2luZG93RXZlbnQoUGFzc1JlZlB0cjxFdmVudD4g
ZXZlbnQsICBQYXNzUmVmUHRyPEV2ZW50VGFyZ2V0PiB0YXJnZXQpCi17Ci0gICAgQVNTRVJUKCFl
dmVudERpc3BhdGNoRm9yYmlkZGVuKCkpOwotICAgIERPTVdpbmRvdyogZG9tV2luZG93ID0gdGhp
cy0+ZG9tV2luZG93KCk7Ci0gICAgaWYgKCFkb21XaW5kb3cpCi0gICAgICAgIHJldHVybjsKLSAg
ICBkb21XaW5kb3ctPmRpc3BhdGNoRXZlbnQoZXZlbnQsIHRhcmdldCk7Ci19Ci0KLXZvaWQgRG9j
dW1lbnQ6OmRpc3BhdGNoV2luZG93TG9hZEV2ZW50KCkKLXsKLSAgICBBU1NFUlQoIWV2ZW50RGlz
cGF0Y2hGb3JiaWRkZW4oKSk7Ci0gICAgRE9NV2luZG93KiBkb21XaW5kb3cgPSB0aGlzLT5kb21X
aW5kb3coKTsKLSAgICBpZiAoIWRvbVdpbmRvdykKLSAgICAgICAgcmV0dXJuOwotICAgIGRvbVdp
bmRvdy0+ZGlzcGF0Y2hMb2FkRXZlbnQoKTsKLSAgICBtX2xvYWRFdmVudEZpbmlzaGVkID0gdHJ1
ZTsKLX0KLQotdm9pZCBEb2N1bWVudDo6ZW5xdWV1ZVdpbmRvd0V2ZW50KFBhc3NSZWZQdHI8RXZl
bnQ+IGV2ZW50KQotewotICAgIGV2ZW50LT5zZXRUYXJnZXQoZG9tV2luZG93KCkpOwotICAgIG1f
ZXZlbnRRdWV1ZS0+ZW5xdWV1ZUV2ZW50KGV2ZW50KTsKLX0KLQotdm9pZCBEb2N1bWVudDo6ZW5x
dWV1ZURvY3VtZW50RXZlbnQoUGFzc1JlZlB0cjxFdmVudD4gZXZlbnQpCi17Ci0gICAgZXZlbnQt
PnNldFRhcmdldCh0aGlzKTsKLSAgICBtX2V2ZW50UXVldWUtPmVucXVldWVFdmVudChldmVudCk7
Ci19Ci0KLVBhc3NSZWZQdHI8RXZlbnQ+IERvY3VtZW50OjpjcmVhdGVFdmVudChjb25zdCBTdHJp
bmcmIGV2ZW50VHlwZSwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgUmVmUHRyPEV2ZW50PiBl
dmVudCA9IEV2ZW50RmFjdG9yeTo6Y3JlYXRlKGV2ZW50VHlwZSk7Ci0gICAgaWYgKGV2ZW50KQot
ICAgICAgICByZXR1cm4gZXZlbnQucmVsZWFzZSgpOwotCi0gICAgZWMgPSBOT1RfU1VQUE9SVEVE
X0VSUjsKLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBEb2N1bWVudDo6YWRkTXV0YXRpb25FdmVu
dExpc3RlbmVyVHlwZUlmRW5hYmxlZChMaXN0ZW5lclR5cGUgbGlzdGVuZXJUeXBlKQotewotICAg
IGlmIChDb250ZXh0RmVhdHVyZXM6Om11dGF0aW9uRXZlbnRzRW5hYmxlZCh0aGlzKSkKLSAgICAg
ICAgYWRkTGlzdGVuZXJUeXBlKGxpc3RlbmVyVHlwZSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmFk
ZExpc3RlbmVyVHlwZUlmTmVlZGVkKGNvbnN0IEF0b21pY1N0cmluZyYgZXZlbnRUeXBlKQotewot
ICAgIGlmIChldmVudFR5cGUgPT0gZXZlbnROYW1lcygpLkRPTVN1YnRyZWVNb2RpZmllZEV2ZW50
KQotICAgICAgICBhZGRNdXRhdGlvbkV2ZW50TGlzdGVuZXJUeXBlSWZFbmFibGVkKERPTVNVQlRS
RUVNT0RJRklFRF9MSVNURU5FUik7Ci0gICAgZWxzZSBpZiAoZXZlbnRUeXBlID09IGV2ZW50TmFt
ZXMoKS5ET01Ob2RlSW5zZXJ0ZWRFdmVudCkKLSAgICAgICAgYWRkTXV0YXRpb25FdmVudExpc3Rl
bmVyVHlwZUlmRW5hYmxlZChET01OT0RFSU5TRVJURURfTElTVEVORVIpOwotICAgIGVsc2UgaWYg
KGV2ZW50VHlwZSA9PSBldmVudE5hbWVzKCkuRE9NTm9kZVJlbW92ZWRFdmVudCkKLSAgICAgICAg
YWRkTXV0YXRpb25FdmVudExpc3RlbmVyVHlwZUlmRW5hYmxlZChET01OT0RFUkVNT1ZFRF9MSVNU
RU5FUik7Ci0gICAgZWxzZSBpZiAoZXZlbnRUeXBlID09IGV2ZW50TmFtZXMoKS5ET01Ob2RlUmVt
b3ZlZEZyb21Eb2N1bWVudEV2ZW50KQotICAgICAgICBhZGRNdXRhdGlvbkV2ZW50TGlzdGVuZXJU
eXBlSWZFbmFibGVkKERPTU5PREVSRU1PVkVERlJPTURPQ1VNRU5UX0xJU1RFTkVSKTsKLSAgICBl
bHNlIGlmIChldmVudFR5cGUgPT0gZXZlbnROYW1lcygpLkRPTU5vZGVJbnNlcnRlZEludG9Eb2N1
bWVudEV2ZW50KQotICAgICAgICBhZGRNdXRhdGlvbkV2ZW50TGlzdGVuZXJUeXBlSWZFbmFibGVk
KERPTU5PREVJTlNFUlRFRElOVE9ET0NVTUVOVF9MSVNURU5FUik7Ci0gICAgZWxzZSBpZiAoZXZl
bnRUeXBlID09IGV2ZW50TmFtZXMoKS5ET01BdHRyTW9kaWZpZWRFdmVudCkKLSAgICAgICAgYWRk
TXV0YXRpb25FdmVudExpc3RlbmVyVHlwZUlmRW5hYmxlZChET01BVFRSTU9ESUZJRURfTElTVEVO
RVIpOwotICAgIGVsc2UgaWYgKGV2ZW50VHlwZSA9PSBldmVudE5hbWVzKCkuRE9NQ2hhcmFjdGVy
RGF0YU1vZGlmaWVkRXZlbnQpCi0gICAgICAgIGFkZE11dGF0aW9uRXZlbnRMaXN0ZW5lclR5cGVJ
ZkVuYWJsZWQoRE9NQ0hBUkFDVEVSREFUQU1PRElGSUVEX0xJU1RFTkVSKTsKLSAgICBlbHNlIGlm
IChldmVudFR5cGUgPT0gZXZlbnROYW1lcygpLm92ZXJmbG93Y2hhbmdlZEV2ZW50KQotICAgICAg
ICBhZGRMaXN0ZW5lclR5cGUoT1ZFUkZMT1dDSEFOR0VEX0xJU1RFTkVSKTsKLSAgICBlbHNlIGlm
IChldmVudFR5cGUgPT0gZXZlbnROYW1lcygpLndlYmtpdEFuaW1hdGlvblN0YXJ0RXZlbnQpCi0g
ICAgICAgIGFkZExpc3RlbmVyVHlwZShBTklNQVRJT05TVEFSVF9MSVNURU5FUik7Ci0gICAgZWxz
ZSBpZiAoZXZlbnRUeXBlID09IGV2ZW50TmFtZXMoKS53ZWJraXRBbmltYXRpb25FbmRFdmVudCkK
LSAgICAgICAgYWRkTGlzdGVuZXJUeXBlKEFOSU1BVElPTkVORF9MSVNURU5FUik7Ci0gICAgZWxz
ZSBpZiAoZXZlbnRUeXBlID09IGV2ZW50TmFtZXMoKS53ZWJraXRBbmltYXRpb25JdGVyYXRpb25F
dmVudCkKLSAgICAgICAgYWRkTGlzdGVuZXJUeXBlKEFOSU1BVElPTklURVJBVElPTl9MSVNURU5F
Uik7Ci0gICAgZWxzZSBpZiAoZXZlbnRUeXBlID09IGV2ZW50TmFtZXMoKS53ZWJraXRUcmFuc2l0
aW9uRW5kRXZlbnQpCi0gICAgICAgIGFkZExpc3RlbmVyVHlwZShUUkFOU0lUSU9ORU5EX0xJU1RF
TkVSKTsKLSAgICBlbHNlIGlmIChldmVudFR5cGUgPT0gZXZlbnROYW1lcygpLmJlZm9yZWxvYWRF
dmVudCkKLSAgICAgICAgYWRkTGlzdGVuZXJUeXBlKEJFRk9SRUxPQURfTElTVEVORVIpOwotICAg
IGVsc2UgaWYgKGV2ZW50VHlwZSA9PSBldmVudE5hbWVzKCkuc2Nyb2xsRXZlbnQpCi0gICAgICAg
IGFkZExpc3RlbmVyVHlwZShTQ1JPTExfTElTVEVORVIpOwotfQotCi1DU1NTdHlsZURlY2xhcmF0
aW9uKiBEb2N1bWVudDo6Z2V0T3ZlcnJpZGVTdHlsZShFbGVtZW50KiwgY29uc3QgU3RyaW5nJikK
LXsKLSAgICByZXR1cm4gMDsKLX0KLQotSFRNTEZyYW1lT3duZXJFbGVtZW50KiBEb2N1bWVudDo6
b3duZXJFbGVtZW50KCkgY29uc3QKLXsKLSAgICBpZiAoIWZyYW1lKCkpCi0gICAgICAgIHJldHVy
biAwOwotICAgIHJldHVybiBmcmFtZSgpLT5vd25lckVsZW1lbnQoKTsKLX0KLQotU3RyaW5nIERv
Y3VtZW50Ojpjb29raWUoRXhjZXB0aW9uQ29kZSYgZWMpIGNvbnN0Ci17Ci0gICAgaWYgKHBhZ2Uo
KSAmJiAhcGFnZSgpLT5zZXR0aW5ncygpLT5jb29raWVFbmFibGVkKCkpCi0gICAgICAgIHJldHVy
biBTdHJpbmcoKTsKLQotICAgIC8vIEZJWE1FOiBUaGUgSFRNTDUgRE9NIHNwZWMgc3RhdGVzIHRo
YXQgdGhpcyBhdHRyaWJ1dGUgY2FuIHJhaXNlIGFuCi0gICAgLy8gSU5WQUxJRF9TVEFURV9FUlIg
ZXhjZXB0aW9uIG9uIGdldHRpbmcgaWYgdGhlIERvY3VtZW50IGhhcyBubwotICAgIC8vIGJyb3dz
aW5nIGNvbnRleHQuCi0KLSAgICBpZiAoIXNlY3VyaXR5T3JpZ2luKCktPmNhbkFjY2Vzc0Nvb2tp
ZXMoKSkgewotICAgICAgICBlYyA9IFNFQ1VSSVRZX0VSUjsKLSAgICAgICAgcmV0dXJuIFN0cmlu
ZygpOwotICAgIH0KLQotICAgIEtVUkwgY29va2llVVJMID0gdGhpcy0+Y29va2llVVJMKCk7Ci0g
ICAgaWYgKGNvb2tpZVVSTC5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiBTdHJpbmcoKTsKLQot
ICAgIHJldHVybiBjb29raWVzKHRoaXMsIGNvb2tpZVVSTCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6
OnNldENvb2tpZShjb25zdCBTdHJpbmcmIHZhbHVlLCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAg
ICBpZiAocGFnZSgpICYmICFwYWdlKCktPnNldHRpbmdzKCktPmNvb2tpZUVuYWJsZWQoKSkKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgLy8gRklYTUU6IFRoZSBIVE1MNSBET00gc3BlYyBzdGF0ZXMg
dGhhdCB0aGlzIGF0dHJpYnV0ZSBjYW4gcmFpc2UgYW4KLSAgICAvLyBJTlZBTElEX1NUQVRFX0VS
UiBleGNlcHRpb24gb24gc2V0dGluZyBpZiB0aGUgRG9jdW1lbnQgaGFzIG5vCi0gICAgLy8gYnJv
d3NpbmcgY29udGV4dC4KLQotICAgIGlmICghc2VjdXJpdHlPcmlnaW4oKS0+Y2FuQWNjZXNzQ29v
a2llcygpKSB7Ci0gICAgICAgIGVjID0gU0VDVVJJVFlfRVJSOwotICAgICAgICByZXR1cm47Ci0g
ICAgfQotCi0gICAgS1VSTCBjb29raWVVUkwgPSB0aGlzLT5jb29raWVVUkwoKTsKLSAgICBpZiAo
Y29va2llVVJMLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgc2V0Q29va2llcyh0
aGlzLCBjb29raWVVUkwsIHZhbHVlKTsKLX0KLQotU3RyaW5nIERvY3VtZW50OjpyZWZlcnJlcigp
IGNvbnN0Ci17Ci0gICAgaWYgKGZyYW1lKCkpCi0gICAgICAgIHJldHVybiBmcmFtZSgpLT5sb2Fk
ZXIoKS0+cmVmZXJyZXIoKTsKLSAgICByZXR1cm4gU3RyaW5nKCk7Ci19Ci0KLVN0cmluZyBEb2N1
bWVudDo6ZG9tYWluKCkgY29uc3QKLXsKLSAgICByZXR1cm4gc2VjdXJpdHlPcmlnaW4oKS0+ZG9t
YWluKCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnNldERvbWFpbihjb25zdCBTdHJpbmcmIG5ld0Rv
bWFpbiwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgaWYgKFNjaGVtZVJlZ2lzdHJ5Ojppc0Rv
bWFpblJlbGF4YXRpb25Gb3JiaWRkZW5Gb3JVUkxTY2hlbWUoc2VjdXJpdHlPcmlnaW4oKS0+cHJv
dG9jb2woKSkpIHsKLSAgICAgICAgZWMgPSBTRUNVUklUWV9FUlI7Ci0gICAgICAgIHJldHVybjsK
LSAgICB9Ci0KLSAgICAvLyBCb3RoIE5TIGFuZCBJRSBzcGVjaWZ5IHRoYXQgY2hhbmdpbmcgdGhl
IGRvbWFpbiBpcyBvbmx5IGFsbG93ZWQgd2hlbgotICAgIC8vIHRoZSBuZXcgZG9tYWluIGlzIGEg
c3VmZml4IG9mIHRoZSBvbGQgZG9tYWluLgotCi0gICAgLy8gRklYTUU6IFdlIHNob3VsZCBhZGQg
bG9nZ2luZyBpbmRpY2F0aW5nIHdoeSBhIGRvbWFpbiB3YXMgbm90IGFsbG93ZWQuCi0KLSAgICAv
LyBJZiB0aGUgbmV3IGRvbWFpbiBpcyB0aGUgc2FtZSBhcyB0aGUgb2xkIGRvbWFpbiwgc3RpbGwg
Y2FsbAotICAgIC8vIHNlY3VyaXR5T3JpZ2luKCktPnNldERvbWFpbkZvckRPTS4gVGhpcyB3aWxs
IGNoYW5nZSB0aGUKLSAgICAvLyBzZWN1cml0eSBjaGVjayBiZWhhdmlvci4gRm9yIGV4YW1wbGUs
IGlmIGEgcGFnZSBsb2FkZWQgb24gcG9ydCA4MDAwCi0gICAgLy8gYXNzaWducyBpdHMgY3VycmVu
dCBkb21haW4gdXNpbmcgZG9jdW1lbnQuZG9tYWluLCB0aGUgcGFnZSB3aWxsCi0gICAgLy8gYWxs
b3cgb3RoZXIgcGFnZXMgbG9hZGVkIG9uIGRpZmZlcmVudCBwb3J0cyBpbiB0aGUgc2FtZSBkb21h
aW4gdGhhdAotICAgIC8vIGhhdmUgYWxzbyBhc3NpZ25lZCB0byBhY2Nlc3MgdGhpcyBwYWdlLgot
ICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZShkb21haW4oKSwgbmV3RG9tYWluKSkgewotICAgICAg
ICBzZWN1cml0eU9yaWdpbigpLT5zZXREb21haW5Gcm9tRE9NKG5ld0RvbWFpbik7Ci0gICAgICAg
IGlmIChtX2ZyYW1lKQotICAgICAgICAgICAgbV9mcmFtZS0+c2NyaXB0KCktPnVwZGF0ZVNlY3Vy
aXR5T3JpZ2luKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpbnQgb2xkTGVuZ3Ro
ID0gZG9tYWluKCkubGVuZ3RoKCk7Ci0gICAgaW50IG5ld0xlbmd0aCA9IG5ld0RvbWFpbi5sZW5n
dGgoKTsKLSAgICAvLyBlLmcuIG5ld0RvbWFpbiA9IHdlYmtpdC5vcmcgKDEwKSBhbmQgZG9tYWlu
KCkgPSB3d3cud2Via2l0Lm9yZyAoMTQpCi0gICAgaWYgKG5ld0xlbmd0aCA+PSBvbGRMZW5ndGgp
IHsKLSAgICAgICAgZWMgPSBTRUNVUklUWV9FUlI7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0K
LSAgICBTdHJpbmcgdGVzdCA9IGRvbWFpbigpOwotICAgIC8vIENoZWNrIHRoYXQgaXQncyBhIHN1
YmRvbWFpbiwgbm90IGUuZy4gImVia2l0Lm9yZyIKLSAgICBpZiAodGVzdFtvbGRMZW5ndGggLSBu
ZXdMZW5ndGggLSAxXSAhPSAnLicpIHsKLSAgICAgICAgZWMgPSBTRUNVUklUWV9FUlI7Ci0gICAg
ICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBOb3cgdGVzdCBpcyAid2Via2l0Lm9yZyIgZnJv
bSBkb21haW4oKQotICAgIC8vIGFuZCB3ZSBjaGVjayB0aGF0IGl0J3MgdGhlIHNhbWUgdGhpbmcg
YXMgbmV3RG9tYWluCi0gICAgdGVzdC5yZW1vdmUoMCwgb2xkTGVuZ3RoIC0gbmV3TGVuZ3RoKTsK
LSAgICBpZiAodGVzdCAhPSBuZXdEb21haW4pIHsKLSAgICAgICAgZWMgPSBTRUNVUklUWV9FUlI7
Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzZWN1cml0eU9yaWdpbigpLT5zZXREb21h
aW5Gcm9tRE9NKG5ld0RvbWFpbik7Ci0gICAgaWYgKG1fZnJhbWUpCi0gICAgICAgIG1fZnJhbWUt
PnNjcmlwdCgpLT51cGRhdGVTZWN1cml0eU9yaWdpbigpOwotfQotCi0vLyBodHRwOi8vd3d3Lndo
YXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrLyNkb20tZG9jdW1lbnQtbGFzdG1v
ZGlmaWVkCi1TdHJpbmcgRG9jdW1lbnQ6Omxhc3RNb2RpZmllZCgpIGNvbnN0Ci17Ci0gICAgRGF0
ZUNvbXBvbmVudHMgZGF0ZTsKLSAgICBib29sIGZvdW5kRGF0ZSA9IGZhbHNlOwotICAgIGlmICht
X2ZyYW1lKSB7Ci0gICAgICAgIFN0cmluZyBodHRwTGFzdE1vZGlmaWVkOwotICAgICAgICBpZiAo
RG9jdW1lbnRMb2FkZXIqIGRvY3VtZW50TG9hZGVyID0gbG9hZGVyKCkpIAotICAgICAgICAgICAg
aHR0cExhc3RNb2RpZmllZCA9IGRvY3VtZW50TG9hZGVyLT5yZXNwb25zZSgpLmh0dHBIZWFkZXJG
aWVsZCgiTGFzdC1Nb2RpZmllZCIpOwotICAgICAgICBpZiAoIWh0dHBMYXN0TW9kaWZpZWQuaXNF
bXB0eSgpKSB7Ci0gICAgICAgICAgICBkYXRlLnNldE1pbGxpc2Vjb25kc1NpbmNlRXBvY2hGb3JE
YXRlVGltZShwYXJzZURhdGUoaHR0cExhc3RNb2RpZmllZCkpOwotICAgICAgICAgICAgZm91bmRE
YXRlID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvLyBGSVhNRTogSWYgdGhpcyBkb2N1
bWVudCBjYW1lIGZyb20gdGhlIGZpbGUgc3lzdGVtLCB0aGUgSFRNTDUKLSAgICAvLyBzcGVjaWZp
Y2lhdGlvbiB0ZWxscyB1cyB0byByZWFkIHRoZSBsYXN0IG1vZGlmaWNhdGlvbiBkYXRlIGZyb20g
dGhlIGZpbGUKLSAgICAvLyBzeXN0ZW0uCi0gICAgaWYgKCFmb3VuZERhdGUpCi0gICAgICAgIGRh
dGUuc2V0TWlsbGlzZWNvbmRzU2luY2VFcG9jaEZvckRhdGVUaW1lKGN1cnJlbnRUaW1lTVMoKSk7
Ci0gICAgcmV0dXJuIFN0cmluZzo6Zm9ybWF0KCIlMDJkLyUwMmQvJTA0ZCAlMDJkOiUwMmQ6JTAy
ZCIsIGRhdGUubW9udGgoKSArIDEsIGRhdGUubW9udGhEYXkoKSwgZGF0ZS5mdWxsWWVhcigpLCBk
YXRlLmhvdXIoKSwgZGF0ZS5taW51dGUoKSwgZGF0ZS5zZWNvbmQoKSk7Ci19Ci0KLXN0YXRpYyBi
b29sIGlzVmFsaWROYW1lTm9uQVNDSUkoY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMsIHVuc2lnbmVk
IGxlbmd0aCkKLXsKLSAgICB1bnNpZ25lZCBpID0gMDsKLQotICAgIFVDaGFyMzIgYzsKLSAgICBV
MTZfTkVYVChjaGFyYWN0ZXJzLCBpLCBsZW5ndGgsIGMpCi0gICAgaWYgKCFpc1ZhbGlkTmFtZVN0
YXJ0KGMpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICB3aGlsZSAoaSA8IGxlbmd0aCkg
ewotICAgICAgICBVMTZfTkVYVChjaGFyYWN0ZXJzLCBpLCBsZW5ndGgsIGMpCi0gICAgICAgIGlm
ICghaXNWYWxpZE5hbWVQYXJ0KGMpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0K
LQotICAgIHJldHVybiB0cnVlOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBDaGFyVHlwZT4KLXN0
YXRpYyBpbmxpbmUgYm9vbCBpc1ZhbGlkTmFtZUFTQ0lJKGNvbnN0IENoYXJUeXBlKiBjaGFyYWN0
ZXJzLCB1bnNpZ25lZCBsZW5ndGgpCi17Ci0gICAgQ2hhclR5cGUgYyA9IGNoYXJhY3RlcnNbMF07
Ci0gICAgaWYgKCEoaXNBU0NJSUFscGhhKGMpIHx8IGMgPT0gJzonIHx8IGMgPT0gJ18nKSkKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8IGxlbmd0
aDsgKytpKSB7Ci0gICAgICAgIGMgPSBjaGFyYWN0ZXJzW2ldOwotICAgICAgICBpZiAoIShpc0FT
Q0lJQWxwaGFudW1lcmljKGMpIHx8IGMgPT0gJzonIHx8IGMgPT0gJ18nIHx8IGMgPT0gJy0nIHx8
IGMgPT0gJy4nKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1
cm4gdHJ1ZTsKLX0KLQotYm9vbCBEb2N1bWVudDo6aXNWYWxpZE5hbWUoY29uc3QgU3RyaW5nJiBu
YW1lKQotewotICAgIHVuc2lnbmVkIGxlbmd0aCA9IG5hbWUubGVuZ3RoKCk7Ci0gICAgaWYgKCFs
ZW5ndGgpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGNvbnN0IFVDaGFyKiBjaGFyYWN0
ZXJzOwotICAgIGlmIChuYW1lLmlzOEJpdCgpKSB7Ci0gICAgICAgIGlmIChpc1ZhbGlkTmFtZUFT
Q0lJKG5hbWUuY2hhcmFjdGVyczgoKSwgbGVuZ3RoKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVl
OwotICAgICAgICBjaGFyYWN0ZXJzID0gbmFtZS5jaGFyYWN0ZXJzKCk7Ci0gICAgfSBlbHNlIHsK
LSAgICAgICAgY2hhcmFjdGVycyA9IG5hbWUuY2hhcmFjdGVyczE2KCk7Ci0gICAgICAgIGlmIChp
c1ZhbGlkTmFtZUFTQ0lJKGNoYXJhY3RlcnMsIGxlbmd0aCkpCi0gICAgICAgICAgICByZXR1cm4g
dHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGlzVmFsaWROYW1lTm9uQVNDSUkoY2hhcmFjdGVycywg
bGVuZ3RoKTsKLX0KLQotYm9vbCBEb2N1bWVudDo6cGFyc2VRdWFsaWZpZWROYW1lKGNvbnN0IFN0
cmluZyYgcXVhbGlmaWVkTmFtZSwgU3RyaW5nJiBwcmVmaXgsIFN0cmluZyYgbG9jYWxOYW1lLCBF
eGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICB1bnNpZ25lZCBsZW5ndGggPSBxdWFsaWZpZWROYW1l
Lmxlbmd0aCgpOwotCi0gICAgaWYgKCFsZW5ndGgpIHsKLSAgICAgICAgZWMgPSBJTlZBTElEX0NI
QVJBQ1RFUl9FUlI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sIG5h
bWVTdGFydCA9IHRydWU7Ci0gICAgYm9vbCBzYXdDb2xvbiA9IGZhbHNlOwotICAgIGludCBjb2xv
blBvcyA9IDA7Ci0KLSAgICBjb25zdCBVQ2hhciogcyA9IHF1YWxpZmllZE5hbWUuY2hhcmFjdGVy
cygpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsZW5ndGg7KSB7Ci0gICAgICAgIFVD
aGFyMzIgYzsKLSAgICAgICAgVTE2X05FWFQocywgaSwgbGVuZ3RoLCBjKQotICAgICAgICBpZiAo
YyA9PSAnOicpIHsKLSAgICAgICAgICAgIGlmIChzYXdDb2xvbikgewotICAgICAgICAgICAgICAg
IGVjID0gTkFNRVNQQUNFX0VSUjsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIG11
bHRpcGxlIGNvbG9uczogbm90IGFsbG93ZWQKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5h
bWVTdGFydCA9IHRydWU7Ci0gICAgICAgICAgICBzYXdDb2xvbiA9IHRydWU7Ci0gICAgICAgICAg
ICBjb2xvblBvcyA9IGkgLSAxOwotICAgICAgICB9IGVsc2UgaWYgKG5hbWVTdGFydCkgewotICAg
ICAgICAgICAgaWYgKCFpc1ZhbGlkTmFtZVN0YXJ0KGMpKSB7Ci0gICAgICAgICAgICAgICAgZWMg
PSBJTlZBTElEX0NIQVJBQ1RFUl9FUlI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgICAgICAgICAgfQotICAgICAgICAgICAgbmFtZVN0YXJ0ID0gZmFsc2U7Ci0gICAgICAgIH0g
ZWxzZSB7Ci0gICAgICAgICAgICBpZiAoIWlzVmFsaWROYW1lUGFydChjKSkgewotICAgICAgICAg
ICAgICAgIGVjID0gSU5WQUxJRF9DSEFSQUNURVJfRVJSOwotICAgICAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICghc2F3
Q29sb24pIHsKLSAgICAgICAgcHJlZml4ID0gU3RyaW5nKCk7Ci0gICAgICAgIGxvY2FsTmFtZSA9
IHF1YWxpZmllZE5hbWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcHJlZml4ID0gcXVhbGlmaWVk
TmFtZS5zdWJzdHJpbmcoMCwgY29sb25Qb3MpOwotICAgICAgICBpZiAocHJlZml4LmlzRW1wdHko
KSkgewotICAgICAgICAgICAgZWMgPSBOQU1FU1BBQ0VfRVJSOwotICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGxvY2FsTmFtZSA9IHF1YWxpZmllZE5hbWUuc3Vi
c3RyaW5nKGNvbG9uUG9zICsgMSk7Ci0gICAgfQotCi0gICAgaWYgKGxvY2FsTmFtZS5pc0VtcHR5
KCkpIHsKLSAgICAgICAgZWMgPSBOQU1FU1BBQ0VfRVJSOwotICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnNldERlY29k
ZXIoUGFzc1JlZlB0cjxUZXh0UmVzb3VyY2VEZWNvZGVyPiBkZWNvZGVyKQotewotICAgIG1fZGVj
b2RlciA9IGRlY29kZXI7Ci19Ci0KLUtVUkwgRG9jdW1lbnQ6OmNvbXBsZXRlVVJMKGNvbnN0IFN0
cmluZyYgdXJsLCBjb25zdCBLVVJMJiBiYXNlVVJMT3ZlcnJpZGUpIGNvbnN0Ci17Ci0gICAgLy8g
QWx3YXlzIHJldHVybiBhIG51bGwgVVJMIHdoZW4gcGFzc2VkIGEgbnVsbCBzdHJpbmcuCi0gICAg
Ly8gRklYTUU6IFNob3VsZCB3ZSBjaGFuZ2UgdGhlIEtVUkwgY29uc3RydWN0b3IgdG8gaGF2ZSB0
aGlzIGJlaGF2aW9yPwotICAgIC8vIFNlZSBhbHNvIFtDU1NdU3R5bGVTaGVldDo6Y29tcGxldGVV
UkwoY29uc3QgU3RyaW5nJikKLSAgICBpZiAodXJsLmlzTnVsbCgpKQotICAgICAgICByZXR1cm4g
S1VSTCgpOwotICAgIGNvbnN0IEtVUkwmIGJhc2VVUkwgPSAoKGJhc2VVUkxPdmVycmlkZS5pc0Vt
cHR5KCkgfHwgYmFzZVVSTE92ZXJyaWRlID09IGJsYW5rVVJMKCkpICYmIHBhcmVudERvY3VtZW50
KCkpID8gcGFyZW50RG9jdW1lbnQoKS0+YmFzZVVSTCgpIDogYmFzZVVSTE92ZXJyaWRlOwotICAg
IGlmICghbV9kZWNvZGVyKQotICAgICAgICByZXR1cm4gS1VSTChiYXNlVVJMLCB1cmwpOwotICAg
IHJldHVybiBLVVJMKGJhc2VVUkwsIHVybCwgbV9kZWNvZGVyLT5lbmNvZGluZygpKTsKLX0KLQot
S1VSTCBEb2N1bWVudDo6Y29tcGxldGVVUkwoY29uc3QgU3RyaW5nJiB1cmwpIGNvbnN0Ci17Ci0g
ICAgcmV0dXJuIGNvbXBsZXRlVVJMKHVybCwgbV9iYXNlVVJMKTsKLX0KLQotdm9pZCBEb2N1bWVu
dDo6c2V0SW5QYWdlQ2FjaGUoYm9vbCBmbGFnKQotewotICAgIGlmIChtX2luUGFnZUNhY2hlID09
IGZsYWcpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1faW5QYWdlQ2FjaGUgPSBmbGFnOwotCi0g
ICAgRnJhbWVWaWV3KiB2ID0gdmlldygpOwotICAgIGlmIChmbGFnKSB7Ci0gICAgICAgIEFTU0VS
VCghbV9zYXZlZFJlbmRlcmVyKTsKLSAgICAgICAgbV9zYXZlZFJlbmRlcmVyID0gcmVuZGVyZXIo
KTsKLSAgICAgICAgaWYgKHYpIHsKLSAgICAgICAgICAgIHYtPmNhY2hlQ3VycmVudFNjcm9sbFBv
c2l0aW9uKCk7Ci0gICAgICAgICAgICBpZiAocGFnZSgpICYmIHBhZ2UoKS0+bWFpbkZyYW1lKCkg
PT0gbV9mcmFtZSkKLSAgICAgICAgICAgICAgICB2LT5yZXNldFNjcm9sbGJhcnNBbmRDbGVhckNv
bnRlbnRzU2l6ZSgpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHYtPnJlc2V0
U2Nyb2xsYmFycygpOwotICAgICAgICB9Ci0gICAgICAgIG1fc3R5bGVSZWNhbGNUaW1lci5zdG9w
KCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQVNTRVJUKCFyZW5kZXJlcigpIHx8IHJlbmRlcmVy
KCkgPT0gbV9zYXZlZFJlbmRlcmVyKTsKLSAgICAgICAgQVNTRVJUKG1fcmVuZGVyQXJlbmEpOwot
ICAgICAgICBzZXRSZW5kZXJlcihtX3NhdmVkUmVuZGVyZXIpOwotICAgICAgICBtX3NhdmVkUmVu
ZGVyZXIgPSAwOwotCi0gICAgICAgIGlmIChjaGlsZE5lZWRzU3R5bGVSZWNhbGMoKSkKLSAgICAg
ICAgICAgIHNjaGVkdWxlU3R5bGVSZWNhbGMoKTsKLSAgICB9Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6
OmRvY3VtZW50V2lsbEJlY29tZUluYWN0aXZlKCkKLXsKLSNpZiBVU0UoQUNDRUxFUkFURURfQ09N
UE9TSVRJTkcpCi0gICAgaWYgKHJlbmRlcmVyKCkpCi0gICAgICAgIHJlbmRlclZpZXcoKS0+d2ls
bE1vdmVPZmZzY3JlZW4oKTsKLSNlbmRpZgotfQotCi12b2lkIERvY3VtZW50Ojpkb2N1bWVudFdp
bGxTdXNwZW5kRm9yUGFnZUNhY2hlKCkKLXsKLSAgICBkb2N1bWVudFdpbGxCZWNvbWVJbmFjdGl2
ZSgpOwotCi0gICAgSGFzaFNldDxFbGVtZW50Kj46Oml0ZXJhdG9yIGVuZCA9IG1fZG9jdW1lbnRT
dXNwZW5zaW9uQ2FsbGJhY2tFbGVtZW50cy5lbmQoKTsKLSAgICBmb3IgKEhhc2hTZXQ8RWxlbWVu
dCo+OjppdGVyYXRvciBpID0gbV9kb2N1bWVudFN1c3BlbnNpb25DYWxsYmFja0VsZW1lbnRzLmJl
Z2luKCk7IGkgIT0gZW5kOyArK2kpCi0gICAgICAgICgqaSktPmRvY3VtZW50V2lsbFN1c3BlbmRG
b3JQYWdlQ2FjaGUoKTsKLQotI2lmbmRlZiBOREVCVUcKLSAgICAvLyBDbGVhciB0aGUgdXBkYXRl
IGZsYWcgdG8gYmUgYWJsZSB0byBjaGVjayBpZiB0aGUgdmlld3BvcnQgYXJndW1lbnRzIHVwZGF0
ZQotICAgIC8vIGlzIGRpc3BhdGNoZWQsIGFmdGVyIHRoZSBkb2N1bWVudCBpcyByZXN0b3JlZCBm
cm9tIHRoZSBwYWdlIGNhY2hlLgotICAgIG1fZGlkRGlzcGF0Y2hWaWV3cG9ydFByb3BlcnRpZXND
aGFuZ2VkID0gZmFsc2U7Ci0jZW5kaWYKLX0KLQotdm9pZCBEb2N1bWVudDo6ZG9jdW1lbnREaWRS
ZXN1bWVGcm9tUGFnZUNhY2hlKCkgCi17Ci0gICAgVmVjdG9yPEVsZW1lbnQqPiBlbGVtZW50czsK
LSAgICBjb3B5VG9WZWN0b3IobV9kb2N1bWVudFN1c3BlbnNpb25DYWxsYmFja0VsZW1lbnRzLCBl
bGVtZW50cyk7Ci0gICAgVmVjdG9yPEVsZW1lbnQqPjo6aXRlcmF0b3IgZW5kID0gZWxlbWVudHMu
ZW5kKCk7Ci0gICAgZm9yIChWZWN0b3I8RWxlbWVudCo+OjppdGVyYXRvciBpID0gZWxlbWVudHMu
YmVnaW4oKTsgaSAhPSBlbmQ7ICsraSkKLSAgICAgICAgKCppKS0+ZG9jdW1lbnREaWRSZXN1bWVG
cm9tUGFnZUNhY2hlKCk7Ci0KLSNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCi0gICAg
aWYgKHJlbmRlcmVyKCkpCi0gICAgICAgIHJlbmRlclZpZXcoKS0+ZGlkTW92ZU9uc2NyZWVuKCk7
Ci0jZW5kaWYKLQotICAgIGlmIChGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHZpZXcoKSkKLSAgICAg
ICAgZnJhbWVWaWV3LT5zZXRBbmltYXRvcnNBcmVBY3RpdmUoKTsKLQotICAgIEFTU0VSVChtX2Zy
YW1lKTsKLSAgICBtX2ZyYW1lLT5sb2FkZXIoKS0+Y2xpZW50KCktPmRpc3BhdGNoRGlkQmVjb21l
RnJhbWVzZXQoaXNGcmFtZVNldCgpKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6cmVnaXN0ZXJGb3JQ
YWdlQ2FjaGVTdXNwZW5zaW9uQ2FsbGJhY2tzKEVsZW1lbnQqIGUpCi17Ci0gICAgbV9kb2N1bWVu
dFN1c3BlbnNpb25DYWxsYmFja0VsZW1lbnRzLmFkZChlKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6
dW5yZWdpc3RlckZvclBhZ2VDYWNoZVN1c3BlbnNpb25DYWxsYmFja3MoRWxlbWVudCogZSkKLXsK
LSAgICBtX2RvY3VtZW50U3VzcGVuc2lvbkNhbGxiYWNrRWxlbWVudHMucmVtb3ZlKGUpOwotfQot
Ci12b2lkIERvY3VtZW50OjptZWRpYVZvbHVtZURpZENoYW5nZSgpIAotewotICAgIEhhc2hTZXQ8
RWxlbWVudCo+OjppdGVyYXRvciBlbmQgPSBtX21lZGlhVm9sdW1lQ2FsbGJhY2tFbGVtZW50cy5l
bmQoKTsKLSAgICBmb3IgKEhhc2hTZXQ8RWxlbWVudCo+OjppdGVyYXRvciBpID0gbV9tZWRpYVZv
bHVtZUNhbGxiYWNrRWxlbWVudHMuYmVnaW4oKTsgaSAhPSBlbmQ7ICsraSkKLSAgICAgICAgKCpp
KS0+bWVkaWFWb2x1bWVEaWRDaGFuZ2UoKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6cmVnaXN0ZXJG
b3JNZWRpYVZvbHVtZUNhbGxiYWNrcyhFbGVtZW50KiBlKQotewotICAgIG1fbWVkaWFWb2x1bWVD
YWxsYmFja0VsZW1lbnRzLmFkZChlKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6dW5yZWdpc3RlckZv
ck1lZGlhVm9sdW1lQ2FsbGJhY2tzKEVsZW1lbnQqIGUpCi17Ci0gICAgbV9tZWRpYVZvbHVtZUNh
bGxiYWNrRWxlbWVudHMucmVtb3ZlKGUpOwotfQotCi12b2lkIERvY3VtZW50OjpzdG9yYWdlQmxv
Y2tpbmdTdGF0ZURpZENoYW5nZSgpCi17Ci0gICAgaWYgKFNldHRpbmdzKiBzZXR0aW5ncyA9IHRo
aXMtPnNldHRpbmdzKCkpCi0gICAgICAgIHNlY3VyaXR5T3JpZ2luKCktPnNldFN0b3JhZ2VCbG9j
a2luZ1BvbGljeShzZXR0aW5ncy0+c3RvcmFnZUJsb2NraW5nUG9saWN5KCkpOwotfQotCi12b2lk
IERvY3VtZW50Ojpwcml2YXRlQnJvd3NpbmdTdGF0ZURpZENoYW5nZSgpIAotewotICAgIEhhc2hT
ZXQ8RWxlbWVudCo+OjppdGVyYXRvciBlbmQgPSBtX3ByaXZhdGVCcm93c2luZ1N0YXRlQ2hhbmdl
ZEVsZW1lbnRzLmVuZCgpOwotICAgIGZvciAoSGFzaFNldDxFbGVtZW50Kj46Oml0ZXJhdG9yIGl0
ID0gbV9wcml2YXRlQnJvd3NpbmdTdGF0ZUNoYW5nZWRFbGVtZW50cy5iZWdpbigpOyBpdCAhPSBl
bmQ7ICsraXQpCi0gICAgICAgICgqaXQpLT5wcml2YXRlQnJvd3NpbmdTdGF0ZURpZENoYW5nZSgp
OwotfQotCi12b2lkIERvY3VtZW50OjpyZWdpc3RlckZvclByaXZhdGVCcm93c2luZ1N0YXRlQ2hh
bmdlZENhbGxiYWNrcyhFbGVtZW50KiBlKQotewotICAgIG1fcHJpdmF0ZUJyb3dzaW5nU3RhdGVD
aGFuZ2VkRWxlbWVudHMuYWRkKGUpOwotfQotCi12b2lkIERvY3VtZW50Ojp1bnJlZ2lzdGVyRm9y
UHJpdmF0ZUJyb3dzaW5nU3RhdGVDaGFuZ2VkQ2FsbGJhY2tzKEVsZW1lbnQqIGUpCi17Ci0gICAg
bV9wcml2YXRlQnJvd3NpbmdTdGF0ZUNoYW5nZWRFbGVtZW50cy5yZW1vdmUoZSk7Ci19Ci0KLXZv
aWQgRG9jdW1lbnQ6OnNldFNob3VsZENyZWF0ZVJlbmRlcmVycyhib29sIGYpCi17Ci0gICAgbV9j
cmVhdGVSZW5kZXJlcnMgPSBmOwotfQotCi1ib29sIERvY3VtZW50OjpzaG91bGRDcmVhdGVSZW5k
ZXJlcnMoKQotewotICAgIHJldHVybiBtX2NyZWF0ZVJlbmRlcmVyczsKLX0KLQotLy8gU3VwcG9y
dCBmb3IgSmF2YXNjcmlwdCBleGVjQ29tbWFuZCwgYW5kIHJlbGF0ZWQgbWV0aG9kcwotCi1zdGF0
aWMgRWRpdG9yOjpDb21tYW5kIGNvbW1hbmQoRG9jdW1lbnQqIGRvY3VtZW50LCBjb25zdCBTdHJp
bmcmIGNvbW1hbmROYW1lLCBib29sIHVzZXJJbnRlcmZhY2UgPSBmYWxzZSkKLXsKLSAgICBGcmFt
ZSogZnJhbWUgPSBkb2N1bWVudC0+ZnJhbWUoKTsKLSAgICBpZiAoIWZyYW1lIHx8IGZyYW1lLT5k
b2N1bWVudCgpICE9IGRvY3VtZW50KQotICAgICAgICByZXR1cm4gRWRpdG9yOjpDb21tYW5kKCk7
Ci0KLSAgICBkb2N1bWVudC0+dXBkYXRlU3R5bGVJZk5lZWRlZCgpOwotCi0gICAgcmV0dXJuIGZy
YW1lLT5lZGl0b3IoKS0+Y29tbWFuZChjb21tYW5kTmFtZSwKLSAgICAgICAgdXNlckludGVyZmFj
ZSA/IENvbW1hbmRGcm9tRE9NV2l0aFVzZXJJbnRlcmZhY2UgOiBDb21tYW5kRnJvbURPTSk7Ci19
Ci0KLWJvb2wgRG9jdW1lbnQ6OmV4ZWNDb21tYW5kKGNvbnN0IFN0cmluZyYgY29tbWFuZE5hbWUs
IGJvb2wgdXNlckludGVyZmFjZSwgY29uc3QgU3RyaW5nJiB2YWx1ZSkKLXsKLSAgICByZXR1cm4g
Y29tbWFuZCh0aGlzLCBjb21tYW5kTmFtZSwgdXNlckludGVyZmFjZSkuZXhlY3V0ZSh2YWx1ZSk7
Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6OnF1ZXJ5Q29tbWFuZEVuYWJsZWQoY29uc3QgU3RyaW5nJiBj
b21tYW5kTmFtZSkKLXsKLSAgICByZXR1cm4gY29tbWFuZCh0aGlzLCBjb21tYW5kTmFtZSkuaXNF
bmFibGVkKCk7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6OnF1ZXJ5Q29tbWFuZEluZGV0ZXJtKGNvbnN0
IFN0cmluZyYgY29tbWFuZE5hbWUpCi17Ci0gICAgcmV0dXJuIGNvbW1hbmQodGhpcywgY29tbWFu
ZE5hbWUpLnN0YXRlKCkgPT0gTWl4ZWRUcmlTdGF0ZTsKLX0KLQotYm9vbCBEb2N1bWVudDo6cXVl
cnlDb21tYW5kU3RhdGUoY29uc3QgU3RyaW5nJiBjb21tYW5kTmFtZSkKLXsKLSAgICByZXR1cm4g
Y29tbWFuZCh0aGlzLCBjb21tYW5kTmFtZSkuc3RhdGUoKSA9PSBUcnVlVHJpU3RhdGU7Ci19Ci0K
LWJvb2wgRG9jdW1lbnQ6OnF1ZXJ5Q29tbWFuZFN1cHBvcnRlZChjb25zdCBTdHJpbmcmIGNvbW1h
bmROYW1lKQotewotICAgIHJldHVybiBjb21tYW5kKHRoaXMsIGNvbW1hbmROYW1lKS5pc1N1cHBv
cnRlZCgpOwotfQotCi1TdHJpbmcgRG9jdW1lbnQ6OnF1ZXJ5Q29tbWFuZFZhbHVlKGNvbnN0IFN0
cmluZyYgY29tbWFuZE5hbWUpCi17Ci0gICAgcmV0dXJuIGNvbW1hbmQodGhpcywgY29tbWFuZE5h
bWUpLnZhbHVlKCk7Ci19Ci0KLUtVUkwgRG9jdW1lbnQ6Om9wZW5TZWFyY2hEZXNjcmlwdGlvblVS
TCgpCi17Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IG9wZW5TZWFyY2hNSU1FVHlwZSA9
ICJhcHBsaWNhdGlvbi9vcGVuc2VhcmNoZGVzY3JpcHRpb24reG1sIjsKLSAgICBzdGF0aWMgY29u
c3QgY2hhciogY29uc3Qgb3BlblNlYXJjaFJlbGF0aW9uID0gInNlYXJjaCI7Ci0KLSAgICAvLyBG
SVhNRTogV2h5IGRvIG9ubHkgdG9wLWxldmVsIGZyYW1lcyBoYXZlIG9wZW5TZWFyY2hEZXNjcmlw
dGlvblVSTHM/Ci0gICAgaWYgKCFmcmFtZSgpIHx8IGZyYW1lKCktPnRyZWUoKS0+cGFyZW50KCkp
Ci0gICAgICAgIHJldHVybiBLVVJMKCk7Ci0KLSAgICAvLyBGSVhNRTogV2h5IGRvIHdlIG5lZWQg
dG8gd2FpdCBmb3IgRnJhbWVTdGF0ZUNvbXBsZXRlPwotICAgIGlmIChmcmFtZSgpLT5sb2FkZXIo
KS0+c3RhdGUoKSAhPSBGcmFtZVN0YXRlQ29tcGxldGUpCi0gICAgICAgIHJldHVybiBLVVJMKCk7
Ci0KLSAgICBpZiAoIWhlYWQoKSkKLSAgICAgICAgcmV0dXJuIEtVUkwoKTsKLQotICAgIFJlZlB0
cjxIVE1MQ29sbGVjdGlvbj4gY2hpbGRyZW4gPSBoZWFkKCktPmNoaWxkcmVuKCk7Ci0gICAgZm9y
ICh1bnNpZ25lZCBpID0gMDsgTm9kZSogY2hpbGQgPSBjaGlsZHJlbi0+aXRlbShpKTsgaSsrKSB7
Ci0gICAgICAgIGlmICghY2hpbGQtPmhhc1RhZ05hbWUobGlua1RhZykpCi0gICAgICAgICAgICBj
b250aW51ZTsKLSAgICAgICAgSFRNTExpbmtFbGVtZW50KiBsaW5rRWxlbWVudCA9IHN0YXRpY19j
YXN0PEhUTUxMaW5rRWxlbWVudCo+KGNoaWxkKTsKLSAgICAgICAgaWYgKCFlcXVhbElnbm9yaW5n
Q2FzZShsaW5rRWxlbWVudC0+dHlwZSgpLCBvcGVuU2VhcmNoTUlNRVR5cGUpIHx8ICFlcXVhbEln
bm9yaW5nQ2FzZShsaW5rRWxlbWVudC0+cmVsKCksIG9wZW5TZWFyY2hSZWxhdGlvbikpCi0gICAg
ICAgICAgICBjb250aW51ZTsKLSAgICAgICAgaWYgKGxpbmtFbGVtZW50LT5ocmVmKCkuaXNFbXB0
eSgpKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIHJldHVybiBsaW5rRWxlbWVudC0+
aHJlZigpOwotICAgIH0KLQotICAgIHJldHVybiBLVVJMKCk7Ci19Ci0KLSNpZiBFTkFCTEUoWFNM
VCkKLQotdm9pZCBEb2N1bWVudDo6YXBwbHlYU0xUcmFuc2Zvcm0oUHJvY2Vzc2luZ0luc3RydWN0
aW9uKiBwaSkKLXsKLSAgICBSZWZQdHI8WFNMVFByb2Nlc3Nvcj4gcHJvY2Vzc29yID0gWFNMVFBy
b2Nlc3Nvcjo6Y3JlYXRlKCk7Ci0gICAgcHJvY2Vzc29yLT5zZXRYU0xTdHlsZVNoZWV0KHN0YXRp
Y19jYXN0PFhTTFN0eWxlU2hlZXQqPihwaS0+c2hlZXQoKSkpOwotICAgIFN0cmluZyByZXN1bHRN
SU1FVHlwZTsKLSAgICBTdHJpbmcgbmV3U291cmNlOwotICAgIFN0cmluZyByZXN1bHRFbmNvZGlu
ZzsKLSAgICBpZiAoIXByb2Nlc3Nvci0+dHJhbnNmb3JtVG9TdHJpbmcodGhpcywgcmVzdWx0TUlN
RVR5cGUsIG5ld1NvdXJjZSwgcmVzdWx0RW5jb2RpbmcpKQotICAgICAgICByZXR1cm47Ci0gICAg
Ly8gRklYTUU6IElmIHRoZSB0cmFuc2Zvcm0gZmFpbGVkIHdlIHNob3VsZCBwcm9iYWJseSByZXBv
cnQgYW4gZXJyb3IgKGxpa2UgTW96aWxsYSBkb2VzKS4KLSAgICBwcm9jZXNzb3ItPmNyZWF0ZURv
Y3VtZW50RnJvbVNvdXJjZShuZXdTb3VyY2UsIHJlc3VsdEVuY29kaW5nLCByZXN1bHRNSU1FVHlw
ZSwgdGhpcywgZnJhbWUoKSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnNldFRyYW5zZm9ybVNvdXJj
ZShQYXNzT3duUHRyPFRyYW5zZm9ybVNvdXJjZT4gc291cmNlKQotewotICAgIG1fdHJhbnNmb3Jt
U291cmNlID0gc291cmNlOwotfQotCi0jZW5kaWYKLQotdm9pZCBEb2N1bWVudDo6c2V0RGVzaWdu
TW9kZShJbmhlcml0ZWRCb29sIHZhbHVlKQotewotICAgIG1fZGVzaWduTW9kZSA9IHZhbHVlOwot
ICAgIGZvciAoRnJhbWUqIGZyYW1lID0gbV9mcmFtZTsgZnJhbWUgJiYgZnJhbWUtPmRvY3VtZW50
KCk7IGZyYW1lID0gZnJhbWUtPnRyZWUoKS0+dHJhdmVyc2VOZXh0KG1fZnJhbWUpKQotICAgICAg
ICBmcmFtZS0+ZG9jdW1lbnQoKS0+c2NoZWR1bGVGb3JjZWRTdHlsZVJlY2FsYygpOwotfQotCi1E
b2N1bWVudDo6SW5oZXJpdGVkQm9vbCBEb2N1bWVudDo6Z2V0RGVzaWduTW9kZSgpIGNvbnN0Ci17
Ci0gICAgcmV0dXJuIG1fZGVzaWduTW9kZTsKLX0KLQotYm9vbCBEb2N1bWVudDo6aW5EZXNpZ25N
b2RlKCkgY29uc3QKLXsKLSAgICBmb3IgKGNvbnN0IERvY3VtZW50KiBkID0gdGhpczsgZDsgZCA9
IGQtPnBhcmVudERvY3VtZW50KCkpIHsKLSAgICAgICAgaWYgKGQtPm1fZGVzaWduTW9kZSAhPSBp
bmhlcml0KQotICAgICAgICAgICAgcmV0dXJuIGQtPm1fZGVzaWduTW9kZTsKLSAgICB9Ci0gICAg
cmV0dXJuIGZhbHNlOwotfQotCi1Eb2N1bWVudCogRG9jdW1lbnQ6OnBhcmVudERvY3VtZW50KCkg
Y29uc3QKLXsKLSAgICBpZiAoIW1fZnJhbWUpCi0gICAgICAgIHJldHVybiAwOwotICAgIEZyYW1l
KiBwYXJlbnQgPSBtX2ZyYW1lLT50cmVlKCktPnBhcmVudCgpOwotICAgIGlmICghcGFyZW50KQot
ICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gcGFyZW50LT5kb2N1bWVudCgpOwotfQotCi1E
b2N1bWVudCogRG9jdW1lbnQ6OnRvcERvY3VtZW50KCkgY29uc3QKLXsKLSAgICBEb2N1bWVudCog
ZG9jID0gY29uc3RfY2FzdDxEb2N1bWVudCAqPih0aGlzKTsKLSAgICBFbGVtZW50KiBlbGVtZW50
OwotICAgIHdoaWxlICgoZWxlbWVudCA9IGRvYy0+b3duZXJFbGVtZW50KCkpKQotICAgICAgICBk
b2MgPSBlbGVtZW50LT5kb2N1bWVudCgpOwotICAgIAotICAgIHJldHVybiBkb2M7Ci19Ci0KLVBh
c3NSZWZQdHI8QXR0cj4gRG9jdW1lbnQ6OmNyZWF0ZUF0dHJpYnV0ZShjb25zdCBTdHJpbmcmIG5h
bWUsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIHJldHVybiBjcmVhdGVBdHRyaWJ1dGVOUyhT
dHJpbmcoKSwgbmFtZSwgZWMsIHRydWUpOwotfQotCi1QYXNzUmVmUHRyPEF0dHI+IERvY3VtZW50
OjpjcmVhdGVBdHRyaWJ1dGVOUyhjb25zdCBTdHJpbmcmIG5hbWVzcGFjZVVSSSwgY29uc3QgU3Ry
aW5nJiBxdWFsaWZpZWROYW1lLCBFeGNlcHRpb25Db2RlJiBlYywgYm9vbCBzaG91bGRJZ25vcmVO
YW1lc3BhY2VDaGVja3MpCi17Ci0gICAgU3RyaW5nIHByZWZpeCwgbG9jYWxOYW1lOwotICAgIGlm
ICghcGFyc2VRdWFsaWZpZWROYW1lKHF1YWxpZmllZE5hbWUsIHByZWZpeCwgbG9jYWxOYW1lLCBl
YykpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgUXVhbGlmaWVkTmFtZSBxTmFtZShwcmVmaXgs
IGxvY2FsTmFtZSwgbmFtZXNwYWNlVVJJKTsKLQotICAgIGlmICghc2hvdWxkSWdub3JlTmFtZXNw
YWNlQ2hlY2tzICYmICFoYXNWYWxpZE5hbWVzcGFjZUZvckF0dHJpYnV0ZXMocU5hbWUpKSB7Ci0g
ICAgICAgIGVjID0gTkFNRVNQQUNFX0VSUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0g
ICAgcmV0dXJuIEF0dHI6OmNyZWF0ZSh0aGlzLCBxTmFtZSwgZW1wdHlTdHJpbmcoKSk7Ci19Ci0K
LSNpZiBFTkFCTEUoU1ZHKQotY29uc3QgU1ZHRG9jdW1lbnRFeHRlbnNpb25zKiBEb2N1bWVudDo6
c3ZnRXh0ZW5zaW9ucygpCi17Ci0gICAgcmV0dXJuIG1fc3ZnRXh0ZW5zaW9ucy5nZXQoKTsKLX0K
LQotU1ZHRG9jdW1lbnRFeHRlbnNpb25zKiBEb2N1bWVudDo6YWNjZXNzU1ZHRXh0ZW5zaW9ucygp
Ci17Ci0gICAgaWYgKCFtX3N2Z0V4dGVuc2lvbnMpCi0gICAgICAgIG1fc3ZnRXh0ZW5zaW9ucyA9
IGFkb3B0UHRyKG5ldyBTVkdEb2N1bWVudEV4dGVuc2lvbnModGhpcykpOwotICAgIHJldHVybiBt
X3N2Z0V4dGVuc2lvbnMuZ2V0KCk7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6Omhhc1NWR1Jvb3ROb2Rl
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZG9jdW1lbnRFbGVtZW50KCkgJiYgZG9jdW1lbnRFbGVt
ZW50KCktPmhhc1RhZ05hbWUoU1ZHTmFtZXM6OnN2Z1RhZyk7Ci19Ci0jZW5kaWYKLQotLy8gRklY
TUU6IFRoaXMgY2FjaGluZyBtZWNoYW5pc20gc2hvdWxkIGJlIG1lcmdlZCB0aGF0IG9mIER5bmFt
aWNOb2RlTGlzdCBpbiBOb2RlUmFyZURhdGEuCi1QYXNzUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBE
b2N1bWVudDo6Y2FjaGVkQ29sbGVjdGlvbihDb2xsZWN0aW9uVHlwZSB0eXBlKQotewotICAgIEFT
U0VSVChzdGF0aWNfY2FzdDx1bnNpZ25lZD4odHlwZSkgPCBOdW1Vbm5hbWVkRG9jdW1lbnRDYWNo
ZWRUeXBlcyk7Ci0gICAgaWYgKG1fY29sbGVjdGlvbnNbdHlwZV0pCi0gICAgICAgIHJldHVybiBt
X2NvbGxlY3Rpb25zW3R5cGVdOwotCi0gICAgUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBjb2xsZWN0
aW9uOwotICAgIGlmICh0eXBlID09IERvY0FsbCkKLSAgICAgICAgY29sbGVjdGlvbiA9IEhUTUxB
bGxDb2xsZWN0aW9uOjpjcmVhdGUodGhpcyk7Ci0gICAgZWxzZQotICAgICAgICBjb2xsZWN0aW9u
ID0gSFRNTENvbGxlY3Rpb246OmNyZWF0ZSh0aGlzLCB0eXBlKTsKLSAgICBtX2NvbGxlY3Rpb25z
W3R5cGVdID0gY29sbGVjdGlvbi5nZXQoKTsKLQotICAgIHJldHVybiBjb2xsZWN0aW9uLnJlbGVh
c2UoKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6cmVtb3ZlQ2FjaGVkSFRNTENvbGxlY3Rpb24oSFRN
TENvbGxlY3Rpb24qIGNvbGxlY3Rpb24sIENvbGxlY3Rpb25UeXBlIHR5cGUpCi17Ci0gICAgQVNT
RVJUX1VOVVNFRChjb2xsZWN0aW9uLCBtX2NvbGxlY3Rpb25zW3R5cGVdID09IGNvbGxlY3Rpb24p
OwotICAgIG1fY29sbGVjdGlvbnNbdHlwZV0gPSAwOwotfQotCi1QYXNzUmVmUHRyPEhUTUxDb2xs
ZWN0aW9uPiBEb2N1bWVudDo6aW1hZ2VzKCkKLXsKLSAgICByZXR1cm4gY2FjaGVkQ29sbGVjdGlv
bihEb2NJbWFnZXMpOwotfQotCi1QYXNzUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBEb2N1bWVudDo6
YXBwbGV0cygpCi17Ci0gICAgcmV0dXJuIGNhY2hlZENvbGxlY3Rpb24oRG9jQXBwbGV0cyk7Ci19
Ci0KLVBhc3NSZWZQdHI8SFRNTENvbGxlY3Rpb24+IERvY3VtZW50OjplbWJlZHMoKQotewotICAg
IHJldHVybiBjYWNoZWRDb2xsZWN0aW9uKERvY0VtYmVkcyk7Ci19Ci0KLVBhc3NSZWZQdHI8SFRN
TENvbGxlY3Rpb24+IERvY3VtZW50OjpwbHVnaW5zKCkKLXsKLSAgICAvLyBUaGlzIGlzIGFuIGFs
aWFzIGZvciBlbWJlZHMoKSByZXF1aXJlZCBmb3IgdGhlIEpTIERPTSBiaW5kaW5ncy4KLSAgICBy
ZXR1cm4gY2FjaGVkQ29sbGVjdGlvbihEb2NFbWJlZHMpOwotfQotCi1QYXNzUmVmUHRyPEhUTUxD
b2xsZWN0aW9uPiBEb2N1bWVudDo6b2JqZWN0cygpCi17Ci0gICAgcmV0dXJuIGNhY2hlZENvbGxl
Y3Rpb24oRG9jT2JqZWN0cyk7Ci19Ci0KLVBhc3NSZWZQdHI8SFRNTENvbGxlY3Rpb24+IERvY3Vt
ZW50OjpzY3JpcHRzKCkKLXsKLSAgICByZXR1cm4gY2FjaGVkQ29sbGVjdGlvbihEb2NTY3JpcHRz
KTsKLX0KLQotUGFzc1JlZlB0cjxIVE1MQ29sbGVjdGlvbj4gRG9jdW1lbnQ6OmxpbmtzKCkKLXsK
LSAgICByZXR1cm4gY2FjaGVkQ29sbGVjdGlvbihEb2NMaW5rcyk7Ci19Ci0KLVBhc3NSZWZQdHI8
SFRNTENvbGxlY3Rpb24+IERvY3VtZW50Ojpmb3JtcygpCi17Ci0gICAgcmV0dXJuIGNhY2hlZENv
bGxlY3Rpb24oRG9jRm9ybXMpOwotfQotCi1QYXNzUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBEb2N1
bWVudDo6YW5jaG9ycygpCi17Ci0gICAgcmV0dXJuIGNhY2hlZENvbGxlY3Rpb24oRG9jQW5jaG9y
cyk7Ci19Ci0KLVBhc3NSZWZQdHI8SFRNTENvbGxlY3Rpb24+IERvY3VtZW50OjphbGwoKQotewot
ICAgIHJldHVybiBjYWNoZWRDb2xsZWN0aW9uKERvY0FsbCk7Ci19Ci0KLVBhc3NSZWZQdHI8SFRN
TENvbGxlY3Rpb24+IERvY3VtZW50Ojp3aW5kb3dOYW1lZEl0ZW1zKGNvbnN0IEF0b21pY1N0cmlu
ZyYgbmFtZSkKLXsKLSAgICBOYW1lZENvbGxlY3Rpb25NYXA6OkFkZFJlc3VsdCByZXN1bHQgPSBt
X3dpbmRvd05hbWVkSXRlbUNvbGxlY3Rpb25zLmFkZChuYW1lLCAwKTsKLSAgICBpZiAoIXJlc3Vs
dC5pc05ld0VudHJ5KQotICAgICAgICByZXR1cm4gcmVzdWx0Lml0ZXJhdG9yLT5zZWNvbmQ7Ci0K
LSAgICBSZWZQdHI8SFRNTE5hbWVDb2xsZWN0aW9uPiBjb2xsZWN0aW9uID0gSFRNTE5hbWVDb2xs
ZWN0aW9uOjpjcmVhdGUodGhpcywgV2luZG93TmFtZWRJdGVtcywgbmFtZSk7Ci0gICAgcmVzdWx0
Lml0ZXJhdG9yLT5zZWNvbmQgPSBjb2xsZWN0aW9uLmdldCgpOwotICAgIHJldHVybiBjb2xsZWN0
aW9uLnJlbGVhc2UoKTsKLX0KLQotUGFzc1JlZlB0cjxIVE1MQ29sbGVjdGlvbj4gRG9jdW1lbnQ6
OmRvY3VtZW50TmFtZWRJdGVtcyhjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUpCi17Ci0gICAgTmFt
ZWRDb2xsZWN0aW9uTWFwOjpBZGRSZXN1bHQgcmVzdWx0ID0gbV9kb2N1bWVudE5hbWVkSXRlbUNv
bGxlY3Rpb25zLmFkZChuYW1lLCAwKTsKLSAgICBpZiAoIXJlc3VsdC5pc05ld0VudHJ5KQotICAg
ICAgICByZXR1cm4gcmVzdWx0Lml0ZXJhdG9yLT5zZWNvbmQ7Ci0KLSAgICBSZWZQdHI8SFRNTE5h
bWVDb2xsZWN0aW9uPiBjb2xsZWN0aW9uID0gSFRNTE5hbWVDb2xsZWN0aW9uOjpjcmVhdGUodGhp
cywgRG9jdW1lbnROYW1lZEl0ZW1zLCBuYW1lKTsKLSAgICByZXN1bHQuaXRlcmF0b3ItPnNlY29u
ZCA9IGNvbGxlY3Rpb24uZ2V0KCk7Ci0gICAgcmV0dXJuIGNvbGxlY3Rpb24ucmVsZWFzZSgpOwot
fQotCi0vLyBGSVhNRTogVGhpcyBjYWNoaW5nIG1lY2hhbmlzbSBzaG91bGQgYmUgbWVyZ2VkIHRo
YXQgb2YgRHluYW1pY05vZGVMaXN0IGluIE5vZGVSYXJlRGF0YS4KLXZvaWQgRG9jdW1lbnQ6OnJl
bW92ZVdpbmRvd05hbWVkSXRlbUNhY2hlKEhUTUxDb2xsZWN0aW9uKiBjb2xsZWN0aW9uLCBjb25z
dCBBdG9taWNTdHJpbmcmIG5hbWUpCi17Ci0gICAgQVNTRVJUX1VOVVNFRChjb2xsZWN0aW9uLCBt
X3dpbmRvd05hbWVkSXRlbUNvbGxlY3Rpb25zLmdldChuYW1lKSA9PSBjb2xsZWN0aW9uKTsKLSAg
ICBtX3dpbmRvd05hbWVkSXRlbUNvbGxlY3Rpb25zLnJlbW92ZShuYW1lKTsKLX0KLQotdm9pZCBE
b2N1bWVudDo6cmVtb3ZlRG9jdW1lbnROYW1lZEl0ZW1DYWNoZShIVE1MQ29sbGVjdGlvbiogY29s
bGVjdGlvbiwgY29uc3QgQXRvbWljU3RyaW5nJiBuYW1lKQotewotICAgIEFTU0VSVF9VTlVTRUQo
Y29sbGVjdGlvbiwgbV9kb2N1bWVudE5hbWVkSXRlbUNvbGxlY3Rpb25zLmdldChuYW1lKSA9PSBj
b2xsZWN0aW9uKTsKLSAgICBtX2RvY3VtZW50TmFtZWRJdGVtQ29sbGVjdGlvbnMucmVtb3ZlKG5h
bWUpOwotfQotCi12b2lkIERvY3VtZW50OjpmaW5pc2hlZFBhcnNpbmcoKQotewotICAgIEFTU0VS
VCghc2NyaXB0YWJsZURvY3VtZW50UGFyc2VyKCkgfHwgIW1fcGFyc2VyLT5pc1BhcnNpbmcoKSk7
Ci0gICAgQVNTRVJUKCFzY3JpcHRhYmxlRG9jdW1lbnRQYXJzZXIoKSB8fCBtX3JlYWR5U3RhdGUg
IT0gTG9hZGluZyk7Ci0gICAgc2V0UGFyc2luZyhmYWxzZSk7Ci0gICAgaWYgKCFtX2RvY3VtZW50
VGltaW5nLmRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0KQotICAgICAgICBtX2RvY3VtZW50VGlt
aW5nLmRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0ID0gbW9ub3RvbmljYWxseUluY3JlYXNpbmdU
aW1lKCk7Ci0gICAgZGlzcGF0Y2hFdmVudChFdmVudDo6Y3JlYXRlKGV2ZW50TmFtZXMoKS5ET01D
b250ZW50TG9hZGVkRXZlbnQsIHRydWUsIGZhbHNlKSk7Ci0gICAgaWYgKCFtX2RvY3VtZW50VGlt
aW5nLmRvbUNvbnRlbnRMb2FkZWRFdmVudEVuZCkKLSAgICAgICAgbV9kb2N1bWVudFRpbWluZy5k
b21Db250ZW50TG9hZGVkRXZlbnRFbmQgPSBtb25vdG9uaWNhbGx5SW5jcmVhc2luZ1RpbWUoKTsK
LQotICAgIGlmIChSZWZQdHI8RnJhbWU+IGYgPSBmcmFtZSgpKSB7Ci0gICAgICAgIC8vIEZyYW1l
TG9hZGVyOjpmaW5pc2hlZFBhcnNpbmcoKSBtaWdodCBlbmQgdXAgY2FsbGluZyBEb2N1bWVudDo6
aW1wbGljaXRDbG9zZSgpIGlmIGFsbAotICAgICAgICAvLyByZXNvdXJjZSBsb2FkcyBhcmUgY29t
cGxldGUuIEhUTUxPYmplY3RFbGVtZW50cyBjYW4gc3RhcnQgbG9hZGluZyB0aGVpciByZXNvdXJj
ZXMgZnJvbQotICAgICAgICAvLyBwb3N0IGF0dGFjaCBjYWxsYmFja3MgdHJpZ2dlcmVkIGJ5IHJl
Y2FsY1N0eWxlKCkuICBUaGlzIG1lYW5zIGlmIHdlIHBhcnNlIG91dCBhbiA8b2JqZWN0PgotICAg
ICAgICAvLyB0YWcgYW5kIHRoZW4gcmVhY2ggdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQgd2l0aG91
dCB1cGRhdGluZyBzdHlsZXMsIHdlIG1pZ2h0IG5vdCBoYXZlIHlldAotICAgICAgICAvLyBzdGFy
dGVkIHRoZSByZXNvdXJjZSBsb2FkIGFuZCBtaWdodCBmaXJlIHRoZSB3aW5kb3cgbG9hZCBldmVu
dCB0b28gZWFybHkuICBUbyBhdm9pZCB0aGlzCi0gICAgICAgIC8vIHdlIGZvcmNlIHRoZSBzdHls
ZXMgdG8gYmUgdXAgdG8gZGF0ZSBiZWZvcmUgY2FsbGluZyBGcmFtZUxvYWRlcjo6ZmluaXNoZWRQ
YXJzaW5nKCkuCi0gICAgICAgIC8vIFNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9MzY4NjQgc3RhcnRpbmcgYXJvdW5kIGNvbW1lbnQgMzUuCi0gICAgICAgIHVwZGF0
ZVN0eWxlSWZOZWVkZWQoKTsKLQotICAgICAgICBmLT5sb2FkZXIoKS0+ZmluaXNoZWRQYXJzaW5n
KCk7Ci0KLSAgICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpkb21Db250ZW50TG9hZGVk
RXZlbnRGaXJlZChmLmdldCgpKTsKLSAgICB9Ci0KLSAgICAvLyBUaGUgRWxlbWVudEF0dHJpYnV0
ZURhdGEgc2hhcmluZyBjYWNoZSBpcyBvbmx5IHVzZWQgZHVyaW5nIHBhcnNpbmcgc2luY2UKLSAg
ICAvLyB0aGF0J3Mgd2hlbiB0aGUgbWFqb3JpdHkgb2YgaW1tdXRhYmxlIGF0dHJpYnV0ZSBkYXRh
IHdpbGwgYmUgY3JlYXRlZC4KLSAgICBtX2ltbXV0YWJsZUF0dHJpYnV0ZURhdGFDYWNoZS5jbGVh
cigpOwotfQotCi1QYXNzUmVmUHRyPFhQYXRoRXhwcmVzc2lvbj4gRG9jdW1lbnQ6OmNyZWF0ZUV4
cHJlc3Npb24oY29uc3QgU3RyaW5nJiBleHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhQYXRoTlNSZXNvbHZlciogcmVzb2x2
ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgaWYgKCFtX3hwYXRoRXZhbHVhdG9yKQotICAg
ICAgICBtX3hwYXRoRXZhbHVhdG9yID0gWFBhdGhFdmFsdWF0b3I6OmNyZWF0ZSgpOwotICAgIHJl
dHVybiBtX3hwYXRoRXZhbHVhdG9yLT5jcmVhdGVFeHByZXNzaW9uKGV4cHJlc3Npb24sIHJlc29s
dmVyLCBlYyk7Ci19Ci0KLVBhc3NSZWZQdHI8WFBhdGhOU1Jlc29sdmVyPiBEb2N1bWVudDo6Y3Jl
YXRlTlNSZXNvbHZlcihOb2RlKiBub2RlUmVzb2x2ZXIpCi17Ci0gICAgaWYgKCFtX3hwYXRoRXZh
bHVhdG9yKQotICAgICAgICBtX3hwYXRoRXZhbHVhdG9yID0gWFBhdGhFdmFsdWF0b3I6OmNyZWF0
ZSgpOwotICAgIHJldHVybiBtX3hwYXRoRXZhbHVhdG9yLT5jcmVhdGVOU1Jlc29sdmVyKG5vZGVS
ZXNvbHZlcik7Ci19Ci0KLVBhc3NSZWZQdHI8WFBhdGhSZXN1bHQ+IERvY3VtZW50OjpldmFsdWF0
ZShjb25zdCBTdHJpbmcmIGV4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgTm9kZSogY29udGV4dE5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgWFBhdGhOU1Jlc29sdmVyKiByZXNvbHZlciwKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCB0eXBlLAot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhQYXRoUmVzdWx0KiBy
ZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhjZXB0
aW9uQ29kZSYgZWMpCi17Ci0gICAgaWYgKCFtX3hwYXRoRXZhbHVhdG9yKQotICAgICAgICBtX3hw
YXRoRXZhbHVhdG9yID0gWFBhdGhFdmFsdWF0b3I6OmNyZWF0ZSgpOwotICAgIHJldHVybiBtX3hw
YXRoRXZhbHVhdG9yLT5ldmFsdWF0ZShleHByZXNzaW9uLCBjb250ZXh0Tm9kZSwgcmVzb2x2ZXIs
IHR5cGUsIHJlc3VsdCwgZWMpOwotfQotCi1jb25zdCBWZWN0b3I8SWNvblVSTD4mIERvY3VtZW50
OjppY29uVVJMcygpCi17Ci0gICAgbV9pY29uVVJMcy5jbGVhcigpOwotCi0gICAgaWYgKCFoZWFk
KCkgfHwgIShoZWFkKCktPmNoaWxkcmVuKCkpKQotICAgICAgICByZXR1cm4gbV9pY29uVVJMczsK
LQotICAgIC8vIEluY2x1ZGUgYW55IGljb25zIHdoZXJlIHR5cGUgPSBsaW5rLCByZWwgPSAic2hv
cnRjdXQgaWNvbiIuCi0gICAgUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBjaGlsZHJlbiA9IGhlYWQo
KS0+Y2hpbGRyZW4oKTsKLSAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoID0gY2hpbGRyZW4tPmxlbmd0
aCgpOwotICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKLSAg
ICAgICAgTm9kZSogY2hpbGQgPSBjaGlsZHJlbi0+aXRlbShpKTsKLSAgICAgICAgaWYgKCFjaGls
ZC0+aGFzVGFnTmFtZShsaW5rVGFnKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBI
VE1MTGlua0VsZW1lbnQqIGxpbmtFbGVtZW50ID0gc3RhdGljX2Nhc3Q8SFRNTExpbmtFbGVtZW50
Kj4oY2hpbGQpOwotICAgICAgICBpZiAobGlua0VsZW1lbnQtPmljb25UeXBlKCkgIT0gRmF2aWNv
bikKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBpZiAobGlua0VsZW1lbnQtPmhyZWYo
KS5pc0VtcHR5KCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAvLyBQdXQgaXQg
YXQgdGhlIGZyb250IHRvIGVuc3VyZSB0aGF0IGljb25zIHNlZW4gbGF0ZXIgdGFrZSBwcmVjZWRl
bmNlIGFzIHJlcXVpcmVkIGJ5IHRoZSBzcGVjLgotICAgICAgICBJY29uVVJMIG5ld1VSTChsaW5r
RWxlbWVudC0+aHJlZigpLCBsaW5rRWxlbWVudC0+aWNvblNpemVzKCksIGxpbmtFbGVtZW50LT50
eXBlKCksIGxpbmtFbGVtZW50LT5pY29uVHlwZSgpKTsKLSAgICAgICAgbV9pY29uVVJMcy5wcmVw
ZW5kKG5ld1VSTCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1faWNvblVSTHM7Ci19Ci0KLXZvaWQg
RG9jdW1lbnQ6OmFkZEljb25VUkwoY29uc3QgU3RyaW5nJiB1cmwsIGNvbnN0IFN0cmluZyYgbWlt
ZVR5cGUsIGNvbnN0IFN0cmluZyYgc2l6ZXMsIEljb25UeXBlIGljb25UeXBlKQotewotICAgIGlm
ICh1cmwuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBGSVhNRSAtIDxyZGFy
Oi8vcHJvYmxlbS80NzI3NjQ1PiAtIEF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZSwgd2UgbWln
aHQgYWN0dWFsbHkgaG9ub3IgdGhlICJtaW1lVHlwZSIKLSAgICBJY29uVVJMIG5ld1VSTChLVVJM
KFBhcnNlZFVSTFN0cmluZywgdXJsKSwgc2l6ZXMsIG1pbWVUeXBlLCBpY29uVHlwZSk7Ci0KLSAg
ICBpZiAoRnJhbWUqIGYgPSBmcmFtZSgpKSB7Ci0gICAgICAgIEljb25VUkwgaWNvblVSTCA9IGYt
PmxvYWRlcigpLT5pY29uKCktPmljb25VUkwoaWNvblR5cGUpOwotICAgICAgICBpZiAoaWNvblVS
TCA9PSBuZXdVUkwpCi0gICAgICAgICAgICBmLT5sb2FkZXIoKS0+ZGlkQ2hhbmdlSWNvbnMoaWNv
blR5cGUpOwotICAgIH0KLX0KLQotdm9pZCBEb2N1bWVudDo6c2V0VXNlU2VjdXJlS2V5Ym9hcmRF
bnRyeVdoZW5BY3RpdmUoYm9vbCB1c2VzU2VjdXJlS2V5Ym9hcmQpCi17Ci0gICAgaWYgKG1fdXNl
U2VjdXJlS2V5Ym9hcmRFbnRyeVdoZW5BY3RpdmUgPT0gdXNlc1NlY3VyZUtleWJvYXJkKQotICAg
ICAgICByZXR1cm47Ci0KLSAgICBtX3VzZVNlY3VyZUtleWJvYXJkRW50cnlXaGVuQWN0aXZlID0g
dXNlc1NlY3VyZUtleWJvYXJkOwotICAgIG1fZnJhbWUtPnNlbGVjdGlvbigpLT51cGRhdGVTZWN1
cmVLZXlib2FyZEVudHJ5SWZBY3RpdmUoKTsKLX0KLQotYm9vbCBEb2N1bWVudDo6dXNlU2VjdXJl
S2V5Ym9hcmRFbnRyeVdoZW5BY3RpdmUoKSBjb25zdAotewotICAgIHJldHVybiBtX3VzZVNlY3Vy
ZUtleWJvYXJkRW50cnlXaGVuQWN0aXZlOwotfQotCi1zdGF0aWMgYm9vbCBpc0VsaWdpYmxlRm9y
U2VhbWxlc3MoRG9jdW1lbnQqIHBhcmVudCwgRG9jdW1lbnQqIGNoaWxkKQotewotICAgIC8vIEl0
IHNob3VsZCBub3QgbWF0dGVyIHdoYXQgd2UgcmV0dXJuIGZvciB0aGUgdG9wLW1vc3QgZG9jdW1l
bnQuCi0gICAgaWYgKCFwYXJlbnQpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAocGFy
ZW50LT5pc1NhbmRib3hlZChTYW5kYm94U2VhbWxlc3NJZnJhbWVzKSkKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgIGlmIChjaGlsZC0+aXNTcmNkb2NEb2N1bWVudCgpKQotICAgICAgICByZXR1
cm4gdHJ1ZTsKLSAgICBpZiAocGFyZW50LT5zZWN1cml0eU9yaWdpbigpLT5jYW5BY2Nlc3MoY2hp
bGQtPnNlY3VyaXR5T3JpZ2luKCkpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4g
cGFyZW50LT5zZWN1cml0eU9yaWdpbigpLT5jYW5SZXF1ZXN0KGNoaWxkLT51cmwoKSk7Ci19Ci0K
LXZvaWQgRG9jdW1lbnQ6OmluaXRTZWN1cml0eUNvbnRleHQoKQotewotICAgIGlmIChoYXZlSW5p
dGlhbGl6ZWRTZWN1cml0eU9yaWdpbigpKSB7Ci0gICAgICAgIEFTU0VSVChzZWN1cml0eU9yaWdp
bigpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICghbV9mcmFtZSkgewotICAg
ICAgICAvLyBObyBzb3VyY2UgZm9yIGEgc2VjdXJpdHkgY29udGV4dC4KLSAgICAgICAgLy8gVGhp
cyBjYW4gb2NjdXIgdmlhIGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZURvY3VtZW50KCku
Ci0gICAgICAgIG1fY29va2llVVJMID0gS1VSTChQYXJzZWRVUkxTdHJpbmcsIGVtcHR5U3RyaW5n
KCkpOwotICAgICAgICBzZXRTZWN1cml0eU9yaWdpbihTZWN1cml0eU9yaWdpbjo6Y3JlYXRlVW5p
cXVlKCkpOwotICAgICAgICBzZXRDb250ZW50U2VjdXJpdHlQb2xpY3koQ29udGVudFNlY3VyaXR5
UG9saWN5OjpjcmVhdGUodGhpcykpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8g
SW4gdGhlIGNvbW1vbiBjYXNlLCBjcmVhdGUgdGhlIHNlY3VyaXR5IGNvbnRleHQgZnJvbSB0aGUg
Y3VycmVudGx5Ci0gICAgLy8gbG9hZGluZyBVUkwgd2l0aCBhIGZyZXNoIGNvbnRlbnQgc2VjdXJp
dHkgcG9saWN5LgotICAgIG1fY29va2llVVJMID0gbV91cmw7Ci0gICAgZW5mb3JjZVNhbmRib3hG
bGFncyhtX2ZyYW1lLT5sb2FkZXIoKS0+ZWZmZWN0aXZlU2FuZGJveEZsYWdzKCkpOwotICAgIHNl
dFNlY3VyaXR5T3JpZ2luKGlzU2FuZGJveGVkKFNhbmRib3hPcmlnaW4pID8gU2VjdXJpdHlPcmln
aW46OmNyZWF0ZVVuaXF1ZSgpIDogU2VjdXJpdHlPcmlnaW46OmNyZWF0ZShtX3VybCkpOwotICAg
IHNldENvbnRlbnRTZWN1cml0eVBvbGljeShDb250ZW50U2VjdXJpdHlQb2xpY3k6OmNyZWF0ZSh0
aGlzKSk7Ci0KLSAgICBpZiAoU2VjdXJpdHlQb2xpY3k6OmFsbG93U3Vic3RpdHV0ZURhdGFBY2Nl
c3NUb0xvY2FsKCkpIHsKLSAgICAgICAgLy8gSWYgdGhpcyBkb2N1bWVudCB3YXMgbG9hZGVkIHdp
dGggc3Vic3RpdHV0ZURhdGEsIHRoZW4gdGhlIGRvY3VtZW50IGNhbgotICAgICAgICAvLyBsb2Fk
IGxvY2FsIHJlc291cmNlcy4gIFNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9MTY3NTYKLSAgICAgICAgLy8gYW5kIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD0xOTc2MCBmb3IgZnVydGhlcgotICAgICAgICAvLyBkaXNjdXNzaW9uLgotICAg
ICAgICAKLSAgICAgICAgRG9jdW1lbnRMb2FkZXIqIGRvY3VtZW50TG9hZGVyID0gbG9hZGVyKCk7
Ci0gICAgICAgIGlmIChkb2N1bWVudExvYWRlciAmJiBkb2N1bWVudExvYWRlci0+c3Vic3RpdHV0
ZURhdGEoKS5pc1ZhbGlkKCkpCi0gICAgICAgICAgICBzZWN1cml0eU9yaWdpbigpLT5ncmFudExv
YWRMb2NhbFJlc291cmNlcygpOwotICAgIH0KLQotICAgIGlmIChTZXR0aW5ncyogc2V0dGluZ3Mg
PSB0aGlzLT5zZXR0aW5ncygpKSB7Ci0gICAgICAgIGlmICghc2V0dGluZ3MtPmlzV2ViU2VjdXJp
dHlFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIC8vIFdlYiBzZWN1cml0eSBpcyB0dXJuZWQgb2Zm
LiBXZSBzaG91bGQgbGV0IHRoaXMgZG9jdW1lbnQgYWNjZXNzIGV2ZXJ5IG90aGVyIGRvY3VtZW50
LiBUaGlzIGlzIHVzZWQgcHJpbWFyeSBieSB0ZXN0aW5nCi0gICAgICAgICAgICAvLyBoYXJuZXNz
ZXMgZm9yIHdlYiBzaXRlcy4KLSAgICAgICAgICAgIHNlY3VyaXR5T3JpZ2luKCktPmdyYW50VW5p
dmVyc2FsQWNjZXNzKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2VjdXJpdHlPcmlnaW4oKS0+aXNM
b2NhbCgpKSB7Ci0gICAgICAgICAgICBpZiAoc2V0dGluZ3MtPmFsbG93VW5pdmVyc2FsQWNjZXNz
RnJvbUZpbGVVUkxzKCkgfHwgbV9mcmFtZS0+bG9hZGVyKCktPmNsaWVudCgpLT5zaG91bGRGb3Jj
ZVVuaXZlcnNhbEFjY2Vzc0Zyb21Mb2NhbFVSTChtX3VybCkpIHsKLSAgICAgICAgICAgICAgICAv
LyBTb21lIGNsaWVudHMgd2FudCBsb2NhbCBVUkxzIHRvIGhhdmUgdW5pdmVyc2FsIGFjY2Vzcywg
YnV0IHRoYXQgc2V0dGluZyBpcyBkYW5nZXJvdXMgZm9yIG90aGVyIGNsaWVudHMuCi0gICAgICAg
ICAgICAgICAgc2VjdXJpdHlPcmlnaW4oKS0+Z3JhbnRVbml2ZXJzYWxBY2Nlc3MoKTsKLSAgICAg
ICAgICAgIH0gZWxzZSBpZiAoIXNldHRpbmdzLT5hbGxvd0ZpbGVBY2Nlc3NGcm9tRmlsZVVSTHMo
KSkgewotICAgICAgICAgICAgICAgIC8vIFNvbWUgY2xpZW50cyB3YW50IGxvY2FsIFVSTHMgdG8g
aGF2ZSBldmVuIHRpZ2h0ZXIgcmVzdHJpY3Rpb25zIGJ5IGRlZmF1bHQsIGFuZCBub3QgYmUgYWJs
ZSB0byBhY2Nlc3Mgb3RoZXIgbG9jYWwgZmlsZXMuCi0gICAgICAgICAgICAgICAgLy8gRklYTUUg
ODE1Nzg6IFRoZSBuYW1pbmcgb2YgdGhpcyBpcyBjb25mdXNpbmcuIEZpbGVzIHdpdGggcmVzdHJp
Y3RlZCBhY2Nlc3MgdG8gb3RoZXIgbG9jYWwgZmlsZXMKLSAgICAgICAgICAgICAgICAvLyBzdGls
bCBjYW4gaGF2ZSBvdGhlciBwcml2aWxlZ2VzIHRoYXQgY2FuIGJlIHJlbWVtYmVyZWQsIHRoZXJl
Ynkgbm90IG1ha2luZyB0aGVtIHVuaXF1ZSBvcmlnaW5zLgotICAgICAgICAgICAgICAgIHNlY3Vy
aXR5T3JpZ2luKCktPmVuZm9yY2VGaWxlUGF0aFNlcGFyYXRpb24oKTsKLSAgICAgICAgICAgIH0K
LSAgICAgICAgfQotICAgICAgICBzZWN1cml0eU9yaWdpbigpLT5zZXRTdG9yYWdlQmxvY2tpbmdQ
b2xpY3koc2V0dGluZ3MtPnN0b3JhZ2VCbG9ja2luZ1BvbGljeSgpKTsKLSAgICB9Ci0KLSAgICBE
b2N1bWVudCogcGFyZW50RG9jdW1lbnQgPSBvd25lckVsZW1lbnQoKSA/IG93bmVyRWxlbWVudCgp
LT5kb2N1bWVudCgpIDogMDsKLSAgICBpZiAocGFyZW50RG9jdW1lbnQgJiYgbV9mcmFtZS0+bG9h
ZGVyKCktPnNob3VsZFRyZWF0VVJMQXNTcmNkb2NEb2N1bWVudCh1cmwoKSkpIHsKLSAgICAgICAg
bV9pc1NyY2RvY0RvY3VtZW50ID0gdHJ1ZTsKLSAgICAgICAgc2V0QmFzZVVSTE92ZXJyaWRlKHBh
cmVudERvY3VtZW50LT5iYXNlVVJMKCkpOwotICAgIH0KLQotICAgIC8vIEZJWE1FOiBXaGF0IGhh
cHBlbnMgaWYgd2UgaW5oZXJpdCB0aGUgc2VjdXJpdHkgb3JpZ2luPyBUaGlzIGNoZWNrIG1heSBu
ZWVkIHRvIGJlIGxhdGVyLgotICAgIC8vIDxpZnJhbWUgc2VhbWxlc3Mgc3JjPSJhYm91dDpibGFu
ayI+IGxpa2VseSB3b24ndCB3b3JrIGFzLWlzLgotICAgIG1fbWF5RGlzcGxheVNlYW1sZXNzV2l0
aFBhcmVudCA9IGlzRWxpZ2libGVGb3JTZWFtbGVzcyhwYXJlbnREb2N1bWVudCwgdGhpcyk7Ci0K
LSAgICBpZiAoIXNob3VsZEluaGVyaXRTZWN1cml0eU9yaWdpbkZyb21Pd25lcihtX3VybCkpCi0g
ICAgICAgIHJldHVybjsKLQotICAgIC8vIElmIHdlIGRvIG5vdCBvYnRhaW4gYSBtZWFuaW5nZnVs
IG9yaWdpbiBmcm9tIHRoZSBVUkwsIHRoZW4gd2UgdHJ5IHRvCi0gICAgLy8gZmluZCBvbmUgdmlh
IHRoZSBmcmFtZSBoaWVyYXJjaHkuCi0KLSAgICBGcmFtZSogb3duZXJGcmFtZSA9IG1fZnJhbWUt
PnRyZWUoKS0+cGFyZW50KCk7Ci0gICAgaWYgKCFvd25lckZyYW1lKQotICAgICAgICBvd25lckZy
YW1lID0gbV9mcmFtZS0+bG9hZGVyKCktPm9wZW5lcigpOwotCi0gICAgaWYgKCFvd25lckZyYW1l
KSB7Ci0gICAgICAgIGRpZEZhaWxUb0luaXRpYWxpemVTZWN1cml0eU9yaWdpbigpOwotICAgICAg
ICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGlzU2FuZGJveGVkKFNhbmRib3hPcmlnaW4pKSB7
Ci0gICAgICAgIC8vIElmIHdlJ3JlIHN1cHBvc2VkIHRvIGluaGVyaXQgb3VyIHNlY3VyaXR5IG9y
aWdpbiBmcm9tIG91ciBvd25lciwKLSAgICAgICAgLy8gYnV0IHdlJ3JlIGFsc28gc2FuZGJveGVk
LCB0aGUgb25seSB0aGluZyB3ZSBpbmhlcml0IGlzIHRoZSBhYmlsaXR5Ci0gICAgICAgIC8vIHRv
IGxvYWQgbG9jYWwgcmVzb3VyY2VzLiBUaGlzIGxldHMgYWJvdXQ6YmxhbmsgaWZyYW1lcyBpbiBm
aWxlOi8vCi0gICAgICAgIC8vIFVSTCBkb2N1bWVudHMgbG9hZCBpbWFnZXMgYW5kIG90aGVyIHJl
c291cmNlcyBmcm9tIHRoZSBmaWxlIHN5c3RlbS4KLSAgICAgICAgaWYgKG93bmVyRnJhbWUtPmRv
Y3VtZW50KCktPnNlY3VyaXR5T3JpZ2luKCktPmNhbkxvYWRMb2NhbFJlc291cmNlcygpKQotICAg
ICAgICAgICAgc2VjdXJpdHlPcmlnaW4oKS0+Z3JhbnRMb2FkTG9jYWxSZXNvdXJjZXMoKTsKLSAg
ICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1fY29va2llVVJMID0gb3duZXJGcmFtZS0+ZG9j
dW1lbnQoKS0+Y29va2llVVJMKCk7Ci0gICAgLy8gV2UgYWxpYXMgdGhlIFNlY3VyaXR5T3JpZ2lu
cyB0byBtYXRjaCBGaXJlZm94LCBzZWUgQnVnIDE1MzEzCi0gICAgLy8gaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1MzEzCi0gICAgc2V0U2VjdXJpdHlPcmlnaW4ob3du
ZXJGcmFtZS0+ZG9jdW1lbnQoKS0+c2VjdXJpdHlPcmlnaW4oKSk7Ci19Ci0KLXZvaWQgRG9jdW1l
bnQ6OmluaXRDb250ZW50U2VjdXJpdHlQb2xpY3koKQotewotICAgIGlmICghbV9mcmFtZS0+dHJl
ZSgpLT5wYXJlbnQoKSB8fCAoIXNob3VsZEluaGVyaXRTZWN1cml0eU9yaWdpbkZyb21Pd25lciht
X3VybCkgJiYgIWlzUGx1Z2luRG9jdW1lbnQoKSkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNv
bnRlbnRTZWN1cml0eVBvbGljeSgpLT5jb3B5U3RhdGVGcm9tKG1fZnJhbWUtPnRyZWUoKS0+cGFy
ZW50KCktPmRvY3VtZW50KCktPmNvbnRlbnRTZWN1cml0eVBvbGljeSgpKTsKLX0KLQotdm9pZCBE
b2N1bWVudDo6ZGlkVXBkYXRlU2VjdXJpdHlPcmlnaW4oKQotewotICAgIGlmICghbV9mcmFtZSkK
LSAgICAgICAgcmV0dXJuOwotICAgIG1fZnJhbWUtPnNjcmlwdCgpLT51cGRhdGVTZWN1cml0eU9y
aWdpbigpOwotfQotCi1ib29sIERvY3VtZW50Ojppc0NvbnRleHRUaHJlYWQoKSBjb25zdAotewot
ICAgIHJldHVybiBpc01haW5UaHJlYWQoKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6dXBkYXRlVVJM
Rm9yUHVzaE9yUmVwbGFjZVN0YXRlKGNvbnN0IEtVUkwmIHVybCkKLXsKLSAgICBGcmFtZSogZiA9
IGZyYW1lKCk7Ci0gICAgaWYgKCFmKQotICAgICAgICByZXR1cm47Ci0KLSAgICBzZXRVUkwodXJs
KTsKLSAgICBmLT5sb2FkZXIoKS0+c2V0T3V0Z29pbmdSZWZlcnJlcih1cmwpOwotCi0gICAgaWYg
KERvY3VtZW50TG9hZGVyKiBkb2N1bWVudExvYWRlciA9IGxvYWRlcigpKQotICAgICAgICBkb2N1
bWVudExvYWRlci0+cmVwbGFjZVJlcXVlc3RVUkxGb3JTYW1lRG9jdW1lbnROYXZpZ2F0aW9uKHVy
bCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnN0YXRlUG9wcGVkKFBhc3NSZWZQdHI8U2VyaWFsaXpl
ZFNjcmlwdFZhbHVlPiBzdGF0ZU9iamVjdCkKLXsKLSAgICBpZiAoIWZyYW1lKCkpCi0gICAgICAg
IHJldHVybjsKLSAgICAKLSAgICAvLyBQZXIgc3RlcCAxMSBvZiBzZWN0aW9uIDYuNS45IChoaXN0
b3J5IHRyYXZlcnNhbCkgb2YgdGhlIEhUTUw1IHNwZWMsIHdlIAotICAgIC8vIGRlZmVyIGZpcmlu
ZyBvZiBwb3BzdGF0ZSB1bnRpbCB3ZSdyZSBpbiB0aGUgY29tcGxldGUgc3RhdGUuCi0gICAgaWYg
KG1fcmVhZHlTdGF0ZSA9PSBDb21wbGV0ZSkKLSAgICAgICAgZW5xdWV1ZVBvcHN0YXRlRXZlbnQo
c3RhdGVPYmplY3QpOwotICAgIGVsc2UKLSAgICAgICAgbV9wZW5kaW5nU3RhdGVPYmplY3QgPSBz
dGF0ZU9iamVjdDsKLX0KLQotdm9pZCBEb2N1bWVudDo6dXBkYXRlRm9jdXNBcHBlYXJhbmNlU29v
bihib29sIHJlc3RvcmVQcmV2aW91c1NlbGVjdGlvbikKLXsKLSAgICBtX3VwZGF0ZUZvY3VzQXBw
ZWFyYW5jZVJlc3RvcmVzU2VsZWN0aW9uID0gcmVzdG9yZVByZXZpb3VzU2VsZWN0aW9uOwotICAg
IGlmICghbV91cGRhdGVGb2N1c0FwcGVhcmFuY2VUaW1lci5pc0FjdGl2ZSgpKQotICAgICAgICBt
X3VwZGF0ZUZvY3VzQXBwZWFyYW5jZVRpbWVyLnN0YXJ0T25lU2hvdCgwKTsKLX0KLQotdm9pZCBE
b2N1bWVudDo6Y2FuY2VsRm9jdXNBcHBlYXJhbmNlVXBkYXRlKCkKLXsKLSAgICBtX3VwZGF0ZUZv
Y3VzQXBwZWFyYW5jZVRpbWVyLnN0b3AoKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6dXBkYXRlRm9j
dXNBcHBlYXJhbmNlVGltZXJGaXJlZChUaW1lcjxEb2N1bWVudD4qKQotewotICAgIE5vZGUqIG5v
ZGUgPSBmb2N1c2VkTm9kZSgpOwotICAgIGlmICghbm9kZSkKLSAgICAgICAgcmV0dXJuOwotICAg
IGlmICghbm9kZS0+aXNFbGVtZW50Tm9kZSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICB1cGRh
dGVMYXlvdXQoKTsKLQotICAgIEVsZW1lbnQqIGVsZW1lbnQgPSBzdGF0aWNfY2FzdDxFbGVtZW50
Kj4obm9kZSk7Ci0gICAgaWYgKGVsZW1lbnQtPmlzRm9jdXNhYmxlKCkpCi0gICAgICAgIGVsZW1l
bnQtPnVwZGF0ZUZvY3VzQXBwZWFyYW5jZShtX3VwZGF0ZUZvY3VzQXBwZWFyYW5jZVJlc3RvcmVz
U2VsZWN0aW9uKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6YXR0YWNoUmFuZ2UoUmFuZ2UqIHJhbmdl
KQotewotICAgIEFTU0VSVCghbV9yYW5nZXMuY29udGFpbnMocmFuZ2UpKTsKLSAgICBtX3Jhbmdl
cy5hZGQocmFuZ2UpOwotfQotCi12b2lkIERvY3VtZW50OjpkZXRhY2hSYW5nZShSYW5nZSogcmFu
Z2UpCi17Ci0gICAgLy8gV2UgZG9uJ3QgQVNTRVJUIG1fcmFuZ2VzLmNvbnRhaW5zKHJhbmdlKSB0
byBhbGxvdyB1cyB0byBjYWxsIHRoaXMKLSAgICAvLyB1bmNvbmRpdGlvbmFsbHkgdG8gZml4OiBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjYwNDQKLSAgICBtX3Jhbmdl
cy5yZW1vdmUocmFuZ2UpOwotfQotCi1DYW52YXNSZW5kZXJpbmdDb250ZXh0KiBEb2N1bWVudDo6
Z2V0Q1NTQ2FudmFzQ29udGV4dChjb25zdCBTdHJpbmcmIHR5cGUsIGNvbnN0IFN0cmluZyYgbmFt
ZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQotewotICAgIEhUTUxDYW52YXNFbGVtZW50KiBlbGVt
ZW50ID0gZ2V0Q1NTQ2FudmFzRWxlbWVudChuYW1lKTsKLSAgICBpZiAoIWVsZW1lbnQpCi0gICAg
ICAgIHJldHVybiAwOwotICAgIGVsZW1lbnQtPnNldFNpemUoSW50U2l6ZSh3aWR0aCwgaGVpZ2h0
KSk7Ci0gICAgcmV0dXJuIGVsZW1lbnQtPmdldENvbnRleHQodHlwZSk7Ci19Ci0KLUhUTUxDYW52
YXNFbGVtZW50KiBEb2N1bWVudDo6Z2V0Q1NTQ2FudmFzRWxlbWVudChjb25zdCBTdHJpbmcmIG5h
bWUpCi17Ci0gICAgUmVmUHRyPEhUTUxDYW52YXNFbGVtZW50PiYgZWxlbWVudCA9IG1fY3NzQ2Fu
dmFzRWxlbWVudHMuYWRkKG5hbWUsIDApLml0ZXJhdG9yLT5zZWNvbmQ7Ci0gICAgaWYgKCFlbGVt
ZW50KQotICAgICAgICBlbGVtZW50ID0gSFRNTENhbnZhc0VsZW1lbnQ6OmNyZWF0ZSh0aGlzKTsK
LSAgICByZXR1cm4gZWxlbWVudC5nZXQoKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6aW5pdEROU1By
ZWZldGNoKCkKLXsKLSAgICBTZXR0aW5ncyogc2V0dGluZ3MgPSB0aGlzLT5zZXR0aW5ncygpOwot
Ci0gICAgbV9oYXZlRXhwbGljaXRseURpc2FibGVkRE5TUHJlZmV0Y2ggPSBmYWxzZTsKLSAgICBt
X2lzRE5TUHJlZmV0Y2hFbmFibGVkID0gc2V0dGluZ3MgJiYgc2V0dGluZ3MtPmRuc1ByZWZldGNo
aW5nRW5hYmxlZCgpICYmIHNlY3VyaXR5T3JpZ2luKCktPnByb3RvY29sKCkgPT0gImh0dHAiOwot
Ci0gICAgLy8gSW5oZXJpdCBETlMgcHJlZmV0Y2ggb3B0LW91dCBmcm9tIHBhcmVudCBmcmFtZSAg
ICAKLSAgICBpZiAoRG9jdW1lbnQqIHBhcmVudCA9IHBhcmVudERvY3VtZW50KCkpIHsKLSAgICAg
ICAgaWYgKCFwYXJlbnQtPmlzRE5TUHJlZmV0Y2hFbmFibGVkKCkpCi0gICAgICAgICAgICBtX2lz
RE5TUHJlZmV0Y2hFbmFibGVkID0gZmFsc2U7Ci0gICAgfQotfQotCi12b2lkIERvY3VtZW50Ojpw
YXJzZUROU1ByZWZldGNoQ29udHJvbEhlYWRlcihjb25zdCBTdHJpbmcmIGRuc1ByZWZldGNoQ29u
dHJvbCkKLXsKLSAgICBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoZG5zUHJlZmV0Y2hDb250cm9sLCAi
b24iKSAmJiAhbV9oYXZlRXhwbGljaXRseURpc2FibGVkRE5TUHJlZmV0Y2gpIHsKLSAgICAgICAg
bV9pc0ROU1ByZWZldGNoRW5hYmxlZCA9IHRydWU7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0K
LSAgICBtX2lzRE5TUHJlZmV0Y2hFbmFibGVkID0gZmFsc2U7Ci0gICAgbV9oYXZlRXhwbGljaXRs
eURpc2FibGVkRE5TUHJlZmV0Y2ggPSB0cnVlOwotfQotCi12b2lkIERvY3VtZW50OjphZGRNZXNz
YWdlKE1lc3NhZ2VTb3VyY2Ugc291cmNlLCBNZXNzYWdlVHlwZSB0eXBlLCBNZXNzYWdlTGV2ZWwg
bGV2ZWwsIGNvbnN0IFN0cmluZyYgbWVzc2FnZSwgY29uc3QgU3RyaW5nJiBzb3VyY2VVUkwsIHVu
c2lnbmVkIGxpbmVOdW1iZXIsIFBhc3NSZWZQdHI8U2NyaXB0Q2FsbFN0YWNrPiBjYWxsU3RhY2sp
Ci17Ci0gICAgaWYgKCFpc0NvbnRleHRUaHJlYWQoKSkgewotICAgICAgICBwb3N0VGFzayhBZGRD
b25zb2xlTWVzc2FnZVRhc2s6OmNyZWF0ZShzb3VyY2UsIHR5cGUsIGxldmVsLCBtZXNzYWdlKSk7
Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoRE9NV2luZG93KiB3aW5kb3cgPSBk
b21XaW5kb3coKSkKLSAgICAgICAgd2luZG93LT5jb25zb2xlKCktPmFkZE1lc3NhZ2Uoc291cmNl
LCB0eXBlLCBsZXZlbCwgbWVzc2FnZSwgc291cmNlVVJMLCBsaW5lTnVtYmVyLCBjYWxsU3RhY2sp
OwotfQotCi1zdHJ1Y3QgUGVyZm9ybVRhc2tDb250ZXh0IHsKLSAgICBXVEZfTUFLRV9OT05DT1BZ
QUJMRShQZXJmb3JtVGFza0NvbnRleHQpOyBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKLXB1Ymxp
YzoKLSAgICBQZXJmb3JtVGFza0NvbnRleHQoUGFzc1JlZlB0cjxEb2N1bWVudFdlYWtSZWZlcmVu
Y2U+IGRvY3VtZW50UmVmZXJlbmNlLCBQYXNzT3duUHRyPFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQ6
OlRhc2s+IHRhc2spCi0gICAgICAgIDogZG9jdW1lbnRSZWZlcmVuY2UoZG9jdW1lbnRSZWZlcmVu
Y2UpCi0gICAgICAgICwgdGFzayh0YXNrKQotICAgIHsKLSAgICB9Ci0KLSAgICBSZWZQdHI8RG9j
dW1lbnRXZWFrUmVmZXJlbmNlPiBkb2N1bWVudFJlZmVyZW5jZTsKLSAgICBPd25QdHI8U2NyaXB0
RXhlY3V0aW9uQ29udGV4dDo6VGFzaz4gdGFzazsKLX07Ci0KLXZvaWQgRG9jdW1lbnQ6OmRpZFJl
Y2VpdmVUYXNrKHZvaWQqIHVudHlwZWRDb250ZXh0KQotewotICAgIEFTU0VSVChpc01haW5UaHJl
YWQoKSk7Ci0KLSAgICBPd25QdHI8UGVyZm9ybVRhc2tDb250ZXh0PiBjb250ZXh0ID0gYWRvcHRQ
dHIoc3RhdGljX2Nhc3Q8UGVyZm9ybVRhc2tDb250ZXh0Kj4odW50eXBlZENvbnRleHQpKTsKLSAg
ICBBU1NFUlQoY29udGV4dCk7Ci0KLSAgICBEb2N1bWVudCogZG9jdW1lbnQgPSBjb250ZXh0LT5k
b2N1bWVudFJlZmVyZW5jZS0+ZG9jdW1lbnQoKTsKLSAgICBpZiAoIWRvY3VtZW50KQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBQYWdlKiBwYWdlID0gZG9jdW1lbnQtPnBhZ2UoKTsKLSAgICBpZiAo
KHBhZ2UgJiYgcGFnZS0+ZGVmZXJzTG9hZGluZygpKSB8fCAhZG9jdW1lbnQtPm1fcGVuZGluZ1Rh
c2tzLmlzRW1wdHkoKSkgewotICAgICAgICBkb2N1bWVudC0+bV9wZW5kaW5nVGFza3MuYXBwZW5k
KGNvbnRleHQtPnRhc2sucmVsZWFzZSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAg
IGNvbnRleHQtPnRhc2stPnBlcmZvcm1UYXNrKGRvY3VtZW50KTsKLX0KLQotdm9pZCBEb2N1bWVu
dDo6cG9zdFRhc2soUGFzc093blB0cjxUYXNrPiB0YXNrKQotewotICAgIGNhbGxPbk1haW5UaHJl
YWQoZGlkUmVjZWl2ZVRhc2ssIG5ldyBQZXJmb3JtVGFza0NvbnRleHQobV93ZWFrUmVmZXJlbmNl
LCB0YXNrKSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnBlbmRpbmdUYXNrc1RpbWVyRmlyZWQoVGlt
ZXI8RG9jdW1lbnQ+KikKLXsKLSAgICB3aGlsZSAoIW1fcGVuZGluZ1Rhc2tzLmlzRW1wdHkoKSkg
ewotICAgICAgICBPd25QdHI8VGFzaz4gdGFzayA9IG1fcGVuZGluZ1Rhc2tzWzBdLnJlbGVhc2Uo
KTsKLSAgICAgICAgbV9wZW5kaW5nVGFza3MucmVtb3ZlKDApOwotICAgICAgICB0YXNrLT5wZXJm
b3JtVGFzayh0aGlzKTsKLSAgICB9Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnN1c3BlbmRTY2hlZHVs
ZWRUYXNrcyhBY3RpdmVET01PYmplY3Q6OlJlYXNvbkZvclN1c3BlbnNpb24gcmVhc29uKQotewot
ICAgIEFTU0VSVCghbV9zY2hlZHVsZWRUYXNrc0FyZVN1c3BlbmRlZCk7Ci0KLSAgICBzdXNwZW5k
U2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyQ2FsbGJhY2tzKCk7Ci0gICAgc3VzcGVuZEFjdGl2
ZURPTU9iamVjdHMocmVhc29uKTsKLSAgICBzY3JpcHRSdW5uZXIoKS0+c3VzcGVuZCgpOwotICAg
IG1fcGVuZGluZ1Rhc2tzVGltZXIuc3RvcCgpOwotICAgIGlmIChtX3BhcnNlcikKLSAgICAgICAg
bV9wYXJzZXItPnN1c3BlbmRTY2hlZHVsZWRUYXNrcygpOwotCi0gICAgbV9zY2hlZHVsZWRUYXNr
c0FyZVN1c3BlbmRlZCA9IHRydWU7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnJlc3VtZVNjaGVkdWxl
ZFRhc2tzKCkKLXsKLSAgICBBU1NFUlQobV9zY2hlZHVsZWRUYXNrc0FyZVN1c3BlbmRlZCk7Ci0K
LSAgICBpZiAobV9wYXJzZXIpCi0gICAgICAgIG1fcGFyc2VyLT5yZXN1bWVTY2hlZHVsZWRUYXNr
cygpOwotICAgIGlmICghbV9wZW5kaW5nVGFza3MuaXNFbXB0eSgpKQotICAgICAgICBtX3BlbmRp
bmdUYXNrc1RpbWVyLnN0YXJ0T25lU2hvdCgwKTsKLSAgICBzY3JpcHRSdW5uZXIoKS0+cmVzdW1l
KCk7Ci0gICAgcmVzdW1lQWN0aXZlRE9NT2JqZWN0cygpOwotICAgIHJlc3VtZVNjcmlwdGVkQW5p
bWF0aW9uQ29udHJvbGxlckNhbGxiYWNrcygpOwotICAgIAotICAgIG1fc2NoZWR1bGVkVGFza3NB
cmVTdXNwZW5kZWQgPSBmYWxzZTsKLX0KLQotdm9pZCBEb2N1bWVudDo6c3VzcGVuZFNjcmlwdGVk
QW5pbWF0aW9uQ29udHJvbGxlckNhbGxiYWNrcygpCi17Ci0jaWYgRU5BQkxFKFJFUVVFU1RfQU5J
TUFUSU9OX0ZSQU1FKQotICAgIGlmIChtX3NjcmlwdGVkQW5pbWF0aW9uQ29udHJvbGxlcikKLSAg
ICAgICAgbV9zY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXItPnN1c3BlbmQoKTsKLSNlbmRpZgot
fQotCi12b2lkIERvY3VtZW50OjpyZXN1bWVTY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXJDYWxs
YmFja3MoKQotewotI2lmIEVOQUJMRShSRVFVRVNUX0FOSU1BVElPTl9GUkFNRSkKLSAgICBpZiAo
bV9zY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXIpCi0gICAgICAgIG1fc2NyaXB0ZWRBbmltYXRp
b25Db250cm9sbGVyLT5yZXN1bWUoKTsKLSNlbmRpZgotfQotCi12b2lkIERvY3VtZW50Ojp3aW5k
b3dTY3JlZW5EaWRDaGFuZ2UoUGxhdGZvcm1EaXNwbGF5SUQgZGlzcGxheUlEKQotewotI2lmIEVO
QUJMRShSRVFVRVNUX0FOSU1BVElPTl9GUkFNRSkKLSAgICBpZiAobV9zY3JpcHRlZEFuaW1hdGlv
bkNvbnRyb2xsZXIpCi0gICAgICAgIG1fc2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyLT53aW5k
b3dTY3JlZW5EaWRDaGFuZ2UoZGlzcGxheUlEKTsKLSNlbHNlCi0gICAgVU5VU0VEX1BBUkFNKGRp
c3BsYXlJRCk7Ci0jZW5kaWYKLX0KLQotCi1TdHJpbmcgRG9jdW1lbnQ6OmRpc3BsYXlTdHJpbmdN
b2RpZmllZEJ5RW5jb2RpbmcoY29uc3QgU3RyaW5nJiBzdHIpIGNvbnN0Ci17Ci0gICAgaWYgKG1f
ZGVjb2RlcikKLSAgICAgICAgcmV0dXJuIG1fZGVjb2Rlci0+ZW5jb2RpbmcoKS5kaXNwbGF5U3Ry
aW5nKHN0ci5pbXBsKCkpOwotICAgIHJldHVybiBzdHI7Ci19Ci0KLVBhc3NSZWZQdHI8U3RyaW5n
SW1wbD4gRG9jdW1lbnQ6OmRpc3BsYXlTdHJpbmdNb2RpZmllZEJ5RW5jb2RpbmcoUGFzc1JlZlB0
cjxTdHJpbmdJbXBsPiBzdHIpIGNvbnN0Ci17Ci0gICAgaWYgKG1fZGVjb2RlcikKLSAgICAgICAg
cmV0dXJuIG1fZGVjb2Rlci0+ZW5jb2RpbmcoKS5kaXNwbGF5U3RyaW5nKHN0cik7Ci0gICAgcmV0
dXJuIHN0cjsKLX0KLQotdm9pZCBEb2N1bWVudDo6ZGlzcGxheUJ1ZmZlck1vZGlmaWVkQnlFbmNv
ZGluZyhVQ2hhciogYnVmZmVyLCB1bnNpZ25lZCBsZW4pIGNvbnN0Ci17Ci0gICAgaWYgKG1fZGVj
b2RlcikKLSAgICAgICAgbV9kZWNvZGVyLT5lbmNvZGluZygpLmRpc3BsYXlCdWZmZXIoYnVmZmVy
LCBsZW4pOwotfQotCi12b2lkIERvY3VtZW50OjplbnF1ZXVlUGFnZXNob3dFdmVudChQYWdlc2hv
d0V2ZW50UGVyc2lzdGVuY2UgcGVyc2lzdGVkKQotewotICAgIC8vIEZJWE1FOiBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzYzMzQgUGFnZXNob3cgZXZlbnQgbmVlZHMg
dG8gZmlyZSBhc3luY2hyb25vdXNseS4KLSAgICBkaXNwYXRjaFdpbmRvd0V2ZW50KFBhZ2VUcmFu
c2l0aW9uRXZlbnQ6OmNyZWF0ZShldmVudE5hbWVzKCkucGFnZXNob3dFdmVudCwgcGVyc2lzdGVk
KSwgdGhpcyk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmVucXVldWVIYXNoY2hhbmdlRXZlbnQoY29u
c3QgU3RyaW5nJiBvbGRVUkwsIGNvbnN0IFN0cmluZyYgbmV3VVJMKQotewotICAgIGVucXVldWVX
aW5kb3dFdmVudChIYXNoQ2hhbmdlRXZlbnQ6OmNyZWF0ZShvbGRVUkwsIG5ld1VSTCkpOwotfQot
Ci12b2lkIERvY3VtZW50OjplbnF1ZXVlUG9wc3RhdGVFdmVudChQYXNzUmVmUHRyPFNlcmlhbGl6
ZWRTY3JpcHRWYWx1ZT4gc3RhdGVPYmplY3QpCi17Ci0gICAgLy8gRklYTUU6IGh0dHBzOi8vYnVn
cy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zNjIwMiBQb3BzdGF0ZSBldmVudCBuZWVkcyB0
byBmaXJlIGFzeW5jaHJvbm91c2x5Ci0gICAgZGlzcGF0Y2hXaW5kb3dFdmVudChQb3BTdGF0ZUV2
ZW50OjpjcmVhdGUoc3RhdGVPYmplY3QsIGRvbVdpbmRvdygpID8gZG9tV2luZG93KCktPmhpc3Rv
cnkoKSA6IDApKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6YWRkTWVkaWFDYW5TdGFydExpc3RlbmVy
KE1lZGlhQ2FuU3RhcnRMaXN0ZW5lciogbGlzdGVuZXIpCi17Ci0gICAgQVNTRVJUKCFtX21lZGlh
Q2FuU3RhcnRMaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKTsKLSAgICBtX21lZGlhQ2FuU3Rh
cnRMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6cmVtb3ZlTWVk
aWFDYW5TdGFydExpc3RlbmVyKE1lZGlhQ2FuU3RhcnRMaXN0ZW5lciogbGlzdGVuZXIpCi17Ci0g
ICAgQVNTRVJUKG1fbWVkaWFDYW5TdGFydExpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpOwot
ICAgIG1fbWVkaWFDYW5TdGFydExpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotfQotCi1NZWRp
YUNhblN0YXJ0TGlzdGVuZXIqIERvY3VtZW50Ojp0YWtlQW55TWVkaWFDYW5TdGFydExpc3RlbmVy
KCkKLXsKLSAgICBIYXNoU2V0PE1lZGlhQ2FuU3RhcnRMaXN0ZW5lcio+OjppdGVyYXRvciBzbG90
ID0gbV9tZWRpYUNhblN0YXJ0TGlzdGVuZXJzLmJlZ2luKCk7Ci0gICAgaWYgKHNsb3QgPT0gbV9t
ZWRpYUNhblN0YXJ0TGlzdGVuZXJzLmVuZCgpKQotICAgICAgICByZXR1cm4gMDsKLSAgICBNZWRp
YUNhblN0YXJ0TGlzdGVuZXIqIGxpc3RlbmVyID0gKnNsb3Q7Ci0gICAgbV9tZWRpYUNhblN0YXJ0
TGlzdGVuZXJzLnJlbW92ZShzbG90KTsKLSAgICByZXR1cm4gbGlzdGVuZXI7Ci19Ci0KLSNpZiBF
TkFCTEUoRlVMTFNDUkVFTl9BUEkpCi1ib29sIERvY3VtZW50OjpmdWxsU2NyZWVuSXNBbGxvd2Vk
Rm9yRWxlbWVudChFbGVtZW50KiBlbGVtZW50KSBjb25zdAotewotICAgIEFTU0VSVChlbGVtZW50
KTsKLSAgICByZXR1cm4gaXNBdHRyaWJ1dGVPbkFsbE93bmVycyh3ZWJraXRhbGxvd2Z1bGxzY3Jl
ZW5BdHRyLCBlbGVtZW50LT5kb2N1bWVudCgpLT5vd25lckVsZW1lbnQoKSk7Ci19Ci0KLXZvaWQg
RG9jdW1lbnQ6OnJlcXVlc3RGdWxsU2NyZWVuRm9yRWxlbWVudChFbGVtZW50KiBlbGVtZW50LCB1
bnNpZ25lZCBzaG9ydCBmbGFncywgRnVsbFNjcmVlbkNoZWNrVHlwZSBjaGVja1R5cGUpCi17Ci0g
ICAgLy8gVGhlIE1vemlsbGEgRnVsbCBTY3JlZW4gQVBJIDxodHRwczovL3dpa2kubW96aWxsYS5v
cmcvR2Vja286RnVsbFNjcmVlbkFQST4gaGFzIGRpZmZlcmVudCByZXF1aXJlbWVudHMKLSAgICAv
LyBmb3IgZnVsbCBzY3JlZW4gbW9kZSwgYW5kIGRvIG5vdCBoYXZlIHRoZSBjb25jZXB0IG9mIGEg
ZnVsbCBzY3JlZW4gZWxlbWVudCBzdGFjay4KLSAgICBib29sIGluTGVnYWN5TW96aWxsYU1vZGUg
PSAoZmxhZ3MgJiBFbGVtZW50OjpMRUdBQ1lfTU9aSUxMQV9SRVFVRVNUKTsKLQotICAgIGRvIHsK
LSAgICAgICAgaWYgKCFlbGVtZW50KQotICAgICAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50RWxl
bWVudCgpOwotIAotICAgICAgICAvLyAxLiBJZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zIGFyZSB0cnVlLCB0ZXJtaW5hdGUgdGhlc2Ugc3RlcHMgYW5kIHF1ZXVlIGEgdGFzayB0byBm
aXJlCi0gICAgICAgIC8vIGFuIGV2ZW50IG5hbWVkIGZ1bGxzY3JlZW5lcnJvciB3aXRoIGl0cyBi
dWJibGVzIGF0dHJpYnV0ZSBzZXQgdG8gdHJ1ZSBvbiB0aGUgY29udGV4dCBvYmplY3QncyAKLSAg
ICAgICAgLy8gbm9kZSBkb2N1bWVudDoKLQotICAgICAgICAvLyBUaGUgY29udGV4dCBvYmplY3Qg
aXMgbm90IGluIGEgZG9jdW1lbnQuCi0gICAgICAgIGlmICghZWxlbWVudC0+aW5Eb2N1bWVudCgp
KQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLy8gVGhlIGNvbnRleHQgb2JqZWN0J3Mg
bm9kZSBkb2N1bWVudCwgb3IgYW4gYW5jZXN0b3IgYnJvd3NpbmcgY29udGV4dCdzIGRvY3VtZW50
IGRvZXMgbm90IGhhdmUKLSAgICAgICAgLy8gdGhlIGZ1bGxzY3JlZW4gZW5hYmxlZCBmbGFnIHNl
dC4KLSAgICAgICAgaWYgKGNoZWNrVHlwZSA9PSBFbmZvcmNlSUZyYW1lQWxsb3dGdWxsU2NyZWVu
UmVxdWlyZW1lbnQgJiYgIWZ1bGxTY3JlZW5Jc0FsbG93ZWRGb3JFbGVtZW50KGVsZW1lbnQpKQot
ICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLy8gVGhlIGNvbnRleHQgb2JqZWN0J3Mgbm9k
ZSBkb2N1bWVudCBmdWxsc2NyZWVuIGVsZW1lbnQgc3RhY2sgaXMgbm90IGVtcHR5IGFuZCBpdHMg
dG9wIGVsZW1lbnQKLSAgICAgICAgLy8gaXMgbm90IGFuIGFuY2VzdG9yIG9mIHRoZSBjb250ZXh0
IG9iamVjdC4gKE5PVEU6IElnbm9yZSB0aGlzIHJlcXVpcmVtZW50IGlmIHRoZSByZXF1ZXN0IHdh
cwotICAgICAgICAvLyBtYWRlIHZpYSB0aGUgbGVnYWN5IE1vemlsbGEtc3R5bGUgQVBJLikKLSAg
ICAgICAgaWYgKCFtX2Z1bGxTY3JlZW5FbGVtZW50U3RhY2suaXNFbXB0eSgpICYmICFtX2Z1bGxT
Y3JlZW5FbGVtZW50U3RhY2suZmlyc3QoKS0+Y29udGFpbnMoZWxlbWVudCkgJiYgIWluTGVnYWN5
TW96aWxsYU1vZGUpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvLyBBIGRlc2NlbmRh
bnQgYnJvd3NpbmcgY29udGV4dCdzIGRvY3VtZW50IGhhcyBhIG5vbi1lbXB0eSBmdWxsc2NyZWVu
IGVsZW1lbnQgc3RhY2suCi0gICAgICAgIGJvb2wgZGVzY2VuZGVudEhhc05vbkVtcHR5U3RhY2sg
PSBmYWxzZTsKLSAgICAgICAgZm9yIChGcmFtZSogZGVzY2VuZGFudCA9IGZyYW1lKCkgPyBmcmFt
ZSgpLT50cmVlKCktPnRyYXZlcnNlTmV4dCgpIDogMDsgZGVzY2VuZGFudDsgZGVzY2VuZGFudCA9
IGRlc2NlbmRhbnQtPnRyZWUoKS0+dHJhdmVyc2VOZXh0KCkpIHsKLSAgICAgICAgICAgIGlmIChk
ZXNjZW5kYW50LT5kb2N1bWVudCgpLT53ZWJraXRGdWxsc2NyZWVuRWxlbWVudCgpKSB7Ci0gICAg
ICAgICAgICAgICAgZGVzY2VuZGVudEhhc05vbkVtcHR5U3RhY2sgPSB0cnVlOwotICAgICAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChkZXNj
ZW5kZW50SGFzTm9uRW1wdHlTdGFjayAmJiAhaW5MZWdhY3lNb3ppbGxhTW9kZSkKLSAgICAgICAg
ICAgIGJyZWFrOwotCi0gICAgICAgIC8vIFRoaXMgYWxnb3JpdGhtIGlzIG5vdCBhbGxvd2VkIHRv
IHNob3cgYSBwb3AtdXA6Ci0gICAgICAgIC8vICAgQW4gYWxnb3JpdGhtIGlzIGFsbG93ZWQgdG8g
c2hvdyBhIHBvcC11cCBpZiwgaW4gdGhlIHRhc2sgaW4gd2hpY2ggdGhlIGFsZ29yaXRobSBpcyBy
dW5uaW5nLCBlaXRoZXI6Ci0gICAgICAgIC8vICAgLSBhbiBhY3RpdmF0aW9uIGJlaGF2aW9yIGlz
IGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQgd2hvc2UgY2xpY2sgZXZlbnQgd2FzIHRydXN0ZWQs
IG9yCi0gICAgICAgIC8vICAgLSB0aGUgZXZlbnQgbGlzdGVuZXIgZm9yIGEgdHJ1c3RlZCBjbGlj
ayBldmVudCBpcyBiZWluZyBoYW5kbGVkLgotICAgICAgICBpZiAoIVNjcmlwdENvbnRyb2xsZXI6
OnByb2Nlc3NpbmdVc2VyR2VzdHVyZSgpKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAg
Ly8gVGhlcmUgaXMgYSBwcmV2aW91c2x5LWVzdGFibGlzaGVkIHVzZXIgcHJlZmVyZW5jZSwgc2Vj
dXJpdHkgcmlzaywgb3IgcGxhdGZvcm0gbGltaXRhdGlvbi4KLSAgICAgICAgaWYgKCFwYWdlKCkg
fHwgIXBhZ2UoKS0+c2V0dGluZ3MoKS0+ZnVsbFNjcmVlbkVuYWJsZWQoKSkKLSAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICAKLSAgICAgICAgaWYgKCFwYWdlKCktPmNocm9tZSgpLT5jbGllbnQo
KS0+c3VwcG9ydHNGdWxsU2NyZWVuRm9yRWxlbWVudChlbGVtZW50LCBmbGFncyAmIEVsZW1lbnQ6
OkFMTE9XX0tFWUJPQVJEX0lOUFVUKSkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8v
IDIuIExldCBkb2MgYmUgZWxlbWVudCdzIG5vZGUgZG9jdW1lbnQuIChpLmUuICJ0aGlzIikKLSAg
ICAgICAgRG9jdW1lbnQqIGN1cnJlbnREb2MgPSB0aGlzOwotCi0gICAgICAgIC8vIDMuIExldCBk
b2NzIGJlIGFsbCBkb2MncyBhbmNlc3RvciBicm93c2luZyBjb250ZXh0J3MgZG9jdW1lbnRzIChp
ZiBhbnkpIGFuZCBkb2MuCi0gICAgICAgIERlcXVlPERvY3VtZW50Kj4gZG9jczsKLQotICAgICAg
ICBkbyB7Ci0gICAgICAgICAgICBkb2NzLnByZXBlbmQoY3VycmVudERvYyk7Ci0gICAgICAgICAg
ICBjdXJyZW50RG9jID0gY3VycmVudERvYy0+b3duZXJFbGVtZW50KCkgPyBjdXJyZW50RG9jLT5v
d25lckVsZW1lbnQoKS0+ZG9jdW1lbnQoKSA6IDA7Ci0gICAgICAgIH0gd2hpbGUgKGN1cnJlbnRE
b2MpOwotCi0gICAgICAgIC8vIDQuIEZvciBlYWNoIGRvY3VtZW50IGluIGRvY3MsIHJ1biB0aGVz
ZSBzdWJzdGVwczoKLSAgICAgICAgRGVxdWU8RG9jdW1lbnQqPjo6aXRlcmF0b3IgY3VycmVudCA9
IGRvY3MuYmVnaW4oKSwgZm9sbG93aW5nID0gZG9jcy5iZWdpbigpOwotCi0gICAgICAgIGRvIHsK
LSAgICAgICAgICAgICsrZm9sbG93aW5nOwotCi0gICAgICAgICAgICAvLyAxLiBMZXQgZm9sbG93
aW5nIGRvY3VtZW50IGJlIHRoZSBkb2N1bWVudCBhZnRlciBkb2N1bWVudCBpbiBkb2NzLCBvciBu
dWxsIGlmIHRoZXJlIGlzIG5vCi0gICAgICAgICAgICAvLyBzdWNoIGRvY3VtZW50LgotICAgICAg
ICAgICAgRG9jdW1lbnQqIGN1cnJlbnREb2MgPSAqY3VycmVudDsKLSAgICAgICAgICAgIERvY3Vt
ZW50KiBmb2xsb3dpbmdEb2MgPSBmb2xsb3dpbmcgIT0gZG9jcy5lbmQoKSA/ICpmb2xsb3dpbmcg
OiAwOwotCi0gICAgICAgICAgICAvLyAyLiBJZiBmb2xsb3dpbmcgZG9jdW1lbnQgaXMgbnVsbCwg
cHVzaCBjb250ZXh0IG9iamVjdCBvbiBkb2N1bWVudCdzIGZ1bGxzY3JlZW4gZWxlbWVudAotICAg
ICAgICAgICAgLy8gc3RhY2ssIGFuZCBxdWV1ZSBhIHRhc2sgdG8gZmlyZSBhbiBldmVudCBuYW1l
ZCBmdWxsc2NyZWVuY2hhbmdlIHdpdGggaXRzIGJ1YmJsZXMgYXR0cmlidXRlCi0gICAgICAgICAg
ICAvLyBzZXQgdG8gdHJ1ZSBvbiB0aGUgZG9jdW1lbnQuCi0gICAgICAgICAgICBpZiAoIWZvbGxv
d2luZ0RvYykgewotICAgICAgICAgICAgICAgIGN1cnJlbnREb2MtPnB1c2hGdWxsc2NyZWVuRWxl
bWVudFN0YWNrKGVsZW1lbnQpOwotICAgICAgICAgICAgICAgIGFkZERvY3VtZW50VG9GdWxsU2Ny
ZWVuQ2hhbmdlRXZlbnRRdWV1ZShjdXJyZW50RG9jKTsKLSAgICAgICAgICAgICAgICBjb250aW51
ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gMy4gT3RoZXJ3aXNlLCBpZiBkb2N1
bWVudCdzIGZ1bGxzY3JlZW4gZWxlbWVudCBzdGFjayBpcyBlaXRoZXIgZW1wdHkgb3IgaXRzIHRv
cCBlbGVtZW50Ci0gICAgICAgICAgICAvLyBpcyBub3QgZm9sbG93aW5nIGRvY3VtZW50J3MgYnJv
d3NpbmcgY29udGV4dCBjb250YWluZXIsCi0gICAgICAgICAgICBFbGVtZW50KiB0b3BFbGVtZW50
ID0gY3VycmVudERvYy0+d2Via2l0RnVsbHNjcmVlbkVsZW1lbnQoKTsKLSAgICAgICAgICAgIGlm
ICghdG9wRWxlbWVudCB8fCB0b3BFbGVtZW50ICE9IGZvbGxvd2luZ0RvYy0+b3duZXJFbGVtZW50
KCkpIHsKLSAgICAgICAgICAgICAgICAvLyAuLi5wdXNoIGZvbGxvd2luZyBkb2N1bWVudCdzIGJy
b3dzaW5nIGNvbnRleHQgY29udGFpbmVyIG9uIGRvY3VtZW50J3MgZnVsbHNjcmVlbiBlbGVtZW50
Ci0gICAgICAgICAgICAgICAgLy8gc3RhY2ssIGFuZCBxdWV1ZSBhIHRhc2sgdG8gZmlyZSBhbiBl
dmVudCBuYW1lZCBmdWxsc2NyZWVuY2hhbmdlIHdpdGggaXRzIGJ1YmJsZXMgYXR0cmlidXRlCi0g
ICAgICAgICAgICAgICAgLy8gc2V0IHRvIHRydWUgb24gZG9jdW1lbnQuCi0gICAgICAgICAgICAg
ICAgY3VycmVudERvYy0+cHVzaEZ1bGxzY3JlZW5FbGVtZW50U3RhY2soZm9sbG93aW5nRG9jLT5v
d25lckVsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgICAgYWRkRG9jdW1lbnRUb0Z1bGxTY3JlZW5D
aGFuZ2VFdmVudFF1ZXVlKGN1cnJlbnREb2MpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwot
ICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyA0LiBPdGhlcndpc2UsIGRvIG5vdGhpbmcg
Zm9yIHRoaXMgZG9jdW1lbnQuIEl0IHN0YXlzIHRoZSBzYW1lLgotICAgICAgICB9IHdoaWxlICgr
K2N1cnJlbnQgIT0gZG9jcy5lbmQoKSk7Ci0KLSAgICAgICAgLy8gNS4gUmV0dXJuLCBhbmQgcnVu
IHRoZSByZW1haW5pbmcgc3RlcHMgYXN5bmNocm9ub3VzbHkuCi0gICAgICAgIC8vIDYuIE9wdGlv
bmFsbHksIHBlcmZvcm0gc29tZSBhbmltYXRpb24uCi0gICAgICAgIG1fYXJlS2V5c0VuYWJsZWRJ
bkZ1bGxTY3JlZW4gPSBmbGFncyAmIEVsZW1lbnQ6OkFMTE9XX0tFWUJPQVJEX0lOUFVUOwotICAg
ICAgICBwYWdlKCktPmNocm9tZSgpLT5jbGllbnQoKS0+ZW50ZXJGdWxsU2NyZWVuRm9yRWxlbWVu
dChlbGVtZW50KTsKLQotICAgICAgICAvLyA3LiBPcHRpb25hbGx5LCBkaXNwbGF5IGEgbWVzc2Fn
ZSBpbmRpY2F0aW5nIGhvdyB0aGUgdXNlciBjYW4gZXhpdCBkaXNwbGF5aW5nIHRoZSBjb250ZXh0
IG9iamVjdCBmdWxsc2NyZWVuLgotICAgICAgICByZXR1cm47Ci0gICAgfSB3aGlsZSAoMCk7Ci0K
LSAgICBtX2Z1bGxTY3JlZW5FcnJvckV2ZW50VGFyZ2V0UXVldWUuYXBwZW5kKGVsZW1lbnQgPyBl
bGVtZW50IDogZG9jdW1lbnRFbGVtZW50KCkpOwotICAgIG1fZnVsbFNjcmVlbkNoYW5nZURlbGF5
VGltZXIuc3RhcnRPbmVTaG90KDApOwotfQotCi12b2lkIERvY3VtZW50Ojp3ZWJraXRDYW5jZWxG
dWxsU2NyZWVuKCkKLXsKLSAgICAvLyBUaGUgTW96aWxsYSAiY2FuY2VsRnVsbFNjcmVlbigpIiBB
UEkgYmVoYXZlcyBsaWtlIHRoZSBXM0MgImZ1bGx5IGV4aXQgZnVsbHNjcmVlbiIgYmVoYXZpb3Is
IHdoaWNoCi0gICAgLy8gaXMgZGVmaW5lZCBhczogCi0gICAgLy8gIlRvIGZ1bGx5IGV4aXQgZnVs
bHNjcmVlbiBhY3QgYXMgaWYgdGhlIGV4aXRGdWxsc2NyZWVuKCkgbWV0aG9kIHdhcyBpbnZva2Vk
IG9uIHRoZSB0b3AtbGV2ZWwgYnJvd3NpbmcKLSAgICAvLyBjb250ZXh0J3MgZG9jdW1lbnQgYW5k
IHN1YnNlcXVlbnRseSBlbXB0eSB0aGF0IGRvY3VtZW50J3MgZnVsbHNjcmVlbiBlbGVtZW50IHN0
YWNrLiIKLSAgICBpZiAoIXRvcERvY3VtZW50KCktPndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50KCkp
Ci0gICAgICAgIHJldHVybjsKLQotICAgIC8vIFRvIGFjaGlldmUgdGhhdCBhaW0sIHJlbW92ZSBh
bGwgdGhlIGVsZW1lbnRzIGZyb20gdGhlIHRvcCBkb2N1bWVudCdzIHN0YWNrIGV4Y2VwdCBmb3Ig
dGhlIGZpcnN0IGJlZm9yZQotICAgIC8vIGNhbGxpbmcgd2Via2l0RXhpdEZ1bGxzY3JlZW4oKToK
LSAgICBEZXF1ZTxSZWZQdHI8RWxlbWVudD4gPiByZXBsYWNlbWVudEZ1bGxzY3JlZW5FbGVtZW50
U3RhY2s7Ci0gICAgcmVwbGFjZW1lbnRGdWxsc2NyZWVuRWxlbWVudFN0YWNrLnByZXBlbmQodG9w
RG9jdW1lbnQoKS0+d2Via2l0RnVsbHNjcmVlbkVsZW1lbnQoKSk7Ci0gICAgdG9wRG9jdW1lbnQo
KS0+bV9mdWxsU2NyZWVuRWxlbWVudFN0YWNrLnN3YXAocmVwbGFjZW1lbnRGdWxsc2NyZWVuRWxl
bWVudFN0YWNrKTsKLQotICAgIHRvcERvY3VtZW50KCktPndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7
Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OndlYmtpdEV4aXRGdWxsc2NyZWVuKCkKLXsKLSAgICAvLyBU
aGUgZXhpdEZ1bGxzY3JlZW4oKSBtZXRob2QgbXVzdCBydW4gdGhlc2Ugc3RlcHM6Ci0gICAgCi0g
ICAgLy8gMS4gTGV0IGRvYyBiZSB0aGUgY29udGV4dCBvYmplY3QuIChpLmUuICJ0aGlzIikKLSAg
ICBEb2N1bWVudCogY3VycmVudERvYyA9IHRoaXM7Ci0KLSAgICAvLyAyLiBJZiBkb2MncyBmdWxs
c2NyZWVuIGVsZW1lbnQgc3RhY2sgaXMgZW1wdHksIHRlcm1pbmF0ZSB0aGVzZSBzdGVwcy4KLSAg
ICBpZiAobV9mdWxsU2NyZWVuRWxlbWVudFN0YWNrLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJu
OwotICAgIAotICAgIC8vIDMuIExldCBkZXNjZW5kYW50cyBiZSBhbGwgdGhlIGRvYydzIGRlc2Nl
bmRhbnQgYnJvd3NpbmcgY29udGV4dCdzIGRvY3VtZW50cyB3aXRoIGEgbm9uLWVtcHR5IGZ1bGxz
Y3JlZW4KLSAgICAvLyBlbGVtZW50IHN0YWNrIChpZiBhbnkpLCBvcmRlcmVkIHNvIHRoYXQgdGhl
IGNoaWxkIG9mIHRoZSBkb2MgaXMgbGFzdCBhbmQgdGhlIGRvY3VtZW50IGZ1cnRoZXN0Ci0gICAg
Ly8gYXdheSBmcm9tIHRoZSBkb2MgaXMgZmlyc3QuCi0gICAgRGVxdWU8UmVmUHRyPERvY3VtZW50
PiA+IGRlc2NlbmRhbnRzOwotICAgIGZvciAoRnJhbWUqIGRlc2NlbmRhbnQgPSBmcmFtZSgpID8g
ZnJhbWUoKS0+dHJlZSgpLT50cmF2ZXJzZU5leHQoKSA6IDA7IGRlc2NlbmRhbnQ7IGRlc2NlbmRh
bnQgPSBkZXNjZW5kYW50LT50cmVlKCktPnRyYXZlcnNlTmV4dCgpKSB7Ci0gICAgICAgIGlmIChk
ZXNjZW5kYW50LT5kb2N1bWVudCgpLT53ZWJraXRGdWxsc2NyZWVuRWxlbWVudCgpKQotICAgICAg
ICAgICAgZGVzY2VuZGFudHMucHJlcGVuZChkZXNjZW5kYW50LT5kb2N1bWVudCgpKTsKLSAgICB9
Ci0gICAgICAgIAotICAgIC8vIDQuIEZvciBlYWNoIGRlc2NlbmRhbnQgaW4gZGVzY2VuZGFudHMs
IGVtcHR5IGRlc2NlbmRhbnQncyBmdWxsc2NyZWVuIGVsZW1lbnQgc3RhY2ssIGFuZCBxdWV1ZSBh
Ci0gICAgLy8gdGFzayB0byBmaXJlIGFuIGV2ZW50IG5hbWVkIGZ1bGxzY3JlZW5jaGFuZ2Ugd2l0
aCBpdHMgYnViYmxlcyBhdHRyaWJ1dGUgc2V0IHRvIHRydWUgb24gZGVzY2VuZGFudC4KLSAgICBm
b3IgKERlcXVlPFJlZlB0cjxEb2N1bWVudD4gPjo6aXRlcmF0b3IgaSA9IGRlc2NlbmRhbnRzLmJl
Z2luKCk7IGkgIT0gZGVzY2VuZGFudHMuZW5kKCk7ICsraSkgewotICAgICAgICAoKmkpLT5jbGVh
ckZ1bGxzY3JlZW5FbGVtZW50U3RhY2soKTsKLSAgICAgICAgYWRkRG9jdW1lbnRUb0Z1bGxTY3Jl
ZW5DaGFuZ2VFdmVudFF1ZXVlKGktPmdldCgpKTsKLSAgICB9Ci0KLSAgICAvLyA1LiBXaGlsZSBk
b2MgaXMgbm90IG51bGwsIHJ1biB0aGVzZSBzdWJzdGVwczoKLSAgICBFbGVtZW50KiBuZXdUb3Ag
PSAwOwotICAgIHdoaWxlIChjdXJyZW50RG9jKSB7Ci0gICAgICAgIC8vIDEuIFBvcCB0aGUgdG9w
IGVsZW1lbnQgb2YgZG9jJ3MgZnVsbHNjcmVlbiBlbGVtZW50IHN0YWNrLgotICAgICAgICBjdXJy
ZW50RG9jLT5wb3BGdWxsc2NyZWVuRWxlbWVudFN0YWNrKCk7Ci0KLSAgICAgICAgLy8gICAgSWYg
ZG9jJ3MgZnVsbHNjcmVlbiBlbGVtZW50IHN0YWNrIGlzIG5vbi1lbXB0eSBhbmQgdGhlIGVsZW1l
bnQgbm93IGF0IHRoZSB0b3AgaXMgZWl0aGVyCi0gICAgICAgIC8vICAgIG5vdCBpbiBhIGRvY3Vt
ZW50IG9yIGl0cyBub2RlIGRvY3VtZW50IGlzIG5vdCBkb2MsIHJlcGVhdCB0aGlzIHN1YnN0ZXAu
Ci0gICAgICAgIG5ld1RvcCA9IGN1cnJlbnREb2MtPndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50KCk7
Ci0gICAgICAgIGlmIChuZXdUb3AgJiYgKCFuZXdUb3AtPmluRG9jdW1lbnQoKSB8fCBuZXdUb3At
PmRvY3VtZW50KCkgIT0gY3VycmVudERvYykpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAg
ICAgICAvLyAyLiBRdWV1ZSBhIHRhc2sgdG8gZmlyZSBhbiBldmVudCBuYW1lZCBmdWxsc2NyZWVu
Y2hhbmdlIHdpdGggaXRzIGJ1YmJsZXMgYXR0cmlidXRlIHNldCB0byB0cnVlCi0gICAgICAgIC8v
IG9uIGRvYy4KLSAgICAgICAgYWRkRG9jdW1lbnRUb0Z1bGxTY3JlZW5DaGFuZ2VFdmVudFF1ZXVl
KGN1cnJlbnREb2MpOwotCi0gICAgICAgIC8vIDMuIElmIGRvYydzIGZ1bGxzY3JlZW4gZWxlbWVu
dCBzdGFjayBpcyBlbXB0eSBhbmQgZG9jJ3MgYnJvd3NpbmcgY29udGV4dCBoYXMgYSBicm93c2lu
ZyBjb250ZXh0Ci0gICAgICAgIC8vIGNvbnRhaW5lciwgc2V0IGRvYyB0byB0aGF0IGJyb3dzaW5n
IGNvbnRleHQgY29udGFpbmVyJ3Mgbm9kZSBkb2N1bWVudC4KLSAgICAgICAgaWYgKCFuZXdUb3Ag
JiYgY3VycmVudERvYy0+b3duZXJFbGVtZW50KCkpIHsKLSAgICAgICAgICAgIGN1cnJlbnREb2Mg
PSBjdXJyZW50RG9jLT5vd25lckVsZW1lbnQoKS0+ZG9jdW1lbnQoKTsKLSAgICAgICAgICAgIGNv
bnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gNC4gT3RoZXJ3aXNlLCBzZXQgZG9jIHRv
IG51bGwuCi0gICAgICAgIGN1cnJlbnREb2MgPSAwOwotICAgIH0KLQotICAgIC8vIDYuIFJldHVy
biwgYW5kIHJ1biB0aGUgcmVtYWluaW5nIHN0ZXBzIGFzeW5jaHJvbm91c2x5LgotICAgIC8vIDcu
IE9wdGlvbmFsbHksIHBlcmZvcm0gc29tZSBhbmltYXRpb24uCi0KLSAgICAvLyBPbmx5IGV4aXQg
b3V0IG9mIGZ1bGwgc2NyZWVuIHdpbmRvdyBtb2RlIGlmIHRoZXJlIGFyZSBubyByZW1haW5pbmcg
ZWxlbWVudHMgaW4gdGhlIAotICAgIC8vIGZ1bGwgc2NyZWVuIHN0YWNrLgotICAgIGlmICghbmV3
VG9wKSB7Ci0gICAgICAgIHBhZ2UoKS0+Y2hyb21lKCktPmNsaWVudCgpLT5leGl0RnVsbFNjcmVl
bkZvckVsZW1lbnQobV9mdWxsU2NyZWVuRWxlbWVudC5nZXQoKSk7Ci0gICAgICAgIHJldHVybjsK
LSAgICB9Ci0KLSAgICAvLyBPdGhlcndpc2UsIG5vdGlmeSB0aGUgY2hyb21lIG9mIHRoZSBuZXcg
ZnVsbCBzY3JlZW4gZWxlbWVudC4KLSAgICBwYWdlKCktPmNocm9tZSgpLT5jbGllbnQoKS0+ZW50
ZXJGdWxsU2NyZWVuRm9yRWxlbWVudChuZXdUb3ApOyAgICAgIAotfQotCi1ib29sIERvY3VtZW50
Ojp3ZWJraXRGdWxsc2NyZWVuRW5hYmxlZCgpIGNvbnN0Ci17Ci0gICAgLy8gNC4gVGhlIGZ1bGxz
Y3JlZW5FbmFibGVkIGF0dHJpYnV0ZSBtdXN0IHJldHVybiB0cnVlIGlmIHRoZSBjb250ZXh0IG9i
amVjdCBhbmQgYWxsIGFuY2VzdG9yCi0gICAgLy8gYnJvd3NpbmcgY29udGV4dCdzIGRvY3VtZW50
cyBoYXZlIHRoZWlyIGZ1bGxzY3JlZW4gZW5hYmxlZCBmbGFnIHNldCwgb3IgZmFsc2Ugb3RoZXJ3
aXNlLgotCi0gICAgLy8gVG9wLWxldmVsIGJyb3dzaW5nIGNvbnRleHRzIGFyZSBpbXBsaWVkIHRv
IGhhdmUgdGhlaXIgYWxsb3dGdWxsU2NyZWVuIGF0dHJpYnV0ZSBzZXQuCi0gICAgcmV0dXJuIGlz
QXR0cmlidXRlT25BbGxPd25lcnMod2Via2l0YWxsb3dmdWxsc2NyZWVuQXR0ciwgb3duZXJFbGVt
ZW50KCkpOwotfQotCi12b2lkIERvY3VtZW50Ojp3ZWJraXRXaWxsRW50ZXJGdWxsU2NyZWVuRm9y
RWxlbWVudChFbGVtZW50KiBlbGVtZW50KQotewotICAgIGlmICghYXR0YWNoZWQoKSB8fCBpblBh
Z2VDYWNoZSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBBU1NFUlQoZWxlbWVudCk7Ci0KLSAg
ICAvLyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgY2FsbGVkIGFmdGVyIHRoZSBkb2N1bWVudCBoYXMg
YmVlbiByZW1vdmVkIGZyb20gdGhlIHBhZ2UuCi0gICAgaWYgKCFwYWdlKCkpCi0gICAgICAgIHJl
dHVybjsKLQotICAgIEFTU0VSVChwYWdlKCktPnNldHRpbmdzKCktPmZ1bGxTY3JlZW5FbmFibGVk
KCkpOwotCi0gICAgaWYgKG1fZnVsbFNjcmVlblJlbmRlcmVyKQotICAgICAgICBtX2Z1bGxTY3Jl
ZW5SZW5kZXJlci0+dW53cmFwUmVuZGVyZXIoKTsKLQotICAgIG1fZnVsbFNjcmVlbkVsZW1lbnQg
PSBlbGVtZW50OwotCi0jaWYgVVNFKE5BVElWRV9GVUxMU0NSRUVOX1ZJREVPKQotICAgIGlmIChl
bGVtZW50ICYmIGVsZW1lbnQtPmlzTWVkaWFFbGVtZW50KCkpCi0gICAgICAgIHJldHVybjsKLSNl
bmRpZgotCi0gICAgLy8gQ3JlYXRlIGEgcGxhY2Vob2xkZXIgYmxvY2sgZm9yIGEgdGhlIGZ1bGwt
c2NyZWVuIGVsZW1lbnQsIHRvIGtlZXAgdGhlIHBhZ2UgZnJvbSByZWZsb3dpbmcKLSAgICAvLyB3
aGVuIHRoZSBlbGVtZW50IGlzIHJlbW92ZWQgZnJvbSB0aGUgbm9ybWFsIGZsb3cuICBPbmx5IGRv
IHRoaXMgZm9yIGEgUmVuZGVyQm94LCBhcyBvbmx5IAotICAgIC8vIGEgYm94IHdpbGwgaGF2ZSBh
IGZyYW1lUmVjdC4gIFRoZSBwbGFjZWhvbGRlciB3aWxsIGJlIGNyZWF0ZWQgaW4gc2V0RnVsbFNj
cmVlblJlbmRlcmVyKCkKLSAgICAvLyBkdXJpbmcgbGF5b3V0LgotICAgIFJlbmRlck9iamVjdCog
cmVuZGVyZXIgPSBtX2Z1bGxTY3JlZW5FbGVtZW50LT5yZW5kZXJlcigpOwotICAgIGJvb2wgc2hv
dWxkQ3JlYXRlUGxhY2Vob2xkZXIgPSByZW5kZXJlciAmJiByZW5kZXJlci0+aXNCb3goKTsKLSAg
ICBpZiAoc2hvdWxkQ3JlYXRlUGxhY2Vob2xkZXIpIHsKLSAgICAgICAgbV9zYXZlZFBsYWNlaG9s
ZGVyRnJhbWVSZWN0ID0gdG9SZW5kZXJCb3gocmVuZGVyZXIpLT5mcmFtZVJlY3QoKTsKLSAgICAg
ICAgbV9zYXZlZFBsYWNlaG9sZGVyUmVuZGVyU3R5bGUgPSBSZW5kZXJTdHlsZTo6Y2xvbmUocmVu
ZGVyZXItPnN0eWxlKCkpOwotICAgIH0KLQotICAgIGlmIChtX2Z1bGxTY3JlZW5FbGVtZW50ICE9
IGRvY3VtZW50RWxlbWVudCgpKQotICAgICAgICBSZW5kZXJGdWxsU2NyZWVuOjp3cmFwUmVuZGVy
ZXIocmVuZGVyZXIsIHJlbmRlcmVyID8gcmVuZGVyZXItPnBhcmVudCgpIDogMCwgdGhpcyk7Ci0K
LSAgICBtX2Z1bGxTY3JlZW5FbGVtZW50LT5zZXRDb250YWluc0Z1bGxTY3JlZW5FbGVtZW50T25B
bmNlc3RvcnNDcm9zc2luZ0ZyYW1lQm91bmRhcmllcyh0cnVlKTsKLSAgICAKLSAgICByZWNhbGNT
dHlsZShGb3JjZSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OndlYmtpdERpZEVudGVyRnVsbFNjcmVl
bkZvckVsZW1lbnQoRWxlbWVudCopCi17Ci0gICAgaWYgKCFtX2Z1bGxTY3JlZW5FbGVtZW50KQot
ICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAoIWF0dGFjaGVkKCkgfHwgaW5QYWdlQ2FjaGUoKSkK
LSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9mdWxsU2NyZWVuRWxlbWVudC0+ZGlkQmVjb21lRnVs
bHNjcmVlbkVsZW1lbnQoKTsKLQotICAgIG1fZnVsbFNjcmVlbkNoYW5nZURlbGF5VGltZXIuc3Rh
cnRPbmVTaG90KDApOwotfQotCi12b2lkIERvY3VtZW50Ojp3ZWJraXRXaWxsRXhpdEZ1bGxTY3Jl
ZW5Gb3JFbGVtZW50KEVsZW1lbnQqKQotewotICAgIGlmICghbV9mdWxsU2NyZWVuRWxlbWVudCkK
LSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKCFhdHRhY2hlZCgpIHx8IGluUGFnZUNhY2hlKCkp
Ci0gICAgICAgIHJldHVybjsKLQotICAgIG1fZnVsbFNjcmVlbkVsZW1lbnQtPndpbGxTdG9wQmVp
bmdGdWxsc2NyZWVuRWxlbWVudCgpOwotfQotCi12b2lkIERvY3VtZW50Ojp3ZWJraXREaWRFeGl0
RnVsbFNjcmVlbkZvckVsZW1lbnQoRWxlbWVudCopCi17Ci0gICAgaWYgKCFtX2Z1bGxTY3JlZW5F
bGVtZW50KQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAoIWF0dGFjaGVkKCkgfHwgaW5QYWdl
Q2FjaGUoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9mdWxsU2NyZWVuRWxlbWVudC0+c2V0
Q29udGFpbnNGdWxsU2NyZWVuRWxlbWVudE9uQW5jZXN0b3JzQ3Jvc3NpbmdGcmFtZUJvdW5kYXJp
ZXMoZmFsc2UpOwotCi0gICAgbV9hcmVLZXlzRW5hYmxlZEluRnVsbFNjcmVlbiA9IGZhbHNlOwot
ICAgIAotICAgIGlmIChtX2Z1bGxTY3JlZW5SZW5kZXJlcikKLSAgICAgICAgbV9mdWxsU2NyZWVu
UmVuZGVyZXItPnVud3JhcFJlbmRlcmVyKCk7Ci0KLSAgICBtX2Z1bGxTY3JlZW5FbGVtZW50ID0g
MDsKLSAgICBzY2hlZHVsZUZvcmNlZFN0eWxlUmVjYWxjKCk7Ci0gICAgCi0gICAgLy8gV2hlbiB3
ZWJraXRDYW5jZWxGdWxsU2NyZWVuIGlzIGNhbGxlZCwgd2UgY2FsbCB3ZWJraXRFeGl0RnVsbFNj
cmVlbiBvbiB0aGUgdG9wRG9jdW1lbnQoKS4gVGhhdAotICAgIC8vIG1lYW5zIHRoYXQgdGhlIGV2
ZW50cyB3aWxsIGJlIHF1ZXVlZCB0aGVyZS4gU28gaWYgd2UgaGF2ZSBubyBldmVudHMgaGVyZSwg
c3RhcnQgdGhlIHRpbWVyIG9uCi0gICAgLy8gdGhlIGV4aXRpbmcgZG9jdW1lbnQuCi0gICAgRG9j
dW1lbnQqIGV4aXRpbmdEb2N1bWVudCA9IHRoaXM7Ci0gICAgaWYgKG1fZnVsbFNjcmVlbkNoYW5n
ZUV2ZW50VGFyZ2V0UXVldWUuaXNFbXB0eSgpICYmIG1fZnVsbFNjcmVlbkVycm9yRXZlbnRUYXJn
ZXRRdWV1ZS5pc0VtcHR5KCkpCi0gICAgICAgIGV4aXRpbmdEb2N1bWVudCA9IHRvcERvY3VtZW50
KCk7Ci0gICAgZXhpdGluZ0RvY3VtZW50LT5tX2Z1bGxTY3JlZW5DaGFuZ2VEZWxheVRpbWVyLnN0
YXJ0T25lU2hvdCgwKTsKLX0KLSAgICAKLXZvaWQgRG9jdW1lbnQ6OnNldEZ1bGxTY3JlZW5SZW5k
ZXJlcihSZW5kZXJGdWxsU2NyZWVuKiByZW5kZXJlcikKLXsKLSAgICBpZiAocmVuZGVyZXIgPT0g
bV9mdWxsU2NyZWVuUmVuZGVyZXIpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmIChyZW5kZXJl
ciAmJiBtX3NhdmVkUGxhY2Vob2xkZXJSZW5kZXJTdHlsZSkgCi0gICAgICAgIHJlbmRlcmVyLT5j
cmVhdGVQbGFjZWhvbGRlcihtX3NhdmVkUGxhY2Vob2xkZXJSZW5kZXJTdHlsZS5yZWxlYXNlKCks
IG1fc2F2ZWRQbGFjZWhvbGRlckZyYW1lUmVjdCk7Ci0gICAgZWxzZSBpZiAocmVuZGVyZXIgJiYg
bV9mdWxsU2NyZWVuUmVuZGVyZXIgJiYgbV9mdWxsU2NyZWVuUmVuZGVyZXItPnBsYWNlaG9sZGVy
KCkpIHsKLSAgICAgICAgUmVuZGVyQmxvY2sqIHBsYWNlaG9sZGVyID0gbV9mdWxsU2NyZWVuUmVu
ZGVyZXItPnBsYWNlaG9sZGVyKCk7Ci0gICAgICAgIHJlbmRlcmVyLT5jcmVhdGVQbGFjZWhvbGRl
cihSZW5kZXJTdHlsZTo6Y2xvbmUocGxhY2Vob2xkZXItPnN0eWxlKCkpLCBwbGFjZWhvbGRlci0+
ZnJhbWVSZWN0KCkpOwotICAgIH0KLQotICAgIGlmIChtX2Z1bGxTY3JlZW5SZW5kZXJlcikKLSAg
ICAgICAgbV9mdWxsU2NyZWVuUmVuZGVyZXItPmRlc3Ryb3koKTsKLSAgICBBU1NFUlQoIW1fZnVs
bFNjcmVlblJlbmRlcmVyKTsKLQotICAgIG1fZnVsbFNjcmVlblJlbmRlcmVyID0gcmVuZGVyZXI7
Ci0gICAgCi0gICAgLy8gVGhpcyBub3RpZmljYXRpb24gY2FuIGNvbWUgaW4gYWZ0ZXIgdGhlIHBh
Z2UgaGFzIGJlZW4gZGVzdHJveWVkLgotICAgIGlmIChwYWdlKCkpCi0gICAgICAgIHBhZ2UoKS0+
Y2hyb21lKCktPmNsaWVudCgpLT5mdWxsU2NyZWVuUmVuZGVyZXJDaGFuZ2VkKG1fZnVsbFNjcmVl
blJlbmRlcmVyKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6ZnVsbFNjcmVlblJlbmRlcmVyRGVzdHJv
eWVkKCkKLXsKLSAgICBtX2Z1bGxTY3JlZW5SZW5kZXJlciA9IDA7Ci0KLSAgICBpZiAocGFnZSgp
KQotICAgICAgICBwYWdlKCktPmNocm9tZSgpLT5jbGllbnQoKS0+ZnVsbFNjcmVlblJlbmRlcmVy
Q2hhbmdlZCgwKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6c2V0RnVsbFNjcmVlblJlbmRlcmVyU2l6
ZShjb25zdCBJbnRTaXplJiBzaXplKQotewotICAgIEFTU0VSVChtX2Z1bGxTY3JlZW5SZW5kZXJl
cik7Ci0gICAgaWYgKCFtX2Z1bGxTY3JlZW5SZW5kZXJlcikKLSAgICAgICAgcmV0dXJuOwotICAg
IAotICAgIGlmIChtX2Z1bGxTY3JlZW5SZW5kZXJlcikgewotICAgICAgICBSZWZQdHI8UmVuZGVy
U3R5bGU+IG5ld1N0eWxlID0gUmVuZGVyU3R5bGU6OmNsb25lKG1fZnVsbFNjcmVlblJlbmRlcmVy
LT5zdHlsZSgpKTsKLSAgICAgICAgbmV3U3R5bGUtPnNldFdpZHRoKExlbmd0aChzaXplLndpZHRo
KCksIFdlYkNvcmU6OkZpeGVkKSk7Ci0gICAgICAgIG5ld1N0eWxlLT5zZXRIZWlnaHQoTGVuZ3Ro
KHNpemUuaGVpZ2h0KCksIFdlYkNvcmU6OkZpeGVkKSk7Ci0gICAgICAgIG5ld1N0eWxlLT5zZXRU
b3AoTGVuZ3RoKDAsIFdlYkNvcmU6OkZpeGVkKSk7Ci0gICAgICAgIG5ld1N0eWxlLT5zZXRMZWZ0
KExlbmd0aCgwLCBXZWJDb3JlOjpGaXhlZCkpOwotICAgICAgICBtX2Z1bGxTY3JlZW5SZW5kZXJl
ci0+c2V0U3R5bGUobmV3U3R5bGUpOwotICAgICAgICB1cGRhdGVMYXlvdXQoKTsKLSAgICB9Ci19
Ci0gICAgCi12b2lkIERvY3VtZW50OjpzZXRGdWxsU2NyZWVuUmVuZGVyZXJCYWNrZ3JvdW5kQ29s
b3IoQ29sb3IgYmFja2dyb3VuZENvbG9yKQotewotICAgIGlmICghbV9mdWxsU2NyZWVuUmVuZGVy
ZXIpCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IG5ld1N0
eWxlID0gUmVuZGVyU3R5bGU6OmNsb25lKG1fZnVsbFNjcmVlblJlbmRlcmVyLT5zdHlsZSgpKTsK
LSAgICBuZXdTdHlsZS0+c2V0QmFja2dyb3VuZENvbG9yKGJhY2tncm91bmRDb2xvcik7Ci0gICAg
bV9mdWxsU2NyZWVuUmVuZGVyZXItPnNldFN0eWxlKG5ld1N0eWxlKTsKLX0KLSAgICAKLXZvaWQg
RG9jdW1lbnQ6OmZ1bGxTY3JlZW5DaGFuZ2VEZWxheVRpbWVyRmlyZWQoVGltZXI8RG9jdW1lbnQ+
KikKLXsKLSAgICAvLyBTaW5jZSB3ZSBkaXNwYXRjaCBldmVudHMgaW4gdGhpcyBmdW5jdGlvbiwg
aXQncyBwb3NzaWJsZSB0aGF0IHRoZQotICAgIC8vIGRvY3VtZW50IHdpbGwgYmUgZGV0YWNoZWQg
YW5kIEdDJ2QuIFdlIHByb3RlY3QgaXQgaGVyZSB0byBtYWtlIHN1cmUgd2UKLSAgICAvLyBjYW4g
ZmluaXNoIHRoZSBmdW5jdGlvbiBzdWNjZXNzZnVsbHkuCi0gICAgUmVmUHRyPERvY3VtZW50PiBw
cm90ZWN0RG9jdW1lbnQodGhpcyk7Ci0gICAgRGVxdWU8UmVmUHRyPE5vZGU+ID4gY2hhbmdlUXVl
dWU7Ci0gICAgbV9mdWxsU2NyZWVuQ2hhbmdlRXZlbnRUYXJnZXRRdWV1ZS5zd2FwKGNoYW5nZVF1
ZXVlKTsKLQotICAgIHdoaWxlICghY2hhbmdlUXVldWUuaXNFbXB0eSgpKSB7Ci0gICAgICAgIFJl
ZlB0cjxOb2RlPiBub2RlID0gY2hhbmdlUXVldWUudGFrZUZpcnN0KCk7Ci0gICAgICAgIGlmICgh
bm9kZSkKLSAgICAgICAgICAgIG5vZGUgPSBkb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgLy8g
VGhlIGRpc3BhdGNoRXZlbnQgYmVsb3cgbWF5IGhhdmUgYmxvd24gYXdheSBvdXIgZG9jdW1lbnRF
bGVtZW50LgotICAgICAgICBpZiAoIW5vZGUpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAg
ICAgICAvLyBJZiB0aGUgZWxlbWVudCB3YXMgcmVtb3ZlZCBmcm9tIG91ciB0cmVlLCBhbHNvIG1l
c3NhZ2UgdGhlIGRvY3VtZW50RWxlbWVudC4gU2luY2Ugd2UgbWF5Ci0gICAgICAgIC8vIGhhdmUg
YSBkb2N1bWVudCBoaWVyYXJjaHksIGNoZWNrIHRoYXQgbm9kZSBpc24ndCBpbiBhbm90aGVyIGRv
Y3VtZW50LgotICAgICAgICBpZiAoIWNvbnRhaW5zKG5vZGUuZ2V0KCkpICYmICFub2RlLT5pbkRv
Y3VtZW50KCkpCi0gICAgICAgICAgICBjaGFuZ2VRdWV1ZS5hcHBlbmQoZG9jdW1lbnRFbGVtZW50
KCkpOwotICAgICAgICAKLSAgICAgICAgbm9kZS0+ZGlzcGF0Y2hFdmVudChFdmVudDo6Y3JlYXRl
KGV2ZW50TmFtZXMoKS53ZWJraXRmdWxsc2NyZWVuY2hhbmdlRXZlbnQsIHRydWUsIGZhbHNlKSk7
Ci0gICAgfQotCi0gICAgRGVxdWU8UmVmUHRyPE5vZGU+ID4gZXJyb3JRdWV1ZTsKLSAgICBtX2Z1
bGxTY3JlZW5FcnJvckV2ZW50VGFyZ2V0UXVldWUuc3dhcChlcnJvclF1ZXVlKTsKLSAgICAKLSAg
ICB3aGlsZSAoIWVycm9yUXVldWUuaXNFbXB0eSgpKSB7Ci0gICAgICAgIFJlZlB0cjxOb2RlPiBu
b2RlID0gZXJyb3JRdWV1ZS50YWtlRmlyc3QoKTsKLSAgICAgICAgaWYgKCFub2RlKQotICAgICAg
ICAgICAgbm9kZSA9IGRvY3VtZW50RWxlbWVudCgpOwotICAgICAgICAvLyBUaGUgZGlzcGF0Y2hF
dmVudCBiZWxvdyBtYXkgaGF2ZSBibG93biBhd2F5IG91ciBkb2N1bWVudEVsZW1lbnQuCi0gICAg
ICAgIGlmICghbm9kZSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAKLSAgICAgICAg
Ly8gSWYgdGhlIGVsZW1lbnQgd2FzIHJlbW92ZWQgZnJvbSBvdXIgdHJlZSwgYWxzbyBtZXNzYWdl
IHRoZSBkb2N1bWVudEVsZW1lbnQuIFNpbmNlIHdlIG1heQotICAgICAgICAvLyBoYXZlIGEgZG9j
dW1lbnQgaGllcmFyY2h5LCBjaGVjayB0aGF0IG5vZGUgaXNuJ3QgaW4gYW5vdGhlciBkb2N1bWVu
dC4KLSAgICAgICAgaWYgKCFjb250YWlucyhub2RlLmdldCgpKSAmJiAhbm9kZS0+aW5Eb2N1bWVu
dCgpKQotICAgICAgICAgICAgZXJyb3JRdWV1ZS5hcHBlbmQoZG9jdW1lbnRFbGVtZW50KCkpOwot
ICAgICAgICAKLSAgICAgICAgbm9kZS0+ZGlzcGF0Y2hFdmVudChFdmVudDo6Y3JlYXRlKGV2ZW50
TmFtZXMoKS53ZWJraXRmdWxsc2NyZWVuZXJyb3JFdmVudCwgdHJ1ZSwgZmFsc2UpKTsKLSAgICB9
Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmZ1bGxTY3JlZW5FbGVtZW50UmVtb3ZlZCgpCi17Ci0gICAg
bV9mdWxsU2NyZWVuRWxlbWVudC0+c2V0Q29udGFpbnNGdWxsU2NyZWVuRWxlbWVudE9uQW5jZXN0
b3JzQ3Jvc3NpbmdGcmFtZUJvdW5kYXJpZXMoZmFsc2UpOwotICAgIHdlYmtpdENhbmNlbEZ1bGxT
Y3JlZW4oKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6cmVtb3ZlRnVsbFNjcmVlbkVsZW1lbnRPZlN1
YnRyZWUoTm9kZSogbm9kZSwgYm9vbCBhbW9uZ0NoaWxkcmVuT25seSkKLXsKLSAgICBpZiAoIW1f
ZnVsbFNjcmVlbkVsZW1lbnQpCisgICAgaWYgKCFub2RlLT5pbkRvY3VtZW50KCkpCiAgICAgICAg
IHJldHVybjsKICAgICAKLSAgICBib29sIGVsZW1lbnRJblN1YnRyZWUgPSBmYWxzZTsKLSAgICBp
ZiAoYW1vbmdDaGlsZHJlbk9ubHkpCi0gICAgICAgIGVsZW1lbnRJblN1YnRyZWUgPSBtX2Z1bGxT
Y3JlZW5FbGVtZW50LT5pc0Rlc2NlbmRhbnRPZihub2RlKTsKLSAgICBlbHNlCi0gICAgICAgIGVs
ZW1lbnRJblN1YnRyZWUgPSAobV9mdWxsU2NyZWVuRWxlbWVudCA9PSBub2RlKSB8fCBtX2Z1bGxT
Y3JlZW5FbGVtZW50LT5pc0Rlc2NlbmRhbnRPZihub2RlKTsKLSAgICAKLSAgICBpZiAoZWxlbWVu
dEluU3VidHJlZSkKLSAgICAgICAgZnVsbFNjcmVlbkVsZW1lbnRSZW1vdmVkKCk7Ci19Ci0KLWJv
b2wgRG9jdW1lbnQ6OmlzQW5pbWF0aW5nRnVsbFNjcmVlbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IG1faXNBbmltYXRpbmdGdWxsU2NyZWVuOwotfQotCi12b2lkIERvY3VtZW50OjpzZXRBbmltYXRp
bmdGdWxsU2NyZWVuKGJvb2wgZmxhZykKLXsKLSAgICBpZiAobV9pc0FuaW1hdGluZ0Z1bGxTY3Jl
ZW4gPT0gZmxhZykKLSAgICAgICAgcmV0dXJuOwotICAgIG1faXNBbmltYXRpbmdGdWxsU2NyZWVu
ID0gZmxhZzsKLQotICAgIGlmIChtX2Z1bGxTY3JlZW5FbGVtZW50ICYmIG1fZnVsbFNjcmVlbkVs
ZW1lbnQtPmlzRGVzY2VuZGFudE9mKHRoaXMpKSB7Ci0gICAgICAgIG1fZnVsbFNjcmVlbkVsZW1l
bnQtPnNldE5lZWRzU3R5bGVSZWNhbGMoKTsKLSAgICAgICAgc2NoZWR1bGVGb3JjZWRTdHlsZVJl
Y2FsYygpOwotICAgIH0KLX0KLQotdm9pZCBEb2N1bWVudDo6Y2xlYXJGdWxsc2NyZWVuRWxlbWVu
dFN0YWNrKCkKLXsKLSAgICBtX2Z1bGxTY3JlZW5FbGVtZW50U3RhY2suY2xlYXIoKTsKLX0KLQot
dm9pZCBEb2N1bWVudDo6cG9wRnVsbHNjcmVlbkVsZW1lbnRTdGFjaygpCi17Ci0gICAgaWYgKG1f
ZnVsbFNjcmVlbkVsZW1lbnRTdGFjay5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLQotICAg
IG1fZnVsbFNjcmVlbkVsZW1lbnRTdGFjay5yZW1vdmVGaXJzdCgpOwotfQotCi12b2lkIERvY3Vt
ZW50OjpwdXNoRnVsbHNjcmVlbkVsZW1lbnRTdGFjayhFbGVtZW50KiBlbGVtZW50KQotewotICAg
IG1fZnVsbFNjcmVlbkVsZW1lbnRTdGFjay5wcmVwZW5kKGVsZW1lbnQpOwotfQotCi12b2lkIERv
Y3VtZW50OjphZGREb2N1bWVudFRvRnVsbFNjcmVlbkNoYW5nZUV2ZW50UXVldWUoRG9jdW1lbnQq
IGRvYykKLXsKLSAgICBBU1NFUlQoZG9jKTsKLSAgICBOb2RlKiB0YXJnZXQgPSBkb2MtPndlYmtp
dEZ1bGxzY3JlZW5FbGVtZW50KCk7Ci0gICAgaWYgKCF0YXJnZXQpCi0gICAgICAgIHRhcmdldCA9
IGRvYy0+d2Via2l0Q3VycmVudEZ1bGxTY3JlZW5FbGVtZW50KCk7Ci0gICAgaWYgKCF0YXJnZXQp
Ci0gICAgICAgIHRhcmdldCA9IGRvYzsKLSAgICBtX2Z1bGxTY3JlZW5DaGFuZ2VFdmVudFRhcmdl
dFF1ZXVlLmFwcGVuZCh0YXJnZXQpOwotfQotI2VuZGlmCi0KLSNpZiBFTkFCTEUoUE9JTlRFUl9M
T0NLKQotdm9pZCBEb2N1bWVudDo6d2Via2l0RXhpdFBvaW50ZXJMb2NrKCkKLXsKLSAgICBpZiAo
IXBhZ2UoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIGlmIChFbGVtZW50KiB0YXJnZXQgPSBwYWdl
KCktPnBvaW50ZXJMb2NrQ29udHJvbGxlcigpLT5lbGVtZW50KCkpIHsKLSAgICAgICAgaWYgKHRh
cmdldC0+ZG9jdW1lbnQoKSAhPSB0aGlzKQotICAgICAgICAgICAgcmV0dXJuOwotICAgIH0KLSAg
ICBwYWdlKCktPnBvaW50ZXJMb2NrQ29udHJvbGxlcigpLT5yZXF1ZXN0UG9pbnRlclVubG9jaygp
OwotfQotCi1FbGVtZW50KiBEb2N1bWVudDo6d2Via2l0UG9pbnRlckxvY2tFbGVtZW50KCkgY29u
c3QKLXsKLSAgICBpZiAoIXBhZ2UoKSB8fCBwYWdlKCktPnBvaW50ZXJMb2NrQ29udHJvbGxlcigp
LT5sb2NrUGVuZGluZygpKQotICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAoRWxlbWVudCogZWxl
bWVudCA9IHBhZ2UoKS0+cG9pbnRlckxvY2tDb250cm9sbGVyKCktPmVsZW1lbnQoKSkgewotICAg
ICAgICBpZiAoZWxlbWVudC0+ZG9jdW1lbnQoKSA9PSB0aGlzKQotICAgICAgICAgICAgcmV0dXJu
IGVsZW1lbnQ7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotI2VuZGlmCi0KLXZvaWQgRG9jdW1l
bnQ6OmRlY3JlbWVudExvYWRFdmVudERlbGF5Q291bnQoKQotewotICAgIEFTU0VSVChtX2xvYWRF
dmVudERlbGF5Q291bnQpOwotICAgIC0tbV9sb2FkRXZlbnREZWxheUNvdW50OwotCi0gICAgaWYg
KGZyYW1lKCkgJiYgIW1fbG9hZEV2ZW50RGVsYXlDb3VudCAmJiAhbV9sb2FkRXZlbnREZWxheVRp
bWVyLmlzQWN0aXZlKCkpCi0gICAgICAgIG1fbG9hZEV2ZW50RGVsYXlUaW1lci5zdGFydE9uZVNo
b3QoMCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmxvYWRFdmVudERlbGF5VGltZXJGaXJlZChUaW1l
cjxEb2N1bWVudD4qKQotewotICAgIGlmIChmcmFtZSgpKQotICAgICAgICBmcmFtZSgpLT5sb2Fk
ZXIoKS0+Y2hlY2tDb21wbGV0ZWQoKTsKLX0KLQotI2lmIEVOQUJMRShSRVFVRVNUX0FOSU1BVElP
Tl9GUkFNRSkKLWludCBEb2N1bWVudDo6d2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lKFBhc3NS
ZWZQdHI8UmVxdWVzdEFuaW1hdGlvbkZyYW1lQ2FsbGJhY2s+IGNhbGxiYWNrKQotewotICAgIGlm
ICghbV9zY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXIpIHsKLSNpZiBVU0UoUkVRVUVTVF9BTklN
QVRJT05fRlJBTUVfRElTUExBWV9NT05JVE9SKQotICAgICAgICBtX3NjcmlwdGVkQW5pbWF0aW9u
Q29udHJvbGxlciA9IFNjcmlwdGVkQW5pbWF0aW9uQ29udHJvbGxlcjo6Y3JlYXRlKHRoaXMsIHBh
Z2UoKSA/IHBhZ2UoKS0+ZGlzcGxheUlEKCkgOiAwKTsKLSNlbHNlCi0gICAgICAgIG1fc2NyaXB0
ZWRBbmltYXRpb25Db250cm9sbGVyID0gU2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyOjpjcmVh
dGUodGhpcywgMCk7Ci0jZW5kaWYKLSAgICAgICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHRoZSBQ
YWdlIG1heSBoYXZlIHN1c3BlbmRlZCBzY3JpcHRlZCBhbmltYXRpb25zIGJlZm9yZQotICAgICAg
ICAvLyB3ZSB3ZXJlIGNyZWF0ZWQuIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgd2UgZG9uJ3Qg
c3RhcnQgdXAgdGhlIGFuaW1hdGlvbgotICAgICAgICAvLyBjb250cm9sbGVyIG9uIGEgYmFja2dy
b3VuZCB0YWIsIGZvciBleGFtcGxlLgotICAgICAgICBpZiAoIXBhZ2UoKSB8fCBwYWdlKCktPnNj
cmlwdGVkQW5pbWF0aW9uc1N1c3BlbmRlZCgpKQotICAgICAgICAgICAgbV9zY3JpcHRlZEFuaW1h
dGlvbkNvbnRyb2xsZXItPnN1c3BlbmQoKTsKKyAgICAvLyBVbnRpbCB0aGUgPGJvZHk+IGV4aXN0
cywgd2UgaGF2ZSBubyBjaG9pY2UgYnV0IHRvIGNvbXBhcmUgZG9jdW1lbnQgcG9zaXRpb25zLAor
ICAgIC8vIHNpbmNlIHN0eWxlcyBvdXRzaWRlIG9mIHRoZSBib2R5IGFuZCBoZWFkIGNvbnRpbnVl
IHRvIGJlIHNodW50ZWQgaW50byB0aGUgaGVhZAorICAgIC8vIChhbmQgdGh1cyBjYW4gc2hpZnQg
dG8gZW5kIHVwIGJlZm9yZSBkeW5hbWljYWxseSBhZGRlZCBET00gY29udGVudCB0aGF0IGlzIGFs
c28KKyAgICAvLyBvdXRzaWRlIHRoZSBib2R5KS4KKyAgICBpZiAoKGNyZWF0ZWRCeVBhcnNlciAm
JiBtX2RvY3VtZW50LT5ib2R5KCkpIHx8IG1fc3R5bGVTaGVldENhbmRpZGF0ZU5vZGVzLmlzRW1w
dHkoKSkgeworICAgICAgICBtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcy5hZGQobm9kZSk7Cisg
ICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICByZXR1cm4gbV9zY3JpcHRlZEFuaW1hdGlvbkNv
bnRyb2xsZXItPnJlZ2lzdGVyQ2FsbGJhY2soY2FsbGJhY2spOworICAgIC8vIERldGVybWluZSBh
biBhcHByb3ByaWF0ZSBpbnNlcnRpb24gcG9pbnQuCisgICAgU3R5bGVTaGVldENhbmRpZGF0ZUxp
c3RIYXNoU2V0OjppdGVyYXRvciBiZWdpbiA9IG1fc3R5bGVTaGVldENhbmRpZGF0ZU5vZGVzLmJl
Z2luKCk7CisgICAgU3R5bGVTaGVldENhbmRpZGF0ZUxpc3RIYXNoU2V0OjppdGVyYXRvciBlbmQg
PSBtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcy5lbmQoKTsKKyAgICBTdHlsZVNoZWV0Q2FuZGlk
YXRlTGlzdEhhc2hTZXQ6Oml0ZXJhdG9yIGl0ID0gZW5kOworICAgIE5vZGUqIGZvbGxvd2luZ05v
ZGUgPSAwOworICAgIGRvIHsKKyAgICAgICAgLS1pdDsKKyAgICAgICAgTm9kZSogbiA9ICppdDsK
KyAgICAgICAgdW5zaWduZWQgc2hvcnQgcG9zaXRpb24gPSBuLT5jb21wYXJlRG9jdW1lbnRQb3Np
dGlvbihub2RlKTsKKyAgICAgICAgaWYgKHBvc2l0aW9uID09IE5vZGU6OkRPQ1VNRU5UX1BPU0lU
SU9OX0ZPTExPV0lORykgeworICAgICAgICAgICAgbV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMu
aW5zZXJ0QmVmb3JlKGZvbGxvd2luZ05vZGUsIG5vZGUpOworICAgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICB9CisgICAgICAgIGZvbGxvd2luZ05vZGUgPSBuOworICAgIH0gd2hpbGUgKGl0ICE9
IGJlZ2luKTsKKyAgICAKKyAgICBtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcy5pbnNlcnRCZWZv
cmUoZm9sbG93aW5nTm9kZSwgbm9kZSk7CiB9CiAKLXZvaWQgRG9jdW1lbnQ6OndlYmtpdENhbmNl
bEFuaW1hdGlvbkZyYW1lKGludCBpZCkKK3ZvaWQgRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlv
bjo6cmVtb3ZlU3R5bGVTaGVldENhbmRpZGF0ZU5vZGUoTm9kZSogbm9kZSkKIHsKLSAgICBpZiAo
IW1fc2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyKQotICAgICAgICByZXR1cm47Ci0gICAgbV9z
Y3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXItPmNhbmNlbENhbGxiYWNrKGlkKTsKKyAgICBtX3N0
eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcy5yZW1vdmUobm9kZSk7CiB9CiAKLXZvaWQgRG9jdW1lbnQ6
OnNlcnZpY2VTY3JpcHRlZEFuaW1hdGlvbnMoRE9NVGltZVN0YW1wIHRpbWUpCit2b2lkIERvY3Vt
ZW50U3R5bGVTaGVldENvbGxlY3Rpb246OmNvbGxlY3RBY3RpdmVTdHlsZVNoZWV0cyhWZWN0b3I8
UmVmUHRyPFN0eWxlU2hlZXQ+ID4mIHNoZWV0cykKIHsKLSAgICBpZiAoIW1fc2NyaXB0ZWRBbmlt
YXRpb25Db250cm9sbGVyKQorICAgIGlmIChtX2RvY3VtZW50LT5zZXR0aW5ncygpICYmICFtX2Rv
Y3VtZW50LT5zZXR0aW5ncygpLT5hdXRob3JBbmRVc2VyU3R5bGVzRW5hYmxlZCgpKQogICAgICAg
ICByZXR1cm47Ci0gICAgbV9zY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXItPnNlcnZpY2VTY3Jp
cHRlZEFuaW1hdGlvbnModGltZSk7Ci19Ci0jZW5kaWYKIAotI2lmIEVOQUJMRShUT1VDSF9FVkVO
VFMpCi1QYXNzUmVmUHRyPFRvdWNoPiBEb2N1bWVudDo6Y3JlYXRlVG91Y2goRE9NV2luZG93KiB3
aW5kb3csIEV2ZW50VGFyZ2V0KiB0YXJnZXQsIGludCBpZGVudGlmaWVyLCBpbnQgcGFnZVgsIGlu
dCBwYWdlWSwgaW50IHNjcmVlblgsIGludCBzY3JlZW5ZLCBpbnQgcmFkaXVzWCwgaW50IHJhZGl1
c1ksIGZsb2F0IHJvdGF0aW9uQW5nbGUsIGZsb2F0IGZvcmNlLCBFeGNlcHRpb25Db2RlJikgY29u
c3QKLXsKLSAgICAvLyBGSVhNRTogSXQncyBub3QgY2xlYXIgZnJvbSB0aGUgZG9jdW1lbnRhdGlv
biBhdAotICAgIC8vIGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2xpYnJhcnkvc2FmYXJpLyNk
b2N1bWVudGF0aW9uL1VzZXJFeHBlcmllbmNlL1JlZmVyZW5jZS9Eb2N1bWVudEFkZGl0aW9uc1Jl
ZmVyZW5jZS9Eb2N1bWVudEFkZGl0aW9ucy9Eb2N1bWVudEFkZGl0aW9ucy5odG1sCi0gICAgLy8g
d2hlbiB0aGlzIG1ldGhvZCBzaG91bGQgdGhyb3cgYW5kIG5vciBpcyBpdCBieSBpbnNwZWN0aW9u
IG9mIGlPUyBiZWhhdmlvci4gSXQgd291bGQgYmUgbmljZSB0byB2ZXJpZnkgYW55IGNhc2VzIHdo
ZXJlIGl0IHRocm93cyB1bmRlciBpT1MKLSAgICAvLyBhbmQgaW1wbGVtZW50IHRoZW0gaGVyZS4g
U2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00NzgxOQotICAgIEZy
YW1lKiBmcmFtZSA9IHdpbmRvdyA/IHdpbmRvdy0+ZnJhbWUoKSA6IHRoaXMtPmZyYW1lKCk7Ci0g
ICAgcmV0dXJuIFRvdWNoOjpjcmVhdGUoZnJhbWUsIHRhcmdldCwgaWRlbnRpZmllciwgc2NyZWVu
WCwgc2NyZWVuWSwgcGFnZVgsIHBhZ2VZLCByYWRpdXNYLCByYWRpdXNZLCByb3RhdGlvbkFuZ2xl
LCBmb3JjZSk7Ci19CisgICAgU3R5bGVTaGVldENhbmRpZGF0ZUxpc3RIYXNoU2V0OjppdGVyYXRv
ciBiZWdpbiA9IG1fc3R5bGVTaGVldENhbmRpZGF0ZU5vZGVzLmJlZ2luKCk7CisgICAgU3R5bGVT
aGVldENhbmRpZGF0ZUxpc3RIYXNoU2V0OjppdGVyYXRvciBlbmQgPSBtX3N0eWxlU2hlZXRDYW5k
aWRhdGVOb2Rlcy5lbmQoKTsKKyAgICBmb3IgKFN0eWxlU2hlZXRDYW5kaWRhdGVMaXN0SGFzaFNl
dDo6aXRlcmF0b3IgaXQgPSBiZWdpbjsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgIE5vZGUq
IG4gPSAqaXQ7CisgICAgICAgIFN0eWxlU2hlZXQqIHNoZWV0ID0gMDsKKyAgICAgICAgaWYgKG4t
Pm5vZGVUeXBlKCkgPT0gTm9kZTo6UFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFKSB7CisgICAg
ICAgICAgICAvLyBQcm9jZXNzaW5nIGluc3RydWN0aW9uIChYTUwgZG9jdW1lbnRzIG9ubHkpLgor
ICAgICAgICAgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCBsaW5raW5nIHRvIGVtYmVkZGVkIENTUyBz
dHlsZXNoZWV0cywgc2VlIDxodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
NDkyODE+IGZvciBkaXNjdXNzaW9uLgorICAgICAgICAgICAgUHJvY2Vzc2luZ0luc3RydWN0aW9u
KiBwaSA9IHN0YXRpY19jYXN0PFByb2Nlc3NpbmdJbnN0cnVjdGlvbio+KG4pOworICAgICAgICAg
ICAgc2hlZXQgPSBwaS0+c2hlZXQoKTsKKyNpZiBFTkFCTEUoWFNMVCkKKyAgICAgICAgICAgIC8v
IERvbid0IGFwcGx5IFhTTCB0cmFuc2Zvcm1zIHRvIGFscmVhZHkgdHJhbnNmb3JtZWQgZG9jdW1l
bnRzIC0tIDxyZGFyOi8vcHJvYmxlbS80MTMyODA2PgorICAgICAgICAgICAgaWYgKHBpLT5pc1hT
TCgpICYmICFtX2RvY3VtZW50LT50cmFuc2Zvcm1Tb3VyY2VEb2N1bWVudCgpKSB7CisgICAgICAg
ICAgICAgICAgLy8gRG9uJ3QgYXBwbHkgWFNMIHRyYW5zZm9ybXMgdW50aWwgbG9hZGluZyBpcyBm
aW5pc2hlZC4KKyAgICAgICAgICAgICAgICBpZiAoIW1fZG9jdW1lbnQtPnBhcnNpbmcoKSkKKyAg
ICAgICAgICAgICAgICAgICAgbV9kb2N1bWVudC0+YXBwbHlYU0xUcmFuc2Zvcm0ocGkpOworICAg
ICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KICNlbmRpZgorICAgICAgICB9IGVs
c2UgaWYgKChuLT5pc0hUTUxFbGVtZW50KCkgJiYgKG4tPmhhc1RhZ05hbWUobGlua1RhZykgfHwg
bi0+aGFzVGFnTmFtZShzdHlsZVRhZykpKQorI2lmIEVOQUJMRShTVkcpCisgICAgICAgICAgICAg
ICAgICAgfHwgIChuLT5pc1NWR0VsZW1lbnQoKSAmJiBuLT5oYXNUYWdOYW1lKFNWR05hbWVzOjpz
dHlsZVRhZykpCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgIEVs
ZW1lbnQqIGUgPSBzdGF0aWNfY2FzdDxFbGVtZW50Kj4obik7CisgICAgICAgICAgICBBdG9taWNT
dHJpbmcgdGl0bGUgPSBlLT5nZXRBdHRyaWJ1dGUodGl0bGVBdHRyKTsKKyAgICAgICAgICAgIGJv
b2wgZW5hYmxlZFZpYVNjcmlwdCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKGUtPmhhc0xvY2Fs
TmFtZShsaW5rVGFnKSkgeworICAgICAgICAgICAgICAgIC8vIDxMSU5LPiBlbGVtZW50CisgICAg
ICAgICAgICAgICAgSFRNTExpbmtFbGVtZW50KiBsaW5rRWxlbWVudCA9IHN0YXRpY19jYXN0PEhU
TUxMaW5rRWxlbWVudCo+KG4pOworICAgICAgICAgICAgICAgIGlmIChsaW5rRWxlbWVudC0+aXNE
aXNhYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAg
ICBlbmFibGVkVmlhU2NyaXB0ID0gbGlua0VsZW1lbnQtPmlzRW5hYmxlZFZpYVNjcmlwdCgpOwor
ICAgICAgICAgICAgICAgIGlmIChsaW5rRWxlbWVudC0+c3R5bGVTaGVldElzTG9hZGluZygpKSB7
CisgICAgICAgICAgICAgICAgICAgIC8vIGl0IGlzIGxvYWRpbmcgYnV0IHdlIHNob3VsZCBzdGls
bCBkZWNpZGUgd2hpY2ggc3R5bGUgc2hlZXQgc2V0IHRvIHVzZQorICAgICAgICAgICAgICAgICAg
ICBpZiAoIWVuYWJsZWRWaWFTY3JpcHQgJiYgIXRpdGxlLmlzRW1wdHkoKSAmJiBtX3ByZWZlcnJl
ZFN0eWxlc2hlZXRTZXROYW1lLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAg
Y29uc3QgQXRvbWljU3RyaW5nJiByZWwgPSBlLT5nZXRBdHRyaWJ1dGUocmVsQXR0cik7CisgICAg
ICAgICAgICAgICAgICAgICAgICBpZiAoIXJlbC5jb250YWlucygiYWx0ZXJuYXRlIikpIHsKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ByZWZlcnJlZFN0eWxlc2hlZXRTZXROYW1lID0g
dGl0bGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zZWxlY3RlZFN0eWxlc2hlZXRT
ZXROYW1lID0gdGl0bGU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgICAgIGlmICghbGlua0VsZW1lbnQtPnNoZWV0KCkpCisgICAgICAgICAg
ICAgICAgICAgIHRpdGxlID0gbnVsbEF0b207CisgICAgICAgICAgICB9CisgICAgICAgICAgICAv
LyBHZXQgdGhlIGN1cnJlbnQgcHJlZmVycmVkIHN0eWxlc2V0LiBUaGlzIGlzIHRoZQorICAgICAg
ICAgICAgLy8gc2V0IG9mIHNoZWV0cyB0aGF0IHdpbGwgYmUgZW5hYmxlZC4KKyNpZiBFTkFCTEUo
U1ZHKQorICAgICAgICAgICAgaWYgKG4tPmlzU1ZHRWxlbWVudCgpICYmIG4tPmhhc1RhZ05hbWUo
U1ZHTmFtZXM6OnN0eWxlVGFnKSkKKyAgICAgICAgICAgICAgICBzaGVldCA9IHN0YXRpY19jYXN0
PFNWR1N0eWxlRWxlbWVudCo+KG4pLT5zaGVldCgpOworICAgICAgICAgICAgZWxzZQorI2VuZGlm
CisgICAgICAgICAgICBpZiAoZS0+aGFzTG9jYWxOYW1lKGxpbmtUYWcpKQorICAgICAgICAgICAg
ICAgIHNoZWV0ID0gc3RhdGljX2Nhc3Q8SFRNTExpbmtFbGVtZW50Kj4obiktPnNoZWV0KCk7Cisg
ICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgLy8gPFNUWUxFPiBlbGVtZW50CisgICAg
ICAgICAgICAgICAgc2hlZXQgPSBzdGF0aWNfY2FzdDxIVE1MU3R5bGVFbGVtZW50Kj4obiktPnNo
ZWV0KCk7CisgICAgICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBzaGVldCBiZWxvbmdz
IHRvIGEgc3R5bGVzZXQKKyAgICAgICAgICAgIC8vICh0aHVzIG1ha2luZyBpdCBQUkVGRVJSRUQg
b3IgQUxURVJOQVRFIHJhdGhlciB0aGFuCisgICAgICAgICAgICAvLyBQRVJTSVNURU5UKS4KKyAg
ICAgICAgICAgIEF0b21pY1N0cmluZyByZWwgPSBlLT5nZXRBdHRyaWJ1dGUocmVsQXR0cik7Cisg
ICAgICAgICAgICBpZiAoIWVuYWJsZWRWaWFTY3JpcHQgJiYgIXRpdGxlLmlzRW1wdHkoKSkgewor
ICAgICAgICAgICAgICAgIC8vIFllcywgd2UgaGF2ZSBhIHRpdGxlLgorICAgICAgICAgICAgICAg
IGlmIChtX3ByZWZlcnJlZFN0eWxlc2hlZXRTZXROYW1lLmlzRW1wdHkoKSkgeworICAgICAgICAg
ICAgICAgICAgICAvLyBObyBwcmVmZXJyZWQgc2V0IGhhcyBiZWVuIGVzdGFibGlzaGVkLiBJZgor
ICAgICAgICAgICAgICAgICAgICAvLyB3ZSBhcmUgTk9UIGFuIGFsdGVybmF0ZSBzaGVldCwgdGhl
biBlc3RhYmxpc2gKKyAgICAgICAgICAgICAgICAgICAgLy8gdXMgYXMgdGhlIHByZWZlcnJlZCBz
ZXQuIE90aGVyd2lzZSwganVzdCBpZ25vcmUKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBz
aGVldC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKGUtPmhhc0xvY2FsTmFtZShzdHlsZVRhZykg
fHwgIXJlbC5jb250YWlucygiYWx0ZXJuYXRlIikpCisgICAgICAgICAgICAgICAgICAgICAgICBt
X3ByZWZlcnJlZFN0eWxlc2hlZXRTZXROYW1lID0gbV9zZWxlY3RlZFN0eWxlc2hlZXRTZXROYW1l
ID0gdGl0bGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh0aXRsZSAh
PSBtX3ByZWZlcnJlZFN0eWxlc2hlZXRTZXROYW1lKQorICAgICAgICAgICAgICAgICAgICBzaGVl
dCA9IDA7CisgICAgICAgICAgICB9CiAKLXN0YXRpYyB2b2lkIHdoZWVsRXZlbnRIYW5kbGVyQ291
bnRDaGFuZ2VkKERvY3VtZW50KiBkb2N1bWVudCkKLXsKLSAgICBQYWdlKiBwYWdlID0gZG9jdW1l
bnQtPnBhZ2UoKTsKLSAgICBpZiAoIXBhZ2UpCi0gICAgICAgIHJldHVybjsKLQotICAgIFNjcm9s
bGluZ0Nvb3JkaW5hdG9yKiBzY3JvbGxpbmdDb29yZGluYXRvciA9IHBhZ2UtPnNjcm9sbGluZ0Nv
b3JkaW5hdG9yKCk7Ci0gICAgaWYgKCFzY3JvbGxpbmdDb29yZGluYXRvcikKLSAgICAgICAgcmV0
dXJuOwotCi0gICAgRnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBkb2N1bWVudC0+dmlldygpOwotICAg
IGlmICghZnJhbWVWaWV3KQotICAgICAgICByZXR1cm47Ci0KLSAgICBzY3JvbGxpbmdDb29yZGlu
YXRvci0+ZnJhbWVWaWV3V2hlZWxFdmVudEhhbmRsZXJDb3VudENoYW5nZWQoZnJhbWVWaWV3KTsK
LX0KLQotdm9pZCBEb2N1bWVudDo6ZGlkQWRkV2hlZWxFdmVudEhhbmRsZXIoKQotewotICAgICsr
bV93aGVlbEV2ZW50SGFuZGxlckNvdW50OwotICAgIEZyYW1lKiBtYWluRnJhbWUgPSBwYWdlKCkg
PyBwYWdlKCktPm1haW5GcmFtZSgpIDogMDsKLSAgICBpZiAobWFpbkZyYW1lKQotICAgICAgICBt
YWluRnJhbWUtPm5vdGlmeUNocm9tZUNsaWVudFdoZWVsRXZlbnRIYW5kbGVyQ291bnRDaGFuZ2Vk
KCk7Ci0KLSAgICB3aGVlbEV2ZW50SGFuZGxlckNvdW50Q2hhbmdlZCh0aGlzKTsKKyAgICAgICAg
ICAgIGlmIChyZWwuY29udGFpbnMoImFsdGVybmF0ZSIpICYmIHRpdGxlLmlzRW1wdHkoKSkKKyAg
ICAgICAgICAgICAgICBzaGVldCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNoZWV0KQor
ICAgICAgICAgICAgc2hlZXRzLmFwcGVuZChzaGVldCk7CisgICAgfQogfQogCi12b2lkIERvY3Vt
ZW50OjpkaWRSZW1vdmVXaGVlbEV2ZW50SGFuZGxlcigpCitib29sIERvY3VtZW50U3R5bGVTaGVl
dENvbGxlY3Rpb246OnRlc3RBZGRlZFN0eWxlU2hlZXRSZXF1aXJlc1N0eWxlUmVjYWxjKFN0eWxl
U2hlZXRDb250ZW50cyogc3R5bGVzaGVldCkKIHsKLSAgICBBU1NFUlQobV93aGVlbEV2ZW50SGFu
ZGxlckNvdW50ID4gMCk7Ci0gICAgLS1tX3doZWVsRXZlbnRIYW5kbGVyQ291bnQ7Ci0gICAgRnJh
bWUqIG1haW5GcmFtZSA9IHBhZ2UoKSA/IHBhZ2UoKS0+bWFpbkZyYW1lKCkgOiAwOwotICAgIGlm
IChtYWluRnJhbWUpCi0gICAgICAgIG1haW5GcmFtZS0+bm90aWZ5Q2hyb21lQ2xpZW50V2hlZWxF
dmVudEhhbmRsZXJDb3VudENoYW5nZWQoKTsKLQotICAgIHdoZWVsRXZlbnRIYW5kbGVyQ291bnRD
aGFuZ2VkKHRoaXMpOworICAgIC8vIFNlZSBpZiBhbGwgcnVsZXMgb24gdGhlIHNoZWV0IGFyZSBz
Y29wZWQgdG8gc29tZSBzcGVjaWZpYyBpZHMgb3IgY2xhc3Nlcy4KKyAgICAvLyBUaGVuIHRlc3Qg
aWYgd2UgYWN0dWFsbHkgaGF2ZSBhbnkgb2YgdGhvc2UgaW4gdGhlIHRyZWUgYXQgdGhlIG1vbWVu
dC4KKyAgICBIYXNoU2V0PEF0b21pY1N0cmluZ0ltcGwqPiBpZFNjb3BlczsgCisgICAgSGFzaFNl
dDxBdG9taWNTdHJpbmdJbXBsKj4gY2xhc3NTY29wZXM7CisgICAgaWYgKCFTdHlsZVJlc29sdmVy
OjpkZXRlcm1pbmVTdHlsZXNoZWV0U2VsZWN0b3JTY29wZXMoc3R5bGVzaGVldCwgaWRTY29wZXMs
IGNsYXNzU2NvcGVzKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgLy8gSW52YWxpZGF0ZSB0
aGUgc3VidHJlZXMgdGhhdCBtYXRjaCB0aGUgc2NvcGVzLgorICAgIE5vZGUqIG5vZGUgPSBtX2Rv
Y3VtZW50LT5maXJzdENoaWxkKCk7CisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgaWYgKCFu
b2RlLT5pc1N0eWxlZEVsZW1lbnQoKSkgeworICAgICAgICAgICAgbm9kZSA9IG5vZGUtPnRyYXZl
cnNlTmV4dE5vZGUoKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAg
IFN0eWxlZEVsZW1lbnQqIGVsZW1lbnQgPSBzdGF0aWNfY2FzdDxTdHlsZWRFbGVtZW50Kj4obm9k
ZSk7CisgICAgICAgIGlmIChTZWxlY3RvckNoZWNrZXI6OmVsZW1lbnRNYXRjaGVzU2VsZWN0b3JT
Y29wZXMoZWxlbWVudCwgaWRTY29wZXMsIGNsYXNzU2NvcGVzKSkgeworICAgICAgICAgICAgZWxl
bWVudC0+c2V0TmVlZHNTdHlsZVJlY2FsYygpOworICAgICAgICAgICAgLy8gVGhlIHdob2xlIHN1
YnRyZWUgaXMgbm93IGludmFsaWRhdGVkLCB3ZSBjYW4gc2tpcCB0byB0aGUgbmV4dCBzaWJsaW5n
LgorICAgICAgICAgICAgbm9kZSA9IG5vZGUtPnRyYXZlcnNlTmV4dFNpYmxpbmcoKTsKKyAgICAg
ICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIG5vZGUgPSBub2RlLT50cmF2ZXJz
ZU5leHROb2RlKCk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKIH0KIAotdm9pZCBEb2N1bWVu
dDo6ZGlkQWRkVG91Y2hFdmVudEhhbmRsZXIoKQordm9pZCBEb2N1bWVudFN0eWxlU2hlZXRDb2xs
ZWN0aW9uOjphbmFseXplU3R5bGVTaGVldENoYW5nZShVcGRhdGVGbGFnIHVwZGF0ZUZsYWcsIGNv
bnN0IFZlY3RvcjxSZWZQdHI8U3R5bGVTaGVldD4gPiYgbmV3U3R5bGVzaGVldHMsIGJvb2wmIHJl
cXVpcmVzU3R5bGVSZXNvbHZlclJlc2V0LCBib29sJiByZXF1aXJlc0Z1bGxTdHlsZVJlY2FsYykK
IHsKLSNpZiBFTkFCTEUoVE9VQ0hfRVZFTlRTKQotICAgICsrbV90b3VjaEV2ZW50SGFuZGxlckNv
dW50OwotICAgIGlmIChtX3RvdWNoRXZlbnRIYW5kbGVyQ291bnQgPiAxKQorICAgIHJlcXVpcmVz
U3R5bGVSZXNvbHZlclJlc2V0ID0gdHJ1ZTsKKyAgICByZXF1aXJlc0Z1bGxTdHlsZVJlY2FsYyA9
IHRydWU7CisgICAgCisgICAgLy8gU3R5bGVzaGVldHMgb2YgPHN0eWxlPiBlbGVtZW50cyB0aGF0
IEBpbXBvcnQgc3R5bGVzaGVldHMgYXJlIGFjdGl2ZSBidXQgbG9hZGluZy4gV2UgbmVlZCB0byB0
cmlnZ2VyIGEgZnVsbCByZWNhbGMgd2hlbiBzdWNoIGxvYWRzIGFyZSBkb25lLgorICAgIGJvb2wg
aGFzQWN0aXZlTG9hZGluZ1N0eWxlc2hlZXQgPSBmYWxzZTsKKyAgICB1bnNpZ25lZCBuZXdTdHls
ZXNoZWV0Q291bnQgPSBuZXdTdHlsZXNoZWV0cy5zaXplKCk7CisgICAgZm9yICh1bnNpZ25lZCBp
ID0gMDsgaSA8IG5ld1N0eWxlc2hlZXRDb3VudDsgKytpKSB7CisgICAgICAgIGlmIChuZXdTdHls
ZXNoZWV0c1tpXS0+aXNMb2FkaW5nKCkpCisgICAgICAgICAgICBoYXNBY3RpdmVMb2FkaW5nU3R5
bGVzaGVldCA9IHRydWU7CisgICAgfQorICAgIGlmIChtX2hhZEFjdGl2ZUxvYWRpbmdTdHlsZXNo
ZWV0ICYmICFoYXNBY3RpdmVMb2FkaW5nU3R5bGVzaGVldCkgeworICAgICAgICBtX2hhZEFjdGl2
ZUxvYWRpbmdTdHlsZXNoZWV0ID0gZmFsc2U7CiAgICAgICAgIHJldHVybjsKLSAgICBpZiAoUGFn
ZSogcGFnZSA9IHRoaXMtPnBhZ2UoKSkKLSAgICAgICAgcGFnZS0+Y2hyb21lKCktPmNsaWVudCgp
LT5uZWVkVG91Y2hFdmVudHModHJ1ZSk7Ci0jZW5kaWYKLX0KKyAgICB9CisgICAgbV9oYWRBY3Rp
dmVMb2FkaW5nU3R5bGVzaGVldCA9IGhhc0FjdGl2ZUxvYWRpbmdTdHlsZXNoZWV0OwogCi12b2lk
IERvY3VtZW50OjpkaWRSZW1vdmVUb3VjaEV2ZW50SGFuZGxlcigpCi17Ci0jaWYgRU5BQkxFKFRP
VUNIX0VWRU5UUykKLSAgICBBU1NFUlQobV90b3VjaEV2ZW50SGFuZGxlckNvdW50KTsKLSAgICAt
LW1fdG91Y2hFdmVudEhhbmRsZXJDb3VudDsKLSAgICBpZiAobV90b3VjaEV2ZW50SGFuZGxlckNv
dW50KQorICAgIGlmICh1cGRhdGVGbGFnICE9IE9wdGltaXplZFVwZGF0ZSkKKyAgICAgICAgcmV0
dXJuOworICAgIGlmICghbV9kb2N1bWVudC0+c3R5bGVSZXNvbHZlcklmRXhpc3RzKCkpCiAgICAg
ICAgIHJldHVybjsKIAotICAgIFBhZ2UqIHBhZ2UgPSB0aGlzLT5wYWdlKCk7Ci0gICAgaWYgKCFw
YWdlKQorICAgIC8vIFNlZSBpZiB3ZSBhcmUganVzdCBhZGRpbmcgc3R5bGVzaGVldHMuCisgICAg
dW5zaWduZWQgb2xkU3R5bGVzaGVldENvdW50ID0gbV9hdXRob3JTdHlsZVNoZWV0cy0+bGVuZ3Ro
KCk7CisgICAgaWYgKG5ld1N0eWxlc2hlZXRDb3VudCA8IG9sZFN0eWxlc2hlZXRDb3VudCkKICAg
ICAgICAgcmV0dXJuOwotICAgIGZvciAoY29uc3QgRnJhbWUqIGZyYW1lID0gcGFnZS0+bWFpbkZy
YW1lKCk7IGZyYW1lOyBmcmFtZSA9IGZyYW1lLT50cmVlKCktPnRyYXZlcnNlTmV4dCgpKSB7Ci0g
ICAgICAgIGlmIChmcmFtZS0+ZG9jdW1lbnQoKSAmJiBmcmFtZS0+ZG9jdW1lbnQoKS0+dG91Y2hF
dmVudEhhbmRsZXJDb3VudCgpKQorICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBvbGRTdHls
ZXNoZWV0Q291bnQ7ICsraSkgeworICAgICAgICBpZiAobV9hdXRob3JTdHlsZVNoZWV0cy0+aXRl
bShpKSAhPSBuZXdTdHlsZXNoZWV0c1tpXSkKICAgICAgICAgICAgIHJldHVybjsKICAgICB9Ci0g
ICAgcGFnZS0+Y2hyb21lKCktPmNsaWVudCgpLT5uZWVkVG91Y2hFdmVudHMoZmFsc2UpOwotI2Vu
ZGlmCi19Ci0KLUhUTUxJRnJhbWVFbGVtZW50KiBEb2N1bWVudDo6c2VhbWxlc3NQYXJlbnRJRnJh
bWUoKSBjb25zdAotewotICAgIGlmICghc2hvdWxkRGlzcGxheVNlYW1sZXNzbHlXaXRoUGFyZW50
KCkpCi0gICAgICAgIHJldHVybiAwOworICAgIHJlcXVpcmVzU3R5bGVSZXNvbHZlclJlc2V0ID0g
ZmFsc2U7CiAKLSAgICBIVE1MRnJhbWVPd25lckVsZW1lbnQqIG93bmVyRWxlbWVudCA9IHRoaXMt
Pm93bmVyRWxlbWVudCgpOwotICAgIEFTU0VSVChvd25lckVsZW1lbnQtPmhhc1RhZ05hbWUoaWZy
YW1lVGFnKSk7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PEhUTUxJRnJhbWVFbGVtZW50Kj4ob3du
ZXJFbGVtZW50KTsKKyAgICAvLyBJZiB3ZSBhcmUgYWxyZWFkeSBwYXJzaW5nIHRoZSBib2R5IGFu
ZCBzbyBtYXkgaGF2ZSBzaWduaWZpY2FudCBhbW91bnQgb2YgZWxlbWVudHMsIHB1dCBzb21lIGVm
Zm9ydCBpbnRvIHRyeWluZyB0byBhdm9pZCBzdHlsZSByZWNhbGNzLgorICAgIGlmICghbV9kb2N1
bWVudC0+Ym9keSgpIHx8IG1fZG9jdW1lbnQtPmhhc05vZGVzV2l0aFBsYWNlaG9sZGVyU3R5bGUo
KSkKKyAgICAgICAgcmV0dXJuOworICAgIGZvciAodW5zaWduZWQgaSA9IG9sZFN0eWxlc2hlZXRD
b3VudDsgaSA8IG5ld1N0eWxlc2hlZXRDb3VudDsgKytpKSB7CisgICAgICAgIGlmICghbmV3U3R5
bGVzaGVldHNbaV0tPmlzQ1NTU3R5bGVTaGVldCgpKQorICAgICAgICAgICAgcmV0dXJuOworICAg
ICAgICBpZiAobmV3U3R5bGVzaGVldHNbaV0tPmRpc2FibGVkKCkpCisgICAgICAgICAgICBjb250
aW51ZTsKKyAgICAgICAgaWYgKHRlc3RBZGRlZFN0eWxlU2hlZXRSZXF1aXJlc1N0eWxlUmVjYWxj
KHN0YXRpY19jYXN0PENTU1N0eWxlU2hlZXQqPihuZXdTdHlsZXNoZWV0c1tpXS5nZXQoKSktPmNv
bnRlbnRzKCkpKQorICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICByZXF1aXJlc0Z1bGxT
dHlsZVJlY2FsYyA9IGZhbHNlOwogfQogCi1ib29sIERvY3VtZW50OjpzaG91bGREaXNwbGF5U2Vh
bWxlc3NseVdpdGhQYXJlbnQoKSBjb25zdAorc3RhdGljIGJvb2wgc3R5bGVTaGVldHNVc2VSZW1V
bml0cyhjb25zdCBWZWN0b3I8UmVmUHRyPFN0eWxlU2hlZXQ+ID4mIHNoZWV0cykKIHsKLSNpZiBF
TkFCTEUoSUZSQU1FX1NFQU1MRVNTKQotICAgIEhUTUxGcmFtZU93bmVyRWxlbWVudCogb3duZXJF
bGVtZW50ID0gdGhpcy0+b3duZXJFbGVtZW50KCk7Ci0gICAgaWYgKCFvd25lckVsZW1lbnQpCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gbV9tYXlEaXNwbGF5U2VhbWxlc3NXaXRo
UGFyZW50ICYmIG93bmVyRWxlbWVudC0+aGFzVGFnTmFtZShpZnJhbWVUYWcpICYmIG93bmVyRWxl
bWVudC0+ZmFzdEhhc0F0dHJpYnV0ZShzZWFtbGVzc0F0dHIpOwotI2Vsc2UKKyAgICBmb3IgKHVu
c2lnbmVkIGkgPSAwOyBpIDwgc2hlZXRzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmICghc2hl
ZXRzW2ldLT5pc0NTU1N0eWxlU2hlZXQoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAg
ICBpZiAoc3RhdGljX2Nhc3Q8Q1NTU3R5bGVTaGVldCo+KHNoZWV0c1tpXS5nZXQoKSktPmNvbnRl
bnRzKCktPnVzZXNSZW1Vbml0cygpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQog
ICAgIHJldHVybiBmYWxzZTsKLSNlbmRpZgotfQotCi1Eb2N1bWVudExvYWRlciogRG9jdW1lbnQ6
OmxvYWRlcigpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX2ZyYW1lKQotICAgICAgICByZXR1cm4gMDsK
LSAgICAKLSAgICBEb2N1bWVudExvYWRlciogbG9hZGVyID0gbV9mcmFtZS0+bG9hZGVyKCktPmRv
Y3VtZW50TG9hZGVyKCk7Ci0gICAgaWYgKCFsb2FkZXIpCi0gICAgICAgIHJldHVybiAwOwotICAg
IAotICAgIGlmIChtX2ZyYW1lLT5kb2N1bWVudCgpICE9IHRoaXMpCi0gICAgICAgIHJldHVybiAw
OwotICAgIAotICAgIHJldHVybiBsb2FkZXI7Ci19Ci0KLSNpZiBFTkFCTEUoTUlDUk9EQVRBKQot
UGFzc1JlZlB0cjxOb2RlTGlzdD4gRG9jdW1lbnQ6OmdldEl0ZW1zKGNvbnN0IFN0cmluZyYgdHlw
ZU5hbWVzKQotewotICAgIC8vIFNpbmNlIGRvY3VtZXQuZ2V0SXRlbSgpIGlzIGFsbG93ZWQgZm9y
IG1pY3JvZGF0YSwgdHlwZU5hbWVzIHdpbGwgYmUgbnVsbCBzdHJpbmcuCi0gICAgLy8gSW4gdGhp
cyBjYXNlIHdlIG5lZWQgdG8gY3JlYXRlIGFuIGVtcHR5IHN0cmluZyBpZGVudGlmaWVyIHRvIG1h
cCBzdWNoIHJlcXVlc3QgaW4gdGhlIGNhY2hlLgotICAgIFN0cmluZyBsb2NhbFR5cGVOYW1lcyA9
IHR5cGVOYW1lcy5pc051bGwoKSA/IE1pY3JvRGF0YUl0ZW1MaXN0Ojp1bmRlZmluZWRJdGVtVHlw
ZSgpIDogdHlwZU5hbWVzOwotCi0gICAgcmV0dXJuIGVuc3VyZVJhcmVEYXRhKCktPmVuc3VyZU5v
ZGVMaXN0cygpLT5hZGRDYWNoZVdpdGhOYW1lPE1pY3JvRGF0YUl0ZW1MaXN0Pih0aGlzLCBEeW5h
bWljTm9kZUxpc3Q6Ok1pY3JvRGF0YUl0ZW1MaXN0VHlwZSwgbG9jYWxUeXBlTmFtZXMpOwogfQot
I2VuZGlmCiAKLUludFNpemUgRG9jdW1lbnQ6OnZpZXdwb3J0U2l6ZSgpIGNvbnN0Citib29sIERv
Y3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OnVwZGF0ZUFjdGl2ZVN0eWxlU2hlZXRzKFVwZGF0
ZUZsYWcgdXBkYXRlRmxhZykKIHsKLSAgICBpZiAoIXZpZXcoKSkKLSAgICAgICAgcmV0dXJuIElu
dFNpemUoKTsKLSAgICByZXR1cm4gdmlldygpLT52aXNpYmxlQ29udGVudFJlY3QoLyogaW5jbHVk
ZVNjcm9sbGJhcnMgKi8gdHJ1ZSkuc2l6ZSgpOwotfQorICAgIGlmIChtX2RvY3VtZW50LT5pblN0
eWxlUmVjYWxjKCkpIHsKKyAgICAgICAgLy8gU1ZHIDx1c2U+IGVsZW1lbnQgbWF5IG1hbmFnZSB0
byBpbnZhbGlkYXRlIHN0eWxlIHNlbGVjdG9yIGluIHRoZSBtaWRkbGUgb2YgYSBzdHlsZSByZWNh
bGMuCisgICAgICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD01
NDM0NAorICAgICAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgYmUgZml4ZWQgaW4gU1ZHIGFuZCB0
aGUgY2FsbCBzaXRlIHJlcGxhY2VkIGJ5IEFTU0VSVCghbV9pblN0eWxlUmVjYWxjKS4KKyAgICAg
ICAgbV9uZWVkc1VwZGF0ZUFjdGl2ZVN0eWxlc2hlZXRzT25TdHlsZVJlY2FsYyA9IHRydWU7Cisg
ICAgICAgIG1fZG9jdW1lbnQtPnNjaGVkdWxlRm9yY2VkU3R5bGVSZWNhbGMoKTsKKyAgICAgICAg
cmV0dXJuIGZhbHNlOwogCi1Ob2RlKiBldmVudFRhcmdldE5vZGVGb3JEb2N1bWVudChEb2N1bWVu
dCogZG9jKQotewotICAgIGlmICghZG9jKQotICAgICAgICByZXR1cm4gMDsKLSAgICBOb2RlKiBu
b2RlID0gZG9jLT5mb2N1c2VkTm9kZSgpOwotICAgIGlmICghbm9kZSAmJiBkb2MtPmlzUGx1Z2lu
RG9jdW1lbnQoKSkgewotICAgICAgICBQbHVnaW5Eb2N1bWVudCogcGx1Z2luRG9jdW1lbnQgPSBz
dGF0aWNfY2FzdDxQbHVnaW5Eb2N1bWVudCo+KGRvYyk7Ci0gICAgICAgIG5vZGUgPSAgcGx1Z2lu
RG9jdW1lbnQtPnBsdWdpbk5vZGUoKTsKICAgICB9Ci0gICAgaWYgKCFub2RlICYmIGRvYy0+aXNI
VE1MRG9jdW1lbnQoKSkKLSAgICAgICAgbm9kZSA9IGRvYy0+Ym9keSgpOwotICAgIGlmICghbm9k
ZSkKLSAgICAgICAgbm9kZSA9IGRvYy0+ZG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgcmV0dXJuIG5v
ZGU7Ci19CisgICAgaWYgKCFtX2RvY3VtZW50LT5yZW5kZXJlcigpIHx8ICFtX2RvY3VtZW50LT5h
dHRhY2hlZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CiAKLXZvaWQgRG9jdW1lbnQ6OmFkanVz
dEZsb2F0UXVhZHNGb3JTY3JvbGxBbmRBYnNvbHV0ZVpvb21BbmRGcmFtZVNjYWxlKFZlY3RvcjxG
bG9hdFF1YWQ+JiBxdWFkcywgUmVuZGVyT2JqZWN0KiByZW5kZXJlcikKLXsKLSAgICBpZiAoIXZp
ZXcoKSkKLSAgICAgICAgcmV0dXJuOworICAgIFN0eWxlU2hlZXRWZWN0b3IgbmV3U3R5bGVzaGVl
dHM7CisgICAgY29sbGVjdEFjdGl2ZVN0eWxlU2hlZXRzKG5ld1N0eWxlc2hlZXRzKTsKIAotICAg
IGZsb2F0IGludmVyc2VGcmFtZVNjYWxlID0gMTsKLSAgICBpZiAoZnJhbWUoKSkKLSAgICAgICAg
aW52ZXJzZUZyYW1lU2NhbGUgPSAxIC8gZnJhbWUoKS0+ZnJhbWVTY2FsZUZhY3RvcigpOwotCi0g
ICAgTGF5b3V0UmVjdCB2aXNpYmxlQ29udGVudFJlY3QgPSB2aWV3KCktPnZpc2libGVDb250ZW50
UmVjdCgpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcXVhZHMuc2l6ZSgpOyArK2kpIHsK
LSAgICAgICAgcXVhZHNbaV0ubW92ZSgtdmlzaWJsZUNvbnRlbnRSZWN0LngoKSwgLXZpc2libGVD
b250ZW50UmVjdC55KCkpOwotICAgICAgICBhZGp1c3RGbG9hdFF1YWRGb3JBYnNvbHV0ZVpvb20o
cXVhZHNbaV0sIHJlbmRlcmVyKTsKLSAgICAgICAgaWYgKGludmVyc2VGcmFtZVNjYWxlICE9IDEp
Ci0gICAgICAgICAgICBxdWFkc1tpXS5zY2FsZShpbnZlcnNlRnJhbWVTY2FsZSwgaW52ZXJzZUZy
YW1lU2NhbGUpOworICAgIGJvb2wgcmVxdWlyZXNTdHlsZVJlc29sdmVyUmVzZXQ7CisgICAgYm9v
bCByZXF1aXJlc0Z1bGxTdHlsZVJlY2FsYzsKKyAgICBhbmFseXplU3R5bGVTaGVldENoYW5nZSh1
cGRhdGVGbGFnLCBuZXdTdHlsZXNoZWV0cywgcmVxdWlyZXNTdHlsZVJlc29sdmVyUmVzZXQsIHJl
cXVpcmVzRnVsbFN0eWxlUmVjYWxjKTsKKworICAgIGlmIChyZXF1aXJlc1N0eWxlUmVzb2x2ZXJS
ZXNldCkKKyAgICAgICAgbV9kb2N1bWVudC0+Y2xlYXJTdHlsZVJlc29sdmVyKCk7CisgICAgZWxz
ZSB7CisgICAgICAgIG1fZG9jdW1lbnQtPnN0eWxlUmVzb2x2ZXIoKS0+YXBwZW5kQXV0aG9yU3R5
bGVzaGVldHMobV9hdXRob3JTdHlsZVNoZWV0cy0+bGVuZ3RoKCksIG5ld1N0eWxlc2hlZXRzKTsK
KyAgICAgICAgcmVzZXRDU1NGZWF0dXJlRmxhZ3MoKTsKICAgICB9Ci19CisgICAgbV9hdXRob3JT
dHlsZVNoZWV0cy0+c3dhcChuZXdTdHlsZXNoZWV0cyk7CiAKLXZvaWQgRG9jdW1lbnQ6OmFkanVz
dEZsb2F0UmVjdEZvclNjcm9sbEFuZEFic29sdXRlWm9vbUFuZEZyYW1lU2NhbGUoRmxvYXRSZWN0
JiByZWN0LCBSZW5kZXJPYmplY3QqIHJlbmRlcmVyKQotewotICAgIGlmICghdmlldygpKQotICAg
ICAgICByZXR1cm47CisgICAgbV91c2VzUmVtVW5pdHMgPSBzdHlsZVNoZWV0c1VzZVJlbVVuaXRz
KG1fYXV0aG9yU3R5bGVTaGVldHMtPnZlY3RvcigpKTsKKyAgICBtX25lZWRzVXBkYXRlQWN0aXZl
U3R5bGVzaGVldHNPblN0eWxlUmVjYWxjID0gZmFsc2U7CiAKLSAgICBmbG9hdCBpbnZlcnNlRnJh
bWVTY2FsZSA9IDE7Ci0gICAgaWYgKGZyYW1lKCkpCi0gICAgICAgIGludmVyc2VGcmFtZVNjYWxl
ID0gMSAvIGZyYW1lKCktPmZyYW1lU2NhbGVGYWN0b3IoKTsKLQotICAgIExheW91dFJlY3Qgdmlz
aWJsZUNvbnRlbnRSZWN0ID0gdmlldygpLT52aXNpYmxlQ29udGVudFJlY3QoKTsKLSAgICByZWN0
Lm1vdmUoLXZpc2libGVDb250ZW50UmVjdC54KCksIC12aXNpYmxlQ29udGVudFJlY3QueSgpKTsK
LSAgICBhZGp1c3RGbG9hdFJlY3RGb3JBYnNvbHV0ZVpvb20ocmVjdCwgcmVuZGVyZXIpOwotICAg
IGlmIChpbnZlcnNlRnJhbWVTY2FsZSAhPSAxKQotICAgICAgICByZWN0LnNjYWxlKGludmVyc2VG
cmFtZVNjYWxlKTsKLX0KKyAgICBtX2RvY3VtZW50LT5ub3RpZnlTZWFtbGVzc0NoaWxkRG9jdW1l
bnRzT2ZTdHlsZXNoZWV0VXBkYXRlKCk7CiAKLXZvaWQgRG9jdW1lbnQ6OnNldENvbnRleHRGZWF0
dXJlcyhQYXNzUmVmUHRyPENvbnRleHRGZWF0dXJlcz4gZmVhdHVyZXMpCi17Ci0gICAgbV9jb250
ZXh0RmVhdHVyZXMgPSBmZWF0dXJlczsKKyAgICByZXR1cm4gcmVxdWlyZXNGdWxsU3R5bGVSZWNh
bGM7CiB9CiAKLXN0YXRpYyBSZW5kZXJPYmplY3QqIG5lYXJlc3RDb21tb25Ib3ZlckFuY2VzdG9y
KFJlbmRlck9iamVjdCogb2JqMSwgUmVuZGVyT2JqZWN0KiBvYmoyKQordm9pZCBEb2N1bWVudFN0
eWxlU2hlZXRDb2xsZWN0aW9uOjpjb21iaW5lQ1NTRmVhdHVyZUZsYWdzKCkKIHsKLSAgICBpZiAo
IW9iajEgfHwgIW9iajIpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgZm9yIChSZW5kZXJPYmpl
Y3QqIGN1cnJPYmoxID0gb2JqMTsgY3Vyck9iajE7IGN1cnJPYmoxID0gY3Vyck9iajEtPmhvdmVy
QW5jZXN0b3IoKSkgewotICAgICAgICBmb3IgKFJlbmRlck9iamVjdCogY3Vyck9iajIgPSBvYmoy
OyBjdXJyT2JqMjsgY3Vyck9iajIgPSBjdXJyT2JqMi0+aG92ZXJBbmNlc3RvcigpKSB7Ci0gICAg
ICAgICAgICBpZiAoY3Vyck9iajEgPT0gY3Vyck9iajIpCi0gICAgICAgICAgICAgICAgcmV0dXJu
IGN1cnJPYmoxOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7CisgICAgLy8gRGVs
YXkgcmVzZXR0aW5nIHRoZSBmbGFncyB1bnRpbCBhZnRlciBuZXh0IHN0eWxlIHJlY2FsYyBzaW5j
ZSB1bmFwcGx5aW5nIHRoZSBzdHlsZSBtYXkgbm90IHdvcmsgd2l0aG91dCB0aGVzZSBzZXQgKHRo
aXMgaXMgdHJ1ZSBhdCBsZWFzdCB3aXRoIGJlZm9yZS9hZnRlcikuCisgICAgU3R5bGVSZXNvbHZl
ciogc3R5bGVSZXNvbHZlciA9IG1fZG9jdW1lbnQtPnN0eWxlUmVzb2x2ZXIoKTsKKyAgICBtX3Vz
ZXNTaWJsaW5nUnVsZXMgPSBtX3VzZXNTaWJsaW5nUnVsZXMgfHwgc3R5bGVSZXNvbHZlci0+dXNl
c1NpYmxpbmdSdWxlcygpOworICAgIG1fdXNlc0ZpcnN0TGluZVJ1bGVzID0gbV91c2VzRmlyc3RM
aW5lUnVsZXMgfHwgc3R5bGVSZXNvbHZlci0+dXNlc0ZpcnN0TGluZVJ1bGVzKCk7CisgICAgbV91
c2VzQmVmb3JlQWZ0ZXJSdWxlcyA9IG1fdXNlc0JlZm9yZUFmdGVyUnVsZXMgfHwgc3R5bGVSZXNv
bHZlci0+dXNlc0JlZm9yZUFmdGVyUnVsZXMoKTsKIH0KIAotdm9pZCBEb2N1bWVudDo6dXBkYXRl
SG92ZXJBY3RpdmVTdGF0ZShjb25zdCBIaXRUZXN0UmVxdWVzdCYgcmVxdWVzdCwgSGl0VGVzdFJl
c3VsdCYgcmVzdWx0KQordm9pZCBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjpyZXNldENT
U0ZlYXR1cmVGbGFncygpCiB7Ci0gICAgLy8gV2UgZG9uJ3QgdXBkYXRlIDpob3Zlci86YWN0aXZl
IHN0YXRlIHdoZW4gdGhlIHJlc3VsdCBpcyBtYXJrZWQgYXMgcmVhZE9ubHkuCi0gICAgaWYgKHJl
cXVlc3QucmVhZE9ubHkoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgTm9kZSogaW5uZXJOb2Rl
SW5Eb2N1bWVudCA9IHJlc3VsdC5pbm5lck5vZGUoKTsKLSAgICBBU1NFUlQoIWlubmVyTm9kZUlu
RG9jdW1lbnQgfHwgaW5uZXJOb2RlSW5Eb2N1bWVudC0+ZG9jdW1lbnQoKSA9PSB0aGlzKTsKLQot
ICAgIE5vZGUqIG9sZEFjdGl2ZU5vZGUgPSBhY3RpdmVOb2RlKCk7Ci0gICAgaWYgKG9sZEFjdGl2
ZU5vZGUgJiYgIXJlcXVlc3QuYWN0aXZlKCkpIHsKLSAgICAgICAgLy8gV2UgYXJlIGNsZWFyaW5n
IHRoZSA6YWN0aXZlIGNoYWluIGJlY2F1c2UgdGhlIG1vdXNlIGhhcyBiZWVuIHJlbGVhc2VkLgot
ICAgICAgICBmb3IgKFJlbmRlck9iamVjdCogY3VyciA9IG9sZEFjdGl2ZU5vZGUtPnJlbmRlcmVy
KCk7IGN1cnI7IGN1cnIgPSBjdXJyLT5wYXJlbnQoKSkgewotICAgICAgICAgICAgaWYgKGN1cnIt
Pm5vZGUoKSAmJiAhY3Vyci0+aXNUZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBjdXJyLT5ub2Rl
KCktPnNldEFjdGl2ZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgY3Vyci0+bm9kZSgpLT5jbGVh
ckluQWN0aXZlQ2hhaW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzZXRB
Y3RpdmVOb2RlKDApOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIE5vZGUqIG5ld0FjdGl2ZU5vZGUg
PSBpbm5lck5vZGVJbkRvY3VtZW50OwotICAgICAgICBpZiAoIW9sZEFjdGl2ZU5vZGUgJiYgbmV3
QWN0aXZlTm9kZSAmJiByZXF1ZXN0LmFjdGl2ZSgpICYmICFyZXF1ZXN0LnRvdWNoTW92ZSgpKSB7
Ci0gICAgICAgICAgICAvLyBXZSBhcmUgc2V0dGluZyB0aGUgOmFjdGl2ZSBjaGFpbiBhbmQgZnJl
ZXppbmcgaXQuIElmIGZ1dHVyZSBtb3ZlcyBoYXBwZW4sIHRoZXkKLSAgICAgICAgICAgIC8vIHdp
bGwgbmVlZCB0byByZWZlcmVuY2UgdGhpcyBjaGFpbi4KLSAgICAgICAgICAgIGZvciAoUmVuZGVy
T2JqZWN0KiBjdXJyID0gbmV3QWN0aXZlTm9kZS0+cmVuZGVyZXIoKTsgY3VycjsgY3VyciA9IGN1
cnItPnBhcmVudCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGN1cnItPm5vZGUoKSAmJiAhY3Vy
ci0+aXNUZXh0KCkpCi0gICAgICAgICAgICAgICAgICAgIGN1cnItPm5vZGUoKS0+c2V0SW5BY3Rp
dmVDaGFpbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0QWN0aXZlTm9kZShuZXdB
Y3RpdmVOb2RlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvLyBJZiB0aGUgbW91c2UgaGFzIGp1
c3QgYmVlbiBwcmVzc2VkLCBzZXQgOmFjdGl2ZSBvbiB0aGUgY2hhaW4uIFRob3NlIChhbmQgb25s
eSB0aG9zZSkKLSAgICAvLyBub2RlcyBzaG91bGQgcmVtYWluIDphY3RpdmUgdW50aWwgdGhlIG1v
dXNlIGlzIHJlbGVhc2VkLgotICAgIGJvb2wgYWxsb3dBY3RpdmVDaGFuZ2VzID0gIW9sZEFjdGl2
ZU5vZGUgJiYgYWN0aXZlTm9kZSgpOwotCi0gICAgLy8gSWYgdGhlIG1vdXNlIGlzIGRvd24gYW5k
IGlmIHRoaXMgaXMgYSBtb3VzZSBtb3ZlIGV2ZW50LCB3ZSB3YW50IHRvIHJlc3RyaWN0IGNoYW5n
ZXMgaW4KLSAgICAvLyA6aG92ZXIvOmFjdGl2ZSB0byBvbmx5IGFwcGx5IHRvIGVsZW1lbnRzIHRo
YXQgYXJlIGluIHRoZSA6YWN0aXZlIGNoYWluIHRoYXQgd2UgZnJvemUKLSAgICAvLyBhdCB0aGUg
dGltZSB0aGUgbW91c2Ugd2VudCBkb3duLgotICAgIGJvb2wgbXVzdEJlSW5BY3RpdmVDaGFpbiA9
IHJlcXVlc3QuYWN0aXZlKCkgJiYgcmVxdWVzdC5tb3ZlKCk7Ci0KLSAgICBSZWZQdHI8Tm9kZT4g
b2xkSG92ZXJOb2RlID0gaG92ZXJOb2RlKCk7Ci0gICAgLy8gQ2xlYXIgdGhlIDpob3ZlciBjaGFp
biB3aGVuIHRoZSB0b3VjaCBnZXN0dXJlIGlzIG92ZXIuCi0gICAgaWYgKHJlcXVlc3QudG91Y2hS
ZWxlYXNlKCkpIHsKLSAgICAgICAgaWYgKG9sZEhvdmVyTm9kZSkgewotICAgICAgICAgICAgZm9y
IChSZW5kZXJPYmplY3QqIGN1cnIgPSBvbGRIb3Zlck5vZGUtPnJlbmRlcmVyKCk7IGN1cnI7IGN1
cnIgPSBjdXJyLT5ob3ZlckFuY2VzdG9yKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoY3Vyci0+
bm9kZSgpICYmICFjdXJyLT5pc1RleHQoKSkKLSAgICAgICAgICAgICAgICAgICAgY3Vyci0+bm9k
ZSgpLT5zZXRIb3ZlcmVkKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldEhv
dmVyTm9kZSgwKTsKLSAgICAgICAgfQotICAgICAgICAvLyBBIHRvdWNoIHJlbGVhc2UgY2FuIG5v
dCBzZXQgbmV3IGhvdmVyIG9yIGFjdGl2ZSB0YXJnZXQuCi0gICAgICAgIHJldHVybjsKLSAgICB9
Ci0KLSAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIGhvdmVyZWQgbm9kZSBoYXMgY2hhbmdlZC4K
LSAgICAvLyBJZiBpdCBoYXNuJ3QsIHdlIGRvIG5vdCBuZWVkIHRvIGRvIGFueXRoaW5nLgotICAg
IE5vZGUqIG5ld0hvdmVyTm9kZSA9IGlubmVyTm9kZUluRG9jdW1lbnQ7Ci0gICAgd2hpbGUgKG5l
d0hvdmVyTm9kZSAmJiAhbmV3SG92ZXJOb2RlLT5yZW5kZXJlcigpKQotICAgICAgICBuZXdIb3Zl
ck5vZGUgPSBuZXdIb3Zlck5vZGUtPnBhcmVudE9ySG9zdE5vZGUoKTsKLQotICAgIC8vIFVwZGF0
ZSBvdXIgY3VycmVudCBob3ZlciBub2RlLgotICAgIHNldEhvdmVyTm9kZShuZXdIb3Zlck5vZGUp
OwotCi0gICAgLy8gV2UgaGF2ZSB0d28gZGlmZmVyZW50IG9iamVjdHMuIEZldGNoIHRoZWlyIHJl
bmRlcmVycy4KLSAgICBSZW5kZXJPYmplY3QqIG9sZEhvdmVyT2JqID0gb2xkSG92ZXJOb2RlID8g
b2xkSG92ZXJOb2RlLT5yZW5kZXJlcigpIDogMDsKLSAgICBSZW5kZXJPYmplY3QqIG5ld0hvdmVy
T2JqID0gbmV3SG92ZXJOb2RlID8gbmV3SG92ZXJOb2RlLT5yZW5kZXJlcigpIDogMDsKLQotICAg
IC8vIExvY2F0ZSB0aGUgY29tbW9uIGFuY2VzdG9yIHJlbmRlciBvYmplY3QgZm9yIHRoZSB0d28g
cmVuZGVyZXJzLgotICAgIFJlbmRlck9iamVjdCogYW5jZXN0b3IgPSBuZWFyZXN0Q29tbW9uSG92
ZXJBbmNlc3RvcihvbGRIb3Zlck9iaiwgbmV3SG92ZXJPYmopOwotCi0gICAgVmVjdG9yPFJlZlB0
cjxOb2RlPiwgMzI+IG5vZGVzVG9SZW1vdmVGcm9tQ2hhaW47Ci0gICAgVmVjdG9yPFJlZlB0cjxO
b2RlPiwgMzI+IG5vZGVzVG9BZGRUb0NoYWluOwotCi0gICAgaWYgKG9sZEhvdmVyT2JqICE9IG5l
d0hvdmVyT2JqKSB7Ci0gICAgICAgIC8vIFRoZSBvbGQgaG92ZXIgcGF0aCBvbmx5IG5lZWRzIHRv
IGJlIGNsZWFyZWQgdXAgdG8gKGFuZCBub3QgaW5jbHVkaW5nKSB0aGUgY29tbW9uIGFuY2VzdG9y
OwotICAgICAgICBmb3IgKFJlbmRlck9iamVjdCogY3VyciA9IG9sZEhvdmVyT2JqOyBjdXJyICYm
IGN1cnIgIT0gYW5jZXN0b3I7IGN1cnIgPSBjdXJyLT5ob3ZlckFuY2VzdG9yKCkpIHsKLSAgICAg
ICAgICAgIGlmIChjdXJyLT5ub2RlKCkgJiYgIWN1cnItPmlzVGV4dCgpICYmICghbXVzdEJlSW5B
Y3RpdmVDaGFpbiB8fCBjdXJyLT5ub2RlKCktPmluQWN0aXZlQ2hhaW4oKSkpCi0gICAgICAgICAg
ICAgICAgbm9kZXNUb1JlbW92ZUZyb21DaGFpbi5hcHBlbmQoY3Vyci0+bm9kZSgpKTsKLSAgICAg
ICAgfQotICAgIH0KLQotICAgIC8vIE5vdyBzZXQgdGhlIGhvdmVyIHN0YXRlIGZvciBvdXIgbmV3
IG9iamVjdCB1cCB0byB0aGUgcm9vdC4KLSAgICBmb3IgKFJlbmRlck9iamVjdCogY3VyciA9IG5l
d0hvdmVyT2JqOyBjdXJyOyBjdXJyID0gY3Vyci0+aG92ZXJBbmNlc3RvcigpKSB7Ci0gICAgICAg
IGlmIChjdXJyLT5ub2RlKCkgJiYgIWN1cnItPmlzVGV4dCgpICYmICghbXVzdEJlSW5BY3RpdmVD
aGFpbiB8fCBjdXJyLT5ub2RlKCktPmluQWN0aXZlQ2hhaW4oKSkpCi0gICAgICAgICAgICBub2Rl
c1RvQWRkVG9DaGFpbi5hcHBlbmQoY3Vyci0+bm9kZSgpKTsKLSAgICB9Ci0KLSAgICBzaXplX3Qg
cmVtb3ZlQ291bnQgPSBub2Rlc1RvUmVtb3ZlRnJvbUNoYWluLnNpemUoKTsKLSAgICBmb3IgKHNp
emVfdCBpID0gMDsgaSA8IHJlbW92ZUNvdW50OyArK2kpCi0gICAgICAgIG5vZGVzVG9SZW1vdmVG
cm9tQ2hhaW5baV0tPnNldEhvdmVyZWQoZmFsc2UpOwotCi0gICAgc2l6ZV90IGFkZENvdW50ID0g
bm9kZXNUb0FkZFRvQ2hhaW4uc2l6ZSgpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYWRk
Q291bnQ7ICsraSkgewotICAgICAgICBpZiAoYWxsb3dBY3RpdmVDaGFuZ2VzKQotICAgICAgICAg
ICAgbm9kZXNUb0FkZFRvQ2hhaW5baV0tPnNldEFjdGl2ZSh0cnVlKTsKLSAgICAgICAgbm9kZXNU
b0FkZFRvQ2hhaW5baV0tPnNldEhvdmVyZWQodHJ1ZSk7Ci0gICAgfQorICAgIFN0eWxlUmVzb2x2
ZXIqIHN0eWxlUmVzb2x2ZXIgPSBtX2RvY3VtZW50LT5zdHlsZVJlc29sdmVyKCk7CisgICAgbV91
c2VzU2libGluZ1J1bGVzID0gc3R5bGVSZXNvbHZlci0+dXNlc1NpYmxpbmdSdWxlcygpOworICAg
IG1fdXNlc0ZpcnN0TGluZVJ1bGVzID0gc3R5bGVSZXNvbHZlci0+dXNlc0ZpcnN0TGluZVJ1bGVz
KCk7CisgICAgbV91c2VzQmVmb3JlQWZ0ZXJSdWxlcyA9IHN0eWxlUmVzb2x2ZXItPnVzZXNCZWZv
cmVBZnRlclJ1bGVzKCk7CiB9CiAKLXZvaWQgRG9jdW1lbnQ6OnJlcG9ydE1lbW9yeVVzYWdlKE1l
bW9yeU9iamVjdEluZm8qIG1lbW9yeU9iamVjdEluZm8pIGNvbnN0Cit2b2lkIERvY3VtZW50U3R5
bGVTaGVldENvbGxlY3Rpb246OnJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qIG1l
bW9yeU9iamVjdEluZm8pIGNvbnN0CiB7CiAgICAgTWVtb3J5Q2xhc3NJbmZvIGluZm8obWVtb3J5
T2JqZWN0SW5mbywgdGhpcywgV2ViQ29yZU1lbW9yeVR5cGVzOjpET00pOwotICAgIGluZm8uYWRk
TWVtYmVyKG1fc3R5bGVSZXNvbHZlcik7Ci0gICAgQ29udGFpbmVyTm9kZTo6cmVwb3J0TWVtb3J5
VXNhZ2UobWVtb3J5T2JqZWN0SW5mbyk7Ci0gICAgaW5mby5hZGRWZWN0b3IobV9jdXN0b21Gb250
cyk7Ci0gICAgaW5mby5hZGRNZW1iZXIobV91cmwpOwotICAgIGluZm8uYWRkTWVtYmVyKG1fYmFz
ZVVSTCk7Ci0gICAgaW5mby5hZGRNZW1iZXIobV9iYXNlVVJMT3ZlcnJpZGUpOwotICAgIGluZm8u
YWRkTWVtYmVyKG1fYmFzZUVsZW1lbnRVUkwpOwotICAgIGluZm8uYWRkTWVtYmVyKG1fY29va2ll
VVJMKTsKLSAgICBpbmZvLmFkZE1lbWJlcihtX2ZpcnN0UGFydHlGb3JDb29raWVzKTsKLSAgICBp
bmZvLmFkZE1lbWJlcihtX2RvY3VtZW50VVJJKTsKLSAgICBpbmZvLmFkZE1lbWJlcihtX2Jhc2VU
YXJnZXQpOwotICAgIGluZm8uYWRkTWVtYmVyKG1fZnJhbWUpOwotICAgIGluZm8uYWRkTWVtYmVy
KG1fY2FjaGVkUmVzb3VyY2VMb2FkZXIpOwotICAgIGluZm8uYWRkTWVtYmVyKG1fZWxlbVNoZWV0
KTsKICAgICBpbmZvLmFkZE1lbWJlcihtX3BhZ2VVc2VyU2hlZXQpOwogICAgIGlmIChtX3BhZ2VH
cm91cFVzZXJTaGVldHMpCiAgICAgICAgIGluZm8uYWRkSW5zdHJ1bWVudGVkVmVjdG9yUHRyKG1f
cGFnZUdyb3VwVXNlclNoZWV0cyk7CiAgICAgaWYgKG1fdXNlclNoZWV0cykKICAgICAgICAgaW5m
by5hZGRJbnN0cnVtZW50ZWRWZWN0b3JQdHIobV91c2VyU2hlZXRzKTsKLSAgICBpbmZvLmFkZEhh
c2hTZXQobV9ub2RlSXRlcmF0b3JzKTsKLSAgICBpbmZvLmFkZEhhc2hTZXQobV9yYW5nZXMpOwog
ICAgIGluZm8uYWRkTGlzdEhhc2hTZXQobV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMpOwotICAg
IGluZm8uYWRkTWVtYmVyKG1fcHJlZmVycmVkU3R5bGVzaGVldFNldCk7Ci0gICAgaW5mby5hZGRN
ZW1iZXIobV9zZWxlY3RlZFN0eWxlc2hlZXRTZXQpOwotICAgIGluZm8uYWRkTWVtYmVyKG1fdGl0
bGUuc3RyaW5nKCkpOwotICAgIGluZm8uYWRkTWVtYmVyKG1fcmF3VGl0bGUuc3RyaW5nKCkpOwot
ICAgIGluZm8uYWRkTWVtYmVyKG1feG1sRW5jb2RpbmcpOwotICAgIGluZm8uYWRkTWVtYmVyKG1f
eG1sVmVyc2lvbik7Ci0gICAgaW5mby5hZGRNZW1iZXIobV9jb250ZW50TGFuZ3VhZ2UpOwotICAg
IGluZm8uYWRkSGFzaE1hcChtX2RvY3VtZW50TmFtZWRJdGVtQ29sbGVjdGlvbnMpOwotICAgIGlu
Zm8uYWRkSGFzaE1hcChtX3dpbmRvd05hbWVkSXRlbUNvbGxlY3Rpb25zKTsKLSNpZiBFTkFCTEUo
REFTSEJPQVJEX1NVUFBPUlQpCi0gICAgaW5mby5hZGRWZWN0b3IobV9kYXNoYm9hcmRSZWdpb25z
KTsKLSNlbmRpZgotICAgIGluZm8uYWRkSGFzaE1hcChtX2Nzc0NhbnZhc0VsZW1lbnRzKTsKLSAg
ICBpbmZvLmFkZFZlY3RvcihtX2ljb25VUkxzKTsKLSAgICBpbmZvLmFkZEhhc2hTZXQobV9kb2N1
bWVudFN1c3BlbnNpb25DYWxsYmFja0VsZW1lbnRzKTsKLSAgICBpbmZvLmFkZEhhc2hTZXQobV9t
ZWRpYVZvbHVtZUNhbGxiYWNrRWxlbWVudHMpOwotICAgIGluZm8uYWRkSGFzaFNldChtX3ByaXZh
dGVCcm93c2luZ1N0YXRlQ2hhbmdlZEVsZW1lbnRzKTsKLSAgICBpbmZvLmFkZEhhc2hNYXAobV9l
bGVtZW50c0J5QWNjZXNzS2V5KTsKLSAgICBpbmZvLmFkZE1lbWJlcihtX2V2ZW50UXVldWUpOwot
ICAgIGluZm8uYWRkSGFzaFNldChtX21lZGlhQ2FuU3RhcnRMaXN0ZW5lcnMpOwotICAgIGluZm8u
YWRkVmVjdG9yKG1fcGVuZGluZ1Rhc2tzKTsKLX0KLQotI2lmIEVOQUJMRShVTkRPX01BTkFHRVIp
Ci1QYXNzUmVmUHRyPFVuZG9NYW5hZ2VyPiBEb2N1bWVudDo6dW5kb01hbmFnZXIoKQotewotICAg
IGlmICghbV91bmRvTWFuYWdlcikKLSAgICAgICAgbV91bmRvTWFuYWdlciA9IFVuZG9NYW5hZ2Vy
OjpjcmVhdGUodGhpcyk7Ci0gICAgcmV0dXJuIG1fdW5kb01hbmFnZXI7Ci19Ci0jZW5kaWYKLQot
Y2xhc3MgSW1tdXRhYmxlQXR0cmlidXRlRGF0YUNhY2hlS2V5IHsKLXB1YmxpYzoKLSAgICBJbW11
dGFibGVBdHRyaWJ1dGVEYXRhQ2FjaGVLZXkoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwg
Y29uc3QgQXR0cmlidXRlKiBhdHRyaWJ1dGVzLCB1bnNpZ25lZCBhdHRyaWJ1dGVDb3VudCkKLSAg
ICAgICAgOiBtX3RhZ1FOYW1lKHRhZ05hbWUpCi0gICAgICAgICwgbV9hdHRyaWJ1dGVzKGF0dHJp
YnV0ZXMpCi0gICAgICAgICwgbV9hdHRyaWJ1dGVDb3VudChhdHRyaWJ1dGVDb3VudCkKLSAgICB7
IH0KLQotICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBJbW11dGFibGVBdHRyaWJ1dGVEYXRhQ2Fj
aGVLZXkmIG90aGVyKSBjb25zdAotICAgIHsKLSAgICAgICAgaWYgKG1fdGFnUU5hbWUgIT0gb3Ro
ZXIubV90YWdRTmFtZSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBpZiAobV9h
dHRyaWJ1dGVDb3VudCAhPSBvdGhlci5tX2F0dHJpYnV0ZUNvdW50KQotICAgICAgICAgICAgcmV0
dXJuIHRydWU7Ci0gICAgICAgIHJldHVybiBtZW1jbXAobV9hdHRyaWJ1dGVzLCBvdGhlci5tX2F0
dHJpYnV0ZXMsIHNpemVvZihBdHRyaWJ1dGUpICogbV9hdHRyaWJ1dGVDb3VudCk7Ci0gICAgfQot
Ci0gICAgdW5zaWduZWQgaGFzaCgpIGNvbnN0Ci0gICAgewotICAgICAgICB1bnNpZ25lZCBhdHRy
aWJ1dGVIYXNoID0gU3RyaW5nSGFzaGVyOjpoYXNoTWVtb3J5KG1fYXR0cmlidXRlcywgbV9hdHRy
aWJ1dGVDb3VudCAqIHNpemVvZihBdHRyaWJ1dGUpKTsKLSAgICAgICAgcmV0dXJuIFdURjo6cGFp
ckludEhhc2gobV90YWdRTmFtZS5sb2NhbE5hbWUoKS5pbXBsKCktPmV4aXN0aW5nSGFzaCgpLCBh
dHRyaWJ1dGVIYXNoKTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgUXVhbGlmaWVkTmFtZSBtX3Rh
Z1FOYW1lOwotICAgIGNvbnN0IEF0dHJpYnV0ZSogbV9hdHRyaWJ1dGVzOwotICAgIHVuc2lnbmVk
IG1fYXR0cmlidXRlQ291bnQ7Ci19OwotCi1zdHJ1Y3QgSW1tdXRhYmxlQXR0cmlidXRlRGF0YUNh
Y2hlRW50cnkgewotICAgIEltbXV0YWJsZUF0dHJpYnV0ZURhdGFDYWNoZUVudHJ5KGNvbnN0IElt
bXV0YWJsZUF0dHJpYnV0ZURhdGFDYWNoZUtleSYgaywgUGFzc1JlZlB0cjxFbGVtZW50QXR0cmli
dXRlRGF0YT4gdikKLSAgICAgICAgOiBrZXkoaykKLSAgICAgICAgLCB2YWx1ZSh2KQotICAgIHsg
fQotCi0gICAgSW1tdXRhYmxlQXR0cmlidXRlRGF0YUNhY2hlS2V5IGtleTsKLSAgICBSZWZQdHI8
RWxlbWVudEF0dHJpYnV0ZURhdGE+IHZhbHVlOwotfTsKLQotUGFzc1JlZlB0cjxFbGVtZW50QXR0
cmlidXRlRGF0YT4gRG9jdW1lbnQ6OmNhY2hlZEltbXV0YWJsZUF0dHJpYnV0ZURhdGEoY29uc3Qg
RWxlbWVudCogZWxlbWVudCwgY29uc3QgVmVjdG9yPEF0dHJpYnV0ZT4mIGF0dHJpYnV0ZXMpCi17
Ci0gICAgQVNTRVJUKCFhdHRyaWJ1dGVzLmlzRW1wdHkoKSk7Ci0KLSAgICBJbW11dGFibGVBdHRy
aWJ1dGVEYXRhQ2FjaGVLZXkgY2FjaGVLZXkoZWxlbWVudC0+dGFnUU5hbWUoKSwgYXR0cmlidXRl
cy5kYXRhKCksIGF0dHJpYnV0ZXMuc2l6ZSgpKTsKLSAgICB1bnNpZ25lZCBjYWNoZUhhc2ggPSBj
YWNoZUtleS5oYXNoKCk7Ci0KLSAgICBJbW11dGFibGVBdHRyaWJ1dGVEYXRhQ2FjaGU6Oml0ZXJh
dG9yIGNhY2hlSXRlcmF0b3IgPSBtX2ltbXV0YWJsZUF0dHJpYnV0ZURhdGFDYWNoZS5hZGQoY2Fj
aGVIYXNoLCBudWxscHRyKS5pdGVyYXRvcjsKLSAgICBpZiAoY2FjaGVJdGVyYXRvci0+c2Vjb25k
ICYmIGNhY2hlSXRlcmF0b3ItPnNlY29uZC0+a2V5ICE9IGNhY2hlS2V5KQotICAgICAgICBjYWNo
ZUhhc2ggPSAwOwotCi0gICAgUmVmUHRyPEVsZW1lbnRBdHRyaWJ1dGVEYXRhPiBhdHRyaWJ1dGVE
YXRhOwotICAgIGlmIChjYWNoZUhhc2ggJiYgY2FjaGVJdGVyYXRvci0+c2Vjb25kKQotICAgICAg
ICBhdHRyaWJ1dGVEYXRhID0gY2FjaGVJdGVyYXRvci0+c2Vjb25kLT52YWx1ZTsKLSAgICBlbHNl
Ci0gICAgICAgIGF0dHJpYnV0ZURhdGEgPSBFbGVtZW50QXR0cmlidXRlRGF0YTo6Y3JlYXRlSW1t
dXRhYmxlKGF0dHJpYnV0ZXMpOwotCi0gICAgaWYgKCFjYWNoZUhhc2ggfHwgY2FjaGVJdGVyYXRv
ci0+c2Vjb25kKQotICAgICAgICByZXR1cm4gYXR0cmlidXRlRGF0YS5yZWxlYXNlKCk7Ci0KLSAg
ICBjYWNoZUl0ZXJhdG9yLT5zZWNvbmQgPSBhZG9wdFB0cihuZXcgSW1tdXRhYmxlQXR0cmlidXRl
RGF0YUNhY2hlRW50cnkoSW1tdXRhYmxlQXR0cmlidXRlRGF0YUNhY2hlS2V5KGVsZW1lbnQtPnRh
Z1FOYW1lKCksIGF0dHJpYnV0ZURhdGEtPmltbXV0YWJsZUF0dHJpYnV0ZUFycmF5KCksIGF0dHJp
YnV0ZURhdGEtPmxlbmd0aCgpKSwgYXR0cmlidXRlRGF0YSkpOwotCi0gICAgcmV0dXJuIGF0dHJp
YnV0ZURhdGEucmVsZWFzZSgpOworICAgIGluZm8uYWRkTWVtYmVyKG1fcHJlZmVycmVkU3R5bGVz
aGVldFNldE5hbWUpOworICAgIGluZm8uYWRkTWVtYmVyKG1fc2VsZWN0ZWRTdHlsZXNoZWV0U2V0
TmFtZSk7CiB9CiAKLUxvY2FsaXplciYgRG9jdW1lbnQ6OmdldExvY2FsaXplcihjb25zdCBBdG9t
aWNTdHJpbmcmIGxvY2FsZSkKLXsKLSAgICBBdG9taWNTdHJpbmcgbG9jYWxlS2V5ID0gbG9jYWxl
OwotICAgIGlmIChsb2NhbGUuaXNFbXB0eSgpIHx8ICFSdW50aW1lRW5hYmxlZEZlYXR1cmVzOjps
YW5nQXR0cmlidXRlQXdhcmVGb3JtQ29udHJvbFVJRW5hYmxlZCgpKQotICAgICAgICBsb2NhbGVL
ZXkgPSBkZWZhdWx0TGFuZ3VhZ2UoKTsKLSAgICBMb2NhbGVUb0xvY2FsaXplck1hcDo6QWRkUmVz
dWx0IHJlc3VsdCA9IG1fbG9jYWxpemVyQ2FjaGUuYWRkKGxvY2FsZUtleSwgbnVsbHB0cik7Ci0g
ICAgaWYgKHJlc3VsdC5pc05ld0VudHJ5KQotICAgICAgICByZXN1bHQuaXRlcmF0b3ItPnNlY29u
ZCA9IExvY2FsaXplcjo6Y3JlYXRlKGxvY2FsZUtleSk7Ci0gICAgcmV0dXJuICoocmVzdWx0Lml0
ZXJhdG9yLT5zZWNvbmQpOwogfQotCi19IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBTb3Vy
Y2UvV2ViQ29yZS9kb20vRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJDb3JlL2RvbS9Eb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmgJKHJl
dmlzaW9uIDApCisrKyBTb3VyY2UvV2ViQ29yZS9kb20vRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVj
dGlvbi5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMTk5OSBMYXJzIEtub2xsIChrbm9sbEBrZGUub3JnKQorICogICAgICAgICAgIChDKSAxOTk5
IEFudHRpIEtvaXZpc3RvIChrb2l2aXN0b0BrZGUub3JnKQorICogICAgICAgICAgIChDKSAyMDAx
IERpcmsgTXVlbGxlciAobXVlbGxlckBrZGUub3JnKQorICogICAgICAgICAgIChDKSAyMDA2IEFs
ZXhleSBQcm9za3VyeWFrb3YgKGFwQHdlYmtpdC5vcmcpCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQs
IDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTIgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5IFRvcmNoIE1vYmls
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIChodHRwOi8vd3d3LnRvcmNobW9iaWxlLmNvbS8p
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJz
aWRpYXJ5KC1pZXMpCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh
biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9m
IHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQg
YnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2Yg
dGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgor
ICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBi
ZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUg
aW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJs
aWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNl
aXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAq
IGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBu
b3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBG
cmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBV
U0EuCisgKgorICovCisKKyNpZm5kZWYgRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbl9oCisj
ZGVmaW5lIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb25faAorCisjaW5jbHVkZSA8d3RmL0Zh
c3RBbGxvY0Jhc2UuaD4KKyNpbmNsdWRlIDx3dGYvTGlzdEhhc2hTZXQuaD4KKyNpbmNsdWRlIDx3
dGYvUmVmUHRyLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0
L1dURlN0cmluZy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIENTU1N0eWxlU2hl
ZXQ7CitjbGFzcyBEb2N1bWVudDsKK2NsYXNzIE5vZGU7CitjbGFzcyBTdHlsZVNoZWV0OworY2xh
c3MgU3R5bGVTaGVldENvbnRlbnRzOworY2xhc3MgU3R5bGVTaGVldExpc3Q7CisKK2NsYXNzIERv
Y3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24geworICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVE
OworcHVibGljOgorICAgIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24oRG9jdW1lbnQqKTsK
KyAgICB+RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbigpOworCisgICAgU3R5bGVTaGVldExp
c3QqIGF1dGhvclN0eWxlU2hlZXRzKCkgeyByZXR1cm4gbV9hdXRob3JTdHlsZVNoZWV0cy5nZXQo
KTsgfQorCisgICAgQ1NTU3R5bGVTaGVldCogcGFnZVVzZXJTaGVldCgpOworICAgIGNvbnN0IFZl
Y3RvcjxSZWZQdHI8Q1NTU3R5bGVTaGVldD4gPiogcGFnZUdyb3VwVXNlclNoZWV0cygpIGNvbnN0
OworICAgIGNvbnN0IFZlY3RvcjxSZWZQdHI8Q1NTU3R5bGVTaGVldD4gPiogZG9jdW1lbnRVc2Vy
U2hlZXRzKCkgY29uc3QgeyByZXR1cm4gbV91c2VyU2hlZXRzLmdldCgpOyB9CisKKyAgICB2b2lk
IGFkZFN0eWxlU2hlZXRDYW5kaWRhdGVOb2RlKE5vZGUqLCBib29sIGNyZWF0ZWRCeVBhcnNlcik7
CisgICAgdm9pZCByZW1vdmVTdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZShOb2RlKik7CisKKyAgICB2
b2lkIGNsZWFyUGFnZVVzZXJTaGVldCgpOworICAgIHZvaWQgdXBkYXRlUGFnZVVzZXJTaGVldCgp
OworICAgIHZvaWQgY2xlYXJQYWdlR3JvdXBVc2VyU2hlZXRzKCk7CisgICAgdm9pZCB1cGRhdGVQ
YWdlR3JvdXBVc2VyU2hlZXRzKCk7CisKKyAgICB2b2lkIGFkZFVzZXJTaGVldChQYXNzUmVmUHRy
PFN0eWxlU2hlZXRDb250ZW50cz4gdXNlclNoZWV0KTsKKworICAgIGJvb2wgbmVlZHNVcGRhdGVB
Y3RpdmVTdHlsZXNoZWV0c09uU3R5bGVSZWNhbGMoKSB7IHJldHVybiBtX25lZWRzVXBkYXRlQWN0
aXZlU3R5bGVzaGVldHNPblN0eWxlUmVjYWxjOyB9CisKKyAgICBlbnVtIFVwZGF0ZUZsYWcgeyBG
dWxsVXBkYXRlLCBPcHRpbWl6ZWRVcGRhdGUgfTsKKyAgICBib29sIHVwZGF0ZUFjdGl2ZVN0eWxl
U2hlZXRzKFVwZGF0ZUZsYWcpOworCisgICAgU3RyaW5nIHByZWZlcnJlZFN0eWxlc2hlZXRTZXRO
YW1lKCkgY29uc3QgeyByZXR1cm4gbV9wcmVmZXJyZWRTdHlsZXNoZWV0U2V0TmFtZTsgfQorICAg
IFN0cmluZyBzZWxlY3RlZFN0eWxlc2hlZXRTZXROYW1lKCkgY29uc3QgeyByZXR1cm4gbV9zZWxl
Y3RlZFN0eWxlc2hlZXRTZXROYW1lOyB9CisgICAgdm9pZCBzZXRQcmVmZXJyZWRTdHlsZXNoZWV0
U2V0TmFtZShjb25zdCBTdHJpbmcmIG5hbWUpIHsgbV9wcmVmZXJyZWRTdHlsZXNoZWV0U2V0TmFt
ZSA9IG5hbWU7IH0KKyAgICB2b2lkIHNldFNlbGVjdGVkU3R5bGVzaGVldFNldE5hbWUoY29uc3Qg
U3RyaW5nJiBuYW1lKSB7IG1fc2VsZWN0ZWRTdHlsZXNoZWV0U2V0TmFtZSA9IG5hbWU7IH0KKwor
ICAgIHZvaWQgYWRkUGVuZGluZ1NoZWV0KCkgeyBtX3BlbmRpbmdTdHlsZXNoZWV0cysrOyB9Cisg
ICAgZW51bSBSZW1vdmVQZW5kaW5nU2hlZXROb3RpZmljYXRpb25UeXBlIHsKKyAgICAgICAgUmVt
b3ZlUGVuZGluZ1NoZWV0Tm90aWZ5SW1tZWRpYXRlbHksCisgICAgICAgIFJlbW92ZVBlbmRpbmdT
aGVldE5vdGlmeUxhdGVyCisgICAgfTsKKyAgICB2b2lkIHJlbW92ZVBlbmRpbmdTaGVldChSZW1v
dmVQZW5kaW5nU2hlZXROb3RpZmljYXRpb25UeXBlID0gUmVtb3ZlUGVuZGluZ1NoZWV0Tm90aWZ5
SW1tZWRpYXRlbHkpOworCisgICAgYm9vbCBoYXNQZW5kaW5nU2hlZXRzKCkgY29uc3QgeyByZXR1
cm4gbV9wZW5kaW5nU3R5bGVzaGVldHMgPiAwOyB9CisKKyAgICBib29sIHVzZXNTaWJsaW5nUnVs
ZXMoKSBjb25zdCB7IHJldHVybiBtX3VzZXNTaWJsaW5nUnVsZXMgfHwgbV91c2VzU2libGluZ1J1
bGVzT3ZlcnJpZGU7IH0KKyAgICB2b2lkIHNldFVzZXNTaWJsaW5nUnVsZXNPdmVycmlkZShib29s
IGIpIHsgbV91c2VzU2libGluZ1J1bGVzT3ZlcnJpZGUgPSBiOyB9CisgICAgYm9vbCB1c2VzRmly
c3RMaW5lUnVsZXMoKSBjb25zdCB7IHJldHVybiBtX3VzZXNGaXJzdExpbmVSdWxlczsgfQorICAg
IGJvb2wgdXNlc0ZpcnN0TGV0dGVyUnVsZXMoKSBjb25zdCB7IHJldHVybiBtX3VzZXNGaXJzdExl
dHRlclJ1bGVzOyB9CisgICAgdm9pZCBzZXRVc2VzRmlyc3RMZXR0ZXJSdWxlcyhib29sIGIpIHsg
bV91c2VzRmlyc3RMZXR0ZXJSdWxlcyA9IGI7IH0KKyAgICBib29sIHVzZXNCZWZvcmVBZnRlclJ1
bGVzKCkgY29uc3QgeyByZXR1cm4gbV91c2VzQmVmb3JlQWZ0ZXJSdWxlcyB8fCBtX3VzZXNCZWZv
cmVBZnRlclJ1bGVzT3ZlcnJpZGU7IH0KKyAgICB2b2lkIHNldFVzZXNCZWZvcmVBZnRlclJ1bGVz
T3ZlcnJpZGUoYm9vbCBiKSB7IG1fdXNlc0JlZm9yZUFmdGVyUnVsZXNPdmVycmlkZSA9IGI7IH0K
KyAgICBib29sIHVzZXNSZW1Vbml0cygpIGNvbnN0IHsgcmV0dXJuIG1fdXNlc1JlbVVuaXRzOyB9
CisgICAgdm9pZCBzZXRVc2VzUmVtVW5pdChib29sIGIpIHsgbV91c2VzUmVtVW5pdHMgPSBiOyB9
CisKKyAgICB2b2lkIGNvbWJpbmVDU1NGZWF0dXJlRmxhZ3MoKTsKKyAgICB2b2lkIHJlc2V0Q1NT
RmVhdHVyZUZsYWdzKCk7CisKKyAgICB2b2lkIHJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVj
dEluZm8qKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICB2b2lkIGNvbGxlY3RBY3RpdmVTdHlsZVNo
ZWV0cyhWZWN0b3I8UmVmUHRyPFN0eWxlU2hlZXQ+ID4mKTsKKyAgICBib29sIHRlc3RBZGRlZFN0
eWxlU2hlZXRSZXF1aXJlc1N0eWxlUmVjYWxjKFN0eWxlU2hlZXRDb250ZW50cyopOworICAgIHZv
aWQgYW5hbHl6ZVN0eWxlU2hlZXRDaGFuZ2UoVXBkYXRlRmxhZywgY29uc3QgVmVjdG9yPFJlZlB0
cjxTdHlsZVNoZWV0PiA+JiBuZXdTdHlsZXNoZWV0cywgYm9vbCYgcmVxdWlyZXNTdHlsZVJlc29s
dmVyUmVzZXQsIGJvb2wmIHJlcXVpcmVzRnVsbFN0eWxlUmVjYWxjKTsKKworICAgIERvY3VtZW50
KiBtX2RvY3VtZW50OworCisgICAgUmVmUHRyPFN0eWxlU2hlZXRMaXN0PiBtX2F1dGhvclN0eWxl
U2hlZXRzOworCisgICAgLy8gVHJhY2sgdGhlIG51bWJlciBvZiBjdXJyZW50bHkgbG9hZGluZyB0
b3AtbGV2ZWwgc3R5bGVzaGVldHMgbmVlZGVkIGZvciByZW5kZXJpbmcuCisgICAgLy8gU2hlZXRz
IGxvYWRlZCB1c2luZyB0aGUgQGltcG9ydCBkaXJlY3RpdmUgYXJlIG5vdCBpbmNsdWRlZCBpbiB0
aGlzIGNvdW50LgorICAgIC8vIFdlIHVzZSB0aGlzIGNvdW50IG9mIHBlbmRpbmcgc2hlZXRzIHRv
IGRldGVjdCB3aGVuIHdlIGNhbiBiZWdpbiBhdHRhY2hpbmcKKyAgICAvLyBlbGVtZW50cyBhbmQg
d2hlbiBpdCBpcyBzYWZlIHRvIGV4ZWN1dGUgc2NyaXB0cy4KKyAgICBpbnQgbV9wZW5kaW5nU3R5
bGVzaGVldHM7CisKKyAgICBSZWZQdHI8Q1NTU3R5bGVTaGVldD4gbV9wYWdlVXNlclNoZWV0Owor
ICAgIG11dGFibGUgT3duUHRyPFZlY3RvcjxSZWZQdHI8Q1NTU3R5bGVTaGVldD4gPiA+IG1fcGFn
ZUdyb3VwVXNlclNoZWV0czsKKyAgICBPd25QdHI8VmVjdG9yPFJlZlB0cjxDU1NTdHlsZVNoZWV0
PiA+ID4gbV91c2VyU2hlZXRzOworICAgIG11dGFibGUgYm9vbCBtX3BhZ2VHcm91cFVzZXJTaGVl
dENhY2hlVmFsaWQ7CisKKyAgICBib29sIG1faGFkQWN0aXZlTG9hZGluZ1N0eWxlc2hlZXQ7Cisg
ICAgYm9vbCBtX25lZWRzVXBkYXRlQWN0aXZlU3R5bGVzaGVldHNPblN0eWxlUmVjYWxjOworCisg
ICAgdHlwZWRlZiBMaXN0SGFzaFNldDxOb2RlKiwgMzI+IFN0eWxlU2hlZXRDYW5kaWRhdGVMaXN0
SGFzaFNldDsKKyAgICBTdHlsZVNoZWV0Q2FuZGlkYXRlTGlzdEhhc2hTZXQgbV9zdHlsZVNoZWV0
Q2FuZGlkYXRlTm9kZXM7CisKKyAgICBTdHJpbmcgbV9wcmVmZXJyZWRTdHlsZXNoZWV0U2V0TmFt
ZTsKKyAgICBTdHJpbmcgbV9zZWxlY3RlZFN0eWxlc2hlZXRTZXROYW1lOworCisgICAgYm9vbCBt
X3VzZXNTaWJsaW5nUnVsZXM7CisgICAgYm9vbCBtX3VzZXNTaWJsaW5nUnVsZXNPdmVycmlkZTsK
KyAgICBib29sIG1fdXNlc0ZpcnN0TGluZVJ1bGVzOworICAgIGJvb2wgbV91c2VzRmlyc3RMZXR0
ZXJSdWxlczsKKyAgICBib29sIG1fdXNlc0JlZm9yZUFmdGVyUnVsZXM7CisgICAgYm9vbCBtX3Vz
ZXNCZWZvcmVBZnRlclJ1bGVzT3ZlcnJpZGU7CisgICAgYm9vbCBtX3VzZXNSZW1Vbml0czsKK307
CisKK30KKworI2VuZGlmCisKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2RvbS9FbGVtZW50LmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9kb20vRWxlbWVudC5jcHAJKHJldmlzaW9uIDEy
OTM5NykKKysrIFNvdXJjZS9XZWJDb3JlL2RvbS9FbGVtZW50LmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMTE3Niw3ICsxMTc2LDcgQEAgdm9pZCBFbGVtZW50OjpyZWNhbGNTdHlsZShTdHlsZUNoYW5n
ZSBjaAogCiAgICAgICAgIC8vIElmICJyZW0iIHVuaXRzIGFyZSB1c2VkIGFueXdoZXJlIGluIHRo
ZSBkb2N1bWVudCwgYW5kIGlmIHRoZSBkb2N1bWVudCBlbGVtZW50J3MgZm9udCBzaXplIGNoYW5n
ZXMsIHRoZW4gZ28gYWhlYWQgYW5kIGZvcmNlIGZvbnQgdXBkYXRpbmcKICAgICAgICAgLy8gYWxs
IHRoZSB3YXkgZG93biB0aGUgdHJlZS4gVGhpcyBpcyBzaW1wbGVyIHRoYW4gaGF2aW5nIHRvIG1h
aW50YWluIGEgY2FjaGUgb2Ygb2JqZWN0cyAoYW5kIHN1Y2ggZm9udCBzaXplIGNoYW5nZXMgc2hv
dWxkIGJlIHJhcmUgYW55d2F5KS4KLSAgICAgICAgaWYgKGRvY3VtZW50KCktPnVzZXNSZW1Vbml0
cygpICYmIGRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpID09IHRoaXMgJiYgY2ggIT0gTm9D
aGFuZ2UgJiYgY3VycmVudFN0eWxlICYmIG5ld1N0eWxlICYmIGN1cnJlbnRTdHlsZS0+Zm9udFNp
emUoKSAhPSBuZXdTdHlsZS0+Zm9udFNpemUoKSkgeworICAgICAgICBpZiAoZG9jdW1lbnQoKS0+
c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+dXNlc1JlbVVuaXRzKCkgJiYgZG9jdW1lbnQoKS0+ZG9j
dW1lbnRFbGVtZW50KCkgPT0gdGhpcyAmJiBjaCAhPSBOb0NoYW5nZSAmJiBjdXJyZW50U3R5bGUg
JiYgbmV3U3R5bGUgJiYgY3VycmVudFN0eWxlLT5mb250U2l6ZSgpICE9IG5ld1N0eWxlLT5mb250
U2l6ZSgpKSB7CiAgICAgICAgICAgICAvLyBDYWNoZWQgUmVuZGVyU3R5bGVzIG1heSBkZXBlbmQg
b24gdGhlIHJlbSB1bml0cy4KICAgICAgICAgICAgIGRvY3VtZW50KCktPnN0eWxlUmVzb2x2ZXIo
KS0+aW52YWxpZGF0ZU1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUoKTsKICAgICAgICAgICAgIGNoYW5n
ZSA9IEZvcmNlOwpJbmRleDogU291cmNlL1dlYkNvcmUvZG9tL1Byb2Nlc3NpbmdJbnN0cnVjdGlv
bi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZG9tL1Byb2Nlc3NpbmdJbnN0cnVj
dGlvbi5jcHAJKHJldmlzaW9uIDEyOTM5NykKKysrIFNvdXJjZS9XZWJDb3JlL2RvbS9Qcm9jZXNz
aW5nSW5zdHJ1Y3Rpb24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMyw5ICsyMywxMCBAQAogCiAj
aW5jbHVkZSAiQ1NTU3R5bGVTaGVldC5oIgogI2luY2x1ZGUgIkNhY2hlZENTU1N0eWxlU2hlZXQu
aCIKKyNpbmNsdWRlICJDYWNoZWRSZXNvdXJjZUxvYWRlci5oIgogI2luY2x1ZGUgIkNhY2hlZFhT
TFN0eWxlU2hlZXQuaCIKICNpbmNsdWRlICJEb2N1bWVudC5oIgotI2luY2x1ZGUgIkNhY2hlZFJl
c291cmNlTG9hZGVyLmgiCisjaW5jbHVkZSAiRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5o
IgogI2luY2x1ZGUgIkV4Y2VwdGlvbkNvZGUuaCIKICNpbmNsdWRlICJGcmFtZS5oIgogI2luY2x1
ZGUgIkZyYW1lTG9hZGVyLmgiCkBAIC02NSw3ICs2Niw3IEBAIFByb2Nlc3NpbmdJbnN0cnVjdGlv
bjo6flByb2Nlc3NpbmdJbnN0cnUKICAgICAgICAgbV9jYWNoZWRTaGVldC0+cmVtb3ZlQ2xpZW50
KHRoaXMpOwogCiAgICAgaWYgKGluRG9jdW1lbnQoKSkKLSAgICAgICAgZG9jdW1lbnQoKS0+cmVt
b3ZlU3R5bGVTaGVldENhbmRpZGF0ZU5vZGUodGhpcyk7CisgICAgICAgIGRvY3VtZW50KCktPnN0
eWxlU2hlZXRDb2xsZWN0aW9uKCktPnJlbW92ZVN0eWxlU2hlZXRDYW5kaWRhdGVOb2RlKHRoaXMp
OwogfQogCiB2b2lkIFByb2Nlc3NpbmdJbnN0cnVjdGlvbjo6c2V0RGF0YShjb25zdCBTdHJpbmcm
IGRhdGEsIEV4Y2VwdGlvbkNvZGUmKQpAQCAtMTYwLDcgKzE2MSw3IEBAIHZvaWQgUHJvY2Vzc2lu
Z0luc3RydWN0aW9uOjpjaGVja1N0eWxlU2gKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAg
ICAgICAgICAKICAgICAgICAgICAgIG1fbG9hZGluZyA9IHRydWU7Ci0gICAgICAgICAgICBkb2N1
bWVudCgpLT5hZGRQZW5kaW5nU2hlZXQoKTsKKyAgICAgICAgICAgIGRvY3VtZW50KCktPnN0eWxl
U2hlZXRDb2xsZWN0aW9uKCktPmFkZFBlbmRpbmdTaGVldCgpOwogICAgICAgICAgICAgCiAgICAg
ICAgICAgICBSZXNvdXJjZVJlcXVlc3QgcmVxdWVzdChkb2N1bWVudCgpLT5jb21wbGV0ZVVSTCho
cmVmKSk7CiAjaWYgRU5BQkxFKFhTTFQpCkBAIC0xODAsNyArMTgxLDcgQEAgdm9pZCBQcm9jZXNz
aW5nSW5zdHJ1Y3Rpb246OmNoZWNrU3R5bGVTaAogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAg
ICAgICAgICAgLy8gVGhlIHJlcXVlc3QgbWF5IGhhdmUgYmVlbiBkZW5pZWQgaWYgKGZvciBleGFt
cGxlKSB0aGUgc3R5bGVzaGVldCBpcyBsb2NhbCBhbmQgdGhlIGRvY3VtZW50IGlzIHJlbW90ZS4K
ICAgICAgICAgICAgICAgICBtX2xvYWRpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBkb2N1
bWVudCgpLT5yZW1vdmVQZW5kaW5nU2hlZXQoKTsKKyAgICAgICAgICAgICAgICBkb2N1bWVudCgp
LT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpLT5yZW1vdmVQZW5kaW5nU2hlZXQoKTsKICAgICAgICAg
ICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTE5OCw3ICsxOTksNyBAQCBib29sIFByb2Nlc3Np
bmdJbnN0cnVjdGlvbjo6aXNMb2FkaW5nKCkgCiBib29sIFByb2Nlc3NpbmdJbnN0cnVjdGlvbjo6
c2hlZXRMb2FkZWQoKQogewogICAgIGlmICghaXNMb2FkaW5nKCkpIHsKLSAgICAgICAgZG9jdW1l
bnQoKS0+cmVtb3ZlUGVuZGluZ1NoZWV0KCk7CisgICAgICAgIGRvY3VtZW50KCktPnN0eWxlU2hl
ZXRDb2xsZWN0aW9uKCktPnJlbW92ZVBlbmRpbmdTaGVldCgpOwogICAgICAgICByZXR1cm4gdHJ1
ZTsKICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMjkzLDcgKzI5NCw3IEBAIE5vZGU6Oklu
c2VydGlvbk5vdGlmaWNhdGlvblJlcXVlc3QgUHJvY2UKICAgICBOb2RlOjppbnNlcnRlZEludG8o
aW5zZXJ0aW9uUG9pbnQpOwogICAgIGlmICghaW5zZXJ0aW9uUG9pbnQtPmluRG9jdW1lbnQoKSkK
ICAgICAgICAgcmV0dXJuIEluc2VydGlvbkRvbmU7Ci0gICAgZG9jdW1lbnQoKS0+YWRkU3R5bGVT
aGVldENhbmRpZGF0ZU5vZGUodGhpcywgbV9jcmVhdGVkQnlQYXJzZXIpOworICAgIGRvY3VtZW50
KCktPnN0eWxlU2hlZXRDb2xsZWN0aW9uKCktPmFkZFN0eWxlU2hlZXRDYW5kaWRhdGVOb2RlKHRo
aXMsIG1fY3JlYXRlZEJ5UGFyc2VyKTsKICAgICBjaGVja1N0eWxlU2hlZXQoKTsKICAgICByZXR1
cm4gSW5zZXJ0aW9uRG9uZTsKIH0KQEAgLTMwNCw3ICszMDUsNyBAQCB2b2lkIFByb2Nlc3NpbmdJ
bnN0cnVjdGlvbjo6cmVtb3ZlZEZyb20oCiAgICAgaWYgKCFpbnNlcnRpb25Qb2ludC0+aW5Eb2N1
bWVudCgpKQogICAgICAgICByZXR1cm47CiAgICAgCi0gICAgZG9jdW1lbnQoKS0+cmVtb3ZlU3R5
bGVTaGVldENhbmRpZGF0ZU5vZGUodGhpcyk7CisgICAgZG9jdW1lbnQoKS0+c3R5bGVTaGVldENv
bGxlY3Rpb24oKS0+cmVtb3ZlU3R5bGVTaGVldENhbmRpZGF0ZU5vZGUodGhpcyk7CiAKICAgICBp
ZiAobV9zaGVldCkgewogICAgICAgICBBU1NFUlQobV9zaGVldC0+b3duZXJOb2RlKCkgPT0gdGhp
cyk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9kb20vU3R5bGVFbGVtZW50LmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvV2ViQ29yZS9kb20vU3R5bGVFbGVtZW50LmNwcAkocmV2aXNpb24gMTI5Mzk3
KQorKysgU291cmNlL1dlYkNvcmUvZG9tL1N0eWxlRWxlbWVudC5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlICJBdHRyaWJ1dGUuaCIKICNpbmNsdWRlICJDb250
ZW50U2VjdXJpdHlQb2xpY3kuaCIKICNpbmNsdWRlICJEb2N1bWVudC5oIgorI2luY2x1ZGUgIkRv
Y3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uaCIKICNpbmNsdWRlICJFbGVtZW50LmgiCiAjaW5j
bHVkZSAiTWVkaWFMaXN0LmgiCiAjaW5jbHVkZSAiTWVkaWFRdWVyeUV2YWx1YXRvci5oIgpAQCAt
NjMsNyArNjQsNyBAQCB2b2lkIFN0eWxlRWxlbWVudDo6aW5zZXJ0ZWRJbnRvRG9jdW1lbnQoCiB7
CiAgICAgQVNTRVJUKGRvY3VtZW50KTsKICAgICBBU1NFUlQoZWxlbWVudCk7Ci0gICAgZG9jdW1l
bnQtPmFkZFN0eWxlU2hlZXRDYW5kaWRhdGVOb2RlKGVsZW1lbnQsIG1fY3JlYXRlZEJ5UGFyc2Vy
KTsKKyAgICBkb2N1bWVudC0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+YWRkU3R5bGVTaGVldENh
bmRpZGF0ZU5vZGUoZWxlbWVudCwgbV9jcmVhdGVkQnlQYXJzZXIpOwogICAgIGlmIChtX2NyZWF0
ZWRCeVBhcnNlcikKICAgICAgICAgcmV0dXJuOwogCkBAIC03NCw3ICs3NSw3IEBAIHZvaWQgU3R5
bGVFbGVtZW50OjpyZW1vdmVkRnJvbURvY3VtZW50KEQKIHsKICAgICBBU1NFUlQoZG9jdW1lbnQp
OwogICAgIEFTU0VSVChlbGVtZW50KTsKLSAgICBkb2N1bWVudC0+cmVtb3ZlU3R5bGVTaGVldENh
bmRpZGF0ZU5vZGUoZWxlbWVudCk7CisgICAgZG9jdW1lbnQtPnN0eWxlU2hlZXRDb2xsZWN0aW9u
KCktPnJlbW92ZVN0eWxlU2hlZXRDYW5kaWRhdGVOb2RlKGVsZW1lbnQpOwogCiAgICAgaWYgKG1f
c2hlZXQpCiAgICAgICAgIGNsZWFyU2hlZXQoKTsKQEAgLTkwLDcgKzkxLDcgQEAgdm9pZCBTdHls
ZUVsZW1lbnQ6OmNsZWFyRG9jdW1lbnREYXRhKERvYwogICAgICAgICBtX3NoZWV0LT5jbGVhck93
bmVyTm9kZSgpOwogCiAgICAgaWYgKGVsZW1lbnQtPmluRG9jdW1lbnQoKSkKLSAgICAgICAgZG9j
dW1lbnQtPnJlbW92ZVN0eWxlU2hlZXRDYW5kaWRhdGVOb2RlKGVsZW1lbnQpOworICAgICAgICBk
b2N1bWVudC0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+cmVtb3ZlU3R5bGVTaGVldENhbmRpZGF0
ZU5vZGUoZWxlbWVudCk7CiB9CiAKIHZvaWQgU3R5bGVFbGVtZW50OjpjaGlsZHJlbkNoYW5nZWQo
RWxlbWVudCogZWxlbWVudCkKQEAgLTE1Miw3ICsxNTMsNyBAQCB2b2lkIFN0eWxlRWxlbWVudDo6
Y3JlYXRlU2hlZXQoRWxlbWVudCogCiAgICAgRG9jdW1lbnQqIGRvY3VtZW50ID0gZS0+ZG9jdW1l
bnQoKTsKICAgICBpZiAobV9zaGVldCkgewogICAgICAgICBpZiAobV9zaGVldC0+aXNMb2FkaW5n
KCkpCi0gICAgICAgICAgICBkb2N1bWVudC0+cmVtb3ZlUGVuZGluZ1NoZWV0KCk7CisgICAgICAg
ICAgICBkb2N1bWVudC0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+cmVtb3ZlUGVuZGluZ1NoZWV0
KCk7CiAgICAgICAgIGNsZWFyU2hlZXQoKTsKICAgICB9CiAKQEAgLTE2OCw3ICsxNjksNyBAQCB2
b2lkIFN0eWxlRWxlbWVudDo6Y3JlYXRlU2hlZXQoRWxlbWVudCogCiAgICAgICAgIE1lZGlhUXVl
cnlFdmFsdWF0b3Igc2NyZWVuRXZhbCgic2NyZWVuIiwgdHJ1ZSk7CiAgICAgICAgIE1lZGlhUXVl
cnlFdmFsdWF0b3IgcHJpbnRFdmFsKCJwcmludCIsIHRydWUpOwogICAgICAgICBpZiAoc2NyZWVu
RXZhbC5ldmFsKG1lZGlhUXVlcmllcy5nZXQoKSkgfHwgcHJpbnRFdmFsLmV2YWwobWVkaWFRdWVy
aWVzLmdldCgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQtPmFkZFBlbmRpbmdTaGVldCgpOwor
ICAgICAgICAgICAgZG9jdW1lbnQtPnN0eWxlU2hlZXRDb2xsZWN0aW9uKCktPmFkZFBlbmRpbmdT
aGVldCgpOwogICAgICAgICAgICAgbV9sb2FkaW5nID0gdHJ1ZTsKIAogICAgICAgICAgICAgbV9z
aGVldCA9IENTU1N0eWxlU2hlZXQ6OmNyZWF0ZUlubGluZShlLCBLVVJMKCksIGRvY3VtZW50LT5p
bnB1dEVuY29kaW5nKCkpOwpAQCAtMTk3LDE0ICsxOTgsMTQgQEAgYm9vbCBTdHlsZUVsZW1lbnQ6
OnNoZWV0TG9hZGVkKERvY3VtZW50KgogICAgIGlmIChpc0xvYWRpbmcoKSkKICAgICAgICAgcmV0
dXJuIGZhbHNlOwogCi0gICAgZG9jdW1lbnQtPnJlbW92ZVBlbmRpbmdTaGVldCgpOworICAgIGRv
Y3VtZW50LT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpLT5yZW1vdmVQZW5kaW5nU2hlZXQoKTsKICAg
ICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBTdHlsZUVsZW1lbnQ6OnN0YXJ0TG9hZGluZ0R5bmFt
aWNTaGVldChEb2N1bWVudCogZG9jdW1lbnQpCiB7CiAgICAgQVNTRVJUKGRvY3VtZW50KTsKLSAg
ICBkb2N1bWVudC0+YWRkUGVuZGluZ1NoZWV0KCk7CisgICAgZG9jdW1lbnQtPnN0eWxlU2hlZXRD
b2xsZWN0aW9uKCktPmFkZFBlbmRpbmdTaGVldCgpOwogfQogCiB9CkluZGV4OiBTb3VyY2UvV2Vi
Q29yZS9odG1sL0hUTUxMaW5rRWxlbWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNv
cmUvaHRtbC9IVE1MTGlua0VsZW1lbnQuY3BwCShyZXZpc2lvbiAxMjkzOTcpCisrKyBTb3VyY2Uv
V2ViQ29yZS9odG1sL0hUTUxMaW5rRWxlbWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMwLDYg
KzMwLDcgQEAKICNpbmNsdWRlICJDYWNoZWRSZXNvdXJjZS5oIgogI2luY2x1ZGUgIkNhY2hlZFJl
c291cmNlTG9hZGVyLmgiCiAjaW5jbHVkZSAiRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJEb2N1bWVu
dFN0eWxlU2hlZXRDb2xsZWN0aW9uLmgiCiAjaW5jbHVkZSAiRXZlbnRTZW5kZXIuaCIKICNpbmNs
dWRlICJGcmFtZS5oIgogI2luY2x1ZGUgIkZyYW1lTG9hZGVyLmgiCkBAIC04Nyw3ICs4OCw3IEBA
IEhUTUxMaW5rRWxlbWVudDo6fkhUTUxMaW5rRWxlbWVudCgpCiAgICAgICAgIG1fY2FjaGVkU2hl
ZXQtPnJlbW92ZUNsaWVudCh0aGlzKTsKIAogICAgIGlmIChpbkRvY3VtZW50KCkpCi0gICAgICAg
IGRvY3VtZW50KCktPnJlbW92ZVN0eWxlU2hlZXRDYW5kaWRhdGVOb2RlKHRoaXMpOworICAgICAg
ICBkb2N1bWVudCgpLT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpLT5yZW1vdmVTdHlsZVNoZWV0Q2Fu
ZGlkYXRlTm9kZSh0aGlzKTsKIAogICAgIGxpbmtMb2FkRXZlbnRTZW5kZXIoKS5jYW5jZWxFdmVu
dCh0aGlzKTsKIH0KQEAgLTI1NCw3ICsyNTUsNyBAQCBOb2RlOjpJbnNlcnRpb25Ob3RpZmljYXRp
b25SZXF1ZXN0IEhUTUxMCiAgICAgaWYgKG1faXNJblNoYWRvd1RyZWUpCiAgICAgICAgIHJldHVy
biBJbnNlcnRpb25Eb25lOwogCi0gICAgZG9jdW1lbnQoKS0+YWRkU3R5bGVTaGVldENhbmRpZGF0
ZU5vZGUodGhpcywgbV9jcmVhdGVkQnlQYXJzZXIpOworICAgIGRvY3VtZW50KCktPnN0eWxlU2hl
ZXRDb2xsZWN0aW9uKCktPmFkZFN0eWxlU2hlZXRDYW5kaWRhdGVOb2RlKHRoaXMsIG1fY3JlYXRl
ZEJ5UGFyc2VyKTsKIAogICAgIHByb2Nlc3MoKTsKICAgICByZXR1cm4gSW5zZXJ0aW9uRG9uZTsK
QEAgLTI3Miw3ICsyNzMsNyBAQCB2b2lkIEhUTUxMaW5rRWxlbWVudDo6cmVtb3ZlZEZyb20oQ29u
dGFpCiAgICAgICAgIEFTU0VSVCghbV9zaGVldCk7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0g
ICAgZG9jdW1lbnQoKS0+cmVtb3ZlU3R5bGVTaGVldENhbmRpZGF0ZU5vZGUodGhpcyk7CisgICAg
ZG9jdW1lbnQoKS0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+cmVtb3ZlU3R5bGVTaGVldENhbmRp
ZGF0ZU5vZGUodGhpcyk7CiAKICAgICBpZiAobV9zaGVldCkKICAgICAgICAgY2xlYXJTaGVldCgp
OwpAQCAtNDU1LDcgKzQ1Niw3IEBAIHZvaWQgSFRNTExpbmtFbGVtZW50OjphZGRQZW5kaW5nU2hl
ZXQoUGUKIAogICAgIGlmIChtX3BlbmRpbmdTaGVldFR5cGUgPT0gTm9uQmxvY2tpbmcpCiAgICAg
ICAgIHJldHVybjsKLSAgICBkb2N1bWVudCgpLT5hZGRQZW5kaW5nU2hlZXQoKTsKKyAgICBkb2N1
bWVudCgpLT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpLT5hZGRQZW5kaW5nU2hlZXQoKTsKIH0KIAog
dm9pZCBIVE1MTGlua0VsZW1lbnQ6OnJlbW92ZVBlbmRpbmdTaGVldChSZW1vdmVQZW5kaW5nU2hl
ZXROb3RpZmljYXRpb25UeXBlIG5vdGlmaWNhdGlvbikKQEAgLTQ3MSwxMCArNDcyLDEwIEBAIHZv
aWQgSFRNTExpbmtFbGVtZW50OjpyZW1vdmVQZW5kaW5nU2hlZXQKICAgICAgICAgcmV0dXJuOwog
ICAgIH0KIAotICAgIGRvY3VtZW50KCktPnJlbW92ZVBlbmRpbmdTaGVldCgKKyAgICBkb2N1bWVu
dCgpLT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpLT5yZW1vdmVQZW5kaW5nU2hlZXQoCiAgICAgICAg
IG5vdGlmaWNhdGlvbiA9PSBSZW1vdmVQZW5kaW5nU2hlZXROb3RpZnlJbW1lZGlhdGVseQotICAg
ICAgICA/IERvY3VtZW50OjpSZW1vdmVQZW5kaW5nU2hlZXROb3RpZnlJbW1lZGlhdGVseQotICAg
ICAgICA6IERvY3VtZW50OjpSZW1vdmVQZW5kaW5nU2hlZXROb3RpZnlMYXRlcik7CisgICAgICAg
ID8gRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6UmVtb3ZlUGVuZGluZ1NoZWV0Tm90aWZ5
SW1tZWRpYXRlbHkKKyAgICAgICAgOiBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjpSZW1v
dmVQZW5kaW5nU2hlZXROb3RpZnlMYXRlcik7CiB9CiAKIERPTVNldHRhYmxlVG9rZW5MaXN0KiBI
VE1MTGlua0VsZW1lbnQ6OnNpemVzKCkgY29uc3QKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2h0bWwv
SFRNTFF1b3RlRWxlbWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvaHRtbC9I
VE1MUXVvdGVFbGVtZW50LmNwcAkocmV2aXNpb24gMTI5Mzk3KQorKysgU291cmNlL1dlYkNvcmUv
aHRtbC9IVE1MUXVvdGVFbGVtZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjQsNiArMjQsNyBA
QAogI2luY2x1ZGUgIkhUTUxRdW90ZUVsZW1lbnQuaCIKIAogI2luY2x1ZGUgIkRvY3VtZW50Lmgi
CisjaW5jbHVkZSAiRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5oIgogI2luY2x1ZGUgIkhU
TUxOYW1lcy5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CkBAIC00NCw3ICs0NSw3IEBAIFBhc3NS
ZWZQdHI8SFRNTFF1b3RlRWxlbWVudD4gSFRNTFF1b3RlRWwKIE5vZGU6Okluc2VydGlvbk5vdGlm
aWNhdGlvblJlcXVlc3QgSFRNTFF1b3RlRWxlbWVudDo6aW5zZXJ0ZWRJbnRvKENvbnRhaW5lck5v
ZGUqIGluc2VydGlvblBvaW50KQogewogICAgIGlmIChoYXNUYWdOYW1lKHFUYWcpKQotICAgICAg
ICBkb2N1bWVudCgpLT5zZXRVc2VzQmVmb3JlQWZ0ZXJSdWxlcyh0cnVlKTsKKyAgICAgICAgZG9j
dW1lbnQoKS0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+c2V0VXNlc0JlZm9yZUFmdGVyUnVsZXNP
dmVycmlkZSh0cnVlKTsKIAogICAgIHJldHVybiBIVE1MRWxlbWVudDo6aW5zZXJ0ZWRJbnRvKGlu
c2VydGlvblBvaW50KTsKIH0KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2h0bWwvSFRNTFZpZXdTb3Vy
Y2VEb2N1bWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MVmll
d1NvdXJjZURvY3VtZW50LmNwcAkocmV2aXNpb24gMTI5Mzk3KQorKysgU291cmNlL1dlYkNvcmUv
aHRtbC9IVE1MVmlld1NvdXJjZURvY3VtZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjcsNiAr
MjcsNyBAQAogCiAjaW5jbHVkZSAiQXR0cmlidXRlLmgiCiAjaW5jbHVkZSAiRE9NSW1wbGVtZW50
YXRpb24uaCIKKyNpbmNsdWRlICJEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmgiCiAjaW5j
bHVkZSAiSFRNTEFuY2hvckVsZW1lbnQuaCIKICNpbmNsdWRlICJIVE1MQlJFbGVtZW50LmgiCiAj
aW5jbHVkZSAiSFRNTEJhc2VFbGVtZW50LmgiCkBAIC01Miw3ICs1Myw3IEBAIEhUTUxWaWV3U291
cmNlRG9jdW1lbnQ6OkhUTUxWaWV3U291cmNlRG8KICAgICA6IEhUTUxEb2N1bWVudChmcmFtZSwg
dXJsKQogICAgICwgbV90eXBlKG1pbWVUeXBlKQogewotICAgIHNldFVzZXNCZWZvcmVBZnRlclJ1
bGVzKHRydWUpOworICAgIHN0eWxlU2hlZXRDb2xsZWN0aW9uKCktPnNldFVzZXNCZWZvcmVBZnRl
clJ1bGVzT3ZlcnJpZGUodHJ1ZSk7CiAgICAgc2V0SXNWaWV3U291cmNlKHRydWUpOwogCiAgICAg
c2V0Q29tcGF0aWJpbGl0eU1vZGUoUXVpcmtzTW9kZSk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9t
YXRobWwvTWF0aE1MTWF0aEVsZW1lbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3Jl
L21hdGhtbC9NYXRoTUxNYXRoRWxlbWVudC5jcHAJKHJldmlzaW9uIDEyOTM5NykKKysrIFNvdXJj
ZS9XZWJDb3JlL21hdGhtbC9NYXRoTUxNYXRoRWxlbWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTQ3LDcgKzQ3LDcgQEAgTm9kZTo6SW5zZXJ0aW9uTm90aWZpY2F0aW9uUmVxdWVzdCBNYXRoTQog
ewogICAgIC8vIFRoZXJlIGFyZSBzaWJsaW5nIHJ1bGVzIGluIHRoZSBNYXRoTUwgZGVmYXVsdCBz
dHlsZS4KICAgICBpZiAoaW5zZXJ0aW9uUG9pbnQtPmluRG9jdW1lbnQoKSkKLSAgICAgICAgZG9j
dW1lbnQoKS0+c2V0VXNlc1NpYmxpbmdSdWxlcyh0cnVlKTsKKyAgICAgICAgZG9jdW1lbnQoKS0+
c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+c2V0VXNlc1NpYmxpbmdSdWxlc092ZXJyaWRlKHRydWUp
OwogICAgIHJldHVybiBNYXRoTUxJbmxpbmVDb250YWluZXJFbGVtZW50OjppbnNlcnRlZEludG8o
aW5zZXJ0aW9uUG9pbnQpOwogfQogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wYWdlL1BhZ2UuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BhZ2UvUGFnZS5jcHAJKHJldmlzaW9uIDEy
OTM5NykKKysrIFNvdXJjZS9XZWJDb3JlL3BhZ2UvUGFnZS5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlICJDb250ZXh0TWVudUNvbnRyb2xsZXIuaCIKICNpbmNs
dWRlICJET01XaW5kb3cuaCIKICNpbmNsdWRlICJEb2N1bWVudE1hcmtlckNvbnRyb2xsZXIuaCIK
KyNpbmNsdWRlICJEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmgiCiAjaW5jbHVkZSAiRHJh
Z0NvbnRyb2xsZXIuaCIKICNpbmNsdWRlICJFZGl0b3JDbGllbnQuaCIKICNpbmNsdWRlICJFdmVu
dC5oIgpAQCAtODM4LDcgKzgzOSw3IEBAIHZvaWQgUGFnZTo6dXNlclN0eWxlU2hlZXRMb2NhdGlv
bkNoYW5nZWQKIAogICAgIGZvciAoRnJhbWUqIGZyYW1lID0gbWFpbkZyYW1lKCk7IGZyYW1lOyBm
cmFtZSA9IGZyYW1lLT50cmVlKCktPnRyYXZlcnNlTmV4dCgpKSB7CiAgICAgICAgIGlmIChmcmFt
ZS0+ZG9jdW1lbnQoKSkKLSAgICAgICAgICAgIGZyYW1lLT5kb2N1bWVudCgpLT51cGRhdGVQYWdl
VXNlclNoZWV0KCk7CisgICAgICAgICAgICBmcmFtZS0+ZG9jdW1lbnQoKS0+c3R5bGVTaGVldENv
bGxlY3Rpb24oKS0+dXBkYXRlUGFnZVVzZXJTaGVldCgpOwogICAgIH0KIH0KIApJbmRleDogU291
cmNlL1dlYkNvcmUvcGFnZS9QYWdlR3JvdXAuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJD
b3JlL3BhZ2UvUGFnZUdyb3VwLmNwcAkocmV2aXNpb24gMTI5Mzk3KQorKysgU291cmNlL1dlYkNv
cmUvcGFnZS9QYWdlR3JvdXAuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yOSw2ICsyOSw3IEBACiAj
aW5jbHVkZSAiQ2hyb21lLmgiCiAjaW5jbHVkZSAiQ2hyb21lQ2xpZW50LmgiCiAjaW5jbHVkZSAi
RG9jdW1lbnQuaCIKKyNpbmNsdWRlICJEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmgiCiAj
aW5jbHVkZSAiRnJhbWUuaCIKICNpbmNsdWRlICJHcm91cFNldHRpbmdzLmgiCiAjaW5jbHVkZSAi
UGFnZS5oIgpAQCAtMzkxLDcgKzM5Miw3IEBAIHZvaWQgUGFnZUdyb3VwOjpyZXNldFVzZXJTdHls
ZUNhY2hlSW5BbGwKICAgICBIYXNoU2V0PFBhZ2UqPjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV9w
YWdlcy5lbmQoKTsKICAgICBmb3IgKEhhc2hTZXQ8UGFnZSo+Ojpjb25zdF9pdGVyYXRvciBpdCA9
IG1fcGFnZXMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CiAgICAgICAgIGZvciAoRnJhbWUq
IGZyYW1lID0gKCppdCktPm1haW5GcmFtZSgpOyBmcmFtZTsgZnJhbWUgPSBmcmFtZS0+dHJlZSgp
LT50cmF2ZXJzZU5leHQoKSkKLSAgICAgICAgICAgIGZyYW1lLT5kb2N1bWVudCgpLT51cGRhdGVQ
YWdlR3JvdXBVc2VyU2hlZXRzKCk7CisgICAgICAgICAgICBmcmFtZS0+ZG9jdW1lbnQoKS0+c3R5
bGVTaGVldENvbGxlY3Rpb24oKS0+dXBkYXRlUGFnZUdyb3VwVXNlclNoZWV0cygpOwogICAgIH0K
IH0KIApJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJSLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQlIuY3BwCShyZXZpc2lvbiAx
MjkzOTcpCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQlIuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC00MCw3ICs0MCw3IEBAIFJlbmRlckJSOjp+UmVuZGVyQlIoKQogCiBpbnQgUmVu
ZGVyQlI6OmxpbmVIZWlnaHQoYm9vbCBmaXJzdExpbmUpIGNvbnN0CiB7Ci0gICAgaWYgKGZpcnN0
TGluZSAmJiBkb2N1bWVudCgpLT51c2VzRmlyc3RMaW5lUnVsZXMoKSkgeworICAgIGlmIChmaXJz
dExpbmUgJiYgZG9jdW1lbnQoKS0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+dXNlc0ZpcnN0TGlu
ZVJ1bGVzKCkpIHsKICAgICAgICAgUmVuZGVyU3R5bGUqIHMgPSBzdHlsZShmaXJzdExpbmUpOwog
ICAgICAgICBpZiAocyAhPSBzdHlsZSgpKQogICAgICAgICAgICAgcmV0dXJuIHMtPmNvbXB1dGVk
TGluZUhlaWdodCh2aWV3KCkpOwpJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRl
ckJsb2NrLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVy
QmxvY2suY3BwCShyZXZpc2lvbiAxMjkzOTcpCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcv
UmVuZGVyQmxvY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNDcsNyArMzQ3LDcgQEAgdm9pZCBS
ZW5kZXJCbG9jazo6c3R5bGVEaWRDaGFuZ2UoU3R5bGVEaQogICAgIG1fbGluZUhlaWdodCA9IC0x
OwogCiAgICAgLy8gVXBkYXRlIHBzZXVkb3MgZm9yIDpiZWZvcmUgYW5kIDphZnRlciBub3cuCi0g
ICAgaWYgKCFpc0Fub255bW91cygpICYmIGRvY3VtZW50KCktPnVzZXNCZWZvcmVBZnRlclJ1bGVz
KCkgJiYgY2FuSGF2ZUdlbmVyYXRlZENoaWxkcmVuKCkpIHsKKyAgICBpZiAoIWlzQW5vbnltb3Vz
KCkgJiYgZG9jdW1lbnQoKS0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+dXNlc0JlZm9yZUFmdGVy
UnVsZXMoKSAmJiBjYW5IYXZlR2VuZXJhdGVkQ2hpbGRyZW4oKSkgewogICAgICAgICB1cGRhdGVC
ZWZvcmVBZnRlckNvbnRlbnQoQkVGT1JFKTsKICAgICAgICAgdXBkYXRlQmVmb3JlQWZ0ZXJDb250
ZW50KEFGVEVSKTsKICAgICB9CkBAIC02MDIsNyArNjAyLDcgQEAgdm9pZCBSZW5kZXJCbG9jazo6
c3BsaXRCbG9ja3MoUmVuZGVyQmxvYwogICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBjdXJyID0g
dG9SZW5kZXJCb3hNb2RlbE9iamVjdChwYXJlbnQoKSk7CiAgICAgUmVuZGVyQm94TW9kZWxPYmpl
Y3QqIGN1cnJDaGlsZCA9IHRoaXM7CiAgICAgUmVuZGVyT2JqZWN0KiBjdXJyQ2hpbGROZXh0U2li
bGluZyA9IGN1cnJDaGlsZC0+bmV4dFNpYmxpbmcoKTsKLSAgICBib29sIGRvY3VtZW50VXNlc0Jl
Zm9yZUFmdGVyUnVsZXMgPSBkb2N1bWVudCgpLT51c2VzQmVmb3JlQWZ0ZXJSdWxlcygpOyAKKyAg
ICBib29sIGRvY3VtZW50VXNlc0JlZm9yZUFmdGVyUnVsZXMgPSBkb2N1bWVudCgpLT5zdHlsZVNo
ZWV0Q29sbGVjdGlvbigpLT51c2VzQmVmb3JlQWZ0ZXJSdWxlcygpOwogCiAgICAgLy8gTm90ZTog
fHRoaXN8IGNhbiBiZSBkZXN0cm95ZWQgaW5zaWRlIHRoaXMgbG9vcCBpZiBpdCBpcyBhbiBlbXB0
eSBhbm9ueW1vdXMKICAgICAvLyBibG9jayBhbmQgd2UgdHJ5IHRvIGNhbGwgdXBkYXRlQmVmb3Jl
QWZ0ZXJDb250ZW50IGluc2lkZSB3aGljaCByZW1vdmVzIHRoZQpAQCAtODc3LDcgKzg3Nyw3IEBA
IHZvaWQgUmVuZGVyQmxvY2s6OmFkZENoaWxkSWdub3JpbmdBbm9ueW0KICAgICAgICAgICAgIC8v
IGNvbnRlbnQgZ2V0cyBwcm9wZXJseSBkZXN0cm95ZWQuCiAgICAgICAgICAgICBib29sIGlzRmly
c3RDaGlsZCA9IChiZWZvcmVDaGlsZCA9PSBmaXJzdENoaWxkKCkpOwogICAgICAgICAgICAgYm9v
bCBpc0xhc3RDaGlsZCA9IChiZWZvcmVDaGlsZCA9PSBsYXN0Q2hpbGQoKSk7Ci0gICAgICAgICAg
ICBpZiAoZG9jdW1lbnQoKS0+dXNlc0JlZm9yZUFmdGVyUnVsZXMoKSkKKyAgICAgICAgICAgIGlm
IChkb2N1bWVudCgpLT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpLT51c2VzQmVmb3JlQWZ0ZXJSdWxl
cygpKQogICAgICAgICAgICAgICAgIGNoaWxkcmVuKCktPnVwZGF0ZUJlZm9yZUFmdGVyQ29udGVu
dCh0aGlzLCBBRlRFUik7CiAgICAgICAgICAgICBpZiAoaXNMYXN0Q2hpbGQgJiYgYmVmb3JlQ2hp
bGQgIT0gbGFzdENoaWxkKCkpIHsKICAgICAgICAgICAgICAgICAvLyBXZSBkZXN0cm95ZWQgdGhl
IGxhc3QgY2hpbGQsIHNvIG5vdyB3ZSBuZWVkIHRvIHVwZGF0ZSBvdXIgaW5zZXJ0aW9uCkBAIC02
MTUzLDcgKzYxNTMsNyBAQCBMYXlvdXRVbml0IFJlbmRlckJsb2NrOjpsaW5lSGVpZ2h0KGJvb2wg
CiAgICAgaWYgKGlzUmVwbGFjZWQoKSAmJiBsaW5lUG9zaXRpb25Nb2RlID09IFBvc2l0aW9uT25D
b250YWluaW5nTGluZSkKICAgICAgICAgcmV0dXJuIFJlbmRlckJveDo6bGluZUhlaWdodChmaXJz
dExpbmUsIGRpcmVjdGlvbiwgbGluZVBvc2l0aW9uTW9kZSk7CiAKLSAgICBpZiAoZmlyc3RMaW5l
ICYmIGRvY3VtZW50KCktPnVzZXNGaXJzdExpbmVSdWxlcygpKSB7CisgICAgaWYgKGZpcnN0TGlu
ZSAmJiBkb2N1bWVudCgpLT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpLT51c2VzRmlyc3RMaW5lUnVs
ZXMoKSkgewogICAgICAgICBSZW5kZXJTdHlsZSogcyA9IHN0eWxlKGZpcnN0TGluZSk7CiAgICAg
ICAgIGlmIChzICE9IHN0eWxlKCkpCiAgICAgICAgICAgICByZXR1cm4gcy0+Y29tcHV0ZWRMaW5l
SGVpZ2h0KHZpZXcoKSk7CkBAIC02NDYxLDcgKzY0NjEsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjpj
cmVhdGVGaXJzdExldHRlclJlbmRlCiAKIHZvaWQgUmVuZGVyQmxvY2s6OnVwZGF0ZUZpcnN0TGV0
dGVyKCkKIHsKLSAgICBpZiAoIWRvY3VtZW50KCktPnVzZXNGaXJzdExldHRlclJ1bGVzKCkpCisg
ICAgaWYgKCFkb2N1bWVudCgpLT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpLT51c2VzRmlyc3RMZXR0
ZXJSdWxlcygpKQogICAgICAgICByZXR1cm47CiAgICAgLy8gRG9uJ3QgcmVjdXIKICAgICBpZiAo
c3R5bGUoKS0+c3R5bGVUeXBlKCkgPT0gRklSU1RfTEVUVEVSKQpJbmRleDogU291cmNlL1dlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlcklubGluZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlcklubGluZS5jcHAJKHJldmlzaW9uIDEyOTM5NykKKysrIFNvdXJj
ZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJJbmxpbmUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0x
OTQsNyArMTk0LDcgQEAgdm9pZCBSZW5kZXJJbmxpbmU6OnN0eWxlRGlkQ2hhbmdlKFN0eWxlRAog
ICAgIH0KIAogICAgIC8vIFVwZGF0ZSBwc2V1ZG9zIGZvciA6YmVmb3JlIGFuZCA6YWZ0ZXIgbm93
LgotICAgIGlmICghaXNBbm9ueW1vdXMoKSAmJiBkb2N1bWVudCgpLT51c2VzQmVmb3JlQWZ0ZXJS
dWxlcygpKSB7CisgICAgaWYgKCFpc0Fub255bW91cygpICYmIGRvY3VtZW50KCktPnN0eWxlU2hl
ZXRDb2xsZWN0aW9uKCktPnVzZXNCZWZvcmVBZnRlclJ1bGVzKCkpIHsKICAgICAgICAgY2hpbGRy
ZW4oKS0+dXBkYXRlQmVmb3JlQWZ0ZXJDb250ZW50KHRoaXMsIEJFRk9SRSk7CiAgICAgICAgIGNo
aWxkcmVuKCktPnVwZGF0ZUJlZm9yZUFmdGVyQ29udGVudCh0aGlzLCBBRlRFUik7CiAgICAgfQpA
QCAtMjE4LDcgKzIxOCw3IEBAIHZvaWQgUmVuZGVySW5saW5lOjp1cGRhdGVBbHdheXNDcmVhdGVM
aW4KICAgICAgICAgfHwgcGFyZW50U3R5bGUtPmxpbmVIZWlnaHQoKSAhPSBzdHlsZSgpLT5saW5l
SGVpZ2h0KCkpKQogICAgICAgICB8fCAoaW5SZW5kZXJGbG93VGhyZWFkKCkgJiYgZW5jbG9zaW5n
UmVuZGVyRmxvd1RocmVhZCgpLT5oYXNSZWdpb25zV2l0aFN0eWxpbmcoKSk7CiAKLSAgICBpZiAo
IWFsd2F5c0NyZWF0ZUxpbmVCb3hlcyAmJiBjaGVja0ZvbnRzICYmIGRvY3VtZW50KCktPnVzZXNG
aXJzdExpbmVSdWxlcygpKSB7CisgICAgaWYgKCFhbHdheXNDcmVhdGVMaW5lQm94ZXMgJiYgY2hl
Y2tGb250cyAmJiBkb2N1bWVudCgpLT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpLT51c2VzRmlyc3RM
aW5lUnVsZXMoKSkgewogICAgICAgICAvLyBIYXZlIHRvIGNoZWNrIHRoZSBmaXJzdCBsaW5lIHN0
eWxlIGFzIHdlbGwuCiAgICAgICAgIHBhcmVudFN0eWxlID0gcGFyZW50KCktPnN0eWxlKHRydWUp
OwogICAgICAgICBSZW5kZXJTdHlsZSogY2hpbGRTdHlsZSA9IHN0eWxlKHRydWUpOwpAQCAtMzI0
LDcgKzMyNCw3IEBAIHZvaWQgUmVuZGVySW5saW5lOjphZGRDaGlsZElnbm9yaW5nQ29udGkKICAg
ICAgICAgLy8gaGFzIHRvIG1vdmUgaW50byB0aGUgaW5saW5lIGNvbnRpbnVhdGlvbi4gIENhbGwg
dXBkYXRlQmVmb3JlQWZ0ZXJDb250ZW50IHRvIGVuc3VyZSB0aGF0IG91ciA6YWZ0ZXIKICAgICAg
ICAgLy8gY29udGVudCBnZXRzIHByb3Blcmx5IGRlc3Ryb3llZC4KICAgICAgICAgYm9vbCBpc0xh
c3RDaGlsZCA9IChiZWZvcmVDaGlsZCA9PSBsYXN0Q2hpbGQoKSk7Ci0gICAgICAgIGlmIChkb2N1
bWVudCgpLT51c2VzQmVmb3JlQWZ0ZXJSdWxlcygpKQorICAgICAgICBpZiAoZG9jdW1lbnQoKS0+
c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+dXNlc0JlZm9yZUFmdGVyUnVsZXMoKSkKICAgICAgICAg
ICAgIGNoaWxkcmVuKCktPnVwZGF0ZUJlZm9yZUFmdGVyQ29udGVudCh0aGlzLCBBRlRFUik7CiAg
ICAgICAgIGlmIChpc0xhc3RDaGlsZCAmJiBiZWZvcmVDaGlsZCAhPSBsYXN0Q2hpbGQoKSkKICAg
ICAgICAgICAgIGJlZm9yZUNoaWxkID0gMDsgLy8gV2UgZGVzdHJveWVkIHRoZSBsYXN0IGNoaWxk
LCBzbyBub3cgd2UgbmVlZCB0byB1cGRhdGUgb3VyIGluc2VydGlvbgpAQCAtMzk5LDcgKzM5OSw3
IEBAIHZvaWQgUmVuZGVySW5saW5lOjpzcGxpdElubGluZXMoUmVuZGVyQmwKICAgICAgICAgICAg
IC8vIFNvbWVvbmUgbWF5IGhhdmUgaW5kaXJlY3RseSBjYXVzZWQgYSA8cT4gdG8gc3BsaXQuICBX
aGVuIHRoaXMgaGFwcGVucywgdGhlIDphZnRlciBjb250ZW50CiAgICAgICAgICAgICAvLyBoYXMg
dG8gbW92ZSBpbnRvIHRoZSBpbmxpbmUgY29udGludWF0aW9uLiAgQ2FsbCB1cGRhdGVCZWZvcmVB
ZnRlckNvbnRlbnQgdG8gZW5zdXJlIHRoYXQgdGhlIGlubGluZSdzIDphZnRlcgogICAgICAgICAg
ICAgLy8gY29udGVudCBnZXRzIHByb3Blcmx5IGRlc3Ryb3llZC4KLSAgICAgICAgICAgIGlmIChk
b2N1bWVudCgpLT51c2VzQmVmb3JlQWZ0ZXJSdWxlcygpKQorICAgICAgICAgICAgaWYgKGRvY3Vt
ZW50KCktPnN0eWxlU2hlZXRDb2xsZWN0aW9uKCktPnVzZXNCZWZvcmVBZnRlclJ1bGVzKCkpCiAg
ICAgICAgICAgICAgICAgaW5saW5lQ3Vyci0+Y2hpbGRyZW4oKS0+dXBkYXRlQmVmb3JlQWZ0ZXJD
b250ZW50KGlubGluZUN1cnIsIEFGVEVSKTsKIAogICAgICAgICAgICAgLy8gTm93IHdlIG5lZWQg
dG8gdGFrZSBhbGwgb2YgdGhlIGNoaWxkcmVuIHN0YXJ0aW5nIGZyb20gdGhlIGZpcnN0IGNoaWxk
CkBAIC0xMjgzLDcgKzEyODMsNyBAQCBJbmxpbmVGbG93Qm94KiBSZW5kZXJJbmxpbmU6OmNyZWF0
ZUFuZEFwCiAKIExheW91dFVuaXQgUmVuZGVySW5saW5lOjpsaW5lSGVpZ2h0KGJvb2wgZmlyc3RM
aW5lLCBMaW5lRGlyZWN0aW9uTW9kZSAvKmRpcmVjdGlvbiovLCBMaW5lUG9zaXRpb25Nb2RlIC8q
bGluZVBvc2l0aW9uTW9kZSovKSBjb25zdAogewotICAgIGlmIChmaXJzdExpbmUgJiYgZG9jdW1l
bnQoKS0+dXNlc0ZpcnN0TGluZVJ1bGVzKCkpIHsKKyAgICBpZiAoZmlyc3RMaW5lICYmIGRvY3Vt
ZW50KCktPnN0eWxlU2hlZXRDb2xsZWN0aW9uKCktPnVzZXNGaXJzdExpbmVSdWxlcygpKSB7CiAg
ICAgICAgIFJlbmRlclN0eWxlKiBzID0gc3R5bGUoZmlyc3RMaW5lKTsKICAgICAgICAgaWYgKHMg
IT0gc3R5bGUoKSkKICAgICAgICAgICAgIHJldHVybiBzLT5jb21wdXRlZExpbmVIZWlnaHQodmll
dygpKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3QuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3QuY3BwCShy
ZXZpc2lvbiAxMjkzOTcpCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjU5Nyw3ICsyNTk3LDcgQEAgdm9pZCBSZW5kZXJPYmpl
Y3Q6OmxheW91dCgpCiAKIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFJlbmRlck9iamVjdDo6dW5j
YWNoZWRGaXJzdExpbmVTdHlsZShSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0CiB7Ci0gICAgaWYg
KCFkb2N1bWVudCgpLT51c2VzRmlyc3RMaW5lUnVsZXMoKSkKKyAgICBpZiAoIWRvY3VtZW50KCkt
PnN0eWxlU2hlZXRDb2xsZWN0aW9uKCktPnVzZXNGaXJzdExpbmVSdWxlcygpKQogICAgICAgICBy
ZXR1cm4gMDsKIAogICAgIEFTU0VSVCghaXNUZXh0KCkpOwpAQCAtMjYxOCw3ICsyNjE4LDcgQEAg
UGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gUmVuZGVyT2JqZWN0Ojp1bgogCiBSZW5kZXJTdHlsZSog
UmVuZGVyT2JqZWN0OjpmaXJzdExpbmVTdHlsZVNsb3dDYXNlKCkgY29uc3QKIHsKLSAgICBBU1NF
UlQoZG9jdW1lbnQoKS0+dXNlc0ZpcnN0TGluZVJ1bGVzKCkpOworICAgIEFTU0VSVChkb2N1bWVu
dCgpLT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpLT51c2VzRmlyc3RMaW5lUnVsZXMoKSk7CiAKICAg
ICBSZW5kZXJTdHlsZSogc3R5bGUgPSBtX3N0eWxlLmdldCgpOwogICAgIGNvbnN0IFJlbmRlck9i
amVjdCogcmVuZGVyZXIgPSBpc1RleHQoKSA/IHBhcmVudCgpIDogdGhpczsKSW5kZXg6IFNvdXJj
ZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3QuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmgJKHJldmlzaW9uIDEyOTM5NykKKysrIFNv
dXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3QuaAkod29ya2luZyBjb3B5KQpAQCAt
MjcsNiArMjcsNyBAQAogI2RlZmluZSBSZW5kZXJPYmplY3RfaAogCiAjaW5jbHVkZSAiQ2FjaGVk
SW1hZ2VDbGllbnQuaCIKKyNpbmNsdWRlICJEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmgi
CiAjaW5jbHVkZSAiRWxlbWVudC5oIgogI2luY2x1ZGUgIkZyYWN0aW9uYWxMYXlvdXRVbml0Lmgi
CiAjaW5jbHVkZSAiRmxvYXRRdWFkLmgiCkBAIC03MzUsNyArNzM2LDcgQEAgcHVibGljOgogICAg
IHZpcnR1YWwgTGF5b3V0VW5pdCBtYXhQcmVmZXJyZWRMb2dpY2FsV2lkdGgoKSBjb25zdCB7IHJl
dHVybiAwOyB9CiAKICAgICBSZW5kZXJTdHlsZSogc3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3N0
eWxlLmdldCgpOyB9Ci0gICAgUmVuZGVyU3R5bGUqIGZpcnN0TGluZVN0eWxlKCkgY29uc3QgeyBy
ZXR1cm4gZG9jdW1lbnQoKS0+dXNlc0ZpcnN0TGluZVJ1bGVzKCkgPyBmaXJzdExpbmVTdHlsZVNs
b3dDYXNlKCkgOiBzdHlsZSgpOyB9CisgICAgUmVuZGVyU3R5bGUqIGZpcnN0TGluZVN0eWxlKCkg
Y29uc3QgeyByZXR1cm4gZG9jdW1lbnQoKS0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+dXNlc0Zp
cnN0TGluZVJ1bGVzKCkgPyBmaXJzdExpbmVTdHlsZVNsb3dDYXNlKCkgOiBzdHlsZSgpOyB9CiAg
ICAgUmVuZGVyU3R5bGUqIHN0eWxlKGJvb2wgZmlyc3RMaW5lKSBjb25zdCB7IHJldHVybiBmaXJz
dExpbmUgPyBmaXJzdExpbmVTdHlsZSgpIDogc3R5bGUoKTsgfQogCiAgICAgLy8gVXNlZCBvbmx5
IGJ5IEVsZW1lbnQ6OnBzZXVkb1N0eWxlQ2FjaGVJc0ludmFsaWQgdG8gZ2V0IGEgZmlyc3QgbGlu
ZSBzdHlsZSBiYXNlZCBvZmYgb2YgYQpJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1Jl
bmRlck9iamVjdENoaWxkTGlzdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlck9iamVjdENoaWxkTGlzdC5jcHAJKHJldmlzaW9uIDEyOTM5NykKKysrIFNv
dXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3RDaGlsZExpc3QuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0zNjksNyArMzY5LDcgQEAgc3RhdGljIFJlbmRlck9iamVjdCogZW5zdXJlQmVm
b3JlQWZ0ZXJDbwogdm9pZCBSZW5kZXJPYmplY3RDaGlsZExpc3Q6OnVwZGF0ZUJlZm9yZUFmdGVy
Q29udGVudChSZW5kZXJPYmplY3QqIG93bmVyLCBQc2V1ZG9JZCB0eXBlLCBjb25zdCBSZW5kZXJP
YmplY3QqIHN0eWxlZE9iamVjdCkKIHsKICAgICAvLyBEb3VibGUgY2hlY2sgdGhhdCB0aGUgZG9j
dW1lbnQgZGlkIGluIGZhY3QgdXNlIGdlbmVyYXRlZCBjb250ZW50IHJ1bGVzLiAgT3RoZXJ3aXNl
IHdlIHNob3VsZCBub3QgaGF2ZSBiZWVuIGNhbGxlZC4KLSAgICBBU1NFUlQob3duZXItPmRvY3Vt
ZW50KCktPnVzZXNCZWZvcmVBZnRlclJ1bGVzKCkpOworICAgIEFTU0VSVChvd25lci0+ZG9jdW1l
bnQoKS0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+dXNlc0JlZm9yZUFmdGVyUnVsZXMoKSk7CiAK
ICAgICAvLyBJbiBDU1MyLCBiZWZvcmUvYWZ0ZXIgcHNldWRvLWNvbnRlbnQgY2Fubm90IG5lc3Qu
ICBDaGVjayB0aGlzIGZpcnN0LgogICAgIGlmIChvd25lci0+c3R5bGUoKS0+c3R5bGVUeXBlKCkg
PT0gQkVGT1JFIHx8IG93bmVyLT5zdHlsZSgpLT5zdHlsZVR5cGUoKSA9PSBBRlRFUikKSW5kZXg6
IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUYWJsZVJvdy5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRhYmxlUm93LmNwcAkocmV2aXNpb24g
MTI5Mzk3KQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRhYmxlUm93LmNwcAko
d29ya2luZyBjb3B5KQpAQCAtNTUsNyArNTUsNyBAQCB2b2lkIFJlbmRlclRhYmxlUm93Ojp3aWxs
QmVSZW1vdmVkRnJvbVRyCiAKIHZvaWQgUmVuZGVyVGFibGVSb3c6OnVwZGF0ZUJlZm9yZUFuZEFm
dGVyQ29udGVudCgpCiB7Ci0gICAgaWYgKCFpc0Fub255bW91cygpICYmIGRvY3VtZW50KCktPnVz
ZXNCZWZvcmVBZnRlclJ1bGVzKCkpIHsKKyAgICBpZiAoIWlzQW5vbnltb3VzKCkgJiYgZG9jdW1l
bnQoKS0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+dXNlc0JlZm9yZUFmdGVyUnVsZXMoKSkgewog
ICAgICAgICBjaGlsZHJlbigpLT51cGRhdGVCZWZvcmVBZnRlckNvbnRlbnQodGhpcywgQkVGT1JF
KTsKICAgICAgICAgY2hpbGRyZW4oKS0+dXBkYXRlQmVmb3JlQWZ0ZXJDb250ZW50KHRoaXMsIEFG
VEVSKTsKICAgICB9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUm9vdElubGluZUJv
eC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1Jvb3RJbmxpbmVC
b3guY3BwCShyZXZpc2lvbiAxMjkzOTcpCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUm9v
dElubGluZUJveC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTg0Niw3ICs4NDYsNyBAQCBMYXlvdXRV
bml0IFJvb3RJbmxpbmVCb3g6OnZlcnRpY2FsUG9zaXRpCiAKICAgICAvLyBUaGlzIG1ldGhvZCBk
ZXRlcm1pbmVzIHRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBmb3IgaW5saW5lIGVsZW1lbnRzLgogICAg
IGJvb2wgZmlyc3RMaW5lID0gaXNGaXJzdExpbmVTdHlsZSgpOwotICAgIGlmIChmaXJzdExpbmUg
JiYgIXJlbmRlcmVyLT5kb2N1bWVudCgpLT51c2VzRmlyc3RMaW5lUnVsZXMoKSkKKyAgICBpZiAo
Zmlyc3RMaW5lICYmICFyZW5kZXJlci0+ZG9jdW1lbnQoKS0+c3R5bGVTaGVldENvbGxlY3Rpb24o
KS0+dXNlc0ZpcnN0TGluZVJ1bGVzKCkpCiAgICAgICAgIGZpcnN0TGluZSA9IGZhbHNlOwogCiAg
ICAgLy8gQ2hlY2sgdGhlIGNhY2hlLgpJbmRleDogU291cmNlL1dlYktpdC9jaHJvbWl1bS9zcmMv
V2ViRG9jdW1lbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3Jj
L1dlYkRvY3VtZW50LmNwcAkocmV2aXNpb24gMTI5Mzk3KQorKysgU291cmNlL1dlYktpdC9jaHJv
bWl1bS9zcmMvV2ViRG9jdW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNSw2ICszNSw3IEBA
CiAjaW5jbHVkZSAiQ1NTUGFyc2VyTW9kZS5oIgogI2luY2x1ZGUgIkRvY3VtZW50LmgiCiAjaW5j
bHVkZSAiRG9jdW1lbnRMb2FkZXIuaCIKKyNpbmNsdWRlICJEb2N1bWVudFN0eWxlU2hlZXRDb2xs
ZWN0aW9uLmgiCiAjaW5jbHVkZSAiRG9jdW1lbnRUeXBlLmgiCiAjaW5jbHVkZSAiRWxlbWVudC5o
IgogI2luY2x1ZGUgIkhUTUxBbGxDb2xsZWN0aW9uLmgiCkBAIC0xOTYsNyArMTk3LDcgQEAgdm9p
ZCBXZWJEb2N1bWVudDo6aW5zZXJ0VXNlclN0eWxlU2hlZXQoYwogICAgIFJlZlB0cjxTdHlsZVNo
ZWV0Q29udGVudHM+IHBhcnNlZFNoZWV0ID0gU3R5bGVTaGVldENvbnRlbnRzOjpjcmVhdGUoZG9j
dW1lbnQuZ2V0KCkpOwogICAgIHBhcnNlZFNoZWV0LT5zZXRJc1VzZXJTdHlsZVNoZWV0KGxldmVs
ID09IFVzZXJTdHlsZVVzZXJMZXZlbCk7CiAgICAgcGFyc2VkU2hlZXQtPnBhcnNlU3RyaW5nKHNv
dXJjZUNvZGUpOwotICAgIGRvY3VtZW50LT5hZGRVc2VyU2hlZXQocGFyc2VkU2hlZXQucmVsZWFz
ZSgpKTsKKyAgICBkb2N1bWVudC0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+YWRkVXNlclNoZWV0
KHBhcnNlZFNoZWV0LnJlbGVhc2UoKSk7CiB9CiAKIHZvaWQgV2ViRG9jdW1lbnQ6OmNhbmNlbEZ1
bGxTY3JlZW4oKQo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>165442</attachid>
            <date>2012-09-24 13:57:12 -0700</date>
            <delta_ts>2012-09-24 14:16:05 -0700</delta_ts>
            <desc>another rebase</desc>
            <filename>document-stylesheet-split-11.patch</filename>
            <type>text/plain</type>
            <size>541601</size>
            <attacher name="Antti Koivisto">koivisto</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEyOTQwNykKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE1MyBAQAorMjAxMi0wOS0yNCAgQW50dGkg
S29pdmlzdG8gIDxhbnR0aUBhcHBsZS5jb20+CisKKyAgICAgICAgU3BsaXQgc3R5bGVzaGVldCBy
ZWxhdGVkIGNvZGUgb3V0IGZyb20gRG9jdW1lbnQgCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD05NzM1MworCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgIERvY3VtZW50IGlzIGJpZyBhbmQgdW53aWVsZHkuIFRoZSBj
b2RlIHJlbGF0ZWQgdG8gdHJhY2tpbmcgYWN0aXZlIHN0eWxlc2hlZXRzIGNhbiBiZSBmYWN0b3Jl
ZCBvdXQuCisgICAgICAgIAorICAgICAgICBUaGUgcGF0Y2ggbW92ZXMgc3R5bGVzaGVldCB1cGtl
ZXAsIGNvbGxlY3Rpb24gYW5kIGludmFsaWRhdGlvbiBjb2RlIGZyb20gRG9jdW1lbnQgdG8gYSBz
ZXBhcmF0ZQorICAgICAgICBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uIGNsYXNzLiBUaGVy
ZSBhcmUgbm8gZnVuY3Rpb25hbCBjaGFuZ2VzLgorICAgICAgICAKKyAgICAgICAgVGhlIHVzZXNM
aW5rUnVsZXMgc3R5bGVzaGVldCBmZWF0dXJlIGJpdCBhbmQgdGhlIHJlbGF0ZWQgY29kZSBpcyBy
ZW1vdmVkIGFzIG5vIG9uZSB3YXMgdXNpbmcgaXQuCisKKyAgICAgICAgKiBXZWJDb3JlLnhjb2Rl
cHJvai9wcm9qZWN0LnBieHByb2o6CisgICAgICAgICogY3NzL1NlbGVjdG9yQ2hlY2tlci5jcHA6
CisgICAgICAgIChXZWJDb3JlOjpTZWxlY3RvckNoZWNrZXI6OmNoZWNrT25lU2VsZWN0b3IpOgor
ICAgICAgICAqIGNzcy9TdHlsZVJlc29sdmVyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxl
UmVzb2x2ZXI6OlN0eWxlUmVzb2x2ZXIpOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVSZXNvbHZl
cjo6RmVhdHVyZXM6OkZlYXR1cmVzKToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6
OkZlYXR1cmVzOjphZGQpOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVSZXNvbHZlcjo6RmVhdHVy
ZXM6OmNsZWFyKToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OmNvbGxlY3RNYXRj
aGluZ1J1bGVzRm9yTGlzdCk6CisgICAgICAgICogY3NzL1N0eWxlUmVzb2x2ZXIuaDoKKyAgICAg
ICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OnVzZXNCZWZvcmVBZnRlclJ1bGVzKToKKyAgICAg
ICAgKEZlYXR1cmVzKToKKyAgICAgICAgKiBkb20vRG9jdW1lbnQuY3BwOgorICAgICAgICAoV2Vi
Q29yZTo6RG9jdW1lbnQ6OkRvY3VtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50Ojp+
RG9jdW1lbnQpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnQ6OnNldENvbXBhdGliaWxpdHlN
b2RlKToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50OjpyZWNhbGNTdHlsZSk6CisgICAgICAg
IChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50OjpjcmVhdGVTdHlsZVJlc29s
dmVyKToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50OjpzZWFtbGVzc1BhcmVudFVwZGF0ZWRT
dHlsZXNoZWV0cyk6CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudDo6ZGlkUmVtb3ZlQWxsUGVu
ZGluZ1N0eWxlc2hlZXQpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnQ6OnByb2Nlc3NIdHRw
RXF1aXYpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnQ6OnN0eWxlU2hlZXRzKToKKyAgICAg
ICAgKFdlYkNvcmU6OkRvY3VtZW50OjpwcmVmZXJyZWRTdHlsZXNoZWV0U2V0KToKKyAgICAgICAg
KFdlYkNvcmU6OkRvY3VtZW50OjpzZWxlY3RlZFN0eWxlc2hlZXRTZXQpOgorICAgICAgICAoV2Vi
Q29yZTo6RG9jdW1lbnQ6OnNldFNlbGVjdGVkU3R5bGVzaGVldFNldCk6CisgICAgICAgIChXZWJD
b3JlOjpEb2N1bWVudDo6c3R5bGVSZXNvbHZlckNoYW5nZWQpOgorICAgICAgICAoV2ViQ29yZTo6
RG9jdW1lbnQ6OnJlcG9ydE1lbW9yeVVzYWdlKToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50
OjpoYXZlU3R5bGVzaGVldHNMb2FkZWQpOgorICAgICAgICAqIGRvbS9Eb2N1bWVudC5oOgorICAg
ICAgICAoV2ViQ29yZSk6CisgICAgICAgIChEb2N1bWVudCk6CisgICAgICAgIChXZWJDb3JlOjpE
b2N1bWVudDo6c3R5bGVTaGVldENvbGxlY3Rpb24pOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1l
bnQ6Omhhc05vZGVzV2l0aFBsYWNlaG9sZGVyU3R5bGUpOgorICAgICAgICAoV2ViQ29yZTo6RG9j
dW1lbnQ6OnNldE5lZWRzTm90aWZ5UmVtb3ZlQWxsUGVuZGluZ1N0eWxlc2hlZXQpOgorICAgICAg
ICAoV2ViQ29yZTo6RG9jdW1lbnQ6OmluU3R5bGVSZWNhbGMpOgorICAgICAgICAqIGRvbS9Eb2N1
bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlKToK
KyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OkRvY3VtZW50
U3R5bGVTaGVldENvbGxlY3Rpb24pOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNo
ZWV0Q29sbGVjdGlvbjo6fkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24pOgorICAgICAgICAo
V2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6cGFnZVVzZXJTaGVldCk6Cisg
ICAgICAgIChXZWJDb3JlOjpEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjpjbGVhclBhZ2VV
c2VyU2hlZXQpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlv
bjo6dXBkYXRlUGFnZVVzZXJTaGVldCk6CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudFN0eWxl
U2hlZXRDb2xsZWN0aW9uOjpwYWdlR3JvdXBVc2VyU2hlZXRzKToKKyAgICAgICAgKFdlYkNvcmU6
OkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OmNsZWFyUGFnZUdyb3VwVXNlclNoZWV0cyk6
CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjp1cGRhdGVQ
YWdlR3JvdXBVc2VyU2hlZXRzKToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50U3R5bGVTaGVl
dENvbGxlY3Rpb246OmFkZFVzZXJTaGVldCk6CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudFN0
eWxlU2hlZXRDb2xsZWN0aW9uOjpyZW1vdmVQZW5kaW5nU2hlZXQpOgorICAgICAgICAoV2ViQ29y
ZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6YWRkU3R5bGVTaGVldENhbmRpZGF0ZU5v
ZGUpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6cmVt
b3ZlU3R5bGVTaGVldENhbmRpZGF0ZU5vZGUpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRT
dHlsZVNoZWV0Q29sbGVjdGlvbjo6Y29sbGVjdEFjdGl2ZVN0eWxlU2hlZXRzKToKKyAgICAgICAg
KFdlYkNvcmU6OkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OnRlc3RBZGRlZFN0eWxlU2hl
ZXRSZXF1aXJlc1N0eWxlUmVjYWxjKToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50U3R5bGVT
aGVldENvbGxlY3Rpb246OmFuYWx5emVTdHlsZVNoZWV0Q2hhbmdlKToKKyAgICAgICAgKFdlYkNv
cmU6OnN0eWxlU2hlZXRzVXNlUmVtVW5pdHMpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRT
dHlsZVNoZWV0Q29sbGVjdGlvbjo6dXBkYXRlQWN0aXZlU3R5bGVTaGVldHMpOgorICAgICAgICAo
V2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6Y29tYmluZUNTU0ZlYXR1cmVG
bGFncyk6CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjpy
ZXNldENTU0ZlYXR1cmVGbGFncyk6CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudFN0eWxlU2hl
ZXRDb2xsZWN0aW9uOjpyZXBvcnRNZW1vcnlVc2FnZSk6CisgICAgICAgICogZG9tL0RvY3VtZW50
U3R5bGVTaGVldENvbGxlY3Rpb24uaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlKToKKyAgICAg
ICAgKERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24pOgorICAgICAgICAoV2ViQ29yZTo6RG9j
dW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6YXV0aG9yU3R5bGVTaGVldHMpOgorICAgICAgICAo
V2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6ZG9jdW1lbnRVc2VyU2hlZXRz
KToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246Om5lZWRz
VXBkYXRlQWN0aXZlU3R5bGVzaGVldHNPblN0eWxlUmVjYWxjKToKKyAgICAgICAgKFdlYkNvcmU6
OkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OnByZWZlcnJlZFN0eWxlc2hlZXRTZXROYW1l
KToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OnNlbGVj
dGVkU3R5bGVzaGVldFNldE5hbWUpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNo
ZWV0Q29sbGVjdGlvbjo6c2V0UHJlZmVycmVkU3R5bGVzaGVldFNldE5hbWUpOgorICAgICAgICAo
V2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6c2V0U2VsZWN0ZWRTdHlsZXNo
ZWV0U2V0TmFtZSk6CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0
aW9uOjphZGRQZW5kaW5nU2hlZXQpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNo
ZWV0Q29sbGVjdGlvbjo6aGFzUGVuZGluZ1NoZWV0cyk6CisgICAgICAgIChXZWJDb3JlOjpEb2N1
bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjp1c2VzU2libGluZ1J1bGVzKToKKyAgICAgICAgKFdl
YkNvcmU6OkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OnNldFVzZXNTaWJsaW5nUnVsZXNP
dmVycmlkZSk6CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9u
Ojp1c2VzRmlyc3RMaW5lUnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNo
ZWV0Q29sbGVjdGlvbjo6dXNlc0ZpcnN0TGV0dGVyUnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6
RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6c2V0VXNlc0ZpcnN0TGV0dGVyUnVsZXMpOgor
ICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6dXNlc0JlZm9y
ZUFmdGVyUnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVj
dGlvbjo6c2V0VXNlc0JlZm9yZUFmdGVyUnVsZXNPdmVycmlkZSk6CisgICAgICAgIChXZWJDb3Jl
OjpEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjp1c2VzUmVtVW5pdHMpOgorICAgICAgICAo
V2ViQ29yZTo6RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6c2V0VXNlc1JlbVVuaXQpOgor
ICAgICAgICAqIGRvbS9FbGVtZW50LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnQ6OnJl
Y2FsY1N0eWxlKToKKyAgICAgICAgKiBkb20vUHJvY2Vzc2luZ0luc3RydWN0aW9uLmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OlByb2Nlc3NpbmdJbnN0cnVjdGlvbjo6flByb2Nlc3NpbmdJbnN0cnVj
dGlvbik6CisgICAgICAgIChXZWJDb3JlOjpQcm9jZXNzaW5nSW5zdHJ1Y3Rpb246OmNoZWNrU3R5
bGVTaGVldCk6CisgICAgICAgIChXZWJDb3JlOjpQcm9jZXNzaW5nSW5zdHJ1Y3Rpb246OnNoZWV0
TG9hZGVkKToKKyAgICAgICAgKFdlYkNvcmU6OlByb2Nlc3NpbmdJbnN0cnVjdGlvbjo6aW5zZXJ0
ZWRJbnRvKToKKyAgICAgICAgKFdlYkNvcmU6OlByb2Nlc3NpbmdJbnN0cnVjdGlvbjo6cmVtb3Zl
ZEZyb20pOgorICAgICAgICAqIGRvbS9TdHlsZUVsZW1lbnQuY3BwOgorICAgICAgICAoV2ViQ29y
ZTo6U3R5bGVFbGVtZW50OjppbnNlcnRlZEludG9Eb2N1bWVudCk6CisgICAgICAgIChXZWJDb3Jl
OjpTdHlsZUVsZW1lbnQ6OnJlbW92ZWRGcm9tRG9jdW1lbnQpOgorICAgICAgICAoV2ViQ29yZTo6
U3R5bGVFbGVtZW50OjpjbGVhckRvY3VtZW50RGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpTdHls
ZUVsZW1lbnQ6OmNyZWF0ZVNoZWV0KToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlRWxlbWVudDo6
c2hlZXRMb2FkZWQpOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVFbGVtZW50OjpzdGFydExvYWRp
bmdEeW5hbWljU2hlZXQpOgorICAgICAgICAqIGh0bWwvSFRNTExpbmtFbGVtZW50LmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OkhUTUxMaW5rRWxlbWVudDo6fkhUTUxMaW5rRWxlbWVudCk6CisgICAg
ICAgIChXZWJDb3JlOjpIVE1MTGlua0VsZW1lbnQ6Omluc2VydGVkSW50byk6CisgICAgICAgIChX
ZWJDb3JlOjpIVE1MTGlua0VsZW1lbnQ6OnJlbW92ZWRGcm9tKToKKyAgICAgICAgKFdlYkNvcmU6
OkhUTUxMaW5rRWxlbWVudDo6YWRkUGVuZGluZ1NoZWV0KToKKyAgICAgICAgKFdlYkNvcmU6OkhU
TUxMaW5rRWxlbWVudDo6cmVtb3ZlUGVuZGluZ1NoZWV0KToKKyAgICAgICAgKiBodG1sL0hUTUxR
dW90ZUVsZW1lbnQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6SFRNTFF1b3RlRWxlbWVudDo6aW5z
ZXJ0ZWRJbnRvKToKKyAgICAgICAgKiBodG1sL0hUTUxWaWV3U291cmNlRG9jdW1lbnQuY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6SFRNTFZpZXdTb3VyY2VEb2N1bWVudDo6SFRNTFZpZXdTb3VyY2VE
b2N1bWVudCk6CisgICAgICAgICogbWF0aG1sL01hdGhNTE1hdGhFbGVtZW50LmNwcDoKKyAgICAg
ICAgKFdlYkNvcmU6Ok1hdGhNTE1hdGhFbGVtZW50OjppbnNlcnRlZEludG8pOgorICAgICAgICAq
IHBhZ2UvUGFnZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpQYWdlOjp1c2VyU3R5bGVTaGVldExv
Y2F0aW9uQ2hhbmdlZCk6CisgICAgICAgICogcGFnZS9QYWdlR3JvdXAuY3BwOgorICAgICAgICAo
V2ViQ29yZTo6UGFnZUdyb3VwOjpyZXNldFVzZXJTdHlsZUNhY2hlSW5BbGxGcmFtZXMpOgorICAg
ICAgICAqIHJlbmRlcmluZy9SZW5kZXJCUi5jcHA6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJC
Ujo6bGluZUhlaWdodCk6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlckJsb2NrLmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrOjpzdHlsZURpZENoYW5nZSk6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJCbG9jazo6c3BsaXRCbG9ja3MpOgorICAgICAgICAoV2ViQ29yZTo6UmVu
ZGVyQmxvY2s6OmFkZENoaWxkSWdub3JpbmdBbm9ueW1vdXNDb2x1bW5CbG9ja3MpOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6OmxpbmVIZWlnaHQpOgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyQmxvY2s6OnVwZGF0ZUZpcnN0TGV0dGVyKToKKyAgICAgICAgKiByZW5kZXJpbmcvUmVu
ZGVySW5saW5lLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlcklubGluZTo6c3R5bGVEaWRD
aGFuZ2UpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVySW5saW5lOjp1cGRhdGVBbHdheXNDcmVh
dGVMaW5lQm94ZXMpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVySW5saW5lOjphZGRDaGlsZEln
bm9yaW5nQ29udGludWF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlcklubGluZTo6c3Bs
aXRJbmxpbmVzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlcklubGluZTo6bGluZUhlaWdodCk6
CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlck9iamVjdC5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJPYmplY3Q6OnVuY2FjaGVkRmlyc3RMaW5lU3R5bGUpOgorICAgICAgICAoV2ViQ29y
ZTo6UmVuZGVyT2JqZWN0OjpmaXJzdExpbmVTdHlsZVNsb3dDYXNlKToKKyAgICAgICAgKiByZW5k
ZXJpbmcvUmVuZGVyT2JqZWN0Lmg6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJPYmplY3Q6OmZp
cnN0TGluZVN0eWxlKToKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyT2JqZWN0Q2hpbGRMaXN0
LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck9iamVjdENoaWxkTGlzdDo6dXBkYXRlQmVm
b3JlQWZ0ZXJDb250ZW50KToKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyVGFibGVSb3cuY3Bw
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGFibGVSb3c6OnVwZGF0ZUJlZm9yZUFuZEFmdGVy
Q29udGVudCk6CisgICAgICAgICogcmVuZGVyaW5nL1Jvb3RJbmxpbmVCb3guY3BwOgorICAgICAg
ICAoV2ViQ29yZTo6Um9vdElubGluZUJveDo6dmVydGljYWxQb3NpdGlvbkZvckJveCk6CisKIDIw
MTItMDktMjQgIFJ5b3N1a2UgTml3YSAgPHJuaXdhQHdlYmtpdC5vcmc+CiAKICAgICAgICAgc3Vz
cGVuZC9yZXN1bWVXaWRnZXRIaWVyYXJjaHlVcGRhdGVzIHNob3VsZCBiZSBhIFJBSUkgb2JqZWN0
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9DTWFrZUxpc3RzLnR4dAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvV2ViQ29yZS9DTWFrZUxpc3RzLnR4dAkocmV2aXNpb24gMTI5NDA3KQorKysgU291cmNlL1dl
YkNvcmUvQ01ha2VMaXN0cy50eHQJKHdvcmtpbmcgY29weSkKQEAgLTExMjUsNiArMTEyNSw3IEBA
IFNFVChXZWJDb3JlX1NPVVJDRVMKICAgICBkb20vRG9jdW1lbnRGcmFnbWVudC5jcHAKICAgICBk
b20vRG9jdW1lbnRQYXJzZXIuY3BwCiAgICAgZG9tL0RvY3VtZW50T3JkZXJlZE1hcC5jcHAKKyAg
ICBkb20vRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5jcHAKICAgICBkb20vRG9jdW1lbnRU
eXBlLmNwcAogICAgIGRvbS9EeW5hbWljTm9kZUxpc3QuY3BwCiAgICAgZG9tL0VkaXRpbmdUZXh0
LmNwcApJbmRleDogU291cmNlL1dlYkNvcmUvR05VbWFrZWZpbGUubGlzdC5hbQo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvV2ViQ29yZS9HTlVtYWtlZmlsZS5saXN0LmFtCShyZXZpc2lvbiAxMjk0MDcp
CisrKyBTb3VyY2UvV2ViQ29yZS9HTlVtYWtlZmlsZS5saXN0LmFtCSh3b3JraW5nIGNvcHkpCkBA
IC0yNzM0LDYgKzI3MzQsOCBAQCB3ZWJjb3JlX3NvdXJjZXMgKz0gXAogCVNvdXJjZS9XZWJDb3Jl
L2RvbS9Eb2N1bWVudE9yZGVyZWRNYXAuaCBcCiAJU291cmNlL1dlYkNvcmUvZG9tL0RvY3VtZW50
UGFyc2VyLmNwcCBcCiAJU291cmNlL1dlYkNvcmUvZG9tL0RvY3VtZW50UGFyc2VyLmggXAorICAg
IFNvdXJjZS9XZWJDb3JlL2RvbS9Eb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmNwcCBcCisg
ICAgU291cmNlL1dlYkNvcmUvZG9tL0RvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uaCBcCiAJ
U291cmNlL1dlYkNvcmUvZG9tL0RvY3VtZW50VGltaW5nLmggXAogCVNvdXJjZS9XZWJDb3JlL2Rv
bS9Eb2N1bWVudFR5cGUuY3BwIFwKIAlTb3VyY2UvV2ViQ29yZS9kb20vRG9jdW1lbnRUeXBlLmgg
XApJbmRleDogU291cmNlL1dlYkNvcmUvVGFyZ2V0LnByaQo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViQ29yZS9UYXJnZXQucHJpCShyZXZpc2lvbiAxMjk0MDcpCisrKyBTb3VyY2UvV2ViQ29yZS9U
YXJnZXQucHJpCSh3b3JraW5nIGNvcHkpCkBAIC0zNzEsNiArMzcxLDcgQEAgU09VUkNFUyArPSBc
CiAgICAgZG9tL0RvY3VtZW50TWFya2VyLmNwcCBcCiAgICAgZG9tL0RvY3VtZW50T3JkZXJlZE1h
cC5jcHAgXAogICAgIGRvbS9Eb2N1bWVudFBhcnNlci5jcHAgXAorICAgIGRvbS9Eb2N1bWVudFN0
eWxlU2hlZXRDb2xsZWN0aW9uLmNwcCBcCiAgICAgZG9tL0RvY3VtZW50VHlwZS5jcHAgXAogICAg
IGRvbS9ET01Db3JlRXhjZXB0aW9uLmNwcCBcCiAgICAgZG9tL0RPTUVycm9yLmNwcCBcCkBAIC0x
NTI4LDYgKzE1MjksNyBAQCBIRUFERVJTICs9IFwKICAgICBkb20vRG9jdW1lbnRNYXJrZXIuaCBc
CiAgICAgZG9tL0RvY3VtZW50TWFya2VyQ29udHJvbGxlci5oIFwKICAgICBkb20vRG9jdW1lbnRP
cmRlcmVkTWFwLmggXAorICAgIGRvbS9Eb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmggXAog
ICAgIGRvbS9Eb2N1bWVudFR5cGUuaCBcCiAgICAgZG9tL0RPTUVycm9yLmggXAogICAgIGRvbS9E
T01JbXBsZW1lbnRhdGlvbi5oIFwKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkJKHJldmlzaW9uIDEyOTQw
NykKKysrIFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQkod29ya2luZyBjb3B5KQpAQCAtNjU3
LDYgKzY1Nyw3IEBACiAgICAgICAgICAgICAnZG9tL0RvY3VtZW50TWFya2VyQ29udHJvbGxlci5o
JywKICAgICAgICAgICAgICdkb20vRG9jdW1lbnRPcmRlcmVkTWFwLmgnLAogICAgICAgICAgICAg
J2RvbS9Eb2N1bWVudFBhcnNlci5oJywKKyAgICAgICAgICAgICdkb20vRG9jdW1lbnRTdHlsZVNo
ZWV0Q29sbGVjdGlvbi5oJywKICAgICAgICAgICAgICdkb20vRG9jdW1lbnRUaW1pbmcuaCcsCiAg
ICAgICAgICAgICAnZG9tL0RvY3VtZW50VHlwZS5oJywKICAgICAgICAgICAgICdkb20vRWxlbWVu
dC5oJywKQEAgLTM4MTYsNiArMzgxNyw3IEBACiAgICAgICAgICAgICAnZG9tL0RvY3VtZW50TWFy
a2VyLmNwcCcsCiAgICAgICAgICAgICAnZG9tL0RvY3VtZW50T3JkZXJlZE1hcC5jcHAnLAogICAg
ICAgICAgICAgJ2RvbS9Eb2N1bWVudFBhcnNlci5jcHAnLAorICAgICAgICAgICAgJ2RvbS9Eb2N1
bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmNwcCcsCiAgICAgICAgICAgICAnZG9tL0RvY3VtZW50
VHlwZS5jcHAnLAogICAgICAgICAgICAgJ2RvbS9EeW5hbWljTm9kZUxpc3QuY3BwJywKICAgICAg
ICAgICAgICdkb20vRHluYW1pY05vZGVMaXN0LmgnLApJbmRleDogU291cmNlL1dlYkNvcmUvV2Vi
Q29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUv
V2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oJKHJldmlzaW9uIDEyOTQwNykKKysrIFNvdXJj
ZS9XZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qCSh3b3JraW5nIGNvcHkpCkBA
IC01MDQwNiw2ICs1MDQwNiwxNCBAQAogCQkJCVJlbGF0aXZlUGF0aD0iLi5cZG9tXERvY3VtZW50
UGFyc2VyLmgiCiAJCQkJPgogCQkJPC9GaWxlPgorICAgICAgICAgICAgPEZpbGUKKwkJCQlSZWxh
dGl2ZVBhdGg9Ii4uXGRvbVxEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmNwcCIKKwkJCQk+
CisJCQk8L0ZpbGU+CisgICAgICAgICAgICA8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cZG9t
XERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uaCIKKwkJCQk+CisJCQk8L0ZpbGU+CiAJCQk8
RmlsZQogCQkJCVJlbGF0aXZlUGF0aD0iLi5cZG9tXERvY3VtZW50VGltaW5nLmgiCiAJCQkJPgpJ
bmRleDogU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4
cHJvagkocmV2aXNpb24gMTI5NDA3KQorKysgU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXBy
b2ovcHJvamVjdC5wYnhwcm9qCSh3b3JraW5nIGNvcHkpCkBAIC02MTQxLDYgKzYxNDEsOCBAQAog
CQlFNDc3OEI4MDExNUE1ODFBMDBCNUQzNzIgLyogSlNDdXN0b21FdmVudC5oIGluIEhlYWRlcnMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRTQ3NzhCN0UxMTVBNTgxQTAwQjVE
MzcyIC8qIEpTQ3VzdG9tRXZlbnQuaCAqLzsgfTsKIAkJRTQ3QjRCRTgwRTcxMjQxNjAwMDM4ODU0
IC8qIENhY2hlZFJlc291cmNlSGFuZGxlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSBFNDdCNEJFNjBFNzEyNDE2MDAwMzg4NTQgLyogQ2FjaGVkUmVzb3Vy
Y2VIYW5kbGUuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9
OwogCQlFNDdCNEJFOTBFNzEyNDE2MDAwMzg4NTQgLyogQ2FjaGVkUmVzb3VyY2VIYW5kbGUuY3Bw
IGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRTQ3QjRCRTcw
RTcxMjQxNjAwMDM4ODU0IC8qIENhY2hlZFJlc291cmNlSGFuZGxlLmNwcCAqLzsgfTsKKwkJRTQ3
RTI3NjUxNjAzNkVEMjAwRUUyQUZCIC8qIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uaCBp
biBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEU0N0UyNzY0MTYw
MzZFRDIwMEVFMkFGQiAvKiBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmggKi87IHNldHRp
bmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKKwkJRTQ3RTI3NjgxNjAzNkVE
QzAwRUUyQUZCIC8qIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uY3BwIGluIFNvdXJjZXMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRTQ3RTI3NjcxNjAzNkVEQzAwRUUy
QUZCIC8qIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uY3BwICovOyB9OwogCQlFNDk0NkVB
RTE1NkU2NEREMDBEMzI5N0YgLyogU3R5bGVSdWxlSW1wb3J0LmNwcCBpbiBTb3VyY2VzICovID0g
e2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEU0OTQ2RUFDMTU2RTY0REQwMEQzMjk3RiAv
KiBTdHlsZVJ1bGVJbXBvcnQuY3BwICovOyB9OwogCQlFNDk0NkVBRjE1NkU2NEREMDBEMzI5N0Yg
LyogU3R5bGVSdWxlSW1wb3J0LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7
IGZpbGVSZWYgPSBFNDk0NkVBRDE1NkU2NEREMDBEMzI5N0YgLyogU3R5bGVSdWxlSW1wb3J0Lmgg
Ki87IH07CiAJCUU0OUJEOUZBMTMxRkQyRUQwMDNDNTZGMCAvKiBDU1NWYWx1ZVBvb2wuaCBpbiBI
ZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEU0OUJEOUY5MTMxRkQy
RUQwMDNDNTZGMCAvKiBDU1NWYWx1ZVBvb2wuaCAqLzsgfTsKQEAgLTEzNTIwLDYgKzEzNTIyLDgg
QEAKIAkJRTQ3NzhCN0UxMTVBNTgxQTAwQjVEMzcyIC8qIEpTQ3VzdG9tRXZlbnQuaCAqLyA9IHtp
c2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlw
ZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gSlNDdXN0b21FdmVudC5oOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OwogCQlFNDdCNEJFNjBFNzEyNDE2MDAwMzg4NTQgLyogQ2FjaGVkUmVzb3Vy
Y2VIYW5kbGUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0
OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQ2FjaGVkUmVzb3Vy
Y2VIYW5kbGUuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRTQ3QjRCRTcwRTcxMjQx
NjAwMDM4ODU0IC8qIENhY2hlZFJlc291cmNlSGFuZGxlLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNv
ZGUuY3BwLmNwcDsgcGF0aCA9IENhY2hlZFJlc291cmNlSGFuZGxlLmNwcDsgc291cmNlVHJlZSA9
ICI8Z3JvdXA+IjsgfTsKKwkJRTQ3RTI3NjQxNjAzNkVEMjAwRUUyQUZCIC8qIERvY3VtZW50U3R5
bGVTaGVldENvbGxlY3Rpb24uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5j
b2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gRG9j
dW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9Owor
CQlFNDdFMjc2NzE2MDM2RURDMDBFRTJBRkIgLyogRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlv
bi5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFz
dEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBEb2N1bWVudFN0eWxl
U2hlZXRDb2xsZWN0aW9uLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRTQ5NDZF
QUMxNTZFNjRERDAwRDMyOTdGIC8qIFN0eWxlUnVsZUltcG9ydC5jcHAgKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBTdHlsZVJ1bGVJbXBvcnQuY3BwOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OwogCQlFNDk0NkVBRDE1NkU2NEREMDBEMzI5N0YgLyogU3R5bGVSdWxlSW1w
b3J0LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFz
dEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFN0eWxlUnVsZUltcG9ydC5o
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlFNDlCRDlGOTEzMUZEMkVEMDAzQzU2RjAg
LyogQ1NTVmFsdWVQb29sLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29k
aW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IENTU1Zh
bHVlUG9vbC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAtMjE2NzEsNiArMjE2NzUs
OCBAQAogCQkJCTE0OTQ3RkZDMTJGODBDRDIwMEEwRjYzMSAvKiBEb2N1bWVudE9yZGVyZWRNYXAu
aCAqLywKIAkJCQlBOEMyMjgwRDExRDRBNTk3MDBENUE3RDMgLyogRG9jdW1lbnRQYXJzZXIuY3Bw
ICovLAogCQkJCUJDQ0ZCQUU3MEI1MTUyRUQwMDAxRjFENyAvKiBEb2N1bWVudFBhcnNlci5oICov
LAorCQkJCUU0N0UyNzY3MTYwMzZFREMwMEVFMkFGQiAvKiBEb2N1bWVudFN0eWxlU2hlZXRDb2xs
ZWN0aW9uLmNwcCAqLywKKwkJCQlFNDdFMjc2NDE2MDM2RUQyMDBFRTJBRkIgLyogRG9jdW1lbnRT
dHlsZVNoZWV0Q29sbGVjdGlvbi5oICovLAogCQkJCTg2RDk4MkY2MTI1QzE1NDAwMEFEOUUzRCAv
KiBEb2N1bWVudFRpbWluZy5oICovLAogCQkJCUE4MTg1RjMyMDk3NjU3NjUwMDU4MjZEOSAvKiBE
b2N1bWVudFR5cGUuY3BwICovLAogCQkJCUE4MTg1RjMxMDk3NjU3NjUwMDU4MjZEOSAvKiBEb2N1
bWVudFR5cGUuaCAqLywKQEAgLTIyMjc1LDYgKzIyMjgxLDcgQEAKIAkJCWlzYSA9IFBCWEhlYWRl
cnNCdWlsZFBoYXNlOwogCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKIAkJCWZpbGVz
ID0gKAorCQkJCUU0N0UyNzY1MTYwMzZFRDIwMEVFMkFGQiAvKiBEb2N1bWVudFN0eWxlU2hlZXRD
b2xsZWN0aW9uLmggaW4gSGVhZGVycyAqLywKIAkJCQk5N0JDNjlEQjE1MDVGMDc2MDAxQjc0QUMg
LyogQWJzdHJhY3REYXRhYmFzZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJNDFFMUIxRDEwRkY1OTg2
OTAwNTc2QjNCIC8qIEFic3RyYWN0V29ya2VyLmggaW4gSGVhZGVycyAqLywKIAkJCQkyOUE4MTIy
RTBGQkI5QzFEMDA1MTAyOTMgLyogQWNjZXNzaWJpbGl0eUFSSUFHcmlkQ2VsbC5oIGluIEhlYWRl
cnMgKi8sCkBAIC0yODY2OCw2ICsyODY3NSw3IEBACiAJCQkJRTFCRTUxMkQwQ0Y2QzUxMjAwMkVB
OTU5IC8qIFhTTFRVbmljb2RlU29ydC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk5NzdFMkUwRTEy
RjBGQzlDMDBDMTMzNzkgLyogWFNTQXVkaXRvci5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlGRDUz
NzM1MjEzN0I2NTE4MDAwMDhEQ0UgLyogWmVyb1BvbGUuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJ
RTQ3RTI3NjgxNjAzNkVEQzAwRUUyQUZCIC8qIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24u
Y3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJNEYxRDExQkYxNUZGMzcyMDAwMjZFOTA4IC8qIFBsYXRm
b3JtTWVtb3J5SW5zdHJ1bWVudGF0aW9uLmNwcCBpbiBTb3VyY2VzICovLAogCQkJKTsKIAkJCXJ1
bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwpJbmRleDogU291cmNlL1dlYkNv
cmUvY3NzL1NlbGVjdG9yQ2hlY2tlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUv
Y3NzL1NlbGVjdG9yQ2hlY2tlci5jcHAJKHJldmlzaW9uIDEyOTQwNykKKysrIFNvdXJjZS9XZWJD
b3JlL2Nzcy9TZWxlY3RvckNoZWNrZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMSw2ICszMSw3
IEBACiAjaW5jbHVkZSAiQ1NTU2VsZWN0b3IuaCIKICNpbmNsdWRlICJDU1NTZWxlY3Rvckxpc3Qu
aCIKICNpbmNsdWRlICJEb2N1bWVudC5oIgorI2luY2x1ZGUgIkRvY3VtZW50U3R5bGVTaGVldENv
bGxlY3Rpb24uaCIKICNpbmNsdWRlICJGb2N1c0NvbnRyb2xsZXIuaCIKICNpbmNsdWRlICJGcmFt
ZS5oIgogI2luY2x1ZGUgIkZyYW1lU2VsZWN0aW9uLmgiCkBAIC03ODMsNyArNzg0LDcgQEAgYm9v
bCBTZWxlY3RvckNoZWNrZXI6OmNoZWNrT25lU2VsZWN0b3IoYwogICAgICAgICAgICAgICAgIGlm
IChtX21vZGUgPT0gUmVzb2x2aW5nU3R5bGUpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNv
bnRleHQuZWxlbWVudFN0eWxlKQogICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5lbGVt
ZW50U3R5bGUtPnNldEVtcHR5U3RhdGUocmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgZWxz
ZSBpZiAoZWxlbWVudC0+cmVuZGVyU3R5bGUoKSAmJiAoZWxlbWVudC0+ZG9jdW1lbnQoKS0+dXNl
c1NpYmxpbmdSdWxlcygpIHx8IGVsZW1lbnQtPnJlbmRlclN0eWxlKCktPnVuaXF1ZSgpKSkKKyAg
ICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZWxlbWVudC0+cmVuZGVyU3R5bGUoKSAmJiAoZWxl
bWVudC0+ZG9jdW1lbnQoKS0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+dXNlc1NpYmxpbmdSdWxl
cygpIHx8IGVsZW1lbnQtPnJlbmRlclN0eWxlKCktPnVuaXF1ZSgpKSkKICAgICAgICAgICAgICAg
ICAgICAgICAgIGVsZW1lbnQtPnJlbmRlclN0eWxlKCktPnNldEVtcHR5U3RhdGUocmVzdWx0KTsK
ICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTEx
ODcsNyArMTE4OCw3IEBAIGJvb2wgU2VsZWN0b3JDaGVja2VyOjpjaGVja09uZVNlbGVjdG9yKGMK
ICAgICAgICAgUHNldWRvSWQgcHNldWRvSWQgPSBDU1NTZWxlY3Rvcjo6cHNldWRvSWQoc2VsZWN0
b3ItPnBzZXVkb1R5cGUoKSk7CiAgICAgICAgIGlmIChwc2V1ZG9JZCA9PSBGSVJTVF9MRVRURVIp
IHsKICAgICAgICAgICAgIGlmIChEb2N1bWVudCogZG9jdW1lbnQgPSBlbGVtZW50LT5kb2N1bWVu
dCgpKQotICAgICAgICAgICAgICAgIGRvY3VtZW50LT5zZXRVc2VzRmlyc3RMZXR0ZXJSdWxlcyh0
cnVlKTsKKyAgICAgICAgICAgICAgICBkb2N1bWVudC0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+
c2V0VXNlc0ZpcnN0TGV0dGVyUnVsZXModHJ1ZSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHBz
ZXVkb0lkICE9IE5PUFNFVURPKQogICAgICAgICAgICAgZHluYW1pY1BzZXVkbyA9IHBzZXVkb0lk
OwpJbmRleDogU291cmNlL1dlYkNvcmUvY3NzL1N0eWxlUmVzb2x2ZXIuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJDb3JlL2Nzcy9TdHlsZVJlc29sdmVyLmNwcAkocmV2aXNpb24gMTI5NDA3
KQorKysgU291cmNlL1dlYkNvcmUvY3NzL1N0eWxlUmVzb2x2ZXIuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC02MCw2ICs2MCw3IEBACiAjaW5jbHVkZSAiQ291bnRlci5oIgogI2luY2x1ZGUgIkNvdW50
ZXJDb250ZW50LmgiCiAjaW5jbHVkZSAiQ3Vyc29yTGlzdC5oIgorI2luY2x1ZGUgIkRvY3VtZW50
U3R5bGVTaGVldENvbGxlY3Rpb24uaCIKICNpbmNsdWRlICJGb250RmVhdHVyZVZhbHVlLmgiCiAj
aW5jbHVkZSAiRm9udFZhbHVlLmgiCiAjaW5jbHVkZSAiRnJhbWUuaCIKQEAgLTQyOCwxMiArNDI5
LDEzIEBAIFN0eWxlUmVzb2x2ZXI6OlN0eWxlUmVzb2x2ZXIoRG9jdW1lbnQqIGQKICAgICAvLyBO
b3RlIHRoYXQgdGhlcmUgdXN1YWxseSBpcyBvbmx5IDEgc2hlZXQgZm9yIHNjb3BlZCBydWxlcywg
c28gYXV0by1zaHJpbmstdG8tZml0IGlzIGZpbmUuCiAgICAgbV9hdXRob3JTdHlsZS0+ZGlzYWJs
ZUF1dG9TaHJpbmtUb0ZpdCgpOwogCisgICAgRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbiog
c3R5bGVTaGVldENvbGxlY3Rpb24gPSBkb2N1bWVudC0+c3R5bGVTaGVldENvbGxlY3Rpb24oKTsK
ICAgICAvLyBGSVhNRTogVGhpcyBzdWNrcyEgVGhlIHVzZXIgc2hlZXQgaXMgcmVwYXJzZWQgZXZl
cnkgdGltZSEKICAgICBPd25QdHI8UnVsZVNldD4gdGVtcFVzZXJTdHlsZSA9IFJ1bGVTZXQ6OmNy
ZWF0ZSgpOwotICAgIGlmIChDU1NTdHlsZVNoZWV0KiBwYWdlVXNlclNoZWV0ID0gZG9jdW1lbnQt
PnBhZ2VVc2VyU2hlZXQoKSkKKyAgICBpZiAoQ1NTU3R5bGVTaGVldCogcGFnZVVzZXJTaGVldCA9
IHN0eWxlU2hlZXRDb2xsZWN0aW9uLT5wYWdlVXNlclNoZWV0KCkpCiAgICAgICAgIHRlbXBVc2Vy
U3R5bGUtPmFkZFJ1bGVzRnJvbVNoZWV0KHBhZ2VVc2VyU2hlZXQtPmNvbnRlbnRzKCksICptX21l
ZGl1bSwgdGhpcyk7Ci0gICAgYWRkQXV0aG9yUnVsZXNBbmRDb2xsZWN0VXNlclJ1bGVzRnJvbVNo
ZWV0cyhkb2N1bWVudC0+cGFnZUdyb3VwVXNlclNoZWV0cygpLCAqdGVtcFVzZXJTdHlsZSk7Ci0g
ICAgYWRkQXV0aG9yUnVsZXNBbmRDb2xsZWN0VXNlclJ1bGVzRnJvbVNoZWV0cyhkb2N1bWVudC0+
ZG9jdW1lbnRVc2VyU2hlZXRzKCksICp0ZW1wVXNlclN0eWxlKTsKKyAgICBhZGRBdXRob3JSdWxl
c0FuZENvbGxlY3RVc2VyUnVsZXNGcm9tU2hlZXRzKHN0eWxlU2hlZXRDb2xsZWN0aW9uLT5wYWdl
R3JvdXBVc2VyU2hlZXRzKCksICp0ZW1wVXNlclN0eWxlKTsKKyAgICBhZGRBdXRob3JSdWxlc0Fu
ZENvbGxlY3RVc2VyUnVsZXNGcm9tU2hlZXRzKHN0eWxlU2hlZXRDb2xsZWN0aW9uLT5kb2N1bWVu
dFVzZXJTaGVldHMoKSwgKnRlbXBVc2VyU3R5bGUpOwogICAgIGlmICh0ZW1wVXNlclN0eWxlLT5t
X3J1bGVDb3VudCA+IDAgfHwgdGVtcFVzZXJTdHlsZS0+bV9wYWdlUnVsZXMuc2l6ZSgpID4gMCkK
ICAgICAgICAgbV91c2VyU3R5bGUgPSB0ZW1wVXNlclN0eWxlLnJlbGVhc2UoKTsKIApAQCAtNDQ3
LDcgKzQ0OSw3IEBAIFN0eWxlUmVzb2x2ZXI6OlN0eWxlUmVzb2x2ZXIoRG9jdW1lbnQqIGQKICNl
bmRpZgogCiAgICAgYWRkU3R5bGVzaGVldHNGcm9tU2VhbWxlc3NQYXJlbnRzKCk7Ci0gICAgYXBw
ZW5kQXV0aG9yU3R5bGVzaGVldHMoMCwgZG9jdW1lbnQtPnN0eWxlU2hlZXRzKCktPnZlY3Rvcigp
KTsKKyAgICBhcHBlbmRBdXRob3JTdHlsZXNoZWV0cygwLCBzdHlsZVNoZWV0Q29sbGVjdGlvbi0+
YXV0aG9yU3R5bGVTaGVldHMoKS0+dmVjdG9yKCkpOwogfQogCiB2b2lkIFN0eWxlUmVzb2x2ZXI6
OmFkZFN0eWxlc2hlZXRzRnJvbVNlYW1sZXNzUGFyZW50cygpCkBAIC03MDgsNyArNzEwLDYgQEAg
dm9pZCBTdHlsZVJlc29sdmVyOjpzd2VlcE1hdGNoZWRQcm9wZXJ0aQogU3R5bGVSZXNvbHZlcjo6
RmVhdHVyZXM6OkZlYXR1cmVzKCkKICAgICA6IHVzZXNGaXJzdExpbmVSdWxlcyhmYWxzZSkKICAg
ICAsIHVzZXNCZWZvcmVBZnRlclJ1bGVzKGZhbHNlKQotICAgICwgdXNlc0xpbmtSdWxlcyhmYWxz
ZSkKIHsKIH0KIApAQCAtNzI4LDcgKzcyOSw2IEBAIHZvaWQgU3R5bGVSZXNvbHZlcjo6RmVhdHVy
ZXM6OmFkZChjb25zdCAKICAgICB1bmNvbW1vbkF0dHJpYnV0ZVJ1bGVzLmFwcGVuZChvdGhlci51
bmNvbW1vbkF0dHJpYnV0ZVJ1bGVzKTsKICAgICB1c2VzRmlyc3RMaW5lUnVsZXMgPSB1c2VzRmly
c3RMaW5lUnVsZXMgfHwgb3RoZXIudXNlc0ZpcnN0TGluZVJ1bGVzOwogICAgIHVzZXNCZWZvcmVB
ZnRlclJ1bGVzID0gdXNlc0JlZm9yZUFmdGVyUnVsZXMgfHwgb3RoZXIudXNlc0JlZm9yZUFmdGVy
UnVsZXM7Ci0gICAgdXNlc0xpbmtSdWxlcyA9IHVzZXNMaW5rUnVsZXMgfHwgb3RoZXIudXNlc0xp
bmtSdWxlczsKIH0KIAogdm9pZCBTdHlsZVJlc29sdmVyOjpGZWF0dXJlczo6Y2xlYXIoKQpAQCAt
NzM5LDcgKzczOSw2IEBAIHZvaWQgU3R5bGVSZXNvbHZlcjo6RmVhdHVyZXM6OmNsZWFyKCkKICAg
ICB1bmNvbW1vbkF0dHJpYnV0ZVJ1bGVzLmNsZWFyKCk7CiAgICAgdXNlc0ZpcnN0TGluZVJ1bGVz
ID0gZmFsc2U7CiAgICAgdXNlc0JlZm9yZUFmdGVyUnVsZXMgPSBmYWxzZTsKLSAgICB1c2VzTGlu
a1J1bGVzID0gZmFsc2U7CiB9CiAKIHZvaWQgU3R5bGVSZXNvbHZlcjo6RmVhdHVyZXM6OnJlcG9y
dE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qIG1lbW9yeU9iamVjdEluZm8pIGNvbnN0CkBA
IC0yNjA1LDEwICsyNjA0LDYgQEAgc3RhdGljIGlubGluZSB2b2lkIGNvbGxlY3RGZWF0dXJlc0Zy
b21TZQogICAgIGNhc2UgQ1NTU2VsZWN0b3I6OlBzZXVkb0FmdGVyOgogICAgICAgICBmZWF0dXJl
cy51c2VzQmVmb3JlQWZ0ZXJSdWxlcyA9IHRydWU7CiAgICAgICAgIGJyZWFrOwotICAgIGNhc2Ug
Q1NTU2VsZWN0b3I6OlBzZXVkb0xpbms6Ci0gICAgY2FzZSBDU1NTZWxlY3Rvcjo6UHNldWRvVmlz
aXRlZDoKLSAgICAgICAgZmVhdHVyZXMudXNlc0xpbmtSdWxlcyA9IHRydWU7Ci0gICAgICAgIGJy
ZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIGJyZWFrOwogICAgIH0KQEAgLTMxODEsMjUgKzMx
NzYsMjUgQEAgc3RhdGljIHZvaWQgY29sbGVjdENTU09NV3JhcHBlcnMoSGFzaE1hcAogICAgIGNv
bGxlY3RDU1NPTVdyYXBwZXJzKHdyYXBwZXJNYXAsIHN0eWxlU2hlZXRXcmFwcGVyLmdldCgpKTsK
IH0KIAotc3RhdGljIHZvaWQgY29sbGVjdENTU09NV3JhcHBlcnMoSGFzaE1hcDxTdHlsZVJ1bGUq
LCBSZWZQdHI8Q1NTU3R5bGVSdWxlPiA+JiB3cmFwcGVyTWFwLCBEb2N1bWVudCogZG9jdW1lbnQp
CitzdGF0aWMgdm9pZCBjb2xsZWN0Q1NTT01XcmFwcGVycyhIYXNoTWFwPFN0eWxlUnVsZSosIFJl
ZlB0cjxDU1NTdHlsZVJ1bGU+ID4mIHdyYXBwZXJNYXAsIERvY3VtZW50U3R5bGVTaGVldENvbGxl
Y3Rpb24qIHN0eWxlU2hlZXRDb2xsZWN0aW9uKQogewotICAgIGNvbnN0IFZlY3RvcjxSZWZQdHI8
U3R5bGVTaGVldD4gPiYgc3R5bGVTaGVldHMgPSBkb2N1bWVudC0+c3R5bGVTaGVldHMoKS0+dmVj
dG9yKCk7CisgICAgY29uc3QgVmVjdG9yPFJlZlB0cjxTdHlsZVNoZWV0PiA+JiBzdHlsZVNoZWV0
cyA9IHN0eWxlU2hlZXRDb2xsZWN0aW9uLT5hdXRob3JTdHlsZVNoZWV0cygpLT52ZWN0b3IoKTsK
ICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc3R5bGVTaGVldHMuc2l6ZSgpOyArK2kpIHsK
ICAgICAgICAgU3R5bGVTaGVldCogc3R5bGVTaGVldCA9IHN0eWxlU2hlZXRzW2ldLmdldCgpOwog
ICAgICAgICBpZiAoIXN0eWxlU2hlZXQtPmlzQ1NTU3R5bGVTaGVldCgpKQogICAgICAgICAgICAg
Y29udGludWU7CiAgICAgICAgIGNvbGxlY3RDU1NPTVdyYXBwZXJzKHdyYXBwZXJNYXAsIHN0YXRp
Y19jYXN0PENTU1N0eWxlU2hlZXQqPihzdHlsZVNoZWV0KSk7CiAgICAgfQotICAgIGNvbGxlY3RD
U1NPTVdyYXBwZXJzKHdyYXBwZXJNYXAsIGRvY3VtZW50LT5wYWdlVXNlclNoZWV0KCkpOworICAg
IGNvbGxlY3RDU1NPTVdyYXBwZXJzKHdyYXBwZXJNYXAsIHN0eWxlU2hlZXRDb2xsZWN0aW9uLT5w
YWdlVXNlclNoZWV0KCkpOwogICAgIHsKLSAgICAgICAgY29uc3QgVmVjdG9yPFJlZlB0cjxDU1NT
dHlsZVNoZWV0PiA+KiBwYWdlR3JvdXBVc2VyU2hlZXRzID0gZG9jdW1lbnQtPnBhZ2VHcm91cFVz
ZXJTaGVldHMoKTsKKyAgICAgICAgY29uc3QgVmVjdG9yPFJlZlB0cjxDU1NTdHlsZVNoZWV0PiA+
KiBwYWdlR3JvdXBVc2VyU2hlZXRzID0gc3R5bGVTaGVldENvbGxlY3Rpb24tPnBhZ2VHcm91cFVz
ZXJTaGVldHMoKTsKICAgICAgICAgaWYgKHBhZ2VHcm91cFVzZXJTaGVldHMpIHsKICAgICAgICAg
ICAgIGZvciAoc2l6ZV90IGkgPSAwLCBzaXplID0gcGFnZUdyb3VwVXNlclNoZWV0cy0+c2l6ZSgp
OyBpIDwgc2l6ZTsgKytpKQogICAgICAgICAgICAgICAgIGNvbGxlY3RDU1NPTVdyYXBwZXJzKHdy
YXBwZXJNYXAsIHBhZ2VHcm91cFVzZXJTaGVldHMtPmF0KGkpLmdldCgpKTsKICAgICAgICAgfQog
ICAgIH0KICAgICB7Ci0gICAgICAgIGNvbnN0IFZlY3RvcjxSZWZQdHI8Q1NTU3R5bGVTaGVldD4g
PiogZG9jdW1lbnRVc2VyU2hlZXRzID0gZG9jdW1lbnQtPmRvY3VtZW50VXNlclNoZWV0cygpOwor
ICAgICAgICBjb25zdCBWZWN0b3I8UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4qIGRvY3VtZW50VXNl
clNoZWV0cyA9IHN0eWxlU2hlZXRDb2xsZWN0aW9uLT5kb2N1bWVudFVzZXJTaGVldHMoKTsKICAg
ICAgICAgaWYgKGRvY3VtZW50VXNlclNoZWV0cykgewogICAgICAgICAgICAgZm9yIChzaXplX3Qg
aSA9IDAsIHNpemUgPSBkb2N1bWVudFVzZXJTaGVldHMtPnNpemUoKTsgaSA8IHNpemU7ICsraSkK
ICAgICAgICAgICAgICAgICBjb2xsZWN0Q1NTT01XcmFwcGVycyh3cmFwcGVyTWFwLCBkb2N1bWVu
dFVzZXJTaGVldHMtPmF0KGkpLmdldCgpKTsKQEAgLTMyMTgsNyArMzIxMyw3IEBAIENTU1N0eWxl
UnVsZSogU3R5bGVSZXNvbHZlcjo6ZW5zdXJlRnVsbEMKICAgICAgICAgY29sbGVjdENTU09NV3Jh
cHBlcnMobV9zdHlsZVJ1bGVUb0NTU09NV3JhcHBlck1hcCwgbV9zdHlsZVNoZWV0Q1NTT01XcmFw
cGVyU2V0LCBtZWRpYUNvbnRyb2xzU3R5bGVTaGVldCk7CiAgICAgICAgIGNvbGxlY3RDU1NPTVdy
YXBwZXJzKG1fc3R5bGVSdWxlVG9DU1NPTVdyYXBwZXJNYXAsIG1fc3R5bGVTaGVldENTU09NV3Jh
cHBlclNldCwgZnVsbHNjcmVlblN0eWxlU2hlZXQpOwogCi0gICAgICAgIGNvbGxlY3RDU1NPTVdy
YXBwZXJzKG1fc3R5bGVSdWxlVG9DU1NPTVdyYXBwZXJNYXAsIGRvY3VtZW50KCkpOworICAgICAg
ICBjb2xsZWN0Q1NTT01XcmFwcGVycyhtX3N0eWxlUnVsZVRvQ1NTT01XcmFwcGVyTWFwLCBkb2N1
bWVudCgpLT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpKTsKICAgICB9CiAgICAgcmV0dXJuIG1fc3R5
bGVSdWxlVG9DU1NPTVdyYXBwZXJNYXAuZ2V0KHJ1bGUpLmdldCgpOwogfQpJbmRleDogU291cmNl
L1dlYkNvcmUvY3NzL1N0eWxlUmVzb2x2ZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29y
ZS9jc3MvU3R5bGVSZXNvbHZlci5oCShyZXZpc2lvbiAxMjk0MDcpCisrKyBTb3VyY2UvV2ViQ29y
ZS9jc3MvU3R5bGVSZXNvbHZlci5oCSh3b3JraW5nIGNvcHkpCkBAIC0yNDQsNyArMjQ0LDYgQEAg
cHVibGljOgogICAgIGJvb2wgdXNlc1NpYmxpbmdSdWxlcygpIGNvbnN0IHsgcmV0dXJuICFtX2Zl
YXR1cmVzLnNpYmxpbmdSdWxlcy5pc0VtcHR5KCk7IH0KICAgICBib29sIHVzZXNGaXJzdExpbmVS
dWxlcygpIGNvbnN0IHsgcmV0dXJuIG1fZmVhdHVyZXMudXNlc0ZpcnN0TGluZVJ1bGVzOyB9CiAg
ICAgYm9vbCB1c2VzQmVmb3JlQWZ0ZXJSdWxlcygpIGNvbnN0IHsgcmV0dXJuIG1fZmVhdHVyZXMu
dXNlc0JlZm9yZUFmdGVyUnVsZXM7IH0KLSAgICBib29sIHVzZXNMaW5rUnVsZXMoKSBjb25zdCB7
IHJldHVybiBtX2ZlYXR1cmVzLnVzZXNMaW5rUnVsZXM7IH0KIAogICAgIHN0YXRpYyBib29sIGNy
ZWF0ZVRyYW5zZm9ybU9wZXJhdGlvbnMoQ1NTVmFsdWUqIGluVmFsdWUsIFJlbmRlclN0eWxlKiBp
blN0eWxlLCBSZW5kZXJTdHlsZSogcm9vdFN0eWxlLCBUcmFuc2Zvcm1PcGVyYXRpb25zJiBvdXRP
cGVyYXRpb25zKTsKICAgICAKQEAgLTI5Nyw3ICsyOTYsNiBAQCBwdWJsaWM6CiAgICAgICAgIFZl
Y3RvcjxSdWxlRmVhdHVyZT4gdW5jb21tb25BdHRyaWJ1dGVSdWxlczsKICAgICAgICAgYm9vbCB1
c2VzRmlyc3RMaW5lUnVsZXM7CiAgICAgICAgIGJvb2wgdXNlc0JlZm9yZUFmdGVyUnVsZXM7Ci0g
ICAgICAgIGJvb2wgdXNlc0xpbmtSdWxlczsKICAgICB9OwogCiBwcml2YXRlOgpJbmRleDogU291
cmNlL1dlYkNvcmUvZG9tL0RvY3VtZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29y
ZS9kb20vRG9jdW1lbnQuY3BwCShyZXZpc2lvbiAxMjk0MDcpCisrKyBTb3VyY2UvV2ViQ29yZS9k
b20vRG9jdW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01Nyw2ICs1Nyw3IEBACiAjaW5jbHVk
ZSAiRG9jdW1lbnRGcmFnbWVudC5oIgogI2luY2x1ZGUgIkRvY3VtZW50TG9hZGVyLmgiCiAjaW5j
bHVkZSAiRG9jdW1lbnRNYXJrZXJDb250cm9sbGVyLmgiCisjaW5jbHVkZSAiRG9jdW1lbnRTdHls
ZVNoZWV0Q29sbGVjdGlvbi5oIgogI2luY2x1ZGUgIkRvY3VtZW50VHlwZS5oIgogI2luY2x1ZGUg
IkVkaXRpbmdUZXh0LmgiCiAjaW5jbHVkZSAiRWRpdG9yLmgiCkBAIC00MzcsOCArNDM4LDcgQEAg
RG9jdW1lbnQ6OkRvY3VtZW50KEZyYW1lKiBmcmFtZSwgY29uc3QgSwogI2lmIEVOQUJMRShNVVRB
VElPTl9PQlNFUlZFUlMpCiAgICAgLCBtX211dGF0aW9uT2JzZXJ2ZXJUeXBlcygwKQogI2VuZGlm
Ci0gICAgLCBtX3N0eWxlU2hlZXRzKFN0eWxlU2hlZXRMaXN0OjpjcmVhdGUodGhpcykpCi0gICAg
LCBtX2hhZEFjdGl2ZUxvYWRpbmdTdHlsZXNoZWV0KGZhbHNlKQorICAgICwgbV9zdHlsZVNoZWV0
Q29sbGVjdGlvbihhZG9wdFB0cihuZXcgRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbih0aGlz
KSkpCiAgICAgLCBtX3JlYWR5U3RhdGUoQ29tcGxldGUpCiAgICAgLCBtX3N0eWxlUmVjYWxjVGlt
ZXIodGhpcywgJkRvY3VtZW50OjpzdHlsZVJlY2FsY1RpbWVyRmlyZWQpCiAgICAgLCBtX3BlbmRp
bmdTdHlsZVJlY2FsY1Nob3VsZEZvcmNlKGZhbHNlKQpAQCAtNTA0LDggKzUwNCw2IEBAIERvY3Vt
ZW50OjpEb2N1bWVudChGcmFtZSogZnJhbWUsIGNvbnN0IEsKIHsKICAgICBtX2RvY3VtZW50ID0g
dGhpczsKIAotICAgIG1fcGFnZUdyb3VwVXNlclNoZWV0Q2FjaGVWYWxpZCA9IGZhbHNlOwotCiAg
ICAgbV9wcmludGluZyA9IGZhbHNlOwogICAgIG1fcGFnaW5hdGVkRm9yU2NyZWVuID0gZmFsc2U7
CiAKQEAgLTU0MywyMCArNTQxLDkgQEAgRG9jdW1lbnQ6OkRvY3VtZW50KEZyYW1lKiBmcmFtZSwg
Y29uc3QgSwogICAgIG1faW5TdHlsZVJlY2FsYyA9IGZhbHNlOwogICAgIG1fY2xvc2VBZnRlclN0
eWxlUmVjYWxjID0gZmFsc2U7CiAKLSAgICBtX3VzZXNTaWJsaW5nUnVsZXMgPSBmYWxzZTsKLSAg
ICBtX3VzZXNTaWJsaW5nUnVsZXNPdmVycmlkZSA9IGZhbHNlOwotICAgIG1fdXNlc0ZpcnN0TGlu
ZVJ1bGVzID0gZmFsc2U7Ci0gICAgbV91c2VzRmlyc3RMZXR0ZXJSdWxlcyA9IGZhbHNlOwotICAg
IG1fdXNlc0JlZm9yZUFmdGVyUnVsZXMgPSBmYWxzZTsKLSAgICBtX3VzZXNCZWZvcmVBZnRlclJ1
bGVzT3ZlcnJpZGUgPSBmYWxzZTsKLSAgICBtX3VzZXNSZW1Vbml0cyA9IGZhbHNlOwotICAgIG1f
dXNlc0xpbmtSdWxlcyA9IGZhbHNlOwotCiAgICAgbV9nb3RvQW5jaG9yTmVlZGVkQWZ0ZXJTdHls
ZXNoZWV0c0xvYWQgPSBmYWxzZTsKIAogICAgIG1fZGlkQ2FsY3VsYXRlU3R5bGVSZXNvbHZlciA9
IGZhbHNlOwotICAgIG1faGFzRGlydHlTdHlsZVJlc29sdmVyID0gZmFsc2U7Ci0gICAgbV9wZW5k
aW5nU3R5bGVzaGVldHMgPSAwOwogICAgIG1faWdub3JlUGVuZGluZ1N0eWxlc2hlZXRzID0gZmFs
c2U7CiAgICAgbV9uZWVkc05vdGlmeVJlbW92ZUFsbFBlbmRpbmdTdHlsZXNoZWV0ID0gZmFsc2U7
CiAgICAgbV9oYXNOb2Rlc1dpdGhQbGFjZWhvbGRlclN0eWxlID0gZmFsc2U7CkBAIC02NDMsMjQg
KzYzMCwxMyBAQCBEb2N1bWVudDo6fkRvY3VtZW50KCkKIAogICAgIG1fZGVjb2RlciA9IDA7CiAK
LSAgICBpZiAobV9zdHlsZVNoZWV0cykKLSAgICAgICAgbV9zdHlsZVNoZWV0cy0+ZG9jdW1lbnRE
ZXN0cm95ZWQoKTsKKyAgICBtX3N0eWxlU2hlZXRDb2xsZWN0aW9uLmNsZWFyKCk7CiAKICAgICBp
ZiAobV9uYW1lZEZsb3dzKQogICAgICAgICBtX25hbWVkRmxvd3MtPmRvY3VtZW50RGVzdHJveWVk
KCk7CiAKICAgICBpZiAobV9lbGVtU2hlZXQpCiAgICAgICAgIG1fZWxlbVNoZWV0LT5jbGVhck93
bmVyTm9kZSgpOwotICAgIGlmIChtX3BhZ2VVc2VyU2hlZXQpCi0gICAgICAgIG1fcGFnZVVzZXJT
aGVldC0+Y2xlYXJPd25lck5vZGUoKTsKLSAgICBpZiAobV9wYWdlR3JvdXBVc2VyU2hlZXRzKSB7
Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9wYWdlR3JvdXBVc2VyU2hlZXRzLT5z
aXplKCk7ICsraSkKLSAgICAgICAgICAgICgqbV9wYWdlR3JvdXBVc2VyU2hlZXRzKVtpXS0+Y2xl
YXJPd25lck5vZGUoKTsKLSAgICB9Ci0gICAgaWYgKG1fdXNlclNoZWV0cykgewotICAgICAgICBm
b3IgKHNpemVfdCBpID0gMDsgaSA8IG1fdXNlclNoZWV0cy0+c2l6ZSgpOyArK2kpCi0gICAgICAg
ICAgICAoKm1fdXNlclNoZWV0cylbaV0tPmNsZWFyT3duZXJOb2RlKCk7Ci0gICAgfQogCiAgICAg
ZGVsZXRlQ3VzdG9tRm9udHMoKTsKIApAQCAtODAyLDE0ICs3NzgsMTQgQEAgdm9pZCBEb2N1bWVu
dDo6c2V0Q29tcGF0aWJpbGl0eU1vZGUoQ29tcAogewogICAgIGlmIChtX2NvbXBhdGliaWxpdHlN
b2RlTG9ja2VkIHx8IG1vZGUgPT0gbV9jb21wYXRpYmlsaXR5TW9kZSkKICAgICAgICAgcmV0dXJu
OwotICAgIEFTU0VSVCghbV9zdHlsZVNoZWV0cy0+bGVuZ3RoKCkpOworICAgIEFTU0VSVCghbV9z
dHlsZVNoZWV0Q29sbGVjdGlvbi0+YXV0aG9yU3R5bGVTaGVldHMoKS0+bGVuZ3RoKCkpOwogICAg
IGJvb2wgd2FzSW5RdWlya3NNb2RlID0gaW5RdWlya3NNb2RlKCk7CiAgICAgbV9jb21wYXRpYmls
aXR5TW9kZSA9IG1vZGU7CiAgICAgc2VsZWN0b3JRdWVyeUNhY2hlKCktPmludmFsaWRhdGUoKTsK
ICAgICBpZiAoaW5RdWlya3NNb2RlKCkgIT0gd2FzSW5RdWlya3NNb2RlKSB7CiAgICAgICAgIC8v
IEFsbCB1c2VyIHN0eWxlc2hlZXRzIGhhdmUgdG8gcmVwYXJzZSB1c2luZyB0aGUgZGlmZmVyZW50
IG1vZGUuCi0gICAgICAgIGNsZWFyUGFnZVVzZXJTaGVldCgpOwotICAgICAgICBjbGVhclBhZ2VH
cm91cFVzZXJTaGVldHMoKTsKKyAgICAgICAgbV9zdHlsZVNoZWV0Q29sbGVjdGlvbi0+Y2xlYXJQ
YWdlVXNlclNoZWV0KCk7CisgICAgICAgIG1fc3R5bGVTaGVldENvbGxlY3Rpb24tPmNsZWFyUGFn
ZUdyb3VwVXNlclNoZWV0cygpOwogICAgIH0KIH0KIApAQCAtMTgyMiwxMyArMTc5OCwxMyBAQCB2
b2lkIERvY3VtZW50OjpyZWNhbGNTdHlsZShTdHlsZUNoYW5nZSBjCiAgICAgLy8gcmUtYXR0YWNo
aW5nIG91ciBjb250YWluaW5nIGlmcmFtZSwgd2hpY2ggd2hlbiBhc2tlZCBIVE1MRnJhbWVFbGVt
ZW50QmFzZTo6aXNVUkxBbGxvd2VkCiAgICAgLy8gaGl0cyBhIG51bGwtZGVyZWZlcmVuY2UgZHVl
IHRvIHNlY3VyaXR5IGNvZGUgYWx3YXlzIGFzc3VtaW5nIHRoZSBkb2N1bWVudCBoYXMgYSBTZWN1
cml0eU9yaWdpbi4KIAotICAgIGlmIChtX2hhc0RpcnR5U3R5bGVSZXNvbHZlcikKLSAgICAgICAg
dXBkYXRlQWN0aXZlU3R5bGVzaGVldHMoUmVjYWxjU3R5bGVJbW1lZGlhdGVseSk7CisgICAgaWYg
KG1fc3R5bGVTaGVldENvbGxlY3Rpb24tPm5lZWRzVXBkYXRlQWN0aXZlU3R5bGVzaGVldHNPblN0
eWxlUmVjYWxjKCkpCisgICAgICAgIG1fc3R5bGVTaGVldENvbGxlY3Rpb24tPnVwZGF0ZUFjdGl2
ZVN0eWxlU2hlZXRzKERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OkZ1bGxVcGRhdGUpOwog
CiAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2llIGNvb2tpZSA9IEluc3BlY3Rvcklu
c3RydW1lbnRhdGlvbjo6d2lsbFJlY2FsY3VsYXRlU3R5bGUodGhpcyk7CiAKICAgICBpZiAobV9l
bGVtU2hlZXQgJiYgbV9lbGVtU2hlZXQtPmNvbnRlbnRzKCktPnVzZXNSZW1Vbml0cygpKQotICAg
ICAgICBtX3VzZXNSZW1Vbml0cyA9IHRydWU7CisgICAgICAgIG1fc3R5bGVTaGVldENvbGxlY3Rp
b24tPnNldFVzZXNSZW1Vbml0KHRydWUpOwogCiAgICAgbV9pblN0eWxlUmVjYWxjID0gdHJ1ZTsK
ICAgICBzdXNwZW5kUG9zdEF0dGFjaENhbGxiYWNrcygpOwpAQCAtMTg4NSw3ICsxODYxLDcgQEAg
dm9pZCBEb2N1bWVudDo6cmVjYWxjU3R5bGUoU3R5bGVDaGFuZ2UgYwogCiAgICAgICAgIC8vIFBz
ZXVkbyBlbGVtZW50IHJlbW92YWwgYW5kIHNpbWlsYXIgbWF5IG9ubHkgd29yayB3aXRoIHRoZXNl
IGZsYWdzIHN0aWxsIHNldC4gUmVzZXQgdGhlbSBhZnRlciB0aGUgc3R5bGUgcmVjYWxjLgogICAg
ICAgICBpZiAobV9zdHlsZVJlc29sdmVyKQotICAgICAgICAgICAgcmVzZXRDU1NGZWF0dXJlRmxh
Z3MoKTsKKyAgICAgICAgICAgIG1fc3R5bGVTaGVldENvbGxlY3Rpb24tPnJlc2V0Q1NTRmVhdHVy
ZUZsYWdzKCk7CiAKICAgICAgICAgaWYgKGZyYW1lVmlldykgewogICAgICAgICAgICAgZnJhbWVW
aWV3LT5yZXN1bWVTY2hlZHVsZWRFdmVudHMoKTsKQEAgLTIwNjgsMzMgKzIwNDQsMTYgQEAgdm9p
ZCBEb2N1bWVudDo6c2V0SXNWaWV3U291cmNlKGJvb2wgaXNWaQogICAgIGRpZFVwZGF0ZVNlY3Vy
aXR5T3JpZ2luKCk7CiB9CiAKLXZvaWQgRG9jdW1lbnQ6OmNvbWJpbmVDU1NGZWF0dXJlRmxhZ3Mo
KQotewotICAgIC8vIERlbGF5IHJlc2V0dGluZyB0aGUgZmxhZ3MgdW50aWwgYWZ0ZXIgbmV4dCBz
dHlsZSByZWNhbGMgc2luY2UgdW5hcHBseWluZyB0aGUgc3R5bGUgbWF5IG5vdCB3b3JrIHdpdGhv
dXQgdGhlc2Ugc2V0ICh0aGlzIGlzIHRydWUgYXQgbGVhc3Qgd2l0aCBiZWZvcmUvYWZ0ZXIpLgot
ICAgIG1fdXNlc1NpYmxpbmdSdWxlcyA9IG1fdXNlc1NpYmxpbmdSdWxlcyB8fCBtX3N0eWxlUmVz
b2x2ZXItPnVzZXNTaWJsaW5nUnVsZXMoKTsKLSAgICBtX3VzZXNGaXJzdExpbmVSdWxlcyA9IG1f
dXNlc0ZpcnN0TGluZVJ1bGVzIHx8IG1fc3R5bGVSZXNvbHZlci0+dXNlc0ZpcnN0TGluZVJ1bGVz
KCk7Ci0gICAgbV91c2VzQmVmb3JlQWZ0ZXJSdWxlcyA9IG1fdXNlc0JlZm9yZUFmdGVyUnVsZXMg
fHwgbV9zdHlsZVJlc29sdmVyLT51c2VzQmVmb3JlQWZ0ZXJSdWxlcygpOwotICAgIG1fdXNlc0xp
bmtSdWxlcyA9IG1fdXNlc0xpbmtSdWxlcyB8fCBtX3N0eWxlUmVzb2x2ZXItPnVzZXNMaW5rUnVs
ZXMoKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6cmVzZXRDU1NGZWF0dXJlRmxhZ3MoKQotewotICAg
IG1fdXNlc1NpYmxpbmdSdWxlcyA9IG1fc3R5bGVSZXNvbHZlci0+dXNlc1NpYmxpbmdSdWxlcygp
OwotICAgIG1fdXNlc0ZpcnN0TGluZVJ1bGVzID0gbV9zdHlsZVJlc29sdmVyLT51c2VzRmlyc3RM
aW5lUnVsZXMoKTsKLSAgICBtX3VzZXNCZWZvcmVBZnRlclJ1bGVzID0gbV9zdHlsZVJlc29sdmVy
LT51c2VzQmVmb3JlQWZ0ZXJSdWxlcygpOwotICAgIG1fdXNlc0xpbmtSdWxlcyA9IG1fc3R5bGVS
ZXNvbHZlci0+dXNlc0xpbmtSdWxlcygpOwotfQotCiB2b2lkIERvY3VtZW50OjpjcmVhdGVTdHls
ZVJlc29sdmVyKCkKIHsKICAgICBib29sIG1hdGNoQXV0aG9yQW5kVXNlclN0eWxlcyA9IHRydWU7
CiAgICAgaWYgKFNldHRpbmdzKiBkb2NTZXR0aW5ncyA9IHNldHRpbmdzKCkpCiAgICAgICAgIG1h
dGNoQXV0aG9yQW5kVXNlclN0eWxlcyA9IGRvY1NldHRpbmdzLT5hdXRob3JBbmRVc2VyU3R5bGVz
RW5hYmxlZCgpOwogICAgIG1fc3R5bGVSZXNvbHZlciA9IGFkb3B0UHRyKG5ldyBTdHlsZVJlc29s
dmVyKHRoaXMsIG1hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykpOwotICAgIGNvbWJpbmVDU1NGZWF0
dXJlRmxhZ3MoKTsKKyAgICBtX3N0eWxlU2hlZXRDb2xsZWN0aW9uLT5jb21iaW5lQ1NTRmVhdHVy
ZUZsYWdzKCk7CiB9CiAKLWlubGluZSB2b2lkIERvY3VtZW50OjpjbGVhclN0eWxlUmVzb2x2ZXIo
KQordm9pZCBEb2N1bWVudDo6Y2xlYXJTdHlsZVJlc29sdmVyKCkKIHsKICAgICBtX3N0eWxlUmVz
b2x2ZXIuY2xlYXIoKTsKIH0KQEAgLTI5MDQsMTA1ICsyODYzLDIzIEBAIEZyYW1lKiBEb2N1bWVu
dDo6ZmluZFVuc2FmZVBhcmVudFNjcm9sbFAKICAgICByZXR1cm4gMDsKIH0KIAotQ1NTU3R5bGVT
aGVldCogRG9jdW1lbnQ6OnBhZ2VVc2VyU2hlZXQoKQotewotICAgIGlmIChtX3BhZ2VVc2VyU2hl
ZXQpCi0gICAgICAgIHJldHVybiBtX3BhZ2VVc2VyU2hlZXQuZ2V0KCk7Ci0gICAgCi0gICAgUGFn
ZSogb3duaW5nUGFnZSA9IHBhZ2UoKTsKLSAgICBpZiAoIW93bmluZ1BhZ2UpCi0gICAgICAgIHJl
dHVybiAwOwotICAgIAotICAgIFN0cmluZyB1c2VyU2hlZXRUZXh0ID0gb3duaW5nUGFnZS0+dXNl
clN0eWxlU2hlZXQoKTsKLSAgICBpZiAodXNlclNoZWV0VGV4dC5pc0VtcHR5KCkpCi0gICAgICAg
IHJldHVybiAwOwotICAgIAotICAgIC8vIFBhcnNlIHRoZSBzaGVldCBhbmQgY2FjaGUgaXQuCi0g
ICAgbV9wYWdlVXNlclNoZWV0ID0gQ1NTU3R5bGVTaGVldDo6Y3JlYXRlSW5saW5lKHRoaXMsIHNl
dHRpbmdzKCktPnVzZXJTdHlsZVNoZWV0TG9jYXRpb24oKSk7Ci0gICAgbV9wYWdlVXNlclNoZWV0
LT5jb250ZW50cygpLT5zZXRJc1VzZXJTdHlsZVNoZWV0KHRydWUpOwotICAgIG1fcGFnZVVzZXJT
aGVldC0+Y29udGVudHMoKS0+cGFyc2VTdHJpbmcodXNlclNoZWV0VGV4dCk7Ci0gICAgcmV0dXJu
IG1fcGFnZVVzZXJTaGVldC5nZXQoKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6Y2xlYXJQYWdlVXNl
clNoZWV0KCkKLXsKLSAgICBpZiAobV9wYWdlVXNlclNoZWV0KSB7Ci0gICAgICAgIG1fcGFnZVVz
ZXJTaGVldCA9IDA7Ci0gICAgICAgIHN0eWxlUmVzb2x2ZXJDaGFuZ2VkKERlZmVyUmVjYWxjU3R5
bGUpOwotICAgIH0KLX0KLQotdm9pZCBEb2N1bWVudDo6dXBkYXRlUGFnZVVzZXJTaGVldCgpCi17
Ci0gICAgY2xlYXJQYWdlVXNlclNoZWV0KCk7Ci0gICAgaWYgKHBhZ2VVc2VyU2hlZXQoKSkKLSAg
ICAgICAgc3R5bGVSZXNvbHZlckNoYW5nZWQoUmVjYWxjU3R5bGVJbW1lZGlhdGVseSk7Ci19CiAK
LWNvbnN0IFZlY3RvcjxSZWZQdHI8Q1NTU3R5bGVTaGVldD4gPiogRG9jdW1lbnQ6OnBhZ2VHcm91
cFVzZXJTaGVldHMoKSBjb25zdAordm9pZCBEb2N1bWVudDo6c2VhbWxlc3NQYXJlbnRVcGRhdGVk
U3R5bGVzaGVldHMoKQogewotICAgIGlmIChtX3BhZ2VHcm91cFVzZXJTaGVldENhY2hlVmFsaWQp
Ci0gICAgICAgIHJldHVybiBtX3BhZ2VHcm91cFVzZXJTaGVldHMuZ2V0KCk7Ci0gICAgCi0gICAg
bV9wYWdlR3JvdXBVc2VyU2hlZXRDYWNoZVZhbGlkID0gdHJ1ZTsKLSAgICAKLSAgICBQYWdlKiBv
d25pbmdQYWdlID0gcGFnZSgpOwotICAgIGlmICghb3duaW5nUGFnZSkKLSAgICAgICAgcmV0dXJu
IDA7Ci0gICAgICAgIAotICAgIGNvbnN0IFBhZ2VHcm91cCYgcGFnZUdyb3VwID0gb3duaW5nUGFn
ZS0+Z3JvdXAoKTsKLSAgICBjb25zdCBVc2VyU3R5bGVTaGVldE1hcCogc2hlZXRzTWFwID0gcGFn
ZUdyb3VwLnVzZXJTdHlsZVNoZWV0cygpOwotICAgIGlmICghc2hlZXRzTWFwKQotICAgICAgICBy
ZXR1cm4gMDsKLQotICAgIFVzZXJTdHlsZVNoZWV0TWFwOjpjb25zdF9pdGVyYXRvciBlbmQgPSBz
aGVldHNNYXAtPmVuZCgpOwotICAgIGZvciAoVXNlclN0eWxlU2hlZXRNYXA6OmNvbnN0X2l0ZXJh
dG9yIGl0ID0gc2hlZXRzTWFwLT5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAg
Y29uc3QgVXNlclN0eWxlU2hlZXRWZWN0b3IqIHNoZWV0cyA9IGl0LT5zZWNvbmQuZ2V0KCk7Ci0g
ICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzaGVldHMtPnNpemUoKTsgKytpKSB7Ci0g
ICAgICAgICAgICBjb25zdCBVc2VyU3R5bGVTaGVldCogc2hlZXQgPSBzaGVldHMtPmF0KGkpLmdl
dCgpOwotICAgICAgICAgICAgaWYgKHNoZWV0LT5pbmplY3RlZEZyYW1lcygpID09IEluamVjdElu
VG9wRnJhbWVPbmx5ICYmIG93bmVyRWxlbWVudCgpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVl
OwotICAgICAgICAgICAgaWYgKCFVc2VyQ29udGVudFVSTFBhdHRlcm46Om1hdGNoZXNQYXR0ZXJu
cyh1cmwoKSwgc2hlZXQtPndoaXRlbGlzdCgpLCBzaGVldC0+YmxhY2tsaXN0KCkpKQotICAgICAg
ICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgUmVmUHRyPENTU1N0eWxlU2hlZXQ+IGdy
b3VwU2hlZXQgPSBDU1NTdHlsZVNoZWV0OjpjcmVhdGVJbmxpbmUoY29uc3RfY2FzdDxEb2N1bWVu
dCo+KHRoaXMpLCBzaGVldC0+dXJsKCkpOwotICAgICAgICAgICAgaWYgKCFtX3BhZ2VHcm91cFVz
ZXJTaGVldHMpCi0gICAgICAgICAgICAgICAgbV9wYWdlR3JvdXBVc2VyU2hlZXRzID0gYWRvcHRQ
dHIobmV3IFZlY3RvcjxSZWZQdHI8Q1NTU3R5bGVTaGVldD4gPik7Ci0gICAgICAgICAgICBtX3Bh
Z2VHcm91cFVzZXJTaGVldHMtPmFwcGVuZChncm91cFNoZWV0KTsKLSAgICAgICAgICAgIGdyb3Vw
U2hlZXQtPmNvbnRlbnRzKCktPnNldElzVXNlclN0eWxlU2hlZXQoc2hlZXQtPmxldmVsKCkgPT0g
VXNlclN0eWxlVXNlckxldmVsKTsKLSAgICAgICAgICAgIGdyb3VwU2hlZXQtPmNvbnRlbnRzKCkt
PnBhcnNlU3RyaW5nKHNoZWV0LT5zb3VyY2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBy
ZXR1cm4gbV9wYWdlR3JvdXBVc2VyU2hlZXRzLmdldCgpOworICAgIHN0eWxlUmVzb2x2ZXJDaGFu
Z2VkKFJlY2FsY1N0eWxlSW1tZWRpYXRlbHkpOwogfQogCi12b2lkIERvY3VtZW50OjpjbGVhclBh
Z2VHcm91cFVzZXJTaGVldHMoKQordm9pZCBEb2N1bWVudDo6ZGlkUmVtb3ZlQWxsUGVuZGluZ1N0
eWxlc2hlZXQoKQogewotICAgIG1fcGFnZUdyb3VwVXNlclNoZWV0Q2FjaGVWYWxpZCA9IGZhbHNl
OwotICAgIGlmIChtX3BhZ2VHcm91cFVzZXJTaGVldHMgJiYgbV9wYWdlR3JvdXBVc2VyU2hlZXRz
LT5zaXplKCkpIHsKLSAgICAgICAgbV9wYWdlR3JvdXBVc2VyU2hlZXRzLT5jbGVhcigpOwotICAg
ICAgICBzdHlsZVJlc29sdmVyQ2hhbmdlZChEZWZlclJlY2FsY1N0eWxlKTsKLSAgICB9Ci19Cisg
ICAgbV9uZWVkc05vdGlmeVJlbW92ZUFsbFBlbmRpbmdTdHlsZXNoZWV0ID0gZmFsc2U7CiAKLXZv
aWQgRG9jdW1lbnQ6OnVwZGF0ZVBhZ2VHcm91cFVzZXJTaGVldHMoKQotewotICAgIGNsZWFyUGFn
ZUdyb3VwVXNlclNoZWV0cygpOwotICAgIGlmIChwYWdlR3JvdXBVc2VyU2hlZXRzKCkgJiYgcGFn
ZUdyb3VwVXNlclNoZWV0cygpLT5zaXplKCkpCi0gICAgICAgIHN0eWxlUmVzb2x2ZXJDaGFuZ2Vk
KFJlY2FsY1N0eWxlSW1tZWRpYXRlbHkpOwotfQorICAgIHN0eWxlUmVzb2x2ZXJDaGFuZ2VkKFJl
Y2FsY1N0eWxlSWZOZWVkZWQpOwogCi12b2lkIERvY3VtZW50OjphZGRVc2VyU2hlZXQoUGFzc1Jl
ZlB0cjxTdHlsZVNoZWV0Q29udGVudHM+IHVzZXJTaGVldCkKLXsKLSAgICBpZiAoIW1fdXNlclNo
ZWV0cykKLSAgICAgICAgbV91c2VyU2hlZXRzID0gYWRvcHRQdHIobmV3IFZlY3RvcjxSZWZQdHI8
Q1NTU3R5bGVTaGVldD4gPik7Ci0gICAgbV91c2VyU2hlZXRzLT5hcHBlbmQoQ1NTU3R5bGVTaGVl
dDo6Y3JlYXRlKHVzZXJTaGVldCwgdGhpcykpOwotICAgIHN0eWxlUmVzb2x2ZXJDaGFuZ2VkKFJl
Y2FsY1N0eWxlSW1tZWRpYXRlbHkpOwotfQorICAgIGlmIChTY3JpcHRhYmxlRG9jdW1lbnRQYXJz
ZXIqIHBhcnNlciA9IHNjcmlwdGFibGVEb2N1bWVudFBhcnNlcigpKQorICAgICAgICBwYXJzZXIt
PmV4ZWN1dGVTY3JpcHRzV2FpdGluZ0ZvclN0eWxlc2hlZXRzKCk7CiAKLXZvaWQgRG9jdW1lbnQ6
OnNlYW1sZXNzUGFyZW50VXBkYXRlZFN0eWxlc2hlZXRzKCkKLXsKLSAgICBzdHlsZVJlc29sdmVy
Q2hhbmdlZChSZWNhbGNTdHlsZUltbWVkaWF0ZWx5KTsKKyAgICBpZiAobV9nb3RvQW5jaG9yTmVl
ZGVkQWZ0ZXJTdHlsZXNoZWV0c0xvYWQgJiYgdmlldygpKQorICAgICAgICB2aWV3KCktPnNjcm9s
bFRvRnJhZ21lbnQobV91cmwpOwogfQogCiBDU1NTdHlsZVNoZWV0KiBEb2N1bWVudDo6ZWxlbWVu
dFNoZWV0KCkKQEAgLTMwNDMsOCArMjkyMCw4IEBAIHZvaWQgRG9jdW1lbnQ6OnByb2Nlc3NIdHRw
RXF1aXYoY29uc3QgU3QKICAgICAgICAgLy8gRm9yIG1vcmUgaW5mbywgc2VlIHRoZSB0ZXN0IGF0
OgogICAgICAgICAvLyBodHRwOi8vd3d3LmhpeGllLmNoL3Rlc3RzL2V2aWwvY3NzL2ltcG9ydC9t
YWluL3ByZWZlcnJlZC5odG1sCiAgICAgICAgIC8vIC1kd2gKLSAgICAgICAgbV9zZWxlY3RlZFN0
eWxlc2hlZXRTZXQgPSBjb250ZW50OwotICAgICAgICBtX3ByZWZlcnJlZFN0eWxlc2hlZXRTZXQg
PSBjb250ZW50OworICAgICAgICBtX3N0eWxlU2hlZXRDb2xsZWN0aW9uLT5zZXRTZWxlY3RlZFN0
eWxlc2hlZXRTZXROYW1lKGNvbnRlbnQpOworICAgICAgICBtX3N0eWxlU2hlZXRDb2xsZWN0aW9u
LT5zZXRQcmVmZXJyZWRTdHlsZXNoZWV0U2V0TmFtZShjb250ZW50KTsKICAgICAgICAgc3R5bGVS
ZXNvbHZlckNoYW5nZWQoRGVmZXJSZWNhbGNTdHlsZSk7CiAgICAgfSBlbHNlIGlmIChlcXVhbEln
bm9yaW5nQ2FzZShlcXVpdiwgInJlZnJlc2giKSkgewogICAgICAgICBkb3VibGUgZGVsYXk7CkBA
IC0zMzE2LDYzICszMTkzLDI1IEBAIFBhc3NSZWZQdHI8Tm9kZT4gRG9jdW1lbnQ6OmNsb25lTm9k
ZShib28KIAogU3R5bGVTaGVldExpc3QqIERvY3VtZW50OjpzdHlsZVNoZWV0cygpCiB7Ci0gICAg
cmV0dXJuIG1fc3R5bGVTaGVldHMuZ2V0KCk7CisgICAgcmV0dXJuIG1fc3R5bGVTaGVldENvbGxl
Y3Rpb24tPmF1dGhvclN0eWxlU2hlZXRzKCk7CiB9CiAKIFN0cmluZyBEb2N1bWVudDo6cHJlZmVy
cmVkU3R5bGVzaGVldFNldCgpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIG1fcHJlZmVycmVkU3R5bGVz
aGVldFNldDsKKyAgICByZXR1cm4gbV9zdHlsZVNoZWV0Q29sbGVjdGlvbi0+cHJlZmVycmVkU3R5
bGVzaGVldFNldE5hbWUoKTsKIH0KIAogU3RyaW5nIERvY3VtZW50OjpzZWxlY3RlZFN0eWxlc2hl
ZXRTZXQoKSBjb25zdAogewotICAgIHJldHVybiBtX3NlbGVjdGVkU3R5bGVzaGVldFNldDsKKyAg
ICByZXR1cm4gbV9zdHlsZVNoZWV0Q29sbGVjdGlvbi0+c2VsZWN0ZWRTdHlsZXNoZWV0U2V0TmFt
ZSgpOwogfQogCiB2b2lkIERvY3VtZW50OjpzZXRTZWxlY3RlZFN0eWxlc2hlZXRTZXQoY29uc3Qg
U3RyaW5nJiBhU3RyaW5nKQogewotICAgIG1fc2VsZWN0ZWRTdHlsZXNoZWV0U2V0ID0gYVN0cmlu
ZzsKKyAgICBtX3N0eWxlU2hlZXRDb2xsZWN0aW9uLT5zZXRTZWxlY3RlZFN0eWxlc2hlZXRTZXRO
YW1lKGFTdHJpbmcpOwogICAgIHN0eWxlUmVzb2x2ZXJDaGFuZ2VkKERlZmVyUmVjYWxjU3R5bGUp
OwogfQogCi0vLyBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbmV2ZXIgYSB0b3AtbGV2ZWwgc3R5
bGVzaGVldCBoYXMgZmluaXNoZWQgbG9hZGluZy4KLXZvaWQgRG9jdW1lbnQ6OnJlbW92ZVBlbmRp
bmdTaGVldChSZW1vdmVQZW5kaW5nU2hlZXROb3RpZmljYXRpb25UeXBlIG5vdGlmaWNhdGlvbikK
LXsKLSAgICAvLyBNYWtlIHN1cmUgd2Uga25ldyB0aGlzIHNoZWV0IHdhcyBwZW5kaW5nLCBhbmQg
dGhhdCBvdXIgY291bnQgaXNuJ3Qgb3V0IG9mIHN5bmMuCi0gICAgQVNTRVJUKG1fcGVuZGluZ1N0
eWxlc2hlZXRzID4gMCk7Ci0KLSAgICBtX3BlbmRpbmdTdHlsZXNoZWV0cy0tOwotICAgIAotI2lm
ZGVmIElOU1RSVU1FTlRfTEFZT1VUX1NDSEVEVUxJTkcKLSAgICBpZiAoIW93bmVyRWxlbWVudCgp
KQotICAgICAgICBwcmludGYoIlN0eWxlc2hlZXQgbG9hZGVkIGF0IHRpbWUgJWQuICVkIHN0eWxl
c2hlZXRzIHN0aWxsIHJlbWFpbi5cbiIsIGVsYXBzZWRUaW1lKCksIG1fcGVuZGluZ1N0eWxlc2hl
ZXRzKTsKLSNlbmRpZgotCi0gICAgaWYgKG1fcGVuZGluZ1N0eWxlc2hlZXRzKQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBpZiAobm90aWZpY2F0aW9uID09IFJlbW92ZVBlbmRpbmdTaGVldE5vdGlm
eUxhdGVyKSB7Ci0gICAgICAgIHNldE5lZWRzTm90aWZ5UmVtb3ZlQWxsUGVuZGluZ1N0eWxlc2hl
ZXQoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICBkaWRSZW1vdmVBbGxQZW5k
aW5nU3R5bGVzaGVldCgpOwotfQotCi12b2lkIERvY3VtZW50OjpkaWRSZW1vdmVBbGxQZW5kaW5n
U3R5bGVzaGVldCgpCi17Ci0gICAgbV9uZWVkc05vdGlmeVJlbW92ZUFsbFBlbmRpbmdTdHlsZXNo
ZWV0ID0gZmFsc2U7Ci0KLSAgICBzdHlsZVJlc29sdmVyQ2hhbmdlZChSZWNhbGNTdHlsZUlmTmVl
ZGVkKTsKLQotICAgIGlmIChTY3JpcHRhYmxlRG9jdW1lbnRQYXJzZXIqIHBhcnNlciA9IHNjcmlw
dGFibGVEb2N1bWVudFBhcnNlcigpKQotICAgICAgICBwYXJzZXItPmV4ZWN1dGVTY3JpcHRzV2Fp
dGluZ0ZvclN0eWxlc2hlZXRzKCk7Ci0KLSAgICBpZiAobV9nb3RvQW5jaG9yTmVlZGVkQWZ0ZXJT
dHlsZXNoZWV0c0xvYWQgJiYgdmlldygpKQotICAgICAgICB2aWV3KCktPnNjcm9sbFRvRnJhZ21l
bnQobV91cmwpOwotfQotCi0KIHZvaWQgRG9jdW1lbnQ6OmV2YWx1YXRlTWVkaWFRdWVyeUxpc3Qo
KQogewogICAgIGlmIChtX21lZGlhUXVlcnlNYXRjaGVyKQpAQCAtMzM4NywyMCArMzIyNiwyNCBA
QCB2b2lkIERvY3VtZW50OjpzdHlsZVJlc29sdmVyQ2hhbmdlZChTdHlsCiAgICAgICAgIG1fc3R5
bGVSZXNvbHZlci5jbGVhcigpOwogICAgICAgICByZXR1cm47CiAgICAgfQorICAgIG1fZGlkQ2Fs
Y3VsYXRlU3R5bGVSZXNvbHZlciA9IHRydWU7CiAKICNpZmRlZiBJTlNUUlVNRU5UX0xBWU9VVF9T
Q0hFRFVMSU5HCiAgICAgaWYgKCFvd25lckVsZW1lbnQoKSkKICAgICAgICAgcHJpbnRmKCJCZWdp
bm5pbmcgdXBkYXRlIG9mIHN0eWxlIHNlbGVjdG9yIGF0IHRpbWUgJWQuXG4iLCBlbGFwc2VkVGlt
ZSgpKTsKICNlbmRpZgogCi0gICAgYm9vbCBzdHlsZXNoZWV0Q2hhbmdlUmVxdWlyZXNTdHlsZVJl
Y2FsYyA9IHVwZGF0ZUFjdGl2ZVN0eWxlc2hlZXRzKHVwZGF0ZUZsYWcpOworICAgIERvY3VtZW50
U3R5bGVTaGVldENvbGxlY3Rpb246OlVwZGF0ZUZsYWcgc3R5bGVTaGVldFVwZGF0ZSA9ICh1cGRh
dGVGbGFnID09IFJlY2FsY1N0eWxlSWZOZWVkZWQpCisgICAgICAgID8gRG9jdW1lbnRTdHlsZVNo
ZWV0Q29sbGVjdGlvbjo6T3B0aW1pemVkVXBkYXRlCisgICAgICAgIDogRG9jdW1lbnRTdHlsZVNo
ZWV0Q29sbGVjdGlvbjo6RnVsbFVwZGF0ZTsKKyAgICBib29sIHN0eWxlc2hlZXRDaGFuZ2VSZXF1
aXJlc1N0eWxlUmVjYWxjID0gbV9zdHlsZVNoZWV0Q29sbGVjdGlvbi0+dXBkYXRlQWN0aXZlU3R5
bGVTaGVldHMoc3R5bGVTaGVldFVwZGF0ZSk7CiAKICAgICBpZiAodXBkYXRlRmxhZyA9PSBEZWZl
clJlY2FsY1N0eWxlKSB7CiAgICAgICAgIHNjaGVkdWxlRm9yY2VkU3R5bGVSZWNhbGMoKTsKICAg
ICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGlmIChkaWRMYXlvdXRXaXRoUGVuZGluZ1N0eWxl
c2hlZXRzKCkgJiYgbV9wZW5kaW5nU3R5bGVzaGVldHMgPD0gMCkgeworICAgIGlmIChkaWRMYXlv
dXRXaXRoUGVuZGluZ1N0eWxlc2hlZXRzKCkgJiYgIW1fc3R5bGVTaGVldENvbGxlY3Rpb24tPmhh
c1BlbmRpbmdTaGVldHMoKSkgewogICAgICAgICBtX3BlbmRpbmdTaGVldExheW91dCA9IElnbm9y
ZUxheW91dFdpdGhQZW5kaW5nU2hlZXRzOwogICAgICAgICBpZiAocmVuZGVyZXIoKSkKICAgICAg
ICAgICAgIHJlbmRlcmVyKCktPnJlcGFpbnQoKTsKQEAgLTM0MzAsMjE5ICszMjczLDYgQEAgdm9p
ZCBEb2N1bWVudDo6c3R5bGVSZXNvbHZlckNoYW5nZWQoU3R5bAogICAgIGV2YWx1YXRlTWVkaWFR
dWVyeUxpc3QoKTsKIH0KIAotdm9pZCBEb2N1bWVudDo6YWRkU3R5bGVTaGVldENhbmRpZGF0ZU5v
ZGUoTm9kZSogbm9kZSwgYm9vbCBjcmVhdGVkQnlQYXJzZXIpCi17Ci0gICAgaWYgKCFub2RlLT5p
bkRvY3VtZW50KCkpCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICAvLyBVbnRpbCB0aGUgPGJv
ZHk+IGV4aXN0cywgd2UgaGF2ZSBubyBjaG9pY2UgYnV0IHRvIGNvbXBhcmUgZG9jdW1lbnQgcG9z
aXRpb25zLAotICAgIC8vIHNpbmNlIHN0eWxlcyBvdXRzaWRlIG9mIHRoZSBib2R5IGFuZCBoZWFk
IGNvbnRpbnVlIHRvIGJlIHNodW50ZWQgaW50byB0aGUgaGVhZAotICAgIC8vIChhbmQgdGh1cyBj
YW4gc2hpZnQgdG8gZW5kIHVwIGJlZm9yZSBkeW5hbWljYWxseSBhZGRlZCBET00gY29udGVudCB0
aGF0IGlzIGFsc28KLSAgICAvLyBvdXRzaWRlIHRoZSBib2R5KS4KLSAgICBpZiAoKGNyZWF0ZWRC
eVBhcnNlciAmJiBib2R5KCkpIHx8IG1fc3R5bGVTaGVldENhbmRpZGF0ZU5vZGVzLmlzRW1wdHko
KSkgewotICAgICAgICBtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcy5hZGQobm9kZSk7Ci0gICAg
ICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBEZXRlcm1pbmUgYW4gYXBwcm9wcmlhdGUgaW5z
ZXJ0aW9uIHBvaW50LgotICAgIFN0eWxlU2hlZXRDYW5kaWRhdGVMaXN0SGFzaFNldDo6aXRlcmF0
b3IgYmVnaW4gPSBtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcy5iZWdpbigpOwotICAgIFN0eWxl
U2hlZXRDYW5kaWRhdGVMaXN0SGFzaFNldDo6aXRlcmF0b3IgZW5kID0gbV9zdHlsZVNoZWV0Q2Fu
ZGlkYXRlTm9kZXMuZW5kKCk7Ci0gICAgU3R5bGVTaGVldENhbmRpZGF0ZUxpc3RIYXNoU2V0Ojpp
dGVyYXRvciBpdCA9IGVuZDsKLSAgICBOb2RlKiBmb2xsb3dpbmdOb2RlID0gMDsKLSAgICBkbyB7
Ci0gICAgICAgIC0taXQ7Ci0gICAgICAgIE5vZGUqIG4gPSAqaXQ7Ci0gICAgICAgIHVuc2lnbmVk
IHNob3J0IHBvc2l0aW9uID0gbi0+Y29tcGFyZURvY3VtZW50UG9zaXRpb24obm9kZSk7Ci0gICAg
ICAgIGlmIChwb3NpdGlvbiA9PSBET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkcpIHsKLSAgICAg
ICAgICAgIG1fc3R5bGVTaGVldENhbmRpZGF0ZU5vZGVzLmluc2VydEJlZm9yZShmb2xsb3dpbmdO
b2RlLCBub2RlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmb2xs
b3dpbmdOb2RlID0gbjsKLSAgICB9IHdoaWxlIChpdCAhPSBiZWdpbik7Ci0gICAgCi0gICAgbV9z
dHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMuaW5zZXJ0QmVmb3JlKGZvbGxvd2luZ05vZGUsIG5vZGUp
OwotfQotCi12b2lkIERvY3VtZW50OjpyZW1vdmVTdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZShOb2Rl
KiBub2RlKQotewotICAgIG1fc3R5bGVTaGVldENhbmRpZGF0ZU5vZGVzLnJlbW92ZShub2RlKTsK
LX0KLQotdm9pZCBEb2N1bWVudDo6Y29sbGVjdEFjdGl2ZVN0eWxlc2hlZXRzKFZlY3RvcjxSZWZQ
dHI8U3R5bGVTaGVldD4gPiYgc2hlZXRzKQotewotICAgIGlmIChzZXR0aW5ncygpICYmICFzZXR0
aW5ncygpLT5hdXRob3JBbmRVc2VyU3R5bGVzRW5hYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0K
LSAgICBTdHlsZVNoZWV0Q2FuZGlkYXRlTGlzdEhhc2hTZXQ6Oml0ZXJhdG9yIGJlZ2luID0gbV9z
dHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMuYmVnaW4oKTsKLSAgICBTdHlsZVNoZWV0Q2FuZGlkYXRl
TGlzdEhhc2hTZXQ6Oml0ZXJhdG9yIGVuZCA9IG1fc3R5bGVTaGVldENhbmRpZGF0ZU5vZGVzLmVu
ZCgpOwotICAgIGZvciAoU3R5bGVTaGVldENhbmRpZGF0ZUxpc3RIYXNoU2V0OjppdGVyYXRvciBp
dCA9IGJlZ2luOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgTm9kZSogbiA9ICppdDsKLSAg
ICAgICAgU3R5bGVTaGVldCogc2hlZXQgPSAwOwotICAgICAgICBpZiAobi0+bm9kZVR5cGUoKSA9
PSBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUpIHsKLSAgICAgICAgICAgIC8vIFByb2Nlc3Np
bmcgaW5zdHJ1Y3Rpb24gKFhNTCBkb2N1bWVudHMgb25seSkuCi0gICAgICAgICAgICAvLyBXZSBk
b24ndCBzdXBwb3J0IGxpbmtpbmcgdG8gZW1iZWRkZWQgQ1NTIHN0eWxlc2hlZXRzLCBzZWUgPGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00OTI4MT4gZm9yIGRpc2N1c3Np
b24uCi0gICAgICAgICAgICBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24qIHBpID0gc3RhdGljX2Nhc3Q8
UHJvY2Vzc2luZ0luc3RydWN0aW9uKj4obik7Ci0gICAgICAgICAgICBzaGVldCA9IHBpLT5zaGVl
dCgpOwotI2lmIEVOQUJMRShYU0xUKQotICAgICAgICAgICAgLy8gRG9uJ3QgYXBwbHkgWFNMIHRy
YW5zZm9ybXMgdG8gYWxyZWFkeSB0cmFuc2Zvcm1lZCBkb2N1bWVudHMgLS0gPHJkYXI6Ly9wcm9i
bGVtLzQxMzI4MDY+Ci0gICAgICAgICAgICBpZiAocGktPmlzWFNMKCkgJiYgIXRyYW5zZm9ybVNv
dXJjZURvY3VtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAvLyBEb24ndCBhcHBseSBYU0wgdHJh
bnNmb3JtcyB1bnRpbCBsb2FkaW5nIGlzIGZpbmlzaGVkLgotICAgICAgICAgICAgICAgIGlmICgh
cGFyc2luZygpKQotICAgICAgICAgICAgICAgICAgICBhcHBseVhTTFRyYW5zZm9ybShwaSk7Ci0g
ICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIH0g
ZWxzZSBpZiAoKG4tPmlzSFRNTEVsZW1lbnQoKSAmJiAobi0+aGFzVGFnTmFtZShsaW5rVGFnKSB8
fCBuLT5oYXNUYWdOYW1lKHN0eWxlVGFnKSkpCi0jaWYgRU5BQkxFKFNWRykKLSAgICAgICAgICAg
ICAgICAgICB8fCAgKG4tPmlzU1ZHRWxlbWVudCgpICYmIG4tPmhhc1RhZ05hbWUoU1ZHTmFtZXM6
OnN0eWxlVGFnKSkKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICkgewotICAgICAgICAgICAg
RWxlbWVudCogZSA9IHN0YXRpY19jYXN0PEVsZW1lbnQqPihuKTsKLSAgICAgICAgICAgIEF0b21p
Y1N0cmluZyB0aXRsZSA9IGUtPmdldEF0dHJpYnV0ZSh0aXRsZUF0dHIpOwotICAgICAgICAgICAg
Ym9vbCBlbmFibGVkVmlhU2NyaXB0ID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAoZS0+aGFzTG9j
YWxOYW1lKGxpbmtUYWcpKSB7Ci0gICAgICAgICAgICAgICAgLy8gPExJTks+IGVsZW1lbnQKLSAg
ICAgICAgICAgICAgICBIVE1MTGlua0VsZW1lbnQqIGxpbmtFbGVtZW50ID0gc3RhdGljX2Nhc3Q8
SFRNTExpbmtFbGVtZW50Kj4obik7Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmtFbGVtZW50LT5p
c0Rpc2FibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAg
ICAgIGVuYWJsZWRWaWFTY3JpcHQgPSBsaW5rRWxlbWVudC0+aXNFbmFibGVkVmlhU2NyaXB0KCk7
Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmtFbGVtZW50LT5zdHlsZVNoZWV0SXNMb2FkaW5nKCkp
IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaXQgaXMgbG9hZGluZyBidXQgd2Ugc2hvdWxkIHN0
aWxsIGRlY2lkZSB3aGljaCBzdHlsZSBzaGVldCBzZXQgdG8gdXNlCi0gICAgICAgICAgICAgICAg
ICAgIGlmICghZW5hYmxlZFZpYVNjcmlwdCAmJiAhdGl0bGUuaXNFbXB0eSgpICYmIG1fcHJlZmVy
cmVkU3R5bGVzaGVldFNldC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNv
bnN0IEF0b21pY1N0cmluZyYgcmVsID0gZS0+Z2V0QXR0cmlidXRlKHJlbEF0dHIpOwotICAgICAg
ICAgICAgICAgICAgICAgICAgaWYgKCFyZWwuY29udGFpbnMoImFsdGVybmF0ZSIpKSB7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgbV9wcmVmZXJyZWRTdHlsZXNoZWV0U2V0ID0gdGl0bGU7
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zZWxlY3RlZFN0eWxlc2hlZXRTZXQgPSB0
aXRsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAg
ICAgICAgICAgaWYgKCFsaW5rRWxlbWVudC0+c2hlZXQoKSkKLSAgICAgICAgICAgICAgICAgICAg
dGl0bGUgPSBudWxsQXRvbTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEdldCB0aGUg
Y3VycmVudCBwcmVmZXJyZWQgc3R5bGVzZXQuICBUaGlzIGlzIHRoZQotICAgICAgICAgICAgLy8g
c2V0IG9mIHNoZWV0cyB0aGF0IHdpbGwgYmUgZW5hYmxlZC4KLSNpZiBFTkFCTEUoU1ZHKQotICAg
ICAgICAgICAgaWYgKG4tPmlzU1ZHRWxlbWVudCgpICYmIG4tPmhhc1RhZ05hbWUoU1ZHTmFtZXM6
OnN0eWxlVGFnKSkKLSAgICAgICAgICAgICAgICBzaGVldCA9IHN0YXRpY19jYXN0PFNWR1N0eWxl
RWxlbWVudCo+KG4pLT5zaGVldCgpOwotICAgICAgICAgICAgZWxzZQotI2VuZGlmCi0gICAgICAg
ICAgICBpZiAoZS0+aGFzTG9jYWxOYW1lKGxpbmtUYWcpKQotICAgICAgICAgICAgICAgIHNoZWV0
ID0gc3RhdGljX2Nhc3Q8SFRNTExpbmtFbGVtZW50Kj4obiktPnNoZWV0KCk7Ci0gICAgICAgICAg
ICBlbHNlCi0gICAgICAgICAgICAgICAgLy8gPFNUWUxFPiBlbGVtZW50Ci0gICAgICAgICAgICAg
ICAgc2hlZXQgPSBzdGF0aWNfY2FzdDxIVE1MU3R5bGVFbGVtZW50Kj4obiktPnNoZWV0KCk7Ci0g
ICAgICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBzaGVldCBiZWxvbmdzIHRvIGEgc3R5
bGVzZXQKLSAgICAgICAgICAgIC8vICh0aHVzIG1ha2luZyBpdCBQUkVGRVJSRUQgb3IgQUxURVJO
QVRFIHJhdGhlciB0aGFuCi0gICAgICAgICAgICAvLyBQRVJTSVNURU5UKS4KLSAgICAgICAgICAg
IEF0b21pY1N0cmluZyByZWwgPSBlLT5nZXRBdHRyaWJ1dGUocmVsQXR0cik7Ci0gICAgICAgICAg
ICBpZiAoIWVuYWJsZWRWaWFTY3JpcHQgJiYgIXRpdGxlLmlzRW1wdHkoKSkgewotICAgICAgICAg
ICAgICAgIC8vIFllcywgd2UgaGF2ZSBhIHRpdGxlLgotICAgICAgICAgICAgICAgIGlmIChtX3By
ZWZlcnJlZFN0eWxlc2hlZXRTZXQuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8v
IE5vIHByZWZlcnJlZCBzZXQgaGFzIGJlZW4gZXN0YWJsaXNoZWQuICBJZgotICAgICAgICAgICAg
ICAgICAgICAvLyB3ZSBhcmUgTk9UIGFuIGFsdGVybmF0ZSBzaGVldCwgdGhlbiBlc3RhYmxpc2gK
LSAgICAgICAgICAgICAgICAgICAgLy8gdXMgYXMgdGhlIHByZWZlcnJlZCBzZXQuICBPdGhlcndp
c2UsIGp1c3QgaWdub3JlCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hlZXQuCi0gICAg
ICAgICAgICAgICAgICAgIGlmIChlLT5oYXNMb2NhbE5hbWUoc3R5bGVUYWcpIHx8ICFyZWwuY29u
dGFpbnMoImFsdGVybmF0ZSIpKQotICAgICAgICAgICAgICAgICAgICAgICAgbV9wcmVmZXJyZWRT
dHlsZXNoZWV0U2V0ID0gbV9zZWxlY3RlZFN0eWxlc2hlZXRTZXQgPSB0aXRsZTsKLSAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHRpdGxlICE9IG1fcHJlZmVycmVkU3R5bGVz
aGVldFNldCkKLSAgICAgICAgICAgICAgICAgICAgc2hlZXQgPSAwOwotICAgICAgICAgICAgfQot
Ci0gICAgICAgICAgICBpZiAocmVsLmNvbnRhaW5zKCJhbHRlcm5hdGUiKSAmJiB0aXRsZS5pc0Vt
cHR5KCkpCi0gICAgICAgICAgICAgICAgc2hlZXQgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGlm
IChzaGVldCkKLSAgICAgICAgICAgIHNoZWV0cy5hcHBlbmQoc2hlZXQpOwotICAgIH0KLX0KLQot
Ym9vbCBEb2N1bWVudDo6dGVzdEFkZGVkU3R5bGVzaGVldFJlcXVpcmVzU3R5bGVSZWNhbGMoU3R5
bGVTaGVldENvbnRlbnRzKiBzdHlsZXNoZWV0KQotewotICAgIC8vIFNlZSBpZiBhbGwgcnVsZXMg
b24gdGhlIHNoZWV0IGFyZSBzY29wZWQgdG8gc29tZSBzcGVjaWZpYyBpZHMgb3IgY2xhc3Nlcy4K
LSAgICAvLyBUaGVuIHRlc3QgaWYgd2UgYWN0dWFsbHkgaGF2ZSBhbnkgb2YgdGhvc2UgaW4gdGhl
IHRyZWUgYXQgdGhlIG1vbWVudC4KLSAgICBIYXNoU2V0PEF0b21pY1N0cmluZ0ltcGwqPiBpZFNj
b3BlczsgCi0gICAgSGFzaFNldDxBdG9taWNTdHJpbmdJbXBsKj4gY2xhc3NTY29wZXM7Ci0gICAg
aWYgKCFTdHlsZVJlc29sdmVyOjpkZXRlcm1pbmVTdHlsZXNoZWV0U2VsZWN0b3JTY29wZXMoc3R5
bGVzaGVldCwgaWRTY29wZXMsIGNsYXNzU2NvcGVzKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0g
ICAgLy8gSW52YWxpZGF0ZSB0aGUgc3VidHJlZXMgdGhhdCBtYXRjaCB0aGUgc2NvcGVzLgotICAg
IE5vZGUqIG5vZGUgPSBmaXJzdENoaWxkKCk7Ci0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAg
aWYgKCFub2RlLT5pc1N0eWxlZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgbm9kZSA9IG5vZGUt
PnRyYXZlcnNlTmV4dE5vZGUoKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0g
ICAgICAgIFN0eWxlZEVsZW1lbnQqIGVsZW1lbnQgPSBzdGF0aWNfY2FzdDxTdHlsZWRFbGVtZW50
Kj4obm9kZSk7Ci0gICAgICAgIGlmIChTZWxlY3RvckNoZWNrZXI6OmVsZW1lbnRNYXRjaGVzU2Vs
ZWN0b3JTY29wZXMoZWxlbWVudCwgaWRTY29wZXMsIGNsYXNzU2NvcGVzKSkgewotICAgICAgICAg
ICAgZWxlbWVudC0+c2V0TmVlZHNTdHlsZVJlY2FsYygpOwotICAgICAgICAgICAgLy8gVGhlIHdo
b2xlIHN1YnRyZWUgaXMgbm93IGludmFsaWRhdGVkLCB3ZSBjYW4gc2tpcCB0byB0aGUgbmV4dCBz
aWJsaW5nLgotICAgICAgICAgICAgbm9kZSA9IG5vZGUtPnRyYXZlcnNlTmV4dFNpYmxpbmcoKTsK
LSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIG5vZGUgPSBub2RlLT50
cmF2ZXJzZU5leHROb2RlKCk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBE
b2N1bWVudDo6YW5hbHl6ZVN0eWxlc2hlZXRDaGFuZ2UoU3R5bGVSZXNvbHZlclVwZGF0ZUZsYWcg
dXBkYXRlRmxhZywgY29uc3QgVmVjdG9yPFJlZlB0cjxTdHlsZVNoZWV0PiA+JiBuZXdTdHlsZXNo
ZWV0cywgYm9vbCYgcmVxdWlyZXNTdHlsZVJlc29sdmVyUmVzZXQsIGJvb2wmIHJlcXVpcmVzRnVs
bFN0eWxlUmVjYWxjKQotewotICAgIHJlcXVpcmVzU3R5bGVSZXNvbHZlclJlc2V0ID0gdHJ1ZTsK
LSAgICByZXF1aXJlc0Z1bGxTdHlsZVJlY2FsYyA9IHRydWU7Ci0gICAgCi0gICAgLy8gU3R5bGVz
aGVldHMgb2YgPHN0eWxlPiBlbGVtZW50cyB0aGF0IEBpbXBvcnQgc3R5bGVzaGVldHMgYXJlIGFj
dGl2ZSBidXQgbG9hZGluZy4gV2UgbmVlZCB0byB0cmlnZ2VyIGEgZnVsbCByZWNhbGMgd2hlbiBz
dWNoIGxvYWRzIGFyZSBkb25lLgotICAgIGJvb2wgaGFzQWN0aXZlTG9hZGluZ1N0eWxlc2hlZXQg
PSBmYWxzZTsKLSAgICB1bnNpZ25lZCBuZXdTdHlsZXNoZWV0Q291bnQgPSBuZXdTdHlsZXNoZWV0
cy5zaXplKCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5ld1N0eWxlc2hlZXRDb3Vu
dDsgKytpKSB7Ci0gICAgICAgIGlmIChuZXdTdHlsZXNoZWV0c1tpXS0+aXNMb2FkaW5nKCkpCi0g
ICAgICAgICAgICBoYXNBY3RpdmVMb2FkaW5nU3R5bGVzaGVldCA9IHRydWU7Ci0gICAgfQotICAg
IGlmIChtX2hhZEFjdGl2ZUxvYWRpbmdTdHlsZXNoZWV0ICYmICFoYXNBY3RpdmVMb2FkaW5nU3R5
bGVzaGVldCkgewotICAgICAgICBtX2hhZEFjdGl2ZUxvYWRpbmdTdHlsZXNoZWV0ID0gZmFsc2U7
Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbV9oYWRBY3RpdmVMb2FkaW5nU3R5bGVzaGVl
dCA9IGhhc0FjdGl2ZUxvYWRpbmdTdHlsZXNoZWV0OwotCi0gICAgaWYgKHVwZGF0ZUZsYWcgIT0g
UmVjYWxjU3R5bGVJZk5lZWRlZCkKLSAgICAgICAgcmV0dXJuOwotICAgIGlmICghbV9zdHlsZVJl
c29sdmVyKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBTZWUgaWYgd2UgYXJlIGp1c3QgYWRk
aW5nIHN0eWxlc2hlZXRzLgotICAgIHVuc2lnbmVkIG9sZFN0eWxlc2hlZXRDb3VudCA9IG1fc3R5
bGVTaGVldHMtPmxlbmd0aCgpOwotICAgIGlmIChuZXdTdHlsZXNoZWV0Q291bnQgPCBvbGRTdHls
ZXNoZWV0Q291bnQpCi0gICAgICAgIHJldHVybjsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp
IDwgb2xkU3R5bGVzaGVldENvdW50OyArK2kpIHsKLSAgICAgICAgaWYgKG1fc3R5bGVTaGVldHMt
Pml0ZW0oaSkgIT0gbmV3U3R5bGVzaGVldHNbaV0pCi0gICAgICAgICAgICByZXR1cm47Ci0gICAg
fQotICAgIHJlcXVpcmVzU3R5bGVSZXNvbHZlclJlc2V0ID0gZmFsc2U7Ci0KLSAgICAvLyBJZiB3
ZSBhcmUgYWxyZWFkeSBwYXJzaW5nIHRoZSBib2R5IGFuZCBzbyBtYXkgaGF2ZSBzaWduaWZpY2Fu
dCBhbW91bnQgb2YgZWxlbWVudHMsIHB1dCBzb21lIGVmZm9ydCBpbnRvIHRyeWluZyB0byBhdm9p
ZCBzdHlsZSByZWNhbGNzLgotICAgIGlmICghYm9keSgpIHx8IG1faGFzTm9kZXNXaXRoUGxhY2Vo
b2xkZXJTdHlsZSkKLSAgICAgICAgcmV0dXJuOwotICAgIGZvciAodW5zaWduZWQgaSA9IG9sZFN0
eWxlc2hlZXRDb3VudDsgaSA8IG5ld1N0eWxlc2hlZXRDb3VudDsgKytpKSB7Ci0gICAgICAgIGlm
ICghbmV3U3R5bGVzaGVldHNbaV0tPmlzQ1NTU3R5bGVTaGVldCgpKQotICAgICAgICAgICAgcmV0
dXJuOwotICAgICAgICBpZiAobmV3U3R5bGVzaGVldHNbaV0tPmRpc2FibGVkKCkpCi0gICAgICAg
ICAgICBjb250aW51ZTsKLSAgICAgICAgaWYgKHRlc3RBZGRlZFN0eWxlc2hlZXRSZXF1aXJlc1N0
eWxlUmVjYWxjKHN0YXRpY19jYXN0PENTU1N0eWxlU2hlZXQqPihuZXdTdHlsZXNoZWV0c1tpXS5n
ZXQoKSktPmNvbnRlbnRzKCkpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICByZXF1
aXJlc0Z1bGxTdHlsZVJlY2FsYyA9IGZhbHNlOwotfQotCi1zdGF0aWMgYm9vbCBzdHlsZVNoZWV0
c1VzZVJlbVVuaXRzKGNvbnN0IFZlY3RvcjxSZWZQdHI8U3R5bGVTaGVldD4gPiYgc2hlZXRzKQot
ewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzaGVldHMuc2l6ZSgpOyArK2kpIHsKLSAg
ICAgICAgaWYgKCFzaGVldHNbaV0tPmlzQ1NTU3R5bGVTaGVldCgpKQotICAgICAgICAgICAgY29u
dGludWU7Ci0gICAgICAgIGlmIChzdGF0aWNfY2FzdDxDU1NTdHlsZVNoZWV0Kj4oc2hlZXRzW2ld
LmdldCgpKS0+Y29udGVudHMoKS0+dXNlc1JlbVVuaXRzKCkpCi0gICAgICAgICAgICByZXR1cm4g
dHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCiB2b2lkIERvY3VtZW50Ojpub3Rp
ZnlTZWFtbGVzc0NoaWxkRG9jdW1lbnRzT2ZTdHlsZXNoZWV0VXBkYXRlKCkgY29uc3QKIHsKICAg
ICAvLyBJZiB3ZSdyZSBub3QgaW4gYSBmcmFtZSB5ZXQgYW55IHBvdGVudGlhbCBjaGlsZCBkb2N1
bWVudHMgd29uJ3QgaGF2ZSBhIFN0eWxlUmVzb2x2ZXIgdG8gdXBkYXRlLgpAQCAtMzY1OSw0MyAr
MzI4OSw2IEBAIHZvaWQgRG9jdW1lbnQ6Om5vdGlmeVNlYW1sZXNzQ2hpbGREb2N1bWUKICAgICB9
CiB9CiAKLWJvb2wgRG9jdW1lbnQ6OnVwZGF0ZUFjdGl2ZVN0eWxlc2hlZXRzKFN0eWxlUmVzb2x2
ZXJVcGRhdGVGbGFnIHVwZGF0ZUZsYWcpCi17Ci0gICAgaWYgKG1faW5TdHlsZVJlY2FsYykgewot
ICAgICAgICAvLyBTVkcgPHVzZT4gZWxlbWVudCBtYXkgbWFuYWdlIHRvIGludmFsaWRhdGUgc3R5
bGUgc2VsZWN0b3IgaW4gdGhlIG1pZGRsZSBvZiBhIHN0eWxlIHJlY2FsYy4KLSAgICAgICAgLy8g
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTU0MzQ0Ci0gICAgICAgIC8v
IEZJWE1FOiBUaGlzIHNob3VsZCBiZSBmaXhlZCBpbiBTVkcgYW5kIHRoaXMgY29kZSByZXBsYWNl
ZCB3aXRoIEFTU0VSVCghbV9pblN0eWxlUmVjYWxjKS4KLSAgICAgICAgbV9oYXNEaXJ0eVN0eWxl
UmVzb2x2ZXIgPSB0cnVlOwotICAgICAgICBzY2hlZHVsZUZvcmNlZFN0eWxlUmVjYWxjKCk7Ci0g
ICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKCFyZW5kZXJlcigpIHx8ICFhdHRh
Y2hlZCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBTdHlsZVNoZWV0VmVjdG9yIG5l
d1N0eWxlc2hlZXRzOwotICAgIGNvbGxlY3RBY3RpdmVTdHlsZXNoZWV0cyhuZXdTdHlsZXNoZWV0
cyk7Ci0KLSAgICBib29sIHJlcXVpcmVzU3R5bGVSZXNvbHZlclJlc2V0OwotICAgIGJvb2wgcmVx
dWlyZXNGdWxsU3R5bGVSZWNhbGM7Ci0gICAgYW5hbHl6ZVN0eWxlc2hlZXRDaGFuZ2UodXBkYXRl
RmxhZywgbmV3U3R5bGVzaGVldHMsIHJlcXVpcmVzU3R5bGVSZXNvbHZlclJlc2V0LCByZXF1aXJl
c0Z1bGxTdHlsZVJlY2FsYyk7Ci0KLSAgICBpZiAocmVxdWlyZXNTdHlsZVJlc29sdmVyUmVzZXQp
Ci0gICAgICAgIGNsZWFyU3R5bGVSZXNvbHZlcigpOwotICAgIGVsc2UgewotICAgICAgICBtX3N0
eWxlUmVzb2x2ZXItPmFwcGVuZEF1dGhvclN0eWxlc2hlZXRzKG1fc3R5bGVTaGVldHMtPmxlbmd0
aCgpLCBuZXdTdHlsZXNoZWV0cyk7Ci0gICAgICAgIHJlc2V0Q1NTRmVhdHVyZUZsYWdzKCk7Ci0g
ICAgfQotICAgIG1fc3R5bGVTaGVldHMtPnN3YXAobmV3U3R5bGVzaGVldHMpOwotCi0gICAgbV91
c2VzUmVtVW5pdHMgPSBzdHlsZVNoZWV0c1VzZVJlbVVuaXRzKG1fc3R5bGVTaGVldHMtPnZlY3Rv
cigpKTsKLSAgICBtX2RpZENhbGN1bGF0ZVN0eWxlUmVzb2x2ZXIgPSB0cnVlOwotICAgIG1faGFz
RGlydHlTdHlsZVJlc29sdmVyID0gZmFsc2U7Ci0KLSAgICBub3RpZnlTZWFtbGVzc0NoaWxkRG9j
dW1lbnRzT2ZTdHlsZXNoZWV0VXBkYXRlKCk7Ci0KLSAgICByZXR1cm4gcmVxdWlyZXNGdWxsU3R5
bGVSZWNhbGM7Ci19Ci0KIHZvaWQgRG9jdW1lbnQ6OnNldEhvdmVyTm9kZShQYXNzUmVmUHRyPE5v
ZGU+IG5ld0hvdmVyTm9kZSkKIHsKICAgICBtX2hvdmVyTm9kZSA9IG5ld0hvdmVyTm9kZTsKQEAg
LTYyNzUsMTYgKzU4NjgsOSBAQCB2b2lkIERvY3VtZW50OjpyZXBvcnRNZW1vcnlVc2FnZShNZW1v
cnlPCiAgICAgaW5mby5hZGRNZW1iZXIobV9mcmFtZSk7CiAgICAgaW5mby5hZGRNZW1iZXIobV9j
YWNoZWRSZXNvdXJjZUxvYWRlcik7CiAgICAgaW5mby5hZGRNZW1iZXIobV9lbGVtU2hlZXQpOwot
ICAgIGluZm8uYWRkTWVtYmVyKG1fcGFnZVVzZXJTaGVldCk7Ci0gICAgaWYgKG1fcGFnZUdyb3Vw
VXNlclNoZWV0cykKLSAgICAgICAgaW5mby5hZGRJbnN0cnVtZW50ZWRWZWN0b3JQdHIobV9wYWdl
R3JvdXBVc2VyU2hlZXRzKTsKLSAgICBpZiAobV91c2VyU2hlZXRzKQotICAgICAgICBpbmZvLmFk
ZEluc3RydW1lbnRlZFZlY3RvclB0cihtX3VzZXJTaGVldHMpOworICAgIGluZm8uYWRkTWVtYmVy
KG1fc3R5bGVTaGVldENvbGxlY3Rpb24pOwogICAgIGluZm8uYWRkSGFzaFNldChtX25vZGVJdGVy
YXRvcnMpOwogICAgIGluZm8uYWRkSGFzaFNldChtX3Jhbmdlcyk7Ci0gICAgaW5mby5hZGRMaXN0
SGFzaFNldChtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcyk7Ci0gICAgaW5mby5hZGRNZW1iZXIo
bV9wcmVmZXJyZWRTdHlsZXNoZWV0U2V0KTsKLSAgICBpbmZvLmFkZE1lbWJlcihtX3NlbGVjdGVk
U3R5bGVzaGVldFNldCk7CiAgICAgaW5mby5hZGRNZW1iZXIobV90aXRsZS5zdHJpbmcoKSk7CiAg
ICAgaW5mby5hZGRNZW1iZXIobV9yYXdUaXRsZS5zdHJpbmcoKSk7CiAgICAgaW5mby5hZGRNZW1i
ZXIobV94bWxFbmNvZGluZyk7CkBAIC02Mzc5LDYgKzU5NjUsMTEgQEAgUGFzc1JlZlB0cjxFbGVt
ZW50QXR0cmlidXRlRGF0YT4gRG9jdW1lbgogICAgIHJldHVybiBhdHRyaWJ1dGVEYXRhLnJlbGVh
c2UoKTsKIH0KIAorYm9vbCBEb2N1bWVudDo6aGF2ZVN0eWxlc2hlZXRzTG9hZGVkKCkgY29uc3QK
K3sKKyAgICByZXR1cm4gIW1fc3R5bGVTaGVldENvbGxlY3Rpb24tPmhhc1BlbmRpbmdTaGVldHMo
KSB8fCBtX2lnbm9yZVBlbmRpbmdTdHlsZXNoZWV0czsKK30KKwogTG9jYWxpemVyJiBEb2N1bWVu
dDo6Z2V0TG9jYWxpemVyKGNvbnN0IEF0b21pY1N0cmluZyYgbG9jYWxlKQogewogICAgIEF0b21p
Y1N0cmluZyBsb2NhbGVLZXkgPSBsb2NhbGU7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9kb20vRG9j
dW1lbnQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9kb20vRG9jdW1lbnQuaAkocmV2
aXNpb24gMTI5NDA3KQorKysgU291cmNlL1dlYkNvcmUvZG9tL0RvY3VtZW50LmgJKHdvcmtpbmcg
Y29weSkKQEAgLTc4LDYgKzc4LDcgQEAgY2xhc3MgRG9jdW1lbnRGcmFnbWVudDsKIGNsYXNzIERv
Y3VtZW50TG9hZGVyOwogY2xhc3MgRG9jdW1lbnRNYXJrZXJDb250cm9sbGVyOwogY2xhc3MgRG9j
dW1lbnRQYXJzZXI7CitjbGFzcyBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOwogY2xhc3Mg
RG9jdW1lbnRUeXBlOwogY2xhc3MgRG9jdW1lbnRXZWFrUmVmZXJlbmNlOwogY2xhc3MgRHluYW1p
Y05vZGVMaXN0Q2FjaGVCYXNlOwpAQCAtNDg1LDM0ICs0ODYsMTQgQEAgcHVibGljOgogICAgICAg
ICByZXR1cm4gbV9zdHlsZVJlc29sdmVyLmdldCgpOwogICAgIH0KIAotICAgIC8qKgotICAgICAq
IFVwZGF0ZXMgdGhlIHBlbmRpbmcgc2hlZXQgY291bnQgYW5kIHRoZW4gY2FsbHMgdXBkYXRlQWN0
aXZlU3R5bGVzaGVldHMuCi0gICAgICovCi0gICAgZW51bSBSZW1vdmVQZW5kaW5nU2hlZXROb3Rp
ZmljYXRpb25UeXBlIHsKLSAgICAgICAgUmVtb3ZlUGVuZGluZ1NoZWV0Tm90aWZ5SW1tZWRpYXRl
bHksCi0gICAgICAgIFJlbW92ZVBlbmRpbmdTaGVldE5vdGlmeUxhdGVyCi0gICAgfTsKLQotICAg
IHZvaWQgcmVtb3ZlUGVuZGluZ1NoZWV0KFJlbW92ZVBlbmRpbmdTaGVldE5vdGlmaWNhdGlvblR5
cGUgPSBSZW1vdmVQZW5kaW5nU2hlZXROb3RpZnlJbW1lZGlhdGVseSk7CiAgICAgdm9pZCBub3Rp
ZnlSZW1vdmVQZW5kaW5nU2hlZXRJZk5lZWRlZCgpOwogCi0gICAgLyoqCi0gICAgICogVGhpcyBt
ZXRob2QgcmV0dXJucyB0cnVlIGlmIGFsbCB0b3AtbGV2ZWwgc3R5bGVzaGVldHMgaGF2ZSBsb2Fk
ZWQgKGluY2x1ZGluZwotICAgICAqIGFueSBAaW1wb3J0cyB0aGF0IHRoZXkgbWF5IGJlIGxvYWRp
bmcpLgotICAgICAqLwotICAgIGJvb2wgaGF2ZVN0eWxlc2hlZXRzTG9hZGVkKCkgY29uc3QKLSAg
ICB7Ci0gICAgICAgIHJldHVybiBtX3BlbmRpbmdTdHlsZXNoZWV0cyA8PSAwIHx8IG1faWdub3Jl
UGVuZGluZ1N0eWxlc2hlZXRzOwotICAgIH0KKyAgICBib29sIGhhdmVTdHlsZXNoZWV0c0xvYWRl
ZCgpIGNvbnN0OwogCi0gICAgLyoqCi0gICAgICogSW5jcmVtZW50cyB0aGUgbnVtYmVyIG9mIHBl
bmRpbmcgc2hlZXRzLiAgVGhlIDxsaW5rPiBlbGVtZW50cwotICAgICAqIGludm9rZSB0aGlzIHRv
IGFkZCB0aGVtc2VsdmVzIHRvIHRoZSBsb2FkaW5nIGxpc3QuCi0gICAgICovCi0gICAgdm9pZCBh
ZGRQZW5kaW5nU2hlZXQoKSB7IG1fcGVuZGluZ1N0eWxlc2hlZXRzKys7IH0KKyAgICAvLyBUaGlz
IGlzIGEgRE9NIGZ1bmN0aW9uLgorICAgIFN0eWxlU2hlZXRMaXN0KiBzdHlsZVNoZWV0cygpOwog
Ci0gICAgdm9pZCBhZGRTdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZShOb2RlKiwgYm9vbCBjcmVhdGVk
QnlQYXJzZXIpOwotICAgIHZvaWQgcmVtb3ZlU3R5bGVTaGVldENhbmRpZGF0ZU5vZGUoTm9kZSop
OworICAgIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24qIHN0eWxlU2hlZXRDb2xsZWN0aW9u
KCkgeyByZXR1cm4gbV9zdHlsZVNoZWV0Q29sbGVjdGlvbi5nZXQoKTsgfQogCiAgICAgYm9vbCBn
b3RvQW5jaG9yTmVlZGVkQWZ0ZXJTdHlsZXNoZWV0c0xvYWQoKSB7IHJldHVybiBtX2dvdG9BbmNo
b3JOZWVkZWRBZnRlclN0eWxlc2hlZXRzTG9hZDsgfQogICAgIHZvaWQgc2V0R290b0FuY2hvck5l
ZWRlZEFmdGVyU3R5bGVzaGVldHNMb2FkKGJvb2wgYikgeyBtX2dvdG9BbmNob3JOZWVkZWRBZnRl
clN0eWxlc2hlZXRzTG9hZCA9IGI7IH0KQEAgLTUzMCwxNyArNTExLDYgQEAgcHVibGljOgogCiAg
ICAgdm9pZCBldmFsdWF0ZU1lZGlhUXVlcnlMaXN0KCk7CiAKLSAgICBib29sIHVzZXNTaWJsaW5n
UnVsZXMoKSBjb25zdCB7IHJldHVybiBtX3VzZXNTaWJsaW5nUnVsZXMgfHwgbV91c2VzU2libGlu
Z1J1bGVzT3ZlcnJpZGU7IH0KLSAgICB2b2lkIHNldFVzZXNTaWJsaW5nUnVsZXMoYm9vbCBiKSB7
IG1fdXNlc1NpYmxpbmdSdWxlc092ZXJyaWRlID0gYjsgfQotICAgIGJvb2wgdXNlc0ZpcnN0TGlu
ZVJ1bGVzKCkgY29uc3QgeyByZXR1cm4gbV91c2VzRmlyc3RMaW5lUnVsZXM7IH0KLSAgICBib29s
IHVzZXNGaXJzdExldHRlclJ1bGVzKCkgY29uc3QgeyByZXR1cm4gbV91c2VzRmlyc3RMZXR0ZXJS
dWxlczsgfQotICAgIHZvaWQgc2V0VXNlc0ZpcnN0TGV0dGVyUnVsZXMoYm9vbCBiKSB7IG1fdXNl
c0ZpcnN0TGV0dGVyUnVsZXMgPSBiOyB9Ci0gICAgYm9vbCB1c2VzQmVmb3JlQWZ0ZXJSdWxlcygp
IGNvbnN0IHsgcmV0dXJuIG1fdXNlc0JlZm9yZUFmdGVyUnVsZXMgfHwgbV91c2VzQmVmb3JlQWZ0
ZXJSdWxlc092ZXJyaWRlOyB9Ci0gICAgdm9pZCBzZXRVc2VzQmVmb3JlQWZ0ZXJSdWxlcyhib29s
IGIpIHsgbV91c2VzQmVmb3JlQWZ0ZXJSdWxlc092ZXJyaWRlID0gYjsgfQotICAgIGJvb2wgdXNl
c1JlbVVuaXRzKCkgY29uc3QgeyByZXR1cm4gbV91c2VzUmVtVW5pdHM7IH0KLSAgICBib29sIHVz
ZXNMaW5rUnVsZXMoKSBjb25zdCB7IHJldHVybiBsaW5rQ29sb3IoKSAhPSB2aXNpdGVkTGlua0Nv
bG9yKCkgfHwgbV91c2VzTGlua1J1bGVzOyB9Ci0gICAgdm9pZCBzZXRVc2VzTGlua1J1bGVzKGJv
b2wgYikgeyBtX3VzZXNMaW5rUnVsZXMgPSBiOyB9Ci0KICAgICAvLyBOZXZlciByZXR1cm5zIDAu
CiAgICAgRm9ybUNvbnRyb2xsZXIqIGZvcm1Db250cm9sbGVyKCk7CiAgICAgVmVjdG9yPFN0cmlu
Zz4gZm9ybUVsZW1lbnRzU3RhdGUoKSBjb25zdDsKQEAgLTU1Niw3ICs1MjYsNyBAQCBwdWJsaWM6
CiAgICAgUGFzc1JlZlB0cjxOb2RlSXRlcmF0b3I+IGNyZWF0ZU5vZGVJdGVyYXRvcihOb2RlKiBy
b290LCB1bnNpZ25lZCB3aGF0VG9TaG93LAogICAgICAgICBQYXNzUmVmUHRyPE5vZGVGaWx0ZXI+
LCBib29sIGV4cGFuZEVudGl0eVJlZmVyZW5jZXMsIEV4Y2VwdGlvbkNvZGUmKTsKIAotICAgIFBh
c3NSZWZQdHI8VHJlZVdhbGtlcj4gY3JlYXRlVHJlZVdhbGtlcihOb2RlKiByb290LCB1bnNpZ25l
ZCB3aGF0VG9TaG93LCAKKyAgICBQYXNzUmVmUHRyPFRyZWVXYWxrZXI+IGNyZWF0ZVRyZWVXYWxr
ZXIoTm9kZSogcm9vdCwgdW5zaWduZWQgd2hhdFRvU2hvdywKICAgICAgICAgUGFzc1JlZlB0cjxO
b2RlRmlsdGVyPiwgYm9vbCBleHBhbmRFbnRpdHlSZWZlcmVuY2VzLCBFeGNlcHRpb25Db2RlJik7
CiAKICAgICAvLyBTcGVjaWFsIHN1cHBvcnQgZm9yIGVkaXRpbmcKQEAgLTY0OSwxNyArNjE5LDYg
QEAgcHVibGljOgogICAgIGJvb2wgY2FuTmF2aWdhdGUoRnJhbWUqIHRhcmdldEZyYW1lKTsKICAg
ICBGcmFtZSogZmluZFVuc2FmZVBhcmVudFNjcm9sbFByb3BhZ2F0aW9uQm91bmRhcnkoKTsKIAot
ICAgIENTU1N0eWxlU2hlZXQqIHBhZ2VVc2VyU2hlZXQoKTsKLSAgICB2b2lkIGNsZWFyUGFnZVVz
ZXJTaGVldCgpOwotICAgIHZvaWQgdXBkYXRlUGFnZVVzZXJTaGVldCgpOwotCi0gICAgY29uc3Qg
VmVjdG9yPFJlZlB0cjxDU1NTdHlsZVNoZWV0PiA+KiBwYWdlR3JvdXBVc2VyU2hlZXRzKCkgY29u
c3Q7Ci0gICAgdm9pZCBjbGVhclBhZ2VHcm91cFVzZXJTaGVldHMoKTsKLSAgICB2b2lkIHVwZGF0
ZVBhZ2VHcm91cFVzZXJTaGVldHMoKTsKLQotICAgIGNvbnN0IFZlY3RvcjxSZWZQdHI8Q1NTU3R5
bGVTaGVldD4gPiogZG9jdW1lbnRVc2VyU2hlZXRzKCkgY29uc3QgeyByZXR1cm4gbV91c2VyU2hl
ZXRzLmdldCgpOyB9Ci0gICAgdm9pZCBhZGRVc2VyU2hlZXQoUGFzc1JlZlB0cjxTdHlsZVNoZWV0
Q29udGVudHM+IHVzZXJTaGVldCk7Ci0KICAgICBDU1NTdHlsZVNoZWV0KiBlbGVtZW50U2hlZXQo
KTsKICAgICAKICAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8RG9jdW1lbnRQYXJzZXI+IGNyZWF0ZVBh
cnNlcigpOwpAQCAtNzE2LDggKzY3NSw2IEBAIHB1YmxpYzoKICAgICAKICAgICBNb3VzZUV2ZW50
V2l0aEhpdFRlc3RSZXN1bHRzIHByZXBhcmVNb3VzZUV2ZW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0
JiwgY29uc3QgTGF5b3V0UG9pbnQmLCBjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmKTsKIAotICAg
IFN0eWxlU2hlZXRMaXN0KiBzdHlsZVNoZWV0cygpOwotCiAgICAgLyogTmV3bHkgcHJvcG9zZWQg
Q1NTMyBtZWNoYW5pc20gZm9yIHNlbGVjdGluZyBhbHRlcm5hdGUKICAgICAgICBzdHlsZXNoZWV0
cyB1c2luZyB0aGUgRE9NLiBNYXkgYmUgc3ViamVjdCB0byBjaGFuZ2UgYXMKICAgICAgICBzcGVj
IG1hdHVyZXMuIC0gZHdoCkBAIC05NzQsNyArOTMxLDggQEAgcHVibGljOgogICAgIGVudW0gUGVu
ZGluZ1NoZWV0TGF5b3V0IHsgTm9MYXlvdXRXaXRoUGVuZGluZ1NoZWV0cywgRGlkTGF5b3V0V2l0
aFBlbmRpbmdTaGVldHMsIElnbm9yZUxheW91dFdpdGhQZW5kaW5nU2hlZXRzIH07CiAKICAgICBi
b29sIGRpZExheW91dFdpdGhQZW5kaW5nU3R5bGVzaGVldHMoKSBjb25zdCB7IHJldHVybiBtX3Bl
bmRpbmdTaGVldExheW91dCA9PSBEaWRMYXlvdXRXaXRoUGVuZGluZ1NoZWV0czsgfQotICAgIAor
CisgICAgYm9vbCBoYXNOb2Rlc1dpdGhQbGFjZWhvbGRlclN0eWxlKCkgY29uc3QgeyByZXR1cm4g
bV9oYXNOb2Rlc1dpdGhQbGFjZWhvbGRlclN0eWxlOyB9CiAgICAgdm9pZCBzZXRIYXNOb2Rlc1dp
dGhQbGFjZWhvbGRlclN0eWxlKCkgeyBtX2hhc05vZGVzV2l0aFBsYWNlaG9sZGVyU3R5bGUgPSB0
cnVlOyB9CiAKICAgICBjb25zdCBWZWN0b3I8SWNvblVSTD4mIGljb25VUkxzKCk7CkBAIC0xMTk0
LDYgKzExNTIsMTMgQEAgcHVibGljOgogCiAgICAgUGFzc1JlZlB0cjxFbGVtZW50QXR0cmlidXRl
RGF0YT4gY2FjaGVkSW1tdXRhYmxlQXR0cmlidXRlRGF0YShjb25zdCBFbGVtZW50KiwgY29uc3Qg
VmVjdG9yPEF0dHJpYnV0ZT4mKTsKIAorICAgIHZvaWQgZGlkUmVtb3ZlQWxsUGVuZGluZ1N0eWxl
c2hlZXQoKTsKKyAgICB2b2lkIHNldE5lZWRzTm90aWZ5UmVtb3ZlQWxsUGVuZGluZ1N0eWxlc2hl
ZXQoKSB7IG1fbmVlZHNOb3RpZnlSZW1vdmVBbGxQZW5kaW5nU3R5bGVzaGVldCA9IHRydWU7IH0K
KyAgICB2b2lkIGNsZWFyU3R5bGVSZXNvbHZlcigpOworICAgIHZvaWQgbm90aWZ5U2VhbWxlc3ND
aGlsZERvY3VtZW50c09mU3R5bGVzaGVldFVwZGF0ZSgpIGNvbnN0OworCisgICAgYm9vbCBpblN0
eWxlUmVjYWxjKCkgeyByZXR1cm4gbV9pblN0eWxlUmVjYWxjOyB9CisKICAgICBMb2NhbGl6ZXIm
IGdldExvY2FsaXplcihjb25zdCBBdG9taWNTdHJpbmcmIGxvY2FsZSk7CiAKIHByb3RlY3RlZDoK
QEAgLTEyNDEsMTkgKzEyMDYsOCBAQCBwcml2YXRlOgogICAgIHZvaWQgYnVpbGRBY2Nlc3NLZXlN
YXAoVHJlZVNjb3BlKiByb290KTsKIAogICAgIHZvaWQgY3JlYXRlU3R5bGVSZXNvbHZlcigpOwot
ICAgIHZvaWQgY2xlYXJTdHlsZVJlc29sdmVyKCk7Ci0gICAgdm9pZCBjb21iaW5lQ1NTRmVhdHVy
ZUZsYWdzKCk7Ci0gICAgdm9pZCByZXNldENTU0ZlYXR1cmVGbGFncygpOwotICAgIAotICAgIGJv
b2wgdXBkYXRlQWN0aXZlU3R5bGVzaGVldHMoU3R5bGVSZXNvbHZlclVwZGF0ZUZsYWcpOwotICAg
IHZvaWQgY29sbGVjdEFjdGl2ZVN0eWxlc2hlZXRzKFZlY3RvcjxSZWZQdHI8U3R5bGVTaGVldD4g
PiYpOwotICAgIGJvb2wgdGVzdEFkZGVkU3R5bGVzaGVldFJlcXVpcmVzU3R5bGVSZWNhbGMoU3R5
bGVTaGVldENvbnRlbnRzKik7Ci0gICAgdm9pZCBhbmFseXplU3R5bGVzaGVldENoYW5nZShTdHls
ZVJlc29sdmVyVXBkYXRlRmxhZywgY29uc3QgVmVjdG9yPFJlZlB0cjxTdHlsZVNoZWV0PiA+JiBu
ZXdTdHlsZXNoZWV0cywgYm9vbCYgcmVxdWlyZXNTdHlsZVJlc29sdmVyUmVzZXQsIGJvb2wmIHJl
cXVpcmVzRnVsbFN0eWxlUmVjYWxjKTsKLSAgICB2b2lkIGRpZFJlbW92ZUFsbFBlbmRpbmdTdHls
ZXNoZWV0KCk7Ci0gICAgdm9pZCBzZXROZWVkc05vdGlmeVJlbW92ZUFsbFBlbmRpbmdTdHlsZXNo
ZWV0KCkgeyBtX25lZWRzTm90aWZ5UmVtb3ZlQWxsUGVuZGluZ1N0eWxlc2hlZXQgPSB0cnVlOyB9
CiAKICAgICB2b2lkIHNlYW1sZXNzUGFyZW50VXBkYXRlZFN0eWxlc2hlZXRzKCk7Ci0gICAgdm9p
ZCBub3RpZnlTZWFtbGVzc0NoaWxkRG9jdW1lbnRzT2ZTdHlsZXNoZWV0VXBkYXRlKCkgY29uc3Q7
CiAKICAgICB2b2lkIGRlbGV0ZUN1c3RvbUZvbnRzKCk7CiAKQEAgLTEyOTAsNiArMTI0NCwxNyBA
QCBwcml2YXRlOgogICAgIE93blB0cjxTdHlsZVJlc29sdmVyPiBtX3N0eWxlUmVzb2x2ZXI7CiAg
ICAgYm9vbCBtX2RpZENhbGN1bGF0ZVN0eWxlUmVzb2x2ZXI7CiAgICAgYm9vbCBtX2hhc0RpcnR5
U3R5bGVSZXNvbHZlcjsKKyAgICBib29sIG1faGFzTm9kZXNXaXRoUGxhY2Vob2xkZXJTdHlsZTsK
KyAgICBib29sIG1fbmVlZHNOb3RpZnlSZW1vdmVBbGxQZW5kaW5nU3R5bGVzaGVldDsKKyAgICAv
LyBCdXQgc29tZXRpbWVzIHlvdSBuZWVkIHRvIGlnbm9yZSBwZW5kaW5nIHN0eWxlc2hlZXQgY291
bnQgdG8KKyAgICAvLyBmb3JjZSBhbiBpbW1lZGlhdGUgbGF5b3V0IHdoZW4gcmVxdWVzdGVkIGJ5
IEpTLgorICAgIGJvb2wgbV9pZ25vcmVQZW5kaW5nU3R5bGVzaGVldHM7CisKKyAgICAvLyBJZiB3
ZSBkbyBpZ25vcmUgdGhlIHBlbmRpbmcgc3R5bGVzaGVldCBjb3VudCwgdGhlbiB3ZSBuZWVkIHRv
IGFkZCBhIGJvb2xlYW4KKyAgICAvLyB0byB0cmFjayB0aGF0IHRoaXMgaGFwcGVuZWQgc28gdGhh
dCB3ZSBjYW4gZG8gYSBmdWxsIHJlcGFpbnQgd2hlbiB0aGUgc3R5bGVzaGVldHMKKyAgICAvLyBk
byBldmVudHVhbGx5IGxvYWQuCisgICAgUGVuZGluZ1NoZWV0TGF5b3V0IG1fcGVuZGluZ1NoZWV0
TGF5b3V0OworCiAgICAgVmVjdG9yPE93blB0cjxGb250RGF0YT4gPiBtX2N1c3RvbUZvbnRzOwog
CiAgICAgRnJhbWUqIG1fZnJhbWU7CkBAIC0xMzIzLDI5ICsxMjg4LDcgQEAgcHJpdmF0ZToKICAg
ICBSZWZQdHI8RG9jdW1lbnRUeXBlPiBtX2RvY1R5cGU7CiAgICAgT3duUHRyPERPTUltcGxlbWVu
dGF0aW9uPiBtX2ltcGxlbWVudGF0aW9uOwogCi0gICAgLy8gVHJhY2sgdGhlIG51bWJlciBvZiBj
dXJyZW50bHkgbG9hZGluZyB0b3AtbGV2ZWwgc3R5bGVzaGVldHMgbmVlZGVkIGZvciByZW5kZXJp
bmcuCi0gICAgLy8gU2hlZXRzIGxvYWRlZCB1c2luZyB0aGUgQGltcG9ydCBkaXJlY3RpdmUgYXJl
IG5vdCBpbmNsdWRlZCBpbiB0aGlzIGNvdW50LgotICAgIC8vIFdlIHVzZSB0aGlzIGNvdW50IG9m
IHBlbmRpbmcgc2hlZXRzIHRvIGRldGVjdCB3aGVuIHdlIGNhbiBiZWdpbiBhdHRhY2hpbmcKLSAg
ICAvLyBlbGVtZW50cyBhbmQgd2hlbiBpdCBpcyBzYWZlIHRvIGV4ZWN1dGUgc2NyaXB0cy4KLSAg
ICBpbnQgbV9wZW5kaW5nU3R5bGVzaGVldHM7Ci0KLSAgICAvLyBCdXQgc29tZXRpbWVzIHlvdSBu
ZWVkIHRvIGlnbm9yZSBwZW5kaW5nIHN0eWxlc2hlZXQgY291bnQgdG8KLSAgICAvLyBmb3JjZSBh
biBpbW1lZGlhdGUgbGF5b3V0IHdoZW4gcmVxdWVzdGVkIGJ5IEpTLgotICAgIGJvb2wgbV9pZ25v
cmVQZW5kaW5nU3R5bGVzaGVldHMgOiAxOwotICAgIGJvb2wgbV9uZWVkc05vdGlmeVJlbW92ZUFs
bFBlbmRpbmdTdHlsZXNoZWV0IDogMTsKLQotICAgIC8vIElmIHdlIGRvIGlnbm9yZSB0aGUgcGVu
ZGluZyBzdHlsZXNoZWV0IGNvdW50LCB0aGVuIHdlIG5lZWQgdG8gYWRkIGEgYm9vbGVhbgotICAg
IC8vIHRvIHRyYWNrIHRoYXQgdGhpcyBoYXBwZW5lZCBzbyB0aGF0IHdlIGNhbiBkbyBhIGZ1bGwg
cmVwYWludCB3aGVuIHRoZSBzdHlsZXNoZWV0cwotICAgIC8vIGRvIGV2ZW50dWFsbHkgbG9hZC4K
LSAgICBQZW5kaW5nU2hlZXRMYXlvdXQgbV9wZW5kaW5nU2hlZXRMYXlvdXQ7Ci0gICAgCi0gICAg
Ym9vbCBtX2hhc05vZGVzV2l0aFBsYWNlaG9sZGVyU3R5bGU7Ci0KICAgICBSZWZQdHI8Q1NTU3R5
bGVTaGVldD4gbV9lbGVtU2hlZXQ7Ci0gICAgUmVmUHRyPENTU1N0eWxlU2hlZXQ+IG1fcGFnZVVz
ZXJTaGVldDsKLSAgICBtdXRhYmxlIE93blB0cjxWZWN0b3I8UmVmUHRyPENTU1N0eWxlU2hlZXQ+
ID4gPiBtX3BhZ2VHcm91cFVzZXJTaGVldHM7Ci0gICAgT3duUHRyPFZlY3RvcjxSZWZQdHI8Q1NT
U3R5bGVTaGVldD4gPiA+IG1fdXNlclNoZWV0czsKLSAgICBtdXRhYmxlIGJvb2wgbV9wYWdlR3Jv
dXBVc2VyU2hlZXRDYWNoZVZhbGlkOwogCiAgICAgYm9vbCBtX3ByaW50aW5nOwogICAgIGJvb2wg
bV9wYWdpbmF0ZWRGb3JTY3JlZW47CkBAIC0xMzc0LDExICsxMzE3LDggQEAgcHJpdmF0ZToKICAg
ICBNdXRhdGlvbk9ic2VydmVyT3B0aW9ucyBtX211dGF0aW9uT2JzZXJ2ZXJUeXBlczsKICNlbmRp
ZgogCi0gICAgUmVmUHRyPFN0eWxlU2hlZXRMaXN0PiBtX3N0eWxlU2hlZXRzOyAvLyBBbGwgb2Yg
dGhlIHN0eWxlc2hlZXRzIHRoYXQgYXJlIGN1cnJlbnRseSBpbiBlZmZlY3QgZm9yIG91ciBtZWRp
YSB0eXBlIGFuZCBzdHlsZXNoZWV0IHNldC4KLSAgICBib29sIG1faGFkQWN0aXZlTG9hZGluZ1N0
eWxlc2hlZXQ7Ci0gICAgCi0gICAgdHlwZWRlZiBMaXN0SGFzaFNldDxOb2RlKiwgMzI+IFN0eWxl
U2hlZXRDYW5kaWRhdGVMaXN0SGFzaFNldDsKLSAgICBTdHlsZVNoZWV0Q2FuZGlkYXRlTGlzdEhh
c2hTZXQgbV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXM7IC8vIEFsbCBvZiB0aGUgbm9kZXMgdGhh
dCBjb3VsZCBwb3RlbnRpYWxseSBwcm92aWRlIHN0eWxlc2hlZXRzIHRvIHRoZSBkb2N1bWVudCAo
PGxpbms+LCA8c3R5bGU+LCA8P3htbC1zdHlsZXNoZWV0PikKKworICAgIE93blB0cjxEb2N1bWVu
dFN0eWxlU2hlZXRDb2xsZWN0aW9uPiBtX3N0eWxlU2hlZXRDb2xsZWN0aW9uOwogCiAgICAgT3du
UHRyPEZvcm1Db250cm9sbGVyPiBtX2Zvcm1Db250cm9sbGVyOwogCkBAIC0xMzg2LDkgKzEzMjYs
NiBAQCBwcml2YXRlOgogICAgIENvbG9yIG1fdmlzaXRlZExpbmtDb2xvcjsKICAgICBDb2xvciBt
X2FjdGl2ZUxpbmtDb2xvcjsKIAotICAgIFN0cmluZyBtX3ByZWZlcnJlZFN0eWxlc2hlZXRTZXQ7
Ci0gICAgU3RyaW5nIG1fc2VsZWN0ZWRTdHlsZXNoZWV0U2V0OwotCiAgICAgYm9vbCBtX2xvYWRp
bmdTaGVldDsKICAgICBib29sIG1fdmlzdWFsbHlPcmRlcmVkOwogICAgIFJlYWR5U3RhdGUgbV9y
ZWFkeVN0YXRlOwpAQCAtMTM5OSwxNCArMTMzNiw2IEBAIHByaXZhdGU6CiAgICAgYm9vbCBtX2lu
U3R5bGVSZWNhbGM7CiAgICAgYm9vbCBtX2Nsb3NlQWZ0ZXJTdHlsZVJlY2FsYzsKIAotICAgIGJv
b2wgbV91c2VzU2libGluZ1J1bGVzOwotICAgIGJvb2wgbV91c2VzU2libGluZ1J1bGVzT3ZlcnJp
ZGU7Ci0gICAgYm9vbCBtX3VzZXNGaXJzdExpbmVSdWxlczsKLSAgICBib29sIG1fdXNlc0ZpcnN0
TGV0dGVyUnVsZXM7Ci0gICAgYm9vbCBtX3VzZXNCZWZvcmVBZnRlclJ1bGVzOwotICAgIGJvb2wg
bV91c2VzQmVmb3JlQWZ0ZXJSdWxlc092ZXJyaWRlOwotICAgIGJvb2wgbV91c2VzUmVtVW5pdHM7
Ci0gICAgYm9vbCBtX3VzZXNMaW5rUnVsZXM7CiAgICAgYm9vbCBtX2dvdG9BbmNob3JOZWVkZWRB
ZnRlclN0eWxlc2hlZXRzTG9hZDsKICAgICBib29sIG1faXNETlNQcmVmZXRjaEVuYWJsZWQ7CiAg
ICAgYm9vbCBtX2hhdmVFeHBsaWNpdGx5RGlzYWJsZWRETlNQcmVmZXRjaDsKSW5kZXg6IFNvdXJj
ZS9XZWJDb3JlL2RvbS9Eb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvV2ViQ29yZS9kb20vRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5jcHAJ
KHJldmlzaW9uIDEyOTQwNykJKGZyb20gU291cmNlL1dlYkNvcmUvZG9tL0RvY3VtZW50LmNwcDox
Mjk0MDcpCisrKyBTb3VyY2UvV2ViQ29yZS9kb20vRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlv
bi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2MzkzIEBACisvKgorICogQ29weXJpZ2h0
IChDKSAxOTk5IExhcnMgS25vbGwgKGtub2xsQGtkZS5vcmcpCisgKiAgICAgICAgICAgKEMpIDE5
OTkgQW50dGkgS29pdmlzdG8gKGtvaXZpc3RvQGtkZS5vcmcpCisgKiAgICAgICAgICAgKEMpIDIw
MDEgRGlyayBNdWVsbGVyIChtdWVsbGVyQGtkZS5vcmcpCisgKiAgICAgICAgICAgKEMpIDIwMDYg
QWxleGV5IFByb3NrdXJ5YWtvdiAoYXBAd2Via2l0Lm9yZykKKyAqIENvcHlyaWdodCAoQykgMjAw
NCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMSwgMjAxMiBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkgVG9yY2ggTW9i
aWxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gKGh0dHA6Ly93d3cudG9yY2htb2JpbGUuY29t
LykKKyAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSwgMjAxMSwgMjAxMiBHb29nbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEwIE5va2lhIENvcnBvcmF0
aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQorICogQ29weXJpZ2h0IChDKSBSZXNlYXJj
aCBJbiBNb3Rpb24gTGltaXRlZCAyMDEwLTIwMTEuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0
IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAo
YXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBp
cyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0
IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkg
b2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1v
cmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo
ZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMg
bGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICog
dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBG
aWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJEb2N1bWVudC5oIgorCisjaW5jbHVkZSAiQVhPYmpl
Y3RDYWNoZS5oIgorI2luY2x1ZGUgIkFuaW1hdGlvbkNvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJB
dHRyLmgiCisjaW5jbHVkZSAiQXR0cmlidXRlLmgiCisjaW5jbHVkZSAiQ0RBVEFTZWN0aW9uLmgi
CisjaW5jbHVkZSAiQ1NTUGFyc2VyLmgiCisjaW5jbHVkZSAiQ1NTU3R5bGVEZWNsYXJhdGlvbi5o
IgorI2luY2x1ZGUgIkNTU1N0eWxlU2hlZXQuaCIKKyNpbmNsdWRlICJDU1NWYWx1ZUtleXdvcmRz
LmgiCisjaW5jbHVkZSAiQ2FjaGVkQ1NTU3R5bGVTaGVldC5oIgorI2luY2x1ZGUgIkNhY2hlZFJl
c291cmNlTG9hZGVyLmgiCisjaW5jbHVkZSAiQ2hyb21lLmgiCisjaW5jbHVkZSAiQ2hyb21lQ2xp
ZW50LmgiCisjaW5jbHVkZSAiQ29tbWVudC5oIgorI2luY2x1ZGUgIkNvbnNvbGUuaCIKKyNpbmNs
dWRlICJDb250ZW50U2VjdXJpdHlQb2xpY3kuaCIKKyNpbmNsdWRlICJDb250ZXh0RmVhdHVyZXMu
aCIKKyNpbmNsdWRlICJDb29raWVKYXIuaCIKKyNpbmNsdWRlICJET01JbXBsZW1lbnRhdGlvbi5o
IgorI2luY2x1ZGUgIkRPTU5hbWVkRmxvd0NvbGxlY3Rpb24uaCIKKyNpbmNsdWRlICJET01TZWxl
Y3Rpb24uaCIKKyNpbmNsdWRlICJET01XaW5kb3cuaCIKKyNpbmNsdWRlICJEYXRlQ29tcG9uZW50
cy5oIgorI2luY2x1ZGUgIkRldmljZU1vdGlvbkNvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJEZXZp
Y2VPcmllbnRhdGlvbkNvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJEb2N1bWVudEV2ZW50UXVldWUu
aCIKKyNpbmNsdWRlICJEb2N1bWVudEZyYWdtZW50LmgiCisjaW5jbHVkZSAiRG9jdW1lbnRMb2Fk
ZXIuaCIKKyNpbmNsdWRlICJEb2N1bWVudE1hcmtlckNvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJE
b2N1bWVudFR5cGUuaCIKKyNpbmNsdWRlICJFZGl0aW5nVGV4dC5oIgorI2luY2x1ZGUgIkVkaXRv
ci5oIgorI2luY2x1ZGUgIkVsZW1lbnQuaCIKKyNpbmNsdWRlICJFbGVtZW50U2hhZG93LmgiCisj
aW5jbHVkZSAiRW50aXR5UmVmZXJlbmNlLmgiCisjaW5jbHVkZSAiRXZlbnQuaCIKKyNpbmNsdWRl
ICJFdmVudEZhY3RvcnkuaCIKKyNpbmNsdWRlICJFdmVudEhhbmRsZXIuaCIKKyNpbmNsdWRlICJF
dmVudExpc3RlbmVyLmgiCisjaW5jbHVkZSAiRXZlbnROYW1lcy5oIgorI2luY2x1ZGUgIkV4Y2Vw
dGlvbkNvZGUuaCIKKyNpbmNsdWRlICJGbG93VGhyZWFkQ29udHJvbGxlci5oIgorI2luY2x1ZGUg
IkZvY3VzQ29udHJvbGxlci5oIgorI2luY2x1ZGUgIkZvcm1Db250cm9sbGVyLmgiCisjaW5jbHVk
ZSAiRnJhbWUuaCIKKyNpbmNsdWRlICJGcmFtZUxvYWRlci5oIgorI2luY2x1ZGUgIkZyYW1lTG9h
ZGVyQ2xpZW50LmgiCisjaW5jbHVkZSAiRnJhbWVTZWxlY3Rpb24uaCIKKyNpbmNsdWRlICJGcmFt
ZVRyZWUuaCIKKyNpbmNsdWRlICJGcmFtZVZpZXcuaCIKKyNpbmNsdWRlICJHZW9sb2NhdGlvbkNv
bnRyb2xsZXIuaCIKKyNpbmNsdWRlICJIYXNoQ2hhbmdlRXZlbnQuaCIKKyNpbmNsdWRlICJIaXN0
b2dyYW1TdXBwb3J0LmgiCisjaW5jbHVkZSAiSGlzdG9yeS5oIgorI2luY2x1ZGUgIkhUTUxBbGxD
b2xsZWN0aW9uLmgiCisjaW5jbHVkZSAiSFRNTEFuY2hvckVsZW1lbnQuaCIKKyNpbmNsdWRlICJI
VE1MQm9keUVsZW1lbnQuaCIKKyNpbmNsdWRlICJIVE1MQ2FudmFzRWxlbWVudC5oIgorI2luY2x1
ZGUgIkhUTUxDb2xsZWN0aW9uLmgiCisjaW5jbHVkZSAiSFRNTERvY3VtZW50LmgiCisjaW5jbHVk
ZSAiSFRNTEVsZW1lbnRGYWN0b3J5LmgiCisjaW5jbHVkZSAiSFRNTEZyYW1lT3duZXJFbGVtZW50
LmgiCisjaW5jbHVkZSAiSFRNTEhlYWRFbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTElGcmFtZUVs
ZW1lbnQuaCIKKyNpbmNsdWRlICJIVE1MTGlua0VsZW1lbnQuaCIKKyNpbmNsdWRlICJIVE1MTWFw
RWxlbWVudC5oIgorI2luY2x1ZGUgIkhUTUxOYW1lQ29sbGVjdGlvbi5oIgorI2luY2x1ZGUgIkhU
TUxOYW1lcy5oIgorI2luY2x1ZGUgIkhUTUxQYXJzZXJJZGlvbXMuaCIKKyNpbmNsdWRlICJIVE1M
U3R5bGVFbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTFRpdGxlRWxlbWVudC5oIgorI2luY2x1ZGUg
IkhUVFBQYXJzZXJzLmgiCisjaW5jbHVkZSAiSGl0VGVzdFJlcXVlc3QuaCIKKyNpbmNsdWRlICJI
aXRUZXN0UmVzdWx0LmgiCisjaW5jbHVkZSAiSW1hZ2VMb2FkZXIuaCIKKyNpbmNsdWRlICJJbnNw
ZWN0b3JDb3VudGVycy5oIgorI2luY2x1ZGUgIkluc3BlY3Rvckluc3RydW1lbnRhdGlvbi5oIgor
I2luY2x1ZGUgIkxhbmd1YWdlLmgiCisjaW5jbHVkZSAiTG9jYWxpemVyLmgiCisjaW5jbHVkZSAi
TG9nZ2luZy5oIgorI2luY2x1ZGUgIk1lZGlhUXVlcnlMaXN0LmgiCisjaW5jbHVkZSAiTWVkaWFR
dWVyeU1hdGNoZXIuaCIKKyNpbmNsdWRlICJNb3VzZUV2ZW50V2l0aEhpdFRlc3RSZXN1bHRzLmgi
CisjaW5jbHVkZSAiTmFtZU5vZGVMaXN0LmgiCisjaW5jbHVkZSAiTmFtZWRGbG93Q29sbGVjdGlv
bi5oIgorI2luY2x1ZGUgIk5lc3RpbmdMZXZlbEluY3JlbWVudGVyLmgiCisjaW5jbHVkZSAiTmV3
WE1MRG9jdW1lbnRQYXJzZXIuaCIKKyNpbmNsdWRlICJOb2RlRmlsdGVyLmgiCisjaW5jbHVkZSAi
Tm9kZUl0ZXJhdG9yLmgiCisjaW5jbHVkZSAiTm9kZVJhcmVEYXRhLmgiCisjaW5jbHVkZSAiTm9k
ZVdpdGhJbmRleC5oIgorI2luY2x1ZGUgIlBhZ2UuaCIKKyNpbmNsdWRlICJQYWdlR3JvdXAuaCIK
KyNpbmNsdWRlICJQYWdlVHJhbnNpdGlvbkV2ZW50LmgiCisjaW5jbHVkZSAiUGxhdGZvcm1LZXli
b2FyZEV2ZW50LmgiCisjaW5jbHVkZSAiUGx1Z2luRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJQb2lu
dGVyTG9ja0NvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJQb3BTdGF0ZUV2ZW50LmgiCisjaW5jbHVk
ZSAiUHJvY2Vzc2luZ0luc3RydWN0aW9uLmgiCisjaW5jbHVkZSAiUXVhbGlmaWVkTmFtZS5oIgor
I2luY2x1ZGUgIlJlZ2lzdGVyZWRFdmVudExpc3RlbmVyLmgiCisjaW5jbHVkZSAiUmVuZGVyQXJl
bmEuaCIKKyNpbmNsdWRlICJSZW5kZXJOYW1lZEZsb3dUaHJlYWQuaCIKKyNpbmNsdWRlICJSZW5k
ZXJUZXh0Q29udHJvbC5oIgorI2luY2x1ZGUgIlJlbmRlclZpZXcuaCIKKyNpbmNsdWRlICJSZW5k
ZXJXaWRnZXQuaCIKKyNpbmNsdWRlICJSdW50aW1lRW5hYmxlZEZlYXR1cmVzLmgiCisjaW5jbHVk
ZSAiU2NoZW1lUmVnaXN0cnkuaCIKKyNpbmNsdWRlICJTY29wZWRFdmVudFF1ZXVlLmgiCisjaW5j
bHVkZSAiU2NyaXB0Q2FsbFN0YWNrLmgiCisjaW5jbHVkZSAiU2NyaXB0Q29udHJvbGxlci5oIgor
I2luY2x1ZGUgIlNjcmlwdEVsZW1lbnQuaCIKKyNpbmNsdWRlICJTY3JpcHRFdmVudExpc3RlbmVy
LmgiCisjaW5jbHVkZSAiU2NyaXB0UnVubmVyLmgiCisjaW5jbHVkZSAiU2Nyb2xsaW5nQ29vcmRp
bmF0b3IuaCIKKyNpbmNsdWRlICJTZWN1cml0eU9yaWdpbi5oIgorI2luY2x1ZGUgIlNlY3VyaXR5
UG9saWN5LmgiCisjaW5jbHVkZSAiU2VnbWVudGVkU3RyaW5nLmgiCisjaW5jbHVkZSAiU2VsZWN0
b3JRdWVyeS5oIgorI2luY2x1ZGUgIlNldHRpbmdzLmgiCisjaW5jbHVkZSAiU2hhZG93Um9vdC5o
IgorI2luY2x1ZGUgIlN0YXRpY0hhc2hTZXROb2RlTGlzdC5oIgorI2luY2x1ZGUgIlN0eWxlUmVz
b2x2ZXIuaCIKKyNpbmNsdWRlICJTdHlsZVNoZWV0Q29udGVudHMuaCIKKyNpbmNsdWRlICJTdHls
ZVNoZWV0TGlzdC5oIgorI2luY2x1ZGUgIlRleHRSZXNvdXJjZURlY29kZXIuaCIKKyNpbmNsdWRl
ICJUaW1lci5oIgorI2luY2x1ZGUgIlRyYW5zZm9ybVNvdXJjZS5oIgorI2luY2x1ZGUgIlRyZWVX
YWxrZXIuaCIKKyNpbmNsdWRlICJVbmRvTWFuYWdlci5oIgorI2luY2x1ZGUgIlVzZXJDb250ZW50
VVJMUGF0dGVybi5oIgorI2luY2x1ZGUgIldlYkNvcmVNZW1vcnlJbnN0cnVtZW50YXRpb24uaCIK
KyNpbmNsdWRlICJXZWJLaXROYW1lZEZsb3cuaCIKKyNpbmNsdWRlICJYTUxEb2N1bWVudFBhcnNl
ci5oIgorI2luY2x1ZGUgIlhNTEh0dHBSZXF1ZXN0LmgiCisjaW5jbHVkZSAiWE1MTlNOYW1lcy5o
IgorI2luY2x1ZGUgIlhNTE5hbWVzLmgiCisjaW5jbHVkZSAiWFBhdGhFdmFsdWF0b3IuaCIKKyNp
bmNsdWRlICJYUGF0aEV4cHJlc3Npb24uaCIKKyNpbmNsdWRlICJYUGF0aE5TUmVzb2x2ZXIuaCIK
KyNpbmNsdWRlICJYUGF0aFJlc3VsdC5oIgorI2luY2x1ZGUgImh0bWxlZGl0aW5nLmgiCisjaW5j
bHVkZSA8d3RmL0N1cnJlbnRUaW1lLmg+CisjaW5jbHVkZSA8d3RmL0hhc2hGdW5jdGlvbnMuaD4K
KyNpbmNsdWRlIDx3dGYvTWFpblRocmVhZC5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzUmVmUHRyLmg+
CisjaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1N0cmlu
Z0J1ZmZlci5oPgorCisjaWYgRU5BQkxFKFNIQVJFRF9XT1JLRVJTKQorI2luY2x1ZGUgIlNoYXJl
ZFdvcmtlclJlcG9zaXRvcnkuaCIKKyNlbmRpZgorCisjaWYgRU5BQkxFKFhTTFQpCisjaW5jbHVk
ZSAiWFNMVFByb2Nlc3Nvci5oIgorI2VuZGlmCisKKyNpZiBFTkFCTEUoU1ZHKQorI2luY2x1ZGUg
IlNWR0RvY3VtZW50RXh0ZW5zaW9ucy5oIgorI2luY2x1ZGUgIlNWR0VsZW1lbnRGYWN0b3J5Lmgi
CisjaW5jbHVkZSAiU1ZHTmFtZXMuaCIKKyNpbmNsdWRlICJTVkdTVkdFbGVtZW50LmgiCisjaW5j
bHVkZSAiU1ZHU3R5bGVFbGVtZW50LmgiCisjZW5kaWYKKworI2lmIEVOQUJMRShUT1VDSF9FVkVO
VFMpCisjaW5jbHVkZSAiVG91Y2hMaXN0LmgiCisjZW5kaWYKKworI2lmIEVOQUJMRShNQVRITUwp
CisjaW5jbHVkZSAiTWF0aE1MRWxlbWVudC5oIgorI2luY2x1ZGUgIk1hdGhNTEVsZW1lbnRGYWN0
b3J5LmgiCisjaW5jbHVkZSAiTWF0aE1MTmFtZXMuaCIKKyNlbmRpZgorCisjaWYgRU5BQkxFKEZV
TExTQ1JFRU5fQVBJKQorI2luY2x1ZGUgIlJlbmRlckZ1bGxTY3JlZW4uaCIKKyNlbmRpZgorCisj
aWYgRU5BQkxFKFJFUVVFU1RfQU5JTUFUSU9OX0ZSQU1FKQorI2luY2x1ZGUgIlJlcXVlc3RBbmlt
YXRpb25GcmFtZUNhbGxiYWNrLmgiCisjaW5jbHVkZSAiU2NyaXB0ZWRBbmltYXRpb25Db250cm9s
bGVyLmgiCisjZW5kaWYKKworI2lmIEVOQUJMRShNSUNST0RBVEEpCisjaW5jbHVkZSAiTWljcm9E
YXRhSXRlbUxpc3QuaCIKKyNpbmNsdWRlICJOb2RlUmFyZURhdGEuaCIKKyNlbmRpZgorCisjaWYg
RU5BQkxFKExJTktfUFJFUkVOREVSKQorI2luY2x1ZGUgIlByZXJlbmRlcmVyLmgiCisjZW5kaWYK
KworI2lmIEVOQUJMRShURVhUX0FVVE9TSVpJTkcpCisjaW5jbHVkZSAiVGV4dEF1dG9zaXplci5o
IgorI2VuZGlmCisKKyNpZiBFTkFCTEUoQ1NQX05FWFQpCisjaW5jbHVkZSAiRE9NU2VjdXJpdHlQ
b2xpY3kuaCIKKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgbmFtZXNwYWNl
IFdURjsKK3VzaW5nIG5hbWVzcGFjZSBVbmljb2RlOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisK
K3VzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7CisKKy8vICNkZWZpbmUgSU5TVFJVTUVOVF9MQVlP
VVRfU0NIRURVTElORyAxCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjTWF4V3JpdGVSZWN1cnNp
b25EZXB0aCA9IDIxOworCisvLyBUaGlzIGFtb3VudCBvZiB0aW1lIG11c3QgaGF2ZSBlbGFwc2Vk
IGJlZm9yZSB3ZSB3aWxsIGV2ZW4gY29uc2lkZXIgc2NoZWR1bGluZyBhIGxheW91dCB3aXRob3V0
IGEgZGVsYXkuCisvLyBGSVhNRTogRm9yIGZhc3RlciBtYWNoaW5lcyB0aGlzIHZhbHVlIGNhbiBy
ZWFsbHkgYmUgbG93ZXJlZCB0byAyMDAuICAyNTAgaXMgYWRlcXVhdGUsIGJ1dCBhIGxpdHRsZSBo
aWdoCisvLyBmb3IgZHVhbCBHNXMuIDopCitzdGF0aWMgY29uc3QgaW50IGNMYXlvdXRTY2hlZHVs
ZVRocmVzaG9sZCA9IDI1MDsKKworLy8gRE9NIExldmVsIDIgc2F5cyAobGV0dGVycyBhZGRlZCk6
CisvLworLy8gYSkgTmFtZSBzdGFydCBjaGFyYWN0ZXJzIG11c3QgaGF2ZSBvbmUgb2YgdGhlIGNh
dGVnb3JpZXMgTGwsIEx1LCBMbywgTHQsIE5sLgorLy8gYikgTmFtZSBjaGFyYWN0ZXJzIG90aGVy
IHRoYW4gTmFtZS1zdGFydCBjaGFyYWN0ZXJzIG11c3QgaGF2ZSBvbmUgb2YgdGhlIGNhdGVnb3Jp
ZXMgTWMsIE1lLCBNbiwgTG0sIG9yIE5kLgorLy8gYykgQ2hhcmFjdGVycyBpbiB0aGUgY29tcGF0
aWJpbGl0eSBhcmVhIChpLmUuIHdpdGggY2hhcmFjdGVyIGNvZGUgZ3JlYXRlciB0aGFuICN4Rjkw
MCBhbmQgbGVzcyB0aGFuICN4RkZGRSkgYXJlIG5vdCBhbGxvd2VkIGluIFhNTCBuYW1lcy4KKy8v
IGQpIENoYXJhY3RlcnMgd2hpY2ggaGF2ZSBhIGZvbnQgb3IgY29tcGF0aWJpbGl0eSBkZWNvbXBv
c2l0aW9uIChpLmUuIHRob3NlIHdpdGggYSAiY29tcGF0aWJpbGl0eSBmb3JtYXR0aW5nIHRhZyIg
aW4gZmllbGQgNSBvZiB0aGUgZGF0YWJhc2UgLS0gbWFya2VkIGJ5IGZpZWxkIDUgYmVnaW5uaW5n
IHdpdGggYSAiPCIpIGFyZSBub3QgYWxsb3dlZC4KKy8vIGUpIFRoZSBmb2xsb3dpbmcgY2hhcmFj
dGVycyBhcmUgdHJlYXRlZCBhcyBuYW1lLXN0YXJ0IGNoYXJhY3RlcnMgcmF0aGVyIHRoYW4gbmFt
ZSBjaGFyYWN0ZXJzLCBiZWNhdXNlIHRoZSBwcm9wZXJ0eSBmaWxlIGNsYXNzaWZpZXMgdGhlbSBh
cyBBbHBoYWJldGljOiBbI3gwMkJCLSN4MDJDMV0sICN4MDU1OSwgI3gwNkU1LCAjeDA2RTYuCisv
LyBmKSBDaGFyYWN0ZXJzICN4MjBERC0jeDIwRTAgYXJlIGV4Y2x1ZGVkIChpbiBhY2NvcmRhbmNl
IHdpdGggVW5pY29kZSwgc2VjdGlvbiA1LjE0KS4KKy8vIGcpIENoYXJhY3RlciAjeDAwQjcgaXMg
Y2xhc3NpZmllZCBhcyBhbiBleHRlbmRlciwgYmVjYXVzZSB0aGUgcHJvcGVydHkgbGlzdCBzbyBp
ZGVudGlmaWVzIGl0LgorLy8gaCkgQ2hhcmFjdGVyICN4MDM4NyBpcyBhZGRlZCBhcyBhIG5hbWUg
Y2hhcmFjdGVyLCBiZWNhdXNlICN4MDBCNyBpcyBpdHMgY2Fub25pY2FsIGVxdWl2YWxlbnQuCisv
LyBpKSBDaGFyYWN0ZXJzICc6JyBhbmQgJ18nIGFyZSBhbGxvd2VkIGFzIG5hbWUtc3RhcnQgY2hh
cmFjdGVycy4KKy8vIGopIENoYXJhY3RlcnMgJy0nIGFuZCAnLicgYXJlIGFsbG93ZWQgYXMgbmFt
ZSBjaGFyYWN0ZXJzLgorLy8KKy8vIEl0IGFsc28gY29udGFpbnMgY29tcGxldGUgdGFibGVzLiBJ
ZiB3ZSBkZWNpZGUgaXQncyBiZXR0ZXIsIHdlIGNvdWxkIGluY2x1ZGUgdGhvc2UgaW5zdGVhZCBv
ZiB0aGUgZm9sbG93aW5nIGNvZGUuCisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc1ZhbGlkTmFtZVN0
YXJ0KFVDaGFyMzIgYykKK3sKKyAgICAvLyBydWxlIChlKSBhYm92ZQorICAgIGlmICgoYyA+PSAw
eDAyQkIgJiYgYyA8PSAweDAyQzEpIHx8IGMgPT0gMHg1NTkgfHwgYyA9PSAweDZFNSB8fCBjID09
IDB4NkU2KQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIHJ1bGUgKGkpIGFib3ZlCisg
ICAgaWYgKGMgPT0gJzonIHx8IGMgPT0gJ18nKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAg
IC8vIHJ1bGVzIChhKSBhbmQgKGYpIGFib3ZlCisgICAgY29uc3QgdWludDMyX3QgbmFtZVN0YXJ0
TWFzayA9IExldHRlcl9Mb3dlcmNhc2UgfCBMZXR0ZXJfVXBwZXJjYXNlIHwgTGV0dGVyX090aGVy
IHwgTGV0dGVyX1RpdGxlY2FzZSB8IE51bWJlcl9MZXR0ZXI7CisgICAgaWYgKCEoVW5pY29kZTo6
Y2F0ZWdvcnkoYykgJiBuYW1lU3RhcnRNYXNrKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgLy8gcnVsZSAoYykgYWJvdmUKKyAgICBpZiAoYyA+PSAweEY5MDAgJiYgYyA8IDB4RkZGRSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gcnVsZSAoZCkgYWJvdmUKKyAgICBEZWNv
bXBvc2l0aW9uVHlwZSBkZWNvbXBUeXBlID0gZGVjb21wb3NpdGlvblR5cGUoYyk7CisgICAgaWYg
KGRlY29tcFR5cGUgPT0gRGVjb21wb3NpdGlvbkZvbnQgfHwgZGVjb21wVHlwZSA9PSBEZWNvbXBv
c2l0aW9uQ29tcGF0KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1ZTsK
K30KKworc3RhdGljIGlubGluZSBib29sIGlzVmFsaWROYW1lUGFydChVQ2hhcjMyIGMpCit7Cisg
ICAgLy8gcnVsZXMgKGEpLCAoZSksIGFuZCAoaSkgYWJvdmUKKyAgICBpZiAoaXNWYWxpZE5hbWVT
dGFydChjKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBydWxlcyAoZykgYW5kICho
KSBhYm92ZQorICAgIGlmIChjID09IDB4MDBCNyB8fCBjID09IDB4MDM4NykKKyAgICAgICAgcmV0
dXJuIHRydWU7CisKKyAgICAvLyBydWxlIChqKSBhYm92ZQorICAgIGlmIChjID09ICctJyB8fCBj
ID09ICcuJykKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBydWxlcyAoYikgYW5kIChm
KSBhYm92ZQorICAgIGNvbnN0IHVpbnQzMl90IG90aGVyTmFtZVBhcnRNYXNrID0gTWFya19Ob25T
cGFjaW5nIHwgTWFya19FbmNsb3NpbmcgfCBNYXJrX1NwYWNpbmdDb21iaW5pbmcgfCBMZXR0ZXJf
TW9kaWZpZXIgfCBOdW1iZXJfRGVjaW1hbERpZ2l0OworICAgIGlmICghKFVuaWNvZGU6OmNhdGVn
b3J5KGMpICYgb3RoZXJOYW1lUGFydE1hc2spKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICAvLyBydWxlIChjKSBhYm92ZQorICAgIGlmIChjID49IDB4RjkwMCAmJiBjIDwgMHhGRkZFKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBydWxlIChkKSBhYm92ZQorICAgIERlY29t
cG9zaXRpb25UeXBlIGRlY29tcFR5cGUgPSBkZWNvbXBvc2l0aW9uVHlwZShjKTsKKyAgICBpZiAo
ZGVjb21wVHlwZSA9PSBEZWNvbXBvc2l0aW9uRm9udCB8fCBkZWNvbXBUeXBlID09IERlY29tcG9z
aXRpb25Db21wYXQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOwor
fQorCitzdGF0aWMgYm9vbCBzaG91bGRJbmhlcml0U2VjdXJpdHlPcmlnaW5Gcm9tT3duZXIoY29u
c3QgS1VSTCYgdXJsKQoreworICAgIC8vIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWIt
YXBwcy9jdXJyZW50LXdvcmsvI29yaWdpbi0wCisgICAgLy8KKyAgICAvLyBJZiBhIERvY3VtZW50
IGhhcyB0aGUgYWRkcmVzcyAiYWJvdXQ6YmxhbmsiCisgICAgLy8gICAgIFRoZSBvcmlnaW4gb2Yg
dGhlIERvY3VtZW50IGlzIHRoZSBvcmlnaW4gaXQgd2FzIGFzc2lnbmVkIHdoZW4gaXRzIGJyb3dz
aW5nIGNvbnRleHQgd2FzIGNyZWF0ZWQuCisgICAgLy8KKyAgICAvLyBOb3RlOiBXZSBnZW5lcmFs
aXplIHRoaXMgdG8gYWxsICJibGFuayIgVVJMcyBhbmQgaW52YWxpZCBVUkxzIGJlY2F1c2Ugd2UK
KyAgICAvLyB0cmVhdCBhbGwgb2YgdGhlc2UgVVJMcyBhcyBhYm91dDpibGFuay4KKyAgICAvLwor
ICAgIHJldHVybiAhdXJsLmlzVmFsaWQoKSB8fCB1cmwuaXNCbGFua1VSTCgpOworfQorCitzdGF0
aWMgV2lkZ2V0KiB3aWRnZXRGb3JOb2RlKE5vZGUqIGZvY3VzZWROb2RlKQoreworICAgIGlmICgh
Zm9jdXNlZE5vZGUpCisgICAgICAgIHJldHVybiAwOworICAgIFJlbmRlck9iamVjdCogcmVuZGVy
ZXIgPSBmb2N1c2VkTm9kZS0+cmVuZGVyZXIoKTsKKyAgICBpZiAoIXJlbmRlcmVyIHx8ICFyZW5k
ZXJlci0+aXNXaWRnZXQoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIHRvUmVuZGVy
V2lkZ2V0KHJlbmRlcmVyKS0+d2lkZ2V0KCk7Cit9CisKK3N0YXRpYyBib29sIGFjY2VwdHNFZGl0
aW5nRm9jdXMoTm9kZSogbm9kZSkKK3sKKyAgICBBU1NFUlQobm9kZSk7CisgICAgQVNTRVJUKG5v
ZGUtPnJlbmRlcmVySXNFZGl0YWJsZSgpKTsKKworICAgIE5vZGUqIHJvb3QgPSBub2RlLT5yb290
RWRpdGFibGVFbGVtZW50KCk7CisgICAgRnJhbWUqIGZyYW1lID0gbm9kZS0+ZG9jdW1lbnQoKS0+
ZnJhbWUoKTsKKyAgICBpZiAoIWZyYW1lIHx8ICFyb290KQorICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICByZXR1cm4gZnJhbWUtPmVkaXRvcigpLT5zaG91bGRCZWdpbkVkaXRpbmcocmFuZ2VP
ZkNvbnRlbnRzKHJvb3QpLmdldCgpKTsKK30KKworc3RhdGljIGJvb2wgY2FuQWNjZXNzQW5jZXN0
b3IoY29uc3QgU2VjdXJpdHlPcmlnaW4qIGFjdGl2ZVNlY3VyaXR5T3JpZ2luLCBGcmFtZSogdGFy
Z2V0RnJhbWUpCit7CisgICAgLy8gdGFyZ2V0RnJhbWUgY2FuIGJlIDAgd2hlbiB3ZSdyZSB0cnlp
bmcgdG8gbmF2aWdhdGUgYSB0b3AtbGV2ZWwgZnJhbWUKKyAgICAvLyB0aGF0IGhhcyBhIDAgb3Bl
bmVyLgorICAgIGlmICghdGFyZ2V0RnJhbWUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
IGNvbnN0IGJvb2wgaXNMb2NhbEFjdGl2ZU9yaWdpbiA9IGFjdGl2ZVNlY3VyaXR5T3JpZ2luLT5p
c0xvY2FsKCk7CisgICAgZm9yIChGcmFtZSogYW5jZXN0b3JGcmFtZSA9IHRhcmdldEZyYW1lOyBh
bmNlc3RvckZyYW1lOyBhbmNlc3RvckZyYW1lID0gYW5jZXN0b3JGcmFtZS0+dHJlZSgpLT5wYXJl
bnQoKSkgeworICAgICAgICBEb2N1bWVudCogYW5jZXN0b3JEb2N1bWVudCA9IGFuY2VzdG9yRnJh
bWUtPmRvY3VtZW50KCk7CisgICAgICAgIC8vIEZJWE1FOiBTaG91bGQgYmUgYW4gQVNTRVJUPyBG
cmFtZXMgc2hvdWxkIGFsd2F5IGhhdmUgZG9jdW1lbnRzLgorICAgICAgICBpZiAoIWFuY2VzdG9y
RG9jdW1lbnQpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICBjb25zdCBTZWN1
cml0eU9yaWdpbiogYW5jZXN0b3JTZWN1cml0eU9yaWdpbiA9IGFuY2VzdG9yRG9jdW1lbnQtPnNl
Y3VyaXR5T3JpZ2luKCk7CisgICAgICAgIGlmIChhY3RpdmVTZWN1cml0eU9yaWdpbi0+Y2FuQWNj
ZXNzKGFuY2VzdG9yU2VjdXJpdHlPcmlnaW4pKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgICAgIAorICAgICAgICAvLyBBbGxvdyBmaWxlIFVSTCBkZXNjZW5kYW50IG5hdmlnYXRpb24g
ZXZlbiB3aGVuIGFsbG93RmlsZUFjY2Vzc0Zyb21GaWxlVVJMcyBpcyBmYWxzZS4KKyAgICAgICAg
Ly8gRklYTUU6IEl0J3MgYSBiaXQgc3RyYW5nZSB0byBzcGVjaWFsLWNhc2UgbG9jYWwgb3JpZ2lu
cyBoZXJlLiBTaG91bGQgd2UgYmUgZG9pbmcKKyAgICAgICAgLy8gc29tZXRoaW5nIG1vcmUgZ2Vu
ZXJhbCBpbnN0ZWFkPworICAgICAgICBpZiAoaXNMb2NhbEFjdGl2ZU9yaWdpbiAmJiBhbmNlc3Rv
clNlY3VyaXR5T3JpZ2luLT5pc0xvY2FsKCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50TmF2aWdhdGlv
bkVycm9yTWVzc2FnZShGcmFtZSogZnJhbWUsIGNvbnN0IEtVUkwmIGFjdGl2ZVVSTCkKK3sKKyAg
ICAvLyBGSVhNRTogdGhpcyBlcnJvciBtZXNzYWdlIHNob3VsZCBjb250YWluIG1vcmUgc3BlY2lm
aWNzIG9mIHdoeSB0aGUgbmF2aWdhdGlvbiBjaGFuZ2UgaXMgbm90IGFsbG93ZWQuCisgICAgU3Ry
aW5nIG1lc3NhZ2UgPSAiVW5zYWZlIEphdmFTY3JpcHQgYXR0ZW1wdCB0byBpbml0aWF0ZSBhIG5h
dmlnYXRpb24gY2hhbmdlIGZvciBmcmFtZSB3aXRoIFVSTCAiICsKKyAgICAgICAgICAgICAgICAg
ICAgIGZyYW1lLT5kb2N1bWVudCgpLT51cmwoKS5zdHJpbmcoKSArICIgZnJvbSBmcmFtZSB3aXRo
IFVSTCAiICsgYWN0aXZlVVJMLnN0cmluZygpICsgIi5cbiI7CisKKyAgICAvLyBGSVhNRTogc2hv
dWxkIHdlIHByaW50IHRvIHRoZSBjb25zb2xlIG9mIHRoZSBkb2N1bWVudCBwZXJmb3JtaW5nIHRo
ZSBuYXZpZ2F0aW9uIGluc3RlYWQ/CisgICAgZnJhbWUtPmRvY3VtZW50KCktPmRvbVdpbmRvdygp
LT5wcmludEVycm9yTWVzc2FnZShtZXNzYWdlKTsKK30KKworc3RhdGljIEhhc2hTZXQ8RG9jdW1l
bnQqPiogZG9jdW1lbnRzVGhhdE5lZWRTdHlsZVJlY2FsYyA9IDA7CisKK2NsYXNzIERvY3VtZW50
V2Vha1JlZmVyZW5jZSA6IHB1YmxpYyBUaHJlYWRTYWZlUmVmQ291bnRlZDxEb2N1bWVudFdlYWtS
ZWZlcmVuY2U+IHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxEb2N1bWVudFdlYWtS
ZWZlcmVuY2U+IGNyZWF0ZShEb2N1bWVudCogZG9jdW1lbnQpCisgICAgeworICAgICAgICByZXR1
cm4gYWRvcHRSZWYobmV3IERvY3VtZW50V2Vha1JlZmVyZW5jZShkb2N1bWVudCkpOworICAgIH0K
KworICAgIERvY3VtZW50KiBkb2N1bWVudCgpCisgICAgeworICAgICAgICBBU1NFUlQoaXNNYWlu
VGhyZWFkKCkpOworICAgICAgICByZXR1cm4gbV9kb2N1bWVudDsKKyAgICB9CisKKyAgICB2b2lk
IGNsZWFyKCkKKyAgICB7CisgICAgICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisgICAgICAg
IG1fZG9jdW1lbnQgPSAwOworICAgIH0KKworcHJpdmF0ZToKKyAgICBEb2N1bWVudFdlYWtSZWZl
cmVuY2UoRG9jdW1lbnQqIGRvY3VtZW50KQorICAgICAgICA6IG1fZG9jdW1lbnQoZG9jdW1lbnQp
CisgICAgeworICAgICAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworICAgIH0KKworICAgIERv
Y3VtZW50KiBtX2RvY3VtZW50OworfTsKKwordWludDY0X3QgRG9jdW1lbnQ6OnNfZ2xvYmFsVHJl
ZVZlcnNpb24gPSAwOworCitEb2N1bWVudDo6RG9jdW1lbnQoRnJhbWUqIGZyYW1lLCBjb25zdCBL
VVJMJiB1cmwsIGJvb2wgaXNYSFRNTCwgYm9vbCBpc0hUTUwpCisgICAgOiBDb250YWluZXJOb2Rl
KDAsIENyZWF0ZURvY3VtZW50KQorICAgICwgVHJlZVNjb3BlKHRoaXMpCisgICAgLCBtX2d1YXJk
UmVmQ291bnQoMCkKKyAgICAsIG1fY29udGV4dEZlYXR1cmVzKENvbnRleHRGZWF0dXJlczo6ZGVm
YXVsdFN3aXRjaCgpKQorICAgICwgbV9jb21wYXRpYmlsaXR5TW9kZShOb1F1aXJrc01vZGUpCisg
ICAgLCBtX2NvbXBhdGliaWxpdHlNb2RlTG9ja2VkKGZhbHNlKQorICAgICwgbV9kb21UcmVlVmVy
c2lvbigrK3NfZ2xvYmFsVHJlZVZlcnNpb24pCisjaWYgRU5BQkxFKE1VVEFUSU9OX09CU0VSVkVS
UykKKyAgICAsIG1fbXV0YXRpb25PYnNlcnZlclR5cGVzKDApCisjZW5kaWYKKyAgICAsIG1fc3R5
bGVTaGVldHMoU3R5bGVTaGVldExpc3Q6OmNyZWF0ZSh0aGlzKSkKKyAgICAsIG1faGFkQWN0aXZl
TG9hZGluZ1N0eWxlc2hlZXQoZmFsc2UpCisgICAgLCBtX3JlYWR5U3RhdGUoQ29tcGxldGUpCisg
ICAgLCBtX3N0eWxlUmVjYWxjVGltZXIodGhpcywgJkRvY3VtZW50OjpzdHlsZVJlY2FsY1RpbWVy
RmlyZWQpCisgICAgLCBtX3BlbmRpbmdTdHlsZVJlY2FsY1Nob3VsZEZvcmNlKGZhbHNlKQorICAg
ICwgbV9mcmFtZUVsZW1lbnRzU2hvdWxkSWdub3JlU2Nyb2xsaW5nKGZhbHNlKQorICAgICwgbV9j
b250YWluc1ZhbGlkaXR5U3R5bGVSdWxlcyhmYWxzZSkKKyAgICAsIG1fdXBkYXRlRm9jdXNBcHBl
YXJhbmNlUmVzdG9yZXNTZWxlY3Rpb24oZmFsc2UpCisgICAgLCBtX2lnbm9yZURlc3RydWN0aXZl
V3JpdGVDb3VudCgwKQorICAgICwgbV90aXRsZVNldEV4cGxpY2l0bHkoZmFsc2UpCisgICAgLCBt
X3VwZGF0ZUZvY3VzQXBwZWFyYW5jZVRpbWVyKHRoaXMsICZEb2N1bWVudDo6dXBkYXRlRm9jdXNB
cHBlYXJhbmNlVGltZXJGaXJlZCkKKyAgICAsIG1fbG9hZEV2ZW50RmluaXNoZWQoZmFsc2UpCisg
ICAgLCBtX3N0YXJ0VGltZShjdXJyZW50VGltZSgpKQorICAgICwgbV9vdmVyTWluaW11bUxheW91
dFRocmVzaG9sZChmYWxzZSkKKyAgICAsIG1fc2NyaXB0UnVubmVyKFNjcmlwdFJ1bm5lcjo6Y3Jl
YXRlKHRoaXMpKQorICAgICwgbV94bWxWZXJzaW9uKCIxLjAiKQorICAgICwgbV94bWxTdGFuZGFs
b25lKFN0YW5kYWxvbmVVbnNwZWNpZmllZCkKKyAgICAsIG1faGFzWE1MRGVjbGFyYXRpb24oMCkK
KyAgICAsIG1fc2F2ZWRSZW5kZXJlcigwKQorICAgICwgbV9kZXNpZ25Nb2RlKGluaGVyaXQpCisj
aWYgRU5BQkxFKERBU0hCT0FSRF9TVVBQT1JUKSB8fCBFTkFCTEUoV0lER0VUX1JFR0lPTikKKyAg
ICAsIG1faGFzRGFzaGJvYXJkUmVnaW9ucyhmYWxzZSkKKyAgICAsIG1fZGFzaGJvYXJkUmVnaW9u
c0RpcnR5KGZhbHNlKQorI2VuZGlmCisgICAgLCBtX2NyZWF0ZVJlbmRlcmVycyh0cnVlKQorICAg
ICwgbV9pblBhZ2VDYWNoZShmYWxzZSkKKyAgICAsIG1fYWNjZXNzS2V5TWFwVmFsaWQoZmFsc2Up
CisgICAgLCBtX3VzZVNlY3VyZUtleWJvYXJkRW50cnlXaGVuQWN0aXZlKGZhbHNlKQorICAgICwg
bV9pc1hIVE1MKGlzWEhUTUwpCisgICAgLCBtX2lzSFRNTChpc0hUTUwpCisgICAgLCBtX2lzVmll
d1NvdXJjZShmYWxzZSkKKyAgICAsIG1fc2F3RWxlbWVudHNJbktub3duTmFtZXNwYWNlcyhmYWxz
ZSkKKyAgICAsIG1faXNTcmNkb2NEb2N1bWVudChmYWxzZSkKKyAgICAsIG1fZG9jdW1lbnRSYXJl
RGF0YSgwKQorICAgICwgbV9ldmVudFF1ZXVlKERvY3VtZW50RXZlbnRRdWV1ZTo6Y3JlYXRlKHRo
aXMpKQorICAgICwgbV93ZWFrUmVmZXJlbmNlKERvY3VtZW50V2Vha1JlZmVyZW5jZTo6Y3JlYXRl
KHRoaXMpKQorICAgICwgbV9pZEF0dHJpYnV0ZU5hbWUoaWRBdHRyKQorI2lmIEVOQUJMRShGVUxM
U0NSRUVOX0FQSSkKKyAgICAsIG1fYXJlS2V5c0VuYWJsZWRJbkZ1bGxTY3JlZW4oMCkKKyAgICAs
IG1fZnVsbFNjcmVlblJlbmRlcmVyKDApCisgICAgLCBtX2Z1bGxTY3JlZW5DaGFuZ2VEZWxheVRp
bWVyKHRoaXMsICZEb2N1bWVudDo6ZnVsbFNjcmVlbkNoYW5nZURlbGF5VGltZXJGaXJlZCkKKyAg
ICAsIG1faXNBbmltYXRpbmdGdWxsU2NyZWVuKGZhbHNlKQorI2VuZGlmCisgICAgLCBtX2xvYWRF
dmVudERlbGF5Q291bnQoMCkKKyAgICAsIG1fbG9hZEV2ZW50RGVsYXlUaW1lcih0aGlzLCAmRG9j
dW1lbnQ6OmxvYWRFdmVudERlbGF5VGltZXJGaXJlZCkKKyAgICAsIG1fcmVmZXJyZXJQb2xpY3ko
UmVmZXJyZXJQb2xpY3lEZWZhdWx0KQorICAgICwgbV9kaXJlY3Rpb25TZXRPbkRvY3VtZW50RWxl
bWVudChmYWxzZSkKKyAgICAsIG1fd3JpdGluZ01vZGVTZXRPbkRvY3VtZW50RWxlbWVudChmYWxz
ZSkKKyAgICAsIG1fd3JpdGVSZWN1cnNpb25Jc1Rvb0RlZXAoZmFsc2UpCisgICAgLCBtX3dyaXRl
UmVjdXJzaW9uRGVwdGgoMCkKKyAgICAsIG1fd2hlZWxFdmVudEhhbmRsZXJDb3VudCgwKQorI2lm
IEVOQUJMRShUT1VDSF9FVkVOVFMpCisgICAgLCBtX3RvdWNoRXZlbnRIYW5kbGVyQ291bnQoMCkK
KyNlbmRpZgorI2lmIEVOQUJMRShVTkRPX01BTkFHRVIpCisgICAgLCBtX3VuZG9NYW5hZ2VyKDAp
CisjZW5kaWYKKyAgICAsIG1fcGVuZGluZ1Rhc2tzVGltZXIodGhpcywgJkRvY3VtZW50OjpwZW5k
aW5nVGFza3NUaW1lckZpcmVkKQorICAgICwgbV9zY2hlZHVsZWRUYXNrc0FyZVN1c3BlbmRlZChm
YWxzZSkKKyAgICAsIG1fdmlzdWFsVXBkYXRlc0FsbG93ZWQodHJ1ZSkKKyAgICAsIG1fdmlzdWFs
VXBkYXRlc1N1cHByZXNzaW9uVGltZXIodGhpcywgJkRvY3VtZW50Ojp2aXN1YWxVcGRhdGVzU3Vw
cHJlc3Npb25UaW1lckZpcmVkKQorI2lmbmRlZiBOREVCVUcKKyAgICAsIG1fZGlkRGlzcGF0Y2hW
aWV3cG9ydFByb3BlcnRpZXNDaGFuZ2VkKGZhbHNlKQorI2VuZGlmCit7CisgICAgbV9kb2N1bWVu
dCA9IHRoaXM7CisKKyAgICBtX3BhZ2VHcm91cFVzZXJTaGVldENhY2hlVmFsaWQgPSBmYWxzZTsK
KworICAgIG1fcHJpbnRpbmcgPSBmYWxzZTsKKyAgICBtX3BhZ2luYXRlZEZvclNjcmVlbiA9IGZh
bHNlOworCisgICAgbV9pZ25vcmVBdXRvZm9jdXMgPSBmYWxzZTsKKworICAgIG1fZnJhbWUgPSBm
cmFtZTsKKyAgICBpZiAobV9mcmFtZSkKKyAgICAgICAgcHJvdmlkZUNvbnRleHRGZWF0dXJlc1Rv
RG9jdW1lbnRGcm9tKHRoaXMsIG1fZnJhbWUtPnBhZ2UoKSk7CisKKyAgICAvLyBXZSBkZXBlbmQg
b24gdGhlIHVybCBnZXR0aW5nIGltbWVkaWF0ZWx5IHNldCBpbiBzdWJmcmFtZXMsIGJ1dCB3ZQor
ICAgIC8vIGFsc28gZGVwZW5kIG9uIHRoZSB1cmwgTk9UIGdldHRpbmcgaW1tZWRpYXRlbHkgc2V0
IGluIG9wZW5lZCB3aW5kb3dzLgorICAgIC8vIFNlZSBmYXN0L2RvbS9lYXJseS1mcmFtZS11cmwu
aHRtbAorICAgIC8vIGFuZCBmYXN0L2RvbS9sb2NhdGlvbi1uZXctd2luZG93LW5vLWNyYXNoLmh0
bWwsIHJlc3BlY3RpdmVseS4KKyAgICAvLyBGSVhNRTogQ2FuL3Nob3VsZCB3ZSB1bmlmeSB0aGlz
IGJlaGF2aW9yPworICAgIGlmICgoZnJhbWUgJiYgZnJhbWUtPm93bmVyRWxlbWVudCgpKSB8fCAh
dXJsLmlzRW1wdHkoKSkKKyAgICAgICAgc2V0VVJMKHVybCk7CisKKyAgICBtX2F4T2JqZWN0Q2Fj
aGUgPSAwOworCisgICAgbV9tYXJrZXJzID0gYWRvcHRQdHIobmV3IERvY3VtZW50TWFya2VyQ29u
dHJvbGxlcik7CisKKyAgICBtX2NhY2hlZFJlc291cmNlTG9hZGVyID0gYWRvcHRQdHIobmV3IENh
Y2hlZFJlc291cmNlTG9hZGVyKHRoaXMpKTsKKyNpZiBFTkFCTEUoTElOS19QUkVSRU5ERVIpCisg
ICAgbV9wcmVyZW5kZXJlciA9IFByZXJlbmRlcmVyOjpjcmVhdGUodGhpcyk7CisjZW5kaWYKKyNp
ZiBFTkFCTEUoVEVYVF9BVVRPU0laSU5HKQorICAgIG1fdGV4dEF1dG9zaXplciA9IFRleHRBdXRv
c2l6ZXI6OmNyZWF0ZSh0aGlzKTsKKyNlbmRpZgorICAgIG1fdmlzdWFsbHlPcmRlcmVkID0gZmFs
c2U7CisgICAgbV9iUGFyc2luZyA9IGZhbHNlOworICAgIG1fd2VsbEZvcm1lZCA9IGZhbHNlOwor
CisgICAgbV90ZXh0Q29sb3IgPSBDb2xvcjo6YmxhY2s7CisgICAgbV9saXN0ZW5lclR5cGVzID0g
MDsKKyAgICBtX2luU3R5bGVSZWNhbGMgPSBmYWxzZTsKKyAgICBtX2Nsb3NlQWZ0ZXJTdHlsZVJl
Y2FsYyA9IGZhbHNlOworCisgICAgbV91c2VzU2libGluZ1J1bGVzID0gZmFsc2U7CisgICAgbV91
c2VzU2libGluZ1J1bGVzT3ZlcnJpZGUgPSBmYWxzZTsKKyAgICBtX3VzZXNGaXJzdExpbmVSdWxl
cyA9IGZhbHNlOworICAgIG1fdXNlc0ZpcnN0TGV0dGVyUnVsZXMgPSBmYWxzZTsKKyAgICBtX3Vz
ZXNCZWZvcmVBZnRlclJ1bGVzID0gZmFsc2U7CisgICAgbV91c2VzQmVmb3JlQWZ0ZXJSdWxlc092
ZXJyaWRlID0gZmFsc2U7CisgICAgbV91c2VzUmVtVW5pdHMgPSBmYWxzZTsKKyAgICBtX3VzZXNM
aW5rUnVsZXMgPSBmYWxzZTsKKworICAgIG1fZ290b0FuY2hvck5lZWRlZEFmdGVyU3R5bGVzaGVl
dHNMb2FkID0gZmFsc2U7CisKKyAgICBtX2RpZENhbGN1bGF0ZVN0eWxlUmVzb2x2ZXIgPSBmYWxz
ZTsKKyAgICBtX2hhc0RpcnR5U3R5bGVSZXNvbHZlciA9IGZhbHNlOworICAgIG1fcGVuZGluZ1N0
eWxlc2hlZXRzID0gMDsKKyAgICBtX2lnbm9yZVBlbmRpbmdTdHlsZXNoZWV0cyA9IGZhbHNlOwor
ICAgIG1fbmVlZHNOb3RpZnlSZW1vdmVBbGxQZW5kaW5nU3R5bGVzaGVldCA9IGZhbHNlOworICAg
IG1faGFzTm9kZXNXaXRoUGxhY2Vob2xkZXJTdHlsZSA9IGZhbHNlOworICAgIG1fcGVuZGluZ1No
ZWV0TGF5b3V0ID0gTm9MYXlvdXRXaXRoUGVuZGluZ1NoZWV0czsKKworICAgIG1fY3NzVGFyZ2V0
ID0gMDsKKworICAgIHJlc2V0TGlua0NvbG9yKCk7CisgICAgcmVzZXRWaXNpdGVkTGlua0NvbG9y
KCk7CisgICAgcmVzZXRBY3RpdmVMaW5rQ29sb3IoKTsKKworICAgIG1fcHJvY2Vzc2luZ0xvYWRF
dmVudCA9IGZhbHNlOworICAgIAorICAgIGluaXRTZWN1cml0eUNvbnRleHQoKTsKKyAgICBpbml0
RE5TUHJlZmV0Y2goKTsKKworICAgIHN0YXRpYyBpbnQgZG9jSUQgPSAwOworICAgIG1fZG9jSUQg
PSBkb2NJRCsrOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IFdURl9BUlJBWV9MRU5H
VEgobV9ub2RlTGlzdENvdW50cyk7IGkrKykKKyAgICAgICAgbV9ub2RlTGlzdENvdW50c1tpXSA9
IDA7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgV1RGX0FSUkFZX0xFTkdUSChtX2Nv
bGxlY3Rpb25zKTsgaSsrKQorICAgICAgICBtX2NvbGxlY3Rpb25zW2ldID0gMDsKKworICAgIElu
c3BlY3RvckNvdW50ZXJzOjppbmNyZW1lbnRDb3VudGVyKEluc3BlY3RvckNvdW50ZXJzOjpEb2N1
bWVudENvdW50ZXIpOworfQorCitzdGF0aWMgdm9pZCBoaXN0b2dyYW1NdXRhdGlvbkV2ZW50VXNh
Z2UoY29uc3QgdW5zaWduZWQgc2hvcnQmIGxpc3RlbmVyVHlwZXMpCit7CisgICAgSGlzdG9ncmFt
U3VwcG9ydDo6aGlzdG9ncmFtRW51bWVyYXRpb24oIkRPTUFQSS5QZXJEb2N1bWVudE11dGF0aW9u
RXZlbnRVc2FnZS5ET01TdWJ0cmVlTW9kaWZpZWQiLCBzdGF0aWNfY2FzdDxib29sPihsaXN0ZW5l
clR5cGVzICYgRG9jdW1lbnQ6OkRPTVNVQlRSRUVNT0RJRklFRF9MSVNURU5FUiksIDIpOworICAg
IEhpc3RvZ3JhbVN1cHBvcnQ6Omhpc3RvZ3JhbUVudW1lcmF0aW9uKCJET01BUEkuUGVyRG9jdW1l
bnRNdXRhdGlvbkV2ZW50VXNhZ2UuRE9NTm9kZUluc2VydGVkIiwgc3RhdGljX2Nhc3Q8Ym9vbD4o
bGlzdGVuZXJUeXBlcyAmIERvY3VtZW50OjpET01OT0RFSU5TRVJURURfTElTVEVORVIpLCAyKTsK
KyAgICBIaXN0b2dyYW1TdXBwb3J0OjpoaXN0b2dyYW1FbnVtZXJhdGlvbigiRE9NQVBJLlBlckRv
Y3VtZW50TXV0YXRpb25FdmVudFVzYWdlLkRPTU5vZGVSZW1vdmVkIiwgc3RhdGljX2Nhc3Q8Ym9v
bD4obGlzdGVuZXJUeXBlcyAmIERvY3VtZW50OjpET01OT0RFUkVNT1ZFRF9MSVNURU5FUiksIDIp
OworICAgIEhpc3RvZ3JhbVN1cHBvcnQ6Omhpc3RvZ3JhbUVudW1lcmF0aW9uKCJET01BUEkuUGVy
RG9jdW1lbnRNdXRhdGlvbkV2ZW50VXNhZ2UuRE9NTm9kZVJlbW92ZWRGcm9tRG9jdW1lbnQiLCBz
dGF0aWNfY2FzdDxib29sPihsaXN0ZW5lclR5cGVzICYgRG9jdW1lbnQ6OkRPTU5PREVSRU1PVkVE
RlJPTURPQ1VNRU5UX0xJU1RFTkVSKSwgMik7CisgICAgSGlzdG9ncmFtU3VwcG9ydDo6aGlzdG9n
cmFtRW51bWVyYXRpb24oIkRPTUFQSS5QZXJEb2N1bWVudE11dGF0aW9uRXZlbnRVc2FnZS5ET01O
b2RlSW5zZXJ0ZWRJbnRvRG9jdW1lbnQiLCBzdGF0aWNfY2FzdDxib29sPihsaXN0ZW5lclR5cGVz
ICYgRG9jdW1lbnQ6OkRPTU5PREVJTlNFUlRFRElOVE9ET0NVTUVOVF9MSVNURU5FUiksIDIpOwor
ICAgIEhpc3RvZ3JhbVN1cHBvcnQ6Omhpc3RvZ3JhbUVudW1lcmF0aW9uKCJET01BUEkuUGVyRG9j
dW1lbnRNdXRhdGlvbkV2ZW50VXNhZ2UuRE9NQ2hhcmFjdGVyRGF0YU1vZGlmaWVkIiwgc3RhdGlj
X2Nhc3Q8Ym9vbD4obGlzdGVuZXJUeXBlcyAmIERvY3VtZW50OjpET01DSEFSQUNURVJEQVRBTU9E
SUZJRURfTElTVEVORVIpLCAyKTsKK30KKworI2lmIEVOQUJMRShGVUxMU0NSRUVOX0FQSSkKK3N0
YXRpYyBib29sIGlzQXR0cmlidXRlT25BbGxPd25lcnMoY29uc3QgV2ViQ29yZTo6UXVhbGlmaWVk
TmFtZSYgYXR0cmlidXRlLCBjb25zdCBIVE1MRnJhbWVPd25lckVsZW1lbnQqIG93bmVyKQorewor
ICAgIGlmICghb3duZXIpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIGRvIHsKKyAgICAgICAg
aWYgKCFvd25lci0+aGFzQXR0cmlidXRlKGF0dHJpYnV0ZSkpCisgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgfSB3aGlsZSAoKG93bmVyID0gb3duZXItPmRvY3VtZW50KCktPm93bmVyRWxl
bWVudCgpKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisjZW5kaWYKKworRG9jdW1lbnQ6On5Eb2N1
bWVudCgpCit7CisgICAgQVNTRVJUKCFyZW5kZXJlcigpKTsKKyAgICBBU1NFUlQoIW1faW5QYWdl
Q2FjaGUpOworICAgIEFTU0VSVCghbV9zYXZlZFJlbmRlcmVyKTsKKyAgICBBU1NFUlQobV9yYW5n
ZXMuaXNFbXB0eSgpKTsKKyAgICBBU1NFUlQoIW1fc3R5bGVSZWNhbGNUaW1lci5pc0FjdGl2ZSgp
KTsKKyAgICBBU1NFUlQoIW1fcGFyZW50VHJlZVNjb3BlKTsKKyAgICBBU1NFUlQoIW1fZ3VhcmRS
ZWZDb3VudCk7CisKKyAgICAvLyBGSVhNRTogU2hvdWxkIHdlIHJlc2V0IG1fZG9tV2luZG93IHdo
ZW4gd2UgZGV0YWNoIGZyb20gdGhlIEZyYW1lPworICAgIGlmIChtX2RvbVdpbmRvdykKKyAgICAg
ICAgbV9kb21XaW5kb3ctPnJlc2V0VW5sZXNzU3VzcGVuZGVkRm9yUGFnZUNhY2hlKCk7CisKKyAg
ICBtX3NjcmlwdFJ1bm5lci5jbGVhcigpOworCisgICAgaGlzdG9ncmFtTXV0YXRpb25FdmVudFVz
YWdlKG1fbGlzdGVuZXJUeXBlcyk7CisKKyAgICByZW1vdmVBbGxFdmVudExpc3RlbmVycygpOwor
CisgICAgLy8gQ3VycmVudGx5IHdlIGJlbGlldmUgdGhhdCBEb2N1bWVudCBjYW4gbmV2ZXIgb3V0
bGl2ZSB0aGUgcGFyc2VyLgorICAgIC8vIEFsdGhvdWdoIHRoZSBEb2N1bWVudCBtYXkgYmUgcmVw
bGFjZWQgc3luY2hyb25vdXNseSwgRG9jdW1lbnRQYXJzZXJzCisgICAgLy8gZ2VuZXJhbGx5IGtl
ZXAgYXQgbGVhc3Qgb25lIHJlZmVyZW5jZSB0byBhbiBFbGVtZW50IHdoaWNoIHdvdWxkIGluIHR1
cm4KKyAgICAvLyBoYXMgYSByZWZlcmVuY2UgdG8gdGhlIERvY3VtZW50LiAgSWYgeW91IGhpdCB0
aGlzIEFTU0VSVCwgdGhlbiB0aGF0CisgICAgLy8gYXNzdW1wdGlvbiBpcyB3cm9uZy4gIERvY3Vt
ZW50UGFyc2VyOjpkZXRhY2goKSBzaG91bGQgZW5zdXJlIHRoYXQgZXZlbgorICAgIC8vIGlmIHRo
ZSBEb2N1bWVudFBhcnNlciBvdXRsaXZlcyB0aGUgRG9jdW1lbnQgaXQgd29uJ3QgY2F1c2UgYmFk
bmVzcy4KKyAgICBBU1NFUlQoIW1fcGFyc2VyIHx8IG1fcGFyc2VyLT5yZWZDb3VudCgpID09IDEp
OworICAgIGRldGFjaFBhcnNlcigpOworCisgICAgbV9yZW5kZXJBcmVuYS5jbGVhcigpOworCisg
ICAgY2xlYXJBWE9iamVjdENhY2hlKCk7CisKKyAgICBtX2RlY29kZXIgPSAwOworCisgICAgaWYg
KG1fc3R5bGVTaGVldHMpCisgICAgICAgIG1fc3R5bGVTaGVldHMtPmRvY3VtZW50RGVzdHJveWVk
KCk7CisKKyAgICBpZiAobV9uYW1lZEZsb3dzKQorICAgICAgICBtX25hbWVkRmxvd3MtPmRvY3Vt
ZW50RGVzdHJveWVkKCk7CisKKyAgICBpZiAobV9lbGVtU2hlZXQpCisgICAgICAgIG1fZWxlbVNo
ZWV0LT5jbGVhck93bmVyTm9kZSgpOworICAgIGlmIChtX3BhZ2VVc2VyU2hlZXQpCisgICAgICAg
IG1fcGFnZVVzZXJTaGVldC0+Y2xlYXJPd25lck5vZGUoKTsKKyAgICBpZiAobV9wYWdlR3JvdXBV
c2VyU2hlZXRzKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9wYWdlR3JvdXBV
c2VyU2hlZXRzLT5zaXplKCk7ICsraSkKKyAgICAgICAgICAgICgqbV9wYWdlR3JvdXBVc2VyU2hl
ZXRzKVtpXS0+Y2xlYXJPd25lck5vZGUoKTsKKyAgICB9CisgICAgaWYgKG1fdXNlclNoZWV0cykg
eworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fdXNlclNoZWV0cy0+c2l6ZSgpOyAr
K2kpCisgICAgICAgICAgICAoKm1fdXNlclNoZWV0cylbaV0tPmNsZWFyT3duZXJOb2RlKCk7Cisg
ICAgfQorCisgICAgZGVsZXRlQ3VzdG9tRm9udHMoKTsKKworICAgIG1fd2Vha1JlZmVyZW5jZS0+
Y2xlYXIoKTsKKworICAgIGlmIChtX21lZGlhUXVlcnlNYXRjaGVyKQorICAgICAgICBtX21lZGlh
UXVlcnlNYXRjaGVyLT5kb2N1bWVudERlc3Ryb3llZCgpOworCisgICAgY2xlYXJTdHlsZVJlc29s
dmVyKCk7IC8vIFdlIG5lZWQgdG8gZGVzdG9yeSBDU1NGb250U2VsZWN0b3IgYmVmb3JlIGRlc3Ry
b3lpbmcgbV9jYWNoZWRSZXNvdXJjZUxvYWRlci4KKyAgICBtX2NhY2hlZFJlc291cmNlTG9hZGVy
LmNsZWFyKCk7CisKKyAgICAvLyBXZSBtdXN0IGNhbGwgY2xlYXJSYXJlRGF0YSgpIGhlcmUgc2lu
Y2UgYSBEb2N1bWVudCBjbGFzcyBpbmhlcml0cyBUcmVlU2NvcGUKKyAgICAvLyBhcyB3ZWxsIGFz
IE5vZGUuIFNlZSBhIGNvbW1lbnQgb24gVHJlZVNjb3BlLmggZm9yIHRoZSByZWFzb24uCisgICAg
aWYgKGhhc1JhcmVEYXRhKCkpCisgICAgICAgIGNsZWFyUmFyZURhdGEoKTsKKworICAgIEFTU0VS
VCghbV9saXN0c0ludmFsaWRhdGVkQXREb2N1bWVudC5zaXplKCkpOworCisgICAgZm9yICh1bnNp
Z25lZCBpID0gMDsgaSA8IFdURl9BUlJBWV9MRU5HVEgobV9ub2RlTGlzdENvdW50cyk7IGkrKykK
KyAgICAgICAgQVNTRVJUKCFtX25vZGVMaXN0Q291bnRzW2ldKTsKKworICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBXVEZfQVJSQVlfTEVOR1RIKG1fY29sbGVjdGlvbnMpOyBpKyspCisgICAg
ICAgIEFTU0VSVCghbV9jb2xsZWN0aW9uc1tpXSk7CisKKyAgICBtX2RvY3VtZW50ID0gMDsKKwor
ICAgIEluc3BlY3RvckNvdW50ZXJzOjpkZWNyZW1lbnRDb3VudGVyKEluc3BlY3RvckNvdW50ZXJz
OjpEb2N1bWVudENvdW50ZXIpOworfQorCit2b2lkIERvY3VtZW50OjpyZW1vdmVkTGFzdFJlZigp
Cit7CisgICAgQVNTRVJUKCFtX2RlbGV0aW9uSGFzQmVndW4pOworICAgIGlmIChtX2d1YXJkUmVm
Q291bnQpIHsKKyAgICAgICAgLy8gSWYgcmVtb3ZpbmcgYSBjaGlsZCByZW1vdmVzIHRoZSBsYXN0
IHNlbGYtb25seSByZWYsIHdlIGRvbid0CisgICAgICAgIC8vIHdhbnQgdGhlIHNjb3BlIHRvIGJl
IGRlc3RydWN0ZWQgdW50aWwgYWZ0ZXIKKyAgICAgICAgLy8gcmVtb3ZlQWxsQ2hpbGRyZW4gcmV0
dXJucywgc28gd2UgZ3VhcmQgb3Vyc2VsdmVzIHdpdGggYW4KKyAgICAgICAgLy8gZXh0cmEgc2Vs
Zi1vbmx5IHJlZi4KKyAgICAgICAgZ3VhcmRSZWYoKTsKKworICAgICAgICAvLyBXZSBtdXN0IG1h
a2Ugc3VyZSBub3QgdG8gYmUgcmV0YWluaW5nIGFueSBvZiBvdXIgY2hpbGRyZW4gdGhyb3VnaAor
ICAgICAgICAvLyB0aGVzZSBleHRyYSBwb2ludGVycyBvciB3ZSB3aWxsIGNyZWF0ZSBhIHJlZmVy
ZW5jZSBjeWNsZS4KKyAgICAgICAgbV9kb2NUeXBlID0gMDsKKyAgICAgICAgbV9mb2N1c2VkTm9k
ZSA9IDA7CisgICAgICAgIG1faG92ZXJOb2RlID0gMDsKKyAgICAgICAgbV9hY3RpdmVOb2RlID0g
MDsKKyAgICAgICAgbV90aXRsZUVsZW1lbnQgPSAwOworICAgICAgICBtX2RvY3VtZW50RWxlbWVu
dCA9IDA7CisgICAgICAgIG1fY29udGV4dEZlYXR1cmVzID0gQ29udGV4dEZlYXR1cmVzOjpkZWZh
dWx0U3dpdGNoKCk7CisjaWYgRU5BQkxFKEZVTExTQ1JFRU5fQVBJKQorICAgICAgICBtX2Z1bGxT
Y3JlZW5FbGVtZW50ID0gMDsKKyAgICAgICAgbV9mdWxsU2NyZWVuRWxlbWVudFN0YWNrLmNsZWFy
KCk7CisjZW5kaWYKKworICAgICAgICBkZXRhY2hQYXJzZXIoKTsKKworICAgICAgICAvLyByZW1v
dmVBbGxDaGlsZHJlbigpIGRvZXNuJ3QgYWx3YXlzIHVucmVnaXN0ZXIgSURzLAorICAgICAgICAv
LyBzbyB0ZWFyIGRvd24gc2NvcGUgaW5mb3JtYXRpb24gdXBmcm9udCB0byBhdm9pZCBoYXZpbmcg
c3RhbGUgcmVmZXJlbmNlcyBpbiB0aGUgbWFwLgorICAgICAgICBkZXN0cm95VHJlZVNjb3BlRGF0
YSgpOworICAgICAgICByZW1vdmVBbGxDaGlsZHJlbigpOworCisgICAgICAgIG1fbWFya2Vycy0+
ZGV0YWNoKCk7CisKKyAgICAgICAgbV9jc3NDYW52YXNFbGVtZW50cy5jbGVhcigpOworCisjaWYg
RU5BQkxFKFJFUVVFU1RfQU5JTUFUSU9OX0ZSQU1FKQorICAgICAgICAvLyBGSVhNRTogY29uc2lk
ZXIgdXNpbmcgQWN0aXZlRE9NT2JqZWN0LgorICAgICAgICBpZiAobV9zY3JpcHRlZEFuaW1hdGlv
bkNvbnRyb2xsZXIpCisgICAgICAgICAgICBtX3NjcmlwdGVkQW5pbWF0aW9uQ29udHJvbGxlci0+
Y2xlYXJEb2N1bWVudFBvaW50ZXIoKTsKKyAgICAgICAgbV9zY3JpcHRlZEFuaW1hdGlvbkNvbnRy
b2xsZXIuY2xlYXIoKTsKKyNlbmRpZgorCisjaWZuZGVmIE5ERUJVRworICAgICAgICBtX2luUmVt
b3ZlZExhc3RSZWZGdW5jdGlvbiA9IGZhbHNlOworI2VuZGlmCisKKyAgICAgICAgZ3VhcmREZXJl
ZigpOworICAgIH0gZWxzZSB7CisjaWZuZGVmIE5ERUJVRyAKKyAgICAgICAgbV9kZWxldGlvbkhh
c0JlZ3VuID0gdHJ1ZTsgCisjZW5kaWYgCisgICAgICAgIGRlbGV0ZSB0aGlzOworICAgIH0KK30K
KworRWxlbWVudCogRG9jdW1lbnQ6OmdldEVsZW1lbnRCeUlkKGNvbnN0IEF0b21pY1N0cmluZyYg
aWQpIGNvbnN0Cit7CisgICAgcmV0dXJuIFRyZWVTY29wZTo6Z2V0RWxlbWVudEJ5SWQoaWQpOwor
fQorCitFbGVtZW50KiBEb2N1bWVudDo6Z2V0RWxlbWVudEJ5QWNjZXNzS2V5KGNvbnN0IFN0cmlu
ZyYga2V5KQoreworICAgIGlmIChrZXkuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gMDsKKyAg
ICBpZiAoIW1fYWNjZXNzS2V5TWFwVmFsaWQpIHsKKyAgICAgICAgYnVpbGRBY2Nlc3NLZXlNYXAo
dGhpcyk7CisgICAgICAgIG1fYWNjZXNzS2V5TWFwVmFsaWQgPSB0cnVlOworICAgIH0KKyAgICBy
ZXR1cm4gbV9lbGVtZW50c0J5QWNjZXNzS2V5LmdldChrZXkuaW1wbCgpKTsKK30KKwordm9pZCBE
b2N1bWVudDo6YnVpbGRBY2Nlc3NLZXlNYXAoVHJlZVNjb3BlKiBzY29wZSkKK3sKKyAgICBBU1NF
UlQoc2NvcGUpOworICAgIE5vZGUqIHJvb3ROb2RlID0gc2NvcGUtPnJvb3ROb2RlKCk7CisgICAg
Zm9yIChOb2RlKiBub2RlID0gcm9vdE5vZGU7IG5vZGU7IG5vZGUgPSBub2RlLT50cmF2ZXJzZU5l
eHROb2RlKHJvb3ROb2RlKSkgeworICAgICAgICBpZiAoIW5vZGUtPmlzRWxlbWVudE5vZGUoKSkK
KyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBFbGVtZW50KiBlbGVtZW50ID0gc3RhdGlj
X2Nhc3Q8RWxlbWVudCo+KG5vZGUpOworICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcmIGFjY2Vz
c0tleSA9IGVsZW1lbnQtPmdldEF0dHJpYnV0ZShhY2Nlc3NrZXlBdHRyKTsKKyAgICAgICAgaWYg
KCFhY2Nlc3NLZXkuaXNFbXB0eSgpKQorICAgICAgICAgICAgbV9lbGVtZW50c0J5QWNjZXNzS2V5
LnNldChhY2Nlc3NLZXkuaW1wbCgpLCBlbGVtZW50KTsKKworICAgICAgICBmb3IgKFNoYWRvd1Jv
b3QqIHJvb3QgPSBub2RlLT55b3VuZ2VzdFNoYWRvd1Jvb3QoKTsgcm9vdDsgcm9vdCA9IHJvb3Qt
Pm9sZGVyU2hhZG93Um9vdCgpKQorICAgICAgICAgICAgYnVpbGRBY2Nlc3NLZXlNYXAocm9vdCk7
CisgICAgfQorfQorCit2b2lkIERvY3VtZW50OjppbnZhbGlkYXRlQWNjZXNzS2V5TWFwKCkKK3sK
KyAgICBtX2FjY2Vzc0tleU1hcFZhbGlkID0gZmFsc2U7CisgICAgbV9lbGVtZW50c0J5QWNjZXNz
S2V5LmNsZWFyKCk7Cit9CisKK1NlbGVjdG9yUXVlcnlDYWNoZSogRG9jdW1lbnQ6OnNlbGVjdG9y
UXVlcnlDYWNoZSgpCit7CisgICAgaWYgKCFtX3NlbGVjdG9yUXVlcnlDYWNoZSkKKyAgICAgICAg
bV9zZWxlY3RvclF1ZXJ5Q2FjaGUgPSBhZG9wdFB0cihuZXcgU2VsZWN0b3JRdWVyeUNhY2hlKCkp
OworICAgIHJldHVybiBtX3NlbGVjdG9yUXVlcnlDYWNoZS5nZXQoKTsKK30KKworTWVkaWFRdWVy
eU1hdGNoZXIqIERvY3VtZW50OjptZWRpYVF1ZXJ5TWF0Y2hlcigpCit7CisgICAgaWYgKCFtX21l
ZGlhUXVlcnlNYXRjaGVyKQorICAgICAgICBtX21lZGlhUXVlcnlNYXRjaGVyID0gTWVkaWFRdWVy
eU1hdGNoZXI6OmNyZWF0ZSh0aGlzKTsKKyAgICByZXR1cm4gbV9tZWRpYVF1ZXJ5TWF0Y2hlci5n
ZXQoKTsKK30KKwordm9pZCBEb2N1bWVudDo6c2V0Q29tcGF0aWJpbGl0eU1vZGUoQ29tcGF0aWJp
bGl0eU1vZGUgbW9kZSkKK3sKKyAgICBpZiAobV9jb21wYXRpYmlsaXR5TW9kZUxvY2tlZCB8fCBt
b2RlID09IG1fY29tcGF0aWJpbGl0eU1vZGUpCisgICAgICAgIHJldHVybjsKKyAgICBBU1NFUlQo
IW1fc3R5bGVTaGVldHMtPmxlbmd0aCgpKTsKKyAgICBib29sIHdhc0luUXVpcmtzTW9kZSA9IGlu
UXVpcmtzTW9kZSgpOworICAgIG1fY29tcGF0aWJpbGl0eU1vZGUgPSBtb2RlOworICAgIHNlbGVj
dG9yUXVlcnlDYWNoZSgpLT5pbnZhbGlkYXRlKCk7CisgICAgaWYgKGluUXVpcmtzTW9kZSgpICE9
IHdhc0luUXVpcmtzTW9kZSkgeworICAgICAgICAvLyBBbGwgdXNlciBzdHlsZXNoZWV0cyBoYXZl
IHRvIHJlcGFyc2UgdXNpbmcgdGhlIGRpZmZlcmVudCBtb2RlLgorICAgICAgICBjbGVhclBhZ2VV
c2VyU2hlZXQoKTsKKyAgICAgICAgY2xlYXJQYWdlR3JvdXBVc2VyU2hlZXRzKCk7CisgICAgfQor
fQorCitTdHJpbmcgRG9jdW1lbnQ6OmNvbXBhdE1vZGUoKSBjb25zdAoreworICAgIHJldHVybiBp
blF1aXJrc01vZGUoKSA/ICJCYWNrQ29tcGF0IiA6ICJDU1MxQ29tcGF0IjsKK30KKwordm9pZCBE
b2N1bWVudDo6cmVzZXRMaW5rQ29sb3IoKQoreworICAgIG1fbGlua0NvbG9yID0gQ29sb3IoMCwg
MCwgMjM4KTsKK30KKwordm9pZCBEb2N1bWVudDo6cmVzZXRWaXNpdGVkTGlua0NvbG9yKCkKK3sK
KyAgICBtX3Zpc2l0ZWRMaW5rQ29sb3IgPSBDb2xvcig4NSwgMjYsIDEzOSk7ICAgIAorfQorCit2
b2lkIERvY3VtZW50OjpyZXNldEFjdGl2ZUxpbmtDb2xvcigpCit7CisgICAgbV9hY3RpdmVMaW5r
Q29sb3Iuc2V0TmFtZWRDb2xvcigicmVkIik7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnNldERvY1R5
cGUoUGFzc1JlZlB0cjxEb2N1bWVudFR5cGU+IGRvY1R5cGUpCit7CisgICAgLy8gVGhpcyBzaG91
bGQgbmV2ZXIgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLgorICAgIEFTU0VSVCghbV9kb2NUeXBl
IHx8ICFkb2NUeXBlKTsKKyAgICBtX2RvY1R5cGUgPSBkb2NUeXBlOworICAgIGlmIChtX2RvY1R5
cGUpIHsKKyAgICAgICAgdGhpcy0+YWRvcHRJZk5lZWRlZChtX2RvY1R5cGUuZ2V0KCkpOworI2lm
IEVOQUJMRShMRUdBQ1lfVklFV1BPUlRfQURBUFRJT04pCisgICAgICAgIGlmIChtX2RvY1R5cGUt
PnB1YmxpY0lkKCkuc3RhcnRzV2l0aCgiLS8vd2FwZm9ydW0vL2R0ZCB4aHRtbCBtb2JpbGUgMS4i
LCAvKiBjYXNlU2Vuc2l0aXZlICovIGZhbHNlKSkKKyAgICAgICAgICAgIHByb2Nlc3NWaWV3cG9y
dCgid2lkdGg9ZGV2aWNlLXdpZHRoLCBoZWlnaHQ9ZGV2aWNlLWhlaWdodCIsIFZpZXdwb3J0QXJn
dW1lbnRzOjpYSFRNTE1vYmlsZVByb2ZpbGUpOworI2VuZGlmCisgICAgfQorICAgIC8vIERvY3R5
cGUgYWZmZWN0cyB0aGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlIHN0eWxlc2hlZXRzLgorICAgIGNs
ZWFyU3R5bGVSZXNvbHZlcigpOworfQorCitET01JbXBsZW1lbnRhdGlvbiogRG9jdW1lbnQ6Omlt
cGxlbWVudGF0aW9uKCkKK3sKKyAgICBpZiAoIW1faW1wbGVtZW50YXRpb24pCisgICAgICAgIG1f
aW1wbGVtZW50YXRpb24gPSBET01JbXBsZW1lbnRhdGlvbjo6Y3JlYXRlKHRoaXMpOworICAgIHJl
dHVybiBtX2ltcGxlbWVudGF0aW9uLmdldCgpOworfQorCit2b2lkIERvY3VtZW50OjpjaGlsZHJl
bkNoYW5nZWQoYm9vbCBjaGFuZ2VkQnlQYXJzZXIsIE5vZGUqIGJlZm9yZUNoYW5nZSwgTm9kZSog
YWZ0ZXJDaGFuZ2UsIGludCBjaGlsZENvdW50RGVsdGEpCit7CisgICAgQ29udGFpbmVyTm9kZTo6
Y2hpbGRyZW5DaGFuZ2VkKGNoYW5nZWRCeVBhcnNlciwgYmVmb3JlQ2hhbmdlLCBhZnRlckNoYW5n
ZSwgY2hpbGRDb3VudERlbHRhKTsKKyAgICAKKyAgICBFbGVtZW50KiBuZXdEb2N1bWVudEVsZW1l
bnQgPSBmaXJzdEVsZW1lbnRDaGlsZCh0aGlzKTsKKyAgICBpZiAobmV3RG9jdW1lbnRFbGVtZW50
ID09IG1fZG9jdW1lbnRFbGVtZW50KQorICAgICAgICByZXR1cm47CisgICAgbV9kb2N1bWVudEVs
ZW1lbnQgPSBuZXdEb2N1bWVudEVsZW1lbnQ7CisgICAgLy8gVGhlIHJvb3Qgc3R5bGUgdXNlZCBm
b3IgbWVkaWEgcXVlcnkgbWF0Y2hpbmcgZGVwZW5kcyBvbiB0aGUgZG9jdW1lbnQgZWxlbWVudC4K
KyAgICBjbGVhclN0eWxlUmVzb2x2ZXIoKTsKK30KKworUGFzc1JlZlB0cjxFbGVtZW50PiBEb2N1
bWVudDo6Y3JlYXRlRWxlbWVudChjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUsIEV4Y2VwdGlvbkNv
ZGUmIGVjKQoreworICAgIGlmICghaXNWYWxpZE5hbWUobmFtZSkpIHsKKyAgICAgICAgZWMgPSBJ
TlZBTElEX0NIQVJBQ1RFUl9FUlI7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlm
IChtX2lzWEhUTUwpCisgICAgICAgIHJldHVybiBIVE1MRWxlbWVudEZhY3Rvcnk6OmNyZWF0ZUhU
TUxFbGVtZW50KFF1YWxpZmllZE5hbWUobnVsbEF0b20sIG5hbWUsIHhodG1sTmFtZXNwYWNlVVJJ
KSwgdGhpcywgMCwgZmFsc2UpOworCisgICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoUXVhbGlmaWVk
TmFtZShudWxsQXRvbSwgbmFtZSwgbnVsbEF0b20pLCBmYWxzZSk7Cit9CisKK1Bhc3NSZWZQdHI8
RG9jdW1lbnRGcmFnbWVudD4gRG9jdW1lbnQ6OmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKQorewor
ICAgIHJldHVybiBEb2N1bWVudEZyYWdtZW50OjpjcmVhdGUoZG9jdW1lbnQoKSk7Cit9CisKK1Bh
c3NSZWZQdHI8VGV4dD4gRG9jdW1lbnQ6OmNyZWF0ZVRleHROb2RlKGNvbnN0IFN0cmluZyYgZGF0
YSkKK3sKKyAgICByZXR1cm4gVGV4dDo6Y3JlYXRlKHRoaXMsIGRhdGEpOworfQorCitQYXNzUmVm
UHRyPENvbW1lbnQ+IERvY3VtZW50OjpjcmVhdGVDb21tZW50KGNvbnN0IFN0cmluZyYgZGF0YSkK
K3sKKyAgICByZXR1cm4gQ29tbWVudDo6Y3JlYXRlKHRoaXMsIGRhdGEpOworfQorCitQYXNzUmVm
UHRyPENEQVRBU2VjdGlvbj4gRG9jdW1lbnQ6OmNyZWF0ZUNEQVRBU2VjdGlvbihjb25zdCBTdHJp
bmcmIGRhdGEsIEV4Y2VwdGlvbkNvZGUmIGVjKQoreworICAgIGlmIChpc0hUTUxEb2N1bWVudCgp
KSB7CisgICAgICAgIGVjID0gTk9UX1NVUFBPUlRFRF9FUlI7CisgICAgICAgIHJldHVybiAwOwor
ICAgIH0KKyAgICByZXR1cm4gQ0RBVEFTZWN0aW9uOjpjcmVhdGUodGhpcywgZGF0YSk7Cit9CisK
K1Bhc3NSZWZQdHI8UHJvY2Vzc2luZ0luc3RydWN0aW9uPiBEb2N1bWVudDo6Y3JlYXRlUHJvY2Vz
c2luZ0luc3RydWN0aW9uKGNvbnN0IFN0cmluZyYgdGFyZ2V0LCBjb25zdCBTdHJpbmcmIGRhdGEs
IEV4Y2VwdGlvbkNvZGUmIGVjKQoreworICAgIGlmICghaXNWYWxpZE5hbWUodGFyZ2V0KSkgewor
ICAgICAgICBlYyA9IElOVkFMSURfQ0hBUkFDVEVSX0VSUjsKKyAgICAgICAgcmV0dXJuIDA7Cisg
ICAgfQorICAgIGlmIChpc0hUTUxEb2N1bWVudCgpKSB7CisgICAgICAgIGVjID0gTk9UX1NVUFBP
UlRFRF9FUlI7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gUHJvY2Vzc2lu
Z0luc3RydWN0aW9uOjpjcmVhdGUodGhpcywgdGFyZ2V0LCBkYXRhKTsKK30KKworUGFzc1JlZlB0
cjxFbnRpdHlSZWZlcmVuY2U+IERvY3VtZW50OjpjcmVhdGVFbnRpdHlSZWZlcmVuY2UoY29uc3Qg
U3RyaW5nJiBuYW1lLCBFeGNlcHRpb25Db2RlJiBlYykKK3sKKyAgICBpZiAoIWlzVmFsaWROYW1l
KG5hbWUpKSB7CisgICAgICAgIGVjID0gSU5WQUxJRF9DSEFSQUNURVJfRVJSOworICAgICAgICBy
ZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGlzSFRNTERvY3VtZW50KCkpIHsKKyAgICAgICAgZWMg
PSBOT1RfU1VQUE9SVEVEX0VSUjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVy
biBFbnRpdHlSZWZlcmVuY2U6OmNyZWF0ZSh0aGlzLCBuYW1lKTsKK30KKworUGFzc1JlZlB0cjxF
ZGl0aW5nVGV4dD4gRG9jdW1lbnQ6OmNyZWF0ZUVkaXRpbmdUZXh0Tm9kZShjb25zdCBTdHJpbmcm
IHRleHQpCit7CisgICAgcmV0dXJuIEVkaXRpbmdUZXh0OjpjcmVhdGUodGhpcywgdGV4dCk7Cit9
CisKK1Bhc3NSZWZQdHI8Q1NTU3R5bGVEZWNsYXJhdGlvbj4gRG9jdW1lbnQ6OmNyZWF0ZUNTU1N0
eWxlRGVjbGFyYXRpb24oKQoreworICAgIHJldHVybiBTdHlsZVByb3BlcnR5U2V0OjpjcmVhdGUo
KS0+ZW5zdXJlQ1NTU3R5bGVEZWNsYXJhdGlvbigpOworfQorCitQYXNzUmVmUHRyPE5vZGU+IERv
Y3VtZW50OjppbXBvcnROb2RlKE5vZGUqIGltcG9ydGVkTm9kZSwgYm9vbCBkZWVwLCBFeGNlcHRp
b25Db2RlJiBlYykKK3sKKyAgICBlYyA9IDA7CisgICAgCisgICAgaWYgKCFpbXBvcnRlZE5vZGUp
IHsKKyAgICAgICAgZWMgPSBOT1RfU1VQUE9SVEVEX0VSUjsKKyAgICAgICAgcmV0dXJuIDA7Cisg
ICAgfQorCisgICAgc3dpdGNoIChpbXBvcnRlZE5vZGUtPm5vZGVUeXBlKCkpIHsKKyAgICBjYXNl
IFRFWFRfTk9ERToKKyAgICAgICAgcmV0dXJuIGNyZWF0ZVRleHROb2RlKGltcG9ydGVkTm9kZS0+
bm9kZVZhbHVlKCkpOworICAgIGNhc2UgQ0RBVEFfU0VDVElPTl9OT0RFOgorICAgICAgICByZXR1
cm4gY3JlYXRlQ0RBVEFTZWN0aW9uKGltcG9ydGVkTm9kZS0+bm9kZVZhbHVlKCksIGVjKTsKKyAg
ICBjYXNlIEVOVElUWV9SRUZFUkVOQ0VfTk9ERToKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUVudGl0
eVJlZmVyZW5jZShpbXBvcnRlZE5vZGUtPm5vZGVOYW1lKCksIGVjKTsKKyAgICBjYXNlIFBST0NF
U1NJTkdfSU5TVFJVQ1RJT05fTk9ERToKKyAgICAgICAgcmV0dXJuIGNyZWF0ZVByb2Nlc3NpbmdJ
bnN0cnVjdGlvbihpbXBvcnRlZE5vZGUtPm5vZGVOYW1lKCksIGltcG9ydGVkTm9kZS0+bm9kZVZh
bHVlKCksIGVjKTsKKyAgICBjYXNlIENPTU1FTlRfTk9ERToKKyAgICAgICAgcmV0dXJuIGNyZWF0
ZUNvbW1lbnQoaW1wb3J0ZWROb2RlLT5ub2RlVmFsdWUoKSk7CisgICAgY2FzZSBFTEVNRU5UX05P
REU6IHsKKyAgICAgICAgRWxlbWVudCogb2xkRWxlbWVudCA9IHN0YXRpY19jYXN0PEVsZW1lbnQq
PihpbXBvcnRlZE5vZGUpOworICAgICAgICAvLyBGSVhNRTogVGhlIGZvbGxvd2luZyBjaGVjayBt
aWdodCBiZSB1bm5lY2Vzc2FyeS4gSXMgaXQgcG9zc2libGUgdGhhdAorICAgICAgICAvLyBvbGRF
bGVtZW50IGhhcyBtaXNtYXRjaGVkIHByZWZpeC9uYW1lc3BhY2U/CisgICAgICAgIGlmICghaGFz
VmFsaWROYW1lc3BhY2VGb3JFbGVtZW50cyhvbGRFbGVtZW50LT50YWdRTmFtZSgpKSkgeworICAg
ICAgICAgICAgZWMgPSBOQU1FU1BBQ0VfRVJSOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAg
ICAgIH0KKyAgICAgICAgUmVmUHRyPEVsZW1lbnQ+IG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50
KG9sZEVsZW1lbnQtPnRhZ1FOYW1lKCksIGVjKTsKKyAgICAgICAgaWYgKGVjKQorICAgICAgICAg
ICAgcmV0dXJuIDA7CisKKyAgICAgICAgbmV3RWxlbWVudC0+Y2xvbmVEYXRhRnJvbUVsZW1lbnQo
Km9sZEVsZW1lbnQpOworCisgICAgICAgIGlmIChkZWVwKSB7CisgICAgICAgICAgICBmb3IgKE5v
ZGUqIG9sZENoaWxkID0gb2xkRWxlbWVudC0+Zmlyc3RDaGlsZCgpOyBvbGRDaGlsZDsgb2xkQ2hp
bGQgPSBvbGRDaGlsZC0+bmV4dFNpYmxpbmcoKSkgeworICAgICAgICAgICAgICAgIFJlZlB0cjxO
b2RlPiBuZXdDaGlsZCA9IGltcG9ydE5vZGUob2xkQ2hpbGQsIHRydWUsIGVjKTsKKyAgICAgICAg
ICAgICAgICBpZiAoZWMpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAg
ICAgICAgIG5ld0VsZW1lbnQtPmFwcGVuZENoaWxkKG5ld0NoaWxkLnJlbGVhc2UoKSwgZWMpOwor
ICAgICAgICAgICAgICAgIGlmIChlYykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3RWxlbWVudC5yZWxl
YXNlKCk7CisgICAgfQorICAgIGNhc2UgQVRUUklCVVRFX05PREU6CisgICAgICAgIHJldHVybiBB
dHRyOjpjcmVhdGUodGhpcywgUXVhbGlmaWVkTmFtZShudWxsQXRvbSwgc3RhdGljX2Nhc3Q8QXR0
cio+KGltcG9ydGVkTm9kZSktPm5hbWUoKSwgbnVsbEF0b20pLCBzdGF0aWNfY2FzdDxBdHRyKj4o
aW1wb3J0ZWROb2RlKS0+dmFsdWUoKSk7CisgICAgY2FzZSBET0NVTUVOVF9GUkFHTUVOVF9OT0RF
OiB7CisgICAgICAgIGlmIChpbXBvcnRlZE5vZGUtPmlzU2hhZG93Um9vdCgpKSB7CisgICAgICAg
ICAgICAvLyBTaGFkb3dSb290IG5vZGVzIHNob3VsZCBub3QgYmUgZXhwbGljaXRseSBpbXBvcnRh
YmxlLgorICAgICAgICAgICAgLy8gRWl0aGVyIHRoZXkgYXJlIGltcG9ydGVkIGFsb25nIHdpdGgg
dGhlaXIgaG9zdCBub2RlLCBvciBjcmVhdGVkIGltcGxpY2l0bHkuCisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgfQorICAgICAgICBEb2N1bWVudEZyYWdtZW50KiBvbGRGcmFnbWVudCA9IHN0
YXRpY19jYXN0PERvY3VtZW50RnJhZ21lbnQqPihpbXBvcnRlZE5vZGUpOworICAgICAgICBSZWZQ
dHI8RG9jdW1lbnRGcmFnbWVudD4gbmV3RnJhZ21lbnQgPSBjcmVhdGVEb2N1bWVudEZyYWdtZW50
KCk7CisgICAgICAgIGlmIChkZWVwKSB7CisgICAgICAgICAgICBmb3IgKE5vZGUqIG9sZENoaWxk
ID0gb2xkRnJhZ21lbnQtPmZpcnN0Q2hpbGQoKTsgb2xkQ2hpbGQ7IG9sZENoaWxkID0gb2xkQ2hp
bGQtPm5leHRTaWJsaW5nKCkpIHsKKyAgICAgICAgICAgICAgICBSZWZQdHI8Tm9kZT4gbmV3Q2hp
bGQgPSBpbXBvcnROb2RlKG9sZENoaWxkLCB0cnVlLCBlYyk7CisgICAgICAgICAgICAgICAgaWYg
KGVjKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICBuZXdG
cmFnbWVudC0+YXBwZW5kQ2hpbGQobmV3Q2hpbGQucmVsZWFzZSgpLCBlYyk7CisgICAgICAgICAg
ICAgICAgaWYgKGVjKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIG5ld0ZyYWdtZW50LnJlbGVh
c2UoKTsKKyAgICB9CisgICAgY2FzZSBFTlRJVFlfTk9ERToKKyAgICBjYXNlIE5PVEFUSU9OX05P
REU6CisgICAgICAgIC8vIEZJWE1FOiBJdCBzaG91bGQgYmUgcG9zc2libGUgdG8gaW1wb3J0IHRo
ZXNlIG5vZGUgdHlwZXMsIGhvd2V2ZXIgaW4gRE9NMyB0aGUgRG9jdW1lbnRUeXBlIGlzIHJlYWRv
bmx5LCBzbyB0aGVyZSBpc24ndCBtdWNoIHNlbnNlIGluIGRvaW5nIHRoYXQuCisgICAgICAgIC8v
IEFiaWxpdHkgdG8gYWRkIHRoZXNlIGltcG9ydGVkIG5vZGVzIHRvIGEgRG9jdW1lbnRUeXBlIHdp
bGwgYmUgY29uc2lkZXJlZCBmb3IgYWRkaXRpb24gdG8gYSBmdXR1cmUgcmVsZWFzZSBvZiB0aGUg
RE9NLgorICAgIGNhc2UgRE9DVU1FTlRfTk9ERToKKyAgICBjYXNlIERPQ1VNRU5UX1RZUEVfTk9E
RToKKyAgICBjYXNlIFhQQVRIX05BTUVTUEFDRV9OT0RFOgorICAgICAgICBicmVhazsKKyAgICB9
CisgICAgZWMgPSBOT1RfU1VQUE9SVEVEX0VSUjsKKyAgICByZXR1cm4gMDsKK30KKworCitQYXNz
UmVmUHRyPE5vZGU+IERvY3VtZW50OjphZG9wdE5vZGUoUGFzc1JlZlB0cjxOb2RlPiBzb3VyY2Us
IEV4Y2VwdGlvbkNvZGUmIGVjKQoreworICAgIGlmICghc291cmNlKSB7CisgICAgICAgIGVjID0g
Tk9UX1NVUFBPUlRFRF9FUlI7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChz
b3VyY2UtPmlzUmVhZE9ubHlOb2RlKCkpIHsKKyAgICAgICAgZWMgPSBOT19NT0RJRklDQVRJT05f
QUxMT1dFRF9FUlI7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEV2ZW50UXVldWVT
Y29wZSBzY29wZTsKKworICAgIHN3aXRjaCAoc291cmNlLT5ub2RlVHlwZSgpKSB7CisgICAgY2Fz
ZSBFTlRJVFlfTk9ERToKKyAgICBjYXNlIE5PVEFUSU9OX05PREU6CisgICAgY2FzZSBET0NVTUVO
VF9OT0RFOgorICAgIGNhc2UgRE9DVU1FTlRfVFlQRV9OT0RFOgorICAgIGNhc2UgWFBBVEhfTkFN
RVNQQUNFX05PREU6CisgICAgICAgIGVjID0gTk9UX1NVUFBPUlRFRF9FUlI7CisgICAgICAgIHJl
dHVybiAwOyAgICAgICAgICAgIAorICAgIGNhc2UgQVRUUklCVVRFX05PREU6IHsgICAgICAgICAg
ICAgICAgICAgCisgICAgICAgIEF0dHIqIGF0dHIgPSBzdGF0aWNfY2FzdDxBdHRyKj4oc291cmNl
LmdldCgpKTsKKyAgICAgICAgaWYgKGF0dHItPm93bmVyRWxlbWVudCgpKQorICAgICAgICAgICAg
YXR0ci0+b3duZXJFbGVtZW50KCktPnJlbW92ZUF0dHJpYnV0ZU5vZGUoYXR0ciwgZWMpOworICAg
ICAgICBhdHRyLT5zZXRTcGVjaWZpZWQodHJ1ZSk7CisgICAgICAgIGJyZWFrOworICAgIH0gICAg
ICAgCisgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKHNvdXJjZS0+aXNTaGFkb3dSb290KCkpIHsK
KyAgICAgICAgICAgIC8vIFNoYWRvd1Jvb3QgY2Fubm90IGRpc2Nvbm5lY3QgaXRzZWxmIGZyb20g
dGhlIGhvc3Qgbm9kZS4KKyAgICAgICAgICAgIGVjID0gSElFUkFSQ0hZX1JFUVVFU1RfRVJSOwor
ICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICAvLyBGSVhNRTogV2hh
dCBhYm91dCA8ZnJhbWU+IGFuZCA8b2JqZWN0Pj8KKyAgICAgICAgaWYgKHNvdXJjZS0+aGFzVGFn
TmFtZShpZnJhbWVUYWcpKSB7CisgICAgICAgICAgICBIVE1MSUZyYW1lRWxlbWVudCogaWZyYW1l
ID0gc3RhdGljX2Nhc3Q8SFRNTElGcmFtZUVsZW1lbnQqPihzb3VyY2UuZ2V0KCkpOworICAgICAg
ICAgICAgaWYgKGZyYW1lKCkgJiYgZnJhbWUoKS0+dHJlZSgpLT5pc0Rlc2NlbmRhbnRPZihpZnJh
bWUtPmNvbnRlbnRGcmFtZSgpKSkgeworICAgICAgICAgICAgICAgIGVjID0gSElFUkFSQ0hZX1JF
UVVFU1RfRVJSOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAg
ICAgICB9CisgICAgICAgIGlmIChzb3VyY2UtPnBhcmVudE5vZGUoKSkKKyAgICAgICAgICAgIHNv
dXJjZS0+cGFyZW50Tm9kZSgpLT5yZW1vdmVDaGlsZChzb3VyY2UuZ2V0KCksIGVjKTsKKyAgICB9
CisKKyAgICB0aGlzLT5hZG9wdElmTmVlZGVkKHNvdXJjZS5nZXQoKSk7CisKKyAgICByZXR1cm4g
c291cmNlOworfQorCitib29sIERvY3VtZW50OjpoYXNWYWxpZE5hbWVzcGFjZUZvckVsZW1lbnRz
KGNvbnN0IFF1YWxpZmllZE5hbWUmIHFOYW1lKQoreworICAgIC8vIFRoZXNlIGNoZWNrcyBhcmUg
ZnJvbSBET00gQ29yZSBMZXZlbCAyLCBjcmVhdGVFbGVtZW50TlMKKyAgICAvLyBodHRwOi8vd3d3
LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3JlL2NvcmUuaHRtbCNJRC1Eb2NDckVsTlMKKyAgICBp
ZiAoIXFOYW1lLnByZWZpeCgpLmlzRW1wdHkoKSAmJiBxTmFtZS5uYW1lc3BhY2VVUkkoKS5pc051
bGwoKSkgLy8gY3JlYXRlRWxlbWVudE5TKG51bGwsICJodG1sOmRpdiIpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICBpZiAocU5hbWUucHJlZml4KCkgPT0geG1sQXRvbSAmJiBxTmFtZS5uYW1l
c3BhY2VVUkkoKSAhPSBYTUxOYW1lczo6eG1sTmFtZXNwYWNlVVJJKSAvLyBjcmVhdGVFbGVtZW50
TlMoImh0dHA6Ly93d3cuZXhhbXBsZS5jb20iLCAieG1sOmxhbmciKQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICAvLyBSZXF1aXJlZCBieSBET00gTGV2ZWwgMyBDb3JlIGFuZCB1bnNwZWNp
ZmllZCBieSBET00gTGV2ZWwgMiBDb3JlOgorICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIw
MDQvUkVDLURPTS1MZXZlbC0zLUNvcmUtMjAwNDA0MDcvY29yZS5odG1sI0lELURvY0NyRWxOUwor
ICAgIC8vIGNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8iLCAi
Zm9vOmJhciIpLCBjcmVhdGVFbGVtZW50TlMobnVsbCwgInhtbG5zOmJhciIpCisgICAgaWYgKChx
TmFtZS5wcmVmaXgoKSA9PSB4bWxuc0F0b20gJiYgcU5hbWUubmFtZXNwYWNlVVJJKCkgIT0gWE1M
TlNOYW1lczo6eG1sbnNOYW1lc3BhY2VVUkkpIHx8IChxTmFtZS5wcmVmaXgoKSAhPSB4bWxuc0F0
b20gJiYgcU5hbWUubmFtZXNwYWNlVVJJKCkgPT0gWE1MTlNOYW1lczo6eG1sbnNOYW1lc3BhY2VV
UkkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9v
bCBEb2N1bWVudDo6aGFzVmFsaWROYW1lc3BhY2VGb3JBdHRyaWJ1dGVzKGNvbnN0IFF1YWxpZmll
ZE5hbWUmIHFOYW1lKQoreworICAgIC8vIFNwZWM6IERPTSBMZXZlbCAyIENvcmU6IGh0dHA6Ly93
d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUNvcmUvY29yZS5odG1sI0lELUVsU2V0QXR0ck5TCisg
ICAgaWYgKHFOYW1lLnByZWZpeCgpLmlzRW1wdHkoKSAmJiBxTmFtZS5sb2NhbE5hbWUoKSA9PSB4
bWxuc0F0b20pIHsKKyAgICAgICAgLy8gTm90ZTogVGhlIGNhc2Ugb2YgYW4gInhtbG5zIiBxdWFs
aWZpZWQgbmFtZSB3aXRoIGEgbmFtZXNwYWNlIG9mCisgICAgICAgIC8vIHhtbG5zTmFtZXNwYWNl
VVJJIGlzIHNwZWNpZmljYWxseSBhbGxvd2VkIChTZWUgPGh0dHA6Ly93d3cudzMub3JnLzIwMDAv
eG1sbnMvPikuCisgICAgICAgIHJldHVybiBxTmFtZS5uYW1lc3BhY2VVUkkoKSA9PSBYTUxOU05h
bWVzOjp4bWxuc05hbWVzcGFjZVVSSTsKKyAgICB9CisgICAgcmV0dXJuIGhhc1ZhbGlkTmFtZXNw
YWNlRm9yRWxlbWVudHMocU5hbWUpOworfQorCisvLyBGSVhNRTogVGhpcyBzaG91bGQgcmVhbGx5
IGJlIGluIGEgcG9zc2libGUgRWxlbWVudEZhY3RvcnkgY2xhc3MKK1Bhc3NSZWZQdHI8RWxlbWVu
dD4gRG9jdW1lbnQ6OmNyZWF0ZUVsZW1lbnQoY29uc3QgUXVhbGlmaWVkTmFtZSYgcU5hbWUsIGJv
b2wgY3JlYXRlZEJ5UGFyc2VyKQoreworICAgIFJlZlB0cjxFbGVtZW50PiBlOworCisgICAgLy8g
RklYTUU6IFVzZSByZWdpc3RlcmVkIG5hbWVzcGFjZXMgYW5kIGxvb2sgdXAgaW4gYSBoYXNoIHRv
IGZpbmQgdGhlIHJpZ2h0IGZhY3RvcnkuCisgICAgaWYgKHFOYW1lLm5hbWVzcGFjZVVSSSgpID09
IHhodG1sTmFtZXNwYWNlVVJJKQorICAgICAgICBlID0gSFRNTEVsZW1lbnRGYWN0b3J5OjpjcmVh
dGVIVE1MRWxlbWVudChxTmFtZSwgdGhpcywgMCwgY3JlYXRlZEJ5UGFyc2VyKTsKKyNpZiBFTkFC
TEUoU1ZHKQorICAgIGVsc2UgaWYgKHFOYW1lLm5hbWVzcGFjZVVSSSgpID09IFNWR05hbWVzOjpz
dmdOYW1lc3BhY2VVUkkpCisgICAgICAgIGUgPSBTVkdFbGVtZW50RmFjdG9yeTo6Y3JlYXRlU1ZH
RWxlbWVudChxTmFtZSwgdGhpcywgY3JlYXRlZEJ5UGFyc2VyKTsKKyNlbmRpZgorI2lmIEVOQUJM
RShNQVRITUwpCisgICAgZWxzZSBpZiAocU5hbWUubmFtZXNwYWNlVVJJKCkgPT0gTWF0aE1MTmFt
ZXM6Om1hdGhtbE5hbWVzcGFjZVVSSSkKKyAgICAgICAgZSA9IE1hdGhNTEVsZW1lbnRGYWN0b3J5
OjpjcmVhdGVNYXRoTUxFbGVtZW50KHFOYW1lLCB0aGlzLCBjcmVhdGVkQnlQYXJzZXIpOworI2Vu
ZGlmCisKKyAgICBpZiAoZSkKKyAgICAgICAgbV9zYXdFbGVtZW50c0luS25vd25OYW1lc3BhY2Vz
ID0gdHJ1ZTsKKyAgICBlbHNlCisgICAgICAgIGUgPSBFbGVtZW50OjpjcmVhdGUocU5hbWUsIGRv
Y3VtZW50KCkpOworCisgICAgLy8gPGltYWdlPiB1c2VzIGltZ1RhZyBzbyB3ZSBuZWVkIGEgc3Bl
Y2lhbCBydWxlLgorICAgIEFTU0VSVCgocU5hbWUubWF0Y2hlcyhpbWFnZVRhZykgJiYgZS0+dGFn
UU5hbWUoKS5tYXRjaGVzKGltZ1RhZykgJiYgZS0+dGFnUU5hbWUoKS5wcmVmaXgoKSA9PSBxTmFt
ZS5wcmVmaXgoKSkgfHwgcU5hbWUgPT0gZS0+dGFnUU5hbWUoKSk7CisKKyAgICByZXR1cm4gZS5y
ZWxlYXNlKCk7Cit9CisKK2Jvb2wgRG9jdW1lbnQ6OnJlZ2lvbkJhc2VkQ29sdW1uc0VuYWJsZWQo
KSBjb25zdAoreworICAgIHJldHVybiBzZXR0aW5ncygpICYmIHNldHRpbmdzKCktPnJlZ2lvbkJh
c2VkQ29sdW1uc0VuYWJsZWQoKTsgCit9CisKK2Jvb2wgRG9jdW1lbnQ6OmNzc1N0aWNreVBvc2l0
aW9uRW5hYmxlZCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIHNldHRpbmdzKCkgJiYgc2V0dGluZ3Mo
KS0+Y3NzU3RpY2t5UG9zaXRpb25FbmFibGVkKCk7IAorfQorCitib29sIERvY3VtZW50Ojpjc3NS
ZWdpb25zRW5hYmxlZCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIHNldHRpbmdzKCkgJiYgc2V0dGlu
Z3MoKS0+Y3NzUmVnaW9uc0VuYWJsZWQoKTsgCit9CisKK2Jvb2wgRG9jdW1lbnQ6OmNzc0dyaWRM
YXlvdXRFbmFibGVkKCkgY29uc3QKK3sKKyAgICByZXR1cm4gc2V0dGluZ3MoKSAmJiBzZXR0aW5n
cygpLT5jc3NHcmlkTGF5b3V0RW5hYmxlZCgpOworfQorCisjaWYgRU5BQkxFKENTU19SRUdJT05T
KQorCitQYXNzUmVmUHRyPFdlYktpdE5hbWVkRmxvdz4gRG9jdW1lbnQ6OndlYmtpdEdldEZsb3dC
eU5hbWUoY29uc3QgU3RyaW5nJiBmbG93TmFtZSkKK3sKKyAgICBpZiAoIWNzc1JlZ2lvbnNFbmFi
bGVkKCkgfHwgIXJlbmRlcmVyKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgLy8gSXQncyBw
b3NzaWJsZSB0byBoYXZlIHBlbmRpbmcgc3R5bGVzIG5vdCBhcHBsaWVkIHRoYXQgYWZmZWN0IHRo
ZSBleGlzdGluZyBmbG93cy4KKyAgICB1cGRhdGVTdHlsZUlmTmVlZGVkKCk7CisKKyAgICByZXR1
cm4gbmFtZWRGbG93cygpLT5mbG93QnlOYW1lKGZsb3dOYW1lKTsKK30KKworUGFzc1JlZlB0cjxE
T01OYW1lZEZsb3dDb2xsZWN0aW9uPiBEb2N1bWVudDo6d2Via2l0R2V0TmFtZWRGbG93cygpCit7
CisgICAgaWYgKCFjc3NSZWdpb25zRW5hYmxlZCgpIHx8ICFyZW5kZXJlcigpKQorICAgICAgICBy
ZXR1cm4gMDsKKworICAgIHVwZGF0ZVN0eWxlSWZOZWVkZWQoKTsKKworICAgIHJldHVybiBuYW1l
ZEZsb3dzKCktPmNyZWF0ZUNTU09NU25hcHNob3QoKTsKK30KKworI2VuZGlmCisKK05hbWVkRmxv
d0NvbGxlY3Rpb24qIERvY3VtZW50OjpuYW1lZEZsb3dzKCkKK3sKKyAgICBpZiAoIW1fbmFtZWRG
bG93cykKKyAgICAgICAgbV9uYW1lZEZsb3dzID0gTmFtZWRGbG93Q29sbGVjdGlvbjo6Y3JlYXRl
KHRoaXMpOworCisgICAgcmV0dXJuIG1fbmFtZWRGbG93cy5nZXQoKTsKK30KKworUGFzc1JlZlB0
cjxFbGVtZW50PiBEb2N1bWVudDo6Y3JlYXRlRWxlbWVudE5TKGNvbnN0IFN0cmluZyYgbmFtZXNw
YWNlVVJJLCBjb25zdCBTdHJpbmcmIHF1YWxpZmllZE5hbWUsIEV4Y2VwdGlvbkNvZGUmIGVjKQor
eworICAgIFN0cmluZyBwcmVmaXgsIGxvY2FsTmFtZTsKKyAgICBpZiAoIXBhcnNlUXVhbGlmaWVk
TmFtZShxdWFsaWZpZWROYW1lLCBwcmVmaXgsIGxvY2FsTmFtZSwgZWMpKQorICAgICAgICByZXR1
cm4gMDsKKworICAgIFF1YWxpZmllZE5hbWUgcU5hbWUocHJlZml4LCBsb2NhbE5hbWUsIG5hbWVz
cGFjZVVSSSk7CisgICAgaWYgKCFoYXNWYWxpZE5hbWVzcGFjZUZvckVsZW1lbnRzKHFOYW1lKSkg
eworICAgICAgICBlYyA9IE5BTUVTUEFDRV9FUlI7CisgICAgICAgIHJldHVybiAwOworICAgIH0K
KworICAgIHJldHVybiBjcmVhdGVFbGVtZW50KHFOYW1lLCBmYWxzZSk7Cit9CisKK1N0cmluZyBE
b2N1bWVudDo6cmVhZHlTdGF0ZSgpIGNvbnN0Cit7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChj
b25zdCBTdHJpbmcsIGxvYWRpbmcsIChBU0NJSUxpdGVyYWwoImxvYWRpbmciKSkpOworICAgIERF
RklORV9TVEFUSUNfTE9DQUwoY29uc3QgU3RyaW5nLCBpbnRlcmFjdGl2ZSwgKEFTQ0lJTGl0ZXJh
bCgiaW50ZXJhY3RpdmUiKSkpOworICAgIERFRklORV9TVEFUSUNfTE9DQUwoY29uc3QgU3RyaW5n
LCBjb21wbGV0ZSwgKEFTQ0lJTGl0ZXJhbCgiY29tcGxldGUiKSkpOworCisgICAgc3dpdGNoICht
X3JlYWR5U3RhdGUpIHsKKyAgICBjYXNlIExvYWRpbmc6CisgICAgICAgIHJldHVybiBsb2FkaW5n
OworICAgIGNhc2UgSW50ZXJhY3RpdmU6CisgICAgICAgIHJldHVybiBpbnRlcmFjdGl2ZTsKKyAg
ICBjYXNlIENvbXBsZXRlOgorICAgICAgICByZXR1cm4gY29tcGxldGU7CisgICAgfQorCisgICAg
QVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIFN0cmluZygpOworfQorCit2b2lkIERv
Y3VtZW50OjpzZXRSZWFkeVN0YXRlKFJlYWR5U3RhdGUgcmVhZHlTdGF0ZSkKK3sKKyAgICBpZiAo
cmVhZHlTdGF0ZSA9PSBtX3JlYWR5U3RhdGUpCisgICAgICAgIHJldHVybjsKKworICAgIHN3aXRj
aCAocmVhZHlTdGF0ZSkgeworICAgIGNhc2UgTG9hZGluZzoKKyAgICAgICAgaWYgKCFtX2RvY3Vt
ZW50VGltaW5nLmRvbUxvYWRpbmcpCisgICAgICAgICAgICBtX2RvY3VtZW50VGltaW5nLmRvbUxv
YWRpbmcgPSBtb25vdG9uaWNhbGx5SW5jcmVhc2luZ1RpbWUoKTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgY2FzZSBJbnRlcmFjdGl2ZToKKyAgICAgICAgaWYgKCFtX2RvY3VtZW50VGltaW5nLmRvbUlu
dGVyYWN0aXZlKQorICAgICAgICAgICAgbV9kb2N1bWVudFRpbWluZy5kb21JbnRlcmFjdGl2ZSA9
IG1vbm90b25pY2FsbHlJbmNyZWFzaW5nVGltZSgpOworICAgICAgICBicmVhazsKKyAgICBjYXNl
IENvbXBsZXRlOgorICAgICAgICBpZiAoIW1fZG9jdW1lbnRUaW1pbmcuZG9tQ29tcGxldGUpCisg
ICAgICAgICAgICBtX2RvY3VtZW50VGltaW5nLmRvbUNvbXBsZXRlID0gbW9ub3RvbmljYWxseUlu
Y3JlYXNpbmdUaW1lKCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIG1fcmVhZHlTdGF0
ZSA9IHJlYWR5U3RhdGU7CisgICAgZGlzcGF0Y2hFdmVudChFdmVudDo6Y3JlYXRlKGV2ZW50TmFt
ZXMoKS5yZWFkeXN0YXRlY2hhbmdlRXZlbnQsIGZhbHNlLCBmYWxzZSkpOworICAgIAorICAgIGlm
IChzZXR0aW5ncygpICYmIHNldHRpbmdzKCktPnN1cHByZXNzZXNJbmNyZW1lbnRhbFJlbmRlcmlu
ZygpKQorICAgICAgICBzZXRWaXN1YWxVcGRhdGVzQWxsb3dlZChyZWFkeVN0YXRlKTsKK30KKwor
dm9pZCBEb2N1bWVudDo6c2V0VmlzdWFsVXBkYXRlc0FsbG93ZWQoUmVhZHlTdGF0ZSByZWFkeVN0
YXRlKQoreworICAgIEFTU0VSVChzZXR0aW5ncygpICYmIHNldHRpbmdzKCktPnN1cHByZXNzZXNJ
bmNyZW1lbnRhbFJlbmRlcmluZygpKTsKKyAgICBzd2l0Y2ggKHJlYWR5U3RhdGUpIHsKKyAgICBj
YXNlIExvYWRpbmc6CisgICAgICAgIEFTU0VSVCghbV92aXN1YWxVcGRhdGVzU3VwcHJlc3Npb25U
aW1lci5pc0FjdGl2ZSgpKTsKKyAgICAgICAgQVNTRVJUKG1fdmlzdWFsVXBkYXRlc0FsbG93ZWQp
OworICAgICAgICBtX3Zpc3VhbFVwZGF0ZXNTdXBwcmVzc2lvblRpbWVyLnN0YXJ0T25lU2hvdChz
ZXR0aW5ncygpLT5pbmNyZW1lbnRhbFJlbmRlcmluZ1N1cHByZXNzaW9uVGltZW91dEluU2Vjb25k
cygpKTsKKyAgICAgICAgc2V0VmlzdWFsVXBkYXRlc0FsbG93ZWQoZmFsc2UpOworICAgICAgICBi
cmVhazsKKyAgICBjYXNlIEludGVyYWN0aXZlOgorICAgICAgICBBU1NFUlQobV92aXN1YWxVcGRh
dGVzU3VwcHJlc3Npb25UaW1lci5pc0FjdGl2ZSgpIHx8IG1fdmlzdWFsVXBkYXRlc0FsbG93ZWQp
OworICAgICAgICBicmVhazsKKyAgICBjYXNlIENvbXBsZXRlOgorICAgICAgICBpZiAobV92aXN1
YWxVcGRhdGVzU3VwcHJlc3Npb25UaW1lci5pc0FjdGl2ZSgpKSB7CisgICAgICAgICAgICBBU1NF
UlQoIW1fdmlzdWFsVXBkYXRlc0FsbG93ZWQpOworICAgICAgICAgICAgbV92aXN1YWxVcGRhdGVz
U3VwcHJlc3Npb25UaW1lci5zdG9wKCk7CisgICAgICAgICAgICBzZXRWaXN1YWxVcGRhdGVzQWxs
b3dlZCh0cnVlKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBBU1NFUlQobV92aXN1YWxV
cGRhdGVzQWxsb3dlZCk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKyAgICAKK3ZvaWQgRG9j
dW1lbnQ6OnNldFZpc3VhbFVwZGF0ZXNBbGxvd2VkKGJvb2wgdmlzdWFsVXBkYXRlc0FsbG93ZWQp
Cit7CisgICAgaWYgKG1fdmlzdWFsVXBkYXRlc0FsbG93ZWQgPT0gdmlzdWFsVXBkYXRlc0FsbG93
ZWQpCisgICAgICAgIHJldHVybjsKKworICAgIG1fdmlzdWFsVXBkYXRlc0FsbG93ZWQgPSB2aXN1
YWxVcGRhdGVzQWxsb3dlZDsKKworICAgIGlmICghdmlzdWFsVXBkYXRlc0FsbG93ZWQpCisgICAg
ICAgIHJldHVybjsKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICBpZiAo
dmlldygpKQorICAgICAgICB2aWV3KCktPnVwZGF0ZUNvbXBvc2l0aW5nTGF5ZXJzQWZ0ZXJMYXlv
dXQoKTsKKyNlbmRpZgorCisgICAgaWYgKHJlbmRlcmVyKCkpCisgICAgICAgIHJlbmRlcmVyKCkt
PnJlcGFpbnQoKTsKK30KKwordm9pZCBEb2N1bWVudDo6dmlzdWFsVXBkYXRlc1N1cHByZXNzaW9u
VGltZXJGaXJlZChUaW1lcjxEb2N1bWVudD4qKQoreworICAgIEFTU0VSVCghbV92aXN1YWxVcGRh
dGVzQWxsb3dlZCk7CisgICAgc2V0VmlzdWFsVXBkYXRlc0FsbG93ZWQodHJ1ZSk7Cit9CisKK1N0
cmluZyBEb2N1bWVudDo6ZW5jb2RpbmcoKSBjb25zdAoreworICAgIGlmIChUZXh0UmVzb3VyY2VE
ZWNvZGVyKiBkID0gZGVjb2RlcigpKQorICAgICAgICByZXR1cm4gZC0+ZW5jb2RpbmcoKS5kb21O
YW1lKCk7CisgICAgcmV0dXJuIFN0cmluZygpOworfQorCitTdHJpbmcgRG9jdW1lbnQ6OmRlZmF1
bHRDaGFyc2V0KCkgY29uc3QKK3sKKyAgICBpZiAoU2V0dGluZ3MqIHNldHRpbmdzID0gdGhpcy0+
c2V0dGluZ3MoKSkKKyAgICAgICAgcmV0dXJuIHNldHRpbmdzLT5kZWZhdWx0VGV4dEVuY29kaW5n
TmFtZSgpOworICAgIHJldHVybiBTdHJpbmcoKTsKK30KKwordm9pZCBEb2N1bWVudDo6c2V0Q2hh
cnNldChjb25zdCBTdHJpbmcmIGNoYXJzZXQpCit7CisgICAgaWYgKCFkZWNvZGVyKCkpCisgICAg
ICAgIHJldHVybjsKKyAgICBkZWNvZGVyKCktPnNldEVuY29kaW5nKGNoYXJzZXQsIFRleHRSZXNv
dXJjZURlY29kZXI6OlVzZXJDaG9zZW5FbmNvZGluZyk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnNl
dENvbnRlbnRMYW5ndWFnZShjb25zdCBTdHJpbmcmIGxhbmd1YWdlKQoreworICAgIGlmIChtX2Nv
bnRlbnRMYW5ndWFnZSA9PSBsYW5ndWFnZSkKKyAgICAgICAgcmV0dXJuOworICAgIG1fY29udGVu
dExhbmd1YWdlID0gbGFuZ3VhZ2U7CisKKyAgICAvLyBSZWNhbGN1bGF0ZSBzdHlsZSBzbyBsYW5n
dWFnZSBpcyB1c2VkIHdoZW4gc2VsZWN0aW5nIHRoZSBpbml0aWFsIGZvbnQuCisgICAgc3R5bGVS
ZXNvbHZlckNoYW5nZWQoRGVmZXJSZWNhbGNTdHlsZSk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnNl
dFhNTFZlcnNpb24oY29uc3QgU3RyaW5nJiB2ZXJzaW9uLCBFeGNlcHRpb25Db2RlJiBlYykKK3sK
KyAgICBpZiAoIWltcGxlbWVudGF0aW9uKCktPmhhc0ZlYXR1cmUoIlhNTCIsIFN0cmluZygpKSkg
eworICAgICAgICBlYyA9IE5PVF9TVVBQT1JURURfRVJSOworICAgICAgICByZXR1cm47CisgICAg
fQorCisgICAgaWYgKCFYTUxEb2N1bWVudFBhcnNlcjo6c3VwcG9ydHNYTUxWZXJzaW9uKHZlcnNp
b24pKSB7CisgICAgICAgIGVjID0gTk9UX1NVUFBPUlRFRF9FUlI7CisgICAgICAgIHJldHVybjsK
KyAgICB9CisKKyAgICBtX3htbFZlcnNpb24gPSB2ZXJzaW9uOworfQorCit2b2lkIERvY3VtZW50
OjpzZXRYTUxTdGFuZGFsb25lKGJvb2wgc3RhbmRhbG9uZSwgRXhjZXB0aW9uQ29kZSYgZWMpCit7
CisgICAgaWYgKCFpbXBsZW1lbnRhdGlvbigpLT5oYXNGZWF0dXJlKCJYTUwiLCBTdHJpbmcoKSkp
IHsKKyAgICAgICAgZWMgPSBOT1RfU1VQUE9SVEVEX0VSUjsKKyAgICAgICAgcmV0dXJuOworICAg
IH0KKworICAgIG1feG1sU3RhbmRhbG9uZSA9IHN0YW5kYWxvbmUgPyBTdGFuZGFsb25lIDogTm90
U3RhbmRhbG9uZTsKK30KKwordm9pZCBEb2N1bWVudDo6c2V0RG9jdW1lbnRVUkkoY29uc3QgU3Ry
aW5nJiB1cmkpCit7CisgICAgLy8gVGhpcyBwcm9wZXJ0eSBpcyByZWFkLW9ubHkgZnJvbSBKYXZh
U2NyaXB0LCBidXQgd3JpdGFibGUgZnJvbSBPYmplY3RpdmUtQy4KKyAgICBtX2RvY3VtZW50VVJJ
ID0gdXJpOworICAgIHVwZGF0ZUJhc2VVUkwoKTsKK30KKworS1VSTCBEb2N1bWVudDo6YmFzZVVS
SSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fYmFzZVVSTDsKK30KKwordm9pZCBEb2N1bWVudDo6
c2V0Q29udGVudChjb25zdCBTdHJpbmcmIGNvbnRlbnQpCit7CisgICAgb3BlbigpOworICAgIG1f
cGFyc2VyLT5hcHBlbmQoY29udGVudCk7CisgICAgY2xvc2UoKTsKK30KKworU3RyaW5nIERvY3Vt
ZW50OjpzdWdnZXN0ZWRNSU1FVHlwZSgpIGNvbnN0Cit7CisgICAgaWYgKG1fZG9jdW1lbnQtPmlz
WEhUTUxEb2N1bWVudCgpKQorICAgICAgICByZXR1cm4gImFwcGxpY2F0aW9uL3hodG1sK3htbCI7
CisgICAgaWYgKG1fZG9jdW1lbnQtPmlzU1ZHRG9jdW1lbnQoKSkKKyAgICAgICAgcmV0dXJuICJp
bWFnZS9zdmcreG1sIjsKKyAgICBpZiAobV9kb2N1bWVudC0+eG1sU3RhbmRhbG9uZSgpKQorICAg
ICAgICByZXR1cm4gInRleHQveG1sIjsKKyAgICBpZiAobV9kb2N1bWVudC0+aXNIVE1MRG9jdW1l
bnQoKSkKKyAgICAgICAgcmV0dXJuICJ0ZXh0L2h0bWwiOworCisgICAgaWYgKERvY3VtZW50TG9h
ZGVyKiBkb2N1bWVudExvYWRlciA9IGxvYWRlcigpKQorICAgICAgICByZXR1cm4gZG9jdW1lbnRM
b2FkZXItPnJlc3BvbnNlTUlNRVR5cGUoKTsKKyAgICByZXR1cm4gU3RyaW5nKCk7Cit9CisKKy8v
IEZJWE1FOiBXZSBuZWVkIHRvIGRpc2N1c3MgdGhlIERPTSBBUEkgaGVyZSBhdCBzb21lIHBvaW50
LiBJZGVhczoKKy8vICogbWFraW5nIGl0IHJlY2VpdmUgYSByZWN0IGFzIHBhcmFtZXRlciwgaS5l
LiBub2Rlc0Zyb21SZWN0KHgsIHksIHcsIGgpOworLy8gKiBtYWtpbmcgaXQgcmVjZWl2ZSB0aGUg
ZXhwYWRpbmcgc2l6ZSBvZiBlYWNoIGRpcmVjdGlvbiBzZXBhcmF0ZWx5LAorLy8gICBpLmUuIG5v
ZGVzRnJvbVJlY3QoeCwgeSwgdG9wU2l6ZSwgcmlnaHRTaXplLCBib3R0b21TaXplLCBsZWZ0U2l6
ZSk7CitQYXNzUmVmUHRyPE5vZGVMaXN0PiBEb2N1bWVudDo6bm9kZXNGcm9tUmVjdChpbnQgY2Vu
dGVyWCwgaW50IGNlbnRlclksIHVuc2lnbmVkIHRvcFBhZGRpbmcsIHVuc2lnbmVkIHJpZ2h0UGFk
ZGluZywgdW5zaWduZWQgYm90dG9tUGFkZGluZywgdW5zaWduZWQgbGVmdFBhZGRpbmcsIGJvb2wg
aWdub3JlQ2xpcHBpbmcsIGJvb2wgYWxsb3dTaGFkb3dDb250ZW50KSBjb25zdAoreworICAgIC8v
IEZJWE1FOiBTaGFyZSBjb2RlIGJldHdlZW4gdGhpcywgZWxlbWVudEZyb21Qb2ludCBhbmQgY2Fy
ZXRSYW5nZUZyb21Qb2ludC4KKyAgICBpZiAoIXJlbmRlcmVyKCkpCisgICAgICAgIHJldHVybiAw
OworICAgIEZyYW1lKiBmcmFtZSA9IHRoaXMtPmZyYW1lKCk7CisgICAgaWYgKCFmcmFtZSkKKyAg
ICAgICAgcmV0dXJuIDA7CisgICAgRnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBmcmFtZS0+dmlldygp
OworICAgIGlmICghZnJhbWVWaWV3KQorICAgICAgICByZXR1cm4gMDsKKworICAgIGZsb2F0IHpv
b21GYWN0b3IgPSBmcmFtZS0+cGFnZVpvb21GYWN0b3IoKTsKKyAgICBMYXlvdXRQb2ludCBwb2lu
dCA9IHJvdW5kZWRMYXlvdXRQb2ludChGbG9hdFBvaW50KGNlbnRlclggKiB6b29tRmFjdG9yICsg
dmlldygpLT5zY3JvbGxYKCksIGNlbnRlclkgKiB6b29tRmFjdG9yICsgdmlldygpLT5zY3JvbGxZ
KCkpKTsKKworICAgIGludCB0eXBlID0gSGl0VGVzdFJlcXVlc3Q6OlJlYWRPbmx5IHwgSGl0VGVz
dFJlcXVlc3Q6OkFjdGl2ZTsKKworICAgIC8vIFdoZW4gaWdub3JlQ2xpcHBpbmcgaXMgZmFsc2Us
IHRoaXMgbWV0aG9kIHJldHVybnMgbnVsbCBmb3IgY29vcmRpbmF0ZXMgb3V0c2lkZSBvZiB0aGUg
dmlld3BvcnQuCisgICAgaWYgKGlnbm9yZUNsaXBwaW5nKQorICAgICAgICB0eXBlIHw9IEhpdFRl
c3RSZXF1ZXN0OjpJZ25vcmVDbGlwcGluZzsKKyAgICBlbHNlIGlmICghZnJhbWVWaWV3LT52aXNp
YmxlQ29udGVudFJlY3QoKS5pbnRlcnNlY3RzKEhpdFRlc3RSZXN1bHQ6OnJlY3RGb3JQb2ludChw
b2ludCwgdG9wUGFkZGluZywgcmlnaHRQYWRkaW5nLCBib3R0b21QYWRkaW5nLCBsZWZ0UGFkZGlu
ZykpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoYWxsb3dTaGFkb3dDb250ZW50KQorICAg
ICAgICB0eXBlIHw9IEhpdFRlc3RSZXF1ZXN0OjpBbGxvd1NoYWRvd0NvbnRlbnQ7CisKKyAgICBI
aXRUZXN0UmVxdWVzdCByZXF1ZXN0KHR5cGUpOworCisgICAgLy8gUGFzc2luZyBhIHplcm8gcGFk
ZGluZyB3aWxsIHRyaWdnZXIgYSByZWN0IGhpdCB0ZXN0LCBob3dldmVyIGZvciB0aGUgcHVycG9z
ZXMgb2Ygbm9kZXNGcm9tUmVjdCwKKyAgICAvLyB3ZSBzcGVjaWFsIGhhbmRsZSB0aGlzIGNhc2Ug
aW4gb3JkZXIgdG8gcmV0dXJuIGEgdmFsaWQgTm9kZUxpc3QuCisgICAgaWYgKCF0b3BQYWRkaW5n
ICYmICFyaWdodFBhZGRpbmcgJiYgIWJvdHRvbVBhZGRpbmcgJiYgIWxlZnRQYWRkaW5nKSB7Cisg
ICAgICAgIEhpdFRlc3RSZXN1bHQgcmVzdWx0KHBvaW50KTsKKyAgICAgICAgcmV0dXJuIGhhbmRs
ZVplcm9QYWRkaW5nKHJlcXVlc3QsIHJlc3VsdCk7CisgICAgfQorCisgICAgSGl0VGVzdFJlc3Vs
dCByZXN1bHQocG9pbnQsIHRvcFBhZGRpbmcsIHJpZ2h0UGFkZGluZywgYm90dG9tUGFkZGluZywg
bGVmdFBhZGRpbmcpOworICAgIHJlbmRlclZpZXcoKS0+aGl0VGVzdChyZXF1ZXN0LCByZXN1bHQp
OworCisgICAgcmV0dXJuIFN0YXRpY0hhc2hTZXROb2RlTGlzdDo6YWRvcHQocmVzdWx0LnJlY3RC
YXNlZFRlc3RSZXN1bHQoKSk7Cit9CisKK1Bhc3NSZWZQdHI8Tm9kZUxpc3Q+IERvY3VtZW50Ojpo
YW5kbGVaZXJvUGFkZGluZyhjb25zdCBIaXRUZXN0UmVxdWVzdCYgcmVxdWVzdCwgSGl0VGVzdFJl
c3VsdCYgcmVzdWx0KSBjb25zdAoreworICAgIHJlbmRlclZpZXcoKS0+aGl0VGVzdChyZXF1ZXN0
LCByZXN1bHQpOworCisgICAgTm9kZSogbm9kZSA9IHJlc3VsdC5pbm5lck5vZGUoKTsKKyAgICBp
ZiAoIW5vZGUpCisgICAgICAgIHJldHVybiAwOworCisgICAgbm9kZSA9IG5vZGUtPnNoYWRvd0Fu
Y2VzdG9yTm9kZSgpOworICAgIExpc3RIYXNoU2V0PFJlZlB0cjxOb2RlPiA+IGxpc3Q7CisgICAg
bGlzdC5hZGQobm9kZSk7CisgICAgcmV0dXJuIFN0YXRpY0hhc2hTZXROb2RlTGlzdDo6YWRvcHQo
bGlzdCk7Cit9CisKK3N0YXRpYyBOb2RlKiBub2RlRnJvbVBvaW50KEZyYW1lKiBmcmFtZSwgUmVu
ZGVyVmlldyogcmVuZGVyVmlldywgaW50IHgsIGludCB5LCBMYXlvdXRQb2ludCogbG9jYWxQb2lu
dCA9IDApCit7CisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgRnJhbWVW
aWV3KiBmcmFtZVZpZXcgPSBmcmFtZS0+dmlldygpOworICAgIGlmICghZnJhbWVWaWV3KQorICAg
ICAgICByZXR1cm4gMDsKKworICAgIGZsb2F0IHpvb21GYWN0b3IgPSBmcmFtZS0+cGFnZVpvb21G
YWN0b3IoKTsKKyAgICBJbnRQb2ludCBwb2ludCA9IHJvdW5kZWRJbnRQb2ludChGbG9hdFBvaW50
KHggKiB6b29tRmFjdG9yICArIGZyYW1lVmlldy0+c2Nyb2xsWCgpLCB5ICogem9vbUZhY3RvciAr
IGZyYW1lVmlldy0+c2Nyb2xsWSgpKSk7CisKKyAgICBpZiAoIWZyYW1lVmlldy0+dmlzaWJsZUNv
bnRlbnRSZWN0KCkuY29udGFpbnMocG9pbnQpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIEhp
dFRlc3RSZXF1ZXN0IHJlcXVlc3QoSGl0VGVzdFJlcXVlc3Q6OlJlYWRPbmx5IHwgSGl0VGVzdFJl
cXVlc3Q6OkFjdGl2ZSk7CisgICAgSGl0VGVzdFJlc3VsdCByZXN1bHQocG9pbnQpOworICAgIHJl
bmRlclZpZXctPmhpdFRlc3QocmVxdWVzdCwgcmVzdWx0KTsKKworICAgIGlmIChsb2NhbFBvaW50
KQorICAgICAgICAqbG9jYWxQb2ludCA9IHJlc3VsdC5sb2NhbFBvaW50KCk7CisKKyAgICByZXR1
cm4gcmVzdWx0LmlubmVyTm9kZSgpOworfQorCitFbGVtZW50KiBEb2N1bWVudDo6ZWxlbWVudEZy
b21Qb2ludChpbnQgeCwgaW50IHkpIGNvbnN0Cit7CisgICAgaWYgKCFyZW5kZXJlcigpKQorICAg
ICAgICByZXR1cm4gMDsKKyAgICBOb2RlKiBub2RlID0gbm9kZUZyb21Qb2ludChmcmFtZSgpLCBy
ZW5kZXJWaWV3KCksIHgsIHkpOworICAgIHdoaWxlIChub2RlICYmICFub2RlLT5pc0VsZW1lbnRO
b2RlKCkpCisgICAgICAgIG5vZGUgPSBub2RlLT5wYXJlbnROb2RlKCk7CisgICAgaWYgKG5vZGUp
CisgICAgICAgIG5vZGUgPSBhbmNlc3RvckluVGhpc1Njb3BlKG5vZGUpOworICAgIHJldHVybiBz
dGF0aWNfY2FzdDxFbGVtZW50Kj4obm9kZSk7Cit9CisKK1Bhc3NSZWZQdHI8UmFuZ2U+IERvY3Vt
ZW50OjpjYXJldFJhbmdlRnJvbVBvaW50KGludCB4LCBpbnQgeSkKK3sKKyAgICBpZiAoIXJlbmRl
cmVyKCkpCisgICAgICAgIHJldHVybiAwOworICAgIExheW91dFBvaW50IGxvY2FsUG9pbnQ7Cisg
ICAgTm9kZSogbm9kZSA9IG5vZGVGcm9tUG9pbnQoZnJhbWUoKSwgcmVuZGVyVmlldygpLCB4LCB5
LCAmbG9jYWxQb2ludCk7CisgICAgaWYgKCFub2RlKQorICAgICAgICByZXR1cm4gMDsKKworICAg
IE5vZGUqIHNoYWRvd0FuY2VzdG9yTm9kZSA9IGFuY2VzdG9ySW5UaGlzU2NvcGUobm9kZSk7Cisg
ICAgaWYgKHNoYWRvd0FuY2VzdG9yTm9kZSAhPSBub2RlKSB7CisgICAgICAgIHVuc2lnbmVkIG9m
ZnNldCA9IHNoYWRvd0FuY2VzdG9yTm9kZS0+bm9kZUluZGV4KCk7CisgICAgICAgIENvbnRhaW5l
ck5vZGUqIGNvbnRhaW5lciA9IHNoYWRvd0FuY2VzdG9yTm9kZS0+cGFyZW50Tm9kZSgpOworICAg
ICAgICByZXR1cm4gUmFuZ2U6OmNyZWF0ZSh0aGlzLCBjb250YWluZXIsIG9mZnNldCwgY29udGFp
bmVyLCBvZmZzZXQpOworICAgIH0KKworICAgIFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSBub2Rl
LT5yZW5kZXJlcigpOworICAgIGlmICghcmVuZGVyZXIpCisgICAgICAgIHJldHVybiAwOworICAg
IFZpc2libGVQb3NpdGlvbiB2aXNpYmxlUG9zaXRpb24gPSByZW5kZXJlci0+cG9zaXRpb25Gb3JQ
b2ludChsb2NhbFBvaW50KTsKKyAgICBpZiAodmlzaWJsZVBvc2l0aW9uLmlzTnVsbCgpKQorICAg
ICAgICByZXR1cm4gMDsKKworICAgIFBvc2l0aW9uIHJhbmdlQ29tcGxpYW50UG9zaXRpb24gPSB2
aXNpYmxlUG9zaXRpb24uZGVlcEVxdWl2YWxlbnQoKS5wYXJlbnRBbmNob3JlZEVxdWl2YWxlbnQo
KTsKKyAgICByZXR1cm4gUmFuZ2U6OmNyZWF0ZSh0aGlzLCByYW5nZUNvbXBsaWFudFBvc2l0aW9u
LCByYW5nZUNvbXBsaWFudFBvc2l0aW9uKTsKK30KKworLyoKKyAqIFBlcmZvcm1zIHRocmVlIG9w
ZXJhdGlvbnM6CisgKiAgMS4gQ29udmVydCBjb250cm9sIGNoYXJhY3RlcnMgdG8gc3BhY2VzCisg
KiAgMi4gVHJpbSBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZXMKKyAqICAzLiBDb2xsYXBzZSBp
bnRlcm5hbCB3aGl0ZXNwYWNlLgorICovCitzdGF0aWMgaW5saW5lIFN0cmluZ1dpdGhEaXJlY3Rp
b24gY2Fub25pY2FsaXplZFRpdGxlKERvY3VtZW50KiBkb2N1bWVudCwgY29uc3QgU3RyaW5nV2l0
aERpcmVjdGlvbiYgdGl0bGVXaXRoRGlyZWN0aW9uKQoreworICAgIGNvbnN0IFN0cmluZyYgdGl0
bGUgPSB0aXRsZVdpdGhEaXJlY3Rpb24uc3RyaW5nKCk7CisgICAgY29uc3QgVUNoYXIqIGNoYXJh
Y3RlcnMgPSB0aXRsZS5jaGFyYWN0ZXJzKCk7CisgICAgdW5zaWduZWQgbGVuZ3RoID0gdGl0bGUu
bGVuZ3RoKCk7CisgICAgdW5zaWduZWQgaTsKKworICAgIFN0cmluZ0J1ZmZlcjxVQ2hhcj4gYnVm
ZmVyKGxlbmd0aCk7CisgICAgdW5zaWduZWQgYnVpbGRlckluZGV4ID0gMDsKKworICAgIC8vIFNr
aXAgbGVhZGluZyBzcGFjZXMgYW5kIGxlYWRpbmcgY2hhcmFjdGVycyB0aGF0IHdvdWxkIGNvbnZl
cnQgdG8gc3BhY2VzCisgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgICAg
IFVDaGFyIGMgPSBjaGFyYWN0ZXJzW2ldOworICAgICAgICBpZiAoIShjIDw9IDB4MjAgfHwgYyA9
PSAweDdGKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChpID09IGxlbmd0
aCkKKyAgICAgICAgcmV0dXJuIFN0cmluZ1dpdGhEaXJlY3Rpb24oKTsKKworICAgIC8vIFJlcGxh
Y2UgY29udHJvbCBjaGFyYWN0ZXJzIHdpdGggc3BhY2VzLCBhbmQgYmFja3NsYXNoZXMgd2l0aCBj
dXJyZW5jeSBzeW1ib2xzLCBhbmQgY29sbGFwc2Ugd2hpdGVzcGFjZS4KKyAgICBib29sIHByZXZp
b3VzQ2hhcldhc1dTID0gZmFsc2U7CisgICAgZm9yICg7IGkgPCBsZW5ndGg7ICsraSkgeworICAg
ICAgICBVQ2hhciBjID0gY2hhcmFjdGVyc1tpXTsKKyAgICAgICAgaWYgKGMgPD0gMHgyMCB8fCBj
ID09IDB4N0YgfHwgKFdURjo6VW5pY29kZTo6Y2F0ZWdvcnkoYykgJiAoV1RGOjpVbmljb2RlOjpT
ZXBhcmF0b3JfTGluZSB8IFdURjo6VW5pY29kZTo6U2VwYXJhdG9yX1BhcmFncmFwaCkpKSB7Cisg
ICAgICAgICAgICBpZiAocHJldmlvdXNDaGFyV2FzV1MpCisgICAgICAgICAgICAgICAgY29udGlu
dWU7CisgICAgICAgICAgICBidWZmZXJbYnVpbGRlckluZGV4KytdID0gJyAnOworICAgICAgICAg
ICAgcHJldmlvdXNDaGFyV2FzV1MgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAg
ICAgYnVmZmVyW2J1aWxkZXJJbmRleCsrXSA9IGM7CisgICAgICAgICAgICBwcmV2aW91c0NoYXJX
YXNXUyA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gU3RyaXAgdHJhaWxpbmcg
c3BhY2VzCisgICAgd2hpbGUgKGJ1aWxkZXJJbmRleCA+IDApIHsKKyAgICAgICAgLS1idWlsZGVy
SW5kZXg7CisgICAgICAgIGlmIChidWZmZXJbYnVpbGRlckluZGV4XSAhPSAnICcpCisgICAgICAg
ICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJ1aWxkZXJJbmRleCAmJiBidWZmZXJbYnVp
bGRlckluZGV4XSA9PSAnICcpCisgICAgICAgIHJldHVybiBTdHJpbmdXaXRoRGlyZWN0aW9uKCk7
CisKKyAgICBidWZmZXIuc2hyaW5rKGJ1aWxkZXJJbmRleCArIDEpOworCisgICAgLy8gUmVwbGFj
ZSB0aGUgYmFja3NsYXNoZXMgd2l0aCBjdXJyZW5jeSBzeW1ib2xzIGlmIHRoZSBlbmNvZGluZyBy
ZXF1aXJlcyBpdC4KKyAgICBkb2N1bWVudC0+ZGlzcGxheUJ1ZmZlck1vZGlmaWVkQnlFbmNvZGlu
ZyhidWZmZXIuY2hhcmFjdGVycygpLCBidWZmZXIubGVuZ3RoKCkpOworICAgIAorICAgIHJldHVy
biBTdHJpbmdXaXRoRGlyZWN0aW9uKFN0cmluZzo6YWRvcHQoYnVmZmVyKSwgdGl0bGVXaXRoRGly
ZWN0aW9uLmRpcmVjdGlvbigpKTsKK30KKwordm9pZCBEb2N1bWVudDo6dXBkYXRlVGl0bGUoY29u
c3QgU3RyaW5nV2l0aERpcmVjdGlvbiYgdGl0bGUpCit7CisgICAgaWYgKG1fcmF3VGl0bGUgPT0g
dGl0bGUpCisgICAgICAgIHJldHVybjsKKworICAgIG1fcmF3VGl0bGUgPSB0aXRsZTsKKyAgICBt
X3RpdGxlID0gY2Fub25pY2FsaXplZFRpdGxlKHRoaXMsIG1fcmF3VGl0bGUpOworICAgIGlmIChG
cmFtZSogZiA9IGZyYW1lKCkpCisgICAgICAgIGYtPmxvYWRlcigpLT5zZXRUaXRsZShtX3RpdGxl
KTsKK30KKwordm9pZCBEb2N1bWVudDo6c2V0VGl0bGUoY29uc3QgU3RyaW5nJiB0aXRsZSkKK3sK
KyAgICAvLyBUaXRsZSBzZXQgYnkgSmF2YVNjcmlwdCAtLSBvdmVycmlkZXMgYW55IHRpdGxlIGVs
ZW1lbnRzLgorICAgIG1fdGl0bGVTZXRFeHBsaWNpdGx5ID0gdHJ1ZTsKKyAgICBpZiAoIWlzSFRN
TERvY3VtZW50KCkgJiYgIWlzWEhUTUxEb2N1bWVudCgpKQorICAgICAgICBtX3RpdGxlRWxlbWVu
dCA9IDA7CisgICAgZWxzZSBpZiAoIW1fdGl0bGVFbGVtZW50KSB7CisgICAgICAgIGlmIChIVE1M
RWxlbWVudCogaGVhZEVsZW1lbnQgPSBoZWFkKCkpIHsKKyAgICAgICAgICAgIG1fdGl0bGVFbGVt
ZW50ID0gY3JlYXRlRWxlbWVudCh0aXRsZVRhZywgZmFsc2UpOworICAgICAgICAgICAgRXhjZXB0
aW9uQ29kZSBlYyA9IDA7CisgICAgICAgICAgICBoZWFkRWxlbWVudC0+YXBwZW5kQ2hpbGQobV90
aXRsZUVsZW1lbnQsIGVjKTsKKyAgICAgICAgICAgIEFTU0VSVCghZWMpOworICAgICAgICB9Cisg
ICAgfQorCisgICAgLy8gVGhlIERPTSBBUEkgaGFzIG5vIG1ldGhvZCBvZiBzcGVjaWZ5aW5nIGRp
cmVjdGlvbiwgc28gYXNzdW1lIExUUi4KKyAgICB1cGRhdGVUaXRsZShTdHJpbmdXaXRoRGlyZWN0
aW9uKHRpdGxlLCBMVFIpKTsKKworICAgIGlmIChtX3RpdGxlRWxlbWVudCkgeworICAgICAgICBB
U1NFUlQobV90aXRsZUVsZW1lbnQtPmhhc1RhZ05hbWUodGl0bGVUYWcpKTsKKyAgICAgICAgaWYg
KG1fdGl0bGVFbGVtZW50LT5oYXNUYWdOYW1lKHRpdGxlVGFnKSkKKyAgICAgICAgICAgIHN0YXRp
Y19jYXN0PEhUTUxUaXRsZUVsZW1lbnQqPihtX3RpdGxlRWxlbWVudC5nZXQoKSktPnNldFRleHQo
dGl0bGUpOworICAgIH0KK30KKwordm9pZCBEb2N1bWVudDo6c2V0VGl0bGVFbGVtZW50KGNvbnN0
IFN0cmluZ1dpdGhEaXJlY3Rpb24mIHRpdGxlLCBFbGVtZW50KiB0aXRsZUVsZW1lbnQpCit7Cisg
ICAgaWYgKHRpdGxlRWxlbWVudCAhPSBtX3RpdGxlRWxlbWVudCkgeworICAgICAgICBpZiAobV90
aXRsZUVsZW1lbnQgfHwgbV90aXRsZVNldEV4cGxpY2l0bHkpCisgICAgICAgICAgICAvLyBPbmx5
IGFsbG93IHRoZSBmaXJzdCB0aXRsZSBlbGVtZW50IHRvIGNoYW5nZSB0aGUgdGl0bGUgLS0gb3Ro
ZXJzIGhhdmUgbm8gZWZmZWN0LgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBtX3RpdGxl
RWxlbWVudCA9IHRpdGxlRWxlbWVudDsKKyAgICB9CisKKyAgICB1cGRhdGVUaXRsZSh0aXRsZSk7
Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnJlbW92ZVRpdGxlKEVsZW1lbnQqIHRpdGxlRWxlbWVudCkK
K3sKKyAgICBpZiAobV90aXRsZUVsZW1lbnQgIT0gdGl0bGVFbGVtZW50KQorICAgICAgICByZXR1
cm47CisKKyAgICBtX3RpdGxlRWxlbWVudCA9IDA7CisgICAgbV90aXRsZVNldEV4cGxpY2l0bHkg
PSBmYWxzZTsKKworICAgIC8vIFVwZGF0ZSB0aXRsZSBiYXNlZCBvbiBmaXJzdCB0aXRsZSBlbGVt
ZW50IGluIHRoZSBoZWFkLCBpZiBvbmUgZXhpc3RzLgorICAgIGlmIChIVE1MRWxlbWVudCogaGVh
ZEVsZW1lbnQgPSBoZWFkKCkpIHsKKyAgICAgICAgZm9yIChOb2RlKiBlID0gaGVhZEVsZW1lbnQt
PmZpcnN0Q2hpbGQoKTsgZTsgZSA9IGUtPm5leHRTaWJsaW5nKCkpCisgICAgICAgICAgICBpZiAo
ZS0+aGFzVGFnTmFtZSh0aXRsZVRhZykpIHsKKyAgICAgICAgICAgICAgICBIVE1MVGl0bGVFbGVt
ZW50KiB0aXRsZUVsZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MVGl0bGVFbGVtZW50Kj4oZSk7Cisg
ICAgICAgICAgICAgICAgc2V0VGl0bGVFbGVtZW50KHRpdGxlRWxlbWVudC0+dGV4dFdpdGhEaXJl
Y3Rpb24oKSwgdGl0bGVFbGVtZW50KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
ICAgIH0KKyAgICB9CisKKyAgICBpZiAoIW1fdGl0bGVFbGVtZW50KQorICAgICAgICB1cGRhdGVU
aXRsZShTdHJpbmdXaXRoRGlyZWN0aW9uKCkpOworfQorCisjaWYgRU5BQkxFKFBBR0VfVklTSUJJ
TElUWV9BUEkpCitQYWdlVmlzaWJpbGl0eVN0YXRlIERvY3VtZW50Ojp2aXNpYmlsaXR5U3RhdGUo
KSBjb25zdAoreworICAgIC8vIFRoZSB2aXNpYmlsaXR5IG9mIHRoZSBkb2N1bWVudCBpcyBpbmhl
cml0ZWQgZnJvbSB0aGUgdmlzaWJpbGl0eSBvZiB0aGUKKyAgICAvLyBwYWdlLiBJZiB0aGVyZSBp
cyBubyBwYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZG9jdW1lbnQsIHdlIHdpbGwgYXNzdW1lCisg
ICAgLy8gdGhhdCB0aGUgcGFnZSBpcyB2aXNpYmxlIGkuZS4gaW52aXNpYmlsaXR5IGhhcyB0byBi
ZSBleHBsaWNpdGx5CisgICAgLy8gc3BlY2lmaWVkIGJ5IHRoZSBlbWJlZGRlci4KKyAgICBpZiAo
IW1fZnJhbWUgfHwgIW1fZnJhbWUtPnBhZ2UoKSkKKyAgICAgICAgcmV0dXJuIFBhZ2VWaXNpYmls
aXR5U3RhdGVWaXNpYmxlOworICAgIHJldHVybiBtX2ZyYW1lLT5wYWdlKCktPnZpc2liaWxpdHlT
dGF0ZSgpOworfQorCitTdHJpbmcgRG9jdW1lbnQ6OndlYmtpdFZpc2liaWxpdHlTdGF0ZSgpIGNv
bnN0Cit7CisgICAgcmV0dXJuIHBhZ2VWaXNpYmlsaXR5U3RhdGVTdHJpbmcodmlzaWJpbGl0eVN0
YXRlKCkpOworfQorCitib29sIERvY3VtZW50Ojp3ZWJraXRIaWRkZW4oKSBjb25zdAoreworICAg
IHJldHVybiB2aXNpYmlsaXR5U3RhdGUoKSAhPSBQYWdlVmlzaWJpbGl0eVN0YXRlVmlzaWJsZTsK
K30KKwordm9pZCBEb2N1bWVudDo6ZGlzcGF0Y2hWaXNpYmlsaXR5U3RhdGVDaGFuZ2VFdmVudCgp
Cit7CisgICAgZGlzcGF0Y2hFdmVudChFdmVudDo6Y3JlYXRlKGV2ZW50TmFtZXMoKS53ZWJraXR2
aXNpYmlsaXR5Y2hhbmdlRXZlbnQsIGZhbHNlLCBmYWxzZSkpOworfQorI2VuZGlmCisKKyNpZiBF
TkFCTEUoQ1NQX05FWFQpCitET01TZWN1cml0eVBvbGljeSogRG9jdW1lbnQ6OnNlY3VyaXR5UG9s
aWN5KCkKK3sKKyAgICBpZiAoIW1fZG9tU2VjdXJpdHlQb2xpY3kpCisgICAgICAgIG1fZG9tU2Vj
dXJpdHlQb2xpY3kgPSBET01TZWN1cml0eVBvbGljeTo6Y3JlYXRlKHRoaXMpOworICAgIHJldHVy
biBtX2RvbVNlY3VyaXR5UG9saWN5LmdldCgpOworfQorI2VuZGlmCisKK1N0cmluZyBEb2N1bWVu
dDo6bm9kZU5hbWUoKSBjb25zdAoreworICAgIHJldHVybiAiI2RvY3VtZW50IjsKK30KKworTm9k
ZTo6Tm9kZVR5cGUgRG9jdW1lbnQ6Om5vZGVUeXBlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gRE9D
VU1FTlRfTk9ERTsKK30KKworRm9ybUNvbnRyb2xsZXIqIERvY3VtZW50Ojpmb3JtQ29udHJvbGxl
cigpCit7CisgICAgaWYgKCFtX2Zvcm1Db250cm9sbGVyKQorICAgICAgICBtX2Zvcm1Db250cm9s
bGVyID0gRm9ybUNvbnRyb2xsZXI6OmNyZWF0ZSgpOworICAgIHJldHVybiBtX2Zvcm1Db250cm9s
bGVyLmdldCgpOworfQorCitWZWN0b3I8U3RyaW5nPiBEb2N1bWVudDo6Zm9ybUVsZW1lbnRzU3Rh
dGUoKSBjb25zdAoreworICAgIGlmICghbV9mb3JtQ29udHJvbGxlcikKKyAgICAgICAgcmV0dXJu
IFZlY3RvcjxTdHJpbmc+KCk7CisgICAgcmV0dXJuIG1fZm9ybUNvbnRyb2xsZXItPmZvcm1FbGVt
ZW50c1N0YXRlKCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnNldFN0YXRlRm9yTmV3Rm9ybUVsZW1l
bnRzKGNvbnN0IFZlY3RvcjxTdHJpbmc+JiBzdGF0ZVZlY3RvcikKK3sKKyAgICBpZiAoIXN0YXRl
VmVjdG9yLnNpemUoKSAmJiAhbV9mb3JtQ29udHJvbGxlcikKKyAgICAgICAgcmV0dXJuOworICAg
IGZvcm1Db250cm9sbGVyKCktPnNldFN0YXRlRm9yTmV3Rm9ybUVsZW1lbnRzKHN0YXRlVmVjdG9y
KTsKK30KKworRnJhbWVWaWV3KiBEb2N1bWVudDo6dmlldygpIGNvbnN0Cit7CisgICAgcmV0dXJu
IG1fZnJhbWUgPyBtX2ZyYW1lLT52aWV3KCkgOiAwOworfQorCitQYWdlKiBEb2N1bWVudDo6cGFn
ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fZnJhbWUgPyBtX2ZyYW1lLT5wYWdlKCkgOiAwOyAg
ICAKK30KKworU2V0dGluZ3MqIERvY3VtZW50OjpzZXR0aW5ncygpIGNvbnN0Cit7CisgICAgcmV0
dXJuIG1fZnJhbWUgPyBtX2ZyYW1lLT5zZXR0aW5ncygpIDogMDsKK30KKworUGFzc1JlZlB0cjxS
YW5nZT4gRG9jdW1lbnQ6OmNyZWF0ZVJhbmdlKCkKK3sKKyAgICByZXR1cm4gUmFuZ2U6OmNyZWF0
ZSh0aGlzKTsKK30KKworUGFzc1JlZlB0cjxOb2RlSXRlcmF0b3I+IERvY3VtZW50OjpjcmVhdGVO
b2RlSXRlcmF0b3IoTm9kZSogcm9vdCwgdW5zaWduZWQgd2hhdFRvU2hvdywgCisgICAgUGFzc1Jl
ZlB0cjxOb2RlRmlsdGVyPiBmaWx0ZXIsIGJvb2wgZXhwYW5kRW50aXR5UmVmZXJlbmNlcywgRXhj
ZXB0aW9uQ29kZSYgZWMpCit7CisgICAgaWYgKCFyb290KSB7CisgICAgICAgIGVjID0gTk9UX1NV
UFBPUlRFRF9FUlI7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gTm9kZUl0
ZXJhdG9yOjpjcmVhdGUocm9vdCwgd2hhdFRvU2hvdywgZmlsdGVyLCBleHBhbmRFbnRpdHlSZWZl
cmVuY2VzKTsKK30KKworUGFzc1JlZlB0cjxUcmVlV2Fsa2VyPiBEb2N1bWVudDo6Y3JlYXRlVHJl
ZVdhbGtlcihOb2RlKiByb290LCB1bnNpZ25lZCB3aGF0VG9TaG93LCAKKyAgICBQYXNzUmVmUHRy
PE5vZGVGaWx0ZXI+IGZpbHRlciwgYm9vbCBleHBhbmRFbnRpdHlSZWZlcmVuY2VzLCBFeGNlcHRp
b25Db2RlJiBlYykKK3sKKyAgICBpZiAoIXJvb3QpIHsKKyAgICAgICAgZWMgPSBOT1RfU1VQUE9S
VEVEX0VSUjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBUcmVlV2Fsa2Vy
OjpjcmVhdGUocm9vdCwgd2hhdFRvU2hvdywgZmlsdGVyLCBleHBhbmRFbnRpdHlSZWZlcmVuY2Vz
KTsKK30KKwordm9pZCBEb2N1bWVudDo6c2NoZWR1bGVGb3JjZWRTdHlsZVJlY2FsYygpCit7Cisg
ICAgbV9wZW5kaW5nU3R5bGVSZWNhbGNTaG91bGRGb3JjZSA9IHRydWU7CisgICAgc2NoZWR1bGVT
dHlsZVJlY2FsYygpOworfQorCit2b2lkIERvY3VtZW50OjpzY2hlZHVsZVN0eWxlUmVjYWxjKCkK
K3sKKyAgICBpZiAoc2hvdWxkRGlzcGxheVNlYW1sZXNzbHlXaXRoUGFyZW50KCkpIHsKKyAgICAg
ICAgLy8gV2hlbiB3ZSdyZSBzZWFtbGVzcywgb3VyIHBhcmVudCBkb2N1bWVudCBtYW5hZ2VzIG91
ciBzdHlsZSByZWNhbGNzLgorICAgICAgICBvd25lckVsZW1lbnQoKS0+c2V0TmVlZHNTdHlsZVJl
Y2FsYygpOworICAgICAgICBvd25lckVsZW1lbnQoKS0+ZG9jdW1lbnQoKS0+c2NoZWR1bGVTdHls
ZVJlY2FsYygpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1fc3R5bGVSZWNh
bGNUaW1lci5pc0FjdGl2ZSgpIHx8IGluUGFnZUNhY2hlKCkpCisgICAgICAgIHJldHVybjsKKwor
ICAgIEFTU0VSVChjaGlsZE5lZWRzU3R5bGVSZWNhbGMoKSB8fCBtX3BlbmRpbmdTdHlsZVJlY2Fs
Y1Nob3VsZEZvcmNlKTsKKworICAgIGlmICghZG9jdW1lbnRzVGhhdE5lZWRTdHlsZVJlY2FsYykK
KyAgICAgICAgZG9jdW1lbnRzVGhhdE5lZWRTdHlsZVJlY2FsYyA9IG5ldyBIYXNoU2V0PERvY3Vt
ZW50Kj47CisgICAgZG9jdW1lbnRzVGhhdE5lZWRTdHlsZVJlY2FsYy0+YWRkKHRoaXMpOworICAg
IAorICAgIC8vIEZJWE1FOiBXaHkgb24gZWFydGggaXMgdGhpcyBoZXJlPyBUaGlzIGlzIGNsZWFy
bHkgbWlzcGxhY2VkLgorICAgIGludmFsaWRhdGVBY2Nlc3NLZXlNYXAoKTsKKyAgICAKKyAgICBt
X3N0eWxlUmVjYWxjVGltZXIuc3RhcnRPbmVTaG90KDApOworCisgICAgSW5zcGVjdG9ySW5zdHJ1
bWVudGF0aW9uOjpkaWRTY2hlZHVsZVN0eWxlUmVjYWxjdWxhdGlvbih0aGlzKTsKK30KKwordm9p
ZCBEb2N1bWVudDo6dW5zY2hlZHVsZVN0eWxlUmVjYWxjKCkKK3sKKyAgICBBU1NFUlQoIWNoaWxk
TmVlZHNTdHlsZVJlY2FsYygpKTsKKworICAgIGlmIChkb2N1bWVudHNUaGF0TmVlZFN0eWxlUmVj
YWxjKQorICAgICAgICBkb2N1bWVudHNUaGF0TmVlZFN0eWxlUmVjYWxjLT5yZW1vdmUodGhpcyk7
CisKKyAgICBtX3N0eWxlUmVjYWxjVGltZXIuc3RvcCgpOworICAgIG1fcGVuZGluZ1N0eWxlUmVj
YWxjU2hvdWxkRm9yY2UgPSBmYWxzZTsKK30KKworYm9vbCBEb2N1bWVudDo6aXNQZW5kaW5nU3R5
bGVSZWNhbGMoKSBjb25zdAoreworICAgIHJldHVybiBtX3N0eWxlUmVjYWxjVGltZXIuaXNBY3Rp
dmUoKSAmJiAhbV9pblN0eWxlUmVjYWxjOworfQorCit2b2lkIERvY3VtZW50OjpzdHlsZVJlY2Fs
Y1RpbWVyRmlyZWQoVGltZXI8RG9jdW1lbnQ+KikKK3sKKyAgICB1cGRhdGVTdHlsZUlmTmVlZGVk
KCk7Cit9CisKK2Jvb2wgRG9jdW1lbnQ6OmNoaWxkTmVlZHNBbmROb3RJblN0eWxlUmVjYWxjKCkK
K3sKKyAgICByZXR1cm4gY2hpbGROZWVkc1N0eWxlUmVjYWxjKCkgJiYgIW1faW5TdHlsZVJlY2Fs
YzsKK30KKwordm9pZCBEb2N1bWVudDo6cmVjYWxjU3R5bGUoU3R5bGVDaGFuZ2UgY2hhbmdlKQor
eworICAgIC8vIHdlIHNob3VsZCBub3QgZW50ZXIgc3R5bGUgcmVjYWxjIHdoaWxlIHBhaW50aW5n
CisgICAgQVNTRVJUKCF2aWV3KCkgfHwgIXZpZXcoKS0+aXNQYWludGluZygpKTsKKyAgICBpZiAo
dmlldygpICYmIHZpZXcoKS0+aXNQYWludGluZygpKQorICAgICAgICByZXR1cm47CisgICAgCisg
ICAgaWYgKG1faW5TdHlsZVJlY2FsYykKKyAgICAgICAgcmV0dXJuOyAvLyBHdWFyZCBhZ2FpbnN0
IHJlLWVudHJhbmN5LiAtZHdoCisKKyAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIHVwZGF0ZSBzdHls
ZSBvbiBvdXIgYW5jZXN0b3IgY2hhaW4gYmVmb3JlIHByb2NlZWRpbmcgKGVzcGVjaWFsbHkgZm9y
IHNlYW1sZXNzKSwKKyAgICAvLyBob3dldmVyIGRvaW5nIHNvIGN1cnJlbnRseSBjYXVzZXMgc2V2
ZXJhbCB0ZXN0cyB0byBjcmFzaCwgYXMgRnJhbWU6OnNldERvY3VtZW50IGNhbGxzIERvY3VtZW50
OjphdHRhY2gKKyAgICAvLyBiZWZvcmUgc2V0dGluZyB0aGUgRE9NV2luZG93IG9uIHRoZSBGcmFt
ZSwgb3IgdGhlIFNlY3VyaXR5T3JpZ2luIG9uIHRoZSBkb2N1bWVudC4gVGhlIGF0dGFjaCwgaW4g
dHVybgorICAgIC8vIHJlc29sdmVzIHN0eWxlIChoZXJlKSBhbmQgdGhlbiB3aGVuIHdlIHJlc29s
dmUgc3R5bGUgb24gdGhlIHBhcmVudCBjaGFpbiwgd2UgbWF5IGVuZCB1cAorICAgIC8vIHJlLWF0
dGFjaGluZyBvdXIgY29udGFpbmluZyBpZnJhbWUsIHdoaWNoIHdoZW4gYXNrZWQgSFRNTEZyYW1l
RWxlbWVudEJhc2U6OmlzVVJMQWxsb3dlZAorICAgIC8vIGhpdHMgYSBudWxsLWRlcmVmZXJlbmNl
IGR1ZSB0byBzZWN1cml0eSBjb2RlIGFsd2F5cyBhc3N1bWluZyB0aGUgZG9jdW1lbnQgaGFzIGEg
U2VjdXJpdHlPcmlnaW4uCisKKyAgICBpZiAobV9oYXNEaXJ0eVN0eWxlUmVzb2x2ZXIpCisgICAg
ICAgIHVwZGF0ZUFjdGl2ZVN0eWxlc2hlZXRzKFJlY2FsY1N0eWxlSW1tZWRpYXRlbHkpOworCisg
ICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2llIGNvb2tpZSA9IEluc3BlY3Rvckluc3Ry
dW1lbnRhdGlvbjo6d2lsbFJlY2FsY3VsYXRlU3R5bGUodGhpcyk7CisKKyAgICBpZiAobV9lbGVt
U2hlZXQgJiYgbV9lbGVtU2hlZXQtPmNvbnRlbnRzKCktPnVzZXNSZW1Vbml0cygpKQorICAgICAg
ICBtX3VzZXNSZW1Vbml0cyA9IHRydWU7CisKKyAgICBtX2luU3R5bGVSZWNhbGMgPSB0cnVlOwor
ICAgIHN1c3BlbmRQb3N0QXR0YWNoQ2FsbGJhY2tzKCk7CisgICAgeworICAgICAgICBXaWRnZXRI
aWVyYXJjaHlVcGRhdGVzU3VzcGVuc2lvblNjb3BlIHN1c3BlbmRXaWRnZXRIaWVyYXJjaHlVcGRh
dGVzOworCisgICAgICAgIFJlZlB0cjxGcmFtZVZpZXc+IGZyYW1lVmlldyA9IHZpZXcoKTsKKyAg
ICAgICAgaWYgKGZyYW1lVmlldykgeworICAgICAgICAgICAgZnJhbWVWaWV3LT5wYXVzZVNjaGVk
dWxlZEV2ZW50cygpOworICAgICAgICAgICAgZnJhbWVWaWV3LT5iZWdpbkRlZmVycmVkUmVwYWlu
dHMoKTsKKyAgICAgICAgfQorCisgICAgICAgIEFTU0VSVCghcmVuZGVyZXIoKSB8fCByZW5kZXJB
cmVuYSgpKTsKKyAgICAgICAgaWYgKCFyZW5kZXJlcigpIHx8ICFyZW5kZXJBcmVuYSgpKQorICAg
ICAgICAgICAgZ290byBiYWlsT3V0OworCisgICAgICAgIGlmIChtX3BlbmRpbmdTdHlsZVJlY2Fs
Y1Nob3VsZEZvcmNlKQorICAgICAgICAgICAgY2hhbmdlID0gRm9yY2U7CisKKyAgICAgICAgLy8g
UmVjYWxjdWxhdGluZyB0aGUgcm9vdCBzdHlsZSAob24gdGhlIGRvY3VtZW50KSBpcyBub3QgbmVl
ZGVkIGluIHRoZSBjb21tb24gY2FzZS4KKyAgICAgICAgaWYgKChjaGFuZ2UgPT0gRm9yY2UpIHx8
IChzaG91bGREaXNwbGF5U2VhbWxlc3NseVdpdGhQYXJlbnQoKSAmJiAoY2hhbmdlID49IEluaGVy
aXQpKSkgeworICAgICAgICAgICAgLy8gc3R5bGUgc2VsZWN0b3IgbWF5IHNldCB0aGlzIGFnYWlu
IGR1cmluZyByZWNhbGMKKyAgICAgICAgICAgIG1faGFzTm9kZXNXaXRoUGxhY2Vob2xkZXJTdHls
ZSA9IGZhbHNlOworICAgICAgICAgICAgCisgICAgICAgICAgICBSZWZQdHI8UmVuZGVyU3R5bGU+
IGRvY3VtZW50U3R5bGUgPSBTdHlsZVJlc29sdmVyOjpzdHlsZUZvckRvY3VtZW50KHRoaXMsIG1f
c3R5bGVSZXNvbHZlciA/IG1fc3R5bGVSZXNvbHZlci0+Zm9udFNlbGVjdG9yKCkgOiAwKTsKKyAg
ICAgICAgICAgIFN0eWxlQ2hhbmdlIGNoID0gTm9kZTo6ZGlmZihkb2N1bWVudFN0eWxlLmdldCgp
LCByZW5kZXJlcigpLT5zdHlsZSgpLCB0aGlzKTsKKyAgICAgICAgICAgIGlmIChjaCAhPSBOb0No
YW5nZSkKKyAgICAgICAgICAgICAgICByZW5kZXJlcigpLT5zZXRTdHlsZShkb2N1bWVudFN0eWxl
LnJlbGVhc2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKE5vZGUqIG4gPSBmaXJzdENo
aWxkKCk7IG47IG4gPSBuLT5uZXh0U2libGluZygpKSB7CisgICAgICAgICAgICBpZiAoIW4tPmlz
RWxlbWVudE5vZGUoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIEVs
ZW1lbnQqIGVsZW1lbnQgPSBzdGF0aWNfY2FzdDxFbGVtZW50Kj4obik7CisgICAgICAgICAgICBp
ZiAoY2hhbmdlID49IEluaGVyaXQgfHwgZWxlbWVudC0+Y2hpbGROZWVkc1N0eWxlUmVjYWxjKCkg
fHwgZWxlbWVudC0+bmVlZHNTdHlsZVJlY2FsYygpKQorICAgICAgICAgICAgICAgIGVsZW1lbnQt
PnJlY2FsY1N0eWxlKGNoYW5nZSk7CisgICAgICAgIH0KKworICAgICNpZiBVU0UoQUNDRUxFUkFU
RURfQ09NUE9TSVRJTkcpCisgICAgICAgIGlmICh2aWV3KCkpIHsKKyAgICAgICAgICAgIGJvb2wg
bGF5b3V0UGVuZGluZyA9IHZpZXcoKS0+bGF5b3V0UGVuZGluZygpIHx8IHJlbmRlcmVyKCktPm5l
ZWRzTGF5b3V0KCk7CisgICAgICAgICAgICAvLyBJZiB3ZSBkaWRuJ3QgdXBkYXRlIGNvbXBvc2l0
aW5nIGxheWVycyBiZWNhdXNlIG9mIGxheW91dCgpLCB3ZSBuZWVkIHRvIGRvIHNvIGhlcmUuCisg
ICAgICAgICAgICBpZiAoIWxheW91dFBlbmRpbmcpCisgICAgICAgICAgICAgICAgdmlldygpLT51
cGRhdGVDb21wb3NpdGluZ0xheWVyc0FmdGVyU3R5bGVDaGFuZ2UoKTsKKyAgICAgICAgfQorICAg
ICNlbmRpZgorCisgICAgYmFpbE91dDoKKyAgICAgICAgY2xlYXJOZWVkc1N0eWxlUmVjYWxjKCk7
CisgICAgICAgIGNsZWFyQ2hpbGROZWVkc1N0eWxlUmVjYWxjKCk7CisgICAgICAgIHVuc2NoZWR1
bGVTdHlsZVJlY2FsYygpOworCisgICAgICAgIG1faW5TdHlsZVJlY2FsYyA9IGZhbHNlOworCisg
ICAgICAgIC8vIFBzZXVkbyBlbGVtZW50IHJlbW92YWwgYW5kIHNpbWlsYXIgbWF5IG9ubHkgd29y
ayB3aXRoIHRoZXNlIGZsYWdzIHN0aWxsIHNldC4gUmVzZXQgdGhlbSBhZnRlciB0aGUgc3R5bGUg
cmVjYWxjLgorICAgICAgICBpZiAobV9zdHlsZVJlc29sdmVyKQorICAgICAgICAgICAgcmVzZXRD
U1NGZWF0dXJlRmxhZ3MoKTsKKworICAgICAgICBpZiAoZnJhbWVWaWV3KSB7CisgICAgICAgICAg
ICBmcmFtZVZpZXctPnJlc3VtZVNjaGVkdWxlZEV2ZW50cygpOworICAgICAgICAgICAgZnJhbWVW
aWV3LT5lbmREZWZlcnJlZFJlcGFpbnRzKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmVzdW1l
UG9zdEF0dGFjaENhbGxiYWNrcygpOworCisgICAgLy8gSWYgd2Ugd2FudGVkIHRvIGNhbGwgaW1w
bGljaXRDbG9zZSgpIGR1cmluZyByZWNhbGNTdHlsZSwgZG8gc28gbm93IHRoYXQgd2UncmUgZmlu
aXNoZWQuCisgICAgaWYgKG1fY2xvc2VBZnRlclN0eWxlUmVjYWxjKSB7CisgICAgICAgIG1fY2xv
c2VBZnRlclN0eWxlUmVjYWxjID0gZmFsc2U7CisgICAgICAgIGltcGxpY2l0Q2xvc2UoKTsKKyAg
ICB9CisKKyAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZFJlY2FsY3VsYXRlU3R5bGUo
Y29va2llKTsKK30KKwordm9pZCBEb2N1bWVudDo6dXBkYXRlU3R5bGVJZk5lZWRlZCgpCit7Cisg
ICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKyAgICBBU1NFUlQoIXZpZXcoKSB8fCAoIXZpZXco
KS0+aXNJbkxheW91dCgpICYmICF2aWV3KCktPmlzUGFpbnRpbmcoKSkpOworICAgIAorICAgIGlm
ICgoIW1fcGVuZGluZ1N0eWxlUmVjYWxjU2hvdWxkRm9yY2UgJiYgIWNoaWxkTmVlZHNTdHlsZVJl
Y2FsYygpKSB8fCBpblBhZ2VDYWNoZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBBbmltYXRp
b25VcGRhdGVCbG9jayBhbmltYXRpb25VcGRhdGVCbG9jayhtX2ZyYW1lID8gbV9mcmFtZS0+YW5p
bWF0aW9uKCkgOiAwKTsKKyAgICByZWNhbGNTdHlsZShOb0NoYW5nZSk7Cit9CisKK3ZvaWQgRG9j
dW1lbnQ6OnVwZGF0ZVN0eWxlRm9yQWxsRG9jdW1lbnRzKCkKK3sKKyAgICBBU1NFUlQoaXNNYWlu
VGhyZWFkKCkpOworICAgIGlmICghZG9jdW1lbnRzVGhhdE5lZWRTdHlsZVJlY2FsYykKKyAgICAg
ICAgcmV0dXJuOworCisgICAgd2hpbGUgKGRvY3VtZW50c1RoYXROZWVkU3R5bGVSZWNhbGMtPnNp
emUoKSkgeworICAgICAgICBIYXNoU2V0PERvY3VtZW50Kj46Oml0ZXJhdG9yIGl0ID0gZG9jdW1l
bnRzVGhhdE5lZWRTdHlsZVJlY2FsYy0+YmVnaW4oKTsKKyAgICAgICAgRG9jdW1lbnQqIGRvYyA9
ICppdDsKKyAgICAgICAgZG9jdW1lbnRzVGhhdE5lZWRTdHlsZVJlY2FsYy0+cmVtb3ZlKGRvYyk7
CisgICAgICAgIGRvYy0+dXBkYXRlU3R5bGVJZk5lZWRlZCgpOworICAgIH0KK30KKwordm9pZCBE
b2N1bWVudDo6dXBkYXRlTGF5b3V0KCkKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOwor
ICAgIGlmIChFbGVtZW50KiBvZSA9IG93bmVyRWxlbWVudCgpKQorICAgICAgICBvZS0+ZG9jdW1l
bnQoKS0+dXBkYXRlTGF5b3V0KCk7CisKKyAgICB1cGRhdGVTdHlsZUlmTmVlZGVkKCk7CisKKyAg
ICAvLyBPbmx5IGRvIGEgbGF5b3V0IGlmIGNoYW5nZXMgaGF2ZSBvY2N1cnJlZCB0aGF0IG1ha2Ug
aXQgbmVjZXNzYXJ5LiAgICAgIAorICAgIEZyYW1lVmlldyogdiA9IHZpZXcoKTsKKyAgICBpZiAo
diAmJiByZW5kZXJlcigpICYmICh2LT5sYXlvdXRQZW5kaW5nKCkgfHwgcmVuZGVyZXIoKS0+bmVl
ZHNMYXlvdXQoKSkpCisgICAgICAgIHYtPmxheW91dCgpOworfQorCisvLyBGSVhNRTogVGhpcyBp
cyBhIGJhZCBpZGVhIGFuZCBuZWVkcyB0byBiZSByZW1vdmVkIGV2ZW50dWFsbHkuCisvLyBPdGhl
ciBicm93c2VycyBsb2FkIHN0eWxlc2hlZXRzIGJlZm9yZSB0aGV5IGNvbnRpbnVlIHBhcnNpbmcg
dGhlIHdlYiBwYWdlLgorLy8gU2luY2Ugd2UgZG9uJ3QsIHdlIGNhbiBydW4gSmF2YVNjcmlwdCBj
b2RlIHRoYXQgbmVlZHMgYW5zd2VycyBiZWZvcmUgdGhlCisvLyBzdHlsZXNoZWV0cyBhcmUgbG9h
ZGVkLiBEb2luZyBhIGxheW91dCBpZ25vcmluZyB0aGUgcGVuZGluZyBzdHlsZXNoZWV0cworLy8g
bGV0cyB1cyBnZXQgcmVhc29uYWJsZSBhbnN3ZXJzLiBUaGUgbG9uZyB0ZXJtIHNvbHV0aW9uIHRv
IHRoaXMgcHJvYmxlbSBpcworLy8gdG8gaW5zdGVhZCBzdXNwZW5kIEphdmFTY3JpcHQgZXhlY3V0
aW9uLgordm9pZCBEb2N1bWVudDo6dXBkYXRlTGF5b3V0SWdub3JlUGVuZGluZ1N0eWxlc2hlZXRz
KCkKK3sKKyAgICBib29sIG9sZElnbm9yZSA9IG1faWdub3JlUGVuZGluZ1N0eWxlc2hlZXRzOwor
ICAgIAorICAgIGlmICghaGF2ZVN0eWxlc2hlZXRzTG9hZGVkKCkpIHsKKyAgICAgICAgbV9pZ25v
cmVQZW5kaW5nU3R5bGVzaGVldHMgPSB0cnVlOworICAgICAgICAvLyBGSVhNRTogV2UgYXJlIHdp
bGxpbmcgdG8gYXR0ZW1wdCB0byBzdXBwcmVzcyBwYWludGluZyB3aXRoIG91dGRhdGVkIHN0eWxl
IGluZm8gb25seSBvbmNlLiAgT3VyIGFzc3VtcHRpb24gaXMgdGhhdCBpdCB3b3VsZCBiZQorICAg
ICAgICAvLyBkYW5nZXJvdXMgdG8gdHJ5IHRvIHN0b3AgaXQgYSBzZWNvbmQgdGltZSwgYWZ0ZXIg
cGFnZSBjb250ZW50IGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkIGFuZCBkaXNwbGF5ZWQKKyAgICAg
ICAgLy8gd2l0aCBhY2N1cmF0ZSBzdHlsZSBpbmZvcm1hdGlvbi4gIChPdXIgc3VwcHJlc3Npb24g
aW52b2x2ZXMgYmxhbmtpbmcgdGhlIHdob2xlIHBhZ2UgYXQgdGhlCisgICAgICAgIC8vIG1vbWVu
dC4gIElmIGl0IHdlcmUgbW9yZSByZWZpbmVkLCB3ZSBtaWdodCBiZSBhYmxlIHRvIGRvIHNvbWV0
aGluZyBiZXR0ZXIuKQorICAgICAgICAvLyBJdCdzIHdvcnRoIG5vdGluZyB0aG91Z2ggdGhhdCB0
aGlzIGVudGlyZSBtZXRob2QgaXMgYSBoYWNrLCBzaW5jZSB3aGF0IHdlIHJlYWxseSB3YW50IHRv
IGRvIGlzCisgICAgICAgIC8vIHN1c3BlbmQgSlMgaW5zdGVhZCBvZiBkb2luZyBhIGxheW91dCB3
aXRoIGluYWNjdXJhdGUgaW5mb3JtYXRpb24uCisgICAgICAgIEhUTUxFbGVtZW50KiBib2R5RWxl
bWVudCA9IGJvZHkoKTsKKyAgICAgICAgaWYgKGJvZHlFbGVtZW50ICYmICFib2R5RWxlbWVudC0+
cmVuZGVyZXIoKSAmJiBtX3BlbmRpbmdTaGVldExheW91dCA9PSBOb0xheW91dFdpdGhQZW5kaW5n
U2hlZXRzKSB7CisgICAgICAgICAgICBtX3BlbmRpbmdTaGVldExheW91dCA9IERpZExheW91dFdp
dGhQZW5kaW5nU2hlZXRzOworICAgICAgICAgICAgc3R5bGVSZXNvbHZlckNoYW5nZWQoUmVjYWxj
U3R5bGVJbW1lZGlhdGVseSk7CisgICAgICAgIH0gZWxzZSBpZiAobV9oYXNOb2Rlc1dpdGhQbGFj
ZWhvbGRlclN0eWxlKQorICAgICAgICAgICAgLy8gSWYgbmV3IG5vZGVzIGhhdmUgYmVlbiBhZGRl
ZCBvciBzdHlsZSByZWNhbGMgaGFzIGJlZW4gZG9uZSB3aXRoIHN0eWxlIHNoZWV0cyBzdGlsbCBw
ZW5kaW5nLCBzb21lIG5vZGVzIAorICAgICAgICAgICAgLy8gbWF5IG5vdCBoYXZlIGhhZCB0aGVp
ciByZWFsIHN0eWxlIGNhbGN1bGF0ZWQgeWV0LiBOb3JtYWxseSB0aGlzIGdldHMgY2xlYW5lZCB3
aGVuIHN0eWxlIHNoZWV0cyBhcnJpdmUgCisgICAgICAgICAgICAvLyBidXQgaGVyZSB3ZSBuZWVk
IHVwLXRvLWRhdGUgc3R5bGUgaW1tZWRpYXRlbHkuCisgICAgICAgICAgICByZWNhbGNTdHlsZShG
b3JjZSk7CisgICAgfQorCisgICAgdXBkYXRlTGF5b3V0KCk7CisKKyAgICBtX2lnbm9yZVBlbmRp
bmdTdHlsZXNoZWV0cyA9IG9sZElnbm9yZTsKK30KKworUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4g
RG9jdW1lbnQ6OnN0eWxlRm9yRWxlbWVudElnbm9yaW5nUGVuZGluZ1N0eWxlc2hlZXRzKEVsZW1l
bnQqIGVsZW1lbnQpCit7CisgICAgQVNTRVJUX0FSRyhlbGVtZW50LCBlbGVtZW50LT5kb2N1bWVu
dCgpID09IHRoaXMpOworCisgICAgYm9vbCBvbGRJZ25vcmUgPSBtX2lnbm9yZVBlbmRpbmdTdHls
ZXNoZWV0czsKKyAgICBtX2lnbm9yZVBlbmRpbmdTdHlsZXNoZWV0cyA9IHRydWU7CisgICAgUmVm
UHRyPFJlbmRlclN0eWxlPiBzdHlsZSA9IHN0eWxlUmVzb2x2ZXIoKS0+c3R5bGVGb3JFbGVtZW50
KGVsZW1lbnQsIGVsZW1lbnQtPnBhcmVudE5vZGUoKSA/IGVsZW1lbnQtPnBhcmVudE5vZGUoKS0+
Y29tcHV0ZWRTdHlsZSgpIDogMCk7CisgICAgbV9pZ25vcmVQZW5kaW5nU3R5bGVzaGVldHMgPSBv
bGRJZ25vcmU7CisgICAgcmV0dXJuIHN0eWxlLnJlbGVhc2UoKTsKK30KKworUGFzc1JlZlB0cjxS
ZW5kZXJTdHlsZT4gRG9jdW1lbnQ6OnN0eWxlRm9yUGFnZShpbnQgcGFnZUluZGV4KQoreworICAg
IFJlZlB0cjxSZW5kZXJTdHlsZT4gc3R5bGUgPSBzdHlsZVJlc29sdmVyKCktPnN0eWxlRm9yUGFn
ZShwYWdlSW5kZXgpOworICAgIHJldHVybiBzdHlsZS5yZWxlYXNlKCk7Cit9CisKK3ZvaWQgRG9j
dW1lbnQ6OnJlZ2lzdGVyQ3VzdG9tRm9udChQYXNzT3duUHRyPEZvbnREYXRhPiBmb250RGF0YSkK
K3sKKyAgICBtX2N1c3RvbUZvbnRzLmFwcGVuZChmb250RGF0YSk7Cit9CisKK3ZvaWQgRG9jdW1l
bnQ6OmRlbGV0ZUN1c3RvbUZvbnRzKCkKK3sKKyAgICBzaXplX3Qgc2l6ZSA9IG1fY3VzdG9tRm9u
dHMuc2l6ZSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKQorICAgICAg
ICBHbHlwaFBhZ2VUcmVlTm9kZTo6cHJ1bmVUcmVlQ3VzdG9tRm9udERhdGEobV9jdXN0b21Gb250
c1tpXS5nZXQoKSk7CisKKyAgICBtX2N1c3RvbUZvbnRzLmNsZWFyKCk7Cit9CisKK2Jvb2wgRG9j
dW1lbnQ6OmlzUGFnZUJveFZpc2libGUoaW50IHBhZ2VJbmRleCkKK3sKKyAgICBSZWZQdHI8UmVu
ZGVyU3R5bGU+IHN0eWxlID0gc3R5bGVGb3JQYWdlKHBhZ2VJbmRleCk7CisgICAgcmV0dXJuIHN0
eWxlLT52aXNpYmlsaXR5KCkgIT0gSElEREVOOyAvLyBkaXNwbGF5IHByb3BlcnR5IGRvZXNuJ3Qg
YXBwbHkgdG8gQHBhZ2UuCit9CisKK3ZvaWQgRG9jdW1lbnQ6OnBhZ2VTaXplQW5kTWFyZ2luc0lu
UGl4ZWxzKGludCBwYWdlSW5kZXgsIEludFNpemUmIHBhZ2VTaXplLCBpbnQmIG1hcmdpblRvcCwg
aW50JiBtYXJnaW5SaWdodCwgaW50JiBtYXJnaW5Cb3R0b20sIGludCYgbWFyZ2luTGVmdCkKK3sK
KyAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IHN0eWxlID0gc3R5bGVGb3JQYWdlKHBhZ2VJbmRleCk7
CisgICAgUmVuZGVyVmlldyogdmlldyA9IHJlbmRlclZpZXcoKTsKKworICAgIGludCB3aWR0aCA9
IHBhZ2VTaXplLndpZHRoKCk7CisgICAgaW50IGhlaWdodCA9IHBhZ2VTaXplLmhlaWdodCgpOwor
ICAgIHN3aXRjaCAoc3R5bGUtPnBhZ2VTaXplVHlwZSgpKSB7CisgICAgY2FzZSBQQUdFX1NJWkVf
QVVUTzoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQQUdFX1NJWkVfQVVUT19MQU5EU0NBUEU6
CisgICAgICAgIGlmICh3aWR0aCA8IGhlaWdodCkKKyAgICAgICAgICAgIHN0ZDo6c3dhcCh3aWR0
aCwgaGVpZ2h0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQQUdFX1NJWkVfQVVUT19QT1JU
UkFJVDoKKyAgICAgICAgaWYgKHdpZHRoID4gaGVpZ2h0KQorICAgICAgICAgICAgc3RkOjpzd2Fw
KHdpZHRoLCBoZWlnaHQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBBR0VfU0laRV9SRVNP
TFZFRDogeworICAgICAgICBMZW5ndGhTaXplIHNpemUgPSBzdHlsZS0+cGFnZVNpemUoKTsKKyAg
ICAgICAgQVNTRVJUKHNpemUud2lkdGgoKS5pc0ZpeGVkKCkpOworICAgICAgICBBU1NFUlQoc2l6
ZS5oZWlnaHQoKS5pc0ZpeGVkKCkpOworICAgICAgICB3aWR0aCA9IHZhbHVlRm9yTGVuZ3RoKHNp
emUud2lkdGgoKSwgMCwgdmlldyk7CisgICAgICAgIGhlaWdodCA9IHZhbHVlRm9yTGVuZ3RoKHNp
emUuaGVpZ2h0KCksIDAsIHZpZXcpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVs
dDoKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgfQorICAgIHBhZ2VTaXplID0g
SW50U2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKworICAgIC8vIFRoZSBwZXJjZW50YWdlIGlzIGNhbGN1
bGF0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSB3aWR0aCBldmVuIGZvciBtYXJnaW4gdG9wIGFuZCBi
b3R0b20uCisgICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvQ1NTMi9ib3guaHRtbCNtYXJnaW4t
cHJvcGVydGllcworICAgIG1hcmdpblRvcCA9IHN0eWxlLT5tYXJnaW5Ub3AoKS5pc0F1dG8oKSA/
IG1hcmdpblRvcCA6IGludFZhbHVlRm9yTGVuZ3RoKHN0eWxlLT5tYXJnaW5Ub3AoKSwgd2lkdGgs
IHZpZXcpOworICAgIG1hcmdpblJpZ2h0ID0gc3R5bGUtPm1hcmdpblJpZ2h0KCkuaXNBdXRvKCkg
PyBtYXJnaW5SaWdodCA6IGludFZhbHVlRm9yTGVuZ3RoKHN0eWxlLT5tYXJnaW5SaWdodCgpLCB3
aWR0aCwgdmlldyk7CisgICAgbWFyZ2luQm90dG9tID0gc3R5bGUtPm1hcmdpbkJvdHRvbSgpLmlz
QXV0bygpID8gbWFyZ2luQm90dG9tIDogaW50VmFsdWVGb3JMZW5ndGgoc3R5bGUtPm1hcmdpbkJv
dHRvbSgpLCB3aWR0aCwgdmlldyk7CisgICAgbWFyZ2luTGVmdCA9IHN0eWxlLT5tYXJnaW5MZWZ0
KCkuaXNBdXRvKCkgPyBtYXJnaW5MZWZ0IDogaW50VmFsdWVGb3JMZW5ndGgoc3R5bGUtPm1hcmdp
bkxlZnQoKSwgd2lkdGgsIHZpZXcpOworfQorCit2b2lkIERvY3VtZW50OjpzZXREb2N1bWVudFJh
cmVEYXRhKE5vZGVSYXJlRGF0YSogcmFyZURhdGEpCit7CisgICAgbV9kb2N1bWVudFJhcmVEYXRh
ID0gcmFyZURhdGE7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnNldElzVmlld1NvdXJjZShib29sIGlz
Vmlld1NvdXJjZSkKK3sKKyAgICBtX2lzVmlld1NvdXJjZSA9IGlzVmlld1NvdXJjZTsKKyAgICBp
ZiAoIW1faXNWaWV3U291cmNlKQorICAgICAgICByZXR1cm47CisKKyAgICBzZXRTZWN1cml0eU9y
aWdpbihTZWN1cml0eU9yaWdpbjo6Y3JlYXRlVW5pcXVlKCkpOworICAgIGRpZFVwZGF0ZVNlY3Vy
aXR5T3JpZ2luKCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmNvbWJpbmVDU1NGZWF0dXJlRmxhZ3Mo
KQoreworICAgIC8vIERlbGF5IHJlc2V0dGluZyB0aGUgZmxhZ3MgdW50aWwgYWZ0ZXIgbmV4dCBz
dHlsZSByZWNhbGMgc2luY2UgdW5hcHBseWluZyB0aGUgc3R5bGUgbWF5IG5vdCB3b3JrIHdpdGhv
dXQgdGhlc2Ugc2V0ICh0aGlzIGlzIHRydWUgYXQgbGVhc3Qgd2l0aCBiZWZvcmUvYWZ0ZXIpLgor
ICAgIG1fdXNlc1NpYmxpbmdSdWxlcyA9IG1fdXNlc1NpYmxpbmdSdWxlcyB8fCBtX3N0eWxlUmVz
b2x2ZXItPnVzZXNTaWJsaW5nUnVsZXMoKTsKKyAgICBtX3VzZXNGaXJzdExpbmVSdWxlcyA9IG1f
dXNlc0ZpcnN0TGluZVJ1bGVzIHx8IG1fc3R5bGVSZXNvbHZlci0+dXNlc0ZpcnN0TGluZVJ1bGVz
KCk7CisgICAgbV91c2VzQmVmb3JlQWZ0ZXJSdWxlcyA9IG1fdXNlc0JlZm9yZUFmdGVyUnVsZXMg
fHwgbV9zdHlsZVJlc29sdmVyLT51c2VzQmVmb3JlQWZ0ZXJSdWxlcygpOworICAgIG1fdXNlc0xp
bmtSdWxlcyA9IG1fdXNlc0xpbmtSdWxlcyB8fCBtX3N0eWxlUmVzb2x2ZXItPnVzZXNMaW5rUnVs
ZXMoKTsKK30KKwordm9pZCBEb2N1bWVudDo6cmVzZXRDU1NGZWF0dXJlRmxhZ3MoKQoreworICAg
IG1fdXNlc1NpYmxpbmdSdWxlcyA9IG1fc3R5bGVSZXNvbHZlci0+dXNlc1NpYmxpbmdSdWxlcygp
OworICAgIG1fdXNlc0ZpcnN0TGluZVJ1bGVzID0gbV9zdHlsZVJlc29sdmVyLT51c2VzRmlyc3RM
aW5lUnVsZXMoKTsKKyAgICBtX3VzZXNCZWZvcmVBZnRlclJ1bGVzID0gbV9zdHlsZVJlc29sdmVy
LT51c2VzQmVmb3JlQWZ0ZXJSdWxlcygpOworICAgIG1fdXNlc0xpbmtSdWxlcyA9IG1fc3R5bGVS
ZXNvbHZlci0+dXNlc0xpbmtSdWxlcygpOworfQorCit2b2lkIERvY3VtZW50OjpjcmVhdGVTdHls
ZVJlc29sdmVyKCkKK3sKKyAgICBib29sIG1hdGNoQXV0aG9yQW5kVXNlclN0eWxlcyA9IHRydWU7
CisgICAgaWYgKFNldHRpbmdzKiBkb2NTZXR0aW5ncyA9IHNldHRpbmdzKCkpCisgICAgICAgIG1h
dGNoQXV0aG9yQW5kVXNlclN0eWxlcyA9IGRvY1NldHRpbmdzLT5hdXRob3JBbmRVc2VyU3R5bGVz
RW5hYmxlZCgpOworICAgIG1fc3R5bGVSZXNvbHZlciA9IGFkb3B0UHRyKG5ldyBTdHlsZVJlc29s
dmVyKHRoaXMsIG1hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykpOworICAgIGNvbWJpbmVDU1NGZWF0
dXJlRmxhZ3MoKTsKK30KKworaW5saW5lIHZvaWQgRG9jdW1lbnQ6OmNsZWFyU3R5bGVSZXNvbHZl
cigpCit7CisgICAgbV9zdHlsZVJlc29sdmVyLmNsZWFyKCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6
OmF0dGFjaCgpCit7CisgICAgQVNTRVJUKCFhdHRhY2hlZCgpKTsKKyAgICBBU1NFUlQoIW1faW5Q
YWdlQ2FjaGUpOworICAgIEFTU0VSVCghbV9heE9iamVjdENhY2hlIHx8IHRoaXMgIT0gdG9wRG9j
dW1lbnQoKSk7CisKKyAgICBpZiAoIW1fcmVuZGVyQXJlbmEpCisgICAgICAgIG1fcmVuZGVyQXJl
bmEgPSBhZG9wdFB0cihuZXcgUmVuZGVyQXJlbmEpOworICAgIAorICAgIC8vIENyZWF0ZSB0aGUg
cmVuZGVyaW5nIHRyZWUKKyAgICBzZXRSZW5kZXJlcihuZXcgKG1fcmVuZGVyQXJlbmEuZ2V0KCkp
IFJlbmRlclZpZXcodGhpcywgdmlldygpKSk7CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lU
SU5HKQorICAgIHJlbmRlclZpZXcoKS0+ZGlkTW92ZU9uc2NyZWVuKCk7CisjZW5kaWYKKworICAg
IHJlY2FsY1N0eWxlKEZvcmNlKTsKKworICAgIFJlbmRlck9iamVjdCogcmVuZGVyID0gcmVuZGVy
ZXIoKTsKKyAgICBzZXRSZW5kZXJlcigwKTsKKworICAgIENvbnRhaW5lck5vZGU6OmF0dGFjaCgp
OworCisgICAgc2V0UmVuZGVyZXIocmVuZGVyKTsKK30KKwordm9pZCBEb2N1bWVudDo6ZGV0YWNo
KCkKK3sKKyAgICBBU1NFUlQoYXR0YWNoZWQoKSk7CisgICAgQVNTRVJUKCFtX2luUGFnZUNhY2hl
KTsKKworI2lmIEVOQUJMRShQT0lOVEVSX0xPQ0spCisgICAgaWYgKHBhZ2UoKSkKKyAgICAgICAg
cGFnZSgpLT5wb2ludGVyTG9ja0NvbnRyb2xsZXIoKS0+ZG9jdW1lbnREZXRhY2hlZCh0aGlzKTsK
KyNlbmRpZgorCisgICAgaWYgKHRoaXMgPT0gdG9wRG9jdW1lbnQoKSkKKyAgICAgICAgY2xlYXJB
WE9iamVjdENhY2hlKCk7CisKKyAgICBzdG9wQWN0aXZlRE9NT2JqZWN0cygpOworICAgIG1fZXZl
bnRRdWV1ZS0+Y2xvc2UoKTsKKyNpZiBFTkFCTEUoRlVMTFNDUkVFTl9BUEkpCisgICAgbV9mdWxs
U2NyZWVuQ2hhbmdlRXZlbnRUYXJnZXRRdWV1ZS5jbGVhcigpOworICAgIG1fZnVsbFNjcmVlbkVy
cm9yRXZlbnRUYXJnZXRRdWV1ZS5jbGVhcigpOworI2VuZGlmCisKKyNpZiBFTkFCTEUoUkVRVUVT
VF9BTklNQVRJT05fRlJBTUUpCisgICAgLy8gRklYTUU6IGNvbnNpZGVyIHVzaW5nIEFjdGl2ZURP
TU9iamVjdC4KKyAgICBpZiAobV9zY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXIpCisgICAgICAg
IG1fc2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyLT5jbGVhckRvY3VtZW50UG9pbnRlcigpOwor
ICAgIG1fc2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyLmNsZWFyKCk7CisjZW5kaWYKKworICAg
IFJlbmRlck9iamVjdCogcmVuZGVyID0gcmVuZGVyZXIoKTsKKworICAgIGRvY3VtZW50V2lsbEJl
Y29tZUluYWN0aXZlKCk7CisKKyNpZiBFTkFCTEUoU0hBUkVEX1dPUktFUlMpCisgICAgU2hhcmVk
V29ya2VyUmVwb3NpdG9yeTo6ZG9jdW1lbnREZXRhY2hlZCh0aGlzKTsKKyNlbmRpZgorCisgICAg
aWYgKG1fZnJhbWUpIHsKKyAgICAgICAgRnJhbWVWaWV3KiB2aWV3ID0gbV9mcmFtZS0+dmlldygp
OworICAgICAgICBpZiAodmlldykKKyAgICAgICAgICAgIHZpZXctPmRldGFjaEN1c3RvbVNjcm9s
bGJhcnMoKTsKKworICAgIH0KKworICAgIC8vIGluZGljYXRlIGRlc3RydWN0aW9uIG1vZGUsICBp
LmUuIGF0dGFjaGVkKCkgYnV0IHJlbmRlcmVyID09IDAKKyAgICBzZXRSZW5kZXJlcigwKTsKKyAg
ICAKKyNpZiBFTkFCTEUoRlVMTFNDUkVFTl9BUEkpCisgICAgaWYgKG1fZnVsbFNjcmVlblJlbmRl
cmVyKQorICAgICAgICBzZXRGdWxsU2NyZWVuUmVuZGVyZXIoMCk7CisjZW5kaWYKKworICAgIG1f
aG92ZXJOb2RlID0gMDsKKyAgICBtX2ZvY3VzZWROb2RlID0gMDsKKyAgICBtX2FjdGl2ZU5vZGUg
PSAwOworCisgICAgQ29udGFpbmVyTm9kZTo6ZGV0YWNoKCk7CisKKyAgICB1bnNjaGVkdWxlU3R5
bGVSZWNhbGMoKTsKKworICAgIGlmIChyZW5kZXIpCisgICAgICAgIHJlbmRlci0+ZGVzdHJveSgp
OworCisgICAgLy8gVGhpcyBpcyByZXF1aXJlZCwgYXMgb3VyIEZyYW1lIG1pZ2h0IGRlbGV0ZSBp
dHNlbGYgYXMgc29vbiBhcyBpdCBkZXRhY2hlcworICAgIC8vIHVzLiBIb3dldmVyLCB0aGlzIHZp
b2xhdGVzIE5vZGU6OmRldGFjaCgpIHNlbWFudGljcywgYXMgaXQncyBuZXZlcgorICAgIC8vIHBv
c3NpYmxlIHRvIHJlLWF0dGFjaC4gRXZlbnR1YWxseSBEb2N1bWVudDo6ZGV0YWNoKCkgc2hvdWxk
IGJlIHJlbmFtZWQsCisgICAgLy8gb3IgdGhpcyBzZXR0aW5nIG9mIHRoZSBmcmFtZSB0byAwIGNv
dWxkIGJlIG1hZGUgZXhwbGljaXQgaW4gZWFjaCBvZiB0aGUKKyAgICAvLyBjYWxsZXJzIG9mIERv
Y3VtZW50OjpkZXRhY2goKS4KKyAgICBtX2ZyYW1lID0gMDsKKyAgICBtX3JlbmRlckFyZW5hLmNs
ZWFyKCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnByZXBhcmVGb3JEZXN0cnVjdGlvbigpCit7Cisg
ICAgZGlzY29ubmVjdERlc2NlbmRhbnRGcmFtZXMoKTsKKyAgICBpZiAoRE9NV2luZG93KiB3aW5k
b3cgPSB0aGlzLT5kb21XaW5kb3coKSkKKyAgICAgICAgd2luZG93LT53aWxsRGV0YWNoRG9jdW1l
bnRGcm9tRnJhbWUoKTsKKyAgICBkZXRhY2goKTsKK30KKwordm9pZCBEb2N1bWVudDo6cmVtb3Zl
QWxsRXZlbnRMaXN0ZW5lcnMoKQoreworICAgIEV2ZW50VGFyZ2V0OjpyZW1vdmVBbGxFdmVudExp
c3RlbmVycygpOworCisgICAgaWYgKERPTVdpbmRvdyogZG9tV2luZG93ID0gdGhpcy0+ZG9tV2lu
ZG93KCkpCisgICAgICAgIGRvbVdpbmRvdy0+cmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnMoKTsKKyAg
ICBmb3IgKE5vZGUqIG5vZGUgPSBmaXJzdENoaWxkKCk7IG5vZGU7IG5vZGUgPSBub2RlLT50cmF2
ZXJzZU5leHROb2RlKCkpCisgICAgICAgIG5vZGUtPnJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzKCk7
Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnN1c3BlbmRBY3RpdmVET01PYmplY3RzKEFjdGl2ZURPTU9i
amVjdDo6UmVhc29uRm9yU3VzcGVuc2lvbiB3aHkpCit7CisgICAgU2NyaXB0RXhlY3V0aW9uQ29u
dGV4dDo6c3VzcGVuZEFjdGl2ZURPTU9iamVjdHMod2h5KTsKKworI2lmIEVOQUJMRShERVZJQ0Vf
T1JJRU5UQVRJT04pCisgICAgaWYgKCFwYWdlKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlm
IChEZXZpY2VNb3Rpb25Db250cm9sbGVyKiBjb250cm9sbGVyID0gRGV2aWNlTW90aW9uQ29udHJv
bGxlcjo6ZnJvbShwYWdlKCkpKQorICAgICAgICBjb250cm9sbGVyLT5zdXNwZW5kRXZlbnRzRm9y
QWxsTGlzdGVuZXJzKGRvbVdpbmRvdygpKTsKKyAgICBpZiAoRGV2aWNlT3JpZW50YXRpb25Db250
cm9sbGVyKiBjb250cm9sbGVyID0gRGV2aWNlT3JpZW50YXRpb25Db250cm9sbGVyOjpmcm9tKHBh
Z2UoKSkpCisgICAgICAgIGNvbnRyb2xsZXItPnN1c3BlbmRFdmVudHNGb3JBbGxMaXN0ZW5lcnMo
ZG9tV2luZG93KCkpOworCisjZW5kaWYKK30KKwordm9pZCBEb2N1bWVudDo6cmVzdW1lQWN0aXZl
RE9NT2JqZWN0cygpCit7CisgICAgU2NyaXB0RXhlY3V0aW9uQ29udGV4dDo6cmVzdW1lQWN0aXZl
RE9NT2JqZWN0cygpOworCisjaWYgRU5BQkxFKERFVklDRV9PUklFTlRBVElPTikKKyAgICBpZiAo
IXBhZ2UoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKERldmljZU1vdGlvbkNvbnRyb2xs
ZXIqIGNvbnRyb2xsZXIgPSBEZXZpY2VNb3Rpb25Db250cm9sbGVyOjpmcm9tKHBhZ2UoKSkpCisg
ICAgICAgIGNvbnRyb2xsZXItPnJlc3VtZUV2ZW50c0ZvckFsbExpc3RlbmVycyhkb21XaW5kb3co
KSk7CisgICAgaWYgKERldmljZU9yaWVudGF0aW9uQ29udHJvbGxlciogY29udHJvbGxlciA9IERl
dmljZU9yaWVudGF0aW9uQ29udHJvbGxlcjo6ZnJvbShwYWdlKCkpKQorICAgICAgICBjb250cm9s
bGVyLT5yZXN1bWVFdmVudHNGb3JBbGxMaXN0ZW5lcnMoZG9tV2luZG93KCkpOworI2VuZGlmCit9
CisKK1JlbmRlclZpZXcqIERvY3VtZW50OjpyZW5kZXJWaWV3KCkgY29uc3QKK3sKKyAgICByZXR1
cm4gdG9SZW5kZXJWaWV3KHJlbmRlcmVyKCkpOworfQorCit2b2lkIERvY3VtZW50OjpjbGVhckFY
T2JqZWN0Q2FjaGUoKQoreworICAgIC8vIGNsZWFyIGNhY2hlIGluIHRvcCBkb2N1bWVudAorICAg
IGlmIChtX2F4T2JqZWN0Q2FjaGUpIHsKKyAgICAgICAgLy8gQ2xlYXIgdGhlIGNhY2hlIG1lbWJl
ciB2YXJpYWJsZSBiZWZvcmUgY2FsbGluZyBkZWxldGUgYmVjYXVzZSBhdHRlbXB0cworICAgICAg
ICAvLyBhcmUgbWFkZSB0byBhY2Nlc3MgaXQgZHVyaW5nIGRlc3RydWN0aW9uLgorICAgICAgICBB
WE9iamVjdENhY2hlKiBheE9iamVjdENhY2hlID0gbV9heE9iamVjdENhY2hlOworICAgICAgICBt
X2F4T2JqZWN0Q2FjaGUgPSAwOworICAgICAgICBkZWxldGUgYXhPYmplY3RDYWNoZTsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICAvLyBhc2sgdGhlIHRvcC1sZXZlbCBkb2N1bWVu
dCB0byBjbGVhciBpdHMgY2FjaGUKKyAgICBEb2N1bWVudCogZG9jID0gdG9wRG9jdW1lbnQoKTsK
KyAgICBpZiAoZG9jICE9IHRoaXMpCisgICAgICAgIGRvYy0+Y2xlYXJBWE9iamVjdENhY2hlKCk7
Cit9CisKK2Jvb2wgRG9jdW1lbnQ6OmF4T2JqZWN0Q2FjaGVFeGlzdHMoKSBjb25zdAoreworICAg
IGlmIChtX2F4T2JqZWN0Q2FjaGUpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIAorICAgIERv
Y3VtZW50KiBkb2MgPSB0b3BEb2N1bWVudCgpOworICAgIGlmIChkb2MgIT0gdGhpcykKKyAgICAg
ICAgcmV0dXJuIGRvYy0+YXhPYmplY3RDYWNoZUV4aXN0cygpOworICAgIAorICAgIHJldHVybiBm
YWxzZTsKK30KKyAgICAKK0FYT2JqZWN0Q2FjaGUqIERvY3VtZW50OjpheE9iamVjdENhY2hlKCkg
Y29uc3QKK3sKKyAgICAvLyBUaGUgb25seSBkb2N1bWVudCB0aGF0IGFjdHVhbGx5IGhhcyBhIEFY
T2JqZWN0Q2FjaGUgaXMgdGhlIHRvcC1sZXZlbAorICAgIC8vIGRvY3VtZW50LiAgVGhpcyBpcyBi
ZWNhdXNlIHdlIG5lZWQgdG8gYmUgYWJsZSB0byBnZXQgZnJvbSBhbnkgV2ViQ29yZUFYT2JqZWN0
CisgICAgLy8gdG8gYW55IG90aGVyIFdlYkNvcmVBWE9iamVjdCBvbiB0aGUgc2FtZSBwYWdlLiAg
VXNpbmcgYSBzaW5nbGUgY2FjaGUgYWxsb3dzCisgICAgLy8gbG9va3VwcyBhY3Jvc3MgbmVzdGVk
IHdlYmFyZWFzIChpLmUuIG11bHRpcGxlIGRvY3VtZW50cykuCisgICAgCisgICAgaWYgKG1fYXhP
YmplY3RDYWNoZSkgeworICAgICAgICAvLyByZXR1cm4gYWxyZWFkeSBrbm93biB0b3AtbGV2ZWwg
Y2FjaGUKKyAgICAgICAgaWYgKCFvd25lckVsZW1lbnQoKSkKKyAgICAgICAgICAgIHJldHVybiBt
X2F4T2JqZWN0Q2FjaGU7CisgICAgICAgIAorICAgICAgICAvLyBJbiBzb21lIHBhZ2VzIHdpdGgg
ZnJhbWVzLCB0aGUgY2FjaGUgaXMgY3JlYXRlZCBiZWZvcmUgdGhlIHN1Yi13ZWJhcmVhIGlzCisg
ICAgICAgIC8vIGluc2VydGVkIGludG8gdGhlIHRyZWUuICBIZXJlLCB3ZSBjYXRjaCB0aGF0IGNh
c2UgYW5kIGp1c3QgdG9zcyB0aGUgb2xkCisgICAgICAgIC8vIGNhY2hlIGFuZCBzdGFydCBvdmVy
LgorICAgICAgICAvLyBOT1RFOiBUaGlzIHJlY292ZXJ5IG1heSBubyBsb25nZXIgYmUgbmVlZGVk
LiBJIGhhdmUgYmVlbiB1bmFibGUgdG8gdHJpZ2dlcgorICAgICAgICAvLyBpdCBhZ2Fpbi4gU2Vl
IHJkYXI6Ly81Nzk0NDU0CisgICAgICAgIC8vIEZJWE1FOiBDYW4gdGhpcyBiZSBmaXhlZCB3aGVu
IGluc2VydGluZyB0aGUgc3ViZnJhbWUgaW5zdGVhZCBvZiBub3c/CisgICAgICAgIC8vIEZJWE1F
OiBJZiB0aGlzIGZ1bmN0aW9uIHdhcyBjYWxsZWQgdG8gZ2V0IHRoZSBjYWNoZSBpbiBvcmRlciB0
byByZW1vdmUKKyAgICAgICAgLy8gYW4gQVhPYmplY3QsIHdlIGFyZSBub3cgZGVsZXRpbmcgdGhl
IGNhY2hlIGFzIGEgd2hvbGUgYW5kIHJldHVybmluZyBhCisgICAgICAgIC8vIG5ldyBlbXB0eSBj
YWNoZSB0aGF0IGRvZXMgbm90IGNvbnRhaW4gdGhlIEFYT2JqZWN0ISBUaGF0IHNob3VsZCBhY3R1
YWxseQorICAgICAgICAvLyBiZSBPSy4gSSBhbSBjb25jZXJuZWQgYWJvdXQgb3RoZXIgY2FzZXMg
bGlrZSB0aGlzIHdoZXJlIGFjY2Vzc2luZyB0aGUKKyAgICAgICAgLy8gY2FjaGUgYmxvd3MgYXdh
eSB0aGUgQVhPYmplY3QgYmVpbmcgb3BlcmF0ZWQgb24uCisgICAgICAgIGRlbGV0ZSBtX2F4T2Jq
ZWN0Q2FjaGU7CisgICAgICAgIG1fYXhPYmplY3RDYWNoZSA9IDA7CisgICAgfQorCisgICAgLy8g
YXNrIHRoZSB0b3AtbGV2ZWwgZG9jdW1lbnQgZm9yIGl0cyBjYWNoZQorICAgIERvY3VtZW50KiBk
b2MgPSB0b3BEb2N1bWVudCgpOworICAgIGlmIChkb2MgIT0gdGhpcykKKyAgICAgICAgcmV0dXJu
IGRvYy0+YXhPYmplY3RDYWNoZSgpOworICAgIAorICAgIC8vIHRoaXMgaXMgdGhlIHRvcC1sZXZl
bCBkb2N1bWVudCwgc28gaW5zdGFsbCBhIG5ldyBjYWNoZQorICAgIG1fYXhPYmplY3RDYWNoZSA9
IG5ldyBBWE9iamVjdENhY2hlKHRoaXMpOworICAgIHJldHVybiBtX2F4T2JqZWN0Q2FjaGU7Cit9
CisKK3ZvaWQgRG9jdW1lbnQ6OnNldFZpc3VhbGx5T3JkZXJlZCgpCit7CisgICAgbV92aXN1YWxs
eU9yZGVyZWQgPSB0cnVlOworICAgIGlmIChyZW5kZXJlcigpKQorICAgICAgICByZW5kZXJlcigp
LT5zdHlsZSgpLT5zZXRSVExPcmRlcmluZyhWaXN1YWxPcmRlcik7Cit9CisKK1Bhc3NSZWZQdHI8
RG9jdW1lbnRQYXJzZXI+IERvY3VtZW50OjpjcmVhdGVQYXJzZXIoKQoreworICAgIC8vIEZJWE1F
OiB0aGlzIHNob3VsZCBwcm9iYWJseSBwYXNzIHRoZSBmcmFtZSBpbnN0ZWFkCisjaWYgRU5BQkxF
KE5FV19YTUwpCisgICAgcmV0dXJuIE5ld1hNTERvY3VtZW50UGFyc2VyOjpjcmVhdGUodGhpcyk7
CisjZWxzZQorICAgIHJldHVybiBYTUxEb2N1bWVudFBhcnNlcjo6Y3JlYXRlKHRoaXMsIHZpZXco
KSk7CisjZW5kaWYKK30KKworU2NyaXB0YWJsZURvY3VtZW50UGFyc2VyKiBEb2N1bWVudDo6c2Ny
aXB0YWJsZURvY3VtZW50UGFyc2VyKCkgY29uc3QKK3sKKyAgICByZXR1cm4gcGFyc2VyKCkgPyBw
YXJzZXIoKS0+YXNTY3JpcHRhYmxlRG9jdW1lbnRQYXJzZXIoKSA6IDA7Cit9CisKK3ZvaWQgRG9j
dW1lbnQ6Om9wZW4oRG9jdW1lbnQqIG93bmVyRG9jdW1lbnQpCit7CisgICAgaWYgKG93bmVyRG9j
dW1lbnQpIHsKKyAgICAgICAgc2V0VVJMKG93bmVyRG9jdW1lbnQtPnVybCgpKTsKKyAgICAgICAg
bV9jb29raWVVUkwgPSBvd25lckRvY3VtZW50LT5jb29raWVVUkwoKTsKKyAgICAgICAgc2V0U2Vj
dXJpdHlPcmlnaW4ob3duZXJEb2N1bWVudC0+c2VjdXJpdHlPcmlnaW4oKSk7CisgICAgfQorCisg
ICAgaWYgKG1fZnJhbWUpIHsKKyAgICAgICAgaWYgKFNjcmlwdGFibGVEb2N1bWVudFBhcnNlciog
cGFyc2VyID0gc2NyaXB0YWJsZURvY3VtZW50UGFyc2VyKCkpIHsKKyAgICAgICAgICAgIGlmIChw
YXJzZXItPmlzUGFyc2luZygpKSB7CisgICAgICAgICAgICAgICAgLy8gRklYTUU6IEhUTUw1IGRv
ZXNuJ3QgdGVsbCB1cyB0byBjaGVjayB0aGlzLCBpdCBtaWdodCBub3QgYmUgY29ycmVjdC4KKyAg
ICAgICAgICAgICAgICBpZiAocGFyc2VyLT5pc0V4ZWN1dGluZ1NjcmlwdCgpKQorICAgICAgICAg
ICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgICAgICBpZiAoIXBhcnNlci0+d2FzQ3Jl
YXRlZEJ5U2NyaXB0KCkgJiYgcGFyc2VyLT5oYXNJbnNlcnRpb25Qb2ludCgpKQorICAgICAgICAg
ICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBp
ZiAobV9mcmFtZS0+bG9hZGVyKCktPnN0YXRlKCkgPT0gRnJhbWVTdGF0ZVByb3Zpc2lvbmFsKQor
ICAgICAgICAgICAgbV9mcmFtZS0+bG9hZGVyKCktPnN0b3BBbGxMb2FkZXJzKCk7CisgICAgfQor
CisgICAgcmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnMoKTsKKyAgICBpbXBsaWNpdE9wZW4oKTsKKyAg
ICBpZiAoU2NyaXB0YWJsZURvY3VtZW50UGFyc2VyKiBwYXJzZXIgPSBzY3JpcHRhYmxlRG9jdW1l
bnRQYXJzZXIoKSkKKyAgICAgICAgcGFyc2VyLT5zZXRXYXNDcmVhdGVkQnlTY3JpcHQodHJ1ZSk7
CisKKyAgICBpZiAoRE9NV2luZG93KiBkb21XaW5kb3cgPSB0aGlzLT5kb21XaW5kb3coKSkKKyAg
ICAgICAgZG9tV2luZG93LT5yZW1vdmVBbGxFdmVudExpc3RlbmVycygpOworCisgICAgaWYgKG1f
ZnJhbWUpCisgICAgICAgIG1fZnJhbWUtPmxvYWRlcigpLT5kaWRFeHBsaWNpdE9wZW4oKTsKK30K
Kwordm9pZCBEb2N1bWVudDo6ZGV0YWNoUGFyc2VyKCkKK3sKKyAgICBpZiAoIW1fcGFyc2VyKQor
ICAgICAgICByZXR1cm47CisgICAgbV9wYXJzZXItPmRldGFjaCgpOworICAgIG1fcGFyc2VyLmNs
ZWFyKCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmNhbmNlbFBhcnNpbmcoKQoreworICAgIGlmICgh
bV9wYXJzZXIpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFdlIGhhdmUgdG8gY2xlYXIgdGhl
IHBhcnNlciB0byBhdm9pZCBwb3NzaWJseSB0cmlnZ2VyaW5nCisgICAgLy8gdGhlIG9ubG9hZCBo
YW5kbGVyIHdoZW4gY2xvc2luZyBhcyBhIHNpZGUgZWZmZWN0IG9mIGEgY2FuY2VsLXN0eWxlCisg
ICAgLy8gY2hhbmdlLCBzdWNoIGFzIG9wZW5pbmcgYSBuZXcgZG9jdW1lbnQgb3IgY2xvc2luZyB0
aGUgd2luZG93IHdoaWxlCisgICAgLy8gc3RpbGwgcGFyc2luZworICAgIGRldGFjaFBhcnNlcigp
OworICAgIGV4cGxpY2l0Q2xvc2UoKTsKK30KKwordm9pZCBEb2N1bWVudDo6aW1wbGljaXRPcGVu
KCkKK3sKKyAgICBjYW5jZWxQYXJzaW5nKCk7CisKKyAgICByZW1vdmVDaGlsZHJlbigpOworCisg
ICAgc2V0Q29tcGF0aWJpbGl0eU1vZGUoTm9RdWlya3NNb2RlKTsKKworICAgIG1fcGFyc2VyID0g
Y3JlYXRlUGFyc2VyKCk7CisgICAgc2V0UGFyc2luZyh0cnVlKTsKKyAgICBzZXRSZWFkeVN0YXRl
KExvYWRpbmcpOworfQorCitIVE1MRWxlbWVudCogRG9jdW1lbnQ6OmJvZHkoKSBjb25zdAorewor
ICAgIE5vZGUqIGRlID0gZG9jdW1lbnRFbGVtZW50KCk7CisgICAgaWYgKCFkZSkKKyAgICAgICAg
cmV0dXJuIDA7CisgICAgCisgICAgLy8gdHJ5IHRvIHByZWZlciBhIEZSQU1FU0VUIGVsZW1lbnQg
b3ZlciBCT0RZCisgICAgTm9kZSogYm9keSA9IDA7CisgICAgZm9yIChOb2RlKiBpID0gZGUtPmZp
cnN0Q2hpbGQoKTsgaTsgaSA9IGktPm5leHRTaWJsaW5nKCkpIHsKKyAgICAgICAgaWYgKGktPmhh
c1RhZ05hbWUoZnJhbWVzZXRUYWcpKQorICAgICAgICAgICAgcmV0dXJuIHRvSFRNTEVsZW1lbnQo
aSk7CisgICAgICAgIAorICAgICAgICBpZiAoaS0+aGFzVGFnTmFtZShib2R5VGFnKSAmJiAhYm9k
eSkKKyAgICAgICAgICAgIGJvZHkgPSBpOworICAgIH0KKyAgICByZXR1cm4gdG9IVE1MRWxlbWVu
dChib2R5KTsKK30KKwordm9pZCBEb2N1bWVudDo6c2V0Qm9keShQYXNzUmVmUHRyPEhUTUxFbGVt
ZW50PiBwcnBOZXdCb2R5LCBFeGNlcHRpb25Db2RlJiBlYykKK3sKKyAgICBSZWZQdHI8SFRNTEVs
ZW1lbnQ+IG5ld0JvZHkgPSBwcnBOZXdCb2R5OworCisgICAgaWYgKCFuZXdCb2R5IHx8ICFkb2N1
bWVudEVsZW1lbnQoKSB8fCAhbmV3Qm9keS0+aGFzVGFnTmFtZShib2R5VGFnKSkgeyAKKyAgICAg
ICAgZWMgPSBISUVSQVJDSFlfUkVRVUVTVF9FUlI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisK
KyAgICBpZiAobmV3Qm9keS0+ZG9jdW1lbnQoKSAmJiBuZXdCb2R5LT5kb2N1bWVudCgpICE9IHRo
aXMpIHsKKyAgICAgICAgZWMgPSAwOworICAgICAgICBSZWZQdHI8Tm9kZT4gbm9kZSA9IGltcG9y
dE5vZGUobmV3Qm9keS5nZXQoKSwgdHJ1ZSwgZWMpOworICAgICAgICBpZiAoZWMpCisgICAgICAg
ICAgICByZXR1cm47CisgICAgICAgIAorICAgICAgICBuZXdCb2R5ID0gdG9IVE1MRWxlbWVudChu
b2RlLmdldCgpKTsKKyAgICB9CisKKyAgICBIVE1MRWxlbWVudCogYiA9IGJvZHkoKTsKKyAgICBp
ZiAoIWIpCisgICAgICAgIGRvY3VtZW50RWxlbWVudCgpLT5hcHBlbmRDaGlsZChuZXdCb2R5LnJl
bGVhc2UoKSwgZWMpOworICAgIGVsc2UKKyAgICAgICAgZG9jdW1lbnRFbGVtZW50KCktPnJlcGxh
Y2VDaGlsZChuZXdCb2R5LnJlbGVhc2UoKSwgYiwgZWMpOworfQorCitIVE1MSGVhZEVsZW1lbnQq
IERvY3VtZW50OjpoZWFkKCkKK3sKKyAgICBOb2RlKiBkZSA9IGRvY3VtZW50RWxlbWVudCgpOwor
ICAgIGlmICghZGUpCisgICAgICAgIHJldHVybiAwOworCisgICAgZm9yIChOb2RlKiBlID0gZGUt
PmZpcnN0Q2hpbGQoKTsgZTsgZSA9IGUtPm5leHRTaWJsaW5nKCkpCisgICAgICAgIGlmIChlLT5o
YXNUYWdOYW1lKGhlYWRUYWcpKQorICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEhUTUxI
ZWFkRWxlbWVudCo+KGUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmNs
b3NlKCkKK3sKKyAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIGZvbGxvdyB0aGUgc3BlY2lmaWNhdGlv
biBtb3JlIGNsb3NlbHk6CisgICAgLy8gICAgICAgIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVj
cy93ZWItYXBwcy9jdXJyZW50LXdvcmsvI2RvbS1kb2N1bWVudC1jbG9zZQorCisgICAgaWYgKCFz
Y3JpcHRhYmxlRG9jdW1lbnRQYXJzZXIoKSB8fCAhc2NyaXB0YWJsZURvY3VtZW50UGFyc2VyKCkt
Pndhc0NyZWF0ZWRCeVNjcmlwdCgpIHx8ICFzY3JpcHRhYmxlRG9jdW1lbnRQYXJzZXIoKS0+aXNQ
YXJzaW5nKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGV4cGxpY2l0Q2xvc2UoKTsKK30KKwor
dm9pZCBEb2N1bWVudDo6ZXhwbGljaXRDbG9zZSgpCit7CisgICAgaWYgKG1fcGFyc2VyKQorICAg
ICAgICBtX3BhcnNlci0+ZmluaXNoKCk7CisKKyAgICBpZiAoIW1fZnJhbWUpIHsKKyAgICAgICAg
Ly8gQmVjYXVzZSB3ZSBoYXZlIG5vIGZyYW1lLCB3ZSBkb24ndCBrbm93IGlmIGFsbCBsb2FkaW5n
IGhhcyBjb21wbGV0ZWQsCisgICAgICAgIC8vIHNvIHdlIGp1c3QgY2FsbCBpbXBsaWNpdENsb3Nl
KCkgaW1tZWRpYXRlbHkuIEZJWE1FOiBUaGlzIG1pZ2h0IGZpcmUKKyAgICAgICAgLy8gdGhlIGxv
YWQgZXZlbnQgcHJlbWF0dXJlbHkgPGh0dHA6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTE0NTY4Pi4KKyAgICAgICAgaW1wbGljaXRDbG9zZSgpOworICAgICAgICByZXR1cm47Cisg
ICAgfQorCisgICAgbV9mcmFtZS0+bG9hZGVyKCktPmNoZWNrQ29tcGxldGVkKCk7Cit9CisKK3Zv
aWQgRG9jdW1lbnQ6OmltcGxpY2l0Q2xvc2UoKQoreworICAgIC8vIElmIHdlJ3JlIGluIHRoZSBt
aWRkbGUgb2YgcmVjYWxjU3R5bGUsIHdlIG5lZWQgdG8gZGVmZXIgdGhlIGNsb3NlIHVudGlsIHRo
ZSBzdHlsZSBpbmZvcm1hdGlvbiBpcyBhY2N1cmF0ZSBhbmQgYWxsIGVsZW1lbnRzIGFyZSByZS1h
dHRhY2hlZC4KKyAgICBpZiAobV9pblN0eWxlUmVjYWxjKSB7CisgICAgICAgIG1fY2xvc2VBZnRl
clN0eWxlUmVjYWxjID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wg
d2FzTG9jYXRpb25DaGFuZ2VQZW5kaW5nID0gZnJhbWUoKSAmJiBmcmFtZSgpLT5uYXZpZ2F0aW9u
U2NoZWR1bGVyKCktPmxvY2F0aW9uQ2hhbmdlUGVuZGluZygpOworICAgIGJvb2wgZG9sb2FkID0g
IXBhcnNpbmcoKSAmJiBtX3BhcnNlciAmJiAhbV9wcm9jZXNzaW5nTG9hZEV2ZW50ICYmICF3YXNM
b2NhdGlvbkNoYW5nZVBlbmRpbmc7CisgICAgCisgICAgaWYgKCFkb2xvYWQpCisgICAgICAgIHJl
dHVybjsKKworICAgIG1fcHJvY2Vzc2luZ0xvYWRFdmVudCA9IHRydWU7CisKKyAgICBTY3JpcHRh
YmxlRG9jdW1lbnRQYXJzZXIqIHBhcnNlciA9IHNjcmlwdGFibGVEb2N1bWVudFBhcnNlcigpOwor
ICAgIG1fd2VsbEZvcm1lZCA9IHBhcnNlciAmJiBwYXJzZXItPndlbGxGb3JtZWQoKTsKKworICAg
IC8vIFdlIGhhdmUgdG8gY2xlYXIgdGhlIHBhcnNlciwgaW4gY2FzZSBzb21lb25lIGRvY3VtZW50
LndyaXRlKClzIGZyb20gdGhlCisgICAgLy8gb25Mb2FkIGV2ZW50IGhhbmRsZXIsIGFzIGluIFJh
ZGFyIDMyMDY1MjQuCisgICAgZGV0YWNoUGFyc2VyKCk7CisKKyAgICAvLyBQYXJzZXIgc2hvdWxk
IGhhdmUgcGlja2VkIHVwIGFsbCBwcmVsb2FkcyBieSBub3cKKyAgICBtX2NhY2hlZFJlc291cmNl
TG9hZGVyLT5jbGVhclByZWxvYWRzKCk7CisKKyAgICAvLyBGSVhNRTogV2Uga2ljayBvZmYgdGhl
IGljb24gbG9hZGVyIHdoZW4gdGhlIERvY3VtZW50IGlzIGRvbmUgcGFyc2luZy4KKyAgICAvLyBU
aGVyZSBhcmUgZWFybGllciBvcHBvcnR1bml0aWVzIHdlIGNvdWxkIHN0YXJ0IGl0OgorICAgIC8v
ICAtV2hlbiB0aGUgPGhlYWQ+IGZpbmlzaGVzIHBhcnNpbmcKKyAgICAvLyAgLVdoZW4gYW55IG5l
dyBIVE1MTGlua0VsZW1lbnQgaXMgaW5zZXJ0ZWQgaW50byB0aGUgZG9jdW1lbnQKKyAgICAvLyBC
dXQgdGhvc2UgYWRkIGEgZHluYW1pYyBjb21wb25lbnQgdG8gdGhlIGZhdmljb24gdGhhdCBoYXMg
VUkgCisgICAgLy8gcmFtaWZpY2F0aW9ucywgYW5kIHdlIG5lZWQgdG8gZGVjaWRlIHdoYXQgaXMg
dGhlIFJpZ2h0IFRoaW5nIFRvIERvKHRtKQorICAgIEZyYW1lKiBmID0gZnJhbWUoKTsKKyAgICBp
ZiAoZikgeworICAgICAgICBmLT5sb2FkZXIoKS0+aWNvbigpLT5zdGFydExvYWRlcigpOworICAg
ICAgICBmLT5hbmltYXRpb24oKS0+cmVzdW1lQW5pbWF0aW9uc0ZvckRvY3VtZW50KHRoaXMpOwor
ICAgIH0KKworICAgIEltYWdlTG9hZGVyOjpkaXNwYXRjaFBlbmRpbmdCZWZvcmVMb2FkRXZlbnRz
KCk7CisgICAgSW1hZ2VMb2FkZXI6OmRpc3BhdGNoUGVuZGluZ0xvYWRFdmVudHMoKTsKKyAgICBJ
bWFnZUxvYWRlcjo6ZGlzcGF0Y2hQZW5kaW5nRXJyb3JFdmVudHMoKTsKKworICAgIEhUTUxMaW5r
RWxlbWVudDo6ZGlzcGF0Y2hQZW5kaW5nTG9hZEV2ZW50cygpOworICAgIEhUTUxTdHlsZUVsZW1l
bnQ6OmRpc3BhdGNoUGVuZGluZ0xvYWRFdmVudHMoKTsKKworI2lmIEVOQUJMRShTVkcpCisgICAg
Ly8gVG8gYWxpZ24gdGhlIEhUTUwgbG9hZCBldmVudCBhbmQgdGhlIFNWR0xvYWQgZXZlbnQgZm9y
IHRoZSBvdXRlcm1vc3QgPHN2Zz4gZWxlbWVudCwgZmlyZSBpdCBmcm9tCisgICAgLy8gaGVyZSwg
aW5zdGVhZCBvZiBkb2luZyBpdCBmcm9tIFNWR0VsZW1lbnQ6OmZpbmlzaGVkUGFyc2luZ0NoaWxk
cmVuIChpZiBleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkPSJmYWxzZSIsCisgICAgLy8gd2hpY2gg
aXMgdGhlIGRlZmF1bHQsIGZvciA9J3RydWUnIGl0cyBmaXJlZCBhdCBhIGxhdGVyIHRpbWUsIG9u
Y2UgYWxsIGV4dGVybmFsIHJlc291cmNlcyBmaW5pc2hlZCBsb2FkaW5nKS4KKyAgICBpZiAoc3Zn
RXh0ZW5zaW9ucygpKQorICAgICAgICBhY2Nlc3NTVkdFeHRlbnNpb25zKCktPmRpc3BhdGNoU1ZH
TG9hZEV2ZW50VG9PdXRlcm1vc3RTVkdFbGVtZW50cygpOworI2VuZGlmCisKKyAgICBkaXNwYXRj
aFdpbmRvd0xvYWRFdmVudCgpOworICAgIGVucXVldWVQYWdlc2hvd0V2ZW50KFBhZ2VzaG93RXZl
bnROb3RQZXJzaXN0ZWQpOworICAgIGVucXVldWVQb3BzdGF0ZUV2ZW50KG1fcGVuZGluZ1N0YXRl
T2JqZWN0ID8gbV9wZW5kaW5nU3RhdGVPYmplY3QucmVsZWFzZSgpIDogU2VyaWFsaXplZFNjcmlw
dFZhbHVlOjpudWxsVmFsdWUoKSk7CisgICAgCisgICAgaWYgKGYpCisgICAgICAgIGYtPmxvYWRl
cigpLT5oYW5kbGVkT25sb2FkRXZlbnRzKCk7CisjaWZkZWYgSU5TVFJVTUVOVF9MQVlPVVRfU0NI
RURVTElORworICAgIGlmICghb3duZXJFbGVtZW50KCkpCisgICAgICAgIHByaW50Zigib25sb2Fk
IGZpcmVkIGF0ICVkXG4iLCBlbGFwc2VkVGltZSgpKTsKKyNlbmRpZgorCisgICAgLy8gQW4gZXZl
bnQgaGFuZGxlciBtYXkgaGF2ZSByZW1vdmVkIHRoZSBmcmFtZQorICAgIGlmICghZnJhbWUoKSkg
eworICAgICAgICBtX3Byb2Nlc3NpbmdMb2FkRXZlbnQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJu
OworICAgIH0KKworICAgIC8vIE1ha2Ugc3VyZSBib3RoIHRoZSBpbml0aWFsIGxheW91dCBhbmQg
cmVmbG93IGhhcHBlbiBhZnRlciB0aGUgb25sb2FkCisgICAgLy8gZmlyZXMuIFRoaXMgd2lsbCBp
bXByb3ZlIG9ubG9hZCBzY29yZXMsIGFuZCBvdGhlciBicm93c2VycyBkbyBpdC4KKyAgICAvLyBJ
ZiB0aGV5IHdhbm5hIGNoZWF0LCB3ZSBjYW4gdG9vLiAtZHdoCisKKyAgICBpZiAoZnJhbWUoKS0+
bmF2aWdhdGlvblNjaGVkdWxlcigpLT5sb2NhdGlvbkNoYW5nZVBlbmRpbmcoKSAmJiBlbGFwc2Vk
VGltZSgpIDwgY0xheW91dFNjaGVkdWxlVGhyZXNob2xkKSB7CisgICAgICAgIC8vIEp1c3QgYmFp
bCBvdXQuIEJlZm9yZSBvciBkdXJpbmcgdGhlIG9ubG9hZCB3ZSB3ZXJlIHNoaWZ0ZWQgdG8gYW5v
dGhlciBwYWdlLgorICAgICAgICAvLyBUaGUgb2xkIGktQmVuY2ggc3VpdGUgZG9lcyB0aGlzLiBX
aGVuIHRoaXMgaGFwcGVucyBkb24ndCBib3RoZXIgcGFpbnRpbmcgb3IgbGF5aW5nIG91dC4gICAg
ICAgIAorICAgICAgICBtX3Byb2Nlc3NpbmdMb2FkRXZlbnQgPSBmYWxzZTsKKyAgICAgICAgdmll
dygpLT51bnNjaGVkdWxlUmVsYXlvdXQoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAg
IGZyYW1lKCktPmxvYWRlcigpLT5jaGVja0NhbGxJbXBsaWNpdENsb3NlKCk7CisgICAgUmVuZGVy
T2JqZWN0KiByZW5kZXJPYmplY3QgPSByZW5kZXJlcigpOworICAgIAorICAgIC8vIFdlIHVzZWQg
dG8gZm9yY2UgYSBzeW5jaHJvbm91cyBkaXNwbGF5IGFuZCBmbHVzaCBoZXJlLiAgVGhpcyByZWFs
bHkgaXNuJ3QKKyAgICAvLyBuZWNlc3NhcnkgYW5kIGNhbiBpbiBmYWN0IGJlIGFjdGl2ZWx5IGhh
cm1mdWwgaWYgcGFnZXMgYXJlIGxvYWRpbmcgYXQgYSByYXRlIG9mID4gNjBmcHMKKyAgICAvLyAo
aWYgeW91ciBwbGF0Zm9ybSBpcyBzeW5jaW5nIGZsdXNoZXMgYW5kIGxpbWl0aW5nIHRoZW0gdG8g
NjBmcHMpLgorICAgIG1fb3Zlck1pbmltdW1MYXlvdXRUaHJlc2hvbGQgPSB0cnVlOworICAgIGlm
ICghb3duZXJFbGVtZW50KCkgfHwgKG93bmVyRWxlbWVudCgpLT5yZW5kZXJlcigpICYmICFvd25l
ckVsZW1lbnQoKS0+cmVuZGVyZXIoKS0+bmVlZHNMYXlvdXQoKSkpIHsKKyAgICAgICAgdXBkYXRl
U3R5bGVJZk5lZWRlZCgpOworICAgICAgICAKKyAgICAgICAgLy8gQWx3YXlzIGRvIGEgbGF5b3V0
IGFmdGVyIGxvYWRpbmcgaWYgbmVlZGVkLgorICAgICAgICBpZiAodmlldygpICYmIHJlbmRlck9i
amVjdCAmJiAoIXJlbmRlck9iamVjdC0+Zmlyc3RDaGlsZCgpIHx8IHJlbmRlck9iamVjdC0+bmVl
ZHNMYXlvdXQoKSkpCisgICAgICAgICAgICB2aWV3KCktPmxheW91dCgpOworICAgIH0KKworICAg
IG1fcHJvY2Vzc2luZ0xvYWRFdmVudCA9IGZhbHNlOworCisjaWYgUExBVEZPUk0oTUFDKSB8fCBQ
TEFURk9STShDSFJPTUlVTSkKKyAgICBpZiAoZiAmJiByZW5kZXJPYmplY3QgJiYgQVhPYmplY3RD
YWNoZTo6YWNjZXNzaWJpbGl0eUVuYWJsZWQoKSkgeworICAgICAgICAvLyBUaGUgQVggY2FjaGUg
bWF5IGhhdmUgYmVlbiBjbGVhcmVkIGF0IHRoaXMgcG9pbnQsIGJ1dCB3ZSBuZWVkIHRvIG1ha2Ug
c3VyZSBpdCBjb250YWlucyBhbgorICAgICAgICAvLyBBWCBvYmplY3QgdG8gc2VuZCB0aGUgbm90
aWZpY2F0aW9uIHRvLiBnZXRPckNyZWF0ZSB3aWxsIG1ha2Ugc3VyZSB0aGF0IGFuIHZhbGlkIEFY
IG9iamVjdAorICAgICAgICAvLyBleGlzdHMgaW4gdGhlIGNhY2hlICh3ZSBpZ25vcmUgdGhlIHJl
dHVybiB2YWx1ZSBiZWNhdXNlIHdlIGRvbid0IG5lZWQgaXQgaGVyZSkuIFRoaXMgaXMgCisgICAg
ICAgIC8vIG9ubHkgc2FmZSB0byBjYWxsIHdoZW4gYSBsYXlvdXQgaXMgbm90IGluIHByb2dyZXNz
LCBzbyBpdCBjYW4gbm90IGJlIHVzZWQgaW4gcG9zdE5vdGlmaWNhdGlvbi4gICAgCisgICAgICAg
IGF4T2JqZWN0Q2FjaGUoKS0+Z2V0T3JDcmVhdGUocmVuZGVyT2JqZWN0KTsKKyAgICAgICAgaWYg
KHRoaXMgPT0gdG9wRG9jdW1lbnQoKSkKKyAgICAgICAgICAgIGF4T2JqZWN0Q2FjaGUoKS0+cG9z
dE5vdGlmaWNhdGlvbihyZW5kZXJPYmplY3QsIEFYT2JqZWN0Q2FjaGU6OkFYTG9hZENvbXBsZXRl
LCB0cnVlKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyBBWExvYWRDb21wbGV0ZSBj
YW4gb25seSBiZSBwb3N0ZWQgb24gdGhlIHRvcCBkb2N1bWVudCwgc28gaWYgaXQncyBhIGRvY3Vt
ZW50CisgICAgICAgICAgICAvLyBpbiBhbiBpZnJhbWUgdGhhdCBqdXN0IGZpbmlzaGVkIGxvYWRp
bmcsIHBvc3QgQVhMYXlvdXRDb21wbGV0ZSBpbnN0ZWFkLgorICAgICAgICAgICAgYXhPYmplY3RD
YWNoZSgpLT5wb3N0Tm90aWZpY2F0aW9uKHJlbmRlck9iamVjdCwgQVhPYmplY3RDYWNoZTo6QVhM
YXlvdXRDb21wbGV0ZSwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworI2lmIEVO
QUJMRShTVkcpCisgICAgaWYgKHN2Z0V4dGVuc2lvbnMoKSkKKyAgICAgICAgYWNjZXNzU1ZHRXh0
ZW5zaW9ucygpLT5zdGFydEFuaW1hdGlvbnMoKTsKKyNlbmRpZgorfQorCit2b2lkIERvY3VtZW50
OjpzZXRQYXJzaW5nKGJvb2wgYikKK3sKKyAgICBtX2JQYXJzaW5nID0gYjsKKyAgICBpZiAoIW1f
YlBhcnNpbmcgJiYgdmlldygpKQorICAgICAgICB2aWV3KCktPnNjaGVkdWxlUmVsYXlvdXQoKTsK
KworI2lmZGVmIElOU1RSVU1FTlRfTEFZT1VUX1NDSEVEVUxJTkcKKyAgICBpZiAoIW93bmVyRWxl
bWVudCgpICYmICFtX2JQYXJzaW5nKQorICAgICAgICBwcmludGYoIlBhcnNpbmcgZmluaXNoZWQg
YXQgJWRcbiIsIGVsYXBzZWRUaW1lKCkpOworI2VuZGlmCit9CisKK2Jvb2wgRG9jdW1lbnQ6OnNo
b3VsZFNjaGVkdWxlTGF5b3V0KCkKK3sKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgb25seSBi
ZSBjYWxsZWQgd2hlbiBGcmFtZVZpZXcgdGhpbmtzIGEgbGF5b3V0IGlzIG5lZWRlZC4KKyAgICAv
LyBUaGlzIGVuZm9yY2VzIGEgY291cGxlIGV4dHJhIHJ1bGVzLgorICAgIC8vCisgICAgLy8gICAg
KGEpIE9ubHkgc2NoZWR1bGUgYSBsYXlvdXQgb25jZSB0aGUgc3R5bGVzaGVldHMgYXJlIGxvYWRl
ZC4KKyAgICAvLyAgICAoYikgT25seSBzY2hlZHVsZSBsYXlvdXQgb25jZSB3ZSBoYXZlIGEgYm9k
eSBlbGVtZW50LgorCisgICAgcmV0dXJuIChoYXZlU3R5bGVzaGVldHNMb2FkZWQoKSAmJiBib2R5
KCkpCisgICAgICAgIHx8IChkb2N1bWVudEVsZW1lbnQoKSAmJiAhZG9jdW1lbnRFbGVtZW50KCkt
Pmhhc1RhZ05hbWUoaHRtbFRhZykpOworfQorICAgIAorYm9vbCBEb2N1bWVudDo6aXNMYXlvdXRU
aW1lckFjdGl2ZSgpCit7CisgICAgcmV0dXJuIHZpZXcoKSAmJiB2aWV3KCktPmxheW91dFBlbmRp
bmcoKSAmJiAhbWluaW11bUxheW91dERlbGF5KCk7Cit9CisKK2ludCBEb2N1bWVudDo6bWluaW11
bUxheW91dERlbGF5KCkKK3sKKyAgICBpZiAobV9vdmVyTWluaW11bUxheW91dFRocmVzaG9sZCkK
KyAgICAgICAgcmV0dXJuIDA7CisgICAgCisgICAgaW50IGVsYXBzZWQgPSBlbGFwc2VkVGltZSgp
OworICAgIG1fb3Zlck1pbmltdW1MYXlvdXRUaHJlc2hvbGQgPSBlbGFwc2VkID4gY0xheW91dFNj
aGVkdWxlVGhyZXNob2xkOworICAgIAorICAgIC8vIFdlJ2xsIHdhbnQgdG8gc2NoZWR1bGUgdGhl
IHRpbWVyIHRvIGZpcmUgYXQgdGhlIG1pbmltdW0gbGF5b3V0IHRocmVzaG9sZC4KKyAgICByZXR1
cm4gbWF4KDAsIGNMYXlvdXRTY2hlZHVsZVRocmVzaG9sZCAtIGVsYXBzZWQpOworfQorCitpbnQg
RG9jdW1lbnQ6OmVsYXBzZWRUaW1lKCkgY29uc3QKK3sKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8
aW50PigoY3VycmVudFRpbWUoKSAtIG1fc3RhcnRUaW1lKSAqIDEwMDApOworfQorCit2b2lkIERv
Y3VtZW50Ojp3cml0ZShjb25zdCBTZWdtZW50ZWRTdHJpbmcmIHRleHQsIERvY3VtZW50KiBvd25l
ckRvY3VtZW50KQoreworICAgIE5lc3RpbmdMZXZlbEluY3JlbWVudGVyIG5lc3RpbmdMZXZlbElu
Y3JlbWVudGVyKG1fd3JpdGVSZWN1cnNpb25EZXB0aCk7CisKKyAgICBtX3dyaXRlUmVjdXJzaW9u
SXNUb29EZWVwID0gKG1fd3JpdGVSZWN1cnNpb25EZXB0aCA+IDEpICYmIG1fd3JpdGVSZWN1cnNp
b25Jc1Rvb0RlZXA7CisgICAgbV93cml0ZVJlY3Vyc2lvbklzVG9vRGVlcCA9IChtX3dyaXRlUmVj
dXJzaW9uRGVwdGggPiBjTWF4V3JpdGVSZWN1cnNpb25EZXB0aCkgfHwgbV93cml0ZVJlY3Vyc2lv
bklzVG9vRGVlcDsKKworICAgIGlmIChtX3dyaXRlUmVjdXJzaW9uSXNUb29EZWVwKQorICAgICAg
IHJldHVybjsKKworI2lmZGVmIElOU1RSVU1FTlRfTEFZT1VUX1NDSEVEVUxJTkcKKyAgICBpZiAo
IW93bmVyRWxlbWVudCgpKQorICAgICAgICBwcmludGYoIkJlZ2lubmluZyBhIGRvY3VtZW50Lndy
aXRlIGF0ICVkXG4iLCBlbGFwc2VkVGltZSgpKTsKKyNlbmRpZgorCisgICAgYm9vbCBoYXNJbnNl
cnRpb25Qb2ludCA9IG1fcGFyc2VyICYmIG1fcGFyc2VyLT5oYXNJbnNlcnRpb25Qb2ludCgpOwor
ICAgIGlmICghaGFzSW5zZXJ0aW9uUG9pbnQgJiYgbV9pZ25vcmVEZXN0cnVjdGl2ZVdyaXRlQ291
bnQpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICghaGFzSW5zZXJ0aW9uUG9pbnQpCisgICAg
ICAgIG9wZW4ob3duZXJEb2N1bWVudCk7CisKKyAgICBBU1NFUlQobV9wYXJzZXIpOworICAgIG1f
cGFyc2VyLT5pbnNlcnQodGV4dCk7CisKKyNpZmRlZiBJTlNUUlVNRU5UX0xBWU9VVF9TQ0hFRFVM
SU5HCisgICAgaWYgKCFvd25lckVsZW1lbnQoKSkKKyAgICAgICAgcHJpbnRmKCJFbmRpbmcgYSBk
b2N1bWVudC53cml0ZSBhdCAlZFxuIiwgZWxhcHNlZFRpbWUoKSk7CisjZW5kaWYgICAgCit9CisK
K3ZvaWQgRG9jdW1lbnQ6OndyaXRlKGNvbnN0IFN0cmluZyYgdGV4dCwgRG9jdW1lbnQqIG93bmVy
RG9jdW1lbnQpCit7CisgICAgd3JpdGUoU2VnbWVudGVkU3RyaW5nKHRleHQpLCBvd25lckRvY3Vt
ZW50KTsKK30KKwordm9pZCBEb2N1bWVudDo6d3JpdGVsbihjb25zdCBTdHJpbmcmIHRleHQsIERv
Y3VtZW50KiBvd25lckRvY3VtZW50KQoreworICAgIHdyaXRlKHRleHQsIG93bmVyRG9jdW1lbnQp
OworICAgIHdyaXRlKCJcbiIsIG93bmVyRG9jdW1lbnQpOworfQorCitjb25zdCBLVVJMJiBEb2N1
bWVudDo6dmlydHVhbFVSTCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fdXJsOworfQorCitLVVJM
IERvY3VtZW50Ojp2aXJ0dWFsQ29tcGxldGVVUkwoY29uc3QgU3RyaW5nJiB1cmwpIGNvbnN0Cit7
CisgICAgcmV0dXJuIGNvbXBsZXRlVVJMKHVybCk7Cit9CisKK2RvdWJsZSBEb2N1bWVudDo6bWlu
aW11bVRpbWVySW50ZXJ2YWwoKSBjb25zdAoreworICAgIFBhZ2UqIHAgPSBwYWdlKCk7CisgICAg
aWYgKCFwKQorICAgICAgICByZXR1cm4gU2NyaXB0RXhlY3V0aW9uQ29udGV4dDo6bWluaW11bVRp
bWVySW50ZXJ2YWwoKTsKKyAgICByZXR1cm4gcC0+c2V0dGluZ3MoKS0+bWluRE9NVGltZXJJbnRl
cnZhbCgpOworfQorCitFdmVudFRhcmdldCogRG9jdW1lbnQ6OmVycm9yRXZlbnRUYXJnZXQoKQor
eworICAgIHJldHVybiBkb21XaW5kb3coKTsKK30KKwordm9pZCBEb2N1bWVudDo6bG9nRXhjZXB0
aW9uVG9Db25zb2xlKGNvbnN0IFN0cmluZyYgZXJyb3JNZXNzYWdlLCBjb25zdCBTdHJpbmcmIHNv
dXJjZVVSTCwgaW50IGxpbmVOdW1iZXIsIFBhc3NSZWZQdHI8U2NyaXB0Q2FsbFN0YWNrPiBjYWxs
U3RhY2spCit7CisgICAgYWRkQ29uc29sZU1lc3NhZ2UoSlNNZXNzYWdlU291cmNlLCBMb2dNZXNz
YWdlVHlwZSwgRXJyb3JNZXNzYWdlTGV2ZWwsIGVycm9yTWVzc2FnZSwgc291cmNlVVJMLCBsaW5l
TnVtYmVyLCBjYWxsU3RhY2spOworfQorCit2b2lkIERvY3VtZW50OjpzZXRVUkwoY29uc3QgS1VS
TCYgdXJsKQoreworICAgIGNvbnN0IEtVUkwmIG5ld1VSTCA9IHVybC5pc0VtcHR5KCkgPyBibGFu
a1VSTCgpIDogdXJsOworICAgIGlmIChuZXdVUkwgPT0gbV91cmwpCisgICAgICAgIHJldHVybjsK
KworICAgIG1fdXJsID0gbmV3VVJMOworICAgIG1fZG9jdW1lbnRVUkkgPSBtX3VybC5zdHJpbmco
KTsKKyAgICB1cGRhdGVCYXNlVVJMKCk7CisgICAgY29udGV4dEZlYXR1cmVzKCktPnVybERpZENo
YW5nZSh0aGlzKTsKK30KKwordm9pZCBEb2N1bWVudDo6dXBkYXRlQmFzZVVSTCgpCit7CisgICAg
S1VSTCBvbGRCYXNlVVJMID0gbV9iYXNlVVJMOworICAgIC8vIERPTSAzIENvcmU6IFdoZW4gdGhl
IERvY3VtZW50IHN1cHBvcnRzIHRoZSBmZWF0dXJlICJIVE1MIiBbRE9NIExldmVsIDIgSFRNTF0s
IHRoZSBiYXNlIFVSSSBpcyBjb21wdXRlZCB1c2luZworICAgIC8vIGZpcnN0IHRoZSB2YWx1ZSBv
ZiB0aGUgaHJlZiBhdHRyaWJ1dGUgb2YgdGhlIEhUTUwgQkFTRSBlbGVtZW50IGlmIGFueSwgYW5k
IHRoZSB2YWx1ZSBvZiB0aGUgZG9jdW1lbnRVUkkgYXR0cmlidXRlCisgICAgLy8gZnJvbSB0aGUg
RG9jdW1lbnQgaW50ZXJmYWNlIG90aGVyd2lzZS4KKyAgICBpZiAoIW1fYmFzZUVsZW1lbnRVUkwu
aXNFbXB0eSgpKQorICAgICAgICBtX2Jhc2VVUkwgPSBtX2Jhc2VFbGVtZW50VVJMOworICAgIGVs
c2UgaWYgKCFtX2Jhc2VVUkxPdmVycmlkZS5pc0VtcHR5KCkpCisgICAgICAgIG1fYmFzZVVSTCA9
IG1fYmFzZVVSTE92ZXJyaWRlOworICAgIGVsc2UgeworICAgICAgICAvLyBUaGUgZG9jdW1lbnRV
UkkgYXR0cmlidXRlIGlzIHJlYWQtb25seSBmcm9tIEphdmFTY3JpcHQsIGJ1dCB3cml0YWJsZSBm
cm9tIE9iamVjdGl2ZSBDLCBzbyB3ZSBuZWVkIHRvIHJldGFpbgorICAgICAgICAvLyB0aGlzIGZh
bGxiYWNrIGJlaGF2aW9yLiBXZSB1c2UgYSBudWxsIGJhc2UgVVJMLCBzaW5jZSB0aGUgZG9jdW1l
bnRVUkkgYXR0cmlidXRlIGlzIGFuIGFyYml0cmFyeSBzdHJpbmcKKyAgICAgICAgLy8gYW5kIERP
TSAzIENvcmUgZG9lcyBub3Qgc3BlY2lmeSBob3cgaXQgc2hvdWxkIGJlIHJlc29sdmVkLgorICAg
ICAgICBtX2Jhc2VVUkwgPSBLVVJMKEtVUkwoKSwgZG9jdW1lbnRVUkkoKSk7CisgICAgfQorICAg
IHNlbGVjdG9yUXVlcnlDYWNoZSgpLT5pbnZhbGlkYXRlKCk7CisKKyAgICBpZiAoIW1fYmFzZVVS
TC5pc1ZhbGlkKCkpCisgICAgICAgIG1fYmFzZVVSTCA9IEtVUkwoKTsKKworICAgIGlmIChtX2Vs
ZW1TaGVldCkgeworICAgICAgICAvLyBFbGVtZW50IHNoZWV0IGlzIHNpbGx5LiBJdCBuZXZlciBj
b250YWlucyBhbnl0aGluZy4KKyAgICAgICAgQVNTRVJUKCFtX2VsZW1TaGVldC0+Y29udGVudHMo
KS0+cnVsZUNvdW50KCkpOworICAgICAgICBib29sIHVzZXNSZW1Vbml0cyA9IG1fZWxlbVNoZWV0
LT5jb250ZW50cygpLT51c2VzUmVtVW5pdHMoKTsKKyAgICAgICAgbV9lbGVtU2hlZXQgPSBDU1NT
dHlsZVNoZWV0OjpjcmVhdGVJbmxpbmUodGhpcywgbV9iYXNlVVJMKTsKKyAgICAgICAgLy8gRklY
TUU6IFNvIHdlIGFyZSBub3QgcmVhbGx5IHRoZSBwYXJzZXIuIFRoZSByaWdodCBmaXggaXMgdG8g
ZWxpbWluYXRlIHRoZSBlbGVtZW50IHNoZWV0IGNvbXBsZXRlbHkuCisgICAgICAgIG1fZWxlbVNo
ZWV0LT5jb250ZW50cygpLT5wYXJzZXJTZXRVc2VzUmVtVW5pdHModXNlc1JlbVVuaXRzKTsKKyAg
ICB9CisKKyAgICBpZiAoIWVxdWFsSWdub3JpbmdGcmFnbWVudElkZW50aWZpZXIob2xkQmFzZVVS
TCwgbV9iYXNlVVJMKSkgeworICAgICAgICAvLyBCYXNlIFVSTCBjaGFuZ2UgY2hhbmdlcyBhbnkg
cmVsYXRpdmUgdmlzaXRlZCBsaW5rcy4KKyAgICAgICAgLy8gRklYTUU6IFRoZXJlIGFyZSBvdGhl
ciBVUkxzIGluIHRoZSB0cmVlIHRoYXQgd291bGQgbmVlZCB0byBiZSByZS1ldmFsdWF0ZWQgb24g
ZHluYW1pYyBiYXNlIFVSTCBjaGFuZ2UuIFN0eWxlIHNob3VsZCBiZSBpbnZhbGlkYXRlZCB0b28u
CisgICAgICAgIGZvciAoTm9kZSogbm9kZSA9IGZpcnN0Q2hpbGQoKTsgbm9kZTsgbm9kZSA9IG5v
ZGUtPnRyYXZlcnNlTmV4dE5vZGUoKSkgeworICAgICAgICAgICAgaWYgKG5vZGUtPmhhc1RhZ05h
bWUoYVRhZykpCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTEFuY2hvckVsZW1lbnQq
Pihub2RlKS0+aW52YWxpZGF0ZUNhY2hlZFZpc2l0ZWRMaW5rSGFzaCgpOworICAgICAgICB9Cisg
ICAgfQorfQorCit2b2lkIERvY3VtZW50OjpzZXRCYXNlVVJMT3ZlcnJpZGUoY29uc3QgS1VSTCYg
dXJsKQoreworICAgIG1fYmFzZVVSTE92ZXJyaWRlID0gdXJsOworICAgIHVwZGF0ZUJhc2VVUkwo
KTsKK30KKwordm9pZCBEb2N1bWVudDo6cHJvY2Vzc0Jhc2VFbGVtZW50KCkKK3sKKyAgICAvLyBG
aW5kIHRoZSBmaXJzdCBocmVmIGF0dHJpYnV0ZSBpbiBhIGJhc2UgZWxlbWVudCBhbmQgdGhlIGZp
cnN0IHRhcmdldCBhdHRyaWJ1dGUgaW4gYSBiYXNlIGVsZW1lbnQuCisgICAgY29uc3QgQXRvbWlj
U3RyaW5nKiBocmVmID0gMDsKKyAgICBjb25zdCBBdG9taWNTdHJpbmcqIHRhcmdldCA9IDA7Cisg
ICAgZm9yIChOb2RlKiBub2RlID0gZG9jdW1lbnQoKS0+Zmlyc3RDaGlsZCgpOyBub2RlICYmICgh
aHJlZiB8fCAhdGFyZ2V0KTsgbm9kZSA9IG5vZGUtPnRyYXZlcnNlTmV4dE5vZGUoKSkgeworICAg
ICAgICBpZiAobm9kZS0+aGFzVGFnTmFtZShiYXNlVGFnKSkgeworICAgICAgICAgICAgaWYgKCFo
cmVmKSB7CisgICAgICAgICAgICAgICAgY29uc3QgQXRvbWljU3RyaW5nJiB2YWx1ZSA9IHN0YXRp
Y19jYXN0PEVsZW1lbnQqPihub2RlKS0+ZmFzdEdldEF0dHJpYnV0ZShocmVmQXR0cik7CisgICAg
ICAgICAgICAgICAgaWYgKCF2YWx1ZS5pc051bGwoKSkKKyAgICAgICAgICAgICAgICAgICAgaHJl
ZiA9ICZ2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghdGFyZ2V0KSB7Cisg
ICAgICAgICAgICAgICAgY29uc3QgQXRvbWljU3RyaW5nJiB2YWx1ZSA9IHN0YXRpY19jYXN0PEVs
ZW1lbnQqPihub2RlKS0+ZmFzdEdldEF0dHJpYnV0ZSh0YXJnZXRBdHRyKTsKKyAgICAgICAgICAg
ICAgICBpZiAoIXZhbHVlLmlzTnVsbCgpKQorICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSAm
dmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBGSVhNRTog
U2luY2UgdGhpcyBkb2Vzbid0IHNoYXJlIGNvZGUgd2l0aCBjb21wbGV0ZVVSTCBpdCBtYXkgbm90
IGhhbmRsZSBlbmNvZGluZ3MgY29ycmVjdGx5LgorICAgIEtVUkwgYmFzZUVsZW1lbnRVUkw7Cisg
ICAgaWYgKGhyZWYpIHsKKyAgICAgICAgU3RyaW5nIHN0cmlwcGVkSHJlZiA9IHN0cmlwTGVhZGlu
Z0FuZFRyYWlsaW5nSFRNTFNwYWNlcygqaHJlZik7CisgICAgICAgIGlmICghc3RyaXBwZWRIcmVm
LmlzRW1wdHkoKSkKKyAgICAgICAgICAgIGJhc2VFbGVtZW50VVJMID0gS1VSTCh1cmwoKSwgc3Ry
aXBwZWRIcmVmKTsKKyAgICB9CisgICAgaWYgKG1fYmFzZUVsZW1lbnRVUkwgIT0gYmFzZUVsZW1l
bnRVUkwpIHsKKyAgICAgICAgbV9iYXNlRWxlbWVudFVSTCA9IGJhc2VFbGVtZW50VVJMOworICAg
ICAgICB1cGRhdGVCYXNlVVJMKCk7CisgICAgfQorCisgICAgbV9iYXNlVGFyZ2V0ID0gdGFyZ2V0
ID8gKnRhcmdldCA6IG51bGxBdG9tOworfQorCitTdHJpbmcgRG9jdW1lbnQ6OnVzZXJBZ2VudChj
b25zdCBLVVJMJiB1cmwpIGNvbnN0Cit7CisgICAgcmV0dXJuIGZyYW1lKCkgPyBmcmFtZSgpLT5s
b2FkZXIoKS0+dXNlckFnZW50KHVybCkgOiBTdHJpbmcoKTsKK30KKwordm9pZCBEb2N1bWVudDo6
ZGlzYWJsZUV2YWwoY29uc3QgU3RyaW5nJiBlcnJvck1lc3NhZ2UpCit7CisgICAgaWYgKCFmcmFt
ZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBmcmFtZSgpLT5zY3JpcHQoKS0+ZGlzYWJsZUV2
YWwoZXJyb3JNZXNzYWdlKTsKK30KKworYm9vbCBEb2N1bWVudDo6Y2FuTmF2aWdhdGUoRnJhbWUq
IHRhcmdldEZyYW1lKQoreworICAgIGlmICghbV9mcmFtZSkKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgLy8gRklYTUU6IFdlIHNob3VsZG4ndCBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aG91
dCBhIHRhcmdldCBmcmFtZSwgYnV0CisgICAgLy8gZmFzdC9mb3Jtcy9zdWJtaXQtdG8tYmxhbmst
bXVsdGlwbGUtdGltZXMuaHRtbCBkZXBlbmRzIG9uIHRoaXMgZnVuY3Rpb24KKyAgICAvLyByZXR1
cm5pbmcgdHJ1ZSB3aGVuIHN1cHBsaWVkIHdpdGggYSAwIHRhcmdldEZyYW1lLgorICAgIGlmICgh
dGFyZ2V0RnJhbWUpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gRnJhbWUtYnVzdGlu
ZyBpcyBnZW5lcmFsbHkgYWxsb3dlZCAodW5sZXNzIHdlJ3JlIHNhbmRib3hlZCBhbmQgcHJldmVu
dCBmcm9tIGZyYW1lLWJ1c3RpbmcpLgorICAgIGlmICghaXNTYW5kYm94ZWQoU2FuZGJveFRvcE5h
dmlnYXRpb24pICYmIHRhcmdldEZyYW1lID09IG1fZnJhbWUtPnRyZWUoKS0+dG9wKCkpCisgICAg
ICAgIHJldHVybiB0cnVlOworCisgICAgaWYgKGlzU2FuZGJveGVkKFNhbmRib3hOYXZpZ2F0aW9u
KSkgeworICAgICAgICBpZiAodGFyZ2V0RnJhbWUtPnRyZWUoKS0+aXNEZXNjZW5kYW50T2YobV9m
cmFtZSkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICBwcmludE5hdmlnYXRp
b25FcnJvck1lc3NhZ2UodGFyZ2V0RnJhbWUsIHVybCgpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgIH0KKworICAgIC8vIFRoaXMgaXMgdGhlIG5vcm1hbCBjYXNlLiBBIGRvY3VtZW50IGNh
biBuYXZpZ2F0ZSBpdHMgZGVjZW5kYW50IGZyYW1lcywKKyAgICAvLyBvciwgbW9yZSBnZW5lcmFs
bHksIGEgZG9jdW1lbnQgY2FuIG5hdmlnYXRlIGEgZnJhbWUgaWYgdGhlIGRvY3VtZW50IGlzCisg
ICAgLy8gaW4gdGhlIHNhbWUgb3JpZ2luIGFzIGFueSBvZiB0aGF0IGZyYW1lJ3MgYW5jZXN0b3Jz
IChpbiB0aGUgZnJhbWUKKyAgICAvLyBoaWVyYXJjaHkpLgorICAgIC8vCisgICAgLy8gU2VlIGh0
dHA6Ly93d3cuYWRhbWJhcnRoLmNvbS9wYXBlcnMvMjAwOC9iYXJ0aC1qYWNrc29uLW1pdGNoZWxs
LnBkZiBmb3IKKyAgICAvLyBoaXN0b3JpY2FsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgc2VjdXJp
dHkgY2hlY2suCisgICAgaWYgKGNhbkFjY2Vzc0FuY2VzdG9yKHNlY3VyaXR5T3JpZ2luKCksIHRh
cmdldEZyYW1lKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBUb3AtbGV2ZWwgZnJh
bWVzIGFyZSBlYXNpZXIgdG8gbmF2aWdhdGUgdGhhbiBvdGhlciBmcmFtZXMgYmVjYXVzZSB0aGV5
CisgICAgLy8gZGlzcGxheSB0aGVpciBVUkxzIGluIHRoZSBhZGRyZXNzIGJhciAoaW4gbW9zdCBi
cm93c2VycykuIEhvd2V2ZXIsIHRoZXJlCisgICAgLy8gYXJlIHN0aWxsIHNvbWUgcmVzdHJpY3Rp
b25zIG9uIG5hdmlnYXRpb24gdG8gYXZvaWQgbnVpc2FuY2UgYXR0YWNrcy4KKyAgICAvLyBTcGVj
aWZpY2FsbHksIGEgZG9jdW1lbnQgY2FuIG5hdmlnYXRlIGEgdG9wLWxldmVsIGZyYW1lIGlmIHRo
YXQgZnJhbWUKKyAgICAvLyBvcGVuZWQgdGhlIGRvY3VtZW50IG9yIGlmIHRoZSBkb2N1bWVudCBp
cyB0aGUgc2FtZS1vcmlnaW4gd2l0aCBhbnkgb2YKKyAgICAvLyB0aGUgdG9wLWxldmVsIGZyYW1l
J3Mgb3BlbmVyJ3MgYW5jZXN0b3JzIChpbiB0aGUgZnJhbWUgaGllcmFyY2h5KS4KKyAgICAvLwor
ICAgIC8vIEluIGJvdGggb2YgdGhlc2UgY2FzZXMsIHRoZSBkb2N1bWVudCBwZXJmb3JtaW5nIHRo
ZSBuYXZpZ2F0aW9uIGlzIGluCisgICAgLy8gc29tZSB3YXkgcmVsYXRlZCB0byB0aGUgZnJhbWUg
YmVpbmcgbmF2aWdhdGUgKGUuZy4sIGJ5IHRoZSAib3BlbmVyIgorICAgIC8vIGFuZC9vciAicGFy
ZW50IiByZWxhdGlvbikuIFJlcXVpcmluZyBzb21lIHNvcnQgb2YgcmVsYXRpb24gcHJldmVudHMg
YQorICAgIC8vIGRvY3VtZW50IGZyb20gbmF2aWdhdGluZyBhcmJpdHJhcnksIHVucmVsYXRlZCB0
b3AtbGV2ZWwgZnJhbWVzLgorICAgIGlmICghdGFyZ2V0RnJhbWUtPnRyZWUoKS0+cGFyZW50KCkp
IHsKKyAgICAgICAgaWYgKHRhcmdldEZyYW1lID09IG1fZnJhbWUtPmxvYWRlcigpLT5vcGVuZXIo
KSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIGlmIChjYW5BY2Nlc3NBbmNl
c3RvcihzZWN1cml0eU9yaWdpbigpLCB0YXJnZXRGcmFtZS0+bG9hZGVyKCktPm9wZW5lcigpKSkK
KyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaW50TmF2aWdhdGlvbkVy
cm9yTWVzc2FnZSh0YXJnZXRGcmFtZSwgdXJsKCkpOworICAgIHJldHVybiBmYWxzZTsKK30KKwor
RnJhbWUqIERvY3VtZW50OjpmaW5kVW5zYWZlUGFyZW50U2Nyb2xsUHJvcGFnYXRpb25Cb3VuZGFy
eSgpCit7CisgICAgRnJhbWUqIGN1cnJlbnRGcmFtZSA9IG1fZnJhbWU7CisgICAgRnJhbWUqIGFu
Y2VzdG9yRnJhbWUgPSBjdXJyZW50RnJhbWUtPnRyZWUoKS0+cGFyZW50KCk7IAorCisgICAgd2hp
bGUgKGFuY2VzdG9yRnJhbWUpIHsKKyAgICAgICAgaWYgKCFhbmNlc3RvckZyYW1lLT5kb2N1bWVu
dCgpLT5zZWN1cml0eU9yaWdpbigpLT5jYW5BY2Nlc3Moc2VjdXJpdHlPcmlnaW4oKSkpCisgICAg
ICAgICAgICByZXR1cm4gY3VycmVudEZyYW1lOworICAgICAgICBjdXJyZW50RnJhbWUgPSBhbmNl
c3RvckZyYW1lOworICAgICAgICBhbmNlc3RvckZyYW1lID0gYW5jZXN0b3JGcmFtZS0+dHJlZSgp
LT5wYXJlbnQoKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK0NTU1N0eWxlU2hlZXQqIERv
Y3VtZW50OjpwYWdlVXNlclNoZWV0KCkKK3sKKyAgICBpZiAobV9wYWdlVXNlclNoZWV0KQorICAg
ICAgICByZXR1cm4gbV9wYWdlVXNlclNoZWV0LmdldCgpOworICAgIAorICAgIFBhZ2UqIG93bmlu
Z1BhZ2UgPSBwYWdlKCk7CisgICAgaWYgKCFvd25pbmdQYWdlKQorICAgICAgICByZXR1cm4gMDsK
KyAgICAKKyAgICBTdHJpbmcgdXNlclNoZWV0VGV4dCA9IG93bmluZ1BhZ2UtPnVzZXJTdHlsZVNo
ZWV0KCk7CisgICAgaWYgKHVzZXJTaGVldFRleHQuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4g
MDsKKyAgICAKKyAgICAvLyBQYXJzZSB0aGUgc2hlZXQgYW5kIGNhY2hlIGl0LgorICAgIG1fcGFn
ZVVzZXJTaGVldCA9IENTU1N0eWxlU2hlZXQ6OmNyZWF0ZUlubGluZSh0aGlzLCBzZXR0aW5ncygp
LT51c2VyU3R5bGVTaGVldExvY2F0aW9uKCkpOworICAgIG1fcGFnZVVzZXJTaGVldC0+Y29udGVu
dHMoKS0+c2V0SXNVc2VyU3R5bGVTaGVldCh0cnVlKTsKKyAgICBtX3BhZ2VVc2VyU2hlZXQtPmNv
bnRlbnRzKCktPnBhcnNlU3RyaW5nKHVzZXJTaGVldFRleHQpOworICAgIHJldHVybiBtX3BhZ2VV
c2VyU2hlZXQuZ2V0KCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmNsZWFyUGFnZVVzZXJTaGVldCgp
Cit7CisgICAgaWYgKG1fcGFnZVVzZXJTaGVldCkgeworICAgICAgICBtX3BhZ2VVc2VyU2hlZXQg
PSAwOworICAgICAgICBzdHlsZVJlc29sdmVyQ2hhbmdlZChEZWZlclJlY2FsY1N0eWxlKTsKKyAg
ICB9Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnVwZGF0ZVBhZ2VVc2VyU2hlZXQoKQoreworICAgIGNs
ZWFyUGFnZVVzZXJTaGVldCgpOworICAgIGlmIChwYWdlVXNlclNoZWV0KCkpCisgICAgICAgIHN0
eWxlUmVzb2x2ZXJDaGFuZ2VkKFJlY2FsY1N0eWxlSW1tZWRpYXRlbHkpOworfQorCitjb25zdCBW
ZWN0b3I8UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4qIERvY3VtZW50OjpwYWdlR3JvdXBVc2VyU2hl
ZXRzKCkgY29uc3QKK3sKKyAgICBpZiAobV9wYWdlR3JvdXBVc2VyU2hlZXRDYWNoZVZhbGlkKQor
ICAgICAgICByZXR1cm4gbV9wYWdlR3JvdXBVc2VyU2hlZXRzLmdldCgpOworICAgIAorICAgIG1f
cGFnZUdyb3VwVXNlclNoZWV0Q2FjaGVWYWxpZCA9IHRydWU7CisgICAgCisgICAgUGFnZSogb3du
aW5nUGFnZSA9IHBhZ2UoKTsKKyAgICBpZiAoIW93bmluZ1BhZ2UpCisgICAgICAgIHJldHVybiAw
OworICAgICAgICAKKyAgICBjb25zdCBQYWdlR3JvdXAmIHBhZ2VHcm91cCA9IG93bmluZ1BhZ2Ut
Pmdyb3VwKCk7CisgICAgY29uc3QgVXNlclN0eWxlU2hlZXRNYXAqIHNoZWV0c01hcCA9IHBhZ2VH
cm91cC51c2VyU3R5bGVTaGVldHMoKTsKKyAgICBpZiAoIXNoZWV0c01hcCkKKyAgICAgICAgcmV0
dXJuIDA7CisKKyAgICBVc2VyU3R5bGVTaGVldE1hcDo6Y29uc3RfaXRlcmF0b3IgZW5kID0gc2hl
ZXRzTWFwLT5lbmQoKTsKKyAgICBmb3IgKFVzZXJTdHlsZVNoZWV0TWFwOjpjb25zdF9pdGVyYXRv
ciBpdCA9IHNoZWV0c01hcC0+YmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgIGNv
bnN0IFVzZXJTdHlsZVNoZWV0VmVjdG9yKiBzaGVldHMgPSBpdC0+c2Vjb25kLmdldCgpOworICAg
ICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2hlZXRzLT5zaXplKCk7ICsraSkgeworICAg
ICAgICAgICAgY29uc3QgVXNlclN0eWxlU2hlZXQqIHNoZWV0ID0gc2hlZXRzLT5hdChpKS5nZXQo
KTsKKyAgICAgICAgICAgIGlmIChzaGVldC0+aW5qZWN0ZWRGcmFtZXMoKSA9PSBJbmplY3RJblRv
cEZyYW1lT25seSAmJiBvd25lckVsZW1lbnQoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgICAgIGlmICghVXNlckNvbnRlbnRVUkxQYXR0ZXJuOjptYXRjaGVzUGF0dGVybnMo
dXJsKCksIHNoZWV0LT53aGl0ZWxpc3QoKSwgc2hlZXQtPmJsYWNrbGlzdCgpKSkKKyAgICAgICAg
ICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIFJlZlB0cjxDU1NTdHlsZVNoZWV0PiBncm91
cFNoZWV0ID0gQ1NTU3R5bGVTaGVldDo6Y3JlYXRlSW5saW5lKGNvbnN0X2Nhc3Q8RG9jdW1lbnQq
Pih0aGlzKSwgc2hlZXQtPnVybCgpKTsKKyAgICAgICAgICAgIGlmICghbV9wYWdlR3JvdXBVc2Vy
U2hlZXRzKQorICAgICAgICAgICAgICAgIG1fcGFnZUdyb3VwVXNlclNoZWV0cyA9IGFkb3B0UHRy
KG5ldyBWZWN0b3I8UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4pOworICAgICAgICAgICAgbV9wYWdl
R3JvdXBVc2VyU2hlZXRzLT5hcHBlbmQoZ3JvdXBTaGVldCk7CisgICAgICAgICAgICBncm91cFNo
ZWV0LT5jb250ZW50cygpLT5zZXRJc1VzZXJTdHlsZVNoZWV0KHNoZWV0LT5sZXZlbCgpID09IFVz
ZXJTdHlsZVVzZXJMZXZlbCk7CisgICAgICAgICAgICBncm91cFNoZWV0LT5jb250ZW50cygpLT5w
YXJzZVN0cmluZyhzaGVldC0+c291cmNlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0
dXJuIG1fcGFnZUdyb3VwVXNlclNoZWV0cy5nZXQoKTsKK30KKwordm9pZCBEb2N1bWVudDo6Y2xl
YXJQYWdlR3JvdXBVc2VyU2hlZXRzKCkKK3sKKyAgICBtX3BhZ2VHcm91cFVzZXJTaGVldENhY2hl
VmFsaWQgPSBmYWxzZTsKKyAgICBpZiAobV9wYWdlR3JvdXBVc2VyU2hlZXRzICYmIG1fcGFnZUdy
b3VwVXNlclNoZWV0cy0+c2l6ZSgpKSB7CisgICAgICAgIG1fcGFnZUdyb3VwVXNlclNoZWV0cy0+
Y2xlYXIoKTsKKyAgICAgICAgc3R5bGVSZXNvbHZlckNoYW5nZWQoRGVmZXJSZWNhbGNTdHlsZSk7
CisgICAgfQorfQorCit2b2lkIERvY3VtZW50Ojp1cGRhdGVQYWdlR3JvdXBVc2VyU2hlZXRzKCkK
K3sKKyAgICBjbGVhclBhZ2VHcm91cFVzZXJTaGVldHMoKTsKKyAgICBpZiAocGFnZUdyb3VwVXNl
clNoZWV0cygpICYmIHBhZ2VHcm91cFVzZXJTaGVldHMoKS0+c2l6ZSgpKQorICAgICAgICBzdHls
ZVJlc29sdmVyQ2hhbmdlZChSZWNhbGNTdHlsZUltbWVkaWF0ZWx5KTsKK30KKwordm9pZCBEb2N1
bWVudDo6YWRkVXNlclNoZWV0KFBhc3NSZWZQdHI8U3R5bGVTaGVldENvbnRlbnRzPiB1c2VyU2hl
ZXQpCit7CisgICAgaWYgKCFtX3VzZXJTaGVldHMpCisgICAgICAgIG1fdXNlclNoZWV0cyA9IGFk
b3B0UHRyKG5ldyBWZWN0b3I8UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4pOworICAgIG1fdXNlclNo
ZWV0cy0+YXBwZW5kKENTU1N0eWxlU2hlZXQ6OmNyZWF0ZSh1c2VyU2hlZXQsIHRoaXMpKTsKKyAg
ICBzdHlsZVJlc29sdmVyQ2hhbmdlZChSZWNhbGNTdHlsZUltbWVkaWF0ZWx5KTsKK30KKwordm9p
ZCBEb2N1bWVudDo6c2VhbWxlc3NQYXJlbnRVcGRhdGVkU3R5bGVzaGVldHMoKQoreworICAgIHN0
eWxlUmVzb2x2ZXJDaGFuZ2VkKFJlY2FsY1N0eWxlSW1tZWRpYXRlbHkpOworfQorCitDU1NTdHls
ZVNoZWV0KiBEb2N1bWVudDo6ZWxlbWVudFNoZWV0KCkKK3sKKyAgICBpZiAoIW1fZWxlbVNoZWV0
KQorICAgICAgICBtX2VsZW1TaGVldCA9IENTU1N0eWxlU2hlZXQ6OmNyZWF0ZUlubGluZSh0aGlz
LCBtX2Jhc2VVUkwpOworICAgIHJldHVybiBtX2VsZW1TaGVldC5nZXQoKTsKK30KKworaW50IERv
Y3VtZW50Ojpub2RlQWJzSW5kZXgoTm9kZSAqbm9kZSkKK3sKKyAgICBBU1NFUlQobm9kZS0+ZG9j
dW1lbnQoKSA9PSB0aGlzKTsKKworICAgIGludCBhYnNJbmRleCA9IDA7CisgICAgZm9yIChOb2Rl
KiBuID0gbm9kZTsgbiAmJiBuICE9IHRoaXM7IG4gPSBuLT50cmF2ZXJzZVByZXZpb3VzTm9kZSgp
KQorICAgICAgICBhYnNJbmRleCsrOworICAgIHJldHVybiBhYnNJbmRleDsKK30KKworTm9kZSog
RG9jdW1lbnQ6Om5vZGVXaXRoQWJzSW5kZXgoaW50IGFic0luZGV4KQoreworICAgIE5vZGUqIG4g
PSB0aGlzOworICAgIGZvciAoaW50IGkgPSAwOyBuICYmIChpIDwgYWJzSW5kZXgpOyBpKyspCisg
ICAgICAgIG4gPSBuLT50cmF2ZXJzZU5leHROb2RlKCk7CisgICAgcmV0dXJuIG47Cit9CisKK3Zv
aWQgRG9jdW1lbnQ6OnByb2Nlc3NIdHRwRXF1aXYoY29uc3QgU3RyaW5nJiBlcXVpdiwgY29uc3Qg
U3RyaW5nJiBjb250ZW50KQoreworICAgIEFTU0VSVCghZXF1aXYuaXNOdWxsKCkgJiYgIWNvbnRl
bnQuaXNOdWxsKCkpOworCisgICAgRnJhbWUqIGZyYW1lID0gdGhpcy0+ZnJhbWUoKTsKKworICAg
IGlmIChlcXVhbElnbm9yaW5nQ2FzZShlcXVpdiwgImRlZmF1bHQtc3R5bGUiKSkgeworICAgICAg
ICAvLyBUaGUgcHJlZmVycmVkIHN0eWxlIHNldCBoYXMgYmVlbiBvdmVycmlkZGVuIGFzIHBlciBz
ZWN0aW9uIAorICAgICAgICAvLyAxNC4zLjIgb2YgdGhlIEhUTUw0LjAgc3BlY2lmaWNhdGlvbi4g
IFdlIG5lZWQgdG8gdXBkYXRlIHRoZQorICAgICAgICAvLyBzaGVldCB1c2VkIHZhcmlhYmxlIGFu
ZCB0aGVuIHVwZGF0ZSBvdXIgc3R5bGUgc2VsZWN0b3IuIAorICAgICAgICAvLyBGb3IgbW9yZSBp
bmZvLCBzZWUgdGhlIHRlc3QgYXQ6CisgICAgICAgIC8vIGh0dHA6Ly93d3cuaGl4aWUuY2gvdGVz
dHMvZXZpbC9jc3MvaW1wb3J0L21haW4vcHJlZmVycmVkLmh0bWwKKyAgICAgICAgLy8gLWR3aAor
ICAgICAgICBtX3NlbGVjdGVkU3R5bGVzaGVldFNldCA9IGNvbnRlbnQ7CisgICAgICAgIG1fcHJl
ZmVycmVkU3R5bGVzaGVldFNldCA9IGNvbnRlbnQ7CisgICAgICAgIHN0eWxlUmVzb2x2ZXJDaGFu
Z2VkKERlZmVyUmVjYWxjU3R5bGUpOworICAgIH0gZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2Uo
ZXF1aXYsICJyZWZyZXNoIikpIHsKKyAgICAgICAgZG91YmxlIGRlbGF5OworICAgICAgICBTdHJp
bmcgdXJsOworICAgICAgICBpZiAoZnJhbWUgJiYgcGFyc2VIVFRQUmVmcmVzaChjb250ZW50LCB0
cnVlLCBkZWxheSwgdXJsKSkgeworICAgICAgICAgICAgaWYgKHVybC5pc0VtcHR5KCkpCisgICAg
ICAgICAgICAgICAgdXJsID0gbV91cmwuc3RyaW5nKCk7CisgICAgICAgICAgICBlbHNlCisgICAg
ICAgICAgICAgICAgdXJsID0gY29tcGxldGVVUkwodXJsKS5zdHJpbmcoKTsKKyAgICAgICAgICAg
IGZyYW1lLT5uYXZpZ2F0aW9uU2NoZWR1bGVyKCktPnNjaGVkdWxlUmVkaXJlY3QoZGVsYXksIHVy
bCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGVxdWl2LCAi
c2V0LWNvb2tpZSIpKSB7CisgICAgICAgIC8vIEZJWE1FOiBtYWtlIHNldENvb2tpZSB3b3JrIG9u
IFhNTCBkb2N1bWVudHMgdG9vOyBlLmcuIGluIGNhc2Ugb2YgPGh0bWw6bWV0YSAuLi4uLj4KKyAg
ICAgICAgaWYgKGlzSFRNTERvY3VtZW50KCkpIHsKKyAgICAgICAgICAgIEV4Y2VwdGlvbkNvZGUg
ZWM7IC8vIEV4Y2VwdGlvbiAoZm9yIHNhbmRib3hlZCBkb2N1bWVudHMpIGlnbm9yZWQuCisgICAg
ICAgICAgICBzdGF0aWNfY2FzdDxIVE1MRG9jdW1lbnQqPih0aGlzKS0+c2V0Q29va2llKGNvbnRl
bnQsIGVjKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoZXF1
aXYsICJjb250ZW50LWxhbmd1YWdlIikpCisgICAgICAgIHNldENvbnRlbnRMYW5ndWFnZShjb250
ZW50KTsKKyAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZShlcXVpdiwgIngtZG5zLXByZWZl
dGNoLWNvbnRyb2wiKSkKKyAgICAgICAgcGFyc2VETlNQcmVmZXRjaENvbnRyb2xIZWFkZXIoY29u
dGVudCk7CisgICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoZXF1aXYsICJ4LWZyYW1lLW9w
dGlvbnMiKSkgeworICAgICAgICBpZiAoZnJhbWUpIHsKKyAgICAgICAgICAgIEZyYW1lTG9hZGVy
KiBmcmFtZUxvYWRlciA9IGZyYW1lLT5sb2FkZXIoKTsKKyAgICAgICAgICAgIGlmIChmcmFtZUxv
YWRlci0+c2hvdWxkSW50ZXJydXB0TG9hZEZvclhGcmFtZU9wdGlvbnMoY29udGVudCwgdXJsKCkp
KSB7CisgICAgICAgICAgICAgICAgZnJhbWVMb2FkZXItPnN0b3BBbGxMb2FkZXJzKCk7CisgICAg
ICAgICAgICAgICAgZnJhbWUtPm5hdmlnYXRpb25TY2hlZHVsZXIoKS0+c2NoZWR1bGVMb2NhdGlv
bkNoYW5nZShzZWN1cml0eU9yaWdpbigpLCBibGFua1VSTCgpLCBTdHJpbmcoKSk7CisKKyAgICAg
ICAgICAgICAgICBERUZJTkVfU1RBVElDX0xPQ0FMKFN0cmluZywgY29uc29sZU1lc3NhZ2UsIChB
U0NJSUxpdGVyYWwoIlJlZnVzZWQgdG8gZGlzcGxheSBkb2N1bWVudCBiZWNhdXNlIGRpc3BsYXkg
Zm9yYmlkZGVuIGJ5IFgtRnJhbWUtT3B0aW9ucy5cbiIpKSk7CisgICAgICAgICAgICAgICAgYWRk
Q29uc29sZU1lc3NhZ2UoSlNNZXNzYWdlU291cmNlLCBMb2dNZXNzYWdlVHlwZSwgRXJyb3JNZXNz
YWdlTGV2ZWwsIGNvbnNvbGVNZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAg
IH0gZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoZXF1aXYsICJ4LXdlYmtpdC1jc3AiKSkKKyAg
ICAgICAgY29udGVudFNlY3VyaXR5UG9saWN5KCktPmRpZFJlY2VpdmVIZWFkZXIoY29udGVudCwg
Q29udGVudFNlY3VyaXR5UG9saWN5OjpFbmZvcmNlUG9saWN5KTsKKyAgICBlbHNlIGlmIChlcXVh
bElnbm9yaW5nQ2FzZShlcXVpdiwgIngtd2Via2l0LWNzcC1yZXBvcnQtb25seSIpKQorICAgICAg
ICBjb250ZW50U2VjdXJpdHlQb2xpY3koKS0+ZGlkUmVjZWl2ZUhlYWRlcihjb250ZW50LCBDb250
ZW50U2VjdXJpdHlQb2xpY3k6OlJlcG9ydE9ubHkpOworfQorCisvLyBUaG91Z2ggaXNzcGFjZSgp
IGNvbnNpZGVycyBcdCBhbmQgXHYgdG8gYmUgd2hpdGVzcGFjZSwgV2luIElFIGRvZXNuJ3QuCitz
dGF0aWMgYm9vbCBpc1NlcGFyYXRvcihVQ2hhciBjKQoreworICAgIHJldHVybiBjID09ICcgJyB8
fCBjID09ICdcdCcgfHwgYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJyB8fCBjID09ICc9JyB8fCBjID09
ICcsJyB8fCBjID09ICdcMCc7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnByb2Nlc3NBcmd1bWVudHMo
Y29uc3QgU3RyaW5nJiBmZWF0dXJlcywgdm9pZCogZGF0YSwgQXJndW1lbnRzQ2FsbGJhY2sgY2Fs
bGJhY2spCit7CisgICAgLy8gVHJlYWQgbGlnaHRseSBpbiB0aGlzIGNvZGUgLS0gaXQgd2FzIHNw
ZWNpZmljYWxseSBkZXNpZ25lZCB0byBtaW1pYyBXaW4gSUUncyBwYXJzaW5nIGJlaGF2aW9yLgor
ICAgIGludCBrZXlCZWdpbiwga2V5RW5kOworICAgIGludCB2YWx1ZUJlZ2luLCB2YWx1ZUVuZDsK
KworICAgIGludCBpID0gMDsKKyAgICBpbnQgbGVuZ3RoID0gZmVhdHVyZXMubGVuZ3RoKCk7Cisg
ICAgU3RyaW5nIGJ1ZmZlciA9IGZlYXR1cmVzLmxvd2VyKCk7CisgICAgd2hpbGUgKGkgPCBsZW5n
dGgpIHsKKyAgICAgICAgLy8gc2tpcCB0byBmaXJzdCBub24tc2VwYXJhdG9yLCBidXQgZG9uJ3Qg
c2tpcCBwYXN0IHRoZSBlbmQgb2YgdGhlIHN0cmluZworICAgICAgICB3aGlsZSAoaXNTZXBhcmF0
b3IoYnVmZmVyW2ldKSkgeworICAgICAgICAgICAgaWYgKGkgPj0gbGVuZ3RoKQorICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgICAgIGtleUJl
Z2luID0gaTsKKworICAgICAgICAvLyBza2lwIHRvIGZpcnN0IHNlcGFyYXRvcgorICAgICAgICB3
aGlsZSAoIWlzU2VwYXJhdG9yKGJ1ZmZlcltpXSkpCisgICAgICAgICAgICBpKys7CisgICAgICAg
IGtleUVuZCA9IGk7CisKKyAgICAgICAgLy8gc2tpcCB0byBmaXJzdCAnPScsIGJ1dCBkb24ndCBz
a2lwIHBhc3QgYSAnLCcgb3IgdGhlIGVuZCBvZiB0aGUgc3RyaW5nCisgICAgICAgIHdoaWxlIChi
dWZmZXJbaV0gIT0gJz0nKSB7CisgICAgICAgICAgICBpZiAoYnVmZmVyW2ldID09ICcsJyB8fCBp
ID49IGxlbmd0aCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGkrKzsKKyAg
ICAgICAgfQorCisgICAgICAgIC8vIHNraXAgdG8gZmlyc3Qgbm9uLXNlcGFyYXRvciwgYnV0IGRv
bid0IHNraXAgcGFzdCBhICcsJyBvciB0aGUgZW5kIG9mIHRoZSBzdHJpbmcKKyAgICAgICAgd2hp
bGUgKGlzU2VwYXJhdG9yKGJ1ZmZlcltpXSkpIHsKKyAgICAgICAgICAgIGlmIChidWZmZXJbaV0g
PT0gJywnIHx8IGkgPj0gbGVuZ3RoKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAg
ICAgaSsrOworICAgICAgICB9CisgICAgICAgIHZhbHVlQmVnaW4gPSBpOworCisgICAgICAgIC8v
IHNraXAgdG8gZmlyc3Qgc2VwYXJhdG9yCisgICAgICAgIHdoaWxlICghaXNTZXBhcmF0b3IoYnVm
ZmVyW2ldKSkKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgdmFsdWVFbmQgPSBpOworCisgICAg
ICAgIEFTU0VSVChpIDw9IGxlbmd0aCk7CisKKyAgICAgICAgU3RyaW5nIGtleVN0cmluZyA9IGJ1
ZmZlci5zdWJzdHJpbmcoa2V5QmVnaW4sIGtleUVuZCAtIGtleUJlZ2luKTsKKyAgICAgICAgU3Ry
aW5nIHZhbHVlU3RyaW5nID0gYnVmZmVyLnN1YnN0cmluZyh2YWx1ZUJlZ2luLCB2YWx1ZUVuZCAt
IHZhbHVlQmVnaW4pOworICAgICAgICBjYWxsYmFjayhrZXlTdHJpbmcsIHZhbHVlU3RyaW5nLCB0
aGlzLCBkYXRhKTsKKyAgICB9Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnByb2Nlc3NWaWV3cG9ydChj
b25zdCBTdHJpbmcmIGZlYXR1cmVzLCBWaWV3cG9ydEFyZ3VtZW50czo6VHlwZSBvcmlnaW4pCit7
CisgICAgQVNTRVJUKCFmZWF0dXJlcy5pc051bGwoKSk7CisKKyAgICBpZiAob3JpZ2luIDwgbV92
aWV3cG9ydEFyZ3VtZW50cy50eXBlKQorICAgICAgICByZXR1cm47CisKKyAgICBtX3ZpZXdwb3J0
QXJndW1lbnRzID0gVmlld3BvcnRBcmd1bWVudHMob3JpZ2luKTsKKyAgICBwcm9jZXNzQXJndW1l
bnRzKGZlYXR1cmVzLCAodm9pZCopJm1fdmlld3BvcnRBcmd1bWVudHMsICZzZXRWaWV3cG9ydEZl
YXR1cmUpOworCisgICAgdXBkYXRlVmlld3BvcnRBcmd1bWVudHMoKTsKK30KKwordm9pZCBEb2N1
bWVudDo6dXBkYXRlVmlld3BvcnRBcmd1bWVudHMoKQoreworICAgIGlmIChwYWdlKCkgJiYgcGFn
ZSgpLT5tYWluRnJhbWUoKSA9PSBmcmFtZSgpKSB7CisjaWZuZGVmIE5ERUJVRworICAgICAgICBt
X2RpZERpc3BhdGNoVmlld3BvcnRQcm9wZXJ0aWVzQ2hhbmdlZCA9IHRydWU7CisjZW5kaWYKKyAg
ICAgICAgcGFnZSgpLT5jaHJvbWUoKS0+ZGlzcGF0Y2hWaWV3cG9ydFByb3BlcnRpZXNEaWRDaGFu
Z2UobV92aWV3cG9ydEFyZ3VtZW50cyk7CisgICAgfQorfQorCit2b2lkIERvY3VtZW50Ojpwcm9j
ZXNzUmVmZXJyZXJQb2xpY3koY29uc3QgU3RyaW5nJiBwb2xpY3kpCit7CisgICAgQVNTRVJUKCFw
b2xpY3kuaXNOdWxsKCkpOworCisgICAgbV9yZWZlcnJlclBvbGljeSA9IFJlZmVycmVyUG9saWN5
RGVmYXVsdDsKKworICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZShwb2xpY3ksICJuZXZlciIpKQor
ICAgICAgICBtX3JlZmVycmVyUG9saWN5ID0gUmVmZXJyZXJQb2xpY3lOZXZlcjsKKyAgICBlbHNl
IGlmIChlcXVhbElnbm9yaW5nQ2FzZShwb2xpY3ksICJhbHdheXMiKSkKKyAgICAgICAgbV9yZWZl
cnJlclBvbGljeSA9IFJlZmVycmVyUG9saWN5QWx3YXlzOworICAgIGVsc2UgaWYgKGVxdWFsSWdu
b3JpbmdDYXNlKHBvbGljeSwgIm9yaWdpbiIpKQorICAgICAgICBtX3JlZmVycmVyUG9saWN5ID0g
UmVmZXJyZXJQb2xpY3lPcmlnaW47Cit9CisKK01vdXNlRXZlbnRXaXRoSGl0VGVzdFJlc3VsdHMg
RG9jdW1lbnQ6OnByZXBhcmVNb3VzZUV2ZW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiByZXF1ZXN0
LCBjb25zdCBMYXlvdXRQb2ludCYgZG9jdW1lbnRQb2ludCwgY29uc3QgUGxhdGZvcm1Nb3VzZUV2
ZW50JiBldmVudCkKK3sKKyAgICBBU1NFUlQoIXJlbmRlcmVyKCkgfHwgcmVuZGVyZXIoKS0+aXNS
ZW5kZXJWaWV3KCkpOworCisgICAgaWYgKCFyZW5kZXJlcigpKQorICAgICAgICByZXR1cm4gTW91
c2VFdmVudFdpdGhIaXRUZXN0UmVzdWx0cyhldmVudCwgSGl0VGVzdFJlc3VsdChMYXlvdXRQb2lu
dCgpKSk7CisKKyAgICBIaXRUZXN0UmVzdWx0IHJlc3VsdChkb2N1bWVudFBvaW50KTsKKyAgICBy
ZW5kZXJWaWV3KCktPmhpdFRlc3QocmVxdWVzdCwgcmVzdWx0KTsKKworICAgIGlmICghcmVxdWVz
dC5yZWFkT25seSgpKQorICAgICAgICB1cGRhdGVTdHlsZUlmTmVlZGVkKCk7CisKKyAgICByZXR1
cm4gTW91c2VFdmVudFdpdGhIaXRUZXN0UmVzdWx0cyhldmVudCwgcmVzdWx0KTsKK30KKworLy8g
RE9NIFNlY3Rpb24gMS4xLjEKK2Jvb2wgRG9jdW1lbnQ6OmNoaWxkVHlwZUFsbG93ZWQoTm9kZVR5
cGUgdHlwZSkgY29uc3QKK3sKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEFUVFJJQlVU
RV9OT0RFOgorICAgIGNhc2UgQ0RBVEFfU0VDVElPTl9OT0RFOgorICAgIGNhc2UgRE9DVU1FTlRf
RlJBR01FTlRfTk9ERToKKyAgICBjYXNlIERPQ1VNRU5UX05PREU6CisgICAgY2FzZSBFTlRJVFlf
Tk9ERToKKyAgICBjYXNlIEVOVElUWV9SRUZFUkVOQ0VfTk9ERToKKyAgICBjYXNlIE5PVEFUSU9O
X05PREU6CisgICAgY2FzZSBURVhUX05PREU6CisgICAgY2FzZSBYUEFUSF9OQU1FU1BBQ0VfTk9E
RToKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGNhc2UgQ09NTUVOVF9OT0RFOgorICAgIGNh
c2UgUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICBjYXNlIERPQ1VNRU5UX1RZUEVfTk9ERToKKyAgICBjYXNlIEVMRU1FTlRfTk9ERToKKyAgICAg
ICAgLy8gRG9jdW1lbnRzIG1heSBjb250YWluIG5vIG1vcmUgdGhhbiBvbmUgb2YgZWFjaCBvZiB0
aGVzZS4KKyAgICAgICAgLy8gKE9uZSBFbGVtZW50IGFuZCBvbmUgRG9jdW1lbnRUeXBlLikKKyAg
ICAgICAgZm9yIChOb2RlKiBjID0gZmlyc3RDaGlsZCgpOyBjOyBjID0gYy0+bmV4dFNpYmxpbmco
KSkKKyAgICAgICAgICAgIGlmIChjLT5ub2RlVHlwZSgpID09IHR5cGUpCisgICAgICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJu
IGZhbHNlOworfQorCitib29sIERvY3VtZW50OjpjYW5SZXBsYWNlQ2hpbGQoTm9kZSogbmV3Q2hp
bGQsIE5vZGUqIG9sZENoaWxkKQoreworICAgIGlmICghb2xkQ2hpbGQpCisgICAgICAgIC8vIENv
bnRhaW5lck5vZGU6OnJlcGxhY2VDaGlsZCB3aWxsIHJhaXNlIGEgTk9UX0ZPVU5EX0VSUi4KKyAg
ICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBpZiAob2xkQ2hpbGQtPm5vZGVUeXBlKCkgPT0gbmV3
Q2hpbGQtPm5vZGVUeXBlKCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgaW50IG51bURv
Y3R5cGVzID0gMDsKKyAgICBpbnQgbnVtRWxlbWVudHMgPSAwOworCisgICAgLy8gRmlyc3QsIGNo
ZWNrIGhvdyBtYW55IGRvY3R5cGVzIGFuZCBlbGVtZW50cyB3ZSBoYXZlLCBub3QgY291bnRpbmcK
KyAgICAvLyB0aGUgY2hpbGQgd2UncmUgYWJvdXQgdG8gcmVtb3ZlLgorICAgIGZvciAoTm9kZSog
YyA9IGZpcnN0Q2hpbGQoKTsgYzsgYyA9IGMtPm5leHRTaWJsaW5nKCkpIHsKKyAgICAgICAgaWYg
KGMgPT0gb2xkQ2hpbGQpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgCisgICAgICAg
IHN3aXRjaCAoYy0+bm9kZVR5cGUoKSkgeworICAgICAgICBjYXNlIERPQ1VNRU5UX1RZUEVfTk9E
RToKKyAgICAgICAgICAgIG51bURvY3R5cGVzKys7CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgY2FzZSBFTEVNRU5UX05PREU6CisgICAgICAgICAgICBudW1FbGVtZW50cysrOworICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgfQorICAgIH0KKyAgICAKKyAgICAvLyBUaGVuLCBzZWUgaG93IG1hbnkgZG9jdHlwZXMgYW5k
IGVsZW1lbnRzIG1pZ2h0IGJlIGFkZGVkIGJ5IHRoZSBuZXcgY2hpbGQuCisgICAgaWYgKG5ld0No
aWxkLT5ub2RlVHlwZSgpID09IERPQ1VNRU5UX0ZSQUdNRU5UX05PREUpIHsKKyAgICAgICAgZm9y
IChOb2RlKiBjID0gbmV3Q2hpbGQtPmZpcnN0Q2hpbGQoKTsgYzsgYyA9IGMtPm5leHRTaWJsaW5n
KCkpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYy0+bm9kZVR5cGUoKSkgeworICAgICAgICAgICAg
Y2FzZSBBVFRSSUJVVEVfTk9ERToKKyAgICAgICAgICAgIGNhc2UgQ0RBVEFfU0VDVElPTl9OT0RF
OgorICAgICAgICAgICAgY2FzZSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFOgorICAgICAgICAgICAg
Y2FzZSBET0NVTUVOVF9OT0RFOgorICAgICAgICAgICAgY2FzZSBFTlRJVFlfTk9ERToKKyAgICAg
ICAgICAgIGNhc2UgRU5USVRZX1JFRkVSRU5DRV9OT0RFOgorICAgICAgICAgICAgY2FzZSBOT1RB
VElPTl9OT0RFOgorICAgICAgICAgICAgY2FzZSBURVhUX05PREU6CisgICAgICAgICAgICBjYXNl
IFhQQVRIX05BTUVTUEFDRV9OT0RFOgorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICAgICAgICAgIGNhc2UgQ09NTUVOVF9OT0RFOgorICAgICAgICAgICAgY2FzZSBQUk9DRVNTSU5H
X0lOU1RSVUNUSU9OX05PREU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBj
YXNlIERPQ1VNRU5UX1RZUEVfTk9ERToKKyAgICAgICAgICAgICAgICBudW1Eb2N0eXBlcysrOwor
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFTEVNRU5UX05PREU6Cisg
ICAgICAgICAgICAgICAgbnVtRWxlbWVudHMrKzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAobmV3
Q2hpbGQtPm5vZGVUeXBlKCkpIHsKKyAgICAgICAgY2FzZSBBVFRSSUJVVEVfTk9ERToKKyAgICAg
ICAgY2FzZSBDREFUQV9TRUNUSU9OX05PREU6CisgICAgICAgIGNhc2UgRE9DVU1FTlRfRlJBR01F
TlRfTk9ERToKKyAgICAgICAgY2FzZSBET0NVTUVOVF9OT0RFOgorICAgICAgICBjYXNlIEVOVElU
WV9OT0RFOgorICAgICAgICBjYXNlIEVOVElUWV9SRUZFUkVOQ0VfTk9ERToKKyAgICAgICAgY2Fz
ZSBOT1RBVElPTl9OT0RFOgorICAgICAgICBjYXNlIFRFWFRfTk9ERToKKyAgICAgICAgY2FzZSBY
UEFUSF9OQU1FU1BBQ0VfTk9ERToKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAg
Y2FzZSBDT01NRU5UX05PREU6CisgICAgICAgIGNhc2UgUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9O
T0RFOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgRE9DVU1FTlRfVFlQ
RV9OT0RFOgorICAgICAgICAgICAgbnVtRG9jdHlwZXMrKzsKKyAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICBjYXNlIEVMRU1FTlRfTk9ERToKKyAgICAgICAgICAgIG51bUVsZW1lbnRzKys7Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSAgICAgICAgICAgICAgICAKKyAgICB9CisgICAg
ICAgIAorICAgIGlmIChudW1FbGVtZW50cyA+IDEgfHwgbnVtRG9jdHlwZXMgPiAxKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgcmV0dXJuIHRydWU7Cit9CisKK1Bhc3NSZWZQdHI8
Tm9kZT4gRG9jdW1lbnQ6OmNsb25lTm9kZShib29sIC8qZGVlcCovKQoreworICAgIC8vIFNwZWMg
c2F5cyBjbG9uaW5nIERvY3VtZW50IG5vZGVzIGlzICJpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQi
CisgICAgLy8gc28gd2UgZG8gbm90IHN1cHBvcnQgaXQuLi4KKyAgICByZXR1cm4gMDsKK30KKwor
U3R5bGVTaGVldExpc3QqIERvY3VtZW50OjpzdHlsZVNoZWV0cygpCit7CisgICAgcmV0dXJuIG1f
c3R5bGVTaGVldHMuZ2V0KCk7Cit9CisKK1N0cmluZyBEb2N1bWVudDo6cHJlZmVycmVkU3R5bGVz
aGVldFNldCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcHJlZmVycmVkU3R5bGVzaGVldFNldDsK
K30KKworU3RyaW5nIERvY3VtZW50OjpzZWxlY3RlZFN0eWxlc2hlZXRTZXQoKSBjb25zdAorewor
ICAgIHJldHVybiBtX3NlbGVjdGVkU3R5bGVzaGVldFNldDsKK30KKwordm9pZCBEb2N1bWVudDo6
c2V0U2VsZWN0ZWRTdHlsZXNoZWV0U2V0KGNvbnN0IFN0cmluZyYgYVN0cmluZykKK3sKKyAgICBt
X3NlbGVjdGVkU3R5bGVzaGVldFNldCA9IGFTdHJpbmc7CisgICAgc3R5bGVSZXNvbHZlckNoYW5n
ZWQoRGVmZXJSZWNhbGNTdHlsZSk7Cit9CisKKy8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVu
ZXZlciBhIHRvcC1sZXZlbCBzdHlsZXNoZWV0IGhhcyBmaW5pc2hlZCBsb2FkaW5nLgordm9pZCBE
b2N1bWVudDo6cmVtb3ZlUGVuZGluZ1NoZWV0KFJlbW92ZVBlbmRpbmdTaGVldE5vdGlmaWNhdGlv
blR5cGUgbm90aWZpY2F0aW9uKQoreworICAgIC8vIE1ha2Ugc3VyZSB3ZSBrbmV3IHRoaXMgc2hl
ZXQgd2FzIHBlbmRpbmcsIGFuZCB0aGF0IG91ciBjb3VudCBpc24ndCBvdXQgb2Ygc3luYy4KKyAg
ICBBU1NFUlQobV9wZW5kaW5nU3R5bGVzaGVldHMgPiAwKTsKKworICAgIG1fcGVuZGluZ1N0eWxl
c2hlZXRzLS07CisgICAgCisjaWZkZWYgSU5TVFJVTUVOVF9MQVlPVVRfU0NIRURVTElORworICAg
IGlmICghb3duZXJFbGVtZW50KCkpCisgICAgICAgIHByaW50ZigiU3R5bGVzaGVldCBsb2FkZWQg
YXQgdGltZSAlZC4gJWQgc3R5bGVzaGVldHMgc3RpbGwgcmVtYWluLlxuIiwgZWxhcHNlZFRpbWUo
KSwgbV9wZW5kaW5nU3R5bGVzaGVldHMpOworI2VuZGlmCisKKyAgICBpZiAobV9wZW5kaW5nU3R5
bGVzaGVldHMpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChub3RpZmljYXRpb24gPT0gUmVt
b3ZlUGVuZGluZ1NoZWV0Tm90aWZ5TGF0ZXIpIHsKKyAgICAgICAgc2V0TmVlZHNOb3RpZnlSZW1v
dmVBbGxQZW5kaW5nU3R5bGVzaGVldCgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAor
ICAgIGRpZFJlbW92ZUFsbFBlbmRpbmdTdHlsZXNoZWV0KCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6
OmRpZFJlbW92ZUFsbFBlbmRpbmdTdHlsZXNoZWV0KCkKK3sKKyAgICBtX25lZWRzTm90aWZ5UmVt
b3ZlQWxsUGVuZGluZ1N0eWxlc2hlZXQgPSBmYWxzZTsKKworICAgIHN0eWxlUmVzb2x2ZXJDaGFu
Z2VkKFJlY2FsY1N0eWxlSWZOZWVkZWQpOworCisgICAgaWYgKFNjcmlwdGFibGVEb2N1bWVudFBh
cnNlciogcGFyc2VyID0gc2NyaXB0YWJsZURvY3VtZW50UGFyc2VyKCkpCisgICAgICAgIHBhcnNl
ci0+ZXhlY3V0ZVNjcmlwdHNXYWl0aW5nRm9yU3R5bGVzaGVldHMoKTsKKworICAgIGlmIChtX2dv
dG9BbmNob3JOZWVkZWRBZnRlclN0eWxlc2hlZXRzTG9hZCAmJiB2aWV3KCkpCisgICAgICAgIHZp
ZXcoKS0+c2Nyb2xsVG9GcmFnbWVudChtX3VybCk7Cit9CisKKwordm9pZCBEb2N1bWVudDo6ZXZh
bHVhdGVNZWRpYVF1ZXJ5TGlzdCgpCit7CisgICAgaWYgKG1fbWVkaWFRdWVyeU1hdGNoZXIpCisg
ICAgICAgIG1fbWVkaWFRdWVyeU1hdGNoZXItPnN0eWxlUmVzb2x2ZXJDaGFuZ2VkKCk7Cit9CisK
K3ZvaWQgRG9jdW1lbnQ6OnN0eWxlUmVzb2x2ZXJDaGFuZ2VkKFN0eWxlUmVzb2x2ZXJVcGRhdGVG
bGFnIHVwZGF0ZUZsYWcpCit7CisgICAgLy8gRG9uJ3QgYm90aGVyIHVwZGF0aW5nLCBzaW5jZSB3
ZSBoYXZlbid0IGxvYWRlZCBhbGwgb3VyIHN0eWxlIGluZm8geWV0CisgICAgLy8gYW5kIGhhdmVu
J3QgY2FsY3VsYXRlZCB0aGUgc3R5bGUgc2VsZWN0b3IgZm9yIHRoZSBmaXJzdCB0aW1lLgorICAg
IGlmICghYXR0YWNoZWQoKSB8fCAoIW1fZGlkQ2FsY3VsYXRlU3R5bGVSZXNvbHZlciAmJiAhaGF2
ZVN0eWxlc2hlZXRzTG9hZGVkKCkpKSB7CisgICAgICAgIG1fc3R5bGVSZXNvbHZlci5jbGVhcigp
OworICAgICAgICByZXR1cm47CisgICAgfQorCisjaWZkZWYgSU5TVFJVTUVOVF9MQVlPVVRfU0NI
RURVTElORworICAgIGlmICghb3duZXJFbGVtZW50KCkpCisgICAgICAgIHByaW50ZigiQmVnaW5u
aW5nIHVwZGF0ZSBvZiBzdHlsZSBzZWxlY3RvciBhdCB0aW1lICVkLlxuIiwgZWxhcHNlZFRpbWUo
KSk7CisjZW5kaWYKKworICAgIGJvb2wgc3R5bGVzaGVldENoYW5nZVJlcXVpcmVzU3R5bGVSZWNh
bGMgPSB1cGRhdGVBY3RpdmVTdHlsZXNoZWV0cyh1cGRhdGVGbGFnKTsKKworICAgIGlmICh1cGRh
dGVGbGFnID09IERlZmVyUmVjYWxjU3R5bGUpIHsKKyAgICAgICAgc2NoZWR1bGVGb3JjZWRTdHls
ZVJlY2FsYygpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGRpZExheW91dFdp
dGhQZW5kaW5nU3R5bGVzaGVldHMoKSAmJiBtX3BlbmRpbmdTdHlsZXNoZWV0cyA8PSAwKSB7Cisg
ICAgICAgIG1fcGVuZGluZ1NoZWV0TGF5b3V0ID0gSWdub3JlTGF5b3V0V2l0aFBlbmRpbmdTaGVl
dHM7CisgICAgICAgIGlmIChyZW5kZXJlcigpKQorICAgICAgICAgICAgcmVuZGVyZXIoKS0+cmVw
YWludCgpOworICAgIH0KKworICAgIGlmICghc3R5bGVzaGVldENoYW5nZVJlcXVpcmVzU3R5bGVS
ZWNhbGMpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFRoaXMgcmVjYWxjU3R5bGUgaW5pdGlh
dGVzIGEgbmV3IHJlY2FsYyBjeWNsZS4gV2UgbmVlZCB0byBicmFja2V0IGl0IHRvCisgICAgLy8g
bWFrZSBzdXJlIGFuaW1hdGlvbnMgZ2V0IHRoZSBjb3JyZWN0IHVwZGF0ZSB0aW1lCisgICAgewor
ICAgICAgICBBbmltYXRpb25VcGRhdGVCbG9jayBhbmltYXRpb25VcGRhdGVCbG9jayhtX2ZyYW1l
ID8gbV9mcmFtZS0+YW5pbWF0aW9uKCkgOiAwKTsKKyAgICAgICAgcmVjYWxjU3R5bGUoRm9yY2Up
OworICAgIH0KKworI2lmZGVmIElOU1RSVU1FTlRfTEFZT1VUX1NDSEVEVUxJTkcKKyAgICBpZiAo
IW93bmVyRWxlbWVudCgpKQorICAgICAgICBwcmludGYoIkZpbmlzaGVkIHVwZGF0ZSBvZiBzdHls
ZSBzZWxlY3RvciBhdCB0aW1lICVkXG4iLCBlbGFwc2VkVGltZSgpKTsKKyNlbmRpZgorCisgICAg
aWYgKHJlbmRlcmVyKCkpIHsKKyAgICAgICAgcmVuZGVyZXIoKS0+c2V0TmVlZHNMYXlvdXRBbmRQ
cmVmV2lkdGhzUmVjYWxjKCk7CisgICAgICAgIGlmICh2aWV3KCkpCisgICAgICAgICAgICB2aWV3
KCktPnNjaGVkdWxlUmVsYXlvdXQoKTsKKyAgICB9CisKKyAgICBldmFsdWF0ZU1lZGlhUXVlcnlM
aXN0KCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmFkZFN0eWxlU2hlZXRDYW5kaWRhdGVOb2RlKE5v
ZGUqIG5vZGUsIGJvb2wgY3JlYXRlZEJ5UGFyc2VyKQoreworICAgIGlmICghbm9kZS0+aW5Eb2N1
bWVudCgpKQorICAgICAgICByZXR1cm47CisgICAgCisgICAgLy8gVW50aWwgdGhlIDxib2R5PiBl
eGlzdHMsIHdlIGhhdmUgbm8gY2hvaWNlIGJ1dCB0byBjb21wYXJlIGRvY3VtZW50IHBvc2l0aW9u
cywKKyAgICAvLyBzaW5jZSBzdHlsZXMgb3V0c2lkZSBvZiB0aGUgYm9keSBhbmQgaGVhZCBjb250
aW51ZSB0byBiZSBzaHVudGVkIGludG8gdGhlIGhlYWQKKyAgICAvLyAoYW5kIHRodXMgY2FuIHNo
aWZ0IHRvIGVuZCB1cCBiZWZvcmUgZHluYW1pY2FsbHkgYWRkZWQgRE9NIGNvbnRlbnQgdGhhdCBp
cyBhbHNvCisgICAgLy8gb3V0c2lkZSB0aGUgYm9keSkuCisgICAgaWYgKChjcmVhdGVkQnlQYXJz
ZXIgJiYgYm9keSgpKSB8fCBtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcy5pc0VtcHR5KCkpIHsK
KyAgICAgICAgbV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMuYWRkKG5vZGUpOworICAgICAgICBy
ZXR1cm47CisgICAgfQorCisgICAgLy8gRGV0ZXJtaW5lIGFuIGFwcHJvcHJpYXRlIGluc2VydGlv
biBwb2ludC4KKyAgICBTdHlsZVNoZWV0Q2FuZGlkYXRlTGlzdEhhc2hTZXQ6Oml0ZXJhdG9yIGJl
Z2luID0gbV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMuYmVnaW4oKTsKKyAgICBTdHlsZVNoZWV0
Q2FuZGlkYXRlTGlzdEhhc2hTZXQ6Oml0ZXJhdG9yIGVuZCA9IG1fc3R5bGVTaGVldENhbmRpZGF0
ZU5vZGVzLmVuZCgpOworICAgIFN0eWxlU2hlZXRDYW5kaWRhdGVMaXN0SGFzaFNldDo6aXRlcmF0
b3IgaXQgPSBlbmQ7CisgICAgTm9kZSogZm9sbG93aW5nTm9kZSA9IDA7CisgICAgZG8geworICAg
ICAgICAtLWl0OworICAgICAgICBOb2RlKiBuID0gKml0OworICAgICAgICB1bnNpZ25lZCBzaG9y
dCBwb3NpdGlvbiA9IG4tPmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKG5vZGUpOworICAgICAgICBp
ZiAocG9zaXRpb24gPT0gRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HKSB7CisgICAgICAgICAg
ICBtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcy5pbnNlcnRCZWZvcmUoZm9sbG93aW5nTm9kZSwg
bm9kZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZm9sbG93aW5n
Tm9kZSA9IG47CisgICAgfSB3aGlsZSAoaXQgIT0gYmVnaW4pOworICAgIAorICAgIG1fc3R5bGVT
aGVldENhbmRpZGF0ZU5vZGVzLmluc2VydEJlZm9yZShmb2xsb3dpbmdOb2RlLCBub2RlKTsKK30K
Kwordm9pZCBEb2N1bWVudDo6cmVtb3ZlU3R5bGVTaGVldENhbmRpZGF0ZU5vZGUoTm9kZSogbm9k
ZSkKK3sKKyAgICBtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcy5yZW1vdmUobm9kZSk7Cit9CisK
K3ZvaWQgRG9jdW1lbnQ6OmNvbGxlY3RBY3RpdmVTdHlsZXNoZWV0cyhWZWN0b3I8UmVmUHRyPFN0
eWxlU2hlZXQ+ID4mIHNoZWV0cykKK3sKKyAgICBpZiAoc2V0dGluZ3MoKSAmJiAhc2V0dGluZ3Mo
KS0+YXV0aG9yQW5kVXNlclN0eWxlc0VuYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
U3R5bGVTaGVldENhbmRpZGF0ZUxpc3RIYXNoU2V0OjppdGVyYXRvciBiZWdpbiA9IG1fc3R5bGVT
aGVldENhbmRpZGF0ZU5vZGVzLmJlZ2luKCk7CisgICAgU3R5bGVTaGVldENhbmRpZGF0ZUxpc3RI
YXNoU2V0OjppdGVyYXRvciBlbmQgPSBtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcy5lbmQoKTsK
KyAgICBmb3IgKFN0eWxlU2hlZXRDYW5kaWRhdGVMaXN0SGFzaFNldDo6aXRlcmF0b3IgaXQgPSBi
ZWdpbjsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgIE5vZGUqIG4gPSAqaXQ7CisgICAgICAg
IFN0eWxlU2hlZXQqIHNoZWV0ID0gMDsKKyAgICAgICAgaWYgKG4tPm5vZGVUeXBlKCkgPT0gUFJP
Q0VTU0lOR19JTlNUUlVDVElPTl9OT0RFKSB7CisgICAgICAgICAgICAvLyBQcm9jZXNzaW5nIGlu
c3RydWN0aW9uIChYTUwgZG9jdW1lbnRzIG9ubHkpLgorICAgICAgICAgICAgLy8gV2UgZG9uJ3Qg
c3VwcG9ydCBsaW5raW5nIHRvIGVtYmVkZGVkIENTUyBzdHlsZXNoZWV0cywgc2VlIDxodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDkyODE+IGZvciBkaXNjdXNzaW9uLgor
ICAgICAgICAgICAgUHJvY2Vzc2luZ0luc3RydWN0aW9uKiBwaSA9IHN0YXRpY19jYXN0PFByb2Nl
c3NpbmdJbnN0cnVjdGlvbio+KG4pOworICAgICAgICAgICAgc2hlZXQgPSBwaS0+c2hlZXQoKTsK
KyNpZiBFTkFCTEUoWFNMVCkKKyAgICAgICAgICAgIC8vIERvbid0IGFwcGx5IFhTTCB0cmFuc2Zv
cm1zIHRvIGFscmVhZHkgdHJhbnNmb3JtZWQgZG9jdW1lbnRzIC0tIDxyZGFyOi8vcHJvYmxlbS80
MTMyODA2PgorICAgICAgICAgICAgaWYgKHBpLT5pc1hTTCgpICYmICF0cmFuc2Zvcm1Tb3VyY2VE
b2N1bWVudCgpKSB7CisgICAgICAgICAgICAgICAgLy8gRG9uJ3QgYXBwbHkgWFNMIHRyYW5zZm9y
bXMgdW50aWwgbG9hZGluZyBpcyBmaW5pc2hlZC4KKyAgICAgICAgICAgICAgICBpZiAoIXBhcnNp
bmcoKSkKKyAgICAgICAgICAgICAgICAgICAgYXBwbHlYU0xUcmFuc2Zvcm0ocGkpOworICAgICAg
ICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9IGVsc2Ug
aWYgKChuLT5pc0hUTUxFbGVtZW50KCkgJiYgKG4tPmhhc1RhZ05hbWUobGlua1RhZykgfHwgbi0+
aGFzVGFnTmFtZShzdHlsZVRhZykpKQorI2lmIEVOQUJMRShTVkcpCisgICAgICAgICAgICAgICAg
ICAgfHwgIChuLT5pc1NWR0VsZW1lbnQoKSAmJiBuLT5oYXNUYWdOYW1lKFNWR05hbWVzOjpzdHls
ZVRhZykpCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgIEVsZW1l
bnQqIGUgPSBzdGF0aWNfY2FzdDxFbGVtZW50Kj4obik7CisgICAgICAgICAgICBBdG9taWNTdHJp
bmcgdGl0bGUgPSBlLT5nZXRBdHRyaWJ1dGUodGl0bGVBdHRyKTsKKyAgICAgICAgICAgIGJvb2wg
ZW5hYmxlZFZpYVNjcmlwdCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKGUtPmhhc0xvY2FsTmFt
ZShsaW5rVGFnKSkgeworICAgICAgICAgICAgICAgIC8vIDxMSU5LPiBlbGVtZW50CisgICAgICAg
ICAgICAgICAgSFRNTExpbmtFbGVtZW50KiBsaW5rRWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxM
aW5rRWxlbWVudCo+KG4pOworICAgICAgICAgICAgICAgIGlmIChsaW5rRWxlbWVudC0+aXNEaXNh
YmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBl
bmFibGVkVmlhU2NyaXB0ID0gbGlua0VsZW1lbnQtPmlzRW5hYmxlZFZpYVNjcmlwdCgpOworICAg
ICAgICAgICAgICAgIGlmIChsaW5rRWxlbWVudC0+c3R5bGVTaGVldElzTG9hZGluZygpKSB7Cisg
ICAgICAgICAgICAgICAgICAgIC8vIGl0IGlzIGxvYWRpbmcgYnV0IHdlIHNob3VsZCBzdGlsbCBk
ZWNpZGUgd2hpY2ggc3R5bGUgc2hlZXQgc2V0IHRvIHVzZQorICAgICAgICAgICAgICAgICAgICBp
ZiAoIWVuYWJsZWRWaWFTY3JpcHQgJiYgIXRpdGxlLmlzRW1wdHkoKSAmJiBtX3ByZWZlcnJlZFN0
eWxlc2hlZXRTZXQuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBB
dG9taWNTdHJpbmcmIHJlbCA9IGUtPmdldEF0dHJpYnV0ZShyZWxBdHRyKTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGlmICghcmVsLmNvbnRhaW5zKCJhbHRlcm5hdGUiKSkgeworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIG1fcHJlZmVycmVkU3R5bGVzaGVldFNldCA9IHRpdGxlOworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIG1fc2VsZWN0ZWRTdHlsZXNoZWV0U2V0ID0gdGl0bGU7
CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
ICAgIGlmICghbGlua0VsZW1lbnQtPnNoZWV0KCkpCisgICAgICAgICAgICAgICAgICAgIHRpdGxl
ID0gbnVsbEF0b207CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBHZXQgdGhlIGN1cnJl
bnQgcHJlZmVycmVkIHN0eWxlc2V0LiAgVGhpcyBpcyB0aGUKKyAgICAgICAgICAgIC8vIHNldCBv
ZiBzaGVldHMgdGhhdCB3aWxsIGJlIGVuYWJsZWQuCisjaWYgRU5BQkxFKFNWRykKKyAgICAgICAg
ICAgIGlmIChuLT5pc1NWR0VsZW1lbnQoKSAmJiBuLT5oYXNUYWdOYW1lKFNWR05hbWVzOjpzdHls
ZVRhZykpCisgICAgICAgICAgICAgICAgc2hlZXQgPSBzdGF0aWNfY2FzdDxTVkdTdHlsZUVsZW1l
bnQqPihuKS0+c2hlZXQoKTsKKyAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAg
aWYgKGUtPmhhc0xvY2FsTmFtZShsaW5rVGFnKSkKKyAgICAgICAgICAgICAgICBzaGVldCA9IHN0
YXRpY19jYXN0PEhUTUxMaW5rRWxlbWVudCo+KG4pLT5zaGVldCgpOworICAgICAgICAgICAgZWxz
ZQorICAgICAgICAgICAgICAgIC8vIDxTVFlMRT4gZWxlbWVudAorICAgICAgICAgICAgICAgIHNo
ZWV0ID0gc3RhdGljX2Nhc3Q8SFRNTFN0eWxlRWxlbWVudCo+KG4pLT5zaGVldCgpOworICAgICAg
ICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoaXMgc2hlZXQgYmVsb25ncyB0byBhIHN0eWxlc2V0
CisgICAgICAgICAgICAvLyAodGh1cyBtYWtpbmcgaXQgUFJFRkVSUkVEIG9yIEFMVEVSTkFURSBy
YXRoZXIgdGhhbgorICAgICAgICAgICAgLy8gUEVSU0lTVEVOVCkuCisgICAgICAgICAgICBBdG9t
aWNTdHJpbmcgcmVsID0gZS0+Z2V0QXR0cmlidXRlKHJlbEF0dHIpOworICAgICAgICAgICAgaWYg
KCFlbmFibGVkVmlhU2NyaXB0ICYmICF0aXRsZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAg
ICAvLyBZZXMsIHdlIGhhdmUgYSB0aXRsZS4KKyAgICAgICAgICAgICAgICBpZiAobV9wcmVmZXJy
ZWRTdHlsZXNoZWV0U2V0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBObyBw
cmVmZXJyZWQgc2V0IGhhcyBiZWVuIGVzdGFibGlzaGVkLiAgSWYKKyAgICAgICAgICAgICAgICAg
ICAgLy8gd2UgYXJlIE5PVCBhbiBhbHRlcm5hdGUgc2hlZXQsIHRoZW4gZXN0YWJsaXNoCisgICAg
ICAgICAgICAgICAgICAgIC8vIHVzIGFzIHRoZSBwcmVmZXJyZWQgc2V0LiAgT3RoZXJ3aXNlLCBq
dXN0IGlnbm9yZQorICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHNoZWV0LgorICAgICAgICAg
ICAgICAgICAgICBpZiAoZS0+aGFzTG9jYWxOYW1lKHN0eWxlVGFnKSB8fCAhcmVsLmNvbnRhaW5z
KCJhbHRlcm5hdGUiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcHJlZmVycmVkU3R5bGVz
aGVldFNldCA9IG1fc2VsZWN0ZWRTdHlsZXNoZWV0U2V0ID0gdGl0bGU7CisgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgICAgIGlmICh0aXRsZSAhPSBtX3ByZWZlcnJlZFN0eWxlc2hlZXRT
ZXQpCisgICAgICAgICAgICAgICAgICAgIHNoZWV0ID0gMDsKKyAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgaWYgKHJlbC5jb250YWlucygiYWx0ZXJuYXRlIikgJiYgdGl0bGUuaXNFbXB0eSgp
KQorICAgICAgICAgICAgICAgIHNoZWV0ID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2hl
ZXQpCisgICAgICAgICAgICBzaGVldHMuYXBwZW5kKHNoZWV0KTsKKyAgICB9Cit9CisKK2Jvb2wg
RG9jdW1lbnQ6OnRlc3RBZGRlZFN0eWxlc2hlZXRSZXF1aXJlc1N0eWxlUmVjYWxjKFN0eWxlU2hl
ZXRDb250ZW50cyogc3R5bGVzaGVldCkKK3sKKyAgICAvLyBTZWUgaWYgYWxsIHJ1bGVzIG9uIHRo
ZSBzaGVldCBhcmUgc2NvcGVkIHRvIHNvbWUgc3BlY2lmaWMgaWRzIG9yIGNsYXNzZXMuCisgICAg
Ly8gVGhlbiB0ZXN0IGlmIHdlIGFjdHVhbGx5IGhhdmUgYW55IG9mIHRob3NlIGluIHRoZSB0cmVl
IGF0IHRoZSBtb21lbnQuCisgICAgSGFzaFNldDxBdG9taWNTdHJpbmdJbXBsKj4gaWRTY29wZXM7
IAorICAgIEhhc2hTZXQ8QXRvbWljU3RyaW5nSW1wbCo+IGNsYXNzU2NvcGVzOworICAgIGlmICgh
U3R5bGVSZXNvbHZlcjo6ZGV0ZXJtaW5lU3R5bGVzaGVldFNlbGVjdG9yU2NvcGVzKHN0eWxlc2hl
ZXQsIGlkU2NvcGVzLCBjbGFzc1Njb3BlcykpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIC8v
IEludmFsaWRhdGUgdGhlIHN1YnRyZWVzIHRoYXQgbWF0Y2ggdGhlIHNjb3Blcy4KKyAgICBOb2Rl
KiBub2RlID0gZmlyc3RDaGlsZCgpOworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIGlmICgh
bm9kZS0+aXNTdHlsZWRFbGVtZW50KCkpIHsKKyAgICAgICAgICAgIG5vZGUgPSBub2RlLT50cmF2
ZXJzZU5leHROb2RlKCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAg
ICBTdHlsZWRFbGVtZW50KiBlbGVtZW50ID0gc3RhdGljX2Nhc3Q8U3R5bGVkRWxlbWVudCo+KG5v
ZGUpOworICAgICAgICBpZiAoU2VsZWN0b3JDaGVja2VyOjplbGVtZW50TWF0Y2hlc1NlbGVjdG9y
U2NvcGVzKGVsZW1lbnQsIGlkU2NvcGVzLCBjbGFzc1Njb3BlcykpIHsKKyAgICAgICAgICAgIGVs
ZW1lbnQtPnNldE5lZWRzU3R5bGVSZWNhbGMoKTsKKyAgICAgICAgICAgIC8vIFRoZSB3aG9sZSBz
dWJ0cmVlIGlzIG5vdyBpbnZhbGlkYXRlZCwgd2UgY2FuIHNraXAgdG8gdGhlIG5leHQgc2libGlu
Zy4KKyAgICAgICAgICAgIG5vZGUgPSBub2RlLT50cmF2ZXJzZU5leHRTaWJsaW5nKCk7CisgICAg
ICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBub2RlID0gbm9kZS0+dHJhdmVy
c2VOZXh0Tm9kZSgpOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgRG9jdW1l
bnQ6OmFuYWx5emVTdHlsZXNoZWV0Q2hhbmdlKFN0eWxlUmVzb2x2ZXJVcGRhdGVGbGFnIHVwZGF0
ZUZsYWcsIGNvbnN0IFZlY3RvcjxSZWZQdHI8U3R5bGVTaGVldD4gPiYgbmV3U3R5bGVzaGVldHMs
IGJvb2wmIHJlcXVpcmVzU3R5bGVSZXNvbHZlclJlc2V0LCBib29sJiByZXF1aXJlc0Z1bGxTdHls
ZVJlY2FsYykKK3sKKyAgICByZXF1aXJlc1N0eWxlUmVzb2x2ZXJSZXNldCA9IHRydWU7CisgICAg
cmVxdWlyZXNGdWxsU3R5bGVSZWNhbGMgPSB0cnVlOworICAgIAorICAgIC8vIFN0eWxlc2hlZXRz
IG9mIDxzdHlsZT4gZWxlbWVudHMgdGhhdCBAaW1wb3J0IHN0eWxlc2hlZXRzIGFyZSBhY3RpdmUg
YnV0IGxvYWRpbmcuIFdlIG5lZWQgdG8gdHJpZ2dlciBhIGZ1bGwgcmVjYWxjIHdoZW4gc3VjaCBs
b2FkcyBhcmUgZG9uZS4KKyAgICBib29sIGhhc0FjdGl2ZUxvYWRpbmdTdHlsZXNoZWV0ID0gZmFs
c2U7CisgICAgdW5zaWduZWQgbmV3U3R5bGVzaGVldENvdW50ID0gbmV3U3R5bGVzaGVldHMuc2l6
ZSgpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuZXdTdHlsZXNoZWV0Q291bnQ7ICsr
aSkgeworICAgICAgICBpZiAobmV3U3R5bGVzaGVldHNbaV0tPmlzTG9hZGluZygpKQorICAgICAg
ICAgICAgaGFzQWN0aXZlTG9hZGluZ1N0eWxlc2hlZXQgPSB0cnVlOworICAgIH0KKyAgICBpZiAo
bV9oYWRBY3RpdmVMb2FkaW5nU3R5bGVzaGVldCAmJiAhaGFzQWN0aXZlTG9hZGluZ1N0eWxlc2hl
ZXQpIHsKKyAgICAgICAgbV9oYWRBY3RpdmVMb2FkaW5nU3R5bGVzaGVldCA9IGZhbHNlOworICAg
ICAgICByZXR1cm47CisgICAgfQorICAgIG1faGFkQWN0aXZlTG9hZGluZ1N0eWxlc2hlZXQgPSBo
YXNBY3RpdmVMb2FkaW5nU3R5bGVzaGVldDsKKworICAgIGlmICh1cGRhdGVGbGFnICE9IFJlY2Fs
Y1N0eWxlSWZOZWVkZWQpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoIW1fc3R5bGVSZXNvbHZl
cikKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gU2VlIGlmIHdlIGFyZSBqdXN0IGFkZGluZyBz
dHlsZXNoZWV0cy4KKyAgICB1bnNpZ25lZCBvbGRTdHlsZXNoZWV0Q291bnQgPSBtX3N0eWxlU2hl
ZXRzLT5sZW5ndGgoKTsKKyAgICBpZiAobmV3U3R5bGVzaGVldENvdW50IDwgb2xkU3R5bGVzaGVl
dENvdW50KQorICAgICAgICByZXR1cm47CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG9s
ZFN0eWxlc2hlZXRDb3VudDsgKytpKSB7CisgICAgICAgIGlmIChtX3N0eWxlU2hlZXRzLT5pdGVt
KGkpICE9IG5ld1N0eWxlc2hlZXRzW2ldKQorICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKyAg
ICByZXF1aXJlc1N0eWxlUmVzb2x2ZXJSZXNldCA9IGZhbHNlOworCisgICAgLy8gSWYgd2UgYXJl
IGFscmVhZHkgcGFyc2luZyB0aGUgYm9keSBhbmQgc28gbWF5IGhhdmUgc2lnbmlmaWNhbnQgYW1v
dW50IG9mIGVsZW1lbnRzLCBwdXQgc29tZSBlZmZvcnQgaW50byB0cnlpbmcgdG8gYXZvaWQgc3R5
bGUgcmVjYWxjcy4KKyAgICBpZiAoIWJvZHkoKSB8fCBtX2hhc05vZGVzV2l0aFBsYWNlaG9sZGVy
U3R5bGUpCisgICAgICAgIHJldHVybjsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSBvbGRTdHlsZXNo
ZWV0Q291bnQ7IGkgPCBuZXdTdHlsZXNoZWV0Q291bnQ7ICsraSkgeworICAgICAgICBpZiAoIW5l
d1N0eWxlc2hlZXRzW2ldLT5pc0NTU1N0eWxlU2hlZXQoKSkKKyAgICAgICAgICAgIHJldHVybjsK
KyAgICAgICAgaWYgKG5ld1N0eWxlc2hlZXRzW2ldLT5kaXNhYmxlZCgpKQorICAgICAgICAgICAg
Y29udGludWU7CisgICAgICAgIGlmICh0ZXN0QWRkZWRTdHlsZXNoZWV0UmVxdWlyZXNTdHlsZVJl
Y2FsYyhzdGF0aWNfY2FzdDxDU1NTdHlsZVNoZWV0Kj4obmV3U3R5bGVzaGVldHNbaV0uZ2V0KCkp
LT5jb250ZW50cygpKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcmVxdWlyZXNG
dWxsU3R5bGVSZWNhbGMgPSBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgc3R5bGVTaGVldHNVc2VS
ZW1Vbml0cyhjb25zdCBWZWN0b3I8UmVmUHRyPFN0eWxlU2hlZXQ+ID4mIHNoZWV0cykKK3sKKyAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2hlZXRzLnNpemUoKTsgKytpKSB7CisgICAgICAg
IGlmICghc2hlZXRzW2ldLT5pc0NTU1N0eWxlU2hlZXQoKSkKKyAgICAgICAgICAgIGNvbnRpbnVl
OworICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8Q1NTU3R5bGVTaGVldCo+KHNoZWV0c1tpXS5nZXQo
KSktPmNvbnRlbnRzKCktPnVzZXNSZW1Vbml0cygpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBEb2N1bWVudDo6bm90aWZ5U2Vh
bWxlc3NDaGlsZERvY3VtZW50c09mU3R5bGVzaGVldFVwZGF0ZSgpIGNvbnN0Cit7CisgICAgLy8g
SWYgd2UncmUgbm90IGluIGEgZnJhbWUgeWV0IGFueSBwb3RlbnRpYWwgY2hpbGQgZG9jdW1lbnRz
IHdvbid0IGhhdmUgYSBTdHlsZVJlc29sdmVyIHRvIHVwZGF0ZS4KKyAgICBpZiAoIWZyYW1lKCkp
CisgICAgICAgIHJldHVybjsKKworICAgIC8vIFNlYW1sZXNzIGNoaWxkIGZyYW1lcyBhcmUgZXhw
ZWN0ZWQgdG8gbm90aWZ5IHRoZWlyIHNlYW1sZXNzIGNoaWxkcmVuIHJlY3Vyc2l2ZWx5LCBzbyB3
ZSBvbmx5IGRvIGRpcmVjdCBjaGlsZHJlbi4KKyAgICBmb3IgKEZyYW1lKiBjaGlsZCA9IGZyYW1l
KCktPnRyZWUoKS0+Zmlyc3RDaGlsZCgpOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+dHJlZSgpLT5u
ZXh0U2libGluZygpKSB7CisgICAgICAgIERvY3VtZW50KiBjaGlsZERvY3VtZW50ID0gY2hpbGQt
PmRvY3VtZW50KCk7CisgICAgICAgIGlmIChjaGlsZERvY3VtZW50LT5zaG91bGREaXNwbGF5U2Vh
bWxlc3NseVdpdGhQYXJlbnQoKSkgeworICAgICAgICAgICAgQVNTRVJUKGNoaWxkRG9jdW1lbnQt
PnNlYW1sZXNzUGFyZW50SUZyYW1lKCktPmRvY3VtZW50KCkgPT0gdGhpcyk7CisgICAgICAgICAg
ICBjaGlsZERvY3VtZW50LT5zZWFtbGVzc1BhcmVudFVwZGF0ZWRTdHlsZXNoZWV0cygpOworICAg
ICAgICB9CisgICAgfQorfQorCitib29sIERvY3VtZW50Ojp1cGRhdGVBY3RpdmVTdHlsZXNoZWV0
cyhTdHlsZVJlc29sdmVyVXBkYXRlRmxhZyB1cGRhdGVGbGFnKQoreworICAgIGlmIChtX2luU3R5
bGVSZWNhbGMpIHsKKyAgICAgICAgLy8gU1ZHIDx1c2U+IGVsZW1lbnQgbWF5IG1hbmFnZSB0byBp
bnZhbGlkYXRlIHN0eWxlIHNlbGVjdG9yIGluIHRoZSBtaWRkbGUgb2YgYSBzdHlsZSByZWNhbGMu
CisgICAgICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD01NDM0
NAorICAgICAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgYmUgZml4ZWQgaW4gU1ZHIGFuZCB0aGlz
IGNvZGUgcmVwbGFjZWQgd2l0aCBBU1NFUlQoIW1faW5TdHlsZVJlY2FsYykuCisgICAgICAgIG1f
aGFzRGlydHlTdHlsZVJlc29sdmVyID0gdHJ1ZTsKKyAgICAgICAgc2NoZWR1bGVGb3JjZWRTdHls
ZVJlY2FsYygpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghcmVuZGVy
ZXIoKSB8fCAhYXR0YWNoZWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgU3R5bGVT
aGVldFZlY3RvciBuZXdTdHlsZXNoZWV0czsKKyAgICBjb2xsZWN0QWN0aXZlU3R5bGVzaGVldHMo
bmV3U3R5bGVzaGVldHMpOworCisgICAgYm9vbCByZXF1aXJlc1N0eWxlUmVzb2x2ZXJSZXNldDsK
KyAgICBib29sIHJlcXVpcmVzRnVsbFN0eWxlUmVjYWxjOworICAgIGFuYWx5emVTdHlsZXNoZWV0
Q2hhbmdlKHVwZGF0ZUZsYWcsIG5ld1N0eWxlc2hlZXRzLCByZXF1aXJlc1N0eWxlUmVzb2x2ZXJS
ZXNldCwgcmVxdWlyZXNGdWxsU3R5bGVSZWNhbGMpOworCisgICAgaWYgKHJlcXVpcmVzU3R5bGVS
ZXNvbHZlclJlc2V0KQorICAgICAgICBjbGVhclN0eWxlUmVzb2x2ZXIoKTsKKyAgICBlbHNlIHsK
KyAgICAgICAgbV9zdHlsZVJlc29sdmVyLT5hcHBlbmRBdXRob3JTdHlsZXNoZWV0cyhtX3N0eWxl
U2hlZXRzLT5sZW5ndGgoKSwgbmV3U3R5bGVzaGVldHMpOworICAgICAgICByZXNldENTU0ZlYXR1
cmVGbGFncygpOworICAgIH0KKyAgICBtX3N0eWxlU2hlZXRzLT5zd2FwKG5ld1N0eWxlc2hlZXRz
KTsKKworICAgIG1fdXNlc1JlbVVuaXRzID0gc3R5bGVTaGVldHNVc2VSZW1Vbml0cyhtX3N0eWxl
U2hlZXRzLT52ZWN0b3IoKSk7CisgICAgbV9kaWRDYWxjdWxhdGVTdHlsZVJlc29sdmVyID0gdHJ1
ZTsKKyAgICBtX2hhc0RpcnR5U3R5bGVSZXNvbHZlciA9IGZhbHNlOworCisgICAgbm90aWZ5U2Vh
bWxlc3NDaGlsZERvY3VtZW50c09mU3R5bGVzaGVldFVwZGF0ZSgpOworCisgICAgcmV0dXJuIHJl
cXVpcmVzRnVsbFN0eWxlUmVjYWxjOworfQorCit2b2lkIERvY3VtZW50OjpzZXRIb3Zlck5vZGUo
UGFzc1JlZlB0cjxOb2RlPiBuZXdIb3Zlck5vZGUpCit7CisgICAgbV9ob3Zlck5vZGUgPSBuZXdI
b3Zlck5vZGU7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnNldEFjdGl2ZU5vZGUoUGFzc1JlZlB0cjxO
b2RlPiBuZXdBY3RpdmVOb2RlKQoreworICAgIG1fYWN0aXZlTm9kZSA9IG5ld0FjdGl2ZU5vZGU7
Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmZvY3VzZWROb2RlUmVtb3ZlZCgpCit7CisgICAgc2V0Rm9j
dXNlZE5vZGUoMCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnJlbW92ZUZvY3VzZWROb2RlT2ZTdWJ0
cmVlKE5vZGUqIG5vZGUsIGJvb2wgYW1vbmdDaGlsZHJlbk9ubHkpCit7CisgICAgaWYgKCFtX2Zv
Y3VzZWROb2RlIHx8IHRoaXMtPmluUGFnZUNhY2hlKCkpIC8vIElmIHRoZSBkb2N1bWVudCBpcyBp
biB0aGUgcGFnZSBjYWNoZSwgdGhlbiB3ZSBkb24ndCBuZWVkIHRvIGNsZWFyIG91dCB0aGUgZm9j
dXNlZCBub2RlLgorICAgICAgICByZXR1cm47CisgICAgICAgIAorICAgIGJvb2wgbm9kZUluU3Vi
dHJlZSA9IGZhbHNlOworICAgIGlmIChhbW9uZ0NoaWxkcmVuT25seSkKKyAgICAgICAgbm9kZUlu
U3VidHJlZSA9IG1fZm9jdXNlZE5vZGUtPmlzRGVzY2VuZGFudE9mKG5vZGUpOworICAgIGVsc2UK
KyAgICAgICAgbm9kZUluU3VidHJlZSA9IChtX2ZvY3VzZWROb2RlID09IG5vZGUpIHx8IG1fZm9j
dXNlZE5vZGUtPmlzRGVzY2VuZGFudE9mKG5vZGUpOworICAgIAorICAgIGlmIChub2RlSW5TdWJ0
cmVlKQorICAgICAgICBkb2N1bWVudCgpLT5mb2N1c2VkTm9kZVJlbW92ZWQoKTsKK30KKwordm9p
ZCBEb2N1bWVudDo6aG92ZXJlZE5vZGVEZXRhY2hlZChOb2RlKiBub2RlKQoreworICAgIGlmICgh
bV9ob3Zlck5vZGUgfHwgKG5vZGUgIT0gbV9ob3Zlck5vZGUgJiYgKCFtX2hvdmVyTm9kZS0+aXNU
ZXh0Tm9kZSgpIHx8IG5vZGUgIT0gbV9ob3Zlck5vZGUtPnBhcmVudE5vZGUoKSkpKQorICAgICAg
ICByZXR1cm47CisKKyAgICBtX2hvdmVyTm9kZSA9IG5vZGUtPnBhcmVudE5vZGUoKTsKKyAgICB3
aGlsZSAobV9ob3Zlck5vZGUgJiYgIW1faG92ZXJOb2RlLT5yZW5kZXJlcigpKQorICAgICAgICBt
X2hvdmVyTm9kZSA9IG1faG92ZXJOb2RlLT5wYXJlbnROb2RlKCk7CisgICAgaWYgKGZyYW1lKCkp
CisgICAgICAgIGZyYW1lKCktPmV2ZW50SGFuZGxlcigpLT5zY2hlZHVsZUhvdmVyU3RhdGVVcGRh
dGUoKTsKK30KKwordm9pZCBEb2N1bWVudDo6YWN0aXZlQ2hhaW5Ob2RlRGV0YWNoZWQoTm9kZSog
bm9kZSkKK3sKKyAgICBpZiAoIW1fYWN0aXZlTm9kZSB8fCAobm9kZSAhPSBtX2FjdGl2ZU5vZGUg
JiYgKCFtX2FjdGl2ZU5vZGUtPmlzVGV4dE5vZGUoKSB8fCBub2RlICE9IG1fYWN0aXZlTm9kZS0+
cGFyZW50Tm9kZSgpKSkpCisgICAgICAgIHJldHVybjsKKworICAgIG1fYWN0aXZlTm9kZSA9IG5v
ZGUtPnBhcmVudE5vZGUoKTsKKyAgICB3aGlsZSAobV9hY3RpdmVOb2RlICYmICFtX2FjdGl2ZU5v
ZGUtPnJlbmRlcmVyKCkpCisgICAgICAgIG1fYWN0aXZlTm9kZSA9IG1fYWN0aXZlTm9kZS0+cGFy
ZW50Tm9kZSgpOworfQorCisjaWYgRU5BQkxFKERBU0hCT0FSRF9TVVBQT1JUKSB8fCBFTkFCTEUo
V0lER0VUX1JFR0lPTikKK2NvbnN0IFZlY3RvcjxEYXNoYm9hcmRSZWdpb25WYWx1ZT4mIERvY3Vt
ZW50OjpkYXNoYm9hcmRSZWdpb25zKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9kYXNoYm9hcmRS
ZWdpb25zOworfQorCit2b2lkIERvY3VtZW50OjpzZXREYXNoYm9hcmRSZWdpb25zKGNvbnN0IFZl
Y3RvcjxEYXNoYm9hcmRSZWdpb25WYWx1ZT4mIHJlZ2lvbnMpCit7CisgICAgbV9kYXNoYm9hcmRS
ZWdpb25zID0gcmVnaW9uczsKKyAgICBzZXREYXNoYm9hcmRSZWdpb25zRGlydHkoZmFsc2UpOwor
fQorI2VuZGlmCisKK2Jvb2wgRG9jdW1lbnQ6OnNldEZvY3VzZWROb2RlKFBhc3NSZWZQdHI8Tm9k
ZT4gcHJwTmV3Rm9jdXNlZE5vZGUpCit7CisgICAgUmVmUHRyPE5vZGU+IG5ld0ZvY3VzZWROb2Rl
ID0gcHJwTmV3Rm9jdXNlZE5vZGU7CisKKyAgICAvLyBNYWtlIHN1cmUgbmV3Rm9jdXNlZE5vZGUg
aXMgYWN0dWFsbHkgaW4gdGhpcyBkb2N1bWVudAorICAgIGlmIChuZXdGb2N1c2VkTm9kZSAmJiAo
bmV3Rm9jdXNlZE5vZGUtPmRvY3VtZW50KCkgIT0gdGhpcykpCisgICAgICAgIHJldHVybiB0cnVl
OworCisgICAgaWYgKG1fZm9jdXNlZE5vZGUgPT0gbmV3Rm9jdXNlZE5vZGUpCisgICAgICAgIHJl
dHVybiB0cnVlOworCisgICAgaWYgKG1faW5QYWdlQ2FjaGUpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgIGJvb2wgZm9jdXNDaGFuZ2VCbG9ja2VkID0gZmFsc2U7CisgICAgUmVmUHRyPE5v
ZGU+IG9sZEZvY3VzZWROb2RlID0gbV9mb2N1c2VkTm9kZTsKKyAgICBtX2ZvY3VzZWROb2RlID0g
MDsKKworICAgIC8vIFJlbW92ZSBmb2N1cyBmcm9tIHRoZSBleGlzdGluZyBmb2N1cyBub2RlIChp
ZiBhbnkpCisgICAgaWYgKG9sZEZvY3VzZWROb2RlKSB7CisgICAgICAgIEFTU0VSVCghb2xkRm9j
dXNlZE5vZGUtPmluRGV0YWNoKCkpOworCisgICAgICAgIGlmIChvbGRGb2N1c2VkTm9kZS0+YWN0
aXZlKCkpCisgICAgICAgICAgICBvbGRGb2N1c2VkTm9kZS0+c2V0QWN0aXZlKGZhbHNlKTsKKwor
ICAgICAgICBvbGRGb2N1c2VkTm9kZS0+c2V0Rm9jdXMoZmFsc2UpOworCisgICAgICAgIC8vIERp
c3BhdGNoIGEgY2hhbmdlIGV2ZW50IGZvciB0ZXh0IGZpZWxkcyBvciB0ZXh0YXJlYXMgdGhhdCBo
YXZlIGJlZW4gZWRpdGVkCisgICAgICAgIGlmIChvbGRGb2N1c2VkTm9kZS0+aXNFbGVtZW50Tm9k
ZSgpKSB7CisgICAgICAgICAgICBFbGVtZW50KiBlbGVtZW50ID0gc3RhdGljX2Nhc3Q8RWxlbWVu
dCo+KG9sZEZvY3VzZWROb2RlLmdldCgpKTsKKyAgICAgICAgICAgIGlmIChlbGVtZW50LT53YXND
aGFuZ2VkU2luY2VMYXN0Rm9ybUNvbnRyb2xDaGFuZ2VFdmVudCgpKQorICAgICAgICAgICAgICAg
IGVsZW1lbnQtPmRpc3BhdGNoRm9ybUNvbnRyb2xDaGFuZ2VFdmVudCgpOworICAgICAgICB9CisK
KyAgICAgICAgLy8gRGlzcGF0Y2ggdGhlIGJsdXIgZXZlbnQgYW5kIGxldCB0aGUgbm9kZSBkbyBh
bnkgb3RoZXIgYmx1ciByZWxhdGVkIGFjdGl2aXRpZXMgKGltcG9ydGFudCBmb3IgdGV4dCBmaWVs
ZHMpCisgICAgICAgIG9sZEZvY3VzZWROb2RlLT5kaXNwYXRjaEJsdXJFdmVudChuZXdGb2N1c2Vk
Tm9kZSk7CisKKyAgICAgICAgaWYgKG1fZm9jdXNlZE5vZGUpIHsKKyAgICAgICAgICAgIC8vIGhh
bmRsZXIgc2hpZnRlZCBmb2N1cworICAgICAgICAgICAgZm9jdXNDaGFuZ2VCbG9ja2VkID0gdHJ1
ZTsKKyAgICAgICAgICAgIG5ld0ZvY3VzZWROb2RlID0gMDsKKyAgICAgICAgfQorICAgICAgICAK
KyAgICAgICAgb2xkRm9jdXNlZE5vZGUtPmRpc3BhdGNoRm9jdXNPdXRFdmVudChldmVudE5hbWVz
KCkuZm9jdXNvdXRFdmVudCwgbmV3Rm9jdXNlZE5vZGUpOyAvLyBET00gbGV2ZWwgMyBuYW1lIGZv
ciB0aGUgYnViYmxpbmcgYmx1ciBldmVudC4KKyAgICAgICAgLy8gRklYTUU6IFdlIHNob3VsZCBy
ZW1vdmUgZmlyaW5nIERPTUZvY3VzT3V0RXZlbnQgZXZlbnQgd2hlbiB3ZSBhcmUgc3VyZSBubyBj
b250ZW50IGRlcGVuZHMKKyAgICAgICAgLy8gb24gaXQsIHByb2JhYmx5IHdoZW4gPHJkYXI6Ly9w
cm9ibGVtLzg1MDM5NTg+IGlzIHJlc29sdmVkLgorICAgICAgICBvbGRGb2N1c2VkTm9kZS0+ZGlz
cGF0Y2hGb2N1c091dEV2ZW50KGV2ZW50TmFtZXMoKS5ET01Gb2N1c091dEV2ZW50LCBuZXdGb2N1
c2VkTm9kZSk7IC8vIERPTSBsZXZlbCAyIG5hbWUgZm9yIGNvbXBhdGliaWxpdHkuCisKKyAgICAg
ICAgaWYgKG1fZm9jdXNlZE5vZGUpIHsKKyAgICAgICAgICAgIC8vIGhhbmRsZXIgc2hpZnRlZCBm
b2N1cworICAgICAgICAgICAgZm9jdXNDaGFuZ2VCbG9ja2VkID0gdHJ1ZTsKKyAgICAgICAgICAg
IG5ld0ZvY3VzZWROb2RlID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAob2xkRm9jdXNlZE5v
ZGUgPT0gdGhpcyAmJiBvbGRGb2N1c2VkTm9kZS0+aGFzT25lUmVmKCkpCisgICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIAorICAgICAgICBpZiAob2xkRm9jdXNlZE5vZGUtPmlz
Um9vdEVkaXRhYmxlRWxlbWVudCgpKQorICAgICAgICAgICAgZnJhbWUoKS0+ZWRpdG9yKCktPmRp
ZEVuZEVkaXRpbmcoKTsKKworICAgICAgICBpZiAodmlldygpKSB7CisgICAgICAgICAgICBXaWRn
ZXQqIG9sZFdpZGdldCA9IHdpZGdldEZvck5vZGUob2xkRm9jdXNlZE5vZGUuZ2V0KCkpOworICAg
ICAgICAgICAgaWYgKG9sZFdpZGdldCkKKyAgICAgICAgICAgICAgICBvbGRXaWRnZXQtPnNldEZv
Y3VzKGZhbHNlKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB2aWV3KCktPnNl
dEZvY3VzKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChuZXdGb2N1c2VkTm9k
ZSkgeworICAgICAgICBpZiAobmV3Rm9jdXNlZE5vZGUtPmlzUm9vdEVkaXRhYmxlRWxlbWVudCgp
ICYmICFhY2NlcHRzRWRpdGluZ0ZvY3VzKG5ld0ZvY3VzZWROb2RlLmdldCgpKSkgeworICAgICAg
ICAgICAgLy8gZGVsZWdhdGUgYmxvY2tzIGZvY3VzIGNoYW5nZQorICAgICAgICAgICAgZm9jdXND
aGFuZ2VCbG9ja2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIGdvdG8gU2V0Rm9jdXNlZE5vZGVEb25l
OworICAgICAgICB9CisgICAgICAgIC8vIFNldCBmb2N1cyBvbiB0aGUgbmV3IG5vZGUKKyAgICAg
ICAgbV9mb2N1c2VkTm9kZSA9IG5ld0ZvY3VzZWROb2RlOworCisgICAgICAgIC8vIERpc3BhdGNo
IHRoZSBmb2N1cyBldmVudCBhbmQgbGV0IHRoZSBub2RlIGRvIGFueSBvdGhlciBmb2N1cyByZWxh
dGVkIGFjdGl2aXRpZXMgKGltcG9ydGFudCBmb3IgdGV4dCBmaWVsZHMpCisgICAgICAgIG1fZm9j
dXNlZE5vZGUtPmRpc3BhdGNoRm9jdXNFdmVudChvbGRGb2N1c2VkTm9kZSk7CisKKyAgICAgICAg
aWYgKG1fZm9jdXNlZE5vZGUgIT0gbmV3Rm9jdXNlZE5vZGUpIHsKKyAgICAgICAgICAgIC8vIGhh
bmRsZXIgc2hpZnRlZCBmb2N1cworICAgICAgICAgICAgZm9jdXNDaGFuZ2VCbG9ja2VkID0gdHJ1
ZTsKKyAgICAgICAgICAgIGdvdG8gU2V0Rm9jdXNlZE5vZGVEb25lOworICAgICAgICB9CisKKyAg
ICAgICAgbV9mb2N1c2VkTm9kZS0+ZGlzcGF0Y2hGb2N1c0luRXZlbnQoZXZlbnROYW1lcygpLmZv
Y3VzaW5FdmVudCwgb2xkRm9jdXNlZE5vZGUpOyAvLyBET00gbGV2ZWwgMyBidWJibGluZyBmb2N1
cyBldmVudC4KKworICAgICAgICBpZiAobV9mb2N1c2VkTm9kZSAhPSBuZXdGb2N1c2VkTm9kZSkg
eworICAgICAgICAgICAgLy8gaGFuZGxlciBzaGlmdGVkIGZvY3VzCisgICAgICAgICAgICBmb2N1
c0NoYW5nZUJsb2NrZWQgPSB0cnVlOworICAgICAgICAgICAgZ290byBTZXRGb2N1c2VkTm9kZURv
bmU7CisgICAgICAgIH0KKworICAgICAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIHJlbW92ZSBmaXJp
bmcgRE9NRm9jdXNJbkV2ZW50IGV2ZW50IHdoZW4gd2UgYXJlIHN1cmUgbm8gY29udGVudCBkZXBl
bmRzCisgICAgICAgIC8vIG9uIGl0LCBwcm9iYWJseSB3aGVuIDxyZGFyOi8vcHJvYmxlbS84NTAz
OTU4PiBpcyBtLgorICAgICAgICBtX2ZvY3VzZWROb2RlLT5kaXNwYXRjaEZvY3VzSW5FdmVudChl
dmVudE5hbWVzKCkuRE9NRm9jdXNJbkV2ZW50LCBvbGRGb2N1c2VkTm9kZSk7IC8vIERPTSBsZXZl
bCAyIGZvciBjb21wYXRpYmlsaXR5LgorCisgICAgICAgIGlmIChtX2ZvY3VzZWROb2RlICE9IG5l
d0ZvY3VzZWROb2RlKSB7IAorICAgICAgICAgICAgLy8gaGFuZGxlciBzaGlmdGVkIGZvY3VzCisg
ICAgICAgICAgICBmb2N1c0NoYW5nZUJsb2NrZWQgPSB0cnVlOworICAgICAgICAgICAgZ290byBT
ZXRGb2N1c2VkTm9kZURvbmU7CisgICAgICAgIH0KKyAgICAgICAgbV9mb2N1c2VkTm9kZS0+c2V0
Rm9jdXModHJ1ZSk7CisKKyAgICAgICAgaWYgKG1fZm9jdXNlZE5vZGUtPmlzUm9vdEVkaXRhYmxl
RWxlbWVudCgpKQorICAgICAgICAgICAgZnJhbWUoKS0+ZWRpdG9yKCktPmRpZEJlZ2luRWRpdGlu
ZygpOworCisgICAgICAgIC8vIGV3dywgSSBzdWNrLiBzZXQgdGhlIHF0IGZvY3VzIGNvcnJlY3Rs
eQorICAgICAgICAvLyAjIyMgZmluZCBhIGJldHRlciBwbGFjZSBpbiB0aGUgY29kZSBmb3IgdGhp
cworICAgICAgICBpZiAodmlldygpKSB7CisgICAgICAgICAgICBXaWRnZXQqIGZvY3VzV2lkZ2V0
ID0gd2lkZ2V0Rm9yTm9kZShtX2ZvY3VzZWROb2RlLmdldCgpKTsKKyAgICAgICAgICAgIGlmIChm
b2N1c1dpZGdldCkgeworICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBhIHdpZGdldCBoYXMg
dGhlIHJpZ2h0IHNpemUgYmVmb3JlIGdpdmluZyBpdCBmb2N1cy4KKyAgICAgICAgICAgICAgICAv
LyBPdGhlcndpc2UsIHdlIGFyZSB0ZXN0aW5nIGVkZ2UgY2FzZXMgb2YgdGhlIFdpZGdldCBjb2Rl
LgorICAgICAgICAgICAgICAgIC8vIFNwZWNpZmljYWxseSwgaW4gV2ViQ29yZSB0aGlzIGRvZXMg
bm90IHdvcmsgd2VsbCBmb3IgdGV4dCBmaWVsZHMuCisgICAgICAgICAgICAgICAgdXBkYXRlTGF5
b3V0KCk7CisgICAgICAgICAgICAgICAgLy8gUmUtZ2V0IHRoZSB3aWRnZXQgaW4gY2FzZSB1cGRh
dGluZyB0aGUgbGF5b3V0IGNoYW5nZWQgdGhpbmdzLgorICAgICAgICAgICAgICAgIGZvY3VzV2lk
Z2V0ID0gd2lkZ2V0Rm9yTm9kZShtX2ZvY3VzZWROb2RlLmdldCgpKTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIGlmIChmb2N1c1dpZGdldCkKKyAgICAgICAgICAgICAgICBmb2N1c1dpZGdl
dC0+c2V0Rm9jdXModHJ1ZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdmll
dygpLT5zZXRGb2N1cyh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworI2lmIFBMQVRGT1JNKE1B
QykgfHwgUExBVEZPUk0oV0lOKSB8fCBQTEFURk9STShHVEspIHx8IFBMQVRGT1JNKENIUk9NSVVN
KQorICAgIGlmICghZm9jdXNDaGFuZ2VCbG9ja2VkICYmIG1fZm9jdXNlZE5vZGUgJiYgQVhPYmpl
Y3RDYWNoZTo6YWNjZXNzaWJpbGl0eUVuYWJsZWQoKSkKKyAgICAgICAgYXhPYmplY3RDYWNoZSgp
LT5oYW5kbGVGb2N1c2VkVUlFbGVtZW50Q2hhbmdlZChvbGRGb2N1c2VkTm9kZS5nZXQoKSwgbmV3
Rm9jdXNlZE5vZGUuZ2V0KCkpOworI2VuZGlmCisgICAgaWYgKCFmb2N1c0NoYW5nZUJsb2NrZWQp
CisgICAgICAgIHBhZ2UoKS0+Y2hyb21lKCktPmZvY3VzZWROb2RlQ2hhbmdlZChtX2ZvY3VzZWRO
b2RlLmdldCgpKTsKKworU2V0Rm9jdXNlZE5vZGVEb25lOgorICAgIHVwZGF0ZVN0eWxlSWZOZWVk
ZWQoKTsKKyAgICByZXR1cm4gIWZvY3VzQ2hhbmdlQmxvY2tlZDsKK30KKyAgICAKK3ZvaWQgRG9j
dW1lbnQ6OmdldEZvY3VzYWJsZU5vZGVzKFZlY3RvcjxSZWZQdHI8Tm9kZT4gPiYgbm9kZXMpCit7
CisgICAgdXBkYXRlTGF5b3V0KCk7CisKKyAgICBmb3IgKE5vZGUqIG5vZGUgPSBmaXJzdENoaWxk
KCk7IG5vZGU7IG5vZGUgPSBub2RlLT50cmF2ZXJzZU5leHROb2RlKCkpIHsKKyAgICAgICAgaWYg
KG5vZGUtPmlzRm9jdXNhYmxlKCkpCisgICAgICAgICAgICBub2Rlcy5hcHBlbmQobm9kZSk7Cisg
ICAgfQorfQorICAKK3ZvaWQgRG9jdW1lbnQ6OnNldENTU1RhcmdldChFbGVtZW50KiBuKQorewor
ICAgIGlmIChtX2Nzc1RhcmdldCkKKyAgICAgICAgbV9jc3NUYXJnZXQtPnNldE5lZWRzU3R5bGVS
ZWNhbGMoKTsKKyAgICBtX2Nzc1RhcmdldCA9IG47CisgICAgaWYgKG4pCisgICAgICAgIG4tPnNl
dE5lZWRzU3R5bGVSZWNhbGMoKTsKK30KKwordm9pZCBEb2N1bWVudDo6cmVnaXN0ZXJOb2RlTGlz
dENhY2hlKER5bmFtaWNOb2RlTGlzdENhY2hlQmFzZSogbGlzdCkKK3sKKyAgICBpZiAobGlzdC0+
dHlwZSgpICE9IE5vZGVMaXN0Q29sbGVjdGlvblR5cGUpCisgICAgICAgIG1fbm9kZUxpc3RDb3Vu
dHNbSW52YWxpZGF0ZU9uSWROYW1lQXR0ckNoYW5nZV0rKzsKKyAgICBtX25vZGVMaXN0Q291bnRz
W2xpc3QtPmludmFsaWRhdGlvblR5cGUoKV0rKzsKKyAgICBpZiAobGlzdC0+aXNSb290ZWRBdERv
Y3VtZW50KCkpCisgICAgICAgIG1fbGlzdHNJbnZhbGlkYXRlZEF0RG9jdW1lbnQuYWRkKGxpc3Qp
OworfQorCit2b2lkIERvY3VtZW50Ojp1bnJlZ2lzdGVyTm9kZUxpc3RDYWNoZShEeW5hbWljTm9k
ZUxpc3RDYWNoZUJhc2UqIGxpc3QpCit7CisgICAgaWYgKGxpc3QtPnR5cGUoKSAhPSBOb2RlTGlz
dENvbGxlY3Rpb25UeXBlKQorICAgICAgICBtX25vZGVMaXN0Q291bnRzW0ludmFsaWRhdGVPbklk
TmFtZUF0dHJDaGFuZ2VdLS07CisgICAgbV9ub2RlTGlzdENvdW50c1tsaXN0LT5pbnZhbGlkYXRp
b25UeXBlKCldLS07CisgICAgaWYgKGxpc3QtPmlzUm9vdGVkQXREb2N1bWVudCgpKSB7CisgICAg
ICAgIEFTU0VSVChtX2xpc3RzSW52YWxpZGF0ZWRBdERvY3VtZW50LmNvbnRhaW5zKGxpc3QpKTsK
KyAgICAgICAgbV9saXN0c0ludmFsaWRhdGVkQXREb2N1bWVudC5yZW1vdmUobGlzdCk7CisgICAg
fQorfQorCit2b2lkIERvY3VtZW50OjphdHRhY2hOb2RlSXRlcmF0b3IoTm9kZUl0ZXJhdG9yKiBu
aSkKK3sKKyAgICBtX25vZGVJdGVyYXRvcnMuYWRkKG5pKTsKK30KKwordm9pZCBEb2N1bWVudDo6
ZGV0YWNoTm9kZUl0ZXJhdG9yKE5vZGVJdGVyYXRvciogbmkpCit7CisgICAgLy8gVGhlIG5vZGUg
aXRlcmF0b3IgY2FuIGJlIGRldGFjaGVkIHdpdGhvdXQgaGF2aW5nIGJlZW4gYXR0YWNoZWQgaWYg
aXRzIHJvb3Qgbm9kZSBkaWRuJ3QgaGF2ZSBhIGRvY3VtZW50CisgICAgLy8gd2hlbiB0aGUgaXRl
cmF0b3Igd2FzIGNyZWF0ZWQsIGJ1dCBoYXMgaXQgbm93LgorICAgIG1fbm9kZUl0ZXJhdG9ycy5y
ZW1vdmUobmkpOworfQorCit2b2lkIERvY3VtZW50Ojptb3ZlTm9kZUl0ZXJhdG9yc1RvTmV3RG9j
dW1lbnQoTm9kZSogbm9kZSwgRG9jdW1lbnQqIG5ld0RvY3VtZW50KQoreworICAgIEhhc2hTZXQ8
Tm9kZUl0ZXJhdG9yKj4gbm9kZUl0ZXJhdG9yc0xpc3QgPSBtX25vZGVJdGVyYXRvcnM7CisgICAg
SGFzaFNldDxOb2RlSXRlcmF0b3IqPjo6Y29uc3RfaXRlcmF0b3Igbm9kZUl0ZXJhdG9yc0VuZCA9
IG5vZGVJdGVyYXRvcnNMaXN0LmVuZCgpOworICAgIGZvciAoSGFzaFNldDxOb2RlSXRlcmF0b3Iq
Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBub2RlSXRlcmF0b3JzTGlzdC5iZWdpbigpOyBpdCAhPSBu
b2RlSXRlcmF0b3JzRW5kOyArK2l0KSB7CisgICAgICAgIGlmICgoKml0KS0+cm9vdCgpID09IG5v
ZGUpIHsKKyAgICAgICAgICAgIGRldGFjaE5vZGVJdGVyYXRvcigqaXQpOworICAgICAgICAgICAg
bmV3RG9jdW1lbnQtPmF0dGFjaE5vZGVJdGVyYXRvcigqaXQpOworICAgICAgICB9CisgICAgfQor
fQorCit2b2lkIERvY3VtZW50Ojp1cGRhdGVSYW5nZXNBZnRlckNoaWxkcmVuQ2hhbmdlZChDb250
YWluZXJOb2RlKiBjb250YWluZXIpCit7CisgICAgaWYgKCFtX3Jhbmdlcy5pc0VtcHR5KCkpIHsK
KyAgICAgICAgSGFzaFNldDxSYW5nZSo+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBtX3Jhbmdlcy5l
bmQoKTsKKyAgICAgICAgZm9yIChIYXNoU2V0PFJhbmdlKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0g
bV9yYW5nZXMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KQorICAgICAgICAgICAgKCppdCktPm5v
ZGVDaGlsZHJlbkNoYW5nZWQoY29udGFpbmVyKTsKKyAgICB9Cit9CisKK3ZvaWQgRG9jdW1lbnQ6
Om5vZGVDaGlsZHJlbldpbGxCZVJlbW92ZWQoQ29udGFpbmVyTm9kZSogY29udGFpbmVyKQorewor
ICAgIGlmICghbV9yYW5nZXMuaXNFbXB0eSgpKSB7CisgICAgICAgIEhhc2hTZXQ8UmFuZ2UqPjo6
Y29uc3RfaXRlcmF0b3IgZW5kID0gbV9yYW5nZXMuZW5kKCk7CisgICAgICAgIGZvciAoSGFzaFNl
dDxSYW5nZSo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmFuZ2VzLmJlZ2luKCk7IGl0ICE9IGVu
ZDsgKytpdCkKKyAgICAgICAgICAgICgqaXQpLT5ub2RlQ2hpbGRyZW5XaWxsQmVSZW1vdmVkKGNv
bnRhaW5lcik7CisgICAgfQorCisgICAgSGFzaFNldDxOb2RlSXRlcmF0b3IqPjo6Y29uc3RfaXRl
cmF0b3Igbm9kZUl0ZXJhdG9yc0VuZCA9IG1fbm9kZUl0ZXJhdG9ycy5lbmQoKTsKKyAgICBmb3Ig
KEhhc2hTZXQ8Tm9kZUl0ZXJhdG9yKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9ub2RlSXRlcmF0
b3JzLmJlZ2luKCk7IGl0ICE9IG5vZGVJdGVyYXRvcnNFbmQ7ICsraXQpIHsKKyAgICAgICAgZm9y
IChOb2RlKiBuID0gY29udGFpbmVyLT5maXJzdENoaWxkKCk7IG47IG4gPSBuLT5uZXh0U2libGlu
ZygpKQorICAgICAgICAgICAgKCppdCktPm5vZGVXaWxsQmVSZW1vdmVkKG4pOworICAgIH0KKwor
ICAgIGlmIChGcmFtZSogZnJhbWUgPSB0aGlzLT5mcmFtZSgpKSB7CisgICAgICAgIGZvciAoTm9k
ZSogbiA9IGNvbnRhaW5lci0+Zmlyc3RDaGlsZCgpOyBuOyBuID0gbi0+bmV4dFNpYmxpbmcoKSkg
eworICAgICAgICAgICAgZnJhbWUtPmV2ZW50SGFuZGxlcigpLT5ub2RlV2lsbEJlUmVtb3ZlZChu
KTsKKyAgICAgICAgICAgIGZyYW1lLT5zZWxlY3Rpb24oKS0+bm9kZVdpbGxCZVJlbW92ZWQobik7
CisgICAgICAgICAgICBmcmFtZS0+cGFnZSgpLT5kcmFnQ2FyZXRDb250cm9sbGVyKCktPm5vZGVX
aWxsQmVSZW1vdmVkKG4pOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIERvY3VtZW50Ojpu
b2RlV2lsbEJlUmVtb3ZlZChOb2RlKiBuKQoreworICAgIEhhc2hTZXQ8Tm9kZUl0ZXJhdG9yKj46
OmNvbnN0X2l0ZXJhdG9yIG5vZGVJdGVyYXRvcnNFbmQgPSBtX25vZGVJdGVyYXRvcnMuZW5kKCk7
CisgICAgZm9yIChIYXNoU2V0PE5vZGVJdGVyYXRvcio+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1f
bm9kZUl0ZXJhdG9ycy5iZWdpbigpOyBpdCAhPSBub2RlSXRlcmF0b3JzRW5kOyArK2l0KQorICAg
ICAgICAoKml0KS0+bm9kZVdpbGxCZVJlbW92ZWQobik7CisKKyAgICBpZiAoIW1fcmFuZ2VzLmlz
RW1wdHkoKSkgeworICAgICAgICBIYXNoU2V0PFJhbmdlKj46OmNvbnN0X2l0ZXJhdG9yIHJhbmdl
c0VuZCA9IG1fcmFuZ2VzLmVuZCgpOworICAgICAgICBmb3IgKEhhc2hTZXQ8UmFuZ2UqPjo6Y29u
c3RfaXRlcmF0b3IgaXQgPSBtX3Jhbmdlcy5iZWdpbigpOyBpdCAhPSByYW5nZXNFbmQ7ICsraXQp
CisgICAgICAgICAgICAoKml0KS0+bm9kZVdpbGxCZVJlbW92ZWQobik7CisgICAgfQorCisgICAg
aWYgKEZyYW1lKiBmcmFtZSA9IHRoaXMtPmZyYW1lKCkpIHsKKyAgICAgICAgZnJhbWUtPmV2ZW50
SGFuZGxlcigpLT5ub2RlV2lsbEJlUmVtb3ZlZChuKTsKKyAgICAgICAgZnJhbWUtPnNlbGVjdGlv
bigpLT5ub2RlV2lsbEJlUmVtb3ZlZChuKTsKKyAgICAgICAgZnJhbWUtPnBhZ2UoKS0+ZHJhZ0Nh
cmV0Q29udHJvbGxlcigpLT5ub2RlV2lsbEJlUmVtb3ZlZChuKTsKKyAgICB9Cit9CisKK3ZvaWQg
RG9jdW1lbnQ6OnRleHRJbnNlcnRlZChOb2RlKiB0ZXh0LCB1bnNpZ25lZCBvZmZzZXQsIHVuc2ln
bmVkIGxlbmd0aCkKK3sKKyAgICBpZiAoIW1fcmFuZ2VzLmlzRW1wdHkoKSkgeworICAgICAgICBI
YXNoU2V0PFJhbmdlKj46OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fcmFuZ2VzLmVuZCgpOworICAg
ICAgICBmb3IgKEhhc2hTZXQ8UmFuZ2UqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3Jhbmdlcy5i
ZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpCisgICAgICAgICAgICAoKml0KS0+dGV4dEluc2VydGVk
KHRleHQsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICB9CisKKyAgICAvLyBVcGRhdGUgdGhlIG1hcmtl
cnMgZm9yIHNwZWxsaW5nIGFuZCBncmFtbWFyIGNoZWNraW5nLgorICAgIG1fbWFya2Vycy0+c2hp
ZnRNYXJrZXJzKHRleHQsIG9mZnNldCwgbGVuZ3RoKTsKK30KKwordm9pZCBEb2N1bWVudDo6dGV4
dFJlbW92ZWQoTm9kZSogdGV4dCwgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBsZW5ndGgpCit7
CisgICAgaWYgKCFtX3Jhbmdlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgSGFzaFNldDxSYW5nZSo+
Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBtX3Jhbmdlcy5lbmQoKTsKKyAgICAgICAgZm9yIChIYXNo
U2V0PFJhbmdlKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yYW5nZXMuYmVnaW4oKTsgaXQgIT0g
ZW5kOyArK2l0KQorICAgICAgICAgICAgKCppdCktPnRleHRSZW1vdmVkKHRleHQsIG9mZnNldCwg
bGVuZ3RoKTsKKyAgICB9CisKKyAgICAvLyBVcGRhdGUgdGhlIG1hcmtlcnMgZm9yIHNwZWxsaW5n
IGFuZCBncmFtbWFyIGNoZWNraW5nLgorICAgIG1fbWFya2Vycy0+cmVtb3ZlTWFya2Vycyh0ZXh0
LCBvZmZzZXQsIGxlbmd0aCk7CisgICAgbV9tYXJrZXJzLT5zaGlmdE1hcmtlcnModGV4dCwgb2Zm
c2V0ICsgbGVuZ3RoLCAwIC0gbGVuZ3RoKTsKK30KKwordm9pZCBEb2N1bWVudDo6dGV4dE5vZGVz
TWVyZ2VkKFRleHQqIG9sZE5vZGUsIHVuc2lnbmVkIG9mZnNldCkKK3sKKyAgICBpZiAoIW1fcmFu
Z2VzLmlzRW1wdHkoKSkgeworICAgICAgICBOb2RlV2l0aEluZGV4IG9sZE5vZGVXaXRoSW5kZXgo
b2xkTm9kZSk7CisgICAgICAgIEhhc2hTZXQ8UmFuZ2UqPjo6Y29uc3RfaXRlcmF0b3IgZW5kID0g
bV9yYW5nZXMuZW5kKCk7CisgICAgICAgIGZvciAoSGFzaFNldDxSYW5nZSo+Ojpjb25zdF9pdGVy
YXRvciBpdCA9IG1fcmFuZ2VzLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkKKyAgICAgICAgICAg
ICgqaXQpLT50ZXh0Tm9kZXNNZXJnZWQob2xkTm9kZVdpdGhJbmRleCwgb2Zmc2V0KTsKKyAgICB9
CisKKyAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgdXBkYXRlIG1hcmtlcnMgZm9yIHNwZWxsaW5n
IGFuZCBncmFtbWFyIGNoZWNraW5nLgorfQorCit2b2lkIERvY3VtZW50Ojp0ZXh0Tm9kZVNwbGl0
KFRleHQqIG9sZE5vZGUpCit7CisgICAgaWYgKCFtX3Jhbmdlcy5pc0VtcHR5KCkpIHsKKyAgICAg
ICAgSGFzaFNldDxSYW5nZSo+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBtX3Jhbmdlcy5lbmQoKTsK
KyAgICAgICAgZm9yIChIYXNoU2V0PFJhbmdlKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yYW5n
ZXMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KQorICAgICAgICAgICAgKCppdCktPnRleHROb2Rl
U3BsaXQob2xkTm9kZSk7CisgICAgfQorCisgICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIHVwZGF0
ZSBtYXJrZXJzIGZvciBzcGVsbGluZyBhbmQgZ3JhbW1hciBjaGVja2luZy4KK30KKwordm9pZCBE
b2N1bWVudDo6Y3JlYXRlRE9NV2luZG93KCkKK3sKKyAgICBBU1NFUlQobV9mcmFtZSk7CisgICAg
QVNTRVJUKCFtX2RvbVdpbmRvdyk7CisKKyAgICBtX2RvbVdpbmRvdyA9IERPTVdpbmRvdzo6Y3Jl
YXRlKHRoaXMpOworCisgICAgQVNTRVJUKG1fZG9tV2luZG93LT5kb2N1bWVudCgpID09IHRoaXMp
OworICAgIEFTU0VSVChtX2RvbVdpbmRvdy0+ZnJhbWUoKSA9PSBtX2ZyYW1lKTsKK30KKwordm9p
ZCBEb2N1bWVudDo6dGFrZURPTVdpbmRvd0Zyb20oRG9jdW1lbnQqIGRvY3VtZW50KQoreworICAg
IEFTU0VSVChtX2ZyYW1lKTsKKyAgICBBU1NFUlQoIW1fZG9tV2luZG93KTsKKyAgICBBU1NFUlQo
ZG9jdW1lbnQtPmRvbVdpbmRvdygpKTsKKworICAgIG1fZG9tV2luZG93ID0gZG9jdW1lbnQtPm1f
ZG9tV2luZG93LnJlbGVhc2UoKTsKKyAgICBtX2RvbVdpbmRvdy0+ZGlkU2VjdXJlVHJhbnNpdGlv
blRvKHRoaXMpOworCisgICAgQVNTRVJUKG1fZG9tV2luZG93LT5kb2N1bWVudCgpID09IHRoaXMp
OworICAgIEFTU0VSVChtX2RvbVdpbmRvdy0+ZnJhbWUoKSA9PSBtX2ZyYW1lKTsKK30KKwordm9p
ZCBEb2N1bWVudDo6c2V0V2luZG93QXR0cmlidXRlRXZlbnRMaXN0ZW5lcihjb25zdCBBdG9taWNT
dHJpbmcmIGV2ZW50VHlwZSwgUGFzc1JlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lcikKK3sK
KyAgICBET01XaW5kb3cqIGRvbVdpbmRvdyA9IHRoaXMtPmRvbVdpbmRvdygpOworICAgIGlmICgh
ZG9tV2luZG93KQorICAgICAgICByZXR1cm47CisgICAgZG9tV2luZG93LT5zZXRBdHRyaWJ1dGVF
dmVudExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIpOworfQorCitFdmVudExpc3RlbmVyKiBE
b2N1bWVudDo6Z2V0V2luZG93QXR0cmlidXRlRXZlbnRMaXN0ZW5lcihjb25zdCBBdG9taWNTdHJp
bmcmIGV2ZW50VHlwZSkKK3sKKyAgICBET01XaW5kb3cqIGRvbVdpbmRvdyA9IHRoaXMtPmRvbVdp
bmRvdygpOworICAgIGlmICghZG9tV2luZG93KQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1
cm4gZG9tV2luZG93LT5nZXRBdHRyaWJ1dGVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSk7Cit9CisK
K3ZvaWQgRG9jdW1lbnQ6OmRpc3BhdGNoV2luZG93RXZlbnQoUGFzc1JlZlB0cjxFdmVudD4gZXZl
bnQsICBQYXNzUmVmUHRyPEV2ZW50VGFyZ2V0PiB0YXJnZXQpCit7CisgICAgQVNTRVJUKCFldmVu
dERpc3BhdGNoRm9yYmlkZGVuKCkpOworICAgIERPTVdpbmRvdyogZG9tV2luZG93ID0gdGhpcy0+
ZG9tV2luZG93KCk7CisgICAgaWYgKCFkb21XaW5kb3cpCisgICAgICAgIHJldHVybjsKKyAgICBk
b21XaW5kb3ctPmRpc3BhdGNoRXZlbnQoZXZlbnQsIHRhcmdldCk7Cit9CisKK3ZvaWQgRG9jdW1l
bnQ6OmRpc3BhdGNoV2luZG93TG9hZEV2ZW50KCkKK3sKKyAgICBBU1NFUlQoIWV2ZW50RGlzcGF0
Y2hGb3JiaWRkZW4oKSk7CisgICAgRE9NV2luZG93KiBkb21XaW5kb3cgPSB0aGlzLT5kb21XaW5k
b3coKTsKKyAgICBpZiAoIWRvbVdpbmRvdykKKyAgICAgICAgcmV0dXJuOworICAgIGRvbVdpbmRv
dy0+ZGlzcGF0Y2hMb2FkRXZlbnQoKTsKKyAgICBtX2xvYWRFdmVudEZpbmlzaGVkID0gdHJ1ZTsK
K30KKwordm9pZCBEb2N1bWVudDo6ZW5xdWV1ZVdpbmRvd0V2ZW50KFBhc3NSZWZQdHI8RXZlbnQ+
IGV2ZW50KQoreworICAgIGV2ZW50LT5zZXRUYXJnZXQoZG9tV2luZG93KCkpOworICAgIG1fZXZl
bnRRdWV1ZS0+ZW5xdWV1ZUV2ZW50KGV2ZW50KTsKK30KKwordm9pZCBEb2N1bWVudDo6ZW5xdWV1
ZURvY3VtZW50RXZlbnQoUGFzc1JlZlB0cjxFdmVudD4gZXZlbnQpCit7CisgICAgZXZlbnQtPnNl
dFRhcmdldCh0aGlzKTsKKyAgICBtX2V2ZW50UXVldWUtPmVucXVldWVFdmVudChldmVudCk7Cit9
CisKK1Bhc3NSZWZQdHI8RXZlbnQ+IERvY3VtZW50OjpjcmVhdGVFdmVudChjb25zdCBTdHJpbmcm
IGV2ZW50VHlwZSwgRXhjZXB0aW9uQ29kZSYgZWMpCit7CisgICAgUmVmUHRyPEV2ZW50PiBldmVu
dCA9IEV2ZW50RmFjdG9yeTo6Y3JlYXRlKGV2ZW50VHlwZSk7CisgICAgaWYgKGV2ZW50KQorICAg
ICAgICByZXR1cm4gZXZlbnQucmVsZWFzZSgpOworCisgICAgZWMgPSBOT1RfU1VQUE9SVEVEX0VS
UjsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBEb2N1bWVudDo6YWRkTXV0YXRpb25FdmVudExp
c3RlbmVyVHlwZUlmRW5hYmxlZChMaXN0ZW5lclR5cGUgbGlzdGVuZXJUeXBlKQoreworICAgIGlm
IChDb250ZXh0RmVhdHVyZXM6Om11dGF0aW9uRXZlbnRzRW5hYmxlZCh0aGlzKSkKKyAgICAgICAg
YWRkTGlzdGVuZXJUeXBlKGxpc3RlbmVyVHlwZSk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmFkZExp
c3RlbmVyVHlwZUlmTmVlZGVkKGNvbnN0IEF0b21pY1N0cmluZyYgZXZlbnRUeXBlKQoreworICAg
IGlmIChldmVudFR5cGUgPT0gZXZlbnROYW1lcygpLkRPTVN1YnRyZWVNb2RpZmllZEV2ZW50KQor
ICAgICAgICBhZGRNdXRhdGlvbkV2ZW50TGlzdGVuZXJUeXBlSWZFbmFibGVkKERPTVNVQlRSRUVN
T0RJRklFRF9MSVNURU5FUik7CisgICAgZWxzZSBpZiAoZXZlbnRUeXBlID09IGV2ZW50TmFtZXMo
KS5ET01Ob2RlSW5zZXJ0ZWRFdmVudCkKKyAgICAgICAgYWRkTXV0YXRpb25FdmVudExpc3RlbmVy
VHlwZUlmRW5hYmxlZChET01OT0RFSU5TRVJURURfTElTVEVORVIpOworICAgIGVsc2UgaWYgKGV2
ZW50VHlwZSA9PSBldmVudE5hbWVzKCkuRE9NTm9kZVJlbW92ZWRFdmVudCkKKyAgICAgICAgYWRk
TXV0YXRpb25FdmVudExpc3RlbmVyVHlwZUlmRW5hYmxlZChET01OT0RFUkVNT1ZFRF9MSVNURU5F
Uik7CisgICAgZWxzZSBpZiAoZXZlbnRUeXBlID09IGV2ZW50TmFtZXMoKS5ET01Ob2RlUmVtb3Zl
ZEZyb21Eb2N1bWVudEV2ZW50KQorICAgICAgICBhZGRNdXRhdGlvbkV2ZW50TGlzdGVuZXJUeXBl
SWZFbmFibGVkKERPTU5PREVSRU1PVkVERlJPTURPQ1VNRU5UX0xJU1RFTkVSKTsKKyAgICBlbHNl
IGlmIChldmVudFR5cGUgPT0gZXZlbnROYW1lcygpLkRPTU5vZGVJbnNlcnRlZEludG9Eb2N1bWVu
dEV2ZW50KQorICAgICAgICBhZGRNdXRhdGlvbkV2ZW50TGlzdGVuZXJUeXBlSWZFbmFibGVkKERP
TU5PREVJTlNFUlRFRElOVE9ET0NVTUVOVF9MSVNURU5FUik7CisgICAgZWxzZSBpZiAoZXZlbnRU
eXBlID09IGV2ZW50TmFtZXMoKS5ET01BdHRyTW9kaWZpZWRFdmVudCkKKyAgICAgICAgYWRkTXV0
YXRpb25FdmVudExpc3RlbmVyVHlwZUlmRW5hYmxlZChET01BVFRSTU9ESUZJRURfTElTVEVORVIp
OworICAgIGVsc2UgaWYgKGV2ZW50VHlwZSA9PSBldmVudE5hbWVzKCkuRE9NQ2hhcmFjdGVyRGF0
YU1vZGlmaWVkRXZlbnQpCisgICAgICAgIGFkZE11dGF0aW9uRXZlbnRMaXN0ZW5lclR5cGVJZkVu
YWJsZWQoRE9NQ0hBUkFDVEVSREFUQU1PRElGSUVEX0xJU1RFTkVSKTsKKyAgICBlbHNlIGlmIChl
dmVudFR5cGUgPT0gZXZlbnROYW1lcygpLm92ZXJmbG93Y2hhbmdlZEV2ZW50KQorICAgICAgICBh
ZGRMaXN0ZW5lclR5cGUoT1ZFUkZMT1dDSEFOR0VEX0xJU1RFTkVSKTsKKyAgICBlbHNlIGlmIChl
dmVudFR5cGUgPT0gZXZlbnROYW1lcygpLndlYmtpdEFuaW1hdGlvblN0YXJ0RXZlbnQpCisgICAg
ICAgIGFkZExpc3RlbmVyVHlwZShBTklNQVRJT05TVEFSVF9MSVNURU5FUik7CisgICAgZWxzZSBp
ZiAoZXZlbnRUeXBlID09IGV2ZW50TmFtZXMoKS53ZWJraXRBbmltYXRpb25FbmRFdmVudCkKKyAg
ICAgICAgYWRkTGlzdGVuZXJUeXBlKEFOSU1BVElPTkVORF9MSVNURU5FUik7CisgICAgZWxzZSBp
ZiAoZXZlbnRUeXBlID09IGV2ZW50TmFtZXMoKS53ZWJraXRBbmltYXRpb25JdGVyYXRpb25FdmVu
dCkKKyAgICAgICAgYWRkTGlzdGVuZXJUeXBlKEFOSU1BVElPTklURVJBVElPTl9MSVNURU5FUik7
CisgICAgZWxzZSBpZiAoZXZlbnRUeXBlID09IGV2ZW50TmFtZXMoKS53ZWJraXRUcmFuc2l0aW9u
RW5kRXZlbnQpCisgICAgICAgIGFkZExpc3RlbmVyVHlwZShUUkFOU0lUSU9ORU5EX0xJU1RFTkVS
KTsKKyAgICBlbHNlIGlmIChldmVudFR5cGUgPT0gZXZlbnROYW1lcygpLmJlZm9yZWxvYWRFdmVu
dCkKKyAgICAgICAgYWRkTGlzdGVuZXJUeXBlKEJFRk9SRUxPQURfTElTVEVORVIpOworICAgIGVs
c2UgaWYgKGV2ZW50VHlwZSA9PSBldmVudE5hbWVzKCkuc2Nyb2xsRXZlbnQpCisgICAgICAgIGFk
ZExpc3RlbmVyVHlwZShTQ1JPTExfTElTVEVORVIpOworfQorCitDU1NTdHlsZURlY2xhcmF0aW9u
KiBEb2N1bWVudDo6Z2V0T3ZlcnJpZGVTdHlsZShFbGVtZW50KiwgY29uc3QgU3RyaW5nJikKK3sK
KyAgICByZXR1cm4gMDsKK30KKworSFRNTEZyYW1lT3duZXJFbGVtZW50KiBEb2N1bWVudDo6b3du
ZXJFbGVtZW50KCkgY29uc3QKK3sKKyAgICBpZiAoIWZyYW1lKCkpCisgICAgICAgIHJldHVybiAw
OworICAgIHJldHVybiBmcmFtZSgpLT5vd25lckVsZW1lbnQoKTsKK30KKworU3RyaW5nIERvY3Vt
ZW50Ojpjb29raWUoRXhjZXB0aW9uQ29kZSYgZWMpIGNvbnN0Cit7CisgICAgaWYgKHBhZ2UoKSAm
JiAhcGFnZSgpLT5zZXR0aW5ncygpLT5jb29raWVFbmFibGVkKCkpCisgICAgICAgIHJldHVybiBT
dHJpbmcoKTsKKworICAgIC8vIEZJWE1FOiBUaGUgSFRNTDUgRE9NIHNwZWMgc3RhdGVzIHRoYXQg
dGhpcyBhdHRyaWJ1dGUgY2FuIHJhaXNlIGFuCisgICAgLy8gSU5WQUxJRF9TVEFURV9FUlIgZXhj
ZXB0aW9uIG9uIGdldHRpbmcgaWYgdGhlIERvY3VtZW50IGhhcyBubworICAgIC8vIGJyb3dzaW5n
IGNvbnRleHQuCisKKyAgICBpZiAoIXNlY3VyaXR5T3JpZ2luKCktPmNhbkFjY2Vzc0Nvb2tpZXMo
KSkgeworICAgICAgICBlYyA9IFNFQ1VSSVRZX0VSUjsKKyAgICAgICAgcmV0dXJuIFN0cmluZygp
OworICAgIH0KKworICAgIEtVUkwgY29va2llVVJMID0gdGhpcy0+Y29va2llVVJMKCk7CisgICAg
aWYgKGNvb2tpZVVSTC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBTdHJpbmcoKTsKKworICAg
IHJldHVybiBjb29raWVzKHRoaXMsIGNvb2tpZVVSTCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnNl
dENvb2tpZShjb25zdCBTdHJpbmcmIHZhbHVlLCBFeGNlcHRpb25Db2RlJiBlYykKK3sKKyAgICBp
ZiAocGFnZSgpICYmICFwYWdlKCktPnNldHRpbmdzKCktPmNvb2tpZUVuYWJsZWQoKSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgLy8gRklYTUU6IFRoZSBIVE1MNSBET00gc3BlYyBzdGF0ZXMgdGhh
dCB0aGlzIGF0dHJpYnV0ZSBjYW4gcmFpc2UgYW4KKyAgICAvLyBJTlZBTElEX1NUQVRFX0VSUiBl
eGNlcHRpb24gb24gc2V0dGluZyBpZiB0aGUgRG9jdW1lbnQgaGFzIG5vCisgICAgLy8gYnJvd3Np
bmcgY29udGV4dC4KKworICAgIGlmICghc2VjdXJpdHlPcmlnaW4oKS0+Y2FuQWNjZXNzQ29va2ll
cygpKSB7CisgICAgICAgIGVjID0gU0VDVVJJVFlfRVJSOworICAgICAgICByZXR1cm47CisgICAg
fQorCisgICAgS1VSTCBjb29raWVVUkwgPSB0aGlzLT5jb29raWVVUkwoKTsKKyAgICBpZiAoY29v
a2llVVJMLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgc2V0Q29va2llcyh0aGlz
LCBjb29raWVVUkwsIHZhbHVlKTsKK30KKworU3RyaW5nIERvY3VtZW50OjpyZWZlcnJlcigpIGNv
bnN0Cit7CisgICAgaWYgKGZyYW1lKCkpCisgICAgICAgIHJldHVybiBmcmFtZSgpLT5sb2FkZXIo
KS0+cmVmZXJyZXIoKTsKKyAgICByZXR1cm4gU3RyaW5nKCk7Cit9CisKK1N0cmluZyBEb2N1bWVu
dDo6ZG9tYWluKCkgY29uc3QKK3sKKyAgICByZXR1cm4gc2VjdXJpdHlPcmlnaW4oKS0+ZG9tYWlu
KCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnNldERvbWFpbihjb25zdCBTdHJpbmcmIG5ld0RvbWFp
biwgRXhjZXB0aW9uQ29kZSYgZWMpCit7CisgICAgaWYgKFNjaGVtZVJlZ2lzdHJ5Ojppc0RvbWFp
blJlbGF4YXRpb25Gb3JiaWRkZW5Gb3JVUkxTY2hlbWUoc2VjdXJpdHlPcmlnaW4oKS0+cHJvdG9j
b2woKSkpIHsKKyAgICAgICAgZWMgPSBTRUNVUklUWV9FUlI7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisKKyAgICAvLyBCb3RoIE5TIGFuZCBJRSBzcGVjaWZ5IHRoYXQgY2hhbmdpbmcgdGhlIGRv
bWFpbiBpcyBvbmx5IGFsbG93ZWQgd2hlbgorICAgIC8vIHRoZSBuZXcgZG9tYWluIGlzIGEgc3Vm
Zml4IG9mIHRoZSBvbGQgZG9tYWluLgorCisgICAgLy8gRklYTUU6IFdlIHNob3VsZCBhZGQgbG9n
Z2luZyBpbmRpY2F0aW5nIHdoeSBhIGRvbWFpbiB3YXMgbm90IGFsbG93ZWQuCisKKyAgICAvLyBJ
ZiB0aGUgbmV3IGRvbWFpbiBpcyB0aGUgc2FtZSBhcyB0aGUgb2xkIGRvbWFpbiwgc3RpbGwgY2Fs
bAorICAgIC8vIHNlY3VyaXR5T3JpZ2luKCktPnNldERvbWFpbkZvckRPTS4gVGhpcyB3aWxsIGNo
YW5nZSB0aGUKKyAgICAvLyBzZWN1cml0eSBjaGVjayBiZWhhdmlvci4gRm9yIGV4YW1wbGUsIGlm
IGEgcGFnZSBsb2FkZWQgb24gcG9ydCA4MDAwCisgICAgLy8gYXNzaWducyBpdHMgY3VycmVudCBk
b21haW4gdXNpbmcgZG9jdW1lbnQuZG9tYWluLCB0aGUgcGFnZSB3aWxsCisgICAgLy8gYWxsb3cg
b3RoZXIgcGFnZXMgbG9hZGVkIG9uIGRpZmZlcmVudCBwb3J0cyBpbiB0aGUgc2FtZSBkb21haW4g
dGhhdAorICAgIC8vIGhhdmUgYWxzbyBhc3NpZ25lZCB0byBhY2Nlc3MgdGhpcyBwYWdlLgorICAg
IGlmIChlcXVhbElnbm9yaW5nQ2FzZShkb21haW4oKSwgbmV3RG9tYWluKSkgeworICAgICAgICBz
ZWN1cml0eU9yaWdpbigpLT5zZXREb21haW5Gcm9tRE9NKG5ld0RvbWFpbik7CisgICAgICAgIGlm
IChtX2ZyYW1lKQorICAgICAgICAgICAgbV9mcmFtZS0+c2NyaXB0KCktPnVwZGF0ZVNlY3VyaXR5
T3JpZ2luKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQgb2xkTGVuZ3RoID0g
ZG9tYWluKCkubGVuZ3RoKCk7CisgICAgaW50IG5ld0xlbmd0aCA9IG5ld0RvbWFpbi5sZW5ndGgo
KTsKKyAgICAvLyBlLmcuIG5ld0RvbWFpbiA9IHdlYmtpdC5vcmcgKDEwKSBhbmQgZG9tYWluKCkg
PSB3d3cud2Via2l0Lm9yZyAoMTQpCisgICAgaWYgKG5ld0xlbmd0aCA+PSBvbGRMZW5ndGgpIHsK
KyAgICAgICAgZWMgPSBTRUNVUklUWV9FUlI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAg
ICBTdHJpbmcgdGVzdCA9IGRvbWFpbigpOworICAgIC8vIENoZWNrIHRoYXQgaXQncyBhIHN1YmRv
bWFpbiwgbm90IGUuZy4gImVia2l0Lm9yZyIKKyAgICBpZiAodGVzdFtvbGRMZW5ndGggLSBuZXdM
ZW5ndGggLSAxXSAhPSAnLicpIHsKKyAgICAgICAgZWMgPSBTRUNVUklUWV9FUlI7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisKKyAgICAvLyBOb3cgdGVzdCBpcyAid2Via2l0Lm9yZyIgZnJvbSBk
b21haW4oKQorICAgIC8vIGFuZCB3ZSBjaGVjayB0aGF0IGl0J3MgdGhlIHNhbWUgdGhpbmcgYXMg
bmV3RG9tYWluCisgICAgdGVzdC5yZW1vdmUoMCwgb2xkTGVuZ3RoIC0gbmV3TGVuZ3RoKTsKKyAg
ICBpZiAodGVzdCAhPSBuZXdEb21haW4pIHsKKyAgICAgICAgZWMgPSBTRUNVUklUWV9FUlI7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzZWN1cml0eU9yaWdpbigpLT5zZXREb21haW5G
cm9tRE9NKG5ld0RvbWFpbik7CisgICAgaWYgKG1fZnJhbWUpCisgICAgICAgIG1fZnJhbWUtPnNj
cmlwdCgpLT51cGRhdGVTZWN1cml0eU9yaWdpbigpOworfQorCisvLyBodHRwOi8vd3d3LndoYXR3
Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrLyNkb20tZG9jdW1lbnQtbGFzdG1vZGlm
aWVkCitTdHJpbmcgRG9jdW1lbnQ6Omxhc3RNb2RpZmllZCgpIGNvbnN0Cit7CisgICAgRGF0ZUNv
bXBvbmVudHMgZGF0ZTsKKyAgICBib29sIGZvdW5kRGF0ZSA9IGZhbHNlOworICAgIGlmIChtX2Zy
YW1lKSB7CisgICAgICAgIFN0cmluZyBodHRwTGFzdE1vZGlmaWVkOworICAgICAgICBpZiAoRG9j
dW1lbnRMb2FkZXIqIGRvY3VtZW50TG9hZGVyID0gbG9hZGVyKCkpIAorICAgICAgICAgICAgaHR0
cExhc3RNb2RpZmllZCA9IGRvY3VtZW50TG9hZGVyLT5yZXNwb25zZSgpLmh0dHBIZWFkZXJGaWVs
ZCgiTGFzdC1Nb2RpZmllZCIpOworICAgICAgICBpZiAoIWh0dHBMYXN0TW9kaWZpZWQuaXNFbXB0
eSgpKSB7CisgICAgICAgICAgICBkYXRlLnNldE1pbGxpc2Vjb25kc1NpbmNlRXBvY2hGb3JEYXRl
VGltZShwYXJzZURhdGUoaHR0cExhc3RNb2RpZmllZCkpOworICAgICAgICAgICAgZm91bmREYXRl
ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBGSVhNRTogSWYgdGhpcyBkb2N1bWVu
dCBjYW1lIGZyb20gdGhlIGZpbGUgc3lzdGVtLCB0aGUgSFRNTDUKKyAgICAvLyBzcGVjaWZpY2lh
dGlvbiB0ZWxscyB1cyB0byByZWFkIHRoZSBsYXN0IG1vZGlmaWNhdGlvbiBkYXRlIGZyb20gdGhl
IGZpbGUKKyAgICAvLyBzeXN0ZW0uCisgICAgaWYgKCFmb3VuZERhdGUpCisgICAgICAgIGRhdGUu
c2V0TWlsbGlzZWNvbmRzU2luY2VFcG9jaEZvckRhdGVUaW1lKGN1cnJlbnRUaW1lTVMoKSk7Cisg
ICAgcmV0dXJuIFN0cmluZzo6Zm9ybWF0KCIlMDJkLyUwMmQvJTA0ZCAlMDJkOiUwMmQ6JTAyZCIs
IGRhdGUubW9udGgoKSArIDEsIGRhdGUubW9udGhEYXkoKSwgZGF0ZS5mdWxsWWVhcigpLCBkYXRl
LmhvdXIoKSwgZGF0ZS5taW51dGUoKSwgZGF0ZS5zZWNvbmQoKSk7Cit9CisKK3N0YXRpYyBib29s
IGlzVmFsaWROYW1lTm9uQVNDSUkoY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMsIHVuc2lnbmVkIGxl
bmd0aCkKK3sKKyAgICB1bnNpZ25lZCBpID0gMDsKKworICAgIFVDaGFyMzIgYzsKKyAgICBVMTZf
TkVYVChjaGFyYWN0ZXJzLCBpLCBsZW5ndGgsIGMpCisgICAgaWYgKCFpc1ZhbGlkTmFtZVN0YXJ0
KGMpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICB3aGlsZSAoaSA8IGxlbmd0aCkgewor
ICAgICAgICBVMTZfTkVYVChjaGFyYWN0ZXJzLCBpLCBsZW5ndGgsIGMpCisgICAgICAgIGlmICgh
aXNWYWxpZE5hbWVQYXJ0KGMpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwor
ICAgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBDaGFyVHlwZT4KK3N0YXRp
YyBpbmxpbmUgYm9vbCBpc1ZhbGlkTmFtZUFTQ0lJKGNvbnN0IENoYXJUeXBlKiBjaGFyYWN0ZXJz
LCB1bnNpZ25lZCBsZW5ndGgpCit7CisgICAgQ2hhclR5cGUgYyA9IGNoYXJhY3RlcnNbMF07Cisg
ICAgaWYgKCEoaXNBU0NJSUFscGhhKGMpIHx8IGMgPT0gJzonIHx8IGMgPT0gJ18nKSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8IGxlbmd0aDsg
KytpKSB7CisgICAgICAgIGMgPSBjaGFyYWN0ZXJzW2ldOworICAgICAgICBpZiAoIShpc0FTQ0lJ
QWxwaGFudW1lcmljKGMpIHx8IGMgPT0gJzonIHx8IGMgPT0gJ18nIHx8IGMgPT0gJy0nIHx8IGMg
PT0gJy4nKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4g
dHJ1ZTsKK30KKworYm9vbCBEb2N1bWVudDo6aXNWYWxpZE5hbWUoY29uc3QgU3RyaW5nJiBuYW1l
KQoreworICAgIHVuc2lnbmVkIGxlbmd0aCA9IG5hbWUubGVuZ3RoKCk7CisgICAgaWYgKCFsZW5n
dGgpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJz
OworICAgIGlmIChuYW1lLmlzOEJpdCgpKSB7CisgICAgICAgIGlmIChpc1ZhbGlkTmFtZUFTQ0lJ
KG5hbWUuY2hhcmFjdGVyczgoKSwgbGVuZ3RoKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwor
ICAgICAgICBjaGFyYWN0ZXJzID0gbmFtZS5jaGFyYWN0ZXJzKCk7CisgICAgfSBlbHNlIHsKKyAg
ICAgICAgY2hhcmFjdGVycyA9IG5hbWUuY2hhcmFjdGVyczE2KCk7CisgICAgICAgIGlmIChpc1Zh
bGlkTmFtZUFTQ0lJKGNoYXJhY3RlcnMsIGxlbmd0aCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICB9CisgICAgcmV0dXJuIGlzVmFsaWROYW1lTm9uQVNDSUkoY2hhcmFjdGVycywgbGVu
Z3RoKTsKK30KKworYm9vbCBEb2N1bWVudDo6cGFyc2VRdWFsaWZpZWROYW1lKGNvbnN0IFN0cmlu
ZyYgcXVhbGlmaWVkTmFtZSwgU3RyaW5nJiBwcmVmaXgsIFN0cmluZyYgbG9jYWxOYW1lLCBFeGNl
cHRpb25Db2RlJiBlYykKK3sKKyAgICB1bnNpZ25lZCBsZW5ndGggPSBxdWFsaWZpZWROYW1lLmxl
bmd0aCgpOworCisgICAgaWYgKCFsZW5ndGgpIHsKKyAgICAgICAgZWMgPSBJTlZBTElEX0NIQVJB
Q1RFUl9FUlI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIG5hbWVT
dGFydCA9IHRydWU7CisgICAgYm9vbCBzYXdDb2xvbiA9IGZhbHNlOworICAgIGludCBjb2xvblBv
cyA9IDA7CisKKyAgICBjb25zdCBVQ2hhciogcyA9IHF1YWxpZmllZE5hbWUuY2hhcmFjdGVycygp
OworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsZW5ndGg7KSB7CisgICAgICAgIFVDaGFy
MzIgYzsKKyAgICAgICAgVTE2X05FWFQocywgaSwgbGVuZ3RoLCBjKQorICAgICAgICBpZiAoYyA9
PSAnOicpIHsKKyAgICAgICAgICAgIGlmIChzYXdDb2xvbikgeworICAgICAgICAgICAgICAgIGVj
ID0gTkFNRVNQQUNFX0VSUjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIG11bHRp
cGxlIGNvbG9uczogbm90IGFsbG93ZWQKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5hbWVT
dGFydCA9IHRydWU7CisgICAgICAgICAgICBzYXdDb2xvbiA9IHRydWU7CisgICAgICAgICAgICBj
b2xvblBvcyA9IGkgLSAxOworICAgICAgICB9IGVsc2UgaWYgKG5hbWVTdGFydCkgeworICAgICAg
ICAgICAgaWYgKCFpc1ZhbGlkTmFtZVN0YXJ0KGMpKSB7CisgICAgICAgICAgICAgICAgZWMgPSBJ
TlZBTElEX0NIQVJBQ1RFUl9FUlI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgICAgICAgfQorICAgICAgICAgICAgbmFtZVN0YXJ0ID0gZmFsc2U7CisgICAgICAgIH0gZWxz
ZSB7CisgICAgICAgICAgICBpZiAoIWlzVmFsaWROYW1lUGFydChjKSkgeworICAgICAgICAgICAg
ICAgIGVjID0gSU5WQUxJRF9DSEFSQUNURVJfRVJSOworICAgICAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghc2F3Q29s
b24pIHsKKyAgICAgICAgcHJlZml4ID0gU3RyaW5nKCk7CisgICAgICAgIGxvY2FsTmFtZSA9IHF1
YWxpZmllZE5hbWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJlZml4ID0gcXVhbGlmaWVkTmFt
ZS5zdWJzdHJpbmcoMCwgY29sb25Qb3MpOworICAgICAgICBpZiAocHJlZml4LmlzRW1wdHkoKSkg
eworICAgICAgICAgICAgZWMgPSBOQU1FU1BBQ0VfRVJSOworICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgICB9CisgICAgICAgIGxvY2FsTmFtZSA9IHF1YWxpZmllZE5hbWUuc3Vic3Ry
aW5nKGNvbG9uUG9zICsgMSk7CisgICAgfQorCisgICAgaWYgKGxvY2FsTmFtZS5pc0VtcHR5KCkp
IHsKKyAgICAgICAgZWMgPSBOQU1FU1BBQ0VfRVJSOworICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnNldERlY29kZXIo
UGFzc1JlZlB0cjxUZXh0UmVzb3VyY2VEZWNvZGVyPiBkZWNvZGVyKQoreworICAgIG1fZGVjb2Rl
ciA9IGRlY29kZXI7Cit9CisKK0tVUkwgRG9jdW1lbnQ6OmNvbXBsZXRlVVJMKGNvbnN0IFN0cmlu
ZyYgdXJsLCBjb25zdCBLVVJMJiBiYXNlVVJMT3ZlcnJpZGUpIGNvbnN0Cit7CisgICAgLy8gQWx3
YXlzIHJldHVybiBhIG51bGwgVVJMIHdoZW4gcGFzc2VkIGEgbnVsbCBzdHJpbmcuCisgICAgLy8g
RklYTUU6IFNob3VsZCB3ZSBjaGFuZ2UgdGhlIEtVUkwgY29uc3RydWN0b3IgdG8gaGF2ZSB0aGlz
IGJlaGF2aW9yPworICAgIC8vIFNlZSBhbHNvIFtDU1NdU3R5bGVTaGVldDo6Y29tcGxldGVVUkwo
Y29uc3QgU3RyaW5nJikKKyAgICBpZiAodXJsLmlzTnVsbCgpKQorICAgICAgICByZXR1cm4gS1VS
TCgpOworICAgIGNvbnN0IEtVUkwmIGJhc2VVUkwgPSAoKGJhc2VVUkxPdmVycmlkZS5pc0VtcHR5
KCkgfHwgYmFzZVVSTE92ZXJyaWRlID09IGJsYW5rVVJMKCkpICYmIHBhcmVudERvY3VtZW50KCkp
ID8gcGFyZW50RG9jdW1lbnQoKS0+YmFzZVVSTCgpIDogYmFzZVVSTE92ZXJyaWRlOworICAgIGlm
ICghbV9kZWNvZGVyKQorICAgICAgICByZXR1cm4gS1VSTChiYXNlVVJMLCB1cmwpOworICAgIHJl
dHVybiBLVVJMKGJhc2VVUkwsIHVybCwgbV9kZWNvZGVyLT5lbmNvZGluZygpKTsKK30KKworS1VS
TCBEb2N1bWVudDo6Y29tcGxldGVVUkwoY29uc3QgU3RyaW5nJiB1cmwpIGNvbnN0Cit7CisgICAg
cmV0dXJuIGNvbXBsZXRlVVJMKHVybCwgbV9iYXNlVVJMKTsKK30KKwordm9pZCBEb2N1bWVudDo6
c2V0SW5QYWdlQ2FjaGUoYm9vbCBmbGFnKQoreworICAgIGlmIChtX2luUGFnZUNhY2hlID09IGZs
YWcpCisgICAgICAgIHJldHVybjsKKworICAgIG1faW5QYWdlQ2FjaGUgPSBmbGFnOworCisgICAg
RnJhbWVWaWV3KiB2ID0gdmlldygpOworICAgIGlmIChmbGFnKSB7CisgICAgICAgIEFTU0VSVCgh
bV9zYXZlZFJlbmRlcmVyKTsKKyAgICAgICAgbV9zYXZlZFJlbmRlcmVyID0gcmVuZGVyZXIoKTsK
KyAgICAgICAgaWYgKHYpIHsKKyAgICAgICAgICAgIHYtPmNhY2hlQ3VycmVudFNjcm9sbFBvc2l0
aW9uKCk7CisgICAgICAgICAgICBpZiAocGFnZSgpICYmIHBhZ2UoKS0+bWFpbkZyYW1lKCkgPT0g
bV9mcmFtZSkKKyAgICAgICAgICAgICAgICB2LT5yZXNldFNjcm9sbGJhcnNBbmRDbGVhckNvbnRl
bnRzU2l6ZSgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHYtPnJlc2V0U2Ny
b2xsYmFycygpOworICAgICAgICB9CisgICAgICAgIG1fc3R5bGVSZWNhbGNUaW1lci5zdG9wKCk7
CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUKCFyZW5kZXJlcigpIHx8IHJlbmRlcmVyKCkg
PT0gbV9zYXZlZFJlbmRlcmVyKTsKKyAgICAgICAgQVNTRVJUKG1fcmVuZGVyQXJlbmEpOworICAg
ICAgICBzZXRSZW5kZXJlcihtX3NhdmVkUmVuZGVyZXIpOworICAgICAgICBtX3NhdmVkUmVuZGVy
ZXIgPSAwOworCisgICAgICAgIGlmIChjaGlsZE5lZWRzU3R5bGVSZWNhbGMoKSkKKyAgICAgICAg
ICAgIHNjaGVkdWxlU3R5bGVSZWNhbGMoKTsKKyAgICB9Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmRv
Y3VtZW50V2lsbEJlY29tZUluYWN0aXZlKCkKK3sKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9T
SVRJTkcpCisgICAgaWYgKHJlbmRlcmVyKCkpCisgICAgICAgIHJlbmRlclZpZXcoKS0+d2lsbE1v
dmVPZmZzY3JlZW4oKTsKKyNlbmRpZgorfQorCit2b2lkIERvY3VtZW50Ojpkb2N1bWVudFdpbGxT
dXNwZW5kRm9yUGFnZUNhY2hlKCkKK3sKKyAgICBkb2N1bWVudFdpbGxCZWNvbWVJbmFjdGl2ZSgp
OworCisgICAgSGFzaFNldDxFbGVtZW50Kj46Oml0ZXJhdG9yIGVuZCA9IG1fZG9jdW1lbnRTdXNw
ZW5zaW9uQ2FsbGJhY2tFbGVtZW50cy5lbmQoKTsKKyAgICBmb3IgKEhhc2hTZXQ8RWxlbWVudCo+
OjppdGVyYXRvciBpID0gbV9kb2N1bWVudFN1c3BlbnNpb25DYWxsYmFja0VsZW1lbnRzLmJlZ2lu
KCk7IGkgIT0gZW5kOyArK2kpCisgICAgICAgICgqaSktPmRvY3VtZW50V2lsbFN1c3BlbmRGb3JQ
YWdlQ2FjaGUoKTsKKworI2lmbmRlZiBOREVCVUcKKyAgICAvLyBDbGVhciB0aGUgdXBkYXRlIGZs
YWcgdG8gYmUgYWJsZSB0byBjaGVjayBpZiB0aGUgdmlld3BvcnQgYXJndW1lbnRzIHVwZGF0ZQor
ICAgIC8vIGlzIGRpc3BhdGNoZWQsIGFmdGVyIHRoZSBkb2N1bWVudCBpcyByZXN0b3JlZCBmcm9t
IHRoZSBwYWdlIGNhY2hlLgorICAgIG1fZGlkRGlzcGF0Y2hWaWV3cG9ydFByb3BlcnRpZXNDaGFu
Z2VkID0gZmFsc2U7CisjZW5kaWYKK30KKwordm9pZCBEb2N1bWVudDo6ZG9jdW1lbnREaWRSZXN1
bWVGcm9tUGFnZUNhY2hlKCkgCit7CisgICAgVmVjdG9yPEVsZW1lbnQqPiBlbGVtZW50czsKKyAg
ICBjb3B5VG9WZWN0b3IobV9kb2N1bWVudFN1c3BlbnNpb25DYWxsYmFja0VsZW1lbnRzLCBlbGVt
ZW50cyk7CisgICAgVmVjdG9yPEVsZW1lbnQqPjo6aXRlcmF0b3IgZW5kID0gZWxlbWVudHMuZW5k
KCk7CisgICAgZm9yIChWZWN0b3I8RWxlbWVudCo+OjppdGVyYXRvciBpID0gZWxlbWVudHMuYmVn
aW4oKTsgaSAhPSBlbmQ7ICsraSkKKyAgICAgICAgKCppKS0+ZG9jdW1lbnREaWRSZXN1bWVGcm9t
UGFnZUNhY2hlKCk7CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgaWYg
KHJlbmRlcmVyKCkpCisgICAgICAgIHJlbmRlclZpZXcoKS0+ZGlkTW92ZU9uc2NyZWVuKCk7Cisj
ZW5kaWYKKworICAgIGlmIChGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHZpZXcoKSkKKyAgICAgICAg
ZnJhbWVWaWV3LT5zZXRBbmltYXRvcnNBcmVBY3RpdmUoKTsKKworICAgIEFTU0VSVChtX2ZyYW1l
KTsKKyAgICBtX2ZyYW1lLT5sb2FkZXIoKS0+Y2xpZW50KCktPmRpc3BhdGNoRGlkQmVjb21lRnJh
bWVzZXQoaXNGcmFtZVNldCgpKTsKK30KKwordm9pZCBEb2N1bWVudDo6cmVnaXN0ZXJGb3JQYWdl
Q2FjaGVTdXNwZW5zaW9uQ2FsbGJhY2tzKEVsZW1lbnQqIGUpCit7CisgICAgbV9kb2N1bWVudFN1
c3BlbnNpb25DYWxsYmFja0VsZW1lbnRzLmFkZChlKTsKK30KKwordm9pZCBEb2N1bWVudDo6dW5y
ZWdpc3RlckZvclBhZ2VDYWNoZVN1c3BlbnNpb25DYWxsYmFja3MoRWxlbWVudCogZSkKK3sKKyAg
ICBtX2RvY3VtZW50U3VzcGVuc2lvbkNhbGxiYWNrRWxlbWVudHMucmVtb3ZlKGUpOworfQorCit2
b2lkIERvY3VtZW50OjptZWRpYVZvbHVtZURpZENoYW5nZSgpIAoreworICAgIEhhc2hTZXQ8RWxl
bWVudCo+OjppdGVyYXRvciBlbmQgPSBtX21lZGlhVm9sdW1lQ2FsbGJhY2tFbGVtZW50cy5lbmQo
KTsKKyAgICBmb3IgKEhhc2hTZXQ8RWxlbWVudCo+OjppdGVyYXRvciBpID0gbV9tZWRpYVZvbHVt
ZUNhbGxiYWNrRWxlbWVudHMuYmVnaW4oKTsgaSAhPSBlbmQ7ICsraSkKKyAgICAgICAgKCppKS0+
bWVkaWFWb2x1bWVEaWRDaGFuZ2UoKTsKK30KKwordm9pZCBEb2N1bWVudDo6cmVnaXN0ZXJGb3JN
ZWRpYVZvbHVtZUNhbGxiYWNrcyhFbGVtZW50KiBlKQoreworICAgIG1fbWVkaWFWb2x1bWVDYWxs
YmFja0VsZW1lbnRzLmFkZChlKTsKK30KKwordm9pZCBEb2N1bWVudDo6dW5yZWdpc3RlckZvck1l
ZGlhVm9sdW1lQ2FsbGJhY2tzKEVsZW1lbnQqIGUpCit7CisgICAgbV9tZWRpYVZvbHVtZUNhbGxi
YWNrRWxlbWVudHMucmVtb3ZlKGUpOworfQorCit2b2lkIERvY3VtZW50OjpzdG9yYWdlQmxvY2tp
bmdTdGF0ZURpZENoYW5nZSgpCit7CisgICAgaWYgKFNldHRpbmdzKiBzZXR0aW5ncyA9IHRoaXMt
PnNldHRpbmdzKCkpCisgICAgICAgIHNlY3VyaXR5T3JpZ2luKCktPnNldFN0b3JhZ2VCbG9ja2lu
Z1BvbGljeShzZXR0aW5ncy0+c3RvcmFnZUJsb2NraW5nUG9saWN5KCkpOworfQorCit2b2lkIERv
Y3VtZW50Ojpwcml2YXRlQnJvd3NpbmdTdGF0ZURpZENoYW5nZSgpIAoreworICAgIEhhc2hTZXQ8
RWxlbWVudCo+OjppdGVyYXRvciBlbmQgPSBtX3ByaXZhdGVCcm93c2luZ1N0YXRlQ2hhbmdlZEVs
ZW1lbnRzLmVuZCgpOworICAgIGZvciAoSGFzaFNldDxFbGVtZW50Kj46Oml0ZXJhdG9yIGl0ID0g
bV9wcml2YXRlQnJvd3NpbmdTdGF0ZUNoYW5nZWRFbGVtZW50cy5iZWdpbigpOyBpdCAhPSBlbmQ7
ICsraXQpCisgICAgICAgICgqaXQpLT5wcml2YXRlQnJvd3NpbmdTdGF0ZURpZENoYW5nZSgpOwor
fQorCit2b2lkIERvY3VtZW50OjpyZWdpc3RlckZvclByaXZhdGVCcm93c2luZ1N0YXRlQ2hhbmdl
ZENhbGxiYWNrcyhFbGVtZW50KiBlKQoreworICAgIG1fcHJpdmF0ZUJyb3dzaW5nU3RhdGVDaGFu
Z2VkRWxlbWVudHMuYWRkKGUpOworfQorCit2b2lkIERvY3VtZW50Ojp1bnJlZ2lzdGVyRm9yUHJp
dmF0ZUJyb3dzaW5nU3RhdGVDaGFuZ2VkQ2FsbGJhY2tzKEVsZW1lbnQqIGUpCit7CisgICAgbV9w
cml2YXRlQnJvd3NpbmdTdGF0ZUNoYW5nZWRFbGVtZW50cy5yZW1vdmUoZSk7Cit9CisKK3ZvaWQg
RG9jdW1lbnQ6OnNldFNob3VsZENyZWF0ZVJlbmRlcmVycyhib29sIGYpCit7CisgICAgbV9jcmVh
dGVSZW5kZXJlcnMgPSBmOworfQorCitib29sIERvY3VtZW50OjpzaG91bGRDcmVhdGVSZW5kZXJl
cnMoKQoreworICAgIHJldHVybiBtX2NyZWF0ZVJlbmRlcmVyczsKK30KKworLy8gU3VwcG9ydCBm
b3IgSmF2YXNjcmlwdCBleGVjQ29tbWFuZCwgYW5kIHJlbGF0ZWQgbWV0aG9kcworCitzdGF0aWMg
RWRpdG9yOjpDb21tYW5kIGNvbW1hbmQoRG9jdW1lbnQqIGRvY3VtZW50LCBjb25zdCBTdHJpbmcm
IGNvbW1hbmROYW1lLCBib29sIHVzZXJJbnRlcmZhY2UgPSBmYWxzZSkKK3sKKyAgICBGcmFtZSog
ZnJhbWUgPSBkb2N1bWVudC0+ZnJhbWUoKTsKKyAgICBpZiAoIWZyYW1lIHx8IGZyYW1lLT5kb2N1
bWVudCgpICE9IGRvY3VtZW50KQorICAgICAgICByZXR1cm4gRWRpdG9yOjpDb21tYW5kKCk7CisK
KyAgICBkb2N1bWVudC0+dXBkYXRlU3R5bGVJZk5lZWRlZCgpOworCisgICAgcmV0dXJuIGZyYW1l
LT5lZGl0b3IoKS0+Y29tbWFuZChjb21tYW5kTmFtZSwKKyAgICAgICAgdXNlckludGVyZmFjZSA/
IENvbW1hbmRGcm9tRE9NV2l0aFVzZXJJbnRlcmZhY2UgOiBDb21tYW5kRnJvbURPTSk7Cit9CisK
K2Jvb2wgRG9jdW1lbnQ6OmV4ZWNDb21tYW5kKGNvbnN0IFN0cmluZyYgY29tbWFuZE5hbWUsIGJv
b2wgdXNlckludGVyZmFjZSwgY29uc3QgU3RyaW5nJiB2YWx1ZSkKK3sKKyAgICByZXR1cm4gY29t
bWFuZCh0aGlzLCBjb21tYW5kTmFtZSwgdXNlckludGVyZmFjZSkuZXhlY3V0ZSh2YWx1ZSk7Cit9
CisKK2Jvb2wgRG9jdW1lbnQ6OnF1ZXJ5Q29tbWFuZEVuYWJsZWQoY29uc3QgU3RyaW5nJiBjb21t
YW5kTmFtZSkKK3sKKyAgICByZXR1cm4gY29tbWFuZCh0aGlzLCBjb21tYW5kTmFtZSkuaXNFbmFi
bGVkKCk7Cit9CisKK2Jvb2wgRG9jdW1lbnQ6OnF1ZXJ5Q29tbWFuZEluZGV0ZXJtKGNvbnN0IFN0
cmluZyYgY29tbWFuZE5hbWUpCit7CisgICAgcmV0dXJuIGNvbW1hbmQodGhpcywgY29tbWFuZE5h
bWUpLnN0YXRlKCkgPT0gTWl4ZWRUcmlTdGF0ZTsKK30KKworYm9vbCBEb2N1bWVudDo6cXVlcnlD
b21tYW5kU3RhdGUoY29uc3QgU3RyaW5nJiBjb21tYW5kTmFtZSkKK3sKKyAgICByZXR1cm4gY29t
bWFuZCh0aGlzLCBjb21tYW5kTmFtZSkuc3RhdGUoKSA9PSBUcnVlVHJpU3RhdGU7Cit9CisKK2Jv
b2wgRG9jdW1lbnQ6OnF1ZXJ5Q29tbWFuZFN1cHBvcnRlZChjb25zdCBTdHJpbmcmIGNvbW1hbmRO
YW1lKQoreworICAgIHJldHVybiBjb21tYW5kKHRoaXMsIGNvbW1hbmROYW1lKS5pc1N1cHBvcnRl
ZCgpOworfQorCitTdHJpbmcgRG9jdW1lbnQ6OnF1ZXJ5Q29tbWFuZFZhbHVlKGNvbnN0IFN0cmlu
ZyYgY29tbWFuZE5hbWUpCit7CisgICAgcmV0dXJuIGNvbW1hbmQodGhpcywgY29tbWFuZE5hbWUp
LnZhbHVlKCk7Cit9CisKK0tVUkwgRG9jdW1lbnQ6Om9wZW5TZWFyY2hEZXNjcmlwdGlvblVSTCgp
Cit7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IG9wZW5TZWFyY2hNSU1FVHlwZSA9ICJh
cHBsaWNhdGlvbi9vcGVuc2VhcmNoZGVzY3JpcHRpb24reG1sIjsKKyAgICBzdGF0aWMgY29uc3Qg
Y2hhciogY29uc3Qgb3BlblNlYXJjaFJlbGF0aW9uID0gInNlYXJjaCI7CisKKyAgICAvLyBGSVhN
RTogV2h5IGRvIG9ubHkgdG9wLWxldmVsIGZyYW1lcyBoYXZlIG9wZW5TZWFyY2hEZXNjcmlwdGlv
blVSTHM/CisgICAgaWYgKCFmcmFtZSgpIHx8IGZyYW1lKCktPnRyZWUoKS0+cGFyZW50KCkpCisg
ICAgICAgIHJldHVybiBLVVJMKCk7CisKKyAgICAvLyBGSVhNRTogV2h5IGRvIHdlIG5lZWQgdG8g
d2FpdCBmb3IgRnJhbWVTdGF0ZUNvbXBsZXRlPworICAgIGlmIChmcmFtZSgpLT5sb2FkZXIoKS0+
c3RhdGUoKSAhPSBGcmFtZVN0YXRlQ29tcGxldGUpCisgICAgICAgIHJldHVybiBLVVJMKCk7CisK
KyAgICBpZiAoIWhlYWQoKSkKKyAgICAgICAgcmV0dXJuIEtVUkwoKTsKKworICAgIFJlZlB0cjxI
VE1MQ29sbGVjdGlvbj4gY2hpbGRyZW4gPSBoZWFkKCktPmNoaWxkcmVuKCk7CisgICAgZm9yICh1
bnNpZ25lZCBpID0gMDsgTm9kZSogY2hpbGQgPSBjaGlsZHJlbi0+aXRlbShpKTsgaSsrKSB7Cisg
ICAgICAgIGlmICghY2hpbGQtPmhhc1RhZ05hbWUobGlua1RhZykpCisgICAgICAgICAgICBjb250
aW51ZTsKKyAgICAgICAgSFRNTExpbmtFbGVtZW50KiBsaW5rRWxlbWVudCA9IHN0YXRpY19jYXN0
PEhUTUxMaW5rRWxlbWVudCo+KGNoaWxkKTsKKyAgICAgICAgaWYgKCFlcXVhbElnbm9yaW5nQ2Fz
ZShsaW5rRWxlbWVudC0+dHlwZSgpLCBvcGVuU2VhcmNoTUlNRVR5cGUpIHx8ICFlcXVhbElnbm9y
aW5nQ2FzZShsaW5rRWxlbWVudC0+cmVsKCksIG9wZW5TZWFyY2hSZWxhdGlvbikpCisgICAgICAg
ICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKGxpbmtFbGVtZW50LT5ocmVmKCkuaXNFbXB0eSgp
KQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIHJldHVybiBsaW5rRWxlbWVudC0+aHJl
ZigpOworICAgIH0KKworICAgIHJldHVybiBLVVJMKCk7Cit9CisKKyNpZiBFTkFCTEUoWFNMVCkK
Kwordm9pZCBEb2N1bWVudDo6YXBwbHlYU0xUcmFuc2Zvcm0oUHJvY2Vzc2luZ0luc3RydWN0aW9u
KiBwaSkKK3sKKyAgICBSZWZQdHI8WFNMVFByb2Nlc3Nvcj4gcHJvY2Vzc29yID0gWFNMVFByb2Nl
c3Nvcjo6Y3JlYXRlKCk7CisgICAgcHJvY2Vzc29yLT5zZXRYU0xTdHlsZVNoZWV0KHN0YXRpY19j
YXN0PFhTTFN0eWxlU2hlZXQqPihwaS0+c2hlZXQoKSkpOworICAgIFN0cmluZyByZXN1bHRNSU1F
VHlwZTsKKyAgICBTdHJpbmcgbmV3U291cmNlOworICAgIFN0cmluZyByZXN1bHRFbmNvZGluZzsK
KyAgICBpZiAoIXByb2Nlc3Nvci0+dHJhbnNmb3JtVG9TdHJpbmcodGhpcywgcmVzdWx0TUlNRVR5
cGUsIG5ld1NvdXJjZSwgcmVzdWx0RW5jb2RpbmcpKQorICAgICAgICByZXR1cm47CisgICAgLy8g
RklYTUU6IElmIHRoZSB0cmFuc2Zvcm0gZmFpbGVkIHdlIHNob3VsZCBwcm9iYWJseSByZXBvcnQg
YW4gZXJyb3IgKGxpa2UgTW96aWxsYSBkb2VzKS4KKyAgICBwcm9jZXNzb3ItPmNyZWF0ZURvY3Vt
ZW50RnJvbVNvdXJjZShuZXdTb3VyY2UsIHJlc3VsdEVuY29kaW5nLCByZXN1bHRNSU1FVHlwZSwg
dGhpcywgZnJhbWUoKSk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnNldFRyYW5zZm9ybVNvdXJjZShQ
YXNzT3duUHRyPFRyYW5zZm9ybVNvdXJjZT4gc291cmNlKQoreworICAgIG1fdHJhbnNmb3JtU291
cmNlID0gc291cmNlOworfQorCisjZW5kaWYKKwordm9pZCBEb2N1bWVudDo6c2V0RGVzaWduTW9k
ZShJbmhlcml0ZWRCb29sIHZhbHVlKQoreworICAgIG1fZGVzaWduTW9kZSA9IHZhbHVlOworICAg
IGZvciAoRnJhbWUqIGZyYW1lID0gbV9mcmFtZTsgZnJhbWUgJiYgZnJhbWUtPmRvY3VtZW50KCk7
IGZyYW1lID0gZnJhbWUtPnRyZWUoKS0+dHJhdmVyc2VOZXh0KG1fZnJhbWUpKQorICAgICAgICBm
cmFtZS0+ZG9jdW1lbnQoKS0+c2NoZWR1bGVGb3JjZWRTdHlsZVJlY2FsYygpOworfQorCitEb2N1
bWVudDo6SW5oZXJpdGVkQm9vbCBEb2N1bWVudDo6Z2V0RGVzaWduTW9kZSgpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIG1fZGVzaWduTW9kZTsKK30KKworYm9vbCBEb2N1bWVudDo6aW5EZXNpZ25Nb2Rl
KCkgY29uc3QKK3sKKyAgICBmb3IgKGNvbnN0IERvY3VtZW50KiBkID0gdGhpczsgZDsgZCA9IGQt
PnBhcmVudERvY3VtZW50KCkpIHsKKyAgICAgICAgaWYgKGQtPm1fZGVzaWduTW9kZSAhPSBpbmhl
cml0KQorICAgICAgICAgICAgcmV0dXJuIGQtPm1fZGVzaWduTW9kZTsKKyAgICB9CisgICAgcmV0
dXJuIGZhbHNlOworfQorCitEb2N1bWVudCogRG9jdW1lbnQ6OnBhcmVudERvY3VtZW50KCkgY29u
c3QKK3sKKyAgICBpZiAoIW1fZnJhbWUpCisgICAgICAgIHJldHVybiAwOworICAgIEZyYW1lKiBw
YXJlbnQgPSBtX2ZyYW1lLT50cmVlKCktPnBhcmVudCgpOworICAgIGlmICghcGFyZW50KQorICAg
ICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gcGFyZW50LT5kb2N1bWVudCgpOworfQorCitEb2N1
bWVudCogRG9jdW1lbnQ6OnRvcERvY3VtZW50KCkgY29uc3QKK3sKKyAgICBEb2N1bWVudCogZG9j
ID0gY29uc3RfY2FzdDxEb2N1bWVudCAqPih0aGlzKTsKKyAgICBFbGVtZW50KiBlbGVtZW50Owor
ICAgIHdoaWxlICgoZWxlbWVudCA9IGRvYy0+b3duZXJFbGVtZW50KCkpKQorICAgICAgICBkb2Mg
PSBlbGVtZW50LT5kb2N1bWVudCgpOworICAgIAorICAgIHJldHVybiBkb2M7Cit9CisKK1Bhc3NS
ZWZQdHI8QXR0cj4gRG9jdW1lbnQ6OmNyZWF0ZUF0dHJpYnV0ZShjb25zdCBTdHJpbmcmIG5hbWUs
IEV4Y2VwdGlvbkNvZGUmIGVjKQoreworICAgIHJldHVybiBjcmVhdGVBdHRyaWJ1dGVOUyhTdHJp
bmcoKSwgbmFtZSwgZWMsIHRydWUpOworfQorCitQYXNzUmVmUHRyPEF0dHI+IERvY3VtZW50Ojpj
cmVhdGVBdHRyaWJ1dGVOUyhjb25zdCBTdHJpbmcmIG5hbWVzcGFjZVVSSSwgY29uc3QgU3RyaW5n
JiBxdWFsaWZpZWROYW1lLCBFeGNlcHRpb25Db2RlJiBlYywgYm9vbCBzaG91bGRJZ25vcmVOYW1l
c3BhY2VDaGVja3MpCit7CisgICAgU3RyaW5nIHByZWZpeCwgbG9jYWxOYW1lOworICAgIGlmICgh
cGFyc2VRdWFsaWZpZWROYW1lKHF1YWxpZmllZE5hbWUsIHByZWZpeCwgbG9jYWxOYW1lLCBlYykp
CisgICAgICAgIHJldHVybiAwOworCisgICAgUXVhbGlmaWVkTmFtZSBxTmFtZShwcmVmaXgsIGxv
Y2FsTmFtZSwgbmFtZXNwYWNlVVJJKTsKKworICAgIGlmICghc2hvdWxkSWdub3JlTmFtZXNwYWNl
Q2hlY2tzICYmICFoYXNWYWxpZE5hbWVzcGFjZUZvckF0dHJpYnV0ZXMocU5hbWUpKSB7CisgICAg
ICAgIGVjID0gTkFNRVNQQUNFX0VSUjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAg
cmV0dXJuIEF0dHI6OmNyZWF0ZSh0aGlzLCBxTmFtZSwgZW1wdHlTdHJpbmcoKSk7Cit9CisKKyNp
ZiBFTkFCTEUoU1ZHKQorY29uc3QgU1ZHRG9jdW1lbnRFeHRlbnNpb25zKiBEb2N1bWVudDo6c3Zn
RXh0ZW5zaW9ucygpCit7CisgICAgcmV0dXJuIG1fc3ZnRXh0ZW5zaW9ucy5nZXQoKTsKK30KKwor
U1ZHRG9jdW1lbnRFeHRlbnNpb25zKiBEb2N1bWVudDo6YWNjZXNzU1ZHRXh0ZW5zaW9ucygpCit7
CisgICAgaWYgKCFtX3N2Z0V4dGVuc2lvbnMpCisgICAgICAgIG1fc3ZnRXh0ZW5zaW9ucyA9IGFk
b3B0UHRyKG5ldyBTVkdEb2N1bWVudEV4dGVuc2lvbnModGhpcykpOworICAgIHJldHVybiBtX3N2
Z0V4dGVuc2lvbnMuZ2V0KCk7Cit9CisKK2Jvb2wgRG9jdW1lbnQ6Omhhc1NWR1Jvb3ROb2RlKCkg
Y29uc3QKK3sKKyAgICByZXR1cm4gZG9jdW1lbnRFbGVtZW50KCkgJiYgZG9jdW1lbnRFbGVtZW50
KCktPmhhc1RhZ05hbWUoU1ZHTmFtZXM6OnN2Z1RhZyk7Cit9CisjZW5kaWYKKworLy8gRklYTUU6
IFRoaXMgY2FjaGluZyBtZWNoYW5pc20gc2hvdWxkIGJlIG1lcmdlZCB0aGF0IG9mIER5bmFtaWNO
b2RlTGlzdCBpbiBOb2RlUmFyZURhdGEuCitQYXNzUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBEb2N1
bWVudDo6Y2FjaGVkQ29sbGVjdGlvbihDb2xsZWN0aW9uVHlwZSB0eXBlKQoreworICAgIEFTU0VS
VChzdGF0aWNfY2FzdDx1bnNpZ25lZD4odHlwZSkgPCBOdW1Vbm5hbWVkRG9jdW1lbnRDYWNoZWRU
eXBlcyk7CisgICAgaWYgKG1fY29sbGVjdGlvbnNbdHlwZV0pCisgICAgICAgIHJldHVybiBtX2Nv
bGxlY3Rpb25zW3R5cGVdOworCisgICAgUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBjb2xsZWN0aW9u
OworICAgIGlmICh0eXBlID09IERvY0FsbCkKKyAgICAgICAgY29sbGVjdGlvbiA9IEhUTUxBbGxD
b2xsZWN0aW9uOjpjcmVhdGUodGhpcyk7CisgICAgZWxzZQorICAgICAgICBjb2xsZWN0aW9uID0g
SFRNTENvbGxlY3Rpb246OmNyZWF0ZSh0aGlzLCB0eXBlKTsKKyAgICBtX2NvbGxlY3Rpb25zW3R5
cGVdID0gY29sbGVjdGlvbi5nZXQoKTsKKworICAgIHJldHVybiBjb2xsZWN0aW9uLnJlbGVhc2Uo
KTsKK30KKwordm9pZCBEb2N1bWVudDo6cmVtb3ZlQ2FjaGVkSFRNTENvbGxlY3Rpb24oSFRNTENv
bGxlY3Rpb24qIGNvbGxlY3Rpb24sIENvbGxlY3Rpb25UeXBlIHR5cGUpCit7CisgICAgQVNTRVJU
X1VOVVNFRChjb2xsZWN0aW9uLCBtX2NvbGxlY3Rpb25zW3R5cGVdID09IGNvbGxlY3Rpb24pOwor
ICAgIG1fY29sbGVjdGlvbnNbdHlwZV0gPSAwOworfQorCitQYXNzUmVmUHRyPEhUTUxDb2xsZWN0
aW9uPiBEb2N1bWVudDo6aW1hZ2VzKCkKK3sKKyAgICByZXR1cm4gY2FjaGVkQ29sbGVjdGlvbihE
b2NJbWFnZXMpOworfQorCitQYXNzUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBEb2N1bWVudDo6YXBw
bGV0cygpCit7CisgICAgcmV0dXJuIGNhY2hlZENvbGxlY3Rpb24oRG9jQXBwbGV0cyk7Cit9CisK
K1Bhc3NSZWZQdHI8SFRNTENvbGxlY3Rpb24+IERvY3VtZW50OjplbWJlZHMoKQoreworICAgIHJl
dHVybiBjYWNoZWRDb2xsZWN0aW9uKERvY0VtYmVkcyk7Cit9CisKK1Bhc3NSZWZQdHI8SFRNTENv
bGxlY3Rpb24+IERvY3VtZW50OjpwbHVnaW5zKCkKK3sKKyAgICAvLyBUaGlzIGlzIGFuIGFsaWFz
IGZvciBlbWJlZHMoKSByZXF1aXJlZCBmb3IgdGhlIEpTIERPTSBiaW5kaW5ncy4KKyAgICByZXR1
cm4gY2FjaGVkQ29sbGVjdGlvbihEb2NFbWJlZHMpOworfQorCitQYXNzUmVmUHRyPEhUTUxDb2xs
ZWN0aW9uPiBEb2N1bWVudDo6b2JqZWN0cygpCit7CisgICAgcmV0dXJuIGNhY2hlZENvbGxlY3Rp
b24oRG9jT2JqZWN0cyk7Cit9CisKK1Bhc3NSZWZQdHI8SFRNTENvbGxlY3Rpb24+IERvY3VtZW50
OjpzY3JpcHRzKCkKK3sKKyAgICByZXR1cm4gY2FjaGVkQ29sbGVjdGlvbihEb2NTY3JpcHRzKTsK
K30KKworUGFzc1JlZlB0cjxIVE1MQ29sbGVjdGlvbj4gRG9jdW1lbnQ6OmxpbmtzKCkKK3sKKyAg
ICByZXR1cm4gY2FjaGVkQ29sbGVjdGlvbihEb2NMaW5rcyk7Cit9CisKK1Bhc3NSZWZQdHI8SFRN
TENvbGxlY3Rpb24+IERvY3VtZW50Ojpmb3JtcygpCit7CisgICAgcmV0dXJuIGNhY2hlZENvbGxl
Y3Rpb24oRG9jRm9ybXMpOworfQorCitQYXNzUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBEb2N1bWVu
dDo6YW5jaG9ycygpCit7CisgICAgcmV0dXJuIGNhY2hlZENvbGxlY3Rpb24oRG9jQW5jaG9ycyk7
Cit9CisKK1Bhc3NSZWZQdHI8SFRNTENvbGxlY3Rpb24+IERvY3VtZW50OjphbGwoKQoreworICAg
IHJldHVybiBjYWNoZWRDb2xsZWN0aW9uKERvY0FsbCk7Cit9CisKK1Bhc3NSZWZQdHI8SFRNTENv
bGxlY3Rpb24+IERvY3VtZW50Ojp3aW5kb3dOYW1lZEl0ZW1zKGNvbnN0IEF0b21pY1N0cmluZyYg
bmFtZSkKK3sKKyAgICBOYW1lZENvbGxlY3Rpb25NYXA6OkFkZFJlc3VsdCByZXN1bHQgPSBtX3dp
bmRvd05hbWVkSXRlbUNvbGxlY3Rpb25zLmFkZChuYW1lLCAwKTsKKyAgICBpZiAoIXJlc3VsdC5p
c05ld0VudHJ5KQorICAgICAgICByZXR1cm4gcmVzdWx0Lml0ZXJhdG9yLT5zZWNvbmQ7CisKKyAg
ICBSZWZQdHI8SFRNTE5hbWVDb2xsZWN0aW9uPiBjb2xsZWN0aW9uID0gSFRNTE5hbWVDb2xsZWN0
aW9uOjpjcmVhdGUodGhpcywgV2luZG93TmFtZWRJdGVtcywgbmFtZSk7CisgICAgcmVzdWx0Lml0
ZXJhdG9yLT5zZWNvbmQgPSBjb2xsZWN0aW9uLmdldCgpOworICAgIHJldHVybiBjb2xsZWN0aW9u
LnJlbGVhc2UoKTsKK30KKworUGFzc1JlZlB0cjxIVE1MQ29sbGVjdGlvbj4gRG9jdW1lbnQ6OmRv
Y3VtZW50TmFtZWRJdGVtcyhjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUpCit7CisgICAgTmFtZWRD
b2xsZWN0aW9uTWFwOjpBZGRSZXN1bHQgcmVzdWx0ID0gbV9kb2N1bWVudE5hbWVkSXRlbUNvbGxl
Y3Rpb25zLmFkZChuYW1lLCAwKTsKKyAgICBpZiAoIXJlc3VsdC5pc05ld0VudHJ5KQorICAgICAg
ICByZXR1cm4gcmVzdWx0Lml0ZXJhdG9yLT5zZWNvbmQ7CisKKyAgICBSZWZQdHI8SFRNTE5hbWVD
b2xsZWN0aW9uPiBjb2xsZWN0aW9uID0gSFRNTE5hbWVDb2xsZWN0aW9uOjpjcmVhdGUodGhpcywg
RG9jdW1lbnROYW1lZEl0ZW1zLCBuYW1lKTsKKyAgICByZXN1bHQuaXRlcmF0b3ItPnNlY29uZCA9
IGNvbGxlY3Rpb24uZ2V0KCk7CisgICAgcmV0dXJuIGNvbGxlY3Rpb24ucmVsZWFzZSgpOworfQor
CisvLyBGSVhNRTogVGhpcyBjYWNoaW5nIG1lY2hhbmlzbSBzaG91bGQgYmUgbWVyZ2VkIHRoYXQg
b2YgRHluYW1pY05vZGVMaXN0IGluIE5vZGVSYXJlRGF0YS4KK3ZvaWQgRG9jdW1lbnQ6OnJlbW92
ZVdpbmRvd05hbWVkSXRlbUNhY2hlKEhUTUxDb2xsZWN0aW9uKiBjb2xsZWN0aW9uLCBjb25zdCBB
dG9taWNTdHJpbmcmIG5hbWUpCit7CisgICAgQVNTRVJUX1VOVVNFRChjb2xsZWN0aW9uLCBtX3dp
bmRvd05hbWVkSXRlbUNvbGxlY3Rpb25zLmdldChuYW1lKSA9PSBjb2xsZWN0aW9uKTsKKyAgICBt
X3dpbmRvd05hbWVkSXRlbUNvbGxlY3Rpb25zLnJlbW92ZShuYW1lKTsKK30KKwordm9pZCBEb2N1
bWVudDo6cmVtb3ZlRG9jdW1lbnROYW1lZEl0ZW1DYWNoZShIVE1MQ29sbGVjdGlvbiogY29sbGVj
dGlvbiwgY29uc3QgQXRvbWljU3RyaW5nJiBuYW1lKQoreworICAgIEFTU0VSVF9VTlVTRUQoY29s
bGVjdGlvbiwgbV9kb2N1bWVudE5hbWVkSXRlbUNvbGxlY3Rpb25zLmdldChuYW1lKSA9PSBjb2xs
ZWN0aW9uKTsKKyAgICBtX2RvY3VtZW50TmFtZWRJdGVtQ29sbGVjdGlvbnMucmVtb3ZlKG5hbWUp
OworfQorCit2b2lkIERvY3VtZW50OjpmaW5pc2hlZFBhcnNpbmcoKQoreworICAgIEFTU0VSVCgh
c2NyaXB0YWJsZURvY3VtZW50UGFyc2VyKCkgfHwgIW1fcGFyc2VyLT5pc1BhcnNpbmcoKSk7Cisg
ICAgQVNTRVJUKCFzY3JpcHRhYmxlRG9jdW1lbnRQYXJzZXIoKSB8fCBtX3JlYWR5U3RhdGUgIT0g
TG9hZGluZyk7CisgICAgc2V0UGFyc2luZyhmYWxzZSk7CisgICAgaWYgKCFtX2RvY3VtZW50VGlt
aW5nLmRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0KQorICAgICAgICBtX2RvY3VtZW50VGltaW5n
LmRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0ID0gbW9ub3RvbmljYWxseUluY3JlYXNpbmdUaW1l
KCk7CisgICAgZGlzcGF0Y2hFdmVudChFdmVudDo6Y3JlYXRlKGV2ZW50TmFtZXMoKS5ET01Db250
ZW50TG9hZGVkRXZlbnQsIHRydWUsIGZhbHNlKSk7CisgICAgaWYgKCFtX2RvY3VtZW50VGltaW5n
LmRvbUNvbnRlbnRMb2FkZWRFdmVudEVuZCkKKyAgICAgICAgbV9kb2N1bWVudFRpbWluZy5kb21D
b250ZW50TG9hZGVkRXZlbnRFbmQgPSBtb25vdG9uaWNhbGx5SW5jcmVhc2luZ1RpbWUoKTsKKwor
ICAgIGlmIChSZWZQdHI8RnJhbWU+IGYgPSBmcmFtZSgpKSB7CisgICAgICAgIC8vIEZyYW1lTG9h
ZGVyOjpmaW5pc2hlZFBhcnNpbmcoKSBtaWdodCBlbmQgdXAgY2FsbGluZyBEb2N1bWVudDo6aW1w
bGljaXRDbG9zZSgpIGlmIGFsbAorICAgICAgICAvLyByZXNvdXJjZSBsb2FkcyBhcmUgY29tcGxl
dGUuIEhUTUxPYmplY3RFbGVtZW50cyBjYW4gc3RhcnQgbG9hZGluZyB0aGVpciByZXNvdXJjZXMg
ZnJvbQorICAgICAgICAvLyBwb3N0IGF0dGFjaCBjYWxsYmFja3MgdHJpZ2dlcmVkIGJ5IHJlY2Fs
Y1N0eWxlKCkuICBUaGlzIG1lYW5zIGlmIHdlIHBhcnNlIG91dCBhbiA8b2JqZWN0PgorICAgICAg
ICAvLyB0YWcgYW5kIHRoZW4gcmVhY2ggdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQgd2l0aG91dCB1
cGRhdGluZyBzdHlsZXMsIHdlIG1pZ2h0IG5vdCBoYXZlIHlldAorICAgICAgICAvLyBzdGFydGVk
IHRoZSByZXNvdXJjZSBsb2FkIGFuZCBtaWdodCBmaXJlIHRoZSB3aW5kb3cgbG9hZCBldmVudCB0
b28gZWFybHkuICBUbyBhdm9pZCB0aGlzCisgICAgICAgIC8vIHdlIGZvcmNlIHRoZSBzdHlsZXMg
dG8gYmUgdXAgdG8gZGF0ZSBiZWZvcmUgY2FsbGluZyBGcmFtZUxvYWRlcjo6ZmluaXNoZWRQYXJz
aW5nKCkuCisgICAgICAgIC8vIFNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9MzY4NjQgc3RhcnRpbmcgYXJvdW5kIGNvbW1lbnQgMzUuCisgICAgICAgIHVwZGF0ZVN0
eWxlSWZOZWVkZWQoKTsKKworICAgICAgICBmLT5sb2FkZXIoKS0+ZmluaXNoZWRQYXJzaW5nKCk7
CisKKyAgICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpkb21Db250ZW50TG9hZGVkRXZl
bnRGaXJlZChmLmdldCgpKTsKKyAgICB9CisKKyAgICAvLyBUaGUgRWxlbWVudEF0dHJpYnV0ZURh
dGEgc2hhcmluZyBjYWNoZSBpcyBvbmx5IHVzZWQgZHVyaW5nIHBhcnNpbmcgc2luY2UKKyAgICAv
LyB0aGF0J3Mgd2hlbiB0aGUgbWFqb3JpdHkgb2YgaW1tdXRhYmxlIGF0dHJpYnV0ZSBkYXRhIHdp
bGwgYmUgY3JlYXRlZC4KKyAgICBtX2ltbXV0YWJsZUF0dHJpYnV0ZURhdGFDYWNoZS5jbGVhcigp
OworfQorCitQYXNzUmVmUHRyPFhQYXRoRXhwcmVzc2lvbj4gRG9jdW1lbnQ6OmNyZWF0ZUV4cHJl
c3Npb24oY29uc3QgU3RyaW5nJiBleHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhQYXRoTlNSZXNvbHZlciogcmVzb2x2ZXIs
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
RXhjZXB0aW9uQ29kZSYgZWMpCit7CisgICAgaWYgKCFtX3hwYXRoRXZhbHVhdG9yKQorICAgICAg
ICBtX3hwYXRoRXZhbHVhdG9yID0gWFBhdGhFdmFsdWF0b3I6OmNyZWF0ZSgpOworICAgIHJldHVy
biBtX3hwYXRoRXZhbHVhdG9yLT5jcmVhdGVFeHByZXNzaW9uKGV4cHJlc3Npb24sIHJlc29sdmVy
LCBlYyk7Cit9CisKK1Bhc3NSZWZQdHI8WFBhdGhOU1Jlc29sdmVyPiBEb2N1bWVudDo6Y3JlYXRl
TlNSZXNvbHZlcihOb2RlKiBub2RlUmVzb2x2ZXIpCit7CisgICAgaWYgKCFtX3hwYXRoRXZhbHVh
dG9yKQorICAgICAgICBtX3hwYXRoRXZhbHVhdG9yID0gWFBhdGhFdmFsdWF0b3I6OmNyZWF0ZSgp
OworICAgIHJldHVybiBtX3hwYXRoRXZhbHVhdG9yLT5jcmVhdGVOU1Jlc29sdmVyKG5vZGVSZXNv
bHZlcik7Cit9CisKK1Bhc3NSZWZQdHI8WFBhdGhSZXN1bHQ+IERvY3VtZW50OjpldmFsdWF0ZShj
b25zdCBTdHJpbmcmIGV4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgTm9kZSogY29udGV4dE5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgWFBhdGhOU1Jlc29sdmVyKiByZXNvbHZlciwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCB0eXBlLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhQYXRoUmVzdWx0KiByZXN1
bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9u
Q29kZSYgZWMpCit7CisgICAgaWYgKCFtX3hwYXRoRXZhbHVhdG9yKQorICAgICAgICBtX3hwYXRo
RXZhbHVhdG9yID0gWFBhdGhFdmFsdWF0b3I6OmNyZWF0ZSgpOworICAgIHJldHVybiBtX3hwYXRo
RXZhbHVhdG9yLT5ldmFsdWF0ZShleHByZXNzaW9uLCBjb250ZXh0Tm9kZSwgcmVzb2x2ZXIsIHR5
cGUsIHJlc3VsdCwgZWMpOworfQorCitjb25zdCBWZWN0b3I8SWNvblVSTD4mIERvY3VtZW50Ojpp
Y29uVVJMcygpCit7CisgICAgbV9pY29uVVJMcy5jbGVhcigpOworCisgICAgaWYgKCFoZWFkKCkg
fHwgIShoZWFkKCktPmNoaWxkcmVuKCkpKQorICAgICAgICByZXR1cm4gbV9pY29uVVJMczsKKwor
ICAgIC8vIEluY2x1ZGUgYW55IGljb25zIHdoZXJlIHR5cGUgPSBsaW5rLCByZWwgPSAic2hvcnRj
dXQgaWNvbiIuCisgICAgUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBjaGlsZHJlbiA9IGhlYWQoKS0+
Y2hpbGRyZW4oKTsKKyAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoID0gY2hpbGRyZW4tPmxlbmd0aCgp
OworICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAg
ICAgTm9kZSogY2hpbGQgPSBjaGlsZHJlbi0+aXRlbShpKTsKKyAgICAgICAgaWYgKCFjaGlsZC0+
aGFzVGFnTmFtZShsaW5rVGFnKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBIVE1M
TGlua0VsZW1lbnQqIGxpbmtFbGVtZW50ID0gc3RhdGljX2Nhc3Q8SFRNTExpbmtFbGVtZW50Kj4o
Y2hpbGQpOworICAgICAgICBpZiAobGlua0VsZW1lbnQtPmljb25UeXBlKCkgIT0gRmF2aWNvbikK
KyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAobGlua0VsZW1lbnQtPmhyZWYoKS5p
c0VtcHR5KCkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAvLyBQdXQgaXQgYXQg
dGhlIGZyb250IHRvIGVuc3VyZSB0aGF0IGljb25zIHNlZW4gbGF0ZXIgdGFrZSBwcmVjZWRlbmNl
IGFzIHJlcXVpcmVkIGJ5IHRoZSBzcGVjLgorICAgICAgICBJY29uVVJMIG5ld1VSTChsaW5rRWxl
bWVudC0+aHJlZigpLCBsaW5rRWxlbWVudC0+aWNvblNpemVzKCksIGxpbmtFbGVtZW50LT50eXBl
KCksIGxpbmtFbGVtZW50LT5pY29uVHlwZSgpKTsKKyAgICAgICAgbV9pY29uVVJMcy5wcmVwZW5k
KG5ld1VSTCk7CisgICAgfQorCisgICAgcmV0dXJuIG1faWNvblVSTHM7Cit9CisKK3ZvaWQgRG9j
dW1lbnQ6OmFkZEljb25VUkwoY29uc3QgU3RyaW5nJiB1cmwsIGNvbnN0IFN0cmluZyYgbWltZVR5
cGUsIGNvbnN0IFN0cmluZyYgc2l6ZXMsIEljb25UeXBlIGljb25UeXBlKQoreworICAgIGlmICh1
cmwuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBGSVhNRSAtIDxyZGFyOi8v
cHJvYmxlbS80NzI3NjQ1PiAtIEF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZSwgd2UgbWlnaHQg
YWN0dWFsbHkgaG9ub3IgdGhlICJtaW1lVHlwZSIKKyAgICBJY29uVVJMIG5ld1VSTChLVVJMKFBh
cnNlZFVSTFN0cmluZywgdXJsKSwgc2l6ZXMsIG1pbWVUeXBlLCBpY29uVHlwZSk7CisKKyAgICBp
ZiAoRnJhbWUqIGYgPSBmcmFtZSgpKSB7CisgICAgICAgIEljb25VUkwgaWNvblVSTCA9IGYtPmxv
YWRlcigpLT5pY29uKCktPmljb25VUkwoaWNvblR5cGUpOworICAgICAgICBpZiAoaWNvblVSTCA9
PSBuZXdVUkwpCisgICAgICAgICAgICBmLT5sb2FkZXIoKS0+ZGlkQ2hhbmdlSWNvbnMoaWNvblR5
cGUpOworICAgIH0KK30KKwordm9pZCBEb2N1bWVudDo6c2V0VXNlU2VjdXJlS2V5Ym9hcmRFbnRy
eVdoZW5BY3RpdmUoYm9vbCB1c2VzU2VjdXJlS2V5Ym9hcmQpCit7CisgICAgaWYgKG1fdXNlU2Vj
dXJlS2V5Ym9hcmRFbnRyeVdoZW5BY3RpdmUgPT0gdXNlc1NlY3VyZUtleWJvYXJkKQorICAgICAg
ICByZXR1cm47CisKKyAgICBtX3VzZVNlY3VyZUtleWJvYXJkRW50cnlXaGVuQWN0aXZlID0gdXNl
c1NlY3VyZUtleWJvYXJkOworICAgIG1fZnJhbWUtPnNlbGVjdGlvbigpLT51cGRhdGVTZWN1cmVL
ZXlib2FyZEVudHJ5SWZBY3RpdmUoKTsKK30KKworYm9vbCBEb2N1bWVudDo6dXNlU2VjdXJlS2V5
Ym9hcmRFbnRyeVdoZW5BY3RpdmUoKSBjb25zdAoreworICAgIHJldHVybiBtX3VzZVNlY3VyZUtl
eWJvYXJkRW50cnlXaGVuQWN0aXZlOworfQorCitzdGF0aWMgYm9vbCBpc0VsaWdpYmxlRm9yU2Vh
bWxlc3MoRG9jdW1lbnQqIHBhcmVudCwgRG9jdW1lbnQqIGNoaWxkKQoreworICAgIC8vIEl0IHNo
b3VsZCBub3QgbWF0dGVyIHdoYXQgd2UgcmV0dXJuIGZvciB0aGUgdG9wLW1vc3QgZG9jdW1lbnQu
CisgICAgaWYgKCFwYXJlbnQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAocGFyZW50
LT5pc1NhbmRib3hlZChTYW5kYm94U2VhbWxlc3NJZnJhbWVzKSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgIGlmIChjaGlsZC0+aXNTcmNkb2NEb2N1bWVudCgpKQorICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICBpZiAocGFyZW50LT5zZWN1cml0eU9yaWdpbigpLT5jYW5BY2Nlc3MoY2hpbGQt
PnNlY3VyaXR5T3JpZ2luKCkpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gcGFy
ZW50LT5zZWN1cml0eU9yaWdpbigpLT5jYW5SZXF1ZXN0KGNoaWxkLT51cmwoKSk7Cit9CisKK3Zv
aWQgRG9jdW1lbnQ6OmluaXRTZWN1cml0eUNvbnRleHQoKQoreworICAgIGlmIChoYXZlSW5pdGlh
bGl6ZWRTZWN1cml0eU9yaWdpbigpKSB7CisgICAgICAgIEFTU0VSVChzZWN1cml0eU9yaWdpbigp
KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghbV9mcmFtZSkgeworICAgICAg
ICAvLyBObyBzb3VyY2UgZm9yIGEgc2VjdXJpdHkgY29udGV4dC4KKyAgICAgICAgLy8gVGhpcyBj
YW4gb2NjdXIgdmlhIGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZURvY3VtZW50KCkuCisg
ICAgICAgIG1fY29va2llVVJMID0gS1VSTChQYXJzZWRVUkxTdHJpbmcsIGVtcHR5U3RyaW5nKCkp
OworICAgICAgICBzZXRTZWN1cml0eU9yaWdpbihTZWN1cml0eU9yaWdpbjo6Y3JlYXRlVW5pcXVl
KCkpOworICAgICAgICBzZXRDb250ZW50U2VjdXJpdHlQb2xpY3koQ29udGVudFNlY3VyaXR5UG9s
aWN5OjpjcmVhdGUodGhpcykpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gSW4g
dGhlIGNvbW1vbiBjYXNlLCBjcmVhdGUgdGhlIHNlY3VyaXR5IGNvbnRleHQgZnJvbSB0aGUgY3Vy
cmVudGx5CisgICAgLy8gbG9hZGluZyBVUkwgd2l0aCBhIGZyZXNoIGNvbnRlbnQgc2VjdXJpdHkg
cG9saWN5LgorICAgIG1fY29va2llVVJMID0gbV91cmw7CisgICAgZW5mb3JjZVNhbmRib3hGbGFn
cyhtX2ZyYW1lLT5sb2FkZXIoKS0+ZWZmZWN0aXZlU2FuZGJveEZsYWdzKCkpOworICAgIHNldFNl
Y3VyaXR5T3JpZ2luKGlzU2FuZGJveGVkKFNhbmRib3hPcmlnaW4pID8gU2VjdXJpdHlPcmlnaW46
OmNyZWF0ZVVuaXF1ZSgpIDogU2VjdXJpdHlPcmlnaW46OmNyZWF0ZShtX3VybCkpOworICAgIHNl
dENvbnRlbnRTZWN1cml0eVBvbGljeShDb250ZW50U2VjdXJpdHlQb2xpY3k6OmNyZWF0ZSh0aGlz
KSk7CisKKyAgICBpZiAoU2VjdXJpdHlQb2xpY3k6OmFsbG93U3Vic3RpdHV0ZURhdGFBY2Nlc3NU
b0xvY2FsKCkpIHsKKyAgICAgICAgLy8gSWYgdGhpcyBkb2N1bWVudCB3YXMgbG9hZGVkIHdpdGgg
c3Vic3RpdHV0ZURhdGEsIHRoZW4gdGhlIGRvY3VtZW50IGNhbgorICAgICAgICAvLyBsb2FkIGxv
Y2FsIHJlc291cmNlcy4gIFNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9MTY3NTYKKyAgICAgICAgLy8gYW5kIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD0xOTc2MCBmb3IgZnVydGhlcgorICAgICAgICAvLyBkaXNjdXNzaW9uLgorICAgICAg
ICAKKyAgICAgICAgRG9jdW1lbnRMb2FkZXIqIGRvY3VtZW50TG9hZGVyID0gbG9hZGVyKCk7Cisg
ICAgICAgIGlmIChkb2N1bWVudExvYWRlciAmJiBkb2N1bWVudExvYWRlci0+c3Vic3RpdHV0ZURh
dGEoKS5pc1ZhbGlkKCkpCisgICAgICAgICAgICBzZWN1cml0eU9yaWdpbigpLT5ncmFudExvYWRM
b2NhbFJlc291cmNlcygpOworICAgIH0KKworICAgIGlmIChTZXR0aW5ncyogc2V0dGluZ3MgPSB0
aGlzLT5zZXR0aW5ncygpKSB7CisgICAgICAgIGlmICghc2V0dGluZ3MtPmlzV2ViU2VjdXJpdHlF
bmFibGVkKCkpIHsKKyAgICAgICAgICAgIC8vIFdlYiBzZWN1cml0eSBpcyB0dXJuZWQgb2ZmLiBX
ZSBzaG91bGQgbGV0IHRoaXMgZG9jdW1lbnQgYWNjZXNzIGV2ZXJ5IG90aGVyIGRvY3VtZW50LiBU
aGlzIGlzIHVzZWQgcHJpbWFyeSBieSB0ZXN0aW5nCisgICAgICAgICAgICAvLyBoYXJuZXNzZXMg
Zm9yIHdlYiBzaXRlcy4KKyAgICAgICAgICAgIHNlY3VyaXR5T3JpZ2luKCktPmdyYW50VW5pdmVy
c2FsQWNjZXNzKCk7CisgICAgICAgIH0gZWxzZSBpZiAoc2VjdXJpdHlPcmlnaW4oKS0+aXNMb2Nh
bCgpKSB7CisgICAgICAgICAgICBpZiAoc2V0dGluZ3MtPmFsbG93VW5pdmVyc2FsQWNjZXNzRnJv
bUZpbGVVUkxzKCkgfHwgbV9mcmFtZS0+bG9hZGVyKCktPmNsaWVudCgpLT5zaG91bGRGb3JjZVVu
aXZlcnNhbEFjY2Vzc0Zyb21Mb2NhbFVSTChtX3VybCkpIHsKKyAgICAgICAgICAgICAgICAvLyBT
b21lIGNsaWVudHMgd2FudCBsb2NhbCBVUkxzIHRvIGhhdmUgdW5pdmVyc2FsIGFjY2VzcywgYnV0
IHRoYXQgc2V0dGluZyBpcyBkYW5nZXJvdXMgZm9yIG90aGVyIGNsaWVudHMuCisgICAgICAgICAg
ICAgICAgc2VjdXJpdHlPcmlnaW4oKS0+Z3JhbnRVbml2ZXJzYWxBY2Nlc3MoKTsKKyAgICAgICAg
ICAgIH0gZWxzZSBpZiAoIXNldHRpbmdzLT5hbGxvd0ZpbGVBY2Nlc3NGcm9tRmlsZVVSTHMoKSkg
eworICAgICAgICAgICAgICAgIC8vIFNvbWUgY2xpZW50cyB3YW50IGxvY2FsIFVSTHMgdG8gaGF2
ZSBldmVuIHRpZ2h0ZXIgcmVzdHJpY3Rpb25zIGJ5IGRlZmF1bHQsIGFuZCBub3QgYmUgYWJsZSB0
byBhY2Nlc3Mgb3RoZXIgbG9jYWwgZmlsZXMuCisgICAgICAgICAgICAgICAgLy8gRklYTUUgODE1
Nzg6IFRoZSBuYW1pbmcgb2YgdGhpcyBpcyBjb25mdXNpbmcuIEZpbGVzIHdpdGggcmVzdHJpY3Rl
ZCBhY2Nlc3MgdG8gb3RoZXIgbG9jYWwgZmlsZXMKKyAgICAgICAgICAgICAgICAvLyBzdGlsbCBj
YW4gaGF2ZSBvdGhlciBwcml2aWxlZ2VzIHRoYXQgY2FuIGJlIHJlbWVtYmVyZWQsIHRoZXJlYnkg
bm90IG1ha2luZyB0aGVtIHVuaXF1ZSBvcmlnaW5zLgorICAgICAgICAgICAgICAgIHNlY3VyaXR5
T3JpZ2luKCktPmVuZm9yY2VGaWxlUGF0aFNlcGFyYXRpb24oKTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgfQorICAgICAgICBzZWN1cml0eU9yaWdpbigpLT5zZXRTdG9yYWdlQmxvY2tpbmdQb2xp
Y3koc2V0dGluZ3MtPnN0b3JhZ2VCbG9ja2luZ1BvbGljeSgpKTsKKyAgICB9CisKKyAgICBEb2N1
bWVudCogcGFyZW50RG9jdW1lbnQgPSBvd25lckVsZW1lbnQoKSA/IG93bmVyRWxlbWVudCgpLT5k
b2N1bWVudCgpIDogMDsKKyAgICBpZiAocGFyZW50RG9jdW1lbnQgJiYgbV9mcmFtZS0+bG9hZGVy
KCktPnNob3VsZFRyZWF0VVJMQXNTcmNkb2NEb2N1bWVudCh1cmwoKSkpIHsKKyAgICAgICAgbV9p
c1NyY2RvY0RvY3VtZW50ID0gdHJ1ZTsKKyAgICAgICAgc2V0QmFzZVVSTE92ZXJyaWRlKHBhcmVu
dERvY3VtZW50LT5iYXNlVVJMKCkpOworICAgIH0KKworICAgIC8vIEZJWE1FOiBXaGF0IGhhcHBl
bnMgaWYgd2UgaW5oZXJpdCB0aGUgc2VjdXJpdHkgb3JpZ2luPyBUaGlzIGNoZWNrIG1heSBuZWVk
IHRvIGJlIGxhdGVyLgorICAgIC8vIDxpZnJhbWUgc2VhbWxlc3Mgc3JjPSJhYm91dDpibGFuayI+
IGxpa2VseSB3b24ndCB3b3JrIGFzLWlzLgorICAgIG1fbWF5RGlzcGxheVNlYW1sZXNzV2l0aFBh
cmVudCA9IGlzRWxpZ2libGVGb3JTZWFtbGVzcyhwYXJlbnREb2N1bWVudCwgdGhpcyk7CisKKyAg
ICBpZiAoIXNob3VsZEluaGVyaXRTZWN1cml0eU9yaWdpbkZyb21Pd25lcihtX3VybCkpCisgICAg
ICAgIHJldHVybjsKKworICAgIC8vIElmIHdlIGRvIG5vdCBvYnRhaW4gYSBtZWFuaW5nZnVsIG9y
aWdpbiBmcm9tIHRoZSBVUkwsIHRoZW4gd2UgdHJ5IHRvCisgICAgLy8gZmluZCBvbmUgdmlhIHRo
ZSBmcmFtZSBoaWVyYXJjaHkuCisKKyAgICBGcmFtZSogb3duZXJGcmFtZSA9IG1fZnJhbWUtPnRy
ZWUoKS0+cGFyZW50KCk7CisgICAgaWYgKCFvd25lckZyYW1lKQorICAgICAgICBvd25lckZyYW1l
ID0gbV9mcmFtZS0+bG9hZGVyKCktPm9wZW5lcigpOworCisgICAgaWYgKCFvd25lckZyYW1lKSB7
CisgICAgICAgIGRpZEZhaWxUb0luaXRpYWxpemVTZWN1cml0eU9yaWdpbigpOworICAgICAgICBy
ZXR1cm47CisgICAgfQorCisgICAgaWYgKGlzU2FuZGJveGVkKFNhbmRib3hPcmlnaW4pKSB7Cisg
ICAgICAgIC8vIElmIHdlJ3JlIHN1cHBvc2VkIHRvIGluaGVyaXQgb3VyIHNlY3VyaXR5IG9yaWdp
biBmcm9tIG91ciBvd25lciwKKyAgICAgICAgLy8gYnV0IHdlJ3JlIGFsc28gc2FuZGJveGVkLCB0
aGUgb25seSB0aGluZyB3ZSBpbmhlcml0IGlzIHRoZSBhYmlsaXR5CisgICAgICAgIC8vIHRvIGxv
YWQgbG9jYWwgcmVzb3VyY2VzLiBUaGlzIGxldHMgYWJvdXQ6YmxhbmsgaWZyYW1lcyBpbiBmaWxl
Oi8vCisgICAgICAgIC8vIFVSTCBkb2N1bWVudHMgbG9hZCBpbWFnZXMgYW5kIG90aGVyIHJlc291
cmNlcyBmcm9tIHRoZSBmaWxlIHN5c3RlbS4KKyAgICAgICAgaWYgKG93bmVyRnJhbWUtPmRvY3Vt
ZW50KCktPnNlY3VyaXR5T3JpZ2luKCktPmNhbkxvYWRMb2NhbFJlc291cmNlcygpKQorICAgICAg
ICAgICAgc2VjdXJpdHlPcmlnaW4oKS0+Z3JhbnRMb2FkTG9jYWxSZXNvdXJjZXMoKTsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKworICAgIG1fY29va2llVVJMID0gb3duZXJGcmFtZS0+ZG9jdW1l
bnQoKS0+Y29va2llVVJMKCk7CisgICAgLy8gV2UgYWxpYXMgdGhlIFNlY3VyaXR5T3JpZ2lucyB0
byBtYXRjaCBGaXJlZm94LCBzZWUgQnVnIDE1MzEzCisgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTE1MzEzCisgICAgc2V0U2VjdXJpdHlPcmlnaW4ob3duZXJG
cmFtZS0+ZG9jdW1lbnQoKS0+c2VjdXJpdHlPcmlnaW4oKSk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6
OmluaXRDb250ZW50U2VjdXJpdHlQb2xpY3koKQoreworICAgIGlmICghbV9mcmFtZS0+dHJlZSgp
LT5wYXJlbnQoKSB8fCAoIXNob3VsZEluaGVyaXRTZWN1cml0eU9yaWdpbkZyb21Pd25lcihtX3Vy
bCkgJiYgIWlzUGx1Z2luRG9jdW1lbnQoKSkpCisgICAgICAgIHJldHVybjsKKworICAgIGNvbnRl
bnRTZWN1cml0eVBvbGljeSgpLT5jb3B5U3RhdGVGcm9tKG1fZnJhbWUtPnRyZWUoKS0+cGFyZW50
KCktPmRvY3VtZW50KCktPmNvbnRlbnRTZWN1cml0eVBvbGljeSgpKTsKK30KKwordm9pZCBEb2N1
bWVudDo6ZGlkVXBkYXRlU2VjdXJpdHlPcmlnaW4oKQoreworICAgIGlmICghbV9mcmFtZSkKKyAg
ICAgICAgcmV0dXJuOworICAgIG1fZnJhbWUtPnNjcmlwdCgpLT51cGRhdGVTZWN1cml0eU9yaWdp
bigpOworfQorCitib29sIERvY3VtZW50Ojppc0NvbnRleHRUaHJlYWQoKSBjb25zdAoreworICAg
IHJldHVybiBpc01haW5UaHJlYWQoKTsKK30KKwordm9pZCBEb2N1bWVudDo6dXBkYXRlVVJMRm9y
UHVzaE9yUmVwbGFjZVN0YXRlKGNvbnN0IEtVUkwmIHVybCkKK3sKKyAgICBGcmFtZSogZiA9IGZy
YW1lKCk7CisgICAgaWYgKCFmKQorICAgICAgICByZXR1cm47CisKKyAgICBzZXRVUkwodXJsKTsK
KyAgICBmLT5sb2FkZXIoKS0+c2V0T3V0Z29pbmdSZWZlcnJlcih1cmwpOworCisgICAgaWYgKERv
Y3VtZW50TG9hZGVyKiBkb2N1bWVudExvYWRlciA9IGxvYWRlcigpKQorICAgICAgICBkb2N1bWVu
dExvYWRlci0+cmVwbGFjZVJlcXVlc3RVUkxGb3JTYW1lRG9jdW1lbnROYXZpZ2F0aW9uKHVybCk7
Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnN0YXRlUG9wcGVkKFBhc3NSZWZQdHI8U2VyaWFsaXplZFNj
cmlwdFZhbHVlPiBzdGF0ZU9iamVjdCkKK3sKKyAgICBpZiAoIWZyYW1lKCkpCisgICAgICAgIHJl
dHVybjsKKyAgICAKKyAgICAvLyBQZXIgc3RlcCAxMSBvZiBzZWN0aW9uIDYuNS45IChoaXN0b3J5
IHRyYXZlcnNhbCkgb2YgdGhlIEhUTUw1IHNwZWMsIHdlIAorICAgIC8vIGRlZmVyIGZpcmluZyBv
ZiBwb3BzdGF0ZSB1bnRpbCB3ZSdyZSBpbiB0aGUgY29tcGxldGUgc3RhdGUuCisgICAgaWYgKG1f
cmVhZHlTdGF0ZSA9PSBDb21wbGV0ZSkKKyAgICAgICAgZW5xdWV1ZVBvcHN0YXRlRXZlbnQoc3Rh
dGVPYmplY3QpOworICAgIGVsc2UKKyAgICAgICAgbV9wZW5kaW5nU3RhdGVPYmplY3QgPSBzdGF0
ZU9iamVjdDsKK30KKwordm9pZCBEb2N1bWVudDo6dXBkYXRlRm9jdXNBcHBlYXJhbmNlU29vbihi
b29sIHJlc3RvcmVQcmV2aW91c1NlbGVjdGlvbikKK3sKKyAgICBtX3VwZGF0ZUZvY3VzQXBwZWFy
YW5jZVJlc3RvcmVzU2VsZWN0aW9uID0gcmVzdG9yZVByZXZpb3VzU2VsZWN0aW9uOworICAgIGlm
ICghbV91cGRhdGVGb2N1c0FwcGVhcmFuY2VUaW1lci5pc0FjdGl2ZSgpKQorICAgICAgICBtX3Vw
ZGF0ZUZvY3VzQXBwZWFyYW5jZVRpbWVyLnN0YXJ0T25lU2hvdCgwKTsKK30KKwordm9pZCBEb2N1
bWVudDo6Y2FuY2VsRm9jdXNBcHBlYXJhbmNlVXBkYXRlKCkKK3sKKyAgICBtX3VwZGF0ZUZvY3Vz
QXBwZWFyYW5jZVRpbWVyLnN0b3AoKTsKK30KKwordm9pZCBEb2N1bWVudDo6dXBkYXRlRm9jdXNB
cHBlYXJhbmNlVGltZXJGaXJlZChUaW1lcjxEb2N1bWVudD4qKQoreworICAgIE5vZGUqIG5vZGUg
PSBmb2N1c2VkTm9kZSgpOworICAgIGlmICghbm9kZSkKKyAgICAgICAgcmV0dXJuOworICAgIGlm
ICghbm9kZS0+aXNFbGVtZW50Tm9kZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICB1cGRhdGVM
YXlvdXQoKTsKKworICAgIEVsZW1lbnQqIGVsZW1lbnQgPSBzdGF0aWNfY2FzdDxFbGVtZW50Kj4o
bm9kZSk7CisgICAgaWYgKGVsZW1lbnQtPmlzRm9jdXNhYmxlKCkpCisgICAgICAgIGVsZW1lbnQt
PnVwZGF0ZUZvY3VzQXBwZWFyYW5jZShtX3VwZGF0ZUZvY3VzQXBwZWFyYW5jZVJlc3RvcmVzU2Vs
ZWN0aW9uKTsKK30KKwordm9pZCBEb2N1bWVudDo6YXR0YWNoUmFuZ2UoUmFuZ2UqIHJhbmdlKQor
eworICAgIEFTU0VSVCghbV9yYW5nZXMuY29udGFpbnMocmFuZ2UpKTsKKyAgICBtX3Jhbmdlcy5h
ZGQocmFuZ2UpOworfQorCit2b2lkIERvY3VtZW50OjpkZXRhY2hSYW5nZShSYW5nZSogcmFuZ2Up
Cit7CisgICAgLy8gV2UgZG9uJ3QgQVNTRVJUIG1fcmFuZ2VzLmNvbnRhaW5zKHJhbmdlKSB0byBh
bGxvdyB1cyB0byBjYWxsIHRoaXMKKyAgICAvLyB1bmNvbmRpdGlvbmFsbHkgdG8gZml4OiBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjYwNDQKKyAgICBtX3Jhbmdlcy5y
ZW1vdmUocmFuZ2UpOworfQorCitDYW52YXNSZW5kZXJpbmdDb250ZXh0KiBEb2N1bWVudDo6Z2V0
Q1NTQ2FudmFzQ29udGV4dChjb25zdCBTdHJpbmcmIHR5cGUsIGNvbnN0IFN0cmluZyYgbmFtZSwg
aW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIEhUTUxDYW52YXNFbGVtZW50KiBlbGVtZW50
ID0gZ2V0Q1NTQ2FudmFzRWxlbWVudChuYW1lKTsKKyAgICBpZiAoIWVsZW1lbnQpCisgICAgICAg
IHJldHVybiAwOworICAgIGVsZW1lbnQtPnNldFNpemUoSW50U2l6ZSh3aWR0aCwgaGVpZ2h0KSk7
CisgICAgcmV0dXJuIGVsZW1lbnQtPmdldENvbnRleHQodHlwZSk7Cit9CisKK0hUTUxDYW52YXNF
bGVtZW50KiBEb2N1bWVudDo6Z2V0Q1NTQ2FudmFzRWxlbWVudChjb25zdCBTdHJpbmcmIG5hbWUp
Cit7CisgICAgUmVmUHRyPEhUTUxDYW52YXNFbGVtZW50PiYgZWxlbWVudCA9IG1fY3NzQ2FudmFz
RWxlbWVudHMuYWRkKG5hbWUsIDApLml0ZXJhdG9yLT5zZWNvbmQ7CisgICAgaWYgKCFlbGVtZW50
KQorICAgICAgICBlbGVtZW50ID0gSFRNTENhbnZhc0VsZW1lbnQ6OmNyZWF0ZSh0aGlzKTsKKyAg
ICByZXR1cm4gZWxlbWVudC5nZXQoKTsKK30KKwordm9pZCBEb2N1bWVudDo6aW5pdEROU1ByZWZl
dGNoKCkKK3sKKyAgICBTZXR0aW5ncyogc2V0dGluZ3MgPSB0aGlzLT5zZXR0aW5ncygpOworCisg
ICAgbV9oYXZlRXhwbGljaXRseURpc2FibGVkRE5TUHJlZmV0Y2ggPSBmYWxzZTsKKyAgICBtX2lz
RE5TUHJlZmV0Y2hFbmFibGVkID0gc2V0dGluZ3MgJiYgc2V0dGluZ3MtPmRuc1ByZWZldGNoaW5n
RW5hYmxlZCgpICYmIHNlY3VyaXR5T3JpZ2luKCktPnByb3RvY29sKCkgPT0gImh0dHAiOworCisg
ICAgLy8gSW5oZXJpdCBETlMgcHJlZmV0Y2ggb3B0LW91dCBmcm9tIHBhcmVudCBmcmFtZSAgICAK
KyAgICBpZiAoRG9jdW1lbnQqIHBhcmVudCA9IHBhcmVudERvY3VtZW50KCkpIHsKKyAgICAgICAg
aWYgKCFwYXJlbnQtPmlzRE5TUHJlZmV0Y2hFbmFibGVkKCkpCisgICAgICAgICAgICBtX2lzRE5T
UHJlZmV0Y2hFbmFibGVkID0gZmFsc2U7CisgICAgfQorfQorCit2b2lkIERvY3VtZW50OjpwYXJz
ZUROU1ByZWZldGNoQ29udHJvbEhlYWRlcihjb25zdCBTdHJpbmcmIGRuc1ByZWZldGNoQ29udHJv
bCkKK3sKKyAgICBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoZG5zUHJlZmV0Y2hDb250cm9sLCAib24i
KSAmJiAhbV9oYXZlRXhwbGljaXRseURpc2FibGVkRE5TUHJlZmV0Y2gpIHsKKyAgICAgICAgbV9p
c0ROU1ByZWZldGNoRW5hYmxlZCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAg
ICBtX2lzRE5TUHJlZmV0Y2hFbmFibGVkID0gZmFsc2U7CisgICAgbV9oYXZlRXhwbGljaXRseURp
c2FibGVkRE5TUHJlZmV0Y2ggPSB0cnVlOworfQorCit2b2lkIERvY3VtZW50OjphZGRNZXNzYWdl
KE1lc3NhZ2VTb3VyY2Ugc291cmNlLCBNZXNzYWdlVHlwZSB0eXBlLCBNZXNzYWdlTGV2ZWwgbGV2
ZWwsIGNvbnN0IFN0cmluZyYgbWVzc2FnZSwgY29uc3QgU3RyaW5nJiBzb3VyY2VVUkwsIHVuc2ln
bmVkIGxpbmVOdW1iZXIsIFBhc3NSZWZQdHI8U2NyaXB0Q2FsbFN0YWNrPiBjYWxsU3RhY2spCit7
CisgICAgaWYgKCFpc0NvbnRleHRUaHJlYWQoKSkgeworICAgICAgICBwb3N0VGFzayhBZGRDb25z
b2xlTWVzc2FnZVRhc2s6OmNyZWF0ZShzb3VyY2UsIHR5cGUsIGxldmVsLCBtZXNzYWdlKSk7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoRE9NV2luZG93KiB3aW5kb3cgPSBkb21X
aW5kb3coKSkKKyAgICAgICAgd2luZG93LT5jb25zb2xlKCktPmFkZE1lc3NhZ2Uoc291cmNlLCB0
eXBlLCBsZXZlbCwgbWVzc2FnZSwgc291cmNlVVJMLCBsaW5lTnVtYmVyLCBjYWxsU3RhY2spOwor
fQorCitzdHJ1Y3QgUGVyZm9ybVRhc2tDb250ZXh0IHsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJM
RShQZXJmb3JtVGFza0NvbnRleHQpOyBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKK3B1YmxpYzoK
KyAgICBQZXJmb3JtVGFza0NvbnRleHQoUGFzc1JlZlB0cjxEb2N1bWVudFdlYWtSZWZlcmVuY2U+
IGRvY3VtZW50UmVmZXJlbmNlLCBQYXNzT3duUHRyPFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQ6OlRh
c2s+IHRhc2spCisgICAgICAgIDogZG9jdW1lbnRSZWZlcmVuY2UoZG9jdW1lbnRSZWZlcmVuY2Up
CisgICAgICAgICwgdGFzayh0YXNrKQorICAgIHsKKyAgICB9CisKKyAgICBSZWZQdHI8RG9jdW1l
bnRXZWFrUmVmZXJlbmNlPiBkb2N1bWVudFJlZmVyZW5jZTsKKyAgICBPd25QdHI8U2NyaXB0RXhl
Y3V0aW9uQ29udGV4dDo6VGFzaz4gdGFzazsKK307CisKK3ZvaWQgRG9jdW1lbnQ6OmRpZFJlY2Vp
dmVUYXNrKHZvaWQqIHVudHlwZWRDb250ZXh0KQoreworICAgIEFTU0VSVChpc01haW5UaHJlYWQo
KSk7CisKKyAgICBPd25QdHI8UGVyZm9ybVRhc2tDb250ZXh0PiBjb250ZXh0ID0gYWRvcHRQdHIo
c3RhdGljX2Nhc3Q8UGVyZm9ybVRhc2tDb250ZXh0Kj4odW50eXBlZENvbnRleHQpKTsKKyAgICBB
U1NFUlQoY29udGV4dCk7CisKKyAgICBEb2N1bWVudCogZG9jdW1lbnQgPSBjb250ZXh0LT5kb2N1
bWVudFJlZmVyZW5jZS0+ZG9jdW1lbnQoKTsKKyAgICBpZiAoIWRvY3VtZW50KQorICAgICAgICBy
ZXR1cm47CisKKyAgICBQYWdlKiBwYWdlID0gZG9jdW1lbnQtPnBhZ2UoKTsKKyAgICBpZiAoKHBh
Z2UgJiYgcGFnZS0+ZGVmZXJzTG9hZGluZygpKSB8fCAhZG9jdW1lbnQtPm1fcGVuZGluZ1Rhc2tz
LmlzRW1wdHkoKSkgeworICAgICAgICBkb2N1bWVudC0+bV9wZW5kaW5nVGFza3MuYXBwZW5kKGNv
bnRleHQtPnRhc2sucmVsZWFzZSgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNv
bnRleHQtPnRhc2stPnBlcmZvcm1UYXNrKGRvY3VtZW50KTsKK30KKwordm9pZCBEb2N1bWVudDo6
cG9zdFRhc2soUGFzc093blB0cjxUYXNrPiB0YXNrKQoreworICAgIGNhbGxPbk1haW5UaHJlYWQo
ZGlkUmVjZWl2ZVRhc2ssIG5ldyBQZXJmb3JtVGFza0NvbnRleHQobV93ZWFrUmVmZXJlbmNlLCB0
YXNrKSk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnBlbmRpbmdUYXNrc1RpbWVyRmlyZWQoVGltZXI8
RG9jdW1lbnQ+KikKK3sKKyAgICB3aGlsZSAoIW1fcGVuZGluZ1Rhc2tzLmlzRW1wdHkoKSkgewor
ICAgICAgICBPd25QdHI8VGFzaz4gdGFzayA9IG1fcGVuZGluZ1Rhc2tzWzBdLnJlbGVhc2UoKTsK
KyAgICAgICAgbV9wZW5kaW5nVGFza3MucmVtb3ZlKDApOworICAgICAgICB0YXNrLT5wZXJmb3Jt
VGFzayh0aGlzKTsKKyAgICB9Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnN1c3BlbmRTY2hlZHVsZWRU
YXNrcyhBY3RpdmVET01PYmplY3Q6OlJlYXNvbkZvclN1c3BlbnNpb24gcmVhc29uKQoreworICAg
IEFTU0VSVCghbV9zY2hlZHVsZWRUYXNrc0FyZVN1c3BlbmRlZCk7CisKKyAgICBzdXNwZW5kU2Ny
aXB0ZWRBbmltYXRpb25Db250cm9sbGVyQ2FsbGJhY2tzKCk7CisgICAgc3VzcGVuZEFjdGl2ZURP
TU9iamVjdHMocmVhc29uKTsKKyAgICBzY3JpcHRSdW5uZXIoKS0+c3VzcGVuZCgpOworICAgIG1f
cGVuZGluZ1Rhc2tzVGltZXIuc3RvcCgpOworICAgIGlmIChtX3BhcnNlcikKKyAgICAgICAgbV9w
YXJzZXItPnN1c3BlbmRTY2hlZHVsZWRUYXNrcygpOworCisgICAgbV9zY2hlZHVsZWRUYXNrc0Fy
ZVN1c3BlbmRlZCA9IHRydWU7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnJlc3VtZVNjaGVkdWxlZFRh
c2tzKCkKK3sKKyAgICBBU1NFUlQobV9zY2hlZHVsZWRUYXNrc0FyZVN1c3BlbmRlZCk7CisKKyAg
ICBpZiAobV9wYXJzZXIpCisgICAgICAgIG1fcGFyc2VyLT5yZXN1bWVTY2hlZHVsZWRUYXNrcygp
OworICAgIGlmICghbV9wZW5kaW5nVGFza3MuaXNFbXB0eSgpKQorICAgICAgICBtX3BlbmRpbmdU
YXNrc1RpbWVyLnN0YXJ0T25lU2hvdCgwKTsKKyAgICBzY3JpcHRSdW5uZXIoKS0+cmVzdW1lKCk7
CisgICAgcmVzdW1lQWN0aXZlRE9NT2JqZWN0cygpOworICAgIHJlc3VtZVNjcmlwdGVkQW5pbWF0
aW9uQ29udHJvbGxlckNhbGxiYWNrcygpOworICAgIAorICAgIG1fc2NoZWR1bGVkVGFza3NBcmVT
dXNwZW5kZWQgPSBmYWxzZTsKK30KKwordm9pZCBEb2N1bWVudDo6c3VzcGVuZFNjcmlwdGVkQW5p
bWF0aW9uQ29udHJvbGxlckNhbGxiYWNrcygpCit7CisjaWYgRU5BQkxFKFJFUVVFU1RfQU5JTUFU
SU9OX0ZSQU1FKQorICAgIGlmIChtX3NjcmlwdGVkQW5pbWF0aW9uQ29udHJvbGxlcikKKyAgICAg
ICAgbV9zY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXItPnN1c3BlbmQoKTsKKyNlbmRpZgorfQor
Cit2b2lkIERvY3VtZW50OjpyZXN1bWVTY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXJDYWxsYmFj
a3MoKQoreworI2lmIEVOQUJMRShSRVFVRVNUX0FOSU1BVElPTl9GUkFNRSkKKyAgICBpZiAobV9z
Y3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXIpCisgICAgICAgIG1fc2NyaXB0ZWRBbmltYXRpb25D
b250cm9sbGVyLT5yZXN1bWUoKTsKKyNlbmRpZgorfQorCit2b2lkIERvY3VtZW50Ojp3aW5kb3dT
Y3JlZW5EaWRDaGFuZ2UoUGxhdGZvcm1EaXNwbGF5SUQgZGlzcGxheUlEKQoreworI2lmIEVOQUJM
RShSRVFVRVNUX0FOSU1BVElPTl9GUkFNRSkKKyAgICBpZiAobV9zY3JpcHRlZEFuaW1hdGlvbkNv
bnRyb2xsZXIpCisgICAgICAgIG1fc2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyLT53aW5kb3dT
Y3JlZW5EaWRDaGFuZ2UoZGlzcGxheUlEKTsKKyNlbHNlCisgICAgVU5VU0VEX1BBUkFNKGRpc3Bs
YXlJRCk7CisjZW5kaWYKK30KKworCitTdHJpbmcgRG9jdW1lbnQ6OmRpc3BsYXlTdHJpbmdNb2Rp
ZmllZEJ5RW5jb2RpbmcoY29uc3QgU3RyaW5nJiBzdHIpIGNvbnN0Cit7CisgICAgaWYgKG1fZGVj
b2RlcikKKyAgICAgICAgcmV0dXJuIG1fZGVjb2Rlci0+ZW5jb2RpbmcoKS5kaXNwbGF5U3RyaW5n
KHN0ci5pbXBsKCkpOworICAgIHJldHVybiBzdHI7Cit9CisKK1Bhc3NSZWZQdHI8U3RyaW5nSW1w
bD4gRG9jdW1lbnQ6OmRpc3BsYXlTdHJpbmdNb2RpZmllZEJ5RW5jb2RpbmcoUGFzc1JlZlB0cjxT
dHJpbmdJbXBsPiBzdHIpIGNvbnN0Cit7CisgICAgaWYgKG1fZGVjb2RlcikKKyAgICAgICAgcmV0
dXJuIG1fZGVjb2Rlci0+ZW5jb2RpbmcoKS5kaXNwbGF5U3RyaW5nKHN0cik7CisgICAgcmV0dXJu
IHN0cjsKK30KKwordm9pZCBEb2N1bWVudDo6ZGlzcGxheUJ1ZmZlck1vZGlmaWVkQnlFbmNvZGlu
ZyhVQ2hhciogYnVmZmVyLCB1bnNpZ25lZCBsZW4pIGNvbnN0Cit7CisgICAgaWYgKG1fZGVjb2Rl
cikKKyAgICAgICAgbV9kZWNvZGVyLT5lbmNvZGluZygpLmRpc3BsYXlCdWZmZXIoYnVmZmVyLCBs
ZW4pOworfQorCit2b2lkIERvY3VtZW50OjplbnF1ZXVlUGFnZXNob3dFdmVudChQYWdlc2hvd0V2
ZW50UGVyc2lzdGVuY2UgcGVyc2lzdGVkKQoreworICAgIC8vIEZJWE1FOiBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzYzMzQgUGFnZXNob3cgZXZlbnQgbmVlZHMgdG8g
ZmlyZSBhc3luY2hyb25vdXNseS4KKyAgICBkaXNwYXRjaFdpbmRvd0V2ZW50KFBhZ2VUcmFuc2l0
aW9uRXZlbnQ6OmNyZWF0ZShldmVudE5hbWVzKCkucGFnZXNob3dFdmVudCwgcGVyc2lzdGVkKSwg
dGhpcyk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmVucXVldWVIYXNoY2hhbmdlRXZlbnQoY29uc3Qg
U3RyaW5nJiBvbGRVUkwsIGNvbnN0IFN0cmluZyYgbmV3VVJMKQoreworICAgIGVucXVldWVXaW5k
b3dFdmVudChIYXNoQ2hhbmdlRXZlbnQ6OmNyZWF0ZShvbGRVUkwsIG5ld1VSTCkpOworfQorCit2
b2lkIERvY3VtZW50OjplbnF1ZXVlUG9wc3RhdGVFdmVudChQYXNzUmVmUHRyPFNlcmlhbGl6ZWRT
Y3JpcHRWYWx1ZT4gc3RhdGVPYmplY3QpCit7CisgICAgLy8gRklYTUU6IGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zNjIwMiBQb3BzdGF0ZSBldmVudCBuZWVkcyB0byBm
aXJlIGFzeW5jaHJvbm91c2x5CisgICAgZGlzcGF0Y2hXaW5kb3dFdmVudChQb3BTdGF0ZUV2ZW50
OjpjcmVhdGUoc3RhdGVPYmplY3QsIGRvbVdpbmRvdygpID8gZG9tV2luZG93KCktPmhpc3Rvcnko
KSA6IDApKTsKK30KKwordm9pZCBEb2N1bWVudDo6YWRkTWVkaWFDYW5TdGFydExpc3RlbmVyKE1l
ZGlhQ2FuU3RhcnRMaXN0ZW5lciogbGlzdGVuZXIpCit7CisgICAgQVNTRVJUKCFtX21lZGlhQ2Fu
U3RhcnRMaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKTsKKyAgICBtX21lZGlhQ2FuU3RhcnRM
aXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKK30KKwordm9pZCBEb2N1bWVudDo6cmVtb3ZlTWVkaWFD
YW5TdGFydExpc3RlbmVyKE1lZGlhQ2FuU3RhcnRMaXN0ZW5lciogbGlzdGVuZXIpCit7CisgICAg
QVNTRVJUKG1fbWVkaWFDYW5TdGFydExpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpOworICAg
IG1fbWVkaWFDYW5TdGFydExpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworfQorCitNZWRpYUNh
blN0YXJ0TGlzdGVuZXIqIERvY3VtZW50Ojp0YWtlQW55TWVkaWFDYW5TdGFydExpc3RlbmVyKCkK
K3sKKyAgICBIYXNoU2V0PE1lZGlhQ2FuU3RhcnRMaXN0ZW5lcio+OjppdGVyYXRvciBzbG90ID0g
bV9tZWRpYUNhblN0YXJ0TGlzdGVuZXJzLmJlZ2luKCk7CisgICAgaWYgKHNsb3QgPT0gbV9tZWRp
YUNhblN0YXJ0TGlzdGVuZXJzLmVuZCgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBNZWRpYUNh
blN0YXJ0TGlzdGVuZXIqIGxpc3RlbmVyID0gKnNsb3Q7CisgICAgbV9tZWRpYUNhblN0YXJ0TGlz
dGVuZXJzLnJlbW92ZShzbG90KTsKKyAgICByZXR1cm4gbGlzdGVuZXI7Cit9CisKKyNpZiBFTkFC
TEUoRlVMTFNDUkVFTl9BUEkpCitib29sIERvY3VtZW50OjpmdWxsU2NyZWVuSXNBbGxvd2VkRm9y
RWxlbWVudChFbGVtZW50KiBlbGVtZW50KSBjb25zdAoreworICAgIEFTU0VSVChlbGVtZW50KTsK
KyAgICByZXR1cm4gaXNBdHRyaWJ1dGVPbkFsbE93bmVycyh3ZWJraXRhbGxvd2Z1bGxzY3JlZW5B
dHRyLCBlbGVtZW50LT5kb2N1bWVudCgpLT5vd25lckVsZW1lbnQoKSk7Cit9CisKK3ZvaWQgRG9j
dW1lbnQ6OnJlcXVlc3RGdWxsU2NyZWVuRm9yRWxlbWVudChFbGVtZW50KiBlbGVtZW50LCB1bnNp
Z25lZCBzaG9ydCBmbGFncywgRnVsbFNjcmVlbkNoZWNrVHlwZSBjaGVja1R5cGUpCit7CisgICAg
Ly8gVGhlIE1vemlsbGEgRnVsbCBTY3JlZW4gQVBJIDxodHRwczovL3dpa2kubW96aWxsYS5vcmcv
R2Vja286RnVsbFNjcmVlbkFQST4gaGFzIGRpZmZlcmVudCByZXF1aXJlbWVudHMKKyAgICAvLyBm
b3IgZnVsbCBzY3JlZW4gbW9kZSwgYW5kIGRvIG5vdCBoYXZlIHRoZSBjb25jZXB0IG9mIGEgZnVs
bCBzY3JlZW4gZWxlbWVudCBzdGFjay4KKyAgICBib29sIGluTGVnYWN5TW96aWxsYU1vZGUgPSAo
ZmxhZ3MgJiBFbGVtZW50OjpMRUdBQ1lfTU9aSUxMQV9SRVFVRVNUKTsKKworICAgIGRvIHsKKyAg
ICAgICAgaWYgKCFlbGVtZW50KQorICAgICAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50RWxlbWVu
dCgpOworIAorICAgICAgICAvLyAxLiBJZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
IGFyZSB0cnVlLCB0ZXJtaW5hdGUgdGhlc2Ugc3RlcHMgYW5kIHF1ZXVlIGEgdGFzayB0byBmaXJl
CisgICAgICAgIC8vIGFuIGV2ZW50IG5hbWVkIGZ1bGxzY3JlZW5lcnJvciB3aXRoIGl0cyBidWJi
bGVzIGF0dHJpYnV0ZSBzZXQgdG8gdHJ1ZSBvbiB0aGUgY29udGV4dCBvYmplY3QncyAKKyAgICAg
ICAgLy8gbm9kZSBkb2N1bWVudDoKKworICAgICAgICAvLyBUaGUgY29udGV4dCBvYmplY3QgaXMg
bm90IGluIGEgZG9jdW1lbnQuCisgICAgICAgIGlmICghZWxlbWVudC0+aW5Eb2N1bWVudCgpKQor
ICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLy8gVGhlIGNvbnRleHQgb2JqZWN0J3Mgbm9k
ZSBkb2N1bWVudCwgb3IgYW4gYW5jZXN0b3IgYnJvd3NpbmcgY29udGV4dCdzIGRvY3VtZW50IGRv
ZXMgbm90IGhhdmUKKyAgICAgICAgLy8gdGhlIGZ1bGxzY3JlZW4gZW5hYmxlZCBmbGFnIHNldC4K
KyAgICAgICAgaWYgKGNoZWNrVHlwZSA9PSBFbmZvcmNlSUZyYW1lQWxsb3dGdWxsU2NyZWVuUmVx
dWlyZW1lbnQgJiYgIWZ1bGxTY3JlZW5Jc0FsbG93ZWRGb3JFbGVtZW50KGVsZW1lbnQpKQorICAg
ICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLy8gVGhlIGNvbnRleHQgb2JqZWN0J3Mgbm9kZSBk
b2N1bWVudCBmdWxsc2NyZWVuIGVsZW1lbnQgc3RhY2sgaXMgbm90IGVtcHR5IGFuZCBpdHMgdG9w
IGVsZW1lbnQKKyAgICAgICAgLy8gaXMgbm90IGFuIGFuY2VzdG9yIG9mIHRoZSBjb250ZXh0IG9i
amVjdC4gKE5PVEU6IElnbm9yZSB0aGlzIHJlcXVpcmVtZW50IGlmIHRoZSByZXF1ZXN0IHdhcwor
ICAgICAgICAvLyBtYWRlIHZpYSB0aGUgbGVnYWN5IE1vemlsbGEtc3R5bGUgQVBJLikKKyAgICAg
ICAgaWYgKCFtX2Z1bGxTY3JlZW5FbGVtZW50U3RhY2suaXNFbXB0eSgpICYmICFtX2Z1bGxTY3Jl
ZW5FbGVtZW50U3RhY2suZmlyc3QoKS0+Y29udGFpbnMoZWxlbWVudCkgJiYgIWluTGVnYWN5TW96
aWxsYU1vZGUpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvLyBBIGRlc2NlbmRhbnQg
YnJvd3NpbmcgY29udGV4dCdzIGRvY3VtZW50IGhhcyBhIG5vbi1lbXB0eSBmdWxsc2NyZWVuIGVs
ZW1lbnQgc3RhY2suCisgICAgICAgIGJvb2wgZGVzY2VuZGVudEhhc05vbkVtcHR5U3RhY2sgPSBm
YWxzZTsKKyAgICAgICAgZm9yIChGcmFtZSogZGVzY2VuZGFudCA9IGZyYW1lKCkgPyBmcmFtZSgp
LT50cmVlKCktPnRyYXZlcnNlTmV4dCgpIDogMDsgZGVzY2VuZGFudDsgZGVzY2VuZGFudCA9IGRl
c2NlbmRhbnQtPnRyZWUoKS0+dHJhdmVyc2VOZXh0KCkpIHsKKyAgICAgICAgICAgIGlmIChkZXNj
ZW5kYW50LT5kb2N1bWVudCgpLT53ZWJraXRGdWxsc2NyZWVuRWxlbWVudCgpKSB7CisgICAgICAg
ICAgICAgICAgZGVzY2VuZGVudEhhc05vbkVtcHR5U3RhY2sgPSB0cnVlOworICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChkZXNjZW5k
ZW50SGFzTm9uRW1wdHlTdGFjayAmJiAhaW5MZWdhY3lNb3ppbGxhTW9kZSkKKyAgICAgICAgICAg
IGJyZWFrOworCisgICAgICAgIC8vIFRoaXMgYWxnb3JpdGhtIGlzIG5vdCBhbGxvd2VkIHRvIHNo
b3cgYSBwb3AtdXA6CisgICAgICAgIC8vICAgQW4gYWxnb3JpdGhtIGlzIGFsbG93ZWQgdG8gc2hv
dyBhIHBvcC11cCBpZiwgaW4gdGhlIHRhc2sgaW4gd2hpY2ggdGhlIGFsZ29yaXRobSBpcyBydW5u
aW5nLCBlaXRoZXI6CisgICAgICAgIC8vICAgLSBhbiBhY3RpdmF0aW9uIGJlaGF2aW9yIGlzIGN1
cnJlbnRseSBiZWluZyBwcm9jZXNzZWQgd2hvc2UgY2xpY2sgZXZlbnQgd2FzIHRydXN0ZWQsIG9y
CisgICAgICAgIC8vICAgLSB0aGUgZXZlbnQgbGlzdGVuZXIgZm9yIGEgdHJ1c3RlZCBjbGljayBl
dmVudCBpcyBiZWluZyBoYW5kbGVkLgorICAgICAgICBpZiAoIVNjcmlwdENvbnRyb2xsZXI6OnBy
b2Nlc3NpbmdVc2VyR2VzdHVyZSgpKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLy8g
VGhlcmUgaXMgYSBwcmV2aW91c2x5LWVzdGFibGlzaGVkIHVzZXIgcHJlZmVyZW5jZSwgc2VjdXJp
dHkgcmlzaywgb3IgcGxhdGZvcm0gbGltaXRhdGlvbi4KKyAgICAgICAgaWYgKCFwYWdlKCkgfHwg
IXBhZ2UoKS0+c2V0dGluZ3MoKS0+ZnVsbFNjcmVlbkVuYWJsZWQoKSkKKyAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICAKKyAgICAgICAgaWYgKCFwYWdlKCktPmNocm9tZSgpLT5jbGllbnQoKS0+
c3VwcG9ydHNGdWxsU2NyZWVuRm9yRWxlbWVudChlbGVtZW50LCBmbGFncyAmIEVsZW1lbnQ6OkFM
TE9XX0tFWUJPQVJEX0lOUFVUKSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8vIDIu
IExldCBkb2MgYmUgZWxlbWVudCdzIG5vZGUgZG9jdW1lbnQuIChpLmUuICJ0aGlzIikKKyAgICAg
ICAgRG9jdW1lbnQqIGN1cnJlbnREb2MgPSB0aGlzOworCisgICAgICAgIC8vIDMuIExldCBkb2Nz
IGJlIGFsbCBkb2MncyBhbmNlc3RvciBicm93c2luZyBjb250ZXh0J3MgZG9jdW1lbnRzIChpZiBh
bnkpIGFuZCBkb2MuCisgICAgICAgIERlcXVlPERvY3VtZW50Kj4gZG9jczsKKworICAgICAgICBk
byB7CisgICAgICAgICAgICBkb2NzLnByZXBlbmQoY3VycmVudERvYyk7CisgICAgICAgICAgICBj
dXJyZW50RG9jID0gY3VycmVudERvYy0+b3duZXJFbGVtZW50KCkgPyBjdXJyZW50RG9jLT5vd25l
ckVsZW1lbnQoKS0+ZG9jdW1lbnQoKSA6IDA7CisgICAgICAgIH0gd2hpbGUgKGN1cnJlbnREb2Mp
OworCisgICAgICAgIC8vIDQuIEZvciBlYWNoIGRvY3VtZW50IGluIGRvY3MsIHJ1biB0aGVzZSBz
dWJzdGVwczoKKyAgICAgICAgRGVxdWU8RG9jdW1lbnQqPjo6aXRlcmF0b3IgY3VycmVudCA9IGRv
Y3MuYmVnaW4oKSwgZm9sbG93aW5nID0gZG9jcy5iZWdpbigpOworCisgICAgICAgIGRvIHsKKyAg
ICAgICAgICAgICsrZm9sbG93aW5nOworCisgICAgICAgICAgICAvLyAxLiBMZXQgZm9sbG93aW5n
IGRvY3VtZW50IGJlIHRoZSBkb2N1bWVudCBhZnRlciBkb2N1bWVudCBpbiBkb2NzLCBvciBudWxs
IGlmIHRoZXJlIGlzIG5vCisgICAgICAgICAgICAvLyBzdWNoIGRvY3VtZW50LgorICAgICAgICAg
ICAgRG9jdW1lbnQqIGN1cnJlbnREb2MgPSAqY3VycmVudDsKKyAgICAgICAgICAgIERvY3VtZW50
KiBmb2xsb3dpbmdEb2MgPSBmb2xsb3dpbmcgIT0gZG9jcy5lbmQoKSA/ICpmb2xsb3dpbmcgOiAw
OworCisgICAgICAgICAgICAvLyAyLiBJZiBmb2xsb3dpbmcgZG9jdW1lbnQgaXMgbnVsbCwgcHVz
aCBjb250ZXh0IG9iamVjdCBvbiBkb2N1bWVudCdzIGZ1bGxzY3JlZW4gZWxlbWVudAorICAgICAg
ICAgICAgLy8gc3RhY2ssIGFuZCBxdWV1ZSBhIHRhc2sgdG8gZmlyZSBhbiBldmVudCBuYW1lZCBm
dWxsc2NyZWVuY2hhbmdlIHdpdGggaXRzIGJ1YmJsZXMgYXR0cmlidXRlCisgICAgICAgICAgICAv
LyBzZXQgdG8gdHJ1ZSBvbiB0aGUgZG9jdW1lbnQuCisgICAgICAgICAgICBpZiAoIWZvbGxvd2lu
Z0RvYykgeworICAgICAgICAgICAgICAgIGN1cnJlbnREb2MtPnB1c2hGdWxsc2NyZWVuRWxlbWVu
dFN0YWNrKGVsZW1lbnQpOworICAgICAgICAgICAgICAgIGFkZERvY3VtZW50VG9GdWxsU2NyZWVu
Q2hhbmdlRXZlbnRRdWV1ZShjdXJyZW50RG9jKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gMy4gT3RoZXJ3aXNlLCBpZiBkb2N1bWVu
dCdzIGZ1bGxzY3JlZW4gZWxlbWVudCBzdGFjayBpcyBlaXRoZXIgZW1wdHkgb3IgaXRzIHRvcCBl
bGVtZW50CisgICAgICAgICAgICAvLyBpcyBub3QgZm9sbG93aW5nIGRvY3VtZW50J3MgYnJvd3Np
bmcgY29udGV4dCBjb250YWluZXIsCisgICAgICAgICAgICBFbGVtZW50KiB0b3BFbGVtZW50ID0g
Y3VycmVudERvYy0+d2Via2l0RnVsbHNjcmVlbkVsZW1lbnQoKTsKKyAgICAgICAgICAgIGlmICgh
dG9wRWxlbWVudCB8fCB0b3BFbGVtZW50ICE9IGZvbGxvd2luZ0RvYy0+b3duZXJFbGVtZW50KCkp
IHsKKyAgICAgICAgICAgICAgICAvLyAuLi5wdXNoIGZvbGxvd2luZyBkb2N1bWVudCdzIGJyb3dz
aW5nIGNvbnRleHQgY29udGFpbmVyIG9uIGRvY3VtZW50J3MgZnVsbHNjcmVlbiBlbGVtZW50Cisg
ICAgICAgICAgICAgICAgLy8gc3RhY2ssIGFuZCBxdWV1ZSBhIHRhc2sgdG8gZmlyZSBhbiBldmVu
dCBuYW1lZCBmdWxsc2NyZWVuY2hhbmdlIHdpdGggaXRzIGJ1YmJsZXMgYXR0cmlidXRlCisgICAg
ICAgICAgICAgICAgLy8gc2V0IHRvIHRydWUgb24gZG9jdW1lbnQuCisgICAgICAgICAgICAgICAg
Y3VycmVudERvYy0+cHVzaEZ1bGxzY3JlZW5FbGVtZW50U3RhY2soZm9sbG93aW5nRG9jLT5vd25l
ckVsZW1lbnQoKSk7CisgICAgICAgICAgICAgICAgYWRkRG9jdW1lbnRUb0Z1bGxTY3JlZW5DaGFu
Z2VFdmVudFF1ZXVlKGN1cnJlbnREb2MpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICAvLyA0LiBPdGhlcndpc2UsIGRvIG5vdGhpbmcgZm9y
IHRoaXMgZG9jdW1lbnQuIEl0IHN0YXlzIHRoZSBzYW1lLgorICAgICAgICB9IHdoaWxlICgrK2N1
cnJlbnQgIT0gZG9jcy5lbmQoKSk7CisKKyAgICAgICAgLy8gNS4gUmV0dXJuLCBhbmQgcnVuIHRo
ZSByZW1haW5pbmcgc3RlcHMgYXN5bmNocm9ub3VzbHkuCisgICAgICAgIC8vIDYuIE9wdGlvbmFs
bHksIHBlcmZvcm0gc29tZSBhbmltYXRpb24uCisgICAgICAgIG1fYXJlS2V5c0VuYWJsZWRJbkZ1
bGxTY3JlZW4gPSBmbGFncyAmIEVsZW1lbnQ6OkFMTE9XX0tFWUJPQVJEX0lOUFVUOworICAgICAg
ICBwYWdlKCktPmNocm9tZSgpLT5jbGllbnQoKS0+ZW50ZXJGdWxsU2NyZWVuRm9yRWxlbWVudChl
bGVtZW50KTsKKworICAgICAgICAvLyA3LiBPcHRpb25hbGx5LCBkaXNwbGF5IGEgbWVzc2FnZSBp
bmRpY2F0aW5nIGhvdyB0aGUgdXNlciBjYW4gZXhpdCBkaXNwbGF5aW5nIHRoZSBjb250ZXh0IG9i
amVjdCBmdWxsc2NyZWVuLgorICAgICAgICByZXR1cm47CisgICAgfSB3aGlsZSAoMCk7CisKKyAg
ICBtX2Z1bGxTY3JlZW5FcnJvckV2ZW50VGFyZ2V0UXVldWUuYXBwZW5kKGVsZW1lbnQgPyBlbGVt
ZW50IDogZG9jdW1lbnRFbGVtZW50KCkpOworICAgIG1fZnVsbFNjcmVlbkNoYW5nZURlbGF5VGlt
ZXIuc3RhcnRPbmVTaG90KDApOworfQorCit2b2lkIERvY3VtZW50Ojp3ZWJraXRDYW5jZWxGdWxs
U2NyZWVuKCkKK3sKKyAgICAvLyBUaGUgTW96aWxsYSAiY2FuY2VsRnVsbFNjcmVlbigpIiBBUEkg
YmVoYXZlcyBsaWtlIHRoZSBXM0MgImZ1bGx5IGV4aXQgZnVsbHNjcmVlbiIgYmVoYXZpb3IsIHdo
aWNoCisgICAgLy8gaXMgZGVmaW5lZCBhczogCisgICAgLy8gIlRvIGZ1bGx5IGV4aXQgZnVsbHNj
cmVlbiBhY3QgYXMgaWYgdGhlIGV4aXRGdWxsc2NyZWVuKCkgbWV0aG9kIHdhcyBpbnZva2VkIG9u
IHRoZSB0b3AtbGV2ZWwgYnJvd3NpbmcKKyAgICAvLyBjb250ZXh0J3MgZG9jdW1lbnQgYW5kIHN1
YnNlcXVlbnRseSBlbXB0eSB0aGF0IGRvY3VtZW50J3MgZnVsbHNjcmVlbiBlbGVtZW50IHN0YWNr
LiIKKyAgICBpZiAoIXRvcERvY3VtZW50KCktPndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50KCkpCisg
ICAgICAgIHJldHVybjsKKworICAgIC8vIFRvIGFjaGlldmUgdGhhdCBhaW0sIHJlbW92ZSBhbGwg
dGhlIGVsZW1lbnRzIGZyb20gdGhlIHRvcCBkb2N1bWVudCdzIHN0YWNrIGV4Y2VwdCBmb3IgdGhl
IGZpcnN0IGJlZm9yZQorICAgIC8vIGNhbGxpbmcgd2Via2l0RXhpdEZ1bGxzY3JlZW4oKToKKyAg
ICBEZXF1ZTxSZWZQdHI8RWxlbWVudD4gPiByZXBsYWNlbWVudEZ1bGxzY3JlZW5FbGVtZW50U3Rh
Y2s7CisgICAgcmVwbGFjZW1lbnRGdWxsc2NyZWVuRWxlbWVudFN0YWNrLnByZXBlbmQodG9wRG9j
dW1lbnQoKS0+d2Via2l0RnVsbHNjcmVlbkVsZW1lbnQoKSk7CisgICAgdG9wRG9jdW1lbnQoKS0+
bV9mdWxsU2NyZWVuRWxlbWVudFN0YWNrLnN3YXAocmVwbGFjZW1lbnRGdWxsc2NyZWVuRWxlbWVu
dFN0YWNrKTsKKworICAgIHRvcERvY3VtZW50KCktPndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7Cit9
CisKK3ZvaWQgRG9jdW1lbnQ6OndlYmtpdEV4aXRGdWxsc2NyZWVuKCkKK3sKKyAgICAvLyBUaGUg
ZXhpdEZ1bGxzY3JlZW4oKSBtZXRob2QgbXVzdCBydW4gdGhlc2Ugc3RlcHM6CisgICAgCisgICAg
Ly8gMS4gTGV0IGRvYyBiZSB0aGUgY29udGV4dCBvYmplY3QuIChpLmUuICJ0aGlzIikKKyAgICBE
b2N1bWVudCogY3VycmVudERvYyA9IHRoaXM7CisKKyAgICAvLyAyLiBJZiBkb2MncyBmdWxsc2Ny
ZWVuIGVsZW1lbnQgc3RhY2sgaXMgZW1wdHksIHRlcm1pbmF0ZSB0aGVzZSBzdGVwcy4KKyAgICBp
ZiAobV9mdWxsU2NyZWVuRWxlbWVudFN0YWNrLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOwor
ICAgIAorICAgIC8vIDMuIExldCBkZXNjZW5kYW50cyBiZSBhbGwgdGhlIGRvYydzIGRlc2NlbmRh
bnQgYnJvd3NpbmcgY29udGV4dCdzIGRvY3VtZW50cyB3aXRoIGEgbm9uLWVtcHR5IGZ1bGxzY3Jl
ZW4KKyAgICAvLyBlbGVtZW50IHN0YWNrIChpZiBhbnkpLCBvcmRlcmVkIHNvIHRoYXQgdGhlIGNo
aWxkIG9mIHRoZSBkb2MgaXMgbGFzdCBhbmQgdGhlIGRvY3VtZW50IGZ1cnRoZXN0CisgICAgLy8g
YXdheSBmcm9tIHRoZSBkb2MgaXMgZmlyc3QuCisgICAgRGVxdWU8UmVmUHRyPERvY3VtZW50PiA+
IGRlc2NlbmRhbnRzOworICAgIGZvciAoRnJhbWUqIGRlc2NlbmRhbnQgPSBmcmFtZSgpID8gZnJh
bWUoKS0+dHJlZSgpLT50cmF2ZXJzZU5leHQoKSA6IDA7IGRlc2NlbmRhbnQ7IGRlc2NlbmRhbnQg
PSBkZXNjZW5kYW50LT50cmVlKCktPnRyYXZlcnNlTmV4dCgpKSB7CisgICAgICAgIGlmIChkZXNj
ZW5kYW50LT5kb2N1bWVudCgpLT53ZWJraXRGdWxsc2NyZWVuRWxlbWVudCgpKQorICAgICAgICAg
ICAgZGVzY2VuZGFudHMucHJlcGVuZChkZXNjZW5kYW50LT5kb2N1bWVudCgpKTsKKyAgICB9Cisg
ICAgICAgIAorICAgIC8vIDQuIEZvciBlYWNoIGRlc2NlbmRhbnQgaW4gZGVzY2VuZGFudHMsIGVt
cHR5IGRlc2NlbmRhbnQncyBmdWxsc2NyZWVuIGVsZW1lbnQgc3RhY2ssIGFuZCBxdWV1ZSBhCisg
ICAgLy8gdGFzayB0byBmaXJlIGFuIGV2ZW50IG5hbWVkIGZ1bGxzY3JlZW5jaGFuZ2Ugd2l0aCBp
dHMgYnViYmxlcyBhdHRyaWJ1dGUgc2V0IHRvIHRydWUgb24gZGVzY2VuZGFudC4KKyAgICBmb3Ig
KERlcXVlPFJlZlB0cjxEb2N1bWVudD4gPjo6aXRlcmF0b3IgaSA9IGRlc2NlbmRhbnRzLmJlZ2lu
KCk7IGkgIT0gZGVzY2VuZGFudHMuZW5kKCk7ICsraSkgeworICAgICAgICAoKmkpLT5jbGVhckZ1
bGxzY3JlZW5FbGVtZW50U3RhY2soKTsKKyAgICAgICAgYWRkRG9jdW1lbnRUb0Z1bGxTY3JlZW5D
aGFuZ2VFdmVudFF1ZXVlKGktPmdldCgpKTsKKyAgICB9CisKKyAgICAvLyA1LiBXaGlsZSBkb2Mg
aXMgbm90IG51bGwsIHJ1biB0aGVzZSBzdWJzdGVwczoKKyAgICBFbGVtZW50KiBuZXdUb3AgPSAw
OworICAgIHdoaWxlIChjdXJyZW50RG9jKSB7CisgICAgICAgIC8vIDEuIFBvcCB0aGUgdG9wIGVs
ZW1lbnQgb2YgZG9jJ3MgZnVsbHNjcmVlbiBlbGVtZW50IHN0YWNrLgorICAgICAgICBjdXJyZW50
RG9jLT5wb3BGdWxsc2NyZWVuRWxlbWVudFN0YWNrKCk7CisKKyAgICAgICAgLy8gICAgSWYgZG9j
J3MgZnVsbHNjcmVlbiBlbGVtZW50IHN0YWNrIGlzIG5vbi1lbXB0eSBhbmQgdGhlIGVsZW1lbnQg
bm93IGF0IHRoZSB0b3AgaXMgZWl0aGVyCisgICAgICAgIC8vICAgIG5vdCBpbiBhIGRvY3VtZW50
IG9yIGl0cyBub2RlIGRvY3VtZW50IGlzIG5vdCBkb2MsIHJlcGVhdCB0aGlzIHN1YnN0ZXAuCisg
ICAgICAgIG5ld1RvcCA9IGN1cnJlbnREb2MtPndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50KCk7Cisg
ICAgICAgIGlmIChuZXdUb3AgJiYgKCFuZXdUb3AtPmluRG9jdW1lbnQoKSB8fCBuZXdUb3AtPmRv
Y3VtZW50KCkgIT0gY3VycmVudERvYykpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAg
ICAvLyAyLiBRdWV1ZSBhIHRhc2sgdG8gZmlyZSBhbiBldmVudCBuYW1lZCBmdWxsc2NyZWVuY2hh
bmdlIHdpdGggaXRzIGJ1YmJsZXMgYXR0cmlidXRlIHNldCB0byB0cnVlCisgICAgICAgIC8vIG9u
IGRvYy4KKyAgICAgICAgYWRkRG9jdW1lbnRUb0Z1bGxTY3JlZW5DaGFuZ2VFdmVudFF1ZXVlKGN1
cnJlbnREb2MpOworCisgICAgICAgIC8vIDMuIElmIGRvYydzIGZ1bGxzY3JlZW4gZWxlbWVudCBz
dGFjayBpcyBlbXB0eSBhbmQgZG9jJ3MgYnJvd3NpbmcgY29udGV4dCBoYXMgYSBicm93c2luZyBj
b250ZXh0CisgICAgICAgIC8vIGNvbnRhaW5lciwgc2V0IGRvYyB0byB0aGF0IGJyb3dzaW5nIGNv
bnRleHQgY29udGFpbmVyJ3Mgbm9kZSBkb2N1bWVudC4KKyAgICAgICAgaWYgKCFuZXdUb3AgJiYg
Y3VycmVudERvYy0+b3duZXJFbGVtZW50KCkpIHsKKyAgICAgICAgICAgIGN1cnJlbnREb2MgPSBj
dXJyZW50RG9jLT5vd25lckVsZW1lbnQoKS0+ZG9jdW1lbnQoKTsKKyAgICAgICAgICAgIGNvbnRp
bnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gNC4gT3RoZXJ3aXNlLCBzZXQgZG9jIHRvIG51
bGwuCisgICAgICAgIGN1cnJlbnREb2MgPSAwOworICAgIH0KKworICAgIC8vIDYuIFJldHVybiwg
YW5kIHJ1biB0aGUgcmVtYWluaW5nIHN0ZXBzIGFzeW5jaHJvbm91c2x5LgorICAgIC8vIDcuIE9w
dGlvbmFsbHksIHBlcmZvcm0gc29tZSBhbmltYXRpb24uCisKKyAgICAvLyBPbmx5IGV4aXQgb3V0
IG9mIGZ1bGwgc2NyZWVuIHdpbmRvdyBtb2RlIGlmIHRoZXJlIGFyZSBubyByZW1haW5pbmcgZWxl
bWVudHMgaW4gdGhlIAorICAgIC8vIGZ1bGwgc2NyZWVuIHN0YWNrLgorICAgIGlmICghbmV3VG9w
KSB7CisgICAgICAgIHBhZ2UoKS0+Y2hyb21lKCktPmNsaWVudCgpLT5leGl0RnVsbFNjcmVlbkZv
ckVsZW1lbnQobV9mdWxsU2NyZWVuRWxlbWVudC5nZXQoKSk7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisKKyAgICAvLyBPdGhlcndpc2UsIG5vdGlmeSB0aGUgY2hyb21lIG9mIHRoZSBuZXcgZnVs
bCBzY3JlZW4gZWxlbWVudC4KKyAgICBwYWdlKCktPmNocm9tZSgpLT5jbGllbnQoKS0+ZW50ZXJG
dWxsU2NyZWVuRm9yRWxlbWVudChuZXdUb3ApOyAgICAgIAorfQorCitib29sIERvY3VtZW50Ojp3
ZWJraXRGdWxsc2NyZWVuRW5hYmxlZCgpIGNvbnN0Cit7CisgICAgLy8gNC4gVGhlIGZ1bGxzY3Jl
ZW5FbmFibGVkIGF0dHJpYnV0ZSBtdXN0IHJldHVybiB0cnVlIGlmIHRoZSBjb250ZXh0IG9iamVj
dCBhbmQgYWxsIGFuY2VzdG9yCisgICAgLy8gYnJvd3NpbmcgY29udGV4dCdzIGRvY3VtZW50cyBo
YXZlIHRoZWlyIGZ1bGxzY3JlZW4gZW5hYmxlZCBmbGFnIHNldCwgb3IgZmFsc2Ugb3RoZXJ3aXNl
LgorCisgICAgLy8gVG9wLWxldmVsIGJyb3dzaW5nIGNvbnRleHRzIGFyZSBpbXBsaWVkIHRvIGhh
dmUgdGhlaXIgYWxsb3dGdWxsU2NyZWVuIGF0dHJpYnV0ZSBzZXQuCisgICAgcmV0dXJuIGlzQXR0
cmlidXRlT25BbGxPd25lcnMod2Via2l0YWxsb3dmdWxsc2NyZWVuQXR0ciwgb3duZXJFbGVtZW50
KCkpOworfQorCit2b2lkIERvY3VtZW50Ojp3ZWJraXRXaWxsRW50ZXJGdWxsU2NyZWVuRm9yRWxl
bWVudChFbGVtZW50KiBlbGVtZW50KQoreworICAgIGlmICghYXR0YWNoZWQoKSB8fCBpblBhZ2VD
YWNoZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBBU1NFUlQoZWxlbWVudCk7CisKKyAgICAv
LyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgY2FsbGVkIGFmdGVyIHRoZSBkb2N1bWVudCBoYXMgYmVl
biByZW1vdmVkIGZyb20gdGhlIHBhZ2UuCisgICAgaWYgKCFwYWdlKCkpCisgICAgICAgIHJldHVy
bjsKKworICAgIEFTU0VSVChwYWdlKCktPnNldHRpbmdzKCktPmZ1bGxTY3JlZW5FbmFibGVkKCkp
OworCisgICAgaWYgKG1fZnVsbFNjcmVlblJlbmRlcmVyKQorICAgICAgICBtX2Z1bGxTY3JlZW5S
ZW5kZXJlci0+dW53cmFwUmVuZGVyZXIoKTsKKworICAgIG1fZnVsbFNjcmVlbkVsZW1lbnQgPSBl
bGVtZW50OworCisjaWYgVVNFKE5BVElWRV9GVUxMU0NSRUVOX1ZJREVPKQorICAgIGlmIChlbGVt
ZW50ICYmIGVsZW1lbnQtPmlzTWVkaWFFbGVtZW50KCkpCisgICAgICAgIHJldHVybjsKKyNlbmRp
ZgorCisgICAgLy8gQ3JlYXRlIGEgcGxhY2Vob2xkZXIgYmxvY2sgZm9yIGEgdGhlIGZ1bGwtc2Ny
ZWVuIGVsZW1lbnQsIHRvIGtlZXAgdGhlIHBhZ2UgZnJvbSByZWZsb3dpbmcKKyAgICAvLyB3aGVu
IHRoZSBlbGVtZW50IGlzIHJlbW92ZWQgZnJvbSB0aGUgbm9ybWFsIGZsb3cuICBPbmx5IGRvIHRo
aXMgZm9yIGEgUmVuZGVyQm94LCBhcyBvbmx5IAorICAgIC8vIGEgYm94IHdpbGwgaGF2ZSBhIGZy
YW1lUmVjdC4gIFRoZSBwbGFjZWhvbGRlciB3aWxsIGJlIGNyZWF0ZWQgaW4gc2V0RnVsbFNjcmVl
blJlbmRlcmVyKCkKKyAgICAvLyBkdXJpbmcgbGF5b3V0LgorICAgIFJlbmRlck9iamVjdCogcmVu
ZGVyZXIgPSBtX2Z1bGxTY3JlZW5FbGVtZW50LT5yZW5kZXJlcigpOworICAgIGJvb2wgc2hvdWxk
Q3JlYXRlUGxhY2Vob2xkZXIgPSByZW5kZXJlciAmJiByZW5kZXJlci0+aXNCb3goKTsKKyAgICBp
ZiAoc2hvdWxkQ3JlYXRlUGxhY2Vob2xkZXIpIHsKKyAgICAgICAgbV9zYXZlZFBsYWNlaG9sZGVy
RnJhbWVSZWN0ID0gdG9SZW5kZXJCb3gocmVuZGVyZXIpLT5mcmFtZVJlY3QoKTsKKyAgICAgICAg
bV9zYXZlZFBsYWNlaG9sZGVyUmVuZGVyU3R5bGUgPSBSZW5kZXJTdHlsZTo6Y2xvbmUocmVuZGVy
ZXItPnN0eWxlKCkpOworICAgIH0KKworICAgIGlmIChtX2Z1bGxTY3JlZW5FbGVtZW50ICE9IGRv
Y3VtZW50RWxlbWVudCgpKQorICAgICAgICBSZW5kZXJGdWxsU2NyZWVuOjp3cmFwUmVuZGVyZXIo
cmVuZGVyZXIsIHJlbmRlcmVyID8gcmVuZGVyZXItPnBhcmVudCgpIDogMCwgdGhpcyk7CisKKyAg
ICBtX2Z1bGxTY3JlZW5FbGVtZW50LT5zZXRDb250YWluc0Z1bGxTY3JlZW5FbGVtZW50T25BbmNl
c3RvcnNDcm9zc2luZ0ZyYW1lQm91bmRhcmllcyh0cnVlKTsKKyAgICAKKyAgICByZWNhbGNTdHls
ZShGb3JjZSk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OndlYmtpdERpZEVudGVyRnVsbFNjcmVlbkZv
ckVsZW1lbnQoRWxlbWVudCopCit7CisgICAgaWYgKCFtX2Z1bGxTY3JlZW5FbGVtZW50KQorICAg
ICAgICByZXR1cm47CisKKyAgICBpZiAoIWF0dGFjaGVkKCkgfHwgaW5QYWdlQ2FjaGUoKSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgbV9mdWxsU2NyZWVuRWxlbWVudC0+ZGlkQmVjb21lRnVsbHNj
cmVlbkVsZW1lbnQoKTsKKworICAgIG1fZnVsbFNjcmVlbkNoYW5nZURlbGF5VGltZXIuc3RhcnRP
bmVTaG90KDApOworfQorCit2b2lkIERvY3VtZW50Ojp3ZWJraXRXaWxsRXhpdEZ1bGxTY3JlZW5G
b3JFbGVtZW50KEVsZW1lbnQqKQoreworICAgIGlmICghbV9mdWxsU2NyZWVuRWxlbWVudCkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgaWYgKCFhdHRhY2hlZCgpIHx8IGluUGFnZUNhY2hlKCkpCisg
ICAgICAgIHJldHVybjsKKworICAgIG1fZnVsbFNjcmVlbkVsZW1lbnQtPndpbGxTdG9wQmVpbmdG
dWxsc2NyZWVuRWxlbWVudCgpOworfQorCit2b2lkIERvY3VtZW50Ojp3ZWJraXREaWRFeGl0RnVs
bFNjcmVlbkZvckVsZW1lbnQoRWxlbWVudCopCit7CisgICAgaWYgKCFtX2Z1bGxTY3JlZW5FbGVt
ZW50KQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIWF0dGFjaGVkKCkgfHwgaW5QYWdlQ2Fj
aGUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9mdWxsU2NyZWVuRWxlbWVudC0+c2V0Q29u
dGFpbnNGdWxsU2NyZWVuRWxlbWVudE9uQW5jZXN0b3JzQ3Jvc3NpbmdGcmFtZUJvdW5kYXJpZXMo
ZmFsc2UpOworCisgICAgbV9hcmVLZXlzRW5hYmxlZEluRnVsbFNjcmVlbiA9IGZhbHNlOworICAg
IAorICAgIGlmIChtX2Z1bGxTY3JlZW5SZW5kZXJlcikKKyAgICAgICAgbV9mdWxsU2NyZWVuUmVu
ZGVyZXItPnVud3JhcFJlbmRlcmVyKCk7CisKKyAgICBtX2Z1bGxTY3JlZW5FbGVtZW50ID0gMDsK
KyAgICBzY2hlZHVsZUZvcmNlZFN0eWxlUmVjYWxjKCk7CisgICAgCisgICAgLy8gV2hlbiB3ZWJr
aXRDYW5jZWxGdWxsU2NyZWVuIGlzIGNhbGxlZCwgd2UgY2FsbCB3ZWJraXRFeGl0RnVsbFNjcmVl
biBvbiB0aGUgdG9wRG9jdW1lbnQoKS4gVGhhdAorICAgIC8vIG1lYW5zIHRoYXQgdGhlIGV2ZW50
cyB3aWxsIGJlIHF1ZXVlZCB0aGVyZS4gU28gaWYgd2UgaGF2ZSBubyBldmVudHMgaGVyZSwgc3Rh
cnQgdGhlIHRpbWVyIG9uCisgICAgLy8gdGhlIGV4aXRpbmcgZG9jdW1lbnQuCisgICAgRG9jdW1l
bnQqIGV4aXRpbmdEb2N1bWVudCA9IHRoaXM7CisgICAgaWYgKG1fZnVsbFNjcmVlbkNoYW5nZUV2
ZW50VGFyZ2V0UXVldWUuaXNFbXB0eSgpICYmIG1fZnVsbFNjcmVlbkVycm9yRXZlbnRUYXJnZXRR
dWV1ZS5pc0VtcHR5KCkpCisgICAgICAgIGV4aXRpbmdEb2N1bWVudCA9IHRvcERvY3VtZW50KCk7
CisgICAgZXhpdGluZ0RvY3VtZW50LT5tX2Z1bGxTY3JlZW5DaGFuZ2VEZWxheVRpbWVyLnN0YXJ0
T25lU2hvdCgwKTsKK30KKyAgICAKK3ZvaWQgRG9jdW1lbnQ6OnNldEZ1bGxTY3JlZW5SZW5kZXJl
cihSZW5kZXJGdWxsU2NyZWVuKiByZW5kZXJlcikKK3sKKyAgICBpZiAocmVuZGVyZXIgPT0gbV9m
dWxsU2NyZWVuUmVuZGVyZXIpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChyZW5kZXJlciAm
JiBtX3NhdmVkUGxhY2Vob2xkZXJSZW5kZXJTdHlsZSkgCisgICAgICAgIHJlbmRlcmVyLT5jcmVh
dGVQbGFjZWhvbGRlcihtX3NhdmVkUGxhY2Vob2xkZXJSZW5kZXJTdHlsZS5yZWxlYXNlKCksIG1f
c2F2ZWRQbGFjZWhvbGRlckZyYW1lUmVjdCk7CisgICAgZWxzZSBpZiAocmVuZGVyZXIgJiYgbV9m
dWxsU2NyZWVuUmVuZGVyZXIgJiYgbV9mdWxsU2NyZWVuUmVuZGVyZXItPnBsYWNlaG9sZGVyKCkp
IHsKKyAgICAgICAgUmVuZGVyQmxvY2sqIHBsYWNlaG9sZGVyID0gbV9mdWxsU2NyZWVuUmVuZGVy
ZXItPnBsYWNlaG9sZGVyKCk7CisgICAgICAgIHJlbmRlcmVyLT5jcmVhdGVQbGFjZWhvbGRlcihS
ZW5kZXJTdHlsZTo6Y2xvbmUocGxhY2Vob2xkZXItPnN0eWxlKCkpLCBwbGFjZWhvbGRlci0+ZnJh
bWVSZWN0KCkpOworICAgIH0KKworICAgIGlmIChtX2Z1bGxTY3JlZW5SZW5kZXJlcikKKyAgICAg
ICAgbV9mdWxsU2NyZWVuUmVuZGVyZXItPmRlc3Ryb3koKTsKKyAgICBBU1NFUlQoIW1fZnVsbFNj
cmVlblJlbmRlcmVyKTsKKworICAgIG1fZnVsbFNjcmVlblJlbmRlcmVyID0gcmVuZGVyZXI7Cisg
ICAgCisgICAgLy8gVGhpcyBub3RpZmljYXRpb24gY2FuIGNvbWUgaW4gYWZ0ZXIgdGhlIHBhZ2Ug
aGFzIGJlZW4gZGVzdHJveWVkLgorICAgIGlmIChwYWdlKCkpCisgICAgICAgIHBhZ2UoKS0+Y2hy
b21lKCktPmNsaWVudCgpLT5mdWxsU2NyZWVuUmVuZGVyZXJDaGFuZ2VkKG1fZnVsbFNjcmVlblJl
bmRlcmVyKTsKK30KKwordm9pZCBEb2N1bWVudDo6ZnVsbFNjcmVlblJlbmRlcmVyRGVzdHJveWVk
KCkKK3sKKyAgICBtX2Z1bGxTY3JlZW5SZW5kZXJlciA9IDA7CisKKyAgICBpZiAocGFnZSgpKQor
ICAgICAgICBwYWdlKCktPmNocm9tZSgpLT5jbGllbnQoKS0+ZnVsbFNjcmVlblJlbmRlcmVyQ2hh
bmdlZCgwKTsKK30KKwordm9pZCBEb2N1bWVudDo6c2V0RnVsbFNjcmVlblJlbmRlcmVyU2l6ZShj
b25zdCBJbnRTaXplJiBzaXplKQoreworICAgIEFTU0VSVChtX2Z1bGxTY3JlZW5SZW5kZXJlcik7
CisgICAgaWYgKCFtX2Z1bGxTY3JlZW5SZW5kZXJlcikKKyAgICAgICAgcmV0dXJuOworICAgIAor
ICAgIGlmIChtX2Z1bGxTY3JlZW5SZW5kZXJlcikgeworICAgICAgICBSZWZQdHI8UmVuZGVyU3R5
bGU+IG5ld1N0eWxlID0gUmVuZGVyU3R5bGU6OmNsb25lKG1fZnVsbFNjcmVlblJlbmRlcmVyLT5z
dHlsZSgpKTsKKyAgICAgICAgbmV3U3R5bGUtPnNldFdpZHRoKExlbmd0aChzaXplLndpZHRoKCks
IFdlYkNvcmU6OkZpeGVkKSk7CisgICAgICAgIG5ld1N0eWxlLT5zZXRIZWlnaHQoTGVuZ3RoKHNp
emUuaGVpZ2h0KCksIFdlYkNvcmU6OkZpeGVkKSk7CisgICAgICAgIG5ld1N0eWxlLT5zZXRUb3Ao
TGVuZ3RoKDAsIFdlYkNvcmU6OkZpeGVkKSk7CisgICAgICAgIG5ld1N0eWxlLT5zZXRMZWZ0KExl
bmd0aCgwLCBXZWJDb3JlOjpGaXhlZCkpOworICAgICAgICBtX2Z1bGxTY3JlZW5SZW5kZXJlci0+
c2V0U3R5bGUobmV3U3R5bGUpOworICAgICAgICB1cGRhdGVMYXlvdXQoKTsKKyAgICB9Cit9Cisg
ICAgCit2b2lkIERvY3VtZW50OjpzZXRGdWxsU2NyZWVuUmVuZGVyZXJCYWNrZ3JvdW5kQ29sb3Io
Q29sb3IgYmFja2dyb3VuZENvbG9yKQoreworICAgIGlmICghbV9mdWxsU2NyZWVuUmVuZGVyZXIp
CisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IG5ld1N0eWxl
ID0gUmVuZGVyU3R5bGU6OmNsb25lKG1fZnVsbFNjcmVlblJlbmRlcmVyLT5zdHlsZSgpKTsKKyAg
ICBuZXdTdHlsZS0+c2V0QmFja2dyb3VuZENvbG9yKGJhY2tncm91bmRDb2xvcik7CisgICAgbV9m
dWxsU2NyZWVuUmVuZGVyZXItPnNldFN0eWxlKG5ld1N0eWxlKTsKK30KKyAgICAKK3ZvaWQgRG9j
dW1lbnQ6OmZ1bGxTY3JlZW5DaGFuZ2VEZWxheVRpbWVyRmlyZWQoVGltZXI8RG9jdW1lbnQ+KikK
K3sKKyAgICAvLyBTaW5jZSB3ZSBkaXNwYXRjaCBldmVudHMgaW4gdGhpcyBmdW5jdGlvbiwgaXQn
cyBwb3NzaWJsZSB0aGF0IHRoZQorICAgIC8vIGRvY3VtZW50IHdpbGwgYmUgZGV0YWNoZWQgYW5k
IEdDJ2QuIFdlIHByb3RlY3QgaXQgaGVyZSB0byBtYWtlIHN1cmUgd2UKKyAgICAvLyBjYW4gZmlu
aXNoIHRoZSBmdW5jdGlvbiBzdWNjZXNzZnVsbHkuCisgICAgUmVmUHRyPERvY3VtZW50PiBwcm90
ZWN0RG9jdW1lbnQodGhpcyk7CisgICAgRGVxdWU8UmVmUHRyPE5vZGU+ID4gY2hhbmdlUXVldWU7
CisgICAgbV9mdWxsU2NyZWVuQ2hhbmdlRXZlbnRUYXJnZXRRdWV1ZS5zd2FwKGNoYW5nZVF1ZXVl
KTsKKworICAgIHdoaWxlICghY2hhbmdlUXVldWUuaXNFbXB0eSgpKSB7CisgICAgICAgIFJlZlB0
cjxOb2RlPiBub2RlID0gY2hhbmdlUXVldWUudGFrZUZpcnN0KCk7CisgICAgICAgIGlmICghbm9k
ZSkKKyAgICAgICAgICAgIG5vZGUgPSBkb2N1bWVudEVsZW1lbnQoKTsKKyAgICAgICAgLy8gVGhl
IGRpc3BhdGNoRXZlbnQgYmVsb3cgbWF5IGhhdmUgYmxvd24gYXdheSBvdXIgZG9jdW1lbnRFbGVt
ZW50LgorICAgICAgICBpZiAoIW5vZGUpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAg
ICAvLyBJZiB0aGUgZWxlbWVudCB3YXMgcmVtb3ZlZCBmcm9tIG91ciB0cmVlLCBhbHNvIG1lc3Nh
Z2UgdGhlIGRvY3VtZW50RWxlbWVudC4gU2luY2Ugd2UgbWF5CisgICAgICAgIC8vIGhhdmUgYSBk
b2N1bWVudCBoaWVyYXJjaHksIGNoZWNrIHRoYXQgbm9kZSBpc24ndCBpbiBhbm90aGVyIGRvY3Vt
ZW50LgorICAgICAgICBpZiAoIWNvbnRhaW5zKG5vZGUuZ2V0KCkpICYmICFub2RlLT5pbkRvY3Vt
ZW50KCkpCisgICAgICAgICAgICBjaGFuZ2VRdWV1ZS5hcHBlbmQoZG9jdW1lbnRFbGVtZW50KCkp
OworICAgICAgICAKKyAgICAgICAgbm9kZS0+ZGlzcGF0Y2hFdmVudChFdmVudDo6Y3JlYXRlKGV2
ZW50TmFtZXMoKS53ZWJraXRmdWxsc2NyZWVuY2hhbmdlRXZlbnQsIHRydWUsIGZhbHNlKSk7Cisg
ICAgfQorCisgICAgRGVxdWU8UmVmUHRyPE5vZGU+ID4gZXJyb3JRdWV1ZTsKKyAgICBtX2Z1bGxT
Y3JlZW5FcnJvckV2ZW50VGFyZ2V0UXVldWUuc3dhcChlcnJvclF1ZXVlKTsKKyAgICAKKyAgICB3
aGlsZSAoIWVycm9yUXVldWUuaXNFbXB0eSgpKSB7CisgICAgICAgIFJlZlB0cjxOb2RlPiBub2Rl
ID0gZXJyb3JRdWV1ZS50YWtlRmlyc3QoKTsKKyAgICAgICAgaWYgKCFub2RlKQorICAgICAgICAg
ICAgbm9kZSA9IGRvY3VtZW50RWxlbWVudCgpOworICAgICAgICAvLyBUaGUgZGlzcGF0Y2hFdmVu
dCBiZWxvdyBtYXkgaGF2ZSBibG93biBhd2F5IG91ciBkb2N1bWVudEVsZW1lbnQuCisgICAgICAg
IGlmICghbm9kZSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAKKyAgICAgICAgLy8g
SWYgdGhlIGVsZW1lbnQgd2FzIHJlbW92ZWQgZnJvbSBvdXIgdHJlZSwgYWxzbyBtZXNzYWdlIHRo
ZSBkb2N1bWVudEVsZW1lbnQuIFNpbmNlIHdlIG1heQorICAgICAgICAvLyBoYXZlIGEgZG9jdW1l
bnQgaGllcmFyY2h5LCBjaGVjayB0aGF0IG5vZGUgaXNuJ3QgaW4gYW5vdGhlciBkb2N1bWVudC4K
KyAgICAgICAgaWYgKCFjb250YWlucyhub2RlLmdldCgpKSAmJiAhbm9kZS0+aW5Eb2N1bWVudCgp
KQorICAgICAgICAgICAgZXJyb3JRdWV1ZS5hcHBlbmQoZG9jdW1lbnRFbGVtZW50KCkpOworICAg
ICAgICAKKyAgICAgICAgbm9kZS0+ZGlzcGF0Y2hFdmVudChFdmVudDo6Y3JlYXRlKGV2ZW50TmFt
ZXMoKS53ZWJraXRmdWxsc2NyZWVuZXJyb3JFdmVudCwgdHJ1ZSwgZmFsc2UpKTsKKyAgICB9Cit9
CisKK3ZvaWQgRG9jdW1lbnQ6OmZ1bGxTY3JlZW5FbGVtZW50UmVtb3ZlZCgpCit7CisgICAgbV9m
dWxsU2NyZWVuRWxlbWVudC0+c2V0Q29udGFpbnNGdWxsU2NyZWVuRWxlbWVudE9uQW5jZXN0b3Jz
Q3Jvc3NpbmdGcmFtZUJvdW5kYXJpZXMoZmFsc2UpOworICAgIHdlYmtpdENhbmNlbEZ1bGxTY3Jl
ZW4oKTsKK30KKwordm9pZCBEb2N1bWVudDo6cmVtb3ZlRnVsbFNjcmVlbkVsZW1lbnRPZlN1YnRy
ZWUoTm9kZSogbm9kZSwgYm9vbCBhbW9uZ0NoaWxkcmVuT25seSkKK3sKKyAgICBpZiAoIW1fZnVs
bFNjcmVlbkVsZW1lbnQpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICBib29sIGVsZW1lbnRJ
blN1YnRyZWUgPSBmYWxzZTsKKyAgICBpZiAoYW1vbmdDaGlsZHJlbk9ubHkpCisgICAgICAgIGVs
ZW1lbnRJblN1YnRyZWUgPSBtX2Z1bGxTY3JlZW5FbGVtZW50LT5pc0Rlc2NlbmRhbnRPZihub2Rl
KTsKKyAgICBlbHNlCisgICAgICAgIGVsZW1lbnRJblN1YnRyZWUgPSAobV9mdWxsU2NyZWVuRWxl
bWVudCA9PSBub2RlKSB8fCBtX2Z1bGxTY3JlZW5FbGVtZW50LT5pc0Rlc2NlbmRhbnRPZihub2Rl
KTsKKyAgICAKKyAgICBpZiAoZWxlbWVudEluU3VidHJlZSkKKyAgICAgICAgZnVsbFNjcmVlbkVs
ZW1lbnRSZW1vdmVkKCk7Cit9CisKK2Jvb2wgRG9jdW1lbnQ6OmlzQW5pbWF0aW5nRnVsbFNjcmVl
bigpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1faXNBbmltYXRpbmdGdWxsU2NyZWVuOworfQorCit2
b2lkIERvY3VtZW50OjpzZXRBbmltYXRpbmdGdWxsU2NyZWVuKGJvb2wgZmxhZykKK3sKKyAgICBp
ZiAobV9pc0FuaW1hdGluZ0Z1bGxTY3JlZW4gPT0gZmxhZykKKyAgICAgICAgcmV0dXJuOworICAg
IG1faXNBbmltYXRpbmdGdWxsU2NyZWVuID0gZmxhZzsKKworICAgIGlmIChtX2Z1bGxTY3JlZW5F
bGVtZW50ICYmIG1fZnVsbFNjcmVlbkVsZW1lbnQtPmlzRGVzY2VuZGFudE9mKHRoaXMpKSB7Cisg
ICAgICAgIG1fZnVsbFNjcmVlbkVsZW1lbnQtPnNldE5lZWRzU3R5bGVSZWNhbGMoKTsKKyAgICAg
ICAgc2NoZWR1bGVGb3JjZWRTdHlsZVJlY2FsYygpOworICAgIH0KK30KKwordm9pZCBEb2N1bWVu
dDo6Y2xlYXJGdWxsc2NyZWVuRWxlbWVudFN0YWNrKCkKK3sKKyAgICBtX2Z1bGxTY3JlZW5FbGVt
ZW50U3RhY2suY2xlYXIoKTsKK30KKwordm9pZCBEb2N1bWVudDo6cG9wRnVsbHNjcmVlbkVsZW1l
bnRTdGFjaygpCit7CisgICAgaWYgKG1fZnVsbFNjcmVlbkVsZW1lbnRTdGFjay5pc0VtcHR5KCkp
CisgICAgICAgIHJldHVybjsKKworICAgIG1fZnVsbFNjcmVlbkVsZW1lbnRTdGFjay5yZW1vdmVG
aXJzdCgpOworfQorCit2b2lkIERvY3VtZW50OjpwdXNoRnVsbHNjcmVlbkVsZW1lbnRTdGFjayhF
bGVtZW50KiBlbGVtZW50KQoreworICAgIG1fZnVsbFNjcmVlbkVsZW1lbnRTdGFjay5wcmVwZW5k
KGVsZW1lbnQpOworfQorCit2b2lkIERvY3VtZW50OjphZGREb2N1bWVudFRvRnVsbFNjcmVlbkNo
YW5nZUV2ZW50UXVldWUoRG9jdW1lbnQqIGRvYykKK3sKKyAgICBBU1NFUlQoZG9jKTsKKyAgICBO
b2RlKiB0YXJnZXQgPSBkb2MtPndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50KCk7CisgICAgaWYgKCF0
YXJnZXQpCisgICAgICAgIHRhcmdldCA9IGRvYy0+d2Via2l0Q3VycmVudEZ1bGxTY3JlZW5FbGVt
ZW50KCk7CisgICAgaWYgKCF0YXJnZXQpCisgICAgICAgIHRhcmdldCA9IGRvYzsKKyAgICBtX2Z1
bGxTY3JlZW5DaGFuZ2VFdmVudFRhcmdldFF1ZXVlLmFwcGVuZCh0YXJnZXQpOworfQorI2VuZGlm
CisKKyNpZiBFTkFCTEUoUE9JTlRFUl9MT0NLKQordm9pZCBEb2N1bWVudDo6d2Via2l0RXhpdFBv
aW50ZXJMb2NrKCkKK3sKKyAgICBpZiAoIXBhZ2UoKSkKKyAgICAgICAgcmV0dXJuOworICAgIGlm
IChFbGVtZW50KiB0YXJnZXQgPSBwYWdlKCktPnBvaW50ZXJMb2NrQ29udHJvbGxlcigpLT5lbGVt
ZW50KCkpIHsKKyAgICAgICAgaWYgKHRhcmdldC0+ZG9jdW1lbnQoKSAhPSB0aGlzKQorICAgICAg
ICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwYWdlKCktPnBvaW50ZXJMb2NrQ29udHJvbGxlcigp
LT5yZXF1ZXN0UG9pbnRlclVubG9jaygpOworfQorCitFbGVtZW50KiBEb2N1bWVudDo6d2Via2l0
UG9pbnRlckxvY2tFbGVtZW50KCkgY29uc3QKK3sKKyAgICBpZiAoIXBhZ2UoKSB8fCBwYWdlKCkt
PnBvaW50ZXJMb2NrQ29udHJvbGxlcigpLT5sb2NrUGVuZGluZygpKQorICAgICAgICByZXR1cm4g
MDsKKyAgICBpZiAoRWxlbWVudCogZWxlbWVudCA9IHBhZ2UoKS0+cG9pbnRlckxvY2tDb250cm9s
bGVyKCktPmVsZW1lbnQoKSkgeworICAgICAgICBpZiAoZWxlbWVudC0+ZG9jdW1lbnQoKSA9PSB0
aGlzKQorICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CisgICAgfQorICAgIHJldHVybiAwOwor
fQorI2VuZGlmCisKK3ZvaWQgRG9jdW1lbnQ6OmRlY3JlbWVudExvYWRFdmVudERlbGF5Q291bnQo
KQoreworICAgIEFTU0VSVChtX2xvYWRFdmVudERlbGF5Q291bnQpOworICAgIC0tbV9sb2FkRXZl
bnREZWxheUNvdW50OworCisgICAgaWYgKGZyYW1lKCkgJiYgIW1fbG9hZEV2ZW50RGVsYXlDb3Vu
dCAmJiAhbV9sb2FkRXZlbnREZWxheVRpbWVyLmlzQWN0aXZlKCkpCisgICAgICAgIG1fbG9hZEV2
ZW50RGVsYXlUaW1lci5zdGFydE9uZVNob3QoMCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OmxvYWRF
dmVudERlbGF5VGltZXJGaXJlZChUaW1lcjxEb2N1bWVudD4qKQoreworICAgIGlmIChmcmFtZSgp
KQorICAgICAgICBmcmFtZSgpLT5sb2FkZXIoKS0+Y2hlY2tDb21wbGV0ZWQoKTsKK30KKworI2lm
IEVOQUJMRShSRVFVRVNUX0FOSU1BVElPTl9GUkFNRSkKK2ludCBEb2N1bWVudDo6d2Via2l0UmVx
dWVzdEFuaW1hdGlvbkZyYW1lKFBhc3NSZWZQdHI8UmVxdWVzdEFuaW1hdGlvbkZyYW1lQ2FsbGJh
Y2s+IGNhbGxiYWNrKQoreworICAgIGlmICghbV9zY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXIp
IHsKKyNpZiBVU0UoUkVRVUVTVF9BTklNQVRJT05fRlJBTUVfRElTUExBWV9NT05JVE9SKQorICAg
ICAgICBtX3NjcmlwdGVkQW5pbWF0aW9uQ29udHJvbGxlciA9IFNjcmlwdGVkQW5pbWF0aW9uQ29u
dHJvbGxlcjo6Y3JlYXRlKHRoaXMsIHBhZ2UoKSA/IHBhZ2UoKS0+ZGlzcGxheUlEKCkgOiAwKTsK
KyNlbHNlCisgICAgICAgIG1fc2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyID0gU2NyaXB0ZWRB
bmltYXRpb25Db250cm9sbGVyOjpjcmVhdGUodGhpcywgMCk7CisjZW5kaWYKKyAgICAgICAgLy8g
SXQncyBwb3NzaWJsZSB0aGF0IHRoZSBQYWdlIG1heSBoYXZlIHN1c3BlbmRlZCBzY3JpcHRlZCBh
bmltYXRpb25zIGJlZm9yZQorICAgICAgICAvLyB3ZSB3ZXJlIGNyZWF0ZWQuIFdlIG5lZWQgdG8g
bWFrZSBzdXJlIHRoYXQgd2UgZG9uJ3Qgc3RhcnQgdXAgdGhlIGFuaW1hdGlvbgorICAgICAgICAv
LyBjb250cm9sbGVyIG9uIGEgYmFja2dyb3VuZCB0YWIsIGZvciBleGFtcGxlLgorICAgICAgICBp
ZiAoIXBhZ2UoKSB8fCBwYWdlKCktPnNjcmlwdGVkQW5pbWF0aW9uc1N1c3BlbmRlZCgpKQorICAg
ICAgICAgICAgbV9zY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXItPnN1c3BlbmQoKTsKKyAgICB9
CisKKyAgICByZXR1cm4gbV9zY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXItPnJlZ2lzdGVyQ2Fs
bGJhY2soY2FsbGJhY2spOworfQorCit2b2lkIERvY3VtZW50Ojp3ZWJraXRDYW5jZWxBbmltYXRp
b25GcmFtZShpbnQgaWQpCit7CisgICAgaWYgKCFtX3NjcmlwdGVkQW5pbWF0aW9uQ29udHJvbGxl
cikKKyAgICAgICAgcmV0dXJuOworICAgIG1fc2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyLT5j
YW5jZWxDYWxsYmFjayhpZCk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OnNlcnZpY2VTY3JpcHRlZEFu
aW1hdGlvbnMoRE9NVGltZVN0YW1wIHRpbWUpCit7CisgICAgaWYgKCFtX3NjcmlwdGVkQW5pbWF0
aW9uQ29udHJvbGxlcikKKyAgICAgICAgcmV0dXJuOworICAgIG1fc2NyaXB0ZWRBbmltYXRpb25D
b250cm9sbGVyLT5zZXJ2aWNlU2NyaXB0ZWRBbmltYXRpb25zKHRpbWUpOworfQorI2VuZGlmCisK
KyNpZiBFTkFCTEUoVE9VQ0hfRVZFTlRTKQorUGFzc1JlZlB0cjxUb3VjaD4gRG9jdW1lbnQ6OmNy
ZWF0ZVRvdWNoKERPTVdpbmRvdyogd2luZG93LCBFdmVudFRhcmdldCogdGFyZ2V0LCBpbnQgaWRl
bnRpZmllciwgaW50IHBhZ2VYLCBpbnQgcGFnZVksIGludCBzY3JlZW5YLCBpbnQgc2NyZWVuWSwg
aW50IHJhZGl1c1gsIGludCByYWRpdXNZLCBmbG9hdCByb3RhdGlvbkFuZ2xlLCBmbG9hdCBmb3Jj
ZSwgRXhjZXB0aW9uQ29kZSYpIGNvbnN0Cit7CisgICAgLy8gRklYTUU6IEl0J3Mgbm90IGNsZWFy
IGZyb20gdGhlIGRvY3VtZW50YXRpb24gYXQKKyAgICAvLyBodHRwOi8vZGV2ZWxvcGVyLmFwcGxl
LmNvbS9saWJyYXJ5L3NhZmFyaS8jZG9jdW1lbnRhdGlvbi9Vc2VyRXhwZXJpZW5jZS9SZWZlcmVu
Y2UvRG9jdW1lbnRBZGRpdGlvbnNSZWZlcmVuY2UvRG9jdW1lbnRBZGRpdGlvbnMvRG9jdW1lbnRB
ZGRpdGlvbnMuaHRtbAorICAgIC8vIHdoZW4gdGhpcyBtZXRob2Qgc2hvdWxkIHRocm93IGFuZCBu
b3IgaXMgaXQgYnkgaW5zcGVjdGlvbiBvZiBpT1MgYmVoYXZpb3IuIEl0IHdvdWxkIGJlIG5pY2Ug
dG8gdmVyaWZ5IGFueSBjYXNlcyB3aGVyZSBpdCB0aHJvd3MgdW5kZXIgaU9TCisgICAgLy8gYW5k
IGltcGxlbWVudCB0aGVtIGhlcmUuIFNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9NDc4MTkKKyAgICBGcmFtZSogZnJhbWUgPSB3aW5kb3cgPyB3aW5kb3ctPmZyYW1l
KCkgOiB0aGlzLT5mcmFtZSgpOworICAgIHJldHVybiBUb3VjaDo6Y3JlYXRlKGZyYW1lLCB0YXJn
ZXQsIGlkZW50aWZpZXIsIHNjcmVlblgsIHNjcmVlblksIHBhZ2VYLCBwYWdlWSwgcmFkaXVzWCwg
cmFkaXVzWSwgcm90YXRpb25BbmdsZSwgZm9yY2UpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lk
IHdoZWVsRXZlbnRIYW5kbGVyQ291bnRDaGFuZ2VkKERvY3VtZW50KiBkb2N1bWVudCkKK3sKKyAg
ICBQYWdlKiBwYWdlID0gZG9jdW1lbnQtPnBhZ2UoKTsKKyAgICBpZiAoIXBhZ2UpCisgICAgICAg
IHJldHVybjsKKworICAgIFNjcm9sbGluZ0Nvb3JkaW5hdG9yKiBzY3JvbGxpbmdDb29yZGluYXRv
ciA9IHBhZ2UtPnNjcm9sbGluZ0Nvb3JkaW5hdG9yKCk7CisgICAgaWYgKCFzY3JvbGxpbmdDb29y
ZGluYXRvcikKKyAgICAgICAgcmV0dXJuOworCisgICAgRnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBk
b2N1bWVudC0+dmlldygpOworICAgIGlmICghZnJhbWVWaWV3KQorICAgICAgICByZXR1cm47CisK
KyAgICBzY3JvbGxpbmdDb29yZGluYXRvci0+ZnJhbWVWaWV3V2hlZWxFdmVudEhhbmRsZXJDb3Vu
dENoYW5nZWQoZnJhbWVWaWV3KTsKK30KKwordm9pZCBEb2N1bWVudDo6ZGlkQWRkV2hlZWxFdmVu
dEhhbmRsZXIoKQoreworICAgICsrbV93aGVlbEV2ZW50SGFuZGxlckNvdW50OworICAgIEZyYW1l
KiBtYWluRnJhbWUgPSBwYWdlKCkgPyBwYWdlKCktPm1haW5GcmFtZSgpIDogMDsKKyAgICBpZiAo
bWFpbkZyYW1lKQorICAgICAgICBtYWluRnJhbWUtPm5vdGlmeUNocm9tZUNsaWVudFdoZWVsRXZl
bnRIYW5kbGVyQ291bnRDaGFuZ2VkKCk7CisKKyAgICB3aGVlbEV2ZW50SGFuZGxlckNvdW50Q2hh
bmdlZCh0aGlzKTsKK30KKwordm9pZCBEb2N1bWVudDo6ZGlkUmVtb3ZlV2hlZWxFdmVudEhhbmRs
ZXIoKQoreworICAgIEFTU0VSVChtX3doZWVsRXZlbnRIYW5kbGVyQ291bnQgPiAwKTsKKyAgICAt
LW1fd2hlZWxFdmVudEhhbmRsZXJDb3VudDsKKyAgICBGcmFtZSogbWFpbkZyYW1lID0gcGFnZSgp
ID8gcGFnZSgpLT5tYWluRnJhbWUoKSA6IDA7CisgICAgaWYgKG1haW5GcmFtZSkKKyAgICAgICAg
bWFpbkZyYW1lLT5ub3RpZnlDaHJvbWVDbGllbnRXaGVlbEV2ZW50SGFuZGxlckNvdW50Q2hhbmdl
ZCgpOworCisgICAgd2hlZWxFdmVudEhhbmRsZXJDb3VudENoYW5nZWQodGhpcyk7Cit9CisKK3Zv
aWQgRG9jdW1lbnQ6OmRpZEFkZFRvdWNoRXZlbnRIYW5kbGVyKCkKK3sKKyNpZiBFTkFCTEUoVE9V
Q0hfRVZFTlRTKQorICAgICsrbV90b3VjaEV2ZW50SGFuZGxlckNvdW50OworICAgIGlmIChtX3Rv
dWNoRXZlbnRIYW5kbGVyQ291bnQgPiAxKQorICAgICAgICByZXR1cm47CisgICAgaWYgKFBhZ2Uq
IHBhZ2UgPSB0aGlzLT5wYWdlKCkpCisgICAgICAgIHBhZ2UtPmNocm9tZSgpLT5jbGllbnQoKS0+
bmVlZFRvdWNoRXZlbnRzKHRydWUpOworI2VuZGlmCit9CisKK3ZvaWQgRG9jdW1lbnQ6OmRpZFJl
bW92ZVRvdWNoRXZlbnRIYW5kbGVyKCkKK3sKKyNpZiBFTkFCTEUoVE9VQ0hfRVZFTlRTKQorICAg
IEFTU0VSVChtX3RvdWNoRXZlbnRIYW5kbGVyQ291bnQpOworICAgIC0tbV90b3VjaEV2ZW50SGFu
ZGxlckNvdW50OworICAgIGlmIChtX3RvdWNoRXZlbnRIYW5kbGVyQ291bnQpCisgICAgICAgIHJl
dHVybjsKKworICAgIFBhZ2UqIHBhZ2UgPSB0aGlzLT5wYWdlKCk7CisgICAgaWYgKCFwYWdlKQor
ICAgICAgICByZXR1cm47CisgICAgZm9yIChjb25zdCBGcmFtZSogZnJhbWUgPSBwYWdlLT5tYWlu
RnJhbWUoKTsgZnJhbWU7IGZyYW1lID0gZnJhbWUtPnRyZWUoKS0+dHJhdmVyc2VOZXh0KCkpIHsK
KyAgICAgICAgaWYgKGZyYW1lLT5kb2N1bWVudCgpICYmIGZyYW1lLT5kb2N1bWVudCgpLT50b3Vj
aEV2ZW50SGFuZGxlckNvdW50KCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgfQorICAgIHBh
Z2UtPmNocm9tZSgpLT5jbGllbnQoKS0+bmVlZFRvdWNoRXZlbnRzKGZhbHNlKTsKKyNlbmRpZgor
fQorCitIVE1MSUZyYW1lRWxlbWVudCogRG9jdW1lbnQ6OnNlYW1sZXNzUGFyZW50SUZyYW1lKCkg
Y29uc3QKK3sKKyAgICBpZiAoIXNob3VsZERpc3BsYXlTZWFtbGVzc2x5V2l0aFBhcmVudCgpKQor
ICAgICAgICByZXR1cm4gMDsKKworICAgIEhUTUxGcmFtZU93bmVyRWxlbWVudCogb3duZXJFbGVt
ZW50ID0gdGhpcy0+b3duZXJFbGVtZW50KCk7CisgICAgQVNTRVJUKG93bmVyRWxlbWVudC0+aGFz
VGFnTmFtZShpZnJhbWVUYWcpKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SFRNTElGcmFtZUVs
ZW1lbnQqPihvd25lckVsZW1lbnQpOworfQorCitib29sIERvY3VtZW50OjpzaG91bGREaXNwbGF5
U2VhbWxlc3NseVdpdGhQYXJlbnQoKSBjb25zdAoreworI2lmIEVOQUJMRShJRlJBTUVfU0VBTUxF
U1MpCisgICAgSFRNTEZyYW1lT3duZXJFbGVtZW50KiBvd25lckVsZW1lbnQgPSB0aGlzLT5vd25l
ckVsZW1lbnQoKTsKKyAgICBpZiAoIW93bmVyRWxlbWVudCkKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgIHJldHVybiBtX21heURpc3BsYXlTZWFtbGVzc1dpdGhQYXJlbnQgJiYgb3duZXJFbGVt
ZW50LT5oYXNUYWdOYW1lKGlmcmFtZVRhZykgJiYgb3duZXJFbGVtZW50LT5mYXN0SGFzQXR0cmli
dXRlKHNlYW1sZXNzQXR0cik7CisjZWxzZQorICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorfQor
CitEb2N1bWVudExvYWRlciogRG9jdW1lbnQ6OmxvYWRlcigpIGNvbnN0Cit7CisgICAgaWYgKCFt
X2ZyYW1lKQorICAgICAgICByZXR1cm4gMDsKKyAgICAKKyAgICBEb2N1bWVudExvYWRlciogbG9h
ZGVyID0gbV9mcmFtZS0+bG9hZGVyKCktPmRvY3VtZW50TG9hZGVyKCk7CisgICAgaWYgKCFsb2Fk
ZXIpCisgICAgICAgIHJldHVybiAwOworICAgIAorICAgIGlmIChtX2ZyYW1lLT5kb2N1bWVudCgp
ICE9IHRoaXMpCisgICAgICAgIHJldHVybiAwOworICAgIAorICAgIHJldHVybiBsb2FkZXI7Cit9
CisKKyNpZiBFTkFCTEUoTUlDUk9EQVRBKQorUGFzc1JlZlB0cjxOb2RlTGlzdD4gRG9jdW1lbnQ6
OmdldEl0ZW1zKGNvbnN0IFN0cmluZyYgdHlwZU5hbWVzKQoreworICAgIC8vIFNpbmNlIGRvY3Vt
ZXQuZ2V0SXRlbSgpIGlzIGFsbG93ZWQgZm9yIG1pY3JvZGF0YSwgdHlwZU5hbWVzIHdpbGwgYmUg
bnVsbCBzdHJpbmcuCisgICAgLy8gSW4gdGhpcyBjYXNlIHdlIG5lZWQgdG8gY3JlYXRlIGFuIGVt
cHR5IHN0cmluZyBpZGVudGlmaWVyIHRvIG1hcCBzdWNoIHJlcXVlc3QgaW4gdGhlIGNhY2hlLgor
ICAgIFN0cmluZyBsb2NhbFR5cGVOYW1lcyA9IHR5cGVOYW1lcy5pc051bGwoKSA/IE1pY3JvRGF0
YUl0ZW1MaXN0Ojp1bmRlZmluZWRJdGVtVHlwZSgpIDogdHlwZU5hbWVzOworCisgICAgcmV0dXJu
IGVuc3VyZVJhcmVEYXRhKCktPmVuc3VyZU5vZGVMaXN0cygpLT5hZGRDYWNoZVdpdGhOYW1lPE1p
Y3JvRGF0YUl0ZW1MaXN0Pih0aGlzLCBEeW5hbWljTm9kZUxpc3Q6Ok1pY3JvRGF0YUl0ZW1MaXN0
VHlwZSwgbG9jYWxUeXBlTmFtZXMpOworfQorI2VuZGlmCisKK0ludFNpemUgRG9jdW1lbnQ6OnZp
ZXdwb3J0U2l6ZSgpIGNvbnN0Cit7CisgICAgaWYgKCF2aWV3KCkpCisgICAgICAgIHJldHVybiBJ
bnRTaXplKCk7CisgICAgcmV0dXJuIHZpZXcoKS0+dmlzaWJsZUNvbnRlbnRSZWN0KC8qIGluY2x1
ZGVTY3JvbGxiYXJzICovIHRydWUpLnNpemUoKTsKK30KKworTm9kZSogZXZlbnRUYXJnZXROb2Rl
Rm9yRG9jdW1lbnQoRG9jdW1lbnQqIGRvYykKK3sKKyAgICBpZiAoIWRvYykKKyAgICAgICAgcmV0
dXJuIDA7CisgICAgTm9kZSogbm9kZSA9IGRvYy0+Zm9jdXNlZE5vZGUoKTsKKyAgICBpZiAoIW5v
ZGUgJiYgZG9jLT5pc1BsdWdpbkRvY3VtZW50KCkpIHsKKyAgICAgICAgUGx1Z2luRG9jdW1lbnQq
IHBsdWdpbkRvY3VtZW50ID0gc3RhdGljX2Nhc3Q8UGx1Z2luRG9jdW1lbnQqPihkb2MpOworICAg
ICAgICBub2RlID0gIHBsdWdpbkRvY3VtZW50LT5wbHVnaW5Ob2RlKCk7CisgICAgfQorICAgIGlm
ICghbm9kZSAmJiBkb2MtPmlzSFRNTERvY3VtZW50KCkpCisgICAgICAgIG5vZGUgPSBkb2MtPmJv
ZHkoKTsKKyAgICBpZiAoIW5vZGUpCisgICAgICAgIG5vZGUgPSBkb2MtPmRvY3VtZW50RWxlbWVu
dCgpOworICAgIHJldHVybiBub2RlOworfQorCit2b2lkIERvY3VtZW50OjphZGp1c3RGbG9hdFF1
YWRzRm9yU2Nyb2xsQW5kQWJzb2x1dGVab29tQW5kRnJhbWVTY2FsZShWZWN0b3I8RmxvYXRRdWFk
PiYgcXVhZHMsIFJlbmRlck9iamVjdCogcmVuZGVyZXIpCit7CisgICAgaWYgKCF2aWV3KCkpCisg
ICAgICAgIHJldHVybjsKKworICAgIGZsb2F0IGludmVyc2VGcmFtZVNjYWxlID0gMTsKKyAgICBp
ZiAoZnJhbWUoKSkKKyAgICAgICAgaW52ZXJzZUZyYW1lU2NhbGUgPSAxIC8gZnJhbWUoKS0+ZnJh
bWVTY2FsZUZhY3RvcigpOworCisgICAgTGF5b3V0UmVjdCB2aXNpYmxlQ29udGVudFJlY3QgPSB2
aWV3KCktPnZpc2libGVDb250ZW50UmVjdCgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwg
cXVhZHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgcXVhZHNbaV0ubW92ZSgtdmlzaWJsZUNvbnRl
bnRSZWN0LngoKSwgLXZpc2libGVDb250ZW50UmVjdC55KCkpOworICAgICAgICBhZGp1c3RGbG9h
dFF1YWRGb3JBYnNvbHV0ZVpvb20ocXVhZHNbaV0sIHJlbmRlcmVyKTsKKyAgICAgICAgaWYgKGlu
dmVyc2VGcmFtZVNjYWxlICE9IDEpCisgICAgICAgICAgICBxdWFkc1tpXS5zY2FsZShpbnZlcnNl
RnJhbWVTY2FsZSwgaW52ZXJzZUZyYW1lU2NhbGUpOworICAgIH0KK30KKwordm9pZCBEb2N1bWVu
dDo6YWRqdXN0RmxvYXRSZWN0Rm9yU2Nyb2xsQW5kQWJzb2x1dGVab29tQW5kRnJhbWVTY2FsZShG
bG9hdFJlY3QmIHJlY3QsIFJlbmRlck9iamVjdCogcmVuZGVyZXIpCit7CisgICAgaWYgKCF2aWV3
KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGZsb2F0IGludmVyc2VGcmFtZVNjYWxlID0gMTsK
KyAgICBpZiAoZnJhbWUoKSkKKyAgICAgICAgaW52ZXJzZUZyYW1lU2NhbGUgPSAxIC8gZnJhbWUo
KS0+ZnJhbWVTY2FsZUZhY3RvcigpOworCisgICAgTGF5b3V0UmVjdCB2aXNpYmxlQ29udGVudFJl
Y3QgPSB2aWV3KCktPnZpc2libGVDb250ZW50UmVjdCgpOworICAgIHJlY3QubW92ZSgtdmlzaWJs
ZUNvbnRlbnRSZWN0LngoKSwgLXZpc2libGVDb250ZW50UmVjdC55KCkpOworICAgIGFkanVzdEZs
b2F0UmVjdEZvckFic29sdXRlWm9vbShyZWN0LCByZW5kZXJlcik7CisgICAgaWYgKGludmVyc2VG
cmFtZVNjYWxlICE9IDEpCisgICAgICAgIHJlY3Quc2NhbGUoaW52ZXJzZUZyYW1lU2NhbGUpOwor
fQorCit2b2lkIERvY3VtZW50OjpzZXRDb250ZXh0RmVhdHVyZXMoUGFzc1JlZlB0cjxDb250ZXh0
RmVhdHVyZXM+IGZlYXR1cmVzKQoreworICAgIG1fY29udGV4dEZlYXR1cmVzID0gZmVhdHVyZXM7
Cit9CisKK3N0YXRpYyBSZW5kZXJPYmplY3QqIG5lYXJlc3RDb21tb25Ib3ZlckFuY2VzdG9yKFJl
bmRlck9iamVjdCogb2JqMSwgUmVuZGVyT2JqZWN0KiBvYmoyKQoreworICAgIGlmICghb2JqMSB8
fCAhb2JqMikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBmb3IgKFJlbmRlck9iamVjdCogY3Vy
ck9iajEgPSBvYmoxOyBjdXJyT2JqMTsgY3Vyck9iajEgPSBjdXJyT2JqMS0+aG92ZXJBbmNlc3Rv
cigpKSB7CisgICAgICAgIGZvciAoUmVuZGVyT2JqZWN0KiBjdXJyT2JqMiA9IG9iajI7IGN1cnJP
YmoyOyBjdXJyT2JqMiA9IGN1cnJPYmoyLT5ob3ZlckFuY2VzdG9yKCkpIHsKKyAgICAgICAgICAg
IGlmIChjdXJyT2JqMSA9PSBjdXJyT2JqMikKKyAgICAgICAgICAgICAgICByZXR1cm4gY3Vyck9i
ajE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBEb2N1bWVu
dDo6dXBkYXRlSG92ZXJBY3RpdmVTdGF0ZShjb25zdCBIaXRUZXN0UmVxdWVzdCYgcmVxdWVzdCwg
SGl0VGVzdFJlc3VsdCYgcmVzdWx0KQoreworICAgIC8vIFdlIGRvbid0IHVwZGF0ZSA6aG92ZXIv
OmFjdGl2ZSBzdGF0ZSB3aGVuIHRoZSByZXN1bHQgaXMgbWFya2VkIGFzIHJlYWRPbmx5LgorICAg
IGlmIChyZXF1ZXN0LnJlYWRPbmx5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIE5vZGUqIGlu
bmVyTm9kZUluRG9jdW1lbnQgPSByZXN1bHQuaW5uZXJOb2RlKCk7CisgICAgQVNTRVJUKCFpbm5l
ck5vZGVJbkRvY3VtZW50IHx8IGlubmVyTm9kZUluRG9jdW1lbnQtPmRvY3VtZW50KCkgPT0gdGhp
cyk7CisKKyAgICBOb2RlKiBvbGRBY3RpdmVOb2RlID0gYWN0aXZlTm9kZSgpOworICAgIGlmIChv
bGRBY3RpdmVOb2RlICYmICFyZXF1ZXN0LmFjdGl2ZSgpKSB7CisgICAgICAgIC8vIFdlIGFyZSBj
bGVhcmluZyB0aGUgOmFjdGl2ZSBjaGFpbiBiZWNhdXNlIHRoZSBtb3VzZSBoYXMgYmVlbiByZWxl
YXNlZC4KKyAgICAgICAgZm9yIChSZW5kZXJPYmplY3QqIGN1cnIgPSBvbGRBY3RpdmVOb2RlLT5y
ZW5kZXJlcigpOyBjdXJyOyBjdXJyID0gY3Vyci0+cGFyZW50KCkpIHsKKyAgICAgICAgICAgIGlm
IChjdXJyLT5ub2RlKCkgJiYgIWN1cnItPmlzVGV4dCgpKSB7CisgICAgICAgICAgICAgICAgY3Vy
ci0+bm9kZSgpLT5zZXRBY3RpdmUoZmFsc2UpOworICAgICAgICAgICAgICAgIGN1cnItPm5vZGUo
KS0+Y2xlYXJJbkFjdGl2ZUNoYWluKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAg
ICAgc2V0QWN0aXZlTm9kZSgwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBOb2RlKiBuZXdBY3Rp
dmVOb2RlID0gaW5uZXJOb2RlSW5Eb2N1bWVudDsKKyAgICAgICAgaWYgKCFvbGRBY3RpdmVOb2Rl
ICYmIG5ld0FjdGl2ZU5vZGUgJiYgcmVxdWVzdC5hY3RpdmUoKSAmJiAhcmVxdWVzdC50b3VjaE1v
dmUoKSkgeworICAgICAgICAgICAgLy8gV2UgYXJlIHNldHRpbmcgdGhlIDphY3RpdmUgY2hhaW4g
YW5kIGZyZWV6aW5nIGl0LiBJZiBmdXR1cmUgbW92ZXMgaGFwcGVuLCB0aGV5CisgICAgICAgICAg
ICAvLyB3aWxsIG5lZWQgdG8gcmVmZXJlbmNlIHRoaXMgY2hhaW4uCisgICAgICAgICAgICBmb3Ig
KFJlbmRlck9iamVjdCogY3VyciA9IG5ld0FjdGl2ZU5vZGUtPnJlbmRlcmVyKCk7IGN1cnI7IGN1
cnIgPSBjdXJyLT5wYXJlbnQoKSkgeworICAgICAgICAgICAgICAgIGlmIChjdXJyLT5ub2RlKCkg
JiYgIWN1cnItPmlzVGV4dCgpKQorICAgICAgICAgICAgICAgICAgICBjdXJyLT5ub2RlKCktPnNl
dEluQWN0aXZlQ2hhaW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldEFjdGl2ZU5v
ZGUobmV3QWN0aXZlTm9kZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gSWYgdGhlIG1vdXNl
IGhhcyBqdXN0IGJlZW4gcHJlc3NlZCwgc2V0IDphY3RpdmUgb24gdGhlIGNoYWluLiBUaG9zZSAo
YW5kIG9ubHkgdGhvc2UpCisgICAgLy8gbm9kZXMgc2hvdWxkIHJlbWFpbiA6YWN0aXZlIHVudGls
IHRoZSBtb3VzZSBpcyByZWxlYXNlZC4KKyAgICBib29sIGFsbG93QWN0aXZlQ2hhbmdlcyA9ICFv
bGRBY3RpdmVOb2RlICYmIGFjdGl2ZU5vZGUoKTsKKworICAgIC8vIElmIHRoZSBtb3VzZSBpcyBk
b3duIGFuZCBpZiB0aGlzIGlzIGEgbW91c2UgbW92ZSBldmVudCwgd2Ugd2FudCB0byByZXN0cmlj
dCBjaGFuZ2VzIGluCisgICAgLy8gOmhvdmVyLzphY3RpdmUgdG8gb25seSBhcHBseSB0byBlbGVt
ZW50cyB0aGF0IGFyZSBpbiB0aGUgOmFjdGl2ZSBjaGFpbiB0aGF0IHdlIGZyb3plCisgICAgLy8g
YXQgdGhlIHRpbWUgdGhlIG1vdXNlIHdlbnQgZG93bi4KKyAgICBib29sIG11c3RCZUluQWN0aXZl
Q2hhaW4gPSByZXF1ZXN0LmFjdGl2ZSgpICYmIHJlcXVlc3QubW92ZSgpOworCisgICAgUmVmUHRy
PE5vZGU+IG9sZEhvdmVyTm9kZSA9IGhvdmVyTm9kZSgpOworICAgIC8vIENsZWFyIHRoZSA6aG92
ZXIgY2hhaW4gd2hlbiB0aGUgdG91Y2ggZ2VzdHVyZSBpcyBvdmVyLgorICAgIGlmIChyZXF1ZXN0
LnRvdWNoUmVsZWFzZSgpKSB7CisgICAgICAgIGlmIChvbGRIb3Zlck5vZGUpIHsKKyAgICAgICAg
ICAgIGZvciAoUmVuZGVyT2JqZWN0KiBjdXJyID0gb2xkSG92ZXJOb2RlLT5yZW5kZXJlcigpOyBj
dXJyOyBjdXJyID0gY3Vyci0+aG92ZXJBbmNlc3RvcigpKSB7CisgICAgICAgICAgICAgICAgaWYg
KGN1cnItPm5vZGUoKSAmJiAhY3Vyci0+aXNUZXh0KCkpCisgICAgICAgICAgICAgICAgICAgIGN1
cnItPm5vZGUoKS0+c2V0SG92ZXJlZChmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAg
ICBzZXRIb3Zlck5vZGUoMCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gQSB0b3VjaCByZWxlYXNl
IGNhbiBub3Qgc2V0IG5ldyBob3ZlciBvciBhY3RpdmUgdGFyZ2V0LgorICAgICAgICByZXR1cm47
CisgICAgfQorCisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBob3ZlcmVkIG5vZGUgaGFzIGNo
YW5nZWQuCisgICAgLy8gSWYgaXQgaGFzbid0LCB3ZSBkbyBub3QgbmVlZCB0byBkbyBhbnl0aGlu
Zy4KKyAgICBOb2RlKiBuZXdIb3Zlck5vZGUgPSBpbm5lck5vZGVJbkRvY3VtZW50OworICAgIHdo
aWxlIChuZXdIb3Zlck5vZGUgJiYgIW5ld0hvdmVyTm9kZS0+cmVuZGVyZXIoKSkKKyAgICAgICAg
bmV3SG92ZXJOb2RlID0gbmV3SG92ZXJOb2RlLT5wYXJlbnRPckhvc3ROb2RlKCk7CisKKyAgICAv
LyBVcGRhdGUgb3VyIGN1cnJlbnQgaG92ZXIgbm9kZS4KKyAgICBzZXRIb3Zlck5vZGUobmV3SG92
ZXJOb2RlKTsKKworICAgIC8vIFdlIGhhdmUgdHdvIGRpZmZlcmVudCBvYmplY3RzLiBGZXRjaCB0
aGVpciByZW5kZXJlcnMuCisgICAgUmVuZGVyT2JqZWN0KiBvbGRIb3Zlck9iaiA9IG9sZEhvdmVy
Tm9kZSA/IG9sZEhvdmVyTm9kZS0+cmVuZGVyZXIoKSA6IDA7CisgICAgUmVuZGVyT2JqZWN0KiBu
ZXdIb3Zlck9iaiA9IG5ld0hvdmVyTm9kZSA/IG5ld0hvdmVyTm9kZS0+cmVuZGVyZXIoKSA6IDA7
CisKKyAgICAvLyBMb2NhdGUgdGhlIGNvbW1vbiBhbmNlc3RvciByZW5kZXIgb2JqZWN0IGZvciB0
aGUgdHdvIHJlbmRlcmVycy4KKyAgICBSZW5kZXJPYmplY3QqIGFuY2VzdG9yID0gbmVhcmVzdENv
bW1vbkhvdmVyQW5jZXN0b3Iob2xkSG92ZXJPYmosIG5ld0hvdmVyT2JqKTsKKworICAgIFZlY3Rv
cjxSZWZQdHI8Tm9kZT4sIDMyPiBub2Rlc1RvUmVtb3ZlRnJvbUNoYWluOworICAgIFZlY3RvcjxS
ZWZQdHI8Tm9kZT4sIDMyPiBub2Rlc1RvQWRkVG9DaGFpbjsKKworICAgIGlmIChvbGRIb3Zlck9i
aiAhPSBuZXdIb3Zlck9iaikgeworICAgICAgICAvLyBUaGUgb2xkIGhvdmVyIHBhdGggb25seSBu
ZWVkcyB0byBiZSBjbGVhcmVkIHVwIHRvIChhbmQgbm90IGluY2x1ZGluZykgdGhlIGNvbW1vbiBh
bmNlc3RvcjsKKyAgICAgICAgZm9yIChSZW5kZXJPYmplY3QqIGN1cnIgPSBvbGRIb3Zlck9iajsg
Y3VyciAmJiBjdXJyICE9IGFuY2VzdG9yOyBjdXJyID0gY3Vyci0+aG92ZXJBbmNlc3RvcigpKSB7
CisgICAgICAgICAgICBpZiAoY3Vyci0+bm9kZSgpICYmICFjdXJyLT5pc1RleHQoKSAmJiAoIW11
c3RCZUluQWN0aXZlQ2hhaW4gfHwgY3Vyci0+bm9kZSgpLT5pbkFjdGl2ZUNoYWluKCkpKQorICAg
ICAgICAgICAgICAgIG5vZGVzVG9SZW1vdmVGcm9tQ2hhaW4uYXBwZW5kKGN1cnItPm5vZGUoKSk7
CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBOb3cgc2V0IHRoZSBob3ZlciBzdGF0ZSBmb3Ig
b3VyIG5ldyBvYmplY3QgdXAgdG8gdGhlIHJvb3QuCisgICAgZm9yIChSZW5kZXJPYmplY3QqIGN1
cnIgPSBuZXdIb3Zlck9iajsgY3VycjsgY3VyciA9IGN1cnItPmhvdmVyQW5jZXN0b3IoKSkgewor
ICAgICAgICBpZiAoY3Vyci0+bm9kZSgpICYmICFjdXJyLT5pc1RleHQoKSAmJiAoIW11c3RCZUlu
QWN0aXZlQ2hhaW4gfHwgY3Vyci0+bm9kZSgpLT5pbkFjdGl2ZUNoYWluKCkpKQorICAgICAgICAg
ICAgbm9kZXNUb0FkZFRvQ2hhaW4uYXBwZW5kKGN1cnItPm5vZGUoKSk7CisgICAgfQorCisgICAg
c2l6ZV90IHJlbW92ZUNvdW50ID0gbm9kZXNUb1JlbW92ZUZyb21DaGFpbi5zaXplKCk7CisgICAg
Zm9yIChzaXplX3QgaSA9IDA7IGkgPCByZW1vdmVDb3VudDsgKytpKQorICAgICAgICBub2Rlc1Rv
UmVtb3ZlRnJvbUNoYWluW2ldLT5zZXRIb3ZlcmVkKGZhbHNlKTsKKworICAgIHNpemVfdCBhZGRD
b3VudCA9IG5vZGVzVG9BZGRUb0NoYWluLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsg
aSA8IGFkZENvdW50OyArK2kpIHsKKyAgICAgICAgaWYgKGFsbG93QWN0aXZlQ2hhbmdlcykKKyAg
ICAgICAgICAgIG5vZGVzVG9BZGRUb0NoYWluW2ldLT5zZXRBY3RpdmUodHJ1ZSk7CisgICAgICAg
IG5vZGVzVG9BZGRUb0NoYWluW2ldLT5zZXRIb3ZlcmVkKHRydWUpOworICAgIH0KK30KKwordm9p
ZCBEb2N1bWVudDo6cmVwb3J0TWVtb3J5VXNhZ2UoTWVtb3J5T2JqZWN0SW5mbyogbWVtb3J5T2Jq
ZWN0SW5mbykgY29uc3QKK3sKKyAgICBNZW1vcnlDbGFzc0luZm8gaW5mbyhtZW1vcnlPYmplY3RJ
bmZvLCB0aGlzLCBXZWJDb3JlTWVtb3J5VHlwZXM6OkRPTSk7CisgICAgaW5mby5hZGRNZW1iZXIo
bV9zdHlsZVJlc29sdmVyKTsKKyAgICBDb250YWluZXJOb2RlOjpyZXBvcnRNZW1vcnlVc2FnZSht
ZW1vcnlPYmplY3RJbmZvKTsKKyAgICBpbmZvLmFkZFZlY3RvcihtX2N1c3RvbUZvbnRzKTsKKyAg
ICBpbmZvLmFkZE1lbWJlcihtX3VybCk7CisgICAgaW5mby5hZGRNZW1iZXIobV9iYXNlVVJMKTsK
KyAgICBpbmZvLmFkZE1lbWJlcihtX2Jhc2VVUkxPdmVycmlkZSk7CisgICAgaW5mby5hZGRNZW1i
ZXIobV9iYXNlRWxlbWVudFVSTCk7CisgICAgaW5mby5hZGRNZW1iZXIobV9jb29raWVVUkwpOwor
ICAgIGluZm8uYWRkTWVtYmVyKG1fZmlyc3RQYXJ0eUZvckNvb2tpZXMpOworICAgIGluZm8uYWRk
TWVtYmVyKG1fZG9jdW1lbnRVUkkpOworICAgIGluZm8uYWRkTWVtYmVyKG1fYmFzZVRhcmdldCk7
CisgICAgaW5mby5hZGRNZW1iZXIobV9mcmFtZSk7CisgICAgaW5mby5hZGRNZW1iZXIobV9jYWNo
ZWRSZXNvdXJjZUxvYWRlcik7CisgICAgaW5mby5hZGRNZW1iZXIobV9lbGVtU2hlZXQpOworICAg
IGluZm8uYWRkTWVtYmVyKG1fcGFnZVVzZXJTaGVldCk7CisgICAgaWYgKG1fcGFnZUdyb3VwVXNl
clNoZWV0cykKKyAgICAgICAgaW5mby5hZGRJbnN0cnVtZW50ZWRWZWN0b3JQdHIobV9wYWdlR3Jv
dXBVc2VyU2hlZXRzKTsKKyAgICBpZiAobV91c2VyU2hlZXRzKQorICAgICAgICBpbmZvLmFkZElu
c3RydW1lbnRlZFZlY3RvclB0cihtX3VzZXJTaGVldHMpOworICAgIGluZm8uYWRkSGFzaFNldCht
X25vZGVJdGVyYXRvcnMpOworICAgIGluZm8uYWRkSGFzaFNldChtX3Jhbmdlcyk7CisgICAgaW5m
by5hZGRMaXN0SGFzaFNldChtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcyk7CisgICAgaW5mby5h
ZGRNZW1iZXIobV9wcmVmZXJyZWRTdHlsZXNoZWV0U2V0KTsKKyAgICBpbmZvLmFkZE1lbWJlciht
X3NlbGVjdGVkU3R5bGVzaGVldFNldCk7CisgICAgaW5mby5hZGRNZW1iZXIobV90aXRsZS5zdHJp
bmcoKSk7CisgICAgaW5mby5hZGRNZW1iZXIobV9yYXdUaXRsZS5zdHJpbmcoKSk7CisgICAgaW5m
by5hZGRNZW1iZXIobV94bWxFbmNvZGluZyk7CisgICAgaW5mby5hZGRNZW1iZXIobV94bWxWZXJz
aW9uKTsKKyAgICBpbmZvLmFkZE1lbWJlcihtX2NvbnRlbnRMYW5ndWFnZSk7CisgICAgaW5mby5h
ZGRIYXNoTWFwKG1fZG9jdW1lbnROYW1lZEl0ZW1Db2xsZWN0aW9ucyk7CisgICAgaW5mby5hZGRI
YXNoTWFwKG1fd2luZG93TmFtZWRJdGVtQ29sbGVjdGlvbnMpOworI2lmIEVOQUJMRShEQVNIQk9B
UkRfU1VQUE9SVCkKKyAgICBpbmZvLmFkZFZlY3RvcihtX2Rhc2hib2FyZFJlZ2lvbnMpOworI2Vu
ZGlmCisgICAgaW5mby5hZGRIYXNoTWFwKG1fY3NzQ2FudmFzRWxlbWVudHMpOworICAgIGluZm8u
YWRkVmVjdG9yKG1faWNvblVSTHMpOworICAgIGluZm8uYWRkSGFzaFNldChtX2RvY3VtZW50U3Vz
cGVuc2lvbkNhbGxiYWNrRWxlbWVudHMpOworICAgIGluZm8uYWRkSGFzaFNldChtX21lZGlhVm9s
dW1lQ2FsbGJhY2tFbGVtZW50cyk7CisgICAgaW5mby5hZGRIYXNoU2V0KG1fcHJpdmF0ZUJyb3dz
aW5nU3RhdGVDaGFuZ2VkRWxlbWVudHMpOworICAgIGluZm8uYWRkSGFzaE1hcChtX2VsZW1lbnRz
QnlBY2Nlc3NLZXkpOworICAgIGluZm8uYWRkTWVtYmVyKG1fZXZlbnRRdWV1ZSk7CisgICAgaW5m
by5hZGRIYXNoU2V0KG1fbWVkaWFDYW5TdGFydExpc3RlbmVycyk7CisgICAgaW5mby5hZGRWZWN0
b3IobV9wZW5kaW5nVGFza3MpOworfQorCisjaWYgRU5BQkxFKFVORE9fTUFOQUdFUikKK1Bhc3NS
ZWZQdHI8VW5kb01hbmFnZXI+IERvY3VtZW50Ojp1bmRvTWFuYWdlcigpCit7CisgICAgaWYgKCFt
X3VuZG9NYW5hZ2VyKQorICAgICAgICBtX3VuZG9NYW5hZ2VyID0gVW5kb01hbmFnZXI6OmNyZWF0
ZSh0aGlzKTsKKyAgICByZXR1cm4gbV91bmRvTWFuYWdlcjsKK30KKyNlbmRpZgorCitjbGFzcyBJ
bW11dGFibGVBdHRyaWJ1dGVEYXRhQ2FjaGVLZXkgeworcHVibGljOgorICAgIEltbXV0YWJsZUF0
dHJpYnV0ZURhdGFDYWNoZUtleShjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lLCBjb25zdCBB
dHRyaWJ1dGUqIGF0dHJpYnV0ZXMsIHVuc2lnbmVkIGF0dHJpYnV0ZUNvdW50KQorICAgICAgICA6
IG1fdGFnUU5hbWUodGFnTmFtZSkKKyAgICAgICAgLCBtX2F0dHJpYnV0ZXMoYXR0cmlidXRlcykK
KyAgICAgICAgLCBtX2F0dHJpYnV0ZUNvdW50KGF0dHJpYnV0ZUNvdW50KQorICAgIHsgfQorCisg
ICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEltbXV0YWJsZUF0dHJpYnV0ZURhdGFDYWNoZUtleSYg
b3RoZXIpIGNvbnN0CisgICAgeworICAgICAgICBpZiAobV90YWdRTmFtZSAhPSBvdGhlci5tX3Rh
Z1FOYW1lKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChtX2F0dHJpYnV0
ZUNvdW50ICE9IG90aGVyLm1fYXR0cmlidXRlQ291bnQpCisgICAgICAgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICAgICAgcmV0dXJuIG1lbWNtcChtX2F0dHJpYnV0ZXMsIG90aGVyLm1fYXR0cmlidXRl
cywgc2l6ZW9mKEF0dHJpYnV0ZSkgKiBtX2F0dHJpYnV0ZUNvdW50KTsKKyAgICB9CisKKyAgICB1
bnNpZ25lZCBoYXNoKCkgY29uc3QKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIGF0dHJpYnV0ZUhh
c2ggPSBTdHJpbmdIYXNoZXI6Omhhc2hNZW1vcnkobV9hdHRyaWJ1dGVzLCBtX2F0dHJpYnV0ZUNv
dW50ICogc2l6ZW9mKEF0dHJpYnV0ZSkpOworICAgICAgICByZXR1cm4gV1RGOjpwYWlySW50SGFz
aChtX3RhZ1FOYW1lLmxvY2FsTmFtZSgpLmltcGwoKS0+ZXhpc3RpbmdIYXNoKCksIGF0dHJpYnV0
ZUhhc2gpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBRdWFsaWZpZWROYW1lIG1fdGFnUU5hbWU7
CisgICAgY29uc3QgQXR0cmlidXRlKiBtX2F0dHJpYnV0ZXM7CisgICAgdW5zaWduZWQgbV9hdHRy
aWJ1dGVDb3VudDsKK307CisKK3N0cnVjdCBJbW11dGFibGVBdHRyaWJ1dGVEYXRhQ2FjaGVFbnRy
eSB7CisgICAgSW1tdXRhYmxlQXR0cmlidXRlRGF0YUNhY2hlRW50cnkoY29uc3QgSW1tdXRhYmxl
QXR0cmlidXRlRGF0YUNhY2hlS2V5JiBrLCBQYXNzUmVmUHRyPEVsZW1lbnRBdHRyaWJ1dGVEYXRh
PiB2KQorICAgICAgICA6IGtleShrKQorICAgICAgICAsIHZhbHVlKHYpCisgICAgeyB9CisKKyAg
ICBJbW11dGFibGVBdHRyaWJ1dGVEYXRhQ2FjaGVLZXkga2V5OworICAgIFJlZlB0cjxFbGVtZW50
QXR0cmlidXRlRGF0YT4gdmFsdWU7Cit9OworCitQYXNzUmVmUHRyPEVsZW1lbnRBdHRyaWJ1dGVE
YXRhPiBEb2N1bWVudDo6Y2FjaGVkSW1tdXRhYmxlQXR0cmlidXRlRGF0YShjb25zdCBFbGVtZW50
KiBlbGVtZW50LCBjb25zdCBWZWN0b3I8QXR0cmlidXRlPiYgYXR0cmlidXRlcykKK3sKKyAgICBB
U1NFUlQoIWF0dHJpYnV0ZXMuaXNFbXB0eSgpKTsKKworICAgIEltbXV0YWJsZUF0dHJpYnV0ZURh
dGFDYWNoZUtleSBjYWNoZUtleShlbGVtZW50LT50YWdRTmFtZSgpLCBhdHRyaWJ1dGVzLmRhdGEo
KSwgYXR0cmlidXRlcy5zaXplKCkpOworICAgIHVuc2lnbmVkIGNhY2hlSGFzaCA9IGNhY2hlS2V5
Lmhhc2goKTsKKworICAgIEltbXV0YWJsZUF0dHJpYnV0ZURhdGFDYWNoZTo6aXRlcmF0b3IgY2Fj
aGVJdGVyYXRvciA9IG1faW1tdXRhYmxlQXR0cmlidXRlRGF0YUNhY2hlLmFkZChjYWNoZUhhc2gs
IG51bGxwdHIpLml0ZXJhdG9yOworICAgIGlmIChjYWNoZUl0ZXJhdG9yLT5zZWNvbmQgJiYgY2Fj
aGVJdGVyYXRvci0+c2Vjb25kLT5rZXkgIT0gY2FjaGVLZXkpCisgICAgICAgIGNhY2hlSGFzaCA9
IDA7CisKKyAgICBSZWZQdHI8RWxlbWVudEF0dHJpYnV0ZURhdGE+IGF0dHJpYnV0ZURhdGE7Cisg
ICAgaWYgKGNhY2hlSGFzaCAmJiBjYWNoZUl0ZXJhdG9yLT5zZWNvbmQpCisgICAgICAgIGF0dHJp
YnV0ZURhdGEgPSBjYWNoZUl0ZXJhdG9yLT5zZWNvbmQtPnZhbHVlOworICAgIGVsc2UKKyAgICAg
ICAgYXR0cmlidXRlRGF0YSA9IEVsZW1lbnRBdHRyaWJ1dGVEYXRhOjpjcmVhdGVJbW11dGFibGUo
YXR0cmlidXRlcyk7CisKKyAgICBpZiAoIWNhY2hlSGFzaCB8fCBjYWNoZUl0ZXJhdG9yLT5zZWNv
bmQpCisgICAgICAgIHJldHVybiBhdHRyaWJ1dGVEYXRhLnJlbGVhc2UoKTsKKworICAgIGNhY2hl
SXRlcmF0b3ItPnNlY29uZCA9IGFkb3B0UHRyKG5ldyBJbW11dGFibGVBdHRyaWJ1dGVEYXRhQ2Fj
aGVFbnRyeShJbW11dGFibGVBdHRyaWJ1dGVEYXRhQ2FjaGVLZXkoZWxlbWVudC0+dGFnUU5hbWUo
KSwgYXR0cmlidXRlRGF0YS0+aW1tdXRhYmxlQXR0cmlidXRlQXJyYXkoKSwgYXR0cmlidXRlRGF0
YS0+bGVuZ3RoKCkpLCBhdHRyaWJ1dGVEYXRhKSk7CisKKyAgICByZXR1cm4gYXR0cmlidXRlRGF0
YS5yZWxlYXNlKCk7Cit9CisKK0xvY2FsaXplciYgRG9jdW1lbnQ6OmdldExvY2FsaXplcihjb25z
dCBBdG9taWNTdHJpbmcmIGxvY2FsZSkKK3sKKyAgICBBdG9taWNTdHJpbmcgbG9jYWxlS2V5ID0g
bG9jYWxlOworICAgIGlmIChsb2NhbGUuaXNFbXB0eSgpIHx8ICFSdW50aW1lRW5hYmxlZEZlYXR1
cmVzOjpsYW5nQXR0cmlidXRlQXdhcmVGb3JtQ29udHJvbFVJRW5hYmxlZCgpKQorICAgICAgICBs
b2NhbGVLZXkgPSBkZWZhdWx0TGFuZ3VhZ2UoKTsKKyAgICBMb2NhbGVUb0xvY2FsaXplck1hcDo6
QWRkUmVzdWx0IHJlc3VsdCA9IG1fbG9jYWxpemVyQ2FjaGUuYWRkKGxvY2FsZUtleSwgbnVsbHB0
cik7CisgICAgaWYgKHJlc3VsdC5pc05ld0VudHJ5KQorICAgICAgICByZXN1bHQuaXRlcmF0b3It
PnNlY29uZCA9IExvY2FsaXplcjo6Y3JlYXRlKGxvY2FsZUtleSk7CisgICAgcmV0dXJuICoocmVz
dWx0Lml0ZXJhdG9yLT5zZWNvbmQpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9kb20vRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZG9tL0RvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rp
b24uY3BwCShyZXZpc2lvbiAxMjk0MDcpCisrKyBTb3VyY2UvV2ViQ29yZS9kb20vRG9jdW1lbnRT
dHlsZVNoZWV0Q29sbGVjdGlvbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI2LDYzMSArMjYsNTIg
QEAKICAqLwogCiAjaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiRG9jdW1lbnQuaCIKKyNp
bmNsdWRlICJEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmgiCiAKLSNpbmNsdWRlICJBWE9i
amVjdENhY2hlLmgiCi0jaW5jbHVkZSAiQW5pbWF0aW9uQ29udHJvbGxlci5oIgotI2luY2x1ZGUg
IkF0dHIuaCIKLSNpbmNsdWRlICJBdHRyaWJ1dGUuaCIKLSNpbmNsdWRlICJDREFUQVNlY3Rpb24u
aCIKLSNpbmNsdWRlICJDU1NQYXJzZXIuaCIKLSNpbmNsdWRlICJDU1NTdHlsZURlY2xhcmF0aW9u
LmgiCiAjaW5jbHVkZSAiQ1NTU3R5bGVTaGVldC5oIgotI2luY2x1ZGUgIkNTU1ZhbHVlS2V5d29y
ZHMuaCIKLSNpbmNsdWRlICJDYWNoZWRDU1NTdHlsZVNoZWV0LmgiCi0jaW5jbHVkZSAiQ2FjaGVk
UmVzb3VyY2VMb2FkZXIuaCIKLSNpbmNsdWRlICJDaHJvbWUuaCIKLSNpbmNsdWRlICJDaHJvbWVD
bGllbnQuaCIKLSNpbmNsdWRlICJDb21tZW50LmgiCi0jaW5jbHVkZSAiQ29uc29sZS5oIgotI2lu
Y2x1ZGUgIkNvbnRlbnRTZWN1cml0eVBvbGljeS5oIgotI2luY2x1ZGUgIkNvbnRleHRGZWF0dXJl
cy5oIgotI2luY2x1ZGUgIkNvb2tpZUphci5oIgotI2luY2x1ZGUgIkRPTUltcGxlbWVudGF0aW9u
LmgiCi0jaW5jbHVkZSAiRE9NTmFtZWRGbG93Q29sbGVjdGlvbi5oIgotI2luY2x1ZGUgIkRPTVNl
bGVjdGlvbi5oIgotI2luY2x1ZGUgIkRPTVdpbmRvdy5oIgotI2luY2x1ZGUgIkRhdGVDb21wb25l
bnRzLmgiCi0jaW5jbHVkZSAiRGV2aWNlTW90aW9uQ29udHJvbGxlci5oIgotI2luY2x1ZGUgIkRl
dmljZU9yaWVudGF0aW9uQ29udHJvbGxlci5oIgotI2luY2x1ZGUgIkRvY3VtZW50RXZlbnRRdWV1
ZS5oIgotI2luY2x1ZGUgIkRvY3VtZW50RnJhZ21lbnQuaCIKLSNpbmNsdWRlICJEb2N1bWVudExv
YWRlci5oIgotI2luY2x1ZGUgIkRvY3VtZW50TWFya2VyQ29udHJvbGxlci5oIgotI2luY2x1ZGUg
IkRvY3VtZW50VHlwZS5oIgotI2luY2x1ZGUgIkVkaXRpbmdUZXh0LmgiCi0jaW5jbHVkZSAiRWRp
dG9yLmgiCisjaW5jbHVkZSAiRG9jdW1lbnQuaCIKICNpbmNsdWRlICJFbGVtZW50LmgiCi0jaW5j
bHVkZSAiRWxlbWVudFNoYWRvdy5oIgotI2luY2x1ZGUgIkVudGl0eVJlZmVyZW5jZS5oIgotI2lu
Y2x1ZGUgIkV2ZW50LmgiCi0jaW5jbHVkZSAiRXZlbnRGYWN0b3J5LmgiCi0jaW5jbHVkZSAiRXZl
bnRIYW5kbGVyLmgiCi0jaW5jbHVkZSAiRXZlbnRMaXN0ZW5lci5oIgotI2luY2x1ZGUgIkV2ZW50
TmFtZXMuaCIKLSNpbmNsdWRlICJFeGNlcHRpb25Db2RlLmgiCi0jaW5jbHVkZSAiRmxvd1RocmVh
ZENvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJGb2N1c0NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJG
b3JtQ29udHJvbGxlci5oIgotI2luY2x1ZGUgIkZyYW1lLmgiCi0jaW5jbHVkZSAiRnJhbWVMb2Fk
ZXIuaCIKLSNpbmNsdWRlICJGcmFtZUxvYWRlckNsaWVudC5oIgotI2luY2x1ZGUgIkZyYW1lU2Vs
ZWN0aW9uLmgiCi0jaW5jbHVkZSAiRnJhbWVUcmVlLmgiCi0jaW5jbHVkZSAiRnJhbWVWaWV3Lmgi
Ci0jaW5jbHVkZSAiR2VvbG9jYXRpb25Db250cm9sbGVyLmgiCi0jaW5jbHVkZSAiSGFzaENoYW5n
ZUV2ZW50LmgiCi0jaW5jbHVkZSAiSGlzdG9ncmFtU3VwcG9ydC5oIgotI2luY2x1ZGUgIkhpc3Rv
cnkuaCIKLSNpbmNsdWRlICJIVE1MQWxsQ29sbGVjdGlvbi5oIgotI2luY2x1ZGUgIkhUTUxBbmNo
b3JFbGVtZW50LmgiCi0jaW5jbHVkZSAiSFRNTEJvZHlFbGVtZW50LmgiCi0jaW5jbHVkZSAiSFRN
TENhbnZhc0VsZW1lbnQuaCIKLSNpbmNsdWRlICJIVE1MQ29sbGVjdGlvbi5oIgotI2luY2x1ZGUg
IkhUTUxEb2N1bWVudC5oIgotI2luY2x1ZGUgIkhUTUxFbGVtZW50RmFjdG9yeS5oIgotI2luY2x1
ZGUgIkhUTUxGcmFtZU93bmVyRWxlbWVudC5oIgotI2luY2x1ZGUgIkhUTUxIZWFkRWxlbWVudC5o
IgotI2luY2x1ZGUgIkhUTUxJRnJhbWVFbGVtZW50LmgiCiAjaW5jbHVkZSAiSFRNTExpbmtFbGVt
ZW50LmgiCi0jaW5jbHVkZSAiSFRNTE1hcEVsZW1lbnQuaCIKLSNpbmNsdWRlICJIVE1MTmFtZUNv
bGxlY3Rpb24uaCIKICNpbmNsdWRlICJIVE1MTmFtZXMuaCIKLSNpbmNsdWRlICJIVE1MUGFyc2Vy
SWRpb21zLmgiCiAjaW5jbHVkZSAiSFRNTFN0eWxlRWxlbWVudC5oIgotI2luY2x1ZGUgIkhUTUxU
aXRsZUVsZW1lbnQuaCIKLSNpbmNsdWRlICJIVFRQUGFyc2Vycy5oIgotI2luY2x1ZGUgIkhpdFRl
c3RSZXF1ZXN0LmgiCi0jaW5jbHVkZSAiSGl0VGVzdFJlc3VsdC5oIgotI2luY2x1ZGUgIkltYWdl
TG9hZGVyLmgiCi0jaW5jbHVkZSAiSW5zcGVjdG9yQ291bnRlcnMuaCIKLSNpbmNsdWRlICJJbnNw
ZWN0b3JJbnN0cnVtZW50YXRpb24uaCIKLSNpbmNsdWRlICJMYW5ndWFnZS5oIgotI2luY2x1ZGUg
IkxvY2FsaXplci5oIgotI2luY2x1ZGUgIkxvZ2dpbmcuaCIKLSNpbmNsdWRlICJNZWRpYVF1ZXJ5
TGlzdC5oIgotI2luY2x1ZGUgIk1lZGlhUXVlcnlNYXRjaGVyLmgiCi0jaW5jbHVkZSAiTW91c2VF
dmVudFdpdGhIaXRUZXN0UmVzdWx0cy5oIgotI2luY2x1ZGUgIk5hbWVOb2RlTGlzdC5oIgotI2lu
Y2x1ZGUgIk5hbWVkRmxvd0NvbGxlY3Rpb24uaCIKLSNpbmNsdWRlICJOZXN0aW5nTGV2ZWxJbmNy
ZW1lbnRlci5oIgotI2luY2x1ZGUgIk5ld1hNTERvY3VtZW50UGFyc2VyLmgiCi0jaW5jbHVkZSAi
Tm9kZUZpbHRlci5oIgotI2luY2x1ZGUgIk5vZGVJdGVyYXRvci5oIgotI2luY2x1ZGUgIk5vZGVS
YXJlRGF0YS5oIgotI2luY2x1ZGUgIk5vZGVXaXRoSW5kZXguaCIKICNpbmNsdWRlICJQYWdlLmgi
CiAjaW5jbHVkZSAiUGFnZUdyb3VwLmgiCi0jaW5jbHVkZSAiUGFnZVRyYW5zaXRpb25FdmVudC5o
IgotI2luY2x1ZGUgIlBsYXRmb3JtS2V5Ym9hcmRFdmVudC5oIgotI2luY2x1ZGUgIlBsdWdpbkRv
Y3VtZW50LmgiCi0jaW5jbHVkZSAiUG9pbnRlckxvY2tDb250cm9sbGVyLmgiCi0jaW5jbHVkZSAi
UG9wU3RhdGVFdmVudC5oIgogI2luY2x1ZGUgIlByb2Nlc3NpbmdJbnN0cnVjdGlvbi5oIgotI2lu
Y2x1ZGUgIlF1YWxpZmllZE5hbWUuaCIKLSNpbmNsdWRlICJSZWdpc3RlcmVkRXZlbnRMaXN0ZW5l
ci5oIgotI2luY2x1ZGUgIlJlbmRlckFyZW5hLmgiCi0jaW5jbHVkZSAiUmVuZGVyTmFtZWRGbG93
VGhyZWFkLmgiCi0jaW5jbHVkZSAiUmVuZGVyVGV4dENvbnRyb2wuaCIKLSNpbmNsdWRlICJSZW5k
ZXJWaWV3LmgiCi0jaW5jbHVkZSAiUmVuZGVyV2lkZ2V0LmgiCi0jaW5jbHVkZSAiUnVudGltZUVu
YWJsZWRGZWF0dXJlcy5oIgotI2luY2x1ZGUgIlNjaGVtZVJlZ2lzdHJ5LmgiCi0jaW5jbHVkZSAi
U2NvcGVkRXZlbnRRdWV1ZS5oIgotI2luY2x1ZGUgIlNjcmlwdENhbGxTdGFjay5oIgotI2luY2x1
ZGUgIlNjcmlwdENvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJTY3JpcHRFbGVtZW50LmgiCi0jaW5j
bHVkZSAiU2NyaXB0RXZlbnRMaXN0ZW5lci5oIgotI2luY2x1ZGUgIlNjcmlwdFJ1bm5lci5oIgot
I2luY2x1ZGUgIlNjcm9sbGluZ0Nvb3JkaW5hdG9yLmgiCi0jaW5jbHVkZSAiU2VjdXJpdHlPcmln
aW4uaCIKLSNpbmNsdWRlICJTZWN1cml0eVBvbGljeS5oIgotI2luY2x1ZGUgIlNlZ21lbnRlZFN0
cmluZy5oIgotI2luY2x1ZGUgIlNlbGVjdG9yUXVlcnkuaCIKKyNpbmNsdWRlICJTVkdOYW1lcy5o
IgorI2luY2x1ZGUgIlNWR1N0eWxlRWxlbWVudC5oIgorI2luY2x1ZGUgIlNlbGVjdG9yQ2hlY2tl
ci5oIgogI2luY2x1ZGUgIlNldHRpbmdzLmgiCi0jaW5jbHVkZSAiU2hhZG93Um9vdC5oIgotI2lu
Y2x1ZGUgIlN0YXRpY0hhc2hTZXROb2RlTGlzdC5oIgogI2luY2x1ZGUgIlN0eWxlUmVzb2x2ZXIu
aCIKICNpbmNsdWRlICJTdHlsZVNoZWV0Q29udGVudHMuaCIKICNpbmNsdWRlICJTdHlsZVNoZWV0
TGlzdC5oIgotI2luY2x1ZGUgIlRleHRSZXNvdXJjZURlY29kZXIuaCIKLSNpbmNsdWRlICJUaW1l
ci5oIgotI2luY2x1ZGUgIlRyYW5zZm9ybVNvdXJjZS5oIgotI2luY2x1ZGUgIlRyZWVXYWxrZXIu
aCIKLSNpbmNsdWRlICJVbmRvTWFuYWdlci5oIgogI2luY2x1ZGUgIlVzZXJDb250ZW50VVJMUGF0
dGVybi5oIgogI2luY2x1ZGUgIldlYkNvcmVNZW1vcnlJbnN0cnVtZW50YXRpb24uaCIKLSNpbmNs
dWRlICJXZWJLaXROYW1lZEZsb3cuaCIKLSNpbmNsdWRlICJYTUxEb2N1bWVudFBhcnNlci5oIgot
I2luY2x1ZGUgIlhNTEh0dHBSZXF1ZXN0LmgiCi0jaW5jbHVkZSAiWE1MTlNOYW1lcy5oIgotI2lu
Y2x1ZGUgIlhNTE5hbWVzLmgiCi0jaW5jbHVkZSAiWFBhdGhFdmFsdWF0b3IuaCIKLSNpbmNsdWRl
ICJYUGF0aEV4cHJlc3Npb24uaCIKLSNpbmNsdWRlICJYUGF0aE5TUmVzb2x2ZXIuaCIKLSNpbmNs
dWRlICJYUGF0aFJlc3VsdC5oIgotI2luY2x1ZGUgImh0bWxlZGl0aW5nLmgiCi0jaW5jbHVkZSA8
d3RmL0N1cnJlbnRUaW1lLmg+Ci0jaW5jbHVkZSA8d3RmL0hhc2hGdW5jdGlvbnMuaD4KLSNpbmNs
dWRlIDx3dGYvTWFpblRocmVhZC5oPgotI2luY2x1ZGUgPHd0Zi9QYXNzUmVmUHRyLmg+Ci0jaW5j
bHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgotI2luY2x1ZGUgPHd0Zi90ZXh0L1N0cmluZ0J1ZmZl
ci5oPgotCi0jaWYgRU5BQkxFKFNIQVJFRF9XT1JLRVJTKQotI2luY2x1ZGUgIlNoYXJlZFdvcmtl
clJlcG9zaXRvcnkuaCIKLSNlbmRpZgotCi0jaWYgRU5BQkxFKFhTTFQpCi0jaW5jbHVkZSAiWFNM
VFByb2Nlc3Nvci5oIgotI2VuZGlmCi0KLSNpZiBFTkFCTEUoU1ZHKQotI2luY2x1ZGUgIlNWR0Rv
Y3VtZW50RXh0ZW5zaW9ucy5oIgotI2luY2x1ZGUgIlNWR0VsZW1lbnRGYWN0b3J5LmgiCi0jaW5j
bHVkZSAiU1ZHTmFtZXMuaCIKLSNpbmNsdWRlICJTVkdTVkdFbGVtZW50LmgiCi0jaW5jbHVkZSAi
U1ZHU3R5bGVFbGVtZW50LmgiCi0jZW5kaWYKLQotI2lmIEVOQUJMRShUT1VDSF9FVkVOVFMpCi0j
aW5jbHVkZSAiVG91Y2hMaXN0LmgiCi0jZW5kaWYKLQotI2lmIEVOQUJMRShNQVRITUwpCi0jaW5j
bHVkZSAiTWF0aE1MRWxlbWVudC5oIgotI2luY2x1ZGUgIk1hdGhNTEVsZW1lbnRGYWN0b3J5Lmgi
Ci0jaW5jbHVkZSAiTWF0aE1MTmFtZXMuaCIKLSNlbmRpZgotCi0jaWYgRU5BQkxFKEZVTExTQ1JF
RU5fQVBJKQotI2luY2x1ZGUgIlJlbmRlckZ1bGxTY3JlZW4uaCIKLSNlbmRpZgotCi0jaWYgRU5B
QkxFKFJFUVVFU1RfQU5JTUFUSU9OX0ZSQU1FKQotI2luY2x1ZGUgIlJlcXVlc3RBbmltYXRpb25G
cmFtZUNhbGxiYWNrLmgiCi0jaW5jbHVkZSAiU2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyLmgi
Ci0jZW5kaWYKLQotI2lmIEVOQUJMRShNSUNST0RBVEEpCi0jaW5jbHVkZSAiTWljcm9EYXRhSXRl
bUxpc3QuaCIKLSNpbmNsdWRlICJOb2RlUmFyZURhdGEuaCIKLSNlbmRpZgotCi0jaWYgRU5BQkxF
KExJTktfUFJFUkVOREVSKQotI2luY2x1ZGUgIlByZXJlbmRlcmVyLmgiCi0jZW5kaWYKLQotI2lm
IEVOQUJMRShURVhUX0FVVE9TSVpJTkcpCi0jaW5jbHVkZSAiVGV4dEF1dG9zaXplci5oIgotI2Vu
ZGlmCi0KLSNpZiBFTkFCTEUoQ1NQX05FWFQpCi0jaW5jbHVkZSAiRE9NU2VjdXJpdHlQb2xpY3ku
aCIKLSNlbmRpZgotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotdXNpbmcgbmFtZXNwYWNlIFdURjsK
LXVzaW5nIG5hbWVzcGFjZSBVbmljb2RlOwogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIHVzaW5n
IG5hbWVzcGFjZSBIVE1MTmFtZXM7CiAKLS8vICNkZWZpbmUgSU5TVFJVTUVOVF9MQVlPVVRfU0NI
RURVTElORyAxCi0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjTWF4V3JpdGVSZWN1cnNpb25EZXB0
aCA9IDIxOwotCi0vLyBUaGlzIGFtb3VudCBvZiB0aW1lIG11c3QgaGF2ZSBlbGFwc2VkIGJlZm9y
ZSB3ZSB3aWxsIGV2ZW4gY29uc2lkZXIgc2NoZWR1bGluZyBhIGxheW91dCB3aXRob3V0IGEgZGVs
YXkuCi0vLyBGSVhNRTogRm9yIGZhc3RlciBtYWNoaW5lcyB0aGlzIHZhbHVlIGNhbiByZWFsbHkg
YmUgbG93ZXJlZCB0byAyMDAuICAyNTAgaXMgYWRlcXVhdGUsIGJ1dCBhIGxpdHRsZSBoaWdoCi0v
LyBmb3IgZHVhbCBHNXMuIDopCi1zdGF0aWMgY29uc3QgaW50IGNMYXlvdXRTY2hlZHVsZVRocmVz
aG9sZCA9IDI1MDsKLQotLy8gRE9NIExldmVsIDIgc2F5cyAobGV0dGVycyBhZGRlZCk6Ci0vLwot
Ly8gYSkgTmFtZSBzdGFydCBjaGFyYWN0ZXJzIG11c3QgaGF2ZSBvbmUgb2YgdGhlIGNhdGVnb3Jp
ZXMgTGwsIEx1LCBMbywgTHQsIE5sLgotLy8gYikgTmFtZSBjaGFyYWN0ZXJzIG90aGVyIHRoYW4g
TmFtZS1zdGFydCBjaGFyYWN0ZXJzIG11c3QgaGF2ZSBvbmUgb2YgdGhlIGNhdGVnb3JpZXMgTWMs
IE1lLCBNbiwgTG0sIG9yIE5kLgotLy8gYykgQ2hhcmFjdGVycyBpbiB0aGUgY29tcGF0aWJpbGl0
eSBhcmVhIChpLmUuIHdpdGggY2hhcmFjdGVyIGNvZGUgZ3JlYXRlciB0aGFuICN4RjkwMCBhbmQg
bGVzcyB0aGFuICN4RkZGRSkgYXJlIG5vdCBhbGxvd2VkIGluIFhNTCBuYW1lcy4KLS8vIGQpIENo
YXJhY3RlcnMgd2hpY2ggaGF2ZSBhIGZvbnQgb3IgY29tcGF0aWJpbGl0eSBkZWNvbXBvc2l0aW9u
IChpLmUuIHRob3NlIHdpdGggYSAiY29tcGF0aWJpbGl0eSBmb3JtYXR0aW5nIHRhZyIgaW4gZmll
bGQgNSBvZiB0aGUgZGF0YWJhc2UgLS0gbWFya2VkIGJ5IGZpZWxkIDUgYmVnaW5uaW5nIHdpdGgg
YSAiPCIpIGFyZSBub3QgYWxsb3dlZC4KLS8vIGUpIFRoZSBmb2xsb3dpbmcgY2hhcmFjdGVycyBh
cmUgdHJlYXRlZCBhcyBuYW1lLXN0YXJ0IGNoYXJhY3RlcnMgcmF0aGVyIHRoYW4gbmFtZSBjaGFy
YWN0ZXJzLCBiZWNhdXNlIHRoZSBwcm9wZXJ0eSBmaWxlIGNsYXNzaWZpZXMgdGhlbSBhcyBBbHBo
YWJldGljOiBbI3gwMkJCLSN4MDJDMV0sICN4MDU1OSwgI3gwNkU1LCAjeDA2RTYuCi0vLyBmKSBD
aGFyYWN0ZXJzICN4MjBERC0jeDIwRTAgYXJlIGV4Y2x1ZGVkIChpbiBhY2NvcmRhbmNlIHdpdGgg
VW5pY29kZSwgc2VjdGlvbiA1LjE0KS4KLS8vIGcpIENoYXJhY3RlciAjeDAwQjcgaXMgY2xhc3Np
ZmllZCBhcyBhbiBleHRlbmRlciwgYmVjYXVzZSB0aGUgcHJvcGVydHkgbGlzdCBzbyBpZGVudGlm
aWVzIGl0LgotLy8gaCkgQ2hhcmFjdGVyICN4MDM4NyBpcyBhZGRlZCBhcyBhIG5hbWUgY2hhcmFj
dGVyLCBiZWNhdXNlICN4MDBCNyBpcyBpdHMgY2Fub25pY2FsIGVxdWl2YWxlbnQuCi0vLyBpKSBD
aGFyYWN0ZXJzICc6JyBhbmQgJ18nIGFyZSBhbGxvd2VkIGFzIG5hbWUtc3RhcnQgY2hhcmFjdGVy
cy4KLS8vIGopIENoYXJhY3RlcnMgJy0nIGFuZCAnLicgYXJlIGFsbG93ZWQgYXMgbmFtZSBjaGFy
YWN0ZXJzLgotLy8KLS8vIEl0IGFsc28gY29udGFpbnMgY29tcGxldGUgdGFibGVzLiBJZiB3ZSBk
ZWNpZGUgaXQncyBiZXR0ZXIsIHdlIGNvdWxkIGluY2x1ZGUgdGhvc2UgaW5zdGVhZCBvZiB0aGUg
Zm9sbG93aW5nIGNvZGUuCi0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc1ZhbGlkTmFtZVN0YXJ0KFVD
aGFyMzIgYykKLXsKLSAgICAvLyBydWxlIChlKSBhYm92ZQotICAgIGlmICgoYyA+PSAweDAyQkIg
JiYgYyA8PSAweDAyQzEpIHx8IGMgPT0gMHg1NTkgfHwgYyA9PSAweDZFNSB8fCBjID09IDB4NkU2
KQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIC8vIHJ1bGUgKGkpIGFib3ZlCi0gICAgaWYg
KGMgPT0gJzonIHx8IGMgPT0gJ18nKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIC8vIHJ1
bGVzIChhKSBhbmQgKGYpIGFib3ZlCi0gICAgY29uc3QgdWludDMyX3QgbmFtZVN0YXJ0TWFzayA9
IExldHRlcl9Mb3dlcmNhc2UgfCBMZXR0ZXJfVXBwZXJjYXNlIHwgTGV0dGVyX090aGVyIHwgTGV0
dGVyX1RpdGxlY2FzZSB8IE51bWJlcl9MZXR0ZXI7Ci0gICAgaWYgKCEoVW5pY29kZTo6Y2F0ZWdv
cnkoYykgJiBuYW1lU3RhcnRNYXNrKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8g
cnVsZSAoYykgYWJvdmUKLSAgICBpZiAoYyA+PSAweEY5MDAgJiYgYyA8IDB4RkZGRSkKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gcnVsZSAoZCkgYWJvdmUKLSAgICBEZWNvbXBvc2l0
aW9uVHlwZSBkZWNvbXBUeXBlID0gZGVjb21wb3NpdGlvblR5cGUoYyk7Ci0gICAgaWYgKGRlY29t
cFR5cGUgPT0gRGVjb21wb3NpdGlvbkZvbnQgfHwgZGVjb21wVHlwZSA9PSBEZWNvbXBvc2l0aW9u
Q29tcGF0KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQot
c3RhdGljIGlubGluZSBib29sIGlzVmFsaWROYW1lUGFydChVQ2hhcjMyIGMpCi17Ci0gICAgLy8g
cnVsZXMgKGEpLCAoZSksIGFuZCAoaSkgYWJvdmUKLSAgICBpZiAoaXNWYWxpZE5hbWVTdGFydChj
KSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAvLyBydWxlcyAoZykgYW5kIChoKSBhYm92
ZQotICAgIGlmIChjID09IDB4MDBCNyB8fCBjID09IDB4MDM4NykKLSAgICAgICAgcmV0dXJuIHRy
dWU7Ci0KLSAgICAvLyBydWxlIChqKSBhYm92ZQotICAgIGlmIChjID09ICctJyB8fCBjID09ICcu
JykKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAvLyBydWxlcyAoYikgYW5kIChmKSBhYm92
ZQotICAgIGNvbnN0IHVpbnQzMl90IG90aGVyTmFtZVBhcnRNYXNrID0gTWFya19Ob25TcGFjaW5n
IHwgTWFya19FbmNsb3NpbmcgfCBNYXJrX1NwYWNpbmdDb21iaW5pbmcgfCBMZXR0ZXJfTW9kaWZp
ZXIgfCBOdW1iZXJfRGVjaW1hbERpZ2l0OwotICAgIGlmICghKFVuaWNvZGU6OmNhdGVnb3J5KGMp
ICYgb3RoZXJOYW1lUGFydE1hc2spKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBy
dWxlIChjKSBhYm92ZQotICAgIGlmIChjID49IDB4RjkwMCAmJiBjIDwgMHhGRkZFKQotICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBydWxlIChkKSBhYm92ZQotICAgIERlY29tcG9zaXRp
b25UeXBlIGRlY29tcFR5cGUgPSBkZWNvbXBvc2l0aW9uVHlwZShjKTsKLSAgICBpZiAoZGVjb21w
VHlwZSA9PSBEZWNvbXBvc2l0aW9uRm9udCB8fCBkZWNvbXBUeXBlID09IERlY29tcG9zaXRpb25D
b21wYXQpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1z
dGF0aWMgYm9vbCBzaG91bGRJbmhlcml0U2VjdXJpdHlPcmlnaW5Gcm9tT3duZXIoY29uc3QgS1VS
TCYgdXJsKQotewotICAgIC8vIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9j
dXJyZW50LXdvcmsvI29yaWdpbi0wCi0gICAgLy8KLSAgICAvLyBJZiBhIERvY3VtZW50IGhhcyB0
aGUgYWRkcmVzcyAiYWJvdXQ6YmxhbmsiCi0gICAgLy8gICAgIFRoZSBvcmlnaW4gb2YgdGhlIERv
Y3VtZW50IGlzIHRoZSBvcmlnaW4gaXQgd2FzIGFzc2lnbmVkIHdoZW4gaXRzIGJyb3dzaW5nIGNv
bnRleHQgd2FzIGNyZWF0ZWQuCi0gICAgLy8KLSAgICAvLyBOb3RlOiBXZSBnZW5lcmFsaXplIHRo
aXMgdG8gYWxsICJibGFuayIgVVJMcyBhbmQgaW52YWxpZCBVUkxzIGJlY2F1c2Ugd2UKLSAgICAv
LyB0cmVhdCBhbGwgb2YgdGhlc2UgVVJMcyBhcyBhYm91dDpibGFuay4KLSAgICAvLwotICAgIHJl
dHVybiAhdXJsLmlzVmFsaWQoKSB8fCB1cmwuaXNCbGFua1VSTCgpOwotfQotCi1zdGF0aWMgV2lk
Z2V0KiB3aWRnZXRGb3JOb2RlKE5vZGUqIGZvY3VzZWROb2RlKQotewotICAgIGlmICghZm9jdXNl
ZE5vZGUpCi0gICAgICAgIHJldHVybiAwOwotICAgIFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSBm
b2N1c2VkTm9kZS0+cmVuZGVyZXIoKTsKLSAgICBpZiAoIXJlbmRlcmVyIHx8ICFyZW5kZXJlci0+
aXNXaWRnZXQoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIHRvUmVuZGVyV2lkZ2V0
KHJlbmRlcmVyKS0+d2lkZ2V0KCk7Ci19Ci0KLXN0YXRpYyBib29sIGFjY2VwdHNFZGl0aW5nRm9j
dXMoTm9kZSogbm9kZSkKLXsKLSAgICBBU1NFUlQobm9kZSk7Ci0gICAgQVNTRVJUKG5vZGUtPnJl
bmRlcmVySXNFZGl0YWJsZSgpKTsKLQotICAgIE5vZGUqIHJvb3QgPSBub2RlLT5yb290RWRpdGFi
bGVFbGVtZW50KCk7Ci0gICAgRnJhbWUqIGZyYW1lID0gbm9kZS0+ZG9jdW1lbnQoKS0+ZnJhbWUo
KTsKLSAgICBpZiAoIWZyYW1lIHx8ICFyb290KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAg
ICByZXR1cm4gZnJhbWUtPmVkaXRvcigpLT5zaG91bGRCZWdpbkVkaXRpbmcocmFuZ2VPZkNvbnRl
bnRzKHJvb3QpLmdldCgpKTsKLX0KLQotc3RhdGljIGJvb2wgY2FuQWNjZXNzQW5jZXN0b3IoY29u
c3QgU2VjdXJpdHlPcmlnaW4qIGFjdGl2ZVNlY3VyaXR5T3JpZ2luLCBGcmFtZSogdGFyZ2V0RnJh
bWUpCi17Ci0gICAgLy8gdGFyZ2V0RnJhbWUgY2FuIGJlIDAgd2hlbiB3ZSdyZSB0cnlpbmcgdG8g
bmF2aWdhdGUgYSB0b3AtbGV2ZWwgZnJhbWUKLSAgICAvLyB0aGF0IGhhcyBhIDAgb3BlbmVyLgot
ICAgIGlmICghdGFyZ2V0RnJhbWUpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGNvbnN0
IGJvb2wgaXNMb2NhbEFjdGl2ZU9yaWdpbiA9IGFjdGl2ZVNlY3VyaXR5T3JpZ2luLT5pc0xvY2Fs
KCk7Ci0gICAgZm9yIChGcmFtZSogYW5jZXN0b3JGcmFtZSA9IHRhcmdldEZyYW1lOyBhbmNlc3Rv
ckZyYW1lOyBhbmNlc3RvckZyYW1lID0gYW5jZXN0b3JGcmFtZS0+dHJlZSgpLT5wYXJlbnQoKSkg
ewotICAgICAgICBEb2N1bWVudCogYW5jZXN0b3JEb2N1bWVudCA9IGFuY2VzdG9yRnJhbWUtPmRv
Y3VtZW50KCk7Ci0gICAgICAgIC8vIEZJWE1FOiBTaG91bGQgYmUgYW4gQVNTRVJUPyBGcmFtZXMg
c2hvdWxkIGFsd2F5IGhhdmUgZG9jdW1lbnRzLgotICAgICAgICBpZiAoIWFuY2VzdG9yRG9jdW1l
bnQpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICBjb25zdCBTZWN1cml0eU9y
aWdpbiogYW5jZXN0b3JTZWN1cml0eU9yaWdpbiA9IGFuY2VzdG9yRG9jdW1lbnQtPnNlY3VyaXR5
T3JpZ2luKCk7Ci0gICAgICAgIGlmIChhY3RpdmVTZWN1cml0eU9yaWdpbi0+Y2FuQWNjZXNzKGFu
Y2VzdG9yU2VjdXJpdHlPcmlnaW4pKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAg
IAotICAgICAgICAvLyBBbGxvdyBmaWxlIFVSTCBkZXNjZW5kYW50IG5hdmlnYXRpb24gZXZlbiB3
aGVuIGFsbG93RmlsZUFjY2Vzc0Zyb21GaWxlVVJMcyBpcyBmYWxzZS4KLSAgICAgICAgLy8gRklY
TUU6IEl0J3MgYSBiaXQgc3RyYW5nZSB0byBzcGVjaWFsLWNhc2UgbG9jYWwgb3JpZ2lucyBoZXJl
LiBTaG91bGQgd2UgYmUgZG9pbmcKLSAgICAgICAgLy8gc29tZXRoaW5nIG1vcmUgZ2VuZXJhbCBp
bnN0ZWFkPwotICAgICAgICBpZiAoaXNMb2NhbEFjdGl2ZU9yaWdpbiAmJiBhbmNlc3RvclNlY3Vy
aXR5T3JpZ2luLT5pc0xvY2FsKCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0K
LSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyB2b2lkIHByaW50TmF2aWdhdGlvbkVycm9y
TWVzc2FnZShGcmFtZSogZnJhbWUsIGNvbnN0IEtVUkwmIGFjdGl2ZVVSTCkKLXsKLSAgICAvLyBG
SVhNRTogdGhpcyBlcnJvciBtZXNzYWdlIHNob3VsZCBjb250YWluIG1vcmUgc3BlY2lmaWNzIG9m
IHdoeSB0aGUgbmF2aWdhdGlvbiBjaGFuZ2UgaXMgbm90IGFsbG93ZWQuCi0gICAgU3RyaW5nIG1l
c3NhZ2UgPSAiVW5zYWZlIEphdmFTY3JpcHQgYXR0ZW1wdCB0byBpbml0aWF0ZSBhIG5hdmlnYXRp
b24gY2hhbmdlIGZvciBmcmFtZSB3aXRoIFVSTCAiICsKLSAgICAgICAgICAgICAgICAgICAgIGZy
YW1lLT5kb2N1bWVudCgpLT51cmwoKS5zdHJpbmcoKSArICIgZnJvbSBmcmFtZSB3aXRoIFVSTCAi
ICsgYWN0aXZlVVJMLnN0cmluZygpICsgIi5cbiI7Ci0KLSAgICAvLyBGSVhNRTogc2hvdWxkIHdl
IHByaW50IHRvIHRoZSBjb25zb2xlIG9mIHRoZSBkb2N1bWVudCBwZXJmb3JtaW5nIHRoZSBuYXZp
Z2F0aW9uIGluc3RlYWQ/Ci0gICAgZnJhbWUtPmRvY3VtZW50KCktPmRvbVdpbmRvdygpLT5wcmlu
dEVycm9yTWVzc2FnZShtZXNzYWdlKTsKLX0KLQotc3RhdGljIEhhc2hTZXQ8RG9jdW1lbnQqPiog
ZG9jdW1lbnRzVGhhdE5lZWRTdHlsZVJlY2FsYyA9IDA7Ci0KLWNsYXNzIERvY3VtZW50V2Vha1Jl
ZmVyZW5jZSA6IHB1YmxpYyBUaHJlYWRTYWZlUmVmQ291bnRlZDxEb2N1bWVudFdlYWtSZWZlcmVu
Y2U+IHsKLXB1YmxpYzoKLSAgICBzdGF0aWMgUGFzc1JlZlB0cjxEb2N1bWVudFdlYWtSZWZlcmVu
Y2U+IGNyZWF0ZShEb2N1bWVudCogZG9jdW1lbnQpCi0gICAgewotICAgICAgICByZXR1cm4gYWRv
cHRSZWYobmV3IERvY3VtZW50V2Vha1JlZmVyZW5jZShkb2N1bWVudCkpOwotICAgIH0KLQotICAg
IERvY3VtZW50KiBkb2N1bWVudCgpCi0gICAgewotICAgICAgICBBU1NFUlQoaXNNYWluVGhyZWFk
KCkpOwotICAgICAgICByZXR1cm4gbV9kb2N1bWVudDsKLSAgICB9Ci0KLSAgICB2b2lkIGNsZWFy
KCkKLSAgICB7Ci0gICAgICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7Ci0gICAgICAgIG1fZG9j
dW1lbnQgPSAwOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBEb2N1bWVudFdlYWtSZWZlcmVuY2Uo
RG9jdW1lbnQqIGRvY3VtZW50KQotICAgICAgICA6IG1fZG9jdW1lbnQoZG9jdW1lbnQpCi0gICAg
ewotICAgICAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOwotICAgIH0KLQotICAgIERvY3VtZW50
KiBtX2RvY3VtZW50OwotfTsKLQotdWludDY0X3QgRG9jdW1lbnQ6OnNfZ2xvYmFsVHJlZVZlcnNp
b24gPSAwOwotCi1Eb2N1bWVudDo6RG9jdW1lbnQoRnJhbWUqIGZyYW1lLCBjb25zdCBLVVJMJiB1
cmwsIGJvb2wgaXNYSFRNTCwgYm9vbCBpc0hUTUwpCi0gICAgOiBDb250YWluZXJOb2RlKDAsIENy
ZWF0ZURvY3VtZW50KQotICAgICwgVHJlZVNjb3BlKHRoaXMpCi0gICAgLCBtX2d1YXJkUmVmQ291
bnQoMCkKLSAgICAsIG1fY29udGV4dEZlYXR1cmVzKENvbnRleHRGZWF0dXJlczo6ZGVmYXVsdFN3
aXRjaCgpKQotICAgICwgbV9jb21wYXRpYmlsaXR5TW9kZShOb1F1aXJrc01vZGUpCi0gICAgLCBt
X2NvbXBhdGliaWxpdHlNb2RlTG9ja2VkKGZhbHNlKQotICAgICwgbV9kb21UcmVlVmVyc2lvbigr
K3NfZ2xvYmFsVHJlZVZlcnNpb24pCi0jaWYgRU5BQkxFKE1VVEFUSU9OX09CU0VSVkVSUykKLSAg
ICAsIG1fbXV0YXRpb25PYnNlcnZlclR5cGVzKDApCi0jZW5kaWYKLSAgICAsIG1fc3R5bGVTaGVl
dHMoU3R5bGVTaGVldExpc3Q6OmNyZWF0ZSh0aGlzKSkKK0RvY3VtZW50U3R5bGVTaGVldENvbGxl
Y3Rpb246OkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24oRG9jdW1lbnQqIGRvY3VtZW50KQor
ICAgIDogbV9kb2N1bWVudChkb2N1bWVudCkKKyAgICAsIG1fYXV0aG9yU3R5bGVTaGVldHMoU3R5
bGVTaGVldExpc3Q6OmNyZWF0ZShkb2N1bWVudCkpCisgICAgLCBtX3BlbmRpbmdTdHlsZXNoZWV0
cygwKQorICAgICwgbV9wYWdlR3JvdXBVc2VyU2hlZXRDYWNoZVZhbGlkKGZhbHNlKQogICAgICwg
bV9oYWRBY3RpdmVMb2FkaW5nU3R5bGVzaGVldChmYWxzZSkKLSAgICAsIG1fcmVhZHlTdGF0ZShD
b21wbGV0ZSkKLSAgICAsIG1fc3R5bGVSZWNhbGNUaW1lcih0aGlzLCAmRG9jdW1lbnQ6OnN0eWxl
UmVjYWxjVGltZXJGaXJlZCkKLSAgICAsIG1fcGVuZGluZ1N0eWxlUmVjYWxjU2hvdWxkRm9yY2Uo
ZmFsc2UpCi0gICAgLCBtX2ZyYW1lRWxlbWVudHNTaG91bGRJZ25vcmVTY3JvbGxpbmcoZmFsc2Up
Ci0gICAgLCBtX2NvbnRhaW5zVmFsaWRpdHlTdHlsZVJ1bGVzKGZhbHNlKQotICAgICwgbV91cGRh
dGVGb2N1c0FwcGVhcmFuY2VSZXN0b3Jlc1NlbGVjdGlvbihmYWxzZSkKLSAgICAsIG1faWdub3Jl
RGVzdHJ1Y3RpdmVXcml0ZUNvdW50KDApCi0gICAgLCBtX3RpdGxlU2V0RXhwbGljaXRseShmYWxz
ZSkKLSAgICAsIG1fdXBkYXRlRm9jdXNBcHBlYXJhbmNlVGltZXIodGhpcywgJkRvY3VtZW50Ojp1
cGRhdGVGb2N1c0FwcGVhcmFuY2VUaW1lckZpcmVkKQotICAgICwgbV9sb2FkRXZlbnRGaW5pc2hl
ZChmYWxzZSkKLSAgICAsIG1fc3RhcnRUaW1lKGN1cnJlbnRUaW1lKCkpCi0gICAgLCBtX292ZXJN
aW5pbXVtTGF5b3V0VGhyZXNob2xkKGZhbHNlKQotICAgICwgbV9zY3JpcHRSdW5uZXIoU2NyaXB0
UnVubmVyOjpjcmVhdGUodGhpcykpCi0gICAgLCBtX3htbFZlcnNpb24oIjEuMCIpCi0gICAgLCBt
X3htbFN0YW5kYWxvbmUoU3RhbmRhbG9uZVVuc3BlY2lmaWVkKQotICAgICwgbV9oYXNYTUxEZWNs
YXJhdGlvbigwKQotICAgICwgbV9zYXZlZFJlbmRlcmVyKDApCi0gICAgLCBtX2Rlc2lnbk1vZGUo
aW5oZXJpdCkKLSNpZiBFTkFCTEUoREFTSEJPQVJEX1NVUFBPUlQpIHx8IEVOQUJMRShXSURHRVRf
UkVHSU9OKQotICAgICwgbV9oYXNEYXNoYm9hcmRSZWdpb25zKGZhbHNlKQotICAgICwgbV9kYXNo
Ym9hcmRSZWdpb25zRGlydHkoZmFsc2UpCi0jZW5kaWYKLSAgICAsIG1fY3JlYXRlUmVuZGVyZXJz
KHRydWUpCi0gICAgLCBtX2luUGFnZUNhY2hlKGZhbHNlKQotICAgICwgbV9hY2Nlc3NLZXlNYXBW
YWxpZChmYWxzZSkKLSAgICAsIG1fdXNlU2VjdXJlS2V5Ym9hcmRFbnRyeVdoZW5BY3RpdmUoZmFs
c2UpCi0gICAgLCBtX2lzWEhUTUwoaXNYSFRNTCkKLSAgICAsIG1faXNIVE1MKGlzSFRNTCkKLSAg
ICAsIG1faXNWaWV3U291cmNlKGZhbHNlKQotICAgICwgbV9zYXdFbGVtZW50c0luS25vd25OYW1l
c3BhY2VzKGZhbHNlKQotICAgICwgbV9pc1NyY2RvY0RvY3VtZW50KGZhbHNlKQotICAgICwgbV9k
b2N1bWVudFJhcmVEYXRhKDApCi0gICAgLCBtX2V2ZW50UXVldWUoRG9jdW1lbnRFdmVudFF1ZXVl
OjpjcmVhdGUodGhpcykpCi0gICAgLCBtX3dlYWtSZWZlcmVuY2UoRG9jdW1lbnRXZWFrUmVmZXJl
bmNlOjpjcmVhdGUodGhpcykpCi0gICAgLCBtX2lkQXR0cmlidXRlTmFtZShpZEF0dHIpCi0jaWYg
RU5BQkxFKEZVTExTQ1JFRU5fQVBJKQotICAgICwgbV9hcmVLZXlzRW5hYmxlZEluRnVsbFNjcmVl
bigwKQotICAgICwgbV9mdWxsU2NyZWVuUmVuZGVyZXIoMCkKLSAgICAsIG1fZnVsbFNjcmVlbkNo
YW5nZURlbGF5VGltZXIodGhpcywgJkRvY3VtZW50OjpmdWxsU2NyZWVuQ2hhbmdlRGVsYXlUaW1l
ckZpcmVkKQotICAgICwgbV9pc0FuaW1hdGluZ0Z1bGxTY3JlZW4oZmFsc2UpCi0jZW5kaWYKLSAg
ICAsIG1fbG9hZEV2ZW50RGVsYXlDb3VudCgwKQotICAgICwgbV9sb2FkRXZlbnREZWxheVRpbWVy
KHRoaXMsICZEb2N1bWVudDo6bG9hZEV2ZW50RGVsYXlUaW1lckZpcmVkKQotICAgICwgbV9yZWZl
cnJlclBvbGljeShSZWZlcnJlclBvbGljeURlZmF1bHQpCi0gICAgLCBtX2RpcmVjdGlvblNldE9u
RG9jdW1lbnRFbGVtZW50KGZhbHNlKQotICAgICwgbV93cml0aW5nTW9kZVNldE9uRG9jdW1lbnRF
bGVtZW50KGZhbHNlKQotICAgICwgbV93cml0ZVJlY3Vyc2lvbklzVG9vRGVlcChmYWxzZSkKLSAg
ICAsIG1fd3JpdGVSZWN1cnNpb25EZXB0aCgwKQotICAgICwgbV93aGVlbEV2ZW50SGFuZGxlckNv
dW50KDApCi0jaWYgRU5BQkxFKFRPVUNIX0VWRU5UUykKLSAgICAsIG1fdG91Y2hFdmVudEhhbmRs
ZXJDb3VudCgwKQotI2VuZGlmCi0jaWYgRU5BQkxFKFVORE9fTUFOQUdFUikKLSAgICAsIG1fdW5k
b01hbmFnZXIoMCkKLSNlbmRpZgotICAgICwgbV9wZW5kaW5nVGFza3NUaW1lcih0aGlzLCAmRG9j
dW1lbnQ6OnBlbmRpbmdUYXNrc1RpbWVyRmlyZWQpCi0gICAgLCBtX3NjaGVkdWxlZFRhc2tzQXJl
U3VzcGVuZGVkKGZhbHNlKQotICAgICwgbV92aXN1YWxVcGRhdGVzQWxsb3dlZCh0cnVlKQotICAg
ICwgbV92aXN1YWxVcGRhdGVzU3VwcHJlc3Npb25UaW1lcih0aGlzLCAmRG9jdW1lbnQ6OnZpc3Vh
bFVwZGF0ZXNTdXBwcmVzc2lvblRpbWVyRmlyZWQpCi0jaWZuZGVmIE5ERUJVRwotICAgICwgbV9k
aWREaXNwYXRjaFZpZXdwb3J0UHJvcGVydGllc0NoYW5nZWQoZmFsc2UpCi0jZW5kaWYKLXsKLSAg
ICBtX2RvY3VtZW50ID0gdGhpczsKLQotICAgIG1fcGFnZUdyb3VwVXNlclNoZWV0Q2FjaGVWYWxp
ZCA9IGZhbHNlOwotCi0gICAgbV9wcmludGluZyA9IGZhbHNlOwotICAgIG1fcGFnaW5hdGVkRm9y
U2NyZWVuID0gZmFsc2U7Ci0KLSAgICBtX2lnbm9yZUF1dG9mb2N1cyA9IGZhbHNlOwotCi0gICAg
bV9mcmFtZSA9IGZyYW1lOwotICAgIGlmIChtX2ZyYW1lKQotICAgICAgICBwcm92aWRlQ29udGV4
dEZlYXR1cmVzVG9Eb2N1bWVudEZyb20odGhpcywgbV9mcmFtZS0+cGFnZSgpKTsKLQotICAgIC8v
IFdlIGRlcGVuZCBvbiB0aGUgdXJsIGdldHRpbmcgaW1tZWRpYXRlbHkgc2V0IGluIHN1YmZyYW1l
cywgYnV0IHdlCi0gICAgLy8gYWxzbyBkZXBlbmQgb24gdGhlIHVybCBOT1QgZ2V0dGluZyBpbW1l
ZGlhdGVseSBzZXQgaW4gb3BlbmVkIHdpbmRvd3MuCi0gICAgLy8gU2VlIGZhc3QvZG9tL2Vhcmx5
LWZyYW1lLXVybC5odG1sCi0gICAgLy8gYW5kIGZhc3QvZG9tL2xvY2F0aW9uLW5ldy13aW5kb3ct
bm8tY3Jhc2guaHRtbCwgcmVzcGVjdGl2ZWx5LgotICAgIC8vIEZJWE1FOiBDYW4vc2hvdWxkIHdl
IHVuaWZ5IHRoaXMgYmVoYXZpb3I/Ci0gICAgaWYgKChmcmFtZSAmJiBmcmFtZS0+b3duZXJFbGVt
ZW50KCkpIHx8ICF1cmwuaXNFbXB0eSgpKQotICAgICAgICBzZXRVUkwodXJsKTsKLQotICAgIG1f
YXhPYmplY3RDYWNoZSA9IDA7Ci0KLSAgICBtX21hcmtlcnMgPSBhZG9wdFB0cihuZXcgRG9jdW1l
bnRNYXJrZXJDb250cm9sbGVyKTsKLQotICAgIG1fY2FjaGVkUmVzb3VyY2VMb2FkZXIgPSBhZG9w
dFB0cihuZXcgQ2FjaGVkUmVzb3VyY2VMb2FkZXIodGhpcykpOwotI2lmIEVOQUJMRShMSU5LX1BS
RVJFTkRFUikKLSAgICBtX3ByZXJlbmRlcmVyID0gUHJlcmVuZGVyZXI6OmNyZWF0ZSh0aGlzKTsK
LSNlbmRpZgotI2lmIEVOQUJMRShURVhUX0FVVE9TSVpJTkcpCi0gICAgbV90ZXh0QXV0b3NpemVy
ID0gVGV4dEF1dG9zaXplcjo6Y3JlYXRlKHRoaXMpOwotI2VuZGlmCi0gICAgbV92aXN1YWxseU9y
ZGVyZWQgPSBmYWxzZTsKLSAgICBtX2JQYXJzaW5nID0gZmFsc2U7Ci0gICAgbV93ZWxsRm9ybWVk
ID0gZmFsc2U7Ci0KLSAgICBtX3RleHRDb2xvciA9IENvbG9yOjpibGFjazsKLSAgICBtX2xpc3Rl
bmVyVHlwZXMgPSAwOwotICAgIG1faW5TdHlsZVJlY2FsYyA9IGZhbHNlOwotICAgIG1fY2xvc2VB
ZnRlclN0eWxlUmVjYWxjID0gZmFsc2U7Ci0KLSAgICBtX3VzZXNTaWJsaW5nUnVsZXMgPSBmYWxz
ZTsKLSAgICBtX3VzZXNTaWJsaW5nUnVsZXNPdmVycmlkZSA9IGZhbHNlOwotICAgIG1fdXNlc0Zp
cnN0TGluZVJ1bGVzID0gZmFsc2U7Ci0gICAgbV91c2VzRmlyc3RMZXR0ZXJSdWxlcyA9IGZhbHNl
OwotICAgIG1fdXNlc0JlZm9yZUFmdGVyUnVsZXMgPSBmYWxzZTsKLSAgICBtX3VzZXNCZWZvcmVB
ZnRlclJ1bGVzT3ZlcnJpZGUgPSBmYWxzZTsKLSAgICBtX3VzZXNSZW1Vbml0cyA9IGZhbHNlOwot
ICAgIG1fdXNlc0xpbmtSdWxlcyA9IGZhbHNlOwotCi0gICAgbV9nb3RvQW5jaG9yTmVlZGVkQWZ0
ZXJTdHlsZXNoZWV0c0xvYWQgPSBmYWxzZTsKLQotICAgIG1fZGlkQ2FsY3VsYXRlU3R5bGVSZXNv
bHZlciA9IGZhbHNlOwotICAgIG1faGFzRGlydHlTdHlsZVJlc29sdmVyID0gZmFsc2U7Ci0gICAg
bV9wZW5kaW5nU3R5bGVzaGVldHMgPSAwOwotICAgIG1faWdub3JlUGVuZGluZ1N0eWxlc2hlZXRz
ID0gZmFsc2U7Ci0gICAgbV9uZWVkc05vdGlmeVJlbW92ZUFsbFBlbmRpbmdTdHlsZXNoZWV0ID0g
ZmFsc2U7Ci0gICAgbV9oYXNOb2Rlc1dpdGhQbGFjZWhvbGRlclN0eWxlID0gZmFsc2U7Ci0gICAg
bV9wZW5kaW5nU2hlZXRMYXlvdXQgPSBOb0xheW91dFdpdGhQZW5kaW5nU2hlZXRzOwotCi0gICAg
bV9jc3NUYXJnZXQgPSAwOwotCi0gICAgcmVzZXRMaW5rQ29sb3IoKTsKLSAgICByZXNldFZpc2l0
ZWRMaW5rQ29sb3IoKTsKLSAgICByZXNldEFjdGl2ZUxpbmtDb2xvcigpOwotCi0gICAgbV9wcm9j
ZXNzaW5nTG9hZEV2ZW50ID0gZmFsc2U7Ci0gICAgCi0gICAgaW5pdFNlY3VyaXR5Q29udGV4dCgp
OwotICAgIGluaXRETlNQcmVmZXRjaCgpOwotCi0gICAgc3RhdGljIGludCBkb2NJRCA9IDA7Ci0g
ICAgbV9kb2NJRCA9IGRvY0lEKys7Ci0KLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgV1RG
X0FSUkFZX0xFTkdUSChtX25vZGVMaXN0Q291bnRzKTsgaSsrKQotICAgICAgICBtX25vZGVMaXN0
Q291bnRzW2ldID0gMDsKLQotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBXVEZfQVJSQVlf
TEVOR1RIKG1fY29sbGVjdGlvbnMpOyBpKyspCi0gICAgICAgIG1fY29sbGVjdGlvbnNbaV0gPSAw
OwotCi0gICAgSW5zcGVjdG9yQ291bnRlcnM6OmluY3JlbWVudENvdW50ZXIoSW5zcGVjdG9yQ291
bnRlcnM6OkRvY3VtZW50Q291bnRlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIGhpc3RvZ3JhbU11dGF0
aW9uRXZlbnRVc2FnZShjb25zdCB1bnNpZ25lZCBzaG9ydCYgbGlzdGVuZXJUeXBlcykKLXsKLSAg
ICBIaXN0b2dyYW1TdXBwb3J0OjpoaXN0b2dyYW1FbnVtZXJhdGlvbigiRE9NQVBJLlBlckRvY3Vt
ZW50TXV0YXRpb25FdmVudFVzYWdlLkRPTVN1YnRyZWVNb2RpZmllZCIsIHN0YXRpY19jYXN0PGJv
b2w+KGxpc3RlbmVyVHlwZXMgJiBEb2N1bWVudDo6RE9NU1VCVFJFRU1PRElGSUVEX0xJU1RFTkVS
KSwgMik7Ci0gICAgSGlzdG9ncmFtU3VwcG9ydDo6aGlzdG9ncmFtRW51bWVyYXRpb24oIkRPTUFQ
SS5QZXJEb2N1bWVudE11dGF0aW9uRXZlbnRVc2FnZS5ET01Ob2RlSW5zZXJ0ZWQiLCBzdGF0aWNf
Y2FzdDxib29sPihsaXN0ZW5lclR5cGVzICYgRG9jdW1lbnQ6OkRPTU5PREVJTlNFUlRFRF9MSVNU
RU5FUiksIDIpOwotICAgIEhpc3RvZ3JhbVN1cHBvcnQ6Omhpc3RvZ3JhbUVudW1lcmF0aW9uKCJE
T01BUEkuUGVyRG9jdW1lbnRNdXRhdGlvbkV2ZW50VXNhZ2UuRE9NTm9kZVJlbW92ZWQiLCBzdGF0
aWNfY2FzdDxib29sPihsaXN0ZW5lclR5cGVzICYgRG9jdW1lbnQ6OkRPTU5PREVSRU1PVkVEX0xJ
U1RFTkVSKSwgMik7Ci0gICAgSGlzdG9ncmFtU3VwcG9ydDo6aGlzdG9ncmFtRW51bWVyYXRpb24o
IkRPTUFQSS5QZXJEb2N1bWVudE11dGF0aW9uRXZlbnRVc2FnZS5ET01Ob2RlUmVtb3ZlZEZyb21E
b2N1bWVudCIsIHN0YXRpY19jYXN0PGJvb2w+KGxpc3RlbmVyVHlwZXMgJiBEb2N1bWVudDo6RE9N
Tk9ERVJFTU9WRURGUk9NRE9DVU1FTlRfTElTVEVORVIpLCAyKTsKLSAgICBIaXN0b2dyYW1TdXBw
b3J0OjpoaXN0b2dyYW1FbnVtZXJhdGlvbigiRE9NQVBJLlBlckRvY3VtZW50TXV0YXRpb25FdmVu
dFVzYWdlLkRPTU5vZGVJbnNlcnRlZEludG9Eb2N1bWVudCIsIHN0YXRpY19jYXN0PGJvb2w+KGxp
c3RlbmVyVHlwZXMgJiBEb2N1bWVudDo6RE9NTk9ERUlOU0VSVEVESU5UT0RPQ1VNRU5UX0xJU1RF
TkVSKSwgMik7Ci0gICAgSGlzdG9ncmFtU3VwcG9ydDo6aGlzdG9ncmFtRW51bWVyYXRpb24oIkRP
TUFQSS5QZXJEb2N1bWVudE11dGF0aW9uRXZlbnRVc2FnZS5ET01DaGFyYWN0ZXJEYXRhTW9kaWZp
ZWQiLCBzdGF0aWNfY2FzdDxib29sPihsaXN0ZW5lclR5cGVzICYgRG9jdW1lbnQ6OkRPTUNIQVJB
Q1RFUkRBVEFNT0RJRklFRF9MSVNURU5FUiksIDIpOwotfQotCi0jaWYgRU5BQkxFKEZVTExTQ1JF
RU5fQVBJKQotc3RhdGljIGJvb2wgaXNBdHRyaWJ1dGVPbkFsbE93bmVycyhjb25zdCBXZWJDb3Jl
OjpRdWFsaWZpZWROYW1lJiBhdHRyaWJ1dGUsIGNvbnN0IEhUTUxGcmFtZU93bmVyRWxlbWVudCog
b3duZXIpCisgICAgLCBtX25lZWRzVXBkYXRlQWN0aXZlU3R5bGVzaGVldHNPblN0eWxlUmVjYWxj
KGZhbHNlKQorICAgICwgbV91c2VzU2libGluZ1J1bGVzKGZhbHNlKQorICAgICwgbV91c2VzU2li
bGluZ1J1bGVzT3ZlcnJpZGUoZmFsc2UpCisgICAgLCBtX3VzZXNGaXJzdExpbmVSdWxlcyhmYWxz
ZSkKKyAgICAsIG1fdXNlc0ZpcnN0TGV0dGVyUnVsZXMoZmFsc2UpCisgICAgLCBtX3VzZXNCZWZv
cmVBZnRlclJ1bGVzKGZhbHNlKQorICAgICwgbV91c2VzQmVmb3JlQWZ0ZXJSdWxlc092ZXJyaWRl
KGZhbHNlKQorICAgICwgbV91c2VzUmVtVW5pdHMoZmFsc2UpCiB7Ci0gICAgaWYgKCFvd25lcikK
LSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZG8gewotICAgICAgICBpZiAoIW93bmVyLT5oYXNB
dHRyaWJ1dGUoYXR0cmlidXRlKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IHdo
aWxlICgob3duZXIgPSBvd25lci0+ZG9jdW1lbnQoKS0+b3duZXJFbGVtZW50KCkpKTsKLSAgICBy
ZXR1cm4gdHJ1ZTsKIH0KLSNlbmRpZgogCi1Eb2N1bWVudDo6fkRvY3VtZW50KCkKK0RvY3VtZW50
U3R5bGVTaGVldENvbGxlY3Rpb246On5Eb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uKCkKIHsK
LSAgICBBU1NFUlQoIXJlbmRlcmVyKCkpOwotICAgIEFTU0VSVCghbV9pblBhZ2VDYWNoZSk7Ci0g
ICAgQVNTRVJUKCFtX3NhdmVkUmVuZGVyZXIpOwotICAgIEFTU0VSVChtX3Jhbmdlcy5pc0VtcHR5
KCkpOwotICAgIEFTU0VSVCghbV9zdHlsZVJlY2FsY1RpbWVyLmlzQWN0aXZlKCkpOwotICAgIEFT
U0VSVCghbV9wYXJlbnRUcmVlU2NvcGUpOwotICAgIEFTU0VSVCghbV9ndWFyZFJlZkNvdW50KTsK
LQotICAgIC8vIEZJWE1FOiBTaG91bGQgd2UgcmVzZXQgbV9kb21XaW5kb3cgd2hlbiB3ZSBkZXRh
Y2ggZnJvbSB0aGUgRnJhbWU/Ci0gICAgaWYgKG1fZG9tV2luZG93KQotICAgICAgICBtX2RvbVdp
bmRvdy0+cmVzZXRVbmxlc3NTdXNwZW5kZWRGb3JQYWdlQ2FjaGUoKTsKLQotICAgIG1fc2NyaXB0
UnVubmVyLmNsZWFyKCk7Ci0KLSAgICBoaXN0b2dyYW1NdXRhdGlvbkV2ZW50VXNhZ2UobV9saXN0
ZW5lclR5cGVzKTsKLQotICAgIHJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzKCk7CisgICAgbV9hdXRo
b3JTdHlsZVNoZWV0cy0+ZG9jdW1lbnREZXN0cm95ZWQoKTsKIAotICAgIC8vIEN1cnJlbnRseSB3
ZSBiZWxpZXZlIHRoYXQgRG9jdW1lbnQgY2FuIG5ldmVyIG91dGxpdmUgdGhlIHBhcnNlci4KLSAg
ICAvLyBBbHRob3VnaCB0aGUgRG9jdW1lbnQgbWF5IGJlIHJlcGxhY2VkIHN5bmNocm9ub3VzbHks
IERvY3VtZW50UGFyc2VycwotICAgIC8vIGdlbmVyYWxseSBrZWVwIGF0IGxlYXN0IG9uZSByZWZl
cmVuY2UgdG8gYW4gRWxlbWVudCB3aGljaCB3b3VsZCBpbiB0dXJuCi0gICAgLy8gaGFzIGEgcmVm
ZXJlbmNlIHRvIHRoZSBEb2N1bWVudC4gIElmIHlvdSBoaXQgdGhpcyBBU1NFUlQsIHRoZW4gdGhh
dAotICAgIC8vIGFzc3VtcHRpb24gaXMgd3JvbmcuICBEb2N1bWVudFBhcnNlcjo6ZGV0YWNoKCkg
c2hvdWxkIGVuc3VyZSB0aGF0IGV2ZW4KLSAgICAvLyBpZiB0aGUgRG9jdW1lbnRQYXJzZXIgb3V0
bGl2ZXMgdGhlIERvY3VtZW50IGl0IHdvbid0IGNhdXNlIGJhZG5lc3MuCi0gICAgQVNTRVJUKCFt
X3BhcnNlciB8fCBtX3BhcnNlci0+cmVmQ291bnQoKSA9PSAxKTsKLSAgICBkZXRhY2hQYXJzZXIo
KTsKLQotICAgIG1fcmVuZGVyQXJlbmEuY2xlYXIoKTsKLQotICAgIGNsZWFyQVhPYmplY3RDYWNo
ZSgpOwotCi0gICAgbV9kZWNvZGVyID0gMDsKLQotICAgIGlmIChtX3N0eWxlU2hlZXRzKQotICAg
ICAgICBtX3N0eWxlU2hlZXRzLT5kb2N1bWVudERlc3Ryb3llZCgpOwotCi0gICAgaWYgKG1fbmFt
ZWRGbG93cykKLSAgICAgICAgbV9uYW1lZEZsb3dzLT5kb2N1bWVudERlc3Ryb3llZCgpOwotCi0g
ICAgaWYgKG1fZWxlbVNoZWV0KQotICAgICAgICBtX2VsZW1TaGVldC0+Y2xlYXJPd25lck5vZGUo
KTsKICAgICBpZiAobV9wYWdlVXNlclNoZWV0KQogICAgICAgICBtX3BhZ2VVc2VyU2hlZXQtPmNs
ZWFyT3duZXJOb2RlKCk7CiAgICAgaWYgKG1fcGFnZUdyb3VwVXNlclNoZWV0cykgewpAQCAtNjYx
LDU3MzMgKzgyLDQwNiBAQCBEb2N1bWVudDo6fkRvY3VtZW50KCkKICAgICAgICAgZm9yIChzaXpl
X3QgaSA9IDA7IGkgPCBtX3VzZXJTaGVldHMtPnNpemUoKTsgKytpKQogICAgICAgICAgICAgKCpt
X3VzZXJTaGVldHMpW2ldLT5jbGVhck93bmVyTm9kZSgpOwogICAgIH0KLQotICAgIGRlbGV0ZUN1
c3RvbUZvbnRzKCk7Ci0KLSAgICBtX3dlYWtSZWZlcmVuY2UtPmNsZWFyKCk7Ci0KLSAgICBpZiAo
bV9tZWRpYVF1ZXJ5TWF0Y2hlcikKLSAgICAgICAgbV9tZWRpYVF1ZXJ5TWF0Y2hlci0+ZG9jdW1l
bnREZXN0cm95ZWQoKTsKLQotICAgIGNsZWFyU3R5bGVSZXNvbHZlcigpOyAvLyBXZSBuZWVkIHRv
IGRlc3RvcnkgQ1NTRm9udFNlbGVjdG9yIGJlZm9yZSBkZXN0cm95aW5nIG1fY2FjaGVkUmVzb3Vy
Y2VMb2FkZXIuCi0gICAgbV9jYWNoZWRSZXNvdXJjZUxvYWRlci5jbGVhcigpOwotCi0gICAgLy8g
V2UgbXVzdCBjYWxsIGNsZWFyUmFyZURhdGEoKSBoZXJlIHNpbmNlIGEgRG9jdW1lbnQgY2xhc3Mg
aW5oZXJpdHMgVHJlZVNjb3BlCi0gICAgLy8gYXMgd2VsbCBhcyBOb2RlLiBTZWUgYSBjb21tZW50
IG9uIFRyZWVTY29wZS5oIGZvciB0aGUgcmVhc29uLgotICAgIGlmIChoYXNSYXJlRGF0YSgpKQot
ICAgICAgICBjbGVhclJhcmVEYXRhKCk7Ci0KLSAgICBBU1NFUlQoIW1fbGlzdHNJbnZhbGlkYXRl
ZEF0RG9jdW1lbnQuc2l6ZSgpKTsKLQotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBXVEZf
QVJSQVlfTEVOR1RIKG1fbm9kZUxpc3RDb3VudHMpOyBpKyspCi0gICAgICAgIEFTU0VSVCghbV9u
b2RlTGlzdENvdW50c1tpXSk7Ci0KLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgV1RGX0FS
UkFZX0xFTkdUSChtX2NvbGxlY3Rpb25zKTsgaSsrKQotICAgICAgICBBU1NFUlQoIW1fY29sbGVj
dGlvbnNbaV0pOwotCi0gICAgbV9kb2N1bWVudCA9IDA7Ci0KLSAgICBJbnNwZWN0b3JDb3VudGVy
czo6ZGVjcmVtZW50Q291bnRlcihJbnNwZWN0b3JDb3VudGVyczo6RG9jdW1lbnRDb3VudGVyKTsK
IH0KIAotdm9pZCBEb2N1bWVudDo6cmVtb3ZlZExhc3RSZWYoKQordm9pZCBEb2N1bWVudFN0eWxl
U2hlZXRDb2xsZWN0aW9uOjpjb21iaW5lQ1NTRmVhdHVyZUZsYWdzKCkKIHsKLSAgICBBU1NFUlQo
IW1fZGVsZXRpb25IYXNCZWd1bik7Ci0gICAgaWYgKG1fZ3VhcmRSZWZDb3VudCkgewotICAgICAg
ICAvLyBJZiByZW1vdmluZyBhIGNoaWxkIHJlbW92ZXMgdGhlIGxhc3Qgc2VsZi1vbmx5IHJlZiwg
d2UgZG9uJ3QKLSAgICAgICAgLy8gd2FudCB0aGUgc2NvcGUgdG8gYmUgZGVzdHJ1Y3RlZCB1bnRp
bCBhZnRlcgotICAgICAgICAvLyByZW1vdmVBbGxDaGlsZHJlbiByZXR1cm5zLCBzbyB3ZSBndWFy
ZCBvdXJzZWx2ZXMgd2l0aCBhbgotICAgICAgICAvLyBleHRyYSBzZWxmLW9ubHkgcmVmLgotICAg
ICAgICBndWFyZFJlZigpOwotCi0gICAgICAgIC8vIFdlIG11c3QgbWFrZSBzdXJlIG5vdCB0byBi
ZSByZXRhaW5pbmcgYW55IG9mIG91ciBjaGlsZHJlbiB0aHJvdWdoCi0gICAgICAgIC8vIHRoZXNl
IGV4dHJhIHBvaW50ZXJzIG9yIHdlIHdpbGwgY3JlYXRlIGEgcmVmZXJlbmNlIGN5Y2xlLgotICAg
ICAgICBtX2RvY1R5cGUgPSAwOwotICAgICAgICBtX2ZvY3VzZWROb2RlID0gMDsKLSAgICAgICAg
bV9ob3Zlck5vZGUgPSAwOwotICAgICAgICBtX2FjdGl2ZU5vZGUgPSAwOwotICAgICAgICBtX3Rp
dGxlRWxlbWVudCA9IDA7Ci0gICAgICAgIG1fZG9jdW1lbnRFbGVtZW50ID0gMDsKLSAgICAgICAg
bV9jb250ZXh0RmVhdHVyZXMgPSBDb250ZXh0RmVhdHVyZXM6OmRlZmF1bHRTd2l0Y2goKTsKLSNp
ZiBFTkFCTEUoRlVMTFNDUkVFTl9BUEkpCi0gICAgICAgIG1fZnVsbFNjcmVlbkVsZW1lbnQgPSAw
OwotICAgICAgICBtX2Z1bGxTY3JlZW5FbGVtZW50U3RhY2suY2xlYXIoKTsKLSNlbmRpZgotCi0g
ICAgICAgIGRldGFjaFBhcnNlcigpOwotCi0gICAgICAgIC8vIHJlbW92ZUFsbENoaWxkcmVuKCkg
ZG9lc24ndCBhbHdheXMgdW5yZWdpc3RlciBJRHMsCi0gICAgICAgIC8vIHNvIHRlYXIgZG93biBz
Y29wZSBpbmZvcm1hdGlvbiB1cGZyb250IHRvIGF2b2lkIGhhdmluZyBzdGFsZSByZWZlcmVuY2Vz
IGluIHRoZSBtYXAuCi0gICAgICAgIGRlc3Ryb3lUcmVlU2NvcGVEYXRhKCk7Ci0gICAgICAgIHJl
bW92ZUFsbENoaWxkcmVuKCk7Ci0KLSAgICAgICAgbV9tYXJrZXJzLT5kZXRhY2goKTsKLQotICAg
ICAgICBtX2Nzc0NhbnZhc0VsZW1lbnRzLmNsZWFyKCk7Ci0KLSNpZiBFTkFCTEUoUkVRVUVTVF9B
TklNQVRJT05fRlJBTUUpCi0gICAgICAgIC8vIEZJWE1FOiBjb25zaWRlciB1c2luZyBBY3RpdmVE
T01PYmplY3QuCi0gICAgICAgIGlmIChtX3NjcmlwdGVkQW5pbWF0aW9uQ29udHJvbGxlcikKLSAg
ICAgICAgICAgIG1fc2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyLT5jbGVhckRvY3VtZW50UG9p
bnRlcigpOwotICAgICAgICBtX3NjcmlwdGVkQW5pbWF0aW9uQ29udHJvbGxlci5jbGVhcigpOwot
I2VuZGlmCi0KLSNpZm5kZWYgTkRFQlVHCi0gICAgICAgIG1faW5SZW1vdmVkTGFzdFJlZkZ1bmN0
aW9uID0gZmFsc2U7Ci0jZW5kaWYKLQotICAgICAgICBndWFyZERlcmVmKCk7Ci0gICAgfSBlbHNl
IHsKLSNpZm5kZWYgTkRFQlVHIAotICAgICAgICBtX2RlbGV0aW9uSGFzQmVndW4gPSB0cnVlOyAK
LSNlbmRpZiAKLSAgICAgICAgZGVsZXRlIHRoaXM7Ci0gICAgfQorICAgIC8vIERlbGF5IHJlc2V0
dGluZyB0aGUgZmxhZ3MgdW50aWwgYWZ0ZXIgbmV4dCBzdHlsZSByZWNhbGMgc2luY2UgdW5hcHBs
eWluZyB0aGUgc3R5bGUgbWF5IG5vdCB3b3JrIHdpdGhvdXQgdGhlc2Ugc2V0ICh0aGlzIGlzIHRy
dWUgYXQgbGVhc3Qgd2l0aCBiZWZvcmUvYWZ0ZXIpLgorICAgIFN0eWxlUmVzb2x2ZXIqIHN0eWxl
UmVzb2x2ZXIgPSBtX2RvY3VtZW50LT5zdHlsZVJlc29sdmVyKCk7CisgICAgbV91c2VzU2libGlu
Z1J1bGVzID0gbV91c2VzU2libGluZ1J1bGVzIHx8IHN0eWxlUmVzb2x2ZXItPnVzZXNTaWJsaW5n
UnVsZXMoKTsKKyAgICBtX3VzZXNGaXJzdExpbmVSdWxlcyA9IG1fdXNlc0ZpcnN0TGluZVJ1bGVz
IHx8IHN0eWxlUmVzb2x2ZXItPnVzZXNGaXJzdExpbmVSdWxlcygpOworICAgIG1fdXNlc0JlZm9y
ZUFmdGVyUnVsZXMgPSBtX3VzZXNCZWZvcmVBZnRlclJ1bGVzIHx8IHN0eWxlUmVzb2x2ZXItPnVz
ZXNCZWZvcmVBZnRlclJ1bGVzKCk7CiB9CiAKLUVsZW1lbnQqIERvY3VtZW50OjpnZXRFbGVtZW50
QnlJZChjb25zdCBBdG9taWNTdHJpbmcmIGlkKSBjb25zdAordm9pZCBEb2N1bWVudFN0eWxlU2hl
ZXRDb2xsZWN0aW9uOjpyZXNldENTU0ZlYXR1cmVGbGFncygpCiB7Ci0gICAgcmV0dXJuIFRyZWVT
Y29wZTo6Z2V0RWxlbWVudEJ5SWQoaWQpOworICAgIFN0eWxlUmVzb2x2ZXIqIHN0eWxlUmVzb2x2
ZXIgPSBtX2RvY3VtZW50LT5zdHlsZVJlc29sdmVyKCk7CisgICAgbV91c2VzU2libGluZ1J1bGVz
ID0gc3R5bGVSZXNvbHZlci0+dXNlc1NpYmxpbmdSdWxlcygpOworICAgIG1fdXNlc0ZpcnN0TGlu
ZVJ1bGVzID0gc3R5bGVSZXNvbHZlci0+dXNlc0ZpcnN0TGluZVJ1bGVzKCk7CisgICAgbV91c2Vz
QmVmb3JlQWZ0ZXJSdWxlcyA9IHN0eWxlUmVzb2x2ZXItPnVzZXNCZWZvcmVBZnRlclJ1bGVzKCk7
CiB9CiAKLUVsZW1lbnQqIERvY3VtZW50OjpnZXRFbGVtZW50QnlBY2Nlc3NLZXkoY29uc3QgU3Ry
aW5nJiBrZXkpCitDU1NTdHlsZVNoZWV0KiBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjpw
YWdlVXNlclNoZWV0KCkKIHsKLSAgICBpZiAoa2V5LmlzRW1wdHkoKSkKKyAgICBpZiAobV9wYWdl
VXNlclNoZWV0KQorICAgICAgICByZXR1cm4gbV9wYWdlVXNlclNoZWV0LmdldCgpOworICAgIAor
ICAgIFBhZ2UqIG93bmluZ1BhZ2UgPSBtX2RvY3VtZW50LT5wYWdlKCk7CisgICAgaWYgKCFvd25p
bmdQYWdlKQogICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAoIW1fYWNjZXNzS2V5TWFwVmFsaWQp
IHsKLSAgICAgICAgYnVpbGRBY2Nlc3NLZXlNYXAodGhpcyk7Ci0gICAgICAgIG1fYWNjZXNzS2V5
TWFwVmFsaWQgPSB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gbV9lbGVtZW50c0J5QWNjZXNzS2V5
LmdldChrZXkuaW1wbCgpKTsKKyAgICAKKyAgICBTdHJpbmcgdXNlclNoZWV0VGV4dCA9IG93bmlu
Z1BhZ2UtPnVzZXJTdHlsZVNoZWV0KCk7CisgICAgaWYgKHVzZXJTaGVldFRleHQuaXNFbXB0eSgp
KQorICAgICAgICByZXR1cm4gMDsKKyAgICAKKyAgICAvLyBQYXJzZSB0aGUgc2hlZXQgYW5kIGNh
Y2hlIGl0LgorICAgIG1fcGFnZVVzZXJTaGVldCA9IENTU1N0eWxlU2hlZXQ6OmNyZWF0ZUlubGlu
ZShtX2RvY3VtZW50LCBtX2RvY3VtZW50LT5zZXR0aW5ncygpLT51c2VyU3R5bGVTaGVldExvY2F0
aW9uKCkpOworICAgIG1fcGFnZVVzZXJTaGVldC0+Y29udGVudHMoKS0+c2V0SXNVc2VyU3R5bGVT
aGVldCh0cnVlKTsKKyAgICBtX3BhZ2VVc2VyU2hlZXQtPmNvbnRlbnRzKCktPnBhcnNlU3RyaW5n
KHVzZXJTaGVldFRleHQpOworICAgIHJldHVybiBtX3BhZ2VVc2VyU2hlZXQuZ2V0KCk7CiB9CiAK
LXZvaWQgRG9jdW1lbnQ6OmJ1aWxkQWNjZXNzS2V5TWFwKFRyZWVTY29wZSogc2NvcGUpCit2b2lk
IERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OmNsZWFyUGFnZVVzZXJTaGVldCgpCiB7Ci0g
ICAgQVNTRVJUKHNjb3BlKTsKLSAgICBOb2RlKiByb290Tm9kZSA9IHNjb3BlLT5yb290Tm9kZSgp
OwotICAgIGZvciAoTm9kZSogbm9kZSA9IHJvb3ROb2RlOyBub2RlOyBub2RlID0gbm9kZS0+dHJh
dmVyc2VOZXh0Tm9kZShyb290Tm9kZSkpIHsKLSAgICAgICAgaWYgKCFub2RlLT5pc0VsZW1lbnRO
b2RlKCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgRWxlbWVudCogZWxlbWVudCA9
IHN0YXRpY19jYXN0PEVsZW1lbnQqPihub2RlKTsKLSAgICAgICAgY29uc3QgQXRvbWljU3RyaW5n
JiBhY2Nlc3NLZXkgPSBlbGVtZW50LT5nZXRBdHRyaWJ1dGUoYWNjZXNza2V5QXR0cik7Ci0gICAg
ICAgIGlmICghYWNjZXNzS2V5LmlzRW1wdHkoKSkKLSAgICAgICAgICAgIG1fZWxlbWVudHNCeUFj
Y2Vzc0tleS5zZXQoYWNjZXNzS2V5LmltcGwoKSwgZWxlbWVudCk7Ci0KLSAgICAgICAgZm9yIChT
aGFkb3dSb290KiByb290ID0gbm9kZS0+eW91bmdlc3RTaGFkb3dSb290KCk7IHJvb3Q7IHJvb3Qg
PSByb290LT5vbGRlclNoYWRvd1Jvb3QoKSkKLSAgICAgICAgICAgIGJ1aWxkQWNjZXNzS2V5TWFw
KHJvb3QpOworICAgIGlmIChtX3BhZ2VVc2VyU2hlZXQpIHsKKyAgICAgICAgbV9wYWdlVXNlclNo
ZWV0ID0gMDsKKyAgICAgICAgbV9kb2N1bWVudC0+c3R5bGVSZXNvbHZlckNoYW5nZWQoRGVmZXJS
ZWNhbGNTdHlsZSk7CiAgICAgfQogfQogCi12b2lkIERvY3VtZW50OjppbnZhbGlkYXRlQWNjZXNz
S2V5TWFwKCkKLXsKLSAgICBtX2FjY2Vzc0tleU1hcFZhbGlkID0gZmFsc2U7Ci0gICAgbV9lbGVt
ZW50c0J5QWNjZXNzS2V5LmNsZWFyKCk7Ci19Ci0KLVNlbGVjdG9yUXVlcnlDYWNoZSogRG9jdW1l
bnQ6OnNlbGVjdG9yUXVlcnlDYWNoZSgpCit2b2lkIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rp
b246OnVwZGF0ZVBhZ2VVc2VyU2hlZXQoKQogewotICAgIGlmICghbV9zZWxlY3RvclF1ZXJ5Q2Fj
aGUpCi0gICAgICAgIG1fc2VsZWN0b3JRdWVyeUNhY2hlID0gYWRvcHRQdHIobmV3IFNlbGVjdG9y
UXVlcnlDYWNoZSgpKTsKLSAgICByZXR1cm4gbV9zZWxlY3RvclF1ZXJ5Q2FjaGUuZ2V0KCk7Cisg
ICAgY2xlYXJQYWdlVXNlclNoZWV0KCk7CisgICAgaWYgKHBhZ2VVc2VyU2hlZXQoKSkKKyAgICAg
ICAgbV9kb2N1bWVudC0+c3R5bGVSZXNvbHZlckNoYW5nZWQoUmVjYWxjU3R5bGVJbW1lZGlhdGVs
eSk7CiB9CiAKLU1lZGlhUXVlcnlNYXRjaGVyKiBEb2N1bWVudDo6bWVkaWFRdWVyeU1hdGNoZXIo
KQorY29uc3QgVmVjdG9yPFJlZlB0cjxDU1NTdHlsZVNoZWV0PiA+KiBEb2N1bWVudFN0eWxlU2hl
ZXRDb2xsZWN0aW9uOjpwYWdlR3JvdXBVc2VyU2hlZXRzKCkgY29uc3QKIHsKLSAgICBpZiAoIW1f
bWVkaWFRdWVyeU1hdGNoZXIpCi0gICAgICAgIG1fbWVkaWFRdWVyeU1hdGNoZXIgPSBNZWRpYVF1
ZXJ5TWF0Y2hlcjo6Y3JlYXRlKHRoaXMpOwotICAgIHJldHVybiBtX21lZGlhUXVlcnlNYXRjaGVy
LmdldCgpOwotfQorICAgIGlmIChtX3BhZ2VHcm91cFVzZXJTaGVldENhY2hlVmFsaWQpCisgICAg
ICAgIHJldHVybiBtX3BhZ2VHcm91cFVzZXJTaGVldHMuZ2V0KCk7CisgICAgCisgICAgbV9wYWdl
R3JvdXBVc2VyU2hlZXRDYWNoZVZhbGlkID0gdHJ1ZTsKKyAgICAKKyAgICBQYWdlKiBvd25pbmdQ
YWdlID0gbV9kb2N1bWVudC0+cGFnZSgpOworICAgIGlmICghb3duaW5nUGFnZSkKKyAgICAgICAg
cmV0dXJuIDA7CisgICAgICAgIAorICAgIGNvbnN0IFBhZ2VHcm91cCYgcGFnZUdyb3VwID0gb3du
aW5nUGFnZS0+Z3JvdXAoKTsKKyAgICBjb25zdCBVc2VyU3R5bGVTaGVldE1hcCogc2hlZXRzTWFw
ID0gcGFnZUdyb3VwLnVzZXJTdHlsZVNoZWV0cygpOworICAgIGlmICghc2hlZXRzTWFwKQorICAg
ICAgICByZXR1cm4gMDsKIAotdm9pZCBEb2N1bWVudDo6c2V0Q29tcGF0aWJpbGl0eU1vZGUoQ29t
cGF0aWJpbGl0eU1vZGUgbW9kZSkKLXsKLSAgICBpZiAobV9jb21wYXRpYmlsaXR5TW9kZUxvY2tl
ZCB8fCBtb2RlID09IG1fY29tcGF0aWJpbGl0eU1vZGUpCi0gICAgICAgIHJldHVybjsKLSAgICBB
U1NFUlQoIW1fc3R5bGVTaGVldHMtPmxlbmd0aCgpKTsKLSAgICBib29sIHdhc0luUXVpcmtzTW9k
ZSA9IGluUXVpcmtzTW9kZSgpOwotICAgIG1fY29tcGF0aWJpbGl0eU1vZGUgPSBtb2RlOwotICAg
IHNlbGVjdG9yUXVlcnlDYWNoZSgpLT5pbnZhbGlkYXRlKCk7Ci0gICAgaWYgKGluUXVpcmtzTW9k
ZSgpICE9IHdhc0luUXVpcmtzTW9kZSkgewotICAgICAgICAvLyBBbGwgdXNlciBzdHlsZXNoZWV0
cyBoYXZlIHRvIHJlcGFyc2UgdXNpbmcgdGhlIGRpZmZlcmVudCBtb2RlLgotICAgICAgICBjbGVh
clBhZ2VVc2VyU2hlZXQoKTsKLSAgICAgICAgY2xlYXJQYWdlR3JvdXBVc2VyU2hlZXRzKCk7Cisg
ICAgVXNlclN0eWxlU2hlZXRNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IHNoZWV0c01hcC0+ZW5k
KCk7CisgICAgZm9yIChVc2VyU3R5bGVTaGVldE1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzaGVl
dHNNYXAtPmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBjb25zdCBVc2VyU3R5
bGVTaGVldFZlY3Rvciogc2hlZXRzID0gaXQtPnNlY29uZC5nZXQoKTsKKyAgICAgICAgZm9yICh1
bnNpZ25lZCBpID0gMDsgaSA8IHNoZWV0cy0+c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGNv
bnN0IFVzZXJTdHlsZVNoZWV0KiBzaGVldCA9IHNoZWV0cy0+YXQoaSkuZ2V0KCk7CisgICAgICAg
ICAgICBpZiAoc2hlZXQtPmluamVjdGVkRnJhbWVzKCkgPT0gSW5qZWN0SW5Ub3BGcmFtZU9ubHkg
JiYgbV9kb2N1bWVudC0+b3duZXJFbGVtZW50KCkpCisgICAgICAgICAgICAgICAgY29udGludWU7
CisgICAgICAgICAgICBpZiAoIVVzZXJDb250ZW50VVJMUGF0dGVybjo6bWF0Y2hlc1BhdHRlcm5z
KG1fZG9jdW1lbnQtPnVybCgpLCBzaGVldC0+d2hpdGVsaXN0KCksIHNoZWV0LT5ibGFja2xpc3Qo
KSkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBSZWZQdHI8Q1NTU3R5
bGVTaGVldD4gZ3JvdXBTaGVldCA9IENTU1N0eWxlU2hlZXQ6OmNyZWF0ZUlubGluZShjb25zdF9j
YXN0PERvY3VtZW50Kj4obV9kb2N1bWVudCksIHNoZWV0LT51cmwoKSk7CisgICAgICAgICAgICBp
ZiAoIW1fcGFnZUdyb3VwVXNlclNoZWV0cykKKyAgICAgICAgICAgICAgICBtX3BhZ2VHcm91cFVz
ZXJTaGVldHMgPSBhZG9wdFB0cihuZXcgVmVjdG9yPFJlZlB0cjxDU1NTdHlsZVNoZWV0PiA+KTsK
KyAgICAgICAgICAgIG1fcGFnZUdyb3VwVXNlclNoZWV0cy0+YXBwZW5kKGdyb3VwU2hlZXQpOwor
ICAgICAgICAgICAgZ3JvdXBTaGVldC0+Y29udGVudHMoKS0+c2V0SXNVc2VyU3R5bGVTaGVldChz
aGVldC0+bGV2ZWwoKSA9PSBVc2VyU3R5bGVVc2VyTGV2ZWwpOworICAgICAgICAgICAgZ3JvdXBT
aGVldC0+Y29udGVudHMoKS0+cGFyc2VTdHJpbmcoc2hlZXQtPnNvdXJjZSgpKTsKKyAgICAgICAg
fQogICAgIH0KLX0KIAotU3RyaW5nIERvY3VtZW50Ojpjb21wYXRNb2RlKCkgY29uc3QKLXsKLSAg
ICByZXR1cm4gaW5RdWlya3NNb2RlKCkgPyAiQmFja0NvbXBhdCIgOiAiQ1NTMUNvbXBhdCI7Cisg
ICAgcmV0dXJuIG1fcGFnZUdyb3VwVXNlclNoZWV0cy5nZXQoKTsKIH0KIAotdm9pZCBEb2N1bWVu
dDo6cmVzZXRMaW5rQ29sb3IoKQordm9pZCBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjpj
bGVhclBhZ2VHcm91cFVzZXJTaGVldHMoKQogewotICAgIG1fbGlua0NvbG9yID0gQ29sb3IoMCwg
MCwgMjM4KTsKKyAgICBtX3BhZ2VHcm91cFVzZXJTaGVldENhY2hlVmFsaWQgPSBmYWxzZTsKKyAg
ICBpZiAobV9wYWdlR3JvdXBVc2VyU2hlZXRzICYmIG1fcGFnZUdyb3VwVXNlclNoZWV0cy0+c2l6
ZSgpKSB7CisgICAgICAgIG1fcGFnZUdyb3VwVXNlclNoZWV0cy0+Y2xlYXIoKTsKKyAgICAgICAg
bV9kb2N1bWVudC0+c3R5bGVSZXNvbHZlckNoYW5nZWQoRGVmZXJSZWNhbGNTdHlsZSk7CisgICAg
fQogfQogCi12b2lkIERvY3VtZW50OjpyZXNldFZpc2l0ZWRMaW5rQ29sb3IoKQordm9pZCBEb2N1
bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjp1cGRhdGVQYWdlR3JvdXBVc2VyU2hlZXRzKCkKIHsK
LSAgICBtX3Zpc2l0ZWRMaW5rQ29sb3IgPSBDb2xvcig4NSwgMjYsIDEzOSk7ICAgIAorICAgIGNs
ZWFyUGFnZUdyb3VwVXNlclNoZWV0cygpOworICAgIGlmIChwYWdlR3JvdXBVc2VyU2hlZXRzKCkg
JiYgcGFnZUdyb3VwVXNlclNoZWV0cygpLT5zaXplKCkpCisgICAgICAgIG1fZG9jdW1lbnQtPnN0
eWxlUmVzb2x2ZXJDaGFuZ2VkKFJlY2FsY1N0eWxlSW1tZWRpYXRlbHkpOwogfQogCi12b2lkIERv
Y3VtZW50OjpyZXNldEFjdGl2ZUxpbmtDb2xvcigpCit2b2lkIERvY3VtZW50U3R5bGVTaGVldENv
bGxlY3Rpb246OmFkZFVzZXJTaGVldChQYXNzUmVmUHRyPFN0eWxlU2hlZXRDb250ZW50cz4gdXNl
clNoZWV0KQogewotICAgIG1fYWN0aXZlTGlua0NvbG9yLnNldE5hbWVkQ29sb3IoInJlZCIpOwor
ICAgIGlmICghbV91c2VyU2hlZXRzKQorICAgICAgICBtX3VzZXJTaGVldHMgPSBhZG9wdFB0cihu
ZXcgVmVjdG9yPFJlZlB0cjxDU1NTdHlsZVNoZWV0PiA+KTsKKyAgICBtX3VzZXJTaGVldHMtPmFw
cGVuZChDU1NTdHlsZVNoZWV0OjpjcmVhdGUodXNlclNoZWV0LCBtX2RvY3VtZW50KSk7CisgICAg
bV9kb2N1bWVudC0+c3R5bGVSZXNvbHZlckNoYW5nZWQoUmVjYWxjU3R5bGVJbW1lZGlhdGVseSk7
CiB9CiAKLXZvaWQgRG9jdW1lbnQ6OnNldERvY1R5cGUoUGFzc1JlZlB0cjxEb2N1bWVudFR5cGU+
IGRvY1R5cGUpCisvLyBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbmV2ZXIgYSB0b3AtbGV2ZWwg
c3R5bGVzaGVldCBoYXMgZmluaXNoZWQgbG9hZGluZy4KK3ZvaWQgRG9jdW1lbnRTdHlsZVNoZWV0
Q29sbGVjdGlvbjo6cmVtb3ZlUGVuZGluZ1NoZWV0KFJlbW92ZVBlbmRpbmdTaGVldE5vdGlmaWNh
dGlvblR5cGUgbm90aWZpY2F0aW9uKQogewotICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGJlIGNh
bGxlZCBtb3JlIHRoYW4gb25jZS4KLSAgICBBU1NFUlQoIW1fZG9jVHlwZSB8fCAhZG9jVHlwZSk7
Ci0gICAgbV9kb2NUeXBlID0gZG9jVHlwZTsKLSAgICBpZiAobV9kb2NUeXBlKSB7Ci0gICAgICAg
IHRoaXMtPmFkb3B0SWZOZWVkZWQobV9kb2NUeXBlLmdldCgpKTsKLSNpZiBFTkFCTEUoTEVHQUNZ
X1ZJRVdQT1JUX0FEQVBUSU9OKQotICAgICAgICBpZiAobV9kb2NUeXBlLT5wdWJsaWNJZCgpLnN0
YXJ0c1dpdGgoIi0vL3dhcGZvcnVtLy9kdGQgeGh0bWwgbW9iaWxlIDEuIiwgLyogY2FzZVNlbnNp
dGl2ZSAqLyBmYWxzZSkpCi0gICAgICAgICAgICBwcm9jZXNzVmlld3BvcnQoIndpZHRoPWRldmlj
ZS13aWR0aCwgaGVpZ2h0PWRldmljZS1oZWlnaHQiLCBWaWV3cG9ydEFyZ3VtZW50czo6WEhUTUxN
b2JpbGVQcm9maWxlKTsKKyAgICAvLyBNYWtlIHN1cmUgd2Uga25ldyB0aGlzIHNoZWV0IHdhcyBw
ZW5kaW5nLCBhbmQgdGhhdCBvdXIgY291bnQgaXNuJ3Qgb3V0IG9mIHN5bmMuCisgICAgQVNTRVJU
KG1fcGVuZGluZ1N0eWxlc2hlZXRzID4gMCk7CisKKyAgICBtX3BlbmRpbmdTdHlsZXNoZWV0cy0t
OworICAgIAorI2lmZGVmIElOU1RSVU1FTlRfTEFZT1VUX1NDSEVEVUxJTkcKKyAgICBpZiAoIW93
bmVyRWxlbWVudCgpKQorICAgICAgICBwcmludGYoIlN0eWxlc2hlZXQgbG9hZGVkIGF0IHRpbWUg
JWQuICVkIHN0eWxlc2hlZXRzIHN0aWxsIHJlbWFpbi5cbiIsIGVsYXBzZWRUaW1lKCksIG1fcGVu
ZGluZ1N0eWxlc2hlZXRzKTsKICNlbmRpZgotICAgIH0KLSAgICAvLyBEb2N0eXBlIGFmZmVjdHMg
dGhlIGludGVycHJldGF0aW9uIG9mIHRoZSBzdHlsZXNoZWV0cy4KLSAgICBjbGVhclN0eWxlUmVz
b2x2ZXIoKTsKLX0KIAotRE9NSW1wbGVtZW50YXRpb24qIERvY3VtZW50OjppbXBsZW1lbnRhdGlv
bigpCi17Ci0gICAgaWYgKCFtX2ltcGxlbWVudGF0aW9uKQotICAgICAgICBtX2ltcGxlbWVudGF0
aW9uID0gRE9NSW1wbGVtZW50YXRpb246OmNyZWF0ZSh0aGlzKTsKLSAgICByZXR1cm4gbV9pbXBs
ZW1lbnRhdGlvbi5nZXQoKTsKLX0KKyAgICBpZiAobV9wZW5kaW5nU3R5bGVzaGVldHMpCisgICAg
ICAgIHJldHVybjsKIAotdm9pZCBEb2N1bWVudDo6Y2hpbGRyZW5DaGFuZ2VkKGJvb2wgY2hhbmdl
ZEJ5UGFyc2VyLCBOb2RlKiBiZWZvcmVDaGFuZ2UsIE5vZGUqIGFmdGVyQ2hhbmdlLCBpbnQgY2hp
bGRDb3VudERlbHRhKQotewotICAgIENvbnRhaW5lck5vZGU6OmNoaWxkcmVuQ2hhbmdlZChjaGFu
Z2VkQnlQYXJzZXIsIGJlZm9yZUNoYW5nZSwgYWZ0ZXJDaGFuZ2UsIGNoaWxkQ291bnREZWx0YSk7
Ci0gICAgCi0gICAgRWxlbWVudCogbmV3RG9jdW1lbnRFbGVtZW50ID0gZmlyc3RFbGVtZW50Q2hp
bGQodGhpcyk7Ci0gICAgaWYgKG5ld0RvY3VtZW50RWxlbWVudCA9PSBtX2RvY3VtZW50RWxlbWVu
dCkKKyAgICBpZiAobm90aWZpY2F0aW9uID09IFJlbW92ZVBlbmRpbmdTaGVldE5vdGlmeUxhdGVy
KSB7CisgICAgICAgIG1fZG9jdW1lbnQtPnNldE5lZWRzTm90aWZ5UmVtb3ZlQWxsUGVuZGluZ1N0
eWxlc2hlZXQoKTsKICAgICAgICAgcmV0dXJuOwotICAgIG1fZG9jdW1lbnRFbGVtZW50ID0gbmV3
RG9jdW1lbnRFbGVtZW50OwotICAgIC8vIFRoZSByb290IHN0eWxlIHVzZWQgZm9yIG1lZGlhIHF1
ZXJ5IG1hdGNoaW5nIGRlcGVuZHMgb24gdGhlIGRvY3VtZW50IGVsZW1lbnQuCi0gICAgY2xlYXJT
dHlsZVJlc29sdmVyKCk7CisgICAgfQorICAgIAorICAgIG1fZG9jdW1lbnQtPmRpZFJlbW92ZUFs
bFBlbmRpbmdTdHlsZXNoZWV0KCk7CiB9CiAKLVBhc3NSZWZQdHI8RWxlbWVudD4gRG9jdW1lbnQ6
OmNyZWF0ZUVsZW1lbnQoY29uc3QgQXRvbWljU3RyaW5nJiBuYW1lLCBFeGNlcHRpb25Db2RlJiBl
YykKK3ZvaWQgRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjo6YWRkU3R5bGVTaGVldENhbmRp
ZGF0ZU5vZGUoTm9kZSogbm9kZSwgYm9vbCBjcmVhdGVkQnlQYXJzZXIpCiB7Ci0gICAgaWYgKCFp
c1ZhbGlkTmFtZShuYW1lKSkgewotICAgICAgICBlYyA9IElOVkFMSURfQ0hBUkFDVEVSX0VSUjsK
LSAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCFub2RlLT5pbkRvY3VtZW50KCkpCisgICAgICAg
IHJldHVybjsKKyAgICAKKyAgICAvLyBVbnRpbCB0aGUgPGJvZHk+IGV4aXN0cywgd2UgaGF2ZSBu
byBjaG9pY2UgYnV0IHRvIGNvbXBhcmUgZG9jdW1lbnQgcG9zaXRpb25zLAorICAgIC8vIHNpbmNl
IHN0eWxlcyBvdXRzaWRlIG9mIHRoZSBib2R5IGFuZCBoZWFkIGNvbnRpbnVlIHRvIGJlIHNodW50
ZWQgaW50byB0aGUgaGVhZAorICAgIC8vIChhbmQgdGh1cyBjYW4gc2hpZnQgdG8gZW5kIHVwIGJl
Zm9yZSBkeW5hbWljYWxseSBhZGRlZCBET00gY29udGVudCB0aGF0IGlzIGFsc28KKyAgICAvLyBv
dXRzaWRlIHRoZSBib2R5KS4KKyAgICBpZiAoKGNyZWF0ZWRCeVBhcnNlciAmJiBtX2RvY3VtZW50
LT5ib2R5KCkpIHx8IG1fc3R5bGVTaGVldENhbmRpZGF0ZU5vZGVzLmlzRW1wdHkoKSkgeworICAg
ICAgICBtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcy5hZGQobm9kZSk7CisgICAgICAgIHJldHVy
bjsKICAgICB9CiAKLSAgICBpZiAobV9pc1hIVE1MKQotICAgICAgICByZXR1cm4gSFRNTEVsZW1l
bnRGYWN0b3J5OjpjcmVhdGVIVE1MRWxlbWVudChRdWFsaWZpZWROYW1lKG51bGxBdG9tLCBuYW1l
LCB4aHRtbE5hbWVzcGFjZVVSSSksIHRoaXMsIDAsIGZhbHNlKTsKLQotICAgIHJldHVybiBjcmVh
dGVFbGVtZW50KFF1YWxpZmllZE5hbWUobnVsbEF0b20sIG5hbWUsIG51bGxBdG9tKSwgZmFsc2Up
OwotfQotCi1QYXNzUmVmUHRyPERvY3VtZW50RnJhZ21lbnQ+IERvY3VtZW50OjpjcmVhdGVEb2N1
bWVudEZyYWdtZW50KCkKLXsKLSAgICByZXR1cm4gRG9jdW1lbnRGcmFnbWVudDo6Y3JlYXRlKGRv
Y3VtZW50KCkpOwotfQotCi1QYXNzUmVmUHRyPFRleHQ+IERvY3VtZW50OjpjcmVhdGVUZXh0Tm9k
ZShjb25zdCBTdHJpbmcmIGRhdGEpCi17Ci0gICAgcmV0dXJuIFRleHQ6OmNyZWF0ZSh0aGlzLCBk
YXRhKTsKLX0KLQotUGFzc1JlZlB0cjxDb21tZW50PiBEb2N1bWVudDo6Y3JlYXRlQ29tbWVudChj
b25zdCBTdHJpbmcmIGRhdGEpCi17Ci0gICAgcmV0dXJuIENvbW1lbnQ6OmNyZWF0ZSh0aGlzLCBk
YXRhKTsKLX0KLQotUGFzc1JlZlB0cjxDREFUQVNlY3Rpb24+IERvY3VtZW50OjpjcmVhdGVDREFU
QVNlY3Rpb24oY29uc3QgU3RyaW5nJiBkYXRhLCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICBp
ZiAoaXNIVE1MRG9jdW1lbnQoKSkgewotICAgICAgICBlYyA9IE5PVF9TVVBQT1JURURfRVJSOwot
ICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIENEQVRBU2VjdGlvbjo6Y3JlYXRl
KHRoaXMsIGRhdGEpOwotfQotCi1QYXNzUmVmUHRyPFByb2Nlc3NpbmdJbnN0cnVjdGlvbj4gRG9j
dW1lbnQ6OmNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihjb25zdCBTdHJpbmcmIHRhcmdldCwg
Y29uc3QgU3RyaW5nJiBkYXRhLCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICBpZiAoIWlzVmFs
aWROYW1lKHRhcmdldCkpIHsKLSAgICAgICAgZWMgPSBJTlZBTElEX0NIQVJBQ1RFUl9FUlI7Ci0g
ICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAoaXNIVE1MRG9jdW1lbnQoKSkgewotICAg
ICAgICBlYyA9IE5PVF9TVVBQT1JURURfRVJSOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0g
ICAgcmV0dXJuIFByb2Nlc3NpbmdJbnN0cnVjdGlvbjo6Y3JlYXRlKHRoaXMsIHRhcmdldCwgZGF0
YSk7Ci19Ci0KLVBhc3NSZWZQdHI8RW50aXR5UmVmZXJlbmNlPiBEb2N1bWVudDo6Y3JlYXRlRW50
aXR5UmVmZXJlbmNlKGNvbnN0IFN0cmluZyYgbmFtZSwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0g
ICAgaWYgKCFpc1ZhbGlkTmFtZShuYW1lKSkgewotICAgICAgICBlYyA9IElOVkFMSURfQ0hBUkFD
VEVSX0VSUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChpc0hUTUxEb2N1bWVu
dCgpKSB7Ci0gICAgICAgIGVjID0gTk9UX1NVUFBPUlRFRF9FUlI7Ci0gICAgICAgIHJldHVybiAw
OwotICAgIH0KLSAgICByZXR1cm4gRW50aXR5UmVmZXJlbmNlOjpjcmVhdGUodGhpcywgbmFtZSk7
Ci19Ci0KLVBhc3NSZWZQdHI8RWRpdGluZ1RleHQ+IERvY3VtZW50OjpjcmVhdGVFZGl0aW5nVGV4
dE5vZGUoY29uc3QgU3RyaW5nJiB0ZXh0KQotewotICAgIHJldHVybiBFZGl0aW5nVGV4dDo6Y3Jl
YXRlKHRoaXMsIHRleHQpOwotfQotCi1QYXNzUmVmUHRyPENTU1N0eWxlRGVjbGFyYXRpb24+IERv
Y3VtZW50OjpjcmVhdGVDU1NTdHlsZURlY2xhcmF0aW9uKCkKLXsKLSAgICByZXR1cm4gU3R5bGVQ
cm9wZXJ0eVNldDo6Y3JlYXRlKCktPmVuc3VyZUNTU1N0eWxlRGVjbGFyYXRpb24oKTsKLX0KLQot
UGFzc1JlZlB0cjxOb2RlPiBEb2N1bWVudDo6aW1wb3J0Tm9kZShOb2RlKiBpbXBvcnRlZE5vZGUs
IGJvb2wgZGVlcCwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgZWMgPSAwOwotICAgIAotICAg
IGlmICghaW1wb3J0ZWROb2RlKSB7Ci0gICAgICAgIGVjID0gTk9UX1NVUFBPUlRFRF9FUlI7Ci0g
ICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHN3aXRjaCAoaW1wb3J0ZWROb2RlLT5ub2Rl
VHlwZSgpKSB7Ci0gICAgY2FzZSBURVhUX05PREU6Ci0gICAgICAgIHJldHVybiBjcmVhdGVUZXh0
Tm9kZShpbXBvcnRlZE5vZGUtPm5vZGVWYWx1ZSgpKTsKLSAgICBjYXNlIENEQVRBX1NFQ1RJT05f
Tk9ERToKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUNEQVRBU2VjdGlvbihpbXBvcnRlZE5vZGUtPm5v
ZGVWYWx1ZSgpLCBlYyk7Ci0gICAgY2FzZSBFTlRJVFlfUkVGRVJFTkNFX05PREU6Ci0gICAgICAg
IHJldHVybiBjcmVhdGVFbnRpdHlSZWZlcmVuY2UoaW1wb3J0ZWROb2RlLT5ub2RlTmFtZSgpLCBl
Yyk7Ci0gICAgY2FzZSBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU6Ci0gICAgICAgIHJldHVy
biBjcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oaW1wb3J0ZWROb2RlLT5ub2RlTmFtZSgpLCBp
bXBvcnRlZE5vZGUtPm5vZGVWYWx1ZSgpLCBlYyk7Ci0gICAgY2FzZSBDT01NRU5UX05PREU6Ci0g
ICAgICAgIHJldHVybiBjcmVhdGVDb21tZW50KGltcG9ydGVkTm9kZS0+bm9kZVZhbHVlKCkpOwot
ICAgIGNhc2UgRUxFTUVOVF9OT0RFOiB7Ci0gICAgICAgIEVsZW1lbnQqIG9sZEVsZW1lbnQgPSBz
dGF0aWNfY2FzdDxFbGVtZW50Kj4oaW1wb3J0ZWROb2RlKTsKLSAgICAgICAgLy8gRklYTUU6IFRo
ZSBmb2xsb3dpbmcgY2hlY2sgbWlnaHQgYmUgdW5uZWNlc3NhcnkuIElzIGl0IHBvc3NpYmxlIHRo
YXQKLSAgICAgICAgLy8gb2xkRWxlbWVudCBoYXMgbWlzbWF0Y2hlZCBwcmVmaXgvbmFtZXNwYWNl
PwotICAgICAgICBpZiAoIWhhc1ZhbGlkTmFtZXNwYWNlRm9yRWxlbWVudHMob2xkRWxlbWVudC0+
dGFnUU5hbWUoKSkpIHsKLSAgICAgICAgICAgIGVjID0gTkFNRVNQQUNFX0VSUjsKLSAgICAgICAg
ICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIFJlZlB0cjxFbGVtZW50PiBuZXdFbGVt
ZW50ID0gY3JlYXRlRWxlbWVudChvbGRFbGVtZW50LT50YWdRTmFtZSgpLCBlYyk7Ci0gICAgICAg
IGlmIChlYykKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIG5ld0VsZW1lbnQtPmNs
b25lRGF0YUZyb21FbGVtZW50KCpvbGRFbGVtZW50KTsKLQotICAgICAgICBpZiAoZGVlcCkgewot
ICAgICAgICAgICAgZm9yIChOb2RlKiBvbGRDaGlsZCA9IG9sZEVsZW1lbnQtPmZpcnN0Q2hpbGQo
KTsgb2xkQ2hpbGQ7IG9sZENoaWxkID0gb2xkQ2hpbGQtPm5leHRTaWJsaW5nKCkpIHsKLSAgICAg
ICAgICAgICAgICBSZWZQdHI8Tm9kZT4gbmV3Q2hpbGQgPSBpbXBvcnROb2RlKG9sZENoaWxkLCB0
cnVlLCBlYyk7Ci0gICAgICAgICAgICAgICAgaWYgKGVjKQotICAgICAgICAgICAgICAgICAgICBy
ZXR1cm4gMDsKLSAgICAgICAgICAgICAgICBuZXdFbGVtZW50LT5hcHBlbmRDaGlsZChuZXdDaGls
ZC5yZWxlYXNlKCksIGVjKTsKLSAgICAgICAgICAgICAgICBpZiAoZWMpCi0gICAgICAgICAgICAg
ICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0
dXJuIG5ld0VsZW1lbnQucmVsZWFzZSgpOwotICAgIH0KLSAgICBjYXNlIEFUVFJJQlVURV9OT0RF
OgotICAgICAgICByZXR1cm4gQXR0cjo6Y3JlYXRlKHRoaXMsIFF1YWxpZmllZE5hbWUobnVsbEF0
b20sIHN0YXRpY19jYXN0PEF0dHIqPihpbXBvcnRlZE5vZGUpLT5uYW1lKCksIG51bGxBdG9tKSwg
c3RhdGljX2Nhc3Q8QXR0cio+KGltcG9ydGVkTm9kZSktPnZhbHVlKCkpOwotICAgIGNhc2UgRE9D
VU1FTlRfRlJBR01FTlRfTk9ERTogewotICAgICAgICBpZiAoaW1wb3J0ZWROb2RlLT5pc1NoYWRv
d1Jvb3QoKSkgewotICAgICAgICAgICAgLy8gU2hhZG93Um9vdCBub2RlcyBzaG91bGQgbm90IGJl
IGV4cGxpY2l0bHkgaW1wb3J0YWJsZS4KLSAgICAgICAgICAgIC8vIEVpdGhlciB0aGV5IGFyZSBp
bXBvcnRlZCBhbG9uZyB3aXRoIHRoZWlyIGhvc3Qgbm9kZSwgb3IgY3JlYXRlZCBpbXBsaWNpdGx5
LgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgRG9jdW1lbnRGcmFnbWVu
dCogb2xkRnJhZ21lbnQgPSBzdGF0aWNfY2FzdDxEb2N1bWVudEZyYWdtZW50Kj4oaW1wb3J0ZWRO
b2RlKTsKLSAgICAgICAgUmVmUHRyPERvY3VtZW50RnJhZ21lbnQ+IG5ld0ZyYWdtZW50ID0gY3Jl
YXRlRG9jdW1lbnRGcmFnbWVudCgpOwotICAgICAgICBpZiAoZGVlcCkgewotICAgICAgICAgICAg
Zm9yIChOb2RlKiBvbGRDaGlsZCA9IG9sZEZyYWdtZW50LT5maXJzdENoaWxkKCk7IG9sZENoaWxk
OyBvbGRDaGlsZCA9IG9sZENoaWxkLT5uZXh0U2libGluZygpKSB7Ci0gICAgICAgICAgICAgICAg
UmVmUHRyPE5vZGU+IG5ld0NoaWxkID0gaW1wb3J0Tm9kZShvbGRDaGlsZCwgdHJ1ZSwgZWMpOwot
ICAgICAgICAgICAgICAgIGlmIChlYykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0g
ICAgICAgICAgICAgICAgbmV3RnJhZ21lbnQtPmFwcGVuZENoaWxkKG5ld0NoaWxkLnJlbGVhc2Uo
KSwgZWMpOwotICAgICAgICAgICAgICAgIGlmIChlYykKLSAgICAgICAgICAgICAgICAgICAgcmV0
dXJuIDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVy
biBuZXdGcmFnbWVudC5yZWxlYXNlKCk7Ci0gICAgfQotICAgIGNhc2UgRU5USVRZX05PREU6Ci0g
ICAgY2FzZSBOT1RBVElPTl9OT0RFOgotICAgICAgICAvLyBGSVhNRTogSXQgc2hvdWxkIGJlIHBv
c3NpYmxlIHRvIGltcG9ydCB0aGVzZSBub2RlIHR5cGVzLCBob3dldmVyIGluIERPTTMgdGhlIERv
Y3VtZW50VHlwZSBpcyByZWFkb25seSwgc28gdGhlcmUgaXNuJ3QgbXVjaCBzZW5zZSBpbiBkb2lu
ZyB0aGF0LgotICAgICAgICAvLyBBYmlsaXR5IHRvIGFkZCB0aGVzZSBpbXBvcnRlZCBub2RlcyB0
byBhIERvY3VtZW50VHlwZSB3aWxsIGJlIGNvbnNpZGVyZWQgZm9yIGFkZGl0aW9uIHRvIGEgZnV0
dXJlIHJlbGVhc2Ugb2YgdGhlIERPTS4KLSAgICBjYXNlIERPQ1VNRU5UX05PREU6Ci0gICAgY2Fz
ZSBET0NVTUVOVF9UWVBFX05PREU6Ci0gICAgY2FzZSBYUEFUSF9OQU1FU1BBQ0VfTk9ERToKLSAg
ICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGVjID0gTk9UX1NVUFBPUlRFRF9FUlI7Ci0gICAgcmV0
dXJuIDA7Ci19Ci0KLQotUGFzc1JlZlB0cjxOb2RlPiBEb2N1bWVudDo6YWRvcHROb2RlKFBhc3NS
ZWZQdHI8Tm9kZT4gc291cmNlLCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICBpZiAoIXNvdXJj
ZSkgewotICAgICAgICBlYyA9IE5PVF9TVVBQT1JURURfRVJSOwotICAgICAgICByZXR1cm4gMDsK
LSAgICB9Ci0KLSAgICBpZiAoc291cmNlLT5pc1JlYWRPbmx5Tm9kZSgpKSB7Ci0gICAgICAgIGVj
ID0gTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9
Ci0KLSAgICBFdmVudFF1ZXVlU2NvcGUgc2NvcGU7Ci0KLSAgICBzd2l0Y2ggKHNvdXJjZS0+bm9k
ZVR5cGUoKSkgewotICAgIGNhc2UgRU5USVRZX05PREU6Ci0gICAgY2FzZSBOT1RBVElPTl9OT0RF
OgotICAgIGNhc2UgRE9DVU1FTlRfTk9ERToKLSAgICBjYXNlIERPQ1VNRU5UX1RZUEVfTk9ERToK
LSAgICBjYXNlIFhQQVRIX05BTUVTUEFDRV9OT0RFOgotICAgICAgICBlYyA9IE5PVF9TVVBQT1JU
RURfRVJSOwotICAgICAgICByZXR1cm4gMDsgICAgICAgICAgICAKLSAgICBjYXNlIEFUVFJJQlVU
RV9OT0RFOiB7ICAgICAgICAgICAgICAgICAgIAotICAgICAgICBBdHRyKiBhdHRyID0gc3RhdGlj
X2Nhc3Q8QXR0cio+KHNvdXJjZS5nZXQoKSk7Ci0gICAgICAgIGlmIChhdHRyLT5vd25lckVsZW1l
bnQoKSkKLSAgICAgICAgICAgIGF0dHItPm93bmVyRWxlbWVudCgpLT5yZW1vdmVBdHRyaWJ1dGVO
b2RlKGF0dHIsIGVjKTsKLSAgICAgICAgYXR0ci0+c2V0U3BlY2lmaWVkKHRydWUpOwotICAgICAg
ICBicmVhazsKLSAgICB9ICAgICAgIAotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGlmIChzb3VyY2Ut
PmlzU2hhZG93Um9vdCgpKSB7Ci0gICAgICAgICAgICAvLyBTaGFkb3dSb290IGNhbm5vdCBkaXNj
b25uZWN0IGl0c2VsZiBmcm9tIHRoZSBob3N0IG5vZGUuCi0gICAgICAgICAgICBlYyA9IEhJRVJB
UkNIWV9SRVFVRVNUX0VSUjsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAg
ICAgICAgLy8gRklYTUU6IFdoYXQgYWJvdXQgPGZyYW1lPiBhbmQgPG9iamVjdD4/Ci0gICAgICAg
IGlmIChzb3VyY2UtPmhhc1RhZ05hbWUoaWZyYW1lVGFnKSkgewotICAgICAgICAgICAgSFRNTElG
cmFtZUVsZW1lbnQqIGlmcmFtZSA9IHN0YXRpY19jYXN0PEhUTUxJRnJhbWVFbGVtZW50Kj4oc291
cmNlLmdldCgpKTsKLSAgICAgICAgICAgIGlmIChmcmFtZSgpICYmIGZyYW1lKCktPnRyZWUoKS0+
aXNEZXNjZW5kYW50T2YoaWZyYW1lLT5jb250ZW50RnJhbWUoKSkpIHsKLSAgICAgICAgICAgICAg
ICBlYyA9IEhJRVJBUkNIWV9SRVFVRVNUX0VSUjsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsK
LSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoc291cmNlLT5wYXJlbnROb2Rl
KCkpCi0gICAgICAgICAgICBzb3VyY2UtPnBhcmVudE5vZGUoKS0+cmVtb3ZlQ2hpbGQoc291cmNl
LmdldCgpLCBlYyk7Ci0gICAgfQotCi0gICAgdGhpcy0+YWRvcHRJZk5lZWRlZChzb3VyY2UuZ2V0
KCkpOwotCi0gICAgcmV0dXJuIHNvdXJjZTsKLX0KLQotYm9vbCBEb2N1bWVudDo6aGFzVmFsaWRO
YW1lc3BhY2VGb3JFbGVtZW50cyhjb25zdCBRdWFsaWZpZWROYW1lJiBxTmFtZSkKLXsKLSAgICAv
LyBUaGVzZSBjaGVja3MgYXJlIGZyb20gRE9NIENvcmUgTGV2ZWwgMiwgY3JlYXRlRWxlbWVudE5T
Ci0gICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItQ29yZS9jb3JlLmh0bWwj
SUQtRG9jQ3JFbE5TCi0gICAgaWYgKCFxTmFtZS5wcmVmaXgoKS5pc0VtcHR5KCkgJiYgcU5hbWUu
bmFtZXNwYWNlVVJJKCkuaXNOdWxsKCkpIC8vIGNyZWF0ZUVsZW1lbnROUyhudWxsLCAiaHRtbDpk
aXYiKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKHFOYW1lLnByZWZpeCgpID09IHht
bEF0b20gJiYgcU5hbWUubmFtZXNwYWNlVVJJKCkgIT0gWE1MTmFtZXM6OnhtbE5hbWVzcGFjZVVS
SSkgLy8gY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LmV4YW1wbGUuY29tIiwgInhtbDpsYW5n
IikKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gUmVxdWlyZWQgYnkgRE9NIExldmVs
IDMgQ29yZSBhbmQgdW5zcGVjaWZpZWQgYnkgRE9NIExldmVsIDIgQ29yZToKLSAgICAvLyBodHRw
Oi8vd3d3LnczLm9yZy9UUi8yMDA0L1JFQy1ET00tTGV2ZWwtMy1Db3JlLTIwMDQwNDA3L2NvcmUu
aHRtbCNJRC1Eb2NDckVsTlMKLSAgICAvLyBjcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMu
b3JnLzIwMDAveG1sbnMvIiwgImZvbzpiYXIiKSwgY3JlYXRlRWxlbWVudE5TKG51bGwsICJ4bWxu
czpiYXIiKQotICAgIGlmICgocU5hbWUucHJlZml4KCkgPT0geG1sbnNBdG9tICYmIHFOYW1lLm5h
bWVzcGFjZVVSSSgpICE9IFhNTE5TTmFtZXM6OnhtbG5zTmFtZXNwYWNlVVJJKSB8fCAocU5hbWUu
cHJlZml4KCkgIT0geG1sbnNBdG9tICYmIHFOYW1lLm5hbWVzcGFjZVVSSSgpID09IFhNTE5TTmFt
ZXM6OnhtbG5zTmFtZXNwYWNlVVJJKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgcmV0
dXJuIHRydWU7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6Omhhc1ZhbGlkTmFtZXNwYWNlRm9yQXR0cmli
dXRlcyhjb25zdCBRdWFsaWZpZWROYW1lJiBxTmFtZSkKLXsKLSAgICAvLyBTcGVjOiBET00gTGV2
ZWwgMiBDb3JlOiBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1Db3JlL2NvcmUuaHRt
bCNJRC1FbFNldEF0dHJOUwotICAgIGlmIChxTmFtZS5wcmVmaXgoKS5pc0VtcHR5KCkgJiYgcU5h
bWUubG9jYWxOYW1lKCkgPT0geG1sbnNBdG9tKSB7Ci0gICAgICAgIC8vIE5vdGU6IFRoZSBjYXNl
IG9mIGFuICJ4bWxucyIgcXVhbGlmaWVkIG5hbWUgd2l0aCBhIG5hbWVzcGFjZSBvZgotICAgICAg
ICAvLyB4bWxuc05hbWVzcGFjZVVSSSBpcyBzcGVjaWZpY2FsbHkgYWxsb3dlZCAoU2VlIDxodHRw
Oi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLz4pLgotICAgICAgICByZXR1cm4gcU5hbWUubmFtZXNw
YWNlVVJJKCkgPT0gWE1MTlNOYW1lczo6eG1sbnNOYW1lc3BhY2VVUkk7Ci0gICAgfQotICAgIHJl
dHVybiBoYXNWYWxpZE5hbWVzcGFjZUZvckVsZW1lbnRzKHFOYW1lKTsKLX0KLQotLy8gRklYTUU6
IFRoaXMgc2hvdWxkIHJlYWxseSBiZSBpbiBhIHBvc3NpYmxlIEVsZW1lbnRGYWN0b3J5IGNsYXNz
Ci1QYXNzUmVmUHRyPEVsZW1lbnQ+IERvY3VtZW50OjpjcmVhdGVFbGVtZW50KGNvbnN0IFF1YWxp
ZmllZE5hbWUmIHFOYW1lLCBib29sIGNyZWF0ZWRCeVBhcnNlcikKLXsKLSAgICBSZWZQdHI8RWxl
bWVudD4gZTsKLQotICAgIC8vIEZJWE1FOiBVc2UgcmVnaXN0ZXJlZCBuYW1lc3BhY2VzIGFuZCBs
b29rIHVwIGluIGEgaGFzaCB0byBmaW5kIHRoZSByaWdodCBmYWN0b3J5LgotICAgIGlmIChxTmFt
ZS5uYW1lc3BhY2VVUkkoKSA9PSB4aHRtbE5hbWVzcGFjZVVSSSkKLSAgICAgICAgZSA9IEhUTUxF
bGVtZW50RmFjdG9yeTo6Y3JlYXRlSFRNTEVsZW1lbnQocU5hbWUsIHRoaXMsIDAsIGNyZWF0ZWRC
eVBhcnNlcik7Ci0jaWYgRU5BQkxFKFNWRykKLSAgICBlbHNlIGlmIChxTmFtZS5uYW1lc3BhY2VV
UkkoKSA9PSBTVkdOYW1lczo6c3ZnTmFtZXNwYWNlVVJJKQotICAgICAgICBlID0gU1ZHRWxlbWVu
dEZhY3Rvcnk6OmNyZWF0ZVNWR0VsZW1lbnQocU5hbWUsIHRoaXMsIGNyZWF0ZWRCeVBhcnNlcik7
Ci0jZW5kaWYKLSNpZiBFTkFCTEUoTUFUSE1MKQotICAgIGVsc2UgaWYgKHFOYW1lLm5hbWVzcGFj
ZVVSSSgpID09IE1hdGhNTE5hbWVzOjptYXRobWxOYW1lc3BhY2VVUkkpCi0gICAgICAgIGUgPSBN
YXRoTUxFbGVtZW50RmFjdG9yeTo6Y3JlYXRlTWF0aE1MRWxlbWVudChxTmFtZSwgdGhpcywgY3Jl
YXRlZEJ5UGFyc2VyKTsKLSNlbmRpZgotCi0gICAgaWYgKGUpCi0gICAgICAgIG1fc2F3RWxlbWVu
dHNJbktub3duTmFtZXNwYWNlcyA9IHRydWU7Ci0gICAgZWxzZQotICAgICAgICBlID0gRWxlbWVu
dDo6Y3JlYXRlKHFOYW1lLCBkb2N1bWVudCgpKTsKLQotICAgIC8vIDxpbWFnZT4gdXNlcyBpbWdU
YWcgc28gd2UgbmVlZCBhIHNwZWNpYWwgcnVsZS4KLSAgICBBU1NFUlQoKHFOYW1lLm1hdGNoZXMo
aW1hZ2VUYWcpICYmIGUtPnRhZ1FOYW1lKCkubWF0Y2hlcyhpbWdUYWcpICYmIGUtPnRhZ1FOYW1l
KCkucHJlZml4KCkgPT0gcU5hbWUucHJlZml4KCkpIHx8IHFOYW1lID09IGUtPnRhZ1FOYW1lKCkp
OwotCi0gICAgcmV0dXJuIGUucmVsZWFzZSgpOwotfQotCi1ib29sIERvY3VtZW50OjpyZWdpb25C
YXNlZENvbHVtbnNFbmFibGVkKCkgY29uc3QKLXsKLSAgICByZXR1cm4gc2V0dGluZ3MoKSAmJiBz
ZXR0aW5ncygpLT5yZWdpb25CYXNlZENvbHVtbnNFbmFibGVkKCk7IAotfQotCi1ib29sIERvY3Vt
ZW50Ojpjc3NTdGlja3lQb3NpdGlvbkVuYWJsZWQoKSBjb25zdAotewotICAgIHJldHVybiBzZXR0
aW5ncygpICYmIHNldHRpbmdzKCktPmNzc1N0aWNreVBvc2l0aW9uRW5hYmxlZCgpOyAKLX0KLQot
Ym9vbCBEb2N1bWVudDo6Y3NzUmVnaW9uc0VuYWJsZWQoKSBjb25zdAotewotICAgIHJldHVybiBz
ZXR0aW5ncygpICYmIHNldHRpbmdzKCktPmNzc1JlZ2lvbnNFbmFibGVkKCk7IAotfQotCi1ib29s
IERvY3VtZW50Ojpjc3NHcmlkTGF5b3V0RW5hYmxlZCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHNl
dHRpbmdzKCkgJiYgc2V0dGluZ3MoKS0+Y3NzR3JpZExheW91dEVuYWJsZWQoKTsKLX0KLQotI2lm
IEVOQUJMRShDU1NfUkVHSU9OUykKLQotUGFzc1JlZlB0cjxXZWJLaXROYW1lZEZsb3c+IERvY3Vt
ZW50Ojp3ZWJraXRHZXRGbG93QnlOYW1lKGNvbnN0IFN0cmluZyYgZmxvd05hbWUpCi17Ci0gICAg
aWYgKCFjc3NSZWdpb25zRW5hYmxlZCgpIHx8ICFyZW5kZXJlcigpKQotICAgICAgICByZXR1cm4g
MDsKLQotICAgIC8vIEl0J3MgcG9zc2libGUgdG8gaGF2ZSBwZW5kaW5nIHN0eWxlcyBub3QgYXBw
bGllZCB0aGF0IGFmZmVjdCB0aGUgZXhpc3RpbmcgZmxvd3MuCi0gICAgdXBkYXRlU3R5bGVJZk5l
ZWRlZCgpOwotCi0gICAgcmV0dXJuIG5hbWVkRmxvd3MoKS0+Zmxvd0J5TmFtZShmbG93TmFtZSk7
Ci19Ci0KLVBhc3NSZWZQdHI8RE9NTmFtZWRGbG93Q29sbGVjdGlvbj4gRG9jdW1lbnQ6OndlYmtp
dEdldE5hbWVkRmxvd3MoKQotewotICAgIGlmICghY3NzUmVnaW9uc0VuYWJsZWQoKSB8fCAhcmVu
ZGVyZXIoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICB1cGRhdGVTdHlsZUlmTmVlZGVkKCk7
Ci0KLSAgICByZXR1cm4gbmFtZWRGbG93cygpLT5jcmVhdGVDU1NPTVNuYXBzaG90KCk7Ci19Ci0K
LSNlbmRpZgotCi1OYW1lZEZsb3dDb2xsZWN0aW9uKiBEb2N1bWVudDo6bmFtZWRGbG93cygpCi17
Ci0gICAgaWYgKCFtX25hbWVkRmxvd3MpCi0gICAgICAgIG1fbmFtZWRGbG93cyA9IE5hbWVkRmxv
d0NvbGxlY3Rpb246OmNyZWF0ZSh0aGlzKTsKLQotICAgIHJldHVybiBtX25hbWVkRmxvd3MuZ2V0
KCk7Ci19Ci0KLVBhc3NSZWZQdHI8RWxlbWVudD4gRG9jdW1lbnQ6OmNyZWF0ZUVsZW1lbnROUyhj
b25zdCBTdHJpbmcmIG5hbWVzcGFjZVVSSSwgY29uc3QgU3RyaW5nJiBxdWFsaWZpZWROYW1lLCBF
eGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICBTdHJpbmcgcHJlZml4LCBsb2NhbE5hbWU7Ci0gICAg
aWYgKCFwYXJzZVF1YWxpZmllZE5hbWUocXVhbGlmaWVkTmFtZSwgcHJlZml4LCBsb2NhbE5hbWUs
IGVjKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBRdWFsaWZpZWROYW1lIHFOYW1lKHByZWZp
eCwgbG9jYWxOYW1lLCBuYW1lc3BhY2VVUkkpOwotICAgIGlmICghaGFzVmFsaWROYW1lc3BhY2VG
b3JFbGVtZW50cyhxTmFtZSkpIHsKLSAgICAgICAgZWMgPSBOQU1FU1BBQ0VfRVJSOwotICAgICAg
ICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gY3JlYXRlRWxlbWVudChxTmFtZSwgZmFs
c2UpOwotfQotCi1TdHJpbmcgRG9jdW1lbnQ6OnJlYWR5U3RhdGUoKSBjb25zdAotewotICAgIERF
RklORV9TVEFUSUNfTE9DQUwoY29uc3QgU3RyaW5nLCBsb2FkaW5nLCAoQVNDSUlMaXRlcmFsKCJs
b2FkaW5nIikpKTsKLSAgICBERUZJTkVfU1RBVElDX0xPQ0FMKGNvbnN0IFN0cmluZywgaW50ZXJh
Y3RpdmUsIChBU0NJSUxpdGVyYWwoImludGVyYWN0aXZlIikpKTsKLSAgICBERUZJTkVfU1RBVElD
X0xPQ0FMKGNvbnN0IFN0cmluZywgY29tcGxldGUsIChBU0NJSUxpdGVyYWwoImNvbXBsZXRlIikp
KTsKLQotICAgIHN3aXRjaCAobV9yZWFkeVN0YXRlKSB7Ci0gICAgY2FzZSBMb2FkaW5nOgotICAg
ICAgICByZXR1cm4gbG9hZGluZzsKLSAgICBjYXNlIEludGVyYWN0aXZlOgotICAgICAgICByZXR1
cm4gaW50ZXJhY3RpdmU7Ci0gICAgY2FzZSBDb21wbGV0ZToKLSAgICAgICAgcmV0dXJuIGNvbXBs
ZXRlOwotICAgIH0KLQotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgIHJldHVybiBTdHJp
bmcoKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6c2V0UmVhZHlTdGF0ZShSZWFkeVN0YXRlIHJlYWR5
U3RhdGUpCi17Ci0gICAgaWYgKHJlYWR5U3RhdGUgPT0gbV9yZWFkeVN0YXRlKQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBzd2l0Y2ggKHJlYWR5U3RhdGUpIHsKLSAgICBjYXNlIExvYWRpbmc6Ci0g
ICAgICAgIGlmICghbV9kb2N1bWVudFRpbWluZy5kb21Mb2FkaW5nKQotICAgICAgICAgICAgbV9k
b2N1bWVudFRpbWluZy5kb21Mb2FkaW5nID0gbW9ub3RvbmljYWxseUluY3JlYXNpbmdUaW1lKCk7
Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgSW50ZXJhY3RpdmU6Ci0gICAgICAgIGlmICghbV9k
b2N1bWVudFRpbWluZy5kb21JbnRlcmFjdGl2ZSkKLSAgICAgICAgICAgIG1fZG9jdW1lbnRUaW1p
bmcuZG9tSW50ZXJhY3RpdmUgPSBtb25vdG9uaWNhbGx5SW5jcmVhc2luZ1RpbWUoKTsKLSAgICAg
ICAgYnJlYWs7Ci0gICAgY2FzZSBDb21wbGV0ZToKLSAgICAgICAgaWYgKCFtX2RvY3VtZW50VGlt
aW5nLmRvbUNvbXBsZXRlKQotICAgICAgICAgICAgbV9kb2N1bWVudFRpbWluZy5kb21Db21wbGV0
ZSA9IG1vbm90b25pY2FsbHlJbmNyZWFzaW5nVGltZSgpOwotICAgICAgICBicmVhazsKLSAgICB9
Ci0KLSAgICBtX3JlYWR5U3RhdGUgPSByZWFkeVN0YXRlOwotICAgIGRpc3BhdGNoRXZlbnQoRXZl
bnQ6OmNyZWF0ZShldmVudE5hbWVzKCkucmVhZHlzdGF0ZWNoYW5nZUV2ZW50LCBmYWxzZSwgZmFs
c2UpKTsKLSAgICAKLSAgICBpZiAoc2V0dGluZ3MoKSAmJiBzZXR0aW5ncygpLT5zdXBwcmVzc2Vz
SW5jcmVtZW50YWxSZW5kZXJpbmcoKSkKLSAgICAgICAgc2V0VmlzdWFsVXBkYXRlc0FsbG93ZWQo
cmVhZHlTdGF0ZSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnNldFZpc3VhbFVwZGF0ZXNBbGxvd2Vk
KFJlYWR5U3RhdGUgcmVhZHlTdGF0ZSkKLXsKLSAgICBBU1NFUlQoc2V0dGluZ3MoKSAmJiBzZXR0
aW5ncygpLT5zdXBwcmVzc2VzSW5jcmVtZW50YWxSZW5kZXJpbmcoKSk7Ci0gICAgc3dpdGNoIChy
ZWFkeVN0YXRlKSB7Ci0gICAgY2FzZSBMb2FkaW5nOgotICAgICAgICBBU1NFUlQoIW1fdmlzdWFs
VXBkYXRlc1N1cHByZXNzaW9uVGltZXIuaXNBY3RpdmUoKSk7Ci0gICAgICAgIEFTU0VSVChtX3Zp
c3VhbFVwZGF0ZXNBbGxvd2VkKTsKLSAgICAgICAgbV92aXN1YWxVcGRhdGVzU3VwcHJlc3Npb25U
aW1lci5zdGFydE9uZVNob3Qoc2V0dGluZ3MoKS0+aW5jcmVtZW50YWxSZW5kZXJpbmdTdXBwcmVz
c2lvblRpbWVvdXRJblNlY29uZHMoKSk7Ci0gICAgICAgIHNldFZpc3VhbFVwZGF0ZXNBbGxvd2Vk
KGZhbHNlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJbnRlcmFjdGl2ZToKLSAgICAgICAg
QVNTRVJUKG1fdmlzdWFsVXBkYXRlc1N1cHByZXNzaW9uVGltZXIuaXNBY3RpdmUoKSB8fCBtX3Zp
c3VhbFVwZGF0ZXNBbGxvd2VkKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDb21wbGV0ZToK
LSAgICAgICAgaWYgKG1fdmlzdWFsVXBkYXRlc1N1cHByZXNzaW9uVGltZXIuaXNBY3RpdmUoKSkg
ewotICAgICAgICAgICAgQVNTRVJUKCFtX3Zpc3VhbFVwZGF0ZXNBbGxvd2VkKTsKLSAgICAgICAg
ICAgIG1fdmlzdWFsVXBkYXRlc1N1cHByZXNzaW9uVGltZXIuc3RvcCgpOwotICAgICAgICAgICAg
c2V0VmlzdWFsVXBkYXRlc0FsbG93ZWQodHJ1ZSk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAg
ICAgQVNTRVJUKG1fdmlzdWFsVXBkYXRlc0FsbG93ZWQpOwotICAgICAgICBicmVhazsKLSAgICB9
Ci19Ci0gICAgCi12b2lkIERvY3VtZW50OjpzZXRWaXN1YWxVcGRhdGVzQWxsb3dlZChib29sIHZp
c3VhbFVwZGF0ZXNBbGxvd2VkKQotewotICAgIGlmIChtX3Zpc3VhbFVwZGF0ZXNBbGxvd2VkID09
IHZpc3VhbFVwZGF0ZXNBbGxvd2VkKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX3Zpc3VhbFVw
ZGF0ZXNBbGxvd2VkID0gdmlzdWFsVXBkYXRlc0FsbG93ZWQ7Ci0KLSAgICBpZiAoIXZpc3VhbFVw
ZGF0ZXNBbGxvd2VkKQotICAgICAgICByZXR1cm47Ci0KLSNpZiBVU0UoQUNDRUxFUkFURURfQ09N
UE9TSVRJTkcpCi0gICAgaWYgKHZpZXcoKSkKLSAgICAgICAgdmlldygpLT51cGRhdGVDb21wb3Np
dGluZ0xheWVyc0FmdGVyTGF5b3V0KCk7Ci0jZW5kaWYKLQotICAgIGlmIChyZW5kZXJlcigpKQot
ICAgICAgICByZW5kZXJlcigpLT5yZXBhaW50KCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnZpc3Vh
bFVwZGF0ZXNTdXBwcmVzc2lvblRpbWVyRmlyZWQoVGltZXI8RG9jdW1lbnQ+KikKLXsKLSAgICBB
U1NFUlQoIW1fdmlzdWFsVXBkYXRlc0FsbG93ZWQpOwotICAgIHNldFZpc3VhbFVwZGF0ZXNBbGxv
d2VkKHRydWUpOwotfQotCi1TdHJpbmcgRG9jdW1lbnQ6OmVuY29kaW5nKCkgY29uc3QKLXsKLSAg
ICBpZiAoVGV4dFJlc291cmNlRGVjb2RlciogZCA9IGRlY29kZXIoKSkKLSAgICAgICAgcmV0dXJu
IGQtPmVuY29kaW5nKCkuZG9tTmFtZSgpOwotICAgIHJldHVybiBTdHJpbmcoKTsKLX0KLQotU3Ry
aW5nIERvY3VtZW50OjpkZWZhdWx0Q2hhcnNldCgpIGNvbnN0Ci17Ci0gICAgaWYgKFNldHRpbmdz
KiBzZXR0aW5ncyA9IHRoaXMtPnNldHRpbmdzKCkpCi0gICAgICAgIHJldHVybiBzZXR0aW5ncy0+
ZGVmYXVsdFRleHRFbmNvZGluZ05hbWUoKTsKLSAgICByZXR1cm4gU3RyaW5nKCk7Ci19Ci0KLXZv
aWQgRG9jdW1lbnQ6OnNldENoYXJzZXQoY29uc3QgU3RyaW5nJiBjaGFyc2V0KQotewotICAgIGlm
ICghZGVjb2RlcigpKQotICAgICAgICByZXR1cm47Ci0gICAgZGVjb2RlcigpLT5zZXRFbmNvZGlu
ZyhjaGFyc2V0LCBUZXh0UmVzb3VyY2VEZWNvZGVyOjpVc2VyQ2hvc2VuRW5jb2RpbmcpOwotfQot
Ci12b2lkIERvY3VtZW50OjpzZXRDb250ZW50TGFuZ3VhZ2UoY29uc3QgU3RyaW5nJiBsYW5ndWFn
ZSkKLXsKLSAgICBpZiAobV9jb250ZW50TGFuZ3VhZ2UgPT0gbGFuZ3VhZ2UpCi0gICAgICAgIHJl
dHVybjsKLSAgICBtX2NvbnRlbnRMYW5ndWFnZSA9IGxhbmd1YWdlOwotCi0gICAgLy8gUmVjYWxj
dWxhdGUgc3R5bGUgc28gbGFuZ3VhZ2UgaXMgdXNlZCB3aGVuIHNlbGVjdGluZyB0aGUgaW5pdGlh
bCBmb250LgotICAgIHN0eWxlUmVzb2x2ZXJDaGFuZ2VkKERlZmVyUmVjYWxjU3R5bGUpOwotfQot
Ci12b2lkIERvY3VtZW50OjpzZXRYTUxWZXJzaW9uKGNvbnN0IFN0cmluZyYgdmVyc2lvbiwgRXhj
ZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgaWYgKCFpbXBsZW1lbnRhdGlvbigpLT5oYXNGZWF0dXJl
KCJYTUwiLCBTdHJpbmcoKSkpIHsKLSAgICAgICAgZWMgPSBOT1RfU1VQUE9SVEVEX0VSUjsKLSAg
ICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICghWE1MRG9jdW1lbnRQYXJzZXI6OnN1cHBv
cnRzWE1MVmVyc2lvbih2ZXJzaW9uKSkgewotICAgICAgICBlYyA9IE5PVF9TVVBQT1JURURfRVJS
OwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbV94bWxWZXJzaW9uID0gdmVyc2lvbjsK
LX0KLQotdm9pZCBEb2N1bWVudDo6c2V0WE1MU3RhbmRhbG9uZShib29sIHN0YW5kYWxvbmUsIEV4
Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIGlmICghaW1wbGVtZW50YXRpb24oKS0+aGFzRmVhdHVy
ZSgiWE1MIiwgU3RyaW5nKCkpKSB7Ci0gICAgICAgIGVjID0gTk9UX1NVUFBPUlRFRF9FUlI7Ci0g
ICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtX3htbFN0YW5kYWxvbmUgPSBzdGFuZGFsb25l
ID8gU3RhbmRhbG9uZSA6IE5vdFN0YW5kYWxvbmU7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnNldERv
Y3VtZW50VVJJKGNvbnN0IFN0cmluZyYgdXJpKQotewotICAgIC8vIFRoaXMgcHJvcGVydHkgaXMg
cmVhZC1vbmx5IGZyb20gSmF2YVNjcmlwdCwgYnV0IHdyaXRhYmxlIGZyb20gT2JqZWN0aXZlLUMu
Ci0gICAgbV9kb2N1bWVudFVSSSA9IHVyaTsKLSAgICB1cGRhdGVCYXNlVVJMKCk7Ci19Ci0KLUtV
UkwgRG9jdW1lbnQ6OmJhc2VVUkkoKSBjb25zdAotewotICAgIHJldHVybiBtX2Jhc2VVUkw7Ci19
Ci0KLXZvaWQgRG9jdW1lbnQ6OnNldENvbnRlbnQoY29uc3QgU3RyaW5nJiBjb250ZW50KQotewot
ICAgIG9wZW4oKTsKLSAgICBtX3BhcnNlci0+YXBwZW5kKGNvbnRlbnQpOwotICAgIGNsb3NlKCk7
Ci19Ci0KLVN0cmluZyBEb2N1bWVudDo6c3VnZ2VzdGVkTUlNRVR5cGUoKSBjb25zdAotewotICAg
IGlmIChtX2RvY3VtZW50LT5pc1hIVE1MRG9jdW1lbnQoKSkKLSAgICAgICAgcmV0dXJuICJhcHBs
aWNhdGlvbi94aHRtbCt4bWwiOwotICAgIGlmIChtX2RvY3VtZW50LT5pc1NWR0RvY3VtZW50KCkp
Ci0gICAgICAgIHJldHVybiAiaW1hZ2Uvc3ZnK3htbCI7Ci0gICAgaWYgKG1fZG9jdW1lbnQtPnht
bFN0YW5kYWxvbmUoKSkKLSAgICAgICAgcmV0dXJuICJ0ZXh0L3htbCI7Ci0gICAgaWYgKG1fZG9j
dW1lbnQtPmlzSFRNTERvY3VtZW50KCkpCi0gICAgICAgIHJldHVybiAidGV4dC9odG1sIjsKLQot
ICAgIGlmIChEb2N1bWVudExvYWRlciogZG9jdW1lbnRMb2FkZXIgPSBsb2FkZXIoKSkKLSAgICAg
ICAgcmV0dXJuIGRvY3VtZW50TG9hZGVyLT5yZXNwb25zZU1JTUVUeXBlKCk7Ci0gICAgcmV0dXJu
IFN0cmluZygpOwotfQotCi0vLyBGSVhNRTogV2UgbmVlZCB0byBkaXNjdXNzIHRoZSBET00gQVBJ
IGhlcmUgYXQgc29tZSBwb2ludC4gSWRlYXM6Ci0vLyAqIG1ha2luZyBpdCByZWNlaXZlIGEgcmVj
dCBhcyBwYXJhbWV0ZXIsIGkuZS4gbm9kZXNGcm9tUmVjdCh4LCB5LCB3LCBoKTsKLS8vICogbWFr
aW5nIGl0IHJlY2VpdmUgdGhlIGV4cGFkaW5nIHNpemUgb2YgZWFjaCBkaXJlY3Rpb24gc2VwYXJh
dGVseSwKLS8vICAgaS5lLiBub2Rlc0Zyb21SZWN0KHgsIHksIHRvcFNpemUsIHJpZ2h0U2l6ZSwg
Ym90dG9tU2l6ZSwgbGVmdFNpemUpOwotUGFzc1JlZlB0cjxOb2RlTGlzdD4gRG9jdW1lbnQ6Om5v
ZGVzRnJvbVJlY3QoaW50IGNlbnRlclgsIGludCBjZW50ZXJZLCB1bnNpZ25lZCB0b3BQYWRkaW5n
LCB1bnNpZ25lZCByaWdodFBhZGRpbmcsIHVuc2lnbmVkIGJvdHRvbVBhZGRpbmcsIHVuc2lnbmVk
IGxlZnRQYWRkaW5nLCBib29sIGlnbm9yZUNsaXBwaW5nLCBib29sIGFsbG93U2hhZG93Q29udGVu
dCkgY29uc3QKLXsKLSAgICAvLyBGSVhNRTogU2hhcmUgY29kZSBiZXR3ZWVuIHRoaXMsIGVsZW1l
bnRGcm9tUG9pbnQgYW5kIGNhcmV0UmFuZ2VGcm9tUG9pbnQuCi0gICAgaWYgKCFyZW5kZXJlcigp
KQotICAgICAgICByZXR1cm4gMDsKLSAgICBGcmFtZSogZnJhbWUgPSB0aGlzLT5mcmFtZSgpOwot
ICAgIGlmICghZnJhbWUpCi0gICAgICAgIHJldHVybiAwOwotICAgIEZyYW1lVmlldyogZnJhbWVW
aWV3ID0gZnJhbWUtPnZpZXcoKTsKLSAgICBpZiAoIWZyYW1lVmlldykKLSAgICAgICAgcmV0dXJu
IDA7Ci0KLSAgICBmbG9hdCB6b29tRmFjdG9yID0gZnJhbWUtPnBhZ2Vab29tRmFjdG9yKCk7Ci0g
ICAgTGF5b3V0UG9pbnQgcG9pbnQgPSByb3VuZGVkTGF5b3V0UG9pbnQoRmxvYXRQb2ludChjZW50
ZXJYICogem9vbUZhY3RvciArIHZpZXcoKS0+c2Nyb2xsWCgpLCBjZW50ZXJZICogem9vbUZhY3Rv
ciArIHZpZXcoKS0+c2Nyb2xsWSgpKSk7Ci0KLSAgICBpbnQgdHlwZSA9IEhpdFRlc3RSZXF1ZXN0
OjpSZWFkT25seSB8IEhpdFRlc3RSZXF1ZXN0OjpBY3RpdmU7Ci0KLSAgICAvLyBXaGVuIGlnbm9y
ZUNsaXBwaW5nIGlzIGZhbHNlLCB0aGlzIG1ldGhvZCByZXR1cm5zIG51bGwgZm9yIGNvb3JkaW5h
dGVzIG91dHNpZGUgb2YgdGhlIHZpZXdwb3J0LgotICAgIGlmIChpZ25vcmVDbGlwcGluZykKLSAg
ICAgICAgdHlwZSB8PSBIaXRUZXN0UmVxdWVzdDo6SWdub3JlQ2xpcHBpbmc7Ci0gICAgZWxzZSBp
ZiAoIWZyYW1lVmlldy0+dmlzaWJsZUNvbnRlbnRSZWN0KCkuaW50ZXJzZWN0cyhIaXRUZXN0UmVz
dWx0OjpyZWN0Rm9yUG9pbnQocG9pbnQsIHRvcFBhZGRpbmcsIHJpZ2h0UGFkZGluZywgYm90dG9t
UGFkZGluZywgbGVmdFBhZGRpbmcpKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKGFsbG93
U2hhZG93Q29udGVudCkKLSAgICAgICAgdHlwZSB8PSBIaXRUZXN0UmVxdWVzdDo6QWxsb3dTaGFk
b3dDb250ZW50OwotCi0gICAgSGl0VGVzdFJlcXVlc3QgcmVxdWVzdCh0eXBlKTsKLQotICAgIC8v
IFBhc3NpbmcgYSB6ZXJvIHBhZGRpbmcgd2lsbCB0cmlnZ2VyIGEgcmVjdCBoaXQgdGVzdCwgaG93
ZXZlciBmb3IgdGhlIHB1cnBvc2VzIG9mIG5vZGVzRnJvbVJlY3QsCi0gICAgLy8gd2Ugc3BlY2lh
bCBoYW5kbGUgdGhpcyBjYXNlIGluIG9yZGVyIHRvIHJldHVybiBhIHZhbGlkIE5vZGVMaXN0Lgot
ICAgIGlmICghdG9wUGFkZGluZyAmJiAhcmlnaHRQYWRkaW5nICYmICFib3R0b21QYWRkaW5nICYm
ICFsZWZ0UGFkZGluZykgewotICAgICAgICBIaXRUZXN0UmVzdWx0IHJlc3VsdChwb2ludCk7Ci0g
ICAgICAgIHJldHVybiBoYW5kbGVaZXJvUGFkZGluZyhyZXF1ZXN0LCByZXN1bHQpOwotICAgIH0K
LQotICAgIEhpdFRlc3RSZXN1bHQgcmVzdWx0KHBvaW50LCB0b3BQYWRkaW5nLCByaWdodFBhZGRp
bmcsIGJvdHRvbVBhZGRpbmcsIGxlZnRQYWRkaW5nKTsKLSAgICByZW5kZXJWaWV3KCktPmhpdFRl
c3QocmVxdWVzdCwgcmVzdWx0KTsKLQotICAgIHJldHVybiBTdGF0aWNIYXNoU2V0Tm9kZUxpc3Q6
OmFkb3B0KHJlc3VsdC5yZWN0QmFzZWRUZXN0UmVzdWx0KCkpOwotfQotCi1QYXNzUmVmUHRyPE5v
ZGVMaXN0PiBEb2N1bWVudDo6aGFuZGxlWmVyb1BhZGRpbmcoY29uc3QgSGl0VGVzdFJlcXVlc3Qm
IHJlcXVlc3QsIEhpdFRlc3RSZXN1bHQmIHJlc3VsdCkgY29uc3QKLXsKLSAgICByZW5kZXJWaWV3
KCktPmhpdFRlc3QocmVxdWVzdCwgcmVzdWx0KTsKLQotICAgIE5vZGUqIG5vZGUgPSByZXN1bHQu
aW5uZXJOb2RlKCk7Ci0gICAgaWYgKCFub2RlKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIG5v
ZGUgPSBub2RlLT5zaGFkb3dBbmNlc3Rvck5vZGUoKTsKLSAgICBMaXN0SGFzaFNldDxSZWZQdHI8
Tm9kZT4gPiBsaXN0OwotICAgIGxpc3QuYWRkKG5vZGUpOwotICAgIHJldHVybiBTdGF0aWNIYXNo
U2V0Tm9kZUxpc3Q6OmFkb3B0KGxpc3QpOwotfQotCi1zdGF0aWMgTm9kZSogbm9kZUZyb21Qb2lu
dChGcmFtZSogZnJhbWUsIFJlbmRlclZpZXcqIHJlbmRlclZpZXcsIGludCB4LCBpbnQgeSwgTGF5
b3V0UG9pbnQqIGxvY2FsUG9pbnQgPSAwKQotewotICAgIGlmICghZnJhbWUpCi0gICAgICAgIHJl
dHVybiAwOwotICAgIEZyYW1lVmlldyogZnJhbWVWaWV3ID0gZnJhbWUtPnZpZXcoKTsKLSAgICBp
ZiAoIWZyYW1lVmlldykKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBmbG9hdCB6b29tRmFjdG9y
ID0gZnJhbWUtPnBhZ2Vab29tRmFjdG9yKCk7Ci0gICAgSW50UG9pbnQgcG9pbnQgPSByb3VuZGVk
SW50UG9pbnQoRmxvYXRQb2ludCh4ICogem9vbUZhY3RvciAgKyBmcmFtZVZpZXctPnNjcm9sbFgo
KSwgeSAqIHpvb21GYWN0b3IgKyBmcmFtZVZpZXctPnNjcm9sbFkoKSkpOwotCi0gICAgaWYgKCFm
cmFtZVZpZXctPnZpc2libGVDb250ZW50UmVjdCgpLmNvbnRhaW5zKHBvaW50KSkKLSAgICAgICAg
cmV0dXJuIDA7Ci0KLSAgICBIaXRUZXN0UmVxdWVzdCByZXF1ZXN0KEhpdFRlc3RSZXF1ZXN0OjpS
ZWFkT25seSB8IEhpdFRlc3RSZXF1ZXN0OjpBY3RpdmUpOwotICAgIEhpdFRlc3RSZXN1bHQgcmVz
dWx0KHBvaW50KTsKLSAgICByZW5kZXJWaWV3LT5oaXRUZXN0KHJlcXVlc3QsIHJlc3VsdCk7Ci0K
LSAgICBpZiAobG9jYWxQb2ludCkKLSAgICAgICAgKmxvY2FsUG9pbnQgPSByZXN1bHQubG9jYWxQ
b2ludCgpOwotCi0gICAgcmV0dXJuIHJlc3VsdC5pbm5lck5vZGUoKTsKLX0KLQotRWxlbWVudCog
RG9jdW1lbnQ6OmVsZW1lbnRGcm9tUG9pbnQoaW50IHgsIGludCB5KSBjb25zdAotewotICAgIGlm
ICghcmVuZGVyZXIoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgTm9kZSogbm9kZSA9IG5vZGVG
cm9tUG9pbnQoZnJhbWUoKSwgcmVuZGVyVmlldygpLCB4LCB5KTsKLSAgICB3aGlsZSAobm9kZSAm
JiAhbm9kZS0+aXNFbGVtZW50Tm9kZSgpKQotICAgICAgICBub2RlID0gbm9kZS0+cGFyZW50Tm9k
ZSgpOwotICAgIGlmIChub2RlKQotICAgICAgICBub2RlID0gYW5jZXN0b3JJblRoaXNTY29wZShu
b2RlKTsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG5vZGUpOwotfQotCi1QYXNz
UmVmUHRyPFJhbmdlPiBEb2N1bWVudDo6Y2FyZXRSYW5nZUZyb21Qb2ludChpbnQgeCwgaW50IHkp
Ci17Ci0gICAgaWYgKCFyZW5kZXJlcigpKQotICAgICAgICByZXR1cm4gMDsKLSAgICBMYXlvdXRQ
b2ludCBsb2NhbFBvaW50OwotICAgIE5vZGUqIG5vZGUgPSBub2RlRnJvbVBvaW50KGZyYW1lKCks
IHJlbmRlclZpZXcoKSwgeCwgeSwgJmxvY2FsUG9pbnQpOwotICAgIGlmICghbm9kZSkKLSAgICAg
ICAgcmV0dXJuIDA7Ci0KLSAgICBOb2RlKiBzaGFkb3dBbmNlc3Rvck5vZGUgPSBhbmNlc3Rvcklu
VGhpc1Njb3BlKG5vZGUpOwotICAgIGlmIChzaGFkb3dBbmNlc3Rvck5vZGUgIT0gbm9kZSkgewot
ICAgICAgICB1bnNpZ25lZCBvZmZzZXQgPSBzaGFkb3dBbmNlc3Rvck5vZGUtPm5vZGVJbmRleCgp
OwotICAgICAgICBDb250YWluZXJOb2RlKiBjb250YWluZXIgPSBzaGFkb3dBbmNlc3Rvck5vZGUt
PnBhcmVudE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIFJhbmdlOjpjcmVhdGUodGhpcywgY29udGFp
bmVyLCBvZmZzZXQsIGNvbnRhaW5lciwgb2Zmc2V0KTsKLSAgICB9Ci0KLSAgICBSZW5kZXJPYmpl
Y3QqIHJlbmRlcmVyID0gbm9kZS0+cmVuZGVyZXIoKTsKLSAgICBpZiAoIXJlbmRlcmVyKQotICAg
ICAgICByZXR1cm4gMDsKLSAgICBWaXNpYmxlUG9zaXRpb24gdmlzaWJsZVBvc2l0aW9uID0gcmVu
ZGVyZXItPnBvc2l0aW9uRm9yUG9pbnQobG9jYWxQb2ludCk7Ci0gICAgaWYgKHZpc2libGVQb3Np
dGlvbi5pc051bGwoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBQb3NpdGlvbiByYW5nZUNv
bXBsaWFudFBvc2l0aW9uID0gdmlzaWJsZVBvc2l0aW9uLmRlZXBFcXVpdmFsZW50KCkucGFyZW50
QW5jaG9yZWRFcXVpdmFsZW50KCk7Ci0gICAgcmV0dXJuIFJhbmdlOjpjcmVhdGUodGhpcywgcmFu
Z2VDb21wbGlhbnRQb3NpdGlvbiwgcmFuZ2VDb21wbGlhbnRQb3NpdGlvbik7Ci19Ci0KLS8qCi0g
KiBQZXJmb3JtcyB0aHJlZSBvcGVyYXRpb25zOgotICogIDEuIENvbnZlcnQgY29udHJvbCBjaGFy
YWN0ZXJzIHRvIHNwYWNlcwotICogIDIuIFRyaW0gbGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2Vz
Ci0gKiAgMy4gQ29sbGFwc2UgaW50ZXJuYWwgd2hpdGVzcGFjZS4KLSAqLwotc3RhdGljIGlubGlu
ZSBTdHJpbmdXaXRoRGlyZWN0aW9uIGNhbm9uaWNhbGl6ZWRUaXRsZShEb2N1bWVudCogZG9jdW1l
bnQsIGNvbnN0IFN0cmluZ1dpdGhEaXJlY3Rpb24mIHRpdGxlV2l0aERpcmVjdGlvbikKLXsKLSAg
ICBjb25zdCBTdHJpbmcmIHRpdGxlID0gdGl0bGVXaXRoRGlyZWN0aW9uLnN0cmluZygpOwotICAg
IGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzID0gdGl0bGUuY2hhcmFjdGVycygpOwotICAgIHVuc2ln
bmVkIGxlbmd0aCA9IHRpdGxlLmxlbmd0aCgpOwotICAgIHVuc2lnbmVkIGk7Ci0KLSAgICBTdHJp
bmdCdWZmZXI8VUNoYXI+IGJ1ZmZlcihsZW5ndGgpOwotICAgIHVuc2lnbmVkIGJ1aWxkZXJJbmRl
eCA9IDA7Ci0KLSAgICAvLyBTa2lwIGxlYWRpbmcgc3BhY2VzIGFuZCBsZWFkaW5nIGNoYXJhY3Rl
cnMgdGhhdCB3b3VsZCBjb252ZXJ0IHRvIHNwYWNlcwotICAgIGZvciAoaSA9IDA7IGkgPCBsZW5n
dGg7ICsraSkgewotICAgICAgICBVQ2hhciBjID0gY2hhcmFjdGVyc1tpXTsKLSAgICAgICAgaWYg
KCEoYyA8PSAweDIwIHx8IGMgPT0gMHg3RikpCi0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0K
LSAgICBpZiAoaSA9PSBsZW5ndGgpCi0gICAgICAgIHJldHVybiBTdHJpbmdXaXRoRGlyZWN0aW9u
KCk7Ci0KLSAgICAvLyBSZXBsYWNlIGNvbnRyb2wgY2hhcmFjdGVycyB3aXRoIHNwYWNlcywgYW5k
IGJhY2tzbGFzaGVzIHdpdGggY3VycmVuY3kgc3ltYm9scywgYW5kIGNvbGxhcHNlIHdoaXRlc3Bh
Y2UuCi0gICAgYm9vbCBwcmV2aW91c0NoYXJXYXNXUyA9IGZhbHNlOwotICAgIGZvciAoOyBpIDwg
bGVuZ3RoOyArK2kpIHsKLSAgICAgICAgVUNoYXIgYyA9IGNoYXJhY3RlcnNbaV07Ci0gICAgICAg
IGlmIChjIDw9IDB4MjAgfHwgYyA9PSAweDdGIHx8IChXVEY6OlVuaWNvZGU6OmNhdGVnb3J5KGMp
ICYgKFdURjo6VW5pY29kZTo6U2VwYXJhdG9yX0xpbmUgfCBXVEY6OlVuaWNvZGU6OlNlcGFyYXRv
cl9QYXJhZ3JhcGgpKSkgewotICAgICAgICAgICAgaWYgKHByZXZpb3VzQ2hhcldhc1dTKQotICAg
ICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgYnVmZmVyW2J1aWxkZXJJbmRleCsr
XSA9ICcgJzsKLSAgICAgICAgICAgIHByZXZpb3VzQ2hhcldhc1dTID0gdHJ1ZTsKLSAgICAgICAg
fSBlbHNlIHsKLSAgICAgICAgICAgIGJ1ZmZlcltidWlsZGVySW5kZXgrK10gPSBjOwotICAgICAg
ICAgICAgcHJldmlvdXNDaGFyV2FzV1MgPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAg
IC8vIFN0cmlwIHRyYWlsaW5nIHNwYWNlcwotICAgIHdoaWxlIChidWlsZGVySW5kZXggPiAwKSB7
Ci0gICAgICAgIC0tYnVpbGRlckluZGV4OwotICAgICAgICBpZiAoYnVmZmVyW2J1aWxkZXJJbmRl
eF0gIT0gJyAnKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKCFidWlsZGVy
SW5kZXggJiYgYnVmZmVyW2J1aWxkZXJJbmRleF0gPT0gJyAnKQotICAgICAgICByZXR1cm4gU3Ry
aW5nV2l0aERpcmVjdGlvbigpOwotCi0gICAgYnVmZmVyLnNocmluayhidWlsZGVySW5kZXggKyAx
KTsKLQotICAgIC8vIFJlcGxhY2UgdGhlIGJhY2tzbGFzaGVzIHdpdGggY3VycmVuY3kgc3ltYm9s
cyBpZiB0aGUgZW5jb2RpbmcgcmVxdWlyZXMgaXQuCi0gICAgZG9jdW1lbnQtPmRpc3BsYXlCdWZm
ZXJNb2RpZmllZEJ5RW5jb2RpbmcoYnVmZmVyLmNoYXJhY3RlcnMoKSwgYnVmZmVyLmxlbmd0aCgp
KTsKLSAgICAKLSAgICByZXR1cm4gU3RyaW5nV2l0aERpcmVjdGlvbihTdHJpbmc6OmFkb3B0KGJ1
ZmZlciksIHRpdGxlV2l0aERpcmVjdGlvbi5kaXJlY3Rpb24oKSk7Ci19Ci0KLXZvaWQgRG9jdW1l
bnQ6OnVwZGF0ZVRpdGxlKGNvbnN0IFN0cmluZ1dpdGhEaXJlY3Rpb24mIHRpdGxlKQotewotICAg
IGlmIChtX3Jhd1RpdGxlID09IHRpdGxlKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX3Jhd1Rp
dGxlID0gdGl0bGU7Ci0gICAgbV90aXRsZSA9IGNhbm9uaWNhbGl6ZWRUaXRsZSh0aGlzLCBtX3Jh
d1RpdGxlKTsKLSAgICBpZiAoRnJhbWUqIGYgPSBmcmFtZSgpKQotICAgICAgICBmLT5sb2FkZXIo
KS0+c2V0VGl0bGUobV90aXRsZSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnNldFRpdGxlKGNvbnN0
IFN0cmluZyYgdGl0bGUpCi17Ci0gICAgLy8gVGl0bGUgc2V0IGJ5IEphdmFTY3JpcHQgLS0gb3Zl
cnJpZGVzIGFueSB0aXRsZSBlbGVtZW50cy4KLSAgICBtX3RpdGxlU2V0RXhwbGljaXRseSA9IHRy
dWU7Ci0gICAgaWYgKCFpc0hUTUxEb2N1bWVudCgpICYmICFpc1hIVE1MRG9jdW1lbnQoKSkKLSAg
ICAgICAgbV90aXRsZUVsZW1lbnQgPSAwOwotICAgIGVsc2UgaWYgKCFtX3RpdGxlRWxlbWVudCkg
ewotICAgICAgICBpZiAoSFRNTEVsZW1lbnQqIGhlYWRFbGVtZW50ID0gaGVhZCgpKSB7Ci0gICAg
ICAgICAgICBtX3RpdGxlRWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQodGl0bGVUYWcsIGZhbHNlKTsK
LSAgICAgICAgICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwotICAgICAgICAgICAgaGVhZEVsZW1l
bnQtPmFwcGVuZENoaWxkKG1fdGl0bGVFbGVtZW50LCBlYyk7Ci0gICAgICAgICAgICBBU1NFUlQo
IWVjKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFRoZSBET00gQVBJIGhhcyBubyBtZXRo
b2Qgb2Ygc3BlY2lmeWluZyBkaXJlY3Rpb24sIHNvIGFzc3VtZSBMVFIuCi0gICAgdXBkYXRlVGl0
bGUoU3RyaW5nV2l0aERpcmVjdGlvbih0aXRsZSwgTFRSKSk7Ci0KLSAgICBpZiAobV90aXRsZUVs
ZW1lbnQpIHsKLSAgICAgICAgQVNTRVJUKG1fdGl0bGVFbGVtZW50LT5oYXNUYWdOYW1lKHRpdGxl
VGFnKSk7Ci0gICAgICAgIGlmIChtX3RpdGxlRWxlbWVudC0+aGFzVGFnTmFtZSh0aXRsZVRhZykp
Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxIVE1MVGl0bGVFbGVtZW50Kj4obV90aXRsZUVsZW1l
bnQuZ2V0KCkpLT5zZXRUZXh0KHRpdGxlKTsKLSAgICB9Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnNl
dFRpdGxlRWxlbWVudChjb25zdCBTdHJpbmdXaXRoRGlyZWN0aW9uJiB0aXRsZSwgRWxlbWVudCog
dGl0bGVFbGVtZW50KQotewotICAgIGlmICh0aXRsZUVsZW1lbnQgIT0gbV90aXRsZUVsZW1lbnQp
IHsKLSAgICAgICAgaWYgKG1fdGl0bGVFbGVtZW50IHx8IG1fdGl0bGVTZXRFeHBsaWNpdGx5KQot
ICAgICAgICAgICAgLy8gT25seSBhbGxvdyB0aGUgZmlyc3QgdGl0bGUgZWxlbWVudCB0byBjaGFu
Z2UgdGhlIHRpdGxlIC0tIG90aGVycyBoYXZlIG5vIGVmZmVjdC4KLSAgICAgICAgICAgIHJldHVy
bjsKLSAgICAgICAgbV90aXRsZUVsZW1lbnQgPSB0aXRsZUVsZW1lbnQ7Ci0gICAgfQotCi0gICAg
dXBkYXRlVGl0bGUodGl0bGUpOwotfQotCi12b2lkIERvY3VtZW50OjpyZW1vdmVUaXRsZShFbGVt
ZW50KiB0aXRsZUVsZW1lbnQpCi17Ci0gICAgaWYgKG1fdGl0bGVFbGVtZW50ICE9IHRpdGxlRWxl
bWVudCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV90aXRsZUVsZW1lbnQgPSAwOwotICAgIG1f
dGl0bGVTZXRFeHBsaWNpdGx5ID0gZmFsc2U7Ci0KLSAgICAvLyBVcGRhdGUgdGl0bGUgYmFzZWQg
b24gZmlyc3QgdGl0bGUgZWxlbWVudCBpbiB0aGUgaGVhZCwgaWYgb25lIGV4aXN0cy4KLSAgICBp
ZiAoSFRNTEVsZW1lbnQqIGhlYWRFbGVtZW50ID0gaGVhZCgpKSB7Ci0gICAgICAgIGZvciAoTm9k
ZSogZSA9IGhlYWRFbGVtZW50LT5maXJzdENoaWxkKCk7IGU7IGUgPSBlLT5uZXh0U2libGluZygp
KQotICAgICAgICAgICAgaWYgKGUtPmhhc1RhZ05hbWUodGl0bGVUYWcpKSB7Ci0gICAgICAgICAg
ICAgICAgSFRNTFRpdGxlRWxlbWVudCogdGl0bGVFbGVtZW50ID0gc3RhdGljX2Nhc3Q8SFRNTFRp
dGxlRWxlbWVudCo+KGUpOwotICAgICAgICAgICAgICAgIHNldFRpdGxlRWxlbWVudCh0aXRsZUVs
ZW1lbnQtPnRleHRXaXRoRGlyZWN0aW9uKCksIHRpdGxlRWxlbWVudCk7Ci0gICAgICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFtX3RpdGxlRWxlbWVu
dCkKLSAgICAgICAgdXBkYXRlVGl0bGUoU3RyaW5nV2l0aERpcmVjdGlvbigpKTsKLX0KLQotI2lm
IEVOQUJMRShQQUdFX1ZJU0lCSUxJVFlfQVBJKQotUGFnZVZpc2liaWxpdHlTdGF0ZSBEb2N1bWVu
dDo6dmlzaWJpbGl0eVN0YXRlKCkgY29uc3QKLXsKLSAgICAvLyBUaGUgdmlzaWJpbGl0eSBvZiB0
aGUgZG9jdW1lbnQgaXMgaW5oZXJpdGVkIGZyb20gdGhlIHZpc2liaWxpdHkgb2YgdGhlCi0gICAg
Ly8gcGFnZS4gSWYgdGhlcmUgaXMgbm8gcGFnZSBhc3NvY2lhdGVkIHdpdGggdGhlIGRvY3VtZW50
LCB3ZSB3aWxsIGFzc3VtZQotICAgIC8vIHRoYXQgdGhlIHBhZ2UgaXMgdmlzaWJsZSBpLmUuIGlu
dmlzaWJpbGl0eSBoYXMgdG8gYmUgZXhwbGljaXRseQotICAgIC8vIHNwZWNpZmllZCBieSB0aGUg
ZW1iZWRkZXIuCi0gICAgaWYgKCFtX2ZyYW1lIHx8ICFtX2ZyYW1lLT5wYWdlKCkpCi0gICAgICAg
IHJldHVybiBQYWdlVmlzaWJpbGl0eVN0YXRlVmlzaWJsZTsKLSAgICByZXR1cm4gbV9mcmFtZS0+
cGFnZSgpLT52aXNpYmlsaXR5U3RhdGUoKTsKLX0KLQotU3RyaW5nIERvY3VtZW50Ojp3ZWJraXRW
aXNpYmlsaXR5U3RhdGUoKSBjb25zdAotewotICAgIHJldHVybiBwYWdlVmlzaWJpbGl0eVN0YXRl
U3RyaW5nKHZpc2liaWxpdHlTdGF0ZSgpKTsKLX0KLQotYm9vbCBEb2N1bWVudDo6d2Via2l0SGlk
ZGVuKCkgY29uc3QKLXsKLSAgICByZXR1cm4gdmlzaWJpbGl0eVN0YXRlKCkgIT0gUGFnZVZpc2li
aWxpdHlTdGF0ZVZpc2libGU7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmRpc3BhdGNoVmlzaWJpbGl0
eVN0YXRlQ2hhbmdlRXZlbnQoKQotewotICAgIGRpc3BhdGNoRXZlbnQoRXZlbnQ6OmNyZWF0ZShl
dmVudE5hbWVzKCkud2Via2l0dmlzaWJpbGl0eWNoYW5nZUV2ZW50LCBmYWxzZSwgZmFsc2UpKTsK
LX0KLSNlbmRpZgotCi0jaWYgRU5BQkxFKENTUF9ORVhUKQotRE9NU2VjdXJpdHlQb2xpY3kqIERv
Y3VtZW50OjpzZWN1cml0eVBvbGljeSgpCi17Ci0gICAgaWYgKCFtX2RvbVNlY3VyaXR5UG9saWN5
KQotICAgICAgICBtX2RvbVNlY3VyaXR5UG9saWN5ID0gRE9NU2VjdXJpdHlQb2xpY3k6OmNyZWF0
ZSh0aGlzKTsKLSAgICByZXR1cm4gbV9kb21TZWN1cml0eVBvbGljeS5nZXQoKTsKLX0KLSNlbmRp
ZgotCi1TdHJpbmcgRG9jdW1lbnQ6Om5vZGVOYW1lKCkgY29uc3QKLXsKLSAgICByZXR1cm4gIiNk
b2N1bWVudCI7Ci19Ci0KLU5vZGU6Ok5vZGVUeXBlIERvY3VtZW50Ojpub2RlVHlwZSgpIGNvbnN0
Ci17Ci0gICAgcmV0dXJuIERPQ1VNRU5UX05PREU7Ci19Ci0KLUZvcm1Db250cm9sbGVyKiBEb2N1
bWVudDo6Zm9ybUNvbnRyb2xsZXIoKQotewotICAgIGlmICghbV9mb3JtQ29udHJvbGxlcikKLSAg
ICAgICAgbV9mb3JtQ29udHJvbGxlciA9IEZvcm1Db250cm9sbGVyOjpjcmVhdGUoKTsKLSAgICBy
ZXR1cm4gbV9mb3JtQ29udHJvbGxlci5nZXQoKTsKLX0KLQotVmVjdG9yPFN0cmluZz4gRG9jdW1l
bnQ6OmZvcm1FbGVtZW50c1N0YXRlKCkgY29uc3QKLXsKLSAgICBpZiAoIW1fZm9ybUNvbnRyb2xs
ZXIpCi0gICAgICAgIHJldHVybiBWZWN0b3I8U3RyaW5nPigpOwotICAgIHJldHVybiBtX2Zvcm1D
b250cm9sbGVyLT5mb3JtRWxlbWVudHNTdGF0ZSgpOwotfQotCi12b2lkIERvY3VtZW50OjpzZXRT
dGF0ZUZvck5ld0Zvcm1FbGVtZW50cyhjb25zdCBWZWN0b3I8U3RyaW5nPiYgc3RhdGVWZWN0b3Ip
Ci17Ci0gICAgaWYgKCFzdGF0ZVZlY3Rvci5zaXplKCkgJiYgIW1fZm9ybUNvbnRyb2xsZXIpCi0g
ICAgICAgIHJldHVybjsKLSAgICBmb3JtQ29udHJvbGxlcigpLT5zZXRTdGF0ZUZvck5ld0Zvcm1F
bGVtZW50cyhzdGF0ZVZlY3Rvcik7Ci19Ci0KLUZyYW1lVmlldyogRG9jdW1lbnQ6OnZpZXcoKSBj
b25zdAotewotICAgIHJldHVybiBtX2ZyYW1lID8gbV9mcmFtZS0+dmlldygpIDogMDsKLX0KLQot
UGFnZSogRG9jdW1lbnQ6OnBhZ2UoKSBjb25zdAotewotICAgIHJldHVybiBtX2ZyYW1lID8gbV9m
cmFtZS0+cGFnZSgpIDogMDsgICAgCi19Ci0KLVNldHRpbmdzKiBEb2N1bWVudDo6c2V0dGluZ3Mo
KSBjb25zdAotewotICAgIHJldHVybiBtX2ZyYW1lID8gbV9mcmFtZS0+c2V0dGluZ3MoKSA6IDA7
Ci19Ci0KLVBhc3NSZWZQdHI8UmFuZ2U+IERvY3VtZW50OjpjcmVhdGVSYW5nZSgpCi17Ci0gICAg
cmV0dXJuIFJhbmdlOjpjcmVhdGUodGhpcyk7Ci19Ci0KLVBhc3NSZWZQdHI8Tm9kZUl0ZXJhdG9y
PiBEb2N1bWVudDo6Y3JlYXRlTm9kZUl0ZXJhdG9yKE5vZGUqIHJvb3QsIHVuc2lnbmVkIHdoYXRU
b1Nob3csIAotICAgIFBhc3NSZWZQdHI8Tm9kZUZpbHRlcj4gZmlsdGVyLCBib29sIGV4cGFuZEVu
dGl0eVJlZmVyZW5jZXMsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIGlmICghcm9vdCkgewot
ICAgICAgICBlYyA9IE5PVF9TVVBQT1JURURfRVJSOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9
Ci0gICAgcmV0dXJuIE5vZGVJdGVyYXRvcjo6Y3JlYXRlKHJvb3QsIHdoYXRUb1Nob3csIGZpbHRl
ciwgZXhwYW5kRW50aXR5UmVmZXJlbmNlcyk7Ci19Ci0KLVBhc3NSZWZQdHI8VHJlZVdhbGtlcj4g
RG9jdW1lbnQ6OmNyZWF0ZVRyZWVXYWxrZXIoTm9kZSogcm9vdCwgdW5zaWduZWQgd2hhdFRvU2hv
dywgCi0gICAgUGFzc1JlZlB0cjxOb2RlRmlsdGVyPiBmaWx0ZXIsIGJvb2wgZXhwYW5kRW50aXR5
UmVmZXJlbmNlcywgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgaWYgKCFyb290KSB7Ci0gICAg
ICAgIGVjID0gTk9UX1NVUFBPUlRFRF9FUlI7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAg
ICByZXR1cm4gVHJlZVdhbGtlcjo6Y3JlYXRlKHJvb3QsIHdoYXRUb1Nob3csIGZpbHRlciwgZXhw
YW5kRW50aXR5UmVmZXJlbmNlcyk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnNjaGVkdWxlRm9yY2Vk
U3R5bGVSZWNhbGMoKQotewotICAgIG1fcGVuZGluZ1N0eWxlUmVjYWxjU2hvdWxkRm9yY2UgPSB0
cnVlOwotICAgIHNjaGVkdWxlU3R5bGVSZWNhbGMoKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6c2No
ZWR1bGVTdHlsZVJlY2FsYygpCi17Ci0gICAgaWYgKHNob3VsZERpc3BsYXlTZWFtbGVzc2x5V2l0
aFBhcmVudCgpKSB7Ci0gICAgICAgIC8vIFdoZW4gd2UncmUgc2VhbWxlc3MsIG91ciBwYXJlbnQg
ZG9jdW1lbnQgbWFuYWdlcyBvdXIgc3R5bGUgcmVjYWxjcy4KLSAgICAgICAgb3duZXJFbGVtZW50
KCktPnNldE5lZWRzU3R5bGVSZWNhbGMoKTsKLSAgICAgICAgb3duZXJFbGVtZW50KCktPmRvY3Vt
ZW50KCktPnNjaGVkdWxlU3R5bGVSZWNhbGMoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQot
ICAgIGlmIChtX3N0eWxlUmVjYWxjVGltZXIuaXNBY3RpdmUoKSB8fCBpblBhZ2VDYWNoZSgpKQot
ICAgICAgICByZXR1cm47Ci0KLSAgICBBU1NFUlQoY2hpbGROZWVkc1N0eWxlUmVjYWxjKCkgfHwg
bV9wZW5kaW5nU3R5bGVSZWNhbGNTaG91bGRGb3JjZSk7Ci0KLSAgICBpZiAoIWRvY3VtZW50c1Ro
YXROZWVkU3R5bGVSZWNhbGMpCi0gICAgICAgIGRvY3VtZW50c1RoYXROZWVkU3R5bGVSZWNhbGMg
PSBuZXcgSGFzaFNldDxEb2N1bWVudCo+OwotICAgIGRvY3VtZW50c1RoYXROZWVkU3R5bGVSZWNh
bGMtPmFkZCh0aGlzKTsKLSAgICAKLSAgICAvLyBGSVhNRTogV2h5IG9uIGVhcnRoIGlzIHRoaXMg
aGVyZT8gVGhpcyBpcyBjbGVhcmx5IG1pc3BsYWNlZC4KLSAgICBpbnZhbGlkYXRlQWNjZXNzS2V5
TWFwKCk7Ci0gICAgCi0gICAgbV9zdHlsZVJlY2FsY1RpbWVyLnN0YXJ0T25lU2hvdCgwKTsKLQot
ICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkU2NoZWR1bGVTdHlsZVJlY2FsY3VsYXRp
b24odGhpcyk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnVuc2NoZWR1bGVTdHlsZVJlY2FsYygpCi17
Ci0gICAgQVNTRVJUKCFjaGlsZE5lZWRzU3R5bGVSZWNhbGMoKSk7Ci0KLSAgICBpZiAoZG9jdW1l
bnRzVGhhdE5lZWRTdHlsZVJlY2FsYykKLSAgICAgICAgZG9jdW1lbnRzVGhhdE5lZWRTdHlsZVJl
Y2FsYy0+cmVtb3ZlKHRoaXMpOwotCi0gICAgbV9zdHlsZVJlY2FsY1RpbWVyLnN0b3AoKTsKLSAg
ICBtX3BlbmRpbmdTdHlsZVJlY2FsY1Nob3VsZEZvcmNlID0gZmFsc2U7Ci19Ci0KLWJvb2wgRG9j
dW1lbnQ6OmlzUGVuZGluZ1N0eWxlUmVjYWxjKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9zdHls
ZVJlY2FsY1RpbWVyLmlzQWN0aXZlKCkgJiYgIW1faW5TdHlsZVJlY2FsYzsKLX0KLQotdm9pZCBE
b2N1bWVudDo6c3R5bGVSZWNhbGNUaW1lckZpcmVkKFRpbWVyPERvY3VtZW50PiopCi17Ci0gICAg
dXBkYXRlU3R5bGVJZk5lZWRlZCgpOwotfQotCi1ib29sIERvY3VtZW50OjpjaGlsZE5lZWRzQW5k
Tm90SW5TdHlsZVJlY2FsYygpCi17Ci0gICAgcmV0dXJuIGNoaWxkTmVlZHNTdHlsZVJlY2FsYygp
ICYmICFtX2luU3R5bGVSZWNhbGM7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnJlY2FsY1N0eWxlKFN0
eWxlQ2hhbmdlIGNoYW5nZSkKLXsKLSAgICAvLyB3ZSBzaG91bGQgbm90IGVudGVyIHN0eWxlIHJl
Y2FsYyB3aGlsZSBwYWludGluZwotICAgIEFTU0VSVCghdmlldygpIHx8ICF2aWV3KCktPmlzUGFp
bnRpbmcoKSk7Ci0gICAgaWYgKHZpZXcoKSAmJiB2aWV3KCktPmlzUGFpbnRpbmcoKSkKLSAgICAg
ICAgcmV0dXJuOwotICAgIAotICAgIGlmIChtX2luU3R5bGVSZWNhbGMpCi0gICAgICAgIHJldHVy
bjsgLy8gR3VhcmQgYWdhaW5zdCByZS1lbnRyYW5jeS4gLWR3aAotCi0gICAgLy8gRklYTUU6IFdl
IHNob3VsZCB1cGRhdGUgc3R5bGUgb24gb3VyIGFuY2VzdG9yIGNoYWluIGJlZm9yZSBwcm9jZWVk
aW5nIChlc3BlY2lhbGx5IGZvciBzZWFtbGVzcyksCi0gICAgLy8gaG93ZXZlciBkb2luZyBzbyBj
dXJyZW50bHkgY2F1c2VzIHNldmVyYWwgdGVzdHMgdG8gY3Jhc2gsIGFzIEZyYW1lOjpzZXREb2N1
bWVudCBjYWxscyBEb2N1bWVudDo6YXR0YWNoCi0gICAgLy8gYmVmb3JlIHNldHRpbmcgdGhlIERP
TVdpbmRvdyBvbiB0aGUgRnJhbWUsIG9yIHRoZSBTZWN1cml0eU9yaWdpbiBvbiB0aGUgZG9jdW1l
bnQuIFRoZSBhdHRhY2gsIGluIHR1cm4KLSAgICAvLyByZXNvbHZlcyBzdHlsZSAoaGVyZSkgYW5k
IHRoZW4gd2hlbiB3ZSByZXNvbHZlIHN0eWxlIG9uIHRoZSBwYXJlbnQgY2hhaW4sIHdlIG1heSBl
bmQgdXAKLSAgICAvLyByZS1hdHRhY2hpbmcgb3VyIGNvbnRhaW5pbmcgaWZyYW1lLCB3aGljaCB3
aGVuIGFza2VkIEhUTUxGcmFtZUVsZW1lbnRCYXNlOjppc1VSTEFsbG93ZWQKLSAgICAvLyBoaXRz
IGEgbnVsbC1kZXJlZmVyZW5jZSBkdWUgdG8gc2VjdXJpdHkgY29kZSBhbHdheXMgYXNzdW1pbmcg
dGhlIGRvY3VtZW50IGhhcyBhIFNlY3VyaXR5T3JpZ2luLgotCi0gICAgaWYgKG1faGFzRGlydHlT
dHlsZVJlc29sdmVyKQotICAgICAgICB1cGRhdGVBY3RpdmVTdHlsZXNoZWV0cyhSZWNhbGNTdHls
ZUltbWVkaWF0ZWx5KTsKLQotICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSBjb29r
aWUgPSBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OndpbGxSZWNhbGN1bGF0ZVN0eWxlKHRoaXMp
OwotCi0gICAgaWYgKG1fZWxlbVNoZWV0ICYmIG1fZWxlbVNoZWV0LT5jb250ZW50cygpLT51c2Vz
UmVtVW5pdHMoKSkKLSAgICAgICAgbV91c2VzUmVtVW5pdHMgPSB0cnVlOwotCi0gICAgbV9pblN0
eWxlUmVjYWxjID0gdHJ1ZTsKLSAgICBzdXNwZW5kUG9zdEF0dGFjaENhbGxiYWNrcygpOwotICAg
IHsKLSAgICAgICAgV2lkZ2V0SGllcmFyY2h5VXBkYXRlc1N1c3BlbnNpb25TY29wZSBzdXNwZW5k
V2lkZ2V0SGllcmFyY2h5VXBkYXRlczsKLQotICAgICAgICBSZWZQdHI8RnJhbWVWaWV3PiBmcmFt
ZVZpZXcgPSB2aWV3KCk7Ci0gICAgICAgIGlmIChmcmFtZVZpZXcpIHsKLSAgICAgICAgICAgIGZy
YW1lVmlldy0+cGF1c2VTY2hlZHVsZWRFdmVudHMoKTsKLSAgICAgICAgICAgIGZyYW1lVmlldy0+
YmVnaW5EZWZlcnJlZFJlcGFpbnRzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBBU1NFUlQoIXJl
bmRlcmVyKCkgfHwgcmVuZGVyQXJlbmEoKSk7Ci0gICAgICAgIGlmICghcmVuZGVyZXIoKSB8fCAh
cmVuZGVyQXJlbmEoKSkKLSAgICAgICAgICAgIGdvdG8gYmFpbE91dDsKLQotICAgICAgICBpZiAo
bV9wZW5kaW5nU3R5bGVSZWNhbGNTaG91bGRGb3JjZSkKLSAgICAgICAgICAgIGNoYW5nZSA9IEZv
cmNlOwotCi0gICAgICAgIC8vIFJlY2FsY3VsYXRpbmcgdGhlIHJvb3Qgc3R5bGUgKG9uIHRoZSBk
b2N1bWVudCkgaXMgbm90IG5lZWRlZCBpbiB0aGUgY29tbW9uIGNhc2UuCi0gICAgICAgIGlmICgo
Y2hhbmdlID09IEZvcmNlKSB8fCAoc2hvdWxkRGlzcGxheVNlYW1sZXNzbHlXaXRoUGFyZW50KCkg
JiYgKGNoYW5nZSA+PSBJbmhlcml0KSkpIHsKLSAgICAgICAgICAgIC8vIHN0eWxlIHNlbGVjdG9y
IG1heSBzZXQgdGhpcyBhZ2FpbiBkdXJpbmcgcmVjYWxjCi0gICAgICAgICAgICBtX2hhc05vZGVz
V2l0aFBsYWNlaG9sZGVyU3R5bGUgPSBmYWxzZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAg
UmVmUHRyPFJlbmRlclN0eWxlPiBkb2N1bWVudFN0eWxlID0gU3R5bGVSZXNvbHZlcjo6c3R5bGVG
b3JEb2N1bWVudCh0aGlzLCBtX3N0eWxlUmVzb2x2ZXIgPyBtX3N0eWxlUmVzb2x2ZXItPmZvbnRT
ZWxlY3RvcigpIDogMCk7Ci0gICAgICAgICAgICBTdHlsZUNoYW5nZSBjaCA9IE5vZGU6OmRpZmYo
ZG9jdW1lbnRTdHlsZS5nZXQoKSwgcmVuZGVyZXIoKS0+c3R5bGUoKSwgdGhpcyk7Ci0gICAgICAg
ICAgICBpZiAoY2ggIT0gTm9DaGFuZ2UpCi0gICAgICAgICAgICAgICAgcmVuZGVyZXIoKS0+c2V0
U3R5bGUoZG9jdW1lbnRTdHlsZS5yZWxlYXNlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9y
IChOb2RlKiBuID0gZmlyc3RDaGlsZCgpOyBuOyBuID0gbi0+bmV4dFNpYmxpbmcoKSkgewotICAg
ICAgICAgICAgaWYgKCFuLT5pc0VsZW1lbnROb2RlKCkpCi0gICAgICAgICAgICAgICAgY29udGlu
dWU7Ci0gICAgICAgICAgICBFbGVtZW50KiBlbGVtZW50ID0gc3RhdGljX2Nhc3Q8RWxlbWVudCo+
KG4pOwotICAgICAgICAgICAgaWYgKGNoYW5nZSA+PSBJbmhlcml0IHx8IGVsZW1lbnQtPmNoaWxk
TmVlZHNTdHlsZVJlY2FsYygpIHx8IGVsZW1lbnQtPm5lZWRzU3R5bGVSZWNhbGMoKSkKLSAgICAg
ICAgICAgICAgICBlbGVtZW50LT5yZWNhbGNTdHlsZShjaGFuZ2UpOwotICAgICAgICB9Ci0KLSAg
ICAjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQotICAgICAgICBpZiAodmlldygpKSB7
Ci0gICAgICAgICAgICBib29sIGxheW91dFBlbmRpbmcgPSB2aWV3KCktPmxheW91dFBlbmRpbmco
KSB8fCByZW5kZXJlcigpLT5uZWVkc0xheW91dCgpOwotICAgICAgICAgICAgLy8gSWYgd2UgZGlk
bid0IHVwZGF0ZSBjb21wb3NpdGluZyBsYXllcnMgYmVjYXVzZSBvZiBsYXlvdXQoKSwgd2UgbmVl
ZCB0byBkbyBzbyBoZXJlLgotICAgICAgICAgICAgaWYgKCFsYXlvdXRQZW5kaW5nKQotICAgICAg
ICAgICAgICAgIHZpZXcoKS0+dXBkYXRlQ29tcG9zaXRpbmdMYXllcnNBZnRlclN0eWxlQ2hhbmdl
KCk7Ci0gICAgICAgIH0KLSAgICAjZW5kaWYKLQotICAgIGJhaWxPdXQ6Ci0gICAgICAgIGNsZWFy
TmVlZHNTdHlsZVJlY2FsYygpOwotICAgICAgICBjbGVhckNoaWxkTmVlZHNTdHlsZVJlY2FsYygp
OwotICAgICAgICB1bnNjaGVkdWxlU3R5bGVSZWNhbGMoKTsKLQotICAgICAgICBtX2luU3R5bGVS
ZWNhbGMgPSBmYWxzZTsKLQotICAgICAgICAvLyBQc2V1ZG8gZWxlbWVudCByZW1vdmFsIGFuZCBz
aW1pbGFyIG1heSBvbmx5IHdvcmsgd2l0aCB0aGVzZSBmbGFncyBzdGlsbCBzZXQuIFJlc2V0IHRo
ZW0gYWZ0ZXIgdGhlIHN0eWxlIHJlY2FsYy4KLSAgICAgICAgaWYgKG1fc3R5bGVSZXNvbHZlcikK
LSAgICAgICAgICAgIHJlc2V0Q1NTRmVhdHVyZUZsYWdzKCk7Ci0KLSAgICAgICAgaWYgKGZyYW1l
VmlldykgewotICAgICAgICAgICAgZnJhbWVWaWV3LT5yZXN1bWVTY2hlZHVsZWRFdmVudHMoKTsK
LSAgICAgICAgICAgIGZyYW1lVmlldy0+ZW5kRGVmZXJyZWRSZXBhaW50cygpOwotICAgICAgICB9
Ci0gICAgfQotICAgIHJlc3VtZVBvc3RBdHRhY2hDYWxsYmFja3MoKTsKLQotICAgIC8vIElmIHdl
IHdhbnRlZCB0byBjYWxsIGltcGxpY2l0Q2xvc2UoKSBkdXJpbmcgcmVjYWxjU3R5bGUsIGRvIHNv
IG5vdyB0aGF0IHdlJ3JlIGZpbmlzaGVkLgotICAgIGlmIChtX2Nsb3NlQWZ0ZXJTdHlsZVJlY2Fs
YykgewotICAgICAgICBtX2Nsb3NlQWZ0ZXJTdHlsZVJlY2FsYyA9IGZhbHNlOwotICAgICAgICBp
bXBsaWNpdENsb3NlKCk7Ci0gICAgfQotCi0gICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpk
aWRSZWNhbGN1bGF0ZVN0eWxlKGNvb2tpZSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnVwZGF0ZVN0
eWxlSWZOZWVkZWQoKQotewotICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7Ci0gICAgQVNTRVJU
KCF2aWV3KCkgfHwgKCF2aWV3KCktPmlzSW5MYXlvdXQoKSAmJiAhdmlldygpLT5pc1BhaW50aW5n
KCkpKTsKLSAgICAKLSAgICBpZiAoKCFtX3BlbmRpbmdTdHlsZVJlY2FsY1Nob3VsZEZvcmNlICYm
ICFjaGlsZE5lZWRzU3R5bGVSZWNhbGMoKSkgfHwgaW5QYWdlQ2FjaGUoKSkKLSAgICAgICAgcmV0
dXJuOwotCi0gICAgQW5pbWF0aW9uVXBkYXRlQmxvY2sgYW5pbWF0aW9uVXBkYXRlQmxvY2sobV9m
cmFtZSA/IG1fZnJhbWUtPmFuaW1hdGlvbigpIDogMCk7Ci0gICAgcmVjYWxjU3R5bGUoTm9DaGFu
Z2UpOwotfQotCi12b2lkIERvY3VtZW50Ojp1cGRhdGVTdHlsZUZvckFsbERvY3VtZW50cygpCi17
Ci0gICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKLSAgICBpZiAoIWRvY3VtZW50c1RoYXROZWVk
U3R5bGVSZWNhbGMpCi0gICAgICAgIHJldHVybjsKLQotICAgIHdoaWxlIChkb2N1bWVudHNUaGF0
TmVlZFN0eWxlUmVjYWxjLT5zaXplKCkpIHsKLSAgICAgICAgSGFzaFNldDxEb2N1bWVudCo+Ojpp
dGVyYXRvciBpdCA9IGRvY3VtZW50c1RoYXROZWVkU3R5bGVSZWNhbGMtPmJlZ2luKCk7Ci0gICAg
ICAgIERvY3VtZW50KiBkb2MgPSAqaXQ7Ci0gICAgICAgIGRvY3VtZW50c1RoYXROZWVkU3R5bGVS
ZWNhbGMtPnJlbW92ZShkb2MpOwotICAgICAgICBkb2MtPnVwZGF0ZVN0eWxlSWZOZWVkZWQoKTsK
LSAgICB9Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnVwZGF0ZUxheW91dCgpCi17Ci0gICAgQVNTRVJU
KGlzTWFpblRocmVhZCgpKTsKLSAgICBpZiAoRWxlbWVudCogb2UgPSBvd25lckVsZW1lbnQoKSkK
LSAgICAgICAgb2UtPmRvY3VtZW50KCktPnVwZGF0ZUxheW91dCgpOwotCi0gICAgdXBkYXRlU3R5
bGVJZk5lZWRlZCgpOwotCi0gICAgLy8gT25seSBkbyBhIGxheW91dCBpZiBjaGFuZ2VzIGhhdmUg
b2NjdXJyZWQgdGhhdCBtYWtlIGl0IG5lY2Vzc2FyeS4gICAgICAKLSAgICBGcmFtZVZpZXcqIHYg
PSB2aWV3KCk7Ci0gICAgaWYgKHYgJiYgcmVuZGVyZXIoKSAmJiAodi0+bGF5b3V0UGVuZGluZygp
IHx8IHJlbmRlcmVyKCktPm5lZWRzTGF5b3V0KCkpKQotICAgICAgICB2LT5sYXlvdXQoKTsKLX0K
LQotLy8gRklYTUU6IFRoaXMgaXMgYSBiYWQgaWRlYSBhbmQgbmVlZHMgdG8gYmUgcmVtb3ZlZCBl
dmVudHVhbGx5LgotLy8gT3RoZXIgYnJvd3NlcnMgbG9hZCBzdHlsZXNoZWV0cyBiZWZvcmUgdGhl
eSBjb250aW51ZSBwYXJzaW5nIHRoZSB3ZWIgcGFnZS4KLS8vIFNpbmNlIHdlIGRvbid0LCB3ZSBj
YW4gcnVuIEphdmFTY3JpcHQgY29kZSB0aGF0IG5lZWRzIGFuc3dlcnMgYmVmb3JlIHRoZQotLy8g
c3R5bGVzaGVldHMgYXJlIGxvYWRlZC4gRG9pbmcgYSBsYXlvdXQgaWdub3JpbmcgdGhlIHBlbmRp
bmcgc3R5bGVzaGVldHMKLS8vIGxldHMgdXMgZ2V0IHJlYXNvbmFibGUgYW5zd2Vycy4gVGhlIGxv
bmcgdGVybSBzb2x1dGlvbiB0byB0aGlzIHByb2JsZW0gaXMKLS8vIHRvIGluc3RlYWQgc3VzcGVu
ZCBKYXZhU2NyaXB0IGV4ZWN1dGlvbi4KLXZvaWQgRG9jdW1lbnQ6OnVwZGF0ZUxheW91dElnbm9y
ZVBlbmRpbmdTdHlsZXNoZWV0cygpCi17Ci0gICAgYm9vbCBvbGRJZ25vcmUgPSBtX2lnbm9yZVBl
bmRpbmdTdHlsZXNoZWV0czsKLSAgICAKLSAgICBpZiAoIWhhdmVTdHlsZXNoZWV0c0xvYWRlZCgp
KSB7Ci0gICAgICAgIG1faWdub3JlUGVuZGluZ1N0eWxlc2hlZXRzID0gdHJ1ZTsKLSAgICAgICAg
Ly8gRklYTUU6IFdlIGFyZSB3aWxsaW5nIHRvIGF0dGVtcHQgdG8gc3VwcHJlc3MgcGFpbnRpbmcg
d2l0aCBvdXRkYXRlZCBzdHlsZSBpbmZvIG9ubHkgb25jZS4gIE91ciBhc3N1bXB0aW9uIGlzIHRo
YXQgaXQgd291bGQgYmUKLSAgICAgICAgLy8gZGFuZ2Vyb3VzIHRvIHRyeSB0byBzdG9wIGl0IGEg
c2Vjb25kIHRpbWUsIGFmdGVyIHBhZ2UgY29udGVudCBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZCBh
bmQgZGlzcGxheWVkCi0gICAgICAgIC8vIHdpdGggYWNjdXJhdGUgc3R5bGUgaW5mb3JtYXRpb24u
ICAoT3VyIHN1cHByZXNzaW9uIGludm9sdmVzIGJsYW5raW5nIHRoZSB3aG9sZSBwYWdlIGF0IHRo
ZQotICAgICAgICAvLyBtb21lbnQuICBJZiBpdCB3ZXJlIG1vcmUgcmVmaW5lZCwgd2UgbWlnaHQg
YmUgYWJsZSB0byBkbyBzb21ldGhpbmcgYmV0dGVyLikKLSAgICAgICAgLy8gSXQncyB3b3J0aCBu
b3RpbmcgdGhvdWdoIHRoYXQgdGhpcyBlbnRpcmUgbWV0aG9kIGlzIGEgaGFjaywgc2luY2Ugd2hh
dCB3ZSByZWFsbHkgd2FudCB0byBkbyBpcwotICAgICAgICAvLyBzdXNwZW5kIEpTIGluc3RlYWQg
b2YgZG9pbmcgYSBsYXlvdXQgd2l0aCBpbmFjY3VyYXRlIGluZm9ybWF0aW9uLgotICAgICAgICBI
VE1MRWxlbWVudCogYm9keUVsZW1lbnQgPSBib2R5KCk7Ci0gICAgICAgIGlmIChib2R5RWxlbWVu
dCAmJiAhYm9keUVsZW1lbnQtPnJlbmRlcmVyKCkgJiYgbV9wZW5kaW5nU2hlZXRMYXlvdXQgPT0g
Tm9MYXlvdXRXaXRoUGVuZGluZ1NoZWV0cykgewotICAgICAgICAgICAgbV9wZW5kaW5nU2hlZXRM
YXlvdXQgPSBEaWRMYXlvdXRXaXRoUGVuZGluZ1NoZWV0czsKLSAgICAgICAgICAgIHN0eWxlUmVz
b2x2ZXJDaGFuZ2VkKFJlY2FsY1N0eWxlSW1tZWRpYXRlbHkpOwotICAgICAgICB9IGVsc2UgaWYg
KG1faGFzTm9kZXNXaXRoUGxhY2Vob2xkZXJTdHlsZSkKLSAgICAgICAgICAgIC8vIElmIG5ldyBu
b2RlcyBoYXZlIGJlZW4gYWRkZWQgb3Igc3R5bGUgcmVjYWxjIGhhcyBiZWVuIGRvbmUgd2l0aCBz
dHlsZSBzaGVldHMgc3RpbGwgcGVuZGluZywgc29tZSBub2RlcyAKLSAgICAgICAgICAgIC8vIG1h
eSBub3QgaGF2ZSBoYWQgdGhlaXIgcmVhbCBzdHlsZSBjYWxjdWxhdGVkIHlldC4gTm9ybWFsbHkg
dGhpcyBnZXRzIGNsZWFuZWQgd2hlbiBzdHlsZSBzaGVldHMgYXJyaXZlIAotICAgICAgICAgICAg
Ly8gYnV0IGhlcmUgd2UgbmVlZCB1cC10by1kYXRlIHN0eWxlIGltbWVkaWF0ZWx5LgotICAgICAg
ICAgICAgcmVjYWxjU3R5bGUoRm9yY2UpOwotICAgIH0KLQotICAgIHVwZGF0ZUxheW91dCgpOwot
Ci0gICAgbV9pZ25vcmVQZW5kaW5nU3R5bGVzaGVldHMgPSBvbGRJZ25vcmU7Ci19Ci0KLVBhc3NS
ZWZQdHI8UmVuZGVyU3R5bGU+IERvY3VtZW50OjpzdHlsZUZvckVsZW1lbnRJZ25vcmluZ1BlbmRp
bmdTdHlsZXNoZWV0cyhFbGVtZW50KiBlbGVtZW50KQotewotICAgIEFTU0VSVF9BUkcoZWxlbWVu
dCwgZWxlbWVudC0+ZG9jdW1lbnQoKSA9PSB0aGlzKTsKLQotICAgIGJvb2wgb2xkSWdub3JlID0g
bV9pZ25vcmVQZW5kaW5nU3R5bGVzaGVldHM7Ci0gICAgbV9pZ25vcmVQZW5kaW5nU3R5bGVzaGVl
dHMgPSB0cnVlOwotICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gc3R5bGUgPSBzdHlsZVJlc29sdmVy
KCktPnN0eWxlRm9yRWxlbWVudChlbGVtZW50LCBlbGVtZW50LT5wYXJlbnROb2RlKCkgPyBlbGVt
ZW50LT5wYXJlbnROb2RlKCktPmNvbXB1dGVkU3R5bGUoKSA6IDApOwotICAgIG1faWdub3JlUGVu
ZGluZ1N0eWxlc2hlZXRzID0gb2xkSWdub3JlOwotICAgIHJldHVybiBzdHlsZS5yZWxlYXNlKCk7
Ci19Ci0KLVBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IERvY3VtZW50OjpzdHlsZUZvclBhZ2UoaW50
IHBhZ2VJbmRleCkKLXsKLSAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IHN0eWxlID0gc3R5bGVSZXNv
bHZlcigpLT5zdHlsZUZvclBhZ2UocGFnZUluZGV4KTsKLSAgICByZXR1cm4gc3R5bGUucmVsZWFz
ZSgpOwotfQotCi12b2lkIERvY3VtZW50OjpyZWdpc3RlckN1c3RvbUZvbnQoUGFzc093blB0cjxG
b250RGF0YT4gZm9udERhdGEpCi17Ci0gICAgbV9jdXN0b21Gb250cy5hcHBlbmQoZm9udERhdGEp
OwotfQotCi12b2lkIERvY3VtZW50OjpkZWxldGVDdXN0b21Gb250cygpCi17Ci0gICAgc2l6ZV90
IHNpemUgPSBtX2N1c3RvbUZvbnRzLnNpemUoKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8
IHNpemU7ICsraSkKLSAgICAgICAgR2x5cGhQYWdlVHJlZU5vZGU6OnBydW5lVHJlZUN1c3RvbUZv
bnREYXRhKG1fY3VzdG9tRm9udHNbaV0uZ2V0KCkpOwotCi0gICAgbV9jdXN0b21Gb250cy5jbGVh
cigpOwotfQotCi1ib29sIERvY3VtZW50Ojppc1BhZ2VCb3hWaXNpYmxlKGludCBwYWdlSW5kZXgp
Ci17Ci0gICAgUmVmUHRyPFJlbmRlclN0eWxlPiBzdHlsZSA9IHN0eWxlRm9yUGFnZShwYWdlSW5k
ZXgpOwotICAgIHJldHVybiBzdHlsZS0+dmlzaWJpbGl0eSgpICE9IEhJRERFTjsgLy8gZGlzcGxh
eSBwcm9wZXJ0eSBkb2Vzbid0IGFwcGx5IHRvIEBwYWdlLgotfQotCi12b2lkIERvY3VtZW50Ojpw
YWdlU2l6ZUFuZE1hcmdpbnNJblBpeGVscyhpbnQgcGFnZUluZGV4LCBJbnRTaXplJiBwYWdlU2l6
ZSwgaW50JiBtYXJnaW5Ub3AsIGludCYgbWFyZ2luUmlnaHQsIGludCYgbWFyZ2luQm90dG9tLCBp
bnQmIG1hcmdpbkxlZnQpCi17Ci0gICAgUmVmUHRyPFJlbmRlclN0eWxlPiBzdHlsZSA9IHN0eWxl
Rm9yUGFnZShwYWdlSW5kZXgpOwotICAgIFJlbmRlclZpZXcqIHZpZXcgPSByZW5kZXJWaWV3KCk7
Ci0KLSAgICBpbnQgd2lkdGggPSBwYWdlU2l6ZS53aWR0aCgpOwotICAgIGludCBoZWlnaHQgPSBw
YWdlU2l6ZS5oZWlnaHQoKTsKLSAgICBzd2l0Y2ggKHN0eWxlLT5wYWdlU2l6ZVR5cGUoKSkgewot
ICAgIGNhc2UgUEFHRV9TSVpFX0FVVE86Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUEFHRV9T
SVpFX0FVVE9fTEFORFNDQVBFOgotICAgICAgICBpZiAod2lkdGggPCBoZWlnaHQpCi0gICAgICAg
ICAgICBzdGQ6OnN3YXAod2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2Ug
UEFHRV9TSVpFX0FVVE9fUE9SVFJBSVQ6Ci0gICAgICAgIGlmICh3aWR0aCA+IGhlaWdodCkKLSAg
ICAgICAgICAgIHN0ZDo6c3dhcCh3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAg
Y2FzZSBQQUdFX1NJWkVfUkVTT0xWRUQ6IHsKLSAgICAgICAgTGVuZ3RoU2l6ZSBzaXplID0gc3R5
bGUtPnBhZ2VTaXplKCk7Ci0gICAgICAgIEFTU0VSVChzaXplLndpZHRoKCkuaXNGaXhlZCgpKTsK
LSAgICAgICAgQVNTRVJUKHNpemUuaGVpZ2h0KCkuaXNGaXhlZCgpKTsKLSAgICAgICAgd2lkdGgg
PSB2YWx1ZUZvckxlbmd0aChzaXplLndpZHRoKCksIDAsIHZpZXcpOwotICAgICAgICBoZWlnaHQg
PSB2YWx1ZUZvckxlbmd0aChzaXplLmhlaWdodCgpLCAwLCB2aWV3KTsKLSAgICAgICAgYnJlYWs7
Ci0gICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAg
IH0KLSAgICBwYWdlU2l6ZSA9IEludFNpemUod2lkdGgsIGhlaWdodCk7Ci0KLSAgICAvLyBUaGUg
cGVyY2VudGFnZSBpcyBjYWxjdWxhdGVkIHdpdGggcmVzcGVjdCB0byB0aGUgd2lkdGggZXZlbiBm
b3IgbWFyZ2luIHRvcCBhbmQgYm90dG9tLgotICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0NT
UzIvYm94Lmh0bWwjbWFyZ2luLXByb3BlcnRpZXMKLSAgICBtYXJnaW5Ub3AgPSBzdHlsZS0+bWFy
Z2luVG9wKCkuaXNBdXRvKCkgPyBtYXJnaW5Ub3AgOiBpbnRWYWx1ZUZvckxlbmd0aChzdHlsZS0+
bWFyZ2luVG9wKCksIHdpZHRoLCB2aWV3KTsKLSAgICBtYXJnaW5SaWdodCA9IHN0eWxlLT5tYXJn
aW5SaWdodCgpLmlzQXV0bygpID8gbWFyZ2luUmlnaHQgOiBpbnRWYWx1ZUZvckxlbmd0aChzdHls
ZS0+bWFyZ2luUmlnaHQoKSwgd2lkdGgsIHZpZXcpOwotICAgIG1hcmdpbkJvdHRvbSA9IHN0eWxl
LT5tYXJnaW5Cb3R0b20oKS5pc0F1dG8oKSA/IG1hcmdpbkJvdHRvbSA6IGludFZhbHVlRm9yTGVu
Z3RoKHN0eWxlLT5tYXJnaW5Cb3R0b20oKSwgd2lkdGgsIHZpZXcpOwotICAgIG1hcmdpbkxlZnQg
PSBzdHlsZS0+bWFyZ2luTGVmdCgpLmlzQXV0bygpID8gbWFyZ2luTGVmdCA6IGludFZhbHVlRm9y
TGVuZ3RoKHN0eWxlLT5tYXJnaW5MZWZ0KCksIHdpZHRoLCB2aWV3KTsKLX0KLQotdm9pZCBEb2N1
bWVudDo6c2V0RG9jdW1lbnRSYXJlRGF0YShOb2RlUmFyZURhdGEqIHJhcmVEYXRhKQotewotICAg
IG1fZG9jdW1lbnRSYXJlRGF0YSA9IHJhcmVEYXRhOwotfQotCi12b2lkIERvY3VtZW50OjpzZXRJ
c1ZpZXdTb3VyY2UoYm9vbCBpc1ZpZXdTb3VyY2UpCi17Ci0gICAgbV9pc1ZpZXdTb3VyY2UgPSBp
c1ZpZXdTb3VyY2U7Ci0gICAgaWYgKCFtX2lzVmlld1NvdXJjZSkKLSAgICAgICAgcmV0dXJuOwot
Ci0gICAgc2V0U2VjdXJpdHlPcmlnaW4oU2VjdXJpdHlPcmlnaW46OmNyZWF0ZVVuaXF1ZSgpKTsK
LSAgICBkaWRVcGRhdGVTZWN1cml0eU9yaWdpbigpOwotfQotCi12b2lkIERvY3VtZW50Ojpjb21i
aW5lQ1NTRmVhdHVyZUZsYWdzKCkKLXsKLSAgICAvLyBEZWxheSByZXNldHRpbmcgdGhlIGZsYWdz
IHVudGlsIGFmdGVyIG5leHQgc3R5bGUgcmVjYWxjIHNpbmNlIHVuYXBwbHlpbmcgdGhlIHN0eWxl
IG1heSBub3Qgd29yayB3aXRob3V0IHRoZXNlIHNldCAodGhpcyBpcyB0cnVlIGF0IGxlYXN0IHdp
dGggYmVmb3JlL2FmdGVyKS4KLSAgICBtX3VzZXNTaWJsaW5nUnVsZXMgPSBtX3VzZXNTaWJsaW5n
UnVsZXMgfHwgbV9zdHlsZVJlc29sdmVyLT51c2VzU2libGluZ1J1bGVzKCk7Ci0gICAgbV91c2Vz
Rmlyc3RMaW5lUnVsZXMgPSBtX3VzZXNGaXJzdExpbmVSdWxlcyB8fCBtX3N0eWxlUmVzb2x2ZXIt
PnVzZXNGaXJzdExpbmVSdWxlcygpOwotICAgIG1fdXNlc0JlZm9yZUFmdGVyUnVsZXMgPSBtX3Vz
ZXNCZWZvcmVBZnRlclJ1bGVzIHx8IG1fc3R5bGVSZXNvbHZlci0+dXNlc0JlZm9yZUFmdGVyUnVs
ZXMoKTsKLSAgICBtX3VzZXNMaW5rUnVsZXMgPSBtX3VzZXNMaW5rUnVsZXMgfHwgbV9zdHlsZVJl
c29sdmVyLT51c2VzTGlua1J1bGVzKCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnJlc2V0Q1NTRmVh
dHVyZUZsYWdzKCkKLXsKLSAgICBtX3VzZXNTaWJsaW5nUnVsZXMgPSBtX3N0eWxlUmVzb2x2ZXIt
PnVzZXNTaWJsaW5nUnVsZXMoKTsKLSAgICBtX3VzZXNGaXJzdExpbmVSdWxlcyA9IG1fc3R5bGVS
ZXNvbHZlci0+dXNlc0ZpcnN0TGluZVJ1bGVzKCk7Ci0gICAgbV91c2VzQmVmb3JlQWZ0ZXJSdWxl
cyA9IG1fc3R5bGVSZXNvbHZlci0+dXNlc0JlZm9yZUFmdGVyUnVsZXMoKTsKLSAgICBtX3VzZXNM
aW5rUnVsZXMgPSBtX3N0eWxlUmVzb2x2ZXItPnVzZXNMaW5rUnVsZXMoKTsKLX0KLQotdm9pZCBE
b2N1bWVudDo6Y3JlYXRlU3R5bGVSZXNvbHZlcigpCi17Ci0gICAgYm9vbCBtYXRjaEF1dGhvckFu
ZFVzZXJTdHlsZXMgPSB0cnVlOwotICAgIGlmIChTZXR0aW5ncyogZG9jU2V0dGluZ3MgPSBzZXR0
aW5ncygpKQotICAgICAgICBtYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMgPSBkb2NTZXR0aW5ncy0+
YXV0aG9yQW5kVXNlclN0eWxlc0VuYWJsZWQoKTsKLSAgICBtX3N0eWxlUmVzb2x2ZXIgPSBhZG9w
dFB0cihuZXcgU3R5bGVSZXNvbHZlcih0aGlzLCBtYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpKTsK
LSAgICBjb21iaW5lQ1NTRmVhdHVyZUZsYWdzKCk7Ci19Ci0KLWlubGluZSB2b2lkIERvY3VtZW50
OjpjbGVhclN0eWxlUmVzb2x2ZXIoKQotewotICAgIG1fc3R5bGVSZXNvbHZlci5jbGVhcigpOwot
fQotCi12b2lkIERvY3VtZW50OjphdHRhY2goKQotewotICAgIEFTU0VSVCghYXR0YWNoZWQoKSk7
Ci0gICAgQVNTRVJUKCFtX2luUGFnZUNhY2hlKTsKLSAgICBBU1NFUlQoIW1fYXhPYmplY3RDYWNo
ZSB8fCB0aGlzICE9IHRvcERvY3VtZW50KCkpOwotCi0gICAgaWYgKCFtX3JlbmRlckFyZW5hKQot
ICAgICAgICBtX3JlbmRlckFyZW5hID0gYWRvcHRQdHIobmV3IFJlbmRlckFyZW5hKTsKLSAgICAK
LSAgICAvLyBDcmVhdGUgdGhlIHJlbmRlcmluZyB0cmVlCi0gICAgc2V0UmVuZGVyZXIobmV3ICht
X3JlbmRlckFyZW5hLmdldCgpKSBSZW5kZXJWaWV3KHRoaXMsIHZpZXcoKSkpOwotI2lmIFVTRShB
Q0NFTEVSQVRFRF9DT01QT1NJVElORykKLSAgICByZW5kZXJWaWV3KCktPmRpZE1vdmVPbnNjcmVl
bigpOwotI2VuZGlmCi0KLSAgICByZWNhbGNTdHlsZShGb3JjZSk7Ci0KLSAgICBSZW5kZXJPYmpl
Y3QqIHJlbmRlciA9IHJlbmRlcmVyKCk7Ci0gICAgc2V0UmVuZGVyZXIoMCk7Ci0KLSAgICBDb250
YWluZXJOb2RlOjphdHRhY2goKTsKLQotICAgIHNldFJlbmRlcmVyKHJlbmRlcik7Ci19Ci0KLXZv
aWQgRG9jdW1lbnQ6OmRldGFjaCgpCi17Ci0gICAgQVNTRVJUKGF0dGFjaGVkKCkpOwotICAgIEFT
U0VSVCghbV9pblBhZ2VDYWNoZSk7Ci0KLSNpZiBFTkFCTEUoUE9JTlRFUl9MT0NLKQotICAgIGlm
IChwYWdlKCkpCi0gICAgICAgIHBhZ2UoKS0+cG9pbnRlckxvY2tDb250cm9sbGVyKCktPmRvY3Vt
ZW50RGV0YWNoZWQodGhpcyk7Ci0jZW5kaWYKLQotICAgIGlmICh0aGlzID09IHRvcERvY3VtZW50
KCkpCi0gICAgICAgIGNsZWFyQVhPYmplY3RDYWNoZSgpOwotCi0gICAgc3RvcEFjdGl2ZURPTU9i
amVjdHMoKTsKLSAgICBtX2V2ZW50UXVldWUtPmNsb3NlKCk7Ci0jaWYgRU5BQkxFKEZVTExTQ1JF
RU5fQVBJKQotICAgIG1fZnVsbFNjcmVlbkNoYW5nZUV2ZW50VGFyZ2V0UXVldWUuY2xlYXIoKTsK
LSAgICBtX2Z1bGxTY3JlZW5FcnJvckV2ZW50VGFyZ2V0UXVldWUuY2xlYXIoKTsKLSNlbmRpZgot
Ci0jaWYgRU5BQkxFKFJFUVVFU1RfQU5JTUFUSU9OX0ZSQU1FKQotICAgIC8vIEZJWE1FOiBjb25z
aWRlciB1c2luZyBBY3RpdmVET01PYmplY3QuCi0gICAgaWYgKG1fc2NyaXB0ZWRBbmltYXRpb25D
b250cm9sbGVyKQotICAgICAgICBtX3NjcmlwdGVkQW5pbWF0aW9uQ29udHJvbGxlci0+Y2xlYXJE
b2N1bWVudFBvaW50ZXIoKTsKLSAgICBtX3NjcmlwdGVkQW5pbWF0aW9uQ29udHJvbGxlci5jbGVh
cigpOwotI2VuZGlmCi0KLSAgICBSZW5kZXJPYmplY3QqIHJlbmRlciA9IHJlbmRlcmVyKCk7Ci0K
LSAgICBkb2N1bWVudFdpbGxCZWNvbWVJbmFjdGl2ZSgpOwotCi0jaWYgRU5BQkxFKFNIQVJFRF9X
T1JLRVJTKQotICAgIFNoYXJlZFdvcmtlclJlcG9zaXRvcnk6OmRvY3VtZW50RGV0YWNoZWQodGhp
cyk7Ci0jZW5kaWYKLQotICAgIGlmIChtX2ZyYW1lKSB7Ci0gICAgICAgIEZyYW1lVmlldyogdmll
dyA9IG1fZnJhbWUtPnZpZXcoKTsKLSAgICAgICAgaWYgKHZpZXcpCi0gICAgICAgICAgICB2aWV3
LT5kZXRhY2hDdXN0b21TY3JvbGxiYXJzKCk7Ci0KLSAgICB9Ci0KLSAgICAvLyBpbmRpY2F0ZSBk
ZXN0cnVjdGlvbiBtb2RlLCAgaS5lLiBhdHRhY2hlZCgpIGJ1dCByZW5kZXJlciA9PSAwCi0gICAg
c2V0UmVuZGVyZXIoMCk7Ci0gICAgCi0jaWYgRU5BQkxFKEZVTExTQ1JFRU5fQVBJKQotICAgIGlm
IChtX2Z1bGxTY3JlZW5SZW5kZXJlcikKLSAgICAgICAgc2V0RnVsbFNjcmVlblJlbmRlcmVyKDAp
OwotI2VuZGlmCi0KLSAgICBtX2hvdmVyTm9kZSA9IDA7Ci0gICAgbV9mb2N1c2VkTm9kZSA9IDA7
Ci0gICAgbV9hY3RpdmVOb2RlID0gMDsKLQotICAgIENvbnRhaW5lck5vZGU6OmRldGFjaCgpOwot
Ci0gICAgdW5zY2hlZHVsZVN0eWxlUmVjYWxjKCk7Ci0KLSAgICBpZiAocmVuZGVyKQotICAgICAg
ICByZW5kZXItPmRlc3Ryb3koKTsKLQotICAgIC8vIFRoaXMgaXMgcmVxdWlyZWQsIGFzIG91ciBG
cmFtZSBtaWdodCBkZWxldGUgaXRzZWxmIGFzIHNvb24gYXMgaXQgZGV0YWNoZXMKLSAgICAvLyB1
cy4gSG93ZXZlciwgdGhpcyB2aW9sYXRlcyBOb2RlOjpkZXRhY2goKSBzZW1hbnRpY3MsIGFzIGl0
J3MgbmV2ZXIKLSAgICAvLyBwb3NzaWJsZSB0byByZS1hdHRhY2guIEV2ZW50dWFsbHkgRG9jdW1l
bnQ6OmRldGFjaCgpIHNob3VsZCBiZSByZW5hbWVkLAotICAgIC8vIG9yIHRoaXMgc2V0dGluZyBv
ZiB0aGUgZnJhbWUgdG8gMCBjb3VsZCBiZSBtYWRlIGV4cGxpY2l0IGluIGVhY2ggb2YgdGhlCi0g
ICAgLy8gY2FsbGVycyBvZiBEb2N1bWVudDo6ZGV0YWNoKCkuCi0gICAgbV9mcmFtZSA9IDA7Ci0g
ICAgbV9yZW5kZXJBcmVuYS5jbGVhcigpOwotfQotCi12b2lkIERvY3VtZW50OjpwcmVwYXJlRm9y
RGVzdHJ1Y3Rpb24oKQotewotICAgIGRpc2Nvbm5lY3REZXNjZW5kYW50RnJhbWVzKCk7Ci0gICAg
aWYgKERPTVdpbmRvdyogd2luZG93ID0gdGhpcy0+ZG9tV2luZG93KCkpCi0gICAgICAgIHdpbmRv
dy0+d2lsbERldGFjaERvY3VtZW50RnJvbUZyYW1lKCk7Ci0gICAgZGV0YWNoKCk7Ci19Ci0KLXZv
aWQgRG9jdW1lbnQ6OnJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzKCkKLXsKLSAgICBFdmVudFRhcmdl
dDo6cmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnMoKTsKLQotICAgIGlmIChET01XaW5kb3cqIGRvbVdp
bmRvdyA9IHRoaXMtPmRvbVdpbmRvdygpKQotICAgICAgICBkb21XaW5kb3ctPnJlbW92ZUFsbEV2
ZW50TGlzdGVuZXJzKCk7Ci0gICAgZm9yIChOb2RlKiBub2RlID0gZmlyc3RDaGlsZCgpOyBub2Rl
OyBub2RlID0gbm9kZS0+dHJhdmVyc2VOZXh0Tm9kZSgpKQotICAgICAgICBub2RlLT5yZW1vdmVB
bGxFdmVudExpc3RlbmVycygpOwotfQotCi12b2lkIERvY3VtZW50OjpzdXNwZW5kQWN0aXZlRE9N
T2JqZWN0cyhBY3RpdmVET01PYmplY3Q6OlJlYXNvbkZvclN1c3BlbnNpb24gd2h5KQotewotICAg
IFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQ6OnN1c3BlbmRBY3RpdmVET01PYmplY3RzKHdoeSk7Ci0K
LSNpZiBFTkFCTEUoREVWSUNFX09SSUVOVEFUSU9OKQotICAgIGlmICghcGFnZSgpKQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBpZiAoRGV2aWNlTW90aW9uQ29udHJvbGxlciogY29udHJvbGxlciA9
IERldmljZU1vdGlvbkNvbnRyb2xsZXI6OmZyb20ocGFnZSgpKSkKLSAgICAgICAgY29udHJvbGxl
ci0+c3VzcGVuZEV2ZW50c0ZvckFsbExpc3RlbmVycyhkb21XaW5kb3coKSk7Ci0gICAgaWYgKERl
dmljZU9yaWVudGF0aW9uQ29udHJvbGxlciogY29udHJvbGxlciA9IERldmljZU9yaWVudGF0aW9u
Q29udHJvbGxlcjo6ZnJvbShwYWdlKCkpKQotICAgICAgICBjb250cm9sbGVyLT5zdXNwZW5kRXZl
bnRzRm9yQWxsTGlzdGVuZXJzKGRvbVdpbmRvdygpKTsKLQotI2VuZGlmCi19Ci0KLXZvaWQgRG9j
dW1lbnQ6OnJlc3VtZUFjdGl2ZURPTU9iamVjdHMoKQotewotICAgIFNjcmlwdEV4ZWN1dGlvbkNv
bnRleHQ6OnJlc3VtZUFjdGl2ZURPTU9iamVjdHMoKTsKLQotI2lmIEVOQUJMRShERVZJQ0VfT1JJ
RU5UQVRJT04pCi0gICAgaWYgKCFwYWdlKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmIChE
ZXZpY2VNb3Rpb25Db250cm9sbGVyKiBjb250cm9sbGVyID0gRGV2aWNlTW90aW9uQ29udHJvbGxl
cjo6ZnJvbShwYWdlKCkpKQotICAgICAgICBjb250cm9sbGVyLT5yZXN1bWVFdmVudHNGb3JBbGxM
aXN0ZW5lcnMoZG9tV2luZG93KCkpOwotICAgIGlmIChEZXZpY2VPcmllbnRhdGlvbkNvbnRyb2xs
ZXIqIGNvbnRyb2xsZXIgPSBEZXZpY2VPcmllbnRhdGlvbkNvbnRyb2xsZXI6OmZyb20ocGFnZSgp
KSkKLSAgICAgICAgY29udHJvbGxlci0+cmVzdW1lRXZlbnRzRm9yQWxsTGlzdGVuZXJzKGRvbVdp
bmRvdygpKTsKLSNlbmRpZgotfQotCi1SZW5kZXJWaWV3KiBEb2N1bWVudDo6cmVuZGVyVmlldygp
IGNvbnN0Ci17Ci0gICAgcmV0dXJuIHRvUmVuZGVyVmlldyhyZW5kZXJlcigpKTsKLX0KLQotdm9p
ZCBEb2N1bWVudDo6Y2xlYXJBWE9iamVjdENhY2hlKCkKLXsKLSAgICAvLyBjbGVhciBjYWNoZSBp
biB0b3AgZG9jdW1lbnQKLSAgICBpZiAobV9heE9iamVjdENhY2hlKSB7Ci0gICAgICAgIC8vIENs
ZWFyIHRoZSBjYWNoZSBtZW1iZXIgdmFyaWFibGUgYmVmb3JlIGNhbGxpbmcgZGVsZXRlIGJlY2F1
c2UgYXR0ZW1wdHMKLSAgICAgICAgLy8gYXJlIG1hZGUgdG8gYWNjZXNzIGl0IGR1cmluZyBkZXN0
cnVjdGlvbi4KLSAgICAgICAgQVhPYmplY3RDYWNoZSogYXhPYmplY3RDYWNoZSA9IG1fYXhPYmpl
Y3RDYWNoZTsKLSAgICAgICAgbV9heE9iamVjdENhY2hlID0gMDsKLSAgICAgICAgZGVsZXRlIGF4
T2JqZWN0Q2FjaGU7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0gICAgLy8gYXNrIHRo
ZSB0b3AtbGV2ZWwgZG9jdW1lbnQgdG8gY2xlYXIgaXRzIGNhY2hlCi0gICAgRG9jdW1lbnQqIGRv
YyA9IHRvcERvY3VtZW50KCk7Ci0gICAgaWYgKGRvYyAhPSB0aGlzKQotICAgICAgICBkb2MtPmNs
ZWFyQVhPYmplY3RDYWNoZSgpOwotfQotCi1ib29sIERvY3VtZW50OjpheE9iamVjdENhY2hlRXhp
c3RzKCkgY29uc3QKLXsKLSAgICBpZiAobV9heE9iamVjdENhY2hlKQotICAgICAgICByZXR1cm4g
dHJ1ZTsKLSAgICAKLSAgICBEb2N1bWVudCogZG9jID0gdG9wRG9jdW1lbnQoKTsKLSAgICBpZiAo
ZG9jICE9IHRoaXMpCi0gICAgICAgIHJldHVybiBkb2MtPmF4T2JqZWN0Q2FjaGVFeGlzdHMoKTsK
LSAgICAKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0gICAgCi1BWE9iamVjdENhY2hlKiBEb2N1bWVu
dDo6YXhPYmplY3RDYWNoZSgpIGNvbnN0Ci17Ci0gICAgLy8gVGhlIG9ubHkgZG9jdW1lbnQgdGhh
dCBhY3R1YWxseSBoYXMgYSBBWE9iamVjdENhY2hlIGlzIHRoZSB0b3AtbGV2ZWwKLSAgICAvLyBk
b2N1bWVudC4gIFRoaXMgaXMgYmVjYXVzZSB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gZ2V0IGZyb20g
YW55IFdlYkNvcmVBWE9iamVjdAotICAgIC8vIHRvIGFueSBvdGhlciBXZWJDb3JlQVhPYmplY3Qg
b24gdGhlIHNhbWUgcGFnZS4gIFVzaW5nIGEgc2luZ2xlIGNhY2hlIGFsbG93cwotICAgIC8vIGxv
b2t1cHMgYWNyb3NzIG5lc3RlZCB3ZWJhcmVhcyAoaS5lLiBtdWx0aXBsZSBkb2N1bWVudHMpLgot
ICAgIAotICAgIGlmIChtX2F4T2JqZWN0Q2FjaGUpIHsKLSAgICAgICAgLy8gcmV0dXJuIGFscmVh
ZHkga25vd24gdG9wLWxldmVsIGNhY2hlCi0gICAgICAgIGlmICghb3duZXJFbGVtZW50KCkpCi0g
ICAgICAgICAgICByZXR1cm4gbV9heE9iamVjdENhY2hlOwotICAgICAgICAKLSAgICAgICAgLy8g
SW4gc29tZSBwYWdlcyB3aXRoIGZyYW1lcywgdGhlIGNhY2hlIGlzIGNyZWF0ZWQgYmVmb3JlIHRo
ZSBzdWItd2ViYXJlYSBpcwotICAgICAgICAvLyBpbnNlcnRlZCBpbnRvIHRoZSB0cmVlLiAgSGVy
ZSwgd2UgY2F0Y2ggdGhhdCBjYXNlIGFuZCBqdXN0IHRvc3MgdGhlIG9sZAotICAgICAgICAvLyBj
YWNoZSBhbmQgc3RhcnQgb3Zlci4KLSAgICAgICAgLy8gTk9URTogVGhpcyByZWNvdmVyeSBtYXkg
bm8gbG9uZ2VyIGJlIG5lZWRlZC4gSSBoYXZlIGJlZW4gdW5hYmxlIHRvIHRyaWdnZXIKLSAgICAg
ICAgLy8gaXQgYWdhaW4uIFNlZSByZGFyOi8vNTc5NDQ1NAotICAgICAgICAvLyBGSVhNRTogQ2Fu
IHRoaXMgYmUgZml4ZWQgd2hlbiBpbnNlcnRpbmcgdGhlIHN1YmZyYW1lIGluc3RlYWQgb2Ygbm93
PwotICAgICAgICAvLyBGSVhNRTogSWYgdGhpcyBmdW5jdGlvbiB3YXMgY2FsbGVkIHRvIGdldCB0
aGUgY2FjaGUgaW4gb3JkZXIgdG8gcmVtb3ZlCi0gICAgICAgIC8vIGFuIEFYT2JqZWN0LCB3ZSBh
cmUgbm93IGRlbGV0aW5nIHRoZSBjYWNoZSBhcyBhIHdob2xlIGFuZCByZXR1cm5pbmcgYQotICAg
ICAgICAvLyBuZXcgZW1wdHkgY2FjaGUgdGhhdCBkb2VzIG5vdCBjb250YWluIHRoZSBBWE9iamVj
dCEgVGhhdCBzaG91bGQgYWN0dWFsbHkKLSAgICAgICAgLy8gYmUgT0suIEkgYW0gY29uY2VybmVk
IGFib3V0IG90aGVyIGNhc2VzIGxpa2UgdGhpcyB3aGVyZSBhY2Nlc3NpbmcgdGhlCi0gICAgICAg
IC8vIGNhY2hlIGJsb3dzIGF3YXkgdGhlIEFYT2JqZWN0IGJlaW5nIG9wZXJhdGVkIG9uLgotICAg
ICAgICBkZWxldGUgbV9heE9iamVjdENhY2hlOwotICAgICAgICBtX2F4T2JqZWN0Q2FjaGUgPSAw
OwotICAgIH0KLQotICAgIC8vIGFzayB0aGUgdG9wLWxldmVsIGRvY3VtZW50IGZvciBpdHMgY2Fj
aGUKLSAgICBEb2N1bWVudCogZG9jID0gdG9wRG9jdW1lbnQoKTsKLSAgICBpZiAoZG9jICE9IHRo
aXMpCi0gICAgICAgIHJldHVybiBkb2MtPmF4T2JqZWN0Q2FjaGUoKTsKLSAgICAKLSAgICAvLyB0
aGlzIGlzIHRoZSB0b3AtbGV2ZWwgZG9jdW1lbnQsIHNvIGluc3RhbGwgYSBuZXcgY2FjaGUKLSAg
ICBtX2F4T2JqZWN0Q2FjaGUgPSBuZXcgQVhPYmplY3RDYWNoZSh0aGlzKTsKLSAgICByZXR1cm4g
bV9heE9iamVjdENhY2hlOwotfQotCi12b2lkIERvY3VtZW50OjpzZXRWaXN1YWxseU9yZGVyZWQo
KQotewotICAgIG1fdmlzdWFsbHlPcmRlcmVkID0gdHJ1ZTsKLSAgICBpZiAocmVuZGVyZXIoKSkK
LSAgICAgICAgcmVuZGVyZXIoKS0+c3R5bGUoKS0+c2V0UlRMT3JkZXJpbmcoVmlzdWFsT3JkZXIp
OwotfQotCi1QYXNzUmVmUHRyPERvY3VtZW50UGFyc2VyPiBEb2N1bWVudDo6Y3JlYXRlUGFyc2Vy
KCkKLXsKLSAgICAvLyBGSVhNRTogdGhpcyBzaG91bGQgcHJvYmFibHkgcGFzcyB0aGUgZnJhbWUg
aW5zdGVhZAotI2lmIEVOQUJMRShORVdfWE1MKQotICAgIHJldHVybiBOZXdYTUxEb2N1bWVudFBh
cnNlcjo6Y3JlYXRlKHRoaXMpOwotI2Vsc2UKLSAgICByZXR1cm4gWE1MRG9jdW1lbnRQYXJzZXI6
OmNyZWF0ZSh0aGlzLCB2aWV3KCkpOwotI2VuZGlmCi19Ci0KLVNjcmlwdGFibGVEb2N1bWVudFBh
cnNlciogRG9jdW1lbnQ6OnNjcmlwdGFibGVEb2N1bWVudFBhcnNlcigpIGNvbnN0Ci17Ci0gICAg
cmV0dXJuIHBhcnNlcigpID8gcGFyc2VyKCktPmFzU2NyaXB0YWJsZURvY3VtZW50UGFyc2VyKCkg
OiAwOwotfQotCi12b2lkIERvY3VtZW50OjpvcGVuKERvY3VtZW50KiBvd25lckRvY3VtZW50KQot
ewotICAgIGlmIChvd25lckRvY3VtZW50KSB7Ci0gICAgICAgIHNldFVSTChvd25lckRvY3VtZW50
LT51cmwoKSk7Ci0gICAgICAgIG1fY29va2llVVJMID0gb3duZXJEb2N1bWVudC0+Y29va2llVVJM
KCk7Ci0gICAgICAgIHNldFNlY3VyaXR5T3JpZ2luKG93bmVyRG9jdW1lbnQtPnNlY3VyaXR5T3Jp
Z2luKCkpOwotICAgIH0KLQotICAgIGlmIChtX2ZyYW1lKSB7Ci0gICAgICAgIGlmIChTY3JpcHRh
YmxlRG9jdW1lbnRQYXJzZXIqIHBhcnNlciA9IHNjcmlwdGFibGVEb2N1bWVudFBhcnNlcigpKSB7
Ci0gICAgICAgICAgICBpZiAocGFyc2VyLT5pc1BhcnNpbmcoKSkgewotICAgICAgICAgICAgICAg
IC8vIEZJWE1FOiBIVE1MNSBkb2Vzbid0IHRlbGwgdXMgdG8gY2hlY2sgdGhpcywgaXQgbWlnaHQg
bm90IGJlIGNvcnJlY3QuCi0gICAgICAgICAgICAgICAgaWYgKHBhcnNlci0+aXNFeGVjdXRpbmdT
Y3JpcHQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICAgICAg
aWYgKCFwYXJzZXItPndhc0NyZWF0ZWRCeVNjcmlwdCgpICYmIHBhcnNlci0+aGFzSW5zZXJ0aW9u
UG9pbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAg
ICAgICB9Ci0KLSAgICAgICAgaWYgKG1fZnJhbWUtPmxvYWRlcigpLT5zdGF0ZSgpID09IEZyYW1l
U3RhdGVQcm92aXNpb25hbCkKLSAgICAgICAgICAgIG1fZnJhbWUtPmxvYWRlcigpLT5zdG9wQWxs
TG9hZGVycygpOwotICAgIH0KLQotICAgIHJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzKCk7Ci0gICAg
aW1wbGljaXRPcGVuKCk7Ci0gICAgaWYgKFNjcmlwdGFibGVEb2N1bWVudFBhcnNlciogcGFyc2Vy
ID0gc2NyaXB0YWJsZURvY3VtZW50UGFyc2VyKCkpCi0gICAgICAgIHBhcnNlci0+c2V0V2FzQ3Jl
YXRlZEJ5U2NyaXB0KHRydWUpOwotCi0gICAgaWYgKERPTVdpbmRvdyogZG9tV2luZG93ID0gdGhp
cy0+ZG9tV2luZG93KCkpCi0gICAgICAgIGRvbVdpbmRvdy0+cmVtb3ZlQWxsRXZlbnRMaXN0ZW5l
cnMoKTsKLQotICAgIGlmIChtX2ZyYW1lKQotICAgICAgICBtX2ZyYW1lLT5sb2FkZXIoKS0+ZGlk
RXhwbGljaXRPcGVuKCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmRldGFjaFBhcnNlcigpCi17Ci0g
ICAgaWYgKCFtX3BhcnNlcikKLSAgICAgICAgcmV0dXJuOwotICAgIG1fcGFyc2VyLT5kZXRhY2go
KTsKLSAgICBtX3BhcnNlci5jbGVhcigpOwotfQotCi12b2lkIERvY3VtZW50OjpjYW5jZWxQYXJz
aW5nKCkKLXsKLSAgICBpZiAoIW1fcGFyc2VyKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBX
ZSBoYXZlIHRvIGNsZWFyIHRoZSBwYXJzZXIgdG8gYXZvaWQgcG9zc2libHkgdHJpZ2dlcmluZwot
ICAgIC8vIHRoZSBvbmxvYWQgaGFuZGxlciB3aGVuIGNsb3NpbmcgYXMgYSBzaWRlIGVmZmVjdCBv
ZiBhIGNhbmNlbC1zdHlsZQotICAgIC8vIGNoYW5nZSwgc3VjaCBhcyBvcGVuaW5nIGEgbmV3IGRv
Y3VtZW50IG9yIGNsb3NpbmcgdGhlIHdpbmRvdyB3aGlsZQotICAgIC8vIHN0aWxsIHBhcnNpbmcK
LSAgICBkZXRhY2hQYXJzZXIoKTsKLSAgICBleHBsaWNpdENsb3NlKCk7Ci19Ci0KLXZvaWQgRG9j
dW1lbnQ6OmltcGxpY2l0T3BlbigpCi17Ci0gICAgY2FuY2VsUGFyc2luZygpOwotCi0gICAgcmVt
b3ZlQ2hpbGRyZW4oKTsKLQotICAgIHNldENvbXBhdGliaWxpdHlNb2RlKE5vUXVpcmtzTW9kZSk7
Ci0KLSAgICBtX3BhcnNlciA9IGNyZWF0ZVBhcnNlcigpOwotICAgIHNldFBhcnNpbmcodHJ1ZSk7
Ci0gICAgc2V0UmVhZHlTdGF0ZShMb2FkaW5nKTsKLX0KLQotSFRNTEVsZW1lbnQqIERvY3VtZW50
Ojpib2R5KCkgY29uc3QKLXsKLSAgICBOb2RlKiBkZSA9IGRvY3VtZW50RWxlbWVudCgpOwotICAg
IGlmICghZGUpCi0gICAgICAgIHJldHVybiAwOwotICAgIAotICAgIC8vIHRyeSB0byBwcmVmZXIg
YSBGUkFNRVNFVCBlbGVtZW50IG92ZXIgQk9EWQotICAgIE5vZGUqIGJvZHkgPSAwOwotICAgIGZv
ciAoTm9kZSogaSA9IGRlLT5maXJzdENoaWxkKCk7IGk7IGkgPSBpLT5uZXh0U2libGluZygpKSB7
Ci0gICAgICAgIGlmIChpLT5oYXNUYWdOYW1lKGZyYW1lc2V0VGFnKSkKLSAgICAgICAgICAgIHJl
dHVybiB0b0hUTUxFbGVtZW50KGkpOwotICAgICAgICAKLSAgICAgICAgaWYgKGktPmhhc1RhZ05h
bWUoYm9keVRhZykgJiYgIWJvZHkpCi0gICAgICAgICAgICBib2R5ID0gaTsKLSAgICB9Ci0gICAg
cmV0dXJuIHRvSFRNTEVsZW1lbnQoYm9keSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnNldEJvZHko
UGFzc1JlZlB0cjxIVE1MRWxlbWVudD4gcHJwTmV3Qm9keSwgRXhjZXB0aW9uQ29kZSYgZWMpCi17
Ci0gICAgUmVmUHRyPEhUTUxFbGVtZW50PiBuZXdCb2R5ID0gcHJwTmV3Qm9keTsKLQotICAgIGlm
ICghbmV3Qm9keSB8fCAhZG9jdW1lbnRFbGVtZW50KCkgfHwgIW5ld0JvZHktPmhhc1RhZ05hbWUo
Ym9keVRhZykpIHsgCi0gICAgICAgIGVjID0gSElFUkFSQ0hZX1JFUVVFU1RfRVJSOwotICAgICAg
ICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG5ld0JvZHktPmRvY3VtZW50KCkgJiYgbmV3Qm9k
eS0+ZG9jdW1lbnQoKSAhPSB0aGlzKSB7Ci0gICAgICAgIGVjID0gMDsKLSAgICAgICAgUmVmUHRy
PE5vZGU+IG5vZGUgPSBpbXBvcnROb2RlKG5ld0JvZHkuZ2V0KCksIHRydWUsIGVjKTsKLSAgICAg
ICAgaWYgKGVjKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAgICAgICAgbmV3Qm9k
eSA9IHRvSFRNTEVsZW1lbnQobm9kZS5nZXQoKSk7Ci0gICAgfQotCi0gICAgSFRNTEVsZW1lbnQq
IGIgPSBib2R5KCk7Ci0gICAgaWYgKCFiKQotICAgICAgICBkb2N1bWVudEVsZW1lbnQoKS0+YXBw
ZW5kQ2hpbGQobmV3Qm9keS5yZWxlYXNlKCksIGVjKTsKLSAgICBlbHNlCi0gICAgICAgIGRvY3Vt
ZW50RWxlbWVudCgpLT5yZXBsYWNlQ2hpbGQobmV3Qm9keS5yZWxlYXNlKCksIGIsIGVjKTsKLX0K
LQotSFRNTEhlYWRFbGVtZW50KiBEb2N1bWVudDo6aGVhZCgpCi17Ci0gICAgTm9kZSogZGUgPSBk
b2N1bWVudEVsZW1lbnQoKTsKLSAgICBpZiAoIWRlKQotICAgICAgICByZXR1cm4gMDsKLQotICAg
IGZvciAoTm9kZSogZSA9IGRlLT5maXJzdENoaWxkKCk7IGU7IGUgPSBlLT5uZXh0U2libGluZygp
KQotICAgICAgICBpZiAoZS0+aGFzVGFnTmFtZShoZWFkVGFnKSkKLSAgICAgICAgICAgIHJldHVy
biBzdGF0aWNfY2FzdDxIVE1MSGVhZEVsZW1lbnQqPihlKTsKLQotICAgIHJldHVybiAwOwotfQot
Ci12b2lkIERvY3VtZW50OjpjbG9zZSgpCi17Ci0gICAgLy8gRklYTUU6IFdlIHNob3VsZCBmb2xs
b3cgdGhlIHNwZWNpZmljYXRpb24gbW9yZSBjbG9zZWx5OgotICAgIC8vICAgICAgICBodHRwOi8v
d3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrLyNkb20tZG9jdW1lbnQt
Y2xvc2UKLQotICAgIGlmICghc2NyaXB0YWJsZURvY3VtZW50UGFyc2VyKCkgfHwgIXNjcmlwdGFi
bGVEb2N1bWVudFBhcnNlcigpLT53YXNDcmVhdGVkQnlTY3JpcHQoKSB8fCAhc2NyaXB0YWJsZURv
Y3VtZW50UGFyc2VyKCktPmlzUGFyc2luZygpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBleHBs
aWNpdENsb3NlKCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmV4cGxpY2l0Q2xvc2UoKQotewotICAg
IGlmIChtX3BhcnNlcikKLSAgICAgICAgbV9wYXJzZXItPmZpbmlzaCgpOwotCi0gICAgaWYgKCFt
X2ZyYW1lKSB7Ci0gICAgICAgIC8vIEJlY2F1c2Ugd2UgaGF2ZSBubyBmcmFtZSwgd2UgZG9uJ3Qg
a25vdyBpZiBhbGwgbG9hZGluZyBoYXMgY29tcGxldGVkLAotICAgICAgICAvLyBzbyB3ZSBqdXN0
IGNhbGwgaW1wbGljaXRDbG9zZSgpIGltbWVkaWF0ZWx5LiBGSVhNRTogVGhpcyBtaWdodCBmaXJl
Ci0gICAgICAgIC8vIHRoZSBsb2FkIGV2ZW50IHByZW1hdHVyZWx5IDxodHRwOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDU2OD4uCi0gICAgICAgIGltcGxpY2l0Q2xvc2UoKTsK
LSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1fZnJhbWUtPmxvYWRlcigpLT5jaGVja0Nv
bXBsZXRlZCgpOwotfQotCi12b2lkIERvY3VtZW50OjppbXBsaWNpdENsb3NlKCkKLXsKLSAgICAv
LyBJZiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIHJlY2FsY1N0eWxlLCB3ZSBuZWVkIHRvIGRlZmVy
IHRoZSBjbG9zZSB1bnRpbCB0aGUgc3R5bGUgaW5mb3JtYXRpb24gaXMgYWNjdXJhdGUgYW5kIGFs
bCBlbGVtZW50cyBhcmUgcmUtYXR0YWNoZWQuCi0gICAgaWYgKG1faW5TdHlsZVJlY2FsYykgewot
ICAgICAgICBtX2Nsb3NlQWZ0ZXJTdHlsZVJlY2FsYyA9IHRydWU7Ci0gICAgICAgIHJldHVybjsK
LSAgICB9Ci0KLSAgICBib29sIHdhc0xvY2F0aW9uQ2hhbmdlUGVuZGluZyA9IGZyYW1lKCkgJiYg
ZnJhbWUoKS0+bmF2aWdhdGlvblNjaGVkdWxlcigpLT5sb2NhdGlvbkNoYW5nZVBlbmRpbmcoKTsK
LSAgICBib29sIGRvbG9hZCA9ICFwYXJzaW5nKCkgJiYgbV9wYXJzZXIgJiYgIW1fcHJvY2Vzc2lu
Z0xvYWRFdmVudCAmJiAhd2FzTG9jYXRpb25DaGFuZ2VQZW5kaW5nOwotICAgIAotICAgIGlmICgh
ZG9sb2FkKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX3Byb2Nlc3NpbmdMb2FkRXZlbnQgPSB0
cnVlOwotCi0gICAgU2NyaXB0YWJsZURvY3VtZW50UGFyc2VyKiBwYXJzZXIgPSBzY3JpcHRhYmxl
RG9jdW1lbnRQYXJzZXIoKTsKLSAgICBtX3dlbGxGb3JtZWQgPSBwYXJzZXIgJiYgcGFyc2VyLT53
ZWxsRm9ybWVkKCk7Ci0KLSAgICAvLyBXZSBoYXZlIHRvIGNsZWFyIHRoZSBwYXJzZXIsIGluIGNh
c2Ugc29tZW9uZSBkb2N1bWVudC53cml0ZSgpcyBmcm9tIHRoZQotICAgIC8vIG9uTG9hZCBldmVu
dCBoYW5kbGVyLCBhcyBpbiBSYWRhciAzMjA2NTI0LgotICAgIGRldGFjaFBhcnNlcigpOwotCi0g
ICAgLy8gUGFyc2VyIHNob3VsZCBoYXZlIHBpY2tlZCB1cCBhbGwgcHJlbG9hZHMgYnkgbm93Ci0g
ICAgbV9jYWNoZWRSZXNvdXJjZUxvYWRlci0+Y2xlYXJQcmVsb2FkcygpOwotCi0gICAgLy8gRklY
TUU6IFdlIGtpY2sgb2ZmIHRoZSBpY29uIGxvYWRlciB3aGVuIHRoZSBEb2N1bWVudCBpcyBkb25l
IHBhcnNpbmcuCi0gICAgLy8gVGhlcmUgYXJlIGVhcmxpZXIgb3Bwb3J0dW5pdGllcyB3ZSBjb3Vs
ZCBzdGFydCBpdDoKLSAgICAvLyAgLVdoZW4gdGhlIDxoZWFkPiBmaW5pc2hlcyBwYXJzaW5nCi0g
ICAgLy8gIC1XaGVuIGFueSBuZXcgSFRNTExpbmtFbGVtZW50IGlzIGluc2VydGVkIGludG8gdGhl
IGRvY3VtZW50Ci0gICAgLy8gQnV0IHRob3NlIGFkZCBhIGR5bmFtaWMgY29tcG9uZW50IHRvIHRo
ZSBmYXZpY29uIHRoYXQgaGFzIFVJIAotICAgIC8vIHJhbWlmaWNhdGlvbnMsIGFuZCB3ZSBuZWVk
IHRvIGRlY2lkZSB3aGF0IGlzIHRoZSBSaWdodCBUaGluZyBUbyBEbyh0bSkKLSAgICBGcmFtZSog
ZiA9IGZyYW1lKCk7Ci0gICAgaWYgKGYpIHsKLSAgICAgICAgZi0+bG9hZGVyKCktPmljb24oKS0+
c3RhcnRMb2FkZXIoKTsKLSAgICAgICAgZi0+YW5pbWF0aW9uKCktPnJlc3VtZUFuaW1hdGlvbnNG
b3JEb2N1bWVudCh0aGlzKTsKLSAgICB9Ci0KLSAgICBJbWFnZUxvYWRlcjo6ZGlzcGF0Y2hQZW5k
aW5nQmVmb3JlTG9hZEV2ZW50cygpOwotICAgIEltYWdlTG9hZGVyOjpkaXNwYXRjaFBlbmRpbmdM
b2FkRXZlbnRzKCk7Ci0gICAgSW1hZ2VMb2FkZXI6OmRpc3BhdGNoUGVuZGluZ0Vycm9yRXZlbnRz
KCk7Ci0KLSAgICBIVE1MTGlua0VsZW1lbnQ6OmRpc3BhdGNoUGVuZGluZ0xvYWRFdmVudHMoKTsK
LSAgICBIVE1MU3R5bGVFbGVtZW50OjpkaXNwYXRjaFBlbmRpbmdMb2FkRXZlbnRzKCk7Ci0KLSNp
ZiBFTkFCTEUoU1ZHKQotICAgIC8vIFRvIGFsaWduIHRoZSBIVE1MIGxvYWQgZXZlbnQgYW5kIHRo
ZSBTVkdMb2FkIGV2ZW50IGZvciB0aGUgb3V0ZXJtb3N0IDxzdmc+IGVsZW1lbnQsIGZpcmUgaXQg
ZnJvbQotICAgIC8vIGhlcmUsIGluc3RlYWQgb2YgZG9pbmcgaXQgZnJvbSBTVkdFbGVtZW50Ojpm
aW5pc2hlZFBhcnNpbmdDaGlsZHJlbiAoaWYgZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZD0iZmFs
c2UiLAotICAgIC8vIHdoaWNoIGlzIHRoZSBkZWZhdWx0LCBmb3IgPSd0cnVlJyBpdHMgZmlyZWQg
YXQgYSBsYXRlciB0aW1lLCBvbmNlIGFsbCBleHRlcm5hbCByZXNvdXJjZXMgZmluaXNoZWQgbG9h
ZGluZykuCi0gICAgaWYgKHN2Z0V4dGVuc2lvbnMoKSkKLSAgICAgICAgYWNjZXNzU1ZHRXh0ZW5z
aW9ucygpLT5kaXNwYXRjaFNWR0xvYWRFdmVudFRvT3V0ZXJtb3N0U1ZHRWxlbWVudHMoKTsKLSNl
bmRpZgotCi0gICAgZGlzcGF0Y2hXaW5kb3dMb2FkRXZlbnQoKTsKLSAgICBlbnF1ZXVlUGFnZXNo
b3dFdmVudChQYWdlc2hvd0V2ZW50Tm90UGVyc2lzdGVkKTsKLSAgICBlbnF1ZXVlUG9wc3RhdGVF
dmVudChtX3BlbmRpbmdTdGF0ZU9iamVjdCA/IG1fcGVuZGluZ1N0YXRlT2JqZWN0LnJlbGVhc2Uo
KSA6IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6bnVsbFZhbHVlKCkpOwotICAgIAotICAgIGlmIChm
KQotICAgICAgICBmLT5sb2FkZXIoKS0+aGFuZGxlZE9ubG9hZEV2ZW50cygpOwotI2lmZGVmIElO
U1RSVU1FTlRfTEFZT1VUX1NDSEVEVUxJTkcKLSAgICBpZiAoIW93bmVyRWxlbWVudCgpKQotICAg
ICAgICBwcmludGYoIm9ubG9hZCBmaXJlZCBhdCAlZFxuIiwgZWxhcHNlZFRpbWUoKSk7Ci0jZW5k
aWYKLQotICAgIC8vIEFuIGV2ZW50IGhhbmRsZXIgbWF5IGhhdmUgcmVtb3ZlZCB0aGUgZnJhbWUK
LSAgICBpZiAoIWZyYW1lKCkpIHsKLSAgICAgICAgbV9wcm9jZXNzaW5nTG9hZEV2ZW50ID0gZmFs
c2U7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBNYWtlIHN1cmUgYm90aCB0aGUg
aW5pdGlhbCBsYXlvdXQgYW5kIHJlZmxvdyBoYXBwZW4gYWZ0ZXIgdGhlIG9ubG9hZAotICAgIC8v
IGZpcmVzLiBUaGlzIHdpbGwgaW1wcm92ZSBvbmxvYWQgc2NvcmVzLCBhbmQgb3RoZXIgYnJvd3Nl
cnMgZG8gaXQuCi0gICAgLy8gSWYgdGhleSB3YW5uYSBjaGVhdCwgd2UgY2FuIHRvby4gLWR3aAot
Ci0gICAgaWYgKGZyYW1lKCktPm5hdmlnYXRpb25TY2hlZHVsZXIoKS0+bG9jYXRpb25DaGFuZ2VQ
ZW5kaW5nKCkgJiYgZWxhcHNlZFRpbWUoKSA8IGNMYXlvdXRTY2hlZHVsZVRocmVzaG9sZCkgewot
ICAgICAgICAvLyBKdXN0IGJhaWwgb3V0LiBCZWZvcmUgb3IgZHVyaW5nIHRoZSBvbmxvYWQgd2Ug
d2VyZSBzaGlmdGVkIHRvIGFub3RoZXIgcGFnZS4KLSAgICAgICAgLy8gVGhlIG9sZCBpLUJlbmNo
IHN1aXRlIGRvZXMgdGhpcy4gV2hlbiB0aGlzIGhhcHBlbnMgZG9uJ3QgYm90aGVyIHBhaW50aW5n
IG9yIGxheWluZyBvdXQuICAgICAgICAKLSAgICAgICAgbV9wcm9jZXNzaW5nTG9hZEV2ZW50ID0g
ZmFsc2U7Ci0gICAgICAgIHZpZXcoKS0+dW5zY2hlZHVsZVJlbGF5b3V0KCk7Ci0gICAgICAgIHJl
dHVybjsKLSAgICB9Ci0KLSAgICBmcmFtZSgpLT5sb2FkZXIoKS0+Y2hlY2tDYWxsSW1wbGljaXRD
bG9zZSgpOwotICAgIFJlbmRlck9iamVjdCogcmVuZGVyT2JqZWN0ID0gcmVuZGVyZXIoKTsKLSAg
ICAKLSAgICAvLyBXZSB1c2VkIHRvIGZvcmNlIGEgc3luY2hyb25vdXMgZGlzcGxheSBhbmQgZmx1
c2ggaGVyZS4gIFRoaXMgcmVhbGx5IGlzbid0Ci0gICAgLy8gbmVjZXNzYXJ5IGFuZCBjYW4gaW4g
ZmFjdCBiZSBhY3RpdmVseSBoYXJtZnVsIGlmIHBhZ2VzIGFyZSBsb2FkaW5nIGF0IGEgcmF0ZSBv
ZiA+IDYwZnBzCi0gICAgLy8gKGlmIHlvdXIgcGxhdGZvcm0gaXMgc3luY2luZyBmbHVzaGVzIGFu
ZCBsaW1pdGluZyB0aGVtIHRvIDYwZnBzKS4KLSAgICBtX292ZXJNaW5pbXVtTGF5b3V0VGhyZXNo
b2xkID0gdHJ1ZTsKLSAgICBpZiAoIW93bmVyRWxlbWVudCgpIHx8IChvd25lckVsZW1lbnQoKS0+
cmVuZGVyZXIoKSAmJiAhb3duZXJFbGVtZW50KCktPnJlbmRlcmVyKCktPm5lZWRzTGF5b3V0KCkp
KSB7Ci0gICAgICAgIHVwZGF0ZVN0eWxlSWZOZWVkZWQoKTsKLSAgICAgICAgCi0gICAgICAgIC8v
IEFsd2F5cyBkbyBhIGxheW91dCBhZnRlciBsb2FkaW5nIGlmIG5lZWRlZC4KLSAgICAgICAgaWYg
KHZpZXcoKSAmJiByZW5kZXJPYmplY3QgJiYgKCFyZW5kZXJPYmplY3QtPmZpcnN0Q2hpbGQoKSB8
fCByZW5kZXJPYmplY3QtPm5lZWRzTGF5b3V0KCkpKQotICAgICAgICAgICAgdmlldygpLT5sYXlv
dXQoKTsKLSAgICB9Ci0KLSAgICBtX3Byb2Nlc3NpbmdMb2FkRXZlbnQgPSBmYWxzZTsKLQotI2lm
IFBMQVRGT1JNKE1BQykgfHwgUExBVEZPUk0oQ0hST01JVU0pCi0gICAgaWYgKGYgJiYgcmVuZGVy
T2JqZWN0ICYmIEFYT2JqZWN0Q2FjaGU6OmFjY2Vzc2liaWxpdHlFbmFibGVkKCkpIHsKLSAgICAg
ICAgLy8gVGhlIEFYIGNhY2hlIG1heSBoYXZlIGJlZW4gY2xlYXJlZCBhdCB0aGlzIHBvaW50LCBi
dXQgd2UgbmVlZCB0byBtYWtlIHN1cmUgaXQgY29udGFpbnMgYW4KLSAgICAgICAgLy8gQVggb2Jq
ZWN0IHRvIHNlbmQgdGhlIG5vdGlmaWNhdGlvbiB0by4gZ2V0T3JDcmVhdGUgd2lsbCBtYWtlIHN1
cmUgdGhhdCBhbiB2YWxpZCBBWCBvYmplY3QKLSAgICAgICAgLy8gZXhpc3RzIGluIHRoZSBjYWNo
ZSAod2UgaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgYmVjYXVzZSB3ZSBkb24ndCBuZWVkIGl0IGhl
cmUpLiBUaGlzIGlzIAotICAgICAgICAvLyBvbmx5IHNhZmUgdG8gY2FsbCB3aGVuIGEgbGF5b3V0
IGlzIG5vdCBpbiBwcm9ncmVzcywgc28gaXQgY2FuIG5vdCBiZSB1c2VkIGluIHBvc3ROb3RpZmlj
YXRpb24uICAgIAotICAgICAgICBheE9iamVjdENhY2hlKCktPmdldE9yQ3JlYXRlKHJlbmRlck9i
amVjdCk7Ci0gICAgICAgIGlmICh0aGlzID09IHRvcERvY3VtZW50KCkpCi0gICAgICAgICAgICBh
eE9iamVjdENhY2hlKCktPnBvc3ROb3RpZmljYXRpb24ocmVuZGVyT2JqZWN0LCBBWE9iamVjdENh
Y2hlOjpBWExvYWRDb21wbGV0ZSwgdHJ1ZSk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAg
Ly8gQVhMb2FkQ29tcGxldGUgY2FuIG9ubHkgYmUgcG9zdGVkIG9uIHRoZSB0b3AgZG9jdW1lbnQs
IHNvIGlmIGl0J3MgYSBkb2N1bWVudAotICAgICAgICAgICAgLy8gaW4gYW4gaWZyYW1lIHRoYXQg
anVzdCBmaW5pc2hlZCBsb2FkaW5nLCBwb3N0IEFYTGF5b3V0Q29tcGxldGUgaW5zdGVhZC4KLSAg
ICAgICAgICAgIGF4T2JqZWN0Q2FjaGUoKS0+cG9zdE5vdGlmaWNhdGlvbihyZW5kZXJPYmplY3Qs
IEFYT2JqZWN0Q2FjaGU6OkFYTGF5b3V0Q29tcGxldGUsIHRydWUpOwotICAgICAgICB9Ci0gICAg
fQotI2VuZGlmCi0KLSNpZiBFTkFCTEUoU1ZHKQotICAgIGlmIChzdmdFeHRlbnNpb25zKCkpCi0g
ICAgICAgIGFjY2Vzc1NWR0V4dGVuc2lvbnMoKS0+c3RhcnRBbmltYXRpb25zKCk7Ci0jZW5kaWYK
LX0KLQotdm9pZCBEb2N1bWVudDo6c2V0UGFyc2luZyhib29sIGIpCi17Ci0gICAgbV9iUGFyc2lu
ZyA9IGI7Ci0gICAgaWYgKCFtX2JQYXJzaW5nICYmIHZpZXcoKSkKLSAgICAgICAgdmlldygpLT5z
Y2hlZHVsZVJlbGF5b3V0KCk7Ci0KLSNpZmRlZiBJTlNUUlVNRU5UX0xBWU9VVF9TQ0hFRFVMSU5H
Ci0gICAgaWYgKCFvd25lckVsZW1lbnQoKSAmJiAhbV9iUGFyc2luZykKLSAgICAgICAgcHJpbnRm
KCJQYXJzaW5nIGZpbmlzaGVkIGF0ICVkXG4iLCBlbGFwc2VkVGltZSgpKTsKLSNlbmRpZgotfQot
Ci1ib29sIERvY3VtZW50OjpzaG91bGRTY2hlZHVsZUxheW91dCgpCi17Ci0gICAgLy8gVGhpcyBm
dW5jdGlvbiB3aWxsIG9ubHkgYmUgY2FsbGVkIHdoZW4gRnJhbWVWaWV3IHRoaW5rcyBhIGxheW91
dCBpcyBuZWVkZWQuCi0gICAgLy8gVGhpcyBlbmZvcmNlcyBhIGNvdXBsZSBleHRyYSBydWxlcy4K
LSAgICAvLwotICAgIC8vICAgIChhKSBPbmx5IHNjaGVkdWxlIGEgbGF5b3V0IG9uY2UgdGhlIHN0
eWxlc2hlZXRzIGFyZSBsb2FkZWQuCi0gICAgLy8gICAgKGIpIE9ubHkgc2NoZWR1bGUgbGF5b3V0
IG9uY2Ugd2UgaGF2ZSBhIGJvZHkgZWxlbWVudC4KLQotICAgIHJldHVybiAoaGF2ZVN0eWxlc2hl
ZXRzTG9hZGVkKCkgJiYgYm9keSgpKQotICAgICAgICB8fCAoZG9jdW1lbnRFbGVtZW50KCkgJiYg
IWRvY3VtZW50RWxlbWVudCgpLT5oYXNUYWdOYW1lKGh0bWxUYWcpKTsKLX0KLSAgICAKLWJvb2wg
RG9jdW1lbnQ6OmlzTGF5b3V0VGltZXJBY3RpdmUoKQotewotICAgIHJldHVybiB2aWV3KCkgJiYg
dmlldygpLT5sYXlvdXRQZW5kaW5nKCkgJiYgIW1pbmltdW1MYXlvdXREZWxheSgpOwotfQotCi1p
bnQgRG9jdW1lbnQ6Om1pbmltdW1MYXlvdXREZWxheSgpCi17Ci0gICAgaWYgKG1fb3Zlck1pbmlt
dW1MYXlvdXRUaHJlc2hvbGQpCi0gICAgICAgIHJldHVybiAwOwotICAgIAotICAgIGludCBlbGFw
c2VkID0gZWxhcHNlZFRpbWUoKTsKLSAgICBtX292ZXJNaW5pbXVtTGF5b3V0VGhyZXNob2xkID0g
ZWxhcHNlZCA+IGNMYXlvdXRTY2hlZHVsZVRocmVzaG9sZDsKLSAgICAKLSAgICAvLyBXZSdsbCB3
YW50IHRvIHNjaGVkdWxlIHRoZSB0aW1lciB0byBmaXJlIGF0IHRoZSBtaW5pbXVtIGxheW91dCB0
aHJlc2hvbGQuCi0gICAgcmV0dXJuIG1heCgwLCBjTGF5b3V0U2NoZWR1bGVUaHJlc2hvbGQgLSBl
bGFwc2VkKTsKLX0KLQotaW50IERvY3VtZW50OjplbGFwc2VkVGltZSgpIGNvbnN0Ci17Ci0gICAg
cmV0dXJuIHN0YXRpY19jYXN0PGludD4oKGN1cnJlbnRUaW1lKCkgLSBtX3N0YXJ0VGltZSkgKiAx
MDAwKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6d3JpdGUoY29uc3QgU2VnbWVudGVkU3RyaW5nJiB0
ZXh0LCBEb2N1bWVudCogb3duZXJEb2N1bWVudCkKLXsKLSAgICBOZXN0aW5nTGV2ZWxJbmNyZW1l
bnRlciBuZXN0aW5nTGV2ZWxJbmNyZW1lbnRlcihtX3dyaXRlUmVjdXJzaW9uRGVwdGgpOwotCi0g
ICAgbV93cml0ZVJlY3Vyc2lvbklzVG9vRGVlcCA9IChtX3dyaXRlUmVjdXJzaW9uRGVwdGggPiAx
KSAmJiBtX3dyaXRlUmVjdXJzaW9uSXNUb29EZWVwOwotICAgIG1fd3JpdGVSZWN1cnNpb25Jc1Rv
b0RlZXAgPSAobV93cml0ZVJlY3Vyc2lvbkRlcHRoID4gY01heFdyaXRlUmVjdXJzaW9uRGVwdGgp
IHx8IG1fd3JpdGVSZWN1cnNpb25Jc1Rvb0RlZXA7Ci0KLSAgICBpZiAobV93cml0ZVJlY3Vyc2lv
bklzVG9vRGVlcCkKLSAgICAgICByZXR1cm47Ci0KLSNpZmRlZiBJTlNUUlVNRU5UX0xBWU9VVF9T
Q0hFRFVMSU5HCi0gICAgaWYgKCFvd25lckVsZW1lbnQoKSkKLSAgICAgICAgcHJpbnRmKCJCZWdp
bm5pbmcgYSBkb2N1bWVudC53cml0ZSBhdCAlZFxuIiwgZWxhcHNlZFRpbWUoKSk7Ci0jZW5kaWYK
LQotICAgIGJvb2wgaGFzSW5zZXJ0aW9uUG9pbnQgPSBtX3BhcnNlciAmJiBtX3BhcnNlci0+aGFz
SW5zZXJ0aW9uUG9pbnQoKTsKLSAgICBpZiAoIWhhc0luc2VydGlvblBvaW50ICYmIG1faWdub3Jl
RGVzdHJ1Y3RpdmVXcml0ZUNvdW50KQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAoIWhhc0lu
c2VydGlvblBvaW50KQotICAgICAgICBvcGVuKG93bmVyRG9jdW1lbnQpOwotCi0gICAgQVNTRVJU
KG1fcGFyc2VyKTsKLSAgICBtX3BhcnNlci0+aW5zZXJ0KHRleHQpOwotCi0jaWZkZWYgSU5TVFJV
TUVOVF9MQVlPVVRfU0NIRURVTElORwotICAgIGlmICghb3duZXJFbGVtZW50KCkpCi0gICAgICAg
IHByaW50ZigiRW5kaW5nIGEgZG9jdW1lbnQud3JpdGUgYXQgJWRcbiIsIGVsYXBzZWRUaW1lKCkp
OwotI2VuZGlmICAgIAotfQotCi12b2lkIERvY3VtZW50Ojp3cml0ZShjb25zdCBTdHJpbmcmIHRl
eHQsIERvY3VtZW50KiBvd25lckRvY3VtZW50KQotewotICAgIHdyaXRlKFNlZ21lbnRlZFN0cmlu
Zyh0ZXh0KSwgb3duZXJEb2N1bWVudCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OndyaXRlbG4oY29u
c3QgU3RyaW5nJiB0ZXh0LCBEb2N1bWVudCogb3duZXJEb2N1bWVudCkKLXsKLSAgICB3cml0ZSh0
ZXh0LCBvd25lckRvY3VtZW50KTsKLSAgICB3cml0ZSgiXG4iLCBvd25lckRvY3VtZW50KTsKLX0K
LQotY29uc3QgS1VSTCYgRG9jdW1lbnQ6OnZpcnR1YWxVUkwoKSBjb25zdAotewotICAgIHJldHVy
biBtX3VybDsKLX0KLQotS1VSTCBEb2N1bWVudDo6dmlydHVhbENvbXBsZXRlVVJMKGNvbnN0IFN0
cmluZyYgdXJsKSBjb25zdAotewotICAgIHJldHVybiBjb21wbGV0ZVVSTCh1cmwpOwotfQotCi1k
b3VibGUgRG9jdW1lbnQ6Om1pbmltdW1UaW1lckludGVydmFsKCkgY29uc3QKLXsKLSAgICBQYWdl
KiBwID0gcGFnZSgpOwotICAgIGlmICghcCkKLSAgICAgICAgcmV0dXJuIFNjcmlwdEV4ZWN1dGlv
bkNvbnRleHQ6Om1pbmltdW1UaW1lckludGVydmFsKCk7Ci0gICAgcmV0dXJuIHAtPnNldHRpbmdz
KCktPm1pbkRPTVRpbWVySW50ZXJ2YWwoKTsKLX0KLQotRXZlbnRUYXJnZXQqIERvY3VtZW50Ojpl
cnJvckV2ZW50VGFyZ2V0KCkKLXsKLSAgICByZXR1cm4gZG9tV2luZG93KCk7Ci19Ci0KLXZvaWQg
RG9jdW1lbnQ6OmxvZ0V4Y2VwdGlvblRvQ29uc29sZShjb25zdCBTdHJpbmcmIGVycm9yTWVzc2Fn
ZSwgY29uc3QgU3RyaW5nJiBzb3VyY2VVUkwsIGludCBsaW5lTnVtYmVyLCBQYXNzUmVmUHRyPFNj
cmlwdENhbGxTdGFjaz4gY2FsbFN0YWNrKQotewotICAgIGFkZENvbnNvbGVNZXNzYWdlKEpTTWVz
c2FnZVNvdXJjZSwgTG9nTWVzc2FnZVR5cGUsIEVycm9yTWVzc2FnZUxldmVsLCBlcnJvck1lc3Nh
Z2UsIHNvdXJjZVVSTCwgbGluZU51bWJlciwgY2FsbFN0YWNrKTsKLX0KLQotdm9pZCBEb2N1bWVu
dDo6c2V0VVJMKGNvbnN0IEtVUkwmIHVybCkKLXsKLSAgICBjb25zdCBLVVJMJiBuZXdVUkwgPSB1
cmwuaXNFbXB0eSgpID8gYmxhbmtVUkwoKSA6IHVybDsKLSAgICBpZiAobmV3VVJMID09IG1fdXJs
KQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX3VybCA9IG5ld1VSTDsKLSAgICBtX2RvY3VtZW50
VVJJID0gbV91cmwuc3RyaW5nKCk7Ci0gICAgdXBkYXRlQmFzZVVSTCgpOwotICAgIGNvbnRleHRG
ZWF0dXJlcygpLT51cmxEaWRDaGFuZ2UodGhpcyk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnVwZGF0
ZUJhc2VVUkwoKQotewotICAgIEtVUkwgb2xkQmFzZVVSTCA9IG1fYmFzZVVSTDsKLSAgICAvLyBE
T00gMyBDb3JlOiBXaGVuIHRoZSBEb2N1bWVudCBzdXBwb3J0cyB0aGUgZmVhdHVyZSAiSFRNTCIg
W0RPTSBMZXZlbCAyIEhUTUxdLCB0aGUgYmFzZSBVUkkgaXMgY29tcHV0ZWQgdXNpbmcKLSAgICAv
LyBmaXJzdCB0aGUgdmFsdWUgb2YgdGhlIGhyZWYgYXR0cmlidXRlIG9mIHRoZSBIVE1MIEJBU0Ug
ZWxlbWVudCBpZiBhbnksIGFuZCB0aGUgdmFsdWUgb2YgdGhlIGRvY3VtZW50VVJJIGF0dHJpYnV0
ZQotICAgIC8vIGZyb20gdGhlIERvY3VtZW50IGludGVyZmFjZSBvdGhlcndpc2UuCi0gICAgaWYg
KCFtX2Jhc2VFbGVtZW50VVJMLmlzRW1wdHkoKSkKLSAgICAgICAgbV9iYXNlVVJMID0gbV9iYXNl
RWxlbWVudFVSTDsKLSAgICBlbHNlIGlmICghbV9iYXNlVVJMT3ZlcnJpZGUuaXNFbXB0eSgpKQot
ICAgICAgICBtX2Jhc2VVUkwgPSBtX2Jhc2VVUkxPdmVycmlkZTsKLSAgICBlbHNlIHsKLSAgICAg
ICAgLy8gVGhlIGRvY3VtZW50VVJJIGF0dHJpYnV0ZSBpcyByZWFkLW9ubHkgZnJvbSBKYXZhU2Ny
aXB0LCBidXQgd3JpdGFibGUgZnJvbSBPYmplY3RpdmUgQywgc28gd2UgbmVlZCB0byByZXRhaW4K
LSAgICAgICAgLy8gdGhpcyBmYWxsYmFjayBiZWhhdmlvci4gV2UgdXNlIGEgbnVsbCBiYXNlIFVS
TCwgc2luY2UgdGhlIGRvY3VtZW50VVJJIGF0dHJpYnV0ZSBpcyBhbiBhcmJpdHJhcnkgc3RyaW5n
Ci0gICAgICAgIC8vIGFuZCBET00gMyBDb3JlIGRvZXMgbm90IHNwZWNpZnkgaG93IGl0IHNob3Vs
ZCBiZSByZXNvbHZlZC4KLSAgICAgICAgbV9iYXNlVVJMID0gS1VSTChLVVJMKCksIGRvY3VtZW50
VVJJKCkpOwotICAgIH0KLSAgICBzZWxlY3RvclF1ZXJ5Q2FjaGUoKS0+aW52YWxpZGF0ZSgpOwot
Ci0gICAgaWYgKCFtX2Jhc2VVUkwuaXNWYWxpZCgpKQotICAgICAgICBtX2Jhc2VVUkwgPSBLVVJM
KCk7Ci0KLSAgICBpZiAobV9lbGVtU2hlZXQpIHsKLSAgICAgICAgLy8gRWxlbWVudCBzaGVldCBp
cyBzaWxseS4gSXQgbmV2ZXIgY29udGFpbnMgYW55dGhpbmcuCi0gICAgICAgIEFTU0VSVCghbV9l
bGVtU2hlZXQtPmNvbnRlbnRzKCktPnJ1bGVDb3VudCgpKTsKLSAgICAgICAgYm9vbCB1c2VzUmVt
VW5pdHMgPSBtX2VsZW1TaGVldC0+Y29udGVudHMoKS0+dXNlc1JlbVVuaXRzKCk7Ci0gICAgICAg
IG1fZWxlbVNoZWV0ID0gQ1NTU3R5bGVTaGVldDo6Y3JlYXRlSW5saW5lKHRoaXMsIG1fYmFzZVVS
TCk7Ci0gICAgICAgIC8vIEZJWE1FOiBTbyB3ZSBhcmUgbm90IHJlYWxseSB0aGUgcGFyc2VyLiBU
aGUgcmlnaHQgZml4IGlzIHRvIGVsaW1pbmF0ZSB0aGUgZWxlbWVudCBzaGVldCBjb21wbGV0ZWx5
LgotICAgICAgICBtX2VsZW1TaGVldC0+Y29udGVudHMoKS0+cGFyc2VyU2V0VXNlc1JlbVVuaXRz
KHVzZXNSZW1Vbml0cyk7Ci0gICAgfQotCi0gICAgaWYgKCFlcXVhbElnbm9yaW5nRnJhZ21lbnRJ
ZGVudGlmaWVyKG9sZEJhc2VVUkwsIG1fYmFzZVVSTCkpIHsKLSAgICAgICAgLy8gQmFzZSBVUkwg
Y2hhbmdlIGNoYW5nZXMgYW55IHJlbGF0aXZlIHZpc2l0ZWQgbGlua3MuCi0gICAgICAgIC8vIEZJ
WE1FOiBUaGVyZSBhcmUgb3RoZXIgVVJMcyBpbiB0aGUgdHJlZSB0aGF0IHdvdWxkIG5lZWQgdG8g
YmUgcmUtZXZhbHVhdGVkIG9uIGR5bmFtaWMgYmFzZSBVUkwgY2hhbmdlLiBTdHlsZSBzaG91bGQg
YmUgaW52YWxpZGF0ZWQgdG9vLgotICAgICAgICBmb3IgKE5vZGUqIG5vZGUgPSBmaXJzdENoaWxk
KCk7IG5vZGU7IG5vZGUgPSBub2RlLT50cmF2ZXJzZU5leHROb2RlKCkpIHsKLSAgICAgICAgICAg
IGlmIChub2RlLT5oYXNUYWdOYW1lKGFUYWcpKQotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0
PEhUTUxBbmNob3JFbGVtZW50Kj4obm9kZSktPmludmFsaWRhdGVDYWNoZWRWaXNpdGVkTGlua0hh
c2goKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBEb2N1bWVudDo6c2V0QmFzZVVSTE92
ZXJyaWRlKGNvbnN0IEtVUkwmIHVybCkKLXsKLSAgICBtX2Jhc2VVUkxPdmVycmlkZSA9IHVybDsK
LSAgICB1cGRhdGVCYXNlVVJMKCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnByb2Nlc3NCYXNlRWxl
bWVudCgpCi17Ci0gICAgLy8gRmluZCB0aGUgZmlyc3QgaHJlZiBhdHRyaWJ1dGUgaW4gYSBiYXNl
IGVsZW1lbnQgYW5kIHRoZSBmaXJzdCB0YXJnZXQgYXR0cmlidXRlIGluIGEgYmFzZSBlbGVtZW50
LgotICAgIGNvbnN0IEF0b21pY1N0cmluZyogaHJlZiA9IDA7Ci0gICAgY29uc3QgQXRvbWljU3Ry
aW5nKiB0YXJnZXQgPSAwOwotICAgIGZvciAoTm9kZSogbm9kZSA9IGRvY3VtZW50KCktPmZpcnN0
Q2hpbGQoKTsgbm9kZSAmJiAoIWhyZWYgfHwgIXRhcmdldCk7IG5vZGUgPSBub2RlLT50cmF2ZXJz
ZU5leHROb2RlKCkpIHsKLSAgICAgICAgaWYgKG5vZGUtPmhhc1RhZ05hbWUoYmFzZVRhZykpIHsK
LSAgICAgICAgICAgIGlmICghaHJlZikgewotICAgICAgICAgICAgICAgIGNvbnN0IEF0b21pY1N0
cmluZyYgdmFsdWUgPSBzdGF0aWNfY2FzdDxFbGVtZW50Kj4obm9kZSktPmZhc3RHZXRBdHRyaWJ1
dGUoaHJlZkF0dHIpOwotICAgICAgICAgICAgICAgIGlmICghdmFsdWUuaXNOdWxsKCkpCi0gICAg
ICAgICAgICAgICAgICAgIGhyZWYgPSAmdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAg
ICBpZiAoIXRhcmdldCkgewotICAgICAgICAgICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyYgdmFs
dWUgPSBzdGF0aWNfY2FzdDxFbGVtZW50Kj4obm9kZSktPmZhc3RHZXRBdHRyaWJ1dGUodGFyZ2V0
QXR0cik7Ci0gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZS5pc051bGwoKSkKLSAgICAgICAgICAg
ICAgICAgICAgdGFyZ2V0ID0gJnZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAg
fQotCi0gICAgLy8gRklYTUU6IFNpbmNlIHRoaXMgZG9lc24ndCBzaGFyZSBjb2RlIHdpdGggY29t
cGxldGVVUkwgaXQgbWF5IG5vdCBoYW5kbGUgZW5jb2RpbmdzIGNvcnJlY3RseS4KLSAgICBLVVJM
IGJhc2VFbGVtZW50VVJMOwotICAgIGlmIChocmVmKSB7Ci0gICAgICAgIFN0cmluZyBzdHJpcHBl
ZEhyZWYgPSBzdHJpcExlYWRpbmdBbmRUcmFpbGluZ0hUTUxTcGFjZXMoKmhyZWYpOwotICAgICAg
ICBpZiAoIXN0cmlwcGVkSHJlZi5pc0VtcHR5KCkpCi0gICAgICAgICAgICBiYXNlRWxlbWVudFVS
TCA9IEtVUkwodXJsKCksIHN0cmlwcGVkSHJlZik7Ci0gICAgfQotICAgIGlmIChtX2Jhc2VFbGVt
ZW50VVJMICE9IGJhc2VFbGVtZW50VVJMKSB7Ci0gICAgICAgIG1fYmFzZUVsZW1lbnRVUkwgPSBi
YXNlRWxlbWVudFVSTDsKLSAgICAgICAgdXBkYXRlQmFzZVVSTCgpOwotICAgIH0KLQotICAgIG1f
YmFzZVRhcmdldCA9IHRhcmdldCA/ICp0YXJnZXQgOiBudWxsQXRvbTsKLX0KLQotU3RyaW5nIERv
Y3VtZW50Ojp1c2VyQWdlbnQoY29uc3QgS1VSTCYgdXJsKSBjb25zdAotewotICAgIHJldHVybiBm
cmFtZSgpID8gZnJhbWUoKS0+bG9hZGVyKCktPnVzZXJBZ2VudCh1cmwpIDogU3RyaW5nKCk7Ci19
Ci0KLXZvaWQgRG9jdW1lbnQ6OmRpc2FibGVFdmFsKGNvbnN0IFN0cmluZyYgZXJyb3JNZXNzYWdl
KQotewotICAgIGlmICghZnJhbWUoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgZnJhbWUoKS0+
c2NyaXB0KCktPmRpc2FibGVFdmFsKGVycm9yTWVzc2FnZSk7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6
OmNhbk5hdmlnYXRlKEZyYW1lKiB0YXJnZXRGcmFtZSkKLXsKLSAgICBpZiAoIW1fZnJhbWUpCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIEZJWE1FOiBXZSBzaG91bGRuJ3QgY2FsbCB0
aGlzIGZ1bmN0aW9uIHdpdGhvdXQgYSB0YXJnZXQgZnJhbWUsIGJ1dAotICAgIC8vIGZhc3QvZm9y
bXMvc3VibWl0LXRvLWJsYW5rLW11bHRpcGxlLXRpbWVzLmh0bWwgZGVwZW5kcyBvbiB0aGlzIGZ1
bmN0aW9uCi0gICAgLy8gcmV0dXJuaW5nIHRydWUgd2hlbiBzdXBwbGllZCB3aXRoIGEgMCB0YXJn
ZXRGcmFtZS4KLSAgICBpZiAoIXRhcmdldEZyYW1lKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQot
ICAgIC8vIEZyYW1lLWJ1c3RpbmcgaXMgZ2VuZXJhbGx5IGFsbG93ZWQgKHVubGVzcyB3ZSdyZSBz
YW5kYm94ZWQgYW5kIHByZXZlbnQgZnJvbSBmcmFtZS1idXN0aW5nKS4KLSAgICBpZiAoIWlzU2Fu
ZGJveGVkKFNhbmRib3hUb3BOYXZpZ2F0aW9uKSAmJiB0YXJnZXRGcmFtZSA9PSBtX2ZyYW1lLT50
cmVlKCktPnRvcCgpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGlmIChpc1NhbmRib3hl
ZChTYW5kYm94TmF2aWdhdGlvbikpIHsKLSAgICAgICAgaWYgKHRhcmdldEZyYW1lLT50cmVlKCkt
PmlzRGVzY2VuZGFudE9mKG1fZnJhbWUpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAg
ICAgICAgcHJpbnROYXZpZ2F0aW9uRXJyb3JNZXNzYWdlKHRhcmdldEZyYW1lLCB1cmwoKSk7Ci0g
ICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBUaGlzIGlzIHRoZSBub3JtYWwg
Y2FzZS4gQSBkb2N1bWVudCBjYW4gbmF2aWdhdGUgaXRzIGRlY2VuZGFudCBmcmFtZXMsCi0gICAg
Ly8gb3IsIG1vcmUgZ2VuZXJhbGx5LCBhIGRvY3VtZW50IGNhbiBuYXZpZ2F0ZSBhIGZyYW1lIGlm
IHRoZSBkb2N1bWVudCBpcwotICAgIC8vIGluIHRoZSBzYW1lIG9yaWdpbiBhcyBhbnkgb2YgdGhh
dCBmcmFtZSdzIGFuY2VzdG9ycyAoaW4gdGhlIGZyYW1lCi0gICAgLy8gaGllcmFyY2h5KS4KLSAg
ICAvLwotICAgIC8vIFNlZSBodHRwOi8vd3d3LmFkYW1iYXJ0aC5jb20vcGFwZXJzLzIwMDgvYmFy
dGgtamFja3Nvbi1taXRjaGVsbC5wZGYgZm9yCi0gICAgLy8gaGlzdG9yaWNhbCBpbmZvcm1hdGlv
biBhYm91dCB0aGlzIHNlY3VyaXR5IGNoZWNrLgotICAgIGlmIChjYW5BY2Nlc3NBbmNlc3Rvcihz
ZWN1cml0eU9yaWdpbigpLCB0YXJnZXRGcmFtZSkpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0g
ICAgLy8gVG9wLWxldmVsIGZyYW1lcyBhcmUgZWFzaWVyIHRvIG5hdmlnYXRlIHRoYW4gb3RoZXIg
ZnJhbWVzIGJlY2F1c2UgdGhleQotICAgIC8vIGRpc3BsYXkgdGhlaXIgVVJMcyBpbiB0aGUgYWRk
cmVzcyBiYXIgKGluIG1vc3QgYnJvd3NlcnMpLiBIb3dldmVyLCB0aGVyZQotICAgIC8vIGFyZSBz
dGlsbCBzb21lIHJlc3RyaWN0aW9ucyBvbiBuYXZpZ2F0aW9uIHRvIGF2b2lkIG51aXNhbmNlIGF0
dGFja3MuCi0gICAgLy8gU3BlY2lmaWNhbGx5LCBhIGRvY3VtZW50IGNhbiBuYXZpZ2F0ZSBhIHRv
cC1sZXZlbCBmcmFtZSBpZiB0aGF0IGZyYW1lCi0gICAgLy8gb3BlbmVkIHRoZSBkb2N1bWVudCBv
ciBpZiB0aGUgZG9jdW1lbnQgaXMgdGhlIHNhbWUtb3JpZ2luIHdpdGggYW55IG9mCi0gICAgLy8g
dGhlIHRvcC1sZXZlbCBmcmFtZSdzIG9wZW5lcidzIGFuY2VzdG9ycyAoaW4gdGhlIGZyYW1lIGhp
ZXJhcmNoeSkuCi0gICAgLy8KLSAgICAvLyBJbiBib3RoIG9mIHRoZXNlIGNhc2VzLCB0aGUgZG9j
dW1lbnQgcGVyZm9ybWluZyB0aGUgbmF2aWdhdGlvbiBpcyBpbgotICAgIC8vIHNvbWUgd2F5IHJl
bGF0ZWQgdG8gdGhlIGZyYW1lIGJlaW5nIG5hdmlnYXRlIChlLmcuLCBieSB0aGUgIm9wZW5lciIK
LSAgICAvLyBhbmQvb3IgInBhcmVudCIgcmVsYXRpb24pLiBSZXF1aXJpbmcgc29tZSBzb3J0IG9m
IHJlbGF0aW9uIHByZXZlbnRzIGEKLSAgICAvLyBkb2N1bWVudCBmcm9tIG5hdmlnYXRpbmcgYXJi
aXRyYXJ5LCB1bnJlbGF0ZWQgdG9wLWxldmVsIGZyYW1lcy4KLSAgICBpZiAoIXRhcmdldEZyYW1l
LT50cmVlKCktPnBhcmVudCgpKSB7Ci0gICAgICAgIGlmICh0YXJnZXRGcmFtZSA9PSBtX2ZyYW1l
LT5sb2FkZXIoKS0+b3BlbmVyKCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAg
ICBpZiAoY2FuQWNjZXNzQW5jZXN0b3Ioc2VjdXJpdHlPcmlnaW4oKSwgdGFyZ2V0RnJhbWUtPmxv
YWRlcigpLT5vcGVuZXIoKSkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAg
ICBwcmludE5hdmlnYXRpb25FcnJvck1lc3NhZ2UodGFyZ2V0RnJhbWUsIHVybCgpKTsKLSAgICBy
ZXR1cm4gZmFsc2U7Ci19Ci0KLUZyYW1lKiBEb2N1bWVudDo6ZmluZFVuc2FmZVBhcmVudFNjcm9s
bFByb3BhZ2F0aW9uQm91bmRhcnkoKQotewotICAgIEZyYW1lKiBjdXJyZW50RnJhbWUgPSBtX2Zy
YW1lOwotICAgIEZyYW1lKiBhbmNlc3RvckZyYW1lID0gY3VycmVudEZyYW1lLT50cmVlKCktPnBh
cmVudCgpOyAKLQotICAgIHdoaWxlIChhbmNlc3RvckZyYW1lKSB7Ci0gICAgICAgIGlmICghYW5j
ZXN0b3JGcmFtZS0+ZG9jdW1lbnQoKS0+c2VjdXJpdHlPcmlnaW4oKS0+Y2FuQWNjZXNzKHNlY3Vy
aXR5T3JpZ2luKCkpKQotICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRGcmFtZTsKLSAgICAgICAg
Y3VycmVudEZyYW1lID0gYW5jZXN0b3JGcmFtZTsKLSAgICAgICAgYW5jZXN0b3JGcmFtZSA9IGFu
Y2VzdG9yRnJhbWUtPnRyZWUoKS0+cGFyZW50KCk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQot
Ci1DU1NTdHlsZVNoZWV0KiBEb2N1bWVudDo6cGFnZVVzZXJTaGVldCgpCi17Ci0gICAgaWYgKG1f
cGFnZVVzZXJTaGVldCkKLSAgICAgICAgcmV0dXJuIG1fcGFnZVVzZXJTaGVldC5nZXQoKTsKLSAg
ICAKLSAgICBQYWdlKiBvd25pbmdQYWdlID0gcGFnZSgpOwotICAgIGlmICghb3duaW5nUGFnZSkK
LSAgICAgICAgcmV0dXJuIDA7Ci0gICAgCi0gICAgU3RyaW5nIHVzZXJTaGVldFRleHQgPSBvd25p
bmdQYWdlLT51c2VyU3R5bGVTaGVldCgpOwotICAgIGlmICh1c2VyU2hlZXRUZXh0LmlzRW1wdHko
KSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgCi0gICAgLy8gUGFyc2UgdGhlIHNoZWV0IGFuZCBj
YWNoZSBpdC4KLSAgICBtX3BhZ2VVc2VyU2hlZXQgPSBDU1NTdHlsZVNoZWV0OjpjcmVhdGVJbmxp
bmUodGhpcywgc2V0dGluZ3MoKS0+dXNlclN0eWxlU2hlZXRMb2NhdGlvbigpKTsKLSAgICBtX3Bh
Z2VVc2VyU2hlZXQtPmNvbnRlbnRzKCktPnNldElzVXNlclN0eWxlU2hlZXQodHJ1ZSk7Ci0gICAg
bV9wYWdlVXNlclNoZWV0LT5jb250ZW50cygpLT5wYXJzZVN0cmluZyh1c2VyU2hlZXRUZXh0KTsK
LSAgICByZXR1cm4gbV9wYWdlVXNlclNoZWV0LmdldCgpOwotfQotCi12b2lkIERvY3VtZW50Ojpj
bGVhclBhZ2VVc2VyU2hlZXQoKQotewotICAgIGlmIChtX3BhZ2VVc2VyU2hlZXQpIHsKLSAgICAg
ICAgbV9wYWdlVXNlclNoZWV0ID0gMDsKLSAgICAgICAgc3R5bGVSZXNvbHZlckNoYW5nZWQoRGVm
ZXJSZWNhbGNTdHlsZSk7Ci0gICAgfQotfQotCi12b2lkIERvY3VtZW50Ojp1cGRhdGVQYWdlVXNl
clNoZWV0KCkKLXsKLSAgICBjbGVhclBhZ2VVc2VyU2hlZXQoKTsKLSAgICBpZiAocGFnZVVzZXJT
aGVldCgpKQotICAgICAgICBzdHlsZVJlc29sdmVyQ2hhbmdlZChSZWNhbGNTdHlsZUltbWVkaWF0
ZWx5KTsKLX0KLQotY29uc3QgVmVjdG9yPFJlZlB0cjxDU1NTdHlsZVNoZWV0PiA+KiBEb2N1bWVu
dDo6cGFnZUdyb3VwVXNlclNoZWV0cygpIGNvbnN0Ci17Ci0gICAgaWYgKG1fcGFnZUdyb3VwVXNl
clNoZWV0Q2FjaGVWYWxpZCkKLSAgICAgICAgcmV0dXJuIG1fcGFnZUdyb3VwVXNlclNoZWV0cy5n
ZXQoKTsKLSAgICAKLSAgICBtX3BhZ2VHcm91cFVzZXJTaGVldENhY2hlVmFsaWQgPSB0cnVlOwot
ICAgIAotICAgIFBhZ2UqIG93bmluZ1BhZ2UgPSBwYWdlKCk7Ci0gICAgaWYgKCFvd25pbmdQYWdl
KQotICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgCi0gICAgY29uc3QgUGFnZUdyb3VwJiBwYWdl
R3JvdXAgPSBvd25pbmdQYWdlLT5ncm91cCgpOwotICAgIGNvbnN0IFVzZXJTdHlsZVNoZWV0TWFw
KiBzaGVldHNNYXAgPSBwYWdlR3JvdXAudXNlclN0eWxlU2hlZXRzKCk7Ci0gICAgaWYgKCFzaGVl
dHNNYXApCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgVXNlclN0eWxlU2hlZXRNYXA6OmNvbnN0
X2l0ZXJhdG9yIGVuZCA9IHNoZWV0c01hcC0+ZW5kKCk7Ci0gICAgZm9yIChVc2VyU3R5bGVTaGVl
dE1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzaGVldHNNYXAtPmJlZ2luKCk7IGl0ICE9IGVuZDsg
KytpdCkgewotICAgICAgICBjb25zdCBVc2VyU3R5bGVTaGVldFZlY3Rvciogc2hlZXRzID0gaXQt
PnNlY29uZC5nZXQoKTsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNoZWV0cy0+
c2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIGNvbnN0IFVzZXJTdHlsZVNoZWV0KiBzaGVldCA9
IHNoZWV0cy0+YXQoaSkuZ2V0KCk7Ci0gICAgICAgICAgICBpZiAoc2hlZXQtPmluamVjdGVkRnJh
bWVzKCkgPT0gSW5qZWN0SW5Ub3BGcmFtZU9ubHkgJiYgb3duZXJFbGVtZW50KCkpCi0gICAgICAg
ICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBpZiAoIVVzZXJDb250ZW50VVJMUGF0dGVy
bjo6bWF0Y2hlc1BhdHRlcm5zKHVybCgpLCBzaGVldC0+d2hpdGVsaXN0KCksIHNoZWV0LT5ibGFj
a2xpc3QoKSkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBSZWZQdHI8
Q1NTU3R5bGVTaGVldD4gZ3JvdXBTaGVldCA9IENTU1N0eWxlU2hlZXQ6OmNyZWF0ZUlubGluZShj
b25zdF9jYXN0PERvY3VtZW50Kj4odGhpcyksIHNoZWV0LT51cmwoKSk7Ci0gICAgICAgICAgICBp
ZiAoIW1fcGFnZUdyb3VwVXNlclNoZWV0cykKLSAgICAgICAgICAgICAgICBtX3BhZ2VHcm91cFVz
ZXJTaGVldHMgPSBhZG9wdFB0cihuZXcgVmVjdG9yPFJlZlB0cjxDU1NTdHlsZVNoZWV0PiA+KTsK
LSAgICAgICAgICAgIG1fcGFnZUdyb3VwVXNlclNoZWV0cy0+YXBwZW5kKGdyb3VwU2hlZXQpOwot
ICAgICAgICAgICAgZ3JvdXBTaGVldC0+Y29udGVudHMoKS0+c2V0SXNVc2VyU3R5bGVTaGVldChz
aGVldC0+bGV2ZWwoKSA9PSBVc2VyU3R5bGVVc2VyTGV2ZWwpOwotICAgICAgICAgICAgZ3JvdXBT
aGVldC0+Y29udGVudHMoKS0+cGFyc2VTdHJpbmcoc2hlZXQtPnNvdXJjZSgpKTsKLSAgICAgICAg
fQotICAgIH0KLQotICAgIHJldHVybiBtX3BhZ2VHcm91cFVzZXJTaGVldHMuZ2V0KCk7Ci19Ci0K
LXZvaWQgRG9jdW1lbnQ6OmNsZWFyUGFnZUdyb3VwVXNlclNoZWV0cygpCi17Ci0gICAgbV9wYWdl
R3JvdXBVc2VyU2hlZXRDYWNoZVZhbGlkID0gZmFsc2U7Ci0gICAgaWYgKG1fcGFnZUdyb3VwVXNl
clNoZWV0cyAmJiBtX3BhZ2VHcm91cFVzZXJTaGVldHMtPnNpemUoKSkgewotICAgICAgICBtX3Bh
Z2VHcm91cFVzZXJTaGVldHMtPmNsZWFyKCk7Ci0gICAgICAgIHN0eWxlUmVzb2x2ZXJDaGFuZ2Vk
KERlZmVyUmVjYWxjU3R5bGUpOwotICAgIH0KLX0KLQotdm9pZCBEb2N1bWVudDo6dXBkYXRlUGFn
ZUdyb3VwVXNlclNoZWV0cygpCi17Ci0gICAgY2xlYXJQYWdlR3JvdXBVc2VyU2hlZXRzKCk7Ci0g
ICAgaWYgKHBhZ2VHcm91cFVzZXJTaGVldHMoKSAmJiBwYWdlR3JvdXBVc2VyU2hlZXRzKCktPnNp
emUoKSkKLSAgICAgICAgc3R5bGVSZXNvbHZlckNoYW5nZWQoUmVjYWxjU3R5bGVJbW1lZGlhdGVs
eSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmFkZFVzZXJTaGVldChQYXNzUmVmUHRyPFN0eWxlU2hl
ZXRDb250ZW50cz4gdXNlclNoZWV0KQotewotICAgIGlmICghbV91c2VyU2hlZXRzKQotICAgICAg
ICBtX3VzZXJTaGVldHMgPSBhZG9wdFB0cihuZXcgVmVjdG9yPFJlZlB0cjxDU1NTdHlsZVNoZWV0
PiA+KTsKLSAgICBtX3VzZXJTaGVldHMtPmFwcGVuZChDU1NTdHlsZVNoZWV0OjpjcmVhdGUodXNl
clNoZWV0LCB0aGlzKSk7Ci0gICAgc3R5bGVSZXNvbHZlckNoYW5nZWQoUmVjYWxjU3R5bGVJbW1l
ZGlhdGVseSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnNlYW1sZXNzUGFyZW50VXBkYXRlZFN0eWxl
c2hlZXRzKCkKLXsKLSAgICBzdHlsZVJlc29sdmVyQ2hhbmdlZChSZWNhbGNTdHlsZUltbWVkaWF0
ZWx5KTsKLX0KLQotQ1NTU3R5bGVTaGVldCogRG9jdW1lbnQ6OmVsZW1lbnRTaGVldCgpCi17Ci0g
ICAgaWYgKCFtX2VsZW1TaGVldCkKLSAgICAgICAgbV9lbGVtU2hlZXQgPSBDU1NTdHlsZVNoZWV0
OjpjcmVhdGVJbmxpbmUodGhpcywgbV9iYXNlVVJMKTsKLSAgICByZXR1cm4gbV9lbGVtU2hlZXQu
Z2V0KCk7Ci19Ci0KLWludCBEb2N1bWVudDo6bm9kZUFic0luZGV4KE5vZGUgKm5vZGUpCi17Ci0g
ICAgQVNTRVJUKG5vZGUtPmRvY3VtZW50KCkgPT0gdGhpcyk7Ci0KLSAgICBpbnQgYWJzSW5kZXgg
PSAwOwotICAgIGZvciAoTm9kZSogbiA9IG5vZGU7IG4gJiYgbiAhPSB0aGlzOyBuID0gbi0+dHJh
dmVyc2VQcmV2aW91c05vZGUoKSkKLSAgICAgICAgYWJzSW5kZXgrKzsKLSAgICByZXR1cm4gYWJz
SW5kZXg7Ci19Ci0KLU5vZGUqIERvY3VtZW50Ojpub2RlV2l0aEFic0luZGV4KGludCBhYnNJbmRl
eCkKLXsKLSAgICBOb2RlKiBuID0gdGhpczsKLSAgICBmb3IgKGludCBpID0gMDsgbiAmJiAoaSA8
IGFic0luZGV4KTsgaSsrKQotICAgICAgICBuID0gbi0+dHJhdmVyc2VOZXh0Tm9kZSgpOwotICAg
IHJldHVybiBuOwotfQotCi12b2lkIERvY3VtZW50Ojpwcm9jZXNzSHR0cEVxdWl2KGNvbnN0IFN0
cmluZyYgZXF1aXYsIGNvbnN0IFN0cmluZyYgY29udGVudCkKLXsKLSAgICBBU1NFUlQoIWVxdWl2
LmlzTnVsbCgpICYmICFjb250ZW50LmlzTnVsbCgpKTsKLQotICAgIEZyYW1lKiBmcmFtZSA9IHRo
aXMtPmZyYW1lKCk7Ci0KLSAgICBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoZXF1aXYsICJkZWZhdWx0
LXN0eWxlIikpIHsKLSAgICAgICAgLy8gVGhlIHByZWZlcnJlZCBzdHlsZSBzZXQgaGFzIGJlZW4g
b3ZlcnJpZGRlbiBhcyBwZXIgc2VjdGlvbiAKLSAgICAgICAgLy8gMTQuMy4yIG9mIHRoZSBIVE1M
NC4wIHNwZWNpZmljYXRpb24uICBXZSBuZWVkIHRvIHVwZGF0ZSB0aGUKLSAgICAgICAgLy8gc2hl
ZXQgdXNlZCB2YXJpYWJsZSBhbmQgdGhlbiB1cGRhdGUgb3VyIHN0eWxlIHNlbGVjdG9yLiAKLSAg
ICAgICAgLy8gRm9yIG1vcmUgaW5mbywgc2VlIHRoZSB0ZXN0IGF0OgotICAgICAgICAvLyBodHRw
Oi8vd3d3LmhpeGllLmNoL3Rlc3RzL2V2aWwvY3NzL2ltcG9ydC9tYWluL3ByZWZlcnJlZC5odG1s
Ci0gICAgICAgIC8vIC1kd2gKLSAgICAgICAgbV9zZWxlY3RlZFN0eWxlc2hlZXRTZXQgPSBjb250
ZW50OwotICAgICAgICBtX3ByZWZlcnJlZFN0eWxlc2hlZXRTZXQgPSBjb250ZW50OwotICAgICAg
ICBzdHlsZVJlc29sdmVyQ2hhbmdlZChEZWZlclJlY2FsY1N0eWxlKTsKLSAgICB9IGVsc2UgaWYg
KGVxdWFsSWdub3JpbmdDYXNlKGVxdWl2LCAicmVmcmVzaCIpKSB7Ci0gICAgICAgIGRvdWJsZSBk
ZWxheTsKLSAgICAgICAgU3RyaW5nIHVybDsKLSAgICAgICAgaWYgKGZyYW1lICYmIHBhcnNlSFRU
UFJlZnJlc2goY29udGVudCwgdHJ1ZSwgZGVsYXksIHVybCkpIHsKLSAgICAgICAgICAgIGlmICh1
cmwuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIHVybCA9IG1fdXJsLnN0cmluZygpOwotICAg
ICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHVybCA9IGNvbXBsZXRlVVJMKHVybCkuc3Ry
aW5nKCk7Ci0gICAgICAgICAgICBmcmFtZS0+bmF2aWdhdGlvblNjaGVkdWxlcigpLT5zY2hlZHVs
ZVJlZGlyZWN0KGRlbGF5LCB1cmwpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChlcXVhbEln
bm9yaW5nQ2FzZShlcXVpdiwgInNldC1jb29raWUiKSkgewotICAgICAgICAvLyBGSVhNRTogbWFr
ZSBzZXRDb29raWUgd29yayBvbiBYTUwgZG9jdW1lbnRzIHRvbzsgZS5nLiBpbiBjYXNlIG9mIDxo
dG1sOm1ldGEgLi4uLi4+Ci0gICAgICAgIGlmIChpc0hUTUxEb2N1bWVudCgpKSB7Ci0gICAgICAg
ICAgICBFeGNlcHRpb25Db2RlIGVjOyAvLyBFeGNlcHRpb24gKGZvciBzYW5kYm94ZWQgZG9jdW1l
bnRzKSBpZ25vcmVkLgotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTERvY3VtZW50Kj4odGhp
cyktPnNldENvb2tpZShjb250ZW50LCBlYyk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGVx
dWFsSWdub3JpbmdDYXNlKGVxdWl2LCAiY29udGVudC1sYW5ndWFnZSIpKQotICAgICAgICBzZXRD
b250ZW50TGFuZ3VhZ2UoY29udGVudCk7Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2Uo
ZXF1aXYsICJ4LWRucy1wcmVmZXRjaC1jb250cm9sIikpCi0gICAgICAgIHBhcnNlRE5TUHJlZmV0
Y2hDb250cm9sSGVhZGVyKGNvbnRlbnQpOwotICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNl
KGVxdWl2LCAieC1mcmFtZS1vcHRpb25zIikpIHsKLSAgICAgICAgaWYgKGZyYW1lKSB7Ci0gICAg
ICAgICAgICBGcmFtZUxvYWRlciogZnJhbWVMb2FkZXIgPSBmcmFtZS0+bG9hZGVyKCk7Ci0gICAg
ICAgICAgICBpZiAoZnJhbWVMb2FkZXItPnNob3VsZEludGVycnVwdExvYWRGb3JYRnJhbWVPcHRp
b25zKGNvbnRlbnQsIHVybCgpKSkgewotICAgICAgICAgICAgICAgIGZyYW1lTG9hZGVyLT5zdG9w
QWxsTG9hZGVycygpOwotICAgICAgICAgICAgICAgIGZyYW1lLT5uYXZpZ2F0aW9uU2NoZWR1bGVy
KCktPnNjaGVkdWxlTG9jYXRpb25DaGFuZ2Uoc2VjdXJpdHlPcmlnaW4oKSwgYmxhbmtVUkwoKSwg
U3RyaW5nKCkpOwotCi0gICAgICAgICAgICAgICAgREVGSU5FX1NUQVRJQ19MT0NBTChTdHJpbmcs
IGNvbnNvbGVNZXNzYWdlLCAoQVNDSUlMaXRlcmFsKCJSZWZ1c2VkIHRvIGRpc3BsYXkgZG9jdW1l
bnQgYmVjYXVzZSBkaXNwbGF5IGZvcmJpZGRlbiBieSBYLUZyYW1lLU9wdGlvbnMuXG4iKSkpOwot
ICAgICAgICAgICAgICAgIGFkZENvbnNvbGVNZXNzYWdlKEpTTWVzc2FnZVNvdXJjZSwgTG9nTWVz
c2FnZVR5cGUsIEVycm9yTWVzc2FnZUxldmVsLCBjb25zb2xlTWVzc2FnZSk7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGVxdWl2LCAi
eC13ZWJraXQtY3NwIikpCi0gICAgICAgIGNvbnRlbnRTZWN1cml0eVBvbGljeSgpLT5kaWRSZWNl
aXZlSGVhZGVyKGNvbnRlbnQsIENvbnRlbnRTZWN1cml0eVBvbGljeTo6RW5mb3JjZVBvbGljeSk7
Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoZXF1aXYsICJ4LXdlYmtpdC1jc3AtcmVw
b3J0LW9ubHkiKSkKLSAgICAgICAgY29udGVudFNlY3VyaXR5UG9saWN5KCktPmRpZFJlY2VpdmVI
ZWFkZXIoY29udGVudCwgQ29udGVudFNlY3VyaXR5UG9saWN5OjpSZXBvcnRPbmx5KTsKLX0KLQot
Ly8gVGhvdWdoIGlzc3BhY2UoKSBjb25zaWRlcnMgXHQgYW5kIFx2IHRvIGJlIHdoaXRlc3BhY2Us
IFdpbiBJRSBkb2Vzbid0Lgotc3RhdGljIGJvb2wgaXNTZXBhcmF0b3IoVUNoYXIgYykKLXsKLSAg
ICByZXR1cm4gYyA9PSAnICcgfHwgYyA9PSAnXHQnIHx8IGMgPT0gJ1xuJyB8fCBjID09ICdccicg
fHwgYyA9PSAnPScgfHwgYyA9PSAnLCcgfHwgYyA9PSAnXDAnOwotfQotCi12b2lkIERvY3VtZW50
Ojpwcm9jZXNzQXJndW1lbnRzKGNvbnN0IFN0cmluZyYgZmVhdHVyZXMsIHZvaWQqIGRhdGEsIEFy
Z3VtZW50c0NhbGxiYWNrIGNhbGxiYWNrKQotewotICAgIC8vIFRyZWFkIGxpZ2h0bHkgaW4gdGhp
cyBjb2RlIC0tIGl0IHdhcyBzcGVjaWZpY2FsbHkgZGVzaWduZWQgdG8gbWltaWMgV2luIElFJ3Mg
cGFyc2luZyBiZWhhdmlvci4KLSAgICBpbnQga2V5QmVnaW4sIGtleUVuZDsKLSAgICBpbnQgdmFs
dWVCZWdpbiwgdmFsdWVFbmQ7Ci0KLSAgICBpbnQgaSA9IDA7Ci0gICAgaW50IGxlbmd0aCA9IGZl
YXR1cmVzLmxlbmd0aCgpOwotICAgIFN0cmluZyBidWZmZXIgPSBmZWF0dXJlcy5sb3dlcigpOwot
ICAgIHdoaWxlIChpIDwgbGVuZ3RoKSB7Ci0gICAgICAgIC8vIHNraXAgdG8gZmlyc3Qgbm9uLXNl
cGFyYXRvciwgYnV0IGRvbid0IHNraXAgcGFzdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcKLSAgICAg
ICAgd2hpbGUgKGlzU2VwYXJhdG9yKGJ1ZmZlcltpXSkpIHsKLSAgICAgICAgICAgIGlmIChpID49
IGxlbmd0aCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGkrKzsKLSAgICAg
ICAgfQotICAgICAgICBrZXlCZWdpbiA9IGk7Ci0KLSAgICAgICAgLy8gc2tpcCB0byBmaXJzdCBz
ZXBhcmF0b3IKLSAgICAgICAgd2hpbGUgKCFpc1NlcGFyYXRvcihidWZmZXJbaV0pKQotICAgICAg
ICAgICAgaSsrOwotICAgICAgICBrZXlFbmQgPSBpOwotCi0gICAgICAgIC8vIHNraXAgdG8gZmly
c3QgJz0nLCBidXQgZG9uJ3Qgc2tpcCBwYXN0IGEgJywnIG9yIHRoZSBlbmQgb2YgdGhlIHN0cmlu
ZwotICAgICAgICB3aGlsZSAoYnVmZmVyW2ldICE9ICc9JykgewotICAgICAgICAgICAgaWYgKGJ1
ZmZlcltpXSA9PSAnLCcgfHwgaSA+PSBsZW5ndGgpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBza2lwIHRvIGZpcnN0IG5v
bi1zZXBhcmF0b3IsIGJ1dCBkb24ndCBza2lwIHBhc3QgYSAnLCcgb3IgdGhlIGVuZCBvZiB0aGUg
c3RyaW5nCi0gICAgICAgIHdoaWxlIChpc1NlcGFyYXRvcihidWZmZXJbaV0pKSB7Ci0gICAgICAg
ICAgICBpZiAoYnVmZmVyW2ldID09ICcsJyB8fCBpID49IGxlbmd0aCkKLSAgICAgICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgfQotICAgICAgICB2YWx1ZUJlZ2lu
ID0gaTsKLQotICAgICAgICAvLyBza2lwIHRvIGZpcnN0IHNlcGFyYXRvcgotICAgICAgICB3aGls
ZSAoIWlzU2VwYXJhdG9yKGJ1ZmZlcltpXSkpCi0gICAgICAgICAgICBpKys7Ci0gICAgICAgIHZh
bHVlRW5kID0gaTsKLQotICAgICAgICBBU1NFUlQoaSA8PSBsZW5ndGgpOwotCi0gICAgICAgIFN0
cmluZyBrZXlTdHJpbmcgPSBidWZmZXIuc3Vic3RyaW5nKGtleUJlZ2luLCBrZXlFbmQgLSBrZXlC
ZWdpbik7Ci0gICAgICAgIFN0cmluZyB2YWx1ZVN0cmluZyA9IGJ1ZmZlci5zdWJzdHJpbmcodmFs
dWVCZWdpbiwgdmFsdWVFbmQgLSB2YWx1ZUJlZ2luKTsKLSAgICAgICAgY2FsbGJhY2soa2V5U3Ry
aW5nLCB2YWx1ZVN0cmluZywgdGhpcywgZGF0YSk7Ci0gICAgfQotfQotCi12b2lkIERvY3VtZW50
Ojpwcm9jZXNzVmlld3BvcnQoY29uc3QgU3RyaW5nJiBmZWF0dXJlcywgVmlld3BvcnRBcmd1bWVu
dHM6OlR5cGUgb3JpZ2luKQotewotICAgIEFTU0VSVCghZmVhdHVyZXMuaXNOdWxsKCkpOwotCi0g
ICAgaWYgKG9yaWdpbiA8IG1fdmlld3BvcnRBcmd1bWVudHMudHlwZSkKLSAgICAgICAgcmV0dXJu
OwotCi0gICAgbV92aWV3cG9ydEFyZ3VtZW50cyA9IFZpZXdwb3J0QXJndW1lbnRzKG9yaWdpbik7
Ci0gICAgcHJvY2Vzc0FyZ3VtZW50cyhmZWF0dXJlcywgKHZvaWQqKSZtX3ZpZXdwb3J0QXJndW1l
bnRzLCAmc2V0Vmlld3BvcnRGZWF0dXJlKTsKLQotICAgIHVwZGF0ZVZpZXdwb3J0QXJndW1lbnRz
KCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnVwZGF0ZVZpZXdwb3J0QXJndW1lbnRzKCkKLXsKLSAg
ICBpZiAocGFnZSgpICYmIHBhZ2UoKS0+bWFpbkZyYW1lKCkgPT0gZnJhbWUoKSkgewotI2lmbmRl
ZiBOREVCVUcKLSAgICAgICAgbV9kaWREaXNwYXRjaFZpZXdwb3J0UHJvcGVydGllc0NoYW5nZWQg
PSB0cnVlOwotI2VuZGlmCi0gICAgICAgIHBhZ2UoKS0+Y2hyb21lKCktPmRpc3BhdGNoVmlld3Bv
cnRQcm9wZXJ0aWVzRGlkQ2hhbmdlKG1fdmlld3BvcnRBcmd1bWVudHMpOwotICAgIH0KLX0KLQot
dm9pZCBEb2N1bWVudDo6cHJvY2Vzc1JlZmVycmVyUG9saWN5KGNvbnN0IFN0cmluZyYgcG9saWN5
KQotewotICAgIEFTU0VSVCghcG9saWN5LmlzTnVsbCgpKTsKLQotICAgIG1fcmVmZXJyZXJQb2xp
Y3kgPSBSZWZlcnJlclBvbGljeURlZmF1bHQ7Ci0KLSAgICBpZiAoZXF1YWxJZ25vcmluZ0Nhc2Uo
cG9saWN5LCAibmV2ZXIiKSkKLSAgICAgICAgbV9yZWZlcnJlclBvbGljeSA9IFJlZmVycmVyUG9s
aWN5TmV2ZXI7Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UocG9saWN5LCAiYWx3YXlz
IikpCi0gICAgICAgIG1fcmVmZXJyZXJQb2xpY3kgPSBSZWZlcnJlclBvbGljeUFsd2F5czsKLSAg
ICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZShwb2xpY3ksICJvcmlnaW4iKSkKLSAgICAgICAg
bV9yZWZlcnJlclBvbGljeSA9IFJlZmVycmVyUG9saWN5T3JpZ2luOwotfQotCi1Nb3VzZUV2ZW50
V2l0aEhpdFRlc3RSZXN1bHRzIERvY3VtZW50OjpwcmVwYXJlTW91c2VFdmVudChjb25zdCBIaXRU
ZXN0UmVxdWVzdCYgcmVxdWVzdCwgY29uc3QgTGF5b3V0UG9pbnQmIGRvY3VtZW50UG9pbnQsIGNv
bnN0IFBsYXRmb3JtTW91c2VFdmVudCYgZXZlbnQpCi17Ci0gICAgQVNTRVJUKCFyZW5kZXJlcigp
IHx8IHJlbmRlcmVyKCktPmlzUmVuZGVyVmlldygpKTsKLQotICAgIGlmICghcmVuZGVyZXIoKSkK
LSAgICAgICAgcmV0dXJuIE1vdXNlRXZlbnRXaXRoSGl0VGVzdFJlc3VsdHMoZXZlbnQsIEhpdFRl
c3RSZXN1bHQoTGF5b3V0UG9pbnQoKSkpOwotCi0gICAgSGl0VGVzdFJlc3VsdCByZXN1bHQoZG9j
dW1lbnRQb2ludCk7Ci0gICAgcmVuZGVyVmlldygpLT5oaXRUZXN0KHJlcXVlc3QsIHJlc3VsdCk7
Ci0KLSAgICBpZiAoIXJlcXVlc3QucmVhZE9ubHkoKSkKLSAgICAgICAgdXBkYXRlU3R5bGVJZk5l
ZWRlZCgpOwotCi0gICAgcmV0dXJuIE1vdXNlRXZlbnRXaXRoSGl0VGVzdFJlc3VsdHMoZXZlbnQs
IHJlc3VsdCk7Ci19Ci0KLS8vIERPTSBTZWN0aW9uIDEuMS4xCi1ib29sIERvY3VtZW50OjpjaGls
ZFR5cGVBbGxvd2VkKE5vZGVUeXBlIHR5cGUpIGNvbnN0Ci17Ci0gICAgc3dpdGNoICh0eXBlKSB7
Ci0gICAgY2FzZSBBVFRSSUJVVEVfTk9ERToKLSAgICBjYXNlIENEQVRBX1NFQ1RJT05fTk9ERToK
LSAgICBjYXNlIERPQ1VNRU5UX0ZSQUdNRU5UX05PREU6Ci0gICAgY2FzZSBET0NVTUVOVF9OT0RF
OgotICAgIGNhc2UgRU5USVRZX05PREU6Ci0gICAgY2FzZSBFTlRJVFlfUkVGRVJFTkNFX05PREU6
Ci0gICAgY2FzZSBOT1RBVElPTl9OT0RFOgotICAgIGNhc2UgVEVYVF9OT0RFOgotICAgIGNhc2Ug
WFBBVEhfTkFNRVNQQUNFX05PREU6Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBjYXNlIENP
TU1FTlRfTk9ERToKLSAgICBjYXNlIFBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERToKLSAgICAg
ICAgcmV0dXJuIHRydWU7Ci0gICAgY2FzZSBET0NVTUVOVF9UWVBFX05PREU6Ci0gICAgY2FzZSBF
TEVNRU5UX05PREU6Ci0gICAgICAgIC8vIERvY3VtZW50cyBtYXkgY29udGFpbiBubyBtb3JlIHRo
YW4gb25lIG9mIGVhY2ggb2YgdGhlc2UuCi0gICAgICAgIC8vIChPbmUgRWxlbWVudCBhbmQgb25l
IERvY3VtZW50VHlwZS4pCi0gICAgICAgIGZvciAoTm9kZSogYyA9IGZpcnN0Q2hpbGQoKTsgYzsg
YyA9IGMtPm5leHRTaWJsaW5nKCkpCi0gICAgICAgICAgICBpZiAoYy0+bm9kZVR5cGUoKSA9PSB0
eXBlKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIHRydWU7
Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBEb2N1bWVudDo6Y2FuUmVwbGFj
ZUNoaWxkKE5vZGUqIG5ld0NoaWxkLCBOb2RlKiBvbGRDaGlsZCkKLXsKLSAgICBpZiAoIW9sZENo
aWxkKQotICAgICAgICAvLyBDb250YWluZXJOb2RlOjpyZXBsYWNlQ2hpbGQgd2lsbCByYWlzZSBh
IE5PVF9GT1VORF9FUlIuCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgaWYgKG9sZENoaWxk
LT5ub2RlVHlwZSgpID09IG5ld0NoaWxkLT5ub2RlVHlwZSgpKQotICAgICAgICByZXR1cm4gdHJ1
ZTsKLQotICAgIGludCBudW1Eb2N0eXBlcyA9IDA7Ci0gICAgaW50IG51bUVsZW1lbnRzID0gMDsK
LQotICAgIC8vIEZpcnN0LCBjaGVjayBob3cgbWFueSBkb2N0eXBlcyBhbmQgZWxlbWVudHMgd2Ug
aGF2ZSwgbm90IGNvdW50aW5nCi0gICAgLy8gdGhlIGNoaWxkIHdlJ3JlIGFib3V0IHRvIHJlbW92
ZS4KLSAgICBmb3IgKE5vZGUqIGMgPSBmaXJzdENoaWxkKCk7IGM7IGMgPSBjLT5uZXh0U2libGlu
ZygpKSB7Ci0gICAgICAgIGlmIChjID09IG9sZENoaWxkKQotICAgICAgICAgICAgY29udGludWU7
Ci0gICAgICAgIAotICAgICAgICBzd2l0Y2ggKGMtPm5vZGVUeXBlKCkpIHsKLSAgICAgICAgY2Fz
ZSBET0NVTUVOVF9UWVBFX05PREU6Ci0gICAgICAgICAgICBudW1Eb2N0eXBlcysrOwotICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRUxFTUVOVF9OT0RFOgotICAgICAgICAgICAgbnVt
RWxlbWVudHMrKzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy8gVGhlbiwgc2VlIGhv
dyBtYW55IGRvY3R5cGVzIGFuZCBlbGVtZW50cyBtaWdodCBiZSBhZGRlZCBieSB0aGUgbmV3IGNo
aWxkLgotICAgIGlmIChuZXdDaGlsZC0+bm9kZVR5cGUoKSA9PSBET0NVTUVOVF9GUkFHTUVOVF9O
T0RFKSB7Ci0gICAgICAgIGZvciAoTm9kZSogYyA9IG5ld0NoaWxkLT5maXJzdENoaWxkKCk7IGM7
IGMgPSBjLT5uZXh0U2libGluZygpKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGMtPm5vZGVUeXBl
KCkpIHsKLSAgICAgICAgICAgIGNhc2UgQVRUUklCVVRFX05PREU6Ci0gICAgICAgICAgICBjYXNl
IENEQVRBX1NFQ1RJT05fTk9ERToKLSAgICAgICAgICAgIGNhc2UgRE9DVU1FTlRfRlJBR01FTlRf
Tk9ERToKLSAgICAgICAgICAgIGNhc2UgRE9DVU1FTlRfTk9ERToKLSAgICAgICAgICAgIGNhc2Ug
RU5USVRZX05PREU6Ci0gICAgICAgICAgICBjYXNlIEVOVElUWV9SRUZFUkVOQ0VfTk9ERToKLSAg
ICAgICAgICAgIGNhc2UgTk9UQVRJT05fTk9ERToKLSAgICAgICAgICAgIGNhc2UgVEVYVF9OT0RF
OgotICAgICAgICAgICAgY2FzZSBYUEFUSF9OQU1FU1BBQ0VfTk9ERToKLSAgICAgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBjYXNlIENPTU1FTlRfTk9ERToKLSAgICAgICAg
ICAgIGNhc2UgUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFOgotICAgICAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICAgICAgY2FzZSBET0NVTUVOVF9UWVBFX05PREU6Ci0gICAgICAgICAgICAg
ICAgbnVtRG9jdHlwZXMrKzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNh
c2UgRUxFTUVOVF9OT0RFOgotICAgICAgICAgICAgICAgIG51bUVsZW1lbnRzKys7Ci0gICAgICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2Ugewot
ICAgICAgICBzd2l0Y2ggKG5ld0NoaWxkLT5ub2RlVHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgQVRU
UklCVVRFX05PREU6Ci0gICAgICAgIGNhc2UgQ0RBVEFfU0VDVElPTl9OT0RFOgotICAgICAgICBj
YXNlIERPQ1VNRU5UX0ZSQUdNRU5UX05PREU6Ci0gICAgICAgIGNhc2UgRE9DVU1FTlRfTk9ERToK
LSAgICAgICAgY2FzZSBFTlRJVFlfTk9ERToKLSAgICAgICAgY2FzZSBFTlRJVFlfUkVGRVJFTkNF
X05PREU6Ci0gICAgICAgIGNhc2UgTk9UQVRJT05fTk9ERToKLSAgICAgICAgY2FzZSBURVhUX05P
REU6Ci0gICAgICAgIGNhc2UgWFBBVEhfTkFNRVNQQUNFX05PREU6Ci0gICAgICAgICAgICByZXR1
cm4gZmFsc2U7Ci0gICAgICAgIGNhc2UgQ09NTUVOVF9OT0RFOgotICAgICAgICBjYXNlIFBST0NF
U1NJTkdfSU5TVFJVQ1RJT05fTk9ERToKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAg
ICBjYXNlIERPQ1VNRU5UX1RZUEVfTk9ERToKLSAgICAgICAgICAgIG51bURvY3R5cGVzKys7Ci0g
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFTEVNRU5UX05PREU6Ci0gICAgICAgICAg
ICBudW1FbGVtZW50cysrOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gICAgICAgICAg
ICAgICAgCi0gICAgfQotICAgICAgICAKLSAgICBpZiAobnVtRWxlbWVudHMgPiAxIHx8IG51bURv
Y3R5cGVzID4gMSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIHJldHVybiB0cnVl
OwotfQotCi1QYXNzUmVmUHRyPE5vZGU+IERvY3VtZW50OjpjbG9uZU5vZGUoYm9vbCAvKmRlZXAq
LykKLXsKLSAgICAvLyBTcGVjIHNheXMgY2xvbmluZyBEb2N1bWVudCBub2RlcyBpcyAiaW1wbGVt
ZW50YXRpb24gZGVwZW5kZW50IgotICAgIC8vIHNvIHdlIGRvIG5vdCBzdXBwb3J0IGl0Li4uCi0g
ICAgcmV0dXJuIDA7Ci19Ci0KLVN0eWxlU2hlZXRMaXN0KiBEb2N1bWVudDo6c3R5bGVTaGVldHMo
KQotewotICAgIHJldHVybiBtX3N0eWxlU2hlZXRzLmdldCgpOwotfQotCi1TdHJpbmcgRG9jdW1l
bnQ6OnByZWZlcnJlZFN0eWxlc2hlZXRTZXQoKSBjb25zdAotewotICAgIHJldHVybiBtX3ByZWZl
cnJlZFN0eWxlc2hlZXRTZXQ7Ci19Ci0KLVN0cmluZyBEb2N1bWVudDo6c2VsZWN0ZWRTdHlsZXNo
ZWV0U2V0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9zZWxlY3RlZFN0eWxlc2hlZXRTZXQ7Ci19
Ci0KLXZvaWQgRG9jdW1lbnQ6OnNldFNlbGVjdGVkU3R5bGVzaGVldFNldChjb25zdCBTdHJpbmcm
IGFTdHJpbmcpCi17Ci0gICAgbV9zZWxlY3RlZFN0eWxlc2hlZXRTZXQgPSBhU3RyaW5nOwotICAg
IHN0eWxlUmVzb2x2ZXJDaGFuZ2VkKERlZmVyUmVjYWxjU3R5bGUpOwotfQotCi0vLyBUaGlzIG1l
dGhvZCBpcyBjYWxsZWQgd2hlbmV2ZXIgYSB0b3AtbGV2ZWwgc3R5bGVzaGVldCBoYXMgZmluaXNo
ZWQgbG9hZGluZy4KLXZvaWQgRG9jdW1lbnQ6OnJlbW92ZVBlbmRpbmdTaGVldChSZW1vdmVQZW5k
aW5nU2hlZXROb3RpZmljYXRpb25UeXBlIG5vdGlmaWNhdGlvbikKLXsKLSAgICAvLyBNYWtlIHN1
cmUgd2Uga25ldyB0aGlzIHNoZWV0IHdhcyBwZW5kaW5nLCBhbmQgdGhhdCBvdXIgY291bnQgaXNu
J3Qgb3V0IG9mIHN5bmMuCi0gICAgQVNTRVJUKG1fcGVuZGluZ1N0eWxlc2hlZXRzID4gMCk7Ci0K
LSAgICBtX3BlbmRpbmdTdHlsZXNoZWV0cy0tOwotICAgIAotI2lmZGVmIElOU1RSVU1FTlRfTEFZ
T1VUX1NDSEVEVUxJTkcKLSAgICBpZiAoIW93bmVyRWxlbWVudCgpKQotICAgICAgICBwcmludGYo
IlN0eWxlc2hlZXQgbG9hZGVkIGF0IHRpbWUgJWQuICVkIHN0eWxlc2hlZXRzIHN0aWxsIHJlbWFp
bi5cbiIsIGVsYXBzZWRUaW1lKCksIG1fcGVuZGluZ1N0eWxlc2hlZXRzKTsKLSNlbmRpZgotCi0g
ICAgaWYgKG1fcGVuZGluZ1N0eWxlc2hlZXRzKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAo
bm90aWZpY2F0aW9uID09IFJlbW92ZVBlbmRpbmdTaGVldE5vdGlmeUxhdGVyKSB7Ci0gICAgICAg
IHNldE5lZWRzTm90aWZ5UmVtb3ZlQWxsUGVuZGluZ1N0eWxlc2hlZXQoKTsKLSAgICAgICAgcmV0
dXJuOwotICAgIH0KLSAgICAKLSAgICBkaWRSZW1vdmVBbGxQZW5kaW5nU3R5bGVzaGVldCgpOwot
fQotCi12b2lkIERvY3VtZW50OjpkaWRSZW1vdmVBbGxQZW5kaW5nU3R5bGVzaGVldCgpCi17Ci0g
ICAgbV9uZWVkc05vdGlmeVJlbW92ZUFsbFBlbmRpbmdTdHlsZXNoZWV0ID0gZmFsc2U7Ci0KLSAg
ICBzdHlsZVJlc29sdmVyQ2hhbmdlZChSZWNhbGNTdHlsZUlmTmVlZGVkKTsKLQotICAgIGlmIChT
Y3JpcHRhYmxlRG9jdW1lbnRQYXJzZXIqIHBhcnNlciA9IHNjcmlwdGFibGVEb2N1bWVudFBhcnNl
cigpKQotICAgICAgICBwYXJzZXItPmV4ZWN1dGVTY3JpcHRzV2FpdGluZ0ZvclN0eWxlc2hlZXRz
KCk7Ci0KLSAgICBpZiAobV9nb3RvQW5jaG9yTmVlZGVkQWZ0ZXJTdHlsZXNoZWV0c0xvYWQgJiYg
dmlldygpKQotICAgICAgICB2aWV3KCktPnNjcm9sbFRvRnJhZ21lbnQobV91cmwpOwotfQotCi0K
LXZvaWQgRG9jdW1lbnQ6OmV2YWx1YXRlTWVkaWFRdWVyeUxpc3QoKQotewotICAgIGlmIChtX21l
ZGlhUXVlcnlNYXRjaGVyKQotICAgICAgICBtX21lZGlhUXVlcnlNYXRjaGVyLT5zdHlsZVJlc29s
dmVyQ2hhbmdlZCgpOwotfQotCi12b2lkIERvY3VtZW50OjpzdHlsZVJlc29sdmVyQ2hhbmdlZChT
dHlsZVJlc29sdmVyVXBkYXRlRmxhZyB1cGRhdGVGbGFnKQotewotICAgIC8vIERvbid0IGJvdGhl
ciB1cGRhdGluZywgc2luY2Ugd2UgaGF2ZW4ndCBsb2FkZWQgYWxsIG91ciBzdHlsZSBpbmZvIHll
dAotICAgIC8vIGFuZCBoYXZlbid0IGNhbGN1bGF0ZWQgdGhlIHN0eWxlIHNlbGVjdG9yIGZvciB0
aGUgZmlyc3QgdGltZS4KLSAgICBpZiAoIWF0dGFjaGVkKCkgfHwgKCFtX2RpZENhbGN1bGF0ZVN0
eWxlUmVzb2x2ZXIgJiYgIWhhdmVTdHlsZXNoZWV0c0xvYWRlZCgpKSkgewotICAgICAgICBtX3N0
eWxlUmVzb2x2ZXIuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotI2lmZGVmIElO
U1RSVU1FTlRfTEFZT1VUX1NDSEVEVUxJTkcKLSAgICBpZiAoIW93bmVyRWxlbWVudCgpKQotICAg
ICAgICBwcmludGYoIkJlZ2lubmluZyB1cGRhdGUgb2Ygc3R5bGUgc2VsZWN0b3IgYXQgdGltZSAl
ZC5cbiIsIGVsYXBzZWRUaW1lKCkpOwotI2VuZGlmCi0KLSAgICBib29sIHN0eWxlc2hlZXRDaGFu
Z2VSZXF1aXJlc1N0eWxlUmVjYWxjID0gdXBkYXRlQWN0aXZlU3R5bGVzaGVldHModXBkYXRlRmxh
Zyk7Ci0KLSAgICBpZiAodXBkYXRlRmxhZyA9PSBEZWZlclJlY2FsY1N0eWxlKSB7Ci0gICAgICAg
IHNjaGVkdWxlRm9yY2VkU3R5bGVSZWNhbGMoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQot
ICAgIGlmIChkaWRMYXlvdXRXaXRoUGVuZGluZ1N0eWxlc2hlZXRzKCkgJiYgbV9wZW5kaW5nU3R5
bGVzaGVldHMgPD0gMCkgewotICAgICAgICBtX3BlbmRpbmdTaGVldExheW91dCA9IElnbm9yZUxh
eW91dFdpdGhQZW5kaW5nU2hlZXRzOwotICAgICAgICBpZiAocmVuZGVyZXIoKSkKLSAgICAgICAg
ICAgIHJlbmRlcmVyKCktPnJlcGFpbnQoKTsKLSAgICB9Ci0KLSAgICBpZiAoIXN0eWxlc2hlZXRD
aGFuZ2VSZXF1aXJlc1N0eWxlUmVjYWxjKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBUaGlz
IHJlY2FsY1N0eWxlIGluaXRpYXRlcyBhIG5ldyByZWNhbGMgY3ljbGUuIFdlIG5lZWQgdG8gYnJh
Y2tldCBpdCB0bwotICAgIC8vIG1ha2Ugc3VyZSBhbmltYXRpb25zIGdldCB0aGUgY29ycmVjdCB1
cGRhdGUgdGltZQotICAgIHsKLSAgICAgICAgQW5pbWF0aW9uVXBkYXRlQmxvY2sgYW5pbWF0aW9u
VXBkYXRlQmxvY2sobV9mcmFtZSA/IG1fZnJhbWUtPmFuaW1hdGlvbigpIDogMCk7Ci0gICAgICAg
IHJlY2FsY1N0eWxlKEZvcmNlKTsKLSAgICB9Ci0KLSNpZmRlZiBJTlNUUlVNRU5UX0xBWU9VVF9T
Q0hFRFVMSU5HCi0gICAgaWYgKCFvd25lckVsZW1lbnQoKSkKLSAgICAgICAgcHJpbnRmKCJGaW5p
c2hlZCB1cGRhdGUgb2Ygc3R5bGUgc2VsZWN0b3IgYXQgdGltZSAlZFxuIiwgZWxhcHNlZFRpbWUo
KSk7Ci0jZW5kaWYKLQotICAgIGlmIChyZW5kZXJlcigpKSB7Ci0gICAgICAgIHJlbmRlcmVyKCkt
PnNldE5lZWRzTGF5b3V0QW5kUHJlZldpZHRoc1JlY2FsYygpOwotICAgICAgICBpZiAodmlldygp
KQotICAgICAgICAgICAgdmlldygpLT5zY2hlZHVsZVJlbGF5b3V0KCk7Ci0gICAgfQotCi0gICAg
ZXZhbHVhdGVNZWRpYVF1ZXJ5TGlzdCgpOwotfQotCi12b2lkIERvY3VtZW50OjphZGRTdHlsZVNo
ZWV0Q2FuZGlkYXRlTm9kZShOb2RlKiBub2RlLCBib29sIGNyZWF0ZWRCeVBhcnNlcikKLXsKLSAg
ICBpZiAoIW5vZGUtPmluRG9jdW1lbnQoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIC8v
IFVudGlsIHRoZSA8Ym9keT4gZXhpc3RzLCB3ZSBoYXZlIG5vIGNob2ljZSBidXQgdG8gY29tcGFy
ZSBkb2N1bWVudCBwb3NpdGlvbnMsCi0gICAgLy8gc2luY2Ugc3R5bGVzIG91dHNpZGUgb2YgdGhl
IGJvZHkgYW5kIGhlYWQgY29udGludWUgdG8gYmUgc2h1bnRlZCBpbnRvIHRoZSBoZWFkCi0gICAg
Ly8gKGFuZCB0aHVzIGNhbiBzaGlmdCB0byBlbmQgdXAgYmVmb3JlIGR5bmFtaWNhbGx5IGFkZGVk
IERPTSBjb250ZW50IHRoYXQgaXMgYWxzbwotICAgIC8vIG91dHNpZGUgdGhlIGJvZHkpLgotICAg
IGlmICgoY3JlYXRlZEJ5UGFyc2VyICYmIGJvZHkoKSkgfHwgbV9zdHlsZVNoZWV0Q2FuZGlkYXRl
Tm9kZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIG1fc3R5bGVTaGVldENhbmRpZGF0ZU5vZGVzLmFk
ZChub2RlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIERldGVybWluZSBhbiBh
cHByb3ByaWF0ZSBpbnNlcnRpb24gcG9pbnQuCi0gICAgU3R5bGVTaGVldENhbmRpZGF0ZUxpc3RI
YXNoU2V0OjppdGVyYXRvciBiZWdpbiA9IG1fc3R5bGVTaGVldENhbmRpZGF0ZU5vZGVzLmJlZ2lu
KCk7Ci0gICAgU3R5bGVTaGVldENhbmRpZGF0ZUxpc3RIYXNoU2V0OjppdGVyYXRvciBlbmQgPSBt
X3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcy5lbmQoKTsKLSAgICBTdHlsZVNoZWV0Q2FuZGlkYXRl
TGlzdEhhc2hTZXQ6Oml0ZXJhdG9yIGl0ID0gZW5kOwotICAgIE5vZGUqIGZvbGxvd2luZ05vZGUg
PSAwOwotICAgIGRvIHsKLSAgICAgICAgLS1pdDsKLSAgICAgICAgTm9kZSogbiA9ICppdDsKLSAg
ICAgICAgdW5zaWduZWQgc2hvcnQgcG9zaXRpb24gPSBuLT5jb21wYXJlRG9jdW1lbnRQb3NpdGlv
bihub2RlKTsKLSAgICAgICAgaWYgKHBvc2l0aW9uID09IERPQ1VNRU5UX1BPU0lUSU9OX0ZPTExP
V0lORykgewotICAgICAgICAgICAgbV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMuaW5zZXJ0QmVm
b3JlKGZvbGxvd2luZ05vZGUsIG5vZGUpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9
Ci0gICAgICAgIGZvbGxvd2luZ05vZGUgPSBuOwotICAgIH0gd2hpbGUgKGl0ICE9IGJlZ2luKTsK
LSAgICAKLSAgICBtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcy5pbnNlcnRCZWZvcmUoZm9sbG93
aW5nTm9kZSwgbm9kZSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnJlbW92ZVN0eWxlU2hlZXRDYW5k
aWRhdGVOb2RlKE5vZGUqIG5vZGUpCi17Ci0gICAgbV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMu
cmVtb3ZlKG5vZGUpOwotfQotCi12b2lkIERvY3VtZW50Ojpjb2xsZWN0QWN0aXZlU3R5bGVzaGVl
dHMoVmVjdG9yPFJlZlB0cjxTdHlsZVNoZWV0PiA+JiBzaGVldHMpCi17Ci0gICAgaWYgKHNldHRp
bmdzKCkgJiYgIXNldHRpbmdzKCktPmF1dGhvckFuZFVzZXJTdHlsZXNFbmFibGVkKCkpCi0gICAg
ICAgIHJldHVybjsKLQotICAgIFN0eWxlU2hlZXRDYW5kaWRhdGVMaXN0SGFzaFNldDo6aXRlcmF0
b3IgYmVnaW4gPSBtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcy5iZWdpbigpOwotICAgIFN0eWxl
U2hlZXRDYW5kaWRhdGVMaXN0SGFzaFNldDo6aXRlcmF0b3IgZW5kID0gbV9zdHlsZVNoZWV0Q2Fu
ZGlkYXRlTm9kZXMuZW5kKCk7Ci0gICAgZm9yIChTdHlsZVNoZWV0Q2FuZGlkYXRlTGlzdEhhc2hT
ZXQ6Oml0ZXJhdG9yIGl0ID0gYmVnaW47IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICBOb2Rl
KiBuID0gKml0OwotICAgICAgICBTdHlsZVNoZWV0KiBzaGVldCA9IDA7Ci0gICAgICAgIGlmIChu
LT5ub2RlVHlwZSgpID09IFBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSkgewotICAgICAgICAg
ICAgLy8gUHJvY2Vzc2luZyBpbnN0cnVjdGlvbiAoWE1MIGRvY3VtZW50cyBvbmx5KS4KLSAgICAg
ICAgICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgbGlua2luZyB0byBlbWJlZGRlZCBDU1Mgc3R5bGVz
aGVldHMsIHNlZSA8aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQ5Mjgx
PiBmb3IgZGlzY3Vzc2lvbi4KLSAgICAgICAgICAgIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiogcGkg
PSBzdGF0aWNfY2FzdDxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24qPihuKTsKLSAgICAgICAgICAgIHNo
ZWV0ID0gcGktPnNoZWV0KCk7Ci0jaWYgRU5BQkxFKFhTTFQpCi0gICAgICAgICAgICAvLyBEb24n
dCBhcHBseSBYU0wgdHJhbnNmb3JtcyB0byBhbHJlYWR5IHRyYW5zZm9ybWVkIGRvY3VtZW50cyAt
LSA8cmRhcjovL3Byb2JsZW0vNDEzMjgwNj4KLSAgICAgICAgICAgIGlmIChwaS0+aXNYU0woKSAm
JiAhdHJhbnNmb3JtU291cmNlRG9jdW1lbnQoKSkgewotICAgICAgICAgICAgICAgIC8vIERvbid0
IGFwcGx5IFhTTCB0cmFuc2Zvcm1zIHVudGlsIGxvYWRpbmcgaXMgZmluaXNoZWQuCi0gICAgICAg
ICAgICAgICAgaWYgKCFwYXJzaW5nKCkpCi0gICAgICAgICAgICAgICAgICAgIGFwcGx5WFNMVHJh
bnNmb3JtKHBpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0jZW5k
aWYKLSAgICAgICAgfSBlbHNlIGlmICgobi0+aXNIVE1MRWxlbWVudCgpICYmIChuLT5oYXNUYWdO
YW1lKGxpbmtUYWcpIHx8IG4tPmhhc1RhZ05hbWUoc3R5bGVUYWcpKSkKLSNpZiBFTkFCTEUoU1ZH
KQotICAgICAgICAgICAgICAgICAgIHx8ICAobi0+aXNTVkdFbGVtZW50KCkgJiYgbi0+aGFzVGFn
TmFtZShTVkdOYW1lczo6c3R5bGVUYWcpKQotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgKSB7
Ci0gICAgICAgICAgICBFbGVtZW50KiBlID0gc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG4pOwotICAg
ICAgICAgICAgQXRvbWljU3RyaW5nIHRpdGxlID0gZS0+Z2V0QXR0cmlidXRlKHRpdGxlQXR0cik7
Ci0gICAgICAgICAgICBib29sIGVuYWJsZWRWaWFTY3JpcHQgPSBmYWxzZTsKLSAgICAgICAgICAg
IGlmIChlLT5oYXNMb2NhbE5hbWUobGlua1RhZykpIHsKLSAgICAgICAgICAgICAgICAvLyA8TElO
Sz4gZWxlbWVudAotICAgICAgICAgICAgICAgIEhUTUxMaW5rRWxlbWVudCogbGlua0VsZW1lbnQg
PSBzdGF0aWNfY2FzdDxIVE1MTGlua0VsZW1lbnQqPihuKTsKLSAgICAgICAgICAgICAgICBpZiAo
bGlua0VsZW1lbnQtPmlzRGlzYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7
Ci0gICAgICAgICAgICAgICAgZW5hYmxlZFZpYVNjcmlwdCA9IGxpbmtFbGVtZW50LT5pc0VuYWJs
ZWRWaWFTY3JpcHQoKTsKLSAgICAgICAgICAgICAgICBpZiAobGlua0VsZW1lbnQtPnN0eWxlU2hl
ZXRJc0xvYWRpbmcoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBpdCBpcyBsb2FkaW5nIGJ1
dCB3ZSBzaG91bGQgc3RpbGwgZGVjaWRlIHdoaWNoIHN0eWxlIHNoZWV0IHNldCB0byB1c2UKLSAg
ICAgICAgICAgICAgICAgICAgaWYgKCFlbmFibGVkVmlhU2NyaXB0ICYmICF0aXRsZS5pc0VtcHR5
KCkgJiYgbV9wcmVmZXJyZWRTdHlsZXNoZWV0U2V0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAg
ICAgICAgICAgICAgY29uc3QgQXRvbWljU3RyaW5nJiByZWwgPSBlLT5nZXRBdHRyaWJ1dGUocmVs
QXR0cik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlbC5jb250YWlucygiYWx0ZXJu
YXRlIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ByZWZlcnJlZFN0eWxlc2hl
ZXRTZXQgPSB0aXRsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3NlbGVjdGVkU3R5
bGVzaGVldFNldCA9IHRpdGxlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAg
ICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIWxpbmtFbGVtZW50LT5zaGVldCgpKQotICAgICAg
ICAgICAgICAgICAgICB0aXRsZSA9IG51bGxBdG9tOwotICAgICAgICAgICAgfQotICAgICAgICAg
ICAgLy8gR2V0IHRoZSBjdXJyZW50IHByZWZlcnJlZCBzdHlsZXNldC4gIFRoaXMgaXMgdGhlCi0g
ICAgICAgICAgICAvLyBzZXQgb2Ygc2hlZXRzIHRoYXQgd2lsbCBiZSBlbmFibGVkLgotI2lmIEVO
QUJMRShTVkcpCi0gICAgICAgICAgICBpZiAobi0+aXNTVkdFbGVtZW50KCkgJiYgbi0+aGFzVGFn
TmFtZShTVkdOYW1lczo6c3R5bGVUYWcpKQotICAgICAgICAgICAgICAgIHNoZWV0ID0gc3RhdGlj
X2Nhc3Q8U1ZHU3R5bGVFbGVtZW50Kj4obiktPnNoZWV0KCk7Ci0gICAgICAgICAgICBlbHNlCi0j
ZW5kaWYKLSAgICAgICAgICAgIGlmIChlLT5oYXNMb2NhbE5hbWUobGlua1RhZykpCi0gICAgICAg
ICAgICAgICAgc2hlZXQgPSBzdGF0aWNfY2FzdDxIVE1MTGlua0VsZW1lbnQqPihuKS0+c2hlZXQo
KTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAvLyA8U1RZTEU+IGVsZW1lbnQK
LSAgICAgICAgICAgICAgICBzaGVldCA9IHN0YXRpY19jYXN0PEhUTUxTdHlsZUVsZW1lbnQqPihu
KS0+c2hlZXQoKTsKLSAgICAgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGlzIHNoZWV0IGJl
bG9uZ3MgdG8gYSBzdHlsZXNldAotICAgICAgICAgICAgLy8gKHRodXMgbWFraW5nIGl0IFBSRUZF
UlJFRCBvciBBTFRFUk5BVEUgcmF0aGVyIHRoYW4KLSAgICAgICAgICAgIC8vIFBFUlNJU1RFTlQp
LgotICAgICAgICAgICAgQXRvbWljU3RyaW5nIHJlbCA9IGUtPmdldEF0dHJpYnV0ZShyZWxBdHRy
KTsKLSAgICAgICAgICAgIGlmICghZW5hYmxlZFZpYVNjcmlwdCAmJiAhdGl0bGUuaXNFbXB0eSgp
KSB7Ci0gICAgICAgICAgICAgICAgLy8gWWVzLCB3ZSBoYXZlIGEgdGl0bGUuCi0gICAgICAgICAg
ICAgICAgaWYgKG1fcHJlZmVycmVkU3R5bGVzaGVldFNldC5pc0VtcHR5KCkpIHsKLSAgICAgICAg
ICAgICAgICAgICAgLy8gTm8gcHJlZmVycmVkIHNldCBoYXMgYmVlbiBlc3RhYmxpc2hlZC4gIElm
Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdlIGFyZSBOT1QgYW4gYWx0ZXJuYXRlIHNoZWV0LCB0
aGVuIGVzdGFibGlzaAotICAgICAgICAgICAgICAgICAgICAvLyB1cyBhcyB0aGUgcHJlZmVycmVk
IHNldC4gIE90aGVyd2lzZSwganVzdCBpZ25vcmUKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhp
cyBzaGVldC4KLSAgICAgICAgICAgICAgICAgICAgaWYgKGUtPmhhc0xvY2FsTmFtZShzdHlsZVRh
ZykgfHwgIXJlbC5jb250YWlucygiYWx0ZXJuYXRlIikpCi0gICAgICAgICAgICAgICAgICAgICAg
ICBtX3ByZWZlcnJlZFN0eWxlc2hlZXRTZXQgPSBtX3NlbGVjdGVkU3R5bGVzaGVldFNldCA9IHRp
dGxlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodGl0bGUgIT0gbV9w
cmVmZXJyZWRTdHlsZXNoZWV0U2V0KQotICAgICAgICAgICAgICAgICAgICBzaGVldCA9IDA7Ci0g
ICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyZWwuY29udGFpbnMoImFsdGVybmF0ZSIp
ICYmIHRpdGxlLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICBzaGVldCA9IDA7Ci0gICAgICAg
IH0KLSAgICAgICAgaWYgKHNoZWV0KQotICAgICAgICAgICAgc2hlZXRzLmFwcGVuZChzaGVldCk7
Ci0gICAgfQotfQotCi1ib29sIERvY3VtZW50Ojp0ZXN0QWRkZWRTdHlsZXNoZWV0UmVxdWlyZXNT
dHlsZVJlY2FsYyhTdHlsZVNoZWV0Q29udGVudHMqIHN0eWxlc2hlZXQpCi17Ci0gICAgLy8gU2Vl
IGlmIGFsbCBydWxlcyBvbiB0aGUgc2hlZXQgYXJlIHNjb3BlZCB0byBzb21lIHNwZWNpZmljIGlk
cyBvciBjbGFzc2VzLgotICAgIC8vIFRoZW4gdGVzdCBpZiB3ZSBhY3R1YWxseSBoYXZlIGFueSBv
ZiB0aG9zZSBpbiB0aGUgdHJlZSBhdCB0aGUgbW9tZW50LgotICAgIEhhc2hTZXQ8QXRvbWljU3Ry
aW5nSW1wbCo+IGlkU2NvcGVzOyAKLSAgICBIYXNoU2V0PEF0b21pY1N0cmluZ0ltcGwqPiBjbGFz
c1Njb3BlczsKLSAgICBpZiAoIVN0eWxlUmVzb2x2ZXI6OmRldGVybWluZVN0eWxlc2hlZXRTZWxl
Y3RvclNjb3BlcyhzdHlsZXNoZWV0LCBpZFNjb3BlcywgY2xhc3NTY29wZXMpKQotICAgICAgICBy
ZXR1cm4gdHJ1ZTsKLSAgICAvLyBJbnZhbGlkYXRlIHRoZSBzdWJ0cmVlcyB0aGF0IG1hdGNoIHRo
ZSBzY29wZXMuCi0gICAgTm9kZSogbm9kZSA9IGZpcnN0Q2hpbGQoKTsKLSAgICB3aGlsZSAobm9k
ZSkgewotICAgICAgICBpZiAoIW5vZGUtPmlzU3R5bGVkRWxlbWVudCgpKSB7Ci0gICAgICAgICAg
ICBub2RlID0gbm9kZS0+dHJhdmVyc2VOZXh0Tm9kZSgpOwotICAgICAgICAgICAgY29udGludWU7
Ci0gICAgICAgIH0KLSAgICAgICAgU3R5bGVkRWxlbWVudCogZWxlbWVudCA9IHN0YXRpY19jYXN0
PFN0eWxlZEVsZW1lbnQqPihub2RlKTsKLSAgICAgICAgaWYgKFNlbGVjdG9yQ2hlY2tlcjo6ZWxl
bWVudE1hdGNoZXNTZWxlY3RvclNjb3BlcyhlbGVtZW50LCBpZFNjb3BlcywgY2xhc3NTY29wZXMp
KSB7Ci0gICAgICAgICAgICBlbGVtZW50LT5zZXROZWVkc1N0eWxlUmVjYWxjKCk7Ci0gICAgICAg
ICAgICAvLyBUaGUgd2hvbGUgc3VidHJlZSBpcyBub3cgaW52YWxpZGF0ZWQsIHdlIGNhbiBza2lw
IHRvIHRoZSBuZXh0IHNpYmxpbmcuCi0gICAgICAgICAgICBub2RlID0gbm9kZS0+dHJhdmVyc2VO
ZXh0U2libGluZygpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAg
bm9kZSA9IG5vZGUtPnRyYXZlcnNlTmV4dE5vZGUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNl
OwotfQotCi12b2lkIERvY3VtZW50OjphbmFseXplU3R5bGVzaGVldENoYW5nZShTdHlsZVJlc29s
dmVyVXBkYXRlRmxhZyB1cGRhdGVGbGFnLCBjb25zdCBWZWN0b3I8UmVmUHRyPFN0eWxlU2hlZXQ+
ID4mIG5ld1N0eWxlc2hlZXRzLCBib29sJiByZXF1aXJlc1N0eWxlUmVzb2x2ZXJSZXNldCwgYm9v
bCYgcmVxdWlyZXNGdWxsU3R5bGVSZWNhbGMpCi17Ci0gICAgcmVxdWlyZXNTdHlsZVJlc29sdmVy
UmVzZXQgPSB0cnVlOwotICAgIHJlcXVpcmVzRnVsbFN0eWxlUmVjYWxjID0gdHJ1ZTsKLSAgICAK
LSAgICAvLyBTdHlsZXNoZWV0cyBvZiA8c3R5bGU+IGVsZW1lbnRzIHRoYXQgQGltcG9ydCBzdHls
ZXNoZWV0cyBhcmUgYWN0aXZlIGJ1dCBsb2FkaW5nLiBXZSBuZWVkIHRvIHRyaWdnZXIgYSBmdWxs
IHJlY2FsYyB3aGVuIHN1Y2ggbG9hZHMgYXJlIGRvbmUuCi0gICAgYm9vbCBoYXNBY3RpdmVMb2Fk
aW5nU3R5bGVzaGVldCA9IGZhbHNlOwotICAgIHVuc2lnbmVkIG5ld1N0eWxlc2hlZXRDb3VudCA9
IG5ld1N0eWxlc2hlZXRzLnNpemUoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbmV3
U3R5bGVzaGVldENvdW50OyArK2kpIHsKLSAgICAgICAgaWYgKG5ld1N0eWxlc2hlZXRzW2ldLT5p
c0xvYWRpbmcoKSkKLSAgICAgICAgICAgIGhhc0FjdGl2ZUxvYWRpbmdTdHlsZXNoZWV0ID0gdHJ1
ZTsKLSAgICB9Ci0gICAgaWYgKG1faGFkQWN0aXZlTG9hZGluZ1N0eWxlc2hlZXQgJiYgIWhhc0Fj
dGl2ZUxvYWRpbmdTdHlsZXNoZWV0KSB7Ci0gICAgICAgIG1faGFkQWN0aXZlTG9hZGluZ1N0eWxl
c2hlZXQgPSBmYWxzZTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtX2hhZEFjdGl2ZUxv
YWRpbmdTdHlsZXNoZWV0ID0gaGFzQWN0aXZlTG9hZGluZ1N0eWxlc2hlZXQ7Ci0KLSAgICBpZiAo
dXBkYXRlRmxhZyAhPSBSZWNhbGNTdHlsZUlmTmVlZGVkKQotICAgICAgICByZXR1cm47Ci0gICAg
aWYgKCFtX3N0eWxlUmVzb2x2ZXIpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIFNlZSBpZiB3
ZSBhcmUganVzdCBhZGRpbmcgc3R5bGVzaGVldHMuCi0gICAgdW5zaWduZWQgb2xkU3R5bGVzaGVl
dENvdW50ID0gbV9zdHlsZVNoZWV0cy0+bGVuZ3RoKCk7Ci0gICAgaWYgKG5ld1N0eWxlc2hlZXRD
b3VudCA8IG9sZFN0eWxlc2hlZXRDb3VudCkKLSAgICAgICAgcmV0dXJuOwotICAgIGZvciAodW5z
aWduZWQgaSA9IDA7IGkgPCBvbGRTdHlsZXNoZWV0Q291bnQ7ICsraSkgewotICAgICAgICBpZiAo
bV9zdHlsZVNoZWV0cy0+aXRlbShpKSAhPSBuZXdTdHlsZXNoZWV0c1tpXSkKLSAgICAgICAgICAg
IHJldHVybjsKLSAgICB9Ci0gICAgcmVxdWlyZXNTdHlsZVJlc29sdmVyUmVzZXQgPSBmYWxzZTsK
LQotICAgIC8vIElmIHdlIGFyZSBhbHJlYWR5IHBhcnNpbmcgdGhlIGJvZHkgYW5kIHNvIG1heSBo
YXZlIHNpZ25pZmljYW50IGFtb3VudCBvZiBlbGVtZW50cywgcHV0IHNvbWUgZWZmb3J0IGludG8g
dHJ5aW5nIHRvIGF2b2lkIHN0eWxlIHJlY2FsY3MuCi0gICAgaWYgKCFib2R5KCkgfHwgbV9oYXNO
b2Rlc1dpdGhQbGFjZWhvbGRlclN0eWxlKQotICAgICAgICByZXR1cm47Ci0gICAgZm9yICh1bnNp
Z25lZCBpID0gb2xkU3R5bGVzaGVldENvdW50OyBpIDwgbmV3U3R5bGVzaGVldENvdW50OyArK2kp
IHsKLSAgICAgICAgaWYgKCFuZXdTdHlsZXNoZWV0c1tpXS0+aXNDU1NTdHlsZVNoZWV0KCkpCi0g
ICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlmIChuZXdTdHlsZXNoZWV0c1tpXS0+ZGlzYWJs
ZWQoKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBpZiAodGVzdEFkZGVkU3R5bGVz
aGVldFJlcXVpcmVzU3R5bGVSZWNhbGMoc3RhdGljX2Nhc3Q8Q1NTU3R5bGVTaGVldCo+KG5ld1N0
eWxlc2hlZXRzW2ldLmdldCgpKS0+Y29udGVudHMoKSkpCi0gICAgICAgICAgICByZXR1cm47Ci0g
ICAgfQotICAgIHJlcXVpcmVzRnVsbFN0eWxlUmVjYWxjID0gZmFsc2U7Ci19Ci0KLXN0YXRpYyBi
b29sIHN0eWxlU2hlZXRzVXNlUmVtVW5pdHMoY29uc3QgVmVjdG9yPFJlZlB0cjxTdHlsZVNoZWV0
PiA+JiBzaGVldHMpCi17Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNoZWV0cy5zaXpl
KCk7ICsraSkgewotICAgICAgICBpZiAoIXNoZWV0c1tpXS0+aXNDU1NTdHlsZVNoZWV0KCkpCi0g
ICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgaWYgKHN0YXRpY19jYXN0PENTU1N0eWxlU2hl
ZXQqPihzaGVldHNbaV0uZ2V0KCkpLT5jb250ZW50cygpLT51c2VzUmVtVW5pdHMoKSkKLSAgICAg
ICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQg
RG9jdW1lbnQ6Om5vdGlmeVNlYW1sZXNzQ2hpbGREb2N1bWVudHNPZlN0eWxlc2hlZXRVcGRhdGUo
KSBjb25zdAotewotICAgIC8vIElmIHdlJ3JlIG5vdCBpbiBhIGZyYW1lIHlldCBhbnkgcG90ZW50
aWFsIGNoaWxkIGRvY3VtZW50cyB3b24ndCBoYXZlIGEgU3R5bGVSZXNvbHZlciB0byB1cGRhdGUu
Ci0gICAgaWYgKCFmcmFtZSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBTZWFtbGVzcyBj
aGlsZCBmcmFtZXMgYXJlIGV4cGVjdGVkIHRvIG5vdGlmeSB0aGVpciBzZWFtbGVzcyBjaGlsZHJl
biByZWN1cnNpdmVseSwgc28gd2Ugb25seSBkbyBkaXJlY3QgY2hpbGRyZW4uCi0gICAgZm9yIChG
cmFtZSogY2hpbGQgPSBmcmFtZSgpLT50cmVlKCktPmZpcnN0Q2hpbGQoKTsgY2hpbGQ7IGNoaWxk
ID0gY2hpbGQtPnRyZWUoKS0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICBEb2N1bWVudCogY2hp
bGREb2N1bWVudCA9IGNoaWxkLT5kb2N1bWVudCgpOwotICAgICAgICBpZiAoY2hpbGREb2N1bWVu
dC0+c2hvdWxkRGlzcGxheVNlYW1sZXNzbHlXaXRoUGFyZW50KCkpIHsKLSAgICAgICAgICAgIEFT
U0VSVChjaGlsZERvY3VtZW50LT5zZWFtbGVzc1BhcmVudElGcmFtZSgpLT5kb2N1bWVudCgpID09
IHRoaXMpOwotICAgICAgICAgICAgY2hpbGREb2N1bWVudC0+c2VhbWxlc3NQYXJlbnRVcGRhdGVk
U3R5bGVzaGVldHMoKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotYm9vbCBEb2N1bWVudDo6dXBk
YXRlQWN0aXZlU3R5bGVzaGVldHMoU3R5bGVSZXNvbHZlclVwZGF0ZUZsYWcgdXBkYXRlRmxhZykK
LXsKLSAgICBpZiAobV9pblN0eWxlUmVjYWxjKSB7Ci0gICAgICAgIC8vIFNWRyA8dXNlPiBlbGVt
ZW50IG1heSBtYW5hZ2UgdG8gaW52YWxpZGF0ZSBzdHlsZSBzZWxlY3RvciBpbiB0aGUgbWlkZGxl
IG9mIGEgc3R5bGUgcmVjYWxjLgotICAgICAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9NTQzNDQKLSAgICAgICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIGJlIGZp
eGVkIGluIFNWRyBhbmQgdGhpcyBjb2RlIHJlcGxhY2VkIHdpdGggQVNTRVJUKCFtX2luU3R5bGVS
ZWNhbGMpLgotICAgICAgICBtX2hhc0RpcnR5U3R5bGVSZXNvbHZlciA9IHRydWU7Ci0gICAgICAg
IHNjaGVkdWxlRm9yY2VkU3R5bGVSZWNhbGMoKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
IH0KLSAgICBpZiAoIXJlbmRlcmVyKCkgfHwgIWF0dGFjaGVkKCkpCi0gICAgICAgIHJldHVybiBm
YWxzZTsKLQotICAgIFN0eWxlU2hlZXRWZWN0b3IgbmV3U3R5bGVzaGVldHM7Ci0gICAgY29sbGVj
dEFjdGl2ZVN0eWxlc2hlZXRzKG5ld1N0eWxlc2hlZXRzKTsKLQotICAgIGJvb2wgcmVxdWlyZXNT
dHlsZVJlc29sdmVyUmVzZXQ7Ci0gICAgYm9vbCByZXF1aXJlc0Z1bGxTdHlsZVJlY2FsYzsKLSAg
ICBhbmFseXplU3R5bGVzaGVldENoYW5nZSh1cGRhdGVGbGFnLCBuZXdTdHlsZXNoZWV0cywgcmVx
dWlyZXNTdHlsZVJlc29sdmVyUmVzZXQsIHJlcXVpcmVzRnVsbFN0eWxlUmVjYWxjKTsKLQotICAg
IGlmIChyZXF1aXJlc1N0eWxlUmVzb2x2ZXJSZXNldCkKLSAgICAgICAgY2xlYXJTdHlsZVJlc29s
dmVyKCk7Ci0gICAgZWxzZSB7Ci0gICAgICAgIG1fc3R5bGVSZXNvbHZlci0+YXBwZW5kQXV0aG9y
U3R5bGVzaGVldHMobV9zdHlsZVNoZWV0cy0+bGVuZ3RoKCksIG5ld1N0eWxlc2hlZXRzKTsKLSAg
ICAgICAgcmVzZXRDU1NGZWF0dXJlRmxhZ3MoKTsKLSAgICB9Ci0gICAgbV9zdHlsZVNoZWV0cy0+
c3dhcChuZXdTdHlsZXNoZWV0cyk7Ci0KLSAgICBtX3VzZXNSZW1Vbml0cyA9IHN0eWxlU2hlZXRz
VXNlUmVtVW5pdHMobV9zdHlsZVNoZWV0cy0+dmVjdG9yKCkpOwotICAgIG1fZGlkQ2FsY3VsYXRl
U3R5bGVSZXNvbHZlciA9IHRydWU7Ci0gICAgbV9oYXNEaXJ0eVN0eWxlUmVzb2x2ZXIgPSBmYWxz
ZTsKLQotICAgIG5vdGlmeVNlYW1sZXNzQ2hpbGREb2N1bWVudHNPZlN0eWxlc2hlZXRVcGRhdGUo
KTsKLQotICAgIHJldHVybiByZXF1aXJlc0Z1bGxTdHlsZVJlY2FsYzsKLX0KLQotdm9pZCBEb2N1
bWVudDo6c2V0SG92ZXJOb2RlKFBhc3NSZWZQdHI8Tm9kZT4gbmV3SG92ZXJOb2RlKQotewotICAg
IG1faG92ZXJOb2RlID0gbmV3SG92ZXJOb2RlOwotfQotCi12b2lkIERvY3VtZW50OjpzZXRBY3Rp
dmVOb2RlKFBhc3NSZWZQdHI8Tm9kZT4gbmV3QWN0aXZlTm9kZSkKLXsKLSAgICBtX2FjdGl2ZU5v
ZGUgPSBuZXdBY3RpdmVOb2RlOwotfQotCi12b2lkIERvY3VtZW50Ojpmb2N1c2VkTm9kZVJlbW92
ZWQoKQotewotICAgIHNldEZvY3VzZWROb2RlKDApOwotfQotCi12b2lkIERvY3VtZW50OjpyZW1v
dmVGb2N1c2VkTm9kZU9mU3VidHJlZShOb2RlKiBub2RlLCBib29sIGFtb25nQ2hpbGRyZW5Pbmx5
KQotewotICAgIGlmICghbV9mb2N1c2VkTm9kZSB8fCB0aGlzLT5pblBhZ2VDYWNoZSgpKSAvLyBJ
ZiB0aGUgZG9jdW1lbnQgaXMgaW4gdGhlIHBhZ2UgY2FjaGUsIHRoZW4gd2UgZG9uJ3QgbmVlZCB0
byBjbGVhciBvdXQgdGhlIGZvY3VzZWQgbm9kZS4KLSAgICAgICAgcmV0dXJuOwotICAgICAgICAK
LSAgICBib29sIG5vZGVJblN1YnRyZWUgPSBmYWxzZTsKLSAgICBpZiAoYW1vbmdDaGlsZHJlbk9u
bHkpCi0gICAgICAgIG5vZGVJblN1YnRyZWUgPSBtX2ZvY3VzZWROb2RlLT5pc0Rlc2NlbmRhbnRP
Zihub2RlKTsKLSAgICBlbHNlCi0gICAgICAgIG5vZGVJblN1YnRyZWUgPSAobV9mb2N1c2VkTm9k
ZSA9PSBub2RlKSB8fCBtX2ZvY3VzZWROb2RlLT5pc0Rlc2NlbmRhbnRPZihub2RlKTsKLSAgICAK
LSAgICBpZiAobm9kZUluU3VidHJlZSkKLSAgICAgICAgZG9jdW1lbnQoKS0+Zm9jdXNlZE5vZGVS
ZW1vdmVkKCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmhvdmVyZWROb2RlRGV0YWNoZWQoTm9kZSog
bm9kZSkKLXsKLSAgICBpZiAoIW1faG92ZXJOb2RlIHx8IChub2RlICE9IG1faG92ZXJOb2RlICYm
ICghbV9ob3Zlck5vZGUtPmlzVGV4dE5vZGUoKSB8fCBub2RlICE9IG1faG92ZXJOb2RlLT5wYXJl
bnROb2RlKCkpKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9ob3Zlck5vZGUgPSBub2RlLT5w
YXJlbnROb2RlKCk7Ci0gICAgd2hpbGUgKG1faG92ZXJOb2RlICYmICFtX2hvdmVyTm9kZS0+cmVu
ZGVyZXIoKSkKLSAgICAgICAgbV9ob3Zlck5vZGUgPSBtX2hvdmVyTm9kZS0+cGFyZW50Tm9kZSgp
OwotICAgIGlmIChmcmFtZSgpKQotICAgICAgICBmcmFtZSgpLT5ldmVudEhhbmRsZXIoKS0+c2No
ZWR1bGVIb3ZlclN0YXRlVXBkYXRlKCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmFjdGl2ZUNoYWlu
Tm9kZURldGFjaGVkKE5vZGUqIG5vZGUpCi17Ci0gICAgaWYgKCFtX2FjdGl2ZU5vZGUgfHwgKG5v
ZGUgIT0gbV9hY3RpdmVOb2RlICYmICghbV9hY3RpdmVOb2RlLT5pc1RleHROb2RlKCkgfHwgbm9k
ZSAhPSBtX2FjdGl2ZU5vZGUtPnBhcmVudE5vZGUoKSkpKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICBtX2FjdGl2ZU5vZGUgPSBub2RlLT5wYXJlbnROb2RlKCk7Ci0gICAgd2hpbGUgKG1fYWN0aXZl
Tm9kZSAmJiAhbV9hY3RpdmVOb2RlLT5yZW5kZXJlcigpKQotICAgICAgICBtX2FjdGl2ZU5vZGUg
PSBtX2FjdGl2ZU5vZGUtPnBhcmVudE5vZGUoKTsKLX0KLQotI2lmIEVOQUJMRShEQVNIQk9BUkRf
U1VQUE9SVCkgfHwgRU5BQkxFKFdJREdFVF9SRUdJT04pCi1jb25zdCBWZWN0b3I8RGFzaGJvYXJk
UmVnaW9uVmFsdWU+JiBEb2N1bWVudDo6ZGFzaGJvYXJkUmVnaW9ucygpIGNvbnN0Ci17Ci0gICAg
cmV0dXJuIG1fZGFzaGJvYXJkUmVnaW9uczsKLX0KLQotdm9pZCBEb2N1bWVudDo6c2V0RGFzaGJv
YXJkUmVnaW9ucyhjb25zdCBWZWN0b3I8RGFzaGJvYXJkUmVnaW9uVmFsdWU+JiByZWdpb25zKQot
ewotICAgIG1fZGFzaGJvYXJkUmVnaW9ucyA9IHJlZ2lvbnM7Ci0gICAgc2V0RGFzaGJvYXJkUmVn
aW9uc0RpcnR5KGZhbHNlKTsKLX0KLSNlbmRpZgotCi1ib29sIERvY3VtZW50OjpzZXRGb2N1c2Vk
Tm9kZShQYXNzUmVmUHRyPE5vZGU+IHBycE5ld0ZvY3VzZWROb2RlKQotewotICAgIFJlZlB0cjxO
b2RlPiBuZXdGb2N1c2VkTm9kZSA9IHBycE5ld0ZvY3VzZWROb2RlOwotCi0gICAgLy8gTWFrZSBz
dXJlIG5ld0ZvY3VzZWROb2RlIGlzIGFjdHVhbGx5IGluIHRoaXMgZG9jdW1lbnQKLSAgICBpZiAo
bmV3Rm9jdXNlZE5vZGUgJiYgKG5ld0ZvY3VzZWROb2RlLT5kb2N1bWVudCgpICE9IHRoaXMpKQot
ICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGlmIChtX2ZvY3VzZWROb2RlID09IG5ld0ZvY3Vz
ZWROb2RlKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGlmIChtX2luUGFnZUNhY2hlKQot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBib29sIGZvY3VzQ2hhbmdlQmxvY2tlZCA9IGZh
bHNlOwotICAgIFJlZlB0cjxOb2RlPiBvbGRGb2N1c2VkTm9kZSA9IG1fZm9jdXNlZE5vZGU7Ci0g
ICAgbV9mb2N1c2VkTm9kZSA9IDA7Ci0KLSAgICAvLyBSZW1vdmUgZm9jdXMgZnJvbSB0aGUgZXhp
c3RpbmcgZm9jdXMgbm9kZSAoaWYgYW55KQotICAgIGlmIChvbGRGb2N1c2VkTm9kZSkgewotICAg
ICAgICBBU1NFUlQoIW9sZEZvY3VzZWROb2RlLT5pbkRldGFjaCgpKTsKLQotICAgICAgICBpZiAo
b2xkRm9jdXNlZE5vZGUtPmFjdGl2ZSgpKQotICAgICAgICAgICAgb2xkRm9jdXNlZE5vZGUtPnNl
dEFjdGl2ZShmYWxzZSk7Ci0KLSAgICAgICAgb2xkRm9jdXNlZE5vZGUtPnNldEZvY3VzKGZhbHNl
KTsKLQotICAgICAgICAvLyBEaXNwYXRjaCBhIGNoYW5nZSBldmVudCBmb3IgdGV4dCBmaWVsZHMg
b3IgdGV4dGFyZWFzIHRoYXQgaGF2ZSBiZWVuIGVkaXRlZAotICAgICAgICBpZiAob2xkRm9jdXNl
ZE5vZGUtPmlzRWxlbWVudE5vZGUoKSkgewotICAgICAgICAgICAgRWxlbWVudCogZWxlbWVudCA9
IHN0YXRpY19jYXN0PEVsZW1lbnQqPihvbGRGb2N1c2VkTm9kZS5nZXQoKSk7Ci0gICAgICAgICAg
ICBpZiAoZWxlbWVudC0+d2FzQ2hhbmdlZFNpbmNlTGFzdEZvcm1Db250cm9sQ2hhbmdlRXZlbnQo
KSkKLSAgICAgICAgICAgICAgICBlbGVtZW50LT5kaXNwYXRjaEZvcm1Db250cm9sQ2hhbmdlRXZl
bnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIERpc3BhdGNoIHRoZSBibHVyIGV2ZW50IGFu
ZCBsZXQgdGhlIG5vZGUgZG8gYW55IG90aGVyIGJsdXIgcmVsYXRlZCBhY3Rpdml0aWVzIChpbXBv
cnRhbnQgZm9yIHRleHQgZmllbGRzKQotICAgICAgICBvbGRGb2N1c2VkTm9kZS0+ZGlzcGF0Y2hC
bHVyRXZlbnQobmV3Rm9jdXNlZE5vZGUpOwotCi0gICAgICAgIGlmIChtX2ZvY3VzZWROb2RlKSB7
Ci0gICAgICAgICAgICAvLyBoYW5kbGVyIHNoaWZ0ZWQgZm9jdXMKLSAgICAgICAgICAgIGZvY3Vz
Q2hhbmdlQmxvY2tlZCA9IHRydWU7Ci0gICAgICAgICAgICBuZXdGb2N1c2VkTm9kZSA9IDA7Ci0g
ICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIG9sZEZvY3VzZWROb2RlLT5kaXNwYXRjaEZvY3Vz
T3V0RXZlbnQoZXZlbnROYW1lcygpLmZvY3Vzb3V0RXZlbnQsIG5ld0ZvY3VzZWROb2RlKTsgLy8g
RE9NIGxldmVsIDMgbmFtZSBmb3IgdGhlIGJ1YmJsaW5nIGJsdXIgZXZlbnQuCi0gICAgICAgIC8v
IEZJWE1FOiBXZSBzaG91bGQgcmVtb3ZlIGZpcmluZyBET01Gb2N1c091dEV2ZW50IGV2ZW50IHdo
ZW4gd2UgYXJlIHN1cmUgbm8gY29udGVudCBkZXBlbmRzCi0gICAgICAgIC8vIG9uIGl0LCBwcm9i
YWJseSB3aGVuIDxyZGFyOi8vcHJvYmxlbS84NTAzOTU4PiBpcyByZXNvbHZlZC4KLSAgICAgICAg
b2xkRm9jdXNlZE5vZGUtPmRpc3BhdGNoRm9jdXNPdXRFdmVudChldmVudE5hbWVzKCkuRE9NRm9j
dXNPdXRFdmVudCwgbmV3Rm9jdXNlZE5vZGUpOyAvLyBET00gbGV2ZWwgMiBuYW1lIGZvciBjb21w
YXRpYmlsaXR5LgotCi0gICAgICAgIGlmIChtX2ZvY3VzZWROb2RlKSB7Ci0gICAgICAgICAgICAv
LyBoYW5kbGVyIHNoaWZ0ZWQgZm9jdXMKLSAgICAgICAgICAgIGZvY3VzQ2hhbmdlQmxvY2tlZCA9
IHRydWU7Ci0gICAgICAgICAgICBuZXdGb2N1c2VkTm9kZSA9IDA7Ci0gICAgICAgIH0KLSAgICAg
ICAgaWYgKG9sZEZvY3VzZWROb2RlID09IHRoaXMgJiYgb2xkRm9jdXNlZE5vZGUtPmhhc09uZVJl
ZigpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAKLSAgICAgICAgaWYg
KG9sZEZvY3VzZWROb2RlLT5pc1Jvb3RFZGl0YWJsZUVsZW1lbnQoKSkKLSAgICAgICAgICAgIGZy
YW1lKCktPmVkaXRvcigpLT5kaWRFbmRFZGl0aW5nKCk7Ci0KLSAgICAgICAgaWYgKHZpZXcoKSkg
ewotICAgICAgICAgICAgV2lkZ2V0KiBvbGRXaWRnZXQgPSB3aWRnZXRGb3JOb2RlKG9sZEZvY3Vz
ZWROb2RlLmdldCgpKTsKLSAgICAgICAgICAgIGlmIChvbGRXaWRnZXQpCi0gICAgICAgICAgICAg
ICAgb2xkV2lkZ2V0LT5zZXRGb2N1cyhmYWxzZSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAg
ICAgICAgICAgdmlldygpLT5zZXRGb2N1cyhmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAg
ICBpZiAobmV3Rm9jdXNlZE5vZGUpIHsKLSAgICAgICAgaWYgKG5ld0ZvY3VzZWROb2RlLT5pc1Jv
b3RFZGl0YWJsZUVsZW1lbnQoKSAmJiAhYWNjZXB0c0VkaXRpbmdGb2N1cyhuZXdGb2N1c2VkTm9k
ZS5nZXQoKSkpIHsKLSAgICAgICAgICAgIC8vIGRlbGVnYXRlIGJsb2NrcyBmb2N1cyBjaGFuZ2UK
LSAgICAgICAgICAgIGZvY3VzQ2hhbmdlQmxvY2tlZCA9IHRydWU7Ci0gICAgICAgICAgICBnb3Rv
IFNldEZvY3VzZWROb2RlRG9uZTsKLSAgICAgICAgfQotICAgICAgICAvLyBTZXQgZm9jdXMgb24g
dGhlIG5ldyBub2RlCi0gICAgICAgIG1fZm9jdXNlZE5vZGUgPSBuZXdGb2N1c2VkTm9kZTsKLQot
ICAgICAgICAvLyBEaXNwYXRjaCB0aGUgZm9jdXMgZXZlbnQgYW5kIGxldCB0aGUgbm9kZSBkbyBh
bnkgb3RoZXIgZm9jdXMgcmVsYXRlZCBhY3Rpdml0aWVzIChpbXBvcnRhbnQgZm9yIHRleHQgZmll
bGRzKQotICAgICAgICBtX2ZvY3VzZWROb2RlLT5kaXNwYXRjaEZvY3VzRXZlbnQob2xkRm9jdXNl
ZE5vZGUpOwotCi0gICAgICAgIGlmIChtX2ZvY3VzZWROb2RlICE9IG5ld0ZvY3VzZWROb2RlKSB7
Ci0gICAgICAgICAgICAvLyBoYW5kbGVyIHNoaWZ0ZWQgZm9jdXMKLSAgICAgICAgICAgIGZvY3Vz
Q2hhbmdlQmxvY2tlZCA9IHRydWU7Ci0gICAgICAgICAgICBnb3RvIFNldEZvY3VzZWROb2RlRG9u
ZTsKLSAgICAgICAgfQotCi0gICAgICAgIG1fZm9jdXNlZE5vZGUtPmRpc3BhdGNoRm9jdXNJbkV2
ZW50KGV2ZW50TmFtZXMoKS5mb2N1c2luRXZlbnQsIG9sZEZvY3VzZWROb2RlKTsgLy8gRE9NIGxl
dmVsIDMgYnViYmxpbmcgZm9jdXMgZXZlbnQuCi0KLSAgICAgICAgaWYgKG1fZm9jdXNlZE5vZGUg
IT0gbmV3Rm9jdXNlZE5vZGUpIHsKLSAgICAgICAgICAgIC8vIGhhbmRsZXIgc2hpZnRlZCBmb2N1
cwotICAgICAgICAgICAgZm9jdXNDaGFuZ2VCbG9ja2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIGdv
dG8gU2V0Rm9jdXNlZE5vZGVEb25lOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRklYTUU6IFdl
IHNob3VsZCByZW1vdmUgZmlyaW5nIERPTUZvY3VzSW5FdmVudCBldmVudCB3aGVuIHdlIGFyZSBz
dXJlIG5vIGNvbnRlbnQgZGVwZW5kcwotICAgICAgICAvLyBvbiBpdCwgcHJvYmFibHkgd2hlbiA8
cmRhcjovL3Byb2JsZW0vODUwMzk1OD4gaXMgbS4KLSAgICAgICAgbV9mb2N1c2VkTm9kZS0+ZGlz
cGF0Y2hGb2N1c0luRXZlbnQoZXZlbnROYW1lcygpLkRPTUZvY3VzSW5FdmVudCwgb2xkRm9jdXNl
ZE5vZGUpOyAvLyBET00gbGV2ZWwgMiBmb3IgY29tcGF0aWJpbGl0eS4KLQotICAgICAgICBpZiAo
bV9mb2N1c2VkTm9kZSAhPSBuZXdGb2N1c2VkTm9kZSkgeyAKLSAgICAgICAgICAgIC8vIGhhbmRs
ZXIgc2hpZnRlZCBmb2N1cwotICAgICAgICAgICAgZm9jdXNDaGFuZ2VCbG9ja2VkID0gdHJ1ZTsK
LSAgICAgICAgICAgIGdvdG8gU2V0Rm9jdXNlZE5vZGVEb25lOwotICAgICAgICB9Ci0gICAgICAg
IG1fZm9jdXNlZE5vZGUtPnNldEZvY3VzKHRydWUpOwotCi0gICAgICAgIGlmIChtX2ZvY3VzZWRO
b2RlLT5pc1Jvb3RFZGl0YWJsZUVsZW1lbnQoKSkKLSAgICAgICAgICAgIGZyYW1lKCktPmVkaXRv
cigpLT5kaWRCZWdpbkVkaXRpbmcoKTsKLQotICAgICAgICAvLyBld3csIEkgc3Vjay4gc2V0IHRo
ZSBxdCBmb2N1cyBjb3JyZWN0bHkKLSAgICAgICAgLy8gIyMjIGZpbmQgYSBiZXR0ZXIgcGxhY2Ug
aW4gdGhlIGNvZGUgZm9yIHRoaXMKLSAgICAgICAgaWYgKHZpZXcoKSkgewotICAgICAgICAgICAg
V2lkZ2V0KiBmb2N1c1dpZGdldCA9IHdpZGdldEZvck5vZGUobV9mb2N1c2VkTm9kZS5nZXQoKSk7
Ci0gICAgICAgICAgICBpZiAoZm9jdXNXaWRnZXQpIHsKLSAgICAgICAgICAgICAgICAvLyBNYWtl
IHN1cmUgYSB3aWRnZXQgaGFzIHRoZSByaWdodCBzaXplIGJlZm9yZSBnaXZpbmcgaXQgZm9jdXMu
Ci0gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSBhcmUgdGVzdGluZyBlZGdlIGNhc2Vz
IG9mIHRoZSBXaWRnZXQgY29kZS4KLSAgICAgICAgICAgICAgICAvLyBTcGVjaWZpY2FsbHksIGlu
IFdlYkNvcmUgdGhpcyBkb2VzIG5vdCB3b3JrIHdlbGwgZm9yIHRleHQgZmllbGRzLgotICAgICAg
ICAgICAgICAgIHVwZGF0ZUxheW91dCgpOwotICAgICAgICAgICAgICAgIC8vIFJlLWdldCB0aGUg
d2lkZ2V0IGluIGNhc2UgdXBkYXRpbmcgdGhlIGxheW91dCBjaGFuZ2VkIHRoaW5ncy4KLSAgICAg
ICAgICAgICAgICBmb2N1c1dpZGdldCA9IHdpZGdldEZvck5vZGUobV9mb2N1c2VkTm9kZS5nZXQo
KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZm9jdXNXaWRnZXQpCi0gICAgICAg
ICAgICAgICAgZm9jdXNXaWRnZXQtPnNldEZvY3VzKHRydWUpOwotICAgICAgICAgICAgZWxzZQot
ICAgICAgICAgICAgICAgIHZpZXcoKS0+c2V0Rm9jdXModHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9
Ci0KLSNpZiBQTEFURk9STShNQUMpIHx8IFBMQVRGT1JNKFdJTikgfHwgUExBVEZPUk0oR1RLKSB8
fCBQTEFURk9STShDSFJPTUlVTSkKLSAgICBpZiAoIWZvY3VzQ2hhbmdlQmxvY2tlZCAmJiBtX2Zv
Y3VzZWROb2RlICYmIEFYT2JqZWN0Q2FjaGU6OmFjY2Vzc2liaWxpdHlFbmFibGVkKCkpCi0gICAg
ICAgIGF4T2JqZWN0Q2FjaGUoKS0+aGFuZGxlRm9jdXNlZFVJRWxlbWVudENoYW5nZWQob2xkRm9j
dXNlZE5vZGUuZ2V0KCksIG5ld0ZvY3VzZWROb2RlLmdldCgpKTsKLSNlbmRpZgotICAgIGlmICgh
Zm9jdXNDaGFuZ2VCbG9ja2VkKQotICAgICAgICBwYWdlKCktPmNocm9tZSgpLT5mb2N1c2VkTm9k
ZUNoYW5nZWQobV9mb2N1c2VkTm9kZS5nZXQoKSk7Ci0KLVNldEZvY3VzZWROb2RlRG9uZToKLSAg
ICB1cGRhdGVTdHlsZUlmTmVlZGVkKCk7Ci0gICAgcmV0dXJuICFmb2N1c0NoYW5nZUJsb2NrZWQ7
Ci19Ci0gICAgCi12b2lkIERvY3VtZW50OjpnZXRGb2N1c2FibGVOb2RlcyhWZWN0b3I8UmVmUHRy
PE5vZGU+ID4mIG5vZGVzKQotewotICAgIHVwZGF0ZUxheW91dCgpOwotCi0gICAgZm9yIChOb2Rl
KiBub2RlID0gZmlyc3RDaGlsZCgpOyBub2RlOyBub2RlID0gbm9kZS0+dHJhdmVyc2VOZXh0Tm9k
ZSgpKSB7Ci0gICAgICAgIGlmIChub2RlLT5pc0ZvY3VzYWJsZSgpKQotICAgICAgICAgICAgbm9k
ZXMuYXBwZW5kKG5vZGUpOwotICAgIH0KLX0KLSAgCi12b2lkIERvY3VtZW50OjpzZXRDU1NUYXJn
ZXQoRWxlbWVudCogbikKLXsKLSAgICBpZiAobV9jc3NUYXJnZXQpCi0gICAgICAgIG1fY3NzVGFy
Z2V0LT5zZXROZWVkc1N0eWxlUmVjYWxjKCk7Ci0gICAgbV9jc3NUYXJnZXQgPSBuOwotICAgIGlm
IChuKQotICAgICAgICBuLT5zZXROZWVkc1N0eWxlUmVjYWxjKCk7Ci19Ci0KLXZvaWQgRG9jdW1l
bnQ6OnJlZ2lzdGVyTm9kZUxpc3RDYWNoZShEeW5hbWljTm9kZUxpc3RDYWNoZUJhc2UqIGxpc3Qp
Ci17Ci0gICAgaWYgKGxpc3QtPnR5cGUoKSAhPSBOb2RlTGlzdENvbGxlY3Rpb25UeXBlKQotICAg
ICAgICBtX25vZGVMaXN0Q291bnRzW0ludmFsaWRhdGVPbklkTmFtZUF0dHJDaGFuZ2VdKys7Ci0g
ICAgbV9ub2RlTGlzdENvdW50c1tsaXN0LT5pbnZhbGlkYXRpb25UeXBlKCldKys7Ci0gICAgaWYg
KGxpc3QtPmlzUm9vdGVkQXREb2N1bWVudCgpKQotICAgICAgICBtX2xpc3RzSW52YWxpZGF0ZWRB
dERvY3VtZW50LmFkZChsaXN0KTsKLX0KLQotdm9pZCBEb2N1bWVudDo6dW5yZWdpc3Rlck5vZGVM
aXN0Q2FjaGUoRHluYW1pY05vZGVMaXN0Q2FjaGVCYXNlKiBsaXN0KQotewotICAgIGlmIChsaXN0
LT50eXBlKCkgIT0gTm9kZUxpc3RDb2xsZWN0aW9uVHlwZSkKLSAgICAgICAgbV9ub2RlTGlzdENv
dW50c1tJbnZhbGlkYXRlT25JZE5hbWVBdHRyQ2hhbmdlXS0tOwotICAgIG1fbm9kZUxpc3RDb3Vu
dHNbbGlzdC0+aW52YWxpZGF0aW9uVHlwZSgpXS0tOwotICAgIGlmIChsaXN0LT5pc1Jvb3RlZEF0
RG9jdW1lbnQoKSkgewotICAgICAgICBBU1NFUlQobV9saXN0c0ludmFsaWRhdGVkQXREb2N1bWVu
dC5jb250YWlucyhsaXN0KSk7Ci0gICAgICAgIG1fbGlzdHNJbnZhbGlkYXRlZEF0RG9jdW1lbnQu
cmVtb3ZlKGxpc3QpOwotICAgIH0KLX0KLQotdm9pZCBEb2N1bWVudDo6YXR0YWNoTm9kZUl0ZXJh
dG9yKE5vZGVJdGVyYXRvciogbmkpCi17Ci0gICAgbV9ub2RlSXRlcmF0b3JzLmFkZChuaSk7Ci19
Ci0KLXZvaWQgRG9jdW1lbnQ6OmRldGFjaE5vZGVJdGVyYXRvcihOb2RlSXRlcmF0b3IqIG5pKQot
ewotICAgIC8vIFRoZSBub2RlIGl0ZXJhdG9yIGNhbiBiZSBkZXRhY2hlZCB3aXRob3V0IGhhdmlu
ZyBiZWVuIGF0dGFjaGVkIGlmIGl0cyByb290IG5vZGUgZGlkbid0IGhhdmUgYSBkb2N1bWVudAot
ICAgIC8vIHdoZW4gdGhlIGl0ZXJhdG9yIHdhcyBjcmVhdGVkLCBidXQgaGFzIGl0IG5vdy4KLSAg
ICBtX25vZGVJdGVyYXRvcnMucmVtb3ZlKG5pKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6bW92ZU5v
ZGVJdGVyYXRvcnNUb05ld0RvY3VtZW50KE5vZGUqIG5vZGUsIERvY3VtZW50KiBuZXdEb2N1bWVu
dCkKLXsKLSAgICBIYXNoU2V0PE5vZGVJdGVyYXRvcio+IG5vZGVJdGVyYXRvcnNMaXN0ID0gbV9u
b2RlSXRlcmF0b3JzOwotICAgIEhhc2hTZXQ8Tm9kZUl0ZXJhdG9yKj46OmNvbnN0X2l0ZXJhdG9y
IG5vZGVJdGVyYXRvcnNFbmQgPSBub2RlSXRlcmF0b3JzTGlzdC5lbmQoKTsKLSAgICBmb3IgKEhh
c2hTZXQ8Tm9kZUl0ZXJhdG9yKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbm9kZUl0ZXJhdG9yc0xp
c3QuYmVnaW4oKTsgaXQgIT0gbm9kZUl0ZXJhdG9yc0VuZDsgKytpdCkgewotICAgICAgICBpZiAo
KCppdCktPnJvb3QoKSA9PSBub2RlKSB7Ci0gICAgICAgICAgICBkZXRhY2hOb2RlSXRlcmF0b3Io
Kml0KTsKLSAgICAgICAgICAgIG5ld0RvY3VtZW50LT5hdHRhY2hOb2RlSXRlcmF0b3IoKml0KTsK
LSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBEb2N1bWVudDo6dXBkYXRlUmFuZ2VzQWZ0ZXJD
aGlsZHJlbkNoYW5nZWQoQ29udGFpbmVyTm9kZSogY29udGFpbmVyKQotewotICAgIGlmICghbV9y
YW5nZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIEhhc2hTZXQ8UmFuZ2UqPjo6Y29uc3RfaXRlcmF0
b3IgZW5kID0gbV9yYW5nZXMuZW5kKCk7Ci0gICAgICAgIGZvciAoSGFzaFNldDxSYW5nZSo+Ojpj
b25zdF9pdGVyYXRvciBpdCA9IG1fcmFuZ2VzLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkKLSAg
ICAgICAgICAgICgqaXQpLT5ub2RlQ2hpbGRyZW5DaGFuZ2VkKGNvbnRhaW5lcik7Ci0gICAgfQot
fQotCi12b2lkIERvY3VtZW50Ojpub2RlQ2hpbGRyZW5XaWxsQmVSZW1vdmVkKENvbnRhaW5lck5v
ZGUqIGNvbnRhaW5lcikKLXsKLSAgICBpZiAoIW1fcmFuZ2VzLmlzRW1wdHkoKSkgewotICAgICAg
ICBIYXNoU2V0PFJhbmdlKj46OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fcmFuZ2VzLmVuZCgpOwot
ICAgICAgICBmb3IgKEhhc2hTZXQ8UmFuZ2UqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3Jhbmdl
cy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpCi0gICAgICAgICAgICAoKml0KS0+bm9kZUNoaWxk
cmVuV2lsbEJlUmVtb3ZlZChjb250YWluZXIpOwotICAgIH0KLQotICAgIEhhc2hTZXQ8Tm9kZUl0
ZXJhdG9yKj46OmNvbnN0X2l0ZXJhdG9yIG5vZGVJdGVyYXRvcnNFbmQgPSBtX25vZGVJdGVyYXRv
cnMuZW5kKCk7Ci0gICAgZm9yIChIYXNoU2V0PE5vZGVJdGVyYXRvcio+Ojpjb25zdF9pdGVyYXRv
ciBpdCA9IG1fbm9kZUl0ZXJhdG9ycy5iZWdpbigpOyBpdCAhPSBub2RlSXRlcmF0b3JzRW5kOyAr
K2l0KSB7Ci0gICAgICAgIGZvciAoTm9kZSogbiA9IGNvbnRhaW5lci0+Zmlyc3RDaGlsZCgpOyBu
OyBuID0gbi0+bmV4dFNpYmxpbmcoKSkKLSAgICAgICAgICAgICgqaXQpLT5ub2RlV2lsbEJlUmVt
b3ZlZChuKTsKLSAgICB9Ci0KLSAgICBpZiAoRnJhbWUqIGZyYW1lID0gdGhpcy0+ZnJhbWUoKSkg
ewotICAgICAgICBmb3IgKE5vZGUqIG4gPSBjb250YWluZXItPmZpcnN0Q2hpbGQoKTsgbjsgbiA9
IG4tPm5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAgICAgIGZyYW1lLT5ldmVudEhhbmRsZXIoKS0+
bm9kZVdpbGxCZVJlbW92ZWQobik7Ci0gICAgICAgICAgICBmcmFtZS0+c2VsZWN0aW9uKCktPm5v
ZGVXaWxsQmVSZW1vdmVkKG4pOwotICAgICAgICAgICAgZnJhbWUtPnBhZ2UoKS0+ZHJhZ0NhcmV0
Q29udHJvbGxlcigpLT5ub2RlV2lsbEJlUmVtb3ZlZChuKTsKLSAgICAgICAgfQotICAgIH0KLX0K
LQotdm9pZCBEb2N1bWVudDo6bm9kZVdpbGxCZVJlbW92ZWQoTm9kZSogbikKLXsKLSAgICBIYXNo
U2V0PE5vZGVJdGVyYXRvcio+Ojpjb25zdF9pdGVyYXRvciBub2RlSXRlcmF0b3JzRW5kID0gbV9u
b2RlSXRlcmF0b3JzLmVuZCgpOwotICAgIGZvciAoSGFzaFNldDxOb2RlSXRlcmF0b3IqPjo6Y29u
c3RfaXRlcmF0b3IgaXQgPSBtX25vZGVJdGVyYXRvcnMuYmVnaW4oKTsgaXQgIT0gbm9kZUl0ZXJh
dG9yc0VuZDsgKytpdCkKLSAgICAgICAgKCppdCktPm5vZGVXaWxsQmVSZW1vdmVkKG4pOwotCi0g
ICAgaWYgKCFtX3Jhbmdlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgSGFzaFNldDxSYW5nZSo+Ojpj
b25zdF9pdGVyYXRvciByYW5nZXNFbmQgPSBtX3Jhbmdlcy5lbmQoKTsKLSAgICAgICAgZm9yIChI
YXNoU2V0PFJhbmdlKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yYW5nZXMuYmVnaW4oKTsgaXQg
IT0gcmFuZ2VzRW5kOyArK2l0KQotICAgICAgICAgICAgKCppdCktPm5vZGVXaWxsQmVSZW1vdmVk
KG4pOwotICAgIH0KLQotICAgIGlmIChGcmFtZSogZnJhbWUgPSB0aGlzLT5mcmFtZSgpKSB7Ci0g
ICAgICAgIGZyYW1lLT5ldmVudEhhbmRsZXIoKS0+bm9kZVdpbGxCZVJlbW92ZWQobik7Ci0gICAg
ICAgIGZyYW1lLT5zZWxlY3Rpb24oKS0+bm9kZVdpbGxCZVJlbW92ZWQobik7Ci0gICAgICAgIGZy
YW1lLT5wYWdlKCktPmRyYWdDYXJldENvbnRyb2xsZXIoKS0+bm9kZVdpbGxCZVJlbW92ZWQobik7
Ci0gICAgfQotfQotCi12b2lkIERvY3VtZW50Ojp0ZXh0SW5zZXJ0ZWQoTm9kZSogdGV4dCwgdW5z
aWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBsZW5ndGgpCi17Ci0gICAgaWYgKCFtX3Jhbmdlcy5pc0Vt
cHR5KCkpIHsKLSAgICAgICAgSGFzaFNldDxSYW5nZSo+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBt
X3Jhbmdlcy5lbmQoKTsKLSAgICAgICAgZm9yIChIYXNoU2V0PFJhbmdlKj46OmNvbnN0X2l0ZXJh
dG9yIGl0ID0gbV9yYW5nZXMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KQotICAgICAgICAgICAg
KCppdCktPnRleHRJbnNlcnRlZCh0ZXh0LCBvZmZzZXQsIGxlbmd0aCk7Ci0gICAgfQotCi0gICAg
Ly8gVXBkYXRlIHRoZSBtYXJrZXJzIGZvciBzcGVsbGluZyBhbmQgZ3JhbW1hciBjaGVja2luZy4K
LSAgICBtX21hcmtlcnMtPnNoaWZ0TWFya2Vycyh0ZXh0LCBvZmZzZXQsIGxlbmd0aCk7Ci19Ci0K
LXZvaWQgRG9jdW1lbnQ6OnRleHRSZW1vdmVkKE5vZGUqIHRleHQsIHVuc2lnbmVkIG9mZnNldCwg
dW5zaWduZWQgbGVuZ3RoKQotewotICAgIGlmICghbV9yYW5nZXMuaXNFbXB0eSgpKSB7Ci0gICAg
ICAgIEhhc2hTZXQ8UmFuZ2UqPjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV9yYW5nZXMuZW5kKCk7
Ci0gICAgICAgIGZvciAoSGFzaFNldDxSYW5nZSo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmFu
Z2VzLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkKLSAgICAgICAgICAgICgqaXQpLT50ZXh0UmVt
b3ZlZCh0ZXh0LCBvZmZzZXQsIGxlbmd0aCk7Ci0gICAgfQotCi0gICAgLy8gVXBkYXRlIHRoZSBt
YXJrZXJzIGZvciBzcGVsbGluZyBhbmQgZ3JhbW1hciBjaGVja2luZy4KLSAgICBtX21hcmtlcnMt
PnJlbW92ZU1hcmtlcnModGV4dCwgb2Zmc2V0LCBsZW5ndGgpOwotICAgIG1fbWFya2Vycy0+c2hp
ZnRNYXJrZXJzKHRleHQsIG9mZnNldCArIGxlbmd0aCwgMCAtIGxlbmd0aCk7Ci19Ci0KLXZvaWQg
RG9jdW1lbnQ6OnRleHROb2Rlc01lcmdlZChUZXh0KiBvbGROb2RlLCB1bnNpZ25lZCBvZmZzZXQp
Ci17Ci0gICAgaWYgKCFtX3Jhbmdlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgTm9kZVdpdGhJbmRl
eCBvbGROb2RlV2l0aEluZGV4KG9sZE5vZGUpOwotICAgICAgICBIYXNoU2V0PFJhbmdlKj46OmNv
bnN0X2l0ZXJhdG9yIGVuZCA9IG1fcmFuZ2VzLmVuZCgpOwotICAgICAgICBmb3IgKEhhc2hTZXQ8
UmFuZ2UqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3Jhbmdlcy5iZWdpbigpOyBpdCAhPSBlbmQ7
ICsraXQpCi0gICAgICAgICAgICAoKml0KS0+dGV4dE5vZGVzTWVyZ2VkKG9sZE5vZGVXaXRoSW5k
ZXgsIG9mZnNldCk7Ci0gICAgfQotCi0gICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIHVwZGF0ZSBt
YXJrZXJzIGZvciBzcGVsbGluZyBhbmQgZ3JhbW1hciBjaGVja2luZy4KLX0KLQotdm9pZCBEb2N1
bWVudDo6dGV4dE5vZGVTcGxpdChUZXh0KiBvbGROb2RlKQotewotICAgIGlmICghbV9yYW5nZXMu
aXNFbXB0eSgpKSB7Ci0gICAgICAgIEhhc2hTZXQ8UmFuZ2UqPjo6Y29uc3RfaXRlcmF0b3IgZW5k
ID0gbV9yYW5nZXMuZW5kKCk7Ci0gICAgICAgIGZvciAoSGFzaFNldDxSYW5nZSo+Ojpjb25zdF9p
dGVyYXRvciBpdCA9IG1fcmFuZ2VzLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkKLSAgICAgICAg
ICAgICgqaXQpLT50ZXh0Tm9kZVNwbGl0KG9sZE5vZGUpOwotICAgIH0KLQotICAgIC8vIEZJWE1F
OiBUaGlzIHNob3VsZCB1cGRhdGUgbWFya2VycyBmb3Igc3BlbGxpbmcgYW5kIGdyYW1tYXIgY2hl
Y2tpbmcuCi19Ci0KLXZvaWQgRG9jdW1lbnQ6OmNyZWF0ZURPTVdpbmRvdygpCi17Ci0gICAgQVNT
RVJUKG1fZnJhbWUpOwotICAgIEFTU0VSVCghbV9kb21XaW5kb3cpOwotCi0gICAgbV9kb21XaW5k
b3cgPSBET01XaW5kb3c6OmNyZWF0ZSh0aGlzKTsKLQotICAgIEFTU0VSVChtX2RvbVdpbmRvdy0+
ZG9jdW1lbnQoKSA9PSB0aGlzKTsKLSAgICBBU1NFUlQobV9kb21XaW5kb3ctPmZyYW1lKCkgPT0g
bV9mcmFtZSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnRha2VET01XaW5kb3dGcm9tKERvY3VtZW50
KiBkb2N1bWVudCkKLXsKLSAgICBBU1NFUlQobV9mcmFtZSk7Ci0gICAgQVNTRVJUKCFtX2RvbVdp
bmRvdyk7Ci0gICAgQVNTRVJUKGRvY3VtZW50LT5kb21XaW5kb3coKSk7Ci0KLSAgICBtX2RvbVdp
bmRvdyA9IGRvY3VtZW50LT5tX2RvbVdpbmRvdy5yZWxlYXNlKCk7Ci0gICAgbV9kb21XaW5kb3ct
PmRpZFNlY3VyZVRyYW5zaXRpb25Ubyh0aGlzKTsKLQotICAgIEFTU0VSVChtX2RvbVdpbmRvdy0+
ZG9jdW1lbnQoKSA9PSB0aGlzKTsKLSAgICBBU1NFUlQobV9kb21XaW5kb3ctPmZyYW1lKCkgPT0g
bV9mcmFtZSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnNldFdpbmRvd0F0dHJpYnV0ZUV2ZW50TGlz
dGVuZXIoY29uc3QgQXRvbWljU3RyaW5nJiBldmVudFR5cGUsIFBhc3NSZWZQdHI8RXZlbnRMaXN0
ZW5lcj4gbGlzdGVuZXIpCi17Ci0gICAgRE9NV2luZG93KiBkb21XaW5kb3cgPSB0aGlzLT5kb21X
aW5kb3coKTsKLSAgICBpZiAoIWRvbVdpbmRvdykKLSAgICAgICAgcmV0dXJuOwotICAgIGRvbVdp
bmRvdy0+c2V0QXR0cmlidXRlRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyKTsKLX0K
LQotRXZlbnRMaXN0ZW5lciogRG9jdW1lbnQ6OmdldFdpbmRvd0F0dHJpYnV0ZUV2ZW50TGlzdGVu
ZXIoY29uc3QgQXRvbWljU3RyaW5nJiBldmVudFR5cGUpCi17Ci0gICAgRE9NV2luZG93KiBkb21X
aW5kb3cgPSB0aGlzLT5kb21XaW5kb3coKTsKLSAgICBpZiAoIWRvbVdpbmRvdykKLSAgICAgICAg
cmV0dXJuIDA7Ci0gICAgcmV0dXJuIGRvbVdpbmRvdy0+Z2V0QXR0cmlidXRlRXZlbnRMaXN0ZW5l
cihldmVudFR5cGUpOwotfQotCi12b2lkIERvY3VtZW50OjpkaXNwYXRjaFdpbmRvd0V2ZW50KFBh
c3NSZWZQdHI8RXZlbnQ+IGV2ZW50LCAgUGFzc1JlZlB0cjxFdmVudFRhcmdldD4gdGFyZ2V0KQot
ewotICAgIEFTU0VSVCghZXZlbnREaXNwYXRjaEZvcmJpZGRlbigpKTsKLSAgICBET01XaW5kb3cq
IGRvbVdpbmRvdyA9IHRoaXMtPmRvbVdpbmRvdygpOwotICAgIGlmICghZG9tV2luZG93KQotICAg
ICAgICByZXR1cm47Ci0gICAgZG9tV2luZG93LT5kaXNwYXRjaEV2ZW50KGV2ZW50LCB0YXJnZXQp
OwotfQotCi12b2lkIERvY3VtZW50OjpkaXNwYXRjaFdpbmRvd0xvYWRFdmVudCgpCi17Ci0gICAg
QVNTRVJUKCFldmVudERpc3BhdGNoRm9yYmlkZGVuKCkpOwotICAgIERPTVdpbmRvdyogZG9tV2lu
ZG93ID0gdGhpcy0+ZG9tV2luZG93KCk7Ci0gICAgaWYgKCFkb21XaW5kb3cpCi0gICAgICAgIHJl
dHVybjsKLSAgICBkb21XaW5kb3ctPmRpc3BhdGNoTG9hZEV2ZW50KCk7Ci0gICAgbV9sb2FkRXZl
bnRGaW5pc2hlZCA9IHRydWU7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmVucXVldWVXaW5kb3dFdmVu
dChQYXNzUmVmUHRyPEV2ZW50PiBldmVudCkKLXsKLSAgICBldmVudC0+c2V0VGFyZ2V0KGRvbVdp
bmRvdygpKTsKLSAgICBtX2V2ZW50UXVldWUtPmVucXVldWVFdmVudChldmVudCk7Ci19Ci0KLXZv
aWQgRG9jdW1lbnQ6OmVucXVldWVEb2N1bWVudEV2ZW50KFBhc3NSZWZQdHI8RXZlbnQ+IGV2ZW50
KQotewotICAgIGV2ZW50LT5zZXRUYXJnZXQodGhpcyk7Ci0gICAgbV9ldmVudFF1ZXVlLT5lbnF1
ZXVlRXZlbnQoZXZlbnQpOwotfQotCi1QYXNzUmVmUHRyPEV2ZW50PiBEb2N1bWVudDo6Y3JlYXRl
RXZlbnQoY29uc3QgU3RyaW5nJiBldmVudFR5cGUsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAg
IFJlZlB0cjxFdmVudD4gZXZlbnQgPSBFdmVudEZhY3Rvcnk6OmNyZWF0ZShldmVudFR5cGUpOwot
ICAgIGlmIChldmVudCkKLSAgICAgICAgcmV0dXJuIGV2ZW50LnJlbGVhc2UoKTsKLQotICAgIGVj
ID0gTk9UX1NVUFBPUlRFRF9FUlI7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6
OmFkZE11dGF0aW9uRXZlbnRMaXN0ZW5lclR5cGVJZkVuYWJsZWQoTGlzdGVuZXJUeXBlIGxpc3Rl
bmVyVHlwZSkKLXsKLSAgICBpZiAoQ29udGV4dEZlYXR1cmVzOjptdXRhdGlvbkV2ZW50c0VuYWJs
ZWQodGhpcykpCi0gICAgICAgIGFkZExpc3RlbmVyVHlwZShsaXN0ZW5lclR5cGUpOwotfQotCi12
b2lkIERvY3VtZW50OjphZGRMaXN0ZW5lclR5cGVJZk5lZWRlZChjb25zdCBBdG9taWNTdHJpbmcm
IGV2ZW50VHlwZSkKLXsKLSAgICBpZiAoZXZlbnRUeXBlID09IGV2ZW50TmFtZXMoKS5ET01TdWJ0
cmVlTW9kaWZpZWRFdmVudCkKLSAgICAgICAgYWRkTXV0YXRpb25FdmVudExpc3RlbmVyVHlwZUlm
RW5hYmxlZChET01TVUJUUkVFTU9ESUZJRURfTElTVEVORVIpOwotICAgIGVsc2UgaWYgKGV2ZW50
VHlwZSA9PSBldmVudE5hbWVzKCkuRE9NTm9kZUluc2VydGVkRXZlbnQpCi0gICAgICAgIGFkZE11
dGF0aW9uRXZlbnRMaXN0ZW5lclR5cGVJZkVuYWJsZWQoRE9NTk9ERUlOU0VSVEVEX0xJU1RFTkVS
KTsKLSAgICBlbHNlIGlmIChldmVudFR5cGUgPT0gZXZlbnROYW1lcygpLkRPTU5vZGVSZW1vdmVk
RXZlbnQpCi0gICAgICAgIGFkZE11dGF0aW9uRXZlbnRMaXN0ZW5lclR5cGVJZkVuYWJsZWQoRE9N
Tk9ERVJFTU9WRURfTElTVEVORVIpOwotICAgIGVsc2UgaWYgKGV2ZW50VHlwZSA9PSBldmVudE5h
bWVzKCkuRE9NTm9kZVJlbW92ZWRGcm9tRG9jdW1lbnRFdmVudCkKLSAgICAgICAgYWRkTXV0YXRp
b25FdmVudExpc3RlbmVyVHlwZUlmRW5hYmxlZChET01OT0RFUkVNT1ZFREZST01ET0NVTUVOVF9M
SVNURU5FUik7Ci0gICAgZWxzZSBpZiAoZXZlbnRUeXBlID09IGV2ZW50TmFtZXMoKS5ET01Ob2Rl
SW5zZXJ0ZWRJbnRvRG9jdW1lbnRFdmVudCkKLSAgICAgICAgYWRkTXV0YXRpb25FdmVudExpc3Rl
bmVyVHlwZUlmRW5hYmxlZChET01OT0RFSU5TRVJURURJTlRPRE9DVU1FTlRfTElTVEVORVIpOwot
ICAgIGVsc2UgaWYgKGV2ZW50VHlwZSA9PSBldmVudE5hbWVzKCkuRE9NQXR0ck1vZGlmaWVkRXZl
bnQpCi0gICAgICAgIGFkZE11dGF0aW9uRXZlbnRMaXN0ZW5lclR5cGVJZkVuYWJsZWQoRE9NQVRU
Uk1PRElGSUVEX0xJU1RFTkVSKTsKLSAgICBlbHNlIGlmIChldmVudFR5cGUgPT0gZXZlbnROYW1l
cygpLkRPTUNoYXJhY3RlckRhdGFNb2RpZmllZEV2ZW50KQotICAgICAgICBhZGRNdXRhdGlvbkV2
ZW50TGlzdGVuZXJUeXBlSWZFbmFibGVkKERPTUNIQVJBQ1RFUkRBVEFNT0RJRklFRF9MSVNURU5F
Uik7Ci0gICAgZWxzZSBpZiAoZXZlbnRUeXBlID09IGV2ZW50TmFtZXMoKS5vdmVyZmxvd2NoYW5n
ZWRFdmVudCkKLSAgICAgICAgYWRkTGlzdGVuZXJUeXBlKE9WRVJGTE9XQ0hBTkdFRF9MSVNURU5F
Uik7Ci0gICAgZWxzZSBpZiAoZXZlbnRUeXBlID09IGV2ZW50TmFtZXMoKS53ZWJraXRBbmltYXRp
b25TdGFydEV2ZW50KQotICAgICAgICBhZGRMaXN0ZW5lclR5cGUoQU5JTUFUSU9OU1RBUlRfTElT
VEVORVIpOwotICAgIGVsc2UgaWYgKGV2ZW50VHlwZSA9PSBldmVudE5hbWVzKCkud2Via2l0QW5p
bWF0aW9uRW5kRXZlbnQpCi0gICAgICAgIGFkZExpc3RlbmVyVHlwZShBTklNQVRJT05FTkRfTElT
VEVORVIpOwotICAgIGVsc2UgaWYgKGV2ZW50VHlwZSA9PSBldmVudE5hbWVzKCkud2Via2l0QW5p
bWF0aW9uSXRlcmF0aW9uRXZlbnQpCi0gICAgICAgIGFkZExpc3RlbmVyVHlwZShBTklNQVRJT05J
VEVSQVRJT05fTElTVEVORVIpOwotICAgIGVsc2UgaWYgKGV2ZW50VHlwZSA9PSBldmVudE5hbWVz
KCkud2Via2l0VHJhbnNpdGlvbkVuZEV2ZW50KQotICAgICAgICBhZGRMaXN0ZW5lclR5cGUoVFJB
TlNJVElPTkVORF9MSVNURU5FUik7Ci0gICAgZWxzZSBpZiAoZXZlbnRUeXBlID09IGV2ZW50TmFt
ZXMoKS5iZWZvcmVsb2FkRXZlbnQpCi0gICAgICAgIGFkZExpc3RlbmVyVHlwZShCRUZPUkVMT0FE
X0xJU1RFTkVSKTsKLSAgICBlbHNlIGlmIChldmVudFR5cGUgPT0gZXZlbnROYW1lcygpLnNjcm9s
bEV2ZW50KQotICAgICAgICBhZGRMaXN0ZW5lclR5cGUoU0NST0xMX0xJU1RFTkVSKTsKLX0KLQot
Q1NTU3R5bGVEZWNsYXJhdGlvbiogRG9jdW1lbnQ6OmdldE92ZXJyaWRlU3R5bGUoRWxlbWVudCos
IGNvbnN0IFN0cmluZyYpCi17Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLUhUTUxGcmFtZU93bmVyRWxl
bWVudCogRG9jdW1lbnQ6Om93bmVyRWxlbWVudCgpIGNvbnN0Ci17Ci0gICAgaWYgKCFmcmFtZSgp
KQotICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gZnJhbWUoKS0+b3duZXJFbGVtZW50KCk7
Ci19Ci0KLVN0cmluZyBEb2N1bWVudDo6Y29va2llKEV4Y2VwdGlvbkNvZGUmIGVjKSBjb25zdAot
ewotICAgIGlmIChwYWdlKCkgJiYgIXBhZ2UoKS0+c2V0dGluZ3MoKS0+Y29va2llRW5hYmxlZCgp
KQotICAgICAgICByZXR1cm4gU3RyaW5nKCk7Ci0KLSAgICAvLyBGSVhNRTogVGhlIEhUTUw1IERP
TSBzcGVjIHN0YXRlcyB0aGF0IHRoaXMgYXR0cmlidXRlIGNhbiByYWlzZSBhbgotICAgIC8vIElO
VkFMSURfU1RBVEVfRVJSIGV4Y2VwdGlvbiBvbiBnZXR0aW5nIGlmIHRoZSBEb2N1bWVudCBoYXMg
bm8KLSAgICAvLyBicm93c2luZyBjb250ZXh0LgotCi0gICAgaWYgKCFzZWN1cml0eU9yaWdpbigp
LT5jYW5BY2Nlc3NDb29raWVzKCkpIHsKLSAgICAgICAgZWMgPSBTRUNVUklUWV9FUlI7Ci0gICAg
ICAgIHJldHVybiBTdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBLVVJMIGNvb2tpZVVSTCA9IHRoaXMt
PmNvb2tpZVVSTCgpOwotICAgIGlmIChjb29raWVVUkwuaXNFbXB0eSgpKQotICAgICAgICByZXR1
cm4gU3RyaW5nKCk7Ci0KLSAgICByZXR1cm4gY29va2llcyh0aGlzLCBjb29raWVVUkwpOwotfQot
Ci12b2lkIERvY3VtZW50OjpzZXRDb29raWUoY29uc3QgU3RyaW5nJiB2YWx1ZSwgRXhjZXB0aW9u
Q29kZSYgZWMpCi17Ci0gICAgaWYgKHBhZ2UoKSAmJiAhcGFnZSgpLT5zZXR0aW5ncygpLT5jb29r
aWVFbmFibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIEZJWE1FOiBUaGUgSFRNTDUg
RE9NIHNwZWMgc3RhdGVzIHRoYXQgdGhpcyBhdHRyaWJ1dGUgY2FuIHJhaXNlIGFuCi0gICAgLy8g
SU5WQUxJRF9TVEFURV9FUlIgZXhjZXB0aW9uIG9uIHNldHRpbmcgaWYgdGhlIERvY3VtZW50IGhh
cyBubwotICAgIC8vIGJyb3dzaW5nIGNvbnRleHQuCi0KLSAgICBpZiAoIXNlY3VyaXR5T3JpZ2lu
KCktPmNhbkFjY2Vzc0Nvb2tpZXMoKSkgewotICAgICAgICBlYyA9IFNFQ1VSSVRZX0VSUjsKLSAg
ICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEtVUkwgY29va2llVVJMID0gdGhpcy0+Y29va2ll
VVJMKCk7Ci0gICAgaWYgKGNvb2tpZVVSTC5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLQot
ICAgIHNldENvb2tpZXModGhpcywgY29va2llVVJMLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBEb2N1
bWVudDo6cmVmZXJyZXIoKSBjb25zdAotewotICAgIGlmIChmcmFtZSgpKQotICAgICAgICByZXR1
cm4gZnJhbWUoKS0+bG9hZGVyKCktPnJlZmVycmVyKCk7Ci0gICAgcmV0dXJuIFN0cmluZygpOwot
fQotCi1TdHJpbmcgRG9jdW1lbnQ6OmRvbWFpbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHNlY3Vy
aXR5T3JpZ2luKCktPmRvbWFpbigpOwotfQotCi12b2lkIERvY3VtZW50OjpzZXREb21haW4oY29u
c3QgU3RyaW5nJiBuZXdEb21haW4sIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIGlmIChTY2hl
bWVSZWdpc3RyeTo6aXNEb21haW5SZWxheGF0aW9uRm9yYmlkZGVuRm9yVVJMU2NoZW1lKHNlY3Vy
aXR5T3JpZ2luKCktPnByb3RvY29sKCkpKSB7Ci0gICAgICAgIGVjID0gU0VDVVJJVFlfRVJSOwot
ICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gQm90aCBOUyBhbmQgSUUgc3BlY2lmeSB0
aGF0IGNoYW5naW5nIHRoZSBkb21haW4gaXMgb25seSBhbGxvd2VkIHdoZW4KLSAgICAvLyB0aGUg
bmV3IGRvbWFpbiBpcyBhIHN1ZmZpeCBvZiB0aGUgb2xkIGRvbWFpbi4KLQotICAgIC8vIEZJWE1F
OiBXZSBzaG91bGQgYWRkIGxvZ2dpbmcgaW5kaWNhdGluZyB3aHkgYSBkb21haW4gd2FzIG5vdCBh
bGxvd2VkLgotCi0gICAgLy8gSWYgdGhlIG5ldyBkb21haW4gaXMgdGhlIHNhbWUgYXMgdGhlIG9s
ZCBkb21haW4sIHN0aWxsIGNhbGwKLSAgICAvLyBzZWN1cml0eU9yaWdpbigpLT5zZXREb21haW5G
b3JET00uIFRoaXMgd2lsbCBjaGFuZ2UgdGhlCi0gICAgLy8gc2VjdXJpdHkgY2hlY2sgYmVoYXZp
b3IuIEZvciBleGFtcGxlLCBpZiBhIHBhZ2UgbG9hZGVkIG9uIHBvcnQgODAwMAotICAgIC8vIGFz
c2lnbnMgaXRzIGN1cnJlbnQgZG9tYWluIHVzaW5nIGRvY3VtZW50LmRvbWFpbiwgdGhlIHBhZ2Ug
d2lsbAotICAgIC8vIGFsbG93IG90aGVyIHBhZ2VzIGxvYWRlZCBvbiBkaWZmZXJlbnQgcG9ydHMg
aW4gdGhlIHNhbWUgZG9tYWluIHRoYXQKLSAgICAvLyBoYXZlIGFsc28gYXNzaWduZWQgdG8gYWNj
ZXNzIHRoaXMgcGFnZS4KLSAgICBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoZG9tYWluKCksIG5ld0Rv
bWFpbikpIHsKLSAgICAgICAgc2VjdXJpdHlPcmlnaW4oKS0+c2V0RG9tYWluRnJvbURPTShuZXdE
b21haW4pOwotICAgICAgICBpZiAobV9mcmFtZSkKLSAgICAgICAgICAgIG1fZnJhbWUtPnNjcmlw
dCgpLT51cGRhdGVTZWN1cml0eU9yaWdpbigpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0g
ICAgaW50IG9sZExlbmd0aCA9IGRvbWFpbigpLmxlbmd0aCgpOwotICAgIGludCBuZXdMZW5ndGgg
PSBuZXdEb21haW4ubGVuZ3RoKCk7Ci0gICAgLy8gZS5nLiBuZXdEb21haW4gPSB3ZWJraXQub3Jn
ICgxMCkgYW5kIGRvbWFpbigpID0gd3d3LndlYmtpdC5vcmcgKDE0KQotICAgIGlmIChuZXdMZW5n
dGggPj0gb2xkTGVuZ3RoKSB7Ci0gICAgICAgIGVjID0gU0VDVVJJVFlfRVJSOwotICAgICAgICBy
ZXR1cm47Ci0gICAgfQotCi0gICAgU3RyaW5nIHRlc3QgPSBkb21haW4oKTsKLSAgICAvLyBDaGVj
ayB0aGF0IGl0J3MgYSBzdWJkb21haW4sIG5vdCBlLmcuICJlYmtpdC5vcmciCi0gICAgaWYgKHRl
c3Rbb2xkTGVuZ3RoIC0gbmV3TGVuZ3RoIC0gMV0gIT0gJy4nKSB7Ci0gICAgICAgIGVjID0gU0VD
VVJJVFlfRVJSOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gTm93IHRlc3QgaXMg
IndlYmtpdC5vcmciIGZyb20gZG9tYWluKCkKLSAgICAvLyBhbmQgd2UgY2hlY2sgdGhhdCBpdCdz
IHRoZSBzYW1lIHRoaW5nIGFzIG5ld0RvbWFpbgotICAgIHRlc3QucmVtb3ZlKDAsIG9sZExlbmd0
aCAtIG5ld0xlbmd0aCk7Ci0gICAgaWYgKHRlc3QgIT0gbmV3RG9tYWluKSB7Ci0gICAgICAgIGVj
ID0gU0VDVVJJVFlfRVJSOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc2VjdXJpdHlP
cmlnaW4oKS0+c2V0RG9tYWluRnJvbURPTShuZXdEb21haW4pOwotICAgIGlmIChtX2ZyYW1lKQot
ICAgICAgICBtX2ZyYW1lLT5zY3JpcHQoKS0+dXBkYXRlU2VjdXJpdHlPcmlnaW4oKTsKLX0KLQot
Ly8gaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay8jZG9t
LWRvY3VtZW50LWxhc3Rtb2RpZmllZAotU3RyaW5nIERvY3VtZW50OjpsYXN0TW9kaWZpZWQoKSBj
b25zdAotewotICAgIERhdGVDb21wb25lbnRzIGRhdGU7Ci0gICAgYm9vbCBmb3VuZERhdGUgPSBm
YWxzZTsKLSAgICBpZiAobV9mcmFtZSkgewotICAgICAgICBTdHJpbmcgaHR0cExhc3RNb2RpZmll
ZDsKLSAgICAgICAgaWYgKERvY3VtZW50TG9hZGVyKiBkb2N1bWVudExvYWRlciA9IGxvYWRlcigp
KSAKLSAgICAgICAgICAgIGh0dHBMYXN0TW9kaWZpZWQgPSBkb2N1bWVudExvYWRlci0+cmVzcG9u
c2UoKS5odHRwSGVhZGVyRmllbGQoIkxhc3QtTW9kaWZpZWQiKTsKLSAgICAgICAgaWYgKCFodHRw
TGFzdE1vZGlmaWVkLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgZGF0ZS5zZXRNaWxsaXNlY29u
ZHNTaW5jZUVwb2NoRm9yRGF0ZVRpbWUocGFyc2VEYXRlKGh0dHBMYXN0TW9kaWZpZWQpKTsKLSAg
ICAgICAgICAgIGZvdW5kRGF0ZSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gRklY
TUU6IElmIHRoaXMgZG9jdW1lbnQgY2FtZSBmcm9tIHRoZSBmaWxlIHN5c3RlbSwgdGhlIEhUTUw1
Ci0gICAgLy8gc3BlY2lmaWNpYXRpb24gdGVsbHMgdXMgdG8gcmVhZCB0aGUgbGFzdCBtb2RpZmlj
YXRpb24gZGF0ZSBmcm9tIHRoZSBmaWxlCi0gICAgLy8gc3lzdGVtLgotICAgIGlmICghZm91bmRE
YXRlKQotICAgICAgICBkYXRlLnNldE1pbGxpc2Vjb25kc1NpbmNlRXBvY2hGb3JEYXRlVGltZShj
dXJyZW50VGltZU1TKCkpOwotICAgIHJldHVybiBTdHJpbmc6OmZvcm1hdCgiJTAyZC8lMDJkLyUw
NGQgJTAyZDolMDJkOiUwMmQiLCBkYXRlLm1vbnRoKCkgKyAxLCBkYXRlLm1vbnRoRGF5KCksIGRh
dGUuZnVsbFllYXIoKSwgZGF0ZS5ob3VyKCksIGRhdGUubWludXRlKCksIGRhdGUuc2Vjb25kKCkp
OwotfQotCi1zdGF0aWMgYm9vbCBpc1ZhbGlkTmFtZU5vbkFTQ0lJKGNvbnN0IFVDaGFyKiBjaGFy
YWN0ZXJzLCB1bnNpZ25lZCBsZW5ndGgpCi17Ci0gICAgdW5zaWduZWQgaSA9IDA7Ci0KLSAgICBV
Q2hhcjMyIGM7Ci0gICAgVTE2X05FWFQoY2hhcmFjdGVycywgaSwgbGVuZ3RoLCBjKQotICAgIGlm
ICghaXNWYWxpZE5hbWVTdGFydChjKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgd2hp
bGUgKGkgPCBsZW5ndGgpIHsKLSAgICAgICAgVTE2X05FWFQoY2hhcmFjdGVycywgaSwgbGVuZ3Ro
LCBjKQotICAgICAgICBpZiAoIWlzVmFsaWROYW1lUGFydChjKSkKLSAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdGVtcGxhdGU8dHlwZW5h
bWUgQ2hhclR5cGU+Ci1zdGF0aWMgaW5saW5lIGJvb2wgaXNWYWxpZE5hbWVBU0NJSShjb25zdCBD
aGFyVHlwZSogY2hhcmFjdGVycywgdW5zaWduZWQgbGVuZ3RoKQotewotICAgIENoYXJUeXBlIGMg
PSBjaGFyYWN0ZXJzWzBdOwotICAgIGlmICghKGlzQVNDSUlBbHBoYShjKSB8fCBjID09ICc6JyB8
fCBjID09ICdfJykpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGZvciAodW5zaWduZWQg
aSA9IDE7IGkgPCBsZW5ndGg7ICsraSkgewotICAgICAgICBjID0gY2hhcmFjdGVyc1tpXTsKLSAg
ICAgICAgaWYgKCEoaXNBU0NJSUFscGhhbnVtZXJpYyhjKSB8fCBjID09ICc6JyB8fCBjID09ICdf
JyB8fCBjID09ICctJyB8fCBjID09ICcuJykpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6OmlzVmFsaWROYW1l
KGNvbnN0IFN0cmluZyYgbmFtZSkKLXsKLSAgICB1bnNpZ25lZCBsZW5ndGggPSBuYW1lLmxlbmd0
aCgpOwotICAgIGlmICghbGVuZ3RoKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBjb25z
dCBVQ2hhciogY2hhcmFjdGVyczsKLSAgICBpZiAobmFtZS5pczhCaXQoKSkgewotICAgICAgICBp
ZiAoaXNWYWxpZE5hbWVBU0NJSShuYW1lLmNoYXJhY3RlcnM4KCksIGxlbmd0aCkpCi0gICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgY2hhcmFjdGVycyA9IG5hbWUuY2hhcmFjdGVycygp
OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNoYXJhY3RlcnMgPSBuYW1lLmNoYXJhY3RlcnMxNigp
OwotICAgICAgICBpZiAoaXNWYWxpZE5hbWVBU0NJSShjaGFyYWN0ZXJzLCBsZW5ndGgpKQotICAg
ICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBpc1ZhbGlkTmFtZU5vbkFT
Q0lJKGNoYXJhY3RlcnMsIGxlbmd0aCk7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6OnBhcnNlUXVhbGlm
aWVkTmFtZShjb25zdCBTdHJpbmcmIHF1YWxpZmllZE5hbWUsIFN0cmluZyYgcHJlZml4LCBTdHJp
bmcmIGxvY2FsTmFtZSwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgdW5zaWduZWQgbGVuZ3Ro
ID0gcXVhbGlmaWVkTmFtZS5sZW5ndGgoKTsKLQotICAgIGlmICghbGVuZ3RoKSB7Ci0gICAgICAg
IGVjID0gSU5WQUxJRF9DSEFSQUNURVJfRVJSOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
fQotCi0gICAgYm9vbCBuYW1lU3RhcnQgPSB0cnVlOwotICAgIGJvb2wgc2F3Q29sb24gPSBmYWxz
ZTsKLSAgICBpbnQgY29sb25Qb3MgPSAwOwotCi0gICAgY29uc3QgVUNoYXIqIHMgPSBxdWFsaWZp
ZWROYW1lLmNoYXJhY3RlcnMoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVuZ3Ro
OykgewotICAgICAgICBVQ2hhcjMyIGM7Ci0gICAgICAgIFUxNl9ORVhUKHMsIGksIGxlbmd0aCwg
YykKLSAgICAgICAgaWYgKGMgPT0gJzonKSB7Ci0gICAgICAgICAgICBpZiAoc2F3Q29sb24pIHsK
LSAgICAgICAgICAgICAgICBlYyA9IE5BTUVTUEFDRV9FUlI7Ci0gICAgICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOyAvLyBtdWx0aXBsZSBjb2xvbnM6IG5vdCBhbGxvd2VkCi0gICAgICAgICAgICB9
Ci0gICAgICAgICAgICBuYW1lU3RhcnQgPSB0cnVlOwotICAgICAgICAgICAgc2F3Q29sb24gPSB0
cnVlOwotICAgICAgICAgICAgY29sb25Qb3MgPSBpIC0gMTsKLSAgICAgICAgfSBlbHNlIGlmIChu
YW1lU3RhcnQpIHsKLSAgICAgICAgICAgIGlmICghaXNWYWxpZE5hbWVTdGFydChjKSkgewotICAg
ICAgICAgICAgICAgIGVjID0gSU5WQUxJRF9DSEFSQUNURVJfRVJSOwotICAgICAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5hbWVTdGFydCA9IGZh
bHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKCFpc1ZhbGlkTmFtZVBhcnQo
YykpIHsKLSAgICAgICAgICAgICAgICBlYyA9IElOVkFMSURfQ0hBUkFDVEVSX0VSUjsKLSAgICAg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9
Ci0KLSAgICBpZiAoIXNhd0NvbG9uKSB7Ci0gICAgICAgIHByZWZpeCA9IFN0cmluZygpOwotICAg
ICAgICBsb2NhbE5hbWUgPSBxdWFsaWZpZWROYW1lOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBy
ZWZpeCA9IHF1YWxpZmllZE5hbWUuc3Vic3RyaW5nKDAsIGNvbG9uUG9zKTsKLSAgICAgICAgaWYg
KHByZWZpeC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGVjID0gTkFNRVNQQUNFX0VSUjsKLSAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBsb2NhbE5hbWUgPSBx
dWFsaWZpZWROYW1lLnN1YnN0cmluZyhjb2xvblBvcyArIDEpOwotICAgIH0KLQotICAgIGlmIChs
b2NhbE5hbWUuaXNFbXB0eSgpKSB7Ci0gICAgICAgIGVjID0gTkFNRVNQQUNFX0VSUjsKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIERv
Y3VtZW50OjpzZXREZWNvZGVyKFBhc3NSZWZQdHI8VGV4dFJlc291cmNlRGVjb2Rlcj4gZGVjb2Rl
cikKLXsKLSAgICBtX2RlY29kZXIgPSBkZWNvZGVyOwotfQotCi1LVVJMIERvY3VtZW50Ojpjb21w
bGV0ZVVSTChjb25zdCBTdHJpbmcmIHVybCwgY29uc3QgS1VSTCYgYmFzZVVSTE92ZXJyaWRlKSBj
b25zdAotewotICAgIC8vIEFsd2F5cyByZXR1cm4gYSBudWxsIFVSTCB3aGVuIHBhc3NlZCBhIG51
bGwgc3RyaW5nLgotICAgIC8vIEZJWE1FOiBTaG91bGQgd2UgY2hhbmdlIHRoZSBLVVJMIGNvbnN0
cnVjdG9yIHRvIGhhdmUgdGhpcyBiZWhhdmlvcj8KLSAgICAvLyBTZWUgYWxzbyBbQ1NTXVN0eWxl
U2hlZXQ6OmNvbXBsZXRlVVJMKGNvbnN0IFN0cmluZyYpCi0gICAgaWYgKHVybC5pc051bGwoKSkK
LSAgICAgICAgcmV0dXJuIEtVUkwoKTsKLSAgICBjb25zdCBLVVJMJiBiYXNlVVJMID0gKChiYXNl
VVJMT3ZlcnJpZGUuaXNFbXB0eSgpIHx8IGJhc2VVUkxPdmVycmlkZSA9PSBibGFua1VSTCgpKSAm
JiBwYXJlbnREb2N1bWVudCgpKSA/IHBhcmVudERvY3VtZW50KCktPmJhc2VVUkwoKSA6IGJhc2VV
UkxPdmVycmlkZTsKLSAgICBpZiAoIW1fZGVjb2RlcikKLSAgICAgICAgcmV0dXJuIEtVUkwoYmFz
ZVVSTCwgdXJsKTsKLSAgICByZXR1cm4gS1VSTChiYXNlVVJMLCB1cmwsIG1fZGVjb2Rlci0+ZW5j
b2RpbmcoKSk7Ci19Ci0KLUtVUkwgRG9jdW1lbnQ6OmNvbXBsZXRlVVJMKGNvbnN0IFN0cmluZyYg
dXJsKSBjb25zdAotewotICAgIHJldHVybiBjb21wbGV0ZVVSTCh1cmwsIG1fYmFzZVVSTCk7Ci19
Ci0KLXZvaWQgRG9jdW1lbnQ6OnNldEluUGFnZUNhY2hlKGJvb2wgZmxhZykKLXsKLSAgICBpZiAo
bV9pblBhZ2VDYWNoZSA9PSBmbGFnKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX2luUGFnZUNh
Y2hlID0gZmxhZzsKLQotICAgIEZyYW1lVmlldyogdiA9IHZpZXcoKTsKLSAgICBpZiAoZmxhZykg
ewotICAgICAgICBBU1NFUlQoIW1fc2F2ZWRSZW5kZXJlcik7Ci0gICAgICAgIG1fc2F2ZWRSZW5k
ZXJlciA9IHJlbmRlcmVyKCk7Ci0gICAgICAgIGlmICh2KSB7Ci0gICAgICAgICAgICB2LT5jYWNo
ZUN1cnJlbnRTY3JvbGxQb3NpdGlvbigpOwotICAgICAgICAgICAgaWYgKHBhZ2UoKSAmJiBwYWdl
KCktPm1haW5GcmFtZSgpID09IG1fZnJhbWUpCi0gICAgICAgICAgICAgICAgdi0+cmVzZXRTY3Jv
bGxiYXJzQW5kQ2xlYXJDb250ZW50c1NpemUoKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAg
ICAgICAgICB2LT5yZXNldFNjcm9sbGJhcnMoKTsKLSAgICAgICAgfQotICAgICAgICBtX3N0eWxl
UmVjYWxjVGltZXIuc3RvcCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFTU0VSVCghcmVuZGVy
ZXIoKSB8fCByZW5kZXJlcigpID09IG1fc2F2ZWRSZW5kZXJlcik7Ci0gICAgICAgIEFTU0VSVCht
X3JlbmRlckFyZW5hKTsKLSAgICAgICAgc2V0UmVuZGVyZXIobV9zYXZlZFJlbmRlcmVyKTsKLSAg
ICAgICAgbV9zYXZlZFJlbmRlcmVyID0gMDsKLQotICAgICAgICBpZiAoY2hpbGROZWVkc1N0eWxl
UmVjYWxjKCkpCi0gICAgICAgICAgICBzY2hlZHVsZVN0eWxlUmVjYWxjKCk7Ci0gICAgfQotfQot
Ci12b2lkIERvY3VtZW50Ojpkb2N1bWVudFdpbGxCZWNvbWVJbmFjdGl2ZSgpCi17Ci0jaWYgVVNF
KEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQotICAgIGlmIChyZW5kZXJlcigpKQotICAgICAgICBy
ZW5kZXJWaWV3KCktPndpbGxNb3ZlT2Zmc2NyZWVuKCk7Ci0jZW5kaWYKLX0KLQotdm9pZCBEb2N1
bWVudDo6ZG9jdW1lbnRXaWxsU3VzcGVuZEZvclBhZ2VDYWNoZSgpCi17Ci0gICAgZG9jdW1lbnRX
aWxsQmVjb21lSW5hY3RpdmUoKTsKLQotICAgIEhhc2hTZXQ8RWxlbWVudCo+OjppdGVyYXRvciBl
bmQgPSBtX2RvY3VtZW50U3VzcGVuc2lvbkNhbGxiYWNrRWxlbWVudHMuZW5kKCk7Ci0gICAgZm9y
IChIYXNoU2V0PEVsZW1lbnQqPjo6aXRlcmF0b3IgaSA9IG1fZG9jdW1lbnRTdXNwZW5zaW9uQ2Fs
bGJhY2tFbGVtZW50cy5iZWdpbigpOyBpICE9IGVuZDsgKytpKQotICAgICAgICAoKmkpLT5kb2N1
bWVudFdpbGxTdXNwZW5kRm9yUGFnZUNhY2hlKCk7Ci0KLSNpZm5kZWYgTkRFQlVHCi0gICAgLy8g
Q2xlYXIgdGhlIHVwZGF0ZSBmbGFnIHRvIGJlIGFibGUgdG8gY2hlY2sgaWYgdGhlIHZpZXdwb3J0
IGFyZ3VtZW50cyB1cGRhdGUKLSAgICAvLyBpcyBkaXNwYXRjaGVkLCBhZnRlciB0aGUgZG9jdW1l
bnQgaXMgcmVzdG9yZWQgZnJvbSB0aGUgcGFnZSBjYWNoZS4KLSAgICBtX2RpZERpc3BhdGNoVmll
d3BvcnRQcm9wZXJ0aWVzQ2hhbmdlZCA9IGZhbHNlOwotI2VuZGlmCi19Ci0KLXZvaWQgRG9jdW1l
bnQ6OmRvY3VtZW50RGlkUmVzdW1lRnJvbVBhZ2VDYWNoZSgpIAotewotICAgIFZlY3RvcjxFbGVt
ZW50Kj4gZWxlbWVudHM7Ci0gICAgY29weVRvVmVjdG9yKG1fZG9jdW1lbnRTdXNwZW5zaW9uQ2Fs
bGJhY2tFbGVtZW50cywgZWxlbWVudHMpOwotICAgIFZlY3RvcjxFbGVtZW50Kj46Oml0ZXJhdG9y
IGVuZCA9IGVsZW1lbnRzLmVuZCgpOwotICAgIGZvciAoVmVjdG9yPEVsZW1lbnQqPjo6aXRlcmF0
b3IgaSA9IGVsZW1lbnRzLmJlZ2luKCk7IGkgIT0gZW5kOyArK2kpCi0gICAgICAgICgqaSktPmRv
Y3VtZW50RGlkUmVzdW1lRnJvbVBhZ2VDYWNoZSgpOwotCi0jaWYgVVNFKEFDQ0VMRVJBVEVEX0NP
TVBPU0lUSU5HKQotICAgIGlmIChyZW5kZXJlcigpKQotICAgICAgICByZW5kZXJWaWV3KCktPmRp
ZE1vdmVPbnNjcmVlbigpOwotI2VuZGlmCi0KLSAgICBpZiAoRnJhbWVWaWV3KiBmcmFtZVZpZXcg
PSB2aWV3KCkpCi0gICAgICAgIGZyYW1lVmlldy0+c2V0QW5pbWF0b3JzQXJlQWN0aXZlKCk7Ci0K
LSAgICBBU1NFUlQobV9mcmFtZSk7Ci0gICAgbV9mcmFtZS0+bG9hZGVyKCktPmNsaWVudCgpLT5k
aXNwYXRjaERpZEJlY29tZUZyYW1lc2V0KGlzRnJhbWVTZXQoKSk7Ci19Ci0KLXZvaWQgRG9jdW1l
bnQ6OnJlZ2lzdGVyRm9yUGFnZUNhY2hlU3VzcGVuc2lvbkNhbGxiYWNrcyhFbGVtZW50KiBlKQot
ewotICAgIG1fZG9jdW1lbnRTdXNwZW5zaW9uQ2FsbGJhY2tFbGVtZW50cy5hZGQoZSk7Ci19Ci0K
LXZvaWQgRG9jdW1lbnQ6OnVucmVnaXN0ZXJGb3JQYWdlQ2FjaGVTdXNwZW5zaW9uQ2FsbGJhY2tz
KEVsZW1lbnQqIGUpCi17Ci0gICAgbV9kb2N1bWVudFN1c3BlbnNpb25DYWxsYmFja0VsZW1lbnRz
LnJlbW92ZShlKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6bWVkaWFWb2x1bWVEaWRDaGFuZ2UoKSAK
LXsKLSAgICBIYXNoU2V0PEVsZW1lbnQqPjo6aXRlcmF0b3IgZW5kID0gbV9tZWRpYVZvbHVtZUNh
bGxiYWNrRWxlbWVudHMuZW5kKCk7Ci0gICAgZm9yIChIYXNoU2V0PEVsZW1lbnQqPjo6aXRlcmF0
b3IgaSA9IG1fbWVkaWFWb2x1bWVDYWxsYmFja0VsZW1lbnRzLmJlZ2luKCk7IGkgIT0gZW5kOyAr
K2kpCi0gICAgICAgICgqaSktPm1lZGlhVm9sdW1lRGlkQ2hhbmdlKCk7Ci19Ci0KLXZvaWQgRG9j
dW1lbnQ6OnJlZ2lzdGVyRm9yTWVkaWFWb2x1bWVDYWxsYmFja3MoRWxlbWVudCogZSkKLXsKLSAg
ICBtX21lZGlhVm9sdW1lQ2FsbGJhY2tFbGVtZW50cy5hZGQoZSk7Ci19Ci0KLXZvaWQgRG9jdW1l
bnQ6OnVucmVnaXN0ZXJGb3JNZWRpYVZvbHVtZUNhbGxiYWNrcyhFbGVtZW50KiBlKQotewotICAg
IG1fbWVkaWFWb2x1bWVDYWxsYmFja0VsZW1lbnRzLnJlbW92ZShlKTsKLX0KLQotdm9pZCBEb2N1
bWVudDo6c3RvcmFnZUJsb2NraW5nU3RhdGVEaWRDaGFuZ2UoKQotewotICAgIGlmIChTZXR0aW5n
cyogc2V0dGluZ3MgPSB0aGlzLT5zZXR0aW5ncygpKQotICAgICAgICBzZWN1cml0eU9yaWdpbigp
LT5zZXRTdG9yYWdlQmxvY2tpbmdQb2xpY3koc2V0dGluZ3MtPnN0b3JhZ2VCbG9ja2luZ1BvbGlj
eSgpKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6cHJpdmF0ZUJyb3dzaW5nU3RhdGVEaWRDaGFuZ2Uo
KSAKLXsKLSAgICBIYXNoU2V0PEVsZW1lbnQqPjo6aXRlcmF0b3IgZW5kID0gbV9wcml2YXRlQnJv
d3NpbmdTdGF0ZUNoYW5nZWRFbGVtZW50cy5lbmQoKTsKLSAgICBmb3IgKEhhc2hTZXQ8RWxlbWVu
dCo+OjppdGVyYXRvciBpdCA9IG1fcHJpdmF0ZUJyb3dzaW5nU3RhdGVDaGFuZ2VkRWxlbWVudHMu
YmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KQotICAgICAgICAoKml0KS0+cHJpdmF0ZUJyb3dzaW5n
U3RhdGVEaWRDaGFuZ2UoKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6cmVnaXN0ZXJGb3JQcml2YXRl
QnJvd3NpbmdTdGF0ZUNoYW5nZWRDYWxsYmFja3MoRWxlbWVudCogZSkKLXsKLSAgICBtX3ByaXZh
dGVCcm93c2luZ1N0YXRlQ2hhbmdlZEVsZW1lbnRzLmFkZChlKTsKLX0KLQotdm9pZCBEb2N1bWVu
dDo6dW5yZWdpc3RlckZvclByaXZhdGVCcm93c2luZ1N0YXRlQ2hhbmdlZENhbGxiYWNrcyhFbGVt
ZW50KiBlKQotewotICAgIG1fcHJpdmF0ZUJyb3dzaW5nU3RhdGVDaGFuZ2VkRWxlbWVudHMucmVt
b3ZlKGUpOwotfQotCi12b2lkIERvY3VtZW50OjpzZXRTaG91bGRDcmVhdGVSZW5kZXJlcnMoYm9v
bCBmKQotewotICAgIG1fY3JlYXRlUmVuZGVyZXJzID0gZjsKLX0KLQotYm9vbCBEb2N1bWVudDo6
c2hvdWxkQ3JlYXRlUmVuZGVyZXJzKCkKLXsKLSAgICByZXR1cm4gbV9jcmVhdGVSZW5kZXJlcnM7
Ci19Ci0KLS8vIFN1cHBvcnQgZm9yIEphdmFzY3JpcHQgZXhlY0NvbW1hbmQsIGFuZCByZWxhdGVk
IG1ldGhvZHMKLQotc3RhdGljIEVkaXRvcjo6Q29tbWFuZCBjb21tYW5kKERvY3VtZW50KiBkb2N1
bWVudCwgY29uc3QgU3RyaW5nJiBjb21tYW5kTmFtZSwgYm9vbCB1c2VySW50ZXJmYWNlID0gZmFs
c2UpCi17Ci0gICAgRnJhbWUqIGZyYW1lID0gZG9jdW1lbnQtPmZyYW1lKCk7Ci0gICAgaWYgKCFm
cmFtZSB8fCBmcmFtZS0+ZG9jdW1lbnQoKSAhPSBkb2N1bWVudCkKLSAgICAgICAgcmV0dXJuIEVk
aXRvcjo6Q29tbWFuZCgpOwotCi0gICAgZG9jdW1lbnQtPnVwZGF0ZVN0eWxlSWZOZWVkZWQoKTsK
LQotICAgIHJldHVybiBmcmFtZS0+ZWRpdG9yKCktPmNvbW1hbmQoY29tbWFuZE5hbWUsCi0gICAg
ICAgIHVzZXJJbnRlcmZhY2UgPyBDb21tYW5kRnJvbURPTVdpdGhVc2VySW50ZXJmYWNlIDogQ29t
bWFuZEZyb21ET00pOwotfQotCi1ib29sIERvY3VtZW50OjpleGVjQ29tbWFuZChjb25zdCBTdHJp
bmcmIGNvbW1hbmROYW1lLCBib29sIHVzZXJJbnRlcmZhY2UsIGNvbnN0IFN0cmluZyYgdmFsdWUp
Ci17Ci0gICAgcmV0dXJuIGNvbW1hbmQodGhpcywgY29tbWFuZE5hbWUsIHVzZXJJbnRlcmZhY2Up
LmV4ZWN1dGUodmFsdWUpOwotfQotCi1ib29sIERvY3VtZW50OjpxdWVyeUNvbW1hbmRFbmFibGVk
KGNvbnN0IFN0cmluZyYgY29tbWFuZE5hbWUpCi17Ci0gICAgcmV0dXJuIGNvbW1hbmQodGhpcywg
Y29tbWFuZE5hbWUpLmlzRW5hYmxlZCgpOwotfQotCi1ib29sIERvY3VtZW50OjpxdWVyeUNvbW1h
bmRJbmRldGVybShjb25zdCBTdHJpbmcmIGNvbW1hbmROYW1lKQotewotICAgIHJldHVybiBjb21t
YW5kKHRoaXMsIGNvbW1hbmROYW1lKS5zdGF0ZSgpID09IE1peGVkVHJpU3RhdGU7Ci19Ci0KLWJv
b2wgRG9jdW1lbnQ6OnF1ZXJ5Q29tbWFuZFN0YXRlKGNvbnN0IFN0cmluZyYgY29tbWFuZE5hbWUp
Ci17Ci0gICAgcmV0dXJuIGNvbW1hbmQodGhpcywgY29tbWFuZE5hbWUpLnN0YXRlKCkgPT0gVHJ1
ZVRyaVN0YXRlOwotfQotCi1ib29sIERvY3VtZW50OjpxdWVyeUNvbW1hbmRTdXBwb3J0ZWQoY29u
c3QgU3RyaW5nJiBjb21tYW5kTmFtZSkKLXsKLSAgICByZXR1cm4gY29tbWFuZCh0aGlzLCBjb21t
YW5kTmFtZSkuaXNTdXBwb3J0ZWQoKTsKLX0KLQotU3RyaW5nIERvY3VtZW50OjpxdWVyeUNvbW1h
bmRWYWx1ZShjb25zdCBTdHJpbmcmIGNvbW1hbmROYW1lKQotewotICAgIHJldHVybiBjb21tYW5k
KHRoaXMsIGNvbW1hbmROYW1lKS52YWx1ZSgpOwotfQotCi1LVVJMIERvY3VtZW50OjpvcGVuU2Vh
cmNoRGVzY3JpcHRpb25VUkwoKQotewotICAgIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBvcGVu
U2VhcmNoTUlNRVR5cGUgPSAiYXBwbGljYXRpb24vb3BlbnNlYXJjaGRlc2NyaXB0aW9uK3htbCI7
Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IG9wZW5TZWFyY2hSZWxhdGlvbiA9ICJzZWFy
Y2giOwotCi0gICAgLy8gRklYTUU6IFdoeSBkbyBvbmx5IHRvcC1sZXZlbCBmcmFtZXMgaGF2ZSBv
cGVuU2VhcmNoRGVzY3JpcHRpb25VUkxzPwotICAgIGlmICghZnJhbWUoKSB8fCBmcmFtZSgpLT50
cmVlKCktPnBhcmVudCgpKQotICAgICAgICByZXR1cm4gS1VSTCgpOwotCi0gICAgLy8gRklYTUU6
IFdoeSBkbyB3ZSBuZWVkIHRvIHdhaXQgZm9yIEZyYW1lU3RhdGVDb21wbGV0ZT8KLSAgICBpZiAo
ZnJhbWUoKS0+bG9hZGVyKCktPnN0YXRlKCkgIT0gRnJhbWVTdGF0ZUNvbXBsZXRlKQotICAgICAg
ICByZXR1cm4gS1VSTCgpOwotCi0gICAgaWYgKCFoZWFkKCkpCi0gICAgICAgIHJldHVybiBLVVJM
KCk7Ci0KLSAgICBSZWZQdHI8SFRNTENvbGxlY3Rpb24+IGNoaWxkcmVuID0gaGVhZCgpLT5jaGls
ZHJlbigpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IE5vZGUqIGNoaWxkID0gY2hpbGRyZW4t
Pml0ZW0oaSk7IGkrKykgewotICAgICAgICBpZiAoIWNoaWxkLT5oYXNUYWdOYW1lKGxpbmtUYWcp
KQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIEhUTUxMaW5rRWxlbWVudCogbGlua0Vs
ZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MTGlua0VsZW1lbnQqPihjaGlsZCk7Ci0gICAgICAgIGlm
ICghZXF1YWxJZ25vcmluZ0Nhc2UobGlua0VsZW1lbnQtPnR5cGUoKSwgb3BlblNlYXJjaE1JTUVU
eXBlKSB8fCAhZXF1YWxJZ25vcmluZ0Nhc2UobGlua0VsZW1lbnQtPnJlbCgpLCBvcGVuU2VhcmNo
UmVsYXRpb24pKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGlmIChsaW5rRWxlbWVu
dC0+aHJlZigpLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICByZXR1
cm4gbGlua0VsZW1lbnQtPmhyZWYoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gS1VSTCgpOwotfQot
Ci0jaWYgRU5BQkxFKFhTTFQpCi0KLXZvaWQgRG9jdW1lbnQ6OmFwcGx5WFNMVHJhbnNmb3JtKFBy
b2Nlc3NpbmdJbnN0cnVjdGlvbiogcGkpCi17Ci0gICAgUmVmUHRyPFhTTFRQcm9jZXNzb3I+IHBy
b2Nlc3NvciA9IFhTTFRQcm9jZXNzb3I6OmNyZWF0ZSgpOwotICAgIHByb2Nlc3Nvci0+c2V0WFNM
U3R5bGVTaGVldChzdGF0aWNfY2FzdDxYU0xTdHlsZVNoZWV0Kj4ocGktPnNoZWV0KCkpKTsKLSAg
ICBTdHJpbmcgcmVzdWx0TUlNRVR5cGU7Ci0gICAgU3RyaW5nIG5ld1NvdXJjZTsKLSAgICBTdHJp
bmcgcmVzdWx0RW5jb2Rpbmc7Ci0gICAgaWYgKCFwcm9jZXNzb3ItPnRyYW5zZm9ybVRvU3RyaW5n
KHRoaXMsIHJlc3VsdE1JTUVUeXBlLCBuZXdTb3VyY2UsIHJlc3VsdEVuY29kaW5nKSkKLSAgICAg
ICAgcmV0dXJuOwotICAgIC8vIEZJWE1FOiBJZiB0aGUgdHJhbnNmb3JtIGZhaWxlZCB3ZSBzaG91
bGQgcHJvYmFibHkgcmVwb3J0IGFuIGVycm9yIChsaWtlIE1vemlsbGEgZG9lcykuCi0gICAgcHJv
Y2Vzc29yLT5jcmVhdGVEb2N1bWVudEZyb21Tb3VyY2UobmV3U291cmNlLCByZXN1bHRFbmNvZGlu
ZywgcmVzdWx0TUlNRVR5cGUsIHRoaXMsIGZyYW1lKCkpOwotfQotCi12b2lkIERvY3VtZW50Ojpz
ZXRUcmFuc2Zvcm1Tb3VyY2UoUGFzc093blB0cjxUcmFuc2Zvcm1Tb3VyY2U+IHNvdXJjZSkKLXsK
LSAgICBtX3RyYW5zZm9ybVNvdXJjZSA9IHNvdXJjZTsKLX0KLQotI2VuZGlmCi0KLXZvaWQgRG9j
dW1lbnQ6OnNldERlc2lnbk1vZGUoSW5oZXJpdGVkQm9vbCB2YWx1ZSkKLXsKLSAgICBtX2Rlc2ln
bk1vZGUgPSB2YWx1ZTsKLSAgICBmb3IgKEZyYW1lKiBmcmFtZSA9IG1fZnJhbWU7IGZyYW1lICYm
IGZyYW1lLT5kb2N1bWVudCgpOyBmcmFtZSA9IGZyYW1lLT50cmVlKCktPnRyYXZlcnNlTmV4dCht
X2ZyYW1lKSkKLSAgICAgICAgZnJhbWUtPmRvY3VtZW50KCktPnNjaGVkdWxlRm9yY2VkU3R5bGVS
ZWNhbGMoKTsKLX0KLQotRG9jdW1lbnQ6OkluaGVyaXRlZEJvb2wgRG9jdW1lbnQ6OmdldERlc2ln
bk1vZGUoKSBjb25zdAotewotICAgIHJldHVybiBtX2Rlc2lnbk1vZGU7Ci19Ci0KLWJvb2wgRG9j
dW1lbnQ6OmluRGVzaWduTW9kZSgpIGNvbnN0Ci17Ci0gICAgZm9yIChjb25zdCBEb2N1bWVudCog
ZCA9IHRoaXM7IGQ7IGQgPSBkLT5wYXJlbnREb2N1bWVudCgpKSB7Ci0gICAgICAgIGlmIChkLT5t
X2Rlc2lnbk1vZGUgIT0gaW5oZXJpdCkKLSAgICAgICAgICAgIHJldHVybiBkLT5tX2Rlc2lnbk1v
ZGU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotRG9jdW1lbnQqIERvY3VtZW50Ojpw
YXJlbnREb2N1bWVudCgpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX2ZyYW1lKQotICAgICAgICByZXR1
cm4gMDsKLSAgICBGcmFtZSogcGFyZW50ID0gbV9mcmFtZS0+dHJlZSgpLT5wYXJlbnQoKTsKLSAg
ICBpZiAoIXBhcmVudCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIHBhcmVudC0+ZG9j
dW1lbnQoKTsKLX0KLQotRG9jdW1lbnQqIERvY3VtZW50Ojp0b3BEb2N1bWVudCgpIGNvbnN0Ci17
Ci0gICAgRG9jdW1lbnQqIGRvYyA9IGNvbnN0X2Nhc3Q8RG9jdW1lbnQgKj4odGhpcyk7Ci0gICAg
RWxlbWVudCogZWxlbWVudDsKLSAgICB3aGlsZSAoKGVsZW1lbnQgPSBkb2MtPm93bmVyRWxlbWVu
dCgpKSkKLSAgICAgICAgZG9jID0gZWxlbWVudC0+ZG9jdW1lbnQoKTsKLSAgICAKLSAgICByZXR1
cm4gZG9jOwotfQotCi1QYXNzUmVmUHRyPEF0dHI+IERvY3VtZW50OjpjcmVhdGVBdHRyaWJ1dGUo
Y29uc3QgU3RyaW5nJiBuYW1lLCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICByZXR1cm4gY3Jl
YXRlQXR0cmlidXRlTlMoU3RyaW5nKCksIG5hbWUsIGVjLCB0cnVlKTsKLX0KLQotUGFzc1JlZlB0
cjxBdHRyPiBEb2N1bWVudDo6Y3JlYXRlQXR0cmlidXRlTlMoY29uc3QgU3RyaW5nJiBuYW1lc3Bh
Y2VVUkksIGNvbnN0IFN0cmluZyYgcXVhbGlmaWVkTmFtZSwgRXhjZXB0aW9uQ29kZSYgZWMsIGJv
b2wgc2hvdWxkSWdub3JlTmFtZXNwYWNlQ2hlY2tzKQotewotICAgIFN0cmluZyBwcmVmaXgsIGxv
Y2FsTmFtZTsKLSAgICBpZiAoIXBhcnNlUXVhbGlmaWVkTmFtZShxdWFsaWZpZWROYW1lLCBwcmVm
aXgsIGxvY2FsTmFtZSwgZWMpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIFF1YWxpZmllZE5h
bWUgcU5hbWUocHJlZml4LCBsb2NhbE5hbWUsIG5hbWVzcGFjZVVSSSk7Ci0KLSAgICBpZiAoIXNo
b3VsZElnbm9yZU5hbWVzcGFjZUNoZWNrcyAmJiAhaGFzVmFsaWROYW1lc3BhY2VGb3JBdHRyaWJ1
dGVzKHFOYW1lKSkgewotICAgICAgICBlYyA9IE5BTUVTUEFDRV9FUlI7Ci0gICAgICAgIHJldHVy
biAwOwotICAgIH0KLQotICAgIHJldHVybiBBdHRyOjpjcmVhdGUodGhpcywgcU5hbWUsIGVtcHR5
U3RyaW5nKCkpOwotfQotCi0jaWYgRU5BQkxFKFNWRykKLWNvbnN0IFNWR0RvY3VtZW50RXh0ZW5z
aW9ucyogRG9jdW1lbnQ6OnN2Z0V4dGVuc2lvbnMoKQotewotICAgIHJldHVybiBtX3N2Z0V4dGVu
c2lvbnMuZ2V0KCk7Ci19Ci0KLVNWR0RvY3VtZW50RXh0ZW5zaW9ucyogRG9jdW1lbnQ6OmFjY2Vz
c1NWR0V4dGVuc2lvbnMoKQotewotICAgIGlmICghbV9zdmdFeHRlbnNpb25zKQotICAgICAgICBt
X3N2Z0V4dGVuc2lvbnMgPSBhZG9wdFB0cihuZXcgU1ZHRG9jdW1lbnRFeHRlbnNpb25zKHRoaXMp
KTsKLSAgICByZXR1cm4gbV9zdmdFeHRlbnNpb25zLmdldCgpOwotfQotCi1ib29sIERvY3VtZW50
OjpoYXNTVkdSb290Tm9kZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGRvY3VtZW50RWxlbWVudCgp
ICYmIGRvY3VtZW50RWxlbWVudCgpLT5oYXNUYWdOYW1lKFNWR05hbWVzOjpzdmdUYWcpOwotfQot
I2VuZGlmCi0KLS8vIEZJWE1FOiBUaGlzIGNhY2hpbmcgbWVjaGFuaXNtIHNob3VsZCBiZSBtZXJn
ZWQgdGhhdCBvZiBEeW5hbWljTm9kZUxpc3QgaW4gTm9kZVJhcmVEYXRhLgotUGFzc1JlZlB0cjxI
VE1MQ29sbGVjdGlvbj4gRG9jdW1lbnQ6OmNhY2hlZENvbGxlY3Rpb24oQ29sbGVjdGlvblR5cGUg
dHlwZSkKLXsKLSAgICBBU1NFUlQoc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHR5cGUpIDwgTnVtVW5u
YW1lZERvY3VtZW50Q2FjaGVkVHlwZXMpOwotICAgIGlmIChtX2NvbGxlY3Rpb25zW3R5cGVdKQot
ICAgICAgICByZXR1cm4gbV9jb2xsZWN0aW9uc1t0eXBlXTsKLQotICAgIFJlZlB0cjxIVE1MQ29s
bGVjdGlvbj4gY29sbGVjdGlvbjsKLSAgICBpZiAodHlwZSA9PSBEb2NBbGwpCi0gICAgICAgIGNv
bGxlY3Rpb24gPSBIVE1MQWxsQ29sbGVjdGlvbjo6Y3JlYXRlKHRoaXMpOwotICAgIGVsc2UKLSAg
ICAgICAgY29sbGVjdGlvbiA9IEhUTUxDb2xsZWN0aW9uOjpjcmVhdGUodGhpcywgdHlwZSk7Ci0g
ICAgbV9jb2xsZWN0aW9uc1t0eXBlXSA9IGNvbGxlY3Rpb24uZ2V0KCk7Ci0KLSAgICByZXR1cm4g
Y29sbGVjdGlvbi5yZWxlYXNlKCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnJlbW92ZUNhY2hlZEhU
TUxDb2xsZWN0aW9uKEhUTUxDb2xsZWN0aW9uKiBjb2xsZWN0aW9uLCBDb2xsZWN0aW9uVHlwZSB0
eXBlKQotewotICAgIEFTU0VSVF9VTlVTRUQoY29sbGVjdGlvbiwgbV9jb2xsZWN0aW9uc1t0eXBl
XSA9PSBjb2xsZWN0aW9uKTsKLSAgICBtX2NvbGxlY3Rpb25zW3R5cGVdID0gMDsKLX0KLQotUGFz
c1JlZlB0cjxIVE1MQ29sbGVjdGlvbj4gRG9jdW1lbnQ6OmltYWdlcygpCi17Ci0gICAgcmV0dXJu
IGNhY2hlZENvbGxlY3Rpb24oRG9jSW1hZ2VzKTsKLX0KLQotUGFzc1JlZlB0cjxIVE1MQ29sbGVj
dGlvbj4gRG9jdW1lbnQ6OmFwcGxldHMoKQotewotICAgIHJldHVybiBjYWNoZWRDb2xsZWN0aW9u
KERvY0FwcGxldHMpOwotfQotCi1QYXNzUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBEb2N1bWVudDo6
ZW1iZWRzKCkKLXsKLSAgICByZXR1cm4gY2FjaGVkQ29sbGVjdGlvbihEb2NFbWJlZHMpOwotfQot
Ci1QYXNzUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBEb2N1bWVudDo6cGx1Z2lucygpCi17Ci0gICAg
Ly8gVGhpcyBpcyBhbiBhbGlhcyBmb3IgZW1iZWRzKCkgcmVxdWlyZWQgZm9yIHRoZSBKUyBET00g
YmluZGluZ3MuCi0gICAgcmV0dXJuIGNhY2hlZENvbGxlY3Rpb24oRG9jRW1iZWRzKTsKLX0KLQot
UGFzc1JlZlB0cjxIVE1MQ29sbGVjdGlvbj4gRG9jdW1lbnQ6Om9iamVjdHMoKQotewotICAgIHJl
dHVybiBjYWNoZWRDb2xsZWN0aW9uKERvY09iamVjdHMpOwotfQotCi1QYXNzUmVmUHRyPEhUTUxD
b2xsZWN0aW9uPiBEb2N1bWVudDo6c2NyaXB0cygpCi17Ci0gICAgcmV0dXJuIGNhY2hlZENvbGxl
Y3Rpb24oRG9jU2NyaXB0cyk7Ci19Ci0KLVBhc3NSZWZQdHI8SFRNTENvbGxlY3Rpb24+IERvY3Vt
ZW50OjpsaW5rcygpCi17Ci0gICAgcmV0dXJuIGNhY2hlZENvbGxlY3Rpb24oRG9jTGlua3MpOwot
fQotCi1QYXNzUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBEb2N1bWVudDo6Zm9ybXMoKQotewotICAg
IHJldHVybiBjYWNoZWRDb2xsZWN0aW9uKERvY0Zvcm1zKTsKLX0KLQotUGFzc1JlZlB0cjxIVE1M
Q29sbGVjdGlvbj4gRG9jdW1lbnQ6OmFuY2hvcnMoKQotewotICAgIHJldHVybiBjYWNoZWRDb2xs
ZWN0aW9uKERvY0FuY2hvcnMpOwotfQotCi1QYXNzUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBEb2N1
bWVudDo6YWxsKCkKLXsKLSAgICByZXR1cm4gY2FjaGVkQ29sbGVjdGlvbihEb2NBbGwpOwotfQot
Ci1QYXNzUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBEb2N1bWVudDo6d2luZG93TmFtZWRJdGVtcyhj
b25zdCBBdG9taWNTdHJpbmcmIG5hbWUpCi17Ci0gICAgTmFtZWRDb2xsZWN0aW9uTWFwOjpBZGRS
ZXN1bHQgcmVzdWx0ID0gbV93aW5kb3dOYW1lZEl0ZW1Db2xsZWN0aW9ucy5hZGQobmFtZSwgMCk7
Ci0gICAgaWYgKCFyZXN1bHQuaXNOZXdFbnRyeSkKLSAgICAgICAgcmV0dXJuIHJlc3VsdC5pdGVy
YXRvci0+c2Vjb25kOwotCi0gICAgUmVmUHRyPEhUTUxOYW1lQ29sbGVjdGlvbj4gY29sbGVjdGlv
biA9IEhUTUxOYW1lQ29sbGVjdGlvbjo6Y3JlYXRlKHRoaXMsIFdpbmRvd05hbWVkSXRlbXMsIG5h
bWUpOwotICAgIHJlc3VsdC5pdGVyYXRvci0+c2Vjb25kID0gY29sbGVjdGlvbi5nZXQoKTsKLSAg
ICByZXR1cm4gY29sbGVjdGlvbi5yZWxlYXNlKCk7Ci19Ci0KLVBhc3NSZWZQdHI8SFRNTENvbGxl
Y3Rpb24+IERvY3VtZW50Ojpkb2N1bWVudE5hbWVkSXRlbXMoY29uc3QgQXRvbWljU3RyaW5nJiBu
YW1lKQotewotICAgIE5hbWVkQ29sbGVjdGlvbk1hcDo6QWRkUmVzdWx0IHJlc3VsdCA9IG1fZG9j
dW1lbnROYW1lZEl0ZW1Db2xsZWN0aW9ucy5hZGQobmFtZSwgMCk7Ci0gICAgaWYgKCFyZXN1bHQu
aXNOZXdFbnRyeSkKLSAgICAgICAgcmV0dXJuIHJlc3VsdC5pdGVyYXRvci0+c2Vjb25kOwotCi0g
ICAgUmVmUHRyPEhUTUxOYW1lQ29sbGVjdGlvbj4gY29sbGVjdGlvbiA9IEhUTUxOYW1lQ29sbGVj
dGlvbjo6Y3JlYXRlKHRoaXMsIERvY3VtZW50TmFtZWRJdGVtcywgbmFtZSk7Ci0gICAgcmVzdWx0
Lml0ZXJhdG9yLT5zZWNvbmQgPSBjb2xsZWN0aW9uLmdldCgpOwotICAgIHJldHVybiBjb2xsZWN0
aW9uLnJlbGVhc2UoKTsKLX0KLQotLy8gRklYTUU6IFRoaXMgY2FjaGluZyBtZWNoYW5pc20gc2hv
dWxkIGJlIG1lcmdlZCB0aGF0IG9mIER5bmFtaWNOb2RlTGlzdCBpbiBOb2RlUmFyZURhdGEuCi12
b2lkIERvY3VtZW50OjpyZW1vdmVXaW5kb3dOYW1lZEl0ZW1DYWNoZShIVE1MQ29sbGVjdGlvbiog
Y29sbGVjdGlvbiwgY29uc3QgQXRvbWljU3RyaW5nJiBuYW1lKQotewotICAgIEFTU0VSVF9VTlVT
RUQoY29sbGVjdGlvbiwgbV93aW5kb3dOYW1lZEl0ZW1Db2xsZWN0aW9ucy5nZXQobmFtZSkgPT0g
Y29sbGVjdGlvbik7Ci0gICAgbV93aW5kb3dOYW1lZEl0ZW1Db2xsZWN0aW9ucy5yZW1vdmUobmFt
ZSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnJlbW92ZURvY3VtZW50TmFtZWRJdGVtQ2FjaGUoSFRN
TENvbGxlY3Rpb24qIGNvbGxlY3Rpb24sIGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSkKLXsKLSAg
ICBBU1NFUlRfVU5VU0VEKGNvbGxlY3Rpb24sIG1fZG9jdW1lbnROYW1lZEl0ZW1Db2xsZWN0aW9u
cy5nZXQobmFtZSkgPT0gY29sbGVjdGlvbik7Ci0gICAgbV9kb2N1bWVudE5hbWVkSXRlbUNvbGxl
Y3Rpb25zLnJlbW92ZShuYW1lKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6ZmluaXNoZWRQYXJzaW5n
KCkKLXsKLSAgICBBU1NFUlQoIXNjcmlwdGFibGVEb2N1bWVudFBhcnNlcigpIHx8ICFtX3BhcnNl
ci0+aXNQYXJzaW5nKCkpOwotICAgIEFTU0VSVCghc2NyaXB0YWJsZURvY3VtZW50UGFyc2VyKCkg
fHwgbV9yZWFkeVN0YXRlICE9IExvYWRpbmcpOwotICAgIHNldFBhcnNpbmcoZmFsc2UpOwotICAg
IGlmICghbV9kb2N1bWVudFRpbWluZy5kb21Db250ZW50TG9hZGVkRXZlbnRTdGFydCkKLSAgICAg
ICAgbV9kb2N1bWVudFRpbWluZy5kb21Db250ZW50TG9hZGVkRXZlbnRTdGFydCA9IG1vbm90b25p
Y2FsbHlJbmNyZWFzaW5nVGltZSgpOwotICAgIGRpc3BhdGNoRXZlbnQoRXZlbnQ6OmNyZWF0ZShl
dmVudE5hbWVzKCkuRE9NQ29udGVudExvYWRlZEV2ZW50LCB0cnVlLCBmYWxzZSkpOwotICAgIGlm
ICghbV9kb2N1bWVudFRpbWluZy5kb21Db250ZW50TG9hZGVkRXZlbnRFbmQpCi0gICAgICAgIG1f
ZG9jdW1lbnRUaW1pbmcuZG9tQ29udGVudExvYWRlZEV2ZW50RW5kID0gbW9ub3RvbmljYWxseUlu
Y3JlYXNpbmdUaW1lKCk7Ci0KLSAgICBpZiAoUmVmUHRyPEZyYW1lPiBmID0gZnJhbWUoKSkgewot
ICAgICAgICAvLyBGcmFtZUxvYWRlcjo6ZmluaXNoZWRQYXJzaW5nKCkgbWlnaHQgZW5kIHVwIGNh
bGxpbmcgRG9jdW1lbnQ6OmltcGxpY2l0Q2xvc2UoKSBpZiBhbGwKLSAgICAgICAgLy8gcmVzb3Vy
Y2UgbG9hZHMgYXJlIGNvbXBsZXRlLiBIVE1MT2JqZWN0RWxlbWVudHMgY2FuIHN0YXJ0IGxvYWRp
bmcgdGhlaXIgcmVzb3VyY2VzIGZyb20KLSAgICAgICAgLy8gcG9zdCBhdHRhY2ggY2FsbGJhY2tz
IHRyaWdnZXJlZCBieSByZWNhbGNTdHlsZSgpLiAgVGhpcyBtZWFucyBpZiB3ZSBwYXJzZSBvdXQg
YW4gPG9iamVjdD4KLSAgICAgICAgLy8gdGFnIGFuZCB0aGVuIHJlYWNoIHRoZSBlbmQgb2YgdGhl
IGRvY3VtZW50IHdpdGhvdXQgdXBkYXRpbmcgc3R5bGVzLCB3ZSBtaWdodCBub3QgaGF2ZSB5ZXQK
LSAgICAgICAgLy8gc3RhcnRlZCB0aGUgcmVzb3VyY2UgbG9hZCBhbmQgbWlnaHQgZmlyZSB0aGUg
d2luZG93IGxvYWQgZXZlbnQgdG9vIGVhcmx5LiAgVG8gYXZvaWQgdGhpcwotICAgICAgICAvLyB3
ZSBmb3JjZSB0aGUgc3R5bGVzIHRvIGJlIHVwIHRvIGRhdGUgYmVmb3JlIGNhbGxpbmcgRnJhbWVM
b2FkZXI6OmZpbmlzaGVkUGFyc2luZygpLgotICAgICAgICAvLyBTZWUgaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTM2ODY0IHN0YXJ0aW5nIGFyb3VuZCBjb21tZW50IDM1
LgotICAgICAgICB1cGRhdGVTdHlsZUlmTmVlZGVkKCk7Ci0KLSAgICAgICAgZi0+bG9hZGVyKCkt
PmZpbmlzaGVkUGFyc2luZygpOwotCi0gICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6
ZG9tQ29udGVudExvYWRlZEV2ZW50RmlyZWQoZi5nZXQoKSk7Ci0gICAgfQotCi0gICAgLy8gVGhl
IEVsZW1lbnRBdHRyaWJ1dGVEYXRhIHNoYXJpbmcgY2FjaGUgaXMgb25seSB1c2VkIGR1cmluZyBw
YXJzaW5nIHNpbmNlCi0gICAgLy8gdGhhdCdzIHdoZW4gdGhlIG1ham9yaXR5IG9mIGltbXV0YWJs
ZSBhdHRyaWJ1dGUgZGF0YSB3aWxsIGJlIGNyZWF0ZWQuCi0gICAgbV9pbW11dGFibGVBdHRyaWJ1
dGVEYXRhQ2FjaGUuY2xlYXIoKTsKLX0KLQotUGFzc1JlZlB0cjxYUGF0aEV4cHJlc3Npb24+IERv
Y3VtZW50OjpjcmVhdGVFeHByZXNzaW9uKGNvbnN0IFN0cmluZyYgZXhwcmVzc2lvbiwKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYUGF0aE5T
UmVzb2x2ZXIqIHJlc29sdmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIGlmICghbV94cGF0
aEV2YWx1YXRvcikKLSAgICAgICAgbV94cGF0aEV2YWx1YXRvciA9IFhQYXRoRXZhbHVhdG9yOjpj
cmVhdGUoKTsKLSAgICByZXR1cm4gbV94cGF0aEV2YWx1YXRvci0+Y3JlYXRlRXhwcmVzc2lvbihl
eHByZXNzaW9uLCByZXNvbHZlciwgZWMpOwotfQotCi1QYXNzUmVmUHRyPFhQYXRoTlNSZXNvbHZl
cj4gRG9jdW1lbnQ6OmNyZWF0ZU5TUmVzb2x2ZXIoTm9kZSogbm9kZVJlc29sdmVyKQotewotICAg
IGlmICghbV94cGF0aEV2YWx1YXRvcikKLSAgICAgICAgbV94cGF0aEV2YWx1YXRvciA9IFhQYXRo
RXZhbHVhdG9yOjpjcmVhdGUoKTsKLSAgICByZXR1cm4gbV94cGF0aEV2YWx1YXRvci0+Y3JlYXRl
TlNSZXNvbHZlcihub2RlUmVzb2x2ZXIpOwotfQotCi1QYXNzUmVmUHRyPFhQYXRoUmVzdWx0PiBE
b2N1bWVudDo6ZXZhbHVhdGUoY29uc3QgU3RyaW5nJiBleHByZXNzaW9uLAotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUqIGNvbnRleHROb2RlLAotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhQYXRoTlNSZXNvbHZlciogcmVz
b2x2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWdu
ZWQgc2hvcnQgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBYUGF0aFJlc3VsdCogcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIGlmICghbV94cGF0aEV2YWx1YXRv
cikKLSAgICAgICAgbV94cGF0aEV2YWx1YXRvciA9IFhQYXRoRXZhbHVhdG9yOjpjcmVhdGUoKTsK
LSAgICByZXR1cm4gbV94cGF0aEV2YWx1YXRvci0+ZXZhbHVhdGUoZXhwcmVzc2lvbiwgY29udGV4
dE5vZGUsIHJlc29sdmVyLCB0eXBlLCByZXN1bHQsIGVjKTsKLX0KLQotY29uc3QgVmVjdG9yPElj
b25VUkw+JiBEb2N1bWVudDo6aWNvblVSTHMoKQotewotICAgIG1faWNvblVSTHMuY2xlYXIoKTsK
LQotICAgIGlmICghaGVhZCgpIHx8ICEoaGVhZCgpLT5jaGlsZHJlbigpKSkKLSAgICAgICAgcmV0
dXJuIG1faWNvblVSTHM7Ci0KLSAgICAvLyBJbmNsdWRlIGFueSBpY29ucyB3aGVyZSB0eXBlID0g
bGluaywgcmVsID0gInNob3J0Y3V0IGljb24iLgotICAgIFJlZlB0cjxIVE1MQ29sbGVjdGlvbj4g
Y2hpbGRyZW4gPSBoZWFkKCktPmNoaWxkcmVuKCk7Ci0gICAgdW5zaWduZWQgaW50IGxlbmd0aCA9
IGNoaWxkcmVuLT5sZW5ndGgoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGxl
bmd0aDsgKytpKSB7Ci0gICAgICAgIE5vZGUqIGNoaWxkID0gY2hpbGRyZW4tPml0ZW0oaSk7Ci0g
ICAgICAgIGlmICghY2hpbGQtPmhhc1RhZ05hbWUobGlua1RhZykpCi0gICAgICAgICAgICBjb250
aW51ZTsKLSAgICAgICAgSFRNTExpbmtFbGVtZW50KiBsaW5rRWxlbWVudCA9IHN0YXRpY19jYXN0
PEhUTUxMaW5rRWxlbWVudCo+KGNoaWxkKTsKLSAgICAgICAgaWYgKGxpbmtFbGVtZW50LT5pY29u
VHlwZSgpICE9IEZhdmljb24pCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgaWYgKGxp
bmtFbGVtZW50LT5ocmVmKCkuaXNFbXB0eSgpKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAg
ICAgICAgLy8gUHV0IGl0IGF0IHRoZSBmcm9udCB0byBlbnN1cmUgdGhhdCBpY29ucyBzZWVuIGxh
dGVyIHRha2UgcHJlY2VkZW5jZSBhcyByZXF1aXJlZCBieSB0aGUgc3BlYy4KLSAgICAgICAgSWNv
blVSTCBuZXdVUkwobGlua0VsZW1lbnQtPmhyZWYoKSwgbGlua0VsZW1lbnQtPmljb25TaXplcygp
LCBsaW5rRWxlbWVudC0+dHlwZSgpLCBsaW5rRWxlbWVudC0+aWNvblR5cGUoKSk7Ci0gICAgICAg
IG1faWNvblVSTHMucHJlcGVuZChuZXdVUkwpOwotICAgIH0KLQotICAgIHJldHVybiBtX2ljb25V
UkxzOwotfQotCi12b2lkIERvY3VtZW50OjphZGRJY29uVVJMKGNvbnN0IFN0cmluZyYgdXJsLCBj
b25zdCBTdHJpbmcmIG1pbWVUeXBlLCBjb25zdCBTdHJpbmcmIHNpemVzLCBJY29uVHlwZSBpY29u
VHlwZSkKLXsKLSAgICBpZiAodXJsLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAg
Ly8gRklYTUUgLSA8cmRhcjovL3Byb2JsZW0vNDcyNzY0NT4gLSBBdCBzb21lIHBvaW50IGluIHRo
ZSBmdXR1cmUsIHdlIG1pZ2h0IGFjdHVhbGx5IGhvbm9yIHRoZSAibWltZVR5cGUiCi0gICAgSWNv
blVSTCBuZXdVUkwoS1VSTChQYXJzZWRVUkxTdHJpbmcsIHVybCksIHNpemVzLCBtaW1lVHlwZSwg
aWNvblR5cGUpOwotCi0gICAgaWYgKEZyYW1lKiBmID0gZnJhbWUoKSkgewotICAgICAgICBJY29u
VVJMIGljb25VUkwgPSBmLT5sb2FkZXIoKS0+aWNvbigpLT5pY29uVVJMKGljb25UeXBlKTsKLSAg
ICAgICAgaWYgKGljb25VUkwgPT0gbmV3VVJMKQotICAgICAgICAgICAgZi0+bG9hZGVyKCktPmRp
ZENoYW5nZUljb25zKGljb25UeXBlKTsKLSAgICB9Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnNldFVz
ZVNlY3VyZUtleWJvYXJkRW50cnlXaGVuQWN0aXZlKGJvb2wgdXNlc1NlY3VyZUtleWJvYXJkKQot
ewotICAgIGlmIChtX3VzZVNlY3VyZUtleWJvYXJkRW50cnlXaGVuQWN0aXZlID09IHVzZXNTZWN1
cmVLZXlib2FyZCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV91c2VTZWN1cmVLZXlib2FyZEVu
dHJ5V2hlbkFjdGl2ZSA9IHVzZXNTZWN1cmVLZXlib2FyZDsKLSAgICBtX2ZyYW1lLT5zZWxlY3Rp
b24oKS0+dXBkYXRlU2VjdXJlS2V5Ym9hcmRFbnRyeUlmQWN0aXZlKCk7Ci19Ci0KLWJvb2wgRG9j
dW1lbnQ6OnVzZVNlY3VyZUtleWJvYXJkRW50cnlXaGVuQWN0aXZlKCkgY29uc3QKLXsKLSAgICBy
ZXR1cm4gbV91c2VTZWN1cmVLZXlib2FyZEVudHJ5V2hlbkFjdGl2ZTsKLX0KLQotc3RhdGljIGJv
b2wgaXNFbGlnaWJsZUZvclNlYW1sZXNzKERvY3VtZW50KiBwYXJlbnQsIERvY3VtZW50KiBjaGls
ZCkKLXsKLSAgICAvLyBJdCBzaG91bGQgbm90IG1hdHRlciB3aGF0IHdlIHJldHVybiBmb3IgdGhl
IHRvcC1tb3N0IGRvY3VtZW50LgotICAgIGlmICghcGFyZW50KQotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0gICAgaWYgKHBhcmVudC0+aXNTYW5kYm94ZWQoU2FuZGJveFNlYW1sZXNzSWZyYW1lcykp
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoY2hpbGQtPmlzU3JjZG9jRG9jdW1lbnQo
KSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgaWYgKHBhcmVudC0+c2VjdXJpdHlPcmlnaW4o
KS0+Y2FuQWNjZXNzKGNoaWxkLT5zZWN1cml0eU9yaWdpbigpKSkKLSAgICAgICAgcmV0dXJuIHRy
dWU7Ci0gICAgcmV0dXJuIHBhcmVudC0+c2VjdXJpdHlPcmlnaW4oKS0+Y2FuUmVxdWVzdChjaGls
ZC0+dXJsKCkpOwotfQotCi12b2lkIERvY3VtZW50Ojppbml0U2VjdXJpdHlDb250ZXh0KCkKLXsK
LSAgICBpZiAoaGF2ZUluaXRpYWxpemVkU2VjdXJpdHlPcmlnaW4oKSkgewotICAgICAgICBBU1NF
UlQoc2VjdXJpdHlPcmlnaW4oKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAo
IW1fZnJhbWUpIHsKLSAgICAgICAgLy8gTm8gc291cmNlIGZvciBhIHNlY3VyaXR5IGNvbnRleHQu
Ci0gICAgICAgIC8vIFRoaXMgY2FuIG9jY3VyIHZpYSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5j
cmVhdGVEb2N1bWVudCgpLgotICAgICAgICBtX2Nvb2tpZVVSTCA9IEtVUkwoUGFyc2VkVVJMU3Ry
aW5nLCBlbXB0eVN0cmluZygpKTsKLSAgICAgICAgc2V0U2VjdXJpdHlPcmlnaW4oU2VjdXJpdHlP
cmlnaW46OmNyZWF0ZVVuaXF1ZSgpKTsKLSAgICAgICAgc2V0Q29udGVudFNlY3VyaXR5UG9saWN5
KENvbnRlbnRTZWN1cml0eVBvbGljeTo6Y3JlYXRlKHRoaXMpKTsKLSAgICAgICAgcmV0dXJuOwot
ICAgIH0KLQotICAgIC8vIEluIHRoZSBjb21tb24gY2FzZSwgY3JlYXRlIHRoZSBzZWN1cml0eSBj
b250ZXh0IGZyb20gdGhlIGN1cnJlbnRseQotICAgIC8vIGxvYWRpbmcgVVJMIHdpdGggYSBmcmVz
aCBjb250ZW50IHNlY3VyaXR5IHBvbGljeS4KLSAgICBtX2Nvb2tpZVVSTCA9IG1fdXJsOwotICAg
IGVuZm9yY2VTYW5kYm94RmxhZ3MobV9mcmFtZS0+bG9hZGVyKCktPmVmZmVjdGl2ZVNhbmRib3hG
bGFncygpKTsKLSAgICBzZXRTZWN1cml0eU9yaWdpbihpc1NhbmRib3hlZChTYW5kYm94T3JpZ2lu
KSA/IFNlY3VyaXR5T3JpZ2luOjpjcmVhdGVVbmlxdWUoKSA6IFNlY3VyaXR5T3JpZ2luOjpjcmVh
dGUobV91cmwpKTsKLSAgICBzZXRDb250ZW50U2VjdXJpdHlQb2xpY3koQ29udGVudFNlY3VyaXR5
UG9saWN5OjpjcmVhdGUodGhpcykpOwotCi0gICAgaWYgKFNlY3VyaXR5UG9saWN5OjphbGxvd1N1
YnN0aXR1dGVEYXRhQWNjZXNzVG9Mb2NhbCgpKSB7Ci0gICAgICAgIC8vIElmIHRoaXMgZG9jdW1l
bnQgd2FzIGxvYWRlZCB3aXRoIHN1YnN0aXR1dGVEYXRhLCB0aGVuIHRoZSBkb2N1bWVudCBjYW4K
LSAgICAgICAgLy8gbG9hZCBsb2NhbCByZXNvdXJjZXMuICBTZWUgaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTE2NzU2Ci0gICAgICAgIC8vIGFuZCBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTk3NjAgZm9yIGZ1cnRoZXIKLSAgICAgICAgLy8g
ZGlzY3Vzc2lvbi4KLSAgICAgICAgCi0gICAgICAgIERvY3VtZW50TG9hZGVyKiBkb2N1bWVudExv
YWRlciA9IGxvYWRlcigpOwotICAgICAgICBpZiAoZG9jdW1lbnRMb2FkZXIgJiYgZG9jdW1lbnRM
b2FkZXItPnN1YnN0aXR1dGVEYXRhKCkuaXNWYWxpZCgpKQotICAgICAgICAgICAgc2VjdXJpdHlP
cmlnaW4oKS0+Z3JhbnRMb2FkTG9jYWxSZXNvdXJjZXMoKTsKLSAgICB9Ci0KLSAgICBpZiAoU2V0
dGluZ3MqIHNldHRpbmdzID0gdGhpcy0+c2V0dGluZ3MoKSkgewotICAgICAgICBpZiAoIXNldHRp
bmdzLT5pc1dlYlNlY3VyaXR5RW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAvLyBXZWIgc2VjdXJp
dHkgaXMgdHVybmVkIG9mZi4gV2Ugc2hvdWxkIGxldCB0aGlzIGRvY3VtZW50IGFjY2VzcyBldmVy
eSBvdGhlciBkb2N1bWVudC4gVGhpcyBpcyB1c2VkIHByaW1hcnkgYnkgdGVzdGluZwotICAgICAg
ICAgICAgLy8gaGFybmVzc2VzIGZvciB3ZWIgc2l0ZXMuCi0gICAgICAgICAgICBzZWN1cml0eU9y
aWdpbigpLT5ncmFudFVuaXZlcnNhbEFjY2VzcygpOwotICAgICAgICB9IGVsc2UgaWYgKHNlY3Vy
aXR5T3JpZ2luKCktPmlzTG9jYWwoKSkgewotICAgICAgICAgICAgaWYgKHNldHRpbmdzLT5hbGxv
d1VuaXZlcnNhbEFjY2Vzc0Zyb21GaWxlVVJMcygpIHx8IG1fZnJhbWUtPmxvYWRlcigpLT5jbGll
bnQoKS0+c2hvdWxkRm9yY2VVbml2ZXJzYWxBY2Nlc3NGcm9tTG9jYWxVUkwobV91cmwpKSB7Ci0g
ICAgICAgICAgICAgICAgLy8gU29tZSBjbGllbnRzIHdhbnQgbG9jYWwgVVJMcyB0byBoYXZlIHVu
aXZlcnNhbCBhY2Nlc3MsIGJ1dCB0aGF0IHNldHRpbmcgaXMgZGFuZ2Vyb3VzIGZvciBvdGhlciBj
bGllbnRzLgotICAgICAgICAgICAgICAgIHNlY3VyaXR5T3JpZ2luKCktPmdyYW50VW5pdmVyc2Fs
QWNjZXNzKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzZXR0aW5ncy0+YWxsb3dGaWxlQWNj
ZXNzRnJvbUZpbGVVUkxzKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBTb21lIGNsaWVudHMgd2Fu
dCBsb2NhbCBVUkxzIHRvIGhhdmUgZXZlbiB0aWdodGVyIHJlc3RyaWN0aW9ucyBieSBkZWZhdWx0
LCBhbmQgbm90IGJlIGFibGUgdG8gYWNjZXNzIG90aGVyIGxvY2FsIGZpbGVzLgotICAgICAgICAg
ICAgICAgIC8vIEZJWE1FIDgxNTc4OiBUaGUgbmFtaW5nIG9mIHRoaXMgaXMgY29uZnVzaW5nLiBG
aWxlcyB3aXRoIHJlc3RyaWN0ZWQgYWNjZXNzIHRvIG90aGVyIGxvY2FsIGZpbGVzCi0gICAgICAg
ICAgICAgICAgLy8gc3RpbGwgY2FuIGhhdmUgb3RoZXIgcHJpdmlsZWdlcyB0aGF0IGNhbiBiZSBy
ZW1lbWJlcmVkLCB0aGVyZWJ5IG5vdCBtYWtpbmcgdGhlbSB1bmlxdWUgb3JpZ2lucy4KLSAgICAg
ICAgICAgICAgICBzZWN1cml0eU9yaWdpbigpLT5lbmZvcmNlRmlsZVBhdGhTZXBhcmF0aW9uKCk7
Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc2VjdXJpdHlPcmlnaW4oKS0+c2V0
U3RvcmFnZUJsb2NraW5nUG9saWN5KHNldHRpbmdzLT5zdG9yYWdlQmxvY2tpbmdQb2xpY3koKSk7
Ci0gICAgfQotCi0gICAgRG9jdW1lbnQqIHBhcmVudERvY3VtZW50ID0gb3duZXJFbGVtZW50KCkg
PyBvd25lckVsZW1lbnQoKS0+ZG9jdW1lbnQoKSA6IDA7Ci0gICAgaWYgKHBhcmVudERvY3VtZW50
ICYmIG1fZnJhbWUtPmxvYWRlcigpLT5zaG91bGRUcmVhdFVSTEFzU3JjZG9jRG9jdW1lbnQodXJs
KCkpKSB7Ci0gICAgICAgIG1faXNTcmNkb2NEb2N1bWVudCA9IHRydWU7Ci0gICAgICAgIHNldEJh
c2VVUkxPdmVycmlkZShwYXJlbnREb2N1bWVudC0+YmFzZVVSTCgpKTsKLSAgICB9Ci0KLSAgICAv
LyBGSVhNRTogV2hhdCBoYXBwZW5zIGlmIHdlIGluaGVyaXQgdGhlIHNlY3VyaXR5IG9yaWdpbj8g
VGhpcyBjaGVjayBtYXkgbmVlZCB0byBiZSBsYXRlci4KLSAgICAvLyA8aWZyYW1lIHNlYW1sZXNz
IHNyYz0iYWJvdXQ6YmxhbmsiPiBsaWtlbHkgd29uJ3Qgd29yayBhcy1pcy4KLSAgICBtX21heURp
c3BsYXlTZWFtbGVzc1dpdGhQYXJlbnQgPSBpc0VsaWdpYmxlRm9yU2VhbWxlc3MocGFyZW50RG9j
dW1lbnQsIHRoaXMpOwotCi0gICAgaWYgKCFzaG91bGRJbmhlcml0U2VjdXJpdHlPcmlnaW5Gcm9t
T3duZXIobV91cmwpKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBJZiB3ZSBkbyBub3Qgb2J0
YWluIGEgbWVhbmluZ2Z1bCBvcmlnaW4gZnJvbSB0aGUgVVJMLCB0aGVuIHdlIHRyeSB0bwotICAg
IC8vIGZpbmQgb25lIHZpYSB0aGUgZnJhbWUgaGllcmFyY2h5LgotCi0gICAgRnJhbWUqIG93bmVy
RnJhbWUgPSBtX2ZyYW1lLT50cmVlKCktPnBhcmVudCgpOwotICAgIGlmICghb3duZXJGcmFtZSkK
LSAgICAgICAgb3duZXJGcmFtZSA9IG1fZnJhbWUtPmxvYWRlcigpLT5vcGVuZXIoKTsKLQotICAg
IGlmICghb3duZXJGcmFtZSkgewotICAgICAgICBkaWRGYWlsVG9Jbml0aWFsaXplU2VjdXJpdHlP
cmlnaW4oKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChpc1NhbmRib3hlZChT
YW5kYm94T3JpZ2luKSkgewotICAgICAgICAvLyBJZiB3ZSdyZSBzdXBwb3NlZCB0byBpbmhlcml0
IG91ciBzZWN1cml0eSBvcmlnaW4gZnJvbSBvdXIgb3duZXIsCi0gICAgICAgIC8vIGJ1dCB3ZSdy
ZSBhbHNvIHNhbmRib3hlZCwgdGhlIG9ubHkgdGhpbmcgd2UgaW5oZXJpdCBpcyB0aGUgYWJpbGl0
eQotICAgICAgICAvLyB0byBsb2FkIGxvY2FsIHJlc291cmNlcy4gVGhpcyBsZXRzIGFib3V0OmJs
YW5rIGlmcmFtZXMgaW4gZmlsZTovLwotICAgICAgICAvLyBVUkwgZG9jdW1lbnRzIGxvYWQgaW1h
Z2VzIGFuZCBvdGhlciByZXNvdXJjZXMgZnJvbSB0aGUgZmlsZSBzeXN0ZW0uCi0gICAgICAgIGlm
IChvd25lckZyYW1lLT5kb2N1bWVudCgpLT5zZWN1cml0eU9yaWdpbigpLT5jYW5Mb2FkTG9jYWxS
ZXNvdXJjZXMoKSkKLSAgICAgICAgICAgIHNlY3VyaXR5T3JpZ2luKCktPmdyYW50TG9hZExvY2Fs
UmVzb3VyY2VzKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtX2Nvb2tpZVVSTCA9
IG93bmVyRnJhbWUtPmRvY3VtZW50KCktPmNvb2tpZVVSTCgpOwotICAgIC8vIFdlIGFsaWFzIHRo
ZSBTZWN1cml0eU9yaWdpbnMgdG8gbWF0Y2ggRmlyZWZveCwgc2VlIEJ1ZyAxNTMxMwotICAgIC8v
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTMxMwotICAgIHNldFNl
Y3VyaXR5T3JpZ2luKG93bmVyRnJhbWUtPmRvY3VtZW50KCktPnNlY3VyaXR5T3JpZ2luKCkpOwot
fQotCi12b2lkIERvY3VtZW50Ojppbml0Q29udGVudFNlY3VyaXR5UG9saWN5KCkKLXsKLSAgICBp
ZiAoIW1fZnJhbWUtPnRyZWUoKS0+cGFyZW50KCkgfHwgKCFzaG91bGRJbmhlcml0U2VjdXJpdHlP
cmlnaW5Gcm9tT3duZXIobV91cmwpICYmICFpc1BsdWdpbkRvY3VtZW50KCkpKQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBjb250ZW50U2VjdXJpdHlQb2xpY3koKS0+Y29weVN0YXRlRnJvbShtX2Zy
YW1lLT50cmVlKCktPnBhcmVudCgpLT5kb2N1bWVudCgpLT5jb250ZW50U2VjdXJpdHlQb2xpY3ko
KSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmRpZFVwZGF0ZVNlY3VyaXR5T3JpZ2luKCkKLXsKLSAg
ICBpZiAoIW1fZnJhbWUpCi0gICAgICAgIHJldHVybjsKLSAgICBtX2ZyYW1lLT5zY3JpcHQoKS0+
dXBkYXRlU2VjdXJpdHlPcmlnaW4oKTsKLX0KLQotYm9vbCBEb2N1bWVudDo6aXNDb250ZXh0VGhy
ZWFkKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaXNNYWluVGhyZWFkKCk7Ci19Ci0KLXZvaWQgRG9j
dW1lbnQ6OnVwZGF0ZVVSTEZvclB1c2hPclJlcGxhY2VTdGF0ZShjb25zdCBLVVJMJiB1cmwpCi17
Ci0gICAgRnJhbWUqIGYgPSBmcmFtZSgpOwotICAgIGlmICghZikKLSAgICAgICAgcmV0dXJuOwot
Ci0gICAgc2V0VVJMKHVybCk7Ci0gICAgZi0+bG9hZGVyKCktPnNldE91dGdvaW5nUmVmZXJyZXIo
dXJsKTsKLQotICAgIGlmIChEb2N1bWVudExvYWRlciogZG9jdW1lbnRMb2FkZXIgPSBsb2FkZXIo
KSkKLSAgICAgICAgZG9jdW1lbnRMb2FkZXItPnJlcGxhY2VSZXF1ZXN0VVJMRm9yU2FtZURvY3Vt
ZW50TmF2aWdhdGlvbih1cmwpOwotfQotCi12b2lkIERvY3VtZW50OjpzdGF0ZVBvcHBlZChQYXNz
UmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gc3RhdGVPYmplY3QpCi17Ci0gICAgaWYgKCFm
cmFtZSgpKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgLy8gUGVyIHN0ZXAgMTEgb2Ygc2Vj
dGlvbiA2LjUuOSAoaGlzdG9yeSB0cmF2ZXJzYWwpIG9mIHRoZSBIVE1MNSBzcGVjLCB3ZSAKLSAg
ICAvLyBkZWZlciBmaXJpbmcgb2YgcG9wc3RhdGUgdW50aWwgd2UncmUgaW4gdGhlIGNvbXBsZXRl
IHN0YXRlLgotICAgIGlmIChtX3JlYWR5U3RhdGUgPT0gQ29tcGxldGUpCi0gICAgICAgIGVucXVl
dWVQb3BzdGF0ZUV2ZW50KHN0YXRlT2JqZWN0KTsKLSAgICBlbHNlCi0gICAgICAgIG1fcGVuZGlu
Z1N0YXRlT2JqZWN0ID0gc3RhdGVPYmplY3Q7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnVwZGF0ZUZv
Y3VzQXBwZWFyYW5jZVNvb24oYm9vbCByZXN0b3JlUHJldmlvdXNTZWxlY3Rpb24pCi17Ci0gICAg
bV91cGRhdGVGb2N1c0FwcGVhcmFuY2VSZXN0b3Jlc1NlbGVjdGlvbiA9IHJlc3RvcmVQcmV2aW91
c1NlbGVjdGlvbjsKLSAgICBpZiAoIW1fdXBkYXRlRm9jdXNBcHBlYXJhbmNlVGltZXIuaXNBY3Rp
dmUoKSkKLSAgICAgICAgbV91cGRhdGVGb2N1c0FwcGVhcmFuY2VUaW1lci5zdGFydE9uZVNob3Qo
MCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmNhbmNlbEZvY3VzQXBwZWFyYW5jZVVwZGF0ZSgpCi17
Ci0gICAgbV91cGRhdGVGb2N1c0FwcGVhcmFuY2VUaW1lci5zdG9wKCk7Ci19Ci0KLXZvaWQgRG9j
dW1lbnQ6OnVwZGF0ZUZvY3VzQXBwZWFyYW5jZVRpbWVyRmlyZWQoVGltZXI8RG9jdW1lbnQ+KikK
LXsKLSAgICBOb2RlKiBub2RlID0gZm9jdXNlZE5vZGUoKTsKLSAgICBpZiAoIW5vZGUpCi0gICAg
ICAgIHJldHVybjsKLSAgICBpZiAoIW5vZGUtPmlzRWxlbWVudE5vZGUoKSkKLSAgICAgICAgcmV0
dXJuOwotCi0gICAgdXBkYXRlTGF5b3V0KCk7Ci0KLSAgICBFbGVtZW50KiBlbGVtZW50ID0gc3Rh
dGljX2Nhc3Q8RWxlbWVudCo+KG5vZGUpOwotICAgIGlmIChlbGVtZW50LT5pc0ZvY3VzYWJsZSgp
KQotICAgICAgICBlbGVtZW50LT51cGRhdGVGb2N1c0FwcGVhcmFuY2UobV91cGRhdGVGb2N1c0Fw
cGVhcmFuY2VSZXN0b3Jlc1NlbGVjdGlvbik7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmF0dGFjaFJh
bmdlKFJhbmdlKiByYW5nZSkKLXsKLSAgICBBU1NFUlQoIW1fcmFuZ2VzLmNvbnRhaW5zKHJhbmdl
KSk7Ci0gICAgbV9yYW5nZXMuYWRkKHJhbmdlKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6ZGV0YWNo
UmFuZ2UoUmFuZ2UqIHJhbmdlKQotewotICAgIC8vIFdlIGRvbid0IEFTU0VSVCBtX3Jhbmdlcy5j
b250YWlucyhyYW5nZSkgdG8gYWxsb3cgdXMgdG8gY2FsbCB0aGlzCi0gICAgLy8gdW5jb25kaXRp
b25hbGx5IHRvIGZpeDogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI2
MDQ0Ci0gICAgbV9yYW5nZXMucmVtb3ZlKHJhbmdlKTsKLX0KLQotQ2FudmFzUmVuZGVyaW5nQ29u
dGV4dCogRG9jdW1lbnQ6OmdldENTU0NhbnZhc0NvbnRleHQoY29uc3QgU3RyaW5nJiB0eXBlLCBj
b25zdCBTdHJpbmcmIG5hbWUsIGludCB3aWR0aCwgaW50IGhlaWdodCkKLXsKLSAgICBIVE1MQ2Fu
dmFzRWxlbWVudCogZWxlbWVudCA9IGdldENTU0NhbnZhc0VsZW1lbnQobmFtZSk7Ci0gICAgaWYg
KCFlbGVtZW50KQotICAgICAgICByZXR1cm4gMDsKLSAgICBlbGVtZW50LT5zZXRTaXplKEludFNp
emUod2lkdGgsIGhlaWdodCkpOwotICAgIHJldHVybiBlbGVtZW50LT5nZXRDb250ZXh0KHR5cGUp
OwotfQotCi1IVE1MQ2FudmFzRWxlbWVudCogRG9jdW1lbnQ6OmdldENTU0NhbnZhc0VsZW1lbnQo
Y29uc3QgU3RyaW5nJiBuYW1lKQotewotICAgIFJlZlB0cjxIVE1MQ2FudmFzRWxlbWVudD4mIGVs
ZW1lbnQgPSBtX2Nzc0NhbnZhc0VsZW1lbnRzLmFkZChuYW1lLCAwKS5pdGVyYXRvci0+c2Vjb25k
OwotICAgIGlmICghZWxlbWVudCkKLSAgICAgICAgZWxlbWVudCA9IEhUTUxDYW52YXNFbGVtZW50
OjpjcmVhdGUodGhpcyk7Ci0gICAgcmV0dXJuIGVsZW1lbnQuZ2V0KCk7Ci19Ci0KLXZvaWQgRG9j
dW1lbnQ6OmluaXRETlNQcmVmZXRjaCgpCi17Ci0gICAgU2V0dGluZ3MqIHNldHRpbmdzID0gdGhp
cy0+c2V0dGluZ3MoKTsKLQotICAgIG1faGF2ZUV4cGxpY2l0bHlEaXNhYmxlZEROU1ByZWZldGNo
ID0gZmFsc2U7Ci0gICAgbV9pc0ROU1ByZWZldGNoRW5hYmxlZCA9IHNldHRpbmdzICYmIHNldHRp
bmdzLT5kbnNQcmVmZXRjaGluZ0VuYWJsZWQoKSAmJiBzZWN1cml0eU9yaWdpbigpLT5wcm90b2Nv
bCgpID09ICJodHRwIjsKLQotICAgIC8vIEluaGVyaXQgRE5TIHByZWZldGNoIG9wdC1vdXQgZnJv
bSBwYXJlbnQgZnJhbWUgICAgCi0gICAgaWYgKERvY3VtZW50KiBwYXJlbnQgPSBwYXJlbnREb2N1
bWVudCgpKSB7Ci0gICAgICAgIGlmICghcGFyZW50LT5pc0ROU1ByZWZldGNoRW5hYmxlZCgpKQot
ICAgICAgICAgICAgbV9pc0ROU1ByZWZldGNoRW5hYmxlZCA9IGZhbHNlOwotICAgIH0KLX0KLQot
dm9pZCBEb2N1bWVudDo6cGFyc2VETlNQcmVmZXRjaENvbnRyb2xIZWFkZXIoY29uc3QgU3RyaW5n
JiBkbnNQcmVmZXRjaENvbnRyb2wpCi17Ci0gICAgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGRuc1By
ZWZldGNoQ29udHJvbCwgIm9uIikgJiYgIW1faGF2ZUV4cGxpY2l0bHlEaXNhYmxlZEROU1ByZWZl
dGNoKSB7Ci0gICAgICAgIG1faXNETlNQcmVmZXRjaEVuYWJsZWQgPSB0cnVlOwotICAgICAgICBy
ZXR1cm47Ci0gICAgfQotCi0gICAgbV9pc0ROU1ByZWZldGNoRW5hYmxlZCA9IGZhbHNlOwotICAg
IG1faGF2ZUV4cGxpY2l0bHlEaXNhYmxlZEROU1ByZWZldGNoID0gdHJ1ZTsKLX0KLQotdm9pZCBE
b2N1bWVudDo6YWRkTWVzc2FnZShNZXNzYWdlU291cmNlIHNvdXJjZSwgTWVzc2FnZVR5cGUgdHlw
ZSwgTWVzc2FnZUxldmVsIGxldmVsLCBjb25zdCBTdHJpbmcmIG1lc3NhZ2UsIGNvbnN0IFN0cmlu
ZyYgc291cmNlVVJMLCB1bnNpZ25lZCBsaW5lTnVtYmVyLCBQYXNzUmVmUHRyPFNjcmlwdENhbGxT
dGFjaz4gY2FsbFN0YWNrKQotewotICAgIGlmICghaXNDb250ZXh0VGhyZWFkKCkpIHsKLSAgICAg
ICAgcG9zdFRhc2soQWRkQ29uc29sZU1lc3NhZ2VUYXNrOjpjcmVhdGUoc291cmNlLCB0eXBlLCBs
ZXZlbCwgbWVzc2FnZSkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKERPTVdp
bmRvdyogd2luZG93ID0gZG9tV2luZG93KCkpCi0gICAgICAgIHdpbmRvdy0+Y29uc29sZSgpLT5h
ZGRNZXNzYWdlKHNvdXJjZSwgdHlwZSwgbGV2ZWwsIG1lc3NhZ2UsIHNvdXJjZVVSTCwgbGluZU51
bWJlciwgY2FsbFN0YWNrKTsKLX0KLQotc3RydWN0IFBlcmZvcm1UYXNrQ29udGV4dCB7Ci0gICAg
V1RGX01BS0VfTk9OQ09QWUFCTEUoUGVyZm9ybVRhc2tDb250ZXh0KTsgV1RGX01BS0VfRkFTVF9B
TExPQ0FURUQ7Ci1wdWJsaWM6Ci0gICAgUGVyZm9ybVRhc2tDb250ZXh0KFBhc3NSZWZQdHI8RG9j
dW1lbnRXZWFrUmVmZXJlbmNlPiBkb2N1bWVudFJlZmVyZW5jZSwgUGFzc093blB0cjxTY3JpcHRF
eGVjdXRpb25Db250ZXh0OjpUYXNrPiB0YXNrKQotICAgICAgICA6IGRvY3VtZW50UmVmZXJlbmNl
KGRvY3VtZW50UmVmZXJlbmNlKQotICAgICAgICAsIHRhc2sodGFzaykKLSAgICB7Ci0gICAgfQot
Ci0gICAgUmVmUHRyPERvY3VtZW50V2Vha1JlZmVyZW5jZT4gZG9jdW1lbnRSZWZlcmVuY2U7Ci0g
ICAgT3duUHRyPFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQ6OlRhc2s+IHRhc2s7Ci19OwotCi12b2lk
IERvY3VtZW50OjpkaWRSZWNlaXZlVGFzayh2b2lkKiB1bnR5cGVkQ29udGV4dCkKLXsKLSAgICBB
U1NFUlQoaXNNYWluVGhyZWFkKCkpOwotCi0gICAgT3duUHRyPFBlcmZvcm1UYXNrQ29udGV4dD4g
Y29udGV4dCA9IGFkb3B0UHRyKHN0YXRpY19jYXN0PFBlcmZvcm1UYXNrQ29udGV4dCo+KHVudHlw
ZWRDb250ZXh0KSk7Ci0gICAgQVNTRVJUKGNvbnRleHQpOwotCi0gICAgRG9jdW1lbnQqIGRvY3Vt
ZW50ID0gY29udGV4dC0+ZG9jdW1lbnRSZWZlcmVuY2UtPmRvY3VtZW50KCk7Ci0gICAgaWYgKCFk
b2N1bWVudCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgUGFnZSogcGFnZSA9IGRvY3VtZW50LT5w
YWdlKCk7Ci0gICAgaWYgKChwYWdlICYmIHBhZ2UtPmRlZmVyc0xvYWRpbmcoKSkgfHwgIWRvY3Vt
ZW50LT5tX3BlbmRpbmdUYXNrcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgZG9jdW1lbnQtPm1fcGVu
ZGluZ1Rhc2tzLmFwcGVuZChjb250ZXh0LT50YXNrLnJlbGVhc2UoKSk7Ci0gICAgICAgIHJldHVy
bjsKLSAgICB9Ci0KLSAgICBjb250ZXh0LT50YXNrLT5wZXJmb3JtVGFzayhkb2N1bWVudCk7Ci19
Ci0KLXZvaWQgRG9jdW1lbnQ6OnBvc3RUYXNrKFBhc3NPd25QdHI8VGFzaz4gdGFzaykKLXsKLSAg
ICBjYWxsT25NYWluVGhyZWFkKGRpZFJlY2VpdmVUYXNrLCBuZXcgUGVyZm9ybVRhc2tDb250ZXh0
KG1fd2Vha1JlZmVyZW5jZSwgdGFzaykpOwotfQotCi12b2lkIERvY3VtZW50OjpwZW5kaW5nVGFz
a3NUaW1lckZpcmVkKFRpbWVyPERvY3VtZW50PiopCi17Ci0gICAgd2hpbGUgKCFtX3BlbmRpbmdU
YXNrcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgT3duUHRyPFRhc2s+IHRhc2sgPSBtX3BlbmRpbmdU
YXNrc1swXS5yZWxlYXNlKCk7Ci0gICAgICAgIG1fcGVuZGluZ1Rhc2tzLnJlbW92ZSgwKTsKLSAg
ICAgICAgdGFzay0+cGVyZm9ybVRhc2sodGhpcyk7Ci0gICAgfQotfQotCi12b2lkIERvY3VtZW50
OjpzdXNwZW5kU2NoZWR1bGVkVGFza3MoQWN0aXZlRE9NT2JqZWN0OjpSZWFzb25Gb3JTdXNwZW5z
aW9uIHJlYXNvbikKLXsKLSAgICBBU1NFUlQoIW1fc2NoZWR1bGVkVGFza3NBcmVTdXNwZW5kZWQp
OwotCi0gICAgc3VzcGVuZFNjcmlwdGVkQW5pbWF0aW9uQ29udHJvbGxlckNhbGxiYWNrcygpOwot
ICAgIHN1c3BlbmRBY3RpdmVET01PYmplY3RzKHJlYXNvbik7Ci0gICAgc2NyaXB0UnVubmVyKCkt
PnN1c3BlbmQoKTsKLSAgICBtX3BlbmRpbmdUYXNrc1RpbWVyLnN0b3AoKTsKLSAgICBpZiAobV9w
YXJzZXIpCi0gICAgICAgIG1fcGFyc2VyLT5zdXNwZW5kU2NoZWR1bGVkVGFza3MoKTsKLQotICAg
IG1fc2NoZWR1bGVkVGFza3NBcmVTdXNwZW5kZWQgPSB0cnVlOwotfQotCi12b2lkIERvY3VtZW50
OjpyZXN1bWVTY2hlZHVsZWRUYXNrcygpCi17Ci0gICAgQVNTRVJUKG1fc2NoZWR1bGVkVGFza3NB
cmVTdXNwZW5kZWQpOwotCi0gICAgaWYgKG1fcGFyc2VyKQotICAgICAgICBtX3BhcnNlci0+cmVz
dW1lU2NoZWR1bGVkVGFza3MoKTsKLSAgICBpZiAoIW1fcGVuZGluZ1Rhc2tzLmlzRW1wdHkoKSkK
LSAgICAgICAgbV9wZW5kaW5nVGFza3NUaW1lci5zdGFydE9uZVNob3QoMCk7Ci0gICAgc2NyaXB0
UnVubmVyKCktPnJlc3VtZSgpOwotICAgIHJlc3VtZUFjdGl2ZURPTU9iamVjdHMoKTsKLSAgICBy
ZXN1bWVTY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXJDYWxsYmFja3MoKTsKLSAgICAKLSAgICBt
X3NjaGVkdWxlZFRhc2tzQXJlU3VzcGVuZGVkID0gZmFsc2U7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6
OnN1c3BlbmRTY3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXJDYWxsYmFja3MoKQotewotI2lmIEVO
QUJMRShSRVFVRVNUX0FOSU1BVElPTl9GUkFNRSkKLSAgICBpZiAobV9zY3JpcHRlZEFuaW1hdGlv
bkNvbnRyb2xsZXIpCi0gICAgICAgIG1fc2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyLT5zdXNw
ZW5kKCk7Ci0jZW5kaWYKLX0KLQotdm9pZCBEb2N1bWVudDo6cmVzdW1lU2NyaXB0ZWRBbmltYXRp
b25Db250cm9sbGVyQ2FsbGJhY2tzKCkKLXsKLSNpZiBFTkFCTEUoUkVRVUVTVF9BTklNQVRJT05f
RlJBTUUpCi0gICAgaWYgKG1fc2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyKQotICAgICAgICBt
X3NjcmlwdGVkQW5pbWF0aW9uQ29udHJvbGxlci0+cmVzdW1lKCk7Ci0jZW5kaWYKLX0KLQotdm9p
ZCBEb2N1bWVudDo6d2luZG93U2NyZWVuRGlkQ2hhbmdlKFBsYXRmb3JtRGlzcGxheUlEIGRpc3Bs
YXlJRCkKLXsKLSNpZiBFTkFCTEUoUkVRVUVTVF9BTklNQVRJT05fRlJBTUUpCi0gICAgaWYgKG1f
c2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyKQotICAgICAgICBtX3NjcmlwdGVkQW5pbWF0aW9u
Q29udHJvbGxlci0+d2luZG93U2NyZWVuRGlkQ2hhbmdlKGRpc3BsYXlJRCk7Ci0jZWxzZQotICAg
IFVOVVNFRF9QQVJBTShkaXNwbGF5SUQpOwotI2VuZGlmCi19Ci0KLQotU3RyaW5nIERvY3VtZW50
OjpkaXNwbGF5U3RyaW5nTW9kaWZpZWRCeUVuY29kaW5nKGNvbnN0IFN0cmluZyYgc3RyKSBjb25z
dAotewotICAgIGlmIChtX2RlY29kZXIpCi0gICAgICAgIHJldHVybiBtX2RlY29kZXItPmVuY29k
aW5nKCkuZGlzcGxheVN0cmluZyhzdHIuaW1wbCgpKTsKLSAgICByZXR1cm4gc3RyOwotfQotCi1Q
YXNzUmVmUHRyPFN0cmluZ0ltcGw+IERvY3VtZW50OjpkaXNwbGF5U3RyaW5nTW9kaWZpZWRCeUVu
Y29kaW5nKFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4gc3RyKSBjb25zdAotewotICAgIGlmIChtX2Rl
Y29kZXIpCi0gICAgICAgIHJldHVybiBtX2RlY29kZXItPmVuY29kaW5nKCkuZGlzcGxheVN0cmlu
ZyhzdHIpOwotICAgIHJldHVybiBzdHI7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmRpc3BsYXlCdWZm
ZXJNb2RpZmllZEJ5RW5jb2RpbmcoVUNoYXIqIGJ1ZmZlciwgdW5zaWduZWQgbGVuKSBjb25zdAot
ewotICAgIGlmIChtX2RlY29kZXIpCi0gICAgICAgIG1fZGVjb2Rlci0+ZW5jb2RpbmcoKS5kaXNw
bGF5QnVmZmVyKGJ1ZmZlciwgbGVuKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6ZW5xdWV1ZVBhZ2Vz
aG93RXZlbnQoUGFnZXNob3dFdmVudFBlcnNpc3RlbmNlIHBlcnNpc3RlZCkKLXsKLSAgICAvLyBG
SVhNRTogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTM2MzM0IFBhZ2Vz
aG93IGV2ZW50IG5lZWRzIHRvIGZpcmUgYXN5bmNocm9ub3VzbHkuCi0gICAgZGlzcGF0Y2hXaW5k
b3dFdmVudChQYWdlVHJhbnNpdGlvbkV2ZW50OjpjcmVhdGUoZXZlbnROYW1lcygpLnBhZ2VzaG93
RXZlbnQsIHBlcnNpc3RlZCksIHRoaXMpOwotfQotCi12b2lkIERvY3VtZW50OjplbnF1ZXVlSGFz
aGNoYW5nZUV2ZW50KGNvbnN0IFN0cmluZyYgb2xkVVJMLCBjb25zdCBTdHJpbmcmIG5ld1VSTCkK
LXsKLSAgICBlbnF1ZXVlV2luZG93RXZlbnQoSGFzaENoYW5nZUV2ZW50OjpjcmVhdGUob2xkVVJM
LCBuZXdVUkwpKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6ZW5xdWV1ZVBvcHN0YXRlRXZlbnQoUGFz
c1JlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IHN0YXRlT2JqZWN0KQotewotICAgIC8vIEZJ
WE1FOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzYyMDIgUG9wc3Rh
dGUgZXZlbnQgbmVlZHMgdG8gZmlyZSBhc3luY2hyb25vdXNseQotICAgIGRpc3BhdGNoV2luZG93
RXZlbnQoUG9wU3RhdGVFdmVudDo6Y3JlYXRlKHN0YXRlT2JqZWN0LCBkb21XaW5kb3coKSA/IGRv
bVdpbmRvdygpLT5oaXN0b3J5KCkgOiAwKSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmFkZE1lZGlh
Q2FuU3RhcnRMaXN0ZW5lcihNZWRpYUNhblN0YXJ0TGlzdGVuZXIqIGxpc3RlbmVyKQotewotICAg
IEFTU0VSVCghbV9tZWRpYUNhblN0YXJ0TGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSk7Ci0g
ICAgbV9tZWRpYUNhblN0YXJ0TGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci19Ci0KLXZvaWQgRG9j
dW1lbnQ6OnJlbW92ZU1lZGlhQ2FuU3RhcnRMaXN0ZW5lcihNZWRpYUNhblN0YXJ0TGlzdGVuZXIq
IGxpc3RlbmVyKQotewotICAgIEFTU0VSVChtX21lZGlhQ2FuU3RhcnRMaXN0ZW5lcnMuY29udGFp
bnMobGlzdGVuZXIpKTsKLSAgICBtX21lZGlhQ2FuU3RhcnRMaXN0ZW5lcnMucmVtb3ZlKGxpc3Rl
bmVyKTsKLX0KLQotTWVkaWFDYW5TdGFydExpc3RlbmVyKiBEb2N1bWVudDo6dGFrZUFueU1lZGlh
Q2FuU3RhcnRMaXN0ZW5lcigpCi17Ci0gICAgSGFzaFNldDxNZWRpYUNhblN0YXJ0TGlzdGVuZXIq
Pjo6aXRlcmF0b3Igc2xvdCA9IG1fbWVkaWFDYW5TdGFydExpc3RlbmVycy5iZWdpbigpOwotICAg
IGlmIChzbG90ID09IG1fbWVkaWFDYW5TdGFydExpc3RlbmVycy5lbmQoKSkKLSAgICAgICAgcmV0
dXJuIDA7Ci0gICAgTWVkaWFDYW5TdGFydExpc3RlbmVyKiBsaXN0ZW5lciA9ICpzbG90OwotICAg
IG1fbWVkaWFDYW5TdGFydExpc3RlbmVycy5yZW1vdmUoc2xvdCk7Ci0gICAgcmV0dXJuIGxpc3Rl
bmVyOwotfQotCi0jaWYgRU5BQkxFKEZVTExTQ1JFRU5fQVBJKQotYm9vbCBEb2N1bWVudDo6ZnVs
bFNjcmVlbklzQWxsb3dlZEZvckVsZW1lbnQoRWxlbWVudCogZWxlbWVudCkgY29uc3QKLXsKLSAg
ICBBU1NFUlQoZWxlbWVudCk7Ci0gICAgcmV0dXJuIGlzQXR0cmlidXRlT25BbGxPd25lcnMod2Vi
a2l0YWxsb3dmdWxsc2NyZWVuQXR0ciwgZWxlbWVudC0+ZG9jdW1lbnQoKS0+b3duZXJFbGVtZW50
KCkpOwotfQotCi12b2lkIERvY3VtZW50OjpyZXF1ZXN0RnVsbFNjcmVlbkZvckVsZW1lbnQoRWxl
bWVudCogZWxlbWVudCwgdW5zaWduZWQgc2hvcnQgZmxhZ3MsIEZ1bGxTY3JlZW5DaGVja1R5cGUg
Y2hlY2tUeXBlKQotewotICAgIC8vIFRoZSBNb3ppbGxhIEZ1bGwgU2NyZWVuIEFQSSA8aHR0cHM6
Ly93aWtpLm1vemlsbGEub3JnL0dlY2tvOkZ1bGxTY3JlZW5BUEk+IGhhcyBkaWZmZXJlbnQgcmVx
dWlyZW1lbnRzCi0gICAgLy8gZm9yIGZ1bGwgc2NyZWVuIG1vZGUsIGFuZCBkbyBub3QgaGF2ZSB0
aGUgY29uY2VwdCBvZiBhIGZ1bGwgc2NyZWVuIGVsZW1lbnQgc3RhY2suCi0gICAgYm9vbCBpbkxl
Z2FjeU1vemlsbGFNb2RlID0gKGZsYWdzICYgRWxlbWVudDo6TEVHQUNZX01PWklMTEFfUkVRVUVT
VCk7Ci0KLSAgICBkbyB7Ci0gICAgICAgIGlmICghZWxlbWVudCkKLSAgICAgICAgICAgIGVsZW1l
bnQgPSBkb2N1bWVudEVsZW1lbnQoKTsKLSAKLSAgICAgICAgLy8gMS4gSWYgYW55IG9mIHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgdHJ1ZSwgdGVybWluYXRlIHRoZXNlIHN0ZXBzIGFuZCBx
dWV1ZSBhIHRhc2sgdG8gZmlyZQotICAgICAgICAvLyBhbiBldmVudCBuYW1lZCBmdWxsc2NyZWVu
ZXJyb3Igd2l0aCBpdHMgYnViYmxlcyBhdHRyaWJ1dGUgc2V0IHRvIHRydWUgb24gdGhlIGNvbnRl
eHQgb2JqZWN0J3MgCi0gICAgICAgIC8vIG5vZGUgZG9jdW1lbnQ6Ci0KLSAgICAgICAgLy8gVGhl
IGNvbnRleHQgb2JqZWN0IGlzIG5vdCBpbiBhIGRvY3VtZW50LgotICAgICAgICBpZiAoIWVsZW1l
bnQtPmluRG9jdW1lbnQoKSkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8vIFRoZSBj
b250ZXh0IG9iamVjdCdzIG5vZGUgZG9jdW1lbnQsIG9yIGFuIGFuY2VzdG9yIGJyb3dzaW5nIGNv
bnRleHQncyBkb2N1bWVudCBkb2VzIG5vdCBoYXZlCi0gICAgICAgIC8vIHRoZSBmdWxsc2NyZWVu
IGVuYWJsZWQgZmxhZyBzZXQuCi0gICAgICAgIGlmIChjaGVja1R5cGUgPT0gRW5mb3JjZUlGcmFt
ZUFsbG93RnVsbFNjcmVlblJlcXVpcmVtZW50ICYmICFmdWxsU2NyZWVuSXNBbGxvd2VkRm9yRWxl
bWVudChlbGVtZW50KSkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8vIFRoZSBjb250
ZXh0IG9iamVjdCdzIG5vZGUgZG9jdW1lbnQgZnVsbHNjcmVlbiBlbGVtZW50IHN0YWNrIGlzIG5v
dCBlbXB0eSBhbmQgaXRzIHRvcCBlbGVtZW50Ci0gICAgICAgIC8vIGlzIG5vdCBhbiBhbmNlc3Rv
ciBvZiB0aGUgY29udGV4dCBvYmplY3QuIChOT1RFOiBJZ25vcmUgdGhpcyByZXF1aXJlbWVudCBp
ZiB0aGUgcmVxdWVzdCB3YXMKLSAgICAgICAgLy8gbWFkZSB2aWEgdGhlIGxlZ2FjeSBNb3ppbGxh
LXN0eWxlIEFQSS4pCi0gICAgICAgIGlmICghbV9mdWxsU2NyZWVuRWxlbWVudFN0YWNrLmlzRW1w
dHkoKSAmJiAhbV9mdWxsU2NyZWVuRWxlbWVudFN0YWNrLmZpcnN0KCktPmNvbnRhaW5zKGVsZW1l
bnQpICYmICFpbkxlZ2FjeU1vemlsbGFNb2RlKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAg
ICAgLy8gQSBkZXNjZW5kYW50IGJyb3dzaW5nIGNvbnRleHQncyBkb2N1bWVudCBoYXMgYSBub24t
ZW1wdHkgZnVsbHNjcmVlbiBlbGVtZW50IHN0YWNrLgotICAgICAgICBib29sIGRlc2NlbmRlbnRI
YXNOb25FbXB0eVN0YWNrID0gZmFsc2U7Ci0gICAgICAgIGZvciAoRnJhbWUqIGRlc2NlbmRhbnQg
PSBmcmFtZSgpID8gZnJhbWUoKS0+dHJlZSgpLT50cmF2ZXJzZU5leHQoKSA6IDA7IGRlc2NlbmRh
bnQ7IGRlc2NlbmRhbnQgPSBkZXNjZW5kYW50LT50cmVlKCktPnRyYXZlcnNlTmV4dCgpKSB7Ci0g
ICAgICAgICAgICBpZiAoZGVzY2VuZGFudC0+ZG9jdW1lbnQoKS0+d2Via2l0RnVsbHNjcmVlbkVs
ZW1lbnQoKSkgewotICAgICAgICAgICAgICAgIGRlc2NlbmRlbnRIYXNOb25FbXB0eVN0YWNrID0g
dHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQot
ICAgICAgICBpZiAoZGVzY2VuZGVudEhhc05vbkVtcHR5U3RhY2sgJiYgIWluTGVnYWN5TW96aWxs
YU1vZGUpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvLyBUaGlzIGFsZ29yaXRobSBp
cyBub3QgYWxsb3dlZCB0byBzaG93IGEgcG9wLXVwOgotICAgICAgICAvLyAgIEFuIGFsZ29yaXRo
bSBpcyBhbGxvd2VkIHRvIHNob3cgYSBwb3AtdXAgaWYsIGluIHRoZSB0YXNrIGluIHdoaWNoIHRo
ZSBhbGdvcml0aG0gaXMgcnVubmluZywgZWl0aGVyOgotICAgICAgICAvLyAgIC0gYW4gYWN0aXZh
dGlvbiBiZWhhdmlvciBpcyBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkIHdob3NlIGNsaWNrIGV2
ZW50IHdhcyB0cnVzdGVkLCBvcgotICAgICAgICAvLyAgIC0gdGhlIGV2ZW50IGxpc3RlbmVyIGZv
ciBhIHRydXN0ZWQgY2xpY2sgZXZlbnQgaXMgYmVpbmcgaGFuZGxlZC4KLSAgICAgICAgaWYgKCFT
Y3JpcHRDb250cm9sbGVyOjpwcm9jZXNzaW5nVXNlckdlc3R1cmUoKSkKLSAgICAgICAgICAgIGJy
ZWFrOwotCi0gICAgICAgIC8vIFRoZXJlIGlzIGEgcHJldmlvdXNseS1lc3RhYmxpc2hlZCB1c2Vy
IHByZWZlcmVuY2UsIHNlY3VyaXR5IHJpc2ssIG9yIHBsYXRmb3JtIGxpbWl0YXRpb24uCi0gICAg
ICAgIGlmICghcGFnZSgpIHx8ICFwYWdlKCktPnNldHRpbmdzKCktPmZ1bGxTY3JlZW5FbmFibGVk
KCkpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgCi0gICAgICAgIGlmICghcGFnZSgpLT5j
aHJvbWUoKS0+Y2xpZW50KCktPnN1cHBvcnRzRnVsbFNjcmVlbkZvckVsZW1lbnQoZWxlbWVudCwg
ZmxhZ3MgJiBFbGVtZW50OjpBTExPV19LRVlCT0FSRF9JTlBVVCkpCi0gICAgICAgICAgICBicmVh
azsKLQotICAgICAgICAvLyAyLiBMZXQgZG9jIGJlIGVsZW1lbnQncyBub2RlIGRvY3VtZW50LiAo
aS5lLiAidGhpcyIpCi0gICAgICAgIERvY3VtZW50KiBjdXJyZW50RG9jID0gdGhpczsKLQotICAg
ICAgICAvLyAzLiBMZXQgZG9jcyBiZSBhbGwgZG9jJ3MgYW5jZXN0b3IgYnJvd3NpbmcgY29udGV4
dCdzIGRvY3VtZW50cyAoaWYgYW55KSBhbmQgZG9jLgotICAgICAgICBEZXF1ZTxEb2N1bWVudCo+
IGRvY3M7Ci0KLSAgICAgICAgZG8gewotICAgICAgICAgICAgZG9jcy5wcmVwZW5kKGN1cnJlbnRE
b2MpOwotICAgICAgICAgICAgY3VycmVudERvYyA9IGN1cnJlbnREb2MtPm93bmVyRWxlbWVudCgp
ID8gY3VycmVudERvYy0+b3duZXJFbGVtZW50KCktPmRvY3VtZW50KCkgOiAwOwotICAgICAgICB9
IHdoaWxlIChjdXJyZW50RG9jKTsKLQotICAgICAgICAvLyA0LiBGb3IgZWFjaCBkb2N1bWVudCBp
biBkb2NzLCBydW4gdGhlc2Ugc3Vic3RlcHM6Ci0gICAgICAgIERlcXVlPERvY3VtZW50Kj46Oml0
ZXJhdG9yIGN1cnJlbnQgPSBkb2NzLmJlZ2luKCksIGZvbGxvd2luZyA9IGRvY3MuYmVnaW4oKTsK
LQotICAgICAgICBkbyB7Ci0gICAgICAgICAgICArK2ZvbGxvd2luZzsKLQotICAgICAgICAgICAg
Ly8gMS4gTGV0IGZvbGxvd2luZyBkb2N1bWVudCBiZSB0aGUgZG9jdW1lbnQgYWZ0ZXIgZG9jdW1l
bnQgaW4gZG9jcywgb3IgbnVsbCBpZiB0aGVyZSBpcyBubwotICAgICAgICAgICAgLy8gc3VjaCBk
b2N1bWVudC4KLSAgICAgICAgICAgIERvY3VtZW50KiBjdXJyZW50RG9jID0gKmN1cnJlbnQ7Ci0g
ICAgICAgICAgICBEb2N1bWVudCogZm9sbG93aW5nRG9jID0gZm9sbG93aW5nICE9IGRvY3MuZW5k
KCkgPyAqZm9sbG93aW5nIDogMDsKLQotICAgICAgICAgICAgLy8gMi4gSWYgZm9sbG93aW5nIGRv
Y3VtZW50IGlzIG51bGwsIHB1c2ggY29udGV4dCBvYmplY3Qgb24gZG9jdW1lbnQncyBmdWxsc2Ny
ZWVuIGVsZW1lbnQKLSAgICAgICAgICAgIC8vIHN0YWNrLCBhbmQgcXVldWUgYSB0YXNrIHRvIGZp
cmUgYW4gZXZlbnQgbmFtZWQgZnVsbHNjcmVlbmNoYW5nZSB3aXRoIGl0cyBidWJibGVzIGF0dHJp
YnV0ZQotICAgICAgICAgICAgLy8gc2V0IHRvIHRydWUgb24gdGhlIGRvY3VtZW50LgotICAgICAg
ICAgICAgaWYgKCFmb2xsb3dpbmdEb2MpIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50RG9jLT5w
dXNoRnVsbHNjcmVlbkVsZW1lbnRTdGFjayhlbGVtZW50KTsKLSAgICAgICAgICAgICAgICBhZGRE
b2N1bWVudFRvRnVsbFNjcmVlbkNoYW5nZUV2ZW50UXVldWUoY3VycmVudERvYyk7Ci0gICAgICAg
ICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIDMuIE90
aGVyd2lzZSwgaWYgZG9jdW1lbnQncyBmdWxsc2NyZWVuIGVsZW1lbnQgc3RhY2sgaXMgZWl0aGVy
IGVtcHR5IG9yIGl0cyB0b3AgZWxlbWVudAotICAgICAgICAgICAgLy8gaXMgbm90IGZvbGxvd2lu
ZyBkb2N1bWVudCdzIGJyb3dzaW5nIGNvbnRleHQgY29udGFpbmVyLAotICAgICAgICAgICAgRWxl
bWVudCogdG9wRWxlbWVudCA9IGN1cnJlbnREb2MtPndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50KCk7
Ci0gICAgICAgICAgICBpZiAoIXRvcEVsZW1lbnQgfHwgdG9wRWxlbWVudCAhPSBmb2xsb3dpbmdE
b2MtPm93bmVyRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gLi4ucHVzaCBmb2xsb3dp
bmcgZG9jdW1lbnQncyBicm93c2luZyBjb250ZXh0IGNvbnRhaW5lciBvbiBkb2N1bWVudCdzIGZ1
bGxzY3JlZW4gZWxlbWVudAotICAgICAgICAgICAgICAgIC8vIHN0YWNrLCBhbmQgcXVldWUgYSB0
YXNrIHRvIGZpcmUgYW4gZXZlbnQgbmFtZWQgZnVsbHNjcmVlbmNoYW5nZSB3aXRoIGl0cyBidWJi
bGVzIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgIC8vIHNldCB0byB0cnVlIG9uIGRvY3VtZW50
LgotICAgICAgICAgICAgICAgIGN1cnJlbnREb2MtPnB1c2hGdWxsc2NyZWVuRWxlbWVudFN0YWNr
KGZvbGxvd2luZ0RvYy0+b3duZXJFbGVtZW50KCkpOwotICAgICAgICAgICAgICAgIGFkZERvY3Vt
ZW50VG9GdWxsU2NyZWVuQ2hhbmdlRXZlbnRRdWV1ZShjdXJyZW50RG9jKTsKLSAgICAgICAgICAg
ICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gNC4gT3RoZXJ3
aXNlLCBkbyBub3RoaW5nIGZvciB0aGlzIGRvY3VtZW50LiBJdCBzdGF5cyB0aGUgc2FtZS4KLSAg
ICAgICAgfSB3aGlsZSAoKytjdXJyZW50ICE9IGRvY3MuZW5kKCkpOwotCi0gICAgICAgIC8vIDUu
IFJldHVybiwgYW5kIHJ1biB0aGUgcmVtYWluaW5nIHN0ZXBzIGFzeW5jaHJvbm91c2x5LgotICAg
ICAgICAvLyA2LiBPcHRpb25hbGx5LCBwZXJmb3JtIHNvbWUgYW5pbWF0aW9uLgotICAgICAgICBt
X2FyZUtleXNFbmFibGVkSW5GdWxsU2NyZWVuID0gZmxhZ3MgJiBFbGVtZW50OjpBTExPV19LRVlC
T0FSRF9JTlBVVDsKLSAgICAgICAgcGFnZSgpLT5jaHJvbWUoKS0+Y2xpZW50KCktPmVudGVyRnVs
bFNjcmVlbkZvckVsZW1lbnQoZWxlbWVudCk7Ci0KLSAgICAgICAgLy8gNy4gT3B0aW9uYWxseSwg
ZGlzcGxheSBhIG1lc3NhZ2UgaW5kaWNhdGluZyBob3cgdGhlIHVzZXIgY2FuIGV4aXQgZGlzcGxh
eWluZyB0aGUgY29udGV4dCBvYmplY3QgZnVsbHNjcmVlbi4KLSAgICAgICAgcmV0dXJuOwotICAg
IH0gd2hpbGUgKDApOwotCi0gICAgbV9mdWxsU2NyZWVuRXJyb3JFdmVudFRhcmdldFF1ZXVlLmFw
cGVuZChlbGVtZW50ID8gZWxlbWVudCA6IGRvY3VtZW50RWxlbWVudCgpKTsKLSAgICBtX2Z1bGxT
Y3JlZW5DaGFuZ2VEZWxheVRpbWVyLnN0YXJ0T25lU2hvdCgwKTsKLX0KLQotdm9pZCBEb2N1bWVu
dDo6d2Via2l0Q2FuY2VsRnVsbFNjcmVlbigpCi17Ci0gICAgLy8gVGhlIE1vemlsbGEgImNhbmNl
bEZ1bGxTY3JlZW4oKSIgQVBJIGJlaGF2ZXMgbGlrZSB0aGUgVzNDICJmdWxseSBleGl0IGZ1bGxz
Y3JlZW4iIGJlaGF2aW9yLCB3aGljaAotICAgIC8vIGlzIGRlZmluZWQgYXM6IAotICAgIC8vICJU
byBmdWxseSBleGl0IGZ1bGxzY3JlZW4gYWN0IGFzIGlmIHRoZSBleGl0RnVsbHNjcmVlbigpIG1l
dGhvZCB3YXMgaW52b2tlZCBvbiB0aGUgdG9wLWxldmVsIGJyb3dzaW5nCi0gICAgLy8gY29udGV4
dCdzIGRvY3VtZW50IGFuZCBzdWJzZXF1ZW50bHkgZW1wdHkgdGhhdCBkb2N1bWVudCdzIGZ1bGxz
Y3JlZW4gZWxlbWVudCBzdGFjay4iCi0gICAgaWYgKCF0b3BEb2N1bWVudCgpLT53ZWJraXRGdWxs
c2NyZWVuRWxlbWVudCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBUbyBhY2hpZXZlIHRo
YXQgYWltLCByZW1vdmUgYWxsIHRoZSBlbGVtZW50cyBmcm9tIHRoZSB0b3AgZG9jdW1lbnQncyBz
dGFjayBleGNlcHQgZm9yIHRoZSBmaXJzdCBiZWZvcmUKLSAgICAvLyBjYWxsaW5nIHdlYmtpdEV4
aXRGdWxsc2NyZWVuKCk6Ci0gICAgRGVxdWU8UmVmUHRyPEVsZW1lbnQ+ID4gcmVwbGFjZW1lbnRG
dWxsc2NyZWVuRWxlbWVudFN0YWNrOwotICAgIHJlcGxhY2VtZW50RnVsbHNjcmVlbkVsZW1lbnRT
dGFjay5wcmVwZW5kKHRvcERvY3VtZW50KCktPndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50KCkpOwot
ICAgIHRvcERvY3VtZW50KCktPm1fZnVsbFNjcmVlbkVsZW1lbnRTdGFjay5zd2FwKHJlcGxhY2Vt
ZW50RnVsbHNjcmVlbkVsZW1lbnRTdGFjayk7Ci0KLSAgICB0b3BEb2N1bWVudCgpLT53ZWJraXRF
eGl0RnVsbHNjcmVlbigpOwotfQotCi12b2lkIERvY3VtZW50Ojp3ZWJraXRFeGl0RnVsbHNjcmVl
bigpCi17Ci0gICAgLy8gVGhlIGV4aXRGdWxsc2NyZWVuKCkgbWV0aG9kIG11c3QgcnVuIHRoZXNl
IHN0ZXBzOgotICAgIAotICAgIC8vIDEuIExldCBkb2MgYmUgdGhlIGNvbnRleHQgb2JqZWN0LiAo
aS5lLiAidGhpcyIpCi0gICAgRG9jdW1lbnQqIGN1cnJlbnREb2MgPSB0aGlzOwotCi0gICAgLy8g
Mi4gSWYgZG9jJ3MgZnVsbHNjcmVlbiBlbGVtZW50IHN0YWNrIGlzIGVtcHR5LCB0ZXJtaW5hdGUg
dGhlc2Ugc3RlcHMuCi0gICAgaWYgKG1fZnVsbFNjcmVlbkVsZW1lbnRTdGFjay5pc0VtcHR5KCkp
Ci0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICAvLyAzLiBMZXQgZGVzY2VuZGFudHMgYmUgYWxs
IHRoZSBkb2MncyBkZXNjZW5kYW50IGJyb3dzaW5nIGNvbnRleHQncyBkb2N1bWVudHMgd2l0aCBh
IG5vbi1lbXB0eSBmdWxsc2NyZWVuCi0gICAgLy8gZWxlbWVudCBzdGFjayAoaWYgYW55KSwgb3Jk
ZXJlZCBzbyB0aGF0IHRoZSBjaGlsZCBvZiB0aGUgZG9jIGlzIGxhc3QgYW5kIHRoZSBkb2N1bWVu
dCBmdXJ0aGVzdAotICAgIC8vIGF3YXkgZnJvbSB0aGUgZG9jIGlzIGZpcnN0LgotICAgIERlcXVl
PFJlZlB0cjxEb2N1bWVudD4gPiBkZXNjZW5kYW50czsKLSAgICBmb3IgKEZyYW1lKiBkZXNjZW5k
YW50ID0gZnJhbWUoKSA/IGZyYW1lKCktPnRyZWUoKS0+dHJhdmVyc2VOZXh0KCkgOiAwOyBkZXNj
ZW5kYW50OyBkZXNjZW5kYW50ID0gZGVzY2VuZGFudC0+dHJlZSgpLT50cmF2ZXJzZU5leHQoKSkg
ewotICAgICAgICBpZiAoZGVzY2VuZGFudC0+ZG9jdW1lbnQoKS0+d2Via2l0RnVsbHNjcmVlbkVs
ZW1lbnQoKSkKLSAgICAgICAgICAgIGRlc2NlbmRhbnRzLnByZXBlbmQoZGVzY2VuZGFudC0+ZG9j
dW1lbnQoKSk7Ci0gICAgfQotICAgICAgICAKLSAgICAvLyA0LiBGb3IgZWFjaCBkZXNjZW5kYW50
IGluIGRlc2NlbmRhbnRzLCBlbXB0eSBkZXNjZW5kYW50J3MgZnVsbHNjcmVlbiBlbGVtZW50IHN0
YWNrLCBhbmQgcXVldWUgYQotICAgIC8vIHRhc2sgdG8gZmlyZSBhbiBldmVudCBuYW1lZCBmdWxs
c2NyZWVuY2hhbmdlIHdpdGggaXRzIGJ1YmJsZXMgYXR0cmlidXRlIHNldCB0byB0cnVlIG9uIGRl
c2NlbmRhbnQuCi0gICAgZm9yIChEZXF1ZTxSZWZQdHI8RG9jdW1lbnQ+ID46Oml0ZXJhdG9yIGkg
PSBkZXNjZW5kYW50cy5iZWdpbigpOyBpICE9IGRlc2NlbmRhbnRzLmVuZCgpOyArK2kpIHsKLSAg
ICAgICAgKCppKS0+Y2xlYXJGdWxsc2NyZWVuRWxlbWVudFN0YWNrKCk7Ci0gICAgICAgIGFkZERv
Y3VtZW50VG9GdWxsU2NyZWVuQ2hhbmdlRXZlbnRRdWV1ZShpLT5nZXQoKSk7Ci0gICAgfQotCi0g
ICAgLy8gNS4gV2hpbGUgZG9jIGlzIG5vdCBudWxsLCBydW4gdGhlc2Ugc3Vic3RlcHM6Ci0gICAg
RWxlbWVudCogbmV3VG9wID0gMDsKLSAgICB3aGlsZSAoY3VycmVudERvYykgewotICAgICAgICAv
LyAxLiBQb3AgdGhlIHRvcCBlbGVtZW50IG9mIGRvYydzIGZ1bGxzY3JlZW4gZWxlbWVudCBzdGFj
ay4KLSAgICAgICAgY3VycmVudERvYy0+cG9wRnVsbHNjcmVlbkVsZW1lbnRTdGFjaygpOwotCi0g
ICAgICAgIC8vICAgIElmIGRvYydzIGZ1bGxzY3JlZW4gZWxlbWVudCBzdGFjayBpcyBub24tZW1w
dHkgYW5kIHRoZSBlbGVtZW50IG5vdyBhdCB0aGUgdG9wIGlzIGVpdGhlcgotICAgICAgICAvLyAg
ICBub3QgaW4gYSBkb2N1bWVudCBvciBpdHMgbm9kZSBkb2N1bWVudCBpcyBub3QgZG9jLCByZXBl
YXQgdGhpcyBzdWJzdGVwLgotICAgICAgICBuZXdUb3AgPSBjdXJyZW50RG9jLT53ZWJraXRGdWxs
c2NyZWVuRWxlbWVudCgpOwotICAgICAgICBpZiAobmV3VG9wICYmICghbmV3VG9wLT5pbkRvY3Vt
ZW50KCkgfHwgbmV3VG9wLT5kb2N1bWVudCgpICE9IGN1cnJlbnREb2MpKQotICAgICAgICAgICAg
Y29udGludWU7Ci0KLSAgICAgICAgLy8gMi4gUXVldWUgYSB0YXNrIHRvIGZpcmUgYW4gZXZlbnQg
bmFtZWQgZnVsbHNjcmVlbmNoYW5nZSB3aXRoIGl0cyBidWJibGVzIGF0dHJpYnV0ZSBzZXQgdG8g
dHJ1ZQotICAgICAgICAvLyBvbiBkb2MuCi0gICAgICAgIGFkZERvY3VtZW50VG9GdWxsU2NyZWVu
Q2hhbmdlRXZlbnRRdWV1ZShjdXJyZW50RG9jKTsKLQotICAgICAgICAvLyAzLiBJZiBkb2MncyBm
dWxsc2NyZWVuIGVsZW1lbnQgc3RhY2sgaXMgZW1wdHkgYW5kIGRvYydzIGJyb3dzaW5nIGNvbnRl
eHQgaGFzIGEgYnJvd3NpbmcgY29udGV4dAotICAgICAgICAvLyBjb250YWluZXIsIHNldCBkb2Mg
dG8gdGhhdCBicm93c2luZyBjb250ZXh0IGNvbnRhaW5lcidzIG5vZGUgZG9jdW1lbnQuCi0gICAg
ICAgIGlmICghbmV3VG9wICYmIGN1cnJlbnREb2MtPm93bmVyRWxlbWVudCgpKSB7Ci0gICAgICAg
ICAgICBjdXJyZW50RG9jID0gY3VycmVudERvYy0+b3duZXJFbGVtZW50KCktPmRvY3VtZW50KCk7
Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIDQuIE90aGVy
d2lzZSwgc2V0IGRvYyB0byBudWxsLgotICAgICAgICBjdXJyZW50RG9jID0gMDsKLSAgICB9Ci0K
LSAgICAvLyA2LiBSZXR1cm4sIGFuZCBydW4gdGhlIHJlbWFpbmluZyBzdGVwcyBhc3luY2hyb25v
dXNseS4KLSAgICAvLyA3LiBPcHRpb25hbGx5LCBwZXJmb3JtIHNvbWUgYW5pbWF0aW9uLgotCi0g
ICAgLy8gT25seSBleGl0IG91dCBvZiBmdWxsIHNjcmVlbiB3aW5kb3cgbW9kZSBpZiB0aGVyZSBh
cmUgbm8gcmVtYWluaW5nIGVsZW1lbnRzIGluIHRoZSAKLSAgICAvLyBmdWxsIHNjcmVlbiBzdGFj
ay4KLSAgICBpZiAoIW5ld1RvcCkgewotICAgICAgICBwYWdlKCktPmNocm9tZSgpLT5jbGllbnQo
KS0+ZXhpdEZ1bGxTY3JlZW5Gb3JFbGVtZW50KG1fZnVsbFNjcmVlbkVsZW1lbnQuZ2V0KCkpOwot
ICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gT3RoZXJ3aXNlLCBub3RpZnkgdGhlIGNo
cm9tZSBvZiB0aGUgbmV3IGZ1bGwgc2NyZWVuIGVsZW1lbnQuCi0gICAgcGFnZSgpLT5jaHJvbWUo
KS0+Y2xpZW50KCktPmVudGVyRnVsbFNjcmVlbkZvckVsZW1lbnQobmV3VG9wKTsgICAgICAKLX0K
LQotYm9vbCBEb2N1bWVudDo6d2Via2l0RnVsbHNjcmVlbkVuYWJsZWQoKSBjb25zdAotewotICAg
IC8vIDQuIFRoZSBmdWxsc2NyZWVuRW5hYmxlZCBhdHRyaWJ1dGUgbXVzdCByZXR1cm4gdHJ1ZSBp
ZiB0aGUgY29udGV4dCBvYmplY3QgYW5kIGFsbCBhbmNlc3RvcgotICAgIC8vIGJyb3dzaW5nIGNv
bnRleHQncyBkb2N1bWVudHMgaGF2ZSB0aGVpciBmdWxsc2NyZWVuIGVuYWJsZWQgZmxhZyBzZXQs
IG9yIGZhbHNlIG90aGVyd2lzZS4KLQotICAgIC8vIFRvcC1sZXZlbCBicm93c2luZyBjb250ZXh0
cyBhcmUgaW1wbGllZCB0byBoYXZlIHRoZWlyIGFsbG93RnVsbFNjcmVlbiBhdHRyaWJ1dGUgc2V0
LgotICAgIHJldHVybiBpc0F0dHJpYnV0ZU9uQWxsT3duZXJzKHdlYmtpdGFsbG93ZnVsbHNjcmVl
bkF0dHIsIG93bmVyRWxlbWVudCgpKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6d2Via2l0V2lsbEVu
dGVyRnVsbFNjcmVlbkZvckVsZW1lbnQoRWxlbWVudCogZWxlbWVudCkKLXsKLSAgICBpZiAoIWF0
dGFjaGVkKCkgfHwgaW5QYWdlQ2FjaGUoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgQVNTRVJU
KGVsZW1lbnQpOwotCi0gICAgLy8gUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGNhbGxlZCBhZnRlciB0
aGUgZG9jdW1lbnQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBwYWdlLgotICAgIGlmICghcGFn
ZSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBBU1NFUlQocGFnZSgpLT5zZXR0aW5ncygpLT5m
dWxsU2NyZWVuRW5hYmxlZCgpKTsKLQotICAgIGlmIChtX2Z1bGxTY3JlZW5SZW5kZXJlcikKLSAg
ICAgICAgbV9mdWxsU2NyZWVuUmVuZGVyZXItPnVud3JhcFJlbmRlcmVyKCk7Ci0KLSAgICBtX2Z1
bGxTY3JlZW5FbGVtZW50ID0gZWxlbWVudDsKLQotI2lmIFVTRShOQVRJVkVfRlVMTFNDUkVFTl9W
SURFTykKLSAgICBpZiAoZWxlbWVudCAmJiBlbGVtZW50LT5pc01lZGlhRWxlbWVudCgpKQotICAg
ICAgICByZXR1cm47Ci0jZW5kaWYKLQotICAgIC8vIENyZWF0ZSBhIHBsYWNlaG9sZGVyIGJsb2Nr
IGZvciBhIHRoZSBmdWxsLXNjcmVlbiBlbGVtZW50LCB0byBrZWVwIHRoZSBwYWdlIGZyb20gcmVm
bG93aW5nCi0gICAgLy8gd2hlbiB0aGUgZWxlbWVudCBpcyByZW1vdmVkIGZyb20gdGhlIG5vcm1h
bCBmbG93LiAgT25seSBkbyB0aGlzIGZvciBhIFJlbmRlckJveCwgYXMgb25seSAKLSAgICAvLyBh
IGJveCB3aWxsIGhhdmUgYSBmcmFtZVJlY3QuICBUaGUgcGxhY2Vob2xkZXIgd2lsbCBiZSBjcmVh
dGVkIGluIHNldEZ1bGxTY3JlZW5SZW5kZXJlcigpCi0gICAgLy8gZHVyaW5nIGxheW91dC4KLSAg
ICBSZW5kZXJPYmplY3QqIHJlbmRlcmVyID0gbV9mdWxsU2NyZWVuRWxlbWVudC0+cmVuZGVyZXIo
KTsKLSAgICBib29sIHNob3VsZENyZWF0ZVBsYWNlaG9sZGVyID0gcmVuZGVyZXIgJiYgcmVuZGVy
ZXItPmlzQm94KCk7Ci0gICAgaWYgKHNob3VsZENyZWF0ZVBsYWNlaG9sZGVyKSB7Ci0gICAgICAg
IG1fc2F2ZWRQbGFjZWhvbGRlckZyYW1lUmVjdCA9IHRvUmVuZGVyQm94KHJlbmRlcmVyKS0+ZnJh
bWVSZWN0KCk7Ci0gICAgICAgIG1fc2F2ZWRQbGFjZWhvbGRlclJlbmRlclN0eWxlID0gUmVuZGVy
U3R5bGU6OmNsb25lKHJlbmRlcmVyLT5zdHlsZSgpKTsKLSAgICB9Ci0KLSAgICBpZiAobV9mdWxs
U2NyZWVuRWxlbWVudCAhPSBkb2N1bWVudEVsZW1lbnQoKSkKLSAgICAgICAgUmVuZGVyRnVsbFNj
cmVlbjo6d3JhcFJlbmRlcmVyKHJlbmRlcmVyLCByZW5kZXJlciA/IHJlbmRlcmVyLT5wYXJlbnQo
KSA6IDAsIHRoaXMpOwotCi0gICAgbV9mdWxsU2NyZWVuRWxlbWVudC0+c2V0Q29udGFpbnNGdWxs
U2NyZWVuRWxlbWVudE9uQW5jZXN0b3JzQ3Jvc3NpbmdGcmFtZUJvdW5kYXJpZXModHJ1ZSk7Ci0g
ICAgCi0gICAgcmVjYWxjU3R5bGUoRm9yY2UpOwotfQotCi12b2lkIERvY3VtZW50Ojp3ZWJraXRE
aWRFbnRlckZ1bGxTY3JlZW5Gb3JFbGVtZW50KEVsZW1lbnQqKQotewotICAgIGlmICghbV9mdWxs
U2NyZWVuRWxlbWVudCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKCFhdHRhY2hlZCgpIHx8
IGluUGFnZUNhY2hlKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fZnVsbFNjcmVlbkVsZW1l
bnQtPmRpZEJlY29tZUZ1bGxzY3JlZW5FbGVtZW50KCk7Ci0KLSAgICBtX2Z1bGxTY3JlZW5DaGFu
Z2VEZWxheVRpbWVyLnN0YXJ0T25lU2hvdCgwKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6d2Via2l0
V2lsbEV4aXRGdWxsU2NyZWVuRm9yRWxlbWVudChFbGVtZW50KikKLXsKLSAgICBpZiAoIW1fZnVs
bFNjcmVlbkVsZW1lbnQpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmICghYXR0YWNoZWQoKSB8
fCBpblBhZ2VDYWNoZSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX2Z1bGxTY3JlZW5FbGVt
ZW50LT53aWxsU3RvcEJlaW5nRnVsbHNjcmVlbkVsZW1lbnQoKTsKLX0KLQotdm9pZCBEb2N1bWVu
dDo6d2Via2l0RGlkRXhpdEZ1bGxTY3JlZW5Gb3JFbGVtZW50KEVsZW1lbnQqKQotewotICAgIGlm
ICghbV9mdWxsU2NyZWVuRWxlbWVudCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKCFhdHRh
Y2hlZCgpIHx8IGluUGFnZUNhY2hlKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fZnVsbFNj
cmVlbkVsZW1lbnQtPnNldENvbnRhaW5zRnVsbFNjcmVlbkVsZW1lbnRPbkFuY2VzdG9yc0Nyb3Nz
aW5nRnJhbWVCb3VuZGFyaWVzKGZhbHNlKTsKLQotICAgIG1fYXJlS2V5c0VuYWJsZWRJbkZ1bGxT
Y3JlZW4gPSBmYWxzZTsKLSAgICAKLSAgICBpZiAobV9mdWxsU2NyZWVuUmVuZGVyZXIpCi0gICAg
ICAgIG1fZnVsbFNjcmVlblJlbmRlcmVyLT51bndyYXBSZW5kZXJlcigpOwotCi0gICAgbV9mdWxs
U2NyZWVuRWxlbWVudCA9IDA7Ci0gICAgc2NoZWR1bGVGb3JjZWRTdHlsZVJlY2FsYygpOwotICAg
IAotICAgIC8vIFdoZW4gd2Via2l0Q2FuY2VsRnVsbFNjcmVlbiBpcyBjYWxsZWQsIHdlIGNhbGwg
d2Via2l0RXhpdEZ1bGxTY3JlZW4gb24gdGhlIHRvcERvY3VtZW50KCkuIFRoYXQKLSAgICAvLyBt
ZWFucyB0aGF0IHRoZSBldmVudHMgd2lsbCBiZSBxdWV1ZWQgdGhlcmUuIFNvIGlmIHdlIGhhdmUg
bm8gZXZlbnRzIGhlcmUsIHN0YXJ0IHRoZSB0aW1lciBvbgotICAgIC8vIHRoZSBleGl0aW5nIGRv
Y3VtZW50LgotICAgIERvY3VtZW50KiBleGl0aW5nRG9jdW1lbnQgPSB0aGlzOwotICAgIGlmICht
X2Z1bGxTY3JlZW5DaGFuZ2VFdmVudFRhcmdldFF1ZXVlLmlzRW1wdHkoKSAmJiBtX2Z1bGxTY3Jl
ZW5FcnJvckV2ZW50VGFyZ2V0UXVldWUuaXNFbXB0eSgpKQotICAgICAgICBleGl0aW5nRG9jdW1l
bnQgPSB0b3BEb2N1bWVudCgpOwotICAgIGV4aXRpbmdEb2N1bWVudC0+bV9mdWxsU2NyZWVuQ2hh
bmdlRGVsYXlUaW1lci5zdGFydE9uZVNob3QoMCk7Ci19Ci0gICAgCi12b2lkIERvY3VtZW50Ojpz
ZXRGdWxsU2NyZWVuUmVuZGVyZXIoUmVuZGVyRnVsbFNjcmVlbiogcmVuZGVyZXIpCi17Ci0gICAg
aWYgKHJlbmRlcmVyID09IG1fZnVsbFNjcmVlblJlbmRlcmVyKQotICAgICAgICByZXR1cm47Ci0K
LSAgICBpZiAocmVuZGVyZXIgJiYgbV9zYXZlZFBsYWNlaG9sZGVyUmVuZGVyU3R5bGUpIAotICAg
ICAgICByZW5kZXJlci0+Y3JlYXRlUGxhY2Vob2xkZXIobV9zYXZlZFBsYWNlaG9sZGVyUmVuZGVy
U3R5bGUucmVsZWFzZSgpLCBtX3NhdmVkUGxhY2Vob2xkZXJGcmFtZVJlY3QpOwotICAgIGVsc2Ug
aWYgKHJlbmRlcmVyICYmIG1fZnVsbFNjcmVlblJlbmRlcmVyICYmIG1fZnVsbFNjcmVlblJlbmRl
cmVyLT5wbGFjZWhvbGRlcigpKSB7Ci0gICAgICAgIFJlbmRlckJsb2NrKiBwbGFjZWhvbGRlciA9
IG1fZnVsbFNjcmVlblJlbmRlcmVyLT5wbGFjZWhvbGRlcigpOwotICAgICAgICByZW5kZXJlci0+
Y3JlYXRlUGxhY2Vob2xkZXIoUmVuZGVyU3R5bGU6OmNsb25lKHBsYWNlaG9sZGVyLT5zdHlsZSgp
KSwgcGxhY2Vob2xkZXItPmZyYW1lUmVjdCgpKTsKLSAgICB9Ci0KLSAgICBpZiAobV9mdWxsU2Ny
ZWVuUmVuZGVyZXIpCi0gICAgICAgIG1fZnVsbFNjcmVlblJlbmRlcmVyLT5kZXN0cm95KCk7Ci0g
ICAgQVNTRVJUKCFtX2Z1bGxTY3JlZW5SZW5kZXJlcik7Ci0KLSAgICBtX2Z1bGxTY3JlZW5SZW5k
ZXJlciA9IHJlbmRlcmVyOwotICAgIAotICAgIC8vIFRoaXMgbm90aWZpY2F0aW9uIGNhbiBjb21l
IGluIGFmdGVyIHRoZSBwYWdlIGhhcyBiZWVuIGRlc3Ryb3llZC4KLSAgICBpZiAocGFnZSgpKQot
ICAgICAgICBwYWdlKCktPmNocm9tZSgpLT5jbGllbnQoKS0+ZnVsbFNjcmVlblJlbmRlcmVyQ2hh
bmdlZChtX2Z1bGxTY3JlZW5SZW5kZXJlcik7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmZ1bGxTY3Jl
ZW5SZW5kZXJlckRlc3Ryb3llZCgpCi17Ci0gICAgbV9mdWxsU2NyZWVuUmVuZGVyZXIgPSAwOwot
Ci0gICAgaWYgKHBhZ2UoKSkKLSAgICAgICAgcGFnZSgpLT5jaHJvbWUoKS0+Y2xpZW50KCktPmZ1
bGxTY3JlZW5SZW5kZXJlckNoYW5nZWQoMCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnNldEZ1bGxT
Y3JlZW5SZW5kZXJlclNpemUoY29uc3QgSW50U2l6ZSYgc2l6ZSkKLXsKLSAgICBBU1NFUlQobV9m
dWxsU2NyZWVuUmVuZGVyZXIpOwotICAgIGlmICghbV9mdWxsU2NyZWVuUmVuZGVyZXIpCi0gICAg
ICAgIHJldHVybjsKLSAgICAKLSAgICBpZiAobV9mdWxsU2NyZWVuUmVuZGVyZXIpIHsKLSAgICAg
ICAgUmVmUHRyPFJlbmRlclN0eWxlPiBuZXdTdHlsZSA9IFJlbmRlclN0eWxlOjpjbG9uZShtX2Z1
bGxTY3JlZW5SZW5kZXJlci0+c3R5bGUoKSk7Ci0gICAgICAgIG5ld1N0eWxlLT5zZXRXaWR0aChM
ZW5ndGgoc2l6ZS53aWR0aCgpLCBXZWJDb3JlOjpGaXhlZCkpOwotICAgICAgICBuZXdTdHlsZS0+
c2V0SGVpZ2h0KExlbmd0aChzaXplLmhlaWdodCgpLCBXZWJDb3JlOjpGaXhlZCkpOwotICAgICAg
ICBuZXdTdHlsZS0+c2V0VG9wKExlbmd0aCgwLCBXZWJDb3JlOjpGaXhlZCkpOwotICAgICAgICBu
ZXdTdHlsZS0+c2V0TGVmdChMZW5ndGgoMCwgV2ViQ29yZTo6Rml4ZWQpKTsKLSAgICAgICAgbV9m
dWxsU2NyZWVuUmVuZGVyZXItPnNldFN0eWxlKG5ld1N0eWxlKTsKLSAgICAgICAgdXBkYXRlTGF5
b3V0KCk7Ci0gICAgfQotfQotICAgIAotdm9pZCBEb2N1bWVudDo6c2V0RnVsbFNjcmVlblJlbmRl
cmVyQmFja2dyb3VuZENvbG9yKENvbG9yIGJhY2tncm91bmRDb2xvcikKLXsKLSAgICBpZiAoIW1f
ZnVsbFNjcmVlblJlbmRlcmVyKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgUmVmUHRyPFJl
bmRlclN0eWxlPiBuZXdTdHlsZSA9IFJlbmRlclN0eWxlOjpjbG9uZShtX2Z1bGxTY3JlZW5SZW5k
ZXJlci0+c3R5bGUoKSk7Ci0gICAgbmV3U3R5bGUtPnNldEJhY2tncm91bmRDb2xvcihiYWNrZ3Jv
dW5kQ29sb3IpOwotICAgIG1fZnVsbFNjcmVlblJlbmRlcmVyLT5zZXRTdHlsZShuZXdTdHlsZSk7
Ci19Ci0gICAgCi12b2lkIERvY3VtZW50OjpmdWxsU2NyZWVuQ2hhbmdlRGVsYXlUaW1lckZpcmVk
KFRpbWVyPERvY3VtZW50PiopCi17Ci0gICAgLy8gU2luY2Ugd2UgZGlzcGF0Y2ggZXZlbnRzIGlu
IHRoaXMgZnVuY3Rpb24sIGl0J3MgcG9zc2libGUgdGhhdCB0aGUKLSAgICAvLyBkb2N1bWVudCB3
aWxsIGJlIGRldGFjaGVkIGFuZCBHQydkLiBXZSBwcm90ZWN0IGl0IGhlcmUgdG8gbWFrZSBzdXJl
IHdlCi0gICAgLy8gY2FuIGZpbmlzaCB0aGUgZnVuY3Rpb24gc3VjY2Vzc2Z1bGx5LgotICAgIFJl
ZlB0cjxEb2N1bWVudD4gcHJvdGVjdERvY3VtZW50KHRoaXMpOwotICAgIERlcXVlPFJlZlB0cjxO
b2RlPiA+IGNoYW5nZVF1ZXVlOwotICAgIG1fZnVsbFNjcmVlbkNoYW5nZUV2ZW50VGFyZ2V0UXVl
dWUuc3dhcChjaGFuZ2VRdWV1ZSk7Ci0KLSAgICB3aGlsZSAoIWNoYW5nZVF1ZXVlLmlzRW1wdHko
KSkgewotICAgICAgICBSZWZQdHI8Tm9kZT4gbm9kZSA9IGNoYW5nZVF1ZXVlLnRha2VGaXJzdCgp
OwotICAgICAgICBpZiAoIW5vZGUpCi0gICAgICAgICAgICBub2RlID0gZG9jdW1lbnRFbGVtZW50
KCk7Ci0gICAgICAgIC8vIFRoZSBkaXNwYXRjaEV2ZW50IGJlbG93IG1heSBoYXZlIGJsb3duIGF3
YXkgb3VyIGRvY3VtZW50RWxlbWVudC4KLSAgICAgICAgaWYgKCFub2RlKQotICAgICAgICAgICAg
Y29udGludWU7Ci0KLSAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgd2FzIHJlbW92ZWQgZnJvbSBv
dXIgdHJlZSwgYWxzbyBtZXNzYWdlIHRoZSBkb2N1bWVudEVsZW1lbnQuIFNpbmNlIHdlIG1heQot
ICAgICAgICAvLyBoYXZlIGEgZG9jdW1lbnQgaGllcmFyY2h5LCBjaGVjayB0aGF0IG5vZGUgaXNu
J3QgaW4gYW5vdGhlciBkb2N1bWVudC4KLSAgICAgICAgaWYgKCFjb250YWlucyhub2RlLmdldCgp
KSAmJiAhbm9kZS0+aW5Eb2N1bWVudCgpKQotICAgICAgICAgICAgY2hhbmdlUXVldWUuYXBwZW5k
KGRvY3VtZW50RWxlbWVudCgpKTsKLSAgICAgICAgCi0gICAgICAgIG5vZGUtPmRpc3BhdGNoRXZl
bnQoRXZlbnQ6OmNyZWF0ZShldmVudE5hbWVzKCkud2Via2l0ZnVsbHNjcmVlbmNoYW5nZUV2ZW50
LCB0cnVlLCBmYWxzZSkpOwotICAgIH0KLQotICAgIERlcXVlPFJlZlB0cjxOb2RlPiA+IGVycm9y
UXVldWU7Ci0gICAgbV9mdWxsU2NyZWVuRXJyb3JFdmVudFRhcmdldFF1ZXVlLnN3YXAoZXJyb3JR
dWV1ZSk7Ci0gICAgCi0gICAgd2hpbGUgKCFlcnJvclF1ZXVlLmlzRW1wdHkoKSkgewotICAgICAg
ICBSZWZQdHI8Tm9kZT4gbm9kZSA9IGVycm9yUXVldWUudGFrZUZpcnN0KCk7Ci0gICAgICAgIGlm
ICghbm9kZSkKLSAgICAgICAgICAgIG5vZGUgPSBkb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAg
Ly8gVGhlIGRpc3BhdGNoRXZlbnQgYmVsb3cgbWF5IGhhdmUgYmxvd24gYXdheSBvdXIgZG9jdW1l
bnRFbGVtZW50LgotICAgICAgICBpZiAoIW5vZGUpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAg
ICAgICAgCi0gICAgICAgIC8vIElmIHRoZSBlbGVtZW50IHdhcyByZW1vdmVkIGZyb20gb3VyIHRy
ZWUsIGFsc28gbWVzc2FnZSB0aGUgZG9jdW1lbnRFbGVtZW50LiBTaW5jZSB3ZSBtYXkKLSAgICAg
ICAgLy8gaGF2ZSBhIGRvY3VtZW50IGhpZXJhcmNoeSwgY2hlY2sgdGhhdCBub2RlIGlzbid0IGlu
IGFub3RoZXIgZG9jdW1lbnQuCi0gICAgICAgIGlmICghY29udGFpbnMobm9kZS5nZXQoKSkgJiYg
IW5vZGUtPmluRG9jdW1lbnQoKSkKLSAgICAgICAgICAgIGVycm9yUXVldWUuYXBwZW5kKGRvY3Vt
ZW50RWxlbWVudCgpKTsKLSAgICAgICAgCi0gICAgICAgIG5vZGUtPmRpc3BhdGNoRXZlbnQoRXZl
bnQ6OmNyZWF0ZShldmVudE5hbWVzKCkud2Via2l0ZnVsbHNjcmVlbmVycm9yRXZlbnQsIHRydWUs
IGZhbHNlKSk7Ci0gICAgfQotfQotCi12b2lkIERvY3VtZW50OjpmdWxsU2NyZWVuRWxlbWVudFJl
bW92ZWQoKQotewotICAgIG1fZnVsbFNjcmVlbkVsZW1lbnQtPnNldENvbnRhaW5zRnVsbFNjcmVl
bkVsZW1lbnRPbkFuY2VzdG9yc0Nyb3NzaW5nRnJhbWVCb3VuZGFyaWVzKGZhbHNlKTsKLSAgICB3
ZWJraXRDYW5jZWxGdWxsU2NyZWVuKCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnJlbW92ZUZ1bGxT
Y3JlZW5FbGVtZW50T2ZTdWJ0cmVlKE5vZGUqIG5vZGUsIGJvb2wgYW1vbmdDaGlsZHJlbk9ubHkp
Ci17Ci0gICAgaWYgKCFtX2Z1bGxTY3JlZW5FbGVtZW50KQotICAgICAgICByZXR1cm47Ci0gICAg
Ci0gICAgYm9vbCBlbGVtZW50SW5TdWJ0cmVlID0gZmFsc2U7Ci0gICAgaWYgKGFtb25nQ2hpbGRy
ZW5Pbmx5KQotICAgICAgICBlbGVtZW50SW5TdWJ0cmVlID0gbV9mdWxsU2NyZWVuRWxlbWVudC0+
aXNEZXNjZW5kYW50T2Yobm9kZSk7Ci0gICAgZWxzZQotICAgICAgICBlbGVtZW50SW5TdWJ0cmVl
ID0gKG1fZnVsbFNjcmVlbkVsZW1lbnQgPT0gbm9kZSkgfHwgbV9mdWxsU2NyZWVuRWxlbWVudC0+
aXNEZXNjZW5kYW50T2Yobm9kZSk7Ci0gICAgCi0gICAgaWYgKGVsZW1lbnRJblN1YnRyZWUpCi0g
ICAgICAgIGZ1bGxTY3JlZW5FbGVtZW50UmVtb3ZlZCgpOwotfQotCi1ib29sIERvY3VtZW50Ojpp
c0FuaW1hdGluZ0Z1bGxTY3JlZW4oKSBjb25zdAotewotICAgIHJldHVybiBtX2lzQW5pbWF0aW5n
RnVsbFNjcmVlbjsKLX0KLQotdm9pZCBEb2N1bWVudDo6c2V0QW5pbWF0aW5nRnVsbFNjcmVlbihi
b29sIGZsYWcpCi17Ci0gICAgaWYgKG1faXNBbmltYXRpbmdGdWxsU2NyZWVuID09IGZsYWcpCi0g
ICAgICAgIHJldHVybjsKLSAgICBtX2lzQW5pbWF0aW5nRnVsbFNjcmVlbiA9IGZsYWc7Ci0KLSAg
ICBpZiAobV9mdWxsU2NyZWVuRWxlbWVudCAmJiBtX2Z1bGxTY3JlZW5FbGVtZW50LT5pc0Rlc2Nl
bmRhbnRPZih0aGlzKSkgewotICAgICAgICBtX2Z1bGxTY3JlZW5FbGVtZW50LT5zZXROZWVkc1N0
eWxlUmVjYWxjKCk7Ci0gICAgICAgIHNjaGVkdWxlRm9yY2VkU3R5bGVSZWNhbGMoKTsKLSAgICB9
Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmNsZWFyRnVsbHNjcmVlbkVsZW1lbnRTdGFjaygpCi17Ci0g
ICAgbV9mdWxsU2NyZWVuRWxlbWVudFN0YWNrLmNsZWFyKCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6
OnBvcEZ1bGxzY3JlZW5FbGVtZW50U3RhY2soKQotewotICAgIGlmIChtX2Z1bGxTY3JlZW5FbGVt
ZW50U3RhY2suaXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX2Z1bGxTY3JlZW5F
bGVtZW50U3RhY2sucmVtb3ZlRmlyc3QoKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6cHVzaEZ1bGxz
Y3JlZW5FbGVtZW50U3RhY2soRWxlbWVudCogZWxlbWVudCkKLXsKLSAgICBtX2Z1bGxTY3JlZW5F
bGVtZW50U3RhY2sucHJlcGVuZChlbGVtZW50KTsKLX0KLQotdm9pZCBEb2N1bWVudDo6YWRkRG9j
dW1lbnRUb0Z1bGxTY3JlZW5DaGFuZ2VFdmVudFF1ZXVlKERvY3VtZW50KiBkb2MpCi17Ci0gICAg
QVNTRVJUKGRvYyk7Ci0gICAgTm9kZSogdGFyZ2V0ID0gZG9jLT53ZWJraXRGdWxsc2NyZWVuRWxl
bWVudCgpOwotICAgIGlmICghdGFyZ2V0KQotICAgICAgICB0YXJnZXQgPSBkb2MtPndlYmtpdEN1
cnJlbnRGdWxsU2NyZWVuRWxlbWVudCgpOwotICAgIGlmICghdGFyZ2V0KQotICAgICAgICB0YXJn
ZXQgPSBkb2M7Ci0gICAgbV9mdWxsU2NyZWVuQ2hhbmdlRXZlbnRUYXJnZXRRdWV1ZS5hcHBlbmQo
dGFyZ2V0KTsKLX0KLSNlbmRpZgotCi0jaWYgRU5BQkxFKFBPSU5URVJfTE9DSykKLXZvaWQgRG9j
dW1lbnQ6OndlYmtpdEV4aXRQb2ludGVyTG9jaygpCi17Ci0gICAgaWYgKCFwYWdlKCkpCi0gICAg
ICAgIHJldHVybjsKLSAgICBpZiAoRWxlbWVudCogdGFyZ2V0ID0gcGFnZSgpLT5wb2ludGVyTG9j
a0NvbnRyb2xsZXIoKS0+ZWxlbWVudCgpKSB7Ci0gICAgICAgIGlmICh0YXJnZXQtPmRvY3VtZW50
KCkgIT0gdGhpcykKLSAgICAgICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcGFnZSgpLT5wb2lu
dGVyTG9ja0NvbnRyb2xsZXIoKS0+cmVxdWVzdFBvaW50ZXJVbmxvY2soKTsKLX0KLQotRWxlbWVu
dCogRG9jdW1lbnQ6OndlYmtpdFBvaW50ZXJMb2NrRWxlbWVudCgpIGNvbnN0Ci17Ci0gICAgaWYg
KCFwYWdlKCkgfHwgcGFnZSgpLT5wb2ludGVyTG9ja0NvbnRyb2xsZXIoKS0+bG9ja1BlbmRpbmco
KSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKEVsZW1lbnQqIGVsZW1lbnQgPSBwYWdlKCkt
PnBvaW50ZXJMb2NrQ29udHJvbGxlcigpLT5lbGVtZW50KCkpIHsKLSAgICAgICAgaWYgKGVsZW1l
bnQtPmRvY3VtZW50KCkgPT0gdGhpcykKLSAgICAgICAgICAgIHJldHVybiBlbGVtZW50OwotICAg
IH0KLSAgICByZXR1cm4gMDsKLX0KLSNlbmRpZgotCi12b2lkIERvY3VtZW50OjpkZWNyZW1lbnRM
b2FkRXZlbnREZWxheUNvdW50KCkKLXsKLSAgICBBU1NFUlQobV9sb2FkRXZlbnREZWxheUNvdW50
KTsKLSAgICAtLW1fbG9hZEV2ZW50RGVsYXlDb3VudDsKLQotICAgIGlmIChmcmFtZSgpICYmICFt
X2xvYWRFdmVudERlbGF5Q291bnQgJiYgIW1fbG9hZEV2ZW50RGVsYXlUaW1lci5pc0FjdGl2ZSgp
KQotICAgICAgICBtX2xvYWRFdmVudERlbGF5VGltZXIuc3RhcnRPbmVTaG90KDApOwotfQotCi12
b2lkIERvY3VtZW50Ojpsb2FkRXZlbnREZWxheVRpbWVyRmlyZWQoVGltZXI8RG9jdW1lbnQ+KikK
LXsKLSAgICBpZiAoZnJhbWUoKSkKLSAgICAgICAgZnJhbWUoKS0+bG9hZGVyKCktPmNoZWNrQ29t
cGxldGVkKCk7CisgICAgLy8gRGV0ZXJtaW5lIGFuIGFwcHJvcHJpYXRlIGluc2VydGlvbiBwb2lu
dC4KKyAgICBTdHlsZVNoZWV0Q2FuZGlkYXRlTGlzdEhhc2hTZXQ6Oml0ZXJhdG9yIGJlZ2luID0g
bV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMuYmVnaW4oKTsKKyAgICBTdHlsZVNoZWV0Q2FuZGlk
YXRlTGlzdEhhc2hTZXQ6Oml0ZXJhdG9yIGVuZCA9IG1fc3R5bGVTaGVldENhbmRpZGF0ZU5vZGVz
LmVuZCgpOworICAgIFN0eWxlU2hlZXRDYW5kaWRhdGVMaXN0SGFzaFNldDo6aXRlcmF0b3IgaXQg
PSBlbmQ7CisgICAgTm9kZSogZm9sbG93aW5nTm9kZSA9IDA7CisgICAgZG8geworICAgICAgICAt
LWl0OworICAgICAgICBOb2RlKiBuID0gKml0OworICAgICAgICB1bnNpZ25lZCBzaG9ydCBwb3Np
dGlvbiA9IG4tPmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKG5vZGUpOworICAgICAgICBpZiAocG9z
aXRpb24gPT0gTm9kZTo6RE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HKSB7CisgICAgICAgICAg
ICBtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcy5pbnNlcnRCZWZvcmUoZm9sbG93aW5nTm9kZSwg
bm9kZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZm9sbG93aW5n
Tm9kZSA9IG47CisgICAgfSB3aGlsZSAoaXQgIT0gYmVnaW4pOworICAgIAorICAgIG1fc3R5bGVT
aGVldENhbmRpZGF0ZU5vZGVzLmluc2VydEJlZm9yZShmb2xsb3dpbmdOb2RlLCBub2RlKTsKIH0K
IAotI2lmIEVOQUJMRShSRVFVRVNUX0FOSU1BVElPTl9GUkFNRSkKLWludCBEb2N1bWVudDo6d2Vi
a2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lKFBhc3NSZWZQdHI8UmVxdWVzdEFuaW1hdGlvbkZyYW1l
Q2FsbGJhY2s+IGNhbGxiYWNrKQordm9pZCBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjpy
ZW1vdmVTdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZShOb2RlKiBub2RlKQogewotICAgIGlmICghbV9z
Y3JpcHRlZEFuaW1hdGlvbkNvbnRyb2xsZXIpIHsKLSNpZiBVU0UoUkVRVUVTVF9BTklNQVRJT05f
RlJBTUVfRElTUExBWV9NT05JVE9SKQotICAgICAgICBtX3NjcmlwdGVkQW5pbWF0aW9uQ29udHJv
bGxlciA9IFNjcmlwdGVkQW5pbWF0aW9uQ29udHJvbGxlcjo6Y3JlYXRlKHRoaXMsIHBhZ2UoKSA/
IHBhZ2UoKS0+ZGlzcGxheUlEKCkgOiAwKTsKLSNlbHNlCi0gICAgICAgIG1fc2NyaXB0ZWRBbmlt
YXRpb25Db250cm9sbGVyID0gU2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyOjpjcmVhdGUodGhp
cywgMCk7Ci0jZW5kaWYKLSAgICAgICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHRoZSBQYWdlIG1h
eSBoYXZlIHN1c3BlbmRlZCBzY3JpcHRlZCBhbmltYXRpb25zIGJlZm9yZQotICAgICAgICAvLyB3
ZSB3ZXJlIGNyZWF0ZWQuIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgd2UgZG9uJ3Qgc3RhcnQg
dXAgdGhlIGFuaW1hdGlvbgotICAgICAgICAvLyBjb250cm9sbGVyIG9uIGEgYmFja2dyb3VuZCB0
YWIsIGZvciBleGFtcGxlLgotICAgICAgICBpZiAoIXBhZ2UoKSB8fCBwYWdlKCktPnNjcmlwdGVk
QW5pbWF0aW9uc1N1c3BlbmRlZCgpKQotICAgICAgICAgICAgbV9zY3JpcHRlZEFuaW1hdGlvbkNv
bnRyb2xsZXItPnN1c3BlbmQoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbV9zY3JpcHRlZEFuaW1h
dGlvbkNvbnRyb2xsZXItPnJlZ2lzdGVyQ2FsbGJhY2soY2FsbGJhY2spOworICAgIG1fc3R5bGVT
aGVldENhbmRpZGF0ZU5vZGVzLnJlbW92ZShub2RlKTsKIH0KIAotdm9pZCBEb2N1bWVudDo6d2Vi
a2l0Q2FuY2VsQW5pbWF0aW9uRnJhbWUoaW50IGlkKQordm9pZCBEb2N1bWVudFN0eWxlU2hlZXRD
b2xsZWN0aW9uOjpjb2xsZWN0QWN0aXZlU3R5bGVTaGVldHMoVmVjdG9yPFJlZlB0cjxTdHlsZVNo
ZWV0PiA+JiBzaGVldHMpCiB7Ci0gICAgaWYgKCFtX3NjcmlwdGVkQW5pbWF0aW9uQ29udHJvbGxl
cikKKyAgICBpZiAobV9kb2N1bWVudC0+c2V0dGluZ3MoKSAmJiAhbV9kb2N1bWVudC0+c2V0dGlu
Z3MoKS0+YXV0aG9yQW5kVXNlclN0eWxlc0VuYWJsZWQoKSkKICAgICAgICAgcmV0dXJuOwotICAg
IG1fc2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyLT5jYW5jZWxDYWxsYmFjayhpZCk7Ci19CiAK
LXZvaWQgRG9jdW1lbnQ6OnNlcnZpY2VTY3JpcHRlZEFuaW1hdGlvbnMoRE9NVGltZVN0YW1wIHRp
bWUpCi17Ci0gICAgaWYgKCFtX3NjcmlwdGVkQW5pbWF0aW9uQ29udHJvbGxlcikKLSAgICAgICAg
cmV0dXJuOwotICAgIG1fc2NyaXB0ZWRBbmltYXRpb25Db250cm9sbGVyLT5zZXJ2aWNlU2NyaXB0
ZWRBbmltYXRpb25zKHRpbWUpOwotfQorICAgIFN0eWxlU2hlZXRDYW5kaWRhdGVMaXN0SGFzaFNl
dDo6aXRlcmF0b3IgYmVnaW4gPSBtX3N0eWxlU2hlZXRDYW5kaWRhdGVOb2Rlcy5iZWdpbigpOwor
ICAgIFN0eWxlU2hlZXRDYW5kaWRhdGVMaXN0SGFzaFNldDo6aXRlcmF0b3IgZW5kID0gbV9zdHls
ZVNoZWV0Q2FuZGlkYXRlTm9kZXMuZW5kKCk7CisgICAgZm9yIChTdHlsZVNoZWV0Q2FuZGlkYXRl
TGlzdEhhc2hTZXQ6Oml0ZXJhdG9yIGl0ID0gYmVnaW47IGl0ICE9IGVuZDsgKytpdCkgeworICAg
ICAgICBOb2RlKiBuID0gKml0OworICAgICAgICBTdHlsZVNoZWV0KiBzaGVldCA9IDA7CisgICAg
ICAgIGlmIChuLT5ub2RlVHlwZSgpID09IE5vZGU6OlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9E
RSkgeworICAgICAgICAgICAgLy8gUHJvY2Vzc2luZyBpbnN0cnVjdGlvbiAoWE1MIGRvY3VtZW50
cyBvbmx5KS4KKyAgICAgICAgICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgbGlua2luZyB0byBlbWJl
ZGRlZCBDU1Mgc3R5bGVzaGVldHMsIHNlZSA8aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTQ5MjgxPiBmb3IgZGlzY3Vzc2lvbi4KKyAgICAgICAgICAgIFByb2Nlc3NpbmdJ
bnN0cnVjdGlvbiogcGkgPSBzdGF0aWNfY2FzdDxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24qPihuKTsK
KyAgICAgICAgICAgIHNoZWV0ID0gcGktPnNoZWV0KCk7CisjaWYgRU5BQkxFKFhTTFQpCisgICAg
ICAgICAgICAvLyBEb24ndCBhcHBseSBYU0wgdHJhbnNmb3JtcyB0byBhbHJlYWR5IHRyYW5zZm9y
bWVkIGRvY3VtZW50cyAtLSA8cmRhcjovL3Byb2JsZW0vNDEzMjgwNj4KKyAgICAgICAgICAgIGlm
IChwaS0+aXNYU0woKSAmJiAhbV9kb2N1bWVudC0+dHJhbnNmb3JtU291cmNlRG9jdW1lbnQoKSkg
eworICAgICAgICAgICAgICAgIC8vIERvbid0IGFwcGx5IFhTTCB0cmFuc2Zvcm1zIHVudGlsIGxv
YWRpbmcgaXMgZmluaXNoZWQuCisgICAgICAgICAgICAgICAgaWYgKCFtX2RvY3VtZW50LT5wYXJz
aW5nKCkpCisgICAgICAgICAgICAgICAgICAgIG1fZG9jdW1lbnQtPmFwcGx5WFNMVHJhbnNmb3Jt
KHBpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CiAjZW5kaWYKLQot
I2lmIEVOQUJMRShUT1VDSF9FVkVOVFMpCi1QYXNzUmVmUHRyPFRvdWNoPiBEb2N1bWVudDo6Y3Jl
YXRlVG91Y2goRE9NV2luZG93KiB3aW5kb3csIEV2ZW50VGFyZ2V0KiB0YXJnZXQsIGludCBpZGVu
dGlmaWVyLCBpbnQgcGFnZVgsIGludCBwYWdlWSwgaW50IHNjcmVlblgsIGludCBzY3JlZW5ZLCBp
bnQgcmFkaXVzWCwgaW50IHJhZGl1c1ksIGZsb2F0IHJvdGF0aW9uQW5nbGUsIGZsb2F0IGZvcmNl
LCBFeGNlcHRpb25Db2RlJikgY29uc3QKLXsKLSAgICAvLyBGSVhNRTogSXQncyBub3QgY2xlYXIg
ZnJvbSB0aGUgZG9jdW1lbnRhdGlvbiBhdAotICAgIC8vIGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUu
Y29tL2xpYnJhcnkvc2FmYXJpLyNkb2N1bWVudGF0aW9uL1VzZXJFeHBlcmllbmNlL1JlZmVyZW5j
ZS9Eb2N1bWVudEFkZGl0aW9uc1JlZmVyZW5jZS9Eb2N1bWVudEFkZGl0aW9ucy9Eb2N1bWVudEFk
ZGl0aW9ucy5odG1sCi0gICAgLy8gd2hlbiB0aGlzIG1ldGhvZCBzaG91bGQgdGhyb3cgYW5kIG5v
ciBpcyBpdCBieSBpbnNwZWN0aW9uIG9mIGlPUyBiZWhhdmlvci4gSXQgd291bGQgYmUgbmljZSB0
byB2ZXJpZnkgYW55IGNhc2VzIHdoZXJlIGl0IHRocm93cyB1bmRlciBpT1MKLSAgICAvLyBhbmQg
aW1wbGVtZW50IHRoZW0gaGVyZS4gU2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD00NzgxOQotICAgIEZyYW1lKiBmcmFtZSA9IHdpbmRvdyA/IHdpbmRvdy0+ZnJhbWUo
KSA6IHRoaXMtPmZyYW1lKCk7Ci0gICAgcmV0dXJuIFRvdWNoOjpjcmVhdGUoZnJhbWUsIHRhcmdl
dCwgaWRlbnRpZmllciwgc2NyZWVuWCwgc2NyZWVuWSwgcGFnZVgsIHBhZ2VZLCByYWRpdXNYLCBy
YWRpdXNZLCByb3RhdGlvbkFuZ2xlLCBmb3JjZSk7Ci19CisgICAgICAgIH0gZWxzZSBpZiAoKG4t
PmlzSFRNTEVsZW1lbnQoKSAmJiAobi0+aGFzVGFnTmFtZShsaW5rVGFnKSB8fCBuLT5oYXNUYWdO
YW1lKHN0eWxlVGFnKSkpCisjaWYgRU5BQkxFKFNWRykKKyAgICAgICAgICAgICAgICAgICB8fCAg
KG4tPmlzU1ZHRWxlbWVudCgpICYmIG4tPmhhc1RhZ05hbWUoU1ZHTmFtZXM6OnN0eWxlVGFnKSkK
ICNlbmRpZgotCi1zdGF0aWMgdm9pZCB3aGVlbEV2ZW50SGFuZGxlckNvdW50Q2hhbmdlZChEb2N1
bWVudCogZG9jdW1lbnQpCi17Ci0gICAgUGFnZSogcGFnZSA9IGRvY3VtZW50LT5wYWdlKCk7Ci0g
ICAgaWYgKCFwYWdlKQotICAgICAgICByZXR1cm47Ci0KLSAgICBTY3JvbGxpbmdDb29yZGluYXRv
ciogc2Nyb2xsaW5nQ29vcmRpbmF0b3IgPSBwYWdlLT5zY3JvbGxpbmdDb29yZGluYXRvcigpOwot
ICAgIGlmICghc2Nyb2xsaW5nQ29vcmRpbmF0b3IpCi0gICAgICAgIHJldHVybjsKLQotICAgIEZy
YW1lVmlldyogZnJhbWVWaWV3ID0gZG9jdW1lbnQtPnZpZXcoKTsKLSAgICBpZiAoIWZyYW1lVmll
dykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgc2Nyb2xsaW5nQ29vcmRpbmF0b3ItPmZyYW1lVmll
d1doZWVsRXZlbnRIYW5kbGVyQ291bnRDaGFuZ2VkKGZyYW1lVmlldyk7Ci19Ci0KLXZvaWQgRG9j
dW1lbnQ6OmRpZEFkZFdoZWVsRXZlbnRIYW5kbGVyKCkKLXsKLSAgICArK21fd2hlZWxFdmVudEhh
bmRsZXJDb3VudDsKLSAgICBGcmFtZSogbWFpbkZyYW1lID0gcGFnZSgpID8gcGFnZSgpLT5tYWlu
RnJhbWUoKSA6IDA7Ci0gICAgaWYgKG1haW5GcmFtZSkKLSAgICAgICAgbWFpbkZyYW1lLT5ub3Rp
ZnlDaHJvbWVDbGllbnRXaGVlbEV2ZW50SGFuZGxlckNvdW50Q2hhbmdlZCgpOwotCi0gICAgd2hl
ZWxFdmVudEhhbmRsZXJDb3VudENoYW5nZWQodGhpcyk7Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OmRp
ZFJlbW92ZVdoZWVsRXZlbnRIYW5kbGVyKCkKLXsKLSAgICBBU1NFUlQobV93aGVlbEV2ZW50SGFu
ZGxlckNvdW50ID4gMCk7Ci0gICAgLS1tX3doZWVsRXZlbnRIYW5kbGVyQ291bnQ7Ci0gICAgRnJh
bWUqIG1haW5GcmFtZSA9IHBhZ2UoKSA/IHBhZ2UoKS0+bWFpbkZyYW1lKCkgOiAwOwotICAgIGlm
IChtYWluRnJhbWUpCi0gICAgICAgIG1haW5GcmFtZS0+bm90aWZ5Q2hyb21lQ2xpZW50V2hlZWxF
dmVudEhhbmRsZXJDb3VudENoYW5nZWQoKTsKLQotICAgIHdoZWVsRXZlbnRIYW5kbGVyQ291bnRD
aGFuZ2VkKHRoaXMpOwotfQotCi12b2lkIERvY3VtZW50OjpkaWRBZGRUb3VjaEV2ZW50SGFuZGxl
cigpCi17Ci0jaWYgRU5BQkxFKFRPVUNIX0VWRU5UUykKLSAgICArK21fdG91Y2hFdmVudEhhbmRs
ZXJDb3VudDsKLSAgICBpZiAobV90b3VjaEV2ZW50SGFuZGxlckNvdW50ID4gMSkKLSAgICAgICAg
cmV0dXJuOwotICAgIGlmIChQYWdlKiBwYWdlID0gdGhpcy0+cGFnZSgpKQotICAgICAgICBwYWdl
LT5jaHJvbWUoKS0+Y2xpZW50KCktPm5lZWRUb3VjaEV2ZW50cyh0cnVlKTsKKyAgICAgICAgICAg
ICAgICAgICApIHsKKyAgICAgICAgICAgIEVsZW1lbnQqIGUgPSBzdGF0aWNfY2FzdDxFbGVtZW50
Kj4obik7CisgICAgICAgICAgICBBdG9taWNTdHJpbmcgdGl0bGUgPSBlLT5nZXRBdHRyaWJ1dGUo
dGl0bGVBdHRyKTsKKyAgICAgICAgICAgIGJvb2wgZW5hYmxlZFZpYVNjcmlwdCA9IGZhbHNlOwor
ICAgICAgICAgICAgaWYgKGUtPmhhc0xvY2FsTmFtZShsaW5rVGFnKSkgeworICAgICAgICAgICAg
ICAgIC8vIDxMSU5LPiBlbGVtZW50CisgICAgICAgICAgICAgICAgSFRNTExpbmtFbGVtZW50KiBs
aW5rRWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxMaW5rRWxlbWVudCo+KG4pOworICAgICAgICAg
ICAgICAgIGlmIChsaW5rRWxlbWVudC0+aXNEaXNhYmxlZCgpKQorICAgICAgICAgICAgICAgICAg
ICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBlbmFibGVkVmlhU2NyaXB0ID0gbGlua0VsZW1l
bnQtPmlzRW5hYmxlZFZpYVNjcmlwdCgpOworICAgICAgICAgICAgICAgIGlmIChsaW5rRWxlbWVu
dC0+c3R5bGVTaGVldElzTG9hZGluZygpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGl0IGlz
IGxvYWRpbmcgYnV0IHdlIHNob3VsZCBzdGlsbCBkZWNpZGUgd2hpY2ggc3R5bGUgc2hlZXQgc2V0
IHRvIHVzZQorICAgICAgICAgICAgICAgICAgICBpZiAoIWVuYWJsZWRWaWFTY3JpcHQgJiYgIXRp
dGxlLmlzRW1wdHkoKSAmJiBtX3ByZWZlcnJlZFN0eWxlc2hlZXRTZXROYW1lLmlzRW1wdHkoKSkg
eworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXRvbWljU3RyaW5nJiByZWwgPSBlLT5n
ZXRBdHRyaWJ1dGUocmVsQXR0cik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlbC5j
b250YWlucygiYWx0ZXJuYXRlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3By
ZWZlcnJlZFN0eWxlc2hlZXRTZXROYW1lID0gdGl0bGU7CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgbV9zZWxlY3RlZFN0eWxlc2hlZXRTZXROYW1lID0gdGl0bGU7CisgICAgICAgICAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAg
Y29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghbGlua0Vs
ZW1lbnQtPnNoZWV0KCkpCisgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gbnVsbEF0b207Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgcHJlZmVycmVkIHN0
eWxlc2V0LiBUaGlzIGlzIHRoZQorICAgICAgICAgICAgLy8gc2V0IG9mIHNoZWV0cyB0aGF0IHdp
bGwgYmUgZW5hYmxlZC4KKyNpZiBFTkFCTEUoU1ZHKQorICAgICAgICAgICAgaWYgKG4tPmlzU1ZH
RWxlbWVudCgpICYmIG4tPmhhc1RhZ05hbWUoU1ZHTmFtZXM6OnN0eWxlVGFnKSkKKyAgICAgICAg
ICAgICAgICBzaGVldCA9IHN0YXRpY19jYXN0PFNWR1N0eWxlRWxlbWVudCo+KG4pLT5zaGVldCgp
OworICAgICAgICAgICAgZWxzZQogI2VuZGlmCi19Ci0KLXZvaWQgRG9jdW1lbnQ6OmRpZFJlbW92
ZVRvdWNoRXZlbnRIYW5kbGVyKCkKLXsKLSNpZiBFTkFCTEUoVE9VQ0hfRVZFTlRTKQotICAgIEFT
U0VSVChtX3RvdWNoRXZlbnRIYW5kbGVyQ291bnQpOwotICAgIC0tbV90b3VjaEV2ZW50SGFuZGxl
ckNvdW50OwotICAgIGlmIChtX3RvdWNoRXZlbnRIYW5kbGVyQ291bnQpCi0gICAgICAgIHJldHVy
bjsKKyAgICAgICAgICAgIGlmIChlLT5oYXNMb2NhbE5hbWUobGlua1RhZykpCisgICAgICAgICAg
ICAgICAgc2hlZXQgPSBzdGF0aWNfY2FzdDxIVE1MTGlua0VsZW1lbnQqPihuKS0+c2hlZXQoKTsK
KyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAvLyA8U1RZTEU+IGVsZW1lbnQKKyAg
ICAgICAgICAgICAgICBzaGVldCA9IHN0YXRpY19jYXN0PEhUTUxTdHlsZUVsZW1lbnQqPihuKS0+
c2hlZXQoKTsKKyAgICAgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGlzIHNoZWV0IGJlbG9u
Z3MgdG8gYSBzdHlsZXNldAorICAgICAgICAgICAgLy8gKHRodXMgbWFraW5nIGl0IFBSRUZFUlJF
RCBvciBBTFRFUk5BVEUgcmF0aGVyIHRoYW4KKyAgICAgICAgICAgIC8vIFBFUlNJU1RFTlQpLgor
ICAgICAgICAgICAgQXRvbWljU3RyaW5nIHJlbCA9IGUtPmdldEF0dHJpYnV0ZShyZWxBdHRyKTsK
KyAgICAgICAgICAgIGlmICghZW5hYmxlZFZpYVNjcmlwdCAmJiAhdGl0bGUuaXNFbXB0eSgpKSB7
CisgICAgICAgICAgICAgICAgLy8gWWVzLCB3ZSBoYXZlIGEgdGl0bGUuCisgICAgICAgICAgICAg
ICAgaWYgKG1fcHJlZmVycmVkU3R5bGVzaGVldFNldE5hbWUuaXNFbXB0eSgpKSB7CisgICAgICAg
ICAgICAgICAgICAgIC8vIE5vIHByZWZlcnJlZCBzZXQgaGFzIGJlZW4gZXN0YWJsaXNoZWQuIElm
CisgICAgICAgICAgICAgICAgICAgIC8vIHdlIGFyZSBOT1QgYW4gYWx0ZXJuYXRlIHNoZWV0LCB0
aGVuIGVzdGFibGlzaAorICAgICAgICAgICAgICAgICAgICAvLyB1cyBhcyB0aGUgcHJlZmVycmVk
IHNldC4gT3RoZXJ3aXNlLCBqdXN0IGlnbm9yZQorICAgICAgICAgICAgICAgICAgICAvLyB0aGlz
IHNoZWV0LgorICAgICAgICAgICAgICAgICAgICBpZiAoZS0+aGFzTG9jYWxOYW1lKHN0eWxlVGFn
KSB8fCAhcmVsLmNvbnRhaW5zKCJhbHRlcm5hdGUiKSkKKyAgICAgICAgICAgICAgICAgICAgICAg
IG1fcHJlZmVycmVkU3R5bGVzaGVldFNldE5hbWUgPSBtX3NlbGVjdGVkU3R5bGVzaGVldFNldE5h
bWUgPSB0aXRsZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHRpdGxl
ICE9IG1fcHJlZmVycmVkU3R5bGVzaGVldFNldE5hbWUpCisgICAgICAgICAgICAgICAgICAgIHNo
ZWV0ID0gMDsKKyAgICAgICAgICAgIH0KIAotICAgIFBhZ2UqIHBhZ2UgPSB0aGlzLT5wYWdlKCk7
Ci0gICAgaWYgKCFwYWdlKQotICAgICAgICByZXR1cm47Ci0gICAgZm9yIChjb25zdCBGcmFtZSog
ZnJhbWUgPSBwYWdlLT5tYWluRnJhbWUoKTsgZnJhbWU7IGZyYW1lID0gZnJhbWUtPnRyZWUoKS0+
dHJhdmVyc2VOZXh0KCkpIHsKLSAgICAgICAgaWYgKGZyYW1lLT5kb2N1bWVudCgpICYmIGZyYW1l
LT5kb2N1bWVudCgpLT50b3VjaEV2ZW50SGFuZGxlckNvdW50KCkpCi0gICAgICAgICAgICByZXR1
cm47CisgICAgICAgICAgICBpZiAocmVsLmNvbnRhaW5zKCJhbHRlcm5hdGUiKSAmJiB0aXRsZS5p
c0VtcHR5KCkpCisgICAgICAgICAgICAgICAgc2hlZXQgPSAwOworICAgICAgICB9CisgICAgICAg
IGlmIChzaGVldCkKKyAgICAgICAgICAgIHNoZWV0cy5hcHBlbmQoc2hlZXQpOwogICAgIH0KLSAg
ICBwYWdlLT5jaHJvbWUoKS0+Y2xpZW50KCktPm5lZWRUb3VjaEV2ZW50cyhmYWxzZSk7Ci0jZW5k
aWYKLX0KLQotSFRNTElGcmFtZUVsZW1lbnQqIERvY3VtZW50OjpzZWFtbGVzc1BhcmVudElGcmFt
ZSgpIGNvbnN0Ci17Ci0gICAgaWYgKCFzaG91bGREaXNwbGF5U2VhbWxlc3NseVdpdGhQYXJlbnQo
KSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBIVE1MRnJhbWVPd25lckVsZW1lbnQqIG93bmVy
RWxlbWVudCA9IHRoaXMtPm93bmVyRWxlbWVudCgpOwotICAgIEFTU0VSVChvd25lckVsZW1lbnQt
Pmhhc1RhZ05hbWUoaWZyYW1lVGFnKSk7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PEhUTUxJRnJh
bWVFbGVtZW50Kj4ob3duZXJFbGVtZW50KTsKIH0KIAotYm9vbCBEb2N1bWVudDo6c2hvdWxkRGlz
cGxheVNlYW1sZXNzbHlXaXRoUGFyZW50KCkgY29uc3QKK2Jvb2wgRG9jdW1lbnRTdHlsZVNoZWV0
Q29sbGVjdGlvbjo6dGVzdEFkZGVkU3R5bGVTaGVldFJlcXVpcmVzU3R5bGVSZWNhbGMoU3R5bGVT
aGVldENvbnRlbnRzKiBzdHlsZXNoZWV0KQogewotI2lmIEVOQUJMRShJRlJBTUVfU0VBTUxFU1Mp
Ci0gICAgSFRNTEZyYW1lT3duZXJFbGVtZW50KiBvd25lckVsZW1lbnQgPSB0aGlzLT5vd25lckVs
ZW1lbnQoKTsKLSAgICBpZiAoIW93bmVyRWxlbWVudCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgIHJldHVybiBtX21heURpc3BsYXlTZWFtbGVzc1dpdGhQYXJlbnQgJiYgb3duZXJFbGVtZW50
LT5oYXNUYWdOYW1lKGlmcmFtZVRhZykgJiYgb3duZXJFbGVtZW50LT5mYXN0SGFzQXR0cmlidXRl
KHNlYW1sZXNzQXR0cik7Ci0jZWxzZQorICAgIC8vIFNlZSBpZiBhbGwgcnVsZXMgb24gdGhlIHNo
ZWV0IGFyZSBzY29wZWQgdG8gc29tZSBzcGVjaWZpYyBpZHMgb3IgY2xhc3Nlcy4KKyAgICAvLyBU
aGVuIHRlc3QgaWYgd2UgYWN0dWFsbHkgaGF2ZSBhbnkgb2YgdGhvc2UgaW4gdGhlIHRyZWUgYXQg
dGhlIG1vbWVudC4KKyAgICBIYXNoU2V0PEF0b21pY1N0cmluZ0ltcGwqPiBpZFNjb3BlczsgCisg
ICAgSGFzaFNldDxBdG9taWNTdHJpbmdJbXBsKj4gY2xhc3NTY29wZXM7CisgICAgaWYgKCFTdHls
ZVJlc29sdmVyOjpkZXRlcm1pbmVTdHlsZXNoZWV0U2VsZWN0b3JTY29wZXMoc3R5bGVzaGVldCwg
aWRTY29wZXMsIGNsYXNzU2NvcGVzKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgLy8gSW52
YWxpZGF0ZSB0aGUgc3VidHJlZXMgdGhhdCBtYXRjaCB0aGUgc2NvcGVzLgorICAgIE5vZGUqIG5v
ZGUgPSBtX2RvY3VtZW50LT5maXJzdENoaWxkKCk7CisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAg
ICAgaWYgKCFub2RlLT5pc1N0eWxlZEVsZW1lbnQoKSkgeworICAgICAgICAgICAgbm9kZSA9IG5v
ZGUtPnRyYXZlcnNlTmV4dE5vZGUoKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9
CisgICAgICAgIFN0eWxlZEVsZW1lbnQqIGVsZW1lbnQgPSBzdGF0aWNfY2FzdDxTdHlsZWRFbGVt
ZW50Kj4obm9kZSk7CisgICAgICAgIGlmIChTZWxlY3RvckNoZWNrZXI6OmVsZW1lbnRNYXRjaGVz
U2VsZWN0b3JTY29wZXMoZWxlbWVudCwgaWRTY29wZXMsIGNsYXNzU2NvcGVzKSkgeworICAgICAg
ICAgICAgZWxlbWVudC0+c2V0TmVlZHNTdHlsZVJlY2FsYygpOworICAgICAgICAgICAgLy8gVGhl
IHdob2xlIHN1YnRyZWUgaXMgbm93IGludmFsaWRhdGVkLCB3ZSBjYW4gc2tpcCB0byB0aGUgbmV4
dCBzaWJsaW5nLgorICAgICAgICAgICAgbm9kZSA9IG5vZGUtPnRyYXZlcnNlTmV4dFNpYmxpbmco
KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIG5vZGUgPSBub2Rl
LT50cmF2ZXJzZU5leHROb2RlKCk7CisgICAgfQogICAgIHJldHVybiBmYWxzZTsKLSNlbmRpZgog
fQogCi1Eb2N1bWVudExvYWRlciogRG9jdW1lbnQ6OmxvYWRlcigpIGNvbnN0Cit2b2lkIERvY3Vt
ZW50U3R5bGVTaGVldENvbGxlY3Rpb246OmFuYWx5emVTdHlsZVNoZWV0Q2hhbmdlKFVwZGF0ZUZs
YWcgdXBkYXRlRmxhZywgY29uc3QgVmVjdG9yPFJlZlB0cjxTdHlsZVNoZWV0PiA+JiBuZXdTdHls
ZXNoZWV0cywgYm9vbCYgcmVxdWlyZXNTdHlsZVJlc29sdmVyUmVzZXQsIGJvb2wmIHJlcXVpcmVz
RnVsbFN0eWxlUmVjYWxjKQogewotICAgIGlmICghbV9mcmFtZSkKLSAgICAgICAgcmV0dXJuIDA7
Ci0gICAgCi0gICAgRG9jdW1lbnRMb2FkZXIqIGxvYWRlciA9IG1fZnJhbWUtPmxvYWRlcigpLT5k
b2N1bWVudExvYWRlcigpOwotICAgIGlmICghbG9hZGVyKQotICAgICAgICByZXR1cm4gMDsKLSAg
ICAKLSAgICBpZiAobV9mcmFtZS0+ZG9jdW1lbnQoKSAhPSB0aGlzKQotICAgICAgICByZXR1cm4g
MDsKKyAgICByZXF1aXJlc1N0eWxlUmVzb2x2ZXJSZXNldCA9IHRydWU7CisgICAgcmVxdWlyZXNG
dWxsU3R5bGVSZWNhbGMgPSB0cnVlOwogICAgIAotICAgIHJldHVybiBsb2FkZXI7Ci19Ci0KLSNp
ZiBFTkFCTEUoTUlDUk9EQVRBKQotUGFzc1JlZlB0cjxOb2RlTGlzdD4gRG9jdW1lbnQ6OmdldEl0
ZW1zKGNvbnN0IFN0cmluZyYgdHlwZU5hbWVzKQotewotICAgIC8vIFNpbmNlIGRvY3VtZXQuZ2V0
SXRlbSgpIGlzIGFsbG93ZWQgZm9yIG1pY3JvZGF0YSwgdHlwZU5hbWVzIHdpbGwgYmUgbnVsbCBz
dHJpbmcuCi0gICAgLy8gSW4gdGhpcyBjYXNlIHdlIG5lZWQgdG8gY3JlYXRlIGFuIGVtcHR5IHN0
cmluZyBpZGVudGlmaWVyIHRvIG1hcCBzdWNoIHJlcXVlc3QgaW4gdGhlIGNhY2hlLgotICAgIFN0
cmluZyBsb2NhbFR5cGVOYW1lcyA9IHR5cGVOYW1lcy5pc051bGwoKSA/IE1pY3JvRGF0YUl0ZW1M
aXN0Ojp1bmRlZmluZWRJdGVtVHlwZSgpIDogdHlwZU5hbWVzOwotCi0gICAgcmV0dXJuIGVuc3Vy
ZVJhcmVEYXRhKCktPmVuc3VyZU5vZGVMaXN0cygpLT5hZGRDYWNoZVdpdGhOYW1lPE1pY3JvRGF0
YUl0ZW1MaXN0Pih0aGlzLCBEeW5hbWljTm9kZUxpc3Q6Ok1pY3JvRGF0YUl0ZW1MaXN0VHlwZSwg
bG9jYWxUeXBlTmFtZXMpOwotfQotI2VuZGlmCi0KLUludFNpemUgRG9jdW1lbnQ6OnZpZXdwb3J0
U2l6ZSgpIGNvbnN0Ci17Ci0gICAgaWYgKCF2aWV3KCkpCi0gICAgICAgIHJldHVybiBJbnRTaXpl
KCk7Ci0gICAgcmV0dXJuIHZpZXcoKS0+dmlzaWJsZUNvbnRlbnRSZWN0KC8qIGluY2x1ZGVTY3Jv
bGxiYXJzICovIHRydWUpLnNpemUoKTsKLX0KLQotTm9kZSogZXZlbnRUYXJnZXROb2RlRm9yRG9j
dW1lbnQoRG9jdW1lbnQqIGRvYykKLXsKLSAgICBpZiAoIWRvYykKLSAgICAgICAgcmV0dXJuIDA7
Ci0gICAgTm9kZSogbm9kZSA9IGRvYy0+Zm9jdXNlZE5vZGUoKTsKLSAgICBpZiAoIW5vZGUgJiYg
ZG9jLT5pc1BsdWdpbkRvY3VtZW50KCkpIHsKLSAgICAgICAgUGx1Z2luRG9jdW1lbnQqIHBsdWdp
bkRvY3VtZW50ID0gc3RhdGljX2Nhc3Q8UGx1Z2luRG9jdW1lbnQqPihkb2MpOwotICAgICAgICBu
b2RlID0gIHBsdWdpbkRvY3VtZW50LT5wbHVnaW5Ob2RlKCk7CisgICAgLy8gU3R5bGVzaGVldHMg
b2YgPHN0eWxlPiBlbGVtZW50cyB0aGF0IEBpbXBvcnQgc3R5bGVzaGVldHMgYXJlIGFjdGl2ZSBi
dXQgbG9hZGluZy4gV2UgbmVlZCB0byB0cmlnZ2VyIGEgZnVsbCByZWNhbGMgd2hlbiBzdWNoIGxv
YWRzIGFyZSBkb25lLgorICAgIGJvb2wgaGFzQWN0aXZlTG9hZGluZ1N0eWxlc2hlZXQgPSBmYWxz
ZTsKKyAgICB1bnNpZ25lZCBuZXdTdHlsZXNoZWV0Q291bnQgPSBuZXdTdHlsZXNoZWV0cy5zaXpl
KCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5ld1N0eWxlc2hlZXRDb3VudDsgKytp
KSB7CisgICAgICAgIGlmIChuZXdTdHlsZXNoZWV0c1tpXS0+aXNMb2FkaW5nKCkpCisgICAgICAg
ICAgICBoYXNBY3RpdmVMb2FkaW5nU3R5bGVzaGVldCA9IHRydWU7CiAgICAgfQotICAgIGlmICgh
bm9kZSAmJiBkb2MtPmlzSFRNTERvY3VtZW50KCkpCi0gICAgICAgIG5vZGUgPSBkb2MtPmJvZHko
KTsKLSAgICBpZiAoIW5vZGUpCi0gICAgICAgIG5vZGUgPSBkb2MtPmRvY3VtZW50RWxlbWVudCgp
OwotICAgIHJldHVybiBub2RlOwotfQorICAgIGlmIChtX2hhZEFjdGl2ZUxvYWRpbmdTdHlsZXNo
ZWV0ICYmICFoYXNBY3RpdmVMb2FkaW5nU3R5bGVzaGVldCkgeworICAgICAgICBtX2hhZEFjdGl2
ZUxvYWRpbmdTdHlsZXNoZWV0ID0gZmFsc2U7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAg
bV9oYWRBY3RpdmVMb2FkaW5nU3R5bGVzaGVldCA9IGhhc0FjdGl2ZUxvYWRpbmdTdHlsZXNoZWV0
OwogCi12b2lkIERvY3VtZW50OjphZGp1c3RGbG9hdFF1YWRzRm9yU2Nyb2xsQW5kQWJzb2x1dGVa
b29tQW5kRnJhbWVTY2FsZShWZWN0b3I8RmxvYXRRdWFkPiYgcXVhZHMsIFJlbmRlck9iamVjdCog
cmVuZGVyZXIpCi17Ci0gICAgaWYgKCF2aWV3KCkpCisgICAgaWYgKHVwZGF0ZUZsYWcgIT0gT3B0
aW1pemVkVXBkYXRlKQorICAgICAgICByZXR1cm47CisgICAgaWYgKCFtX2RvY3VtZW50LT5zdHls
ZVJlc29sdmVySWZFeGlzdHMoKSkKICAgICAgICAgcmV0dXJuOwogCi0gICAgZmxvYXQgaW52ZXJz
ZUZyYW1lU2NhbGUgPSAxOwotICAgIGlmIChmcmFtZSgpKQotICAgICAgICBpbnZlcnNlRnJhbWVT
Y2FsZSA9IDEgLyBmcmFtZSgpLT5mcmFtZVNjYWxlRmFjdG9yKCk7Ci0KLSAgICBMYXlvdXRSZWN0
IHZpc2libGVDb250ZW50UmVjdCA9IHZpZXcoKS0+dmlzaWJsZUNvbnRlbnRSZWN0KCk7Ci0gICAg
Zm9yIChzaXplX3QgaSA9IDA7IGkgPCBxdWFkcy5zaXplKCk7ICsraSkgewotICAgICAgICBxdWFk
c1tpXS5tb3ZlKC12aXNpYmxlQ29udGVudFJlY3QueCgpLCAtdmlzaWJsZUNvbnRlbnRSZWN0Lnko
KSk7Ci0gICAgICAgIGFkanVzdEZsb2F0UXVhZEZvckFic29sdXRlWm9vbShxdWFkc1tpXSwgcmVu
ZGVyZXIpOwotICAgICAgICBpZiAoaW52ZXJzZUZyYW1lU2NhbGUgIT0gMSkKLSAgICAgICAgICAg
IHF1YWRzW2ldLnNjYWxlKGludmVyc2VGcmFtZVNjYWxlLCBpbnZlcnNlRnJhbWVTY2FsZSk7Cisg
ICAgLy8gU2VlIGlmIHdlIGFyZSBqdXN0IGFkZGluZyBzdHlsZXNoZWV0cy4KKyAgICB1bnNpZ25l
ZCBvbGRTdHlsZXNoZWV0Q291bnQgPSBtX2F1dGhvclN0eWxlU2hlZXRzLT5sZW5ndGgoKTsKKyAg
ICBpZiAobmV3U3R5bGVzaGVldENvdW50IDwgb2xkU3R5bGVzaGVldENvdW50KQorICAgICAgICBy
ZXR1cm47CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG9sZFN0eWxlc2hlZXRDb3VudDsg
KytpKSB7CisgICAgICAgIGlmIChtX2F1dGhvclN0eWxlU2hlZXRzLT5pdGVtKGkpICE9IG5ld1N0
eWxlc2hlZXRzW2ldKQorICAgICAgICAgICAgcmV0dXJuOwogICAgIH0KLX0KKyAgICByZXF1aXJl
c1N0eWxlUmVzb2x2ZXJSZXNldCA9IGZhbHNlOwogCi12b2lkIERvY3VtZW50OjphZGp1c3RGbG9h
dFJlY3RGb3JTY3JvbGxBbmRBYnNvbHV0ZVpvb21BbmRGcmFtZVNjYWxlKEZsb2F0UmVjdCYgcmVj
dCwgUmVuZGVyT2JqZWN0KiByZW5kZXJlcikKLXsKLSAgICBpZiAoIXZpZXcoKSkKKyAgICAvLyBJ
ZiB3ZSBhcmUgYWxyZWFkeSBwYXJzaW5nIHRoZSBib2R5IGFuZCBzbyBtYXkgaGF2ZSBzaWduaWZp
Y2FudCBhbW91bnQgb2YgZWxlbWVudHMsIHB1dCBzb21lIGVmZm9ydCBpbnRvIHRyeWluZyB0byBh
dm9pZCBzdHlsZSByZWNhbGNzLgorICAgIGlmICghbV9kb2N1bWVudC0+Ym9keSgpIHx8IG1fZG9j
dW1lbnQtPmhhc05vZGVzV2l0aFBsYWNlaG9sZGVyU3R5bGUoKSkKICAgICAgICAgcmV0dXJuOwot
Ci0gICAgZmxvYXQgaW52ZXJzZUZyYW1lU2NhbGUgPSAxOwotICAgIGlmIChmcmFtZSgpKQotICAg
ICAgICBpbnZlcnNlRnJhbWVTY2FsZSA9IDEgLyBmcmFtZSgpLT5mcmFtZVNjYWxlRmFjdG9yKCk7
Ci0KLSAgICBMYXlvdXRSZWN0IHZpc2libGVDb250ZW50UmVjdCA9IHZpZXcoKS0+dmlzaWJsZUNv
bnRlbnRSZWN0KCk7Ci0gICAgcmVjdC5tb3ZlKC12aXNpYmxlQ29udGVudFJlY3QueCgpLCAtdmlz
aWJsZUNvbnRlbnRSZWN0LnkoKSk7Ci0gICAgYWRqdXN0RmxvYXRSZWN0Rm9yQWJzb2x1dGVab29t
KHJlY3QsIHJlbmRlcmVyKTsKLSAgICBpZiAoaW52ZXJzZUZyYW1lU2NhbGUgIT0gMSkKLSAgICAg
ICAgcmVjdC5zY2FsZShpbnZlcnNlRnJhbWVTY2FsZSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0g
b2xkU3R5bGVzaGVldENvdW50OyBpIDwgbmV3U3R5bGVzaGVldENvdW50OyArK2kpIHsKKyAgICAg
ICAgaWYgKCFuZXdTdHlsZXNoZWV0c1tpXS0+aXNDU1NTdHlsZVNoZWV0KCkpCisgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgIGlmIChuZXdTdHlsZXNoZWV0c1tpXS0+ZGlzYWJsZWQoKSkKKyAg
ICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAodGVzdEFkZGVkU3R5bGVTaGVldFJlcXVp
cmVzU3R5bGVSZWNhbGMoc3RhdGljX2Nhc3Q8Q1NTU3R5bGVTaGVldCo+KG5ld1N0eWxlc2hlZXRz
W2ldLmdldCgpKS0+Y29udGVudHMoKSkpCisgICAgICAgICAgICByZXR1cm47CisgICAgfQorICAg
IHJlcXVpcmVzRnVsbFN0eWxlUmVjYWxjID0gZmFsc2U7CiB9CiAKLXZvaWQgRG9jdW1lbnQ6OnNl
dENvbnRleHRGZWF0dXJlcyhQYXNzUmVmUHRyPENvbnRleHRGZWF0dXJlcz4gZmVhdHVyZXMpCitz
dGF0aWMgYm9vbCBzdHlsZVNoZWV0c1VzZVJlbVVuaXRzKGNvbnN0IFZlY3RvcjxSZWZQdHI8U3R5
bGVTaGVldD4gPiYgc2hlZXRzKQogewotICAgIG1fY29udGV4dEZlYXR1cmVzID0gZmVhdHVyZXM7
CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNoZWV0cy5zaXplKCk7ICsraSkgeworICAg
ICAgICBpZiAoIXNoZWV0c1tpXS0+aXNDU1NTdHlsZVNoZWV0KCkpCisgICAgICAgICAgICBjb250
aW51ZTsKKyAgICAgICAgaWYgKHN0YXRpY19jYXN0PENTU1N0eWxlU2hlZXQqPihzaGVldHNbaV0u
Z2V0KCkpLT5jb250ZW50cygpLT51c2VzUmVtVW5pdHMoKSkKKyAgICAgICAgICAgIHJldHVybiB0
cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyBSZW5kZXJPYmplY3Qq
IG5lYXJlc3RDb21tb25Ib3ZlckFuY2VzdG9yKFJlbmRlck9iamVjdCogb2JqMSwgUmVuZGVyT2Jq
ZWN0KiBvYmoyKQorYm9vbCBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjp1cGRhdGVBY3Rp
dmVTdHlsZVNoZWV0cyhVcGRhdGVGbGFnIHVwZGF0ZUZsYWcpCiB7Ci0gICAgaWYgKCFvYmoxIHx8
ICFvYmoyKQotICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAobV9kb2N1bWVudC0+aW5TdHlsZVJl
Y2FsYygpKSB7CisgICAgICAgIC8vIFNWRyA8dXNlPiBlbGVtZW50IG1heSBtYW5hZ2UgdG8gaW52
YWxpZGF0ZSBzdHlsZSBzZWxlY3RvciBpbiB0aGUgbWlkZGxlIG9mIGEgc3R5bGUgcmVjYWxjLgor
ICAgICAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTQzNDQK
KyAgICAgICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIGJlIGZpeGVkIGluIFNWRyBhbmQgdGhlIGNh
bGwgc2l0ZSByZXBsYWNlZCBieSBBU1NFUlQoIW1faW5TdHlsZVJlY2FsYykuCisgICAgICAgIG1f
bmVlZHNVcGRhdGVBY3RpdmVTdHlsZXNoZWV0c09uU3R5bGVSZWNhbGMgPSB0cnVlOworICAgICAg
ICBtX2RvY3VtZW50LT5zY2hlZHVsZUZvcmNlZFN0eWxlUmVjYWxjKCk7CisgICAgICAgIHJldHVy
biBmYWxzZTsKIAotICAgIGZvciAoUmVuZGVyT2JqZWN0KiBjdXJyT2JqMSA9IG9iajE7IGN1cnJP
YmoxOyBjdXJyT2JqMSA9IGN1cnJPYmoxLT5ob3ZlckFuY2VzdG9yKCkpIHsKLSAgICAgICAgZm9y
IChSZW5kZXJPYmplY3QqIGN1cnJPYmoyID0gb2JqMjsgY3Vyck9iajI7IGN1cnJPYmoyID0gY3Vy
ck9iajItPmhvdmVyQW5jZXN0b3IoKSkgewotICAgICAgICAgICAgaWYgKGN1cnJPYmoxID09IGN1
cnJPYmoyKQotICAgICAgICAgICAgICAgIHJldHVybiBjdXJyT2JqMTsKLSAgICAgICAgfQogICAg
IH0KKyAgICBpZiAoIW1fZG9jdW1lbnQtPnJlbmRlcmVyKCkgfHwgIW1fZG9jdW1lbnQtPmF0dGFj
aGVkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgIHJldHVybiAwOwotfQotCi12b2lk
IERvY3VtZW50Ojp1cGRhdGVIb3ZlckFjdGl2ZVN0YXRlKGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiBy
ZXF1ZXN0LCBIaXRUZXN0UmVzdWx0JiByZXN1bHQpCi17Ci0gICAgLy8gV2UgZG9uJ3QgdXBkYXRl
IDpob3Zlci86YWN0aXZlIHN0YXRlIHdoZW4gdGhlIHJlc3VsdCBpcyBtYXJrZWQgYXMgcmVhZE9u
bHkuCi0gICAgaWYgKHJlcXVlc3QucmVhZE9ubHkoKSkKLSAgICAgICAgcmV0dXJuOworICAgIFN0
eWxlU2hlZXRWZWN0b3IgbmV3U3R5bGVzaGVldHM7CisgICAgY29sbGVjdEFjdGl2ZVN0eWxlU2hl
ZXRzKG5ld1N0eWxlc2hlZXRzKTsKIAotICAgIE5vZGUqIGlubmVyTm9kZUluRG9jdW1lbnQgPSBy
ZXN1bHQuaW5uZXJOb2RlKCk7Ci0gICAgQVNTRVJUKCFpbm5lck5vZGVJbkRvY3VtZW50IHx8IGlu
bmVyTm9kZUluRG9jdW1lbnQtPmRvY3VtZW50KCkgPT0gdGhpcyk7CisgICAgYm9vbCByZXF1aXJl
c1N0eWxlUmVzb2x2ZXJSZXNldDsKKyAgICBib29sIHJlcXVpcmVzRnVsbFN0eWxlUmVjYWxjOwor
ICAgIGFuYWx5emVTdHlsZVNoZWV0Q2hhbmdlKHVwZGF0ZUZsYWcsIG5ld1N0eWxlc2hlZXRzLCBy
ZXF1aXJlc1N0eWxlUmVzb2x2ZXJSZXNldCwgcmVxdWlyZXNGdWxsU3R5bGVSZWNhbGMpOwogCi0g
ICAgTm9kZSogb2xkQWN0aXZlTm9kZSA9IGFjdGl2ZU5vZGUoKTsKLSAgICBpZiAob2xkQWN0aXZl
Tm9kZSAmJiAhcmVxdWVzdC5hY3RpdmUoKSkgewotICAgICAgICAvLyBXZSBhcmUgY2xlYXJpbmcg
dGhlIDphY3RpdmUgY2hhaW4gYmVjYXVzZSB0aGUgbW91c2UgaGFzIGJlZW4gcmVsZWFzZWQuCi0g
ICAgICAgIGZvciAoUmVuZGVyT2JqZWN0KiBjdXJyID0gb2xkQWN0aXZlTm9kZS0+cmVuZGVyZXIo
KTsgY3VycjsgY3VyciA9IGN1cnItPnBhcmVudCgpKSB7Ci0gICAgICAgICAgICBpZiAoY3Vyci0+
bm9kZSgpICYmICFjdXJyLT5pc1RleHQoKSkgewotICAgICAgICAgICAgICAgIGN1cnItPm5vZGUo
KS0+c2V0QWN0aXZlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBjdXJyLT5ub2RlKCktPmNsZWFy
SW5BY3RpdmVDaGFpbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHNldEFj
dGl2ZU5vZGUoMCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgTm9kZSogbmV3QWN0aXZlTm9kZSA9
IGlubmVyTm9kZUluRG9jdW1lbnQ7Ci0gICAgICAgIGlmICghb2xkQWN0aXZlTm9kZSAmJiBuZXdB
Y3RpdmVOb2RlICYmIHJlcXVlc3QuYWN0aXZlKCkgJiYgIXJlcXVlc3QudG91Y2hNb3ZlKCkpIHsK
LSAgICAgICAgICAgIC8vIFdlIGFyZSBzZXR0aW5nIHRoZSA6YWN0aXZlIGNoYWluIGFuZCBmcmVl
emluZyBpdC4gSWYgZnV0dXJlIG1vdmVzIGhhcHBlbiwgdGhleQotICAgICAgICAgICAgLy8gd2ls
bCBuZWVkIHRvIHJlZmVyZW5jZSB0aGlzIGNoYWluLgotICAgICAgICAgICAgZm9yIChSZW5kZXJP
YmplY3QqIGN1cnIgPSBuZXdBY3RpdmVOb2RlLT5yZW5kZXJlcigpOyBjdXJyOyBjdXJyID0gY3Vy
ci0+cGFyZW50KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoY3Vyci0+bm9kZSgpICYmICFjdXJy
LT5pc1RleHQoKSkKLSAgICAgICAgICAgICAgICAgICAgY3Vyci0+bm9kZSgpLT5zZXRJbkFjdGl2
ZUNoYWluKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRBY3RpdmVOb2RlKG5ld0Fj
dGl2ZU5vZGUpOwotICAgICAgICB9Ci0gICAgfQotICAgIC8vIElmIHRoZSBtb3VzZSBoYXMganVz
dCBiZWVuIHByZXNzZWQsIHNldCA6YWN0aXZlIG9uIHRoZSBjaGFpbi4gVGhvc2UgKGFuZCBvbmx5
IHRob3NlKQotICAgIC8vIG5vZGVzIHNob3VsZCByZW1haW4gOmFjdGl2ZSB1bnRpbCB0aGUgbW91
c2UgaXMgcmVsZWFzZWQuCi0gICAgYm9vbCBhbGxvd0FjdGl2ZUNoYW5nZXMgPSAhb2xkQWN0aXZl
Tm9kZSAmJiBhY3RpdmVOb2RlKCk7Ci0KLSAgICAvLyBJZiB0aGUgbW91c2UgaXMgZG93biBhbmQg
aWYgdGhpcyBpcyBhIG1vdXNlIG1vdmUgZXZlbnQsIHdlIHdhbnQgdG8gcmVzdHJpY3QgY2hhbmdl
cyBpbgotICAgIC8vIDpob3Zlci86YWN0aXZlIHRvIG9ubHkgYXBwbHkgdG8gZWxlbWVudHMgdGhh
dCBhcmUgaW4gdGhlIDphY3RpdmUgY2hhaW4gdGhhdCB3ZSBmcm96ZQotICAgIC8vIGF0IHRoZSB0
aW1lIHRoZSBtb3VzZSB3ZW50IGRvd24uCi0gICAgYm9vbCBtdXN0QmVJbkFjdGl2ZUNoYWluID0g
cmVxdWVzdC5hY3RpdmUoKSAmJiByZXF1ZXN0Lm1vdmUoKTsKLQotICAgIFJlZlB0cjxOb2RlPiBv
bGRIb3Zlck5vZGUgPSBob3Zlck5vZGUoKTsKLSAgICAvLyBDbGVhciB0aGUgOmhvdmVyIGNoYWlu
IHdoZW4gdGhlIHRvdWNoIGdlc3R1cmUgaXMgb3Zlci4KLSAgICBpZiAocmVxdWVzdC50b3VjaFJl
bGVhc2UoKSkgewotICAgICAgICBpZiAob2xkSG92ZXJOb2RlKSB7Ci0gICAgICAgICAgICBmb3Ig
KFJlbmRlck9iamVjdCogY3VyciA9IG9sZEhvdmVyTm9kZS0+cmVuZGVyZXIoKTsgY3VycjsgY3Vy
ciA9IGN1cnItPmhvdmVyQW5jZXN0b3IoKSkgewotICAgICAgICAgICAgICAgIGlmIChjdXJyLT5u
b2RlKCkgJiYgIWN1cnItPmlzVGV4dCgpKQotICAgICAgICAgICAgICAgICAgICBjdXJyLT5ub2Rl
KCktPnNldEhvdmVyZWQoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0SG92
ZXJOb2RlKDApOwotICAgICAgICB9Ci0gICAgICAgIC8vIEEgdG91Y2ggcmVsZWFzZSBjYW4gbm90
IHNldCBuZXcgaG92ZXIgb3IgYWN0aXZlIHRhcmdldC4KLSAgICAgICAgcmV0dXJuOworICAgIGlm
IChyZXF1aXJlc1N0eWxlUmVzb2x2ZXJSZXNldCkKKyAgICAgICAgbV9kb2N1bWVudC0+Y2xlYXJT
dHlsZVJlc29sdmVyKCk7CisgICAgZWxzZSB7CisgICAgICAgIG1fZG9jdW1lbnQtPnN0eWxlUmVz
b2x2ZXIoKS0+YXBwZW5kQXV0aG9yU3R5bGVzaGVldHMobV9hdXRob3JTdHlsZVNoZWV0cy0+bGVu
Z3RoKCksIG5ld1N0eWxlc2hlZXRzKTsKKyAgICAgICAgcmVzZXRDU1NGZWF0dXJlRmxhZ3MoKTsK
ICAgICB9CisgICAgbV9hdXRob3JTdHlsZVNoZWV0cy0+c3dhcChuZXdTdHlsZXNoZWV0cyk7CiAK
LSAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIGhvdmVyZWQgbm9kZSBoYXMgY2hhbmdlZC4KLSAg
ICAvLyBJZiBpdCBoYXNuJ3QsIHdlIGRvIG5vdCBuZWVkIHRvIGRvIGFueXRoaW5nLgotICAgIE5v
ZGUqIG5ld0hvdmVyTm9kZSA9IGlubmVyTm9kZUluRG9jdW1lbnQ7Ci0gICAgd2hpbGUgKG5ld0hv
dmVyTm9kZSAmJiAhbmV3SG92ZXJOb2RlLT5yZW5kZXJlcigpKQotICAgICAgICBuZXdIb3Zlck5v
ZGUgPSBuZXdIb3Zlck5vZGUtPnBhcmVudE9ySG9zdE5vZGUoKTsKLQotICAgIC8vIFVwZGF0ZSBv
dXIgY3VycmVudCBob3ZlciBub2RlLgotICAgIHNldEhvdmVyTm9kZShuZXdIb3Zlck5vZGUpOwot
Ci0gICAgLy8gV2UgaGF2ZSB0d28gZGlmZmVyZW50IG9iamVjdHMuIEZldGNoIHRoZWlyIHJlbmRl
cmVycy4KLSAgICBSZW5kZXJPYmplY3QqIG9sZEhvdmVyT2JqID0gb2xkSG92ZXJOb2RlID8gb2xk
SG92ZXJOb2RlLT5yZW5kZXJlcigpIDogMDsKLSAgICBSZW5kZXJPYmplY3QqIG5ld0hvdmVyT2Jq
ID0gbmV3SG92ZXJOb2RlID8gbmV3SG92ZXJOb2RlLT5yZW5kZXJlcigpIDogMDsKLQotICAgIC8v
IExvY2F0ZSB0aGUgY29tbW9uIGFuY2VzdG9yIHJlbmRlciBvYmplY3QgZm9yIHRoZSB0d28gcmVu
ZGVyZXJzLgotICAgIFJlbmRlck9iamVjdCogYW5jZXN0b3IgPSBuZWFyZXN0Q29tbW9uSG92ZXJB
bmNlc3RvcihvbGRIb3Zlck9iaiwgbmV3SG92ZXJPYmopOwotCi0gICAgVmVjdG9yPFJlZlB0cjxO
b2RlPiwgMzI+IG5vZGVzVG9SZW1vdmVGcm9tQ2hhaW47Ci0gICAgVmVjdG9yPFJlZlB0cjxOb2Rl
PiwgMzI+IG5vZGVzVG9BZGRUb0NoYWluOwotCi0gICAgaWYgKG9sZEhvdmVyT2JqICE9IG5ld0hv
dmVyT2JqKSB7Ci0gICAgICAgIC8vIFRoZSBvbGQgaG92ZXIgcGF0aCBvbmx5IG5lZWRzIHRvIGJl
IGNsZWFyZWQgdXAgdG8gKGFuZCBub3QgaW5jbHVkaW5nKSB0aGUgY29tbW9uIGFuY2VzdG9yOwot
ICAgICAgICBmb3IgKFJlbmRlck9iamVjdCogY3VyciA9IG9sZEhvdmVyT2JqOyBjdXJyICYmIGN1
cnIgIT0gYW5jZXN0b3I7IGN1cnIgPSBjdXJyLT5ob3ZlckFuY2VzdG9yKCkpIHsKLSAgICAgICAg
ICAgIGlmIChjdXJyLT5ub2RlKCkgJiYgIWN1cnItPmlzVGV4dCgpICYmICghbXVzdEJlSW5BY3Rp
dmVDaGFpbiB8fCBjdXJyLT5ub2RlKCktPmluQWN0aXZlQ2hhaW4oKSkpCi0gICAgICAgICAgICAg
ICAgbm9kZXNUb1JlbW92ZUZyb21DaGFpbi5hcHBlbmQoY3Vyci0+bm9kZSgpKTsKLSAgICAgICAg
fQotICAgIH0KKyAgICBtX3VzZXNSZW1Vbml0cyA9IHN0eWxlU2hlZXRzVXNlUmVtVW5pdHMobV9h
dXRob3JTdHlsZVNoZWV0cy0+dmVjdG9yKCkpOworICAgIG1fbmVlZHNVcGRhdGVBY3RpdmVTdHls
ZXNoZWV0c09uU3R5bGVSZWNhbGMgPSBmYWxzZTsKIAotICAgIC8vIE5vdyBzZXQgdGhlIGhvdmVy
IHN0YXRlIGZvciBvdXIgbmV3IG9iamVjdCB1cCB0byB0aGUgcm9vdC4KLSAgICBmb3IgKFJlbmRl
ck9iamVjdCogY3VyciA9IG5ld0hvdmVyT2JqOyBjdXJyOyBjdXJyID0gY3Vyci0+aG92ZXJBbmNl
c3RvcigpKSB7Ci0gICAgICAgIGlmIChjdXJyLT5ub2RlKCkgJiYgIWN1cnItPmlzVGV4dCgpICYm
ICghbXVzdEJlSW5BY3RpdmVDaGFpbiB8fCBjdXJyLT5ub2RlKCktPmluQWN0aXZlQ2hhaW4oKSkp
Ci0gICAgICAgICAgICBub2Rlc1RvQWRkVG9DaGFpbi5hcHBlbmQoY3Vyci0+bm9kZSgpKTsKLSAg
ICB9CisgICAgbV9kb2N1bWVudC0+bm90aWZ5U2VhbWxlc3NDaGlsZERvY3VtZW50c09mU3R5bGVz
aGVldFVwZGF0ZSgpOwogCi0gICAgc2l6ZV90IHJlbW92ZUNvdW50ID0gbm9kZXNUb1JlbW92ZUZy
b21DaGFpbi5zaXplKCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZW1vdmVDb3VudDsg
KytpKQotICAgICAgICBub2Rlc1RvUmVtb3ZlRnJvbUNoYWluW2ldLT5zZXRIb3ZlcmVkKGZhbHNl
KTsKLQotICAgIHNpemVfdCBhZGRDb3VudCA9IG5vZGVzVG9BZGRUb0NoYWluLnNpemUoKTsKLSAg
ICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFkZENvdW50OyArK2kpIHsKLSAgICAgICAgaWYgKGFs
bG93QWN0aXZlQ2hhbmdlcykKLSAgICAgICAgICAgIG5vZGVzVG9BZGRUb0NoYWluW2ldLT5zZXRB
Y3RpdmUodHJ1ZSk7Ci0gICAgICAgIG5vZGVzVG9BZGRUb0NoYWluW2ldLT5zZXRIb3ZlcmVkKHRy
dWUpOwotICAgIH0KKyAgICByZXR1cm4gcmVxdWlyZXNGdWxsU3R5bGVSZWNhbGM7CiB9CiAKLXZv
aWQgRG9jdW1lbnQ6OnJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qIG1lbW9yeU9i
amVjdEluZm8pIGNvbnN0Cit2b2lkIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb246OnJlcG9y
dE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qIG1lbW9yeU9iamVjdEluZm8pIGNvbnN0CiB7
CiAgICAgTWVtb3J5Q2xhc3NJbmZvIGluZm8obWVtb3J5T2JqZWN0SW5mbywgdGhpcywgV2ViQ29y
ZU1lbW9yeVR5cGVzOjpET00pOwotICAgIGluZm8uYWRkTWVtYmVyKG1fc3R5bGVSZXNvbHZlcik7
Ci0gICAgQ29udGFpbmVyTm9kZTo6cmVwb3J0TWVtb3J5VXNhZ2UobWVtb3J5T2JqZWN0SW5mbyk7
Ci0gICAgaW5mby5hZGRWZWN0b3IobV9jdXN0b21Gb250cyk7Ci0gICAgaW5mby5hZGRNZW1iZXIo
bV91cmwpOwotICAgIGluZm8uYWRkTWVtYmVyKG1fYmFzZVVSTCk7Ci0gICAgaW5mby5hZGRNZW1i
ZXIobV9iYXNlVVJMT3ZlcnJpZGUpOwotICAgIGluZm8uYWRkTWVtYmVyKG1fYmFzZUVsZW1lbnRV
UkwpOwotICAgIGluZm8uYWRkTWVtYmVyKG1fY29va2llVVJMKTsKLSAgICBpbmZvLmFkZE1lbWJl
cihtX2ZpcnN0UGFydHlGb3JDb29raWVzKTsKLSAgICBpbmZvLmFkZE1lbWJlcihtX2RvY3VtZW50
VVJJKTsKLSAgICBpbmZvLmFkZE1lbWJlcihtX2Jhc2VUYXJnZXQpOwotICAgIGluZm8uYWRkTWVt
YmVyKG1fZnJhbWUpOwotICAgIGluZm8uYWRkTWVtYmVyKG1fY2FjaGVkUmVzb3VyY2VMb2FkZXIp
OwotICAgIGluZm8uYWRkTWVtYmVyKG1fZWxlbVNoZWV0KTsKICAgICBpbmZvLmFkZE1lbWJlciht
X3BhZ2VVc2VyU2hlZXQpOwogICAgIGlmIChtX3BhZ2VHcm91cFVzZXJTaGVldHMpCiAgICAgICAg
IGluZm8uYWRkSW5zdHJ1bWVudGVkVmVjdG9yUHRyKG1fcGFnZUdyb3VwVXNlclNoZWV0cyk7CiAg
ICAgaWYgKG1fdXNlclNoZWV0cykKICAgICAgICAgaW5mby5hZGRJbnN0cnVtZW50ZWRWZWN0b3JQ
dHIobV91c2VyU2hlZXRzKTsKLSAgICBpbmZvLmFkZEhhc2hTZXQobV9ub2RlSXRlcmF0b3JzKTsK
LSAgICBpbmZvLmFkZEhhc2hTZXQobV9yYW5nZXMpOwogICAgIGluZm8uYWRkTGlzdEhhc2hTZXQo
bV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXMpOwotICAgIGluZm8uYWRkTWVtYmVyKG1fcHJlZmVy
cmVkU3R5bGVzaGVldFNldCk7Ci0gICAgaW5mby5hZGRNZW1iZXIobV9zZWxlY3RlZFN0eWxlc2hl
ZXRTZXQpOwotICAgIGluZm8uYWRkTWVtYmVyKG1fdGl0bGUuc3RyaW5nKCkpOwotICAgIGluZm8u
YWRkTWVtYmVyKG1fcmF3VGl0bGUuc3RyaW5nKCkpOwotICAgIGluZm8uYWRkTWVtYmVyKG1feG1s
RW5jb2RpbmcpOwotICAgIGluZm8uYWRkTWVtYmVyKG1feG1sVmVyc2lvbik7Ci0gICAgaW5mby5h
ZGRNZW1iZXIobV9jb250ZW50TGFuZ3VhZ2UpOwotICAgIGluZm8uYWRkSGFzaE1hcChtX2RvY3Vt
ZW50TmFtZWRJdGVtQ29sbGVjdGlvbnMpOwotICAgIGluZm8uYWRkSGFzaE1hcChtX3dpbmRvd05h
bWVkSXRlbUNvbGxlY3Rpb25zKTsKLSNpZiBFTkFCTEUoREFTSEJPQVJEX1NVUFBPUlQpCi0gICAg
aW5mby5hZGRWZWN0b3IobV9kYXNoYm9hcmRSZWdpb25zKTsKLSNlbmRpZgotICAgIGluZm8uYWRk
SGFzaE1hcChtX2Nzc0NhbnZhc0VsZW1lbnRzKTsKLSAgICBpbmZvLmFkZFZlY3RvcihtX2ljb25V
UkxzKTsKLSAgICBpbmZvLmFkZEhhc2hTZXQobV9kb2N1bWVudFN1c3BlbnNpb25DYWxsYmFja0Vs
ZW1lbnRzKTsKLSAgICBpbmZvLmFkZEhhc2hTZXQobV9tZWRpYVZvbHVtZUNhbGxiYWNrRWxlbWVu
dHMpOwotICAgIGluZm8uYWRkSGFzaFNldChtX3ByaXZhdGVCcm93c2luZ1N0YXRlQ2hhbmdlZEVs
ZW1lbnRzKTsKLSAgICBpbmZvLmFkZEhhc2hNYXAobV9lbGVtZW50c0J5QWNjZXNzS2V5KTsKLSAg
ICBpbmZvLmFkZE1lbWJlcihtX2V2ZW50UXVldWUpOwotICAgIGluZm8uYWRkSGFzaFNldChtX21l
ZGlhQ2FuU3RhcnRMaXN0ZW5lcnMpOwotICAgIGluZm8uYWRkVmVjdG9yKG1fcGVuZGluZ1Rhc2tz
KTsKLX0KLQotI2lmIEVOQUJMRShVTkRPX01BTkFHRVIpCi1QYXNzUmVmUHRyPFVuZG9NYW5hZ2Vy
PiBEb2N1bWVudDo6dW5kb01hbmFnZXIoKQotewotICAgIGlmICghbV91bmRvTWFuYWdlcikKLSAg
ICAgICAgbV91bmRvTWFuYWdlciA9IFVuZG9NYW5hZ2VyOjpjcmVhdGUodGhpcyk7Ci0gICAgcmV0
dXJuIG1fdW5kb01hbmFnZXI7Ci19Ci0jZW5kaWYKLQotY2xhc3MgSW1tdXRhYmxlQXR0cmlidXRl
RGF0YUNhY2hlS2V5IHsKLXB1YmxpYzoKLSAgICBJbW11dGFibGVBdHRyaWJ1dGVEYXRhQ2FjaGVL
ZXkoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgY29uc3QgQXR0cmlidXRlKiBhdHRyaWJ1
dGVzLCB1bnNpZ25lZCBhdHRyaWJ1dGVDb3VudCkKLSAgICAgICAgOiBtX3RhZ1FOYW1lKHRhZ05h
bWUpCi0gICAgICAgICwgbV9hdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpCi0gICAgICAgICwgbV9hdHRy
aWJ1dGVDb3VudChhdHRyaWJ1dGVDb3VudCkKLSAgICB7IH0KLQotICAgIGJvb2wgb3BlcmF0b3Ih
PShjb25zdCBJbW11dGFibGVBdHRyaWJ1dGVEYXRhQ2FjaGVLZXkmIG90aGVyKSBjb25zdAotICAg
IHsKLSAgICAgICAgaWYgKG1fdGFnUU5hbWUgIT0gb3RoZXIubV90YWdRTmFtZSkKLSAgICAgICAg
ICAgIHJldHVybiB0cnVlOwotICAgICAgICBpZiAobV9hdHRyaWJ1dGVDb3VudCAhPSBvdGhlci5t
X2F0dHJpYnV0ZUNvdW50KQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIHJldHVy
biBtZW1jbXAobV9hdHRyaWJ1dGVzLCBvdGhlci5tX2F0dHJpYnV0ZXMsIHNpemVvZihBdHRyaWJ1
dGUpICogbV9hdHRyaWJ1dGVDb3VudCk7Ci0gICAgfQotCi0gICAgdW5zaWduZWQgaGFzaCgpIGNv
bnN0Ci0gICAgewotICAgICAgICB1bnNpZ25lZCBhdHRyaWJ1dGVIYXNoID0gU3RyaW5nSGFzaGVy
OjpoYXNoTWVtb3J5KG1fYXR0cmlidXRlcywgbV9hdHRyaWJ1dGVDb3VudCAqIHNpemVvZihBdHRy
aWJ1dGUpKTsKLSAgICAgICAgcmV0dXJuIFdURjo6cGFpckludEhhc2gobV90YWdRTmFtZS5sb2Nh
bE5hbWUoKS5pbXBsKCktPmV4aXN0aW5nSGFzaCgpLCBhdHRyaWJ1dGVIYXNoKTsKLSAgICB9Ci0K
LXByaXZhdGU6Ci0gICAgUXVhbGlmaWVkTmFtZSBtX3RhZ1FOYW1lOwotICAgIGNvbnN0IEF0dHJp
YnV0ZSogbV9hdHRyaWJ1dGVzOwotICAgIHVuc2lnbmVkIG1fYXR0cmlidXRlQ291bnQ7Ci19Owot
Ci1zdHJ1Y3QgSW1tdXRhYmxlQXR0cmlidXRlRGF0YUNhY2hlRW50cnkgewotICAgIEltbXV0YWJs
ZUF0dHJpYnV0ZURhdGFDYWNoZUVudHJ5KGNvbnN0IEltbXV0YWJsZUF0dHJpYnV0ZURhdGFDYWNo
ZUtleSYgaywgUGFzc1JlZlB0cjxFbGVtZW50QXR0cmlidXRlRGF0YT4gdikKLSAgICAgICAgOiBr
ZXkoaykKLSAgICAgICAgLCB2YWx1ZSh2KQotICAgIHsgfQotCi0gICAgSW1tdXRhYmxlQXR0cmli
dXRlRGF0YUNhY2hlS2V5IGtleTsKLSAgICBSZWZQdHI8RWxlbWVudEF0dHJpYnV0ZURhdGE+IHZh
bHVlOwotfTsKLQotUGFzc1JlZlB0cjxFbGVtZW50QXR0cmlidXRlRGF0YT4gRG9jdW1lbnQ6OmNh
Y2hlZEltbXV0YWJsZUF0dHJpYnV0ZURhdGEoY29uc3QgRWxlbWVudCogZWxlbWVudCwgY29uc3Qg
VmVjdG9yPEF0dHJpYnV0ZT4mIGF0dHJpYnV0ZXMpCi17Ci0gICAgQVNTRVJUKCFhdHRyaWJ1dGVz
LmlzRW1wdHkoKSk7Ci0KLSAgICBJbW11dGFibGVBdHRyaWJ1dGVEYXRhQ2FjaGVLZXkgY2FjaGVL
ZXkoZWxlbWVudC0+dGFnUU5hbWUoKSwgYXR0cmlidXRlcy5kYXRhKCksIGF0dHJpYnV0ZXMuc2l6
ZSgpKTsKLSAgICB1bnNpZ25lZCBjYWNoZUhhc2ggPSBjYWNoZUtleS5oYXNoKCk7Ci0KLSAgICBJ
bW11dGFibGVBdHRyaWJ1dGVEYXRhQ2FjaGU6Oml0ZXJhdG9yIGNhY2hlSXRlcmF0b3IgPSBtX2lt
bXV0YWJsZUF0dHJpYnV0ZURhdGFDYWNoZS5hZGQoY2FjaGVIYXNoLCBudWxscHRyKS5pdGVyYXRv
cjsKLSAgICBpZiAoY2FjaGVJdGVyYXRvci0+c2Vjb25kICYmIGNhY2hlSXRlcmF0b3ItPnNlY29u
ZC0+a2V5ICE9IGNhY2hlS2V5KQotICAgICAgICBjYWNoZUhhc2ggPSAwOwotCi0gICAgUmVmUHRy
PEVsZW1lbnRBdHRyaWJ1dGVEYXRhPiBhdHRyaWJ1dGVEYXRhOwotICAgIGlmIChjYWNoZUhhc2gg
JiYgY2FjaGVJdGVyYXRvci0+c2Vjb25kKQotICAgICAgICBhdHRyaWJ1dGVEYXRhID0gY2FjaGVJ
dGVyYXRvci0+c2Vjb25kLT52YWx1ZTsKLSAgICBlbHNlCi0gICAgICAgIGF0dHJpYnV0ZURhdGEg
PSBFbGVtZW50QXR0cmlidXRlRGF0YTo6Y3JlYXRlSW1tdXRhYmxlKGF0dHJpYnV0ZXMpOwotCi0g
ICAgaWYgKCFjYWNoZUhhc2ggfHwgY2FjaGVJdGVyYXRvci0+c2Vjb25kKQotICAgICAgICByZXR1
cm4gYXR0cmlidXRlRGF0YS5yZWxlYXNlKCk7Ci0KLSAgICBjYWNoZUl0ZXJhdG9yLT5zZWNvbmQg
PSBhZG9wdFB0cihuZXcgSW1tdXRhYmxlQXR0cmlidXRlRGF0YUNhY2hlRW50cnkoSW1tdXRhYmxl
QXR0cmlidXRlRGF0YUNhY2hlS2V5KGVsZW1lbnQtPnRhZ1FOYW1lKCksIGF0dHJpYnV0ZURhdGEt
PmltbXV0YWJsZUF0dHJpYnV0ZUFycmF5KCksIGF0dHJpYnV0ZURhdGEtPmxlbmd0aCgpKSwgYXR0
cmlidXRlRGF0YSkpOwotCi0gICAgcmV0dXJuIGF0dHJpYnV0ZURhdGEucmVsZWFzZSgpOworICAg
IGluZm8uYWRkTWVtYmVyKG1fcHJlZmVycmVkU3R5bGVzaGVldFNldE5hbWUpOworICAgIGluZm8u
YWRkTWVtYmVyKG1fc2VsZWN0ZWRTdHlsZXNoZWV0U2V0TmFtZSk7CiB9CiAKLUxvY2FsaXplciYg
RG9jdW1lbnQ6OmdldExvY2FsaXplcihjb25zdCBBdG9taWNTdHJpbmcmIGxvY2FsZSkKLXsKLSAg
ICBBdG9taWNTdHJpbmcgbG9jYWxlS2V5ID0gbG9jYWxlOwotICAgIGlmIChsb2NhbGUuaXNFbXB0
eSgpIHx8ICFSdW50aW1lRW5hYmxlZEZlYXR1cmVzOjpsYW5nQXR0cmlidXRlQXdhcmVGb3JtQ29u
dHJvbFVJRW5hYmxlZCgpKQotICAgICAgICBsb2NhbGVLZXkgPSBkZWZhdWx0TGFuZ3VhZ2UoKTsK
LSAgICBMb2NhbGVUb0xvY2FsaXplck1hcDo6QWRkUmVzdWx0IHJlc3VsdCA9IG1fbG9jYWxpemVy
Q2FjaGUuYWRkKGxvY2FsZUtleSwgbnVsbHB0cik7Ci0gICAgaWYgKHJlc3VsdC5pc05ld0VudHJ5
KQotICAgICAgICByZXN1bHQuaXRlcmF0b3ItPnNlY29uZCA9IExvY2FsaXplcjo6Y3JlYXRlKGxv
Y2FsZUtleSk7Ci0gICAgcmV0dXJuICoocmVzdWx0Lml0ZXJhdG9yLT5zZWNvbmQpOwogfQotCi19
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9kb20vRG9jdW1lbnRT
dHlsZVNoZWV0Q29sbGVjdGlvbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2RvbS9E
b2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvV2Vi
Q29yZS9kb20vRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5oCShyZXZpc2lvbiAwKQpAQCAt
MCwwICsxLDE0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBMYXJzIEtub2xsIChrbm9s
bEBrZGUub3JnKQorICogICAgICAgICAgIChDKSAxOTk5IEFudHRpIEtvaXZpc3RvIChrb2l2aXN0
b0BrZGUub3JnKQorICogICAgICAgICAgIChDKSAyMDAxIERpcmsgTXVlbGxlciAobXVlbGxlckBr
ZGUub3JnKQorICogICAgICAgICAgIChDKSAyMDA2IEFsZXhleSBQcm9za3VyeWFrb3YgKGFwQHdl
YmtpdC5vcmcpCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgs
IDIwMDksIDIwMTAsIDIwMTIgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29w
eXJpZ2h0IChDKSAyMDA4LCAyMDA5IFRvcmNoIE1vYmlsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuIChodHRwOi8vd3d3LnRvcmNobW9iaWxlLmNvbS8pCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAg
Tm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCisgKiBDb3B5cmln
aHQgKEMpIDIwMTEgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlz
IGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y
CisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFs
IFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91
bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3Vy
IG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3Ry
aWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9V
VCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICog
TUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2Vl
IHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRh
aWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBM
aWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5
OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJl
ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZs
b29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpZm5kZWYg
RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbl9oCisjZGVmaW5lIERvY3VtZW50U3R5bGVTaGVl
dENvbGxlY3Rpb25faAorCisjaW5jbHVkZSA8d3RmL0Zhc3RBbGxvY0Jhc2UuaD4KKyNpbmNsdWRl
IDx3dGYvTGlzdEhhc2hTZXQuaD4KKyNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+CisjaW5jbHVkZSA8
d3RmL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgorCituYW1lc3Bh
Y2UgV2ViQ29yZSB7CisKK2NsYXNzIENTU1N0eWxlU2hlZXQ7CitjbGFzcyBEb2N1bWVudDsKK2Ns
YXNzIE5vZGU7CitjbGFzcyBTdHlsZVNoZWV0OworY2xhc3MgU3R5bGVTaGVldENvbnRlbnRzOwor
Y2xhc3MgU3R5bGVTaGVldExpc3Q7CisKK2NsYXNzIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rp
b24geworICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOworcHVibGljOgorICAgIERvY3VtZW50
U3R5bGVTaGVldENvbGxlY3Rpb24oRG9jdW1lbnQqKTsKKyAgICB+RG9jdW1lbnRTdHlsZVNoZWV0
Q29sbGVjdGlvbigpOworCisgICAgU3R5bGVTaGVldExpc3QqIGF1dGhvclN0eWxlU2hlZXRzKCkg
eyByZXR1cm4gbV9hdXRob3JTdHlsZVNoZWV0cy5nZXQoKTsgfQorCisgICAgQ1NTU3R5bGVTaGVl
dCogcGFnZVVzZXJTaGVldCgpOworICAgIGNvbnN0IFZlY3RvcjxSZWZQdHI8Q1NTU3R5bGVTaGVl
dD4gPiogcGFnZUdyb3VwVXNlclNoZWV0cygpIGNvbnN0OworICAgIGNvbnN0IFZlY3RvcjxSZWZQ
dHI8Q1NTU3R5bGVTaGVldD4gPiogZG9jdW1lbnRVc2VyU2hlZXRzKCkgY29uc3QgeyByZXR1cm4g
bV91c2VyU2hlZXRzLmdldCgpOyB9CisKKyAgICB2b2lkIGFkZFN0eWxlU2hlZXRDYW5kaWRhdGVO
b2RlKE5vZGUqLCBib29sIGNyZWF0ZWRCeVBhcnNlcik7CisgICAgdm9pZCByZW1vdmVTdHlsZVNo
ZWV0Q2FuZGlkYXRlTm9kZShOb2RlKik7CisKKyAgICB2b2lkIGNsZWFyUGFnZVVzZXJTaGVldCgp
OworICAgIHZvaWQgdXBkYXRlUGFnZVVzZXJTaGVldCgpOworICAgIHZvaWQgY2xlYXJQYWdlR3Jv
dXBVc2VyU2hlZXRzKCk7CisgICAgdm9pZCB1cGRhdGVQYWdlR3JvdXBVc2VyU2hlZXRzKCk7CisK
KyAgICB2b2lkIGFkZFVzZXJTaGVldChQYXNzUmVmUHRyPFN0eWxlU2hlZXRDb250ZW50cz4gdXNl
clNoZWV0KTsKKworICAgIGJvb2wgbmVlZHNVcGRhdGVBY3RpdmVTdHlsZXNoZWV0c09uU3R5bGVS
ZWNhbGMoKSB7IHJldHVybiBtX25lZWRzVXBkYXRlQWN0aXZlU3R5bGVzaGVldHNPblN0eWxlUmVj
YWxjOyB9CisKKyAgICBlbnVtIFVwZGF0ZUZsYWcgeyBGdWxsVXBkYXRlLCBPcHRpbWl6ZWRVcGRh
dGUgfTsKKyAgICBib29sIHVwZGF0ZUFjdGl2ZVN0eWxlU2hlZXRzKFVwZGF0ZUZsYWcpOworCisg
ICAgU3RyaW5nIHByZWZlcnJlZFN0eWxlc2hlZXRTZXROYW1lKCkgY29uc3QgeyByZXR1cm4gbV9w
cmVmZXJyZWRTdHlsZXNoZWV0U2V0TmFtZTsgfQorICAgIFN0cmluZyBzZWxlY3RlZFN0eWxlc2hl
ZXRTZXROYW1lKCkgY29uc3QgeyByZXR1cm4gbV9zZWxlY3RlZFN0eWxlc2hlZXRTZXROYW1lOyB9
CisgICAgdm9pZCBzZXRQcmVmZXJyZWRTdHlsZXNoZWV0U2V0TmFtZShjb25zdCBTdHJpbmcmIG5h
bWUpIHsgbV9wcmVmZXJyZWRTdHlsZXNoZWV0U2V0TmFtZSA9IG5hbWU7IH0KKyAgICB2b2lkIHNl
dFNlbGVjdGVkU3R5bGVzaGVldFNldE5hbWUoY29uc3QgU3RyaW5nJiBuYW1lKSB7IG1fc2VsZWN0
ZWRTdHlsZXNoZWV0U2V0TmFtZSA9IG5hbWU7IH0KKworICAgIHZvaWQgYWRkUGVuZGluZ1NoZWV0
KCkgeyBtX3BlbmRpbmdTdHlsZXNoZWV0cysrOyB9CisgICAgZW51bSBSZW1vdmVQZW5kaW5nU2hl
ZXROb3RpZmljYXRpb25UeXBlIHsKKyAgICAgICAgUmVtb3ZlUGVuZGluZ1NoZWV0Tm90aWZ5SW1t
ZWRpYXRlbHksCisgICAgICAgIFJlbW92ZVBlbmRpbmdTaGVldE5vdGlmeUxhdGVyCisgICAgfTsK
KyAgICB2b2lkIHJlbW92ZVBlbmRpbmdTaGVldChSZW1vdmVQZW5kaW5nU2hlZXROb3RpZmljYXRp
b25UeXBlID0gUmVtb3ZlUGVuZGluZ1NoZWV0Tm90aWZ5SW1tZWRpYXRlbHkpOworCisgICAgYm9v
bCBoYXNQZW5kaW5nU2hlZXRzKCkgY29uc3QgeyByZXR1cm4gbV9wZW5kaW5nU3R5bGVzaGVldHMg
PiAwOyB9CisKKyAgICBib29sIHVzZXNTaWJsaW5nUnVsZXMoKSBjb25zdCB7IHJldHVybiBtX3Vz
ZXNTaWJsaW5nUnVsZXMgfHwgbV91c2VzU2libGluZ1J1bGVzT3ZlcnJpZGU7IH0KKyAgICB2b2lk
IHNldFVzZXNTaWJsaW5nUnVsZXNPdmVycmlkZShib29sIGIpIHsgbV91c2VzU2libGluZ1J1bGVz
T3ZlcnJpZGUgPSBiOyB9CisgICAgYm9vbCB1c2VzRmlyc3RMaW5lUnVsZXMoKSBjb25zdCB7IHJl
dHVybiBtX3VzZXNGaXJzdExpbmVSdWxlczsgfQorICAgIGJvb2wgdXNlc0ZpcnN0TGV0dGVyUnVs
ZXMoKSBjb25zdCB7IHJldHVybiBtX3VzZXNGaXJzdExldHRlclJ1bGVzOyB9CisgICAgdm9pZCBz
ZXRVc2VzRmlyc3RMZXR0ZXJSdWxlcyhib29sIGIpIHsgbV91c2VzRmlyc3RMZXR0ZXJSdWxlcyA9
IGI7IH0KKyAgICBib29sIHVzZXNCZWZvcmVBZnRlclJ1bGVzKCkgY29uc3QgeyByZXR1cm4gbV91
c2VzQmVmb3JlQWZ0ZXJSdWxlcyB8fCBtX3VzZXNCZWZvcmVBZnRlclJ1bGVzT3ZlcnJpZGU7IH0K
KyAgICB2b2lkIHNldFVzZXNCZWZvcmVBZnRlclJ1bGVzT3ZlcnJpZGUoYm9vbCBiKSB7IG1fdXNl
c0JlZm9yZUFmdGVyUnVsZXNPdmVycmlkZSA9IGI7IH0KKyAgICBib29sIHVzZXNSZW1Vbml0cygp
IGNvbnN0IHsgcmV0dXJuIG1fdXNlc1JlbVVuaXRzOyB9CisgICAgdm9pZCBzZXRVc2VzUmVtVW5p
dChib29sIGIpIHsgbV91c2VzUmVtVW5pdHMgPSBiOyB9CisKKyAgICB2b2lkIGNvbWJpbmVDU1NG
ZWF0dXJlRmxhZ3MoKTsKKyAgICB2b2lkIHJlc2V0Q1NTRmVhdHVyZUZsYWdzKCk7CisKKyAgICB2
b2lkIHJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qKSBjb25zdDsKKworcHJpdmF0
ZToKKyAgICB2b2lkIGNvbGxlY3RBY3RpdmVTdHlsZVNoZWV0cyhWZWN0b3I8UmVmUHRyPFN0eWxl
U2hlZXQ+ID4mKTsKKyAgICBib29sIHRlc3RBZGRlZFN0eWxlU2hlZXRSZXF1aXJlc1N0eWxlUmVj
YWxjKFN0eWxlU2hlZXRDb250ZW50cyopOworICAgIHZvaWQgYW5hbHl6ZVN0eWxlU2hlZXRDaGFu
Z2UoVXBkYXRlRmxhZywgY29uc3QgVmVjdG9yPFJlZlB0cjxTdHlsZVNoZWV0PiA+JiBuZXdTdHls
ZXNoZWV0cywgYm9vbCYgcmVxdWlyZXNTdHlsZVJlc29sdmVyUmVzZXQsIGJvb2wmIHJlcXVpcmVz
RnVsbFN0eWxlUmVjYWxjKTsKKworICAgIERvY3VtZW50KiBtX2RvY3VtZW50OworCisgICAgUmVm
UHRyPFN0eWxlU2hlZXRMaXN0PiBtX2F1dGhvclN0eWxlU2hlZXRzOworCisgICAgLy8gVHJhY2sg
dGhlIG51bWJlciBvZiBjdXJyZW50bHkgbG9hZGluZyB0b3AtbGV2ZWwgc3R5bGVzaGVldHMgbmVl
ZGVkIGZvciByZW5kZXJpbmcuCisgICAgLy8gU2hlZXRzIGxvYWRlZCB1c2luZyB0aGUgQGltcG9y
dCBkaXJlY3RpdmUgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGlzIGNvdW50LgorICAgIC8vIFdlIHVz
ZSB0aGlzIGNvdW50IG9mIHBlbmRpbmcgc2hlZXRzIHRvIGRldGVjdCB3aGVuIHdlIGNhbiBiZWdp
biBhdHRhY2hpbmcKKyAgICAvLyBlbGVtZW50cyBhbmQgd2hlbiBpdCBpcyBzYWZlIHRvIGV4ZWN1
dGUgc2NyaXB0cy4KKyAgICBpbnQgbV9wZW5kaW5nU3R5bGVzaGVldHM7CisKKyAgICBSZWZQdHI8
Q1NTU3R5bGVTaGVldD4gbV9wYWdlVXNlclNoZWV0OworICAgIG11dGFibGUgT3duUHRyPFZlY3Rv
cjxSZWZQdHI8Q1NTU3R5bGVTaGVldD4gPiA+IG1fcGFnZUdyb3VwVXNlclNoZWV0czsKKyAgICBP
d25QdHI8VmVjdG9yPFJlZlB0cjxDU1NTdHlsZVNoZWV0PiA+ID4gbV91c2VyU2hlZXRzOworICAg
IG11dGFibGUgYm9vbCBtX3BhZ2VHcm91cFVzZXJTaGVldENhY2hlVmFsaWQ7CisKKyAgICBib29s
IG1faGFkQWN0aXZlTG9hZGluZ1N0eWxlc2hlZXQ7CisgICAgYm9vbCBtX25lZWRzVXBkYXRlQWN0
aXZlU3R5bGVzaGVldHNPblN0eWxlUmVjYWxjOworCisgICAgdHlwZWRlZiBMaXN0SGFzaFNldDxO
b2RlKiwgMzI+IFN0eWxlU2hlZXRDYW5kaWRhdGVMaXN0SGFzaFNldDsKKyAgICBTdHlsZVNoZWV0
Q2FuZGlkYXRlTGlzdEhhc2hTZXQgbV9zdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZXM7CisKKyAgICBT
dHJpbmcgbV9wcmVmZXJyZWRTdHlsZXNoZWV0U2V0TmFtZTsKKyAgICBTdHJpbmcgbV9zZWxlY3Rl
ZFN0eWxlc2hlZXRTZXROYW1lOworCisgICAgYm9vbCBtX3VzZXNTaWJsaW5nUnVsZXM7CisgICAg
Ym9vbCBtX3VzZXNTaWJsaW5nUnVsZXNPdmVycmlkZTsKKyAgICBib29sIG1fdXNlc0ZpcnN0TGlu
ZVJ1bGVzOworICAgIGJvb2wgbV91c2VzRmlyc3RMZXR0ZXJSdWxlczsKKyAgICBib29sIG1fdXNl
c0JlZm9yZUFmdGVyUnVsZXM7CisgICAgYm9vbCBtX3VzZXNCZWZvcmVBZnRlclJ1bGVzT3ZlcnJp
ZGU7CisgICAgYm9vbCBtX3VzZXNSZW1Vbml0czsKK307CisKK30KKworI2VuZGlmCisKSW5kZXg6
IFNvdXJjZS9XZWJDb3JlL2RvbS9FbGVtZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9kb20vRWxlbWVudC5jcHAJKHJldmlzaW9uIDEyOTQwNykKKysrIFNvdXJjZS9XZWJDb3Jl
L2RvbS9FbGVtZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTE3Myw3ICsxMTczLDcgQEAgdm9p
ZCBFbGVtZW50OjpyZWNhbGNTdHlsZShTdHlsZUNoYW5nZSBjaAogCiAgICAgICAgIC8vIElmICJy
ZW0iIHVuaXRzIGFyZSB1c2VkIGFueXdoZXJlIGluIHRoZSBkb2N1bWVudCwgYW5kIGlmIHRoZSBk
b2N1bWVudCBlbGVtZW50J3MgZm9udCBzaXplIGNoYW5nZXMsIHRoZW4gZ28gYWhlYWQgYW5kIGZv
cmNlIGZvbnQgdXBkYXRpbmcKICAgICAgICAgLy8gYWxsIHRoZSB3YXkgZG93biB0aGUgdHJlZS4g
VGhpcyBpcyBzaW1wbGVyIHRoYW4gaGF2aW5nIHRvIG1haW50YWluIGEgY2FjaGUgb2Ygb2JqZWN0
cyAoYW5kIHN1Y2ggZm9udCBzaXplIGNoYW5nZXMgc2hvdWxkIGJlIHJhcmUgYW55d2F5KS4KLSAg
ICAgICAgaWYgKGRvY3VtZW50KCktPnVzZXNSZW1Vbml0cygpICYmIGRvY3VtZW50KCktPmRvY3Vt
ZW50RWxlbWVudCgpID09IHRoaXMgJiYgY2ggIT0gTm9DaGFuZ2UgJiYgY3VycmVudFN0eWxlICYm
IG5ld1N0eWxlICYmIGN1cnJlbnRTdHlsZS0+Zm9udFNpemUoKSAhPSBuZXdTdHlsZS0+Zm9udFNp
emUoKSkgeworICAgICAgICBpZiAoZG9jdW1lbnQoKS0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+
dXNlc1JlbVVuaXRzKCkgJiYgZG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50KCkgPT0gdGhpcyAm
JiBjaCAhPSBOb0NoYW5nZSAmJiBjdXJyZW50U3R5bGUgJiYgbmV3U3R5bGUgJiYgY3VycmVudFN0
eWxlLT5mb250U2l6ZSgpICE9IG5ld1N0eWxlLT5mb250U2l6ZSgpKSB7CiAgICAgICAgICAgICAv
LyBDYWNoZWQgUmVuZGVyU3R5bGVzIG1heSBkZXBlbmQgb24gdGhlIHJlbSB1bml0cy4KICAgICAg
ICAgICAgIGRvY3VtZW50KCktPnN0eWxlUmVzb2x2ZXIoKS0+aW52YWxpZGF0ZU1hdGNoZWRQcm9w
ZXJ0aWVzQ2FjaGUoKTsKICAgICAgICAgICAgIGNoYW5nZSA9IEZvcmNlOwpJbmRleDogU291cmNl
L1dlYkNvcmUvZG9tL1Byb2Nlc3NpbmdJbnN0cnVjdGlvbi5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvZG9tL1Byb2Nlc3NpbmdJbnN0cnVjdGlvbi5jcHAJKHJldmlzaW9uIDEyOTQw
NykKKysrIFNvdXJjZS9XZWJDb3JlL2RvbS9Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb24uY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0yMyw5ICsyMywxMCBAQAogCiAjaW5jbHVkZSAiQ1NTU3R5bGVTaGVldC5o
IgogI2luY2x1ZGUgIkNhY2hlZENTU1N0eWxlU2hlZXQuaCIKKyNpbmNsdWRlICJDYWNoZWRSZXNv
dXJjZUxvYWRlci5oIgogI2luY2x1ZGUgIkNhY2hlZFhTTFN0eWxlU2hlZXQuaCIKICNpbmNsdWRl
ICJEb2N1bWVudC5oIgotI2luY2x1ZGUgIkNhY2hlZFJlc291cmNlTG9hZGVyLmgiCisjaW5jbHVk
ZSAiRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5oIgogI2luY2x1ZGUgIkV4Y2VwdGlvbkNv
ZGUuaCIKICNpbmNsdWRlICJGcmFtZS5oIgogI2luY2x1ZGUgIkZyYW1lTG9hZGVyLmgiCkBAIC02
NSw3ICs2Niw3IEBAIFByb2Nlc3NpbmdJbnN0cnVjdGlvbjo6flByb2Nlc3NpbmdJbnN0cnUKICAg
ICAgICAgbV9jYWNoZWRTaGVldC0+cmVtb3ZlQ2xpZW50KHRoaXMpOwogCiAgICAgaWYgKGluRG9j
dW1lbnQoKSkKLSAgICAgICAgZG9jdW1lbnQoKS0+cmVtb3ZlU3R5bGVTaGVldENhbmRpZGF0ZU5v
ZGUodGhpcyk7CisgICAgICAgIGRvY3VtZW50KCktPnN0eWxlU2hlZXRDb2xsZWN0aW9uKCktPnJl
bW92ZVN0eWxlU2hlZXRDYW5kaWRhdGVOb2RlKHRoaXMpOwogfQogCiB2b2lkIFByb2Nlc3NpbmdJ
bnN0cnVjdGlvbjo6c2V0RGF0YShjb25zdCBTdHJpbmcmIGRhdGEsIEV4Y2VwdGlvbkNvZGUmKQpA
QCAtMTYwLDcgKzE2MSw3IEBAIHZvaWQgUHJvY2Vzc2luZ0luc3RydWN0aW9uOjpjaGVja1N0eWxl
U2gKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAKICAgICAgICAgICAgIG1f
bG9hZGluZyA9IHRydWU7Ci0gICAgICAgICAgICBkb2N1bWVudCgpLT5hZGRQZW5kaW5nU2hlZXQo
KTsKKyAgICAgICAgICAgIGRvY3VtZW50KCktPnN0eWxlU2hlZXRDb2xsZWN0aW9uKCktPmFkZFBl
bmRpbmdTaGVldCgpOwogICAgICAgICAgICAgCiAgICAgICAgICAgICBSZXNvdXJjZVJlcXVlc3Qg
cmVxdWVzdChkb2N1bWVudCgpLT5jb21wbGV0ZVVSTChocmVmKSk7CiAjaWYgRU5BQkxFKFhTTFQp
CkBAIC0xODAsNyArMTgxLDcgQEAgdm9pZCBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb246OmNoZWNrU3R5
bGVTaAogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gVGhlIHJlcXVlc3Qg
bWF5IGhhdmUgYmVlbiBkZW5pZWQgaWYgKGZvciBleGFtcGxlKSB0aGUgc3R5bGVzaGVldCBpcyBs
b2NhbCBhbmQgdGhlIGRvY3VtZW50IGlzIHJlbW90ZS4KICAgICAgICAgICAgICAgICBtX2xvYWRp
bmcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBkb2N1bWVudCgpLT5yZW1vdmVQZW5kaW5nU2hl
ZXQoKTsKKyAgICAgICAgICAgICAgICBkb2N1bWVudCgpLT5zdHlsZVNoZWV0Q29sbGVjdGlvbigp
LT5yZW1vdmVQZW5kaW5nU2hlZXQoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0K
QEAgLTE5OCw3ICsxOTksNyBAQCBib29sIFByb2Nlc3NpbmdJbnN0cnVjdGlvbjo6aXNMb2FkaW5n
KCkgCiBib29sIFByb2Nlc3NpbmdJbnN0cnVjdGlvbjo6c2hlZXRMb2FkZWQoKQogewogICAgIGlm
ICghaXNMb2FkaW5nKCkpIHsKLSAgICAgICAgZG9jdW1lbnQoKS0+cmVtb3ZlUGVuZGluZ1NoZWV0
KCk7CisgICAgICAgIGRvY3VtZW50KCktPnN0eWxlU2hlZXRDb2xsZWN0aW9uKCktPnJlbW92ZVBl
bmRpbmdTaGVldCgpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgcmV0dXJuIGZh
bHNlOwpAQCAtMjkzLDcgKzI5NCw3IEBAIE5vZGU6Okluc2VydGlvbk5vdGlmaWNhdGlvblJlcXVl
c3QgUHJvY2UKICAgICBOb2RlOjppbnNlcnRlZEludG8oaW5zZXJ0aW9uUG9pbnQpOwogICAgIGlm
ICghaW5zZXJ0aW9uUG9pbnQtPmluRG9jdW1lbnQoKSkKICAgICAgICAgcmV0dXJuIEluc2VydGlv
bkRvbmU7Ci0gICAgZG9jdW1lbnQoKS0+YWRkU3R5bGVTaGVldENhbmRpZGF0ZU5vZGUodGhpcywg
bV9jcmVhdGVkQnlQYXJzZXIpOworICAgIGRvY3VtZW50KCktPnN0eWxlU2hlZXRDb2xsZWN0aW9u
KCktPmFkZFN0eWxlU2hlZXRDYW5kaWRhdGVOb2RlKHRoaXMsIG1fY3JlYXRlZEJ5UGFyc2VyKTsK
ICAgICBjaGVja1N0eWxlU2hlZXQoKTsKICAgICByZXR1cm4gSW5zZXJ0aW9uRG9uZTsKIH0KQEAg
LTMwNCw3ICszMDUsNyBAQCB2b2lkIFByb2Nlc3NpbmdJbnN0cnVjdGlvbjo6cmVtb3ZlZEZyb20o
CiAgICAgaWYgKCFpbnNlcnRpb25Qb2ludC0+aW5Eb2N1bWVudCgpKQogICAgICAgICByZXR1cm47
CiAgICAgCi0gICAgZG9jdW1lbnQoKS0+cmVtb3ZlU3R5bGVTaGVldENhbmRpZGF0ZU5vZGUodGhp
cyk7CisgICAgZG9jdW1lbnQoKS0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+cmVtb3ZlU3R5bGVT
aGVldENhbmRpZGF0ZU5vZGUodGhpcyk7CiAKICAgICBpZiAobV9zaGVldCkgewogICAgICAgICBB
U1NFUlQobV9zaGVldC0+b3duZXJOb2RlKCkgPT0gdGhpcyk7CkluZGV4OiBTb3VyY2UvV2ViQ29y
ZS9kb20vU3R5bGVFbGVtZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9kb20v
U3R5bGVFbGVtZW50LmNwcAkocmV2aXNpb24gMTI5NDA3KQorKysgU291cmNlL1dlYkNvcmUvZG9t
L1N0eWxlRWxlbWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNs
dWRlICJBdHRyaWJ1dGUuaCIKICNpbmNsdWRlICJDb250ZW50U2VjdXJpdHlQb2xpY3kuaCIKICNp
bmNsdWRlICJEb2N1bWVudC5oIgorI2luY2x1ZGUgIkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rp
b24uaCIKICNpbmNsdWRlICJFbGVtZW50LmgiCiAjaW5jbHVkZSAiTWVkaWFMaXN0LmgiCiAjaW5j
bHVkZSAiTWVkaWFRdWVyeUV2YWx1YXRvci5oIgpAQCAtNjMsNyArNjQsNyBAQCB2b2lkIFN0eWxl
RWxlbWVudDo6aW5zZXJ0ZWRJbnRvRG9jdW1lbnQoCiB7CiAgICAgQVNTRVJUKGRvY3VtZW50KTsK
ICAgICBBU1NFUlQoZWxlbWVudCk7Ci0gICAgZG9jdW1lbnQtPmFkZFN0eWxlU2hlZXRDYW5kaWRh
dGVOb2RlKGVsZW1lbnQsIG1fY3JlYXRlZEJ5UGFyc2VyKTsKKyAgICBkb2N1bWVudC0+c3R5bGVT
aGVldENvbGxlY3Rpb24oKS0+YWRkU3R5bGVTaGVldENhbmRpZGF0ZU5vZGUoZWxlbWVudCwgbV9j
cmVhdGVkQnlQYXJzZXIpOwogICAgIGlmIChtX2NyZWF0ZWRCeVBhcnNlcikKICAgICAgICAgcmV0
dXJuOwogCkBAIC03NCw3ICs3NSw3IEBAIHZvaWQgU3R5bGVFbGVtZW50OjpyZW1vdmVkRnJvbURv
Y3VtZW50KEQKIHsKICAgICBBU1NFUlQoZG9jdW1lbnQpOwogICAgIEFTU0VSVChlbGVtZW50KTsK
LSAgICBkb2N1bWVudC0+cmVtb3ZlU3R5bGVTaGVldENhbmRpZGF0ZU5vZGUoZWxlbWVudCk7Cisg
ICAgZG9jdW1lbnQtPnN0eWxlU2hlZXRDb2xsZWN0aW9uKCktPnJlbW92ZVN0eWxlU2hlZXRDYW5k
aWRhdGVOb2RlKGVsZW1lbnQpOwogCiAgICAgaWYgKG1fc2hlZXQpCiAgICAgICAgIGNsZWFyU2hl
ZXQoKTsKQEAgLTkwLDcgKzkxLDcgQEAgdm9pZCBTdHlsZUVsZW1lbnQ6OmNsZWFyRG9jdW1lbnRE
YXRhKERvYwogICAgICAgICBtX3NoZWV0LT5jbGVhck93bmVyTm9kZSgpOwogCiAgICAgaWYgKGVs
ZW1lbnQtPmluRG9jdW1lbnQoKSkKLSAgICAgICAgZG9jdW1lbnQtPnJlbW92ZVN0eWxlU2hlZXRD
YW5kaWRhdGVOb2RlKGVsZW1lbnQpOworICAgICAgICBkb2N1bWVudC0+c3R5bGVTaGVldENvbGxl
Y3Rpb24oKS0+cmVtb3ZlU3R5bGVTaGVldENhbmRpZGF0ZU5vZGUoZWxlbWVudCk7CiB9CiAKIHZv
aWQgU3R5bGVFbGVtZW50OjpjaGlsZHJlbkNoYW5nZWQoRWxlbWVudCogZWxlbWVudCkKQEAgLTE1
Miw3ICsxNTMsNyBAQCB2b2lkIFN0eWxlRWxlbWVudDo6Y3JlYXRlU2hlZXQoRWxlbWVudCogCiAg
ICAgRG9jdW1lbnQqIGRvY3VtZW50ID0gZS0+ZG9jdW1lbnQoKTsKICAgICBpZiAobV9zaGVldCkg
ewogICAgICAgICBpZiAobV9zaGVldC0+aXNMb2FkaW5nKCkpCi0gICAgICAgICAgICBkb2N1bWVu
dC0+cmVtb3ZlUGVuZGluZ1NoZWV0KCk7CisgICAgICAgICAgICBkb2N1bWVudC0+c3R5bGVTaGVl
dENvbGxlY3Rpb24oKS0+cmVtb3ZlUGVuZGluZ1NoZWV0KCk7CiAgICAgICAgIGNsZWFyU2hlZXQo
KTsKICAgICB9CiAKQEAgLTE2OCw3ICsxNjksNyBAQCB2b2lkIFN0eWxlRWxlbWVudDo6Y3JlYXRl
U2hlZXQoRWxlbWVudCogCiAgICAgICAgIE1lZGlhUXVlcnlFdmFsdWF0b3Igc2NyZWVuRXZhbCgi
c2NyZWVuIiwgdHJ1ZSk7CiAgICAgICAgIE1lZGlhUXVlcnlFdmFsdWF0b3IgcHJpbnRFdmFsKCJw
cmludCIsIHRydWUpOwogICAgICAgICBpZiAoc2NyZWVuRXZhbC5ldmFsKG1lZGlhUXVlcmllcy5n
ZXQoKSkgfHwgcHJpbnRFdmFsLmV2YWwobWVkaWFRdWVyaWVzLmdldCgpKSkgewotICAgICAgICAg
ICAgZG9jdW1lbnQtPmFkZFBlbmRpbmdTaGVldCgpOworICAgICAgICAgICAgZG9jdW1lbnQtPnN0
eWxlU2hlZXRDb2xsZWN0aW9uKCktPmFkZFBlbmRpbmdTaGVldCgpOwogICAgICAgICAgICAgbV9s
b2FkaW5nID0gdHJ1ZTsKIAogICAgICAgICAgICAgbV9zaGVldCA9IENTU1N0eWxlU2hlZXQ6OmNy
ZWF0ZUlubGluZShlLCBLVVJMKCksIGRvY3VtZW50LT5pbnB1dEVuY29kaW5nKCkpOwpAQCAtMTk3
LDE0ICsxOTgsMTQgQEAgYm9vbCBTdHlsZUVsZW1lbnQ6OnNoZWV0TG9hZGVkKERvY3VtZW50Kgog
ICAgIGlmIChpc0xvYWRpbmcoKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgZG9jdW1l
bnQtPnJlbW92ZVBlbmRpbmdTaGVldCgpOworICAgIGRvY3VtZW50LT5zdHlsZVNoZWV0Q29sbGVj
dGlvbigpLT5yZW1vdmVQZW5kaW5nU2hlZXQoKTsKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9p
ZCBTdHlsZUVsZW1lbnQ6OnN0YXJ0TG9hZGluZ0R5bmFtaWNTaGVldChEb2N1bWVudCogZG9jdW1l
bnQpCiB7CiAgICAgQVNTRVJUKGRvY3VtZW50KTsKLSAgICBkb2N1bWVudC0+YWRkUGVuZGluZ1No
ZWV0KCk7CisgICAgZG9jdW1lbnQtPnN0eWxlU2hlZXRDb2xsZWN0aW9uKCktPmFkZFBlbmRpbmdT
aGVldCgpOwogfQogCiB9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxMaW5rRWxlbWVu
dC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MTGlua0VsZW1lbnQu
Y3BwCShyZXZpc2lvbiAxMjk0MDcpCisrKyBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxMaW5rRWxl
bWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlICJDYWNo
ZWRSZXNvdXJjZS5oIgogI2luY2x1ZGUgIkNhY2hlZFJlc291cmNlTG9hZGVyLmgiCiAjaW5jbHVk
ZSAiRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmgi
CiAjaW5jbHVkZSAiRXZlbnRTZW5kZXIuaCIKICNpbmNsdWRlICJGcmFtZS5oIgogI2luY2x1ZGUg
IkZyYW1lTG9hZGVyLmgiCkBAIC04Nyw3ICs4OCw3IEBAIEhUTUxMaW5rRWxlbWVudDo6fkhUTUxM
aW5rRWxlbWVudCgpCiAgICAgICAgIG1fY2FjaGVkU2hlZXQtPnJlbW92ZUNsaWVudCh0aGlzKTsK
IAogICAgIGlmIChpbkRvY3VtZW50KCkpCi0gICAgICAgIGRvY3VtZW50KCktPnJlbW92ZVN0eWxl
U2hlZXRDYW5kaWRhdGVOb2RlKHRoaXMpOworICAgICAgICBkb2N1bWVudCgpLT5zdHlsZVNoZWV0
Q29sbGVjdGlvbigpLT5yZW1vdmVTdHlsZVNoZWV0Q2FuZGlkYXRlTm9kZSh0aGlzKTsKIAogICAg
IGxpbmtMb2FkRXZlbnRTZW5kZXIoKS5jYW5jZWxFdmVudCh0aGlzKTsKIH0KQEAgLTI1NCw3ICsy
NTUsNyBAQCBOb2RlOjpJbnNlcnRpb25Ob3RpZmljYXRpb25SZXF1ZXN0IEhUTUxMCiAgICAgaWYg
KG1faXNJblNoYWRvd1RyZWUpCiAgICAgICAgIHJldHVybiBJbnNlcnRpb25Eb25lOwogCi0gICAg
ZG9jdW1lbnQoKS0+YWRkU3R5bGVTaGVldENhbmRpZGF0ZU5vZGUodGhpcywgbV9jcmVhdGVkQnlQ
YXJzZXIpOworICAgIGRvY3VtZW50KCktPnN0eWxlU2hlZXRDb2xsZWN0aW9uKCktPmFkZFN0eWxl
U2hlZXRDYW5kaWRhdGVOb2RlKHRoaXMsIG1fY3JlYXRlZEJ5UGFyc2VyKTsKIAogICAgIHByb2Nl
c3MoKTsKICAgICByZXR1cm4gSW5zZXJ0aW9uRG9uZTsKQEAgLTI3Miw3ICsyNzMsNyBAQCB2b2lk
IEhUTUxMaW5rRWxlbWVudDo6cmVtb3ZlZEZyb20oQ29udGFpCiAgICAgICAgIEFTU0VSVCghbV9z
aGVldCk7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgZG9jdW1lbnQoKS0+cmVtb3ZlU3R5
bGVTaGVldENhbmRpZGF0ZU5vZGUodGhpcyk7CisgICAgZG9jdW1lbnQoKS0+c3R5bGVTaGVldENv
bGxlY3Rpb24oKS0+cmVtb3ZlU3R5bGVTaGVldENhbmRpZGF0ZU5vZGUodGhpcyk7CiAKICAgICBp
ZiAobV9zaGVldCkKICAgICAgICAgY2xlYXJTaGVldCgpOwpAQCAtNDU1LDcgKzQ1Niw3IEBAIHZv
aWQgSFRNTExpbmtFbGVtZW50OjphZGRQZW5kaW5nU2hlZXQoUGUKIAogICAgIGlmIChtX3BlbmRp
bmdTaGVldFR5cGUgPT0gTm9uQmxvY2tpbmcpCiAgICAgICAgIHJldHVybjsKLSAgICBkb2N1bWVu
dCgpLT5hZGRQZW5kaW5nU2hlZXQoKTsKKyAgICBkb2N1bWVudCgpLT5zdHlsZVNoZWV0Q29sbGVj
dGlvbigpLT5hZGRQZW5kaW5nU2hlZXQoKTsKIH0KIAogdm9pZCBIVE1MTGlua0VsZW1lbnQ6OnJl
bW92ZVBlbmRpbmdTaGVldChSZW1vdmVQZW5kaW5nU2hlZXROb3RpZmljYXRpb25UeXBlIG5vdGlm
aWNhdGlvbikKQEAgLTQ3MSwxMCArNDcyLDEwIEBAIHZvaWQgSFRNTExpbmtFbGVtZW50OjpyZW1v
dmVQZW5kaW5nU2hlZXQKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGRvY3VtZW50KCkt
PnJlbW92ZVBlbmRpbmdTaGVldCgKKyAgICBkb2N1bWVudCgpLT5zdHlsZVNoZWV0Q29sbGVjdGlv
bigpLT5yZW1vdmVQZW5kaW5nU2hlZXQoCiAgICAgICAgIG5vdGlmaWNhdGlvbiA9PSBSZW1vdmVQ
ZW5kaW5nU2hlZXROb3RpZnlJbW1lZGlhdGVseQotICAgICAgICA/IERvY3VtZW50OjpSZW1vdmVQ
ZW5kaW5nU2hlZXROb3RpZnlJbW1lZGlhdGVseQotICAgICAgICA6IERvY3VtZW50OjpSZW1vdmVQ
ZW5kaW5nU2hlZXROb3RpZnlMYXRlcik7CisgICAgICAgID8gRG9jdW1lbnRTdHlsZVNoZWV0Q29s
bGVjdGlvbjo6UmVtb3ZlUGVuZGluZ1NoZWV0Tm90aWZ5SW1tZWRpYXRlbHkKKyAgICAgICAgOiBE
b2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOjpSZW1vdmVQZW5kaW5nU2hlZXROb3RpZnlMYXRl
cik7CiB9CiAKIERPTVNldHRhYmxlVG9rZW5MaXN0KiBIVE1MTGlua0VsZW1lbnQ6OnNpemVzKCkg
Y29uc3QKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2h0bWwvSFRNTFF1b3RlRWxlbWVudC5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MUXVvdGVFbGVtZW50LmNwcAkocmV2
aXNpb24gMTI5NDA3KQorKysgU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MUXVvdGVFbGVtZW50LmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgIkhUTUxRdW90ZUVs
ZW1lbnQuaCIKIAogI2luY2x1ZGUgIkRvY3VtZW50LmgiCisjaW5jbHVkZSAiRG9jdW1lbnRTdHls
ZVNoZWV0Q29sbGVjdGlvbi5oIgogI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgogCiBuYW1lc3BhY2Ug
V2ViQ29yZSB7CkBAIC00NCw3ICs0NSw3IEBAIFBhc3NSZWZQdHI8SFRNTFF1b3RlRWxlbWVudD4g
SFRNTFF1b3RlRWwKIE5vZGU6Okluc2VydGlvbk5vdGlmaWNhdGlvblJlcXVlc3QgSFRNTFF1b3Rl
RWxlbWVudDo6aW5zZXJ0ZWRJbnRvKENvbnRhaW5lck5vZGUqIGluc2VydGlvblBvaW50KQogewog
ICAgIGlmIChoYXNUYWdOYW1lKHFUYWcpKQotICAgICAgICBkb2N1bWVudCgpLT5zZXRVc2VzQmVm
b3JlQWZ0ZXJSdWxlcyh0cnVlKTsKKyAgICAgICAgZG9jdW1lbnQoKS0+c3R5bGVTaGVldENvbGxl
Y3Rpb24oKS0+c2V0VXNlc0JlZm9yZUFmdGVyUnVsZXNPdmVycmlkZSh0cnVlKTsKIAogICAgIHJl
dHVybiBIVE1MRWxlbWVudDo6aW5zZXJ0ZWRJbnRvKGluc2VydGlvblBvaW50KTsKIH0KSW5kZXg6
IFNvdXJjZS9XZWJDb3JlL2h0bWwvSFRNTFZpZXdTb3VyY2VEb2N1bWVudC5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MVmlld1NvdXJjZURvY3VtZW50LmNwcAkocmV2
aXNpb24gMTI5NDA3KQorKysgU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MVmlld1NvdXJjZURvY3Vt
ZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjcsNiArMjcsNyBAQAogCiAjaW5jbHVkZSAiQXR0
cmlidXRlLmgiCiAjaW5jbHVkZSAiRE9NSW1wbGVtZW50YXRpb24uaCIKKyNpbmNsdWRlICJEb2N1
bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmgiCiAjaW5jbHVkZSAiSFRNTEFuY2hvckVsZW1lbnQu
aCIKICNpbmNsdWRlICJIVE1MQlJFbGVtZW50LmgiCiAjaW5jbHVkZSAiSFRNTEJhc2VFbGVtZW50
LmgiCkBAIC01Miw3ICs1Myw3IEBAIEhUTUxWaWV3U291cmNlRG9jdW1lbnQ6OkhUTUxWaWV3U291
cmNlRG8KICAgICA6IEhUTUxEb2N1bWVudChmcmFtZSwgdXJsKQogICAgICwgbV90eXBlKG1pbWVU
eXBlKQogewotICAgIHNldFVzZXNCZWZvcmVBZnRlclJ1bGVzKHRydWUpOworICAgIHN0eWxlU2hl
ZXRDb2xsZWN0aW9uKCktPnNldFVzZXNCZWZvcmVBZnRlclJ1bGVzT3ZlcnJpZGUodHJ1ZSk7CiAg
ICAgc2V0SXNWaWV3U291cmNlKHRydWUpOwogCiAgICAgc2V0Q29tcGF0aWJpbGl0eU1vZGUoUXVp
cmtzTW9kZSk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9tYXRobWwvTWF0aE1MTWF0aEVsZW1lbnQu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL21hdGhtbC9NYXRoTUxNYXRoRWxlbWVu
dC5jcHAJKHJldmlzaW9uIDEyOTQwNykKKysrIFNvdXJjZS9XZWJDb3JlL21hdGhtbC9NYXRoTUxN
YXRoRWxlbWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ3LDcgKzQ3LDcgQEAgTm9kZTo6SW5z
ZXJ0aW9uTm90aWZpY2F0aW9uUmVxdWVzdCBNYXRoTQogewogICAgIC8vIFRoZXJlIGFyZSBzaWJs
aW5nIHJ1bGVzIGluIHRoZSBNYXRoTUwgZGVmYXVsdCBzdHlsZS4KICAgICBpZiAoaW5zZXJ0aW9u
UG9pbnQtPmluRG9jdW1lbnQoKSkKLSAgICAgICAgZG9jdW1lbnQoKS0+c2V0VXNlc1NpYmxpbmdS
dWxlcyh0cnVlKTsKKyAgICAgICAgZG9jdW1lbnQoKS0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+
c2V0VXNlc1NpYmxpbmdSdWxlc092ZXJyaWRlKHRydWUpOwogICAgIHJldHVybiBNYXRoTUxJbmxp
bmVDb250YWluZXJFbGVtZW50OjppbnNlcnRlZEludG8oaW5zZXJ0aW9uUG9pbnQpOwogfQogCklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9wYWdlL1BhZ2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL3BhZ2UvUGFnZS5jcHAJKHJldmlzaW9uIDEyOTQwNykKKysrIFNvdXJjZS9XZWJDb3Jl
L3BhZ2UvUGFnZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRl
ICJDb250ZXh0TWVudUNvbnRyb2xsZXIuaCIKICNpbmNsdWRlICJET01XaW5kb3cuaCIKICNpbmNs
dWRlICJEb2N1bWVudE1hcmtlckNvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJEb2N1bWVudFN0eWxl
U2hlZXRDb2xsZWN0aW9uLmgiCiAjaW5jbHVkZSAiRHJhZ0NvbnRyb2xsZXIuaCIKICNpbmNsdWRl
ICJFZGl0b3JDbGllbnQuaCIKICNpbmNsdWRlICJFdmVudC5oIgpAQCAtODM4LDcgKzgzOSw3IEBA
IHZvaWQgUGFnZTo6dXNlclN0eWxlU2hlZXRMb2NhdGlvbkNoYW5nZWQKIAogICAgIGZvciAoRnJh
bWUqIGZyYW1lID0gbWFpbkZyYW1lKCk7IGZyYW1lOyBmcmFtZSA9IGZyYW1lLT50cmVlKCktPnRy
YXZlcnNlTmV4dCgpKSB7CiAgICAgICAgIGlmIChmcmFtZS0+ZG9jdW1lbnQoKSkKLSAgICAgICAg
ICAgIGZyYW1lLT5kb2N1bWVudCgpLT51cGRhdGVQYWdlVXNlclNoZWV0KCk7CisgICAgICAgICAg
ICBmcmFtZS0+ZG9jdW1lbnQoKS0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+dXBkYXRlUGFnZVVz
ZXJTaGVldCgpOwogICAgIH0KIH0KIApJbmRleDogU291cmNlL1dlYkNvcmUvcGFnZS9QYWdlR3Jv
dXAuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BhZ2UvUGFnZUdyb3VwLmNwcAko
cmV2aXNpb24gMTI5NDA3KQorKysgU291cmNlL1dlYkNvcmUvcGFnZS9QYWdlR3JvdXAuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSAiQ2hyb21lLmgiCiAjaW5j
bHVkZSAiQ2hyb21lQ2xpZW50LmgiCiAjaW5jbHVkZSAiRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJE
b2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmgiCiAjaW5jbHVkZSAiRnJhbWUuaCIKICNpbmNs
dWRlICJHcm91cFNldHRpbmdzLmgiCiAjaW5jbHVkZSAiUGFnZS5oIgpAQCAtMzkxLDcgKzM5Miw3
IEBAIHZvaWQgUGFnZUdyb3VwOjpyZXNldFVzZXJTdHlsZUNhY2hlSW5BbGwKICAgICBIYXNoU2V0
PFBhZ2UqPjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV9wYWdlcy5lbmQoKTsKICAgICBmb3IgKEhh
c2hTZXQ8UGFnZSo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fcGFnZXMuYmVnaW4oKTsgaXQgIT0g
ZW5kOyArK2l0KSB7CiAgICAgICAgIGZvciAoRnJhbWUqIGZyYW1lID0gKCppdCktPm1haW5GcmFt
ZSgpOyBmcmFtZTsgZnJhbWUgPSBmcmFtZS0+dHJlZSgpLT50cmF2ZXJzZU5leHQoKSkKLSAgICAg
ICAgICAgIGZyYW1lLT5kb2N1bWVudCgpLT51cGRhdGVQYWdlR3JvdXBVc2VyU2hlZXRzKCk7Cisg
ICAgICAgICAgICBmcmFtZS0+ZG9jdW1lbnQoKS0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+dXBk
YXRlUGFnZUdyb3VwVXNlclNoZWV0cygpOwogICAgIH0KIH0KIApJbmRleDogU291cmNlL1dlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlckJSLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9y
ZW5kZXJpbmcvUmVuZGVyQlIuY3BwCShyZXZpc2lvbiAxMjk0MDcpCisrKyBTb3VyY2UvV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVyQlIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00MCw3ICs0MCw3IEBA
IFJlbmRlckJSOjp+UmVuZGVyQlIoKQogCiBpbnQgUmVuZGVyQlI6OmxpbmVIZWlnaHQoYm9vbCBm
aXJzdExpbmUpIGNvbnN0CiB7Ci0gICAgaWYgKGZpcnN0TGluZSAmJiBkb2N1bWVudCgpLT51c2Vz
Rmlyc3RMaW5lUnVsZXMoKSkgeworICAgIGlmIChmaXJzdExpbmUgJiYgZG9jdW1lbnQoKS0+c3R5
bGVTaGVldENvbGxlY3Rpb24oKS0+dXNlc0ZpcnN0TGluZVJ1bGVzKCkpIHsKICAgICAgICAgUmVu
ZGVyU3R5bGUqIHMgPSBzdHlsZShmaXJzdExpbmUpOwogICAgICAgICBpZiAocyAhPSBzdHlsZSgp
KQogICAgICAgICAgICAgcmV0dXJuIHMtPmNvbXB1dGVkTGluZUhlaWdodCh2aWV3KCkpOwpJbmRl
eDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suY3BwCShyZXZpc2lvbiAxMjk0
MDcpCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0zNDcsNyArMzQ3LDcgQEAgdm9pZCBSZW5kZXJCbG9jazo6c3R5bGVEaWRDaGFu
Z2UoU3R5bGVEaQogICAgIG1fbGluZUhlaWdodCA9IC0xOwogCiAgICAgLy8gVXBkYXRlIHBzZXVk
b3MgZm9yIDpiZWZvcmUgYW5kIDphZnRlciBub3cuCi0gICAgaWYgKCFpc0Fub255bW91cygpICYm
IGRvY3VtZW50KCktPnVzZXNCZWZvcmVBZnRlclJ1bGVzKCkgJiYgY2FuSGF2ZUdlbmVyYXRlZENo
aWxkcmVuKCkpIHsKKyAgICBpZiAoIWlzQW5vbnltb3VzKCkgJiYgZG9jdW1lbnQoKS0+c3R5bGVT
aGVldENvbGxlY3Rpb24oKS0+dXNlc0JlZm9yZUFmdGVyUnVsZXMoKSAmJiBjYW5IYXZlR2VuZXJh
dGVkQ2hpbGRyZW4oKSkgewogICAgICAgICB1cGRhdGVCZWZvcmVBZnRlckNvbnRlbnQoQkVGT1JF
KTsKICAgICAgICAgdXBkYXRlQmVmb3JlQWZ0ZXJDb250ZW50KEFGVEVSKTsKICAgICB9CkBAIC02
MDIsNyArNjAyLDcgQEAgdm9pZCBSZW5kZXJCbG9jazo6c3BsaXRCbG9ja3MoUmVuZGVyQmxvYwog
ICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBjdXJyID0gdG9SZW5kZXJCb3hNb2RlbE9iamVjdChw
YXJlbnQoKSk7CiAgICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGN1cnJDaGlsZCA9IHRoaXM7CiAg
ICAgUmVuZGVyT2JqZWN0KiBjdXJyQ2hpbGROZXh0U2libGluZyA9IGN1cnJDaGlsZC0+bmV4dFNp
YmxpbmcoKTsKLSAgICBib29sIGRvY3VtZW50VXNlc0JlZm9yZUFmdGVyUnVsZXMgPSBkb2N1bWVu
dCgpLT51c2VzQmVmb3JlQWZ0ZXJSdWxlcygpOyAKKyAgICBib29sIGRvY3VtZW50VXNlc0JlZm9y
ZUFmdGVyUnVsZXMgPSBkb2N1bWVudCgpLT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpLT51c2VzQmVm
b3JlQWZ0ZXJSdWxlcygpOwogCiAgICAgLy8gTm90ZTogfHRoaXN8IGNhbiBiZSBkZXN0cm95ZWQg
aW5zaWRlIHRoaXMgbG9vcCBpZiBpdCBpcyBhbiBlbXB0eSBhbm9ueW1vdXMKICAgICAvLyBibG9j
ayBhbmQgd2UgdHJ5IHRvIGNhbGwgdXBkYXRlQmVmb3JlQWZ0ZXJDb250ZW50IGluc2lkZSB3aGlj
aCByZW1vdmVzIHRoZQpAQCAtODc3LDcgKzg3Nyw3IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmFkZENo
aWxkSWdub3JpbmdBbm9ueW0KICAgICAgICAgICAgIC8vIGNvbnRlbnQgZ2V0cyBwcm9wZXJseSBk
ZXN0cm95ZWQuCiAgICAgICAgICAgICBib29sIGlzRmlyc3RDaGlsZCA9IChiZWZvcmVDaGlsZCA9
PSBmaXJzdENoaWxkKCkpOwogICAgICAgICAgICAgYm9vbCBpc0xhc3RDaGlsZCA9IChiZWZvcmVD
aGlsZCA9PSBsYXN0Q2hpbGQoKSk7Ci0gICAgICAgICAgICBpZiAoZG9jdW1lbnQoKS0+dXNlc0Jl
Zm9yZUFmdGVyUnVsZXMoKSkKKyAgICAgICAgICAgIGlmIChkb2N1bWVudCgpLT5zdHlsZVNoZWV0
Q29sbGVjdGlvbigpLT51c2VzQmVmb3JlQWZ0ZXJSdWxlcygpKQogICAgICAgICAgICAgICAgIGNo
aWxkcmVuKCktPnVwZGF0ZUJlZm9yZUFmdGVyQ29udGVudCh0aGlzLCBBRlRFUik7CiAgICAgICAg
ICAgICBpZiAoaXNMYXN0Q2hpbGQgJiYgYmVmb3JlQ2hpbGQgIT0gbGFzdENoaWxkKCkpIHsKICAg
ICAgICAgICAgICAgICAvLyBXZSBkZXN0cm95ZWQgdGhlIGxhc3QgY2hpbGQsIHNvIG5vdyB3ZSBu
ZWVkIHRvIHVwZGF0ZSBvdXIgaW5zZXJ0aW9uCkBAIC02MTUzLDcgKzYxNTMsNyBAQCBMYXlvdXRV
bml0IFJlbmRlckJsb2NrOjpsaW5lSGVpZ2h0KGJvb2wgCiAgICAgaWYgKGlzUmVwbGFjZWQoKSAm
JiBsaW5lUG9zaXRpb25Nb2RlID09IFBvc2l0aW9uT25Db250YWluaW5nTGluZSkKICAgICAgICAg
cmV0dXJuIFJlbmRlckJveDo6bGluZUhlaWdodChmaXJzdExpbmUsIGRpcmVjdGlvbiwgbGluZVBv
c2l0aW9uTW9kZSk7CiAKLSAgICBpZiAoZmlyc3RMaW5lICYmIGRvY3VtZW50KCktPnVzZXNGaXJz
dExpbmVSdWxlcygpKSB7CisgICAgaWYgKGZpcnN0TGluZSAmJiBkb2N1bWVudCgpLT5zdHlsZVNo
ZWV0Q29sbGVjdGlvbigpLT51c2VzRmlyc3RMaW5lUnVsZXMoKSkgewogICAgICAgICBSZW5kZXJT
dHlsZSogcyA9IHN0eWxlKGZpcnN0TGluZSk7CiAgICAgICAgIGlmIChzICE9IHN0eWxlKCkpCiAg
ICAgICAgICAgICByZXR1cm4gcy0+Y29tcHV0ZWRMaW5lSGVpZ2h0KHZpZXcoKSk7CkBAIC02NDYx
LDcgKzY0NjEsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjpjcmVhdGVGaXJzdExldHRlclJlbmRlCiAK
IHZvaWQgUmVuZGVyQmxvY2s6OnVwZGF0ZUZpcnN0TGV0dGVyKCkKIHsKLSAgICBpZiAoIWRvY3Vt
ZW50KCktPnVzZXNGaXJzdExldHRlclJ1bGVzKCkpCisgICAgaWYgKCFkb2N1bWVudCgpLT5zdHls
ZVNoZWV0Q29sbGVjdGlvbigpLT51c2VzRmlyc3RMZXR0ZXJSdWxlcygpKQogICAgICAgICByZXR1
cm47CiAgICAgLy8gRG9uJ3QgcmVjdXIKICAgICBpZiAoc3R5bGUoKS0+c3R5bGVUeXBlKCkgPT0g
RklSU1RfTEVUVEVSKQpJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlcklubGlu
ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlcklubGlu
ZS5jcHAJKHJldmlzaW9uIDEyOTQwNykKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5k
ZXJJbmxpbmUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xOTQsNyArMTk0LDcgQEAgdm9pZCBSZW5k
ZXJJbmxpbmU6OnN0eWxlRGlkQ2hhbmdlKFN0eWxlRAogICAgIH0KIAogICAgIC8vIFVwZGF0ZSBw
c2V1ZG9zIGZvciA6YmVmb3JlIGFuZCA6YWZ0ZXIgbm93LgotICAgIGlmICghaXNBbm9ueW1vdXMo
KSAmJiBkb2N1bWVudCgpLT51c2VzQmVmb3JlQWZ0ZXJSdWxlcygpKSB7CisgICAgaWYgKCFpc0Fu
b255bW91cygpICYmIGRvY3VtZW50KCktPnN0eWxlU2hlZXRDb2xsZWN0aW9uKCktPnVzZXNCZWZv
cmVBZnRlclJ1bGVzKCkpIHsKICAgICAgICAgY2hpbGRyZW4oKS0+dXBkYXRlQmVmb3JlQWZ0ZXJD
b250ZW50KHRoaXMsIEJFRk9SRSk7CiAgICAgICAgIGNoaWxkcmVuKCktPnVwZGF0ZUJlZm9yZUFm
dGVyQ29udGVudCh0aGlzLCBBRlRFUik7CiAgICAgfQpAQCAtMjE4LDcgKzIxOCw3IEBAIHZvaWQg
UmVuZGVySW5saW5lOjp1cGRhdGVBbHdheXNDcmVhdGVMaW4KICAgICAgICAgfHwgcGFyZW50U3R5
bGUtPmxpbmVIZWlnaHQoKSAhPSBzdHlsZSgpLT5saW5lSGVpZ2h0KCkpKQogICAgICAgICB8fCAo
aW5SZW5kZXJGbG93VGhyZWFkKCkgJiYgZW5jbG9zaW5nUmVuZGVyRmxvd1RocmVhZCgpLT5oYXNS
ZWdpb25zV2l0aFN0eWxpbmcoKSk7CiAKLSAgICBpZiAoIWFsd2F5c0NyZWF0ZUxpbmVCb3hlcyAm
JiBjaGVja0ZvbnRzICYmIGRvY3VtZW50KCktPnVzZXNGaXJzdExpbmVSdWxlcygpKSB7CisgICAg
aWYgKCFhbHdheXNDcmVhdGVMaW5lQm94ZXMgJiYgY2hlY2tGb250cyAmJiBkb2N1bWVudCgpLT5z
dHlsZVNoZWV0Q29sbGVjdGlvbigpLT51c2VzRmlyc3RMaW5lUnVsZXMoKSkgewogICAgICAgICAv
LyBIYXZlIHRvIGNoZWNrIHRoZSBmaXJzdCBsaW5lIHN0eWxlIGFzIHdlbGwuCiAgICAgICAgIHBh
cmVudFN0eWxlID0gcGFyZW50KCktPnN0eWxlKHRydWUpOwogICAgICAgICBSZW5kZXJTdHlsZSog
Y2hpbGRTdHlsZSA9IHN0eWxlKHRydWUpOwpAQCAtMzI0LDcgKzMyNCw3IEBAIHZvaWQgUmVuZGVy
SW5saW5lOjphZGRDaGlsZElnbm9yaW5nQ29udGkKICAgICAgICAgLy8gaGFzIHRvIG1vdmUgaW50
byB0aGUgaW5saW5lIGNvbnRpbnVhdGlvbi4gIENhbGwgdXBkYXRlQmVmb3JlQWZ0ZXJDb250ZW50
IHRvIGVuc3VyZSB0aGF0IG91ciA6YWZ0ZXIKICAgICAgICAgLy8gY29udGVudCBnZXRzIHByb3Bl
cmx5IGRlc3Ryb3llZC4KICAgICAgICAgYm9vbCBpc0xhc3RDaGlsZCA9IChiZWZvcmVDaGlsZCA9
PSBsYXN0Q2hpbGQoKSk7Ci0gICAgICAgIGlmIChkb2N1bWVudCgpLT51c2VzQmVmb3JlQWZ0ZXJS
dWxlcygpKQorICAgICAgICBpZiAoZG9jdW1lbnQoKS0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+
dXNlc0JlZm9yZUFmdGVyUnVsZXMoKSkKICAgICAgICAgICAgIGNoaWxkcmVuKCktPnVwZGF0ZUJl
Zm9yZUFmdGVyQ29udGVudCh0aGlzLCBBRlRFUik7CiAgICAgICAgIGlmIChpc0xhc3RDaGlsZCAm
JiBiZWZvcmVDaGlsZCAhPSBsYXN0Q2hpbGQoKSkKICAgICAgICAgICAgIGJlZm9yZUNoaWxkID0g
MDsgLy8gV2UgZGVzdHJveWVkIHRoZSBsYXN0IGNoaWxkLCBzbyBub3cgd2UgbmVlZCB0byB1cGRh
dGUgb3VyIGluc2VydGlvbgpAQCAtMzk5LDcgKzM5OSw3IEBAIHZvaWQgUmVuZGVySW5saW5lOjpz
cGxpdElubGluZXMoUmVuZGVyQmwKICAgICAgICAgICAgIC8vIFNvbWVvbmUgbWF5IGhhdmUgaW5k
aXJlY3RseSBjYXVzZWQgYSA8cT4gdG8gc3BsaXQuICBXaGVuIHRoaXMgaGFwcGVucywgdGhlIDph
ZnRlciBjb250ZW50CiAgICAgICAgICAgICAvLyBoYXMgdG8gbW92ZSBpbnRvIHRoZSBpbmxpbmUg
Y29udGludWF0aW9uLiAgQ2FsbCB1cGRhdGVCZWZvcmVBZnRlckNvbnRlbnQgdG8gZW5zdXJlIHRo
YXQgdGhlIGlubGluZSdzIDphZnRlcgogICAgICAgICAgICAgLy8gY29udGVudCBnZXRzIHByb3Bl
cmx5IGRlc3Ryb3llZC4KLSAgICAgICAgICAgIGlmIChkb2N1bWVudCgpLT51c2VzQmVmb3JlQWZ0
ZXJSdWxlcygpKQorICAgICAgICAgICAgaWYgKGRvY3VtZW50KCktPnN0eWxlU2hlZXRDb2xsZWN0
aW9uKCktPnVzZXNCZWZvcmVBZnRlclJ1bGVzKCkpCiAgICAgICAgICAgICAgICAgaW5saW5lQ3Vy
ci0+Y2hpbGRyZW4oKS0+dXBkYXRlQmVmb3JlQWZ0ZXJDb250ZW50KGlubGluZUN1cnIsIEFGVEVS
KTsKIAogICAgICAgICAgICAgLy8gTm93IHdlIG5lZWQgdG8gdGFrZSBhbGwgb2YgdGhlIGNoaWxk
cmVuIHN0YXJ0aW5nIGZyb20gdGhlIGZpcnN0IGNoaWxkCkBAIC0xMjgzLDcgKzEyODMsNyBAQCBJ
bmxpbmVGbG93Qm94KiBSZW5kZXJJbmxpbmU6OmNyZWF0ZUFuZEFwCiAKIExheW91dFVuaXQgUmVu
ZGVySW5saW5lOjpsaW5lSGVpZ2h0KGJvb2wgZmlyc3RMaW5lLCBMaW5lRGlyZWN0aW9uTW9kZSAv
KmRpcmVjdGlvbiovLCBMaW5lUG9zaXRpb25Nb2RlIC8qbGluZVBvc2l0aW9uTW9kZSovKSBjb25z
dAogewotICAgIGlmIChmaXJzdExpbmUgJiYgZG9jdW1lbnQoKS0+dXNlc0ZpcnN0TGluZVJ1bGVz
KCkpIHsKKyAgICBpZiAoZmlyc3RMaW5lICYmIGRvY3VtZW50KCktPnN0eWxlU2hlZXRDb2xsZWN0
aW9uKCktPnVzZXNGaXJzdExpbmVSdWxlcygpKSB7CiAgICAgICAgIFJlbmRlclN0eWxlKiBzID0g
c3R5bGUoZmlyc3RMaW5lKTsKICAgICAgICAgaWYgKHMgIT0gc3R5bGUoKSkKICAgICAgICAgICAg
IHJldHVybiBzLT5jb21wdXRlZExpbmVIZWlnaHQodmlldygpKTsKSW5kZXg6IFNvdXJjZS9XZWJD
b3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3QuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJD
b3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3QuY3BwCShyZXZpc2lvbiAxMjk0MDcpCisrKyBTb3Vy
Y2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MjU5Nyw3ICsyNTk3LDcgQEAgdm9pZCBSZW5kZXJPYmplY3Q6OmxheW91dCgpCiAKIFBhc3NSZWZQ
dHI8UmVuZGVyU3R5bGU+IFJlbmRlck9iamVjdDo6dW5jYWNoZWRGaXJzdExpbmVTdHlsZShSZW5k
ZXJTdHlsZSogc3R5bGUpIGNvbnN0CiB7Ci0gICAgaWYgKCFkb2N1bWVudCgpLT51c2VzRmlyc3RM
aW5lUnVsZXMoKSkKKyAgICBpZiAoIWRvY3VtZW50KCktPnN0eWxlU2hlZXRDb2xsZWN0aW9uKCkt
PnVzZXNGaXJzdExpbmVSdWxlcygpKQogICAgICAgICByZXR1cm4gMDsKIAogICAgIEFTU0VSVCgh
aXNUZXh0KCkpOwpAQCAtMjYxOCw3ICsyNjE4LDcgQEAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4g
UmVuZGVyT2JqZWN0Ojp1bgogCiBSZW5kZXJTdHlsZSogUmVuZGVyT2JqZWN0OjpmaXJzdExpbmVT
dHlsZVNsb3dDYXNlKCkgY29uc3QKIHsKLSAgICBBU1NFUlQoZG9jdW1lbnQoKS0+dXNlc0ZpcnN0
TGluZVJ1bGVzKCkpOworICAgIEFTU0VSVChkb2N1bWVudCgpLT5zdHlsZVNoZWV0Q29sbGVjdGlv
bigpLT51c2VzRmlyc3RMaW5lUnVsZXMoKSk7CiAKICAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSBt
X3N0eWxlLmdldCgpOwogICAgIGNvbnN0IFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSBpc1RleHQo
KSA/IHBhcmVudCgpIDogdGhpczsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5k
ZXJPYmplY3QuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVy
T2JqZWN0LmgJKHJldmlzaW9uIDEyOTQwNykKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9S
ZW5kZXJPYmplY3QuaAkod29ya2luZyBjb3B5KQpAQCAtMjcsNiArMjcsNyBAQAogI2RlZmluZSBS
ZW5kZXJPYmplY3RfaAogCiAjaW5jbHVkZSAiQ2FjaGVkSW1hZ2VDbGllbnQuaCIKKyNpbmNsdWRl
ICJEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmgiCiAjaW5jbHVkZSAiRWxlbWVudC5oIgog
I2luY2x1ZGUgIkZyYWN0aW9uYWxMYXlvdXRVbml0LmgiCiAjaW5jbHVkZSAiRmxvYXRRdWFkLmgi
CkBAIC03MzUsNyArNzM2LDcgQEAgcHVibGljOgogICAgIHZpcnR1YWwgTGF5b3V0VW5pdCBtYXhQ
cmVmZXJyZWRMb2dpY2FsV2lkdGgoKSBjb25zdCB7IHJldHVybiAwOyB9CiAKICAgICBSZW5kZXJT
dHlsZSogc3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3N0eWxlLmdldCgpOyB9Ci0gICAgUmVuZGVy
U3R5bGUqIGZpcnN0TGluZVN0eWxlKCkgY29uc3QgeyByZXR1cm4gZG9jdW1lbnQoKS0+dXNlc0Zp
cnN0TGluZVJ1bGVzKCkgPyBmaXJzdExpbmVTdHlsZVNsb3dDYXNlKCkgOiBzdHlsZSgpOyB9Cisg
ICAgUmVuZGVyU3R5bGUqIGZpcnN0TGluZVN0eWxlKCkgY29uc3QgeyByZXR1cm4gZG9jdW1lbnQo
KS0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+dXNlc0ZpcnN0TGluZVJ1bGVzKCkgPyBmaXJzdExp
bmVTdHlsZVNsb3dDYXNlKCkgOiBzdHlsZSgpOyB9CiAgICAgUmVuZGVyU3R5bGUqIHN0eWxlKGJv
b2wgZmlyc3RMaW5lKSBjb25zdCB7IHJldHVybiBmaXJzdExpbmUgPyBmaXJzdExpbmVTdHlsZSgp
IDogc3R5bGUoKTsgfQogCiAgICAgLy8gVXNlZCBvbmx5IGJ5IEVsZW1lbnQ6OnBzZXVkb1N0eWxl
Q2FjaGVJc0ludmFsaWQgdG8gZ2V0IGEgZmlyc3QgbGluZSBzdHlsZSBiYXNlZCBvZmYgb2YgYQpJ
bmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdENoaWxkTGlzdC5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdENoaWxk
TGlzdC5jcHAJKHJldmlzaW9uIDEyOTQwNykKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9S
ZW5kZXJPYmplY3RDaGlsZExpc3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNjksNyArMzY5LDcg
QEAgc3RhdGljIFJlbmRlck9iamVjdCogZW5zdXJlQmVmb3JlQWZ0ZXJDbwogdm9pZCBSZW5kZXJP
YmplY3RDaGlsZExpc3Q6OnVwZGF0ZUJlZm9yZUFmdGVyQ29udGVudChSZW5kZXJPYmplY3QqIG93
bmVyLCBQc2V1ZG9JZCB0eXBlLCBjb25zdCBSZW5kZXJPYmplY3QqIHN0eWxlZE9iamVjdCkKIHsK
ICAgICAvLyBEb3VibGUgY2hlY2sgdGhhdCB0aGUgZG9jdW1lbnQgZGlkIGluIGZhY3QgdXNlIGdl
bmVyYXRlZCBjb250ZW50IHJ1bGVzLiAgT3RoZXJ3aXNlIHdlIHNob3VsZCBub3QgaGF2ZSBiZWVu
IGNhbGxlZC4KLSAgICBBU1NFUlQob3duZXItPmRvY3VtZW50KCktPnVzZXNCZWZvcmVBZnRlclJ1
bGVzKCkpOworICAgIEFTU0VSVChvd25lci0+ZG9jdW1lbnQoKS0+c3R5bGVTaGVldENvbGxlY3Rp
b24oKS0+dXNlc0JlZm9yZUFmdGVyUnVsZXMoKSk7CiAKICAgICAvLyBJbiBDU1MyLCBiZWZvcmUv
YWZ0ZXIgcHNldWRvLWNvbnRlbnQgY2Fubm90IG5lc3QuICBDaGVjayB0aGlzIGZpcnN0LgogICAg
IGlmIChvd25lci0+c3R5bGUoKS0+c3R5bGVUeXBlKCkgPT0gQkVGT1JFIHx8IG93bmVyLT5zdHls
ZSgpLT5zdHlsZVR5cGUoKSA9PSBBRlRFUikKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmlu
Zy9SZW5kZXJUYWJsZVJvdy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVy
aW5nL1JlbmRlclRhYmxlUm93LmNwcAkocmV2aXNpb24gMTI5NDA3KQorKysgU291cmNlL1dlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlclRhYmxlUm93LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTUsNyAr
NTUsNyBAQCB2b2lkIFJlbmRlclRhYmxlUm93Ojp3aWxsQmVSZW1vdmVkRnJvbVRyCiAKIHZvaWQg
UmVuZGVyVGFibGVSb3c6OnVwZGF0ZUJlZm9yZUFuZEFmdGVyQ29udGVudCgpCiB7Ci0gICAgaWYg
KCFpc0Fub255bW91cygpICYmIGRvY3VtZW50KCktPnVzZXNCZWZvcmVBZnRlclJ1bGVzKCkpIHsK
KyAgICBpZiAoIWlzQW5vbnltb3VzKCkgJiYgZG9jdW1lbnQoKS0+c3R5bGVTaGVldENvbGxlY3Rp
b24oKS0+dXNlc0JlZm9yZUFmdGVyUnVsZXMoKSkgewogICAgICAgICBjaGlsZHJlbigpLT51cGRh
dGVCZWZvcmVBZnRlckNvbnRlbnQodGhpcywgQkVGT1JFKTsKICAgICAgICAgY2hpbGRyZW4oKS0+
dXBkYXRlQmVmb3JlQWZ0ZXJDb250ZW50KHRoaXMsIEFGVEVSKTsKICAgICB9CkluZGV4OiBTb3Vy
Y2UvV2ViQ29yZS9yZW5kZXJpbmcvUm9vdElubGluZUJveC5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1Jvb3RJbmxpbmVCb3guY3BwCShyZXZpc2lvbiAxMjk0MDcp
CisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUm9vdElubGluZUJveC5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTg0Niw3ICs4NDYsNyBAQCBMYXlvdXRVbml0IFJvb3RJbmxpbmVCb3g6OnZlcnRp
Y2FsUG9zaXRpCiAKICAgICAvLyBUaGlzIG1ldGhvZCBkZXRlcm1pbmVzIHRoZSB2ZXJ0aWNhbCBw
b3NpdGlvbiBmb3IgaW5saW5lIGVsZW1lbnRzLgogICAgIGJvb2wgZmlyc3RMaW5lID0gaXNGaXJz
dExpbmVTdHlsZSgpOwotICAgIGlmIChmaXJzdExpbmUgJiYgIXJlbmRlcmVyLT5kb2N1bWVudCgp
LT51c2VzRmlyc3RMaW5lUnVsZXMoKSkKKyAgICBpZiAoZmlyc3RMaW5lICYmICFyZW5kZXJlci0+
ZG9jdW1lbnQoKS0+c3R5bGVTaGVldENvbGxlY3Rpb24oKS0+dXNlc0ZpcnN0TGluZVJ1bGVzKCkp
CiAgICAgICAgIGZpcnN0TGluZSA9IGZhbHNlOwogCiAgICAgLy8gQ2hlY2sgdGhlIGNhY2hlLgpJ
bmRleDogU291cmNlL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViRG9jdW1lbnQuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYkRvY3VtZW50LmNwcAkocmV2aXNp
b24gMTI5NDA3KQorKysgU291cmNlL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViRG9jdW1lbnQuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSAiQ1NTUGFyc2VyTW9k
ZS5oIgogI2luY2x1ZGUgIkRvY3VtZW50LmgiCiAjaW5jbHVkZSAiRG9jdW1lbnRMb2FkZXIuaCIK
KyNpbmNsdWRlICJEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmgiCiAjaW5jbHVkZSAiRG9j
dW1lbnRUeXBlLmgiCiAjaW5jbHVkZSAiRWxlbWVudC5oIgogI2luY2x1ZGUgIkhUTUxBbGxDb2xs
ZWN0aW9uLmgiCkBAIC0xOTYsNyArMTk3LDcgQEAgdm9pZCBXZWJEb2N1bWVudDo6aW5zZXJ0VXNl
clN0eWxlU2hlZXQoYwogICAgIFJlZlB0cjxTdHlsZVNoZWV0Q29udGVudHM+IHBhcnNlZFNoZWV0
ID0gU3R5bGVTaGVldENvbnRlbnRzOjpjcmVhdGUoZG9jdW1lbnQuZ2V0KCkpOwogICAgIHBhcnNl
ZFNoZWV0LT5zZXRJc1VzZXJTdHlsZVNoZWV0KGxldmVsID09IFVzZXJTdHlsZVVzZXJMZXZlbCk7
CiAgICAgcGFyc2VkU2hlZXQtPnBhcnNlU3RyaW5nKHNvdXJjZUNvZGUpOwotICAgIGRvY3VtZW50
LT5hZGRVc2VyU2hlZXQocGFyc2VkU2hlZXQucmVsZWFzZSgpKTsKKyAgICBkb2N1bWVudC0+c3R5
bGVTaGVldENvbGxlY3Rpb24oKS0+YWRkVXNlclNoZWV0KHBhcnNlZFNoZWV0LnJlbGVhc2UoKSk7
CiB9CiAKIHZvaWQgV2ViRG9jdW1lbnQ6OmNhbmNlbEZ1bGxTY3JlZW4oKQo=
</data>
<flag name="review"
          id="177495"
          type_id="1"
          status="+"
          setter="kling"
    />
          </attachment>
      

    </bug>

</bugzilla>