<?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>82386</bug_id>
          
          <creation_ts>2012-03-27 15:03:10 -0700</creation_ts>
          <short_desc>[Win] Some Blob tests crash in CFNetwork in advanceCurrentStream(FormStreamFields*)</short_desc>
          <delta_ts>2012-03-29 12:37:22 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebCore Misc.</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Windows 7</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P1</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Alexey Proskuryakov">ap</reporter>
          <assigned_to name="Alexey Proskuryakov">ap</assigned_to>
          <cc>beidson</cc>
    
    <cc>darin</cc>
    
    <cc>jberlin</cc>
    
    <cc>joepeck</cc>
    
    <cc>levin+threading</cc>
    
    <cc>psolanki</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>589325</commentid>
    <comment_count>0</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2012-03-27 15:03:10 -0700</bug_when>
    <thetext>The code in FormDataStreamCFNet.cpp relies on CFNetwork body parts implementation, which doesn&apos;t know about blobs. We need the same lower level approach we took in FormDataStreamMac.mm originally.

&lt;rdar://problem/11121501&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>589330</commentid>
    <comment_count>1</comment_count>
      <attachid>134147</attachid>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2012-03-27 15:08:15 -0700</bug_when>
    <thetext>Created attachment 134147
proposed fix</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>589340</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-03-27 15:22:48 -0700</bug_when>
    <thetext>Attachment 134147 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCor...&quot; exit_code: 1
Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp:60:  Extra space after ( in function call  [whitespace/parens] [4]
Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp:72:  The parameter name &quot;stream&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp:72:  The parameter name &quot;type&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp:104:  Use 0 instead of NULL.  [readability/null] [5]
Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp:106:  Use 0 instead of NULL.  [readability/null] [5]
Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp:159:  Use 0 instead of NULL.  [readability/null] [5]
Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp:189:  Use 0 instead of NULL.  [readability/null] [5]
Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp:287:  One line control clauses should not use braces.  [whitespace/braces] [4]
Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp:337:  One line control clauses should not use braces.  [whitespace/braces] [4]
Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp:400:  One line control clauses should not use braces.  [whitespace/braces] [4]
Source/WebCore/ChangeLog:1:  ChangeLog entry has no bug number  [changelog/bugnumber] [5]
Total errors found: 11 in 5 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>589358</commentid>
    <comment_count>3</comment_count>
      <attachid>134147</attachid>
    <who name="Build Bot">buildbot</who>
    <bug_when>2012-03-27 15:34:41 -0700</bug_when>
    <thetext>Comment on attachment 134147
proposed fix

Attachment 134147 did not pass win-ews (win):
Output: http://queues.webkit.org/results/12148668</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>590191</commentid>
    <comment_count>4</comment_count>
      <attachid>134351</attachid>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2012-03-28 11:31:29 -0700</bug_when>
    <thetext>Created attachment 134351
build fix attempt</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>590200</commentid>
    <comment_count>5</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-03-28 11:35:48 -0700</bug_when>
    <thetext>Attachment 134351 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCor...&quot; exit_code: 1
Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp:84:  The parameter name &quot;stream&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp:84:  The parameter name &quot;event&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp:85:  The parameter name &quot;alloc&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp:95:  The parameter name &quot;stream&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp:95:  The parameter name &quot;type&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp:127:  Use 0 instead of NULL.  [readability/null] [5]
Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp:129:  Use 0 instead of NULL.  [readability/null] [5]
Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp:182:  Use 0 instead of NULL.  [readability/null] [5]
Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp:212:  Use 0 instead of NULL.  [readability/null] [5]
Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp:310:  One line control clauses should not use braces.  [whitespace/braces] [4]
Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp:422:  One line control clauses should not use braces.  [whitespace/braces] [4]
Total errors found: 11 in 5 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>590247</commentid>
    <comment_count>6</comment_count>
      <attachid>134351</attachid>
    <who name="Build Bot">buildbot</who>
    <bug_when>2012-03-28 12:13:40 -0700</bug_when>
    <thetext>Comment on attachment 134351
build fix attempt

Attachment 134351 did not pass win-ews (win):
Output: http://queues.webkit.org/results/12156252</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>590259</commentid>
    <comment_count>7</comment_count>
      <attachid>134366</attachid>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2012-03-28 12:21:23 -0700</bug_when>
    <thetext>Created attachment 134366
more build fix attempt</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>590266</commentid>
    <comment_count>8</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-03-28 12:23:55 -0700</bug_when>
    <thetext>Attachment 134366 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCor...&quot; exit_code: 1
Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp:84:  The parameter name &quot;stream&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp:84:  The parameter name &quot;event&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp:85:  The parameter name &quot;alloc&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp:95:  The parameter name &quot;stream&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp:95:  The parameter name &quot;type&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Total errors found: 5 in 5 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>590300</commentid>
    <comment_count>9</comment_count>
      <attachid>134366</attachid>
    <who name="Build Bot">buildbot</who>
    <bug_when>2012-03-28 12:47:58 -0700</bug_when>
    <thetext>Comment on attachment 134366
more build fix attempt

Attachment 134366 did not pass win-ews (win):
Output: http://queues.webkit.org/results/12159246</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>590370</commentid>
    <comment_count>10</comment_count>
      <attachid>134386</attachid>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2012-03-28 13:44:18 -0700</bug_when>
    <thetext>Created attachment 134386
more build fixing</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>590378</commentid>
    <comment_count>11</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-03-28 13:49:18 -0700</bug_when>
    <thetext>Attachment 134386 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCor...&quot; exit_code: 1
Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp:84:  The parameter name &quot;stream&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp:84:  The parameter name &quot;event&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp:85:  The parameter name &quot;alloc&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp:95:  The parameter name &quot;stream&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp:95:  The parameter name &quot;type&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Total errors found: 5 in 6 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>590390</commentid>
    <comment_count>12</comment_count>
      <attachid>134386</attachid>
    <who name="Build Bot">buildbot</who>
    <bug_when>2012-03-28 13:57:09 -0700</bug_when>
    <thetext>Comment on attachment 134386
more build fixing

Attachment 134386 did not pass win-ews (win):
Output: http://queues.webkit.org/results/12152403</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>590494</commentid>
    <comment_count>13</comment_count>
      <attachid>134414</attachid>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2012-03-28 15:08:42 -0700</bug_when>
    <thetext>Created attachment 134414
moar!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>590502</commentid>
    <comment_count>14</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-03-28 15:13:38 -0700</bug_when>
    <thetext>Attachment 134414 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCor...&quot; exit_code: 1
Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp:84:  The parameter name &quot;stream&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp:84:  The parameter name &quot;event&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp:85:  The parameter name &quot;alloc&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp:95:  The parameter name &quot;stream&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp:95:  The parameter name &quot;type&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Total errors found: 5 in 7 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>590529</commentid>
    <comment_count>15</comment_count>
      <attachid>134414</attachid>
    <who name="Build Bot">buildbot</who>
    <bug_when>2012-03-28 15:35:26 -0700</bug_when>
    <thetext>Comment on attachment 134414
moar!

Attachment 134414 did not pass win-ews (win):
Output: http://queues.webkit.org/results/12152435</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>590533</commentid>
    <comment_count>16</comment_count>
      <attachid>134428</attachid>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2012-03-28 15:42:26 -0700</bug_when>
    <thetext>Created attachment 134428
moarrrrr!

Wow, so we&apos;ve been building with broken fileSystemRepresentation all the time.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>590537</commentid>
    <comment_count>17</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-03-28 15:45:32 -0700</bug_when>
    <thetext>Attachment 134428 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCor...&quot; exit_code: 1
Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp:84:  The parameter name &quot;stream&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp:84:  The parameter name &quot;event&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp:85:  The parameter name &quot;alloc&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp:95:  The parameter name &quot;stream&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp:95:  The parameter name &quot;type&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Total errors found: 5 in 8 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>590619</commentid>
    <comment_count>18</comment_count>
      <attachid>134428</attachid>
    <who name="Brady Eidson">beidson</who>
    <bug_when>2012-03-28 17:03:03 -0700</bug_when>
    <thetext>Comment on attachment 134428
moarrrrr!

Plz to be fixing the style bot gripes</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>590623</commentid>
    <comment_count>19</comment_count>
      <attachid>134428</attachid>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2012-03-28 17:07:35 -0700</bug_when>
    <thetext>Comment on attachment 134428
moarrrrr!

Actually, I think that we&apos;re keeping all argument names in CF-style code generally.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>590676</commentid>
    <comment_count>20</comment_count>
      <attachid>134428</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-03-28 17:59:00 -0700</bug_when>
    <thetext>Comment on attachment 134428
moarrrrr!

Clearing flags on attachment: 134428

Committed r112482: &lt;http://trac.webkit.org/changeset/112482&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>590677</commentid>
    <comment_count>21</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-03-28 17:59:06 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>590810</commentid>
    <comment_count>22</comment_count>
    <who name="Jessie Berlin">jberlin</who>
    <bug_when>2012-03-28 21:09:53 -0700</bug_when>
    <thetext>Attempted Windows build fix in http://trac.webkit.org/changeset/112498.

Alexey, you should probably look it over to make sure it is right. I tried to go by the error codes in http://msdn.microsoft.com/en-us/library/5814770t.aspx.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>590831</commentid>
    <comment_count>23</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2012-03-28 21:46:38 -0700</bug_when>
    <thetext>What were the build failures? As you can see, EWS built this patch successfully.

It is difficult to tell whether using a different error code will affect anything. CFStreamError structure contains a domain and an error code. Domain for OSStatus codes like fnfErr is kCFStreamErrorDomainMacOSStatus (numerically, it&apos;s 2), but the existing code doesn&apos;t set the domain either. This CFStreamError code is not used immediately, but it&apos;s stored inside CFReamStream for later use.

I think that it would be better to find a fix that doesn&apos;t involve using an unexpected error code. Is there any header in your setup that defines fnfErr? Why does it not have the CoreServices framework?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>591213</commentid>
    <comment_count>24</comment_count>
    <who name="Jessie Berlin">jberlin</who>
    <bug_when>2012-03-29 08:32:39 -0700</bug_when>
    <thetext>(In reply to comment #23)
&gt; What were the build failures? As you can see, EWS built this patch successfully.

6&gt;..\platform\network\cf\FormDataStreamCFNet.cpp(48) : fatal error C1083: Cannot open include file: &apos;CoreServices/CoreServices.h&apos;: No such file or directory

When I resolved that by #defining it out on Windows, I ran into fnfErr not found.

&gt; 
&gt; It is difficult to tell whether using a different error code will affect anything. CFStreamError structure contains a domain and an error code. Domain for OSStatus codes like fnfErr is kCFStreamErrorDomainMacOSStatus (numerically, it&apos;s 2), but the existing code doesn&apos;t set the domain either. This CFStreamError code is not used immediately, but it&apos;s stored inside CFReamStream for later use.
&gt; 
&gt; I think that it would be better to find a fix that doesn&apos;t involve using an unexpected error code. Is there any header in your setup that defines fnfErr? Why does it not have the CoreServices framework?

There was no header on Windows that defines fnfErr.

Also, you will notice that all uses of #include &lt;CoreServices/CoreServices.h&gt; are not defined on Windows.  I don&apos;t see that header on Windows, and I am confused as to how this passed EWS.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>134147</attachid>
            <date>2012-03-27 15:08:15 -0700</date>
            <delta_ts>2012-03-28 11:31:29 -0700</delta_ts>
            <desc>proposed fix</desc>
            <filename>FormDataStream.txt</filename>
            <type>text/plain</type>
            <size>39234</size>
            <attacher name="Alexey Proskuryakov">ap</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDExMjMyMCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI1IEBACisyMDEyLTAzLTI3ICBBbGV4ZXkg
UHJvc2t1cnlha292ICA8YXBAYXBwbGUuY29tPgorCisgICAgICAgIFtXaW5dIFNvbWUgQmxvYiB0
ZXN0cyBjcmFzaCBpbiBDRk5ldHdvcmsgaW4gYWR2YW5jZUN1cnJlbnRTdHJlYW0oRm9ybVN0cmVh
bUZpZWxkcyopCisgICAgICAgIDxyZGFyOi8vcHJvYmxlbS8xMTEyMTUwMT4KKworICAgICAgICBS
ZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBDb3ZlcmVkIGJ5IGV4aXN0aW5n
IHRlc3RzLgorCisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jZi9Gb3JtRGF0YVN0cmVhbUNG
TmV0LmNwcDoKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2NmL0Zvcm1EYXRhU3RyZWFtQ0ZO
ZXQuaDoKKyAgICAgICAgTW92ZWQgbG93IGxldmVsIGltcGxlbWVudGF0aW9uIGZyb20gRm9ybURh
dGFTdHJlYW1NYWMsIGFuZCBleHBvc2VkIGFuIGFkZGl0aW9uYWwgZnVuY3Rpb24KKyAgICAgICAg
dG8gaW1wbGVtZW50IEZvdW5kYXRpb24tYmFzZWQgQVBJIG9uIHRvcCBvZiB0aGlzLgorCisgICAg
ICAgICogcGxhdGZvcm0vbmV0d29yay9tYWMvRm9ybURhdGFTdHJlYW1NYWMuaDoKKyAgICAgICAg
KiBwbGF0Zm9ybS9uZXR3b3JrL21hYy9Gb3JtRGF0YVN0cmVhbU1hYy5tbToKKyAgICAgICAgUmVs
eSBvbiB0b2xsLWZyZWUgYnJpZGdpbmcgYW5kIGltcGxlbWVudGF0aW9uIGRldGFpbHMgdG8gbWFr
ZSB0aGlzIHdvcmsgd2l0aG91dCBkdXBsaWNhdGluZworICAgICAgICBjb2RlLgorICAgICAgICBO
b3RlIHRoYXQgaHR0cEJvZHlGcm9tU3RyZWFtIGlzIGNvbmZ1c2luZyAtIEkgZG9uJ3Qgc2VlIGhv
dyBpdCBjYW4gd29yayB3aGVuIHNlbmRpbmcgc2VyaWFsaXplZAorICAgICAgICByZXF1ZXN0cyBh
Y3Jvc3MgcHJvY2VzcyBib3VuZGFyeS4gV2UgcHJvYmFibHkgb25seSBnZXQgYXdheSB3aXRoIHRo
aXMgYmVjYXVzZSB3ZSBkb24ndCBhdHRlbXB0CisgICAgICAgIHRvIHNlbmQgcmVxdWVzdHMgdG8g
VUkgcHJvY2VzcyBvbmNlIHRoZXkgYWxyZWFkeSBoYXZlIHN0cmVhbXMgYXNzb2NpYXRlZCB3aXRo
IHRoZW0uCisKIDIwMTItMDMtMjYgIEFkYW0gS2xlaW4gIDxhZGFta0BjaHJvbWl1bS5vcmc+CiAK
ICAgICAgICAgQWx3YXlzIHNldCBWOCB3cmFwcGVycyB2aWEgVjhET01XcmFwcGVyOjpzZXRKU1dy
YXBwZXJGb3IqIGluc3RlYWQgb2YgV2Vha1JlZmVyZW5jZU1hcDo6c2V0KCkKSW5kZXg6IFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY2YvRm9ybURhdGFTdHJlYW1DRk5ldC5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jZi9Gb3JtRGF0YVN0
cmVhbUNGTmV0LmNwcAkocmV2aXNpb24gMTEyMTY2KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vbmV0d29yay9jZi9Gb3JtRGF0YVN0cmVhbUNGTmV0LmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDcgQXBwbGUg
SW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwg
MjAwNywgMjAxMiBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCkBAIC0yNiwyMSArMjYsMjEgQEAKICAqIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAgKi8K
IAotLyogb3JpZ2luYWxseSB3cml0dGVuIGJ5IEJlY2t5IFdpbGxyaWNoLCBhZGRpdGlvbmFsIGNv
ZGUgYnkgRGFyaW4gQWRsZXIgKi8KLQogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIkZv
cm1EYXRhU3RyZWFtQ0ZOZXQuaCIKIAotI2lmIFVTRShDRk5FVFdPUkspCi0KKyNpbmNsdWRlICJC
bG9iUmVnaXN0cnlJbXBsLmgiCiAjaW5jbHVkZSAiRmlsZVN5c3RlbS5oIgogI2luY2x1ZGUgIkZv
cm1EYXRhLmgiCi0jaW5jbHVkZSA8Q0ZOZXR3b3JrL0NGVVJMUmVxdWVzdFByaXYuaD4KKyNpbmNs
dWRlICJTY2hlZHVsZVBhaXIuaCIKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPHN5
cy90eXBlcy5oPgogI2luY2x1ZGUgPHd0Zi9Bc3NlcnRpb25zLmg+CiAjaW5jbHVkZSA8d3RmL0hh
c2hNYXAuaD4KKyNpbmNsdWRlIDx3dGYvTWFpblRocmVhZC5oPgogI2luY2x1ZGUgPHd0Zi9SZXRh
aW5QdHIuaD4KLSNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CisjaW5jbHVkZSA8d3RmL1N0
ZExpYkV4dHJhcy5oPgorI2luY2x1ZGUgPHd0Zi9UaHJlYWRpbmcuaD4KIAogI2lmIFBMQVRGT1JN
KE1BQykKICNpbmNsdWRlICJXZWJDb3JlU3lzdGVtSW50ZXJmYWNlLmgiCkBAIC00OCw3NyArNDgs
NDE5IEBACiAjaW5jbHVkZSA8V2ViS2l0U3lzdGVtSW50ZXJmYWNlL1dlYktpdFN5c3RlbUludGVy
ZmFjZS5oPgogI2VuZGlmCiAKKyNpZiBQTEFURk9STShJT1MpCisjaW5jbHVkZSA8TWFjRXJyb3Jz
Lmg+CisjZWxzZQorI2luY2x1ZGUgPENvcmVTZXJ2aWNlcy9Db3JlU2VydmljZXMuaD4KKyNlbmRp
ZgorCisjaWYgUExBVEZPUk0oTUFDKQorZXh0ZXJuICJDIiB2b2lkIENGVVJMUmVxdWVzdFNldEhU
VFBSZXF1ZXN0Qm9keShDRk11dGFibGVVUkxSZXF1ZXN0UmVmIG11dGFibGVIVFRQUmVxdWVzdCwg
Q0ZEYXRhUmVmIGh0dHBCb2R5KTsKK2V4dGVybiAiQyIgdm9pZCBDRlVSTFJlcXVlc3RTZXRIVFRQ
SGVhZGVyRmllbGRWYWx1ZShDRk11dGFibGVVUkxSZXF1ZXN0UmVmIG11dGFibGVIVFRQUmVxdWVz
dCwgQ0ZTdHJpbmdSZWYgaHR0cEhlYWRlckZpZWxkLCBDRlN0cmluZ1JlZiBodHRwSGVhZGVyRmll
bGRWYWx1ZSk7CitleHRlcm4gIkMiIHZvaWQgQ0ZVUkxSZXF1ZXN0U2V0SFRUUFJlcXVlc3RCb2R5
U3RyZWFtKCBDRk11dGFibGVVUkxSZXF1ZXN0UmVmIHJlcSwgQ0ZSZWFkU3RyZWFtUmVmIGJvZHlT
dHJlYW0pOworZXh0ZXJuICJDIiBDRlJlYWRTdHJlYW1SZWYgQ0ZVUkxSZXF1ZXN0Q29weUhUVFBS
ZXF1ZXN0Qm9keVN0cmVhbShDRlVSTFJlcXVlc3RSZWYgcmVxdWVzdCk7CisjZW5kaWYKKwogbmFt
ZXNwYWNlIFdlYkNvcmUgewogCi12b2lkIHNldEhUVFBCb2R5KENGTXV0YWJsZVVSTFJlcXVlc3RS
ZWYgcmVxdWVzdCwgUGFzc1JlZlB0cjxGb3JtRGF0YT4gZm9ybURhdGEpCitzdGF0aWMgTXV0ZXgm
IHN0cmVhbUZpZWxkc01hcE11dGV4KCkKIHsKLSAgICBpZiAoIWZvcm1EYXRhKSB7Ci0gICAgICAg
IHdrQ0ZVUkxSZXF1ZXN0U2V0SFRUUFJlcXVlc3RCb2R5UGFydHMocmVxdWVzdCwgMCk7Ci0gICAg
ICAgIHJldHVybjsKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKE11dGV4LCBzdGF0aWNNdXRleCwg
KCkpOworICAgIHJldHVybiBzdGF0aWNNdXRleDsKK30KKworc3RhdGljIHZvaWQgZm9ybUV2ZW50
Q2FsbGJhY2soQ0ZSZWFkU3RyZWFtUmVmIHN0cmVhbSwgQ0ZTdHJlYW1FdmVudFR5cGUgdHlwZSwg
dm9pZCogY29udGV4dCk7CisKK3N0cnVjdCBGb3JtQ29udGV4dCB7CisgICAgUmVmUHRyPEZvcm1E
YXRhPiBmb3JtRGF0YTsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgc3RyZWFtTGVuZ3RoOworfTsK
Kworc3RydWN0IEZvcm1TdHJlYW1GaWVsZHMgeworICAgIFJlZlB0cjxGb3JtRGF0YT4gZm9ybURh
dGE7CisgICAgU2NoZWR1bGVQYWlySGFzaFNldCBzY2hlZHVsZWRSdW5Mb29wUGFpcnM7CisgICAg
VmVjdG9yPEZvcm1EYXRhRWxlbWVudD4gcmVtYWluaW5nRWxlbWVudHM7IC8vIGluIHJldmVyc2Ug
b3JkZXIKKyAgICBDRlJlYWRTdHJlYW1SZWYgY3VycmVudFN0cmVhbTsKKyNpZiBFTkFCTEUoQkxP
QikKKyAgICBsb25nIGxvbmcgY3VycmVudFN0cmVhbVJhbmdlTGVuZ3RoOworI2VuZGlmCisgICAg
Y2hhciogY3VycmVudERhdGE7CisgICAgQ0ZSZWFkU3RyZWFtUmVmIGZvcm1TdHJlYW07CisgICAg
dW5zaWduZWQgbG9uZyBsb25nIHN0cmVhbUxlbmd0aDsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcg
Ynl0ZXNTZW50OworfTsKKwordHlwZWRlZiBIYXNoTWFwPENGUmVhZFN0cmVhbVJlZiwgRm9ybVN0
cmVhbUZpZWxkcyo+IFN0cmVhbUZpZWxkc01hcDsKK3N0YXRpYyBTdHJlYW1GaWVsZHNNYXAmIHN0
cmVhbUZpZWxkc01hcCgpCit7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChTdHJlYW1GaWVsZHNN
YXAsIHN0cmVhbUZpZWxkc01hcCwgKCkpOworICAgIHJldHVybiBzdHJlYW1GaWVsZHNNYXA7Cit9
CisKK3N0YXRpYyB2b2lkIGNsb3NlQ3VycmVudFN0cmVhbShGb3JtU3RyZWFtRmllbGRzICpmb3Jt
KQoreworICAgIGlmIChmb3JtLT5jdXJyZW50U3RyZWFtKSB7CisgICAgICAgIENGUmVhZFN0cmVh
bUNsb3NlKGZvcm0tPmN1cnJlbnRTdHJlYW0pOworICAgICAgICBDRlJlYWRTdHJlYW1TZXRDbGll
bnQoZm9ybS0+Y3VycmVudFN0cmVhbSwga0NGU3RyZWFtRXZlbnROb25lLCBOVUxMLCBOVUxMKTsK
KyAgICAgICAgQ0ZSZWxlYXNlKGZvcm0tPmN1cnJlbnRTdHJlYW0pOworICAgICAgICBmb3JtLT5j
dXJyZW50U3RyZWFtID0gTlVMTDsKKyNpZiBFTkFCTEUoQkxPQikKKyAgICAgICAgZm9ybS0+Y3Vy
cmVudFN0cmVhbVJhbmdlTGVuZ3RoID0gQmxvYkRhdGFJdGVtOjp0b0VuZE9mRmlsZTsKKyNlbmRp
ZgorICAgIH0KKyAgICBpZiAoZm9ybS0+Y3VycmVudERhdGEpIHsKKyAgICAgICAgZmFzdEZyZWUo
Zm9ybS0+Y3VycmVudERhdGEpOworICAgICAgICBmb3JtLT5jdXJyZW50RGF0YSA9IDA7CiAgICAg
fQorfQogCi0gICAgc2l6ZV90IGNvdW50ID0gZm9ybURhdGEtPmVsZW1lbnRzKCkuc2l6ZSgpOwor
Ly8gUmV0dXJuIGZhbHNlIGlmIHdlIGNhbm5vdCBhZHZhbmNlIHRoZSBzdHJlYW0uIEN1cnJlbnRs
eSB0aGUgb25seSBwb3NzaWJsZSBmYWlsdXJlIGlzIHRoYXQgdGhlIHVuZGVybHlpbmcgZmlsZSBo
YXMgYmVlbiByZW1vdmVkIG9yIGNoYW5nZWQgc2luY2UgRmlsZS5zbGljZS4KK3N0YXRpYyBib29s
IGFkdmFuY2VDdXJyZW50U3RyZWFtKEZvcm1TdHJlYW1GaWVsZHMqIGZvcm0pCit7CisgICAgY2xv
c2VDdXJyZW50U3RyZWFtKGZvcm0pOworCisgICAgaWYgKGZvcm0tPnJlbWFpbmluZ0VsZW1lbnRz
LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBDcmVhdGUgdGhlIG5l
dyBzdHJlYW0uCisgICAgRm9ybURhdGFFbGVtZW50JiBuZXh0SW5wdXQgPSBmb3JtLT5yZW1haW5p
bmdFbGVtZW50cy5sYXN0KCk7CisKKyAgICBpZiAobmV4dElucHV0Lm1fdHlwZSA9PSBGb3JtRGF0
YUVsZW1lbnQ6OmRhdGEpIHsKKyAgICAgICAgc2l6ZV90IHNpemUgPSBuZXh0SW5wdXQubV9kYXRh
LnNpemUoKTsKKyAgICAgICAgY2hhciogZGF0YSA9IG5leHRJbnB1dC5tX2RhdGEucmVsZWFzZUJ1
ZmZlcigpOworICAgICAgICBmb3JtLT5jdXJyZW50U3RyZWFtID0gQ0ZSZWFkU3RyZWFtQ3JlYXRl
V2l0aEJ5dGVzTm9Db3B5KDAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVUludDgqPihkYXRhKSwg
c2l6ZSwga0NGQWxsb2NhdG9yTnVsbCk7CisgICAgICAgIGZvcm0tPmN1cnJlbnREYXRhID0gZGF0
YTsKKyAgICB9IGVsc2UgeworI2lmIEVOQUJMRShCTE9CKQorICAgICAgICAvLyBDaGVjayBpZiB0
aGUgZmlsZSBoYXMgYmVlbiBjaGFuZ2VkIG9yIG5vdCBpZiByZXF1aXJlZC4KKyAgICAgICAgaWYg
KG5leHRJbnB1dC5tX2V4cGVjdGVkRmlsZU1vZGlmaWNhdGlvblRpbWUgIT0gQmxvYkRhdGFJdGVt
Ojpkb05vdENoZWNrRmlsZUNoYW5nZSkgeworICAgICAgICAgICAgdGltZV90IGZpbGVNb2RpZmlj
YXRpb25UaW1lOworICAgICAgICAgICAgaWYgKCFnZXRGaWxlTW9kaWZpY2F0aW9uVGltZShuZXh0
SW5wdXQubV9maWxlbmFtZSwgZmlsZU1vZGlmaWNhdGlvblRpbWUpIHx8IGZpbGVNb2RpZmljYXRp
b25UaW1lICE9IHN0YXRpY19jYXN0PHRpbWVfdD4obmV4dElucHV0Lm1fZXhwZWN0ZWRGaWxlTW9k
aWZpY2F0aW9uVGltZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9
CisjZW5kaWYKKyAgICAgICAgY29uc3QgU3RyaW5nJiBwYXRoID0gbmV4dElucHV0Lm1fc2hvdWxk
R2VuZXJhdGVGaWxlID8gbmV4dElucHV0Lm1fZ2VuZXJhdGVkRmlsZW5hbWUgOiBuZXh0SW5wdXQu
bV9maWxlbmFtZTsKKyAgICAgICAgZm9ybS0+Y3VycmVudFN0cmVhbSA9IENGUmVhZFN0cmVhbUNy
ZWF0ZVdpdGhGaWxlKDAsIHBhdGhBc1VSTChwYXRoKS5nZXQoKSk7CisgICAgICAgIGlmICghZm9y
bS0+Y3VycmVudFN0cmVhbSkgeworICAgICAgICAgICAgLy8gVGhlIGZpbGUgbXVzdCBoYXZlIGJl
ZW4gcmVtb3ZlZCBvciBiZWNvbWUgdW5yZWFkYWJsZS4KKyAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAgICAgfQorI2lmIEVOQUJMRShCTE9CKQorICAgICAgICBpZiAobmV4dElucHV0Lm1f
ZmlsZVN0YXJ0ID4gMCkgeworICAgICAgICAgICAgUmV0YWluUHRyPENGTnVtYmVyUmVmPiBwb3Np
dGlvbihBZG9wdENGLCBDRk51bWJlckNyZWF0ZSgwLCBrQ0ZOdW1iZXJMb25nTG9uZ1R5cGUsICZu
ZXh0SW5wdXQubV9maWxlU3RhcnQpKTsKKyAgICAgICAgICAgIENGUmVhZFN0cmVhbVNldFByb3Bl
cnR5KGZvcm0tPmN1cnJlbnRTdHJlYW0sIGtDRlN0cmVhbVByb3BlcnR5RmlsZUN1cnJlbnRPZmZz
ZXQsIHBvc2l0aW9uLmdldCgpKTsKKyAgICAgICAgfQorICAgICAgICBmb3JtLT5jdXJyZW50U3Ry
ZWFtUmFuZ2VMZW5ndGggPSBuZXh0SW5wdXQubV9maWxlTGVuZ3RoOworI2VuZGlmCisgICAgfQor
ICAgIGZvcm0tPnJlbWFpbmluZ0VsZW1lbnRzLnJlbW92ZUxhc3QoKTsKKworICAgIC8vIFNldCB1
cCB0aGUgY2FsbGJhY2suCisgICAgQ0ZTdHJlYW1DbGllbnRDb250ZXh0IGNvbnRleHQgPSB7IDAs
IGZvcm0sIE5VTEwsIE5VTEwsIE5VTEwgfTsKKyAgICBDRlJlYWRTdHJlYW1TZXRDbGllbnQoZm9y
bS0+Y3VycmVudFN0cmVhbSwga0NGU3RyZWFtRXZlbnRIYXNCeXRlc0F2YWlsYWJsZSB8IGtDRlN0
cmVhbUV2ZW50RXJyb3JPY2N1cnJlZCB8IGtDRlN0cmVhbUV2ZW50RW5kRW5jb3VudGVyZWQsCisg
ICAgICAgIGZvcm1FdmVudENhbGxiYWNrLCAmY29udGV4dCk7CisKKyAgICAvLyBTY2hlZHVsZSB3
aXRoIHRoZSBjdXJyZW50IHNldCBvZiBydW4gbG9vcHMuCisgICAgU2NoZWR1bGVQYWlySGFzaFNl
dDo6aXRlcmF0b3IgZW5kID0gZm9ybS0+c2NoZWR1bGVkUnVuTG9vcFBhaXJzLmVuZCgpOworICAg
IGZvciAoU2NoZWR1bGVQYWlySGFzaFNldDo6aXRlcmF0b3IgaXQgPSBmb3JtLT5zY2hlZHVsZWRS
dW5Mb29wUGFpcnMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KQorICAgICAgICBDRlJlYWRTdHJl
YW1TY2hlZHVsZVdpdGhSdW5Mb29wKGZvcm0tPmN1cnJlbnRTdHJlYW0sICgqaXQpLT5ydW5Mb29w
KCksICgqaXQpLT5tb2RlKCkpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29s
IG9wZW5OZXh0U3RyZWFtKEZvcm1TdHJlYW1GaWVsZHMqIGZvcm0pCit7CisgICAgLy8gU2tpcCBv
dmVyIGFueSBzdHJlYW1zIHdlIGNhbid0IG9wZW4uCisgICAgaWYgKCFhZHZhbmNlQ3VycmVudFN0
cmVhbShmb3JtKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHdoaWxlIChmb3JtLT5jdXJy
ZW50U3RyZWFtICYmICFDRlJlYWRTdHJlYW1PcGVuKGZvcm0tPmN1cnJlbnRTdHJlYW0pKSB7Cisg
ICAgICAgIGlmICghYWR2YW5jZUN1cnJlbnRTdHJlYW0oZm9ybSkpCisgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCogZm9y
bUNyZWF0ZShDRlJlYWRTdHJlYW1SZWYgc3RyZWFtLCB2b2lkKiBjb250ZXh0KQoreworICAgIEZv
cm1Db250ZXh0KiBmb3JtQ29udGV4dCA9IHN0YXRpY19jYXN0PEZvcm1Db250ZXh0Kj4oY29udGV4
dCk7CisKKyAgICBGb3JtU3RyZWFtRmllbGRzKiBuZXdJbmZvID0gbmV3IEZvcm1TdHJlYW1GaWVs
ZHM7CisgICAgbmV3SW5mby0+Zm9ybURhdGEgPSBmb3JtQ29udGV4dC0+Zm9ybURhdGEucmVsZWFz
ZSgpOworICAgIG5ld0luZm8tPmN1cnJlbnRTdHJlYW0gPSBOVUxMOworI2lmIEVOQUJMRShCTE9C
KQorICAgIG5ld0luZm8tPmN1cnJlbnRTdHJlYW1SYW5nZUxlbmd0aCA9IEJsb2JEYXRhSXRlbTo6
dG9FbmRPZkZpbGU7CisjZW5kaWYKKyAgICBuZXdJbmZvLT5jdXJyZW50RGF0YSA9IDA7CisgICAg
bmV3SW5mby0+Zm9ybVN0cmVhbSA9IHN0cmVhbTsgLy8gRG9uJ3QgcmV0YWluLiBUaGF0IHdvdWxk
IGNyZWF0ZSBhIHJlZmVyZW5jZSBjeWNsZS4KKyAgICBuZXdJbmZvLT5zdHJlYW1MZW5ndGggPSBm
b3JtQ29udGV4dC0+c3RyZWFtTGVuZ3RoOworICAgIG5ld0luZm8tPmJ5dGVzU2VudCA9IDA7CisK
KyAgICAvLyBBcHBlbmQgaW4gcmV2ZXJzZSBvcmRlciBzaW5jZSB3ZSByZW1vdmUgZWxlbWVudHMg
ZnJvbSB0aGUgZW5kLgorICAgIHNpemVfdCBzaXplID0gbmV3SW5mby0+Zm9ybURhdGEtPmVsZW1l
bnRzKCkuc2l6ZSgpOworICAgIG5ld0luZm8tPnJlbWFpbmluZ0VsZW1lbnRzLnJlc2VydmVJbml0
aWFsQ2FwYWNpdHkoc2l6ZSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kp
CisgICAgICAgIG5ld0luZm8tPnJlbWFpbmluZ0VsZW1lbnRzLmFwcGVuZChuZXdJbmZvLT5mb3Jt
RGF0YS0+ZWxlbWVudHMoKVtzaXplIC0gaSAtIDFdKTsKKworICAgIE11dGV4TG9ja2VyIGxvY2tl
cihzdHJlYW1GaWVsZHNNYXBNdXRleCgpKTsKKyAgICBBU1NFUlQoIXN0cmVhbUZpZWxkc01hcCgp
LmNvbnRhaW5zKHN0cmVhbSkpOworICAgIHN0cmVhbUZpZWxkc01hcCgpLmFkZChzdHJlYW0sIG5l
d0luZm8pOworCisgICAgcmV0dXJuIG5ld0luZm87Cit9CisKK3N0YXRpYyB2b2lkIGZvcm1GaW5p
c2hGaW5hbGl6YXRpb25Pbk1haW5UaHJlYWQodm9pZCogY29udGV4dCkKK3sKKyAgICBPd25QdHI8
Rm9ybVN0cmVhbUZpZWxkcz4gZm9ybSA9IGFkb3B0UHRyKHN0YXRpY19jYXN0PEZvcm1TdHJlYW1G
aWVsZHMqPihjb250ZXh0KSk7CisKKyAgICBjbG9zZUN1cnJlbnRTdHJlYW0oZm9ybS5nZXQoKSk7
Cit9CisKK3N0YXRpYyB2b2lkIGZvcm1GaW5hbGl6ZShDRlJlYWRTdHJlYW1SZWYgc3RyZWFtLCB2
b2lkKiBjb250ZXh0KQoreworICAgIEZvcm1TdHJlYW1GaWVsZHMqIGZvcm0gPSBzdGF0aWNfY2Fz
dDxGb3JtU3RyZWFtRmllbGRzKj4oY29udGV4dCk7CisKKyAgICBNdXRleExvY2tlciBsb2NrZXIo
c3RyZWFtRmllbGRzTWFwTXV0ZXgoKSk7CisKKyAgICBBU1NFUlQoZm9ybS0+Zm9ybVN0cmVhbSA9
PSBzdHJlYW0pOworICAgIEFTU0VSVChzdHJlYW1GaWVsZHNNYXAoKS5nZXQoc3RyZWFtKSA9PSBj
b250ZXh0KTsKKworICAgIC8vIERvIHRoaXMgcmlnaHQgYXdheSBiZWNhdXNlIHRoZSBDRlJlYWRT
dHJlYW1SZWYgaXMgYmVpbmcgZGVhbGxvY2F0ZWQuCisgICAgLy8gV2UgY2FuJ3Qgd2FpdCB0byBy
ZW1vdmUgdGhpcyBmcm9tIHRoZSBtYXAgdW50aWwgd2UgZmluaXNoIGZpbmFsaXppbmcKKyAgICAv
LyBvbiB0aGUgbWFpbiB0aHJlYWQgYmVjYXVzZSBpbiB0aGVvcnkgdGhlIGZyZWVkIG1lbW9yeSBj
b3VsZCBiZSByZXVzZWQKKyAgICAvLyBmb3IgYSBuZXcgQ0ZSZWFkU3RyZWFtIGJlZm9yZSB0aGF0
IHJ1bnMuCisgICAgc3RyZWFtRmllbGRzTWFwKCkucmVtb3ZlKHN0cmVhbSk7CisKKyAgICBjYWxs
T25NYWluVGhyZWFkKGZvcm1GaW5pc2hGaW5hbGl6YXRpb25Pbk1haW5UaHJlYWQsIGZvcm0pOwor
fQorCitzdGF0aWMgQm9vbGVhbiBmb3JtT3BlbihDRlJlYWRTdHJlYW1SZWYsIENGU3RyZWFtRXJy
b3IqIGVycm9yLCBCb29sZWFuKiBvcGVuQ29tcGxldGUsIHZvaWQqIGNvbnRleHQpCit7CisgICAg
Rm9ybVN0cmVhbUZpZWxkcyogZm9ybSA9IHN0YXRpY19jYXN0PEZvcm1TdHJlYW1GaWVsZHMqPihj
b250ZXh0KTsKKworICAgIGJvb2wgb3BlbmVkID0gb3Blbk5leHRTdHJlYW0oZm9ybSk7CisKKyAg
ICAqb3BlbkNvbXBsZXRlID0gb3BlbmVkOworICAgIGVycm9yLT5lcnJvciA9IG9wZW5lZCA/IDAg
OiBmbmZFcnI7CisgICAgcmV0dXJuIG9wZW5lZDsKK30KIAotICAgIGlmIChjb3VudCA9PSAwKQor
c3RhdGljIENGSW5kZXggZm9ybVJlYWQoQ0ZSZWFkU3RyZWFtUmVmLCBVSW50OCogYnVmZmVyLCBD
RkluZGV4IGJ1ZmZlckxlbmd0aCwgQ0ZTdHJlYW1FcnJvciogZXJyb3IsIEJvb2xlYW4qIGF0RU9G
LCB2b2lkKiBjb250ZXh0KQoreworICAgIEZvcm1TdHJlYW1GaWVsZHMqIGZvcm0gPSBzdGF0aWNf
Y2FzdDxGb3JtU3RyZWFtRmllbGRzKj4oY29udGV4dCk7CisKKyAgICB3aGlsZSAoZm9ybS0+Y3Vy
cmVudFN0cmVhbSkgeworICAgICAgICBDRkluZGV4IGJ5dGVzVG9SZWFkID0gYnVmZmVyTGVuZ3Ro
OworI2lmIEVOQUJMRShCTE9CKQorICAgICAgICBpZiAoZm9ybS0+Y3VycmVudFN0cmVhbVJhbmdl
TGVuZ3RoICE9IEJsb2JEYXRhSXRlbTo6dG9FbmRPZkZpbGUgJiYgZm9ybS0+Y3VycmVudFN0cmVh
bVJhbmdlTGVuZ3RoIDwgYnl0ZXNUb1JlYWQpCisgICAgICAgICAgICBieXRlc1RvUmVhZCA9IHN0
YXRpY19jYXN0PENGSW5kZXg+KGZvcm0tPmN1cnJlbnRTdHJlYW1SYW5nZUxlbmd0aCk7CisjZW5k
aWYKKyAgICAgICAgQ0ZJbmRleCBieXRlc1JlYWQgPSBDRlJlYWRTdHJlYW1SZWFkKGZvcm0tPmN1
cnJlbnRTdHJlYW0sIGJ1ZmZlciwgYnl0ZXNUb1JlYWQpOworICAgICAgICBpZiAoYnl0ZXNSZWFk
IDwgMCkgeworICAgICAgICAgICAgKmVycm9yID0gQ0ZSZWFkU3RyZWFtR2V0RXJyb3IoZm9ybS0+
Y3VycmVudFN0cmVhbSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAg
ICAgaWYgKGJ5dGVzUmVhZCA+IDApIHsKKyAgICAgICAgICAgIGVycm9yLT5lcnJvciA9IDA7Cisg
ICAgICAgICAgICAqYXRFT0YgPSBGQUxTRTsKKyAgICAgICAgICAgIGZvcm0tPmJ5dGVzU2VudCAr
PSBieXRlc1JlYWQ7CisjaWYgRU5BQkxFKEJMT0IpCisgICAgICAgICAgICBpZiAoZm9ybS0+Y3Vy
cmVudFN0cmVhbVJhbmdlTGVuZ3RoICE9IEJsb2JEYXRhSXRlbTo6dG9FbmRPZkZpbGUpCisgICAg
ICAgICAgICAgICAgZm9ybS0+Y3VycmVudFN0cmVhbVJhbmdlTGVuZ3RoIC09IGJ5dGVzUmVhZDsK
KyNlbmRpZgorCisgICAgICAgICAgICByZXR1cm4gYnl0ZXNSZWFkOworICAgICAgICB9CisgICAg
ICAgIG9wZW5OZXh0U3RyZWFtKGZvcm0pOworICAgIH0KKworICAgIGVycm9yLT5lcnJvciA9IDA7
CisgICAgKmF0RU9GID0gVFJVRTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIEJvb2xlYW4g
Zm9ybUNhblJlYWQoQ0ZSZWFkU3RyZWFtUmVmIHN0cmVhbSwgdm9pZCogY29udGV4dCkKK3sKKyAg
ICBGb3JtU3RyZWFtRmllbGRzKiBmb3JtID0gc3RhdGljX2Nhc3Q8Rm9ybVN0cmVhbUZpZWxkcyo+
KGNvbnRleHQpOworCisgICAgd2hpbGUgKGZvcm0tPmN1cnJlbnRTdHJlYW0gJiYgQ0ZSZWFkU3Ry
ZWFtR2V0U3RhdHVzKGZvcm0tPmN1cnJlbnRTdHJlYW0pID09IGtDRlN0cmVhbVN0YXR1c0F0RW5k
KSB7CisgICAgICAgIG9wZW5OZXh0U3RyZWFtKGZvcm0pOworICAgIH0KKyAgICBpZiAoIWZvcm0t
PmN1cnJlbnRTdHJlYW0pIHsKKyAgICAgICAgd2tTaWduYWxDRlJlYWRTdHJlYW1FbmQoc3RyZWFt
KTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICByZXR1cm4gQ0ZSZWFkU3RyZWFt
SGFzQnl0ZXNBdmFpbGFibGUoZm9ybS0+Y3VycmVudFN0cmVhbSk7Cit9CisKK3N0YXRpYyB2b2lk
IGZvcm1DbG9zZShDRlJlYWRTdHJlYW1SZWYsIHZvaWQqIGNvbnRleHQpCit7CisgICAgRm9ybVN0
cmVhbUZpZWxkcyogZm9ybSA9IHN0YXRpY19jYXN0PEZvcm1TdHJlYW1GaWVsZHMqPihjb250ZXh0
KTsKKworICAgIGNsb3NlQ3VycmVudFN0cmVhbShmb3JtKTsKK30KKworc3RhdGljIHZvaWQgZm9y
bVNjaGVkdWxlKENGUmVhZFN0cmVhbVJlZiwgQ0ZSdW5Mb29wUmVmIHJ1bkxvb3AsIENGU3RyaW5n
UmVmIHJ1bkxvb3BNb2RlLCB2b2lkKiBjb250ZXh0KQoreworICAgIEZvcm1TdHJlYW1GaWVsZHMq
IGZvcm0gPSBzdGF0aWNfY2FzdDxGb3JtU3RyZWFtRmllbGRzKj4oY29udGV4dCk7CisKKyAgICBp
ZiAoZm9ybS0+Y3VycmVudFN0cmVhbSkKKyAgICAgICAgQ0ZSZWFkU3RyZWFtU2NoZWR1bGVXaXRo
UnVuTG9vcChmb3JtLT5jdXJyZW50U3RyZWFtLCBydW5Mb29wLCBydW5Mb29wTW9kZSk7CisgICAg
Zm9ybS0+c2NoZWR1bGVkUnVuTG9vcFBhaXJzLmFkZChTY2hlZHVsZVBhaXI6OmNyZWF0ZShydW5M
b29wLCBydW5Mb29wTW9kZSkpOworfQorCitzdGF0aWMgdm9pZCBmb3JtVW5zY2hlZHVsZShDRlJl
YWRTdHJlYW1SZWYsIENGUnVuTG9vcFJlZiBydW5Mb29wLCBDRlN0cmluZ1JlZiBydW5Mb29wTW9k
ZSwgdm9pZCogY29udGV4dCkKK3sKKyAgICBGb3JtU3RyZWFtRmllbGRzKiBmb3JtID0gc3RhdGlj
X2Nhc3Q8Rm9ybVN0cmVhbUZpZWxkcyo+KGNvbnRleHQpOworCisgICAgaWYgKGZvcm0tPmN1cnJl
bnRTdHJlYW0pCisgICAgICAgIENGUmVhZFN0cmVhbVVuc2NoZWR1bGVGcm9tUnVuTG9vcChmb3Jt
LT5jdXJyZW50U3RyZWFtLCBydW5Mb29wLCBydW5Mb29wTW9kZSk7CisgICAgZm9ybS0+c2NoZWR1
bGVkUnVuTG9vcFBhaXJzLnJlbW92ZShTY2hlZHVsZVBhaXI6OmNyZWF0ZShydW5Mb29wLCBydW5M
b29wTW9kZSkpOworfQorCitzdGF0aWMgdm9pZCBmb3JtRXZlbnRDYWxsYmFjayhDRlJlYWRTdHJl
YW1SZWYgc3RyZWFtLCBDRlN0cmVhbUV2ZW50VHlwZSB0eXBlLCB2b2lkKiBjb250ZXh0KQorewor
ICAgIEZvcm1TdHJlYW1GaWVsZHMqIGZvcm0gPSBzdGF0aWNfY2FzdDxGb3JtU3RyZWFtRmllbGRz
Kj4oY29udGV4dCk7CisKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIGtDRlN0cmVhbUV2
ZW50SGFzQnl0ZXNBdmFpbGFibGU6CisgICAgICAgIHdrU2lnbmFsQ0ZSZWFkU3RyZWFtSGFzQnl0
ZXMoZm9ybS0+Zm9ybVN0cmVhbSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga0NGU3RyZWFt
RXZlbnRFcnJvck9jY3VycmVkOiB7CisgICAgICAgIENGU3RyZWFtRXJyb3IgcmVhZFN0cmVhbUVy
cm9yID0gQ0ZSZWFkU3RyZWFtR2V0RXJyb3Ioc3RyZWFtKTsKKyAgICAgICAgd2tTaWduYWxDRlJl
YWRTdHJlYW1FcnJvcihmb3JtLT5mb3JtU3RyZWFtLCAmcmVhZFN0cmVhbUVycm9yKTsKKyAgICAg
ICAgYnJlYWs7CisgICAgfQorICAgIGNhc2Uga0NGU3RyZWFtRXZlbnRFbmRFbmNvdW50ZXJlZDoK
KyAgICAgICAgb3Blbk5leHRTdHJlYW0oZm9ybSk7CisgICAgICAgIGlmICghZm9ybS0+Y3VycmVu
dFN0cmVhbSkgeworICAgICAgICAgICAgd2tTaWduYWxDRlJlYWRTdHJlYW1FbmQoZm9ybS0+Zm9y
bVN0cmVhbSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBrQ0ZTdHJlYW1F
dmVudE5vbmU6CisgICAgICAgIExPR19FUlJPUigidW5leHBlY3RlZCBrQ0ZTdHJlYW1FdmVudE5v
bmUiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBrQ0ZTdHJlYW1FdmVudE9wZW5Db21wbGV0
ZWQ6CisgICAgICAgIExPR19FUlJPUigidW5leHBlY3RlZCBrQ0ZTdHJlYW1FdmVudE9wZW5Db21w
bGV0ZWQiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBrQ0ZTdHJlYW1FdmVudENhbkFjY2Vw
dEJ5dGVzOgorICAgICAgICBMT0dfRVJST1IoInVuZXhwZWN0ZWQga0NGU3RyZWFtRXZlbnRDYW5B
Y2NlcHRCeXRlcyIpOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgc2V0SFRUUEJv
ZHkoQ0ZNdXRhYmxlVVJMUmVxdWVzdFJlZiByZXF1ZXN0LCBQYXNzUmVmUHRyPEZvcm1EYXRhPiBw
cnBGb3JtRGF0YSkKK3sKKyAgICBSZWZQdHI8Rm9ybURhdGE+IGZvcm1EYXRhID0gcHJwRm9ybURh
dGE7CisKKyAgICBpZiAoIWZvcm1EYXRhKQogICAgICAgICByZXR1cm47CisgICAgICAgIAorICAg
IHNpemVfdCBjb3VudCA9IGZvcm1EYXRhLT5lbGVtZW50cygpLnNpemUoKTsKIAogICAgIC8vIEhh
bmRsZSB0aGUgY29tbW9uIHNwZWNpYWwgY2FzZSBvZiBvbmUgcGllY2Ugb2YgZm9ybSBkYXRhLCB3
aXRoIG5vIGZpbGVzLgotICAgIGlmIChjb3VudCA9PSAxKSB7CisgICAgaWYgKGNvdW50ID09IDEg
JiYgIWZvcm1EYXRhLT5hbHdheXNTdHJlYW0oKSkgewogICAgICAgICBjb25zdCBGb3JtRGF0YUVs
ZW1lbnQmIGVsZW1lbnQgPSBmb3JtRGF0YS0+ZWxlbWVudHMoKVswXTsKICAgICAgICAgaWYgKGVs
ZW1lbnQubV90eXBlID09IEZvcm1EYXRhRWxlbWVudDo6ZGF0YSkgewotICAgICAgICAgICAgQ0ZE
YXRhUmVmIGRhdGEgPSBDRkRhdGFDcmVhdGUoMCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBVSW50
OCAqPihlbGVtZW50Lm1fZGF0YS5kYXRhKCkpLCBlbGVtZW50Lm1fZGF0YS5zaXplKCkpOwotICAg
ICAgICAgICAgQ0ZVUkxSZXF1ZXN0U2V0SFRUUFJlcXVlc3RCb2R5KHJlcXVlc3QsIGRhdGEpOwot
ICAgICAgICAgICAgQ0ZSZWxlYXNlKGRhdGEpOworICAgICAgICAgICAgUmV0YWluUHRyPENGRGF0
YVJlZj4gZGF0YSA9IGFkb3B0Q0YoQ0ZEYXRhQ3JlYXRlKDAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29u
c3QgVUludDggKj4oZWxlbWVudC5tX2RhdGEuZGF0YSgpKSwgZWxlbWVudC5tX2RhdGEuc2l6ZSgp
KSk7CisgICAgICAgICAgICBDRlVSTFJlcXVlc3RTZXRIVFRQUmVxdWVzdEJvZHkocmVxdWVzdCwg
ZGF0YS5nZXQoKSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICB9CiAKLSAg
ICBSZXRhaW5QdHI8Q0ZNdXRhYmxlQXJyYXlSZWY+IGFycmF5KEFkb3B0Q0YsIENGQXJyYXlDcmVh
dGVNdXRhYmxlKDAsIDAsICZrQ0ZUeXBlQXJyYXlDYWxsQmFja3MpKTsKKyNpZiBFTkFCTEUoQkxP
QikKKyAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhIGJsb2IgaW4gdGhlIGZvcm0gZGF0YS4KKyAg
ICBib29sIGhhc0Jsb2IgPSBmYWxzZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50
OyArK2kpIHsKKyAgICAgICAgY29uc3QgRm9ybURhdGFFbGVtZW50JiBlbGVtZW50ID0gZm9ybURh
dGEtPmVsZW1lbnRzKClbaV07CisgICAgICAgIGlmIChlbGVtZW50Lm1fdHlwZSA9PSBGb3JtRGF0
YUVsZW1lbnQ6OmVuY29kZWRCbG9iKSB7CisgICAgICAgICAgICBoYXNCbG9iID0gdHJ1ZTsKKyAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQogCisgICAgLy8gSWYgeWVzLCB3ZSBo
YXZlIHRvIHJlc29sdmUgYWxsIHRoZSBibG9iIHJlZmVyZW5jZXMgYW5kIHJlZ2VuZXJhdGUgdGhl
IGZvcm0gZGF0YSB3aXRoIG9ubHkgZGF0YSBhbmQgZmlsZSB0eXBlcy4KKyAgICBpZiAoaGFzQmxv
YikgeworICAgICAgICBSZWZQdHI8Rm9ybURhdGE+IG5ld0Zvcm1EYXRhID0gRm9ybURhdGE6OmNy
ZWF0ZSgpOworICAgICAgICBuZXdGb3JtRGF0YS0+c2V0QWx3YXlzU3RyZWFtKGZvcm1EYXRhLT5h
bHdheXNTdHJlYW0oKSk7CisgICAgICAgIG5ld0Zvcm1EYXRhLT5zZXRJZGVudGlmaWVyKGZvcm1E
YXRhLT5pZGVudGlmaWVyKCkpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50
OyArK2kpIHsKKyAgICAgICAgICAgIGNvbnN0IEZvcm1EYXRhRWxlbWVudCYgZWxlbWVudCA9IGZv
cm1EYXRhLT5lbGVtZW50cygpW2ldOworICAgICAgICAgICAgaWYgKGVsZW1lbnQubV90eXBlID09
IEZvcm1EYXRhRWxlbWVudDo6ZGF0YSkKKyAgICAgICAgICAgICAgICBuZXdGb3JtRGF0YS0+YXBw
ZW5kRGF0YShlbGVtZW50Lm1fZGF0YS5kYXRhKCksIGVsZW1lbnQubV9kYXRhLnNpemUoKSk7Cisg
ICAgICAgICAgICBlbHNlIGlmIChlbGVtZW50Lm1fdHlwZSA9PSBGb3JtRGF0YUVsZW1lbnQ6OmVu
Y29kZWRGaWxlKQorICAgICAgICAgICAgICAgIG5ld0Zvcm1EYXRhLT5hcHBlbmRGaWxlKGVsZW1l
bnQubV9maWxlbmFtZSwgZWxlbWVudC5tX3Nob3VsZEdlbmVyYXRlRmlsZSk7CisgICAgICAgICAg
ICBlbHNlIHsKKyAgICAgICAgICAgICAgICBBU1NFUlQoZWxlbWVudC5tX3R5cGUgPT0gRm9ybURh
dGFFbGVtZW50OjplbmNvZGVkQmxvYik7CisgICAgICAgICAgICAgICAgUmVmUHRyPEJsb2JTdG9y
YWdlRGF0YT4gYmxvYkRhdGEgPSBzdGF0aWNfY2FzdDxCbG9iUmVnaXN0cnlJbXBsJj4oYmxvYlJl
Z2lzdHJ5KCkpLmdldEJsb2JEYXRhRnJvbVVSTChLVVJMKFBhcnNlZFVSTFN0cmluZywgZWxlbWVu
dC5tX2Jsb2JVUkwpKTsKKyAgICAgICAgICAgICAgICBpZiAoYmxvYkRhdGEpIHsKKyAgICAgICAg
ICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBibG9iRGF0YS0+aXRlbXMoKS5zaXpl
KCk7ICsraikgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmxvYkRhdGFJdGVtJiBi
bG9iSXRlbSA9IGJsb2JEYXRhLT5pdGVtcygpW2pdOworICAgICAgICAgICAgICAgICAgICAgICAg
aWYgKGJsb2JJdGVtLnR5cGUgPT0gQmxvYkRhdGFJdGVtOjpEYXRhKSB7CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgbmV3Rm9ybURhdGEtPmFwcGVuZERhdGEoYmxvYkl0ZW0uZGF0YS0+ZGF0
YSgpICsgc3RhdGljX2Nhc3Q8aW50PihibG9iSXRlbS5vZmZzZXQpLCBzdGF0aWNfY2FzdDxpbnQ+
KGJsb2JJdGVtLmxlbmd0aCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBBU1NFUlQoYmxvYkl0ZW0udHlwZSA9PSBCbG9iRGF0
YUl0ZW06OkZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Zvcm1EYXRhLT5h
cHBlbmRGaWxlUmFuZ2UoYmxvYkl0ZW0ucGF0aCwgYmxvYkl0ZW0ub2Zmc2V0LCBibG9iSXRlbS5s
ZW5ndGgsIGJsb2JJdGVtLmV4cGVjdGVkTW9kaWZpY2F0aW9uVGltZSk7CisgICAgICAgICAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9ybURhdGEgPSBuZXdGb3JtRGF0YS5y
ZWxlYXNlKCk7CisgICAgICAgIGNvdW50ID0gZm9ybURhdGEtPmVsZW1lbnRzKCkuc2l6ZSgpOwor
ICAgIH0KKyNlbmRpZgorCisgICAgLy8gUHJlY29tcHV0ZSB0aGUgY29udGVudCBsZW5ndGggc28g
TlNVUkxDb25uZWN0aW9uIGRvZXNuJ3QgdXNlIGNodW5rZWQgbW9kZS4KKyAgICBsb25nIGxvbmcg
bGVuZ3RoID0gMDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKICAg
ICAgICAgY29uc3QgRm9ybURhdGFFbGVtZW50JiBlbGVtZW50ID0gZm9ybURhdGEtPmVsZW1lbnRz
KClbaV07Ci0gICAgICAgIGlmIChlbGVtZW50Lm1fdHlwZSA9PSBGb3JtRGF0YUVsZW1lbnQ6OmRh
dGEpIHsKLSAgICAgICAgICAgIFJldGFpblB0cjxDRkRhdGFSZWY+IGRhdGEoQWRvcHRDRiwgQ0ZE
YXRhQ3JlYXRlKDAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVUludDgqPihlbGVtZW50Lm1fZGF0
YS5kYXRhKCkpLCBlbGVtZW50Lm1fZGF0YS5zaXplKCkpKTsKLSAgICAgICAgICAgIENGQXJyYXlB
cHBlbmRWYWx1ZShhcnJheS5nZXQoKSwgZGF0YS5nZXQoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0g
ICAgICAgICAgICBSZXRhaW5QdHI8Q0ZTdHJpbmdSZWY+IGZpbGVuYW1lKEFkb3B0Q0YsIGVsZW1l
bnQubV9maWxlbmFtZS5jcmVhdGVDRlN0cmluZygpKTsKLSAgICAgICAgICAgIENGQXJyYXlBcHBl
bmRWYWx1ZShhcnJheS5nZXQoKSwgZmlsZW5hbWUuZ2V0KCkpOworICAgICAgICBpZiAoZWxlbWVu
dC5tX3R5cGUgPT0gRm9ybURhdGFFbGVtZW50OjpkYXRhKQorICAgICAgICAgICAgbGVuZ3RoICs9
IGVsZW1lbnQubV9kYXRhLnNpemUoKTsKKyAgICAgICAgZWxzZSB7CisjaWYgRU5BQkxFKEJMT0Ip
CisgICAgICAgICAgICAvLyBJZiB3ZSdyZSBzZW5kaW5nIHRoZSBmaWxlIHJhbmdlLCB1c2UgdGhl
IGV4aXN0aW5nIHJhbmdlIGxlbmd0aCBmb3Igbm93LiBXZSB3aWxsIGRldGVjdCBpZiB0aGUgZmls
ZSBoYXMgYmVlbiBjaGFuZ2VkIHJpZ2h0IGJlZm9yZSB3ZSByZWFkIHRoZSBmaWxlIGFuZCBhYm9y
dCB0aGUgb3BlcmF0aW9uIGlmIG5lY2Vzc2FyeS4KKyAgICAgICAgICAgIGlmIChlbGVtZW50Lm1f
ZmlsZUxlbmd0aCAhPSBCbG9iRGF0YUl0ZW06OnRvRW5kT2ZGaWxlKSB7CisgICAgICAgICAgICAg
ICAgbGVuZ3RoICs9IGVsZW1lbnQubV9maWxlTGVuZ3RoOworICAgICAgICAgICAgICAgIGNvbnRp
bnVlOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBsb25nIGxvbmcgZmlsZVNp
emU7CisgICAgICAgICAgICBpZiAoZ2V0RmlsZVNpemUoZWxlbWVudC5tX3Nob3VsZEdlbmVyYXRl
RmlsZSA/IGVsZW1lbnQubV9nZW5lcmF0ZWRGaWxlbmFtZSA6IGVsZW1lbnQubV9maWxlbmFtZSwg
ZmlsZVNpemUpKQorICAgICAgICAgICAgICAgIGxlbmd0aCArPSBmaWxlU2l6ZTsKICAgICAgICAg
fQogICAgIH0KIAotICAgIHdrQ0ZVUkxSZXF1ZXN0U2V0SFRUUFJlcXVlc3RCb2R5UGFydHMocmVx
dWVzdCwgYXJyYXkuZ2V0KCkpOworICAgIC8vIFNldCB0aGUgbGVuZ3RoLgorICAgIFJldGFpblB0
cjxDRlN0cmluZ1JlZj4gbGVuZ3RoU3RyaW5nID0gYWRvcHRDRihDRlN0cmluZ0NyZWF0ZVdpdGhG
b3JtYXQoMCwgMCwgQ0ZTVFIoIiVsbGQiKSwgbGVuZ3RoKSk7CisgICAgQ0ZVUkxSZXF1ZXN0U2V0
SFRUUEhlYWRlckZpZWxkVmFsdWUocmVxdWVzdCwgQ0ZTVFIoIkNvbnRlbnQtTGVuZ3RoIiksIGxl
bmd0aFN0cmluZy5nZXQoKSk7CisKKyAgICAvLyBDcmVhdGUgYW5kIHNldCB0aGUgc3RyZWFtLgor
CisgICAgLy8gUGFzcyB0aGUgbGVuZ3RoIGFsb25nIHdpdGggdGhlIGZvcm1EYXRhIHNvIGl0IGRv
ZXMgbm90IGhhdmUgdG8gYmUgcmVjb21wdXRlZC4KKyAgICBGb3JtQ29udGV4dCBmb3JtQ29udGV4
dCA9IHsgZm9ybURhdGEucmVsZWFzZSgpLCBsZW5ndGggfTsKKworICAgIFJldGFpblB0cjxDRlJl
YWRTdHJlYW1SZWY+IHN0cmVhbShBZG9wdENGLCB3a0NyZWF0ZUN1c3RvbUNGUmVhZFN0cmVhbShm
b3JtQ3JlYXRlLCBmb3JtRmluYWxpemUsCisgICAgICAgIGZvcm1PcGVuLCBmb3JtUmVhZCwgZm9y
bUNhblJlYWQsIGZvcm1DbG9zZSwgZm9ybVNjaGVkdWxlLCBmb3JtVW5zY2hlZHVsZSwKKyAgICAg
ICAgJmZvcm1Db250ZXh0KSk7CisgICAgQ0ZVUkxSZXF1ZXN0U2V0SFRUUFJlcXVlc3RCb2R5U3Ry
ZWFtKHJlcXVlc3QsIHN0cmVhbS5nZXQoKSk7CiB9CiAKLVBhc3NSZWZQdHI8Rm9ybURhdGE+IGh0
dHBCb2R5RnJvbVJlcXVlc3QoQ0ZVUkxSZXF1ZXN0UmVmIHJlcXVlc3QpCitGb3JtRGF0YSogaHR0
cEJvZHlGcm9tU3RyZWFtKENGUmVhZFN0cmVhbVJlZiBzdHJlYW0pCiB7Ci0gICAgUmV0YWluUHRy
PENGRGF0YVJlZj4gYm9keURhdGEoQWRvcHRDRiwgQ0ZVUkxSZXF1ZXN0Q29weUhUVFBSZXF1ZXN0
Qm9keShyZXF1ZXN0KSk7Ci0gICAgaWYgKGJvZHlEYXRhKQotICAgICAgICByZXR1cm4gRm9ybURh
dGE6OmNyZWF0ZShDRkRhdGFHZXRCeXRlUHRyKGJvZHlEYXRhLmdldCgpKSwgQ0ZEYXRhR2V0TGVu
Z3RoKGJvZHlEYXRhLmdldCgpKSk7Ci0KLSAgICBSZXRhaW5QdHI8Q0ZBcnJheVJlZj4gYm9keVBh
cnRzKEFkb3B0Q0YsIHdrQ0ZVUkxSZXF1ZXN0Q29weUhUVFBSZXF1ZXN0Qm9keVBhcnRzKHJlcXVl
c3QpKTsKLSAgICBpZiAoYm9keVBhcnRzKSB7Ci0gICAgICAgIFJlZlB0cjxGb3JtRGF0YT4gZm9y
bURhdGEgPSBGb3JtRGF0YTo6Y3JlYXRlKCk7Ci0KLSAgICAgICAgQ0ZJbmRleCBjb3VudCA9IENG
QXJyYXlHZXRDb3VudChib2R5UGFydHMuZ2V0KCkpOwotICAgICAgICBmb3IgKENGSW5kZXggaSA9
IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBDRlR5cGVSZWYgYm9keVBhcnQgPSBD
RkFycmF5R2V0VmFsdWVBdEluZGV4KGJvZHlQYXJ0cy5nZXQoKSwgaSk7Ci0gICAgICAgICAgICBD
RlR5cGVJRCB0eXBlSUQgPSBDRkdldFR5cGVJRChib2R5UGFydCk7Ci0gICAgICAgICAgICBpZiAo
dHlwZUlEID09IENGU3RyaW5nR2V0VHlwZUlEKCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcg
ZmlsZW5hbWUgPSAoQ0ZTdHJpbmdSZWYpYm9keVBhcnQ7Ci0gICAgICAgICAgICAgICAgZm9ybURh
dGEtPmFwcGVuZEZpbGUoZmlsZW5hbWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlSUQg
PT0gQ0ZEYXRhR2V0VHlwZUlEKCkpIHsKLSAgICAgICAgICAgICAgICBDRkRhdGFSZWYgZGF0YSA9
IChDRkRhdGFSZWYpYm9keVBhcnQ7Ci0gICAgICAgICAgICAgICAgZm9ybURhdGEtPmFwcGVuZERh
dGEoQ0ZEYXRhR2V0Qnl0ZVB0cihkYXRhKSwgQ0ZEYXRhR2V0TGVuZ3RoKGRhdGEpKTsKLSAgICAg
ICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAg
ICAgICB9Ci0gICAgICAgIHJldHVybiBmb3JtRGF0YS5yZWxlYXNlKCk7Ci0gICAgfQorICAgIGlm
ICghc3RyZWFtKQorICAgICAgICByZXR1cm4gMDsKIAotICAgIC8vIEZJWE1FOiB3aGF0IHRvIGRv
IGFib3V0IGFyYml0cmFyeSBib2R5IHN0cmVhbXM/Ci0gICAgcmV0dXJuIDA7CisgICAgTXV0ZXhM
b2NrZXIgbG9ja2VyKHN0cmVhbUZpZWxkc01hcE11dGV4KCkpOworICAgIEZvcm1TdHJlYW1GaWVs
ZHMqIGZvcm1TdHJlYW0gPSBzdHJlYW1GaWVsZHNNYXAoKS5nZXQoc3RyZWFtKTsKKyAgICBpZiAo
IWZvcm1TdHJlYW0pCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBmb3JtU3RyZWFtLT5m
b3JtRGF0YS5nZXQoKTsKIH0KIAotfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorUGFzc1JlZlB0cjxG
b3JtRGF0YT4gaHR0cEJvZHlGcm9tUmVxdWVzdChDRlVSTFJlcXVlc3RSZWYgcmVxdWVzdCkKK3sK
KyAgICBSZXRhaW5QdHI8Q0ZSZWFkU3RyZWFtUmVmPiBib2R5U3RyZWFtID0gYWRvcHRDRihDRlVS
TFJlcXVlc3RDb3B5SFRUUFJlcXVlc3RCb2R5U3RyZWFtKHJlcXVlc3QpKTsKKyAgICByZXR1cm4g
aHR0cEJvZHlGcm9tU3RyZWFtKGJvZHlTdHJlYW0uZ2V0KCkpOworfQogCi0jZW5kaWYgLy8gVVNF
KENGTkVUV09SSykKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFNvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL25ldHdvcmsvY2YvRm9ybURhdGFTdHJlYW1DRk5ldC5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY2YvRm9ybURhdGFTdHJlYW1DRk5ldC5o
CShyZXZpc2lvbiAxMTIxNjYpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2Nm
L0Zvcm1EYXRhU3RyZWFtQ0ZOZXQuaAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDUgQEAKIC8q
Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwNywgMjAxMiBBcHBs
ZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCkBAIC0yOSwyMCArMjksMjAgQEAKICNpZm5kZWYgRm9ybURhdGFTdHJlYW1DRk5ldF9oCiAj
ZGVmaW5lIEZvcm1EYXRhU3RyZWFtQ0ZOZXRfaAogCi0jaWYgVVNFKENGTkVUV09SSykKLQotI2lu
Y2x1ZGUgPENvcmVGb3VuZGF0aW9uL0NvcmVGb3VuZGF0aW9uLmg+CiAjaW5jbHVkZSA8d3RmL0Zv
cndhcmQuaD4KIAogdHlwZWRlZiBzdHJ1Y3QgX0NGVVJMUmVxdWVzdCogQ0ZNdXRhYmxlVVJMUmVx
dWVzdFJlZjsKIHR5cGVkZWYgY29uc3Qgc3RydWN0IF9DRlVSTFJlcXVlc3QqIENGVVJMUmVxdWVz
dFJlZjsKIAogbmFtZXNwYWNlIFdlYkNvcmUgewotICAgIGNsYXNzIEZvcm1EYXRhOwotICAgIHZv
aWQgc2V0SFRUUEJvZHkoQ0ZNdXRhYmxlVVJMUmVxdWVzdFJlZiwgUGFzc1JlZlB0cjxGb3JtRGF0
YT4pOwotICAgIFBhc3NSZWZQdHI8Rm9ybURhdGE+IGh0dHBCb2R5RnJvbVJlcXVlc3QoQ0ZVUkxS
ZXF1ZXN0UmVmKTsKLX0KIAotI2VuZGlmIC8vIFVTRShDRk5FVFdPUkspCitjbGFzcyBGb3JtRGF0
YTsKKwordm9pZCBzZXRIVFRQQm9keShDRk11dGFibGVVUkxSZXF1ZXN0UmVmLCBQYXNzUmVmUHRy
PEZvcm1EYXRhPik7CitQYXNzUmVmUHRyPEZvcm1EYXRhPiBodHRwQm9keUZyb21SZXF1ZXN0KENG
VVJMUmVxdWVzdFJlZik7CisKK0Zvcm1EYXRhKiBodHRwQm9keUZyb21TdHJlYW0oQ0ZSZWFkU3Ry
ZWFtUmVmKTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQogCiAjZW5kaWYgLy8gRm9ybURhdGFT
dHJlYW1DRk5ldF9oCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL21hYy9G
b3JtRGF0YVN0cmVhbU1hYy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L25ldHdvcmsvbWFjL0Zvcm1EYXRhU3RyZWFtTWFjLmgJKHJldmlzaW9uIDExMjE2NikKKysrIFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvbWFjL0Zvcm1EYXRhU3RyZWFtTWFjLmgJKHdv
cmtpbmcgY29weSkKQEAgLTMxLDggKzMxLDkgQEAKIAogI2lmICFVU0UoQ0ZORVRXT1JLKQogCi0j
aW5jbHVkZSAiRm9ybURhdGEuaCIKKyNpbmNsdWRlIDx3dGYvRm9yd2FyZC5oPgogCitAY2xhc3Mg
TlNJbnB1dFN0cmVhbTsKIEBjbGFzcyBOU011dGFibGVVUkxSZXF1ZXN0OwogCiBuYW1lc3BhY2Ug
V2ViQ29yZSB7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL21hYy9Gb3Jt
RGF0YVN0cmVhbU1hYy5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9u
ZXR3b3JrL21hYy9Gb3JtRGF0YVN0cmVhbU1hYy5tbQkocmV2aXNpb24gMTEyMzAyKQorKysgU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9tYWMvRm9ybURhdGFTdHJlYW1NYWMubW0JKHdv
cmtpbmcgY29weSkKQEAgLTMxLDQxNSArMzEsMjQgQEAKIAogI2lmICFVU0UoQ0ZORVRXT1JLKQog
Ci0jaW1wb3J0ICJCbG9iUmVnaXN0cnlJbXBsLmgiCi0jaW1wb3J0ICJGaWxlU3lzdGVtLmgiCiAj
aW1wb3J0ICJGb3JtRGF0YS5oIgotI2ltcG9ydCAiU2NoZWR1bGVQYWlyLmgiCi0jaW1wb3J0ICJX
ZWJDb3JlU3lzdGVtSW50ZXJmYWNlLmgiCi0jaW1wb3J0IDxzeXMvc3RhdC5oPgotI2ltcG9ydCA8
c3lzL3R5cGVzLmg+Ci0jaW1wb3J0IDx3dGYvQXNzZXJ0aW9ucy5oPgotI2ltcG9ydCA8d3RmL01h
aW5UaHJlYWQuaD4KLSNpbXBvcnQgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KLSNpbXBvcnQgPHd0Zi9U
aHJlYWRpbmcuaD4KKyNpbXBvcnQgIkZvcm1EYXRhU3RyZWFtQ0ZOZXQuaCIKKyNpbXBvcnQgPHd0
Zi9QYXNzUmVmUHRyLmg+CiAKLSNpZiBQTEFURk9STShJT1MpCi0jaW1wb3J0IDxNYWNFcnJvcnMu
aD4KLSNlbHNlCi0jaW1wb3J0IDxDb3JlU2VydmljZXMvQ29yZVNlcnZpY2VzLmg+Ci0jZW5kaWYK
K0BpbnRlcmZhY2UgTlNVUkxSZXF1ZXN0IChXZWJOU1VSTFJlcXVlc3REZXRhaWxzKQorLSAoQ0ZV
UkxSZXF1ZXN0UmVmKV9DRlVSTFJlcXVlc3Q7CitAZW5kCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsK
IAotc3RhdGljIE11dGV4JiBzdHJlYW1GaWVsZHNNYXBNdXRleCgpCi17Ci0gICAgREVGSU5FX1NU
QVRJQ19MT0NBTChNdXRleCwgc3RhdGljTXV0ZXgsICgpKTsKLSAgICByZXR1cm4gc3RhdGljTXV0
ZXg7Ci19Ci0KLXN0YXRpYyB2b2lkIGZvcm1FdmVudENhbGxiYWNrKENGUmVhZFN0cmVhbVJlZiBz
dHJlYW0sIENGU3RyZWFtRXZlbnRUeXBlIHR5cGUsIHZvaWQqIGNvbnRleHQpOwotCi1zdHJ1Y3Qg
Rm9ybUNvbnRleHQgewotICAgIFJlZlB0cjxGb3JtRGF0YT4gZm9ybURhdGE7Ci0gICAgdW5zaWdu
ZWQgbG9uZyBsb25nIHN0cmVhbUxlbmd0aDsKLX07Ci0KLXN0cnVjdCBGb3JtU3RyZWFtRmllbGRz
IHsKLSAgICBSZWZQdHI8Rm9ybURhdGE+IGZvcm1EYXRhOwotICAgIFNjaGVkdWxlUGFpckhhc2hT
ZXQgc2NoZWR1bGVkUnVuTG9vcFBhaXJzOwotICAgIFZlY3RvcjxGb3JtRGF0YUVsZW1lbnQ+IHJl
bWFpbmluZ0VsZW1lbnRzOyAvLyBpbiByZXZlcnNlIG9yZGVyCi0gICAgQ0ZSZWFkU3RyZWFtUmVm
IGN1cnJlbnRTdHJlYW07Ci0jaWYgRU5BQkxFKEJMT0IpCi0gICAgbG9uZyBsb25nIGN1cnJlbnRT
dHJlYW1SYW5nZUxlbmd0aDsKLSNlbmRpZgotICAgIGNoYXIqIGN1cnJlbnREYXRhOwotICAgIENG
UmVhZFN0cmVhbVJlZiBmb3JtU3RyZWFtOwotICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBzdHJlYW1M
ZW5ndGg7Ci0gICAgdW5zaWduZWQgbG9uZyBsb25nIGJ5dGVzU2VudDsKLX07Ci0KLXR5cGVkZWYg
SGFzaE1hcDxDRlJlYWRTdHJlYW1SZWYsIEZvcm1TdHJlYW1GaWVsZHMqPiBTdHJlYW1GaWVsZHNN
YXA7Ci1zdGF0aWMgU3RyZWFtRmllbGRzTWFwJiBzdHJlYW1GaWVsZHNNYXAoKQotewotICAgIERF
RklORV9TVEFUSUNfTE9DQUwoU3RyZWFtRmllbGRzTWFwLCBzdHJlYW1GaWVsZHNNYXAsICgpKTsK
LSAgICByZXR1cm4gc3RyZWFtRmllbGRzTWFwOwotfQotCi1zdGF0aWMgdm9pZCBjbG9zZUN1cnJl
bnRTdHJlYW0oRm9ybVN0cmVhbUZpZWxkcyAqZm9ybSkKLXsKLSAgICBpZiAoZm9ybS0+Y3VycmVu
dFN0cmVhbSkgewotICAgICAgICBDRlJlYWRTdHJlYW1DbG9zZShmb3JtLT5jdXJyZW50U3RyZWFt
KTsKLSAgICAgICAgQ0ZSZWFkU3RyZWFtU2V0Q2xpZW50KGZvcm0tPmN1cnJlbnRTdHJlYW0sIGtD
RlN0cmVhbUV2ZW50Tm9uZSwgTlVMTCwgTlVMTCk7Ci0gICAgICAgIENGUmVsZWFzZShmb3JtLT5j
dXJyZW50U3RyZWFtKTsKLSAgICAgICAgZm9ybS0+Y3VycmVudFN0cmVhbSA9IE5VTEw7Ci0jaWYg
RU5BQkxFKEJMT0IpCi0gICAgICAgIGZvcm0tPmN1cnJlbnRTdHJlYW1SYW5nZUxlbmd0aCA9IEJs
b2JEYXRhSXRlbTo6dG9FbmRPZkZpbGU7Ci0jZW5kaWYKLSAgICB9Ci0gICAgaWYgKGZvcm0tPmN1
cnJlbnREYXRhKSB7Ci0gICAgICAgIGZhc3RGcmVlKGZvcm0tPmN1cnJlbnREYXRhKTsKLSAgICAg
ICAgZm9ybS0+Y3VycmVudERhdGEgPSAwOwotICAgIH0KLX0KLQotLy8gUmV0dXJuIGZhbHNlIGlm
IHdlIGNhbm5vdCBhZHZhbmNlIHRoZSBzdHJlYW0uIEN1cnJlbnRseSB0aGUgb25seSBwb3NzaWJs
ZSBmYWlsdXJlIGlzIHRoYXQgdGhlIHVuZGVybHlpbmcgZmlsZSBoYXMgYmVlbiByZW1vdmVkIG9y
IGNoYW5nZWQgc2luY2UgRmlsZS5zbGljZS4KLXN0YXRpYyBib29sIGFkdmFuY2VDdXJyZW50U3Ry
ZWFtKEZvcm1TdHJlYW1GaWVsZHMqIGZvcm0pCi17Ci0gICAgY2xvc2VDdXJyZW50U3RyZWFtKGZv
cm0pOwotCi0gICAgaWYgKGZvcm0tPnJlbWFpbmluZ0VsZW1lbnRzLmlzRW1wdHkoKSkKLSAgICAg
ICAgcmV0dXJuIHRydWU7Ci0KLSAgICAvLyBDcmVhdGUgdGhlIG5ldyBzdHJlYW0uCi0gICAgRm9y
bURhdGFFbGVtZW50JiBuZXh0SW5wdXQgPSBmb3JtLT5yZW1haW5pbmdFbGVtZW50cy5sYXN0KCk7
Ci0KLSAgICBpZiAobmV4dElucHV0Lm1fdHlwZSA9PSBGb3JtRGF0YUVsZW1lbnQ6OmRhdGEpIHsK
LSAgICAgICAgc2l6ZV90IHNpemUgPSBuZXh0SW5wdXQubV9kYXRhLnNpemUoKTsKLSAgICAgICAg
Y2hhciogZGF0YSA9IG5leHRJbnB1dC5tX2RhdGEucmVsZWFzZUJ1ZmZlcigpOwotICAgICAgICBm
b3JtLT5jdXJyZW50U3RyZWFtID0gQ0ZSZWFkU3RyZWFtQ3JlYXRlV2l0aEJ5dGVzTm9Db3B5KDAs
IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVUludDgqPihkYXRhKSwgc2l6ZSwga0NGQWxsb2NhdG9y
TnVsbCk7Ci0gICAgICAgIGZvcm0tPmN1cnJlbnREYXRhID0gZGF0YTsKLSAgICB9IGVsc2Ugewot
I2lmIEVOQUJMRShCTE9CKQotICAgICAgICAvLyBDaGVjayBpZiB0aGUgZmlsZSBoYXMgYmVlbiBj
aGFuZ2VkIG9yIG5vdCBpZiByZXF1aXJlZC4KLSAgICAgICAgaWYgKG5leHRJbnB1dC5tX2V4cGVj
dGVkRmlsZU1vZGlmaWNhdGlvblRpbWUgIT0gQmxvYkRhdGFJdGVtOjpkb05vdENoZWNrRmlsZUNo
YW5nZSkgewotICAgICAgICAgICAgdGltZV90IGZpbGVNb2RpZmljYXRpb25UaW1lOwotICAgICAg
ICAgICAgaWYgKCFnZXRGaWxlTW9kaWZpY2F0aW9uVGltZShuZXh0SW5wdXQubV9maWxlbmFtZSwg
ZmlsZU1vZGlmaWNhdGlvblRpbWUpIHx8IGZpbGVNb2RpZmljYXRpb25UaW1lICE9IHN0YXRpY19j
YXN0PHRpbWVfdD4obmV4dElucHV0Lm1fZXhwZWN0ZWRGaWxlTW9kaWZpY2F0aW9uVGltZSkpCi0g
ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAg
Y29uc3QgU3RyaW5nJiBwYXRoID0gbmV4dElucHV0Lm1fc2hvdWxkR2VuZXJhdGVGaWxlID8gbmV4
dElucHV0Lm1fZ2VuZXJhdGVkRmlsZW5hbWUgOiBuZXh0SW5wdXQubV9maWxlbmFtZTsKLSAgICAg
ICAgZm9ybS0+Y3VycmVudFN0cmVhbSA9IENGUmVhZFN0cmVhbUNyZWF0ZVdpdGhGaWxlKDAsIHBh
dGhBc1VSTChwYXRoKS5nZXQoKSk7Ci0gICAgICAgIGlmICghZm9ybS0+Y3VycmVudFN0cmVhbSkg
ewotICAgICAgICAgICAgLy8gVGhlIGZpbGUgbXVzdCBoYXZlIGJlZW4gcmVtb3ZlZCBvciBiZWNv
bWUgdW5yZWFkYWJsZS4KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotI2lm
IEVOQUJMRShCTE9CKQotICAgICAgICBpZiAobmV4dElucHV0Lm1fZmlsZVN0YXJ0ID4gMCkgewot
ICAgICAgICAgICAgUmV0YWluUHRyPENGTnVtYmVyUmVmPiBwb3NpdGlvbihBZG9wdENGLCBDRk51
bWJlckNyZWF0ZSgwLCBrQ0ZOdW1iZXJMb25nTG9uZ1R5cGUsICZuZXh0SW5wdXQubV9maWxlU3Rh
cnQpKTsKLSAgICAgICAgICAgIENGUmVhZFN0cmVhbVNldFByb3BlcnR5KGZvcm0tPmN1cnJlbnRT
dHJlYW0sIGtDRlN0cmVhbVByb3BlcnR5RmlsZUN1cnJlbnRPZmZzZXQsIHBvc2l0aW9uLmdldCgp
KTsKLSAgICAgICAgfQotICAgICAgICBmb3JtLT5jdXJyZW50U3RyZWFtUmFuZ2VMZW5ndGggPSBu
ZXh0SW5wdXQubV9maWxlTGVuZ3RoOwotI2VuZGlmCi0gICAgfQotICAgIGZvcm0tPnJlbWFpbmlu
Z0VsZW1lbnRzLnJlbW92ZUxhc3QoKTsKLQotICAgIC8vIFNldCB1cCB0aGUgY2FsbGJhY2suCi0g
ICAgQ0ZTdHJlYW1DbGllbnRDb250ZXh0IGNvbnRleHQgPSB7IDAsIGZvcm0sIE5VTEwsIE5VTEws
IE5VTEwgfTsKLSAgICBDRlJlYWRTdHJlYW1TZXRDbGllbnQoZm9ybS0+Y3VycmVudFN0cmVhbSwg
a0NGU3RyZWFtRXZlbnRIYXNCeXRlc0F2YWlsYWJsZSB8IGtDRlN0cmVhbUV2ZW50RXJyb3JPY2N1
cnJlZCB8IGtDRlN0cmVhbUV2ZW50RW5kRW5jb3VudGVyZWQsCi0gICAgICAgIGZvcm1FdmVudENh
bGxiYWNrLCAmY29udGV4dCk7Ci0KLSAgICAvLyBTY2hlZHVsZSB3aXRoIHRoZSBjdXJyZW50IHNl
dCBvZiBydW4gbG9vcHMuCi0gICAgU2NoZWR1bGVQYWlySGFzaFNldDo6aXRlcmF0b3IgZW5kID0g
Zm9ybS0+c2NoZWR1bGVkUnVuTG9vcFBhaXJzLmVuZCgpOwotICAgIGZvciAoU2NoZWR1bGVQYWly
SGFzaFNldDo6aXRlcmF0b3IgaXQgPSBmb3JtLT5zY2hlZHVsZWRSdW5Mb29wUGFpcnMuYmVnaW4o
KTsgaXQgIT0gZW5kOyArK2l0KQotICAgICAgICBDRlJlYWRTdHJlYW1TY2hlZHVsZVdpdGhSdW5M
b29wKGZvcm0tPmN1cnJlbnRTdHJlYW0sICgqaXQpLT5ydW5Mb29wKCksICgqaXQpLT5tb2RlKCkp
OwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sIG9wZW5OZXh0U3RyZWFtKEZv
cm1TdHJlYW1GaWVsZHMqIGZvcm0pCi17Ci0gICAgLy8gU2tpcCBvdmVyIGFueSBzdHJlYW1zIHdl
IGNhbid0IG9wZW4uCi0gICAgaWYgKCFhZHZhbmNlQ3VycmVudFN0cmVhbShmb3JtKSkKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgIHdoaWxlIChmb3JtLT5jdXJyZW50U3RyZWFtICYmICFDRlJl
YWRTdHJlYW1PcGVuKGZvcm0tPmN1cnJlbnRTdHJlYW0pKSB7Ci0gICAgICAgIGlmICghYWR2YW5j
ZUN1cnJlbnRTdHJlYW0oZm9ybSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQot
ICAgIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZCogZm9ybUNyZWF0ZShDRlJlYWRTdHJl
YW1SZWYgc3RyZWFtLCB2b2lkKiBjb250ZXh0KQotewotICAgIEZvcm1Db250ZXh0KiBmb3JtQ29u
dGV4dCA9IHN0YXRpY19jYXN0PEZvcm1Db250ZXh0Kj4oY29udGV4dCk7Ci0KLSAgICBGb3JtU3Ry
ZWFtRmllbGRzKiBuZXdJbmZvID0gbmV3IEZvcm1TdHJlYW1GaWVsZHM7Ci0gICAgbmV3SW5mby0+
Zm9ybURhdGEgPSBmb3JtQ29udGV4dC0+Zm9ybURhdGEucmVsZWFzZSgpOwotICAgIG5ld0luZm8t
PmN1cnJlbnRTdHJlYW0gPSBOVUxMOwotI2lmIEVOQUJMRShCTE9CKQotICAgIG5ld0luZm8tPmN1
cnJlbnRTdHJlYW1SYW5nZUxlbmd0aCA9IEJsb2JEYXRhSXRlbTo6dG9FbmRPZkZpbGU7Ci0jZW5k
aWYKLSAgICBuZXdJbmZvLT5jdXJyZW50RGF0YSA9IDA7Ci0gICAgbmV3SW5mby0+Zm9ybVN0cmVh
bSA9IHN0cmVhbTsgLy8gRG9uJ3QgcmV0YWluLiBUaGF0IHdvdWxkIGNyZWF0ZSBhIHJlZmVyZW5j
ZSBjeWNsZS4KLSAgICBuZXdJbmZvLT5zdHJlYW1MZW5ndGggPSBmb3JtQ29udGV4dC0+c3RyZWFt
TGVuZ3RoOwotICAgIG5ld0luZm8tPmJ5dGVzU2VudCA9IDA7Ci0KLSAgICAvLyBBcHBlbmQgaW4g
cmV2ZXJzZSBvcmRlciBzaW5jZSB3ZSByZW1vdmUgZWxlbWVudHMgZnJvbSB0aGUgZW5kLgotICAg
IHNpemVfdCBzaXplID0gbmV3SW5mby0+Zm9ybURhdGEtPmVsZW1lbnRzKCkuc2l6ZSgpOwotICAg
IG5ld0luZm8tPnJlbWFpbmluZ0VsZW1lbnRzLnJlc2VydmVJbml0aWFsQ2FwYWNpdHkoc2l6ZSk7
Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpCi0gICAgICAgIG5ld0luZm8t
PnJlbWFpbmluZ0VsZW1lbnRzLmFwcGVuZChuZXdJbmZvLT5mb3JtRGF0YS0+ZWxlbWVudHMoKVtz
aXplIC0gaSAtIDFdKTsKLQotICAgIE11dGV4TG9ja2VyIGxvY2tlcihzdHJlYW1GaWVsZHNNYXBN
dXRleCgpKTsKLSAgICBBU1NFUlQoIXN0cmVhbUZpZWxkc01hcCgpLmNvbnRhaW5zKHN0cmVhbSkp
OwotICAgIHN0cmVhbUZpZWxkc01hcCgpLmFkZChzdHJlYW0sIG5ld0luZm8pOwotCi0gICAgcmV0
dXJuIG5ld0luZm87Ci19Ci0KLXN0YXRpYyB2b2lkIGZvcm1GaW5pc2hGaW5hbGl6YXRpb25Pbk1h
aW5UaHJlYWQodm9pZCogY29udGV4dCkKLXsKLSAgICBPd25QdHI8Rm9ybVN0cmVhbUZpZWxkcz4g
Zm9ybSA9IGFkb3B0UHRyKHN0YXRpY19jYXN0PEZvcm1TdHJlYW1GaWVsZHMqPihjb250ZXh0KSk7
Ci0KLSAgICBjbG9zZUN1cnJlbnRTdHJlYW0oZm9ybS5nZXQoKSk7Ci19Ci0KLXN0YXRpYyB2b2lk
IGZvcm1GaW5hbGl6ZShDRlJlYWRTdHJlYW1SZWYgc3RyZWFtLCB2b2lkKiBjb250ZXh0KQotewot
ICAgIEZvcm1TdHJlYW1GaWVsZHMqIGZvcm0gPSBzdGF0aWNfY2FzdDxGb3JtU3RyZWFtRmllbGRz
Kj4oY29udGV4dCk7Ci0KLSAgICBNdXRleExvY2tlciBsb2NrZXIoc3RyZWFtRmllbGRzTWFwTXV0
ZXgoKSk7Ci0KLSAgICBBU1NFUlQoZm9ybS0+Zm9ybVN0cmVhbSA9PSBzdHJlYW0pOwotICAgIEFT
U0VSVChzdHJlYW1GaWVsZHNNYXAoKS5nZXQoc3RyZWFtKSA9PSBjb250ZXh0KTsKLQotICAgIC8v
IERvIHRoaXMgcmlnaHQgYXdheSBiZWNhdXNlIHRoZSBDRlJlYWRTdHJlYW1SZWYgaXMgYmVpbmcg
ZGVhbGxvY2F0ZWQuCi0gICAgLy8gV2UgY2FuJ3Qgd2FpdCB0byByZW1vdmUgdGhpcyBmcm9tIHRo
ZSBtYXAgdW50aWwgd2UgZmluaXNoIGZpbmFsaXppbmcKLSAgICAvLyBvbiB0aGUgbWFpbiB0aHJl
YWQgYmVjYXVzZSBpbiB0aGVvcnkgdGhlIGZyZWVkIG1lbW9yeSBjb3VsZCBiZSByZXVzZWQKLSAg
ICAvLyBmb3IgYSBuZXcgQ0ZSZWFkU3RyZWFtIGJlZm9yZSB0aGF0IHJ1bnMuCi0gICAgc3RyZWFt
RmllbGRzTWFwKCkucmVtb3ZlKHN0cmVhbSk7Ci0KLSAgICBjYWxsT25NYWluVGhyZWFkKGZvcm1G
aW5pc2hGaW5hbGl6YXRpb25Pbk1haW5UaHJlYWQsIGZvcm0pOwotfQotCi1zdGF0aWMgQm9vbGVh
biBmb3JtT3BlbihDRlJlYWRTdHJlYW1SZWYsIENGU3RyZWFtRXJyb3IqIGVycm9yLCBCb29sZWFu
KiBvcGVuQ29tcGxldGUsIHZvaWQqIGNvbnRleHQpCi17Ci0gICAgRm9ybVN0cmVhbUZpZWxkcyog
Zm9ybSA9IHN0YXRpY19jYXN0PEZvcm1TdHJlYW1GaWVsZHMqPihjb250ZXh0KTsKLQotICAgIGJv
b2wgb3BlbmVkID0gb3Blbk5leHRTdHJlYW0oZm9ybSk7Ci0KLSAgICAqb3BlbkNvbXBsZXRlID0g
b3BlbmVkOwotICAgIGVycm9yLT5lcnJvciA9IG9wZW5lZCA/IDAgOiBmbmZFcnI7Ci0gICAgcmV0
dXJuIG9wZW5lZDsKLX0KLQotc3RhdGljIENGSW5kZXggZm9ybVJlYWQoQ0ZSZWFkU3RyZWFtUmVm
LCBVSW50OCogYnVmZmVyLCBDRkluZGV4IGJ1ZmZlckxlbmd0aCwgQ0ZTdHJlYW1FcnJvciogZXJy
b3IsIEJvb2xlYW4qIGF0RU9GLCB2b2lkKiBjb250ZXh0KQotewotICAgIEZvcm1TdHJlYW1GaWVs
ZHMqIGZvcm0gPSBzdGF0aWNfY2FzdDxGb3JtU3RyZWFtRmllbGRzKj4oY29udGV4dCk7Ci0KLSAg
ICB3aGlsZSAoZm9ybS0+Y3VycmVudFN0cmVhbSkgewotICAgICAgICBDRkluZGV4IGJ5dGVzVG9S
ZWFkID0gYnVmZmVyTGVuZ3RoOwotI2lmIEVOQUJMRShCTE9CKQotICAgICAgICBpZiAoZm9ybS0+
Y3VycmVudFN0cmVhbVJhbmdlTGVuZ3RoICE9IEJsb2JEYXRhSXRlbTo6dG9FbmRPZkZpbGUgJiYg
Zm9ybS0+Y3VycmVudFN0cmVhbVJhbmdlTGVuZ3RoIDwgYnl0ZXNUb1JlYWQpCi0gICAgICAgICAg
ICBieXRlc1RvUmVhZCA9IHN0YXRpY19jYXN0PENGSW5kZXg+KGZvcm0tPmN1cnJlbnRTdHJlYW1S
YW5nZUxlbmd0aCk7Ci0jZW5kaWYKLSAgICAgICAgQ0ZJbmRleCBieXRlc1JlYWQgPSBDRlJlYWRT
dHJlYW1SZWFkKGZvcm0tPmN1cnJlbnRTdHJlYW0sIGJ1ZmZlciwgYnl0ZXNUb1JlYWQpOwotICAg
ICAgICBpZiAoYnl0ZXNSZWFkIDwgMCkgewotICAgICAgICAgICAgKmVycm9yID0gQ0ZSZWFkU3Ry
ZWFtR2V0RXJyb3IoZm9ybS0+Y3VycmVudFN0cmVhbSk7Ci0gICAgICAgICAgICByZXR1cm4gLTE7
Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJ5dGVzUmVhZCA+IDApIHsKLSAgICAgICAgICAgIGVy
cm9yLT5lcnJvciA9IDA7Ci0gICAgICAgICAgICAqYXRFT0YgPSBGQUxTRTsKLSAgICAgICAgICAg
IGZvcm0tPmJ5dGVzU2VudCArPSBieXRlc1JlYWQ7Ci0jaWYgRU5BQkxFKEJMT0IpCi0gICAgICAg
ICAgICBpZiAoZm9ybS0+Y3VycmVudFN0cmVhbVJhbmdlTGVuZ3RoICE9IEJsb2JEYXRhSXRlbTo6
dG9FbmRPZkZpbGUpCi0gICAgICAgICAgICAgICAgZm9ybS0+Y3VycmVudFN0cmVhbVJhbmdlTGVu
Z3RoIC09IGJ5dGVzUmVhZDsKLSNlbmRpZgotCi0gICAgICAgICAgICByZXR1cm4gYnl0ZXNSZWFk
OwotICAgICAgICB9Ci0gICAgICAgIG9wZW5OZXh0U3RyZWFtKGZvcm0pOwotICAgIH0KLQotICAg
IGVycm9yLT5lcnJvciA9IDA7Ci0gICAgKmF0RU9GID0gVFJVRTsKLSAgICByZXR1cm4gMDsKLX0K
LQotc3RhdGljIEJvb2xlYW4gZm9ybUNhblJlYWQoQ0ZSZWFkU3RyZWFtUmVmIHN0cmVhbSwgdm9p
ZCogY29udGV4dCkKLXsKLSAgICBGb3JtU3RyZWFtRmllbGRzKiBmb3JtID0gc3RhdGljX2Nhc3Q8
Rm9ybVN0cmVhbUZpZWxkcyo+KGNvbnRleHQpOwotCi0gICAgd2hpbGUgKGZvcm0tPmN1cnJlbnRT
dHJlYW0gJiYgQ0ZSZWFkU3RyZWFtR2V0U3RhdHVzKGZvcm0tPmN1cnJlbnRTdHJlYW0pID09IGtD
RlN0cmVhbVN0YXR1c0F0RW5kKSB7Ci0gICAgICAgIG9wZW5OZXh0U3RyZWFtKGZvcm0pOwotICAg
IH0KLSAgICBpZiAoIWZvcm0tPmN1cnJlbnRTdHJlYW0pIHsKLSAgICAgICAgd2tTaWduYWxDRlJl
YWRTdHJlYW1FbmQoc3RyZWFtKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBy
ZXR1cm4gQ0ZSZWFkU3RyZWFtSGFzQnl0ZXNBdmFpbGFibGUoZm9ybS0+Y3VycmVudFN0cmVhbSk7
Ci19Ci0KLXN0YXRpYyB2b2lkIGZvcm1DbG9zZShDRlJlYWRTdHJlYW1SZWYsIHZvaWQqIGNvbnRl
eHQpCi17Ci0gICAgRm9ybVN0cmVhbUZpZWxkcyogZm9ybSA9IHN0YXRpY19jYXN0PEZvcm1TdHJl
YW1GaWVsZHMqPihjb250ZXh0KTsKLQotICAgIGNsb3NlQ3VycmVudFN0cmVhbShmb3JtKTsKLX0K
LQotc3RhdGljIHZvaWQgZm9ybVNjaGVkdWxlKENGUmVhZFN0cmVhbVJlZiwgQ0ZSdW5Mb29wUmVm
IHJ1bkxvb3AsIENGU3RyaW5nUmVmIHJ1bkxvb3BNb2RlLCB2b2lkKiBjb250ZXh0KQotewotICAg
IEZvcm1TdHJlYW1GaWVsZHMqIGZvcm0gPSBzdGF0aWNfY2FzdDxGb3JtU3RyZWFtRmllbGRzKj4o
Y29udGV4dCk7Ci0KLSAgICBpZiAoZm9ybS0+Y3VycmVudFN0cmVhbSkKLSAgICAgICAgQ0ZSZWFk
U3RyZWFtU2NoZWR1bGVXaXRoUnVuTG9vcChmb3JtLT5jdXJyZW50U3RyZWFtLCBydW5Mb29wLCBy
dW5Mb29wTW9kZSk7Ci0gICAgZm9ybS0+c2NoZWR1bGVkUnVuTG9vcFBhaXJzLmFkZChTY2hlZHVs
ZVBhaXI6OmNyZWF0ZShydW5Mb29wLCBydW5Mb29wTW9kZSkpOwotfQotCi1zdGF0aWMgdm9pZCBm
b3JtVW5zY2hlZHVsZShDRlJlYWRTdHJlYW1SZWYsIENGUnVuTG9vcFJlZiBydW5Mb29wLCBDRlN0
cmluZ1JlZiBydW5Mb29wTW9kZSwgdm9pZCogY29udGV4dCkKLXsKLSAgICBGb3JtU3RyZWFtRmll
bGRzKiBmb3JtID0gc3RhdGljX2Nhc3Q8Rm9ybVN0cmVhbUZpZWxkcyo+KGNvbnRleHQpOwotCi0g
ICAgaWYgKGZvcm0tPmN1cnJlbnRTdHJlYW0pCi0gICAgICAgIENGUmVhZFN0cmVhbVVuc2NoZWR1
bGVGcm9tUnVuTG9vcChmb3JtLT5jdXJyZW50U3RyZWFtLCBydW5Mb29wLCBydW5Mb29wTW9kZSk7
Ci0gICAgZm9ybS0+c2NoZWR1bGVkUnVuTG9vcFBhaXJzLnJlbW92ZShTY2hlZHVsZVBhaXI6OmNy
ZWF0ZShydW5Mb29wLCBydW5Mb29wTW9kZSkpOwotfQotCi1zdGF0aWMgdm9pZCBmb3JtRXZlbnRD
YWxsYmFjayhDRlJlYWRTdHJlYW1SZWYgc3RyZWFtLCBDRlN0cmVhbUV2ZW50VHlwZSB0eXBlLCB2
b2lkKiBjb250ZXh0KQotewotICAgIEZvcm1TdHJlYW1GaWVsZHMqIGZvcm0gPSBzdGF0aWNfY2Fz
dDxGb3JtU3RyZWFtRmllbGRzKj4oY29udGV4dCk7Ci0KLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAg
ICBjYXNlIGtDRlN0cmVhbUV2ZW50SGFzQnl0ZXNBdmFpbGFibGU6Ci0gICAgICAgIHdrU2lnbmFs
Q0ZSZWFkU3RyZWFtSGFzQnl0ZXMoZm9ybS0+Zm9ybVN0cmVhbSk7Ci0gICAgICAgIGJyZWFrOwot
ICAgIGNhc2Uga0NGU3RyZWFtRXZlbnRFcnJvck9jY3VycmVkOiB7Ci0gICAgICAgIENGU3RyZWFt
RXJyb3IgcmVhZFN0cmVhbUVycm9yID0gQ0ZSZWFkU3RyZWFtR2V0RXJyb3Ioc3RyZWFtKTsKLSAg
ICAgICAgd2tTaWduYWxDRlJlYWRTdHJlYW1FcnJvcihmb3JtLT5mb3JtU3RyZWFtLCAmcmVhZFN0
cmVhbUVycm9yKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2Uga0NGU3RyZWFtRXZl
bnRFbmRFbmNvdW50ZXJlZDoKLSAgICAgICAgb3Blbk5leHRTdHJlYW0oZm9ybSk7Ci0gICAgICAg
IGlmICghZm9ybS0+Y3VycmVudFN0cmVhbSkgewotICAgICAgICAgICAgd2tTaWduYWxDRlJlYWRT
dHJlYW1FbmQoZm9ybS0+Zm9ybVN0cmVhbSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0g
ICAgY2FzZSBrQ0ZTdHJlYW1FdmVudE5vbmU6Ci0gICAgICAgIExPR19FUlJPUigidW5leHBlY3Rl
ZCBrQ0ZTdHJlYW1FdmVudE5vbmUiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBrQ0ZTdHJl
YW1FdmVudE9wZW5Db21wbGV0ZWQ6Ci0gICAgICAgIExPR19FUlJPUigidW5leHBlY3RlZCBrQ0ZT
dHJlYW1FdmVudE9wZW5Db21wbGV0ZWQiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBrQ0ZT
dHJlYW1FdmVudENhbkFjY2VwdEJ5dGVzOgotICAgICAgICBMT0dfRVJST1IoInVuZXhwZWN0ZWQg
a0NGU3RyZWFtRXZlbnRDYW5BY2NlcHRCeXRlcyIpOwotICAgICAgICBicmVhazsKLSAgICB9Ci19
Ci0KIHZvaWQgc2V0SFRUUEJvZHkoTlNNdXRhYmxlVVJMUmVxdWVzdCAqcmVxdWVzdCwgUGFzc1Jl
ZlB0cjxGb3JtRGF0YT4gcHJwRm9ybURhdGEpCiB7Ci0gICAgUmVmUHRyPEZvcm1EYXRhPiBmb3Jt
RGF0YSA9IHBycEZvcm1EYXRhOwotCi0gICAgaWYgKCFmb3JtRGF0YSkKLSAgICAgICAgcmV0dXJu
OwotICAgICAgICAKLSAgICBzaXplX3QgY291bnQgPSBmb3JtRGF0YS0+ZWxlbWVudHMoKS5zaXpl
KCk7Ci0KLSAgICAvLyBIYW5kbGUgdGhlIGNvbW1vbiBzcGVjaWFsIGNhc2Ugb2Ygb25lIHBpZWNl
IG9mIGZvcm0gZGF0YSwgd2l0aCBubyBmaWxlcy4KLSAgICBpZiAoY291bnQgPT0gMSAmJiAhZm9y
bURhdGEtPmFsd2F5c1N0cmVhbSgpKSB7Ci0gICAgICAgIGNvbnN0IEZvcm1EYXRhRWxlbWVudCYg
ZWxlbWVudCA9IGZvcm1EYXRhLT5lbGVtZW50cygpWzBdOwotICAgICAgICBpZiAoZWxlbWVudC5t
X3R5cGUgPT0gRm9ybURhdGFFbGVtZW50OjpkYXRhKSB7Ci0gICAgICAgICAgICBOU0RhdGEgKmRh
dGEgPSBbW05TRGF0YSBhbGxvY10gaW5pdFdpdGhCeXRlczplbGVtZW50Lm1fZGF0YS5kYXRhKCkg
bGVuZ3RoOmVsZW1lbnQubV9kYXRhLnNpemUoKV07Ci0gICAgICAgICAgICBbcmVxdWVzdCBzZXRI
VFRQQm9keTpkYXRhXTsKLSAgICAgICAgICAgIFtkYXRhIHJlbGVhc2VdOwotICAgICAgICAgICAg
cmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0jaWYgRU5BQkxFKEJMT0IpCi0gICAgLy8gQ2hl
Y2sgaWYgdGhlcmUgaXMgYSBibG9iIGluIHRoZSBmb3JtIGRhdGEuCi0gICAgYm9vbCBoYXNCbG9i
ID0gZmFsc2U7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAg
ICAgIGNvbnN0IEZvcm1EYXRhRWxlbWVudCYgZWxlbWVudCA9IGZvcm1EYXRhLT5lbGVtZW50cygp
W2ldOwotICAgICAgICBpZiAoZWxlbWVudC5tX3R5cGUgPT0gRm9ybURhdGFFbGVtZW50OjplbmNv
ZGVkQmxvYikgewotICAgICAgICAgICAgaGFzQmxvYiA9IHRydWU7Ci0gICAgICAgICAgICBicmVh
azsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIElmIHllcywgd2UgaGF2ZSB0byByZXNvbHZl
IGFsbCB0aGUgYmxvYiByZWZlcmVuY2VzIGFuZCByZWdlbmVyYXRlIHRoZSBmb3JtIGRhdGEgd2l0
aCBvbmx5IGRhdGEgYW5kIGZpbGUgdHlwZXMuCi0gICAgaWYgKGhhc0Jsb2IpIHsKLSAgICAgICAg
UmVmUHRyPEZvcm1EYXRhPiBuZXdGb3JtRGF0YSA9IEZvcm1EYXRhOjpjcmVhdGUoKTsKLSAgICAg
ICAgbmV3Rm9ybURhdGEtPnNldEFsd2F5c1N0cmVhbShmb3JtRGF0YS0+YWx3YXlzU3RyZWFtKCkp
OwotICAgICAgICBuZXdGb3JtRGF0YS0+c2V0SWRlbnRpZmllcihmb3JtRGF0YS0+aWRlbnRpZmll
cigpKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAg
ICAgICAgICBjb25zdCBGb3JtRGF0YUVsZW1lbnQmIGVsZW1lbnQgPSBmb3JtRGF0YS0+ZWxlbWVu
dHMoKVtpXTsKLSAgICAgICAgICAgIGlmIChlbGVtZW50Lm1fdHlwZSA9PSBGb3JtRGF0YUVsZW1l
bnQ6OmRhdGEpCi0gICAgICAgICAgICAgICAgbmV3Rm9ybURhdGEtPmFwcGVuZERhdGEoZWxlbWVu
dC5tX2RhdGEuZGF0YSgpLCBlbGVtZW50Lm1fZGF0YS5zaXplKCkpOwotICAgICAgICAgICAgZWxz
ZSBpZiAoZWxlbWVudC5tX3R5cGUgPT0gRm9ybURhdGFFbGVtZW50OjplbmNvZGVkRmlsZSkKLSAg
ICAgICAgICAgICAgICBuZXdGb3JtRGF0YS0+YXBwZW5kRmlsZShlbGVtZW50Lm1fZmlsZW5hbWUs
IGVsZW1lbnQubV9zaG91bGRHZW5lcmF0ZUZpbGUpOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAg
ICAgICAgICAgICAgQVNTRVJUKGVsZW1lbnQubV90eXBlID09IEZvcm1EYXRhRWxlbWVudDo6ZW5j
b2RlZEJsb2IpOwotICAgICAgICAgICAgICAgIFJlZlB0cjxCbG9iU3RvcmFnZURhdGE+IGJsb2JE
YXRhID0gc3RhdGljX2Nhc3Q8QmxvYlJlZ2lzdHJ5SW1wbCY+KGJsb2JSZWdpc3RyeSgpKS5nZXRC
bG9iRGF0YUZyb21VUkwoS1VSTChQYXJzZWRVUkxTdHJpbmcsIGVsZW1lbnQubV9ibG9iVVJMKSk7
Ci0gICAgICAgICAgICAgICAgaWYgKGJsb2JEYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZv
ciAoc2l6ZV90IGogPSAwOyBqIDwgYmxvYkRhdGEtPml0ZW1zKCkuc2l6ZSgpOyArK2opIHsKLSAg
ICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJsb2JEYXRhSXRlbSYgYmxvYkl0ZW0gPSBibG9i
RGF0YS0+aXRlbXMoKVtqXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChibG9iSXRlbS50
eXBlID09IEJsb2JEYXRhSXRlbTo6RGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAg
IG5ld0Zvcm1EYXRhLT5hcHBlbmREYXRhKGJsb2JJdGVtLmRhdGEtPmRhdGEoKSArIHN0YXRpY19j
YXN0PGludD4oYmxvYkl0ZW0ub2Zmc2V0KSwgc3RhdGljX2Nhc3Q8aW50PihibG9iSXRlbS5sZW5n
dGgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgQVNTRVJUKGJsb2JJdGVtLnR5cGUgPT0gQmxvYkRhdGFJdGVtOjpGaWxlKTsK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGb3JtRGF0YS0+YXBwZW5kRmlsZVJhbmdl
KGJsb2JJdGVtLnBhdGgsIGJsb2JJdGVtLm9mZnNldCwgYmxvYkl0ZW0ubGVuZ3RoLCBibG9iSXRl
bS5leHBlY3RlZE1vZGlmaWNhdGlvblRpbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQot
ICAgICAgICB9Ci0gICAgICAgIGZvcm1EYXRhID0gbmV3Rm9ybURhdGEucmVsZWFzZSgpOwotICAg
ICAgICBjb3VudCA9IGZvcm1EYXRhLT5lbGVtZW50cygpLnNpemUoKTsKLSAgICB9Ci0jZW5kaWYK
LQotICAgIC8vIFByZWNvbXB1dGUgdGhlIGNvbnRlbnQgbGVuZ3RoIHNvIE5TVVJMQ29ubmVjdGlv
biBkb2Vzbid0IHVzZSBjaHVua2VkIG1vZGUuCi0gICAgbG9uZyBsb25nIGxlbmd0aCA9IDA7Ci0g
ICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgICAgIGNvbnN0IEZv
cm1EYXRhRWxlbWVudCYgZWxlbWVudCA9IGZvcm1EYXRhLT5lbGVtZW50cygpW2ldOwotICAgICAg
ICBpZiAoZWxlbWVudC5tX3R5cGUgPT0gRm9ybURhdGFFbGVtZW50OjpkYXRhKQotICAgICAgICAg
ICAgbGVuZ3RoICs9IGVsZW1lbnQubV9kYXRhLnNpemUoKTsKLSAgICAgICAgZWxzZSB7Ci0jaWYg
RU5BQkxFKEJMT0IpCi0gICAgICAgICAgICAvLyBJZiB3ZSdyZSBzZW5kaW5nIHRoZSBmaWxlIHJh
bmdlLCB1c2UgdGhlIGV4aXN0aW5nIHJhbmdlIGxlbmd0aCBmb3Igbm93LiBXZSB3aWxsIGRldGVj
dCBpZiB0aGUgZmlsZSBoYXMgYmVlbiBjaGFuZ2VkIHJpZ2h0IGJlZm9yZSB3ZSByZWFkIHRoZSBm
aWxlIGFuZCBhYm9ydCB0aGUgb3BlcmF0aW9uIGlmIG5lY2Vzc2FyeS4KLSAgICAgICAgICAgIGlm
IChlbGVtZW50Lm1fZmlsZUxlbmd0aCAhPSBCbG9iRGF0YUl0ZW06OnRvRW5kT2ZGaWxlKSB7Ci0g
ICAgICAgICAgICAgICAgbGVuZ3RoICs9IGVsZW1lbnQubV9maWxlTGVuZ3RoOwotICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICBsb25n
IGxvbmcgZmlsZVNpemU7Ci0gICAgICAgICAgICBpZiAoZ2V0RmlsZVNpemUoZWxlbWVudC5tX3No
b3VsZEdlbmVyYXRlRmlsZSA/IGVsZW1lbnQubV9nZW5lcmF0ZWRGaWxlbmFtZSA6IGVsZW1lbnQu
bV9maWxlbmFtZSwgZmlsZVNpemUpKQotICAgICAgICAgICAgICAgIGxlbmd0aCArPSBmaWxlU2l6
ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFNldCB0aGUgbGVuZ3RoLgotICAgIFtyZXF1
ZXN0IHNldFZhbHVlOltOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiJWxsZCIsIGxlbmd0aF0g
Zm9ySFRUUEhlYWRlckZpZWxkOkAiQ29udGVudC1MZW5ndGgiXTsKLQotICAgIC8vIENyZWF0ZSBh
bmQgc2V0IHRoZSBzdHJlYW0uCi0KLSAgICAvLyBQYXNzIHRoZSBsZW5ndGggYWxvbmcgd2l0aCB0
aGUgZm9ybURhdGEgc28gaXQgZG9lcyBub3QgaGF2ZSB0byBiZSByZWNvbXB1dGVkLgotICAgIEZv
cm1Db250ZXh0IGZvcm1Db250ZXh0ID0geyBmb3JtRGF0YS5yZWxlYXNlKCksIGxlbmd0aCB9Owot
Ci0gICAgUmV0YWluUHRyPENGUmVhZFN0cmVhbVJlZj4gc3RyZWFtKEFkb3B0Q0YsIHdrQ3JlYXRl
Q3VzdG9tQ0ZSZWFkU3RyZWFtKGZvcm1DcmVhdGUsIGZvcm1GaW5hbGl6ZSwKLSAgICAgICAgZm9y
bU9wZW4sIGZvcm1SZWFkLCBmb3JtQ2FuUmVhZCwgZm9ybUNsb3NlLCBmb3JtU2NoZWR1bGUsIGZv
cm1VbnNjaGVkdWxlLAotICAgICAgICAmZm9ybUNvbnRleHQpKTsKLSAgICBbcmVxdWVzdCBzZXRI
VFRQQm9keVN0cmVhbTooTlNJbnB1dFN0cmVhbSAqKXN0cmVhbS5nZXQoKV07CisgICAgc2V0SFRU
UEJvZHkoY29uc3RfY2FzdDxDRk11dGFibGVVUkxSZXF1ZXN0UmVmPihbcmVxdWVzdCBfQ0ZVUkxS
ZXF1ZXN0XSksIHBycEZvcm1EYXRhKTsKIH0KIAotRm9ybURhdGEqIGh0dHBCb2R5RnJvbVN0cmVh
bShOU0lucHV0U3RyZWFtKiBzdHJlYW0pCitGb3JtRGF0YSogaHR0cEJvZHlGcm9tU3RyZWFtKE5T
SW5wdXRTdHJlYW0gKnN0cmVhbSkKIHsKLSAgICBNdXRleExvY2tlciBsb2NrZXIoc3RyZWFtRmll
bGRzTWFwTXV0ZXgoKSk7Ci0gICAgRm9ybVN0cmVhbUZpZWxkcyogZm9ybVN0cmVhbSA9IHN0cmVh
bUZpZWxkc01hcCgpLmdldChyZWludGVycHJldF9jYXN0PENGUmVhZFN0cmVhbVJlZj4oc3RyZWFt
KSk7Ci0gICAgaWYgKCFmb3JtU3RyZWFtKQotICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4g
Zm9ybVN0cmVhbS0+Zm9ybURhdGEuZ2V0KCk7CisgICAgcmV0dXJuIGh0dHBCb2R5RnJvbVN0cmVh
bShyZWludGVycHJldF9jYXN0PENGUmVhZFN0cmVhbVJlZj4oc3RyZWFtKSk7CiB9CiAKIH0gLy8g
bmFtZXNwYWNlIFdlYkNvcmUK
</data>
<flag name="commit-queue"
          id="138342"
          type_id="3"
          status="-"
          setter="buildbot"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>134351</attachid>
            <date>2012-03-28 11:31:29 -0700</date>
            <delta_ts>2012-03-28 12:21:23 -0700</delta_ts>
            <desc>build fix attempt</desc>
            <filename>FormDataStream.txt</filename>
            <type>text/plain</type>
            <size>41204</size>
            <attacher name="Alexey Proskuryakov">ap</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDExMjMyMCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI2IEBACisyMDEyLTAzLTI3ICBBbGV4ZXkg
UHJvc2t1cnlha292ICA8YXBAYXBwbGUuY29tPgorCisgICAgICAgIFtXaW5dIFNvbWUgQmxvYiB0
ZXN0cyBjcmFzaCBpbiBDRk5ldHdvcmsgaW4gYWR2YW5jZUN1cnJlbnRTdHJlYW0oRm9ybVN0cmVh
bUZpZWxkcyopCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD04MjM4NgorICAgICAgICA8cmRhcjovL3Byb2JsZW0vMTExMjE1MDE+CisKKyAgICAgICAgUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQ292ZXJlZCBieSBleGlzdGluZyB0
ZXN0cy4KKworICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvY2YvRm9ybURhdGFTdHJlYW1DRk5l
dC5jcHA6CisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jZi9Gb3JtRGF0YVN0cmVhbUNGTmV0
Lmg6CisgICAgICAgIE1vdmVkIGxvdyBsZXZlbCBpbXBsZW1lbnRhdGlvbiBmcm9tIEZvcm1EYXRh
U3RyZWFtTWFjLCBhbmQgZXhwb3NlZCBhbiBhZGRpdGlvbmFsIGZ1bmN0aW9uCisgICAgICAgIHRv
IGltcGxlbWVudCBGb3VuZGF0aW9uLWJhc2VkIEFQSSBvbiB0b3Agb2YgdGhpcy4KKworICAgICAg
ICAqIHBsYXRmb3JtL25ldHdvcmsvbWFjL0Zvcm1EYXRhU3RyZWFtTWFjLmg6CisgICAgICAgICog
cGxhdGZvcm0vbmV0d29yay9tYWMvRm9ybURhdGFTdHJlYW1NYWMubW06CisgICAgICAgIFJlbHkg
b24gdG9sbC1mcmVlIGJyaWRnaW5nIGFuZCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIHRvIG1ha2Ug
dGhpcyB3b3JrIHdpdGhvdXQgZHVwbGljYXRpbmcKKyAgICAgICAgY29kZS4KKyAgICAgICAgTm90
ZSB0aGF0IGh0dHBCb2R5RnJvbVN0cmVhbSBpcyBjb25mdXNpbmcgLSBJIGRvbid0IHNlZSBob3cg
aXQgY2FuIHdvcmsgd2hlbiBzZW5kaW5nIHNlcmlhbGl6ZWQKKyAgICAgICAgcmVxdWVzdHMgYWNy
b3NzIHByb2Nlc3MgYm91bmRhcnkuIFdlIHByb2JhYmx5IG9ubHkgZ2V0IGF3YXkgd2l0aCB0aGlz
IGJlY2F1c2Ugd2UgZG9uJ3QgYXR0ZW1wdAorICAgICAgICB0byBzZW5kIHJlcXVlc3RzIHRvIFVJ
IHByb2Nlc3Mgb25jZSB0aGV5IGFscmVhZHkgaGF2ZSBzdHJlYW1zIGFzc29jaWF0ZWQgd2l0aCB0
aGVtLgorCiAyMDEyLTAzLTI2ICBBZGFtIEtsZWluICA8YWRhbWtAY2hyb21pdW0ub3JnPgogCiAg
ICAgICAgIEFsd2F5cyBzZXQgVjggd3JhcHBlcnMgdmlhIFY4RE9NV3JhcHBlcjo6c2V0SlNXcmFw
cGVyRm9yKiBpbnN0ZWFkIG9mIFdlYWtSZWZlcmVuY2VNYXA6OnNldCgpCkluZGV4OiBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2NmL0Zvcm1EYXRhU3RyZWFtQ0ZOZXQuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY2YvRm9ybURhdGFTdHJl
YW1DRk5ldC5jcHAJKHJldmlzaW9uIDExMjE2NikKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L25ldHdvcmsvY2YvRm9ybURhdGFTdHJlYW1DRk5ldC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEs
NSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA3IEFwcGxlIElu
Yy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIw
MDcsIDIwMTIgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucwpAQCAtMjYsOTkgKzI2LDQ2NCBAQAogICogVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICAqLwog
Ci0vKiBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgQmVja3kgV2lsbHJpY2gsIGFkZGl0aW9uYWwgY29k
ZSBieSBEYXJpbiBBZGxlciAqLwotCiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiRm9y
bURhdGFTdHJlYW1DRk5ldC5oIgogCi0jaWYgVVNFKENGTkVUV09SSykKLQorI2luY2x1ZGUgIkJs
b2JSZWdpc3RyeUltcGwuaCIKICNpbmNsdWRlICJGaWxlU3lzdGVtLmgiCiAjaW5jbHVkZSAiRm9y
bURhdGEuaCIKLSNpbmNsdWRlIDxDRk5ldHdvcmsvQ0ZVUkxSZXF1ZXN0UHJpdi5oPgorI2luY2x1
ZGUgIlNjaGVkdWxlUGFpci5oIgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8c3lz
L3R5cGVzLmg+CiAjaW5jbHVkZSA8d3RmL0Fzc2VydGlvbnMuaD4KICNpbmNsdWRlIDx3dGYvSGFz
aE1hcC5oPgorI2luY2x1ZGUgPHd0Zi9NYWluVGhyZWFkLmg+CiAjaW5jbHVkZSA8d3RmL1JldGFp
blB0ci5oPgotI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KKyNpbmNsdWRlIDx3dGYvU3Rk
TGliRXh0cmFzLmg+CisjaW5jbHVkZSA8d3RmL1RocmVhZGluZy5oPgorCisjaWYgUExBVEZPUk0o
SU9TKQorI2luY2x1ZGUgPE1hY0Vycm9ycy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxDb3JlU2Vydmlj
ZXMvQ29yZVNlcnZpY2VzLmg+CisjZW5kaWYKIAogI2lmIFBMQVRGT1JNKE1BQykKLSNpbmNsdWRl
ICJXZWJDb3JlU3lzdGVtSW50ZXJmYWNlLmgiCi0jZWxpZiBQTEFURk9STShXSU4pCi0jaW5jbHVk
ZSA8V2ViS2l0U3lzdGVtSW50ZXJmYWNlL1dlYktpdFN5c3RlbUludGVyZmFjZS5oPgorZXh0ZXJu
ICJDIiB2b2lkIENGVVJMUmVxdWVzdFNldEhUVFBSZXF1ZXN0Qm9keShDRk11dGFibGVVUkxSZXF1
ZXN0UmVmIG11dGFibGVIVFRQUmVxdWVzdCwgQ0ZEYXRhUmVmIGh0dHBCb2R5KTsKK2V4dGVybiAi
QyIgdm9pZCBDRlVSTFJlcXVlc3RTZXRIVFRQSGVhZGVyRmllbGRWYWx1ZShDRk11dGFibGVVUkxS
ZXF1ZXN0UmVmIG11dGFibGVIVFRQUmVxdWVzdCwgQ0ZTdHJpbmdSZWYgaHR0cEhlYWRlckZpZWxk
LCBDRlN0cmluZ1JlZiBodHRwSGVhZGVyRmllbGRWYWx1ZSk7CitleHRlcm4gIkMiIHZvaWQgQ0ZV
UkxSZXF1ZXN0U2V0SFRUUFJlcXVlc3RCb2R5U3RyZWFtKENGTXV0YWJsZVVSTFJlcXVlc3RSZWYg
cmVxLCBDRlJlYWRTdHJlYW1SZWYgYm9keVN0cmVhbSk7CitleHRlcm4gIkMiIENGUmVhZFN0cmVh
bVJlZiBDRlVSTFJlcXVlc3RDb3B5SFRUUFJlcXVlc3RCb2R5U3RyZWFtKENGVVJMUmVxdWVzdFJl
ZiByZXF1ZXN0KTsKKyNlbHNlCisjaW5jbHVkZSA8Q0ZOZXR3b3JrL0NGTmV0d29yay5oPgogI2Vu
ZGlmCiAKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDRkluZGV4IHZlcnNpb247IC8qID09IDEgKi8K
KyAgICB2b2lkICooKmNyZWF0ZSkoQ0ZSZWFkU3RyZWFtUmVmIHN0cmVhbSwgdm9pZCAqaW5mbyk7
CisgICAgdm9pZCAoKmZpbmFsaXplKShDRlJlYWRTdHJlYW1SZWYgc3RyZWFtLCB2b2lkICppbmZv
KTsKKyAgICBDRlN0cmluZ1JlZiAoKmNvcHlEZXNjcmlwdGlvbikoQ0ZSZWFkU3RyZWFtUmVmIHN0
cmVhbSwgdm9pZCAqaW5mbyk7CisgICAgQm9vbGVhbiAoKm9wZW4pKENGUmVhZFN0cmVhbVJlZiBz
dHJlYW0sIENGU3RyZWFtRXJyb3IgKmVycm9yLCBCb29sZWFuICpvcGVuQ29tcGxldGUsIHZvaWQg
KmluZm8pOworICAgIEJvb2xlYW4gKCpvcGVuQ29tcGxldGVkKShDRlJlYWRTdHJlYW1SZWYgc3Ry
ZWFtLCBDRlN0cmVhbUVycm9yICplcnJvciwgdm9pZCAqaW5mbyk7CisgICAgQ0ZJbmRleCAoKnJl
YWQpKENGUmVhZFN0cmVhbVJlZiBzdHJlYW0sIFVJbnQ4ICpidWZmZXIsIENGSW5kZXggYnVmZmVy
TGVuZ3RoLCBDRlN0cmVhbUVycm9yICplcnJvciwgQm9vbGVhbiAqYXRFT0YsIHZvaWQgKmluZm8p
OworICAgIGNvbnN0IFVJbnQ4ICooKmdldEJ1ZmZlcikoQ0ZSZWFkU3RyZWFtUmVmIHN0cmVhbSwg
Q0ZJbmRleCBtYXhCeXRlc1RvUmVhZCwgQ0ZJbmRleCAqbnVtQnl0ZXNSZWFkLCBDRlN0cmVhbUVy
cm9yICplcnJvciwgQm9vbGVhbiAqYXRFT0YsIHZvaWQgKmluZm8pOworICAgIEJvb2xlYW4gKCpj
YW5SZWFkKShDRlJlYWRTdHJlYW1SZWYgc3RyZWFtLCB2b2lkICppbmZvKTsKKyAgICB2b2lkICgq
Y2xvc2UpKENGUmVhZFN0cmVhbVJlZiBzdHJlYW0sIHZvaWQgKmluZm8pOworICAgIENGVHlwZVJl
ZiAoKmNvcHlQcm9wZXJ0eSkoQ0ZSZWFkU3RyZWFtUmVmIHN0cmVhbSwgQ0ZTdHJpbmdSZWYgcHJv
cGVydHlOYW1lLCB2b2lkICppbmZvKTsKKyAgICBCb29sZWFuICgqc2V0UHJvcGVydHkpKENGUmVh
ZFN0cmVhbVJlZiBzdHJlYW0sIENGU3RyaW5nUmVmIHByb3BlcnR5TmFtZSwgQ0ZUeXBlUmVmIHBy
b3BlcnR5VmFsdWUsIHZvaWQgKmluZm8pOworICAgIHZvaWQgKCpyZXF1ZXN0RXZlbnRzKShDRlJl
YWRTdHJlYW1SZWYgc3RyZWFtLCBDRk9wdGlvbkZsYWdzIHN0cmVhbUV2ZW50cywgdm9pZCAqaW5m
byk7CisgICAgdm9pZCAoKnNjaGVkdWxlKShDRlJlYWRTdHJlYW1SZWYgc3RyZWFtLCBDRlJ1bkxv
b3BSZWYgcnVuTG9vcCwgQ0ZTdHJpbmdSZWYgcnVuTG9vcE1vZGUsIHZvaWQgKmluZm8pOworICAg
IHZvaWQgKCp1bnNjaGVkdWxlKShDRlJlYWRTdHJlYW1SZWYgc3RyZWFtLCBDRlJ1bkxvb3BSZWYg
cnVuTG9vcCwgQ0ZTdHJpbmdSZWYgcnVuTG9vcE1vZGUsIHZvaWQgKmluZm8pOworfSBDRlJlYWRT
dHJlYW1DYWxsQmFja3NWMTsKKworI2lmIFBMQVRGT1JNKFdJTikKKyNkZWZpbmUgRVhURVJOIGV4
dGVybiAiQyIgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjZWxzZQorI2RlZmluZSBFWFRFUk4gZXh0
ZXJuICJDIgorI2VuZGlmCisKK0VYVEVSTiB2b2lkIENGUmVhZFN0cmVhbVNpZ25hbEV2ZW50KENG
UmVhZFN0cmVhbVJlZiBzdHJlYW0sIENGU3RyZWFtRXZlbnRUeXBlIGV2ZW50LCBjb25zdCB2b2lk
ICplcnJvcik7CitFWFRFUk4gQ0ZSZWFkU3RyZWFtUmVmIENGUmVhZFN0cmVhbUNyZWF0ZShDRkFs
bG9jYXRvclJlZiBhbGxvYywgY29uc3Qgdm9pZCAqY2FsbGJhY2tzLCB2b2lkICppbmZvKTsKKwog
bmFtZXNwYWNlIFdlYkNvcmUgewogCi12b2lkIHNldEhUVFBCb2R5KENGTXV0YWJsZVVSTFJlcXVl
c3RSZWYgcmVxdWVzdCwgUGFzc1JlZlB0cjxGb3JtRGF0YT4gZm9ybURhdGEpCitzdGF0aWMgTXV0
ZXgmIHN0cmVhbUZpZWxkc01hcE11dGV4KCkKIHsKLSAgICBpZiAoIWZvcm1EYXRhKSB7Ci0gICAg
ICAgIHdrQ0ZVUkxSZXF1ZXN0U2V0SFRUUFJlcXVlc3RCb2R5UGFydHMocmVxdWVzdCwgMCk7Ci0g
ICAgICAgIHJldHVybjsKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKE11dGV4LCBzdGF0aWNNdXRl
eCwgKCkpOworICAgIHJldHVybiBzdGF0aWNNdXRleDsKK30KKworc3RhdGljIHZvaWQgZm9ybUV2
ZW50Q2FsbGJhY2soQ0ZSZWFkU3RyZWFtUmVmIHN0cmVhbSwgQ0ZTdHJlYW1FdmVudFR5cGUgdHlw
ZSwgdm9pZCogY29udGV4dCk7CisKK3N0cnVjdCBGb3JtQ29udGV4dCB7CisgICAgUmVmUHRyPEZv
cm1EYXRhPiBmb3JtRGF0YTsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgc3RyZWFtTGVuZ3RoOwor
fTsKKworc3RydWN0IEZvcm1TdHJlYW1GaWVsZHMgeworICAgIFJlZlB0cjxGb3JtRGF0YT4gZm9y
bURhdGE7CisgICAgU2NoZWR1bGVQYWlySGFzaFNldCBzY2hlZHVsZWRSdW5Mb29wUGFpcnM7Cisg
ICAgVmVjdG9yPEZvcm1EYXRhRWxlbWVudD4gcmVtYWluaW5nRWxlbWVudHM7IC8vIGluIHJldmVy
c2Ugb3JkZXIKKyAgICBDRlJlYWRTdHJlYW1SZWYgY3VycmVudFN0cmVhbTsKKyNpZiBFTkFCTEUo
QkxPQikKKyAgICBsb25nIGxvbmcgY3VycmVudFN0cmVhbVJhbmdlTGVuZ3RoOworI2VuZGlmCisg
ICAgY2hhciogY3VycmVudERhdGE7CisgICAgQ0ZSZWFkU3RyZWFtUmVmIGZvcm1TdHJlYW07Cisg
ICAgdW5zaWduZWQgbG9uZyBsb25nIHN0cmVhbUxlbmd0aDsKKyAgICB1bnNpZ25lZCBsb25nIGxv
bmcgYnl0ZXNTZW50OworfTsKKwordHlwZWRlZiBIYXNoTWFwPENGUmVhZFN0cmVhbVJlZiwgRm9y
bVN0cmVhbUZpZWxkcyo+IFN0cmVhbUZpZWxkc01hcDsKK3N0YXRpYyBTdHJlYW1GaWVsZHNNYXAm
IHN0cmVhbUZpZWxkc01hcCgpCit7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChTdHJlYW1GaWVs
ZHNNYXAsIHN0cmVhbUZpZWxkc01hcCwgKCkpOworICAgIHJldHVybiBzdHJlYW1GaWVsZHNNYXA7
Cit9CisKK3N0YXRpYyB2b2lkIGNsb3NlQ3VycmVudFN0cmVhbShGb3JtU3RyZWFtRmllbGRzICpm
b3JtKQoreworICAgIGlmIChmb3JtLT5jdXJyZW50U3RyZWFtKSB7CisgICAgICAgIENGUmVhZFN0
cmVhbUNsb3NlKGZvcm0tPmN1cnJlbnRTdHJlYW0pOworICAgICAgICBDRlJlYWRTdHJlYW1TZXRD
bGllbnQoZm9ybS0+Y3VycmVudFN0cmVhbSwga0NGU3RyZWFtRXZlbnROb25lLCBOVUxMLCBOVUxM
KTsKKyAgICAgICAgQ0ZSZWxlYXNlKGZvcm0tPmN1cnJlbnRTdHJlYW0pOworICAgICAgICBmb3Jt
LT5jdXJyZW50U3RyZWFtID0gTlVMTDsKKyNpZiBFTkFCTEUoQkxPQikKKyAgICAgICAgZm9ybS0+
Y3VycmVudFN0cmVhbVJhbmdlTGVuZ3RoID0gQmxvYkRhdGFJdGVtOjp0b0VuZE9mRmlsZTsKKyNl
bmRpZgogICAgIH0KKyAgICBpZiAoZm9ybS0+Y3VycmVudERhdGEpIHsKKyAgICAgICAgZmFzdEZy
ZWUoZm9ybS0+Y3VycmVudERhdGEpOworICAgICAgICBmb3JtLT5jdXJyZW50RGF0YSA9IDA7Cisg
ICAgfQorfQogCi0gICAgc2l6ZV90IGNvdW50ID0gZm9ybURhdGEtPmVsZW1lbnRzKCkuc2l6ZSgp
OworLy8gUmV0dXJuIGZhbHNlIGlmIHdlIGNhbm5vdCBhZHZhbmNlIHRoZSBzdHJlYW0uIEN1cnJl
bnRseSB0aGUgb25seSBwb3NzaWJsZSBmYWlsdXJlIGlzIHRoYXQgdGhlIHVuZGVybHlpbmcgZmls
ZSBoYXMgYmVlbiByZW1vdmVkIG9yIGNoYW5nZWQgc2luY2UgRmlsZS5zbGljZS4KK3N0YXRpYyBi
b29sIGFkdmFuY2VDdXJyZW50U3RyZWFtKEZvcm1TdHJlYW1GaWVsZHMqIGZvcm0pCit7CisgICAg
Y2xvc2VDdXJyZW50U3RyZWFtKGZvcm0pOworCisgICAgaWYgKGZvcm0tPnJlbWFpbmluZ0VsZW1l
bnRzLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBDcmVhdGUgdGhl
IG5ldyBzdHJlYW0uCisgICAgRm9ybURhdGFFbGVtZW50JiBuZXh0SW5wdXQgPSBmb3JtLT5yZW1h
aW5pbmdFbGVtZW50cy5sYXN0KCk7CisKKyAgICBpZiAobmV4dElucHV0Lm1fdHlwZSA9PSBGb3Jt
RGF0YUVsZW1lbnQ6OmRhdGEpIHsKKyAgICAgICAgc2l6ZV90IHNpemUgPSBuZXh0SW5wdXQubV9k
YXRhLnNpemUoKTsKKyAgICAgICAgY2hhciogZGF0YSA9IG5leHRJbnB1dC5tX2RhdGEucmVsZWFz
ZUJ1ZmZlcigpOworICAgICAgICBmb3JtLT5jdXJyZW50U3RyZWFtID0gQ0ZSZWFkU3RyZWFtQ3Jl
YXRlV2l0aEJ5dGVzTm9Db3B5KDAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVUludDgqPihkYXRh
KSwgc2l6ZSwga0NGQWxsb2NhdG9yTnVsbCk7CisgICAgICAgIGZvcm0tPmN1cnJlbnREYXRhID0g
ZGF0YTsKKyAgICB9IGVsc2UgeworI2lmIEVOQUJMRShCTE9CKQorICAgICAgICAvLyBDaGVjayBp
ZiB0aGUgZmlsZSBoYXMgYmVlbiBjaGFuZ2VkIG9yIG5vdCBpZiByZXF1aXJlZC4KKyAgICAgICAg
aWYgKG5leHRJbnB1dC5tX2V4cGVjdGVkRmlsZU1vZGlmaWNhdGlvblRpbWUgIT0gQmxvYkRhdGFJ
dGVtOjpkb05vdENoZWNrRmlsZUNoYW5nZSkgeworICAgICAgICAgICAgdGltZV90IGZpbGVNb2Rp
ZmljYXRpb25UaW1lOworICAgICAgICAgICAgaWYgKCFnZXRGaWxlTW9kaWZpY2F0aW9uVGltZShu
ZXh0SW5wdXQubV9maWxlbmFtZSwgZmlsZU1vZGlmaWNhdGlvblRpbWUpIHx8IGZpbGVNb2RpZmlj
YXRpb25UaW1lICE9IHN0YXRpY19jYXN0PHRpbWVfdD4obmV4dElucHV0Lm1fZXhwZWN0ZWRGaWxl
TW9kaWZpY2F0aW9uVGltZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAg
ICB9CisjZW5kaWYKKyAgICAgICAgY29uc3QgU3RyaW5nJiBwYXRoID0gbmV4dElucHV0Lm1fc2hv
dWxkR2VuZXJhdGVGaWxlID8gbmV4dElucHV0Lm1fZ2VuZXJhdGVkRmlsZW5hbWUgOiBuZXh0SW5w
dXQubV9maWxlbmFtZTsKKyAgICAgICAgZm9ybS0+Y3VycmVudFN0cmVhbSA9IENGUmVhZFN0cmVh
bUNyZWF0ZVdpdGhGaWxlKDAsIHBhdGhBc1VSTChwYXRoKS5nZXQoKSk7CisgICAgICAgIGlmICgh
Zm9ybS0+Y3VycmVudFN0cmVhbSkgeworICAgICAgICAgICAgLy8gVGhlIGZpbGUgbXVzdCBoYXZl
IGJlZW4gcmVtb3ZlZCBvciBiZWNvbWUgdW5yZWFkYWJsZS4KKyAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgICAgfQorI2lmIEVOQUJMRShCTE9CKQorICAgICAgICBpZiAobmV4dElucHV0
Lm1fZmlsZVN0YXJ0ID4gMCkgeworICAgICAgICAgICAgUmV0YWluUHRyPENGTnVtYmVyUmVmPiBw
b3NpdGlvbihBZG9wdENGLCBDRk51bWJlckNyZWF0ZSgwLCBrQ0ZOdW1iZXJMb25nTG9uZ1R5cGUs
ICZuZXh0SW5wdXQubV9maWxlU3RhcnQpKTsKKyAgICAgICAgICAgIENGUmVhZFN0cmVhbVNldFBy
b3BlcnR5KGZvcm0tPmN1cnJlbnRTdHJlYW0sIGtDRlN0cmVhbVByb3BlcnR5RmlsZUN1cnJlbnRP
ZmZzZXQsIHBvc2l0aW9uLmdldCgpKTsKKyAgICAgICAgfQorICAgICAgICBmb3JtLT5jdXJyZW50
U3RyZWFtUmFuZ2VMZW5ndGggPSBuZXh0SW5wdXQubV9maWxlTGVuZ3RoOworI2VuZGlmCisgICAg
fQorICAgIGZvcm0tPnJlbWFpbmluZ0VsZW1lbnRzLnJlbW92ZUxhc3QoKTsKKworICAgIC8vIFNl
dCB1cCB0aGUgY2FsbGJhY2suCisgICAgQ0ZTdHJlYW1DbGllbnRDb250ZXh0IGNvbnRleHQgPSB7
IDAsIGZvcm0sIE5VTEwsIE5VTEwsIE5VTEwgfTsKKyAgICBDRlJlYWRTdHJlYW1TZXRDbGllbnQo
Zm9ybS0+Y3VycmVudFN0cmVhbSwga0NGU3RyZWFtRXZlbnRIYXNCeXRlc0F2YWlsYWJsZSB8IGtD
RlN0cmVhbUV2ZW50RXJyb3JPY2N1cnJlZCB8IGtDRlN0cmVhbUV2ZW50RW5kRW5jb3VudGVyZWQs
CisgICAgICAgIGZvcm1FdmVudENhbGxiYWNrLCAmY29udGV4dCk7CisKKyAgICAvLyBTY2hlZHVs
ZSB3aXRoIHRoZSBjdXJyZW50IHNldCBvZiBydW4gbG9vcHMuCisgICAgU2NoZWR1bGVQYWlySGFz
aFNldDo6aXRlcmF0b3IgZW5kID0gZm9ybS0+c2NoZWR1bGVkUnVuTG9vcFBhaXJzLmVuZCgpOwor
ICAgIGZvciAoU2NoZWR1bGVQYWlySGFzaFNldDo6aXRlcmF0b3IgaXQgPSBmb3JtLT5zY2hlZHVs
ZWRSdW5Mb29wUGFpcnMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KQorICAgICAgICBDRlJlYWRT
dHJlYW1TY2hlZHVsZVdpdGhSdW5Mb29wKGZvcm0tPmN1cnJlbnRTdHJlYW0sICgqaXQpLT5ydW5M
b29wKCksICgqaXQpLT5tb2RlKCkpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBi
b29sIG9wZW5OZXh0U3RyZWFtKEZvcm1TdHJlYW1GaWVsZHMqIGZvcm0pCit7CisgICAgLy8gU2tp
cCBvdmVyIGFueSBzdHJlYW1zIHdlIGNhbid0IG9wZW4uCisgICAgaWYgKCFhZHZhbmNlQ3VycmVu
dFN0cmVhbShmb3JtKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHdoaWxlIChmb3JtLT5j
dXJyZW50U3RyZWFtICYmICFDRlJlYWRTdHJlYW1PcGVuKGZvcm0tPmN1cnJlbnRTdHJlYW0pKSB7
CisgICAgICAgIGlmICghYWR2YW5jZUN1cnJlbnRTdHJlYW0oZm9ybSkpCisgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCog
Zm9ybUNyZWF0ZShDRlJlYWRTdHJlYW1SZWYgc3RyZWFtLCB2b2lkKiBjb250ZXh0KQoreworICAg
IEZvcm1Db250ZXh0KiBmb3JtQ29udGV4dCA9IHN0YXRpY19jYXN0PEZvcm1Db250ZXh0Kj4oY29u
dGV4dCk7CisKKyAgICBGb3JtU3RyZWFtRmllbGRzKiBuZXdJbmZvID0gbmV3IEZvcm1TdHJlYW1G
aWVsZHM7CisgICAgbmV3SW5mby0+Zm9ybURhdGEgPSBmb3JtQ29udGV4dC0+Zm9ybURhdGEucmVs
ZWFzZSgpOworICAgIG5ld0luZm8tPmN1cnJlbnRTdHJlYW0gPSBOVUxMOworI2lmIEVOQUJMRShC
TE9CKQorICAgIG5ld0luZm8tPmN1cnJlbnRTdHJlYW1SYW5nZUxlbmd0aCA9IEJsb2JEYXRhSXRl
bTo6dG9FbmRPZkZpbGU7CisjZW5kaWYKKyAgICBuZXdJbmZvLT5jdXJyZW50RGF0YSA9IDA7Cisg
ICAgbmV3SW5mby0+Zm9ybVN0cmVhbSA9IHN0cmVhbTsgLy8gRG9uJ3QgcmV0YWluLiBUaGF0IHdv
dWxkIGNyZWF0ZSBhIHJlZmVyZW5jZSBjeWNsZS4KKyAgICBuZXdJbmZvLT5zdHJlYW1MZW5ndGgg
PSBmb3JtQ29udGV4dC0+c3RyZWFtTGVuZ3RoOworICAgIG5ld0luZm8tPmJ5dGVzU2VudCA9IDA7
CisKKyAgICAvLyBBcHBlbmQgaW4gcmV2ZXJzZSBvcmRlciBzaW5jZSB3ZSByZW1vdmUgZWxlbWVu
dHMgZnJvbSB0aGUgZW5kLgorICAgIHNpemVfdCBzaXplID0gbmV3SW5mby0+Zm9ybURhdGEtPmVs
ZW1lbnRzKCkuc2l6ZSgpOworICAgIG5ld0luZm8tPnJlbWFpbmluZ0VsZW1lbnRzLnJlc2VydmVJ
bml0aWFsQ2FwYWNpdHkoc2l6ZSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyAr
K2kpCisgICAgICAgIG5ld0luZm8tPnJlbWFpbmluZ0VsZW1lbnRzLmFwcGVuZChuZXdJbmZvLT5m
b3JtRGF0YS0+ZWxlbWVudHMoKVtzaXplIC0gaSAtIDFdKTsKKworICAgIE11dGV4TG9ja2VyIGxv
Y2tlcihzdHJlYW1GaWVsZHNNYXBNdXRleCgpKTsKKyAgICBBU1NFUlQoIXN0cmVhbUZpZWxkc01h
cCgpLmNvbnRhaW5zKHN0cmVhbSkpOworICAgIHN0cmVhbUZpZWxkc01hcCgpLmFkZChzdHJlYW0s
IG5ld0luZm8pOworCisgICAgcmV0dXJuIG5ld0luZm87Cit9CisKK3N0YXRpYyB2b2lkIGZvcm1G
aW5pc2hGaW5hbGl6YXRpb25Pbk1haW5UaHJlYWQodm9pZCogY29udGV4dCkKK3sKKyAgICBPd25Q
dHI8Rm9ybVN0cmVhbUZpZWxkcz4gZm9ybSA9IGFkb3B0UHRyKHN0YXRpY19jYXN0PEZvcm1TdHJl
YW1GaWVsZHMqPihjb250ZXh0KSk7CisKKyAgICBjbG9zZUN1cnJlbnRTdHJlYW0oZm9ybS5nZXQo
KSk7Cit9CisKK3N0YXRpYyB2b2lkIGZvcm1GaW5hbGl6ZShDRlJlYWRTdHJlYW1SZWYgc3RyZWFt
LCB2b2lkKiBjb250ZXh0KQoreworICAgIEZvcm1TdHJlYW1GaWVsZHMqIGZvcm0gPSBzdGF0aWNf
Y2FzdDxGb3JtU3RyZWFtRmllbGRzKj4oY29udGV4dCk7CisKKyAgICBNdXRleExvY2tlciBsb2Nr
ZXIoc3RyZWFtRmllbGRzTWFwTXV0ZXgoKSk7CisKKyAgICBBU1NFUlQoZm9ybS0+Zm9ybVN0cmVh
bSA9PSBzdHJlYW0pOworICAgIEFTU0VSVChzdHJlYW1GaWVsZHNNYXAoKS5nZXQoc3RyZWFtKSA9
PSBjb250ZXh0KTsKKworICAgIC8vIERvIHRoaXMgcmlnaHQgYXdheSBiZWNhdXNlIHRoZSBDRlJl
YWRTdHJlYW1SZWYgaXMgYmVpbmcgZGVhbGxvY2F0ZWQuCisgICAgLy8gV2UgY2FuJ3Qgd2FpdCB0
byByZW1vdmUgdGhpcyBmcm9tIHRoZSBtYXAgdW50aWwgd2UgZmluaXNoIGZpbmFsaXppbmcKKyAg
ICAvLyBvbiB0aGUgbWFpbiB0aHJlYWQgYmVjYXVzZSBpbiB0aGVvcnkgdGhlIGZyZWVkIG1lbW9y
eSBjb3VsZCBiZSByZXVzZWQKKyAgICAvLyBmb3IgYSBuZXcgQ0ZSZWFkU3RyZWFtIGJlZm9yZSB0
aGF0IHJ1bnMuCisgICAgc3RyZWFtRmllbGRzTWFwKCkucmVtb3ZlKHN0cmVhbSk7CisKKyAgICBj
YWxsT25NYWluVGhyZWFkKGZvcm1GaW5pc2hGaW5hbGl6YXRpb25Pbk1haW5UaHJlYWQsIGZvcm0p
OworfQorCitzdGF0aWMgQm9vbGVhbiBmb3JtT3BlbihDRlJlYWRTdHJlYW1SZWYsIENGU3RyZWFt
RXJyb3IqIGVycm9yLCBCb29sZWFuKiBvcGVuQ29tcGxldGUsIHZvaWQqIGNvbnRleHQpCit7Cisg
ICAgRm9ybVN0cmVhbUZpZWxkcyogZm9ybSA9IHN0YXRpY19jYXN0PEZvcm1TdHJlYW1GaWVsZHMq
Pihjb250ZXh0KTsKKworICAgIGJvb2wgb3BlbmVkID0gb3Blbk5leHRTdHJlYW0oZm9ybSk7CisK
KyAgICAqb3BlbkNvbXBsZXRlID0gb3BlbmVkOworICAgIGVycm9yLT5lcnJvciA9IG9wZW5lZCA/
IDAgOiBmbmZFcnI7CisgICAgcmV0dXJuIG9wZW5lZDsKK30KKworc3RhdGljIENGSW5kZXggZm9y
bVJlYWQoQ0ZSZWFkU3RyZWFtUmVmLCBVSW50OCogYnVmZmVyLCBDRkluZGV4IGJ1ZmZlckxlbmd0
aCwgQ0ZTdHJlYW1FcnJvciogZXJyb3IsIEJvb2xlYW4qIGF0RU9GLCB2b2lkKiBjb250ZXh0KQor
eworICAgIEZvcm1TdHJlYW1GaWVsZHMqIGZvcm0gPSBzdGF0aWNfY2FzdDxGb3JtU3RyZWFtRmll
bGRzKj4oY29udGV4dCk7CisKKyAgICB3aGlsZSAoZm9ybS0+Y3VycmVudFN0cmVhbSkgeworICAg
ICAgICBDRkluZGV4IGJ5dGVzVG9SZWFkID0gYnVmZmVyTGVuZ3RoOworI2lmIEVOQUJMRShCTE9C
KQorICAgICAgICBpZiAoZm9ybS0+Y3VycmVudFN0cmVhbVJhbmdlTGVuZ3RoICE9IEJsb2JEYXRh
SXRlbTo6dG9FbmRPZkZpbGUgJiYgZm9ybS0+Y3VycmVudFN0cmVhbVJhbmdlTGVuZ3RoIDwgYnl0
ZXNUb1JlYWQpCisgICAgICAgICAgICBieXRlc1RvUmVhZCA9IHN0YXRpY19jYXN0PENGSW5kZXg+
KGZvcm0tPmN1cnJlbnRTdHJlYW1SYW5nZUxlbmd0aCk7CisjZW5kaWYKKyAgICAgICAgQ0ZJbmRl
eCBieXRlc1JlYWQgPSBDRlJlYWRTdHJlYW1SZWFkKGZvcm0tPmN1cnJlbnRTdHJlYW0sIGJ1ZmZl
ciwgYnl0ZXNUb1JlYWQpOworICAgICAgICBpZiAoYnl0ZXNSZWFkIDwgMCkgeworICAgICAgICAg
ICAgKmVycm9yID0gQ0ZSZWFkU3RyZWFtR2V0RXJyb3IoZm9ybS0+Y3VycmVudFN0cmVhbSk7Cisg
ICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ5dGVzUmVhZCA+
IDApIHsKKyAgICAgICAgICAgIGVycm9yLT5lcnJvciA9IDA7CisgICAgICAgICAgICAqYXRFT0Yg
PSBGQUxTRTsKKyAgICAgICAgICAgIGZvcm0tPmJ5dGVzU2VudCArPSBieXRlc1JlYWQ7CisjaWYg
RU5BQkxFKEJMT0IpCisgICAgICAgICAgICBpZiAoZm9ybS0+Y3VycmVudFN0cmVhbVJhbmdlTGVu
Z3RoICE9IEJsb2JEYXRhSXRlbTo6dG9FbmRPZkZpbGUpCisgICAgICAgICAgICAgICAgZm9ybS0+
Y3VycmVudFN0cmVhbVJhbmdlTGVuZ3RoIC09IGJ5dGVzUmVhZDsKKyNlbmRpZgorCisgICAgICAg
ICAgICByZXR1cm4gYnl0ZXNSZWFkOworICAgICAgICB9CisgICAgICAgIG9wZW5OZXh0U3RyZWFt
KGZvcm0pOworICAgIH0KKworICAgIGVycm9yLT5lcnJvciA9IDA7CisgICAgKmF0RU9GID0gVFJV
RTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIEJvb2xlYW4gZm9ybUNhblJlYWQoQ0ZSZWFk
U3RyZWFtUmVmIHN0cmVhbSwgdm9pZCogY29udGV4dCkKK3sKKyAgICBGb3JtU3RyZWFtRmllbGRz
KiBmb3JtID0gc3RhdGljX2Nhc3Q8Rm9ybVN0cmVhbUZpZWxkcyo+KGNvbnRleHQpOworCisgICAg
d2hpbGUgKGZvcm0tPmN1cnJlbnRTdHJlYW0gJiYgQ0ZSZWFkU3RyZWFtR2V0U3RhdHVzKGZvcm0t
PmN1cnJlbnRTdHJlYW0pID09IGtDRlN0cmVhbVN0YXR1c0F0RW5kKSB7CisgICAgICAgIG9wZW5O
ZXh0U3RyZWFtKGZvcm0pOworICAgIH0KKyAgICBpZiAoIWZvcm0tPmN1cnJlbnRTdHJlYW0pIHsK
KyAgICAgICAgQ0ZSZWFkU3RyZWFtU2lnbmFsRXZlbnQoc3RyZWFtLCBrQ0ZTdHJlYW1FdmVudEVu
ZEVuY291bnRlcmVkLCAwKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICByZXR1
cm4gQ0ZSZWFkU3RyZWFtSGFzQnl0ZXNBdmFpbGFibGUoZm9ybS0+Y3VycmVudFN0cmVhbSk7Cit9
CisKK3N0YXRpYyB2b2lkIGZvcm1DbG9zZShDRlJlYWRTdHJlYW1SZWYsIHZvaWQqIGNvbnRleHQp
Cit7CisgICAgRm9ybVN0cmVhbUZpZWxkcyogZm9ybSA9IHN0YXRpY19jYXN0PEZvcm1TdHJlYW1G
aWVsZHMqPihjb250ZXh0KTsKKworICAgIGNsb3NlQ3VycmVudFN0cmVhbShmb3JtKTsKK30KKwor
c3RhdGljIHZvaWQgZm9ybVNjaGVkdWxlKENGUmVhZFN0cmVhbVJlZiwgQ0ZSdW5Mb29wUmVmIHJ1
bkxvb3AsIENGU3RyaW5nUmVmIHJ1bkxvb3BNb2RlLCB2b2lkKiBjb250ZXh0KQoreworICAgIEZv
cm1TdHJlYW1GaWVsZHMqIGZvcm0gPSBzdGF0aWNfY2FzdDxGb3JtU3RyZWFtRmllbGRzKj4oY29u
dGV4dCk7CisKKyAgICBpZiAoZm9ybS0+Y3VycmVudFN0cmVhbSkKKyAgICAgICAgQ0ZSZWFkU3Ry
ZWFtU2NoZWR1bGVXaXRoUnVuTG9vcChmb3JtLT5jdXJyZW50U3RyZWFtLCBydW5Mb29wLCBydW5M
b29wTW9kZSk7CisgICAgZm9ybS0+c2NoZWR1bGVkUnVuTG9vcFBhaXJzLmFkZChTY2hlZHVsZVBh
aXI6OmNyZWF0ZShydW5Mb29wLCBydW5Mb29wTW9kZSkpOworfQorCitzdGF0aWMgdm9pZCBmb3Jt
VW5zY2hlZHVsZShDRlJlYWRTdHJlYW1SZWYsIENGUnVuTG9vcFJlZiBydW5Mb29wLCBDRlN0cmlu
Z1JlZiBydW5Mb29wTW9kZSwgdm9pZCogY29udGV4dCkKK3sKKyAgICBGb3JtU3RyZWFtRmllbGRz
KiBmb3JtID0gc3RhdGljX2Nhc3Q8Rm9ybVN0cmVhbUZpZWxkcyo+KGNvbnRleHQpOworCisgICAg
aWYgKGZvcm0tPmN1cnJlbnRTdHJlYW0pCisgICAgICAgIENGUmVhZFN0cmVhbVVuc2NoZWR1bGVG
cm9tUnVuTG9vcChmb3JtLT5jdXJyZW50U3RyZWFtLCBydW5Mb29wLCBydW5Mb29wTW9kZSk7Cisg
ICAgZm9ybS0+c2NoZWR1bGVkUnVuTG9vcFBhaXJzLnJlbW92ZShTY2hlZHVsZVBhaXI6OmNyZWF0
ZShydW5Mb29wLCBydW5Mb29wTW9kZSkpOworfQorCitzdGF0aWMgdm9pZCBmb3JtRXZlbnRDYWxs
YmFjayhDRlJlYWRTdHJlYW1SZWYgc3RyZWFtLCBDRlN0cmVhbUV2ZW50VHlwZSB0eXBlLCB2b2lk
KiBjb250ZXh0KQoreworICAgIEZvcm1TdHJlYW1GaWVsZHMqIGZvcm0gPSBzdGF0aWNfY2FzdDxG
b3JtU3RyZWFtRmllbGRzKj4oY29udGV4dCk7CiAKLSAgICBpZiAoY291bnQgPT0gMCkKKyAgICBz
d2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIGtDRlN0cmVhbUV2ZW50SGFzQnl0ZXNBdmFpbGFibGU6
CisgICAgICAgIENGUmVhZFN0cmVhbVNpZ25hbEV2ZW50KGZvcm0tPmZvcm1TdHJlYW0sIGtDRlN0
cmVhbUV2ZW50SGFzQnl0ZXNBdmFpbGFibGUsIDApOworICAgICAgICBicmVhazsKKyAgICBjYXNl
IGtDRlN0cmVhbUV2ZW50RXJyb3JPY2N1cnJlZDogeworICAgICAgICBDRlN0cmVhbUVycm9yIHJl
YWRTdHJlYW1FcnJvciA9IENGUmVhZFN0cmVhbUdldEVycm9yKHN0cmVhbSk7CisgICAgICAgIENG
UmVhZFN0cmVhbVNpZ25hbEV2ZW50KGZvcm0tPmZvcm1TdHJlYW0sIGtDRlN0cmVhbUV2ZW50RXJy
b3JPY2N1cnJlZCwgJnJlYWRTdHJlYW1FcnJvcik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAg
ICBjYXNlIGtDRlN0cmVhbUV2ZW50RW5kRW5jb3VudGVyZWQ6CisgICAgICAgIG9wZW5OZXh0U3Ry
ZWFtKGZvcm0pOworICAgICAgICBpZiAoIWZvcm0tPmN1cnJlbnRTdHJlYW0pCisgICAgICAgICAg
ICBDRlJlYWRTdHJlYW1TaWduYWxFdmVudChmb3JtLT5mb3JtU3RyZWFtLCBrQ0ZTdHJlYW1FdmVu
dEVuZEVuY291bnRlcmVkLCAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBrQ0ZTdHJlYW1F
dmVudE5vbmU6CisgICAgICAgIExPR19FUlJPUigidW5leHBlY3RlZCBrQ0ZTdHJlYW1FdmVudE5v
bmUiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBrQ0ZTdHJlYW1FdmVudE9wZW5Db21wbGV0
ZWQ6CisgICAgICAgIExPR19FUlJPUigidW5leHBlY3RlZCBrQ0ZTdHJlYW1FdmVudE9wZW5Db21w
bGV0ZWQiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBrQ0ZTdHJlYW1FdmVudENhbkFjY2Vw
dEJ5dGVzOgorICAgICAgICBMT0dfRVJST1IoInVuZXhwZWN0ZWQga0NGU3RyZWFtRXZlbnRDYW5B
Y2NlcHRCeXRlcyIpOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgc2V0SFRUUEJv
ZHkoQ0ZNdXRhYmxlVVJMUmVxdWVzdFJlZiByZXF1ZXN0LCBQYXNzUmVmUHRyPEZvcm1EYXRhPiBw
cnBGb3JtRGF0YSkKK3sKKyAgICBSZWZQdHI8Rm9ybURhdGE+IGZvcm1EYXRhID0gcHJwRm9ybURh
dGE7CisKKyAgICBpZiAoIWZvcm1EYXRhKQogICAgICAgICByZXR1cm47CisgICAgICAgIAorICAg
IHNpemVfdCBjb3VudCA9IGZvcm1EYXRhLT5lbGVtZW50cygpLnNpemUoKTsKIAogICAgIC8vIEhh
bmRsZSB0aGUgY29tbW9uIHNwZWNpYWwgY2FzZSBvZiBvbmUgcGllY2Ugb2YgZm9ybSBkYXRhLCB3
aXRoIG5vIGZpbGVzLgotICAgIGlmIChjb3VudCA9PSAxKSB7CisgICAgaWYgKGNvdW50ID09IDEg
JiYgIWZvcm1EYXRhLT5hbHdheXNTdHJlYW0oKSkgewogICAgICAgICBjb25zdCBGb3JtRGF0YUVs
ZW1lbnQmIGVsZW1lbnQgPSBmb3JtRGF0YS0+ZWxlbWVudHMoKVswXTsKICAgICAgICAgaWYgKGVs
ZW1lbnQubV90eXBlID09IEZvcm1EYXRhRWxlbWVudDo6ZGF0YSkgewotICAgICAgICAgICAgQ0ZE
YXRhUmVmIGRhdGEgPSBDRkRhdGFDcmVhdGUoMCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBVSW50
OCAqPihlbGVtZW50Lm1fZGF0YS5kYXRhKCkpLCBlbGVtZW50Lm1fZGF0YS5zaXplKCkpOwotICAg
ICAgICAgICAgQ0ZVUkxSZXF1ZXN0U2V0SFRUUFJlcXVlc3RCb2R5KHJlcXVlc3QsIGRhdGEpOwot
ICAgICAgICAgICAgQ0ZSZWxlYXNlKGRhdGEpOworICAgICAgICAgICAgUmV0YWluUHRyPENGRGF0
YVJlZj4gZGF0YSA9IGFkb3B0Q0YoQ0ZEYXRhQ3JlYXRlKDAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29u
c3QgVUludDggKj4oZWxlbWVudC5tX2RhdGEuZGF0YSgpKSwgZWxlbWVudC5tX2RhdGEuc2l6ZSgp
KSk7CisgICAgICAgICAgICBDRlVSTFJlcXVlc3RTZXRIVFRQUmVxdWVzdEJvZHkocmVxdWVzdCwg
ZGF0YS5nZXQoKSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICB9CiAKLSAg
ICBSZXRhaW5QdHI8Q0ZNdXRhYmxlQXJyYXlSZWY+IGFycmF5KEFkb3B0Q0YsIENGQXJyYXlDcmVh
dGVNdXRhYmxlKDAsIDAsICZrQ0ZUeXBlQXJyYXlDYWxsQmFja3MpKTsKKyNpZiBFTkFCTEUoQkxP
QikKKyAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhIGJsb2IgaW4gdGhlIGZvcm0gZGF0YS4KKyAg
ICBib29sIGhhc0Jsb2IgPSBmYWxzZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50
OyArK2kpIHsKKyAgICAgICAgY29uc3QgRm9ybURhdGFFbGVtZW50JiBlbGVtZW50ID0gZm9ybURh
dGEtPmVsZW1lbnRzKClbaV07CisgICAgICAgIGlmIChlbGVtZW50Lm1fdHlwZSA9PSBGb3JtRGF0
YUVsZW1lbnQ6OmVuY29kZWRCbG9iKSB7CisgICAgICAgICAgICBoYXNCbG9iID0gdHJ1ZTsKKyAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSWYgeWVzLCB3ZSBo
YXZlIHRvIHJlc29sdmUgYWxsIHRoZSBibG9iIHJlZmVyZW5jZXMgYW5kIHJlZ2VuZXJhdGUgdGhl
IGZvcm0gZGF0YSB3aXRoIG9ubHkgZGF0YSBhbmQgZmlsZSB0eXBlcy4KKyAgICBpZiAoaGFzQmxv
YikgeworICAgICAgICBSZWZQdHI8Rm9ybURhdGE+IG5ld0Zvcm1EYXRhID0gRm9ybURhdGE6OmNy
ZWF0ZSgpOworICAgICAgICBuZXdGb3JtRGF0YS0+c2V0QWx3YXlzU3RyZWFtKGZvcm1EYXRhLT5h
bHdheXNTdHJlYW0oKSk7CisgICAgICAgIG5ld0Zvcm1EYXRhLT5zZXRJZGVudGlmaWVyKGZvcm1E
YXRhLT5pZGVudGlmaWVyKCkpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50
OyArK2kpIHsKKyAgICAgICAgICAgIGNvbnN0IEZvcm1EYXRhRWxlbWVudCYgZWxlbWVudCA9IGZv
cm1EYXRhLT5lbGVtZW50cygpW2ldOworICAgICAgICAgICAgaWYgKGVsZW1lbnQubV90eXBlID09
IEZvcm1EYXRhRWxlbWVudDo6ZGF0YSkKKyAgICAgICAgICAgICAgICBuZXdGb3JtRGF0YS0+YXBw
ZW5kRGF0YShlbGVtZW50Lm1fZGF0YS5kYXRhKCksIGVsZW1lbnQubV9kYXRhLnNpemUoKSk7Cisg
ICAgICAgICAgICBlbHNlIGlmIChlbGVtZW50Lm1fdHlwZSA9PSBGb3JtRGF0YUVsZW1lbnQ6OmVu
Y29kZWRGaWxlKQorICAgICAgICAgICAgICAgIG5ld0Zvcm1EYXRhLT5hcHBlbmRGaWxlKGVsZW1l
bnQubV9maWxlbmFtZSwgZWxlbWVudC5tX3Nob3VsZEdlbmVyYXRlRmlsZSk7CisgICAgICAgICAg
ICBlbHNlIHsKKyAgICAgICAgICAgICAgICBBU1NFUlQoZWxlbWVudC5tX3R5cGUgPT0gRm9ybURh
dGFFbGVtZW50OjplbmNvZGVkQmxvYik7CisgICAgICAgICAgICAgICAgUmVmUHRyPEJsb2JTdG9y
YWdlRGF0YT4gYmxvYkRhdGEgPSBzdGF0aWNfY2FzdDxCbG9iUmVnaXN0cnlJbXBsJj4oYmxvYlJl
Z2lzdHJ5KCkpLmdldEJsb2JEYXRhRnJvbVVSTChLVVJMKFBhcnNlZFVSTFN0cmluZywgZWxlbWVu
dC5tX2Jsb2JVUkwpKTsKKyAgICAgICAgICAgICAgICBpZiAoYmxvYkRhdGEpIHsKKyAgICAgICAg
ICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBibG9iRGF0YS0+aXRlbXMoKS5zaXpl
KCk7ICsraikgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmxvYkRhdGFJdGVtJiBi
bG9iSXRlbSA9IGJsb2JEYXRhLT5pdGVtcygpW2pdOworICAgICAgICAgICAgICAgICAgICAgICAg
aWYgKGJsb2JJdGVtLnR5cGUgPT0gQmxvYkRhdGFJdGVtOjpEYXRhKSB7CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgbmV3Rm9ybURhdGEtPmFwcGVuZERhdGEoYmxvYkl0ZW0uZGF0YS0+ZGF0
YSgpICsgc3RhdGljX2Nhc3Q8aW50PihibG9iSXRlbS5vZmZzZXQpLCBzdGF0aWNfY2FzdDxpbnQ+
KGJsb2JJdGVtLmxlbmd0aCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBBU1NFUlQoYmxvYkl0ZW0udHlwZSA9PSBCbG9iRGF0
YUl0ZW06OkZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Zvcm1EYXRhLT5h
cHBlbmRGaWxlUmFuZ2UoYmxvYkl0ZW0ucGF0aCwgYmxvYkl0ZW0ub2Zmc2V0LCBibG9iSXRlbS5s
ZW5ndGgsIGJsb2JJdGVtLmV4cGVjdGVkTW9kaWZpY2F0aW9uVGltZSk7CisgICAgICAgICAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9ybURhdGEgPSBuZXdGb3JtRGF0YS5y
ZWxlYXNlKCk7CisgICAgICAgIGNvdW50ID0gZm9ybURhdGEtPmVsZW1lbnRzKCkuc2l6ZSgpOwor
ICAgIH0KKyNlbmRpZgogCisgICAgLy8gUHJlY29tcHV0ZSB0aGUgY29udGVudCBsZW5ndGggc28g
TlNVUkxDb25uZWN0aW9uIGRvZXNuJ3QgdXNlIGNodW5rZWQgbW9kZS4KKyAgICBsb25nIGxvbmcg
bGVuZ3RoID0gMDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKICAg
ICAgICAgY29uc3QgRm9ybURhdGFFbGVtZW50JiBlbGVtZW50ID0gZm9ybURhdGEtPmVsZW1lbnRz
KClbaV07Ci0gICAgICAgIGlmIChlbGVtZW50Lm1fdHlwZSA9PSBGb3JtRGF0YUVsZW1lbnQ6OmRh
dGEpIHsKLSAgICAgICAgICAgIFJldGFpblB0cjxDRkRhdGFSZWY+IGRhdGEoQWRvcHRDRiwgQ0ZE
YXRhQ3JlYXRlKDAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVUludDgqPihlbGVtZW50Lm1fZGF0
YS5kYXRhKCkpLCBlbGVtZW50Lm1fZGF0YS5zaXplKCkpKTsKLSAgICAgICAgICAgIENGQXJyYXlB
cHBlbmRWYWx1ZShhcnJheS5nZXQoKSwgZGF0YS5nZXQoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0g
ICAgICAgICAgICBSZXRhaW5QdHI8Q0ZTdHJpbmdSZWY+IGZpbGVuYW1lKEFkb3B0Q0YsIGVsZW1l
bnQubV9maWxlbmFtZS5jcmVhdGVDRlN0cmluZygpKTsKLSAgICAgICAgICAgIENGQXJyYXlBcHBl
bmRWYWx1ZShhcnJheS5nZXQoKSwgZmlsZW5hbWUuZ2V0KCkpOworICAgICAgICBpZiAoZWxlbWVu
dC5tX3R5cGUgPT0gRm9ybURhdGFFbGVtZW50OjpkYXRhKQorICAgICAgICAgICAgbGVuZ3RoICs9
IGVsZW1lbnQubV9kYXRhLnNpemUoKTsKKyAgICAgICAgZWxzZSB7CisjaWYgRU5BQkxFKEJMT0Ip
CisgICAgICAgICAgICAvLyBJZiB3ZSdyZSBzZW5kaW5nIHRoZSBmaWxlIHJhbmdlLCB1c2UgdGhl
IGV4aXN0aW5nIHJhbmdlIGxlbmd0aCBmb3Igbm93LiBXZSB3aWxsIGRldGVjdCBpZiB0aGUgZmls
ZSBoYXMgYmVlbiBjaGFuZ2VkIHJpZ2h0IGJlZm9yZSB3ZSByZWFkIHRoZSBmaWxlIGFuZCBhYm9y
dCB0aGUgb3BlcmF0aW9uIGlmIG5lY2Vzc2FyeS4KKyAgICAgICAgICAgIGlmIChlbGVtZW50Lm1f
ZmlsZUxlbmd0aCAhPSBCbG9iRGF0YUl0ZW06OnRvRW5kT2ZGaWxlKSB7CisgICAgICAgICAgICAg
ICAgbGVuZ3RoICs9IGVsZW1lbnQubV9maWxlTGVuZ3RoOworICAgICAgICAgICAgICAgIGNvbnRp
bnVlOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBsb25nIGxvbmcgZmlsZVNp
emU7CisgICAgICAgICAgICBpZiAoZ2V0RmlsZVNpemUoZWxlbWVudC5tX3Nob3VsZEdlbmVyYXRl
RmlsZSA/IGVsZW1lbnQubV9nZW5lcmF0ZWRGaWxlbmFtZSA6IGVsZW1lbnQubV9maWxlbmFtZSwg
ZmlsZVNpemUpKQorICAgICAgICAgICAgICAgIGxlbmd0aCArPSBmaWxlU2l6ZTsKICAgICAgICAg
fQogICAgIH0KIAotICAgIHdrQ0ZVUkxSZXF1ZXN0U2V0SFRUUFJlcXVlc3RCb2R5UGFydHMocmVx
dWVzdCwgYXJyYXkuZ2V0KCkpOworICAgIC8vIFNldCB0aGUgbGVuZ3RoLgorICAgIFJldGFpblB0
cjxDRlN0cmluZ1JlZj4gbGVuZ3RoU3RyaW5nID0gYWRvcHRDRihDRlN0cmluZ0NyZWF0ZVdpdGhG
b3JtYXQoMCwgMCwgQ0ZTVFIoIiVsbGQiKSwgbGVuZ3RoKSk7CisgICAgQ0ZVUkxSZXF1ZXN0U2V0
SFRUUEhlYWRlckZpZWxkVmFsdWUocmVxdWVzdCwgQ0ZTVFIoIkNvbnRlbnQtTGVuZ3RoIiksIGxl
bmd0aFN0cmluZy5nZXQoKSk7CisKKyAgICAvLyBDcmVhdGUgYW5kIHNldCB0aGUgc3RyZWFtLgor
CisgICAgLy8gUGFzcyB0aGUgbGVuZ3RoIGFsb25nIHdpdGggdGhlIGZvcm1EYXRhIHNvIGl0IGRv
ZXMgbm90IGhhdmUgdG8gYmUgcmVjb21wdXRlZC4KKyAgICBGb3JtQ29udGV4dCBmb3JtQ29udGV4
dCA9IHsgZm9ybURhdGEucmVsZWFzZSgpLCBsZW5ndGggfTsKKworICAgIENGUmVhZFN0cmVhbUNh
bGxCYWNrc1YxIGNhbGxCYWNrcyA9IHsgMSwgZm9ybUNyZWF0ZSwgZm9ybUZpbmFsaXplLCAwLCBm
b3JtT3BlbiwgMCwgZm9ybVJlYWQsIDAsIGZvcm1DYW5SZWFkLCBmb3JtQ2xvc2UsIDAsIDAsIDAs
IGZvcm1TY2hlZHVsZSwgZm9ybVVuc2NoZWR1bGUKKyAgICB9OworICAgIFJldGFpblB0cjxDRlJl
YWRTdHJlYW1SZWY+IHN0cmVhbSA9IGFkb3B0Q0YoQ0ZSZWFkU3RyZWFtQ3JlYXRlKDAsIHN0YXRp
Y19jYXN0PGNvbnN0IHZvaWQqPigmY2FsbEJhY2tzKSwgJmZvcm1Db250ZXh0KSk7CisKKyAgICBD
RlVSTFJlcXVlc3RTZXRIVFRQUmVxdWVzdEJvZHlTdHJlYW0ocmVxdWVzdCwgc3RyZWFtLmdldCgp
KTsKIH0KIAotUGFzc1JlZlB0cjxGb3JtRGF0YT4gaHR0cEJvZHlGcm9tUmVxdWVzdChDRlVSTFJl
cXVlc3RSZWYgcmVxdWVzdCkKK0Zvcm1EYXRhKiBodHRwQm9keUZyb21TdHJlYW0oQ0ZSZWFkU3Ry
ZWFtUmVmIHN0cmVhbSkKIHsKLSAgICBSZXRhaW5QdHI8Q0ZEYXRhUmVmPiBib2R5RGF0YShBZG9w
dENGLCBDRlVSTFJlcXVlc3RDb3B5SFRUUFJlcXVlc3RCb2R5KHJlcXVlc3QpKTsKLSAgICBpZiAo
Ym9keURhdGEpCi0gICAgICAgIHJldHVybiBGb3JtRGF0YTo6Y3JlYXRlKENGRGF0YUdldEJ5dGVQ
dHIoYm9keURhdGEuZ2V0KCkpLCBDRkRhdGFHZXRMZW5ndGgoYm9keURhdGEuZ2V0KCkpKTsKLQot
ICAgIFJldGFpblB0cjxDRkFycmF5UmVmPiBib2R5UGFydHMoQWRvcHRDRiwgd2tDRlVSTFJlcXVl
c3RDb3B5SFRUUFJlcXVlc3RCb2R5UGFydHMocmVxdWVzdCkpOwotICAgIGlmIChib2R5UGFydHMp
IHsKLSAgICAgICAgUmVmUHRyPEZvcm1EYXRhPiBmb3JtRGF0YSA9IEZvcm1EYXRhOjpjcmVhdGUo
KTsKLQotICAgICAgICBDRkluZGV4IGNvdW50ID0gQ0ZBcnJheUdldENvdW50KGJvZHlQYXJ0cy5n
ZXQoKSk7Ci0gICAgICAgIGZvciAoQ0ZJbmRleCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAg
ICAgICAgICAgIENGVHlwZVJlZiBib2R5UGFydCA9IENGQXJyYXlHZXRWYWx1ZUF0SW5kZXgoYm9k
eVBhcnRzLmdldCgpLCBpKTsKLSAgICAgICAgICAgIENGVHlwZUlEIHR5cGVJRCA9IENGR2V0VHlw
ZUlEKGJvZHlQYXJ0KTsKLSAgICAgICAgICAgIGlmICh0eXBlSUQgPT0gQ0ZTdHJpbmdHZXRUeXBl
SUQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IChDRlN0cmluZ1JlZili
b2R5UGFydDsKLSAgICAgICAgICAgICAgICBmb3JtRGF0YS0+YXBwZW5kRmlsZShmaWxlbmFtZSk7
Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVJRCA9PSBDRkRhdGFHZXRUeXBlSUQoKSkgewot
ICAgICAgICAgICAgICAgIENGRGF0YVJlZiBkYXRhID0gKENGRGF0YVJlZilib2R5UGFydDsKLSAg
ICAgICAgICAgICAgICBmb3JtRGF0YS0+YXBwZW5kRGF0YShDRkRhdGFHZXRCeXRlUHRyKGRhdGEp
LCBDRkRhdGFHZXRMZW5ndGgoZGF0YSkpOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAg
ICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZv
cm1EYXRhLnJlbGVhc2UoKTsKLSAgICB9CisgICAgaWYgKCFzdHJlYW0pCisgICAgICAgIHJldHVy
biAwOwogCi0gICAgLy8gRklYTUU6IHdoYXQgdG8gZG8gYWJvdXQgYXJiaXRyYXJ5IGJvZHkgc3Ry
ZWFtcz8KLSAgICByZXR1cm4gMDsKKyAgICBNdXRleExvY2tlciBsb2NrZXIoc3RyZWFtRmllbGRz
TWFwTXV0ZXgoKSk7CisgICAgRm9ybVN0cmVhbUZpZWxkcyogZm9ybVN0cmVhbSA9IHN0cmVhbUZp
ZWxkc01hcCgpLmdldChzdHJlYW0pOworICAgIGlmICghZm9ybVN0cmVhbSkKKyAgICAgICAgcmV0
dXJuIDA7CisgICAgcmV0dXJuIGZvcm1TdHJlYW0tPmZvcm1EYXRhLmdldCgpOwogfQogCi19IC8v
IG5hbWVzcGFjZSBXZWJDb3JlCitQYXNzUmVmUHRyPEZvcm1EYXRhPiBodHRwQm9keUZyb21SZXF1
ZXN0KENGVVJMUmVxdWVzdFJlZiByZXF1ZXN0KQoreworICAgIFJldGFpblB0cjxDRlJlYWRTdHJl
YW1SZWY+IGJvZHlTdHJlYW0gPSBhZG9wdENGKENGVVJMUmVxdWVzdENvcHlIVFRQUmVxdWVzdEJv
ZHlTdHJlYW0ocmVxdWVzdCkpOworICAgIHJldHVybiBodHRwQm9keUZyb21TdHJlYW0oYm9keVN0
cmVhbS5nZXQoKSk7Cit9CiAKLSNlbmRpZiAvLyBVU0UoQ0ZORVRXT1JLKQorfSAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jZi9Gb3Jt
RGF0YVN0cmVhbUNGTmV0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
bmV0d29yay9jZi9Gb3JtRGF0YVN0cmVhbUNGTmV0LmgJKHJldmlzaW9uIDExMjE2NikKKysrIFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY2YvRm9ybURhdGFTdHJlYW1DRk5ldC5oCSh3
b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSwg
MjAwNiwgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0
IChDKSAyMDA1LCAyMDA2LCAyMDA3LCAyMDEyIEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTI5LDIwICsyOSwyMCBAQAog
I2lmbmRlZiBGb3JtRGF0YVN0cmVhbUNGTmV0X2gKICNkZWZpbmUgRm9ybURhdGFTdHJlYW1DRk5l
dF9oCiAKLSNpZiBVU0UoQ0ZORVRXT1JLKQotCi0jaW5jbHVkZSA8Q29yZUZvdW5kYXRpb24vQ29y
ZUZvdW5kYXRpb24uaD4KICNpbmNsdWRlIDx3dGYvRm9yd2FyZC5oPgogCiB0eXBlZGVmIHN0cnVj
dCBfQ0ZVUkxSZXF1ZXN0KiBDRk11dGFibGVVUkxSZXF1ZXN0UmVmOwogdHlwZWRlZiBjb25zdCBz
dHJ1Y3QgX0NGVVJMUmVxdWVzdCogQ0ZVUkxSZXF1ZXN0UmVmOwogCiBuYW1lc3BhY2UgV2ViQ29y
ZSB7Ci0gICAgY2xhc3MgRm9ybURhdGE7Ci0gICAgdm9pZCBzZXRIVFRQQm9keShDRk11dGFibGVV
UkxSZXF1ZXN0UmVmLCBQYXNzUmVmUHRyPEZvcm1EYXRhPik7Ci0gICAgUGFzc1JlZlB0cjxGb3Jt
RGF0YT4gaHR0cEJvZHlGcm9tUmVxdWVzdChDRlVSTFJlcXVlc3RSZWYpOwotfQogCi0jZW5kaWYg
Ly8gVVNFKENGTkVUV09SSykKK2NsYXNzIEZvcm1EYXRhOworCit2b2lkIHNldEhUVFBCb2R5KENG
TXV0YWJsZVVSTFJlcXVlc3RSZWYsIFBhc3NSZWZQdHI8Rm9ybURhdGE+KTsKK1Bhc3NSZWZQdHI8
Rm9ybURhdGE+IGh0dHBCb2R5RnJvbVJlcXVlc3QoQ0ZVUkxSZXF1ZXN0UmVmKTsKKworRm9ybURh
dGEqIGh0dHBCb2R5RnJvbVN0cmVhbShDRlJlYWRTdHJlYW1SZWYpOworCit9IC8vIG5hbWVzcGFj
ZSBXZWJDb3JlCiAKICNlbmRpZiAvLyBGb3JtRGF0YVN0cmVhbUNGTmV0X2gKSW5kZXg6IFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvbWFjL0Zvcm1EYXRhU3RyZWFtTWFjLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9tYWMvRm9ybURhdGFTdHJl
YW1NYWMuaAkocmV2aXNpb24gMTEyMTY2KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0
d29yay9tYWMvRm9ybURhdGFTdHJlYW1NYWMuaAkod29ya2luZyBjb3B5KQpAQCAtMzEsOCArMzEs
OSBAQAogCiAjaWYgIVVTRShDRk5FVFdPUkspCiAKLSNpbmNsdWRlICJGb3JtRGF0YS5oIgorI2lu
Y2x1ZGUgPHd0Zi9Gb3J3YXJkLmg+CiAKK0BjbGFzcyBOU0lucHV0U3RyZWFtOwogQGNsYXNzIE5T
TXV0YWJsZVVSTFJlcXVlc3Q7CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKSW5kZXg6IFNvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvbWFjL0Zvcm1EYXRhU3RyZWFtTWFjLm1tCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvbWFjL0Zvcm1EYXRhU3RyZWFt
TWFjLm1tCShyZXZpc2lvbiAxMTIzMDIpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3
b3JrL21hYy9Gb3JtRGF0YVN0cmVhbU1hYy5tbQkod29ya2luZyBjb3B5KQpAQCAtMzEsNDE1ICsz
MSwyNCBAQAogCiAjaWYgIVVTRShDRk5FVFdPUkspCiAKLSNpbXBvcnQgIkJsb2JSZWdpc3RyeUlt
cGwuaCIKLSNpbXBvcnQgIkZpbGVTeXN0ZW0uaCIKICNpbXBvcnQgIkZvcm1EYXRhLmgiCi0jaW1w
b3J0ICJTY2hlZHVsZVBhaXIuaCIKLSNpbXBvcnQgIldlYkNvcmVTeXN0ZW1JbnRlcmZhY2UuaCIK
LSNpbXBvcnQgPHN5cy9zdGF0Lmg+Ci0jaW1wb3J0IDxzeXMvdHlwZXMuaD4KLSNpbXBvcnQgPHd0
Zi9Bc3NlcnRpb25zLmg+Ci0jaW1wb3J0IDx3dGYvTWFpblRocmVhZC5oPgotI2ltcG9ydCA8d3Rm
L1N0ZExpYkV4dHJhcy5oPgotI2ltcG9ydCA8d3RmL1RocmVhZGluZy5oPgorI2ltcG9ydCAiRm9y
bURhdGFTdHJlYW1DRk5ldC5oIgorI2ltcG9ydCA8d3RmL1Bhc3NSZWZQdHIuaD4KIAotI2lmIFBM
QVRGT1JNKElPUykKLSNpbXBvcnQgPE1hY0Vycm9ycy5oPgotI2Vsc2UKLSNpbXBvcnQgPENvcmVT
ZXJ2aWNlcy9Db3JlU2VydmljZXMuaD4KLSNlbmRpZgorQGludGVyZmFjZSBOU1VSTFJlcXVlc3Qg
KFdlYk5TVVJMUmVxdWVzdERldGFpbHMpCistIChDRlVSTFJlcXVlc3RSZWYpX0NGVVJMUmVxdWVz
dDsKK0BlbmQKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1zdGF0aWMgTXV0ZXgmIHN0cmVhbUZp
ZWxkc01hcE11dGV4KCkKLXsKLSAgICBERUZJTkVfU1RBVElDX0xPQ0FMKE11dGV4LCBzdGF0aWNN
dXRleCwgKCkpOwotICAgIHJldHVybiBzdGF0aWNNdXRleDsKLX0KLQotc3RhdGljIHZvaWQgZm9y
bUV2ZW50Q2FsbGJhY2soQ0ZSZWFkU3RyZWFtUmVmIHN0cmVhbSwgQ0ZTdHJlYW1FdmVudFR5cGUg
dHlwZSwgdm9pZCogY29udGV4dCk7Ci0KLXN0cnVjdCBGb3JtQ29udGV4dCB7Ci0gICAgUmVmUHRy
PEZvcm1EYXRhPiBmb3JtRGF0YTsKLSAgICB1bnNpZ25lZCBsb25nIGxvbmcgc3RyZWFtTGVuZ3Ro
OwotfTsKLQotc3RydWN0IEZvcm1TdHJlYW1GaWVsZHMgewotICAgIFJlZlB0cjxGb3JtRGF0YT4g
Zm9ybURhdGE7Ci0gICAgU2NoZWR1bGVQYWlySGFzaFNldCBzY2hlZHVsZWRSdW5Mb29wUGFpcnM7
Ci0gICAgVmVjdG9yPEZvcm1EYXRhRWxlbWVudD4gcmVtYWluaW5nRWxlbWVudHM7IC8vIGluIHJl
dmVyc2Ugb3JkZXIKLSAgICBDRlJlYWRTdHJlYW1SZWYgY3VycmVudFN0cmVhbTsKLSNpZiBFTkFC
TEUoQkxPQikKLSAgICBsb25nIGxvbmcgY3VycmVudFN0cmVhbVJhbmdlTGVuZ3RoOwotI2VuZGlm
Ci0gICAgY2hhciogY3VycmVudERhdGE7Ci0gICAgQ0ZSZWFkU3RyZWFtUmVmIGZvcm1TdHJlYW07
Ci0gICAgdW5zaWduZWQgbG9uZyBsb25nIHN0cmVhbUxlbmd0aDsKLSAgICB1bnNpZ25lZCBsb25n
IGxvbmcgYnl0ZXNTZW50OwotfTsKLQotdHlwZWRlZiBIYXNoTWFwPENGUmVhZFN0cmVhbVJlZiwg
Rm9ybVN0cmVhbUZpZWxkcyo+IFN0cmVhbUZpZWxkc01hcDsKLXN0YXRpYyBTdHJlYW1GaWVsZHNN
YXAmIHN0cmVhbUZpZWxkc01hcCgpCi17Ci0gICAgREVGSU5FX1NUQVRJQ19MT0NBTChTdHJlYW1G
aWVsZHNNYXAsIHN0cmVhbUZpZWxkc01hcCwgKCkpOwotICAgIHJldHVybiBzdHJlYW1GaWVsZHNN
YXA7Ci19Ci0KLXN0YXRpYyB2b2lkIGNsb3NlQ3VycmVudFN0cmVhbShGb3JtU3RyZWFtRmllbGRz
ICpmb3JtKQotewotICAgIGlmIChmb3JtLT5jdXJyZW50U3RyZWFtKSB7Ci0gICAgICAgIENGUmVh
ZFN0cmVhbUNsb3NlKGZvcm0tPmN1cnJlbnRTdHJlYW0pOwotICAgICAgICBDRlJlYWRTdHJlYW1T
ZXRDbGllbnQoZm9ybS0+Y3VycmVudFN0cmVhbSwga0NGU3RyZWFtRXZlbnROb25lLCBOVUxMLCBO
VUxMKTsKLSAgICAgICAgQ0ZSZWxlYXNlKGZvcm0tPmN1cnJlbnRTdHJlYW0pOwotICAgICAgICBm
b3JtLT5jdXJyZW50U3RyZWFtID0gTlVMTDsKLSNpZiBFTkFCTEUoQkxPQikKLSAgICAgICAgZm9y
bS0+Y3VycmVudFN0cmVhbVJhbmdlTGVuZ3RoID0gQmxvYkRhdGFJdGVtOjp0b0VuZE9mRmlsZTsK
LSNlbmRpZgotICAgIH0KLSAgICBpZiAoZm9ybS0+Y3VycmVudERhdGEpIHsKLSAgICAgICAgZmFz
dEZyZWUoZm9ybS0+Y3VycmVudERhdGEpOwotICAgICAgICBmb3JtLT5jdXJyZW50RGF0YSA9IDA7
Ci0gICAgfQotfQotCi0vLyBSZXR1cm4gZmFsc2UgaWYgd2UgY2Fubm90IGFkdmFuY2UgdGhlIHN0
cmVhbS4gQ3VycmVudGx5IHRoZSBvbmx5IHBvc3NpYmxlIGZhaWx1cmUgaXMgdGhhdCB0aGUgdW5k
ZXJseWluZyBmaWxlIGhhcyBiZWVuIHJlbW92ZWQgb3IgY2hhbmdlZCBzaW5jZSBGaWxlLnNsaWNl
Lgotc3RhdGljIGJvb2wgYWR2YW5jZUN1cnJlbnRTdHJlYW0oRm9ybVN0cmVhbUZpZWxkcyogZm9y
bSkKLXsKLSAgICBjbG9zZUN1cnJlbnRTdHJlYW0oZm9ybSk7Ci0KLSAgICBpZiAoZm9ybS0+cmVt
YWluaW5nRWxlbWVudHMuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIC8v
IENyZWF0ZSB0aGUgbmV3IHN0cmVhbS4KLSAgICBGb3JtRGF0YUVsZW1lbnQmIG5leHRJbnB1dCA9
IGZvcm0tPnJlbWFpbmluZ0VsZW1lbnRzLmxhc3QoKTsKLQotICAgIGlmIChuZXh0SW5wdXQubV90
eXBlID09IEZvcm1EYXRhRWxlbWVudDo6ZGF0YSkgewotICAgICAgICBzaXplX3Qgc2l6ZSA9IG5l
eHRJbnB1dC5tX2RhdGEuc2l6ZSgpOwotICAgICAgICBjaGFyKiBkYXRhID0gbmV4dElucHV0Lm1f
ZGF0YS5yZWxlYXNlQnVmZmVyKCk7Ci0gICAgICAgIGZvcm0tPmN1cnJlbnRTdHJlYW0gPSBDRlJl
YWRTdHJlYW1DcmVhdGVXaXRoQnl0ZXNOb0NvcHkoMCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBV
SW50OCo+KGRhdGEpLCBzaXplLCBrQ0ZBbGxvY2F0b3JOdWxsKTsKLSAgICAgICAgZm9ybS0+Y3Vy
cmVudERhdGEgPSBkYXRhOwotICAgIH0gZWxzZSB7Ci0jaWYgRU5BQkxFKEJMT0IpCi0gICAgICAg
IC8vIENoZWNrIGlmIHRoZSBmaWxlIGhhcyBiZWVuIGNoYW5nZWQgb3Igbm90IGlmIHJlcXVpcmVk
LgotICAgICAgICBpZiAobmV4dElucHV0Lm1fZXhwZWN0ZWRGaWxlTW9kaWZpY2F0aW9uVGltZSAh
PSBCbG9iRGF0YUl0ZW06OmRvTm90Q2hlY2tGaWxlQ2hhbmdlKSB7Ci0gICAgICAgICAgICB0aW1l
X3QgZmlsZU1vZGlmaWNhdGlvblRpbWU7Ci0gICAgICAgICAgICBpZiAoIWdldEZpbGVNb2RpZmlj
YXRpb25UaW1lKG5leHRJbnB1dC5tX2ZpbGVuYW1lLCBmaWxlTW9kaWZpY2F0aW9uVGltZSkgfHwg
ZmlsZU1vZGlmaWNhdGlvblRpbWUgIT0gc3RhdGljX2Nhc3Q8dGltZV90PihuZXh0SW5wdXQubV9l
eHBlY3RlZEZpbGVNb2RpZmljYXRpb25UaW1lKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFs
c2U7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgICAgICBjb25zdCBTdHJpbmcmIHBhdGggPSBuZXh0
SW5wdXQubV9zaG91bGRHZW5lcmF0ZUZpbGUgPyBuZXh0SW5wdXQubV9nZW5lcmF0ZWRGaWxlbmFt
ZSA6IG5leHRJbnB1dC5tX2ZpbGVuYW1lOwotICAgICAgICBmb3JtLT5jdXJyZW50U3RyZWFtID0g
Q0ZSZWFkU3RyZWFtQ3JlYXRlV2l0aEZpbGUoMCwgcGF0aEFzVVJMKHBhdGgpLmdldCgpKTsKLSAg
ICAgICAgaWYgKCFmb3JtLT5jdXJyZW50U3RyZWFtKSB7Ci0gICAgICAgICAgICAvLyBUaGUgZmls
ZSBtdXN0IGhhdmUgYmVlbiByZW1vdmVkIG9yIGJlY29tZSB1bnJlYWRhYmxlLgotICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0jaWYgRU5BQkxFKEJMT0IpCi0gICAgICAgIGlm
IChuZXh0SW5wdXQubV9maWxlU3RhcnQgPiAwKSB7Ci0gICAgICAgICAgICBSZXRhaW5QdHI8Q0ZO
dW1iZXJSZWY+IHBvc2l0aW9uKEFkb3B0Q0YsIENGTnVtYmVyQ3JlYXRlKDAsIGtDRk51bWJlckxv
bmdMb25nVHlwZSwgJm5leHRJbnB1dC5tX2ZpbGVTdGFydCkpOwotICAgICAgICAgICAgQ0ZSZWFk
U3RyZWFtU2V0UHJvcGVydHkoZm9ybS0+Y3VycmVudFN0cmVhbSwga0NGU3RyZWFtUHJvcGVydHlG
aWxlQ3VycmVudE9mZnNldCwgcG9zaXRpb24uZ2V0KCkpOwotICAgICAgICB9Ci0gICAgICAgIGZv
cm0tPmN1cnJlbnRTdHJlYW1SYW5nZUxlbmd0aCA9IG5leHRJbnB1dC5tX2ZpbGVMZW5ndGg7Ci0j
ZW5kaWYKLSAgICB9Ci0gICAgZm9ybS0+cmVtYWluaW5nRWxlbWVudHMucmVtb3ZlTGFzdCgpOwot
Ci0gICAgLy8gU2V0IHVwIHRoZSBjYWxsYmFjay4KLSAgICBDRlN0cmVhbUNsaWVudENvbnRleHQg
Y29udGV4dCA9IHsgMCwgZm9ybSwgTlVMTCwgTlVMTCwgTlVMTCB9OwotICAgIENGUmVhZFN0cmVh
bVNldENsaWVudChmb3JtLT5jdXJyZW50U3RyZWFtLCBrQ0ZTdHJlYW1FdmVudEhhc0J5dGVzQXZh
aWxhYmxlIHwga0NGU3RyZWFtRXZlbnRFcnJvck9jY3VycmVkIHwga0NGU3RyZWFtRXZlbnRFbmRF
bmNvdW50ZXJlZCwKLSAgICAgICAgZm9ybUV2ZW50Q2FsbGJhY2ssICZjb250ZXh0KTsKLQotICAg
IC8vIFNjaGVkdWxlIHdpdGggdGhlIGN1cnJlbnQgc2V0IG9mIHJ1biBsb29wcy4KLSAgICBTY2hl
ZHVsZVBhaXJIYXNoU2V0OjppdGVyYXRvciBlbmQgPSBmb3JtLT5zY2hlZHVsZWRSdW5Mb29wUGFp
cnMuZW5kKCk7Ci0gICAgZm9yIChTY2hlZHVsZVBhaXJIYXNoU2V0OjppdGVyYXRvciBpdCA9IGZv
cm0tPnNjaGVkdWxlZFJ1bkxvb3BQYWlycy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpCi0gICAg
ICAgIENGUmVhZFN0cmVhbVNjaGVkdWxlV2l0aFJ1bkxvb3AoZm9ybS0+Y3VycmVudFN0cmVhbSwg
KCppdCktPnJ1bkxvb3AoKSwgKCppdCktPm1vZGUoKSk7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0K
LQotc3RhdGljIGJvb2wgb3Blbk5leHRTdHJlYW0oRm9ybVN0cmVhbUZpZWxkcyogZm9ybSkKLXsK
LSAgICAvLyBTa2lwIG92ZXIgYW55IHN0cmVhbXMgd2UgY2FuJ3Qgb3Blbi4KLSAgICBpZiAoIWFk
dmFuY2VDdXJyZW50U3RyZWFtKGZvcm0pKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgd2hp
bGUgKGZvcm0tPmN1cnJlbnRTdHJlYW0gJiYgIUNGUmVhZFN0cmVhbU9wZW4oZm9ybS0+Y3VycmVu
dFN0cmVhbSkpIHsKLSAgICAgICAgaWYgKCFhZHZhbmNlQ3VycmVudFN0cmVhbShmb3JtKSkKLSAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0
YXRpYyB2b2lkKiBmb3JtQ3JlYXRlKENGUmVhZFN0cmVhbVJlZiBzdHJlYW0sIHZvaWQqIGNvbnRl
eHQpCi17Ci0gICAgRm9ybUNvbnRleHQqIGZvcm1Db250ZXh0ID0gc3RhdGljX2Nhc3Q8Rm9ybUNv
bnRleHQqPihjb250ZXh0KTsKLQotICAgIEZvcm1TdHJlYW1GaWVsZHMqIG5ld0luZm8gPSBuZXcg
Rm9ybVN0cmVhbUZpZWxkczsKLSAgICBuZXdJbmZvLT5mb3JtRGF0YSA9IGZvcm1Db250ZXh0LT5m
b3JtRGF0YS5yZWxlYXNlKCk7Ci0gICAgbmV3SW5mby0+Y3VycmVudFN0cmVhbSA9IE5VTEw7Ci0j
aWYgRU5BQkxFKEJMT0IpCi0gICAgbmV3SW5mby0+Y3VycmVudFN0cmVhbVJhbmdlTGVuZ3RoID0g
QmxvYkRhdGFJdGVtOjp0b0VuZE9mRmlsZTsKLSNlbmRpZgotICAgIG5ld0luZm8tPmN1cnJlbnRE
YXRhID0gMDsKLSAgICBuZXdJbmZvLT5mb3JtU3RyZWFtID0gc3RyZWFtOyAvLyBEb24ndCByZXRh
aW4uIFRoYXQgd291bGQgY3JlYXRlIGEgcmVmZXJlbmNlIGN5Y2xlLgotICAgIG5ld0luZm8tPnN0
cmVhbUxlbmd0aCA9IGZvcm1Db250ZXh0LT5zdHJlYW1MZW5ndGg7Ci0gICAgbmV3SW5mby0+Ynl0
ZXNTZW50ID0gMDsKLQotICAgIC8vIEFwcGVuZCBpbiByZXZlcnNlIG9yZGVyIHNpbmNlIHdlIHJl
bW92ZSBlbGVtZW50cyBmcm9tIHRoZSBlbmQuCi0gICAgc2l6ZV90IHNpemUgPSBuZXdJbmZvLT5m
b3JtRGF0YS0+ZWxlbWVudHMoKS5zaXplKCk7Ci0gICAgbmV3SW5mby0+cmVtYWluaW5nRWxlbWVu
dHMucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShzaXplKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsg
aSA8IHNpemU7ICsraSkKLSAgICAgICAgbmV3SW5mby0+cmVtYWluaW5nRWxlbWVudHMuYXBwZW5k
KG5ld0luZm8tPmZvcm1EYXRhLT5lbGVtZW50cygpW3NpemUgLSBpIC0gMV0pOwotCi0gICAgTXV0
ZXhMb2NrZXIgbG9ja2VyKHN0cmVhbUZpZWxkc01hcE11dGV4KCkpOwotICAgIEFTU0VSVCghc3Ry
ZWFtRmllbGRzTWFwKCkuY29udGFpbnMoc3RyZWFtKSk7Ci0gICAgc3RyZWFtRmllbGRzTWFwKCku
YWRkKHN0cmVhbSwgbmV3SW5mbyk7Ci0KLSAgICByZXR1cm4gbmV3SW5mbzsKLX0KLQotc3RhdGlj
IHZvaWQgZm9ybUZpbmlzaEZpbmFsaXphdGlvbk9uTWFpblRocmVhZCh2b2lkKiBjb250ZXh0KQot
ewotICAgIE93blB0cjxGb3JtU3RyZWFtRmllbGRzPiBmb3JtID0gYWRvcHRQdHIoc3RhdGljX2Nh
c3Q8Rm9ybVN0cmVhbUZpZWxkcyo+KGNvbnRleHQpKTsKLQotICAgIGNsb3NlQ3VycmVudFN0cmVh
bShmb3JtLmdldCgpKTsKLX0KLQotc3RhdGljIHZvaWQgZm9ybUZpbmFsaXplKENGUmVhZFN0cmVh
bVJlZiBzdHJlYW0sIHZvaWQqIGNvbnRleHQpCi17Ci0gICAgRm9ybVN0cmVhbUZpZWxkcyogZm9y
bSA9IHN0YXRpY19jYXN0PEZvcm1TdHJlYW1GaWVsZHMqPihjb250ZXh0KTsKLQotICAgIE11dGV4
TG9ja2VyIGxvY2tlcihzdHJlYW1GaWVsZHNNYXBNdXRleCgpKTsKLQotICAgIEFTU0VSVChmb3Jt
LT5mb3JtU3RyZWFtID09IHN0cmVhbSk7Ci0gICAgQVNTRVJUKHN0cmVhbUZpZWxkc01hcCgpLmdl
dChzdHJlYW0pID09IGNvbnRleHQpOwotCi0gICAgLy8gRG8gdGhpcyByaWdodCBhd2F5IGJlY2F1
c2UgdGhlIENGUmVhZFN0cmVhbVJlZiBpcyBiZWluZyBkZWFsbG9jYXRlZC4KLSAgICAvLyBXZSBj
YW4ndCB3YWl0IHRvIHJlbW92ZSB0aGlzIGZyb20gdGhlIG1hcCB1bnRpbCB3ZSBmaW5pc2ggZmlu
YWxpemluZwotICAgIC8vIG9uIHRoZSBtYWluIHRocmVhZCBiZWNhdXNlIGluIHRoZW9yeSB0aGUg
ZnJlZWQgbWVtb3J5IGNvdWxkIGJlIHJldXNlZAotICAgIC8vIGZvciBhIG5ldyBDRlJlYWRTdHJl
YW0gYmVmb3JlIHRoYXQgcnVucy4KLSAgICBzdHJlYW1GaWVsZHNNYXAoKS5yZW1vdmUoc3RyZWFt
KTsKLQotICAgIGNhbGxPbk1haW5UaHJlYWQoZm9ybUZpbmlzaEZpbmFsaXphdGlvbk9uTWFpblRo
cmVhZCwgZm9ybSk7Ci19Ci0KLXN0YXRpYyBCb29sZWFuIGZvcm1PcGVuKENGUmVhZFN0cmVhbVJl
ZiwgQ0ZTdHJlYW1FcnJvciogZXJyb3IsIEJvb2xlYW4qIG9wZW5Db21wbGV0ZSwgdm9pZCogY29u
dGV4dCkKLXsKLSAgICBGb3JtU3RyZWFtRmllbGRzKiBmb3JtID0gc3RhdGljX2Nhc3Q8Rm9ybVN0
cmVhbUZpZWxkcyo+KGNvbnRleHQpOwotCi0gICAgYm9vbCBvcGVuZWQgPSBvcGVuTmV4dFN0cmVh
bShmb3JtKTsKLQotICAgICpvcGVuQ29tcGxldGUgPSBvcGVuZWQ7Ci0gICAgZXJyb3ItPmVycm9y
ID0gb3BlbmVkID8gMCA6IGZuZkVycjsKLSAgICByZXR1cm4gb3BlbmVkOwotfQotCi1zdGF0aWMg
Q0ZJbmRleCBmb3JtUmVhZChDRlJlYWRTdHJlYW1SZWYsIFVJbnQ4KiBidWZmZXIsIENGSW5kZXgg
YnVmZmVyTGVuZ3RoLCBDRlN0cmVhbUVycm9yKiBlcnJvciwgQm9vbGVhbiogYXRFT0YsIHZvaWQq
IGNvbnRleHQpCi17Ci0gICAgRm9ybVN0cmVhbUZpZWxkcyogZm9ybSA9IHN0YXRpY19jYXN0PEZv
cm1TdHJlYW1GaWVsZHMqPihjb250ZXh0KTsKLQotICAgIHdoaWxlIChmb3JtLT5jdXJyZW50U3Ry
ZWFtKSB7Ci0gICAgICAgIENGSW5kZXggYnl0ZXNUb1JlYWQgPSBidWZmZXJMZW5ndGg7Ci0jaWYg
RU5BQkxFKEJMT0IpCi0gICAgICAgIGlmIChmb3JtLT5jdXJyZW50U3RyZWFtUmFuZ2VMZW5ndGgg
IT0gQmxvYkRhdGFJdGVtOjp0b0VuZE9mRmlsZSAmJiBmb3JtLT5jdXJyZW50U3RyZWFtUmFuZ2VM
ZW5ndGggPCBieXRlc1RvUmVhZCkKLSAgICAgICAgICAgIGJ5dGVzVG9SZWFkID0gc3RhdGljX2Nh
c3Q8Q0ZJbmRleD4oZm9ybS0+Y3VycmVudFN0cmVhbVJhbmdlTGVuZ3RoKTsKLSNlbmRpZgotICAg
ICAgICBDRkluZGV4IGJ5dGVzUmVhZCA9IENGUmVhZFN0cmVhbVJlYWQoZm9ybS0+Y3VycmVudFN0
cmVhbSwgYnVmZmVyLCBieXRlc1RvUmVhZCk7Ci0gICAgICAgIGlmIChieXRlc1JlYWQgPCAwKSB7
Ci0gICAgICAgICAgICAqZXJyb3IgPSBDRlJlYWRTdHJlYW1HZXRFcnJvcihmb3JtLT5jdXJyZW50
U3RyZWFtKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBpZiAo
Ynl0ZXNSZWFkID4gMCkgewotICAgICAgICAgICAgZXJyb3ItPmVycm9yID0gMDsKLSAgICAgICAg
ICAgICphdEVPRiA9IEZBTFNFOwotICAgICAgICAgICAgZm9ybS0+Ynl0ZXNTZW50ICs9IGJ5dGVz
UmVhZDsKLSNpZiBFTkFCTEUoQkxPQikKLSAgICAgICAgICAgIGlmIChmb3JtLT5jdXJyZW50U3Ry
ZWFtUmFuZ2VMZW5ndGggIT0gQmxvYkRhdGFJdGVtOjp0b0VuZE9mRmlsZSkKLSAgICAgICAgICAg
ICAgICBmb3JtLT5jdXJyZW50U3RyZWFtUmFuZ2VMZW5ndGggLT0gYnl0ZXNSZWFkOwotI2VuZGlm
Ci0KLSAgICAgICAgICAgIHJldHVybiBieXRlc1JlYWQ7Ci0gICAgICAgIH0KLSAgICAgICAgb3Bl
bk5leHRTdHJlYW0oZm9ybSk7Ci0gICAgfQotCi0gICAgZXJyb3ItPmVycm9yID0gMDsKLSAgICAq
YXRFT0YgPSBUUlVFOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgQm9vbGVhbiBmb3JtQ2Fu
UmVhZChDRlJlYWRTdHJlYW1SZWYgc3RyZWFtLCB2b2lkKiBjb250ZXh0KQotewotICAgIEZvcm1T
dHJlYW1GaWVsZHMqIGZvcm0gPSBzdGF0aWNfY2FzdDxGb3JtU3RyZWFtRmllbGRzKj4oY29udGV4
dCk7Ci0KLSAgICB3aGlsZSAoZm9ybS0+Y3VycmVudFN0cmVhbSAmJiBDRlJlYWRTdHJlYW1HZXRT
dGF0dXMoZm9ybS0+Y3VycmVudFN0cmVhbSkgPT0ga0NGU3RyZWFtU3RhdHVzQXRFbmQpIHsKLSAg
ICAgICAgb3Blbk5leHRTdHJlYW0oZm9ybSk7Ci0gICAgfQotICAgIGlmICghZm9ybS0+Y3VycmVu
dFN0cmVhbSkgewotICAgICAgICB3a1NpZ25hbENGUmVhZFN0cmVhbUVuZChzdHJlYW0pOwotICAg
ICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiBDRlJlYWRTdHJlYW1IYXNCeXRl
c0F2YWlsYWJsZShmb3JtLT5jdXJyZW50U3RyZWFtKTsKLX0KLQotc3RhdGljIHZvaWQgZm9ybUNs
b3NlKENGUmVhZFN0cmVhbVJlZiwgdm9pZCogY29udGV4dCkKLXsKLSAgICBGb3JtU3RyZWFtRmll
bGRzKiBmb3JtID0gc3RhdGljX2Nhc3Q8Rm9ybVN0cmVhbUZpZWxkcyo+KGNvbnRleHQpOwotCi0g
ICAgY2xvc2VDdXJyZW50U3RyZWFtKGZvcm0pOwotfQotCi1zdGF0aWMgdm9pZCBmb3JtU2NoZWR1
bGUoQ0ZSZWFkU3RyZWFtUmVmLCBDRlJ1bkxvb3BSZWYgcnVuTG9vcCwgQ0ZTdHJpbmdSZWYgcnVu
TG9vcE1vZGUsIHZvaWQqIGNvbnRleHQpCi17Ci0gICAgRm9ybVN0cmVhbUZpZWxkcyogZm9ybSA9
IHN0YXRpY19jYXN0PEZvcm1TdHJlYW1GaWVsZHMqPihjb250ZXh0KTsKLQotICAgIGlmIChmb3Jt
LT5jdXJyZW50U3RyZWFtKQotICAgICAgICBDRlJlYWRTdHJlYW1TY2hlZHVsZVdpdGhSdW5Mb29w
KGZvcm0tPmN1cnJlbnRTdHJlYW0sIHJ1bkxvb3AsIHJ1bkxvb3BNb2RlKTsKLSAgICBmb3JtLT5z
Y2hlZHVsZWRSdW5Mb29wUGFpcnMuYWRkKFNjaGVkdWxlUGFpcjo6Y3JlYXRlKHJ1bkxvb3AsIHJ1
bkxvb3BNb2RlKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZvcm1VbnNjaGVkdWxlKENGUmVhZFN0cmVh
bVJlZiwgQ0ZSdW5Mb29wUmVmIHJ1bkxvb3AsIENGU3RyaW5nUmVmIHJ1bkxvb3BNb2RlLCB2b2lk
KiBjb250ZXh0KQotewotICAgIEZvcm1TdHJlYW1GaWVsZHMqIGZvcm0gPSBzdGF0aWNfY2FzdDxG
b3JtU3RyZWFtRmllbGRzKj4oY29udGV4dCk7Ci0KLSAgICBpZiAoZm9ybS0+Y3VycmVudFN0cmVh
bSkKLSAgICAgICAgQ0ZSZWFkU3RyZWFtVW5zY2hlZHVsZUZyb21SdW5Mb29wKGZvcm0tPmN1cnJl
bnRTdHJlYW0sIHJ1bkxvb3AsIHJ1bkxvb3BNb2RlKTsKLSAgICBmb3JtLT5zY2hlZHVsZWRSdW5M
b29wUGFpcnMucmVtb3ZlKFNjaGVkdWxlUGFpcjo6Y3JlYXRlKHJ1bkxvb3AsIHJ1bkxvb3BNb2Rl
KSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZvcm1FdmVudENhbGxiYWNrKENGUmVhZFN0cmVhbVJlZiBz
dHJlYW0sIENGU3RyZWFtRXZlbnRUeXBlIHR5cGUsIHZvaWQqIGNvbnRleHQpCi17Ci0gICAgRm9y
bVN0cmVhbUZpZWxkcyogZm9ybSA9IHN0YXRpY19jYXN0PEZvcm1TdHJlYW1GaWVsZHMqPihjb250
ZXh0KTsKLQotICAgIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2Uga0NGU3RyZWFtRXZlbnRIYXNC
eXRlc0F2YWlsYWJsZToKLSAgICAgICAgd2tTaWduYWxDRlJlYWRTdHJlYW1IYXNCeXRlcyhmb3Jt
LT5mb3JtU3RyZWFtKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBrQ0ZTdHJlYW1FdmVudEVy
cm9yT2NjdXJyZWQ6IHsKLSAgICAgICAgQ0ZTdHJlYW1FcnJvciByZWFkU3RyZWFtRXJyb3IgPSBD
RlJlYWRTdHJlYW1HZXRFcnJvcihzdHJlYW0pOwotICAgICAgICB3a1NpZ25hbENGUmVhZFN0cmVh
bUVycm9yKGZvcm0tPmZvcm1TdHJlYW0sICZyZWFkU3RyZWFtRXJyb3IpOwotICAgICAgICBicmVh
azsKLSAgICB9Ci0gICAgY2FzZSBrQ0ZTdHJlYW1FdmVudEVuZEVuY291bnRlcmVkOgotICAgICAg
ICBvcGVuTmV4dFN0cmVhbShmb3JtKTsKLSAgICAgICAgaWYgKCFmb3JtLT5jdXJyZW50U3RyZWFt
KSB7Ci0gICAgICAgICAgICB3a1NpZ25hbENGUmVhZFN0cmVhbUVuZChmb3JtLT5mb3JtU3RyZWFt
KTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIGtDRlN0cmVhbUV2ZW50Tm9u
ZToKLSAgICAgICAgTE9HX0VSUk9SKCJ1bmV4cGVjdGVkIGtDRlN0cmVhbUV2ZW50Tm9uZSIpOwot
ICAgICAgICBicmVhazsKLSAgICBjYXNlIGtDRlN0cmVhbUV2ZW50T3BlbkNvbXBsZXRlZDoKLSAg
ICAgICAgTE9HX0VSUk9SKCJ1bmV4cGVjdGVkIGtDRlN0cmVhbUV2ZW50T3BlbkNvbXBsZXRlZCIp
OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIGtDRlN0cmVhbUV2ZW50Q2FuQWNjZXB0Qnl0ZXM6
Ci0gICAgICAgIExPR19FUlJPUigidW5leHBlY3RlZCBrQ0ZTdHJlYW1FdmVudENhbkFjY2VwdEJ5
dGVzIik7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQogdm9pZCBzZXRIVFRQQm9keShOU011
dGFibGVVUkxSZXF1ZXN0ICpyZXF1ZXN0LCBQYXNzUmVmUHRyPEZvcm1EYXRhPiBwcnBGb3JtRGF0
YSkKIHsKLSAgICBSZWZQdHI8Rm9ybURhdGE+IGZvcm1EYXRhID0gcHJwRm9ybURhdGE7Ci0KLSAg
ICBpZiAoIWZvcm1EYXRhKQotICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgIHNpemVfdCBj
b3VudCA9IGZvcm1EYXRhLT5lbGVtZW50cygpLnNpemUoKTsKLQotICAgIC8vIEhhbmRsZSB0aGUg
Y29tbW9uIHNwZWNpYWwgY2FzZSBvZiBvbmUgcGllY2Ugb2YgZm9ybSBkYXRhLCB3aXRoIG5vIGZp
bGVzLgotICAgIGlmIChjb3VudCA9PSAxICYmICFmb3JtRGF0YS0+YWx3YXlzU3RyZWFtKCkpIHsK
LSAgICAgICAgY29uc3QgRm9ybURhdGFFbGVtZW50JiBlbGVtZW50ID0gZm9ybURhdGEtPmVsZW1l
bnRzKClbMF07Ci0gICAgICAgIGlmIChlbGVtZW50Lm1fdHlwZSA9PSBGb3JtRGF0YUVsZW1lbnQ6
OmRhdGEpIHsKLSAgICAgICAgICAgIE5TRGF0YSAqZGF0YSA9IFtbTlNEYXRhIGFsbG9jXSBpbml0
V2l0aEJ5dGVzOmVsZW1lbnQubV9kYXRhLmRhdGEoKSBsZW5ndGg6ZWxlbWVudC5tX2RhdGEuc2l6
ZSgpXTsKLSAgICAgICAgICAgIFtyZXF1ZXN0IHNldEhUVFBCb2R5OmRhdGFdOwotICAgICAgICAg
ICAgW2RhdGEgcmVsZWFzZV07Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9
Ci0KLSNpZiBFTkFCTEUoQkxPQikKLSAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhIGJsb2IgaW4g
dGhlIGZvcm0gZGF0YS4KLSAgICBib29sIGhhc0Jsb2IgPSBmYWxzZTsKLSAgICBmb3IgKHNpemVf
dCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgICAgY29uc3QgRm9ybURhdGFFbGVtZW50
JiBlbGVtZW50ID0gZm9ybURhdGEtPmVsZW1lbnRzKClbaV07Ci0gICAgICAgIGlmIChlbGVtZW50
Lm1fdHlwZSA9PSBGb3JtRGF0YUVsZW1lbnQ6OmVuY29kZWRCbG9iKSB7Ci0gICAgICAgICAgICBo
YXNCbG9iID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0g
ICAgLy8gSWYgeWVzLCB3ZSBoYXZlIHRvIHJlc29sdmUgYWxsIHRoZSBibG9iIHJlZmVyZW5jZXMg
YW5kIHJlZ2VuZXJhdGUgdGhlIGZvcm0gZGF0YSB3aXRoIG9ubHkgZGF0YSBhbmQgZmlsZSB0eXBl
cy4KLSAgICBpZiAoaGFzQmxvYikgewotICAgICAgICBSZWZQdHI8Rm9ybURhdGE+IG5ld0Zvcm1E
YXRhID0gRm9ybURhdGE6OmNyZWF0ZSgpOwotICAgICAgICBuZXdGb3JtRGF0YS0+c2V0QWx3YXlz
U3RyZWFtKGZvcm1EYXRhLT5hbHdheXNTdHJlYW0oKSk7Ci0gICAgICAgIG5ld0Zvcm1EYXRhLT5z
ZXRJZGVudGlmaWVyKGZvcm1EYXRhLT5pZGVudGlmaWVyKCkpOwotICAgICAgICBmb3IgKHNpemVf
dCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgICAgICAgIGNvbnN0IEZvcm1EYXRhRWxl
bWVudCYgZWxlbWVudCA9IGZvcm1EYXRhLT5lbGVtZW50cygpW2ldOwotICAgICAgICAgICAgaWYg
KGVsZW1lbnQubV90eXBlID09IEZvcm1EYXRhRWxlbWVudDo6ZGF0YSkKLSAgICAgICAgICAgICAg
ICBuZXdGb3JtRGF0YS0+YXBwZW5kRGF0YShlbGVtZW50Lm1fZGF0YS5kYXRhKCksIGVsZW1lbnQu
bV9kYXRhLnNpemUoKSk7Ci0gICAgICAgICAgICBlbHNlIGlmIChlbGVtZW50Lm1fdHlwZSA9PSBG
b3JtRGF0YUVsZW1lbnQ6OmVuY29kZWRGaWxlKQotICAgICAgICAgICAgICAgIG5ld0Zvcm1EYXRh
LT5hcHBlbmRGaWxlKGVsZW1lbnQubV9maWxlbmFtZSwgZWxlbWVudC5tX3Nob3VsZEdlbmVyYXRl
RmlsZSk7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBBU1NFUlQoZWxlbWVu
dC5tX3R5cGUgPT0gRm9ybURhdGFFbGVtZW50OjplbmNvZGVkQmxvYik7Ci0gICAgICAgICAgICAg
ICAgUmVmUHRyPEJsb2JTdG9yYWdlRGF0YT4gYmxvYkRhdGEgPSBzdGF0aWNfY2FzdDxCbG9iUmVn
aXN0cnlJbXBsJj4oYmxvYlJlZ2lzdHJ5KCkpLmdldEJsb2JEYXRhRnJvbVVSTChLVVJMKFBhcnNl
ZFVSTFN0cmluZywgZWxlbWVudC5tX2Jsb2JVUkwpKTsKLSAgICAgICAgICAgICAgICBpZiAoYmxv
YkRhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBibG9i
RGF0YS0+aXRlbXMoKS5zaXplKCk7ICsraikgewotICAgICAgICAgICAgICAgICAgICAgICAgY29u
c3QgQmxvYkRhdGFJdGVtJiBibG9iSXRlbSA9IGJsb2JEYXRhLT5pdGVtcygpW2pdOwotICAgICAg
ICAgICAgICAgICAgICAgICAgaWYgKGJsb2JJdGVtLnR5cGUgPT0gQmxvYkRhdGFJdGVtOjpEYXRh
KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybURhdGEtPmFwcGVuZERhdGEo
YmxvYkl0ZW0uZGF0YS0+ZGF0YSgpICsgc3RhdGljX2Nhc3Q8aW50PihibG9iSXRlbS5vZmZzZXQp
LCBzdGF0aWNfY2FzdDxpbnQ+KGJsb2JJdGVtLmxlbmd0aCkpOwotICAgICAgICAgICAgICAgICAg
ICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1NFUlQoYmxvYkl0
ZW0udHlwZSA9PSBCbG9iRGF0YUl0ZW06OkZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIG5ld0Zvcm1EYXRhLT5hcHBlbmRGaWxlUmFuZ2UoYmxvYkl0ZW0ucGF0aCwgYmxvYkl0ZW0u
b2Zmc2V0LCBibG9iSXRlbS5sZW5ndGgsIGJsb2JJdGVtLmV4cGVjdGVkTW9kaWZpY2F0aW9uVGlt
ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZm9ybURh
dGEgPSBuZXdGb3JtRGF0YS5yZWxlYXNlKCk7Ci0gICAgICAgIGNvdW50ID0gZm9ybURhdGEtPmVs
ZW1lbnRzKCkuc2l6ZSgpOwotICAgIH0KLSNlbmRpZgotCi0gICAgLy8gUHJlY29tcHV0ZSB0aGUg
Y29udGVudCBsZW5ndGggc28gTlNVUkxDb25uZWN0aW9uIGRvZXNuJ3QgdXNlIGNodW5rZWQgbW9k
ZS4KLSAgICBsb25nIGxvbmcgbGVuZ3RoID0gMDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8
IGNvdW50OyArK2kpIHsKLSAgICAgICAgY29uc3QgRm9ybURhdGFFbGVtZW50JiBlbGVtZW50ID0g
Zm9ybURhdGEtPmVsZW1lbnRzKClbaV07Ci0gICAgICAgIGlmIChlbGVtZW50Lm1fdHlwZSA9PSBG
b3JtRGF0YUVsZW1lbnQ6OmRhdGEpCi0gICAgICAgICAgICBsZW5ndGggKz0gZWxlbWVudC5tX2Rh
dGEuc2l6ZSgpOwotICAgICAgICBlbHNlIHsKLSNpZiBFTkFCTEUoQkxPQikKLSAgICAgICAgICAg
IC8vIElmIHdlJ3JlIHNlbmRpbmcgdGhlIGZpbGUgcmFuZ2UsIHVzZSB0aGUgZXhpc3RpbmcgcmFu
Z2UgbGVuZ3RoIGZvciBub3cuIFdlIHdpbGwgZGV0ZWN0IGlmIHRoZSBmaWxlIGhhcyBiZWVuIGNo
YW5nZWQgcmlnaHQgYmVmb3JlIHdlIHJlYWQgdGhlIGZpbGUgYW5kIGFib3J0IHRoZSBvcGVyYXRp
b24gaWYgbmVjZXNzYXJ5LgotICAgICAgICAgICAgaWYgKGVsZW1lbnQubV9maWxlTGVuZ3RoICE9
IEJsb2JEYXRhSXRlbTo6dG9FbmRPZkZpbGUpIHsKLSAgICAgICAgICAgICAgICBsZW5ndGggKz0g
ZWxlbWVudC5tX2ZpbGVMZW5ndGg7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAg
ICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgIGxvbmcgbG9uZyBmaWxlU2l6ZTsKLSAgICAgICAg
ICAgIGlmIChnZXRGaWxlU2l6ZShlbGVtZW50Lm1fc2hvdWxkR2VuZXJhdGVGaWxlID8gZWxlbWVu
dC5tX2dlbmVyYXRlZEZpbGVuYW1lIDogZWxlbWVudC5tX2ZpbGVuYW1lLCBmaWxlU2l6ZSkpCi0g
ICAgICAgICAgICAgICAgbGVuZ3RoICs9IGZpbGVTaXplOwotICAgICAgICB9Ci0gICAgfQotCi0g
ICAgLy8gU2V0IHRoZSBsZW5ndGguCi0gICAgW3JlcXVlc3Qgc2V0VmFsdWU6W05TU3RyaW5nIHN0
cmluZ1dpdGhGb3JtYXQ6QCIlbGxkIiwgbGVuZ3RoXSBmb3JIVFRQSGVhZGVyRmllbGQ6QCJDb250
ZW50LUxlbmd0aCJdOwotCi0gICAgLy8gQ3JlYXRlIGFuZCBzZXQgdGhlIHN0cmVhbS4KLQotICAg
IC8vIFBhc3MgdGhlIGxlbmd0aCBhbG9uZyB3aXRoIHRoZSBmb3JtRGF0YSBzbyBpdCBkb2VzIG5v
dCBoYXZlIHRvIGJlIHJlY29tcHV0ZWQuCi0gICAgRm9ybUNvbnRleHQgZm9ybUNvbnRleHQgPSB7
IGZvcm1EYXRhLnJlbGVhc2UoKSwgbGVuZ3RoIH07Ci0KLSAgICBSZXRhaW5QdHI8Q0ZSZWFkU3Ry
ZWFtUmVmPiBzdHJlYW0oQWRvcHRDRiwgd2tDcmVhdGVDdXN0b21DRlJlYWRTdHJlYW0oZm9ybUNy
ZWF0ZSwgZm9ybUZpbmFsaXplLAotICAgICAgICBmb3JtT3BlbiwgZm9ybVJlYWQsIGZvcm1DYW5S
ZWFkLCBmb3JtQ2xvc2UsIGZvcm1TY2hlZHVsZSwgZm9ybVVuc2NoZWR1bGUsCi0gICAgICAgICZm
b3JtQ29udGV4dCkpOwotICAgIFtyZXF1ZXN0IHNldEhUVFBCb2R5U3RyZWFtOihOU0lucHV0U3Ry
ZWFtICopc3RyZWFtLmdldCgpXTsKKyAgICBzZXRIVFRQQm9keShjb25zdF9jYXN0PENGTXV0YWJs
ZVVSTFJlcXVlc3RSZWY+KFtyZXF1ZXN0IF9DRlVSTFJlcXVlc3RdKSwgcHJwRm9ybURhdGEpOwog
fQogCi1Gb3JtRGF0YSogaHR0cEJvZHlGcm9tU3RyZWFtKE5TSW5wdXRTdHJlYW0qIHN0cmVhbSkK
K0Zvcm1EYXRhKiBodHRwQm9keUZyb21TdHJlYW0oTlNJbnB1dFN0cmVhbSAqc3RyZWFtKQogewot
ICAgIE11dGV4TG9ja2VyIGxvY2tlcihzdHJlYW1GaWVsZHNNYXBNdXRleCgpKTsKLSAgICBGb3Jt
U3RyZWFtRmllbGRzKiBmb3JtU3RyZWFtID0gc3RyZWFtRmllbGRzTWFwKCkuZ2V0KHJlaW50ZXJw
cmV0X2Nhc3Q8Q0ZSZWFkU3RyZWFtUmVmPihzdHJlYW0pKTsKLSAgICBpZiAoIWZvcm1TdHJlYW0p
Ci0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiBmb3JtU3RyZWFtLT5mb3JtRGF0YS5nZXQo
KTsKKyAgICByZXR1cm4gaHR0cEJvZHlGcm9tU3RyZWFtKHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZSZWFk
U3RyZWFtUmVmPihzdHJlYW0pKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQo=
</data>
<flag name="commit-queue"
          id="138595"
          type_id="3"
          status="-"
          setter="buildbot"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>134366</attachid>
            <date>2012-03-28 12:21:23 -0700</date>
            <delta_ts>2012-03-28 13:44:18 -0700</delta_ts>
            <desc>more build fix attempt</desc>
            <filename>FormDataStream.txt</filename>
            <type>text/plain</type>
            <size>41168</size>
            <attacher name="Alexey Proskuryakov">ap</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDExMjMyMCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI2IEBACisyMDEyLTAzLTI3ICBBbGV4ZXkg
UHJvc2t1cnlha292ICA8YXBAYXBwbGUuY29tPgorCisgICAgICAgIFtXaW5dIFNvbWUgQmxvYiB0
ZXN0cyBjcmFzaCBpbiBDRk5ldHdvcmsgaW4gYWR2YW5jZUN1cnJlbnRTdHJlYW0oRm9ybVN0cmVh
bUZpZWxkcyopCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD04MjM4NgorICAgICAgICA8cmRhcjovL3Byb2JsZW0vMTExMjE1MDE+CisKKyAgICAgICAgUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQ292ZXJlZCBieSBleGlzdGluZyB0
ZXN0cy4KKworICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvY2YvRm9ybURhdGFTdHJlYW1DRk5l
dC5jcHA6CisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jZi9Gb3JtRGF0YVN0cmVhbUNGTmV0
Lmg6CisgICAgICAgIE1vdmVkIGxvdyBsZXZlbCBpbXBsZW1lbnRhdGlvbiBmcm9tIEZvcm1EYXRh
U3RyZWFtTWFjLCBhbmQgZXhwb3NlZCBhbiBhZGRpdGlvbmFsIGZ1bmN0aW9uCisgICAgICAgIHRv
IGltcGxlbWVudCBGb3VuZGF0aW9uLWJhc2VkIEFQSSBvbiB0b3Agb2YgdGhpcy4KKworICAgICAg
ICAqIHBsYXRmb3JtL25ldHdvcmsvbWFjL0Zvcm1EYXRhU3RyZWFtTWFjLmg6CisgICAgICAgICog
cGxhdGZvcm0vbmV0d29yay9tYWMvRm9ybURhdGFTdHJlYW1NYWMubW06CisgICAgICAgIFJlbHkg
b24gdG9sbC1mcmVlIGJyaWRnaW5nIGFuZCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIHRvIG1ha2Ug
dGhpcyB3b3JrIHdpdGhvdXQgZHVwbGljYXRpbmcKKyAgICAgICAgY29kZS4KKyAgICAgICAgTm90
ZSB0aGF0IGh0dHBCb2R5RnJvbVN0cmVhbSBpcyBjb25mdXNpbmcgLSBJIGRvbid0IHNlZSBob3cg
aXQgY2FuIHdvcmsgd2hlbiBzZW5kaW5nIHNlcmlhbGl6ZWQKKyAgICAgICAgcmVxdWVzdHMgYWNy
b3NzIHByb2Nlc3MgYm91bmRhcnkuIFdlIHByb2JhYmx5IG9ubHkgZ2V0IGF3YXkgd2l0aCB0aGlz
IGJlY2F1c2Ugd2UgZG9uJ3QgYXR0ZW1wdAorICAgICAgICB0byBzZW5kIHJlcXVlc3RzIHRvIFVJ
IHByb2Nlc3Mgb25jZSB0aGV5IGFscmVhZHkgaGF2ZSBzdHJlYW1zIGFzc29jaWF0ZWQgd2l0aCB0
aGVtLgorCiAyMDEyLTAzLTI2ICBBZGFtIEtsZWluICA8YWRhbWtAY2hyb21pdW0ub3JnPgogCiAg
ICAgICAgIEFsd2F5cyBzZXQgVjggd3JhcHBlcnMgdmlhIFY4RE9NV3JhcHBlcjo6c2V0SlNXcmFw
cGVyRm9yKiBpbnN0ZWFkIG9mIFdlYWtSZWZlcmVuY2VNYXA6OnNldCgpCkluZGV4OiBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2NmL0Zvcm1EYXRhU3RyZWFtQ0ZOZXQuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY2YvRm9ybURhdGFTdHJl
YW1DRk5ldC5jcHAJKHJldmlzaW9uIDExMjE2NikKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L25ldHdvcmsvY2YvRm9ybURhdGFTdHJlYW1DRk5ldC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEs
NSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA3IEFwcGxlIElu
Yy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIw
MDcsIDIwMTIgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucwpAQCAtMjYsOTkgKzI2LDQ2NCBAQAogICogVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICAqLwog
Ci0vKiBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgQmVja3kgV2lsbHJpY2gsIGFkZGl0aW9uYWwgY29k
ZSBieSBEYXJpbiBBZGxlciAqLwotCiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiRm9y
bURhdGFTdHJlYW1DRk5ldC5oIgogCi0jaWYgVVNFKENGTkVUV09SSykKLQorI2luY2x1ZGUgIkJs
b2JSZWdpc3RyeUltcGwuaCIKICNpbmNsdWRlICJGaWxlU3lzdGVtLmgiCiAjaW5jbHVkZSAiRm9y
bURhdGEuaCIKLSNpbmNsdWRlIDxDRk5ldHdvcmsvQ0ZVUkxSZXF1ZXN0UHJpdi5oPgorI2luY2x1
ZGUgIlNjaGVkdWxlUGFpci5oIgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8c3lz
L3R5cGVzLmg+CiAjaW5jbHVkZSA8d3RmL0Fzc2VydGlvbnMuaD4KICNpbmNsdWRlIDx3dGYvSGFz
aE1hcC5oPgorI2luY2x1ZGUgPHd0Zi9NYWluVGhyZWFkLmg+CiAjaW5jbHVkZSA8d3RmL1JldGFp
blB0ci5oPgotI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KKyNpbmNsdWRlIDx3dGYvU3Rk
TGliRXh0cmFzLmg+CisjaW5jbHVkZSA8d3RmL1RocmVhZGluZy5oPgorCisjaWYgUExBVEZPUk0o
SU9TKQorI2luY2x1ZGUgPE1hY0Vycm9ycy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxDb3JlU2Vydmlj
ZXMvQ29yZVNlcnZpY2VzLmg+CisjZW5kaWYKIAogI2lmIFBMQVRGT1JNKE1BQykKLSNpbmNsdWRl
ICJXZWJDb3JlU3lzdGVtSW50ZXJmYWNlLmgiCitleHRlcm4gIkMiIHZvaWQgQ0ZVUkxSZXF1ZXN0
U2V0SFRUUFJlcXVlc3RCb2R5KENGTXV0YWJsZVVSTFJlcXVlc3RSZWYgbXV0YWJsZUhUVFBSZXF1
ZXN0LCBDRkRhdGFSZWYgaHR0cEJvZHkpOworZXh0ZXJuICJDIiB2b2lkIENGVVJMUmVxdWVzdFNl
dEhUVFBIZWFkZXJGaWVsZFZhbHVlKENGTXV0YWJsZVVSTFJlcXVlc3RSZWYgbXV0YWJsZUhUVFBS
ZXF1ZXN0LCBDRlN0cmluZ1JlZiBodHRwSGVhZGVyRmllbGQsIENGU3RyaW5nUmVmIGh0dHBIZWFk
ZXJGaWVsZFZhbHVlKTsKK2V4dGVybiAiQyIgdm9pZCBDRlVSTFJlcXVlc3RTZXRIVFRQUmVxdWVz
dEJvZHlTdHJlYW0oQ0ZNdXRhYmxlVVJMUmVxdWVzdFJlZiByZXEsIENGUmVhZFN0cmVhbVJlZiBi
b2R5U3RyZWFtKTsKK2V4dGVybiAiQyIgQ0ZSZWFkU3RyZWFtUmVmIENGVVJMUmVxdWVzdENvcHlI
VFRQUmVxdWVzdEJvZHlTdHJlYW0oQ0ZVUkxSZXF1ZXN0UmVmIHJlcXVlc3QpOwogI2VsaWYgUExB
VEZPUk0oV0lOKQotI2luY2x1ZGUgPFdlYktpdFN5c3RlbUludGVyZmFjZS9XZWJLaXRTeXN0ZW1J
bnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxDRk5ldHdvcmsvQ0ZVUkxSZXF1ZXN0Lmg+CiAjZW5kaWYK
IAordHlwZWRlZiBzdHJ1Y3QgeworICAgIENGSW5kZXggdmVyc2lvbjsgLyogPT0gMSAqLworICAg
IHZvaWQgKigqY3JlYXRlKShDRlJlYWRTdHJlYW1SZWYgc3RyZWFtLCB2b2lkICppbmZvKTsKKyAg
ICB2b2lkICgqZmluYWxpemUpKENGUmVhZFN0cmVhbVJlZiBzdHJlYW0sIHZvaWQgKmluZm8pOwor
ICAgIENGU3RyaW5nUmVmICgqY29weURlc2NyaXB0aW9uKShDRlJlYWRTdHJlYW1SZWYgc3RyZWFt
LCB2b2lkICppbmZvKTsKKyAgICBCb29sZWFuICgqb3BlbikoQ0ZSZWFkU3RyZWFtUmVmIHN0cmVh
bSwgQ0ZTdHJlYW1FcnJvciAqZXJyb3IsIEJvb2xlYW4gKm9wZW5Db21wbGV0ZSwgdm9pZCAqaW5m
byk7CisgICAgQm9vbGVhbiAoKm9wZW5Db21wbGV0ZWQpKENGUmVhZFN0cmVhbVJlZiBzdHJlYW0s
IENGU3RyZWFtRXJyb3IgKmVycm9yLCB2b2lkICppbmZvKTsKKyAgICBDRkluZGV4ICgqcmVhZCko
Q0ZSZWFkU3RyZWFtUmVmIHN0cmVhbSwgVUludDggKmJ1ZmZlciwgQ0ZJbmRleCBidWZmZXJMZW5n
dGgsIENGU3RyZWFtRXJyb3IgKmVycm9yLCBCb29sZWFuICphdEVPRiwgdm9pZCAqaW5mbyk7Cisg
ICAgY29uc3QgVUludDggKigqZ2V0QnVmZmVyKShDRlJlYWRTdHJlYW1SZWYgc3RyZWFtLCBDRklu
ZGV4IG1heEJ5dGVzVG9SZWFkLCBDRkluZGV4ICpudW1CeXRlc1JlYWQsIENGU3RyZWFtRXJyb3Ig
KmVycm9yLCBCb29sZWFuICphdEVPRiwgdm9pZCAqaW5mbyk7CisgICAgQm9vbGVhbiAoKmNhblJl
YWQpKENGUmVhZFN0cmVhbVJlZiBzdHJlYW0sIHZvaWQgKmluZm8pOworICAgIHZvaWQgKCpjbG9z
ZSkoQ0ZSZWFkU3RyZWFtUmVmIHN0cmVhbSwgdm9pZCAqaW5mbyk7CisgICAgQ0ZUeXBlUmVmICgq
Y29weVByb3BlcnR5KShDRlJlYWRTdHJlYW1SZWYgc3RyZWFtLCBDRlN0cmluZ1JlZiBwcm9wZXJ0
eU5hbWUsIHZvaWQgKmluZm8pOworICAgIEJvb2xlYW4gKCpzZXRQcm9wZXJ0eSkoQ0ZSZWFkU3Ry
ZWFtUmVmIHN0cmVhbSwgQ0ZTdHJpbmdSZWYgcHJvcGVydHlOYW1lLCBDRlR5cGVSZWYgcHJvcGVy
dHlWYWx1ZSwgdm9pZCAqaW5mbyk7CisgICAgdm9pZCAoKnJlcXVlc3RFdmVudHMpKENGUmVhZFN0
cmVhbVJlZiBzdHJlYW0sIENGT3B0aW9uRmxhZ3Mgc3RyZWFtRXZlbnRzLCB2b2lkICppbmZvKTsK
KyAgICB2b2lkICgqc2NoZWR1bGUpKENGUmVhZFN0cmVhbVJlZiBzdHJlYW0sIENGUnVuTG9vcFJl
ZiBydW5Mb29wLCBDRlN0cmluZ1JlZiBydW5Mb29wTW9kZSwgdm9pZCAqaW5mbyk7CisgICAgdm9p
ZCAoKnVuc2NoZWR1bGUpKENGUmVhZFN0cmVhbVJlZiBzdHJlYW0sIENGUnVuTG9vcFJlZiBydW5M
b29wLCBDRlN0cmluZ1JlZiBydW5Mb29wTW9kZSwgdm9pZCAqaW5mbyk7Cit9IENGUmVhZFN0cmVh
bUNhbGxCYWNrc1YxOworCisjaWYgUExBVEZPUk0oV0lOKQorI2RlZmluZSBFWFRFUk4gZXh0ZXJu
ICJDIiBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyNlbHNlCisjZGVmaW5lIEVYVEVSTiBleHRlcm4g
IkMiCisjZW5kaWYKKworRVhURVJOIHZvaWQgQ0ZSZWFkU3RyZWFtU2lnbmFsRXZlbnQoQ0ZSZWFk
U3RyZWFtUmVmIHN0cmVhbSwgQ0ZTdHJlYW1FdmVudFR5cGUgZXZlbnQsIGNvbnN0IHZvaWQgKmVy
cm9yKTsKK0VYVEVSTiBDRlJlYWRTdHJlYW1SZWYgQ0ZSZWFkU3RyZWFtQ3JlYXRlKENGQWxsb2Nh
dG9yUmVmIGFsbG9jLCBjb25zdCB2b2lkICpjYWxsYmFja3MsIHZvaWQgKmluZm8pOworCiBuYW1l
c3BhY2UgV2ViQ29yZSB7CiAKLXZvaWQgc2V0SFRUUEJvZHkoQ0ZNdXRhYmxlVVJMUmVxdWVzdFJl
ZiByZXF1ZXN0LCBQYXNzUmVmUHRyPEZvcm1EYXRhPiBmb3JtRGF0YSkKK3N0YXRpYyBNdXRleCYg
c3RyZWFtRmllbGRzTWFwTXV0ZXgoKQogewotICAgIGlmICghZm9ybURhdGEpIHsKLSAgICAgICAg
d2tDRlVSTFJlcXVlc3RTZXRIVFRQUmVxdWVzdEJvZHlQYXJ0cyhyZXF1ZXN0LCAwKTsKLSAgICAg
ICAgcmV0dXJuOworICAgIERFRklORV9TVEFUSUNfTE9DQUwoTXV0ZXgsIHN0YXRpY011dGV4LCAo
KSk7CisgICAgcmV0dXJuIHN0YXRpY011dGV4OworfQorCitzdGF0aWMgdm9pZCBmb3JtRXZlbnRD
YWxsYmFjayhDRlJlYWRTdHJlYW1SZWYgc3RyZWFtLCBDRlN0cmVhbUV2ZW50VHlwZSB0eXBlLCB2
b2lkKiBjb250ZXh0KTsKKworc3RydWN0IEZvcm1Db250ZXh0IHsKKyAgICBSZWZQdHI8Rm9ybURh
dGE+IGZvcm1EYXRhOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBzdHJlYW1MZW5ndGg7Cit9Owor
CitzdHJ1Y3QgRm9ybVN0cmVhbUZpZWxkcyB7CisgICAgUmVmUHRyPEZvcm1EYXRhPiBmb3JtRGF0
YTsKKyAgICBTY2hlZHVsZVBhaXJIYXNoU2V0IHNjaGVkdWxlZFJ1bkxvb3BQYWlyczsKKyAgICBW
ZWN0b3I8Rm9ybURhdGFFbGVtZW50PiByZW1haW5pbmdFbGVtZW50czsgLy8gaW4gcmV2ZXJzZSBv
cmRlcgorICAgIENGUmVhZFN0cmVhbVJlZiBjdXJyZW50U3RyZWFtOworI2lmIEVOQUJMRShCTE9C
KQorICAgIGxvbmcgbG9uZyBjdXJyZW50U3RyZWFtUmFuZ2VMZW5ndGg7CisjZW5kaWYKKyAgICBj
aGFyKiBjdXJyZW50RGF0YTsKKyAgICBDRlJlYWRTdHJlYW1SZWYgZm9ybVN0cmVhbTsKKyAgICB1
bnNpZ25lZCBsb25nIGxvbmcgc3RyZWFtTGVuZ3RoOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBi
eXRlc1NlbnQ7Cit9OworCit0eXBlZGVmIEhhc2hNYXA8Q0ZSZWFkU3RyZWFtUmVmLCBGb3JtU3Ry
ZWFtRmllbGRzKj4gU3RyZWFtRmllbGRzTWFwOworc3RhdGljIFN0cmVhbUZpZWxkc01hcCYgc3Ry
ZWFtRmllbGRzTWFwKCkKK3sKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKFN0cmVhbUZpZWxkc01h
cCwgc3RyZWFtRmllbGRzTWFwLCAoKSk7CisgICAgcmV0dXJuIHN0cmVhbUZpZWxkc01hcDsKK30K
Kworc3RhdGljIHZvaWQgY2xvc2VDdXJyZW50U3RyZWFtKEZvcm1TdHJlYW1GaWVsZHMgKmZvcm0p
Cit7CisgICAgaWYgKGZvcm0tPmN1cnJlbnRTdHJlYW0pIHsKKyAgICAgICAgQ0ZSZWFkU3RyZWFt
Q2xvc2UoZm9ybS0+Y3VycmVudFN0cmVhbSk7CisgICAgICAgIENGUmVhZFN0cmVhbVNldENsaWVu
dChmb3JtLT5jdXJyZW50U3RyZWFtLCBrQ0ZTdHJlYW1FdmVudE5vbmUsIDAsIDApOworICAgICAg
ICBDRlJlbGVhc2UoZm9ybS0+Y3VycmVudFN0cmVhbSk7CisgICAgICAgIGZvcm0tPmN1cnJlbnRT
dHJlYW0gPSAwOworI2lmIEVOQUJMRShCTE9CKQorICAgICAgICBmb3JtLT5jdXJyZW50U3RyZWFt
UmFuZ2VMZW5ndGggPSBCbG9iRGF0YUl0ZW06OnRvRW5kT2ZGaWxlOworI2VuZGlmCiAgICAgfQor
ICAgIGlmIChmb3JtLT5jdXJyZW50RGF0YSkgeworICAgICAgICBmYXN0RnJlZShmb3JtLT5jdXJy
ZW50RGF0YSk7CisgICAgICAgIGZvcm0tPmN1cnJlbnREYXRhID0gMDsKKyAgICB9Cit9CiAKLSAg
ICBzaXplX3QgY291bnQgPSBmb3JtRGF0YS0+ZWxlbWVudHMoKS5zaXplKCk7CisvLyBSZXR1cm4g
ZmFsc2UgaWYgd2UgY2Fubm90IGFkdmFuY2UgdGhlIHN0cmVhbS4gQ3VycmVudGx5IHRoZSBvbmx5
IHBvc3NpYmxlIGZhaWx1cmUgaXMgdGhhdCB0aGUgdW5kZXJseWluZyBmaWxlIGhhcyBiZWVuIHJl
bW92ZWQgb3IgY2hhbmdlZCBzaW5jZSBGaWxlLnNsaWNlLgorc3RhdGljIGJvb2wgYWR2YW5jZUN1
cnJlbnRTdHJlYW0oRm9ybVN0cmVhbUZpZWxkcyogZm9ybSkKK3sKKyAgICBjbG9zZUN1cnJlbnRT
dHJlYW0oZm9ybSk7CisKKyAgICBpZiAoZm9ybS0+cmVtYWluaW5nRWxlbWVudHMuaXNFbXB0eSgp
KQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIENyZWF0ZSB0aGUgbmV3IHN0cmVhbS4K
KyAgICBGb3JtRGF0YUVsZW1lbnQmIG5leHRJbnB1dCA9IGZvcm0tPnJlbWFpbmluZ0VsZW1lbnRz
Lmxhc3QoKTsKKworICAgIGlmIChuZXh0SW5wdXQubV90eXBlID09IEZvcm1EYXRhRWxlbWVudDo6
ZGF0YSkgeworICAgICAgICBzaXplX3Qgc2l6ZSA9IG5leHRJbnB1dC5tX2RhdGEuc2l6ZSgpOwor
ICAgICAgICBjaGFyKiBkYXRhID0gbmV4dElucHV0Lm1fZGF0YS5yZWxlYXNlQnVmZmVyKCk7Cisg
ICAgICAgIGZvcm0tPmN1cnJlbnRTdHJlYW0gPSBDRlJlYWRTdHJlYW1DcmVhdGVXaXRoQnl0ZXNO
b0NvcHkoMCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBVSW50OCo+KGRhdGEpLCBzaXplLCBrQ0ZB
bGxvY2F0b3JOdWxsKTsKKyAgICAgICAgZm9ybS0+Y3VycmVudERhdGEgPSBkYXRhOworICAgIH0g
ZWxzZSB7CisjaWYgRU5BQkxFKEJMT0IpCisgICAgICAgIC8vIENoZWNrIGlmIHRoZSBmaWxlIGhh
cyBiZWVuIGNoYW5nZWQgb3Igbm90IGlmIHJlcXVpcmVkLgorICAgICAgICBpZiAobmV4dElucHV0
Lm1fZXhwZWN0ZWRGaWxlTW9kaWZpY2F0aW9uVGltZSAhPSBCbG9iRGF0YUl0ZW06OmRvTm90Q2hl
Y2tGaWxlQ2hhbmdlKSB7CisgICAgICAgICAgICB0aW1lX3QgZmlsZU1vZGlmaWNhdGlvblRpbWU7
CisgICAgICAgICAgICBpZiAoIWdldEZpbGVNb2RpZmljYXRpb25UaW1lKG5leHRJbnB1dC5tX2Zp
bGVuYW1lLCBmaWxlTW9kaWZpY2F0aW9uVGltZSkgfHwgZmlsZU1vZGlmaWNhdGlvblRpbWUgIT0g
c3RhdGljX2Nhc3Q8dGltZV90PihuZXh0SW5wdXQubV9leHBlY3RlZEZpbGVNb2RpZmljYXRpb25U
aW1lKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyNlbmRpZgor
ICAgICAgICBjb25zdCBTdHJpbmcmIHBhdGggPSBuZXh0SW5wdXQubV9zaG91bGRHZW5lcmF0ZUZp
bGUgPyBuZXh0SW5wdXQubV9nZW5lcmF0ZWRGaWxlbmFtZSA6IG5leHRJbnB1dC5tX2ZpbGVuYW1l
OworICAgICAgICBmb3JtLT5jdXJyZW50U3RyZWFtID0gQ0ZSZWFkU3RyZWFtQ3JlYXRlV2l0aEZp
bGUoMCwgcGF0aEFzVVJMKHBhdGgpLmdldCgpKTsKKyAgICAgICAgaWYgKCFmb3JtLT5jdXJyZW50
U3RyZWFtKSB7CisgICAgICAgICAgICAvLyBUaGUgZmlsZSBtdXN0IGhhdmUgYmVlbiByZW1vdmVk
IG9yIGJlY29tZSB1bnJlYWRhYmxlLgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAg
ICB9CisjaWYgRU5BQkxFKEJMT0IpCisgICAgICAgIGlmIChuZXh0SW5wdXQubV9maWxlU3RhcnQg
PiAwKSB7CisgICAgICAgICAgICBSZXRhaW5QdHI8Q0ZOdW1iZXJSZWY+IHBvc2l0aW9uKEFkb3B0
Q0YsIENGTnVtYmVyQ3JlYXRlKDAsIGtDRk51bWJlckxvbmdMb25nVHlwZSwgJm5leHRJbnB1dC5t
X2ZpbGVTdGFydCkpOworICAgICAgICAgICAgQ0ZSZWFkU3RyZWFtU2V0UHJvcGVydHkoZm9ybS0+
Y3VycmVudFN0cmVhbSwga0NGU3RyZWFtUHJvcGVydHlGaWxlQ3VycmVudE9mZnNldCwgcG9zaXRp
b24uZ2V0KCkpOworICAgICAgICB9CisgICAgICAgIGZvcm0tPmN1cnJlbnRTdHJlYW1SYW5nZUxl
bmd0aCA9IG5leHRJbnB1dC5tX2ZpbGVMZW5ndGg7CisjZW5kaWYKKyAgICB9CisgICAgZm9ybS0+
cmVtYWluaW5nRWxlbWVudHMucmVtb3ZlTGFzdCgpOworCisgICAgLy8gU2V0IHVwIHRoZSBjYWxs
YmFjay4KKyAgICBDRlN0cmVhbUNsaWVudENvbnRleHQgY29udGV4dCA9IHsgMCwgZm9ybSwgMCwg
MCwgMCB9OworICAgIENGUmVhZFN0cmVhbVNldENsaWVudChmb3JtLT5jdXJyZW50U3RyZWFtLCBr
Q0ZTdHJlYW1FdmVudEhhc0J5dGVzQXZhaWxhYmxlIHwga0NGU3RyZWFtRXZlbnRFcnJvck9jY3Vy
cmVkIHwga0NGU3RyZWFtRXZlbnRFbmRFbmNvdW50ZXJlZCwKKyAgICAgICAgZm9ybUV2ZW50Q2Fs
bGJhY2ssICZjb250ZXh0KTsKKworICAgIC8vIFNjaGVkdWxlIHdpdGggdGhlIGN1cnJlbnQgc2V0
IG9mIHJ1biBsb29wcy4KKyAgICBTY2hlZHVsZVBhaXJIYXNoU2V0OjppdGVyYXRvciBlbmQgPSBm
b3JtLT5zY2hlZHVsZWRSdW5Mb29wUGFpcnMuZW5kKCk7CisgICAgZm9yIChTY2hlZHVsZVBhaXJI
YXNoU2V0OjppdGVyYXRvciBpdCA9IGZvcm0tPnNjaGVkdWxlZFJ1bkxvb3BQYWlycy5iZWdpbigp
OyBpdCAhPSBlbmQ7ICsraXQpCisgICAgICAgIENGUmVhZFN0cmVhbVNjaGVkdWxlV2l0aFJ1bkxv
b3AoZm9ybS0+Y3VycmVudFN0cmVhbSwgKCppdCktPnJ1bkxvb3AoKSwgKCppdCktPm1vZGUoKSk7
CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgb3Blbk5leHRTdHJlYW0oRm9y
bVN0cmVhbUZpZWxkcyogZm9ybSkKK3sKKyAgICAvLyBTa2lwIG92ZXIgYW55IHN0cmVhbXMgd2Ug
Y2FuJ3Qgb3Blbi4KKyAgICBpZiAoIWFkdmFuY2VDdXJyZW50U3RyZWFtKGZvcm0pKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgd2hpbGUgKGZvcm0tPmN1cnJlbnRTdHJlYW0gJiYgIUNGUmVh
ZFN0cmVhbU9wZW4oZm9ybS0+Y3VycmVudFN0cmVhbSkpIHsKKyAgICAgICAgaWYgKCFhZHZhbmNl
Q3VycmVudFN0cmVhbShmb3JtKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cisg
ICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkKiBmb3JtQ3JlYXRlKENGUmVhZFN0cmVh
bVJlZiBzdHJlYW0sIHZvaWQqIGNvbnRleHQpCit7CisgICAgRm9ybUNvbnRleHQqIGZvcm1Db250
ZXh0ID0gc3RhdGljX2Nhc3Q8Rm9ybUNvbnRleHQqPihjb250ZXh0KTsKKworICAgIEZvcm1TdHJl
YW1GaWVsZHMqIG5ld0luZm8gPSBuZXcgRm9ybVN0cmVhbUZpZWxkczsKKyAgICBuZXdJbmZvLT5m
b3JtRGF0YSA9IGZvcm1Db250ZXh0LT5mb3JtRGF0YS5yZWxlYXNlKCk7CisgICAgbmV3SW5mby0+
Y3VycmVudFN0cmVhbSA9IDA7CisjaWYgRU5BQkxFKEJMT0IpCisgICAgbmV3SW5mby0+Y3VycmVu
dFN0cmVhbVJhbmdlTGVuZ3RoID0gQmxvYkRhdGFJdGVtOjp0b0VuZE9mRmlsZTsKKyNlbmRpZgor
ICAgIG5ld0luZm8tPmN1cnJlbnREYXRhID0gMDsKKyAgICBuZXdJbmZvLT5mb3JtU3RyZWFtID0g
c3RyZWFtOyAvLyBEb24ndCByZXRhaW4uIFRoYXQgd291bGQgY3JlYXRlIGEgcmVmZXJlbmNlIGN5
Y2xlLgorICAgIG5ld0luZm8tPnN0cmVhbUxlbmd0aCA9IGZvcm1Db250ZXh0LT5zdHJlYW1MZW5n
dGg7CisgICAgbmV3SW5mby0+Ynl0ZXNTZW50ID0gMDsKKworICAgIC8vIEFwcGVuZCBpbiByZXZl
cnNlIG9yZGVyIHNpbmNlIHdlIHJlbW92ZSBlbGVtZW50cyBmcm9tIHRoZSBlbmQuCisgICAgc2l6
ZV90IHNpemUgPSBuZXdJbmZvLT5mb3JtRGF0YS0+ZWxlbWVudHMoKS5zaXplKCk7CisgICAgbmV3
SW5mby0+cmVtYWluaW5nRWxlbWVudHMucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShzaXplKTsKKyAg
ICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkKKyAgICAgICAgbmV3SW5mby0+cmVt
YWluaW5nRWxlbWVudHMuYXBwZW5kKG5ld0luZm8tPmZvcm1EYXRhLT5lbGVtZW50cygpW3NpemUg
LSBpIC0gMV0pOworCisgICAgTXV0ZXhMb2NrZXIgbG9ja2VyKHN0cmVhbUZpZWxkc01hcE11dGV4
KCkpOworICAgIEFTU0VSVCghc3RyZWFtRmllbGRzTWFwKCkuY29udGFpbnMoc3RyZWFtKSk7Cisg
ICAgc3RyZWFtRmllbGRzTWFwKCkuYWRkKHN0cmVhbSwgbmV3SW5mbyk7CisKKyAgICByZXR1cm4g
bmV3SW5mbzsKK30KKworc3RhdGljIHZvaWQgZm9ybUZpbmlzaEZpbmFsaXphdGlvbk9uTWFpblRo
cmVhZCh2b2lkKiBjb250ZXh0KQoreworICAgIE93blB0cjxGb3JtU3RyZWFtRmllbGRzPiBmb3Jt
ID0gYWRvcHRQdHIoc3RhdGljX2Nhc3Q8Rm9ybVN0cmVhbUZpZWxkcyo+KGNvbnRleHQpKTsKKwor
ICAgIGNsb3NlQ3VycmVudFN0cmVhbShmb3JtLmdldCgpKTsKK30KKworc3RhdGljIHZvaWQgZm9y
bUZpbmFsaXplKENGUmVhZFN0cmVhbVJlZiBzdHJlYW0sIHZvaWQqIGNvbnRleHQpCit7CisgICAg
Rm9ybVN0cmVhbUZpZWxkcyogZm9ybSA9IHN0YXRpY19jYXN0PEZvcm1TdHJlYW1GaWVsZHMqPihj
b250ZXh0KTsKKworICAgIE11dGV4TG9ja2VyIGxvY2tlcihzdHJlYW1GaWVsZHNNYXBNdXRleCgp
KTsKKworICAgIEFTU0VSVChmb3JtLT5mb3JtU3RyZWFtID09IHN0cmVhbSk7CisgICAgQVNTRVJU
KHN0cmVhbUZpZWxkc01hcCgpLmdldChzdHJlYW0pID09IGNvbnRleHQpOworCisgICAgLy8gRG8g
dGhpcyByaWdodCBhd2F5IGJlY2F1c2UgdGhlIENGUmVhZFN0cmVhbVJlZiBpcyBiZWluZyBkZWFs
bG9jYXRlZC4KKyAgICAvLyBXZSBjYW4ndCB3YWl0IHRvIHJlbW92ZSB0aGlzIGZyb20gdGhlIG1h
cCB1bnRpbCB3ZSBmaW5pc2ggZmluYWxpemluZworICAgIC8vIG9uIHRoZSBtYWluIHRocmVhZCBi
ZWNhdXNlIGluIHRoZW9yeSB0aGUgZnJlZWQgbWVtb3J5IGNvdWxkIGJlIHJldXNlZAorICAgIC8v
IGZvciBhIG5ldyBDRlJlYWRTdHJlYW0gYmVmb3JlIHRoYXQgcnVucy4KKyAgICBzdHJlYW1GaWVs
ZHNNYXAoKS5yZW1vdmUoc3RyZWFtKTsKKworICAgIGNhbGxPbk1haW5UaHJlYWQoZm9ybUZpbmlz
aEZpbmFsaXphdGlvbk9uTWFpblRocmVhZCwgZm9ybSk7Cit9CisKK3N0YXRpYyBCb29sZWFuIGZv
cm1PcGVuKENGUmVhZFN0cmVhbVJlZiwgQ0ZTdHJlYW1FcnJvciogZXJyb3IsIEJvb2xlYW4qIG9w
ZW5Db21wbGV0ZSwgdm9pZCogY29udGV4dCkKK3sKKyAgICBGb3JtU3RyZWFtRmllbGRzKiBmb3Jt
ID0gc3RhdGljX2Nhc3Q8Rm9ybVN0cmVhbUZpZWxkcyo+KGNvbnRleHQpOworCisgICAgYm9vbCBv
cGVuZWQgPSBvcGVuTmV4dFN0cmVhbShmb3JtKTsKKworICAgICpvcGVuQ29tcGxldGUgPSBvcGVu
ZWQ7CisgICAgZXJyb3ItPmVycm9yID0gb3BlbmVkID8gMCA6IGZuZkVycjsKKyAgICByZXR1cm4g
b3BlbmVkOworfQorCitzdGF0aWMgQ0ZJbmRleCBmb3JtUmVhZChDRlJlYWRTdHJlYW1SZWYsIFVJ
bnQ4KiBidWZmZXIsIENGSW5kZXggYnVmZmVyTGVuZ3RoLCBDRlN0cmVhbUVycm9yKiBlcnJvciwg
Qm9vbGVhbiogYXRFT0YsIHZvaWQqIGNvbnRleHQpCit7CisgICAgRm9ybVN0cmVhbUZpZWxkcyog
Zm9ybSA9IHN0YXRpY19jYXN0PEZvcm1TdHJlYW1GaWVsZHMqPihjb250ZXh0KTsKKworICAgIHdo
aWxlIChmb3JtLT5jdXJyZW50U3RyZWFtKSB7CisgICAgICAgIENGSW5kZXggYnl0ZXNUb1JlYWQg
PSBidWZmZXJMZW5ndGg7CisjaWYgRU5BQkxFKEJMT0IpCisgICAgICAgIGlmIChmb3JtLT5jdXJy
ZW50U3RyZWFtUmFuZ2VMZW5ndGggIT0gQmxvYkRhdGFJdGVtOjp0b0VuZE9mRmlsZSAmJiBmb3Jt
LT5jdXJyZW50U3RyZWFtUmFuZ2VMZW5ndGggPCBieXRlc1RvUmVhZCkKKyAgICAgICAgICAgIGJ5
dGVzVG9SZWFkID0gc3RhdGljX2Nhc3Q8Q0ZJbmRleD4oZm9ybS0+Y3VycmVudFN0cmVhbVJhbmdl
TGVuZ3RoKTsKKyNlbmRpZgorICAgICAgICBDRkluZGV4IGJ5dGVzUmVhZCA9IENGUmVhZFN0cmVh
bVJlYWQoZm9ybS0+Y3VycmVudFN0cmVhbSwgYnVmZmVyLCBieXRlc1RvUmVhZCk7CisgICAgICAg
IGlmIChieXRlc1JlYWQgPCAwKSB7CisgICAgICAgICAgICAqZXJyb3IgPSBDRlJlYWRTdHJlYW1H
ZXRFcnJvcihmb3JtLT5jdXJyZW50U3RyZWFtKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAg
ICAgICAgfQorICAgICAgICBpZiAoYnl0ZXNSZWFkID4gMCkgeworICAgICAgICAgICAgZXJyb3It
PmVycm9yID0gMDsKKyAgICAgICAgICAgICphdEVPRiA9IEZBTFNFOworICAgICAgICAgICAgZm9y
bS0+Ynl0ZXNTZW50ICs9IGJ5dGVzUmVhZDsKKyNpZiBFTkFCTEUoQkxPQikKKyAgICAgICAgICAg
IGlmIChmb3JtLT5jdXJyZW50U3RyZWFtUmFuZ2VMZW5ndGggIT0gQmxvYkRhdGFJdGVtOjp0b0Vu
ZE9mRmlsZSkKKyAgICAgICAgICAgICAgICBmb3JtLT5jdXJyZW50U3RyZWFtUmFuZ2VMZW5ndGgg
LT0gYnl0ZXNSZWFkOworI2VuZGlmCisKKyAgICAgICAgICAgIHJldHVybiBieXRlc1JlYWQ7Cisg
ICAgICAgIH0KKyAgICAgICAgb3Blbk5leHRTdHJlYW0oZm9ybSk7CisgICAgfQorCisgICAgZXJy
b3ItPmVycm9yID0gMDsKKyAgICAqYXRFT0YgPSBUUlVFOworICAgIHJldHVybiAwOworfQorCitz
dGF0aWMgQm9vbGVhbiBmb3JtQ2FuUmVhZChDRlJlYWRTdHJlYW1SZWYgc3RyZWFtLCB2b2lkKiBj
b250ZXh0KQoreworICAgIEZvcm1TdHJlYW1GaWVsZHMqIGZvcm0gPSBzdGF0aWNfY2FzdDxGb3Jt
U3RyZWFtRmllbGRzKj4oY29udGV4dCk7CisKKyAgICB3aGlsZSAoZm9ybS0+Y3VycmVudFN0cmVh
bSAmJiBDRlJlYWRTdHJlYW1HZXRTdGF0dXMoZm9ybS0+Y3VycmVudFN0cmVhbSkgPT0ga0NGU3Ry
ZWFtU3RhdHVzQXRFbmQpCisgICAgICAgIG9wZW5OZXh0U3RyZWFtKGZvcm0pOworCisgICAgaWYg
KCFmb3JtLT5jdXJyZW50U3RyZWFtKSB7CisgICAgICAgIENGUmVhZFN0cmVhbVNpZ25hbEV2ZW50
KHN0cmVhbSwga0NGU3RyZWFtRXZlbnRFbmRFbmNvdW50ZXJlZCwgMCk7CisgICAgICAgIHJldHVy
biBGQUxTRTsKKyAgICB9CisgICAgcmV0dXJuIENGUmVhZFN0cmVhbUhhc0J5dGVzQXZhaWxhYmxl
KGZvcm0tPmN1cnJlbnRTdHJlYW0pOworfQorCitzdGF0aWMgdm9pZCBmb3JtQ2xvc2UoQ0ZSZWFk
U3RyZWFtUmVmLCB2b2lkKiBjb250ZXh0KQoreworICAgIEZvcm1TdHJlYW1GaWVsZHMqIGZvcm0g
PSBzdGF0aWNfY2FzdDxGb3JtU3RyZWFtRmllbGRzKj4oY29udGV4dCk7CisKKyAgICBjbG9zZUN1
cnJlbnRTdHJlYW0oZm9ybSk7Cit9CisKK3N0YXRpYyB2b2lkIGZvcm1TY2hlZHVsZShDRlJlYWRT
dHJlYW1SZWYsIENGUnVuTG9vcFJlZiBydW5Mb29wLCBDRlN0cmluZ1JlZiBydW5Mb29wTW9kZSwg
dm9pZCogY29udGV4dCkKK3sKKyAgICBGb3JtU3RyZWFtRmllbGRzKiBmb3JtID0gc3RhdGljX2Nh
c3Q8Rm9ybVN0cmVhbUZpZWxkcyo+KGNvbnRleHQpOworCisgICAgaWYgKGZvcm0tPmN1cnJlbnRT
dHJlYW0pCisgICAgICAgIENGUmVhZFN0cmVhbVNjaGVkdWxlV2l0aFJ1bkxvb3AoZm9ybS0+Y3Vy
cmVudFN0cmVhbSwgcnVuTG9vcCwgcnVuTG9vcE1vZGUpOworICAgIGZvcm0tPnNjaGVkdWxlZFJ1
bkxvb3BQYWlycy5hZGQoU2NoZWR1bGVQYWlyOjpjcmVhdGUocnVuTG9vcCwgcnVuTG9vcE1vZGUp
KTsKK30KKworc3RhdGljIHZvaWQgZm9ybVVuc2NoZWR1bGUoQ0ZSZWFkU3RyZWFtUmVmLCBDRlJ1
bkxvb3BSZWYgcnVuTG9vcCwgQ0ZTdHJpbmdSZWYgcnVuTG9vcE1vZGUsIHZvaWQqIGNvbnRleHQp
Cit7CisgICAgRm9ybVN0cmVhbUZpZWxkcyogZm9ybSA9IHN0YXRpY19jYXN0PEZvcm1TdHJlYW1G
aWVsZHMqPihjb250ZXh0KTsKKworICAgIGlmIChmb3JtLT5jdXJyZW50U3RyZWFtKQorICAgICAg
ICBDRlJlYWRTdHJlYW1VbnNjaGVkdWxlRnJvbVJ1bkxvb3AoZm9ybS0+Y3VycmVudFN0cmVhbSwg
cnVuTG9vcCwgcnVuTG9vcE1vZGUpOworICAgIGZvcm0tPnNjaGVkdWxlZFJ1bkxvb3BQYWlycy5y
ZW1vdmUoU2NoZWR1bGVQYWlyOjpjcmVhdGUocnVuTG9vcCwgcnVuTG9vcE1vZGUpKTsKK30KKwor
c3RhdGljIHZvaWQgZm9ybUV2ZW50Q2FsbGJhY2soQ0ZSZWFkU3RyZWFtUmVmIHN0cmVhbSwgQ0ZT
dHJlYW1FdmVudFR5cGUgdHlwZSwgdm9pZCogY29udGV4dCkKK3sKKyAgICBGb3JtU3RyZWFtRmll
bGRzKiBmb3JtID0gc3RhdGljX2Nhc3Q8Rm9ybVN0cmVhbUZpZWxkcyo+KGNvbnRleHQpOwogCi0g
ICAgaWYgKGNvdW50ID09IDApCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBrQ0ZTdHJl
YW1FdmVudEhhc0J5dGVzQXZhaWxhYmxlOgorICAgICAgICBDRlJlYWRTdHJlYW1TaWduYWxFdmVu
dChmb3JtLT5mb3JtU3RyZWFtLCBrQ0ZTdHJlYW1FdmVudEhhc0J5dGVzQXZhaWxhYmxlLCAwKTsK
KyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBrQ0ZTdHJlYW1FdmVudEVycm9yT2NjdXJyZWQ6IHsK
KyAgICAgICAgQ0ZTdHJlYW1FcnJvciByZWFkU3RyZWFtRXJyb3IgPSBDRlJlYWRTdHJlYW1HZXRF
cnJvcihzdHJlYW0pOworICAgICAgICBDRlJlYWRTdHJlYW1TaWduYWxFdmVudChmb3JtLT5mb3Jt
U3RyZWFtLCBrQ0ZTdHJlYW1FdmVudEVycm9yT2NjdXJyZWQsICZyZWFkU3RyZWFtRXJyb3IpOwor
ICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBrQ0ZTdHJlYW1FdmVudEVuZEVuY291bnRl
cmVkOgorICAgICAgICBvcGVuTmV4dFN0cmVhbShmb3JtKTsKKyAgICAgICAgaWYgKCFmb3JtLT5j
dXJyZW50U3RyZWFtKQorICAgICAgICAgICAgQ0ZSZWFkU3RyZWFtU2lnbmFsRXZlbnQoZm9ybS0+
Zm9ybVN0cmVhbSwga0NGU3RyZWFtRXZlbnRFbmRFbmNvdW50ZXJlZCwgMCk7CisgICAgICAgIGJy
ZWFrOworICAgIGNhc2Uga0NGU3RyZWFtRXZlbnROb25lOgorICAgICAgICBMT0dfRVJST1IoInVu
ZXhwZWN0ZWQga0NGU3RyZWFtRXZlbnROb25lIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ug
a0NGU3RyZWFtRXZlbnRPcGVuQ29tcGxldGVkOgorICAgICAgICBMT0dfRVJST1IoInVuZXhwZWN0
ZWQga0NGU3RyZWFtRXZlbnRPcGVuQ29tcGxldGVkIik7CisgICAgICAgIGJyZWFrOworICAgIGNh
c2Uga0NGU3RyZWFtRXZlbnRDYW5BY2NlcHRCeXRlczoKKyAgICAgICAgTE9HX0VSUk9SKCJ1bmV4
cGVjdGVkIGtDRlN0cmVhbUV2ZW50Q2FuQWNjZXB0Qnl0ZXMiKTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgfQorfQorCit2b2lkIHNldEhUVFBCb2R5KENGTXV0YWJsZVVSTFJlcXVlc3RSZWYgcmVxdWVz
dCwgUGFzc1JlZlB0cjxGb3JtRGF0YT4gcHJwRm9ybURhdGEpCit7CisgICAgUmVmUHRyPEZvcm1E
YXRhPiBmb3JtRGF0YSA9IHBycEZvcm1EYXRhOworCisgICAgaWYgKCFmb3JtRGF0YSkKICAgICAg
ICAgcmV0dXJuOworICAgICAgICAKKyAgICBzaXplX3QgY291bnQgPSBmb3JtRGF0YS0+ZWxlbWVu
dHMoKS5zaXplKCk7CiAKICAgICAvLyBIYW5kbGUgdGhlIGNvbW1vbiBzcGVjaWFsIGNhc2Ugb2Yg
b25lIHBpZWNlIG9mIGZvcm0gZGF0YSwgd2l0aCBubyBmaWxlcy4KLSAgICBpZiAoY291bnQgPT0g
MSkgeworICAgIGlmIChjb3VudCA9PSAxICYmICFmb3JtRGF0YS0+YWx3YXlzU3RyZWFtKCkpIHsK
ICAgICAgICAgY29uc3QgRm9ybURhdGFFbGVtZW50JiBlbGVtZW50ID0gZm9ybURhdGEtPmVsZW1l
bnRzKClbMF07CiAgICAgICAgIGlmIChlbGVtZW50Lm1fdHlwZSA9PSBGb3JtRGF0YUVsZW1lbnQ6
OmRhdGEpIHsKLSAgICAgICAgICAgIENGRGF0YVJlZiBkYXRhID0gQ0ZEYXRhQ3JlYXRlKDAsIHJl
aW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVUludDggKj4oZWxlbWVudC5tX2RhdGEuZGF0YSgpKSwgZWxl
bWVudC5tX2RhdGEuc2l6ZSgpKTsKLSAgICAgICAgICAgIENGVVJMUmVxdWVzdFNldEhUVFBSZXF1
ZXN0Qm9keShyZXF1ZXN0LCBkYXRhKTsKLSAgICAgICAgICAgIENGUmVsZWFzZShkYXRhKTsKKyAg
ICAgICAgICAgIFJldGFpblB0cjxDRkRhdGFSZWY+IGRhdGEgPSBhZG9wdENGKENGRGF0YUNyZWF0
ZSgwLCByZWludGVycHJldF9jYXN0PGNvbnN0IFVJbnQ4ICo+KGVsZW1lbnQubV9kYXRhLmRhdGEo
KSksIGVsZW1lbnQubV9kYXRhLnNpemUoKSkpOworICAgICAgICAgICAgQ0ZVUkxSZXF1ZXN0U2V0
SFRUUFJlcXVlc3RCb2R5KHJlcXVlc3QsIGRhdGEuZ2V0KCkpOwogICAgICAgICAgICAgcmV0dXJu
OwogICAgICAgICB9CiAgICAgfQogCi0gICAgUmV0YWluUHRyPENGTXV0YWJsZUFycmF5UmVmPiBh
cnJheShBZG9wdENGLCBDRkFycmF5Q3JlYXRlTXV0YWJsZSgwLCAwLCAma0NGVHlwZUFycmF5Q2Fs
bEJhY2tzKSk7CisjaWYgRU5BQkxFKEJMT0IpCisgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYSBi
bG9iIGluIHRoZSBmb3JtIGRhdGEuCisgICAgYm9vbCBoYXNCbG9iID0gZmFsc2U7CisgICAgZm9y
IChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgIGNvbnN0IEZvcm1EYXRh
RWxlbWVudCYgZWxlbWVudCA9IGZvcm1EYXRhLT5lbGVtZW50cygpW2ldOworICAgICAgICBpZiAo
ZWxlbWVudC5tX3R5cGUgPT0gRm9ybURhdGFFbGVtZW50OjplbmNvZGVkQmxvYikgeworICAgICAg
ICAgICAgaGFzQmxvYiA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAg
IH0KKworICAgIC8vIElmIHllcywgd2UgaGF2ZSB0byByZXNvbHZlIGFsbCB0aGUgYmxvYiByZWZl
cmVuY2VzIGFuZCByZWdlbmVyYXRlIHRoZSBmb3JtIGRhdGEgd2l0aCBvbmx5IGRhdGEgYW5kIGZp
bGUgdHlwZXMuCisgICAgaWYgKGhhc0Jsb2IpIHsKKyAgICAgICAgUmVmUHRyPEZvcm1EYXRhPiBu
ZXdGb3JtRGF0YSA9IEZvcm1EYXRhOjpjcmVhdGUoKTsKKyAgICAgICAgbmV3Rm9ybURhdGEtPnNl
dEFsd2F5c1N0cmVhbShmb3JtRGF0YS0+YWx3YXlzU3RyZWFtKCkpOworICAgICAgICBuZXdGb3Jt
RGF0YS0+c2V0SWRlbnRpZmllcihmb3JtRGF0YS0+aWRlbnRpZmllcigpKTsKKyAgICAgICAgZm9y
IChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBGb3Jt
RGF0YUVsZW1lbnQmIGVsZW1lbnQgPSBmb3JtRGF0YS0+ZWxlbWVudHMoKVtpXTsKKyAgICAgICAg
ICAgIGlmIChlbGVtZW50Lm1fdHlwZSA9PSBGb3JtRGF0YUVsZW1lbnQ6OmRhdGEpCisgICAgICAg
ICAgICAgICAgbmV3Rm9ybURhdGEtPmFwcGVuZERhdGEoZWxlbWVudC5tX2RhdGEuZGF0YSgpLCBl
bGVtZW50Lm1fZGF0YS5zaXplKCkpOworICAgICAgICAgICAgZWxzZSBpZiAoZWxlbWVudC5tX3R5
cGUgPT0gRm9ybURhdGFFbGVtZW50OjplbmNvZGVkRmlsZSkKKyAgICAgICAgICAgICAgICBuZXdG
b3JtRGF0YS0+YXBwZW5kRmlsZShlbGVtZW50Lm1fZmlsZW5hbWUsIGVsZW1lbnQubV9zaG91bGRH
ZW5lcmF0ZUZpbGUpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgQVNTRVJU
KGVsZW1lbnQubV90eXBlID09IEZvcm1EYXRhRWxlbWVudDo6ZW5jb2RlZEJsb2IpOworICAgICAg
ICAgICAgICAgIFJlZlB0cjxCbG9iU3RvcmFnZURhdGE+IGJsb2JEYXRhID0gc3RhdGljX2Nhc3Q8
QmxvYlJlZ2lzdHJ5SW1wbCY+KGJsb2JSZWdpc3RyeSgpKS5nZXRCbG9iRGF0YUZyb21VUkwoS1VS
TChQYXJzZWRVUkxTdHJpbmcsIGVsZW1lbnQubV9ibG9iVVJMKSk7CisgICAgICAgICAgICAgICAg
aWYgKGJsb2JEYXRhKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBq
IDwgYmxvYkRhdGEtPml0ZW1zKCkuc2l6ZSgpOyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGNvbnN0IEJsb2JEYXRhSXRlbSYgYmxvYkl0ZW0gPSBibG9iRGF0YS0+aXRlbXMoKVtqXTsK
KyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChibG9iSXRlbS50eXBlID09IEJsb2JEYXRhSXRl
bTo6RGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGb3JtRGF0YS0+YXBwZW5k
RGF0YShibG9iSXRlbS5kYXRhLT5kYXRhKCkgKyBzdGF0aWNfY2FzdDxpbnQ+KGJsb2JJdGVtLm9m
ZnNldCksIHN0YXRpY19jYXN0PGludD4oYmxvYkl0ZW0ubGVuZ3RoKSk7CisgICAgICAgICAgICAg
ICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1NFUlQoYmxv
Ykl0ZW0udHlwZSA9PSBCbG9iRGF0YUl0ZW06OkZpbGUpOworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIG5ld0Zvcm1EYXRhLT5hcHBlbmRGaWxlUmFuZ2UoYmxvYkl0ZW0ucGF0aCwgYmxvYkl0
ZW0ub2Zmc2V0LCBibG9iSXRlbS5sZW5ndGgsIGJsb2JJdGVtLmV4cGVjdGVkTW9kaWZpY2F0aW9u
VGltZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9y
bURhdGEgPSBuZXdGb3JtRGF0YS5yZWxlYXNlKCk7CisgICAgICAgIGNvdW50ID0gZm9ybURhdGEt
PmVsZW1lbnRzKCkuc2l6ZSgpOworICAgIH0KKyNlbmRpZgogCisgICAgLy8gUHJlY29tcHV0ZSB0
aGUgY29udGVudCBsZW5ndGggc28gTlNVUkxDb25uZWN0aW9uIGRvZXNuJ3QgdXNlIGNodW5rZWQg
bW9kZS4KKyAgICBsb25nIGxvbmcgbGVuZ3RoID0gMDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsg
aSA8IGNvdW50OyArK2kpIHsKICAgICAgICAgY29uc3QgRm9ybURhdGFFbGVtZW50JiBlbGVtZW50
ID0gZm9ybURhdGEtPmVsZW1lbnRzKClbaV07Ci0gICAgICAgIGlmIChlbGVtZW50Lm1fdHlwZSA9
PSBGb3JtRGF0YUVsZW1lbnQ6OmRhdGEpIHsKLSAgICAgICAgICAgIFJldGFpblB0cjxDRkRhdGFS
ZWY+IGRhdGEoQWRvcHRDRiwgQ0ZEYXRhQ3JlYXRlKDAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qg
VUludDgqPihlbGVtZW50Lm1fZGF0YS5kYXRhKCkpLCBlbGVtZW50Lm1fZGF0YS5zaXplKCkpKTsK
LSAgICAgICAgICAgIENGQXJyYXlBcHBlbmRWYWx1ZShhcnJheS5nZXQoKSwgZGF0YS5nZXQoKSk7
Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBSZXRhaW5QdHI8Q0ZTdHJpbmdSZWY+IGZp
bGVuYW1lKEFkb3B0Q0YsIGVsZW1lbnQubV9maWxlbmFtZS5jcmVhdGVDRlN0cmluZygpKTsKLSAg
ICAgICAgICAgIENGQXJyYXlBcHBlbmRWYWx1ZShhcnJheS5nZXQoKSwgZmlsZW5hbWUuZ2V0KCkp
OworICAgICAgICBpZiAoZWxlbWVudC5tX3R5cGUgPT0gRm9ybURhdGFFbGVtZW50OjpkYXRhKQor
ICAgICAgICAgICAgbGVuZ3RoICs9IGVsZW1lbnQubV9kYXRhLnNpemUoKTsKKyAgICAgICAgZWxz
ZSB7CisjaWYgRU5BQkxFKEJMT0IpCisgICAgICAgICAgICAvLyBJZiB3ZSdyZSBzZW5kaW5nIHRo
ZSBmaWxlIHJhbmdlLCB1c2UgdGhlIGV4aXN0aW5nIHJhbmdlIGxlbmd0aCBmb3Igbm93LiBXZSB3
aWxsIGRldGVjdCBpZiB0aGUgZmlsZSBoYXMgYmVlbiBjaGFuZ2VkIHJpZ2h0IGJlZm9yZSB3ZSBy
ZWFkIHRoZSBmaWxlIGFuZCBhYm9ydCB0aGUgb3BlcmF0aW9uIGlmIG5lY2Vzc2FyeS4KKyAgICAg
ICAgICAgIGlmIChlbGVtZW50Lm1fZmlsZUxlbmd0aCAhPSBCbG9iRGF0YUl0ZW06OnRvRW5kT2ZG
aWxlKSB7CisgICAgICAgICAgICAgICAgbGVuZ3RoICs9IGVsZW1lbnQubV9maWxlTGVuZ3RoOwor
ICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAg
ICAgICBsb25nIGxvbmcgZmlsZVNpemU7CisgICAgICAgICAgICBpZiAoZ2V0RmlsZVNpemUoZWxl
bWVudC5tX3Nob3VsZEdlbmVyYXRlRmlsZSA/IGVsZW1lbnQubV9nZW5lcmF0ZWRGaWxlbmFtZSA6
IGVsZW1lbnQubV9maWxlbmFtZSwgZmlsZVNpemUpKQorICAgICAgICAgICAgICAgIGxlbmd0aCAr
PSBmaWxlU2l6ZTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHdrQ0ZVUkxSZXF1ZXN0U2V0SFRU
UFJlcXVlc3RCb2R5UGFydHMocmVxdWVzdCwgYXJyYXkuZ2V0KCkpOworICAgIC8vIFNldCB0aGUg
bGVuZ3RoLgorICAgIFJldGFpblB0cjxDRlN0cmluZ1JlZj4gbGVuZ3RoU3RyaW5nID0gYWRvcHRD
RihDRlN0cmluZ0NyZWF0ZVdpdGhGb3JtYXQoMCwgMCwgQ0ZTVFIoIiVsbGQiKSwgbGVuZ3RoKSk7
CisgICAgQ0ZVUkxSZXF1ZXN0U2V0SFRUUEhlYWRlckZpZWxkVmFsdWUocmVxdWVzdCwgQ0ZTVFIo
IkNvbnRlbnQtTGVuZ3RoIiksIGxlbmd0aFN0cmluZy5nZXQoKSk7CisKKyAgICAvLyBDcmVhdGUg
YW5kIHNldCB0aGUgc3RyZWFtLgorCisgICAgLy8gUGFzcyB0aGUgbGVuZ3RoIGFsb25nIHdpdGgg
dGhlIGZvcm1EYXRhIHNvIGl0IGRvZXMgbm90IGhhdmUgdG8gYmUgcmVjb21wdXRlZC4KKyAgICBG
b3JtQ29udGV4dCBmb3JtQ29udGV4dCA9IHsgZm9ybURhdGEucmVsZWFzZSgpLCBsZW5ndGggfTsK
KworICAgIENGUmVhZFN0cmVhbUNhbGxCYWNrc1YxIGNhbGxCYWNrcyA9IHsgMSwgZm9ybUNyZWF0
ZSwgZm9ybUZpbmFsaXplLCAwLCBmb3JtT3BlbiwgMCwgZm9ybVJlYWQsIDAsIGZvcm1DYW5SZWFk
LCBmb3JtQ2xvc2UsIDAsIDAsIDAsIGZvcm1TY2hlZHVsZSwgZm9ybVVuc2NoZWR1bGUKKyAgICB9
OworICAgIFJldGFpblB0cjxDRlJlYWRTdHJlYW1SZWY+IHN0cmVhbSA9IGFkb3B0Q0YoQ0ZSZWFk
U3RyZWFtQ3JlYXRlKDAsIHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqPigmY2FsbEJhY2tzKSwgJmZv
cm1Db250ZXh0KSk7CisKKyAgICBDRlVSTFJlcXVlc3RTZXRIVFRQUmVxdWVzdEJvZHlTdHJlYW0o
cmVxdWVzdCwgc3RyZWFtLmdldCgpKTsKIH0KIAotUGFzc1JlZlB0cjxGb3JtRGF0YT4gaHR0cEJv
ZHlGcm9tUmVxdWVzdChDRlVSTFJlcXVlc3RSZWYgcmVxdWVzdCkKK0Zvcm1EYXRhKiBodHRwQm9k
eUZyb21TdHJlYW0oQ0ZSZWFkU3RyZWFtUmVmIHN0cmVhbSkKIHsKLSAgICBSZXRhaW5QdHI8Q0ZE
YXRhUmVmPiBib2R5RGF0YShBZG9wdENGLCBDRlVSTFJlcXVlc3RDb3B5SFRUUFJlcXVlc3RCb2R5
KHJlcXVlc3QpKTsKLSAgICBpZiAoYm9keURhdGEpCi0gICAgICAgIHJldHVybiBGb3JtRGF0YTo6
Y3JlYXRlKENGRGF0YUdldEJ5dGVQdHIoYm9keURhdGEuZ2V0KCkpLCBDRkRhdGFHZXRMZW5ndGgo
Ym9keURhdGEuZ2V0KCkpKTsKLQotICAgIFJldGFpblB0cjxDRkFycmF5UmVmPiBib2R5UGFydHMo
QWRvcHRDRiwgd2tDRlVSTFJlcXVlc3RDb3B5SFRUUFJlcXVlc3RCb2R5UGFydHMocmVxdWVzdCkp
OwotICAgIGlmIChib2R5UGFydHMpIHsKLSAgICAgICAgUmVmUHRyPEZvcm1EYXRhPiBmb3JtRGF0
YSA9IEZvcm1EYXRhOjpjcmVhdGUoKTsKLQotICAgICAgICBDRkluZGV4IGNvdW50ID0gQ0ZBcnJh
eUdldENvdW50KGJvZHlQYXJ0cy5nZXQoKSk7Ci0gICAgICAgIGZvciAoQ0ZJbmRleCBpID0gMDsg
aSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIENGVHlwZVJlZiBib2R5UGFydCA9IENGQXJy
YXlHZXRWYWx1ZUF0SW5kZXgoYm9keVBhcnRzLmdldCgpLCBpKTsKLSAgICAgICAgICAgIENGVHlw
ZUlEIHR5cGVJRCA9IENGR2V0VHlwZUlEKGJvZHlQYXJ0KTsKLSAgICAgICAgICAgIGlmICh0eXBl
SUQgPT0gQ0ZTdHJpbmdHZXRUeXBlSUQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBmaWxl
bmFtZSA9IChDRlN0cmluZ1JlZilib2R5UGFydDsKLSAgICAgICAgICAgICAgICBmb3JtRGF0YS0+
YXBwZW5kRmlsZShmaWxlbmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVJRCA9PSBD
RkRhdGFHZXRUeXBlSUQoKSkgewotICAgICAgICAgICAgICAgIENGRGF0YVJlZiBkYXRhID0gKENG
RGF0YVJlZilib2R5UGFydDsKLSAgICAgICAgICAgICAgICBmb3JtRGF0YS0+YXBwZW5kRGF0YShD
RkRhdGFHZXRCeXRlUHRyKGRhdGEpLCBDRkRhdGFHZXRMZW5ndGgoZGF0YSkpOwotICAgICAgICAg
ICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAg
IH0KLSAgICAgICAgcmV0dXJuIGZvcm1EYXRhLnJlbGVhc2UoKTsKLSAgICB9CisgICAgaWYgKCFz
dHJlYW0pCisgICAgICAgIHJldHVybiAwOwogCi0gICAgLy8gRklYTUU6IHdoYXQgdG8gZG8gYWJv
dXQgYXJiaXRyYXJ5IGJvZHkgc3RyZWFtcz8KLSAgICByZXR1cm4gMDsKKyAgICBNdXRleExvY2tl
ciBsb2NrZXIoc3RyZWFtRmllbGRzTWFwTXV0ZXgoKSk7CisgICAgRm9ybVN0cmVhbUZpZWxkcyog
Zm9ybVN0cmVhbSA9IHN0cmVhbUZpZWxkc01hcCgpLmdldChzdHJlYW0pOworICAgIGlmICghZm9y
bVN0cmVhbSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGZvcm1TdHJlYW0tPmZvcm1E
YXRhLmdldCgpOwogfQogCi19IC8vIG5hbWVzcGFjZSBXZWJDb3JlCitQYXNzUmVmUHRyPEZvcm1E
YXRhPiBodHRwQm9keUZyb21SZXF1ZXN0KENGVVJMUmVxdWVzdFJlZiByZXF1ZXN0KQoreworICAg
IFJldGFpblB0cjxDRlJlYWRTdHJlYW1SZWY+IGJvZHlTdHJlYW0gPSBhZG9wdENGKENGVVJMUmVx
dWVzdENvcHlIVFRQUmVxdWVzdEJvZHlTdHJlYW0ocmVxdWVzdCkpOworICAgIHJldHVybiBodHRw
Qm9keUZyb21TdHJlYW0oYm9keVN0cmVhbS5nZXQoKSk7Cit9CiAKLSNlbmRpZiAvLyBVU0UoQ0ZO
RVRXT1JLKQorfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vbmV0d29yay9jZi9Gb3JtRGF0YVN0cmVhbUNGTmV0LmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jZi9Gb3JtRGF0YVN0cmVhbUNGTmV0LmgJKHJl
dmlzaW9uIDExMjE2NikKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY2YvRm9y
bURhdGFTdHJlYW1DRk5ldC5oCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAq
IENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA3LCAyMDEyIEFwcGxlIElu
Yy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
QEAgLTI5LDIwICsyOSwyMCBAQAogI2lmbmRlZiBGb3JtRGF0YVN0cmVhbUNGTmV0X2gKICNkZWZp
bmUgRm9ybURhdGFTdHJlYW1DRk5ldF9oCiAKLSNpZiBVU0UoQ0ZORVRXT1JLKQotCi0jaW5jbHVk
ZSA8Q29yZUZvdW5kYXRpb24vQ29yZUZvdW5kYXRpb24uaD4KICNpbmNsdWRlIDx3dGYvRm9yd2Fy
ZC5oPgogCiB0eXBlZGVmIHN0cnVjdCBfQ0ZVUkxSZXF1ZXN0KiBDRk11dGFibGVVUkxSZXF1ZXN0
UmVmOwogdHlwZWRlZiBjb25zdCBzdHJ1Y3QgX0NGVVJMUmVxdWVzdCogQ0ZVUkxSZXF1ZXN0UmVm
OwogCiBuYW1lc3BhY2UgV2ViQ29yZSB7Ci0gICAgY2xhc3MgRm9ybURhdGE7Ci0gICAgdm9pZCBz
ZXRIVFRQQm9keShDRk11dGFibGVVUkxSZXF1ZXN0UmVmLCBQYXNzUmVmUHRyPEZvcm1EYXRhPik7
Ci0gICAgUGFzc1JlZlB0cjxGb3JtRGF0YT4gaHR0cEJvZHlGcm9tUmVxdWVzdChDRlVSTFJlcXVl
c3RSZWYpOwotfQogCi0jZW5kaWYgLy8gVVNFKENGTkVUV09SSykKK2NsYXNzIEZvcm1EYXRhOwor
Cit2b2lkIHNldEhUVFBCb2R5KENGTXV0YWJsZVVSTFJlcXVlc3RSZWYsIFBhc3NSZWZQdHI8Rm9y
bURhdGE+KTsKK1Bhc3NSZWZQdHI8Rm9ybURhdGE+IGh0dHBCb2R5RnJvbVJlcXVlc3QoQ0ZVUkxS
ZXF1ZXN0UmVmKTsKKworRm9ybURhdGEqIGh0dHBCb2R5RnJvbVN0cmVhbShDRlJlYWRTdHJlYW1S
ZWYpOworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCiAKICNlbmRpZiAvLyBGb3JtRGF0YVN0cmVh
bUNGTmV0X2gKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvbWFjL0Zvcm1E
YXRhU3RyZWFtTWFjLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0
d29yay9tYWMvRm9ybURhdGFTdHJlYW1NYWMuaAkocmV2aXNpb24gMTEyMTY2KQorKysgU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9tYWMvRm9ybURhdGFTdHJlYW1NYWMuaAkod29ya2lu
ZyBjb3B5KQpAQCAtMzEsOCArMzEsOSBAQAogCiAjaWYgIVVTRShDRk5FVFdPUkspCiAKLSNpbmNs
dWRlICJGb3JtRGF0YS5oIgorI2luY2x1ZGUgPHd0Zi9Gb3J3YXJkLmg+CiAKK0BjbGFzcyBOU0lu
cHV0U3RyZWFtOwogQGNsYXNzIE5TTXV0YWJsZVVSTFJlcXVlc3Q7CiAKIG5hbWVzcGFjZSBXZWJD
b3JlIHsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvbWFjL0Zvcm1EYXRh
U3RyZWFtTWFjLm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdv
cmsvbWFjL0Zvcm1EYXRhU3RyZWFtTWFjLm1tCShyZXZpc2lvbiAxMTIzMDIpCisrKyBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL21hYy9Gb3JtRGF0YVN0cmVhbU1hYy5tbQkod29ya2lu
ZyBjb3B5KQpAQCAtMzEsNDE1ICszMSwyNCBAQAogCiAjaWYgIVVTRShDRk5FVFdPUkspCiAKLSNp
bXBvcnQgIkJsb2JSZWdpc3RyeUltcGwuaCIKLSNpbXBvcnQgIkZpbGVTeXN0ZW0uaCIKICNpbXBv
cnQgIkZvcm1EYXRhLmgiCi0jaW1wb3J0ICJTY2hlZHVsZVBhaXIuaCIKLSNpbXBvcnQgIldlYkNv
cmVTeXN0ZW1JbnRlcmZhY2UuaCIKLSNpbXBvcnQgPHN5cy9zdGF0Lmg+Ci0jaW1wb3J0IDxzeXMv
dHlwZXMuaD4KLSNpbXBvcnQgPHd0Zi9Bc3NlcnRpb25zLmg+Ci0jaW1wb3J0IDx3dGYvTWFpblRo
cmVhZC5oPgotI2ltcG9ydCA8d3RmL1N0ZExpYkV4dHJhcy5oPgotI2ltcG9ydCA8d3RmL1RocmVh
ZGluZy5oPgorI2ltcG9ydCAiRm9ybURhdGFTdHJlYW1DRk5ldC5oIgorI2ltcG9ydCA8d3RmL1Bh
c3NSZWZQdHIuaD4KIAotI2lmIFBMQVRGT1JNKElPUykKLSNpbXBvcnQgPE1hY0Vycm9ycy5oPgot
I2Vsc2UKLSNpbXBvcnQgPENvcmVTZXJ2aWNlcy9Db3JlU2VydmljZXMuaD4KLSNlbmRpZgorQGlu
dGVyZmFjZSBOU1VSTFJlcXVlc3QgKFdlYk5TVVJMUmVxdWVzdERldGFpbHMpCistIChDRlVSTFJl
cXVlc3RSZWYpX0NGVVJMUmVxdWVzdDsKK0BlbmQKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1z
dGF0aWMgTXV0ZXgmIHN0cmVhbUZpZWxkc01hcE11dGV4KCkKLXsKLSAgICBERUZJTkVfU1RBVElD
X0xPQ0FMKE11dGV4LCBzdGF0aWNNdXRleCwgKCkpOwotICAgIHJldHVybiBzdGF0aWNNdXRleDsK
LX0KLQotc3RhdGljIHZvaWQgZm9ybUV2ZW50Q2FsbGJhY2soQ0ZSZWFkU3RyZWFtUmVmIHN0cmVh
bSwgQ0ZTdHJlYW1FdmVudFR5cGUgdHlwZSwgdm9pZCogY29udGV4dCk7Ci0KLXN0cnVjdCBGb3Jt
Q29udGV4dCB7Ci0gICAgUmVmUHRyPEZvcm1EYXRhPiBmb3JtRGF0YTsKLSAgICB1bnNpZ25lZCBs
b25nIGxvbmcgc3RyZWFtTGVuZ3RoOwotfTsKLQotc3RydWN0IEZvcm1TdHJlYW1GaWVsZHMgewot
ICAgIFJlZlB0cjxGb3JtRGF0YT4gZm9ybURhdGE7Ci0gICAgU2NoZWR1bGVQYWlySGFzaFNldCBz
Y2hlZHVsZWRSdW5Mb29wUGFpcnM7Ci0gICAgVmVjdG9yPEZvcm1EYXRhRWxlbWVudD4gcmVtYWlu
aW5nRWxlbWVudHM7IC8vIGluIHJldmVyc2Ugb3JkZXIKLSAgICBDRlJlYWRTdHJlYW1SZWYgY3Vy
cmVudFN0cmVhbTsKLSNpZiBFTkFCTEUoQkxPQikKLSAgICBsb25nIGxvbmcgY3VycmVudFN0cmVh
bVJhbmdlTGVuZ3RoOwotI2VuZGlmCi0gICAgY2hhciogY3VycmVudERhdGE7Ci0gICAgQ0ZSZWFk
U3RyZWFtUmVmIGZvcm1TdHJlYW07Ci0gICAgdW5zaWduZWQgbG9uZyBsb25nIHN0cmVhbUxlbmd0
aDsKLSAgICB1bnNpZ25lZCBsb25nIGxvbmcgYnl0ZXNTZW50OwotfTsKLQotdHlwZWRlZiBIYXNo
TWFwPENGUmVhZFN0cmVhbVJlZiwgRm9ybVN0cmVhbUZpZWxkcyo+IFN0cmVhbUZpZWxkc01hcDsK
LXN0YXRpYyBTdHJlYW1GaWVsZHNNYXAmIHN0cmVhbUZpZWxkc01hcCgpCi17Ci0gICAgREVGSU5F
X1NUQVRJQ19MT0NBTChTdHJlYW1GaWVsZHNNYXAsIHN0cmVhbUZpZWxkc01hcCwgKCkpOwotICAg
IHJldHVybiBzdHJlYW1GaWVsZHNNYXA7Ci19Ci0KLXN0YXRpYyB2b2lkIGNsb3NlQ3VycmVudFN0
cmVhbShGb3JtU3RyZWFtRmllbGRzICpmb3JtKQotewotICAgIGlmIChmb3JtLT5jdXJyZW50U3Ry
ZWFtKSB7Ci0gICAgICAgIENGUmVhZFN0cmVhbUNsb3NlKGZvcm0tPmN1cnJlbnRTdHJlYW0pOwot
ICAgICAgICBDRlJlYWRTdHJlYW1TZXRDbGllbnQoZm9ybS0+Y3VycmVudFN0cmVhbSwga0NGU3Ry
ZWFtRXZlbnROb25lLCBOVUxMLCBOVUxMKTsKLSAgICAgICAgQ0ZSZWxlYXNlKGZvcm0tPmN1cnJl
bnRTdHJlYW0pOwotICAgICAgICBmb3JtLT5jdXJyZW50U3RyZWFtID0gTlVMTDsKLSNpZiBFTkFC
TEUoQkxPQikKLSAgICAgICAgZm9ybS0+Y3VycmVudFN0cmVhbVJhbmdlTGVuZ3RoID0gQmxvYkRh
dGFJdGVtOjp0b0VuZE9mRmlsZTsKLSNlbmRpZgotICAgIH0KLSAgICBpZiAoZm9ybS0+Y3VycmVu
dERhdGEpIHsKLSAgICAgICAgZmFzdEZyZWUoZm9ybS0+Y3VycmVudERhdGEpOwotICAgICAgICBm
b3JtLT5jdXJyZW50RGF0YSA9IDA7Ci0gICAgfQotfQotCi0vLyBSZXR1cm4gZmFsc2UgaWYgd2Ug
Y2Fubm90IGFkdmFuY2UgdGhlIHN0cmVhbS4gQ3VycmVudGx5IHRoZSBvbmx5IHBvc3NpYmxlIGZh
aWx1cmUgaXMgdGhhdCB0aGUgdW5kZXJseWluZyBmaWxlIGhhcyBiZWVuIHJlbW92ZWQgb3IgY2hh
bmdlZCBzaW5jZSBGaWxlLnNsaWNlLgotc3RhdGljIGJvb2wgYWR2YW5jZUN1cnJlbnRTdHJlYW0o
Rm9ybVN0cmVhbUZpZWxkcyogZm9ybSkKLXsKLSAgICBjbG9zZUN1cnJlbnRTdHJlYW0oZm9ybSk7
Ci0KLSAgICBpZiAoZm9ybS0+cmVtYWluaW5nRWxlbWVudHMuaXNFbXB0eSgpKQotICAgICAgICBy
ZXR1cm4gdHJ1ZTsKLQotICAgIC8vIENyZWF0ZSB0aGUgbmV3IHN0cmVhbS4KLSAgICBGb3JtRGF0
YUVsZW1lbnQmIG5leHRJbnB1dCA9IGZvcm0tPnJlbWFpbmluZ0VsZW1lbnRzLmxhc3QoKTsKLQot
ICAgIGlmIChuZXh0SW5wdXQubV90eXBlID09IEZvcm1EYXRhRWxlbWVudDo6ZGF0YSkgewotICAg
ICAgICBzaXplX3Qgc2l6ZSA9IG5leHRJbnB1dC5tX2RhdGEuc2l6ZSgpOwotICAgICAgICBjaGFy
KiBkYXRhID0gbmV4dElucHV0Lm1fZGF0YS5yZWxlYXNlQnVmZmVyKCk7Ci0gICAgICAgIGZvcm0t
PmN1cnJlbnRTdHJlYW0gPSBDRlJlYWRTdHJlYW1DcmVhdGVXaXRoQnl0ZXNOb0NvcHkoMCwgcmVp
bnRlcnByZXRfY2FzdDxjb25zdCBVSW50OCo+KGRhdGEpLCBzaXplLCBrQ0ZBbGxvY2F0b3JOdWxs
KTsKLSAgICAgICAgZm9ybS0+Y3VycmVudERhdGEgPSBkYXRhOwotICAgIH0gZWxzZSB7Ci0jaWYg
RU5BQkxFKEJMT0IpCi0gICAgICAgIC8vIENoZWNrIGlmIHRoZSBmaWxlIGhhcyBiZWVuIGNoYW5n
ZWQgb3Igbm90IGlmIHJlcXVpcmVkLgotICAgICAgICBpZiAobmV4dElucHV0Lm1fZXhwZWN0ZWRG
aWxlTW9kaWZpY2F0aW9uVGltZSAhPSBCbG9iRGF0YUl0ZW06OmRvTm90Q2hlY2tGaWxlQ2hhbmdl
KSB7Ci0gICAgICAgICAgICB0aW1lX3QgZmlsZU1vZGlmaWNhdGlvblRpbWU7Ci0gICAgICAgICAg
ICBpZiAoIWdldEZpbGVNb2RpZmljYXRpb25UaW1lKG5leHRJbnB1dC5tX2ZpbGVuYW1lLCBmaWxl
TW9kaWZpY2F0aW9uVGltZSkgfHwgZmlsZU1vZGlmaWNhdGlvblRpbWUgIT0gc3RhdGljX2Nhc3Q8
dGltZV90PihuZXh0SW5wdXQubV9leHBlY3RlZEZpbGVNb2RpZmljYXRpb25UaW1lKSkKLSAgICAg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgICAgICBjb25z
dCBTdHJpbmcmIHBhdGggPSBuZXh0SW5wdXQubV9zaG91bGRHZW5lcmF0ZUZpbGUgPyBuZXh0SW5w
dXQubV9nZW5lcmF0ZWRGaWxlbmFtZSA6IG5leHRJbnB1dC5tX2ZpbGVuYW1lOwotICAgICAgICBm
b3JtLT5jdXJyZW50U3RyZWFtID0gQ0ZSZWFkU3RyZWFtQ3JlYXRlV2l0aEZpbGUoMCwgcGF0aEFz
VVJMKHBhdGgpLmdldCgpKTsKLSAgICAgICAgaWYgKCFmb3JtLT5jdXJyZW50U3RyZWFtKSB7Ci0g
ICAgICAgICAgICAvLyBUaGUgZmlsZSBtdXN0IGhhdmUgYmVlbiByZW1vdmVkIG9yIGJlY29tZSB1
bnJlYWRhYmxlLgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0jaWYgRU5B
QkxFKEJMT0IpCi0gICAgICAgIGlmIChuZXh0SW5wdXQubV9maWxlU3RhcnQgPiAwKSB7Ci0gICAg
ICAgICAgICBSZXRhaW5QdHI8Q0ZOdW1iZXJSZWY+IHBvc2l0aW9uKEFkb3B0Q0YsIENGTnVtYmVy
Q3JlYXRlKDAsIGtDRk51bWJlckxvbmdMb25nVHlwZSwgJm5leHRJbnB1dC5tX2ZpbGVTdGFydCkp
OwotICAgICAgICAgICAgQ0ZSZWFkU3RyZWFtU2V0UHJvcGVydHkoZm9ybS0+Y3VycmVudFN0cmVh
bSwga0NGU3RyZWFtUHJvcGVydHlGaWxlQ3VycmVudE9mZnNldCwgcG9zaXRpb24uZ2V0KCkpOwot
ICAgICAgICB9Ci0gICAgICAgIGZvcm0tPmN1cnJlbnRTdHJlYW1SYW5nZUxlbmd0aCA9IG5leHRJ
bnB1dC5tX2ZpbGVMZW5ndGg7Ci0jZW5kaWYKLSAgICB9Ci0gICAgZm9ybS0+cmVtYWluaW5nRWxl
bWVudHMucmVtb3ZlTGFzdCgpOwotCi0gICAgLy8gU2V0IHVwIHRoZSBjYWxsYmFjay4KLSAgICBD
RlN0cmVhbUNsaWVudENvbnRleHQgY29udGV4dCA9IHsgMCwgZm9ybSwgTlVMTCwgTlVMTCwgTlVM
TCB9OwotICAgIENGUmVhZFN0cmVhbVNldENsaWVudChmb3JtLT5jdXJyZW50U3RyZWFtLCBrQ0ZT
dHJlYW1FdmVudEhhc0J5dGVzQXZhaWxhYmxlIHwga0NGU3RyZWFtRXZlbnRFcnJvck9jY3VycmVk
IHwga0NGU3RyZWFtRXZlbnRFbmRFbmNvdW50ZXJlZCwKLSAgICAgICAgZm9ybUV2ZW50Q2FsbGJh
Y2ssICZjb250ZXh0KTsKLQotICAgIC8vIFNjaGVkdWxlIHdpdGggdGhlIGN1cnJlbnQgc2V0IG9m
IHJ1biBsb29wcy4KLSAgICBTY2hlZHVsZVBhaXJIYXNoU2V0OjppdGVyYXRvciBlbmQgPSBmb3Jt
LT5zY2hlZHVsZWRSdW5Mb29wUGFpcnMuZW5kKCk7Ci0gICAgZm9yIChTY2hlZHVsZVBhaXJIYXNo
U2V0OjppdGVyYXRvciBpdCA9IGZvcm0tPnNjaGVkdWxlZFJ1bkxvb3BQYWlycy5iZWdpbigpOyBp
dCAhPSBlbmQ7ICsraXQpCi0gICAgICAgIENGUmVhZFN0cmVhbVNjaGVkdWxlV2l0aFJ1bkxvb3Ao
Zm9ybS0+Y3VycmVudFN0cmVhbSwgKCppdCktPnJ1bkxvb3AoKSwgKCppdCktPm1vZGUoKSk7Ci0K
LSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgb3Blbk5leHRTdHJlYW0oRm9ybVN0
cmVhbUZpZWxkcyogZm9ybSkKLXsKLSAgICAvLyBTa2lwIG92ZXIgYW55IHN0cmVhbXMgd2UgY2Fu
J3Qgb3Blbi4KLSAgICBpZiAoIWFkdmFuY2VDdXJyZW50U3RyZWFtKGZvcm0pKQotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgd2hpbGUgKGZvcm0tPmN1cnJlbnRTdHJlYW0gJiYgIUNGUmVhZFN0
cmVhbU9wZW4oZm9ybS0+Y3VycmVudFN0cmVhbSkpIHsKLSAgICAgICAgaWYgKCFhZHZhbmNlQ3Vy
cmVudFN0cmVhbShmb3JtKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAg
cmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkKiBmb3JtQ3JlYXRlKENGUmVhZFN0cmVhbVJl
ZiBzdHJlYW0sIHZvaWQqIGNvbnRleHQpCi17Ci0gICAgRm9ybUNvbnRleHQqIGZvcm1Db250ZXh0
ID0gc3RhdGljX2Nhc3Q8Rm9ybUNvbnRleHQqPihjb250ZXh0KTsKLQotICAgIEZvcm1TdHJlYW1G
aWVsZHMqIG5ld0luZm8gPSBuZXcgRm9ybVN0cmVhbUZpZWxkczsKLSAgICBuZXdJbmZvLT5mb3Jt
RGF0YSA9IGZvcm1Db250ZXh0LT5mb3JtRGF0YS5yZWxlYXNlKCk7Ci0gICAgbmV3SW5mby0+Y3Vy
cmVudFN0cmVhbSA9IE5VTEw7Ci0jaWYgRU5BQkxFKEJMT0IpCi0gICAgbmV3SW5mby0+Y3VycmVu
dFN0cmVhbVJhbmdlTGVuZ3RoID0gQmxvYkRhdGFJdGVtOjp0b0VuZE9mRmlsZTsKLSNlbmRpZgot
ICAgIG5ld0luZm8tPmN1cnJlbnREYXRhID0gMDsKLSAgICBuZXdJbmZvLT5mb3JtU3RyZWFtID0g
c3RyZWFtOyAvLyBEb24ndCByZXRhaW4uIFRoYXQgd291bGQgY3JlYXRlIGEgcmVmZXJlbmNlIGN5
Y2xlLgotICAgIG5ld0luZm8tPnN0cmVhbUxlbmd0aCA9IGZvcm1Db250ZXh0LT5zdHJlYW1MZW5n
dGg7Ci0gICAgbmV3SW5mby0+Ynl0ZXNTZW50ID0gMDsKLQotICAgIC8vIEFwcGVuZCBpbiByZXZl
cnNlIG9yZGVyIHNpbmNlIHdlIHJlbW92ZSBlbGVtZW50cyBmcm9tIHRoZSBlbmQuCi0gICAgc2l6
ZV90IHNpemUgPSBuZXdJbmZvLT5mb3JtRGF0YS0+ZWxlbWVudHMoKS5zaXplKCk7Ci0gICAgbmV3
SW5mby0+cmVtYWluaW5nRWxlbWVudHMucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShzaXplKTsKLSAg
ICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkKLSAgICAgICAgbmV3SW5mby0+cmVt
YWluaW5nRWxlbWVudHMuYXBwZW5kKG5ld0luZm8tPmZvcm1EYXRhLT5lbGVtZW50cygpW3NpemUg
LSBpIC0gMV0pOwotCi0gICAgTXV0ZXhMb2NrZXIgbG9ja2VyKHN0cmVhbUZpZWxkc01hcE11dGV4
KCkpOwotICAgIEFTU0VSVCghc3RyZWFtRmllbGRzTWFwKCkuY29udGFpbnMoc3RyZWFtKSk7Ci0g
ICAgc3RyZWFtRmllbGRzTWFwKCkuYWRkKHN0cmVhbSwgbmV3SW5mbyk7Ci0KLSAgICByZXR1cm4g
bmV3SW5mbzsKLX0KLQotc3RhdGljIHZvaWQgZm9ybUZpbmlzaEZpbmFsaXphdGlvbk9uTWFpblRo
cmVhZCh2b2lkKiBjb250ZXh0KQotewotICAgIE93blB0cjxGb3JtU3RyZWFtRmllbGRzPiBmb3Jt
ID0gYWRvcHRQdHIoc3RhdGljX2Nhc3Q8Rm9ybVN0cmVhbUZpZWxkcyo+KGNvbnRleHQpKTsKLQot
ICAgIGNsb3NlQ3VycmVudFN0cmVhbShmb3JtLmdldCgpKTsKLX0KLQotc3RhdGljIHZvaWQgZm9y
bUZpbmFsaXplKENGUmVhZFN0cmVhbVJlZiBzdHJlYW0sIHZvaWQqIGNvbnRleHQpCi17Ci0gICAg
Rm9ybVN0cmVhbUZpZWxkcyogZm9ybSA9IHN0YXRpY19jYXN0PEZvcm1TdHJlYW1GaWVsZHMqPihj
b250ZXh0KTsKLQotICAgIE11dGV4TG9ja2VyIGxvY2tlcihzdHJlYW1GaWVsZHNNYXBNdXRleCgp
KTsKLQotICAgIEFTU0VSVChmb3JtLT5mb3JtU3RyZWFtID09IHN0cmVhbSk7Ci0gICAgQVNTRVJU
KHN0cmVhbUZpZWxkc01hcCgpLmdldChzdHJlYW0pID09IGNvbnRleHQpOwotCi0gICAgLy8gRG8g
dGhpcyByaWdodCBhd2F5IGJlY2F1c2UgdGhlIENGUmVhZFN0cmVhbVJlZiBpcyBiZWluZyBkZWFs
bG9jYXRlZC4KLSAgICAvLyBXZSBjYW4ndCB3YWl0IHRvIHJlbW92ZSB0aGlzIGZyb20gdGhlIG1h
cCB1bnRpbCB3ZSBmaW5pc2ggZmluYWxpemluZwotICAgIC8vIG9uIHRoZSBtYWluIHRocmVhZCBi
ZWNhdXNlIGluIHRoZW9yeSB0aGUgZnJlZWQgbWVtb3J5IGNvdWxkIGJlIHJldXNlZAotICAgIC8v
IGZvciBhIG5ldyBDRlJlYWRTdHJlYW0gYmVmb3JlIHRoYXQgcnVucy4KLSAgICBzdHJlYW1GaWVs
ZHNNYXAoKS5yZW1vdmUoc3RyZWFtKTsKLQotICAgIGNhbGxPbk1haW5UaHJlYWQoZm9ybUZpbmlz
aEZpbmFsaXphdGlvbk9uTWFpblRocmVhZCwgZm9ybSk7Ci19Ci0KLXN0YXRpYyBCb29sZWFuIGZv
cm1PcGVuKENGUmVhZFN0cmVhbVJlZiwgQ0ZTdHJlYW1FcnJvciogZXJyb3IsIEJvb2xlYW4qIG9w
ZW5Db21wbGV0ZSwgdm9pZCogY29udGV4dCkKLXsKLSAgICBGb3JtU3RyZWFtRmllbGRzKiBmb3Jt
ID0gc3RhdGljX2Nhc3Q8Rm9ybVN0cmVhbUZpZWxkcyo+KGNvbnRleHQpOwotCi0gICAgYm9vbCBv
cGVuZWQgPSBvcGVuTmV4dFN0cmVhbShmb3JtKTsKLQotICAgICpvcGVuQ29tcGxldGUgPSBvcGVu
ZWQ7Ci0gICAgZXJyb3ItPmVycm9yID0gb3BlbmVkID8gMCA6IGZuZkVycjsKLSAgICByZXR1cm4g
b3BlbmVkOwotfQotCi1zdGF0aWMgQ0ZJbmRleCBmb3JtUmVhZChDRlJlYWRTdHJlYW1SZWYsIFVJ
bnQ4KiBidWZmZXIsIENGSW5kZXggYnVmZmVyTGVuZ3RoLCBDRlN0cmVhbUVycm9yKiBlcnJvciwg
Qm9vbGVhbiogYXRFT0YsIHZvaWQqIGNvbnRleHQpCi17Ci0gICAgRm9ybVN0cmVhbUZpZWxkcyog
Zm9ybSA9IHN0YXRpY19jYXN0PEZvcm1TdHJlYW1GaWVsZHMqPihjb250ZXh0KTsKLQotICAgIHdo
aWxlIChmb3JtLT5jdXJyZW50U3RyZWFtKSB7Ci0gICAgICAgIENGSW5kZXggYnl0ZXNUb1JlYWQg
PSBidWZmZXJMZW5ndGg7Ci0jaWYgRU5BQkxFKEJMT0IpCi0gICAgICAgIGlmIChmb3JtLT5jdXJy
ZW50U3RyZWFtUmFuZ2VMZW5ndGggIT0gQmxvYkRhdGFJdGVtOjp0b0VuZE9mRmlsZSAmJiBmb3Jt
LT5jdXJyZW50U3RyZWFtUmFuZ2VMZW5ndGggPCBieXRlc1RvUmVhZCkKLSAgICAgICAgICAgIGJ5
dGVzVG9SZWFkID0gc3RhdGljX2Nhc3Q8Q0ZJbmRleD4oZm9ybS0+Y3VycmVudFN0cmVhbVJhbmdl
TGVuZ3RoKTsKLSNlbmRpZgotICAgICAgICBDRkluZGV4IGJ5dGVzUmVhZCA9IENGUmVhZFN0cmVh
bVJlYWQoZm9ybS0+Y3VycmVudFN0cmVhbSwgYnVmZmVyLCBieXRlc1RvUmVhZCk7Ci0gICAgICAg
IGlmIChieXRlc1JlYWQgPCAwKSB7Ci0gICAgICAgICAgICAqZXJyb3IgPSBDRlJlYWRTdHJlYW1H
ZXRFcnJvcihmb3JtLT5jdXJyZW50U3RyZWFtKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAg
ICAgICAgfQotICAgICAgICBpZiAoYnl0ZXNSZWFkID4gMCkgewotICAgICAgICAgICAgZXJyb3It
PmVycm9yID0gMDsKLSAgICAgICAgICAgICphdEVPRiA9IEZBTFNFOwotICAgICAgICAgICAgZm9y
bS0+Ynl0ZXNTZW50ICs9IGJ5dGVzUmVhZDsKLSNpZiBFTkFCTEUoQkxPQikKLSAgICAgICAgICAg
IGlmIChmb3JtLT5jdXJyZW50U3RyZWFtUmFuZ2VMZW5ndGggIT0gQmxvYkRhdGFJdGVtOjp0b0Vu
ZE9mRmlsZSkKLSAgICAgICAgICAgICAgICBmb3JtLT5jdXJyZW50U3RyZWFtUmFuZ2VMZW5ndGgg
LT0gYnl0ZXNSZWFkOwotI2VuZGlmCi0KLSAgICAgICAgICAgIHJldHVybiBieXRlc1JlYWQ7Ci0g
ICAgICAgIH0KLSAgICAgICAgb3Blbk5leHRTdHJlYW0oZm9ybSk7Ci0gICAgfQotCi0gICAgZXJy
b3ItPmVycm9yID0gMDsKLSAgICAqYXRFT0YgPSBUUlVFOwotICAgIHJldHVybiAwOwotfQotCi1z
dGF0aWMgQm9vbGVhbiBmb3JtQ2FuUmVhZChDRlJlYWRTdHJlYW1SZWYgc3RyZWFtLCB2b2lkKiBj
b250ZXh0KQotewotICAgIEZvcm1TdHJlYW1GaWVsZHMqIGZvcm0gPSBzdGF0aWNfY2FzdDxGb3Jt
U3RyZWFtRmllbGRzKj4oY29udGV4dCk7Ci0KLSAgICB3aGlsZSAoZm9ybS0+Y3VycmVudFN0cmVh
bSAmJiBDRlJlYWRTdHJlYW1HZXRTdGF0dXMoZm9ybS0+Y3VycmVudFN0cmVhbSkgPT0ga0NGU3Ry
ZWFtU3RhdHVzQXRFbmQpIHsKLSAgICAgICAgb3Blbk5leHRTdHJlYW0oZm9ybSk7Ci0gICAgfQot
ICAgIGlmICghZm9ybS0+Y3VycmVudFN0cmVhbSkgewotICAgICAgICB3a1NpZ25hbENGUmVhZFN0
cmVhbUVuZChzdHJlYW0pOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJldHVy
biBDRlJlYWRTdHJlYW1IYXNCeXRlc0F2YWlsYWJsZShmb3JtLT5jdXJyZW50U3RyZWFtKTsKLX0K
LQotc3RhdGljIHZvaWQgZm9ybUNsb3NlKENGUmVhZFN0cmVhbVJlZiwgdm9pZCogY29udGV4dCkK
LXsKLSAgICBGb3JtU3RyZWFtRmllbGRzKiBmb3JtID0gc3RhdGljX2Nhc3Q8Rm9ybVN0cmVhbUZp
ZWxkcyo+KGNvbnRleHQpOwotCi0gICAgY2xvc2VDdXJyZW50U3RyZWFtKGZvcm0pOwotfQotCi1z
dGF0aWMgdm9pZCBmb3JtU2NoZWR1bGUoQ0ZSZWFkU3RyZWFtUmVmLCBDRlJ1bkxvb3BSZWYgcnVu
TG9vcCwgQ0ZTdHJpbmdSZWYgcnVuTG9vcE1vZGUsIHZvaWQqIGNvbnRleHQpCi17Ci0gICAgRm9y
bVN0cmVhbUZpZWxkcyogZm9ybSA9IHN0YXRpY19jYXN0PEZvcm1TdHJlYW1GaWVsZHMqPihjb250
ZXh0KTsKLQotICAgIGlmIChmb3JtLT5jdXJyZW50U3RyZWFtKQotICAgICAgICBDRlJlYWRTdHJl
YW1TY2hlZHVsZVdpdGhSdW5Mb29wKGZvcm0tPmN1cnJlbnRTdHJlYW0sIHJ1bkxvb3AsIHJ1bkxv
b3BNb2RlKTsKLSAgICBmb3JtLT5zY2hlZHVsZWRSdW5Mb29wUGFpcnMuYWRkKFNjaGVkdWxlUGFp
cjo6Y3JlYXRlKHJ1bkxvb3AsIHJ1bkxvb3BNb2RlKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZvcm1V
bnNjaGVkdWxlKENGUmVhZFN0cmVhbVJlZiwgQ0ZSdW5Mb29wUmVmIHJ1bkxvb3AsIENGU3RyaW5n
UmVmIHJ1bkxvb3BNb2RlLCB2b2lkKiBjb250ZXh0KQotewotICAgIEZvcm1TdHJlYW1GaWVsZHMq
IGZvcm0gPSBzdGF0aWNfY2FzdDxGb3JtU3RyZWFtRmllbGRzKj4oY29udGV4dCk7Ci0KLSAgICBp
ZiAoZm9ybS0+Y3VycmVudFN0cmVhbSkKLSAgICAgICAgQ0ZSZWFkU3RyZWFtVW5zY2hlZHVsZUZy
b21SdW5Mb29wKGZvcm0tPmN1cnJlbnRTdHJlYW0sIHJ1bkxvb3AsIHJ1bkxvb3BNb2RlKTsKLSAg
ICBmb3JtLT5zY2hlZHVsZWRSdW5Mb29wUGFpcnMucmVtb3ZlKFNjaGVkdWxlUGFpcjo6Y3JlYXRl
KHJ1bkxvb3AsIHJ1bkxvb3BNb2RlKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZvcm1FdmVudENhbGxi
YWNrKENGUmVhZFN0cmVhbVJlZiBzdHJlYW0sIENGU3RyZWFtRXZlbnRUeXBlIHR5cGUsIHZvaWQq
IGNvbnRleHQpCi17Ci0gICAgRm9ybVN0cmVhbUZpZWxkcyogZm9ybSA9IHN0YXRpY19jYXN0PEZv
cm1TdHJlYW1GaWVsZHMqPihjb250ZXh0KTsKLQotICAgIHN3aXRjaCAodHlwZSkgewotICAgIGNh
c2Uga0NGU3RyZWFtRXZlbnRIYXNCeXRlc0F2YWlsYWJsZToKLSAgICAgICAgd2tTaWduYWxDRlJl
YWRTdHJlYW1IYXNCeXRlcyhmb3JtLT5mb3JtU3RyZWFtKTsKLSAgICAgICAgYnJlYWs7Ci0gICAg
Y2FzZSBrQ0ZTdHJlYW1FdmVudEVycm9yT2NjdXJyZWQ6IHsKLSAgICAgICAgQ0ZTdHJlYW1FcnJv
ciByZWFkU3RyZWFtRXJyb3IgPSBDRlJlYWRTdHJlYW1HZXRFcnJvcihzdHJlYW0pOwotICAgICAg
ICB3a1NpZ25hbENGUmVhZFN0cmVhbUVycm9yKGZvcm0tPmZvcm1TdHJlYW0sICZyZWFkU3RyZWFt
RXJyb3IpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBrQ0ZTdHJlYW1FdmVudEVu
ZEVuY291bnRlcmVkOgotICAgICAgICBvcGVuTmV4dFN0cmVhbShmb3JtKTsKLSAgICAgICAgaWYg
KCFmb3JtLT5jdXJyZW50U3RyZWFtKSB7Ci0gICAgICAgICAgICB3a1NpZ25hbENGUmVhZFN0cmVh
bUVuZChmb3JtLT5mb3JtU3RyZWFtKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBj
YXNlIGtDRlN0cmVhbUV2ZW50Tm9uZToKLSAgICAgICAgTE9HX0VSUk9SKCJ1bmV4cGVjdGVkIGtD
RlN0cmVhbUV2ZW50Tm9uZSIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIGtDRlN0cmVhbUV2
ZW50T3BlbkNvbXBsZXRlZDoKLSAgICAgICAgTE9HX0VSUk9SKCJ1bmV4cGVjdGVkIGtDRlN0cmVh
bUV2ZW50T3BlbkNvbXBsZXRlZCIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIGtDRlN0cmVh
bUV2ZW50Q2FuQWNjZXB0Qnl0ZXM6Ci0gICAgICAgIExPR19FUlJPUigidW5leHBlY3RlZCBrQ0ZT
dHJlYW1FdmVudENhbkFjY2VwdEJ5dGVzIik7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQog
dm9pZCBzZXRIVFRQQm9keShOU011dGFibGVVUkxSZXF1ZXN0ICpyZXF1ZXN0LCBQYXNzUmVmUHRy
PEZvcm1EYXRhPiBwcnBGb3JtRGF0YSkKIHsKLSAgICBSZWZQdHI8Rm9ybURhdGE+IGZvcm1EYXRh
ID0gcHJwRm9ybURhdGE7Ci0KLSAgICBpZiAoIWZvcm1EYXRhKQotICAgICAgICByZXR1cm47Ci0g
ICAgICAgIAotICAgIHNpemVfdCBjb3VudCA9IGZvcm1EYXRhLT5lbGVtZW50cygpLnNpemUoKTsK
LQotICAgIC8vIEhhbmRsZSB0aGUgY29tbW9uIHNwZWNpYWwgY2FzZSBvZiBvbmUgcGllY2Ugb2Yg
Zm9ybSBkYXRhLCB3aXRoIG5vIGZpbGVzLgotICAgIGlmIChjb3VudCA9PSAxICYmICFmb3JtRGF0
YS0+YWx3YXlzU3RyZWFtKCkpIHsKLSAgICAgICAgY29uc3QgRm9ybURhdGFFbGVtZW50JiBlbGVt
ZW50ID0gZm9ybURhdGEtPmVsZW1lbnRzKClbMF07Ci0gICAgICAgIGlmIChlbGVtZW50Lm1fdHlw
ZSA9PSBGb3JtRGF0YUVsZW1lbnQ6OmRhdGEpIHsKLSAgICAgICAgICAgIE5TRGF0YSAqZGF0YSA9
IFtbTlNEYXRhIGFsbG9jXSBpbml0V2l0aEJ5dGVzOmVsZW1lbnQubV9kYXRhLmRhdGEoKSBsZW5n
dGg6ZWxlbWVudC5tX2RhdGEuc2l6ZSgpXTsKLSAgICAgICAgICAgIFtyZXF1ZXN0IHNldEhUVFBC
b2R5OmRhdGFdOwotICAgICAgICAgICAgW2RhdGEgcmVsZWFzZV07Ci0gICAgICAgICAgICByZXR1
cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSNpZiBFTkFCTEUoQkxPQikKLSAgICAvLyBDaGVjayBp
ZiB0aGVyZSBpcyBhIGJsb2IgaW4gdGhlIGZvcm0gZGF0YS4KLSAgICBib29sIGhhc0Jsb2IgPSBm
YWxzZTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgICAg
Y29uc3QgRm9ybURhdGFFbGVtZW50JiBlbGVtZW50ID0gZm9ybURhdGEtPmVsZW1lbnRzKClbaV07
Ci0gICAgICAgIGlmIChlbGVtZW50Lm1fdHlwZSA9PSBGb3JtRGF0YUVsZW1lbnQ6OmVuY29kZWRC
bG9iKSB7Ci0gICAgICAgICAgICBoYXNCbG9iID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gSWYgeWVzLCB3ZSBoYXZlIHRvIHJlc29sdmUgYWxs
IHRoZSBibG9iIHJlZmVyZW5jZXMgYW5kIHJlZ2VuZXJhdGUgdGhlIGZvcm0gZGF0YSB3aXRoIG9u
bHkgZGF0YSBhbmQgZmlsZSB0eXBlcy4KLSAgICBpZiAoaGFzQmxvYikgewotICAgICAgICBSZWZQ
dHI8Rm9ybURhdGE+IG5ld0Zvcm1EYXRhID0gRm9ybURhdGE6OmNyZWF0ZSgpOwotICAgICAgICBu
ZXdGb3JtRGF0YS0+c2V0QWx3YXlzU3RyZWFtKGZvcm1EYXRhLT5hbHdheXNTdHJlYW0oKSk7Ci0g
ICAgICAgIG5ld0Zvcm1EYXRhLT5zZXRJZGVudGlmaWVyKGZvcm1EYXRhLT5pZGVudGlmaWVyKCkp
OwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgICAg
ICAgIGNvbnN0IEZvcm1EYXRhRWxlbWVudCYgZWxlbWVudCA9IGZvcm1EYXRhLT5lbGVtZW50cygp
W2ldOwotICAgICAgICAgICAgaWYgKGVsZW1lbnQubV90eXBlID09IEZvcm1EYXRhRWxlbWVudDo6
ZGF0YSkKLSAgICAgICAgICAgICAgICBuZXdGb3JtRGF0YS0+YXBwZW5kRGF0YShlbGVtZW50Lm1f
ZGF0YS5kYXRhKCksIGVsZW1lbnQubV9kYXRhLnNpemUoKSk7Ci0gICAgICAgICAgICBlbHNlIGlm
IChlbGVtZW50Lm1fdHlwZSA9PSBGb3JtRGF0YUVsZW1lbnQ6OmVuY29kZWRGaWxlKQotICAgICAg
ICAgICAgICAgIG5ld0Zvcm1EYXRhLT5hcHBlbmRGaWxlKGVsZW1lbnQubV9maWxlbmFtZSwgZWxl
bWVudC5tX3Nob3VsZEdlbmVyYXRlRmlsZSk7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAg
ICAgICAgICBBU1NFUlQoZWxlbWVudC5tX3R5cGUgPT0gRm9ybURhdGFFbGVtZW50OjplbmNvZGVk
QmxvYik7Ci0gICAgICAgICAgICAgICAgUmVmUHRyPEJsb2JTdG9yYWdlRGF0YT4gYmxvYkRhdGEg
PSBzdGF0aWNfY2FzdDxCbG9iUmVnaXN0cnlJbXBsJj4oYmxvYlJlZ2lzdHJ5KCkpLmdldEJsb2JE
YXRhRnJvbVVSTChLVVJMKFBhcnNlZFVSTFN0cmluZywgZWxlbWVudC5tX2Jsb2JVUkwpKTsKLSAg
ICAgICAgICAgICAgICBpZiAoYmxvYkRhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChz
aXplX3QgaiA9IDA7IGogPCBibG9iRGF0YS0+aXRlbXMoKS5zaXplKCk7ICsraikgewotICAgICAg
ICAgICAgICAgICAgICAgICAgY29uc3QgQmxvYkRhdGFJdGVtJiBibG9iSXRlbSA9IGJsb2JEYXRh
LT5pdGVtcygpW2pdOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2JJdGVtLnR5cGUg
PT0gQmxvYkRhdGFJdGVtOjpEYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3
Rm9ybURhdGEtPmFwcGVuZERhdGEoYmxvYkl0ZW0uZGF0YS0+ZGF0YSgpICsgc3RhdGljX2Nhc3Q8
aW50PihibG9iSXRlbS5vZmZzZXQpLCBzdGF0aWNfY2FzdDxpbnQ+KGJsb2JJdGVtLmxlbmd0aCkp
OwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBBU1NFUlQoYmxvYkl0ZW0udHlwZSA9PSBCbG9iRGF0YUl0ZW06OkZpbGUpOwotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Zvcm1EYXRhLT5hcHBlbmRGaWxlUmFuZ2UoYmxv
Ykl0ZW0ucGF0aCwgYmxvYkl0ZW0ub2Zmc2V0LCBibG9iSXRlbS5sZW5ndGgsIGJsb2JJdGVtLmV4
cGVjdGVkTW9kaWZpY2F0aW9uVGltZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgIH0KLSAgICAgICAgZm9ybURhdGEgPSBuZXdGb3JtRGF0YS5yZWxlYXNlKCk7Ci0gICAgICAg
IGNvdW50ID0gZm9ybURhdGEtPmVsZW1lbnRzKCkuc2l6ZSgpOwotICAgIH0KLSNlbmRpZgotCi0g
ICAgLy8gUHJlY29tcHV0ZSB0aGUgY29udGVudCBsZW5ndGggc28gTlNVUkxDb25uZWN0aW9uIGRv
ZXNuJ3QgdXNlIGNodW5rZWQgbW9kZS4KLSAgICBsb25nIGxvbmcgbGVuZ3RoID0gMDsKLSAgICBm
b3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgICAgY29uc3QgRm9ybURh
dGFFbGVtZW50JiBlbGVtZW50ID0gZm9ybURhdGEtPmVsZW1lbnRzKClbaV07Ci0gICAgICAgIGlm
IChlbGVtZW50Lm1fdHlwZSA9PSBGb3JtRGF0YUVsZW1lbnQ6OmRhdGEpCi0gICAgICAgICAgICBs
ZW5ndGggKz0gZWxlbWVudC5tX2RhdGEuc2l6ZSgpOwotICAgICAgICBlbHNlIHsKLSNpZiBFTkFC
TEUoQkxPQikKLSAgICAgICAgICAgIC8vIElmIHdlJ3JlIHNlbmRpbmcgdGhlIGZpbGUgcmFuZ2Us
IHVzZSB0aGUgZXhpc3RpbmcgcmFuZ2UgbGVuZ3RoIGZvciBub3cuIFdlIHdpbGwgZGV0ZWN0IGlm
IHRoZSBmaWxlIGhhcyBiZWVuIGNoYW5nZWQgcmlnaHQgYmVmb3JlIHdlIHJlYWQgdGhlIGZpbGUg
YW5kIGFib3J0IHRoZSBvcGVyYXRpb24gaWYgbmVjZXNzYXJ5LgotICAgICAgICAgICAgaWYgKGVs
ZW1lbnQubV9maWxlTGVuZ3RoICE9IEJsb2JEYXRhSXRlbTo6dG9FbmRPZkZpbGUpIHsKLSAgICAg
ICAgICAgICAgICBsZW5ndGggKz0gZWxlbWVudC5tX2ZpbGVMZW5ndGg7Ci0gICAgICAgICAgICAg
ICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgIGxvbmcgbG9u
ZyBmaWxlU2l6ZTsKLSAgICAgICAgICAgIGlmIChnZXRGaWxlU2l6ZShlbGVtZW50Lm1fc2hvdWxk
R2VuZXJhdGVGaWxlID8gZWxlbWVudC5tX2dlbmVyYXRlZEZpbGVuYW1lIDogZWxlbWVudC5tX2Zp
bGVuYW1lLCBmaWxlU2l6ZSkpCi0gICAgICAgICAgICAgICAgbGVuZ3RoICs9IGZpbGVTaXplOwot
ICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gU2V0IHRoZSBsZW5ndGguCi0gICAgW3JlcXVlc3Qg
c2V0VmFsdWU6W05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCIlbGxkIiwgbGVuZ3RoXSBmb3JI
VFRQSGVhZGVyRmllbGQ6QCJDb250ZW50LUxlbmd0aCJdOwotCi0gICAgLy8gQ3JlYXRlIGFuZCBz
ZXQgdGhlIHN0cmVhbS4KLQotICAgIC8vIFBhc3MgdGhlIGxlbmd0aCBhbG9uZyB3aXRoIHRoZSBm
b3JtRGF0YSBzbyBpdCBkb2VzIG5vdCBoYXZlIHRvIGJlIHJlY29tcHV0ZWQuCi0gICAgRm9ybUNv
bnRleHQgZm9ybUNvbnRleHQgPSB7IGZvcm1EYXRhLnJlbGVhc2UoKSwgbGVuZ3RoIH07Ci0KLSAg
ICBSZXRhaW5QdHI8Q0ZSZWFkU3RyZWFtUmVmPiBzdHJlYW0oQWRvcHRDRiwgd2tDcmVhdGVDdXN0
b21DRlJlYWRTdHJlYW0oZm9ybUNyZWF0ZSwgZm9ybUZpbmFsaXplLAotICAgICAgICBmb3JtT3Bl
biwgZm9ybVJlYWQsIGZvcm1DYW5SZWFkLCBmb3JtQ2xvc2UsIGZvcm1TY2hlZHVsZSwgZm9ybVVu
c2NoZWR1bGUsCi0gICAgICAgICZmb3JtQ29udGV4dCkpOwotICAgIFtyZXF1ZXN0IHNldEhUVFBC
b2R5U3RyZWFtOihOU0lucHV0U3RyZWFtICopc3RyZWFtLmdldCgpXTsKKyAgICBzZXRIVFRQQm9k
eShjb25zdF9jYXN0PENGTXV0YWJsZVVSTFJlcXVlc3RSZWY+KFtyZXF1ZXN0IF9DRlVSTFJlcXVl
c3RdKSwgcHJwRm9ybURhdGEpOwogfQogCi1Gb3JtRGF0YSogaHR0cEJvZHlGcm9tU3RyZWFtKE5T
SW5wdXRTdHJlYW0qIHN0cmVhbSkKK0Zvcm1EYXRhKiBodHRwQm9keUZyb21TdHJlYW0oTlNJbnB1
dFN0cmVhbSAqc3RyZWFtKQogewotICAgIE11dGV4TG9ja2VyIGxvY2tlcihzdHJlYW1GaWVsZHNN
YXBNdXRleCgpKTsKLSAgICBGb3JtU3RyZWFtRmllbGRzKiBmb3JtU3RyZWFtID0gc3RyZWFtRmll
bGRzTWFwKCkuZ2V0KHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZSZWFkU3RyZWFtUmVmPihzdHJlYW0pKTsK
LSAgICBpZiAoIWZvcm1TdHJlYW0pCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiBmb3Jt
U3RyZWFtLT5mb3JtRGF0YS5nZXQoKTsKKyAgICByZXR1cm4gaHR0cEJvZHlGcm9tU3RyZWFtKHJl
aW50ZXJwcmV0X2Nhc3Q8Q0ZSZWFkU3RyZWFtUmVmPihzdHJlYW0pKTsKIH0KIAogfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQo=
</data>
<flag name="commit-queue"
          id="138610"
          type_id="3"
          status="-"
          setter="buildbot"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>134386</attachid>
            <date>2012-03-28 13:44:18 -0700</date>
            <delta_ts>2012-03-28 15:08:42 -0700</delta_ts>
            <desc>more build fixing</desc>
            <filename>FormDataStream.txt</filename>
            <type>text/plain</type>
            <size>42011</size>
            <attacher name="Alexey Proskuryakov">ap</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDExMjQzNikKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI4IEBACisyMDEyLTAzLTI4ICBBbGV4ZXkg
UHJvc2t1cnlha292ICA8YXBAYXBwbGUuY29tPgorCisgICAgICAgIFtXaW5dIFNvbWUgQmxvYiB0
ZXN0cyBjcmFzaCBpbiBDRk5ldHdvcmsgaW4gYWR2YW5jZUN1cnJlbnRTdHJlYW0oRm9ybVN0cmVh
bUZpZWxkcyopCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD04MjM4NgorICAgICAgICA8cmRhcjovL3Byb2JsZW0vMTExMjE1MDE+CisKKyAgICAgICAgUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQ292ZXJlZCBieSBleGlzdGluZyB0
ZXN0cy4KKworICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvY2YvRm9ybURhdGFTdHJlYW1DRk5l
dC5jcHA6CisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jZi9Gb3JtRGF0YVN0cmVhbUNGTmV0
Lmg6CisgICAgICAgIE1vdmVkIGxvdyBsZXZlbCBpbXBsZW1lbnRhdGlvbiBmcm9tIEZvcm1EYXRh
U3RyZWFtTWFjLCBhbmQgZXhwb3NlZCBhbiBhZGRpdGlvbmFsIGZ1bmN0aW9uCisgICAgICAgIHRv
IGltcGxlbWVudCBGb3VuZGF0aW9uLWJhc2VkIEFQSSBvbiB0b3Agb2YgdGhpcy4KKworICAgICAg
ICAqIHBsYXRmb3JtL25ldHdvcmsvbWFjL0Zvcm1EYXRhU3RyZWFtTWFjLmg6CisgICAgICAgICog
cGxhdGZvcm0vbmV0d29yay9tYWMvRm9ybURhdGFTdHJlYW1NYWMubW06CisgICAgICAgIFJlbHkg
b24gdG9sbC1mcmVlIGJyaWRnaW5nIGFuZCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIHRvIG1ha2Ug
dGhpcyB3b3JrIHdpdGhvdXQgZHVwbGljYXRpbmcKKyAgICAgICAgY29kZS4KKyAgICAgICAgTm90
ZSB0aGF0IGh0dHBCb2R5RnJvbVN0cmVhbSBpcyBjb25mdXNpbmcgLSBJIGRvbid0IHNlZSBob3cg
aXQgY2FuIHdvcmsgd2hlbiBzZW5kaW5nIHNlcmlhbGl6ZWQKKyAgICAgICAgcmVxdWVzdHMgYWNy
b3NzIHByb2Nlc3MgYm91bmRhcnkuIFdlIHByb2JhYmx5IG9ubHkgZ2V0IGF3YXkgd2l0aCB0aGlz
IGJlY2F1c2Ugd2UgZG9uJ3QgYXR0ZW1wdAorICAgICAgICB0byBzZW5kIHJlcXVlc3RzIHRvIFVJ
IHByb2Nlc3Mgb25jZSB0aGV5IGFscmVhZHkgaGF2ZSBzdHJlYW1zIGFzc29jaWF0ZWQgd2l0aCB0
aGVtLgorCisgICAgICAgICogV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2o6IEFkZGVkIG1p
c3NpbmcgcGxhdGZvcm0vY2YgZmlsZXMuCisKIDIwMTItMDMtMjYgIFNoYXduIFNpbmdoICA8c2hh
d25zaW5naEBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgW2Nocm9taXVtXSBsYXllci0+Y2xpcFJl
Y3QoKSBpcyBub3QgaW5pdGlhbGl6ZWQgZm9yIGxheWVycyB0aGF0IGNyZWF0ZSBhIHJlbmRlclN1
cmZhY2UuCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJv
ago9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZj
cHJvagkocmV2aXNpb24gMTEyMTY2KQorKysgU291cmNlL1dlYkNvcmUvV2ViQ29yZS52Y3Byb2ov
V2ViQ29yZS52Y3Byb2oJKHdvcmtpbmcgY29weSkKQEAgLTI4Mzg1LDYgKzI4Mzg1LDEwIEBACiAJ
CQkJCT4KIAkJCQk8L0ZpbGU+CiAJCQkJPEZpbGUKKwkJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0
Zm9ybVxjZlxGaWxlU3lzdGVtQ0YuY3BwIgorCQkJCQk+CisJCQkJPC9GaWxlPgorCQkJCTxGaWxl
CiAJCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1cY2ZcS1VSTENGTmV0LmNwcCIKIAkJCQkJ
PgogCQkJCTwvRmlsZT4KQEAgLTI4MzkzLDYgKzI4Mzk3LDE0IEBACiAJCQkJCT4KIAkJCQk8L0Zp
bGU+CiAJCQkJPEZpbGUKKwkJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVxjZlxTY2hlZHVs
ZVBhaXIuY3BwIgorCQkJCQk+CisJCQkJPC9GaWxlPgorCQkJCTxGaWxlCisJCQkJCVJlbGF0aXZl
UGF0aD0iLi5ccGxhdGZvcm1cY2ZcU2NoZWR1bGVQYWlyLmgiCisJCQkJCT4KKwkJCQk8L0ZpbGU+
CisJCQkJPEZpbGUKIAkJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVxjZlxTaGFyZWRCdWZm
ZXJDRi5jcHAiCiAJCQkJCT4KIAkJCQk8L0ZpbGU+CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9uZXR3b3JrL2NmL0Zvcm1EYXRhU3RyZWFtQ0ZOZXQuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY2YvRm9ybURhdGFTdHJlYW1DRk5ldC5jcHAJ
KHJldmlzaW9uIDExMjE2NikKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY2Yv
Rm9ybURhdGFTdHJlYW1DRk5ldC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw1IEBACiAv
KgotICogQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDcsIDIwMTIgQXBw
bGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucwpAQCAtMjYsOTkgKzI2LDQ2NCBAQAogICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICAqLwogCi0vKiBvcmlnaW5h
bGx5IHdyaXR0ZW4gYnkgQmVja3kgV2lsbHJpY2gsIGFkZGl0aW9uYWwgY29kZSBieSBEYXJpbiBB
ZGxlciAqLwotCiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiRm9ybURhdGFTdHJlYW1D
Rk5ldC5oIgogCi0jaWYgVVNFKENGTkVUV09SSykKLQorI2luY2x1ZGUgIkJsb2JSZWdpc3RyeUlt
cGwuaCIKICNpbmNsdWRlICJGaWxlU3lzdGVtLmgiCiAjaW5jbHVkZSAiRm9ybURhdGEuaCIKLSNp
bmNsdWRlIDxDRk5ldHdvcmsvQ0ZVUkxSZXF1ZXN0UHJpdi5oPgorI2luY2x1ZGUgIlNjaGVkdWxl
UGFpci5oIgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAj
aW5jbHVkZSA8d3RmL0Fzc2VydGlvbnMuaD4KICNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgorI2lu
Y2x1ZGUgPHd0Zi9NYWluVGhyZWFkLmg+CiAjaW5jbHVkZSA8d3RmL1JldGFpblB0ci5oPgotI2lu
Y2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KKyNpbmNsdWRlIDx3dGYvU3RkTGliRXh0cmFzLmg+
CisjaW5jbHVkZSA8d3RmL1RocmVhZGluZy5oPgorCisjaWYgUExBVEZPUk0oSU9TKQorI2luY2x1
ZGUgPE1hY0Vycm9ycy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxDb3JlU2VydmljZXMvQ29yZVNlcnZp
Y2VzLmg+CisjZW5kaWYKIAogI2lmIFBMQVRGT1JNKE1BQykKLSNpbmNsdWRlICJXZWJDb3JlU3lz
dGVtSW50ZXJmYWNlLmgiCitleHRlcm4gIkMiIHZvaWQgQ0ZVUkxSZXF1ZXN0U2V0SFRUUFJlcXVl
c3RCb2R5KENGTXV0YWJsZVVSTFJlcXVlc3RSZWYgbXV0YWJsZUhUVFBSZXF1ZXN0LCBDRkRhdGFS
ZWYgaHR0cEJvZHkpOworZXh0ZXJuICJDIiB2b2lkIENGVVJMUmVxdWVzdFNldEhUVFBIZWFkZXJG
aWVsZFZhbHVlKENGTXV0YWJsZVVSTFJlcXVlc3RSZWYgbXV0YWJsZUhUVFBSZXF1ZXN0LCBDRlN0
cmluZ1JlZiBodHRwSGVhZGVyRmllbGQsIENGU3RyaW5nUmVmIGh0dHBIZWFkZXJGaWVsZFZhbHVl
KTsKK2V4dGVybiAiQyIgdm9pZCBDRlVSTFJlcXVlc3RTZXRIVFRQUmVxdWVzdEJvZHlTdHJlYW0o
Q0ZNdXRhYmxlVVJMUmVxdWVzdFJlZiByZXEsIENGUmVhZFN0cmVhbVJlZiBib2R5U3RyZWFtKTsK
K2V4dGVybiAiQyIgQ0ZSZWFkU3RyZWFtUmVmIENGVVJMUmVxdWVzdENvcHlIVFRQUmVxdWVzdEJv
ZHlTdHJlYW0oQ0ZVUkxSZXF1ZXN0UmVmIHJlcXVlc3QpOwogI2VsaWYgUExBVEZPUk0oV0lOKQot
I2luY2x1ZGUgPFdlYktpdFN5c3RlbUludGVyZmFjZS9XZWJLaXRTeXN0ZW1JbnRlcmZhY2UuaD4K
KyNpbmNsdWRlIDxDRk5ldHdvcmsvQ0ZVUkxSZXF1ZXN0Lmg+CiAjZW5kaWYKIAordHlwZWRlZiBz
dHJ1Y3QgeworICAgIENGSW5kZXggdmVyc2lvbjsgLyogPT0gMSAqLworICAgIHZvaWQgKigqY3Jl
YXRlKShDRlJlYWRTdHJlYW1SZWYgc3RyZWFtLCB2b2lkICppbmZvKTsKKyAgICB2b2lkICgqZmlu
YWxpemUpKENGUmVhZFN0cmVhbVJlZiBzdHJlYW0sIHZvaWQgKmluZm8pOworICAgIENGU3RyaW5n
UmVmICgqY29weURlc2NyaXB0aW9uKShDRlJlYWRTdHJlYW1SZWYgc3RyZWFtLCB2b2lkICppbmZv
KTsKKyAgICBCb29sZWFuICgqb3BlbikoQ0ZSZWFkU3RyZWFtUmVmIHN0cmVhbSwgQ0ZTdHJlYW1F
cnJvciAqZXJyb3IsIEJvb2xlYW4gKm9wZW5Db21wbGV0ZSwgdm9pZCAqaW5mbyk7CisgICAgQm9v
bGVhbiAoKm9wZW5Db21wbGV0ZWQpKENGUmVhZFN0cmVhbVJlZiBzdHJlYW0sIENGU3RyZWFtRXJy
b3IgKmVycm9yLCB2b2lkICppbmZvKTsKKyAgICBDRkluZGV4ICgqcmVhZCkoQ0ZSZWFkU3RyZWFt
UmVmIHN0cmVhbSwgVUludDggKmJ1ZmZlciwgQ0ZJbmRleCBidWZmZXJMZW5ndGgsIENGU3RyZWFt
RXJyb3IgKmVycm9yLCBCb29sZWFuICphdEVPRiwgdm9pZCAqaW5mbyk7CisgICAgY29uc3QgVUlu
dDggKigqZ2V0QnVmZmVyKShDRlJlYWRTdHJlYW1SZWYgc3RyZWFtLCBDRkluZGV4IG1heEJ5dGVz
VG9SZWFkLCBDRkluZGV4ICpudW1CeXRlc1JlYWQsIENGU3RyZWFtRXJyb3IgKmVycm9yLCBCb29s
ZWFuICphdEVPRiwgdm9pZCAqaW5mbyk7CisgICAgQm9vbGVhbiAoKmNhblJlYWQpKENGUmVhZFN0
cmVhbVJlZiBzdHJlYW0sIHZvaWQgKmluZm8pOworICAgIHZvaWQgKCpjbG9zZSkoQ0ZSZWFkU3Ry
ZWFtUmVmIHN0cmVhbSwgdm9pZCAqaW5mbyk7CisgICAgQ0ZUeXBlUmVmICgqY29weVByb3BlcnR5
KShDRlJlYWRTdHJlYW1SZWYgc3RyZWFtLCBDRlN0cmluZ1JlZiBwcm9wZXJ0eU5hbWUsIHZvaWQg
KmluZm8pOworICAgIEJvb2xlYW4gKCpzZXRQcm9wZXJ0eSkoQ0ZSZWFkU3RyZWFtUmVmIHN0cmVh
bSwgQ0ZTdHJpbmdSZWYgcHJvcGVydHlOYW1lLCBDRlR5cGVSZWYgcHJvcGVydHlWYWx1ZSwgdm9p
ZCAqaW5mbyk7CisgICAgdm9pZCAoKnJlcXVlc3RFdmVudHMpKENGUmVhZFN0cmVhbVJlZiBzdHJl
YW0sIENGT3B0aW9uRmxhZ3Mgc3RyZWFtRXZlbnRzLCB2b2lkICppbmZvKTsKKyAgICB2b2lkICgq
c2NoZWR1bGUpKENGUmVhZFN0cmVhbVJlZiBzdHJlYW0sIENGUnVuTG9vcFJlZiBydW5Mb29wLCBD
RlN0cmluZ1JlZiBydW5Mb29wTW9kZSwgdm9pZCAqaW5mbyk7CisgICAgdm9pZCAoKnVuc2NoZWR1
bGUpKENGUmVhZFN0cmVhbVJlZiBzdHJlYW0sIENGUnVuTG9vcFJlZiBydW5Mb29wLCBDRlN0cmlu
Z1JlZiBydW5Mb29wTW9kZSwgdm9pZCAqaW5mbyk7Cit9IENGUmVhZFN0cmVhbUNhbGxCYWNrc1Yx
OworCisjaWYgUExBVEZPUk0oV0lOKQorI2RlZmluZSBFWFRFUk4gZXh0ZXJuICJDIiBfX2RlY2xz
cGVjKGRsbGltcG9ydCkKKyNlbHNlCisjZGVmaW5lIEVYVEVSTiBleHRlcm4gIkMiCisjZW5kaWYK
KworRVhURVJOIHZvaWQgQ0ZSZWFkU3RyZWFtU2lnbmFsRXZlbnQoQ0ZSZWFkU3RyZWFtUmVmIHN0
cmVhbSwgQ0ZTdHJlYW1FdmVudFR5cGUgZXZlbnQsIGNvbnN0IHZvaWQgKmVycm9yKTsKK0VYVEVS
TiBDRlJlYWRTdHJlYW1SZWYgQ0ZSZWFkU3RyZWFtQ3JlYXRlKENGQWxsb2NhdG9yUmVmIGFsbG9j
LCBjb25zdCB2b2lkICpjYWxsYmFja3MsIHZvaWQgKmluZm8pOworCiBuYW1lc3BhY2UgV2ViQ29y
ZSB7CiAKLXZvaWQgc2V0SFRUUEJvZHkoQ0ZNdXRhYmxlVVJMUmVxdWVzdFJlZiByZXF1ZXN0LCBQ
YXNzUmVmUHRyPEZvcm1EYXRhPiBmb3JtRGF0YSkKK3N0YXRpYyBNdXRleCYgc3RyZWFtRmllbGRz
TWFwTXV0ZXgoKQogewotICAgIGlmICghZm9ybURhdGEpIHsKLSAgICAgICAgd2tDRlVSTFJlcXVl
c3RTZXRIVFRQUmVxdWVzdEJvZHlQYXJ0cyhyZXF1ZXN0LCAwKTsKLSAgICAgICAgcmV0dXJuOwor
ICAgIERFRklORV9TVEFUSUNfTE9DQUwoTXV0ZXgsIHN0YXRpY011dGV4LCAoKSk7CisgICAgcmV0
dXJuIHN0YXRpY011dGV4OworfQorCitzdGF0aWMgdm9pZCBmb3JtRXZlbnRDYWxsYmFjayhDRlJl
YWRTdHJlYW1SZWYgc3RyZWFtLCBDRlN0cmVhbUV2ZW50VHlwZSB0eXBlLCB2b2lkKiBjb250ZXh0
KTsKKworc3RydWN0IEZvcm1Db250ZXh0IHsKKyAgICBSZWZQdHI8Rm9ybURhdGE+IGZvcm1EYXRh
OworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBzdHJlYW1MZW5ndGg7Cit9OworCitzdHJ1Y3QgRm9y
bVN0cmVhbUZpZWxkcyB7CisgICAgUmVmUHRyPEZvcm1EYXRhPiBmb3JtRGF0YTsKKyAgICBTY2hl
ZHVsZVBhaXJIYXNoU2V0IHNjaGVkdWxlZFJ1bkxvb3BQYWlyczsKKyAgICBWZWN0b3I8Rm9ybURh
dGFFbGVtZW50PiByZW1haW5pbmdFbGVtZW50czsgLy8gaW4gcmV2ZXJzZSBvcmRlcgorICAgIENG
UmVhZFN0cmVhbVJlZiBjdXJyZW50U3RyZWFtOworI2lmIEVOQUJMRShCTE9CKQorICAgIGxvbmcg
bG9uZyBjdXJyZW50U3RyZWFtUmFuZ2VMZW5ndGg7CisjZW5kaWYKKyAgICBjaGFyKiBjdXJyZW50
RGF0YTsKKyAgICBDRlJlYWRTdHJlYW1SZWYgZm9ybVN0cmVhbTsKKyAgICB1bnNpZ25lZCBsb25n
IGxvbmcgc3RyZWFtTGVuZ3RoOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBieXRlc1NlbnQ7Cit9
OworCit0eXBlZGVmIEhhc2hNYXA8Q0ZSZWFkU3RyZWFtUmVmLCBGb3JtU3RyZWFtRmllbGRzKj4g
U3RyZWFtRmllbGRzTWFwOworc3RhdGljIFN0cmVhbUZpZWxkc01hcCYgc3RyZWFtRmllbGRzTWFw
KCkKK3sKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKFN0cmVhbUZpZWxkc01hcCwgc3RyZWFtRmll
bGRzTWFwLCAoKSk7CisgICAgcmV0dXJuIHN0cmVhbUZpZWxkc01hcDsKK30KKworc3RhdGljIHZv
aWQgY2xvc2VDdXJyZW50U3RyZWFtKEZvcm1TdHJlYW1GaWVsZHMgKmZvcm0pCit7CisgICAgaWYg
KGZvcm0tPmN1cnJlbnRTdHJlYW0pIHsKKyAgICAgICAgQ0ZSZWFkU3RyZWFtQ2xvc2UoZm9ybS0+
Y3VycmVudFN0cmVhbSk7CisgICAgICAgIENGUmVhZFN0cmVhbVNldENsaWVudChmb3JtLT5jdXJy
ZW50U3RyZWFtLCBrQ0ZTdHJlYW1FdmVudE5vbmUsIDAsIDApOworICAgICAgICBDRlJlbGVhc2Uo
Zm9ybS0+Y3VycmVudFN0cmVhbSk7CisgICAgICAgIGZvcm0tPmN1cnJlbnRTdHJlYW0gPSAwOwor
I2lmIEVOQUJMRShCTE9CKQorICAgICAgICBmb3JtLT5jdXJyZW50U3RyZWFtUmFuZ2VMZW5ndGgg
PSBCbG9iRGF0YUl0ZW06OnRvRW5kT2ZGaWxlOworI2VuZGlmCiAgICAgfQorICAgIGlmIChmb3Jt
LT5jdXJyZW50RGF0YSkgeworICAgICAgICBmYXN0RnJlZShmb3JtLT5jdXJyZW50RGF0YSk7Cisg
ICAgICAgIGZvcm0tPmN1cnJlbnREYXRhID0gMDsKKyAgICB9Cit9CiAKLSAgICBzaXplX3QgY291
bnQgPSBmb3JtRGF0YS0+ZWxlbWVudHMoKS5zaXplKCk7CisvLyBSZXR1cm4gZmFsc2UgaWYgd2Ug
Y2Fubm90IGFkdmFuY2UgdGhlIHN0cmVhbS4gQ3VycmVudGx5IHRoZSBvbmx5IHBvc3NpYmxlIGZh
aWx1cmUgaXMgdGhhdCB0aGUgdW5kZXJseWluZyBmaWxlIGhhcyBiZWVuIHJlbW92ZWQgb3IgY2hh
bmdlZCBzaW5jZSBGaWxlLnNsaWNlLgorc3RhdGljIGJvb2wgYWR2YW5jZUN1cnJlbnRTdHJlYW0o
Rm9ybVN0cmVhbUZpZWxkcyogZm9ybSkKK3sKKyAgICBjbG9zZUN1cnJlbnRTdHJlYW0oZm9ybSk7
CisKKyAgICBpZiAoZm9ybS0+cmVtYWluaW5nRWxlbWVudHMuaXNFbXB0eSgpKQorICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKworICAgIC8vIENyZWF0ZSB0aGUgbmV3IHN0cmVhbS4KKyAgICBGb3JtRGF0
YUVsZW1lbnQmIG5leHRJbnB1dCA9IGZvcm0tPnJlbWFpbmluZ0VsZW1lbnRzLmxhc3QoKTsKKwor
ICAgIGlmIChuZXh0SW5wdXQubV90eXBlID09IEZvcm1EYXRhRWxlbWVudDo6ZGF0YSkgeworICAg
ICAgICBzaXplX3Qgc2l6ZSA9IG5leHRJbnB1dC5tX2RhdGEuc2l6ZSgpOworICAgICAgICBjaGFy
KiBkYXRhID0gbmV4dElucHV0Lm1fZGF0YS5yZWxlYXNlQnVmZmVyKCk7CisgICAgICAgIGZvcm0t
PmN1cnJlbnRTdHJlYW0gPSBDRlJlYWRTdHJlYW1DcmVhdGVXaXRoQnl0ZXNOb0NvcHkoMCwgcmVp
bnRlcnByZXRfY2FzdDxjb25zdCBVSW50OCo+KGRhdGEpLCBzaXplLCBrQ0ZBbGxvY2F0b3JOdWxs
KTsKKyAgICAgICAgZm9ybS0+Y3VycmVudERhdGEgPSBkYXRhOworICAgIH0gZWxzZSB7CisjaWYg
RU5BQkxFKEJMT0IpCisgICAgICAgIC8vIENoZWNrIGlmIHRoZSBmaWxlIGhhcyBiZWVuIGNoYW5n
ZWQgb3Igbm90IGlmIHJlcXVpcmVkLgorICAgICAgICBpZiAobmV4dElucHV0Lm1fZXhwZWN0ZWRG
aWxlTW9kaWZpY2F0aW9uVGltZSAhPSBCbG9iRGF0YUl0ZW06OmRvTm90Q2hlY2tGaWxlQ2hhbmdl
KSB7CisgICAgICAgICAgICB0aW1lX3QgZmlsZU1vZGlmaWNhdGlvblRpbWU7CisgICAgICAgICAg
ICBpZiAoIWdldEZpbGVNb2RpZmljYXRpb25UaW1lKG5leHRJbnB1dC5tX2ZpbGVuYW1lLCBmaWxl
TW9kaWZpY2F0aW9uVGltZSkgfHwgZmlsZU1vZGlmaWNhdGlvblRpbWUgIT0gc3RhdGljX2Nhc3Q8
dGltZV90PihuZXh0SW5wdXQubV9leHBlY3RlZEZpbGVNb2RpZmljYXRpb25UaW1lKSkKKyAgICAg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBjb25z
dCBTdHJpbmcmIHBhdGggPSBuZXh0SW5wdXQubV9zaG91bGRHZW5lcmF0ZUZpbGUgPyBuZXh0SW5w
dXQubV9nZW5lcmF0ZWRGaWxlbmFtZSA6IG5leHRJbnB1dC5tX2ZpbGVuYW1lOworICAgICAgICBm
b3JtLT5jdXJyZW50U3RyZWFtID0gQ0ZSZWFkU3RyZWFtQ3JlYXRlV2l0aEZpbGUoMCwgcGF0aEFz
VVJMKHBhdGgpLmdldCgpKTsKKyAgICAgICAgaWYgKCFmb3JtLT5jdXJyZW50U3RyZWFtKSB7Cisg
ICAgICAgICAgICAvLyBUaGUgZmlsZSBtdXN0IGhhdmUgYmVlbiByZW1vdmVkIG9yIGJlY29tZSB1
bnJlYWRhYmxlLgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisjaWYgRU5B
QkxFKEJMT0IpCisgICAgICAgIGlmIChuZXh0SW5wdXQubV9maWxlU3RhcnQgPiAwKSB7CisgICAg
ICAgICAgICBSZXRhaW5QdHI8Q0ZOdW1iZXJSZWY+IHBvc2l0aW9uKEFkb3B0Q0YsIENGTnVtYmVy
Q3JlYXRlKDAsIGtDRk51bWJlckxvbmdMb25nVHlwZSwgJm5leHRJbnB1dC5tX2ZpbGVTdGFydCkp
OworICAgICAgICAgICAgQ0ZSZWFkU3RyZWFtU2V0UHJvcGVydHkoZm9ybS0+Y3VycmVudFN0cmVh
bSwga0NGU3RyZWFtUHJvcGVydHlGaWxlQ3VycmVudE9mZnNldCwgcG9zaXRpb24uZ2V0KCkpOwor
ICAgICAgICB9CisgICAgICAgIGZvcm0tPmN1cnJlbnRTdHJlYW1SYW5nZUxlbmd0aCA9IG5leHRJ
bnB1dC5tX2ZpbGVMZW5ndGg7CisjZW5kaWYKKyAgICB9CisgICAgZm9ybS0+cmVtYWluaW5nRWxl
bWVudHMucmVtb3ZlTGFzdCgpOworCisgICAgLy8gU2V0IHVwIHRoZSBjYWxsYmFjay4KKyAgICBD
RlN0cmVhbUNsaWVudENvbnRleHQgY29udGV4dCA9IHsgMCwgZm9ybSwgMCwgMCwgMCB9OworICAg
IENGUmVhZFN0cmVhbVNldENsaWVudChmb3JtLT5jdXJyZW50U3RyZWFtLCBrQ0ZTdHJlYW1FdmVu
dEhhc0J5dGVzQXZhaWxhYmxlIHwga0NGU3RyZWFtRXZlbnRFcnJvck9jY3VycmVkIHwga0NGU3Ry
ZWFtRXZlbnRFbmRFbmNvdW50ZXJlZCwKKyAgICAgICAgZm9ybUV2ZW50Q2FsbGJhY2ssICZjb250
ZXh0KTsKKworICAgIC8vIFNjaGVkdWxlIHdpdGggdGhlIGN1cnJlbnQgc2V0IG9mIHJ1biBsb29w
cy4KKyAgICBTY2hlZHVsZVBhaXJIYXNoU2V0OjppdGVyYXRvciBlbmQgPSBmb3JtLT5zY2hlZHVs
ZWRSdW5Mb29wUGFpcnMuZW5kKCk7CisgICAgZm9yIChTY2hlZHVsZVBhaXJIYXNoU2V0OjppdGVy
YXRvciBpdCA9IGZvcm0tPnNjaGVkdWxlZFJ1bkxvb3BQYWlycy5iZWdpbigpOyBpdCAhPSBlbmQ7
ICsraXQpCisgICAgICAgIENGUmVhZFN0cmVhbVNjaGVkdWxlV2l0aFJ1bkxvb3AoZm9ybS0+Y3Vy
cmVudFN0cmVhbSwgKCppdCktPnJ1bkxvb3AoKSwgKCppdCktPm1vZGUoKSk7CisKKyAgICByZXR1
cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgb3Blbk5leHRTdHJlYW0oRm9ybVN0cmVhbUZpZWxk
cyogZm9ybSkKK3sKKyAgICAvLyBTa2lwIG92ZXIgYW55IHN0cmVhbXMgd2UgY2FuJ3Qgb3Blbi4K
KyAgICBpZiAoIWFkdmFuY2VDdXJyZW50U3RyZWFtKGZvcm0pKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgd2hpbGUgKGZvcm0tPmN1cnJlbnRTdHJlYW0gJiYgIUNGUmVhZFN0cmVhbU9wZW4o
Zm9ybS0+Y3VycmVudFN0cmVhbSkpIHsKKyAgICAgICAgaWYgKCFhZHZhbmNlQ3VycmVudFN0cmVh
bShmb3JtKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRy
dWU7Cit9CisKK3N0YXRpYyB2b2lkKiBmb3JtQ3JlYXRlKENGUmVhZFN0cmVhbVJlZiBzdHJlYW0s
IHZvaWQqIGNvbnRleHQpCit7CisgICAgRm9ybUNvbnRleHQqIGZvcm1Db250ZXh0ID0gc3RhdGlj
X2Nhc3Q8Rm9ybUNvbnRleHQqPihjb250ZXh0KTsKKworICAgIEZvcm1TdHJlYW1GaWVsZHMqIG5l
d0luZm8gPSBuZXcgRm9ybVN0cmVhbUZpZWxkczsKKyAgICBuZXdJbmZvLT5mb3JtRGF0YSA9IGZv
cm1Db250ZXh0LT5mb3JtRGF0YS5yZWxlYXNlKCk7CisgICAgbmV3SW5mby0+Y3VycmVudFN0cmVh
bSA9IDA7CisjaWYgRU5BQkxFKEJMT0IpCisgICAgbmV3SW5mby0+Y3VycmVudFN0cmVhbVJhbmdl
TGVuZ3RoID0gQmxvYkRhdGFJdGVtOjp0b0VuZE9mRmlsZTsKKyNlbmRpZgorICAgIG5ld0luZm8t
PmN1cnJlbnREYXRhID0gMDsKKyAgICBuZXdJbmZvLT5mb3JtU3RyZWFtID0gc3RyZWFtOyAvLyBE
b24ndCByZXRhaW4uIFRoYXQgd291bGQgY3JlYXRlIGEgcmVmZXJlbmNlIGN5Y2xlLgorICAgIG5l
d0luZm8tPnN0cmVhbUxlbmd0aCA9IGZvcm1Db250ZXh0LT5zdHJlYW1MZW5ndGg7CisgICAgbmV3
SW5mby0+Ynl0ZXNTZW50ID0gMDsKKworICAgIC8vIEFwcGVuZCBpbiByZXZlcnNlIG9yZGVyIHNp
bmNlIHdlIHJlbW92ZSBlbGVtZW50cyBmcm9tIHRoZSBlbmQuCisgICAgc2l6ZV90IHNpemUgPSBu
ZXdJbmZvLT5mb3JtRGF0YS0+ZWxlbWVudHMoKS5zaXplKCk7CisgICAgbmV3SW5mby0+cmVtYWlu
aW5nRWxlbWVudHMucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShzaXplKTsKKyAgICBmb3IgKHNpemVf
dCBpID0gMDsgaSA8IHNpemU7ICsraSkKKyAgICAgICAgbmV3SW5mby0+cmVtYWluaW5nRWxlbWVu
dHMuYXBwZW5kKG5ld0luZm8tPmZvcm1EYXRhLT5lbGVtZW50cygpW3NpemUgLSBpIC0gMV0pOwor
CisgICAgTXV0ZXhMb2NrZXIgbG9ja2VyKHN0cmVhbUZpZWxkc01hcE11dGV4KCkpOworICAgIEFT
U0VSVCghc3RyZWFtRmllbGRzTWFwKCkuY29udGFpbnMoc3RyZWFtKSk7CisgICAgc3RyZWFtRmll
bGRzTWFwKCkuYWRkKHN0cmVhbSwgbmV3SW5mbyk7CisKKyAgICByZXR1cm4gbmV3SW5mbzsKK30K
Kworc3RhdGljIHZvaWQgZm9ybUZpbmlzaEZpbmFsaXphdGlvbk9uTWFpblRocmVhZCh2b2lkKiBj
b250ZXh0KQoreworICAgIE93blB0cjxGb3JtU3RyZWFtRmllbGRzPiBmb3JtID0gYWRvcHRQdHIo
c3RhdGljX2Nhc3Q8Rm9ybVN0cmVhbUZpZWxkcyo+KGNvbnRleHQpKTsKKworICAgIGNsb3NlQ3Vy
cmVudFN0cmVhbShmb3JtLmdldCgpKTsKK30KKworc3RhdGljIHZvaWQgZm9ybUZpbmFsaXplKENG
UmVhZFN0cmVhbVJlZiBzdHJlYW0sIHZvaWQqIGNvbnRleHQpCit7CisgICAgRm9ybVN0cmVhbUZp
ZWxkcyogZm9ybSA9IHN0YXRpY19jYXN0PEZvcm1TdHJlYW1GaWVsZHMqPihjb250ZXh0KTsKKwor
ICAgIE11dGV4TG9ja2VyIGxvY2tlcihzdHJlYW1GaWVsZHNNYXBNdXRleCgpKTsKKworICAgIEFT
U0VSVChmb3JtLT5mb3JtU3RyZWFtID09IHN0cmVhbSk7CisgICAgQVNTRVJUKHN0cmVhbUZpZWxk
c01hcCgpLmdldChzdHJlYW0pID09IGNvbnRleHQpOworCisgICAgLy8gRG8gdGhpcyByaWdodCBh
d2F5IGJlY2F1c2UgdGhlIENGUmVhZFN0cmVhbVJlZiBpcyBiZWluZyBkZWFsbG9jYXRlZC4KKyAg
ICAvLyBXZSBjYW4ndCB3YWl0IHRvIHJlbW92ZSB0aGlzIGZyb20gdGhlIG1hcCB1bnRpbCB3ZSBm
aW5pc2ggZmluYWxpemluZworICAgIC8vIG9uIHRoZSBtYWluIHRocmVhZCBiZWNhdXNlIGluIHRo
ZW9yeSB0aGUgZnJlZWQgbWVtb3J5IGNvdWxkIGJlIHJldXNlZAorICAgIC8vIGZvciBhIG5ldyBD
RlJlYWRTdHJlYW0gYmVmb3JlIHRoYXQgcnVucy4KKyAgICBzdHJlYW1GaWVsZHNNYXAoKS5yZW1v
dmUoc3RyZWFtKTsKKworICAgIGNhbGxPbk1haW5UaHJlYWQoZm9ybUZpbmlzaEZpbmFsaXphdGlv
bk9uTWFpblRocmVhZCwgZm9ybSk7Cit9CisKK3N0YXRpYyBCb29sZWFuIGZvcm1PcGVuKENGUmVh
ZFN0cmVhbVJlZiwgQ0ZTdHJlYW1FcnJvciogZXJyb3IsIEJvb2xlYW4qIG9wZW5Db21wbGV0ZSwg
dm9pZCogY29udGV4dCkKK3sKKyAgICBGb3JtU3RyZWFtRmllbGRzKiBmb3JtID0gc3RhdGljX2Nh
c3Q8Rm9ybVN0cmVhbUZpZWxkcyo+KGNvbnRleHQpOworCisgICAgYm9vbCBvcGVuZWQgPSBvcGVu
TmV4dFN0cmVhbShmb3JtKTsKKworICAgICpvcGVuQ29tcGxldGUgPSBvcGVuZWQ7CisgICAgZXJy
b3ItPmVycm9yID0gb3BlbmVkID8gMCA6IGZuZkVycjsKKyAgICByZXR1cm4gb3BlbmVkOworfQor
CitzdGF0aWMgQ0ZJbmRleCBmb3JtUmVhZChDRlJlYWRTdHJlYW1SZWYsIFVJbnQ4KiBidWZmZXIs
IENGSW5kZXggYnVmZmVyTGVuZ3RoLCBDRlN0cmVhbUVycm9yKiBlcnJvciwgQm9vbGVhbiogYXRF
T0YsIHZvaWQqIGNvbnRleHQpCit7CisgICAgRm9ybVN0cmVhbUZpZWxkcyogZm9ybSA9IHN0YXRp
Y19jYXN0PEZvcm1TdHJlYW1GaWVsZHMqPihjb250ZXh0KTsKKworICAgIHdoaWxlIChmb3JtLT5j
dXJyZW50U3RyZWFtKSB7CisgICAgICAgIENGSW5kZXggYnl0ZXNUb1JlYWQgPSBidWZmZXJMZW5n
dGg7CisjaWYgRU5BQkxFKEJMT0IpCisgICAgICAgIGlmIChmb3JtLT5jdXJyZW50U3RyZWFtUmFu
Z2VMZW5ndGggIT0gQmxvYkRhdGFJdGVtOjp0b0VuZE9mRmlsZSAmJiBmb3JtLT5jdXJyZW50U3Ry
ZWFtUmFuZ2VMZW5ndGggPCBieXRlc1RvUmVhZCkKKyAgICAgICAgICAgIGJ5dGVzVG9SZWFkID0g
c3RhdGljX2Nhc3Q8Q0ZJbmRleD4oZm9ybS0+Y3VycmVudFN0cmVhbVJhbmdlTGVuZ3RoKTsKKyNl
bmRpZgorICAgICAgICBDRkluZGV4IGJ5dGVzUmVhZCA9IENGUmVhZFN0cmVhbVJlYWQoZm9ybS0+
Y3VycmVudFN0cmVhbSwgYnVmZmVyLCBieXRlc1RvUmVhZCk7CisgICAgICAgIGlmIChieXRlc1Jl
YWQgPCAwKSB7CisgICAgICAgICAgICAqZXJyb3IgPSBDRlJlYWRTdHJlYW1HZXRFcnJvcihmb3Jt
LT5jdXJyZW50U3RyZWFtKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAg
ICAgICBpZiAoYnl0ZXNSZWFkID4gMCkgeworICAgICAgICAgICAgZXJyb3ItPmVycm9yID0gMDsK
KyAgICAgICAgICAgICphdEVPRiA9IEZBTFNFOworICAgICAgICAgICAgZm9ybS0+Ynl0ZXNTZW50
ICs9IGJ5dGVzUmVhZDsKKyNpZiBFTkFCTEUoQkxPQikKKyAgICAgICAgICAgIGlmIChmb3JtLT5j
dXJyZW50U3RyZWFtUmFuZ2VMZW5ndGggIT0gQmxvYkRhdGFJdGVtOjp0b0VuZE9mRmlsZSkKKyAg
ICAgICAgICAgICAgICBmb3JtLT5jdXJyZW50U3RyZWFtUmFuZ2VMZW5ndGggLT0gYnl0ZXNSZWFk
OworI2VuZGlmCisKKyAgICAgICAgICAgIHJldHVybiBieXRlc1JlYWQ7CisgICAgICAgIH0KKyAg
ICAgICAgb3Blbk5leHRTdHJlYW0oZm9ybSk7CisgICAgfQorCisgICAgZXJyb3ItPmVycm9yID0g
MDsKKyAgICAqYXRFT0YgPSBUUlVFOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgQm9vbGVh
biBmb3JtQ2FuUmVhZChDRlJlYWRTdHJlYW1SZWYgc3RyZWFtLCB2b2lkKiBjb250ZXh0KQorewor
ICAgIEZvcm1TdHJlYW1GaWVsZHMqIGZvcm0gPSBzdGF0aWNfY2FzdDxGb3JtU3RyZWFtRmllbGRz
Kj4oY29udGV4dCk7CisKKyAgICB3aGlsZSAoZm9ybS0+Y3VycmVudFN0cmVhbSAmJiBDRlJlYWRT
dHJlYW1HZXRTdGF0dXMoZm9ybS0+Y3VycmVudFN0cmVhbSkgPT0ga0NGU3RyZWFtU3RhdHVzQXRF
bmQpCisgICAgICAgIG9wZW5OZXh0U3RyZWFtKGZvcm0pOworCisgICAgaWYgKCFmb3JtLT5jdXJy
ZW50U3RyZWFtKSB7CisgICAgICAgIENGUmVhZFN0cmVhbVNpZ25hbEV2ZW50KHN0cmVhbSwga0NG
U3RyZWFtRXZlbnRFbmRFbmNvdW50ZXJlZCwgMCk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAg
ICB9CisgICAgcmV0dXJuIENGUmVhZFN0cmVhbUhhc0J5dGVzQXZhaWxhYmxlKGZvcm0tPmN1cnJl
bnRTdHJlYW0pOworfQorCitzdGF0aWMgdm9pZCBmb3JtQ2xvc2UoQ0ZSZWFkU3RyZWFtUmVmLCB2
b2lkKiBjb250ZXh0KQoreworICAgIEZvcm1TdHJlYW1GaWVsZHMqIGZvcm0gPSBzdGF0aWNfY2Fz
dDxGb3JtU3RyZWFtRmllbGRzKj4oY29udGV4dCk7CisKKyAgICBjbG9zZUN1cnJlbnRTdHJlYW0o
Zm9ybSk7Cit9CisKK3N0YXRpYyB2b2lkIGZvcm1TY2hlZHVsZShDRlJlYWRTdHJlYW1SZWYsIENG
UnVuTG9vcFJlZiBydW5Mb29wLCBDRlN0cmluZ1JlZiBydW5Mb29wTW9kZSwgdm9pZCogY29udGV4
dCkKK3sKKyAgICBGb3JtU3RyZWFtRmllbGRzKiBmb3JtID0gc3RhdGljX2Nhc3Q8Rm9ybVN0cmVh
bUZpZWxkcyo+KGNvbnRleHQpOworCisgICAgaWYgKGZvcm0tPmN1cnJlbnRTdHJlYW0pCisgICAg
ICAgIENGUmVhZFN0cmVhbVNjaGVkdWxlV2l0aFJ1bkxvb3AoZm9ybS0+Y3VycmVudFN0cmVhbSwg
cnVuTG9vcCwgcnVuTG9vcE1vZGUpOworICAgIGZvcm0tPnNjaGVkdWxlZFJ1bkxvb3BQYWlycy5h
ZGQoU2NoZWR1bGVQYWlyOjpjcmVhdGUocnVuTG9vcCwgcnVuTG9vcE1vZGUpKTsKK30KKworc3Rh
dGljIHZvaWQgZm9ybVVuc2NoZWR1bGUoQ0ZSZWFkU3RyZWFtUmVmLCBDRlJ1bkxvb3BSZWYgcnVu
TG9vcCwgQ0ZTdHJpbmdSZWYgcnVuTG9vcE1vZGUsIHZvaWQqIGNvbnRleHQpCit7CisgICAgRm9y
bVN0cmVhbUZpZWxkcyogZm9ybSA9IHN0YXRpY19jYXN0PEZvcm1TdHJlYW1GaWVsZHMqPihjb250
ZXh0KTsKKworICAgIGlmIChmb3JtLT5jdXJyZW50U3RyZWFtKQorICAgICAgICBDRlJlYWRTdHJl
YW1VbnNjaGVkdWxlRnJvbVJ1bkxvb3AoZm9ybS0+Y3VycmVudFN0cmVhbSwgcnVuTG9vcCwgcnVu
TG9vcE1vZGUpOworICAgIGZvcm0tPnNjaGVkdWxlZFJ1bkxvb3BQYWlycy5yZW1vdmUoU2NoZWR1
bGVQYWlyOjpjcmVhdGUocnVuTG9vcCwgcnVuTG9vcE1vZGUpKTsKK30KKworc3RhdGljIHZvaWQg
Zm9ybUV2ZW50Q2FsbGJhY2soQ0ZSZWFkU3RyZWFtUmVmIHN0cmVhbSwgQ0ZTdHJlYW1FdmVudFR5
cGUgdHlwZSwgdm9pZCogY29udGV4dCkKK3sKKyAgICBGb3JtU3RyZWFtRmllbGRzKiBmb3JtID0g
c3RhdGljX2Nhc3Q8Rm9ybVN0cmVhbUZpZWxkcyo+KGNvbnRleHQpOwogCi0gICAgaWYgKGNvdW50
ID09IDApCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBrQ0ZTdHJlYW1FdmVudEhhc0J5
dGVzQXZhaWxhYmxlOgorICAgICAgICBDRlJlYWRTdHJlYW1TaWduYWxFdmVudChmb3JtLT5mb3Jt
U3RyZWFtLCBrQ0ZTdHJlYW1FdmVudEhhc0J5dGVzQXZhaWxhYmxlLCAwKTsKKyAgICAgICAgYnJl
YWs7CisgICAgY2FzZSBrQ0ZTdHJlYW1FdmVudEVycm9yT2NjdXJyZWQ6IHsKKyAgICAgICAgQ0ZT
dHJlYW1FcnJvciByZWFkU3RyZWFtRXJyb3IgPSBDRlJlYWRTdHJlYW1HZXRFcnJvcihzdHJlYW0p
OworICAgICAgICBDRlJlYWRTdHJlYW1TaWduYWxFdmVudChmb3JtLT5mb3JtU3RyZWFtLCBrQ0ZT
dHJlYW1FdmVudEVycm9yT2NjdXJyZWQsICZyZWFkU3RyZWFtRXJyb3IpOworICAgICAgICBicmVh
azsKKyAgICB9CisgICAgY2FzZSBrQ0ZTdHJlYW1FdmVudEVuZEVuY291bnRlcmVkOgorICAgICAg
ICBvcGVuTmV4dFN0cmVhbShmb3JtKTsKKyAgICAgICAgaWYgKCFmb3JtLT5jdXJyZW50U3RyZWFt
KQorICAgICAgICAgICAgQ0ZSZWFkU3RyZWFtU2lnbmFsRXZlbnQoZm9ybS0+Zm9ybVN0cmVhbSwg
a0NGU3RyZWFtRXZlbnRFbmRFbmNvdW50ZXJlZCwgMCk7CisgICAgICAgIGJyZWFrOworICAgIGNh
c2Uga0NGU3RyZWFtRXZlbnROb25lOgorICAgICAgICBMT0dfRVJST1IoInVuZXhwZWN0ZWQga0NG
U3RyZWFtRXZlbnROb25lIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga0NGU3RyZWFtRXZl
bnRPcGVuQ29tcGxldGVkOgorICAgICAgICBMT0dfRVJST1IoInVuZXhwZWN0ZWQga0NGU3RyZWFt
RXZlbnRPcGVuQ29tcGxldGVkIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga0NGU3RyZWFt
RXZlbnRDYW5BY2NlcHRCeXRlczoKKyAgICAgICAgTE9HX0VSUk9SKCJ1bmV4cGVjdGVkIGtDRlN0
cmVhbUV2ZW50Q2FuQWNjZXB0Qnl0ZXMiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2
b2lkIHNldEhUVFBCb2R5KENGTXV0YWJsZVVSTFJlcXVlc3RSZWYgcmVxdWVzdCwgUGFzc1JlZlB0
cjxGb3JtRGF0YT4gcHJwRm9ybURhdGEpCit7CisgICAgUmVmUHRyPEZvcm1EYXRhPiBmb3JtRGF0
YSA9IHBycEZvcm1EYXRhOworCisgICAgaWYgKCFmb3JtRGF0YSkKICAgICAgICAgcmV0dXJuOwor
ICAgICAgICAKKyAgICBzaXplX3QgY291bnQgPSBmb3JtRGF0YS0+ZWxlbWVudHMoKS5zaXplKCk7
CiAKICAgICAvLyBIYW5kbGUgdGhlIGNvbW1vbiBzcGVjaWFsIGNhc2Ugb2Ygb25lIHBpZWNlIG9m
IGZvcm0gZGF0YSwgd2l0aCBubyBmaWxlcy4KLSAgICBpZiAoY291bnQgPT0gMSkgeworICAgIGlm
IChjb3VudCA9PSAxICYmICFmb3JtRGF0YS0+YWx3YXlzU3RyZWFtKCkpIHsKICAgICAgICAgY29u
c3QgRm9ybURhdGFFbGVtZW50JiBlbGVtZW50ID0gZm9ybURhdGEtPmVsZW1lbnRzKClbMF07CiAg
ICAgICAgIGlmIChlbGVtZW50Lm1fdHlwZSA9PSBGb3JtRGF0YUVsZW1lbnQ6OmRhdGEpIHsKLSAg
ICAgICAgICAgIENGRGF0YVJlZiBkYXRhID0gQ0ZEYXRhQ3JlYXRlKDAsIHJlaW50ZXJwcmV0X2Nh
c3Q8Y29uc3QgVUludDggKj4oZWxlbWVudC5tX2RhdGEuZGF0YSgpKSwgZWxlbWVudC5tX2RhdGEu
c2l6ZSgpKTsKLSAgICAgICAgICAgIENGVVJMUmVxdWVzdFNldEhUVFBSZXF1ZXN0Qm9keShyZXF1
ZXN0LCBkYXRhKTsKLSAgICAgICAgICAgIENGUmVsZWFzZShkYXRhKTsKKyAgICAgICAgICAgIFJl
dGFpblB0cjxDRkRhdGFSZWY+IGRhdGEgPSBhZG9wdENGKENGRGF0YUNyZWF0ZSgwLCByZWludGVy
cHJldF9jYXN0PGNvbnN0IFVJbnQ4ICo+KGVsZW1lbnQubV9kYXRhLmRhdGEoKSksIGVsZW1lbnQu
bV9kYXRhLnNpemUoKSkpOworICAgICAgICAgICAgQ0ZVUkxSZXF1ZXN0U2V0SFRUUFJlcXVlc3RC
b2R5KHJlcXVlc3QsIGRhdGEuZ2V0KCkpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9
CiAgICAgfQogCi0gICAgUmV0YWluUHRyPENGTXV0YWJsZUFycmF5UmVmPiBhcnJheShBZG9wdENG
LCBDRkFycmF5Q3JlYXRlTXV0YWJsZSgwLCAwLCAma0NGVHlwZUFycmF5Q2FsbEJhY2tzKSk7Cisj
aWYgRU5BQkxFKEJMT0IpCisgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYSBibG9iIGluIHRoZSBm
b3JtIGRhdGEuCisgICAgYm9vbCBoYXNCbG9iID0gZmFsc2U7CisgICAgZm9yIChzaXplX3QgaSA9
IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgIGNvbnN0IEZvcm1EYXRhRWxlbWVudCYgZWxl
bWVudCA9IGZvcm1EYXRhLT5lbGVtZW50cygpW2ldOworICAgICAgICBpZiAoZWxlbWVudC5tX3R5
cGUgPT0gRm9ybURhdGFFbGVtZW50OjplbmNvZGVkQmxvYikgeworICAgICAgICAgICAgaGFzQmxv
YiA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8v
IElmIHllcywgd2UgaGF2ZSB0byByZXNvbHZlIGFsbCB0aGUgYmxvYiByZWZlcmVuY2VzIGFuZCBy
ZWdlbmVyYXRlIHRoZSBmb3JtIGRhdGEgd2l0aCBvbmx5IGRhdGEgYW5kIGZpbGUgdHlwZXMuCisg
ICAgaWYgKGhhc0Jsb2IpIHsKKyAgICAgICAgUmVmUHRyPEZvcm1EYXRhPiBuZXdGb3JtRGF0YSA9
IEZvcm1EYXRhOjpjcmVhdGUoKTsKKyAgICAgICAgbmV3Rm9ybURhdGEtPnNldEFsd2F5c1N0cmVh
bShmb3JtRGF0YS0+YWx3YXlzU3RyZWFtKCkpOworICAgICAgICBuZXdGb3JtRGF0YS0+c2V0SWRl
bnRpZmllcihmb3JtRGF0YS0+aWRlbnRpZmllcigpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9
IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBGb3JtRGF0YUVsZW1lbnQm
IGVsZW1lbnQgPSBmb3JtRGF0YS0+ZWxlbWVudHMoKVtpXTsKKyAgICAgICAgICAgIGlmIChlbGVt
ZW50Lm1fdHlwZSA9PSBGb3JtRGF0YUVsZW1lbnQ6OmRhdGEpCisgICAgICAgICAgICAgICAgbmV3
Rm9ybURhdGEtPmFwcGVuZERhdGEoZWxlbWVudC5tX2RhdGEuZGF0YSgpLCBlbGVtZW50Lm1fZGF0
YS5zaXplKCkpOworICAgICAgICAgICAgZWxzZSBpZiAoZWxlbWVudC5tX3R5cGUgPT0gRm9ybURh
dGFFbGVtZW50OjplbmNvZGVkRmlsZSkKKyAgICAgICAgICAgICAgICBuZXdGb3JtRGF0YS0+YXBw
ZW5kRmlsZShlbGVtZW50Lm1fZmlsZW5hbWUsIGVsZW1lbnQubV9zaG91bGRHZW5lcmF0ZUZpbGUp
OworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgQVNTRVJUKGVsZW1lbnQubV90
eXBlID09IEZvcm1EYXRhRWxlbWVudDo6ZW5jb2RlZEJsb2IpOworICAgICAgICAgICAgICAgIFJl
ZlB0cjxCbG9iU3RvcmFnZURhdGE+IGJsb2JEYXRhID0gc3RhdGljX2Nhc3Q8QmxvYlJlZ2lzdHJ5
SW1wbCY+KGJsb2JSZWdpc3RyeSgpKS5nZXRCbG9iRGF0YUZyb21VUkwoS1VSTChQYXJzZWRVUkxT
dHJpbmcsIGVsZW1lbnQubV9ibG9iVVJMKSk7CisgICAgICAgICAgICAgICAgaWYgKGJsb2JEYXRh
KSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgYmxvYkRhdGEt
Pml0ZW1zKCkuc2l6ZSgpOyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJs
b2JEYXRhSXRlbSYgYmxvYkl0ZW0gPSBibG9iRGF0YS0+aXRlbXMoKVtqXTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGlmIChibG9iSXRlbS50eXBlID09IEJsb2JEYXRhSXRlbTo6RGF0YSkKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGb3JtRGF0YS0+YXBwZW5kRGF0YShibG9iSXRl
bS5kYXRhLT5kYXRhKCkgKyBzdGF0aWNfY2FzdDxpbnQ+KGJsb2JJdGVtLm9mZnNldCksIHN0YXRp
Y19jYXN0PGludD4oYmxvYkl0ZW0ubGVuZ3RoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBl
bHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1NFUlQoYmxvYkl0ZW0udHlwZSA9
PSBCbG9iRGF0YUl0ZW06OkZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Zv
cm1EYXRhLT5hcHBlbmRGaWxlUmFuZ2UoYmxvYkl0ZW0ucGF0aCwgYmxvYkl0ZW0ub2Zmc2V0LCBi
bG9iSXRlbS5sZW5ndGgsIGJsb2JJdGVtLmV4cGVjdGVkTW9kaWZpY2F0aW9uVGltZSk7CisgICAg
ICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9ybURhdGEgPSBuZXdG
b3JtRGF0YS5yZWxlYXNlKCk7CisgICAgICAgIGNvdW50ID0gZm9ybURhdGEtPmVsZW1lbnRzKCku
c2l6ZSgpOworICAgIH0KKyNlbmRpZgogCisgICAgLy8gUHJlY29tcHV0ZSB0aGUgY29udGVudCBs
ZW5ndGggc28gTlNVUkxDb25uZWN0aW9uIGRvZXNuJ3QgdXNlIGNodW5rZWQgbW9kZS4KKyAgICBs
b25nIGxvbmcgbGVuZ3RoID0gMDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyAr
K2kpIHsKICAgICAgICAgY29uc3QgRm9ybURhdGFFbGVtZW50JiBlbGVtZW50ID0gZm9ybURhdGEt
PmVsZW1lbnRzKClbaV07Ci0gICAgICAgIGlmIChlbGVtZW50Lm1fdHlwZSA9PSBGb3JtRGF0YUVs
ZW1lbnQ6OmRhdGEpIHsKLSAgICAgICAgICAgIFJldGFpblB0cjxDRkRhdGFSZWY+IGRhdGEoQWRv
cHRDRiwgQ0ZEYXRhQ3JlYXRlKDAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVUludDgqPihlbGVt
ZW50Lm1fZGF0YS5kYXRhKCkpLCBlbGVtZW50Lm1fZGF0YS5zaXplKCkpKTsKLSAgICAgICAgICAg
IENGQXJyYXlBcHBlbmRWYWx1ZShhcnJheS5nZXQoKSwgZGF0YS5nZXQoKSk7Ci0gICAgICAgIH0g
ZWxzZSB7Ci0gICAgICAgICAgICBSZXRhaW5QdHI8Q0ZTdHJpbmdSZWY+IGZpbGVuYW1lKEFkb3B0
Q0YsIGVsZW1lbnQubV9maWxlbmFtZS5jcmVhdGVDRlN0cmluZygpKTsKLSAgICAgICAgICAgIENG
QXJyYXlBcHBlbmRWYWx1ZShhcnJheS5nZXQoKSwgZmlsZW5hbWUuZ2V0KCkpOworICAgICAgICBp
ZiAoZWxlbWVudC5tX3R5cGUgPT0gRm9ybURhdGFFbGVtZW50OjpkYXRhKQorICAgICAgICAgICAg
bGVuZ3RoICs9IGVsZW1lbnQubV9kYXRhLnNpemUoKTsKKyAgICAgICAgZWxzZSB7CisjaWYgRU5B
QkxFKEJMT0IpCisgICAgICAgICAgICAvLyBJZiB3ZSdyZSBzZW5kaW5nIHRoZSBmaWxlIHJhbmdl
LCB1c2UgdGhlIGV4aXN0aW5nIHJhbmdlIGxlbmd0aCBmb3Igbm93LiBXZSB3aWxsIGRldGVjdCBp
ZiB0aGUgZmlsZSBoYXMgYmVlbiBjaGFuZ2VkIHJpZ2h0IGJlZm9yZSB3ZSByZWFkIHRoZSBmaWxl
IGFuZCBhYm9ydCB0aGUgb3BlcmF0aW9uIGlmIG5lY2Vzc2FyeS4KKyAgICAgICAgICAgIGlmIChl
bGVtZW50Lm1fZmlsZUxlbmd0aCAhPSBCbG9iRGF0YUl0ZW06OnRvRW5kT2ZGaWxlKSB7CisgICAg
ICAgICAgICAgICAgbGVuZ3RoICs9IGVsZW1lbnQubV9maWxlTGVuZ3RoOworICAgICAgICAgICAg
ICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBsb25nIGxv
bmcgZmlsZVNpemU7CisgICAgICAgICAgICBpZiAoZ2V0RmlsZVNpemUoZWxlbWVudC5tX3Nob3Vs
ZEdlbmVyYXRlRmlsZSA/IGVsZW1lbnQubV9nZW5lcmF0ZWRGaWxlbmFtZSA6IGVsZW1lbnQubV9m
aWxlbmFtZSwgZmlsZVNpemUpKQorICAgICAgICAgICAgICAgIGxlbmd0aCArPSBmaWxlU2l6ZTsK
ICAgICAgICAgfQogICAgIH0KIAotICAgIHdrQ0ZVUkxSZXF1ZXN0U2V0SFRUUFJlcXVlc3RCb2R5
UGFydHMocmVxdWVzdCwgYXJyYXkuZ2V0KCkpOworICAgIC8vIFNldCB0aGUgbGVuZ3RoLgorICAg
IFJldGFpblB0cjxDRlN0cmluZ1JlZj4gbGVuZ3RoU3RyaW5nID0gYWRvcHRDRihDRlN0cmluZ0Ny
ZWF0ZVdpdGhGb3JtYXQoMCwgMCwgQ0ZTVFIoIiVsbGQiKSwgbGVuZ3RoKSk7CisgICAgQ0ZVUkxS
ZXF1ZXN0U2V0SFRUUEhlYWRlckZpZWxkVmFsdWUocmVxdWVzdCwgQ0ZTVFIoIkNvbnRlbnQtTGVu
Z3RoIiksIGxlbmd0aFN0cmluZy5nZXQoKSk7CisKKyAgICAvLyBDcmVhdGUgYW5kIHNldCB0aGUg
c3RyZWFtLgorCisgICAgLy8gUGFzcyB0aGUgbGVuZ3RoIGFsb25nIHdpdGggdGhlIGZvcm1EYXRh
IHNvIGl0IGRvZXMgbm90IGhhdmUgdG8gYmUgcmVjb21wdXRlZC4KKyAgICBGb3JtQ29udGV4dCBm
b3JtQ29udGV4dCA9IHsgZm9ybURhdGEucmVsZWFzZSgpLCBsZW5ndGggfTsKKworICAgIENGUmVh
ZFN0cmVhbUNhbGxCYWNrc1YxIGNhbGxCYWNrcyA9IHsgMSwgZm9ybUNyZWF0ZSwgZm9ybUZpbmFs
aXplLCAwLCBmb3JtT3BlbiwgMCwgZm9ybVJlYWQsIDAsIGZvcm1DYW5SZWFkLCBmb3JtQ2xvc2Us
IDAsIDAsIDAsIGZvcm1TY2hlZHVsZSwgZm9ybVVuc2NoZWR1bGUKKyAgICB9OworICAgIFJldGFp
blB0cjxDRlJlYWRTdHJlYW1SZWY+IHN0cmVhbSA9IGFkb3B0Q0YoQ0ZSZWFkU3RyZWFtQ3JlYXRl
KDAsIHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqPigmY2FsbEJhY2tzKSwgJmZvcm1Db250ZXh0KSk7
CisKKyAgICBDRlVSTFJlcXVlc3RTZXRIVFRQUmVxdWVzdEJvZHlTdHJlYW0ocmVxdWVzdCwgc3Ry
ZWFtLmdldCgpKTsKIH0KIAotUGFzc1JlZlB0cjxGb3JtRGF0YT4gaHR0cEJvZHlGcm9tUmVxdWVz
dChDRlVSTFJlcXVlc3RSZWYgcmVxdWVzdCkKK0Zvcm1EYXRhKiBodHRwQm9keUZyb21TdHJlYW0o
Q0ZSZWFkU3RyZWFtUmVmIHN0cmVhbSkKIHsKLSAgICBSZXRhaW5QdHI8Q0ZEYXRhUmVmPiBib2R5
RGF0YShBZG9wdENGLCBDRlVSTFJlcXVlc3RDb3B5SFRUUFJlcXVlc3RCb2R5KHJlcXVlc3QpKTsK
LSAgICBpZiAoYm9keURhdGEpCi0gICAgICAgIHJldHVybiBGb3JtRGF0YTo6Y3JlYXRlKENGRGF0
YUdldEJ5dGVQdHIoYm9keURhdGEuZ2V0KCkpLCBDRkRhdGFHZXRMZW5ndGgoYm9keURhdGEuZ2V0
KCkpKTsKLQotICAgIFJldGFpblB0cjxDRkFycmF5UmVmPiBib2R5UGFydHMoQWRvcHRDRiwgd2tD
RlVSTFJlcXVlc3RDb3B5SFRUUFJlcXVlc3RCb2R5UGFydHMocmVxdWVzdCkpOwotICAgIGlmIChi
b2R5UGFydHMpIHsKLSAgICAgICAgUmVmUHRyPEZvcm1EYXRhPiBmb3JtRGF0YSA9IEZvcm1EYXRh
OjpjcmVhdGUoKTsKLQotICAgICAgICBDRkluZGV4IGNvdW50ID0gQ0ZBcnJheUdldENvdW50KGJv
ZHlQYXJ0cy5nZXQoKSk7Ci0gICAgICAgIGZvciAoQ0ZJbmRleCBpID0gMDsgaSA8IGNvdW50OyBp
KyspIHsKLSAgICAgICAgICAgIENGVHlwZVJlZiBib2R5UGFydCA9IENGQXJyYXlHZXRWYWx1ZUF0
SW5kZXgoYm9keVBhcnRzLmdldCgpLCBpKTsKLSAgICAgICAgICAgIENGVHlwZUlEIHR5cGVJRCA9
IENGR2V0VHlwZUlEKGJvZHlQYXJ0KTsKLSAgICAgICAgICAgIGlmICh0eXBlSUQgPT0gQ0ZTdHJp
bmdHZXRUeXBlSUQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IChDRlN0
cmluZ1JlZilib2R5UGFydDsKLSAgICAgICAgICAgICAgICBmb3JtRGF0YS0+YXBwZW5kRmlsZShm
aWxlbmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVJRCA9PSBDRkRhdGFHZXRUeXBl
SUQoKSkgewotICAgICAgICAgICAgICAgIENGRGF0YVJlZiBkYXRhID0gKENGRGF0YVJlZilib2R5
UGFydDsKLSAgICAgICAgICAgICAgICBmb3JtRGF0YS0+YXBwZW5kRGF0YShDRkRhdGFHZXRCeXRl
UHRyKGRhdGEpLCBDRkRhdGFHZXRMZW5ndGgoZGF0YSkpOwotICAgICAgICAgICAgfSBlbHNlCi0g
ICAgICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAgIH0KLSAgICAgICAg
cmV0dXJuIGZvcm1EYXRhLnJlbGVhc2UoKTsKLSAgICB9CisgICAgaWYgKCFzdHJlYW0pCisgICAg
ICAgIHJldHVybiAwOwogCi0gICAgLy8gRklYTUU6IHdoYXQgdG8gZG8gYWJvdXQgYXJiaXRyYXJ5
IGJvZHkgc3RyZWFtcz8KLSAgICByZXR1cm4gMDsKKyAgICBNdXRleExvY2tlciBsb2NrZXIoc3Ry
ZWFtRmllbGRzTWFwTXV0ZXgoKSk7CisgICAgRm9ybVN0cmVhbUZpZWxkcyogZm9ybVN0cmVhbSA9
IHN0cmVhbUZpZWxkc01hcCgpLmdldChzdHJlYW0pOworICAgIGlmICghZm9ybVN0cmVhbSkKKyAg
ICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGZvcm1TdHJlYW0tPmZvcm1EYXRhLmdldCgpOwog
fQogCi19IC8vIG5hbWVzcGFjZSBXZWJDb3JlCitQYXNzUmVmUHRyPEZvcm1EYXRhPiBodHRwQm9k
eUZyb21SZXF1ZXN0KENGVVJMUmVxdWVzdFJlZiByZXF1ZXN0KQoreworICAgIFJldGFpblB0cjxD
RlJlYWRTdHJlYW1SZWY+IGJvZHlTdHJlYW0gPSBhZG9wdENGKENGVVJMUmVxdWVzdENvcHlIVFRQ
UmVxdWVzdEJvZHlTdHJlYW0ocmVxdWVzdCkpOworICAgIHJldHVybiBodHRwQm9keUZyb21TdHJl
YW0oYm9keVN0cmVhbS5nZXQoKSk7Cit9CiAKLSNlbmRpZiAvLyBVU0UoQ0ZORVRXT1JLKQorfSAv
LyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29y
ay9jZi9Gb3JtRGF0YVN0cmVhbUNGTmV0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vbmV0d29yay9jZi9Gb3JtRGF0YVN0cmVhbUNGTmV0LmgJKHJldmlzaW9uIDExMjE2
NikKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY2YvRm9ybURhdGFTdHJlYW1D
Rk5ldC5oCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAo
QykgMjAwNSwgMjAwNiwgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICog
Q29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA3LCAyMDEyIEFwcGxlIEluYy4gIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTI5LDIwICsy
OSwyMCBAQAogI2lmbmRlZiBGb3JtRGF0YVN0cmVhbUNGTmV0X2gKICNkZWZpbmUgRm9ybURhdGFT
dHJlYW1DRk5ldF9oCiAKLSNpZiBVU0UoQ0ZORVRXT1JLKQotCi0jaW5jbHVkZSA8Q29yZUZvdW5k
YXRpb24vQ29yZUZvdW5kYXRpb24uaD4KICNpbmNsdWRlIDx3dGYvRm9yd2FyZC5oPgogCiB0eXBl
ZGVmIHN0cnVjdCBfQ0ZVUkxSZXF1ZXN0KiBDRk11dGFibGVVUkxSZXF1ZXN0UmVmOwogdHlwZWRl
ZiBjb25zdCBzdHJ1Y3QgX0NGVVJMUmVxdWVzdCogQ0ZVUkxSZXF1ZXN0UmVmOwogCiBuYW1lc3Bh
Y2UgV2ViQ29yZSB7Ci0gICAgY2xhc3MgRm9ybURhdGE7Ci0gICAgdm9pZCBzZXRIVFRQQm9keShD
Rk11dGFibGVVUkxSZXF1ZXN0UmVmLCBQYXNzUmVmUHRyPEZvcm1EYXRhPik7Ci0gICAgUGFzc1Jl
ZlB0cjxGb3JtRGF0YT4gaHR0cEJvZHlGcm9tUmVxdWVzdChDRlVSTFJlcXVlc3RSZWYpOwotfQog
Ci0jZW5kaWYgLy8gVVNFKENGTkVUV09SSykKK2NsYXNzIEZvcm1EYXRhOworCit2b2lkIHNldEhU
VFBCb2R5KENGTXV0YWJsZVVSTFJlcXVlc3RSZWYsIFBhc3NSZWZQdHI8Rm9ybURhdGE+KTsKK1Bh
c3NSZWZQdHI8Rm9ybURhdGE+IGh0dHBCb2R5RnJvbVJlcXVlc3QoQ0ZVUkxSZXF1ZXN0UmVmKTsK
KworRm9ybURhdGEqIGh0dHBCb2R5RnJvbVN0cmVhbShDRlJlYWRTdHJlYW1SZWYpOworCit9IC8v
IG5hbWVzcGFjZSBXZWJDb3JlCiAKICNlbmRpZiAvLyBGb3JtRGF0YVN0cmVhbUNGTmV0X2gKSW5k
ZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvbWFjL0Zvcm1EYXRhU3RyZWFtTWFj
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9tYWMvRm9y
bURhdGFTdHJlYW1NYWMuaAkocmV2aXNpb24gMTEyMTY2KQorKysgU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vbmV0d29yay9tYWMvRm9ybURhdGFTdHJlYW1NYWMuaAkod29ya2luZyBjb3B5KQpAQCAt
MzEsOCArMzEsOSBAQAogCiAjaWYgIVVTRShDRk5FVFdPUkspCiAKLSNpbmNsdWRlICJGb3JtRGF0
YS5oIgorI2luY2x1ZGUgPHd0Zi9Gb3J3YXJkLmg+CiAKK0BjbGFzcyBOU0lucHV0U3RyZWFtOwog
QGNsYXNzIE5TTXV0YWJsZVVSTFJlcXVlc3Q7CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKSW5kZXg6
IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvbWFjL0Zvcm1EYXRhU3RyZWFtTWFjLm1t
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvbWFjL0Zvcm1E
YXRhU3RyZWFtTWFjLm1tCShyZXZpc2lvbiAxMTIzMDIpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9uZXR3b3JrL21hYy9Gb3JtRGF0YVN0cmVhbU1hYy5tbQkod29ya2luZyBjb3B5KQpAQCAt
MzEsNDE1ICszMSwyNCBAQAogCiAjaWYgIVVTRShDRk5FVFdPUkspCiAKLSNpbXBvcnQgIkJsb2JS
ZWdpc3RyeUltcGwuaCIKLSNpbXBvcnQgIkZpbGVTeXN0ZW0uaCIKICNpbXBvcnQgIkZvcm1EYXRh
LmgiCi0jaW1wb3J0ICJTY2hlZHVsZVBhaXIuaCIKLSNpbXBvcnQgIldlYkNvcmVTeXN0ZW1JbnRl
cmZhY2UuaCIKLSNpbXBvcnQgPHN5cy9zdGF0Lmg+Ci0jaW1wb3J0IDxzeXMvdHlwZXMuaD4KLSNp
bXBvcnQgPHd0Zi9Bc3NlcnRpb25zLmg+Ci0jaW1wb3J0IDx3dGYvTWFpblRocmVhZC5oPgotI2lt
cG9ydCA8d3RmL1N0ZExpYkV4dHJhcy5oPgotI2ltcG9ydCA8d3RmL1RocmVhZGluZy5oPgorI2lt
cG9ydCAiRm9ybURhdGFTdHJlYW1DRk5ldC5oIgorI2ltcG9ydCA8d3RmL1Bhc3NSZWZQdHIuaD4K
IAotI2lmIFBMQVRGT1JNKElPUykKLSNpbXBvcnQgPE1hY0Vycm9ycy5oPgotI2Vsc2UKLSNpbXBv
cnQgPENvcmVTZXJ2aWNlcy9Db3JlU2VydmljZXMuaD4KLSNlbmRpZgorQGludGVyZmFjZSBOU1VS
TFJlcXVlc3QgKFdlYk5TVVJMUmVxdWVzdERldGFpbHMpCistIChDRlVSTFJlcXVlc3RSZWYpX0NG
VVJMUmVxdWVzdDsKK0BlbmQKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1zdGF0aWMgTXV0ZXgm
IHN0cmVhbUZpZWxkc01hcE11dGV4KCkKLXsKLSAgICBERUZJTkVfU1RBVElDX0xPQ0FMKE11dGV4
LCBzdGF0aWNNdXRleCwgKCkpOwotICAgIHJldHVybiBzdGF0aWNNdXRleDsKLX0KLQotc3RhdGlj
IHZvaWQgZm9ybUV2ZW50Q2FsbGJhY2soQ0ZSZWFkU3RyZWFtUmVmIHN0cmVhbSwgQ0ZTdHJlYW1F
dmVudFR5cGUgdHlwZSwgdm9pZCogY29udGV4dCk7Ci0KLXN0cnVjdCBGb3JtQ29udGV4dCB7Ci0g
ICAgUmVmUHRyPEZvcm1EYXRhPiBmb3JtRGF0YTsKLSAgICB1bnNpZ25lZCBsb25nIGxvbmcgc3Ry
ZWFtTGVuZ3RoOwotfTsKLQotc3RydWN0IEZvcm1TdHJlYW1GaWVsZHMgewotICAgIFJlZlB0cjxG
b3JtRGF0YT4gZm9ybURhdGE7Ci0gICAgU2NoZWR1bGVQYWlySGFzaFNldCBzY2hlZHVsZWRSdW5M
b29wUGFpcnM7Ci0gICAgVmVjdG9yPEZvcm1EYXRhRWxlbWVudD4gcmVtYWluaW5nRWxlbWVudHM7
IC8vIGluIHJldmVyc2Ugb3JkZXIKLSAgICBDRlJlYWRTdHJlYW1SZWYgY3VycmVudFN0cmVhbTsK
LSNpZiBFTkFCTEUoQkxPQikKLSAgICBsb25nIGxvbmcgY3VycmVudFN0cmVhbVJhbmdlTGVuZ3Ro
OwotI2VuZGlmCi0gICAgY2hhciogY3VycmVudERhdGE7Ci0gICAgQ0ZSZWFkU3RyZWFtUmVmIGZv
cm1TdHJlYW07Ci0gICAgdW5zaWduZWQgbG9uZyBsb25nIHN0cmVhbUxlbmd0aDsKLSAgICB1bnNp
Z25lZCBsb25nIGxvbmcgYnl0ZXNTZW50OwotfTsKLQotdHlwZWRlZiBIYXNoTWFwPENGUmVhZFN0
cmVhbVJlZiwgRm9ybVN0cmVhbUZpZWxkcyo+IFN0cmVhbUZpZWxkc01hcDsKLXN0YXRpYyBTdHJl
YW1GaWVsZHNNYXAmIHN0cmVhbUZpZWxkc01hcCgpCi17Ci0gICAgREVGSU5FX1NUQVRJQ19MT0NB
TChTdHJlYW1GaWVsZHNNYXAsIHN0cmVhbUZpZWxkc01hcCwgKCkpOwotICAgIHJldHVybiBzdHJl
YW1GaWVsZHNNYXA7Ci19Ci0KLXN0YXRpYyB2b2lkIGNsb3NlQ3VycmVudFN0cmVhbShGb3JtU3Ry
ZWFtRmllbGRzICpmb3JtKQotewotICAgIGlmIChmb3JtLT5jdXJyZW50U3RyZWFtKSB7Ci0gICAg
ICAgIENGUmVhZFN0cmVhbUNsb3NlKGZvcm0tPmN1cnJlbnRTdHJlYW0pOwotICAgICAgICBDRlJl
YWRTdHJlYW1TZXRDbGllbnQoZm9ybS0+Y3VycmVudFN0cmVhbSwga0NGU3RyZWFtRXZlbnROb25l
LCBOVUxMLCBOVUxMKTsKLSAgICAgICAgQ0ZSZWxlYXNlKGZvcm0tPmN1cnJlbnRTdHJlYW0pOwot
ICAgICAgICBmb3JtLT5jdXJyZW50U3RyZWFtID0gTlVMTDsKLSNpZiBFTkFCTEUoQkxPQikKLSAg
ICAgICAgZm9ybS0+Y3VycmVudFN0cmVhbVJhbmdlTGVuZ3RoID0gQmxvYkRhdGFJdGVtOjp0b0Vu
ZE9mRmlsZTsKLSNlbmRpZgotICAgIH0KLSAgICBpZiAoZm9ybS0+Y3VycmVudERhdGEpIHsKLSAg
ICAgICAgZmFzdEZyZWUoZm9ybS0+Y3VycmVudERhdGEpOwotICAgICAgICBmb3JtLT5jdXJyZW50
RGF0YSA9IDA7Ci0gICAgfQotfQotCi0vLyBSZXR1cm4gZmFsc2UgaWYgd2UgY2Fubm90IGFkdmFu
Y2UgdGhlIHN0cmVhbS4gQ3VycmVudGx5IHRoZSBvbmx5IHBvc3NpYmxlIGZhaWx1cmUgaXMgdGhh
dCB0aGUgdW5kZXJseWluZyBmaWxlIGhhcyBiZWVuIHJlbW92ZWQgb3IgY2hhbmdlZCBzaW5jZSBG
aWxlLnNsaWNlLgotc3RhdGljIGJvb2wgYWR2YW5jZUN1cnJlbnRTdHJlYW0oRm9ybVN0cmVhbUZp
ZWxkcyogZm9ybSkKLXsKLSAgICBjbG9zZUN1cnJlbnRTdHJlYW0oZm9ybSk7Ci0KLSAgICBpZiAo
Zm9ybS0+cmVtYWluaW5nRWxlbWVudHMuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gdHJ1ZTsK
LQotICAgIC8vIENyZWF0ZSB0aGUgbmV3IHN0cmVhbS4KLSAgICBGb3JtRGF0YUVsZW1lbnQmIG5l
eHRJbnB1dCA9IGZvcm0tPnJlbWFpbmluZ0VsZW1lbnRzLmxhc3QoKTsKLQotICAgIGlmIChuZXh0
SW5wdXQubV90eXBlID09IEZvcm1EYXRhRWxlbWVudDo6ZGF0YSkgewotICAgICAgICBzaXplX3Qg
c2l6ZSA9IG5leHRJbnB1dC5tX2RhdGEuc2l6ZSgpOwotICAgICAgICBjaGFyKiBkYXRhID0gbmV4
dElucHV0Lm1fZGF0YS5yZWxlYXNlQnVmZmVyKCk7Ci0gICAgICAgIGZvcm0tPmN1cnJlbnRTdHJl
YW0gPSBDRlJlYWRTdHJlYW1DcmVhdGVXaXRoQnl0ZXNOb0NvcHkoMCwgcmVpbnRlcnByZXRfY2Fz
dDxjb25zdCBVSW50OCo+KGRhdGEpLCBzaXplLCBrQ0ZBbGxvY2F0b3JOdWxsKTsKLSAgICAgICAg
Zm9ybS0+Y3VycmVudERhdGEgPSBkYXRhOwotICAgIH0gZWxzZSB7Ci0jaWYgRU5BQkxFKEJMT0Ip
Ci0gICAgICAgIC8vIENoZWNrIGlmIHRoZSBmaWxlIGhhcyBiZWVuIGNoYW5nZWQgb3Igbm90IGlm
IHJlcXVpcmVkLgotICAgICAgICBpZiAobmV4dElucHV0Lm1fZXhwZWN0ZWRGaWxlTW9kaWZpY2F0
aW9uVGltZSAhPSBCbG9iRGF0YUl0ZW06OmRvTm90Q2hlY2tGaWxlQ2hhbmdlKSB7Ci0gICAgICAg
ICAgICB0aW1lX3QgZmlsZU1vZGlmaWNhdGlvblRpbWU7Ci0gICAgICAgICAgICBpZiAoIWdldEZp
bGVNb2RpZmljYXRpb25UaW1lKG5leHRJbnB1dC5tX2ZpbGVuYW1lLCBmaWxlTW9kaWZpY2F0aW9u
VGltZSkgfHwgZmlsZU1vZGlmaWNhdGlvblRpbWUgIT0gc3RhdGljX2Nhc3Q8dGltZV90PihuZXh0
SW5wdXQubV9leHBlY3RlZEZpbGVNb2RpZmljYXRpb25UaW1lKSkKLSAgICAgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgICAgICBjb25zdCBTdHJpbmcmIHBh
dGggPSBuZXh0SW5wdXQubV9zaG91bGRHZW5lcmF0ZUZpbGUgPyBuZXh0SW5wdXQubV9nZW5lcmF0
ZWRGaWxlbmFtZSA6IG5leHRJbnB1dC5tX2ZpbGVuYW1lOwotICAgICAgICBmb3JtLT5jdXJyZW50
U3RyZWFtID0gQ0ZSZWFkU3RyZWFtQ3JlYXRlV2l0aEZpbGUoMCwgcGF0aEFzVVJMKHBhdGgpLmdl
dCgpKTsKLSAgICAgICAgaWYgKCFmb3JtLT5jdXJyZW50U3RyZWFtKSB7Ci0gICAgICAgICAgICAv
LyBUaGUgZmlsZSBtdXN0IGhhdmUgYmVlbiByZW1vdmVkIG9yIGJlY29tZSB1bnJlYWRhYmxlLgot
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0jaWYgRU5BQkxFKEJMT0IpCi0g
ICAgICAgIGlmIChuZXh0SW5wdXQubV9maWxlU3RhcnQgPiAwKSB7Ci0gICAgICAgICAgICBSZXRh
aW5QdHI8Q0ZOdW1iZXJSZWY+IHBvc2l0aW9uKEFkb3B0Q0YsIENGTnVtYmVyQ3JlYXRlKDAsIGtD
Rk51bWJlckxvbmdMb25nVHlwZSwgJm5leHRJbnB1dC5tX2ZpbGVTdGFydCkpOwotICAgICAgICAg
ICAgQ0ZSZWFkU3RyZWFtU2V0UHJvcGVydHkoZm9ybS0+Y3VycmVudFN0cmVhbSwga0NGU3RyZWFt
UHJvcGVydHlGaWxlQ3VycmVudE9mZnNldCwgcG9zaXRpb24uZ2V0KCkpOwotICAgICAgICB9Ci0g
ICAgICAgIGZvcm0tPmN1cnJlbnRTdHJlYW1SYW5nZUxlbmd0aCA9IG5leHRJbnB1dC5tX2ZpbGVM
ZW5ndGg7Ci0jZW5kaWYKLSAgICB9Ci0gICAgZm9ybS0+cmVtYWluaW5nRWxlbWVudHMucmVtb3Zl
TGFzdCgpOwotCi0gICAgLy8gU2V0IHVwIHRoZSBjYWxsYmFjay4KLSAgICBDRlN0cmVhbUNsaWVu
dENvbnRleHQgY29udGV4dCA9IHsgMCwgZm9ybSwgTlVMTCwgTlVMTCwgTlVMTCB9OwotICAgIENG
UmVhZFN0cmVhbVNldENsaWVudChmb3JtLT5jdXJyZW50U3RyZWFtLCBrQ0ZTdHJlYW1FdmVudEhh
c0J5dGVzQXZhaWxhYmxlIHwga0NGU3RyZWFtRXZlbnRFcnJvck9jY3VycmVkIHwga0NGU3RyZWFt
RXZlbnRFbmRFbmNvdW50ZXJlZCwKLSAgICAgICAgZm9ybUV2ZW50Q2FsbGJhY2ssICZjb250ZXh0
KTsKLQotICAgIC8vIFNjaGVkdWxlIHdpdGggdGhlIGN1cnJlbnQgc2V0IG9mIHJ1biBsb29wcy4K
LSAgICBTY2hlZHVsZVBhaXJIYXNoU2V0OjppdGVyYXRvciBlbmQgPSBmb3JtLT5zY2hlZHVsZWRS
dW5Mb29wUGFpcnMuZW5kKCk7Ci0gICAgZm9yIChTY2hlZHVsZVBhaXJIYXNoU2V0OjppdGVyYXRv
ciBpdCA9IGZvcm0tPnNjaGVkdWxlZFJ1bkxvb3BQYWlycy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsr
aXQpCi0gICAgICAgIENGUmVhZFN0cmVhbVNjaGVkdWxlV2l0aFJ1bkxvb3AoZm9ybS0+Y3VycmVu
dFN0cmVhbSwgKCppdCktPnJ1bkxvb3AoKSwgKCppdCktPm1vZGUoKSk7Ci0KLSAgICByZXR1cm4g
dHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgb3Blbk5leHRTdHJlYW0oRm9ybVN0cmVhbUZpZWxkcyog
Zm9ybSkKLXsKLSAgICAvLyBTa2lwIG92ZXIgYW55IHN0cmVhbXMgd2UgY2FuJ3Qgb3Blbi4KLSAg
ICBpZiAoIWFkdmFuY2VDdXJyZW50U3RyZWFtKGZvcm0pKQotICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgd2hpbGUgKGZvcm0tPmN1cnJlbnRTdHJlYW0gJiYgIUNGUmVhZFN0cmVhbU9wZW4oZm9y
bS0+Y3VycmVudFN0cmVhbSkpIHsKLSAgICAgICAgaWYgKCFhZHZhbmNlQ3VycmVudFN0cmVhbShm
b3JtKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7
Ci19Ci0KLXN0YXRpYyB2b2lkKiBmb3JtQ3JlYXRlKENGUmVhZFN0cmVhbVJlZiBzdHJlYW0sIHZv
aWQqIGNvbnRleHQpCi17Ci0gICAgRm9ybUNvbnRleHQqIGZvcm1Db250ZXh0ID0gc3RhdGljX2Nh
c3Q8Rm9ybUNvbnRleHQqPihjb250ZXh0KTsKLQotICAgIEZvcm1TdHJlYW1GaWVsZHMqIG5ld0lu
Zm8gPSBuZXcgRm9ybVN0cmVhbUZpZWxkczsKLSAgICBuZXdJbmZvLT5mb3JtRGF0YSA9IGZvcm1D
b250ZXh0LT5mb3JtRGF0YS5yZWxlYXNlKCk7Ci0gICAgbmV3SW5mby0+Y3VycmVudFN0cmVhbSA9
IE5VTEw7Ci0jaWYgRU5BQkxFKEJMT0IpCi0gICAgbmV3SW5mby0+Y3VycmVudFN0cmVhbVJhbmdl
TGVuZ3RoID0gQmxvYkRhdGFJdGVtOjp0b0VuZE9mRmlsZTsKLSNlbmRpZgotICAgIG5ld0luZm8t
PmN1cnJlbnREYXRhID0gMDsKLSAgICBuZXdJbmZvLT5mb3JtU3RyZWFtID0gc3RyZWFtOyAvLyBE
b24ndCByZXRhaW4uIFRoYXQgd291bGQgY3JlYXRlIGEgcmVmZXJlbmNlIGN5Y2xlLgotICAgIG5l
d0luZm8tPnN0cmVhbUxlbmd0aCA9IGZvcm1Db250ZXh0LT5zdHJlYW1MZW5ndGg7Ci0gICAgbmV3
SW5mby0+Ynl0ZXNTZW50ID0gMDsKLQotICAgIC8vIEFwcGVuZCBpbiByZXZlcnNlIG9yZGVyIHNp
bmNlIHdlIHJlbW92ZSBlbGVtZW50cyBmcm9tIHRoZSBlbmQuCi0gICAgc2l6ZV90IHNpemUgPSBu
ZXdJbmZvLT5mb3JtRGF0YS0+ZWxlbWVudHMoKS5zaXplKCk7Ci0gICAgbmV3SW5mby0+cmVtYWlu
aW5nRWxlbWVudHMucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShzaXplKTsKLSAgICBmb3IgKHNpemVf
dCBpID0gMDsgaSA8IHNpemU7ICsraSkKLSAgICAgICAgbmV3SW5mby0+cmVtYWluaW5nRWxlbWVu
dHMuYXBwZW5kKG5ld0luZm8tPmZvcm1EYXRhLT5lbGVtZW50cygpW3NpemUgLSBpIC0gMV0pOwot
Ci0gICAgTXV0ZXhMb2NrZXIgbG9ja2VyKHN0cmVhbUZpZWxkc01hcE11dGV4KCkpOwotICAgIEFT
U0VSVCghc3RyZWFtRmllbGRzTWFwKCkuY29udGFpbnMoc3RyZWFtKSk7Ci0gICAgc3RyZWFtRmll
bGRzTWFwKCkuYWRkKHN0cmVhbSwgbmV3SW5mbyk7Ci0KLSAgICByZXR1cm4gbmV3SW5mbzsKLX0K
LQotc3RhdGljIHZvaWQgZm9ybUZpbmlzaEZpbmFsaXphdGlvbk9uTWFpblRocmVhZCh2b2lkKiBj
b250ZXh0KQotewotICAgIE93blB0cjxGb3JtU3RyZWFtRmllbGRzPiBmb3JtID0gYWRvcHRQdHIo
c3RhdGljX2Nhc3Q8Rm9ybVN0cmVhbUZpZWxkcyo+KGNvbnRleHQpKTsKLQotICAgIGNsb3NlQ3Vy
cmVudFN0cmVhbShmb3JtLmdldCgpKTsKLX0KLQotc3RhdGljIHZvaWQgZm9ybUZpbmFsaXplKENG
UmVhZFN0cmVhbVJlZiBzdHJlYW0sIHZvaWQqIGNvbnRleHQpCi17Ci0gICAgRm9ybVN0cmVhbUZp
ZWxkcyogZm9ybSA9IHN0YXRpY19jYXN0PEZvcm1TdHJlYW1GaWVsZHMqPihjb250ZXh0KTsKLQot
ICAgIE11dGV4TG9ja2VyIGxvY2tlcihzdHJlYW1GaWVsZHNNYXBNdXRleCgpKTsKLQotICAgIEFT
U0VSVChmb3JtLT5mb3JtU3RyZWFtID09IHN0cmVhbSk7Ci0gICAgQVNTRVJUKHN0cmVhbUZpZWxk
c01hcCgpLmdldChzdHJlYW0pID09IGNvbnRleHQpOwotCi0gICAgLy8gRG8gdGhpcyByaWdodCBh
d2F5IGJlY2F1c2UgdGhlIENGUmVhZFN0cmVhbVJlZiBpcyBiZWluZyBkZWFsbG9jYXRlZC4KLSAg
ICAvLyBXZSBjYW4ndCB3YWl0IHRvIHJlbW92ZSB0aGlzIGZyb20gdGhlIG1hcCB1bnRpbCB3ZSBm
aW5pc2ggZmluYWxpemluZwotICAgIC8vIG9uIHRoZSBtYWluIHRocmVhZCBiZWNhdXNlIGluIHRo
ZW9yeSB0aGUgZnJlZWQgbWVtb3J5IGNvdWxkIGJlIHJldXNlZAotICAgIC8vIGZvciBhIG5ldyBD
RlJlYWRTdHJlYW0gYmVmb3JlIHRoYXQgcnVucy4KLSAgICBzdHJlYW1GaWVsZHNNYXAoKS5yZW1v
dmUoc3RyZWFtKTsKLQotICAgIGNhbGxPbk1haW5UaHJlYWQoZm9ybUZpbmlzaEZpbmFsaXphdGlv
bk9uTWFpblRocmVhZCwgZm9ybSk7Ci19Ci0KLXN0YXRpYyBCb29sZWFuIGZvcm1PcGVuKENGUmVh
ZFN0cmVhbVJlZiwgQ0ZTdHJlYW1FcnJvciogZXJyb3IsIEJvb2xlYW4qIG9wZW5Db21wbGV0ZSwg
dm9pZCogY29udGV4dCkKLXsKLSAgICBGb3JtU3RyZWFtRmllbGRzKiBmb3JtID0gc3RhdGljX2Nh
c3Q8Rm9ybVN0cmVhbUZpZWxkcyo+KGNvbnRleHQpOwotCi0gICAgYm9vbCBvcGVuZWQgPSBvcGVu
TmV4dFN0cmVhbShmb3JtKTsKLQotICAgICpvcGVuQ29tcGxldGUgPSBvcGVuZWQ7Ci0gICAgZXJy
b3ItPmVycm9yID0gb3BlbmVkID8gMCA6IGZuZkVycjsKLSAgICByZXR1cm4gb3BlbmVkOwotfQot
Ci1zdGF0aWMgQ0ZJbmRleCBmb3JtUmVhZChDRlJlYWRTdHJlYW1SZWYsIFVJbnQ4KiBidWZmZXIs
IENGSW5kZXggYnVmZmVyTGVuZ3RoLCBDRlN0cmVhbUVycm9yKiBlcnJvciwgQm9vbGVhbiogYXRF
T0YsIHZvaWQqIGNvbnRleHQpCi17Ci0gICAgRm9ybVN0cmVhbUZpZWxkcyogZm9ybSA9IHN0YXRp
Y19jYXN0PEZvcm1TdHJlYW1GaWVsZHMqPihjb250ZXh0KTsKLQotICAgIHdoaWxlIChmb3JtLT5j
dXJyZW50U3RyZWFtKSB7Ci0gICAgICAgIENGSW5kZXggYnl0ZXNUb1JlYWQgPSBidWZmZXJMZW5n
dGg7Ci0jaWYgRU5BQkxFKEJMT0IpCi0gICAgICAgIGlmIChmb3JtLT5jdXJyZW50U3RyZWFtUmFu
Z2VMZW5ndGggIT0gQmxvYkRhdGFJdGVtOjp0b0VuZE9mRmlsZSAmJiBmb3JtLT5jdXJyZW50U3Ry
ZWFtUmFuZ2VMZW5ndGggPCBieXRlc1RvUmVhZCkKLSAgICAgICAgICAgIGJ5dGVzVG9SZWFkID0g
c3RhdGljX2Nhc3Q8Q0ZJbmRleD4oZm9ybS0+Y3VycmVudFN0cmVhbVJhbmdlTGVuZ3RoKTsKLSNl
bmRpZgotICAgICAgICBDRkluZGV4IGJ5dGVzUmVhZCA9IENGUmVhZFN0cmVhbVJlYWQoZm9ybS0+
Y3VycmVudFN0cmVhbSwgYnVmZmVyLCBieXRlc1RvUmVhZCk7Ci0gICAgICAgIGlmIChieXRlc1Jl
YWQgPCAwKSB7Ci0gICAgICAgICAgICAqZXJyb3IgPSBDRlJlYWRTdHJlYW1HZXRFcnJvcihmb3Jt
LT5jdXJyZW50U3RyZWFtKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAg
ICAgICBpZiAoYnl0ZXNSZWFkID4gMCkgewotICAgICAgICAgICAgZXJyb3ItPmVycm9yID0gMDsK
LSAgICAgICAgICAgICphdEVPRiA9IEZBTFNFOwotICAgICAgICAgICAgZm9ybS0+Ynl0ZXNTZW50
ICs9IGJ5dGVzUmVhZDsKLSNpZiBFTkFCTEUoQkxPQikKLSAgICAgICAgICAgIGlmIChmb3JtLT5j
dXJyZW50U3RyZWFtUmFuZ2VMZW5ndGggIT0gQmxvYkRhdGFJdGVtOjp0b0VuZE9mRmlsZSkKLSAg
ICAgICAgICAgICAgICBmb3JtLT5jdXJyZW50U3RyZWFtUmFuZ2VMZW5ndGggLT0gYnl0ZXNSZWFk
OwotI2VuZGlmCi0KLSAgICAgICAgICAgIHJldHVybiBieXRlc1JlYWQ7Ci0gICAgICAgIH0KLSAg
ICAgICAgb3Blbk5leHRTdHJlYW0oZm9ybSk7Ci0gICAgfQotCi0gICAgZXJyb3ItPmVycm9yID0g
MDsKLSAgICAqYXRFT0YgPSBUUlVFOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgQm9vbGVh
biBmb3JtQ2FuUmVhZChDRlJlYWRTdHJlYW1SZWYgc3RyZWFtLCB2b2lkKiBjb250ZXh0KQotewot
ICAgIEZvcm1TdHJlYW1GaWVsZHMqIGZvcm0gPSBzdGF0aWNfY2FzdDxGb3JtU3RyZWFtRmllbGRz
Kj4oY29udGV4dCk7Ci0KLSAgICB3aGlsZSAoZm9ybS0+Y3VycmVudFN0cmVhbSAmJiBDRlJlYWRT
dHJlYW1HZXRTdGF0dXMoZm9ybS0+Y3VycmVudFN0cmVhbSkgPT0ga0NGU3RyZWFtU3RhdHVzQXRF
bmQpIHsKLSAgICAgICAgb3Blbk5leHRTdHJlYW0oZm9ybSk7Ci0gICAgfQotICAgIGlmICghZm9y
bS0+Y3VycmVudFN0cmVhbSkgewotICAgICAgICB3a1NpZ25hbENGUmVhZFN0cmVhbUVuZChzdHJl
YW0pOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiBDRlJlYWRTdHJl
YW1IYXNCeXRlc0F2YWlsYWJsZShmb3JtLT5jdXJyZW50U3RyZWFtKTsKLX0KLQotc3RhdGljIHZv
aWQgZm9ybUNsb3NlKENGUmVhZFN0cmVhbVJlZiwgdm9pZCogY29udGV4dCkKLXsKLSAgICBGb3Jt
U3RyZWFtRmllbGRzKiBmb3JtID0gc3RhdGljX2Nhc3Q8Rm9ybVN0cmVhbUZpZWxkcyo+KGNvbnRl
eHQpOwotCi0gICAgY2xvc2VDdXJyZW50U3RyZWFtKGZvcm0pOwotfQotCi1zdGF0aWMgdm9pZCBm
b3JtU2NoZWR1bGUoQ0ZSZWFkU3RyZWFtUmVmLCBDRlJ1bkxvb3BSZWYgcnVuTG9vcCwgQ0ZTdHJp
bmdSZWYgcnVuTG9vcE1vZGUsIHZvaWQqIGNvbnRleHQpCi17Ci0gICAgRm9ybVN0cmVhbUZpZWxk
cyogZm9ybSA9IHN0YXRpY19jYXN0PEZvcm1TdHJlYW1GaWVsZHMqPihjb250ZXh0KTsKLQotICAg
IGlmIChmb3JtLT5jdXJyZW50U3RyZWFtKQotICAgICAgICBDRlJlYWRTdHJlYW1TY2hlZHVsZVdp
dGhSdW5Mb29wKGZvcm0tPmN1cnJlbnRTdHJlYW0sIHJ1bkxvb3AsIHJ1bkxvb3BNb2RlKTsKLSAg
ICBmb3JtLT5zY2hlZHVsZWRSdW5Mb29wUGFpcnMuYWRkKFNjaGVkdWxlUGFpcjo6Y3JlYXRlKHJ1
bkxvb3AsIHJ1bkxvb3BNb2RlKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZvcm1VbnNjaGVkdWxlKENG
UmVhZFN0cmVhbVJlZiwgQ0ZSdW5Mb29wUmVmIHJ1bkxvb3AsIENGU3RyaW5nUmVmIHJ1bkxvb3BN
b2RlLCB2b2lkKiBjb250ZXh0KQotewotICAgIEZvcm1TdHJlYW1GaWVsZHMqIGZvcm0gPSBzdGF0
aWNfY2FzdDxGb3JtU3RyZWFtRmllbGRzKj4oY29udGV4dCk7Ci0KLSAgICBpZiAoZm9ybS0+Y3Vy
cmVudFN0cmVhbSkKLSAgICAgICAgQ0ZSZWFkU3RyZWFtVW5zY2hlZHVsZUZyb21SdW5Mb29wKGZv
cm0tPmN1cnJlbnRTdHJlYW0sIHJ1bkxvb3AsIHJ1bkxvb3BNb2RlKTsKLSAgICBmb3JtLT5zY2hl
ZHVsZWRSdW5Mb29wUGFpcnMucmVtb3ZlKFNjaGVkdWxlUGFpcjo6Y3JlYXRlKHJ1bkxvb3AsIHJ1
bkxvb3BNb2RlKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZvcm1FdmVudENhbGxiYWNrKENGUmVhZFN0
cmVhbVJlZiBzdHJlYW0sIENGU3RyZWFtRXZlbnRUeXBlIHR5cGUsIHZvaWQqIGNvbnRleHQpCi17
Ci0gICAgRm9ybVN0cmVhbUZpZWxkcyogZm9ybSA9IHN0YXRpY19jYXN0PEZvcm1TdHJlYW1GaWVs
ZHMqPihjb250ZXh0KTsKLQotICAgIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2Uga0NGU3RyZWFt
RXZlbnRIYXNCeXRlc0F2YWlsYWJsZToKLSAgICAgICAgd2tTaWduYWxDRlJlYWRTdHJlYW1IYXNC
eXRlcyhmb3JtLT5mb3JtU3RyZWFtKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBrQ0ZTdHJl
YW1FdmVudEVycm9yT2NjdXJyZWQ6IHsKLSAgICAgICAgQ0ZTdHJlYW1FcnJvciByZWFkU3RyZWFt
RXJyb3IgPSBDRlJlYWRTdHJlYW1HZXRFcnJvcihzdHJlYW0pOwotICAgICAgICB3a1NpZ25hbENG
UmVhZFN0cmVhbUVycm9yKGZvcm0tPmZvcm1TdHJlYW0sICZyZWFkU3RyZWFtRXJyb3IpOwotICAg
ICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBrQ0ZTdHJlYW1FdmVudEVuZEVuY291bnRlcmVk
OgotICAgICAgICBvcGVuTmV4dFN0cmVhbShmb3JtKTsKLSAgICAgICAgaWYgKCFmb3JtLT5jdXJy
ZW50U3RyZWFtKSB7Ci0gICAgICAgICAgICB3a1NpZ25hbENGUmVhZFN0cmVhbUVuZChmb3JtLT5m
b3JtU3RyZWFtKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIGtDRlN0cmVh
bUV2ZW50Tm9uZToKLSAgICAgICAgTE9HX0VSUk9SKCJ1bmV4cGVjdGVkIGtDRlN0cmVhbUV2ZW50
Tm9uZSIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIGtDRlN0cmVhbUV2ZW50T3BlbkNvbXBs
ZXRlZDoKLSAgICAgICAgTE9HX0VSUk9SKCJ1bmV4cGVjdGVkIGtDRlN0cmVhbUV2ZW50T3BlbkNv
bXBsZXRlZCIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIGtDRlN0cmVhbUV2ZW50Q2FuQWNj
ZXB0Qnl0ZXM6Ci0gICAgICAgIExPR19FUlJPUigidW5leHBlY3RlZCBrQ0ZTdHJlYW1FdmVudENh
bkFjY2VwdEJ5dGVzIik7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQogdm9pZCBzZXRIVFRQ
Qm9keShOU011dGFibGVVUkxSZXF1ZXN0ICpyZXF1ZXN0LCBQYXNzUmVmUHRyPEZvcm1EYXRhPiBw
cnBGb3JtRGF0YSkKIHsKLSAgICBSZWZQdHI8Rm9ybURhdGE+IGZvcm1EYXRhID0gcHJwRm9ybURh
dGE7Ci0KLSAgICBpZiAoIWZvcm1EYXRhKQotICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAg
IHNpemVfdCBjb3VudCA9IGZvcm1EYXRhLT5lbGVtZW50cygpLnNpemUoKTsKLQotICAgIC8vIEhh
bmRsZSB0aGUgY29tbW9uIHNwZWNpYWwgY2FzZSBvZiBvbmUgcGllY2Ugb2YgZm9ybSBkYXRhLCB3
aXRoIG5vIGZpbGVzLgotICAgIGlmIChjb3VudCA9PSAxICYmICFmb3JtRGF0YS0+YWx3YXlzU3Ry
ZWFtKCkpIHsKLSAgICAgICAgY29uc3QgRm9ybURhdGFFbGVtZW50JiBlbGVtZW50ID0gZm9ybURh
dGEtPmVsZW1lbnRzKClbMF07Ci0gICAgICAgIGlmIChlbGVtZW50Lm1fdHlwZSA9PSBGb3JtRGF0
YUVsZW1lbnQ6OmRhdGEpIHsKLSAgICAgICAgICAgIE5TRGF0YSAqZGF0YSA9IFtbTlNEYXRhIGFs
bG9jXSBpbml0V2l0aEJ5dGVzOmVsZW1lbnQubV9kYXRhLmRhdGEoKSBsZW5ndGg6ZWxlbWVudC5t
X2RhdGEuc2l6ZSgpXTsKLSAgICAgICAgICAgIFtyZXF1ZXN0IHNldEhUVFBCb2R5OmRhdGFdOwot
ICAgICAgICAgICAgW2RhdGEgcmVsZWFzZV07Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAg
IH0KLSAgICB9Ci0KLSNpZiBFTkFCTEUoQkxPQikKLSAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBh
IGJsb2IgaW4gdGhlIGZvcm0gZGF0YS4KLSAgICBib29sIGhhc0Jsb2IgPSBmYWxzZTsKLSAgICBm
b3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgICAgY29uc3QgRm9ybURh
dGFFbGVtZW50JiBlbGVtZW50ID0gZm9ybURhdGEtPmVsZW1lbnRzKClbaV07Ci0gICAgICAgIGlm
IChlbGVtZW50Lm1fdHlwZSA9PSBGb3JtRGF0YUVsZW1lbnQ6OmVuY29kZWRCbG9iKSB7Ci0gICAg
ICAgICAgICBoYXNCbG9iID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0g
ICAgfQotCi0gICAgLy8gSWYgeWVzLCB3ZSBoYXZlIHRvIHJlc29sdmUgYWxsIHRoZSBibG9iIHJl
ZmVyZW5jZXMgYW5kIHJlZ2VuZXJhdGUgdGhlIGZvcm0gZGF0YSB3aXRoIG9ubHkgZGF0YSBhbmQg
ZmlsZSB0eXBlcy4KLSAgICBpZiAoaGFzQmxvYikgewotICAgICAgICBSZWZQdHI8Rm9ybURhdGE+
IG5ld0Zvcm1EYXRhID0gRm9ybURhdGE6OmNyZWF0ZSgpOwotICAgICAgICBuZXdGb3JtRGF0YS0+
c2V0QWx3YXlzU3RyZWFtKGZvcm1EYXRhLT5hbHdheXNTdHJlYW0oKSk7Ci0gICAgICAgIG5ld0Zv
cm1EYXRhLT5zZXRJZGVudGlmaWVyKGZvcm1EYXRhLT5pZGVudGlmaWVyKCkpOwotICAgICAgICBm
b3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgICAgICAgIGNvbnN0IEZv
cm1EYXRhRWxlbWVudCYgZWxlbWVudCA9IGZvcm1EYXRhLT5lbGVtZW50cygpW2ldOwotICAgICAg
ICAgICAgaWYgKGVsZW1lbnQubV90eXBlID09IEZvcm1EYXRhRWxlbWVudDo6ZGF0YSkKLSAgICAg
ICAgICAgICAgICBuZXdGb3JtRGF0YS0+YXBwZW5kRGF0YShlbGVtZW50Lm1fZGF0YS5kYXRhKCks
IGVsZW1lbnQubV9kYXRhLnNpemUoKSk7Ci0gICAgICAgICAgICBlbHNlIGlmIChlbGVtZW50Lm1f
dHlwZSA9PSBGb3JtRGF0YUVsZW1lbnQ6OmVuY29kZWRGaWxlKQotICAgICAgICAgICAgICAgIG5l
d0Zvcm1EYXRhLT5hcHBlbmRGaWxlKGVsZW1lbnQubV9maWxlbmFtZSwgZWxlbWVudC5tX3Nob3Vs
ZEdlbmVyYXRlRmlsZSk7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBBU1NF
UlQoZWxlbWVudC5tX3R5cGUgPT0gRm9ybURhdGFFbGVtZW50OjplbmNvZGVkQmxvYik7Ci0gICAg
ICAgICAgICAgICAgUmVmUHRyPEJsb2JTdG9yYWdlRGF0YT4gYmxvYkRhdGEgPSBzdGF0aWNfY2Fz
dDxCbG9iUmVnaXN0cnlJbXBsJj4oYmxvYlJlZ2lzdHJ5KCkpLmdldEJsb2JEYXRhRnJvbVVSTChL
VVJMKFBhcnNlZFVSTFN0cmluZywgZWxlbWVudC5tX2Jsb2JVUkwpKTsKLSAgICAgICAgICAgICAg
ICBpZiAoYmxvYkRhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7
IGogPCBibG9iRGF0YS0+aXRlbXMoKS5zaXplKCk7ICsraikgewotICAgICAgICAgICAgICAgICAg
ICAgICAgY29uc3QgQmxvYkRhdGFJdGVtJiBibG9iSXRlbSA9IGJsb2JEYXRhLT5pdGVtcygpW2pd
OwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2JJdGVtLnR5cGUgPT0gQmxvYkRhdGFJ
dGVtOjpEYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybURhdGEtPmFw
cGVuZERhdGEoYmxvYkl0ZW0uZGF0YS0+ZGF0YSgpICsgc3RhdGljX2Nhc3Q8aW50PihibG9iSXRl
bS5vZmZzZXQpLCBzdGF0aWNfY2FzdDxpbnQ+KGJsb2JJdGVtLmxlbmd0aCkpOwotICAgICAgICAg
ICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1NF
UlQoYmxvYkl0ZW0udHlwZSA9PSBCbG9iRGF0YUl0ZW06OkZpbGUpOwotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIG5ld0Zvcm1EYXRhLT5hcHBlbmRGaWxlUmFuZ2UoYmxvYkl0ZW0ucGF0aCwg
YmxvYkl0ZW0ub2Zmc2V0LCBibG9iSXRlbS5sZW5ndGgsIGJsb2JJdGVtLmV4cGVjdGVkTW9kaWZp
Y2F0aW9uVGltZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAg
ICAgZm9ybURhdGEgPSBuZXdGb3JtRGF0YS5yZWxlYXNlKCk7Ci0gICAgICAgIGNvdW50ID0gZm9y
bURhdGEtPmVsZW1lbnRzKCkuc2l6ZSgpOwotICAgIH0KLSNlbmRpZgotCi0gICAgLy8gUHJlY29t
cHV0ZSB0aGUgY29udGVudCBsZW5ndGggc28gTlNVUkxDb25uZWN0aW9uIGRvZXNuJ3QgdXNlIGNo
dW5rZWQgbW9kZS4KLSAgICBsb25nIGxvbmcgbGVuZ3RoID0gMDsKLSAgICBmb3IgKHNpemVfdCBp
ID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgICAgY29uc3QgRm9ybURhdGFFbGVtZW50JiBl
bGVtZW50ID0gZm9ybURhdGEtPmVsZW1lbnRzKClbaV07Ci0gICAgICAgIGlmIChlbGVtZW50Lm1f
dHlwZSA9PSBGb3JtRGF0YUVsZW1lbnQ6OmRhdGEpCi0gICAgICAgICAgICBsZW5ndGggKz0gZWxl
bWVudC5tX2RhdGEuc2l6ZSgpOwotICAgICAgICBlbHNlIHsKLSNpZiBFTkFCTEUoQkxPQikKLSAg
ICAgICAgICAgIC8vIElmIHdlJ3JlIHNlbmRpbmcgdGhlIGZpbGUgcmFuZ2UsIHVzZSB0aGUgZXhp
c3RpbmcgcmFuZ2UgbGVuZ3RoIGZvciBub3cuIFdlIHdpbGwgZGV0ZWN0IGlmIHRoZSBmaWxlIGhh
cyBiZWVuIGNoYW5nZWQgcmlnaHQgYmVmb3JlIHdlIHJlYWQgdGhlIGZpbGUgYW5kIGFib3J0IHRo
ZSBvcGVyYXRpb24gaWYgbmVjZXNzYXJ5LgotICAgICAgICAgICAgaWYgKGVsZW1lbnQubV9maWxl
TGVuZ3RoICE9IEJsb2JEYXRhSXRlbTo6dG9FbmRPZkZpbGUpIHsKLSAgICAgICAgICAgICAgICBs
ZW5ndGggKz0gZWxlbWVudC5tX2ZpbGVMZW5ndGg7Ci0gICAgICAgICAgICAgICAgY29udGludWU7
Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgIGxvbmcgbG9uZyBmaWxlU2l6ZTsK
LSAgICAgICAgICAgIGlmIChnZXRGaWxlU2l6ZShlbGVtZW50Lm1fc2hvdWxkR2VuZXJhdGVGaWxl
ID8gZWxlbWVudC5tX2dlbmVyYXRlZEZpbGVuYW1lIDogZWxlbWVudC5tX2ZpbGVuYW1lLCBmaWxl
U2l6ZSkpCi0gICAgICAgICAgICAgICAgbGVuZ3RoICs9IGZpbGVTaXplOwotICAgICAgICB9Ci0g
ICAgfQotCi0gICAgLy8gU2V0IHRoZSBsZW5ndGguCi0gICAgW3JlcXVlc3Qgc2V0VmFsdWU6W05T
U3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCIlbGxkIiwgbGVuZ3RoXSBmb3JIVFRQSGVhZGVyRmll
bGQ6QCJDb250ZW50LUxlbmd0aCJdOwotCi0gICAgLy8gQ3JlYXRlIGFuZCBzZXQgdGhlIHN0cmVh
bS4KLQotICAgIC8vIFBhc3MgdGhlIGxlbmd0aCBhbG9uZyB3aXRoIHRoZSBmb3JtRGF0YSBzbyBp
dCBkb2VzIG5vdCBoYXZlIHRvIGJlIHJlY29tcHV0ZWQuCi0gICAgRm9ybUNvbnRleHQgZm9ybUNv
bnRleHQgPSB7IGZvcm1EYXRhLnJlbGVhc2UoKSwgbGVuZ3RoIH07Ci0KLSAgICBSZXRhaW5QdHI8
Q0ZSZWFkU3RyZWFtUmVmPiBzdHJlYW0oQWRvcHRDRiwgd2tDcmVhdGVDdXN0b21DRlJlYWRTdHJl
YW0oZm9ybUNyZWF0ZSwgZm9ybUZpbmFsaXplLAotICAgICAgICBmb3JtT3BlbiwgZm9ybVJlYWQs
IGZvcm1DYW5SZWFkLCBmb3JtQ2xvc2UsIGZvcm1TY2hlZHVsZSwgZm9ybVVuc2NoZWR1bGUsCi0g
ICAgICAgICZmb3JtQ29udGV4dCkpOwotICAgIFtyZXF1ZXN0IHNldEhUVFBCb2R5U3RyZWFtOihO
U0lucHV0U3RyZWFtICopc3RyZWFtLmdldCgpXTsKKyAgICBzZXRIVFRQQm9keShjb25zdF9jYXN0
PENGTXV0YWJsZVVSTFJlcXVlc3RSZWY+KFtyZXF1ZXN0IF9DRlVSTFJlcXVlc3RdKSwgcHJwRm9y
bURhdGEpOwogfQogCi1Gb3JtRGF0YSogaHR0cEJvZHlGcm9tU3RyZWFtKE5TSW5wdXRTdHJlYW0q
IHN0cmVhbSkKK0Zvcm1EYXRhKiBodHRwQm9keUZyb21TdHJlYW0oTlNJbnB1dFN0cmVhbSAqc3Ry
ZWFtKQogewotICAgIE11dGV4TG9ja2VyIGxvY2tlcihzdHJlYW1GaWVsZHNNYXBNdXRleCgpKTsK
LSAgICBGb3JtU3RyZWFtRmllbGRzKiBmb3JtU3RyZWFtID0gc3RyZWFtRmllbGRzTWFwKCkuZ2V0
KHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZSZWFkU3RyZWFtUmVmPihzdHJlYW0pKTsKLSAgICBpZiAoIWZv
cm1TdHJlYW0pCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiBmb3JtU3RyZWFtLT5mb3Jt
RGF0YS5nZXQoKTsKKyAgICByZXR1cm4gaHR0cEJvZHlGcm9tU3RyZWFtKHJlaW50ZXJwcmV0X2Nh
c3Q8Q0ZSZWFkU3RyZWFtUmVmPihzdHJlYW0pKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29y
ZQo=
</data>
<flag name="commit-queue"
          id="138628"
          type_id="3"
          status="-"
          setter="buildbot"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>134414</attachid>
            <date>2012-03-28 15:08:42 -0700</date>
            <delta_ts>2012-03-28 15:42:26 -0700</delta_ts>
            <desc>moar!</desc>
            <filename>FormDataStream.txt</filename>
            <type>text/plain</type>
            <size>42689</size>
            <attacher name="Alexey Proskuryakov">ap</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDExMjQ0OCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDMwIEBACisyMDEyLTAzLTI4ICBBbGV4ZXkg
UHJvc2t1cnlha292ICA8YXBAYXBwbGUuY29tPgorCisgICAgICAgIFtXaW5dIFNvbWUgQmxvYiB0
ZXN0cyBjcmFzaCBpbiBDRk5ldHdvcmsgaW4gYWR2YW5jZUN1cnJlbnRTdHJlYW0oRm9ybVN0cmVh
bUZpZWxkcyopCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD04MjM4NgorICAgICAgICA8cmRhcjovL3Byb2JsZW0vMTExMjE1MDE+CisKKyAgICAgICAgUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQ292ZXJlZCBieSBleGlzdGluZyB0
ZXN0cy4KKworICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvY2YvRm9ybURhdGFTdHJlYW1DRk5l
dC5jcHA6CisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jZi9Gb3JtRGF0YVN0cmVhbUNGTmV0
Lmg6CisgICAgICAgIE1vdmVkIGxvdyBsZXZlbCBpbXBsZW1lbnRhdGlvbiBmcm9tIEZvcm1EYXRh
U3RyZWFtTWFjLCBhbmQgZXhwb3NlZCBhbiBhZGRpdGlvbmFsIGZ1bmN0aW9uCisgICAgICAgIHRv
IGltcGxlbWVudCBGb3VuZGF0aW9uLWJhc2VkIEFQSSBvbiB0b3Agb2YgdGhpcy4KKworICAgICAg
ICAqIHBsYXRmb3JtL25ldHdvcmsvbWFjL0Zvcm1EYXRhU3RyZWFtTWFjLmg6CisgICAgICAgICog
cGxhdGZvcm0vbmV0d29yay9tYWMvRm9ybURhdGFTdHJlYW1NYWMubW06CisgICAgICAgIFJlbHkg
b24gdG9sbC1mcmVlIGJyaWRnaW5nIGFuZCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIHRvIG1ha2Ug
dGhpcyB3b3JrIHdpdGhvdXQgZHVwbGljYXRpbmcKKyAgICAgICAgY29kZS4KKyAgICAgICAgTm90
ZSB0aGF0IGh0dHBCb2R5RnJvbVN0cmVhbSBpcyBjb25mdXNpbmcgLSBJIGRvbid0IHNlZSBob3cg
aXQgY2FuIHdvcmsgd2hlbiBzZW5kaW5nIHNlcmlhbGl6ZWQKKyAgICAgICAgcmVxdWVzdHMgYWNy
b3NzIHByb2Nlc3MgYm91bmRhcnkuIFdlIHByb2JhYmx5IG9ubHkgZ2V0IGF3YXkgd2l0aCB0aGlz
IGJlY2F1c2Ugd2UgZG9uJ3QgYXR0ZW1wdAorICAgICAgICB0byBzZW5kIHJlcXVlc3RzIHRvIFVJ
IHByb2Nlc3Mgb25jZSB0aGV5IGFscmVhZHkgaGF2ZSBzdHJlYW1zIGFzc29jaWF0ZWQgd2l0aCB0
aGVtLgorCisgICAgICAgICogV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2o6IEFkZGVkIG1p
c3NpbmcgcGxhdGZvcm0vY2YgZmlsZXMuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9jZi9GaWxlU3lz
dGVtQ0YuY3BwOiBGaXhlZCBpbmNsdWRlIHN0eWxlLgorCiAyMDEyLTAzLTI3ICBEYW5pZWwgQ2hl
bmcgIDxkY2hlbmdAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFtjaHJvbWl1bV0gTWVyZ2UgQ2hy
b21pdW1EYXRhT2JqZWN0IGFuZCBEYXRhVHJhbnNmZXJJdGVtTGlzdENocm9taXVtLgpJbmRleDog
U291cmNlL1dlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oJKHJldmlzaW9u
IDExMjE2NikKKysrIFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9q
CSh3b3JraW5nIGNvcHkpCkBAIC0yODM4NSw2ICsyODM4NSwxMCBAQAogCQkJCQk+CiAJCQkJPC9G
aWxlPgogCQkJCTxGaWxlCisJCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1cY2ZcRmlsZVN5
c3RlbUNGLmNwcCIKKwkJCQkJPgorCQkJCTwvRmlsZT4KKwkJCQk8RmlsZQogCQkJCQlSZWxhdGl2
ZVBhdGg9Ii4uXHBsYXRmb3JtXGNmXEtVUkxDRk5ldC5jcHAiCiAJCQkJCT4KIAkJCQk8L0ZpbGU+
CkBAIC0yODM5Myw2ICsyODM5NywxNCBAQAogCQkJCQk+CiAJCQkJPC9GaWxlPgogCQkJCTxGaWxl
CisJCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1cY2ZcU2NoZWR1bGVQYWlyLmNwcCIKKwkJ
CQkJPgorCQkJCTwvRmlsZT4KKwkJCQk8RmlsZQorCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRm
b3JtXGNmXFNjaGVkdWxlUGFpci5oIgorCQkJCQk+CisJCQkJPC9GaWxlPgorCQkJCTxGaWxlCiAJ
CQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1cY2ZcU2hhcmVkQnVmZmVyQ0YuY3BwIgogCQkJ
CQk+CiAJCQkJPC9GaWxlPgpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vY2YvRmlsZVN5
c3RlbUNGLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9jZi9GaWxl
U3lzdGVtQ0YuY3BwCShyZXZpc2lvbiAxMTIxNjYpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9jZi9GaWxlU3lzdGVtQ0YuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNiwxMiArMjYsMTIgQEAK
ICAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCiAgKi8KIAotI2ltcG9ydCAiY29uZmlnLmgiCi0jaW1wb3J0ICJGaWxlU3lz
dGVtLmgiCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRmlsZVN5c3RlbS5oIgogCi0j
aW1wb3J0ICJQbGF0Zm9ybVN0cmluZy5oIgotI2ltcG9ydCA8d3RmL1JldGFpblB0ci5oPgotI2lt
cG9ydCA8d3RmL3RleHQvQ1N0cmluZy5oPgorI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisj
aW5jbHVkZSA8d3RmL1JldGFpblB0ci5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4K
IAogbmFtZXNwYWNlIFdlYkNvcmUgewogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9u
ZXR3b3JrL2NmL0Zvcm1EYXRhU3RyZWFtQ0ZOZXQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY2YvRm9ybURhdGFTdHJlYW1DRk5ldC5jcHAJKHJldmlz
aW9uIDExMjE2NikKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY2YvRm9ybURh
dGFTdHJlYW1DRk5ldC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw1IEBACiAvKgotICog
Q29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDcsIDIwMTIgQXBwbGUgSW5j
LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpA
QCAtMjYsOTkgKzI2LDQ2NCBAQAogICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICAqLwogCi0vKiBvcmlnaW5hbGx5IHdy
aXR0ZW4gYnkgQmVja3kgV2lsbHJpY2gsIGFkZGl0aW9uYWwgY29kZSBieSBEYXJpbiBBZGxlciAq
LwotCiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiRm9ybURhdGFTdHJlYW1DRk5ldC5o
IgogCi0jaWYgVVNFKENGTkVUV09SSykKLQorI2luY2x1ZGUgIkJsb2JSZWdpc3RyeUltcGwuaCIK
ICNpbmNsdWRlICJGaWxlU3lzdGVtLmgiCiAjaW5jbHVkZSAiRm9ybURhdGEuaCIKLSNpbmNsdWRl
IDxDRk5ldHdvcmsvQ0ZVUkxSZXF1ZXN0UHJpdi5oPgorI2luY2x1ZGUgIlNjaGVkdWxlUGFpci5o
IgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVk
ZSA8d3RmL0Fzc2VydGlvbnMuaD4KICNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgorI2luY2x1ZGUg
PHd0Zi9NYWluVGhyZWFkLmg+CiAjaW5jbHVkZSA8d3RmL1JldGFpblB0ci5oPgotI2luY2x1ZGUg
PHd0Zi90ZXh0L0NTdHJpbmcuaD4KKyNpbmNsdWRlIDx3dGYvU3RkTGliRXh0cmFzLmg+CisjaW5j
bHVkZSA8d3RmL1RocmVhZGluZy5oPgorCisjaWYgUExBVEZPUk0oSU9TKQorI2luY2x1ZGUgPE1h
Y0Vycm9ycy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxDb3JlU2VydmljZXMvQ29yZVNlcnZpY2VzLmg+
CisjZW5kaWYKIAogI2lmIFBMQVRGT1JNKE1BQykKLSNpbmNsdWRlICJXZWJDb3JlU3lzdGVtSW50
ZXJmYWNlLmgiCitleHRlcm4gIkMiIHZvaWQgQ0ZVUkxSZXF1ZXN0U2V0SFRUUFJlcXVlc3RCb2R5
KENGTXV0YWJsZVVSTFJlcXVlc3RSZWYgbXV0YWJsZUhUVFBSZXF1ZXN0LCBDRkRhdGFSZWYgaHR0
cEJvZHkpOworZXh0ZXJuICJDIiB2b2lkIENGVVJMUmVxdWVzdFNldEhUVFBIZWFkZXJGaWVsZFZh
bHVlKENGTXV0YWJsZVVSTFJlcXVlc3RSZWYgbXV0YWJsZUhUVFBSZXF1ZXN0LCBDRlN0cmluZ1Jl
ZiBodHRwSGVhZGVyRmllbGQsIENGU3RyaW5nUmVmIGh0dHBIZWFkZXJGaWVsZFZhbHVlKTsKK2V4
dGVybiAiQyIgdm9pZCBDRlVSTFJlcXVlc3RTZXRIVFRQUmVxdWVzdEJvZHlTdHJlYW0oQ0ZNdXRh
YmxlVVJMUmVxdWVzdFJlZiByZXEsIENGUmVhZFN0cmVhbVJlZiBib2R5U3RyZWFtKTsKK2V4dGVy
biAiQyIgQ0ZSZWFkU3RyZWFtUmVmIENGVVJMUmVxdWVzdENvcHlIVFRQUmVxdWVzdEJvZHlTdHJl
YW0oQ0ZVUkxSZXF1ZXN0UmVmIHJlcXVlc3QpOwogI2VsaWYgUExBVEZPUk0oV0lOKQotI2luY2x1
ZGUgPFdlYktpdFN5c3RlbUludGVyZmFjZS9XZWJLaXRTeXN0ZW1JbnRlcmZhY2UuaD4KKyNpbmNs
dWRlIDxDRk5ldHdvcmsvQ0ZVUkxSZXF1ZXN0Lmg+CiAjZW5kaWYKIAordHlwZWRlZiBzdHJ1Y3Qg
eworICAgIENGSW5kZXggdmVyc2lvbjsgLyogPT0gMSAqLworICAgIHZvaWQgKigqY3JlYXRlKShD
RlJlYWRTdHJlYW1SZWYgc3RyZWFtLCB2b2lkICppbmZvKTsKKyAgICB2b2lkICgqZmluYWxpemUp
KENGUmVhZFN0cmVhbVJlZiBzdHJlYW0sIHZvaWQgKmluZm8pOworICAgIENGU3RyaW5nUmVmICgq
Y29weURlc2NyaXB0aW9uKShDRlJlYWRTdHJlYW1SZWYgc3RyZWFtLCB2b2lkICppbmZvKTsKKyAg
ICBCb29sZWFuICgqb3BlbikoQ0ZSZWFkU3RyZWFtUmVmIHN0cmVhbSwgQ0ZTdHJlYW1FcnJvciAq
ZXJyb3IsIEJvb2xlYW4gKm9wZW5Db21wbGV0ZSwgdm9pZCAqaW5mbyk7CisgICAgQm9vbGVhbiAo
Km9wZW5Db21wbGV0ZWQpKENGUmVhZFN0cmVhbVJlZiBzdHJlYW0sIENGU3RyZWFtRXJyb3IgKmVy
cm9yLCB2b2lkICppbmZvKTsKKyAgICBDRkluZGV4ICgqcmVhZCkoQ0ZSZWFkU3RyZWFtUmVmIHN0
cmVhbSwgVUludDggKmJ1ZmZlciwgQ0ZJbmRleCBidWZmZXJMZW5ndGgsIENGU3RyZWFtRXJyb3Ig
KmVycm9yLCBCb29sZWFuICphdEVPRiwgdm9pZCAqaW5mbyk7CisgICAgY29uc3QgVUludDggKigq
Z2V0QnVmZmVyKShDRlJlYWRTdHJlYW1SZWYgc3RyZWFtLCBDRkluZGV4IG1heEJ5dGVzVG9SZWFk
LCBDRkluZGV4ICpudW1CeXRlc1JlYWQsIENGU3RyZWFtRXJyb3IgKmVycm9yLCBCb29sZWFuICph
dEVPRiwgdm9pZCAqaW5mbyk7CisgICAgQm9vbGVhbiAoKmNhblJlYWQpKENGUmVhZFN0cmVhbVJl
ZiBzdHJlYW0sIHZvaWQgKmluZm8pOworICAgIHZvaWQgKCpjbG9zZSkoQ0ZSZWFkU3RyZWFtUmVm
IHN0cmVhbSwgdm9pZCAqaW5mbyk7CisgICAgQ0ZUeXBlUmVmICgqY29weVByb3BlcnR5KShDRlJl
YWRTdHJlYW1SZWYgc3RyZWFtLCBDRlN0cmluZ1JlZiBwcm9wZXJ0eU5hbWUsIHZvaWQgKmluZm8p
OworICAgIEJvb2xlYW4gKCpzZXRQcm9wZXJ0eSkoQ0ZSZWFkU3RyZWFtUmVmIHN0cmVhbSwgQ0ZT
dHJpbmdSZWYgcHJvcGVydHlOYW1lLCBDRlR5cGVSZWYgcHJvcGVydHlWYWx1ZSwgdm9pZCAqaW5m
byk7CisgICAgdm9pZCAoKnJlcXVlc3RFdmVudHMpKENGUmVhZFN0cmVhbVJlZiBzdHJlYW0sIENG
T3B0aW9uRmxhZ3Mgc3RyZWFtRXZlbnRzLCB2b2lkICppbmZvKTsKKyAgICB2b2lkICgqc2NoZWR1
bGUpKENGUmVhZFN0cmVhbVJlZiBzdHJlYW0sIENGUnVuTG9vcFJlZiBydW5Mb29wLCBDRlN0cmlu
Z1JlZiBydW5Mb29wTW9kZSwgdm9pZCAqaW5mbyk7CisgICAgdm9pZCAoKnVuc2NoZWR1bGUpKENG
UmVhZFN0cmVhbVJlZiBzdHJlYW0sIENGUnVuTG9vcFJlZiBydW5Mb29wLCBDRlN0cmluZ1JlZiBy
dW5Mb29wTW9kZSwgdm9pZCAqaW5mbyk7Cit9IENGUmVhZFN0cmVhbUNhbGxCYWNrc1YxOworCisj
aWYgUExBVEZPUk0oV0lOKQorI2RlZmluZSBFWFRFUk4gZXh0ZXJuICJDIiBfX2RlY2xzcGVjKGRs
bGltcG9ydCkKKyNlbHNlCisjZGVmaW5lIEVYVEVSTiBleHRlcm4gIkMiCisjZW5kaWYKKworRVhU
RVJOIHZvaWQgQ0ZSZWFkU3RyZWFtU2lnbmFsRXZlbnQoQ0ZSZWFkU3RyZWFtUmVmIHN0cmVhbSwg
Q0ZTdHJlYW1FdmVudFR5cGUgZXZlbnQsIGNvbnN0IHZvaWQgKmVycm9yKTsKK0VYVEVSTiBDRlJl
YWRTdHJlYW1SZWYgQ0ZSZWFkU3RyZWFtQ3JlYXRlKENGQWxsb2NhdG9yUmVmIGFsbG9jLCBjb25z
dCB2b2lkICpjYWxsYmFja3MsIHZvaWQgKmluZm8pOworCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAK
LXZvaWQgc2V0SFRUUEJvZHkoQ0ZNdXRhYmxlVVJMUmVxdWVzdFJlZiByZXF1ZXN0LCBQYXNzUmVm
UHRyPEZvcm1EYXRhPiBmb3JtRGF0YSkKK3N0YXRpYyBNdXRleCYgc3RyZWFtRmllbGRzTWFwTXV0
ZXgoKQogewotICAgIGlmICghZm9ybURhdGEpIHsKLSAgICAgICAgd2tDRlVSTFJlcXVlc3RTZXRI
VFRQUmVxdWVzdEJvZHlQYXJ0cyhyZXF1ZXN0LCAwKTsKLSAgICAgICAgcmV0dXJuOworICAgIERF
RklORV9TVEFUSUNfTE9DQUwoTXV0ZXgsIHN0YXRpY011dGV4LCAoKSk7CisgICAgcmV0dXJuIHN0
YXRpY011dGV4OworfQorCitzdGF0aWMgdm9pZCBmb3JtRXZlbnRDYWxsYmFjayhDRlJlYWRTdHJl
YW1SZWYgc3RyZWFtLCBDRlN0cmVhbUV2ZW50VHlwZSB0eXBlLCB2b2lkKiBjb250ZXh0KTsKKwor
c3RydWN0IEZvcm1Db250ZXh0IHsKKyAgICBSZWZQdHI8Rm9ybURhdGE+IGZvcm1EYXRhOworICAg
IHVuc2lnbmVkIGxvbmcgbG9uZyBzdHJlYW1MZW5ndGg7Cit9OworCitzdHJ1Y3QgRm9ybVN0cmVh
bUZpZWxkcyB7CisgICAgUmVmUHRyPEZvcm1EYXRhPiBmb3JtRGF0YTsKKyAgICBTY2hlZHVsZVBh
aXJIYXNoU2V0IHNjaGVkdWxlZFJ1bkxvb3BQYWlyczsKKyAgICBWZWN0b3I8Rm9ybURhdGFFbGVt
ZW50PiByZW1haW5pbmdFbGVtZW50czsgLy8gaW4gcmV2ZXJzZSBvcmRlcgorICAgIENGUmVhZFN0
cmVhbVJlZiBjdXJyZW50U3RyZWFtOworI2lmIEVOQUJMRShCTE9CKQorICAgIGxvbmcgbG9uZyBj
dXJyZW50U3RyZWFtUmFuZ2VMZW5ndGg7CisjZW5kaWYKKyAgICBjaGFyKiBjdXJyZW50RGF0YTsK
KyAgICBDRlJlYWRTdHJlYW1SZWYgZm9ybVN0cmVhbTsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcg
c3RyZWFtTGVuZ3RoOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBieXRlc1NlbnQ7Cit9OworCit0
eXBlZGVmIEhhc2hNYXA8Q0ZSZWFkU3RyZWFtUmVmLCBGb3JtU3RyZWFtRmllbGRzKj4gU3RyZWFt
RmllbGRzTWFwOworc3RhdGljIFN0cmVhbUZpZWxkc01hcCYgc3RyZWFtRmllbGRzTWFwKCkKK3sK
KyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKFN0cmVhbUZpZWxkc01hcCwgc3RyZWFtRmllbGRzTWFw
LCAoKSk7CisgICAgcmV0dXJuIHN0cmVhbUZpZWxkc01hcDsKK30KKworc3RhdGljIHZvaWQgY2xv
c2VDdXJyZW50U3RyZWFtKEZvcm1TdHJlYW1GaWVsZHMgKmZvcm0pCit7CisgICAgaWYgKGZvcm0t
PmN1cnJlbnRTdHJlYW0pIHsKKyAgICAgICAgQ0ZSZWFkU3RyZWFtQ2xvc2UoZm9ybS0+Y3VycmVu
dFN0cmVhbSk7CisgICAgICAgIENGUmVhZFN0cmVhbVNldENsaWVudChmb3JtLT5jdXJyZW50U3Ry
ZWFtLCBrQ0ZTdHJlYW1FdmVudE5vbmUsIDAsIDApOworICAgICAgICBDRlJlbGVhc2UoZm9ybS0+
Y3VycmVudFN0cmVhbSk7CisgICAgICAgIGZvcm0tPmN1cnJlbnRTdHJlYW0gPSAwOworI2lmIEVO
QUJMRShCTE9CKQorICAgICAgICBmb3JtLT5jdXJyZW50U3RyZWFtUmFuZ2VMZW5ndGggPSBCbG9i
RGF0YUl0ZW06OnRvRW5kT2ZGaWxlOworI2VuZGlmCiAgICAgfQorICAgIGlmIChmb3JtLT5jdXJy
ZW50RGF0YSkgeworICAgICAgICBmYXN0RnJlZShmb3JtLT5jdXJyZW50RGF0YSk7CisgICAgICAg
IGZvcm0tPmN1cnJlbnREYXRhID0gMDsKKyAgICB9Cit9CiAKLSAgICBzaXplX3QgY291bnQgPSBm
b3JtRGF0YS0+ZWxlbWVudHMoKS5zaXplKCk7CisvLyBSZXR1cm4gZmFsc2UgaWYgd2UgY2Fubm90
IGFkdmFuY2UgdGhlIHN0cmVhbS4gQ3VycmVudGx5IHRoZSBvbmx5IHBvc3NpYmxlIGZhaWx1cmUg
aXMgdGhhdCB0aGUgdW5kZXJseWluZyBmaWxlIGhhcyBiZWVuIHJlbW92ZWQgb3IgY2hhbmdlZCBz
aW5jZSBGaWxlLnNsaWNlLgorc3RhdGljIGJvb2wgYWR2YW5jZUN1cnJlbnRTdHJlYW0oRm9ybVN0
cmVhbUZpZWxkcyogZm9ybSkKK3sKKyAgICBjbG9zZUN1cnJlbnRTdHJlYW0oZm9ybSk7CisKKyAg
ICBpZiAoZm9ybS0+cmVtYWluaW5nRWxlbWVudHMuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4g
dHJ1ZTsKKworICAgIC8vIENyZWF0ZSB0aGUgbmV3IHN0cmVhbS4KKyAgICBGb3JtRGF0YUVsZW1l
bnQmIG5leHRJbnB1dCA9IGZvcm0tPnJlbWFpbmluZ0VsZW1lbnRzLmxhc3QoKTsKKworICAgIGlm
IChuZXh0SW5wdXQubV90eXBlID09IEZvcm1EYXRhRWxlbWVudDo6ZGF0YSkgeworICAgICAgICBz
aXplX3Qgc2l6ZSA9IG5leHRJbnB1dC5tX2RhdGEuc2l6ZSgpOworICAgICAgICBjaGFyKiBkYXRh
ID0gbmV4dElucHV0Lm1fZGF0YS5yZWxlYXNlQnVmZmVyKCk7CisgICAgICAgIGZvcm0tPmN1cnJl
bnRTdHJlYW0gPSBDRlJlYWRTdHJlYW1DcmVhdGVXaXRoQnl0ZXNOb0NvcHkoMCwgcmVpbnRlcnBy
ZXRfY2FzdDxjb25zdCBVSW50OCo+KGRhdGEpLCBzaXplLCBrQ0ZBbGxvY2F0b3JOdWxsKTsKKyAg
ICAgICAgZm9ybS0+Y3VycmVudERhdGEgPSBkYXRhOworICAgIH0gZWxzZSB7CisjaWYgRU5BQkxF
KEJMT0IpCisgICAgICAgIC8vIENoZWNrIGlmIHRoZSBmaWxlIGhhcyBiZWVuIGNoYW5nZWQgb3Ig
bm90IGlmIHJlcXVpcmVkLgorICAgICAgICBpZiAobmV4dElucHV0Lm1fZXhwZWN0ZWRGaWxlTW9k
aWZpY2F0aW9uVGltZSAhPSBCbG9iRGF0YUl0ZW06OmRvTm90Q2hlY2tGaWxlQ2hhbmdlKSB7Cisg
ICAgICAgICAgICB0aW1lX3QgZmlsZU1vZGlmaWNhdGlvblRpbWU7CisgICAgICAgICAgICBpZiAo
IWdldEZpbGVNb2RpZmljYXRpb25UaW1lKG5leHRJbnB1dC5tX2ZpbGVuYW1lLCBmaWxlTW9kaWZp
Y2F0aW9uVGltZSkgfHwgZmlsZU1vZGlmaWNhdGlvblRpbWUgIT0gc3RhdGljX2Nhc3Q8dGltZV90
PihuZXh0SW5wdXQubV9leHBlY3RlZEZpbGVNb2RpZmljYXRpb25UaW1lKSkKKyAgICAgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBjb25zdCBTdHJp
bmcmIHBhdGggPSBuZXh0SW5wdXQubV9zaG91bGRHZW5lcmF0ZUZpbGUgPyBuZXh0SW5wdXQubV9n
ZW5lcmF0ZWRGaWxlbmFtZSA6IG5leHRJbnB1dC5tX2ZpbGVuYW1lOworICAgICAgICBmb3JtLT5j
dXJyZW50U3RyZWFtID0gQ0ZSZWFkU3RyZWFtQ3JlYXRlV2l0aEZpbGUoMCwgcGF0aEFzVVJMKHBh
dGgpLmdldCgpKTsKKyAgICAgICAgaWYgKCFmb3JtLT5jdXJyZW50U3RyZWFtKSB7CisgICAgICAg
ICAgICAvLyBUaGUgZmlsZSBtdXN0IGhhdmUgYmVlbiByZW1vdmVkIG9yIGJlY29tZSB1bnJlYWRh
YmxlLgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisjaWYgRU5BQkxFKEJM
T0IpCisgICAgICAgIGlmIChuZXh0SW5wdXQubV9maWxlU3RhcnQgPiAwKSB7CisgICAgICAgICAg
ICBSZXRhaW5QdHI8Q0ZOdW1iZXJSZWY+IHBvc2l0aW9uKEFkb3B0Q0YsIENGTnVtYmVyQ3JlYXRl
KDAsIGtDRk51bWJlckxvbmdMb25nVHlwZSwgJm5leHRJbnB1dC5tX2ZpbGVTdGFydCkpOworICAg
ICAgICAgICAgQ0ZSZWFkU3RyZWFtU2V0UHJvcGVydHkoZm9ybS0+Y3VycmVudFN0cmVhbSwga0NG
U3RyZWFtUHJvcGVydHlGaWxlQ3VycmVudE9mZnNldCwgcG9zaXRpb24uZ2V0KCkpOworICAgICAg
ICB9CisgICAgICAgIGZvcm0tPmN1cnJlbnRTdHJlYW1SYW5nZUxlbmd0aCA9IG5leHRJbnB1dC5t
X2ZpbGVMZW5ndGg7CisjZW5kaWYKKyAgICB9CisgICAgZm9ybS0+cmVtYWluaW5nRWxlbWVudHMu
cmVtb3ZlTGFzdCgpOworCisgICAgLy8gU2V0IHVwIHRoZSBjYWxsYmFjay4KKyAgICBDRlN0cmVh
bUNsaWVudENvbnRleHQgY29udGV4dCA9IHsgMCwgZm9ybSwgMCwgMCwgMCB9OworICAgIENGUmVh
ZFN0cmVhbVNldENsaWVudChmb3JtLT5jdXJyZW50U3RyZWFtLCBrQ0ZTdHJlYW1FdmVudEhhc0J5
dGVzQXZhaWxhYmxlIHwga0NGU3RyZWFtRXZlbnRFcnJvck9jY3VycmVkIHwga0NGU3RyZWFtRXZl
bnRFbmRFbmNvdW50ZXJlZCwKKyAgICAgICAgZm9ybUV2ZW50Q2FsbGJhY2ssICZjb250ZXh0KTsK
KworICAgIC8vIFNjaGVkdWxlIHdpdGggdGhlIGN1cnJlbnQgc2V0IG9mIHJ1biBsb29wcy4KKyAg
ICBTY2hlZHVsZVBhaXJIYXNoU2V0OjppdGVyYXRvciBlbmQgPSBmb3JtLT5zY2hlZHVsZWRSdW5M
b29wUGFpcnMuZW5kKCk7CisgICAgZm9yIChTY2hlZHVsZVBhaXJIYXNoU2V0OjppdGVyYXRvciBp
dCA9IGZvcm0tPnNjaGVkdWxlZFJ1bkxvb3BQYWlycy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQp
CisgICAgICAgIENGUmVhZFN0cmVhbVNjaGVkdWxlV2l0aFJ1bkxvb3AoZm9ybS0+Y3VycmVudFN0
cmVhbSwgKCppdCktPnJ1bkxvb3AoKSwgKCppdCktPm1vZGUoKSk7CisKKyAgICByZXR1cm4gdHJ1
ZTsKK30KKworc3RhdGljIGJvb2wgb3Blbk5leHRTdHJlYW0oRm9ybVN0cmVhbUZpZWxkcyogZm9y
bSkKK3sKKyAgICAvLyBTa2lwIG92ZXIgYW55IHN0cmVhbXMgd2UgY2FuJ3Qgb3Blbi4KKyAgICBp
ZiAoIWFkdmFuY2VDdXJyZW50U3RyZWFtKGZvcm0pKQorICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgd2hpbGUgKGZvcm0tPmN1cnJlbnRTdHJlYW0gJiYgIUNGUmVhZFN0cmVhbU9wZW4oZm9ybS0+
Y3VycmVudFN0cmVhbSkpIHsKKyAgICAgICAgaWYgKCFhZHZhbmNlQ3VycmVudFN0cmVhbShmb3Jt
KSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9
CisKK3N0YXRpYyB2b2lkKiBmb3JtQ3JlYXRlKENGUmVhZFN0cmVhbVJlZiBzdHJlYW0sIHZvaWQq
IGNvbnRleHQpCit7CisgICAgRm9ybUNvbnRleHQqIGZvcm1Db250ZXh0ID0gc3RhdGljX2Nhc3Q8
Rm9ybUNvbnRleHQqPihjb250ZXh0KTsKKworICAgIEZvcm1TdHJlYW1GaWVsZHMqIG5ld0luZm8g
PSBuZXcgRm9ybVN0cmVhbUZpZWxkczsKKyAgICBuZXdJbmZvLT5mb3JtRGF0YSA9IGZvcm1Db250
ZXh0LT5mb3JtRGF0YS5yZWxlYXNlKCk7CisgICAgbmV3SW5mby0+Y3VycmVudFN0cmVhbSA9IDA7
CisjaWYgRU5BQkxFKEJMT0IpCisgICAgbmV3SW5mby0+Y3VycmVudFN0cmVhbVJhbmdlTGVuZ3Ro
ID0gQmxvYkRhdGFJdGVtOjp0b0VuZE9mRmlsZTsKKyNlbmRpZgorICAgIG5ld0luZm8tPmN1cnJl
bnREYXRhID0gMDsKKyAgICBuZXdJbmZvLT5mb3JtU3RyZWFtID0gc3RyZWFtOyAvLyBEb24ndCBy
ZXRhaW4uIFRoYXQgd291bGQgY3JlYXRlIGEgcmVmZXJlbmNlIGN5Y2xlLgorICAgIG5ld0luZm8t
PnN0cmVhbUxlbmd0aCA9IGZvcm1Db250ZXh0LT5zdHJlYW1MZW5ndGg7CisgICAgbmV3SW5mby0+
Ynl0ZXNTZW50ID0gMDsKKworICAgIC8vIEFwcGVuZCBpbiByZXZlcnNlIG9yZGVyIHNpbmNlIHdl
IHJlbW92ZSBlbGVtZW50cyBmcm9tIHRoZSBlbmQuCisgICAgc2l6ZV90IHNpemUgPSBuZXdJbmZv
LT5mb3JtRGF0YS0+ZWxlbWVudHMoKS5zaXplKCk7CisgICAgbmV3SW5mby0+cmVtYWluaW5nRWxl
bWVudHMucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShzaXplKTsKKyAgICBmb3IgKHNpemVfdCBpID0g
MDsgaSA8IHNpemU7ICsraSkKKyAgICAgICAgbmV3SW5mby0+cmVtYWluaW5nRWxlbWVudHMuYXBw
ZW5kKG5ld0luZm8tPmZvcm1EYXRhLT5lbGVtZW50cygpW3NpemUgLSBpIC0gMV0pOworCisgICAg
TXV0ZXhMb2NrZXIgbG9ja2VyKHN0cmVhbUZpZWxkc01hcE11dGV4KCkpOworICAgIEFTU0VSVCgh
c3RyZWFtRmllbGRzTWFwKCkuY29udGFpbnMoc3RyZWFtKSk7CisgICAgc3RyZWFtRmllbGRzTWFw
KCkuYWRkKHN0cmVhbSwgbmV3SW5mbyk7CisKKyAgICByZXR1cm4gbmV3SW5mbzsKK30KKworc3Rh
dGljIHZvaWQgZm9ybUZpbmlzaEZpbmFsaXphdGlvbk9uTWFpblRocmVhZCh2b2lkKiBjb250ZXh0
KQoreworICAgIE93blB0cjxGb3JtU3RyZWFtRmllbGRzPiBmb3JtID0gYWRvcHRQdHIoc3RhdGlj
X2Nhc3Q8Rm9ybVN0cmVhbUZpZWxkcyo+KGNvbnRleHQpKTsKKworICAgIGNsb3NlQ3VycmVudFN0
cmVhbShmb3JtLmdldCgpKTsKK30KKworc3RhdGljIHZvaWQgZm9ybUZpbmFsaXplKENGUmVhZFN0
cmVhbVJlZiBzdHJlYW0sIHZvaWQqIGNvbnRleHQpCit7CisgICAgRm9ybVN0cmVhbUZpZWxkcyog
Zm9ybSA9IHN0YXRpY19jYXN0PEZvcm1TdHJlYW1GaWVsZHMqPihjb250ZXh0KTsKKworICAgIE11
dGV4TG9ja2VyIGxvY2tlcihzdHJlYW1GaWVsZHNNYXBNdXRleCgpKTsKKworICAgIEFTU0VSVChm
b3JtLT5mb3JtU3RyZWFtID09IHN0cmVhbSk7CisgICAgQVNTRVJUKHN0cmVhbUZpZWxkc01hcCgp
LmdldChzdHJlYW0pID09IGNvbnRleHQpOworCisgICAgLy8gRG8gdGhpcyByaWdodCBhd2F5IGJl
Y2F1c2UgdGhlIENGUmVhZFN0cmVhbVJlZiBpcyBiZWluZyBkZWFsbG9jYXRlZC4KKyAgICAvLyBX
ZSBjYW4ndCB3YWl0IHRvIHJlbW92ZSB0aGlzIGZyb20gdGhlIG1hcCB1bnRpbCB3ZSBmaW5pc2gg
ZmluYWxpemluZworICAgIC8vIG9uIHRoZSBtYWluIHRocmVhZCBiZWNhdXNlIGluIHRoZW9yeSB0
aGUgZnJlZWQgbWVtb3J5IGNvdWxkIGJlIHJldXNlZAorICAgIC8vIGZvciBhIG5ldyBDRlJlYWRT
dHJlYW0gYmVmb3JlIHRoYXQgcnVucy4KKyAgICBzdHJlYW1GaWVsZHNNYXAoKS5yZW1vdmUoc3Ry
ZWFtKTsKKworICAgIGNhbGxPbk1haW5UaHJlYWQoZm9ybUZpbmlzaEZpbmFsaXphdGlvbk9uTWFp
blRocmVhZCwgZm9ybSk7Cit9CisKK3N0YXRpYyBCb29sZWFuIGZvcm1PcGVuKENGUmVhZFN0cmVh
bVJlZiwgQ0ZTdHJlYW1FcnJvciogZXJyb3IsIEJvb2xlYW4qIG9wZW5Db21wbGV0ZSwgdm9pZCog
Y29udGV4dCkKK3sKKyAgICBGb3JtU3RyZWFtRmllbGRzKiBmb3JtID0gc3RhdGljX2Nhc3Q8Rm9y
bVN0cmVhbUZpZWxkcyo+KGNvbnRleHQpOworCisgICAgYm9vbCBvcGVuZWQgPSBvcGVuTmV4dFN0
cmVhbShmb3JtKTsKKworICAgICpvcGVuQ29tcGxldGUgPSBvcGVuZWQ7CisgICAgZXJyb3ItPmVy
cm9yID0gb3BlbmVkID8gMCA6IGZuZkVycjsKKyAgICByZXR1cm4gb3BlbmVkOworfQorCitzdGF0
aWMgQ0ZJbmRleCBmb3JtUmVhZChDRlJlYWRTdHJlYW1SZWYsIFVJbnQ4KiBidWZmZXIsIENGSW5k
ZXggYnVmZmVyTGVuZ3RoLCBDRlN0cmVhbUVycm9yKiBlcnJvciwgQm9vbGVhbiogYXRFT0YsIHZv
aWQqIGNvbnRleHQpCit7CisgICAgRm9ybVN0cmVhbUZpZWxkcyogZm9ybSA9IHN0YXRpY19jYXN0
PEZvcm1TdHJlYW1GaWVsZHMqPihjb250ZXh0KTsKKworICAgIHdoaWxlIChmb3JtLT5jdXJyZW50
U3RyZWFtKSB7CisgICAgICAgIENGSW5kZXggYnl0ZXNUb1JlYWQgPSBidWZmZXJMZW5ndGg7Cisj
aWYgRU5BQkxFKEJMT0IpCisgICAgICAgIGlmIChmb3JtLT5jdXJyZW50U3RyZWFtUmFuZ2VMZW5n
dGggIT0gQmxvYkRhdGFJdGVtOjp0b0VuZE9mRmlsZSAmJiBmb3JtLT5jdXJyZW50U3RyZWFtUmFu
Z2VMZW5ndGggPCBieXRlc1RvUmVhZCkKKyAgICAgICAgICAgIGJ5dGVzVG9SZWFkID0gc3RhdGlj
X2Nhc3Q8Q0ZJbmRleD4oZm9ybS0+Y3VycmVudFN0cmVhbVJhbmdlTGVuZ3RoKTsKKyNlbmRpZgor
ICAgICAgICBDRkluZGV4IGJ5dGVzUmVhZCA9IENGUmVhZFN0cmVhbVJlYWQoZm9ybS0+Y3VycmVu
dFN0cmVhbSwgYnVmZmVyLCBieXRlc1RvUmVhZCk7CisgICAgICAgIGlmIChieXRlc1JlYWQgPCAw
KSB7CisgICAgICAgICAgICAqZXJyb3IgPSBDRlJlYWRTdHJlYW1HZXRFcnJvcihmb3JtLT5jdXJy
ZW50U3RyZWFtKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBp
ZiAoYnl0ZXNSZWFkID4gMCkgeworICAgICAgICAgICAgZXJyb3ItPmVycm9yID0gMDsKKyAgICAg
ICAgICAgICphdEVPRiA9IEZBTFNFOworICAgICAgICAgICAgZm9ybS0+Ynl0ZXNTZW50ICs9IGJ5
dGVzUmVhZDsKKyNpZiBFTkFCTEUoQkxPQikKKyAgICAgICAgICAgIGlmIChmb3JtLT5jdXJyZW50
U3RyZWFtUmFuZ2VMZW5ndGggIT0gQmxvYkRhdGFJdGVtOjp0b0VuZE9mRmlsZSkKKyAgICAgICAg
ICAgICAgICBmb3JtLT5jdXJyZW50U3RyZWFtUmFuZ2VMZW5ndGggLT0gYnl0ZXNSZWFkOworI2Vu
ZGlmCisKKyAgICAgICAgICAgIHJldHVybiBieXRlc1JlYWQ7CisgICAgICAgIH0KKyAgICAgICAg
b3Blbk5leHRTdHJlYW0oZm9ybSk7CisgICAgfQorCisgICAgZXJyb3ItPmVycm9yID0gMDsKKyAg
ICAqYXRFT0YgPSBUUlVFOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgQm9vbGVhbiBmb3Jt
Q2FuUmVhZChDRlJlYWRTdHJlYW1SZWYgc3RyZWFtLCB2b2lkKiBjb250ZXh0KQoreworICAgIEZv
cm1TdHJlYW1GaWVsZHMqIGZvcm0gPSBzdGF0aWNfY2FzdDxGb3JtU3RyZWFtRmllbGRzKj4oY29u
dGV4dCk7CisKKyAgICB3aGlsZSAoZm9ybS0+Y3VycmVudFN0cmVhbSAmJiBDRlJlYWRTdHJlYW1H
ZXRTdGF0dXMoZm9ybS0+Y3VycmVudFN0cmVhbSkgPT0ga0NGU3RyZWFtU3RhdHVzQXRFbmQpCisg
ICAgICAgIG9wZW5OZXh0U3RyZWFtKGZvcm0pOworCisgICAgaWYgKCFmb3JtLT5jdXJyZW50U3Ry
ZWFtKSB7CisgICAgICAgIENGUmVhZFN0cmVhbVNpZ25hbEV2ZW50KHN0cmVhbSwga0NGU3RyZWFt
RXZlbnRFbmRFbmNvdW50ZXJlZCwgMCk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9Cisg
ICAgcmV0dXJuIENGUmVhZFN0cmVhbUhhc0J5dGVzQXZhaWxhYmxlKGZvcm0tPmN1cnJlbnRTdHJl
YW0pOworfQorCitzdGF0aWMgdm9pZCBmb3JtQ2xvc2UoQ0ZSZWFkU3RyZWFtUmVmLCB2b2lkKiBj
b250ZXh0KQoreworICAgIEZvcm1TdHJlYW1GaWVsZHMqIGZvcm0gPSBzdGF0aWNfY2FzdDxGb3Jt
U3RyZWFtRmllbGRzKj4oY29udGV4dCk7CisKKyAgICBjbG9zZUN1cnJlbnRTdHJlYW0oZm9ybSk7
Cit9CisKK3N0YXRpYyB2b2lkIGZvcm1TY2hlZHVsZShDRlJlYWRTdHJlYW1SZWYsIENGUnVuTG9v
cFJlZiBydW5Mb29wLCBDRlN0cmluZ1JlZiBydW5Mb29wTW9kZSwgdm9pZCogY29udGV4dCkKK3sK
KyAgICBGb3JtU3RyZWFtRmllbGRzKiBmb3JtID0gc3RhdGljX2Nhc3Q8Rm9ybVN0cmVhbUZpZWxk
cyo+KGNvbnRleHQpOworCisgICAgaWYgKGZvcm0tPmN1cnJlbnRTdHJlYW0pCisgICAgICAgIENG
UmVhZFN0cmVhbVNjaGVkdWxlV2l0aFJ1bkxvb3AoZm9ybS0+Y3VycmVudFN0cmVhbSwgcnVuTG9v
cCwgcnVuTG9vcE1vZGUpOworICAgIGZvcm0tPnNjaGVkdWxlZFJ1bkxvb3BQYWlycy5hZGQoU2No
ZWR1bGVQYWlyOjpjcmVhdGUocnVuTG9vcCwgcnVuTG9vcE1vZGUpKTsKK30KKworc3RhdGljIHZv
aWQgZm9ybVVuc2NoZWR1bGUoQ0ZSZWFkU3RyZWFtUmVmLCBDRlJ1bkxvb3BSZWYgcnVuTG9vcCwg
Q0ZTdHJpbmdSZWYgcnVuTG9vcE1vZGUsIHZvaWQqIGNvbnRleHQpCit7CisgICAgRm9ybVN0cmVh
bUZpZWxkcyogZm9ybSA9IHN0YXRpY19jYXN0PEZvcm1TdHJlYW1GaWVsZHMqPihjb250ZXh0KTsK
KworICAgIGlmIChmb3JtLT5jdXJyZW50U3RyZWFtKQorICAgICAgICBDRlJlYWRTdHJlYW1VbnNj
aGVkdWxlRnJvbVJ1bkxvb3AoZm9ybS0+Y3VycmVudFN0cmVhbSwgcnVuTG9vcCwgcnVuTG9vcE1v
ZGUpOworICAgIGZvcm0tPnNjaGVkdWxlZFJ1bkxvb3BQYWlycy5yZW1vdmUoU2NoZWR1bGVQYWly
OjpjcmVhdGUocnVuTG9vcCwgcnVuTG9vcE1vZGUpKTsKK30KKworc3RhdGljIHZvaWQgZm9ybUV2
ZW50Q2FsbGJhY2soQ0ZSZWFkU3RyZWFtUmVmIHN0cmVhbSwgQ0ZTdHJlYW1FdmVudFR5cGUgdHlw
ZSwgdm9pZCogY29udGV4dCkKK3sKKyAgICBGb3JtU3RyZWFtRmllbGRzKiBmb3JtID0gc3RhdGlj
X2Nhc3Q8Rm9ybVN0cmVhbUZpZWxkcyo+KGNvbnRleHQpOwogCi0gICAgaWYgKGNvdW50ID09IDAp
CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBrQ0ZTdHJlYW1FdmVudEhhc0J5dGVzQXZh
aWxhYmxlOgorICAgICAgICBDRlJlYWRTdHJlYW1TaWduYWxFdmVudChmb3JtLT5mb3JtU3RyZWFt
LCBrQ0ZTdHJlYW1FdmVudEhhc0J5dGVzQXZhaWxhYmxlLCAwKTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgY2FzZSBrQ0ZTdHJlYW1FdmVudEVycm9yT2NjdXJyZWQ6IHsKKyAgICAgICAgQ0ZTdHJlYW1F
cnJvciByZWFkU3RyZWFtRXJyb3IgPSBDRlJlYWRTdHJlYW1HZXRFcnJvcihzdHJlYW0pOworICAg
ICAgICBDRlJlYWRTdHJlYW1TaWduYWxFdmVudChmb3JtLT5mb3JtU3RyZWFtLCBrQ0ZTdHJlYW1F
dmVudEVycm9yT2NjdXJyZWQsICZyZWFkU3RyZWFtRXJyb3IpOworICAgICAgICBicmVhazsKKyAg
ICB9CisgICAgY2FzZSBrQ0ZTdHJlYW1FdmVudEVuZEVuY291bnRlcmVkOgorICAgICAgICBvcGVu
TmV4dFN0cmVhbShmb3JtKTsKKyAgICAgICAgaWYgKCFmb3JtLT5jdXJyZW50U3RyZWFtKQorICAg
ICAgICAgICAgQ0ZSZWFkU3RyZWFtU2lnbmFsRXZlbnQoZm9ybS0+Zm9ybVN0cmVhbSwga0NGU3Ry
ZWFtRXZlbnRFbmRFbmNvdW50ZXJlZCwgMCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga0NG
U3RyZWFtRXZlbnROb25lOgorICAgICAgICBMT0dfRVJST1IoInVuZXhwZWN0ZWQga0NGU3RyZWFt
RXZlbnROb25lIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga0NGU3RyZWFtRXZlbnRPcGVu
Q29tcGxldGVkOgorICAgICAgICBMT0dfRVJST1IoInVuZXhwZWN0ZWQga0NGU3RyZWFtRXZlbnRP
cGVuQ29tcGxldGVkIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga0NGU3RyZWFtRXZlbnRD
YW5BY2NlcHRCeXRlczoKKyAgICAgICAgTE9HX0VSUk9SKCJ1bmV4cGVjdGVkIGtDRlN0cmVhbUV2
ZW50Q2FuQWNjZXB0Qnl0ZXMiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIHNl
dEhUVFBCb2R5KENGTXV0YWJsZVVSTFJlcXVlc3RSZWYgcmVxdWVzdCwgUGFzc1JlZlB0cjxGb3Jt
RGF0YT4gcHJwRm9ybURhdGEpCit7CisgICAgUmVmUHRyPEZvcm1EYXRhPiBmb3JtRGF0YSA9IHBy
cEZvcm1EYXRhOworCisgICAgaWYgKCFmb3JtRGF0YSkKICAgICAgICAgcmV0dXJuOworICAgICAg
ICAKKyAgICBzaXplX3QgY291bnQgPSBmb3JtRGF0YS0+ZWxlbWVudHMoKS5zaXplKCk7CiAKICAg
ICAvLyBIYW5kbGUgdGhlIGNvbW1vbiBzcGVjaWFsIGNhc2Ugb2Ygb25lIHBpZWNlIG9mIGZvcm0g
ZGF0YSwgd2l0aCBubyBmaWxlcy4KLSAgICBpZiAoY291bnQgPT0gMSkgeworICAgIGlmIChjb3Vu
dCA9PSAxICYmICFmb3JtRGF0YS0+YWx3YXlzU3RyZWFtKCkpIHsKICAgICAgICAgY29uc3QgRm9y
bURhdGFFbGVtZW50JiBlbGVtZW50ID0gZm9ybURhdGEtPmVsZW1lbnRzKClbMF07CiAgICAgICAg
IGlmIChlbGVtZW50Lm1fdHlwZSA9PSBGb3JtRGF0YUVsZW1lbnQ6OmRhdGEpIHsKLSAgICAgICAg
ICAgIENGRGF0YVJlZiBkYXRhID0gQ0ZEYXRhQ3JlYXRlKDAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29u
c3QgVUludDggKj4oZWxlbWVudC5tX2RhdGEuZGF0YSgpKSwgZWxlbWVudC5tX2RhdGEuc2l6ZSgp
KTsKLSAgICAgICAgICAgIENGVVJMUmVxdWVzdFNldEhUVFBSZXF1ZXN0Qm9keShyZXF1ZXN0LCBk
YXRhKTsKLSAgICAgICAgICAgIENGUmVsZWFzZShkYXRhKTsKKyAgICAgICAgICAgIFJldGFpblB0
cjxDRkRhdGFSZWY+IGRhdGEgPSBhZG9wdENGKENGRGF0YUNyZWF0ZSgwLCByZWludGVycHJldF9j
YXN0PGNvbnN0IFVJbnQ4ICo+KGVsZW1lbnQubV9kYXRhLmRhdGEoKSksIGVsZW1lbnQubV9kYXRh
LnNpemUoKSkpOworICAgICAgICAgICAgQ0ZVUkxSZXF1ZXN0U2V0SFRUUFJlcXVlc3RCb2R5KHJl
cXVlc3QsIGRhdGEuZ2V0KCkpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAg
fQogCi0gICAgUmV0YWluUHRyPENGTXV0YWJsZUFycmF5UmVmPiBhcnJheShBZG9wdENGLCBDRkFy
cmF5Q3JlYXRlTXV0YWJsZSgwLCAwLCAma0NGVHlwZUFycmF5Q2FsbEJhY2tzKSk7CisjaWYgRU5B
QkxFKEJMT0IpCisgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYSBibG9iIGluIHRoZSBmb3JtIGRh
dGEuCisgICAgYm9vbCBoYXNCbG9iID0gZmFsc2U7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkg
PCBjb3VudDsgKytpKSB7CisgICAgICAgIGNvbnN0IEZvcm1EYXRhRWxlbWVudCYgZWxlbWVudCA9
IGZvcm1EYXRhLT5lbGVtZW50cygpW2ldOworICAgICAgICBpZiAoZWxlbWVudC5tX3R5cGUgPT0g
Rm9ybURhdGFFbGVtZW50OjplbmNvZGVkQmxvYikgeworICAgICAgICAgICAgaGFzQmxvYiA9IHRy
dWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIElmIHll
cywgd2UgaGF2ZSB0byByZXNvbHZlIGFsbCB0aGUgYmxvYiByZWZlcmVuY2VzIGFuZCByZWdlbmVy
YXRlIHRoZSBmb3JtIGRhdGEgd2l0aCBvbmx5IGRhdGEgYW5kIGZpbGUgdHlwZXMuCisgICAgaWYg
KGhhc0Jsb2IpIHsKKyAgICAgICAgUmVmUHRyPEZvcm1EYXRhPiBuZXdGb3JtRGF0YSA9IEZvcm1E
YXRhOjpjcmVhdGUoKTsKKyAgICAgICAgbmV3Rm9ybURhdGEtPnNldEFsd2F5c1N0cmVhbShmb3Jt
RGF0YS0+YWx3YXlzU3RyZWFtKCkpOworICAgICAgICBuZXdGb3JtRGF0YS0+c2V0SWRlbnRpZmll
cihmb3JtRGF0YS0+aWRlbnRpZmllcigpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkg
PCBjb3VudDsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBGb3JtRGF0YUVsZW1lbnQmIGVsZW1l
bnQgPSBmb3JtRGF0YS0+ZWxlbWVudHMoKVtpXTsKKyAgICAgICAgICAgIGlmIChlbGVtZW50Lm1f
dHlwZSA9PSBGb3JtRGF0YUVsZW1lbnQ6OmRhdGEpCisgICAgICAgICAgICAgICAgbmV3Rm9ybURh
dGEtPmFwcGVuZERhdGEoZWxlbWVudC5tX2RhdGEuZGF0YSgpLCBlbGVtZW50Lm1fZGF0YS5zaXpl
KCkpOworICAgICAgICAgICAgZWxzZSBpZiAoZWxlbWVudC5tX3R5cGUgPT0gRm9ybURhdGFFbGVt
ZW50OjplbmNvZGVkRmlsZSkKKyAgICAgICAgICAgICAgICBuZXdGb3JtRGF0YS0+YXBwZW5kRmls
ZShlbGVtZW50Lm1fZmlsZW5hbWUsIGVsZW1lbnQubV9zaG91bGRHZW5lcmF0ZUZpbGUpOworICAg
ICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgQVNTRVJUKGVsZW1lbnQubV90eXBlID09
IEZvcm1EYXRhRWxlbWVudDo6ZW5jb2RlZEJsb2IpOworICAgICAgICAgICAgICAgIFJlZlB0cjxC
bG9iU3RvcmFnZURhdGE+IGJsb2JEYXRhID0gc3RhdGljX2Nhc3Q8QmxvYlJlZ2lzdHJ5SW1wbCY+
KGJsb2JSZWdpc3RyeSgpKS5nZXRCbG9iRGF0YUZyb21VUkwoS1VSTChQYXJzZWRVUkxTdHJpbmcs
IGVsZW1lbnQubV9ibG9iVVJMKSk7CisgICAgICAgICAgICAgICAgaWYgKGJsb2JEYXRhKSB7Cisg
ICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgYmxvYkRhdGEtPml0ZW1z
KCkuc2l6ZSgpOyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJsb2JEYXRh
SXRlbSYgYmxvYkl0ZW0gPSBibG9iRGF0YS0+aXRlbXMoKVtqXTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGlmIChibG9iSXRlbS50eXBlID09IEJsb2JEYXRhSXRlbTo6RGF0YSkKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBuZXdGb3JtRGF0YS0+YXBwZW5kRGF0YShibG9iSXRlbS5kYXRh
LT5kYXRhKCkgKyBzdGF0aWNfY2FzdDxpbnQ+KGJsb2JJdGVtLm9mZnNldCksIHN0YXRpY19jYXN0
PGludD4oYmxvYkl0ZW0ubGVuZ3RoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1NFUlQoYmxvYkl0ZW0udHlwZSA9PSBCbG9i
RGF0YUl0ZW06OkZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Zvcm1EYXRh
LT5hcHBlbmRGaWxlUmFuZ2UoYmxvYkl0ZW0ucGF0aCwgYmxvYkl0ZW0ub2Zmc2V0LCBibG9iSXRl
bS5sZW5ndGgsIGJsb2JJdGVtLmV4cGVjdGVkTW9kaWZpY2F0aW9uVGltZSk7CisgICAgICAgICAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9ybURhdGEgPSBuZXdGb3JtRGF0
YS5yZWxlYXNlKCk7CisgICAgICAgIGNvdW50ID0gZm9ybURhdGEtPmVsZW1lbnRzKCkuc2l6ZSgp
OworICAgIH0KKyNlbmRpZgogCisgICAgLy8gUHJlY29tcHV0ZSB0aGUgY29udGVudCBsZW5ndGgg
c28gTlNVUkxDb25uZWN0aW9uIGRvZXNuJ3QgdXNlIGNodW5rZWQgbW9kZS4KKyAgICBsb25nIGxv
bmcgbGVuZ3RoID0gMDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsK
ICAgICAgICAgY29uc3QgRm9ybURhdGFFbGVtZW50JiBlbGVtZW50ID0gZm9ybURhdGEtPmVsZW1l
bnRzKClbaV07Ci0gICAgICAgIGlmIChlbGVtZW50Lm1fdHlwZSA9PSBGb3JtRGF0YUVsZW1lbnQ6
OmRhdGEpIHsKLSAgICAgICAgICAgIFJldGFpblB0cjxDRkRhdGFSZWY+IGRhdGEoQWRvcHRDRiwg
Q0ZEYXRhQ3JlYXRlKDAsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVUludDgqPihlbGVtZW50Lm1f
ZGF0YS5kYXRhKCkpLCBlbGVtZW50Lm1fZGF0YS5zaXplKCkpKTsKLSAgICAgICAgICAgIENGQXJy
YXlBcHBlbmRWYWx1ZShhcnJheS5nZXQoKSwgZGF0YS5nZXQoKSk7Ci0gICAgICAgIH0gZWxzZSB7
Ci0gICAgICAgICAgICBSZXRhaW5QdHI8Q0ZTdHJpbmdSZWY+IGZpbGVuYW1lKEFkb3B0Q0YsIGVs
ZW1lbnQubV9maWxlbmFtZS5jcmVhdGVDRlN0cmluZygpKTsKLSAgICAgICAgICAgIENGQXJyYXlB
cHBlbmRWYWx1ZShhcnJheS5nZXQoKSwgZmlsZW5hbWUuZ2V0KCkpOworICAgICAgICBpZiAoZWxl
bWVudC5tX3R5cGUgPT0gRm9ybURhdGFFbGVtZW50OjpkYXRhKQorICAgICAgICAgICAgbGVuZ3Ro
ICs9IGVsZW1lbnQubV9kYXRhLnNpemUoKTsKKyAgICAgICAgZWxzZSB7CisjaWYgRU5BQkxFKEJM
T0IpCisgICAgICAgICAgICAvLyBJZiB3ZSdyZSBzZW5kaW5nIHRoZSBmaWxlIHJhbmdlLCB1c2Ug
dGhlIGV4aXN0aW5nIHJhbmdlIGxlbmd0aCBmb3Igbm93LiBXZSB3aWxsIGRldGVjdCBpZiB0aGUg
ZmlsZSBoYXMgYmVlbiBjaGFuZ2VkIHJpZ2h0IGJlZm9yZSB3ZSByZWFkIHRoZSBmaWxlIGFuZCBh
Ym9ydCB0aGUgb3BlcmF0aW9uIGlmIG5lY2Vzc2FyeS4KKyAgICAgICAgICAgIGlmIChlbGVtZW50
Lm1fZmlsZUxlbmd0aCAhPSBCbG9iRGF0YUl0ZW06OnRvRW5kT2ZGaWxlKSB7CisgICAgICAgICAg
ICAgICAgbGVuZ3RoICs9IGVsZW1lbnQubV9maWxlTGVuZ3RoOworICAgICAgICAgICAgICAgIGNv
bnRpbnVlOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBsb25nIGxvbmcgZmls
ZVNpemU7CisgICAgICAgICAgICBpZiAoZ2V0RmlsZVNpemUoZWxlbWVudC5tX3Nob3VsZEdlbmVy
YXRlRmlsZSA/IGVsZW1lbnQubV9nZW5lcmF0ZWRGaWxlbmFtZSA6IGVsZW1lbnQubV9maWxlbmFt
ZSwgZmlsZVNpemUpKQorICAgICAgICAgICAgICAgIGxlbmd0aCArPSBmaWxlU2l6ZTsKICAgICAg
ICAgfQogICAgIH0KIAotICAgIHdrQ0ZVUkxSZXF1ZXN0U2V0SFRUUFJlcXVlc3RCb2R5UGFydHMo
cmVxdWVzdCwgYXJyYXkuZ2V0KCkpOworICAgIC8vIFNldCB0aGUgbGVuZ3RoLgorICAgIFJldGFp
blB0cjxDRlN0cmluZ1JlZj4gbGVuZ3RoU3RyaW5nID0gYWRvcHRDRihDRlN0cmluZ0NyZWF0ZVdp
dGhGb3JtYXQoMCwgMCwgQ0ZTVFIoIiVsbGQiKSwgbGVuZ3RoKSk7CisgICAgQ0ZVUkxSZXF1ZXN0
U2V0SFRUUEhlYWRlckZpZWxkVmFsdWUocmVxdWVzdCwgQ0ZTVFIoIkNvbnRlbnQtTGVuZ3RoIiks
IGxlbmd0aFN0cmluZy5nZXQoKSk7CisKKyAgICAvLyBDcmVhdGUgYW5kIHNldCB0aGUgc3RyZWFt
LgorCisgICAgLy8gUGFzcyB0aGUgbGVuZ3RoIGFsb25nIHdpdGggdGhlIGZvcm1EYXRhIHNvIGl0
IGRvZXMgbm90IGhhdmUgdG8gYmUgcmVjb21wdXRlZC4KKyAgICBGb3JtQ29udGV4dCBmb3JtQ29u
dGV4dCA9IHsgZm9ybURhdGEucmVsZWFzZSgpLCBsZW5ndGggfTsKKworICAgIENGUmVhZFN0cmVh
bUNhbGxCYWNrc1YxIGNhbGxCYWNrcyA9IHsgMSwgZm9ybUNyZWF0ZSwgZm9ybUZpbmFsaXplLCAw
LCBmb3JtT3BlbiwgMCwgZm9ybVJlYWQsIDAsIGZvcm1DYW5SZWFkLCBmb3JtQ2xvc2UsIDAsIDAs
IDAsIGZvcm1TY2hlZHVsZSwgZm9ybVVuc2NoZWR1bGUKKyAgICB9OworICAgIFJldGFpblB0cjxD
RlJlYWRTdHJlYW1SZWY+IHN0cmVhbSA9IGFkb3B0Q0YoQ0ZSZWFkU3RyZWFtQ3JlYXRlKDAsIHN0
YXRpY19jYXN0PGNvbnN0IHZvaWQqPigmY2FsbEJhY2tzKSwgJmZvcm1Db250ZXh0KSk7CisKKyAg
ICBDRlVSTFJlcXVlc3RTZXRIVFRQUmVxdWVzdEJvZHlTdHJlYW0ocmVxdWVzdCwgc3RyZWFtLmdl
dCgpKTsKIH0KIAotUGFzc1JlZlB0cjxGb3JtRGF0YT4gaHR0cEJvZHlGcm9tUmVxdWVzdChDRlVS
TFJlcXVlc3RSZWYgcmVxdWVzdCkKK0Zvcm1EYXRhKiBodHRwQm9keUZyb21TdHJlYW0oQ0ZSZWFk
U3RyZWFtUmVmIHN0cmVhbSkKIHsKLSAgICBSZXRhaW5QdHI8Q0ZEYXRhUmVmPiBib2R5RGF0YShB
ZG9wdENGLCBDRlVSTFJlcXVlc3RDb3B5SFRUUFJlcXVlc3RCb2R5KHJlcXVlc3QpKTsKLSAgICBp
ZiAoYm9keURhdGEpCi0gICAgICAgIHJldHVybiBGb3JtRGF0YTo6Y3JlYXRlKENGRGF0YUdldEJ5
dGVQdHIoYm9keURhdGEuZ2V0KCkpLCBDRkRhdGFHZXRMZW5ndGgoYm9keURhdGEuZ2V0KCkpKTsK
LQotICAgIFJldGFpblB0cjxDRkFycmF5UmVmPiBib2R5UGFydHMoQWRvcHRDRiwgd2tDRlVSTFJl
cXVlc3RDb3B5SFRUUFJlcXVlc3RCb2R5UGFydHMocmVxdWVzdCkpOwotICAgIGlmIChib2R5UGFy
dHMpIHsKLSAgICAgICAgUmVmUHRyPEZvcm1EYXRhPiBmb3JtRGF0YSA9IEZvcm1EYXRhOjpjcmVh
dGUoKTsKLQotICAgICAgICBDRkluZGV4IGNvdW50ID0gQ0ZBcnJheUdldENvdW50KGJvZHlQYXJ0
cy5nZXQoKSk7Ci0gICAgICAgIGZvciAoQ0ZJbmRleCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsK
LSAgICAgICAgICAgIENGVHlwZVJlZiBib2R5UGFydCA9IENGQXJyYXlHZXRWYWx1ZUF0SW5kZXgo
Ym9keVBhcnRzLmdldCgpLCBpKTsKLSAgICAgICAgICAgIENGVHlwZUlEIHR5cGVJRCA9IENGR2V0
VHlwZUlEKGJvZHlQYXJ0KTsKLSAgICAgICAgICAgIGlmICh0eXBlSUQgPT0gQ0ZTdHJpbmdHZXRU
eXBlSUQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IChDRlN0cmluZ1Jl
Zilib2R5UGFydDsKLSAgICAgICAgICAgICAgICBmb3JtRGF0YS0+YXBwZW5kRmlsZShmaWxlbmFt
ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVJRCA9PSBDRkRhdGFHZXRUeXBlSUQoKSkg
ewotICAgICAgICAgICAgICAgIENGRGF0YVJlZiBkYXRhID0gKENGRGF0YVJlZilib2R5UGFydDsK
LSAgICAgICAgICAgICAgICBmb3JtRGF0YS0+YXBwZW5kRGF0YShDRkRhdGFHZXRCeXRlUHRyKGRh
dGEpLCBDRkRhdGFHZXRMZW5ndGgoZGF0YSkpOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAg
ICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJu
IGZvcm1EYXRhLnJlbGVhc2UoKTsKLSAgICB9CisgICAgaWYgKCFzdHJlYW0pCisgICAgICAgIHJl
dHVybiAwOwogCi0gICAgLy8gRklYTUU6IHdoYXQgdG8gZG8gYWJvdXQgYXJiaXRyYXJ5IGJvZHkg
c3RyZWFtcz8KLSAgICByZXR1cm4gMDsKKyAgICBNdXRleExvY2tlciBsb2NrZXIoc3RyZWFtRmll
bGRzTWFwTXV0ZXgoKSk7CisgICAgRm9ybVN0cmVhbUZpZWxkcyogZm9ybVN0cmVhbSA9IHN0cmVh
bUZpZWxkc01hcCgpLmdldChzdHJlYW0pOworICAgIGlmICghZm9ybVN0cmVhbSkKKyAgICAgICAg
cmV0dXJuIDA7CisgICAgcmV0dXJuIGZvcm1TdHJlYW0tPmZvcm1EYXRhLmdldCgpOwogfQogCi19
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCitQYXNzUmVmUHRyPEZvcm1EYXRhPiBodHRwQm9keUZyb21S
ZXF1ZXN0KENGVVJMUmVxdWVzdFJlZiByZXF1ZXN0KQoreworICAgIFJldGFpblB0cjxDRlJlYWRT
dHJlYW1SZWY+IGJvZHlTdHJlYW0gPSBhZG9wdENGKENGVVJMUmVxdWVzdENvcHlIVFRQUmVxdWVz
dEJvZHlTdHJlYW0ocmVxdWVzdCkpOworICAgIHJldHVybiBodHRwQm9keUZyb21TdHJlYW0oYm9k
eVN0cmVhbS5nZXQoKSk7Cit9CiAKLSNlbmRpZiAvLyBVU0UoQ0ZORVRXT1JLKQorfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jZi9G
b3JtRGF0YVN0cmVhbUNGTmV0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vbmV0d29yay9jZi9Gb3JtRGF0YVN0cmVhbUNGTmV0LmgJKHJldmlzaW9uIDExMjE2NikKKysr
IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY2YvRm9ybURhdGFTdHJlYW1DRk5ldC5o
CSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAw
NSwgMjAwNiwgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJp
Z2h0IChDKSAyMDA1LCAyMDA2LCAyMDA3LCAyMDEyIEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTI5LDIwICsyOSwyMCBA
QAogI2lmbmRlZiBGb3JtRGF0YVN0cmVhbUNGTmV0X2gKICNkZWZpbmUgRm9ybURhdGFTdHJlYW1D
Rk5ldF9oCiAKLSNpZiBVU0UoQ0ZORVRXT1JLKQotCi0jaW5jbHVkZSA8Q29yZUZvdW5kYXRpb24v
Q29yZUZvdW5kYXRpb24uaD4KICNpbmNsdWRlIDx3dGYvRm9yd2FyZC5oPgogCiB0eXBlZGVmIHN0
cnVjdCBfQ0ZVUkxSZXF1ZXN0KiBDRk11dGFibGVVUkxSZXF1ZXN0UmVmOwogdHlwZWRlZiBjb25z
dCBzdHJ1Y3QgX0NGVVJMUmVxdWVzdCogQ0ZVUkxSZXF1ZXN0UmVmOwogCiBuYW1lc3BhY2UgV2Vi
Q29yZSB7Ci0gICAgY2xhc3MgRm9ybURhdGE7Ci0gICAgdm9pZCBzZXRIVFRQQm9keShDRk11dGFi
bGVVUkxSZXF1ZXN0UmVmLCBQYXNzUmVmUHRyPEZvcm1EYXRhPik7Ci0gICAgUGFzc1JlZlB0cjxG
b3JtRGF0YT4gaHR0cEJvZHlGcm9tUmVxdWVzdChDRlVSTFJlcXVlc3RSZWYpOwotfQogCi0jZW5k
aWYgLy8gVVNFKENGTkVUV09SSykKK2NsYXNzIEZvcm1EYXRhOworCit2b2lkIHNldEhUVFBCb2R5
KENGTXV0YWJsZVVSTFJlcXVlc3RSZWYsIFBhc3NSZWZQdHI8Rm9ybURhdGE+KTsKK1Bhc3NSZWZQ
dHI8Rm9ybURhdGE+IGh0dHBCb2R5RnJvbVJlcXVlc3QoQ0ZVUkxSZXF1ZXN0UmVmKTsKKworRm9y
bURhdGEqIGh0dHBCb2R5RnJvbVN0cmVhbShDRlJlYWRTdHJlYW1SZWYpOworCit9IC8vIG5hbWVz
cGFjZSBXZWJDb3JlCiAKICNlbmRpZiAvLyBGb3JtRGF0YVN0cmVhbUNGTmV0X2gKSW5kZXg6IFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvbWFjL0Zvcm1EYXRhU3RyZWFtTWFjLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9tYWMvRm9ybURhdGFT
dHJlYW1NYWMuaAkocmV2aXNpb24gMTEyMTY2KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
bmV0d29yay9tYWMvRm9ybURhdGFTdHJlYW1NYWMuaAkod29ya2luZyBjb3B5KQpAQCAtMzEsOCAr
MzEsOSBAQAogCiAjaWYgIVVTRShDRk5FVFdPUkspCiAKLSNpbmNsdWRlICJGb3JtRGF0YS5oIgor
I2luY2x1ZGUgPHd0Zi9Gb3J3YXJkLmg+CiAKK0BjbGFzcyBOU0lucHV0U3RyZWFtOwogQGNsYXNz
IE5TTXV0YWJsZVVSTFJlcXVlc3Q7CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKSW5kZXg6IFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvbWFjL0Zvcm1EYXRhU3RyZWFtTWFjLm1tCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvbWFjL0Zvcm1EYXRhU3Ry
ZWFtTWFjLm1tCShyZXZpc2lvbiAxMTIzMDIpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9u
ZXR3b3JrL21hYy9Gb3JtRGF0YVN0cmVhbU1hYy5tbQkod29ya2luZyBjb3B5KQpAQCAtMzEsNDE1
ICszMSwyNCBAQAogCiAjaWYgIVVTRShDRk5FVFdPUkspCiAKLSNpbXBvcnQgIkJsb2JSZWdpc3Ry
eUltcGwuaCIKLSNpbXBvcnQgIkZpbGVTeXN0ZW0uaCIKICNpbXBvcnQgIkZvcm1EYXRhLmgiCi0j
aW1wb3J0ICJTY2hlZHVsZVBhaXIuaCIKLSNpbXBvcnQgIldlYkNvcmVTeXN0ZW1JbnRlcmZhY2Uu
aCIKLSNpbXBvcnQgPHN5cy9zdGF0Lmg+Ci0jaW1wb3J0IDxzeXMvdHlwZXMuaD4KLSNpbXBvcnQg
PHd0Zi9Bc3NlcnRpb25zLmg+Ci0jaW1wb3J0IDx3dGYvTWFpblRocmVhZC5oPgotI2ltcG9ydCA8
d3RmL1N0ZExpYkV4dHJhcy5oPgotI2ltcG9ydCA8d3RmL1RocmVhZGluZy5oPgorI2ltcG9ydCAi
Rm9ybURhdGFTdHJlYW1DRk5ldC5oIgorI2ltcG9ydCA8d3RmL1Bhc3NSZWZQdHIuaD4KIAotI2lm
IFBMQVRGT1JNKElPUykKLSNpbXBvcnQgPE1hY0Vycm9ycy5oPgotI2Vsc2UKLSNpbXBvcnQgPENv
cmVTZXJ2aWNlcy9Db3JlU2VydmljZXMuaD4KLSNlbmRpZgorQGludGVyZmFjZSBOU1VSTFJlcXVl
c3QgKFdlYk5TVVJMUmVxdWVzdERldGFpbHMpCistIChDRlVSTFJlcXVlc3RSZWYpX0NGVVJMUmVx
dWVzdDsKK0BlbmQKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1zdGF0aWMgTXV0ZXgmIHN0cmVh
bUZpZWxkc01hcE11dGV4KCkKLXsKLSAgICBERUZJTkVfU1RBVElDX0xPQ0FMKE11dGV4LCBzdGF0
aWNNdXRleCwgKCkpOwotICAgIHJldHVybiBzdGF0aWNNdXRleDsKLX0KLQotc3RhdGljIHZvaWQg
Zm9ybUV2ZW50Q2FsbGJhY2soQ0ZSZWFkU3RyZWFtUmVmIHN0cmVhbSwgQ0ZTdHJlYW1FdmVudFR5
cGUgdHlwZSwgdm9pZCogY29udGV4dCk7Ci0KLXN0cnVjdCBGb3JtQ29udGV4dCB7Ci0gICAgUmVm
UHRyPEZvcm1EYXRhPiBmb3JtRGF0YTsKLSAgICB1bnNpZ25lZCBsb25nIGxvbmcgc3RyZWFtTGVu
Z3RoOwotfTsKLQotc3RydWN0IEZvcm1TdHJlYW1GaWVsZHMgewotICAgIFJlZlB0cjxGb3JtRGF0
YT4gZm9ybURhdGE7Ci0gICAgU2NoZWR1bGVQYWlySGFzaFNldCBzY2hlZHVsZWRSdW5Mb29wUGFp
cnM7Ci0gICAgVmVjdG9yPEZvcm1EYXRhRWxlbWVudD4gcmVtYWluaW5nRWxlbWVudHM7IC8vIGlu
IHJldmVyc2Ugb3JkZXIKLSAgICBDRlJlYWRTdHJlYW1SZWYgY3VycmVudFN0cmVhbTsKLSNpZiBF
TkFCTEUoQkxPQikKLSAgICBsb25nIGxvbmcgY3VycmVudFN0cmVhbVJhbmdlTGVuZ3RoOwotI2Vu
ZGlmCi0gICAgY2hhciogY3VycmVudERhdGE7Ci0gICAgQ0ZSZWFkU3RyZWFtUmVmIGZvcm1TdHJl
YW07Ci0gICAgdW5zaWduZWQgbG9uZyBsb25nIHN0cmVhbUxlbmd0aDsKLSAgICB1bnNpZ25lZCBs
b25nIGxvbmcgYnl0ZXNTZW50OwotfTsKLQotdHlwZWRlZiBIYXNoTWFwPENGUmVhZFN0cmVhbVJl
ZiwgRm9ybVN0cmVhbUZpZWxkcyo+IFN0cmVhbUZpZWxkc01hcDsKLXN0YXRpYyBTdHJlYW1GaWVs
ZHNNYXAmIHN0cmVhbUZpZWxkc01hcCgpCi17Ci0gICAgREVGSU5FX1NUQVRJQ19MT0NBTChTdHJl
YW1GaWVsZHNNYXAsIHN0cmVhbUZpZWxkc01hcCwgKCkpOwotICAgIHJldHVybiBzdHJlYW1GaWVs
ZHNNYXA7Ci19Ci0KLXN0YXRpYyB2b2lkIGNsb3NlQ3VycmVudFN0cmVhbShGb3JtU3RyZWFtRmll
bGRzICpmb3JtKQotewotICAgIGlmIChmb3JtLT5jdXJyZW50U3RyZWFtKSB7Ci0gICAgICAgIENG
UmVhZFN0cmVhbUNsb3NlKGZvcm0tPmN1cnJlbnRTdHJlYW0pOwotICAgICAgICBDRlJlYWRTdHJl
YW1TZXRDbGllbnQoZm9ybS0+Y3VycmVudFN0cmVhbSwga0NGU3RyZWFtRXZlbnROb25lLCBOVUxM
LCBOVUxMKTsKLSAgICAgICAgQ0ZSZWxlYXNlKGZvcm0tPmN1cnJlbnRTdHJlYW0pOwotICAgICAg
ICBmb3JtLT5jdXJyZW50U3RyZWFtID0gTlVMTDsKLSNpZiBFTkFCTEUoQkxPQikKLSAgICAgICAg
Zm9ybS0+Y3VycmVudFN0cmVhbVJhbmdlTGVuZ3RoID0gQmxvYkRhdGFJdGVtOjp0b0VuZE9mRmls
ZTsKLSNlbmRpZgotICAgIH0KLSAgICBpZiAoZm9ybS0+Y3VycmVudERhdGEpIHsKLSAgICAgICAg
ZmFzdEZyZWUoZm9ybS0+Y3VycmVudERhdGEpOwotICAgICAgICBmb3JtLT5jdXJyZW50RGF0YSA9
IDA7Ci0gICAgfQotfQotCi0vLyBSZXR1cm4gZmFsc2UgaWYgd2UgY2Fubm90IGFkdmFuY2UgdGhl
IHN0cmVhbS4gQ3VycmVudGx5IHRoZSBvbmx5IHBvc3NpYmxlIGZhaWx1cmUgaXMgdGhhdCB0aGUg
dW5kZXJseWluZyBmaWxlIGhhcyBiZWVuIHJlbW92ZWQgb3IgY2hhbmdlZCBzaW5jZSBGaWxlLnNs
aWNlLgotc3RhdGljIGJvb2wgYWR2YW5jZUN1cnJlbnRTdHJlYW0oRm9ybVN0cmVhbUZpZWxkcyog
Zm9ybSkKLXsKLSAgICBjbG9zZUN1cnJlbnRTdHJlYW0oZm9ybSk7Ci0KLSAgICBpZiAoZm9ybS0+
cmVtYWluaW5nRWxlbWVudHMuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAg
IC8vIENyZWF0ZSB0aGUgbmV3IHN0cmVhbS4KLSAgICBGb3JtRGF0YUVsZW1lbnQmIG5leHRJbnB1
dCA9IGZvcm0tPnJlbWFpbmluZ0VsZW1lbnRzLmxhc3QoKTsKLQotICAgIGlmIChuZXh0SW5wdXQu
bV90eXBlID09IEZvcm1EYXRhRWxlbWVudDo6ZGF0YSkgewotICAgICAgICBzaXplX3Qgc2l6ZSA9
IG5leHRJbnB1dC5tX2RhdGEuc2l6ZSgpOwotICAgICAgICBjaGFyKiBkYXRhID0gbmV4dElucHV0
Lm1fZGF0YS5yZWxlYXNlQnVmZmVyKCk7Ci0gICAgICAgIGZvcm0tPmN1cnJlbnRTdHJlYW0gPSBD
RlJlYWRTdHJlYW1DcmVhdGVXaXRoQnl0ZXNOb0NvcHkoMCwgcmVpbnRlcnByZXRfY2FzdDxjb25z
dCBVSW50OCo+KGRhdGEpLCBzaXplLCBrQ0ZBbGxvY2F0b3JOdWxsKTsKLSAgICAgICAgZm9ybS0+
Y3VycmVudERhdGEgPSBkYXRhOwotICAgIH0gZWxzZSB7Ci0jaWYgRU5BQkxFKEJMT0IpCi0gICAg
ICAgIC8vIENoZWNrIGlmIHRoZSBmaWxlIGhhcyBiZWVuIGNoYW5nZWQgb3Igbm90IGlmIHJlcXVp
cmVkLgotICAgICAgICBpZiAobmV4dElucHV0Lm1fZXhwZWN0ZWRGaWxlTW9kaWZpY2F0aW9uVGlt
ZSAhPSBCbG9iRGF0YUl0ZW06OmRvTm90Q2hlY2tGaWxlQ2hhbmdlKSB7Ci0gICAgICAgICAgICB0
aW1lX3QgZmlsZU1vZGlmaWNhdGlvblRpbWU7Ci0gICAgICAgICAgICBpZiAoIWdldEZpbGVNb2Rp
ZmljYXRpb25UaW1lKG5leHRJbnB1dC5tX2ZpbGVuYW1lLCBmaWxlTW9kaWZpY2F0aW9uVGltZSkg
fHwgZmlsZU1vZGlmaWNhdGlvblRpbWUgIT0gc3RhdGljX2Nhc3Q8dGltZV90PihuZXh0SW5wdXQu
bV9leHBlY3RlZEZpbGVNb2RpZmljYXRpb25UaW1lKSkKLSAgICAgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgICAgICBjb25zdCBTdHJpbmcmIHBhdGggPSBu
ZXh0SW5wdXQubV9zaG91bGRHZW5lcmF0ZUZpbGUgPyBuZXh0SW5wdXQubV9nZW5lcmF0ZWRGaWxl
bmFtZSA6IG5leHRJbnB1dC5tX2ZpbGVuYW1lOwotICAgICAgICBmb3JtLT5jdXJyZW50U3RyZWFt
ID0gQ0ZSZWFkU3RyZWFtQ3JlYXRlV2l0aEZpbGUoMCwgcGF0aEFzVVJMKHBhdGgpLmdldCgpKTsK
LSAgICAgICAgaWYgKCFmb3JtLT5jdXJyZW50U3RyZWFtKSB7Ci0gICAgICAgICAgICAvLyBUaGUg
ZmlsZSBtdXN0IGhhdmUgYmVlbiByZW1vdmVkIG9yIGJlY29tZSB1bnJlYWRhYmxlLgotICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0jaWYgRU5BQkxFKEJMT0IpCi0gICAgICAg
IGlmIChuZXh0SW5wdXQubV9maWxlU3RhcnQgPiAwKSB7Ci0gICAgICAgICAgICBSZXRhaW5QdHI8
Q0ZOdW1iZXJSZWY+IHBvc2l0aW9uKEFkb3B0Q0YsIENGTnVtYmVyQ3JlYXRlKDAsIGtDRk51bWJl
ckxvbmdMb25nVHlwZSwgJm5leHRJbnB1dC5tX2ZpbGVTdGFydCkpOwotICAgICAgICAgICAgQ0ZS
ZWFkU3RyZWFtU2V0UHJvcGVydHkoZm9ybS0+Y3VycmVudFN0cmVhbSwga0NGU3RyZWFtUHJvcGVy
dHlGaWxlQ3VycmVudE9mZnNldCwgcG9zaXRpb24uZ2V0KCkpOwotICAgICAgICB9Ci0gICAgICAg
IGZvcm0tPmN1cnJlbnRTdHJlYW1SYW5nZUxlbmd0aCA9IG5leHRJbnB1dC5tX2ZpbGVMZW5ndGg7
Ci0jZW5kaWYKLSAgICB9Ci0gICAgZm9ybS0+cmVtYWluaW5nRWxlbWVudHMucmVtb3ZlTGFzdCgp
OwotCi0gICAgLy8gU2V0IHVwIHRoZSBjYWxsYmFjay4KLSAgICBDRlN0cmVhbUNsaWVudENvbnRl
eHQgY29udGV4dCA9IHsgMCwgZm9ybSwgTlVMTCwgTlVMTCwgTlVMTCB9OwotICAgIENGUmVhZFN0
cmVhbVNldENsaWVudChmb3JtLT5jdXJyZW50U3RyZWFtLCBrQ0ZTdHJlYW1FdmVudEhhc0J5dGVz
QXZhaWxhYmxlIHwga0NGU3RyZWFtRXZlbnRFcnJvck9jY3VycmVkIHwga0NGU3RyZWFtRXZlbnRF
bmRFbmNvdW50ZXJlZCwKLSAgICAgICAgZm9ybUV2ZW50Q2FsbGJhY2ssICZjb250ZXh0KTsKLQot
ICAgIC8vIFNjaGVkdWxlIHdpdGggdGhlIGN1cnJlbnQgc2V0IG9mIHJ1biBsb29wcy4KLSAgICBT
Y2hlZHVsZVBhaXJIYXNoU2V0OjppdGVyYXRvciBlbmQgPSBmb3JtLT5zY2hlZHVsZWRSdW5Mb29w
UGFpcnMuZW5kKCk7Ci0gICAgZm9yIChTY2hlZHVsZVBhaXJIYXNoU2V0OjppdGVyYXRvciBpdCA9
IGZvcm0tPnNjaGVkdWxlZFJ1bkxvb3BQYWlycy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpCi0g
ICAgICAgIENGUmVhZFN0cmVhbVNjaGVkdWxlV2l0aFJ1bkxvb3AoZm9ybS0+Y3VycmVudFN0cmVh
bSwgKCppdCktPnJ1bkxvb3AoKSwgKCppdCktPm1vZGUoKSk7Ci0KLSAgICByZXR1cm4gdHJ1ZTsK
LX0KLQotc3RhdGljIGJvb2wgb3Blbk5leHRTdHJlYW0oRm9ybVN0cmVhbUZpZWxkcyogZm9ybSkK
LXsKLSAgICAvLyBTa2lwIG92ZXIgYW55IHN0cmVhbXMgd2UgY2FuJ3Qgb3Blbi4KLSAgICBpZiAo
IWFkdmFuY2VDdXJyZW50U3RyZWFtKGZvcm0pKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
d2hpbGUgKGZvcm0tPmN1cnJlbnRTdHJlYW0gJiYgIUNGUmVhZFN0cmVhbU9wZW4oZm9ybS0+Y3Vy
cmVudFN0cmVhbSkpIHsKLSAgICAgICAgaWYgKCFhZHZhbmNlQ3VycmVudFN0cmVhbShmb3JtKSkK
LSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0K
LXN0YXRpYyB2b2lkKiBmb3JtQ3JlYXRlKENGUmVhZFN0cmVhbVJlZiBzdHJlYW0sIHZvaWQqIGNv
bnRleHQpCi17Ci0gICAgRm9ybUNvbnRleHQqIGZvcm1Db250ZXh0ID0gc3RhdGljX2Nhc3Q8Rm9y
bUNvbnRleHQqPihjb250ZXh0KTsKLQotICAgIEZvcm1TdHJlYW1GaWVsZHMqIG5ld0luZm8gPSBu
ZXcgRm9ybVN0cmVhbUZpZWxkczsKLSAgICBuZXdJbmZvLT5mb3JtRGF0YSA9IGZvcm1Db250ZXh0
LT5mb3JtRGF0YS5yZWxlYXNlKCk7Ci0gICAgbmV3SW5mby0+Y3VycmVudFN0cmVhbSA9IE5VTEw7
Ci0jaWYgRU5BQkxFKEJMT0IpCi0gICAgbmV3SW5mby0+Y3VycmVudFN0cmVhbVJhbmdlTGVuZ3Ro
ID0gQmxvYkRhdGFJdGVtOjp0b0VuZE9mRmlsZTsKLSNlbmRpZgotICAgIG5ld0luZm8tPmN1cnJl
bnREYXRhID0gMDsKLSAgICBuZXdJbmZvLT5mb3JtU3RyZWFtID0gc3RyZWFtOyAvLyBEb24ndCBy
ZXRhaW4uIFRoYXQgd291bGQgY3JlYXRlIGEgcmVmZXJlbmNlIGN5Y2xlLgotICAgIG5ld0luZm8t
PnN0cmVhbUxlbmd0aCA9IGZvcm1Db250ZXh0LT5zdHJlYW1MZW5ndGg7Ci0gICAgbmV3SW5mby0+
Ynl0ZXNTZW50ID0gMDsKLQotICAgIC8vIEFwcGVuZCBpbiByZXZlcnNlIG9yZGVyIHNpbmNlIHdl
IHJlbW92ZSBlbGVtZW50cyBmcm9tIHRoZSBlbmQuCi0gICAgc2l6ZV90IHNpemUgPSBuZXdJbmZv
LT5mb3JtRGF0YS0+ZWxlbWVudHMoKS5zaXplKCk7Ci0gICAgbmV3SW5mby0+cmVtYWluaW5nRWxl
bWVudHMucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShzaXplKTsKLSAgICBmb3IgKHNpemVfdCBpID0g
MDsgaSA8IHNpemU7ICsraSkKLSAgICAgICAgbmV3SW5mby0+cmVtYWluaW5nRWxlbWVudHMuYXBw
ZW5kKG5ld0luZm8tPmZvcm1EYXRhLT5lbGVtZW50cygpW3NpemUgLSBpIC0gMV0pOwotCi0gICAg
TXV0ZXhMb2NrZXIgbG9ja2VyKHN0cmVhbUZpZWxkc01hcE11dGV4KCkpOwotICAgIEFTU0VSVCgh
c3RyZWFtRmllbGRzTWFwKCkuY29udGFpbnMoc3RyZWFtKSk7Ci0gICAgc3RyZWFtRmllbGRzTWFw
KCkuYWRkKHN0cmVhbSwgbmV3SW5mbyk7Ci0KLSAgICByZXR1cm4gbmV3SW5mbzsKLX0KLQotc3Rh
dGljIHZvaWQgZm9ybUZpbmlzaEZpbmFsaXphdGlvbk9uTWFpblRocmVhZCh2b2lkKiBjb250ZXh0
KQotewotICAgIE93blB0cjxGb3JtU3RyZWFtRmllbGRzPiBmb3JtID0gYWRvcHRQdHIoc3RhdGlj
X2Nhc3Q8Rm9ybVN0cmVhbUZpZWxkcyo+KGNvbnRleHQpKTsKLQotICAgIGNsb3NlQ3VycmVudFN0
cmVhbShmb3JtLmdldCgpKTsKLX0KLQotc3RhdGljIHZvaWQgZm9ybUZpbmFsaXplKENGUmVhZFN0
cmVhbVJlZiBzdHJlYW0sIHZvaWQqIGNvbnRleHQpCi17Ci0gICAgRm9ybVN0cmVhbUZpZWxkcyog
Zm9ybSA9IHN0YXRpY19jYXN0PEZvcm1TdHJlYW1GaWVsZHMqPihjb250ZXh0KTsKLQotICAgIE11
dGV4TG9ja2VyIGxvY2tlcihzdHJlYW1GaWVsZHNNYXBNdXRleCgpKTsKLQotICAgIEFTU0VSVChm
b3JtLT5mb3JtU3RyZWFtID09IHN0cmVhbSk7Ci0gICAgQVNTRVJUKHN0cmVhbUZpZWxkc01hcCgp
LmdldChzdHJlYW0pID09IGNvbnRleHQpOwotCi0gICAgLy8gRG8gdGhpcyByaWdodCBhd2F5IGJl
Y2F1c2UgdGhlIENGUmVhZFN0cmVhbVJlZiBpcyBiZWluZyBkZWFsbG9jYXRlZC4KLSAgICAvLyBX
ZSBjYW4ndCB3YWl0IHRvIHJlbW92ZSB0aGlzIGZyb20gdGhlIG1hcCB1bnRpbCB3ZSBmaW5pc2gg
ZmluYWxpemluZwotICAgIC8vIG9uIHRoZSBtYWluIHRocmVhZCBiZWNhdXNlIGluIHRoZW9yeSB0
aGUgZnJlZWQgbWVtb3J5IGNvdWxkIGJlIHJldXNlZAotICAgIC8vIGZvciBhIG5ldyBDRlJlYWRT
dHJlYW0gYmVmb3JlIHRoYXQgcnVucy4KLSAgICBzdHJlYW1GaWVsZHNNYXAoKS5yZW1vdmUoc3Ry
ZWFtKTsKLQotICAgIGNhbGxPbk1haW5UaHJlYWQoZm9ybUZpbmlzaEZpbmFsaXphdGlvbk9uTWFp
blRocmVhZCwgZm9ybSk7Ci19Ci0KLXN0YXRpYyBCb29sZWFuIGZvcm1PcGVuKENGUmVhZFN0cmVh
bVJlZiwgQ0ZTdHJlYW1FcnJvciogZXJyb3IsIEJvb2xlYW4qIG9wZW5Db21wbGV0ZSwgdm9pZCog
Y29udGV4dCkKLXsKLSAgICBGb3JtU3RyZWFtRmllbGRzKiBmb3JtID0gc3RhdGljX2Nhc3Q8Rm9y
bVN0cmVhbUZpZWxkcyo+KGNvbnRleHQpOwotCi0gICAgYm9vbCBvcGVuZWQgPSBvcGVuTmV4dFN0
cmVhbShmb3JtKTsKLQotICAgICpvcGVuQ29tcGxldGUgPSBvcGVuZWQ7Ci0gICAgZXJyb3ItPmVy
cm9yID0gb3BlbmVkID8gMCA6IGZuZkVycjsKLSAgICByZXR1cm4gb3BlbmVkOwotfQotCi1zdGF0
aWMgQ0ZJbmRleCBmb3JtUmVhZChDRlJlYWRTdHJlYW1SZWYsIFVJbnQ4KiBidWZmZXIsIENGSW5k
ZXggYnVmZmVyTGVuZ3RoLCBDRlN0cmVhbUVycm9yKiBlcnJvciwgQm9vbGVhbiogYXRFT0YsIHZv
aWQqIGNvbnRleHQpCi17Ci0gICAgRm9ybVN0cmVhbUZpZWxkcyogZm9ybSA9IHN0YXRpY19jYXN0
PEZvcm1TdHJlYW1GaWVsZHMqPihjb250ZXh0KTsKLQotICAgIHdoaWxlIChmb3JtLT5jdXJyZW50
U3RyZWFtKSB7Ci0gICAgICAgIENGSW5kZXggYnl0ZXNUb1JlYWQgPSBidWZmZXJMZW5ndGg7Ci0j
aWYgRU5BQkxFKEJMT0IpCi0gICAgICAgIGlmIChmb3JtLT5jdXJyZW50U3RyZWFtUmFuZ2VMZW5n
dGggIT0gQmxvYkRhdGFJdGVtOjp0b0VuZE9mRmlsZSAmJiBmb3JtLT5jdXJyZW50U3RyZWFtUmFu
Z2VMZW5ndGggPCBieXRlc1RvUmVhZCkKLSAgICAgICAgICAgIGJ5dGVzVG9SZWFkID0gc3RhdGlj
X2Nhc3Q8Q0ZJbmRleD4oZm9ybS0+Y3VycmVudFN0cmVhbVJhbmdlTGVuZ3RoKTsKLSNlbmRpZgot
ICAgICAgICBDRkluZGV4IGJ5dGVzUmVhZCA9IENGUmVhZFN0cmVhbVJlYWQoZm9ybS0+Y3VycmVu
dFN0cmVhbSwgYnVmZmVyLCBieXRlc1RvUmVhZCk7Ci0gICAgICAgIGlmIChieXRlc1JlYWQgPCAw
KSB7Ci0gICAgICAgICAgICAqZXJyb3IgPSBDRlJlYWRTdHJlYW1HZXRFcnJvcihmb3JtLT5jdXJy
ZW50U3RyZWFtKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBp
ZiAoYnl0ZXNSZWFkID4gMCkgewotICAgICAgICAgICAgZXJyb3ItPmVycm9yID0gMDsKLSAgICAg
ICAgICAgICphdEVPRiA9IEZBTFNFOwotICAgICAgICAgICAgZm9ybS0+Ynl0ZXNTZW50ICs9IGJ5
dGVzUmVhZDsKLSNpZiBFTkFCTEUoQkxPQikKLSAgICAgICAgICAgIGlmIChmb3JtLT5jdXJyZW50
U3RyZWFtUmFuZ2VMZW5ndGggIT0gQmxvYkRhdGFJdGVtOjp0b0VuZE9mRmlsZSkKLSAgICAgICAg
ICAgICAgICBmb3JtLT5jdXJyZW50U3RyZWFtUmFuZ2VMZW5ndGggLT0gYnl0ZXNSZWFkOwotI2Vu
ZGlmCi0KLSAgICAgICAgICAgIHJldHVybiBieXRlc1JlYWQ7Ci0gICAgICAgIH0KLSAgICAgICAg
b3Blbk5leHRTdHJlYW0oZm9ybSk7Ci0gICAgfQotCi0gICAgZXJyb3ItPmVycm9yID0gMDsKLSAg
ICAqYXRFT0YgPSBUUlVFOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgQm9vbGVhbiBmb3Jt
Q2FuUmVhZChDRlJlYWRTdHJlYW1SZWYgc3RyZWFtLCB2b2lkKiBjb250ZXh0KQotewotICAgIEZv
cm1TdHJlYW1GaWVsZHMqIGZvcm0gPSBzdGF0aWNfY2FzdDxGb3JtU3RyZWFtRmllbGRzKj4oY29u
dGV4dCk7Ci0KLSAgICB3aGlsZSAoZm9ybS0+Y3VycmVudFN0cmVhbSAmJiBDRlJlYWRTdHJlYW1H
ZXRTdGF0dXMoZm9ybS0+Y3VycmVudFN0cmVhbSkgPT0ga0NGU3RyZWFtU3RhdHVzQXRFbmQpIHsK
LSAgICAgICAgb3Blbk5leHRTdHJlYW0oZm9ybSk7Ci0gICAgfQotICAgIGlmICghZm9ybS0+Y3Vy
cmVudFN0cmVhbSkgewotICAgICAgICB3a1NpZ25hbENGUmVhZFN0cmVhbUVuZChzdHJlYW0pOwot
ICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiBDRlJlYWRTdHJlYW1IYXNC
eXRlc0F2YWlsYWJsZShmb3JtLT5jdXJyZW50U3RyZWFtKTsKLX0KLQotc3RhdGljIHZvaWQgZm9y
bUNsb3NlKENGUmVhZFN0cmVhbVJlZiwgdm9pZCogY29udGV4dCkKLXsKLSAgICBGb3JtU3RyZWFt
RmllbGRzKiBmb3JtID0gc3RhdGljX2Nhc3Q8Rm9ybVN0cmVhbUZpZWxkcyo+KGNvbnRleHQpOwot
Ci0gICAgY2xvc2VDdXJyZW50U3RyZWFtKGZvcm0pOwotfQotCi1zdGF0aWMgdm9pZCBmb3JtU2No
ZWR1bGUoQ0ZSZWFkU3RyZWFtUmVmLCBDRlJ1bkxvb3BSZWYgcnVuTG9vcCwgQ0ZTdHJpbmdSZWYg
cnVuTG9vcE1vZGUsIHZvaWQqIGNvbnRleHQpCi17Ci0gICAgRm9ybVN0cmVhbUZpZWxkcyogZm9y
bSA9IHN0YXRpY19jYXN0PEZvcm1TdHJlYW1GaWVsZHMqPihjb250ZXh0KTsKLQotICAgIGlmIChm
b3JtLT5jdXJyZW50U3RyZWFtKQotICAgICAgICBDRlJlYWRTdHJlYW1TY2hlZHVsZVdpdGhSdW5M
b29wKGZvcm0tPmN1cnJlbnRTdHJlYW0sIHJ1bkxvb3AsIHJ1bkxvb3BNb2RlKTsKLSAgICBmb3Jt
LT5zY2hlZHVsZWRSdW5Mb29wUGFpcnMuYWRkKFNjaGVkdWxlUGFpcjo6Y3JlYXRlKHJ1bkxvb3As
IHJ1bkxvb3BNb2RlKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZvcm1VbnNjaGVkdWxlKENGUmVhZFN0
cmVhbVJlZiwgQ0ZSdW5Mb29wUmVmIHJ1bkxvb3AsIENGU3RyaW5nUmVmIHJ1bkxvb3BNb2RlLCB2
b2lkKiBjb250ZXh0KQotewotICAgIEZvcm1TdHJlYW1GaWVsZHMqIGZvcm0gPSBzdGF0aWNfY2Fz
dDxGb3JtU3RyZWFtRmllbGRzKj4oY29udGV4dCk7Ci0KLSAgICBpZiAoZm9ybS0+Y3VycmVudFN0
cmVhbSkKLSAgICAgICAgQ0ZSZWFkU3RyZWFtVW5zY2hlZHVsZUZyb21SdW5Mb29wKGZvcm0tPmN1
cnJlbnRTdHJlYW0sIHJ1bkxvb3AsIHJ1bkxvb3BNb2RlKTsKLSAgICBmb3JtLT5zY2hlZHVsZWRS
dW5Mb29wUGFpcnMucmVtb3ZlKFNjaGVkdWxlUGFpcjo6Y3JlYXRlKHJ1bkxvb3AsIHJ1bkxvb3BN
b2RlKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZvcm1FdmVudENhbGxiYWNrKENGUmVhZFN0cmVhbVJl
ZiBzdHJlYW0sIENGU3RyZWFtRXZlbnRUeXBlIHR5cGUsIHZvaWQqIGNvbnRleHQpCi17Ci0gICAg
Rm9ybVN0cmVhbUZpZWxkcyogZm9ybSA9IHN0YXRpY19jYXN0PEZvcm1TdHJlYW1GaWVsZHMqPihj
b250ZXh0KTsKLQotICAgIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2Uga0NGU3RyZWFtRXZlbnRI
YXNCeXRlc0F2YWlsYWJsZToKLSAgICAgICAgd2tTaWduYWxDRlJlYWRTdHJlYW1IYXNCeXRlcyhm
b3JtLT5mb3JtU3RyZWFtKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBrQ0ZTdHJlYW1FdmVu
dEVycm9yT2NjdXJyZWQ6IHsKLSAgICAgICAgQ0ZTdHJlYW1FcnJvciByZWFkU3RyZWFtRXJyb3Ig
PSBDRlJlYWRTdHJlYW1HZXRFcnJvcihzdHJlYW0pOwotICAgICAgICB3a1NpZ25hbENGUmVhZFN0
cmVhbUVycm9yKGZvcm0tPmZvcm1TdHJlYW0sICZyZWFkU3RyZWFtRXJyb3IpOwotICAgICAgICBi
cmVhazsKLSAgICB9Ci0gICAgY2FzZSBrQ0ZTdHJlYW1FdmVudEVuZEVuY291bnRlcmVkOgotICAg
ICAgICBvcGVuTmV4dFN0cmVhbShmb3JtKTsKLSAgICAgICAgaWYgKCFmb3JtLT5jdXJyZW50U3Ry
ZWFtKSB7Ci0gICAgICAgICAgICB3a1NpZ25hbENGUmVhZFN0cmVhbUVuZChmb3JtLT5mb3JtU3Ry
ZWFtKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIGtDRlN0cmVhbUV2ZW50
Tm9uZToKLSAgICAgICAgTE9HX0VSUk9SKCJ1bmV4cGVjdGVkIGtDRlN0cmVhbUV2ZW50Tm9uZSIp
OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIGtDRlN0cmVhbUV2ZW50T3BlbkNvbXBsZXRlZDoK
LSAgICAgICAgTE9HX0VSUk9SKCJ1bmV4cGVjdGVkIGtDRlN0cmVhbUV2ZW50T3BlbkNvbXBsZXRl
ZCIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIGtDRlN0cmVhbUV2ZW50Q2FuQWNjZXB0Qnl0
ZXM6Ci0gICAgICAgIExPR19FUlJPUigidW5leHBlY3RlZCBrQ0ZTdHJlYW1FdmVudENhbkFjY2Vw
dEJ5dGVzIik7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQogdm9pZCBzZXRIVFRQQm9keShO
U011dGFibGVVUkxSZXF1ZXN0ICpyZXF1ZXN0LCBQYXNzUmVmUHRyPEZvcm1EYXRhPiBwcnBGb3Jt
RGF0YSkKIHsKLSAgICBSZWZQdHI8Rm9ybURhdGE+IGZvcm1EYXRhID0gcHJwRm9ybURhdGE7Ci0K
LSAgICBpZiAoIWZvcm1EYXRhKQotICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgIHNpemVf
dCBjb3VudCA9IGZvcm1EYXRhLT5lbGVtZW50cygpLnNpemUoKTsKLQotICAgIC8vIEhhbmRsZSB0
aGUgY29tbW9uIHNwZWNpYWwgY2FzZSBvZiBvbmUgcGllY2Ugb2YgZm9ybSBkYXRhLCB3aXRoIG5v
IGZpbGVzLgotICAgIGlmIChjb3VudCA9PSAxICYmICFmb3JtRGF0YS0+YWx3YXlzU3RyZWFtKCkp
IHsKLSAgICAgICAgY29uc3QgRm9ybURhdGFFbGVtZW50JiBlbGVtZW50ID0gZm9ybURhdGEtPmVs
ZW1lbnRzKClbMF07Ci0gICAgICAgIGlmIChlbGVtZW50Lm1fdHlwZSA9PSBGb3JtRGF0YUVsZW1l
bnQ6OmRhdGEpIHsKLSAgICAgICAgICAgIE5TRGF0YSAqZGF0YSA9IFtbTlNEYXRhIGFsbG9jXSBp
bml0V2l0aEJ5dGVzOmVsZW1lbnQubV9kYXRhLmRhdGEoKSBsZW5ndGg6ZWxlbWVudC5tX2RhdGEu
c2l6ZSgpXTsKLSAgICAgICAgICAgIFtyZXF1ZXN0IHNldEhUVFBCb2R5OmRhdGFdOwotICAgICAg
ICAgICAgW2RhdGEgcmVsZWFzZV07Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAg
ICB9Ci0KLSNpZiBFTkFCTEUoQkxPQikKLSAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhIGJsb2Ig
aW4gdGhlIGZvcm0gZGF0YS4KLSAgICBib29sIGhhc0Jsb2IgPSBmYWxzZTsKLSAgICBmb3IgKHNp
emVfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgICAgY29uc3QgRm9ybURhdGFFbGVt
ZW50JiBlbGVtZW50ID0gZm9ybURhdGEtPmVsZW1lbnRzKClbaV07Ci0gICAgICAgIGlmIChlbGVt
ZW50Lm1fdHlwZSA9PSBGb3JtRGF0YUVsZW1lbnQ6OmVuY29kZWRCbG9iKSB7Ci0gICAgICAgICAg
ICBoYXNCbG9iID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQot
Ci0gICAgLy8gSWYgeWVzLCB3ZSBoYXZlIHRvIHJlc29sdmUgYWxsIHRoZSBibG9iIHJlZmVyZW5j
ZXMgYW5kIHJlZ2VuZXJhdGUgdGhlIGZvcm0gZGF0YSB3aXRoIG9ubHkgZGF0YSBhbmQgZmlsZSB0
eXBlcy4KLSAgICBpZiAoaGFzQmxvYikgewotICAgICAgICBSZWZQdHI8Rm9ybURhdGE+IG5ld0Zv
cm1EYXRhID0gRm9ybURhdGE6OmNyZWF0ZSgpOwotICAgICAgICBuZXdGb3JtRGF0YS0+c2V0QWx3
YXlzU3RyZWFtKGZvcm1EYXRhLT5hbHdheXNTdHJlYW0oKSk7Ci0gICAgICAgIG5ld0Zvcm1EYXRh
LT5zZXRJZGVudGlmaWVyKGZvcm1EYXRhLT5pZGVudGlmaWVyKCkpOwotICAgICAgICBmb3IgKHNp
emVfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgICAgICAgIGNvbnN0IEZvcm1EYXRh
RWxlbWVudCYgZWxlbWVudCA9IGZvcm1EYXRhLT5lbGVtZW50cygpW2ldOwotICAgICAgICAgICAg
aWYgKGVsZW1lbnQubV90eXBlID09IEZvcm1EYXRhRWxlbWVudDo6ZGF0YSkKLSAgICAgICAgICAg
ICAgICBuZXdGb3JtRGF0YS0+YXBwZW5kRGF0YShlbGVtZW50Lm1fZGF0YS5kYXRhKCksIGVsZW1l
bnQubV9kYXRhLnNpemUoKSk7Ci0gICAgICAgICAgICBlbHNlIGlmIChlbGVtZW50Lm1fdHlwZSA9
PSBGb3JtRGF0YUVsZW1lbnQ6OmVuY29kZWRGaWxlKQotICAgICAgICAgICAgICAgIG5ld0Zvcm1E
YXRhLT5hcHBlbmRGaWxlKGVsZW1lbnQubV9maWxlbmFtZSwgZWxlbWVudC5tX3Nob3VsZEdlbmVy
YXRlRmlsZSk7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBBU1NFUlQoZWxl
bWVudC5tX3R5cGUgPT0gRm9ybURhdGFFbGVtZW50OjplbmNvZGVkQmxvYik7Ci0gICAgICAgICAg
ICAgICAgUmVmUHRyPEJsb2JTdG9yYWdlRGF0YT4gYmxvYkRhdGEgPSBzdGF0aWNfY2FzdDxCbG9i
UmVnaXN0cnlJbXBsJj4oYmxvYlJlZ2lzdHJ5KCkpLmdldEJsb2JEYXRhRnJvbVVSTChLVVJMKFBh
cnNlZFVSTFN0cmluZywgZWxlbWVudC5tX2Jsb2JVUkwpKTsKLSAgICAgICAgICAgICAgICBpZiAo
YmxvYkRhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBi
bG9iRGF0YS0+aXRlbXMoKS5zaXplKCk7ICsraikgewotICAgICAgICAgICAgICAgICAgICAgICAg
Y29uc3QgQmxvYkRhdGFJdGVtJiBibG9iSXRlbSA9IGJsb2JEYXRhLT5pdGVtcygpW2pdOwotICAg
ICAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2JJdGVtLnR5cGUgPT0gQmxvYkRhdGFJdGVtOjpE
YXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybURhdGEtPmFwcGVuZERh
dGEoYmxvYkl0ZW0uZGF0YS0+ZGF0YSgpICsgc3RhdGljX2Nhc3Q8aW50PihibG9iSXRlbS5vZmZz
ZXQpLCBzdGF0aWNfY2FzdDxpbnQ+KGJsb2JJdGVtLmxlbmd0aCkpOwotICAgICAgICAgICAgICAg
ICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1NFUlQoYmxv
Ykl0ZW0udHlwZSA9PSBCbG9iRGF0YUl0ZW06OkZpbGUpOwotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIG5ld0Zvcm1EYXRhLT5hcHBlbmRGaWxlUmFuZ2UoYmxvYkl0ZW0ucGF0aCwgYmxvYkl0
ZW0ub2Zmc2V0LCBibG9iSXRlbS5sZW5ndGgsIGJsb2JJdGVtLmV4cGVjdGVkTW9kaWZpY2F0aW9u
VGltZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0K
LSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZm9y
bURhdGEgPSBuZXdGb3JtRGF0YS5yZWxlYXNlKCk7Ci0gICAgICAgIGNvdW50ID0gZm9ybURhdGEt
PmVsZW1lbnRzKCkuc2l6ZSgpOwotICAgIH0KLSNlbmRpZgotCi0gICAgLy8gUHJlY29tcHV0ZSB0
aGUgY29udGVudCBsZW5ndGggc28gTlNVUkxDb25uZWN0aW9uIGRvZXNuJ3QgdXNlIGNodW5rZWQg
bW9kZS4KLSAgICBsb25nIGxvbmcgbGVuZ3RoID0gMDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsg
aSA8IGNvdW50OyArK2kpIHsKLSAgICAgICAgY29uc3QgRm9ybURhdGFFbGVtZW50JiBlbGVtZW50
ID0gZm9ybURhdGEtPmVsZW1lbnRzKClbaV07Ci0gICAgICAgIGlmIChlbGVtZW50Lm1fdHlwZSA9
PSBGb3JtRGF0YUVsZW1lbnQ6OmRhdGEpCi0gICAgICAgICAgICBsZW5ndGggKz0gZWxlbWVudC5t
X2RhdGEuc2l6ZSgpOwotICAgICAgICBlbHNlIHsKLSNpZiBFTkFCTEUoQkxPQikKLSAgICAgICAg
ICAgIC8vIElmIHdlJ3JlIHNlbmRpbmcgdGhlIGZpbGUgcmFuZ2UsIHVzZSB0aGUgZXhpc3Rpbmcg
cmFuZ2UgbGVuZ3RoIGZvciBub3cuIFdlIHdpbGwgZGV0ZWN0IGlmIHRoZSBmaWxlIGhhcyBiZWVu
IGNoYW5nZWQgcmlnaHQgYmVmb3JlIHdlIHJlYWQgdGhlIGZpbGUgYW5kIGFib3J0IHRoZSBvcGVy
YXRpb24gaWYgbmVjZXNzYXJ5LgotICAgICAgICAgICAgaWYgKGVsZW1lbnQubV9maWxlTGVuZ3Ro
ICE9IEJsb2JEYXRhSXRlbTo6dG9FbmRPZkZpbGUpIHsKLSAgICAgICAgICAgICAgICBsZW5ndGgg
Kz0gZWxlbWVudC5tX2ZpbGVMZW5ndGg7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAg
ICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgIGxvbmcgbG9uZyBmaWxlU2l6ZTsKLSAgICAg
ICAgICAgIGlmIChnZXRGaWxlU2l6ZShlbGVtZW50Lm1fc2hvdWxkR2VuZXJhdGVGaWxlID8gZWxl
bWVudC5tX2dlbmVyYXRlZEZpbGVuYW1lIDogZWxlbWVudC5tX2ZpbGVuYW1lLCBmaWxlU2l6ZSkp
Ci0gICAgICAgICAgICAgICAgbGVuZ3RoICs9IGZpbGVTaXplOwotICAgICAgICB9Ci0gICAgfQot
Ci0gICAgLy8gU2V0IHRoZSBsZW5ndGguCi0gICAgW3JlcXVlc3Qgc2V0VmFsdWU6W05TU3RyaW5n
IHN0cmluZ1dpdGhGb3JtYXQ6QCIlbGxkIiwgbGVuZ3RoXSBmb3JIVFRQSGVhZGVyRmllbGQ6QCJD
b250ZW50LUxlbmd0aCJdOwotCi0gICAgLy8gQ3JlYXRlIGFuZCBzZXQgdGhlIHN0cmVhbS4KLQot
ICAgIC8vIFBhc3MgdGhlIGxlbmd0aCBhbG9uZyB3aXRoIHRoZSBmb3JtRGF0YSBzbyBpdCBkb2Vz
IG5vdCBoYXZlIHRvIGJlIHJlY29tcHV0ZWQuCi0gICAgRm9ybUNvbnRleHQgZm9ybUNvbnRleHQg
PSB7IGZvcm1EYXRhLnJlbGVhc2UoKSwgbGVuZ3RoIH07Ci0KLSAgICBSZXRhaW5QdHI8Q0ZSZWFk
U3RyZWFtUmVmPiBzdHJlYW0oQWRvcHRDRiwgd2tDcmVhdGVDdXN0b21DRlJlYWRTdHJlYW0oZm9y
bUNyZWF0ZSwgZm9ybUZpbmFsaXplLAotICAgICAgICBmb3JtT3BlbiwgZm9ybVJlYWQsIGZvcm1D
YW5SZWFkLCBmb3JtQ2xvc2UsIGZvcm1TY2hlZHVsZSwgZm9ybVVuc2NoZWR1bGUsCi0gICAgICAg
ICZmb3JtQ29udGV4dCkpOwotICAgIFtyZXF1ZXN0IHNldEhUVFBCb2R5U3RyZWFtOihOU0lucHV0
U3RyZWFtICopc3RyZWFtLmdldCgpXTsKKyAgICBzZXRIVFRQQm9keShjb25zdF9jYXN0PENGTXV0
YWJsZVVSTFJlcXVlc3RSZWY+KFtyZXF1ZXN0IF9DRlVSTFJlcXVlc3RdKSwgcHJwRm9ybURhdGEp
OwogfQogCi1Gb3JtRGF0YSogaHR0cEJvZHlGcm9tU3RyZWFtKE5TSW5wdXRTdHJlYW0qIHN0cmVh
bSkKK0Zvcm1EYXRhKiBodHRwQm9keUZyb21TdHJlYW0oTlNJbnB1dFN0cmVhbSAqc3RyZWFtKQog
ewotICAgIE11dGV4TG9ja2VyIGxvY2tlcihzdHJlYW1GaWVsZHNNYXBNdXRleCgpKTsKLSAgICBG
b3JtU3RyZWFtRmllbGRzKiBmb3JtU3RyZWFtID0gc3RyZWFtRmllbGRzTWFwKCkuZ2V0KHJlaW50
ZXJwcmV0X2Nhc3Q8Q0ZSZWFkU3RyZWFtUmVmPihzdHJlYW0pKTsKLSAgICBpZiAoIWZvcm1TdHJl
YW0pCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiBmb3JtU3RyZWFtLT5mb3JtRGF0YS5n
ZXQoKTsKKyAgICByZXR1cm4gaHR0cEJvZHlGcm9tU3RyZWFtKHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZS
ZWFkU3RyZWFtUmVmPihzdHJlYW0pKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQo=
</data>
<flag name="commit-queue"
          id="138675"
          type_id="3"
          status="-"
          setter="buildbot"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>134428</attachid>
            <date>2012-03-28 15:42:26 -0700</date>
            <delta_ts>2012-03-28 17:59:00 -0700</delta_ts>
            <desc>moarrrrr!</desc>
            <filename>FormDataStream.txt</filename>
            <type>text/plain</type>
            <size>43383</size>
            <attacher name="Alexey Proskuryakov">ap</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDExMjQ1OSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDMzIEBACisyMDEyLTAzLTI4ICBBbGV4ZXkg
UHJvc2t1cnlha292ICA8YXBAYXBwbGUuY29tPgorCisgICAgICAgIFtXaW5dIFNvbWUgQmxvYiB0
ZXN0cyBjcmFzaCBpbiBDRk5ldHdvcmsgaW4gYWR2YW5jZUN1cnJlbnRTdHJlYW0oRm9ybVN0cmVh
bUZpZWxkcyopCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD04MjM4NgorICAgICAgICA8cmRhcjovL3Byb2JsZW0vMTExMjE1MDE+CisKKyAgICAgICAgUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQ292ZXJlZCBieSBleGlzdGluZyB0
ZXN0cy4KKworICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvY2YvRm9ybURhdGFTdHJlYW1DRk5l
dC5jcHA6CisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jZi9Gb3JtRGF0YVN0cmVhbUNGTmV0
Lmg6CisgICAgICAgIE1vdmVkIGxvdyBsZXZlbCBpbXBsZW1lbnRhdGlvbiBmcm9tIEZvcm1EYXRh
U3RyZWFtTWFjLCBhbmQgZXhwb3NlZCBhbiBhZGRpdGlvbmFsIGZ1bmN0aW9uCisgICAgICAgIHRv
IGltcGxlbWVudCBGb3VuZGF0aW9uLWJhc2VkIEFQSSBvbiB0b3Agb2YgdGhpcy4KKworICAgICAg
ICAqIHBsYXRmb3JtL25ldHdvcmsvbWFjL0Zvcm1EYXRhU3RyZWFtTWFjLmg6CisgICAgICAgICog
cGxhdGZvcm0vbmV0d29yay9tYWMvRm9ybURhdGFTdHJlYW1NYWMubW06CisgICAgICAgIFJlbHkg
b24gdG9sbC1mcmVlIGJyaWRnaW5nIGFuZCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIHRvIG1ha2Ug
dGhpcyB3b3JrIHdpdGhvdXQgZHVwbGljYXRpbmcKKyAgICAgICAgY29kZS4KKyAgICAgICAgTm90
ZSB0aGF0IGh0dHBCb2R5RnJvbVN0cmVhbSBpcyBjb25mdXNpbmcgLSBJIGRvbid0IHNlZSBob3cg
aXQgY2FuIHdvcmsgd2hlbiBzZW5kaW5nIHNlcmlhbGl6ZWQKKyAgICAgICAgcmVxdWVzdHMgYWNy
b3NzIHByb2Nlc3MgYm91bmRhcnkuIFdlIHByb2JhYmx5IG9ubHkgZ2V0IGF3YXkgd2l0aCB0aGlz
IGJlY2F1c2Ugd2UgZG9uJ3QgYXR0ZW1wdAorICAgICAgICB0byBzZW5kIHJlcXVlc3RzIHRvIFVJ
IHByb2Nlc3Mgb25jZSB0aGV5IGFscmVhZHkgaGF2ZSBzdHJlYW1zIGFzc29jaWF0ZWQgd2l0aCB0
aGVtLgorCisgICAgICAgICogV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2o6IEFkZGVkIG1p
c3NpbmcgcGxhdGZvcm0vY2YgZmlsZXMuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9jZi9GaWxlU3lz
dGVtQ0YuY3BwOiBGaXhlZCBpbmNsdWRlIHN0eWxlLgorCisgICAgICAgICogcGxhdGZvcm0vd2lu
L0ZpbGVTeXN0ZW1XaW4uY3BwOiAoV2ViQ29yZTo6ZmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uKTog
SWZkZWYgb3V0IGEgYnJva2VuCisgICAgICAgIGltcGxlbWVudGF0aW9uLgorCiAyMDEyLTAzLTI4
ICBHYXZpbiBCYXJyYWNsb3VnaCAgPGJhcnJhY2xvdWdoQGFwcGxlLmNvbT4KIAogICAgICAgICBZ
YXJyOiBpZiB3ZSdyZSBub3QgdXNpbmcgdGhlIG91dHB1dCBhcnJheSwgZG9uJ3QgcG9wdWxhdGUg
aXQhCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvago9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJv
agkocmV2aXNpb24gMTEyMTY2KQorKysgU291cmNlL1dlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2Vi
Q29yZS52Y3Byb2oJKHdvcmtpbmcgY29weSkKQEAgLTI4Mzg1LDYgKzI4Mzg1LDEwIEBACiAJCQkJ
CT4KIAkJCQk8L0ZpbGU+CiAJCQkJPEZpbGUKKwkJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9y
bVxjZlxGaWxlU3lzdGVtQ0YuY3BwIgorCQkJCQk+CisJCQkJPC9GaWxlPgorCQkJCTxGaWxlCiAJ
CQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1cY2ZcS1VSTENGTmV0LmNwcCIKIAkJCQkJPgog
CQkJCTwvRmlsZT4KQEAgLTI4MzkzLDYgKzI4Mzk3LDE0IEBACiAJCQkJCT4KIAkJCQk8L0ZpbGU+
CiAJCQkJPEZpbGUKKwkJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVxjZlxTY2hlZHVsZVBh
aXIuY3BwIgorCQkJCQk+CisJCQkJPC9GaWxlPgorCQkJCTxGaWxlCisJCQkJCVJlbGF0aXZlUGF0
aD0iLi5ccGxhdGZvcm1cY2ZcU2NoZWR1bGVQYWlyLmgiCisJCQkJCT4KKwkJCQk8L0ZpbGU+CisJ
CQkJPEZpbGUKIAkJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVxjZlxTaGFyZWRCdWZmZXJD
Ri5jcHAiCiAJCQkJCT4KIAkJCQk8L0ZpbGU+CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9jZi9GaWxlU3lzdGVtQ0YuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2NmL0ZpbGVTeXN0ZW1DRi5jcHAJKHJldmlzaW9uIDExMjE2NikKKysrIFNvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2NmL0ZpbGVTeXN0ZW1DRi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI2LDEy
ICsyNiwxMiBAQAogICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICAqLwogCi0jaW1wb3J0ICJjb25maWcuaCIKLSNpbXBv
cnQgIkZpbGVTeXN0ZW0uaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJGaWxlU3lz
dGVtLmgiCiAKLSNpbXBvcnQgIlBsYXRmb3JtU3RyaW5nLmgiCi0jaW1wb3J0IDx3dGYvUmV0YWlu
UHRyLmg+Ci0jaW1wb3J0IDx3dGYvdGV4dC9DU3RyaW5nLmg+CisjaW5jbHVkZSAiUGxhdGZvcm1T
dHJpbmcuaCIKKyNpbmNsdWRlIDx3dGYvUmV0YWluUHRyLmg+CisjaW5jbHVkZSA8d3RmL3RleHQv
Q1N0cmluZy5oPgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKSW5kZXg6IFNvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL25ldHdvcmsvY2YvRm9ybURhdGFTdHJlYW1DRk5ldC5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jZi9Gb3JtRGF0YVN0cmVhbUNGTmV0
LmNwcAkocmV2aXNpb24gMTEyMTY2KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29y
ay9jZi9Gb3JtRGF0YVN0cmVhbUNGTmV0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDUg
QEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwNywgMjAx
MiBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCkBAIC0yNiw5OSArMjYsNDY0IEBACiAgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogICovCiAKLS8qIG9y
aWdpbmFsbHkgd3JpdHRlbiBieSBCZWNreSBXaWxscmljaCwgYWRkaXRpb25hbCBjb2RlIGJ5IERh
cmluIEFkbGVyICovCi0KICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJGb3JtRGF0YVN0
cmVhbUNGTmV0LmgiCiAKLSNpZiBVU0UoQ0ZORVRXT1JLKQotCisjaW5jbHVkZSAiQmxvYlJlZ2lz
dHJ5SW1wbC5oIgogI2luY2x1ZGUgIkZpbGVTeXN0ZW0uaCIKICNpbmNsdWRlICJGb3JtRGF0YS5o
IgotI2luY2x1ZGUgPENGTmV0d29yay9DRlVSTFJlcXVlc3RQcml2Lmg+CisjaW5jbHVkZSAiU2No
ZWR1bGVQYWlyLmgiCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMu
aD4KICNpbmNsdWRlIDx3dGYvQXNzZXJ0aW9ucy5oPgogI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+
CisjaW5jbHVkZSA8d3RmL01haW5UaHJlYWQuaD4KICNpbmNsdWRlIDx3dGYvUmV0YWluUHRyLmg+
Ci0jaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgorI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRy
YXMuaD4KKyNpbmNsdWRlIDx3dGYvVGhyZWFkaW5nLmg+CisKKyNpZiBQTEFURk9STShJT1MpCisj
aW5jbHVkZSA8TWFjRXJyb3JzLmg+CisjZWxzZQorI2luY2x1ZGUgPENvcmVTZXJ2aWNlcy9Db3Jl
U2VydmljZXMuaD4KKyNlbmRpZgogCiAjaWYgUExBVEZPUk0oTUFDKQotI2luY2x1ZGUgIldlYkNv
cmVTeXN0ZW1JbnRlcmZhY2UuaCIKK2V4dGVybiAiQyIgdm9pZCBDRlVSTFJlcXVlc3RTZXRIVFRQ
UmVxdWVzdEJvZHkoQ0ZNdXRhYmxlVVJMUmVxdWVzdFJlZiBtdXRhYmxlSFRUUFJlcXVlc3QsIENG
RGF0YVJlZiBodHRwQm9keSk7CitleHRlcm4gIkMiIHZvaWQgQ0ZVUkxSZXF1ZXN0U2V0SFRUUEhl
YWRlckZpZWxkVmFsdWUoQ0ZNdXRhYmxlVVJMUmVxdWVzdFJlZiBtdXRhYmxlSFRUUFJlcXVlc3Qs
IENGU3RyaW5nUmVmIGh0dHBIZWFkZXJGaWVsZCwgQ0ZTdHJpbmdSZWYgaHR0cEhlYWRlckZpZWxk
VmFsdWUpOworZXh0ZXJuICJDIiB2b2lkIENGVVJMUmVxdWVzdFNldEhUVFBSZXF1ZXN0Qm9keVN0
cmVhbShDRk11dGFibGVVUkxSZXF1ZXN0UmVmIHJlcSwgQ0ZSZWFkU3RyZWFtUmVmIGJvZHlTdHJl
YW0pOworZXh0ZXJuICJDIiBDRlJlYWRTdHJlYW1SZWYgQ0ZVUkxSZXF1ZXN0Q29weUhUVFBSZXF1
ZXN0Qm9keVN0cmVhbShDRlVSTFJlcXVlc3RSZWYgcmVxdWVzdCk7CiAjZWxpZiBQTEFURk9STShX
SU4pCi0jaW5jbHVkZSA8V2ViS2l0U3lzdGVtSW50ZXJmYWNlL1dlYktpdFN5c3RlbUludGVyZmFj
ZS5oPgorI2luY2x1ZGUgPENGTmV0d29yay9DRlVSTFJlcXVlc3QuaD4KICNlbmRpZgogCit0eXBl
ZGVmIHN0cnVjdCB7CisgICAgQ0ZJbmRleCB2ZXJzaW9uOyAvKiA9PSAxICovCisgICAgdm9pZCAq
KCpjcmVhdGUpKENGUmVhZFN0cmVhbVJlZiBzdHJlYW0sIHZvaWQgKmluZm8pOworICAgIHZvaWQg
KCpmaW5hbGl6ZSkoQ0ZSZWFkU3RyZWFtUmVmIHN0cmVhbSwgdm9pZCAqaW5mbyk7CisgICAgQ0ZT
dHJpbmdSZWYgKCpjb3B5RGVzY3JpcHRpb24pKENGUmVhZFN0cmVhbVJlZiBzdHJlYW0sIHZvaWQg
KmluZm8pOworICAgIEJvb2xlYW4gKCpvcGVuKShDRlJlYWRTdHJlYW1SZWYgc3RyZWFtLCBDRlN0
cmVhbUVycm9yICplcnJvciwgQm9vbGVhbiAqb3BlbkNvbXBsZXRlLCB2b2lkICppbmZvKTsKKyAg
ICBCb29sZWFuICgqb3BlbkNvbXBsZXRlZCkoQ0ZSZWFkU3RyZWFtUmVmIHN0cmVhbSwgQ0ZTdHJl
YW1FcnJvciAqZXJyb3IsIHZvaWQgKmluZm8pOworICAgIENGSW5kZXggKCpyZWFkKShDRlJlYWRT
dHJlYW1SZWYgc3RyZWFtLCBVSW50OCAqYnVmZmVyLCBDRkluZGV4IGJ1ZmZlckxlbmd0aCwgQ0ZT
dHJlYW1FcnJvciAqZXJyb3IsIEJvb2xlYW4gKmF0RU9GLCB2b2lkICppbmZvKTsKKyAgICBjb25z
dCBVSW50OCAqKCpnZXRCdWZmZXIpKENGUmVhZFN0cmVhbVJlZiBzdHJlYW0sIENGSW5kZXggbWF4
Qnl0ZXNUb1JlYWQsIENGSW5kZXggKm51bUJ5dGVzUmVhZCwgQ0ZTdHJlYW1FcnJvciAqZXJyb3Is
IEJvb2xlYW4gKmF0RU9GLCB2b2lkICppbmZvKTsKKyAgICBCb29sZWFuICgqY2FuUmVhZCkoQ0ZS
ZWFkU3RyZWFtUmVmIHN0cmVhbSwgdm9pZCAqaW5mbyk7CisgICAgdm9pZCAoKmNsb3NlKShDRlJl
YWRTdHJlYW1SZWYgc3RyZWFtLCB2b2lkICppbmZvKTsKKyAgICBDRlR5cGVSZWYgKCpjb3B5UHJv
cGVydHkpKENGUmVhZFN0cmVhbVJlZiBzdHJlYW0sIENGU3RyaW5nUmVmIHByb3BlcnR5TmFtZSwg
dm9pZCAqaW5mbyk7CisgICAgQm9vbGVhbiAoKnNldFByb3BlcnR5KShDRlJlYWRTdHJlYW1SZWYg
c3RyZWFtLCBDRlN0cmluZ1JlZiBwcm9wZXJ0eU5hbWUsIENGVHlwZVJlZiBwcm9wZXJ0eVZhbHVl
LCB2b2lkICppbmZvKTsKKyAgICB2b2lkICgqcmVxdWVzdEV2ZW50cykoQ0ZSZWFkU3RyZWFtUmVm
IHN0cmVhbSwgQ0ZPcHRpb25GbGFncyBzdHJlYW1FdmVudHMsIHZvaWQgKmluZm8pOworICAgIHZv
aWQgKCpzY2hlZHVsZSkoQ0ZSZWFkU3RyZWFtUmVmIHN0cmVhbSwgQ0ZSdW5Mb29wUmVmIHJ1bkxv
b3AsIENGU3RyaW5nUmVmIHJ1bkxvb3BNb2RlLCB2b2lkICppbmZvKTsKKyAgICB2b2lkICgqdW5z
Y2hlZHVsZSkoQ0ZSZWFkU3RyZWFtUmVmIHN0cmVhbSwgQ0ZSdW5Mb29wUmVmIHJ1bkxvb3AsIENG
U3RyaW5nUmVmIHJ1bkxvb3BNb2RlLCB2b2lkICppbmZvKTsKK30gQ0ZSZWFkU3RyZWFtQ2FsbEJh
Y2tzVjE7CisKKyNpZiBQTEFURk9STShXSU4pCisjZGVmaW5lIEVYVEVSTiBleHRlcm4gIkMiIF9f
ZGVjbHNwZWMoZGxsaW1wb3J0KQorI2Vsc2UKKyNkZWZpbmUgRVhURVJOIGV4dGVybiAiQyIKKyNl
bmRpZgorCitFWFRFUk4gdm9pZCBDRlJlYWRTdHJlYW1TaWduYWxFdmVudChDRlJlYWRTdHJlYW1S
ZWYgc3RyZWFtLCBDRlN0cmVhbUV2ZW50VHlwZSBldmVudCwgY29uc3Qgdm9pZCAqZXJyb3IpOwor
RVhURVJOIENGUmVhZFN0cmVhbVJlZiBDRlJlYWRTdHJlYW1DcmVhdGUoQ0ZBbGxvY2F0b3JSZWYg
YWxsb2MsIGNvbnN0IHZvaWQgKmNhbGxiYWNrcywgdm9pZCAqaW5mbyk7CisKIG5hbWVzcGFjZSBX
ZWJDb3JlIHsKIAotdm9pZCBzZXRIVFRQQm9keShDRk11dGFibGVVUkxSZXF1ZXN0UmVmIHJlcXVl
c3QsIFBhc3NSZWZQdHI8Rm9ybURhdGE+IGZvcm1EYXRhKQorc3RhdGljIE11dGV4JiBzdHJlYW1G
aWVsZHNNYXBNdXRleCgpCiB7Ci0gICAgaWYgKCFmb3JtRGF0YSkgewotICAgICAgICB3a0NGVVJM
UmVxdWVzdFNldEhUVFBSZXF1ZXN0Qm9keVBhcnRzKHJlcXVlc3QsIDApOwotICAgICAgICByZXR1
cm47CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChNdXRleCwgc3RhdGljTXV0ZXgsICgpKTsKKyAg
ICByZXR1cm4gc3RhdGljTXV0ZXg7Cit9CisKK3N0YXRpYyB2b2lkIGZvcm1FdmVudENhbGxiYWNr
KENGUmVhZFN0cmVhbVJlZiBzdHJlYW0sIENGU3RyZWFtRXZlbnRUeXBlIHR5cGUsIHZvaWQqIGNv
bnRleHQpOworCitzdHJ1Y3QgRm9ybUNvbnRleHQgeworICAgIFJlZlB0cjxGb3JtRGF0YT4gZm9y
bURhdGE7CisgICAgdW5zaWduZWQgbG9uZyBsb25nIHN0cmVhbUxlbmd0aDsKK307CisKK3N0cnVj
dCBGb3JtU3RyZWFtRmllbGRzIHsKKyAgICBSZWZQdHI8Rm9ybURhdGE+IGZvcm1EYXRhOworICAg
IFNjaGVkdWxlUGFpckhhc2hTZXQgc2NoZWR1bGVkUnVuTG9vcFBhaXJzOworICAgIFZlY3RvcjxG
b3JtRGF0YUVsZW1lbnQ+IHJlbWFpbmluZ0VsZW1lbnRzOyAvLyBpbiByZXZlcnNlIG9yZGVyCisg
ICAgQ0ZSZWFkU3RyZWFtUmVmIGN1cnJlbnRTdHJlYW07CisjaWYgRU5BQkxFKEJMT0IpCisgICAg
bG9uZyBsb25nIGN1cnJlbnRTdHJlYW1SYW5nZUxlbmd0aDsKKyNlbmRpZgorICAgIGNoYXIqIGN1
cnJlbnREYXRhOworICAgIENGUmVhZFN0cmVhbVJlZiBmb3JtU3RyZWFtOworICAgIHVuc2lnbmVk
IGxvbmcgbG9uZyBzdHJlYW1MZW5ndGg7CisgICAgdW5zaWduZWQgbG9uZyBsb25nIGJ5dGVzU2Vu
dDsKK307CisKK3R5cGVkZWYgSGFzaE1hcDxDRlJlYWRTdHJlYW1SZWYsIEZvcm1TdHJlYW1GaWVs
ZHMqPiBTdHJlYW1GaWVsZHNNYXA7CitzdGF0aWMgU3RyZWFtRmllbGRzTWFwJiBzdHJlYW1GaWVs
ZHNNYXAoKQoreworICAgIERFRklORV9TVEFUSUNfTE9DQUwoU3RyZWFtRmllbGRzTWFwLCBzdHJl
YW1GaWVsZHNNYXAsICgpKTsKKyAgICByZXR1cm4gc3RyZWFtRmllbGRzTWFwOworfQorCitzdGF0
aWMgdm9pZCBjbG9zZUN1cnJlbnRTdHJlYW0oRm9ybVN0cmVhbUZpZWxkcyAqZm9ybSkKK3sKKyAg
ICBpZiAoZm9ybS0+Y3VycmVudFN0cmVhbSkgeworICAgICAgICBDRlJlYWRTdHJlYW1DbG9zZShm
b3JtLT5jdXJyZW50U3RyZWFtKTsKKyAgICAgICAgQ0ZSZWFkU3RyZWFtU2V0Q2xpZW50KGZvcm0t
PmN1cnJlbnRTdHJlYW0sIGtDRlN0cmVhbUV2ZW50Tm9uZSwgMCwgMCk7CisgICAgICAgIENGUmVs
ZWFzZShmb3JtLT5jdXJyZW50U3RyZWFtKTsKKyAgICAgICAgZm9ybS0+Y3VycmVudFN0cmVhbSA9
IDA7CisjaWYgRU5BQkxFKEJMT0IpCisgICAgICAgIGZvcm0tPmN1cnJlbnRTdHJlYW1SYW5nZUxl
bmd0aCA9IEJsb2JEYXRhSXRlbTo6dG9FbmRPZkZpbGU7CisjZW5kaWYKICAgICB9CisgICAgaWYg
KGZvcm0tPmN1cnJlbnREYXRhKSB7CisgICAgICAgIGZhc3RGcmVlKGZvcm0tPmN1cnJlbnREYXRh
KTsKKyAgICAgICAgZm9ybS0+Y3VycmVudERhdGEgPSAwOworICAgIH0KK30KIAotICAgIHNpemVf
dCBjb3VudCA9IGZvcm1EYXRhLT5lbGVtZW50cygpLnNpemUoKTsKKy8vIFJldHVybiBmYWxzZSBp
ZiB3ZSBjYW5ub3QgYWR2YW5jZSB0aGUgc3RyZWFtLiBDdXJyZW50bHkgdGhlIG9ubHkgcG9zc2li
bGUgZmFpbHVyZSBpcyB0aGF0IHRoZSB1bmRlcmx5aW5nIGZpbGUgaGFzIGJlZW4gcmVtb3ZlZCBv
ciBjaGFuZ2VkIHNpbmNlIEZpbGUuc2xpY2UuCitzdGF0aWMgYm9vbCBhZHZhbmNlQ3VycmVudFN0
cmVhbShGb3JtU3RyZWFtRmllbGRzKiBmb3JtKQoreworICAgIGNsb3NlQ3VycmVudFN0cmVhbShm
b3JtKTsKKworICAgIGlmIChmb3JtLT5yZW1haW5pbmdFbGVtZW50cy5pc0VtcHR5KCkpCisgICAg
ICAgIHJldHVybiB0cnVlOworCisgICAgLy8gQ3JlYXRlIHRoZSBuZXcgc3RyZWFtLgorICAgIEZv
cm1EYXRhRWxlbWVudCYgbmV4dElucHV0ID0gZm9ybS0+cmVtYWluaW5nRWxlbWVudHMubGFzdCgp
OworCisgICAgaWYgKG5leHRJbnB1dC5tX3R5cGUgPT0gRm9ybURhdGFFbGVtZW50OjpkYXRhKSB7
CisgICAgICAgIHNpemVfdCBzaXplID0gbmV4dElucHV0Lm1fZGF0YS5zaXplKCk7CisgICAgICAg
IGNoYXIqIGRhdGEgPSBuZXh0SW5wdXQubV9kYXRhLnJlbGVhc2VCdWZmZXIoKTsKKyAgICAgICAg
Zm9ybS0+Y3VycmVudFN0cmVhbSA9IENGUmVhZFN0cmVhbUNyZWF0ZVdpdGhCeXRlc05vQ29weSgw
LCByZWludGVycHJldF9jYXN0PGNvbnN0IFVJbnQ4Kj4oZGF0YSksIHNpemUsIGtDRkFsbG9jYXRv
ck51bGwpOworICAgICAgICBmb3JtLT5jdXJyZW50RGF0YSA9IGRhdGE7CisgICAgfSBlbHNlIHsK
KyNpZiBFTkFCTEUoQkxPQikKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGZpbGUgaGFzIGJlZW4g
Y2hhbmdlZCBvciBub3QgaWYgcmVxdWlyZWQuCisgICAgICAgIGlmIChuZXh0SW5wdXQubV9leHBl
Y3RlZEZpbGVNb2RpZmljYXRpb25UaW1lICE9IEJsb2JEYXRhSXRlbTo6ZG9Ob3RDaGVja0ZpbGVD
aGFuZ2UpIHsKKyAgICAgICAgICAgIHRpbWVfdCBmaWxlTW9kaWZpY2F0aW9uVGltZTsKKyAgICAg
ICAgICAgIGlmICghZ2V0RmlsZU1vZGlmaWNhdGlvblRpbWUobmV4dElucHV0Lm1fZmlsZW5hbWUs
IGZpbGVNb2RpZmljYXRpb25UaW1lKSB8fCBmaWxlTW9kaWZpY2F0aW9uVGltZSAhPSBzdGF0aWNf
Y2FzdDx0aW1lX3Q+KG5leHRJbnB1dC5tX2V4cGVjdGVkRmlsZU1vZGlmaWNhdGlvblRpbWUpKQor
ICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAg
IGNvbnN0IFN0cmluZyYgcGF0aCA9IG5leHRJbnB1dC5tX3Nob3VsZEdlbmVyYXRlRmlsZSA/IG5l
eHRJbnB1dC5tX2dlbmVyYXRlZEZpbGVuYW1lIDogbmV4dElucHV0Lm1fZmlsZW5hbWU7CisgICAg
ICAgIGZvcm0tPmN1cnJlbnRTdHJlYW0gPSBDRlJlYWRTdHJlYW1DcmVhdGVXaXRoRmlsZSgwLCBw
YXRoQXNVUkwocGF0aCkuZ2V0KCkpOworICAgICAgICBpZiAoIWZvcm0tPmN1cnJlbnRTdHJlYW0p
IHsKKyAgICAgICAgICAgIC8vIFRoZSBmaWxlIG11c3QgaGF2ZSBiZWVuIHJlbW92ZWQgb3IgYmVj
b21lIHVucmVhZGFibGUuCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyNp
ZiBFTkFCTEUoQkxPQikKKyAgICAgICAgaWYgKG5leHRJbnB1dC5tX2ZpbGVTdGFydCA+IDApIHsK
KyAgICAgICAgICAgIFJldGFpblB0cjxDRk51bWJlclJlZj4gcG9zaXRpb24oQWRvcHRDRiwgQ0ZO
dW1iZXJDcmVhdGUoMCwga0NGTnVtYmVyTG9uZ0xvbmdUeXBlLCAmbmV4dElucHV0Lm1fZmlsZVN0
YXJ0KSk7CisgICAgICAgICAgICBDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eShmb3JtLT5jdXJyZW50
U3RyZWFtLCBrQ0ZTdHJlYW1Qcm9wZXJ0eUZpbGVDdXJyZW50T2Zmc2V0LCBwb3NpdGlvbi5nZXQo
KSk7CisgICAgICAgIH0KKyAgICAgICAgZm9ybS0+Y3VycmVudFN0cmVhbVJhbmdlTGVuZ3RoID0g
bmV4dElucHV0Lm1fZmlsZUxlbmd0aDsKKyNlbmRpZgorICAgIH0KKyAgICBmb3JtLT5yZW1haW5p
bmdFbGVtZW50cy5yZW1vdmVMYXN0KCk7CisKKyAgICAvLyBTZXQgdXAgdGhlIGNhbGxiYWNrLgor
ICAgIENGU3RyZWFtQ2xpZW50Q29udGV4dCBjb250ZXh0ID0geyAwLCBmb3JtLCAwLCAwLCAwIH07
CisgICAgQ0ZSZWFkU3RyZWFtU2V0Q2xpZW50KGZvcm0tPmN1cnJlbnRTdHJlYW0sIGtDRlN0cmVh
bUV2ZW50SGFzQnl0ZXNBdmFpbGFibGUgfCBrQ0ZTdHJlYW1FdmVudEVycm9yT2NjdXJyZWQgfCBr
Q0ZTdHJlYW1FdmVudEVuZEVuY291bnRlcmVkLAorICAgICAgICBmb3JtRXZlbnRDYWxsYmFjaywg
JmNvbnRleHQpOworCisgICAgLy8gU2NoZWR1bGUgd2l0aCB0aGUgY3VycmVudCBzZXQgb2YgcnVu
IGxvb3BzLgorICAgIFNjaGVkdWxlUGFpckhhc2hTZXQ6Oml0ZXJhdG9yIGVuZCA9IGZvcm0tPnNj
aGVkdWxlZFJ1bkxvb3BQYWlycy5lbmQoKTsKKyAgICBmb3IgKFNjaGVkdWxlUGFpckhhc2hTZXQ6
Oml0ZXJhdG9yIGl0ID0gZm9ybS0+c2NoZWR1bGVkUnVuTG9vcFBhaXJzLmJlZ2luKCk7IGl0ICE9
IGVuZDsgKytpdCkKKyAgICAgICAgQ0ZSZWFkU3RyZWFtU2NoZWR1bGVXaXRoUnVuTG9vcChmb3Jt
LT5jdXJyZW50U3RyZWFtLCAoKml0KS0+cnVuTG9vcCgpLCAoKml0KS0+bW9kZSgpKTsKKworICAg
IHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBvcGVuTmV4dFN0cmVhbShGb3JtU3RyZWFt
RmllbGRzKiBmb3JtKQoreworICAgIC8vIFNraXAgb3ZlciBhbnkgc3RyZWFtcyB3ZSBjYW4ndCBv
cGVuLgorICAgIGlmICghYWR2YW5jZUN1cnJlbnRTdHJlYW0oZm9ybSkpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICB3aGlsZSAoZm9ybS0+Y3VycmVudFN0cmVhbSAmJiAhQ0ZSZWFkU3RyZWFt
T3Blbihmb3JtLT5jdXJyZW50U3RyZWFtKSkgeworICAgICAgICBpZiAoIWFkdmFuY2VDdXJyZW50
U3RyZWFtKGZvcm0pKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1
cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQqIGZvcm1DcmVhdGUoQ0ZSZWFkU3RyZWFtUmVmIHN0
cmVhbSwgdm9pZCogY29udGV4dCkKK3sKKyAgICBGb3JtQ29udGV4dCogZm9ybUNvbnRleHQgPSBz
dGF0aWNfY2FzdDxGb3JtQ29udGV4dCo+KGNvbnRleHQpOworCisgICAgRm9ybVN0cmVhbUZpZWxk
cyogbmV3SW5mbyA9IG5ldyBGb3JtU3RyZWFtRmllbGRzOworICAgIG5ld0luZm8tPmZvcm1EYXRh
ID0gZm9ybUNvbnRleHQtPmZvcm1EYXRhLnJlbGVhc2UoKTsKKyAgICBuZXdJbmZvLT5jdXJyZW50
U3RyZWFtID0gMDsKKyNpZiBFTkFCTEUoQkxPQikKKyAgICBuZXdJbmZvLT5jdXJyZW50U3RyZWFt
UmFuZ2VMZW5ndGggPSBCbG9iRGF0YUl0ZW06OnRvRW5kT2ZGaWxlOworI2VuZGlmCisgICAgbmV3
SW5mby0+Y3VycmVudERhdGEgPSAwOworICAgIG5ld0luZm8tPmZvcm1TdHJlYW0gPSBzdHJlYW07
IC8vIERvbid0IHJldGFpbi4gVGhhdCB3b3VsZCBjcmVhdGUgYSByZWZlcmVuY2UgY3ljbGUuCisg
ICAgbmV3SW5mby0+c3RyZWFtTGVuZ3RoID0gZm9ybUNvbnRleHQtPnN0cmVhbUxlbmd0aDsKKyAg
ICBuZXdJbmZvLT5ieXRlc1NlbnQgPSAwOworCisgICAgLy8gQXBwZW5kIGluIHJldmVyc2Ugb3Jk
ZXIgc2luY2Ugd2UgcmVtb3ZlIGVsZW1lbnRzIGZyb20gdGhlIGVuZC4KKyAgICBzaXplX3Qgc2l6
ZSA9IG5ld0luZm8tPmZvcm1EYXRhLT5lbGVtZW50cygpLnNpemUoKTsKKyAgICBuZXdJbmZvLT5y
ZW1haW5pbmdFbGVtZW50cy5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KHNpemUpOworICAgIGZvciAo
c2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKQorICAgICAgICBuZXdJbmZvLT5yZW1haW5pbmdF
bGVtZW50cy5hcHBlbmQobmV3SW5mby0+Zm9ybURhdGEtPmVsZW1lbnRzKClbc2l6ZSAtIGkgLSAx
XSk7CisKKyAgICBNdXRleExvY2tlciBsb2NrZXIoc3RyZWFtRmllbGRzTWFwTXV0ZXgoKSk7Cisg
ICAgQVNTRVJUKCFzdHJlYW1GaWVsZHNNYXAoKS5jb250YWlucyhzdHJlYW0pKTsKKyAgICBzdHJl
YW1GaWVsZHNNYXAoKS5hZGQoc3RyZWFtLCBuZXdJbmZvKTsKKworICAgIHJldHVybiBuZXdJbmZv
OworfQorCitzdGF0aWMgdm9pZCBmb3JtRmluaXNoRmluYWxpemF0aW9uT25NYWluVGhyZWFkKHZv
aWQqIGNvbnRleHQpCit7CisgICAgT3duUHRyPEZvcm1TdHJlYW1GaWVsZHM+IGZvcm0gPSBhZG9w
dFB0cihzdGF0aWNfY2FzdDxGb3JtU3RyZWFtRmllbGRzKj4oY29udGV4dCkpOworCisgICAgY2xv
c2VDdXJyZW50U3RyZWFtKGZvcm0uZ2V0KCkpOworfQorCitzdGF0aWMgdm9pZCBmb3JtRmluYWxp
emUoQ0ZSZWFkU3RyZWFtUmVmIHN0cmVhbSwgdm9pZCogY29udGV4dCkKK3sKKyAgICBGb3JtU3Ry
ZWFtRmllbGRzKiBmb3JtID0gc3RhdGljX2Nhc3Q8Rm9ybVN0cmVhbUZpZWxkcyo+KGNvbnRleHQp
OworCisgICAgTXV0ZXhMb2NrZXIgbG9ja2VyKHN0cmVhbUZpZWxkc01hcE11dGV4KCkpOworCisg
ICAgQVNTRVJUKGZvcm0tPmZvcm1TdHJlYW0gPT0gc3RyZWFtKTsKKyAgICBBU1NFUlQoc3RyZWFt
RmllbGRzTWFwKCkuZ2V0KHN0cmVhbSkgPT0gY29udGV4dCk7CisKKyAgICAvLyBEbyB0aGlzIHJp
Z2h0IGF3YXkgYmVjYXVzZSB0aGUgQ0ZSZWFkU3RyZWFtUmVmIGlzIGJlaW5nIGRlYWxsb2NhdGVk
LgorICAgIC8vIFdlIGNhbid0IHdhaXQgdG8gcmVtb3ZlIHRoaXMgZnJvbSB0aGUgbWFwIHVudGls
IHdlIGZpbmlzaCBmaW5hbGl6aW5nCisgICAgLy8gb24gdGhlIG1haW4gdGhyZWFkIGJlY2F1c2Ug
aW4gdGhlb3J5IHRoZSBmcmVlZCBtZW1vcnkgY291bGQgYmUgcmV1c2VkCisgICAgLy8gZm9yIGEg
bmV3IENGUmVhZFN0cmVhbSBiZWZvcmUgdGhhdCBydW5zLgorICAgIHN0cmVhbUZpZWxkc01hcCgp
LnJlbW92ZShzdHJlYW0pOworCisgICAgY2FsbE9uTWFpblRocmVhZChmb3JtRmluaXNoRmluYWxp
emF0aW9uT25NYWluVGhyZWFkLCBmb3JtKTsKK30KKworc3RhdGljIEJvb2xlYW4gZm9ybU9wZW4o
Q0ZSZWFkU3RyZWFtUmVmLCBDRlN0cmVhbUVycm9yKiBlcnJvciwgQm9vbGVhbiogb3BlbkNvbXBs
ZXRlLCB2b2lkKiBjb250ZXh0KQoreworICAgIEZvcm1TdHJlYW1GaWVsZHMqIGZvcm0gPSBzdGF0
aWNfY2FzdDxGb3JtU3RyZWFtRmllbGRzKj4oY29udGV4dCk7CisKKyAgICBib29sIG9wZW5lZCA9
IG9wZW5OZXh0U3RyZWFtKGZvcm0pOworCisgICAgKm9wZW5Db21wbGV0ZSA9IG9wZW5lZDsKKyAg
ICBlcnJvci0+ZXJyb3IgPSBvcGVuZWQgPyAwIDogZm5mRXJyOworICAgIHJldHVybiBvcGVuZWQ7
Cit9CisKK3N0YXRpYyBDRkluZGV4IGZvcm1SZWFkKENGUmVhZFN0cmVhbVJlZiwgVUludDgqIGJ1
ZmZlciwgQ0ZJbmRleCBidWZmZXJMZW5ndGgsIENGU3RyZWFtRXJyb3IqIGVycm9yLCBCb29sZWFu
KiBhdEVPRiwgdm9pZCogY29udGV4dCkKK3sKKyAgICBGb3JtU3RyZWFtRmllbGRzKiBmb3JtID0g
c3RhdGljX2Nhc3Q8Rm9ybVN0cmVhbUZpZWxkcyo+KGNvbnRleHQpOworCisgICAgd2hpbGUgKGZv
cm0tPmN1cnJlbnRTdHJlYW0pIHsKKyAgICAgICAgQ0ZJbmRleCBieXRlc1RvUmVhZCA9IGJ1ZmZl
ckxlbmd0aDsKKyNpZiBFTkFCTEUoQkxPQikKKyAgICAgICAgaWYgKGZvcm0tPmN1cnJlbnRTdHJl
YW1SYW5nZUxlbmd0aCAhPSBCbG9iRGF0YUl0ZW06OnRvRW5kT2ZGaWxlICYmIGZvcm0tPmN1cnJl
bnRTdHJlYW1SYW5nZUxlbmd0aCA8IGJ5dGVzVG9SZWFkKQorICAgICAgICAgICAgYnl0ZXNUb1Jl
YWQgPSBzdGF0aWNfY2FzdDxDRkluZGV4Pihmb3JtLT5jdXJyZW50U3RyZWFtUmFuZ2VMZW5ndGgp
OworI2VuZGlmCisgICAgICAgIENGSW5kZXggYnl0ZXNSZWFkID0gQ0ZSZWFkU3RyZWFtUmVhZChm
b3JtLT5jdXJyZW50U3RyZWFtLCBidWZmZXIsIGJ5dGVzVG9SZWFkKTsKKyAgICAgICAgaWYgKGJ5
dGVzUmVhZCA8IDApIHsKKyAgICAgICAgICAgICplcnJvciA9IENGUmVhZFN0cmVhbUdldEVycm9y
KGZvcm0tPmN1cnJlbnRTdHJlYW0pOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9
CisgICAgICAgIGlmIChieXRlc1JlYWQgPiAwKSB7CisgICAgICAgICAgICBlcnJvci0+ZXJyb3Ig
PSAwOworICAgICAgICAgICAgKmF0RU9GID0gRkFMU0U7CisgICAgICAgICAgICBmb3JtLT5ieXRl
c1NlbnQgKz0gYnl0ZXNSZWFkOworI2lmIEVOQUJMRShCTE9CKQorICAgICAgICAgICAgaWYgKGZv
cm0tPmN1cnJlbnRTdHJlYW1SYW5nZUxlbmd0aCAhPSBCbG9iRGF0YUl0ZW06OnRvRW5kT2ZGaWxl
KQorICAgICAgICAgICAgICAgIGZvcm0tPmN1cnJlbnRTdHJlYW1SYW5nZUxlbmd0aCAtPSBieXRl
c1JlYWQ7CisjZW5kaWYKKworICAgICAgICAgICAgcmV0dXJuIGJ5dGVzUmVhZDsKKyAgICAgICAg
fQorICAgICAgICBvcGVuTmV4dFN0cmVhbShmb3JtKTsKKyAgICB9CisKKyAgICBlcnJvci0+ZXJy
b3IgPSAwOworICAgICphdEVPRiA9IFRSVUU7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBC
b29sZWFuIGZvcm1DYW5SZWFkKENGUmVhZFN0cmVhbVJlZiBzdHJlYW0sIHZvaWQqIGNvbnRleHQp
Cit7CisgICAgRm9ybVN0cmVhbUZpZWxkcyogZm9ybSA9IHN0YXRpY19jYXN0PEZvcm1TdHJlYW1G
aWVsZHMqPihjb250ZXh0KTsKKworICAgIHdoaWxlIChmb3JtLT5jdXJyZW50U3RyZWFtICYmIENG
UmVhZFN0cmVhbUdldFN0YXR1cyhmb3JtLT5jdXJyZW50U3RyZWFtKSA9PSBrQ0ZTdHJlYW1TdGF0
dXNBdEVuZCkKKyAgICAgICAgb3Blbk5leHRTdHJlYW0oZm9ybSk7CisKKyAgICBpZiAoIWZvcm0t
PmN1cnJlbnRTdHJlYW0pIHsKKyAgICAgICAgQ0ZSZWFkU3RyZWFtU2lnbmFsRXZlbnQoc3RyZWFt
LCBrQ0ZTdHJlYW1FdmVudEVuZEVuY291bnRlcmVkLCAwKTsKKyAgICAgICAgcmV0dXJuIEZBTFNF
OworICAgIH0KKyAgICByZXR1cm4gQ0ZSZWFkU3RyZWFtSGFzQnl0ZXNBdmFpbGFibGUoZm9ybS0+
Y3VycmVudFN0cmVhbSk7Cit9CisKK3N0YXRpYyB2b2lkIGZvcm1DbG9zZShDRlJlYWRTdHJlYW1S
ZWYsIHZvaWQqIGNvbnRleHQpCit7CisgICAgRm9ybVN0cmVhbUZpZWxkcyogZm9ybSA9IHN0YXRp
Y19jYXN0PEZvcm1TdHJlYW1GaWVsZHMqPihjb250ZXh0KTsKKworICAgIGNsb3NlQ3VycmVudFN0
cmVhbShmb3JtKTsKK30KKworc3RhdGljIHZvaWQgZm9ybVNjaGVkdWxlKENGUmVhZFN0cmVhbVJl
ZiwgQ0ZSdW5Mb29wUmVmIHJ1bkxvb3AsIENGU3RyaW5nUmVmIHJ1bkxvb3BNb2RlLCB2b2lkKiBj
b250ZXh0KQoreworICAgIEZvcm1TdHJlYW1GaWVsZHMqIGZvcm0gPSBzdGF0aWNfY2FzdDxGb3Jt
U3RyZWFtRmllbGRzKj4oY29udGV4dCk7CisKKyAgICBpZiAoZm9ybS0+Y3VycmVudFN0cmVhbSkK
KyAgICAgICAgQ0ZSZWFkU3RyZWFtU2NoZWR1bGVXaXRoUnVuTG9vcChmb3JtLT5jdXJyZW50U3Ry
ZWFtLCBydW5Mb29wLCBydW5Mb29wTW9kZSk7CisgICAgZm9ybS0+c2NoZWR1bGVkUnVuTG9vcFBh
aXJzLmFkZChTY2hlZHVsZVBhaXI6OmNyZWF0ZShydW5Mb29wLCBydW5Mb29wTW9kZSkpOworfQor
CitzdGF0aWMgdm9pZCBmb3JtVW5zY2hlZHVsZShDRlJlYWRTdHJlYW1SZWYsIENGUnVuTG9vcFJl
ZiBydW5Mb29wLCBDRlN0cmluZ1JlZiBydW5Mb29wTW9kZSwgdm9pZCogY29udGV4dCkKK3sKKyAg
ICBGb3JtU3RyZWFtRmllbGRzKiBmb3JtID0gc3RhdGljX2Nhc3Q8Rm9ybVN0cmVhbUZpZWxkcyo+
KGNvbnRleHQpOworCisgICAgaWYgKGZvcm0tPmN1cnJlbnRTdHJlYW0pCisgICAgICAgIENGUmVh
ZFN0cmVhbVVuc2NoZWR1bGVGcm9tUnVuTG9vcChmb3JtLT5jdXJyZW50U3RyZWFtLCBydW5Mb29w
LCBydW5Mb29wTW9kZSk7CisgICAgZm9ybS0+c2NoZWR1bGVkUnVuTG9vcFBhaXJzLnJlbW92ZShT
Y2hlZHVsZVBhaXI6OmNyZWF0ZShydW5Mb29wLCBydW5Mb29wTW9kZSkpOworfQorCitzdGF0aWMg
dm9pZCBmb3JtRXZlbnRDYWxsYmFjayhDRlJlYWRTdHJlYW1SZWYgc3RyZWFtLCBDRlN0cmVhbUV2
ZW50VHlwZSB0eXBlLCB2b2lkKiBjb250ZXh0KQoreworICAgIEZvcm1TdHJlYW1GaWVsZHMqIGZv
cm0gPSBzdGF0aWNfY2FzdDxGb3JtU3RyZWFtRmllbGRzKj4oY29udGV4dCk7CiAKLSAgICBpZiAo
Y291bnQgPT0gMCkKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIGtDRlN0cmVhbUV2ZW50
SGFzQnl0ZXNBdmFpbGFibGU6CisgICAgICAgIENGUmVhZFN0cmVhbVNpZ25hbEV2ZW50KGZvcm0t
PmZvcm1TdHJlYW0sIGtDRlN0cmVhbUV2ZW50SGFzQnl0ZXNBdmFpbGFibGUsIDApOworICAgICAg
ICBicmVhazsKKyAgICBjYXNlIGtDRlN0cmVhbUV2ZW50RXJyb3JPY2N1cnJlZDogeworICAgICAg
ICBDRlN0cmVhbUVycm9yIHJlYWRTdHJlYW1FcnJvciA9IENGUmVhZFN0cmVhbUdldEVycm9yKHN0
cmVhbSk7CisgICAgICAgIENGUmVhZFN0cmVhbVNpZ25hbEV2ZW50KGZvcm0tPmZvcm1TdHJlYW0s
IGtDRlN0cmVhbUV2ZW50RXJyb3JPY2N1cnJlZCwgJnJlYWRTdHJlYW1FcnJvcik7CisgICAgICAg
IGJyZWFrOworICAgIH0KKyAgICBjYXNlIGtDRlN0cmVhbUV2ZW50RW5kRW5jb3VudGVyZWQ6Cisg
ICAgICAgIG9wZW5OZXh0U3RyZWFtKGZvcm0pOworICAgICAgICBpZiAoIWZvcm0tPmN1cnJlbnRT
dHJlYW0pCisgICAgICAgICAgICBDRlJlYWRTdHJlYW1TaWduYWxFdmVudChmb3JtLT5mb3JtU3Ry
ZWFtLCBrQ0ZTdHJlYW1FdmVudEVuZEVuY291bnRlcmVkLCAwKTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgY2FzZSBrQ0ZTdHJlYW1FdmVudE5vbmU6CisgICAgICAgIExPR19FUlJPUigidW5leHBlY3Rl
ZCBrQ0ZTdHJlYW1FdmVudE5vbmUiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBrQ0ZTdHJl
YW1FdmVudE9wZW5Db21wbGV0ZWQ6CisgICAgICAgIExPR19FUlJPUigidW5leHBlY3RlZCBrQ0ZT
dHJlYW1FdmVudE9wZW5Db21wbGV0ZWQiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBrQ0ZT
dHJlYW1FdmVudENhbkFjY2VwdEJ5dGVzOgorICAgICAgICBMT0dfRVJST1IoInVuZXhwZWN0ZWQg
a0NGU3RyZWFtRXZlbnRDYW5BY2NlcHRCeXRlcyIpOworICAgICAgICBicmVhazsKKyAgICB9Cit9
CisKK3ZvaWQgc2V0SFRUUEJvZHkoQ0ZNdXRhYmxlVVJMUmVxdWVzdFJlZiByZXF1ZXN0LCBQYXNz
UmVmUHRyPEZvcm1EYXRhPiBwcnBGb3JtRGF0YSkKK3sKKyAgICBSZWZQdHI8Rm9ybURhdGE+IGZv
cm1EYXRhID0gcHJwRm9ybURhdGE7CisKKyAgICBpZiAoIWZvcm1EYXRhKQogICAgICAgICByZXR1
cm47CisgICAgICAgIAorICAgIHNpemVfdCBjb3VudCA9IGZvcm1EYXRhLT5lbGVtZW50cygpLnNp
emUoKTsKIAogICAgIC8vIEhhbmRsZSB0aGUgY29tbW9uIHNwZWNpYWwgY2FzZSBvZiBvbmUgcGll
Y2Ugb2YgZm9ybSBkYXRhLCB3aXRoIG5vIGZpbGVzLgotICAgIGlmIChjb3VudCA9PSAxKSB7Cisg
ICAgaWYgKGNvdW50ID09IDEgJiYgIWZvcm1EYXRhLT5hbHdheXNTdHJlYW0oKSkgewogICAgICAg
ICBjb25zdCBGb3JtRGF0YUVsZW1lbnQmIGVsZW1lbnQgPSBmb3JtRGF0YS0+ZWxlbWVudHMoKVsw
XTsKICAgICAgICAgaWYgKGVsZW1lbnQubV90eXBlID09IEZvcm1EYXRhRWxlbWVudDo6ZGF0YSkg
ewotICAgICAgICAgICAgQ0ZEYXRhUmVmIGRhdGEgPSBDRkRhdGFDcmVhdGUoMCwgcmVpbnRlcnBy
ZXRfY2FzdDxjb25zdCBVSW50OCAqPihlbGVtZW50Lm1fZGF0YS5kYXRhKCkpLCBlbGVtZW50Lm1f
ZGF0YS5zaXplKCkpOwotICAgICAgICAgICAgQ0ZVUkxSZXF1ZXN0U2V0SFRUUFJlcXVlc3RCb2R5
KHJlcXVlc3QsIGRhdGEpOwotICAgICAgICAgICAgQ0ZSZWxlYXNlKGRhdGEpOworICAgICAgICAg
ICAgUmV0YWluUHRyPENGRGF0YVJlZj4gZGF0YSA9IGFkb3B0Q0YoQ0ZEYXRhQ3JlYXRlKDAsIHJl
aW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVUludDggKj4oZWxlbWVudC5tX2RhdGEuZGF0YSgpKSwgZWxl
bWVudC5tX2RhdGEuc2l6ZSgpKSk7CisgICAgICAgICAgICBDRlVSTFJlcXVlc3RTZXRIVFRQUmVx
dWVzdEJvZHkocmVxdWVzdCwgZGF0YS5nZXQoKSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAg
ICAgIH0KICAgICB9CiAKLSAgICBSZXRhaW5QdHI8Q0ZNdXRhYmxlQXJyYXlSZWY+IGFycmF5KEFk
b3B0Q0YsIENGQXJyYXlDcmVhdGVNdXRhYmxlKDAsIDAsICZrQ0ZUeXBlQXJyYXlDYWxsQmFja3Mp
KTsKKyNpZiBFTkFCTEUoQkxPQikKKyAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhIGJsb2IgaW4g
dGhlIGZvcm0gZGF0YS4KKyAgICBib29sIGhhc0Jsb2IgPSBmYWxzZTsKKyAgICBmb3IgKHNpemVf
dCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgICAgY29uc3QgRm9ybURhdGFFbGVtZW50
JiBlbGVtZW50ID0gZm9ybURhdGEtPmVsZW1lbnRzKClbaV07CisgICAgICAgIGlmIChlbGVtZW50
Lm1fdHlwZSA9PSBGb3JtRGF0YUVsZW1lbnQ6OmVuY29kZWRCbG9iKSB7CisgICAgICAgICAgICBo
YXNCbG9iID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisg
ICAgLy8gSWYgeWVzLCB3ZSBoYXZlIHRvIHJlc29sdmUgYWxsIHRoZSBibG9iIHJlZmVyZW5jZXMg
YW5kIHJlZ2VuZXJhdGUgdGhlIGZvcm0gZGF0YSB3aXRoIG9ubHkgZGF0YSBhbmQgZmlsZSB0eXBl
cy4KKyAgICBpZiAoaGFzQmxvYikgeworICAgICAgICBSZWZQdHI8Rm9ybURhdGE+IG5ld0Zvcm1E
YXRhID0gRm9ybURhdGE6OmNyZWF0ZSgpOworICAgICAgICBuZXdGb3JtRGF0YS0+c2V0QWx3YXlz
U3RyZWFtKGZvcm1EYXRhLT5hbHdheXNTdHJlYW0oKSk7CisgICAgICAgIG5ld0Zvcm1EYXRhLT5z
ZXRJZGVudGlmaWVyKGZvcm1EYXRhLT5pZGVudGlmaWVyKCkpOworICAgICAgICBmb3IgKHNpemVf
dCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIGNvbnN0IEZvcm1EYXRhRWxl
bWVudCYgZWxlbWVudCA9IGZvcm1EYXRhLT5lbGVtZW50cygpW2ldOworICAgICAgICAgICAgaWYg
KGVsZW1lbnQubV90eXBlID09IEZvcm1EYXRhRWxlbWVudDo6ZGF0YSkKKyAgICAgICAgICAgICAg
ICBuZXdGb3JtRGF0YS0+YXBwZW5kRGF0YShlbGVtZW50Lm1fZGF0YS5kYXRhKCksIGVsZW1lbnQu
bV9kYXRhLnNpemUoKSk7CisgICAgICAgICAgICBlbHNlIGlmIChlbGVtZW50Lm1fdHlwZSA9PSBG
b3JtRGF0YUVsZW1lbnQ6OmVuY29kZWRGaWxlKQorICAgICAgICAgICAgICAgIG5ld0Zvcm1EYXRh
LT5hcHBlbmRGaWxlKGVsZW1lbnQubV9maWxlbmFtZSwgZWxlbWVudC5tX3Nob3VsZEdlbmVyYXRl
RmlsZSk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBBU1NFUlQoZWxlbWVu
dC5tX3R5cGUgPT0gRm9ybURhdGFFbGVtZW50OjplbmNvZGVkQmxvYik7CisgICAgICAgICAgICAg
ICAgUmVmUHRyPEJsb2JTdG9yYWdlRGF0YT4gYmxvYkRhdGEgPSBzdGF0aWNfY2FzdDxCbG9iUmVn
aXN0cnlJbXBsJj4oYmxvYlJlZ2lzdHJ5KCkpLmdldEJsb2JEYXRhRnJvbVVSTChLVVJMKFBhcnNl
ZFVSTFN0cmluZywgZWxlbWVudC5tX2Jsb2JVUkwpKTsKKyAgICAgICAgICAgICAgICBpZiAoYmxv
YkRhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBibG9i
RGF0YS0+aXRlbXMoKS5zaXplKCk7ICsraikgeworICAgICAgICAgICAgICAgICAgICAgICAgY29u
c3QgQmxvYkRhdGFJdGVtJiBibG9iSXRlbSA9IGJsb2JEYXRhLT5pdGVtcygpW2pdOworICAgICAg
ICAgICAgICAgICAgICAgICAgaWYgKGJsb2JJdGVtLnR5cGUgPT0gQmxvYkRhdGFJdGVtOjpEYXRh
KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Zvcm1EYXRhLT5hcHBlbmREYXRhKGJs
b2JJdGVtLmRhdGEtPmRhdGEoKSArIHN0YXRpY19jYXN0PGludD4oYmxvYkl0ZW0ub2Zmc2V0KSwg
c3RhdGljX2Nhc3Q8aW50PihibG9iSXRlbS5sZW5ndGgpKTsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTU0VSVChibG9iSXRlbS50
eXBlID09IEJsb2JEYXRhSXRlbTo6RmlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
bmV3Rm9ybURhdGEtPmFwcGVuZEZpbGVSYW5nZShibG9iSXRlbS5wYXRoLCBibG9iSXRlbS5vZmZz
ZXQsIGJsb2JJdGVtLmxlbmd0aCwgYmxvYkl0ZW0uZXhwZWN0ZWRNb2RpZmljYXRpb25UaW1lKTsK
KyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3JtRGF0YSA9
IG5ld0Zvcm1EYXRhLnJlbGVhc2UoKTsKKyAgICAgICAgY291bnQgPSBmb3JtRGF0YS0+ZWxlbWVu
dHMoKS5zaXplKCk7CisgICAgfQorI2VuZGlmCiAKKyAgICAvLyBQcmVjb21wdXRlIHRoZSBjb250
ZW50IGxlbmd0aCBzbyBOU1VSTENvbm5lY3Rpb24gZG9lc24ndCB1c2UgY2h1bmtlZCBtb2RlLgor
ICAgIGxvbmcgbG9uZyBsZW5ndGggPSAwOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291
bnQ7ICsraSkgewogICAgICAgICBjb25zdCBGb3JtRGF0YUVsZW1lbnQmIGVsZW1lbnQgPSBmb3Jt
RGF0YS0+ZWxlbWVudHMoKVtpXTsKLSAgICAgICAgaWYgKGVsZW1lbnQubV90eXBlID09IEZvcm1E
YXRhRWxlbWVudDo6ZGF0YSkgewotICAgICAgICAgICAgUmV0YWluUHRyPENGRGF0YVJlZj4gZGF0
YShBZG9wdENGLCBDRkRhdGFDcmVhdGUoMCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBVSW50OCo+
KGVsZW1lbnQubV9kYXRhLmRhdGEoKSksIGVsZW1lbnQubV9kYXRhLnNpemUoKSkpOwotICAgICAg
ICAgICAgQ0ZBcnJheUFwcGVuZFZhbHVlKGFycmF5LmdldCgpLCBkYXRhLmdldCgpKTsKLSAgICAg
ICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFJldGFpblB0cjxDRlN0cmluZ1JlZj4gZmlsZW5hbWUo
QWRvcHRDRiwgZWxlbWVudC5tX2ZpbGVuYW1lLmNyZWF0ZUNGU3RyaW5nKCkpOwotICAgICAgICAg
ICAgQ0ZBcnJheUFwcGVuZFZhbHVlKGFycmF5LmdldCgpLCBmaWxlbmFtZS5nZXQoKSk7CisgICAg
ICAgIGlmIChlbGVtZW50Lm1fdHlwZSA9PSBGb3JtRGF0YUVsZW1lbnQ6OmRhdGEpCisgICAgICAg
ICAgICBsZW5ndGggKz0gZWxlbWVudC5tX2RhdGEuc2l6ZSgpOworICAgICAgICBlbHNlIHsKKyNp
ZiBFTkFCTEUoQkxPQikKKyAgICAgICAgICAgIC8vIElmIHdlJ3JlIHNlbmRpbmcgdGhlIGZpbGUg
cmFuZ2UsIHVzZSB0aGUgZXhpc3RpbmcgcmFuZ2UgbGVuZ3RoIGZvciBub3cuIFdlIHdpbGwgZGV0
ZWN0IGlmIHRoZSBmaWxlIGhhcyBiZWVuIGNoYW5nZWQgcmlnaHQgYmVmb3JlIHdlIHJlYWQgdGhl
IGZpbGUgYW5kIGFib3J0IHRoZSBvcGVyYXRpb24gaWYgbmVjZXNzYXJ5LgorICAgICAgICAgICAg
aWYgKGVsZW1lbnQubV9maWxlTGVuZ3RoICE9IEJsb2JEYXRhSXRlbTo6dG9FbmRPZkZpbGUpIHsK
KyAgICAgICAgICAgICAgICBsZW5ndGggKz0gZWxlbWVudC5tX2ZpbGVMZW5ndGg7CisgICAgICAg
ICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIGxv
bmcgbG9uZyBmaWxlU2l6ZTsKKyAgICAgICAgICAgIGlmIChnZXRGaWxlU2l6ZShlbGVtZW50Lm1f
c2hvdWxkR2VuZXJhdGVGaWxlID8gZWxlbWVudC5tX2dlbmVyYXRlZEZpbGVuYW1lIDogZWxlbWVu
dC5tX2ZpbGVuYW1lLCBmaWxlU2l6ZSkpCisgICAgICAgICAgICAgICAgbGVuZ3RoICs9IGZpbGVT
aXplOwogICAgICAgICB9CiAgICAgfQogCi0gICAgd2tDRlVSTFJlcXVlc3RTZXRIVFRQUmVxdWVz
dEJvZHlQYXJ0cyhyZXF1ZXN0LCBhcnJheS5nZXQoKSk7CisgICAgLy8gU2V0IHRoZSBsZW5ndGgu
CisgICAgUmV0YWluUHRyPENGU3RyaW5nUmVmPiBsZW5ndGhTdHJpbmcgPSBhZG9wdENGKENGU3Ry
aW5nQ3JlYXRlV2l0aEZvcm1hdCgwLCAwLCBDRlNUUigiJWxsZCIpLCBsZW5ndGgpKTsKKyAgICBD
RlVSTFJlcXVlc3RTZXRIVFRQSGVhZGVyRmllbGRWYWx1ZShyZXF1ZXN0LCBDRlNUUigiQ29udGVu
dC1MZW5ndGgiKSwgbGVuZ3RoU3RyaW5nLmdldCgpKTsKKworICAgIC8vIENyZWF0ZSBhbmQgc2V0
IHRoZSBzdHJlYW0uCisKKyAgICAvLyBQYXNzIHRoZSBsZW5ndGggYWxvbmcgd2l0aCB0aGUgZm9y
bURhdGEgc28gaXQgZG9lcyBub3QgaGF2ZSB0byBiZSByZWNvbXB1dGVkLgorICAgIEZvcm1Db250
ZXh0IGZvcm1Db250ZXh0ID0geyBmb3JtRGF0YS5yZWxlYXNlKCksIGxlbmd0aCB9OworCisgICAg
Q0ZSZWFkU3RyZWFtQ2FsbEJhY2tzVjEgY2FsbEJhY2tzID0geyAxLCBmb3JtQ3JlYXRlLCBmb3Jt
RmluYWxpemUsIDAsIGZvcm1PcGVuLCAwLCBmb3JtUmVhZCwgMCwgZm9ybUNhblJlYWQsIGZvcm1D
bG9zZSwgMCwgMCwgMCwgZm9ybVNjaGVkdWxlLCBmb3JtVW5zY2hlZHVsZQorICAgIH07CisgICAg
UmV0YWluUHRyPENGUmVhZFN0cmVhbVJlZj4gc3RyZWFtID0gYWRvcHRDRihDRlJlYWRTdHJlYW1D
cmVhdGUoMCwgc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCo+KCZjYWxsQmFja3MpLCAmZm9ybUNvbnRl
eHQpKTsKKworICAgIENGVVJMUmVxdWVzdFNldEhUVFBSZXF1ZXN0Qm9keVN0cmVhbShyZXF1ZXN0
LCBzdHJlYW0uZ2V0KCkpOwogfQogCi1QYXNzUmVmUHRyPEZvcm1EYXRhPiBodHRwQm9keUZyb21S
ZXF1ZXN0KENGVVJMUmVxdWVzdFJlZiByZXF1ZXN0KQorRm9ybURhdGEqIGh0dHBCb2R5RnJvbVN0
cmVhbShDRlJlYWRTdHJlYW1SZWYgc3RyZWFtKQogewotICAgIFJldGFpblB0cjxDRkRhdGFSZWY+
IGJvZHlEYXRhKEFkb3B0Q0YsIENGVVJMUmVxdWVzdENvcHlIVFRQUmVxdWVzdEJvZHkocmVxdWVz
dCkpOwotICAgIGlmIChib2R5RGF0YSkKLSAgICAgICAgcmV0dXJuIEZvcm1EYXRhOjpjcmVhdGUo
Q0ZEYXRhR2V0Qnl0ZVB0cihib2R5RGF0YS5nZXQoKSksIENGRGF0YUdldExlbmd0aChib2R5RGF0
YS5nZXQoKSkpOwotCi0gICAgUmV0YWluUHRyPENGQXJyYXlSZWY+IGJvZHlQYXJ0cyhBZG9wdENG
LCB3a0NGVVJMUmVxdWVzdENvcHlIVFRQUmVxdWVzdEJvZHlQYXJ0cyhyZXF1ZXN0KSk7Ci0gICAg
aWYgKGJvZHlQYXJ0cykgewotICAgICAgICBSZWZQdHI8Rm9ybURhdGE+IGZvcm1EYXRhID0gRm9y
bURhdGE6OmNyZWF0ZSgpOwotCi0gICAgICAgIENGSW5kZXggY291bnQgPSBDRkFycmF5R2V0Q291
bnQoYm9keVBhcnRzLmdldCgpKTsKLSAgICAgICAgZm9yIChDRkluZGV4IGkgPSAwOyBpIDwgY291
bnQ7IGkrKykgewotICAgICAgICAgICAgQ0ZUeXBlUmVmIGJvZHlQYXJ0ID0gQ0ZBcnJheUdldFZh
bHVlQXRJbmRleChib2R5UGFydHMuZ2V0KCksIGkpOwotICAgICAgICAgICAgQ0ZUeXBlSUQgdHlw
ZUlEID0gQ0ZHZXRUeXBlSUQoYm9keVBhcnQpOwotICAgICAgICAgICAgaWYgKHR5cGVJRCA9PSBD
RlN0cmluZ0dldFR5cGVJRCgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0g
KENGU3RyaW5nUmVmKWJvZHlQYXJ0OwotICAgICAgICAgICAgICAgIGZvcm1EYXRhLT5hcHBlbmRG
aWxlKGZpbGVuYW1lKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZUlEID09IENGRGF0YUdl
dFR5cGVJRCgpKSB7Ci0gICAgICAgICAgICAgICAgQ0ZEYXRhUmVmIGRhdGEgPSAoQ0ZEYXRhUmVm
KWJvZHlQYXJ0OwotICAgICAgICAgICAgICAgIGZvcm1EYXRhLT5hcHBlbmREYXRhKENGRGF0YUdl
dEJ5dGVQdHIoZGF0YSksIENGRGF0YUdldExlbmd0aChkYXRhKSk7Ci0gICAgICAgICAgICB9IGVs
c2UKLSAgICAgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgfQotICAg
ICAgICByZXR1cm4gZm9ybURhdGEucmVsZWFzZSgpOwotICAgIH0KKyAgICBpZiAoIXN0cmVhbSkK
KyAgICAgICAgcmV0dXJuIDA7CiAKLSAgICAvLyBGSVhNRTogd2hhdCB0byBkbyBhYm91dCBhcmJp
dHJhcnkgYm9keSBzdHJlYW1zPwotICAgIHJldHVybiAwOworICAgIE11dGV4TG9ja2VyIGxvY2tl
cihzdHJlYW1GaWVsZHNNYXBNdXRleCgpKTsKKyAgICBGb3JtU3RyZWFtRmllbGRzKiBmb3JtU3Ry
ZWFtID0gc3RyZWFtRmllbGRzTWFwKCkuZ2V0KHN0cmVhbSk7CisgICAgaWYgKCFmb3JtU3RyZWFt
KQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gZm9ybVN0cmVhbS0+Zm9ybURhdGEuZ2V0
KCk7CiB9CiAKLX0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKK1Bhc3NSZWZQdHI8Rm9ybURhdGE+IGh0
dHBCb2R5RnJvbVJlcXVlc3QoQ0ZVUkxSZXF1ZXN0UmVmIHJlcXVlc3QpCit7CisgICAgUmV0YWlu
UHRyPENGUmVhZFN0cmVhbVJlZj4gYm9keVN0cmVhbSA9IGFkb3B0Q0YoQ0ZVUkxSZXF1ZXN0Q29w
eUhUVFBSZXF1ZXN0Qm9keVN0cmVhbShyZXF1ZXN0KSk7CisgICAgcmV0dXJuIGh0dHBCb2R5RnJv
bVN0cmVhbShib2R5U3RyZWFtLmdldCgpKTsKK30KIAotI2VuZGlmIC8vIFVTRShDRk5FVFdPUksp
Cit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9u
ZXR3b3JrL2NmL0Zvcm1EYXRhU3RyZWFtQ0ZOZXQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9uZXR3b3JrL2NmL0Zvcm1EYXRhU3RyZWFtQ0ZOZXQuaAkocmV2aXNpb24g
MTEyMTY2KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jZi9Gb3JtRGF0YVN0
cmVhbUNGTmV0LmgJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJp
Z2h0IChDKSAyMDA1LCAyMDA2LCAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDcsIDIwMTIgQXBwbGUgSW5jLiAgQWxs
IHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtMjks
MjAgKzI5LDIwIEBACiAjaWZuZGVmIEZvcm1EYXRhU3RyZWFtQ0ZOZXRfaAogI2RlZmluZSBGb3Jt
RGF0YVN0cmVhbUNGTmV0X2gKIAotI2lmIFVTRShDRk5FVFdPUkspCi0KLSNpbmNsdWRlIDxDb3Jl
Rm91bmRhdGlvbi9Db3JlRm91bmRhdGlvbi5oPgogI2luY2x1ZGUgPHd0Zi9Gb3J3YXJkLmg+CiAK
IHR5cGVkZWYgc3RydWN0IF9DRlVSTFJlcXVlc3QqIENGTXV0YWJsZVVSTFJlcXVlc3RSZWY7CiB0
eXBlZGVmIGNvbnN0IHN0cnVjdCBfQ0ZVUkxSZXF1ZXN0KiBDRlVSTFJlcXVlc3RSZWY7CiAKIG5h
bWVzcGFjZSBXZWJDb3JlIHsKLSAgICBjbGFzcyBGb3JtRGF0YTsKLSAgICB2b2lkIHNldEhUVFBC
b2R5KENGTXV0YWJsZVVSTFJlcXVlc3RSZWYsIFBhc3NSZWZQdHI8Rm9ybURhdGE+KTsKLSAgICBQ
YXNzUmVmUHRyPEZvcm1EYXRhPiBodHRwQm9keUZyb21SZXF1ZXN0KENGVVJMUmVxdWVzdFJlZik7
Ci19CiAKLSNlbmRpZiAvLyBVU0UoQ0ZORVRXT1JLKQorY2xhc3MgRm9ybURhdGE7CisKK3ZvaWQg
c2V0SFRUUEJvZHkoQ0ZNdXRhYmxlVVJMUmVxdWVzdFJlZiwgUGFzc1JlZlB0cjxGb3JtRGF0YT4p
OworUGFzc1JlZlB0cjxGb3JtRGF0YT4gaHR0cEJvZHlGcm9tUmVxdWVzdChDRlVSTFJlcXVlc3RS
ZWYpOworCitGb3JtRGF0YSogaHR0cEJvZHlGcm9tU3RyZWFtKENGUmVhZFN0cmVhbVJlZik7CisK
K30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKIAogI2VuZGlmIC8vIEZvcm1EYXRhU3RyZWFtQ0ZOZXRf
aApJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9tYWMvRm9ybURhdGFTdHJl
YW1NYWMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL21h
Yy9Gb3JtRGF0YVN0cmVhbU1hYy5oCShyZXZpc2lvbiAxMTIxNjYpCisrKyBTb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9uZXR3b3JrL21hYy9Gb3JtRGF0YVN0cmVhbU1hYy5oCSh3b3JraW5nIGNvcHkp
CkBAIC0zMSw4ICszMSw5IEBACiAKICNpZiAhVVNFKENGTkVUV09SSykKIAotI2luY2x1ZGUgIkZv
cm1EYXRhLmgiCisjaW5jbHVkZSA8d3RmL0ZvcndhcmQuaD4KIAorQGNsYXNzIE5TSW5wdXRTdHJl
YW07CiBAY2xhc3MgTlNNdXRhYmxlVVJMUmVxdWVzdDsKIAogbmFtZXNwYWNlIFdlYkNvcmUgewpJ
bmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9tYWMvRm9ybURhdGFTdHJlYW1N
YWMubW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9tYWMv
Rm9ybURhdGFTdHJlYW1NYWMubW0JKHJldmlzaW9uIDExMjMwMikKKysrIFNvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL25ldHdvcmsvbWFjL0Zvcm1EYXRhU3RyZWFtTWFjLm1tCSh3b3JraW5nIGNvcHkp
CkBAIC0zMSw0MTUgKzMxLDI0IEBACiAKICNpZiAhVVNFKENGTkVUV09SSykKIAotI2ltcG9ydCAi
QmxvYlJlZ2lzdHJ5SW1wbC5oIgotI2ltcG9ydCAiRmlsZVN5c3RlbS5oIgogI2ltcG9ydCAiRm9y
bURhdGEuaCIKLSNpbXBvcnQgIlNjaGVkdWxlUGFpci5oIgotI2ltcG9ydCAiV2ViQ29yZVN5c3Rl
bUludGVyZmFjZS5oIgotI2ltcG9ydCA8c3lzL3N0YXQuaD4KLSNpbXBvcnQgPHN5cy90eXBlcy5o
PgotI2ltcG9ydCA8d3RmL0Fzc2VydGlvbnMuaD4KLSNpbXBvcnQgPHd0Zi9NYWluVGhyZWFkLmg+
Ci0jaW1wb3J0IDx3dGYvU3RkTGliRXh0cmFzLmg+Ci0jaW1wb3J0IDx3dGYvVGhyZWFkaW5nLmg+
CisjaW1wb3J0ICJGb3JtRGF0YVN0cmVhbUNGTmV0LmgiCisjaW1wb3J0IDx3dGYvUGFzc1JlZlB0
ci5oPgogCi0jaWYgUExBVEZPUk0oSU9TKQotI2ltcG9ydCA8TWFjRXJyb3JzLmg+Ci0jZWxzZQot
I2ltcG9ydCA8Q29yZVNlcnZpY2VzL0NvcmVTZXJ2aWNlcy5oPgotI2VuZGlmCitAaW50ZXJmYWNl
IE5TVVJMUmVxdWVzdCAoV2ViTlNVUkxSZXF1ZXN0RGV0YWlscykKKy0gKENGVVJMUmVxdWVzdFJl
ZilfQ0ZVUkxSZXF1ZXN0OworQGVuZAogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLXN0YXRpYyBN
dXRleCYgc3RyZWFtRmllbGRzTWFwTXV0ZXgoKQotewotICAgIERFRklORV9TVEFUSUNfTE9DQUwo
TXV0ZXgsIHN0YXRpY011dGV4LCAoKSk7Ci0gICAgcmV0dXJuIHN0YXRpY011dGV4OwotfQotCi1z
dGF0aWMgdm9pZCBmb3JtRXZlbnRDYWxsYmFjayhDRlJlYWRTdHJlYW1SZWYgc3RyZWFtLCBDRlN0
cmVhbUV2ZW50VHlwZSB0eXBlLCB2b2lkKiBjb250ZXh0KTsKLQotc3RydWN0IEZvcm1Db250ZXh0
IHsKLSAgICBSZWZQdHI8Rm9ybURhdGE+IGZvcm1EYXRhOwotICAgIHVuc2lnbmVkIGxvbmcgbG9u
ZyBzdHJlYW1MZW5ndGg7Ci19OwotCi1zdHJ1Y3QgRm9ybVN0cmVhbUZpZWxkcyB7Ci0gICAgUmVm
UHRyPEZvcm1EYXRhPiBmb3JtRGF0YTsKLSAgICBTY2hlZHVsZVBhaXJIYXNoU2V0IHNjaGVkdWxl
ZFJ1bkxvb3BQYWlyczsKLSAgICBWZWN0b3I8Rm9ybURhdGFFbGVtZW50PiByZW1haW5pbmdFbGVt
ZW50czsgLy8gaW4gcmV2ZXJzZSBvcmRlcgotICAgIENGUmVhZFN0cmVhbVJlZiBjdXJyZW50U3Ry
ZWFtOwotI2lmIEVOQUJMRShCTE9CKQotICAgIGxvbmcgbG9uZyBjdXJyZW50U3RyZWFtUmFuZ2VM
ZW5ndGg7Ci0jZW5kaWYKLSAgICBjaGFyKiBjdXJyZW50RGF0YTsKLSAgICBDRlJlYWRTdHJlYW1S
ZWYgZm9ybVN0cmVhbTsKLSAgICB1bnNpZ25lZCBsb25nIGxvbmcgc3RyZWFtTGVuZ3RoOwotICAg
IHVuc2lnbmVkIGxvbmcgbG9uZyBieXRlc1NlbnQ7Ci19OwotCi10eXBlZGVmIEhhc2hNYXA8Q0ZS
ZWFkU3RyZWFtUmVmLCBGb3JtU3RyZWFtRmllbGRzKj4gU3RyZWFtRmllbGRzTWFwOwotc3RhdGlj
IFN0cmVhbUZpZWxkc01hcCYgc3RyZWFtRmllbGRzTWFwKCkKLXsKLSAgICBERUZJTkVfU1RBVElD
X0xPQ0FMKFN0cmVhbUZpZWxkc01hcCwgc3RyZWFtRmllbGRzTWFwLCAoKSk7Ci0gICAgcmV0dXJu
IHN0cmVhbUZpZWxkc01hcDsKLX0KLQotc3RhdGljIHZvaWQgY2xvc2VDdXJyZW50U3RyZWFtKEZv
cm1TdHJlYW1GaWVsZHMgKmZvcm0pCi17Ci0gICAgaWYgKGZvcm0tPmN1cnJlbnRTdHJlYW0pIHsK
LSAgICAgICAgQ0ZSZWFkU3RyZWFtQ2xvc2UoZm9ybS0+Y3VycmVudFN0cmVhbSk7Ci0gICAgICAg
IENGUmVhZFN0cmVhbVNldENsaWVudChmb3JtLT5jdXJyZW50U3RyZWFtLCBrQ0ZTdHJlYW1FdmVu
dE5vbmUsIE5VTEwsIE5VTEwpOwotICAgICAgICBDRlJlbGVhc2UoZm9ybS0+Y3VycmVudFN0cmVh
bSk7Ci0gICAgICAgIGZvcm0tPmN1cnJlbnRTdHJlYW0gPSBOVUxMOwotI2lmIEVOQUJMRShCTE9C
KQotICAgICAgICBmb3JtLT5jdXJyZW50U3RyZWFtUmFuZ2VMZW5ndGggPSBCbG9iRGF0YUl0ZW06
OnRvRW5kT2ZGaWxlOwotI2VuZGlmCi0gICAgfQotICAgIGlmIChmb3JtLT5jdXJyZW50RGF0YSkg
ewotICAgICAgICBmYXN0RnJlZShmb3JtLT5jdXJyZW50RGF0YSk7Ci0gICAgICAgIGZvcm0tPmN1
cnJlbnREYXRhID0gMDsKLSAgICB9Ci19Ci0KLS8vIFJldHVybiBmYWxzZSBpZiB3ZSBjYW5ub3Qg
YWR2YW5jZSB0aGUgc3RyZWFtLiBDdXJyZW50bHkgdGhlIG9ubHkgcG9zc2libGUgZmFpbHVyZSBp
cyB0aGF0IHRoZSB1bmRlcmx5aW5nIGZpbGUgaGFzIGJlZW4gcmVtb3ZlZCBvciBjaGFuZ2VkIHNp
bmNlIEZpbGUuc2xpY2UuCi1zdGF0aWMgYm9vbCBhZHZhbmNlQ3VycmVudFN0cmVhbShGb3JtU3Ry
ZWFtRmllbGRzKiBmb3JtKQotewotICAgIGNsb3NlQ3VycmVudFN0cmVhbShmb3JtKTsKLQotICAg
IGlmIChmb3JtLT5yZW1haW5pbmdFbGVtZW50cy5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiB0
cnVlOwotCi0gICAgLy8gQ3JlYXRlIHRoZSBuZXcgc3RyZWFtLgotICAgIEZvcm1EYXRhRWxlbWVu
dCYgbmV4dElucHV0ID0gZm9ybS0+cmVtYWluaW5nRWxlbWVudHMubGFzdCgpOwotCi0gICAgaWYg
KG5leHRJbnB1dC5tX3R5cGUgPT0gRm9ybURhdGFFbGVtZW50OjpkYXRhKSB7Ci0gICAgICAgIHNp
emVfdCBzaXplID0gbmV4dElucHV0Lm1fZGF0YS5zaXplKCk7Ci0gICAgICAgIGNoYXIqIGRhdGEg
PSBuZXh0SW5wdXQubV9kYXRhLnJlbGVhc2VCdWZmZXIoKTsKLSAgICAgICAgZm9ybS0+Y3VycmVu
dFN0cmVhbSA9IENGUmVhZFN0cmVhbUNyZWF0ZVdpdGhCeXRlc05vQ29weSgwLCByZWludGVycHJl
dF9jYXN0PGNvbnN0IFVJbnQ4Kj4oZGF0YSksIHNpemUsIGtDRkFsbG9jYXRvck51bGwpOwotICAg
ICAgICBmb3JtLT5jdXJyZW50RGF0YSA9IGRhdGE7Ci0gICAgfSBlbHNlIHsKLSNpZiBFTkFCTEUo
QkxPQikKLSAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGZpbGUgaGFzIGJlZW4gY2hhbmdlZCBvciBu
b3QgaWYgcmVxdWlyZWQuCi0gICAgICAgIGlmIChuZXh0SW5wdXQubV9leHBlY3RlZEZpbGVNb2Rp
ZmljYXRpb25UaW1lICE9IEJsb2JEYXRhSXRlbTo6ZG9Ob3RDaGVja0ZpbGVDaGFuZ2UpIHsKLSAg
ICAgICAgICAgIHRpbWVfdCBmaWxlTW9kaWZpY2F0aW9uVGltZTsKLSAgICAgICAgICAgIGlmICgh
Z2V0RmlsZU1vZGlmaWNhdGlvblRpbWUobmV4dElucHV0Lm1fZmlsZW5hbWUsIGZpbGVNb2RpZmlj
YXRpb25UaW1lKSB8fCBmaWxlTW9kaWZpY2F0aW9uVGltZSAhPSBzdGF0aWNfY2FzdDx0aW1lX3Q+
KG5leHRJbnB1dC5tX2V4cGVjdGVkRmlsZU1vZGlmaWNhdGlvblRpbWUpKQotICAgICAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIGNvbnN0IFN0cmlu
ZyYgcGF0aCA9IG5leHRJbnB1dC5tX3Nob3VsZEdlbmVyYXRlRmlsZSA/IG5leHRJbnB1dC5tX2dl
bmVyYXRlZEZpbGVuYW1lIDogbmV4dElucHV0Lm1fZmlsZW5hbWU7Ci0gICAgICAgIGZvcm0tPmN1
cnJlbnRTdHJlYW0gPSBDRlJlYWRTdHJlYW1DcmVhdGVXaXRoRmlsZSgwLCBwYXRoQXNVUkwocGF0
aCkuZ2V0KCkpOwotICAgICAgICBpZiAoIWZvcm0tPmN1cnJlbnRTdHJlYW0pIHsKLSAgICAgICAg
ICAgIC8vIFRoZSBmaWxlIG11c3QgaGF2ZSBiZWVuIHJlbW92ZWQgb3IgYmVjb21lIHVucmVhZGFi
bGUuCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSNpZiBFTkFCTEUoQkxP
QikKLSAgICAgICAgaWYgKG5leHRJbnB1dC5tX2ZpbGVTdGFydCA+IDApIHsKLSAgICAgICAgICAg
IFJldGFpblB0cjxDRk51bWJlclJlZj4gcG9zaXRpb24oQWRvcHRDRiwgQ0ZOdW1iZXJDcmVhdGUo
MCwga0NGTnVtYmVyTG9uZ0xvbmdUeXBlLCAmbmV4dElucHV0Lm1fZmlsZVN0YXJ0KSk7Ci0gICAg
ICAgICAgICBDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eShmb3JtLT5jdXJyZW50U3RyZWFtLCBrQ0ZT
dHJlYW1Qcm9wZXJ0eUZpbGVDdXJyZW50T2Zmc2V0LCBwb3NpdGlvbi5nZXQoKSk7Ci0gICAgICAg
IH0KLSAgICAgICAgZm9ybS0+Y3VycmVudFN0cmVhbVJhbmdlTGVuZ3RoID0gbmV4dElucHV0Lm1f
ZmlsZUxlbmd0aDsKLSNlbmRpZgotICAgIH0KLSAgICBmb3JtLT5yZW1haW5pbmdFbGVtZW50cy5y
ZW1vdmVMYXN0KCk7Ci0KLSAgICAvLyBTZXQgdXAgdGhlIGNhbGxiYWNrLgotICAgIENGU3RyZWFt
Q2xpZW50Q29udGV4dCBjb250ZXh0ID0geyAwLCBmb3JtLCBOVUxMLCBOVUxMLCBOVUxMIH07Ci0g
ICAgQ0ZSZWFkU3RyZWFtU2V0Q2xpZW50KGZvcm0tPmN1cnJlbnRTdHJlYW0sIGtDRlN0cmVhbUV2
ZW50SGFzQnl0ZXNBdmFpbGFibGUgfCBrQ0ZTdHJlYW1FdmVudEVycm9yT2NjdXJyZWQgfCBrQ0ZT
dHJlYW1FdmVudEVuZEVuY291bnRlcmVkLAotICAgICAgICBmb3JtRXZlbnRDYWxsYmFjaywgJmNv
bnRleHQpOwotCi0gICAgLy8gU2NoZWR1bGUgd2l0aCB0aGUgY3VycmVudCBzZXQgb2YgcnVuIGxv
b3BzLgotICAgIFNjaGVkdWxlUGFpckhhc2hTZXQ6Oml0ZXJhdG9yIGVuZCA9IGZvcm0tPnNjaGVk
dWxlZFJ1bkxvb3BQYWlycy5lbmQoKTsKLSAgICBmb3IgKFNjaGVkdWxlUGFpckhhc2hTZXQ6Oml0
ZXJhdG9yIGl0ID0gZm9ybS0+c2NoZWR1bGVkUnVuTG9vcFBhaXJzLmJlZ2luKCk7IGl0ICE9IGVu
ZDsgKytpdCkKLSAgICAgICAgQ0ZSZWFkU3RyZWFtU2NoZWR1bGVXaXRoUnVuTG9vcChmb3JtLT5j
dXJyZW50U3RyZWFtLCAoKml0KS0+cnVuTG9vcCgpLCAoKml0KS0+bW9kZSgpKTsKLQotICAgIHJl
dHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbCBvcGVuTmV4dFN0cmVhbShGb3JtU3RyZWFtRmll
bGRzKiBmb3JtKQotewotICAgIC8vIFNraXAgb3ZlciBhbnkgc3RyZWFtcyB3ZSBjYW4ndCBvcGVu
LgotICAgIGlmICghYWR2YW5jZUN1cnJlbnRTdHJlYW0oZm9ybSkpCi0gICAgICAgIHJldHVybiBm
YWxzZTsKLSAgICB3aGlsZSAoZm9ybS0+Y3VycmVudFN0cmVhbSAmJiAhQ0ZSZWFkU3RyZWFtT3Bl
bihmb3JtLT5jdXJyZW50U3RyZWFtKSkgewotICAgICAgICBpZiAoIWFkdmFuY2VDdXJyZW50U3Ry
ZWFtKGZvcm0pKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4g
dHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQqIGZvcm1DcmVhdGUoQ0ZSZWFkU3RyZWFtUmVmIHN0cmVh
bSwgdm9pZCogY29udGV4dCkKLXsKLSAgICBGb3JtQ29udGV4dCogZm9ybUNvbnRleHQgPSBzdGF0
aWNfY2FzdDxGb3JtQ29udGV4dCo+KGNvbnRleHQpOwotCi0gICAgRm9ybVN0cmVhbUZpZWxkcyog
bmV3SW5mbyA9IG5ldyBGb3JtU3RyZWFtRmllbGRzOwotICAgIG5ld0luZm8tPmZvcm1EYXRhID0g
Zm9ybUNvbnRleHQtPmZvcm1EYXRhLnJlbGVhc2UoKTsKLSAgICBuZXdJbmZvLT5jdXJyZW50U3Ry
ZWFtID0gTlVMTDsKLSNpZiBFTkFCTEUoQkxPQikKLSAgICBuZXdJbmZvLT5jdXJyZW50U3RyZWFt
UmFuZ2VMZW5ndGggPSBCbG9iRGF0YUl0ZW06OnRvRW5kT2ZGaWxlOwotI2VuZGlmCi0gICAgbmV3
SW5mby0+Y3VycmVudERhdGEgPSAwOwotICAgIG5ld0luZm8tPmZvcm1TdHJlYW0gPSBzdHJlYW07
IC8vIERvbid0IHJldGFpbi4gVGhhdCB3b3VsZCBjcmVhdGUgYSByZWZlcmVuY2UgY3ljbGUuCi0g
ICAgbmV3SW5mby0+c3RyZWFtTGVuZ3RoID0gZm9ybUNvbnRleHQtPnN0cmVhbUxlbmd0aDsKLSAg
ICBuZXdJbmZvLT5ieXRlc1NlbnQgPSAwOwotCi0gICAgLy8gQXBwZW5kIGluIHJldmVyc2Ugb3Jk
ZXIgc2luY2Ugd2UgcmVtb3ZlIGVsZW1lbnRzIGZyb20gdGhlIGVuZC4KLSAgICBzaXplX3Qgc2l6
ZSA9IG5ld0luZm8tPmZvcm1EYXRhLT5lbGVtZW50cygpLnNpemUoKTsKLSAgICBuZXdJbmZvLT5y
ZW1haW5pbmdFbGVtZW50cy5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KHNpemUpOwotICAgIGZvciAo
c2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKQotICAgICAgICBuZXdJbmZvLT5yZW1haW5pbmdF
bGVtZW50cy5hcHBlbmQobmV3SW5mby0+Zm9ybURhdGEtPmVsZW1lbnRzKClbc2l6ZSAtIGkgLSAx
XSk7Ci0KLSAgICBNdXRleExvY2tlciBsb2NrZXIoc3RyZWFtRmllbGRzTWFwTXV0ZXgoKSk7Ci0g
ICAgQVNTRVJUKCFzdHJlYW1GaWVsZHNNYXAoKS5jb250YWlucyhzdHJlYW0pKTsKLSAgICBzdHJl
YW1GaWVsZHNNYXAoKS5hZGQoc3RyZWFtLCBuZXdJbmZvKTsKLQotICAgIHJldHVybiBuZXdJbmZv
OwotfQotCi1zdGF0aWMgdm9pZCBmb3JtRmluaXNoRmluYWxpemF0aW9uT25NYWluVGhyZWFkKHZv
aWQqIGNvbnRleHQpCi17Ci0gICAgT3duUHRyPEZvcm1TdHJlYW1GaWVsZHM+IGZvcm0gPSBhZG9w
dFB0cihzdGF0aWNfY2FzdDxGb3JtU3RyZWFtRmllbGRzKj4oY29udGV4dCkpOwotCi0gICAgY2xv
c2VDdXJyZW50U3RyZWFtKGZvcm0uZ2V0KCkpOwotfQotCi1zdGF0aWMgdm9pZCBmb3JtRmluYWxp
emUoQ0ZSZWFkU3RyZWFtUmVmIHN0cmVhbSwgdm9pZCogY29udGV4dCkKLXsKLSAgICBGb3JtU3Ry
ZWFtRmllbGRzKiBmb3JtID0gc3RhdGljX2Nhc3Q8Rm9ybVN0cmVhbUZpZWxkcyo+KGNvbnRleHQp
OwotCi0gICAgTXV0ZXhMb2NrZXIgbG9ja2VyKHN0cmVhbUZpZWxkc01hcE11dGV4KCkpOwotCi0g
ICAgQVNTRVJUKGZvcm0tPmZvcm1TdHJlYW0gPT0gc3RyZWFtKTsKLSAgICBBU1NFUlQoc3RyZWFt
RmllbGRzTWFwKCkuZ2V0KHN0cmVhbSkgPT0gY29udGV4dCk7Ci0KLSAgICAvLyBEbyB0aGlzIHJp
Z2h0IGF3YXkgYmVjYXVzZSB0aGUgQ0ZSZWFkU3RyZWFtUmVmIGlzIGJlaW5nIGRlYWxsb2NhdGVk
LgotICAgIC8vIFdlIGNhbid0IHdhaXQgdG8gcmVtb3ZlIHRoaXMgZnJvbSB0aGUgbWFwIHVudGls
IHdlIGZpbmlzaCBmaW5hbGl6aW5nCi0gICAgLy8gb24gdGhlIG1haW4gdGhyZWFkIGJlY2F1c2Ug
aW4gdGhlb3J5IHRoZSBmcmVlZCBtZW1vcnkgY291bGQgYmUgcmV1c2VkCi0gICAgLy8gZm9yIGEg
bmV3IENGUmVhZFN0cmVhbSBiZWZvcmUgdGhhdCBydW5zLgotICAgIHN0cmVhbUZpZWxkc01hcCgp
LnJlbW92ZShzdHJlYW0pOwotCi0gICAgY2FsbE9uTWFpblRocmVhZChmb3JtRmluaXNoRmluYWxp
emF0aW9uT25NYWluVGhyZWFkLCBmb3JtKTsKLX0KLQotc3RhdGljIEJvb2xlYW4gZm9ybU9wZW4o
Q0ZSZWFkU3RyZWFtUmVmLCBDRlN0cmVhbUVycm9yKiBlcnJvciwgQm9vbGVhbiogb3BlbkNvbXBs
ZXRlLCB2b2lkKiBjb250ZXh0KQotewotICAgIEZvcm1TdHJlYW1GaWVsZHMqIGZvcm0gPSBzdGF0
aWNfY2FzdDxGb3JtU3RyZWFtRmllbGRzKj4oY29udGV4dCk7Ci0KLSAgICBib29sIG9wZW5lZCA9
IG9wZW5OZXh0U3RyZWFtKGZvcm0pOwotCi0gICAgKm9wZW5Db21wbGV0ZSA9IG9wZW5lZDsKLSAg
ICBlcnJvci0+ZXJyb3IgPSBvcGVuZWQgPyAwIDogZm5mRXJyOwotICAgIHJldHVybiBvcGVuZWQ7
Ci19Ci0KLXN0YXRpYyBDRkluZGV4IGZvcm1SZWFkKENGUmVhZFN0cmVhbVJlZiwgVUludDgqIGJ1
ZmZlciwgQ0ZJbmRleCBidWZmZXJMZW5ndGgsIENGU3RyZWFtRXJyb3IqIGVycm9yLCBCb29sZWFu
KiBhdEVPRiwgdm9pZCogY29udGV4dCkKLXsKLSAgICBGb3JtU3RyZWFtRmllbGRzKiBmb3JtID0g
c3RhdGljX2Nhc3Q8Rm9ybVN0cmVhbUZpZWxkcyo+KGNvbnRleHQpOwotCi0gICAgd2hpbGUgKGZv
cm0tPmN1cnJlbnRTdHJlYW0pIHsKLSAgICAgICAgQ0ZJbmRleCBieXRlc1RvUmVhZCA9IGJ1ZmZl
ckxlbmd0aDsKLSNpZiBFTkFCTEUoQkxPQikKLSAgICAgICAgaWYgKGZvcm0tPmN1cnJlbnRTdHJl
YW1SYW5nZUxlbmd0aCAhPSBCbG9iRGF0YUl0ZW06OnRvRW5kT2ZGaWxlICYmIGZvcm0tPmN1cnJl
bnRTdHJlYW1SYW5nZUxlbmd0aCA8IGJ5dGVzVG9SZWFkKQotICAgICAgICAgICAgYnl0ZXNUb1Jl
YWQgPSBzdGF0aWNfY2FzdDxDRkluZGV4Pihmb3JtLT5jdXJyZW50U3RyZWFtUmFuZ2VMZW5ndGgp
OwotI2VuZGlmCi0gICAgICAgIENGSW5kZXggYnl0ZXNSZWFkID0gQ0ZSZWFkU3RyZWFtUmVhZChm
b3JtLT5jdXJyZW50U3RyZWFtLCBidWZmZXIsIGJ5dGVzVG9SZWFkKTsKLSAgICAgICAgaWYgKGJ5
dGVzUmVhZCA8IDApIHsKLSAgICAgICAgICAgICplcnJvciA9IENGUmVhZFN0cmVhbUdldEVycm9y
KGZvcm0tPmN1cnJlbnRTdHJlYW0pOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9
Ci0gICAgICAgIGlmIChieXRlc1JlYWQgPiAwKSB7Ci0gICAgICAgICAgICBlcnJvci0+ZXJyb3Ig
PSAwOwotICAgICAgICAgICAgKmF0RU9GID0gRkFMU0U7Ci0gICAgICAgICAgICBmb3JtLT5ieXRl
c1NlbnQgKz0gYnl0ZXNSZWFkOwotI2lmIEVOQUJMRShCTE9CKQotICAgICAgICAgICAgaWYgKGZv
cm0tPmN1cnJlbnRTdHJlYW1SYW5nZUxlbmd0aCAhPSBCbG9iRGF0YUl0ZW06OnRvRW5kT2ZGaWxl
KQotICAgICAgICAgICAgICAgIGZvcm0tPmN1cnJlbnRTdHJlYW1SYW5nZUxlbmd0aCAtPSBieXRl
c1JlYWQ7Ci0jZW5kaWYKLQotICAgICAgICAgICAgcmV0dXJuIGJ5dGVzUmVhZDsKLSAgICAgICAg
fQotICAgICAgICBvcGVuTmV4dFN0cmVhbShmb3JtKTsKLSAgICB9Ci0KLSAgICBlcnJvci0+ZXJy
b3IgPSAwOwotICAgICphdEVPRiA9IFRSVUU7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBC
b29sZWFuIGZvcm1DYW5SZWFkKENGUmVhZFN0cmVhbVJlZiBzdHJlYW0sIHZvaWQqIGNvbnRleHQp
Ci17Ci0gICAgRm9ybVN0cmVhbUZpZWxkcyogZm9ybSA9IHN0YXRpY19jYXN0PEZvcm1TdHJlYW1G
aWVsZHMqPihjb250ZXh0KTsKLQotICAgIHdoaWxlIChmb3JtLT5jdXJyZW50U3RyZWFtICYmIENG
UmVhZFN0cmVhbUdldFN0YXR1cyhmb3JtLT5jdXJyZW50U3RyZWFtKSA9PSBrQ0ZTdHJlYW1TdGF0
dXNBdEVuZCkgewotICAgICAgICBvcGVuTmV4dFN0cmVhbShmb3JtKTsKLSAgICB9Ci0gICAgaWYg
KCFmb3JtLT5jdXJyZW50U3RyZWFtKSB7Ci0gICAgICAgIHdrU2lnbmFsQ0ZSZWFkU3RyZWFtRW5k
KHN0cmVhbSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcmV0dXJuIENGUmVh
ZFN0cmVhbUhhc0J5dGVzQXZhaWxhYmxlKGZvcm0tPmN1cnJlbnRTdHJlYW0pOwotfQotCi1zdGF0
aWMgdm9pZCBmb3JtQ2xvc2UoQ0ZSZWFkU3RyZWFtUmVmLCB2b2lkKiBjb250ZXh0KQotewotICAg
IEZvcm1TdHJlYW1GaWVsZHMqIGZvcm0gPSBzdGF0aWNfY2FzdDxGb3JtU3RyZWFtRmllbGRzKj4o
Y29udGV4dCk7Ci0KLSAgICBjbG9zZUN1cnJlbnRTdHJlYW0oZm9ybSk7Ci19Ci0KLXN0YXRpYyB2
b2lkIGZvcm1TY2hlZHVsZShDRlJlYWRTdHJlYW1SZWYsIENGUnVuTG9vcFJlZiBydW5Mb29wLCBD
RlN0cmluZ1JlZiBydW5Mb29wTW9kZSwgdm9pZCogY29udGV4dCkKLXsKLSAgICBGb3JtU3RyZWFt
RmllbGRzKiBmb3JtID0gc3RhdGljX2Nhc3Q8Rm9ybVN0cmVhbUZpZWxkcyo+KGNvbnRleHQpOwot
Ci0gICAgaWYgKGZvcm0tPmN1cnJlbnRTdHJlYW0pCi0gICAgICAgIENGUmVhZFN0cmVhbVNjaGVk
dWxlV2l0aFJ1bkxvb3AoZm9ybS0+Y3VycmVudFN0cmVhbSwgcnVuTG9vcCwgcnVuTG9vcE1vZGUp
OwotICAgIGZvcm0tPnNjaGVkdWxlZFJ1bkxvb3BQYWlycy5hZGQoU2NoZWR1bGVQYWlyOjpjcmVh
dGUocnVuTG9vcCwgcnVuTG9vcE1vZGUpKTsKLX0KLQotc3RhdGljIHZvaWQgZm9ybVVuc2NoZWR1
bGUoQ0ZSZWFkU3RyZWFtUmVmLCBDRlJ1bkxvb3BSZWYgcnVuTG9vcCwgQ0ZTdHJpbmdSZWYgcnVu
TG9vcE1vZGUsIHZvaWQqIGNvbnRleHQpCi17Ci0gICAgRm9ybVN0cmVhbUZpZWxkcyogZm9ybSA9
IHN0YXRpY19jYXN0PEZvcm1TdHJlYW1GaWVsZHMqPihjb250ZXh0KTsKLQotICAgIGlmIChmb3Jt
LT5jdXJyZW50U3RyZWFtKQotICAgICAgICBDRlJlYWRTdHJlYW1VbnNjaGVkdWxlRnJvbVJ1bkxv
b3AoZm9ybS0+Y3VycmVudFN0cmVhbSwgcnVuTG9vcCwgcnVuTG9vcE1vZGUpOwotICAgIGZvcm0t
PnNjaGVkdWxlZFJ1bkxvb3BQYWlycy5yZW1vdmUoU2NoZWR1bGVQYWlyOjpjcmVhdGUocnVuTG9v
cCwgcnVuTG9vcE1vZGUpKTsKLX0KLQotc3RhdGljIHZvaWQgZm9ybUV2ZW50Q2FsbGJhY2soQ0ZS
ZWFkU3RyZWFtUmVmIHN0cmVhbSwgQ0ZTdHJlYW1FdmVudFR5cGUgdHlwZSwgdm9pZCogY29udGV4
dCkKLXsKLSAgICBGb3JtU3RyZWFtRmllbGRzKiBmb3JtID0gc3RhdGljX2Nhc3Q8Rm9ybVN0cmVh
bUZpZWxkcyo+KGNvbnRleHQpOwotCi0gICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBrQ0ZT
dHJlYW1FdmVudEhhc0J5dGVzQXZhaWxhYmxlOgotICAgICAgICB3a1NpZ25hbENGUmVhZFN0cmVh
bUhhc0J5dGVzKGZvcm0tPmZvcm1TdHJlYW0pOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIGtD
RlN0cmVhbUV2ZW50RXJyb3JPY2N1cnJlZDogewotICAgICAgICBDRlN0cmVhbUVycm9yIHJlYWRT
dHJlYW1FcnJvciA9IENGUmVhZFN0cmVhbUdldEVycm9yKHN0cmVhbSk7Ci0gICAgICAgIHdrU2ln
bmFsQ0ZSZWFkU3RyZWFtRXJyb3IoZm9ybS0+Zm9ybVN0cmVhbSwgJnJlYWRTdHJlYW1FcnJvcik7
Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIGtDRlN0cmVhbUV2ZW50RW5kRW5jb3Vu
dGVyZWQ6Ci0gICAgICAgIG9wZW5OZXh0U3RyZWFtKGZvcm0pOwotICAgICAgICBpZiAoIWZvcm0t
PmN1cnJlbnRTdHJlYW0pIHsKLSAgICAgICAgICAgIHdrU2lnbmFsQ0ZSZWFkU3RyZWFtRW5kKGZv
cm0tPmZvcm1TdHJlYW0pOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2Uga0NG
U3RyZWFtRXZlbnROb25lOgotICAgICAgICBMT0dfRVJST1IoInVuZXhwZWN0ZWQga0NGU3RyZWFt
RXZlbnROb25lIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2Uga0NGU3RyZWFtRXZlbnRPcGVu
Q29tcGxldGVkOgotICAgICAgICBMT0dfRVJST1IoInVuZXhwZWN0ZWQga0NGU3RyZWFtRXZlbnRP
cGVuQ29tcGxldGVkIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2Uga0NGU3RyZWFtRXZlbnRD
YW5BY2NlcHRCeXRlczoKLSAgICAgICAgTE9HX0VSUk9SKCJ1bmV4cGVjdGVkIGtDRlN0cmVhbUV2
ZW50Q2FuQWNjZXB0Qnl0ZXMiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCiB2b2lkIHNl
dEhUVFBCb2R5KE5TTXV0YWJsZVVSTFJlcXVlc3QgKnJlcXVlc3QsIFBhc3NSZWZQdHI8Rm9ybURh
dGE+IHBycEZvcm1EYXRhKQogewotICAgIFJlZlB0cjxGb3JtRGF0YT4gZm9ybURhdGEgPSBwcnBG
b3JtRGF0YTsKLQotICAgIGlmICghZm9ybURhdGEpCi0gICAgICAgIHJldHVybjsKLSAgICAgICAg
Ci0gICAgc2l6ZV90IGNvdW50ID0gZm9ybURhdGEtPmVsZW1lbnRzKCkuc2l6ZSgpOwotCi0gICAg
Ly8gSGFuZGxlIHRoZSBjb21tb24gc3BlY2lhbCBjYXNlIG9mIG9uZSBwaWVjZSBvZiBmb3JtIGRh
dGEsIHdpdGggbm8gZmlsZXMuCi0gICAgaWYgKGNvdW50ID09IDEgJiYgIWZvcm1EYXRhLT5hbHdh
eXNTdHJlYW0oKSkgewotICAgICAgICBjb25zdCBGb3JtRGF0YUVsZW1lbnQmIGVsZW1lbnQgPSBm
b3JtRGF0YS0+ZWxlbWVudHMoKVswXTsKLSAgICAgICAgaWYgKGVsZW1lbnQubV90eXBlID09IEZv
cm1EYXRhRWxlbWVudDo6ZGF0YSkgewotICAgICAgICAgICAgTlNEYXRhICpkYXRhID0gW1tOU0Rh
dGEgYWxsb2NdIGluaXRXaXRoQnl0ZXM6ZWxlbWVudC5tX2RhdGEuZGF0YSgpIGxlbmd0aDplbGVt
ZW50Lm1fZGF0YS5zaXplKCldOwotICAgICAgICAgICAgW3JlcXVlc3Qgc2V0SFRUUEJvZHk6ZGF0
YV07Ci0gICAgICAgICAgICBbZGF0YSByZWxlYXNlXTsKLSAgICAgICAgICAgIHJldHVybjsKLSAg
ICAgICAgfQotICAgIH0KLQotI2lmIEVOQUJMRShCTE9CKQotICAgIC8vIENoZWNrIGlmIHRoZXJl
IGlzIGEgYmxvYiBpbiB0aGUgZm9ybSBkYXRhLgotICAgIGJvb2wgaGFzQmxvYiA9IGZhbHNlOwot
ICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgICAgICBjb25zdCBG
b3JtRGF0YUVsZW1lbnQmIGVsZW1lbnQgPSBmb3JtRGF0YS0+ZWxlbWVudHMoKVtpXTsKLSAgICAg
ICAgaWYgKGVsZW1lbnQubV90eXBlID09IEZvcm1EYXRhRWxlbWVudDo6ZW5jb2RlZEJsb2IpIHsK
LSAgICAgICAgICAgIGhhc0Jsb2IgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
IH0KLSAgICB9Ci0KLSAgICAvLyBJZiB5ZXMsIHdlIGhhdmUgdG8gcmVzb2x2ZSBhbGwgdGhlIGJs
b2IgcmVmZXJlbmNlcyBhbmQgcmVnZW5lcmF0ZSB0aGUgZm9ybSBkYXRhIHdpdGggb25seSBkYXRh
IGFuZCBmaWxlIHR5cGVzLgotICAgIGlmIChoYXNCbG9iKSB7Ci0gICAgICAgIFJlZlB0cjxGb3Jt
RGF0YT4gbmV3Rm9ybURhdGEgPSBGb3JtRGF0YTo6Y3JlYXRlKCk7Ci0gICAgICAgIG5ld0Zvcm1E
YXRhLT5zZXRBbHdheXNTdHJlYW0oZm9ybURhdGEtPmFsd2F5c1N0cmVhbSgpKTsKLSAgICAgICAg
bmV3Rm9ybURhdGEtPnNldElkZW50aWZpZXIoZm9ybURhdGEtPmlkZW50aWZpZXIoKSk7Ci0gICAg
ICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgICAgICAgICAgY29u
c3QgRm9ybURhdGFFbGVtZW50JiBlbGVtZW50ID0gZm9ybURhdGEtPmVsZW1lbnRzKClbaV07Ci0g
ICAgICAgICAgICBpZiAoZWxlbWVudC5tX3R5cGUgPT0gRm9ybURhdGFFbGVtZW50OjpkYXRhKQot
ICAgICAgICAgICAgICAgIG5ld0Zvcm1EYXRhLT5hcHBlbmREYXRhKGVsZW1lbnQubV9kYXRhLmRh
dGEoKSwgZWxlbWVudC5tX2RhdGEuc2l6ZSgpKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGVsZW1l
bnQubV90eXBlID09IEZvcm1EYXRhRWxlbWVudDo6ZW5jb2RlZEZpbGUpCi0gICAgICAgICAgICAg
ICAgbmV3Rm9ybURhdGEtPmFwcGVuZEZpbGUoZWxlbWVudC5tX2ZpbGVuYW1lLCBlbGVtZW50Lm1f
c2hvdWxkR2VuZXJhdGVGaWxlKTsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAg
IEFTU0VSVChlbGVtZW50Lm1fdHlwZSA9PSBGb3JtRGF0YUVsZW1lbnQ6OmVuY29kZWRCbG9iKTsK
LSAgICAgICAgICAgICAgICBSZWZQdHI8QmxvYlN0b3JhZ2VEYXRhPiBibG9iRGF0YSA9IHN0YXRp
Y19jYXN0PEJsb2JSZWdpc3RyeUltcGwmPihibG9iUmVnaXN0cnkoKSkuZ2V0QmxvYkRhdGFGcm9t
VVJMKEtVUkwoUGFyc2VkVVJMU3RyaW5nLCBlbGVtZW50Lm1fYmxvYlVSTCkpOwotICAgICAgICAg
ICAgICAgIGlmIChibG9iRGF0YSkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBq
ID0gMDsgaiA8IGJsb2JEYXRhLT5pdGVtcygpLnNpemUoKTsgKytqKSB7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICBjb25zdCBCbG9iRGF0YUl0ZW0mIGJsb2JJdGVtID0gYmxvYkRhdGEtPml0ZW1z
KClbal07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmxvYkl0ZW0udHlwZSA9PSBCbG9i
RGF0YUl0ZW06OkRhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGb3JtRGF0
YS0+YXBwZW5kRGF0YShibG9iSXRlbS5kYXRhLT5kYXRhKCkgKyBzdGF0aWNfY2FzdDxpbnQ+KGJs
b2JJdGVtLm9mZnNldCksIHN0YXRpY19jYXN0PGludD4oYmxvYkl0ZW0ubGVuZ3RoKSk7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAg
IEFTU0VSVChibG9iSXRlbS50eXBlID09IEJsb2JEYXRhSXRlbTo6RmlsZSk7Ci0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgbmV3Rm9ybURhdGEtPmFwcGVuZEZpbGVSYW5nZShibG9iSXRlbS5w
YXRoLCBibG9iSXRlbS5vZmZzZXQsIGJsb2JJdGVtLmxlbmd0aCwgYmxvYkl0ZW0uZXhwZWN0ZWRN
b2RpZmljYXRpb25UaW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQot
ICAgICAgICBmb3JtRGF0YSA9IG5ld0Zvcm1EYXRhLnJlbGVhc2UoKTsKLSAgICAgICAgY291bnQg
PSBmb3JtRGF0YS0+ZWxlbWVudHMoKS5zaXplKCk7Ci0gICAgfQotI2VuZGlmCi0KLSAgICAvLyBQ
cmVjb21wdXRlIHRoZSBjb250ZW50IGxlbmd0aCBzbyBOU1VSTENvbm5lY3Rpb24gZG9lc24ndCB1
c2UgY2h1bmtlZCBtb2RlLgotICAgIGxvbmcgbG9uZyBsZW5ndGggPSAwOwotICAgIGZvciAoc2l6
ZV90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgICAgICBjb25zdCBGb3JtRGF0YUVsZW1l
bnQmIGVsZW1lbnQgPSBmb3JtRGF0YS0+ZWxlbWVudHMoKVtpXTsKLSAgICAgICAgaWYgKGVsZW1l
bnQubV90eXBlID09IEZvcm1EYXRhRWxlbWVudDo6ZGF0YSkKLSAgICAgICAgICAgIGxlbmd0aCAr
PSBlbGVtZW50Lm1fZGF0YS5zaXplKCk7Ci0gICAgICAgIGVsc2UgewotI2lmIEVOQUJMRShCTE9C
KQotICAgICAgICAgICAgLy8gSWYgd2UncmUgc2VuZGluZyB0aGUgZmlsZSByYW5nZSwgdXNlIHRo
ZSBleGlzdGluZyByYW5nZSBsZW5ndGggZm9yIG5vdy4gV2Ugd2lsbCBkZXRlY3QgaWYgdGhlIGZp
bGUgaGFzIGJlZW4gY2hhbmdlZCByaWdodCBiZWZvcmUgd2UgcmVhZCB0aGUgZmlsZSBhbmQgYWJv
cnQgdGhlIG9wZXJhdGlvbiBpZiBuZWNlc3NhcnkuCi0gICAgICAgICAgICBpZiAoZWxlbWVudC5t
X2ZpbGVMZW5ndGggIT0gQmxvYkRhdGFJdGVtOjp0b0VuZE9mRmlsZSkgewotICAgICAgICAgICAg
ICAgIGxlbmd0aCArPSBlbGVtZW50Lm1fZmlsZUxlbmd0aDsKLSAgICAgICAgICAgICAgICBjb250
aW51ZTsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgbG9uZyBsb25nIGZpbGVT
aXplOwotICAgICAgICAgICAgaWYgKGdldEZpbGVTaXplKGVsZW1lbnQubV9zaG91bGRHZW5lcmF0
ZUZpbGUgPyBlbGVtZW50Lm1fZ2VuZXJhdGVkRmlsZW5hbWUgOiBlbGVtZW50Lm1fZmlsZW5hbWUs
IGZpbGVTaXplKSkKLSAgICAgICAgICAgICAgICBsZW5ndGggKz0gZmlsZVNpemU7Ci0gICAgICAg
IH0KLSAgICB9Ci0KLSAgICAvLyBTZXQgdGhlIGxlbmd0aC4KLSAgICBbcmVxdWVzdCBzZXRWYWx1
ZTpbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiVsbGQiLCBsZW5ndGhdIGZvckhUVFBIZWFk
ZXJGaWVsZDpAIkNvbnRlbnQtTGVuZ3RoIl07Ci0KLSAgICAvLyBDcmVhdGUgYW5kIHNldCB0aGUg
c3RyZWFtLgotCi0gICAgLy8gUGFzcyB0aGUgbGVuZ3RoIGFsb25nIHdpdGggdGhlIGZvcm1EYXRh
IHNvIGl0IGRvZXMgbm90IGhhdmUgdG8gYmUgcmVjb21wdXRlZC4KLSAgICBGb3JtQ29udGV4dCBm
b3JtQ29udGV4dCA9IHsgZm9ybURhdGEucmVsZWFzZSgpLCBsZW5ndGggfTsKLQotICAgIFJldGFp
blB0cjxDRlJlYWRTdHJlYW1SZWY+IHN0cmVhbShBZG9wdENGLCB3a0NyZWF0ZUN1c3RvbUNGUmVh
ZFN0cmVhbShmb3JtQ3JlYXRlLCBmb3JtRmluYWxpemUsCi0gICAgICAgIGZvcm1PcGVuLCBmb3Jt
UmVhZCwgZm9ybUNhblJlYWQsIGZvcm1DbG9zZSwgZm9ybVNjaGVkdWxlLCBmb3JtVW5zY2hlZHVs
ZSwKLSAgICAgICAgJmZvcm1Db250ZXh0KSk7Ci0gICAgW3JlcXVlc3Qgc2V0SFRUUEJvZHlTdHJl
YW06KE5TSW5wdXRTdHJlYW0gKilzdHJlYW0uZ2V0KCldOworICAgIHNldEhUVFBCb2R5KGNvbnN0
X2Nhc3Q8Q0ZNdXRhYmxlVVJMUmVxdWVzdFJlZj4oW3JlcXVlc3QgX0NGVVJMUmVxdWVzdF0pLCBw
cnBGb3JtRGF0YSk7CiB9CiAKLUZvcm1EYXRhKiBodHRwQm9keUZyb21TdHJlYW0oTlNJbnB1dFN0
cmVhbSogc3RyZWFtKQorRm9ybURhdGEqIGh0dHBCb2R5RnJvbVN0cmVhbShOU0lucHV0U3RyZWFt
ICpzdHJlYW0pCiB7Ci0gICAgTXV0ZXhMb2NrZXIgbG9ja2VyKHN0cmVhbUZpZWxkc01hcE11dGV4
KCkpOwotICAgIEZvcm1TdHJlYW1GaWVsZHMqIGZvcm1TdHJlYW0gPSBzdHJlYW1GaWVsZHNNYXAo
KS5nZXQocmVpbnRlcnByZXRfY2FzdDxDRlJlYWRTdHJlYW1SZWY+KHN0cmVhbSkpOwotICAgIGlm
ICghZm9ybVN0cmVhbSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIGZvcm1TdHJlYW0t
PmZvcm1EYXRhLmdldCgpOworICAgIHJldHVybiBodHRwQm9keUZyb21TdHJlYW0ocmVpbnRlcnBy
ZXRfY2FzdDxDRlJlYWRTdHJlYW1SZWY+KHN0cmVhbSkpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBX
ZWJDb3JlCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vRmlsZVN5c3RlbVdpbi5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vd2luL0ZpbGVTeXN0ZW1X
aW4uY3BwCShyZXZpc2lvbiAxMTIxNjYpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4v
RmlsZVN5c3RlbVdpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEyMywxMSArMTIzLDE2IEBAIFN0
cmluZyBwYXRoQnlBcHBlbmRpbmdDb21wb25lbnQoY29uc3QgU3QKICAgICByZXR1cm4gU3RyaW5n
OjphZG9wdChidWZmZXIpOwogfQogCisjaWYgIVVTRShDRikKKwogQ1N0cmluZyBmaWxlU3lzdGVt
UmVwcmVzZW50YXRpb24oY29uc3QgU3RyaW5nJikKIHsKKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQo
KTsKICAgICByZXR1cm4gIiI7CiB9CiAKKyNlbmRpZiAhVVNFKENGKQorCiBib29sIG1ha2VBbGxE
aXJlY3Rvcmllcyhjb25zdCBTdHJpbmcmIHBhdGgpCiB7CiAgICAgU3RyaW5nIGZ1bGxQYXRoID0g
cGF0aDsK
</data>

          </attachment>
      

    </bug>

</bugzilla>