<?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>168454</bug_id>
          
          <creation_ts>2017-02-16 12:50:21 -0800</creation_ts>
          <short_desc>Add the Briggs optimistic allocator to run on ARM64</short_desc>
          <delta_ts>2017-02-22 00:06:45 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>JavaScriptCore</component>
          <version>WebKit Local Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>168611</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Saam Barati">saam</reporter>
          <assigned_to name="Saam Barati">saam</assigned_to>
          <cc>benjamin</cc>
    
    <cc>commit-queue</cc>
    
    <cc>fpizlo</cc>
    
    <cc>ggaren</cc>
    
    <cc>gskachkov</cc>
    
    <cc>jfbastien</cc>
    
    <cc>keith_miller</cc>
    
    <cc>mark.lam</cc>
    
    <cc>msaboff</cc>
    
    <cc>ticaiolima</cc>
    
    <cc>ysuzuki</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1277815</commentid>
    <comment_count>0</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-02-16 12:50:21 -0800</bug_when>
    <thetext>This should make IRC run faster. Let&apos;s see its perf impact.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1277822</commentid>
    <comment_count>1</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-02-16 12:56:41 -0800</bug_when>
    <thetext>And by make IRC run faster, I meant it should run faster than IRC.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1278067</commentid>
    <comment_count>2</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-02-16 18:39:19 -0800</bug_when>
    <thetext>Briggs allocator is about 10% faster right now. I haven&apos;t detected any test regressions. I want to see if I can make this even faster.

If I go full BitVector for the adjacency matrix in the interference graph, I can make things even faster. I get a 25% speed improvement (obviously this would help IRC too). There may be some alternative data structures we can use that would also be fast but not use as much memory as the BitVector. Phil suggested checking out the points to set data structure talked about in this paper:
http://hirzels.com/martin/papers/toplas07-pointers.pdf</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1278506</commentid>
    <comment_count>3</comment_count>
      <attachid>302010</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-02-17 16:42:51 -0800</bug_when>
    <thetext>Created attachment 302010
WIP

Here is a patch for the Briggs optimistic allocator.
I&apos;m still running some numbers on it. I just spoke with Ben, and he suggest checking it alongside IRC. I think I agree. But this patch is just if I replaced IRC, because I think it&apos;s easier to read this way.

It also includes a BitVector for the adjacency list, this is obviously a memory regression, so I need to consider if I want to keep it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1278508</commentid>
    <comment_count>4</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-02-17 16:47:51 -0800</bug_when>
    <thetext>(In reply to comment #3)
&gt; Created attachment 302010 [details]
&gt; WIP
&gt; 
&gt; Here is a patch for the Briggs optimistic allocator.
&gt; I&apos;m still running some numbers on it. I just spoke with Ben, and he suggest
&gt; checking it alongside IRC. I think I agree.

I agree, too.  We should have the ability to run both for a while, and test both.

Haven&apos;t looked at the patch too closely, but it seems like it should be possible to create some abstractions that allow most of the code to be shared.

&gt; But this patch is just if I
&gt; replaced IRC, because I think it&apos;s easier to read this way.
&gt; 
&gt; It also includes a BitVector for the adjacency list, this is obviously a
&gt; memory regression, so I need to consider if I want to keep it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1278551</commentid>
    <comment_count>5</comment_count>
      <attachid>302010</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2017-02-17 18:13:54 -0800</bug_when>
    <thetext>Comment on attachment 302010
WIP

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

&gt; Source/JavaScriptCore/b3/air/AirIteratedRegisterCoalescing.cpp:84
&gt; +            const_cast&lt;AbstractColoringAllocator&lt;IndexType&gt;*&gt;(this)-&gt;m_coalescedTmps[tmpIndex] = nextAlias;

Shouldn&apos;t this go after the while loop()?

&gt; Source/JavaScriptCore/b3/air/AirIteratedRegisterCoalescing.cpp:97
&gt; +    unsigned k() const { return m_regsInPriorityOrder.size(); }

I think it is a good idea to avoid names from papers when they are cryptic.
Readers should not have to read the paper to understand the algorithm.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1278584</commentid>
    <comment_count>6</comment_count>
      <attachid>302041</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-02-17 20:33:46 -0800</bug_when>
    <thetext>Created attachment 302041
WIP

Here are both allocators.
I still need to add a runtime option for which allocator to run, rename the file, and add back some logging code.

So far, I haven&apos;t been able to detect any real slowdowns. Nor have I been able to detect any speedups.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1278585</commentid>
    <comment_count>7</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-02-17 20:35:44 -0800</bug_when>
    <thetext>(In reply to comment #5)
&gt; Comment on attachment 302010 [details]
&gt; WIP
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=302010&amp;action=review
&gt; 
&gt; &gt; Source/JavaScriptCore/b3/air/AirIteratedRegisterCoalescing.cpp:84
&gt; &gt; +            const_cast&lt;AbstractColoringAllocator&lt;IndexType&gt;*&gt;(this)-&gt;m_coalescedTmps[tmpIndex] = nextAlias;
&gt; 
&gt; Shouldn&apos;t this go after the while loop()?
Yeah. I originally changed this to the full recursive disjoint union algorithm using
an if statement and recursion. I forgot to move it outwards after that.

&gt; 
&gt; &gt; Source/JavaScriptCore/b3/air/AirIteratedRegisterCoalescing.cpp:97
&gt; &gt; +    unsigned k() const { return m_regsInPriorityOrder.size(); }
&gt; 
&gt; I think it is a good idea to avoid names from papers when they are cryptic.
&gt; Readers should not have to read the paper to understand the algorithm.

Fair enough. I&apos;ll name it something more descriptive.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1278586</commentid>
    <comment_count>8</comment_count>
      <attachid>302041</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-02-17 20:37:11 -0800</bug_when>
    <thetext>Comment on attachment 302041
WIP

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

&gt; Source/JavaScriptCore/b3/air/AirIteratedRegisterCoalescing.cpp:459
&gt; +    BitVector m_interferenceEdges;

I think ima go back to the HashSet here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1278591</commentid>
    <comment_count>9</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-02-17 20:49:00 -0800</bug_when>
    <thetext>(In reply to comment #6)
&gt; Created attachment 302041 [details]
&gt; WIP
&gt; 
&gt; Here are both allocators.
&gt; I still need to add a runtime option for which allocator to run, rename the
&gt; file, and add back some logging code.
&gt; 
&gt; So far, I haven&apos;t been able to detect any real slowdowns. Nor have I been
&gt; able to detect any speedups.

I take that back. I see a 1% slowdown on Octane on x86. But not on ARM. We could try adding biased coloring to the Briggs allocator to see if that fixes the Octane regression.

Also, another observation I had, I don&apos;t think we prioritize moves in any particular way. However, it&apos;d be beneficial to consider more &quot;expensive&quot; moves first. Perhaps our list of moves could be a priority queue sorted on loop depth so we always consider moves inside loops before moves elsewhere.

Given the data, it&apos;s probably not worth landing the Briggs allocator on. We could try landing turning it on for just ARM64 to see if the perf bots detect any speedup. I&apos;ll see if I can optimize it more for Octane on x86. I&apos;ll probably try out biased coloring. If we leave it off for all platforms, I&apos;ll make sure there is at least some jsc test form that runs Briggs allocator just to make sure it stays working.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1278651</commentid>
    <comment_count>10</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-02-18 11:44:51 -0800</bug_when>
    <thetext>(In reply to comment #9)
&gt; (In reply to comment #6)
&gt; &gt; Created attachment 302041 [details]
&gt; &gt; WIP
&gt; &gt; 
&gt; &gt; Here are both allocators.
&gt; &gt; I still need to add a runtime option for which allocator to run, rename the
&gt; &gt; file, and add back some logging code.
&gt; &gt; 
&gt; &gt; So far, I haven&apos;t been able to detect any real slowdowns. Nor have I been
&gt; &gt; able to detect any speedups.
&gt; 
&gt; I take that back. I see a 1% slowdown on Octane on x86. But not on ARM. We
&gt; could try adding biased coloring to the Briggs allocator to see if that
&gt; fixes the Octane regression.
&gt; 
&gt; Also, another observation I had, I don&apos;t think we prioritize moves in any
&gt; particular way. However, it&apos;d be beneficial to consider more &quot;expensive&quot;
&gt; moves first. Perhaps our list of moves could be a priority queue sorted on
&gt; loop depth so we always consider moves inside loops before moves elsewhere.
&gt; 
&gt; Given the data, it&apos;s probably not worth landing the Briggs allocator on. We
&gt; could try landing turning it on for just ARM64 to see if the perf bots
&gt; detect any speedup. I&apos;ll see if I can optimize it more for Octane on x86.
&gt; I&apos;ll probably try out biased coloring. If we leave it off for all platforms,
&gt; I&apos;ll make sure there is at least some jsc test form that runs Briggs
&gt; allocator just to make sure it stays working.

I think it&apos;s sensible to have IRC for x86_64 and Briggs for ARM64 because:

- ARM64 has more registers, so it isn&apos;t so sensitive to register allocation.
- x86_64 is two-operand form so it is more sensitive to coalescing.

So, I would expect that ARM64 would use a weaker register allocator than x86_64.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1278652</commentid>
    <comment_count>11</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2017-02-18 12:38:41 -0800</bug_when>
    <thetext>Attachment 302041 did not pass style-queue:


ERROR: Source/JavaScriptCore/b3/air/AirIteratedRegisterCoalescing.cpp:437:  Should have a space between // and comment  [whitespace/comments] [4]
ERROR: Source/JavaScriptCore/b3/air/AirIteratedRegisterCoalescing.cpp:443:  Should have a space between // and comment  [whitespace/comments] [4]
ERROR: Source/JavaScriptCore/b3/air/AirIteratedRegisterCoalescing.cpp:458:  Should have a space between // and comment  [whitespace/comments] [4]
ERROR: Source/JavaScriptCore/b3/air/AirIteratedRegisterCoalescing.cpp:571:  Should have only a single space after a punctuation in a comment.  [whitespace/comments] [5]
ERROR: Source/JavaScriptCore/b3/air/AirIteratedRegisterCoalescing.cpp:904:  Should have a space between // and comment  [whitespace/comments] [4]
ERROR: Source/JavaScriptCore/b3/air/AirIteratedRegisterCoalescing.cpp:1676:  Should have a space between // and comment  [whitespace/comments] [4]
ERROR: Source/JavaScriptCore/b3/air/AirIteratedRegisterCoalescing.cpp:1679:  Should have a space between // and comment  [whitespace/comments] [4]
ERROR: Source/JavaScriptCore/b3/air/AirIteratedRegisterCoalescing.cpp:1689:  Should have a space between // and comment  [whitespace/comments] [4]
ERROR: Source/JavaScriptCore/b3/air/AirIteratedRegisterCoalescing.cpp:1699:  Should have a space between // and comment  [whitespace/comments] [4]
ERROR: Source/JavaScriptCore/b3/air/AirIteratedRegisterCoalescing.cpp:1700:  Should have a space between // and comment  [whitespace/comments] [4]
ERROR: Source/JavaScriptCore/b3/air/AirIteratedRegisterCoalescing.cpp:1701:  Should have a space between // and comment  [whitespace/comments] [4]
Total errors found: 11 in 2 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>1278784</commentid>
    <comment_count>12</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-02-19 16:54:10 -0800</bug_when>
    <thetext>I&apos;ve also added what Briggs called &quot;biased coloring&quot; to our Briggs implementation, and it makes Briggs 10% and 3% faster than IRC on a couple Octane tests on x86. I still need to try it out on ARM64.

I also added biased coloring to IRC, but it&apos;s leading to crashes in a few scenarios that are really surprising to me. I need to learn why it&apos;s crashing IRC to add biases after any node is added to the select stack. I&apos;m probably missing something as to why it&apos;s invalid.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1278802</commentid>
    <comment_count>13</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-02-19 18:06:43 -0800</bug_when>
    <thetext>(In reply to comment #12)
&gt; I&apos;ve also added what Briggs called &quot;biased coloring&quot; to our Briggs
&gt; implementation, and it makes Briggs 10% and 3% faster than IRC on a couple
&gt; Octane tests on x86. I still need to try it out on ARM64.
&gt; 
&gt; I also added biased coloring to IRC, but it&apos;s leading to crashes in a few
&gt; scenarios that are really surprising to me. I need to learn why it&apos;s
&gt; crashing IRC to add biases after any node is added to the select stack. I&apos;m
&gt; probably missing something as to why it&apos;s invalid.

I know why my biasing algorithm works on Briggs but not on IRC (but does work on IRC but only before anything is spilled).

The reason it works for IRC before anything is spilled is the same reason it works for Briggs. As we coalesce, our interference graph keeps all the relationships we&apos;re interested in inside the interference graph. However, if we&apos;ve already spilled, and then we do more coalescing, the interference graph will no longer represent the constraints that would exist for an already spilled node. This broke my implementation of biased coloring that didn&apos;t color this use case. Perhaps it&apos;s not even worth doing this. The algorithm would have to consider everything that coalesced into a node and to see if any of those interfere with a biased color. It&apos;s probably easier to just reason about the algorithm before anything makes it to the spill stack. (Again, for Briggs, this is the only way to reason about it, since we run coalescing until we&apos;re done, and then we simplify.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1278803</commentid>
    <comment_count>14</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-02-19 18:19:35 -0800</bug_when>
    <thetext>(In reply to comment #13)
&gt; (In reply to comment #12)
&gt; &gt; I&apos;ve also added what Briggs called &quot;biased coloring&quot; to our Briggs
&gt; &gt; implementation, and it makes Briggs 10% and 3% faster than IRC on a couple
&gt; &gt; Octane tests on x86. I still need to try it out on ARM64.
&gt; &gt; 
&gt; &gt; I also added biased coloring to IRC, but it&apos;s leading to crashes in a few
&gt; &gt; scenarios that are really surprising to me. I need to learn why it&apos;s
&gt; &gt; crashing IRC to add biases after any node is added to the select stack. I&apos;m
&gt; &gt; probably missing something as to why it&apos;s invalid.
&gt; 
&gt; I know why my biasing algorithm works on Briggs but not on IRC (but does
&gt; work on IRC but only before anything is spilled).
&gt; 
&gt; The reason it works for IRC before anything is spilled is the same reason it
&gt; works for Briggs. As we coalesce, our interference graph keeps all the
&gt; relationships we&apos;re interested in inside the interference graph. However, if
&gt; we&apos;ve already spilled, and then we do more coalescing, the interference
&gt; graph will no longer represent the constraints that would exist for an
&gt; already spilled node. This broke my implementation of biased coloring that
&gt; didn&apos;t color this use case. Perhaps it&apos;s not even worth doing this. The
&gt; algorithm would have to consider everything that coalesced into a node and
&gt; to see if any of those interfere with a biased color. It&apos;s probably easier
&gt; to just reason about the algorithm before anything makes it to the spill
&gt; stack. (Again, for Briggs, this is the only way to reason about it, since we
&gt; run coalescing until we&apos;re done, and then we simplify.)

Actually, this doesn&apos;t fit easily into IRC. I&apos;d have to do the more complicated thing to determine if it&apos;s safe to perform a biased coloring. In Briggs, this is just natural.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1278861</commentid>
    <comment_count>15</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-02-19 23:53:24 -0800</bug_when>
    <thetext>(In reply to comment #14)
&gt; (In reply to comment #13)
&gt; &gt; (In reply to comment #12)
&gt; &gt; &gt; I&apos;ve also added what Briggs called &quot;biased coloring&quot; to our Briggs
&gt; &gt; &gt; implementation, and it makes Briggs 10% and 3% faster than IRC on a couple
&gt; &gt; &gt; Octane tests on x86. I still need to try it out on ARM64.
&gt; &gt; &gt; 
&gt; &gt; &gt; I also added biased coloring to IRC, but it&apos;s leading to crashes in a few
&gt; &gt; &gt; scenarios that are really surprising to me. I need to learn why it&apos;s
&gt; &gt; &gt; crashing IRC to add biases after any node is added to the select stack. I&apos;m
&gt; &gt; &gt; probably missing something as to why it&apos;s invalid.
&gt; &gt; 
&gt; &gt; I know why my biasing algorithm works on Briggs but not on IRC (but does
&gt; &gt; work on IRC but only before anything is spilled).
&gt; &gt; 
&gt; &gt; The reason it works for IRC before anything is spilled is the same reason it
&gt; &gt; works for Briggs. As we coalesce, our interference graph keeps all the
&gt; &gt; relationships we&apos;re interested in inside the interference graph. However, if
&gt; &gt; we&apos;ve already spilled, and then we do more coalescing, the interference
&gt; &gt; graph will no longer represent the constraints that would exist for an
&gt; &gt; already spilled node. This broke my implementation of biased coloring that
&gt; &gt; didn&apos;t color this use case. Perhaps it&apos;s not even worth doing this. The
&gt; &gt; algorithm would have to consider everything that coalesced into a node and
&gt; &gt; to see if any of those interfere with a biased color. It&apos;s probably easier
&gt; &gt; to just reason about the algorithm before anything makes it to the spill
&gt; &gt; stack. (Again, for Briggs, this is the only way to reason about it, since we
&gt; &gt; run coalescing until we&apos;re done, and then we simplify.)
&gt; 
&gt; Actually, this doesn&apos;t fit easily into IRC. I&apos;d have to do the more
&gt; complicated thing to determine if it&apos;s safe to perform a biased coloring. In
&gt; Briggs, this is just natural.

Hmmm, actually, after thinking about various interference graphs, I don&apos;t what I said is quite correct. I don&apos;t think it could happen, given how we consider a node&apos;s adjacency list. So, given that, I&apos;m not quite sure why biased coloring is breaking IRC.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1278869</commentid>
    <comment_count>16</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-02-20 01:05:24 -0800</bug_when>
    <thetext>(In reply to comment #15)
&gt; (In reply to comment #14)
&gt; &gt; (In reply to comment #13)
&gt; &gt; &gt; (In reply to comment #12)
&gt; &gt; &gt; &gt; I&apos;ve also added what Briggs called &quot;biased coloring&quot; to our Briggs
&gt; &gt; &gt; &gt; implementation, and it makes Briggs 10% and 3% faster than IRC on a couple
&gt; &gt; &gt; &gt; Octane tests on x86. I still need to try it out on ARM64.
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; I also added biased coloring to IRC, but it&apos;s leading to crashes in a few
&gt; &gt; &gt; &gt; scenarios that are really surprising to me. I need to learn why it&apos;s
&gt; &gt; &gt; &gt; crashing IRC to add biases after any node is added to the select stack. I&apos;m
&gt; &gt; &gt; &gt; probably missing something as to why it&apos;s invalid.
&gt; &gt; &gt; 
&gt; &gt; &gt; I know why my biasing algorithm works on Briggs but not on IRC (but does
&gt; &gt; &gt; work on IRC but only before anything is spilled).
&gt; &gt; &gt; 
&gt; &gt; &gt; The reason it works for IRC before anything is spilled is the same reason it
&gt; &gt; &gt; works for Briggs. As we coalesce, our interference graph keeps all the
&gt; &gt; &gt; relationships we&apos;re interested in inside the interference graph. However, if
&gt; &gt; &gt; we&apos;ve already spilled, and then we do more coalescing, the interference
&gt; &gt; &gt; graph will no longer represent the constraints that would exist for an
&gt; &gt; &gt; already spilled node. This broke my implementation of biased coloring that
&gt; &gt; &gt; didn&apos;t color this use case. Perhaps it&apos;s not even worth doing this. The
&gt; &gt; &gt; algorithm would have to consider everything that coalesced into a node and
&gt; &gt; &gt; to see if any of those interfere with a biased color. It&apos;s probably easier
&gt; &gt; &gt; to just reason about the algorithm before anything makes it to the spill
&gt; &gt; &gt; stack. (Again, for Briggs, this is the only way to reason about it, since we
&gt; &gt; &gt; run coalescing until we&apos;re done, and then we simplify.)
&gt; &gt; 
&gt; &gt; Actually, this doesn&apos;t fit easily into IRC. I&apos;d have to do the more
&gt; &gt; complicated thing to determine if it&apos;s safe to perform a biased coloring. In
&gt; &gt; Briggs, this is just natural.
&gt; 
&gt; Hmmm, actually, after thinking about various interference graphs, I don&apos;t
&gt; what I said is quite correct. I don&apos;t think it could happen, given how we
&gt; consider a node&apos;s adjacency list. So, given that, I&apos;m not quite sure why
&gt; biased coloring is breaking IRC.
Ok. Nevermind again. I&apos;ve just come up with some simple examples that breaks my code for how I do biased coloring in IRC and it&apos;s because the statement I said above. I need to think more about how biased coloring can work in IRC.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1279001</commentid>
    <comment_count>17</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-02-20 11:04:12 -0800</bug_when>
    <thetext>I was doing biased coloring slightly wrong. I was doing it after all the colors were selected. The right way to do it is while selecting the colors.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1279009</commentid>
    <comment_count>18</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-02-20 11:25:01 -0800</bug_when>
    <thetext>I&apos;ll land biased coloring in a follow up patch just to make it more easily comparable perf wise.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1279032</commentid>
    <comment_count>19</comment_count>
      <attachid>302167</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-02-20 12:53:28 -0800</bug_when>
    <thetext>Created attachment 302167
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1279033</commentid>
    <comment_count>20</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2017-02-20 12:55:45 -0800</bug_when>
    <thetext>Attachment 302167 did not pass style-queue:


ERROR: Source/JavaScriptCore/b3/air/AirGenerate.cpp:39:  Alphabetical sorting problem.  [build/include_order] [4]
Total errors found: 1 in 9 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>1279035</commentid>
    <comment_count>21</comment_count>
      <attachid>302168</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-02-20 12:57:10 -0800</bug_when>
    <thetext>Created attachment 302168
patch

Fix style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1279115</commentid>
    <comment_count>22</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-02-20 16:20:30 -0800</bug_when>
    <thetext>Not sure why gcc in the gtk build is mad. Perhaps it&apos;s my lambda with an auto parameter.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1279632</commentid>
    <comment_count>23</comment_count>
      <attachid>302168</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-02-21 16:28:55 -0800</bug_when>
    <thetext>Comment on attachment 302168
patch

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

Looks reasonable to me.

&gt; Source/JavaScriptCore/b3/air/AirRegisterAllocator.h:43
&gt; +void allocateRegisters(Code&amp;);

I like when compiler phases have the most precise and concise name.  For example, we say eliminateCommonSubexpressions rather than eliminateRedundantCode, because CSE refers to a more specific algorithm.

So, it would be better to call this &quot;GraphColoring&quot;.  But in the tradition of B3 and Air compiler phases being verb phrases, I&apos;d be fine with a verb phrase, too.  Some ideas:

allocateRegistersByGraphColoring
colorInterferenceGraph
lowerTmpsByColoringGraph

&quot;allocateRegistersByGraphColoring&quot; seems the most WebKitey name, and I like those kinds of names for phases.

I&apos;m not picky, so long as it calls out that this a graph coloring algorithm.  I&apos;m fine with it just being AirGraphColoring.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1279731</commentid>
    <comment_count>24</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-02-21 19:25:30 -0800</bug_when>
    <thetext>(In reply to comment #23)
&gt; Comment on attachment 302168 [details]
&gt; patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=302168&amp;action=review
&gt; 
&gt; Looks reasonable to me.
&gt; 
&gt; &gt; Source/JavaScriptCore/b3/air/AirRegisterAllocator.h:43
&gt; &gt; +void allocateRegisters(Code&amp;);
&gt; 
&gt; I like when compiler phases have the most precise and concise name.  For
&gt; example, we say eliminateCommonSubexpressions rather than
&gt; eliminateRedundantCode, because CSE refers to a more specific algorithm.
&gt; 
&gt; So, it would be better to call this &quot;GraphColoring&quot;.  But in the tradition
&gt; of B3 and Air compiler phases being verb phrases, I&apos;d be fine with a verb
&gt; phrase, too.  Some ideas:
&gt; 
&gt; allocateRegistersByGraphColoring
&gt; colorInterferenceGraph
&gt; lowerTmpsByColoringGraph
&gt; 
&gt; &quot;allocateRegistersByGraphColoring&quot; seems the most WebKitey name, and I like
&gt; those kinds of names for phases.
&gt; 
&gt; I&apos;m not picky, so long as it calls out that this a graph coloring algorithm.
&gt; I&apos;m fine with it just being AirGraphColoring.

I&apos;ll go with &quot;allocateRegistersByGraphColoring&quot; and name the files &quot;AirGraphColoring.*&quot;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1279739</commentid>
    <comment_count>25</comment_count>
      <attachid>302357</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-02-21 19:54:28 -0800</bug_when>
    <thetext>Created attachment 302357
patch for landing testing gtk to see if it builds</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1279741</commentid>
    <comment_count>26</comment_count>
      <attachid>302358</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-02-21 19:55:43 -0800</bug_when>
    <thetext>Created attachment 302358
patch for landing testing gtk to see if it builds v2</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1279743</commentid>
    <comment_count>27</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2017-02-21 19:58:47 -0800</bug_when>
    <thetext>Attachment 302358 did not pass style-queue:


ERROR: Source/JavaScriptCore/b3/air/AirGenerate.cpp:39:  Alphabetical sorting problem.  [build/include_order] [4]
Total errors found: 1 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>1279744</commentid>
    <comment_count>28</comment_count>
      <attachid>302359</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-02-21 20:06:50 -0800</bug_when>
    <thetext>Created attachment 302359
patch for landing testing gtk to see if it builds v3</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1279749</commentid>
    <comment_count>29</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-02-21 20:16:56 -0800</bug_when>
    <thetext>Ok, gtk EWS looks to be making forward progress. Ima land it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1279750</commentid>
    <comment_count>30</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-02-21 20:20:12 -0800</bug_when>
    <thetext>landed in:
https://trac.webkit.org/changeset/212799</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1279754</commentid>
    <comment_count>31</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-02-21 20:31:13 -0800</bug_when>
    <thetext>(In reply to comment #24)
&gt; (In reply to comment #23)
&gt; &gt; Comment on attachment 302168 [details]
&gt; &gt; patch
&gt; &gt; 
&gt; &gt; View in context:
&gt; &gt; https://bugs.webkit.org/attachment.cgi?id=302168&amp;action=review
&gt; &gt; 
&gt; &gt; Looks reasonable to me.
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/b3/air/AirRegisterAllocator.h:43
&gt; &gt; &gt; +void allocateRegisters(Code&amp;);
&gt; &gt; 
&gt; &gt; I like when compiler phases have the most precise and concise name.  For
&gt; &gt; example, we say eliminateCommonSubexpressions rather than
&gt; &gt; eliminateRedundantCode, because CSE refers to a more specific algorithm.
&gt; &gt; 
&gt; &gt; So, it would be better to call this &quot;GraphColoring&quot;.  But in the tradition
&gt; &gt; of B3 and Air compiler phases being verb phrases, I&apos;d be fine with a verb
&gt; &gt; phrase, too.  Some ideas:
&gt; &gt; 
&gt; &gt; allocateRegistersByGraphColoring
&gt; &gt; colorInterferenceGraph
&gt; &gt; lowerTmpsByColoringGraph
&gt; &gt; 
&gt; &gt; &quot;allocateRegistersByGraphColoring&quot; seems the most WebKitey name, and I like
&gt; &gt; those kinds of names for phases.
&gt; &gt; 
&gt; &gt; I&apos;m not picky, so long as it calls out that this a graph coloring algorithm.
&gt; &gt; I&apos;m fine with it just being AirGraphColoring.
&gt; 
&gt; I&apos;ll go with &quot;allocateRegistersByGraphColoring&quot; and name the files
&gt; &quot;AirGraphColoring.*&quot;

All other phases match the phase function name to the file name, so that if you see a function call to one of those phases, you immediately know what file to look into.

I think we should do the same thing here, and call these files AirAllocateRegistersByGraphColoring.*.  Can you lang a follow-up renaming?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1279783</commentid>
    <comment_count>32</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-02-21 22:37:44 -0800</bug_when>
    <thetext>(In reply to comment #31)
&gt; (In reply to comment #24)
&gt; &gt; (In reply to comment #23)
&gt; &gt; &gt; Comment on attachment 302168 [details]
&gt; &gt; &gt; patch
&gt; &gt; &gt; 
&gt; &gt; &gt; View in context:
&gt; &gt; &gt; https://bugs.webkit.org/attachment.cgi?id=302168&amp;action=review
&gt; &gt; &gt; 
&gt; &gt; &gt; Looks reasonable to me.
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Source/JavaScriptCore/b3/air/AirRegisterAllocator.h:43
&gt; &gt; &gt; &gt; +void allocateRegisters(Code&amp;);
&gt; &gt; &gt; 
&gt; &gt; &gt; I like when compiler phases have the most precise and concise name.  For
&gt; &gt; &gt; example, we say eliminateCommonSubexpressions rather than
&gt; &gt; &gt; eliminateRedundantCode, because CSE refers to a more specific algorithm.
&gt; &gt; &gt; 
&gt; &gt; &gt; So, it would be better to call this &quot;GraphColoring&quot;.  But in the tradition
&gt; &gt; &gt; of B3 and Air compiler phases being verb phrases, I&apos;d be fine with a verb
&gt; &gt; &gt; phrase, too.  Some ideas:
&gt; &gt; &gt; 
&gt; &gt; &gt; allocateRegistersByGraphColoring
&gt; &gt; &gt; colorInterferenceGraph
&gt; &gt; &gt; lowerTmpsByColoringGraph
&gt; &gt; &gt; 
&gt; &gt; &gt; &quot;allocateRegistersByGraphColoring&quot; seems the most WebKitey name, and I like
&gt; &gt; &gt; those kinds of names for phases.
&gt; &gt; &gt; 
&gt; &gt; &gt; I&apos;m not picky, so long as it calls out that this a graph coloring algorithm.
&gt; &gt; &gt; I&apos;m fine with it just being AirGraphColoring.
&gt; &gt; 
&gt; &gt; I&apos;ll go with &quot;allocateRegistersByGraphColoring&quot; and name the files
&gt; &gt; &quot;AirGraphColoring.*&quot;
&gt; 
&gt; All other phases match the phase function name to the file name, so that if
&gt; you see a function call to one of those phases, you immediately know what
&gt; file to look into.
&gt; 
&gt; I think we should do the same thing here, and call these files
&gt; AirAllocateRegistersByGraphColoring.*.  Can you lang a follow-up renaming?

Will do.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1279809</commentid>
    <comment_count>33</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-02-22 00:06:45 -0800</bug_when>
    <thetext>Fixed file name in:
https://trac.webkit.org/changeset/212813</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>302010</attachid>
            <date>2017-02-17 16:42:51 -0800</date>
            <delta_ts>2017-02-17 20:33:46 -0800</delta_ts>
            <desc>WIP</desc>
            <filename>patch.diff</filename>
            <type>text/plain</type>
            <size>33723</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlySXRlcmF0ZWRSZWdpc3RlckNv
YWxlc2NpbmcuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIv
QWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuY3BwCShyZXZpc2lvbiAyMTIxMjUpCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpckl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5n
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTIsMjggKzUyLDM4IEBAIGJvb2wgcmVwb3J0U3RhdHMg
PSBmYWxzZTsKIHRlbXBsYXRlPHR5cGVuYW1lIEluZGV4VHlwZT4KIGNsYXNzIEFic3RyYWN0Q29s
b3JpbmdBbGxvY2F0b3IgewogcHVibGljOgotICAgIEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0b3Io
Y29uc3QgVmVjdG9yPFJlZz4mIHJlZ3NJblByaW9yaXR5T3JkZXIsIEluZGV4VHlwZSBsYXN0UHJl
Y29sb3JlZFJlZ2lzdGVySW5kZXgsIHVuc2lnbmVkIHRtcEFycmF5U2l6ZSwgY29uc3QgSGFzaFNl
dDx1bnNpZ25lZD4mIHVuc3BpbGxhYmxlVG1wKQorICAgIEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0
b3IoQ29kZSYgY29kZSwgY29uc3QgVmVjdG9yPFJlZz4mIHJlZ3NJblByaW9yaXR5T3JkZXIsIElu
ZGV4VHlwZSBsYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXgsIHVuc2lnbmVkIHRtcEFycmF5U2l6
ZSwgY29uc3QgSGFzaFNldDx1bnNpZ25lZD4mIHVuc3BpbGxhYmxlVG1wKQogICAgICAgICA6IG1f
cmVnc0luUHJpb3JpdHlPcmRlcihyZWdzSW5Qcmlvcml0eU9yZGVyKQogICAgICAgICAsIG1fbGFz
dFByZWNvbG9yZWRSZWdpc3RlckluZGV4KGxhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleCkKICAg
ICAgICAgLCBtX3Vuc3BpbGxhYmxlVG1wcyh1bnNwaWxsYWJsZVRtcCkKKyAgICAgICAgLCBtX2Nv
ZGUoY29kZSkKICAgICB7Ci0gICAgICAgIGZvciAoUmVnIHJlZyA6IG1fcmVnc0luUHJpb3JpdHlP
cmRlcikKLSAgICAgICAgICAgIG1fbXV0YWJsZVJlZ3Muc2V0KHJlZyk7Ci0gICAgICAgIAotICAg
ICAgICBpbml0aWFsaXplRGVncmVlcyh0bXBBcnJheVNpemUpOwotICAgICAgICAKLSAgICAgICAg
bV9hZGphY2VuY3lMaXN0LnJlc2l6ZSh0bXBBcnJheVNpemUpOwotICAgICAgICBtX21vdmVMaXN0
LnJlc2l6ZSh0bXBBcnJheVNpemUpOwotICAgICAgICBtX2NvYWxlc2NlZFRtcHMuZmlsbCgwLCB0
bXBBcnJheVNpemUpOwotICAgICAgICBtX2lzT25TZWxlY3RTdGFjay5lbnN1cmVTaXplKHRtcEFy
cmF5U2l6ZSk7CisgICAgICAgIG1fdG1wQXJyYXlTaXplID0gdG1wQXJyYXlTaXplOworICAgICAg
ICBVTlVTRURfUEFSQU0oZGVidWcpOworCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoUmVn
IHJlZyA6IG1fcmVnc0luUHJpb3JpdHlPcmRlcikKKyAgICAgICAgICAgICAgICBtX211dGFibGVS
ZWdzLnNldChyZWcpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpbml0aWFsaXplRGVncmVl
cyh0bXBBcnJheVNpemUpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtX2FkamFjZW5jeUxp
c3QucmVzaXplKHRtcEFycmF5U2l6ZSk7CisgICAgICAgICAgICBtX21vdmVMaXN0LnJlc2l6ZSh0
bXBBcnJheVNpemUpOworICAgICAgICAgICAgbV9jb2FsZXNjZWRUbXBzLmZpbGwoMCwgdG1wQXJy
YXlTaXplKTsKKyAgICAgICAgICAgIG1faXNPblNlbGVjdFN0YWNrLmVuc3VyZVNpemUodG1wQXJy
YXlTaXplKTsKKyAgICAgICAgICAgIG1fc3BpbGxXb3JrbGlzdC5lbnN1cmVTaXplKHRtcEFycmF5
U2l6ZSk7CisgICAgICAgICAgICBtX2ludGVyZmVyZW5jZUVkZ2VzLmVuc3VyZVNpemUodG1wQXJy
YXlTaXplICogdG1wQXJyYXlTaXplKTsKKyAgICAgICAgfQogICAgIH0KIAogcHJvdGVjdGVkOgog
ICAgIEluZGV4VHlwZSBnZXRBbGlhcyhJbmRleFR5cGUgdG1wSW5kZXgpIGNvbnN0CiAgICAgewog
ICAgICAgICBJbmRleFR5cGUgYWxpYXMgPSB0bXBJbmRleDsKLSAgICAgICAgd2hpbGUgKEluZGV4
VHlwZSBuZXh0QWxpYXMgPSBtX2NvYWxlc2NlZFRtcHNbYWxpYXNdKQorICAgICAgICB3aGlsZSAo
SW5kZXhUeXBlIG5leHRBbGlhcyA9IG1fY29hbGVzY2VkVG1wc1thbGlhc10pIHsKKyAgICAgICAg
ICAgIGNvbnN0X2Nhc3Q8QWJzdHJhY3RDb2xvcmluZ0FsbG9jYXRvcjxJbmRleFR5cGU+Kj4odGhp
cyktPm1fY29hbGVzY2VkVG1wc1t0bXBJbmRleF0gPSBuZXh0QWxpYXM7CiAgICAgICAgICAgICBh
bGlhcyA9IG5leHRBbGlhczsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gYWxpYXM7CiAgICAg
fQogCkBAIC04NCwxNyArOTQsMzIgQEAgcHJvdGVjdGVkOgogICAgICAgICBhZGRFZGdlRGlzdGlu
Y3QoYSwgYik7CiAgICAgfQogCi0gICAgdm9pZCBtYWtlV29ya0xpc3QoKQorICAgIHVuc2lnbmVk
IGsoKSBjb25zdCB7IHJldHVybiBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpOyB9CisKKyAg
ICB2b2lkIG1ha2VJbml0aWFsV29ya2xpc3QoKQogICAgIHsKKyAgICAgICAgbV9zaW1wbGlmeVdv
cmtsaXN0LmNsZWFyKCk7CisgICAgICAgIG1fc3BpbGxXb3JrbGlzdC5jbGVhckFsbCgpOworCisg
ICAgICAgIGlmICh0cmFjZURlYnVnKQorICAgICAgICAgICAgZGF0YUxvZ0xuKCItLS0tLS0tLS0t
LS0tLS0tLS1cbk1ha2luZyBpbml0aWFsIHdvcmtsaXN0Iik7CisKICAgICAgICAgSW5kZXhUeXBl
IGZpcnN0Tm9uUmVnSW5kZXggPSBtX2xhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleCArIDE7Cisg
ICAgICAgIHVuc2lnbmVkIGsgPSB0aGlzLT5rKCk7CiAgICAgICAgIGZvciAoSW5kZXhUeXBlIGkg
PSBmaXJzdE5vblJlZ0luZGV4OyBpIDwgbV9kZWdyZWVzLnNpemUoKTsgKytpKSB7CisgICAgICAg
ICAgICBBU1NFUlQoIWlzUHJlY29sb3JlZChpKSk7CisgICAgICAgICAgICBpZiAoaGFzQmVlblNp
bXBsaWZpZWQoaSkpCisgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB1bnNp
Z25lZCBkZWdyZWUgPSBtX2RlZ3JlZXNbaV07Ci0gICAgICAgICAgICBpZiAoZGVncmVlID49IG1f
cmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkpCi0gICAgICAgICAgICAgICAgYWRkVG9TcGlsbChp
KTsKLSAgICAgICAgICAgIGVsc2UgaWYgKCFtX21vdmVMaXN0W2ldLmlzRW1wdHkoKSkKLSAgICAg
ICAgICAgICAgICBtX2ZyZWV6ZVdvcmtsaXN0LmFkZChpKTsKLSAgICAgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgIGlmIChkZWdyZWUgPCBrKSB7CisgICAgICAgICAgICAgICAgaWYgKHRyYWNlRGVi
dWcpCisgICAgICAgICAgICAgICAgICAgIGRhdGFMb2dMbigiQWRkaW5nICIsIGksICIgdG8gc2lt
cGxpZnkgd29ya2xpc3QiKTsKICAgICAgICAgICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuYXBw
ZW5kKGkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAodHJhY2VE
ZWJ1ZykKKyAgICAgICAgICAgICAgICAgICAgZGF0YUxvZ0xuKCJBZGRpbmcgIiwgaSwgIiB0byBz
cGlsbCB3b3JrbGlzdCIpOworICAgICAgICAgICAgICAgIGFkZFRvU3BpbGwoaSk7CisgICAgICAg
ICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTExNSw0NCArMTQwLDIyIEBAIHByb3RlY3Rl
ZDoKIAogICAgICAgICBBU1NFUlQoIW1fc2VsZWN0U3RhY2suY29udGFpbnMobGFzdEluZGV4KSk7
CiAgICAgICAgIEFTU0VSVCghbV9pc09uU2VsZWN0U3RhY2suZ2V0KGxhc3RJbmRleCkpOworICAg
ICAgICBBU1NFUlQoIW1fc3BpbGxXb3JrbGlzdC5jb250YWlucyhsYXN0SW5kZXgpKTsKKwogICAg
ICAgICBtX3NlbGVjdFN0YWNrLmFwcGVuZChsYXN0SW5kZXgpOwogICAgICAgICBtX2lzT25TZWxl
Y3RTdGFjay5xdWlja1NldChsYXN0SW5kZXgpOwogCi0gICAgICAgIGZvckVhY2hBZGphY2VudChs
YXN0SW5kZXgsIFt0aGlzXShJbmRleFR5cGUgYWRqYWNlbnRUbXBJbmRleCkgewotICAgICAgICAg
ICAgZGVjcmVtZW50RGVncmVlKGFkamFjZW50VG1wSW5kZXgpOwotICAgICAgICB9KTsKLSAgICB9
Ci0KLSAgICB2b2lkIGZyZWV6ZSgpCi0gICAgewotICAgICAgICBJbmRleFR5cGUgdmljdGltSW5k
ZXggPSBtX2ZyZWV6ZVdvcmtsaXN0LnRha2VBbnkoKTsKLSAgICAgICAgQVNTRVJUX1dJVEhfTUVT
U0FHRShnZXRBbGlhcyh2aWN0aW1JbmRleCkgPT0gdmljdGltSW5kZXgsICJjb2FsZXNjZSgpIHNo
b3VsZCBub3QgbGVhdmUgYWxpYXNlZCBUbXAgaW4gdGhlIHdvcmtsaXN0LiIpOwotICAgICAgICBt
X3NpbXBsaWZ5V29ya2xpc3QuYXBwZW5kKHZpY3RpbUluZGV4KTsKLSAgICAgICAgZnJlZXplTW92
ZXModmljdGltSW5kZXgpOwotICAgIH0KLQotICAgIHZvaWQgZnJlZXplTW92ZXMoSW5kZXhUeXBl
IHRtcEluZGV4KQotICAgIHsKLSAgICAgICAgZm9yRWFjaE5vZGVNb3Zlcyh0bXBJbmRleCwgW3Ro
aXMsIHRtcEluZGV4XSAoSW5kZXhUeXBlIG1vdmVJbmRleCkgewotICAgICAgICAgICAgaWYgKCFt
X2FjdGl2ZU1vdmVzLnF1aWNrQ2xlYXIobW92ZUluZGV4KSkKLSAgICAgICAgICAgICAgICBtX3dv
cmtsaXN0TW92ZXMudGFrZU1vdmUobW92ZUluZGV4KTsKLQotICAgICAgICAgICAgY29uc3QgTW92
ZU9wZXJhbmRzJiBtb3ZlT3BlcmFuZHMgPSBtX2NvYWxlc2NpbmdDYW5kaWRhdGVzW21vdmVJbmRl
eF07Ci0gICAgICAgICAgICBJbmRleFR5cGUgc3JjVG1wSW5kZXggPSBtb3ZlT3BlcmFuZHMuc3Jj
SW5kZXg7Ci0gICAgICAgICAgICBJbmRleFR5cGUgZHN0VG1wSW5kZXggPSBtb3ZlT3BlcmFuZHMu
ZHN0SW5kZXg7CisgICAgICAgIGlmICh0cmFjZURlYnVnKQorICAgICAgICAgICAgZGF0YUxvZ0xu
KCJTaW1wbGlmeWluZyAiLCBsYXN0SW5kZXgsICIgYnkgYWRkaW5nIGl0IHRvIHNlbGVjdCBzdGFj
ayIpOwogCi0gICAgICAgICAgICBJbmRleFR5cGUgb3JpZ2luYWxPdGhlclRtcCA9IHNyY1RtcElu
ZGV4ICE9IHRtcEluZGV4ID8gc3JjVG1wSW5kZXggOiBkc3RUbXBJbmRleDsKLSAgICAgICAgICAg
IEluZGV4VHlwZSBvdGhlclRtcEluZGV4ID0gZ2V0QWxpYXMob3JpZ2luYWxPdGhlclRtcCk7Ci0g
ICAgICAgICAgICBpZiAobV9kZWdyZWVzW290aGVyVG1wSW5kZXhdIDwgbV9yZWdzSW5Qcmlvcml0
eU9yZGVyLnNpemUoKSAmJiAhaXNNb3ZlUmVsYXRlZChvdGhlclRtcEluZGV4KSkgewotICAgICAg
ICAgICAgICAgIGlmIChtX2ZyZWV6ZVdvcmtsaXN0LnJlbW92ZShvdGhlclRtcEluZGV4KSkKLSAg
ICAgICAgICAgICAgICAgICAgbV9zaW1wbGlmeVdvcmtsaXN0LmFwcGVuZChvdGhlclRtcEluZGV4
KTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgZm9yRWFjaEFkamFjZW50KGxhc3RJbmRleCwgW3Ro
aXNdKEluZGV4VHlwZSBhZGphY2VudFRtcEluZGV4KSB7CisgICAgICAgICAgICBkZWNyZW1lbnRE
ZWdyZWVJblNpbXBsaWZpY2F0aW9uKGFkamFjZW50VG1wSW5kZXgpOwogICAgICAgICB9KTsKICAg
ICB9CiAKLSAgICB2b2lkIGNvYWxlc2NlKCkKKyAgICB0ZW1wbGF0ZSA8QXJnOjpUeXBlIHR5cGU+
CisgICAgYm9vbCBjb2FsZXNjZSh1bnNpZ25lZCYgbW92ZUluZGV4KQogICAgIHsKLSAgICAgICAg
dW5zaWduZWQgbW92ZUluZGV4ID0gbV93b3JrbGlzdE1vdmVzLnRha2VMYXN0TW92ZSgpOwogICAg
ICAgICBjb25zdCBNb3ZlT3BlcmFuZHMmIG1vdmVPcGVyYW5kcyA9IG1fY29hbGVzY2luZ0NhbmRp
ZGF0ZXNbbW92ZUluZGV4XTsKICAgICAgICAgSW5kZXhUeXBlIHUgPSBnZXRBbGlhcyhtb3ZlT3Bl
cmFuZHMuc3JjSW5kZXgpOwogICAgICAgICBJbmRleFR5cGUgdiA9IGdldEFsaWFzKG1vdmVPcGVy
YW5kcy5kc3RJbmRleCk7CkBAIC0xNjAsNTEgKzE2Myw3NSBAQCBwcm90ZWN0ZWQ6CiAgICAgICAg
IGlmIChpc1ByZWNvbG9yZWQodikpCiAgICAgICAgICAgICBzdGQ6OnN3YXAodSwgdik7CiAKLSAg
ICAgICAgaWYgKHRyYWNlRGVidWcpCi0gICAgICAgICAgICBkYXRhTG9nKCJDb2FsZXNjaW5nIG1v
dmUgYXQgaW5kZXggIiwgbW92ZUluZGV4LCAiIHUgPSAiLCB1LCAiIHYgPSAiLCB2LCAiXG4iKTsK
KyAgICAgICAgaWYgKHRyYWNlRGVidWcpIHsKKyAgICAgICAgICAgIGRhdGFMb2coIkNvYWxlc2Np
bmcgbW92ZSBhdCBpbmRleCAiLCBtb3ZlSW5kZXgsICIgdSA9ICIsIEFic29sdXRlVG1wTWFwcGVy
PHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleCh1KSwgIiB2ID0gIiwKKyAgICAgICAgICAgICAg
IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleCh2KSwgIiAgICAi
KTsKKyAgICAgICAgfQogCiAgICAgICAgIGlmICh1ID09IHYpIHsKLSAgICAgICAgICAgIGFkZFdv
cmtMaXN0KHUpOwotCiAgICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKLSAgICAgICAgICAgICAg
ICBkYXRhTG9nKCIgICAgQ29hbGVzY2VkXG4iKTsKLSAgICAgICAgfSBlbHNlIGlmIChpc1ByZWNv
bG9yZWQodikKLSAgICAgICAgICAgIHx8IG1faW50ZXJmZXJlbmNlRWRnZXMuY29udGFpbnMoSW50
ZXJmZXJlbmNlRWRnZSh1LCB2KSkKKyAgICAgICAgICAgICAgICBkYXRhTG9nKCJBbHJlYWR5IENv
YWxlc2NlZC4gVGhleSdyZSBlcXVhbC4nXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICAgICAgfQorCisgICAgICAgIGlmIChpc1ByZWNvbG9yZWQodikKKyAgICAgICAgICAgIHx8
IGhhc0ludGVyZmVyZW5jZUVkZ2UoSW50ZXJmZXJlbmNlRWRnZSh1LCB2KSkKICAgICAgICAgICAg
IHx8ICh1ID09IG1fZnJhbWVQb2ludGVySW5kZXggJiYgbV9pbnRlcmZlcmVzV2l0aEZyYW1lUG9p
bnRlci5xdWlja0dldCh2KSkpIHsKLSAgICAgICAgICAgIGFkZFdvcmtMaXN0KHUpOwotICAgICAg
ICAgICAgYWRkV29ya0xpc3Qodik7CisKKyAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gZXZlciBj
b25zaWRlciB0aGlzIG1vdmUgYWdhaW4gaWYgaXQgaW50ZXJmZXJlcy4KKyAgICAgICAgICAgIC8v
IE5vIGNvYWxlc2Npbmcgd2lsbCByZW1vdmUgdGhlIGludGVyZmVyZW5jZS4KKyAgICAgICAgICAg
IG1vdmVJbmRleCA9IFVJTlRfTUFYOworCisgICAgICAgICAgICAvLyBGSVhNRTogbWFyayBtb3Zl
IGFzIG5ldmVyIGJlaW5nIGNvYWxlc2NhYmxlIGFnYWluIChzaW5jZSB3ZSdyZSBub3QgdXNpbmcK
KyAgICAgICAgICAgIC8vIElSQywgdGhpcyBpcyBkZWZpbml0ZWx5IHRydWUpCisKKyAgICAgICAg
ICAgIGlmICghQVNTRVJUX0RJU0FCTEVEKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzUHJlY29s
b3JlZCh2KSkKKyAgICAgICAgICAgICAgICAgICAgQVNTRVJUKGlzUHJlY29sb3JlZCh1KSk7Cisg
ICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQotICAgICAgICAgICAg
ICAgIGRhdGFMb2coIiAgICBDb25zdHJhaW5lZFxuIik7Ci0gICAgICAgIH0gZWxzZSBpZiAoY2Fu
QmVTYWZlbHlDb2FsZXNjZWQodSwgdikpIHsKKyAgICAgICAgICAgICAgICBkYXRhTG9nKCJDb25z
dHJhaW5lZFxuIik7CisKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAg
ICAgICAKKyAgICAgICAgaWYgKGNhbkJlU2FmZWx5Q29hbGVzY2VkKHUsIHYpKSB7CiAgICAgICAg
ICAgICBjb21iaW5lKHUsIHYpOwotICAgICAgICAgICAgYWRkV29ya0xpc3QodSk7CiAgICAgICAg
ICAgICBtX2hhc0NvYWxlc2NlZE5vblRyaXZpYWxNb3ZlID0gdHJ1ZTsKIAogICAgICAgICAgICAg
aWYgKHRyYWNlRGVidWcpCiAgICAgICAgICAgICAgICAgZGF0YUxvZygiICAgIFNhZmUgQ29hbGVz
Y2luZ1xuIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX2FjdGl2ZU1vdmVzLnF1
aWNrU2V0KG1vdmVJbmRleCk7Ci0KLSAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQotICAgICAg
ICAgICAgICAgIGRhdGFMb2coIiAgICBGYWlsZWQgY29hbGVzY2luZywgYWRkZWQgdG8gYWN0aXZl
IG1vdmVzLlxuIik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQorCisgICAg
ICAgIC8vIEZJWE1FOiBJIHRoaW5rIHdlIGNhbiBtYXJrIG1vdmUgYXMgbmV2ZXIgYmVpbmcgY29h
bGVzY2FibGUgYWdhaW4KKyAgICAgICAgLy8gKHNpbmNlIHdlJ3JlIG5vdCB1c2luZyBJUkMsIHRo
aXMgaXMgcHJvYmFibHkgdHJ1ZSkuIElmIHRoZSBjb25zZXJ2YXRpdmUKKyAgICAgICAgLy8gaGV1
cmlzdGljIGZhaWxzLCB3aWxsIGl0IGV2ZXIgc3VjY2VlZCBpbiB0aGUgZnV0dXJlPyBJIHRoaW5r
IG5vdC4gQnV0CisgICAgICAgIC8vIG5lZWQgdG8gY29udmluY2UgbXlzZWxmLiBIbW1tLiBNYXli
ZSBpdCBjYW4sIHNpbmNlIGNvbWJpbmluZyBtYXkKKyAgICAgICAgLy8gbG93ZXIgdGhlIGRlZ3Jl
ZS4gSSBuZWVkIHRvIHRoaW5rIG1vcmUgYWJvdXQgdGhpcy4KKworICAgICAgICBpZiAodHJhY2VE
ZWJ1ZykKKyAgICAgICAgICAgIGRhdGFMb2coIiAgICBGYWlsZWQgY29hbGVzY2luZywgYWRkZWQg
dG8gYWN0aXZlIG1vdmVzLlxuIik7CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAog
ICAgIHZvaWQgYXNzaWduQ29sb3JzKCkKICAgICB7CiAgICAgICAgIEFTU0VSVChtX3NpbXBsaWZ5
V29ya2xpc3QuaXNFbXB0eSgpKTsKLSAgICAgICAgQVNTRVJUKG1fd29ya2xpc3RNb3Zlcy5pc0Vt
cHR5KCkpOwogICAgICAgICBBU1NFUlQobV9mcmVlemVXb3JrbGlzdC5pc0VtcHR5KCkpOwotICAg
ICAgICBBU1NFUlQobV9zcGlsbFdvcmtsaXN0LmlzRW1wdHkoKSk7CisgICAgICAgIEFTU0VSVCgh
bV9zcGlsbFdvcmtsaXN0LmJpdENvdW50KCkpOwogCiAgICAgICAgIC8vIFJlY2xhaW0gYXMgbXVj
aCBtZW1vcnkgYXMgcG9zc2libGUuCi0gICAgICAgIG1faW50ZXJmZXJlbmNlRWRnZXMuY2xlYXIo
KTsKKyAgICAgICAgbV9pbnRlcmZlcmVuY2VFZGdlcy5jbGVhckFsbCgpOworICAgICAgICAvL21f
aW50ZXJmZXJlbmNlRWRnZXMuY2xlYXIoKTsKKwogICAgICAgICBtX2RlZ3JlZXMuY2xlYXIoKTsK
ICAgICAgICAgbV9tb3ZlTGlzdC5jbGVhcigpOwogICAgICAgICBtX3dvcmtsaXN0TW92ZXMuY2xl
YXIoKTsKICAgICAgICAgbV9zaW1wbGlmeVdvcmtsaXN0LmNsZWFyKCk7Ci0gICAgICAgIG1fc3Bp
bGxXb3JrbGlzdC5jbGVhcigpOworICAgICAgICBtX3NwaWxsV29ya2xpc3QuY2xlYXJBbGwoKTsK
ICAgICAgICAgbV9mcmVlemVXb3JrbGlzdC5jbGVhcigpOwogCiAgICAgICAgIC8vIFRyeSB0byBj
b2xvciB0aGUgVG1wIG9uIHRoZSBzdGFjay4KQEAgLTI0Niw2ICsyNzMsMTEgQEAgcHJvdGVjdGVk
OgogICAgICAgICAgICAgbV9jb2xvcmVkVG1wLmNsZWFyKCk7CiAgICAgfQogCisgICAgYm9vbCBp
c1ByZWNvbG9yZWQoSW5kZXhUeXBlIHRtcEluZGV4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRt
cEluZGV4IDw9IG1fbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4OworICAgIH0KKwogcHJpdmF0
ZToKICAgICB2b2lkIGluaXRpYWxpemVEZWdyZWVzKHVuc2lnbmVkIHRtcEFycmF5U2l6ZSkKICAg
ICB7CkBAIC0yNjIsNyArMjk0LDggQEAgcHJpdmF0ZToKICAgICB2b2lkIGFkZEVkZ2VEaXN0aW5j
dChJbmRleFR5cGUgYSwgSW5kZXhUeXBlIGIpCiAgICAgewogICAgICAgICBBU1NFUlQoYSAhPSBi
KTsKLSAgICAgICAgaWYgKG1faW50ZXJmZXJlbmNlRWRnZXMuYWRkKEludGVyZmVyZW5jZUVkZ2Uo
YSwgYikpLmlzTmV3RW50cnkpIHsKKyAgICAgICAgYm9vbCBpc05ld0VkZ2UgPSBhZGRJbnRlcmZl
cmVuY2VFZGdlKEludGVyZmVyZW5jZUVkZ2UoYSwgYikpOworICAgICAgICBpZiAoaXNOZXdFZGdl
KSB7CiAgICAgICAgICAgICBpZiAoIWlzUHJlY29sb3JlZChhKSkgewogICAgICAgICAgICAgICAg
IEFTU0VSVCghbV9hZGphY2VuY3lMaXN0W2FdLmNvbnRhaW5zKGIpKTsKICAgICAgICAgICAgICAg
ICBtX2FkamFjZW5jeUxpc3RbYV0uYXBwZW5kKGIpOwpAQCAtMjgwLDE1ICszMTMsMjUgQEAgcHJp
dmF0ZToKICAgICB2b2lkIGRlY3JlbWVudERlZ3JlZShJbmRleFR5cGUgdG1wSW5kZXgpCiAgICAg
ewogICAgICAgICBBU1NFUlQobV9kZWdyZWVzW3RtcEluZGV4XSk7CisgICAgICAgIC0tbV9kZWdy
ZWVzW3RtcEluZGV4XTsKKyAgICB9CiAKKyAgICB2b2lkIGRlY3JlbWVudERlZ3JlZUluU2ltcGxp
ZmljYXRpb24oSW5kZXhUeXBlIHRtcEluZGV4KQorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fZGVn
cmVlc1t0bXBJbmRleF0pOwogICAgICAgICB1bnNpZ25lZCBvbGREZWdyZWUgPSBtX2RlZ3JlZXNb
dG1wSW5kZXhdLS07Ci0gICAgICAgIGlmIChvbGREZWdyZWUgPT0gbV9yZWdzSW5Qcmlvcml0eU9y
ZGVyLnNpemUoKSkgewotICAgICAgICAgICAgZW5hYmxlTW92ZXNPblZhbHVlQW5kQWRqYWNlbnRz
KHRtcEluZGV4KTsKLSAgICAgICAgICAgIG1fc3BpbGxXb3JrbGlzdC5yZW1vdmUodG1wSW5kZXgp
OwotICAgICAgICAgICAgaWYgKGlzTW92ZVJlbGF0ZWQodG1wSW5kZXgpKQotICAgICAgICAgICAg
ICAgIG1fZnJlZXplV29ya2xpc3QuYWRkKHRtcEluZGV4KTsKLSAgICAgICAgICAgIGVsc2UKLSAg
ICAgICAgICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuYXBwZW5kKHRtcEluZGV4KTsKKworICAg
ICAgICBpZiAob2xkRGVncmVlID09IGsoKSkgeworICAgICAgICAgICAgQVNTRVJUKG1fZGVncmVl
c1t0bXBJbmRleF0gPCBrKCkpOworICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpCisgICAgICAg
ICAgICAgICAgZGF0YUxvZ0xuKCJNb3ZpbmcgdG1wICIsIHRtcEluZGV4LCAiIGZyb20gc3BpbGwg
bGlzdCB0byBzaW1wbGlmeSBsaXN0IGJlY2F1c2UgaXQncyBkZWdyZWUgaXMgbm93IGxlc3MgdGhh
biBrIik7CisgICAgICAgICAgICBpZiAoIW1fdW5zcGlsbGFibGVUbXBzLmNvbnRhaW5zKHRtcElu
ZGV4KSkgeworICAgICAgICAgICAgICAgIEFTU0VSVChtX3NwaWxsV29ya2xpc3QuY29udGFpbnMo
dG1wSW5kZXgpKTsKKyAgICAgICAgICAgICAgICBtX3NwaWxsV29ya2xpc3QucXVpY2tDbGVhcih0
bXBJbmRleCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFTU0VSVCghbV9zaW1wbGlm
eVdvcmtsaXN0LmNvbnRhaW5zKHRtcEluZGV4KSk7CisgICAgICAgICAgICBtX3NpbXBsaWZ5V29y
a2xpc3QuYXBwZW5kKHRtcEluZGV4KTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjk2LDcgKzMz
OSw4IEBAIHByaXZhdGU6CiAgICAgYm9vbCBhZGRFZGdlRGlzdGluY3RXaXRob3V0RGVncmVlQ2hh
bmdlKEluZGV4VHlwZSBhLCBJbmRleFR5cGUgYikKICAgICB7CiAgICAgICAgIEFTU0VSVChhICE9
IGIpOwotICAgICAgICBpZiAobV9pbnRlcmZlcmVuY2VFZGdlcy5hZGQoSW50ZXJmZXJlbmNlRWRn
ZShhLCBiKSkuaXNOZXdFbnRyeSkgeworICAgICAgICBib29sIGlzTmV3RWRnZSA9IGFkZEludGVy
ZmVyZW5jZUVkZ2UoSW50ZXJmZXJlbmNlRWRnZShhLCBiKSk7CisgICAgICAgIGlmIChpc05ld0Vk
Z2UpIHsKICAgICAgICAgICAgIGlmICghaXNQcmVjb2xvcmVkKGEpKSB7CiAgICAgICAgICAgICAg
ICAgQVNTRVJUKCFtX2FkamFjZW5jeUxpc3RbYV0uY29udGFpbnMoYikpOwogICAgICAgICAgICAg
ICAgIG1fYWRqYWNlbmN5TGlzdFthXS5hcHBlbmQoYik7CkBAIC0zMTEsMTUgKzM1NSw2IEBAIHBy
aXZhdGU6CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBib29sIGlzTW92ZVJl
bGF0ZWQoSW5kZXhUeXBlIHRtcEluZGV4KQotICAgIHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBt
b3ZlSW5kZXggOiBtX21vdmVMaXN0W3RtcEluZGV4XSkgewotICAgICAgICAgICAgaWYgKG1fYWN0
aXZlTW92ZXMucXVpY2tHZXQobW92ZUluZGV4KSB8fCBtX3dvcmtsaXN0TW92ZXMuY29udGFpbnMo
bW92ZUluZGV4KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCiAgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rp
b24+CiAgICAgdm9pZCBmb3JFYWNoQWRqYWNlbnQoSW5kZXhUeXBlIHRtcEluZGV4LCBGdW5jdGlv
biBmdW5jdGlvbikKICAgICB7CkBAIC0zMzEsNTMgKzM2NiwxNiBAQCBwcml2YXRlOgogCiAgICAg
Ym9vbCBoYXNCZWVuU2ltcGxpZmllZChJbmRleFR5cGUgdG1wSW5kZXgpCiAgICAgewotICAgICAg
ICByZXR1cm4gbV9pc09uU2VsZWN0U3RhY2sucXVpY2tHZXQodG1wSW5kZXgpIHx8ICEhbV9jb2Fs
ZXNjZWRUbXBzW3RtcEluZGV4XTsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5j
dGlvbj4KLSAgICB2b2lkIGZvckVhY2hOb2RlTW92ZXMoSW5kZXhUeXBlIHRtcEluZGV4LCBGdW5j
dGlvbiBmdW5jdGlvbikKLSAgICB7Ci0gICAgICAgIGZvciAodW5zaWduZWQgbW92ZUluZGV4IDog
bV9tb3ZlTGlzdFt0bXBJbmRleF0pIHsKLSAgICAgICAgICAgIGlmIChtX2FjdGl2ZU1vdmVzLnF1
aWNrR2V0KG1vdmVJbmRleCkgfHwgbV93b3JrbGlzdE1vdmVzLmNvbnRhaW5zKG1vdmVJbmRleCkp
Ci0gICAgICAgICAgICAgICAgZnVuY3Rpb24obW92ZUluZGV4KTsKLSAgICAgICAgfQotICAgIH0K
LQotICAgIHZvaWQgZW5hYmxlTW92ZXNPblZhbHVlKEluZGV4VHlwZSB0bXBJbmRleCkKLSAgICB7
Ci0gICAgICAgIGZvciAodW5zaWduZWQgbW92ZUluZGV4IDogbV9tb3ZlTGlzdFt0bXBJbmRleF0p
IHsKLSAgICAgICAgICAgIGlmIChtX2FjdGl2ZU1vdmVzLnF1aWNrQ2xlYXIobW92ZUluZGV4KSkK
LSAgICAgICAgICAgICAgICBtX3dvcmtsaXN0TW92ZXMucmV0dXJuTW92ZShtb3ZlSW5kZXgpOwor
ICAgICAgICBpZiAoIUFTU0VSVF9ESVNBQkxFRCkgeworICAgICAgICAgICAgaWYgKCEhbV9jb2Fs
ZXNjZWRUbXBzW3RtcEluZGV4XSkKKyAgICAgICAgICAgICAgICBBU1NFUlQoZ2V0QWxpYXModG1w
SW5kZXgpICE9IHRtcEluZGV4KTsKICAgICAgICAgfQotICAgIH0KIAotICAgIHZvaWQgZW5hYmxl
TW92ZXNPblZhbHVlQW5kQWRqYWNlbnRzKEluZGV4VHlwZSB0bXBJbmRleCkKLSAgICB7Ci0gICAg
ICAgIGVuYWJsZU1vdmVzT25WYWx1ZSh0bXBJbmRleCk7Ci0KLSAgICAgICAgZm9yRWFjaEFkamFj
ZW50KHRtcEluZGV4LCBbdGhpc10gKEluZGV4VHlwZSBhZGphY2VudFRtcEluZGV4KSB7Ci0gICAg
ICAgICAgICBlbmFibGVNb3Zlc09uVmFsdWUoYWRqYWNlbnRUbXBJbmRleCk7Ci0gICAgICAgIH0p
OwotICAgIH0KLQotICAgIGJvb2wgaXNQcmVjb2xvcmVkKEluZGV4VHlwZSB0bXBJbmRleCkKLSAg
ICB7Ci0gICAgICAgIHJldHVybiB0bXBJbmRleCA8PSBtX2xhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJ
bmRleDsKLSAgICB9Ci0KLSAgICB2b2lkIGFkZFdvcmtMaXN0KEluZGV4VHlwZSB0bXBJbmRleCkK
LSAgICB7Ci0gICAgICAgIGlmICghaXNQcmVjb2xvcmVkKHRtcEluZGV4KSAmJiBtX2RlZ3JlZXNb
dG1wSW5kZXhdIDwgbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKSAmJiAhaXNNb3ZlUmVsYXRl
ZCh0bXBJbmRleCkpIHsKLSAgICAgICAgICAgIG1fZnJlZXplV29ya2xpc3QucmVtb3ZlKHRtcElu
ZGV4KTsKLSAgICAgICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5hcHBlbmQodG1wSW5kZXgpOwot
ICAgICAgICB9CisgICAgICAgIHJldHVybiBtX2lzT25TZWxlY3RTdGFjay5xdWlja0dldCh0bXBJ
bmRleCkgfHwgISFtX2NvYWxlc2NlZFRtcHNbdG1wSW5kZXhdOwogICAgIH0KIAogICAgIHZvaWQg
Y29tYmluZShJbmRleFR5cGUgdSwgSW5kZXhUeXBlIHYpCiAgICAgewotICAgICAgICBpZiAoIW1f
ZnJlZXplV29ya2xpc3QucmVtb3ZlKHYpKQotICAgICAgICAgICAgbV9zcGlsbFdvcmtsaXN0LnJl
bW92ZSh2KTsKLQogICAgICAgICBBU1NFUlQoIW1fY29hbGVzY2VkVG1wc1t2XSk7CiAgICAgICAg
IG1fY29hbGVzY2VkVG1wc1t2XSA9IHU7CiAKQEAgLTQwMiw5ICs0MDAsNiBAQCBwcml2YXRlOgog
CiAgICAgICAgIGlmIChtX2ZyYW1lUG9pbnRlckluZGV4ICYmIG1faW50ZXJmZXJlc1dpdGhGcmFt
ZVBvaW50ZXIucXVpY2tHZXQodikpCiAgICAgICAgICAgICBtX2ludGVyZmVyZXNXaXRoRnJhbWVQ
b2ludGVyLnF1aWNrU2V0KHUpOwotCi0gICAgICAgIGlmIChtX2RlZ3JlZXNbdV0gPj0gbV9yZWdz
SW5Qcmlvcml0eU9yZGVyLnNpemUoKSAmJiBtX2ZyZWV6ZVdvcmtsaXN0LnJlbW92ZSh1KSkKLSAg
ICAgICAgICAgIGFkZFRvU3BpbGwodSk7CiAgICAgfQogCiAgICAgYm9vbCBjYW5CZVNhZmVseUNv
YWxlc2NlZChJbmRleFR5cGUgdSwgSW5kZXhUeXBlIHYpCkBAIC00NzksNyArNDc0LDcgQEAgcHJp
dmF0ZToKICAgICAgICAgICAgIGlmICghaXNQcmVjb2xvcmVkKGFkamFjZW50VG1wSW5kZXgpCiAg
ICAgICAgICAgICAgICAgJiYgIWhhc0JlZW5TaW1wbGlmaWVkKGFkamFjZW50VG1wSW5kZXgpCiAg
ICAgICAgICAgICAgICAgJiYgbV9kZWdyZWVzW2FkamFjZW50VG1wSW5kZXhdID49IG1fcmVnc0lu
UHJpb3JpdHlPcmRlci5zaXplKCkKLSAgICAgICAgICAgICAgICAmJiAhbV9pbnRlcmZlcmVuY2VF
ZGdlcy5jb250YWlucyhJbnRlcmZlcmVuY2VFZGdlKHUsIGFkamFjZW50VG1wSW5kZXgpKSkKKyAg
ICAgICAgICAgICAgICAmJiAhaGFzSW50ZXJmZXJlbmNlRWRnZShJbnRlcmZlcmVuY2VFZGdlKHUs
IGFkamFjZW50VG1wSW5kZXgpKSkKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAg
ICAgIH0KICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC01NDgsNiArNTQzLDIwIEBAIHByb3RlY3Rl
ZDoKICAgICAgICAgdWludDY0X3QgbV92YWx1ZSB7IDAgfTsKICAgICB9OwogCisgICAgdW5zaWdu
ZWQgbV90bXBBcnJheVNpemU7CisgICAgYm9vbCBhZGRJbnRlcmZlcmVuY2VFZGdlKEludGVyZmVy
ZW5jZUVkZ2UgZWRnZSkKKyAgICB7CisgICAgICAgIC8vIHJldHVybnMgdHJ1ZSBpZiB0aGlzIGlz
IGEgbmV3IGVkZ2UuCisgICAgICAgIHJldHVybiBtX2ludGVyZmVyZW5jZUVkZ2VzLmFkZChlZGdl
LmZpcnN0KCkqbV90bXBBcnJheVNpemUgKyBlZGdlLnNlY29uZCgpKTsKKyAgICAgICAgLy9yZXR1
cm4gbV9pbnRlcmZlcmVuY2VFZGdlcy5hZGQoZWRnZSkuaXNOZXdFbnRyeTsKKyAgICB9CisKKyAg
ICBib29sIGhhc0ludGVyZmVyZW5jZUVkZ2UoSW50ZXJmZXJlbmNlRWRnZSBlZGdlKQorICAgIHsK
KyAgICAgICAgcmV0dXJuIG1faW50ZXJmZXJlbmNlRWRnZXMucXVpY2tHZXQoZWRnZS5maXJzdCgp
Km1fdG1wQXJyYXlTaXplICsgZWRnZS5zZWNvbmQoKSk7CisgICAgICAgIC8vcmV0dXJuIG1faW50
ZXJmZXJlbmNlRWRnZXMuY29udGFpbnMoZWRnZSk7CisgICAgfQorCiAgICAgc3RydWN0IEludGVy
ZmVyZW5jZUVkZ2VIYXNoIHsKICAgICAgICAgc3RhdGljIHVuc2lnbmVkIGhhc2goY29uc3QgSW50
ZXJmZXJlbmNlRWRnZSYga2V5KSB7IHJldHVybiBrZXkuaGFzaCgpOyB9CiAgICAgICAgIHN0YXRp
YyBib29sIGVxdWFsKGNvbnN0IEludGVyZmVyZW5jZUVkZ2UmIGEsIGNvbnN0IEludGVyZmVyZW5j
ZUVkZ2UmIGIpIHsgcmV0dXJuIGEgPT0gYjsgfQpAQCAtNTYwLDcgKzU2OSw5IEBAIHByb3RlY3Rl
ZDoKICAgICBJbmRleFR5cGUgbV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXggeyAwIH07CiAK
ICAgICAvLyBUaGUgaW50ZXJmZXJlbmNlIGdyYXBoLgotICAgIEhhc2hTZXQ8SW50ZXJmZXJlbmNl
RWRnZSwgSW50ZXJmZXJlbmNlRWRnZUhhc2gsIEludGVyZmVyZW5jZUVkZ2VIYXNoVHJhaXRzPiBt
X2ludGVyZmVyZW5jZUVkZ2VzOworICAgIC8vSGFzaFNldDxJbnRlcmZlcmVuY2VFZGdlLCBJbnRl
cmZlcmVuY2VFZGdlSGFzaCwgSW50ZXJmZXJlbmNlRWRnZUhhc2hUcmFpdHM+IG1faW50ZXJmZXJl
bmNlRWRnZXM7CisgICAgQml0VmVjdG9yIG1faW50ZXJmZXJlbmNlRWRnZXM7CisKICAgICBWZWN0
b3I8VmVjdG9yPEluZGV4VHlwZSwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3csIDQ+LCAwLCBVbnNh
ZmVWZWN0b3JPdmVyZmxvdz4gbV9hZGphY2VuY3lMaXN0OwogICAgIFZlY3RvcjxJbmRleFR5cGUs
IDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX2RlZ3JlZXM7CiAKQEAgLTU5MywxMjAgKzYwNCw1
NyBAQCBwcm90ZWN0ZWQ6CiAgICAgICAgIHVuc2lnbmVkIGFkZE1vdmUoKQogICAgICAgICB7CiAg
ICAgICAgICAgICBBU1NFUlQobV9sb3dQcmlvcml0eU1vdmVMaXN0LmlzRW1wdHkoKSk7Ci0gICAg
ICAgICAgICBBU1NFUlQoIW1fZmlyc3RMb3dQcmlvcml0eU1vdmVJbmRleCk7CiAKLSAgICAgICAg
ICAgIHVuc2lnbmVkIG5leHRJbmRleCA9IG1fcG9zaXRpb25Jbk1vdmVMaXN0LnNpemUoKTsKLSAg
ICAgICAgICAgIHVuc2lnbmVkIHBvc2l0aW9uID0gbV9tb3ZlTGlzdC5zaXplKCk7CisgICAgICAg
ICAgICB1bnNpZ25lZCBuZXh0SW5kZXggPSBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdCsrOwogICAgICAg
ICAgICAgbV9tb3ZlTGlzdC5hcHBlbmQobmV4dEluZGV4KTsKLSAgICAgICAgICAgIG1fcG9zaXRp
b25Jbk1vdmVMaXN0LmFwcGVuZChwb3NpdGlvbik7CiAgICAgICAgICAgICByZXR1cm4gbmV4dElu
ZGV4OwogICAgICAgICB9CiAKICAgICAgICAgdm9pZCBzdGFydEFkZGluZ0xvd1ByaW9yaXR5TW92
ZXMoKQogICAgICAgICB7CiAgICAgICAgICAgICBBU1NFUlQobV9sb3dQcmlvcml0eU1vdmVMaXN0
LmlzRW1wdHkoKSk7Ci0gICAgICAgICAgICBtX2ZpcnN0TG93UHJpb3JpdHlNb3ZlSW5kZXggPSBt
X21vdmVMaXN0LnNpemUoKTsKICAgICAgICAgfQogCiAgICAgICAgIHVuc2lnbmVkIGFkZExvd1By
aW9yaXR5TW92ZSgpCiAgICAgICAgIHsKLSAgICAgICAgICAgIEFTU0VSVChtX2ZpcnN0TG93UHJp
b3JpdHlNb3ZlSW5kZXggPT0gbV9tb3ZlTGlzdC5zaXplKCkpOwotCi0gICAgICAgICAgICB1bnNp
Z25lZCBuZXh0SW5kZXggPSBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdC5zaXplKCk7Ci0gICAgICAgICAg
ICB1bnNpZ25lZCBwb3NpdGlvbiA9IG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5zaXplKCk7CisgICAg
ICAgICAgICB1bnNpZ25lZCBuZXh0SW5kZXggPSBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdCsrOwogICAg
ICAgICAgICAgbV9sb3dQcmlvcml0eU1vdmVMaXN0LmFwcGVuZChuZXh0SW5kZXgpOwotICAgICAg
ICAgICAgbV9wb3NpdGlvbkluTW92ZUxpc3QuYXBwZW5kKHBvc2l0aW9uKTsKLQotICAgICAgICAg
ICAgQVNTRVJUKG5leHRJbmRleCA+PSBtX2ZpcnN0TG93UHJpb3JpdHlNb3ZlSW5kZXgpOwogCiAg
ICAgICAgICAgICByZXR1cm4gbmV4dEluZGV4OwogICAgICAgICB9CiAKLSAgICAgICAgYm9vbCBp
c0VtcHR5KCkgY29uc3QKKyAgICAgICAgLy8gV2UgdXNlIHJlZmVyZW5jZXMgdG8gbW92ZXMgaGVy
ZSBiZWNhdXNlIHRoZSBmdW5jdGlvbgorICAgICAgICAvLyBtYXkgZG8gY29hbGVzY2luZywgaW5k
aWNhdGluZyBpdCBkb2Vzbid0IG5lZWQgdG8gc2VlCisgICAgICAgIC8vIHRoZSBtb3ZlIGFnYWlu
LgorICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4KKyAgICAgICAgdm9pZCBmb3JFYWNoTW92
ZShGIGYpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtX21vdmVMaXN0LmlzRW1wdHko
KSAmJiBtX2xvd1ByaW9yaXR5TW92ZUxpc3QuaXNFbXB0eSgpOwotICAgICAgICB9Ci0KLSAgICAg
ICAgYm9vbCBjb250YWlucyh1bnNpZ25lZCBpbmRleCkKLSAgICAgICAgewotICAgICAgICAgICAg
cmV0dXJuIG1fcG9zaXRpb25Jbk1vdmVMaXN0W2luZGV4XSAhPSBzdGQ6Om51bWVyaWNfbGltaXRz
PHVuc2lnbmVkPjo6bWF4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHRha2VNb3ZlKHVu
c2lnbmVkIG1vdmVJbmRleCkKLSAgICAgICAgewotICAgICAgICAgICAgdW5zaWduZWQgcG9zaXRp
b25Jbk1vdmVMaXN0ID0gbV9wb3NpdGlvbkluTW92ZUxpc3RbbW92ZUluZGV4XTsKLSAgICAgICAg
ICAgIGlmIChwb3NpdGlvbkluTW92ZUxpc3QgPT0gc3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25l
ZD46Om1heCgpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgaWYgKG1v
dmVJbmRleCA8IG1fZmlyc3RMb3dQcmlvcml0eU1vdmVJbmRleCkgewotICAgICAgICAgICAgICAg
IEFTU0VSVChtX21vdmVMaXN0W3Bvc2l0aW9uSW5Nb3ZlTGlzdF0gPT0gbW92ZUluZGV4KTsKLSAg
ICAgICAgICAgICAgICB1bnNpZ25lZCBsYXN0SW5kZXggPSBtX21vdmVMaXN0Lmxhc3QoKTsKLSAg
ICAgICAgICAgICAgICBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdFtsYXN0SW5kZXhdID0gcG9zaXRpb25J
bk1vdmVMaXN0OwotICAgICAgICAgICAgICAgIG1fbW92ZUxpc3RbcG9zaXRpb25Jbk1vdmVMaXN0
XSA9IGxhc3RJbmRleDsKLSAgICAgICAgICAgICAgICBtX21vdmVMaXN0LnJlbW92ZUxhc3QoKTsK
LSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQVNTRVJUKG1fbG93UHJpb3Jp
dHlNb3ZlTGlzdFtwb3NpdGlvbkluTW92ZUxpc3RdID09IG1vdmVJbmRleCk7Ci0gICAgICAgICAg
ICAgICAgdW5zaWduZWQgbGFzdEluZGV4ID0gbV9sb3dQcmlvcml0eU1vdmVMaXN0Lmxhc3QoKTsK
LSAgICAgICAgICAgICAgICBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdFtsYXN0SW5kZXhdID0gcG9zaXRp
b25Jbk1vdmVMaXN0OwotICAgICAgICAgICAgICAgIG1fbG93UHJpb3JpdHlNb3ZlTGlzdFtwb3Np
dGlvbkluTW92ZUxpc3RdID0gbGFzdEluZGV4OwotICAgICAgICAgICAgICAgIG1fbG93UHJpb3Jp
dHlNb3ZlTGlzdC5yZW1vdmVMYXN0KCk7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkJiBtb3Zl
IDogbV9tb3ZlTGlzdCkgeworICAgICAgICAgICAgICAgIGlmIChtb3ZlICE9IFVJTlRfTUFYKQor
ICAgICAgICAgICAgICAgICAgICBmKG1vdmUpOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAg
ICBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdFttb3ZlSW5kZXhdID0gc3RkOjpudW1lcmljX2xpbWl0czx1
bnNpZ25lZD46Om1heCgpOwotCi0gICAgICAgICAgICBBU1NFUlQoIWNvbnRhaW5zKG1vdmVJbmRl
eCkpOwogICAgICAgICB9CiAKLSAgICAgICAgdW5zaWduZWQgdGFrZUxhc3RNb3ZlKCkKKyAgICAg
ICAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+CisgICAgICAgIHZvaWQgZm9yRWFjaExvd1ByaW9yaXR5
TW92ZShGIGYpCiAgICAgICAgIHsKLSAgICAgICAgICAgIEFTU0VSVCghaXNFbXB0eSgpKTsKLQot
ICAgICAgICAgICAgdW5zaWduZWQgbGFzdEluZGV4OwotICAgICAgICAgICAgaWYgKCFtX21vdmVM
aXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGxhc3RJbmRleCA9IG1fbW92ZUxpc3Qu
dGFrZUxhc3QoKTsKLSAgICAgICAgICAgICAgICBBU1NFUlQobV9wb3NpdGlvbkluTW92ZUxpc3Rb
bGFzdEluZGV4XSA9PSBtX21vdmVMaXN0LnNpemUoKSk7Ci0gICAgICAgICAgICB9IGVsc2Ugewot
ICAgICAgICAgICAgICAgIGxhc3RJbmRleCA9IG1fbG93UHJpb3JpdHlNb3ZlTGlzdC50YWtlTGFz
dCgpOwotICAgICAgICAgICAgICAgIEFTU0VSVChtX3Bvc2l0aW9uSW5Nb3ZlTGlzdFtsYXN0SW5k
ZXhdID09IG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5zaXplKCkpOworICAgICAgICAgICAgZm9yICh1
bnNpZ25lZCYgbW92ZSA6IG1fbG93UHJpb3JpdHlNb3ZlTGlzdCkgeworICAgICAgICAgICAgICAg
IGlmIChtb3ZlICE9IFVJTlRfTUFYKQorICAgICAgICAgICAgICAgICAgICBmKG1vdmUpOwogICAg
ICAgICAgICAgfQotICAgICAgICAgICAgbV9wb3NpdGlvbkluTW92ZUxpc3RbbGFzdEluZGV4XSA9
IHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgoKTsKLQotICAgICAgICAgICAgQVNT
RVJUKCFjb250YWlucyhsYXN0SW5kZXgpKTsKLSAgICAgICAgICAgIHJldHVybiBsYXN0SW5kZXg7
Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHJldHVybk1vdmUodW5zaWduZWQgaW5kZXgpCi0g
ICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRoaXMgYXNzZXJ0aW9uIGlzIGEgYml0IHN0cmljdCBi
dXQgdGhhdCBpcyBob3cgdGhlIG1vdmUgbGlzdCBzaG91bGQgYmUgdXNlZC4gVGhlIG9ubHkga2lu
ZCBvZiBtb3ZlcyB0aGF0IGNhbgotICAgICAgICAgICAgLy8gcmV0dXJuIHRvIHRoZSBsaXN0IGFy
ZSB0aGUgb25lcyB0aGF0IHdlIHByZXZpb3VzbHkgZmFpbGVkIHRvIGNvYWxlc2NlIHdpdGggdGhl
IGNvbnNlcnZhdGl2ZSBoZXVyaXN0aWNzLgotICAgICAgICAgICAgLy8gVmFsdWVzIHNob3VsZCBu
b3QgYmUgYWRkZWQgYmFjayBpZiB0aGV5IHdlcmUgbmV2ZXIgdGFrZW4gb3V0IHdoZW4gYXR0ZW1w
dGluZyBjb2FsZXNjaW5nLgotICAgICAgICAgICAgQVNTRVJUKCFjb250YWlucyhpbmRleCkpOwot
Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCBtX2ZpcnN0TG93UHJpb3JpdHlNb3ZlSW5kZXgpIHsK
LSAgICAgICAgICAgICAgICB1bnNpZ25lZCBwb3NpdGlvbiA9IG1fbW92ZUxpc3Quc2l6ZSgpOwot
ICAgICAgICAgICAgICAgIG1fbW92ZUxpc3QuYXBwZW5kKGluZGV4KTsKLSAgICAgICAgICAgICAg
ICBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdFtpbmRleF0gPSBwb3NpdGlvbjsKLSAgICAgICAgICAgIH0g
ZWxzZSB7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgcG9zaXRpb24gPSBtX2xvd1ByaW9yaXR5
TW92ZUxpc3Quc2l6ZSgpOwotICAgICAgICAgICAgICAgIG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5h
cHBlbmQoaW5kZXgpOwotICAgICAgICAgICAgICAgIG1fcG9zaXRpb25Jbk1vdmVMaXN0W2luZGV4
XSA9IHBvc2l0aW9uOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBU1NFUlQoY29udGFp
bnMoaW5kZXgpKTsKICAgICAgICAgfQogCiAgICAgICAgIHZvaWQgY2xlYXIoKQogICAgICAgICB7
Ci0gICAgICAgICAgICBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdC5jbGVhcigpOworICAgICAgICAgICAg
bV9wb3NpdGlvbkluTW92ZUxpc3QgPSAwOwogICAgICAgICAgICAgbV9tb3ZlTGlzdC5jbGVhcigp
OwogICAgICAgICAgICAgbV9sb3dQcmlvcml0eU1vdmVMaXN0LmNsZWFyKCk7CiAgICAgICAgIH0K
IAogICAgIHByaXZhdGU6Ci0gICAgICAgIFZlY3Rvcjx1bnNpZ25lZCwgMCwgVW5zYWZlVmVjdG9y
T3ZlcmZsb3c+IG1fcG9zaXRpb25Jbk1vdmVMaXN0OworICAgICAgICB1bnNpZ25lZCBtX3Bvc2l0
aW9uSW5Nb3ZlTGlzdDsKICAgICAgICAgVmVjdG9yPHVuc2lnbmVkLCAwLCBVbnNhZmVWZWN0b3JP
dmVyZmxvdz4gbV9tb3ZlTGlzdDsKICAgICAgICAgVmVjdG9yPHVuc2lnbmVkLCAwLCBVbnNhZmVW
ZWN0b3JPdmVyZmxvdz4gbV9sb3dQcmlvcml0eU1vdmVMaXN0OwotICAgICAgICB1bnNpZ25lZCBt
X2ZpcnN0TG93UHJpb3JpdHlNb3ZlSW5kZXggeyAwIH07CiAgICAgfTsKIAogICAgIC8vIFdvcmsg
bGlzdHMuCkBAIC03MTcsNyArNjY1LDcgQEAgcHJvdGVjdGVkOgogICAgIC8vIExvdy1kZWdyZWUs
IG5vbi1Nb3ZlIHJlbGF0ZWQuCiAgICAgVmVjdG9yPEluZGV4VHlwZT4gbV9zaW1wbGlmeVdvcmts
aXN0OwogICAgIC8vIEhpZ2gtZGVncmVlIFRtcC4KLSAgICBIYXNoU2V0PEluZGV4VHlwZT4gbV9z
cGlsbFdvcmtsaXN0OworICAgIEJpdFZlY3RvciBtX3NwaWxsV29ya2xpc3Q7CiAgICAgLy8gTG93
LWRlZ3JlZSwgTW92ZSByZWxhdGVkLgogICAgIEhhc2hTZXQ8SW5kZXhUeXBlPiBtX2ZyZWV6ZVdv
cmtsaXN0OwogCkBAIC03MjgsNiArNjc2LDcgQEAgcHJvdGVjdGVkOgogICAgIFZlY3RvcjxJbmRl
eFR5cGUsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX2NvYWxlc2NlZFRtcHNBdFNwaWxsOwog
ICAgIAogICAgIGNvbnN0IEhhc2hTZXQ8dW5zaWduZWQ+JiBtX3Vuc3BpbGxhYmxlVG1wczsKKyAg
ICBDb2RlJiBtX2NvZGU7CiB9OwogCiAvLyBUaGlzIHBlcmZvcm0gYWxsIHRoZSB0YXNrcyB0aGF0
IGFyZSBzcGVjaWZpYyB0byBjZXJ0YWluIHJlZ2lzdGVyIHR5cGUuCkBAIC03MzUsOCArNjg0LDcg
QEAgdGVtcGxhdGU8QXJnOjpUeXBlIHR5cGU+CiBjbGFzcyBDb2xvcmluZ0FsbG9jYXRvciA6IHB1
YmxpYyBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yPHVuc2lnbmVkPiB7CiBwdWJsaWM6CiAgICAg
Q29sb3JpbmdBbGxvY2F0b3IoQ29kZSYgY29kZSwgVG1wV2lkdGgmIHRtcFdpZHRoLCBjb25zdCBV
c2VDb3VudHM8VG1wPiYgdXNlQ291bnRzLCBjb25zdCBIYXNoU2V0PHVuc2lnbmVkPiYgdW5zcGls
bGFibGVUbXApCi0gICAgICAgIDogQWJzdHJhY3RDb2xvcmluZ0FsbG9jYXRvcjx1bnNpZ25lZD4o
Y29kZS5yZWdzSW5Qcmlvcml0eU9yZGVyKHR5cGUpLCBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6
bGFzdE1hY2hpbmVSZWdpc3RlckluZGV4KCksIHRtcEFycmF5U2l6ZShjb2RlKSwgdW5zcGlsbGFi
bGVUbXApCi0gICAgICAgICwgbV9jb2RlKGNvZGUpCisgICAgICAgIDogQWJzdHJhY3RDb2xvcmlu
Z0FsbG9jYXRvcjx1bnNpZ25lZD4oY29kZSwgY29kZS5yZWdzSW5Qcmlvcml0eU9yZGVyKHR5cGUp
LCBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6bGFzdE1hY2hpbmVSZWdpc3RlckluZGV4KCksIHRt
cEFycmF5U2l6ZShjb2RlKSwgdW5zcGlsbGFibGVUbXApCiAgICAgICAgICwgbV90bXBXaWR0aCh0
bXBXaWR0aCkKICAgICAgICAgLCBtX3VzZUNvdW50cyh1c2VDb3VudHMpCiAgICAgewpAQCAtNzQ0
LDEwICs2OTIsNiBAQCBwdWJsaWM6CiAgICAgICAgICAgICBtX2ZyYW1lUG9pbnRlckluZGV4ID0g
QWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgoVG1wKE1hY3JvQXNzZW1ibGVy
OjpmcmFtZVBvaW50ZXJSZWdpc3RlcikpOwogICAgICAgICAgICAgbV9pbnRlcmZlcmVzV2l0aEZy
YW1lUG9pbnRlci5lbnN1cmVTaXplKHRtcEFycmF5U2l6ZShjb2RlKSk7CiAgICAgICAgIH0KLQot
ICAgICAgICBpbml0aWFsaXplUHJlY29sb3JlZFRtcCgpOwotICAgICAgICBidWlsZCgpOwotICAg
ICAgICBhbGxvY2F0ZSgpOwogICAgIH0KIAogICAgIFRtcCBnZXRBbGlhcyhUbXAgdG1wKSBjb25z
dApAQCAtODUzLDcgKzc5Nyw3IEBAIHB1YmxpYzoKICAgICAgICAgcmV0dXJuIHJlZzsKICAgICB9
CiAKLXByaXZhdGU6CisvL3ByaXZhdGU6CiAgICAgc3RhdGljIHVuc2lnbmVkIHRtcEFycmF5U2l6
ZShDb2RlJiBjb2RlKQogICAgIHsKICAgICAgICAgdW5zaWduZWQgbnVtVG1wcyA9IGNvZGUubnVt
VG1wcyh0eXBlKTsKQEAgLTg4Nyw3ICs4MzEsOCBAQCBwcml2YXRlOgogICAgICAgICB1bnNpZ25l
ZCBsZWZ0SW5kZXggPSBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChsZWZ0
VG1wKTsKICAgICAgICAgdW5zaWduZWQgcmlnaHRJbmRleCA9IEFic29sdXRlVG1wTWFwcGVyPHR5
cGU+OjphYnNvbHV0ZUluZGV4KHJpZ2h0VG1wKTsKIAotICAgICAgICByZXR1cm4gIW1faW50ZXJm
ZXJlbmNlRWRnZXMuY29udGFpbnMoSW50ZXJmZXJlbmNlRWRnZShsZWZ0SW5kZXgsIHJpZ2h0SW5k
ZXgpKTsKKyAgICAgICAgLy9yZXR1cm4gIW1faW50ZXJmZXJlbmNlRWRnZXMuY29udGFpbnMoSW50
ZXJmZXJlbmNlRWRnZShsZWZ0SW5kZXgsIHJpZ2h0SW5kZXgpKTsKKyAgICAgICAgcmV0dXJuICFo
YXNJbnRlcmZlcmVuY2VFZGdlKEludGVyZmVyZW5jZUVkZ2UobGVmdEluZGV4LCByaWdodEluZGV4
KSk7CiAgICAgfQogCiAgICAgdm9pZCBhZGRUb0xvd1ByaW9yaXR5Q29hbGVzY2luZ0NhbmRpZGF0
ZXMoQXJnIGxlZnQsIEFyZyByaWdodCkKQEAgLTkwNSwxNSArODUwLDE1IEBAIHByaXZhdGU6CiAg
ICAgICAgIHVuc2lnbmVkIG5ld0luZGV4SW5Xb3JrbGlzdCA9IG1fd29ya2xpc3RNb3Zlcy5hZGRM
b3dQcmlvcml0eU1vdmUoKTsKICAgICAgICAgQVNTRVJUX1VOVVNFRChuZXdJbmRleEluV29ya2xp
c3QsIG5ld0luZGV4SW5Xb3JrbGlzdCA9PSBuZXh0TW92ZUluZGV4KTsKIAotICAgICAgICBBU1NF
UlQobmV4dE1vdmVJbmRleCA8PSBtX2FjdGl2ZU1vdmVzLnNpemUoKSk7Ci0gICAgICAgIG1fYWN0
aXZlTW92ZXMuZW5zdXJlU2l6ZShuZXh0TW92ZUluZGV4ICsgMSk7Ci0KICAgICAgICAgbV9tb3Zl
TGlzdFtsZWZ0SW5kZXhdLmFkZChuZXh0TW92ZUluZGV4KTsKICAgICAgICAgbV9tb3ZlTGlzdFty
aWdodEluZGV4XS5hZGQobmV4dE1vdmVJbmRleCk7CiAgICAgfQogCiAgICAgdm9pZCBidWlsZCgp
CiAgICAgeworICAgICAgICBtX2NvYWxlc2NpbmdDYW5kaWRhdGVzLmNsZWFyKCk7CisgICAgICAg
IG1fd29ya2xpc3RNb3Zlcy5jbGVhcigpOworCiAgICAgICAgIFRtcExpdmVuZXNzPHR5cGU+IGxp
dmVuZXNzKG1fY29kZSk7CiAgICAgICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBtX2NvZGUp
IHsKICAgICAgICAgICAgIHR5cGVuYW1lIFRtcExpdmVuZXNzPHR5cGU+OjpMb2NhbENhbGMgbG9j
YWxDYWxjKGxpdmVuZXNzLCBibG9jayk7CkBAIC05MzIsNiArODc3LDcgQEAgcHJpdmF0ZToKICAg
ICB7CiAgICAgICAgIGlmICh0cmFjZURlYnVnKQogICAgICAgICAgICAgZGF0YUxvZygiQnVpbGRp
bmcgYmV0d2VlbiAiLCBwb2ludGVyRHVtcChwcmV2SW5zdCksICIgYW5kICIsIHBvaW50ZXJEdW1w
KG5leHRJbnN0KSwgIjpcbiIpOworCiAgICAgICAgIEluc3Q6OmZvckVhY2hEZWZXaXRoRXh0cmFD
bG9iYmVyZWRSZWdzPFRtcD4oCiAgICAgICAgICAgICBwcmV2SW5zdCwgbmV4dEluc3QsCiAgICAg
ICAgICAgICBbJl0gKGNvbnN0IFRtcCYgYXJnLCBBcmc6OlJvbGUsIEFyZzo6VHlwZSBhcmdUeXBl
LCBBcmc6OldpZHRoKSB7CkBAIC05NzIsMTMgKzkxOCwxMiBAQCBwcml2YXRlOgogCiAgICAgICAg
ICAgICB1bnNpZ25lZCBuZXh0TW92ZUluZGV4ID0gbV9jb2FsZXNjaW5nQ2FuZGlkYXRlcy5zaXpl
KCk7CiAgICAgICAgICAgICBtX2NvYWxlc2NpbmdDYW5kaWRhdGVzLmFwcGVuZCh7IEFic29sdXRl
VG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHVzZVRtcCksIEFic29sdXRlVG1wTWFwcGVy
PHR5cGU+OjphYnNvbHV0ZUluZGV4KGRlZlRtcCkgfSk7CisgICAgICAgICAgICBpZiAodHJhY2VE
ZWJ1ZykKKyAgICAgICAgICAgICAgICBkYXRhTG9nTG4oIk1vdmUgYXQgaW5kZXggIiwgbmV4dE1v
dmVJbmRleCwgIiBpczogIiwgKnByZXZJbnN0KTsKIAogICAgICAgICAgICAgdW5zaWduZWQgbmV3
SW5kZXhJbldvcmtsaXN0ID0gbV93b3JrbGlzdE1vdmVzLmFkZE1vdmUoKTsKICAgICAgICAgICAg
IEFTU0VSVF9VTlVTRUQobmV3SW5kZXhJbldvcmtsaXN0LCBuZXdJbmRleEluV29ya2xpc3QgPT0g
bmV4dE1vdmVJbmRleCk7CiAKLSAgICAgICAgICAgIEFTU0VSVChuZXh0TW92ZUluZGV4IDw9IG1f
YWN0aXZlTW92ZXMuc2l6ZSgpKTsKLSAgICAgICAgICAgIG1fYWN0aXZlTW92ZXMuZW5zdXJlU2l6
ZShuZXh0TW92ZUluZGV4ICsgMSk7Ci0KICAgICAgICAgICAgIGZvciAoY29uc3QgQXJnJiBhcmcg
OiBwcmV2SW5zdC0+YXJncykgewogICAgICAgICAgICAgICAgIGF1dG8mIGxpc3QgPSBtX21vdmVM
aXN0W0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KGFyZy50bXAoKSldOwog
ICAgICAgICAgICAgICAgIGxpc3QuYWRkKG5leHRNb3ZlSW5kZXgpOwpAQCAtMTE2MSw1MSArMTEw
Niw2NSBAQCBwcml2YXRlOgogICAgICAgICB9CiAKICAgICAgICAgdW5zaWduZWQgdmljdGltSW5k
ZXggPSAqdmljdGltSXRlcmF0b3I7Ci0gICAgICAgIG1fc3BpbGxXb3JrbGlzdC5yZW1vdmUodmlj
dGltSXRlcmF0b3IpOwotICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuYXBwZW5kKHZpY3RpbUlu
ZGV4KTsKKyAgICAgICAgaWYgKHRyYWNlRGVidWcpCisgICAgICAgICAgICBkYXRhTG9nTG4oIlNl
bGVjdGluZyBzcGlsbCAiLCB2aWN0aW1JbmRleCk7CiAKLSAgICAgICAgZnJlZXplTW92ZXModmlj
dGltSW5kZXgpOworICAgICAgICBBU1NFUlQoIWlzUHJlY29sb3JlZCh2aWN0aW1JbmRleCkpOwor
ICAgICAgICBtX3NwaWxsV29ya2xpc3QucXVpY2tDbGVhcih2aWN0aW1JbmRleCk7CisgICAgICAg
IG1fc2ltcGxpZnlXb3JrbGlzdC5hcHBlbmQodmljdGltSW5kZXgpOwogICAgIH0KIAogICAgIHZv
aWQgYWxsb2NhdGUoKQogICAgIHsKLSAgICAgICAgQVNTRVJUX1dJVEhfTUVTU0FHRShtX2FjdGl2
ZU1vdmVzLnNpemUoKSA+PSBtX2NvYWxlc2NpbmdDYW5kaWRhdGVzLnNpemUoKSwgIlRoZSBhY3Rp
dmVNb3ZlIHNldCBzaG91bGQgYmUgYmlnIGVub3VnaCBmb3IgdGhlIHF1aWNrIG9wZXJhdGlvbnMg
b2YgQml0VmVjdG9yLiIpOworICAgICAgICBpbml0aWFsaXplUHJlY29sb3JlZFRtcCgpOworICAg
ICAgICBidWlsZCgpOwogCi0gICAgICAgIG1ha2VXb3JrTGlzdCgpOworICAgICAgICBib29sIGNo
YW5nZWQgPSBmYWxzZTsKIAotICAgICAgICBpZiAoZGVidWcpIHsKLSAgICAgICAgICAgIGRhdGFM
b2coIkludGVyZmVyZW5jZTogIiwgbGlzdER1bXAobV9pbnRlcmZlcmVuY2VFZGdlcyksICJcbiIp
OwotICAgICAgICAgICAgZHVtcEludGVyZmVyZW5jZUdyYXBoSW5Eb3QoV1RGOjpkYXRhRmlsZSgp
KTsKLSAgICAgICAgICAgIGRhdGFMb2coIkNvYWxlc2NpbmcgY2FuZGlkYXRlczpcbiIpOwotICAg
ICAgICAgICAgZm9yIChNb3ZlT3BlcmFuZHMmIG1vdmVPcCA6IG1fY29hbGVzY2luZ0NhbmRpZGF0
ZXMpIHsKLSAgICAgICAgICAgICAgICBkYXRhTG9nKCIgICAgIiwgQWJzb2x1dGVUbXBNYXBwZXI8
dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KG1vdmVPcC5zcmNJbmRleCksCi0gICAgICAgICAg
ICAgICAgICAgICIgLT4gIiwgQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0
ZUluZGV4KG1vdmVPcC5kc3RJbmRleCksICJcbiIpOworICAgICAgICBhdXRvIGNvYWxlc2NlTW92
ZSA9IFsmXSAodW5zaWduZWQmIG1vdmUpIHsKKyAgICAgICAgICAgIGJvb2wgY29hbGVzY2VkID0g
Y29hbGVzY2U8dHlwZT4obW92ZSk7CisgICAgICAgICAgICBpZiAoY29hbGVzY2VkKSB7CisgICAg
ICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgLy8gQW4gaW5kaWNh
dGlvbiB3ZSB3b24ndCBuZWVkIHRvIGhhbmRsZSB0aGlzIG1vdmUgaW4gdGhlIGZ1dHVyZS4KKyAg
ICAgICAgICAgICAgICBtb3ZlID0gVUlOVF9NQVg7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICBkYXRhTG9nKCJJbml0aWFsIHdvcmsgbGlzdFxuIik7Ci0gICAgICAgICAgICBkdW1wV29ya0xp
c3RzKFdURjo6ZGF0YUZpbGUoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgfTsKIAorICAgICAgICAv
LyBXZSBmaXJzdCBjb2FsZXNjZSB1bnRpbCB3ZSBjYW4ndCBjb2FsZXNjZSBhbnkgbW9yZS4KICAg
ICAgICAgZG8gewotICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpIHsKLSAgICAgICAgICAgICAg
ICBkYXRhTG9nKCJCZWZvcmUgR3JhcGggc2ltcGxpZmljYXRpb24gaXRlcmF0aW9uXG4iKTsKLSAg
ICAgICAgICAgICAgICBkdW1wV29ya0xpc3RzKFdURjo6ZGF0YUZpbGUoKSk7Ci0gICAgICAgICAg
ICB9CisgICAgICAgICAgICBjaGFuZ2VkID0gZmFsc2U7CisgICAgICAgICAgICBtX3dvcmtsaXN0
TW92ZXMuZm9yRWFjaE1vdmUoY29hbGVzY2VNb3ZlKTsKKyAgICAgICAgfSB3aGlsZSAoY2hhbmdl
ZCk7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAg
ICAgIG1fd29ya2xpc3RNb3Zlcy5mb3JFYWNoTG93UHJpb3JpdHlNb3ZlKGNvYWxlc2NlTW92ZSk7
CisgICAgICAgIH0gd2hpbGUgKGNoYW5nZWQpOworCisgICAgICAgIC8vIFRoZW4gd2UgY3JlYXRl
IG91ciBzZWxlY3Qgc3RhY2suIFRoZSBpbnZhcmlhbnQgd2Ugc3RhcnQgd2l0aCBoZXJlIGlzIHRo
YXQgbm9kZXMgaW4KKyAgICAgICAgLy8gdGhlIGludGVyZmVyZW5jZSBncmFwaCB3aXRoIGRlZ3Jl
ZSA+PSBrIGFyZSBvbiB0aGUgc3BpbGwgbGlzdC4gTm9kZXMgd2l0aCBkZWdyZWUgPCBrCisgICAg
ICAgIC8vIGFyZSBvbiB0aGUgc2ltcGxpZnkgd29ya2xpc3QuICBBIG5vZGUgY2FuIG1vdmUgZnJv
bSB0aGUgc3BpbGwgbGlzdCB0byB0aGUgc2ltcGxpZnkKKyAgICAgICAgLy8gbGlzdCAoYnV0IG5v
dCB0aGUgb3RoZXIgd2F5IGFyb3VuZCwgbm90ZSB0aGF0IHRoaXMgaXMgZGlmZmVyZW50IHRoYW4g
SVJDIGJlY2F1c2UgSVJDCisgICAgICAgIC8vIHJ1bnMgdGhpcyB3aGlsZSBjb2FsZXNjaW5nLCBi
dXQgd2UgZG8gYWxsIG91ciBjb2FsZXNjaW5nIGJlZm9yZSB0aGlzKS4gT25jZSBhIG5vZGUgaXMK
KyAgICAgICAgLy8gYWRkZWQgdG8gdGhlIHNlbGVjdCBzdGFjaywgaXQncyBub3Qgb24gZWl0aGVy
IGxpc3QsIGJ1dCBvbmx5IG9uIHRoZSBzZWxlY3Qgc3RhY2suCisgICAgICAgIC8vIE9uY2Ugb24g
dGhlIHNlbGVjdCBzdGFjaywgbG9naWNhbGx5LCBpdCdzIG5vIGxvbmdlciBpbiB0aGUgaW50ZXJm
ZXJlbmNlIGdyYXBoLgorICAgICAgICAvLyBGSVhNRTogQWRkIGEgd2F5IHRvIGFzc2VydCB0aGlz
IGF0IGVhY2ggc2ltcGxpZnkgc3RlcC4KIAotICAgICAgICAgICAgaWYgKCFtX3NpbXBsaWZ5V29y
a2xpc3QuaXNFbXB0eSgpKQorICAgICAgICBtYWtlSW5pdGlhbFdvcmtsaXN0KCk7CisgICAgICAg
IGRvIHsKKyAgICAgICAgICAgIGNoYW5nZWQgPSBmYWxzZTsKKworICAgICAgICAgICAgd2hpbGUg
KG1fc2ltcGxpZnlXb3JrbGlzdC5zaXplKCkpCiAgICAgICAgICAgICAgICAgc2ltcGxpZnkoKTsK
LSAgICAgICAgICAgIGVsc2UgaWYgKCFtX3dvcmtsaXN0TW92ZXMuaXNFbXB0eSgpKQotICAgICAg
ICAgICAgICAgIGNvYWxlc2NlKCk7Ci0gICAgICAgICAgICBlbHNlIGlmICghbV9mcmVlemVXb3Jr
bGlzdC5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgZnJlZXplKCk7Ci0gICAgICAgICAgICBl
bHNlIGlmICghbV9zcGlsbFdvcmtsaXN0LmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICBzZWxl
Y3RTcGlsbCgpOwogCi0gICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykgewotICAgICAgICAgICAg
ICAgIGRhdGFMb2coIkFmdGVyIEdyYXBoIHNpbXBsaWZpY2F0aW9uIGl0ZXJhdGlvblxuIik7Ci0g
ICAgICAgICAgICAgICAgZHVtcFdvcmtMaXN0cyhXVEY6OmRhdGFGaWxlKCkpOworICAgICAgICAg
ICAgaWYgKG1fc3BpbGxXb3JrbGlzdC5iaXRDb3VudCgpKSB7CisgICAgICAgICAgICAgICAgc2Vs
ZWN0U3BpbGwoKTsKKyAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAg
ICAgICBBU1NFUlQobV9zaW1wbGlmeVdvcmtsaXN0LnNpemUoKSA9PSAxKTsKICAgICAgICAgICAg
IH0KLSAgICAgICAgfSB3aGlsZSAoIW1fc2ltcGxpZnlXb3JrbGlzdC5pc0VtcHR5KCkgfHwgIW1f
d29ya2xpc3RNb3Zlcy5pc0VtcHR5KCkgfHwgIW1fZnJlZXplV29ya2xpc3QuaXNFbXB0eSgpIHx8
ICFtX3NwaWxsV29ya2xpc3QuaXNFbXB0eSgpKTsKKyAgICAgICAgfSB3aGlsZSAoY2hhbmdlZCk7
CiAKKyAgICAgICAgLy8gRklYTUU6IGFzc2VydCBldmVyeXRoaW5nIHdlIHN0YXJ0ZWQgdy8gaXMg
b24gdGhlIHNpbXBsaWZ5IHN0YWNrLgorICAgICAgICBBU1NFUlQoIW1fc2ltcGxpZnlXb3JrbGlz
dC5zaXplKCkpOwogICAgICAgICBhc3NpZ25Db2xvcnMoKTsKICAgICB9CiAKQEAgLTEyMTgsMTAg
KzExNzcsMTAgQEAgcHJpdmF0ZToKICAgICAgICAgb3V0LnByaW50KCJncmFwaCBJbnRlcmZlcmVu
Y2VHcmFwaCB7IFxuIik7CiAKICAgICAgICAgSGFzaFNldDxUbXA+IHRtcHNXaXRoSW50ZXJmZXJl
bmNlczsKLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiBlZGdlIDogbV9pbnRlcmZlcmVuY2VFZGdl
cykgewotICAgICAgICAgICAgdG1wc1dpdGhJbnRlcmZlcmVuY2VzLmFkZChBYnNvbHV0ZVRtcE1h
cHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgoZWRnZS5maXJzdCgpKSk7Ci0gICAgICAg
ICAgICB0bXBzV2l0aEludGVyZmVyZW5jZXMuYWRkKEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0
bXBGcm9tQWJzb2x1dGVJbmRleChlZGdlLnNlY29uZCgpKSk7Ci0gICAgICAgIH0KKyAgICAgICAg
Ly9mb3IgKGNvbnN0IGF1dG8mIGVkZ2UgOiBtX2ludGVyZmVyZW5jZUVkZ2VzKSB7CisgICAgICAg
IC8vICAgIHRtcHNXaXRoSW50ZXJmZXJlbmNlcy5hZGQoQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46
OnRtcEZyb21BYnNvbHV0ZUluZGV4KGVkZ2UuZmlyc3QoKSkpOworICAgICAgICAvLyAgICB0bXBz
V2l0aEludGVyZmVyZW5jZXMuYWRkKEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJz
b2x1dGVJbmRleChlZGdlLnNlY29uZCgpKSk7CisgICAgICAgIC8vfQogCiAgICAgICAgIGZvciAo
Y29uc3QgYXV0byYgdG1wIDogdG1wc1dpdGhJbnRlcmZlcmVuY2VzKSB7CiAgICAgICAgICAgICB1
bnNpZ25lZCB0bXBJbmRleCA9IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4
KHRtcCk7CkBAIC0xMjMxLDggKzExOTAsOCBAQCBwcml2YXRlOgogICAgICAgICAgICAgICAgIG91
dC5wcmludCgiICAgICIsIHRtcC5pbnRlcm5hbFZhbHVlKCksICIgW2xhYmVsPVwiIiwgdG1wLCAi
XCJdO1xuIik7CiAgICAgICAgIH0KIAotICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGVkZ2UgOiBt
X2ludGVyZmVyZW5jZUVkZ2VzKQotICAgICAgICAgICAgb3V0LnByaW50KCIgICAgIiwgZWRnZS5m
aXJzdCgpLCAiIC0tICIsIGVkZ2Uuc2Vjb25kKCksICI7XG4iKTsKKyAgICAgICAgLy9mb3IgKGNv
bnN0IGF1dG8mIGVkZ2UgOiBtX2ludGVyZmVyZW5jZUVkZ2VzKQorICAgICAgICAvLyAgICBvdXQu
cHJpbnQoIiAgICAiLCBlZGdlLmZpcnN0KCksICIgLS0gIiwgZWRnZS5zZWNvbmQoKSwgIjtcbiIp
OwogICAgICAgICBvdXQucHJpbnQoIn1cbiIpOwogICAgIH0KIApAQCAtMTI0MSw3ICsxMjAwLDcg
QEAgcHJpdmF0ZToKICAgICAgICAgb3V0LnByaW50KCJTaW1wbGlmeSB3b3JrIGxpc3Q6XG4iKTsK
ICAgICAgICAgZm9yICh1bnNpZ25lZCB0bXBJbmRleCA6IG1fc2ltcGxpZnlXb3JrbGlzdCkKICAg
ICAgICAgICAgIG91dC5wcmludCgiICAgICIsIEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBG
cm9tQWJzb2x1dGVJbmRleCh0bXBJbmRleCksICJcbiIpOwotICAgICAgICBvdXQucHJpbnRmKCJN
b3ZlcyB3b3JrIGxpc3QgaXMgZW1wdHk/ICVkXG4iLCBtX3dvcmtsaXN0TW92ZXMuaXNFbXB0eSgp
KTsKKyAgICAgICAgLy9vdXQucHJpbnRmKCJNb3ZlcyB3b3JrIGxpc3QgaXMgZW1wdHk/ICVkXG4i
LCBtX3dvcmtsaXN0TW92ZXMuaXNFbXB0eSgpKTsKICAgICAgICAgb3V0LnByaW50KCJGcmVlemUg
d29yayBsaXN0OlxuIik7CiAgICAgICAgIGZvciAodW5zaWduZWQgdG1wSW5kZXggOiBtX2ZyZWV6
ZVdvcmtsaXN0KQogICAgICAgICAgICAgb3V0LnByaW50KCIgICAgIiwgQWJzb2x1dGVUbXBNYXBw
ZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KHRtcEluZGV4KSwgIlxuIik7CkBAIC0xMjUz
LDcgKzEyMTIsNyBAQCBwcml2YXRlOgogICAgIHVzaW5nIEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0
b3I8dW5zaWduZWQ+OjphZGRFZGdlOwogICAgIHVzaW5nIEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0
b3I8dW5zaWduZWQ+OjpnZXRBbGlhczsKIAotICAgIENvZGUmIG1fY29kZTsKKyAgICAvL0NvZGUm
IG1fY29kZTsKICAgICBUbXBXaWR0aCYgbV90bXBXaWR0aDsKICAgICAvLyBGSVhNRTogc3BpbGxp
bmcgc2hvdWxkIG5vdCB0eXBlIHNwZWNpZmljLiBJdCBpcyBvbmx5IGEgc2lkZSBlZmZlY3Qgb2Yg
dXNpbmcgVXNlQ291bnRzLgogICAgIGNvbnN0IFVzZUNvdW50czxUbXA+JiBtX3VzZUNvdW50czsK
QEAgLTEyNjEsMTggKzEyMjAsMTkgQEAgcHJpdmF0ZToKIAogY2xhc3MgSXRlcmF0ZWRSZWdpc3Rl
ckNvYWxlc2NpbmcgewogcHVibGljOgotICAgIEl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nKENv
ZGUmIGNvZGUpCisgICAgSXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcoQ29kZSYgY29kZSwgVXNl
Q291bnRzPFRtcD4mIHVzZUNvdW50cykKICAgICAgICAgOiBtX2NvZGUoY29kZSkKLSAgICAgICAg
LCBtX3VzZUNvdW50cyhjb2RlKQorICAgICAgICAsIG1fdXNlQ291bnRzKHVzZUNvdW50cykKICAg
ICB7CiAgICAgfQogCiAgICAgdm9pZCBydW4oKQogICAgIHsKICAgICAgICAgcGFkSW50ZXJmZXJl
bmNlKG1fY29kZSk7Ci0gICAgICAgIAotICAgICAgICBpdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2lu
Z09uVHlwZTxBcmc6OkdQPigpOwotICAgICAgICBpdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZ09u
VHlwZTxBcmc6OkZQPigpOworCisgICAgICAgIGJyaWdnc0FsbG9jYXRvck9uVHlwZTxBcmc6OkdQ
PigpOworICAgICAgICBtX251bUl0ZXJhdGlvbnMgPSAwOworICAgICAgICBicmlnZ3NBbGxvY2F0
b3JPblR5cGU8QXJnOjpGUD4oKTsKIAogICAgICAgICBmaXhTcGlsbHNBZnRlclRlcm1pbmFscygp
OwogCkBAIC0xMjgyLDcgKzEyNDIsNyBAQCBwdWJsaWM6CiAKIHByaXZhdGU6CiAgICAgdGVtcGxh
dGU8QXJnOjpUeXBlIHR5cGU+Ci0gICAgdm9pZCBpdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZ09u
VHlwZSgpCisgICAgdm9pZCBicmlnZ3NBbGxvY2F0b3JPblR5cGUoKQogICAgIHsKICAgICAgICAg
SGFzaFNldDx1bnNpZ25lZD4gdW5zcGlsbGFibGVUbXBzID0gY29tcHV0ZVVuc3BpbGxhYmxlVG1w
czx0eXBlPigpOwogCkBAIC0xMzEzLDYgKzEyNzMsNyBAQCBwcml2YXRlOgogICAgICAgICAgICAg
bV90bXBXaWR0aC5yZWNvbXB1dGUobV9jb2RlKTsKICAgICAgICAgICAgIAogICAgICAgICAgICAg
Q29sb3JpbmdBbGxvY2F0b3I8dHlwZT4gYWxsb2NhdG9yKG1fY29kZSwgbV90bXBXaWR0aCwgbV91
c2VDb3VudHMsIHVuc3BpbGxhYmxlVG1wcyk7CisgICAgICAgICAgICBhbGxvY2F0b3IuYWxsb2Nh
dGUoKTsKICAgICAgICAgICAgIGlmICghYWxsb2NhdG9yLnJlcXVpcmVzU3BpbGxpbmcoKSkgewog
ICAgICAgICAgICAgICAgIGFzc2lnblJlZ2lzdGVyc1RvVG1wKGFsbG9jYXRvcik7CiAgICAgICAg
ICAgICAgICAgaWYgKHRyYWNlRGVidWcpCkBAIC0xMzIwLDYgKzEyODEsNyBAQCBwcml2YXRlOgog
CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBh
ZGRTcGlsbEFuZEZpbGw8dHlwZT4oYWxsb2NhdG9yLCB1bnNwaWxsYWJsZVRtcHMpOwogICAgICAg
ICB9CiAgICAgfQpAQCAtMTMyNyw2ICsxMjg5LDcgQEAgcHJpdmF0ZToKICAgICB0ZW1wbGF0ZTxB
cmc6OlR5cGUgdHlwZT4KICAgICBIYXNoU2V0PHVuc2lnbmVkPiBjb21wdXRlVW5zcGlsbGFibGVU
bXBzKCkKICAgICB7CisKICAgICAgICAgSGFzaFNldDx1bnNpZ25lZD4gdW5zcGlsbGFibGVUbXBz
OwogCiAgICAgICAgIHN0cnVjdCBSYW5nZSB7CkBAIC0xNjM3LDcgKzE2MDAsNyBAQCBwcml2YXRl
OgogCiAgICAgQ29kZSYgbV9jb2RlOwogICAgIFRtcFdpZHRoIG1fdG1wV2lkdGg7Ci0gICAgVXNl
Q291bnRzPFRtcD4gbV91c2VDb3VudHM7CisgICAgVXNlQ291bnRzPFRtcD4mIG1fdXNlQ291bnRz
OwogICAgIHVuc2lnbmVkIG1fbnVtSXRlcmF0aW9ucyB7IDAgfTsKIH07CiAKQEAgLTE2NDUsOSAr
MTYwOCwxMCBAQCBwcml2YXRlOgogCiB2b2lkIGl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nKENv
ZGUmIGNvZGUpCiB7Ci0gICAgUGhhc2VTY29wZSBwaGFzZVNjb3BlKGNvZGUsICJpdGVyYXRlZFJl
Z2lzdGVyQ29hbGVzY2luZyIpOwotICAgIAotICAgIEl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5n
IGl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nKGNvZGUpOworICAgIFBoYXNlU2NvcGUgcGhhc2VT
Y29wZShjb2RlLCAiQWlyOjppdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZyIpOworCisgICAgVXNl
Q291bnRzPFRtcD4gdXNlQ291bnRzKGNvZGUpOworICAgIEl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNj
aW5nIGl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nKGNvZGUsIHVzZUNvdW50cyk7CiAgICAgaXRl
cmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcucnVuKCk7CiB9CiAK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>302041</attachid>
            <date>2017-02-17 20:33:46 -0800</date>
            <delta_ts>2017-02-20 12:53:28 -0800</delta_ts>
            <desc>WIP</desc>
            <filename>patch.diff</filename>
            <type>text/plain</type>
            <size>66543</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlySXRlcmF0ZWRSZWdpc3RlckNv
YWxlc2NpbmcuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIv
QWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuY3BwCShyZXZpc2lvbiAyMTIxMjUpCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpckl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5n
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDksMzEgKzQ5LDQ1IEBAIGJvb2wgcmVwb3J0U3RhdHMg
PSBmYWxzZTsKIAogLy8gVGhlIEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0b3IgZGVmaW5lcyBhbGwg
dGhlIGNvZGUgdGhhdCBpcyBpbmRlcGVuZGFudAogLy8gZnJvbSB0aGUgdHlwZSBvciByZWdpc3Rl
ciBhbmQgY2FuIGJlIHNoYXJlZCB3aGVuIGFsbG9jYXRpbmcgcmVnaXN0ZXJzLgotdGVtcGxhdGU8
dHlwZW5hbWUgSW5kZXhUeXBlPgordGVtcGxhdGU8dHlwZW5hbWUgSW5kZXhUeXBlLCB0eXBlbmFt
ZSBUbXBNYXBwZXI+CiBjbGFzcyBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yIHsKIHB1YmxpYzoK
LSAgICBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yKGNvbnN0IFZlY3RvcjxSZWc+JiByZWdzSW5Q
cmlvcml0eU9yZGVyLCBJbmRleFR5cGUgbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4LCB1bnNp
Z25lZCB0bXBBcnJheVNpemUsIGNvbnN0IEhhc2hTZXQ8dW5zaWduZWQ+JiB1bnNwaWxsYWJsZVRt
cCkKKyAgICBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yKENvZGUmIGNvZGUsIGNvbnN0IFZlY3Rv
cjxSZWc+JiByZWdzSW5Qcmlvcml0eU9yZGVyLCBJbmRleFR5cGUgbGFzdFByZWNvbG9yZWRSZWdp
c3RlckluZGV4LCB1bnNpZ25lZCB0bXBBcnJheVNpemUsIGNvbnN0IEhhc2hTZXQ8dW5zaWduZWQ+
JiB1bnNwaWxsYWJsZVRtcHMsIGNvbnN0IFVzZUNvdW50czxUbXA+JiB1c2VDb3VudHMpCiAgICAg
ICAgIDogbV9yZWdzSW5Qcmlvcml0eU9yZGVyKHJlZ3NJblByaW9yaXR5T3JkZXIpCiAgICAgICAg
ICwgbV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXgobGFzdFByZWNvbG9yZWRSZWdpc3Rlcklu
ZGV4KQotICAgICAgICAsIG1fdW5zcGlsbGFibGVUbXBzKHVuc3BpbGxhYmxlVG1wKQorICAgICAg
ICAsIG1fdW5zcGlsbGFibGVUbXBzKHVuc3BpbGxhYmxlVG1wcykKKyAgICAgICAgLCBtX3VzZUNv
dW50cyh1c2VDb3VudHMpCisgICAgICAgICwgbV9jb2RlKGNvZGUpCiAgICAgewotICAgICAgICBm
b3IgKFJlZyByZWcgOiBtX3JlZ3NJblByaW9yaXR5T3JkZXIpCi0gICAgICAgICAgICBtX211dGFi
bGVSZWdzLnNldChyZWcpOwotICAgICAgICAKLSAgICAgICAgaW5pdGlhbGl6ZURlZ3JlZXModG1w
QXJyYXlTaXplKTsKLSAgICAgICAgCi0gICAgICAgIG1fYWRqYWNlbmN5TGlzdC5yZXNpemUodG1w
QXJyYXlTaXplKTsKLSAgICAgICAgbV9tb3ZlTGlzdC5yZXNpemUodG1wQXJyYXlTaXplKTsKLSAg
ICAgICAgbV9jb2FsZXNjZWRUbXBzLmZpbGwoMCwgdG1wQXJyYXlTaXplKTsKLSAgICAgICAgbV9p
c09uU2VsZWN0U3RhY2suZW5zdXJlU2l6ZSh0bXBBcnJheVNpemUpOworICAgICAgICBtX3RtcEFy
cmF5U2l6ZSA9IHRtcEFycmF5U2l6ZTsKKyAgICAgICAgVU5VU0VEX1BBUkFNKGRlYnVnKTsKKwor
ICAgICAgICB7CisgICAgICAgICAgICBmb3IgKFJlZyByZWcgOiBtX3JlZ3NJblByaW9yaXR5T3Jk
ZXIpCisgICAgICAgICAgICAgICAgbV9tdXRhYmxlUmVncy5zZXQocmVnKTsKKyAgICAgICAgICAg
IAorICAgICAgICAgICAgaW5pdGlhbGl6ZURlZ3JlZXModG1wQXJyYXlTaXplKTsKKyAgICAgICAg
ICAgIAorICAgICAgICAgICAgbV9hZGphY2VuY3lMaXN0LnJlc2l6ZSh0bXBBcnJheVNpemUpOwor
ICAgICAgICAgICAgbV9tb3ZlTGlzdC5yZXNpemUodG1wQXJyYXlTaXplKTsKKyAgICAgICAgICAg
IG1fY29hbGVzY2VkVG1wcy5maWxsKDAsIHRtcEFycmF5U2l6ZSk7CisgICAgICAgICAgICBtX2lz
T25TZWxlY3RTdGFjay5lbnN1cmVTaXplKHRtcEFycmF5U2l6ZSk7CisgICAgICAgICAgICBtX3Nw
aWxsV29ya2xpc3QuZW5zdXJlU2l6ZSh0bXBBcnJheVNpemUpOworICAgICAgICAgICAgbV9pbnRl
cmZlcmVuY2VFZGdlcy5lbnN1cmVTaXplKHRtcEFycmF5U2l6ZSAqIHRtcEFycmF5U2l6ZSk7Cisg
ICAgICAgIH0KICAgICB9CiAKIHByb3RlY3RlZDoKKworICAgIHVuc2lnbmVkIGsoKSBjb25zdCB7
IHJldHVybiBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpOyB9CisKICAgICBJbmRleFR5cGUg
Z2V0QWxpYXMoSW5kZXhUeXBlIHRtcEluZGV4KSBjb25zdAogICAgIHsKICAgICAgICAgSW5kZXhU
eXBlIGFsaWFzID0gdG1wSW5kZXg7Ci0gICAgICAgIHdoaWxlIChJbmRleFR5cGUgbmV4dEFsaWFz
ID0gbV9jb2FsZXNjZWRUbXBzW2FsaWFzXSkKKyAgICAgICAgd2hpbGUgKEluZGV4VHlwZSBuZXh0
QWxpYXMgPSBtX2NvYWxlc2NlZFRtcHNbYWxpYXNdKSB7CisgICAgICAgICAgICBjb25zdF9jYXN0
PEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0b3I8SW5kZXhUeXBlLCBUbXBNYXBwZXI+Kj4odGhpcykt
Pm1fY29hbGVzY2VkVG1wc1t0bXBJbmRleF0gPSBuZXh0QWxpYXM7CiAgICAgICAgICAgICBhbGlh
cyA9IG5leHRBbGlhczsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gYWxpYXM7CiAgICAgfQog
CkBAIC04NCwyMCArOTgsNiBAQCBwcm90ZWN0ZWQ6CiAgICAgICAgIGFkZEVkZ2VEaXN0aW5jdChh
LCBiKTsKICAgICB9CiAKLSAgICB2b2lkIG1ha2VXb3JrTGlzdCgpCi0gICAgewotICAgICAgICBJ
bmRleFR5cGUgZmlyc3ROb25SZWdJbmRleCA9IG1fbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4
ICsgMTsKLSAgICAgICAgZm9yIChJbmRleFR5cGUgaSA9IGZpcnN0Tm9uUmVnSW5kZXg7IGkgPCBt
X2RlZ3JlZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIGRlZ3JlZSA9IG1f
ZGVncmVlc1tpXTsKLSAgICAgICAgICAgIGlmIChkZWdyZWUgPj0gbV9yZWdzSW5Qcmlvcml0eU9y
ZGVyLnNpemUoKSkKLSAgICAgICAgICAgICAgICBhZGRUb1NwaWxsKGkpOwotICAgICAgICAgICAg
ZWxzZSBpZiAoIW1fbW92ZUxpc3RbaV0uaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIG1fZnJl
ZXplV29ya2xpc3QuYWRkKGkpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG1f
c2ltcGxpZnlXb3JrbGlzdC5hcHBlbmQoaSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICB2b2lk
IGFkZFRvU3BpbGwodW5zaWduZWQgdG9TcGlsbCkKICAgICB7CiAgICAgICAgIGlmIChtX3Vuc3Bp
bGxhYmxlVG1wcy5jb250YWlucyh0b1NwaWxsKSkKQEAgLTEwNiwxNDcgKzEwNiwxMSBAQCBwcm90
ZWN0ZWQ6CiAgICAgICAgIG1fc3BpbGxXb3JrbGlzdC5hZGQodG9TcGlsbCk7CiAgICAgfQogCi0g
ICAgLy8gTG93LWRlZ3JlZSB2ZXJ0ZXggY2FuIGFsd2F5cyBiZSBjb2xvcmVkOiBqdXN0IHBpY2sg
YW55IG9mIHRoZSBjb2xvciB0YWtlbiBieSBhbnkKLSAgICAvLyBvdGhlciBhZGphY2VudCB2ZXJp
Y2VzLgotICAgIC8vIFRoZSAiU2ltcGxpZnkiIHBoYXNlIHRha2VzIGEgbG93LWRlZ3JlZSBvdXQg
b2YgdGhlIGludGVyZmVyZW5jZSBncmFwaCB0byBzaW1wbGlmeSBpdC4KLSAgICB2b2lkIHNpbXBs
aWZ5KCkKLSAgICB7Ci0gICAgICAgIEluZGV4VHlwZSBsYXN0SW5kZXggPSBtX3NpbXBsaWZ5V29y
a2xpc3QudGFrZUxhc3QoKTsKLQotICAgICAgICBBU1NFUlQoIW1fc2VsZWN0U3RhY2suY29udGFp
bnMobGFzdEluZGV4KSk7Ci0gICAgICAgIEFTU0VSVCghbV9pc09uU2VsZWN0U3RhY2suZ2V0KGxh
c3RJbmRleCkpOwotICAgICAgICBtX3NlbGVjdFN0YWNrLmFwcGVuZChsYXN0SW5kZXgpOwotICAg
ICAgICBtX2lzT25TZWxlY3RTdGFjay5xdWlja1NldChsYXN0SW5kZXgpOwotCi0gICAgICAgIGZv
ckVhY2hBZGphY2VudChsYXN0SW5kZXgsIFt0aGlzXShJbmRleFR5cGUgYWRqYWNlbnRUbXBJbmRl
eCkgewotICAgICAgICAgICAgZGVjcmVtZW50RGVncmVlKGFkamFjZW50VG1wSW5kZXgpOwotICAg
ICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIGZyZWV6ZSgpCi0gICAgewotICAgICAgICBJbmRl
eFR5cGUgdmljdGltSW5kZXggPSBtX2ZyZWV6ZVdvcmtsaXN0LnRha2VBbnkoKTsKLSAgICAgICAg
QVNTRVJUX1dJVEhfTUVTU0FHRShnZXRBbGlhcyh2aWN0aW1JbmRleCkgPT0gdmljdGltSW5kZXgs
ICJjb2FsZXNjZSgpIHNob3VsZCBub3QgbGVhdmUgYWxpYXNlZCBUbXAgaW4gdGhlIHdvcmtsaXN0
LiIpOwotICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuYXBwZW5kKHZpY3RpbUluZGV4KTsKLSAg
ICAgICAgZnJlZXplTW92ZXModmljdGltSW5kZXgpOwotICAgIH0KLQotICAgIHZvaWQgZnJlZXpl
TW92ZXMoSW5kZXhUeXBlIHRtcEluZGV4KQotICAgIHsKLSAgICAgICAgZm9yRWFjaE5vZGVNb3Zl
cyh0bXBJbmRleCwgW3RoaXMsIHRtcEluZGV4XSAoSW5kZXhUeXBlIG1vdmVJbmRleCkgewotICAg
ICAgICAgICAgaWYgKCFtX2FjdGl2ZU1vdmVzLnF1aWNrQ2xlYXIobW92ZUluZGV4KSkKLSAgICAg
ICAgICAgICAgICBtX3dvcmtsaXN0TW92ZXMudGFrZU1vdmUobW92ZUluZGV4KTsKLQotICAgICAg
ICAgICAgY29uc3QgTW92ZU9wZXJhbmRzJiBtb3ZlT3BlcmFuZHMgPSBtX2NvYWxlc2NpbmdDYW5k
aWRhdGVzW21vdmVJbmRleF07Ci0gICAgICAgICAgICBJbmRleFR5cGUgc3JjVG1wSW5kZXggPSBt
b3ZlT3BlcmFuZHMuc3JjSW5kZXg7Ci0gICAgICAgICAgICBJbmRleFR5cGUgZHN0VG1wSW5kZXgg
PSBtb3ZlT3BlcmFuZHMuZHN0SW5kZXg7Ci0KLSAgICAgICAgICAgIEluZGV4VHlwZSBvcmlnaW5h
bE90aGVyVG1wID0gc3JjVG1wSW5kZXggIT0gdG1wSW5kZXggPyBzcmNUbXBJbmRleCA6IGRzdFRt
cEluZGV4OwotICAgICAgICAgICAgSW5kZXhUeXBlIG90aGVyVG1wSW5kZXggPSBnZXRBbGlhcyhv
cmlnaW5hbE90aGVyVG1wKTsKLSAgICAgICAgICAgIGlmIChtX2RlZ3JlZXNbb3RoZXJUbXBJbmRl
eF0gPCBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpICYmICFpc01vdmVSZWxhdGVkKG90aGVy
VG1wSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1fZnJlZXplV29ya2xpc3QucmVtb3Zl
KG90aGVyVG1wSW5kZXgpKQotICAgICAgICAgICAgICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3Qu
YXBwZW5kKG90aGVyVG1wSW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9
Ci0KLSAgICB2b2lkIGNvYWxlc2NlKCkKLSAgICB7Ci0gICAgICAgIHVuc2lnbmVkIG1vdmVJbmRl
eCA9IG1fd29ya2xpc3RNb3Zlcy50YWtlTGFzdE1vdmUoKTsKLSAgICAgICAgY29uc3QgTW92ZU9w
ZXJhbmRzJiBtb3ZlT3BlcmFuZHMgPSBtX2NvYWxlc2NpbmdDYW5kaWRhdGVzW21vdmVJbmRleF07
Ci0gICAgICAgIEluZGV4VHlwZSB1ID0gZ2V0QWxpYXMobW92ZU9wZXJhbmRzLnNyY0luZGV4KTsK
LSAgICAgICAgSW5kZXhUeXBlIHYgPSBnZXRBbGlhcyhtb3ZlT3BlcmFuZHMuZHN0SW5kZXgpOwot
Ci0gICAgICAgIGlmIChpc1ByZWNvbG9yZWQodikpCi0gICAgICAgICAgICBzdGQ6OnN3YXAodSwg
dik7Ci0KLSAgICAgICAgaWYgKHRyYWNlRGVidWcpCi0gICAgICAgICAgICBkYXRhTG9nKCJDb2Fs
ZXNjaW5nIG1vdmUgYXQgaW5kZXggIiwgbW92ZUluZGV4LCAiIHUgPSAiLCB1LCAiIHYgPSAiLCB2
LCAiXG4iKTsKLQotICAgICAgICBpZiAodSA9PSB2KSB7Ci0gICAgICAgICAgICBhZGRXb3JrTGlz
dCh1KTsKLQotICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpCi0gICAgICAgICAgICAgICAgZGF0
YUxvZygiICAgIENvYWxlc2NlZFxuIik7Ci0gICAgICAgIH0gZWxzZSBpZiAoaXNQcmVjb2xvcmVk
KHYpCi0gICAgICAgICAgICB8fCBtX2ludGVyZmVyZW5jZUVkZ2VzLmNvbnRhaW5zKEludGVyZmVy
ZW5jZUVkZ2UodSwgdikpCi0gICAgICAgICAgICB8fCAodSA9PSBtX2ZyYW1lUG9pbnRlckluZGV4
ICYmIG1faW50ZXJmZXJlc1dpdGhGcmFtZVBvaW50ZXIucXVpY2tHZXQodikpKSB7Ci0gICAgICAg
ICAgICBhZGRXb3JrTGlzdCh1KTsKLSAgICAgICAgICAgIGFkZFdvcmtMaXN0KHYpOwotCi0gICAg
ICAgICAgICBpZiAodHJhY2VEZWJ1ZykKLSAgICAgICAgICAgICAgICBkYXRhTG9nKCIgICAgQ29u
c3RyYWluZWRcbiIpOwotICAgICAgICB9IGVsc2UgaWYgKGNhbkJlU2FmZWx5Q29hbGVzY2VkKHUs
IHYpKSB7Ci0gICAgICAgICAgICBjb21iaW5lKHUsIHYpOwotICAgICAgICAgICAgYWRkV29ya0xp
c3QodSk7Ci0gICAgICAgICAgICBtX2hhc0NvYWxlc2NlZE5vblRyaXZpYWxNb3ZlID0gdHJ1ZTsK
LQotICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpCi0gICAgICAgICAgICAgICAgZGF0YUxvZygi
ICAgIFNhZmUgQ29hbGVzY2luZ1xuIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBt
X2FjdGl2ZU1vdmVzLnF1aWNrU2V0KG1vdmVJbmRleCk7Ci0KLSAgICAgICAgICAgIGlmICh0cmFj
ZURlYnVnKQotICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICBGYWlsZWQgY29hbGVzY2luZywg
YWRkZWQgdG8gYWN0aXZlIG1vdmVzLlxuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lk
IGFzc2lnbkNvbG9ycygpCisgICAgYm9vbCBpc1ByZWNvbG9yZWQoSW5kZXhUeXBlIHRtcEluZGV4
KQogICAgIHsKLSAgICAgICAgQVNTRVJUKG1fc2ltcGxpZnlXb3JrbGlzdC5pc0VtcHR5KCkpOwot
ICAgICAgICBBU1NFUlQobV93b3JrbGlzdE1vdmVzLmlzRW1wdHkoKSk7Ci0gICAgICAgIEFTU0VS
VChtX2ZyZWV6ZVdvcmtsaXN0LmlzRW1wdHkoKSk7Ci0gICAgICAgIEFTU0VSVChtX3NwaWxsV29y
a2xpc3QuaXNFbXB0eSgpKTsKLQotICAgICAgICAvLyBSZWNsYWltIGFzIG11Y2ggbWVtb3J5IGFz
IHBvc3NpYmxlLgotICAgICAgICBtX2ludGVyZmVyZW5jZUVkZ2VzLmNsZWFyKCk7Ci0gICAgICAg
IG1fZGVncmVlcy5jbGVhcigpOwotICAgICAgICBtX21vdmVMaXN0LmNsZWFyKCk7Ci0gICAgICAg
IG1fd29ya2xpc3RNb3Zlcy5jbGVhcigpOwotICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuY2xl
YXIoKTsKLSAgICAgICAgbV9zcGlsbFdvcmtsaXN0LmNsZWFyKCk7Ci0gICAgICAgIG1fZnJlZXpl
V29ya2xpc3QuY2xlYXIoKTsKLQotICAgICAgICAvLyBUcnkgdG8gY29sb3IgdGhlIFRtcCBvbiB0
aGUgc3RhY2suCi0gICAgICAgIG1fY29sb3JlZFRtcC5yZXNpemUobV9hZGphY2VuY3lMaXN0LnNp
emUoKSk7Ci0KLSAgICAgICAgd2hpbGUgKCFtX3NlbGVjdFN0YWNrLmlzRW1wdHkoKSkgewotICAg
ICAgICAgICAgdW5zaWduZWQgdG1wSW5kZXggPSBtX3NlbGVjdFN0YWNrLnRha2VMYXN0KCk7Ci0g
ICAgICAgICAgICBBU1NFUlQoIWlzUHJlY29sb3JlZCh0bXBJbmRleCkpOwotICAgICAgICAgICAg
QVNTRVJUKCFtX2NvbG9yZWRUbXBbdG1wSW5kZXhdKTsKLQotICAgICAgICAgICAgUmVnaXN0ZXJT
ZXQgY29sb3JlZFJlZ2lzdGVyczsKLSAgICAgICAgICAgIGZvciAoSW5kZXhUeXBlIGFkamFjZW50
VG1wSW5kZXggOiBtX2FkamFjZW5jeUxpc3RbdG1wSW5kZXhdKSB7Ci0gICAgICAgICAgICAgICAg
SW5kZXhUeXBlIGFsaWFzVG1wSW5kZXggPSBnZXRBbGlhcyhhZGphY2VudFRtcEluZGV4KTsKLSAg
ICAgICAgICAgICAgICBSZWcgcmVnID0gbV9jb2xvcmVkVG1wW2FsaWFzVG1wSW5kZXhdOwotCi0g
ICAgICAgICAgICAgICAgQVNTRVJUKCFpc1ByZWNvbG9yZWQoYWxpYXNUbXBJbmRleCkgfHwgKGlz
UHJlY29sb3JlZChhbGlhc1RtcEluZGV4KSAmJiByZWcpKTsKLQotICAgICAgICAgICAgICAgIGlm
IChyZWcpCi0gICAgICAgICAgICAgICAgICAgIGNvbG9yZWRSZWdpc3RlcnMuc2V0KHJlZyk7Ci0g
ICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJvb2wgY29sb3JBc3NpZ25lZCA9IGZhbHNlOwot
ICAgICAgICAgICAgZm9yIChSZWcgcmVnIDogbV9yZWdzSW5Qcmlvcml0eU9yZGVyKSB7Ci0gICAg
ICAgICAgICAgICAgaWYgKCFjb2xvcmVkUmVnaXN0ZXJzLmdldChyZWcpKSB7Ci0gICAgICAgICAg
ICAgICAgICAgIG1fY29sb3JlZFRtcFt0bXBJbmRleF0gPSByZWc7Ci0gICAgICAgICAgICAgICAg
ICAgIGNvbG9yQXNzaWduZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghY29sb3JB
c3NpZ25lZCkKLSAgICAgICAgICAgICAgICBtX3NwaWxsZWRUbXBzLmFwcGVuZCh0bXBJbmRleCk7
Ci0gICAgICAgIH0KLSAgICAgICAgbV9zZWxlY3RTdGFjay5jbGVhcigpOwotCi0gICAgICAgIGlm
IChtX3NwaWxsZWRUbXBzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIG1fY29hbGVzY2VkVG1wc0F0
U3BpbGwuY2xlYXIoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbV9jb2xvcmVkVG1wLmNs
ZWFyKCk7CisgICAgICAgIHJldHVybiB0bXBJbmRleCA8PSBtX2xhc3RQcmVjb2xvcmVkUmVnaXN0
ZXJJbmRleDsKICAgICB9CiAKLXByaXZhdGU6CiAgICAgdm9pZCBpbml0aWFsaXplRGVncmVlcyh1
bnNpZ25lZCB0bXBBcnJheVNpemUpCiAgICAgewogICAgICAgICBtX2RlZ3JlZXMucmVzaXplKHRt
cEFycmF5U2l6ZSk7CkBAIC0yNjIsNyArMTI2LDggQEAgcHJpdmF0ZToKICAgICB2b2lkIGFkZEVk
Z2VEaXN0aW5jdChJbmRleFR5cGUgYSwgSW5kZXhUeXBlIGIpCiAgICAgewogICAgICAgICBBU1NF
UlQoYSAhPSBiKTsKLSAgICAgICAgaWYgKG1faW50ZXJmZXJlbmNlRWRnZXMuYWRkKEludGVyZmVy
ZW5jZUVkZ2UoYSwgYikpLmlzTmV3RW50cnkpIHsKKyAgICAgICAgYm9vbCBpc05ld0VkZ2UgPSBh
ZGRJbnRlcmZlcmVuY2VFZGdlKEludGVyZmVyZW5jZUVkZ2UoYSwgYikpOworICAgICAgICBpZiAo
aXNOZXdFZGdlKSB7CiAgICAgICAgICAgICBpZiAoIWlzUHJlY29sb3JlZChhKSkgewogICAgICAg
ICAgICAgICAgIEFTU0VSVCghbV9hZGphY2VuY3lMaXN0W2FdLmNvbnRhaW5zKGIpKTsKICAgICAg
ICAgICAgICAgICBtX2FkamFjZW5jeUxpc3RbYV0uYXBwZW5kKGIpOwpAQCAtMjc3LDI2ICsxNDIs
MTEgQEAgcHJpdmF0ZToKICAgICAgICAgfQogICAgIH0KIAotICAgIHZvaWQgZGVjcmVtZW50RGVn
cmVlKEluZGV4VHlwZSB0bXBJbmRleCkKLSAgICB7Ci0gICAgICAgIEFTU0VSVChtX2RlZ3JlZXNb
dG1wSW5kZXhdKTsKLQotICAgICAgICB1bnNpZ25lZCBvbGREZWdyZWUgPSBtX2RlZ3JlZXNbdG1w
SW5kZXhdLS07Ci0gICAgICAgIGlmIChvbGREZWdyZWUgPT0gbV9yZWdzSW5Qcmlvcml0eU9yZGVy
LnNpemUoKSkgewotICAgICAgICAgICAgZW5hYmxlTW92ZXNPblZhbHVlQW5kQWRqYWNlbnRzKHRt
cEluZGV4KTsKLSAgICAgICAgICAgIG1fc3BpbGxXb3JrbGlzdC5yZW1vdmUodG1wSW5kZXgpOwot
ICAgICAgICAgICAgaWYgKGlzTW92ZVJlbGF0ZWQodG1wSW5kZXgpKQotICAgICAgICAgICAgICAg
IG1fZnJlZXplV29ya2xpc3QuYWRkKHRtcEluZGV4KTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAg
ICAgICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuYXBwZW5kKHRtcEluZGV4KTsKLSAgICAgICAg
fQotICAgIH0KLQotCiAgICAgYm9vbCBhZGRFZGdlRGlzdGluY3RXaXRob3V0RGVncmVlQ2hhbmdl
KEluZGV4VHlwZSBhLCBJbmRleFR5cGUgYikKICAgICB7CiAgICAgICAgIEFTU0VSVChhICE9IGIp
OwotICAgICAgICBpZiAobV9pbnRlcmZlcmVuY2VFZGdlcy5hZGQoSW50ZXJmZXJlbmNlRWRnZShh
LCBiKSkuaXNOZXdFbnRyeSkgeworICAgICAgICBib29sIGlzTmV3RWRnZSA9IGFkZEludGVyZmVy
ZW5jZUVkZ2UoSW50ZXJmZXJlbmNlRWRnZShhLCBiKSk7CisgICAgICAgIGlmIChpc05ld0VkZ2Up
IHsKICAgICAgICAgICAgIGlmICghaXNQcmVjb2xvcmVkKGEpKSB7CiAgICAgICAgICAgICAgICAg
QVNTRVJUKCFtX2FkamFjZW5jeUxpc3RbYV0uY29udGFpbnMoYikpOwogICAgICAgICAgICAgICAg
IG1fYWRqYWNlbmN5TGlzdFthXS5hcHBlbmQoYik7CkBAIC0zMTEsMTUgKzE2MSw2IEBAIHByaXZh
dGU6CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBib29sIGlzTW92ZVJlbGF0
ZWQoSW5kZXhUeXBlIHRtcEluZGV4KQotICAgIHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBtb3Zl
SW5kZXggOiBtX21vdmVMaXN0W3RtcEluZGV4XSkgewotICAgICAgICAgICAgaWYgKG1fYWN0aXZl
TW92ZXMucXVpY2tHZXQobW92ZUluZGV4KSB8fCBtX3dvcmtsaXN0TW92ZXMuY29udGFpbnMobW92
ZUluZGV4KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCiAgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rpb24+
CiAgICAgdm9pZCBmb3JFYWNoQWRqYWNlbnQoSW5kZXhUeXBlIHRtcEluZGV4LCBGdW5jdGlvbiBm
dW5jdGlvbikKICAgICB7CkBAIC0zMzEsODAgKzE3MiwxMiBAQCBwcml2YXRlOgogCiAgICAgYm9v
bCBoYXNCZWVuU2ltcGxpZmllZChJbmRleFR5cGUgdG1wSW5kZXgpCiAgICAgewotICAgICAgICBy
ZXR1cm4gbV9pc09uU2VsZWN0U3RhY2sucXVpY2tHZXQodG1wSW5kZXgpIHx8ICEhbV9jb2FsZXNj
ZWRUbXBzW3RtcEluZGV4XTsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdGlv
bj4KLSAgICB2b2lkIGZvckVhY2hOb2RlTW92ZXMoSW5kZXhUeXBlIHRtcEluZGV4LCBGdW5jdGlv
biBmdW5jdGlvbikKLSAgICB7Ci0gICAgICAgIGZvciAodW5zaWduZWQgbW92ZUluZGV4IDogbV9t
b3ZlTGlzdFt0bXBJbmRleF0pIHsKLSAgICAgICAgICAgIGlmIChtX2FjdGl2ZU1vdmVzLnF1aWNr
R2V0KG1vdmVJbmRleCkgfHwgbV93b3JrbGlzdE1vdmVzLmNvbnRhaW5zKG1vdmVJbmRleCkpCi0g
ICAgICAgICAgICAgICAgZnVuY3Rpb24obW92ZUluZGV4KTsKLSAgICAgICAgfQotICAgIH0KLQot
ICAgIHZvaWQgZW5hYmxlTW92ZXNPblZhbHVlKEluZGV4VHlwZSB0bXBJbmRleCkKLSAgICB7Ci0g
ICAgICAgIGZvciAodW5zaWduZWQgbW92ZUluZGV4IDogbV9tb3ZlTGlzdFt0bXBJbmRleF0pIHsK
LSAgICAgICAgICAgIGlmIChtX2FjdGl2ZU1vdmVzLnF1aWNrQ2xlYXIobW92ZUluZGV4KSkKLSAg
ICAgICAgICAgICAgICBtX3dvcmtsaXN0TW92ZXMucmV0dXJuTW92ZShtb3ZlSW5kZXgpOwotICAg
ICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBlbmFibGVNb3Zlc09uVmFsdWVBbmRBZGphY2VudHMo
SW5kZXhUeXBlIHRtcEluZGV4KQotICAgIHsKLSAgICAgICAgZW5hYmxlTW92ZXNPblZhbHVlKHRt
cEluZGV4KTsKLQotICAgICAgICBmb3JFYWNoQWRqYWNlbnQodG1wSW5kZXgsIFt0aGlzXSAoSW5k
ZXhUeXBlIGFkamFjZW50VG1wSW5kZXgpIHsKLSAgICAgICAgICAgIGVuYWJsZU1vdmVzT25WYWx1
ZShhZGphY2VudFRtcEluZGV4KTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgYm9vbCBpc1By
ZWNvbG9yZWQoSW5kZXhUeXBlIHRtcEluZGV4KQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRtcElu
ZGV4IDw9IG1fbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4OwotICAgIH0KLQotICAgIHZvaWQg
YWRkV29ya0xpc3QoSW5kZXhUeXBlIHRtcEluZGV4KQotICAgIHsKLSAgICAgICAgaWYgKCFpc1By
ZWNvbG9yZWQodG1wSW5kZXgpICYmIG1fZGVncmVlc1t0bXBJbmRleF0gPCBtX3JlZ3NJblByaW9y
aXR5T3JkZXIuc2l6ZSgpICYmICFpc01vdmVSZWxhdGVkKHRtcEluZGV4KSkgewotICAgICAgICAg
ICAgbV9mcmVlemVXb3JrbGlzdC5yZW1vdmUodG1wSW5kZXgpOwotICAgICAgICAgICAgbV9zaW1w
bGlmeVdvcmtsaXN0LmFwcGVuZCh0bXBJbmRleCk7CisgICAgICAgIGlmICghQVNTRVJUX0RJU0FC
TEVEKSB7CisgICAgICAgICAgICBpZiAoISFtX2NvYWxlc2NlZFRtcHNbdG1wSW5kZXhdKQorICAg
ICAgICAgICAgICAgIEFTU0VSVChnZXRBbGlhcyh0bXBJbmRleCkgIT0gdG1wSW5kZXgpOwogICAg
ICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBjb21iaW5lKEluZGV4VHlwZSB1LCBJbmRleFR5cGUg
dikKLSAgICB7Ci0gICAgICAgIGlmICghbV9mcmVlemVXb3JrbGlzdC5yZW1vdmUodikpCi0gICAg
ICAgICAgICBtX3NwaWxsV29ya2xpc3QucmVtb3ZlKHYpOwogCi0gICAgICAgIEFTU0VSVCghbV9j
b2FsZXNjZWRUbXBzW3ZdKTsKLSAgICAgICAgbV9jb2FsZXNjZWRUbXBzW3ZdID0gdTsKLQotICAg
ICAgICBhdXRvJiB2TW92ZXMgPSBtX21vdmVMaXN0W3ZdOwotICAgICAgICBtX21vdmVMaXN0W3Vd
LmFkZCh2TW92ZXMuYmVnaW4oKSwgdk1vdmVzLmVuZCgpKTsKLQotICAgICAgICBmb3JFYWNoQWRq
YWNlbnQodiwgW3RoaXMsIHVdIChJbmRleFR5cGUgYWRqYWNlbnRUbXBJbmRleCkgewotICAgICAg
ICAgICAgaWYgKGFkZEVkZ2VEaXN0aW5jdFdpdGhvdXREZWdyZWVDaGFuZ2UoYWRqYWNlbnRUbXBJ
bmRleCwgdSkpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB3ZSBhZGRlZCBhIG5ldyBlZGdlIGJl
dHdlZW4gdGhlIGFkamFjZW50VG1wIGFuZCB1LCBpdCByZXBsYWNlcyB0aGUgZWRnZQotICAgICAg
ICAgICAgICAgIC8vIHRoYXQgZXhpc3RlZCB3aXRoIHYuCi0gICAgICAgICAgICAgICAgLy8gVGhl
IGRlZ3JlZSBvZiBhZGphY2VudFRtcCByZW1haW5zIHRoZSBzYW1lIHNpbmNlIHRoZSBlZGdlIGp1
c3QgY2hhbmdlZCBmcm9tIHUgdG8gdi4KLSAgICAgICAgICAgICAgICAvLyBBbGwgd2UgbmVlZCB0
byBkbyBpcyB1cGRhdGUgdGhlIGRlZ3JlZSBvZiB1LgotICAgICAgICAgICAgICAgIGlmICghaXNQ
cmVjb2xvcmVkKHUpKQotICAgICAgICAgICAgICAgICAgICBtX2RlZ3JlZXNbdV0rKzsKLSAgICAg
ICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgd2UgYWxyZWFkeSBoYWQgYW4g
ZWRnZSBiZXR3ZWVuIHRoZSBhZGphY2VudFRtcCBhbmQgdSwgdGhlIGRlZ3JlZSBvZiB1Ci0gICAg
ICAgICAgICAgICAgLy8gaXMgYWxyZWFkeSBjb3JyZWN0LiBUaGUgZGVncmVlIG9mIHRoZSBhZGph
Y2VudFRtcCBkZWNyZWFzZXMgc2luY2UgdGhlIGVkZ2UKLSAgICAgICAgICAgICAgICAvLyB3aXRo
IHYgaXMgbm8gbG9uZ2VyIHJlbGV2YW50ICh3ZSBjYW4gdGhpbmsgb2YgaXQgYXMgbWVyZ2VkIHdp
dGggdGhlIGVkZ2Ugd2l0aCB1KS4KLSAgICAgICAgICAgICAgICBkZWNyZW1lbnREZWdyZWUoYWRq
YWNlbnRUbXBJbmRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGlm
IChtX2ZyYW1lUG9pbnRlckluZGV4ICYmIG1faW50ZXJmZXJlc1dpdGhGcmFtZVBvaW50ZXIucXVp
Y2tHZXQodikpCi0gICAgICAgICAgICBtX2ludGVyZmVyZXNXaXRoRnJhbWVQb2ludGVyLnF1aWNr
U2V0KHUpOwotCi0gICAgICAgIGlmIChtX2RlZ3JlZXNbdV0gPj0gbV9yZWdzSW5Qcmlvcml0eU9y
ZGVyLnNpemUoKSAmJiBtX2ZyZWV6ZVdvcmtsaXN0LnJlbW92ZSh1KSkKLSAgICAgICAgICAgIGFk
ZFRvU3BpbGwodSk7CisgICAgICAgIHJldHVybiBtX2lzT25TZWxlY3RTdGFjay5xdWlja0dldCh0
bXBJbmRleCkgfHwgISFtX2NvYWxlc2NlZFRtcHNbdG1wSW5kZXhdOwogICAgIH0KIAogICAgIGJv
b2wgY2FuQmVTYWZlbHlDb2FsZXNjZWQoSW5kZXhUeXBlIHUsIEluZGV4VHlwZSB2KQpAQCAtNDI5
LDcgKzIwMiw3IEBAIHByaXZhdGU6CiAgICAgICAgIGNvbnN0IGF1dG8mIGFkamFjZW50c09mVSA9
IG1fYWRqYWNlbmN5TGlzdFt1XTsKICAgICAgICAgY29uc3QgYXV0byYgYWRqYWNlbnRzT2ZWID0g
bV9hZGphY2VuY3lMaXN0W3ZdOwogCi0gICAgICAgIGlmIChhZGphY2VudHNPZlUuc2l6ZSgpICsg
YWRqYWNlbnRzT2ZWLnNpemUoKSA8IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkpIHsKKyAg
ICAgICAgaWYgKGFkamFjZW50c09mVS5zaXplKCkgKyBhZGphY2VudHNPZlYuc2l6ZSgpIDwgaygp
KSB7CiAgICAgICAgICAgICAvLyBTaG9ydGN1dDogaWYgdGhlIHRvdGFsIG51bWJlciBvZiBhZGph
Y2VudHMgaXMgbGVzcyB0aGFuIHRoZSBudW1iZXIgb2YgcmVnaXN0ZXIsIHRoZSBjb25kaXRpb24g
aXMgYWx3YXlzIG1ldC4KICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CkBAIC00
MzksMjMgKzIxMiwyMyBAQCBwcml2YXRlOgogICAgICAgICBmb3IgKEluZGV4VHlwZSBhZGphY2Vu
dFRtcEluZGV4IDogYWRqYWNlbnRzT2ZVKSB7CiAgICAgICAgICAgICBBU1NFUlQoYWRqYWNlbnRU
bXBJbmRleCAhPSB2KTsKICAgICAgICAgICAgIEFTU0VSVChhZGphY2VudFRtcEluZGV4ICE9IHUp
OwotICAgICAgICAgICAgaWYgKCFoYXNCZWVuU2ltcGxpZmllZChhZGphY2VudFRtcEluZGV4KSAm
JiBtX2RlZ3JlZXNbYWRqYWNlbnRUbXBJbmRleF0gPj0gbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNp
emUoKSkgeworICAgICAgICAgICAgaWYgKCFoYXNCZWVuU2ltcGxpZmllZChhZGphY2VudFRtcElu
ZGV4KSAmJiBtX2RlZ3JlZXNbYWRqYWNlbnRUbXBJbmRleF0gPj0gaygpKSB7CiAgICAgICAgICAg
ICAgICAgYXV0byBhZGRSZXN1bHQgPSBoaWdoT3JkZXJBZGphY2VudHMuYWRkKGFkamFjZW50VG1w
SW5kZXgpOwotICAgICAgICAgICAgICAgIGlmIChhZGRSZXN1bHQuaXNOZXdFbnRyeSAmJiBoaWdo
T3JkZXJBZGphY2VudHMuc2l6ZSgpID49IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkpCisg
ICAgICAgICAgICAgICAgaWYgKGFkZFJlc3VsdC5pc05ld0VudHJ5ICYmIGhpZ2hPcmRlckFkamFj
ZW50cy5zaXplKCkgPj0gaygpKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAg
ICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZm9yIChJbmRleFR5cGUgYWRqYWNlbnRU
bXBJbmRleCA6IGFkamFjZW50c09mVikgewogICAgICAgICAgICAgQVNTRVJUKGFkamFjZW50VG1w
SW5kZXggIT0gdSk7CiAgICAgICAgICAgICBBU1NFUlQoYWRqYWNlbnRUbXBJbmRleCAhPSB2KTsK
LSAgICAgICAgICAgIGlmICghaGFzQmVlblNpbXBsaWZpZWQoYWRqYWNlbnRUbXBJbmRleCkgJiYg
bV9kZWdyZWVzW2FkamFjZW50VG1wSW5kZXhdID49IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXpl
KCkpIHsKKyAgICAgICAgICAgIGlmICghaGFzQmVlblNpbXBsaWZpZWQoYWRqYWNlbnRUbXBJbmRl
eCkgJiYgbV9kZWdyZWVzW2FkamFjZW50VG1wSW5kZXhdID49IGsoKSkgewogICAgICAgICAgICAg
ICAgIGF1dG8gYWRkUmVzdWx0ID0gaGlnaE9yZGVyQWRqYWNlbnRzLmFkZChhZGphY2VudFRtcElu
ZGV4KTsKLSAgICAgICAgICAgICAgICBpZiAoYWRkUmVzdWx0LmlzTmV3RW50cnkgJiYgaGlnaE9y
ZGVyQWRqYWNlbnRzLnNpemUoKSA+PSBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpKQorICAg
ICAgICAgICAgICAgIGlmIChhZGRSZXN1bHQuaXNOZXdFbnRyeSAmJiBoaWdoT3JkZXJBZGphY2Vu
dHMuc2l6ZSgpID49IGsoKSkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAg
ICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgQVNTRVJUKGhpZ2hPcmRlckFkamFjZW50
cy5zaXplKCkgPCBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpKTsKKyAgICAgICAgQVNTRVJU
KGhpZ2hPcmRlckFkamFjZW50cy5zaXplKCkgPCBrKCkpOwogICAgICAgICByZXR1cm4gdHJ1ZTsK
ICAgICB9CiAKQEAgLTQ3OCwxOSArMjUxLDEyNyBAQCBwcml2YXRlOgogICAgICAgICBmb3IgKHVu
c2lnbmVkIGFkamFjZW50VG1wSW5kZXggOiBhZGphY2VudHNPZlYpIHsKICAgICAgICAgICAgIGlm
ICghaXNQcmVjb2xvcmVkKGFkamFjZW50VG1wSW5kZXgpCiAgICAgICAgICAgICAgICAgJiYgIWhh
c0JlZW5TaW1wbGlmaWVkKGFkamFjZW50VG1wSW5kZXgpCi0gICAgICAgICAgICAgICAgJiYgbV9k
ZWdyZWVzW2FkamFjZW50VG1wSW5kZXhdID49IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkK
LSAgICAgICAgICAgICAgICAmJiAhbV9pbnRlcmZlcmVuY2VFZGdlcy5jb250YWlucyhJbnRlcmZl
cmVuY2VFZGdlKHUsIGFkamFjZW50VG1wSW5kZXgpKSkKKyAgICAgICAgICAgICAgICAmJiBtX2Rl
Z3JlZXNbYWRqYWNlbnRUbXBJbmRleF0gPj0gaygpCisgICAgICAgICAgICAgICAgJiYgIWhhc0lu
dGVyZmVyZW5jZUVkZ2UoSW50ZXJmZXJlbmNlRWRnZSh1LCBhZGphY2VudFRtcEluZGV4KSkpCiAg
ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiB0
cnVlOwogICAgIH0KIAotcHJvdGVjdGVkOgotI2lmIFBMQVRGT1JNKENPQ09BKQotI3ByYWdtYSBt
YXJrIC0KLSNlbmRpZgorICAgIEluZGV4VHlwZSBzZWxlY3RTcGlsbCgpCisgICAgeworICAgICAg
ICBpZiAoIW1faGFzU2VsZWN0ZWRTcGlsbCkgeworICAgICAgICAgICAgbV9oYXNTZWxlY3RlZFNw
aWxsID0gdHJ1ZTsKIAotICAgIC8vIEludGVyZmVyZW5jZSBlZGdlcyBhcmUgbm90IGRpcmVjdGVk
LiBBbiBlZGdlIGJldHdlZW4gYW55IHR3byBUbXBzIGlzIHJlcHJlc2VudGVkCisgICAgICAgICAg
ICBpZiAobV9oYXNDb2FsZXNjZWROb25Ucml2aWFsTW92ZSkKKyAgICAgICAgICAgICAgICBtX2Nv
YWxlc2NlZFRtcHNBdFNwaWxsID0gbV9jb2FsZXNjZWRUbXBzOworICAgICAgICB9CisKKyAgICAg
ICAgYXV0byBpdGVyYXRvciA9IG1fc3BpbGxXb3JrbGlzdC5iZWdpbigpOworCisgICAgICAgIFJF
TEVBU0VfQVNTRVJUX1dJVEhfTUVTU0FHRShpdGVyYXRvciAhPSBtX3NwaWxsV29ya2xpc3QuZW5k
KCksICJzZWxlY3RTcGlsbCgpIGNhbGxlZCB3aGVuIHRoZXJlIHdhcyBubyBzcGlsbC4iKTsKKyAg
ICAgICAgUkVMRUFTRV9BU1NFUlRfV0lUSF9NRVNTQUdFKCFtX3Vuc3BpbGxhYmxlVG1wcy5jb250
YWlucygqaXRlcmF0b3IpLCAidHJ5aW5nIHRvIHNwaWxsIHVuc3BpbGxhYmxlIHRtcCIpOworCisg
ICAgICAgIC8vIEhpZ2hlciBzY29yZSBtZWFucyBtb3JlIGRlc2lyYWJsZSB0byBzcGlsbC4gTG93
ZXIgc2NvcmVzIG1heGltaXplIHRoZSBsaWtlbGlob29kIHRoYXQgYSB0bXAKKyAgICAgICAgLy8g
Z2V0cyBhIHJlZ2lzdGVyLgorICAgICAgICBhdXRvIHNjb3JlID0gWyZdIChUbXAgdG1wKSAtPiBk
b3VibGUgeworICAgICAgICAgICAgLy8gQWlyIGV4cG9zZXMgdGhlIGNvbmNlcHQgb2YgImZhc3Qg
dG1wcyIsIGFuZCB3ZSBpbnRlcnByZXQgdGhhdCB0byBtZWFuIHRoYXQgdGhlIHRtcAorICAgICAg
ICAgICAgLy8gc2hvdWxkIGFsd2F5cyBiZSBpbiBhIHJlZ2lzdGVyLgorICAgICAgICAgICAgaWYg
KG1fY29kZS5pc0Zhc3RUbXAodG1wKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAg
ICAgICAgIAorICAgICAgICAgICAgLy8gQWxsIGVsc2UgYmVpbmcgZXF1YWwsIHRoZSBzY29yZSBz
aG91bGQgYmUgZGlyZWN0bHkgcmVsYXRlZCB0byB0aGUgZGVncmVlLgorICAgICAgICAgICAgZG91
YmxlIGRlZ3JlZSA9IHN0YXRpY19jYXN0PGRvdWJsZT4obV9kZWdyZWVzW1RtcE1hcHBlcjo6YWJz
b2x1dGVJbmRleCh0bXApXSk7CisKKyAgICAgICAgICAgIC8vIEFsbCBlbHNlIGJlaW5nIGVxdWFs
LCB0aGUgc2NvcmUgc2hvdWxkIGJlIGludmVyc2VseSByZWxhdGVkIHRvIHRoZSBudW1iZXIgb2Yg
d2FybSB1c2VzIGFuZAorICAgICAgICAgICAgLy8gZGVmcy4KKyAgICAgICAgICAgIGNvbnN0IFVz
ZUNvdW50czxUbXA+OjpDb3VudHMqIGNvdW50cyA9IG1fdXNlQ291bnRzW3RtcF07CisgICAgICAg
ICAgICBpZiAoIWNvdW50cykKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xp
bWl0czxkb3VibGU+OjppbmZpbml0eSgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBkb3Vi
bGUgdXNlcyA9IGNvdW50cy0+bnVtV2FybVVzZXMgKyBjb3VudHMtPm51bURlZnM7CisKKyAgICAg
ICAgICAgIC8vIElmIGl0J3MgYSBjb25zdGFudCwgdGhlbiBpdCdzIG5vdCBhcyBiYWQgdG8gc3Bp
bGwuIFdlIGNhbiByZW1hdGVyaWFsaXplIGl0IGluIG1hbnkKKyAgICAgICAgICAgIC8vIGNhc2Vz
LgorICAgICAgICAgICAgaWYgKGNvdW50cy0+bnVtQ29uc3REZWZzID09IDEgJiYgY291bnRzLT5u
dW1EZWZzID09IDEpCisgICAgICAgICAgICAgICAgdXNlcyAvPSAyOworCisgICAgICAgICAgICBy
ZXR1cm4gZGVncmVlIC8gdXNlczsKKyAgICAgICAgfTsKKworICAgICAgICBhdXRvIHZpY3RpbUl0
ZXJhdG9yID0gaXRlcmF0b3I7CisgICAgICAgIGRvdWJsZSBtYXhTY29yZSA9IHNjb3JlKFRtcE1h
cHBlcjo6dG1wRnJvbUFic29sdXRlSW5kZXgoKml0ZXJhdG9yKSk7CisKKyAgICAgICAgKytpdGVy
YXRvcjsKKyAgICAgICAgZm9yICg7aXRlcmF0b3IgIT0gbV9zcGlsbFdvcmtsaXN0LmVuZCgpOyAr
K2l0ZXJhdG9yKSB7CisgICAgICAgICAgICBkb3VibGUgdG1wU2NvcmUgPSBzY29yZShUbXBNYXBw
ZXI6OnRtcEZyb21BYnNvbHV0ZUluZGV4KCppdGVyYXRvcikpOworICAgICAgICAgICAgaWYgKHRt
cFNjb3JlID4gbWF4U2NvcmUpIHsKKyAgICAgICAgICAgICAgICBBU1NFUlQoIW1fdW5zcGlsbGFi
bGVUbXBzLmNvbnRhaW5zKCppdGVyYXRvcikpOworICAgICAgICAgICAgICAgIHZpY3RpbUl0ZXJh
dG9yID0gaXRlcmF0b3I7CisgICAgICAgICAgICAgICAgbWF4U2NvcmUgPSB0bXBTY29yZTsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEluZGV4VHlwZSB2aWN0aW1JbmRleCA9
ICp2aWN0aW1JdGVyYXRvcjsKKyAgICAgICAgaWYgKHRyYWNlRGVidWcpCisgICAgICAgICAgICBk
YXRhTG9nTG4oIlNlbGVjdGluZyBzcGlsbCAiLCB2aWN0aW1JbmRleCk7CisgICAgICAgIEFTU0VS
VCghaXNQcmVjb2xvcmVkKHZpY3RpbUluZGV4KSk7CisgICAgICAgIHJldHVybiB2aWN0aW1JbmRl
eDsKKyAgICB9CisKKyAgICB2b2lkIGFzc2lnbkNvbG9ycygpCisgICAgeworICAgICAgICBBU1NF
UlQobV9zaW1wbGlmeVdvcmtsaXN0LmlzRW1wdHkoKSk7CisgICAgICAgIEFTU0VSVCghbV9zcGls
bFdvcmtsaXN0LmJpdENvdW50KCkpOworCisgICAgICAgIC8vIFJlY2xhaW0gYXMgbXVjaCBtZW1v
cnkgYXMgcG9zc2libGUuCisgICAgICAgIG1faW50ZXJmZXJlbmNlRWRnZXMuY2xlYXJBbGwoKTsK
KworICAgICAgICBtX2RlZ3JlZXMuY2xlYXIoKTsKKyAgICAgICAgbV9tb3ZlTGlzdC5jbGVhcigp
OworICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuY2xlYXIoKTsKKyAgICAgICAgbV9zcGlsbFdv
cmtsaXN0LmNsZWFyQWxsKCk7CisKKyAgICAgICAgLy8gVHJ5IHRvIGNvbG9yIHRoZSBUbXAgb24g
dGhlIHN0YWNrLgorICAgICAgICBtX2NvbG9yZWRUbXAucmVzaXplKG1fYWRqYWNlbmN5TGlzdC5z
aXplKCkpOworCisgICAgICAgIHdoaWxlICghbV9zZWxlY3RTdGFjay5pc0VtcHR5KCkpIHsKKyAg
ICAgICAgICAgIHVuc2lnbmVkIHRtcEluZGV4ID0gbV9zZWxlY3RTdGFjay50YWtlTGFzdCgpOwor
ICAgICAgICAgICAgQVNTRVJUKCFpc1ByZWNvbG9yZWQodG1wSW5kZXgpKTsKKyAgICAgICAgICAg
IEFTU0VSVCghbV9jb2xvcmVkVG1wW3RtcEluZGV4XSk7CisKKyAgICAgICAgICAgIFJlZ2lzdGVy
U2V0IGNvbG9yZWRSZWdpc3RlcnM7CisgICAgICAgICAgICBmb3IgKEluZGV4VHlwZSBhZGphY2Vu
dFRtcEluZGV4IDogbV9hZGphY2VuY3lMaXN0W3RtcEluZGV4XSkgeworICAgICAgICAgICAgICAg
IEluZGV4VHlwZSBhbGlhc1RtcEluZGV4ID0gZ2V0QWxpYXMoYWRqYWNlbnRUbXBJbmRleCk7Cisg
ICAgICAgICAgICAgICAgUmVnIHJlZyA9IG1fY29sb3JlZFRtcFthbGlhc1RtcEluZGV4XTsKKwor
ICAgICAgICAgICAgICAgIEFTU0VSVCghaXNQcmVjb2xvcmVkKGFsaWFzVG1wSW5kZXgpIHx8IChp
c1ByZWNvbG9yZWQoYWxpYXNUbXBJbmRleCkgJiYgcmVnKSk7CisKKyAgICAgICAgICAgICAgICBp
ZiAocmVnKQorICAgICAgICAgICAgICAgICAgICBjb2xvcmVkUmVnaXN0ZXJzLnNldChyZWcpOwor
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sIGNvbG9yQXNzaWduZWQgPSBmYWxzZTsK
KyAgICAgICAgICAgIGZvciAoUmVnIHJlZyA6IG1fcmVnc0luUHJpb3JpdHlPcmRlcikgeworICAg
ICAgICAgICAgICAgIGlmICghY29sb3JlZFJlZ2lzdGVycy5nZXQocmVnKSkgeworICAgICAgICAg
ICAgICAgICAgICBtX2NvbG9yZWRUbXBbdG1wSW5kZXhdID0gcmVnOworICAgICAgICAgICAgICAg
ICAgICBjb2xvckFzc2lnbmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWNvbG9y
QXNzaWduZWQpCisgICAgICAgICAgICAgICAgbV9zcGlsbGVkVG1wcy5hcHBlbmQodG1wSW5kZXgp
OworICAgICAgICB9CisgICAgICAgIG1fc2VsZWN0U3RhY2suY2xlYXIoKTsKKworICAgICAgICBp
ZiAobV9zcGlsbGVkVG1wcy5pc0VtcHR5KCkpCisgICAgICAgICAgICBtX2NvYWxlc2NlZFRtcHNB
dFNwaWxsLmNsZWFyKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1fY29sb3JlZFRtcC5j
bGVhcigpOworICAgIH0KKworICAgIC8vIEludGVyZmVyZW5jZSBlZGdlcyBhcmUgbm90IGRpcmVj
dGVkLiBBbiBlZGdlIGJldHdlZW4gYW55IHR3byBUbXBzIGlzIHJlcHJlc2VudGVkCiAgICAgLy8g
YnkgdGhlIGNvbmNhdGVuYXRlZCB2YWx1ZXMgb2YgdGhlIHNtYWxsZXN0IFRtcCBmb2xsb3dlZCBi
eSB0aGUgYmlnZ2VyIFRtcC4KICAgICBjbGFzcyBJbnRlcmZlcmVuY2VFZGdlIHsKICAgICBwdWJs
aWM6CkBAIC01MzQsNjAgKzQxNSw3MjMgQEAgcHJvdGVjdGVkOgogICAgICAgICAgICAgcmV0dXJu
ICp0aGlzID09IEludGVyZmVyZW5jZUVkZ2UoV1RGOjpIYXNoVGFibGVEZWxldGVkVmFsdWUpOwog
ICAgICAgICB9CiAKLSAgICAgICAgdW5zaWduZWQgaGFzaCgpIGNvbnN0Ci0gICAgICAgIHsKLSAg
ICAgICAgICAgIHJldHVybiBXVEY6OkludEhhc2g8dWludDY0X3Q+OjpoYXNoKG1fdmFsdWUpOwot
ICAgICAgICB9CisgICAgICAgIHVuc2lnbmVkIGhhc2goKSBjb25zdAorICAgICAgICB7CisgICAg
ICAgICAgICByZXR1cm4gV1RGOjpJbnRIYXNoPHVpbnQ2NF90Pjo6aGFzaChtX3ZhbHVlKTsKKyAg
ICAgICAgfQorCisgICAgICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAorICAg
ICAgICB7CisgICAgICAgICAgICBvdXQucHJpbnQoZmlyc3QoKSwgIjw9PiIsIHNlY29uZCgpKTsK
KyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgdWludDY0X3QgbV92YWx1ZSB7IDAg
fTsKKyAgICB9OworCisgICAgdW5zaWduZWQgbV90bXBBcnJheVNpemU7CisgICAgYm9vbCBhZGRJ
bnRlcmZlcmVuY2VFZGdlKEludGVyZmVyZW5jZUVkZ2UgZWRnZSkKKyAgICB7CisgICAgICAgIC8v
IHJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGEgbmV3IGVkZ2UuCisgICAgICAgIHJldHVybiBtX2lu
dGVyZmVyZW5jZUVkZ2VzLmFkZChlZGdlLmZpcnN0KCkqbV90bXBBcnJheVNpemUgKyBlZGdlLnNl
Y29uZCgpKTsKKyAgICAgICAgLy9yZXR1cm4gbV9pbnRlcmZlcmVuY2VFZGdlcy5hZGQoZWRnZSku
aXNOZXdFbnRyeTsKKyAgICB9CisKKyAgICBib29sIGhhc0ludGVyZmVyZW5jZUVkZ2UoSW50ZXJm
ZXJlbmNlRWRnZSBlZGdlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1faW50ZXJmZXJlbmNlRWRn
ZXMucXVpY2tHZXQoZWRnZS5maXJzdCgpKm1fdG1wQXJyYXlTaXplICsgZWRnZS5zZWNvbmQoKSk7
CisgICAgICAgIC8vcmV0dXJuIG1faW50ZXJmZXJlbmNlRWRnZXMuY29udGFpbnMoZWRnZSk7Cisg
ICAgfQorCisgICAgc3RydWN0IEludGVyZmVyZW5jZUVkZ2VIYXNoIHsKKyAgICAgICAgc3RhdGlj
IHVuc2lnbmVkIGhhc2goY29uc3QgSW50ZXJmZXJlbmNlRWRnZSYga2V5KSB7IHJldHVybiBrZXku
aGFzaCgpOyB9CisgICAgICAgIHN0YXRpYyBib29sIGVxdWFsKGNvbnN0IEludGVyZmVyZW5jZUVk
Z2UmIGEsIGNvbnN0IEludGVyZmVyZW5jZUVkZ2UmIGIpIHsgcmV0dXJuIGEgPT0gYjsgfQorICAg
ICAgICBzdGF0aWMgY29uc3QgYm9vbCBzYWZlVG9Db21wYXJlVG9FbXB0eU9yRGVsZXRlZCA9IHRy
dWU7CisgICAgfTsKKyAgICB0eXBlZGVmIFNpbXBsZUNsYXNzSGFzaFRyYWl0czxJbnRlcmZlcmVu
Y2VFZGdlPiBJbnRlcmZlcmVuY2VFZGdlSGFzaFRyYWl0czsKKworICAgIGNvbnN0IFZlY3RvcjxS
ZWc+JiBtX3JlZ3NJblByaW9yaXR5T3JkZXI7CisgICAgUmVnaXN0ZXJTZXQgbV9tdXRhYmxlUmVn
czsKKyAgICBJbmRleFR5cGUgbV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXggeyAwIH07CisK
KyAgICAvLyBUaGUgaW50ZXJmZXJlbmNlIGdyYXBoLgorICAgIC8vSGFzaFNldDxJbnRlcmZlcmVu
Y2VFZGdlLCBJbnRlcmZlcmVuY2VFZGdlSGFzaCwgSW50ZXJmZXJlbmNlRWRnZUhhc2hUcmFpdHM+
IG1faW50ZXJmZXJlbmNlRWRnZXM7CisgICAgQml0VmVjdG9yIG1faW50ZXJmZXJlbmNlRWRnZXM7
CisKKyAgICBWZWN0b3I8VmVjdG9yPEluZGV4VHlwZSwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3cs
IDQ+LCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9hZGphY2VuY3lMaXN0OworICAgIFZlY3Rv
cjxJbmRleFR5cGUsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX2RlZ3JlZXM7CisKKyAgICAv
LyBJbnN0ZWFkIG9mIGtlZXBpbmcgdHJhY2sgb2YgdGhlIG1vdmUgaW5zdHJ1Y3Rpb25zLCB3ZSBq
dXN0IGtlZXAgdGhlaXIgb3BlcmFuZHMgYXJvdW5kIGFuZCB1c2UgdGhlIGluZGV4CisgICAgLy8g
aW4gdGhlIHZlY3RvciBhcyB0aGUgImlkZW50aWZpZXIiIGZvciB0aGUgbW92ZS4KKyAgICBzdHJ1
Y3QgTW92ZU9wZXJhbmRzIHsKKyAgICAgICAgSW5kZXhUeXBlIHNyY0luZGV4OworICAgICAgICBJ
bmRleFR5cGUgZHN0SW5kZXg7CisgICAgfTsKKyAgICBWZWN0b3I8TW92ZU9wZXJhbmRzLCAwLCBV
bnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9jb2FsZXNjaW5nQ2FuZGlkYXRlczsKKworICAgIC8vIExp
c3Qgb2YgZXZlcnkgbW92ZSBpbnN0cnVjdGlvbiBhc3NvY2lhdGVkIHdpdGggYSBUbXAuCisgICAg
VmVjdG9yPEhhc2hTZXQ8SW5kZXhUeXBlLCB0eXBlbmFtZSBEZWZhdWx0SGFzaDxJbmRleFR5cGU+
OjpIYXNoLCBXVEY6OlVuc2lnbmVkV2l0aFplcm9LZXlIYXNoVHJhaXRzPEluZGV4VHlwZT4+PiBt
X21vdmVMaXN0OworCisgICAgLy8gQ29sb3JzLgorICAgIFZlY3RvcjxSZWcsIDAsIFVuc2FmZVZl
Y3Rvck92ZXJmbG93PiBtX2NvbG9yZWRUbXA7CisgICAgVmVjdG9yPEluZGV4VHlwZT4gbV9zcGls
bGVkVG1wczsKKworICAgIC8vIFZhbHVlcyB0aGF0IGhhdmUgYmVlbiBjb2FsZXNjZWQgd2l0aCBh
biBvdGhlciB2YWx1ZS4KKyAgICBWZWN0b3I8SW5kZXhUeXBlLCAwLCBVbnNhZmVWZWN0b3JPdmVy
Zmxvdz4gbV9jb2FsZXNjZWRUbXBzOworCisgICAgLy8gVGhlIHN0YWNrIG9mIFRtcCByZW1vdmVk
IGZyb20gdGhlIGdyYXBoIGFuZCByZWFkeSBmb3IgY29sb3JpbmcuCisgICAgQml0VmVjdG9yIG1f
aXNPblNlbGVjdFN0YWNrOworICAgIFZlY3RvcjxJbmRleFR5cGU+IG1fc2VsZWN0U3RhY2s7CisK
KyAgICBJbmRleFR5cGUgbV9mcmFtZVBvaW50ZXJJbmRleCB7IDAgfTsKKyAgICBCaXRWZWN0b3Ig
bV9pbnRlcmZlcmVzV2l0aEZyYW1lUG9pbnRlcjsKKyAgICAvLyBMb3ctZGVncmVlLCBub24tTW92
ZSByZWxhdGVkLgorICAgIFZlY3RvcjxJbmRleFR5cGU+IG1fc2ltcGxpZnlXb3JrbGlzdDsKKyAg
ICAvLyBIaWdoLWRlZ3JlZSBUbXAuCisgICAgQml0VmVjdG9yIG1fc3BpbGxXb3JrbGlzdDsKKwor
ICAgIGJvb2wgbV9oYXNTZWxlY3RlZFNwaWxsIHsgZmFsc2UgfTsKKyAgICBib29sIG1faGFzQ29h
bGVzY2VkTm9uVHJpdmlhbE1vdmUgeyBmYWxzZSB9OworCisgICAgLy8gVGhlIG1hcHBpbmcgb2Yg
VG1wIHRvIHRoZWlyIGFsaWFzIGZvciBNb3ZlcyB0aGF0IGFyZSBhbHdheXMgY29hbGVzY2luZyBy
ZWdhcmRsZXNzIG9mIHNwaWxsaW5nLgorICAgIFZlY3RvcjxJbmRleFR5cGUsIDAsIFVuc2FmZVZl
Y3Rvck92ZXJmbG93PiBtX2NvYWxlc2NlZFRtcHNBdFNwaWxsOworICAgIAorICAgIGNvbnN0IEhh
c2hTZXQ8dW5zaWduZWQ+JiBtX3Vuc3BpbGxhYmxlVG1wczsKKyAgICBjb25zdCBVc2VDb3VudHM8
VG1wPiYgbV91c2VDb3VudHM7CisgICAgQ29kZSYgbV9jb2RlOworfTsKKwordGVtcGxhdGUgPHR5
cGVuYW1lIEluZGV4VHlwZSwgdHlwZW5hbWUgVG1wTWFwcGVyPgorY2xhc3MgQnJpZ2dzIDogcHVi
bGljIEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0b3I8SW5kZXhUeXBlLCBUbXBNYXBwZXI+IHsKKyAg
ICB1c2luZyBCYXNlID0gQWJzdHJhY3RDb2xvcmluZ0FsbG9jYXRvcjxJbmRleFR5cGUsIFRtcE1h
cHBlcj47Citwcm90ZWN0ZWQ6CisgICAgdXNpbmcgQmFzZTo6bV9pc09uU2VsZWN0U3RhY2s7Cisg
ICAgdXNpbmcgQmFzZTo6bV9zZWxlY3RTdGFjazsKKyAgICB1c2luZyBCYXNlOjptX2ZyYW1lUG9p
bnRlckluZGV4OworICAgIHVzaW5nIEJhc2U6Om1faW50ZXJmZXJlc1dpdGhGcmFtZVBvaW50ZXI7
CisgICAgdXNpbmcgQmFzZTo6bV9zaW1wbGlmeVdvcmtsaXN0OworICAgIHVzaW5nIEJhc2U6Om1f
c3BpbGxXb3JrbGlzdDsKKyAgICB1c2luZyBCYXNlOjptX2hhc1NlbGVjdGVkU3BpbGw7CisgICAg
dXNpbmcgQmFzZTo6bV9oYXNDb2FsZXNjZWROb25Ucml2aWFsTW92ZTsKKyAgICB1c2luZyBCYXNl
OjptX2RlZ3JlZXM7CisgICAgdXNpbmcgQmFzZTo6azsKKyAgICB1c2luZyBCYXNlOjptX2NvYWxl
c2NlZFRtcHM7CisgICAgdXNpbmcgQmFzZTo6bV9tb3ZlTGlzdDsKKyAgICB1c2luZyBCYXNlOjpt
X3VzZUNvdW50czsKKyAgICB1c2luZyBCYXNlOjptX2NvYWxlc2NlZFRtcHNBdFNwaWxsOworICAg
IHVzaW5nIEJhc2U6Om1fc3BpbGxlZFRtcHM7CisgICAgdXNpbmcgdHlwZW5hbWUgQmFzZTo6TW92
ZU9wZXJhbmRzOworICAgIHVzaW5nIEJhc2U6Om1fY29hbGVzY2luZ0NhbmRpZGF0ZXM7CisgICAg
dXNpbmcgQmFzZTo6bV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXg7CisgICAgdXNpbmcgQmFz
ZTo6bV9jb2xvcmVkVG1wOworICAgIHVzaW5nIEJhc2U6Om1fY29kZTsKKyAgICB1c2luZyB0eXBl
bmFtZSBCYXNlOjpJbnRlcmZlcmVuY2VFZGdlOworICAgIHVzaW5nIEJhc2U6Om1fdW5zcGlsbGFi
bGVUbXBzOworICAgIHVzaW5nIEJhc2U6Omhhc0ludGVyZmVyZW5jZUVkZ2U7CisgICAgdXNpbmcg
QmFzZTo6Z2V0QWxpYXM7CisgICAgdXNpbmcgQmFzZTo6YWRkRWRnZTsKKyAgICB1c2luZyBCYXNl
Ojppc1ByZWNvbG9yZWQ7CisgICAgdXNpbmcgQmFzZTo6Y2FuQmVTYWZlbHlDb2FsZXNjZWQ7Cisg
ICAgdXNpbmcgQmFzZTo6YWRkRWRnZURpc3RpbmN0V2l0aG91dERlZ3JlZUNoYW5nZTsKKyAgICB1
c2luZyBCYXNlOjpmb3JFYWNoQWRqYWNlbnQ7CisgICAgdXNpbmcgQmFzZTo6aGFzQmVlblNpbXBs
aWZpZWQ7CisgICAgdXNpbmcgQmFzZTo6YWRkVG9TcGlsbDsKKworcHVibGljOgorICAgIEJyaWdn
cyhDb2RlJiBjb2RlLCBjb25zdCBWZWN0b3I8UmVnPiYgcmVnc0luUHJpb3JpdHlPcmRlciwgSW5k
ZXhUeXBlIGxhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleCwgdW5zaWduZWQgdG1wQXJyYXlTaXpl
LCBjb25zdCBIYXNoU2V0PHVuc2lnbmVkPiYgdW5zcGlsbGFibGVUbXBzLCBjb25zdCBVc2VDb3Vu
dHM8VG1wPiYgdXNlQ291bnRzKQorICAgICAgICA6IEJhc2UoY29kZSwgcmVnc0luUHJpb3JpdHlP
cmRlciwgbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4LCB0bXBBcnJheVNpemUsIHVuc3BpbGxh
YmxlVG1wcywgdXNlQ291bnRzKQorICAgIHsKKyAgICB9CisKKyAgICB2b2lkIGFsbG9jYXRlKCkK
KyAgICB7CisgICAgICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOworCisgICAgICAgIGF1dG8gY29h
bGVzY2VNb3ZlID0gWyZdICh1bnNpZ25lZCYgbW92ZSkgeworICAgICAgICAgICAgYm9vbCBjb2Fs
ZXNjZWQgPSBjb2FsZXNjZShtb3ZlKTsKKyAgICAgICAgICAgIGlmIChjb2FsZXNjZWQpIHsKKyAg
ICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAvLyBBbiBpbmRp
Y2F0aW9uIHdlIHdvbid0IG5lZWQgdG8gaGFuZGxlIHRoaXMgbW92ZSBpbiB0aGUgZnV0dXJlLgor
ICAgICAgICAgICAgICAgIG1vdmUgPSBVSU5UX01BWDsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
fTsKKworICAgICAgICAvLyBXZSBmaXJzdCBjb2FsZXNjZSB1bnRpbCB3ZSBjYW4ndCBjb2FsZXNj
ZSBhbnkgbW9yZS4KKyAgICAgICAgZG8geworICAgICAgICAgICAgY2hhbmdlZCA9IGZhbHNlOwor
ICAgICAgICAgICAgbV93b3JrbGlzdE1vdmVzLmZvckVhY2hNb3ZlKGNvYWxlc2NlTW92ZSk7Cisg
ICAgICAgIH0gd2hpbGUgKGNoYW5nZWQpOworICAgICAgICBkbyB7CisgICAgICAgICAgICBjaGFu
Z2VkID0gZmFsc2U7CisgICAgICAgICAgICBtX3dvcmtsaXN0TW92ZXMuZm9yRWFjaExvd1ByaW9y
aXR5TW92ZShjb2FsZXNjZU1vdmUpOworICAgICAgICB9IHdoaWxlIChjaGFuZ2VkKTsKKworICAg
ICAgICAvLyBUaGVuIHdlIGNyZWF0ZSBvdXIgc2VsZWN0IHN0YWNrLiBUaGUgaW52YXJpYW50IHdl
IHN0YXJ0IHdpdGggaGVyZSBpcyB0aGF0IG5vZGVzIGluCisgICAgICAgIC8vIHRoZSBpbnRlcmZl
cmVuY2UgZ3JhcGggd2l0aCBkZWdyZWUgPj0gayBhcmUgb24gdGhlIHNwaWxsIGxpc3QuIE5vZGVz
IHdpdGggZGVncmVlIDwgaworICAgICAgICAvLyBhcmUgb24gdGhlIHNpbXBsaWZ5IHdvcmtsaXN0
LiAgQSBub2RlIGNhbiBtb3ZlIGZyb20gdGhlIHNwaWxsIGxpc3QgdG8gdGhlIHNpbXBsaWZ5Cisg
ICAgICAgIC8vIGxpc3QgKGJ1dCBub3QgdGhlIG90aGVyIHdheSBhcm91bmQsIG5vdGUgdGhhdCB0
aGlzIGlzIGRpZmZlcmVudCB0aGFuIElSQyBiZWNhdXNlIElSQworICAgICAgICAvLyBydW5zIHRo
aXMgd2hpbGUgY29hbGVzY2luZywgYnV0IHdlIGRvIGFsbCBvdXIgY29hbGVzY2luZyBiZWZvcmUg
dGhpcykuIE9uY2UgYSBub2RlIGlzCisgICAgICAgIC8vIGFkZGVkIHRvIHRoZSBzZWxlY3Qgc3Rh
Y2ssIGl0J3Mgbm90IG9uIGVpdGhlciBsaXN0LCBidXQgb25seSBvbiB0aGUgc2VsZWN0IHN0YWNr
LgorICAgICAgICAvLyBPbmNlIG9uIHRoZSBzZWxlY3Qgc3RhY2ssIGxvZ2ljYWxseSwgaXQncyBu
byBsb25nZXIgaW4gdGhlIGludGVyZmVyZW5jZSBncmFwaC4KKyAgICAgICAgLy8gRklYTUU6IEFk
ZCBhIHdheSB0byBhc3NlcnQgdGhpcyBhdCBlYWNoIHNpbXBsaWZ5IHN0ZXAuCisKKyAgICAgICAg
bWFrZUluaXRpYWxXb3JrbGlzdCgpOworICAgICAgICBkbyB7CisgICAgICAgICAgICBjaGFuZ2Vk
ID0gZmFsc2U7CisKKyAgICAgICAgICAgIHdoaWxlIChtX3NpbXBsaWZ5V29ya2xpc3Quc2l6ZSgp
KQorICAgICAgICAgICAgICAgIHNpbXBsaWZ5KCk7CisKKyAgICAgICAgICAgIGlmIChtX3NwaWxs
V29ya2xpc3QuYml0Q291bnQoKSkgeworICAgICAgICAgICAgICAgIHNlbGVjdFNwaWxsKCk7Cisg
ICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgQVNTRVJUKG1f
c2ltcGxpZnlXb3JrbGlzdC5zaXplKCkgPT0gMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0g
d2hpbGUgKGNoYW5nZWQpOworCisgICAgICAgIC8vIEZJWE1FOiBhc3NlcnQgZXZlcnl0aGluZyB3
ZSBzdGFydGVkIHcvIGlzIG9uIHRoZSBzaW1wbGlmeSBzdGFjay4KKyAgICAgICAgQVNTRVJUKCFt
X3NpbXBsaWZ5V29ya2xpc3Quc2l6ZSgpKTsKKyAgICAgICAgYXNzaWduQ29sb3JzKCk7CisgICAg
fQorCitwcm90ZWN0ZWQ6CisgICAgCisKKyAgICBib29sIGNvYWxlc2NlKHVuc2lnbmVkJiBtb3Zl
SW5kZXgpCisgICAgeworICAgICAgICBjb25zdCBNb3ZlT3BlcmFuZHMmIG1vdmVPcGVyYW5kcyA9
IG1fY29hbGVzY2luZ0NhbmRpZGF0ZXNbbW92ZUluZGV4XTsKKyAgICAgICAgSW5kZXhUeXBlIHUg
PSBnZXRBbGlhcyhtb3ZlT3BlcmFuZHMuc3JjSW5kZXgpOworICAgICAgICBJbmRleFR5cGUgdiA9
IGdldEFsaWFzKG1vdmVPcGVyYW5kcy5kc3RJbmRleCk7CisKKyAgICAgICAgaWYgKGlzUHJlY29s
b3JlZCh2KSkKKyAgICAgICAgICAgIHN0ZDo6c3dhcCh1LCB2KTsKKworICAgICAgICBpZiAodHJh
Y2VEZWJ1ZykKKyAgICAgICAgICAgIGRhdGFMb2coIkNvYWxlc2NpbmcgbW92ZSBhdCBpbmRleCAi
LCBtb3ZlSW5kZXgsICIgdSA9ICIsIHUsICIgdiA9ICIsIHYsICIgICAgIik7CisKKyAgICAgICAg
aWYgKHUgPT0gdikgeworICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpCisgICAgICAgICAgICAg
ICAgZGF0YUxvZygiQWxyZWFkeSBDb2FsZXNjZWQuIFRoZXkncmUgZXF1YWwuJ1xuIik7CisgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNQcmVjb2xv
cmVkKHYpCisgICAgICAgICAgICB8fCBoYXNJbnRlcmZlcmVuY2VFZGdlKEludGVyZmVyZW5jZUVk
Z2UodSwgdikpCisgICAgICAgICAgICB8fCAodSA9PSBtX2ZyYW1lUG9pbnRlckluZGV4ICYmIG1f
aW50ZXJmZXJlc1dpdGhGcmFtZVBvaW50ZXIucXVpY2tHZXQodikpKSB7CisKKyAgICAgICAgICAg
IC8vIE5vIG5lZWQgdG8gZXZlciBjb25zaWRlciB0aGlzIG1vdmUgYWdhaW4gaWYgaXQgaW50ZXJm
ZXJlcy4KKyAgICAgICAgICAgIC8vIE5vIGNvYWxlc2Npbmcgd2lsbCByZW1vdmUgdGhlIGludGVy
ZmVyZW5jZS4KKyAgICAgICAgICAgIG1vdmVJbmRleCA9IFVJTlRfTUFYOworCisgICAgICAgICAg
ICAvLyBGSVhNRTogbWFyayBtb3ZlIGFzIG5ldmVyIGJlaW5nIGNvYWxlc2NhYmxlIGFnYWluIChz
aW5jZSB3ZSdyZSBub3QgdXNpbmcKKyAgICAgICAgICAgIC8vIElSQywgdGhpcyBpcyBkZWZpbml0
ZWx5IHRydWUpCisKKyAgICAgICAgICAgIGlmICghQVNTRVJUX0RJU0FCTEVEKSB7CisgICAgICAg
ICAgICAgICAgaWYgKGlzUHJlY29sb3JlZCh2KSkKKyAgICAgICAgICAgICAgICAgICAgQVNTRVJU
KGlzUHJlY29sb3JlZCh1KSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0cmFj
ZURlYnVnKQorICAgICAgICAgICAgICAgIGRhdGFMb2coIkNvbnN0cmFpbmVkXG4iKTsKKworICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAo
Y2FuQmVTYWZlbHlDb2FsZXNjZWQodSwgdikpIHsKKyAgICAgICAgICAgIGNvbWJpbmUodSwgdik7
CisgICAgICAgICAgICBtX2hhc0NvYWxlc2NlZE5vblRyaXZpYWxNb3ZlID0gdHJ1ZTsKKworICAg
ICAgICAgICAgaWYgKHRyYWNlRGVidWcpCisgICAgICAgICAgICAgICAgZGF0YUxvZygiICAgIFNh
ZmUgQ29hbGVzY2luZ1xuIik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQor
CisgICAgICAgIC8vIEZJWE1FOiBJIHRoaW5rIHdlIGNhbiBtYXJrIG1vdmUgYXMgbmV2ZXIgYmVp
bmcgY29hbGVzY2FibGUgYWdhaW4KKyAgICAgICAgLy8gKHNpbmNlIHdlJ3JlIG5vdCB1c2luZyBJ
UkMsIHRoaXMgaXMgcHJvYmFibHkgdHJ1ZSkuIElmIHRoZSBjb25zZXJ2YXRpdmUKKyAgICAgICAg
Ly8gaGV1cmlzdGljIGZhaWxzLCB3aWxsIGl0IGV2ZXIgc3VjY2VlZCBpbiB0aGUgZnV0dXJlPyBJ
IHRoaW5rIG5vdC4gQnV0CisgICAgICAgIC8vIG5lZWQgdG8gY29udmluY2UgbXlzZWxmLiBIbW1t
LiBNYXliZSBpdCBjYW4sIHNpbmNlIGNvbWJpbmluZyBtYXkKKyAgICAgICAgLy8gbG93ZXIgdGhl
IGRlZ3JlZS4gSSBuZWVkIHRvIHRoaW5rIG1vcmUgYWJvdXQgdGhpcy4KKworICAgICAgICBpZiAo
dHJhY2VEZWJ1ZykKKyAgICAgICAgICAgIGRhdGFMb2coIiAgICBGYWlsZWQgY29hbGVzY2luZywg
YWRkZWQgdG8gYWN0aXZlIG1vdmVzLlxuIik7CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
IH0KKworICAgIHZvaWQgY29tYmluZShJbmRleFR5cGUgdSwgSW5kZXhUeXBlIHYpCisgICAgewor
ICAgICAgICBBU1NFUlQoIW1fY29hbGVzY2VkVG1wc1t2XSk7CisgICAgICAgIG1fY29hbGVzY2Vk
VG1wc1t2XSA9IHU7CisKKyAgICAgICAgYXV0byYgdk1vdmVzID0gbV9tb3ZlTGlzdFt2XTsKKyAg
ICAgICAgbV9tb3ZlTGlzdFt1XS5hZGQodk1vdmVzLmJlZ2luKCksIHZNb3Zlcy5lbmQoKSk7CisK
KyAgICAgICAgZm9yRWFjaEFkamFjZW50KHYsIFt0aGlzLCB1XSAoSW5kZXhUeXBlIGFkamFjZW50
VG1wSW5kZXgpIHsKKyAgICAgICAgICAgIGlmIChhZGRFZGdlRGlzdGluY3RXaXRob3V0RGVncmVl
Q2hhbmdlKGFkamFjZW50VG1wSW5kZXgsIHUpKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgd2Ug
YWRkZWQgYSBuZXcgZWRnZSBiZXR3ZWVuIHRoZSBhZGphY2VudFRtcCBhbmQgdSwgaXQgcmVwbGFj
ZXMgdGhlIGVkZ2UKKyAgICAgICAgICAgICAgICAvLyB0aGF0IGV4aXN0ZWQgd2l0aCB2LgorICAg
ICAgICAgICAgICAgIC8vIFRoZSBkZWdyZWUgb2YgYWRqYWNlbnRUbXAgcmVtYWlucyB0aGUgc2Ft
ZSBzaW5jZSB0aGUgZWRnZSBqdXN0IGNoYW5nZWQgZnJvbSB1IHRvIHYuCisgICAgICAgICAgICAg
ICAgLy8gQWxsIHdlIG5lZWQgdG8gZG8gaXMgdXBkYXRlIHRoZSBkZWdyZWUgb2YgdS4KKyAgICAg
ICAgICAgICAgICBpZiAoIWlzUHJlY29sb3JlZCh1KSkKKyAgICAgICAgICAgICAgICAgICAgbV9k
ZWdyZWVzW3VdKys7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIElm
IHdlIGFscmVhZHkgaGFkIGFuIGVkZ2UgYmV0d2VlbiB0aGUgYWRqYWNlbnRUbXAgYW5kIHUsIHRo
ZSBkZWdyZWUgb2YgdQorICAgICAgICAgICAgICAgIC8vIGlzIGFscmVhZHkgY29ycmVjdC4gVGhl
IGRlZ3JlZSBvZiB0aGUgYWRqYWNlbnRUbXAgZGVjcmVhc2VzIHNpbmNlIHRoZSBlZGdlCisgICAg
ICAgICAgICAgICAgLy8gd2l0aCB2IGlzIG5vIGxvbmdlciByZWxldmFudCAod2UgY2FuIHRoaW5r
IG9mIGl0IGFzIG1lcmdlZCB3aXRoIHRoZSBlZGdlIHdpdGggdSkuCisgICAgICAgICAgICAgICAg
ZGVjcmVtZW50RGVncmVlKGFkamFjZW50VG1wSW5kZXgpOworICAgICAgICAgICAgfQorICAgICAg
ICB9KTsKKworICAgICAgICBpZiAobV9mcmFtZVBvaW50ZXJJbmRleCAmJiBtX2ludGVyZmVyZXNX
aXRoRnJhbWVQb2ludGVyLnF1aWNrR2V0KHYpKQorICAgICAgICAgICAgbV9pbnRlcmZlcmVzV2l0
aEZyYW1lUG9pbnRlci5xdWlja1NldCh1KTsKKyAgICB9CisKKworICAgIHZvaWQgbWFrZUluaXRp
YWxXb3JrbGlzdCgpCisgICAgeworICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuY2xlYXIoKTsK
KyAgICAgICAgbV9zcGlsbFdvcmtsaXN0LmNsZWFyQWxsKCk7CisKKyAgICAgICAgaWYgKHRyYWNl
RGVidWcpCisgICAgICAgICAgICBkYXRhTG9nTG4oIi0tLS0tLS0tLS0tLS0tLS0tLVxuTWFraW5n
IGluaXRpYWwgd29ya2xpc3QiKTsKKworICAgICAgICBJbmRleFR5cGUgZmlyc3ROb25SZWdJbmRl
eCA9IG1fbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4ICsgMTsKKyAgICAgICAgdW5zaWduZWQg
ayA9IHRoaXMtPmsoKTsKKyAgICAgICAgZm9yIChJbmRleFR5cGUgaSA9IGZpcnN0Tm9uUmVnSW5k
ZXg7IGkgPCBtX2RlZ3JlZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIEFTU0VSVCghaXNQ
cmVjb2xvcmVkKGkpKTsKKyAgICAgICAgICAgIGlmIChoYXNCZWVuU2ltcGxpZmllZChpKSkKKyAg
ICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGRlZ3JlZSA9IG1f
ZGVncmVlc1tpXTsKKyAgICAgICAgICAgIGlmIChkZWdyZWUgPCBrKSB7CisgICAgICAgICAgICAg
ICAgaWYgKHRyYWNlRGVidWcpCisgICAgICAgICAgICAgICAgICAgIGRhdGFMb2dMbigiQWRkaW5n
ICIsIGksICIgdG8gc2ltcGxpZnkgd29ya2xpc3QiKTsKKyAgICAgICAgICAgICAgICBtX3NpbXBs
aWZ5V29ya2xpc3QuYXBwZW5kKGkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg
ICAgICBpZiAodHJhY2VEZWJ1ZykKKyAgICAgICAgICAgICAgICAgICAgZGF0YUxvZ0xuKCJBZGRp
bmcgIiwgaSwgIiB0byBzcGlsbCB3b3JrbGlzdCIpOworICAgICAgICAgICAgICAgIGFkZFRvU3Bp
bGwoaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBMb3ctZGVn
cmVlIHZlcnRleCBjYW4gYWx3YXlzIGJlIGNvbG9yZWQ6IGp1c3QgcGljayBhbnkgb2YgdGhlIGNv
bG9yIHRha2VuIGJ5IGFueQorICAgIC8vIG90aGVyIGFkamFjZW50IHZlcmljZXMuCisgICAgLy8g
VGhlICJTaW1wbGlmeSIgcGhhc2UgdGFrZXMgYSBsb3ctZGVncmVlIG91dCBvZiB0aGUgaW50ZXJm
ZXJlbmNlIGdyYXBoIHRvIHNpbXBsaWZ5IGl0LgorICAgIHZvaWQgc2ltcGxpZnkoKQorICAgIHsK
KyAgICAgICAgSW5kZXhUeXBlIGxhc3RJbmRleCA9IG1fc2ltcGxpZnlXb3JrbGlzdC50YWtlTGFz
dCgpOworCisgICAgICAgIEFTU0VSVCghbV9zZWxlY3RTdGFjay5jb250YWlucyhsYXN0SW5kZXgp
KTsKKyAgICAgICAgQVNTRVJUKCFtX2lzT25TZWxlY3RTdGFjay5nZXQobGFzdEluZGV4KSk7Cisg
ICAgICAgIEFTU0VSVCghbV9zcGlsbFdvcmtsaXN0LmNvbnRhaW5zKGxhc3RJbmRleCkpOworCisg
ICAgICAgIG1fc2VsZWN0U3RhY2suYXBwZW5kKGxhc3RJbmRleCk7CisgICAgICAgIG1faXNPblNl
bGVjdFN0YWNrLnF1aWNrU2V0KGxhc3RJbmRleCk7CisKKyAgICAgICAgaWYgKHRyYWNlRGVidWcp
CisgICAgICAgICAgICBkYXRhTG9nTG4oIlNpbXBsaWZ5aW5nICIsIGxhc3RJbmRleCwgIiBieSBh
ZGRpbmcgaXQgdG8gc2VsZWN0IHN0YWNrIik7CisKKyAgICAgICAgZm9yRWFjaEFkamFjZW50KGxh
c3RJbmRleCwgW3RoaXNdKEluZGV4VHlwZSBhZGphY2VudFRtcEluZGV4KSB7CisgICAgICAgICAg
ICBkZWNyZW1lbnREZWdyZWVJblNpbXBsaWZpY2F0aW9uKGFkamFjZW50VG1wSW5kZXgpOworICAg
ICAgICB9KTsKKyAgICB9CisKKyAgICB2b2lkIHNlbGVjdFNwaWxsKCkKKyAgICB7CisgICAgICAg
IEluZGV4VHlwZSB2aWN0aW1JbmRleCA9IEJhc2U6OnNlbGVjdFNwaWxsKCk7CisgICAgICAgIG1f
c3BpbGxXb3JrbGlzdC5xdWlja0NsZWFyKHZpY3RpbUluZGV4KTsKKyAgICAgICAgbV9zaW1wbGlm
eVdvcmtsaXN0LmFwcGVuZCh2aWN0aW1JbmRleCk7CisgICAgfQorCisgICAgc3RydWN0IE1vdmVT
ZXQgeworICAgICAgICB1bnNpZ25lZCBhZGRNb3ZlKCkKKyAgICAgICAgeworICAgICAgICAgICAg
QVNTRVJUKG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5pc0VtcHR5KCkpOworCisgICAgICAgICAgICB1
bnNpZ25lZCBuZXh0SW5kZXggPSBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdCsrOworICAgICAgICAgICAg
bV9tb3ZlTGlzdC5hcHBlbmQobmV4dEluZGV4KTsKKyAgICAgICAgICAgIHJldHVybiBuZXh0SW5k
ZXg7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHN0YXJ0QWRkaW5nTG93UHJpb3JpdHlNb3Zl
cygpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFTU0VSVChtX2xvd1ByaW9yaXR5TW92ZUxpc3Qu
aXNFbXB0eSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHVuc2lnbmVkIGFkZExvd1ByaW9yaXR5
TW92ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIG5leHRJbmRleCA9IG1fcG9z
aXRpb25Jbk1vdmVMaXN0Kys7CisgICAgICAgICAgICBtX2xvd1ByaW9yaXR5TW92ZUxpc3QuYXBw
ZW5kKG5leHRJbmRleCk7CisKKyAgICAgICAgICAgIHJldHVybiBuZXh0SW5kZXg7CisgICAgICAg
IH0KKworICAgICAgICAvLyBXZSB1c2UgcmVmZXJlbmNlcyB0byBtb3ZlcyBoZXJlIGJlY2F1c2Ug
dGhlIGZ1bmN0aW9uCisgICAgICAgIC8vIG1heSBkbyBjb2FsZXNjaW5nLCBpbmRpY2F0aW5nIGl0
IGRvZXNuJ3QgbmVlZCB0byBzZWUKKyAgICAgICAgLy8gdGhlIG1vdmUgYWdhaW4uCisgICAgICAg
IHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbj4KKyAgICAgICAgdm9pZCBmb3JFYWNoTW92ZShG
dW5jdGlvbiBmdW5jdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCYg
bW92ZSA6IG1fbW92ZUxpc3QpIHsKKyAgICAgICAgICAgICAgICBpZiAobW92ZSAhPSBVSU5UX01B
WCkKKyAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24obW92ZSk7CisgICAgICAgICAgICB9Cisg
ICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24+CisgICAgICAg
IHZvaWQgZm9yRWFjaExvd1ByaW9yaXR5TW92ZShGdW5jdGlvbiBmdW5jdGlvbikKKyAgICAgICAg
eworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCYgbW92ZSA6IG1fbG93UHJpb3JpdHlNb3ZlTGlz
dCkgeworICAgICAgICAgICAgICAgIGlmIChtb3ZlICE9IFVJTlRfTUFYKQorICAgICAgICAgICAg
ICAgICAgICBmdW5jdGlvbihtb3ZlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAg
ICAgIHZvaWQgY2xlYXIoKQorICAgICAgICB7CisgICAgICAgICAgICBtX3Bvc2l0aW9uSW5Nb3Zl
TGlzdCA9IDA7CisgICAgICAgICAgICBtX21vdmVMaXN0LmNsZWFyKCk7CisgICAgICAgICAgICBt
X2xvd1ByaW9yaXR5TW92ZUxpc3QuY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToK
KyAgICAgICAgdW5zaWduZWQgbV9wb3NpdGlvbkluTW92ZUxpc3Q7CisgICAgICAgIFZlY3Rvcjx1
bnNpZ25lZCwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fbW92ZUxpc3Q7CisgICAgICAgIFZl
Y3Rvcjx1bnNpZ25lZCwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fbG93UHJpb3JpdHlNb3Zl
TGlzdDsKKyAgICB9OworCisgICAgdm9pZCBkZWNyZW1lbnREZWdyZWUoSW5kZXhUeXBlIHRtcElu
ZGV4KQorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fZGVncmVlc1t0bXBJbmRleF0pOworICAgICAg
ICAtLW1fZGVncmVlc1t0bXBJbmRleF07CisgICAgfQorCisgICAgdm9pZCBkZWNyZW1lbnREZWdy
ZWVJblNpbXBsaWZpY2F0aW9uKEluZGV4VHlwZSB0bXBJbmRleCkKKyAgICB7CisgICAgICAgIEFT
U0VSVChtX2RlZ3JlZXNbdG1wSW5kZXhdKTsKKyAgICAgICAgdW5zaWduZWQgb2xkRGVncmVlID0g
bV9kZWdyZWVzW3RtcEluZGV4XS0tOworCisgICAgICAgIGlmIChvbGREZWdyZWUgPT0gaygpKSB7
CisgICAgICAgICAgICBBU1NFUlQobV9kZWdyZWVzW3RtcEluZGV4XSA8IGsoKSk7CisgICAgICAg
ICAgICBpZiAodHJhY2VEZWJ1ZykKKyAgICAgICAgICAgICAgICBkYXRhTG9nTG4oIk1vdmluZyB0
bXAgIiwgdG1wSW5kZXgsICIgZnJvbSBzcGlsbCBsaXN0IHRvIHNpbXBsaWZ5IGxpc3QgYmVjYXVz
ZSBpdCdzIGRlZ3JlZSBpcyBub3cgbGVzcyB0aGFuIGsiKTsKKyAgICAgICAgICAgIGlmICghbV91
bnNwaWxsYWJsZVRtcHMuY29udGFpbnModG1wSW5kZXgpKSB7CisgICAgICAgICAgICAgICAgQVNT
RVJUKG1fc3BpbGxXb3JrbGlzdC5jb250YWlucyh0bXBJbmRleCkpOworICAgICAgICAgICAgICAg
IG1fc3BpbGxXb3JrbGlzdC5xdWlja0NsZWFyKHRtcEluZGV4KTsKKyAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgQVNTRVJUKCFtX3NpbXBsaWZ5V29ya2xpc3QuY29udGFpbnModG1wSW5kZXgp
KTsKKyAgICAgICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5hcHBlbmQodG1wSW5kZXgpOworICAg
ICAgICB9CisgICAgfQorCisgICAgdm9pZCBhc3NpZ25Db2xvcnMoKQorICAgIHsKKyAgICAgICAg
bV93b3JrbGlzdE1vdmVzLmNsZWFyKCk7CisgICAgICAgIEJhc2U6OmFzc2lnbkNvbG9ycygpOwor
ICAgIH0KKworICAgIC8vIFNldCBvZiAibW92ZSIgZW5hYmxlZCBmb3IgcG9zc2libGUgY29hbGVz
Y2luZy4KKyAgICBNb3ZlU2V0IG1fd29ya2xpc3RNb3ZlczsKK307CisKK3RlbXBsYXRlIDx0eXBl
bmFtZSBJbmRleFR5cGUsIHR5cGVuYW1lIFRtcE1hcHBlcj4KK2NsYXNzIElSQyA6IHB1YmxpYyBB
YnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yPEluZGV4VHlwZSwgVG1wTWFwcGVyPiB7CisgICAgdXNp
bmcgQmFzZSA9IEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0b3I8SW5kZXhUeXBlLCBUbXBNYXBwZXI+
OworcHJvdGVjdGVkOgorICAgIHVzaW5nIEJhc2U6Om1faXNPblNlbGVjdFN0YWNrOworICAgIHVz
aW5nIEJhc2U6Om1fc2VsZWN0U3RhY2s7CisgICAgdXNpbmcgQmFzZTo6bV9mcmFtZVBvaW50ZXJJ
bmRleDsKKyAgICB1c2luZyBCYXNlOjptX2ludGVyZmVyZXNXaXRoRnJhbWVQb2ludGVyOworICAg
IHVzaW5nIEJhc2U6Om1fc2ltcGxpZnlXb3JrbGlzdDsKKyAgICB1c2luZyBCYXNlOjptX3NwaWxs
V29ya2xpc3Q7CisgICAgdXNpbmcgQmFzZTo6bV9oYXNTZWxlY3RlZFNwaWxsOworICAgIHVzaW5n
IEJhc2U6Om1faGFzQ29hbGVzY2VkTm9uVHJpdmlhbE1vdmU7CisgICAgdXNpbmcgQmFzZTo6bV9k
ZWdyZWVzOworICAgIHVzaW5nIEJhc2U6Oms7CisgICAgdXNpbmcgQmFzZTo6bV9jb2FsZXNjZWRU
bXBzOworICAgIHVzaW5nIEJhc2U6Om1fbW92ZUxpc3Q7CisgICAgdXNpbmcgQmFzZTo6bV91c2VD
b3VudHM7CisgICAgdXNpbmcgQmFzZTo6bV9jb2FsZXNjZWRUbXBzQXRTcGlsbDsKKyAgICB1c2lu
ZyBCYXNlOjptX3NwaWxsZWRUbXBzOworICAgIHVzaW5nIHR5cGVuYW1lIEJhc2U6Ok1vdmVPcGVy
YW5kczsKKyAgICB1c2luZyBCYXNlOjptX2NvYWxlc2NpbmdDYW5kaWRhdGVzOworICAgIHVzaW5n
IEJhc2U6Om1fbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4OworICAgIHVzaW5nIEJhc2U6Om1f
Y29sb3JlZFRtcDsKKyAgICB1c2luZyBCYXNlOjptX2NvZGU7CisgICAgdXNpbmcgdHlwZW5hbWUg
QmFzZTo6SW50ZXJmZXJlbmNlRWRnZTsKKyAgICB1c2luZyBCYXNlOjptX3Vuc3BpbGxhYmxlVG1w
czsKKyAgICB1c2luZyBCYXNlOjpoYXNJbnRlcmZlcmVuY2VFZGdlOworICAgIHVzaW5nIEJhc2U6
OmdldEFsaWFzOworICAgIHVzaW5nIEJhc2U6OmFkZEVkZ2U7CisgICAgdXNpbmcgQmFzZTo6aXNQ
cmVjb2xvcmVkOworICAgIHVzaW5nIEJhc2U6OmNhbkJlU2FmZWx5Q29hbGVzY2VkOworICAgIHVz
aW5nIEJhc2U6OmFkZEVkZ2VEaXN0aW5jdFdpdGhvdXREZWdyZWVDaGFuZ2U7CisgICAgdXNpbmcg
QmFzZTo6Zm9yRWFjaEFkamFjZW50OworICAgIHVzaW5nIEJhc2U6Omhhc0JlZW5TaW1wbGlmaWVk
OworICAgIHVzaW5nIEJhc2U6OmFkZFRvU3BpbGw7CisKK3B1YmxpYzoKKyAgICBJUkMoQ29kZSYg
Y29kZSwgY29uc3QgVmVjdG9yPFJlZz4mIHJlZ3NJblByaW9yaXR5T3JkZXIsIEluZGV4VHlwZSBs
YXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXgsIHVuc2lnbmVkIHRtcEFycmF5U2l6ZSwgY29uc3Qg
SGFzaFNldDx1bnNpZ25lZD4mIHVuc3BpbGxhYmxlVG1wcywgY29uc3QgVXNlQ291bnRzPFRtcD4m
IHVzZUNvdW50cykKKyAgICAgICAgOiBCYXNlKGNvZGUsIHJlZ3NJblByaW9yaXR5T3JkZXIsIGxh
c3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleCwgdG1wQXJyYXlTaXplLCB1bnNwaWxsYWJsZVRtcHMs
IHVzZUNvdW50cykKKyAgICB7CisgICAgfQorCisgICAgdm9pZCBhbGxvY2F0ZSgpCisgICAgewor
ICAgICAgICBtX2FjdGl2ZU1vdmVzLmVuc3VyZVNpemUobV93b3JrbGlzdE1vdmVzLnRvdGFsTnVt
YmVyT2ZNb3ZlcygpKTsKKyAgICAgICAgQVNTRVJUX1dJVEhfTUVTU0FHRShtX2FjdGl2ZU1vdmVz
LnNpemUoKSA+PSBtX2NvYWxlc2NpbmdDYW5kaWRhdGVzLnNpemUoKSwgIlRoZSBhY3RpdmVNb3Zl
IHNldCBzaG91bGQgYmUgYmlnIGVub3VnaCBmb3IgdGhlIHF1aWNrIG9wZXJhdGlvbnMgb2YgQml0
VmVjdG9yLiIpOworCisgICAgICAgIG1ha2VXb3JrTGlzdCgpOworCisgICAgICAgIC8qCisgICAg
ICAgIGlmIChkZWJ1ZykgeworICAgICAgICAgICAgZGF0YUxvZygiSW50ZXJmZXJlbmNlOiAiLCBs
aXN0RHVtcChtX2ludGVyZmVyZW5jZUVkZ2VzKSwgIlxuIik7CisgICAgICAgICAgICBkdW1wSW50
ZXJmZXJlbmNlR3JhcGhJbkRvdChXVEY6OmRhdGFGaWxlKCkpOworICAgICAgICAgICAgZGF0YUxv
ZygiQ29hbGVzY2luZyBjYW5kaWRhdGVzOlxuIik7CisgICAgICAgICAgICBmb3IgKE1vdmVPcGVy
YW5kcyYgbW92ZU9wIDogbV9jb2FsZXNjaW5nQ2FuZGlkYXRlcykgeworICAgICAgICAgICAgICAg
IGRhdGFMb2coIiAgICAiLCBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRl
SW5kZXgobW92ZU9wLnNyY0luZGV4KSwKKyAgICAgICAgICAgICAgICAgICAgIiAtPiAiLCBBYnNv
bHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgobW92ZU9wLmRzdEluZGV4
KSwgIlxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkYXRhTG9nKCJJbml0aWFsIHdv
cmsgbGlzdFxuIik7CisgICAgICAgICAgICBkdW1wV29ya0xpc3RzKFdURjo6ZGF0YUZpbGUoKSk7
CisgICAgICAgIH0KKyAgICAgICAgKi8KKworICAgICAgICBkbyB7CisgICAgICAgICAgICBpZiAo
dHJhY2VEZWJ1ZykgeworICAgICAgICAgICAgICAgIGRhdGFMb2coIkJlZm9yZSBHcmFwaCBzaW1w
bGlmaWNhdGlvbiBpdGVyYXRpb25cbiIpOworICAgICAgICAgICAgICAgIC8vZHVtcFdvcmtMaXN0
cyhXVEY6OmRhdGFGaWxlKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIW1f
c2ltcGxpZnlXb3JrbGlzdC5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgc2ltcGxpZnkoKTsK
KyAgICAgICAgICAgIGVsc2UgaWYgKCFtX3dvcmtsaXN0TW92ZXMuaXNFbXB0eSgpKQorICAgICAg
ICAgICAgICAgIGNvYWxlc2NlKCk7CisgICAgICAgICAgICBlbHNlIGlmICghbV9mcmVlemVXb3Jr
bGlzdC5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgZnJlZXplKCk7CisgICAgICAgICAgICBl
bHNlIGlmIChtX3NwaWxsV29ya2xpc3QuYml0Q291bnQoKSkKKyAgICAgICAgICAgICAgICBzZWxl
Y3RTcGlsbCgpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcp
IHsKKyAgICAgICAgICAgICAgICBkYXRhTG9nKCJBZnRlciBHcmFwaCBzaW1wbGlmaWNhdGlvbiBp
dGVyYXRpb25cbiIpOworICAgICAgICAgICAgICAgIGR1bXBXb3JrTGlzdHMoV1RGOjpkYXRhRmls
ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICovCisgICAgICAgIH0gd2hpbGUgKCFt
X3NpbXBsaWZ5V29ya2xpc3QuaXNFbXB0eSgpIHx8ICFtX3dvcmtsaXN0TW92ZXMuaXNFbXB0eSgp
IHx8ICFtX2ZyZWV6ZVdvcmtsaXN0LmlzRW1wdHkoKSB8fCBtX3NwaWxsV29ya2xpc3QuYml0Q291
bnQoKSk7CisKKyAgICAgICAgYXNzaWduQ29sb3JzKCk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisK
KyAgICB2b2lkIG1ha2VXb3JrTGlzdCgpCisgICAgeworICAgICAgICBJbmRleFR5cGUgZmlyc3RO
b25SZWdJbmRleCA9IG1fbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4ICsgMTsKKyAgICAgICAg
Zm9yIChJbmRleFR5cGUgaSA9IGZpcnN0Tm9uUmVnSW5kZXg7IGkgPCBtX2RlZ3JlZXMuc2l6ZSgp
OyArK2kpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGRlZ3JlZSA9IG1fZGVncmVlc1tpXTsKKyAg
ICAgICAgICAgIGlmIChkZWdyZWUgPj0gaygpKQorICAgICAgICAgICAgICAgIGFkZFRvU3BpbGwo
aSk7CisgICAgICAgICAgICBlbHNlIGlmICghbV9tb3ZlTGlzdFtpXS5pc0VtcHR5KCkpCisgICAg
ICAgICAgICAgICAgbV9mcmVlemVXb3JrbGlzdC5hZGQoaSk7CisgICAgICAgICAgICBlbHNlCisg
ICAgICAgICAgICAgICAgbV9zaW1wbGlmeVdvcmtsaXN0LmFwcGVuZChpKTsKKyAgICAgICAgfQor
ICAgIH0KKworICAgIC8vIExvdy1kZWdyZWUgdmVydGV4IGNhbiBhbHdheXMgYmUgY29sb3JlZDog
anVzdCBwaWNrIGFueSBvZiB0aGUgY29sb3IgdGFrZW4gYnkgYW55CisgICAgLy8gb3RoZXIgYWRq
YWNlbnQgdmVyaWNlcy4KKyAgICAvLyBUaGUgIlNpbXBsaWZ5IiBwaGFzZSB0YWtlcyBhIGxvdy1k
ZWdyZWUgb3V0IG9mIHRoZSBpbnRlcmZlcmVuY2UgZ3JhcGggdG8gc2ltcGxpZnkgaXQuCisgICAg
dm9pZCBzaW1wbGlmeSgpCisgICAgeworICAgICAgICBJbmRleFR5cGUgbGFzdEluZGV4ID0gbV9z
aW1wbGlmeVdvcmtsaXN0LnRha2VMYXN0KCk7CisKKyAgICAgICAgQVNTRVJUKCFtX3NlbGVjdFN0
YWNrLmNvbnRhaW5zKGxhc3RJbmRleCkpOworICAgICAgICBBU1NFUlQoIW1faXNPblNlbGVjdFN0
YWNrLmdldChsYXN0SW5kZXgpKTsKKyAgICAgICAgbV9zZWxlY3RTdGFjay5hcHBlbmQobGFzdElu
ZGV4KTsKKyAgICAgICAgbV9pc09uU2VsZWN0U3RhY2sucXVpY2tTZXQobGFzdEluZGV4KTsKKwor
ICAgICAgICBmb3JFYWNoQWRqYWNlbnQobGFzdEluZGV4LCBbdGhpc10oSW5kZXhUeXBlIGFkamFj
ZW50VG1wSW5kZXgpIHsKKyAgICAgICAgICAgIGRlY3JlbWVudERlZ3JlZShhZGphY2VudFRtcElu
ZGV4KTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgdm9pZCBjb2FsZXNjZSgpCisgICAgewor
ICAgICAgICB1bnNpZ25lZCBtb3ZlSW5kZXggPSBtX3dvcmtsaXN0TW92ZXMudGFrZUxhc3RNb3Zl
KCk7CisgICAgICAgIGNvbnN0IE1vdmVPcGVyYW5kcyYgbW92ZU9wZXJhbmRzID0gbV9jb2FsZXNj
aW5nQ2FuZGlkYXRlc1ttb3ZlSW5kZXhdOworICAgICAgICBJbmRleFR5cGUgdSA9IGdldEFsaWFz
KG1vdmVPcGVyYW5kcy5zcmNJbmRleCk7CisgICAgICAgIEluZGV4VHlwZSB2ID0gZ2V0QWxpYXMo
bW92ZU9wZXJhbmRzLmRzdEluZGV4KTsKKworICAgICAgICBpZiAoaXNQcmVjb2xvcmVkKHYpKQor
ICAgICAgICAgICAgc3RkOjpzd2FwKHUsIHYpOworCisgICAgICAgIGlmICh0cmFjZURlYnVnKQor
ICAgICAgICAgICAgZGF0YUxvZygiQ29hbGVzY2luZyBtb3ZlIGF0IGluZGV4ICIsIG1vdmVJbmRl
eCwgIiB1ID0gIiwgdSwgIiB2ID0gIiwgdiwgIlxuIik7CisKKyAgICAgICAgaWYgKHUgPT0gdikg
eworICAgICAgICAgICAgYWRkV29ya0xpc3QodSk7CisKKyAgICAgICAgICAgIGlmICh0cmFjZURl
YnVnKQorICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICBDb2FsZXNjZWRcbiIpOworICAgICAg
ICB9IGVsc2UgaWYgKGlzUHJlY29sb3JlZCh2KQorICAgICAgICAgICAgfHwgaGFzSW50ZXJmZXJl
bmNlRWRnZShJbnRlcmZlcmVuY2VFZGdlKHUsIHYpKQorICAgICAgICAgICAgfHwgKHUgPT0gbV9m
cmFtZVBvaW50ZXJJbmRleCAmJiBtX2ludGVyZmVyZXNXaXRoRnJhbWVQb2ludGVyLnF1aWNrR2V0
KHYpKSkgeworICAgICAgICAgICAgYWRkV29ya0xpc3QodSk7CisgICAgICAgICAgICBhZGRXb3Jr
TGlzdCh2KTsKKworICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpCisgICAgICAgICAgICAgICAg
ZGF0YUxvZygiICAgIENvbnN0cmFpbmVkXG4iKTsKKyAgICAgICAgfSBlbHNlIGlmIChjYW5CZVNh
ZmVseUNvYWxlc2NlZCh1LCB2KSkgeworICAgICAgICAgICAgY29tYmluZSh1LCB2KTsKKyAgICAg
ICAgICAgIGFkZFdvcmtMaXN0KHUpOworICAgICAgICAgICAgbV9oYXNDb2FsZXNjZWROb25Ucml2
aWFsTW92ZSA9IHRydWU7CisKKyAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQorICAgICAgICAg
ICAgICAgIGRhdGFMb2coIiAgICBTYWZlIENvYWxlc2NpbmdcbiIpOworICAgICAgICB9IGVsc2Ug
eworICAgICAgICAgICAgbV9hY3RpdmVNb3Zlcy5xdWlja1NldChtb3ZlSW5kZXgpOworCisgICAg
ICAgICAgICBpZiAodHJhY2VEZWJ1ZykKKyAgICAgICAgICAgICAgICBkYXRhTG9nKCIgICAgRmFp
bGVkIGNvYWxlc2NpbmcsIGFkZGVkIHRvIGFjdGl2ZSBtb3Zlcy5cbiIpOworICAgICAgICB9Cisg
ICAgfQorCisgICAgdm9pZCBhZGRXb3JrTGlzdChJbmRleFR5cGUgdG1wSW5kZXgpCisgICAgewor
ICAgICAgICBpZiAoIWlzUHJlY29sb3JlZCh0bXBJbmRleCkgJiYgbV9kZWdyZWVzW3RtcEluZGV4
XSA8IGsoKSAmJiAhaXNNb3ZlUmVsYXRlZCh0bXBJbmRleCkpIHsKKyAgICAgICAgICAgIG1fZnJl
ZXplV29ya2xpc3QucmVtb3ZlKHRtcEluZGV4KTsKKyAgICAgICAgICAgIG1fc2ltcGxpZnlXb3Jr
bGlzdC5hcHBlbmQodG1wSW5kZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBjb21i
aW5lKEluZGV4VHlwZSB1LCBJbmRleFR5cGUgdikKKyAgICB7CisgICAgICAgIGlmICghbV9mcmVl
emVXb3JrbGlzdC5yZW1vdmUodikpCisgICAgICAgICAgICBtX3NwaWxsV29ya2xpc3QucXVpY2tD
bGVhcih2KTsKKworICAgICAgICBBU1NFUlQoIW1fY29hbGVzY2VkVG1wc1t2XSk7CisgICAgICAg
IG1fY29hbGVzY2VkVG1wc1t2XSA9IHU7CisKKyAgICAgICAgYXV0byYgdk1vdmVzID0gbV9tb3Zl
TGlzdFt2XTsKKyAgICAgICAgbV9tb3ZlTGlzdFt1XS5hZGQodk1vdmVzLmJlZ2luKCksIHZNb3Zl
cy5lbmQoKSk7CisKKyAgICAgICAgZm9yRWFjaEFkamFjZW50KHYsIFt0aGlzLCB1XSAoSW5kZXhU
eXBlIGFkamFjZW50VG1wSW5kZXgpIHsKKyAgICAgICAgICAgIGlmIChhZGRFZGdlRGlzdGluY3RX
aXRob3V0RGVncmVlQ2hhbmdlKGFkamFjZW50VG1wSW5kZXgsIHUpKSB7CisgICAgICAgICAgICAg
ICAgLy8gSWYgd2UgYWRkZWQgYSBuZXcgZWRnZSBiZXR3ZWVuIHRoZSBhZGphY2VudFRtcCBhbmQg
dSwgaXQgcmVwbGFjZXMgdGhlIGVkZ2UKKyAgICAgICAgICAgICAgICAvLyB0aGF0IGV4aXN0ZWQg
d2l0aCB2LgorICAgICAgICAgICAgICAgIC8vIFRoZSBkZWdyZWUgb2YgYWRqYWNlbnRUbXAgcmVt
YWlucyB0aGUgc2FtZSBzaW5jZSB0aGUgZWRnZSBqdXN0IGNoYW5nZWQgZnJvbSB1IHRvIHYuCisg
ICAgICAgICAgICAgICAgLy8gQWxsIHdlIG5lZWQgdG8gZG8gaXMgdXBkYXRlIHRoZSBkZWdyZWUg
b2YgdS4KKyAgICAgICAgICAgICAgICBpZiAoIWlzUHJlY29sb3JlZCh1KSkKKyAgICAgICAgICAg
ICAgICAgICAgbV9kZWdyZWVzW3VdKys7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAg
ICAgICAgIC8vIElmIHdlIGFscmVhZHkgaGFkIGFuIGVkZ2UgYmV0d2VlbiB0aGUgYWRqYWNlbnRU
bXAgYW5kIHUsIHRoZSBkZWdyZWUgb2YgdQorICAgICAgICAgICAgICAgIC8vIGlzIGFscmVhZHkg
Y29ycmVjdC4gVGhlIGRlZ3JlZSBvZiB0aGUgYWRqYWNlbnRUbXAgZGVjcmVhc2VzIHNpbmNlIHRo
ZSBlZGdlCisgICAgICAgICAgICAgICAgLy8gd2l0aCB2IGlzIG5vIGxvbmdlciByZWxldmFudCAo
d2UgY2FuIHRoaW5rIG9mIGl0IGFzIG1lcmdlZCB3aXRoIHRoZSBlZGdlIHdpdGggdSkuCisgICAg
ICAgICAgICAgICAgZGVjcmVtZW50RGVncmVlKGFkamFjZW50VG1wSW5kZXgpOworICAgICAgICAg
ICAgfQorICAgICAgICB9KTsKKworICAgICAgICBpZiAobV9mcmFtZVBvaW50ZXJJbmRleCAmJiBt
X2ludGVyZmVyZXNXaXRoRnJhbWVQb2ludGVyLnF1aWNrR2V0KHYpKQorICAgICAgICAgICAgbV9p
bnRlcmZlcmVzV2l0aEZyYW1lUG9pbnRlci5xdWlja1NldCh1KTsKKworICAgICAgICBpZiAobV9k
ZWdyZWVzW3VdID49IGsoKSAmJiBtX2ZyZWV6ZVdvcmtsaXN0LnJlbW92ZSh1KSkKKyAgICAgICAg
ICAgIGFkZFRvU3BpbGwodSk7CisgICAgfQorCisgICAgdm9pZCBmcmVlemUoKQorICAgIHsKKyAg
ICAgICAgSW5kZXhUeXBlIHZpY3RpbUluZGV4ID0gbV9mcmVlemVXb3JrbGlzdC50YWtlQW55KCk7
CisgICAgICAgIEFTU0VSVF9XSVRIX01FU1NBR0UoZ2V0QWxpYXModmljdGltSW5kZXgpID09IHZp
Y3RpbUluZGV4LCAiY29hbGVzY2UoKSBzaG91bGQgbm90IGxlYXZlIGFsaWFzZWQgVG1wIGluIHRo
ZSB3b3JrbGlzdC4iKTsKKyAgICAgICAgbV9zaW1wbGlmeVdvcmtsaXN0LmFwcGVuZCh2aWN0aW1J
bmRleCk7CisgICAgICAgIGZyZWV6ZU1vdmVzKHZpY3RpbUluZGV4KTsKKyAgICB9CisKKyAgICB2
b2lkIGZyZWV6ZU1vdmVzKEluZGV4VHlwZSB0bXBJbmRleCkKKyAgICB7CisgICAgICAgIGZvckVh
Y2hOb2RlTW92ZXModG1wSW5kZXgsIFt0aGlzLCB0bXBJbmRleF0gKEluZGV4VHlwZSBtb3ZlSW5k
ZXgpIHsKKyAgICAgICAgICAgIGlmICghbV9hY3RpdmVNb3Zlcy5xdWlja0NsZWFyKG1vdmVJbmRl
eCkpCisgICAgICAgICAgICAgICAgbV93b3JrbGlzdE1vdmVzLnRha2VNb3ZlKG1vdmVJbmRleCk7
CisKKyAgICAgICAgICAgIGNvbnN0IE1vdmVPcGVyYW5kcyYgbW92ZU9wZXJhbmRzID0gbV9jb2Fs
ZXNjaW5nQ2FuZGlkYXRlc1ttb3ZlSW5kZXhdOworICAgICAgICAgICAgSW5kZXhUeXBlIHNyY1Rt
cEluZGV4ID0gbW92ZU9wZXJhbmRzLnNyY0luZGV4OworICAgICAgICAgICAgSW5kZXhUeXBlIGRz
dFRtcEluZGV4ID0gbW92ZU9wZXJhbmRzLmRzdEluZGV4OwogCi0gICAgICAgIHZvaWQgZHVtcChQ
cmludFN0cmVhbSYgb3V0KSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAgICBvdXQucHJpbnQo
Zmlyc3QoKSwgIjw9PiIsIHNlY29uZCgpKTsKLSAgICAgICAgfQorICAgICAgICAgICAgSW5kZXhU
eXBlIG9yaWdpbmFsT3RoZXJUbXAgPSBzcmNUbXBJbmRleCAhPSB0bXBJbmRleCA/IHNyY1RtcElu
ZGV4IDogZHN0VG1wSW5kZXg7CisgICAgICAgICAgICBJbmRleFR5cGUgb3RoZXJUbXBJbmRleCA9
IGdldEFsaWFzKG9yaWdpbmFsT3RoZXJUbXApOworICAgICAgICAgICAgaWYgKG1fZGVncmVlc1tv
dGhlclRtcEluZGV4XSA8IGsoKSAmJiAhaXNNb3ZlUmVsYXRlZChvdGhlclRtcEluZGV4KSkgewor
ICAgICAgICAgICAgICAgIGlmIChtX2ZyZWV6ZVdvcmtsaXN0LnJlbW92ZShvdGhlclRtcEluZGV4
KSkKKyAgICAgICAgICAgICAgICAgICAgbV9zaW1wbGlmeVdvcmtsaXN0LmFwcGVuZChvdGhlclRt
cEluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQogCi0gICAgcHJpdmF0
ZToKLSAgICAgICAgdWludDY0X3QgbV92YWx1ZSB7IDAgfTsKLSAgICB9OworICAgIHZvaWQgZGVj
cmVtZW50RGVncmVlKEluZGV4VHlwZSB0bXBJbmRleCkKKyAgICB7CisgICAgICAgIEFTU0VSVCht
X2RlZ3JlZXNbdG1wSW5kZXhdKTsKIAotICAgIHN0cnVjdCBJbnRlcmZlcmVuY2VFZGdlSGFzaCB7
Ci0gICAgICAgIHN0YXRpYyB1bnNpZ25lZCBoYXNoKGNvbnN0IEludGVyZmVyZW5jZUVkZ2UmIGtl
eSkgeyByZXR1cm4ga2V5Lmhhc2goKTsgfQotICAgICAgICBzdGF0aWMgYm9vbCBlcXVhbChjb25z
dCBJbnRlcmZlcmVuY2VFZGdlJiBhLCBjb25zdCBJbnRlcmZlcmVuY2VFZGdlJiBiKSB7IHJldHVy
biBhID09IGI7IH0KLSAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgc2FmZVRvQ29tcGFyZVRvRW1w
dHlPckRlbGV0ZWQgPSB0cnVlOwotICAgIH07Ci0gICAgdHlwZWRlZiBTaW1wbGVDbGFzc0hhc2hU
cmFpdHM8SW50ZXJmZXJlbmNlRWRnZT4gSW50ZXJmZXJlbmNlRWRnZUhhc2hUcmFpdHM7CisgICAg
ICAgIHVuc2lnbmVkIG9sZERlZ3JlZSA9IG1fZGVncmVlc1t0bXBJbmRleF0tLTsKKyAgICAgICAg
aWYgKG9sZERlZ3JlZSA9PSBrKCkpIHsKKyAgICAgICAgICAgIGVuYWJsZU1vdmVzT25WYWx1ZUFu
ZEFkamFjZW50cyh0bXBJbmRleCk7CisgICAgICAgICAgICBtX3NwaWxsV29ya2xpc3QucXVpY2tD
bGVhcih0bXBJbmRleCk7CisgICAgICAgICAgICBpZiAoaXNNb3ZlUmVsYXRlZCh0bXBJbmRleCkp
CisgICAgICAgICAgICAgICAgbV9mcmVlemVXb3JrbGlzdC5hZGQodG1wSW5kZXgpOworICAgICAg
ICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5hcHBlbmQodG1w
SW5kZXgpOworICAgICAgICB9CisgICAgfQogCi0gICAgY29uc3QgVmVjdG9yPFJlZz4mIG1fcmVn
c0luUHJpb3JpdHlPcmRlcjsKLSAgICBSZWdpc3RlclNldCBtX211dGFibGVSZWdzOwotICAgIElu
ZGV4VHlwZSBtX2xhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleCB7IDAgfTsKKyAgICB2b2lkIHNl
bGVjdFNwaWxsKCkKKyAgICB7CisgICAgICAgIEluZGV4VHlwZSB2aWN0aW1JbmRleCA9IEJhc2U6
OnNlbGVjdFNwaWxsKCk7CisgICAgICAgIG1fc3BpbGxXb3JrbGlzdC5xdWlja0NsZWFyKHZpY3Rp
bUluZGV4KTsKKyAgICAgICAgbV9zaW1wbGlmeVdvcmtsaXN0LmFwcGVuZCh2aWN0aW1JbmRleCk7
CisgICAgICAgIGZyZWV6ZU1vdmVzKHZpY3RpbUluZGV4KTsKKyAgICB9CiAKLSAgICAvLyBUaGUg
aW50ZXJmZXJlbmNlIGdyYXBoLgotICAgIEhhc2hTZXQ8SW50ZXJmZXJlbmNlRWRnZSwgSW50ZXJm
ZXJlbmNlRWRnZUhhc2gsIEludGVyZmVyZW5jZUVkZ2VIYXNoVHJhaXRzPiBtX2ludGVyZmVyZW5j
ZUVkZ2VzOwotICAgIFZlY3RvcjxWZWN0b3I8SW5kZXhUeXBlLCAwLCBVbnNhZmVWZWN0b3JPdmVy
ZmxvdywgND4sIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX2FkamFjZW5jeUxpc3Q7Ci0gICAg
VmVjdG9yPEluZGV4VHlwZSwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fZGVncmVlczsKKyAg
ICB2b2lkIGFzc2lnbkNvbG9ycygpCisgICAgeworICAgICAgICBBU1NFUlQobV9mcmVlemVXb3Jr
bGlzdC5pc0VtcHR5KCkpOworICAgICAgICBtX3dvcmtsaXN0TW92ZXMuY2xlYXIoKTsKKyAgICAg
ICAgQmFzZTo6YXNzaWduQ29sb3JzKCk7CisgICAgfQogCi0gICAgLy8gSW5zdGVhZCBvZiBrZWVw
aW5nIHRyYWNrIG9mIHRoZSBtb3ZlIGluc3RydWN0aW9ucywgd2UganVzdCBrZWVwIHRoZWlyIG9w
ZXJhbmRzIGFyb3VuZCBhbmQgdXNlIHRoZSBpbmRleAotICAgIC8vIGluIHRoZSB2ZWN0b3IgYXMg
dGhlICJpZGVudGlmaWVyIiBmb3IgdGhlIG1vdmUuCi0gICAgc3RydWN0IE1vdmVPcGVyYW5kcyB7
Ci0gICAgICAgIEluZGV4VHlwZSBzcmNJbmRleDsKLSAgICAgICAgSW5kZXhUeXBlIGRzdEluZGV4
OwotICAgIH07Ci0gICAgVmVjdG9yPE1vdmVPcGVyYW5kcywgMCwgVW5zYWZlVmVjdG9yT3ZlcmZs
b3c+IG1fY29hbGVzY2luZ0NhbmRpZGF0ZXM7CiAKLSAgICAvLyBMaXN0IG9mIGV2ZXJ5IG1vdmUg
aW5zdHJ1Y3Rpb24gYXNzb2NpYXRlZCB3aXRoIGEgVG1wLgotICAgIFZlY3RvcjxIYXNoU2V0PElu
ZGV4VHlwZSwgdHlwZW5hbWUgRGVmYXVsdEhhc2g8SW5kZXhUeXBlPjo6SGFzaCwgV1RGOjpVbnNp
Z25lZFdpdGhaZXJvS2V5SGFzaFRyYWl0czxJbmRleFR5cGU+Pj4gbV9tb3ZlTGlzdDsKKyAgICBi
b29sIGlzTW92ZVJlbGF0ZWQoSW5kZXhUeXBlIHRtcEluZGV4KQorICAgIHsKKyAgICAgICAgZm9y
ICh1bnNpZ25lZCBtb3ZlSW5kZXggOiBtX21vdmVMaXN0W3RtcEluZGV4XSkgeworICAgICAgICAg
ICAgaWYgKG1fYWN0aXZlTW92ZXMucXVpY2tHZXQobW92ZUluZGV4KSB8fCBtX3dvcmtsaXN0TW92
ZXMuY29udGFpbnMobW92ZUluZGV4KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogCi0gICAgLy8gQ29sb3JzLgot
ICAgIFZlY3RvcjxSZWcsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX2NvbG9yZWRUbXA7Ci0g
ICAgVmVjdG9yPEluZGV4VHlwZT4gbV9zcGlsbGVkVG1wczsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFt
ZSBGdW5jdGlvbj4KKyAgICB2b2lkIGZvckVhY2hOb2RlTW92ZXMoSW5kZXhUeXBlIHRtcEluZGV4
LCBGdW5jdGlvbiBmdW5jdGlvbikKKyAgICB7CisgICAgICAgIGZvciAodW5zaWduZWQgbW92ZUlu
ZGV4IDogbV9tb3ZlTGlzdFt0bXBJbmRleF0pIHsKKyAgICAgICAgICAgIGlmIChtX2FjdGl2ZU1v
dmVzLnF1aWNrR2V0KG1vdmVJbmRleCkgfHwgbV93b3JrbGlzdE1vdmVzLmNvbnRhaW5zKG1vdmVJ
bmRleCkpCisgICAgICAgICAgICAgICAgZnVuY3Rpb24obW92ZUluZGV4KTsKKyAgICAgICAgfQor
ICAgIH0KIAotICAgIC8vIFZhbHVlcyB0aGF0IGhhdmUgYmVlbiBjb2FsZXNjZWQgd2l0aCBhbiBv
dGhlciB2YWx1ZS4KLSAgICBWZWN0b3I8SW5kZXhUeXBlLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxv
dz4gbV9jb2FsZXNjZWRUbXBzOworICAgIHZvaWQgZW5hYmxlTW92ZXNPblZhbHVlKEluZGV4VHlw
ZSB0bXBJbmRleCkKKyAgICB7CisgICAgICAgIGZvciAodW5zaWduZWQgbW92ZUluZGV4IDogbV9t
b3ZlTGlzdFt0bXBJbmRleF0pIHsKKyAgICAgICAgICAgIGlmIChtX2FjdGl2ZU1vdmVzLnF1aWNr
Q2xlYXIobW92ZUluZGV4KSkKKyAgICAgICAgICAgICAgICBtX3dvcmtsaXN0TW92ZXMucmV0dXJu
TW92ZShtb3ZlSW5kZXgpOworICAgICAgICB9CisgICAgfQogCi0gICAgLy8gVGhlIHN0YWNrIG9m
IFRtcCByZW1vdmVkIGZyb20gdGhlIGdyYXBoIGFuZCByZWFkeSBmb3IgY29sb3JpbmcuCi0gICAg
Qml0VmVjdG9yIG1faXNPblNlbGVjdFN0YWNrOwotICAgIFZlY3RvcjxJbmRleFR5cGU+IG1fc2Vs
ZWN0U3RhY2s7CisgICAgdm9pZCBlbmFibGVNb3Zlc09uVmFsdWVBbmRBZGphY2VudHMoSW5kZXhU
eXBlIHRtcEluZGV4KQorICAgIHsKKyAgICAgICAgZW5hYmxlTW92ZXNPblZhbHVlKHRtcEluZGV4
KTsKIAotICAgIEluZGV4VHlwZSBtX2ZyYW1lUG9pbnRlckluZGV4IHsgMCB9OwotICAgIEJpdFZl
Y3RvciBtX2ludGVyZmVyZXNXaXRoRnJhbWVQb2ludGVyOworICAgICAgICBmb3JFYWNoQWRqYWNl
bnQodG1wSW5kZXgsIFt0aGlzXSAoSW5kZXhUeXBlIGFkamFjZW50VG1wSW5kZXgpIHsKKyAgICAg
ICAgICAgIGVuYWJsZU1vdmVzT25WYWx1ZShhZGphY2VudFRtcEluZGV4KTsKKyAgICAgICAgfSk7
CisgICAgfQogCiAgICAgc3RydWN0IE9yZGVyZWRNb3ZlU2V0IHsKICAgICAgICAgdW5zaWduZWQg
YWRkTW92ZSgpCkBAIC03MDIsNiArMTI0NiwxMSBAQCBwcm90ZWN0ZWQ6CiAgICAgICAgICAgICBt
X2xvd1ByaW9yaXR5TW92ZUxpc3QuY2xlYXIoKTsKICAgICAgICAgfQogCisgICAgICAgIHVuc2ln
bmVkIHRvdGFsTnVtYmVyT2ZNb3ZlcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBt
X21vdmVMaXN0LnNpemUoKSArIG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5zaXplKCk7CisgICAgICAg
IH0KKwogICAgIHByaXZhdGU6CiAgICAgICAgIFZlY3Rvcjx1bnNpZ25lZCwgMCwgVW5zYWZlVmVj
dG9yT3ZlcmZsb3c+IG1fcG9zaXRpb25Jbk1vdmVMaXN0OwogICAgICAgICBWZWN0b3I8dW5zaWdu
ZWQsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX21vdmVMaXN0OwpAQCAtNzEwLDM1ICsxMjU5
LDQ5IEBAIHByb3RlY3RlZDoKICAgICB9OwogCiAgICAgLy8gV29yayBsaXN0cy4KKyAgICAvLyBM
b3ctZGVncmVlLCBNb3ZlIHJlbGF0ZWQuCisgICAgSGFzaFNldDxJbmRleFR5cGU+IG1fZnJlZXpl
V29ya2xpc3Q7CiAgICAgLy8gU2V0IG9mICJtb3ZlIiBlbmFibGVkIGZvciBwb3NzaWJsZSBjb2Fs
ZXNjaW5nLgogICAgIE9yZGVyZWRNb3ZlU2V0IG1fd29ya2xpc3RNb3ZlczsKICAgICAvLyBTZXQg
b2YgIm1vdmUiIG5vdCB5ZXQgcmVhZHkgZm9yIGNvYWxlc2NpbmcuCiAgICAgQml0VmVjdG9yIG1f
YWN0aXZlTW92ZXM7Ci0gICAgLy8gTG93LWRlZ3JlZSwgbm9uLU1vdmUgcmVsYXRlZC4KLSAgICBW
ZWN0b3I8SW5kZXhUeXBlPiBtX3NpbXBsaWZ5V29ya2xpc3Q7Ci0gICAgLy8gSGlnaC1kZWdyZWUg
VG1wLgotICAgIEhhc2hTZXQ8SW5kZXhUeXBlPiBtX3NwaWxsV29ya2xpc3Q7Ci0gICAgLy8gTG93
LWRlZ3JlZSwgTW92ZSByZWxhdGVkLgotICAgIEhhc2hTZXQ8SW5kZXhUeXBlPiBtX2ZyZWV6ZVdv
cmtsaXN0OwotCi0gICAgYm9vbCBtX2hhc1NlbGVjdGVkU3BpbGwgeyBmYWxzZSB9OwotICAgIGJv
b2wgbV9oYXNDb2FsZXNjZWROb25Ucml2aWFsTW92ZSB7IGZhbHNlIH07Ci0KLSAgICAvLyBUaGUg
bWFwcGluZyBvZiBUbXAgdG8gdGhlaXIgYWxpYXMgZm9yIE1vdmVzIHRoYXQgYXJlIGFsd2F5cyBj
b2FsZXNjaW5nIHJlZ2FyZGxlc3Mgb2Ygc3BpbGxpbmcuCi0gICAgVmVjdG9yPEluZGV4VHlwZSwg
MCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fY29hbGVzY2VkVG1wc0F0U3BpbGw7Ci0gICAgCi0g
ICAgY29uc3QgSGFzaFNldDx1bnNpZ25lZD4mIG1fdW5zcGlsbGFibGVUbXBzOwogfTsKIAogLy8g
VGhpcyBwZXJmb3JtIGFsbCB0aGUgdGFza3MgdGhhdCBhcmUgc3BlY2lmaWMgdG8gY2VydGFpbiBy
ZWdpc3RlciB0eXBlLgotdGVtcGxhdGU8QXJnOjpUeXBlIHR5cGU+Ci1jbGFzcyBDb2xvcmluZ0Fs
bG9jYXRvciA6IHB1YmxpYyBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yPHVuc2lnbmVkPiB7Cit0
ZW1wbGF0ZTxBcmc6OlR5cGUgdHlwZSwgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFz
cyBBbGxvY2F0b3JUeXBlPgorY2xhc3MgQ29sb3JpbmdBbGxvY2F0b3IgOiBwdWJsaWMgQWxsb2Nh
dG9yVHlwZTx1bnNpZ25lZCwgQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT4+IHsKKyAgICB1c2luZyBC
YXNlID0gQWxsb2NhdG9yVHlwZTx1bnNpZ25lZCwgQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT4+Owor
ICAgIHVzaW5nIEJhc2U6Om1faXNPblNlbGVjdFN0YWNrOworICAgIHVzaW5nIEJhc2U6Om1fc2Vs
ZWN0U3RhY2s7CisgICAgdXNpbmcgQmFzZTo6bV9mcmFtZVBvaW50ZXJJbmRleDsKKyAgICB1c2lu
ZyBCYXNlOjptX2ludGVyZmVyZXNXaXRoRnJhbWVQb2ludGVyOworICAgIHVzaW5nIEJhc2U6Om1f
c2ltcGxpZnlXb3JrbGlzdDsKKyAgICB1c2luZyBCYXNlOjptX3NwaWxsV29ya2xpc3Q7CisgICAg
dXNpbmcgQmFzZTo6bV9oYXNTZWxlY3RlZFNwaWxsOworICAgIHVzaW5nIEJhc2U6Om1faGFzQ29h
bGVzY2VkTm9uVHJpdmlhbE1vdmU7CisgICAgdXNpbmcgQmFzZTo6bV9kZWdyZWVzOworICAgIHVz
aW5nIEJhc2U6Oms7CisgICAgdXNpbmcgQmFzZTo6bV9jb2FsZXNjZWRUbXBzOworICAgIHVzaW5n
IEJhc2U6Om1fbW92ZUxpc3Q7CisgICAgdXNpbmcgQmFzZTo6bV91c2VDb3VudHM7CisgICAgdXNp
bmcgQmFzZTo6bV9jb2FsZXNjZWRUbXBzQXRTcGlsbDsKKyAgICB1c2luZyBCYXNlOjptX3NwaWxs
ZWRUbXBzOworICAgIHVzaW5nIHR5cGVuYW1lIEJhc2U6Ok1vdmVPcGVyYW5kczsKKyAgICB1c2lu
ZyBCYXNlOjptX2NvYWxlc2NpbmdDYW5kaWRhdGVzOworICAgIHVzaW5nIEJhc2U6Om1fbGFzdFBy
ZWNvbG9yZWRSZWdpc3RlckluZGV4OworICAgIHVzaW5nIEJhc2U6Om1fY29sb3JlZFRtcDsKKyAg
ICB1c2luZyBCYXNlOjptX2NvZGU7CisgICAgdXNpbmcgdHlwZW5hbWUgQmFzZTo6SW50ZXJmZXJl
bmNlRWRnZTsKKyAgICB1c2luZyBCYXNlOjptX3dvcmtsaXN0TW92ZXM7CisgICAgdXNpbmcgQmFz
ZTo6aGFzSW50ZXJmZXJlbmNlRWRnZTsKKyAgICB1c2luZyBCYXNlOjpnZXRBbGlhczsKKyAgICB1
c2luZyBCYXNlOjphZGRFZGdlOworCiBwdWJsaWM6CisKICAgICBDb2xvcmluZ0FsbG9jYXRvcihD
b2RlJiBjb2RlLCBUbXBXaWR0aCYgdG1wV2lkdGgsIGNvbnN0IFVzZUNvdW50czxUbXA+JiB1c2VD
b3VudHMsIGNvbnN0IEhhc2hTZXQ8dW5zaWduZWQ+JiB1bnNwaWxsYWJsZVRtcCkKLSAgICAgICAg
OiBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yPHVuc2lnbmVkPihjb2RlLnJlZ3NJblByaW9yaXR5
T3JkZXIodHlwZSksIEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjpsYXN0TWFjaGluZVJlZ2lzdGVy
SW5kZXgoKSwgdG1wQXJyYXlTaXplKGNvZGUpLCB1bnNwaWxsYWJsZVRtcCkKLSAgICAgICAgLCBt
X2NvZGUoY29kZSkKKyAgICAgICAgOiBCYXNlKGNvZGUsIGNvZGUucmVnc0luUHJpb3JpdHlPcmRl
cih0eXBlKSwgQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46Omxhc3RNYWNoaW5lUmVnaXN0ZXJJbmRl
eCgpLCB0bXBBcnJheVNpemUoY29kZSksIHVuc3BpbGxhYmxlVG1wLCB1c2VDb3VudHMpCiAgICAg
ICAgICwgbV90bXBXaWR0aCh0bXBXaWR0aCkKLSAgICAgICAgLCBtX3VzZUNvdW50cyh1c2VDb3Vu
dHMpCiAgICAgewogICAgICAgICBpZiAodHlwZSA9PSBBcmc6OkdQKSB7CiAgICAgICAgICAgICBt
X2ZyYW1lUG9pbnRlckluZGV4ID0gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5k
ZXgoVG1wKE1hY3JvQXNzZW1ibGVyOjpmcmFtZVBvaW50ZXJSZWdpc3RlcikpOwpAQCAtNzQ3LDcg
KzEzMTAsNiBAQCBwdWJsaWM6CiAKICAgICAgICAgaW5pdGlhbGl6ZVByZWNvbG9yZWRUbXAoKTsK
ICAgICAgICAgYnVpbGQoKTsKLSAgICAgICAgYWxsb2NhdGUoKTsKICAgICB9CiAKICAgICBUbXAg
Z2V0QWxpYXMoVG1wIHRtcCkgY29uc3QKQEAgLTg1Myw3ICsxNDE1LDcgQEAgcHVibGljOgogICAg
ICAgICByZXR1cm4gcmVnOwogICAgIH0KIAotcHJpdmF0ZToKK3Byb3RlY3RlZDoKICAgICBzdGF0
aWMgdW5zaWduZWQgdG1wQXJyYXlTaXplKENvZGUmIGNvZGUpCiAgICAgewogICAgICAgICB1bnNp
Z25lZCBudW1UbXBzID0gY29kZS5udW1UbXBzKHR5cGUpOwpAQCAtODg3LDcgKzE0NDksNyBAQCBw
cml2YXRlOgogICAgICAgICB1bnNpZ25lZCBsZWZ0SW5kZXggPSBBYnNvbHV0ZVRtcE1hcHBlcjx0
eXBlPjo6YWJzb2x1dGVJbmRleChsZWZ0VG1wKTsKICAgICAgICAgdW5zaWduZWQgcmlnaHRJbmRl
eCA9IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHJpZ2h0VG1wKTsKIAot
ICAgICAgICByZXR1cm4gIW1faW50ZXJmZXJlbmNlRWRnZXMuY29udGFpbnMoSW50ZXJmZXJlbmNl
RWRnZShsZWZ0SW5kZXgsIHJpZ2h0SW5kZXgpKTsKKyAgICAgICAgcmV0dXJuICFoYXNJbnRlcmZl
cmVuY2VFZGdlKEludGVyZmVyZW5jZUVkZ2UobGVmdEluZGV4LCByaWdodEluZGV4KSk7CiAgICAg
fQogCiAgICAgdm9pZCBhZGRUb0xvd1ByaW9yaXR5Q29hbGVzY2luZ0NhbmRpZGF0ZXMoQXJnIGxl
ZnQsIEFyZyByaWdodCkKQEAgLTkwNSwxNSArMTQ2NywxNSBAQCBwcml2YXRlOgogICAgICAgICB1
bnNpZ25lZCBuZXdJbmRleEluV29ya2xpc3QgPSBtX3dvcmtsaXN0TW92ZXMuYWRkTG93UHJpb3Jp
dHlNb3ZlKCk7CiAgICAgICAgIEFTU0VSVF9VTlVTRUQobmV3SW5kZXhJbldvcmtsaXN0LCBuZXdJ
bmRleEluV29ya2xpc3QgPT0gbmV4dE1vdmVJbmRleCk7CiAKLSAgICAgICAgQVNTRVJUKG5leHRN
b3ZlSW5kZXggPD0gbV9hY3RpdmVNb3Zlcy5zaXplKCkpOwotICAgICAgICBtX2FjdGl2ZU1vdmVz
LmVuc3VyZVNpemUobmV4dE1vdmVJbmRleCArIDEpOwotCiAgICAgICAgIG1fbW92ZUxpc3RbbGVm
dEluZGV4XS5hZGQobmV4dE1vdmVJbmRleCk7CiAgICAgICAgIG1fbW92ZUxpc3RbcmlnaHRJbmRl
eF0uYWRkKG5leHRNb3ZlSW5kZXgpOwogICAgIH0KIAogICAgIHZvaWQgYnVpbGQoKQogICAgIHsK
KyAgICAgICAgbV9jb2FsZXNjaW5nQ2FuZGlkYXRlcy5jbGVhcigpOworICAgICAgICBtX3dvcmts
aXN0TW92ZXMuY2xlYXIoKTsKKwogICAgICAgICBUbXBMaXZlbmVzczx0eXBlPiBsaXZlbmVzcyht
X2NvZGUpOwogICAgICAgICBmb3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogbV9jb2RlKSB7CiAgICAg
ICAgICAgICB0eXBlbmFtZSBUbXBMaXZlbmVzczx0eXBlPjo6TG9jYWxDYWxjIGxvY2FsQ2FsYyhs
aXZlbmVzcywgYmxvY2spOwpAQCAtOTMyLDYgKzE0OTQsNyBAQCBwcml2YXRlOgogICAgIHsKICAg
ICAgICAgaWYgKHRyYWNlRGVidWcpCiAgICAgICAgICAgICBkYXRhTG9nKCJCdWlsZGluZyBiZXR3
ZWVuICIsIHBvaW50ZXJEdW1wKHByZXZJbnN0KSwgIiBhbmQgIiwgcG9pbnRlckR1bXAobmV4dElu
c3QpLCAiOlxuIik7CisKICAgICAgICAgSW5zdDo6Zm9yRWFjaERlZldpdGhFeHRyYUNsb2JiZXJl
ZFJlZ3M8VG1wPigKICAgICAgICAgICAgIHByZXZJbnN0LCBuZXh0SW5zdCwKICAgICAgICAgICAg
IFsmXSAoY29uc3QgVG1wJiBhcmcsIEFyZzo6Um9sZSwgQXJnOjpUeXBlIGFyZ1R5cGUsIEFyZzo6
V2lkdGgpIHsKQEAgLTk3MiwxMyArMTUzNSwxMiBAQCBwcml2YXRlOgogCiAgICAgICAgICAgICB1
bnNpZ25lZCBuZXh0TW92ZUluZGV4ID0gbV9jb2FsZXNjaW5nQ2FuZGlkYXRlcy5zaXplKCk7CiAg
ICAgICAgICAgICBtX2NvYWxlc2NpbmdDYW5kaWRhdGVzLmFwcGVuZCh7IEFic29sdXRlVG1wTWFw
cGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHVzZVRtcCksIEFic29sdXRlVG1wTWFwcGVyPHR5cGU+
OjphYnNvbHV0ZUluZGV4KGRlZlRtcCkgfSk7CisgICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykK
KyAgICAgICAgICAgICAgICBkYXRhTG9nTG4oIk1vdmUgYXQgaW5kZXggIiwgbmV4dE1vdmVJbmRl
eCwgIiBpczogIiwgKnByZXZJbnN0KTsKIAogICAgICAgICAgICAgdW5zaWduZWQgbmV3SW5kZXhJ
bldvcmtsaXN0ID0gbV93b3JrbGlzdE1vdmVzLmFkZE1vdmUoKTsKICAgICAgICAgICAgIEFTU0VS
VF9VTlVTRUQobmV3SW5kZXhJbldvcmtsaXN0LCBuZXdJbmRleEluV29ya2xpc3QgPT0gbmV4dE1v
dmVJbmRleCk7CiAKLSAgICAgICAgICAgIEFTU0VSVChuZXh0TW92ZUluZGV4IDw9IG1fYWN0aXZl
TW92ZXMuc2l6ZSgpKTsKLSAgICAgICAgICAgIG1fYWN0aXZlTW92ZXMuZW5zdXJlU2l6ZShuZXh0
TW92ZUluZGV4ICsgMSk7Ci0KICAgICAgICAgICAgIGZvciAoY29uc3QgQXJnJiBhcmcgOiBwcmV2
SW5zdC0+YXJncykgewogICAgICAgICAgICAgICAgIGF1dG8mIGxpc3QgPSBtX21vdmVMaXN0W0Fi
c29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KGFyZy50bXAoKSldOwogICAgICAg
ICAgICAgICAgIGxpc3QuYWRkKG5leHRNb3ZlSW5kZXgpOwpAQCAtMTEwNiwxMjIgKzE2NjgsMTUg
QEAgcHJpdmF0ZToKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgdm9pZCBzZWxl
Y3RTcGlsbCgpCi0gICAgewotICAgICAgICBpZiAoIW1faGFzU2VsZWN0ZWRTcGlsbCkgewotICAg
ICAgICAgICAgbV9oYXNTZWxlY3RlZFNwaWxsID0gdHJ1ZTsKLQotICAgICAgICAgICAgaWYgKG1f
aGFzQ29hbGVzY2VkTm9uVHJpdmlhbE1vdmUpCi0gICAgICAgICAgICAgICAgbV9jb2FsZXNjZWRU
bXBzQXRTcGlsbCA9IG1fY29hbGVzY2VkVG1wczsKLSAgICAgICAgfQotCi0gICAgICAgIGF1dG8g
aXRlcmF0b3IgPSBtX3NwaWxsV29ya2xpc3QuYmVnaW4oKTsKLQotICAgICAgICBSRUxFQVNFX0FT
U0VSVF9XSVRIX01FU1NBR0UoaXRlcmF0b3IgIT0gbV9zcGlsbFdvcmtsaXN0LmVuZCgpLCAic2Vs
ZWN0U3BpbGwoKSBjYWxsZWQgd2hlbiB0aGVyZSB3YXMgbm8gc3BpbGwuIik7Ci0gICAgICAgIFJF
TEVBU0VfQVNTRVJUX1dJVEhfTUVTU0FHRSghbV91bnNwaWxsYWJsZVRtcHMuY29udGFpbnMoKml0
ZXJhdG9yKSwgInRyeWluZyB0byBzcGlsbCB1bnNwaWxsYWJsZSB0bXAiKTsKLQotICAgICAgICAv
LyBIaWdoZXIgc2NvcmUgbWVhbnMgbW9yZSBkZXNpcmFibGUgdG8gc3BpbGwuIExvd2VyIHNjb3Jl
cyBtYXhpbWl6ZSB0aGUgbGlrZWxpaG9vZCB0aGF0IGEgdG1wCi0gICAgICAgIC8vIGdldHMgYSBy
ZWdpc3Rlci4KLSAgICAgICAgYXV0byBzY29yZSA9IFsmXSAoVG1wIHRtcCkgLT4gZG91YmxlIHsK
LSAgICAgICAgICAgIC8vIEFpciBleHBvc2VzIHRoZSBjb25jZXB0IG9mICJmYXN0IHRtcHMiLCBh
bmQgd2UgaW50ZXJwcmV0IHRoYXQgdG8gbWVhbiB0aGF0IHRoZSB0bXAKLSAgICAgICAgICAgIC8v
IHNob3VsZCBhbHdheXMgYmUgaW4gYSByZWdpc3Rlci4KLSAgICAgICAgICAgIGlmIChtX2NvZGUu
aXNGYXN0VG1wKHRtcCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAK
LSAgICAgICAgICAgIC8vIEFsbCBlbHNlIGJlaW5nIGVxdWFsLCB0aGUgc2NvcmUgc2hvdWxkIGJl
IGRpcmVjdGx5IHJlbGF0ZWQgdG8gdGhlIGRlZ3JlZS4KLSAgICAgICAgICAgIGRvdWJsZSBkZWdy
ZWUgPSBzdGF0aWNfY2FzdDxkb3VibGU+KG1fZGVncmVlc1tBYnNvbHV0ZVRtcE1hcHBlcjx0eXBl
Pjo6YWJzb2x1dGVJbmRleCh0bXApXSk7Ci0KLSAgICAgICAgICAgIC8vIEFsbCBlbHNlIGJlaW5n
IGVxdWFsLCB0aGUgc2NvcmUgc2hvdWxkIGJlIGludmVyc2VseSByZWxhdGVkIHRvIHRoZSBudW1i
ZXIgb2Ygd2FybSB1c2VzIGFuZAotICAgICAgICAgICAgLy8gZGVmcy4KLSAgICAgICAgICAgIGNv
bnN0IFVzZUNvdW50czxUbXA+OjpDb3VudHMqIGNvdW50cyA9IG1fdXNlQ291bnRzW3RtcF07Ci0g
ICAgICAgICAgICBpZiAoIWNvdW50cykKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RkOjpudW1l
cmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAg
ICBkb3VibGUgdXNlcyA9IGNvdW50cy0+bnVtV2FybVVzZXMgKyBjb3VudHMtPm51bURlZnM7Ci0K
LSAgICAgICAgICAgIC8vIElmIGl0J3MgYSBjb25zdGFudCwgdGhlbiBpdCdzIG5vdCBhcyBiYWQg
dG8gc3BpbGwuIFdlIGNhbiByZW1hdGVyaWFsaXplIGl0IGluIG1hbnkKLSAgICAgICAgICAgIC8v
IGNhc2VzLgotICAgICAgICAgICAgaWYgKGNvdW50cy0+bnVtQ29uc3REZWZzID09IDEgJiYgY291
bnRzLT5udW1EZWZzID09IDEpCi0gICAgICAgICAgICAgICAgdXNlcyAvPSAyOwotCi0gICAgICAg
ICAgICByZXR1cm4gZGVncmVlIC8gdXNlczsKLSAgICAgICAgfTsKLQotICAgICAgICBhdXRvIHZp
Y3RpbUl0ZXJhdG9yID0gaXRlcmF0b3I7Ci0gICAgICAgIGRvdWJsZSBtYXhTY29yZSA9IHNjb3Jl
KEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleCgqaXRlcmF0b3Ip
KTsKLQotICAgICAgICArK2l0ZXJhdG9yOwotICAgICAgICBmb3IgKDtpdGVyYXRvciAhPSBtX3Nw
aWxsV29ya2xpc3QuZW5kKCk7ICsraXRlcmF0b3IpIHsKLSAgICAgICAgICAgIGRvdWJsZSB0bXBT
Y29yZSA9IHNjb3JlKEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRl
eCgqaXRlcmF0b3IpKTsKLSAgICAgICAgICAgIGlmICh0bXBTY29yZSA+IG1heFNjb3JlKSB7Ci0g
ICAgICAgICAgICAgICAgQVNTRVJUKCFtX3Vuc3BpbGxhYmxlVG1wcy5jb250YWlucygqaXRlcmF0
b3IpKTsKLSAgICAgICAgICAgICAgICB2aWN0aW1JdGVyYXRvciA9IGl0ZXJhdG9yOwotICAgICAg
ICAgICAgICAgIG1heFNjb3JlID0gdG1wU2NvcmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0K
LQotICAgICAgICB1bnNpZ25lZCB2aWN0aW1JbmRleCA9ICp2aWN0aW1JdGVyYXRvcjsKLSAgICAg
ICAgbV9zcGlsbFdvcmtsaXN0LnJlbW92ZSh2aWN0aW1JdGVyYXRvcik7Ci0gICAgICAgIG1fc2lt
cGxpZnlXb3JrbGlzdC5hcHBlbmQodmljdGltSW5kZXgpOwotCi0gICAgICAgIGZyZWV6ZU1vdmVz
KHZpY3RpbUluZGV4KTsKLSAgICB9Ci0KLSAgICB2b2lkIGFsbG9jYXRlKCkKLSAgICB7Ci0gICAg
ICAgIEFTU0VSVF9XSVRIX01FU1NBR0UobV9hY3RpdmVNb3Zlcy5zaXplKCkgPj0gbV9jb2FsZXNj
aW5nQ2FuZGlkYXRlcy5zaXplKCksICJUaGUgYWN0aXZlTW92ZSBzZXQgc2hvdWxkIGJlIGJpZyBl
bm91Z2ggZm9yIHRoZSBxdWljayBvcGVyYXRpb25zIG9mIEJpdFZlY3Rvci4iKTsKLQotICAgICAg
ICBtYWtlV29ya0xpc3QoKTsKLQotICAgICAgICBpZiAoZGVidWcpIHsKLSAgICAgICAgICAgIGRh
dGFMb2coIkludGVyZmVyZW5jZTogIiwgbGlzdER1bXAobV9pbnRlcmZlcmVuY2VFZGdlcyksICJc
biIpOwotICAgICAgICAgICAgZHVtcEludGVyZmVyZW5jZUdyYXBoSW5Eb3QoV1RGOjpkYXRhRmls
ZSgpKTsKLSAgICAgICAgICAgIGRhdGFMb2coIkNvYWxlc2NpbmcgY2FuZGlkYXRlczpcbiIpOwot
ICAgICAgICAgICAgZm9yIChNb3ZlT3BlcmFuZHMmIG1vdmVPcCA6IG1fY29hbGVzY2luZ0NhbmRp
ZGF0ZXMpIHsKLSAgICAgICAgICAgICAgICBkYXRhTG9nKCIgICAgIiwgQWJzb2x1dGVUbXBNYXBw
ZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KG1vdmVPcC5zcmNJbmRleCksCi0gICAgICAg
ICAgICAgICAgICAgICIgLT4gIiwgQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNv
bHV0ZUluZGV4KG1vdmVPcC5kc3RJbmRleCksICJcbiIpOwotICAgICAgICAgICAgfQotICAgICAg
ICAgICAgZGF0YUxvZygiSW5pdGlhbCB3b3JrIGxpc3RcbiIpOwotICAgICAgICAgICAgZHVtcFdv
cmtMaXN0cyhXVEY6OmRhdGFGaWxlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZG8gewotICAg
ICAgICAgICAgaWYgKHRyYWNlRGVidWcpIHsKLSAgICAgICAgICAgICAgICBkYXRhTG9nKCJCZWZv
cmUgR3JhcGggc2ltcGxpZmljYXRpb24gaXRlcmF0aW9uXG4iKTsKLSAgICAgICAgICAgICAgICBk
dW1wV29ya0xpc3RzKFdURjo6ZGF0YUZpbGUoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAg
ICAgIGlmICghbV9zaW1wbGlmeVdvcmtsaXN0LmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICBz
aW1wbGlmeSgpOwotICAgICAgICAgICAgZWxzZSBpZiAoIW1fd29ya2xpc3RNb3Zlcy5pc0VtcHR5
KCkpCi0gICAgICAgICAgICAgICAgY29hbGVzY2UoKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKCFt
X2ZyZWV6ZVdvcmtsaXN0LmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICBmcmVlemUoKTsKLSAg
ICAgICAgICAgIGVsc2UgaWYgKCFtX3NwaWxsV29ya2xpc3QuaXNFbXB0eSgpKQotICAgICAgICAg
ICAgICAgIHNlbGVjdFNwaWxsKCk7Ci0KLSAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKSB7Ci0g
ICAgICAgICAgICAgICAgZGF0YUxvZygiQWZ0ZXIgR3JhcGggc2ltcGxpZmljYXRpb24gaXRlcmF0
aW9uXG4iKTsKLSAgICAgICAgICAgICAgICBkdW1wV29ya0xpc3RzKFdURjo6ZGF0YUZpbGUoKSk7
Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUgKCFtX3NpbXBsaWZ5V29ya2xpc3QuaXNF
bXB0eSgpIHx8ICFtX3dvcmtsaXN0TW92ZXMuaXNFbXB0eSgpIHx8ICFtX2ZyZWV6ZVdvcmtsaXN0
LmlzRW1wdHkoKSB8fCAhbV9zcGlsbFdvcmtsaXN0LmlzRW1wdHkoKSk7Ci0KLSAgICAgICAgYXNz
aWduQ29sb3JzKCk7Ci0gICAgfQotCi0jaWYgUExBVEZPUk0oQ09DT0EpCi0jcHJhZ21hIG1hcmsg
LSBEZWJ1Z2dpbmcgaGVscGVycy4KLSNlbmRpZgotCiAgICAgdm9pZCBkdW1wSW50ZXJmZXJlbmNl
R3JhcGhJbkRvdChQcmludFN0cmVhbSYgb3V0KQogICAgIHsKICAgICAgICAgb3V0LnByaW50KCJn
cmFwaCBJbnRlcmZlcmVuY2VHcmFwaCB7IFxuIik7CiAKICAgICAgICAgSGFzaFNldDxUbXA+IHRt
cHNXaXRoSW50ZXJmZXJlbmNlczsKLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiBlZGdlIDogbV9p
bnRlcmZlcmVuY2VFZGdlcykgewotICAgICAgICAgICAgdG1wc1dpdGhJbnRlcmZlcmVuY2VzLmFk
ZChBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgoZWRnZS5maXJz
dCgpKSk7Ci0gICAgICAgICAgICB0bXBzV2l0aEludGVyZmVyZW5jZXMuYWRkKEFic29sdXRlVG1w
TWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleChlZGdlLnNlY29uZCgpKSk7Ci0gICAg
ICAgIH0KKyAgICAgICAgLy9mb3IgKGNvbnN0IGF1dG8mIGVkZ2UgOiBtX2ludGVyZmVyZW5jZUVk
Z2VzKSB7CisgICAgICAgIC8vICAgIHRtcHNXaXRoSW50ZXJmZXJlbmNlcy5hZGQoQWJzb2x1dGVU
bXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KGVkZ2UuZmlyc3QoKSkpOworICAg
ICAgICAvLyAgICB0bXBzV2l0aEludGVyZmVyZW5jZXMuYWRkKEFic29sdXRlVG1wTWFwcGVyPHR5
cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleChlZGdlLnNlY29uZCgpKSk7CisgICAgICAgIC8vfQog
CiAgICAgICAgIGZvciAoY29uc3QgYXV0byYgdG1wIDogdG1wc1dpdGhJbnRlcmZlcmVuY2VzKSB7
CiAgICAgICAgICAgICB1bnNpZ25lZCB0bXBJbmRleCA9IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+
OjphYnNvbHV0ZUluZGV4KHRtcCk7CkBAIC0xMjMxLDggKzE2ODYsOCBAQCBwcml2YXRlOgogICAg
ICAgICAgICAgICAgIG91dC5wcmludCgiICAgICIsIHRtcC5pbnRlcm5hbFZhbHVlKCksICIgW2xh
YmVsPVwiIiwgdG1wLCAiXCJdO1xuIik7CiAgICAgICAgIH0KIAotICAgICAgICBmb3IgKGNvbnN0
IGF1dG8mIGVkZ2UgOiBtX2ludGVyZmVyZW5jZUVkZ2VzKQotICAgICAgICAgICAgb3V0LnByaW50
KCIgICAgIiwgZWRnZS5maXJzdCgpLCAiIC0tICIsIGVkZ2Uuc2Vjb25kKCksICI7XG4iKTsKKyAg
ICAgICAgLy9mb3IgKGNvbnN0IGF1dG8mIGVkZ2UgOiBtX2ludGVyZmVyZW5jZUVkZ2VzKQorICAg
ICAgICAvLyAgICBvdXQucHJpbnQoIiAgICAiLCBlZGdlLmZpcnN0KCksICIgLS0gIiwgZWRnZS5z
ZWNvbmQoKSwgIjtcbiIpOwogICAgICAgICBvdXQucHJpbnQoIn1cbiIpOwogICAgIH0KIApAQCAt
MTI0MSwzOCArMTY5NiwzNCBAQCBwcml2YXRlOgogICAgICAgICBvdXQucHJpbnQoIlNpbXBsaWZ5
IHdvcmsgbGlzdDpcbiIpOwogICAgICAgICBmb3IgKHVuc2lnbmVkIHRtcEluZGV4IDogbV9zaW1w
bGlmeVdvcmtsaXN0KQogICAgICAgICAgICAgb3V0LnByaW50KCIgICAgIiwgQWJzb2x1dGVUbXBN
YXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KHRtcEluZGV4KSwgIlxuIik7Ci0gICAg
ICAgIG91dC5wcmludGYoIk1vdmVzIHdvcmsgbGlzdCBpcyBlbXB0eT8gJWRcbiIsIG1fd29ya2xp
c3RNb3Zlcy5pc0VtcHR5KCkpOwotICAgICAgICBvdXQucHJpbnQoIkZyZWV6ZSB3b3JrIGxpc3Q6
XG4iKTsKLSAgICAgICAgZm9yICh1bnNpZ25lZCB0bXBJbmRleCA6IG1fZnJlZXplV29ya2xpc3Qp
Ci0gICAgICAgICAgICBvdXQucHJpbnQoIiAgICAiLCBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6
dG1wRnJvbUFic29sdXRlSW5kZXgodG1wSW5kZXgpLCAiXG4iKTsKKyAgICAgICAgLy9vdXQucHJp
bnRmKCJNb3ZlcyB3b3JrIGxpc3QgaXMgZW1wdHk/ICVkXG4iLCBtX3dvcmtsaXN0TW92ZXMuaXNF
bXB0eSgpKTsKKyAgICAgICAgLy9vdXQucHJpbnQoIkZyZWV6ZSB3b3JrIGxpc3Q6XG4iKTsKKyAg
ICAgICAgLy9mb3IgKHVuc2lnbmVkIHRtcEluZGV4IDogbV9mcmVlemVXb3JrbGlzdCkKKyAgICAg
ICAgLy8gICAgb3V0LnByaW50KCIgICAgIiwgQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZy
b21BYnNvbHV0ZUluZGV4KHRtcEluZGV4KSwgIlxuIik7CiAgICAgICAgIG91dC5wcmludCgiU3Bp
bGwgd29yayBsaXN0OlxuIik7CiAgICAgICAgIGZvciAodW5zaWduZWQgdG1wSW5kZXggOiBtX3Nw
aWxsV29ya2xpc3QpCiAgICAgICAgICAgICBvdXQucHJpbnQoIiAgICAiLCBBYnNvbHV0ZVRtcE1h
cHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgodG1wSW5kZXgpLCAiXG4iKTsKICAgICB9
CiAKLSAgICB1c2luZyBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yPHVuc2lnbmVkPjo6YWRkRWRn
ZTsKLSAgICB1c2luZyBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yPHVuc2lnbmVkPjo6Z2V0QWxp
YXM7CiAKLSAgICBDb2RlJiBtX2NvZGU7CiAgICAgVG1wV2lkdGgmIG1fdG1wV2lkdGg7Ci0gICAg
Ly8gRklYTUU6IHNwaWxsaW5nIHNob3VsZCBub3QgdHlwZSBzcGVjaWZpYy4gSXQgaXMgb25seSBh
IHNpZGUgZWZmZWN0IG9mIHVzaW5nIFVzZUNvdW50cy4KLSAgICBjb25zdCBVc2VDb3VudHM8VG1w
PiYgbV91c2VDb3VudHM7CiB9OwogCi1jbGFzcyBJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZyB7
CitjbGFzcyBSZWdpc3RlckFsbG9jYXRpb24gewogcHVibGljOgotICAgIEl0ZXJhdGVkUmVnaXN0
ZXJDb2FsZXNjaW5nKENvZGUmIGNvZGUpCisgICAgUmVnaXN0ZXJBbGxvY2F0aW9uKENvZGUmIGNv
ZGUsIFVzZUNvdW50czxUbXA+JiB1c2VDb3VudHMpCiAgICAgICAgIDogbV9jb2RlKGNvZGUpCi0g
ICAgICAgICwgbV91c2VDb3VudHMoY29kZSkKKyAgICAgICAgLCBtX3VzZUNvdW50cyh1c2VDb3Vu
dHMpCiAgICAgewogICAgIH0KIAogICAgIHZvaWQgcnVuKCkKICAgICB7CiAgICAgICAgIHBhZElu
dGVyZmVyZW5jZShtX2NvZGUpOwotICAgICAgICAKLSAgICAgICAgaXRlcmF0ZWRSZWdpc3RlckNv
YWxlc2NpbmdPblR5cGU8QXJnOjpHUD4oKTsKLSAgICAgICAgaXRlcmF0ZWRSZWdpc3RlckNvYWxl
c2NpbmdPblR5cGU8QXJnOjpGUD4oKTsKKworICAgICAgICBhbGxvY2F0ZU9uVHlwZTxBcmc6OkdQ
PigpOworICAgICAgICBtX251bUl0ZXJhdGlvbnMgPSAwOworICAgICAgICBhbGxvY2F0ZU9uVHlw
ZTxBcmc6OkZQPigpOwogCiAgICAgICAgIGZpeFNwaWxsc0FmdGVyVGVybWluYWxzKCk7CiAKQEAg
LTEyODIsNyArMTczMyw3IEBAIHB1YmxpYzoKIAogcHJpdmF0ZToKICAgICB0ZW1wbGF0ZTxBcmc6
OlR5cGUgdHlwZT4KLSAgICB2b2lkIGl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nT25UeXBlKCkK
KyAgICB2b2lkIGFsbG9jYXRlT25UeXBlKCkKICAgICB7CiAgICAgICAgIEhhc2hTZXQ8dW5zaWdu
ZWQ+IHVuc3BpbGxhYmxlVG1wcyA9IGNvbXB1dGVVbnNwaWxsYWJsZVRtcHM8dHlwZT4oKTsKIApA
QCAtMTMxMSwyMiArMTc2MiwzOCBAQCBwcml2YXRlOgogICAgICAgICAgICAgLy8gcmVjb21wdXRh
dGlvbiwgaW4gd2hpY2ggY2FzZSBzcGVlZGluZyB1cCB0aGUgbG9va3VwIHdvdWxkIGJlIGEgYmln
Z2VyIHdpbi4KICAgICAgICAgICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD0xNTI0NzgKICAgICAgICAgICAgIG1fdG1wV2lkdGgucmVjb21wdXRlKG1fY29kZSk7
Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIENvbG9yaW5nQWxsb2NhdG9yPHR5cGU+IGFsbG9j
YXRvcihtX2NvZGUsIG1fdG1wV2lkdGgsIG1fdXNlQ291bnRzLCB1bnNwaWxsYWJsZVRtcHMpOwot
ICAgICAgICAgICAgaWYgKCFhbGxvY2F0b3IucmVxdWlyZXNTcGlsbGluZygpKSB7Ci0gICAgICAg
ICAgICAgICAgYXNzaWduUmVnaXN0ZXJzVG9UbXAoYWxsb2NhdG9yKTsKLSAgICAgICAgICAgICAg
ICBpZiAodHJhY2VEZWJ1ZykKLSAgICAgICAgICAgICAgICAgICAgZGF0YUxvZygiU3VjY2Vzc2Z1
bGwgYWxsb2NhdGlvbiBhdCBpdGVyYXRpb24gIiwgbV9udW1JdGVyYXRpb25zLCAiOlxuIiwgbV9j
b2RlKTsKIAotICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGF1dG8gZG9BbGxv
Y2F0aW9uID0gWyZdIChhdXRvJiBhbGxvY2F0b3IpIC0+IGJvb2wgeworICAgICAgICAgICAgICAg
IGFsbG9jYXRvci5hbGxvY2F0ZSgpOworICAgICAgICAgICAgICAgIGlmICghYWxsb2NhdG9yLnJl
cXVpcmVzU3BpbGxpbmcoKSkgeworICAgICAgICAgICAgICAgICAgICBhc3NpZ25SZWdpc3RlcnNU
b1RtcDx0eXBlPihhbGxvY2F0b3IpOworICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2VEZWJ1
ZykKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFMb2coIlN1Y2Nlc3NmdWxsIGFsbG9jYXRp
b24gYXQgaXRlcmF0aW9uICIsIG1fbnVtSXRlcmF0aW9ucywgIjpcbiIsIG1fY29kZSk7CisKKyAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICAgICAgYWRkU3BpbGxBbmRGaWxsPHR5cGU+KGFsbG9jYXRvciwgdW5zcGlsbGFibGVU
bXBzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9OworICAg
ICAgICAgICAgCisgICAgICAgICAgICBib29sIGRvbmU7CisgICAgICAgICAgICBpZiAodHJ1ZSkg
eworICAgICAgICAgICAgICAgIENvbG9yaW5nQWxsb2NhdG9yPHR5cGUsIEJyaWdncz4gYWxsb2Nh
dG9yKG1fY29kZSwgbV90bXBXaWR0aCwgbV91c2VDb3VudHMsIHVuc3BpbGxhYmxlVG1wcyk7Cisg
ICAgICAgICAgICAgICAgZG9uZSA9IGRvQWxsb2NhdGlvbihhbGxvY2F0b3IpOworICAgICAgICAg
ICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBDb2xvcmluZ0FsbG9jYXRvcjx0eXBlLCBJUkM+
IGFsbG9jYXRvcihtX2NvZGUsIG1fdG1wV2lkdGgsIG1fdXNlQ291bnRzLCB1bnNwaWxsYWJsZVRt
cHMpOworICAgICAgICAgICAgICAgIGRvbmUgPSBkb0FsbG9jYXRpb24oYWxsb2NhdG9yKTsKICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZFNwaWxsQW5kRmlsbDx0eXBlPihhbGxvY2F0b3Is
IHVuc3BpbGxhYmxlVG1wcyk7CisgICAgICAgICAgICBpZiAoZG9uZSkKKyAgICAgICAgICAgICAg
ICByZXR1cm47CiAgICAgICAgIH0KICAgICB9CiAKICAgICB0ZW1wbGF0ZTxBcmc6OlR5cGUgdHlw
ZT4KICAgICBIYXNoU2V0PHVuc2lnbmVkPiBjb21wdXRlVW5zcGlsbGFibGVUbXBzKCkKICAgICB7
CisKICAgICAgICAgSGFzaFNldDx1bnNpZ25lZD4gdW5zcGlsbGFibGVUbXBzOwogCiAgICAgICAg
IHN0cnVjdCBSYW5nZSB7CkBAIC0xMzkwLDggKzE4NTcsOCBAQCBwcml2YXRlOgogICAgICAgICBy
ZXR1cm4gdW5zcGlsbGFibGVUbXBzOwogICAgIH0KIAotICAgIHRlbXBsYXRlPEFyZzo6VHlwZSB0
eXBlPgotICAgIHZvaWQgYXNzaWduUmVnaXN0ZXJzVG9UbXAoY29uc3QgQ29sb3JpbmdBbGxvY2F0
b3I8dHlwZT4mIGFsbG9jYXRvcikKKyAgICB0ZW1wbGF0ZTxBcmc6OlR5cGUgdHlwZSwgdHlwZW5h
bWUgQWxsb2NhdG9yVHlwZT4KKyAgICB2b2lkIGFzc2lnblJlZ2lzdGVyc1RvVG1wKGNvbnN0IEFs
bG9jYXRvclR5cGUmIGFsbG9jYXRvcikKICAgICB7CiAgICAgICAgIGZvciAoQmFzaWNCbG9jayog
YmxvY2sgOiBtX2NvZGUpIHsKICAgICAgICAgICAgIC8vIEdpdmUgVG1wIGEgdmFsaWQgcmVnaXN0
ZXIuCkBAIC0xNDQ3LDggKzE5MTQsOCBAQCBwcml2YXRlOgogICAgICAgICByZXR1cm4gd2lkdGgg
PD0gQXJnOjpXaWR0aDMyID8gNCA6IDg7CiAgICAgfQogCi0gICAgdGVtcGxhdGU8QXJnOjpUeXBl
IHR5cGU+Ci0gICAgdm9pZCBhZGRTcGlsbEFuZEZpbGwoY29uc3QgQ29sb3JpbmdBbGxvY2F0b3I8
dHlwZT4mIGFsbG9jYXRvciwgSGFzaFNldDx1bnNpZ25lZD4mIHVuc3BpbGxhYmxlVG1wcykKKyAg
ICB0ZW1wbGF0ZTxBcmc6OlR5cGUgdHlwZSwgdHlwZW5hbWUgQWxsb2NhdG9yVHlwZT4KKyAgICB2
b2lkIGFkZFNwaWxsQW5kRmlsbChjb25zdCBBbGxvY2F0b3JUeXBlJiBhbGxvY2F0b3IsIEhhc2hT
ZXQ8dW5zaWduZWQ+JiB1bnNwaWxsYWJsZVRtcHMpCiAgICAgewogICAgICAgICBIYXNoTWFwPFRt
cCwgU3RhY2tTbG90Kj4gc3RhY2tTbG90czsKICAgICAgICAgZm9yIChUbXAgdG1wIDogYWxsb2Nh
dG9yLnNwaWxsZWRUbXBzKCkpIHsKQEAgLTE2MzcsMTggKzIxMDQsMTkgQEAgcHJpdmF0ZToKIAog
ICAgIENvZGUmIG1fY29kZTsKICAgICBUbXBXaWR0aCBtX3RtcFdpZHRoOwotICAgIFVzZUNvdW50
czxUbXA+IG1fdXNlQ291bnRzOworICAgIFVzZUNvdW50czxUbXA+JiBtX3VzZUNvdW50czsKICAg
ICB1bnNpZ25lZCBtX251bUl0ZXJhdGlvbnMgeyAwIH07CiB9OwogCiB9IC8vIGFub255bW91cyBu
YW1lc3BhY2UKIAotdm9pZCBpdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZyhDb2RlJiBjb2RlKQor
dm9pZCBhbGxvY2F0ZVJlZ2lzdGVycyhDb2RlJiBjb2RlKQogewotICAgIFBoYXNlU2NvcGUgcGhh
c2VTY29wZShjb2RlLCAiaXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmciKTsKLSAgICAKLSAgICBJ
dGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZyBpdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZyhjb2Rl
KTsKLSAgICBpdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5ydW4oKTsKKyAgICBQaGFzZVNjb3Bl
IHBoYXNlU2NvcGUoY29kZSwgIkFpcjo6YWxsb2NhdGVSZWdpc3RlcnMiKTsKKworICAgIFVzZUNv
dW50czxUbXA+IHVzZUNvdW50cyhjb2RlKTsKKyAgICBSZWdpc3RlckFsbG9jYXRpb24gcmVnaXN0
ZXJBbGxvY2F0aW9uKGNvZGUsIHVzZUNvdW50cyk7CisgICAgcmVnaXN0ZXJBbGxvY2F0aW9uLnJ1
bigpOwogfQogCiB9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpckl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJJdGVyYXRlZFJlZ2lz
dGVyQ29hbGVzY2luZy5oCShyZXZpc2lvbiAyMTIxMjUpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvYWlyL0Fpckl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nLmgJKHdvcmtpbmcgY29weSkK
QEAgLTMxLDkgKzMxLDE2IEBAIG5hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3Bh
Y2UKIAogY2xhc3MgQ29kZTsKIAotLy8gVGhpcyBpcyBhIHJlZ2lzdGVyIGFsbG9jYXRpb24gcGhh
c2UgYmFzZWQgb24gQW5kcmV3IEFwcGVsJ3MgSXRlcmF0ZWQgUmVnaXN0ZXIgQ29hbGVzY2luZwor
Ly8gV2UgaGF2ZSB0d28gcmVnaXN0ZXIgYWxsb2NhdG9ycywgYm90aCBmdW5kYW1lbnRhbGx5IGRl
cml2ZWQgZnJvbSBDaGFpdGluJ3MgWW9ya3Rvd24KKy8vIGFsbG9jYXRvcjoKKy8vIGh0dHA6Ly9j
cy5nbXUuZWR1L353aGl0ZS9DUzY0MC9wOTgtY2hhaXRpbi5wZGYKKy8vCisvLyBXZSBoYXZlIGFu
IGltcGxlbWVudGF0aW9uIG9mIEJyaWdncydzIG9wdGltaXN0aWMgYWxsb2NhdG9yIHdoaWNoIGlz
IGRlcml2YXRpdmUgb2YgQ2hhaXRpbidzIGFsbG9jYXRvcjoKKy8vIGh0dHA6Ly93d3cuY3MudXRl
eGFzLmVkdS91c2Vycy9tY2tpbmxleS8zODBDL2xlY3MvYnJpZ2dzLXRoZXNpcy0xOTkyLnBkZgor
Ly8KKy8vIEFuZCBhbiBpbXBsZW1lbnRhdGlvbiBvZiBBbmRyZXcgQXBwZWwncyBJdGVyYXRlZCBS
ZWdpc3RlciBDb2FsZXNjaW5nIHdoaWNoIGlzIGRlcml2YXRpdmUgb2YgQnJpZ2dzJ3MgYWxsb2Nh
dG9yLgogLy8gaHR0cDovL3d3dy5jcy5jbXUuZWR1L2Fmcy9jcy9hY2FkZW1pYy9jbGFzcy8xNTc0
NS1zMDcvd3d3L3BhcGVycy9nZW9yZ2UucGRmCi12b2lkIGl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNj
aW5nKENvZGUmKTsKK3ZvaWQgYWxsb2NhdGVSZWdpc3RlcnMoQ29kZSYpOwogCiB9IH0gfSAvLyBu
YW1lc3BhY2UgSlNDOjpCMzo6QWlyCiAK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>302167</attachid>
            <date>2017-02-20 12:53:28 -0800</date>
            <delta_ts>2017-02-20 12:57:10 -0800</delta_ts>
            <desc>patch</desc>
            <filename>b-backup.diff</filename>
            <type>text/plain</type>
            <size>223585</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMjEyNjY2KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDQyIEBA
CisyMDE3LTAyLTIwICBTYWFtIEJhcmF0aSAgPHNiYXJhdGlAYXBwbGUuY29tPgorCisgICAgICAg
IENvbnNpZGVyIG1vdmluZyBmcm9tIElSQyB0byB0aGUgQnJpZ2dzIG9wdGltaXN0aWMgYWxsb2Nh
dG9yIHdpdGggYmlhc2VkIGNvbG9yaW5nCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD0xNjg0NTQKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBUaGlzIHBhdGNoIGFkZHMgdGhlIEJyaWdncyBhbGxvY2F0b3IgdG8g
QWlyOgorICAgICAgICBodHRwOi8vd3d3LmNzLnV0ZXhhcy5lZHUvdXNlcnMvbWNraW5sZXkvMzgw
Qy9sZWNzL2JyaWdncy10aGVzaXMtMTk5Mi5wZGYKKyAgICAgICAgSXQgdXNlcyBpdCBieSBkZWZh
dWx0IG9uIEFSTTY0LiBJIHdhcyBtZWFzdXJpbmcgYW4gOC0xMCUgc3BlZWR1cAorICAgICAgICBp
biB0aGUgcGhhc2UgYmVjYXVzZSBvZiB0aGlzLiBJIGFsc28gd2Fzbid0IGFibGUgdG8gZGV0ZWN0
IGEgc2xvd2Rvd24gCisgICAgICAgIGZvciBnZW5lcmF0ZWQgY29kZSBvbiBBUk02NC4gVGhlcmUg
YXJlIHN0aWxsIGEgZmV3IHRoaW5ncyB3ZSBjYW4gZG8KKyAgICAgICAgdG8gc3BlZWQgdGhpbmdz
IHVwIGV2ZW4gZnVydGhlci4gTW92aW5nIHRoZSBpbnRlcmZlcmVuY2UgZ3JhcGggaW50bworICAg
ICAgICBhIEJpdFZlY3RvciB3YXMgYW5vdGhlciAxMC0yMCUgc3BlZWR1cC4gV2Ugc2hvdWxkIGNv
bnNpZGVyIGRvaW5nIHRoaXMKKyAgICAgICAgaW4gYSBmb2xsb3cgdXAgcGF0Y2guIFRoaXMgaXMg
ZXNwZWNpYWxseSBpbXBvcnRhbnQgbm93LCBzaW5jZSBtYWtpbmcKKyAgICAgICAgcmVnaXN0ZXIg
YWxsb2NhdGlvbiBmYXN0ZXIgaGFzIGEgZGlyZWN0IGltcGFjdCBvbiBzdGFydHVwIHRpbWUgZm9y
CisgICAgICAgIFdhc20gbW9kdWxlcy4KKyAgICAgICAgCisgICAgICAgIEkgYWJzdHJhY3RlZCBh
d2F5IHRoZSBjb21tb24gYml0cyBiZXR3ZWVuIEJyaWdncyBhbmQgSVJDLCBhbmQgbW92ZWQKKyAg
ICAgICAgdGhlbSBpbnRvIGEgY29tbW9uIHN1cGVyIGNsYXNzLiBJbiBhIGZvbGxvdyB1cCB0byB0
aGlzIHBhdGNoLCBJIHBsYW4KKyAgICAgICAgb24gaW1wbGVtZW50aW5nIGJpYXNlZCBjb2xvcmlu
ZyBmb3IgYm90aCBCcmlnZ3MgYW5kIElSQyAodGhpcyBpcworICAgICAgICBkZXNjcmliZWQgaW4g
QnJpZ2dzJ3MgdGhlc2lzKS4gSSB3YXMgYWJsZSB0byBkZXRlY3QgYSAxJSBzbG93ZG93bgorICAg
ICAgICB3aXRoIEJyaWdncyBvbiBPY3RhbmUgZm9yIHg4Ni02NC4gVGhpcyBpcyBiZWNhdXNlIHRo
ZSByZWdpc3RlciBmaWxlCisgICAgICAgIGZvciB4ODYtNjQgaXMgc21hbGxlciB0aGFuIEFSTTY0
LiBXaGVuIEkgaW1wbGVtZW50ZWQgYmlhc2VkIGNvbG9yaW5nLAorICAgICAgICBJIHdhcyBubyBs
b25nZXIgYWJsZSB0byBkZXRlY3QgdGhpcyBzbG93ZG93bi4gSSBzdGlsbCB0aGluayBpdCdzIGEK
KyAgICAgICAgc2Vuc2libGUgcGxhbiB0byBydW4gQnJpZ2dzIG9uIEFSTTY0IGFuZCBJUkMgb24g
eDg2LTY0LgorCisgICAgICAgICogQ01ha2VMaXN0cy50eHQ6CisgICAgICAgICogSmF2YVNjcmlw
dENvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvajoKKyAgICAgICAgKiBiMy9haXIvQWlyR2Vu
ZXJhdGUuY3BwOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpwcmVwYXJlRm9yR2VuZXJhdGlvbik6
CisgICAgICAgICogYjMvYWlyL0Fpckl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nLmNwcDogUmVt
b3ZlZC4KKyAgICAgICAgKiBiMy9haXIvQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuaDog
UmVtb3ZlZC4KKyAgICAgICAgKiBiMy9haXIvQWlyUmVnaXN0ZXJBbGxvY2F0b3IuY3BwOiBDb3Bp
ZWQgZnJvbSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpckl0ZXJhdGVkUmVnaXN0ZXJD
b2FsZXNjaW5nLmNwcC4KKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6YWxsb2NhdGVSZWdpc3RlcnMp
OgorICAgICAgICAoSlNDOjpCMzo6QWlyOjppdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZyk6IERl
bGV0ZWQuCisgICAgICAgICogYjMvYWlyL0FpclJlZ2lzdGVyQWxsb2NhdG9yLmg6IENvcGllZCBm
cm9tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxl
c2NpbmcuaC4KKyAgICAgICAgKiBydW50aW1lL09wdGlvbnMuaDoKKwogMjAxNy0wMi0yMCAgQ29t
bWl0IFF1ZXVlICA8Y29tbWl0LXF1ZXVlQHdlYmtpdC5vcmc+CiAKICAgICAgICAgVW5yZXZpZXdl
ZCwgcm9sbGluZyBvdXQgcjIxMjYxOC4KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DTWFr
ZUxpc3RzLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvQ01ha2VMaXN0
cy50eHQJKHJldmlzaW9uIDIxMjY2NikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DTWFrZUxp
c3RzLnR4dAkod29ya2luZyBjb3B5KQpAQCAtODksNyArODksNiBAQCBzZXQoSmF2YVNjcmlwdENv
cmVfU09VUkNFUwogICAgIGIzL2Fpci9BaXJIYW5kbGVDYWxsZWVTYXZlcy5jcHAKICAgICBiMy9h
aXIvQWlySW5zZXJ0aW9uU2V0LmNwcAogICAgIGIzL2Fpci9BaXJJbnN0LmNwcAotICAgIGIzL2Fp
ci9BaXJJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5jcHAKICAgICBiMy9haXIvQWlyS2luZC5j
cHAKICAgICBiMy9haXIvQWlyTG9nUmVnaXN0ZXJQcmVzc3VyZS5jcHAKICAgICBiMy9haXIvQWly
TG93ZXJBZnRlclJlZ0FsbG9jLmNwcApAQCAtOTgsNiArOTcsNyBAQCBzZXQoSmF2YVNjcmlwdENv
cmVfU09VUkNFUwogICAgIGIzL2Fpci9BaXJPcHRpbWl6ZUJsb2NrT3JkZXIuY3BwCiAgICAgYjMv
YWlyL0FpclBhZEludGVyZmVyZW5jZS5jcHAKICAgICBiMy9haXIvQWlyUGhhc2VTY29wZS5jcHAK
KyAgICBiMy9haXIvQWlyUmVnaXN0ZXJBbGxvY2F0b3IuY3BwCiAgICAgYjMvYWlyL0FpclJlcG9y
dFVzZWRSZWdpc3RlcnMuY3BwCiAgICAgYjMvYWlyL0FpclNpbXBsaWZ5Q0ZHLmNwcAogICAgIGIz
L2Fpci9BaXJTcGVjaWFsLmNwcApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL0phdmFTY3Jp
cHRDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHJl
dmlzaW9uIDIxMjY2NikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS54
Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCSh3b3JraW5nIGNvcHkpCkBAIC0xMjMyLDggKzEyMzIs
NiBAQAogCQkyNjAwQjVBNzE1MkJBQUE3MDA5MUVFNUYgLyogSlNTdHJpbmdKb2luZXIuaCBpbiBI
ZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDI2MDBCNUE1MTUyQkFB
QTcwMDkxRUU1RiAvKiBKU1N0cmluZ0pvaW5lci5oICovOyB9OwogCQkyNjJEODVCNjFDMEQ2NTBG
MDA2QUNCNjEgLyogQWlyRml4UGFydGlhbFJlZ2lzdGVyU3RhbGxzLmNwcCBpbiBTb3VyY2VzICov
ID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDI2MkQ4NUI0MUMwRDY1MEYwMDZBQ0I2
MSAvKiBBaXJGaXhQYXJ0aWFsUmVnaXN0ZXJTdGFsbHMuY3BwICovOyB9OwogCQkyNjJEODVCNzFD
MEQ2NTBGMDA2QUNCNjEgLyogQWlyRml4UGFydGlhbFJlZ2lzdGVyU3RhbGxzLmggaW4gSGVhZGVy
cyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyNjJEODVCNTFDMEQ2NTBGMDA2
QUNCNjEgLyogQWlyRml4UGFydGlhbFJlZ2lzdGVyU3RhbGxzLmggKi87IH07Ci0JCTI2NzE4QkE0
MUJFOTlGNzgwMDUyMDE3QiAvKiBBaXJJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5jcHAgaW4g
U291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyNjcxOEJBMjFCRTk5
Rjc4MDA1MjAxN0IgLyogQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuY3BwICovOyB9Owot
CQkyNjcxOEJBNTFCRTk5Rjc4MDA1MjAxN0IgLyogQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2Np
bmcuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDI2NzE4
QkEzMUJFOTlGNzgwMDUyMDE3QiAvKiBBaXJJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5oICov
OyB9OwogCQkyNjg0RDQzODFDMDAxNjFDMDA4MUQ2NjMgLyogQWlyTGl2ZW5lc3MuaCBpbiBIZWFk
ZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDI2ODRENDM3MUMwMDE2MUMw
MDgxRDY2MyAvKiBBaXJMaXZlbmVzcy5oICovOyB9OwogCQkyNjlENjM2RTFCRkJFNUQxMDAxMDFC
MUQgLyogRlRMT3V0cHV0LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSAyNjlENjM2RDFCRkJFNUQwMDAxMDFCMUQgLyogRlRMT3V0cHV0LmggKi87IH07CiAJ
CTJBMDVBQkQ1MTk2MURGMjQwMDM0MTc1MCAvKiBKU1Byb3BlcnR5TmFtZUVudW1lcmF0b3IuY3Bw
IGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMkEwNUFCRDMx
OTYxREYyNDAwMzQxNzUwIC8qIEpTUHJvcGVydHlOYW1lRW51bWVyYXRvci5jcHAgKi87IH07CkBA
IC0xNDU4LDYgKzE0NTYsOCBAQAogCQk3OUEwOTA4MDFENzY4NDY1MDA4Qjg4OUIgLyogSGFzaE1h
cEltcGwuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDc5
QTA5MDdFMUQ3Njg0NjUwMDhCODg5QiAvKiBIYXNoTWFwSW1wbC5oICovOyBzZXR0aW5ncyA9IHtB
VFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCTc5QTIyODM1MUQzNUQ3MUUwMEQ4RTA2
NyAvKiBBcml0aFByb2ZpbGUuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gNzlBMjI4MzMxRDM1RDcxRTAwRDhFMDY3IC8qIEFyaXRoUHJvZmlsZS5jcHAg
Ki87IH07CiAJCTc5QTIyODM2MUQzNUQ3MUYwMEQ4RTA2NyAvKiBBcml0aFByb2ZpbGUuaCBpbiBI
ZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDc5QTIyODM0MUQzNUQ3
MUUwMEQ4RTA2NyAvKiBBcml0aFByb2ZpbGUuaCAqLzsgfTsKKwkJNzlBNjdEQTgxRTVCOEIxODAw
REU0MDJBIC8qIEFpclJlZ2lzdGVyQWxsb2NhdG9yLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDc5QTY3REE2MUU1QjhCMTgwMERFNDAyQSAvKiBBaXJS
ZWdpc3RlckFsbG9jYXRvci5jcHAgKi87IH07CisJCTc5QTY3REE5MUU1QjhCMTgwMERFNDAyQSAv
KiBBaXJSZWdpc3RlckFsbG9jYXRvci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gNzlBNjdEQTcxRTVCOEIxODAwREU0MDJBIC8qIEFpclJlZ2lzdGVyQWxs
b2NhdG9yLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsK
IAkJNzlBRjBCRTQxRDNFRkQ0QzAwRTk1RkE1IC8qIEpJVE1hdGhJQ0lubGluZVJlc3VsdC5oIGlu
IEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNzlBRjBCRTMxRDNF
RkQ0QzAwRTk1RkE1IC8qIEpJVE1hdGhJQ0lubGluZVJlc3VsdC5oICovOyBzZXR0aW5ncyA9IHtB
VFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCTc5QjAwQ0JDMUM2QUIwN0UwMDg4QzY1
RCAvKiBQcm94eUNvbnN0cnVjdG9yLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IDc5QjAwQ0I4MUM2QUIwN0UwMDg4QzY1RCAvKiBQcm94eUNvbnN0cnVj
dG9yLmNwcCAqLzsgfTsKIAkJNzlCMDBDQkQxQzZBQjA3RTAwODhDNjVEIC8qIFByb3h5Q29uc3Ry
dWN0b3IuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDc5
QjAwQ0I5MUM2QUIwN0UwMDg4QzY1RCAvKiBQcm94eUNvbnN0cnVjdG9yLmggKi87IHNldHRpbmdz
ID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKQEAgLTM2NzEsOCArMzY3MSw2IEBA
CiAJCTI2MkQ4NUI0MUMwRDY1MEYwMDZBQ0I2MSAvKiBBaXJGaXhQYXJ0aWFsUmVnaXN0ZXJTdGFs
bHMuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBuYW1lID0gQWlyRml4UGFydGlh
bFJlZ2lzdGVyU3RhbGxzLmNwcDsgcGF0aCA9IGIzL2Fpci9BaXJGaXhQYXJ0aWFsUmVnaXN0ZXJT
dGFsbHMuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkyNjJEODVCNTFDMEQ2NTBG
MDA2QUNCNjEgLyogQWlyRml4UGFydGlhbFJlZ2lzdGVyU3RhbGxzLmggKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmMuaDsgbmFtZSA9IEFpckZpeFBhcnRpYWxSZWdpc3RlclN0YWxscy5oOyBwYXRoID0g
YjMvYWlyL0FpckZpeFBhcnRpYWxSZWdpc3RlclN0YWxscy5oOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB9OwogCQkyNjQwOTFGQTFCRTJGRDQxMDA2ODREQjIgLyogQWlyT3Bjb2RlLm9wY29kZXMg
Ki8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBu
YW1lID0gQWlyT3Bjb2RlLm9wY29kZXM7IHBhdGggPSBiMy9haXIvQWlyT3Bjb2RlLm9wY29kZXM7
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07Ci0JCTI2NzE4QkEyMUJFOTlGNzgwMDUyMDE3QiAv
KiBBaXJJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmNwcC5jcHA7IG5hbWUgPSBBaXJJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5jcHA7IHBhdGgg
PSBiMy9haXIvQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuY3BwOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OwotCQkyNjcxOEJBMzFCRTk5Rjc4MDA1MjAxN0IgLyogQWlySXRlcmF0ZWRS
ZWdpc3RlckNvYWxlc2NpbmcuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5j
b2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQWly
SXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuaDsgcGF0aCA9IGIzL2Fpci9BaXJJdGVyYXRlZFJl
Z2lzdGVyQ29hbGVzY2luZy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkyNjg0RDQz
NzFDMDAxNjFDMDA4MUQ2NjMgLyogQWlyTGl2ZW5lc3MuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUu
Yy5oOyBuYW1lID0gQWlyTGl2ZW5lc3MuaDsgcGF0aCA9IGIzL2Fpci9BaXJMaXZlbmVzcy5oOyBz
b3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkyNjlENjM2RDFCRkJFNUQwMDAxMDFCMUQgLyog
RlRMT3V0cHV0LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0g
NDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEZUTE91dHB1dC5o
OyBwYXRoID0gZnRsL0ZUTE91dHB1dC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQky
QTA1QUJEMzE5NjFERjI0MDAzNDE3NTAgLyogSlNQcm9wZXJ0eU5hbWVFbnVtZXJhdG9yLmNwcCAq
LyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25G
aWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEpTUHJvcGVydHlOYW1lRW51bWVy
YXRvci5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBAIC0zOTQ0LDYgKzM5NDIsOCBA
QAogCQk3OUEwOTA3RTFENzY4NDY1MDA4Qjg4OUIgLyogSGFzaE1hcEltcGwuaCAqLyA9IHtpc2Eg
PSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9
IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gSGFzaE1hcEltcGwuaDsgc291cmNlVHJlZSA9ICI8Z3Jv
dXA+IjsgfTsKIAkJNzlBMjI4MzMxRDM1RDcxRTAwRDhFMDY3IC8qIEFyaXRoUHJvZmlsZS5jcHAg
Ki8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBBcml0aFByb2ZpbGUuY3BwOyBz
b3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk3OUEyMjgzNDFEMzVENzFFMDBEOEUwNjcgLyog
QXJpdGhQcm9maWxlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5n
ID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEFyaXRoUHJv
ZmlsZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk3OUE2N0RBNjFFNUI4QjE4MDBE
RTQwMkEgLyogQWlyUmVnaXN0ZXJBbGxvY2F0b3IuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
cHAuY3BwOyBuYW1lID0gQWlyUmVnaXN0ZXJBbGxvY2F0b3IuY3BwOyBwYXRoID0gYjMvYWlyL0Fp
clJlZ2lzdGVyQWxsb2NhdG9yLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNzlB
NjdEQTcxRTVCOEIxODAwREU0MDJBIC8qIEFpclJlZ2lzdGVyQWxsb2NhdG9yLmggKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUg
PSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEFpclJlZ2lzdGVyQWxsb2NhdG9yLmg7IHBhdGggPSBi
My9haXIvQWlyUmVnaXN0ZXJBbGxvY2F0b3IuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsK
IAkJNzlBODk5RkUxRDM4NjEyRTAwRDE4QzczIC8qIEpJVE1hdGhJQ0ZvcndhcmRzLmggKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5
cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEpJVE1hdGhJQ0ZvcndhcmRzLmg7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CiAJCTc5QUYwQkUzMUQzRUZENEMwMEU5NUZBNSAvKiBKSVRNYXRo
SUNJbmxpbmVSZXN1bHQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rp
bmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gSklUTWF0
aElDSW5saW5lUmVzdWx0Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTc5QjAwQ0I4
MUM2QUIwN0UwMDg4QzY1RCAvKiBQcm94eUNvbnN0cnVjdG9yLmNwcCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFByb3h5Q29uc3RydWN0b3IuY3BwOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OwpAQCAtNTQ2Niw4ICs1NDY2LDYgQEAKIAkJCQkwRkVDODU1QTFCREFDREM3
MDA4MEZGNzQgLyogQWlySW5zdC5jcHAgKi8sCiAJCQkJMEZFQzg1NUIxQkRBQ0RDNzAwODBGRjc0
IC8qIEFpckluc3QuaCAqLywKIAkJCQkwRkVDODU1QzFCREFDREM3MDA4MEZGNzQgLyogQWlySW5z
dElubGluZXMuaCAqLywKLQkJCQkyNjcxOEJBMjFCRTk5Rjc4MDA1MjAxN0IgLyogQWlySXRlcmF0
ZWRSZWdpc3RlckNvYWxlc2NpbmcuY3BwICovLAotCQkJCTI2NzE4QkEzMUJFOTlGNzgwMDUyMDE3
QiAvKiBBaXJJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5oICovLAogCQkJCTBGREY2N0Q0MUQ5
REM0M0UwMDFCOTgyNSAvKiBBaXJLaW5kLmNwcCAqLywKIAkJCQkwRkRGNjdENTFEOURDNDNFMDAx
Qjk4MjUgLyogQWlyS2luZC5oICovLAogCQkJCTI2ODRENDM3MUMwMDE2MUMwMDgxRDY2MyAvKiBB
aXJMaXZlbmVzcy5oICovLApAQCAtNTQ4Niw2ICs1NDg0LDggQEAKIAkJCQkwRjlDQUJDNzFEQjU0
QTc2MDAwOEU4M0IgLyogQWlyUGFkSW50ZXJmZXJlbmNlLmggKi8sCiAJCQkJMEZFQzg1NUUxQkRB
Q0RDNzAwODBGRjc0IC8qIEFpclBoYXNlU2NvcGUuY3BwICovLAogCQkJCTBGRUM4NTVGMUJEQUNE
QzcwMDgwRkY3NCAvKiBBaXJQaGFzZVNjb3BlLmggKi8sCisJCQkJNzlBNjdEQTYxRTVCOEIxODAw
REU0MDJBIC8qIEFpclJlZ2lzdGVyQWxsb2NhdG9yLmNwcCAqLywKKwkJCQk3OUE2N0RBNzFFNUI4
QjE4MDBERTQwMkEgLyogQWlyUmVnaXN0ZXJBbGxvY2F0b3IuaCAqLywKIAkJCQkwRjQ1NzAzQTFC
RTQ1RjBBMDA2MkE2MjkgLyogQWlyUmVwb3J0VXNlZFJlZ2lzdGVycy5jcHAgKi8sCiAJCQkJMEY0
NTcwM0IxQkU0NUYwQTAwNjJBNjI5IC8qIEFpclJlcG9ydFVzZWRSZWdpc3RlcnMuaCAqLywKIAkJ
CQkwRjMzOERGQjFCRUQ1MTI3MDAxM0M4OEYgLyogQWlyU2ltcGxpZnlDRkcuY3BwICovLApAQCAt
NzkxMiw3ICs3OTEyLDYgQEAKIAkJCQkwRkVDODU3RTFCREFDREM3MDA4MEZGNzQgLyogQWlySW5z
ZXJ0aW9uU2V0LmggaW4gSGVhZGVycyAqLywKIAkJCQkwRkVDODU4MDFCREFDREM3MDA4MEZGNzQg
LyogQWlySW5zdC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJMEZFQzg1ODExQkRBQ0RDNzAwODBGRjc0
IC8qIEFpckluc3RJbmxpbmVzLmggaW4gSGVhZGVycyAqLywKLQkJCQkyNjcxOEJBNTFCRTk5Rjc4
MDA1MjAxN0IgLyogQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuaCBpbiBIZWFkZXJzICov
LAogCQkJCTBGREY2N0Q3MUQ5REM0NDIwMDFCOTgyNSAvKiBBaXJLaW5kLmggaW4gSGVhZGVycyAq
LywKIAkJCQkyNjg0RDQzODFDMDAxNjFDMDA4MUQ2NjMgLyogQWlyTGl2ZW5lc3MuaCBpbiBIZWFk
ZXJzICovLAogCQkJCTBGRTM0QzFBMUM0QjM5QUUwMDAzQTUxMiAvKiBBaXJMb2dSZWdpc3RlclBy
ZXNzdXJlLmggaW4gSGVhZGVycyAqLywKQEAgLTkxNTMsNiArOTE1Miw3IEBACiAJCQkJMTRBRDkx
MjQxRENBOUZBNDAwMTRGOUZFIC8qIFVubGlua2VkRXZhbENvZGVCbG9jay5oIGluIEhlYWRlcnMg
Ki8sCiAJCQkJMTRBRDkxMjMxRENBOUZBNDAwMTRGOUZFIC8qIFVubGlua2VkRnVuY3Rpb25Db2Rl
QmxvY2suaCBpbiBIZWFkZXJzICovLAogCQkJCTE0QUQ5MTI3MURDQTlGQTQwMDE0RjlGRSAvKiBV
bmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZS5oIGluIEhlYWRlcnMgKi8sCisJCQkJNzlBNjdEQTkx
RTVCOEIxODAwREU0MDJBIC8qIEFpclJlZ2lzdGVyQWxsb2NhdG9yLmggaW4gSGVhZGVycyAqLywK
IAkJCQkxNDE0MkU1MTFCNzk2RUNFMDBGNEJGNEIgLyogVW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFi
bGUuaCBpbiBIZWFkZXJzICovLAogCQkJCTE0QUQ5MTIyMURDQTlGQTQwMDE0RjlGRSAvKiBVbmxp
bmtlZEdsb2JhbENvZGVCbG9jay5oIGluIEhlYWRlcnMgKi8sCiAJCQkJMTRBRDkxMjUxRENBOUZB
NDAwMTRGOUZFIC8qIFVubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGVCbG9jay5oIGluIEhlYWRlcnMg
Ki8sCkBAIC05NzYxLDcgKzk3NjEsNiBAQAogCQkJCTBGRUM4NTdCMUJEQUNEQzcwMDgwRkY3NCAv
KiBBaXJIYW5kbGVDYWxsZWVTYXZlcy5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkwRkVDODU3RDFC
REFDREM3MDA4MEZGNzQgLyogQWlySW5zZXJ0aW9uU2V0LmNwcCBpbiBTb3VyY2VzICovLAogCQkJ
CTBGRUM4NTdGMUJEQUNEQzcwMDgwRkY3NCAvKiBBaXJJbnN0LmNwcCBpbiBTb3VyY2VzICovLAot
CQkJCTI2NzE4QkE0MUJFOTlGNzgwMDUyMDE3QiAvKiBBaXJJdGVyYXRlZFJlZ2lzdGVyQ29hbGVz
Y2luZy5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkwRkRGNjdENjFEOURDNDQwMDAxQjk4MjUgLyog
QWlyS2luZC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkwRkUzNEMxOTFDNEIzOUFFMDAwM0E1MTIg
LyogQWlyTG9nUmVnaXN0ZXJQcmVzc3VyZS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkwRjYxODMy
RTFDNDVCRjA3MDA3MjQ1MEIgLyogQWlyTG93ZXJBZnRlclJlZ0FsbG9jLmNwcCBpbiBTb3VyY2Vz
ICovLApAQCAtMTAwNTcsNiArMTAwNTYsNyBAQAogCQkJCTg2ODgwRjFGMTQzMjhCQjkwMEIwOEQ0
MiAvKiBERkdTcGVjdWxhdGl2ZUpJVDMyXzY0LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTg2ODgw
RjREMTQzNTNCMjEwMEIwOEQ0MiAvKiBERkdTcGVjdWxhdGl2ZUpJVDY0LmNwcCBpbiBTb3VyY2Vz
ICovLAogCQkJCTBGNjgyRkIyMTlCQ0IzNjQwMEZBM0JBRCAvKiBERkdTU0FDYWxjdWxhdG9yLmNw
cCBpbiBTb3VyY2VzICovLAorCQkJCTc5QTY3REE4MUU1QjhCMTgwMERFNDAyQSAvKiBBaXJSZWdp
c3RlckFsbG9jYXRvci5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlBN0Q4OUNGRjE3QTBCOENDMDA3
NzNBRDggLyogREZHU1NBQ29udmVyc2lvblBoYXNlLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTBG
QzIwQ0I5MTg1NTZBMzUwMEM5RTk1NCAvKiBERkdTU0FMb3dlcmluZ1BoYXNlLmNwcCBpbiBTb3Vy
Y2VzICovLAogCQkJCTBGOUZCNEY0MTdGQ0I5MTcwMENCNjdGOCAvKiBERkdTdGFja0xheW91dFBo
YXNlLmNwcCBpbiBTb3VyY2VzICovLApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fp
ci9BaXJHZW5lcmF0ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L2Fpci9BaXJHZW5lcmF0ZS5jcHAJKHJldmlzaW9uIDIxMjY2NikKKysrIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9haXIvQWlyR2VuZXJhdGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNiw3ICsz
Niw3IEBACiAjaW5jbHVkZSAiQWlyRml4UGFydGlhbFJlZ2lzdGVyU3RhbGxzLmgiCiAjaW5jbHVk
ZSAiQWlyR2VuZXJhdGlvbkNvbnRleHQuaCIKICNpbmNsdWRlICJBaXJIYW5kbGVDYWxsZWVTYXZl
cy5oIgotI2luY2x1ZGUgIkFpckl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nLmgiCisjaW5jbHVk
ZSAiQWlyUmVnaXN0ZXJBbGxvY2F0b3IuaCIKICNpbmNsdWRlICJBaXJMb2dSZWdpc3RlclByZXNz
dXJlLmgiCiAjaW5jbHVkZSAiQWlyTG93ZXJBZnRlclJlZ0FsbG9jLmgiCiAjaW5jbHVkZSAiQWly
TG93ZXJFbnRyeVN3aXRjaC5oIgpAQCAtODksNyArODksNyBAQCB2b2lkIHByZXBhcmVGb3JHZW5l
cmF0aW9uKENvZGUmIGNvZGUpCiAgICAgaWYgKE9wdGlvbnM6OmFpclNwaWxsc0V2ZXJ5dGhpbmco
KSkKICAgICAgICAgc3BpbGxFdmVyeXRoaW5nKGNvZGUpOwogICAgIGVsc2UKLSAgICAgICAgaXRl
cmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcoY29kZSk7CisgICAgICAgIGFsbG9jYXRlUmVnaXN0ZXJz
KGNvZGUpOwogCiAgICAgaWYgKE9wdGlvbnM6OmxvZ0FpclJlZ2lzdGVyUHJlc3N1cmUoKSkgewog
ICAgICAgICBkYXRhTG9nKCJSZWdpc3RlciBwcmVzc3VyZSBhZnRlciByZWdpc3RlciBhbGxvY2F0
aW9uOlxuIik7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpckl0ZXJhdGVk
UmVnaXN0ZXJDb2FsZXNjaW5nLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvYWlyL0Fpckl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nLmNwcAkocmV2aXNpb24gMjEy
NjY2KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJJdGVyYXRlZFJlZ2lzdGVy
Q29hbGVzY2luZy5jcHAJKG5vbmV4aXN0ZW50KQpAQCAtMSwxNjU2ICswLDAgQEAKLS8qCi0gKiBD
b3B5cmlnaHQgKEMpIDIwMTUtMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0g
KgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAot
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgotICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCi0gKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLSAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLSAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJjb25m
aWcuaCIKLSNpbmNsdWRlICJBaXJJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5oIgotCi0jaWYg
RU5BQkxFKEIzX0pJVCkKLQotI2luY2x1ZGUgIkFpckNvZGUuaCIKLSNpbmNsdWRlICJBaXJJbnNl
cnRpb25TZXQuaCIKLSNpbmNsdWRlICJBaXJJbnN0SW5saW5lcy5oIgotI2luY2x1ZGUgIkFpckxp
dmVuZXNzLmgiCi0jaW5jbHVkZSAiQWlyUGFkSW50ZXJmZXJlbmNlLmgiCi0jaW5jbHVkZSAiQWly
UGhhc2VTY29wZS5oIgotI2luY2x1ZGUgIkFpclRtcElubGluZXMuaCIKLSNpbmNsdWRlICJBaXJU
bXBXaWR0aC5oIgotI2luY2x1ZGUgIkFpclVzZUNvdW50cy5oIgotI2luY2x1ZGUgPHd0Zi9MaXN0
RHVtcC5oPgotCi1uYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7
Ci0KLW5hbWVzcGFjZSB7Ci0KLWJvb2wgZGVidWcgPSBmYWxzZTsKLWJvb2wgdHJhY2VEZWJ1ZyA9
IGZhbHNlOwotYm9vbCByZXBvcnRTdGF0cyA9IGZhbHNlOwotCi0vLyBUaGUgQWJzdHJhY3RDb2xv
cmluZ0FsbG9jYXRvciBkZWZpbmVzIGFsbCB0aGUgY29kZSB0aGF0IGlzIGluZGVwZW5kYW50Ci0v
LyBmcm9tIHRoZSB0eXBlIG9yIHJlZ2lzdGVyIGFuZCBjYW4gYmUgc2hhcmVkIHdoZW4gYWxsb2Nh
dGluZyByZWdpc3RlcnMuCi10ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleFR5cGU+Ci1jbGFzcyBBYnN0
cmFjdENvbG9yaW5nQWxsb2NhdG9yIHsKLXB1YmxpYzoKLSAgICBBYnN0cmFjdENvbG9yaW5nQWxs
b2NhdG9yKGNvbnN0IFZlY3RvcjxSZWc+JiByZWdzSW5Qcmlvcml0eU9yZGVyLCBJbmRleFR5cGUg
bGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4LCB1bnNpZ25lZCB0bXBBcnJheVNpemUsIGNvbnN0
IEhhc2hTZXQ8dW5zaWduZWQ+JiB1bnNwaWxsYWJsZVRtcCkKLSAgICAgICAgOiBtX3JlZ3NJblBy
aW9yaXR5T3JkZXIocmVnc0luUHJpb3JpdHlPcmRlcikKLSAgICAgICAgLCBtX2xhc3RQcmVjb2xv
cmVkUmVnaXN0ZXJJbmRleChsYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXgpCi0gICAgICAgICwg
bV91bnNwaWxsYWJsZVRtcHModW5zcGlsbGFibGVUbXApCi0gICAgewotICAgICAgICBmb3IgKFJl
ZyByZWcgOiBtX3JlZ3NJblByaW9yaXR5T3JkZXIpCi0gICAgICAgICAgICBtX211dGFibGVSZWdz
LnNldChyZWcpOwotICAgICAgICAKLSAgICAgICAgaW5pdGlhbGl6ZURlZ3JlZXModG1wQXJyYXlT
aXplKTsKLSAgICAgICAgCi0gICAgICAgIG1fYWRqYWNlbmN5TGlzdC5yZXNpemUodG1wQXJyYXlT
aXplKTsKLSAgICAgICAgbV9tb3ZlTGlzdC5yZXNpemUodG1wQXJyYXlTaXplKTsKLSAgICAgICAg
bV9jb2FsZXNjZWRUbXBzLmZpbGwoMCwgdG1wQXJyYXlTaXplKTsKLSAgICAgICAgbV9pc09uU2Vs
ZWN0U3RhY2suZW5zdXJlU2l6ZSh0bXBBcnJheVNpemUpOwotICAgIH0KLQotcHJvdGVjdGVkOgot
ICAgIEluZGV4VHlwZSBnZXRBbGlhcyhJbmRleFR5cGUgdG1wSW5kZXgpIGNvbnN0Ci0gICAgewot
ICAgICAgICBJbmRleFR5cGUgYWxpYXMgPSB0bXBJbmRleDsKLSAgICAgICAgd2hpbGUgKEluZGV4
VHlwZSBuZXh0QWxpYXMgPSBtX2NvYWxlc2NlZFRtcHNbYWxpYXNdKQotICAgICAgICAgICAgYWxp
YXMgPSBuZXh0QWxpYXM7Ci0gICAgICAgIHJldHVybiBhbGlhczsKLSAgICB9Ci0KLSAgICB2b2lk
IGFkZEVkZ2UoSW5kZXhUeXBlIGEsIEluZGV4VHlwZSBiKQotICAgIHsKLSAgICAgICAgaWYgKGEg
PT0gYikKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgYWRkRWRnZURpc3RpbmN0KGEsIGIp
OwotICAgIH0KLQotICAgIHZvaWQgbWFrZVdvcmtMaXN0KCkKLSAgICB7Ci0gICAgICAgIEluZGV4
VHlwZSBmaXJzdE5vblJlZ0luZGV4ID0gbV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXggKyAx
OwotICAgICAgICBmb3IgKEluZGV4VHlwZSBpID0gZmlyc3ROb25SZWdJbmRleDsgaSA8IG1fZGVn
cmVlcy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgdW5zaWduZWQgZGVncmVlID0gbV9kZWdy
ZWVzW2ldOwotICAgICAgICAgICAgaWYgKGRlZ3JlZSA+PSBtX3JlZ3NJblByaW9yaXR5T3JkZXIu
c2l6ZSgpKQotICAgICAgICAgICAgICAgIGFkZFRvU3BpbGwoaSk7Ci0gICAgICAgICAgICBlbHNl
IGlmICghbV9tb3ZlTGlzdFtpXS5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgbV9mcmVlemVX
b3JrbGlzdC5hZGQoaSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbV9zaW1w
bGlmeVdvcmtsaXN0LmFwcGVuZChpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgYWRk
VG9TcGlsbCh1bnNpZ25lZCB0b1NwaWxsKQotICAgIHsKLSAgICAgICAgaWYgKG1fdW5zcGlsbGFi
bGVUbXBzLmNvbnRhaW5zKHRvU3BpbGwpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAg
IG1fc3BpbGxXb3JrbGlzdC5hZGQodG9TcGlsbCk7Ci0gICAgfQotCi0gICAgLy8gTG93LWRlZ3Jl
ZSB2ZXJ0ZXggY2FuIGFsd2F5cyBiZSBjb2xvcmVkOiBqdXN0IHBpY2sgYW55IG9mIHRoZSBjb2xv
ciB0YWtlbiBieSBhbnkKLSAgICAvLyBvdGhlciBhZGphY2VudCB2ZXJpY2VzLgotICAgIC8vIFRo
ZSAiU2ltcGxpZnkiIHBoYXNlIHRha2VzIGEgbG93LWRlZ3JlZSBvdXQgb2YgdGhlIGludGVyZmVy
ZW5jZSBncmFwaCB0byBzaW1wbGlmeSBpdC4KLSAgICB2b2lkIHNpbXBsaWZ5KCkKLSAgICB7Ci0g
ICAgICAgIEluZGV4VHlwZSBsYXN0SW5kZXggPSBtX3NpbXBsaWZ5V29ya2xpc3QudGFrZUxhc3Qo
KTsKLQotICAgICAgICBBU1NFUlQoIW1fc2VsZWN0U3RhY2suY29udGFpbnMobGFzdEluZGV4KSk7
Ci0gICAgICAgIEFTU0VSVCghbV9pc09uU2VsZWN0U3RhY2suZ2V0KGxhc3RJbmRleCkpOwotICAg
ICAgICBtX3NlbGVjdFN0YWNrLmFwcGVuZChsYXN0SW5kZXgpOwotICAgICAgICBtX2lzT25TZWxl
Y3RTdGFjay5xdWlja1NldChsYXN0SW5kZXgpOwotCi0gICAgICAgIGZvckVhY2hBZGphY2VudChs
YXN0SW5kZXgsIFt0aGlzXShJbmRleFR5cGUgYWRqYWNlbnRUbXBJbmRleCkgewotICAgICAgICAg
ICAgZGVjcmVtZW50RGVncmVlKGFkamFjZW50VG1wSW5kZXgpOwotICAgICAgICB9KTsKLSAgICB9
Ci0KLSAgICB2b2lkIGZyZWV6ZSgpCi0gICAgewotICAgICAgICBJbmRleFR5cGUgdmljdGltSW5k
ZXggPSBtX2ZyZWV6ZVdvcmtsaXN0LnRha2VBbnkoKTsKLSAgICAgICAgQVNTRVJUX1dJVEhfTUVT
U0FHRShnZXRBbGlhcyh2aWN0aW1JbmRleCkgPT0gdmljdGltSW5kZXgsICJjb2FsZXNjZSgpIHNo
b3VsZCBub3QgbGVhdmUgYWxpYXNlZCBUbXAgaW4gdGhlIHdvcmtsaXN0LiIpOwotICAgICAgICBt
X3NpbXBsaWZ5V29ya2xpc3QuYXBwZW5kKHZpY3RpbUluZGV4KTsKLSAgICAgICAgZnJlZXplTW92
ZXModmljdGltSW5kZXgpOwotICAgIH0KLQotICAgIHZvaWQgZnJlZXplTW92ZXMoSW5kZXhUeXBl
IHRtcEluZGV4KQotICAgIHsKLSAgICAgICAgZm9yRWFjaE5vZGVNb3Zlcyh0bXBJbmRleCwgW3Ro
aXMsIHRtcEluZGV4XSAoSW5kZXhUeXBlIG1vdmVJbmRleCkgewotICAgICAgICAgICAgaWYgKCFt
X2FjdGl2ZU1vdmVzLnF1aWNrQ2xlYXIobW92ZUluZGV4KSkKLSAgICAgICAgICAgICAgICBtX3dv
cmtsaXN0TW92ZXMudGFrZU1vdmUobW92ZUluZGV4KTsKLQotICAgICAgICAgICAgY29uc3QgTW92
ZU9wZXJhbmRzJiBtb3ZlT3BlcmFuZHMgPSBtX2NvYWxlc2NpbmdDYW5kaWRhdGVzW21vdmVJbmRl
eF07Ci0gICAgICAgICAgICBJbmRleFR5cGUgc3JjVG1wSW5kZXggPSBtb3ZlT3BlcmFuZHMuc3Jj
SW5kZXg7Ci0gICAgICAgICAgICBJbmRleFR5cGUgZHN0VG1wSW5kZXggPSBtb3ZlT3BlcmFuZHMu
ZHN0SW5kZXg7Ci0KLSAgICAgICAgICAgIEluZGV4VHlwZSBvcmlnaW5hbE90aGVyVG1wID0gc3Jj
VG1wSW5kZXggIT0gdG1wSW5kZXggPyBzcmNUbXBJbmRleCA6IGRzdFRtcEluZGV4OwotICAgICAg
ICAgICAgSW5kZXhUeXBlIG90aGVyVG1wSW5kZXggPSBnZXRBbGlhcyhvcmlnaW5hbE90aGVyVG1w
KTsKLSAgICAgICAgICAgIGlmIChtX2RlZ3JlZXNbb3RoZXJUbXBJbmRleF0gPCBtX3JlZ3NJblBy
aW9yaXR5T3JkZXIuc2l6ZSgpICYmICFpc01vdmVSZWxhdGVkKG90aGVyVG1wSW5kZXgpKSB7Ci0g
ICAgICAgICAgICAgICAgaWYgKG1fZnJlZXplV29ya2xpc3QucmVtb3ZlKG90aGVyVG1wSW5kZXgp
KQotICAgICAgICAgICAgICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuYXBwZW5kKG90aGVyVG1w
SW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIGNv
YWxlc2NlKCkKLSAgICB7Ci0gICAgICAgIHVuc2lnbmVkIG1vdmVJbmRleCA9IG1fd29ya2xpc3RN
b3Zlcy50YWtlTGFzdE1vdmUoKTsKLSAgICAgICAgY29uc3QgTW92ZU9wZXJhbmRzJiBtb3ZlT3Bl
cmFuZHMgPSBtX2NvYWxlc2NpbmdDYW5kaWRhdGVzW21vdmVJbmRleF07Ci0gICAgICAgIEluZGV4
VHlwZSB1ID0gZ2V0QWxpYXMobW92ZU9wZXJhbmRzLnNyY0luZGV4KTsKLSAgICAgICAgSW5kZXhU
eXBlIHYgPSBnZXRBbGlhcyhtb3ZlT3BlcmFuZHMuZHN0SW5kZXgpOwotCi0gICAgICAgIGlmIChp
c1ByZWNvbG9yZWQodikpCi0gICAgICAgICAgICBzdGQ6OnN3YXAodSwgdik7Ci0KLSAgICAgICAg
aWYgKHRyYWNlRGVidWcpCi0gICAgICAgICAgICBkYXRhTG9nKCJDb2FsZXNjaW5nIG1vdmUgYXQg
aW5kZXggIiwgbW92ZUluZGV4LCAiIHUgPSAiLCB1LCAiIHYgPSAiLCB2LCAiXG4iKTsKLQotICAg
ICAgICBpZiAodSA9PSB2KSB7Ci0gICAgICAgICAgICBhZGRXb3JrTGlzdCh1KTsKLQotICAgICAg
ICAgICAgaWYgKHRyYWNlRGVidWcpCi0gICAgICAgICAgICAgICAgZGF0YUxvZygiICAgIENvYWxl
c2NlZFxuIik7Ci0gICAgICAgIH0gZWxzZSBpZiAoaXNQcmVjb2xvcmVkKHYpCi0gICAgICAgICAg
ICB8fCBtX2ludGVyZmVyZW5jZUVkZ2VzLmNvbnRhaW5zKEludGVyZmVyZW5jZUVkZ2UodSwgdikp
Ci0gICAgICAgICAgICB8fCAodSA9PSBtX2ZyYW1lUG9pbnRlckluZGV4ICYmIG1faW50ZXJmZXJl
c1dpdGhGcmFtZVBvaW50ZXIucXVpY2tHZXQodikpKSB7Ci0gICAgICAgICAgICBhZGRXb3JrTGlz
dCh1KTsKLSAgICAgICAgICAgIGFkZFdvcmtMaXN0KHYpOwotCi0gICAgICAgICAgICBpZiAodHJh
Y2VEZWJ1ZykKLSAgICAgICAgICAgICAgICBkYXRhTG9nKCIgICAgQ29uc3RyYWluZWRcbiIpOwot
ICAgICAgICB9IGVsc2UgaWYgKGNhbkJlU2FmZWx5Q29hbGVzY2VkKHUsIHYpKSB7Ci0gICAgICAg
ICAgICBjb21iaW5lKHUsIHYpOwotICAgICAgICAgICAgYWRkV29ya0xpc3QodSk7Ci0gICAgICAg
ICAgICBtX2hhc0NvYWxlc2NlZE5vblRyaXZpYWxNb3ZlID0gdHJ1ZTsKLQotICAgICAgICAgICAg
aWYgKHRyYWNlRGVidWcpCi0gICAgICAgICAgICAgICAgZGF0YUxvZygiICAgIFNhZmUgQ29hbGVz
Y2luZ1xuIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX2FjdGl2ZU1vdmVzLnF1
aWNrU2V0KG1vdmVJbmRleCk7Ci0KLSAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQotICAgICAg
ICAgICAgICAgIGRhdGFMb2coIiAgICBGYWlsZWQgY29hbGVzY2luZywgYWRkZWQgdG8gYWN0aXZl
IG1vdmVzLlxuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGFzc2lnbkNvbG9ycygp
Ci0gICAgewotICAgICAgICBBU1NFUlQobV9zaW1wbGlmeVdvcmtsaXN0LmlzRW1wdHkoKSk7Ci0g
ICAgICAgIEFTU0VSVChtX3dvcmtsaXN0TW92ZXMuaXNFbXB0eSgpKTsKLSAgICAgICAgQVNTRVJU
KG1fZnJlZXplV29ya2xpc3QuaXNFbXB0eSgpKTsKLSAgICAgICAgQVNTRVJUKG1fc3BpbGxXb3Jr
bGlzdC5pc0VtcHR5KCkpOwotCi0gICAgICAgIC8vIFJlY2xhaW0gYXMgbXVjaCBtZW1vcnkgYXMg
cG9zc2libGUuCi0gICAgICAgIG1faW50ZXJmZXJlbmNlRWRnZXMuY2xlYXIoKTsKLSAgICAgICAg
bV9kZWdyZWVzLmNsZWFyKCk7Ci0gICAgICAgIG1fbW92ZUxpc3QuY2xlYXIoKTsKLSAgICAgICAg
bV93b3JrbGlzdE1vdmVzLmNsZWFyKCk7Ci0gICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5jbGVh
cigpOwotICAgICAgICBtX3NwaWxsV29ya2xpc3QuY2xlYXIoKTsKLSAgICAgICAgbV9mcmVlemVX
b3JrbGlzdC5jbGVhcigpOwotCi0gICAgICAgIC8vIFRyeSB0byBjb2xvciB0aGUgVG1wIG9uIHRo
ZSBzdGFjay4KLSAgICAgICAgbV9jb2xvcmVkVG1wLnJlc2l6ZShtX2FkamFjZW5jeUxpc3Quc2l6
ZSgpKTsKLQotICAgICAgICB3aGlsZSAoIW1fc2VsZWN0U3RhY2suaXNFbXB0eSgpKSB7Ci0gICAg
ICAgICAgICB1bnNpZ25lZCB0bXBJbmRleCA9IG1fc2VsZWN0U3RhY2sudGFrZUxhc3QoKTsKLSAg
ICAgICAgICAgIEFTU0VSVCghaXNQcmVjb2xvcmVkKHRtcEluZGV4KSk7Ci0gICAgICAgICAgICBB
U1NFUlQoIW1fY29sb3JlZFRtcFt0bXBJbmRleF0pOwotCi0gICAgICAgICAgICBSZWdpc3RlclNl
dCBjb2xvcmVkUmVnaXN0ZXJzOwotICAgICAgICAgICAgZm9yIChJbmRleFR5cGUgYWRqYWNlbnRU
bXBJbmRleCA6IG1fYWRqYWNlbmN5TGlzdFt0bXBJbmRleF0pIHsKLSAgICAgICAgICAgICAgICBJ
bmRleFR5cGUgYWxpYXNUbXBJbmRleCA9IGdldEFsaWFzKGFkamFjZW50VG1wSW5kZXgpOwotICAg
ICAgICAgICAgICAgIFJlZyByZWcgPSBtX2NvbG9yZWRUbXBbYWxpYXNUbXBJbmRleF07Ci0KLSAg
ICAgICAgICAgICAgICBBU1NFUlQoIWlzUHJlY29sb3JlZChhbGlhc1RtcEluZGV4KSB8fCAoaXNQ
cmVjb2xvcmVkKGFsaWFzVG1wSW5kZXgpICYmIHJlZykpOwotCi0gICAgICAgICAgICAgICAgaWYg
KHJlZykKLSAgICAgICAgICAgICAgICAgICAgY29sb3JlZFJlZ2lzdGVycy5zZXQocmVnKTsKLSAg
ICAgICAgICAgIH0KLQotICAgICAgICAgICAgYm9vbCBjb2xvckFzc2lnbmVkID0gZmFsc2U7Ci0g
ICAgICAgICAgICBmb3IgKFJlZyByZWcgOiBtX3JlZ3NJblByaW9yaXR5T3JkZXIpIHsKLSAgICAg
ICAgICAgICAgICBpZiAoIWNvbG9yZWRSZWdpc3RlcnMuZ2V0KHJlZykpIHsKLSAgICAgICAgICAg
ICAgICAgICAgbV9jb2xvcmVkVG1wW3RtcEluZGV4XSA9IHJlZzsKLSAgICAgICAgICAgICAgICAg
ICAgY29sb3JBc3NpZ25lZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFjb2xvckFz
c2lnbmVkKQotICAgICAgICAgICAgICAgIG1fc3BpbGxlZFRtcHMuYXBwZW5kKHRtcEluZGV4KTsK
LSAgICAgICAgfQotICAgICAgICBtX3NlbGVjdFN0YWNrLmNsZWFyKCk7Ci0KLSAgICAgICAgaWYg
KG1fc3BpbGxlZFRtcHMuaXNFbXB0eSgpKQotICAgICAgICAgICAgbV9jb2FsZXNjZWRUbXBzQXRT
cGlsbC5jbGVhcigpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtX2NvbG9yZWRUbXAuY2xl
YXIoKTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgdm9pZCBpbml0aWFsaXplRGVncmVlcyh1bnNp
Z25lZCB0bXBBcnJheVNpemUpCi0gICAgewotICAgICAgICBtX2RlZ3JlZXMucmVzaXplKHRtcEFy
cmF5U2l6ZSk7Ci0KLSAgICAgICAgLy8gQWxsIHByZWNvbG9yZWQgcmVnaXN0ZXJzIGhhdmUgIGFu
ICJpbmZpbml0ZSIgZGVncmVlLgotICAgICAgICB1bnNpZ25lZCBmaXJzdE5vblJlZ0luZGV4ID0g
bV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXggKyAxOwotICAgICAgICBmb3IgKHVuc2lnbmVk
IGkgPSAwOyBpIDwgZmlyc3ROb25SZWdJbmRleDsgKytpKQotICAgICAgICAgICAgbV9kZWdyZWVz
W2ldID0gc3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25lZD46Om1heCgpOwotCi0gICAgICAgIG1l
bXNldChtX2RlZ3JlZXMuZGF0YSgpICsgZmlyc3ROb25SZWdJbmRleCwgMCwgKHRtcEFycmF5U2l6
ZSAtIGZpcnN0Tm9uUmVnSW5kZXgpICogc2l6ZW9mKHVuc2lnbmVkKSk7Ci0gICAgfQotCi0gICAg
dm9pZCBhZGRFZGdlRGlzdGluY3QoSW5kZXhUeXBlIGEsIEluZGV4VHlwZSBiKQotICAgIHsKLSAg
ICAgICAgQVNTRVJUKGEgIT0gYik7Ci0gICAgICAgIGlmIChtX2ludGVyZmVyZW5jZUVkZ2VzLmFk
ZChJbnRlcmZlcmVuY2VFZGdlKGEsIGIpKS5pc05ld0VudHJ5KSB7Ci0gICAgICAgICAgICBpZiAo
IWlzUHJlY29sb3JlZChhKSkgewotICAgICAgICAgICAgICAgIEFTU0VSVCghbV9hZGphY2VuY3lM
aXN0W2FdLmNvbnRhaW5zKGIpKTsKLSAgICAgICAgICAgICAgICBtX2FkamFjZW5jeUxpc3RbYV0u
YXBwZW5kKGIpOwotICAgICAgICAgICAgICAgIG1fZGVncmVlc1thXSsrOwotICAgICAgICAgICAg
fQotCi0gICAgICAgICAgICBpZiAoIWlzUHJlY29sb3JlZChiKSkgewotICAgICAgICAgICAgICAg
IEFTU0VSVCghbV9hZGphY2VuY3lMaXN0W2JdLmNvbnRhaW5zKGEpKTsKLSAgICAgICAgICAgICAg
ICBtX2FkamFjZW5jeUxpc3RbYl0uYXBwZW5kKGEpOwotICAgICAgICAgICAgICAgIG1fZGVncmVl
c1tiXSsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBkZWNy
ZW1lbnREZWdyZWUoSW5kZXhUeXBlIHRtcEluZGV4KQotICAgIHsKLSAgICAgICAgQVNTRVJUKG1f
ZGVncmVlc1t0bXBJbmRleF0pOwotCi0gICAgICAgIHVuc2lnbmVkIG9sZERlZ3JlZSA9IG1fZGVn
cmVlc1t0bXBJbmRleF0tLTsKLSAgICAgICAgaWYgKG9sZERlZ3JlZSA9PSBtX3JlZ3NJblByaW9y
aXR5T3JkZXIuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBlbmFibGVNb3Zlc09uVmFsdWVBbmRBZGph
Y2VudHModG1wSW5kZXgpOwotICAgICAgICAgICAgbV9zcGlsbFdvcmtsaXN0LnJlbW92ZSh0bXBJ
bmRleCk7Ci0gICAgICAgICAgICBpZiAoaXNNb3ZlUmVsYXRlZCh0bXBJbmRleCkpCi0gICAgICAg
ICAgICAgICAgbV9mcmVlemVXb3JrbGlzdC5hZGQodG1wSW5kZXgpOwotICAgICAgICAgICAgZWxz
ZQotICAgICAgICAgICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5hcHBlbmQodG1wSW5kZXgpOwot
ICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBib29sIGFkZEVkZ2VEaXN0aW5jdFdpdGhvdXREZWdy
ZWVDaGFuZ2UoSW5kZXhUeXBlIGEsIEluZGV4VHlwZSBiKQotICAgIHsKLSAgICAgICAgQVNTRVJU
KGEgIT0gYik7Ci0gICAgICAgIGlmIChtX2ludGVyZmVyZW5jZUVkZ2VzLmFkZChJbnRlcmZlcmVu
Y2VFZGdlKGEsIGIpKS5pc05ld0VudHJ5KSB7Ci0gICAgICAgICAgICBpZiAoIWlzUHJlY29sb3Jl
ZChhKSkgewotICAgICAgICAgICAgICAgIEFTU0VSVCghbV9hZGphY2VuY3lMaXN0W2FdLmNvbnRh
aW5zKGIpKTsKLSAgICAgICAgICAgICAgICBtX2FkamFjZW5jeUxpc3RbYV0uYXBwZW5kKGIpOwot
ICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWlzUHJlY29sb3JlZChiKSkgewotICAg
ICAgICAgICAgICAgIEFTU0VSVCghbV9hZGphY2VuY3lMaXN0W2JdLmNvbnRhaW5zKGEpKTsKLSAg
ICAgICAgICAgICAgICBtX2FkamFjZW5jeUxpc3RbYl0uYXBwZW5kKGEpOwotICAgICAgICAgICAg
fQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgIH0KLQotICAgIGJvb2wgaXNNb3ZlUmVsYXRlZChJbmRleFR5cGUgdG1wSW5kZXgp
Ci0gICAgewotICAgICAgICBmb3IgKHVuc2lnbmVkIG1vdmVJbmRleCA6IG1fbW92ZUxpc3RbdG1w
SW5kZXhdKSB7Ci0gICAgICAgICAgICBpZiAobV9hY3RpdmVNb3Zlcy5xdWlja0dldChtb3ZlSW5k
ZXgpIHx8IG1fd29ya2xpc3RNb3Zlcy5jb250YWlucyhtb3ZlSW5kZXgpKQotICAgICAgICAgICAg
ICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9
Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdGlvbj4KLSAgICB2b2lkIGZvckVhY2hBZGph
Y2VudChJbmRleFR5cGUgdG1wSW5kZXgsIEZ1bmN0aW9uIGZ1bmN0aW9uKQotICAgIHsKLSAgICAg
ICAgZm9yIChJbmRleFR5cGUgYWRqYWNlbnRUbXBJbmRleCA6IG1fYWRqYWNlbmN5TGlzdFt0bXBJ
bmRleF0pIHsKLSAgICAgICAgICAgIGlmICghaGFzQmVlblNpbXBsaWZpZWQoYWRqYWNlbnRUbXBJ
bmRleCkpCi0gICAgICAgICAgICAgICAgZnVuY3Rpb24oYWRqYWNlbnRUbXBJbmRleCk7Ci0gICAg
ICAgIH0KLSAgICB9Ci0KLSAgICBib29sIGhhc0JlZW5TaW1wbGlmaWVkKEluZGV4VHlwZSB0bXBJ
bmRleCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2lzT25TZWxlY3RTdGFjay5xdWlja0dldCh0
bXBJbmRleCkgfHwgISFtX2NvYWxlc2NlZFRtcHNbdG1wSW5kZXhdOwotICAgIH0KLQotICAgIHRl
bXBsYXRlPHR5cGVuYW1lIEZ1bmN0aW9uPgotICAgIHZvaWQgZm9yRWFjaE5vZGVNb3ZlcyhJbmRl
eFR5cGUgdG1wSW5kZXgsIEZ1bmN0aW9uIGZ1bmN0aW9uKQotICAgIHsKLSAgICAgICAgZm9yICh1
bnNpZ25lZCBtb3ZlSW5kZXggOiBtX21vdmVMaXN0W3RtcEluZGV4XSkgewotICAgICAgICAgICAg
aWYgKG1fYWN0aXZlTW92ZXMucXVpY2tHZXQobW92ZUluZGV4KSB8fCBtX3dvcmtsaXN0TW92ZXMu
Y29udGFpbnMobW92ZUluZGV4KSkKLSAgICAgICAgICAgICAgICBmdW5jdGlvbihtb3ZlSW5kZXgp
OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBlbmFibGVNb3Zlc09uVmFsdWUoSW5kZXhU
eXBlIHRtcEluZGV4KQotICAgIHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBtb3ZlSW5kZXggOiBt
X21vdmVMaXN0W3RtcEluZGV4XSkgewotICAgICAgICAgICAgaWYgKG1fYWN0aXZlTW92ZXMucXVp
Y2tDbGVhcihtb3ZlSW5kZXgpKQotICAgICAgICAgICAgICAgIG1fd29ya2xpc3RNb3Zlcy5yZXR1
cm5Nb3ZlKG1vdmVJbmRleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGVuYWJsZU1v
dmVzT25WYWx1ZUFuZEFkamFjZW50cyhJbmRleFR5cGUgdG1wSW5kZXgpCi0gICAgewotICAgICAg
ICBlbmFibGVNb3Zlc09uVmFsdWUodG1wSW5kZXgpOwotCi0gICAgICAgIGZvckVhY2hBZGphY2Vu
dCh0bXBJbmRleCwgW3RoaXNdIChJbmRleFR5cGUgYWRqYWNlbnRUbXBJbmRleCkgewotICAgICAg
ICAgICAgZW5hYmxlTW92ZXNPblZhbHVlKGFkamFjZW50VG1wSW5kZXgpOwotICAgICAgICB9KTsK
LSAgICB9Ci0KLSAgICBib29sIGlzUHJlY29sb3JlZChJbmRleFR5cGUgdG1wSW5kZXgpCi0gICAg
ewotICAgICAgICByZXR1cm4gdG1wSW5kZXggPD0gbV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5k
ZXg7Ci0gICAgfQotCi0gICAgdm9pZCBhZGRXb3JrTGlzdChJbmRleFR5cGUgdG1wSW5kZXgpCi0g
ICAgewotICAgICAgICBpZiAoIWlzUHJlY29sb3JlZCh0bXBJbmRleCkgJiYgbV9kZWdyZWVzW3Rt
cEluZGV4XSA8IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkgJiYgIWlzTW92ZVJlbGF0ZWQo
dG1wSW5kZXgpKSB7Ci0gICAgICAgICAgICBtX2ZyZWV6ZVdvcmtsaXN0LnJlbW92ZSh0bXBJbmRl
eCk7Ci0gICAgICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuYXBwZW5kKHRtcEluZGV4KTsKLSAg
ICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgY29tYmluZShJbmRleFR5cGUgdSwgSW5kZXhUeXBl
IHYpCi0gICAgewotICAgICAgICBpZiAoIW1fZnJlZXplV29ya2xpc3QucmVtb3ZlKHYpKQotICAg
ICAgICAgICAgbV9zcGlsbFdvcmtsaXN0LnJlbW92ZSh2KTsKLQotICAgICAgICBBU1NFUlQoIW1f
Y29hbGVzY2VkVG1wc1t2XSk7Ci0gICAgICAgIG1fY29hbGVzY2VkVG1wc1t2XSA9IHU7Ci0KLSAg
ICAgICAgYXV0byYgdk1vdmVzID0gbV9tb3ZlTGlzdFt2XTsKLSAgICAgICAgbV9tb3ZlTGlzdFt1
XS5hZGQodk1vdmVzLmJlZ2luKCksIHZNb3Zlcy5lbmQoKSk7Ci0KLSAgICAgICAgZm9yRWFjaEFk
amFjZW50KHYsIFt0aGlzLCB1XSAoSW5kZXhUeXBlIGFkamFjZW50VG1wSW5kZXgpIHsKLSAgICAg
ICAgICAgIGlmIChhZGRFZGdlRGlzdGluY3RXaXRob3V0RGVncmVlQ2hhbmdlKGFkamFjZW50VG1w
SW5kZXgsIHUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgd2UgYWRkZWQgYSBuZXcgZWRnZSBi
ZXR3ZWVuIHRoZSBhZGphY2VudFRtcCBhbmQgdSwgaXQgcmVwbGFjZXMgdGhlIGVkZ2UKLSAgICAg
ICAgICAgICAgICAvLyB0aGF0IGV4aXN0ZWQgd2l0aCB2LgotICAgICAgICAgICAgICAgIC8vIFRo
ZSBkZWdyZWUgb2YgYWRqYWNlbnRUbXAgcmVtYWlucyB0aGUgc2FtZSBzaW5jZSB0aGUgZWRnZSBq
dXN0IGNoYW5nZWQgZnJvbSB1IHRvIHYuCi0gICAgICAgICAgICAgICAgLy8gQWxsIHdlIG5lZWQg
dG8gZG8gaXMgdXBkYXRlIHRoZSBkZWdyZWUgb2YgdS4KLSAgICAgICAgICAgICAgICBpZiAoIWlz
UHJlY29sb3JlZCh1KSkKLSAgICAgICAgICAgICAgICAgICAgbV9kZWdyZWVzW3VdKys7Ci0gICAg
ICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIElmIHdlIGFscmVhZHkgaGFkIGFu
IGVkZ2UgYmV0d2VlbiB0aGUgYWRqYWNlbnRUbXAgYW5kIHUsIHRoZSBkZWdyZWUgb2YgdQotICAg
ICAgICAgICAgICAgIC8vIGlzIGFscmVhZHkgY29ycmVjdC4gVGhlIGRlZ3JlZSBvZiB0aGUgYWRq
YWNlbnRUbXAgZGVjcmVhc2VzIHNpbmNlIHRoZSBlZGdlCi0gICAgICAgICAgICAgICAgLy8gd2l0
aCB2IGlzIG5vIGxvbmdlciByZWxldmFudCAod2UgY2FuIHRoaW5rIG9mIGl0IGFzIG1lcmdlZCB3
aXRoIHRoZSBlZGdlIHdpdGggdSkuCi0gICAgICAgICAgICAgICAgZGVjcmVtZW50RGVncmVlKGFk
amFjZW50VG1wSW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBp
ZiAobV9mcmFtZVBvaW50ZXJJbmRleCAmJiBtX2ludGVyZmVyZXNXaXRoRnJhbWVQb2ludGVyLnF1
aWNrR2V0KHYpKQotICAgICAgICAgICAgbV9pbnRlcmZlcmVzV2l0aEZyYW1lUG9pbnRlci5xdWlj
a1NldCh1KTsKLQotICAgICAgICBpZiAobV9kZWdyZWVzW3VdID49IG1fcmVnc0luUHJpb3JpdHlP
cmRlci5zaXplKCkgJiYgbV9mcmVlemVXb3JrbGlzdC5yZW1vdmUodSkpCi0gICAgICAgICAgICBh
ZGRUb1NwaWxsKHUpOwotICAgIH0KLQotICAgIGJvb2wgY2FuQmVTYWZlbHlDb2FsZXNjZWQoSW5k
ZXhUeXBlIHUsIEluZGV4VHlwZSB2KQotICAgIHsKLSAgICAgICAgQVNTRVJUKCFpc1ByZWNvbG9y
ZWQodikpOwotICAgICAgICBpZiAoaXNQcmVjb2xvcmVkKHUpKQotICAgICAgICAgICAgcmV0dXJu
IHByZWNvbG9yZWRDb2FsZXNjaW5nSGV1cmlzdGljKHUsIHYpOwotICAgICAgICByZXR1cm4gY29u
c2VydmF0aXZlSGV1cmlzdGljKHUsIHYpOwotICAgIH0KLQotICAgIGJvb2wgY29uc2VydmF0aXZl
SGV1cmlzdGljKEluZGV4VHlwZSB1LCBJbmRleFR5cGUgdikKLSAgICB7Ci0gICAgICAgIC8vIFRo
aXMgaXMgdXNpbmcgdGhlIEJyaWdncycgY29uc2VydmF0aXZlIGNvYWxlc2NpbmcgcnVsZToKLSAg
ICAgICAgLy8gSWYgdGhlIG51bWJlciBvZiBjb21iaW5lZCBhZGphY2VudCBub2RlIHdpdGggYSBk
ZWdyZWUgPj0gSyBpcyBsZXNzIHRoYW4gSywKLSAgICAgICAgLy8gaXQgaXMgc2FmZSB0byBjb21i
aW5lIHRoZSB0d28gbm9kZXMuIFRoZSByZWFzb24gaXMgdGhhdCB3ZSBrbm93IHRoYXQgaWYgdGhl
IGdyYXBoCi0gICAgICAgIC8vIGlzIGNvbG9yYWJsZSwgd2UgaGF2ZSBmZXdlciB0aGFuIEsgYWRq
YWNlbnRzIHdpdGggaGlnaCBvcmRlciBhbmQgdGhlcmUgaXMgYSBjb2xvcgotICAgICAgICAvLyBm
b3IgdGhlIGN1cnJlbnQgbm9kZS4KLSAgICAgICAgQVNTRVJUKHUgIT0gdik7Ci0gICAgICAgIEFT
U0VSVCghaXNQcmVjb2xvcmVkKHUpKTsKLSAgICAgICAgQVNTRVJUKCFpc1ByZWNvbG9yZWQodikp
OwotCi0gICAgICAgIGNvbnN0IGF1dG8mIGFkamFjZW50c09mVSA9IG1fYWRqYWNlbmN5TGlzdFt1
XTsKLSAgICAgICAgY29uc3QgYXV0byYgYWRqYWNlbnRzT2ZWID0gbV9hZGphY2VuY3lMaXN0W3Zd
OwotCi0gICAgICAgIGlmIChhZGphY2VudHNPZlUuc2l6ZSgpICsgYWRqYWNlbnRzT2ZWLnNpemUo
KSA8IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkpIHsKLSAgICAgICAgICAgIC8vIFNob3J0
Y3V0OiBpZiB0aGUgdG90YWwgbnVtYmVyIG9mIGFkamFjZW50cyBpcyBsZXNzIHRoYW4gdGhlIG51
bWJlciBvZiByZWdpc3RlciwgdGhlIGNvbmRpdGlvbiBpcyBhbHdheXMgbWV0LgotICAgICAgICAg
ICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBIYXNoU2V0PEluZGV4VHlwZT4g
aGlnaE9yZGVyQWRqYWNlbnRzOwotCi0gICAgICAgIGZvciAoSW5kZXhUeXBlIGFkamFjZW50VG1w
SW5kZXggOiBhZGphY2VudHNPZlUpIHsKLSAgICAgICAgICAgIEFTU0VSVChhZGphY2VudFRtcElu
ZGV4ICE9IHYpOwotICAgICAgICAgICAgQVNTRVJUKGFkamFjZW50VG1wSW5kZXggIT0gdSk7Ci0g
ICAgICAgICAgICBpZiAoIWhhc0JlZW5TaW1wbGlmaWVkKGFkamFjZW50VG1wSW5kZXgpICYmIG1f
ZGVncmVlc1thZGphY2VudFRtcEluZGV4XSA+PSBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgp
KSB7Ci0gICAgICAgICAgICAgICAgYXV0byBhZGRSZXN1bHQgPSBoaWdoT3JkZXJBZGphY2VudHMu
YWRkKGFkamFjZW50VG1wSW5kZXgpOwotICAgICAgICAgICAgICAgIGlmIChhZGRSZXN1bHQuaXNO
ZXdFbnRyeSAmJiBoaWdoT3JkZXJBZGphY2VudHMuc2l6ZSgpID49IG1fcmVnc0luUHJpb3JpdHlP
cmRlci5zaXplKCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgfQotICAgICAgICBmb3IgKEluZGV4VHlwZSBhZGphY2VudFRtcEluZGV4
IDogYWRqYWNlbnRzT2ZWKSB7Ci0gICAgICAgICAgICBBU1NFUlQoYWRqYWNlbnRUbXBJbmRleCAh
PSB1KTsKLSAgICAgICAgICAgIEFTU0VSVChhZGphY2VudFRtcEluZGV4ICE9IHYpOwotICAgICAg
ICAgICAgaWYgKCFoYXNCZWVuU2ltcGxpZmllZChhZGphY2VudFRtcEluZGV4KSAmJiBtX2RlZ3Jl
ZXNbYWRqYWNlbnRUbXBJbmRleF0gPj0gbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKSkgewot
ICAgICAgICAgICAgICAgIGF1dG8gYWRkUmVzdWx0ID0gaGlnaE9yZGVyQWRqYWNlbnRzLmFkZChh
ZGphY2VudFRtcEluZGV4KTsKLSAgICAgICAgICAgICAgICBpZiAoYWRkUmVzdWx0LmlzTmV3RW50
cnkgJiYgaGlnaE9yZGVyQWRqYWNlbnRzLnNpemUoKSA+PSBtX3JlZ3NJblByaW9yaXR5T3JkZXIu
c2l6ZSgpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0KLQotICAgICAgICBBU1NFUlQoaGlnaE9yZGVyQWRqYWNlbnRzLnNpemUoKSA8
IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAg
ICB9Ci0KLSAgICBib29sIHByZWNvbG9yZWRDb2FsZXNjaW5nSGV1cmlzdGljKEluZGV4VHlwZSB1
LCBJbmRleFR5cGUgdikKLSAgICB7Ci0gICAgICAgIGlmICh0cmFjZURlYnVnKQotICAgICAgICAg
ICAgZGF0YUxvZygiICAgIENoZWNraW5nIHByZWNvbG9yZWRDb2FsZXNjaW5nSGV1cmlzdGljXG4i
KTsKLSAgICAgICAgQVNTRVJUKGlzUHJlY29sb3JlZCh1KSk7Ci0gICAgICAgIEFTU0VSVCghaXNQ
cmVjb2xvcmVkKHYpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIElmIHUgaXMgYSBwaW5uZWQgcmVn
aXN0ZXIgdGhlbiBpdCdzIGFsd2F5cyBzYWZlIHRvIGNvYWxlc2NlLiBOb3RlIHRoYXQgd2hlbiB3
ZSBjYWxsIHRoaXMsCi0gICAgICAgIC8vIHdlIGhhdmUgYWxyZWFkeSBwcm92ZWQgdGhhdCB0aGVy
ZSBpcyBubyBpbnRlcmZlcmVuY2UgYmV0d2VlbiB1IGFuZCB2LgotICAgICAgICBpZiAoIW1fbXV0
YWJsZVJlZ3MuZ2V0KG1fY29sb3JlZFRtcFt1XSkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsK
LQotICAgICAgICAvLyBJZiBhbnkgYWRqYWNlbnQgb2YgdGhlIG5vbi1jb2xvcmVkIG5vZGUgaXMg
bm90IGFuIGFkamFjZW50IG9mIHRoZSBjb2xvcmVkIG5vZGUgQU5EIGhhcyBhIGRlZ3JlZSA+PSBL
Ci0gICAgICAgIC8vIHRoZXJlIGlzIGEgcmlzayB0aGF0IHRoaXMgbm9kZSBuZWVkcyB0byBoYXZl
IHRoZSBzYW1lIGNvbG9yIGFzIG91ciBwcmVjb2xvcmVkIG5vZGUuIElmIHdlIGNvYWxlc2NlIHN1
Y2gKLSAgICAgICAgLy8gbW92ZSwgd2UgbWF5IGNyZWF0ZSBhbiB1bmNvbG9yYWJsZSBncmFwaC4K
LSAgICAgICAgY29uc3QgYXV0byYgYWRqYWNlbnRzT2ZWID0gbV9hZGphY2VuY3lMaXN0W3ZdOwot
ICAgICAgICBmb3IgKHVuc2lnbmVkIGFkamFjZW50VG1wSW5kZXggOiBhZGphY2VudHNPZlYpIHsK
LSAgICAgICAgICAgIGlmICghaXNQcmVjb2xvcmVkKGFkamFjZW50VG1wSW5kZXgpCi0gICAgICAg
ICAgICAgICAgJiYgIWhhc0JlZW5TaW1wbGlmaWVkKGFkamFjZW50VG1wSW5kZXgpCi0gICAgICAg
ICAgICAgICAgJiYgbV9kZWdyZWVzW2FkamFjZW50VG1wSW5kZXhdID49IG1fcmVnc0luUHJpb3Jp
dHlPcmRlci5zaXplKCkKLSAgICAgICAgICAgICAgICAmJiAhbV9pbnRlcmZlcmVuY2VFZGdlcy5j
b250YWlucyhJbnRlcmZlcmVuY2VFZGdlKHUsIGFkamFjZW50VG1wSW5kZXgpKSkKLSAgICAgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0g
ICAgfQotCi1wcm90ZWN0ZWQ6Ci0jaWYgUExBVEZPUk0oQ09DT0EpCi0jcHJhZ21hIG1hcmsgLQot
I2VuZGlmCi0KLSAgICAvLyBJbnRlcmZlcmVuY2UgZWRnZXMgYXJlIG5vdCBkaXJlY3RlZC4gQW4g
ZWRnZSBiZXR3ZWVuIGFueSB0d28gVG1wcyBpcyByZXByZXNlbnRlZAotICAgIC8vIGJ5IHRoZSBj
b25jYXRlbmF0ZWQgdmFsdWVzIG9mIHRoZSBzbWFsbGVzdCBUbXAgZm9sbG93ZWQgYnkgdGhlIGJp
Z2dlciBUbXAuCi0gICAgY2xhc3MgSW50ZXJmZXJlbmNlRWRnZSB7Ci0gICAgcHVibGljOgotICAg
ICAgICBJbnRlcmZlcmVuY2VFZGdlKCkKLSAgICAgICAgewotICAgICAgICB9Ci0KLSAgICAgICAg
SW50ZXJmZXJlbmNlRWRnZShJbmRleFR5cGUgYSwgSW5kZXhUeXBlIGIpCi0gICAgICAgIHsKLSAg
ICAgICAgICAgIEFTU0VSVChhKTsKLSAgICAgICAgICAgIEFTU0VSVChiKTsKLSAgICAgICAgICAg
IEFTU0VSVF9XSVRIX01FU1NBR0UoYSAhPSBiLCAiQSBUbXAgY2FuIG5ldmVyIGludGVyZmVyZSB3
aXRoIGl0c2VsZi4gRG9pbmcgc28gd291bGQgZm9yY2UgaXQgdG8gYmUgdGhlIHN1cGVycG9zaXRp
b24gb2YgdHdvIHJlZ2lzdGVycy4iKTsKLQotICAgICAgICAgICAgaWYgKGIgPCBhKQotICAgICAg
ICAgICAgICAgIHN0ZDo6c3dhcChhLCBiKTsKLSAgICAgICAgICAgIG1fdmFsdWUgPSBzdGF0aWNf
Y2FzdDx1aW50NjRfdD4oYSkgPDwgMzIgfCBiOwotICAgICAgICB9Ci0KLSAgICAgICAgSW50ZXJm
ZXJlbmNlRWRnZShXVEY6Okhhc2hUYWJsZURlbGV0ZWRWYWx1ZVR5cGUpCi0gICAgICAgICAgICA6
IG1fdmFsdWUoc3RkOjpudW1lcmljX2xpbWl0czx1aW50NjRfdD46Om1heCgpKQotICAgICAgICB7
Ci0gICAgICAgIH0KLQotICAgICAgICBJbmRleFR5cGUgZmlyc3QoKSBjb25zdAotICAgICAgICB7
Ci0gICAgICAgICAgICByZXR1cm4gbV92YWx1ZSA+PiAzMiAmIDB4ZmZmZmZmZmY7Ci0gICAgICAg
IH0KLQotICAgICAgICBJbmRleFR5cGUgc2Vjb25kKCkgY29uc3QKLSAgICAgICAgewotICAgICAg
ICAgICAgcmV0dXJuIG1fdmFsdWUgJiAweGZmZmZmZmZmOwotICAgICAgICB9Ci0KLSAgICAgICAg
Ym9vbCBvcGVyYXRvcj09KGNvbnN0IEludGVyZmVyZW5jZUVkZ2Ugb3RoZXIpIGNvbnN0Ci0gICAg
ICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtX3ZhbHVlID09IG90aGVyLm1fdmFsdWU7Ci0gICAg
ICAgIH0KLQotICAgICAgICBib29sIGlzSGFzaFRhYmxlRGVsZXRlZFZhbHVlKCkgY29uc3QKLSAg
ICAgICAgewotICAgICAgICAgICAgcmV0dXJuICp0aGlzID09IEludGVyZmVyZW5jZUVkZ2UoV1RG
OjpIYXNoVGFibGVEZWxldGVkVmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdW5zaWduZWQg
aGFzaCgpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBXVEY6OkludEhhc2g8
dWludDY0X3Q+OjpoYXNoKG1fdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBkdW1w
KFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG91dC5wcmlu
dChmaXJzdCgpLCAiPD0+Iiwgc2Vjb25kKCkpOwotICAgICAgICB9Ci0KLSAgICBwcml2YXRlOgot
ICAgICAgICB1aW50NjRfdCBtX3ZhbHVlIHsgMCB9OwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgSW50
ZXJmZXJlbmNlRWRnZUhhc2ggewotICAgICAgICBzdGF0aWMgdW5zaWduZWQgaGFzaChjb25zdCBJ
bnRlcmZlcmVuY2VFZGdlJiBrZXkpIHsgcmV0dXJuIGtleS5oYXNoKCk7IH0KLSAgICAgICAgc3Rh
dGljIGJvb2wgZXF1YWwoY29uc3QgSW50ZXJmZXJlbmNlRWRnZSYgYSwgY29uc3QgSW50ZXJmZXJl
bmNlRWRnZSYgYikgeyByZXR1cm4gYSA9PSBiOyB9Ci0gICAgICAgIHN0YXRpYyBjb25zdCBib29s
IHNhZmVUb0NvbXBhcmVUb0VtcHR5T3JEZWxldGVkID0gdHJ1ZTsKLSAgICB9OwotICAgIHR5cGVk
ZWYgU2ltcGxlQ2xhc3NIYXNoVHJhaXRzPEludGVyZmVyZW5jZUVkZ2U+IEludGVyZmVyZW5jZUVk
Z2VIYXNoVHJhaXRzOwotCi0gICAgY29uc3QgVmVjdG9yPFJlZz4mIG1fcmVnc0luUHJpb3JpdHlP
cmRlcjsKLSAgICBSZWdpc3RlclNldCBtX211dGFibGVSZWdzOwotICAgIEluZGV4VHlwZSBtX2xh
c3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleCB7IDAgfTsKLQotICAgIC8vIFRoZSBpbnRlcmZlcmVu
Y2UgZ3JhcGguCi0gICAgSGFzaFNldDxJbnRlcmZlcmVuY2VFZGdlLCBJbnRlcmZlcmVuY2VFZGdl
SGFzaCwgSW50ZXJmZXJlbmNlRWRnZUhhc2hUcmFpdHM+IG1faW50ZXJmZXJlbmNlRWRnZXM7Ci0g
ICAgVmVjdG9yPFZlY3RvcjxJbmRleFR5cGUsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93LCA0Piwg
MCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fYWRqYWNlbmN5TGlzdDsKLSAgICBWZWN0b3I8SW5k
ZXhUeXBlLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9kZWdyZWVzOwotCi0gICAgLy8gSW5z
dGVhZCBvZiBrZWVwaW5nIHRyYWNrIG9mIHRoZSBtb3ZlIGluc3RydWN0aW9ucywgd2UganVzdCBr
ZWVwIHRoZWlyIG9wZXJhbmRzIGFyb3VuZCBhbmQgdXNlIHRoZSBpbmRleAotICAgIC8vIGluIHRo
ZSB2ZWN0b3IgYXMgdGhlICJpZGVudGlmaWVyIiBmb3IgdGhlIG1vdmUuCi0gICAgc3RydWN0IE1v
dmVPcGVyYW5kcyB7Ci0gICAgICAgIEluZGV4VHlwZSBzcmNJbmRleDsKLSAgICAgICAgSW5kZXhU
eXBlIGRzdEluZGV4OwotICAgIH07Ci0gICAgVmVjdG9yPE1vdmVPcGVyYW5kcywgMCwgVW5zYWZl
VmVjdG9yT3ZlcmZsb3c+IG1fY29hbGVzY2luZ0NhbmRpZGF0ZXM7Ci0KLSAgICAvLyBMaXN0IG9m
IGV2ZXJ5IG1vdmUgaW5zdHJ1Y3Rpb24gYXNzb2NpYXRlZCB3aXRoIGEgVG1wLgotICAgIFZlY3Rv
cjxIYXNoU2V0PEluZGV4VHlwZSwgdHlwZW5hbWUgRGVmYXVsdEhhc2g8SW5kZXhUeXBlPjo6SGFz
aCwgV1RGOjpVbnNpZ25lZFdpdGhaZXJvS2V5SGFzaFRyYWl0czxJbmRleFR5cGU+Pj4gbV9tb3Zl
TGlzdDsKLQotICAgIC8vIENvbG9ycy4KLSAgICBWZWN0b3I8UmVnLCAwLCBVbnNhZmVWZWN0b3JP
dmVyZmxvdz4gbV9jb2xvcmVkVG1wOwotICAgIFZlY3RvcjxJbmRleFR5cGU+IG1fc3BpbGxlZFRt
cHM7Ci0KLSAgICAvLyBWYWx1ZXMgdGhhdCBoYXZlIGJlZW4gY29hbGVzY2VkIHdpdGggYW4gb3Ro
ZXIgdmFsdWUuCi0gICAgVmVjdG9yPEluZGV4VHlwZSwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+
IG1fY29hbGVzY2VkVG1wczsKLQotICAgIC8vIFRoZSBzdGFjayBvZiBUbXAgcmVtb3ZlZCBmcm9t
IHRoZSBncmFwaCBhbmQgcmVhZHkgZm9yIGNvbG9yaW5nLgotICAgIEJpdFZlY3RvciBtX2lzT25T
ZWxlY3RTdGFjazsKLSAgICBWZWN0b3I8SW5kZXhUeXBlPiBtX3NlbGVjdFN0YWNrOwotCi0gICAg
SW5kZXhUeXBlIG1fZnJhbWVQb2ludGVySW5kZXggeyAwIH07Ci0gICAgQml0VmVjdG9yIG1faW50
ZXJmZXJlc1dpdGhGcmFtZVBvaW50ZXI7Ci0KLSAgICBzdHJ1Y3QgT3JkZXJlZE1vdmVTZXQgewot
ICAgICAgICB1bnNpZ25lZCBhZGRNb3ZlKCkKLSAgICAgICAgewotICAgICAgICAgICAgQVNTRVJU
KG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5pc0VtcHR5KCkpOwotICAgICAgICAgICAgQVNTRVJUKCFt
X2ZpcnN0TG93UHJpb3JpdHlNb3ZlSW5kZXgpOwotCi0gICAgICAgICAgICB1bnNpZ25lZCBuZXh0
SW5kZXggPSBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdC5zaXplKCk7Ci0gICAgICAgICAgICB1bnNpZ25l
ZCBwb3NpdGlvbiA9IG1fbW92ZUxpc3Quc2l6ZSgpOwotICAgICAgICAgICAgbV9tb3ZlTGlzdC5h
cHBlbmQobmV4dEluZGV4KTsKLSAgICAgICAgICAgIG1fcG9zaXRpb25Jbk1vdmVMaXN0LmFwcGVu
ZChwb3NpdGlvbik7Ci0gICAgICAgICAgICByZXR1cm4gbmV4dEluZGV4OwotICAgICAgICB9Ci0K
LSAgICAgICAgdm9pZCBzdGFydEFkZGluZ0xvd1ByaW9yaXR5TW92ZXMoKQotICAgICAgICB7Ci0g
ICAgICAgICAgICBBU1NFUlQobV9sb3dQcmlvcml0eU1vdmVMaXN0LmlzRW1wdHkoKSk7Ci0gICAg
ICAgICAgICBtX2ZpcnN0TG93UHJpb3JpdHlNb3ZlSW5kZXggPSBtX21vdmVMaXN0LnNpemUoKTsK
LSAgICAgICAgfQotCi0gICAgICAgIHVuc2lnbmVkIGFkZExvd1ByaW9yaXR5TW92ZSgpCi0gICAg
ICAgIHsKLSAgICAgICAgICAgIEFTU0VSVChtX2ZpcnN0TG93UHJpb3JpdHlNb3ZlSW5kZXggPT0g
bV9tb3ZlTGlzdC5zaXplKCkpOwotCi0gICAgICAgICAgICB1bnNpZ25lZCBuZXh0SW5kZXggPSBt
X3Bvc2l0aW9uSW5Nb3ZlTGlzdC5zaXplKCk7Ci0gICAgICAgICAgICB1bnNpZ25lZCBwb3NpdGlv
biA9IG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5zaXplKCk7Ci0gICAgICAgICAgICBtX2xvd1ByaW9y
aXR5TW92ZUxpc3QuYXBwZW5kKG5leHRJbmRleCk7Ci0gICAgICAgICAgICBtX3Bvc2l0aW9uSW5N
b3ZlTGlzdC5hcHBlbmQocG9zaXRpb24pOwotCi0gICAgICAgICAgICBBU1NFUlQobmV4dEluZGV4
ID49IG1fZmlyc3RMb3dQcmlvcml0eU1vdmVJbmRleCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBu
ZXh0SW5kZXg7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sIGlzRW1wdHkoKSBjb25zdAotICAg
ICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbV9tb3ZlTGlzdC5pc0VtcHR5KCkgJiYgbV9sb3dQ
cmlvcml0eU1vdmVMaXN0LmlzRW1wdHkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2wgY29u
dGFpbnModW5zaWduZWQgaW5kZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtX3Bv
c2l0aW9uSW5Nb3ZlTGlzdFtpbmRleF0gIT0gc3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25lZD46
Om1heCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB0YWtlTW92ZSh1bnNpZ25lZCBtb3Zl
SW5kZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIHBvc2l0aW9uSW5Nb3ZlTGlz
dCA9IG1fcG9zaXRpb25Jbk1vdmVMaXN0W21vdmVJbmRleF07Ci0gICAgICAgICAgICBpZiAocG9z
aXRpb25Jbk1vdmVMaXN0ID09IHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgoKSkK
LSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIGlmIChtb3ZlSW5kZXggPCBt
X2ZpcnN0TG93UHJpb3JpdHlNb3ZlSW5kZXgpIHsKLSAgICAgICAgICAgICAgICBBU1NFUlQobV9t
b3ZlTGlzdFtwb3NpdGlvbkluTW92ZUxpc3RdID09IG1vdmVJbmRleCk7Ci0gICAgICAgICAgICAg
ICAgdW5zaWduZWQgbGFzdEluZGV4ID0gbV9tb3ZlTGlzdC5sYXN0KCk7Ci0gICAgICAgICAgICAg
ICAgbV9wb3NpdGlvbkluTW92ZUxpc3RbbGFzdEluZGV4XSA9IHBvc2l0aW9uSW5Nb3ZlTGlzdDsK
LSAgICAgICAgICAgICAgICBtX21vdmVMaXN0W3Bvc2l0aW9uSW5Nb3ZlTGlzdF0gPSBsYXN0SW5k
ZXg7Ci0gICAgICAgICAgICAgICAgbV9tb3ZlTGlzdC5yZW1vdmVMYXN0KCk7Ci0gICAgICAgICAg
ICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFTU0VSVChtX2xvd1ByaW9yaXR5TW92ZUxpc3Rb
cG9zaXRpb25Jbk1vdmVMaXN0XSA9PSBtb3ZlSW5kZXgpOwotICAgICAgICAgICAgICAgIHVuc2ln
bmVkIGxhc3RJbmRleCA9IG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5sYXN0KCk7Ci0gICAgICAgICAg
ICAgICAgbV9wb3NpdGlvbkluTW92ZUxpc3RbbGFzdEluZGV4XSA9IHBvc2l0aW9uSW5Nb3ZlTGlz
dDsKLSAgICAgICAgICAgICAgICBtX2xvd1ByaW9yaXR5TW92ZUxpc3RbcG9zaXRpb25Jbk1vdmVM
aXN0XSA9IGxhc3RJbmRleDsKLSAgICAgICAgICAgICAgICBtX2xvd1ByaW9yaXR5TW92ZUxpc3Qu
cmVtb3ZlTGFzdCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtX3Bvc2l0aW9uSW5N
b3ZlTGlzdFttb3ZlSW5kZXhdID0gc3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25lZD46Om1heCgp
OwotCi0gICAgICAgICAgICBBU1NFUlQoIWNvbnRhaW5zKG1vdmVJbmRleCkpOwotICAgICAgICB9
Ci0KLSAgICAgICAgdW5zaWduZWQgdGFrZUxhc3RNb3ZlKCkKLSAgICAgICAgewotICAgICAgICAg
ICAgQVNTRVJUKCFpc0VtcHR5KCkpOwotCi0gICAgICAgICAgICB1bnNpZ25lZCBsYXN0SW5kZXg7
Ci0gICAgICAgICAgICBpZiAoIW1fbW92ZUxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAg
ICAgbGFzdEluZGV4ID0gbV9tb3ZlTGlzdC50YWtlTGFzdCgpOwotICAgICAgICAgICAgICAgIEFT
U0VSVChtX3Bvc2l0aW9uSW5Nb3ZlTGlzdFtsYXN0SW5kZXhdID09IG1fbW92ZUxpc3Quc2l6ZSgp
KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbGFzdEluZGV4ID0gbV9s
b3dQcmlvcml0eU1vdmVMaXN0LnRha2VMYXN0KCk7Ci0gICAgICAgICAgICAgICAgQVNTRVJUKG1f
cG9zaXRpb25Jbk1vdmVMaXN0W2xhc3RJbmRleF0gPT0gbV9sb3dQcmlvcml0eU1vdmVMaXN0LnNp
emUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdFts
YXN0SW5kZXhdID0gc3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25lZD46Om1heCgpOwotCi0gICAg
ICAgICAgICBBU1NFUlQoIWNvbnRhaW5zKGxhc3RJbmRleCkpOwotICAgICAgICAgICAgcmV0dXJu
IGxhc3RJbmRleDsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgcmV0dXJuTW92ZSh1bnNpZ25l
ZCBpbmRleCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gVGhpcyBhc3NlcnRpb24gaXMgYSBi
aXQgc3RyaWN0IGJ1dCB0aGF0IGlzIGhvdyB0aGUgbW92ZSBsaXN0IHNob3VsZCBiZSB1c2VkLiBU
aGUgb25seSBraW5kIG9mIG1vdmVzIHRoYXQgY2FuCi0gICAgICAgICAgICAvLyByZXR1cm4gdG8g
dGhlIGxpc3QgYXJlIHRoZSBvbmVzIHRoYXQgd2UgcHJldmlvdXNseSBmYWlsZWQgdG8gY29hbGVz
Y2Ugd2l0aCB0aGUgY29uc2VydmF0aXZlIGhldXJpc3RpY3MuCi0gICAgICAgICAgICAvLyBWYWx1
ZXMgc2hvdWxkIG5vdCBiZSBhZGRlZCBiYWNrIGlmIHRoZXkgd2VyZSBuZXZlciB0YWtlbiBvdXQg
d2hlbiBhdHRlbXB0aW5nIGNvYWxlc2NpbmcuCi0gICAgICAgICAgICBBU1NFUlQoIWNvbnRhaW5z
KGluZGV4KSk7Ci0KLSAgICAgICAgICAgIGlmIChpbmRleCA8IG1fZmlyc3RMb3dQcmlvcml0eU1v
dmVJbmRleCkgewotICAgICAgICAgICAgICAgIHVuc2lnbmVkIHBvc2l0aW9uID0gbV9tb3ZlTGlz
dC5zaXplKCk7Ci0gICAgICAgICAgICAgICAgbV9tb3ZlTGlzdC5hcHBlbmQoaW5kZXgpOwotICAg
ICAgICAgICAgICAgIG1fcG9zaXRpb25Jbk1vdmVMaXN0W2luZGV4XSA9IHBvc2l0aW9uOwotICAg
ICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBwb3NpdGlvbiA9IG1f
bG93UHJpb3JpdHlNb3ZlTGlzdC5zaXplKCk7Ci0gICAgICAgICAgICAgICAgbV9sb3dQcmlvcml0
eU1vdmVMaXN0LmFwcGVuZChpbmRleCk7Ci0gICAgICAgICAgICAgICAgbV9wb3NpdGlvbkluTW92
ZUxpc3RbaW5kZXhdID0gcG9zaXRpb247Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFT
U0VSVChjb250YWlucyhpbmRleCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBjbGVhcigp
Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1fcG9zaXRpb25Jbk1vdmVMaXN0LmNsZWFyKCk7Ci0g
ICAgICAgICAgICBtX21vdmVMaXN0LmNsZWFyKCk7Ci0gICAgICAgICAgICBtX2xvd1ByaW9yaXR5
TW92ZUxpc3QuY2xlYXIoKTsKLSAgICAgICAgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgVmVj
dG9yPHVuc2lnbmVkLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9wb3NpdGlvbkluTW92ZUxp
c3Q7Ci0gICAgICAgIFZlY3Rvcjx1bnNpZ25lZCwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1f
bW92ZUxpc3Q7Ci0gICAgICAgIFZlY3Rvcjx1bnNpZ25lZCwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZs
b3c+IG1fbG93UHJpb3JpdHlNb3ZlTGlzdDsKLSAgICAgICAgdW5zaWduZWQgbV9maXJzdExvd1By
aW9yaXR5TW92ZUluZGV4IHsgMCB9OwotICAgIH07Ci0KLSAgICAvLyBXb3JrIGxpc3RzLgotICAg
IC8vIFNldCBvZiAibW92ZSIgZW5hYmxlZCBmb3IgcG9zc2libGUgY29hbGVzY2luZy4KLSAgICBP
cmRlcmVkTW92ZVNldCBtX3dvcmtsaXN0TW92ZXM7Ci0gICAgLy8gU2V0IG9mICJtb3ZlIiBub3Qg
eWV0IHJlYWR5IGZvciBjb2FsZXNjaW5nLgotICAgIEJpdFZlY3RvciBtX2FjdGl2ZU1vdmVzOwot
ICAgIC8vIExvdy1kZWdyZWUsIG5vbi1Nb3ZlIHJlbGF0ZWQuCi0gICAgVmVjdG9yPEluZGV4VHlw
ZT4gbV9zaW1wbGlmeVdvcmtsaXN0OwotICAgIC8vIEhpZ2gtZGVncmVlIFRtcC4KLSAgICBIYXNo
U2V0PEluZGV4VHlwZT4gbV9zcGlsbFdvcmtsaXN0OwotICAgIC8vIExvdy1kZWdyZWUsIE1vdmUg
cmVsYXRlZC4KLSAgICBIYXNoU2V0PEluZGV4VHlwZT4gbV9mcmVlemVXb3JrbGlzdDsKLQotICAg
IGJvb2wgbV9oYXNTZWxlY3RlZFNwaWxsIHsgZmFsc2UgfTsKLSAgICBib29sIG1faGFzQ29hbGVz
Y2VkTm9uVHJpdmlhbE1vdmUgeyBmYWxzZSB9OwotCi0gICAgLy8gVGhlIG1hcHBpbmcgb2YgVG1w
IHRvIHRoZWlyIGFsaWFzIGZvciBNb3ZlcyB0aGF0IGFyZSBhbHdheXMgY29hbGVzY2luZyByZWdh
cmRsZXNzIG9mIHNwaWxsaW5nLgotICAgIFZlY3RvcjxJbmRleFR5cGUsIDAsIFVuc2FmZVZlY3Rv
ck92ZXJmbG93PiBtX2NvYWxlc2NlZFRtcHNBdFNwaWxsOwotICAgIAotICAgIGNvbnN0IEhhc2hT
ZXQ8dW5zaWduZWQ+JiBtX3Vuc3BpbGxhYmxlVG1wczsKLX07Ci0KLS8vIFRoaXMgcGVyZm9ybSBh
bGwgdGhlIHRhc2tzIHRoYXQgYXJlIHNwZWNpZmljIHRvIGNlcnRhaW4gcmVnaXN0ZXIgdHlwZS4K
LXRlbXBsYXRlPEFyZzo6VHlwZSB0eXBlPgotY2xhc3MgQ29sb3JpbmdBbGxvY2F0b3IgOiBwdWJs
aWMgQWJzdHJhY3RDb2xvcmluZ0FsbG9jYXRvcjx1bnNpZ25lZD4gewotcHVibGljOgotICAgIENv
bG9yaW5nQWxsb2NhdG9yKENvZGUmIGNvZGUsIFRtcFdpZHRoJiB0bXBXaWR0aCwgY29uc3QgVXNl
Q291bnRzPFRtcD4mIHVzZUNvdW50cywgY29uc3QgSGFzaFNldDx1bnNpZ25lZD4mIHVuc3BpbGxh
YmxlVG1wKQotICAgICAgICA6IEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0b3I8dW5zaWduZWQ+KGNv
ZGUucmVnc0luUHJpb3JpdHlPcmRlcih0eXBlKSwgQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46Omxh
c3RNYWNoaW5lUmVnaXN0ZXJJbmRleCgpLCB0bXBBcnJheVNpemUoY29kZSksIHVuc3BpbGxhYmxl
VG1wKQotICAgICAgICAsIG1fY29kZShjb2RlKQotICAgICAgICAsIG1fdG1wV2lkdGgodG1wV2lk
dGgpCi0gICAgICAgICwgbV91c2VDb3VudHModXNlQ291bnRzKQotICAgIHsKLSAgICAgICAgaWYg
KHR5cGUgPT0gQXJnOjpHUCkgewotICAgICAgICAgICAgbV9mcmFtZVBvaW50ZXJJbmRleCA9IEFi
c29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KFRtcChNYWNyb0Fzc2VtYmxlcjo6
ZnJhbWVQb2ludGVyUmVnaXN0ZXIpKTsKLSAgICAgICAgICAgIG1faW50ZXJmZXJlc1dpdGhGcmFt
ZVBvaW50ZXIuZW5zdXJlU2l6ZSh0bXBBcnJheVNpemUoY29kZSkpOwotICAgICAgICB9Ci0KLSAg
ICAgICAgaW5pdGlhbGl6ZVByZWNvbG9yZWRUbXAoKTsKLSAgICAgICAgYnVpbGQoKTsKLSAgICAg
ICAgYWxsb2NhdGUoKTsKLSAgICB9Ci0KLSAgICBUbXAgZ2V0QWxpYXMoVG1wIHRtcCkgY29uc3QK
LSAgICB7Ci0gICAgICAgIHJldHVybiBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFi
c29sdXRlSW5kZXgoZ2V0QWxpYXMoQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5k
ZXgodG1wKSkpOwotICAgIH0KLQotICAgIC8vIFRoaXMgdGVsbHMgeW91IGlmIGEgTW92ZSB3aWxs
IGJlIGNvYWxlc2NhYmxlIGlmIHRoZSBzcmMgYW5kIGRzdCBlbmQgdXAgbWF0Y2hpbmcuIFRoaXMg
bWV0aG9kCi0gICAgLy8gcmVsaWVzIG9uIGFuIGFuYWx5c2lzIHRoYXQgaXMgaW52YWxpZGF0ZWQg
YnkgcmVnaXN0ZXIgYWxsb2NhdGlvbiwgc28geW91IGl0J3Mgb25seSBtZWFuaW5nZnVsIHRvCi0g
ICAgLy8gY2FsbCB0aGlzICpiZWZvcmUqIHJlcGxhY2luZyB0aGUgVG1wJ3MgaW4gdGhpcyBJbnN0
IHdpdGggcmVnaXN0ZXJzIG9yIHNwaWxsIHNsb3RzLgotICAgIGJvb2wgbWF5QmVDb2FsZXNjYWJs
ZShjb25zdCBJbnN0JiBpbnN0KSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1heUJlQ29h
bGVzY2FibGVJbXBsKGluc3QsICZtX3RtcFdpZHRoKTsKLSAgICB9Ci0KLSAgICBib29sIGlzVXNl
bGVzc01vdmUoY29uc3QgSW5zdCYgaW5zdCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBt
YXlCZUNvYWxlc2NhYmxlSW1wbChpbnN0LCBudWxscHRyKSAmJiBpbnN0LmFyZ3NbMF0udG1wKCkg
PT0gaW5zdC5hcmdzWzFdLnRtcCgpOwotICAgIH0KLQotICAgIFRtcCBnZXRBbGlhc1doZW5TcGls
bGluZyhUbXAgdG1wKSBjb25zdAotICAgIHsKLSAgICAgICAgQVNTRVJUX1dJVEhfTUVTU0FHRSgh
bV9zcGlsbGVkVG1wcy5pc0VtcHR5KCksICJUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgdmFsaWQgZm9y
IGNvYWxlc2NpbmcgZHVyaW5nIHNwaWxsaW5nLiIpOwotCi0gICAgICAgIGlmIChtX2NvYWxlc2Nl
ZFRtcHNBdFNwaWxsLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiB0bXA7Ci0KLSAgICAg
ICAgdW5zaWduZWQgYWxpYXNJbmRleCA9IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0
ZUluZGV4KHRtcCk7Ci0gICAgICAgIHdoaWxlICh1bnNpZ25lZCBuZXh0QWxpYXNJbmRleCA9IG1f
Y29hbGVzY2VkVG1wc0F0U3BpbGxbYWxpYXNJbmRleF0pCi0gICAgICAgICAgICBhbGlhc0luZGV4
ID0gbmV4dEFsaWFzSW5kZXg7Ci0KLSAgICAgICAgVG1wIGFsaWFzID0gQWJzb2x1dGVUbXBNYXBw
ZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KGFsaWFzSW5kZXgpOwotCi0gICAgICAgIEFT
U0VSVF9XSVRIX01FU1NBR0UoIW1fc3BpbGxlZFRtcHMuY29udGFpbnMoYWxpYXNJbmRleCkgfHwg
YWxpYXMgPT0gdG1wLCAiVGhlIGFsaWFzZXMgYXQgc3BpbGwgc2hvdWxkIGFsd2F5cyBiZSBjb2xv
cmFibGUuIFNvbWV0aGluZyB3ZW50IGhvcnJpYmx5IHdyb25nLiIpOwotCi0gICAgICAgIHJldHVy
biBhbGlhczsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleEl0ZXJhdG9yPgot
ICAgIGNsYXNzIEluZGV4VG9UbXBJdGVyYXRvckFkYXB0b3IgewotICAgIHB1YmxpYzoKLSAgICAg
ICAgSW5kZXhUb1RtcEl0ZXJhdG9yQWRhcHRvcihJbmRleEl0ZXJhdG9yJiYgaW5kZXhJdGVyYXRv
cikKLSAgICAgICAgICAgIDogbV9pbmRleEl0ZXJhdG9yKFdURk1vdmUoaW5kZXhJdGVyYXRvcikp
Ci0gICAgICAgIHsKLSAgICAgICAgfQotCi0gICAgICAgIFRtcCBvcGVyYXRvciooKSBjb25zdCB7
IHJldHVybiBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgoKm1f
aW5kZXhJdGVyYXRvcik7IH0KLSAgICAgICAgSW5kZXhUb1RtcEl0ZXJhdG9yQWRhcHRvciYgb3Bl
cmF0b3IrKygpIHsgKyttX2luZGV4SXRlcmF0b3I7IHJldHVybiAqdGhpczsgfQotCi0gICAgICAg
IGJvb2wgb3BlcmF0b3I9PShjb25zdCBJbmRleFRvVG1wSXRlcmF0b3JBZGFwdG9yJiBvdGhlcikg
Y29uc3QKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1faW5kZXhJdGVyYXRvciA9PSBv
dGhlci5tX2luZGV4SXRlcmF0b3I7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sIG9wZXJhdG9y
IT0oY29uc3QgSW5kZXhUb1RtcEl0ZXJhdG9yQWRhcHRvciYgb3RoZXIpIGNvbnN0Ci0gICAgICAg
IHsKLSAgICAgICAgICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKLSAgICAgICAgfQotCi0g
ICAgcHJpdmF0ZToKLSAgICAgICAgSW5kZXhJdGVyYXRvciBtX2luZGV4SXRlcmF0b3I7Ci0gICAg
fTsKLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIENvbGxlY3Rpb24+Ci0gICAgY2xhc3MgSW5kZXhU
b1RtcEl0ZXJhYmxlQWRhcHRvciB7Ci0gICAgcHVibGljOgotICAgICAgICBJbmRleFRvVG1wSXRl
cmFibGVBZGFwdG9yKGNvbnN0IENvbGxlY3Rpb24mIGNvbGxlY3Rpb24pCi0gICAgICAgICAgICA6
IG1fY29sbGVjdGlvbihjb2xsZWN0aW9uKQotICAgICAgICB7Ci0gICAgICAgIH0KLQotICAgICAg
ICBJbmRleFRvVG1wSXRlcmF0b3JBZGFwdG9yPHR5cGVuYW1lIENvbGxlY3Rpb246OmNvbnN0X2l0
ZXJhdG9yPiBiZWdpbigpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtX2Nv
bGxlY3Rpb24uYmVnaW4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIEluZGV4VG9UbXBJdGVyYXRv
ckFkYXB0b3I8dHlwZW5hbWUgQ29sbGVjdGlvbjo6Y29uc3RfaXRlcmF0b3I+IGVuZCgpIGNvbnN0
Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtX2NvbGxlY3Rpb24uZW5kKCk7Ci0gICAg
ICAgIH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGNvbnN0IENvbGxlY3Rpb24mIG1fY29sbGVj
dGlvbjsKLSAgICB9OwotCi0gICAgSW5kZXhUb1RtcEl0ZXJhYmxlQWRhcHRvcjxWZWN0b3I8dW5z
aWduZWQ+PiBzcGlsbGVkVG1wcygpIGNvbnN0IHsgcmV0dXJuIG1fc3BpbGxlZFRtcHM7IH0KLQot
ICAgIGJvb2wgcmVxdWlyZXNTcGlsbGluZygpIGNvbnN0IHsgcmV0dXJuICFtX3NwaWxsZWRUbXBz
LmlzRW1wdHkoKTsgfQotCi0gICAgUmVnIGFsbG9jYXRlZFJlZyhUbXAgdG1wKSBjb25zdAotICAg
IHsKLSAgICAgICAgQVNTRVJUKCF0bXAuaXNSZWcoKSk7Ci0gICAgICAgIEFTU0VSVChtX2NvbG9y
ZWRUbXAuc2l6ZSgpKTsKLSAgICAgICAgQVNTRVJUKHRtcC5pc0dQKCkgPT0gKHR5cGUgPT0gQXJn
OjpHUCkpOwotCi0gICAgICAgIFJlZyByZWcgPSBtX2NvbG9yZWRUbXBbQWJzb2x1dGVUbXBNYXBw
ZXI8dHlwZT46OmFic29sdXRlSW5kZXgodG1wKV07Ci0gICAgICAgIGlmICghcmVnKSB7Ci0gICAg
ICAgICAgICBkYXRhTG9nKCJGQVRBTDogTm8gY29sb3IgZm9yICIsIHRtcCwgIlxuIik7Ci0gICAg
ICAgICAgICBkYXRhTG9nKCJDb2RlOlxuIik7Ci0gICAgICAgICAgICBkYXRhTG9nKG1fY29kZSk7
Ci0gICAgICAgICAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICB9Ci0g
ICAgICAgIHJldHVybiByZWc7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIHN0YXRpYyB1bnNpZ25l
ZCB0bXBBcnJheVNpemUoQ29kZSYgY29kZSkKLSAgICB7Ci0gICAgICAgIHVuc2lnbmVkIG51bVRt
cHMgPSBjb2RlLm51bVRtcHModHlwZSk7Ci0gICAgICAgIHJldHVybiBBYnNvbHV0ZVRtcE1hcHBl
cjx0eXBlPjo6YWJzb2x1dGVJbmRleChudW1UbXBzKTsKLSAgICB9Ci0KLSAgICB2b2lkIGluaXRp
YWxpemVQcmVjb2xvcmVkVG1wKCkKLSAgICB7Ci0gICAgICAgIG1fY29sb3JlZFRtcC5yZXNpemUo
bV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXggKyAxKTsKLSAgICAgICAgZm9yICh1bnNpZ25l
ZCBpID0gMTsgaSA8PSBtX2xhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleDsgKytpKSB7Ci0gICAg
ICAgICAgICBUbXAgdG1wID0gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0
ZUluZGV4KGkpOwotICAgICAgICAgICAgQVNTRVJUKHRtcC5pc1JlZygpKTsKLSAgICAgICAgICAg
IG1fY29sb3JlZFRtcFtpXSA9IHRtcC5yZWcoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGJv
b2wgbWF5QmVDb2FsZXNjZWQoQXJnIGxlZnQsIEFyZyByaWdodCkKLSAgICB7Ci0gICAgICAgIGlm
ICghbGVmdC5pc1RtcCgpIHx8ICFyaWdodC5pc1RtcCgpKQotICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOwotCi0gICAgICAgIFRtcCBsZWZ0VG1wID0gbGVmdC50bXAoKTsKLSAgICAgICAgVG1wIHJp
Z2h0VG1wID0gcmlnaHQudG1wKCk7Ci0KLSAgICAgICAgaWYgKGxlZnRUbXAgPT0gcmlnaHRUbXAp
Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYgKGxlZnRUbXAuaXNHUCgp
ICE9ICh0eXBlID09IEFyZzo6R1ApIHx8IHJpZ2h0VG1wLmlzR1AoKSAhPSAodHlwZSA9PSBBcmc6
OkdQKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICB1bnNpZ25lZCBsZWZ0
SW5kZXggPSBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChsZWZ0VG1wKTsK
LSAgICAgICAgdW5zaWduZWQgcmlnaHRJbmRleCA9IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojph
YnNvbHV0ZUluZGV4KHJpZ2h0VG1wKTsKLQotICAgICAgICByZXR1cm4gIW1faW50ZXJmZXJlbmNl
RWRnZXMuY29udGFpbnMoSW50ZXJmZXJlbmNlRWRnZShsZWZ0SW5kZXgsIHJpZ2h0SW5kZXgpKTsK
LSAgICB9Ci0KLSAgICB2b2lkIGFkZFRvTG93UHJpb3JpdHlDb2FsZXNjaW5nQ2FuZGlkYXRlcyhB
cmcgbGVmdCwgQXJnIHJpZ2h0KQotICAgIHsKLSAgICAgICAgQVNTRVJUKG1heUJlQ29hbGVzY2Vk
KGxlZnQsIHJpZ2h0KSk7Ci0gICAgICAgIFRtcCBsZWZ0VG1wID0gbGVmdC50bXAoKTsKLSAgICAg
ICAgVG1wIHJpZ2h0VG1wID0gcmlnaHQudG1wKCk7Ci0KLSAgICAgICAgdW5zaWduZWQgbGVmdElu
ZGV4ID0gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgobGVmdFRtcCk7Ci0g
ICAgICAgIHVuc2lnbmVkIHJpZ2h0SW5kZXggPSBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJz
b2x1dGVJbmRleChyaWdodFRtcCk7Ci0KLSAgICAgICAgdW5zaWduZWQgbmV4dE1vdmVJbmRleCA9
IG1fY29hbGVzY2luZ0NhbmRpZGF0ZXMuc2l6ZSgpOwotICAgICAgICBtX2NvYWxlc2NpbmdDYW5k
aWRhdGVzLmFwcGVuZCh7IGxlZnRJbmRleCwgcmlnaHRJbmRleCB9KTsKLQotICAgICAgICB1bnNp
Z25lZCBuZXdJbmRleEluV29ya2xpc3QgPSBtX3dvcmtsaXN0TW92ZXMuYWRkTG93UHJpb3JpdHlN
b3ZlKCk7Ci0gICAgICAgIEFTU0VSVF9VTlVTRUQobmV3SW5kZXhJbldvcmtsaXN0LCBuZXdJbmRl
eEluV29ya2xpc3QgPT0gbmV4dE1vdmVJbmRleCk7Ci0KLSAgICAgICAgQVNTRVJUKG5leHRNb3Zl
SW5kZXggPD0gbV9hY3RpdmVNb3Zlcy5zaXplKCkpOwotICAgICAgICBtX2FjdGl2ZU1vdmVzLmVu
c3VyZVNpemUobmV4dE1vdmVJbmRleCArIDEpOwotCi0gICAgICAgIG1fbW92ZUxpc3RbbGVmdElu
ZGV4XS5hZGQobmV4dE1vdmVJbmRleCk7Ci0gICAgICAgIG1fbW92ZUxpc3RbcmlnaHRJbmRleF0u
YWRkKG5leHRNb3ZlSW5kZXgpOwotICAgIH0KLQotICAgIHZvaWQgYnVpbGQoKQotICAgIHsKLSAg
ICAgICAgVG1wTGl2ZW5lc3M8dHlwZT4gbGl2ZW5lc3MobV9jb2RlKTsKLSAgICAgICAgZm9yIChC
YXNpY0Jsb2NrKiBibG9jayA6IG1fY29kZSkgewotICAgICAgICAgICAgdHlwZW5hbWUgVG1wTGl2
ZW5lc3M8dHlwZT46OkxvY2FsQ2FsYyBsb2NhbENhbGMobGl2ZW5lc3MsIGJsb2NrKTsKLSAgICAg
ICAgICAgIGZvciAodW5zaWduZWQgaW5zdEluZGV4ID0gYmxvY2stPnNpemUoKTsgaW5zdEluZGV4
LS07KSB7Ci0gICAgICAgICAgICAgICAgSW5zdCYgaW5zdCA9IGJsb2NrLT5hdChpbnN0SW5kZXgp
OwotICAgICAgICAgICAgICAgIEluc3QqIG5leHRJbnN0ID0gYmxvY2stPmdldChpbnN0SW5kZXgg
KyAxKTsKLSAgICAgICAgICAgICAgICBidWlsZCgmaW5zdCwgbmV4dEluc3QsIGxvY2FsQ2FsYyk7
Ci0gICAgICAgICAgICAgICAgbG9jYWxDYWxjLmV4ZWN1dGUoaW5zdEluZGV4KTsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIGJ1aWxkKG51bGxwdHIsICZibG9jay0+YXQoMCksIGxvY2FsQ2Fs
Yyk7Ci0gICAgICAgIH0KLSAgICAgICAgYnVpbGRMb3dQcmlvcml0eU1vdmVMaXN0KCk7Ci0gICAg
fQotCi0gICAgdm9pZCBidWlsZChJbnN0KiBwcmV2SW5zdCwgSW5zdCogbmV4dEluc3QsIGNvbnN0
IHR5cGVuYW1lIFRtcExpdmVuZXNzPHR5cGU+OjpMb2NhbENhbGMmIGxvY2FsQ2FsYykKLSAgICB7
Ci0gICAgICAgIGlmICh0cmFjZURlYnVnKQotICAgICAgICAgICAgZGF0YUxvZygiQnVpbGRpbmcg
YmV0d2VlbiAiLCBwb2ludGVyRHVtcChwcmV2SW5zdCksICIgYW5kICIsIHBvaW50ZXJEdW1wKG5l
eHRJbnN0KSwgIjpcbiIpOwotICAgICAgICBJbnN0Ojpmb3JFYWNoRGVmV2l0aEV4dHJhQ2xvYmJl
cmVkUmVnczxUbXA+KAotICAgICAgICAgICAgcHJldkluc3QsIG5leHRJbnN0LAotICAgICAgICAg
ICAgWyZdIChjb25zdCBUbXAmIGFyZywgQXJnOjpSb2xlLCBBcmc6OlR5cGUgYXJnVHlwZSwgQXJn
OjpXaWR0aCkgewotICAgICAgICAgICAgICAgIGlmIChhcmdUeXBlICE9IHR5cGUpCi0gICAgICAg
ICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAv
LyBBbGwgdGhlIERlZigpcyBpbnRlcmZlcmUgd2l0aCBlYWNoIG90aGVyIGFuZCB3aXRoIGFsbCB0
aGUgZXh0cmEgY2xvYmJlcmVkIFRtcHMuCi0gICAgICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIG5v
dCB1c2UgZm9yRWFjaERlZldpdGhFeHRyYUNsb2JiZXJlZFJlZ3MoKSBoZXJlIHNpbmNlIGNvbG9y
ZWQgVG1wcwotICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBuZWVkIGludGVyZmVyZW5jZSBlZGdl
cyBpbiBvdXIgaW1wbGVtZW50YXRpb24uCi0gICAgICAgICAgICAgICAgSW5zdDo6Zm9yRWFjaERl
ZjxUbXA+KAotICAgICAgICAgICAgICAgICAgICBwcmV2SW5zdCwgbmV4dEluc3QsCi0gICAgICAg
ICAgICAgICAgICAgIFsmXSAoVG1wJiBvdGhlckFyZywgQXJnOjpSb2xlLCBBcmc6OlR5cGUgYXJn
VHlwZSwgQXJnOjpXaWR0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ1R5cGUg
IT0gdHlwZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAg
ICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICBBZGRpbmcgZGVmLWRlZiBl
ZGdlOiAiLCBhcmcsICIsICIsIG90aGVyQXJnLCAiXG4iKTsKLSAgICAgICAgICAgICAgICAgICAg
ICAgIHRoaXMtPmFkZEVkZ2UoYXJnLCBvdGhlckFyZyk7Ci0gICAgICAgICAgICAgICAgICAgIH0p
OwotICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgaWYgKHByZXZJbnN0ICYmIG1heUJlQ29hbGVz
Y2FibGUoKnByZXZJbnN0KSkgewotICAgICAgICAgICAgLy8gV2UgZG8gbm90IHdhbnQgdGhlIFVz
ZSgpIG9mIHRoaXMgbW92ZSB0byBpbnRlcmZlcmUgd2l0aCB0aGUgRGVmKCksIGV2ZW4gaWYgaXQg
aXMgbGl2ZQotICAgICAgICAgICAgLy8gYWZ0ZXIgdGhlIE1vdmUuIElmIHdlIHdlcmUgdG8gYWRk
IHRoZSBpbnRlcmZlcmVuY2UgZWRnZSwgaXQgd291bGQgYmUgaW1wb3NzaWJsZSB0bwotICAgICAg
ICAgICAgLy8gY29hbGVzY2UgdGhlIE1vdmUgZXZlbiBpZiB0aGUgdHdvIFRtcCBuZXZlciBpbnRl
cmZlcmUgYW55d2hlcmUuCi0gICAgICAgICAgICBUbXAgZGVmVG1wOwotICAgICAgICAgICAgVG1w
IHVzZVRtcDsKLSAgICAgICAgICAgIHByZXZJbnN0LT5mb3JFYWNoVG1wKFsmZGVmVG1wLCAmdXNl
VG1wXSAoVG1wJiBhcmdUbXAsIEFyZzo6Um9sZSByb2xlLCBBcmc6OlR5cGUsIEFyZzo6V2lkdGgp
IHsKLSAgICAgICAgICAgICAgICBpZiAoQXJnOjppc0xhdGVEZWYocm9sZSkpCi0gICAgICAgICAg
ICAgICAgICAgIGRlZlRtcCA9IGFyZ1RtcDsKLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAg
ICAgICAgICAgICAgICAgQVNTRVJUKEFyZzo6aXNFYXJseVVzZShyb2xlKSk7Ci0gICAgICAgICAg
ICAgICAgICAgIHVzZVRtcCA9IGFyZ1RtcDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICB9KTsKLSAgICAgICAgICAgIEFTU0VSVChkZWZUbXApOwotICAgICAgICAgICAgQVNTRVJUKHVz
ZVRtcCk7Ci0KLSAgICAgICAgICAgIHVuc2lnbmVkIG5leHRNb3ZlSW5kZXggPSBtX2NvYWxlc2Np
bmdDYW5kaWRhdGVzLnNpemUoKTsKLSAgICAgICAgICAgIG1fY29hbGVzY2luZ0NhbmRpZGF0ZXMu
YXBwZW5kKHsgQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodXNlVG1wKSwg
QWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgoZGVmVG1wKSB9KTsKLQotICAg
ICAgICAgICAgdW5zaWduZWQgbmV3SW5kZXhJbldvcmtsaXN0ID0gbV93b3JrbGlzdE1vdmVzLmFk
ZE1vdmUoKTsKLSAgICAgICAgICAgIEFTU0VSVF9VTlVTRUQobmV3SW5kZXhJbldvcmtsaXN0LCBu
ZXdJbmRleEluV29ya2xpc3QgPT0gbmV4dE1vdmVJbmRleCk7Ci0KLSAgICAgICAgICAgIEFTU0VS
VChuZXh0TW92ZUluZGV4IDw9IG1fYWN0aXZlTW92ZXMuc2l6ZSgpKTsKLSAgICAgICAgICAgIG1f
YWN0aXZlTW92ZXMuZW5zdXJlU2l6ZShuZXh0TW92ZUluZGV4ICsgMSk7Ci0KLSAgICAgICAgICAg
IGZvciAoY29uc3QgQXJnJiBhcmcgOiBwcmV2SW5zdC0+YXJncykgewotICAgICAgICAgICAgICAg
IGF1dG8mIGxpc3QgPSBtX21vdmVMaXN0W0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0
ZUluZGV4KGFyZy50bXAoKSldOwotICAgICAgICAgICAgICAgIGxpc3QuYWRkKG5leHRNb3ZlSW5k
ZXgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKGNvbnN0IFRtcCYgbGl2ZVRt
cCA6IGxvY2FsQ2FsYy5saXZlKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAobGl2ZVRtcCAhPSB1
c2VUbXApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpCi0gICAgICAgICAg
ICAgICAgICAgICAgICBkYXRhTG9nKCIgICAgQWRkaW5nIGRlZi1saXZlIGZvciBjb2FsZXNjYWJs
ZTogIiwgZGVmVG1wLCAiLCAiLCBsaXZlVG1wLCAiXG4iKTsKLSAgICAgICAgICAgICAgICAgICAg
YWRkRWRnZShkZWZUbXAsIGxpdmVUbXApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAg
IH0KLQotICAgICAgICAgICAgLy8gVGhlIG5leHQgaW5zdHJ1Y3Rpb24gY291bGQgaGF2ZSBlYXJs
eSBjbG9iYmVycyBvciBlYXJseSBkZWYncy4gV2UgbmVlZCB0byBjb25zaWRlcgotICAgICAgICAg
ICAgLy8gdGhvc2Ugbm93LgotICAgICAgICAgICAgYWRkRWRnZXMobnVsbHB0ciwgbmV4dEluc3Qs
IGxvY2FsQ2FsYy5saXZlKCkpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIGFkZEVkZ2Vz
KHByZXZJbnN0LCBuZXh0SW5zdCwgbG9jYWxDYWxjLmxpdmUoKSk7Ci0gICAgfQotCi0gICAgdm9p
ZCBidWlsZExvd1ByaW9yaXR5TW92ZUxpc3QoKQotICAgIHsKLSAgICAgICAgaWYgKCFpc1g4Nigp
KQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIG1fd29ya2xpc3RNb3Zlcy5zdGFydEFk
ZGluZ0xvd1ByaW9yaXR5TW92ZXMoKTsKLSAgICAgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6
IG1fY29kZSkgewotICAgICAgICAgICAgZm9yIChJbnN0JiBpbnN0IDogKmJsb2NrKSB7Ci0gICAg
ICAgICAgICAgICAgaWYgKHN0ZDo6b3B0aW9uYWw8dW5zaWduZWQ+IGRlZkFyZ0luZGV4ID0gaW5z
dC5zaG91bGRUcnlBbGlhc2luZ0RlZigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFyZyBvcDEg
PSBpbnN0LmFyZ3NbKmRlZkFyZ0luZGV4IC0gMl07Ci0gICAgICAgICAgICAgICAgICAgIEFyZyBv
cDIgPSBpbnN0LmFyZ3NbKmRlZkFyZ0luZGV4IC0gMV07Ci0gICAgICAgICAgICAgICAgICAgIEFy
ZyBkZXN0ID0gaW5zdC5hcmdzWypkZWZBcmdJbmRleF07Ci0KLSAgICAgICAgICAgICAgICAgICAg
aWYgKG9wMSA9PSBkZXN0IHx8IG9wMiA9PSBkZXN0KQotICAgICAgICAgICAgICAgICAgICAgICAg
Y29udGludWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1heUJlQ29hbGVzY2VkKG9wMSwg
ZGVzdCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBhZGRUb0xvd1ByaW9yaXR5Q29hbGVzY2lu
Z0NhbmRpZGF0ZXMob3AxLCBkZXN0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9wMSAhPSBv
cDIgJiYgbWF5QmVDb2FsZXNjZWQob3AyLCBkZXN0KSkKLSAgICAgICAgICAgICAgICAgICAgICAg
IGFkZFRvTG93UHJpb3JpdHlDb2FsZXNjaW5nQ2FuZGlkYXRlcyhvcDIsIGRlc3QpOwotICAgICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQg
YWRkRWRnZXMoSW5zdCogcHJldkluc3QsIEluc3QqIG5leHRJbnN0LCB0eXBlbmFtZSBUbXBMaXZl
bmVzczx0eXBlPjo6TG9jYWxDYWxjOjpJdGVyYWJsZSBsaXZlVG1wcykKLSAgICB7Ci0gICAgICAg
IC8vIEFsbCB0aGUgRGVmKClzIGludGVyZmVyZSB3aXRoIGV2ZXJ0aGluZyBsaXZlLgotICAgICAg
ICBJbnN0Ojpmb3JFYWNoRGVmV2l0aEV4dHJhQ2xvYmJlcmVkUmVnczxUbXA+KAotICAgICAgICAg
ICAgcHJldkluc3QsIG5leHRJbnN0LAotICAgICAgICAgICAgWyZdIChjb25zdCBUbXAmIGFyZywg
QXJnOjpSb2xlLCBBcmc6OlR5cGUgYXJnVHlwZSwgQXJnOjpXaWR0aCkgewotICAgICAgICAgICAg
ICAgIGlmIChhcmdUeXBlICE9IHR5cGUpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAg
ICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFRtcCYgbGl2ZVRtcCA6
IGxpdmVUbXBzKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFTU0VSVChsaXZlVG1wLmlzR1AoKSA9
PSAodHlwZSA9PSBBcmc6OkdQKSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAg
ICAgICAgICBpZiAodHJhY2VEZWJ1ZykKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFMb2co
IiAgICBBZGRpbmcgZGVmLWxpdmUgZWRnZTogIiwgYXJnLCAiLCAiLCBsaXZlVG1wLCAiXG4iKTsK
LSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGFkZEVkZ2UoYXJnLCBs
aXZlVG1wKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAodHlwZSA9
PSBBcmc6OkdQICYmICFhcmcuaXNHUFIoKSkKLSAgICAgICAgICAgICAgICAgICAgbV9pbnRlcmZl
cmVzV2l0aEZyYW1lUG9pbnRlci5xdWlja1NldChBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJz
b2x1dGVJbmRleChhcmcpKTsKLSAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIHZvaWQgYWRk
RWRnZShUbXAgYSwgVG1wIGIpCi0gICAgewotICAgICAgICBBU1NFUlRfV0lUSF9NRVNTQUdFKGEu
aXNHUCgpID09IGIuaXNHUCgpLCAiQW4gaW50ZXJmZXJlbmNlIGJldHdlZW4gcmVnaXN0ZXJzIG9m
IGRpZmZlcmVudCB0eXBlcyBkb2VzIG5vdCBtYWtlIHNlbnNlLCBpdCBjYW4gbGVhZCB0byBub24t
Y29sb3JhYmxlIGdyYXBocy4iKTsKLQotICAgICAgICBhZGRFZGdlKEFic29sdXRlVG1wTWFwcGVy
PHR5cGU+OjphYnNvbHV0ZUluZGV4KGEpLCBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1
dGVJbmRleChiKSk7Ci0gICAgfQotCi0gICAgLy8gQ2FsbGluZyB0aGlzIHdpdGhvdXQgYSB0bXBX
aWR0aCB3aWxsIHBlcmZvcm0gYSBtb3JlIGNvbnNlcnZhdGl2ZSBjb2FsZXNjaW5nIGFuYWx5c2lz
IHRoYXQgYXNzdW1lcwotICAgIC8vIHRoYXQgTW92ZTMyJ3MgYXJlIG5vdCBjb2FsZXNjYWJsZS4K
LSAgICBzdGF0aWMgYm9vbCBtYXlCZUNvYWxlc2NhYmxlSW1wbChjb25zdCBJbnN0JiBpbnN0LCBU
bXBXaWR0aCogdG1wV2lkdGgpCi0gICAgewotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAg
ICAgY2FzZSBBcmc6OkdQOgotICAgICAgICAgICAgc3dpdGNoIChpbnN0LmtpbmQub3Bjb2RlKSB7
Ci0gICAgICAgICAgICBjYXNlIE1vdmU6Ci0gICAgICAgICAgICBjYXNlIE1vdmUzMjoKLSAgICAg
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
IGNhc2UgQXJnOjpGUDoKLSAgICAgICAgICAgIHN3aXRjaCAoaW5zdC5raW5kLm9wY29kZSkgewot
ICAgICAgICAgICAgY2FzZSBNb3ZlRmxvYXQ6Ci0gICAgICAgICAgICBjYXNlIE1vdmVEb3VibGU6
Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICB9Ci0KLSAgICAgICAgQVNTRVJUX1dJVEhfTUVTU0FHRShpbnN0LmFyZ3Muc2l6ZSgp
ID09IDIsICJXZSBhc3N1bWUgY29hbGVjYWJsZSBtb3ZlcyBvbmx5IGhhdmUgdHdvIGFyZ3VtZW50
cyBpbiBhIGZldyBwbGFjZXMuIik7Ci0KLSAgICAgICAgaWYgKCFpbnN0LmFyZ3NbMF0uaXNUbXAo
KSB8fCAhaW5zdC5hcmdzWzFdLmlzVG1wKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0K
LSAgICAgICAgQVNTRVJUKGluc3QuYXJnc1swXS50eXBlKCkgPT0gdHlwZSk7Ci0gICAgICAgIEFT
U0VSVChpbnN0LmFyZ3NbMV0udHlwZSgpID09IHR5cGUpOwotCi0gICAgICAgIC8vIFdlIGNhbiBj
b2FsZXNjZSBhIE1vdmUzMiBzbyBsb25nIGFzIGVpdGhlciBvZiB0aGUgZm9sbG93aW5nIGhvbGRz
OgotICAgICAgICAvLyAtIFRoZSBpbnB1dCBpcyBhbHJlYWR5IHplcm8tZmlsbGVkLgotICAgICAg
ICAvLyAtIFRoZSBvdXRwdXQgb25seSBjYXJlcyBhYm91dCB0aGUgbG93IDMyIGJpdHMuCi0gICAg
ICAgIC8vCi0gICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgaW5wdXQgcHJvcGVydHkgcmVxdWlyZXMg
YW4gYW5hbHlzaXMgb3ZlciBaRGVmJ3MsIHNvIGl0J3Mgb25seSB2YWxpZCBzbyBsb25nCi0gICAg
ICAgIC8vIGFzIHRoZSBpbnB1dCBnZXRzIGEgcmVnaXN0ZXIuIFdlIGRvbid0IGtub3cgaWYgdGhl
IGlucHV0IGdldHMgYSByZWdpc3RlciwgYnV0IHdlIGRvIGtub3cKLSAgICAgICAgLy8gdGhhdCBp
ZiBpdCBkb2Vzbid0IGdldCBhIHJlZ2lzdGVyIHRoZW4gd2Ugd2lsbCBzdGlsbCBlbWl0IHRoaXMg
TW92ZTMyLgotICAgICAgICBpZiAoaW5zdC5raW5kLm9wY29kZSA9PSBNb3ZlMzIpIHsKLSAgICAg
ICAgICAgIGlmICghdG1wV2lkdGgpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0g
ICAgICAgICAgICBpZiAodG1wV2lkdGgtPmRlZldpZHRoKGluc3QuYXJnc1swXS50bXAoKSkgPiBB
cmc6OldpZHRoMzIKLSAgICAgICAgICAgICAgICAmJiB0bXBXaWR0aC0+dXNlV2lkdGgoaW5zdC5h
cmdzWzFdLnRtcCgpKSA+IEFyZzo6V2lkdGgzMikKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFs
c2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQot
ICAgIHZvaWQgc2VsZWN0U3BpbGwoKQotICAgIHsKLSAgICAgICAgaWYgKCFtX2hhc1NlbGVjdGVk
U3BpbGwpIHsKLSAgICAgICAgICAgIG1faGFzU2VsZWN0ZWRTcGlsbCA9IHRydWU7Ci0KLSAgICAg
ICAgICAgIGlmIChtX2hhc0NvYWxlc2NlZE5vblRyaXZpYWxNb3ZlKQotICAgICAgICAgICAgICAg
IG1fY29hbGVzY2VkVG1wc0F0U3BpbGwgPSBtX2NvYWxlc2NlZFRtcHM7Ci0gICAgICAgIH0KLQot
ICAgICAgICBhdXRvIGl0ZXJhdG9yID0gbV9zcGlsbFdvcmtsaXN0LmJlZ2luKCk7Ci0KLSAgICAg
ICAgUkVMRUFTRV9BU1NFUlRfV0lUSF9NRVNTQUdFKGl0ZXJhdG9yICE9IG1fc3BpbGxXb3JrbGlz
dC5lbmQoKSwgInNlbGVjdFNwaWxsKCkgY2FsbGVkIHdoZW4gdGhlcmUgd2FzIG5vIHNwaWxsLiIp
OwotICAgICAgICBSRUxFQVNFX0FTU0VSVF9XSVRIX01FU1NBR0UoIW1fdW5zcGlsbGFibGVUbXBz
LmNvbnRhaW5zKCppdGVyYXRvciksICJ0cnlpbmcgdG8gc3BpbGwgdW5zcGlsbGFibGUgdG1wIik7
Ci0KLSAgICAgICAgLy8gSGlnaGVyIHNjb3JlIG1lYW5zIG1vcmUgZGVzaXJhYmxlIHRvIHNwaWxs
LiBMb3dlciBzY29yZXMgbWF4aW1pemUgdGhlIGxpa2VsaWhvb2QgdGhhdCBhIHRtcAotICAgICAg
ICAvLyBnZXRzIGEgcmVnaXN0ZXIuCi0gICAgICAgIGF1dG8gc2NvcmUgPSBbJl0gKFRtcCB0bXAp
IC0+IGRvdWJsZSB7Ci0gICAgICAgICAgICAvLyBBaXIgZXhwb3NlcyB0aGUgY29uY2VwdCBvZiAi
ZmFzdCB0bXBzIiwgYW5kIHdlIGludGVycHJldCB0aGF0IHRvIG1lYW4gdGhhdCB0aGUgdG1wCi0g
ICAgICAgICAgICAvLyBzaG91bGQgYWx3YXlzIGJlIGluIGEgcmVnaXN0ZXIuCi0gICAgICAgICAg
ICBpZiAobV9jb2RlLmlzRmFzdFRtcCh0bXApKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwot
ICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBBbGwgZWxzZSBiZWluZyBlcXVhbCwgdGhlIHNj
b3JlIHNob3VsZCBiZSBkaXJlY3RseSByZWxhdGVkIHRvIHRoZSBkZWdyZWUuCi0gICAgICAgICAg
ICBkb3VibGUgZGVncmVlID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihtX2RlZ3JlZXNbQWJzb2x1dGVU
bXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodG1wKV0pOwotCi0gICAgICAgICAgICAvLyBB
bGwgZWxzZSBiZWluZyBlcXVhbCwgdGhlIHNjb3JlIHNob3VsZCBiZSBpbnZlcnNlbHkgcmVsYXRl
ZCB0byB0aGUgbnVtYmVyIG9mIHdhcm0gdXNlcyBhbmQKLSAgICAgICAgICAgIC8vIGRlZnMuCi0g
ICAgICAgICAgICBjb25zdCBVc2VDb3VudHM8VG1wPjo6Q291bnRzKiBjb3VudHMgPSBtX3VzZUNv
dW50c1t0bXBdOwotICAgICAgICAgICAgaWYgKCFjb3VudHMpCi0gICAgICAgICAgICAgICAgcmV0
dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKTsKLSAgICAgICAgICAg
IAotICAgICAgICAgICAgZG91YmxlIHVzZXMgPSBjb3VudHMtPm51bVdhcm1Vc2VzICsgY291bnRz
LT5udW1EZWZzOwotCi0gICAgICAgICAgICAvLyBJZiBpdCdzIGEgY29uc3RhbnQsIHRoZW4gaXQn
cyBub3QgYXMgYmFkIHRvIHNwaWxsLiBXZSBjYW4gcmVtYXRlcmlhbGl6ZSBpdCBpbiBtYW55Ci0g
ICAgICAgICAgICAvLyBjYXNlcy4KLSAgICAgICAgICAgIGlmIChjb3VudHMtPm51bUNvbnN0RGVm
cyA9PSAxICYmIGNvdW50cy0+bnVtRGVmcyA9PSAxKQotICAgICAgICAgICAgICAgIHVzZXMgLz0g
MjsKLQotICAgICAgICAgICAgcmV0dXJuIGRlZ3JlZSAvIHVzZXM7Ci0gICAgICAgIH07Ci0KLSAg
ICAgICAgYXV0byB2aWN0aW1JdGVyYXRvciA9IGl0ZXJhdG9yOwotICAgICAgICBkb3VibGUgbWF4
U2NvcmUgPSBzY29yZShBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5k
ZXgoKml0ZXJhdG9yKSk7Ci0KLSAgICAgICAgKytpdGVyYXRvcjsKLSAgICAgICAgZm9yICg7aXRl
cmF0b3IgIT0gbV9zcGlsbFdvcmtsaXN0LmVuZCgpOyArK2l0ZXJhdG9yKSB7Ci0gICAgICAgICAg
ICBkb3VibGUgdG1wU2NvcmUgPSBzY29yZShBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJv
bUFic29sdXRlSW5kZXgoKml0ZXJhdG9yKSk7Ci0gICAgICAgICAgICBpZiAodG1wU2NvcmUgPiBt
YXhTY29yZSkgewotICAgICAgICAgICAgICAgIEFTU0VSVCghbV91bnNwaWxsYWJsZVRtcHMuY29u
dGFpbnMoKml0ZXJhdG9yKSk7Ci0gICAgICAgICAgICAgICAgdmljdGltSXRlcmF0b3IgPSBpdGVy
YXRvcjsKLSAgICAgICAgICAgICAgICBtYXhTY29yZSA9IHRtcFNjb3JlOwotICAgICAgICAgICAg
fQotICAgICAgICB9Ci0KLSAgICAgICAgdW5zaWduZWQgdmljdGltSW5kZXggPSAqdmljdGltSXRl
cmF0b3I7Ci0gICAgICAgIG1fc3BpbGxXb3JrbGlzdC5yZW1vdmUodmljdGltSXRlcmF0b3IpOwot
ICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuYXBwZW5kKHZpY3RpbUluZGV4KTsKLQotICAgICAg
ICBmcmVlemVNb3Zlcyh2aWN0aW1JbmRleCk7Ci0gICAgfQotCi0gICAgdm9pZCBhbGxvY2F0ZSgp
Ci0gICAgewotICAgICAgICBBU1NFUlRfV0lUSF9NRVNTQUdFKG1fYWN0aXZlTW92ZXMuc2l6ZSgp
ID49IG1fY29hbGVzY2luZ0NhbmRpZGF0ZXMuc2l6ZSgpLCAiVGhlIGFjdGl2ZU1vdmUgc2V0IHNo
b3VsZCBiZSBiaWcgZW5vdWdoIGZvciB0aGUgcXVpY2sgb3BlcmF0aW9ucyBvZiBCaXRWZWN0b3Iu
Iik7Ci0KLSAgICAgICAgbWFrZVdvcmtMaXN0KCk7Ci0KLSAgICAgICAgaWYgKGRlYnVnKSB7Ci0g
ICAgICAgICAgICBkYXRhTG9nKCJJbnRlcmZlcmVuY2U6ICIsIGxpc3REdW1wKG1faW50ZXJmZXJl
bmNlRWRnZXMpLCAiXG4iKTsKLSAgICAgICAgICAgIGR1bXBJbnRlcmZlcmVuY2VHcmFwaEluRG90
KFdURjo6ZGF0YUZpbGUoKSk7Ci0gICAgICAgICAgICBkYXRhTG9nKCJDb2FsZXNjaW5nIGNhbmRp
ZGF0ZXM6XG4iKTsKLSAgICAgICAgICAgIGZvciAoTW92ZU9wZXJhbmRzJiBtb3ZlT3AgOiBtX2Nv
YWxlc2NpbmdDYW5kaWRhdGVzKSB7Ci0gICAgICAgICAgICAgICAgZGF0YUxvZygiICAgICIsIEFi
c29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleChtb3ZlT3Auc3JjSW5k
ZXgpLAotICAgICAgICAgICAgICAgICAgICAiIC0+ICIsIEFic29sdXRlVG1wTWFwcGVyPHR5cGU+
Ojp0bXBGcm9tQWJzb2x1dGVJbmRleChtb3ZlT3AuZHN0SW5kZXgpLCAiXG4iKTsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIGRhdGFMb2coIkluaXRpYWwgd29yayBsaXN0XG4iKTsKLSAgICAg
ICAgICAgIGR1bXBXb3JrTGlzdHMoV1RGOjpkYXRhRmlsZSgpKTsKLSAgICAgICAgfQotCi0gICAg
ICAgIGRvIHsKLSAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKSB7Ci0gICAgICAgICAgICAgICAg
ZGF0YUxvZygiQmVmb3JlIEdyYXBoIHNpbXBsaWZpY2F0aW9uIGl0ZXJhdGlvblxuIik7Ci0gICAg
ICAgICAgICAgICAgZHVtcFdvcmtMaXN0cyhXVEY6OmRhdGFGaWxlKCkpOwotICAgICAgICAgICAg
fQotCi0gICAgICAgICAgICBpZiAoIW1fc2ltcGxpZnlXb3JrbGlzdC5pc0VtcHR5KCkpCi0gICAg
ICAgICAgICAgICAgc2ltcGxpZnkoKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKCFtX3dvcmtsaXN0
TW92ZXMuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIGNvYWxlc2NlKCk7Ci0gICAgICAgICAg
ICBlbHNlIGlmICghbV9mcmVlemVXb3JrbGlzdC5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAg
ZnJlZXplKCk7Ci0gICAgICAgICAgICBlbHNlIGlmICghbV9zcGlsbFdvcmtsaXN0LmlzRW1wdHko
KSkKLSAgICAgICAgICAgICAgICBzZWxlY3RTcGlsbCgpOwotCi0gICAgICAgICAgICBpZiAodHJh
Y2VEZWJ1ZykgewotICAgICAgICAgICAgICAgIGRhdGFMb2coIkFmdGVyIEdyYXBoIHNpbXBsaWZp
Y2F0aW9uIGl0ZXJhdGlvblxuIik7Ci0gICAgICAgICAgICAgICAgZHVtcFdvcmtMaXN0cyhXVEY6
OmRhdGFGaWxlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlICghbV9zaW1wbGlm
eVdvcmtsaXN0LmlzRW1wdHkoKSB8fCAhbV93b3JrbGlzdE1vdmVzLmlzRW1wdHkoKSB8fCAhbV9m
cmVlemVXb3JrbGlzdC5pc0VtcHR5KCkgfHwgIW1fc3BpbGxXb3JrbGlzdC5pc0VtcHR5KCkpOwot
Ci0gICAgICAgIGFzc2lnbkNvbG9ycygpOwotICAgIH0KLQotI2lmIFBMQVRGT1JNKENPQ09BKQot
I3ByYWdtYSBtYXJrIC0gRGVidWdnaW5nIGhlbHBlcnMuCi0jZW5kaWYKLQotICAgIHZvaWQgZHVt
cEludGVyZmVyZW5jZUdyYXBoSW5Eb3QoUHJpbnRTdHJlYW0mIG91dCkKLSAgICB7Ci0gICAgICAg
IG91dC5wcmludCgiZ3JhcGggSW50ZXJmZXJlbmNlR3JhcGggeyBcbiIpOwotCi0gICAgICAgIEhh
c2hTZXQ8VG1wPiB0bXBzV2l0aEludGVyZmVyZW5jZXM7Ci0gICAgICAgIGZvciAoY29uc3QgYXV0
byYgZWRnZSA6IG1faW50ZXJmZXJlbmNlRWRnZXMpIHsKLSAgICAgICAgICAgIHRtcHNXaXRoSW50
ZXJmZXJlbmNlcy5hZGQoQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUlu
ZGV4KGVkZ2UuZmlyc3QoKSkpOwotICAgICAgICAgICAgdG1wc1dpdGhJbnRlcmZlcmVuY2VzLmFk
ZChBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgoZWRnZS5zZWNv
bmQoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiB0bXAgOiB0bXBz
V2l0aEludGVyZmVyZW5jZXMpIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIHRtcEluZGV4ID0gQWJz
b2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodG1wKTsKLSAgICAgICAgICAgIGlm
ICh0bXBJbmRleCA8IG1fZGVncmVlcy5zaXplKCkpCi0gICAgICAgICAgICAgICAgb3V0LnByaW50
KCIgICAgIiwgdG1wLmludGVybmFsVmFsdWUoKSwgIiBbbGFiZWw9XCIiLCB0bXAsICIgKCIsIG1f
ZGVncmVlc1t0bXBJbmRleF0sICIpXCJdO1xuIik7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAg
ICAgICAgICAgb3V0LnByaW50KCIgICAgIiwgdG1wLmludGVybmFsVmFsdWUoKSwgIiBbbGFiZWw9
XCIiLCB0bXAsICJcIl07XG4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoY29uc3QgYXV0
byYgZWRnZSA6IG1faW50ZXJmZXJlbmNlRWRnZXMpCi0gICAgICAgICAgICBvdXQucHJpbnQoIiAg
ICAiLCBlZGdlLmZpcnN0KCksICIgLS0gIiwgZWRnZS5zZWNvbmQoKSwgIjtcbiIpOwotICAgICAg
ICBvdXQucHJpbnQoIn1cbiIpOwotICAgIH0KLQotICAgIHZvaWQgZHVtcFdvcmtMaXN0cyhQcmlu
dFN0cmVhbSYgb3V0KQotICAgIHsKLSAgICAgICAgb3V0LnByaW50KCJTaW1wbGlmeSB3b3JrIGxp
c3Q6XG4iKTsKLSAgICAgICAgZm9yICh1bnNpZ25lZCB0bXBJbmRleCA6IG1fc2ltcGxpZnlXb3Jr
bGlzdCkKLSAgICAgICAgICAgIG91dC5wcmludCgiICAgICIsIEFic29sdXRlVG1wTWFwcGVyPHR5
cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleCh0bXBJbmRleCksICJcbiIpOwotICAgICAgICBvdXQu
cHJpbnRmKCJNb3ZlcyB3b3JrIGxpc3QgaXMgZW1wdHk/ICVkXG4iLCBtX3dvcmtsaXN0TW92ZXMu
aXNFbXB0eSgpKTsKLSAgICAgICAgb3V0LnByaW50KCJGcmVlemUgd29yayBsaXN0OlxuIik7Ci0g
ICAgICAgIGZvciAodW5zaWduZWQgdG1wSW5kZXggOiBtX2ZyZWV6ZVdvcmtsaXN0KQotICAgICAg
ICAgICAgb3V0LnByaW50KCIgICAgIiwgQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21B
YnNvbHV0ZUluZGV4KHRtcEluZGV4KSwgIlxuIik7Ci0gICAgICAgIG91dC5wcmludCgiU3BpbGwg
d29yayBsaXN0OlxuIik7Ci0gICAgICAgIGZvciAodW5zaWduZWQgdG1wSW5kZXggOiBtX3NwaWxs
V29ya2xpc3QpCi0gICAgICAgICAgICBvdXQucHJpbnQoIiAgICAiLCBBYnNvbHV0ZVRtcE1hcHBl
cjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgodG1wSW5kZXgpLCAiXG4iKTsKLSAgICB9Ci0K
LSAgICB1c2luZyBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yPHVuc2lnbmVkPjo6YWRkRWRnZTsK
LSAgICB1c2luZyBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yPHVuc2lnbmVkPjo6Z2V0QWxpYXM7
Ci0KLSAgICBDb2RlJiBtX2NvZGU7Ci0gICAgVG1wV2lkdGgmIG1fdG1wV2lkdGg7Ci0gICAgLy8g
RklYTUU6IHNwaWxsaW5nIHNob3VsZCBub3QgdHlwZSBzcGVjaWZpYy4gSXQgaXMgb25seSBhIHNp
ZGUgZWZmZWN0IG9mIHVzaW5nIFVzZUNvdW50cy4KLSAgICBjb25zdCBVc2VDb3VudHM8VG1wPiYg
bV91c2VDb3VudHM7Ci19OwotCi1jbGFzcyBJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZyB7Ci1w
dWJsaWM6Ci0gICAgSXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcoQ29kZSYgY29kZSkKLSAgICAg
ICAgOiBtX2NvZGUoY29kZSkKLSAgICAgICAgLCBtX3VzZUNvdW50cyhjb2RlKQotICAgIHsKLSAg
ICB9Ci0KLSAgICB2b2lkIHJ1bigpCi0gICAgewotICAgICAgICBwYWRJbnRlcmZlcmVuY2UobV9j
b2RlKTsKLSAgICAgICAgCi0gICAgICAgIGl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nT25UeXBl
PEFyZzo6R1A+KCk7Ci0gICAgICAgIGl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nT25UeXBlPEFy
Zzo6RlA+KCk7Ci0KLSAgICAgICAgZml4U3BpbGxzQWZ0ZXJUZXJtaW5hbHMoKTsKLQotICAgICAg
ICBpZiAocmVwb3J0U3RhdHMpCi0gICAgICAgICAgICBkYXRhTG9nKCJOdW0gaXRlcmF0aW9ucyA9
ICIsIG1fbnVtSXRlcmF0aW9ucywgIlxuIik7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIHRlbXBs
YXRlPEFyZzo6VHlwZSB0eXBlPgotICAgIHZvaWQgaXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmdP
blR5cGUoKQotICAgIHsKLSAgICAgICAgSGFzaFNldDx1bnNpZ25lZD4gdW5zcGlsbGFibGVUbXBz
ID0gY29tcHV0ZVVuc3BpbGxhYmxlVG1wczx0eXBlPigpOwotCi0gICAgICAgIC8vIEZJWE1FOiBJ
ZiBhIFRtcCBpcyB1c2VkIG9ubHkgZnJvbSBhIFNjcmF0Y2ggcm9sZSBhbmQgdGhhdCBhcmd1bWVu
dCBpcyAhYWRtaXRzU3RhY2ssIHRoZW4KLSAgICAgICAgLy8gd2Ugc2hvdWxkIGFkZCB0aGUgVG1w
IHRvIHVuc3BpbGxhYmxlVG1wcy4gVGhhdCB3aWxsIGhlbHAgYXZvaWQgcmVsb29waW5nIG9ubHkg
dG8gdHVybiB0aGUKLSAgICAgICAgLy8gVG1wIGludG8gYW4gdW5zcGlsbGFibGUgVG1wLgotICAg
ICAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTUyNjk5Ci0g
ICAgICAgIAotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgKyttX251bUl0ZXJh
dGlvbnM7Ci0KLSAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQotICAgICAgICAgICAgICAgIGRh
dGFMb2coIkNvZGUgYXQgaXRlcmF0aW9uICIsIG1fbnVtSXRlcmF0aW9ucywgIjpcbiIsIG1fY29k
ZSk7Ci0KLSAgICAgICAgICAgIC8vIEZJWE1FOiBPbmUgd2F5IHRvIG9wdGltaXplIHRoaXMgY29k
ZSBpcyB0byByZW1vdmUgdGhlIHJlY29tcHV0YXRpb24gaW5zaWRlIHRoZSBmaXhwb2ludC4KLSAg
ICAgICAgICAgIC8vIFdlIG5lZWQgdG8gcmVjb21wdXRlIGJlY2F1c2Ugc3BpbGxpbmcgYWRkcyB0
bXBzLCBidXQgd2UgY291bGQganVzdCB1cGRhdGUgdG1wV2lkdGggd2hlbiB3ZQotICAgICAgICAg
ICAgLy8gYWRkIHRob3NlIHRtcHMuIE5vdGUgdGhhdCBvbmUgZWFzeSB3YXkgdG8gcmVtb3ZlIHRo
ZSByZWNvbXB1dGF0aW9uIGlzIHRvIG1ha2UgYW55IG5ld2x5Ci0gICAgICAgICAgICAvLyBhZGRl
ZCBUbXBzIGdldCB0aGUgc2FtZSB1c2UvZGVmIHdpZHRocyB0aGF0IHRoZSBvcmlnaW5hbCBUbXAg
Z290LiBCdXQsIHRoaXMgbWF5IGh1cnQgdGhlCi0gICAgICAgICAgICAvLyBzcGlsbCBjb2RlIHdl
IGVtaXQuIFNpbmNlIHdlIGN1cnJlbnRseSByZWNvbXB1dGUgVG1wV2lkdGggYWZ0ZXIgc3BpbGxp
bmcsIHRoZSBuZXdseQotICAgICAgICAgICAgLy8gY3JlYXRlZCBUbXBzIG1heSBnZXQgbmFycm93
ZXIgdXNlL2RlZiB3aWR0aHMuIE9uIHRoZSBvdGhlciBoYW5kLCB0aGUgc3BpbGxlciBhbHJlYWR5
Ci0gICAgICAgICAgICAvLyBzZWxlY3RzIHdoaWNoIG1vdmUgaW5zdHJ1Y3Rpb24gdG8gdXNlIGJh
c2VkIG9uIHRoZSBvcmlnaW5hbCBUbXAncyB3aWR0aHMsIHNvIGl0IG1heSBub3QKLSAgICAgICAg
ICAgIC8vIG1hdHRlciB0aGFuIGEgc3Vic2VxdWVudCBpdGVyYXRpb24gc2VlcyBhIGNvc2VydmF0
aXZlIHdpZHRoIGZvciB0aGUgbmV3IFRtcHMuIEFsc28sIHRoZQotICAgICAgICAgICAgLy8gcmVj
b21wdXRhdGlvbiBtYXkgbm90IGFjdHVhbGx5IGJlIGEgcGVyZm9ybWFuY2UgcHJvYmxlbTsgaXQn
cyBsaWtlbHkgdGhhdCBhIGJldHRlciB3YXkgdG8KLSAgICAgICAgICAgIC8vIGltcHJvdmUgcGVy
Zm9ybWFuY2Ugb2YgVG1wV2lkdGggaXMgdG8gcmVwbGFjZSBpdHMgSGFzaE1hcCB3aXRoIHNvbWV0
aGluZyBlbHNlLiBJdCdzCi0gICAgICAgICAgICAvLyBwb3NzaWJsZSB0aGF0IG1vc3Qgb2YgdGhl
IFRtcFdpZHRoIG92ZXJoZWFkIGlzIGZyb20gcXVlcmllcyBvZiBUbXBXaWR0aCByYXRoZXIgdGhh
biB0aGUKLSAgICAgICAgICAgIC8vIHJlY29tcHV0YXRpb24sIGluIHdoaWNoIGNhc2Ugc3BlZWRp
bmcgdXAgdGhlIGxvb2t1cCB3b3VsZCBiZSBhIGJpZ2dlciB3aW4uCi0gICAgICAgICAgICAvLyBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTUyNDc4Ci0gICAgICAgICAg
ICBtX3RtcFdpZHRoLnJlY29tcHV0ZShtX2NvZGUpOwotICAgICAgICAgICAgCi0gICAgICAgICAg
ICBDb2xvcmluZ0FsbG9jYXRvcjx0eXBlPiBhbGxvY2F0b3IobV9jb2RlLCBtX3RtcFdpZHRoLCBt
X3VzZUNvdW50cywgdW5zcGlsbGFibGVUbXBzKTsKLSAgICAgICAgICAgIGlmICghYWxsb2NhdG9y
LnJlcXVpcmVzU3BpbGxpbmcoKSkgewotICAgICAgICAgICAgICAgIGFzc2lnblJlZ2lzdGVyc1Rv
VG1wKGFsbG9jYXRvcik7Ci0gICAgICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpCi0gICAgICAg
ICAgICAgICAgICAgIGRhdGFMb2coIlN1Y2Nlc3NmdWxsIGFsbG9jYXRpb24gYXQgaXRlcmF0aW9u
ICIsIG1fbnVtSXRlcmF0aW9ucywgIjpcbiIsIG1fY29kZSk7Ci0KLSAgICAgICAgICAgICAgICBy
ZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhZGRTcGlsbEFuZEZpbGw8dHlwZT4o
YWxsb2NhdG9yLCB1bnNwaWxsYWJsZVRtcHMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdGVt
cGxhdGU8QXJnOjpUeXBlIHR5cGU+Ci0gICAgSGFzaFNldDx1bnNpZ25lZD4gY29tcHV0ZVVuc3Bp
bGxhYmxlVG1wcygpCi0gICAgewotICAgICAgICBIYXNoU2V0PHVuc2lnbmVkPiB1bnNwaWxsYWJs
ZVRtcHM7Ci0KLSAgICAgICAgc3RydWN0IFJhbmdlIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIGZp
cnN0IHsgc3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25lZD46Om1heCgpIH07Ci0gICAgICAgICAg
ICB1bnNpZ25lZCBsYXN0IHsgMCB9OwotICAgICAgICAgICAgdW5zaWduZWQgY291bnQgeyAwIH07
Ci0gICAgICAgICAgICB1bnNpZ25lZCBhZG1pdFN0YWNrQ291bnQgeyAwIH07Ci0gICAgICAgIH07
Ci0KLSAgICAgICAgdW5zaWduZWQgbnVtVG1wcyA9IG1fY29kZS5udW1UbXBzKHR5cGUpOwotICAg
ICAgICB1bnNpZ25lZCBhcnJheVNpemUgPSBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1
dGVJbmRleChudW1UbXBzKTsKLQotICAgICAgICBWZWN0b3I8UmFuZ2UsIDAsIFVuc2FmZVZlY3Rv
ck92ZXJmbG93PiByYW5nZXM7Ci0gICAgICAgIHJhbmdlcy5maWxsKFJhbmdlKCksIGFycmF5U2l6
ZSk7Ci0KLSAgICAgICAgdW5zaWduZWQgZ2xvYmFsSW5kZXggPSAwOwotICAgICAgICBmb3IgKEJh
c2ljQmxvY2sqIGJsb2NrIDogbV9jb2RlKSB7Ci0gICAgICAgICAgICBmb3IgKEluc3QmIGluc3Qg
OiAqYmxvY2spIHsKLSAgICAgICAgICAgICAgICBpbnN0LmZvckVhY2hBcmcoWyZdIChBcmcmIGFy
ZywgQXJnOjpSb2xlLCBBcmc6OlR5cGUgYXJnVHlwZSwgQXJnOjpXaWR0aCkgewotICAgICAgICAg
ICAgICAgICAgICBpZiAoYXJnLmlzVG1wKCkgJiYgaW5zdC5hZG1pdHNTdGFjayhhcmcpKSB7Ci0g
ICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnVHlwZSAhPSB0eXBlKQotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgVG1wIHRt
cCA9IGFyZy50bXAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFJhbmdlJiByYW5nZSA9IHJh
bmdlc1tBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh0bXApXTsKLSAgICAg
ICAgICAgICAgICAgICAgICAgIHJhbmdlLmNvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICByYW5nZS5hZG1pdFN0YWNrQ291bnQrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChn
bG9iYWxJbmRleCA8IHJhbmdlLmZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
cmFuZ2UuZmlyc3QgPSBnbG9iYWxJbmRleDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBy
YW5nZS5sYXN0ID0gZ2xvYmFsSW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZS5sYXN0ID0gZ2xvYmFsSW5kZXg7Ci0K
LSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQot
Ci0gICAgICAgICAgICAgICAgICAgIGFyZy5mb3JFYWNoVG1wRmFzdChbJl0gKFRtcCYgdG1wKSB7
Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wLmlzR1AoKSAhPSAodHlwZSA9PSBBcmc6
OkdQKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAg
ICAgICAgICAgICAgIFJhbmdlJiByYW5nZSA9IHJhbmdlc1tBYnNvbHV0ZVRtcE1hcHBlcjx0eXBl
Pjo6YWJzb2x1dGVJbmRleCh0bXApXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmNv
dW50Kys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2xvYmFsSW5kZXggPCByYW5nZS5m
aXJzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmZpcnN0ID0gZ2xvYmFs
SW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UubGFzdCA9IGdsb2JhbElu
ZGV4OwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgcmFuZ2UubGFzdCA9IGdsb2JhbEluZGV4OwotICAgICAgICAgICAgICAgICAgICB9
KTsKLSAgICAgICAgICAgICAgICB9KTsKLQotICAgICAgICAgICAgICAgICsrZ2xvYmFsSW5kZXg7
Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICArK2dsb2JhbEluZGV4OwotICAgICAgICB9Ci0g
ICAgICAgIGZvciAodW5zaWduZWQgaSA9IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjpsYXN0TWFj
aGluZVJlZ2lzdGVySW5kZXgoKSArIDE7IGkgPCByYW5nZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAg
ICAgICAgIFJhbmdlJiByYW5nZSA9IHJhbmdlc1tpXTsKLSAgICAgICAgICAgIGlmIChyYW5nZS5s
YXN0IC0gcmFuZ2UuZmlyc3QgPD0gMSAmJiByYW5nZS5jb3VudCA+IHJhbmdlLmFkbWl0U3RhY2tD
b3VudCkKLSAgICAgICAgICAgICAgICB1bnNwaWxsYWJsZVRtcHMuYWRkKGkpOwotICAgICAgICB9
Ci0KLSAgICAgICAgcmV0dXJuIHVuc3BpbGxhYmxlVG1wczsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0
ZTxBcmc6OlR5cGUgdHlwZT4KLSAgICB2b2lkIGFzc2lnblJlZ2lzdGVyc1RvVG1wKGNvbnN0IENv
bG9yaW5nQWxsb2NhdG9yPHR5cGU+JiBhbGxvY2F0b3IpCi0gICAgewotICAgICAgICBmb3IgKEJh
c2ljQmxvY2sqIGJsb2NrIDogbV9jb2RlKSB7Ci0gICAgICAgICAgICAvLyBHaXZlIFRtcCBhIHZh
bGlkIHJlZ2lzdGVyLgotICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnN0SW5kZXggPSAwOyBp
bnN0SW5kZXggPCBibG9jay0+c2l6ZSgpOyArK2luc3RJbmRleCkgewotICAgICAgICAgICAgICAg
IEluc3QmIGluc3QgPSBibG9jay0+YXQoaW5zdEluZGV4KTsKLQotICAgICAgICAgICAgICAgIC8v
IFRoZSBtYXlCZUNvYWxlc2NhYmxlKCkgbWV0aG9kIHdpbGwgY2hhbmdlIGl0cyBtaW5kIGZvciBz
b21lIG9wZXJhdGlvbnMgYWZ0ZXIgd2UKLSAgICAgICAgICAgICAgICAvLyBjb21wbGV0ZSByZWdp
c3RlciBhbGxvY2F0aW9uLiBTbywgd2UgcmVjb3JkIHRoaXMgYmVmb3JlIHN0YXJ0aW5nLgotICAg
ICAgICAgICAgICAgIGJvb2wgbWF5QmVDb2FsZXNjYWJsZSA9IGFsbG9jYXRvci5tYXlCZUNvYWxl
c2NhYmxlKGluc3QpOwotCi0gICAgICAgICAgICAgICAgLy8gTW92ZTMyIGlzIGNoZWFwZXIgaWYg
d2Uga25vdyB0aGF0IGl0J3MgZXF1aXZhbGVudCB0byBhIE1vdmUuIEl0J3MKLSAgICAgICAgICAg
ICAgICAvLyBlcXVpdmFsZW50IGlmIHRoZSBkZXN0aW5hdGlvbidzIGhpZ2ggYml0cyBhcmUgbm90
IG9ic2VydmFibGUgb3IgaWYgdGhlIHNvdXJjZSdzIGhpZ2gKLSAgICAgICAgICAgICAgICAvLyBi
aXRzIGFyZSBhbGwgemVyby4gTm90ZSB0aGF0IHdlIGRvbid0IGhhdmUgdGhlIG9wcG9zaXRlIG9w
dGltaXphdGlvbiBmb3Igb3RoZXIKLSAgICAgICAgICAgICAgICAvLyBhcmNoaXRlY3R1cmVzLCB3
aGljaCBtYXkgcHJlZmVyIE1vdmUgb3ZlciBNb3ZlMzIsIGJlY2F1c2UgTW92ZSBpcyBjYW5vbmlj
YWwgYWxyZWFkeS4KLSAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBBcmc6OkdQICYmIGluc3Qu
a2luZC5vcGNvZGUgPT0gTW92ZQotICAgICAgICAgICAgICAgICAgICAmJiBpbnN0LmFyZ3NbMF0u
aXNUbXAoKSAmJiBpbnN0LmFyZ3NbMV0uaXNUbXAoKSkgewotICAgICAgICAgICAgICAgICAgICBp
ZiAobV90bXBXaWR0aC51c2VXaWR0aChpbnN0LmFyZ3NbMV0udG1wKCkpIDw9IEFyZzo6V2lkdGgz
MgotICAgICAgICAgICAgICAgICAgICAgICAgfHwgbV90bXBXaWR0aC5kZWZXaWR0aChpbnN0LmFy
Z3NbMF0udG1wKCkpIDw9IEFyZzo6V2lkdGgzMikKLSAgICAgICAgICAgICAgICAgICAgICAgIGlu
c3Qua2luZC5vcGNvZGUgPSBNb3ZlMzI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAg
ICAgICAgaW5zdC5mb3JFYWNoVG1wRmFzdChbJl0gKFRtcCYgdG1wKSB7Ci0gICAgICAgICAgICAg
ICAgICAgIGlmICh0bXAuaXNSZWcoKSB8fCB0bXAuaXNHUCgpID09ICh0eXBlICE9IEFyZzo6R1Ap
KQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICAgICAgICAg
IFRtcCBhbGlhc1RtcCA9IGFsbG9jYXRvci5nZXRBbGlhcyh0bXApOwotICAgICAgICAgICAgICAg
ICAgICBUbXAgYXNzaWduZWRUbXA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhbGlhc1RtcC5p
c1JlZygpKQotICAgICAgICAgICAgICAgICAgICAgICAgYXNzaWduZWRUbXAgPSBUbXAoYWxpYXNU
bXAucmVnKCkpOwotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAg
ICAgICAgIGF1dG8gcmVnID0gYWxsb2NhdG9yLmFsbG9jYXRlZFJlZyhhbGlhc1RtcCk7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICBBU1NFUlQocmVnKTsKLSAgICAgICAgICAgICAgICAgICAgICAg
IGFzc2lnbmVkVG1wID0gVG1wKHJlZyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgICAgICAgICAgQVNTRVJUKGFzc2lnbmVkVG1wLmlzUmVnKCkpOwotICAgICAgICAgICAgICAg
ICAgICB0bXAgPSBhc3NpZ25lZFRtcDsKLSAgICAgICAgICAgICAgICB9KTsKLQotICAgICAgICAg
ICAgICAgIGlmIChtYXlCZUNvYWxlc2NhYmxlICYmIGluc3QuYXJnc1swXS5pc1RtcCgpICYmIGlu
c3QuYXJnc1sxXS5pc1RtcCgpCi0gICAgICAgICAgICAgICAgICAgICYmIGluc3QuYXJnc1swXS50
bXAoKSA9PSBpbnN0LmFyZ3NbMV0udG1wKCkpCi0gICAgICAgICAgICAgICAgICAgIGluc3QgPSBJ
bnN0KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFJlbW92ZSBhbGwgdGhlIHVz
ZWxlc3MgbW92ZXMgd2UgY3JlYXRlZCBpbiB0aGlzIGJsb2NrLgotICAgICAgICAgICAgYmxvY2st
Pmluc3RzKCkucmVtb3ZlQWxsTWF0Y2hpbmcoWyZdIChjb25zdCBJbnN0JiBpbnN0KSB7Ci0gICAg
ICAgICAgICAgICAgcmV0dXJuICFpbnN0OwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAg
ICB9Ci0KLSAgICBzdGF0aWMgdW5zaWduZWQgc3RhY2tTbG90TWluaW11bVdpZHRoKEFyZzo6V2lk
dGggd2lkdGgpCi0gICAgewotICAgICAgICByZXR1cm4gd2lkdGggPD0gQXJnOjpXaWR0aDMyID8g
NCA6IDg7Ci0gICAgfQotCi0gICAgdGVtcGxhdGU8QXJnOjpUeXBlIHR5cGU+Ci0gICAgdm9pZCBh
ZGRTcGlsbEFuZEZpbGwoY29uc3QgQ29sb3JpbmdBbGxvY2F0b3I8dHlwZT4mIGFsbG9jYXRvciwg
SGFzaFNldDx1bnNpZ25lZD4mIHVuc3BpbGxhYmxlVG1wcykKLSAgICB7Ci0gICAgICAgIEhhc2hN
YXA8VG1wLCBTdGFja1Nsb3QqPiBzdGFja1Nsb3RzOwotICAgICAgICBmb3IgKFRtcCB0bXAgOiBh
bGxvY2F0b3Iuc3BpbGxlZFRtcHMoKSkgewotICAgICAgICAgICAgLy8gQWxsIHRoZSBzcGlsbGVk
IHZhbHVlcyBiZWNvbWUgdW5zcGlsbGFibGUuCi0gICAgICAgICAgICB1bnNwaWxsYWJsZVRtcHMu
YWRkKEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHRtcCkpOwotCi0gICAg
ICAgICAgICAvLyBBbGxvY2F0ZSBzdGFjayBzbG90IGZvciBlYWNoIHNwaWxsZWQgdmFsdWUuCi0g
ICAgICAgICAgICBTdGFja1Nsb3QqIHN0YWNrU2xvdCA9IG1fY29kZS5hZGRTdGFja1Nsb3QoCi0g
ICAgICAgICAgICAgICAgc3RhY2tTbG90TWluaW11bVdpZHRoKG1fdG1wV2lkdGgucmVxdWlyZWRX
aWR0aCh0bXApKSwgU3RhY2tTbG90S2luZDo6U3BpbGwpOwotICAgICAgICAgICAgYm9vbCBpc05l
d1RtcCA9IHN0YWNrU2xvdHMuYWRkKHRtcCwgc3RhY2tTbG90KS5pc05ld0VudHJ5OwotICAgICAg
ICAgICAgQVNTRVJUX1VOVVNFRChpc05ld1RtcCwgaXNOZXdUbXApOwotICAgICAgICB9Ci0KLSAg
ICAgICAgLy8gUmV3cml0ZSB0aGUgcHJvZ3JhbSB0byBnZXQgcmlkIG9mIHRoZSBzcGlsbGVkIFRt
cC4KLSAgICAgICAgSW5zZXJ0aW9uU2V0IGluc2VydGlvblNldChtX2NvZGUpOwotICAgICAgICBm
b3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogbV9jb2RlKSB7Ci0gICAgICAgICAgICBib29sIGhhc0Fs
aWFzZWRUbXBzID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW5zdEluZGV4
ID0gMDsgaW5zdEluZGV4IDwgYmxvY2stPnNpemUoKTsgKytpbnN0SW5kZXgpIHsKLSAgICAgICAg
ICAgICAgICBJbnN0JiBpbnN0ID0gYmxvY2stPmF0KGluc3RJbmRleCk7Ci0KLSAgICAgICAgICAg
ICAgICAvLyBUaGUgVG1wV2lkdGggYW5hbHlzaXMgd2lsbCBzYXkgdGhhdCBhIE1vdmUgb25seSBz
dG9yZXMgMzIgYml0cyBpbnRvIHRoZSBkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAvLyBp
ZiB0aGUgc291cmNlIG9ubHkgaGFkIDMyIGJpdHMgd29ydGggb2Ygbm9uLXplcm8gYml0cy4gU2Ft
ZSBmb3IgdGhlIHNvdXJjZTogaXQgd2lsbAotICAgICAgICAgICAgICAgIC8vIG9ubHkgY2xhaW0g
dG8gcmVhZCAzMiBiaXRzIGZyb20gdGhlIHNvdXJjZSBpZiBvbmx5IDMyIGJpdHMgb2YgdGhlIGRl
c3RpbmF0aW9uIGFyZQotICAgICAgICAgICAgICAgIC8vIHJlYWQuIE5vdGUgdGhhdCB3ZSBvbmx5
IGFwcGx5IHRoaXMgbG9naWMgaWYgdGhpcyB0dXJucyBpbnRvIGEgbG9hZCBvciBzdG9yZSwgc2lu
Y2UKLSAgICAgICAgICAgICAgICAvLyBNb3ZlIGlzIHRoZSBjYW5vbmljYWwgd2F5IHRvIG1vdmUg
ZGF0YSBiZXR3ZWVuIEdQUnMuCi0gICAgICAgICAgICAgICAgYm9vbCBjYW5Vc2VNb3ZlMzJJZkRp
ZFNwaWxsID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgYm9vbCBkaWRTcGlsbCA9IGZhbHNlOwot
ICAgICAgICAgICAgICAgIGlmICh0eXBlID09IEFyZzo6R1AgJiYgaW5zdC5raW5kLm9wY29kZSA9
PSBNb3ZlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoaW5zdC5hcmdzWzBdLmlzVG1wKCkg
JiYgbV90bXBXaWR0aC53aWR0aChpbnN0LmFyZ3NbMF0udG1wKCkpIDw9IEFyZzo6V2lkdGgzMikK
LSAgICAgICAgICAgICAgICAgICAgICAgIHx8IChpbnN0LmFyZ3NbMV0uaXNUbXAoKSAmJiBtX3Rt
cFdpZHRoLndpZHRoKGluc3QuYXJnc1sxXS50bXAoKSkgPD0gQXJnOjpXaWR0aDMyKSkKLSAgICAg
ICAgICAgICAgICAgICAgICAgIGNhblVzZU1vdmUzMklmRGlkU3BpbGwgPSB0cnVlOwotICAgICAg
ICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFRyeSB0byByZXBsYWNlIHRoZSByZWdp
c3RlciB1c2UgYnkgbWVtb3J5IHVzZSB3aGVuIHBvc3NpYmxlLgotICAgICAgICAgICAgICAgIGlu
c3QuZm9yRWFjaEFyZygKLSAgICAgICAgICAgICAgICAgICAgWyZdIChBcmcmIGFyZywgQXJnOjpS
b2xlIHJvbGUsIEFyZzo6VHlwZSBhcmdUeXBlLCBBcmc6OldpZHRoIHdpZHRoKSB7Ci0gICAgICAg
ICAgICAgICAgICAgICAgICBpZiAoIWFyZy5pc1RtcCgpKQotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdUeXBlICE9IHR5
cGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAg
ICAgICAgICAgaWYgKGFyZy5pc1JlZygpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJl
dHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAg
YXV0byBzdGFja1Nsb3RFbnRyeSA9IHN0YWNrU2xvdHMuZmluZChhcmcudG1wKCkpOwotICAgICAg
ICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrU2xvdEVudHJ5ID09IHN0YWNrU2xvdHMuZW5kKCkp
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAg
ICAgICAgaWYgKCFpbnN0LmFkbWl0c1N0YWNrKGFyZykpCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAg
ICAgICAgICAvLyBJZiB0aGUgVG1wIGhvbGRzIGEgY29uc3RhbnQgdGhlbiB3ZSB3YW50IHRvIHJl
bWF0ZXJpYWxpemUgaXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZSByYXRoZXIg
dGhhbiBsb2FkaW5nIGl0IGZyb20gdGhlIHN0YWNrLiBJbiBvcmRlciBmb3IgdGhhdAotICAgICAg
ICAgICAgICAgICAgICAgICAgLy8gb3B0aW1pemF0aW9uIHRvIGtpY2sgaW4sIHdlIG5lZWQgdG8g
YXZvaWQgcGxhY2luZyB0aGUgVG1wJ3Mgc3RhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgIC8v
IGFkZHJlc3MgaW50byB0aGUgaW5zdHJ1Y3Rpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICBp
ZiAoIUFyZzo6aXNDb2xkVXNlKHJvbGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
Y29uc3QgVXNlQ291bnRzPFRtcD46OkNvdW50cyogY291bnRzID0gbV91c2VDb3VudHNbYXJnLnRt
cCgpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY291bnRzICYmIGNvdW50cy0+
bnVtQ29uc3REZWZzID09IDEgJiYgY291bnRzLT5udW1EZWZzID09IDEpCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgQXJnOjpXaWR0
aCBzcGlsbFdpZHRoID0gbV90bXBXaWR0aC5yZXF1aXJlZFdpZHRoKGFyZy50bXAoKSk7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICBpZiAoQXJnOjppc0FueURlZihyb2xlKSAmJiB3aWR0aCA8IHNw
aWxsV2lkdGgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAg
ICAgICAgICAgICAgICAgQVNTRVJUKGluc3Qua2luZC5vcGNvZGUgPT0gTW92ZSB8fCAhKEFyZzo6
aXNBbnlVc2Uocm9sZSkgJiYgd2lkdGggPiBzcGlsbFdpZHRoKSk7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcGlsbFdpZHRoICE9IEFyZzo6
V2lkdGgzMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5Vc2VNb3ZlMzJJZkRpZFNw
aWxsID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAg
ICAgICAgIHN0YWNrU2xvdEVudHJ5LT52YWx1ZS0+ZW5zdXJlU2l6ZSgKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBjYW5Vc2VNb3ZlMzJJZkRpZFNwaWxsID8gNCA6IEFyZzo6Ynl0ZXMod2lk
dGgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IEFyZzo6c3RhY2soc3RhY2tTbG90
RW50cnktPnZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpZFNwaWxsID0gdHJ1ZTsK
LSAgICAgICAgICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZGlkU3BpbGwg
JiYgY2FuVXNlTW92ZTMySWZEaWRTcGlsbCkKLSAgICAgICAgICAgICAgICAgICAgaW5zdC5raW5k
Lm9wY29kZSA9IE1vdmUzMjsKLQotICAgICAgICAgICAgICAgIC8vIEZvciBldmVyeSBvdGhlciBj
YXNlLCBhZGQgTG9hZC9TdG9yZSBhcyBuZWVkZWQuCi0gICAgICAgICAgICAgICAgaW5zdC5mb3JF
YWNoVG1wKFsmXSAoVG1wJiB0bXAsIEFyZzo6Um9sZSByb2xlLCBBcmc6OlR5cGUgYXJnVHlwZSwg
QXJnOjpXaWR0aCkgewotICAgICAgICAgICAgICAgICAgICBpZiAodG1wLmlzUmVnKCkgfHwgYXJn
VHlwZSAhPSB0eXBlKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAg
ICAgICAgICAgICAgIGF1dG8gc3RhY2tTbG90RW50cnkgPSBzdGFja1Nsb3RzLmZpbmQodG1wKTsK
LSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrU2xvdEVudHJ5ID09IHN0YWNrU2xvdHMuZW5k
KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFRtcCBhbGlhcyA9IGFsbG9jYXRvci5nZXRB
bGlhc1doZW5TcGlsbGluZyh0bXApOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFsaWFz
ICE9IHRtcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGFsaWFzOwotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0FsaWFzZWRUbXBzID0gdHJ1ZTsKLSAgICAgICAg
ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAg
ICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIEFyZzo6V2lkdGggc3BpbGxX
aWR0aCA9IG1fdG1wV2lkdGgucmVxdWlyZWRXaWR0aCh0bXApOwotICAgICAgICAgICAgICAgICAg
ICBPcGNvZGUgbW92ZSA9IE9vcHM7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhY2tT
bG90TWluaW11bVdpZHRoKHNwaWxsV2lkdGgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2Ug
NDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vdmUgPSB0eXBlID09IEFyZzo6R1AgPyBNb3Zl
MzIgOiBNb3ZlRmxvYXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAg
ICAgICAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgICAgICAgICAgICAgbW92ZSA9IHR5cGUg
PT0gQXJnOjpHUCA/IE1vdmUgOiBNb3ZlRG91YmxlOwotICAgICAgICAgICAgICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAg
ICAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICAgICAgICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB0
bXAgPSBtX2NvZGUubmV3VG1wKHR5cGUpOwotICAgICAgICAgICAgICAgICAgICB1bnNwaWxsYWJs
ZVRtcHMuYWRkKEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHRtcCkpOwot
Ci0gICAgICAgICAgICAgICAgICAgIEFyZyBhcmcgPSBBcmc6OnN0YWNrKHN0YWNrU2xvdEVudHJ5
LT52YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChBcmc6OmlzQW55VXNlKHJvbGUpICYm
IHJvbGUgIT0gQXJnOjpTY3JhdGNoKQotICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0aW9u
U2V0Lmluc2VydChpbnN0SW5kZXgsIG1vdmUsIGluc3Qub3JpZ2luLCBhcmcsIHRtcCk7Ci0gICAg
ICAgICAgICAgICAgICAgIGlmIChBcmc6OmlzQW55RGVmKHJvbGUpKQotICAgICAgICAgICAgICAg
ICAgICAgICAgaW5zZXJ0aW9uU2V0Lmluc2VydChpbnN0SW5kZXggKyAxLCBtb3ZlLCBpbnN0Lm9y
aWdpbiwgdG1wLCBhcmcpOwotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfQotICAg
ICAgICAgICAgaW5zZXJ0aW9uU2V0LmV4ZWN1dGUoYmxvY2spOwotCi0gICAgICAgICAgICBpZiAo
aGFzQWxpYXNlZFRtcHMpIHsKLSAgICAgICAgICAgICAgICBibG9jay0+aW5zdHMoKS5yZW1vdmVB
bGxNYXRjaGluZyhbJl0gKGNvbnN0IEluc3QmIGluc3QpIHsKLSAgICAgICAgICAgICAgICAgICAg
cmV0dXJuIGFsbG9jYXRvci5pc1VzZWxlc3NNb3ZlKGluc3QpOwotICAgICAgICAgICAgICAgIH0p
OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBmaXhTcGlsbHNB
ZnRlclRlcm1pbmFscygpCi0gICAgewotICAgICAgICAvLyBCZWNhdXNlIHRoZXJlIG1heSBiZSB0
ZXJtaW5hbHMgdGhhdCBwcm9kdWNlIHZhbHVlcywgSVJDIG1heQotICAgICAgICAvLyB3YW50IHRv
IHNwaWxsIHRob3NlIHRlcm1pbmFscy4gSXQnbGwgaGFwcGVuIHRvIHNwaWxsIGl0IGFmdGVyCi0g
ICAgICAgIC8vIHRoZSB0ZXJtaW5hbC4gSWYgd2UgbGVmdCB0aGUgZ3JhcGggaW4gdGhpcyBzdGF0
ZSwgaXQnZCBiZSBpbnZhbGlkCi0gICAgICAgIC8vIGJlY2F1c2UgYSB0ZXJtaW5hbCBtdXN0IGJl
IHRoZSBsYXN0IGluc3RydWN0aW9uIGluIGEgYmxvY2suCi0gICAgICAgIC8vIFdlIGZpeCB0aGF0
IGhlcmUuCi0KLSAgICAgICAgSW5zZXJ0aW9uU2V0IGluc2VydGlvblNldChtX2NvZGUpOwotCi0g
ICAgICAgIGJvb2wgYWRkZWRCbG9ja3MgPSBmYWxzZTsKLQotICAgICAgICBmb3IgKEJhc2ljQmxv
Y2sqIGJsb2NrIDogbV9jb2RlKSB7Ci0gICAgICAgICAgICB1bnNpZ25lZCB0ZXJtaW5hbEluZGV4
ID0gYmxvY2stPnNpemUoKTsKLSAgICAgICAgICAgIGJvb2wgZm91bmRUZXJtaW5hbCA9IGZhbHNl
OwotICAgICAgICAgICAgd2hpbGUgKHRlcm1pbmFsSW5kZXgtLSkgewotICAgICAgICAgICAgICAg
IGlmIChibG9jay0+YXQodGVybWluYWxJbmRleCkuaXNUZXJtaW5hbCgpKSB7Ci0gICAgICAgICAg
ICAgICAgICAgIGZvdW5kVGVybWluYWwgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVh
azsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBU1NFUlRf
VU5VU0VEKGZvdW5kVGVybWluYWwsIGZvdW5kVGVybWluYWwpOwotCi0gICAgICAgICAgICBpZiAo
dGVybWluYWxJbmRleCA9PSBibG9jay0+c2l6ZSgpIC0gMSkKLSAgICAgICAgICAgICAgICBjb250
aW51ZTsKLQotICAgICAgICAgICAgLy8gVGhlcmUgbXVzdCBiZSBpbnN0cnVjdGlvbnMgYWZ0ZXIg
dGhlIHRlcm1pbmFsIGJlY2F1c2UgaXQncyBub3QgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24uCi0gICAg
ICAgICAgICBBU1NFUlQodGVybWluYWxJbmRleCA8IGJsb2NrLT5zaXplKCkgLSAxKTsKLSAgICAg
ICAgICAgIFZlY3RvcjxJbnN0LCAxPiBpbnN0c1RvTW92ZTsKLSAgICAgICAgICAgIGZvciAodW5z
aWduZWQgaSA9IHRlcm1pbmFsSW5kZXggKyAxOyBpIDwgYmxvY2stPnNpemUoKTsgaSsrKQotICAg
ICAgICAgICAgICAgIGluc3RzVG9Nb3ZlLmFwcGVuZChibG9jay0+YXQoaSkpOwotICAgICAgICAg
ICAgUkVMRUFTRV9BU1NFUlQoaW5zdHNUb01vdmUuc2l6ZSgpKTsKLQotICAgICAgICAgICAgZm9y
IChGcmVxdWVudGVkQmxvY2smIGZyZXF1ZW50ZWRTdWNjZXNzb3IgOiBibG9jay0+c3VjY2Vzc29y
cygpKSB7Ci0gICAgICAgICAgICAgICAgQmFzaWNCbG9jayogc3VjY2Vzc29yID0gZnJlcXVlbnRl
ZFN1Y2Nlc3Nvci5ibG9jaygpOwotICAgICAgICAgICAgICAgIC8vIElmIHN1Y2Nlc3NvcidzIG9u
bHkgcHJlZGVjZXNzb3IgaXMgYmxvY2ssIHdlIGNhbiBwbGFudCB0aGUgc3BpbGwgaW5zaWRlCi0g
ICAgICAgICAgICAgICAgLy8gdGhlIHN1Y2Nlc3Nvci4gT3RoZXJ3aXNlLCB3ZSBtdXN0IHNwbGl0
IHRoZSBjcml0aWNhbCBlZGdlIGFuZCBjcmVhdGUKLSAgICAgICAgICAgICAgICAvLyBhIG5ldyBi
bG9jayBmb3IgdGhlIHNwaWxsLgotICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzb3ItPm51bVBy
ZWRlY2Vzc29ycygpID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5zZXJ0aW9uU2V0Lmlu
c2VydEluc3RzKDAsIGluc3RzVG9Nb3ZlKTsKLSAgICAgICAgICAgICAgICAgICAgaW5zZXJ0aW9u
U2V0LmV4ZWN1dGUoc3VjY2Vzc29yKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAg
ICAgICAgICAgICAgICBhZGRlZEJsb2NrcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIC8v
IEZJWE1FOiBXZSBwcm9iYWJseSB3YW50IGJldHRlciBibG9jayBvcmRlcmluZyBoZXJlLgotICAg
ICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrKiBuZXdCbG9jayA9IG1fY29kZS5hZGRCbG9jaygp
OwotICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IEluc3QmIGluc3QgOiBpbnN0c1RvTW92
ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Jsb2NrLT5hcHBlbmRJbnN0KGluc3QpOwot
ICAgICAgICAgICAgICAgICAgICBuZXdCbG9jay0+YXBwZW5kSW5zdChJbnN0KEp1bXAsIGluc3Rz
VG9Nb3ZlLmxhc3QoKS5vcmlnaW4pKTsKLSAgICAgICAgICAgICAgICAgICAgbmV3QmxvY2stPnN1
Y2Nlc3NvcnMoKS5hcHBlbmQoc3VjY2Vzc29yKTsKLSAgICAgICAgICAgICAgICAgICAgZnJlcXVl
bnRlZFN1Y2Nlc3Nvci5ibG9jaygpID0gbmV3QmxvY2s7Ci0gICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgfQotCi0gICAgICAgICAgICBibG9jay0+cmVzaXplKHRlcm1pbmFsSW5kZXggKyAx
KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhZGRlZEJsb2NrcykKLSAgICAgICAgICAgIG1f
Y29kZS5yZXNldFJlYWNoYWJpbGl0eSgpOwotICAgIH0KLQotICAgIENvZGUmIG1fY29kZTsKLSAg
ICBUbXBXaWR0aCBtX3RtcFdpZHRoOwotICAgIFVzZUNvdW50czxUbXA+IG1fdXNlQ291bnRzOwot
ICAgIHVuc2lnbmVkIG1fbnVtSXRlcmF0aW9ucyB7IDAgfTsKLX07Ci0KLX0gLy8gYW5vbnltb3Vz
IG5hbWVzcGFjZQotCi12b2lkIGl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nKENvZGUmIGNvZGUp
Ci17Ci0gICAgUGhhc2VTY29wZSBwaGFzZVNjb3BlKGNvZGUsICJpdGVyYXRlZFJlZ2lzdGVyQ29h
bGVzY2luZyIpOwotICAgIAotICAgIEl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nIGl0ZXJhdGVk
UmVnaXN0ZXJDb2FsZXNjaW5nKGNvZGUpOwotICAgIGl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5n
LnJ1bigpOwotfQotCi19IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCi0KLSNlbmRpZiAv
LyBFTkFCTEUoQjNfSklUKQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJJ
dGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9haXIvQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuaAkocmV2aXNpb24g
MjEyNjY2KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJJdGVyYXRlZFJlZ2lz
dGVyQ29hbGVzY2luZy5oCShub25leGlzdGVudCkKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIENv
cHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
Ci0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMn
JyBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgotICogQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
Ci0gKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCi0gKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLSAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLSAqIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaWYg
RU5BQkxFKEIzX0pJVCkKLQotbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5hbWVzcGFj
ZSBBaXIgewotCi1jbGFzcyBDb2RlOwotCi0vLyBUaGlzIGlzIGEgcmVnaXN0ZXIgYWxsb2NhdGlv
biBwaGFzZSBiYXNlZCBvbiBBbmRyZXcgQXBwZWwncyBJdGVyYXRlZCBSZWdpc3RlciBDb2FsZXNj
aW5nCi0vLyBodHRwOi8vd3d3LmNzLmNtdS5lZHUvYWZzL2NzL2FjYWRlbWljL2NsYXNzLzE1NzQ1
LXMwNy93d3cvcGFwZXJzL2dlb3JnZS5wZGYKLXZvaWQgaXRlcmF0ZWRSZWdpc3RlckNvYWxlc2Np
bmcoQ29kZSYpOwotCi19IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCi0KLSNlbmRpZiAv
LyBFTkFCTEUoQjNfSklUKQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJS
ZWdpc3RlckFsbG9jYXRvci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL2Fpci9BaXJSZWdpc3RlckFsbG9jYXRvci5jcHAJKHJldmlzaW9uIDIxMjY2NikJKGZyb20g
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2lu
Zy5jcHA6MjEyNjY2KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJSZWdpc3Rl
ckFsbG9jYXRvci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNjU2IEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE1LTIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29u
ZmlnLmgiCisjaW5jbHVkZSAiQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuaCIKKworI2lm
IEVOQUJMRShCM19KSVQpCisKKyNpbmNsdWRlICJBaXJDb2RlLmgiCisjaW5jbHVkZSAiQWlySW5z
ZXJ0aW9uU2V0LmgiCisjaW5jbHVkZSAiQWlySW5zdElubGluZXMuaCIKKyNpbmNsdWRlICJBaXJM
aXZlbmVzcy5oIgorI2luY2x1ZGUgIkFpclBhZEludGVyZmVyZW5jZS5oIgorI2luY2x1ZGUgIkFp
clBoYXNlU2NvcGUuaCIKKyNpbmNsdWRlICJBaXJUbXBJbmxpbmVzLmgiCisjaW5jbHVkZSAiQWly
VG1wV2lkdGguaCIKKyNpbmNsdWRlICJBaXJVc2VDb3VudHMuaCIKKyNpbmNsdWRlIDx3dGYvTGlz
dER1bXAuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5hbWVzcGFjZSBBaXIg
eworCituYW1lc3BhY2UgeworCitib29sIGRlYnVnID0gZmFsc2U7Citib29sIHRyYWNlRGVidWcg
PSBmYWxzZTsKK2Jvb2wgcmVwb3J0U3RhdHMgPSBmYWxzZTsKKworLy8gVGhlIEFic3RyYWN0Q29s
b3JpbmdBbGxvY2F0b3IgZGVmaW5lcyBhbGwgdGhlIGNvZGUgdGhhdCBpcyBpbmRlcGVuZGFudAor
Ly8gZnJvbSB0aGUgdHlwZSBvciByZWdpc3RlciBhbmQgY2FuIGJlIHNoYXJlZCB3aGVuIGFsbG9j
YXRpbmcgcmVnaXN0ZXJzLgordGVtcGxhdGU8dHlwZW5hbWUgSW5kZXhUeXBlPgorY2xhc3MgQWJz
dHJhY3RDb2xvcmluZ0FsbG9jYXRvciB7CitwdWJsaWM6CisgICAgQWJzdHJhY3RDb2xvcmluZ0Fs
bG9jYXRvcihjb25zdCBWZWN0b3I8UmVnPiYgcmVnc0luUHJpb3JpdHlPcmRlciwgSW5kZXhUeXBl
IGxhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleCwgdW5zaWduZWQgdG1wQXJyYXlTaXplLCBjb25z
dCBIYXNoU2V0PHVuc2lnbmVkPiYgdW5zcGlsbGFibGVUbXApCisgICAgICAgIDogbV9yZWdzSW5Q
cmlvcml0eU9yZGVyKHJlZ3NJblByaW9yaXR5T3JkZXIpCisgICAgICAgICwgbV9sYXN0UHJlY29s
b3JlZFJlZ2lzdGVySW5kZXgobGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4KQorICAgICAgICAs
IG1fdW5zcGlsbGFibGVUbXBzKHVuc3BpbGxhYmxlVG1wKQorICAgIHsKKyAgICAgICAgZm9yIChS
ZWcgcmVnIDogbV9yZWdzSW5Qcmlvcml0eU9yZGVyKQorICAgICAgICAgICAgbV9tdXRhYmxlUmVn
cy5zZXQocmVnKTsKKyAgICAgICAgCisgICAgICAgIGluaXRpYWxpemVEZWdyZWVzKHRtcEFycmF5
U2l6ZSk7CisgICAgICAgIAorICAgICAgICBtX2FkamFjZW5jeUxpc3QucmVzaXplKHRtcEFycmF5
U2l6ZSk7CisgICAgICAgIG1fbW92ZUxpc3QucmVzaXplKHRtcEFycmF5U2l6ZSk7CisgICAgICAg
IG1fY29hbGVzY2VkVG1wcy5maWxsKDAsIHRtcEFycmF5U2l6ZSk7CisgICAgICAgIG1faXNPblNl
bGVjdFN0YWNrLmVuc3VyZVNpemUodG1wQXJyYXlTaXplKTsKKyAgICB9CisKK3Byb3RlY3RlZDoK
KyAgICBJbmRleFR5cGUgZ2V0QWxpYXMoSW5kZXhUeXBlIHRtcEluZGV4KSBjb25zdAorICAgIHsK
KyAgICAgICAgSW5kZXhUeXBlIGFsaWFzID0gdG1wSW5kZXg7CisgICAgICAgIHdoaWxlIChJbmRl
eFR5cGUgbmV4dEFsaWFzID0gbV9jb2FsZXNjZWRUbXBzW2FsaWFzXSkKKyAgICAgICAgICAgIGFs
aWFzID0gbmV4dEFsaWFzOworICAgICAgICByZXR1cm4gYWxpYXM7CisgICAgfQorCisgICAgdm9p
ZCBhZGRFZGdlKEluZGV4VHlwZSBhLCBJbmRleFR5cGUgYikKKyAgICB7CisgICAgICAgIGlmIChh
ID09IGIpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGFkZEVkZ2VEaXN0aW5jdChhLCBi
KTsKKyAgICB9CisKKyAgICB2b2lkIG1ha2VXb3JrTGlzdCgpCisgICAgeworICAgICAgICBJbmRl
eFR5cGUgZmlyc3ROb25SZWdJbmRleCA9IG1fbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4ICsg
MTsKKyAgICAgICAgZm9yIChJbmRleFR5cGUgaSA9IGZpcnN0Tm9uUmVnSW5kZXg7IGkgPCBtX2Rl
Z3JlZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGRlZ3JlZSA9IG1fZGVn
cmVlc1tpXTsKKyAgICAgICAgICAgIGlmIChkZWdyZWUgPj0gbV9yZWdzSW5Qcmlvcml0eU9yZGVy
LnNpemUoKSkKKyAgICAgICAgICAgICAgICBhZGRUb1NwaWxsKGkpOworICAgICAgICAgICAgZWxz
ZSBpZiAoIW1fbW92ZUxpc3RbaV0uaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIG1fZnJlZXpl
V29ya2xpc3QuYWRkKGkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1fc2lt
cGxpZnlXb3JrbGlzdC5hcHBlbmQoaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGFk
ZFRvU3BpbGwodW5zaWduZWQgdG9TcGlsbCkKKyAgICB7CisgICAgICAgIGlmIChtX3Vuc3BpbGxh
YmxlVG1wcy5jb250YWlucyh0b1NwaWxsKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAg
ICBtX3NwaWxsV29ya2xpc3QuYWRkKHRvU3BpbGwpOworICAgIH0KKworICAgIC8vIExvdy1kZWdy
ZWUgdmVydGV4IGNhbiBhbHdheXMgYmUgY29sb3JlZDoganVzdCBwaWNrIGFueSBvZiB0aGUgY29s
b3IgdGFrZW4gYnkgYW55CisgICAgLy8gb3RoZXIgYWRqYWNlbnQgdmVyaWNlcy4KKyAgICAvLyBU
aGUgIlNpbXBsaWZ5IiBwaGFzZSB0YWtlcyBhIGxvdy1kZWdyZWUgb3V0IG9mIHRoZSBpbnRlcmZl
cmVuY2UgZ3JhcGggdG8gc2ltcGxpZnkgaXQuCisgICAgdm9pZCBzaW1wbGlmeSgpCisgICAgewor
ICAgICAgICBJbmRleFR5cGUgbGFzdEluZGV4ID0gbV9zaW1wbGlmeVdvcmtsaXN0LnRha2VMYXN0
KCk7CisKKyAgICAgICAgQVNTRVJUKCFtX3NlbGVjdFN0YWNrLmNvbnRhaW5zKGxhc3RJbmRleCkp
OworICAgICAgICBBU1NFUlQoIW1faXNPblNlbGVjdFN0YWNrLmdldChsYXN0SW5kZXgpKTsKKyAg
ICAgICAgbV9zZWxlY3RTdGFjay5hcHBlbmQobGFzdEluZGV4KTsKKyAgICAgICAgbV9pc09uU2Vs
ZWN0U3RhY2sucXVpY2tTZXQobGFzdEluZGV4KTsKKworICAgICAgICBmb3JFYWNoQWRqYWNlbnQo
bGFzdEluZGV4LCBbdGhpc10oSW5kZXhUeXBlIGFkamFjZW50VG1wSW5kZXgpIHsKKyAgICAgICAg
ICAgIGRlY3JlbWVudERlZ3JlZShhZGphY2VudFRtcEluZGV4KTsKKyAgICAgICAgfSk7CisgICAg
fQorCisgICAgdm9pZCBmcmVlemUoKQorICAgIHsKKyAgICAgICAgSW5kZXhUeXBlIHZpY3RpbUlu
ZGV4ID0gbV9mcmVlemVXb3JrbGlzdC50YWtlQW55KCk7CisgICAgICAgIEFTU0VSVF9XSVRIX01F
U1NBR0UoZ2V0QWxpYXModmljdGltSW5kZXgpID09IHZpY3RpbUluZGV4LCAiY29hbGVzY2UoKSBz
aG91bGQgbm90IGxlYXZlIGFsaWFzZWQgVG1wIGluIHRoZSB3b3JrbGlzdC4iKTsKKyAgICAgICAg
bV9zaW1wbGlmeVdvcmtsaXN0LmFwcGVuZCh2aWN0aW1JbmRleCk7CisgICAgICAgIGZyZWV6ZU1v
dmVzKHZpY3RpbUluZGV4KTsKKyAgICB9CisKKyAgICB2b2lkIGZyZWV6ZU1vdmVzKEluZGV4VHlw
ZSB0bXBJbmRleCkKKyAgICB7CisgICAgICAgIGZvckVhY2hOb2RlTW92ZXModG1wSW5kZXgsIFt0
aGlzLCB0bXBJbmRleF0gKEluZGV4VHlwZSBtb3ZlSW5kZXgpIHsKKyAgICAgICAgICAgIGlmICgh
bV9hY3RpdmVNb3Zlcy5xdWlja0NsZWFyKG1vdmVJbmRleCkpCisgICAgICAgICAgICAgICAgbV93
b3JrbGlzdE1vdmVzLnRha2VNb3ZlKG1vdmVJbmRleCk7CisKKyAgICAgICAgICAgIGNvbnN0IE1v
dmVPcGVyYW5kcyYgbW92ZU9wZXJhbmRzID0gbV9jb2FsZXNjaW5nQ2FuZGlkYXRlc1ttb3ZlSW5k
ZXhdOworICAgICAgICAgICAgSW5kZXhUeXBlIHNyY1RtcEluZGV4ID0gbW92ZU9wZXJhbmRzLnNy
Y0luZGV4OworICAgICAgICAgICAgSW5kZXhUeXBlIGRzdFRtcEluZGV4ID0gbW92ZU9wZXJhbmRz
LmRzdEluZGV4OworCisgICAgICAgICAgICBJbmRleFR5cGUgb3JpZ2luYWxPdGhlclRtcCA9IHNy
Y1RtcEluZGV4ICE9IHRtcEluZGV4ID8gc3JjVG1wSW5kZXggOiBkc3RUbXBJbmRleDsKKyAgICAg
ICAgICAgIEluZGV4VHlwZSBvdGhlclRtcEluZGV4ID0gZ2V0QWxpYXMob3JpZ2luYWxPdGhlclRt
cCk7CisgICAgICAgICAgICBpZiAobV9kZWdyZWVzW290aGVyVG1wSW5kZXhdIDwgbV9yZWdzSW5Q
cmlvcml0eU9yZGVyLnNpemUoKSAmJiAhaXNNb3ZlUmVsYXRlZChvdGhlclRtcEluZGV4KSkgewor
ICAgICAgICAgICAgICAgIGlmIChtX2ZyZWV6ZVdvcmtsaXN0LnJlbW92ZShvdGhlclRtcEluZGV4
KSkKKyAgICAgICAgICAgICAgICAgICAgbV9zaW1wbGlmeVdvcmtsaXN0LmFwcGVuZChvdGhlclRt
cEluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgdm9pZCBj
b2FsZXNjZSgpCisgICAgeworICAgICAgICB1bnNpZ25lZCBtb3ZlSW5kZXggPSBtX3dvcmtsaXN0
TW92ZXMudGFrZUxhc3RNb3ZlKCk7CisgICAgICAgIGNvbnN0IE1vdmVPcGVyYW5kcyYgbW92ZU9w
ZXJhbmRzID0gbV9jb2FsZXNjaW5nQ2FuZGlkYXRlc1ttb3ZlSW5kZXhdOworICAgICAgICBJbmRl
eFR5cGUgdSA9IGdldEFsaWFzKG1vdmVPcGVyYW5kcy5zcmNJbmRleCk7CisgICAgICAgIEluZGV4
VHlwZSB2ID0gZ2V0QWxpYXMobW92ZU9wZXJhbmRzLmRzdEluZGV4KTsKKworICAgICAgICBpZiAo
aXNQcmVjb2xvcmVkKHYpKQorICAgICAgICAgICAgc3RkOjpzd2FwKHUsIHYpOworCisgICAgICAg
IGlmICh0cmFjZURlYnVnKQorICAgICAgICAgICAgZGF0YUxvZygiQ29hbGVzY2luZyBtb3ZlIGF0
IGluZGV4ICIsIG1vdmVJbmRleCwgIiB1ID0gIiwgdSwgIiB2ID0gIiwgdiwgIlxuIik7CisKKyAg
ICAgICAgaWYgKHUgPT0gdikgeworICAgICAgICAgICAgYWRkV29ya0xpc3QodSk7CisKKyAgICAg
ICAgICAgIGlmICh0cmFjZURlYnVnKQorICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICBDb2Fs
ZXNjZWRcbiIpOworICAgICAgICB9IGVsc2UgaWYgKGlzUHJlY29sb3JlZCh2KQorICAgICAgICAg
ICAgfHwgbV9pbnRlcmZlcmVuY2VFZGdlcy5jb250YWlucyhJbnRlcmZlcmVuY2VFZGdlKHUsIHYp
KQorICAgICAgICAgICAgfHwgKHUgPT0gbV9mcmFtZVBvaW50ZXJJbmRleCAmJiBtX2ludGVyZmVy
ZXNXaXRoRnJhbWVQb2ludGVyLnF1aWNrR2V0KHYpKSkgeworICAgICAgICAgICAgYWRkV29ya0xp
c3QodSk7CisgICAgICAgICAgICBhZGRXb3JrTGlzdCh2KTsKKworICAgICAgICAgICAgaWYgKHRy
YWNlRGVidWcpCisgICAgICAgICAgICAgICAgZGF0YUxvZygiICAgIENvbnN0cmFpbmVkXG4iKTsK
KyAgICAgICAgfSBlbHNlIGlmIChjYW5CZVNhZmVseUNvYWxlc2NlZCh1LCB2KSkgeworICAgICAg
ICAgICAgY29tYmluZSh1LCB2KTsKKyAgICAgICAgICAgIGFkZFdvcmtMaXN0KHUpOworICAgICAg
ICAgICAgbV9oYXNDb2FsZXNjZWROb25Ucml2aWFsTW92ZSA9IHRydWU7CisKKyAgICAgICAgICAg
IGlmICh0cmFjZURlYnVnKQorICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICBTYWZlIENvYWxl
c2NpbmdcbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbV9hY3RpdmVNb3Zlcy5x
dWlja1NldChtb3ZlSW5kZXgpOworCisgICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKKyAgICAg
ICAgICAgICAgICBkYXRhTG9nKCIgICAgRmFpbGVkIGNvYWxlc2NpbmcsIGFkZGVkIHRvIGFjdGl2
ZSBtb3Zlcy5cbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBhc3NpZ25Db2xvcnMo
KQorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fc2ltcGxpZnlXb3JrbGlzdC5pc0VtcHR5KCkpOwor
ICAgICAgICBBU1NFUlQobV93b3JrbGlzdE1vdmVzLmlzRW1wdHkoKSk7CisgICAgICAgIEFTU0VS
VChtX2ZyZWV6ZVdvcmtsaXN0LmlzRW1wdHkoKSk7CisgICAgICAgIEFTU0VSVChtX3NwaWxsV29y
a2xpc3QuaXNFbXB0eSgpKTsKKworICAgICAgICAvLyBSZWNsYWltIGFzIG11Y2ggbWVtb3J5IGFz
IHBvc3NpYmxlLgorICAgICAgICBtX2ludGVyZmVyZW5jZUVkZ2VzLmNsZWFyKCk7CisgICAgICAg
IG1fZGVncmVlcy5jbGVhcigpOworICAgICAgICBtX21vdmVMaXN0LmNsZWFyKCk7CisgICAgICAg
IG1fd29ya2xpc3RNb3Zlcy5jbGVhcigpOworICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuY2xl
YXIoKTsKKyAgICAgICAgbV9zcGlsbFdvcmtsaXN0LmNsZWFyKCk7CisgICAgICAgIG1fZnJlZXpl
V29ya2xpc3QuY2xlYXIoKTsKKworICAgICAgICAvLyBUcnkgdG8gY29sb3IgdGhlIFRtcCBvbiB0
aGUgc3RhY2suCisgICAgICAgIG1fY29sb3JlZFRtcC5yZXNpemUobV9hZGphY2VuY3lMaXN0LnNp
emUoKSk7CisKKyAgICAgICAgd2hpbGUgKCFtX3NlbGVjdFN0YWNrLmlzRW1wdHkoKSkgeworICAg
ICAgICAgICAgdW5zaWduZWQgdG1wSW5kZXggPSBtX3NlbGVjdFN0YWNrLnRha2VMYXN0KCk7Cisg
ICAgICAgICAgICBBU1NFUlQoIWlzUHJlY29sb3JlZCh0bXBJbmRleCkpOworICAgICAgICAgICAg
QVNTRVJUKCFtX2NvbG9yZWRUbXBbdG1wSW5kZXhdKTsKKworICAgICAgICAgICAgUmVnaXN0ZXJT
ZXQgY29sb3JlZFJlZ2lzdGVyczsKKyAgICAgICAgICAgIGZvciAoSW5kZXhUeXBlIGFkamFjZW50
VG1wSW5kZXggOiBtX2FkamFjZW5jeUxpc3RbdG1wSW5kZXhdKSB7CisgICAgICAgICAgICAgICAg
SW5kZXhUeXBlIGFsaWFzVG1wSW5kZXggPSBnZXRBbGlhcyhhZGphY2VudFRtcEluZGV4KTsKKyAg
ICAgICAgICAgICAgICBSZWcgcmVnID0gbV9jb2xvcmVkVG1wW2FsaWFzVG1wSW5kZXhdOworCisg
ICAgICAgICAgICAgICAgQVNTRVJUKCFpc1ByZWNvbG9yZWQoYWxpYXNUbXBJbmRleCkgfHwgKGlz
UHJlY29sb3JlZChhbGlhc1RtcEluZGV4KSAmJiByZWcpKTsKKworICAgICAgICAgICAgICAgIGlm
IChyZWcpCisgICAgICAgICAgICAgICAgICAgIGNvbG9yZWRSZWdpc3RlcnMuc2V0KHJlZyk7Cisg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgY29sb3JBc3NpZ25lZCA9IGZhbHNlOwor
ICAgICAgICAgICAgZm9yIChSZWcgcmVnIDogbV9yZWdzSW5Qcmlvcml0eU9yZGVyKSB7CisgICAg
ICAgICAgICAgICAgaWYgKCFjb2xvcmVkUmVnaXN0ZXJzLmdldChyZWcpKSB7CisgICAgICAgICAg
ICAgICAgICAgIG1fY29sb3JlZFRtcFt0bXBJbmRleF0gPSByZWc7CisgICAgICAgICAgICAgICAg
ICAgIGNvbG9yQXNzaWduZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghY29sb3JB
c3NpZ25lZCkKKyAgICAgICAgICAgICAgICBtX3NwaWxsZWRUbXBzLmFwcGVuZCh0bXBJbmRleCk7
CisgICAgICAgIH0KKyAgICAgICAgbV9zZWxlY3RTdGFjay5jbGVhcigpOworCisgICAgICAgIGlm
IChtX3NwaWxsZWRUbXBzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIG1fY29hbGVzY2VkVG1wc0F0
U3BpbGwuY2xlYXIoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbV9jb2xvcmVkVG1wLmNs
ZWFyKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIHZvaWQgaW5pdGlhbGl6ZURlZ3JlZXModW5z
aWduZWQgdG1wQXJyYXlTaXplKQorICAgIHsKKyAgICAgICAgbV9kZWdyZWVzLnJlc2l6ZSh0bXBB
cnJheVNpemUpOworCisgICAgICAgIC8vIEFsbCBwcmVjb2xvcmVkIHJlZ2lzdGVycyBoYXZlICBh
biAiaW5maW5pdGUiIGRlZ3JlZS4KKyAgICAgICAgdW5zaWduZWQgZmlyc3ROb25SZWdJbmRleCA9
IG1fbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4ICsgMTsKKyAgICAgICAgZm9yICh1bnNpZ25l
ZCBpID0gMDsgaSA8IGZpcnN0Tm9uUmVnSW5kZXg7ICsraSkKKyAgICAgICAgICAgIG1fZGVncmVl
c1tpXSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgoKTsKKworICAgICAgICBt
ZW1zZXQobV9kZWdyZWVzLmRhdGEoKSArIGZpcnN0Tm9uUmVnSW5kZXgsIDAsICh0bXBBcnJheVNp
emUgLSBmaXJzdE5vblJlZ0luZGV4KSAqIHNpemVvZih1bnNpZ25lZCkpOworICAgIH0KKworICAg
IHZvaWQgYWRkRWRnZURpc3RpbmN0KEluZGV4VHlwZSBhLCBJbmRleFR5cGUgYikKKyAgICB7Cisg
ICAgICAgIEFTU0VSVChhICE9IGIpOworICAgICAgICBpZiAobV9pbnRlcmZlcmVuY2VFZGdlcy5h
ZGQoSW50ZXJmZXJlbmNlRWRnZShhLCBiKSkuaXNOZXdFbnRyeSkgeworICAgICAgICAgICAgaWYg
KCFpc1ByZWNvbG9yZWQoYSkpIHsKKyAgICAgICAgICAgICAgICBBU1NFUlQoIW1fYWRqYWNlbmN5
TGlzdFthXS5jb250YWlucyhiKSk7CisgICAgICAgICAgICAgICAgbV9hZGphY2VuY3lMaXN0W2Fd
LmFwcGVuZChiKTsKKyAgICAgICAgICAgICAgICBtX2RlZ3JlZXNbYV0rKzsKKyAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgaWYgKCFpc1ByZWNvbG9yZWQoYikpIHsKKyAgICAgICAgICAgICAg
ICBBU1NFUlQoIW1fYWRqYWNlbmN5TGlzdFtiXS5jb250YWlucyhhKSk7CisgICAgICAgICAgICAg
ICAgbV9hZGphY2VuY3lMaXN0W2JdLmFwcGVuZChhKTsKKyAgICAgICAgICAgICAgICBtX2RlZ3Jl
ZXNbYl0rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgZGVj
cmVtZW50RGVncmVlKEluZGV4VHlwZSB0bXBJbmRleCkKKyAgICB7CisgICAgICAgIEFTU0VSVCht
X2RlZ3JlZXNbdG1wSW5kZXhdKTsKKworICAgICAgICB1bnNpZ25lZCBvbGREZWdyZWUgPSBtX2Rl
Z3JlZXNbdG1wSW5kZXhdLS07CisgICAgICAgIGlmIChvbGREZWdyZWUgPT0gbV9yZWdzSW5Qcmlv
cml0eU9yZGVyLnNpemUoKSkgeworICAgICAgICAgICAgZW5hYmxlTW92ZXNPblZhbHVlQW5kQWRq
YWNlbnRzKHRtcEluZGV4KTsKKyAgICAgICAgICAgIG1fc3BpbGxXb3JrbGlzdC5yZW1vdmUodG1w
SW5kZXgpOworICAgICAgICAgICAgaWYgKGlzTW92ZVJlbGF0ZWQodG1wSW5kZXgpKQorICAgICAg
ICAgICAgICAgIG1fZnJlZXplV29ya2xpc3QuYWRkKHRtcEluZGV4KTsKKyAgICAgICAgICAgIGVs
c2UKKyAgICAgICAgICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuYXBwZW5kKHRtcEluZGV4KTsK
KyAgICAgICAgfQorICAgIH0KKworCisgICAgYm9vbCBhZGRFZGdlRGlzdGluY3RXaXRob3V0RGVn
cmVlQ2hhbmdlKEluZGV4VHlwZSBhLCBJbmRleFR5cGUgYikKKyAgICB7CisgICAgICAgIEFTU0VS
VChhICE9IGIpOworICAgICAgICBpZiAobV9pbnRlcmZlcmVuY2VFZGdlcy5hZGQoSW50ZXJmZXJl
bmNlRWRnZShhLCBiKSkuaXNOZXdFbnRyeSkgeworICAgICAgICAgICAgaWYgKCFpc1ByZWNvbG9y
ZWQoYSkpIHsKKyAgICAgICAgICAgICAgICBBU1NFUlQoIW1fYWRqYWNlbmN5TGlzdFthXS5jb250
YWlucyhiKSk7CisgICAgICAgICAgICAgICAgbV9hZGphY2VuY3lMaXN0W2FdLmFwcGVuZChiKTsK
KyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFpc1ByZWNvbG9yZWQoYikpIHsKKyAg
ICAgICAgICAgICAgICBBU1NFUlQoIW1fYWRqYWNlbmN5TGlzdFtiXS5jb250YWlucyhhKSk7Cisg
ICAgICAgICAgICAgICAgbV9hZGphY2VuY3lMaXN0W2JdLmFwcGVuZChhKTsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICB9CisKKyAgICBib29sIGlzTW92ZVJlbGF0ZWQoSW5kZXhUeXBlIHRtcEluZGV4
KQorICAgIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBtb3ZlSW5kZXggOiBtX21vdmVMaXN0W3Rt
cEluZGV4XSkgeworICAgICAgICAgICAgaWYgKG1fYWN0aXZlTW92ZXMucXVpY2tHZXQobW92ZUlu
ZGV4KSB8fCBtX3dvcmtsaXN0TW92ZXMuY29udGFpbnMobW92ZUluZGV4KSkKKyAgICAgICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
fQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rpb24+CisgICAgdm9pZCBmb3JFYWNoQWRq
YWNlbnQoSW5kZXhUeXBlIHRtcEluZGV4LCBGdW5jdGlvbiBmdW5jdGlvbikKKyAgICB7CisgICAg
ICAgIGZvciAoSW5kZXhUeXBlIGFkamFjZW50VG1wSW5kZXggOiBtX2FkamFjZW5jeUxpc3RbdG1w
SW5kZXhdKSB7CisgICAgICAgICAgICBpZiAoIWhhc0JlZW5TaW1wbGlmaWVkKGFkamFjZW50VG1w
SW5kZXgpKQorICAgICAgICAgICAgICAgIGZ1bmN0aW9uKGFkamFjZW50VG1wSW5kZXgpOworICAg
ICAgICB9CisgICAgfQorCisgICAgYm9vbCBoYXNCZWVuU2ltcGxpZmllZChJbmRleFR5cGUgdG1w
SW5kZXgpCisgICAgeworICAgICAgICByZXR1cm4gbV9pc09uU2VsZWN0U3RhY2sucXVpY2tHZXQo
dG1wSW5kZXgpIHx8ICEhbV9jb2FsZXNjZWRUbXBzW3RtcEluZGV4XTsKKyAgICB9CisKKyAgICB0
ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdGlvbj4KKyAgICB2b2lkIGZvckVhY2hOb2RlTW92ZXMoSW5k
ZXhUeXBlIHRtcEluZGV4LCBGdW5jdGlvbiBmdW5jdGlvbikKKyAgICB7CisgICAgICAgIGZvciAo
dW5zaWduZWQgbW92ZUluZGV4IDogbV9tb3ZlTGlzdFt0bXBJbmRleF0pIHsKKyAgICAgICAgICAg
IGlmIChtX2FjdGl2ZU1vdmVzLnF1aWNrR2V0KG1vdmVJbmRleCkgfHwgbV93b3JrbGlzdE1vdmVz
LmNvbnRhaW5zKG1vdmVJbmRleCkpCisgICAgICAgICAgICAgICAgZnVuY3Rpb24obW92ZUluZGV4
KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgZW5hYmxlTW92ZXNPblZhbHVlKEluZGV4
VHlwZSB0bXBJbmRleCkKKyAgICB7CisgICAgICAgIGZvciAodW5zaWduZWQgbW92ZUluZGV4IDog
bV9tb3ZlTGlzdFt0bXBJbmRleF0pIHsKKyAgICAgICAgICAgIGlmIChtX2FjdGl2ZU1vdmVzLnF1
aWNrQ2xlYXIobW92ZUluZGV4KSkKKyAgICAgICAgICAgICAgICBtX3dvcmtsaXN0TW92ZXMucmV0
dXJuTW92ZShtb3ZlSW5kZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBlbmFibGVN
b3Zlc09uVmFsdWVBbmRBZGphY2VudHMoSW5kZXhUeXBlIHRtcEluZGV4KQorICAgIHsKKyAgICAg
ICAgZW5hYmxlTW92ZXNPblZhbHVlKHRtcEluZGV4KTsKKworICAgICAgICBmb3JFYWNoQWRqYWNl
bnQodG1wSW5kZXgsIFt0aGlzXSAoSW5kZXhUeXBlIGFkamFjZW50VG1wSW5kZXgpIHsKKyAgICAg
ICAgICAgIGVuYWJsZU1vdmVzT25WYWx1ZShhZGphY2VudFRtcEluZGV4KTsKKyAgICAgICAgfSk7
CisgICAgfQorCisgICAgYm9vbCBpc1ByZWNvbG9yZWQoSW5kZXhUeXBlIHRtcEluZGV4KQorICAg
IHsKKyAgICAgICAgcmV0dXJuIHRtcEluZGV4IDw9IG1fbGFzdFByZWNvbG9yZWRSZWdpc3Rlcklu
ZGV4OworICAgIH0KKworICAgIHZvaWQgYWRkV29ya0xpc3QoSW5kZXhUeXBlIHRtcEluZGV4KQor
ICAgIHsKKyAgICAgICAgaWYgKCFpc1ByZWNvbG9yZWQodG1wSW5kZXgpICYmIG1fZGVncmVlc1t0
bXBJbmRleF0gPCBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpICYmICFpc01vdmVSZWxhdGVk
KHRtcEluZGV4KSkgeworICAgICAgICAgICAgbV9mcmVlemVXb3JrbGlzdC5yZW1vdmUodG1wSW5k
ZXgpOworICAgICAgICAgICAgbV9zaW1wbGlmeVdvcmtsaXN0LmFwcGVuZCh0bXBJbmRleCk7Cisg
ICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGNvbWJpbmUoSW5kZXhUeXBlIHUsIEluZGV4VHlw
ZSB2KQorICAgIHsKKyAgICAgICAgaWYgKCFtX2ZyZWV6ZVdvcmtsaXN0LnJlbW92ZSh2KSkKKyAg
ICAgICAgICAgIG1fc3BpbGxXb3JrbGlzdC5yZW1vdmUodik7CisKKyAgICAgICAgQVNTRVJUKCFt
X2NvYWxlc2NlZFRtcHNbdl0pOworICAgICAgICBtX2NvYWxlc2NlZFRtcHNbdl0gPSB1OworCisg
ICAgICAgIGF1dG8mIHZNb3ZlcyA9IG1fbW92ZUxpc3Rbdl07CisgICAgICAgIG1fbW92ZUxpc3Rb
dV0uYWRkKHZNb3Zlcy5iZWdpbigpLCB2TW92ZXMuZW5kKCkpOworCisgICAgICAgIGZvckVhY2hB
ZGphY2VudCh2LCBbdGhpcywgdV0gKEluZGV4VHlwZSBhZGphY2VudFRtcEluZGV4KSB7CisgICAg
ICAgICAgICBpZiAoYWRkRWRnZURpc3RpbmN0V2l0aG91dERlZ3JlZUNoYW5nZShhZGphY2VudFRt
cEluZGV4LCB1KSkgeworICAgICAgICAgICAgICAgIC8vIElmIHdlIGFkZGVkIGEgbmV3IGVkZ2Ug
YmV0d2VlbiB0aGUgYWRqYWNlbnRUbXAgYW5kIHUsIGl0IHJlcGxhY2VzIHRoZSBlZGdlCisgICAg
ICAgICAgICAgICAgLy8gdGhhdCBleGlzdGVkIHdpdGggdi4KKyAgICAgICAgICAgICAgICAvLyBU
aGUgZGVncmVlIG9mIGFkamFjZW50VG1wIHJlbWFpbnMgdGhlIHNhbWUgc2luY2UgdGhlIGVkZ2Ug
anVzdCBjaGFuZ2VkIGZyb20gdSB0byB2LgorICAgICAgICAgICAgICAgIC8vIEFsbCB3ZSBuZWVk
IHRvIGRvIGlzIHVwZGF0ZSB0aGUgZGVncmVlIG9mIHUuCisgICAgICAgICAgICAgICAgaWYgKCFp
c1ByZWNvbG9yZWQodSkpCisgICAgICAgICAgICAgICAgICAgIG1fZGVncmVlc1t1XSsrOworICAg
ICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSBhbHJlYWR5IGhhZCBh
biBlZGdlIGJldHdlZW4gdGhlIGFkamFjZW50VG1wIGFuZCB1LCB0aGUgZGVncmVlIG9mIHUKKyAg
ICAgICAgICAgICAgICAvLyBpcyBhbHJlYWR5IGNvcnJlY3QuIFRoZSBkZWdyZWUgb2YgdGhlIGFk
amFjZW50VG1wIGRlY3JlYXNlcyBzaW5jZSB0aGUgZWRnZQorICAgICAgICAgICAgICAgIC8vIHdp
dGggdiBpcyBubyBsb25nZXIgcmVsZXZhbnQgKHdlIGNhbiB0aGluayBvZiBpdCBhcyBtZXJnZWQg
d2l0aCB0aGUgZWRnZSB3aXRoIHUpLgorICAgICAgICAgICAgICAgIGRlY3JlbWVudERlZ3JlZShh
ZGphY2VudFRtcEluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAg
aWYgKG1fZnJhbWVQb2ludGVySW5kZXggJiYgbV9pbnRlcmZlcmVzV2l0aEZyYW1lUG9pbnRlci5x
dWlja0dldCh2KSkKKyAgICAgICAgICAgIG1faW50ZXJmZXJlc1dpdGhGcmFtZVBvaW50ZXIucXVp
Y2tTZXQodSk7CisKKyAgICAgICAgaWYgKG1fZGVncmVlc1t1XSA+PSBtX3JlZ3NJblByaW9yaXR5
T3JkZXIuc2l6ZSgpICYmIG1fZnJlZXplV29ya2xpc3QucmVtb3ZlKHUpKQorICAgICAgICAgICAg
YWRkVG9TcGlsbCh1KTsKKyAgICB9CisKKyAgICBib29sIGNhbkJlU2FmZWx5Q29hbGVzY2VkKElu
ZGV4VHlwZSB1LCBJbmRleFR5cGUgdikKKyAgICB7CisgICAgICAgIEFTU0VSVCghaXNQcmVjb2xv
cmVkKHYpKTsKKyAgICAgICAgaWYgKGlzUHJlY29sb3JlZCh1KSkKKyAgICAgICAgICAgIHJldHVy
biBwcmVjb2xvcmVkQ29hbGVzY2luZ0hldXJpc3RpYyh1LCB2KTsKKyAgICAgICAgcmV0dXJuIGNv
bnNlcnZhdGl2ZUhldXJpc3RpYyh1LCB2KTsKKyAgICB9CisKKyAgICBib29sIGNvbnNlcnZhdGl2
ZUhldXJpc3RpYyhJbmRleFR5cGUgdSwgSW5kZXhUeXBlIHYpCisgICAgeworICAgICAgICAvLyBU
aGlzIGlzIHVzaW5nIHRoZSBCcmlnZ3MnIGNvbnNlcnZhdGl2ZSBjb2FsZXNjaW5nIHJ1bGU6Cisg
ICAgICAgIC8vIElmIHRoZSBudW1iZXIgb2YgY29tYmluZWQgYWRqYWNlbnQgbm9kZSB3aXRoIGEg
ZGVncmVlID49IEsgaXMgbGVzcyB0aGFuIEssCisgICAgICAgIC8vIGl0IGlzIHNhZmUgdG8gY29t
YmluZSB0aGUgdHdvIG5vZGVzLiBUaGUgcmVhc29uIGlzIHRoYXQgd2Uga25vdyB0aGF0IGlmIHRo
ZSBncmFwaAorICAgICAgICAvLyBpcyBjb2xvcmFibGUsIHdlIGhhdmUgZmV3ZXIgdGhhbiBLIGFk
amFjZW50cyB3aXRoIGhpZ2ggb3JkZXIgYW5kIHRoZXJlIGlzIGEgY29sb3IKKyAgICAgICAgLy8g
Zm9yIHRoZSBjdXJyZW50IG5vZGUuCisgICAgICAgIEFTU0VSVCh1ICE9IHYpOworICAgICAgICBB
U1NFUlQoIWlzUHJlY29sb3JlZCh1KSk7CisgICAgICAgIEFTU0VSVCghaXNQcmVjb2xvcmVkKHYp
KTsKKworICAgICAgICBjb25zdCBhdXRvJiBhZGphY2VudHNPZlUgPSBtX2FkamFjZW5jeUxpc3Rb
dV07CisgICAgICAgIGNvbnN0IGF1dG8mIGFkamFjZW50c09mViA9IG1fYWRqYWNlbmN5TGlzdFt2
XTsKKworICAgICAgICBpZiAoYWRqYWNlbnRzT2ZVLnNpemUoKSArIGFkamFjZW50c09mVi5zaXpl
KCkgPCBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpKSB7CisgICAgICAgICAgICAvLyBTaG9y
dGN1dDogaWYgdGhlIHRvdGFsIG51bWJlciBvZiBhZGphY2VudHMgaXMgbGVzcyB0aGFuIHRoZSBu
dW1iZXIgb2YgcmVnaXN0ZXIsIHRoZSBjb25kaXRpb24gaXMgYWx3YXlzIG1ldC4KKyAgICAgICAg
ICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgSGFzaFNldDxJbmRleFR5cGU+
IGhpZ2hPcmRlckFkamFjZW50czsKKworICAgICAgICBmb3IgKEluZGV4VHlwZSBhZGphY2VudFRt
cEluZGV4IDogYWRqYWNlbnRzT2ZVKSB7CisgICAgICAgICAgICBBU1NFUlQoYWRqYWNlbnRUbXBJ
bmRleCAhPSB2KTsKKyAgICAgICAgICAgIEFTU0VSVChhZGphY2VudFRtcEluZGV4ICE9IHUpOwor
ICAgICAgICAgICAgaWYgKCFoYXNCZWVuU2ltcGxpZmllZChhZGphY2VudFRtcEluZGV4KSAmJiBt
X2RlZ3JlZXNbYWRqYWNlbnRUbXBJbmRleF0gPj0gbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUo
KSkgeworICAgICAgICAgICAgICAgIGF1dG8gYWRkUmVzdWx0ID0gaGlnaE9yZGVyQWRqYWNlbnRz
LmFkZChhZGphY2VudFRtcEluZGV4KTsKKyAgICAgICAgICAgICAgICBpZiAoYWRkUmVzdWx0Lmlz
TmV3RW50cnkgJiYgaGlnaE9yZGVyQWRqYWNlbnRzLnNpemUoKSA+PSBtX3JlZ3NJblByaW9yaXR5
T3JkZXIuc2l6ZSgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
ICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChJbmRleFR5cGUgYWRqYWNlbnRUbXBJbmRl
eCA6IGFkamFjZW50c09mVikgeworICAgICAgICAgICAgQVNTRVJUKGFkamFjZW50VG1wSW5kZXgg
IT0gdSk7CisgICAgICAgICAgICBBU1NFUlQoYWRqYWNlbnRUbXBJbmRleCAhPSB2KTsKKyAgICAg
ICAgICAgIGlmICghaGFzQmVlblNpbXBsaWZpZWQoYWRqYWNlbnRUbXBJbmRleCkgJiYgbV9kZWdy
ZWVzW2FkamFjZW50VG1wSW5kZXhdID49IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkpIHsK
KyAgICAgICAgICAgICAgICBhdXRvIGFkZFJlc3VsdCA9IGhpZ2hPcmRlckFkamFjZW50cy5hZGQo
YWRqYWNlbnRUbXBJbmRleCk7CisgICAgICAgICAgICAgICAgaWYgKGFkZFJlc3VsdC5pc05ld0Vu
dHJ5ICYmIGhpZ2hPcmRlckFkamFjZW50cy5zaXplKCkgPj0gbV9yZWdzSW5Qcmlvcml0eU9yZGVy
LnNpemUoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAg
fQorICAgICAgICB9CisKKyAgICAgICAgQVNTRVJUKGhpZ2hPcmRlckFkamFjZW50cy5zaXplKCkg
PCBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgfQorCisgICAgYm9vbCBwcmVjb2xvcmVkQ29hbGVzY2luZ0hldXJpc3RpYyhJbmRleFR5cGUg
dSwgSW5kZXhUeXBlIHYpCisgICAgeworICAgICAgICBpZiAodHJhY2VEZWJ1ZykKKyAgICAgICAg
ICAgIGRhdGFMb2coIiAgICBDaGVja2luZyBwcmVjb2xvcmVkQ29hbGVzY2luZ0hldXJpc3RpY1xu
Iik7CisgICAgICAgIEFTU0VSVChpc1ByZWNvbG9yZWQodSkpOworICAgICAgICBBU1NFUlQoIWlz
UHJlY29sb3JlZCh2KSk7CisgICAgICAgIAorICAgICAgICAvLyBJZiB1IGlzIGEgcGlubmVkIHJl
Z2lzdGVyIHRoZW4gaXQncyBhbHdheXMgc2FmZSB0byBjb2FsZXNjZS4gTm90ZSB0aGF0IHdoZW4g
d2UgY2FsbCB0aGlzLAorICAgICAgICAvLyB3ZSBoYXZlIGFscmVhZHkgcHJvdmVkIHRoYXQgdGhl
cmUgaXMgbm8gaW50ZXJmZXJlbmNlIGJldHdlZW4gdSBhbmQgdi4KKyAgICAgICAgaWYgKCFtX211
dGFibGVSZWdzLmdldChtX2NvbG9yZWRUbXBbdV0pKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7
CisKKyAgICAgICAgLy8gSWYgYW55IGFkamFjZW50IG9mIHRoZSBub24tY29sb3JlZCBub2RlIGlz
IG5vdCBhbiBhZGphY2VudCBvZiB0aGUgY29sb3JlZCBub2RlIEFORCBoYXMgYSBkZWdyZWUgPj0g
SworICAgICAgICAvLyB0aGVyZSBpcyBhIHJpc2sgdGhhdCB0aGlzIG5vZGUgbmVlZHMgdG8gaGF2
ZSB0aGUgc2FtZSBjb2xvciBhcyBvdXIgcHJlY29sb3JlZCBub2RlLiBJZiB3ZSBjb2FsZXNjZSBz
dWNoCisgICAgICAgIC8vIG1vdmUsIHdlIG1heSBjcmVhdGUgYW4gdW5jb2xvcmFibGUgZ3JhcGgu
CisgICAgICAgIGNvbnN0IGF1dG8mIGFkamFjZW50c09mViA9IG1fYWRqYWNlbmN5TGlzdFt2XTsK
KyAgICAgICAgZm9yICh1bnNpZ25lZCBhZGphY2VudFRtcEluZGV4IDogYWRqYWNlbnRzT2ZWKSB7
CisgICAgICAgICAgICBpZiAoIWlzUHJlY29sb3JlZChhZGphY2VudFRtcEluZGV4KQorICAgICAg
ICAgICAgICAgICYmICFoYXNCZWVuU2ltcGxpZmllZChhZGphY2VudFRtcEluZGV4KQorICAgICAg
ICAgICAgICAgICYmIG1fZGVncmVlc1thZGphY2VudFRtcEluZGV4XSA+PSBtX3JlZ3NJblByaW9y
aXR5T3JkZXIuc2l6ZSgpCisgICAgICAgICAgICAgICAgJiYgIW1faW50ZXJmZXJlbmNlRWRnZXMu
Y29udGFpbnMoSW50ZXJmZXJlbmNlRWRnZSh1LCBhZGphY2VudFRtcEluZGV4KSkpCisgICAgICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOwor
ICAgIH0KKworcHJvdGVjdGVkOgorI2lmIFBMQVRGT1JNKENPQ09BKQorI3ByYWdtYSBtYXJrIC0K
KyNlbmRpZgorCisgICAgLy8gSW50ZXJmZXJlbmNlIGVkZ2VzIGFyZSBub3QgZGlyZWN0ZWQuIEFu
IGVkZ2UgYmV0d2VlbiBhbnkgdHdvIFRtcHMgaXMgcmVwcmVzZW50ZWQKKyAgICAvLyBieSB0aGUg
Y29uY2F0ZW5hdGVkIHZhbHVlcyBvZiB0aGUgc21hbGxlc3QgVG1wIGZvbGxvd2VkIGJ5IHRoZSBi
aWdnZXIgVG1wLgorICAgIGNsYXNzIEludGVyZmVyZW5jZUVkZ2UgeworICAgIHB1YmxpYzoKKyAg
ICAgICAgSW50ZXJmZXJlbmNlRWRnZSgpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAg
IEludGVyZmVyZW5jZUVkZ2UoSW5kZXhUeXBlIGEsIEluZGV4VHlwZSBiKQorICAgICAgICB7Cisg
ICAgICAgICAgICBBU1NFUlQoYSk7CisgICAgICAgICAgICBBU1NFUlQoYik7CisgICAgICAgICAg
ICBBU1NFUlRfV0lUSF9NRVNTQUdFKGEgIT0gYiwgIkEgVG1wIGNhbiBuZXZlciBpbnRlcmZlcmUg
d2l0aCBpdHNlbGYuIERvaW5nIHNvIHdvdWxkIGZvcmNlIGl0IHRvIGJlIHRoZSBzdXBlcnBvc2l0
aW9uIG9mIHR3byByZWdpc3RlcnMuIik7CisKKyAgICAgICAgICAgIGlmIChiIDwgYSkKKyAgICAg
ICAgICAgICAgICBzdGQ6OnN3YXAoYSwgYik7CisgICAgICAgICAgICBtX3ZhbHVlID0gc3RhdGlj
X2Nhc3Q8dWludDY0X3Q+KGEpIDw8IDMyIHwgYjsKKyAgICAgICAgfQorCisgICAgICAgIEludGVy
ZmVyZW5jZUVkZ2UoV1RGOjpIYXNoVGFibGVEZWxldGVkVmFsdWVUeXBlKQorICAgICAgICAgICAg
OiBtX3ZhbHVlKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDY0X3Q+OjptYXgoKSkKKyAgICAgICAg
eworICAgICAgICB9CisKKyAgICAgICAgSW5kZXhUeXBlIGZpcnN0KCkgY29uc3QKKyAgICAgICAg
eworICAgICAgICAgICAgcmV0dXJuIG1fdmFsdWUgPj4gMzIgJiAweGZmZmZmZmZmOworICAgICAg
ICB9CisKKyAgICAgICAgSW5kZXhUeXBlIHNlY29uZCgpIGNvbnN0CisgICAgICAgIHsKKyAgICAg
ICAgICAgIHJldHVybiBtX3ZhbHVlICYgMHhmZmZmZmZmZjsKKyAgICAgICAgfQorCisgICAgICAg
IGJvb2wgb3BlcmF0b3I9PShjb25zdCBJbnRlcmZlcmVuY2VFZGdlIG90aGVyKSBjb25zdAorICAg
ICAgICB7CisgICAgICAgICAgICByZXR1cm4gbV92YWx1ZSA9PSBvdGhlci5tX3ZhbHVlOworICAg
ICAgICB9CisKKyAgICAgICAgYm9vbCBpc0hhc2hUYWJsZURlbGV0ZWRWYWx1ZSgpIGNvbnN0Cisg
ICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAqdGhpcyA9PSBJbnRlcmZlcmVuY2VFZGdlKFdU
Rjo6SGFzaFRhYmxlRGVsZXRlZFZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHVuc2lnbmVk
IGhhc2goKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gV1RGOjpJbnRIYXNo
PHVpbnQ2NF90Pjo6aGFzaChtX3ZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgZHVt
cChQcmludFN0cmVhbSYgb3V0KSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICBvdXQucHJp
bnQoZmlyc3QoKSwgIjw9PiIsIHNlY29uZCgpKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToK
KyAgICAgICAgdWludDY0X3QgbV92YWx1ZSB7IDAgfTsKKyAgICB9OworCisgICAgc3RydWN0IElu
dGVyZmVyZW5jZUVkZ2VIYXNoIHsKKyAgICAgICAgc3RhdGljIHVuc2lnbmVkIGhhc2goY29uc3Qg
SW50ZXJmZXJlbmNlRWRnZSYga2V5KSB7IHJldHVybiBrZXkuaGFzaCgpOyB9CisgICAgICAgIHN0
YXRpYyBib29sIGVxdWFsKGNvbnN0IEludGVyZmVyZW5jZUVkZ2UmIGEsIGNvbnN0IEludGVyZmVy
ZW5jZUVkZ2UmIGIpIHsgcmV0dXJuIGEgPT0gYjsgfQorICAgICAgICBzdGF0aWMgY29uc3QgYm9v
bCBzYWZlVG9Db21wYXJlVG9FbXB0eU9yRGVsZXRlZCA9IHRydWU7CisgICAgfTsKKyAgICB0eXBl
ZGVmIFNpbXBsZUNsYXNzSGFzaFRyYWl0czxJbnRlcmZlcmVuY2VFZGdlPiBJbnRlcmZlcmVuY2VF
ZGdlSGFzaFRyYWl0czsKKworICAgIGNvbnN0IFZlY3RvcjxSZWc+JiBtX3JlZ3NJblByaW9yaXR5
T3JkZXI7CisgICAgUmVnaXN0ZXJTZXQgbV9tdXRhYmxlUmVnczsKKyAgICBJbmRleFR5cGUgbV9s
YXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXggeyAwIH07CisKKyAgICAvLyBUaGUgaW50ZXJmZXJl
bmNlIGdyYXBoLgorICAgIEhhc2hTZXQ8SW50ZXJmZXJlbmNlRWRnZSwgSW50ZXJmZXJlbmNlRWRn
ZUhhc2gsIEludGVyZmVyZW5jZUVkZ2VIYXNoVHJhaXRzPiBtX2ludGVyZmVyZW5jZUVkZ2VzOwor
ICAgIFZlY3RvcjxWZWN0b3I8SW5kZXhUeXBlLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdywgND4s
IDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX2FkamFjZW5jeUxpc3Q7CisgICAgVmVjdG9yPElu
ZGV4VHlwZSwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fZGVncmVlczsKKworICAgIC8vIElu
c3RlYWQgb2Yga2VlcGluZyB0cmFjayBvZiB0aGUgbW92ZSBpbnN0cnVjdGlvbnMsIHdlIGp1c3Qg
a2VlcCB0aGVpciBvcGVyYW5kcyBhcm91bmQgYW5kIHVzZSB0aGUgaW5kZXgKKyAgICAvLyBpbiB0
aGUgdmVjdG9yIGFzIHRoZSAiaWRlbnRpZmllciIgZm9yIHRoZSBtb3ZlLgorICAgIHN0cnVjdCBN
b3ZlT3BlcmFuZHMgeworICAgICAgICBJbmRleFR5cGUgc3JjSW5kZXg7CisgICAgICAgIEluZGV4
VHlwZSBkc3RJbmRleDsKKyAgICB9OworICAgIFZlY3RvcjxNb3ZlT3BlcmFuZHMsIDAsIFVuc2Fm
ZVZlY3Rvck92ZXJmbG93PiBtX2NvYWxlc2NpbmdDYW5kaWRhdGVzOworCisgICAgLy8gTGlzdCBv
ZiBldmVyeSBtb3ZlIGluc3RydWN0aW9uIGFzc29jaWF0ZWQgd2l0aCBhIFRtcC4KKyAgICBWZWN0
b3I8SGFzaFNldDxJbmRleFR5cGUsIHR5cGVuYW1lIERlZmF1bHRIYXNoPEluZGV4VHlwZT46Okhh
c2gsIFdURjo6VW5zaWduZWRXaXRoWmVyb0tleUhhc2hUcmFpdHM8SW5kZXhUeXBlPj4+IG1fbW92
ZUxpc3Q7CisKKyAgICAvLyBDb2xvcnMuCisgICAgVmVjdG9yPFJlZywgMCwgVW5zYWZlVmVjdG9y
T3ZlcmZsb3c+IG1fY29sb3JlZFRtcDsKKyAgICBWZWN0b3I8SW5kZXhUeXBlPiBtX3NwaWxsZWRU
bXBzOworCisgICAgLy8gVmFsdWVzIHRoYXQgaGF2ZSBiZWVuIGNvYWxlc2NlZCB3aXRoIGFuIG90
aGVyIHZhbHVlLgorICAgIFZlY3RvcjxJbmRleFR5cGUsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93
PiBtX2NvYWxlc2NlZFRtcHM7CisKKyAgICAvLyBUaGUgc3RhY2sgb2YgVG1wIHJlbW92ZWQgZnJv
bSB0aGUgZ3JhcGggYW5kIHJlYWR5IGZvciBjb2xvcmluZy4KKyAgICBCaXRWZWN0b3IgbV9pc09u
U2VsZWN0U3RhY2s7CisgICAgVmVjdG9yPEluZGV4VHlwZT4gbV9zZWxlY3RTdGFjazsKKworICAg
IEluZGV4VHlwZSBtX2ZyYW1lUG9pbnRlckluZGV4IHsgMCB9OworICAgIEJpdFZlY3RvciBtX2lu
dGVyZmVyZXNXaXRoRnJhbWVQb2ludGVyOworCisgICAgc3RydWN0IE9yZGVyZWRNb3ZlU2V0IHsK
KyAgICAgICAgdW5zaWduZWQgYWRkTW92ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFTU0VS
VChtX2xvd1ByaW9yaXR5TW92ZUxpc3QuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgIEFTU0VSVCgh
bV9maXJzdExvd1ByaW9yaXR5TW92ZUluZGV4KTsKKworICAgICAgICAgICAgdW5zaWduZWQgbmV4
dEluZGV4ID0gbV9wb3NpdGlvbkluTW92ZUxpc3Quc2l6ZSgpOworICAgICAgICAgICAgdW5zaWdu
ZWQgcG9zaXRpb24gPSBtX21vdmVMaXN0LnNpemUoKTsKKyAgICAgICAgICAgIG1fbW92ZUxpc3Qu
YXBwZW5kKG5leHRJbmRleCk7CisgICAgICAgICAgICBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdC5hcHBl
bmQocG9zaXRpb24pOworICAgICAgICAgICAgcmV0dXJuIG5leHRJbmRleDsKKyAgICAgICAgfQor
CisgICAgICAgIHZvaWQgc3RhcnRBZGRpbmdMb3dQcmlvcml0eU1vdmVzKCkKKyAgICAgICAgewor
ICAgICAgICAgICAgQVNTRVJUKG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5pc0VtcHR5KCkpOworICAg
ICAgICAgICAgbV9maXJzdExvd1ByaW9yaXR5TW92ZUluZGV4ID0gbV9tb3ZlTGlzdC5zaXplKCk7
CisgICAgICAgIH0KKworICAgICAgICB1bnNpZ25lZCBhZGRMb3dQcmlvcml0eU1vdmUoKQorICAg
ICAgICB7CisgICAgICAgICAgICBBU1NFUlQobV9maXJzdExvd1ByaW9yaXR5TW92ZUluZGV4ID09
IG1fbW92ZUxpc3Quc2l6ZSgpKTsKKworICAgICAgICAgICAgdW5zaWduZWQgbmV4dEluZGV4ID0g
bV9wb3NpdGlvbkluTW92ZUxpc3Quc2l6ZSgpOworICAgICAgICAgICAgdW5zaWduZWQgcG9zaXRp
b24gPSBtX2xvd1ByaW9yaXR5TW92ZUxpc3Quc2l6ZSgpOworICAgICAgICAgICAgbV9sb3dQcmlv
cml0eU1vdmVMaXN0LmFwcGVuZChuZXh0SW5kZXgpOworICAgICAgICAgICAgbV9wb3NpdGlvbklu
TW92ZUxpc3QuYXBwZW5kKHBvc2l0aW9uKTsKKworICAgICAgICAgICAgQVNTRVJUKG5leHRJbmRl
eCA+PSBtX2ZpcnN0TG93UHJpb3JpdHlNb3ZlSW5kZXgpOworCisgICAgICAgICAgICByZXR1cm4g
bmV4dEluZGV4OworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBpc0VtcHR5KCkgY29uc3QKKyAg
ICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1fbW92ZUxpc3QuaXNFbXB0eSgpICYmIG1fbG93
UHJpb3JpdHlNb3ZlTGlzdC5pc0VtcHR5KCk7CisgICAgICAgIH0KKworICAgICAgICBib29sIGNv
bnRhaW5zKHVuc2lnbmVkIGluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbV9w
b3NpdGlvbkluTW92ZUxpc3RbaW5kZXhdICE9IHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQ+
OjptYXgoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgdGFrZU1vdmUodW5zaWduZWQgbW92
ZUluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBwb3NpdGlvbkluTW92ZUxp
c3QgPSBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdFttb3ZlSW5kZXhdOworICAgICAgICAgICAgaWYgKHBv
c2l0aW9uSW5Nb3ZlTGlzdCA9PSBzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4KCkp
CisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBpZiAobW92ZUluZGV4IDwg
bV9maXJzdExvd1ByaW9yaXR5TW92ZUluZGV4KSB7CisgICAgICAgICAgICAgICAgQVNTRVJUKG1f
bW92ZUxpc3RbcG9zaXRpb25Jbk1vdmVMaXN0XSA9PSBtb3ZlSW5kZXgpOworICAgICAgICAgICAg
ICAgIHVuc2lnbmVkIGxhc3RJbmRleCA9IG1fbW92ZUxpc3QubGFzdCgpOworICAgICAgICAgICAg
ICAgIG1fcG9zaXRpb25Jbk1vdmVMaXN0W2xhc3RJbmRleF0gPSBwb3NpdGlvbkluTW92ZUxpc3Q7
CisgICAgICAgICAgICAgICAgbV9tb3ZlTGlzdFtwb3NpdGlvbkluTW92ZUxpc3RdID0gbGFzdElu
ZGV4OworICAgICAgICAgICAgICAgIG1fbW92ZUxpc3QucmVtb3ZlTGFzdCgpOworICAgICAgICAg
ICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBU1NFUlQobV9sb3dQcmlvcml0eU1vdmVMaXN0
W3Bvc2l0aW9uSW5Nb3ZlTGlzdF0gPT0gbW92ZUluZGV4KTsKKyAgICAgICAgICAgICAgICB1bnNp
Z25lZCBsYXN0SW5kZXggPSBtX2xvd1ByaW9yaXR5TW92ZUxpc3QubGFzdCgpOworICAgICAgICAg
ICAgICAgIG1fcG9zaXRpb25Jbk1vdmVMaXN0W2xhc3RJbmRleF0gPSBwb3NpdGlvbkluTW92ZUxp
c3Q7CisgICAgICAgICAgICAgICAgbV9sb3dQcmlvcml0eU1vdmVMaXN0W3Bvc2l0aW9uSW5Nb3Zl
TGlzdF0gPSBsYXN0SW5kZXg7CisgICAgICAgICAgICAgICAgbV9sb3dQcmlvcml0eU1vdmVMaXN0
LnJlbW92ZUxhc3QoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbV9wb3NpdGlvbklu
TW92ZUxpc3RbbW92ZUluZGV4XSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgo
KTsKKworICAgICAgICAgICAgQVNTRVJUKCFjb250YWlucyhtb3ZlSW5kZXgpKTsKKyAgICAgICAg
fQorCisgICAgICAgIHVuc2lnbmVkIHRha2VMYXN0TW92ZSgpCisgICAgICAgIHsKKyAgICAgICAg
ICAgIEFTU0VSVCghaXNFbXB0eSgpKTsKKworICAgICAgICAgICAgdW5zaWduZWQgbGFzdEluZGV4
OworICAgICAgICAgICAgaWYgKCFtX21vdmVMaXN0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAg
ICAgIGxhc3RJbmRleCA9IG1fbW92ZUxpc3QudGFrZUxhc3QoKTsKKyAgICAgICAgICAgICAgICBB
U1NFUlQobV9wb3NpdGlvbkluTW92ZUxpc3RbbGFzdEluZGV4XSA9PSBtX21vdmVMaXN0LnNpemUo
KSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxhc3RJbmRleCA9IG1f
bG93UHJpb3JpdHlNb3ZlTGlzdC50YWtlTGFzdCgpOworICAgICAgICAgICAgICAgIEFTU0VSVCht
X3Bvc2l0aW9uSW5Nb3ZlTGlzdFtsYXN0SW5kZXhdID09IG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5z
aXplKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9wb3NpdGlvbkluTW92ZUxpc3Rb
bGFzdEluZGV4XSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgoKTsKKworICAg
ICAgICAgICAgQVNTRVJUKCFjb250YWlucyhsYXN0SW5kZXgpKTsKKyAgICAgICAgICAgIHJldHVy
biBsYXN0SW5kZXg7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHJldHVybk1vdmUodW5zaWdu
ZWQgaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRoaXMgYXNzZXJ0aW9uIGlzIGEg
Yml0IHN0cmljdCBidXQgdGhhdCBpcyBob3cgdGhlIG1vdmUgbGlzdCBzaG91bGQgYmUgdXNlZC4g
VGhlIG9ubHkga2luZCBvZiBtb3ZlcyB0aGF0IGNhbgorICAgICAgICAgICAgLy8gcmV0dXJuIHRv
IHRoZSBsaXN0IGFyZSB0aGUgb25lcyB0aGF0IHdlIHByZXZpb3VzbHkgZmFpbGVkIHRvIGNvYWxl
c2NlIHdpdGggdGhlIGNvbnNlcnZhdGl2ZSBoZXVyaXN0aWNzLgorICAgICAgICAgICAgLy8gVmFs
dWVzIHNob3VsZCBub3QgYmUgYWRkZWQgYmFjayBpZiB0aGV5IHdlcmUgbmV2ZXIgdGFrZW4gb3V0
IHdoZW4gYXR0ZW1wdGluZyBjb2FsZXNjaW5nLgorICAgICAgICAgICAgQVNTRVJUKCFjb250YWlu
cyhpbmRleCkpOworCisgICAgICAgICAgICBpZiAoaW5kZXggPCBtX2ZpcnN0TG93UHJpb3JpdHlN
b3ZlSW5kZXgpIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBwb3NpdGlvbiA9IG1fbW92ZUxp
c3Quc2l6ZSgpOworICAgICAgICAgICAgICAgIG1fbW92ZUxpc3QuYXBwZW5kKGluZGV4KTsKKyAg
ICAgICAgICAgICAgICBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdFtpbmRleF0gPSBwb3NpdGlvbjsKKyAg
ICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgcG9zaXRpb24gPSBt
X2xvd1ByaW9yaXR5TW92ZUxpc3Quc2l6ZSgpOworICAgICAgICAgICAgICAgIG1fbG93UHJpb3Jp
dHlNb3ZlTGlzdC5hcHBlbmQoaW5kZXgpOworICAgICAgICAgICAgICAgIG1fcG9zaXRpb25Jbk1v
dmVMaXN0W2luZGV4XSA9IHBvc2l0aW9uOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBB
U1NFUlQoY29udGFpbnMoaW5kZXgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgY2xlYXIo
KQorICAgICAgICB7CisgICAgICAgICAgICBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdC5jbGVhcigpOwor
ICAgICAgICAgICAgbV9tb3ZlTGlzdC5jbGVhcigpOworICAgICAgICAgICAgbV9sb3dQcmlvcml0
eU1vdmVMaXN0LmNsZWFyKCk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFZl
Y3Rvcjx1bnNpZ25lZCwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fcG9zaXRpb25Jbk1vdmVM
aXN0OworICAgICAgICBWZWN0b3I8dW5zaWduZWQsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBt
X21vdmVMaXN0OworICAgICAgICBWZWN0b3I8dW5zaWduZWQsIDAsIFVuc2FmZVZlY3Rvck92ZXJm
bG93PiBtX2xvd1ByaW9yaXR5TW92ZUxpc3Q7CisgICAgICAgIHVuc2lnbmVkIG1fZmlyc3RMb3dQ
cmlvcml0eU1vdmVJbmRleCB7IDAgfTsKKyAgICB9OworCisgICAgLy8gV29yayBsaXN0cy4KKyAg
ICAvLyBTZXQgb2YgIm1vdmUiIGVuYWJsZWQgZm9yIHBvc3NpYmxlIGNvYWxlc2NpbmcuCisgICAg
T3JkZXJlZE1vdmVTZXQgbV93b3JrbGlzdE1vdmVzOworICAgIC8vIFNldCBvZiAibW92ZSIgbm90
IHlldCByZWFkeSBmb3IgY29hbGVzY2luZy4KKyAgICBCaXRWZWN0b3IgbV9hY3RpdmVNb3ZlczsK
KyAgICAvLyBMb3ctZGVncmVlLCBub24tTW92ZSByZWxhdGVkLgorICAgIFZlY3RvcjxJbmRleFR5
cGU+IG1fc2ltcGxpZnlXb3JrbGlzdDsKKyAgICAvLyBIaWdoLWRlZ3JlZSBUbXAuCisgICAgSGFz
aFNldDxJbmRleFR5cGU+IG1fc3BpbGxXb3JrbGlzdDsKKyAgICAvLyBMb3ctZGVncmVlLCBNb3Zl
IHJlbGF0ZWQuCisgICAgSGFzaFNldDxJbmRleFR5cGU+IG1fZnJlZXplV29ya2xpc3Q7CisKKyAg
ICBib29sIG1faGFzU2VsZWN0ZWRTcGlsbCB7IGZhbHNlIH07CisgICAgYm9vbCBtX2hhc0NvYWxl
c2NlZE5vblRyaXZpYWxNb3ZlIHsgZmFsc2UgfTsKKworICAgIC8vIFRoZSBtYXBwaW5nIG9mIFRt
cCB0byB0aGVpciBhbGlhcyBmb3IgTW92ZXMgdGhhdCBhcmUgYWx3YXlzIGNvYWxlc2NpbmcgcmVn
YXJkbGVzcyBvZiBzcGlsbGluZy4KKyAgICBWZWN0b3I8SW5kZXhUeXBlLCAwLCBVbnNhZmVWZWN0
b3JPdmVyZmxvdz4gbV9jb2FsZXNjZWRUbXBzQXRTcGlsbDsKKyAgICAKKyAgICBjb25zdCBIYXNo
U2V0PHVuc2lnbmVkPiYgbV91bnNwaWxsYWJsZVRtcHM7Cit9OworCisvLyBUaGlzIHBlcmZvcm0g
YWxsIHRoZSB0YXNrcyB0aGF0IGFyZSBzcGVjaWZpYyB0byBjZXJ0YWluIHJlZ2lzdGVyIHR5cGUu
Cit0ZW1wbGF0ZTxBcmc6OlR5cGUgdHlwZT4KK2NsYXNzIENvbG9yaW5nQWxsb2NhdG9yIDogcHVi
bGljIEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0b3I8dW5zaWduZWQ+IHsKK3B1YmxpYzoKKyAgICBD
b2xvcmluZ0FsbG9jYXRvcihDb2RlJiBjb2RlLCBUbXBXaWR0aCYgdG1wV2lkdGgsIGNvbnN0IFVz
ZUNvdW50czxUbXA+JiB1c2VDb3VudHMsIGNvbnN0IEhhc2hTZXQ8dW5zaWduZWQ+JiB1bnNwaWxs
YWJsZVRtcCkKKyAgICAgICAgOiBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yPHVuc2lnbmVkPihj
b2RlLnJlZ3NJblByaW9yaXR5T3JkZXIodHlwZSksIEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojps
YXN0TWFjaGluZVJlZ2lzdGVySW5kZXgoKSwgdG1wQXJyYXlTaXplKGNvZGUpLCB1bnNwaWxsYWJs
ZVRtcCkKKyAgICAgICAgLCBtX2NvZGUoY29kZSkKKyAgICAgICAgLCBtX3RtcFdpZHRoKHRtcFdp
ZHRoKQorICAgICAgICAsIG1fdXNlQ291bnRzKHVzZUNvdW50cykKKyAgICB7CisgICAgICAgIGlm
ICh0eXBlID09IEFyZzo6R1ApIHsKKyAgICAgICAgICAgIG1fZnJhbWVQb2ludGVySW5kZXggPSBB
YnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChUbXAoTWFjcm9Bc3NlbWJsZXI6
OmZyYW1lUG9pbnRlclJlZ2lzdGVyKSk7CisgICAgICAgICAgICBtX2ludGVyZmVyZXNXaXRoRnJh
bWVQb2ludGVyLmVuc3VyZVNpemUodG1wQXJyYXlTaXplKGNvZGUpKTsKKyAgICAgICAgfQorCisg
ICAgICAgIGluaXRpYWxpemVQcmVjb2xvcmVkVG1wKCk7CisgICAgICAgIGJ1aWxkKCk7CisgICAg
ICAgIGFsbG9jYXRlKCk7CisgICAgfQorCisgICAgVG1wIGdldEFsaWFzKFRtcCB0bXApIGNvbnN0
CisgICAgeworICAgICAgICByZXR1cm4gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21B
YnNvbHV0ZUluZGV4KGdldEFsaWFzKEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUlu
ZGV4KHRtcCkpKTsKKyAgICB9CisKKyAgICAvLyBUaGlzIHRlbGxzIHlvdSBpZiBhIE1vdmUgd2ls
bCBiZSBjb2FsZXNjYWJsZSBpZiB0aGUgc3JjIGFuZCBkc3QgZW5kIHVwIG1hdGNoaW5nLiBUaGlz
IG1ldGhvZAorICAgIC8vIHJlbGllcyBvbiBhbiBhbmFseXNpcyB0aGF0IGlzIGludmFsaWRhdGVk
IGJ5IHJlZ2lzdGVyIGFsbG9jYXRpb24sIHNvIHlvdSBpdCdzIG9ubHkgbWVhbmluZ2Z1bCB0bwor
ICAgIC8vIGNhbGwgdGhpcyAqYmVmb3JlKiByZXBsYWNpbmcgdGhlIFRtcCdzIGluIHRoaXMgSW5z
dCB3aXRoIHJlZ2lzdGVycyBvciBzcGlsbCBzbG90cy4KKyAgICBib29sIG1heUJlQ29hbGVzY2Fi
bGUoY29uc3QgSW5zdCYgaW5zdCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtYXlCZUNv
YWxlc2NhYmxlSW1wbChpbnN0LCAmbV90bXBXaWR0aCk7CisgICAgfQorCisgICAgYm9vbCBpc1Vz
ZWxlc3NNb3ZlKGNvbnN0IEluc3QmIGluc3QpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4g
bWF5QmVDb2FsZXNjYWJsZUltcGwoaW5zdCwgbnVsbHB0cikgJiYgaW5zdC5hcmdzWzBdLnRtcCgp
ID09IGluc3QuYXJnc1sxXS50bXAoKTsKKyAgICB9CisKKyAgICBUbXAgZ2V0QWxpYXNXaGVuU3Bp
bGxpbmcoVG1wIHRtcCkgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVF9XSVRIX01FU1NBR0Uo
IW1fc3BpbGxlZFRtcHMuaXNFbXB0eSgpLCAiVGhpcyBmdW5jdGlvbiBpcyBvbmx5IHZhbGlkIGZv
ciBjb2FsZXNjaW5nIGR1cmluZyBzcGlsbGluZy4iKTsKKworICAgICAgICBpZiAobV9jb2FsZXNj
ZWRUbXBzQXRTcGlsbC5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gdG1wOworCisgICAg
ICAgIHVuc2lnbmVkIGFsaWFzSW5kZXggPSBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1
dGVJbmRleCh0bXApOworICAgICAgICB3aGlsZSAodW5zaWduZWQgbmV4dEFsaWFzSW5kZXggPSBt
X2NvYWxlc2NlZFRtcHNBdFNwaWxsW2FsaWFzSW5kZXhdKQorICAgICAgICAgICAgYWxpYXNJbmRl
eCA9IG5leHRBbGlhc0luZGV4OworCisgICAgICAgIFRtcCBhbGlhcyA9IEFic29sdXRlVG1wTWFw
cGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleChhbGlhc0luZGV4KTsKKworICAgICAgICBB
U1NFUlRfV0lUSF9NRVNTQUdFKCFtX3NwaWxsZWRUbXBzLmNvbnRhaW5zKGFsaWFzSW5kZXgpIHx8
IGFsaWFzID09IHRtcCwgIlRoZSBhbGlhc2VzIGF0IHNwaWxsIHNob3VsZCBhbHdheXMgYmUgY29s
b3JhYmxlLiBTb21ldGhpbmcgd2VudCBob3JyaWJseSB3cm9uZy4iKTsKKworICAgICAgICByZXR1
cm4gYWxpYXM7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSW5kZXhJdGVyYXRvcj4K
KyAgICBjbGFzcyBJbmRleFRvVG1wSXRlcmF0b3JBZGFwdG9yIHsKKyAgICBwdWJsaWM6CisgICAg
ICAgIEluZGV4VG9UbXBJdGVyYXRvckFkYXB0b3IoSW5kZXhJdGVyYXRvciYmIGluZGV4SXRlcmF0
b3IpCisgICAgICAgICAgICA6IG1faW5kZXhJdGVyYXRvcihXVEZNb3ZlKGluZGV4SXRlcmF0b3Ip
KQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBUbXAgb3BlcmF0b3IqKCkgY29uc3Qg
eyByZXR1cm4gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KCpt
X2luZGV4SXRlcmF0b3IpOyB9CisgICAgICAgIEluZGV4VG9UbXBJdGVyYXRvckFkYXB0b3ImIG9w
ZXJhdG9yKysoKSB7ICsrbV9pbmRleEl0ZXJhdG9yOyByZXR1cm4gKnRoaXM7IH0KKworICAgICAg
ICBib29sIG9wZXJhdG9yPT0oY29uc3QgSW5kZXhUb1RtcEl0ZXJhdG9yQWRhcHRvciYgb3RoZXIp
IGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtX2luZGV4SXRlcmF0b3IgPT0g
b3RoZXIubV9pbmRleEl0ZXJhdG9yOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBvcGVyYXRv
ciE9KGNvbnN0IEluZGV4VG9UbXBJdGVyYXRvckFkYXB0b3ImIG90aGVyKSBjb25zdAorICAgICAg
ICB7CisgICAgICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgICAgIH0KKwor
ICAgIHByaXZhdGU6CisgICAgICAgIEluZGV4SXRlcmF0b3IgbV9pbmRleEl0ZXJhdG9yOworICAg
IH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDb2xsZWN0aW9uPgorICAgIGNsYXNzIEluZGV4
VG9UbXBJdGVyYWJsZUFkYXB0b3IgeworICAgIHB1YmxpYzoKKyAgICAgICAgSW5kZXhUb1RtcEl0
ZXJhYmxlQWRhcHRvcihjb25zdCBDb2xsZWN0aW9uJiBjb2xsZWN0aW9uKQorICAgICAgICAgICAg
OiBtX2NvbGxlY3Rpb24oY29sbGVjdGlvbikKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAg
ICAgSW5kZXhUb1RtcEl0ZXJhdG9yQWRhcHRvcjx0eXBlbmFtZSBDb2xsZWN0aW9uOjpjb25zdF9p
dGVyYXRvcj4gYmVnaW4oKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbV9j
b2xsZWN0aW9uLmJlZ2luKCk7CisgICAgICAgIH0KKworICAgICAgICBJbmRleFRvVG1wSXRlcmF0
b3JBZGFwdG9yPHR5cGVuYW1lIENvbGxlY3Rpb246OmNvbnN0X2l0ZXJhdG9yPiBlbmQoKSBjb25z
dAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbV9jb2xsZWN0aW9uLmVuZCgpOworICAg
ICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBjb25zdCBDb2xsZWN0aW9uJiBtX2NvbGxl
Y3Rpb247CisgICAgfTsKKworICAgIEluZGV4VG9UbXBJdGVyYWJsZUFkYXB0b3I8VmVjdG9yPHVu
c2lnbmVkPj4gc3BpbGxlZFRtcHMoKSBjb25zdCB7IHJldHVybiBtX3NwaWxsZWRUbXBzOyB9CisK
KyAgICBib29sIHJlcXVpcmVzU3BpbGxpbmcoKSBjb25zdCB7IHJldHVybiAhbV9zcGlsbGVkVG1w
cy5pc0VtcHR5KCk7IH0KKworICAgIFJlZyBhbGxvY2F0ZWRSZWcoVG1wIHRtcCkgY29uc3QKKyAg
ICB7CisgICAgICAgIEFTU0VSVCghdG1wLmlzUmVnKCkpOworICAgICAgICBBU1NFUlQobV9jb2xv
cmVkVG1wLnNpemUoKSk7CisgICAgICAgIEFTU0VSVCh0bXAuaXNHUCgpID09ICh0eXBlID09IEFy
Zzo6R1ApKTsKKworICAgICAgICBSZWcgcmVnID0gbV9jb2xvcmVkVG1wW0Fic29sdXRlVG1wTWFw
cGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHRtcCldOworICAgICAgICBpZiAoIXJlZykgeworICAg
ICAgICAgICAgZGF0YUxvZygiRkFUQUw6IE5vIGNvbG9yIGZvciAiLCB0bXAsICJcbiIpOworICAg
ICAgICAgICAgZGF0YUxvZygiQ29kZTpcbiIpOworICAgICAgICAgICAgZGF0YUxvZyhtX2NvZGUp
OworICAgICAgICAgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgfQor
ICAgICAgICByZXR1cm4gcmVnOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGF0aWMgdW5zaWdu
ZWQgdG1wQXJyYXlTaXplKENvZGUmIGNvZGUpCisgICAgeworICAgICAgICB1bnNpZ25lZCBudW1U
bXBzID0gY29kZS5udW1UbXBzKHR5cGUpOworICAgICAgICByZXR1cm4gQWJzb2x1dGVUbXBNYXBw
ZXI8dHlwZT46OmFic29sdXRlSW5kZXgobnVtVG1wcyk7CisgICAgfQorCisgICAgdm9pZCBpbml0
aWFsaXplUHJlY29sb3JlZFRtcCgpCisgICAgeworICAgICAgICBtX2NvbG9yZWRUbXAucmVzaXpl
KG1fbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4ICsgMSk7CisgICAgICAgIGZvciAodW5zaWdu
ZWQgaSA9IDE7IGkgPD0gbV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXg7ICsraSkgeworICAg
ICAgICAgICAgVG1wIHRtcCA9IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1
dGVJbmRleChpKTsKKyAgICAgICAgICAgIEFTU0VSVCh0bXAuaXNSZWcoKSk7CisgICAgICAgICAg
ICBtX2NvbG9yZWRUbXBbaV0gPSB0bXAucmVnKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBi
b29sIG1heUJlQ29hbGVzY2VkKEFyZyBsZWZ0LCBBcmcgcmlnaHQpCisgICAgeworICAgICAgICBp
ZiAoIWxlZnQuaXNUbXAoKSB8fCAhcmlnaHQuaXNUbXAoKSkKKyAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKworICAgICAgICBUbXAgbGVmdFRtcCA9IGxlZnQudG1wKCk7CisgICAgICAgIFRtcCBy
aWdodFRtcCA9IHJpZ2h0LnRtcCgpOworCisgICAgICAgIGlmIChsZWZ0VG1wID09IHJpZ2h0VG1w
KQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmIChsZWZ0VG1wLmlzR1Ao
KSAhPSAodHlwZSA9PSBBcmc6OkdQKSB8fCByaWdodFRtcC5pc0dQKCkgIT0gKHR5cGUgPT0gQXJn
OjpHUCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgdW5zaWduZWQgbGVm
dEluZGV4ID0gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgobGVmdFRtcCk7
CisgICAgICAgIHVuc2lnbmVkIHJpZ2h0SW5kZXggPSBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6
YWJzb2x1dGVJbmRleChyaWdodFRtcCk7CisKKyAgICAgICAgcmV0dXJuICFtX2ludGVyZmVyZW5j
ZUVkZ2VzLmNvbnRhaW5zKEludGVyZmVyZW5jZUVkZ2UobGVmdEluZGV4LCByaWdodEluZGV4KSk7
CisgICAgfQorCisgICAgdm9pZCBhZGRUb0xvd1ByaW9yaXR5Q29hbGVzY2luZ0NhbmRpZGF0ZXMo
QXJnIGxlZnQsIEFyZyByaWdodCkKKyAgICB7CisgICAgICAgIEFTU0VSVChtYXlCZUNvYWxlc2Nl
ZChsZWZ0LCByaWdodCkpOworICAgICAgICBUbXAgbGVmdFRtcCA9IGxlZnQudG1wKCk7CisgICAg
ICAgIFRtcCByaWdodFRtcCA9IHJpZ2h0LnRtcCgpOworCisgICAgICAgIHVuc2lnbmVkIGxlZnRJ
bmRleCA9IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KGxlZnRUbXApOwor
ICAgICAgICB1bnNpZ25lZCByaWdodEluZGV4ID0gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFi
c29sdXRlSW5kZXgocmlnaHRUbXApOworCisgICAgICAgIHVuc2lnbmVkIG5leHRNb3ZlSW5kZXgg
PSBtX2NvYWxlc2NpbmdDYW5kaWRhdGVzLnNpemUoKTsKKyAgICAgICAgbV9jb2FsZXNjaW5nQ2Fu
ZGlkYXRlcy5hcHBlbmQoeyBsZWZ0SW5kZXgsIHJpZ2h0SW5kZXggfSk7CisKKyAgICAgICAgdW5z
aWduZWQgbmV3SW5kZXhJbldvcmtsaXN0ID0gbV93b3JrbGlzdE1vdmVzLmFkZExvd1ByaW9yaXR5
TW92ZSgpOworICAgICAgICBBU1NFUlRfVU5VU0VEKG5ld0luZGV4SW5Xb3JrbGlzdCwgbmV3SW5k
ZXhJbldvcmtsaXN0ID09IG5leHRNb3ZlSW5kZXgpOworCisgICAgICAgIEFTU0VSVChuZXh0TW92
ZUluZGV4IDw9IG1fYWN0aXZlTW92ZXMuc2l6ZSgpKTsKKyAgICAgICAgbV9hY3RpdmVNb3Zlcy5l
bnN1cmVTaXplKG5leHRNb3ZlSW5kZXggKyAxKTsKKworICAgICAgICBtX21vdmVMaXN0W2xlZnRJ
bmRleF0uYWRkKG5leHRNb3ZlSW5kZXgpOworICAgICAgICBtX21vdmVMaXN0W3JpZ2h0SW5kZXhd
LmFkZChuZXh0TW92ZUluZGV4KTsKKyAgICB9CisKKyAgICB2b2lkIGJ1aWxkKCkKKyAgICB7Cisg
ICAgICAgIFRtcExpdmVuZXNzPHR5cGU+IGxpdmVuZXNzKG1fY29kZSk7CisgICAgICAgIGZvciAo
QmFzaWNCbG9jayogYmxvY2sgOiBtX2NvZGUpIHsKKyAgICAgICAgICAgIHR5cGVuYW1lIFRtcExp
dmVuZXNzPHR5cGU+OjpMb2NhbENhbGMgbG9jYWxDYWxjKGxpdmVuZXNzLCBibG9jayk7CisgICAg
ICAgICAgICBmb3IgKHVuc2lnbmVkIGluc3RJbmRleCA9IGJsb2NrLT5zaXplKCk7IGluc3RJbmRl
eC0tOykgeworICAgICAgICAgICAgICAgIEluc3QmIGluc3QgPSBibG9jay0+YXQoaW5zdEluZGV4
KTsKKyAgICAgICAgICAgICAgICBJbnN0KiBuZXh0SW5zdCA9IGJsb2NrLT5nZXQoaW5zdEluZGV4
ICsgMSk7CisgICAgICAgICAgICAgICAgYnVpbGQoJmluc3QsIG5leHRJbnN0LCBsb2NhbENhbGMp
OworICAgICAgICAgICAgICAgIGxvY2FsQ2FsYy5leGVjdXRlKGluc3RJbmRleCk7CisgICAgICAg
ICAgICB9CisgICAgICAgICAgICBidWlsZChudWxscHRyLCAmYmxvY2stPmF0KDApLCBsb2NhbENh
bGMpOworICAgICAgICB9CisgICAgICAgIGJ1aWxkTG93UHJpb3JpdHlNb3ZlTGlzdCgpOworICAg
IH0KKworICAgIHZvaWQgYnVpbGQoSW5zdCogcHJldkluc3QsIEluc3QqIG5leHRJbnN0LCBjb25z
dCB0eXBlbmFtZSBUbXBMaXZlbmVzczx0eXBlPjo6TG9jYWxDYWxjJiBsb2NhbENhbGMpCisgICAg
eworICAgICAgICBpZiAodHJhY2VEZWJ1ZykKKyAgICAgICAgICAgIGRhdGFMb2coIkJ1aWxkaW5n
IGJldHdlZW4gIiwgcG9pbnRlckR1bXAocHJldkluc3QpLCAiIGFuZCAiLCBwb2ludGVyRHVtcChu
ZXh0SW5zdCksICI6XG4iKTsKKyAgICAgICAgSW5zdDo6Zm9yRWFjaERlZldpdGhFeHRyYUNsb2Ji
ZXJlZFJlZ3M8VG1wPigKKyAgICAgICAgICAgIHByZXZJbnN0LCBuZXh0SW5zdCwKKyAgICAgICAg
ICAgIFsmXSAoY29uc3QgVG1wJiBhcmcsIEFyZzo6Um9sZSwgQXJnOjpUeXBlIGFyZ1R5cGUsIEFy
Zzo6V2lkdGgpIHsKKyAgICAgICAgICAgICAgICBpZiAoYXJnVHlwZSAhPSB0eXBlKQorICAgICAg
ICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAg
Ly8gQWxsIHRoZSBEZWYoKXMgaW50ZXJmZXJlIHdpdGggZWFjaCBvdGhlciBhbmQgd2l0aCBhbGwg
dGhlIGV4dHJhIGNsb2JiZXJlZCBUbXBzLgorICAgICAgICAgICAgICAgIC8vIFdlIHNob3VsZCBu
b3QgdXNlIGZvckVhY2hEZWZXaXRoRXh0cmFDbG9iYmVyZWRSZWdzKCkgaGVyZSBzaW5jZSBjb2xv
cmVkIFRtcHMKKyAgICAgICAgICAgICAgICAvLyBkbyBub3QgbmVlZCBpbnRlcmZlcmVuY2UgZWRn
ZXMgaW4gb3VyIGltcGxlbWVudGF0aW9uLgorICAgICAgICAgICAgICAgIEluc3Q6OmZvckVhY2hE
ZWY8VG1wPigKKyAgICAgICAgICAgICAgICAgICAgcHJldkluc3QsIG5leHRJbnN0LAorICAgICAg
ICAgICAgICAgICAgICBbJl0gKFRtcCYgb3RoZXJBcmcsIEFyZzo6Um9sZSwgQXJnOjpUeXBlIGFy
Z1R5cGUsIEFyZzo6V2lkdGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdUeXBl
ICE9IHR5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAg
ICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhTG9nKCIgICAgQWRkaW5nIGRlZi1kZWYg
ZWRnZTogIiwgYXJnLCAiLCAiLCBvdGhlckFyZywgIlxuIik7CisgICAgICAgICAgICAgICAgICAg
ICAgICB0aGlzLT5hZGRFZGdlKGFyZywgb3RoZXJBcmcpOworICAgICAgICAgICAgICAgICAgICB9
KTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgIGlmIChwcmV2SW5zdCAmJiBtYXlCZUNvYWxl
c2NhYmxlKCpwcmV2SW5zdCkpIHsKKyAgICAgICAgICAgIC8vIFdlIGRvIG5vdCB3YW50IHRoZSBV
c2UoKSBvZiB0aGlzIG1vdmUgdG8gaW50ZXJmZXJlIHdpdGggdGhlIERlZigpLCBldmVuIGlmIGl0
IGlzIGxpdmUKKyAgICAgICAgICAgIC8vIGFmdGVyIHRoZSBNb3ZlLiBJZiB3ZSB3ZXJlIHRvIGFk
ZCB0aGUgaW50ZXJmZXJlbmNlIGVkZ2UsIGl0IHdvdWxkIGJlIGltcG9zc2libGUgdG8KKyAgICAg
ICAgICAgIC8vIGNvYWxlc2NlIHRoZSBNb3ZlIGV2ZW4gaWYgdGhlIHR3byBUbXAgbmV2ZXIgaW50
ZXJmZXJlIGFueXdoZXJlLgorICAgICAgICAgICAgVG1wIGRlZlRtcDsKKyAgICAgICAgICAgIFRt
cCB1c2VUbXA7CisgICAgICAgICAgICBwcmV2SW5zdC0+Zm9yRWFjaFRtcChbJmRlZlRtcCwgJnVz
ZVRtcF0gKFRtcCYgYXJnVG1wLCBBcmc6OlJvbGUgcm9sZSwgQXJnOjpUeXBlLCBBcmc6OldpZHRo
KSB7CisgICAgICAgICAgICAgICAgaWYgKEFyZzo6aXNMYXRlRGVmKHJvbGUpKQorICAgICAgICAg
ICAgICAgICAgICBkZWZUbXAgPSBhcmdUbXA7CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAg
ICAgICAgICAgICAgICAgIEFTU0VSVChBcmc6OmlzRWFybHlVc2Uocm9sZSkpOworICAgICAgICAg
ICAgICAgICAgICB1c2VUbXAgPSBhcmdUbXA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgfSk7CisgICAgICAgICAgICBBU1NFUlQoZGVmVG1wKTsKKyAgICAgICAgICAgIEFTU0VSVCh1
c2VUbXApOworCisgICAgICAgICAgICB1bnNpZ25lZCBuZXh0TW92ZUluZGV4ID0gbV9jb2FsZXNj
aW5nQ2FuZGlkYXRlcy5zaXplKCk7CisgICAgICAgICAgICBtX2NvYWxlc2NpbmdDYW5kaWRhdGVz
LmFwcGVuZCh7IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHVzZVRtcCks
IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KGRlZlRtcCkgfSk7CisKKyAg
ICAgICAgICAgIHVuc2lnbmVkIG5ld0luZGV4SW5Xb3JrbGlzdCA9IG1fd29ya2xpc3RNb3Zlcy5h
ZGRNb3ZlKCk7CisgICAgICAgICAgICBBU1NFUlRfVU5VU0VEKG5ld0luZGV4SW5Xb3JrbGlzdCwg
bmV3SW5kZXhJbldvcmtsaXN0ID09IG5leHRNb3ZlSW5kZXgpOworCisgICAgICAgICAgICBBU1NF
UlQobmV4dE1vdmVJbmRleCA8PSBtX2FjdGl2ZU1vdmVzLnNpemUoKSk7CisgICAgICAgICAgICBt
X2FjdGl2ZU1vdmVzLmVuc3VyZVNpemUobmV4dE1vdmVJbmRleCArIDEpOworCisgICAgICAgICAg
ICBmb3IgKGNvbnN0IEFyZyYgYXJnIDogcHJldkluc3QtPmFyZ3MpIHsKKyAgICAgICAgICAgICAg
ICBhdXRvJiBsaXN0ID0gbV9tb3ZlTGlzdFtBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1
dGVJbmRleChhcmcudG1wKCkpXTsKKyAgICAgICAgICAgICAgICBsaXN0LmFkZChuZXh0TW92ZUlu
ZGV4KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChjb25zdCBUbXAmIGxpdmVU
bXAgOiBsb2NhbENhbGMubGl2ZSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGxpdmVUbXAgIT0g
dXNlVG1wKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQorICAgICAgICAg
ICAgICAgICAgICAgICAgZGF0YUxvZygiICAgIEFkZGluZyBkZWYtbGl2ZSBmb3IgY29hbGVzY2Fi
bGU6ICIsIGRlZlRtcCwgIiwgIiwgbGl2ZVRtcCwgIlxuIik7CisgICAgICAgICAgICAgICAgICAg
IGFkZEVkZ2UoZGVmVG1wLCBsaXZlVG1wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgIC8vIFRoZSBuZXh0IGluc3RydWN0aW9uIGNvdWxkIGhhdmUgZWFy
bHkgY2xvYmJlcnMgb3IgZWFybHkgZGVmJ3MuIFdlIG5lZWQgdG8gY29uc2lkZXIKKyAgICAgICAg
ICAgIC8vIHRob3NlIG5vdy4KKyAgICAgICAgICAgIGFkZEVkZ2VzKG51bGxwdHIsIG5leHRJbnN0
LCBsb2NhbENhbGMubGl2ZSgpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBhZGRFZGdl
cyhwcmV2SW5zdCwgbmV4dEluc3QsIGxvY2FsQ2FsYy5saXZlKCkpOworICAgIH0KKworICAgIHZv
aWQgYnVpbGRMb3dQcmlvcml0eU1vdmVMaXN0KCkKKyAgICB7CisgICAgICAgIGlmICghaXNYODYo
KSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBtX3dvcmtsaXN0TW92ZXMuc3RhcnRB
ZGRpbmdMb3dQcmlvcml0eU1vdmVzKCk7CisgICAgICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sg
OiBtX2NvZGUpIHsKKyAgICAgICAgICAgIGZvciAoSW5zdCYgaW5zdCA6ICpibG9jaykgeworICAg
ICAgICAgICAgICAgIGlmIChzdGQ6Om9wdGlvbmFsPHVuc2lnbmVkPiBkZWZBcmdJbmRleCA9IGlu
c3Quc2hvdWxkVHJ5QWxpYXNpbmdEZWYoKSkgeworICAgICAgICAgICAgICAgICAgICBBcmcgb3Ax
ID0gaW5zdC5hcmdzWypkZWZBcmdJbmRleCAtIDJdOworICAgICAgICAgICAgICAgICAgICBBcmcg
b3AyID0gaW5zdC5hcmdzWypkZWZBcmdJbmRleCAtIDFdOworICAgICAgICAgICAgICAgICAgICBB
cmcgZGVzdCA9IGluc3QuYXJnc1sqZGVmQXJnSW5kZXhdOworCisgICAgICAgICAgICAgICAgICAg
IGlmIChvcDEgPT0gZGVzdCB8fCBvcDIgPT0gZGVzdCkKKyAgICAgICAgICAgICAgICAgICAgICAg
IGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgIGlmIChtYXlCZUNvYWxlc2NlZChvcDEs
IGRlc3QpKQorICAgICAgICAgICAgICAgICAgICAgICAgYWRkVG9Mb3dQcmlvcml0eUNvYWxlc2Np
bmdDYW5kaWRhdGVzKG9wMSwgZGVzdCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvcDEgIT0g
b3AyICYmIG1heUJlQ29hbGVzY2VkKG9wMiwgZGVzdCkpCisgICAgICAgICAgICAgICAgICAgICAg
ICBhZGRUb0xvd1ByaW9yaXR5Q29hbGVzY2luZ0NhbmRpZGF0ZXMob3AyLCBkZXN0KTsKKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lk
IGFkZEVkZ2VzKEluc3QqIHByZXZJbnN0LCBJbnN0KiBuZXh0SW5zdCwgdHlwZW5hbWUgVG1wTGl2
ZW5lc3M8dHlwZT46OkxvY2FsQ2FsYzo6SXRlcmFibGUgbGl2ZVRtcHMpCisgICAgeworICAgICAg
ICAvLyBBbGwgdGhlIERlZigpcyBpbnRlcmZlcmUgd2l0aCBldmVydGhpbmcgbGl2ZS4KKyAgICAg
ICAgSW5zdDo6Zm9yRWFjaERlZldpdGhFeHRyYUNsb2JiZXJlZFJlZ3M8VG1wPigKKyAgICAgICAg
ICAgIHByZXZJbnN0LCBuZXh0SW5zdCwKKyAgICAgICAgICAgIFsmXSAoY29uc3QgVG1wJiBhcmcs
IEFyZzo6Um9sZSwgQXJnOjpUeXBlIGFyZ1R5cGUsIEFyZzo6V2lkdGgpIHsKKyAgICAgICAgICAg
ICAgICBpZiAoYXJnVHlwZSAhPSB0eXBlKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47Cisg
ICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBUbXAmIGxpdmVUbXAg
OiBsaXZlVG1wcykgeworICAgICAgICAgICAgICAgICAgICBBU1NFUlQobGl2ZVRtcC5pc0dQKCkg
PT0gKHR5cGUgPT0gQXJnOjpHUCkpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAg
ICAgICAgICAgaWYgKHRyYWNlRGVidWcpCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhTG9n
KCIgICAgQWRkaW5nIGRlZi1saXZlIGVkZ2U6ICIsIGFyZywgIiwgIiwgbGl2ZVRtcCwgIlxuIik7
CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBhZGRFZGdlKGFyZywg
bGl2ZVRtcCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHR5cGUg
PT0gQXJnOjpHUCAmJiAhYXJnLmlzR1BSKCkpCisgICAgICAgICAgICAgICAgICAgIG1faW50ZXJm
ZXJlc1dpdGhGcmFtZVBvaW50ZXIucXVpY2tTZXQoQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFi
c29sdXRlSW5kZXgoYXJnKSk7CisgICAgICAgICAgICB9KTsKKyAgICB9CisKKyAgICB2b2lkIGFk
ZEVkZ2UoVG1wIGEsIFRtcCBiKQorICAgIHsKKyAgICAgICAgQVNTRVJUX1dJVEhfTUVTU0FHRShh
LmlzR1AoKSA9PSBiLmlzR1AoKSwgIkFuIGludGVyZmVyZW5jZSBiZXR3ZWVuIHJlZ2lzdGVycyBv
ZiBkaWZmZXJlbnQgdHlwZXMgZG9lcyBub3QgbWFrZSBzZW5zZSwgaXQgY2FuIGxlYWQgdG8gbm9u
LWNvbG9yYWJsZSBncmFwaHMuIik7CisKKyAgICAgICAgYWRkRWRnZShBYnNvbHV0ZVRtcE1hcHBl
cjx0eXBlPjo6YWJzb2x1dGVJbmRleChhKSwgQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29s
dXRlSW5kZXgoYikpOworICAgIH0KKworICAgIC8vIENhbGxpbmcgdGhpcyB3aXRob3V0IGEgdG1w
V2lkdGggd2lsbCBwZXJmb3JtIGEgbW9yZSBjb25zZXJ2YXRpdmUgY29hbGVzY2luZyBhbmFseXNp
cyB0aGF0IGFzc3VtZXMKKyAgICAvLyB0aGF0IE1vdmUzMidzIGFyZSBub3QgY29hbGVzY2FibGUu
CisgICAgc3RhdGljIGJvb2wgbWF5QmVDb2FsZXNjYWJsZUltcGwoY29uc3QgSW5zdCYgaW5zdCwg
VG1wV2lkdGgqIHRtcFdpZHRoKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAg
ICAgIGNhc2UgQXJnOjpHUDoKKyAgICAgICAgICAgIHN3aXRjaCAoaW5zdC5raW5kLm9wY29kZSkg
eworICAgICAgICAgICAgY2FzZSBNb3ZlOgorICAgICAgICAgICAgY2FzZSBNb3ZlMzI6CisgICAg
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICBjYXNlIEFyZzo6RlA6CisgICAgICAgICAgICBzd2l0Y2ggKGluc3Qua2luZC5vcGNvZGUpIHsK
KyAgICAgICAgICAgIGNhc2UgTW92ZUZsb2F0OgorICAgICAgICAgICAgY2FzZSBNb3ZlRG91Ymxl
OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgfQorCisgICAgICAgIEFTU0VSVF9XSVRIX01FU1NBR0UoaW5zdC5hcmdzLnNpemUo
KSA9PSAyLCAiV2UgYXNzdW1lIGNvYWxlY2FibGUgbW92ZXMgb25seSBoYXZlIHR3byBhcmd1bWVu
dHMgaW4gYSBmZXcgcGxhY2VzLiIpOworCisgICAgICAgIGlmICghaW5zdC5hcmdzWzBdLmlzVG1w
KCkgfHwgIWluc3QuYXJnc1sxXS5pc1RtcCgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgICAgIEFTU0VSVChpbnN0LmFyZ3NbMF0udHlwZSgpID09IHR5cGUpOworICAgICAgICBB
U1NFUlQoaW5zdC5hcmdzWzFdLnR5cGUoKSA9PSB0eXBlKTsKKworICAgICAgICAvLyBXZSBjYW4g
Y29hbGVzY2UgYSBNb3ZlMzIgc28gbG9uZyBhcyBlaXRoZXIgb2YgdGhlIGZvbGxvd2luZyBob2xk
czoKKyAgICAgICAgLy8gLSBUaGUgaW5wdXQgaXMgYWxyZWFkeSB6ZXJvLWZpbGxlZC4KKyAgICAg
ICAgLy8gLSBUaGUgb3V0cHV0IG9ubHkgY2FyZXMgYWJvdXQgdGhlIGxvdyAzMiBiaXRzLgorICAg
ICAgICAvLworICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIGlucHV0IHByb3BlcnR5IHJlcXVpcmVz
IGFuIGFuYWx5c2lzIG92ZXIgWkRlZidzLCBzbyBpdCdzIG9ubHkgdmFsaWQgc28gbG9uZworICAg
ICAgICAvLyBhcyB0aGUgaW5wdXQgZ2V0cyBhIHJlZ2lzdGVyLiBXZSBkb24ndCBrbm93IGlmIHRo
ZSBpbnB1dCBnZXRzIGEgcmVnaXN0ZXIsIGJ1dCB3ZSBkbyBrbm93CisgICAgICAgIC8vIHRoYXQg
aWYgaXQgZG9lc24ndCBnZXQgYSByZWdpc3RlciB0aGVuIHdlIHdpbGwgc3RpbGwgZW1pdCB0aGlz
IE1vdmUzMi4KKyAgICAgICAgaWYgKGluc3Qua2luZC5vcGNvZGUgPT0gTW92ZTMyKSB7CisgICAg
ICAgICAgICBpZiAoIXRtcFdpZHRoKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKwor
ICAgICAgICAgICAgaWYgKHRtcFdpZHRoLT5kZWZXaWR0aChpbnN0LmFyZ3NbMF0udG1wKCkpID4g
QXJnOjpXaWR0aDMyCisgICAgICAgICAgICAgICAgJiYgdG1wV2lkdGgtPnVzZVdpZHRoKGluc3Qu
YXJnc1sxXS50bXAoKSkgPiBBcmc6OldpZHRoMzIpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisK
KyAgICB2b2lkIHNlbGVjdFNwaWxsKCkKKyAgICB7CisgICAgICAgIGlmICghbV9oYXNTZWxlY3Rl
ZFNwaWxsKSB7CisgICAgICAgICAgICBtX2hhc1NlbGVjdGVkU3BpbGwgPSB0cnVlOworCisgICAg
ICAgICAgICBpZiAobV9oYXNDb2FsZXNjZWROb25Ucml2aWFsTW92ZSkKKyAgICAgICAgICAgICAg
ICBtX2NvYWxlc2NlZFRtcHNBdFNwaWxsID0gbV9jb2FsZXNjZWRUbXBzOworICAgICAgICB9CisK
KyAgICAgICAgYXV0byBpdGVyYXRvciA9IG1fc3BpbGxXb3JrbGlzdC5iZWdpbigpOworCisgICAg
ICAgIFJFTEVBU0VfQVNTRVJUX1dJVEhfTUVTU0FHRShpdGVyYXRvciAhPSBtX3NwaWxsV29ya2xp
c3QuZW5kKCksICJzZWxlY3RTcGlsbCgpIGNhbGxlZCB3aGVuIHRoZXJlIHdhcyBubyBzcGlsbC4i
KTsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlRfV0lUSF9NRVNTQUdFKCFtX3Vuc3BpbGxhYmxlVG1w
cy5jb250YWlucygqaXRlcmF0b3IpLCAidHJ5aW5nIHRvIHNwaWxsIHVuc3BpbGxhYmxlIHRtcCIp
OworCisgICAgICAgIC8vIEhpZ2hlciBzY29yZSBtZWFucyBtb3JlIGRlc2lyYWJsZSB0byBzcGls
bC4gTG93ZXIgc2NvcmVzIG1heGltaXplIHRoZSBsaWtlbGlob29kIHRoYXQgYSB0bXAKKyAgICAg
ICAgLy8gZ2V0cyBhIHJlZ2lzdGVyLgorICAgICAgICBhdXRvIHNjb3JlID0gWyZdIChUbXAgdG1w
KSAtPiBkb3VibGUgeworICAgICAgICAgICAgLy8gQWlyIGV4cG9zZXMgdGhlIGNvbmNlcHQgb2Yg
ImZhc3QgdG1wcyIsIGFuZCB3ZSBpbnRlcnByZXQgdGhhdCB0byBtZWFuIHRoYXQgdGhlIHRtcAor
ICAgICAgICAgICAgLy8gc2hvdWxkIGFsd2F5cyBiZSBpbiBhIHJlZ2lzdGVyLgorICAgICAgICAg
ICAgaWYgKG1fY29kZS5pc0Zhc3RUbXAodG1wKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsK
KyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gQWxsIGVsc2UgYmVpbmcgZXF1YWwsIHRoZSBz
Y29yZSBzaG91bGQgYmUgZGlyZWN0bHkgcmVsYXRlZCB0byB0aGUgZGVncmVlLgorICAgICAgICAg
ICAgZG91YmxlIGRlZ3JlZSA9IHN0YXRpY19jYXN0PGRvdWJsZT4obV9kZWdyZWVzW0Fic29sdXRl
VG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHRtcCldKTsKKworICAgICAgICAgICAgLy8g
QWxsIGVsc2UgYmVpbmcgZXF1YWwsIHRoZSBzY29yZSBzaG91bGQgYmUgaW52ZXJzZWx5IHJlbGF0
ZWQgdG8gdGhlIG51bWJlciBvZiB3YXJtIHVzZXMgYW5kCisgICAgICAgICAgICAvLyBkZWZzLgor
ICAgICAgICAgICAgY29uc3QgVXNlQ291bnRzPFRtcD46OkNvdW50cyogY291bnRzID0gbV91c2VD
b3VudHNbdG1wXTsKKyAgICAgICAgICAgIGlmICghY291bnRzKQorICAgICAgICAgICAgICAgIHJl
dHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCk7CisgICAgICAgICAg
ICAKKyAgICAgICAgICAgIGRvdWJsZSB1c2VzID0gY291bnRzLT5udW1XYXJtVXNlcyArIGNvdW50
cy0+bnVtRGVmczsKKworICAgICAgICAgICAgLy8gSWYgaXQncyBhIGNvbnN0YW50LCB0aGVuIGl0
J3Mgbm90IGFzIGJhZCB0byBzcGlsbC4gV2UgY2FuIHJlbWF0ZXJpYWxpemUgaXQgaW4gbWFueQor
ICAgICAgICAgICAgLy8gY2FzZXMuCisgICAgICAgICAgICBpZiAoY291bnRzLT5udW1Db25zdERl
ZnMgPT0gMSAmJiBjb3VudHMtPm51bURlZnMgPT0gMSkKKyAgICAgICAgICAgICAgICB1c2VzIC89
IDI7CisKKyAgICAgICAgICAgIHJldHVybiBkZWdyZWUgLyB1c2VzOworICAgICAgICB9OworCisg
ICAgICAgIGF1dG8gdmljdGltSXRlcmF0b3IgPSBpdGVyYXRvcjsKKyAgICAgICAgZG91YmxlIG1h
eFNjb3JlID0gc2NvcmUoQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUlu
ZGV4KCppdGVyYXRvcikpOworCisgICAgICAgICsraXRlcmF0b3I7CisgICAgICAgIGZvciAoO2l0
ZXJhdG9yICE9IG1fc3BpbGxXb3JrbGlzdC5lbmQoKTsgKytpdGVyYXRvcikgeworICAgICAgICAg
ICAgZG91YmxlIHRtcFNjb3JlID0gc2NvcmUoQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZy
b21BYnNvbHV0ZUluZGV4KCppdGVyYXRvcikpOworICAgICAgICAgICAgaWYgKHRtcFNjb3JlID4g
bWF4U2NvcmUpIHsKKyAgICAgICAgICAgICAgICBBU1NFUlQoIW1fdW5zcGlsbGFibGVUbXBzLmNv
bnRhaW5zKCppdGVyYXRvcikpOworICAgICAgICAgICAgICAgIHZpY3RpbUl0ZXJhdG9yID0gaXRl
cmF0b3I7CisgICAgICAgICAgICAgICAgbWF4U2NvcmUgPSB0bXBTY29yZTsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgfQorCisgICAgICAgIHVuc2lnbmVkIHZpY3RpbUluZGV4ID0gKnZpY3RpbUl0
ZXJhdG9yOworICAgICAgICBtX3NwaWxsV29ya2xpc3QucmVtb3ZlKHZpY3RpbUl0ZXJhdG9yKTsK
KyAgICAgICAgbV9zaW1wbGlmeVdvcmtsaXN0LmFwcGVuZCh2aWN0aW1JbmRleCk7CisKKyAgICAg
ICAgZnJlZXplTW92ZXModmljdGltSW5kZXgpOworICAgIH0KKworICAgIHZvaWQgYWxsb2NhdGUo
KQorICAgIHsKKyAgICAgICAgQVNTRVJUX1dJVEhfTUVTU0FHRShtX2FjdGl2ZU1vdmVzLnNpemUo
KSA+PSBtX2NvYWxlc2NpbmdDYW5kaWRhdGVzLnNpemUoKSwgIlRoZSBhY3RpdmVNb3ZlIHNldCBz
aG91bGQgYmUgYmlnIGVub3VnaCBmb3IgdGhlIHF1aWNrIG9wZXJhdGlvbnMgb2YgQml0VmVjdG9y
LiIpOworCisgICAgICAgIG1ha2VXb3JrTGlzdCgpOworCisgICAgICAgIGlmIChkZWJ1Zykgewor
ICAgICAgICAgICAgZGF0YUxvZygiSW50ZXJmZXJlbmNlOiAiLCBsaXN0RHVtcChtX2ludGVyZmVy
ZW5jZUVkZ2VzKSwgIlxuIik7CisgICAgICAgICAgICBkdW1wSW50ZXJmZXJlbmNlR3JhcGhJbkRv
dChXVEY6OmRhdGFGaWxlKCkpOworICAgICAgICAgICAgZGF0YUxvZygiQ29hbGVzY2luZyBjYW5k
aWRhdGVzOlxuIik7CisgICAgICAgICAgICBmb3IgKE1vdmVPcGVyYW5kcyYgbW92ZU9wIDogbV9j
b2FsZXNjaW5nQ2FuZGlkYXRlcykgeworICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICAiLCBB
YnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgobW92ZU9wLnNyY0lu
ZGV4KSwKKyAgICAgICAgICAgICAgICAgICAgIiAtPiAiLCBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBl
Pjo6dG1wRnJvbUFic29sdXRlSW5kZXgobW92ZU9wLmRzdEluZGV4KSwgIlxuIik7CisgICAgICAg
ICAgICB9CisgICAgICAgICAgICBkYXRhTG9nKCJJbml0aWFsIHdvcmsgbGlzdFxuIik7CisgICAg
ICAgICAgICBkdW1wV29ya0xpc3RzKFdURjo6ZGF0YUZpbGUoKSk7CisgICAgICAgIH0KKworICAg
ICAgICBkbyB7CisgICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykgeworICAgICAgICAgICAgICAg
IGRhdGFMb2coIkJlZm9yZSBHcmFwaCBzaW1wbGlmaWNhdGlvbiBpdGVyYXRpb25cbiIpOworICAg
ICAgICAgICAgICAgIGR1bXBXb3JrTGlzdHMoV1RGOjpkYXRhRmlsZSgpKTsKKyAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgaWYgKCFtX3NpbXBsaWZ5V29ya2xpc3QuaXNFbXB0eSgpKQorICAg
ICAgICAgICAgICAgIHNpbXBsaWZ5KCk7CisgICAgICAgICAgICBlbHNlIGlmICghbV93b3JrbGlz
dE1vdmVzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICBjb2FsZXNjZSgpOworICAgICAgICAg
ICAgZWxzZSBpZiAoIW1fZnJlZXplV29ya2xpc3QuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAg
IGZyZWV6ZSgpOworICAgICAgICAgICAgZWxzZSBpZiAoIW1fc3BpbGxXb3JrbGlzdC5pc0VtcHR5
KCkpCisgICAgICAgICAgICAgICAgc2VsZWN0U3BpbGwoKTsKKworICAgICAgICAgICAgaWYgKHRy
YWNlRGVidWcpIHsKKyAgICAgICAgICAgICAgICBkYXRhTG9nKCJBZnRlciBHcmFwaCBzaW1wbGlm
aWNhdGlvbiBpdGVyYXRpb25cbiIpOworICAgICAgICAgICAgICAgIGR1bXBXb3JrTGlzdHMoV1RG
OjpkYXRhRmlsZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoIW1fc2ltcGxp
ZnlXb3JrbGlzdC5pc0VtcHR5KCkgfHwgIW1fd29ya2xpc3RNb3Zlcy5pc0VtcHR5KCkgfHwgIW1f
ZnJlZXplV29ya2xpc3QuaXNFbXB0eSgpIHx8ICFtX3NwaWxsV29ya2xpc3QuaXNFbXB0eSgpKTsK
KworICAgICAgICBhc3NpZ25Db2xvcnMoKTsKKyAgICB9CisKKyNpZiBQTEFURk9STShDT0NPQSkK
KyNwcmFnbWEgbWFyayAtIERlYnVnZ2luZyBoZWxwZXJzLgorI2VuZGlmCisKKyAgICB2b2lkIGR1
bXBJbnRlcmZlcmVuY2VHcmFwaEluRG90KFByaW50U3RyZWFtJiBvdXQpCisgICAgeworICAgICAg
ICBvdXQucHJpbnQoImdyYXBoIEludGVyZmVyZW5jZUdyYXBoIHsgXG4iKTsKKworICAgICAgICBI
YXNoU2V0PFRtcD4gdG1wc1dpdGhJbnRlcmZlcmVuY2VzOworICAgICAgICBmb3IgKGNvbnN0IGF1
dG8mIGVkZ2UgOiBtX2ludGVyZmVyZW5jZUVkZ2VzKSB7CisgICAgICAgICAgICB0bXBzV2l0aElu
dGVyZmVyZW5jZXMuYWRkKEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJ
bmRleChlZGdlLmZpcnN0KCkpKTsKKyAgICAgICAgICAgIHRtcHNXaXRoSW50ZXJmZXJlbmNlcy5h
ZGQoQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KGVkZ2Uuc2Vj
b25kKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoY29uc3QgYXV0byYgdG1wIDogdG1w
c1dpdGhJbnRlcmZlcmVuY2VzKSB7CisgICAgICAgICAgICB1bnNpZ25lZCB0bXBJbmRleCA9IEFi
c29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHRtcCk7CisgICAgICAgICAgICBp
ZiAodG1wSW5kZXggPCBtX2RlZ3JlZXMuc2l6ZSgpKQorICAgICAgICAgICAgICAgIG91dC5wcmlu
dCgiICAgICIsIHRtcC5pbnRlcm5hbFZhbHVlKCksICIgW2xhYmVsPVwiIiwgdG1wLCAiICgiLCBt
X2RlZ3JlZXNbdG1wSW5kZXhdLCAiKVwiXTtcbiIpOworICAgICAgICAgICAgZWxzZQorICAgICAg
ICAgICAgICAgIG91dC5wcmludCgiICAgICIsIHRtcC5pbnRlcm5hbFZhbHVlKCksICIgW2xhYmVs
PVwiIiwgdG1wLCAiXCJdO1xuIik7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGNvbnN0IGF1
dG8mIGVkZ2UgOiBtX2ludGVyZmVyZW5jZUVkZ2VzKQorICAgICAgICAgICAgb3V0LnByaW50KCIg
ICAgIiwgZWRnZS5maXJzdCgpLCAiIC0tICIsIGVkZ2Uuc2Vjb25kKCksICI7XG4iKTsKKyAgICAg
ICAgb3V0LnByaW50KCJ9XG4iKTsKKyAgICB9CisKKyAgICB2b2lkIGR1bXBXb3JrTGlzdHMoUHJp
bnRTdHJlYW0mIG91dCkKKyAgICB7CisgICAgICAgIG91dC5wcmludCgiU2ltcGxpZnkgd29yayBs
aXN0OlxuIik7CisgICAgICAgIGZvciAodW5zaWduZWQgdG1wSW5kZXggOiBtX3NpbXBsaWZ5V29y
a2xpc3QpCisgICAgICAgICAgICBvdXQucHJpbnQoIiAgICAiLCBBYnNvbHV0ZVRtcE1hcHBlcjx0
eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgodG1wSW5kZXgpLCAiXG4iKTsKKyAgICAgICAgb3V0
LnByaW50ZigiTW92ZXMgd29yayBsaXN0IGlzIGVtcHR5PyAlZFxuIiwgbV93b3JrbGlzdE1vdmVz
LmlzRW1wdHkoKSk7CisgICAgICAgIG91dC5wcmludCgiRnJlZXplIHdvcmsgbGlzdDpcbiIpOwor
ICAgICAgICBmb3IgKHVuc2lnbmVkIHRtcEluZGV4IDogbV9mcmVlemVXb3JrbGlzdCkKKyAgICAg
ICAgICAgIG91dC5wcmludCgiICAgICIsIEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9t
QWJzb2x1dGVJbmRleCh0bXBJbmRleCksICJcbiIpOworICAgICAgICBvdXQucHJpbnQoIlNwaWxs
IHdvcmsgbGlzdDpcbiIpOworICAgICAgICBmb3IgKHVuc2lnbmVkIHRtcEluZGV4IDogbV9zcGls
bFdvcmtsaXN0KQorICAgICAgICAgICAgb3V0LnByaW50KCIgICAgIiwgQWJzb2x1dGVUbXBNYXBw
ZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KHRtcEluZGV4KSwgIlxuIik7CisgICAgfQor
CisgICAgdXNpbmcgQWJzdHJhY3RDb2xvcmluZ0FsbG9jYXRvcjx1bnNpZ25lZD46OmFkZEVkZ2U7
CisgICAgdXNpbmcgQWJzdHJhY3RDb2xvcmluZ0FsbG9jYXRvcjx1bnNpZ25lZD46OmdldEFsaWFz
OworCisgICAgQ29kZSYgbV9jb2RlOworICAgIFRtcFdpZHRoJiBtX3RtcFdpZHRoOworICAgIC8v
IEZJWE1FOiBzcGlsbGluZyBzaG91bGQgbm90IHR5cGUgc3BlY2lmaWMuIEl0IGlzIG9ubHkgYSBz
aWRlIGVmZmVjdCBvZiB1c2luZyBVc2VDb3VudHMuCisgICAgY29uc3QgVXNlQ291bnRzPFRtcD4m
IG1fdXNlQ291bnRzOworfTsKKworY2xhc3MgSXRlcmF0ZWRSZWdpc3RlckNvYWxlc2Npbmcgewor
cHVibGljOgorICAgIEl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nKENvZGUmIGNvZGUpCisgICAg
ICAgIDogbV9jb2RlKGNvZGUpCisgICAgICAgICwgbV91c2VDb3VudHMoY29kZSkKKyAgICB7Cisg
ICAgfQorCisgICAgdm9pZCBydW4oKQorICAgIHsKKyAgICAgICAgcGFkSW50ZXJmZXJlbmNlKG1f
Y29kZSk7CisgICAgICAgIAorICAgICAgICBpdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZ09uVHlw
ZTxBcmc6OkdQPigpOworICAgICAgICBpdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZ09uVHlwZTxB
cmc6OkZQPigpOworCisgICAgICAgIGZpeFNwaWxsc0FmdGVyVGVybWluYWxzKCk7CisKKyAgICAg
ICAgaWYgKHJlcG9ydFN0YXRzKQorICAgICAgICAgICAgZGF0YUxvZygiTnVtIGl0ZXJhdGlvbnMg
PSAiLCBtX251bUl0ZXJhdGlvbnMsICJcbiIpOworICAgIH0KKworcHJpdmF0ZToKKyAgICB0ZW1w
bGF0ZTxBcmc6OlR5cGUgdHlwZT4KKyAgICB2b2lkIGl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5n
T25UeXBlKCkKKyAgICB7CisgICAgICAgIEhhc2hTZXQ8dW5zaWduZWQ+IHVuc3BpbGxhYmxlVG1w
cyA9IGNvbXB1dGVVbnNwaWxsYWJsZVRtcHM8dHlwZT4oKTsKKworICAgICAgICAvLyBGSVhNRTog
SWYgYSBUbXAgaXMgdXNlZCBvbmx5IGZyb20gYSBTY3JhdGNoIHJvbGUgYW5kIHRoYXQgYXJndW1l
bnQgaXMgIWFkbWl0c1N0YWNrLCB0aGVuCisgICAgICAgIC8vIHdlIHNob3VsZCBhZGQgdGhlIFRt
cCB0byB1bnNwaWxsYWJsZVRtcHMuIFRoYXQgd2lsbCBoZWxwIGF2b2lkIHJlbG9vcGluZyBvbmx5
IHRvIHR1cm4gdGhlCisgICAgICAgIC8vIFRtcCBpbnRvIGFuIHVuc3BpbGxhYmxlIFRtcC4KKyAg
ICAgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1MjY5OQor
ICAgICAgICAKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICsrbV9udW1JdGVy
YXRpb25zOworCisgICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKKyAgICAgICAgICAgICAgICBk
YXRhTG9nKCJDb2RlIGF0IGl0ZXJhdGlvbiAiLCBtX251bUl0ZXJhdGlvbnMsICI6XG4iLCBtX2Nv
ZGUpOworCisgICAgICAgICAgICAvLyBGSVhNRTogT25lIHdheSB0byBvcHRpbWl6ZSB0aGlzIGNv
ZGUgaXMgdG8gcmVtb3ZlIHRoZSByZWNvbXB1dGF0aW9uIGluc2lkZSB0aGUgZml4cG9pbnQuCisg
ICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHJlY29tcHV0ZSBiZWNhdXNlIHNwaWxsaW5nIGFkZHMg
dG1wcywgYnV0IHdlIGNvdWxkIGp1c3QgdXBkYXRlIHRtcFdpZHRoIHdoZW4gd2UKKyAgICAgICAg
ICAgIC8vIGFkZCB0aG9zZSB0bXBzLiBOb3RlIHRoYXQgb25lIGVhc3kgd2F5IHRvIHJlbW92ZSB0
aGUgcmVjb21wdXRhdGlvbiBpcyB0byBtYWtlIGFueSBuZXdseQorICAgICAgICAgICAgLy8gYWRk
ZWQgVG1wcyBnZXQgdGhlIHNhbWUgdXNlL2RlZiB3aWR0aHMgdGhhdCB0aGUgb3JpZ2luYWwgVG1w
IGdvdC4gQnV0LCB0aGlzIG1heSBodXJ0IHRoZQorICAgICAgICAgICAgLy8gc3BpbGwgY29kZSB3
ZSBlbWl0LiBTaW5jZSB3ZSBjdXJyZW50bHkgcmVjb21wdXRlIFRtcFdpZHRoIGFmdGVyIHNwaWxs
aW5nLCB0aGUgbmV3bHkKKyAgICAgICAgICAgIC8vIGNyZWF0ZWQgVG1wcyBtYXkgZ2V0IG5hcnJv
d2VyIHVzZS9kZWYgd2lkdGhzLiBPbiB0aGUgb3RoZXIgaGFuZCwgdGhlIHNwaWxsZXIgYWxyZWFk
eQorICAgICAgICAgICAgLy8gc2VsZWN0cyB3aGljaCBtb3ZlIGluc3RydWN0aW9uIHRvIHVzZSBi
YXNlZCBvbiB0aGUgb3JpZ2luYWwgVG1wJ3Mgd2lkdGhzLCBzbyBpdCBtYXkgbm90CisgICAgICAg
ICAgICAvLyBtYXR0ZXIgdGhhbiBhIHN1YnNlcXVlbnQgaXRlcmF0aW9uIHNlZXMgYSBjb3NlcnZh
dGl2ZSB3aWR0aCBmb3IgdGhlIG5ldyBUbXBzLiBBbHNvLCB0aGUKKyAgICAgICAgICAgIC8vIHJl
Y29tcHV0YXRpb24gbWF5IG5vdCBhY3R1YWxseSBiZSBhIHBlcmZvcm1hbmNlIHByb2JsZW07IGl0
J3MgbGlrZWx5IHRoYXQgYSBiZXR0ZXIgd2F5IHRvCisgICAgICAgICAgICAvLyBpbXByb3ZlIHBl
cmZvcm1hbmNlIG9mIFRtcFdpZHRoIGlzIHRvIHJlcGxhY2UgaXRzIEhhc2hNYXAgd2l0aCBzb21l
dGhpbmcgZWxzZS4gSXQncworICAgICAgICAgICAgLy8gcG9zc2libGUgdGhhdCBtb3N0IG9mIHRo
ZSBUbXBXaWR0aCBvdmVyaGVhZCBpcyBmcm9tIHF1ZXJpZXMgb2YgVG1wV2lkdGggcmF0aGVyIHRo
YW4gdGhlCisgICAgICAgICAgICAvLyByZWNvbXB1dGF0aW9uLCBpbiB3aGljaCBjYXNlIHNwZWVk
aW5nIHVwIHRoZSBsb29rdXAgd291bGQgYmUgYSBiaWdnZXIgd2luLgorICAgICAgICAgICAgLy8g
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1MjQ3OAorICAgICAgICAg
ICAgbV90bXBXaWR0aC5yZWNvbXB1dGUobV9jb2RlKTsKKyAgICAgICAgICAgIAorICAgICAgICAg
ICAgQ29sb3JpbmdBbGxvY2F0b3I8dHlwZT4gYWxsb2NhdG9yKG1fY29kZSwgbV90bXBXaWR0aCwg
bV91c2VDb3VudHMsIHVuc3BpbGxhYmxlVG1wcyk7CisgICAgICAgICAgICBpZiAoIWFsbG9jYXRv
ci5yZXF1aXJlc1NwaWxsaW5nKCkpIHsKKyAgICAgICAgICAgICAgICBhc3NpZ25SZWdpc3RlcnNU
b1RtcChhbGxvY2F0b3IpOworICAgICAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQorICAgICAg
ICAgICAgICAgICAgICBkYXRhTG9nKCJTdWNjZXNzZnVsbCBhbGxvY2F0aW9uIGF0IGl0ZXJhdGlv
biAiLCBtX251bUl0ZXJhdGlvbnMsICI6XG4iLCBtX2NvZGUpOworCisgICAgICAgICAgICAgICAg
cmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkU3BpbGxBbmRGaWxsPHR5cGU+
KGFsbG9jYXRvciwgdW5zcGlsbGFibGVUbXBzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHRl
bXBsYXRlPEFyZzo6VHlwZSB0eXBlPgorICAgIEhhc2hTZXQ8dW5zaWduZWQ+IGNvbXB1dGVVbnNw
aWxsYWJsZVRtcHMoKQorICAgIHsKKyAgICAgICAgSGFzaFNldDx1bnNpZ25lZD4gdW5zcGlsbGFi
bGVUbXBzOworCisgICAgICAgIHN0cnVjdCBSYW5nZSB7CisgICAgICAgICAgICB1bnNpZ25lZCBm
aXJzdCB7IHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgoKSB9OworICAgICAgICAg
ICAgdW5zaWduZWQgbGFzdCB7IDAgfTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNvdW50IHsgMCB9
OworICAgICAgICAgICAgdW5zaWduZWQgYWRtaXRTdGFja0NvdW50IHsgMCB9OworICAgICAgICB9
OworCisgICAgICAgIHVuc2lnbmVkIG51bVRtcHMgPSBtX2NvZGUubnVtVG1wcyh0eXBlKTsKKyAg
ICAgICAgdW5zaWduZWQgYXJyYXlTaXplID0gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29s
dXRlSW5kZXgobnVtVG1wcyk7CisKKyAgICAgICAgVmVjdG9yPFJhbmdlLCAwLCBVbnNhZmVWZWN0
b3JPdmVyZmxvdz4gcmFuZ2VzOworICAgICAgICByYW5nZXMuZmlsbChSYW5nZSgpLCBhcnJheVNp
emUpOworCisgICAgICAgIHVuc2lnbmVkIGdsb2JhbEluZGV4ID0gMDsKKyAgICAgICAgZm9yIChC
YXNpY0Jsb2NrKiBibG9jayA6IG1fY29kZSkgeworICAgICAgICAgICAgZm9yIChJbnN0JiBpbnN0
IDogKmJsb2NrKSB7CisgICAgICAgICAgICAgICAgaW5zdC5mb3JFYWNoQXJnKFsmXSAoQXJnJiBh
cmcsIEFyZzo6Um9sZSwgQXJnOjpUeXBlIGFyZ1R5cGUsIEFyZzo6V2lkdGgpIHsKKyAgICAgICAg
ICAgICAgICAgICAgaWYgKGFyZy5pc1RtcCgpICYmIGluc3QuYWRtaXRzU3RhY2soYXJnKSkgewor
ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ1R5cGUgIT0gdHlwZSkKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFRtcCB0
bXAgPSBhcmcudG1wKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBSYW5nZSYgcmFuZ2UgPSBy
YW5nZXNbQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodG1wKV07CisgICAg
ICAgICAgICAgICAgICAgICAgICByYW5nZS5jb3VudCsrOworICAgICAgICAgICAgICAgICAgICAg
ICAgcmFuZ2UuYWRtaXRTdGFja0NvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAo
Z2xvYmFsSW5kZXggPCByYW5nZS5maXJzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHJhbmdlLmZpcnN0ID0gZ2xvYmFsSW5kZXg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
cmFuZ2UubGFzdCA9IGdsb2JhbEluZGV4OworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNl
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UubGFzdCA9IGdsb2JhbEluZGV4Owor
CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgICAgICAgICBhcmcuZm9yRWFjaFRtcEZhc3QoWyZdIChUbXAmIHRtcCkg
eworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcC5pc0dQKCkgIT0gKHR5cGUgPT0gQXJn
OjpHUCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAg
ICAgICAgICAgICAgICBSYW5nZSYgcmFuZ2UgPSByYW5nZXNbQWJzb2x1dGVUbXBNYXBwZXI8dHlw
ZT46OmFic29sdXRlSW5kZXgodG1wKV07CisgICAgICAgICAgICAgICAgICAgICAgICByYW5nZS5j
b3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdsb2JhbEluZGV4IDwgcmFuZ2Uu
Zmlyc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZS5maXJzdCA9IGdsb2Jh
bEluZGV4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmxhc3QgPSBnbG9iYWxJ
bmRleDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHJhbmdlLmxhc3QgPSBnbG9iYWxJbmRleDsKKyAgICAgICAgICAgICAgICAgICAg
fSk7CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgICArK2dsb2JhbEluZGV4
OworICAgICAgICAgICAgfQorICAgICAgICAgICAgKytnbG9iYWxJbmRleDsKKyAgICAgICAgfQor
ICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6bGFzdE1h
Y2hpbmVSZWdpc3RlckluZGV4KCkgKyAxOyBpIDwgcmFuZ2VzLnNpemUoKTsgKytpKSB7CisgICAg
ICAgICAgICBSYW5nZSYgcmFuZ2UgPSByYW5nZXNbaV07CisgICAgICAgICAgICBpZiAocmFuZ2Uu
bGFzdCAtIHJhbmdlLmZpcnN0IDw9IDEgJiYgcmFuZ2UuY291bnQgPiByYW5nZS5hZG1pdFN0YWNr
Q291bnQpCisgICAgICAgICAgICAgICAgdW5zcGlsbGFibGVUbXBzLmFkZChpKTsKKyAgICAgICAg
fQorCisgICAgICAgIHJldHVybiB1bnNwaWxsYWJsZVRtcHM7CisgICAgfQorCisgICAgdGVtcGxh
dGU8QXJnOjpUeXBlIHR5cGU+CisgICAgdm9pZCBhc3NpZ25SZWdpc3RlcnNUb1RtcChjb25zdCBD
b2xvcmluZ0FsbG9jYXRvcjx0eXBlPiYgYWxsb2NhdG9yKQorICAgIHsKKyAgICAgICAgZm9yIChC
YXNpY0Jsb2NrKiBibG9jayA6IG1fY29kZSkgeworICAgICAgICAgICAgLy8gR2l2ZSBUbXAgYSB2
YWxpZCByZWdpc3Rlci4KKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW5zdEluZGV4ID0gMDsg
aW5zdEluZGV4IDwgYmxvY2stPnNpemUoKTsgKytpbnN0SW5kZXgpIHsKKyAgICAgICAgICAgICAg
ICBJbnN0JiBpbnN0ID0gYmxvY2stPmF0KGluc3RJbmRleCk7CisKKyAgICAgICAgICAgICAgICAv
LyBUaGUgbWF5QmVDb2FsZXNjYWJsZSgpIG1ldGhvZCB3aWxsIGNoYW5nZSBpdHMgbWluZCBmb3Ig
c29tZSBvcGVyYXRpb25zIGFmdGVyIHdlCisgICAgICAgICAgICAgICAgLy8gY29tcGxldGUgcmVn
aXN0ZXIgYWxsb2NhdGlvbi4gU28sIHdlIHJlY29yZCB0aGlzIGJlZm9yZSBzdGFydGluZy4KKyAg
ICAgICAgICAgICAgICBib29sIG1heUJlQ29hbGVzY2FibGUgPSBhbGxvY2F0b3IubWF5QmVDb2Fs
ZXNjYWJsZShpbnN0KTsKKworICAgICAgICAgICAgICAgIC8vIE1vdmUzMiBpcyBjaGVhcGVyIGlm
IHdlIGtub3cgdGhhdCBpdCdzIGVxdWl2YWxlbnQgdG8gYSBNb3ZlLiBJdCdzCisgICAgICAgICAg
ICAgICAgLy8gZXF1aXZhbGVudCBpZiB0aGUgZGVzdGluYXRpb24ncyBoaWdoIGJpdHMgYXJlIG5v
dCBvYnNlcnZhYmxlIG9yIGlmIHRoZSBzb3VyY2UncyBoaWdoCisgICAgICAgICAgICAgICAgLy8g
Yml0cyBhcmUgYWxsIHplcm8uIE5vdGUgdGhhdCB3ZSBkb24ndCBoYXZlIHRoZSBvcHBvc2l0ZSBv
cHRpbWl6YXRpb24gZm9yIG90aGVyCisgICAgICAgICAgICAgICAgLy8gYXJjaGl0ZWN0dXJlcywg
d2hpY2ggbWF5IHByZWZlciBNb3ZlIG92ZXIgTW92ZTMyLCBiZWNhdXNlIE1vdmUgaXMgY2Fub25p
Y2FsIGFscmVhZHkuCisgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gQXJnOjpHUCAmJiBpbnN0
LmtpbmQub3Bjb2RlID09IE1vdmUKKyAgICAgICAgICAgICAgICAgICAgJiYgaW5zdC5hcmdzWzBd
LmlzVG1wKCkgJiYgaW5zdC5hcmdzWzFdLmlzVG1wKCkpIHsKKyAgICAgICAgICAgICAgICAgICAg
aWYgKG1fdG1wV2lkdGgudXNlV2lkdGgoaW5zdC5hcmdzWzFdLnRtcCgpKSA8PSBBcmc6OldpZHRo
MzIKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1fdG1wV2lkdGguZGVmV2lkdGgoaW5zdC5h
cmdzWzBdLnRtcCgpKSA8PSBBcmc6OldpZHRoMzIpCisgICAgICAgICAgICAgICAgICAgICAgICBp
bnN0LmtpbmQub3Bjb2RlID0gTW92ZTMyOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgICAgIGluc3QuZm9yRWFjaFRtcEZhc3QoWyZdIChUbXAmIHRtcCkgeworICAgICAgICAgICAg
ICAgICAgICBpZiAodG1wLmlzUmVnKCkgfHwgdG1wLmlzR1AoKSA9PSAodHlwZSAhPSBBcmc6OkdQ
KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgICAgICAg
ICBUbXAgYWxpYXNUbXAgPSBhbGxvY2F0b3IuZ2V0QWxpYXModG1wKTsKKyAgICAgICAgICAgICAg
ICAgICAgVG1wIGFzc2lnbmVkVG1wOworICAgICAgICAgICAgICAgICAgICBpZiAoYWxpYXNUbXAu
aXNSZWcoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbmVkVG1wID0gVG1wKGFsaWFz
VG1wLnJlZygpKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAg
ICAgICAgICBhdXRvIHJlZyA9IGFsbG9jYXRvci5hbGxvY2F0ZWRSZWcoYWxpYXNUbXApOworICAg
ICAgICAgICAgICAgICAgICAgICAgQVNTRVJUKHJlZyk7CisgICAgICAgICAgICAgICAgICAgICAg
ICBhc3NpZ25lZFRtcCA9IFRtcChyZWcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICAgICAgICAgIEFTU0VSVChhc3NpZ25lZFRtcC5pc1JlZygpKTsKKyAgICAgICAgICAgICAg
ICAgICAgdG1wID0gYXNzaWduZWRUbXA7CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAg
ICAgICAgICBpZiAobWF5QmVDb2FsZXNjYWJsZSAmJiBpbnN0LmFyZ3NbMF0uaXNUbXAoKSAmJiBp
bnN0LmFyZ3NbMV0uaXNUbXAoKQorICAgICAgICAgICAgICAgICAgICAmJiBpbnN0LmFyZ3NbMF0u
dG1wKCkgPT0gaW5zdC5hcmdzWzFdLnRtcCgpKQorICAgICAgICAgICAgICAgICAgICBpbnN0ID0g
SW5zdCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBSZW1vdmUgYWxsIHRoZSB1
c2VsZXNzIG1vdmVzIHdlIGNyZWF0ZWQgaW4gdGhpcyBibG9jay4KKyAgICAgICAgICAgIGJsb2Nr
LT5pbnN0cygpLnJlbW92ZUFsbE1hdGNoaW5nKFsmXSAoY29uc3QgSW5zdCYgaW5zdCkgeworICAg
ICAgICAgICAgICAgIHJldHVybiAhaW5zdDsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9Cisg
ICAgfQorCisgICAgc3RhdGljIHVuc2lnbmVkIHN0YWNrU2xvdE1pbmltdW1XaWR0aChBcmc6Oldp
ZHRoIHdpZHRoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHdpZHRoIDw9IEFyZzo6V2lkdGgzMiA/
IDQgOiA4OworICAgIH0KKworICAgIHRlbXBsYXRlPEFyZzo6VHlwZSB0eXBlPgorICAgIHZvaWQg
YWRkU3BpbGxBbmRGaWxsKGNvbnN0IENvbG9yaW5nQWxsb2NhdG9yPHR5cGU+JiBhbGxvY2F0b3Is
IEhhc2hTZXQ8dW5zaWduZWQ+JiB1bnNwaWxsYWJsZVRtcHMpCisgICAgeworICAgICAgICBIYXNo
TWFwPFRtcCwgU3RhY2tTbG90Kj4gc3RhY2tTbG90czsKKyAgICAgICAgZm9yIChUbXAgdG1wIDog
YWxsb2NhdG9yLnNwaWxsZWRUbXBzKCkpIHsKKyAgICAgICAgICAgIC8vIEFsbCB0aGUgc3BpbGxl
ZCB2YWx1ZXMgYmVjb21lIHVuc3BpbGxhYmxlLgorICAgICAgICAgICAgdW5zcGlsbGFibGVUbXBz
LmFkZChBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh0bXApKTsKKworICAg
ICAgICAgICAgLy8gQWxsb2NhdGUgc3RhY2sgc2xvdCBmb3IgZWFjaCBzcGlsbGVkIHZhbHVlLgor
ICAgICAgICAgICAgU3RhY2tTbG90KiBzdGFja1Nsb3QgPSBtX2NvZGUuYWRkU3RhY2tTbG90KAor
ICAgICAgICAgICAgICAgIHN0YWNrU2xvdE1pbmltdW1XaWR0aChtX3RtcFdpZHRoLnJlcXVpcmVk
V2lkdGgodG1wKSksIFN0YWNrU2xvdEtpbmQ6OlNwaWxsKTsKKyAgICAgICAgICAgIGJvb2wgaXNO
ZXdUbXAgPSBzdGFja1Nsb3RzLmFkZCh0bXAsIHN0YWNrU2xvdCkuaXNOZXdFbnRyeTsKKyAgICAg
ICAgICAgIEFTU0VSVF9VTlVTRUQoaXNOZXdUbXAsIGlzTmV3VG1wKTsKKyAgICAgICAgfQorCisg
ICAgICAgIC8vIFJld3JpdGUgdGhlIHByb2dyYW0gdG8gZ2V0IHJpZCBvZiB0aGUgc3BpbGxlZCBU
bXAuCisgICAgICAgIEluc2VydGlvblNldCBpbnNlcnRpb25TZXQobV9jb2RlKTsKKyAgICAgICAg
Zm9yIChCYXNpY0Jsb2NrKiBibG9jayA6IG1fY29kZSkgeworICAgICAgICAgICAgYm9vbCBoYXNB
bGlhc2VkVG1wcyA9IGZhbHNlOworCisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGluc3RJbmRl
eCA9IDA7IGluc3RJbmRleCA8IGJsb2NrLT5zaXplKCk7ICsraW5zdEluZGV4KSB7CisgICAgICAg
ICAgICAgICAgSW5zdCYgaW5zdCA9IGJsb2NrLT5hdChpbnN0SW5kZXgpOworCisgICAgICAgICAg
ICAgICAgLy8gVGhlIFRtcFdpZHRoIGFuYWx5c2lzIHdpbGwgc2F5IHRoYXQgYSBNb3ZlIG9ubHkg
c3RvcmVzIDMyIGJpdHMgaW50byB0aGUgZGVzdGluYXRpb24sCisgICAgICAgICAgICAgICAgLy8g
aWYgdGhlIHNvdXJjZSBvbmx5IGhhZCAzMiBiaXRzIHdvcnRoIG9mIG5vbi16ZXJvIGJpdHMuIFNh
bWUgZm9yIHRoZSBzb3VyY2U6IGl0IHdpbGwKKyAgICAgICAgICAgICAgICAvLyBvbmx5IGNsYWlt
IHRvIHJlYWQgMzIgYml0cyBmcm9tIHRoZSBzb3VyY2UgaWYgb25seSAzMiBiaXRzIG9mIHRoZSBk
ZXN0aW5hdGlvbiBhcmUKKyAgICAgICAgICAgICAgICAvLyByZWFkLiBOb3RlIHRoYXQgd2Ugb25s
eSBhcHBseSB0aGlzIGxvZ2ljIGlmIHRoaXMgdHVybnMgaW50byBhIGxvYWQgb3Igc3RvcmUsIHNp
bmNlCisgICAgICAgICAgICAgICAgLy8gTW92ZSBpcyB0aGUgY2Fub25pY2FsIHdheSB0byBtb3Zl
IGRhdGEgYmV0d2VlbiBHUFJzLgorICAgICAgICAgICAgICAgIGJvb2wgY2FuVXNlTW92ZTMySWZE
aWRTcGlsbCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJvb2wgZGlkU3BpbGwgPSBmYWxzZTsK
KyAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBBcmc6OkdQICYmIGluc3Qua2luZC5vcGNvZGUg
PT0gTW92ZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKGluc3QuYXJnc1swXS5pc1RtcCgp
ICYmIG1fdG1wV2lkdGgud2lkdGgoaW5zdC5hcmdzWzBdLnRtcCgpKSA8PSBBcmc6OldpZHRoMzIp
CisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoaW5zdC5hcmdzWzFdLmlzVG1wKCkgJiYgbV90
bXBXaWR0aC53aWR0aChpbnN0LmFyZ3NbMV0udG1wKCkpIDw9IEFyZzo6V2lkdGgzMikpCisgICAg
ICAgICAgICAgICAgICAgICAgICBjYW5Vc2VNb3ZlMzJJZkRpZFNwaWxsID0gdHJ1ZTsKKyAgICAg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBUcnkgdG8gcmVwbGFjZSB0aGUgcmVn
aXN0ZXIgdXNlIGJ5IG1lbW9yeSB1c2Ugd2hlbiBwb3NzaWJsZS4KKyAgICAgICAgICAgICAgICBp
bnN0LmZvckVhY2hBcmcoCisgICAgICAgICAgICAgICAgICAgIFsmXSAoQXJnJiBhcmcsIEFyZzo6
Um9sZSByb2xlLCBBcmc6OlR5cGUgYXJnVHlwZSwgQXJnOjpXaWR0aCB3aWR0aCkgeworICAgICAg
ICAgICAgICAgICAgICAgICAgaWYgKCFhcmcuaXNUbXAoKSkKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnVHlwZSAhPSB0
eXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGlmIChhcmcuaXNSZWcoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBy
ZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAg
IGF1dG8gc3RhY2tTbG90RW50cnkgPSBzdGFja1Nsb3RzLmZpbmQoYXJnLnRtcCgpKTsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGlmIChzdGFja1Nsb3RFbnRyeSA9PSBzdGFja1Nsb3RzLmVuZCgp
KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGlmICghaW5zdC5hZG1pdHNTdGFjayhhcmcpKQorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAg
ICAgICAgICAgLy8gSWYgdGhlIFRtcCBob2xkcyBhIGNvbnN0YW50IHRoZW4gd2Ugd2FudCB0byBy
ZW1hdGVyaWFsaXplIGl0cworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWUgcmF0aGVy
IHRoYW4gbG9hZGluZyBpdCBmcm9tIHRoZSBzdGFjay4gSW4gb3JkZXIgZm9yIHRoYXQKKyAgICAg
ICAgICAgICAgICAgICAgICAgIC8vIG9wdGltaXphdGlvbiB0byBraWNrIGluLCB3ZSBuZWVkIHRv
IGF2b2lkIHBsYWNpbmcgdGhlIFRtcCdzIHN0YWNrCisgICAgICAgICAgICAgICAgICAgICAgICAv
LyBhZGRyZXNzIGludG8gdGhlIGluc3RydWN0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAg
aWYgKCFBcmc6OmlzQ29sZFVzZShyb2xlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGNvbnN0IFVzZUNvdW50czxUbXA+OjpDb3VudHMqIGNvdW50cyA9IG1fdXNlQ291bnRzW2FyZy50
bXAoKV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50cyAmJiBjb3VudHMt
Pm51bUNvbnN0RGVmcyA9PSAxICYmIGNvdW50cy0+bnVtRGVmcyA9PSAxKQorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIEFyZzo6V2lk
dGggc3BpbGxXaWR0aCA9IG1fdG1wV2lkdGgucmVxdWlyZWRXaWR0aChhcmcudG1wKCkpOworICAg
ICAgICAgICAgICAgICAgICAgICAgaWYgKEFyZzo6aXNBbnlEZWYocm9sZSkgJiYgd2lkdGggPCBz
cGlsbFdpZHRoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIEFTU0VSVChpbnN0LmtpbmQub3Bjb2RlID09IE1vdmUgfHwgIShBcmc6
OmlzQW55VXNlKHJvbGUpICYmIHdpZHRoID4gc3BpbGxXaWR0aCkpOworICAgICAgICAgICAgICAg
ICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3BpbGxXaWR0aCAhPSBBcmc6
OldpZHRoMzIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuVXNlTW92ZTMySWZEaWRT
cGlsbCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAg
ICAgICAgICBzdGFja1Nsb3RFbnRyeS0+dmFsdWUtPmVuc3VyZVNpemUoCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgY2FuVXNlTW92ZTMySWZEaWRTcGlsbCA/IDQgOiBBcmc6OmJ5dGVzKHdp
ZHRoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBBcmc6OnN0YWNrKHN0YWNrU2xv
dEVudHJ5LT52YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBkaWRTcGlsbCA9IHRydWU7
CisgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgaWYgKGRpZFNwaWxs
ICYmIGNhblVzZU1vdmUzMklmRGlkU3BpbGwpCisgICAgICAgICAgICAgICAgICAgIGluc3Qua2lu
ZC5vcGNvZGUgPSBNb3ZlMzI7CisKKyAgICAgICAgICAgICAgICAvLyBGb3IgZXZlcnkgb3RoZXIg
Y2FzZSwgYWRkIExvYWQvU3RvcmUgYXMgbmVlZGVkLgorICAgICAgICAgICAgICAgIGluc3QuZm9y
RWFjaFRtcChbJl0gKFRtcCYgdG1wLCBBcmc6OlJvbGUgcm9sZSwgQXJnOjpUeXBlIGFyZ1R5cGUs
IEFyZzo6V2lkdGgpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRtcC5pc1JlZygpIHx8IGFy
Z1R5cGUgIT0gdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAg
ICAgICAgICAgICAgICBhdXRvIHN0YWNrU2xvdEVudHJ5ID0gc3RhY2tTbG90cy5maW5kKHRtcCk7
CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGFja1Nsb3RFbnRyeSA9PSBzdGFja1Nsb3RzLmVu
ZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUbXAgYWxpYXMgPSBhbGxvY2F0b3IuZ2V0
QWxpYXNXaGVuU3BpbGxpbmcodG1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbGlh
cyAhPSB0bXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBhbGlhczsKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNBbGlhc2VkVG1wcyA9IHRydWU7CisgICAgICAg
ICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBBcmc6OldpZHRoIHNwaWxs
V2lkdGggPSBtX3RtcFdpZHRoLnJlcXVpcmVkV2lkdGgodG1wKTsKKyAgICAgICAgICAgICAgICAg
ICAgT3Bjb2RlIG1vdmUgPSBPb3BzOworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN0YWNr
U2xvdE1pbmltdW1XaWR0aChzcGlsbFdpZHRoKSkgeworICAgICAgICAgICAgICAgICAgICBjYXNl
IDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBtb3ZlID0gdHlwZSA9PSBBcmc6OkdQID8gTW92
ZTMyIDogTW92ZUZsb2F0OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vdmUgPSB0eXBl
ID09IEFyZzo6R1AgPyBNb3ZlIDogTW92ZURvdWJsZTsKKyAgICAgICAgICAgICAgICAgICAgICAg
IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAg
ICAgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAg
dG1wID0gbV9jb2RlLm5ld1RtcCh0eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgdW5zcGlsbGFi
bGVUbXBzLmFkZChBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh0bXApKTsK
KworICAgICAgICAgICAgICAgICAgICBBcmcgYXJnID0gQXJnOjpzdGFjayhzdGFja1Nsb3RFbnRy
eS0+dmFsdWUpOworICAgICAgICAgICAgICAgICAgICBpZiAoQXJnOjppc0FueVVzZShyb2xlKSAm
JiByb2xlICE9IEFyZzo6U2NyYXRjaCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydGlv
blNldC5pbnNlcnQoaW5zdEluZGV4LCBtb3ZlLCBpbnN0Lm9yaWdpbiwgYXJnLCB0bXApOworICAg
ICAgICAgICAgICAgICAgICBpZiAoQXJnOjppc0FueURlZihyb2xlKSkKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGluc2VydGlvblNldC5pbnNlcnQoaW5zdEluZGV4ICsgMSwgbW92ZSwgaW5zdC5v
cmlnaW4sIHRtcCwgYXJnKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIGluc2VydGlvblNldC5leGVjdXRlKGJsb2NrKTsKKworICAgICAgICAgICAgaWYg
KGhhc0FsaWFzZWRUbXBzKSB7CisgICAgICAgICAgICAgICAgYmxvY2stPmluc3RzKCkucmVtb3Zl
QWxsTWF0Y2hpbmcoWyZdIChjb25zdCBJbnN0JiBpbnN0KSB7CisgICAgICAgICAgICAgICAgICAg
IHJldHVybiBhbGxvY2F0b3IuaXNVc2VsZXNzTW92ZShpbnN0KTsKKyAgICAgICAgICAgICAgICB9
KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgZml4U3BpbGxz
QWZ0ZXJUZXJtaW5hbHMoKQorICAgIHsKKyAgICAgICAgLy8gQmVjYXVzZSB0aGVyZSBtYXkgYmUg
dGVybWluYWxzIHRoYXQgcHJvZHVjZSB2YWx1ZXMsIElSQyBtYXkKKyAgICAgICAgLy8gd2FudCB0
byBzcGlsbCB0aG9zZSB0ZXJtaW5hbHMuIEl0J2xsIGhhcHBlbiB0byBzcGlsbCBpdCBhZnRlcgor
ICAgICAgICAvLyB0aGUgdGVybWluYWwuIElmIHdlIGxlZnQgdGhlIGdyYXBoIGluIHRoaXMgc3Rh
dGUsIGl0J2QgYmUgaW52YWxpZAorICAgICAgICAvLyBiZWNhdXNlIGEgdGVybWluYWwgbXVzdCBi
ZSB0aGUgbGFzdCBpbnN0cnVjdGlvbiBpbiBhIGJsb2NrLgorICAgICAgICAvLyBXZSBmaXggdGhh
dCBoZXJlLgorCisgICAgICAgIEluc2VydGlvblNldCBpbnNlcnRpb25TZXQobV9jb2RlKTsKKwor
ICAgICAgICBib29sIGFkZGVkQmxvY2tzID0gZmFsc2U7CisKKyAgICAgICAgZm9yIChCYXNpY0Js
b2NrKiBibG9jayA6IG1fY29kZSkgeworICAgICAgICAgICAgdW5zaWduZWQgdGVybWluYWxJbmRl
eCA9IGJsb2NrLT5zaXplKCk7CisgICAgICAgICAgICBib29sIGZvdW5kVGVybWluYWwgPSBmYWxz
ZTsKKyAgICAgICAgICAgIHdoaWxlICh0ZXJtaW5hbEluZGV4LS0pIHsKKyAgICAgICAgICAgICAg
ICBpZiAoYmxvY2stPmF0KHRlcm1pbmFsSW5kZXgpLmlzVGVybWluYWwoKSkgeworICAgICAgICAg
ICAgICAgICAgICBmb3VuZFRlcm1pbmFsID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgQVNTRVJU
X1VOVVNFRChmb3VuZFRlcm1pbmFsLCBmb3VuZFRlcm1pbmFsKTsKKworICAgICAgICAgICAgaWYg
KHRlcm1pbmFsSW5kZXggPT0gYmxvY2stPnNpemUoKSAtIDEpCisgICAgICAgICAgICAgICAgY29u
dGludWU7CisKKyAgICAgICAgICAgIC8vIFRoZXJlIG11c3QgYmUgaW5zdHJ1Y3Rpb25zIGFmdGVy
IHRoZSB0ZXJtaW5hbCBiZWNhdXNlIGl0J3Mgbm90IHRoZSBsYXN0IGluc3RydWN0aW9uLgorICAg
ICAgICAgICAgQVNTRVJUKHRlcm1pbmFsSW5kZXggPCBibG9jay0+c2l6ZSgpIC0gMSk7CisgICAg
ICAgICAgICBWZWN0b3I8SW5zdCwgMT4gaW5zdHNUb01vdmU7CisgICAgICAgICAgICBmb3IgKHVu
c2lnbmVkIGkgPSB0ZXJtaW5hbEluZGV4ICsgMTsgaSA8IGJsb2NrLT5zaXplKCk7IGkrKykKKyAg
ICAgICAgICAgICAgICBpbnN0c1RvTW92ZS5hcHBlbmQoYmxvY2stPmF0KGkpKTsKKyAgICAgICAg
ICAgIFJFTEVBU0VfQVNTRVJUKGluc3RzVG9Nb3ZlLnNpemUoKSk7CisKKyAgICAgICAgICAgIGZv
ciAoRnJlcXVlbnRlZEJsb2NrJiBmcmVxdWVudGVkU3VjY2Vzc29yIDogYmxvY2stPnN1Y2Nlc3Nv
cnMoKSkgeworICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sqIHN1Y2Nlc3NvciA9IGZyZXF1ZW50
ZWRTdWNjZXNzb3IuYmxvY2soKTsKKyAgICAgICAgICAgICAgICAvLyBJZiBzdWNjZXNzb3IncyBv
bmx5IHByZWRlY2Vzc29yIGlzIGJsb2NrLCB3ZSBjYW4gcGxhbnQgdGhlIHNwaWxsIGluc2lkZQor
ICAgICAgICAgICAgICAgIC8vIHRoZSBzdWNjZXNzb3IuIE90aGVyd2lzZSwgd2UgbXVzdCBzcGxp
dCB0aGUgY3JpdGljYWwgZWRnZSBhbmQgY3JlYXRlCisgICAgICAgICAgICAgICAgLy8gYSBuZXcg
YmxvY2sgZm9yIHRoZSBzcGlsbC4KKyAgICAgICAgICAgICAgICBpZiAoc3VjY2Vzc29yLT5udW1Q
cmVkZWNlc3NvcnMoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGluc2VydGlvblNldC5p
bnNlcnRJbnN0cygwLCBpbnN0c1RvTW92ZSk7CisgICAgICAgICAgICAgICAgICAgIGluc2VydGlv
blNldC5leGVjdXRlKHN1Y2Nlc3Nvcik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgICAgICAgICAgICAgYWRkZWRCbG9ja3MgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAv
LyBGSVhNRTogV2UgcHJvYmFibHkgd2FudCBiZXR0ZXIgYmxvY2sgb3JkZXJpbmcgaGVyZS4KKyAg
ICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayogbmV3QmxvY2sgPSBtX2NvZGUuYWRkQmxvY2so
KTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBJbnN0JiBpbnN0IDogaW5zdHNUb01v
dmUpCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdCbG9jay0+YXBwZW5kSW5zdChpbnN0KTsK
KyAgICAgICAgICAgICAgICAgICAgbmV3QmxvY2stPmFwcGVuZEluc3QoSW5zdChKdW1wLCBpbnN0
c1RvTW92ZS5sYXN0KCkub3JpZ2luKSk7CisgICAgICAgICAgICAgICAgICAgIG5ld0Jsb2NrLT5z
dWNjZXNzb3JzKCkuYXBwZW5kKHN1Y2Nlc3Nvcik7CisgICAgICAgICAgICAgICAgICAgIGZyZXF1
ZW50ZWRTdWNjZXNzb3IuYmxvY2soKSA9IG5ld0Jsb2NrOworICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgYmxvY2stPnJlc2l6ZSh0ZXJtaW5hbEluZGV4ICsg
MSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYWRkZWRCbG9ja3MpCisgICAgICAgICAgICBt
X2NvZGUucmVzZXRSZWFjaGFiaWxpdHkoKTsKKyAgICB9CisKKyAgICBDb2RlJiBtX2NvZGU7Cisg
ICAgVG1wV2lkdGggbV90bXBXaWR0aDsKKyAgICBVc2VDb3VudHM8VG1wPiBtX3VzZUNvdW50czsK
KyAgICB1bnNpZ25lZCBtX251bUl0ZXJhdGlvbnMgeyAwIH07Cit9OworCit9IC8vIGFub255bW91
cyBuYW1lc3BhY2UKKwordm9pZCBpdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZyhDb2RlJiBjb2Rl
KQoreworICAgIFBoYXNlU2NvcGUgcGhhc2VTY29wZShjb2RlLCAiaXRlcmF0ZWRSZWdpc3RlckNv
YWxlc2NpbmciKTsKKyAgICAKKyAgICBJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZyBpdGVyYXRl
ZFJlZ2lzdGVyQ29hbGVzY2luZyhjb2RlKTsKKyAgICBpdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2lu
Zy5ydW4oKTsKK30KKworfSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCisjZW5kaWYg
Ly8gRU5BQkxFKEIzX0pJVCkKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWly
UmVnaXN0ZXJBbGxvY2F0b3IuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9iMy9haXIvQWlyUmVnaXN0ZXJBbGxvY2F0b3IuY3BwCShyZXZpc2lvbiAyMTI2NjYpCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclJlZ2lzdGVyQWxsb2NhdG9yLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMjQsNyArMjQsNyBAQAogICovCiAKICNpbmNsdWRlICJjb25maWcuaCIK
LSNpbmNsdWRlICJBaXJJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5oIgorI2luY2x1ZGUgIkFp
clJlZ2lzdGVyQWxsb2NhdG9yLmgiCiAKICNpZiBFTkFCTEUoQjNfSklUKQogCkBAIC00OSwxMyAr
NDksMTUgQEAgYm9vbCByZXBvcnRTdGF0cyA9IGZhbHNlOwogCiAvLyBUaGUgQWJzdHJhY3RDb2xv
cmluZ0FsbG9jYXRvciBkZWZpbmVzIGFsbCB0aGUgY29kZSB0aGF0IGlzIGluZGVwZW5kYW50CiAv
LyBmcm9tIHRoZSB0eXBlIG9yIHJlZ2lzdGVyIGFuZCBjYW4gYmUgc2hhcmVkIHdoZW4gYWxsb2Nh
dGluZyByZWdpc3RlcnMuCi10ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleFR5cGU+Cit0ZW1wbGF0ZTx0
eXBlbmFtZSBJbmRleFR5cGUsIHR5cGVuYW1lIFRtcE1hcHBlcj4KIGNsYXNzIEFic3RyYWN0Q29s
b3JpbmdBbGxvY2F0b3IgewogcHVibGljOgotICAgIEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0b3Io
Y29uc3QgVmVjdG9yPFJlZz4mIHJlZ3NJblByaW9yaXR5T3JkZXIsIEluZGV4VHlwZSBsYXN0UHJl
Y29sb3JlZFJlZ2lzdGVySW5kZXgsIHVuc2lnbmVkIHRtcEFycmF5U2l6ZSwgY29uc3QgSGFzaFNl
dDx1bnNpZ25lZD4mIHVuc3BpbGxhYmxlVG1wKQorICAgIEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0
b3IoQ29kZSYgY29kZSwgY29uc3QgVmVjdG9yPFJlZz4mIHJlZ3NJblByaW9yaXR5T3JkZXIsIElu
ZGV4VHlwZSBsYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXgsIHVuc2lnbmVkIHRtcEFycmF5U2l6
ZSwgY29uc3QgSGFzaFNldDx1bnNpZ25lZD4mIHVuc3BpbGxhYmxlVG1wcywgY29uc3QgVXNlQ291
bnRzPFRtcD4mIHVzZUNvdW50cykKICAgICAgICAgOiBtX3JlZ3NJblByaW9yaXR5T3JkZXIocmVn
c0luUHJpb3JpdHlPcmRlcikKICAgICAgICAgLCBtX2xhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRl
eChsYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXgpCi0gICAgICAgICwgbV91bnNwaWxsYWJsZVRt
cHModW5zcGlsbGFibGVUbXApCisgICAgICAgICwgbV91bnNwaWxsYWJsZVRtcHModW5zcGlsbGFi
bGVUbXBzKQorICAgICAgICAsIG1fdXNlQ291bnRzKHVzZUNvdW50cykKKyAgICAgICAgLCBtX2Nv
ZGUoY29kZSkKICAgICB7CiAgICAgICAgIGZvciAoUmVnIHJlZyA6IG1fcmVnc0luUHJpb3JpdHlP
cmRlcikKICAgICAgICAgICAgIG1fbXV0YWJsZVJlZ3Muc2V0KHJlZyk7CkBAIC02Niw5ICs2OCwx
MyBAQCBwdWJsaWM6CiAgICAgICAgIG1fbW92ZUxpc3QucmVzaXplKHRtcEFycmF5U2l6ZSk7CiAg
ICAgICAgIG1fY29hbGVzY2VkVG1wcy5maWxsKDAsIHRtcEFycmF5U2l6ZSk7CiAgICAgICAgIG1f
aXNPblNlbGVjdFN0YWNrLmVuc3VyZVNpemUodG1wQXJyYXlTaXplKTsKKyAgICAgICAgbV9zcGls
bFdvcmtsaXN0LmVuc3VyZVNpemUodG1wQXJyYXlTaXplKTsKICAgICB9CiAKIHByb3RlY3RlZDoK
KworICAgIHVuc2lnbmVkIHJlZ2lzdGVyQ291bnQoKSBjb25zdCB7IHJldHVybiBtX3JlZ3NJblBy
aW9yaXR5T3JkZXIuc2l6ZSgpOyB9CisKICAgICBJbmRleFR5cGUgZ2V0QWxpYXMoSW5kZXhUeXBl
IHRtcEluZGV4KSBjb25zdAogICAgIHsKICAgICAgICAgSW5kZXhUeXBlIGFsaWFzID0gdG1wSW5k
ZXg7CkBAIC04NCwyMCArOTAsNiBAQCBwcm90ZWN0ZWQ6CiAgICAgICAgIGFkZEVkZ2VEaXN0aW5j
dChhLCBiKTsKICAgICB9CiAKLSAgICB2b2lkIG1ha2VXb3JrTGlzdCgpCi0gICAgewotICAgICAg
ICBJbmRleFR5cGUgZmlyc3ROb25SZWdJbmRleCA9IG1fbGFzdFByZWNvbG9yZWRSZWdpc3Rlcklu
ZGV4ICsgMTsKLSAgICAgICAgZm9yIChJbmRleFR5cGUgaSA9IGZpcnN0Tm9uUmVnSW5kZXg7IGkg
PCBtX2RlZ3JlZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIGRlZ3JlZSA9
IG1fZGVncmVlc1tpXTsKLSAgICAgICAgICAgIGlmIChkZWdyZWUgPj0gbV9yZWdzSW5Qcmlvcml0
eU9yZGVyLnNpemUoKSkKLSAgICAgICAgICAgICAgICBhZGRUb1NwaWxsKGkpOwotICAgICAgICAg
ICAgZWxzZSBpZiAoIW1fbW92ZUxpc3RbaV0uaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIG1f
ZnJlZXplV29ya2xpc3QuYWRkKGkpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAg
IG1fc2ltcGxpZnlXb3JrbGlzdC5hcHBlbmQoaSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICB2
b2lkIGFkZFRvU3BpbGwodW5zaWduZWQgdG9TcGlsbCkKICAgICB7CiAgICAgICAgIGlmIChtX3Vu
c3BpbGxhYmxlVG1wcy5jb250YWlucyh0b1NwaWxsKSkKQEAgLTEwNiwxNDcgKzk4LDExIEBAIHBy
b3RlY3RlZDoKICAgICAgICAgbV9zcGlsbFdvcmtsaXN0LmFkZCh0b1NwaWxsKTsKICAgICB9CiAK
LSAgICAvLyBMb3ctZGVncmVlIHZlcnRleCBjYW4gYWx3YXlzIGJlIGNvbG9yZWQ6IGp1c3QgcGlj
ayBhbnkgb2YgdGhlIGNvbG9yIHRha2VuIGJ5IGFueQotICAgIC8vIG90aGVyIGFkamFjZW50IHZl
cmljZXMuCi0gICAgLy8gVGhlICJTaW1wbGlmeSIgcGhhc2UgdGFrZXMgYSBsb3ctZGVncmVlIG91
dCBvZiB0aGUgaW50ZXJmZXJlbmNlIGdyYXBoIHRvIHNpbXBsaWZ5IGl0LgotICAgIHZvaWQgc2lt
cGxpZnkoKQotICAgIHsKLSAgICAgICAgSW5kZXhUeXBlIGxhc3RJbmRleCA9IG1fc2ltcGxpZnlX
b3JrbGlzdC50YWtlTGFzdCgpOwotCi0gICAgICAgIEFTU0VSVCghbV9zZWxlY3RTdGFjay5jb250
YWlucyhsYXN0SW5kZXgpKTsKLSAgICAgICAgQVNTRVJUKCFtX2lzT25TZWxlY3RTdGFjay5nZXQo
bGFzdEluZGV4KSk7Ci0gICAgICAgIG1fc2VsZWN0U3RhY2suYXBwZW5kKGxhc3RJbmRleCk7Ci0g
ICAgICAgIG1faXNPblNlbGVjdFN0YWNrLnF1aWNrU2V0KGxhc3RJbmRleCk7Ci0KLSAgICAgICAg
Zm9yRWFjaEFkamFjZW50KGxhc3RJbmRleCwgW3RoaXNdKEluZGV4VHlwZSBhZGphY2VudFRtcElu
ZGV4KSB7Ci0gICAgICAgICAgICBkZWNyZW1lbnREZWdyZWUoYWRqYWNlbnRUbXBJbmRleCk7Ci0g
ICAgICAgIH0pOwotICAgIH0KLQotICAgIHZvaWQgZnJlZXplKCkKLSAgICB7Ci0gICAgICAgIElu
ZGV4VHlwZSB2aWN0aW1JbmRleCA9IG1fZnJlZXplV29ya2xpc3QudGFrZUFueSgpOwotICAgICAg
ICBBU1NFUlRfV0lUSF9NRVNTQUdFKGdldEFsaWFzKHZpY3RpbUluZGV4KSA9PSB2aWN0aW1JbmRl
eCwgImNvYWxlc2NlKCkgc2hvdWxkIG5vdCBsZWF2ZSBhbGlhc2VkIFRtcCBpbiB0aGUgd29ya2xp
c3QuIik7Ci0gICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5hcHBlbmQodmljdGltSW5kZXgpOwot
ICAgICAgICBmcmVlemVNb3Zlcyh2aWN0aW1JbmRleCk7Ci0gICAgfQotCi0gICAgdm9pZCBmcmVl
emVNb3ZlcyhJbmRleFR5cGUgdG1wSW5kZXgpCi0gICAgewotICAgICAgICBmb3JFYWNoTm9kZU1v
dmVzKHRtcEluZGV4LCBbdGhpcywgdG1wSW5kZXhdIChJbmRleFR5cGUgbW92ZUluZGV4KSB7Ci0g
ICAgICAgICAgICBpZiAoIW1fYWN0aXZlTW92ZXMucXVpY2tDbGVhcihtb3ZlSW5kZXgpKQotICAg
ICAgICAgICAgICAgIG1fd29ya2xpc3RNb3Zlcy50YWtlTW92ZShtb3ZlSW5kZXgpOwotCi0gICAg
ICAgICAgICBjb25zdCBNb3ZlT3BlcmFuZHMmIG1vdmVPcGVyYW5kcyA9IG1fY29hbGVzY2luZ0Nh
bmRpZGF0ZXNbbW92ZUluZGV4XTsKLSAgICAgICAgICAgIEluZGV4VHlwZSBzcmNUbXBJbmRleCA9
IG1vdmVPcGVyYW5kcy5zcmNJbmRleDsKLSAgICAgICAgICAgIEluZGV4VHlwZSBkc3RUbXBJbmRl
eCA9IG1vdmVPcGVyYW5kcy5kc3RJbmRleDsKLQotICAgICAgICAgICAgSW5kZXhUeXBlIG9yaWdp
bmFsT3RoZXJUbXAgPSBzcmNUbXBJbmRleCAhPSB0bXBJbmRleCA/IHNyY1RtcEluZGV4IDogZHN0
VG1wSW5kZXg7Ci0gICAgICAgICAgICBJbmRleFR5cGUgb3RoZXJUbXBJbmRleCA9IGdldEFsaWFz
KG9yaWdpbmFsT3RoZXJUbXApOwotICAgICAgICAgICAgaWYgKG1fZGVncmVlc1tvdGhlclRtcElu
ZGV4XSA8IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkgJiYgIWlzTW92ZVJlbGF0ZWQob3Ro
ZXJUbXBJbmRleCkpIHsKLSAgICAgICAgICAgICAgICBpZiAobV9mcmVlemVXb3JrbGlzdC5yZW1v
dmUob3RoZXJUbXBJbmRleCkpCi0gICAgICAgICAgICAgICAgICAgIG1fc2ltcGxpZnlXb3JrbGlz
dC5hcHBlbmQob3RoZXJUbXBJbmRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAg
IH0KLQotICAgIHZvaWQgY29hbGVzY2UoKQotICAgIHsKLSAgICAgICAgdW5zaWduZWQgbW92ZUlu
ZGV4ID0gbV93b3JrbGlzdE1vdmVzLnRha2VMYXN0TW92ZSgpOwotICAgICAgICBjb25zdCBNb3Zl
T3BlcmFuZHMmIG1vdmVPcGVyYW5kcyA9IG1fY29hbGVzY2luZ0NhbmRpZGF0ZXNbbW92ZUluZGV4
XTsKLSAgICAgICAgSW5kZXhUeXBlIHUgPSBnZXRBbGlhcyhtb3ZlT3BlcmFuZHMuc3JjSW5kZXgp
OwotICAgICAgICBJbmRleFR5cGUgdiA9IGdldEFsaWFzKG1vdmVPcGVyYW5kcy5kc3RJbmRleCk7
Ci0KLSAgICAgICAgaWYgKGlzUHJlY29sb3JlZCh2KSkKLSAgICAgICAgICAgIHN0ZDo6c3dhcCh1
LCB2KTsKLQotICAgICAgICBpZiAodHJhY2VEZWJ1ZykKLSAgICAgICAgICAgIGRhdGFMb2coIkNv
YWxlc2NpbmcgbW92ZSBhdCBpbmRleCAiLCBtb3ZlSW5kZXgsICIgdSA9ICIsIHUsICIgdiA9ICIs
IHYsICJcbiIpOwotCi0gICAgICAgIGlmICh1ID09IHYpIHsKLSAgICAgICAgICAgIGFkZFdvcmtM
aXN0KHUpOwotCi0gICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKLSAgICAgICAgICAgICAgICBk
YXRhTG9nKCIgICAgQ29hbGVzY2VkXG4iKTsKLSAgICAgICAgfSBlbHNlIGlmIChpc1ByZWNvbG9y
ZWQodikKLSAgICAgICAgICAgIHx8IG1faW50ZXJmZXJlbmNlRWRnZXMuY29udGFpbnMoSW50ZXJm
ZXJlbmNlRWRnZSh1LCB2KSkKLSAgICAgICAgICAgIHx8ICh1ID09IG1fZnJhbWVQb2ludGVySW5k
ZXggJiYgbV9pbnRlcmZlcmVzV2l0aEZyYW1lUG9pbnRlci5xdWlja0dldCh2KSkpIHsKLSAgICAg
ICAgICAgIGFkZFdvcmtMaXN0KHUpOwotICAgICAgICAgICAgYWRkV29ya0xpc3Qodik7Ci0KLSAg
ICAgICAgICAgIGlmICh0cmFjZURlYnVnKQotICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICBD
b25zdHJhaW5lZFxuIik7Ci0gICAgICAgIH0gZWxzZSBpZiAoY2FuQmVTYWZlbHlDb2FsZXNjZWQo
dSwgdikpIHsKLSAgICAgICAgICAgIGNvbWJpbmUodSwgdik7Ci0gICAgICAgICAgICBhZGRXb3Jr
TGlzdCh1KTsKLSAgICAgICAgICAgIG1faGFzQ29hbGVzY2VkTm9uVHJpdmlhbE1vdmUgPSB0cnVl
OwotCi0gICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKLSAgICAgICAgICAgICAgICBkYXRhTG9n
KCIgICAgU2FmZSBDb2FsZXNjaW5nXG4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAg
IG1fYWN0aXZlTW92ZXMucXVpY2tTZXQobW92ZUluZGV4KTsKLQotICAgICAgICAgICAgaWYgKHRy
YWNlRGVidWcpCi0gICAgICAgICAgICAgICAgZGF0YUxvZygiICAgIEZhaWxlZCBjb2FsZXNjaW5n
LCBhZGRlZCB0byBhY3RpdmUgbW92ZXMuXG4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZv
aWQgYXNzaWduQ29sb3JzKCkKKyAgICBib29sIGlzUHJlY29sb3JlZChJbmRleFR5cGUgdG1wSW5k
ZXgpCiAgICAgewotICAgICAgICBBU1NFUlQobV9zaW1wbGlmeVdvcmtsaXN0LmlzRW1wdHkoKSk7
Ci0gICAgICAgIEFTU0VSVChtX3dvcmtsaXN0TW92ZXMuaXNFbXB0eSgpKTsKLSAgICAgICAgQVNT
RVJUKG1fZnJlZXplV29ya2xpc3QuaXNFbXB0eSgpKTsKLSAgICAgICAgQVNTRVJUKG1fc3BpbGxX
b3JrbGlzdC5pc0VtcHR5KCkpOwotCi0gICAgICAgIC8vIFJlY2xhaW0gYXMgbXVjaCBtZW1vcnkg
YXMgcG9zc2libGUuCi0gICAgICAgIG1faW50ZXJmZXJlbmNlRWRnZXMuY2xlYXIoKTsKLSAgICAg
ICAgbV9kZWdyZWVzLmNsZWFyKCk7Ci0gICAgICAgIG1fbW92ZUxpc3QuY2xlYXIoKTsKLSAgICAg
ICAgbV93b3JrbGlzdE1vdmVzLmNsZWFyKCk7Ci0gICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5j
bGVhcigpOwotICAgICAgICBtX3NwaWxsV29ya2xpc3QuY2xlYXIoKTsKLSAgICAgICAgbV9mcmVl
emVXb3JrbGlzdC5jbGVhcigpOwotCi0gICAgICAgIC8vIFRyeSB0byBjb2xvciB0aGUgVG1wIG9u
IHRoZSBzdGFjay4KLSAgICAgICAgbV9jb2xvcmVkVG1wLnJlc2l6ZShtX2FkamFjZW5jeUxpc3Qu
c2l6ZSgpKTsKLQotICAgICAgICB3aGlsZSAoIW1fc2VsZWN0U3RhY2suaXNFbXB0eSgpKSB7Ci0g
ICAgICAgICAgICB1bnNpZ25lZCB0bXBJbmRleCA9IG1fc2VsZWN0U3RhY2sudGFrZUxhc3QoKTsK
LSAgICAgICAgICAgIEFTU0VSVCghaXNQcmVjb2xvcmVkKHRtcEluZGV4KSk7Ci0gICAgICAgICAg
ICBBU1NFUlQoIW1fY29sb3JlZFRtcFt0bXBJbmRleF0pOwotCi0gICAgICAgICAgICBSZWdpc3Rl
clNldCBjb2xvcmVkUmVnaXN0ZXJzOwotICAgICAgICAgICAgZm9yIChJbmRleFR5cGUgYWRqYWNl
bnRUbXBJbmRleCA6IG1fYWRqYWNlbmN5TGlzdFt0bXBJbmRleF0pIHsKLSAgICAgICAgICAgICAg
ICBJbmRleFR5cGUgYWxpYXNUbXBJbmRleCA9IGdldEFsaWFzKGFkamFjZW50VG1wSW5kZXgpOwot
ICAgICAgICAgICAgICAgIFJlZyByZWcgPSBtX2NvbG9yZWRUbXBbYWxpYXNUbXBJbmRleF07Ci0K
LSAgICAgICAgICAgICAgICBBU1NFUlQoIWlzUHJlY29sb3JlZChhbGlhc1RtcEluZGV4KSB8fCAo
aXNQcmVjb2xvcmVkKGFsaWFzVG1wSW5kZXgpICYmIHJlZykpOwotCi0gICAgICAgICAgICAgICAg
aWYgKHJlZykKLSAgICAgICAgICAgICAgICAgICAgY29sb3JlZFJlZ2lzdGVycy5zZXQocmVnKTsK
LSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYm9vbCBjb2xvckFzc2lnbmVkID0gZmFsc2U7
Ci0gICAgICAgICAgICBmb3IgKFJlZyByZWcgOiBtX3JlZ3NJblByaW9yaXR5T3JkZXIpIHsKLSAg
ICAgICAgICAgICAgICBpZiAoIWNvbG9yZWRSZWdpc3RlcnMuZ2V0KHJlZykpIHsKLSAgICAgICAg
ICAgICAgICAgICAgbV9jb2xvcmVkVG1wW3RtcEluZGV4XSA9IHJlZzsKLSAgICAgICAgICAgICAg
ICAgICAgY29sb3JBc3NpZ25lZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFjb2xv
ckFzc2lnbmVkKQotICAgICAgICAgICAgICAgIG1fc3BpbGxlZFRtcHMuYXBwZW5kKHRtcEluZGV4
KTsKLSAgICAgICAgfQotICAgICAgICBtX3NlbGVjdFN0YWNrLmNsZWFyKCk7Ci0KLSAgICAgICAg
aWYgKG1fc3BpbGxlZFRtcHMuaXNFbXB0eSgpKQotICAgICAgICAgICAgbV9jb2FsZXNjZWRUbXBz
QXRTcGlsbC5jbGVhcigpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtX2NvbG9yZWRUbXAu
Y2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIHRtcEluZGV4IDw9IG1fbGFzdFByZWNvbG9yZWRSZWdp
c3RlckluZGV4OwogICAgIH0KIAotcHJpdmF0ZToKICAgICB2b2lkIGluaXRpYWxpemVEZWdyZWVz
KHVuc2lnbmVkIHRtcEFycmF5U2l6ZSkKICAgICB7CiAgICAgICAgIG1fZGVncmVlcy5yZXNpemUo
dG1wQXJyYXlTaXplKTsKQEAgLTI2Miw3ICsxMTgsOCBAQCBwcml2YXRlOgogICAgIHZvaWQgYWRk
RWRnZURpc3RpbmN0KEluZGV4VHlwZSBhLCBJbmRleFR5cGUgYikKICAgICB7CiAgICAgICAgIEFT
U0VSVChhICE9IGIpOwotICAgICAgICBpZiAobV9pbnRlcmZlcmVuY2VFZGdlcy5hZGQoSW50ZXJm
ZXJlbmNlRWRnZShhLCBiKSkuaXNOZXdFbnRyeSkgeworICAgICAgICBib29sIGlzTmV3RWRnZSA9
IGFkZEludGVyZmVyZW5jZUVkZ2UoSW50ZXJmZXJlbmNlRWRnZShhLCBiKSk7CisgICAgICAgIGlm
IChpc05ld0VkZ2UpIHsKICAgICAgICAgICAgIGlmICghaXNQcmVjb2xvcmVkKGEpKSB7CiAgICAg
ICAgICAgICAgICAgQVNTRVJUKCFtX2FkamFjZW5jeUxpc3RbYV0uY29udGFpbnMoYikpOwogICAg
ICAgICAgICAgICAgIG1fYWRqYWNlbmN5TGlzdFthXS5hcHBlbmQoYik7CkBAIC0yNzcsMjYgKzEz
NCwxMSBAQCBwcml2YXRlOgogICAgICAgICB9CiAgICAgfQogCi0gICAgdm9pZCBkZWNyZW1lbnRE
ZWdyZWUoSW5kZXhUeXBlIHRtcEluZGV4KQotICAgIHsKLSAgICAgICAgQVNTRVJUKG1fZGVncmVl
c1t0bXBJbmRleF0pOwotCi0gICAgICAgIHVuc2lnbmVkIG9sZERlZ3JlZSA9IG1fZGVncmVlc1t0
bXBJbmRleF0tLTsKLSAgICAgICAgaWYgKG9sZERlZ3JlZSA9PSBtX3JlZ3NJblByaW9yaXR5T3Jk
ZXIuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBlbmFibGVNb3Zlc09uVmFsdWVBbmRBZGphY2VudHMo
dG1wSW5kZXgpOwotICAgICAgICAgICAgbV9zcGlsbFdvcmtsaXN0LnJlbW92ZSh0bXBJbmRleCk7
Ci0gICAgICAgICAgICBpZiAoaXNNb3ZlUmVsYXRlZCh0bXBJbmRleCkpCi0gICAgICAgICAgICAg
ICAgbV9mcmVlemVXb3JrbGlzdC5hZGQodG1wSW5kZXgpOwotICAgICAgICAgICAgZWxzZQotICAg
ICAgICAgICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5hcHBlbmQodG1wSW5kZXgpOwotICAgICAg
ICB9Ci0gICAgfQotCi0KICAgICBib29sIGFkZEVkZ2VEaXN0aW5jdFdpdGhvdXREZWdyZWVDaGFu
Z2UoSW5kZXhUeXBlIGEsIEluZGV4VHlwZSBiKQogICAgIHsKICAgICAgICAgQVNTRVJUKGEgIT0g
Yik7Ci0gICAgICAgIGlmIChtX2ludGVyZmVyZW5jZUVkZ2VzLmFkZChJbnRlcmZlcmVuY2VFZGdl
KGEsIGIpKS5pc05ld0VudHJ5KSB7CisgICAgICAgIGJvb2wgaXNOZXdFZGdlID0gYWRkSW50ZXJm
ZXJlbmNlRWRnZShJbnRlcmZlcmVuY2VFZGdlKGEsIGIpKTsKKyAgICAgICAgaWYgKGlzTmV3RWRn
ZSkgewogICAgICAgICAgICAgaWYgKCFpc1ByZWNvbG9yZWQoYSkpIHsKICAgICAgICAgICAgICAg
ICBBU1NFUlQoIW1fYWRqYWNlbmN5TGlzdFthXS5jb250YWlucyhiKSk7CiAgICAgICAgICAgICAg
ICAgbV9hZGphY2VuY3lMaXN0W2FdLmFwcGVuZChiKTsKQEAgLTMxMSwxNSArMTUzLDYgQEAgcHJp
dmF0ZToKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGJvb2wgaXNNb3ZlUmVs
YXRlZChJbmRleFR5cGUgdG1wSW5kZXgpCi0gICAgewotICAgICAgICBmb3IgKHVuc2lnbmVkIG1v
dmVJbmRleCA6IG1fbW92ZUxpc3RbdG1wSW5kZXhdKSB7Ci0gICAgICAgICAgICBpZiAobV9hY3Rp
dmVNb3Zlcy5xdWlja0dldChtb3ZlSW5kZXgpIHx8IG1fd29ya2xpc3RNb3Zlcy5jb250YWlucyht
b3ZlSW5kZXgpKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdGlv
bj4KICAgICB2b2lkIGZvckVhY2hBZGphY2VudChJbmRleFR5cGUgdG1wSW5kZXgsIEZ1bmN0aW9u
IGZ1bmN0aW9uKQogICAgIHsKQEAgLTMzMSw4MCArMTY0LDEyIEBAIHByaXZhdGU6CiAKICAgICBi
b29sIGhhc0JlZW5TaW1wbGlmaWVkKEluZGV4VHlwZSB0bXBJbmRleCkKICAgICB7Ci0gICAgICAg
IHJldHVybiBtX2lzT25TZWxlY3RTdGFjay5xdWlja0dldCh0bXBJbmRleCkgfHwgISFtX2NvYWxl
c2NlZFRtcHNbdG1wSW5kZXhdOwotICAgIH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0
aW9uPgotICAgIHZvaWQgZm9yRWFjaE5vZGVNb3ZlcyhJbmRleFR5cGUgdG1wSW5kZXgsIEZ1bmN0
aW9uIGZ1bmN0aW9uKQotICAgIHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBtb3ZlSW5kZXggOiBt
X21vdmVMaXN0W3RtcEluZGV4XSkgewotICAgICAgICAgICAgaWYgKG1fYWN0aXZlTW92ZXMucXVp
Y2tHZXQobW92ZUluZGV4KSB8fCBtX3dvcmtsaXN0TW92ZXMuY29udGFpbnMobW92ZUluZGV4KSkK
LSAgICAgICAgICAgICAgICBmdW5jdGlvbihtb3ZlSW5kZXgpOwotICAgICAgICB9Ci0gICAgfQot
Ci0gICAgdm9pZCBlbmFibGVNb3Zlc09uVmFsdWUoSW5kZXhUeXBlIHRtcEluZGV4KQotICAgIHsK
LSAgICAgICAgZm9yICh1bnNpZ25lZCBtb3ZlSW5kZXggOiBtX21vdmVMaXN0W3RtcEluZGV4XSkg
ewotICAgICAgICAgICAgaWYgKG1fYWN0aXZlTW92ZXMucXVpY2tDbGVhcihtb3ZlSW5kZXgpKQot
ICAgICAgICAgICAgICAgIG1fd29ya2xpc3RNb3Zlcy5yZXR1cm5Nb3ZlKG1vdmVJbmRleCk7Ci0g
ICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGVuYWJsZU1vdmVzT25WYWx1ZUFuZEFkamFjZW50
cyhJbmRleFR5cGUgdG1wSW5kZXgpCi0gICAgewotICAgICAgICBlbmFibGVNb3Zlc09uVmFsdWUo
dG1wSW5kZXgpOwotCi0gICAgICAgIGZvckVhY2hBZGphY2VudCh0bXBJbmRleCwgW3RoaXNdIChJ
bmRleFR5cGUgYWRqYWNlbnRUbXBJbmRleCkgewotICAgICAgICAgICAgZW5hYmxlTW92ZXNPblZh
bHVlKGFkamFjZW50VG1wSW5kZXgpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBib29sIGlz
UHJlY29sb3JlZChJbmRleFR5cGUgdG1wSW5kZXgpCi0gICAgewotICAgICAgICByZXR1cm4gdG1w
SW5kZXggPD0gbV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXg7Ci0gICAgfQotCi0gICAgdm9p
ZCBhZGRXb3JrTGlzdChJbmRleFR5cGUgdG1wSW5kZXgpCi0gICAgewotICAgICAgICBpZiAoIWlz
UHJlY29sb3JlZCh0bXBJbmRleCkgJiYgbV9kZWdyZWVzW3RtcEluZGV4XSA8IG1fcmVnc0luUHJp
b3JpdHlPcmRlci5zaXplKCkgJiYgIWlzTW92ZVJlbGF0ZWQodG1wSW5kZXgpKSB7Ci0gICAgICAg
ICAgICBtX2ZyZWV6ZVdvcmtsaXN0LnJlbW92ZSh0bXBJbmRleCk7Ci0gICAgICAgICAgICBtX3Np
bXBsaWZ5V29ya2xpc3QuYXBwZW5kKHRtcEluZGV4KTsKKyAgICAgICAgaWYgKCFBU1NFUlRfRElT
QUJMRUQpIHsKKyAgICAgICAgICAgIGlmICghIW1fY29hbGVzY2VkVG1wc1t0bXBJbmRleF0pCisg
ICAgICAgICAgICAgICAgQVNTRVJUKGdldEFsaWFzKHRtcEluZGV4KSAhPSB0bXBJbmRleCk7CiAg
ICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGNvbWJpbmUoSW5kZXhUeXBlIHUsIEluZGV4VHlw
ZSB2KQotICAgIHsKLSAgICAgICAgaWYgKCFtX2ZyZWV6ZVdvcmtsaXN0LnJlbW92ZSh2KSkKLSAg
ICAgICAgICAgIG1fc3BpbGxXb3JrbGlzdC5yZW1vdmUodik7Ci0KLSAgICAgICAgQVNTRVJUKCFt
X2NvYWxlc2NlZFRtcHNbdl0pOwotICAgICAgICBtX2NvYWxlc2NlZFRtcHNbdl0gPSB1OwotCi0g
ICAgICAgIGF1dG8mIHZNb3ZlcyA9IG1fbW92ZUxpc3Rbdl07Ci0gICAgICAgIG1fbW92ZUxpc3Rb
dV0uYWRkKHZNb3Zlcy5iZWdpbigpLCB2TW92ZXMuZW5kKCkpOwotCi0gICAgICAgIGZvckVhY2hB
ZGphY2VudCh2LCBbdGhpcywgdV0gKEluZGV4VHlwZSBhZGphY2VudFRtcEluZGV4KSB7Ci0gICAg
ICAgICAgICBpZiAoYWRkRWRnZURpc3RpbmN0V2l0aG91dERlZ3JlZUNoYW5nZShhZGphY2VudFRt
cEluZGV4LCB1KSkgewotICAgICAgICAgICAgICAgIC8vIElmIHdlIGFkZGVkIGEgbmV3IGVkZ2Ug
YmV0d2VlbiB0aGUgYWRqYWNlbnRUbXAgYW5kIHUsIGl0IHJlcGxhY2VzIHRoZSBlZGdlCi0gICAg
ICAgICAgICAgICAgLy8gdGhhdCBleGlzdGVkIHdpdGggdi4KLSAgICAgICAgICAgICAgICAvLyBU
aGUgZGVncmVlIG9mIGFkamFjZW50VG1wIHJlbWFpbnMgdGhlIHNhbWUgc2luY2UgdGhlIGVkZ2Ug
anVzdCBjaGFuZ2VkIGZyb20gdSB0byB2LgotICAgICAgICAgICAgICAgIC8vIEFsbCB3ZSBuZWVk
IHRvIGRvIGlzIHVwZGF0ZSB0aGUgZGVncmVlIG9mIHUuCi0gICAgICAgICAgICAgICAgaWYgKCFp
c1ByZWNvbG9yZWQodSkpCi0gICAgICAgICAgICAgICAgICAgIG1fZGVncmVlc1t1XSsrOwotICAg
ICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB3ZSBhbHJlYWR5IGhhZCBh
biBlZGdlIGJldHdlZW4gdGhlIGFkamFjZW50VG1wIGFuZCB1LCB0aGUgZGVncmVlIG9mIHUKLSAg
ICAgICAgICAgICAgICAvLyBpcyBhbHJlYWR5IGNvcnJlY3QuIFRoZSBkZWdyZWUgb2YgdGhlIGFk
amFjZW50VG1wIGRlY3JlYXNlcyBzaW5jZSB0aGUgZWRnZQotICAgICAgICAgICAgICAgIC8vIHdp
dGggdiBpcyBubyBsb25nZXIgcmVsZXZhbnQgKHdlIGNhbiB0aGluayBvZiBpdCBhcyBtZXJnZWQg
d2l0aCB0aGUgZWRnZSB3aXRoIHUpLgotICAgICAgICAgICAgICAgIGRlY3JlbWVudERlZ3JlZShh
ZGphY2VudFRtcEluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAg
aWYgKG1fZnJhbWVQb2ludGVySW5kZXggJiYgbV9pbnRlcmZlcmVzV2l0aEZyYW1lUG9pbnRlci5x
dWlja0dldCh2KSkKLSAgICAgICAgICAgIG1faW50ZXJmZXJlc1dpdGhGcmFtZVBvaW50ZXIucXVp
Y2tTZXQodSk7CiAKLSAgICAgICAgaWYgKG1fZGVncmVlc1t1XSA+PSBtX3JlZ3NJblByaW9yaXR5
T3JkZXIuc2l6ZSgpICYmIG1fZnJlZXplV29ya2xpc3QucmVtb3ZlKHUpKQotICAgICAgICAgICAg
YWRkVG9TcGlsbCh1KTsKKyAgICAgICAgcmV0dXJuIG1faXNPblNlbGVjdFN0YWNrLnF1aWNrR2V0
KHRtcEluZGV4KSB8fCAhIW1fY29hbGVzY2VkVG1wc1t0bXBJbmRleF07CiAgICAgfQogCiAgICAg
Ym9vbCBjYW5CZVNhZmVseUNvYWxlc2NlZChJbmRleFR5cGUgdSwgSW5kZXhUeXBlIHYpCkBAIC00
MjksNyArMTk0LDcgQEAgcHJpdmF0ZToKICAgICAgICAgY29uc3QgYXV0byYgYWRqYWNlbnRzT2ZV
ID0gbV9hZGphY2VuY3lMaXN0W3VdOwogICAgICAgICBjb25zdCBhdXRvJiBhZGphY2VudHNPZlYg
PSBtX2FkamFjZW5jeUxpc3Rbdl07CiAKLSAgICAgICAgaWYgKGFkamFjZW50c09mVS5zaXplKCkg
KyBhZGphY2VudHNPZlYuc2l6ZSgpIDwgbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKSkgewor
ICAgICAgICBpZiAoYWRqYWNlbnRzT2ZVLnNpemUoKSArIGFkamFjZW50c09mVi5zaXplKCkgPCBy
ZWdpc3RlckNvdW50KCkpIHsKICAgICAgICAgICAgIC8vIFNob3J0Y3V0OiBpZiB0aGUgdG90YWwg
bnVtYmVyIG9mIGFkamFjZW50cyBpcyBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiByZWdpc3Rlciwg
dGhlIGNvbmRpdGlvbiBpcyBhbHdheXMgbWV0LgogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAg
ICAgICAgIH0KQEAgLTQzOSwyMyArMjA0LDIzIEBAIHByaXZhdGU6CiAgICAgICAgIGZvciAoSW5k
ZXhUeXBlIGFkamFjZW50VG1wSW5kZXggOiBhZGphY2VudHNPZlUpIHsKICAgICAgICAgICAgIEFT
U0VSVChhZGphY2VudFRtcEluZGV4ICE9IHYpOwogICAgICAgICAgICAgQVNTRVJUKGFkamFjZW50
VG1wSW5kZXggIT0gdSk7Ci0gICAgICAgICAgICBpZiAoIWhhc0JlZW5TaW1wbGlmaWVkKGFkamFj
ZW50VG1wSW5kZXgpICYmIG1fZGVncmVlc1thZGphY2VudFRtcEluZGV4XSA+PSBtX3JlZ3NJblBy
aW9yaXR5T3JkZXIuc2l6ZSgpKSB7CisgICAgICAgICAgICBpZiAoIWhhc0JlZW5TaW1wbGlmaWVk
KGFkamFjZW50VG1wSW5kZXgpICYmIG1fZGVncmVlc1thZGphY2VudFRtcEluZGV4XSA+PSByZWdp
c3RlckNvdW50KCkpIHsKICAgICAgICAgICAgICAgICBhdXRvIGFkZFJlc3VsdCA9IGhpZ2hPcmRl
ckFkamFjZW50cy5hZGQoYWRqYWNlbnRUbXBJbmRleCk7Ci0gICAgICAgICAgICAgICAgaWYgKGFk
ZFJlc3VsdC5pc05ld0VudHJ5ICYmIGhpZ2hPcmRlckFkamFjZW50cy5zaXplKCkgPj0gbV9yZWdz
SW5Qcmlvcml0eU9yZGVyLnNpemUoKSkKKyAgICAgICAgICAgICAgICBpZiAoYWRkUmVzdWx0Lmlz
TmV3RW50cnkgJiYgaGlnaE9yZGVyQWRqYWNlbnRzLnNpemUoKSA+PSByZWdpc3RlckNvdW50KCkp
CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAg
ICAgfQogICAgICAgICBmb3IgKEluZGV4VHlwZSBhZGphY2VudFRtcEluZGV4IDogYWRqYWNlbnRz
T2ZWKSB7CiAgICAgICAgICAgICBBU1NFUlQoYWRqYWNlbnRUbXBJbmRleCAhPSB1KTsKICAgICAg
ICAgICAgIEFTU0VSVChhZGphY2VudFRtcEluZGV4ICE9IHYpOwotICAgICAgICAgICAgaWYgKCFo
YXNCZWVuU2ltcGxpZmllZChhZGphY2VudFRtcEluZGV4KSAmJiBtX2RlZ3JlZXNbYWRqYWNlbnRU
bXBJbmRleF0gPj0gbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKSkgeworICAgICAgICAgICAg
aWYgKCFoYXNCZWVuU2ltcGxpZmllZChhZGphY2VudFRtcEluZGV4KSAmJiBtX2RlZ3JlZXNbYWRq
YWNlbnRUbXBJbmRleF0gPj0gcmVnaXN0ZXJDb3VudCgpKSB7CiAgICAgICAgICAgICAgICAgYXV0
byBhZGRSZXN1bHQgPSBoaWdoT3JkZXJBZGphY2VudHMuYWRkKGFkamFjZW50VG1wSW5kZXgpOwot
ICAgICAgICAgICAgICAgIGlmIChhZGRSZXN1bHQuaXNOZXdFbnRyeSAmJiBoaWdoT3JkZXJBZGph
Y2VudHMuc2l6ZSgpID49IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkpCisgICAgICAgICAg
ICAgICAgaWYgKGFkZFJlc3VsdC5pc05ld0VudHJ5ICYmIGhpZ2hPcmRlckFkamFjZW50cy5zaXpl
KCkgPj0gcmVnaXN0ZXJDb3VudCgpKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBBU1NFUlQoaGlnaE9yZGVyQWRq
YWNlbnRzLnNpemUoKSA8IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkpOworICAgICAgICBB
U1NFUlQoaGlnaE9yZGVyQWRqYWNlbnRzLnNpemUoKSA8IHJlZ2lzdGVyQ291bnQoKSk7CiAgICAg
ICAgIHJldHVybiB0cnVlOwogICAgIH0KIApAQCAtNDc4LDI0ICsyNDMsMTU4IEBAIHByaXZhdGU6
CiAgICAgICAgIGZvciAodW5zaWduZWQgYWRqYWNlbnRUbXBJbmRleCA6IGFkamFjZW50c09mVikg
ewogICAgICAgICAgICAgaWYgKCFpc1ByZWNvbG9yZWQoYWRqYWNlbnRUbXBJbmRleCkKICAgICAg
ICAgICAgICAgICAmJiAhaGFzQmVlblNpbXBsaWZpZWQoYWRqYWNlbnRUbXBJbmRleCkKLSAgICAg
ICAgICAgICAgICAmJiBtX2RlZ3JlZXNbYWRqYWNlbnRUbXBJbmRleF0gPj0gbV9yZWdzSW5Qcmlv
cml0eU9yZGVyLnNpemUoKQotICAgICAgICAgICAgICAgICYmICFtX2ludGVyZmVyZW5jZUVkZ2Vz
LmNvbnRhaW5zKEludGVyZmVyZW5jZUVkZ2UodSwgYWRqYWNlbnRUbXBJbmRleCkpKQorICAgICAg
ICAgICAgICAgICYmIG1fZGVncmVlc1thZGphY2VudFRtcEluZGV4XSA+PSByZWdpc3RlckNvdW50
KCkKKyAgICAgICAgICAgICAgICAmJiAhaGFzSW50ZXJmZXJlbmNlRWRnZShJbnRlcmZlcmVuY2VF
ZGdlKHUsIGFkamFjZW50VG1wSW5kZXgpKSkKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi1wcm90ZWN0ZWQ6Ci0j
aWYgUExBVEZPUk0oQ09DT0EpCi0jcHJhZ21hIG1hcmsgLQotI2VuZGlmCisgICAgSW5kZXhUeXBl
IHNlbGVjdFNwaWxsKCkKKyAgICB7CisgICAgICAgIGlmICghbV9oYXNTZWxlY3RlZFNwaWxsKSB7
CisgICAgICAgICAgICBtX2hhc1NlbGVjdGVkU3BpbGwgPSB0cnVlOwogCi0gICAgLy8gSW50ZXJm
ZXJlbmNlIGVkZ2VzIGFyZSBub3QgZGlyZWN0ZWQuIEFuIGVkZ2UgYmV0d2VlbiBhbnkgdHdvIFRt
cHMgaXMgcmVwcmVzZW50ZWQKLSAgICAvLyBieSB0aGUgY29uY2F0ZW5hdGVkIHZhbHVlcyBvZiB0
aGUgc21hbGxlc3QgVG1wIGZvbGxvd2VkIGJ5IHRoZSBiaWdnZXIgVG1wLgotICAgIGNsYXNzIElu
dGVyZmVyZW5jZUVkZ2UgewotICAgIHB1YmxpYzoKLSAgICAgICAgSW50ZXJmZXJlbmNlRWRnZSgp
Ci0gICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtX2hhc0NvYWxlc2NlZE5vblRyaXZpYWxNb3Zl
KQorICAgICAgICAgICAgICAgIG1fY29hbGVzY2VkVG1wc0F0U3BpbGwgPSBtX2NvYWxlc2NlZFRt
cHM7CisgICAgICAgIH0KKworICAgICAgICBhdXRvIGl0ZXJhdG9yID0gbV9zcGlsbFdvcmtsaXN0
LmJlZ2luKCk7CisKKyAgICAgICAgUkVMRUFTRV9BU1NFUlRfV0lUSF9NRVNTQUdFKGl0ZXJhdG9y
ICE9IG1fc3BpbGxXb3JrbGlzdC5lbmQoKSwgInNlbGVjdFNwaWxsKCkgY2FsbGVkIHdoZW4gdGhl
cmUgd2FzIG5vIHNwaWxsLiIpOworICAgICAgICBSRUxFQVNFX0FTU0VSVF9XSVRIX01FU1NBR0Uo
IW1fdW5zcGlsbGFibGVUbXBzLmNvbnRhaW5zKCppdGVyYXRvciksICJ0cnlpbmcgdG8gc3BpbGwg
dW5zcGlsbGFibGUgdG1wIik7CisKKyAgICAgICAgLy8gSGlnaGVyIHNjb3JlIG1lYW5zIG1vcmUg
ZGVzaXJhYmxlIHRvIHNwaWxsLiBMb3dlciBzY29yZXMgbWF4aW1pemUgdGhlIGxpa2VsaWhvb2Qg
dGhhdCBhIHRtcAorICAgICAgICAvLyBnZXRzIGEgcmVnaXN0ZXIuCisgICAgICAgIGF1dG8gc2Nv
cmUgPSBbJl0gKFRtcCB0bXApIC0+IGRvdWJsZSB7CisgICAgICAgICAgICAvLyBBaXIgZXhwb3Nl
cyB0aGUgY29uY2VwdCBvZiAiZmFzdCB0bXBzIiwgYW5kIHdlIGludGVycHJldCB0aGF0IHRvIG1l
YW4gdGhhdCB0aGUgdG1wCisgICAgICAgICAgICAvLyBzaG91bGQgYWx3YXlzIGJlIGluIGEgcmVn
aXN0ZXIuCisgICAgICAgICAgICBpZiAobV9jb2RlLmlzRmFzdFRtcCh0bXApKQorICAgICAgICAg
ICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBBbGwgZWxzZSBi
ZWluZyBlcXVhbCwgdGhlIHNjb3JlIHNob3VsZCBiZSBkaXJlY3RseSByZWxhdGVkIHRvIHRoZSBk
ZWdyZWUuCisgICAgICAgICAgICBkb3VibGUgZGVncmVlID0gc3RhdGljX2Nhc3Q8ZG91YmxlPiht
X2RlZ3JlZXNbVG1wTWFwcGVyOjphYnNvbHV0ZUluZGV4KHRtcCldKTsKKworICAgICAgICAgICAg
Ly8gQWxsIGVsc2UgYmVpbmcgZXF1YWwsIHRoZSBzY29yZSBzaG91bGQgYmUgaW52ZXJzZWx5IHJl
bGF0ZWQgdG8gdGhlIG51bWJlciBvZiB3YXJtIHVzZXMgYW5kCisgICAgICAgICAgICAvLyBkZWZz
LgorICAgICAgICAgICAgY29uc3QgVXNlQ291bnRzPFRtcD46OkNvdW50cyogY291bnRzID0gbV91
c2VDb3VudHNbdG1wXTsKKyAgICAgICAgICAgIGlmICghY291bnRzKQorICAgICAgICAgICAgICAg
IHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCk7CisgICAgICAg
ICAgICAKKyAgICAgICAgICAgIGRvdWJsZSB1c2VzID0gY291bnRzLT5udW1XYXJtVXNlcyArIGNv
dW50cy0+bnVtRGVmczsKKworICAgICAgICAgICAgLy8gSWYgaXQncyBhIGNvbnN0YW50LCB0aGVu
IGl0J3Mgbm90IGFzIGJhZCB0byBzcGlsbC4gV2UgY2FuIHJlbWF0ZXJpYWxpemUgaXQgaW4gbWFu
eQorICAgICAgICAgICAgLy8gY2FzZXMuCisgICAgICAgICAgICBpZiAoY291bnRzLT5udW1Db25z
dERlZnMgPT0gMSAmJiBjb3VudHMtPm51bURlZnMgPT0gMSkKKyAgICAgICAgICAgICAgICB1c2Vz
IC89IDI7CisKKyAgICAgICAgICAgIHJldHVybiBkZWdyZWUgLyB1c2VzOworICAgICAgICB9Owor
CisgICAgICAgIGF1dG8gdmljdGltSXRlcmF0b3IgPSBpdGVyYXRvcjsKKyAgICAgICAgZG91Ymxl
IG1heFNjb3JlID0gc2NvcmUoVG1wTWFwcGVyOjp0bXBGcm9tQWJzb2x1dGVJbmRleCgqaXRlcmF0
b3IpKTsKKworICAgICAgICArK2l0ZXJhdG9yOworICAgICAgICBmb3IgKDtpdGVyYXRvciAhPSBt
X3NwaWxsV29ya2xpc3QuZW5kKCk7ICsraXRlcmF0b3IpIHsKKyAgICAgICAgICAgIGRvdWJsZSB0
bXBTY29yZSA9IHNjb3JlKFRtcE1hcHBlcjo6dG1wRnJvbUFic29sdXRlSW5kZXgoKml0ZXJhdG9y
KSk7CisgICAgICAgICAgICBpZiAodG1wU2NvcmUgPiBtYXhTY29yZSkgeworICAgICAgICAgICAg
ICAgIEFTU0VSVCghbV91bnNwaWxsYWJsZVRtcHMuY29udGFpbnMoKml0ZXJhdG9yKSk7CisgICAg
ICAgICAgICAgICAgdmljdGltSXRlcmF0b3IgPSBpdGVyYXRvcjsKKyAgICAgICAgICAgICAgICBt
YXhTY29yZSA9IHRtcFNjb3JlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAg
SW5kZXhUeXBlIHZpY3RpbUluZGV4ID0gKnZpY3RpbUl0ZXJhdG9yOworICAgICAgICBpZiAodHJh
Y2VEZWJ1ZykKKyAgICAgICAgICAgIGRhdGFMb2dMbigiU2VsZWN0aW5nIHNwaWxsICIsIHZpY3Rp
bUluZGV4KTsKKyAgICAgICAgQVNTRVJUKCFpc1ByZWNvbG9yZWQodmljdGltSW5kZXgpKTsKKyAg
ICAgICAgcmV0dXJuIHZpY3RpbUluZGV4OworICAgIH0KKworICAgIHZvaWQgYXNzaWduQ29sb3Jz
KCkKKyAgICB7CisgICAgICAgIEFTU0VSVChtX3NpbXBsaWZ5V29ya2xpc3QuaXNFbXB0eSgpKTsK
KyAgICAgICAgQVNTRVJUKCFtX3NwaWxsV29ya2xpc3QuYml0Q291bnQoKSk7CisKKyAgICAgICAg
Ly8gUmVjbGFpbSBhcyBtdWNoIG1lbW9yeSBhcyBwb3NzaWJsZS4KKyAgICAgICAgbV9pbnRlcmZl
cmVuY2VFZGdlcy5jbGVhcigpOworCisgICAgICAgIG1fZGVncmVlcy5jbGVhcigpOworICAgICAg
ICBtX21vdmVMaXN0LmNsZWFyKCk7CisgICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5jbGVhcigp
OworICAgICAgICBtX3NwaWxsV29ya2xpc3QuY2xlYXJBbGwoKTsKKworICAgICAgICAvLyBUcnkg
dG8gY29sb3IgdGhlIFRtcCBvbiB0aGUgc3RhY2suCisgICAgICAgIG1fY29sb3JlZFRtcC5yZXNp
emUobV9hZGphY2VuY3lMaXN0LnNpemUoKSk7CisKKyAgICAgICAgd2hpbGUgKCFtX3NlbGVjdFN0
YWNrLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdW5zaWduZWQgdG1wSW5kZXggPSBtX3NlbGVj
dFN0YWNrLnRha2VMYXN0KCk7CisgICAgICAgICAgICBtX2lzT25TZWxlY3RTdGFjay5xdWlja0Ns
ZWFyKHRtcEluZGV4KTsKKyAgICAgICAgICAgIEFTU0VSVCghaXNQcmVjb2xvcmVkKHRtcEluZGV4
KSk7CisgICAgICAgICAgICBBU1NFUlQoIW1fY29sb3JlZFRtcFt0bXBJbmRleF0pOworICAgICAg
ICAgICAgUkVMRUFTRV9BU1NFUlQoZ2V0QWxpYXModG1wSW5kZXgpID09IHRtcEluZGV4KTsKKwor
ICAgICAgICAgICAgUmVnaXN0ZXJTZXQgY29sb3JlZFJlZ2lzdGVyczsKKyAgICAgICAgICAgIGZv
ciAoSW5kZXhUeXBlIGFkamFjZW50VG1wSW5kZXggOiBtX2FkamFjZW5jeUxpc3RbdG1wSW5kZXhd
KSB7CisgICAgICAgICAgICAgICAgSW5kZXhUeXBlIGFsaWFzVG1wSW5kZXggPSBnZXRBbGlhcyhh
ZGphY2VudFRtcEluZGV4KTsKKyAgICAgICAgICAgICAgICBSZWcgcmVnID0gbV9jb2xvcmVkVG1w
W2FsaWFzVG1wSW5kZXhdOworCisgICAgICAgICAgICAgICAgQVNTRVJUKCFpc1ByZWNvbG9yZWQo
YWxpYXNUbXBJbmRleCkgfHwgKGlzUHJlY29sb3JlZChhbGlhc1RtcEluZGV4KSAmJiByZWcpKTsK
KworICAgICAgICAgICAgICAgIGlmIChyZWcpCisgICAgICAgICAgICAgICAgICAgIGNvbG9yZWRS
ZWdpc3RlcnMuc2V0KHJlZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgY29s
b3JBc3NpZ25lZCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChSZWcgcmVnIDogbV9yZWdzSW5Q
cmlvcml0eU9yZGVyKSB7CisgICAgICAgICAgICAgICAgaWYgKCFjb2xvcmVkUmVnaXN0ZXJzLmdl
dChyZWcpKSB7CisgICAgICAgICAgICAgICAgICAgIG1fY29sb3JlZFRtcFt0bXBJbmRleF0gPSBy
ZWc7CisgICAgICAgICAgICAgICAgICAgIGNvbG9yQXNzaWduZWQgPSB0cnVlOworICAgICAgICAg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgIGlmICghY29sb3JBc3NpZ25lZCkKKyAgICAgICAgICAgICAgICBtX3NwaWxsZWRU
bXBzLmFwcGVuZCh0bXBJbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBtX3NlbGVjdFN0YWNr
LmNsZWFyKCk7CisKKyAgICAgICAgaWYgKG1fc3BpbGxlZFRtcHMuaXNFbXB0eSgpKQorICAgICAg
ICAgICAgbV9jb2FsZXNjZWRUbXBzQXRTcGlsbC5jbGVhcigpOworICAgICAgICBlbHNlCisgICAg
ICAgICAgICBtX2NvbG9yZWRUbXAuY2xlYXIoKTsKKyAgICB9CisKKyAgICB2b2lkIGR1bXBJbnRl
cmZlcmVuY2VHcmFwaEluRG90KFByaW50U3RyZWFtJiBvdXQpCisgICAgeworICAgICAgICBvdXQu
cHJpbnQoImdyYXBoIEludGVyZmVyZW5jZUdyYXBoIHsgXG4iKTsKKworICAgICAgICBIYXNoU2V0
PFRtcD4gdG1wc1dpdGhJbnRlcmZlcmVuY2VzOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGVk
Z2UgOiBtX2ludGVyZmVyZW5jZUVkZ2VzKSB7CisgICAgICAgICAgICB0bXBzV2l0aEludGVyZmVy
ZW5jZXMuYWRkKFRtcE1hcHBlcjo6dG1wRnJvbUFic29sdXRlSW5kZXgoZWRnZS5maXJzdCgpKSk7
CisgICAgICAgICAgICB0bXBzV2l0aEludGVyZmVyZW5jZXMuYWRkKFRtcE1hcHBlcjo6dG1wRnJv
bUFic29sdXRlSW5kZXgoZWRnZS5zZWNvbmQoKSkpOworICAgICAgICB9CisKKyAgICAgICAgZm9y
IChjb25zdCBhdXRvJiB0bXAgOiB0bXBzV2l0aEludGVyZmVyZW5jZXMpIHsKKyAgICAgICAgICAg
IHVuc2lnbmVkIHRtcEluZGV4ID0gVG1wTWFwcGVyOjphYnNvbHV0ZUluZGV4KHRtcCk7CisgICAg
ICAgICAgICBpZiAodG1wSW5kZXggPCBtX2RlZ3JlZXMuc2l6ZSgpKQorICAgICAgICAgICAgICAg
IG91dC5wcmludCgiICAgICIsIHRtcC5pbnRlcm5hbFZhbHVlKCksICIgW2xhYmVsPVwiIiwgdG1w
LCAiICgiLCBtX2RlZ3JlZXNbdG1wSW5kZXhdLCAiKVwiXTtcbiIpOworICAgICAgICAgICAgZWxz
ZQorICAgICAgICAgICAgICAgIG91dC5wcmludCgiICAgICIsIHRtcC5pbnRlcm5hbFZhbHVlKCks
ICIgW2xhYmVsPVwiIiwgdG1wLCAiXCJdO1xuIik7CisgICAgICAgIH0KKworICAgICAgICBmb3Ig
KGNvbnN0IGF1dG8mIGVkZ2UgOiBtX2ludGVyZmVyZW5jZUVkZ2VzKQorICAgICAgICAgICAgb3V0
LnByaW50KCIgICAgIiwgZWRnZS5maXJzdCgpLCAiIC0tICIsIGVkZ2Uuc2Vjb25kKCksICI7XG4i
KTsKKyAgICAgICAgb3V0LnByaW50KCJ9XG4iKTsKKyAgICB9CisKKyAgICAvLyBJbnRlcmZlcmVu
Y2UgZWRnZXMgYXJlIG5vdCBkaXJlY3RlZC4gQW4gZWRnZSBiZXR3ZWVuIGFueSB0d28gVG1wcyBp
cyByZXByZXNlbnRlZAorICAgIC8vIGJ5IHRoZSBjb25jYXRlbmF0ZWQgdmFsdWVzIG9mIHRoZSBz
bWFsbGVzdCBUbXAgZm9sbG93ZWQgYnkgdGhlIGJpZ2dlciBUbXAuCisgICAgY2xhc3MgSW50ZXJm
ZXJlbmNlRWRnZSB7CisgICAgcHVibGljOgorICAgICAgICBJbnRlcmZlcmVuY2VFZGdlKCkKKyAg
ICAgICAgewogICAgICAgICB9CiAKICAgICAgICAgSW50ZXJmZXJlbmNlRWRnZShJbmRleFR5cGUg
YSwgSW5kZXhUeXBlIGIpCkBAIC01NDgsNiArNDQ3LDE2IEBAIHByb3RlY3RlZDoKICAgICAgICAg
dWludDY0X3QgbV92YWx1ZSB7IDAgfTsKICAgICB9OwogCisgICAgYm9vbCBhZGRJbnRlcmZlcmVu
Y2VFZGdlKEludGVyZmVyZW5jZUVkZ2UgZWRnZSkKKyAgICB7CisgICAgICAgIHJldHVybiBtX2lu
dGVyZmVyZW5jZUVkZ2VzLmFkZChlZGdlKS5pc05ld0VudHJ5OworICAgIH0KKworICAgIGJvb2wg
aGFzSW50ZXJmZXJlbmNlRWRnZShJbnRlcmZlcmVuY2VFZGdlIGVkZ2UpCisgICAgeworICAgICAg
ICByZXR1cm4gbV9pbnRlcmZlcmVuY2VFZGdlcy5jb250YWlucyhlZGdlKTsKKyAgICB9CisKICAg
ICBzdHJ1Y3QgSW50ZXJmZXJlbmNlRWRnZUhhc2ggewogICAgICAgICBzdGF0aWMgdW5zaWduZWQg
aGFzaChjb25zdCBJbnRlcmZlcmVuY2VFZGdlJiBrZXkpIHsgcmV0dXJuIGtleS5oYXNoKCk7IH0K
ICAgICAgICAgc3RhdGljIGJvb2wgZXF1YWwoY29uc3QgSW50ZXJmZXJlbmNlRWRnZSYgYSwgY29u
c3QgSW50ZXJmZXJlbmNlRWRnZSYgYikgeyByZXR1cm4gYSA9PSBiOyB9CkBAIC01NTUsMzkgKzQ2
NCw3MDUgQEAgcHJvdGVjdGVkOgogICAgIH07CiAgICAgdHlwZWRlZiBTaW1wbGVDbGFzc0hhc2hU
cmFpdHM8SW50ZXJmZXJlbmNlRWRnZT4gSW50ZXJmZXJlbmNlRWRnZUhhc2hUcmFpdHM7CiAKLSAg
ICBjb25zdCBWZWN0b3I8UmVnPiYgbV9yZWdzSW5Qcmlvcml0eU9yZGVyOwotICAgIFJlZ2lzdGVy
U2V0IG1fbXV0YWJsZVJlZ3M7Ci0gICAgSW5kZXhUeXBlIG1fbGFzdFByZWNvbG9yZWRSZWdpc3Rl
ckluZGV4IHsgMCB9OworICAgIGNvbnN0IFZlY3RvcjxSZWc+JiBtX3JlZ3NJblByaW9yaXR5T3Jk
ZXI7CisgICAgUmVnaXN0ZXJTZXQgbV9tdXRhYmxlUmVnczsKKyAgICBJbmRleFR5cGUgbV9sYXN0
UHJlY29sb3JlZFJlZ2lzdGVySW5kZXggeyAwIH07CisKKyAgICAvLyBUaGUgaW50ZXJmZXJlbmNl
IGdyYXBoLgorICAgIEhhc2hTZXQ8SW50ZXJmZXJlbmNlRWRnZSwgSW50ZXJmZXJlbmNlRWRnZUhh
c2gsIEludGVyZmVyZW5jZUVkZ2VIYXNoVHJhaXRzPiBtX2ludGVyZmVyZW5jZUVkZ2VzOworCisg
ICAgVmVjdG9yPFZlY3RvcjxJbmRleFR5cGUsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93LCA0Piwg
MCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fYWRqYWNlbmN5TGlzdDsKKyAgICBWZWN0b3I8SW5k
ZXhUeXBlLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9kZWdyZWVzOworCisgICAgLy8gSW5z
dGVhZCBvZiBrZWVwaW5nIHRyYWNrIG9mIHRoZSBtb3ZlIGluc3RydWN0aW9ucywgd2UganVzdCBr
ZWVwIHRoZWlyIG9wZXJhbmRzIGFyb3VuZCBhbmQgdXNlIHRoZSBpbmRleAorICAgIC8vIGluIHRo
ZSB2ZWN0b3IgYXMgdGhlICJpZGVudGlmaWVyIiBmb3IgdGhlIG1vdmUuCisgICAgc3RydWN0IE1v
dmVPcGVyYW5kcyB7CisgICAgICAgIEluZGV4VHlwZSBzcmNJbmRleDsKKyAgICAgICAgSW5kZXhU
eXBlIGRzdEluZGV4OworICAgIH07CisgICAgVmVjdG9yPE1vdmVPcGVyYW5kcywgMCwgVW5zYWZl
VmVjdG9yT3ZlcmZsb3c+IG1fY29hbGVzY2luZ0NhbmRpZGF0ZXM7CisKKyAgICAvLyBMaXN0IG9m
IGV2ZXJ5IG1vdmUgaW5zdHJ1Y3Rpb24gYXNzb2NpYXRlZCB3aXRoIGEgVG1wLgorICAgIFZlY3Rv
cjxIYXNoU2V0PEluZGV4VHlwZSwgdHlwZW5hbWUgRGVmYXVsdEhhc2g8SW5kZXhUeXBlPjo6SGFz
aCwgV1RGOjpVbnNpZ25lZFdpdGhaZXJvS2V5SGFzaFRyYWl0czxJbmRleFR5cGU+Pj4gbV9tb3Zl
TGlzdDsKKworICAgIC8vIENvbG9ycy4KKyAgICBWZWN0b3I8UmVnLCAwLCBVbnNhZmVWZWN0b3JP
dmVyZmxvdz4gbV9jb2xvcmVkVG1wOworICAgIFZlY3RvcjxJbmRleFR5cGU+IG1fc3BpbGxlZFRt
cHM7CisKKyAgICAvLyBWYWx1ZXMgdGhhdCBoYXZlIGJlZW4gY29hbGVzY2VkIHdpdGggYW4gb3Ro
ZXIgdmFsdWUuCisgICAgVmVjdG9yPEluZGV4VHlwZSwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+
IG1fY29hbGVzY2VkVG1wczsKKworICAgIC8vIFRoZSBzdGFjayBvZiBUbXAgcmVtb3ZlZCBmcm9t
IHRoZSBncmFwaCBhbmQgcmVhZHkgZm9yIGNvbG9yaW5nLgorICAgIEJpdFZlY3RvciBtX2lzT25T
ZWxlY3RTdGFjazsKKyAgICBWZWN0b3I8SW5kZXhUeXBlPiBtX3NlbGVjdFN0YWNrOworCisgICAg
SW5kZXhUeXBlIG1fZnJhbWVQb2ludGVySW5kZXggeyAwIH07CisgICAgQml0VmVjdG9yIG1faW50
ZXJmZXJlc1dpdGhGcmFtZVBvaW50ZXI7CisgICAgLy8gTG93LWRlZ3JlZSwgbm9uLU1vdmUgcmVs
YXRlZC4KKyAgICBWZWN0b3I8SW5kZXhUeXBlPiBtX3NpbXBsaWZ5V29ya2xpc3Q7CisgICAgLy8g
SGlnaC1kZWdyZWUgVG1wLgorICAgIEJpdFZlY3RvciBtX3NwaWxsV29ya2xpc3Q7CisKKyAgICBi
b29sIG1faGFzU2VsZWN0ZWRTcGlsbCB7IGZhbHNlIH07CisgICAgYm9vbCBtX2hhc0NvYWxlc2Nl
ZE5vblRyaXZpYWxNb3ZlIHsgZmFsc2UgfTsKKworICAgIC8vIFRoZSBtYXBwaW5nIG9mIFRtcCB0
byB0aGVpciBhbGlhcyBmb3IgTW92ZXMgdGhhdCBhcmUgYWx3YXlzIGNvYWxlc2NpbmcgcmVnYXJk
bGVzcyBvZiBzcGlsbGluZy4KKyAgICBWZWN0b3I8SW5kZXhUeXBlLCAwLCBVbnNhZmVWZWN0b3JP
dmVyZmxvdz4gbV9jb2FsZXNjZWRUbXBzQXRTcGlsbDsKKworICAgIGNvbnN0IEhhc2hTZXQ8dW5z
aWduZWQ+JiBtX3Vuc3BpbGxhYmxlVG1wczsKKyAgICBjb25zdCBVc2VDb3VudHM8VG1wPiYgbV91
c2VDb3VudHM7CisgICAgQ29kZSYgbV9jb2RlOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIElu
ZGV4VHlwZSwgdHlwZW5hbWUgVG1wTWFwcGVyPgorY2xhc3MgQnJpZ2dzIDogcHVibGljIEFic3Ry
YWN0Q29sb3JpbmdBbGxvY2F0b3I8SW5kZXhUeXBlLCBUbXBNYXBwZXI+IHsKKyAgICB1c2luZyBC
YXNlID0gQWJzdHJhY3RDb2xvcmluZ0FsbG9jYXRvcjxJbmRleFR5cGUsIFRtcE1hcHBlcj47Citw
cm90ZWN0ZWQ6CisgICAgdXNpbmcgQmFzZTo6bV9pc09uU2VsZWN0U3RhY2s7CisgICAgdXNpbmcg
QmFzZTo6bV9zZWxlY3RTdGFjazsKKyAgICB1c2luZyBCYXNlOjptX2ZyYW1lUG9pbnRlckluZGV4
OworICAgIHVzaW5nIEJhc2U6Om1faW50ZXJmZXJlc1dpdGhGcmFtZVBvaW50ZXI7CisgICAgdXNp
bmcgQmFzZTo6bV9zaW1wbGlmeVdvcmtsaXN0OworICAgIHVzaW5nIEJhc2U6Om1fc3BpbGxXb3Jr
bGlzdDsKKyAgICB1c2luZyBCYXNlOjptX2hhc1NlbGVjdGVkU3BpbGw7CisgICAgdXNpbmcgQmFz
ZTo6bV9oYXNDb2FsZXNjZWROb25Ucml2aWFsTW92ZTsKKyAgICB1c2luZyBCYXNlOjptX2RlZ3Jl
ZXM7CisgICAgdXNpbmcgQmFzZTo6cmVnaXN0ZXJDb3VudDsKKyAgICB1c2luZyBCYXNlOjptX2Nv
YWxlc2NlZFRtcHM7CisgICAgdXNpbmcgQmFzZTo6bV9tb3ZlTGlzdDsKKyAgICB1c2luZyBCYXNl
OjptX3VzZUNvdW50czsKKyAgICB1c2luZyBCYXNlOjptX2NvYWxlc2NlZFRtcHNBdFNwaWxsOwor
ICAgIHVzaW5nIEJhc2U6Om1fc3BpbGxlZFRtcHM7CisgICAgdXNpbmcgdHlwZW5hbWUgQmFzZTo6
TW92ZU9wZXJhbmRzOworICAgIHVzaW5nIEJhc2U6Om1fY29hbGVzY2luZ0NhbmRpZGF0ZXM7Cisg
ICAgdXNpbmcgQmFzZTo6bV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXg7CisgICAgdXNpbmcg
QmFzZTo6bV9jb2xvcmVkVG1wOworICAgIHVzaW5nIEJhc2U6Om1fY29kZTsKKyAgICB1c2luZyB0
eXBlbmFtZSBCYXNlOjpJbnRlcmZlcmVuY2VFZGdlOworICAgIHVzaW5nIEJhc2U6Om1fdW5zcGls
bGFibGVUbXBzOworICAgIHVzaW5nIEJhc2U6Omhhc0ludGVyZmVyZW5jZUVkZ2U7CisgICAgdXNp
bmcgQmFzZTo6Z2V0QWxpYXM7CisgICAgdXNpbmcgQmFzZTo6YWRkRWRnZTsKKyAgICB1c2luZyBC
YXNlOjppc1ByZWNvbG9yZWQ7CisgICAgdXNpbmcgQmFzZTo6Y2FuQmVTYWZlbHlDb2FsZXNjZWQ7
CisgICAgdXNpbmcgQmFzZTo6YWRkRWRnZURpc3RpbmN0V2l0aG91dERlZ3JlZUNoYW5nZTsKKyAg
ICB1c2luZyBCYXNlOjpmb3JFYWNoQWRqYWNlbnQ7CisgICAgdXNpbmcgQmFzZTo6aGFzQmVlblNp
bXBsaWZpZWQ7CisgICAgdXNpbmcgQmFzZTo6YWRkVG9TcGlsbDsKKyAgICB1c2luZyBCYXNlOjpt
X2ludGVyZmVyZW5jZUVkZ2VzOworCitwdWJsaWM6CisgICAgQnJpZ2dzKENvZGUmIGNvZGUsIGNv
bnN0IFZlY3RvcjxSZWc+JiByZWdzSW5Qcmlvcml0eU9yZGVyLCBJbmRleFR5cGUgbGFzdFByZWNv
bG9yZWRSZWdpc3RlckluZGV4LCB1bnNpZ25lZCB0bXBBcnJheVNpemUsIGNvbnN0IEhhc2hTZXQ8
dW5zaWduZWQ+JiB1bnNwaWxsYWJsZVRtcHMsIGNvbnN0IFVzZUNvdW50czxUbXA+JiB1c2VDb3Vu
dHMpCisgICAgICAgIDogQmFzZShjb2RlLCByZWdzSW5Qcmlvcml0eU9yZGVyLCBsYXN0UHJlY29s
b3JlZFJlZ2lzdGVySW5kZXgsIHRtcEFycmF5U2l6ZSwgdW5zcGlsbGFibGVUbXBzLCB1c2VDb3Vu
dHMpCisgICAgeworICAgIH0KKworICAgIHZvaWQgYWxsb2NhdGUoKQorICAgIHsKKyAgICAgICAg
Ym9vbCBjaGFuZ2VkID0gZmFsc2U7CisKKyAgICAgICAgYXV0byBjb2FsZXNjZU1vdmUgPSBbJl0g
KHVuc2lnbmVkJiBtb3ZlKSB7CisgICAgICAgICAgICBib29sIGNvYWxlc2NlZCA9IGNvYWxlc2Nl
KG1vdmUpOworICAgICAgICAgICAgaWYgKGNvYWxlc2NlZCkgeworICAgICAgICAgICAgICAgIGNo
YW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIC8vIFdlIHdvbid0IG5lZWQgdG8gaGFuZGxl
IHRoaXMgbW92ZSBpbiB0aGUgZnV0dXJlIHNpbmNlIGl0J3MgYWxyZWFkeSBjb2FsZXNjZWQuCisg
ICAgICAgICAgICAgICAgbW92ZSA9IFVJTlRfTUFYOworICAgICAgICAgICAgfQorICAgICAgICB9
OworCisgICAgICAgIC8vIFdlIGZpcnN0IGNvYWxlc2NlIHVudGlsIHdlIGNhbid0IGNvYWxlc2Nl
IGFueSBtb3JlLgorICAgICAgICBkbyB7CisgICAgICAgICAgICBjaGFuZ2VkID0gZmFsc2U7Cisg
ICAgICAgICAgICBtX3dvcmtsaXN0TW92ZXMuZm9yRWFjaE1vdmUoY29hbGVzY2VNb3ZlKTsKKyAg
ICAgICAgfSB3aGlsZSAoY2hhbmdlZCk7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGNoYW5n
ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIG1fd29ya2xpc3RNb3Zlcy5mb3JFYWNoTG93UHJpb3Jp
dHlNb3ZlKGNvYWxlc2NlTW92ZSk7CisgICAgICAgIH0gd2hpbGUgKGNoYW5nZWQpOworCisgICAg
ICAgIC8vIFRoZW4gd2UgY3JlYXRlIG91ciBzZWxlY3Qgc3RhY2suIFRoZSBpbnZhcmlhbnQgd2Ug
c3RhcnQgd2l0aCBoZXJlIGlzIHRoYXQgbm9kZXMgaW4KKyAgICAgICAgLy8gdGhlIGludGVyZmVy
ZW5jZSBncmFwaCB3aXRoIGRlZ3JlZSA+PSBrIGFyZSBvbiB0aGUgc3BpbGwgbGlzdC4gTm9kZXMg
d2l0aCBkZWdyZWUgPCBrCisgICAgICAgIC8vIGFyZSBvbiB0aGUgc2ltcGxpZnkgd29ya2xpc3Qu
IEEgbm9kZSBjYW4gbW92ZSBmcm9tIHRoZSBzcGlsbCBsaXN0IHRvIHRoZSBzaW1wbGlmeQorICAg
ICAgICAvLyBsaXN0IChidXQgbm90IHRoZSBvdGhlciB3YXkgYXJvdW5kLCBub3RlIHRoYXQgdGhp
cyBpcyBkaWZmZXJlbnQgdGhhbiBJUkMgYmVjYXVzZSBJUkMKKyAgICAgICAgLy8gcnVucyB0aGlz
IHdoaWxlIGNvYWxlc2NpbmcsIGJ1dCB3ZSBkbyBhbGwgb3VyIGNvYWxlc2NpbmcgYmVmb3JlIHRo
aXMpLiBPbmNlIGEgbm9kZSBpcworICAgICAgICAvLyBhZGRlZCB0byB0aGUgc2VsZWN0IHN0YWNr
LCBpdCdzIG5vdCBvbiBlaXRoZXIgbGlzdCwgYnV0IG9ubHkgb24gdGhlIHNlbGVjdCBzdGFjay4K
KyAgICAgICAgLy8gT25jZSBvbiB0aGUgc2VsZWN0IHN0YWNrLCBsb2dpY2FsbHksIGl0J3Mgbm8g
bG9uZ2VyIGluIHRoZSBpbnRlcmZlcmVuY2UgZ3JhcGguCisgICAgICAgIGF1dG8gYXNzZXJ0SW52
YXJpYW50cyA9IFsmXSAoKSB7CisgICAgICAgICAgICBpZiAoQVNTRVJUX0RJU0FCTEVEKQorICAg
ICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgSW5kZXhUeXBlIGZpcnN0Tm9uUmVn
SW5kZXggPSBtX2xhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleCArIDE7CisgICAgICAgICAgICB1
bnNpZ25lZCByZWdpc3RlckNvdW50ID0gdGhpcy0+cmVnaXN0ZXJDb3VudCgpOworICAgICAgICAg
ICAgZm9yIChJbmRleFR5cGUgaSA9IGZpcnN0Tm9uUmVnSW5kZXg7IGkgPCBtX2RlZ3JlZXMuc2l6
ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAoZ2V0QWxpYXMoaSkgIT0gaSkKKyAgICAg
ICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKG1faXNPblNlbGVj
dFN0YWNrLmNvbnRhaW5zKGkpKSB7CisgICAgICAgICAgICAgICAgICAgIEFTU0VSVCghbV9zaW1w
bGlmeVdvcmtsaXN0LmNvbnRhaW5zKGkpICYmICFtX3NwaWxsV29ya2xpc3QuY29udGFpbnMoaSkp
OworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICAgICAgdW5zaWduZWQgZGVncmVlID0gbV9kZWdyZWVzW2ldOworICAgICAgICAgICAg
ICAgIGlmIChkZWdyZWUgPj0gcmVnaXN0ZXJDb3VudCkgeworICAgICAgICAgICAgICAgICAgICBB
U1NFUlQobV91bnNwaWxsYWJsZVRtcHMuY29udGFpbnMoaSkgfHwgbV9zcGlsbFdvcmtsaXN0LmNv
bnRhaW5zKGkpKTsKKyAgICAgICAgICAgICAgICAgICAgQVNTRVJUKCFtX3NpbXBsaWZ5V29ya2xp
c3QuY29udGFpbnMoaSkpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgQVNTRVJUKG1fc2ltcGxpZnlXb3JrbGlzdC5jb250
YWlucyhpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgbWFrZUluaXRp
YWxXb3JrbGlzdCgpOworICAgICAgICBhc3NlcnRJbnZhcmlhbnRzKCk7CisgICAgICAgIGRvIHsK
KyAgICAgICAgICAgIGNoYW5nZWQgPSBmYWxzZTsKKworICAgICAgICAgICAgd2hpbGUgKG1fc2lt
cGxpZnlXb3JrbGlzdC5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBzaW1wbGlmeSgpOworICAg
ICAgICAgICAgICAgIGFzc2VydEludmFyaWFudHMoKTsKKyAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgaWYgKG1fc3BpbGxXb3JrbGlzdC5iaXRDb3VudCgpKSB7CisgICAgICAgICAgICAgICAg
c2VsZWN0U3BpbGwoKTsKKyAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAg
ICAgICAgICBBU1NFUlQobV9zaW1wbGlmeVdvcmtsaXN0LnNpemUoKSA9PSAxKTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgfSB3aGlsZSAoY2hhbmdlZCk7CisKKyAgICAgICAgaWYgKCFBU1NFUlRf
RElTQUJMRUQpIHsKKyAgICAgICAgICAgIEFTU0VSVCghbV9zaW1wbGlmeVdvcmtsaXN0LnNpemUo
KSk7CisgICAgICAgICAgICBBU1NFUlQoIW1fc3BpbGxXb3JrbGlzdC5iaXRDb3VudCgpKTsKKyAg
ICAgICAgICAgIEluZGV4VHlwZSBmaXJzdE5vblJlZ0luZGV4ID0gbV9sYXN0UHJlY29sb3JlZFJl
Z2lzdGVySW5kZXggKyAxOworICAgICAgICAgICAgZm9yIChJbmRleFR5cGUgaSA9IGZpcnN0Tm9u
UmVnSW5kZXg7IGkgPCBtX2RlZ3JlZXMuc2l6ZSgpOyArK2kpCisgICAgICAgICAgICAgICAgQVNT
RVJUKGhhc0JlZW5TaW1wbGlmaWVkKGkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2lnbkNv
bG9ycygpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIAorICAgIGJvb2wgY29hbGVzY2UodW5z
aWduZWQmIG1vdmVJbmRleCkKKyAgICB7CisgICAgICAgIGNvbnN0IE1vdmVPcGVyYW5kcyYgbW92
ZU9wZXJhbmRzID0gbV9jb2FsZXNjaW5nQ2FuZGlkYXRlc1ttb3ZlSW5kZXhdOworICAgICAgICBJ
bmRleFR5cGUgdSA9IGdldEFsaWFzKG1vdmVPcGVyYW5kcy5zcmNJbmRleCk7CisgICAgICAgIElu
ZGV4VHlwZSB2ID0gZ2V0QWxpYXMobW92ZU9wZXJhbmRzLmRzdEluZGV4KTsKKworICAgICAgICBp
ZiAoaXNQcmVjb2xvcmVkKHYpKQorICAgICAgICAgICAgc3RkOjpzd2FwKHUsIHYpOworCisgICAg
ICAgIGlmICh0cmFjZURlYnVnKQorICAgICAgICAgICAgZGF0YUxvZygiQ29hbGVzY2luZyBtb3Zl
IGF0IGluZGV4ICIsIG1vdmVJbmRleCwgIiB1ID0gIiwgVG1wTWFwcGVyOjp0bXBGcm9tQWJzb2x1
dGVJbmRleCh1KSwgIiB2ID0gIiwgVG1wTWFwcGVyOjp0bXBGcm9tQWJzb2x1dGVJbmRleCh2KSwg
IiAgICAiKTsKKworICAgICAgICBpZiAodSA9PSB2KSB7CisgICAgICAgICAgICBpZiAodHJhY2VE
ZWJ1ZykKKyAgICAgICAgICAgICAgICBkYXRhTG9nKCJBbHJlYWR5IENvYWxlc2NlZC4gVGhleSdy
ZSBlcXVhbC5cbiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAg
ICAgICAgaWYgKGlzUHJlY29sb3JlZCh2KQorICAgICAgICAgICAgfHwgaGFzSW50ZXJmZXJlbmNl
RWRnZShJbnRlcmZlcmVuY2VFZGdlKHUsIHYpKQorICAgICAgICAgICAgfHwgKHUgPT0gbV9mcmFt
ZVBvaW50ZXJJbmRleCAmJiBtX2ludGVyZmVyZXNXaXRoRnJhbWVQb2ludGVyLnF1aWNrR2V0KHYp
KSkgeworCisgICAgICAgICAgICAvLyBObyBuZWVkIHRvIGV2ZXIgY29uc2lkZXIgdGhpcyBtb3Zl
IGFnYWluIGlmIGl0IGludGVyZmVyZXMuCisgICAgICAgICAgICAvLyBObyBjb2FsZXNjaW5nIHdp
bGwgcmVtb3ZlIHRoZSBpbnRlcmZlcmVuY2UuCisgICAgICAgICAgICBtb3ZlSW5kZXggPSBVSU5U
X01BWDsKKworICAgICAgICAgICAgaWYgKCFBU1NFUlRfRElTQUJMRUQpIHsKKyAgICAgICAgICAg
ICAgICBpZiAoaXNQcmVjb2xvcmVkKHYpKQorICAgICAgICAgICAgICAgICAgICBBU1NFUlQoaXNQ
cmVjb2xvcmVkKHUpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRyYWNlRGVi
dWcpCisgICAgICAgICAgICAgICAgZGF0YUxvZygiQ29uc3RyYWluZWRcbiIpOworCisgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChjYW5C
ZVNhZmVseUNvYWxlc2NlZCh1LCB2KSkgeworICAgICAgICAgICAgY29tYmluZSh1LCB2KTsKKyAg
ICAgICAgICAgIG1faGFzQ29hbGVzY2VkTm9uVHJpdmlhbE1vdmUgPSB0cnVlOworCisgICAgICAg
ICAgICBpZiAodHJhY2VEZWJ1ZykKKyAgICAgICAgICAgICAgICBkYXRhTG9nKCIgICAgU2FmZSBD
b2FsZXNjaW5nXG4iKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAg
ICAgICAgaWYgKHRyYWNlRGVidWcpCisgICAgICAgICAgICBkYXRhTG9nKCIgICAgRmFpbGVkIGNv
YWxlc2NpbmcuXG4iKTsKKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdm9p
ZCBjb21iaW5lKEluZGV4VHlwZSB1LCBJbmRleFR5cGUgdikKKyAgICB7CisgICAgICAgIEFTU0VS
VCghbV9jb2FsZXNjZWRUbXBzW3ZdKTsKKyAgICAgICAgbV9jb2FsZXNjZWRUbXBzW3ZdID0gdTsK
KworICAgICAgICBhdXRvJiB2TW92ZXMgPSBtX21vdmVMaXN0W3ZdOworICAgICAgICBtX21vdmVM
aXN0W3VdLmFkZCh2TW92ZXMuYmVnaW4oKSwgdk1vdmVzLmVuZCgpKTsKKworICAgICAgICBmb3JF
YWNoQWRqYWNlbnQodiwgW3RoaXMsIHVdIChJbmRleFR5cGUgYWRqYWNlbnRUbXBJbmRleCkgewor
ICAgICAgICAgICAgaWYgKGFkZEVkZ2VEaXN0aW5jdFdpdGhvdXREZWdyZWVDaGFuZ2UoYWRqYWNl
bnRUbXBJbmRleCwgdSkpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSBhZGRlZCBhIG5ldyBl
ZGdlIGJldHdlZW4gdGhlIGFkamFjZW50VG1wIGFuZCB1LCBpdCByZXBsYWNlcyB0aGUgZWRnZQor
ICAgICAgICAgICAgICAgIC8vIHRoYXQgZXhpc3RlZCB3aXRoIHYuCisgICAgICAgICAgICAgICAg
Ly8gVGhlIGRlZ3JlZSBvZiBhZGphY2VudFRtcCByZW1haW5zIHRoZSBzYW1lIHNpbmNlIHRoZSBl
ZGdlIGp1c3QgY2hhbmdlZCBmcm9tIHUgdG8gdi4KKyAgICAgICAgICAgICAgICAvLyBBbGwgd2Ug
bmVlZCB0byBkbyBpcyB1cGRhdGUgdGhlIGRlZ3JlZSBvZiB1LgorICAgICAgICAgICAgICAgIGlm
ICghaXNQcmVjb2xvcmVkKHUpKQorICAgICAgICAgICAgICAgICAgICBtX2RlZ3JlZXNbdV0rKzsK
KyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gSWYgd2UgYWxyZWFkeSBo
YWQgYW4gZWRnZSBiZXR3ZWVuIHRoZSBhZGphY2VudFRtcCBhbmQgdSwgdGhlIGRlZ3JlZSBvZiB1
CisgICAgICAgICAgICAgICAgLy8gaXMgYWxyZWFkeSBjb3JyZWN0LiBUaGUgZGVncmVlIG9mIHRo
ZSBhZGphY2VudFRtcCBkZWNyZWFzZXMgc2luY2UgdGhlIGVkZ2UKKyAgICAgICAgICAgICAgICAv
LyB3aXRoIHYgaXMgbm8gbG9uZ2VyIHJlbGV2YW50ICh3ZSBjYW4gdGhpbmsgb2YgaXQgYXMgbWVy
Z2VkIHdpdGggdGhlIGVkZ2Ugd2l0aCB1KS4KKyAgICAgICAgICAgICAgICBkZWNyZW1lbnREZWdy
ZWUoYWRqYWNlbnRUbXBJbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAg
ICAgIGlmIChtX2ZyYW1lUG9pbnRlckluZGV4ICYmIG1faW50ZXJmZXJlc1dpdGhGcmFtZVBvaW50
ZXIucXVpY2tHZXQodikpCisgICAgICAgICAgICBtX2ludGVyZmVyZXNXaXRoRnJhbWVQb2ludGVy
LnF1aWNrU2V0KHUpOworICAgIH0KKworCisgICAgdm9pZCBtYWtlSW5pdGlhbFdvcmtsaXN0KCkK
KyAgICB7CisgICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5jbGVhcigpOworICAgICAgICBtX3Nw
aWxsV29ya2xpc3QuY2xlYXJBbGwoKTsKKworICAgICAgICBpZiAodHJhY2VEZWJ1ZykKKyAgICAg
ICAgICAgIGRhdGFMb2dMbigiLS0tLS0tLS0tLS0tLS0tLS0tXG5NYWtpbmcgaW5pdGlhbCB3b3Jr
bGlzdCIpOworCisgICAgICAgIEluZGV4VHlwZSBmaXJzdE5vblJlZ0luZGV4ID0gbV9sYXN0UHJl
Y29sb3JlZFJlZ2lzdGVySW5kZXggKyAxOworICAgICAgICB1bnNpZ25lZCByZWdpc3RlckNvdW50
ID0gdGhpcy0+cmVnaXN0ZXJDb3VudCgpOworICAgICAgICBmb3IgKEluZGV4VHlwZSBpID0gZmly
c3ROb25SZWdJbmRleDsgaSA8IG1fZGVncmVlcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAg
QVNTRVJUKCFpc1ByZWNvbG9yZWQoaSkpOworICAgICAgICAgICAgaWYgKGhhc0JlZW5TaW1wbGlm
aWVkKGkpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgdW5zaWduZWQg
ZGVncmVlID0gbV9kZWdyZWVzW2ldOworICAgICAgICAgICAgaWYgKGRlZ3JlZSA8IHJlZ2lzdGVy
Q291bnQpIHsKKyAgICAgICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKKyAgICAgICAgICAgICAg
ICAgICAgZGF0YUxvZ0xuKCJBZGRpbmcgIiwgVG1wTWFwcGVyOjp0bXBGcm9tQWJzb2x1dGVJbmRl
eChpKSwgIiB0byBzaW1wbGlmeSB3b3JrbGlzdCIpOworICAgICAgICAgICAgICAgIG1fc2ltcGxp
ZnlXb3JrbGlzdC5hcHBlbmQoaSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAg
ICAgIGlmICh0cmFjZURlYnVnKQorICAgICAgICAgICAgICAgICAgICBkYXRhTG9nTG4oIkFkZGlu
ZyAiLCBUbXBNYXBwZXI6OnRtcEZyb21BYnNvbHV0ZUluZGV4KGkpLCAiIHRvIHNwaWxsIHdvcmts
aXN0Iik7CisgICAgICAgICAgICAgICAgYWRkVG9TcGlsbChpKTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgfQorICAgIH0KKworICAgIC8vIExvdy1kZWdyZWUgdmVydGV4IGNhbiBhbHdheXMgYmUg
Y29sb3JlZDoganVzdCBwaWNrIGFueSBvZiB0aGUgY29sb3IgdGFrZW4gYnkgYW55CisgICAgLy8g
b3RoZXIgYWRqYWNlbnQgdmVyaWNlcy4KKyAgICAvLyBUaGUgIlNpbXBsaWZ5IiBwaGFzZSB0YWtl
cyBhIGxvdy1kZWdyZWUgb3V0IG9mIHRoZSBpbnRlcmZlcmVuY2UgZ3JhcGggdG8gc2ltcGxpZnkg
aXQuCisgICAgdm9pZCBzaW1wbGlmeSgpCisgICAgeworICAgICAgICBJbmRleFR5cGUgbGFzdElu
ZGV4ID0gbV9zaW1wbGlmeVdvcmtsaXN0LnRha2VMYXN0KCk7CisKKyAgICAgICAgQVNTRVJUKCFt
X3NlbGVjdFN0YWNrLmNvbnRhaW5zKGxhc3RJbmRleCkpOworICAgICAgICBBU1NFUlQoIW1faXNP
blNlbGVjdFN0YWNrLmdldChsYXN0SW5kZXgpKTsKKyAgICAgICAgQVNTRVJUKCFtX3NwaWxsV29y
a2xpc3QuY29udGFpbnMobGFzdEluZGV4KSk7CisKKyAgICAgICAgbV9zZWxlY3RTdGFjay5hcHBl
bmQobGFzdEluZGV4KTsKKyAgICAgICAgbV9pc09uU2VsZWN0U3RhY2sucXVpY2tTZXQobGFzdElu
ZGV4KTsKKworICAgICAgICBpZiAodHJhY2VEZWJ1ZykKKyAgICAgICAgICAgIGRhdGFMb2dMbigi
U2ltcGxpZnlpbmcgIiwgbGFzdEluZGV4LCAiIGJ5IGFkZGluZyBpdCB0byBzZWxlY3Qgc3RhY2si
KTsKKworICAgICAgICBmb3JFYWNoQWRqYWNlbnQobGFzdEluZGV4LCBbdGhpc10oSW5kZXhUeXBl
IGFkamFjZW50VG1wSW5kZXgpIHsKKyAgICAgICAgICAgIGRlY3JlbWVudERlZ3JlZUluU2ltcGxp
ZmljYXRpb24oYWRqYWNlbnRUbXBJbmRleCk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHZv
aWQgc2VsZWN0U3BpbGwoKQorICAgIHsKKyAgICAgICAgSW5kZXhUeXBlIHZpY3RpbUluZGV4ID0g
QmFzZTo6c2VsZWN0U3BpbGwoKTsKKyAgICAgICAgbV9zcGlsbFdvcmtsaXN0LnF1aWNrQ2xlYXIo
dmljdGltSW5kZXgpOworICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuYXBwZW5kKHZpY3RpbUlu
ZGV4KTsKKyAgICB9CisKKyAgICBzdHJ1Y3QgTW92ZVNldCB7CisgICAgICAgIHVuc2lnbmVkIGFk
ZE1vdmUoKQorICAgICAgICB7CisgICAgICAgICAgICBBU1NFUlQobV9sb3dQcmlvcml0eU1vdmVM
aXN0LmlzRW1wdHkoKSk7CisKKyAgICAgICAgICAgIHVuc2lnbmVkIG5leHRJbmRleCA9IG1fcG9z
aXRpb25Jbk1vdmVMaXN0Kys7CisgICAgICAgICAgICBtX21vdmVMaXN0LmFwcGVuZChuZXh0SW5k
ZXgpOworICAgICAgICAgICAgcmV0dXJuIG5leHRJbmRleDsKKyAgICAgICAgfQorCisgICAgICAg
IHZvaWQgc3RhcnRBZGRpbmdMb3dQcmlvcml0eU1vdmVzKCkKKyAgICAgICAgeworICAgICAgICAg
ICAgQVNTRVJUKG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5pc0VtcHR5KCkpOworICAgICAgICB9CisK
KyAgICAgICAgdW5zaWduZWQgYWRkTG93UHJpb3JpdHlNb3ZlKCkKKyAgICAgICAgeworICAgICAg
ICAgICAgdW5zaWduZWQgbmV4dEluZGV4ID0gbV9wb3NpdGlvbkluTW92ZUxpc3QrKzsKKyAgICAg
ICAgICAgIG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5hcHBlbmQobmV4dEluZGV4KTsKKworICAgICAg
ICAgICAgcmV0dXJuIG5leHRJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdlIHVzZSBy
ZWZlcmVuY2VzIHRvIG1vdmVzIGhlcmUgYmVjYXVzZSB0aGUgZnVuY3Rpb24KKyAgICAgICAgLy8g
bWF5IGRvIGNvYWxlc2NpbmcsIGluZGljYXRpbmcgaXQgZG9lc24ndCBuZWVkIHRvIHNlZQorICAg
ICAgICAvLyB0aGUgbW92ZSBhZ2Fpbi4KKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0
aW9uPgorICAgICAgICB2b2lkIGZvckVhY2hNb3ZlKEZ1bmN0aW9uIGZ1bmN0aW9uKQorICAgICAg
ICB7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkJiBtb3ZlIDogbV9tb3ZlTGlzdCkgeworICAg
ICAgICAgICAgICAgIGlmIChtb3ZlICE9IFVJTlRfTUFYKQorICAgICAgICAgICAgICAgICAgICBm
dW5jdGlvbihtb3ZlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRlbXBs
YXRlIDx0eXBlbmFtZSBGdW5jdGlvbj4KKyAgICAgICAgdm9pZCBmb3JFYWNoTG93UHJpb3JpdHlN
b3ZlKEZ1bmN0aW9uIGZ1bmN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHVuc2ln
bmVkJiBtb3ZlIDogbV9sb3dQcmlvcml0eU1vdmVMaXN0KSB7CisgICAgICAgICAgICAgICAgaWYg
KG1vdmUgIT0gVUlOVF9NQVgpCisgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKG1vdmUpOwor
ICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdm9pZCBjbGVhcigpCisgICAgICAg
IHsKKyAgICAgICAgICAgIG1fcG9zaXRpb25Jbk1vdmVMaXN0ID0gMDsKKyAgICAgICAgICAgIG1f
bW92ZUxpc3QuY2xlYXIoKTsKKyAgICAgICAgICAgIG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5jbGVh
cigpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICB1bnNpZ25lZCBtX3Bvc2l0
aW9uSW5Nb3ZlTGlzdDsKKyAgICAgICAgVmVjdG9yPHVuc2lnbmVkLCAwLCBVbnNhZmVWZWN0b3JP
dmVyZmxvdz4gbV9tb3ZlTGlzdDsKKyAgICAgICAgVmVjdG9yPHVuc2lnbmVkLCAwLCBVbnNhZmVW
ZWN0b3JPdmVyZmxvdz4gbV9sb3dQcmlvcml0eU1vdmVMaXN0OworICAgIH07CisKKyAgICB2b2lk
IGRlY3JlbWVudERlZ3JlZShJbmRleFR5cGUgdG1wSW5kZXgpCisgICAgeworICAgICAgICBBU1NF
UlQobV9kZWdyZWVzW3RtcEluZGV4XSk7CisgICAgICAgIC0tbV9kZWdyZWVzW3RtcEluZGV4XTsK
KyAgICB9CisKKyAgICB2b2lkIGRlY3JlbWVudERlZ3JlZUluU2ltcGxpZmljYXRpb24oSW5kZXhU
eXBlIHRtcEluZGV4KQorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fZGVncmVlc1t0bXBJbmRleF0p
OworICAgICAgICB1bnNpZ25lZCBvbGREZWdyZWUgPSBtX2RlZ3JlZXNbdG1wSW5kZXhdLS07CisK
KyAgICAgICAgaWYgKG9sZERlZ3JlZSA9PSByZWdpc3RlckNvdW50KCkpIHsKKyAgICAgICAgICAg
IEFTU0VSVChtX2RlZ3JlZXNbdG1wSW5kZXhdIDwgcmVnaXN0ZXJDb3VudCgpKTsKKyAgICAgICAg
ICAgIGlmICh0cmFjZURlYnVnKQorICAgICAgICAgICAgICAgIGRhdGFMb2dMbigiTW92aW5nIHRt
cCAiLCB0bXBJbmRleCwgIiBmcm9tIHNwaWxsIGxpc3QgdG8gc2ltcGxpZnkgbGlzdCBiZWNhdXNl
IGl0J3MgZGVncmVlIGlzIG5vdyBsZXNzIHRoYW4gayIpOworCisgICAgICAgICAgICBpZiAoIUFT
U0VSVF9ESVNBQkxFRCkKKyAgICAgICAgICAgICAgICBBU1NFUlQobV91bnNwaWxsYWJsZVRtcHMu
Y29udGFpbnModG1wSW5kZXgpIHx8IG1fc3BpbGxXb3JrbGlzdC5jb250YWlucyh0bXBJbmRleCkp
OworICAgICAgICAgICAgbV9zcGlsbFdvcmtsaXN0LnF1aWNrQ2xlYXIodG1wSW5kZXgpOworCisg
ICAgICAgICAgICBBU1NFUlQoIW1fc2ltcGxpZnlXb3JrbGlzdC5jb250YWlucyh0bXBJbmRleCkp
OworICAgICAgICAgICAgbV9zaW1wbGlmeVdvcmtsaXN0LmFwcGVuZCh0bXBJbmRleCk7CisgICAg
ICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGFzc2lnbkNvbG9ycygpCisgICAgeworICAgICAgICBt
X3dvcmtsaXN0TW92ZXMuY2xlYXIoKTsKKyAgICAgICAgQmFzZTo6YXNzaWduQ29sb3JzKCk7Cisg
ICAgfQorCisgICAgLy8gU2V0IG9mICJtb3ZlIiBlbmFibGVkIGZvciBwb3NzaWJsZSBjb2FsZXNj
aW5nLgorICAgIE1vdmVTZXQgbV93b3JrbGlzdE1vdmVzOworfTsKKwordGVtcGxhdGUgPHR5cGVu
YW1lIEluZGV4VHlwZSwgdHlwZW5hbWUgVG1wTWFwcGVyPgorY2xhc3MgSVJDIDogcHVibGljIEFi
c3RyYWN0Q29sb3JpbmdBbGxvY2F0b3I8SW5kZXhUeXBlLCBUbXBNYXBwZXI+IHsKKyAgICB1c2lu
ZyBCYXNlID0gQWJzdHJhY3RDb2xvcmluZ0FsbG9jYXRvcjxJbmRleFR5cGUsIFRtcE1hcHBlcj47
Citwcm90ZWN0ZWQ6CisgICAgdXNpbmcgQmFzZTo6bV9pc09uU2VsZWN0U3RhY2s7CisgICAgdXNp
bmcgQmFzZTo6bV9zZWxlY3RTdGFjazsKKyAgICB1c2luZyBCYXNlOjptX2ZyYW1lUG9pbnRlcklu
ZGV4OworICAgIHVzaW5nIEJhc2U6Om1faW50ZXJmZXJlc1dpdGhGcmFtZVBvaW50ZXI7CisgICAg
dXNpbmcgQmFzZTo6bV9zaW1wbGlmeVdvcmtsaXN0OworICAgIHVzaW5nIEJhc2U6Om1fc3BpbGxX
b3JrbGlzdDsKKyAgICB1c2luZyBCYXNlOjptX2hhc1NlbGVjdGVkU3BpbGw7CisgICAgdXNpbmcg
QmFzZTo6bV9oYXNDb2FsZXNjZWROb25Ucml2aWFsTW92ZTsKKyAgICB1c2luZyBCYXNlOjptX2Rl
Z3JlZXM7CisgICAgdXNpbmcgQmFzZTo6cmVnaXN0ZXJDb3VudDsKKyAgICB1c2luZyBCYXNlOjpt
X2NvYWxlc2NlZFRtcHM7CisgICAgdXNpbmcgQmFzZTo6bV9tb3ZlTGlzdDsKKyAgICB1c2luZyBC
YXNlOjptX3VzZUNvdW50czsKKyAgICB1c2luZyBCYXNlOjptX2NvYWxlc2NlZFRtcHNBdFNwaWxs
OworICAgIHVzaW5nIEJhc2U6Om1fc3BpbGxlZFRtcHM7CisgICAgdXNpbmcgdHlwZW5hbWUgQmFz
ZTo6TW92ZU9wZXJhbmRzOworICAgIHVzaW5nIEJhc2U6Om1fY29hbGVzY2luZ0NhbmRpZGF0ZXM7
CisgICAgdXNpbmcgQmFzZTo6bV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXg7CisgICAgdXNp
bmcgQmFzZTo6bV9jb2xvcmVkVG1wOworICAgIHVzaW5nIEJhc2U6Om1fY29kZTsKKyAgICB1c2lu
ZyB0eXBlbmFtZSBCYXNlOjpJbnRlcmZlcmVuY2VFZGdlOworICAgIHVzaW5nIEJhc2U6Om1fdW5z
cGlsbGFibGVUbXBzOworICAgIHVzaW5nIEJhc2U6Omhhc0ludGVyZmVyZW5jZUVkZ2U7CisgICAg
dXNpbmcgQmFzZTo6Z2V0QWxpYXM7CisgICAgdXNpbmcgQmFzZTo6YWRkRWRnZTsKKyAgICB1c2lu
ZyBCYXNlOjppc1ByZWNvbG9yZWQ7CisgICAgdXNpbmcgQmFzZTo6Y2FuQmVTYWZlbHlDb2FsZXNj
ZWQ7CisgICAgdXNpbmcgQmFzZTo6YWRkRWRnZURpc3RpbmN0V2l0aG91dERlZ3JlZUNoYW5nZTsK
KyAgICB1c2luZyBCYXNlOjpmb3JFYWNoQWRqYWNlbnQ7CisgICAgdXNpbmcgQmFzZTo6aGFzQmVl
blNpbXBsaWZpZWQ7CisgICAgdXNpbmcgQmFzZTo6YWRkVG9TcGlsbDsKKyAgICB1c2luZyBCYXNl
OjptX2ludGVyZmVyZW5jZUVkZ2VzOworICAgIHVzaW5nIEJhc2U6Om1fYWRqYWNlbmN5TGlzdDsK
KyAgICB1c2luZyBCYXNlOjpkdW1wSW50ZXJmZXJlbmNlR3JhcGhJbkRvdDsKKworcHVibGljOgor
ICAgIElSQyhDb2RlJiBjb2RlLCBjb25zdCBWZWN0b3I8UmVnPiYgcmVnc0luUHJpb3JpdHlPcmRl
ciwgSW5kZXhUeXBlIGxhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleCwgdW5zaWduZWQgdG1wQXJy
YXlTaXplLCBjb25zdCBIYXNoU2V0PHVuc2lnbmVkPiYgdW5zcGlsbGFibGVUbXBzLCBjb25zdCBV
c2VDb3VudHM8VG1wPiYgdXNlQ291bnRzKQorICAgICAgICA6IEJhc2UoY29kZSwgcmVnc0luUHJp
b3JpdHlPcmRlciwgbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4LCB0bXBBcnJheVNpemUsIHVu
c3BpbGxhYmxlVG1wcywgdXNlQ291bnRzKQorICAgIHsKKyAgICB9CisKKyAgICB2b2lkIGFsbG9j
YXRlKCkKKyAgICB7CisgICAgICAgIG1fYWN0aXZlTW92ZXMuZW5zdXJlU2l6ZShtX3dvcmtsaXN0
TW92ZXMudG90YWxOdW1iZXJPZk1vdmVzKCkpOworICAgICAgICBBU1NFUlRfV0lUSF9NRVNTQUdF
KG1fYWN0aXZlTW92ZXMuc2l6ZSgpID49IG1fY29hbGVzY2luZ0NhbmRpZGF0ZXMuc2l6ZSgpLCAi
VGhlIGFjdGl2ZU1vdmUgc2V0IHNob3VsZCBiZSBiaWcgZW5vdWdoIGZvciB0aGUgcXVpY2sgb3Bl
cmF0aW9ucyBvZiBCaXRWZWN0b3IuIik7CisKKyAgICAgICAgbWFrZVdvcmtMaXN0KCk7CisKKyAg
ICAgICAgaWYgKGRlYnVnKSB7CisgICAgICAgICAgICBkdW1wSW50ZXJmZXJlbmNlR3JhcGhJbkRv
dChXVEY6OmRhdGFGaWxlKCkpOworICAgICAgICAgICAgZGF0YUxvZygiQ29hbGVzY2luZyBjYW5k
aWRhdGVzOlxuIik7CisgICAgICAgICAgICBmb3IgKE1vdmVPcGVyYW5kcyYgbW92ZU9wIDogbV9j
b2FsZXNjaW5nQ2FuZGlkYXRlcykgeworICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICAiLCBU
bXBNYXBwZXI6OnRtcEZyb21BYnNvbHV0ZUluZGV4KG1vdmVPcC5zcmNJbmRleCksCisgICAgICAg
ICAgICAgICAgICAgICIgLT4gIiwgVG1wTWFwcGVyOjp0bXBGcm9tQWJzb2x1dGVJbmRleChtb3Zl
T3AuZHN0SW5kZXgpLCAiXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRhdGFMb2co
IkluaXRpYWwgd29yayBsaXN0XG4iKTsKKyAgICAgICAgICAgIGR1bXBXb3JrTGlzdHMoV1RGOjpk
YXRhRmlsZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGlmICh0
cmFjZURlYnVnKSB7CisgICAgICAgICAgICAgICAgZGF0YUxvZygiQmVmb3JlIEdyYXBoIHNpbXBs
aWZpY2F0aW9uIGl0ZXJhdGlvblxuIik7CisgICAgICAgICAgICAgICAgZHVtcFdvcmtMaXN0cyhX
VEY6OmRhdGFGaWxlKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIW1fc2lt
cGxpZnlXb3JrbGlzdC5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgc2ltcGxpZnkoKTsKKyAg
ICAgICAgICAgIGVsc2UgaWYgKCFtX3dvcmtsaXN0TW92ZXMuaXNFbXB0eSgpKQorICAgICAgICAg
ICAgICAgIGNvYWxlc2NlKCk7CisgICAgICAgICAgICBlbHNlIGlmICghbV9mcmVlemVXb3JrbGlz
dC5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgZnJlZXplKCk7CisgICAgICAgICAgICBlbHNl
IGlmIChtX3NwaWxsV29ya2xpc3QuYml0Q291bnQoKSkKKyAgICAgICAgICAgICAgICBzZWxlY3RT
cGlsbCgpOworCisgICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykgeworICAgICAgICAgICAgICAg
IGRhdGFMb2coIkFmdGVyIEdyYXBoIHNpbXBsaWZpY2F0aW9uIGl0ZXJhdGlvblxuIik7CisgICAg
ICAgICAgICAgICAgZHVtcFdvcmtMaXN0cyhXVEY6OmRhdGFGaWxlKCkpOworICAgICAgICAgICAg
fQorICAgICAgICB9IHdoaWxlICghbV9zaW1wbGlmeVdvcmtsaXN0LmlzRW1wdHkoKSB8fCAhbV93
b3JrbGlzdE1vdmVzLmlzRW1wdHkoKSB8fCAhbV9mcmVlemVXb3JrbGlzdC5pc0VtcHR5KCkgfHwg
bV9zcGlsbFdvcmtsaXN0LmJpdENvdW50KCkpOworCisgICAgICAgIGFzc2lnbkNvbG9ycygpOwor
ICAgIH0KKworcHJvdGVjdGVkOgorCisgICAgdm9pZCBtYWtlV29ya0xpc3QoKQorICAgIHsKKyAg
ICAgICAgSW5kZXhUeXBlIGZpcnN0Tm9uUmVnSW5kZXggPSBtX2xhc3RQcmVjb2xvcmVkUmVnaXN0
ZXJJbmRleCArIDE7CisgICAgICAgIGZvciAoSW5kZXhUeXBlIGkgPSBmaXJzdE5vblJlZ0luZGV4
OyBpIDwgbV9kZWdyZWVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBkZWdy
ZWUgPSBtX2RlZ3JlZXNbaV07CisgICAgICAgICAgICBpZiAoZGVncmVlID49IHJlZ2lzdGVyQ291
bnQoKSkKKyAgICAgICAgICAgICAgICBhZGRUb1NwaWxsKGkpOworICAgICAgICAgICAgZWxzZSBp
ZiAoIW1fbW92ZUxpc3RbaV0uaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIG1fZnJlZXplV29y
a2xpc3QuYWRkKGkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1fc2ltcGxp
ZnlXb3JrbGlzdC5hcHBlbmQoaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBMb3ctZGVn
cmVlIHZlcnRleCBjYW4gYWx3YXlzIGJlIGNvbG9yZWQ6IGp1c3QgcGljayBhbnkgb2YgdGhlIGNv
bG9yIHRha2VuIGJ5IGFueQorICAgIC8vIG90aGVyIGFkamFjZW50IHZlcmljZXMuCisgICAgLy8g
VGhlICJTaW1wbGlmeSIgcGhhc2UgdGFrZXMgYSBsb3ctZGVncmVlIG91dCBvZiB0aGUgaW50ZXJm
ZXJlbmNlIGdyYXBoIHRvIHNpbXBsaWZ5IGl0LgorICAgIHZvaWQgc2ltcGxpZnkoKQorICAgIHsK
KyAgICAgICAgSW5kZXhUeXBlIGxhc3RJbmRleCA9IG1fc2ltcGxpZnlXb3JrbGlzdC50YWtlTGFz
dCgpOworCisgICAgICAgIEFTU0VSVCghbV9zZWxlY3RTdGFjay5jb250YWlucyhsYXN0SW5kZXgp
KTsKKyAgICAgICAgQVNTRVJUKCFtX2lzT25TZWxlY3RTdGFjay5nZXQobGFzdEluZGV4KSk7Cisg
ICAgICAgIG1fc2VsZWN0U3RhY2suYXBwZW5kKGxhc3RJbmRleCk7CisgICAgICAgIG1faXNPblNl
bGVjdFN0YWNrLnF1aWNrU2V0KGxhc3RJbmRleCk7CisKKyAgICAgICAgZm9yRWFjaEFkamFjZW50
KGxhc3RJbmRleCwgW3RoaXNdKEluZGV4VHlwZSBhZGphY2VudFRtcEluZGV4KSB7CisgICAgICAg
ICAgICBkZWNyZW1lbnREZWdyZWUoYWRqYWNlbnRUbXBJbmRleCk7CisgICAgICAgIH0pOworICAg
IH0KKworICAgIHZvaWQgY29hbGVzY2UoKQorICAgIHsKKyAgICAgICAgdW5zaWduZWQgbW92ZUlu
ZGV4ID0gbV93b3JrbGlzdE1vdmVzLnRha2VMYXN0TW92ZSgpOworICAgICAgICBjb25zdCBNb3Zl
T3BlcmFuZHMmIG1vdmVPcGVyYW5kcyA9IG1fY29hbGVzY2luZ0NhbmRpZGF0ZXNbbW92ZUluZGV4
XTsKKyAgICAgICAgSW5kZXhUeXBlIHUgPSBnZXRBbGlhcyhtb3ZlT3BlcmFuZHMuc3JjSW5kZXgp
OworICAgICAgICBJbmRleFR5cGUgdiA9IGdldEFsaWFzKG1vdmVPcGVyYW5kcy5kc3RJbmRleCk7
CisKKyAgICAgICAgaWYgKGlzUHJlY29sb3JlZCh2KSkKKyAgICAgICAgICAgIHN0ZDo6c3dhcCh1
LCB2KTsKKworICAgICAgICBpZiAodHJhY2VEZWJ1ZykKKyAgICAgICAgICAgIGRhdGFMb2coIkNv
YWxlc2NpbmcgbW92ZSBhdCBpbmRleCAiLCBtb3ZlSW5kZXgsICIgdSA9ICIsIHUsICIgdiA9ICIs
IHYsICJcbiIpOworCisgICAgICAgIGlmICh1ID09IHYpIHsKKyAgICAgICAgICAgIGFkZFdvcmtM
aXN0KHUpOworCisgICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKKyAgICAgICAgICAgICAgICBk
YXRhTG9nKCIgICAgQ29hbGVzY2VkXG4iKTsKKyAgICAgICAgfSBlbHNlIGlmIChpc1ByZWNvbG9y
ZWQodikKKyAgICAgICAgICAgIHx8IGhhc0ludGVyZmVyZW5jZUVkZ2UoSW50ZXJmZXJlbmNlRWRn
ZSh1LCB2KSkKKyAgICAgICAgICAgIHx8ICh1ID09IG1fZnJhbWVQb2ludGVySW5kZXggJiYgbV9p
bnRlcmZlcmVzV2l0aEZyYW1lUG9pbnRlci5xdWlja0dldCh2KSkpIHsKKyAgICAgICAgICAgIGFk
ZFdvcmtMaXN0KHUpOworICAgICAgICAgICAgYWRkV29ya0xpc3Qodik7CisKKyAgICAgICAgICAg
IGlmICh0cmFjZURlYnVnKQorICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICBDb25zdHJhaW5l
ZFxuIik7CisgICAgICAgIH0gZWxzZSBpZiAoY2FuQmVTYWZlbHlDb2FsZXNjZWQodSwgdikpIHsK
KyAgICAgICAgICAgIGNvbWJpbmUodSwgdik7CisgICAgICAgICAgICBhZGRXb3JrTGlzdCh1KTsK
KyAgICAgICAgICAgIG1faGFzQ29hbGVzY2VkTm9uVHJpdmlhbE1vdmUgPSB0cnVlOworCisgICAg
ICAgICAgICBpZiAodHJhY2VEZWJ1ZykKKyAgICAgICAgICAgICAgICBkYXRhTG9nKCIgICAgU2Fm
ZSBDb2FsZXNjaW5nXG4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1fYWN0aXZl
TW92ZXMucXVpY2tTZXQobW92ZUluZGV4KTsKKyAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQor
ICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICBGYWlsZWQgY29hbGVzY2luZywgYWRkZWQgdG8g
YWN0aXZlIG1vdmVzLlxuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGFkZFdvcmtM
aXN0KEluZGV4VHlwZSB0bXBJbmRleCkKKyAgICB7CisgICAgICAgIGlmICghaXNQcmVjb2xvcmVk
KHRtcEluZGV4KSAmJiBtX2RlZ3JlZXNbdG1wSW5kZXhdIDwgcmVnaXN0ZXJDb3VudCgpICYmICFp
c01vdmVSZWxhdGVkKHRtcEluZGV4KSkgeworICAgICAgICAgICAgbV9mcmVlemVXb3JrbGlzdC5y
ZW1vdmUodG1wSW5kZXgpOworICAgICAgICAgICAgbV9zaW1wbGlmeVdvcmtsaXN0LmFwcGVuZCh0
bXBJbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGNvbWJpbmUoSW5kZXhUeXBl
IHUsIEluZGV4VHlwZSB2KQorICAgIHsKKyAgICAgICAgaWYgKCFtX2ZyZWV6ZVdvcmtsaXN0LnJl
bW92ZSh2KSkKKyAgICAgICAgICAgIG1fc3BpbGxXb3JrbGlzdC5xdWlja0NsZWFyKHYpOworCisg
ICAgICAgIEFTU0VSVCghbV9jb2FsZXNjZWRUbXBzW3ZdKTsKKyAgICAgICAgbV9jb2FsZXNjZWRU
bXBzW3ZdID0gdTsKKworICAgICAgICBhdXRvJiB2TW92ZXMgPSBtX21vdmVMaXN0W3ZdOworICAg
ICAgICBtX21vdmVMaXN0W3VdLmFkZCh2TW92ZXMuYmVnaW4oKSwgdk1vdmVzLmVuZCgpKTsKKwor
ICAgICAgICBmb3JFYWNoQWRqYWNlbnQodiwgW3RoaXMsIHVdIChJbmRleFR5cGUgYWRqYWNlbnRU
bXBJbmRleCkgeworICAgICAgICAgICAgaWYgKGFkZEVkZ2VEaXN0aW5jdFdpdGhvdXREZWdyZWVD
aGFuZ2UoYWRqYWNlbnRUbXBJbmRleCwgdSkpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSBh
ZGRlZCBhIG5ldyBlZGdlIGJldHdlZW4gdGhlIGFkamFjZW50VG1wIGFuZCB1LCBpdCByZXBsYWNl
cyB0aGUgZWRnZQorICAgICAgICAgICAgICAgIC8vIHRoYXQgZXhpc3RlZCB3aXRoIHYuCisgICAg
ICAgICAgICAgICAgLy8gVGhlIGRlZ3JlZSBvZiBhZGphY2VudFRtcCByZW1haW5zIHRoZSBzYW1l
IHNpbmNlIHRoZSBlZGdlIGp1c3QgY2hhbmdlZCBmcm9tIHUgdG8gdi4KKyAgICAgICAgICAgICAg
ICAvLyBBbGwgd2UgbmVlZCB0byBkbyBpcyB1cGRhdGUgdGhlIGRlZ3JlZSBvZiB1LgorICAgICAg
ICAgICAgICAgIGlmICghaXNQcmVjb2xvcmVkKHUpKQorICAgICAgICAgICAgICAgICAgICBtX2Rl
Z3JlZXNbdV0rKzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gSWYg
d2UgYWxyZWFkeSBoYWQgYW4gZWRnZSBiZXR3ZWVuIHRoZSBhZGphY2VudFRtcCBhbmQgdSwgdGhl
IGRlZ3JlZSBvZiB1CisgICAgICAgICAgICAgICAgLy8gaXMgYWxyZWFkeSBjb3JyZWN0LiBUaGUg
ZGVncmVlIG9mIHRoZSBhZGphY2VudFRtcCBkZWNyZWFzZXMgc2luY2UgdGhlIGVkZ2UKKyAgICAg
ICAgICAgICAgICAvLyB3aXRoIHYgaXMgbm8gbG9uZ2VyIHJlbGV2YW50ICh3ZSBjYW4gdGhpbmsg
b2YgaXQgYXMgbWVyZ2VkIHdpdGggdGhlIGVkZ2Ugd2l0aCB1KS4KKyAgICAgICAgICAgICAgICBk
ZWNyZW1lbnREZWdyZWUoYWRqYWNlbnRUbXBJbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAg
IH0pOworCisgICAgICAgIGlmIChtX2ZyYW1lUG9pbnRlckluZGV4ICYmIG1faW50ZXJmZXJlc1dp
dGhGcmFtZVBvaW50ZXIucXVpY2tHZXQodikpCisgICAgICAgICAgICBtX2ludGVyZmVyZXNXaXRo
RnJhbWVQb2ludGVyLnF1aWNrU2V0KHUpOworCisgICAgICAgIGlmIChtX2RlZ3JlZXNbdV0gPj0g
cmVnaXN0ZXJDb3VudCgpICYmIG1fZnJlZXplV29ya2xpc3QucmVtb3ZlKHUpKQorICAgICAgICAg
ICAgYWRkVG9TcGlsbCh1KTsKKyAgICB9CisKKyAgICB2b2lkIGZyZWV6ZSgpCisgICAgeworICAg
ICAgICBJbmRleFR5cGUgdmljdGltSW5kZXggPSBtX2ZyZWV6ZVdvcmtsaXN0LnRha2VBbnkoKTsK
KyAgICAgICAgQVNTRVJUX1dJVEhfTUVTU0FHRShnZXRBbGlhcyh2aWN0aW1JbmRleCkgPT0gdmlj
dGltSW5kZXgsICJjb2FsZXNjZSgpIHNob3VsZCBub3QgbGVhdmUgYWxpYXNlZCBUbXAgaW4gdGhl
IHdvcmtsaXN0LiIpOworICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuYXBwZW5kKHZpY3RpbUlu
ZGV4KTsKKyAgICAgICAgZnJlZXplTW92ZXModmljdGltSW5kZXgpOworICAgIH0KKworICAgIHZv
aWQgZnJlZXplTW92ZXMoSW5kZXhUeXBlIHRtcEluZGV4KQorICAgIHsKKyAgICAgICAgZm9yRWFj
aE5vZGVNb3Zlcyh0bXBJbmRleCwgW3RoaXMsIHRtcEluZGV4XSAoSW5kZXhUeXBlIG1vdmVJbmRl
eCkgeworICAgICAgICAgICAgaWYgKCFtX2FjdGl2ZU1vdmVzLnF1aWNrQ2xlYXIobW92ZUluZGV4
KSkKKyAgICAgICAgICAgICAgICBtX3dvcmtsaXN0TW92ZXMudGFrZU1vdmUobW92ZUluZGV4KTsK
KworICAgICAgICAgICAgY29uc3QgTW92ZU9wZXJhbmRzJiBtb3ZlT3BlcmFuZHMgPSBtX2NvYWxl
c2NpbmdDYW5kaWRhdGVzW21vdmVJbmRleF07CisgICAgICAgICAgICBJbmRleFR5cGUgc3JjVG1w
SW5kZXggPSBtb3ZlT3BlcmFuZHMuc3JjSW5kZXg7CisgICAgICAgICAgICBJbmRleFR5cGUgZHN0
VG1wSW5kZXggPSBtb3ZlT3BlcmFuZHMuZHN0SW5kZXg7CisKKyAgICAgICAgICAgIEluZGV4VHlw
ZSBvcmlnaW5hbE90aGVyVG1wID0gc3JjVG1wSW5kZXggIT0gdG1wSW5kZXggPyBzcmNUbXBJbmRl
eCA6IGRzdFRtcEluZGV4OworICAgICAgICAgICAgSW5kZXhUeXBlIG90aGVyVG1wSW5kZXggPSBn
ZXRBbGlhcyhvcmlnaW5hbE90aGVyVG1wKTsKKyAgICAgICAgICAgIGlmIChtX2RlZ3JlZXNbb3Ro
ZXJUbXBJbmRleF0gPCByZWdpc3RlckNvdW50KCkgJiYgIWlzTW92ZVJlbGF0ZWQob3RoZXJUbXBJ
bmRleCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobV9mcmVlemVXb3JrbGlzdC5yZW1vdmUob3Ro
ZXJUbXBJbmRleCkpCisgICAgICAgICAgICAgICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5hcHBl
bmQob3RoZXJUbXBJbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKwor
ICAgIHZvaWQgZGVjcmVtZW50RGVncmVlKEluZGV4VHlwZSB0bXBJbmRleCkKKyAgICB7CisgICAg
ICAgIEFTU0VSVChtX2RlZ3JlZXNbdG1wSW5kZXhdKTsKKworICAgICAgICB1bnNpZ25lZCBvbGRE
ZWdyZWUgPSBtX2RlZ3JlZXNbdG1wSW5kZXhdLS07CisgICAgICAgIGlmIChvbGREZWdyZWUgPT0g
cmVnaXN0ZXJDb3VudCgpKSB7CisgICAgICAgICAgICBlbmFibGVNb3Zlc09uVmFsdWVBbmRBZGph
Y2VudHModG1wSW5kZXgpOworICAgICAgICAgICAgbV9zcGlsbFdvcmtsaXN0LnF1aWNrQ2xlYXIo
dG1wSW5kZXgpOworICAgICAgICAgICAgaWYgKGlzTW92ZVJlbGF0ZWQodG1wSW5kZXgpKQorICAg
ICAgICAgICAgICAgIG1fZnJlZXplV29ya2xpc3QuYWRkKHRtcEluZGV4KTsKKyAgICAgICAgICAg
IGVsc2UKKyAgICAgICAgICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuYXBwZW5kKHRtcEluZGV4
KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgc2VsZWN0U3BpbGwoKQorICAgIHsKKyAg
ICAgICAgSW5kZXhUeXBlIHZpY3RpbUluZGV4ID0gQmFzZTo6c2VsZWN0U3BpbGwoKTsKKyAgICAg
ICAgbV9zcGlsbFdvcmtsaXN0LnF1aWNrQ2xlYXIodmljdGltSW5kZXgpOworICAgICAgICBtX3Np
bXBsaWZ5V29ya2xpc3QuYXBwZW5kKHZpY3RpbUluZGV4KTsKKyAgICAgICAgZnJlZXplTW92ZXMo
dmljdGltSW5kZXgpOworICAgIH0KIAotICAgIC8vIFRoZSBpbnRlcmZlcmVuY2UgZ3JhcGguCi0g
ICAgSGFzaFNldDxJbnRlcmZlcmVuY2VFZGdlLCBJbnRlcmZlcmVuY2VFZGdlSGFzaCwgSW50ZXJm
ZXJlbmNlRWRnZUhhc2hUcmFpdHM+IG1faW50ZXJmZXJlbmNlRWRnZXM7Ci0gICAgVmVjdG9yPFZl
Y3RvcjxJbmRleFR5cGUsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93LCA0PiwgMCwgVW5zYWZlVmVj
dG9yT3ZlcmZsb3c+IG1fYWRqYWNlbmN5TGlzdDsKLSAgICBWZWN0b3I8SW5kZXhUeXBlLCAwLCBV
bnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9kZWdyZWVzOworICAgIHZvaWQgYXNzaWduQ29sb3JzKCkK
KyAgICB7CisgICAgICAgIEFTU0VSVChtX2ZyZWV6ZVdvcmtsaXN0LmlzRW1wdHkoKSk7CisgICAg
ICAgIG1fd29ya2xpc3RNb3Zlcy5jbGVhcigpOworICAgICAgICBCYXNlOjphc3NpZ25Db2xvcnMo
KTsKKyAgICB9CiAKLSAgICAvLyBJbnN0ZWFkIG9mIGtlZXBpbmcgdHJhY2sgb2YgdGhlIG1vdmUg
aW5zdHJ1Y3Rpb25zLCB3ZSBqdXN0IGtlZXAgdGhlaXIgb3BlcmFuZHMgYXJvdW5kIGFuZCB1c2Ug
dGhlIGluZGV4Ci0gICAgLy8gaW4gdGhlIHZlY3RvciBhcyB0aGUgImlkZW50aWZpZXIiIGZvciB0
aGUgbW92ZS4KLSAgICBzdHJ1Y3QgTW92ZU9wZXJhbmRzIHsKLSAgICAgICAgSW5kZXhUeXBlIHNy
Y0luZGV4OwotICAgICAgICBJbmRleFR5cGUgZHN0SW5kZXg7Ci0gICAgfTsKLSAgICBWZWN0b3I8
TW92ZU9wZXJhbmRzLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9jb2FsZXNjaW5nQ2FuZGlk
YXRlczsKIAotICAgIC8vIExpc3Qgb2YgZXZlcnkgbW92ZSBpbnN0cnVjdGlvbiBhc3NvY2lhdGVk
IHdpdGggYSBUbXAuCi0gICAgVmVjdG9yPEhhc2hTZXQ8SW5kZXhUeXBlLCB0eXBlbmFtZSBEZWZh
dWx0SGFzaDxJbmRleFR5cGU+OjpIYXNoLCBXVEY6OlVuc2lnbmVkV2l0aFplcm9LZXlIYXNoVHJh
aXRzPEluZGV4VHlwZT4+PiBtX21vdmVMaXN0OworICAgIGJvb2wgaXNNb3ZlUmVsYXRlZChJbmRl
eFR5cGUgdG1wSW5kZXgpCisgICAgeworICAgICAgICBmb3IgKHVuc2lnbmVkIG1vdmVJbmRleCA6
IG1fbW92ZUxpc3RbdG1wSW5kZXhdKSB7CisgICAgICAgICAgICBpZiAobV9hY3RpdmVNb3Zlcy5x
dWlja0dldChtb3ZlSW5kZXgpIHx8IG1fd29ya2xpc3RNb3Zlcy5jb250YWlucyhtb3ZlSW5kZXgp
KQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICB9CiAKLSAgICAvLyBDb2xvcnMuCi0gICAgVmVjdG9yPFJlZywgMCwgVW5z
YWZlVmVjdG9yT3ZlcmZsb3c+IG1fY29sb3JlZFRtcDsKLSAgICBWZWN0b3I8SW5kZXhUeXBlPiBt
X3NwaWxsZWRUbXBzOworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0aW9uPgorICAgIHZvaWQg
Zm9yRWFjaE5vZGVNb3ZlcyhJbmRleFR5cGUgdG1wSW5kZXgsIEZ1bmN0aW9uIGZ1bmN0aW9uKQor
ICAgIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBtb3ZlSW5kZXggOiBtX21vdmVMaXN0W3RtcElu
ZGV4XSkgeworICAgICAgICAgICAgaWYgKG1fYWN0aXZlTW92ZXMucXVpY2tHZXQobW92ZUluZGV4
KSB8fCBtX3dvcmtsaXN0TW92ZXMuY29udGFpbnMobW92ZUluZGV4KSkKKyAgICAgICAgICAgICAg
ICBmdW5jdGlvbihtb3ZlSW5kZXgpOworICAgICAgICB9CisgICAgfQogCi0gICAgLy8gVmFsdWVz
IHRoYXQgaGF2ZSBiZWVuIGNvYWxlc2NlZCB3aXRoIGFuIG90aGVyIHZhbHVlLgotICAgIFZlY3Rv
cjxJbmRleFR5cGUsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX2NvYWxlc2NlZFRtcHM7Cisg
ICAgdm9pZCBlbmFibGVNb3Zlc09uVmFsdWUoSW5kZXhUeXBlIHRtcEluZGV4KQorICAgIHsKKyAg
ICAgICAgZm9yICh1bnNpZ25lZCBtb3ZlSW5kZXggOiBtX21vdmVMaXN0W3RtcEluZGV4XSkgewor
ICAgICAgICAgICAgaWYgKG1fYWN0aXZlTW92ZXMucXVpY2tDbGVhcihtb3ZlSW5kZXgpKQorICAg
ICAgICAgICAgICAgIG1fd29ya2xpc3RNb3Zlcy5yZXR1cm5Nb3ZlKG1vdmVJbmRleCk7CisgICAg
ICAgIH0KKyAgICB9CiAKLSAgICAvLyBUaGUgc3RhY2sgb2YgVG1wIHJlbW92ZWQgZnJvbSB0aGUg
Z3JhcGggYW5kIHJlYWR5IGZvciBjb2xvcmluZy4KLSAgICBCaXRWZWN0b3IgbV9pc09uU2VsZWN0
U3RhY2s7Ci0gICAgVmVjdG9yPEluZGV4VHlwZT4gbV9zZWxlY3RTdGFjazsKKyAgICB2b2lkIGVu
YWJsZU1vdmVzT25WYWx1ZUFuZEFkamFjZW50cyhJbmRleFR5cGUgdG1wSW5kZXgpCisgICAgewor
ICAgICAgICBlbmFibGVNb3Zlc09uVmFsdWUodG1wSW5kZXgpOwogCi0gICAgSW5kZXhUeXBlIG1f
ZnJhbWVQb2ludGVySW5kZXggeyAwIH07Ci0gICAgQml0VmVjdG9yIG1faW50ZXJmZXJlc1dpdGhG
cmFtZVBvaW50ZXI7CisgICAgICAgIGZvckVhY2hBZGphY2VudCh0bXBJbmRleCwgW3RoaXNdIChJ
bmRleFR5cGUgYWRqYWNlbnRUbXBJbmRleCkgeworICAgICAgICAgICAgZW5hYmxlTW92ZXNPblZh
bHVlKGFkamFjZW50VG1wSW5kZXgpOworICAgICAgICB9KTsKKyAgICB9CiAKICAgICBzdHJ1Y3Qg
T3JkZXJlZE1vdmVTZXQgewogICAgICAgICB1bnNpZ25lZCBhZGRNb3ZlKCkKQEAgLTcwMiw2ICsx
Mjc3LDExIEBAIHByb3RlY3RlZDoKICAgICAgICAgICAgIG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5j
bGVhcigpOwogICAgICAgICB9CiAKKyAgICAgICAgdW5zaWduZWQgdG90YWxOdW1iZXJPZk1vdmVz
KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1fbW92ZUxpc3Quc2l6ZSgpICsgbV9s
b3dQcmlvcml0eU1vdmVMaXN0LnNpemUoKTsKKyAgICAgICAgfQorCiAgICAgcHJpdmF0ZToKICAg
ICAgICAgVmVjdG9yPHVuc2lnbmVkLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9wb3NpdGlv
bkluTW92ZUxpc3Q7CiAgICAgICAgIFZlY3Rvcjx1bnNpZ25lZCwgMCwgVW5zYWZlVmVjdG9yT3Zl
cmZsb3c+IG1fbW92ZUxpc3Q7CkBAIC03MDksNTAgKzEyODksNzkgQEAgcHJvdGVjdGVkOgogICAg
ICAgICB1bnNpZ25lZCBtX2ZpcnN0TG93UHJpb3JpdHlNb3ZlSW5kZXggeyAwIH07CiAgICAgfTsK
IAorICAgIHZvaWQgZHVtcFdvcmtMaXN0cyhQcmludFN0cmVhbSYgb3V0KQorICAgIHsKKyAgICAg
ICAgb3V0LnByaW50KCJTaW1wbGlmeSB3b3JrIGxpc3Q6XG4iKTsKKyAgICAgICAgZm9yICh1bnNp
Z25lZCB0bXBJbmRleCA6IG1fc2ltcGxpZnlXb3JrbGlzdCkKKyAgICAgICAgICAgIG91dC5wcmlu
dCgiICAgICIsIFRtcE1hcHBlcjo6dG1wRnJvbUFic29sdXRlSW5kZXgodG1wSW5kZXgpLCAiXG4i
KTsKKyAgICAgICAgb3V0LnByaW50ZigiTW92ZXMgd29yayBsaXN0IGlzIGVtcHR5PyAlZFxuIiwg
bV93b3JrbGlzdE1vdmVzLmlzRW1wdHkoKSk7CisgICAgICAgIG91dC5wcmludCgiRnJlZXplIHdv
cmsgbGlzdDpcbiIpOworICAgICAgICBmb3IgKHVuc2lnbmVkIHRtcEluZGV4IDogbV9mcmVlemVX
b3JrbGlzdCkKKyAgICAgICAgICAgIG91dC5wcmludCgiICAgICIsIFRtcE1hcHBlcjo6dG1wRnJv
bUFic29sdXRlSW5kZXgodG1wSW5kZXgpLCAiXG4iKTsKKyAgICAgICAgb3V0LnByaW50KCJTcGls
bCB3b3JrIGxpc3Q6XG4iKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCB0bXBJbmRleCA6IG1fc3Bp
bGxXb3JrbGlzdCkKKyAgICAgICAgICAgIG91dC5wcmludCgiICAgICIsIFRtcE1hcHBlcjo6dG1w
RnJvbUFic29sdXRlSW5kZXgodG1wSW5kZXgpLCAiXG4iKTsKKyAgICB9CisKICAgICAvLyBXb3Jr
IGxpc3RzLgorICAgIC8vIExvdy1kZWdyZWUsIE1vdmUgcmVsYXRlZC4KKyAgICBIYXNoU2V0PElu
ZGV4VHlwZT4gbV9mcmVlemVXb3JrbGlzdDsKICAgICAvLyBTZXQgb2YgIm1vdmUiIGVuYWJsZWQg
Zm9yIHBvc3NpYmxlIGNvYWxlc2NpbmcuCiAgICAgT3JkZXJlZE1vdmVTZXQgbV93b3JrbGlzdE1v
dmVzOwogICAgIC8vIFNldCBvZiAibW92ZSIgbm90IHlldCByZWFkeSBmb3IgY29hbGVzY2luZy4K
ICAgICBCaXRWZWN0b3IgbV9hY3RpdmVNb3ZlczsKLSAgICAvLyBMb3ctZGVncmVlLCBub24tTW92
ZSByZWxhdGVkLgotICAgIFZlY3RvcjxJbmRleFR5cGU+IG1fc2ltcGxpZnlXb3JrbGlzdDsKLSAg
ICAvLyBIaWdoLWRlZ3JlZSBUbXAuCi0gICAgSGFzaFNldDxJbmRleFR5cGU+IG1fc3BpbGxXb3Jr
bGlzdDsKLSAgICAvLyBMb3ctZGVncmVlLCBNb3ZlIHJlbGF0ZWQuCi0gICAgSGFzaFNldDxJbmRl
eFR5cGU+IG1fZnJlZXplV29ya2xpc3Q7Ci0KLSAgICBib29sIG1faGFzU2VsZWN0ZWRTcGlsbCB7
IGZhbHNlIH07Ci0gICAgYm9vbCBtX2hhc0NvYWxlc2NlZE5vblRyaXZpYWxNb3ZlIHsgZmFsc2Ug
fTsKLQotICAgIC8vIFRoZSBtYXBwaW5nIG9mIFRtcCB0byB0aGVpciBhbGlhcyBmb3IgTW92ZXMg
dGhhdCBhcmUgYWx3YXlzIGNvYWxlc2NpbmcgcmVnYXJkbGVzcyBvZiBzcGlsbGluZy4KLSAgICBW
ZWN0b3I8SW5kZXhUeXBlLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9jb2FsZXNjZWRUbXBz
QXRTcGlsbDsKLSAgICAKLSAgICBjb25zdCBIYXNoU2V0PHVuc2lnbmVkPiYgbV91bnNwaWxsYWJs
ZVRtcHM7CiB9OwogCiAvLyBUaGlzIHBlcmZvcm0gYWxsIHRoZSB0YXNrcyB0aGF0IGFyZSBzcGVj
aWZpYyB0byBjZXJ0YWluIHJlZ2lzdGVyIHR5cGUuCi10ZW1wbGF0ZTxBcmc6OlR5cGUgdHlwZT4K
LWNsYXNzIENvbG9yaW5nQWxsb2NhdG9yIDogcHVibGljIEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0
b3I8dW5zaWduZWQ+IHsKK3RlbXBsYXRlPEFyZzo6VHlwZSB0eXBlLCB0ZW1wbGF0ZTx0eXBlbmFt
ZSwgdHlwZW5hbWU+IGNsYXNzIEFsbG9jYXRvclR5cGU+CitjbGFzcyBDb2xvcmluZ0FsbG9jYXRv
ciA6IHB1YmxpYyBBbGxvY2F0b3JUeXBlPHVuc2lnbmVkLCBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBl
Pj4geworICAgIHVzaW5nIFRtcE1hcHBlciA9IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OworICAg
IHVzaW5nIEJhc2UgPSBBbGxvY2F0b3JUeXBlPHVuc2lnbmVkLCBUbXBNYXBwZXI+OworICAgIHVz
aW5nIEJhc2U6Om1faXNPblNlbGVjdFN0YWNrOworICAgIHVzaW5nIEJhc2U6Om1fc2VsZWN0U3Rh
Y2s7CisgICAgdXNpbmcgQmFzZTo6bV9mcmFtZVBvaW50ZXJJbmRleDsKKyAgICB1c2luZyBCYXNl
OjptX2ludGVyZmVyZXNXaXRoRnJhbWVQb2ludGVyOworICAgIHVzaW5nIEJhc2U6Om1fc2ltcGxp
ZnlXb3JrbGlzdDsKKyAgICB1c2luZyBCYXNlOjptX3NwaWxsV29ya2xpc3Q7CisgICAgdXNpbmcg
QmFzZTo6bV9oYXNTZWxlY3RlZFNwaWxsOworICAgIHVzaW5nIEJhc2U6Om1faGFzQ29hbGVzY2Vk
Tm9uVHJpdmlhbE1vdmU7CisgICAgdXNpbmcgQmFzZTo6bV9kZWdyZWVzOworICAgIHVzaW5nIEJh
c2U6OnJlZ2lzdGVyQ291bnQ7CisgICAgdXNpbmcgQmFzZTo6bV9jb2FsZXNjZWRUbXBzOworICAg
IHVzaW5nIEJhc2U6Om1fbW92ZUxpc3Q7CisgICAgdXNpbmcgQmFzZTo6bV91c2VDb3VudHM7Cisg
ICAgdXNpbmcgQmFzZTo6bV9jb2FsZXNjZWRUbXBzQXRTcGlsbDsKKyAgICB1c2luZyBCYXNlOjpt
X3NwaWxsZWRUbXBzOworICAgIHVzaW5nIHR5cGVuYW1lIEJhc2U6Ok1vdmVPcGVyYW5kczsKKyAg
ICB1c2luZyBCYXNlOjptX2NvYWxlc2NpbmdDYW5kaWRhdGVzOworICAgIHVzaW5nIEJhc2U6Om1f
bGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4OworICAgIHVzaW5nIEJhc2U6Om1fY29sb3JlZFRt
cDsKKyAgICB1c2luZyBCYXNlOjptX2NvZGU7CisgICAgdXNpbmcgdHlwZW5hbWUgQmFzZTo6SW50
ZXJmZXJlbmNlRWRnZTsKKyAgICB1c2luZyBCYXNlOjptX3dvcmtsaXN0TW92ZXM7CisgICAgdXNp
bmcgQmFzZTo6aGFzSW50ZXJmZXJlbmNlRWRnZTsKKyAgICB1c2luZyBCYXNlOjpnZXRBbGlhczsK
KyAgICB1c2luZyBCYXNlOjphZGRFZGdlOworICAgIHVzaW5nIEJhc2U6Om1faW50ZXJmZXJlbmNl
RWRnZXM7CisKIHB1YmxpYzoKKwogICAgIENvbG9yaW5nQWxsb2NhdG9yKENvZGUmIGNvZGUsIFRt
cFdpZHRoJiB0bXBXaWR0aCwgY29uc3QgVXNlQ291bnRzPFRtcD4mIHVzZUNvdW50cywgY29uc3Qg
SGFzaFNldDx1bnNpZ25lZD4mIHVuc3BpbGxhYmxlVG1wKQotICAgICAgICA6IEFic3RyYWN0Q29s
b3JpbmdBbGxvY2F0b3I8dW5zaWduZWQ+KGNvZGUucmVnc0luUHJpb3JpdHlPcmRlcih0eXBlKSwg
QWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46Omxhc3RNYWNoaW5lUmVnaXN0ZXJJbmRleCgpLCB0bXBB
cnJheVNpemUoY29kZSksIHVuc3BpbGxhYmxlVG1wKQotICAgICAgICAsIG1fY29kZShjb2RlKQor
ICAgICAgICA6IEJhc2UoY29kZSwgY29kZS5yZWdzSW5Qcmlvcml0eU9yZGVyKHR5cGUpLCBUbXBN
YXBwZXI6Omxhc3RNYWNoaW5lUmVnaXN0ZXJJbmRleCgpLCB0bXBBcnJheVNpemUoY29kZSksIHVu
c3BpbGxhYmxlVG1wLCB1c2VDb3VudHMpCiAgICAgICAgICwgbV90bXBXaWR0aCh0bXBXaWR0aCkK
LSAgICAgICAgLCBtX3VzZUNvdW50cyh1c2VDb3VudHMpCiAgICAgewogICAgICAgICBpZiAodHlw
ZSA9PSBBcmc6OkdQKSB7Ci0gICAgICAgICAgICBtX2ZyYW1lUG9pbnRlckluZGV4ID0gQWJzb2x1
dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgoVG1wKE1hY3JvQXNzZW1ibGVyOjpmcmFt
ZVBvaW50ZXJSZWdpc3RlcikpOworICAgICAgICAgICAgbV9mcmFtZVBvaW50ZXJJbmRleCA9IFRt
cE1hcHBlcjo6YWJzb2x1dGVJbmRleChUbXAoTWFjcm9Bc3NlbWJsZXI6OmZyYW1lUG9pbnRlclJl
Z2lzdGVyKSk7CiAgICAgICAgICAgICBtX2ludGVyZmVyZXNXaXRoRnJhbWVQb2ludGVyLmVuc3Vy
ZVNpemUodG1wQXJyYXlTaXplKGNvZGUpKTsKICAgICAgICAgfQogCiAgICAgICAgIGluaXRpYWxp
emVQcmVjb2xvcmVkVG1wKCk7CiAgICAgICAgIGJ1aWxkKCk7Ci0gICAgICAgIGFsbG9jYXRlKCk7
CiAgICAgfQogCiAgICAgVG1wIGdldEFsaWFzKFRtcCB0bXApIGNvbnN0CiAgICAgewotICAgICAg
ICByZXR1cm4gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KGdl
dEFsaWFzKEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHRtcCkpKTsKKyAg
ICAgICAgcmV0dXJuIFRtcE1hcHBlcjo6dG1wRnJvbUFic29sdXRlSW5kZXgoZ2V0QWxpYXMoVG1w
TWFwcGVyOjphYnNvbHV0ZUluZGV4KHRtcCkpKTsKICAgICB9CiAKICAgICAvLyBUaGlzIHRlbGxz
IHlvdSBpZiBhIE1vdmUgd2lsbCBiZSBjb2FsZXNjYWJsZSBpZiB0aGUgc3JjIGFuZCBkc3QgZW5k
IHVwIG1hdGNoaW5nLiBUaGlzIG1ldGhvZApAQCAtNzc1LDExICsxMzg0LDExIEBAIHB1YmxpYzoK
ICAgICAgICAgaWYgKG1fY29hbGVzY2VkVG1wc0F0U3BpbGwuaXNFbXB0eSgpKQogICAgICAgICAg
ICAgcmV0dXJuIHRtcDsKIAotICAgICAgICB1bnNpZ25lZCBhbGlhc0luZGV4ID0gQWJzb2x1dGVU
bXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodG1wKTsKKyAgICAgICAgdW5zaWduZWQgYWxp
YXNJbmRleCA9IFRtcE1hcHBlcjo6YWJzb2x1dGVJbmRleCh0bXApOwogICAgICAgICB3aGlsZSAo
dW5zaWduZWQgbmV4dEFsaWFzSW5kZXggPSBtX2NvYWxlc2NlZFRtcHNBdFNwaWxsW2FsaWFzSW5k
ZXhdKQogICAgICAgICAgICAgYWxpYXNJbmRleCA9IG5leHRBbGlhc0luZGV4OwogCi0gICAgICAg
IFRtcCBhbGlhcyA9IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRl
eChhbGlhc0luZGV4KTsKKyAgICAgICAgVG1wIGFsaWFzID0gVG1wTWFwcGVyOjp0bXBGcm9tQWJz
b2x1dGVJbmRleChhbGlhc0luZGV4KTsKIAogICAgICAgICBBU1NFUlRfV0lUSF9NRVNTQUdFKCFt
X3NwaWxsZWRUbXBzLmNvbnRhaW5zKGFsaWFzSW5kZXgpIHx8IGFsaWFzID09IHRtcCwgIlRoZSBh
bGlhc2VzIGF0IHNwaWxsIHNob3VsZCBhbHdheXMgYmUgY29sb3JhYmxlLiBTb21ldGhpbmcgd2Vu
dCBob3JyaWJseSB3cm9uZy4iKTsKIApAQCAtNzk0LDcgKzE0MDMsNyBAQCBwdWJsaWM6CiAgICAg
ICAgIHsKICAgICAgICAgfQogCi0gICAgICAgIFRtcCBvcGVyYXRvciooKSBjb25zdCB7IHJldHVy
biBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgoKm1faW5kZXhJ
dGVyYXRvcik7IH0KKyAgICAgICAgVG1wIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIFRtcE1h
cHBlcjo6dG1wRnJvbUFic29sdXRlSW5kZXgoKm1faW5kZXhJdGVyYXRvcik7IH0KICAgICAgICAg
SW5kZXhUb1RtcEl0ZXJhdG9yQWRhcHRvciYgb3BlcmF0b3IrKygpIHsgKyttX2luZGV4SXRlcmF0
b3I7IHJldHVybiAqdGhpczsgfQogCiAgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJbmRl
eFRvVG1wSXRlcmF0b3JBZGFwdG9yJiBvdGhlcikgY29uc3QKQEAgLTg0Myw3ICsxNDUyLDcgQEAg
cHVibGljOgogICAgICAgICBBU1NFUlQobV9jb2xvcmVkVG1wLnNpemUoKSk7CiAgICAgICAgIEFT
U0VSVCh0bXAuaXNHUCgpID09ICh0eXBlID09IEFyZzo6R1ApKTsKIAotICAgICAgICBSZWcgcmVn
ID0gbV9jb2xvcmVkVG1wW0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHRt
cCldOworICAgICAgICBSZWcgcmVnID0gbV9jb2xvcmVkVG1wW1RtcE1hcHBlcjo6YWJzb2x1dGVJ
bmRleCh0bXApXTsKICAgICAgICAgaWYgKCFyZWcpIHsKICAgICAgICAgICAgIGRhdGFMb2coIkZB
VEFMOiBObyBjb2xvciBmb3IgIiwgdG1wLCAiXG4iKTsKICAgICAgICAgICAgIGRhdGFMb2coIkNv
ZGU6XG4iKTsKQEAgLTg1MywxOCArMTQ2MiwxOCBAQCBwdWJsaWM6CiAgICAgICAgIHJldHVybiBy
ZWc7CiAgICAgfQogCi1wcml2YXRlOgorcHJvdGVjdGVkOgogICAgIHN0YXRpYyB1bnNpZ25lZCB0
bXBBcnJheVNpemUoQ29kZSYgY29kZSkKICAgICB7CiAgICAgICAgIHVuc2lnbmVkIG51bVRtcHMg
PSBjb2RlLm51bVRtcHModHlwZSk7Ci0gICAgICAgIHJldHVybiBBYnNvbHV0ZVRtcE1hcHBlcjx0
eXBlPjo6YWJzb2x1dGVJbmRleChudW1UbXBzKTsKKyAgICAgICAgcmV0dXJuIFRtcE1hcHBlcjo6
YWJzb2x1dGVJbmRleChudW1UbXBzKTsKICAgICB9CiAKICAgICB2b2lkIGluaXRpYWxpemVQcmVj
b2xvcmVkVG1wKCkKICAgICB7CiAgICAgICAgIG1fY29sb3JlZFRtcC5yZXNpemUobV9sYXN0UHJl
Y29sb3JlZFJlZ2lzdGVySW5kZXggKyAxKTsKICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMTsg
aSA8PSBtX2xhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleDsgKytpKSB7Ci0gICAgICAgICAgICBU
bXAgdG1wID0gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KGkp
OworICAgICAgICAgICAgVG1wIHRtcCA9IFRtcE1hcHBlcjo6dG1wRnJvbUFic29sdXRlSW5kZXgo
aSk7CiAgICAgICAgICAgICBBU1NFUlQodG1wLmlzUmVnKCkpOwogICAgICAgICAgICAgbV9jb2xv
cmVkVG1wW2ldID0gdG1wLnJlZygpOwogICAgICAgICB9CkBAIC04ODQsMTAgKzE0OTMsMTAgQEAg
cHJpdmF0ZToKICAgICAgICAgaWYgKGxlZnRUbXAuaXNHUCgpICE9ICh0eXBlID09IEFyZzo6R1Ap
IHx8IHJpZ2h0VG1wLmlzR1AoKSAhPSAodHlwZSA9PSBBcmc6OkdQKSkKICAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKIAotICAgICAgICB1bnNpZ25lZCBsZWZ0SW5kZXggPSBBYnNvbHV0ZVRtcE1h
cHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChsZWZ0VG1wKTsKLSAgICAgICAgdW5zaWduZWQgcmln
aHRJbmRleCA9IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHJpZ2h0VG1w
KTsKKyAgICAgICAgdW5zaWduZWQgbGVmdEluZGV4ID0gVG1wTWFwcGVyOjphYnNvbHV0ZUluZGV4
KGxlZnRUbXApOworICAgICAgICB1bnNpZ25lZCByaWdodEluZGV4ID0gVG1wTWFwcGVyOjphYnNv
bHV0ZUluZGV4KHJpZ2h0VG1wKTsKIAotICAgICAgICByZXR1cm4gIW1faW50ZXJmZXJlbmNlRWRn
ZXMuY29udGFpbnMoSW50ZXJmZXJlbmNlRWRnZShsZWZ0SW5kZXgsIHJpZ2h0SW5kZXgpKTsKKyAg
ICAgICAgcmV0dXJuICFoYXNJbnRlcmZlcmVuY2VFZGdlKEludGVyZmVyZW5jZUVkZ2UobGVmdElu
ZGV4LCByaWdodEluZGV4KSk7CiAgICAgfQogCiAgICAgdm9pZCBhZGRUb0xvd1ByaW9yaXR5Q29h
bGVzY2luZ0NhbmRpZGF0ZXMoQXJnIGxlZnQsIEFyZyByaWdodCkKQEAgLTg5Niw4ICsxNTA1LDgg
QEAgcHJpdmF0ZToKICAgICAgICAgVG1wIGxlZnRUbXAgPSBsZWZ0LnRtcCgpOwogICAgICAgICBU
bXAgcmlnaHRUbXAgPSByaWdodC50bXAoKTsKIAotICAgICAgICB1bnNpZ25lZCBsZWZ0SW5kZXgg
PSBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChsZWZ0VG1wKTsKLSAgICAg
ICAgdW5zaWduZWQgcmlnaHRJbmRleCA9IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0
ZUluZGV4KHJpZ2h0VG1wKTsKKyAgICAgICAgdW5zaWduZWQgbGVmdEluZGV4ID0gVG1wTWFwcGVy
OjphYnNvbHV0ZUluZGV4KGxlZnRUbXApOworICAgICAgICB1bnNpZ25lZCByaWdodEluZGV4ID0g
VG1wTWFwcGVyOjphYnNvbHV0ZUluZGV4KHJpZ2h0VG1wKTsKIAogICAgICAgICB1bnNpZ25lZCBu
ZXh0TW92ZUluZGV4ID0gbV9jb2FsZXNjaW5nQ2FuZGlkYXRlcy5zaXplKCk7CiAgICAgICAgIG1f
Y29hbGVzY2luZ0NhbmRpZGF0ZXMuYXBwZW5kKHsgbGVmdEluZGV4LCByaWdodEluZGV4IH0pOwpA
QCAtOTA1LDE1ICsxNTE0LDE1IEBAIHByaXZhdGU6CiAgICAgICAgIHVuc2lnbmVkIG5ld0luZGV4
SW5Xb3JrbGlzdCA9IG1fd29ya2xpc3RNb3Zlcy5hZGRMb3dQcmlvcml0eU1vdmUoKTsKICAgICAg
ICAgQVNTRVJUX1VOVVNFRChuZXdJbmRleEluV29ya2xpc3QsIG5ld0luZGV4SW5Xb3JrbGlzdCA9
PSBuZXh0TW92ZUluZGV4KTsKIAotICAgICAgICBBU1NFUlQobmV4dE1vdmVJbmRleCA8PSBtX2Fj
dGl2ZU1vdmVzLnNpemUoKSk7Ci0gICAgICAgIG1fYWN0aXZlTW92ZXMuZW5zdXJlU2l6ZShuZXh0
TW92ZUluZGV4ICsgMSk7Ci0KICAgICAgICAgbV9tb3ZlTGlzdFtsZWZ0SW5kZXhdLmFkZChuZXh0
TW92ZUluZGV4KTsKICAgICAgICAgbV9tb3ZlTGlzdFtyaWdodEluZGV4XS5hZGQobmV4dE1vdmVJ
bmRleCk7CiAgICAgfQogCiAgICAgdm9pZCBidWlsZCgpCiAgICAgeworICAgICAgICBtX2NvYWxl
c2NpbmdDYW5kaWRhdGVzLmNsZWFyKCk7CisgICAgICAgIG1fd29ya2xpc3RNb3Zlcy5jbGVhcigp
OworCiAgICAgICAgIFRtcExpdmVuZXNzPHR5cGU+IGxpdmVuZXNzKG1fY29kZSk7CiAgICAgICAg
IGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBtX2NvZGUpIHsKICAgICAgICAgICAgIHR5cGVuYW1l
IFRtcExpdmVuZXNzPHR5cGU+OjpMb2NhbENhbGMgbG9jYWxDYWxjKGxpdmVuZXNzLCBibG9jayk7
CkBAIC05MzIsNiArMTU0MSw3IEBAIHByaXZhdGU6CiAgICAgewogICAgICAgICBpZiAodHJhY2VE
ZWJ1ZykKICAgICAgICAgICAgIGRhdGFMb2coIkJ1aWxkaW5nIGJldHdlZW4gIiwgcG9pbnRlckR1
bXAocHJldkluc3QpLCAiIGFuZCAiLCBwb2ludGVyRHVtcChuZXh0SW5zdCksICI6XG4iKTsKKwog
ICAgICAgICBJbnN0Ojpmb3JFYWNoRGVmV2l0aEV4dHJhQ2xvYmJlcmVkUmVnczxUbXA+KAogICAg
ICAgICAgICAgcHJldkluc3QsIG5leHRJbnN0LAogICAgICAgICAgICAgWyZdIChjb25zdCBUbXAm
IGFyZywgQXJnOjpSb2xlLCBBcmc6OlR5cGUgYXJnVHlwZSwgQXJnOjpXaWR0aCkgewpAQCAtOTcx
LDE2ICsxNTgxLDE1IEBAIHByaXZhdGU6CiAgICAgICAgICAgICBBU1NFUlQodXNlVG1wKTsKIAog
ICAgICAgICAgICAgdW5zaWduZWQgbmV4dE1vdmVJbmRleCA9IG1fY29hbGVzY2luZ0NhbmRpZGF0
ZXMuc2l6ZSgpOwotICAgICAgICAgICAgbV9jb2FsZXNjaW5nQ2FuZGlkYXRlcy5hcHBlbmQoeyBB
YnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh1c2VUbXApLCBBYnNvbHV0ZVRt
cE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChkZWZUbXApIH0pOworICAgICAgICAgICAgbV9j
b2FsZXNjaW5nQ2FuZGlkYXRlcy5hcHBlbmQoeyBUbXBNYXBwZXI6OmFic29sdXRlSW5kZXgodXNl
VG1wKSwgVG1wTWFwcGVyOjphYnNvbHV0ZUluZGV4KGRlZlRtcCkgfSk7CisgICAgICAgICAgICBp
ZiAodHJhY2VEZWJ1ZykKKyAgICAgICAgICAgICAgICBkYXRhTG9nTG4oIk1vdmUgYXQgaW5kZXgg
IiwgbmV4dE1vdmVJbmRleCwgIiBpczogIiwgKnByZXZJbnN0KTsKIAogICAgICAgICAgICAgdW5z
aWduZWQgbmV3SW5kZXhJbldvcmtsaXN0ID0gbV93b3JrbGlzdE1vdmVzLmFkZE1vdmUoKTsKICAg
ICAgICAgICAgIEFTU0VSVF9VTlVTRUQobmV3SW5kZXhJbldvcmtsaXN0LCBuZXdJbmRleEluV29y
a2xpc3QgPT0gbmV4dE1vdmVJbmRleCk7CiAKLSAgICAgICAgICAgIEFTU0VSVChuZXh0TW92ZUlu
ZGV4IDw9IG1fYWN0aXZlTW92ZXMuc2l6ZSgpKTsKLSAgICAgICAgICAgIG1fYWN0aXZlTW92ZXMu
ZW5zdXJlU2l6ZShuZXh0TW92ZUluZGV4ICsgMSk7Ci0KICAgICAgICAgICAgIGZvciAoY29uc3Qg
QXJnJiBhcmcgOiBwcmV2SW5zdC0+YXJncykgewotICAgICAgICAgICAgICAgIGF1dG8mIGxpc3Qg
PSBtX21vdmVMaXN0W0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KGFyZy50
bXAoKSldOworICAgICAgICAgICAgICAgIGF1dG8mIGxpc3QgPSBtX21vdmVMaXN0W1RtcE1hcHBl
cjo6YWJzb2x1dGVJbmRleChhcmcudG1wKCkpXTsKICAgICAgICAgICAgICAgICBsaXN0LmFkZChu
ZXh0TW92ZUluZGV4KTsKICAgICAgICAgICAgIH0KIApAQCAtMTA0Myw3ICsxNjUyLDcgQEAgcHJp
dmF0ZToKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBB
cmc6OkdQICYmICFhcmcuaXNHUFIoKSkKLSAgICAgICAgICAgICAgICAgICAgbV9pbnRlcmZlcmVz
V2l0aEZyYW1lUG9pbnRlci5xdWlja1NldChBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1
dGVJbmRleChhcmcpKTsKKyAgICAgICAgICAgICAgICAgICAgbV9pbnRlcmZlcmVzV2l0aEZyYW1l
UG9pbnRlci5xdWlja1NldChUbXBNYXBwZXI6OmFic29sdXRlSW5kZXgoYXJnKSk7CiAgICAgICAg
ICAgICB9KTsKICAgICB9CiAKQEAgLTEwNTEsNyArMTY2MCw3IEBAIHByaXZhdGU6CiAgICAgewog
ICAgICAgICBBU1NFUlRfV0lUSF9NRVNTQUdFKGEuaXNHUCgpID09IGIuaXNHUCgpLCAiQW4gaW50
ZXJmZXJlbmNlIGJldHdlZW4gcmVnaXN0ZXJzIG9mIGRpZmZlcmVudCB0eXBlcyBkb2VzIG5vdCBt
YWtlIHNlbnNlLCBpdCBjYW4gbGVhZCB0byBub24tY29sb3JhYmxlIGdyYXBocy4iKTsKIAotICAg
ICAgICBhZGRFZGdlKEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KGEpLCBB
YnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChiKSk7CisgICAgICAgIGFkZEVk
Z2UoVG1wTWFwcGVyOjphYnNvbHV0ZUluZGV4KGEpLCBUbXBNYXBwZXI6OmFic29sdXRlSW5kZXgo
YikpOwogICAgIH0KIAogICAgIC8vIENhbGxpbmcgdGhpcyB3aXRob3V0IGEgdG1wV2lkdGggd2ls
bCBwZXJmb3JtIGEgbW9yZSBjb25zZXJ2YXRpdmUgY29hbGVzY2luZyBhbmFseXNpcyB0aGF0IGFz
c3VtZXMKQEAgLTExMDYsMTczICsxNzE1LDI0IEBAIHByaXZhdGU6CiAgICAgICAgIHJldHVybiB0
cnVlOwogICAgIH0KIAotICAgIHZvaWQgc2VsZWN0U3BpbGwoKQotICAgIHsKLSAgICAgICAgaWYg
KCFtX2hhc1NlbGVjdGVkU3BpbGwpIHsKLSAgICAgICAgICAgIG1faGFzU2VsZWN0ZWRTcGlsbCA9
IHRydWU7Ci0KLSAgICAgICAgICAgIGlmIChtX2hhc0NvYWxlc2NlZE5vblRyaXZpYWxNb3ZlKQot
ICAgICAgICAgICAgICAgIG1fY29hbGVzY2VkVG1wc0F0U3BpbGwgPSBtX2NvYWxlc2NlZFRtcHM7
Ci0gICAgICAgIH0KLQotICAgICAgICBhdXRvIGl0ZXJhdG9yID0gbV9zcGlsbFdvcmtsaXN0LmJl
Z2luKCk7Ci0KLSAgICAgICAgUkVMRUFTRV9BU1NFUlRfV0lUSF9NRVNTQUdFKGl0ZXJhdG9yICE9
IG1fc3BpbGxXb3JrbGlzdC5lbmQoKSwgInNlbGVjdFNwaWxsKCkgY2FsbGVkIHdoZW4gdGhlcmUg
d2FzIG5vIHNwaWxsLiIpOwotICAgICAgICBSRUxFQVNFX0FTU0VSVF9XSVRIX01FU1NBR0UoIW1f
dW5zcGlsbGFibGVUbXBzLmNvbnRhaW5zKCppdGVyYXRvciksICJ0cnlpbmcgdG8gc3BpbGwgdW5z
cGlsbGFibGUgdG1wIik7Ci0KLSAgICAgICAgLy8gSGlnaGVyIHNjb3JlIG1lYW5zIG1vcmUgZGVz
aXJhYmxlIHRvIHNwaWxsLiBMb3dlciBzY29yZXMgbWF4aW1pemUgdGhlIGxpa2VsaWhvb2QgdGhh
dCBhIHRtcAotICAgICAgICAvLyBnZXRzIGEgcmVnaXN0ZXIuCi0gICAgICAgIGF1dG8gc2NvcmUg
PSBbJl0gKFRtcCB0bXApIC0+IGRvdWJsZSB7Ci0gICAgICAgICAgICAvLyBBaXIgZXhwb3NlcyB0
aGUgY29uY2VwdCBvZiAiZmFzdCB0bXBzIiwgYW5kIHdlIGludGVycHJldCB0aGF0IHRvIG1lYW4g
dGhhdCB0aGUgdG1wCi0gICAgICAgICAgICAvLyBzaG91bGQgYWx3YXlzIGJlIGluIGEgcmVnaXN0
ZXIuCi0gICAgICAgICAgICBpZiAobV9jb2RlLmlzRmFzdFRtcCh0bXApKQotICAgICAgICAgICAg
ICAgIHJldHVybiAwOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBBbGwgZWxzZSBiZWlu
ZyBlcXVhbCwgdGhlIHNjb3JlIHNob3VsZCBiZSBkaXJlY3RseSByZWxhdGVkIHRvIHRoZSBkZWdy
ZWUuCi0gICAgICAgICAgICBkb3VibGUgZGVncmVlID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihtX2Rl
Z3JlZXNbQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodG1wKV0pOwotCi0g
ICAgICAgICAgICAvLyBBbGwgZWxzZSBiZWluZyBlcXVhbCwgdGhlIHNjb3JlIHNob3VsZCBiZSBp
bnZlcnNlbHkgcmVsYXRlZCB0byB0aGUgbnVtYmVyIG9mIHdhcm0gdXNlcyBhbmQKLSAgICAgICAg
ICAgIC8vIGRlZnMuCi0gICAgICAgICAgICBjb25zdCBVc2VDb3VudHM8VG1wPjo6Q291bnRzKiBj
b3VudHMgPSBtX3VzZUNvdW50c1t0bXBdOwotICAgICAgICAgICAgaWYgKCFjb3VudHMpCi0gICAg
ICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHko
KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZG91YmxlIHVzZXMgPSBjb3VudHMtPm51bVdh
cm1Vc2VzICsgY291bnRzLT5udW1EZWZzOwotCi0gICAgICAgICAgICAvLyBJZiBpdCdzIGEgY29u
c3RhbnQsIHRoZW4gaXQncyBub3QgYXMgYmFkIHRvIHNwaWxsLiBXZSBjYW4gcmVtYXRlcmlhbGl6
ZSBpdCBpbiBtYW55Ci0gICAgICAgICAgICAvLyBjYXNlcy4KLSAgICAgICAgICAgIGlmIChjb3Vu
dHMtPm51bUNvbnN0RGVmcyA9PSAxICYmIGNvdW50cy0+bnVtRGVmcyA9PSAxKQotICAgICAgICAg
ICAgICAgIHVzZXMgLz0gMjsKLQotICAgICAgICAgICAgcmV0dXJuIGRlZ3JlZSAvIHVzZXM7Ci0g
ICAgICAgIH07Ci0KLSAgICAgICAgYXV0byB2aWN0aW1JdGVyYXRvciA9IGl0ZXJhdG9yOwotICAg
ICAgICBkb3VibGUgbWF4U2NvcmUgPSBzY29yZShBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1w
RnJvbUFic29sdXRlSW5kZXgoKml0ZXJhdG9yKSk7Ci0KLSAgICAgICAgKytpdGVyYXRvcjsKLSAg
ICAgICAgZm9yICg7aXRlcmF0b3IgIT0gbV9zcGlsbFdvcmtsaXN0LmVuZCgpOyArK2l0ZXJhdG9y
KSB7Ci0gICAgICAgICAgICBkb3VibGUgdG1wU2NvcmUgPSBzY29yZShBYnNvbHV0ZVRtcE1hcHBl
cjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgoKml0ZXJhdG9yKSk7Ci0gICAgICAgICAgICBp
ZiAodG1wU2NvcmUgPiBtYXhTY29yZSkgewotICAgICAgICAgICAgICAgIEFTU0VSVCghbV91bnNw
aWxsYWJsZVRtcHMuY29udGFpbnMoKml0ZXJhdG9yKSk7Ci0gICAgICAgICAgICAgICAgdmljdGlt
SXRlcmF0b3IgPSBpdGVyYXRvcjsKLSAgICAgICAgICAgICAgICBtYXhTY29yZSA9IHRtcFNjb3Jl
OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdW5zaWduZWQgdmljdGltSW5k
ZXggPSAqdmljdGltSXRlcmF0b3I7Ci0gICAgICAgIG1fc3BpbGxXb3JrbGlzdC5yZW1vdmUodmlj
dGltSXRlcmF0b3IpOwotICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuYXBwZW5kKHZpY3RpbUlu
ZGV4KTsKLQotICAgICAgICBmcmVlemVNb3Zlcyh2aWN0aW1JbmRleCk7Ci0gICAgfQotCi0gICAg
dm9pZCBhbGxvY2F0ZSgpCi0gICAgewotICAgICAgICBBU1NFUlRfV0lUSF9NRVNTQUdFKG1fYWN0
aXZlTW92ZXMuc2l6ZSgpID49IG1fY29hbGVzY2luZ0NhbmRpZGF0ZXMuc2l6ZSgpLCAiVGhlIGFj
dGl2ZU1vdmUgc2V0IHNob3VsZCBiZSBiaWcgZW5vdWdoIGZvciB0aGUgcXVpY2sgb3BlcmF0aW9u
cyBvZiBCaXRWZWN0b3IuIik7Ci0KLSAgICAgICAgbWFrZVdvcmtMaXN0KCk7Ci0KLSAgICAgICAg
aWYgKGRlYnVnKSB7Ci0gICAgICAgICAgICBkYXRhTG9nKCJJbnRlcmZlcmVuY2U6ICIsIGxpc3RE
dW1wKG1faW50ZXJmZXJlbmNlRWRnZXMpLCAiXG4iKTsKLSAgICAgICAgICAgIGR1bXBJbnRlcmZl
cmVuY2VHcmFwaEluRG90KFdURjo6ZGF0YUZpbGUoKSk7Ci0gICAgICAgICAgICBkYXRhTG9nKCJD
b2FsZXNjaW5nIGNhbmRpZGF0ZXM6XG4iKTsKLSAgICAgICAgICAgIGZvciAoTW92ZU9wZXJhbmRz
JiBtb3ZlT3AgOiBtX2NvYWxlc2NpbmdDYW5kaWRhdGVzKSB7Ci0gICAgICAgICAgICAgICAgZGF0
YUxvZygiICAgICIsIEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRl
eChtb3ZlT3Auc3JjSW5kZXgpLAotICAgICAgICAgICAgICAgICAgICAiIC0+ICIsIEFic29sdXRl
VG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleChtb3ZlT3AuZHN0SW5kZXgpLCAi
XG4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRhdGFMb2coIkluaXRpYWwgd29yayBs
aXN0XG4iKTsKLSAgICAgICAgICAgIGR1bXBXb3JrTGlzdHMoV1RGOjpkYXRhRmlsZSgpKTsKLSAg
ICAgICAgfQotCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKSB7Ci0g
ICAgICAgICAgICAgICAgZGF0YUxvZygiQmVmb3JlIEdyYXBoIHNpbXBsaWZpY2F0aW9uIGl0ZXJh
dGlvblxuIik7Ci0gICAgICAgICAgICAgICAgZHVtcFdvcmtMaXN0cyhXVEY6OmRhdGFGaWxlKCkp
OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIW1fc2ltcGxpZnlXb3JrbGlzdC5p
c0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgc2ltcGxpZnkoKTsKLSAgICAgICAgICAgIGVsc2Ug
aWYgKCFtX3dvcmtsaXN0TW92ZXMuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIGNvYWxlc2Nl
KCk7Ci0gICAgICAgICAgICBlbHNlIGlmICghbV9mcmVlemVXb3JrbGlzdC5pc0VtcHR5KCkpCi0g
ICAgICAgICAgICAgICAgZnJlZXplKCk7Ci0gICAgICAgICAgICBlbHNlIGlmICghbV9zcGlsbFdv
cmtsaXN0LmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICBzZWxlY3RTcGlsbCgpOwotCi0gICAg
ICAgICAgICBpZiAodHJhY2VEZWJ1ZykgewotICAgICAgICAgICAgICAgIGRhdGFMb2coIkFmdGVy
IEdyYXBoIHNpbXBsaWZpY2F0aW9uIGl0ZXJhdGlvblxuIik7Ci0gICAgICAgICAgICAgICAgZHVt
cFdvcmtMaXN0cyhXVEY6OmRhdGFGaWxlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IHdo
aWxlICghbV9zaW1wbGlmeVdvcmtsaXN0LmlzRW1wdHkoKSB8fCAhbV93b3JrbGlzdE1vdmVzLmlz
RW1wdHkoKSB8fCAhbV9mcmVlemVXb3JrbGlzdC5pc0VtcHR5KCkgfHwgIW1fc3BpbGxXb3JrbGlz
dC5pc0VtcHR5KCkpOwotCi0gICAgICAgIGFzc2lnbkNvbG9ycygpOwotICAgIH0KLQotI2lmIFBM
QVRGT1JNKENPQ09BKQotI3ByYWdtYSBtYXJrIC0gRGVidWdnaW5nIGhlbHBlcnMuCi0jZW5kaWYK
LQotICAgIHZvaWQgZHVtcEludGVyZmVyZW5jZUdyYXBoSW5Eb3QoUHJpbnRTdHJlYW0mIG91dCkK
LSAgICB7Ci0gICAgICAgIG91dC5wcmludCgiZ3JhcGggSW50ZXJmZXJlbmNlR3JhcGggeyBcbiIp
OwotCi0gICAgICAgIEhhc2hTZXQ8VG1wPiB0bXBzV2l0aEludGVyZmVyZW5jZXM7Ci0gICAgICAg
IGZvciAoY29uc3QgYXV0byYgZWRnZSA6IG1faW50ZXJmZXJlbmNlRWRnZXMpIHsKLSAgICAgICAg
ICAgIHRtcHNXaXRoSW50ZXJmZXJlbmNlcy5hZGQoQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRt
cEZyb21BYnNvbHV0ZUluZGV4KGVkZ2UuZmlyc3QoKSkpOwotICAgICAgICAgICAgdG1wc1dpdGhJ
bnRlcmZlcmVuY2VzLmFkZChBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRl
SW5kZXgoZWRnZS5zZWNvbmQoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChjb25zdCBh
dXRvJiB0bXAgOiB0bXBzV2l0aEludGVyZmVyZW5jZXMpIHsKLSAgICAgICAgICAgIHVuc2lnbmVk
IHRtcEluZGV4ID0gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodG1wKTsK
LSAgICAgICAgICAgIGlmICh0bXBJbmRleCA8IG1fZGVncmVlcy5zaXplKCkpCi0gICAgICAgICAg
ICAgICAgb3V0LnByaW50KCIgICAgIiwgdG1wLmludGVybmFsVmFsdWUoKSwgIiBbbGFiZWw9XCIi
LCB0bXAsICIgKCIsIG1fZGVncmVlc1t0bXBJbmRleF0sICIpXCJdO1xuIik7Ci0gICAgICAgICAg
ICBlbHNlCi0gICAgICAgICAgICAgICAgb3V0LnByaW50KCIgICAgIiwgdG1wLmludGVybmFsVmFs
dWUoKSwgIiBbbGFiZWw9XCIiLCB0bXAsICJcIl07XG4iKTsKLSAgICAgICAgfQotCi0gICAgICAg
IGZvciAoY29uc3QgYXV0byYgZWRnZSA6IG1faW50ZXJmZXJlbmNlRWRnZXMpCi0gICAgICAgICAg
ICBvdXQucHJpbnQoIiAgICAiLCBlZGdlLmZpcnN0KCksICIgLS0gIiwgZWRnZS5zZWNvbmQoKSwg
IjtcbiIpOwotICAgICAgICBvdXQucHJpbnQoIn1cbiIpOwotICAgIH0KLQotICAgIHZvaWQgZHVt
cFdvcmtMaXN0cyhQcmludFN0cmVhbSYgb3V0KQotICAgIHsKLSAgICAgICAgb3V0LnByaW50KCJT
aW1wbGlmeSB3b3JrIGxpc3Q6XG4iKTsKLSAgICAgICAgZm9yICh1bnNpZ25lZCB0bXBJbmRleCA6
IG1fc2ltcGxpZnlXb3JrbGlzdCkKLSAgICAgICAgICAgIG91dC5wcmludCgiICAgICIsIEFic29s
dXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleCh0bXBJbmRleCksICJcbiIp
OwotICAgICAgICBvdXQucHJpbnRmKCJNb3ZlcyB3b3JrIGxpc3QgaXMgZW1wdHk/ICVkXG4iLCBt
X3dvcmtsaXN0TW92ZXMuaXNFbXB0eSgpKTsKLSAgICAgICAgb3V0LnByaW50KCJGcmVlemUgd29y
ayBsaXN0OlxuIik7Ci0gICAgICAgIGZvciAodW5zaWduZWQgdG1wSW5kZXggOiBtX2ZyZWV6ZVdv
cmtsaXN0KQotICAgICAgICAgICAgb3V0LnByaW50KCIgICAgIiwgQWJzb2x1dGVUbXBNYXBwZXI8
dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KHRtcEluZGV4KSwgIlxuIik7Ci0gICAgICAgIG91
dC5wcmludCgiU3BpbGwgd29yayBsaXN0OlxuIik7Ci0gICAgICAgIGZvciAodW5zaWduZWQgdG1w
SW5kZXggOiBtX3NwaWxsV29ya2xpc3QpCi0gICAgICAgICAgICBvdXQucHJpbnQoIiAgICAiLCBB
YnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgodG1wSW5kZXgpLCAi
XG4iKTsKLSAgICB9Ci0KLSAgICB1c2luZyBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yPHVuc2ln
bmVkPjo6YWRkRWRnZTsKLSAgICB1c2luZyBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yPHVuc2ln
bmVkPjo6Z2V0QWxpYXM7Ci0KLSAgICBDb2RlJiBtX2NvZGU7CiAgICAgVG1wV2lkdGgmIG1fdG1w
V2lkdGg7Ci0gICAgLy8gRklYTUU6IHNwaWxsaW5nIHNob3VsZCBub3QgdHlwZSBzcGVjaWZpYy4g
SXQgaXMgb25seSBhIHNpZGUgZWZmZWN0IG9mIHVzaW5nIFVzZUNvdW50cy4KLSAgICBjb25zdCBV
c2VDb3VudHM8VG1wPiYgbV91c2VDb3VudHM7CiB9OwogCi1jbGFzcyBJdGVyYXRlZFJlZ2lzdGVy
Q29hbGVzY2luZyB7CitjbGFzcyBSZWdpc3RlckFsbG9jYXRpb24gewogcHVibGljOgotICAgIEl0
ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nKENvZGUmIGNvZGUpCisgICAgUmVnaXN0ZXJBbGxvY2F0
aW9uKENvZGUmIGNvZGUsIFVzZUNvdW50czxUbXA+JiB1c2VDb3VudHMpCiAgICAgICAgIDogbV9j
b2RlKGNvZGUpCi0gICAgICAgICwgbV91c2VDb3VudHMoY29kZSkKKyAgICAgICAgLCBtX3VzZUNv
dW50cyh1c2VDb3VudHMpCiAgICAgewogICAgIH0KIAogICAgIHZvaWQgcnVuKCkKICAgICB7CiAg
ICAgICAgIHBhZEludGVyZmVyZW5jZShtX2NvZGUpOwotICAgICAgICAKLSAgICAgICAgaXRlcmF0
ZWRSZWdpc3RlckNvYWxlc2NpbmdPblR5cGU8QXJnOjpHUD4oKTsKLSAgICAgICAgaXRlcmF0ZWRS
ZWdpc3RlckNvYWxlc2NpbmdPblR5cGU8QXJnOjpGUD4oKTsKKworICAgICAgICBhbGxvY2F0ZU9u
VHlwZTxBcmc6OkdQPigpOworICAgICAgICBtX251bUl0ZXJhdGlvbnMgPSAwOworICAgICAgICBh
bGxvY2F0ZU9uVHlwZTxBcmc6OkZQPigpOwogCiAgICAgICAgIGZpeFNwaWxsc0FmdGVyVGVybWlu
YWxzKCk7CiAKQEAgLTEyODIsNyArMTc0Miw3IEBAIHB1YmxpYzoKIAogcHJpdmF0ZToKICAgICB0
ZW1wbGF0ZTxBcmc6OlR5cGUgdHlwZT4KLSAgICB2b2lkIGl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNj
aW5nT25UeXBlKCkKKyAgICB2b2lkIGFsbG9jYXRlT25UeXBlKCkKICAgICB7CiAgICAgICAgIEhh
c2hTZXQ8dW5zaWduZWQ+IHVuc3BpbGxhYmxlVG1wcyA9IGNvbXB1dGVVbnNwaWxsYWJsZVRtcHM8
dHlwZT4oKTsKIApAQCAtMTMxMSwyMiArMTc3MSwzOCBAQCBwcml2YXRlOgogICAgICAgICAgICAg
Ly8gcmVjb21wdXRhdGlvbiwgaW4gd2hpY2ggY2FzZSBzcGVlZGluZyB1cCB0aGUgbG9va3VwIHdv
dWxkIGJlIGEgYmlnZ2VyIHdpbi4KICAgICAgICAgICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQu
b3JnL3Nob3dfYnVnLmNnaT9pZD0xNTI0NzgKICAgICAgICAgICAgIG1fdG1wV2lkdGgucmVjb21w
dXRlKG1fY29kZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIENvbG9yaW5nQWxsb2NhdG9y
PHR5cGU+IGFsbG9jYXRvcihtX2NvZGUsIG1fdG1wV2lkdGgsIG1fdXNlQ291bnRzLCB1bnNwaWxs
YWJsZVRtcHMpOwotICAgICAgICAgICAgaWYgKCFhbGxvY2F0b3IucmVxdWlyZXNTcGlsbGluZygp
KSB7Ci0gICAgICAgICAgICAgICAgYXNzaWduUmVnaXN0ZXJzVG9UbXAoYWxsb2NhdG9yKTsKLSAg
ICAgICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKLSAgICAgICAgICAgICAgICAgICAgZGF0YUxv
ZygiU3VjY2Vzc2Z1bGwgYWxsb2NhdGlvbiBhdCBpdGVyYXRpb24gIiwgbV9udW1JdGVyYXRpb25z
LCAiOlxuIiwgbV9jb2RlKTsKIAotICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAg
IGF1dG8gZG9BbGxvY2F0aW9uID0gWyZdIChhdXRvJiBhbGxvY2F0b3IpIC0+IGJvb2wgeworICAg
ICAgICAgICAgICAgIGFsbG9jYXRvci5hbGxvY2F0ZSgpOworICAgICAgICAgICAgICAgIGlmICgh
YWxsb2NhdG9yLnJlcXVpcmVzU3BpbGxpbmcoKSkgeworICAgICAgICAgICAgICAgICAgICBhc3Np
Z25SZWdpc3RlcnNUb1RtcDx0eXBlPihhbGxvY2F0b3IpOworICAgICAgICAgICAgICAgICAgICBp
ZiAodHJhY2VEZWJ1ZykKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFMb2coIlN1Y2Nlc3Nm
dWxsIGFsbG9jYXRpb24gYXQgaXRlcmF0aW9uICIsIG1fbnVtSXRlcmF0aW9ucywgIjpcbiIsIG1f
Y29kZSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICAgICAgYWRkU3BpbGxBbmRGaWxsPHR5cGU+KGFsbG9jYXRvciwg
dW5zcGlsbGFibGVUbXBzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
ICAgICB9OworICAgICAgICAgICAgCisgICAgICAgICAgICBib29sIGRvbmU7CisgICAgICAgICAg
ICBpZiAoKGlzQVJNNjQoKSB8fCBPcHRpb25zOjphaXJGb3JjZUJyaWdnc0FsbG9jYXRvcigpKSAm
JiAhT3B0aW9uczo6YWlyRm9yY2VJUkNBbGxvY2F0b3IoKSkgeworICAgICAgICAgICAgICAgIENv
bG9yaW5nQWxsb2NhdG9yPHR5cGUsIEJyaWdncz4gYWxsb2NhdG9yKG1fY29kZSwgbV90bXBXaWR0
aCwgbV91c2VDb3VudHMsIHVuc3BpbGxhYmxlVG1wcyk7CisgICAgICAgICAgICAgICAgZG9uZSA9
IGRvQWxsb2NhdGlvbihhbGxvY2F0b3IpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAg
ICAgICAgICBDb2xvcmluZ0FsbG9jYXRvcjx0eXBlLCBJUkM+IGFsbG9jYXRvcihtX2NvZGUsIG1f
dG1wV2lkdGgsIG1fdXNlQ291bnRzLCB1bnNwaWxsYWJsZVRtcHMpOworICAgICAgICAgICAgICAg
IGRvbmUgPSBkb0FsbG9jYXRpb24oYWxsb2NhdG9yKTsKICAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgIGFkZFNwaWxsQW5kRmlsbDx0eXBlPihhbGxvY2F0b3IsIHVuc3BpbGxhYmxlVG1wcyk7Cisg
ICAgICAgICAgICBpZiAoZG9uZSkKKyAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0K
ICAgICB9CiAKICAgICB0ZW1wbGF0ZTxBcmc6OlR5cGUgdHlwZT4KICAgICBIYXNoU2V0PHVuc2ln
bmVkPiBjb21wdXRlVW5zcGlsbGFibGVUbXBzKCkKICAgICB7CisKICAgICAgICAgSGFzaFNldDx1
bnNpZ25lZD4gdW5zcGlsbGFibGVUbXBzOwogCiAgICAgICAgIHN0cnVjdCBSYW5nZSB7CkBAIC0x
MzkwLDggKzE4NjYsOCBAQCBwcml2YXRlOgogICAgICAgICByZXR1cm4gdW5zcGlsbGFibGVUbXBz
OwogICAgIH0KIAotICAgIHRlbXBsYXRlPEFyZzo6VHlwZSB0eXBlPgotICAgIHZvaWQgYXNzaWdu
UmVnaXN0ZXJzVG9UbXAoY29uc3QgQ29sb3JpbmdBbGxvY2F0b3I8dHlwZT4mIGFsbG9jYXRvcikK
KyAgICB0ZW1wbGF0ZTxBcmc6OlR5cGUgdHlwZSwgdHlwZW5hbWUgQWxsb2NhdG9yVHlwZT4KKyAg
ICB2b2lkIGFzc2lnblJlZ2lzdGVyc1RvVG1wKGNvbnN0IEFsbG9jYXRvclR5cGUmIGFsbG9jYXRv
cikKICAgICB7CiAgICAgICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBtX2NvZGUpIHsKICAg
ICAgICAgICAgIC8vIEdpdmUgVG1wIGEgdmFsaWQgcmVnaXN0ZXIuCkBAIC0xNDQ3LDggKzE5MjMs
OCBAQCBwcml2YXRlOgogICAgICAgICByZXR1cm4gd2lkdGggPD0gQXJnOjpXaWR0aDMyID8gNCA6
IDg7CiAgICAgfQogCi0gICAgdGVtcGxhdGU8QXJnOjpUeXBlIHR5cGU+Ci0gICAgdm9pZCBhZGRT
cGlsbEFuZEZpbGwoY29uc3QgQ29sb3JpbmdBbGxvY2F0b3I8dHlwZT4mIGFsbG9jYXRvciwgSGFz
aFNldDx1bnNpZ25lZD4mIHVuc3BpbGxhYmxlVG1wcykKKyAgICB0ZW1wbGF0ZTxBcmc6OlR5cGUg
dHlwZSwgdHlwZW5hbWUgQWxsb2NhdG9yVHlwZT4KKyAgICB2b2lkIGFkZFNwaWxsQW5kRmlsbChj
b25zdCBBbGxvY2F0b3JUeXBlJiBhbGxvY2F0b3IsIEhhc2hTZXQ8dW5zaWduZWQ+JiB1bnNwaWxs
YWJsZVRtcHMpCiAgICAgewogICAgICAgICBIYXNoTWFwPFRtcCwgU3RhY2tTbG90Kj4gc3RhY2tT
bG90czsKICAgICAgICAgZm9yIChUbXAgdG1wIDogYWxsb2NhdG9yLnNwaWxsZWRUbXBzKCkpIHsK
QEAgLTE2MzcsMTggKzIxMTMsMTkgQEAgcHJpdmF0ZToKIAogICAgIENvZGUmIG1fY29kZTsKICAg
ICBUbXBXaWR0aCBtX3RtcFdpZHRoOwotICAgIFVzZUNvdW50czxUbXA+IG1fdXNlQ291bnRzOwor
ICAgIFVzZUNvdW50czxUbXA+JiBtX3VzZUNvdW50czsKICAgICB1bnNpZ25lZCBtX251bUl0ZXJh
dGlvbnMgeyAwIH07CiB9OwogCiB9IC8vIGFub255bW91cyBuYW1lc3BhY2UKIAotdm9pZCBpdGVy
YXRlZFJlZ2lzdGVyQ29hbGVzY2luZyhDb2RlJiBjb2RlKQordm9pZCBhbGxvY2F0ZVJlZ2lzdGVy
cyhDb2RlJiBjb2RlKQogewotICAgIFBoYXNlU2NvcGUgcGhhc2VTY29wZShjb2RlLCAiaXRlcmF0
ZWRSZWdpc3RlckNvYWxlc2NpbmciKTsKLSAgICAKLSAgICBJdGVyYXRlZFJlZ2lzdGVyQ29hbGVz
Y2luZyBpdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZyhjb2RlKTsKLSAgICBpdGVyYXRlZFJlZ2lz
dGVyQ29hbGVzY2luZy5ydW4oKTsKKyAgICBQaGFzZVNjb3BlIHBoYXNlU2NvcGUoY29kZSwgIkFp
cjo6YWxsb2NhdGVSZWdpc3RlcnMiKTsKKworICAgIFVzZUNvdW50czxUbXA+IHVzZUNvdW50cyhj
b2RlKTsKKyAgICBSZWdpc3RlckFsbG9jYXRpb24gcmVnaXN0ZXJBbGxvY2F0aW9uKGNvZGUsIHVz
ZUNvdW50cyk7CisgICAgcmVnaXN0ZXJBbGxvY2F0aW9uLnJ1bigpOwogfQogCiB9IH0gfSAvLyBu
YW1lc3BhY2UgSlNDOjpCMzo6QWlyCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWly
L0FpclJlZ2lzdGVyQWxsb2NhdG9yLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2IzL2Fpci9BaXJSZWdpc3RlckFsbG9jYXRvci5oCShyZXZpc2lvbiAyMTI2NjYpCShmcm9t
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2Np
bmcuaDoyMTI2NjYpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclJlZ2lzdGVy
QWxsb2NhdG9yLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaWYgRU5B
QkxFKEIzX0pJVCkKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5hbWVzcGFjZSBB
aXIgeworCitjbGFzcyBDb2RlOworCisvLyBUaGlzIGlzIGEgcmVnaXN0ZXIgYWxsb2NhdGlvbiBw
aGFzZSBiYXNlZCBvbiBBbmRyZXcgQXBwZWwncyBJdGVyYXRlZCBSZWdpc3RlciBDb2FsZXNjaW5n
CisvLyBodHRwOi8vd3d3LmNzLmNtdS5lZHUvYWZzL2NzL2FjYWRlbWljL2NsYXNzLzE1NzQ1LXMw
Ny93d3cvcGFwZXJzL2dlb3JnZS5wZGYKK3ZvaWQgaXRlcmF0ZWRSZWdpc3RlckNvYWxlc2Npbmco
Q29kZSYpOworCit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCisKKyNlbmRpZiAvLyBF
TkFCTEUoQjNfSklUKQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJSZWdp
c3RlckFsbG9jYXRvci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9h
aXIvQWlyUmVnaXN0ZXJBbGxvY2F0b3IuaAkocmV2aXNpb24gMjEyNjY2KQorKysgU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJSZWdpc3RlckFsbG9jYXRvci5oCSh3b3JraW5nIGNvcHkp
CkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNyBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAg
LTMxLDkgKzMxLDE2IEBAIG5hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UK
IAogY2xhc3MgQ29kZTsKIAotLy8gVGhpcyBpcyBhIHJlZ2lzdGVyIGFsbG9jYXRpb24gcGhhc2Ug
YmFzZWQgb24gQW5kcmV3IEFwcGVsJ3MgSXRlcmF0ZWQgUmVnaXN0ZXIgQ29hbGVzY2luZworLy8g
V2UgaGF2ZSB0d28gcmVnaXN0ZXIgYWxsb2NhdG9ycywgYm90aCBmdW5kYW1lbnRhbGx5IGRlcml2
ZWQgZnJvbSBDaGFpdGluJ3MgWW9ya3Rvd24KKy8vIGFsbG9jYXRvcjoKKy8vIGh0dHA6Ly9jcy5n
bXUuZWR1L353aGl0ZS9DUzY0MC9wOTgtY2hhaXRpbi5wZGYKKy8vCisvLyBXZSBoYXZlIGFuIGlt
cGxlbWVudGF0aW9uIG9mIEJyaWdncydzIG9wdGltaXN0aWMgYWxsb2NhdG9yIHdoaWNoIGlzIGRl
cml2YXRpdmUgb2YgQ2hhaXRpbidzIGFsbG9jYXRvcjoKKy8vIGh0dHA6Ly93d3cuY3MudXRleGFz
LmVkdS91c2Vycy9tY2tpbmxleS8zODBDL2xlY3MvYnJpZ2dzLXRoZXNpcy0xOTkyLnBkZgorLy8K
Ky8vIEFuZCBhbiBpbXBsZW1lbnRhdGlvbiBvZiBBbmRyZXcgQXBwZWwncyBJdGVyYXRlZCBSZWdp
c3RlciBDb2FsZXNjaW5nIHdoaWNoIGlzIGRlcml2YXRpdmUgb2YgQnJpZ2dzJ3MgYWxsb2NhdG9y
LgogLy8gaHR0cDovL3d3dy5jcy5jbXUuZWR1L2Fmcy9jcy9hY2FkZW1pYy9jbGFzcy8xNTc0NS1z
MDcvd3d3L3BhcGVycy9nZW9yZ2UucGRmCi12b2lkIGl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5n
KENvZGUmKTsKK3ZvaWQgYWxsb2NhdGVSZWdpc3RlcnMoQ29kZSYpOwogCiB9IH0gfSAvLyBuYW1l
c3BhY2UgSlNDOjpCMzo6QWlyCiAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1l
L09wdGlvbnMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9P
cHRpb25zLmgJKHJldmlzaW9uIDIxMjY2NikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50
aW1lL09wdGlvbnMuaAkod29ya2luZyBjb3B5KQpAQCAtMzkzLDYgKzM5Myw4IEBAIHR5cGVkZWYg
Y29uc3QgY2hhciogb3B0aW9uU3RyaW5nOwogICAgIHYoYm9vbCwgbG9nQjNQaGFzZVRpbWVzLCBm
YWxzZSwgTm9ybWFsLCBudWxscHRyKSBcCiAgICAgdihkb3VibGUsIHJhcmVCbG9ja1BlbmFsdHks
IDAuMDAxLCBOb3JtYWwsIG51bGxwdHIpIFwKICAgICB2KGJvb2wsIGFpclNwaWxsc0V2ZXJ5dGhp
bmcsIGZhbHNlLCBOb3JtYWwsIG51bGxwdHIpIFwKKyAgICB2KGJvb2wsIGFpckZvcmNlQnJpZ2dz
QWxsb2NhdG9yLCBmYWxzZSwgTm9ybWFsLCBudWxscHRyKSBcCisgICAgdihib29sLCBhaXJGb3Jj
ZUlSQ0FsbG9jYXRvciwgZmFsc2UsIE5vcm1hbCwgbnVsbHB0cikgXAogICAgIHYoYm9vbCwgbG9n
QWlyUmVnaXN0ZXJQcmVzc3VyZSwgZmFsc2UsIE5vcm1hbCwgbnVsbHB0cikgXAogICAgIHYodW5z
aWduZWQsIG1heEIzVGFpbER1cEJsb2NrU2l6ZSwgMywgTm9ybWFsLCBudWxscHRyKSBcCiAgICAg
dih1bnNpZ25lZCwgbWF4QjNUYWlsRHVwQmxvY2tTdWNjZXNzb3JzLCAzLCBOb3JtYWwsIG51bGxw
dHIpIFwKSW5kZXg6IFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9DaGFuZ2VM
b2cJKHJldmlzaW9uIDIxMjY2NikKKysrIFRvb2xzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpA
QCAtMSwzICsxLDEyIEBACisyMDE3LTAyLTIwICBTYWFtIEJhcmF0aSAgPHNiYXJhdGlAYXBwbGUu
Y29tPgorCisgICAgICAgIENvbnNpZGVyIG1vdmluZyBmcm9tIElSQyB0byB0aGUgQnJpZ2dzIG9w
dGltaXN0aWMgYWxsb2NhdG9yIHdpdGggYmlhc2VkIGNvbG9yaW5nCisgICAgICAgIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjg0NTQKKworICAgICAgICBSZXZpZXdl
ZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIFNjcmlwdHMvcnVuLWpzYy1zdHJlc3Mt
dGVzdHM6CisKIDIwMTctMDItMTcgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGFwcGxlLmNv
bT4KIAogICAgICAgICBBZGQgYSBuZXcgZHJhZyBjb2RlIHBhdGggYW5kIHVzZSBpdCBmb3IgZHJh
Z2dpbmcgcGxhaW4gdGV4dApJbmRleDogVG9vbHMvU2NyaXB0cy9ydW4tanNjLXN0cmVzcy10ZXN0
cwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBUb29scy9TY3JpcHRzL3J1bi1qc2Mtc3RyZXNzLXRlc3RzCShyZXZp
c2lvbiAyMTI2NjYpCisrKyBUb29scy9TY3JpcHRzL3J1bi1qc2Mtc3RyZXNzLXRlc3RzCSh3b3Jr
aW5nIGNvcHkpCkBAIC04NTQsMTUgKzg1NCwxNSBAQCBkZWYgcnVuRlRMTm9DSklUKCpvcHRpb25h
bFRlc3RTcGVjaWZpY09wCiBlbmQKIAogZGVmIHJ1bkZUTE5vQ0pJVFZhbGlkYXRlKCpvcHRpb25h
bFRlc3RTcGVjaWZpY09wdGlvbnMpCi0gICAgcnVuKCJmdGwtbm8tY2ppdC12YWxpZGF0ZS1zYW1w
bGluZy1wcm9maWxlciIsICItLXZhbGlkYXRlR3JhcGg9dHJ1ZSIsICItLXVzZVNhbXBsaW5nUHJv
ZmlsZXI9dHJ1ZSIsICooRlRMX09QVElPTlMgKyBOT19DSklUX09QVElPTlMgKyBvcHRpb25hbFRl
c3RTcGVjaWZpY09wdGlvbnMpKQorICAgIHJ1bigiZnRsLW5vLWNqaXQtdmFsaWRhdGUtc2FtcGxp
bmctcHJvZmlsZXIiLCAiLS12YWxpZGF0ZUdyYXBoPXRydWUiLCAiLS11c2VTYW1wbGluZ1Byb2Zp
bGVyPXRydWUiLCAiLS1haXJGb3JjZUlSQ0FsbG9jYXRvcj10cnVlIiwgKihGVExfT1BUSU9OUyAr
IE5PX0NKSVRfT1BUSU9OUyArIG9wdGlvbmFsVGVzdFNwZWNpZmljT3B0aW9ucykpCiBlbmQKIAog
ZGVmIHJ1bkZUTE5vQ0pJVE5vUHV0U3RhY2tWYWxpZGF0ZSgqb3B0aW9uYWxUZXN0U3BlY2lmaWNP
cHRpb25zKQotICAgIHJ1bigiZnRsLW5vLWNqaXQtbm8tcHV0LXN0YWNrLXZhbGlkYXRlIiwgIi0t
dmFsaWRhdGVHcmFwaD10cnVlIiwgIi0tdXNlUHV0U3RhY2tTaW5raW5nPWZhbHNlIiwgKihGVExf
T1BUSU9OUyArIE5PX0NKSVRfT1BUSU9OUyArIG9wdGlvbmFsVGVzdFNwZWNpZmljT3B0aW9ucykp
CisgICAgcnVuKCJmdGwtbm8tY2ppdC1uby1wdXQtc3RhY2stdmFsaWRhdGUiLCAiLS12YWxpZGF0
ZUdyYXBoPXRydWUiLCAiLS11c2VQdXRTdGFja1Npbmtpbmc9ZmFsc2UiLCAiLS1haXJGb3JjZUlS
Q0FsbG9jYXRvcj10cnVlIiwgKihGVExfT1BUSU9OUyArIE5PX0NKSVRfT1BUSU9OUyArIG9wdGlv
bmFsVGVzdFNwZWNpZmljT3B0aW9ucykpCiBlbmQKIAogZGVmIHJ1bkZUTE5vQ0pJVE5vSW5saW5l
VmFsaWRhdGUoKm9wdGlvbmFsVGVzdFNwZWNpZmljT3B0aW9ucykKLSAgICBydW4oImZ0bC1uby1j
aml0LW5vLWlubGluZS12YWxpZGF0ZSIsICItLXZhbGlkYXRlR3JhcGg9dHJ1ZSIsICItLW1heGlt
dW1JbmxpbmluZ0RlcHRoPTEiLCAqKEZUTF9PUFRJT05TICsgTk9fQ0pJVF9PUFRJT05TICsgb3B0
aW9uYWxUZXN0U3BlY2lmaWNPcHRpb25zKSkKKyAgICBydW4oImZ0bC1uby1jaml0LW5vLWlubGlu
ZS12YWxpZGF0ZSIsICItLXZhbGlkYXRlR3JhcGg9dHJ1ZSIsICItLW1heGltdW1JbmxpbmluZ0Rl
cHRoPTEiLCAiLS1haXJGb3JjZUJyaWdnc0FsbG9jYXRvcj10cnVlIiwgKihGVExfT1BUSU9OUyAr
IE5PX0NKSVRfT1BUSU9OUyArIG9wdGlvbmFsVGVzdFNwZWNpZmljT3B0aW9ucykpCiBlbmQKIAog
ZGVmIHJ1bkZUTE5vQ0pJVE9TUlZhbGlkYXRpb24oKm9wdGlvbmFsVGVzdFNwZWNpZmljT3B0aW9u
cykKQEAgLTg3OCwxMSArODc4LDExIEBAIGRlZiBydW5ERkdFYWdlck5vQ0pJVFZhbGlkYXRlKCpv
cHRpb25hbFQKIGVuZAogCiBkZWYgcnVuRlRMRWFnZXIoKm9wdGlvbmFsVGVzdFNwZWNpZmljT3B0
aW9ucykKLSAgICBydW4oImZ0bC1lYWdlciIsICooRlRMX09QVElPTlMgKyBFQUdFUl9PUFRJT05T
ICsgQ09MTEVDVF9DT05USU5VT1VTTFlfT1BUSU9OUyArIG9wdGlvbmFsVGVzdFNwZWNpZmljT3B0
aW9ucykpCisgICAgcnVuKCJmdGwtZWFnZXIiLCAiLS1haXJGb3JjZUlSQ0FsbG9jYXRvcj10cnVl
IiwgKihGVExfT1BUSU9OUyArIEVBR0VSX09QVElPTlMgKyBDT0xMRUNUX0NPTlRJTlVPVVNMWV9P
UFRJT05TICsgb3B0aW9uYWxUZXN0U3BlY2lmaWNPcHRpb25zKSkKIGVuZAogCiBkZWYgcnVuRlRM
RWFnZXJOb0NKSVRWYWxpZGF0ZSgqb3B0aW9uYWxUZXN0U3BlY2lmaWNPcHRpb25zKQotICAgIHJ1
bigiZnRsLWVhZ2VyLW5vLWNqaXQiLCAiLS12YWxpZGF0ZUdyYXBoPXRydWUiLCAqKEZUTF9PUFRJ
T05TICsgTk9fQ0pJVF9PUFRJT05TICsgRUFHRVJfT1BUSU9OUyArIENPTExFQ1RfQ09OVElOVU9V
U0xZX09QVElPTlMgKyBvcHRpb25hbFRlc3RTcGVjaWZpY09wdGlvbnMpKQorICAgIHJ1bigiZnRs
LWVhZ2VyLW5vLWNqaXQiLCAiLS12YWxpZGF0ZUdyYXBoPXRydWUiLCAiLS1haXJGb3JjZUJyaWdn
c0FsbG9jYXRvcj10cnVlIiwgKihGVExfT1BUSU9OUyArIE5PX0NKSVRfT1BUSU9OUyArIEVBR0VS
X09QVElPTlMgKyBDT0xMRUNUX0NPTlRJTlVPVVNMWV9PUFRJT05TICsgb3B0aW9uYWxUZXN0U3Bl
Y2lmaWNPcHRpb25zKSkKIGVuZAogCiBkZWYgcnVuRlRMRWFnZXJOb0NKSVRPU1JWYWxpZGF0aW9u
KCpvcHRpb25hbFRlc3RTcGVjaWZpY09wdGlvbnMpCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>302168</attachid>
            <date>2017-02-20 12:57:10 -0800</date>
            <delta_ts>2017-02-21 19:54:28 -0800</delta_ts>
            <desc>patch</desc>
            <filename>b-backup.diff</filename>
            <type>text/plain</type>
            <size>223780</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMjEyNjY2KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDQyIEBA
CisyMDE3LTAyLTIwICBTYWFtIEJhcmF0aSAgPHNiYXJhdGlAYXBwbGUuY29tPgorCisgICAgICAg
IENvbnNpZGVyIG1vdmluZyBmcm9tIElSQyB0byB0aGUgQnJpZ2dzIG9wdGltaXN0aWMgYWxsb2Nh
dG9yIHdpdGggYmlhc2VkIGNvbG9yaW5nCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD0xNjg0NTQKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBUaGlzIHBhdGNoIGFkZHMgdGhlIEJyaWdncyBhbGxvY2F0b3IgdG8g
QWlyOgorICAgICAgICBodHRwOi8vd3d3LmNzLnV0ZXhhcy5lZHUvdXNlcnMvbWNraW5sZXkvMzgw
Qy9sZWNzL2JyaWdncy10aGVzaXMtMTk5Mi5wZGYKKyAgICAgICAgSXQgdXNlcyBpdCBieSBkZWZh
dWx0IG9uIEFSTTY0LiBJIHdhcyBtZWFzdXJpbmcgYW4gOC0xMCUgc3BlZWR1cAorICAgICAgICBp
biB0aGUgcGhhc2UgYmVjYXVzZSBvZiB0aGlzLiBJIGFsc28gd2Fzbid0IGFibGUgdG8gZGV0ZWN0
IGEgc2xvd2Rvd24gCisgICAgICAgIGZvciBnZW5lcmF0ZWQgY29kZSBvbiBBUk02NC4gVGhlcmUg
YXJlIHN0aWxsIGEgZmV3IHRoaW5ncyB3ZSBjYW4gZG8KKyAgICAgICAgdG8gc3BlZWQgdGhpbmdz
IHVwIGV2ZW4gZnVydGhlci4gTW92aW5nIHRoZSBpbnRlcmZlcmVuY2UgZ3JhcGggaW50bworICAg
ICAgICBhIEJpdFZlY3RvciB3YXMgYW5vdGhlciAxMC0yMCUgc3BlZWR1cC4gV2Ugc2hvdWxkIGNv
bnNpZGVyIGRvaW5nIHRoaXMKKyAgICAgICAgaW4gYSBmb2xsb3cgdXAgcGF0Y2guIFRoaXMgaXMg
ZXNwZWNpYWxseSBpbXBvcnRhbnQgbm93LCBzaW5jZSBtYWtpbmcKKyAgICAgICAgcmVnaXN0ZXIg
YWxsb2NhdGlvbiBmYXN0ZXIgaGFzIGEgZGlyZWN0IGltcGFjdCBvbiBzdGFydHVwIHRpbWUgZm9y
CisgICAgICAgIFdhc20gbW9kdWxlcy4KKyAgICAgICAgCisgICAgICAgIEkgYWJzdHJhY3RlZCBh
d2F5IHRoZSBjb21tb24gYml0cyBiZXR3ZWVuIEJyaWdncyBhbmQgSVJDLCBhbmQgbW92ZWQKKyAg
ICAgICAgdGhlbSBpbnRvIGEgY29tbW9uIHN1cGVyIGNsYXNzLiBJbiBhIGZvbGxvdyB1cCB0byB0
aGlzIHBhdGNoLCBJIHBsYW4KKyAgICAgICAgb24gaW1wbGVtZW50aW5nIGJpYXNlZCBjb2xvcmlu
ZyBmb3IgYm90aCBCcmlnZ3MgYW5kIElSQyAodGhpcyBpcworICAgICAgICBkZXNjcmliZWQgaW4g
QnJpZ2dzJ3MgdGhlc2lzKS4gSSB3YXMgYWJsZSB0byBkZXRlY3QgYSAxJSBzbG93ZG93bgorICAg
ICAgICB3aXRoIEJyaWdncyBvbiBPY3RhbmUgZm9yIHg4Ni02NC4gVGhpcyBpcyBiZWNhdXNlIHRo
ZSByZWdpc3RlciBmaWxlCisgICAgICAgIGZvciB4ODYtNjQgaXMgc21hbGxlciB0aGFuIEFSTTY0
LiBXaGVuIEkgaW1wbGVtZW50ZWQgYmlhc2VkIGNvbG9yaW5nLAorICAgICAgICBJIHdhcyBubyBs
b25nZXIgYWJsZSB0byBkZXRlY3QgdGhpcyBzbG93ZG93bi4gSSBzdGlsbCB0aGluayBpdCdzIGEK
KyAgICAgICAgc2Vuc2libGUgcGxhbiB0byBydW4gQnJpZ2dzIG9uIEFSTTY0IGFuZCBJUkMgb24g
eDg2LTY0LgorCisgICAgICAgICogQ01ha2VMaXN0cy50eHQ6CisgICAgICAgICogSmF2YVNjcmlw
dENvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvajoKKyAgICAgICAgKiBiMy9haXIvQWlyR2Vu
ZXJhdGUuY3BwOgorICAgICAgICAoSlNDOjpCMzo6QWlyOjpwcmVwYXJlRm9yR2VuZXJhdGlvbik6
CisgICAgICAgICogYjMvYWlyL0Fpckl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nLmNwcDogUmVt
b3ZlZC4KKyAgICAgICAgKiBiMy9haXIvQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuaDog
UmVtb3ZlZC4KKyAgICAgICAgKiBiMy9haXIvQWlyUmVnaXN0ZXJBbGxvY2F0b3IuY3BwOiBDb3Bp
ZWQgZnJvbSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpckl0ZXJhdGVkUmVnaXN0ZXJD
b2FsZXNjaW5nLmNwcC4KKyAgICAgICAgKEpTQzo6QjM6OkFpcjo6YWxsb2NhdGVSZWdpc3RlcnMp
OgorICAgICAgICAoSlNDOjpCMzo6QWlyOjppdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZyk6IERl
bGV0ZWQuCisgICAgICAgICogYjMvYWlyL0FpclJlZ2lzdGVyQWxsb2NhdG9yLmg6IENvcGllZCBm
cm9tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxl
c2NpbmcuaC4KKyAgICAgICAgKiBydW50aW1lL09wdGlvbnMuaDoKKwogMjAxNy0wMi0yMCAgQ29t
bWl0IFF1ZXVlICA8Y29tbWl0LXF1ZXVlQHdlYmtpdC5vcmc+CiAKICAgICAgICAgVW5yZXZpZXdl
ZCwgcm9sbGluZyBvdXQgcjIxMjYxOC4KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DTWFr
ZUxpc3RzLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvQ01ha2VMaXN0
cy50eHQJKHJldmlzaW9uIDIxMjY2NikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DTWFrZUxp
c3RzLnR4dAkod29ya2luZyBjb3B5KQpAQCAtODksNyArODksNiBAQCBzZXQoSmF2YVNjcmlwdENv
cmVfU09VUkNFUwogICAgIGIzL2Fpci9BaXJIYW5kbGVDYWxsZWVTYXZlcy5jcHAKICAgICBiMy9h
aXIvQWlySW5zZXJ0aW9uU2V0LmNwcAogICAgIGIzL2Fpci9BaXJJbnN0LmNwcAotICAgIGIzL2Fp
ci9BaXJJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5jcHAKICAgICBiMy9haXIvQWlyS2luZC5j
cHAKICAgICBiMy9haXIvQWlyTG9nUmVnaXN0ZXJQcmVzc3VyZS5jcHAKICAgICBiMy9haXIvQWly
TG93ZXJBZnRlclJlZ0FsbG9jLmNwcApAQCAtOTgsNiArOTcsNyBAQCBzZXQoSmF2YVNjcmlwdENv
cmVfU09VUkNFUwogICAgIGIzL2Fpci9BaXJPcHRpbWl6ZUJsb2NrT3JkZXIuY3BwCiAgICAgYjMv
YWlyL0FpclBhZEludGVyZmVyZW5jZS5jcHAKICAgICBiMy9haXIvQWlyUGhhc2VTY29wZS5jcHAK
KyAgICBiMy9haXIvQWlyUmVnaXN0ZXJBbGxvY2F0b3IuY3BwCiAgICAgYjMvYWlyL0FpclJlcG9y
dFVzZWRSZWdpc3RlcnMuY3BwCiAgICAgYjMvYWlyL0FpclNpbXBsaWZ5Q0ZHLmNwcAogICAgIGIz
L2Fpci9BaXJTcGVjaWFsLmNwcApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL0phdmFTY3Jp
cHRDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHJl
dmlzaW9uIDIxMjY2NikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS54
Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCSh3b3JraW5nIGNvcHkpCkBAIC0xMjMyLDggKzEyMzIs
NiBAQAogCQkyNjAwQjVBNzE1MkJBQUE3MDA5MUVFNUYgLyogSlNTdHJpbmdKb2luZXIuaCBpbiBI
ZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDI2MDBCNUE1MTUyQkFB
QTcwMDkxRUU1RiAvKiBKU1N0cmluZ0pvaW5lci5oICovOyB9OwogCQkyNjJEODVCNjFDMEQ2NTBG
MDA2QUNCNjEgLyogQWlyRml4UGFydGlhbFJlZ2lzdGVyU3RhbGxzLmNwcCBpbiBTb3VyY2VzICov
ID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDI2MkQ4NUI0MUMwRDY1MEYwMDZBQ0I2
MSAvKiBBaXJGaXhQYXJ0aWFsUmVnaXN0ZXJTdGFsbHMuY3BwICovOyB9OwogCQkyNjJEODVCNzFD
MEQ2NTBGMDA2QUNCNjEgLyogQWlyRml4UGFydGlhbFJlZ2lzdGVyU3RhbGxzLmggaW4gSGVhZGVy
cyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyNjJEODVCNTFDMEQ2NTBGMDA2
QUNCNjEgLyogQWlyRml4UGFydGlhbFJlZ2lzdGVyU3RhbGxzLmggKi87IH07Ci0JCTI2NzE4QkE0
MUJFOTlGNzgwMDUyMDE3QiAvKiBBaXJJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5jcHAgaW4g
U291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyNjcxOEJBMjFCRTk5
Rjc4MDA1MjAxN0IgLyogQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuY3BwICovOyB9Owot
CQkyNjcxOEJBNTFCRTk5Rjc4MDA1MjAxN0IgLyogQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2Np
bmcuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDI2NzE4
QkEzMUJFOTlGNzgwMDUyMDE3QiAvKiBBaXJJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5oICov
OyB9OwogCQkyNjg0RDQzODFDMDAxNjFDMDA4MUQ2NjMgLyogQWlyTGl2ZW5lc3MuaCBpbiBIZWFk
ZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDI2ODRENDM3MUMwMDE2MUMw
MDgxRDY2MyAvKiBBaXJMaXZlbmVzcy5oICovOyB9OwogCQkyNjlENjM2RTFCRkJFNUQxMDAxMDFC
MUQgLyogRlRMT3V0cHV0LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSAyNjlENjM2RDFCRkJFNUQwMDAxMDFCMUQgLyogRlRMT3V0cHV0LmggKi87IH07CiAJ
CTJBMDVBQkQ1MTk2MURGMjQwMDM0MTc1MCAvKiBKU1Byb3BlcnR5TmFtZUVudW1lcmF0b3IuY3Bw
IGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMkEwNUFCRDMx
OTYxREYyNDAwMzQxNzUwIC8qIEpTUHJvcGVydHlOYW1lRW51bWVyYXRvci5jcHAgKi87IH07CkBA
IC0xNDU4LDYgKzE0NTYsOCBAQAogCQk3OUEwOTA4MDFENzY4NDY1MDA4Qjg4OUIgLyogSGFzaE1h
cEltcGwuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDc5
QTA5MDdFMUQ3Njg0NjUwMDhCODg5QiAvKiBIYXNoTWFwSW1wbC5oICovOyBzZXR0aW5ncyA9IHtB
VFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCTc5QTIyODM1MUQzNUQ3MUUwMEQ4RTA2
NyAvKiBBcml0aFByb2ZpbGUuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gNzlBMjI4MzMxRDM1RDcxRTAwRDhFMDY3IC8qIEFyaXRoUHJvZmlsZS5jcHAg
Ki87IH07CiAJCTc5QTIyODM2MUQzNUQ3MUYwMEQ4RTA2NyAvKiBBcml0aFByb2ZpbGUuaCBpbiBI
ZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDc5QTIyODM0MUQzNUQ3
MUUwMEQ4RTA2NyAvKiBBcml0aFByb2ZpbGUuaCAqLzsgfTsKKwkJNzlBNjdEQTgxRTVCOEIxODAw
REU0MDJBIC8qIEFpclJlZ2lzdGVyQWxsb2NhdG9yLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDc5QTY3REE2MUU1QjhCMTgwMERFNDAyQSAvKiBBaXJS
ZWdpc3RlckFsbG9jYXRvci5jcHAgKi87IH07CisJCTc5QTY3REE5MUU1QjhCMTgwMERFNDAyQSAv
KiBBaXJSZWdpc3RlckFsbG9jYXRvci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gNzlBNjdEQTcxRTVCOEIxODAwREU0MDJBIC8qIEFpclJlZ2lzdGVyQWxs
b2NhdG9yLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsK
IAkJNzlBRjBCRTQxRDNFRkQ0QzAwRTk1RkE1IC8qIEpJVE1hdGhJQ0lubGluZVJlc3VsdC5oIGlu
IEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNzlBRjBCRTMxRDNF
RkQ0QzAwRTk1RkE1IC8qIEpJVE1hdGhJQ0lubGluZVJlc3VsdC5oICovOyBzZXR0aW5ncyA9IHtB
VFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCTc5QjAwQ0JDMUM2QUIwN0UwMDg4QzY1
RCAvKiBQcm94eUNvbnN0cnVjdG9yLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IDc5QjAwQ0I4MUM2QUIwN0UwMDg4QzY1RCAvKiBQcm94eUNvbnN0cnVj
dG9yLmNwcCAqLzsgfTsKIAkJNzlCMDBDQkQxQzZBQjA3RTAwODhDNjVEIC8qIFByb3h5Q29uc3Ry
dWN0b3IuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDc5
QjAwQ0I5MUM2QUIwN0UwMDg4QzY1RCAvKiBQcm94eUNvbnN0cnVjdG9yLmggKi87IHNldHRpbmdz
ID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKQEAgLTM2NzEsOCArMzY3MSw2IEBA
CiAJCTI2MkQ4NUI0MUMwRDY1MEYwMDZBQ0I2MSAvKiBBaXJGaXhQYXJ0aWFsUmVnaXN0ZXJTdGFs
bHMuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBuYW1lID0gQWlyRml4UGFydGlh
bFJlZ2lzdGVyU3RhbGxzLmNwcDsgcGF0aCA9IGIzL2Fpci9BaXJGaXhQYXJ0aWFsUmVnaXN0ZXJT
dGFsbHMuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkyNjJEODVCNTFDMEQ2NTBG
MDA2QUNCNjEgLyogQWlyRml4UGFydGlhbFJlZ2lzdGVyU3RhbGxzLmggKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmMuaDsgbmFtZSA9IEFpckZpeFBhcnRpYWxSZWdpc3RlclN0YWxscy5oOyBwYXRoID0g
YjMvYWlyL0FpckZpeFBhcnRpYWxSZWdpc3RlclN0YWxscy5oOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB9OwogCQkyNjQwOTFGQTFCRTJGRDQxMDA2ODREQjIgLyogQWlyT3Bjb2RlLm9wY29kZXMg
Ki8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBu
YW1lID0gQWlyT3Bjb2RlLm9wY29kZXM7IHBhdGggPSBiMy9haXIvQWlyT3Bjb2RlLm9wY29kZXM7
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07Ci0JCTI2NzE4QkEyMUJFOTlGNzgwMDUyMDE3QiAv
KiBBaXJJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmNwcC5jcHA7IG5hbWUgPSBBaXJJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5jcHA7IHBhdGgg
PSBiMy9haXIvQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuY3BwOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OwotCQkyNjcxOEJBMzFCRTk5Rjc4MDA1MjAxN0IgLyogQWlySXRlcmF0ZWRS
ZWdpc3RlckNvYWxlc2NpbmcuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5j
b2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQWly
SXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuaDsgcGF0aCA9IGIzL2Fpci9BaXJJdGVyYXRlZFJl
Z2lzdGVyQ29hbGVzY2luZy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkyNjg0RDQz
NzFDMDAxNjFDMDA4MUQ2NjMgLyogQWlyTGl2ZW5lc3MuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUu
Yy5oOyBuYW1lID0gQWlyTGl2ZW5lc3MuaDsgcGF0aCA9IGIzL2Fpci9BaXJMaXZlbmVzcy5oOyBz
b3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkyNjlENjM2RDFCRkJFNUQwMDAxMDFCMUQgLyog
RlRMT3V0cHV0LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0g
NDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEZUTE91dHB1dC5o
OyBwYXRoID0gZnRsL0ZUTE91dHB1dC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQky
QTA1QUJEMzE5NjFERjI0MDAzNDE3NTAgLyogSlNQcm9wZXJ0eU5hbWVFbnVtZXJhdG9yLmNwcCAq
LyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25G
aWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEpTUHJvcGVydHlOYW1lRW51bWVy
YXRvci5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBAIC0zOTQ0LDYgKzM5NDIsOCBA
QAogCQk3OUEwOTA3RTFENzY4NDY1MDA4Qjg4OUIgLyogSGFzaE1hcEltcGwuaCAqLyA9IHtpc2Eg
PSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9
IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gSGFzaE1hcEltcGwuaDsgc291cmNlVHJlZSA9ICI8Z3Jv
dXA+IjsgfTsKIAkJNzlBMjI4MzMxRDM1RDcxRTAwRDhFMDY3IC8qIEFyaXRoUHJvZmlsZS5jcHAg
Ki8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBBcml0aFByb2ZpbGUuY3BwOyBz
b3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk3OUEyMjgzNDFEMzVENzFFMDBEOEUwNjcgLyog
QXJpdGhQcm9maWxlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5n
ID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEFyaXRoUHJv
ZmlsZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk3OUE2N0RBNjFFNUI4QjE4MDBE
RTQwMkEgLyogQWlyUmVnaXN0ZXJBbGxvY2F0b3IuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
cHAuY3BwOyBuYW1lID0gQWlyUmVnaXN0ZXJBbGxvY2F0b3IuY3BwOyBwYXRoID0gYjMvYWlyL0Fp
clJlZ2lzdGVyQWxsb2NhdG9yLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNzlB
NjdEQTcxRTVCOEIxODAwREU0MDJBIC8qIEFpclJlZ2lzdGVyQWxsb2NhdG9yLmggKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUg
PSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEFpclJlZ2lzdGVyQWxsb2NhdG9yLmg7IHBhdGggPSBi
My9haXIvQWlyUmVnaXN0ZXJBbGxvY2F0b3IuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsK
IAkJNzlBODk5RkUxRDM4NjEyRTAwRDE4QzczIC8qIEpJVE1hdGhJQ0ZvcndhcmRzLmggKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5
cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEpJVE1hdGhJQ0ZvcndhcmRzLmg7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CiAJCTc5QUYwQkUzMUQzRUZENEMwMEU5NUZBNSAvKiBKSVRNYXRo
SUNJbmxpbmVSZXN1bHQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rp
bmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gSklUTWF0
aElDSW5saW5lUmVzdWx0Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTc5QjAwQ0I4
MUM2QUIwN0UwMDg4QzY1RCAvKiBQcm94eUNvbnN0cnVjdG9yLmNwcCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFByb3h5Q29uc3RydWN0b3IuY3BwOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OwpAQCAtNTQ2Niw4ICs1NDY2LDYgQEAKIAkJCQkwRkVDODU1QTFCREFDREM3
MDA4MEZGNzQgLyogQWlySW5zdC5jcHAgKi8sCiAJCQkJMEZFQzg1NUIxQkRBQ0RDNzAwODBGRjc0
IC8qIEFpckluc3QuaCAqLywKIAkJCQkwRkVDODU1QzFCREFDREM3MDA4MEZGNzQgLyogQWlySW5z
dElubGluZXMuaCAqLywKLQkJCQkyNjcxOEJBMjFCRTk5Rjc4MDA1MjAxN0IgLyogQWlySXRlcmF0
ZWRSZWdpc3RlckNvYWxlc2NpbmcuY3BwICovLAotCQkJCTI2NzE4QkEzMUJFOTlGNzgwMDUyMDE3
QiAvKiBBaXJJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5oICovLAogCQkJCTBGREY2N0Q0MUQ5
REM0M0UwMDFCOTgyNSAvKiBBaXJLaW5kLmNwcCAqLywKIAkJCQkwRkRGNjdENTFEOURDNDNFMDAx
Qjk4MjUgLyogQWlyS2luZC5oICovLAogCQkJCTI2ODRENDM3MUMwMDE2MUMwMDgxRDY2MyAvKiBB
aXJMaXZlbmVzcy5oICovLApAQCAtNTQ4Niw2ICs1NDg0LDggQEAKIAkJCQkwRjlDQUJDNzFEQjU0
QTc2MDAwOEU4M0IgLyogQWlyUGFkSW50ZXJmZXJlbmNlLmggKi8sCiAJCQkJMEZFQzg1NUUxQkRB
Q0RDNzAwODBGRjc0IC8qIEFpclBoYXNlU2NvcGUuY3BwICovLAogCQkJCTBGRUM4NTVGMUJEQUNE
QzcwMDgwRkY3NCAvKiBBaXJQaGFzZVNjb3BlLmggKi8sCisJCQkJNzlBNjdEQTYxRTVCOEIxODAw
REU0MDJBIC8qIEFpclJlZ2lzdGVyQWxsb2NhdG9yLmNwcCAqLywKKwkJCQk3OUE2N0RBNzFFNUI4
QjE4MDBERTQwMkEgLyogQWlyUmVnaXN0ZXJBbGxvY2F0b3IuaCAqLywKIAkJCQkwRjQ1NzAzQTFC
RTQ1RjBBMDA2MkE2MjkgLyogQWlyUmVwb3J0VXNlZFJlZ2lzdGVycy5jcHAgKi8sCiAJCQkJMEY0
NTcwM0IxQkU0NUYwQTAwNjJBNjI5IC8qIEFpclJlcG9ydFVzZWRSZWdpc3RlcnMuaCAqLywKIAkJ
CQkwRjMzOERGQjFCRUQ1MTI3MDAxM0M4OEYgLyogQWlyU2ltcGxpZnlDRkcuY3BwICovLApAQCAt
NzkxMiw3ICs3OTEyLDYgQEAKIAkJCQkwRkVDODU3RTFCREFDREM3MDA4MEZGNzQgLyogQWlySW5z
ZXJ0aW9uU2V0LmggaW4gSGVhZGVycyAqLywKIAkJCQkwRkVDODU4MDFCREFDREM3MDA4MEZGNzQg
LyogQWlySW5zdC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJMEZFQzg1ODExQkRBQ0RDNzAwODBGRjc0
IC8qIEFpckluc3RJbmxpbmVzLmggaW4gSGVhZGVycyAqLywKLQkJCQkyNjcxOEJBNTFCRTk5Rjc4
MDA1MjAxN0IgLyogQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuaCBpbiBIZWFkZXJzICov
LAogCQkJCTBGREY2N0Q3MUQ5REM0NDIwMDFCOTgyNSAvKiBBaXJLaW5kLmggaW4gSGVhZGVycyAq
LywKIAkJCQkyNjg0RDQzODFDMDAxNjFDMDA4MUQ2NjMgLyogQWlyTGl2ZW5lc3MuaCBpbiBIZWFk
ZXJzICovLAogCQkJCTBGRTM0QzFBMUM0QjM5QUUwMDAzQTUxMiAvKiBBaXJMb2dSZWdpc3RlclBy
ZXNzdXJlLmggaW4gSGVhZGVycyAqLywKQEAgLTkxNTMsNiArOTE1Miw3IEBACiAJCQkJMTRBRDkx
MjQxRENBOUZBNDAwMTRGOUZFIC8qIFVubGlua2VkRXZhbENvZGVCbG9jay5oIGluIEhlYWRlcnMg
Ki8sCiAJCQkJMTRBRDkxMjMxRENBOUZBNDAwMTRGOUZFIC8qIFVubGlua2VkRnVuY3Rpb25Db2Rl
QmxvY2suaCBpbiBIZWFkZXJzICovLAogCQkJCTE0QUQ5MTI3MURDQTlGQTQwMDE0RjlGRSAvKiBV
bmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZS5oIGluIEhlYWRlcnMgKi8sCisJCQkJNzlBNjdEQTkx
RTVCOEIxODAwREU0MDJBIC8qIEFpclJlZ2lzdGVyQWxsb2NhdG9yLmggaW4gSGVhZGVycyAqLywK
IAkJCQkxNDE0MkU1MTFCNzk2RUNFMDBGNEJGNEIgLyogVW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFi
bGUuaCBpbiBIZWFkZXJzICovLAogCQkJCTE0QUQ5MTIyMURDQTlGQTQwMDE0RjlGRSAvKiBVbmxp
bmtlZEdsb2JhbENvZGVCbG9jay5oIGluIEhlYWRlcnMgKi8sCiAJCQkJMTRBRDkxMjUxRENBOUZB
NDAwMTRGOUZFIC8qIFVubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGVCbG9jay5oIGluIEhlYWRlcnMg
Ki8sCkBAIC05NzYxLDcgKzk3NjEsNiBAQAogCQkJCTBGRUM4NTdCMUJEQUNEQzcwMDgwRkY3NCAv
KiBBaXJIYW5kbGVDYWxsZWVTYXZlcy5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkwRkVDODU3RDFC
REFDREM3MDA4MEZGNzQgLyogQWlySW5zZXJ0aW9uU2V0LmNwcCBpbiBTb3VyY2VzICovLAogCQkJ
CTBGRUM4NTdGMUJEQUNEQzcwMDgwRkY3NCAvKiBBaXJJbnN0LmNwcCBpbiBTb3VyY2VzICovLAot
CQkJCTI2NzE4QkE0MUJFOTlGNzgwMDUyMDE3QiAvKiBBaXJJdGVyYXRlZFJlZ2lzdGVyQ29hbGVz
Y2luZy5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkwRkRGNjdENjFEOURDNDQwMDAxQjk4MjUgLyog
QWlyS2luZC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkwRkUzNEMxOTFDNEIzOUFFMDAwM0E1MTIg
LyogQWlyTG9nUmVnaXN0ZXJQcmVzc3VyZS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkwRjYxODMy
RTFDNDVCRjA3MDA3MjQ1MEIgLyogQWlyTG93ZXJBZnRlclJlZ0FsbG9jLmNwcCBpbiBTb3VyY2Vz
ICovLApAQCAtMTAwNTcsNiArMTAwNTYsNyBAQAogCQkJCTg2ODgwRjFGMTQzMjhCQjkwMEIwOEQ0
MiAvKiBERkdTcGVjdWxhdGl2ZUpJVDMyXzY0LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTg2ODgw
RjREMTQzNTNCMjEwMEIwOEQ0MiAvKiBERkdTcGVjdWxhdGl2ZUpJVDY0LmNwcCBpbiBTb3VyY2Vz
ICovLAogCQkJCTBGNjgyRkIyMTlCQ0IzNjQwMEZBM0JBRCAvKiBERkdTU0FDYWxjdWxhdG9yLmNw
cCBpbiBTb3VyY2VzICovLAorCQkJCTc5QTY3REE4MUU1QjhCMTgwMERFNDAyQSAvKiBBaXJSZWdp
c3RlckFsbG9jYXRvci5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlBN0Q4OUNGRjE3QTBCOENDMDA3
NzNBRDggLyogREZHU1NBQ29udmVyc2lvblBoYXNlLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTBG
QzIwQ0I5MTg1NTZBMzUwMEM5RTk1NCAvKiBERkdTU0FMb3dlcmluZ1BoYXNlLmNwcCBpbiBTb3Vy
Y2VzICovLAogCQkJCTBGOUZCNEY0MTdGQ0I5MTcwMENCNjdGOCAvKiBERkdTdGFja0xheW91dFBo
YXNlLmNwcCBpbiBTb3VyY2VzICovLApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fp
ci9BaXJHZW5lcmF0ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L2Fpci9BaXJHZW5lcmF0ZS5jcHAJKHJldmlzaW9uIDIxMjY2NikKKysrIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9haXIvQWlyR2VuZXJhdGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNiwxMyAr
MzYsMTMgQEAKICNpbmNsdWRlICJBaXJGaXhQYXJ0aWFsUmVnaXN0ZXJTdGFsbHMuaCIKICNpbmNs
dWRlICJBaXJHZW5lcmF0aW9uQ29udGV4dC5oIgogI2luY2x1ZGUgIkFpckhhbmRsZUNhbGxlZVNh
dmVzLmgiCi0jaW5jbHVkZSAiQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuaCIKICNpbmNs
dWRlICJBaXJMb2dSZWdpc3RlclByZXNzdXJlLmgiCiAjaW5jbHVkZSAiQWlyTG93ZXJBZnRlclJl
Z0FsbG9jLmgiCiAjaW5jbHVkZSAiQWlyTG93ZXJFbnRyeVN3aXRjaC5oIgogI2luY2x1ZGUgIkFp
ckxvd2VyTWFjcm9zLmgiCiAjaW5jbHVkZSAiQWlyT3Bjb2RlVXRpbHMuaCIKICNpbmNsdWRlICJB
aXJPcHRpbWl6ZUJsb2NrT3JkZXIuaCIKKyNpbmNsdWRlICJBaXJSZWdpc3RlckFsbG9jYXRvci5o
IgogI2luY2x1ZGUgIkFpclJlcG9ydFVzZWRSZWdpc3RlcnMuaCIKICNpbmNsdWRlICJBaXJTaW1w
bGlmeUNGRy5oIgogI2luY2x1ZGUgIkFpclNwaWxsRXZlcnl0aGluZy5oIgpAQCAtODksNyArODks
NyBAQCB2b2lkIHByZXBhcmVGb3JHZW5lcmF0aW9uKENvZGUmIGNvZGUpCiAgICAgaWYgKE9wdGlv
bnM6OmFpclNwaWxsc0V2ZXJ5dGhpbmcoKSkKICAgICAgICAgc3BpbGxFdmVyeXRoaW5nKGNvZGUp
OwogICAgIGVsc2UKLSAgICAgICAgaXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcoY29kZSk7Cisg
ICAgICAgIGFsbG9jYXRlUmVnaXN0ZXJzKGNvZGUpOwogCiAgICAgaWYgKE9wdGlvbnM6OmxvZ0Fp
clJlZ2lzdGVyUHJlc3N1cmUoKSkgewogICAgICAgICBkYXRhTG9nKCJSZWdpc3RlciBwcmVzc3Vy
ZSBhZnRlciByZWdpc3RlciBhbGxvY2F0aW9uOlxuIik7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvYWlyL0Fpckl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpckl0ZXJhdGVkUmVnaXN0ZXJDb2Fs
ZXNjaW5nLmNwcAkocmV2aXNpb24gMjEyNjY2KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L2Fpci9BaXJJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5jcHAJKG5vbmV4aXN0ZW50KQpAQCAt
MSwxNjU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNyBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAq
IGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUgotICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi0gKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKLSAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKLSAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJBaXJJdGVyYXRlZFJlZ2lz
dGVyQ29hbGVzY2luZy5oIgotCi0jaWYgRU5BQkxFKEIzX0pJVCkKLQotI2luY2x1ZGUgIkFpckNv
ZGUuaCIKLSNpbmNsdWRlICJBaXJJbnNlcnRpb25TZXQuaCIKLSNpbmNsdWRlICJBaXJJbnN0SW5s
aW5lcy5oIgotI2luY2x1ZGUgIkFpckxpdmVuZXNzLmgiCi0jaW5jbHVkZSAiQWlyUGFkSW50ZXJm
ZXJlbmNlLmgiCi0jaW5jbHVkZSAiQWlyUGhhc2VTY29wZS5oIgotI2luY2x1ZGUgIkFpclRtcElu
bGluZXMuaCIKLSNpbmNsdWRlICJBaXJUbXBXaWR0aC5oIgotI2luY2x1ZGUgIkFpclVzZUNvdW50
cy5oIgotI2luY2x1ZGUgPHd0Zi9MaXN0RHVtcC5oPgotCi1uYW1lc3BhY2UgSlNDIHsgbmFtZXNw
YWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7Ci0KLW5hbWVzcGFjZSB7Ci0KLWJvb2wgZGVidWcgPSBm
YWxzZTsKLWJvb2wgdHJhY2VEZWJ1ZyA9IGZhbHNlOwotYm9vbCByZXBvcnRTdGF0cyA9IGZhbHNl
OwotCi0vLyBUaGUgQWJzdHJhY3RDb2xvcmluZ0FsbG9jYXRvciBkZWZpbmVzIGFsbCB0aGUgY29k
ZSB0aGF0IGlzIGluZGVwZW5kYW50Ci0vLyBmcm9tIHRoZSB0eXBlIG9yIHJlZ2lzdGVyIGFuZCBj
YW4gYmUgc2hhcmVkIHdoZW4gYWxsb2NhdGluZyByZWdpc3RlcnMuCi10ZW1wbGF0ZTx0eXBlbmFt
ZSBJbmRleFR5cGU+Ci1jbGFzcyBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yIHsKLXB1YmxpYzoK
LSAgICBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yKGNvbnN0IFZlY3RvcjxSZWc+JiByZWdzSW5Q
cmlvcml0eU9yZGVyLCBJbmRleFR5cGUgbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4LCB1bnNp
Z25lZCB0bXBBcnJheVNpemUsIGNvbnN0IEhhc2hTZXQ8dW5zaWduZWQ+JiB1bnNwaWxsYWJsZVRt
cCkKLSAgICAgICAgOiBtX3JlZ3NJblByaW9yaXR5T3JkZXIocmVnc0luUHJpb3JpdHlPcmRlcikK
LSAgICAgICAgLCBtX2xhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleChsYXN0UHJlY29sb3JlZFJl
Z2lzdGVySW5kZXgpCi0gICAgICAgICwgbV91bnNwaWxsYWJsZVRtcHModW5zcGlsbGFibGVUbXAp
Ci0gICAgewotICAgICAgICBmb3IgKFJlZyByZWcgOiBtX3JlZ3NJblByaW9yaXR5T3JkZXIpCi0g
ICAgICAgICAgICBtX211dGFibGVSZWdzLnNldChyZWcpOwotICAgICAgICAKLSAgICAgICAgaW5p
dGlhbGl6ZURlZ3JlZXModG1wQXJyYXlTaXplKTsKLSAgICAgICAgCi0gICAgICAgIG1fYWRqYWNl
bmN5TGlzdC5yZXNpemUodG1wQXJyYXlTaXplKTsKLSAgICAgICAgbV9tb3ZlTGlzdC5yZXNpemUo
dG1wQXJyYXlTaXplKTsKLSAgICAgICAgbV9jb2FsZXNjZWRUbXBzLmZpbGwoMCwgdG1wQXJyYXlT
aXplKTsKLSAgICAgICAgbV9pc09uU2VsZWN0U3RhY2suZW5zdXJlU2l6ZSh0bXBBcnJheVNpemUp
OwotICAgIH0KLQotcHJvdGVjdGVkOgotICAgIEluZGV4VHlwZSBnZXRBbGlhcyhJbmRleFR5cGUg
dG1wSW5kZXgpIGNvbnN0Ci0gICAgewotICAgICAgICBJbmRleFR5cGUgYWxpYXMgPSB0bXBJbmRl
eDsKLSAgICAgICAgd2hpbGUgKEluZGV4VHlwZSBuZXh0QWxpYXMgPSBtX2NvYWxlc2NlZFRtcHNb
YWxpYXNdKQotICAgICAgICAgICAgYWxpYXMgPSBuZXh0QWxpYXM7Ci0gICAgICAgIHJldHVybiBh
bGlhczsKLSAgICB9Ci0KLSAgICB2b2lkIGFkZEVkZ2UoSW5kZXhUeXBlIGEsIEluZGV4VHlwZSBi
KQotICAgIHsKLSAgICAgICAgaWYgKGEgPT0gYikKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAg
ICAgYWRkRWRnZURpc3RpbmN0KGEsIGIpOwotICAgIH0KLQotICAgIHZvaWQgbWFrZVdvcmtMaXN0
KCkKLSAgICB7Ci0gICAgICAgIEluZGV4VHlwZSBmaXJzdE5vblJlZ0luZGV4ID0gbV9sYXN0UHJl
Y29sb3JlZFJlZ2lzdGVySW5kZXggKyAxOwotICAgICAgICBmb3IgKEluZGV4VHlwZSBpID0gZmly
c3ROb25SZWdJbmRleDsgaSA8IG1fZGVncmVlcy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAg
dW5zaWduZWQgZGVncmVlID0gbV9kZWdyZWVzW2ldOwotICAgICAgICAgICAgaWYgKGRlZ3JlZSA+
PSBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpKQotICAgICAgICAgICAgICAgIGFkZFRvU3Bp
bGwoaSk7Ci0gICAgICAgICAgICBlbHNlIGlmICghbV9tb3ZlTGlzdFtpXS5pc0VtcHR5KCkpCi0g
ICAgICAgICAgICAgICAgbV9mcmVlemVXb3JrbGlzdC5hZGQoaSk7Ci0gICAgICAgICAgICBlbHNl
Ci0gICAgICAgICAgICAgICAgbV9zaW1wbGlmeVdvcmtsaXN0LmFwcGVuZChpKTsKLSAgICAgICAg
fQotICAgIH0KLQotICAgIHZvaWQgYWRkVG9TcGlsbCh1bnNpZ25lZCB0b1NwaWxsKQotICAgIHsK
LSAgICAgICAgaWYgKG1fdW5zcGlsbGFibGVUbXBzLmNvbnRhaW5zKHRvU3BpbGwpKQotICAgICAg
ICAgICAgcmV0dXJuOwotCi0gICAgICAgIG1fc3BpbGxXb3JrbGlzdC5hZGQodG9TcGlsbCk7Ci0g
ICAgfQotCi0gICAgLy8gTG93LWRlZ3JlZSB2ZXJ0ZXggY2FuIGFsd2F5cyBiZSBjb2xvcmVkOiBq
dXN0IHBpY2sgYW55IG9mIHRoZSBjb2xvciB0YWtlbiBieSBhbnkKLSAgICAvLyBvdGhlciBhZGph
Y2VudCB2ZXJpY2VzLgotICAgIC8vIFRoZSAiU2ltcGxpZnkiIHBoYXNlIHRha2VzIGEgbG93LWRl
Z3JlZSBvdXQgb2YgdGhlIGludGVyZmVyZW5jZSBncmFwaCB0byBzaW1wbGlmeSBpdC4KLSAgICB2
b2lkIHNpbXBsaWZ5KCkKLSAgICB7Ci0gICAgICAgIEluZGV4VHlwZSBsYXN0SW5kZXggPSBtX3Np
bXBsaWZ5V29ya2xpc3QudGFrZUxhc3QoKTsKLQotICAgICAgICBBU1NFUlQoIW1fc2VsZWN0U3Rh
Y2suY29udGFpbnMobGFzdEluZGV4KSk7Ci0gICAgICAgIEFTU0VSVCghbV9pc09uU2VsZWN0U3Rh
Y2suZ2V0KGxhc3RJbmRleCkpOwotICAgICAgICBtX3NlbGVjdFN0YWNrLmFwcGVuZChsYXN0SW5k
ZXgpOwotICAgICAgICBtX2lzT25TZWxlY3RTdGFjay5xdWlja1NldChsYXN0SW5kZXgpOwotCi0g
ICAgICAgIGZvckVhY2hBZGphY2VudChsYXN0SW5kZXgsIFt0aGlzXShJbmRleFR5cGUgYWRqYWNl
bnRUbXBJbmRleCkgewotICAgICAgICAgICAgZGVjcmVtZW50RGVncmVlKGFkamFjZW50VG1wSW5k
ZXgpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIGZyZWV6ZSgpCi0gICAgewotICAg
ICAgICBJbmRleFR5cGUgdmljdGltSW5kZXggPSBtX2ZyZWV6ZVdvcmtsaXN0LnRha2VBbnkoKTsK
LSAgICAgICAgQVNTRVJUX1dJVEhfTUVTU0FHRShnZXRBbGlhcyh2aWN0aW1JbmRleCkgPT0gdmlj
dGltSW5kZXgsICJjb2FsZXNjZSgpIHNob3VsZCBub3QgbGVhdmUgYWxpYXNlZCBUbXAgaW4gdGhl
IHdvcmtsaXN0LiIpOwotICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuYXBwZW5kKHZpY3RpbUlu
ZGV4KTsKLSAgICAgICAgZnJlZXplTW92ZXModmljdGltSW5kZXgpOwotICAgIH0KLQotICAgIHZv
aWQgZnJlZXplTW92ZXMoSW5kZXhUeXBlIHRtcEluZGV4KQotICAgIHsKLSAgICAgICAgZm9yRWFj
aE5vZGVNb3Zlcyh0bXBJbmRleCwgW3RoaXMsIHRtcEluZGV4XSAoSW5kZXhUeXBlIG1vdmVJbmRl
eCkgewotICAgICAgICAgICAgaWYgKCFtX2FjdGl2ZU1vdmVzLnF1aWNrQ2xlYXIobW92ZUluZGV4
KSkKLSAgICAgICAgICAgICAgICBtX3dvcmtsaXN0TW92ZXMudGFrZU1vdmUobW92ZUluZGV4KTsK
LQotICAgICAgICAgICAgY29uc3QgTW92ZU9wZXJhbmRzJiBtb3ZlT3BlcmFuZHMgPSBtX2NvYWxl
c2NpbmdDYW5kaWRhdGVzW21vdmVJbmRleF07Ci0gICAgICAgICAgICBJbmRleFR5cGUgc3JjVG1w
SW5kZXggPSBtb3ZlT3BlcmFuZHMuc3JjSW5kZXg7Ci0gICAgICAgICAgICBJbmRleFR5cGUgZHN0
VG1wSW5kZXggPSBtb3ZlT3BlcmFuZHMuZHN0SW5kZXg7Ci0KLSAgICAgICAgICAgIEluZGV4VHlw
ZSBvcmlnaW5hbE90aGVyVG1wID0gc3JjVG1wSW5kZXggIT0gdG1wSW5kZXggPyBzcmNUbXBJbmRl
eCA6IGRzdFRtcEluZGV4OwotICAgICAgICAgICAgSW5kZXhUeXBlIG90aGVyVG1wSW5kZXggPSBn
ZXRBbGlhcyhvcmlnaW5hbE90aGVyVG1wKTsKLSAgICAgICAgICAgIGlmIChtX2RlZ3JlZXNbb3Ro
ZXJUbXBJbmRleF0gPCBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpICYmICFpc01vdmVSZWxh
dGVkKG90aGVyVG1wSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1fZnJlZXplV29ya2xp
c3QucmVtb3ZlKG90aGVyVG1wSW5kZXgpKQotICAgICAgICAgICAgICAgICAgICBtX3NpbXBsaWZ5
V29ya2xpc3QuYXBwZW5kKG90aGVyVG1wSW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9
KTsKLSAgICB9Ci0KLSAgICB2b2lkIGNvYWxlc2NlKCkKLSAgICB7Ci0gICAgICAgIHVuc2lnbmVk
IG1vdmVJbmRleCA9IG1fd29ya2xpc3RNb3Zlcy50YWtlTGFzdE1vdmUoKTsKLSAgICAgICAgY29u
c3QgTW92ZU9wZXJhbmRzJiBtb3ZlT3BlcmFuZHMgPSBtX2NvYWxlc2NpbmdDYW5kaWRhdGVzW21v
dmVJbmRleF07Ci0gICAgICAgIEluZGV4VHlwZSB1ID0gZ2V0QWxpYXMobW92ZU9wZXJhbmRzLnNy
Y0luZGV4KTsKLSAgICAgICAgSW5kZXhUeXBlIHYgPSBnZXRBbGlhcyhtb3ZlT3BlcmFuZHMuZHN0
SW5kZXgpOwotCi0gICAgICAgIGlmIChpc1ByZWNvbG9yZWQodikpCi0gICAgICAgICAgICBzdGQ6
OnN3YXAodSwgdik7Ci0KLSAgICAgICAgaWYgKHRyYWNlRGVidWcpCi0gICAgICAgICAgICBkYXRh
TG9nKCJDb2FsZXNjaW5nIG1vdmUgYXQgaW5kZXggIiwgbW92ZUluZGV4LCAiIHUgPSAiLCB1LCAi
IHYgPSAiLCB2LCAiXG4iKTsKLQotICAgICAgICBpZiAodSA9PSB2KSB7Ci0gICAgICAgICAgICBh
ZGRXb3JrTGlzdCh1KTsKLQotICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpCi0gICAgICAgICAg
ICAgICAgZGF0YUxvZygiICAgIENvYWxlc2NlZFxuIik7Ci0gICAgICAgIH0gZWxzZSBpZiAoaXNQ
cmVjb2xvcmVkKHYpCi0gICAgICAgICAgICB8fCBtX2ludGVyZmVyZW5jZUVkZ2VzLmNvbnRhaW5z
KEludGVyZmVyZW5jZUVkZ2UodSwgdikpCi0gICAgICAgICAgICB8fCAodSA9PSBtX2ZyYW1lUG9p
bnRlckluZGV4ICYmIG1faW50ZXJmZXJlc1dpdGhGcmFtZVBvaW50ZXIucXVpY2tHZXQodikpKSB7
Ci0gICAgICAgICAgICBhZGRXb3JrTGlzdCh1KTsKLSAgICAgICAgICAgIGFkZFdvcmtMaXN0KHYp
OwotCi0gICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKLSAgICAgICAgICAgICAgICBkYXRhTG9n
KCIgICAgQ29uc3RyYWluZWRcbiIpOwotICAgICAgICB9IGVsc2UgaWYgKGNhbkJlU2FmZWx5Q29h
bGVzY2VkKHUsIHYpKSB7Ci0gICAgICAgICAgICBjb21iaW5lKHUsIHYpOwotICAgICAgICAgICAg
YWRkV29ya0xpc3QodSk7Ci0gICAgICAgICAgICBtX2hhc0NvYWxlc2NlZE5vblRyaXZpYWxNb3Zl
ID0gdHJ1ZTsKLQotICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpCi0gICAgICAgICAgICAgICAg
ZGF0YUxvZygiICAgIFNhZmUgQ29hbGVzY2luZ1xuIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAg
ICAgICAgICBtX2FjdGl2ZU1vdmVzLnF1aWNrU2V0KG1vdmVJbmRleCk7Ci0KLSAgICAgICAgICAg
IGlmICh0cmFjZURlYnVnKQotICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICBGYWlsZWQgY29h
bGVzY2luZywgYWRkZWQgdG8gYWN0aXZlIG1vdmVzLlxuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0K
LSAgICB2b2lkIGFzc2lnbkNvbG9ycygpCi0gICAgewotICAgICAgICBBU1NFUlQobV9zaW1wbGlm
eVdvcmtsaXN0LmlzRW1wdHkoKSk7Ci0gICAgICAgIEFTU0VSVChtX3dvcmtsaXN0TW92ZXMuaXNF
bXB0eSgpKTsKLSAgICAgICAgQVNTRVJUKG1fZnJlZXplV29ya2xpc3QuaXNFbXB0eSgpKTsKLSAg
ICAgICAgQVNTRVJUKG1fc3BpbGxXb3JrbGlzdC5pc0VtcHR5KCkpOwotCi0gICAgICAgIC8vIFJl
Y2xhaW0gYXMgbXVjaCBtZW1vcnkgYXMgcG9zc2libGUuCi0gICAgICAgIG1faW50ZXJmZXJlbmNl
RWRnZXMuY2xlYXIoKTsKLSAgICAgICAgbV9kZWdyZWVzLmNsZWFyKCk7Ci0gICAgICAgIG1fbW92
ZUxpc3QuY2xlYXIoKTsKLSAgICAgICAgbV93b3JrbGlzdE1vdmVzLmNsZWFyKCk7Ci0gICAgICAg
IG1fc2ltcGxpZnlXb3JrbGlzdC5jbGVhcigpOwotICAgICAgICBtX3NwaWxsV29ya2xpc3QuY2xl
YXIoKTsKLSAgICAgICAgbV9mcmVlemVXb3JrbGlzdC5jbGVhcigpOwotCi0gICAgICAgIC8vIFRy
eSB0byBjb2xvciB0aGUgVG1wIG9uIHRoZSBzdGFjay4KLSAgICAgICAgbV9jb2xvcmVkVG1wLnJl
c2l6ZShtX2FkamFjZW5jeUxpc3Quc2l6ZSgpKTsKLQotICAgICAgICB3aGlsZSAoIW1fc2VsZWN0
U3RhY2suaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICB1bnNpZ25lZCB0bXBJbmRleCA9IG1fc2Vs
ZWN0U3RhY2sudGFrZUxhc3QoKTsKLSAgICAgICAgICAgIEFTU0VSVCghaXNQcmVjb2xvcmVkKHRt
cEluZGV4KSk7Ci0gICAgICAgICAgICBBU1NFUlQoIW1fY29sb3JlZFRtcFt0bXBJbmRleF0pOwot
Ci0gICAgICAgICAgICBSZWdpc3RlclNldCBjb2xvcmVkUmVnaXN0ZXJzOwotICAgICAgICAgICAg
Zm9yIChJbmRleFR5cGUgYWRqYWNlbnRUbXBJbmRleCA6IG1fYWRqYWNlbmN5TGlzdFt0bXBJbmRl
eF0pIHsKLSAgICAgICAgICAgICAgICBJbmRleFR5cGUgYWxpYXNUbXBJbmRleCA9IGdldEFsaWFz
KGFkamFjZW50VG1wSW5kZXgpOwotICAgICAgICAgICAgICAgIFJlZyByZWcgPSBtX2NvbG9yZWRU
bXBbYWxpYXNUbXBJbmRleF07Ci0KLSAgICAgICAgICAgICAgICBBU1NFUlQoIWlzUHJlY29sb3Jl
ZChhbGlhc1RtcEluZGV4KSB8fCAoaXNQcmVjb2xvcmVkKGFsaWFzVG1wSW5kZXgpICYmIHJlZykp
OwotCi0gICAgICAgICAgICAgICAgaWYgKHJlZykKLSAgICAgICAgICAgICAgICAgICAgY29sb3Jl
ZFJlZ2lzdGVycy5zZXQocmVnKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYm9vbCBj
b2xvckFzc2lnbmVkID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKFJlZyByZWcgOiBtX3JlZ3NJ
blByaW9yaXR5T3JkZXIpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWNvbG9yZWRSZWdpc3RlcnMu
Z2V0KHJlZykpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9jb2xvcmVkVG1wW3RtcEluZGV4XSA9
IHJlZzsKLSAgICAgICAgICAgICAgICAgICAgY29sb3JBc3NpZ25lZCA9IHRydWU7Ci0gICAgICAg
ICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQot
ICAgICAgICAgICAgaWYgKCFjb2xvckFzc2lnbmVkKQotICAgICAgICAgICAgICAgIG1fc3BpbGxl
ZFRtcHMuYXBwZW5kKHRtcEluZGV4KTsKLSAgICAgICAgfQotICAgICAgICBtX3NlbGVjdFN0YWNr
LmNsZWFyKCk7Ci0KLSAgICAgICAgaWYgKG1fc3BpbGxlZFRtcHMuaXNFbXB0eSgpKQotICAgICAg
ICAgICAgbV9jb2FsZXNjZWRUbXBzQXRTcGlsbC5jbGVhcigpOwotICAgICAgICBlbHNlCi0gICAg
ICAgICAgICBtX2NvbG9yZWRUbXAuY2xlYXIoKTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgdm9p
ZCBpbml0aWFsaXplRGVncmVlcyh1bnNpZ25lZCB0bXBBcnJheVNpemUpCi0gICAgewotICAgICAg
ICBtX2RlZ3JlZXMucmVzaXplKHRtcEFycmF5U2l6ZSk7Ci0KLSAgICAgICAgLy8gQWxsIHByZWNv
bG9yZWQgcmVnaXN0ZXJzIGhhdmUgIGFuICJpbmZpbml0ZSIgZGVncmVlLgotICAgICAgICB1bnNp
Z25lZCBmaXJzdE5vblJlZ0luZGV4ID0gbV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXggKyAx
OwotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZmlyc3ROb25SZWdJbmRleDsgKytp
KQotICAgICAgICAgICAgbV9kZWdyZWVzW2ldID0gc3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25l
ZD46Om1heCgpOwotCi0gICAgICAgIG1lbXNldChtX2RlZ3JlZXMuZGF0YSgpICsgZmlyc3ROb25S
ZWdJbmRleCwgMCwgKHRtcEFycmF5U2l6ZSAtIGZpcnN0Tm9uUmVnSW5kZXgpICogc2l6ZW9mKHVu
c2lnbmVkKSk7Ci0gICAgfQotCi0gICAgdm9pZCBhZGRFZGdlRGlzdGluY3QoSW5kZXhUeXBlIGEs
IEluZGV4VHlwZSBiKQotICAgIHsKLSAgICAgICAgQVNTRVJUKGEgIT0gYik7Ci0gICAgICAgIGlm
IChtX2ludGVyZmVyZW5jZUVkZ2VzLmFkZChJbnRlcmZlcmVuY2VFZGdlKGEsIGIpKS5pc05ld0Vu
dHJ5KSB7Ci0gICAgICAgICAgICBpZiAoIWlzUHJlY29sb3JlZChhKSkgewotICAgICAgICAgICAg
ICAgIEFTU0VSVCghbV9hZGphY2VuY3lMaXN0W2FdLmNvbnRhaW5zKGIpKTsKLSAgICAgICAgICAg
ICAgICBtX2FkamFjZW5jeUxpc3RbYV0uYXBwZW5kKGIpOwotICAgICAgICAgICAgICAgIG1fZGVn
cmVlc1thXSsrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWlzUHJlY29sb3Jl
ZChiKSkgewotICAgICAgICAgICAgICAgIEFTU0VSVCghbV9hZGphY2VuY3lMaXN0W2JdLmNvbnRh
aW5zKGEpKTsKLSAgICAgICAgICAgICAgICBtX2FkamFjZW5jeUxpc3RbYl0uYXBwZW5kKGEpOwot
ICAgICAgICAgICAgICAgIG1fZGVncmVlc1tiXSsrOwotICAgICAgICAgICAgfQotICAgICAgICB9
Ci0gICAgfQotCi0gICAgdm9pZCBkZWNyZW1lbnREZWdyZWUoSW5kZXhUeXBlIHRtcEluZGV4KQot
ICAgIHsKLSAgICAgICAgQVNTRVJUKG1fZGVncmVlc1t0bXBJbmRleF0pOwotCi0gICAgICAgIHVu
c2lnbmVkIG9sZERlZ3JlZSA9IG1fZGVncmVlc1t0bXBJbmRleF0tLTsKLSAgICAgICAgaWYgKG9s
ZERlZ3JlZSA9PSBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBl
bmFibGVNb3Zlc09uVmFsdWVBbmRBZGphY2VudHModG1wSW5kZXgpOwotICAgICAgICAgICAgbV9z
cGlsbFdvcmtsaXN0LnJlbW92ZSh0bXBJbmRleCk7Ci0gICAgICAgICAgICBpZiAoaXNNb3ZlUmVs
YXRlZCh0bXBJbmRleCkpCi0gICAgICAgICAgICAgICAgbV9mcmVlemVXb3JrbGlzdC5hZGQodG1w
SW5kZXgpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG1fc2ltcGxpZnlXb3Jr
bGlzdC5hcHBlbmQodG1wSW5kZXgpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBib29sIGFk
ZEVkZ2VEaXN0aW5jdFdpdGhvdXREZWdyZWVDaGFuZ2UoSW5kZXhUeXBlIGEsIEluZGV4VHlwZSBi
KQotICAgIHsKLSAgICAgICAgQVNTRVJUKGEgIT0gYik7Ci0gICAgICAgIGlmIChtX2ludGVyZmVy
ZW5jZUVkZ2VzLmFkZChJbnRlcmZlcmVuY2VFZGdlKGEsIGIpKS5pc05ld0VudHJ5KSB7Ci0gICAg
ICAgICAgICBpZiAoIWlzUHJlY29sb3JlZChhKSkgewotICAgICAgICAgICAgICAgIEFTU0VSVCgh
bV9hZGphY2VuY3lMaXN0W2FdLmNvbnRhaW5zKGIpKTsKLSAgICAgICAgICAgICAgICBtX2FkamFj
ZW5jeUxpc3RbYV0uYXBwZW5kKGIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAo
IWlzUHJlY29sb3JlZChiKSkgewotICAgICAgICAgICAgICAgIEFTU0VSVCghbV9hZGphY2VuY3lM
aXN0W2JdLmNvbnRhaW5zKGEpKTsKLSAgICAgICAgICAgICAgICBtX2FkamFjZW5jeUxpc3RbYl0u
YXBwZW5kKGEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAg
ICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2wgaXNNb3ZlUmVs
YXRlZChJbmRleFR5cGUgdG1wSW5kZXgpCi0gICAgewotICAgICAgICBmb3IgKHVuc2lnbmVkIG1v
dmVJbmRleCA6IG1fbW92ZUxpc3RbdG1wSW5kZXhdKSB7Ci0gICAgICAgICAgICBpZiAobV9hY3Rp
dmVNb3Zlcy5xdWlja0dldChtb3ZlSW5kZXgpIHx8IG1fd29ya2xpc3RNb3Zlcy5jb250YWlucyht
b3ZlSW5kZXgpKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdGlv
bj4KLSAgICB2b2lkIGZvckVhY2hBZGphY2VudChJbmRleFR5cGUgdG1wSW5kZXgsIEZ1bmN0aW9u
IGZ1bmN0aW9uKQotICAgIHsKLSAgICAgICAgZm9yIChJbmRleFR5cGUgYWRqYWNlbnRUbXBJbmRl
eCA6IG1fYWRqYWNlbmN5TGlzdFt0bXBJbmRleF0pIHsKLSAgICAgICAgICAgIGlmICghaGFzQmVl
blNpbXBsaWZpZWQoYWRqYWNlbnRUbXBJbmRleCkpCi0gICAgICAgICAgICAgICAgZnVuY3Rpb24o
YWRqYWNlbnRUbXBJbmRleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBib29sIGhhc0JlZW5T
aW1wbGlmaWVkKEluZGV4VHlwZSB0bXBJbmRleCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2lz
T25TZWxlY3RTdGFjay5xdWlja0dldCh0bXBJbmRleCkgfHwgISFtX2NvYWxlc2NlZFRtcHNbdG1w
SW5kZXhdOwotICAgIH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0aW9uPgotICAgIHZv
aWQgZm9yRWFjaE5vZGVNb3ZlcyhJbmRleFR5cGUgdG1wSW5kZXgsIEZ1bmN0aW9uIGZ1bmN0aW9u
KQotICAgIHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBtb3ZlSW5kZXggOiBtX21vdmVMaXN0W3Rt
cEluZGV4XSkgewotICAgICAgICAgICAgaWYgKG1fYWN0aXZlTW92ZXMucXVpY2tHZXQobW92ZUlu
ZGV4KSB8fCBtX3dvcmtsaXN0TW92ZXMuY29udGFpbnMobW92ZUluZGV4KSkKLSAgICAgICAgICAg
ICAgICBmdW5jdGlvbihtb3ZlSW5kZXgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBl
bmFibGVNb3Zlc09uVmFsdWUoSW5kZXhUeXBlIHRtcEluZGV4KQotICAgIHsKLSAgICAgICAgZm9y
ICh1bnNpZ25lZCBtb3ZlSW5kZXggOiBtX21vdmVMaXN0W3RtcEluZGV4XSkgewotICAgICAgICAg
ICAgaWYgKG1fYWN0aXZlTW92ZXMucXVpY2tDbGVhcihtb3ZlSW5kZXgpKQotICAgICAgICAgICAg
ICAgIG1fd29ya2xpc3RNb3Zlcy5yZXR1cm5Nb3ZlKG1vdmVJbmRleCk7Ci0gICAgICAgIH0KLSAg
ICB9Ci0KLSAgICB2b2lkIGVuYWJsZU1vdmVzT25WYWx1ZUFuZEFkamFjZW50cyhJbmRleFR5cGUg
dG1wSW5kZXgpCi0gICAgewotICAgICAgICBlbmFibGVNb3Zlc09uVmFsdWUodG1wSW5kZXgpOwot
Ci0gICAgICAgIGZvckVhY2hBZGphY2VudCh0bXBJbmRleCwgW3RoaXNdIChJbmRleFR5cGUgYWRq
YWNlbnRUbXBJbmRleCkgewotICAgICAgICAgICAgZW5hYmxlTW92ZXNPblZhbHVlKGFkamFjZW50
VG1wSW5kZXgpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBib29sIGlzUHJlY29sb3JlZChJ
bmRleFR5cGUgdG1wSW5kZXgpCi0gICAgewotICAgICAgICByZXR1cm4gdG1wSW5kZXggPD0gbV9s
YXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXg7Ci0gICAgfQotCi0gICAgdm9pZCBhZGRXb3JrTGlz
dChJbmRleFR5cGUgdG1wSW5kZXgpCi0gICAgewotICAgICAgICBpZiAoIWlzUHJlY29sb3JlZCh0
bXBJbmRleCkgJiYgbV9kZWdyZWVzW3RtcEluZGV4XSA8IG1fcmVnc0luUHJpb3JpdHlPcmRlci5z
aXplKCkgJiYgIWlzTW92ZVJlbGF0ZWQodG1wSW5kZXgpKSB7Ci0gICAgICAgICAgICBtX2ZyZWV6
ZVdvcmtsaXN0LnJlbW92ZSh0bXBJbmRleCk7Ci0gICAgICAgICAgICBtX3NpbXBsaWZ5V29ya2xp
c3QuYXBwZW5kKHRtcEluZGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgY29tYmlu
ZShJbmRleFR5cGUgdSwgSW5kZXhUeXBlIHYpCi0gICAgewotICAgICAgICBpZiAoIW1fZnJlZXpl
V29ya2xpc3QucmVtb3ZlKHYpKQotICAgICAgICAgICAgbV9zcGlsbFdvcmtsaXN0LnJlbW92ZSh2
KTsKLQotICAgICAgICBBU1NFUlQoIW1fY29hbGVzY2VkVG1wc1t2XSk7Ci0gICAgICAgIG1fY29h
bGVzY2VkVG1wc1t2XSA9IHU7Ci0KLSAgICAgICAgYXV0byYgdk1vdmVzID0gbV9tb3ZlTGlzdFt2
XTsKLSAgICAgICAgbV9tb3ZlTGlzdFt1XS5hZGQodk1vdmVzLmJlZ2luKCksIHZNb3Zlcy5lbmQo
KSk7Ci0KLSAgICAgICAgZm9yRWFjaEFkamFjZW50KHYsIFt0aGlzLCB1XSAoSW5kZXhUeXBlIGFk
amFjZW50VG1wSW5kZXgpIHsKLSAgICAgICAgICAgIGlmIChhZGRFZGdlRGlzdGluY3RXaXRob3V0
RGVncmVlQ2hhbmdlKGFkamFjZW50VG1wSW5kZXgsIHUpKSB7Ci0gICAgICAgICAgICAgICAgLy8g
SWYgd2UgYWRkZWQgYSBuZXcgZWRnZSBiZXR3ZWVuIHRoZSBhZGphY2VudFRtcCBhbmQgdSwgaXQg
cmVwbGFjZXMgdGhlIGVkZ2UKLSAgICAgICAgICAgICAgICAvLyB0aGF0IGV4aXN0ZWQgd2l0aCB2
LgotICAgICAgICAgICAgICAgIC8vIFRoZSBkZWdyZWUgb2YgYWRqYWNlbnRUbXAgcmVtYWlucyB0
aGUgc2FtZSBzaW5jZSB0aGUgZWRnZSBqdXN0IGNoYW5nZWQgZnJvbSB1IHRvIHYuCi0gICAgICAg
ICAgICAgICAgLy8gQWxsIHdlIG5lZWQgdG8gZG8gaXMgdXBkYXRlIHRoZSBkZWdyZWUgb2YgdS4K
LSAgICAgICAgICAgICAgICBpZiAoIWlzUHJlY29sb3JlZCh1KSkKLSAgICAgICAgICAgICAgICAg
ICAgbV9kZWdyZWVzW3VdKys7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAg
IC8vIElmIHdlIGFscmVhZHkgaGFkIGFuIGVkZ2UgYmV0d2VlbiB0aGUgYWRqYWNlbnRUbXAgYW5k
IHUsIHRoZSBkZWdyZWUgb2YgdQotICAgICAgICAgICAgICAgIC8vIGlzIGFscmVhZHkgY29ycmVj
dC4gVGhlIGRlZ3JlZSBvZiB0aGUgYWRqYWNlbnRUbXAgZGVjcmVhc2VzIHNpbmNlIHRoZSBlZGdl
Ci0gICAgICAgICAgICAgICAgLy8gd2l0aCB2IGlzIG5vIGxvbmdlciByZWxldmFudCAod2UgY2Fu
IHRoaW5rIG9mIGl0IGFzIG1lcmdlZCB3aXRoIHRoZSBlZGdlIHdpdGggdSkuCi0gICAgICAgICAg
ICAgICAgZGVjcmVtZW50RGVncmVlKGFkamFjZW50VG1wSW5kZXgpOwotICAgICAgICAgICAgfQot
ICAgICAgICB9KTsKLQotICAgICAgICBpZiAobV9mcmFtZVBvaW50ZXJJbmRleCAmJiBtX2ludGVy
ZmVyZXNXaXRoRnJhbWVQb2ludGVyLnF1aWNrR2V0KHYpKQotICAgICAgICAgICAgbV9pbnRlcmZl
cmVzV2l0aEZyYW1lUG9pbnRlci5xdWlja1NldCh1KTsKLQotICAgICAgICBpZiAobV9kZWdyZWVz
W3VdID49IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkgJiYgbV9mcmVlemVXb3JrbGlzdC5y
ZW1vdmUodSkpCi0gICAgICAgICAgICBhZGRUb1NwaWxsKHUpOwotICAgIH0KLQotICAgIGJvb2wg
Y2FuQmVTYWZlbHlDb2FsZXNjZWQoSW5kZXhUeXBlIHUsIEluZGV4VHlwZSB2KQotICAgIHsKLSAg
ICAgICAgQVNTRVJUKCFpc1ByZWNvbG9yZWQodikpOwotICAgICAgICBpZiAoaXNQcmVjb2xvcmVk
KHUpKQotICAgICAgICAgICAgcmV0dXJuIHByZWNvbG9yZWRDb2FsZXNjaW5nSGV1cmlzdGljKHUs
IHYpOwotICAgICAgICByZXR1cm4gY29uc2VydmF0aXZlSGV1cmlzdGljKHUsIHYpOwotICAgIH0K
LQotICAgIGJvb2wgY29uc2VydmF0aXZlSGV1cmlzdGljKEluZGV4VHlwZSB1LCBJbmRleFR5cGUg
dikKLSAgICB7Ci0gICAgICAgIC8vIFRoaXMgaXMgdXNpbmcgdGhlIEJyaWdncycgY29uc2VydmF0
aXZlIGNvYWxlc2NpbmcgcnVsZToKLSAgICAgICAgLy8gSWYgdGhlIG51bWJlciBvZiBjb21iaW5l
ZCBhZGphY2VudCBub2RlIHdpdGggYSBkZWdyZWUgPj0gSyBpcyBsZXNzIHRoYW4gSywKLSAgICAg
ICAgLy8gaXQgaXMgc2FmZSB0byBjb21iaW5lIHRoZSB0d28gbm9kZXMuIFRoZSByZWFzb24gaXMg
dGhhdCB3ZSBrbm93IHRoYXQgaWYgdGhlIGdyYXBoCi0gICAgICAgIC8vIGlzIGNvbG9yYWJsZSwg
d2UgaGF2ZSBmZXdlciB0aGFuIEsgYWRqYWNlbnRzIHdpdGggaGlnaCBvcmRlciBhbmQgdGhlcmUg
aXMgYSBjb2xvcgotICAgICAgICAvLyBmb3IgdGhlIGN1cnJlbnQgbm9kZS4KLSAgICAgICAgQVNT
RVJUKHUgIT0gdik7Ci0gICAgICAgIEFTU0VSVCghaXNQcmVjb2xvcmVkKHUpKTsKLSAgICAgICAg
QVNTRVJUKCFpc1ByZWNvbG9yZWQodikpOwotCi0gICAgICAgIGNvbnN0IGF1dG8mIGFkamFjZW50
c09mVSA9IG1fYWRqYWNlbmN5TGlzdFt1XTsKLSAgICAgICAgY29uc3QgYXV0byYgYWRqYWNlbnRz
T2ZWID0gbV9hZGphY2VuY3lMaXN0W3ZdOwotCi0gICAgICAgIGlmIChhZGphY2VudHNPZlUuc2l6
ZSgpICsgYWRqYWNlbnRzT2ZWLnNpemUoKSA8IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkp
IHsKLSAgICAgICAgICAgIC8vIFNob3J0Y3V0OiBpZiB0aGUgdG90YWwgbnVtYmVyIG9mIGFkamFj
ZW50cyBpcyBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiByZWdpc3RlciwgdGhlIGNvbmRpdGlvbiBp
cyBhbHdheXMgbWV0LgotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAg
ICAgICBIYXNoU2V0PEluZGV4VHlwZT4gaGlnaE9yZGVyQWRqYWNlbnRzOwotCi0gICAgICAgIGZv
ciAoSW5kZXhUeXBlIGFkamFjZW50VG1wSW5kZXggOiBhZGphY2VudHNPZlUpIHsKLSAgICAgICAg
ICAgIEFTU0VSVChhZGphY2VudFRtcEluZGV4ICE9IHYpOwotICAgICAgICAgICAgQVNTRVJUKGFk
amFjZW50VG1wSW5kZXggIT0gdSk7Ci0gICAgICAgICAgICBpZiAoIWhhc0JlZW5TaW1wbGlmaWVk
KGFkamFjZW50VG1wSW5kZXgpICYmIG1fZGVncmVlc1thZGphY2VudFRtcEluZGV4XSA+PSBtX3Jl
Z3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgYXV0byBhZGRSZXN1
bHQgPSBoaWdoT3JkZXJBZGphY2VudHMuYWRkKGFkamFjZW50VG1wSW5kZXgpOwotICAgICAgICAg
ICAgICAgIGlmIChhZGRSZXN1bHQuaXNOZXdFbnRyeSAmJiBoaWdoT3JkZXJBZGphY2VudHMuc2l6
ZSgpID49IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkpCi0gICAgICAgICAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmb3IgKElu
ZGV4VHlwZSBhZGphY2VudFRtcEluZGV4IDogYWRqYWNlbnRzT2ZWKSB7Ci0gICAgICAgICAgICBB
U1NFUlQoYWRqYWNlbnRUbXBJbmRleCAhPSB1KTsKLSAgICAgICAgICAgIEFTU0VSVChhZGphY2Vu
dFRtcEluZGV4ICE9IHYpOwotICAgICAgICAgICAgaWYgKCFoYXNCZWVuU2ltcGxpZmllZChhZGph
Y2VudFRtcEluZGV4KSAmJiBtX2RlZ3JlZXNbYWRqYWNlbnRUbXBJbmRleF0gPj0gbV9yZWdzSW5Q
cmlvcml0eU9yZGVyLnNpemUoKSkgewotICAgICAgICAgICAgICAgIGF1dG8gYWRkUmVzdWx0ID0g
aGlnaE9yZGVyQWRqYWNlbnRzLmFkZChhZGphY2VudFRtcEluZGV4KTsKLSAgICAgICAgICAgICAg
ICBpZiAoYWRkUmVzdWx0LmlzTmV3RW50cnkgJiYgaGlnaE9yZGVyQWRqYWNlbnRzLnNpemUoKSA+
PSBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpKQotICAgICAgICAgICAgICAgICAgICByZXR1
cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBBU1NFUlQoaGln
aE9yZGVyQWRqYWNlbnRzLnNpemUoKSA8IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkpOwot
ICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBib29sIHByZWNvbG9yZWRDb2FsZXNj
aW5nSGV1cmlzdGljKEluZGV4VHlwZSB1LCBJbmRleFR5cGUgdikKLSAgICB7Ci0gICAgICAgIGlm
ICh0cmFjZURlYnVnKQotICAgICAgICAgICAgZGF0YUxvZygiICAgIENoZWNraW5nIHByZWNvbG9y
ZWRDb2FsZXNjaW5nSGV1cmlzdGljXG4iKTsKLSAgICAgICAgQVNTRVJUKGlzUHJlY29sb3JlZCh1
KSk7Ci0gICAgICAgIEFTU0VSVCghaXNQcmVjb2xvcmVkKHYpKTsKLSAgICAgICAgCi0gICAgICAg
IC8vIElmIHUgaXMgYSBwaW5uZWQgcmVnaXN0ZXIgdGhlbiBpdCdzIGFsd2F5cyBzYWZlIHRvIGNv
YWxlc2NlLiBOb3RlIHRoYXQgd2hlbiB3ZSBjYWxsIHRoaXMsCi0gICAgICAgIC8vIHdlIGhhdmUg
YWxyZWFkeSBwcm92ZWQgdGhhdCB0aGVyZSBpcyBubyBpbnRlcmZlcmVuY2UgYmV0d2VlbiB1IGFu
ZCB2LgotICAgICAgICBpZiAoIW1fbXV0YWJsZVJlZ3MuZ2V0KG1fY29sb3JlZFRtcFt1XSkpCi0g
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICAvLyBJZiBhbnkgYWRqYWNlbnQgb2Yg
dGhlIG5vbi1jb2xvcmVkIG5vZGUgaXMgbm90IGFuIGFkamFjZW50IG9mIHRoZSBjb2xvcmVkIG5v
ZGUgQU5EIGhhcyBhIGRlZ3JlZSA+PSBLCi0gICAgICAgIC8vIHRoZXJlIGlzIGEgcmlzayB0aGF0
IHRoaXMgbm9kZSBuZWVkcyB0byBoYXZlIHRoZSBzYW1lIGNvbG9yIGFzIG91ciBwcmVjb2xvcmVk
IG5vZGUuIElmIHdlIGNvYWxlc2NlIHN1Y2gKLSAgICAgICAgLy8gbW92ZSwgd2UgbWF5IGNyZWF0
ZSBhbiB1bmNvbG9yYWJsZSBncmFwaC4KLSAgICAgICAgY29uc3QgYXV0byYgYWRqYWNlbnRzT2ZW
ID0gbV9hZGphY2VuY3lMaXN0W3ZdOwotICAgICAgICBmb3IgKHVuc2lnbmVkIGFkamFjZW50VG1w
SW5kZXggOiBhZGphY2VudHNPZlYpIHsKLSAgICAgICAgICAgIGlmICghaXNQcmVjb2xvcmVkKGFk
amFjZW50VG1wSW5kZXgpCi0gICAgICAgICAgICAgICAgJiYgIWhhc0JlZW5TaW1wbGlmaWVkKGFk
amFjZW50VG1wSW5kZXgpCi0gICAgICAgICAgICAgICAgJiYgbV9kZWdyZWVzW2FkamFjZW50VG1w
SW5kZXhdID49IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkKLSAgICAgICAgICAgICAgICAm
JiAhbV9pbnRlcmZlcmVuY2VFZGdlcy5jb250YWlucyhJbnRlcmZlcmVuY2VFZGdlKHUsIGFkamFj
ZW50VG1wSW5kZXgpKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0K
LSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi1wcm90ZWN0ZWQ6Ci0jaWYgUExBVEZPUk0o
Q09DT0EpCi0jcHJhZ21hIG1hcmsgLQotI2VuZGlmCi0KLSAgICAvLyBJbnRlcmZlcmVuY2UgZWRn
ZXMgYXJlIG5vdCBkaXJlY3RlZC4gQW4gZWRnZSBiZXR3ZWVuIGFueSB0d28gVG1wcyBpcyByZXBy
ZXNlbnRlZAotICAgIC8vIGJ5IHRoZSBjb25jYXRlbmF0ZWQgdmFsdWVzIG9mIHRoZSBzbWFsbGVz
dCBUbXAgZm9sbG93ZWQgYnkgdGhlIGJpZ2dlciBUbXAuCi0gICAgY2xhc3MgSW50ZXJmZXJlbmNl
RWRnZSB7Ci0gICAgcHVibGljOgotICAgICAgICBJbnRlcmZlcmVuY2VFZGdlKCkKLSAgICAgICAg
ewotICAgICAgICB9Ci0KLSAgICAgICAgSW50ZXJmZXJlbmNlRWRnZShJbmRleFR5cGUgYSwgSW5k
ZXhUeXBlIGIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFTU0VSVChhKTsKLSAgICAgICAgICAg
IEFTU0VSVChiKTsKLSAgICAgICAgICAgIEFTU0VSVF9XSVRIX01FU1NBR0UoYSAhPSBiLCAiQSBU
bXAgY2FuIG5ldmVyIGludGVyZmVyZSB3aXRoIGl0c2VsZi4gRG9pbmcgc28gd291bGQgZm9yY2Ug
aXQgdG8gYmUgdGhlIHN1cGVycG9zaXRpb24gb2YgdHdvIHJlZ2lzdGVycy4iKTsKLQotICAgICAg
ICAgICAgaWYgKGIgPCBhKQotICAgICAgICAgICAgICAgIHN0ZDo6c3dhcChhLCBiKTsKLSAgICAg
ICAgICAgIG1fdmFsdWUgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oYSkgPDwgMzIgfCBiOwotICAg
ICAgICB9Ci0KLSAgICAgICAgSW50ZXJmZXJlbmNlRWRnZShXVEY6Okhhc2hUYWJsZURlbGV0ZWRW
YWx1ZVR5cGUpCi0gICAgICAgICAgICA6IG1fdmFsdWUoc3RkOjpudW1lcmljX2xpbWl0czx1aW50
NjRfdD46Om1heCgpKQotICAgICAgICB7Ci0gICAgICAgIH0KLQotICAgICAgICBJbmRleFR5cGUg
Zmlyc3QoKSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbV92YWx1ZSA+PiAz
MiAmIDB4ZmZmZmZmZmY7Ci0gICAgICAgIH0KLQotICAgICAgICBJbmRleFR5cGUgc2Vjb25kKCkg
Y29uc3QKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1fdmFsdWUgJiAweGZmZmZmZmZm
OwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEludGVyZmVyZW5j
ZUVkZ2Ugb3RoZXIpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtX3ZhbHVl
ID09IG90aGVyLm1fdmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sIGlzSGFzaFRhYmxl
RGVsZXRlZFZhbHVlKCkgY29uc3QKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICp0aGlz
ID09IEludGVyZmVyZW5jZUVkZ2UoV1RGOjpIYXNoVGFibGVEZWxldGVkVmFsdWUpOwotICAgICAg
ICB9Ci0KLSAgICAgICAgdW5zaWduZWQgaGFzaCgpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAg
ICAgIHJldHVybiBXVEY6OkludEhhc2g8dWludDY0X3Q+OjpoYXNoKG1fdmFsdWUpOwotICAgICAg
ICB9Ci0KLSAgICAgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Ci0gICAgICAg
IHsKLSAgICAgICAgICAgIG91dC5wcmludChmaXJzdCgpLCAiPD0+Iiwgc2Vjb25kKCkpOwotICAg
ICAgICB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICB1aW50NjRfdCBtX3ZhbHVlIHsgMCB9Owot
ICAgIH07Ci0KLSAgICBzdHJ1Y3QgSW50ZXJmZXJlbmNlRWRnZUhhc2ggewotICAgICAgICBzdGF0
aWMgdW5zaWduZWQgaGFzaChjb25zdCBJbnRlcmZlcmVuY2VFZGdlJiBrZXkpIHsgcmV0dXJuIGtl
eS5oYXNoKCk7IH0KLSAgICAgICAgc3RhdGljIGJvb2wgZXF1YWwoY29uc3QgSW50ZXJmZXJlbmNl
RWRnZSYgYSwgY29uc3QgSW50ZXJmZXJlbmNlRWRnZSYgYikgeyByZXR1cm4gYSA9PSBiOyB9Ci0g
ICAgICAgIHN0YXRpYyBjb25zdCBib29sIHNhZmVUb0NvbXBhcmVUb0VtcHR5T3JEZWxldGVkID0g
dHJ1ZTsKLSAgICB9OwotICAgIHR5cGVkZWYgU2ltcGxlQ2xhc3NIYXNoVHJhaXRzPEludGVyZmVy
ZW5jZUVkZ2U+IEludGVyZmVyZW5jZUVkZ2VIYXNoVHJhaXRzOwotCi0gICAgY29uc3QgVmVjdG9y
PFJlZz4mIG1fcmVnc0luUHJpb3JpdHlPcmRlcjsKLSAgICBSZWdpc3RlclNldCBtX211dGFibGVS
ZWdzOwotICAgIEluZGV4VHlwZSBtX2xhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleCB7IDAgfTsK
LQotICAgIC8vIFRoZSBpbnRlcmZlcmVuY2UgZ3JhcGguCi0gICAgSGFzaFNldDxJbnRlcmZlcmVu
Y2VFZGdlLCBJbnRlcmZlcmVuY2VFZGdlSGFzaCwgSW50ZXJmZXJlbmNlRWRnZUhhc2hUcmFpdHM+
IG1faW50ZXJmZXJlbmNlRWRnZXM7Ci0gICAgVmVjdG9yPFZlY3RvcjxJbmRleFR5cGUsIDAsIFVu
c2FmZVZlY3Rvck92ZXJmbG93LCA0PiwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fYWRqYWNl
bmN5TGlzdDsKLSAgICBWZWN0b3I8SW5kZXhUeXBlLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4g
bV9kZWdyZWVzOwotCi0gICAgLy8gSW5zdGVhZCBvZiBrZWVwaW5nIHRyYWNrIG9mIHRoZSBtb3Zl
IGluc3RydWN0aW9ucywgd2UganVzdCBrZWVwIHRoZWlyIG9wZXJhbmRzIGFyb3VuZCBhbmQgdXNl
IHRoZSBpbmRleAotICAgIC8vIGluIHRoZSB2ZWN0b3IgYXMgdGhlICJpZGVudGlmaWVyIiBmb3Ig
dGhlIG1vdmUuCi0gICAgc3RydWN0IE1vdmVPcGVyYW5kcyB7Ci0gICAgICAgIEluZGV4VHlwZSBz
cmNJbmRleDsKLSAgICAgICAgSW5kZXhUeXBlIGRzdEluZGV4OwotICAgIH07Ci0gICAgVmVjdG9y
PE1vdmVPcGVyYW5kcywgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fY29hbGVzY2luZ0NhbmRp
ZGF0ZXM7Ci0KLSAgICAvLyBMaXN0IG9mIGV2ZXJ5IG1vdmUgaW5zdHJ1Y3Rpb24gYXNzb2NpYXRl
ZCB3aXRoIGEgVG1wLgotICAgIFZlY3RvcjxIYXNoU2V0PEluZGV4VHlwZSwgdHlwZW5hbWUgRGVm
YXVsdEhhc2g8SW5kZXhUeXBlPjo6SGFzaCwgV1RGOjpVbnNpZ25lZFdpdGhaZXJvS2V5SGFzaFRy
YWl0czxJbmRleFR5cGU+Pj4gbV9tb3ZlTGlzdDsKLQotICAgIC8vIENvbG9ycy4KLSAgICBWZWN0
b3I8UmVnLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9jb2xvcmVkVG1wOwotICAgIFZlY3Rv
cjxJbmRleFR5cGU+IG1fc3BpbGxlZFRtcHM7Ci0KLSAgICAvLyBWYWx1ZXMgdGhhdCBoYXZlIGJl
ZW4gY29hbGVzY2VkIHdpdGggYW4gb3RoZXIgdmFsdWUuCi0gICAgVmVjdG9yPEluZGV4VHlwZSwg
MCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fY29hbGVzY2VkVG1wczsKLQotICAgIC8vIFRoZSBz
dGFjayBvZiBUbXAgcmVtb3ZlZCBmcm9tIHRoZSBncmFwaCBhbmQgcmVhZHkgZm9yIGNvbG9yaW5n
LgotICAgIEJpdFZlY3RvciBtX2lzT25TZWxlY3RTdGFjazsKLSAgICBWZWN0b3I8SW5kZXhUeXBl
PiBtX3NlbGVjdFN0YWNrOwotCi0gICAgSW5kZXhUeXBlIG1fZnJhbWVQb2ludGVySW5kZXggeyAw
IH07Ci0gICAgQml0VmVjdG9yIG1faW50ZXJmZXJlc1dpdGhGcmFtZVBvaW50ZXI7Ci0KLSAgICBz
dHJ1Y3QgT3JkZXJlZE1vdmVTZXQgewotICAgICAgICB1bnNpZ25lZCBhZGRNb3ZlKCkKLSAgICAg
ICAgewotICAgICAgICAgICAgQVNTRVJUKG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5pc0VtcHR5KCkp
OwotICAgICAgICAgICAgQVNTRVJUKCFtX2ZpcnN0TG93UHJpb3JpdHlNb3ZlSW5kZXgpOwotCi0g
ICAgICAgICAgICB1bnNpZ25lZCBuZXh0SW5kZXggPSBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdC5zaXpl
KCk7Ci0gICAgICAgICAgICB1bnNpZ25lZCBwb3NpdGlvbiA9IG1fbW92ZUxpc3Quc2l6ZSgpOwot
ICAgICAgICAgICAgbV9tb3ZlTGlzdC5hcHBlbmQobmV4dEluZGV4KTsKLSAgICAgICAgICAgIG1f
cG9zaXRpb25Jbk1vdmVMaXN0LmFwcGVuZChwb3NpdGlvbik7Ci0gICAgICAgICAgICByZXR1cm4g
bmV4dEluZGV4OwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzdGFydEFkZGluZ0xvd1ByaW9y
aXR5TW92ZXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICBBU1NFUlQobV9sb3dQcmlvcml0eU1v
dmVMaXN0LmlzRW1wdHkoKSk7Ci0gICAgICAgICAgICBtX2ZpcnN0TG93UHJpb3JpdHlNb3ZlSW5k
ZXggPSBtX21vdmVMaXN0LnNpemUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHVuc2lnbmVkIGFk
ZExvd1ByaW9yaXR5TW92ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFTU0VSVChtX2ZpcnN0
TG93UHJpb3JpdHlNb3ZlSW5kZXggPT0gbV9tb3ZlTGlzdC5zaXplKCkpOwotCi0gICAgICAgICAg
ICB1bnNpZ25lZCBuZXh0SW5kZXggPSBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdC5zaXplKCk7Ci0gICAg
ICAgICAgICB1bnNpZ25lZCBwb3NpdGlvbiA9IG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5zaXplKCk7
Ci0gICAgICAgICAgICBtX2xvd1ByaW9yaXR5TW92ZUxpc3QuYXBwZW5kKG5leHRJbmRleCk7Ci0g
ICAgICAgICAgICBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdC5hcHBlbmQocG9zaXRpb24pOwotCi0gICAg
ICAgICAgICBBU1NFUlQobmV4dEluZGV4ID49IG1fZmlyc3RMb3dQcmlvcml0eU1vdmVJbmRleCk7
Ci0KLSAgICAgICAgICAgIHJldHVybiBuZXh0SW5kZXg7Ci0gICAgICAgIH0KLQotICAgICAgICBi
b29sIGlzRW1wdHkoKSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbV9tb3Zl
TGlzdC5pc0VtcHR5KCkgJiYgbV9sb3dQcmlvcml0eU1vdmVMaXN0LmlzRW1wdHkoKTsKLSAgICAg
ICAgfQotCi0gICAgICAgIGJvb2wgY29udGFpbnModW5zaWduZWQgaW5kZXgpCi0gICAgICAgIHsK
LSAgICAgICAgICAgIHJldHVybiBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdFtpbmRleF0gIT0gc3RkOjpu
dW1lcmljX2xpbWl0czx1bnNpZ25lZD46Om1heCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9p
ZCB0YWtlTW92ZSh1bnNpZ25lZCBtb3ZlSW5kZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVu
c2lnbmVkIHBvc2l0aW9uSW5Nb3ZlTGlzdCA9IG1fcG9zaXRpb25Jbk1vdmVMaXN0W21vdmVJbmRl
eF07Ci0gICAgICAgICAgICBpZiAocG9zaXRpb25Jbk1vdmVMaXN0ID09IHN0ZDo6bnVtZXJpY19s
aW1pdHM8dW5zaWduZWQ+OjptYXgoKSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAg
ICAgICAgIGlmIChtb3ZlSW5kZXggPCBtX2ZpcnN0TG93UHJpb3JpdHlNb3ZlSW5kZXgpIHsKLSAg
ICAgICAgICAgICAgICBBU1NFUlQobV9tb3ZlTGlzdFtwb3NpdGlvbkluTW92ZUxpc3RdID09IG1v
dmVJbmRleCk7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgbGFzdEluZGV4ID0gbV9tb3ZlTGlz
dC5sYXN0KCk7Ci0gICAgICAgICAgICAgICAgbV9wb3NpdGlvbkluTW92ZUxpc3RbbGFzdEluZGV4
XSA9IHBvc2l0aW9uSW5Nb3ZlTGlzdDsKLSAgICAgICAgICAgICAgICBtX21vdmVMaXN0W3Bvc2l0
aW9uSW5Nb3ZlTGlzdF0gPSBsYXN0SW5kZXg7Ci0gICAgICAgICAgICAgICAgbV9tb3ZlTGlzdC5y
ZW1vdmVMYXN0KCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFTU0VS
VChtX2xvd1ByaW9yaXR5TW92ZUxpc3RbcG9zaXRpb25Jbk1vdmVMaXN0XSA9PSBtb3ZlSW5kZXgp
OwotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxhc3RJbmRleCA9IG1fbG93UHJpb3JpdHlNb3Zl
TGlzdC5sYXN0KCk7Ci0gICAgICAgICAgICAgICAgbV9wb3NpdGlvbkluTW92ZUxpc3RbbGFzdElu
ZGV4XSA9IHBvc2l0aW9uSW5Nb3ZlTGlzdDsKLSAgICAgICAgICAgICAgICBtX2xvd1ByaW9yaXR5
TW92ZUxpc3RbcG9zaXRpb25Jbk1vdmVMaXN0XSA9IGxhc3RJbmRleDsKLSAgICAgICAgICAgICAg
ICBtX2xvd1ByaW9yaXR5TW92ZUxpc3QucmVtb3ZlTGFzdCgpOwotICAgICAgICAgICAgfQotCi0g
ICAgICAgICAgICBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdFttb3ZlSW5kZXhdID0gc3RkOjpudW1lcmlj
X2xpbWl0czx1bnNpZ25lZD46Om1heCgpOwotCi0gICAgICAgICAgICBBU1NFUlQoIWNvbnRhaW5z
KG1vdmVJbmRleCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgdW5zaWduZWQgdGFrZUxhc3RNb3Zl
KCkKLSAgICAgICAgewotICAgICAgICAgICAgQVNTRVJUKCFpc0VtcHR5KCkpOwotCi0gICAgICAg
ICAgICB1bnNpZ25lZCBsYXN0SW5kZXg7Ci0gICAgICAgICAgICBpZiAoIW1fbW92ZUxpc3QuaXNF
bXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgbGFzdEluZGV4ID0gbV9tb3ZlTGlzdC50YWtlTGFz
dCgpOwotICAgICAgICAgICAgICAgIEFTU0VSVChtX3Bvc2l0aW9uSW5Nb3ZlTGlzdFtsYXN0SW5k
ZXhdID09IG1fbW92ZUxpc3Quc2l6ZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAg
ICAgICAgICAgbGFzdEluZGV4ID0gbV9sb3dQcmlvcml0eU1vdmVMaXN0LnRha2VMYXN0KCk7Ci0g
ICAgICAgICAgICAgICAgQVNTRVJUKG1fcG9zaXRpb25Jbk1vdmVMaXN0W2xhc3RJbmRleF0gPT0g
bV9sb3dQcmlvcml0eU1vdmVMaXN0LnNpemUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAg
ICBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdFtsYXN0SW5kZXhdID0gc3RkOjpudW1lcmljX2xpbWl0czx1
bnNpZ25lZD46Om1heCgpOwotCi0gICAgICAgICAgICBBU1NFUlQoIWNvbnRhaW5zKGxhc3RJbmRl
eCkpOwotICAgICAgICAgICAgcmV0dXJuIGxhc3RJbmRleDsKLSAgICAgICAgfQotCi0gICAgICAg
IHZvaWQgcmV0dXJuTW92ZSh1bnNpZ25lZCBpbmRleCkKLSAgICAgICAgewotICAgICAgICAgICAg
Ly8gVGhpcyBhc3NlcnRpb24gaXMgYSBiaXQgc3RyaWN0IGJ1dCB0aGF0IGlzIGhvdyB0aGUgbW92
ZSBsaXN0IHNob3VsZCBiZSB1c2VkLiBUaGUgb25seSBraW5kIG9mIG1vdmVzIHRoYXQgY2FuCi0g
ICAgICAgICAgICAvLyByZXR1cm4gdG8gdGhlIGxpc3QgYXJlIHRoZSBvbmVzIHRoYXQgd2UgcHJl
dmlvdXNseSBmYWlsZWQgdG8gY29hbGVzY2Ugd2l0aCB0aGUgY29uc2VydmF0aXZlIGhldXJpc3Rp
Y3MuCi0gICAgICAgICAgICAvLyBWYWx1ZXMgc2hvdWxkIG5vdCBiZSBhZGRlZCBiYWNrIGlmIHRo
ZXkgd2VyZSBuZXZlciB0YWtlbiBvdXQgd2hlbiBhdHRlbXB0aW5nIGNvYWxlc2NpbmcuCi0gICAg
ICAgICAgICBBU1NFUlQoIWNvbnRhaW5zKGluZGV4KSk7Ci0KLSAgICAgICAgICAgIGlmIChpbmRl
eCA8IG1fZmlyc3RMb3dQcmlvcml0eU1vdmVJbmRleCkgewotICAgICAgICAgICAgICAgIHVuc2ln
bmVkIHBvc2l0aW9uID0gbV9tb3ZlTGlzdC5zaXplKCk7Ci0gICAgICAgICAgICAgICAgbV9tb3Zl
TGlzdC5hcHBlbmQoaW5kZXgpOwotICAgICAgICAgICAgICAgIG1fcG9zaXRpb25Jbk1vdmVMaXN0
W2luZGV4XSA9IHBvc2l0aW9uOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAg
ICB1bnNpZ25lZCBwb3NpdGlvbiA9IG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5zaXplKCk7Ci0gICAg
ICAgICAgICAgICAgbV9sb3dQcmlvcml0eU1vdmVMaXN0LmFwcGVuZChpbmRleCk7Ci0gICAgICAg
ICAgICAgICAgbV9wb3NpdGlvbkluTW92ZUxpc3RbaW5kZXhdID0gcG9zaXRpb247Ci0gICAgICAg
ICAgICB9Ci0KLSAgICAgICAgICAgIEFTU0VSVChjb250YWlucyhpbmRleCkpOwotICAgICAgICB9
Ci0KLSAgICAgICAgdm9pZCBjbGVhcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1fcG9zaXRp
b25Jbk1vdmVMaXN0LmNsZWFyKCk7Ci0gICAgICAgICAgICBtX21vdmVMaXN0LmNsZWFyKCk7Ci0g
ICAgICAgICAgICBtX2xvd1ByaW9yaXR5TW92ZUxpc3QuY2xlYXIoKTsKLSAgICAgICAgfQotCi0g
ICAgcHJpdmF0ZToKLSAgICAgICAgVmVjdG9yPHVuc2lnbmVkLCAwLCBVbnNhZmVWZWN0b3JPdmVy
Zmxvdz4gbV9wb3NpdGlvbkluTW92ZUxpc3Q7Ci0gICAgICAgIFZlY3Rvcjx1bnNpZ25lZCwgMCwg
VW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fbW92ZUxpc3Q7Ci0gICAgICAgIFZlY3Rvcjx1bnNpZ25l
ZCwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fbG93UHJpb3JpdHlNb3ZlTGlzdDsKLSAgICAg
ICAgdW5zaWduZWQgbV9maXJzdExvd1ByaW9yaXR5TW92ZUluZGV4IHsgMCB9OwotICAgIH07Ci0K
LSAgICAvLyBXb3JrIGxpc3RzLgotICAgIC8vIFNldCBvZiAibW92ZSIgZW5hYmxlZCBmb3IgcG9z
c2libGUgY29hbGVzY2luZy4KLSAgICBPcmRlcmVkTW92ZVNldCBtX3dvcmtsaXN0TW92ZXM7Ci0g
ICAgLy8gU2V0IG9mICJtb3ZlIiBub3QgeWV0IHJlYWR5IGZvciBjb2FsZXNjaW5nLgotICAgIEJp
dFZlY3RvciBtX2FjdGl2ZU1vdmVzOwotICAgIC8vIExvdy1kZWdyZWUsIG5vbi1Nb3ZlIHJlbGF0
ZWQuCi0gICAgVmVjdG9yPEluZGV4VHlwZT4gbV9zaW1wbGlmeVdvcmtsaXN0OwotICAgIC8vIEhp
Z2gtZGVncmVlIFRtcC4KLSAgICBIYXNoU2V0PEluZGV4VHlwZT4gbV9zcGlsbFdvcmtsaXN0Owot
ICAgIC8vIExvdy1kZWdyZWUsIE1vdmUgcmVsYXRlZC4KLSAgICBIYXNoU2V0PEluZGV4VHlwZT4g
bV9mcmVlemVXb3JrbGlzdDsKLQotICAgIGJvb2wgbV9oYXNTZWxlY3RlZFNwaWxsIHsgZmFsc2Ug
fTsKLSAgICBib29sIG1faGFzQ29hbGVzY2VkTm9uVHJpdmlhbE1vdmUgeyBmYWxzZSB9OwotCi0g
ICAgLy8gVGhlIG1hcHBpbmcgb2YgVG1wIHRvIHRoZWlyIGFsaWFzIGZvciBNb3ZlcyB0aGF0IGFy
ZSBhbHdheXMgY29hbGVzY2luZyByZWdhcmRsZXNzIG9mIHNwaWxsaW5nLgotICAgIFZlY3RvcjxJ
bmRleFR5cGUsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX2NvYWxlc2NlZFRtcHNBdFNwaWxs
OwotICAgIAotICAgIGNvbnN0IEhhc2hTZXQ8dW5zaWduZWQ+JiBtX3Vuc3BpbGxhYmxlVG1wczsK
LX07Ci0KLS8vIFRoaXMgcGVyZm9ybSBhbGwgdGhlIHRhc2tzIHRoYXQgYXJlIHNwZWNpZmljIHRv
IGNlcnRhaW4gcmVnaXN0ZXIgdHlwZS4KLXRlbXBsYXRlPEFyZzo6VHlwZSB0eXBlPgotY2xhc3Mg
Q29sb3JpbmdBbGxvY2F0b3IgOiBwdWJsaWMgQWJzdHJhY3RDb2xvcmluZ0FsbG9jYXRvcjx1bnNp
Z25lZD4gewotcHVibGljOgotICAgIENvbG9yaW5nQWxsb2NhdG9yKENvZGUmIGNvZGUsIFRtcFdp
ZHRoJiB0bXBXaWR0aCwgY29uc3QgVXNlQ291bnRzPFRtcD4mIHVzZUNvdW50cywgY29uc3QgSGFz
aFNldDx1bnNpZ25lZD4mIHVuc3BpbGxhYmxlVG1wKQotICAgICAgICA6IEFic3RyYWN0Q29sb3Jp
bmdBbGxvY2F0b3I8dW5zaWduZWQ+KGNvZGUucmVnc0luUHJpb3JpdHlPcmRlcih0eXBlKSwgQWJz
b2x1dGVUbXBNYXBwZXI8dHlwZT46Omxhc3RNYWNoaW5lUmVnaXN0ZXJJbmRleCgpLCB0bXBBcnJh
eVNpemUoY29kZSksIHVuc3BpbGxhYmxlVG1wKQotICAgICAgICAsIG1fY29kZShjb2RlKQotICAg
ICAgICAsIG1fdG1wV2lkdGgodG1wV2lkdGgpCi0gICAgICAgICwgbV91c2VDb3VudHModXNlQ291
bnRzKQotICAgIHsKLSAgICAgICAgaWYgKHR5cGUgPT0gQXJnOjpHUCkgewotICAgICAgICAgICAg
bV9mcmFtZVBvaW50ZXJJbmRleCA9IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUlu
ZGV4KFRtcChNYWNyb0Fzc2VtYmxlcjo6ZnJhbWVQb2ludGVyUmVnaXN0ZXIpKTsKLSAgICAgICAg
ICAgIG1faW50ZXJmZXJlc1dpdGhGcmFtZVBvaW50ZXIuZW5zdXJlU2l6ZSh0bXBBcnJheVNpemUo
Y29kZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5pdGlhbGl6ZVByZWNvbG9yZWRUbXAoKTsK
LSAgICAgICAgYnVpbGQoKTsKLSAgICAgICAgYWxsb2NhdGUoKTsKLSAgICB9Ci0KLSAgICBUbXAg
Z2V0QWxpYXMoVG1wIHRtcCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBBYnNvbHV0ZVRt
cE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgoZ2V0QWxpYXMoQWJzb2x1dGVUbXBN
YXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodG1wKSkpOwotICAgIH0KLQotICAgIC8vIFRoaXMg
dGVsbHMgeW91IGlmIGEgTW92ZSB3aWxsIGJlIGNvYWxlc2NhYmxlIGlmIHRoZSBzcmMgYW5kIGRz
dCBlbmQgdXAgbWF0Y2hpbmcuIFRoaXMgbWV0aG9kCi0gICAgLy8gcmVsaWVzIG9uIGFuIGFuYWx5
c2lzIHRoYXQgaXMgaW52YWxpZGF0ZWQgYnkgcmVnaXN0ZXIgYWxsb2NhdGlvbiwgc28geW91IGl0
J3Mgb25seSBtZWFuaW5nZnVsIHRvCi0gICAgLy8gY2FsbCB0aGlzICpiZWZvcmUqIHJlcGxhY2lu
ZyB0aGUgVG1wJ3MgaW4gdGhpcyBJbnN0IHdpdGggcmVnaXN0ZXJzIG9yIHNwaWxsIHNsb3RzLgot
ICAgIGJvb2wgbWF5QmVDb2FsZXNjYWJsZShjb25zdCBJbnN0JiBpbnN0KSBjb25zdAotICAgIHsK
LSAgICAgICAgcmV0dXJuIG1heUJlQ29hbGVzY2FibGVJbXBsKGluc3QsICZtX3RtcFdpZHRoKTsK
LSAgICB9Ci0KLSAgICBib29sIGlzVXNlbGVzc01vdmUoY29uc3QgSW5zdCYgaW5zdCkgY29uc3QK
LSAgICB7Ci0gICAgICAgIHJldHVybiBtYXlCZUNvYWxlc2NhYmxlSW1wbChpbnN0LCBudWxscHRy
KSAmJiBpbnN0LmFyZ3NbMF0udG1wKCkgPT0gaW5zdC5hcmdzWzFdLnRtcCgpOwotICAgIH0KLQot
ICAgIFRtcCBnZXRBbGlhc1doZW5TcGlsbGluZyhUbXAgdG1wKSBjb25zdAotICAgIHsKLSAgICAg
ICAgQVNTRVJUX1dJVEhfTUVTU0FHRSghbV9zcGlsbGVkVG1wcy5pc0VtcHR5KCksICJUaGlzIGZ1
bmN0aW9uIGlzIG9ubHkgdmFsaWQgZm9yIGNvYWxlc2NpbmcgZHVyaW5nIHNwaWxsaW5nLiIpOwot
Ci0gICAgICAgIGlmIChtX2NvYWxlc2NlZFRtcHNBdFNwaWxsLmlzRW1wdHkoKSkKLSAgICAgICAg
ICAgIHJldHVybiB0bXA7Ci0KLSAgICAgICAgdW5zaWduZWQgYWxpYXNJbmRleCA9IEFic29sdXRl
VG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHRtcCk7Ci0gICAgICAgIHdoaWxlICh1bnNp
Z25lZCBuZXh0QWxpYXNJbmRleCA9IG1fY29hbGVzY2VkVG1wc0F0U3BpbGxbYWxpYXNJbmRleF0p
Ci0gICAgICAgICAgICBhbGlhc0luZGV4ID0gbmV4dEFsaWFzSW5kZXg7Ci0KLSAgICAgICAgVG1w
IGFsaWFzID0gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KGFs
aWFzSW5kZXgpOwotCi0gICAgICAgIEFTU0VSVF9XSVRIX01FU1NBR0UoIW1fc3BpbGxlZFRtcHMu
Y29udGFpbnMoYWxpYXNJbmRleCkgfHwgYWxpYXMgPT0gdG1wLCAiVGhlIGFsaWFzZXMgYXQgc3Bp
bGwgc2hvdWxkIGFsd2F5cyBiZSBjb2xvcmFibGUuIFNvbWV0aGluZyB3ZW50IGhvcnJpYmx5IHdy
b25nLiIpOwotCi0gICAgICAgIHJldHVybiBhbGlhczsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZTx0
eXBlbmFtZSBJbmRleEl0ZXJhdG9yPgotICAgIGNsYXNzIEluZGV4VG9UbXBJdGVyYXRvckFkYXB0
b3IgewotICAgIHB1YmxpYzoKLSAgICAgICAgSW5kZXhUb1RtcEl0ZXJhdG9yQWRhcHRvcihJbmRl
eEl0ZXJhdG9yJiYgaW5kZXhJdGVyYXRvcikKLSAgICAgICAgICAgIDogbV9pbmRleEl0ZXJhdG9y
KFdURk1vdmUoaW5kZXhJdGVyYXRvcikpCi0gICAgICAgIHsKLSAgICAgICAgfQotCi0gICAgICAg
IFRtcCBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6
dG1wRnJvbUFic29sdXRlSW5kZXgoKm1faW5kZXhJdGVyYXRvcik7IH0KLSAgICAgICAgSW5kZXhU
b1RtcEl0ZXJhdG9yQWRhcHRvciYgb3BlcmF0b3IrKygpIHsgKyttX2luZGV4SXRlcmF0b3I7IHJl
dHVybiAqdGhpczsgfQotCi0gICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJbmRleFRvVG1w
SXRlcmF0b3JBZGFwdG9yJiBvdGhlcikgY29uc3QKLSAgICAgICAgewotICAgICAgICAgICAgcmV0
dXJuIG1faW5kZXhJdGVyYXRvciA9PSBvdGhlci5tX2luZGV4SXRlcmF0b3I7Ci0gICAgICAgIH0K
LQotICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgSW5kZXhUb1RtcEl0ZXJhdG9yQWRhcHRv
ciYgb3RoZXIpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAhKCp0aGlzID09
IG90aGVyKTsKLSAgICAgICAgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgSW5kZXhJdGVyYXRv
ciBtX2luZGV4SXRlcmF0b3I7Ci0gICAgfTsKLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIENvbGxl
Y3Rpb24+Ci0gICAgY2xhc3MgSW5kZXhUb1RtcEl0ZXJhYmxlQWRhcHRvciB7Ci0gICAgcHVibGlj
OgotICAgICAgICBJbmRleFRvVG1wSXRlcmFibGVBZGFwdG9yKGNvbnN0IENvbGxlY3Rpb24mIGNv
bGxlY3Rpb24pCi0gICAgICAgICAgICA6IG1fY29sbGVjdGlvbihjb2xsZWN0aW9uKQotICAgICAg
ICB7Ci0gICAgICAgIH0KLQotICAgICAgICBJbmRleFRvVG1wSXRlcmF0b3JBZGFwdG9yPHR5cGVu
YW1lIENvbGxlY3Rpb246OmNvbnN0X2l0ZXJhdG9yPiBiZWdpbigpIGNvbnN0Ci0gICAgICAgIHsK
LSAgICAgICAgICAgIHJldHVybiBtX2NvbGxlY3Rpb24uYmVnaW4oKTsKLSAgICAgICAgfQotCi0g
ICAgICAgIEluZGV4VG9UbXBJdGVyYXRvckFkYXB0b3I8dHlwZW5hbWUgQ29sbGVjdGlvbjo6Y29u
c3RfaXRlcmF0b3I+IGVuZCgpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBt
X2NvbGxlY3Rpb24uZW5kKCk7Ci0gICAgICAgIH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGNv
bnN0IENvbGxlY3Rpb24mIG1fY29sbGVjdGlvbjsKLSAgICB9OwotCi0gICAgSW5kZXhUb1RtcEl0
ZXJhYmxlQWRhcHRvcjxWZWN0b3I8dW5zaWduZWQ+PiBzcGlsbGVkVG1wcygpIGNvbnN0IHsgcmV0
dXJuIG1fc3BpbGxlZFRtcHM7IH0KLQotICAgIGJvb2wgcmVxdWlyZXNTcGlsbGluZygpIGNvbnN0
IHsgcmV0dXJuICFtX3NwaWxsZWRUbXBzLmlzRW1wdHkoKTsgfQotCi0gICAgUmVnIGFsbG9jYXRl
ZFJlZyhUbXAgdG1wKSBjb25zdAotICAgIHsKLSAgICAgICAgQVNTRVJUKCF0bXAuaXNSZWcoKSk7
Ci0gICAgICAgIEFTU0VSVChtX2NvbG9yZWRUbXAuc2l6ZSgpKTsKLSAgICAgICAgQVNTRVJUKHRt
cC5pc0dQKCkgPT0gKHR5cGUgPT0gQXJnOjpHUCkpOwotCi0gICAgICAgIFJlZyByZWcgPSBtX2Nv
bG9yZWRUbXBbQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodG1wKV07Ci0g
ICAgICAgIGlmICghcmVnKSB7Ci0gICAgICAgICAgICBkYXRhTG9nKCJGQVRBTDogTm8gY29sb3Ig
Zm9yICIsIHRtcCwgIlxuIik7Ci0gICAgICAgICAgICBkYXRhTG9nKCJDb2RlOlxuIik7Ci0gICAg
ICAgICAgICBkYXRhTG9nKG1fY29kZSk7Ci0gICAgICAgICAgICBSRUxFQVNFX0FTU0VSVF9OT1Rf
UkVBQ0hFRCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZWc7Ci0gICAgfQotCi1wcml2
YXRlOgotICAgIHN0YXRpYyB1bnNpZ25lZCB0bXBBcnJheVNpemUoQ29kZSYgY29kZSkKLSAgICB7
Ci0gICAgICAgIHVuc2lnbmVkIG51bVRtcHMgPSBjb2RlLm51bVRtcHModHlwZSk7Ci0gICAgICAg
IHJldHVybiBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChudW1UbXBzKTsK
LSAgICB9Ci0KLSAgICB2b2lkIGluaXRpYWxpemVQcmVjb2xvcmVkVG1wKCkKLSAgICB7Ci0gICAg
ICAgIG1fY29sb3JlZFRtcC5yZXNpemUobV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXggKyAx
KTsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8PSBtX2xhc3RQcmVjb2xvcmVkUmVn
aXN0ZXJJbmRleDsgKytpKSB7Ci0gICAgICAgICAgICBUbXAgdG1wID0gQWJzb2x1dGVUbXBNYXBw
ZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KGkpOwotICAgICAgICAgICAgQVNTRVJUKHRt
cC5pc1JlZygpKTsKLSAgICAgICAgICAgIG1fY29sb3JlZFRtcFtpXSA9IHRtcC5yZWcoKTsKLSAg
ICAgICAgfQotICAgIH0KLQotICAgIGJvb2wgbWF5QmVDb2FsZXNjZWQoQXJnIGxlZnQsIEFyZyBy
aWdodCkKLSAgICB7Ci0gICAgICAgIGlmICghbGVmdC5pc1RtcCgpIHx8ICFyaWdodC5pc1RtcCgp
KQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIFRtcCBsZWZ0VG1wID0gbGVm
dC50bXAoKTsKLSAgICAgICAgVG1wIHJpZ2h0VG1wID0gcmlnaHQudG1wKCk7Ci0KLSAgICAgICAg
aWYgKGxlZnRUbXAgPT0gcmlnaHRUbXApCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAg
ICAgICAgaWYgKGxlZnRUbXAuaXNHUCgpICE9ICh0eXBlID09IEFyZzo6R1ApIHx8IHJpZ2h0VG1w
LmlzR1AoKSAhPSAodHlwZSA9PSBBcmc6OkdQKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
LQotICAgICAgICB1bnNpZ25lZCBsZWZ0SW5kZXggPSBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6
YWJzb2x1dGVJbmRleChsZWZ0VG1wKTsKLSAgICAgICAgdW5zaWduZWQgcmlnaHRJbmRleCA9IEFi
c29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHJpZ2h0VG1wKTsKLQotICAgICAg
ICByZXR1cm4gIW1faW50ZXJmZXJlbmNlRWRnZXMuY29udGFpbnMoSW50ZXJmZXJlbmNlRWRnZShs
ZWZ0SW5kZXgsIHJpZ2h0SW5kZXgpKTsKLSAgICB9Ci0KLSAgICB2b2lkIGFkZFRvTG93UHJpb3Jp
dHlDb2FsZXNjaW5nQ2FuZGlkYXRlcyhBcmcgbGVmdCwgQXJnIHJpZ2h0KQotICAgIHsKLSAgICAg
ICAgQVNTRVJUKG1heUJlQ29hbGVzY2VkKGxlZnQsIHJpZ2h0KSk7Ci0gICAgICAgIFRtcCBsZWZ0
VG1wID0gbGVmdC50bXAoKTsKLSAgICAgICAgVG1wIHJpZ2h0VG1wID0gcmlnaHQudG1wKCk7Ci0K
LSAgICAgICAgdW5zaWduZWQgbGVmdEluZGV4ID0gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFi
c29sdXRlSW5kZXgobGVmdFRtcCk7Ci0gICAgICAgIHVuc2lnbmVkIHJpZ2h0SW5kZXggPSBBYnNv
bHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChyaWdodFRtcCk7Ci0KLSAgICAgICAg
dW5zaWduZWQgbmV4dE1vdmVJbmRleCA9IG1fY29hbGVzY2luZ0NhbmRpZGF0ZXMuc2l6ZSgpOwot
ICAgICAgICBtX2NvYWxlc2NpbmdDYW5kaWRhdGVzLmFwcGVuZCh7IGxlZnRJbmRleCwgcmlnaHRJ
bmRleCB9KTsKLQotICAgICAgICB1bnNpZ25lZCBuZXdJbmRleEluV29ya2xpc3QgPSBtX3dvcmts
aXN0TW92ZXMuYWRkTG93UHJpb3JpdHlNb3ZlKCk7Ci0gICAgICAgIEFTU0VSVF9VTlVTRUQobmV3
SW5kZXhJbldvcmtsaXN0LCBuZXdJbmRleEluV29ya2xpc3QgPT0gbmV4dE1vdmVJbmRleCk7Ci0K
LSAgICAgICAgQVNTRVJUKG5leHRNb3ZlSW5kZXggPD0gbV9hY3RpdmVNb3Zlcy5zaXplKCkpOwot
ICAgICAgICBtX2FjdGl2ZU1vdmVzLmVuc3VyZVNpemUobmV4dE1vdmVJbmRleCArIDEpOwotCi0g
ICAgICAgIG1fbW92ZUxpc3RbbGVmdEluZGV4XS5hZGQobmV4dE1vdmVJbmRleCk7Ci0gICAgICAg
IG1fbW92ZUxpc3RbcmlnaHRJbmRleF0uYWRkKG5leHRNb3ZlSW5kZXgpOwotICAgIH0KLQotICAg
IHZvaWQgYnVpbGQoKQotICAgIHsKLSAgICAgICAgVG1wTGl2ZW5lc3M8dHlwZT4gbGl2ZW5lc3Mo
bV9jb2RlKTsKLSAgICAgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6IG1fY29kZSkgewotICAg
ICAgICAgICAgdHlwZW5hbWUgVG1wTGl2ZW5lc3M8dHlwZT46OkxvY2FsQ2FsYyBsb2NhbENhbGMo
bGl2ZW5lc3MsIGJsb2NrKTsKLSAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW5zdEluZGV4ID0g
YmxvY2stPnNpemUoKTsgaW5zdEluZGV4LS07KSB7Ci0gICAgICAgICAgICAgICAgSW5zdCYgaW5z
dCA9IGJsb2NrLT5hdChpbnN0SW5kZXgpOwotICAgICAgICAgICAgICAgIEluc3QqIG5leHRJbnN0
ID0gYmxvY2stPmdldChpbnN0SW5kZXggKyAxKTsKLSAgICAgICAgICAgICAgICBidWlsZCgmaW5z
dCwgbmV4dEluc3QsIGxvY2FsQ2FsYyk7Ci0gICAgICAgICAgICAgICAgbG9jYWxDYWxjLmV4ZWN1
dGUoaW5zdEluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1aWxkKG51bGxwdHIs
ICZibG9jay0+YXQoMCksIGxvY2FsQ2FsYyk7Ci0gICAgICAgIH0KLSAgICAgICAgYnVpbGRMb3dQ
cmlvcml0eU1vdmVMaXN0KCk7Ci0gICAgfQotCi0gICAgdm9pZCBidWlsZChJbnN0KiBwcmV2SW5z
dCwgSW5zdCogbmV4dEluc3QsIGNvbnN0IHR5cGVuYW1lIFRtcExpdmVuZXNzPHR5cGU+OjpMb2Nh
bENhbGMmIGxvY2FsQ2FsYykKLSAgICB7Ci0gICAgICAgIGlmICh0cmFjZURlYnVnKQotICAgICAg
ICAgICAgZGF0YUxvZygiQnVpbGRpbmcgYmV0d2VlbiAiLCBwb2ludGVyRHVtcChwcmV2SW5zdCks
ICIgYW5kICIsIHBvaW50ZXJEdW1wKG5leHRJbnN0KSwgIjpcbiIpOwotICAgICAgICBJbnN0Ojpm
b3JFYWNoRGVmV2l0aEV4dHJhQ2xvYmJlcmVkUmVnczxUbXA+KAotICAgICAgICAgICAgcHJldklu
c3QsIG5leHRJbnN0LAotICAgICAgICAgICAgWyZdIChjb25zdCBUbXAmIGFyZywgQXJnOjpSb2xl
LCBBcmc6OlR5cGUgYXJnVHlwZSwgQXJnOjpXaWR0aCkgewotICAgICAgICAgICAgICAgIGlmIChh
cmdUeXBlICE9IHR5cGUpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAg
ICAgICAKLSAgICAgICAgICAgICAgICAvLyBBbGwgdGhlIERlZigpcyBpbnRlcmZlcmUgd2l0aCBl
YWNoIG90aGVyIGFuZCB3aXRoIGFsbCB0aGUgZXh0cmEgY2xvYmJlcmVkIFRtcHMuCi0gICAgICAg
ICAgICAgICAgLy8gV2Ugc2hvdWxkIG5vdCB1c2UgZm9yRWFjaERlZldpdGhFeHRyYUNsb2JiZXJl
ZFJlZ3MoKSBoZXJlIHNpbmNlIGNvbG9yZWQgVG1wcwotICAgICAgICAgICAgICAgIC8vIGRvIG5v
dCBuZWVkIGludGVyZmVyZW5jZSBlZGdlcyBpbiBvdXIgaW1wbGVtZW50YXRpb24uCi0gICAgICAg
ICAgICAgICAgSW5zdDo6Zm9yRWFjaERlZjxUbXA+KAotICAgICAgICAgICAgICAgICAgICBwcmV2
SW5zdCwgbmV4dEluc3QsCi0gICAgICAgICAgICAgICAgICAgIFsmXSAoVG1wJiBvdGhlckFyZywg
QXJnOjpSb2xlLCBBcmc6OlR5cGUgYXJnVHlwZSwgQXJnOjpXaWR0aCkgewotICAgICAgICAgICAg
ICAgICAgICAgICAgaWYgKGFyZ1R5cGUgIT0gdHlwZSkKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAg
ICAgICAgIGlmICh0cmFjZURlYnVnKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFM
b2coIiAgICBBZGRpbmcgZGVmLWRlZiBlZGdlOiAiLCBhcmcsICIsICIsIG90aGVyQXJnLCAiXG4i
KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPmFkZEVkZ2UoYXJnLCBvdGhlckFyZyk7
Ci0gICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgaWYg
KHByZXZJbnN0ICYmIG1heUJlQ29hbGVzY2FibGUoKnByZXZJbnN0KSkgewotICAgICAgICAgICAg
Ly8gV2UgZG8gbm90IHdhbnQgdGhlIFVzZSgpIG9mIHRoaXMgbW92ZSB0byBpbnRlcmZlcmUgd2l0
aCB0aGUgRGVmKCksIGV2ZW4gaWYgaXQgaXMgbGl2ZQotICAgICAgICAgICAgLy8gYWZ0ZXIgdGhl
IE1vdmUuIElmIHdlIHdlcmUgdG8gYWRkIHRoZSBpbnRlcmZlcmVuY2UgZWRnZSwgaXQgd291bGQg
YmUgaW1wb3NzaWJsZSB0bwotICAgICAgICAgICAgLy8gY29hbGVzY2UgdGhlIE1vdmUgZXZlbiBp
ZiB0aGUgdHdvIFRtcCBuZXZlciBpbnRlcmZlcmUgYW55d2hlcmUuCi0gICAgICAgICAgICBUbXAg
ZGVmVG1wOwotICAgICAgICAgICAgVG1wIHVzZVRtcDsKLSAgICAgICAgICAgIHByZXZJbnN0LT5m
b3JFYWNoVG1wKFsmZGVmVG1wLCAmdXNlVG1wXSAoVG1wJiBhcmdUbXAsIEFyZzo6Um9sZSByb2xl
LCBBcmc6OlR5cGUsIEFyZzo6V2lkdGgpIHsKLSAgICAgICAgICAgICAgICBpZiAoQXJnOjppc0xh
dGVEZWYocm9sZSkpCi0gICAgICAgICAgICAgICAgICAgIGRlZlRtcCA9IGFyZ1RtcDsKLSAgICAg
ICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQVNTRVJUKEFyZzo6aXNFYXJs
eVVzZShyb2xlKSk7Ci0gICAgICAgICAgICAgICAgICAgIHVzZVRtcCA9IGFyZ1RtcDsKLSAgICAg
ICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIEFTU0VSVChkZWZUbXAp
OwotICAgICAgICAgICAgQVNTRVJUKHVzZVRtcCk7Ci0KLSAgICAgICAgICAgIHVuc2lnbmVkIG5l
eHRNb3ZlSW5kZXggPSBtX2NvYWxlc2NpbmdDYW5kaWRhdGVzLnNpemUoKTsKLSAgICAgICAgICAg
IG1fY29hbGVzY2luZ0NhbmRpZGF0ZXMuYXBwZW5kKHsgQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46
OmFic29sdXRlSW5kZXgodXNlVG1wKSwgQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRl
SW5kZXgoZGVmVG1wKSB9KTsKLQotICAgICAgICAgICAgdW5zaWduZWQgbmV3SW5kZXhJbldvcmts
aXN0ID0gbV93b3JrbGlzdE1vdmVzLmFkZE1vdmUoKTsKLSAgICAgICAgICAgIEFTU0VSVF9VTlVT
RUQobmV3SW5kZXhJbldvcmtsaXN0LCBuZXdJbmRleEluV29ya2xpc3QgPT0gbmV4dE1vdmVJbmRl
eCk7Ci0KLSAgICAgICAgICAgIEFTU0VSVChuZXh0TW92ZUluZGV4IDw9IG1fYWN0aXZlTW92ZXMu
c2l6ZSgpKTsKLSAgICAgICAgICAgIG1fYWN0aXZlTW92ZXMuZW5zdXJlU2l6ZShuZXh0TW92ZUlu
ZGV4ICsgMSk7Ci0KLSAgICAgICAgICAgIGZvciAoY29uc3QgQXJnJiBhcmcgOiBwcmV2SW5zdC0+
YXJncykgewotICAgICAgICAgICAgICAgIGF1dG8mIGxpc3QgPSBtX21vdmVMaXN0W0Fic29sdXRl
VG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KGFyZy50bXAoKSldOwotICAgICAgICAgICAg
ICAgIGxpc3QuYWRkKG5leHRNb3ZlSW5kZXgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAg
ICBmb3IgKGNvbnN0IFRtcCYgbGl2ZVRtcCA6IGxvY2FsQ2FsYy5saXZlKCkpIHsKLSAgICAgICAg
ICAgICAgICBpZiAobGl2ZVRtcCAhPSB1c2VUbXApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYg
KHRyYWNlRGVidWcpCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhTG9nKCIgICAgQWRkaW5n
IGRlZi1saXZlIGZvciBjb2FsZXNjYWJsZTogIiwgZGVmVG1wLCAiLCAiLCBsaXZlVG1wLCAiXG4i
KTsKLSAgICAgICAgICAgICAgICAgICAgYWRkRWRnZShkZWZUbXAsIGxpdmVUbXApOwotICAgICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVGhlIG5leHQgaW5z
dHJ1Y3Rpb24gY291bGQgaGF2ZSBlYXJseSBjbG9iYmVycyBvciBlYXJseSBkZWYncy4gV2UgbmVl
ZCB0byBjb25zaWRlcgotICAgICAgICAgICAgLy8gdGhvc2Ugbm93LgotICAgICAgICAgICAgYWRk
RWRnZXMobnVsbHB0ciwgbmV4dEluc3QsIGxvY2FsQ2FsYy5saXZlKCkpOwotICAgICAgICB9IGVs
c2UKLSAgICAgICAgICAgIGFkZEVkZ2VzKHByZXZJbnN0LCBuZXh0SW5zdCwgbG9jYWxDYWxjLmxp
dmUoKSk7Ci0gICAgfQotCi0gICAgdm9pZCBidWlsZExvd1ByaW9yaXR5TW92ZUxpc3QoKQotICAg
IHsKLSAgICAgICAgaWYgKCFpc1g4NigpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAg
IG1fd29ya2xpc3RNb3Zlcy5zdGFydEFkZGluZ0xvd1ByaW9yaXR5TW92ZXMoKTsKLSAgICAgICAg
Zm9yIChCYXNpY0Jsb2NrKiBibG9jayA6IG1fY29kZSkgewotICAgICAgICAgICAgZm9yIChJbnN0
JiBpbnN0IDogKmJsb2NrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0ZDo6b3B0aW9uYWw8dW5z
aWduZWQ+IGRlZkFyZ0luZGV4ID0gaW5zdC5zaG91bGRUcnlBbGlhc2luZ0RlZigpKSB7Ci0gICAg
ICAgICAgICAgICAgICAgIEFyZyBvcDEgPSBpbnN0LmFyZ3NbKmRlZkFyZ0luZGV4IC0gMl07Ci0g
ICAgICAgICAgICAgICAgICAgIEFyZyBvcDIgPSBpbnN0LmFyZ3NbKmRlZkFyZ0luZGV4IC0gMV07
Ci0gICAgICAgICAgICAgICAgICAgIEFyZyBkZXN0ID0gaW5zdC5hcmdzWypkZWZBcmdJbmRleF07
Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG9wMSA9PSBkZXN0IHx8IG9wMiA9PSBkZXN0KQot
ICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgICAgICAg
aWYgKG1heUJlQ29hbGVzY2VkKG9wMSwgZGVzdCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBh
ZGRUb0xvd1ByaW9yaXR5Q29hbGVzY2luZ0NhbmRpZGF0ZXMob3AxLCBkZXN0KTsKLSAgICAgICAg
ICAgICAgICAgICAgaWYgKG9wMSAhPSBvcDIgJiYgbWF5QmVDb2FsZXNjZWQob3AyLCBkZXN0KSkK
LSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFRvTG93UHJpb3JpdHlDb2FsZXNjaW5nQ2FuZGlk
YXRlcyhvcDIsIGRlc3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAg
ICAgfQotICAgIH0KLQotICAgIHZvaWQgYWRkRWRnZXMoSW5zdCogcHJldkluc3QsIEluc3QqIG5l
eHRJbnN0LCB0eXBlbmFtZSBUbXBMaXZlbmVzczx0eXBlPjo6TG9jYWxDYWxjOjpJdGVyYWJsZSBs
aXZlVG1wcykKLSAgICB7Ci0gICAgICAgIC8vIEFsbCB0aGUgRGVmKClzIGludGVyZmVyZSB3aXRo
IGV2ZXJ0aGluZyBsaXZlLgotICAgICAgICBJbnN0Ojpmb3JFYWNoRGVmV2l0aEV4dHJhQ2xvYmJl
cmVkUmVnczxUbXA+KAotICAgICAgICAgICAgcHJldkluc3QsIG5leHRJbnN0LAotICAgICAgICAg
ICAgWyZdIChjb25zdCBUbXAmIGFyZywgQXJnOjpSb2xlLCBBcmc6OlR5cGUgYXJnVHlwZSwgQXJn
OjpXaWR0aCkgewotICAgICAgICAgICAgICAgIGlmIChhcmdUeXBlICE9IHR5cGUpCi0gICAgICAg
ICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBm
b3IgKGNvbnN0IFRtcCYgbGl2ZVRtcCA6IGxpdmVUbXBzKSB7Ci0gICAgICAgICAgICAgICAgICAg
IEFTU0VSVChsaXZlVG1wLmlzR1AoKSA9PSAodHlwZSA9PSBBcmc6OkdQKSk7Ci0gICAgICAgICAg
ICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKLSAgICAgICAg
ICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICBBZGRpbmcgZGVmLWxpdmUgZWRnZTogIiwgYXJn
LCAiLCAiLCBsaXZlVG1wLCAiXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAg
ICAgICAgICAgIGFkZEVkZ2UoYXJnLCBsaXZlVG1wKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAg
ICAgICAgICAgICAgICBpZiAodHlwZSA9PSBBcmc6OkdQICYmICFhcmcuaXNHUFIoKSkKLSAgICAg
ICAgICAgICAgICAgICAgbV9pbnRlcmZlcmVzV2l0aEZyYW1lUG9pbnRlci5xdWlja1NldChBYnNv
bHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChhcmcpKTsKLSAgICAgICAgICAgIH0p
OwotICAgIH0KLQotICAgIHZvaWQgYWRkRWRnZShUbXAgYSwgVG1wIGIpCi0gICAgewotICAgICAg
ICBBU1NFUlRfV0lUSF9NRVNTQUdFKGEuaXNHUCgpID09IGIuaXNHUCgpLCAiQW4gaW50ZXJmZXJl
bmNlIGJldHdlZW4gcmVnaXN0ZXJzIG9mIGRpZmZlcmVudCB0eXBlcyBkb2VzIG5vdCBtYWtlIHNl
bnNlLCBpdCBjYW4gbGVhZCB0byBub24tY29sb3JhYmxlIGdyYXBocy4iKTsKLQotICAgICAgICBh
ZGRFZGdlKEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KGEpLCBBYnNvbHV0
ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChiKSk7Ci0gICAgfQotCi0gICAgLy8gQ2Fs
bGluZyB0aGlzIHdpdGhvdXQgYSB0bXBXaWR0aCB3aWxsIHBlcmZvcm0gYSBtb3JlIGNvbnNlcnZh
dGl2ZSBjb2FsZXNjaW5nIGFuYWx5c2lzIHRoYXQgYXNzdW1lcwotICAgIC8vIHRoYXQgTW92ZTMy
J3MgYXJlIG5vdCBjb2FsZXNjYWJsZS4KLSAgICBzdGF0aWMgYm9vbCBtYXlCZUNvYWxlc2NhYmxl
SW1wbChjb25zdCBJbnN0JiBpbnN0LCBUbXBXaWR0aCogdG1wV2lkdGgpCi0gICAgewotICAgICAg
ICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBBcmc6OkdQOgotICAgICAgICAgICAgc3dp
dGNoIChpbnN0LmtpbmQub3Bjb2RlKSB7Ci0gICAgICAgICAgICBjYXNlIE1vdmU6Ci0gICAgICAg
ICAgICBjYXNlIE1vdmUzMjoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRl
ZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQXJnOjpGUDoKLSAgICAgICAgICAgIHN3aXRj
aCAoaW5zdC5raW5kLm9wY29kZSkgewotICAgICAgICAgICAgY2FzZSBNb3ZlRmxvYXQ6Ci0gICAg
ICAgICAgICBjYXNlIE1vdmVEb3VibGU6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
ICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAg
IH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgQVNTRVJUX1dJVEhf
TUVTU0FHRShpbnN0LmFyZ3Muc2l6ZSgpID09IDIsICJXZSBhc3N1bWUgY29hbGVjYWJsZSBtb3Zl
cyBvbmx5IGhhdmUgdHdvIGFyZ3VtZW50cyBpbiBhIGZldyBwbGFjZXMuIik7Ci0KLSAgICAgICAg
aWYgKCFpbnN0LmFyZ3NbMF0uaXNUbXAoKSB8fCAhaW5zdC5hcmdzWzFdLmlzVG1wKCkpCi0gICAg
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgQVNTRVJUKGluc3QuYXJnc1swXS50eXBl
KCkgPT0gdHlwZSk7Ci0gICAgICAgIEFTU0VSVChpbnN0LmFyZ3NbMV0udHlwZSgpID09IHR5cGUp
OwotCi0gICAgICAgIC8vIFdlIGNhbiBjb2FsZXNjZSBhIE1vdmUzMiBzbyBsb25nIGFzIGVpdGhl
ciBvZiB0aGUgZm9sbG93aW5nIGhvbGRzOgotICAgICAgICAvLyAtIFRoZSBpbnB1dCBpcyBhbHJl
YWR5IHplcm8tZmlsbGVkLgotICAgICAgICAvLyAtIFRoZSBvdXRwdXQgb25seSBjYXJlcyBhYm91
dCB0aGUgbG93IDMyIGJpdHMuCi0gICAgICAgIC8vCi0gICAgICAgIC8vIE5vdGUgdGhhdCB0aGUg
aW5wdXQgcHJvcGVydHkgcmVxdWlyZXMgYW4gYW5hbHlzaXMgb3ZlciBaRGVmJ3MsIHNvIGl0J3Mg
b25seSB2YWxpZCBzbyBsb25nCi0gICAgICAgIC8vIGFzIHRoZSBpbnB1dCBnZXRzIGEgcmVnaXN0
ZXIuIFdlIGRvbid0IGtub3cgaWYgdGhlIGlucHV0IGdldHMgYSByZWdpc3RlciwgYnV0IHdlIGRv
IGtub3cKLSAgICAgICAgLy8gdGhhdCBpZiBpdCBkb2Vzbid0IGdldCBhIHJlZ2lzdGVyIHRoZW4g
d2Ugd2lsbCBzdGlsbCBlbWl0IHRoaXMgTW92ZTMyLgotICAgICAgICBpZiAoaW5zdC5raW5kLm9w
Y29kZSA9PSBNb3ZlMzIpIHsKLSAgICAgICAgICAgIGlmICghdG1wV2lkdGgpCi0gICAgICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICBpZiAodG1wV2lkdGgtPmRlZldpZHRo
KGluc3QuYXJnc1swXS50bXAoKSkgPiBBcmc6OldpZHRoMzIKLSAgICAgICAgICAgICAgICAmJiB0
bXBXaWR0aC0+dXNlV2lkdGgoaW5zdC5hcmdzWzFdLnRtcCgpKSA+IEFyZzo6V2lkdGgzMikKLSAg
ICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAg
IHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHZvaWQgc2VsZWN0U3BpbGwoKQotICAgIHsKLSAg
ICAgICAgaWYgKCFtX2hhc1NlbGVjdGVkU3BpbGwpIHsKLSAgICAgICAgICAgIG1faGFzU2VsZWN0
ZWRTcGlsbCA9IHRydWU7Ci0KLSAgICAgICAgICAgIGlmIChtX2hhc0NvYWxlc2NlZE5vblRyaXZp
YWxNb3ZlKQotICAgICAgICAgICAgICAgIG1fY29hbGVzY2VkVG1wc0F0U3BpbGwgPSBtX2NvYWxl
c2NlZFRtcHM7Ci0gICAgICAgIH0KLQotICAgICAgICBhdXRvIGl0ZXJhdG9yID0gbV9zcGlsbFdv
cmtsaXN0LmJlZ2luKCk7Ci0KLSAgICAgICAgUkVMRUFTRV9BU1NFUlRfV0lUSF9NRVNTQUdFKGl0
ZXJhdG9yICE9IG1fc3BpbGxXb3JrbGlzdC5lbmQoKSwgInNlbGVjdFNwaWxsKCkgY2FsbGVkIHdo
ZW4gdGhlcmUgd2FzIG5vIHNwaWxsLiIpOwotICAgICAgICBSRUxFQVNFX0FTU0VSVF9XSVRIX01F
U1NBR0UoIW1fdW5zcGlsbGFibGVUbXBzLmNvbnRhaW5zKCppdGVyYXRvciksICJ0cnlpbmcgdG8g
c3BpbGwgdW5zcGlsbGFibGUgdG1wIik7Ci0KLSAgICAgICAgLy8gSGlnaGVyIHNjb3JlIG1lYW5z
IG1vcmUgZGVzaXJhYmxlIHRvIHNwaWxsLiBMb3dlciBzY29yZXMgbWF4aW1pemUgdGhlIGxpa2Vs
aWhvb2QgdGhhdCBhIHRtcAotICAgICAgICAvLyBnZXRzIGEgcmVnaXN0ZXIuCi0gICAgICAgIGF1
dG8gc2NvcmUgPSBbJl0gKFRtcCB0bXApIC0+IGRvdWJsZSB7Ci0gICAgICAgICAgICAvLyBBaXIg
ZXhwb3NlcyB0aGUgY29uY2VwdCBvZiAiZmFzdCB0bXBzIiwgYW5kIHdlIGludGVycHJldCB0aGF0
IHRvIG1lYW4gdGhhdCB0aGUgdG1wCi0gICAgICAgICAgICAvLyBzaG91bGQgYWx3YXlzIGJlIGlu
IGEgcmVnaXN0ZXIuCi0gICAgICAgICAgICBpZiAobV9jb2RlLmlzRmFzdFRtcCh0bXApKQotICAg
ICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBBbGwg
ZWxzZSBiZWluZyBlcXVhbCwgdGhlIHNjb3JlIHNob3VsZCBiZSBkaXJlY3RseSByZWxhdGVkIHRv
IHRoZSBkZWdyZWUuCi0gICAgICAgICAgICBkb3VibGUgZGVncmVlID0gc3RhdGljX2Nhc3Q8ZG91
YmxlPihtX2RlZ3JlZXNbQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodG1w
KV0pOwotCi0gICAgICAgICAgICAvLyBBbGwgZWxzZSBiZWluZyBlcXVhbCwgdGhlIHNjb3JlIHNo
b3VsZCBiZSBpbnZlcnNlbHkgcmVsYXRlZCB0byB0aGUgbnVtYmVyIG9mIHdhcm0gdXNlcyBhbmQK
LSAgICAgICAgICAgIC8vIGRlZnMuCi0gICAgICAgICAgICBjb25zdCBVc2VDb3VudHM8VG1wPjo6
Q291bnRzKiBjb3VudHMgPSBtX3VzZUNvdW50c1t0bXBdOwotICAgICAgICAgICAgaWYgKCFjb3Vu
dHMpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6
aW5maW5pdHkoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZG91YmxlIHVzZXMgPSBjb3Vu
dHMtPm51bVdhcm1Vc2VzICsgY291bnRzLT5udW1EZWZzOwotCi0gICAgICAgICAgICAvLyBJZiBp
dCdzIGEgY29uc3RhbnQsIHRoZW4gaXQncyBub3QgYXMgYmFkIHRvIHNwaWxsLiBXZSBjYW4gcmVt
YXRlcmlhbGl6ZSBpdCBpbiBtYW55Ci0gICAgICAgICAgICAvLyBjYXNlcy4KLSAgICAgICAgICAg
IGlmIChjb3VudHMtPm51bUNvbnN0RGVmcyA9PSAxICYmIGNvdW50cy0+bnVtRGVmcyA9PSAxKQot
ICAgICAgICAgICAgICAgIHVzZXMgLz0gMjsKLQotICAgICAgICAgICAgcmV0dXJuIGRlZ3JlZSAv
IHVzZXM7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgYXV0byB2aWN0aW1JdGVyYXRvciA9IGl0ZXJh
dG9yOwotICAgICAgICBkb3VibGUgbWF4U2NvcmUgPSBzY29yZShBYnNvbHV0ZVRtcE1hcHBlcjx0
eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgoKml0ZXJhdG9yKSk7Ci0KLSAgICAgICAgKytpdGVy
YXRvcjsKLSAgICAgICAgZm9yICg7aXRlcmF0b3IgIT0gbV9zcGlsbFdvcmtsaXN0LmVuZCgpOyAr
K2l0ZXJhdG9yKSB7Ci0gICAgICAgICAgICBkb3VibGUgdG1wU2NvcmUgPSBzY29yZShBYnNvbHV0
ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgoKml0ZXJhdG9yKSk7Ci0gICAg
ICAgICAgICBpZiAodG1wU2NvcmUgPiBtYXhTY29yZSkgewotICAgICAgICAgICAgICAgIEFTU0VS
VCghbV91bnNwaWxsYWJsZVRtcHMuY29udGFpbnMoKml0ZXJhdG9yKSk7Ci0gICAgICAgICAgICAg
ICAgdmljdGltSXRlcmF0b3IgPSBpdGVyYXRvcjsKLSAgICAgICAgICAgICAgICBtYXhTY29yZSA9
IHRtcFNjb3JlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdW5zaWduZWQg
dmljdGltSW5kZXggPSAqdmljdGltSXRlcmF0b3I7Ci0gICAgICAgIG1fc3BpbGxXb3JrbGlzdC5y
ZW1vdmUodmljdGltSXRlcmF0b3IpOwotICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuYXBwZW5k
KHZpY3RpbUluZGV4KTsKLQotICAgICAgICBmcmVlemVNb3Zlcyh2aWN0aW1JbmRleCk7Ci0gICAg
fQotCi0gICAgdm9pZCBhbGxvY2F0ZSgpCi0gICAgewotICAgICAgICBBU1NFUlRfV0lUSF9NRVNT
QUdFKG1fYWN0aXZlTW92ZXMuc2l6ZSgpID49IG1fY29hbGVzY2luZ0NhbmRpZGF0ZXMuc2l6ZSgp
LCAiVGhlIGFjdGl2ZU1vdmUgc2V0IHNob3VsZCBiZSBiaWcgZW5vdWdoIGZvciB0aGUgcXVpY2sg
b3BlcmF0aW9ucyBvZiBCaXRWZWN0b3IuIik7Ci0KLSAgICAgICAgbWFrZVdvcmtMaXN0KCk7Ci0K
LSAgICAgICAgaWYgKGRlYnVnKSB7Ci0gICAgICAgICAgICBkYXRhTG9nKCJJbnRlcmZlcmVuY2U6
ICIsIGxpc3REdW1wKG1faW50ZXJmZXJlbmNlRWRnZXMpLCAiXG4iKTsKLSAgICAgICAgICAgIGR1
bXBJbnRlcmZlcmVuY2VHcmFwaEluRG90KFdURjo6ZGF0YUZpbGUoKSk7Ci0gICAgICAgICAgICBk
YXRhTG9nKCJDb2FsZXNjaW5nIGNhbmRpZGF0ZXM6XG4iKTsKLSAgICAgICAgICAgIGZvciAoTW92
ZU9wZXJhbmRzJiBtb3ZlT3AgOiBtX2NvYWxlc2NpbmdDYW5kaWRhdGVzKSB7Ci0gICAgICAgICAg
ICAgICAgZGF0YUxvZygiICAgICIsIEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJz
b2x1dGVJbmRleChtb3ZlT3Auc3JjSW5kZXgpLAotICAgICAgICAgICAgICAgICAgICAiIC0+ICIs
IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleChtb3ZlT3AuZHN0
SW5kZXgpLCAiXG4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRhdGFMb2coIkluaXRp
YWwgd29yayBsaXN0XG4iKTsKLSAgICAgICAgICAgIGR1bXBXb3JrTGlzdHMoV1RGOjpkYXRhRmls
ZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGlmICh0cmFjZURl
YnVnKSB7Ci0gICAgICAgICAgICAgICAgZGF0YUxvZygiQmVmb3JlIEdyYXBoIHNpbXBsaWZpY2F0
aW9uIGl0ZXJhdGlvblxuIik7Ci0gICAgICAgICAgICAgICAgZHVtcFdvcmtMaXN0cyhXVEY6OmRh
dGFGaWxlKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIW1fc2ltcGxpZnlX
b3JrbGlzdC5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgc2ltcGxpZnkoKTsKLSAgICAgICAg
ICAgIGVsc2UgaWYgKCFtX3dvcmtsaXN0TW92ZXMuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAg
IGNvYWxlc2NlKCk7Ci0gICAgICAgICAgICBlbHNlIGlmICghbV9mcmVlemVXb3JrbGlzdC5pc0Vt
cHR5KCkpCi0gICAgICAgICAgICAgICAgZnJlZXplKCk7Ci0gICAgICAgICAgICBlbHNlIGlmICgh
bV9zcGlsbFdvcmtsaXN0LmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICBzZWxlY3RTcGlsbCgp
OwotCi0gICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykgewotICAgICAgICAgICAgICAgIGRhdGFM
b2coIkFmdGVyIEdyYXBoIHNpbXBsaWZpY2F0aW9uIGl0ZXJhdGlvblxuIik7Ci0gICAgICAgICAg
ICAgICAgZHVtcFdvcmtMaXN0cyhXVEY6OmRhdGFGaWxlKCkpOwotICAgICAgICAgICAgfQotICAg
ICAgICB9IHdoaWxlICghbV9zaW1wbGlmeVdvcmtsaXN0LmlzRW1wdHkoKSB8fCAhbV93b3JrbGlz
dE1vdmVzLmlzRW1wdHkoKSB8fCAhbV9mcmVlemVXb3JrbGlzdC5pc0VtcHR5KCkgfHwgIW1fc3Bp
bGxXb3JrbGlzdC5pc0VtcHR5KCkpOwotCi0gICAgICAgIGFzc2lnbkNvbG9ycygpOwotICAgIH0K
LQotI2lmIFBMQVRGT1JNKENPQ09BKQotI3ByYWdtYSBtYXJrIC0gRGVidWdnaW5nIGhlbHBlcnMu
Ci0jZW5kaWYKLQotICAgIHZvaWQgZHVtcEludGVyZmVyZW5jZUdyYXBoSW5Eb3QoUHJpbnRTdHJl
YW0mIG91dCkKLSAgICB7Ci0gICAgICAgIG91dC5wcmludCgiZ3JhcGggSW50ZXJmZXJlbmNlR3Jh
cGggeyBcbiIpOwotCi0gICAgICAgIEhhc2hTZXQ8VG1wPiB0bXBzV2l0aEludGVyZmVyZW5jZXM7
Ci0gICAgICAgIGZvciAoY29uc3QgYXV0byYgZWRnZSA6IG1faW50ZXJmZXJlbmNlRWRnZXMpIHsK
LSAgICAgICAgICAgIHRtcHNXaXRoSW50ZXJmZXJlbmNlcy5hZGQoQWJzb2x1dGVUbXBNYXBwZXI8
dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KGVkZ2UuZmlyc3QoKSkpOwotICAgICAgICAgICAg
dG1wc1dpdGhJbnRlcmZlcmVuY2VzLmFkZChBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJv
bUFic29sdXRlSW5kZXgoZWRnZS5zZWNvbmQoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9y
IChjb25zdCBhdXRvJiB0bXAgOiB0bXBzV2l0aEludGVyZmVyZW5jZXMpIHsKLSAgICAgICAgICAg
IHVuc2lnbmVkIHRtcEluZGV4ID0gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5k
ZXgodG1wKTsKLSAgICAgICAgICAgIGlmICh0bXBJbmRleCA8IG1fZGVncmVlcy5zaXplKCkpCi0g
ICAgICAgICAgICAgICAgb3V0LnByaW50KCIgICAgIiwgdG1wLmludGVybmFsVmFsdWUoKSwgIiBb
bGFiZWw9XCIiLCB0bXAsICIgKCIsIG1fZGVncmVlc1t0bXBJbmRleF0sICIpXCJdO1xuIik7Ci0g
ICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgb3V0LnByaW50KCIgICAgIiwgdG1wLmlu
dGVybmFsVmFsdWUoKSwgIiBbbGFiZWw9XCIiLCB0bXAsICJcIl07XG4iKTsKLSAgICAgICAgfQot
Ci0gICAgICAgIGZvciAoY29uc3QgYXV0byYgZWRnZSA6IG1faW50ZXJmZXJlbmNlRWRnZXMpCi0g
ICAgICAgICAgICBvdXQucHJpbnQoIiAgICAiLCBlZGdlLmZpcnN0KCksICIgLS0gIiwgZWRnZS5z
ZWNvbmQoKSwgIjtcbiIpOwotICAgICAgICBvdXQucHJpbnQoIn1cbiIpOwotICAgIH0KLQotICAg
IHZvaWQgZHVtcFdvcmtMaXN0cyhQcmludFN0cmVhbSYgb3V0KQotICAgIHsKLSAgICAgICAgb3V0
LnByaW50KCJTaW1wbGlmeSB3b3JrIGxpc3Q6XG4iKTsKLSAgICAgICAgZm9yICh1bnNpZ25lZCB0
bXBJbmRleCA6IG1fc2ltcGxpZnlXb3JrbGlzdCkKLSAgICAgICAgICAgIG91dC5wcmludCgiICAg
ICIsIEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleCh0bXBJbmRl
eCksICJcbiIpOwotICAgICAgICBvdXQucHJpbnRmKCJNb3ZlcyB3b3JrIGxpc3QgaXMgZW1wdHk/
ICVkXG4iLCBtX3dvcmtsaXN0TW92ZXMuaXNFbXB0eSgpKTsKLSAgICAgICAgb3V0LnByaW50KCJG
cmVlemUgd29yayBsaXN0OlxuIik7Ci0gICAgICAgIGZvciAodW5zaWduZWQgdG1wSW5kZXggOiBt
X2ZyZWV6ZVdvcmtsaXN0KQotICAgICAgICAgICAgb3V0LnByaW50KCIgICAgIiwgQWJzb2x1dGVU
bXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KHRtcEluZGV4KSwgIlxuIik7Ci0g
ICAgICAgIG91dC5wcmludCgiU3BpbGwgd29yayBsaXN0OlxuIik7Ci0gICAgICAgIGZvciAodW5z
aWduZWQgdG1wSW5kZXggOiBtX3NwaWxsV29ya2xpc3QpCi0gICAgICAgICAgICBvdXQucHJpbnQo
IiAgICAiLCBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgodG1w
SW5kZXgpLCAiXG4iKTsKLSAgICB9Ci0KLSAgICB1c2luZyBBYnN0cmFjdENvbG9yaW5nQWxsb2Nh
dG9yPHVuc2lnbmVkPjo6YWRkRWRnZTsKLSAgICB1c2luZyBBYnN0cmFjdENvbG9yaW5nQWxsb2Nh
dG9yPHVuc2lnbmVkPjo6Z2V0QWxpYXM7Ci0KLSAgICBDb2RlJiBtX2NvZGU7Ci0gICAgVG1wV2lk
dGgmIG1fdG1wV2lkdGg7Ci0gICAgLy8gRklYTUU6IHNwaWxsaW5nIHNob3VsZCBub3QgdHlwZSBz
cGVjaWZpYy4gSXQgaXMgb25seSBhIHNpZGUgZWZmZWN0IG9mIHVzaW5nIFVzZUNvdW50cy4KLSAg
ICBjb25zdCBVc2VDb3VudHM8VG1wPiYgbV91c2VDb3VudHM7Ci19OwotCi1jbGFzcyBJdGVyYXRl
ZFJlZ2lzdGVyQ29hbGVzY2luZyB7Ci1wdWJsaWM6Ci0gICAgSXRlcmF0ZWRSZWdpc3RlckNvYWxl
c2NpbmcoQ29kZSYgY29kZSkKLSAgICAgICAgOiBtX2NvZGUoY29kZSkKLSAgICAgICAgLCBtX3Vz
ZUNvdW50cyhjb2RlKQotICAgIHsKLSAgICB9Ci0KLSAgICB2b2lkIHJ1bigpCi0gICAgewotICAg
ICAgICBwYWRJbnRlcmZlcmVuY2UobV9jb2RlKTsKLSAgICAgICAgCi0gICAgICAgIGl0ZXJhdGVk
UmVnaXN0ZXJDb2FsZXNjaW5nT25UeXBlPEFyZzo6R1A+KCk7Ci0gICAgICAgIGl0ZXJhdGVkUmVn
aXN0ZXJDb2FsZXNjaW5nT25UeXBlPEFyZzo6RlA+KCk7Ci0KLSAgICAgICAgZml4U3BpbGxzQWZ0
ZXJUZXJtaW5hbHMoKTsKLQotICAgICAgICBpZiAocmVwb3J0U3RhdHMpCi0gICAgICAgICAgICBk
YXRhTG9nKCJOdW0gaXRlcmF0aW9ucyA9ICIsIG1fbnVtSXRlcmF0aW9ucywgIlxuIik7Ci0gICAg
fQotCi1wcml2YXRlOgotICAgIHRlbXBsYXRlPEFyZzo6VHlwZSB0eXBlPgotICAgIHZvaWQgaXRl
cmF0ZWRSZWdpc3RlckNvYWxlc2NpbmdPblR5cGUoKQotICAgIHsKLSAgICAgICAgSGFzaFNldDx1
bnNpZ25lZD4gdW5zcGlsbGFibGVUbXBzID0gY29tcHV0ZVVuc3BpbGxhYmxlVG1wczx0eXBlPigp
OwotCi0gICAgICAgIC8vIEZJWE1FOiBJZiBhIFRtcCBpcyB1c2VkIG9ubHkgZnJvbSBhIFNjcmF0
Y2ggcm9sZSBhbmQgdGhhdCBhcmd1bWVudCBpcyAhYWRtaXRzU3RhY2ssIHRoZW4KLSAgICAgICAg
Ly8gd2Ugc2hvdWxkIGFkZCB0aGUgVG1wIHRvIHVuc3BpbGxhYmxlVG1wcy4gVGhhdCB3aWxsIGhl
bHAgYXZvaWQgcmVsb29waW5nIG9ubHkgdG8gdHVybiB0aGUKLSAgICAgICAgLy8gVG1wIGludG8g
YW4gdW5zcGlsbGFibGUgVG1wLgotICAgICAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9MTUyNjk5Ci0gICAgICAgIAotICAgICAgICB3aGlsZSAodHJ1ZSkgewot
ICAgICAgICAgICAgKyttX251bUl0ZXJhdGlvbnM7Ci0KLSAgICAgICAgICAgIGlmICh0cmFjZURl
YnVnKQotICAgICAgICAgICAgICAgIGRhdGFMb2coIkNvZGUgYXQgaXRlcmF0aW9uICIsIG1fbnVt
SXRlcmF0aW9ucywgIjpcbiIsIG1fY29kZSk7Ci0KLSAgICAgICAgICAgIC8vIEZJWE1FOiBPbmUg
d2F5IHRvIG9wdGltaXplIHRoaXMgY29kZSBpcyB0byByZW1vdmUgdGhlIHJlY29tcHV0YXRpb24g
aW5zaWRlIHRoZSBmaXhwb2ludC4KLSAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gcmVjb21wdXRl
IGJlY2F1c2Ugc3BpbGxpbmcgYWRkcyB0bXBzLCBidXQgd2UgY291bGQganVzdCB1cGRhdGUgdG1w
V2lkdGggd2hlbiB3ZQotICAgICAgICAgICAgLy8gYWRkIHRob3NlIHRtcHMuIE5vdGUgdGhhdCBv
bmUgZWFzeSB3YXkgdG8gcmVtb3ZlIHRoZSByZWNvbXB1dGF0aW9uIGlzIHRvIG1ha2UgYW55IG5l
d2x5Ci0gICAgICAgICAgICAvLyBhZGRlZCBUbXBzIGdldCB0aGUgc2FtZSB1c2UvZGVmIHdpZHRo
cyB0aGF0IHRoZSBvcmlnaW5hbCBUbXAgZ290LiBCdXQsIHRoaXMgbWF5IGh1cnQgdGhlCi0gICAg
ICAgICAgICAvLyBzcGlsbCBjb2RlIHdlIGVtaXQuIFNpbmNlIHdlIGN1cnJlbnRseSByZWNvbXB1
dGUgVG1wV2lkdGggYWZ0ZXIgc3BpbGxpbmcsIHRoZSBuZXdseQotICAgICAgICAgICAgLy8gY3Jl
YXRlZCBUbXBzIG1heSBnZXQgbmFycm93ZXIgdXNlL2RlZiB3aWR0aHMuIE9uIHRoZSBvdGhlciBo
YW5kLCB0aGUgc3BpbGxlciBhbHJlYWR5Ci0gICAgICAgICAgICAvLyBzZWxlY3RzIHdoaWNoIG1v
dmUgaW5zdHJ1Y3Rpb24gdG8gdXNlIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCBUbXAncyB3aWR0aHMs
IHNvIGl0IG1heSBub3QKLSAgICAgICAgICAgIC8vIG1hdHRlciB0aGFuIGEgc3Vic2VxdWVudCBp
dGVyYXRpb24gc2VlcyBhIGNvc2VydmF0aXZlIHdpZHRoIGZvciB0aGUgbmV3IFRtcHMuIEFsc28s
IHRoZQotICAgICAgICAgICAgLy8gcmVjb21wdXRhdGlvbiBtYXkgbm90IGFjdHVhbGx5IGJlIGEg
cGVyZm9ybWFuY2UgcHJvYmxlbTsgaXQncyBsaWtlbHkgdGhhdCBhIGJldHRlciB3YXkgdG8KLSAg
ICAgICAgICAgIC8vIGltcHJvdmUgcGVyZm9ybWFuY2Ugb2YgVG1wV2lkdGggaXMgdG8gcmVwbGFj
ZSBpdHMgSGFzaE1hcCB3aXRoIHNvbWV0aGluZyBlbHNlLiBJdCdzCi0gICAgICAgICAgICAvLyBw
b3NzaWJsZSB0aGF0IG1vc3Qgb2YgdGhlIFRtcFdpZHRoIG92ZXJoZWFkIGlzIGZyb20gcXVlcmll
cyBvZiBUbXBXaWR0aCByYXRoZXIgdGhhbiB0aGUKLSAgICAgICAgICAgIC8vIHJlY29tcHV0YXRp
b24sIGluIHdoaWNoIGNhc2Ugc3BlZWRpbmcgdXAgdGhlIGxvb2t1cCB3b3VsZCBiZSBhIGJpZ2dl
ciB3aW4uCi0gICAgICAgICAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9MTUyNDc4Ci0gICAgICAgICAgICBtX3RtcFdpZHRoLnJlY29tcHV0ZShtX2NvZGUpOwot
ICAgICAgICAgICAgCi0gICAgICAgICAgICBDb2xvcmluZ0FsbG9jYXRvcjx0eXBlPiBhbGxvY2F0
b3IobV9jb2RlLCBtX3RtcFdpZHRoLCBtX3VzZUNvdW50cywgdW5zcGlsbGFibGVUbXBzKTsKLSAg
ICAgICAgICAgIGlmICghYWxsb2NhdG9yLnJlcXVpcmVzU3BpbGxpbmcoKSkgewotICAgICAgICAg
ICAgICAgIGFzc2lnblJlZ2lzdGVyc1RvVG1wKGFsbG9jYXRvcik7Ci0gICAgICAgICAgICAgICAg
aWYgKHRyYWNlRGVidWcpCi0gICAgICAgICAgICAgICAgICAgIGRhdGFMb2coIlN1Y2Nlc3NmdWxs
IGFsbG9jYXRpb24gYXQgaXRlcmF0aW9uICIsIG1fbnVtSXRlcmF0aW9ucywgIjpcbiIsIG1fY29k
ZSk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAg
ICBhZGRTcGlsbEFuZEZpbGw8dHlwZT4oYWxsb2NhdG9yLCB1bnNwaWxsYWJsZVRtcHMpOwotICAg
ICAgICB9Ci0gICAgfQotCi0gICAgdGVtcGxhdGU8QXJnOjpUeXBlIHR5cGU+Ci0gICAgSGFzaFNl
dDx1bnNpZ25lZD4gY29tcHV0ZVVuc3BpbGxhYmxlVG1wcygpCi0gICAgewotICAgICAgICBIYXNo
U2V0PHVuc2lnbmVkPiB1bnNwaWxsYWJsZVRtcHM7Ci0KLSAgICAgICAgc3RydWN0IFJhbmdlIHsK
LSAgICAgICAgICAgIHVuc2lnbmVkIGZpcnN0IHsgc3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25l
ZD46Om1heCgpIH07Ci0gICAgICAgICAgICB1bnNpZ25lZCBsYXN0IHsgMCB9OwotICAgICAgICAg
ICAgdW5zaWduZWQgY291bnQgeyAwIH07Ci0gICAgICAgICAgICB1bnNpZ25lZCBhZG1pdFN0YWNr
Q291bnQgeyAwIH07Ci0gICAgICAgIH07Ci0KLSAgICAgICAgdW5zaWduZWQgbnVtVG1wcyA9IG1f
Y29kZS5udW1UbXBzKHR5cGUpOwotICAgICAgICB1bnNpZ25lZCBhcnJheVNpemUgPSBBYnNvbHV0
ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChudW1UbXBzKTsKLQotICAgICAgICBWZWN0
b3I8UmFuZ2UsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiByYW5nZXM7Ci0gICAgICAgIHJhbmdl
cy5maWxsKFJhbmdlKCksIGFycmF5U2l6ZSk7Ci0KLSAgICAgICAgdW5zaWduZWQgZ2xvYmFsSW5k
ZXggPSAwOwotICAgICAgICBmb3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogbV9jb2RlKSB7Ci0gICAg
ICAgICAgICBmb3IgKEluc3QmIGluc3QgOiAqYmxvY2spIHsKLSAgICAgICAgICAgICAgICBpbnN0
LmZvckVhY2hBcmcoWyZdIChBcmcmIGFyZywgQXJnOjpSb2xlLCBBcmc6OlR5cGUgYXJnVHlwZSwg
QXJnOjpXaWR0aCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYXJnLmlzVG1wKCkgJiYgaW5z
dC5hZG1pdHNTdGFjayhhcmcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnVHlw
ZSAhPSB0eXBlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAg
ICAgICAgICAgICAgICAgICAgVG1wIHRtcCA9IGFyZy50bXAoKTsKLSAgICAgICAgICAgICAgICAg
ICAgICAgIFJhbmdlJiByYW5nZSA9IHJhbmdlc1tBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJz
b2x1dGVJbmRleCh0bXApXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmNvdW50Kys7
Ci0gICAgICAgICAgICAgICAgICAgICAgICByYW5nZS5hZG1pdFN0YWNrQ291bnQrKzsKLSAgICAg
ICAgICAgICAgICAgICAgICAgIGlmIChnbG9iYWxJbmRleCA8IHJhbmdlLmZpcnN0KSB7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuZmlyc3QgPSBnbG9iYWxJbmRleDsKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICByYW5nZS5sYXN0ID0gZ2xvYmFsSW5kZXg7Ci0gICAgICAg
ICAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5n
ZS5sYXN0ID0gZ2xvYmFsSW5kZXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsK
LSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGFyZy5mb3JFYWNo
VG1wRmFzdChbJl0gKFRtcCYgdG1wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1w
LmlzR1AoKSAhPSAodHlwZSA9PSBBcmc6OkdQKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICByZXR1cm47Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFJhbmdlJiByYW5nZSA9IHJhbmdl
c1tBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh0bXApXTsKLSAgICAgICAg
ICAgICAgICAgICAgICAgIHJhbmdlLmNvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBp
ZiAoZ2xvYmFsSW5kZXggPCByYW5nZS5maXJzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHJhbmdlLmZpcnN0ID0gZ2xvYmFsSW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgcmFuZ2UubGFzdCA9IGdsb2JhbEluZGV4OwotICAgICAgICAgICAgICAgICAgICAgICAgfSBl
bHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UubGFzdCA9IGdsb2JhbEluZGV4
OwotICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICB9KTsKLQotICAgICAg
ICAgICAgICAgICsrZ2xvYmFsSW5kZXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICArK2ds
b2JhbEluZGV4OwotICAgICAgICB9Ci0gICAgICAgIGZvciAodW5zaWduZWQgaSA9IEFic29sdXRl
VG1wTWFwcGVyPHR5cGU+OjpsYXN0TWFjaGluZVJlZ2lzdGVySW5kZXgoKSArIDE7IGkgPCByYW5n
ZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIFJhbmdlJiByYW5nZSA9IHJhbmdlc1tpXTsK
LSAgICAgICAgICAgIGlmIChyYW5nZS5sYXN0IC0gcmFuZ2UuZmlyc3QgPD0gMSAmJiByYW5nZS5j
b3VudCA+IHJhbmdlLmFkbWl0U3RhY2tDb3VudCkKLSAgICAgICAgICAgICAgICB1bnNwaWxsYWJs
ZVRtcHMuYWRkKGkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHVuc3BpbGxhYmxlVG1w
czsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZTxBcmc6OlR5cGUgdHlwZT4KLSAgICB2b2lkIGFzc2ln
blJlZ2lzdGVyc1RvVG1wKGNvbnN0IENvbG9yaW5nQWxsb2NhdG9yPHR5cGU+JiBhbGxvY2F0b3Ip
Ci0gICAgewotICAgICAgICBmb3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogbV9jb2RlKSB7Ci0gICAg
ICAgICAgICAvLyBHaXZlIFRtcCBhIHZhbGlkIHJlZ2lzdGVyLgotICAgICAgICAgICAgZm9yICh1
bnNpZ25lZCBpbnN0SW5kZXggPSAwOyBpbnN0SW5kZXggPCBibG9jay0+c2l6ZSgpOyArK2luc3RJ
bmRleCkgewotICAgICAgICAgICAgICAgIEluc3QmIGluc3QgPSBibG9jay0+YXQoaW5zdEluZGV4
KTsKLQotICAgICAgICAgICAgICAgIC8vIFRoZSBtYXlCZUNvYWxlc2NhYmxlKCkgbWV0aG9kIHdp
bGwgY2hhbmdlIGl0cyBtaW5kIGZvciBzb21lIG9wZXJhdGlvbnMgYWZ0ZXIgd2UKLSAgICAgICAg
ICAgICAgICAvLyBjb21wbGV0ZSByZWdpc3RlciBhbGxvY2F0aW9uLiBTbywgd2UgcmVjb3JkIHRo
aXMgYmVmb3JlIHN0YXJ0aW5nLgotICAgICAgICAgICAgICAgIGJvb2wgbWF5QmVDb2FsZXNjYWJs
ZSA9IGFsbG9jYXRvci5tYXlCZUNvYWxlc2NhYmxlKGluc3QpOwotCi0gICAgICAgICAgICAgICAg
Ly8gTW92ZTMyIGlzIGNoZWFwZXIgaWYgd2Uga25vdyB0aGF0IGl0J3MgZXF1aXZhbGVudCB0byBh
IE1vdmUuIEl0J3MKLSAgICAgICAgICAgICAgICAvLyBlcXVpdmFsZW50IGlmIHRoZSBkZXN0aW5h
dGlvbidzIGhpZ2ggYml0cyBhcmUgbm90IG9ic2VydmFibGUgb3IgaWYgdGhlIHNvdXJjZSdzIGhp
Z2gKLSAgICAgICAgICAgICAgICAvLyBiaXRzIGFyZSBhbGwgemVyby4gTm90ZSB0aGF0IHdlIGRv
bid0IGhhdmUgdGhlIG9wcG9zaXRlIG9wdGltaXphdGlvbiBmb3Igb3RoZXIKLSAgICAgICAgICAg
ICAgICAvLyBhcmNoaXRlY3R1cmVzLCB3aGljaCBtYXkgcHJlZmVyIE1vdmUgb3ZlciBNb3ZlMzIs
IGJlY2F1c2UgTW92ZSBpcyBjYW5vbmljYWwgYWxyZWFkeS4KLSAgICAgICAgICAgICAgICBpZiAo
dHlwZSA9PSBBcmc6OkdQICYmIGluc3Qua2luZC5vcGNvZGUgPT0gTW92ZQotICAgICAgICAgICAg
ICAgICAgICAmJiBpbnN0LmFyZ3NbMF0uaXNUbXAoKSAmJiBpbnN0LmFyZ3NbMV0uaXNUbXAoKSkg
ewotICAgICAgICAgICAgICAgICAgICBpZiAobV90bXBXaWR0aC51c2VXaWR0aChpbnN0LmFyZ3Nb
MV0udG1wKCkpIDw9IEFyZzo6V2lkdGgzMgotICAgICAgICAgICAgICAgICAgICAgICAgfHwgbV90
bXBXaWR0aC5kZWZXaWR0aChpbnN0LmFyZ3NbMF0udG1wKCkpIDw9IEFyZzo6V2lkdGgzMikKLSAg
ICAgICAgICAgICAgICAgICAgICAgIGluc3Qua2luZC5vcGNvZGUgPSBNb3ZlMzI7Ci0gICAgICAg
ICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaW5zdC5mb3JFYWNoVG1wRmFzdChbJl0gKFRt
cCYgdG1wKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0bXAuaXNSZWcoKSB8fCB0bXAuaXNH
UCgpID09ICh0eXBlICE9IEFyZzo6R1ApKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJu
OwotCi0gICAgICAgICAgICAgICAgICAgIFRtcCBhbGlhc1RtcCA9IGFsbG9jYXRvci5nZXRBbGlh
cyh0bXApOwotICAgICAgICAgICAgICAgICAgICBUbXAgYXNzaWduZWRUbXA7Ci0gICAgICAgICAg
ICAgICAgICAgIGlmIChhbGlhc1RtcC5pc1JlZygpKQotICAgICAgICAgICAgICAgICAgICAgICAg
YXNzaWduZWRUbXAgPSBUbXAoYWxpYXNUbXAucmVnKCkpOwotICAgICAgICAgICAgICAgICAgICBl
bHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gcmVnID0gYWxsb2NhdG9yLmFsbG9j
YXRlZFJlZyhhbGlhc1RtcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBU1NFUlQocmVnKTsK
LSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbmVkVG1wID0gVG1wKHJlZyk7Ci0gICAgICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgQVNTRVJUKGFzc2lnbmVkVG1wLmlz
UmVnKCkpOwotICAgICAgICAgICAgICAgICAgICB0bXAgPSBhc3NpZ25lZFRtcDsKLSAgICAgICAg
ICAgICAgICB9KTsKLQotICAgICAgICAgICAgICAgIGlmIChtYXlCZUNvYWxlc2NhYmxlICYmIGlu
c3QuYXJnc1swXS5pc1RtcCgpICYmIGluc3QuYXJnc1sxXS5pc1RtcCgpCi0gICAgICAgICAgICAg
ICAgICAgICYmIGluc3QuYXJnc1swXS50bXAoKSA9PSBpbnN0LmFyZ3NbMV0udG1wKCkpCi0gICAg
ICAgICAgICAgICAgICAgIGluc3QgPSBJbnN0KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAg
ICAgIC8vIFJlbW92ZSBhbGwgdGhlIHVzZWxlc3MgbW92ZXMgd2UgY3JlYXRlZCBpbiB0aGlzIGJs
b2NrLgotICAgICAgICAgICAgYmxvY2stPmluc3RzKCkucmVtb3ZlQWxsTWF0Y2hpbmcoWyZdIChj
b25zdCBJbnN0JiBpbnN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICFpbnN0OwotICAgICAg
ICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgdW5zaWduZWQgc3RhY2tT
bG90TWluaW11bVdpZHRoKEFyZzo6V2lkdGggd2lkdGgpCi0gICAgewotICAgICAgICByZXR1cm4g
d2lkdGggPD0gQXJnOjpXaWR0aDMyID8gNCA6IDg7Ci0gICAgfQotCi0gICAgdGVtcGxhdGU8QXJn
OjpUeXBlIHR5cGU+Ci0gICAgdm9pZCBhZGRTcGlsbEFuZEZpbGwoY29uc3QgQ29sb3JpbmdBbGxv
Y2F0b3I8dHlwZT4mIGFsbG9jYXRvciwgSGFzaFNldDx1bnNpZ25lZD4mIHVuc3BpbGxhYmxlVG1w
cykKLSAgICB7Ci0gICAgICAgIEhhc2hNYXA8VG1wLCBTdGFja1Nsb3QqPiBzdGFja1Nsb3RzOwot
ICAgICAgICBmb3IgKFRtcCB0bXAgOiBhbGxvY2F0b3Iuc3BpbGxlZFRtcHMoKSkgewotICAgICAg
ICAgICAgLy8gQWxsIHRoZSBzcGlsbGVkIHZhbHVlcyBiZWNvbWUgdW5zcGlsbGFibGUuCi0gICAg
ICAgICAgICB1bnNwaWxsYWJsZVRtcHMuYWRkKEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNv
bHV0ZUluZGV4KHRtcCkpOwotCi0gICAgICAgICAgICAvLyBBbGxvY2F0ZSBzdGFjayBzbG90IGZv
ciBlYWNoIHNwaWxsZWQgdmFsdWUuCi0gICAgICAgICAgICBTdGFja1Nsb3QqIHN0YWNrU2xvdCA9
IG1fY29kZS5hZGRTdGFja1Nsb3QoCi0gICAgICAgICAgICAgICAgc3RhY2tTbG90TWluaW11bVdp
ZHRoKG1fdG1wV2lkdGgucmVxdWlyZWRXaWR0aCh0bXApKSwgU3RhY2tTbG90S2luZDo6U3BpbGwp
OwotICAgICAgICAgICAgYm9vbCBpc05ld1RtcCA9IHN0YWNrU2xvdHMuYWRkKHRtcCwgc3RhY2tT
bG90KS5pc05ld0VudHJ5OwotICAgICAgICAgICAgQVNTRVJUX1VOVVNFRChpc05ld1RtcCwgaXNO
ZXdUbXApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmV3cml0ZSB0aGUgcHJvZ3JhbSB0byBn
ZXQgcmlkIG9mIHRoZSBzcGlsbGVkIFRtcC4KLSAgICAgICAgSW5zZXJ0aW9uU2V0IGluc2VydGlv
blNldChtX2NvZGUpOwotICAgICAgICBmb3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogbV9jb2RlKSB7
Ci0gICAgICAgICAgICBib29sIGhhc0FsaWFzZWRUbXBzID0gZmFsc2U7Ci0KLSAgICAgICAgICAg
IGZvciAodW5zaWduZWQgaW5zdEluZGV4ID0gMDsgaW5zdEluZGV4IDwgYmxvY2stPnNpemUoKTsg
KytpbnN0SW5kZXgpIHsKLSAgICAgICAgICAgICAgICBJbnN0JiBpbnN0ID0gYmxvY2stPmF0KGlu
c3RJbmRleCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBUaGUgVG1wV2lkdGggYW5hbHlzaXMgd2ls
bCBzYXkgdGhhdCBhIE1vdmUgb25seSBzdG9yZXMgMzIgYml0cyBpbnRvIHRoZSBkZXN0aW5hdGlv
biwKLSAgICAgICAgICAgICAgICAvLyBpZiB0aGUgc291cmNlIG9ubHkgaGFkIDMyIGJpdHMgd29y
dGggb2Ygbm9uLXplcm8gYml0cy4gU2FtZSBmb3IgdGhlIHNvdXJjZTogaXQgd2lsbAotICAgICAg
ICAgICAgICAgIC8vIG9ubHkgY2xhaW0gdG8gcmVhZCAzMiBiaXRzIGZyb20gdGhlIHNvdXJjZSBp
ZiBvbmx5IDMyIGJpdHMgb2YgdGhlIGRlc3RpbmF0aW9uIGFyZQotICAgICAgICAgICAgICAgIC8v
IHJlYWQuIE5vdGUgdGhhdCB3ZSBvbmx5IGFwcGx5IHRoaXMgbG9naWMgaWYgdGhpcyB0dXJucyBp
bnRvIGEgbG9hZCBvciBzdG9yZSwgc2luY2UKLSAgICAgICAgICAgICAgICAvLyBNb3ZlIGlzIHRo
ZSBjYW5vbmljYWwgd2F5IHRvIG1vdmUgZGF0YSBiZXR3ZWVuIEdQUnMuCi0gICAgICAgICAgICAg
ICAgYm9vbCBjYW5Vc2VNb3ZlMzJJZkRpZFNwaWxsID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAg
Ym9vbCBkaWRTcGlsbCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGlmICh0eXBlID09IEFyZzo6
R1AgJiYgaW5zdC5raW5kLm9wY29kZSA9PSBNb3ZlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlm
ICgoaW5zdC5hcmdzWzBdLmlzVG1wKCkgJiYgbV90bXBXaWR0aC53aWR0aChpbnN0LmFyZ3NbMF0u
dG1wKCkpIDw9IEFyZzo6V2lkdGgzMikKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IChpbnN0
LmFyZ3NbMV0uaXNUbXAoKSAmJiBtX3RtcFdpZHRoLndpZHRoKGluc3QuYXJnc1sxXS50bXAoKSkg
PD0gQXJnOjpXaWR0aDMyKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhblVzZU1vdmUzMklm
RGlkU3BpbGwgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8v
IFRyeSB0byByZXBsYWNlIHRoZSByZWdpc3RlciB1c2UgYnkgbWVtb3J5IHVzZSB3aGVuIHBvc3Np
YmxlLgotICAgICAgICAgICAgICAgIGluc3QuZm9yRWFjaEFyZygKLSAgICAgICAgICAgICAgICAg
ICAgWyZdIChBcmcmIGFyZywgQXJnOjpSb2xlIHJvbGUsIEFyZzo6VHlwZSBhcmdUeXBlLCBBcmc6
OldpZHRoIHdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFyZy5pc1RtcCgp
KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAg
ICAgICAgIGlmIChhcmdUeXBlICE9IHR5cGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
cmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZy5pc1JlZygpKQotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIAot
ICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBzdGFja1Nsb3RFbnRyeSA9IHN0YWNrU2xvdHMu
ZmluZChhcmcudG1wKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrU2xvdEVu
dHJ5ID09IHN0YWNrU2xvdHMuZW5kKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0
dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnN0LmFkbWl0c1N0YWNrKGFyZykp
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAg
ICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgVG1wIGhvbGRzIGEgY29u
c3RhbnQgdGhlbiB3ZSB3YW50IHRvIHJlbWF0ZXJpYWxpemUgaXRzCi0gICAgICAgICAgICAgICAg
ICAgICAgICAvLyB2YWx1ZSByYXRoZXIgdGhhbiBsb2FkaW5nIGl0IGZyb20gdGhlIHN0YWNrLiBJ
biBvcmRlciBmb3IgdGhhdAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW1pemF0aW9u
IHRvIGtpY2sgaW4sIHdlIG5lZWQgdG8gYXZvaWQgcGxhY2luZyB0aGUgVG1wJ3Mgc3RhY2sKLSAg
ICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZHJlc3MgaW50byB0aGUgaW5zdHJ1Y3Rpb24uCi0g
ICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUFyZzo6aXNDb2xkVXNlKHJvbGUpKSB7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVXNlQ291bnRzPFRtcD46OkNvdW50cyogY291
bnRzID0gbV91c2VDb3VudHNbYXJnLnRtcCgpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBpZiAoY291bnRzICYmIGNvdW50cy0+bnVtQ29uc3REZWZzID09IDEgJiYgY291bnRzLT5udW1E
ZWZzID09IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAg
ICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAg
ICAgICAgICAgICAgICAgQXJnOjpXaWR0aCBzcGlsbFdpZHRoID0gbV90bXBXaWR0aC5yZXF1aXJl
ZFdpZHRoKGFyZy50bXAoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJnOjppc0Fu
eURlZihyb2xlKSAmJiB3aWR0aCA8IHNwaWxsV2lkdGgpCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgQVNTRVJUKGluc3Qua2luZC5v
cGNvZGUgPT0gTW92ZSB8fCAhKEFyZzo6aXNBbnlVc2Uocm9sZSkgJiYgd2lkdGggPiBzcGlsbFdp
ZHRoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAg
IGlmIChzcGlsbFdpZHRoICE9IEFyZzo6V2lkdGgzMikKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBjYW5Vc2VNb3ZlMzJJZkRpZFNwaWxsID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrU2xvdEVudHJ5LT52YWx1ZS0+ZW5z
dXJlU2l6ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5Vc2VNb3ZlMzJJZkRpZFNw
aWxsID8gNCA6IEFyZzo6Ynl0ZXMod2lkdGgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFy
ZyA9IEFyZzo6c3RhY2soc3RhY2tTbG90RW50cnktPnZhbHVlKTsKLSAgICAgICAgICAgICAgICAg
ICAgICAgIGRpZFNwaWxsID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0KLSAgICAg
ICAgICAgICAgICBpZiAoZGlkU3BpbGwgJiYgY2FuVXNlTW92ZTMySWZEaWRTcGlsbCkKLSAgICAg
ICAgICAgICAgICAgICAgaW5zdC5raW5kLm9wY29kZSA9IE1vdmUzMjsKLQotICAgICAgICAgICAg
ICAgIC8vIEZvciBldmVyeSBvdGhlciBjYXNlLCBhZGQgTG9hZC9TdG9yZSBhcyBuZWVkZWQuCi0g
ICAgICAgICAgICAgICAgaW5zdC5mb3JFYWNoVG1wKFsmXSAoVG1wJiB0bXAsIEFyZzo6Um9sZSBy
b2xlLCBBcmc6OlR5cGUgYXJnVHlwZSwgQXJnOjpXaWR0aCkgewotICAgICAgICAgICAgICAgICAg
ICBpZiAodG1wLmlzUmVnKCkgfHwgYXJnVHlwZSAhPSB0eXBlKQotICAgICAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICAgICAgICAgIGF1dG8gc3RhY2tTbG90RW50cnkg
PSBzdGFja1Nsb3RzLmZpbmQodG1wKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrU2xv
dEVudHJ5ID09IHN0YWNrU2xvdHMuZW5kKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFRt
cCBhbGlhcyA9IGFsbG9jYXRvci5nZXRBbGlhc1doZW5TcGlsbGluZyh0bXApOwotICAgICAgICAg
ICAgICAgICAgICAgICAgaWYgKGFsaWFzICE9IHRtcCkgewotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHRtcCA9IGFsaWFzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0FsaWFz
ZWRUbXBzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAg
ICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAg
ICAgICAgIEFyZzo6V2lkdGggc3BpbGxXaWR0aCA9IG1fdG1wV2lkdGgucmVxdWlyZWRXaWR0aCh0
bXApOwotICAgICAgICAgICAgICAgICAgICBPcGNvZGUgbW92ZSA9IE9vcHM7Ci0gICAgICAgICAg
ICAgICAgICAgIHN3aXRjaCAoc3RhY2tTbG90TWluaW11bVdpZHRoKHNwaWxsV2lkdGgpKSB7Ci0g
ICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vdmUg
PSB0eXBlID09IEFyZzo6R1AgPyBNb3ZlMzIgOiBNb3ZlRmxvYXQ7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAg
ICAgICAgICAgICAgbW92ZSA9IHR5cGUgPT0gQXJnOjpHUCA/IE1vdmUgOiBNb3ZlRG91YmxlOwot
ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1
bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgp
OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0K
LQotICAgICAgICAgICAgICAgICAgICB0bXAgPSBtX2NvZGUubmV3VG1wKHR5cGUpOwotICAgICAg
ICAgICAgICAgICAgICB1bnNwaWxsYWJsZVRtcHMuYWRkKEFic29sdXRlVG1wTWFwcGVyPHR5cGU+
OjphYnNvbHV0ZUluZGV4KHRtcCkpOwotCi0gICAgICAgICAgICAgICAgICAgIEFyZyBhcmcgPSBB
cmc6OnN0YWNrKHN0YWNrU2xvdEVudHJ5LT52YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlm
IChBcmc6OmlzQW55VXNlKHJvbGUpICYmIHJvbGUgIT0gQXJnOjpTY3JhdGNoKQotICAgICAgICAg
ICAgICAgICAgICAgICAgaW5zZXJ0aW9uU2V0Lmluc2VydChpbnN0SW5kZXgsIG1vdmUsIGluc3Qu
b3JpZ2luLCBhcmcsIHRtcCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChBcmc6OmlzQW55RGVm
KHJvbGUpKQotICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0aW9uU2V0Lmluc2VydChpbnN0
SW5kZXggKyAxLCBtb3ZlLCBpbnN0Lm9yaWdpbiwgdG1wLCBhcmcpOwotICAgICAgICAgICAgICAg
IH0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5zZXJ0aW9uU2V0LmV4ZWN1dGUoYmxv
Y2spOwotCi0gICAgICAgICAgICBpZiAoaGFzQWxpYXNlZFRtcHMpIHsKLSAgICAgICAgICAgICAg
ICBibG9jay0+aW5zdHMoKS5yZW1vdmVBbGxNYXRjaGluZyhbJl0gKGNvbnN0IEluc3QmIGluc3Qp
IHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFsbG9jYXRvci5pc1VzZWxlc3NNb3ZlKGlu
c3QpOwotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAg
fQotCi0gICAgdm9pZCBmaXhTcGlsbHNBZnRlclRlcm1pbmFscygpCi0gICAgewotICAgICAgICAv
LyBCZWNhdXNlIHRoZXJlIG1heSBiZSB0ZXJtaW5hbHMgdGhhdCBwcm9kdWNlIHZhbHVlcywgSVJD
IG1heQotICAgICAgICAvLyB3YW50IHRvIHNwaWxsIHRob3NlIHRlcm1pbmFscy4gSXQnbGwgaGFw
cGVuIHRvIHNwaWxsIGl0IGFmdGVyCi0gICAgICAgIC8vIHRoZSB0ZXJtaW5hbC4gSWYgd2UgbGVm
dCB0aGUgZ3JhcGggaW4gdGhpcyBzdGF0ZSwgaXQnZCBiZSBpbnZhbGlkCi0gICAgICAgIC8vIGJl
Y2F1c2UgYSB0ZXJtaW5hbCBtdXN0IGJlIHRoZSBsYXN0IGluc3RydWN0aW9uIGluIGEgYmxvY2su
Ci0gICAgICAgIC8vIFdlIGZpeCB0aGF0IGhlcmUuCi0KLSAgICAgICAgSW5zZXJ0aW9uU2V0IGlu
c2VydGlvblNldChtX2NvZGUpOwotCi0gICAgICAgIGJvb2wgYWRkZWRCbG9ja3MgPSBmYWxzZTsK
LQotICAgICAgICBmb3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogbV9jb2RlKSB7Ci0gICAgICAgICAg
ICB1bnNpZ25lZCB0ZXJtaW5hbEluZGV4ID0gYmxvY2stPnNpemUoKTsKLSAgICAgICAgICAgIGJv
b2wgZm91bmRUZXJtaW5hbCA9IGZhbHNlOwotICAgICAgICAgICAgd2hpbGUgKHRlcm1pbmFsSW5k
ZXgtLSkgewotICAgICAgICAgICAgICAgIGlmIChibG9jay0+YXQodGVybWluYWxJbmRleCkuaXNU
ZXJtaW5hbCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvdW5kVGVybWluYWwgPSB0cnVlOwot
ICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgICAgICBBU1NFUlRfVU5VU0VEKGZvdW5kVGVybWluYWwsIGZvdW5kVGVybWlu
YWwpOwotCi0gICAgICAgICAgICBpZiAodGVybWluYWxJbmRleCA9PSBibG9jay0+c2l6ZSgpIC0g
MSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgLy8gVGhlcmUgbXVz
dCBiZSBpbnN0cnVjdGlvbnMgYWZ0ZXIgdGhlIHRlcm1pbmFsIGJlY2F1c2UgaXQncyBub3QgdGhl
IGxhc3QgaW5zdHJ1Y3Rpb24uCi0gICAgICAgICAgICBBU1NFUlQodGVybWluYWxJbmRleCA8IGJs
b2NrLT5zaXplKCkgLSAxKTsKLSAgICAgICAgICAgIFZlY3RvcjxJbnN0LCAxPiBpbnN0c1RvTW92
ZTsKLSAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IHRlcm1pbmFsSW5kZXggKyAxOyBpIDwg
YmxvY2stPnNpemUoKTsgaSsrKQotICAgICAgICAgICAgICAgIGluc3RzVG9Nb3ZlLmFwcGVuZChi
bG9jay0+YXQoaSkpOwotICAgICAgICAgICAgUkVMRUFTRV9BU1NFUlQoaW5zdHNUb01vdmUuc2l6
ZSgpKTsKLQotICAgICAgICAgICAgZm9yIChGcmVxdWVudGVkQmxvY2smIGZyZXF1ZW50ZWRTdWNj
ZXNzb3IgOiBibG9jay0+c3VjY2Vzc29ycygpKSB7Ci0gICAgICAgICAgICAgICAgQmFzaWNCbG9j
ayogc3VjY2Vzc29yID0gZnJlcXVlbnRlZFN1Y2Nlc3Nvci5ibG9jaygpOwotICAgICAgICAgICAg
ICAgIC8vIElmIHN1Y2Nlc3NvcidzIG9ubHkgcHJlZGVjZXNzb3IgaXMgYmxvY2ssIHdlIGNhbiBw
bGFudCB0aGUgc3BpbGwgaW5zaWRlCi0gICAgICAgICAgICAgICAgLy8gdGhlIHN1Y2Nlc3Nvci4g
T3RoZXJ3aXNlLCB3ZSBtdXN0IHNwbGl0IHRoZSBjcml0aWNhbCBlZGdlIGFuZCBjcmVhdGUKLSAg
ICAgICAgICAgICAgICAvLyBhIG5ldyBibG9jayBmb3IgdGhlIHNwaWxsLgotICAgICAgICAgICAg
ICAgIGlmIChzdWNjZXNzb3ItPm51bVByZWRlY2Vzc29ycygpID09IDEpIHsKLSAgICAgICAgICAg
ICAgICAgICAgaW5zZXJ0aW9uU2V0Lmluc2VydEluc3RzKDAsIGluc3RzVG9Nb3ZlKTsKLSAgICAg
ICAgICAgICAgICAgICAgaW5zZXJ0aW9uU2V0LmV4ZWN1dGUoc3VjY2Vzc29yKTsKLSAgICAgICAg
ICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhZGRlZEJsb2NrcyA9IHRydWU7
Ci0gICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBXZSBwcm9iYWJseSB3YW50IGJldHRlciBi
bG9jayBvcmRlcmluZyBoZXJlLgotICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrKiBuZXdC
bG9jayA9IG1fY29kZS5hZGRCbG9jaygpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0
IEluc3QmIGluc3QgOiBpbnN0c1RvTW92ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Js
b2NrLT5hcHBlbmRJbnN0KGluc3QpOwotICAgICAgICAgICAgICAgICAgICBuZXdCbG9jay0+YXBw
ZW5kSW5zdChJbnN0KEp1bXAsIGluc3RzVG9Nb3ZlLmxhc3QoKS5vcmlnaW4pKTsKLSAgICAgICAg
ICAgICAgICAgICAgbmV3QmxvY2stPnN1Y2Nlc3NvcnMoKS5hcHBlbmQoc3VjY2Vzc29yKTsKLSAg
ICAgICAgICAgICAgICAgICAgZnJlcXVlbnRlZFN1Y2Nlc3Nvci5ibG9jaygpID0gbmV3QmxvY2s7
Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBibG9jay0+
cmVzaXplKHRlcm1pbmFsSW5kZXggKyAxKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhZGRl
ZEJsb2NrcykKLSAgICAgICAgICAgIG1fY29kZS5yZXNldFJlYWNoYWJpbGl0eSgpOwotICAgIH0K
LQotICAgIENvZGUmIG1fY29kZTsKLSAgICBUbXBXaWR0aCBtX3RtcFdpZHRoOwotICAgIFVzZUNv
dW50czxUbXA+IG1fdXNlQ291bnRzOwotICAgIHVuc2lnbmVkIG1fbnVtSXRlcmF0aW9ucyB7IDAg
fTsKLX07Ci0KLX0gLy8gYW5vbnltb3VzIG5hbWVzcGFjZQotCi12b2lkIGl0ZXJhdGVkUmVnaXN0
ZXJDb2FsZXNjaW5nKENvZGUmIGNvZGUpCi17Ci0gICAgUGhhc2VTY29wZSBwaGFzZVNjb3BlKGNv
ZGUsICJpdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZyIpOwotICAgIAotICAgIEl0ZXJhdGVkUmVn
aXN0ZXJDb2FsZXNjaW5nIGl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nKGNvZGUpOwotICAgIGl0
ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nLnJ1bigpOwotfQotCi19IH0gfSAvLyBuYW1lc3BhY2Ug
SlNDOjpCMzo6QWlyCi0KLSNlbmRpZiAvLyBFTkFCTEUoQjNfSklUKQpJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlySXRlcmF0ZWRSZWdpc3Rl
ckNvYWxlc2NpbmcuaAkocmV2aXNpb24gMjEyNjY2KQorKysgU291cmNlL0phdmFTY3JpcHRDb3Jl
L2IzL2Fpci9BaXJJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5oCShub25leGlzdGVudCkKQEAg
LTEsNDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBt
ZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
SU5DLiBPUgotICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi0gKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLSAq
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkKLSAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICov
Ci0KLSNwcmFnbWEgb25jZQotCi0jaWYgRU5BQkxFKEIzX0pJVCkKLQotbmFtZXNwYWNlIEpTQyB7
IG5hbWVzcGFjZSBCMyB7IG5hbWVzcGFjZSBBaXIgewotCi1jbGFzcyBDb2RlOwotCi0vLyBUaGlz
IGlzIGEgcmVnaXN0ZXIgYWxsb2NhdGlvbiBwaGFzZSBiYXNlZCBvbiBBbmRyZXcgQXBwZWwncyBJ
dGVyYXRlZCBSZWdpc3RlciBDb2FsZXNjaW5nCi0vLyBodHRwOi8vd3d3LmNzLmNtdS5lZHUvYWZz
L2NzL2FjYWRlbWljL2NsYXNzLzE1NzQ1LXMwNy93d3cvcGFwZXJzL2dlb3JnZS5wZGYKLXZvaWQg
aXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcoQ29kZSYpOwotCi19IH0gfSAvLyBuYW1lc3BhY2Ug
SlNDOjpCMzo6QWlyCi0KLSNlbmRpZiAvLyBFTkFCTEUoQjNfSklUKQpJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJSZWdpc3RlckFsbG9jYXRvci5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJSZWdpc3RlckFsbG9jYXRvci5jcHAJ
KHJldmlzaW9uIDIxMjY2NikJKGZyb20gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJJ
dGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5jcHA6MjEyNjY2KQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL2Fpci9BaXJSZWdpc3RlckFsbG9jYXRvci5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTAsMCArMSwxNjU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTcgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQWlySXRlcmF0ZWRSZWdp
c3RlckNvYWxlc2NpbmcuaCIKKworI2lmIEVOQUJMRShCM19KSVQpCisKKyNpbmNsdWRlICJBaXJD
b2RlLmgiCisjaW5jbHVkZSAiQWlySW5zZXJ0aW9uU2V0LmgiCisjaW5jbHVkZSAiQWlySW5zdElu
bGluZXMuaCIKKyNpbmNsdWRlICJBaXJMaXZlbmVzcy5oIgorI2luY2x1ZGUgIkFpclBhZEludGVy
ZmVyZW5jZS5oIgorI2luY2x1ZGUgIkFpclBoYXNlU2NvcGUuaCIKKyNpbmNsdWRlICJBaXJUbXBJ
bmxpbmVzLmgiCisjaW5jbHVkZSAiQWlyVG1wV2lkdGguaCIKKyNpbmNsdWRlICJBaXJVc2VDb3Vu
dHMuaCIKKyNpbmNsdWRlIDx3dGYvTGlzdER1bXAuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVz
cGFjZSBCMyB7IG5hbWVzcGFjZSBBaXIgeworCituYW1lc3BhY2UgeworCitib29sIGRlYnVnID0g
ZmFsc2U7Citib29sIHRyYWNlRGVidWcgPSBmYWxzZTsKK2Jvb2wgcmVwb3J0U3RhdHMgPSBmYWxz
ZTsKKworLy8gVGhlIEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0b3IgZGVmaW5lcyBhbGwgdGhlIGNv
ZGUgdGhhdCBpcyBpbmRlcGVuZGFudAorLy8gZnJvbSB0aGUgdHlwZSBvciByZWdpc3RlciBhbmQg
Y2FuIGJlIHNoYXJlZCB3aGVuIGFsbG9jYXRpbmcgcmVnaXN0ZXJzLgordGVtcGxhdGU8dHlwZW5h
bWUgSW5kZXhUeXBlPgorY2xhc3MgQWJzdHJhY3RDb2xvcmluZ0FsbG9jYXRvciB7CitwdWJsaWM6
CisgICAgQWJzdHJhY3RDb2xvcmluZ0FsbG9jYXRvcihjb25zdCBWZWN0b3I8UmVnPiYgcmVnc0lu
UHJpb3JpdHlPcmRlciwgSW5kZXhUeXBlIGxhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleCwgdW5z
aWduZWQgdG1wQXJyYXlTaXplLCBjb25zdCBIYXNoU2V0PHVuc2lnbmVkPiYgdW5zcGlsbGFibGVU
bXApCisgICAgICAgIDogbV9yZWdzSW5Qcmlvcml0eU9yZGVyKHJlZ3NJblByaW9yaXR5T3JkZXIp
CisgICAgICAgICwgbV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXgobGFzdFByZWNvbG9yZWRS
ZWdpc3RlckluZGV4KQorICAgICAgICAsIG1fdW5zcGlsbGFibGVUbXBzKHVuc3BpbGxhYmxlVG1w
KQorICAgIHsKKyAgICAgICAgZm9yIChSZWcgcmVnIDogbV9yZWdzSW5Qcmlvcml0eU9yZGVyKQor
ICAgICAgICAgICAgbV9tdXRhYmxlUmVncy5zZXQocmVnKTsKKyAgICAgICAgCisgICAgICAgIGlu
aXRpYWxpemVEZWdyZWVzKHRtcEFycmF5U2l6ZSk7CisgICAgICAgIAorICAgICAgICBtX2FkamFj
ZW5jeUxpc3QucmVzaXplKHRtcEFycmF5U2l6ZSk7CisgICAgICAgIG1fbW92ZUxpc3QucmVzaXpl
KHRtcEFycmF5U2l6ZSk7CisgICAgICAgIG1fY29hbGVzY2VkVG1wcy5maWxsKDAsIHRtcEFycmF5
U2l6ZSk7CisgICAgICAgIG1faXNPblNlbGVjdFN0YWNrLmVuc3VyZVNpemUodG1wQXJyYXlTaXpl
KTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBJbmRleFR5cGUgZ2V0QWxpYXMoSW5kZXhUeXBl
IHRtcEluZGV4KSBjb25zdAorICAgIHsKKyAgICAgICAgSW5kZXhUeXBlIGFsaWFzID0gdG1wSW5k
ZXg7CisgICAgICAgIHdoaWxlIChJbmRleFR5cGUgbmV4dEFsaWFzID0gbV9jb2FsZXNjZWRUbXBz
W2FsaWFzXSkKKyAgICAgICAgICAgIGFsaWFzID0gbmV4dEFsaWFzOworICAgICAgICByZXR1cm4g
YWxpYXM7CisgICAgfQorCisgICAgdm9pZCBhZGRFZGdlKEluZGV4VHlwZSBhLCBJbmRleFR5cGUg
YikKKyAgICB7CisgICAgICAgIGlmIChhID09IGIpCisgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgIGFkZEVkZ2VEaXN0aW5jdChhLCBiKTsKKyAgICB9CisKKyAgICB2b2lkIG1ha2VXb3JrTGlz
dCgpCisgICAgeworICAgICAgICBJbmRleFR5cGUgZmlyc3ROb25SZWdJbmRleCA9IG1fbGFzdFBy
ZWNvbG9yZWRSZWdpc3RlckluZGV4ICsgMTsKKyAgICAgICAgZm9yIChJbmRleFR5cGUgaSA9IGZp
cnN0Tm9uUmVnSW5kZXg7IGkgPCBtX2RlZ3JlZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAg
IHVuc2lnbmVkIGRlZ3JlZSA9IG1fZGVncmVlc1tpXTsKKyAgICAgICAgICAgIGlmIChkZWdyZWUg
Pj0gbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKSkKKyAgICAgICAgICAgICAgICBhZGRUb1Nw
aWxsKGkpOworICAgICAgICAgICAgZWxzZSBpZiAoIW1fbW92ZUxpc3RbaV0uaXNFbXB0eSgpKQor
ICAgICAgICAgICAgICAgIG1fZnJlZXplV29ya2xpc3QuYWRkKGkpOworICAgICAgICAgICAgZWxz
ZQorICAgICAgICAgICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5hcHBlbmQoaSk7CisgICAgICAg
IH0KKyAgICB9CisKKyAgICB2b2lkIGFkZFRvU3BpbGwodW5zaWduZWQgdG9TcGlsbCkKKyAgICB7
CisgICAgICAgIGlmIChtX3Vuc3BpbGxhYmxlVG1wcy5jb250YWlucyh0b1NwaWxsKSkKKyAgICAg
ICAgICAgIHJldHVybjsKKworICAgICAgICBtX3NwaWxsV29ya2xpc3QuYWRkKHRvU3BpbGwpOwor
ICAgIH0KKworICAgIC8vIExvdy1kZWdyZWUgdmVydGV4IGNhbiBhbHdheXMgYmUgY29sb3JlZDog
anVzdCBwaWNrIGFueSBvZiB0aGUgY29sb3IgdGFrZW4gYnkgYW55CisgICAgLy8gb3RoZXIgYWRq
YWNlbnQgdmVyaWNlcy4KKyAgICAvLyBUaGUgIlNpbXBsaWZ5IiBwaGFzZSB0YWtlcyBhIGxvdy1k
ZWdyZWUgb3V0IG9mIHRoZSBpbnRlcmZlcmVuY2UgZ3JhcGggdG8gc2ltcGxpZnkgaXQuCisgICAg
dm9pZCBzaW1wbGlmeSgpCisgICAgeworICAgICAgICBJbmRleFR5cGUgbGFzdEluZGV4ID0gbV9z
aW1wbGlmeVdvcmtsaXN0LnRha2VMYXN0KCk7CisKKyAgICAgICAgQVNTRVJUKCFtX3NlbGVjdFN0
YWNrLmNvbnRhaW5zKGxhc3RJbmRleCkpOworICAgICAgICBBU1NFUlQoIW1faXNPblNlbGVjdFN0
YWNrLmdldChsYXN0SW5kZXgpKTsKKyAgICAgICAgbV9zZWxlY3RTdGFjay5hcHBlbmQobGFzdElu
ZGV4KTsKKyAgICAgICAgbV9pc09uU2VsZWN0U3RhY2sucXVpY2tTZXQobGFzdEluZGV4KTsKKwor
ICAgICAgICBmb3JFYWNoQWRqYWNlbnQobGFzdEluZGV4LCBbdGhpc10oSW5kZXhUeXBlIGFkamFj
ZW50VG1wSW5kZXgpIHsKKyAgICAgICAgICAgIGRlY3JlbWVudERlZ3JlZShhZGphY2VudFRtcElu
ZGV4KTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgdm9pZCBmcmVlemUoKQorICAgIHsKKyAg
ICAgICAgSW5kZXhUeXBlIHZpY3RpbUluZGV4ID0gbV9mcmVlemVXb3JrbGlzdC50YWtlQW55KCk7
CisgICAgICAgIEFTU0VSVF9XSVRIX01FU1NBR0UoZ2V0QWxpYXModmljdGltSW5kZXgpID09IHZp
Y3RpbUluZGV4LCAiY29hbGVzY2UoKSBzaG91bGQgbm90IGxlYXZlIGFsaWFzZWQgVG1wIGluIHRo
ZSB3b3JrbGlzdC4iKTsKKyAgICAgICAgbV9zaW1wbGlmeVdvcmtsaXN0LmFwcGVuZCh2aWN0aW1J
bmRleCk7CisgICAgICAgIGZyZWV6ZU1vdmVzKHZpY3RpbUluZGV4KTsKKyAgICB9CisKKyAgICB2
b2lkIGZyZWV6ZU1vdmVzKEluZGV4VHlwZSB0bXBJbmRleCkKKyAgICB7CisgICAgICAgIGZvckVh
Y2hOb2RlTW92ZXModG1wSW5kZXgsIFt0aGlzLCB0bXBJbmRleF0gKEluZGV4VHlwZSBtb3ZlSW5k
ZXgpIHsKKyAgICAgICAgICAgIGlmICghbV9hY3RpdmVNb3Zlcy5xdWlja0NsZWFyKG1vdmVJbmRl
eCkpCisgICAgICAgICAgICAgICAgbV93b3JrbGlzdE1vdmVzLnRha2VNb3ZlKG1vdmVJbmRleCk7
CisKKyAgICAgICAgICAgIGNvbnN0IE1vdmVPcGVyYW5kcyYgbW92ZU9wZXJhbmRzID0gbV9jb2Fs
ZXNjaW5nQ2FuZGlkYXRlc1ttb3ZlSW5kZXhdOworICAgICAgICAgICAgSW5kZXhUeXBlIHNyY1Rt
cEluZGV4ID0gbW92ZU9wZXJhbmRzLnNyY0luZGV4OworICAgICAgICAgICAgSW5kZXhUeXBlIGRz
dFRtcEluZGV4ID0gbW92ZU9wZXJhbmRzLmRzdEluZGV4OworCisgICAgICAgICAgICBJbmRleFR5
cGUgb3JpZ2luYWxPdGhlclRtcCA9IHNyY1RtcEluZGV4ICE9IHRtcEluZGV4ID8gc3JjVG1wSW5k
ZXggOiBkc3RUbXBJbmRleDsKKyAgICAgICAgICAgIEluZGV4VHlwZSBvdGhlclRtcEluZGV4ID0g
Z2V0QWxpYXMob3JpZ2luYWxPdGhlclRtcCk7CisgICAgICAgICAgICBpZiAobV9kZWdyZWVzW290
aGVyVG1wSW5kZXhdIDwgbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKSAmJiAhaXNNb3ZlUmVs
YXRlZChvdGhlclRtcEluZGV4KSkgeworICAgICAgICAgICAgICAgIGlmIChtX2ZyZWV6ZVdvcmts
aXN0LnJlbW92ZShvdGhlclRtcEluZGV4KSkKKyAgICAgICAgICAgICAgICAgICAgbV9zaW1wbGlm
eVdvcmtsaXN0LmFwcGVuZChvdGhlclRtcEluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
fSk7CisgICAgfQorCisgICAgdm9pZCBjb2FsZXNjZSgpCisgICAgeworICAgICAgICB1bnNpZ25l
ZCBtb3ZlSW5kZXggPSBtX3dvcmtsaXN0TW92ZXMudGFrZUxhc3RNb3ZlKCk7CisgICAgICAgIGNv
bnN0IE1vdmVPcGVyYW5kcyYgbW92ZU9wZXJhbmRzID0gbV9jb2FsZXNjaW5nQ2FuZGlkYXRlc1tt
b3ZlSW5kZXhdOworICAgICAgICBJbmRleFR5cGUgdSA9IGdldEFsaWFzKG1vdmVPcGVyYW5kcy5z
cmNJbmRleCk7CisgICAgICAgIEluZGV4VHlwZSB2ID0gZ2V0QWxpYXMobW92ZU9wZXJhbmRzLmRz
dEluZGV4KTsKKworICAgICAgICBpZiAoaXNQcmVjb2xvcmVkKHYpKQorICAgICAgICAgICAgc3Rk
Ojpzd2FwKHUsIHYpOworCisgICAgICAgIGlmICh0cmFjZURlYnVnKQorICAgICAgICAgICAgZGF0
YUxvZygiQ29hbGVzY2luZyBtb3ZlIGF0IGluZGV4ICIsIG1vdmVJbmRleCwgIiB1ID0gIiwgdSwg
IiB2ID0gIiwgdiwgIlxuIik7CisKKyAgICAgICAgaWYgKHUgPT0gdikgeworICAgICAgICAgICAg
YWRkV29ya0xpc3QodSk7CisKKyAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQorICAgICAgICAg
ICAgICAgIGRhdGFMb2coIiAgICBDb2FsZXNjZWRcbiIpOworICAgICAgICB9IGVsc2UgaWYgKGlz
UHJlY29sb3JlZCh2KQorICAgICAgICAgICAgfHwgbV9pbnRlcmZlcmVuY2VFZGdlcy5jb250YWlu
cyhJbnRlcmZlcmVuY2VFZGdlKHUsIHYpKQorICAgICAgICAgICAgfHwgKHUgPT0gbV9mcmFtZVBv
aW50ZXJJbmRleCAmJiBtX2ludGVyZmVyZXNXaXRoRnJhbWVQb2ludGVyLnF1aWNrR2V0KHYpKSkg
eworICAgICAgICAgICAgYWRkV29ya0xpc3QodSk7CisgICAgICAgICAgICBhZGRXb3JrTGlzdCh2
KTsKKworICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpCisgICAgICAgICAgICAgICAgZGF0YUxv
ZygiICAgIENvbnN0cmFpbmVkXG4iKTsKKyAgICAgICAgfSBlbHNlIGlmIChjYW5CZVNhZmVseUNv
YWxlc2NlZCh1LCB2KSkgeworICAgICAgICAgICAgY29tYmluZSh1LCB2KTsKKyAgICAgICAgICAg
IGFkZFdvcmtMaXN0KHUpOworICAgICAgICAgICAgbV9oYXNDb2FsZXNjZWROb25Ucml2aWFsTW92
ZSA9IHRydWU7CisKKyAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQorICAgICAgICAgICAgICAg
IGRhdGFMb2coIiAgICBTYWZlIENvYWxlc2NpbmdcbiIpOworICAgICAgICB9IGVsc2UgeworICAg
ICAgICAgICAgbV9hY3RpdmVNb3Zlcy5xdWlja1NldChtb3ZlSW5kZXgpOworCisgICAgICAgICAg
ICBpZiAodHJhY2VEZWJ1ZykKKyAgICAgICAgICAgICAgICBkYXRhTG9nKCIgICAgRmFpbGVkIGNv
YWxlc2NpbmcsIGFkZGVkIHRvIGFjdGl2ZSBtb3Zlcy5cbiIpOworICAgICAgICB9CisgICAgfQor
CisgICAgdm9pZCBhc3NpZ25Db2xvcnMoKQorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fc2ltcGxp
ZnlXb3JrbGlzdC5pc0VtcHR5KCkpOworICAgICAgICBBU1NFUlQobV93b3JrbGlzdE1vdmVzLmlz
RW1wdHkoKSk7CisgICAgICAgIEFTU0VSVChtX2ZyZWV6ZVdvcmtsaXN0LmlzRW1wdHkoKSk7Cisg
ICAgICAgIEFTU0VSVChtX3NwaWxsV29ya2xpc3QuaXNFbXB0eSgpKTsKKworICAgICAgICAvLyBS
ZWNsYWltIGFzIG11Y2ggbWVtb3J5IGFzIHBvc3NpYmxlLgorICAgICAgICBtX2ludGVyZmVyZW5j
ZUVkZ2VzLmNsZWFyKCk7CisgICAgICAgIG1fZGVncmVlcy5jbGVhcigpOworICAgICAgICBtX21v
dmVMaXN0LmNsZWFyKCk7CisgICAgICAgIG1fd29ya2xpc3RNb3Zlcy5jbGVhcigpOworICAgICAg
ICBtX3NpbXBsaWZ5V29ya2xpc3QuY2xlYXIoKTsKKyAgICAgICAgbV9zcGlsbFdvcmtsaXN0LmNs
ZWFyKCk7CisgICAgICAgIG1fZnJlZXplV29ya2xpc3QuY2xlYXIoKTsKKworICAgICAgICAvLyBU
cnkgdG8gY29sb3IgdGhlIFRtcCBvbiB0aGUgc3RhY2suCisgICAgICAgIG1fY29sb3JlZFRtcC5y
ZXNpemUobV9hZGphY2VuY3lMaXN0LnNpemUoKSk7CisKKyAgICAgICAgd2hpbGUgKCFtX3NlbGVj
dFN0YWNrLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdW5zaWduZWQgdG1wSW5kZXggPSBtX3Nl
bGVjdFN0YWNrLnRha2VMYXN0KCk7CisgICAgICAgICAgICBBU1NFUlQoIWlzUHJlY29sb3JlZCh0
bXBJbmRleCkpOworICAgICAgICAgICAgQVNTRVJUKCFtX2NvbG9yZWRUbXBbdG1wSW5kZXhdKTsK
KworICAgICAgICAgICAgUmVnaXN0ZXJTZXQgY29sb3JlZFJlZ2lzdGVyczsKKyAgICAgICAgICAg
IGZvciAoSW5kZXhUeXBlIGFkamFjZW50VG1wSW5kZXggOiBtX2FkamFjZW5jeUxpc3RbdG1wSW5k
ZXhdKSB7CisgICAgICAgICAgICAgICAgSW5kZXhUeXBlIGFsaWFzVG1wSW5kZXggPSBnZXRBbGlh
cyhhZGphY2VudFRtcEluZGV4KTsKKyAgICAgICAgICAgICAgICBSZWcgcmVnID0gbV9jb2xvcmVk
VG1wW2FsaWFzVG1wSW5kZXhdOworCisgICAgICAgICAgICAgICAgQVNTRVJUKCFpc1ByZWNvbG9y
ZWQoYWxpYXNUbXBJbmRleCkgfHwgKGlzUHJlY29sb3JlZChhbGlhc1RtcEluZGV4KSAmJiByZWcp
KTsKKworICAgICAgICAgICAgICAgIGlmIChyZWcpCisgICAgICAgICAgICAgICAgICAgIGNvbG9y
ZWRSZWdpc3RlcnMuc2V0KHJlZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wg
Y29sb3JBc3NpZ25lZCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChSZWcgcmVnIDogbV9yZWdz
SW5Qcmlvcml0eU9yZGVyKSB7CisgICAgICAgICAgICAgICAgaWYgKCFjb2xvcmVkUmVnaXN0ZXJz
LmdldChyZWcpKSB7CisgICAgICAgICAgICAgICAgICAgIG1fY29sb3JlZFRtcFt0bXBJbmRleF0g
PSByZWc7CisgICAgICAgICAgICAgICAgICAgIGNvbG9yQXNzaWduZWQgPSB0cnVlOworICAgICAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgIGlmICghY29sb3JBc3NpZ25lZCkKKyAgICAgICAgICAgICAgICBtX3NwaWxs
ZWRUbXBzLmFwcGVuZCh0bXBJbmRleCk7CisgICAgICAgIH0KKyAgICAgICAgbV9zZWxlY3RTdGFj
ay5jbGVhcigpOworCisgICAgICAgIGlmIChtX3NwaWxsZWRUbXBzLmlzRW1wdHkoKSkKKyAgICAg
ICAgICAgIG1fY29hbGVzY2VkVG1wc0F0U3BpbGwuY2xlYXIoKTsKKyAgICAgICAgZWxzZQorICAg
ICAgICAgICAgbV9jb2xvcmVkVG1wLmNsZWFyKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIHZv
aWQgaW5pdGlhbGl6ZURlZ3JlZXModW5zaWduZWQgdG1wQXJyYXlTaXplKQorICAgIHsKKyAgICAg
ICAgbV9kZWdyZWVzLnJlc2l6ZSh0bXBBcnJheVNpemUpOworCisgICAgICAgIC8vIEFsbCBwcmVj
b2xvcmVkIHJlZ2lzdGVycyBoYXZlICBhbiAiaW5maW5pdGUiIGRlZ3JlZS4KKyAgICAgICAgdW5z
aWduZWQgZmlyc3ROb25SZWdJbmRleCA9IG1fbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4ICsg
MTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGZpcnN0Tm9uUmVnSW5kZXg7ICsr
aSkKKyAgICAgICAgICAgIG1fZGVncmVlc1tpXSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWdu
ZWQ+OjptYXgoKTsKKworICAgICAgICBtZW1zZXQobV9kZWdyZWVzLmRhdGEoKSArIGZpcnN0Tm9u
UmVnSW5kZXgsIDAsICh0bXBBcnJheVNpemUgLSBmaXJzdE5vblJlZ0luZGV4KSAqIHNpemVvZih1
bnNpZ25lZCkpOworICAgIH0KKworICAgIHZvaWQgYWRkRWRnZURpc3RpbmN0KEluZGV4VHlwZSBh
LCBJbmRleFR5cGUgYikKKyAgICB7CisgICAgICAgIEFTU0VSVChhICE9IGIpOworICAgICAgICBp
ZiAobV9pbnRlcmZlcmVuY2VFZGdlcy5hZGQoSW50ZXJmZXJlbmNlRWRnZShhLCBiKSkuaXNOZXdF
bnRyeSkgeworICAgICAgICAgICAgaWYgKCFpc1ByZWNvbG9yZWQoYSkpIHsKKyAgICAgICAgICAg
ICAgICBBU1NFUlQoIW1fYWRqYWNlbmN5TGlzdFthXS5jb250YWlucyhiKSk7CisgICAgICAgICAg
ICAgICAgbV9hZGphY2VuY3lMaXN0W2FdLmFwcGVuZChiKTsKKyAgICAgICAgICAgICAgICBtX2Rl
Z3JlZXNbYV0rKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFpc1ByZWNvbG9y
ZWQoYikpIHsKKyAgICAgICAgICAgICAgICBBU1NFUlQoIW1fYWRqYWNlbmN5TGlzdFtiXS5jb250
YWlucyhhKSk7CisgICAgICAgICAgICAgICAgbV9hZGphY2VuY3lMaXN0W2JdLmFwcGVuZChhKTsK
KyAgICAgICAgICAgICAgICBtX2RlZ3JlZXNbYl0rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
fQorICAgIH0KKworICAgIHZvaWQgZGVjcmVtZW50RGVncmVlKEluZGV4VHlwZSB0bXBJbmRleCkK
KyAgICB7CisgICAgICAgIEFTU0VSVChtX2RlZ3JlZXNbdG1wSW5kZXhdKTsKKworICAgICAgICB1
bnNpZ25lZCBvbGREZWdyZWUgPSBtX2RlZ3JlZXNbdG1wSW5kZXhdLS07CisgICAgICAgIGlmIChv
bGREZWdyZWUgPT0gbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKSkgeworICAgICAgICAgICAg
ZW5hYmxlTW92ZXNPblZhbHVlQW5kQWRqYWNlbnRzKHRtcEluZGV4KTsKKyAgICAgICAgICAgIG1f
c3BpbGxXb3JrbGlzdC5yZW1vdmUodG1wSW5kZXgpOworICAgICAgICAgICAgaWYgKGlzTW92ZVJl
bGF0ZWQodG1wSW5kZXgpKQorICAgICAgICAgICAgICAgIG1fZnJlZXplV29ya2xpc3QuYWRkKHRt
cEluZGV4KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtX3NpbXBsaWZ5V29y
a2xpc3QuYXBwZW5kKHRtcEluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgYm9vbCBh
ZGRFZGdlRGlzdGluY3RXaXRob3V0RGVncmVlQ2hhbmdlKEluZGV4VHlwZSBhLCBJbmRleFR5cGUg
YikKKyAgICB7CisgICAgICAgIEFTU0VSVChhICE9IGIpOworICAgICAgICBpZiAobV9pbnRlcmZl
cmVuY2VFZGdlcy5hZGQoSW50ZXJmZXJlbmNlRWRnZShhLCBiKSkuaXNOZXdFbnRyeSkgeworICAg
ICAgICAgICAgaWYgKCFpc1ByZWNvbG9yZWQoYSkpIHsKKyAgICAgICAgICAgICAgICBBU1NFUlQo
IW1fYWRqYWNlbmN5TGlzdFthXS5jb250YWlucyhiKSk7CisgICAgICAgICAgICAgICAgbV9hZGph
Y2VuY3lMaXN0W2FdLmFwcGVuZChiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYg
KCFpc1ByZWNvbG9yZWQoYikpIHsKKyAgICAgICAgICAgICAgICBBU1NFUlQoIW1fYWRqYWNlbmN5
TGlzdFtiXS5jb250YWlucyhhKSk7CisgICAgICAgICAgICAgICAgbV9hZGphY2VuY3lMaXN0W2Jd
LmFwcGVuZChhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAg
ICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIGlzTW92ZVJl
bGF0ZWQoSW5kZXhUeXBlIHRtcEluZGV4KQorICAgIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBt
b3ZlSW5kZXggOiBtX21vdmVMaXN0W3RtcEluZGV4XSkgeworICAgICAgICAgICAgaWYgKG1fYWN0
aXZlTW92ZXMucXVpY2tHZXQobW92ZUluZGV4KSB8fCBtX3dvcmtsaXN0TW92ZXMuY29udGFpbnMo
bW92ZUluZGV4KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rp
b24+CisgICAgdm9pZCBmb3JFYWNoQWRqYWNlbnQoSW5kZXhUeXBlIHRtcEluZGV4LCBGdW5jdGlv
biBmdW5jdGlvbikKKyAgICB7CisgICAgICAgIGZvciAoSW5kZXhUeXBlIGFkamFjZW50VG1wSW5k
ZXggOiBtX2FkamFjZW5jeUxpc3RbdG1wSW5kZXhdKSB7CisgICAgICAgICAgICBpZiAoIWhhc0Jl
ZW5TaW1wbGlmaWVkKGFkamFjZW50VG1wSW5kZXgpKQorICAgICAgICAgICAgICAgIGZ1bmN0aW9u
KGFkamFjZW50VG1wSW5kZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBoYXNCZWVu
U2ltcGxpZmllZChJbmRleFR5cGUgdG1wSW5kZXgpCisgICAgeworICAgICAgICByZXR1cm4gbV9p
c09uU2VsZWN0U3RhY2sucXVpY2tHZXQodG1wSW5kZXgpIHx8ICEhbV9jb2FsZXNjZWRUbXBzW3Rt
cEluZGV4XTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdGlvbj4KKyAgICB2
b2lkIGZvckVhY2hOb2RlTW92ZXMoSW5kZXhUeXBlIHRtcEluZGV4LCBGdW5jdGlvbiBmdW5jdGlv
bikKKyAgICB7CisgICAgICAgIGZvciAodW5zaWduZWQgbW92ZUluZGV4IDogbV9tb3ZlTGlzdFt0
bXBJbmRleF0pIHsKKyAgICAgICAgICAgIGlmIChtX2FjdGl2ZU1vdmVzLnF1aWNrR2V0KG1vdmVJ
bmRleCkgfHwgbV93b3JrbGlzdE1vdmVzLmNvbnRhaW5zKG1vdmVJbmRleCkpCisgICAgICAgICAg
ICAgICAgZnVuY3Rpb24obW92ZUluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQg
ZW5hYmxlTW92ZXNPblZhbHVlKEluZGV4VHlwZSB0bXBJbmRleCkKKyAgICB7CisgICAgICAgIGZv
ciAodW5zaWduZWQgbW92ZUluZGV4IDogbV9tb3ZlTGlzdFt0bXBJbmRleF0pIHsKKyAgICAgICAg
ICAgIGlmIChtX2FjdGl2ZU1vdmVzLnF1aWNrQ2xlYXIobW92ZUluZGV4KSkKKyAgICAgICAgICAg
ICAgICBtX3dvcmtsaXN0TW92ZXMucmV0dXJuTW92ZShtb3ZlSW5kZXgpOworICAgICAgICB9Cisg
ICAgfQorCisgICAgdm9pZCBlbmFibGVNb3Zlc09uVmFsdWVBbmRBZGphY2VudHMoSW5kZXhUeXBl
IHRtcEluZGV4KQorICAgIHsKKyAgICAgICAgZW5hYmxlTW92ZXNPblZhbHVlKHRtcEluZGV4KTsK
KworICAgICAgICBmb3JFYWNoQWRqYWNlbnQodG1wSW5kZXgsIFt0aGlzXSAoSW5kZXhUeXBlIGFk
amFjZW50VG1wSW5kZXgpIHsKKyAgICAgICAgICAgIGVuYWJsZU1vdmVzT25WYWx1ZShhZGphY2Vu
dFRtcEluZGV4KTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgYm9vbCBpc1ByZWNvbG9yZWQo
SW5kZXhUeXBlIHRtcEluZGV4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRtcEluZGV4IDw9IG1f
bGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4OworICAgIH0KKworICAgIHZvaWQgYWRkV29ya0xp
c3QoSW5kZXhUeXBlIHRtcEluZGV4KQorICAgIHsKKyAgICAgICAgaWYgKCFpc1ByZWNvbG9yZWQo
dG1wSW5kZXgpICYmIG1fZGVncmVlc1t0bXBJbmRleF0gPCBtX3JlZ3NJblByaW9yaXR5T3JkZXIu
c2l6ZSgpICYmICFpc01vdmVSZWxhdGVkKHRtcEluZGV4KSkgeworICAgICAgICAgICAgbV9mcmVl
emVXb3JrbGlzdC5yZW1vdmUodG1wSW5kZXgpOworICAgICAgICAgICAgbV9zaW1wbGlmeVdvcmts
aXN0LmFwcGVuZCh0bXBJbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGNvbWJp
bmUoSW5kZXhUeXBlIHUsIEluZGV4VHlwZSB2KQorICAgIHsKKyAgICAgICAgaWYgKCFtX2ZyZWV6
ZVdvcmtsaXN0LnJlbW92ZSh2KSkKKyAgICAgICAgICAgIG1fc3BpbGxXb3JrbGlzdC5yZW1vdmUo
dik7CisKKyAgICAgICAgQVNTRVJUKCFtX2NvYWxlc2NlZFRtcHNbdl0pOworICAgICAgICBtX2Nv
YWxlc2NlZFRtcHNbdl0gPSB1OworCisgICAgICAgIGF1dG8mIHZNb3ZlcyA9IG1fbW92ZUxpc3Rb
dl07CisgICAgICAgIG1fbW92ZUxpc3RbdV0uYWRkKHZNb3Zlcy5iZWdpbigpLCB2TW92ZXMuZW5k
KCkpOworCisgICAgICAgIGZvckVhY2hBZGphY2VudCh2LCBbdGhpcywgdV0gKEluZGV4VHlwZSBh
ZGphY2VudFRtcEluZGV4KSB7CisgICAgICAgICAgICBpZiAoYWRkRWRnZURpc3RpbmN0V2l0aG91
dERlZ3JlZUNoYW5nZShhZGphY2VudFRtcEluZGV4LCB1KSkgeworICAgICAgICAgICAgICAgIC8v
IElmIHdlIGFkZGVkIGEgbmV3IGVkZ2UgYmV0d2VlbiB0aGUgYWRqYWNlbnRUbXAgYW5kIHUsIGl0
IHJlcGxhY2VzIHRoZSBlZGdlCisgICAgICAgICAgICAgICAgLy8gdGhhdCBleGlzdGVkIHdpdGgg
di4KKyAgICAgICAgICAgICAgICAvLyBUaGUgZGVncmVlIG9mIGFkamFjZW50VG1wIHJlbWFpbnMg
dGhlIHNhbWUgc2luY2UgdGhlIGVkZ2UganVzdCBjaGFuZ2VkIGZyb20gdSB0byB2LgorICAgICAg
ICAgICAgICAgIC8vIEFsbCB3ZSBuZWVkIHRvIGRvIGlzIHVwZGF0ZSB0aGUgZGVncmVlIG9mIHUu
CisgICAgICAgICAgICAgICAgaWYgKCFpc1ByZWNvbG9yZWQodSkpCisgICAgICAgICAgICAgICAg
ICAgIG1fZGVncmVlc1t1XSsrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAg
ICAvLyBJZiB3ZSBhbHJlYWR5IGhhZCBhbiBlZGdlIGJldHdlZW4gdGhlIGFkamFjZW50VG1wIGFu
ZCB1LCB0aGUgZGVncmVlIG9mIHUKKyAgICAgICAgICAgICAgICAvLyBpcyBhbHJlYWR5IGNvcnJl
Y3QuIFRoZSBkZWdyZWUgb2YgdGhlIGFkamFjZW50VG1wIGRlY3JlYXNlcyBzaW5jZSB0aGUgZWRn
ZQorICAgICAgICAgICAgICAgIC8vIHdpdGggdiBpcyBubyBsb25nZXIgcmVsZXZhbnQgKHdlIGNh
biB0aGluayBvZiBpdCBhcyBtZXJnZWQgd2l0aCB0aGUgZWRnZSB3aXRoIHUpLgorICAgICAgICAg
ICAgICAgIGRlY3JlbWVudERlZ3JlZShhZGphY2VudFRtcEluZGV4KTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgfSk7CisKKyAgICAgICAgaWYgKG1fZnJhbWVQb2ludGVySW5kZXggJiYgbV9pbnRl
cmZlcmVzV2l0aEZyYW1lUG9pbnRlci5xdWlja0dldCh2KSkKKyAgICAgICAgICAgIG1faW50ZXJm
ZXJlc1dpdGhGcmFtZVBvaW50ZXIucXVpY2tTZXQodSk7CisKKyAgICAgICAgaWYgKG1fZGVncmVl
c1t1XSA+PSBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpICYmIG1fZnJlZXplV29ya2xpc3Qu
cmVtb3ZlKHUpKQorICAgICAgICAgICAgYWRkVG9TcGlsbCh1KTsKKyAgICB9CisKKyAgICBib29s
IGNhbkJlU2FmZWx5Q29hbGVzY2VkKEluZGV4VHlwZSB1LCBJbmRleFR5cGUgdikKKyAgICB7Cisg
ICAgICAgIEFTU0VSVCghaXNQcmVjb2xvcmVkKHYpKTsKKyAgICAgICAgaWYgKGlzUHJlY29sb3Jl
ZCh1KSkKKyAgICAgICAgICAgIHJldHVybiBwcmVjb2xvcmVkQ29hbGVzY2luZ0hldXJpc3RpYyh1
LCB2KTsKKyAgICAgICAgcmV0dXJuIGNvbnNlcnZhdGl2ZUhldXJpc3RpYyh1LCB2KTsKKyAgICB9
CisKKyAgICBib29sIGNvbnNlcnZhdGl2ZUhldXJpc3RpYyhJbmRleFR5cGUgdSwgSW5kZXhUeXBl
IHYpCisgICAgeworICAgICAgICAvLyBUaGlzIGlzIHVzaW5nIHRoZSBCcmlnZ3MnIGNvbnNlcnZh
dGl2ZSBjb2FsZXNjaW5nIHJ1bGU6CisgICAgICAgIC8vIElmIHRoZSBudW1iZXIgb2YgY29tYmlu
ZWQgYWRqYWNlbnQgbm9kZSB3aXRoIGEgZGVncmVlID49IEsgaXMgbGVzcyB0aGFuIEssCisgICAg
ICAgIC8vIGl0IGlzIHNhZmUgdG8gY29tYmluZSB0aGUgdHdvIG5vZGVzLiBUaGUgcmVhc29uIGlz
IHRoYXQgd2Uga25vdyB0aGF0IGlmIHRoZSBncmFwaAorICAgICAgICAvLyBpcyBjb2xvcmFibGUs
IHdlIGhhdmUgZmV3ZXIgdGhhbiBLIGFkamFjZW50cyB3aXRoIGhpZ2ggb3JkZXIgYW5kIHRoZXJl
IGlzIGEgY29sb3IKKyAgICAgICAgLy8gZm9yIHRoZSBjdXJyZW50IG5vZGUuCisgICAgICAgIEFT
U0VSVCh1ICE9IHYpOworICAgICAgICBBU1NFUlQoIWlzUHJlY29sb3JlZCh1KSk7CisgICAgICAg
IEFTU0VSVCghaXNQcmVjb2xvcmVkKHYpKTsKKworICAgICAgICBjb25zdCBhdXRvJiBhZGphY2Vu
dHNPZlUgPSBtX2FkamFjZW5jeUxpc3RbdV07CisgICAgICAgIGNvbnN0IGF1dG8mIGFkamFjZW50
c09mViA9IG1fYWRqYWNlbmN5TGlzdFt2XTsKKworICAgICAgICBpZiAoYWRqYWNlbnRzT2ZVLnNp
emUoKSArIGFkamFjZW50c09mVi5zaXplKCkgPCBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgp
KSB7CisgICAgICAgICAgICAvLyBTaG9ydGN1dDogaWYgdGhlIHRvdGFsIG51bWJlciBvZiBhZGph
Y2VudHMgaXMgbGVzcyB0aGFuIHRoZSBudW1iZXIgb2YgcmVnaXN0ZXIsIHRoZSBjb25kaXRpb24g
aXMgYWx3YXlzIG1ldC4KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAg
ICAgICAgSGFzaFNldDxJbmRleFR5cGU+IGhpZ2hPcmRlckFkamFjZW50czsKKworICAgICAgICBm
b3IgKEluZGV4VHlwZSBhZGphY2VudFRtcEluZGV4IDogYWRqYWNlbnRzT2ZVKSB7CisgICAgICAg
ICAgICBBU1NFUlQoYWRqYWNlbnRUbXBJbmRleCAhPSB2KTsKKyAgICAgICAgICAgIEFTU0VSVChh
ZGphY2VudFRtcEluZGV4ICE9IHUpOworICAgICAgICAgICAgaWYgKCFoYXNCZWVuU2ltcGxpZmll
ZChhZGphY2VudFRtcEluZGV4KSAmJiBtX2RlZ3JlZXNbYWRqYWNlbnRUbXBJbmRleF0gPj0gbV9y
ZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKSkgeworICAgICAgICAgICAgICAgIGF1dG8gYWRkUmVz
dWx0ID0gaGlnaE9yZGVyQWRqYWNlbnRzLmFkZChhZGphY2VudFRtcEluZGV4KTsKKyAgICAgICAg
ICAgICAgICBpZiAoYWRkUmVzdWx0LmlzTmV3RW50cnkgJiYgaGlnaE9yZGVyQWRqYWNlbnRzLnNp
emUoKSA+PSBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpKQorICAgICAgICAgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChJ
bmRleFR5cGUgYWRqYWNlbnRUbXBJbmRleCA6IGFkamFjZW50c09mVikgeworICAgICAgICAgICAg
QVNTRVJUKGFkamFjZW50VG1wSW5kZXggIT0gdSk7CisgICAgICAgICAgICBBU1NFUlQoYWRqYWNl
bnRUbXBJbmRleCAhPSB2KTsKKyAgICAgICAgICAgIGlmICghaGFzQmVlblNpbXBsaWZpZWQoYWRq
YWNlbnRUbXBJbmRleCkgJiYgbV9kZWdyZWVzW2FkamFjZW50VG1wSW5kZXhdID49IG1fcmVnc0lu
UHJpb3JpdHlPcmRlci5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGFkZFJlc3VsdCA9
IGhpZ2hPcmRlckFkamFjZW50cy5hZGQoYWRqYWNlbnRUbXBJbmRleCk7CisgICAgICAgICAgICAg
ICAgaWYgKGFkZFJlc3VsdC5pc05ld0VudHJ5ICYmIGhpZ2hPcmRlckFkamFjZW50cy5zaXplKCkg
Pj0gbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQVNTRVJUKGhp
Z2hPcmRlckFkamFjZW50cy5zaXplKCkgPCBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpKTsK
KyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCBwcmVjb2xvcmVkQ29hbGVz
Y2luZ0hldXJpc3RpYyhJbmRleFR5cGUgdSwgSW5kZXhUeXBlIHYpCisgICAgeworICAgICAgICBp
ZiAodHJhY2VEZWJ1ZykKKyAgICAgICAgICAgIGRhdGFMb2coIiAgICBDaGVja2luZyBwcmVjb2xv
cmVkQ29hbGVzY2luZ0hldXJpc3RpY1xuIik7CisgICAgICAgIEFTU0VSVChpc1ByZWNvbG9yZWQo
dSkpOworICAgICAgICBBU1NFUlQoIWlzUHJlY29sb3JlZCh2KSk7CisgICAgICAgIAorICAgICAg
ICAvLyBJZiB1IGlzIGEgcGlubmVkIHJlZ2lzdGVyIHRoZW4gaXQncyBhbHdheXMgc2FmZSB0byBj
b2FsZXNjZS4gTm90ZSB0aGF0IHdoZW4gd2UgY2FsbCB0aGlzLAorICAgICAgICAvLyB3ZSBoYXZl
IGFscmVhZHkgcHJvdmVkIHRoYXQgdGhlcmUgaXMgbm8gaW50ZXJmZXJlbmNlIGJldHdlZW4gdSBh
bmQgdi4KKyAgICAgICAgaWYgKCFtX211dGFibGVSZWdzLmdldChtX2NvbG9yZWRUbXBbdV0pKQor
ICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgLy8gSWYgYW55IGFkamFjZW50IG9m
IHRoZSBub24tY29sb3JlZCBub2RlIGlzIG5vdCBhbiBhZGphY2VudCBvZiB0aGUgY29sb3JlZCBu
b2RlIEFORCBoYXMgYSBkZWdyZWUgPj0gSworICAgICAgICAvLyB0aGVyZSBpcyBhIHJpc2sgdGhh
dCB0aGlzIG5vZGUgbmVlZHMgdG8gaGF2ZSB0aGUgc2FtZSBjb2xvciBhcyBvdXIgcHJlY29sb3Jl
ZCBub2RlLiBJZiB3ZSBjb2FsZXNjZSBzdWNoCisgICAgICAgIC8vIG1vdmUsIHdlIG1heSBjcmVh
dGUgYW4gdW5jb2xvcmFibGUgZ3JhcGguCisgICAgICAgIGNvbnN0IGF1dG8mIGFkamFjZW50c09m
ViA9IG1fYWRqYWNlbmN5TGlzdFt2XTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBhZGphY2VudFRt
cEluZGV4IDogYWRqYWNlbnRzT2ZWKSB7CisgICAgICAgICAgICBpZiAoIWlzUHJlY29sb3JlZChh
ZGphY2VudFRtcEluZGV4KQorICAgICAgICAgICAgICAgICYmICFoYXNCZWVuU2ltcGxpZmllZChh
ZGphY2VudFRtcEluZGV4KQorICAgICAgICAgICAgICAgICYmIG1fZGVncmVlc1thZGphY2VudFRt
cEluZGV4XSA+PSBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpCisgICAgICAgICAgICAgICAg
JiYgIW1faW50ZXJmZXJlbmNlRWRnZXMuY29udGFpbnMoSW50ZXJmZXJlbmNlRWRnZSh1LCBhZGph
Y2VudFRtcEluZGV4KSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9
CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworcHJvdGVjdGVkOgorI2lmIFBMQVRGT1JN
KENPQ09BKQorI3ByYWdtYSBtYXJrIC0KKyNlbmRpZgorCisgICAgLy8gSW50ZXJmZXJlbmNlIGVk
Z2VzIGFyZSBub3QgZGlyZWN0ZWQuIEFuIGVkZ2UgYmV0d2VlbiBhbnkgdHdvIFRtcHMgaXMgcmVw
cmVzZW50ZWQKKyAgICAvLyBieSB0aGUgY29uY2F0ZW5hdGVkIHZhbHVlcyBvZiB0aGUgc21hbGxl
c3QgVG1wIGZvbGxvd2VkIGJ5IHRoZSBiaWdnZXIgVG1wLgorICAgIGNsYXNzIEludGVyZmVyZW5j
ZUVkZ2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgSW50ZXJmZXJlbmNlRWRnZSgpCisgICAgICAg
IHsKKyAgICAgICAgfQorCisgICAgICAgIEludGVyZmVyZW5jZUVkZ2UoSW5kZXhUeXBlIGEsIElu
ZGV4VHlwZSBiKQorICAgICAgICB7CisgICAgICAgICAgICBBU1NFUlQoYSk7CisgICAgICAgICAg
ICBBU1NFUlQoYik7CisgICAgICAgICAgICBBU1NFUlRfV0lUSF9NRVNTQUdFKGEgIT0gYiwgIkEg
VG1wIGNhbiBuZXZlciBpbnRlcmZlcmUgd2l0aCBpdHNlbGYuIERvaW5nIHNvIHdvdWxkIGZvcmNl
IGl0IHRvIGJlIHRoZSBzdXBlcnBvc2l0aW9uIG9mIHR3byByZWdpc3RlcnMuIik7CisKKyAgICAg
ICAgICAgIGlmIChiIDwgYSkKKyAgICAgICAgICAgICAgICBzdGQ6OnN3YXAoYSwgYik7CisgICAg
ICAgICAgICBtX3ZhbHVlID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGEpIDw8IDMyIHwgYjsKKyAg
ICAgICAgfQorCisgICAgICAgIEludGVyZmVyZW5jZUVkZ2UoV1RGOjpIYXNoVGFibGVEZWxldGVk
VmFsdWVUeXBlKQorICAgICAgICAgICAgOiBtX3ZhbHVlKHN0ZDo6bnVtZXJpY19saW1pdHM8dWlu
dDY0X3Q+OjptYXgoKSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgSW5kZXhUeXBl
IGZpcnN0KCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1fdmFsdWUgPj4g
MzIgJiAweGZmZmZmZmZmOworICAgICAgICB9CisKKyAgICAgICAgSW5kZXhUeXBlIHNlY29uZCgp
IGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtX3ZhbHVlICYgMHhmZmZmZmZm
ZjsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJbnRlcmZlcmVu
Y2VFZGdlIG90aGVyKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbV92YWx1
ZSA9PSBvdGhlci5tX3ZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBpc0hhc2hUYWJs
ZURlbGV0ZWRWYWx1ZSgpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAqdGhp
cyA9PSBJbnRlcmZlcmVuY2VFZGdlKFdURjo6SGFzaFRhYmxlRGVsZXRlZFZhbHVlKTsKKyAgICAg
ICAgfQorCisgICAgICAgIHVuc2lnbmVkIGhhc2goKSBjb25zdAorICAgICAgICB7CisgICAgICAg
ICAgICByZXR1cm4gV1RGOjpJbnRIYXNoPHVpbnQ2NF90Pjo6aGFzaChtX3ZhbHVlKTsKKyAgICAg
ICAgfQorCisgICAgICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAorICAgICAg
ICB7CisgICAgICAgICAgICBvdXQucHJpbnQoZmlyc3QoKSwgIjw9PiIsIHNlY29uZCgpKTsKKyAg
ICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgdWludDY0X3QgbV92YWx1ZSB7IDAgfTsK
KyAgICB9OworCisgICAgc3RydWN0IEludGVyZmVyZW5jZUVkZ2VIYXNoIHsKKyAgICAgICAgc3Rh
dGljIHVuc2lnbmVkIGhhc2goY29uc3QgSW50ZXJmZXJlbmNlRWRnZSYga2V5KSB7IHJldHVybiBr
ZXkuaGFzaCgpOyB9CisgICAgICAgIHN0YXRpYyBib29sIGVxdWFsKGNvbnN0IEludGVyZmVyZW5j
ZUVkZ2UmIGEsIGNvbnN0IEludGVyZmVyZW5jZUVkZ2UmIGIpIHsgcmV0dXJuIGEgPT0gYjsgfQor
ICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBzYWZlVG9Db21wYXJlVG9FbXB0eU9yRGVsZXRlZCA9
IHRydWU7CisgICAgfTsKKyAgICB0eXBlZGVmIFNpbXBsZUNsYXNzSGFzaFRyYWl0czxJbnRlcmZl
cmVuY2VFZGdlPiBJbnRlcmZlcmVuY2VFZGdlSGFzaFRyYWl0czsKKworICAgIGNvbnN0IFZlY3Rv
cjxSZWc+JiBtX3JlZ3NJblByaW9yaXR5T3JkZXI7CisgICAgUmVnaXN0ZXJTZXQgbV9tdXRhYmxl
UmVnczsKKyAgICBJbmRleFR5cGUgbV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXggeyAwIH07
CisKKyAgICAvLyBUaGUgaW50ZXJmZXJlbmNlIGdyYXBoLgorICAgIEhhc2hTZXQ8SW50ZXJmZXJl
bmNlRWRnZSwgSW50ZXJmZXJlbmNlRWRnZUhhc2gsIEludGVyZmVyZW5jZUVkZ2VIYXNoVHJhaXRz
PiBtX2ludGVyZmVyZW5jZUVkZ2VzOworICAgIFZlY3RvcjxWZWN0b3I8SW5kZXhUeXBlLCAwLCBV
bnNhZmVWZWN0b3JPdmVyZmxvdywgND4sIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX2FkamFj
ZW5jeUxpc3Q7CisgICAgVmVjdG9yPEluZGV4VHlwZSwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+
IG1fZGVncmVlczsKKworICAgIC8vIEluc3RlYWQgb2Yga2VlcGluZyB0cmFjayBvZiB0aGUgbW92
ZSBpbnN0cnVjdGlvbnMsIHdlIGp1c3Qga2VlcCB0aGVpciBvcGVyYW5kcyBhcm91bmQgYW5kIHVz
ZSB0aGUgaW5kZXgKKyAgICAvLyBpbiB0aGUgdmVjdG9yIGFzIHRoZSAiaWRlbnRpZmllciIgZm9y
IHRoZSBtb3ZlLgorICAgIHN0cnVjdCBNb3ZlT3BlcmFuZHMgeworICAgICAgICBJbmRleFR5cGUg
c3JjSW5kZXg7CisgICAgICAgIEluZGV4VHlwZSBkc3RJbmRleDsKKyAgICB9OworICAgIFZlY3Rv
cjxNb3ZlT3BlcmFuZHMsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX2NvYWxlc2NpbmdDYW5k
aWRhdGVzOworCisgICAgLy8gTGlzdCBvZiBldmVyeSBtb3ZlIGluc3RydWN0aW9uIGFzc29jaWF0
ZWQgd2l0aCBhIFRtcC4KKyAgICBWZWN0b3I8SGFzaFNldDxJbmRleFR5cGUsIHR5cGVuYW1lIERl
ZmF1bHRIYXNoPEluZGV4VHlwZT46Okhhc2gsIFdURjo6VW5zaWduZWRXaXRoWmVyb0tleUhhc2hU
cmFpdHM8SW5kZXhUeXBlPj4+IG1fbW92ZUxpc3Q7CisKKyAgICAvLyBDb2xvcnMuCisgICAgVmVj
dG9yPFJlZywgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fY29sb3JlZFRtcDsKKyAgICBWZWN0
b3I8SW5kZXhUeXBlPiBtX3NwaWxsZWRUbXBzOworCisgICAgLy8gVmFsdWVzIHRoYXQgaGF2ZSBi
ZWVuIGNvYWxlc2NlZCB3aXRoIGFuIG90aGVyIHZhbHVlLgorICAgIFZlY3RvcjxJbmRleFR5cGUs
IDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX2NvYWxlc2NlZFRtcHM7CisKKyAgICAvLyBUaGUg
c3RhY2sgb2YgVG1wIHJlbW92ZWQgZnJvbSB0aGUgZ3JhcGggYW5kIHJlYWR5IGZvciBjb2xvcmlu
Zy4KKyAgICBCaXRWZWN0b3IgbV9pc09uU2VsZWN0U3RhY2s7CisgICAgVmVjdG9yPEluZGV4VHlw
ZT4gbV9zZWxlY3RTdGFjazsKKworICAgIEluZGV4VHlwZSBtX2ZyYW1lUG9pbnRlckluZGV4IHsg
MCB9OworICAgIEJpdFZlY3RvciBtX2ludGVyZmVyZXNXaXRoRnJhbWVQb2ludGVyOworCisgICAg
c3RydWN0IE9yZGVyZWRNb3ZlU2V0IHsKKyAgICAgICAgdW5zaWduZWQgYWRkTW92ZSgpCisgICAg
ICAgIHsKKyAgICAgICAgICAgIEFTU0VSVChtX2xvd1ByaW9yaXR5TW92ZUxpc3QuaXNFbXB0eSgp
KTsKKyAgICAgICAgICAgIEFTU0VSVCghbV9maXJzdExvd1ByaW9yaXR5TW92ZUluZGV4KTsKKwor
ICAgICAgICAgICAgdW5zaWduZWQgbmV4dEluZGV4ID0gbV9wb3NpdGlvbkluTW92ZUxpc3Quc2l6
ZSgpOworICAgICAgICAgICAgdW5zaWduZWQgcG9zaXRpb24gPSBtX21vdmVMaXN0LnNpemUoKTsK
KyAgICAgICAgICAgIG1fbW92ZUxpc3QuYXBwZW5kKG5leHRJbmRleCk7CisgICAgICAgICAgICBt
X3Bvc2l0aW9uSW5Nb3ZlTGlzdC5hcHBlbmQocG9zaXRpb24pOworICAgICAgICAgICAgcmV0dXJu
IG5leHRJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc3RhcnRBZGRpbmdMb3dQcmlv
cml0eU1vdmVzKCkKKyAgICAgICAgeworICAgICAgICAgICAgQVNTRVJUKG1fbG93UHJpb3JpdHlN
b3ZlTGlzdC5pc0VtcHR5KCkpOworICAgICAgICAgICAgbV9maXJzdExvd1ByaW9yaXR5TW92ZUlu
ZGV4ID0gbV9tb3ZlTGlzdC5zaXplKCk7CisgICAgICAgIH0KKworICAgICAgICB1bnNpZ25lZCBh
ZGRMb3dQcmlvcml0eU1vdmUoKQorICAgICAgICB7CisgICAgICAgICAgICBBU1NFUlQobV9maXJz
dExvd1ByaW9yaXR5TW92ZUluZGV4ID09IG1fbW92ZUxpc3Quc2l6ZSgpKTsKKworICAgICAgICAg
ICAgdW5zaWduZWQgbmV4dEluZGV4ID0gbV9wb3NpdGlvbkluTW92ZUxpc3Quc2l6ZSgpOworICAg
ICAgICAgICAgdW5zaWduZWQgcG9zaXRpb24gPSBtX2xvd1ByaW9yaXR5TW92ZUxpc3Quc2l6ZSgp
OworICAgICAgICAgICAgbV9sb3dQcmlvcml0eU1vdmVMaXN0LmFwcGVuZChuZXh0SW5kZXgpOwor
ICAgICAgICAgICAgbV9wb3NpdGlvbkluTW92ZUxpc3QuYXBwZW5kKHBvc2l0aW9uKTsKKworICAg
ICAgICAgICAgQVNTRVJUKG5leHRJbmRleCA+PSBtX2ZpcnN0TG93UHJpb3JpdHlNb3ZlSW5kZXgp
OworCisgICAgICAgICAgICByZXR1cm4gbmV4dEluZGV4OworICAgICAgICB9CisKKyAgICAgICAg
Ym9vbCBpc0VtcHR5KCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1fbW92
ZUxpc3QuaXNFbXB0eSgpICYmIG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5pc0VtcHR5KCk7CisgICAg
ICAgIH0KKworICAgICAgICBib29sIGNvbnRhaW5zKHVuc2lnbmVkIGluZGV4KQorICAgICAgICB7
CisgICAgICAgICAgICByZXR1cm4gbV9wb3NpdGlvbkluTW92ZUxpc3RbaW5kZXhdICE9IHN0ZDo6
bnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZv
aWQgdGFrZU1vdmUodW5zaWduZWQgbW92ZUluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICB1
bnNpZ25lZCBwb3NpdGlvbkluTW92ZUxpc3QgPSBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdFttb3ZlSW5k
ZXhdOworICAgICAgICAgICAgaWYgKHBvc2l0aW9uSW5Nb3ZlTGlzdCA9PSBzdGQ6Om51bWVyaWNf
bGltaXRzPHVuc2lnbmVkPjo6bWF4KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAg
ICAgICAgICBpZiAobW92ZUluZGV4IDwgbV9maXJzdExvd1ByaW9yaXR5TW92ZUluZGV4KSB7Cisg
ICAgICAgICAgICAgICAgQVNTRVJUKG1fbW92ZUxpc3RbcG9zaXRpb25Jbk1vdmVMaXN0XSA9PSBt
b3ZlSW5kZXgpOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxhc3RJbmRleCA9IG1fbW92ZUxp
c3QubGFzdCgpOworICAgICAgICAgICAgICAgIG1fcG9zaXRpb25Jbk1vdmVMaXN0W2xhc3RJbmRl
eF0gPSBwb3NpdGlvbkluTW92ZUxpc3Q7CisgICAgICAgICAgICAgICAgbV9tb3ZlTGlzdFtwb3Np
dGlvbkluTW92ZUxpc3RdID0gbGFzdEluZGV4OworICAgICAgICAgICAgICAgIG1fbW92ZUxpc3Qu
cmVtb3ZlTGFzdCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBU1NF
UlQobV9sb3dQcmlvcml0eU1vdmVMaXN0W3Bvc2l0aW9uSW5Nb3ZlTGlzdF0gPT0gbW92ZUluZGV4
KTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBsYXN0SW5kZXggPSBtX2xvd1ByaW9yaXR5TW92
ZUxpc3QubGFzdCgpOworICAgICAgICAgICAgICAgIG1fcG9zaXRpb25Jbk1vdmVMaXN0W2xhc3RJ
bmRleF0gPSBwb3NpdGlvbkluTW92ZUxpc3Q7CisgICAgICAgICAgICAgICAgbV9sb3dQcmlvcml0
eU1vdmVMaXN0W3Bvc2l0aW9uSW5Nb3ZlTGlzdF0gPSBsYXN0SW5kZXg7CisgICAgICAgICAgICAg
ICAgbV9sb3dQcmlvcml0eU1vdmVMaXN0LnJlbW92ZUxhc3QoKTsKKyAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgbV9wb3NpdGlvbkluTW92ZUxpc3RbbW92ZUluZGV4XSA9IHN0ZDo6bnVtZXJp
Y19saW1pdHM8dW5zaWduZWQ+OjptYXgoKTsKKworICAgICAgICAgICAgQVNTRVJUKCFjb250YWlu
cyhtb3ZlSW5kZXgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHVuc2lnbmVkIHRha2VMYXN0TW92
ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFTU0VSVCghaXNFbXB0eSgpKTsKKworICAgICAg
ICAgICAgdW5zaWduZWQgbGFzdEluZGV4OworICAgICAgICAgICAgaWYgKCFtX21vdmVMaXN0Lmlz
RW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGxhc3RJbmRleCA9IG1fbW92ZUxpc3QudGFrZUxh
c3QoKTsKKyAgICAgICAgICAgICAgICBBU1NFUlQobV9wb3NpdGlvbkluTW92ZUxpc3RbbGFzdElu
ZGV4XSA9PSBtX21vdmVMaXN0LnNpemUoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgICAgICAgIGxhc3RJbmRleCA9IG1fbG93UHJpb3JpdHlNb3ZlTGlzdC50YWtlTGFzdCgpOwor
ICAgICAgICAgICAgICAgIEFTU0VSVChtX3Bvc2l0aW9uSW5Nb3ZlTGlzdFtsYXN0SW5kZXhdID09
IG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5zaXplKCkpOworICAgICAgICAgICAgfQorICAgICAgICAg
ICAgbV9wb3NpdGlvbkluTW92ZUxpc3RbbGFzdEluZGV4XSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8
dW5zaWduZWQ+OjptYXgoKTsKKworICAgICAgICAgICAgQVNTRVJUKCFjb250YWlucyhsYXN0SW5k
ZXgpKTsKKyAgICAgICAgICAgIHJldHVybiBsYXN0SW5kZXg7CisgICAgICAgIH0KKworICAgICAg
ICB2b2lkIHJldHVybk1vdmUodW5zaWduZWQgaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAg
IC8vIFRoaXMgYXNzZXJ0aW9uIGlzIGEgYml0IHN0cmljdCBidXQgdGhhdCBpcyBob3cgdGhlIG1v
dmUgbGlzdCBzaG91bGQgYmUgdXNlZC4gVGhlIG9ubHkga2luZCBvZiBtb3ZlcyB0aGF0IGNhbgor
ICAgICAgICAgICAgLy8gcmV0dXJuIHRvIHRoZSBsaXN0IGFyZSB0aGUgb25lcyB0aGF0IHdlIHBy
ZXZpb3VzbHkgZmFpbGVkIHRvIGNvYWxlc2NlIHdpdGggdGhlIGNvbnNlcnZhdGl2ZSBoZXVyaXN0
aWNzLgorICAgICAgICAgICAgLy8gVmFsdWVzIHNob3VsZCBub3QgYmUgYWRkZWQgYmFjayBpZiB0
aGV5IHdlcmUgbmV2ZXIgdGFrZW4gb3V0IHdoZW4gYXR0ZW1wdGluZyBjb2FsZXNjaW5nLgorICAg
ICAgICAgICAgQVNTRVJUKCFjb250YWlucyhpbmRleCkpOworCisgICAgICAgICAgICBpZiAoaW5k
ZXggPCBtX2ZpcnN0TG93UHJpb3JpdHlNb3ZlSW5kZXgpIHsKKyAgICAgICAgICAgICAgICB1bnNp
Z25lZCBwb3NpdGlvbiA9IG1fbW92ZUxpc3Quc2l6ZSgpOworICAgICAgICAgICAgICAgIG1fbW92
ZUxpc3QuYXBwZW5kKGluZGV4KTsKKyAgICAgICAgICAgICAgICBtX3Bvc2l0aW9uSW5Nb3ZlTGlz
dFtpbmRleF0gPSBwb3NpdGlvbjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAg
ICAgdW5zaWduZWQgcG9zaXRpb24gPSBtX2xvd1ByaW9yaXR5TW92ZUxpc3Quc2l6ZSgpOworICAg
ICAgICAgICAgICAgIG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5hcHBlbmQoaW5kZXgpOworICAgICAg
ICAgICAgICAgIG1fcG9zaXRpb25Jbk1vdmVMaXN0W2luZGV4XSA9IHBvc2l0aW9uOworICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICBBU1NFUlQoY29udGFpbnMoaW5kZXgpKTsKKyAgICAgICAg
fQorCisgICAgICAgIHZvaWQgY2xlYXIoKQorICAgICAgICB7CisgICAgICAgICAgICBtX3Bvc2l0
aW9uSW5Nb3ZlTGlzdC5jbGVhcigpOworICAgICAgICAgICAgbV9tb3ZlTGlzdC5jbGVhcigpOwor
ICAgICAgICAgICAgbV9sb3dQcmlvcml0eU1vdmVMaXN0LmNsZWFyKCk7CisgICAgICAgIH0KKwor
ICAgIHByaXZhdGU6CisgICAgICAgIFZlY3Rvcjx1bnNpZ25lZCwgMCwgVW5zYWZlVmVjdG9yT3Zl
cmZsb3c+IG1fcG9zaXRpb25Jbk1vdmVMaXN0OworICAgICAgICBWZWN0b3I8dW5zaWduZWQsIDAs
IFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX21vdmVMaXN0OworICAgICAgICBWZWN0b3I8dW5zaWdu
ZWQsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX2xvd1ByaW9yaXR5TW92ZUxpc3Q7CisgICAg
ICAgIHVuc2lnbmVkIG1fZmlyc3RMb3dQcmlvcml0eU1vdmVJbmRleCB7IDAgfTsKKyAgICB9Owor
CisgICAgLy8gV29yayBsaXN0cy4KKyAgICAvLyBTZXQgb2YgIm1vdmUiIGVuYWJsZWQgZm9yIHBv
c3NpYmxlIGNvYWxlc2NpbmcuCisgICAgT3JkZXJlZE1vdmVTZXQgbV93b3JrbGlzdE1vdmVzOwor
ICAgIC8vIFNldCBvZiAibW92ZSIgbm90IHlldCByZWFkeSBmb3IgY29hbGVzY2luZy4KKyAgICBC
aXRWZWN0b3IgbV9hY3RpdmVNb3ZlczsKKyAgICAvLyBMb3ctZGVncmVlLCBub24tTW92ZSByZWxh
dGVkLgorICAgIFZlY3RvcjxJbmRleFR5cGU+IG1fc2ltcGxpZnlXb3JrbGlzdDsKKyAgICAvLyBI
aWdoLWRlZ3JlZSBUbXAuCisgICAgSGFzaFNldDxJbmRleFR5cGU+IG1fc3BpbGxXb3JrbGlzdDsK
KyAgICAvLyBMb3ctZGVncmVlLCBNb3ZlIHJlbGF0ZWQuCisgICAgSGFzaFNldDxJbmRleFR5cGU+
IG1fZnJlZXplV29ya2xpc3Q7CisKKyAgICBib29sIG1faGFzU2VsZWN0ZWRTcGlsbCB7IGZhbHNl
IH07CisgICAgYm9vbCBtX2hhc0NvYWxlc2NlZE5vblRyaXZpYWxNb3ZlIHsgZmFsc2UgfTsKKwor
ICAgIC8vIFRoZSBtYXBwaW5nIG9mIFRtcCB0byB0aGVpciBhbGlhcyBmb3IgTW92ZXMgdGhhdCBh
cmUgYWx3YXlzIGNvYWxlc2NpbmcgcmVnYXJkbGVzcyBvZiBzcGlsbGluZy4KKyAgICBWZWN0b3I8
SW5kZXhUeXBlLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9jb2FsZXNjZWRUbXBzQXRTcGls
bDsKKyAgICAKKyAgICBjb25zdCBIYXNoU2V0PHVuc2lnbmVkPiYgbV91bnNwaWxsYWJsZVRtcHM7
Cit9OworCisvLyBUaGlzIHBlcmZvcm0gYWxsIHRoZSB0YXNrcyB0aGF0IGFyZSBzcGVjaWZpYyB0
byBjZXJ0YWluIHJlZ2lzdGVyIHR5cGUuCit0ZW1wbGF0ZTxBcmc6OlR5cGUgdHlwZT4KK2NsYXNz
IENvbG9yaW5nQWxsb2NhdG9yIDogcHVibGljIEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0b3I8dW5z
aWduZWQ+IHsKK3B1YmxpYzoKKyAgICBDb2xvcmluZ0FsbG9jYXRvcihDb2RlJiBjb2RlLCBUbXBX
aWR0aCYgdG1wV2lkdGgsIGNvbnN0IFVzZUNvdW50czxUbXA+JiB1c2VDb3VudHMsIGNvbnN0IEhh
c2hTZXQ8dW5zaWduZWQ+JiB1bnNwaWxsYWJsZVRtcCkKKyAgICAgICAgOiBBYnN0cmFjdENvbG9y
aW5nQWxsb2NhdG9yPHVuc2lnbmVkPihjb2RlLnJlZ3NJblByaW9yaXR5T3JkZXIodHlwZSksIEFi
c29sdXRlVG1wTWFwcGVyPHR5cGU+OjpsYXN0TWFjaGluZVJlZ2lzdGVySW5kZXgoKSwgdG1wQXJy
YXlTaXplKGNvZGUpLCB1bnNwaWxsYWJsZVRtcCkKKyAgICAgICAgLCBtX2NvZGUoY29kZSkKKyAg
ICAgICAgLCBtX3RtcFdpZHRoKHRtcFdpZHRoKQorICAgICAgICAsIG1fdXNlQ291bnRzKHVzZUNv
dW50cykKKyAgICB7CisgICAgICAgIGlmICh0eXBlID09IEFyZzo6R1ApIHsKKyAgICAgICAgICAg
IG1fZnJhbWVQb2ludGVySW5kZXggPSBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJ
bmRleChUbXAoTWFjcm9Bc3NlbWJsZXI6OmZyYW1lUG9pbnRlclJlZ2lzdGVyKSk7CisgICAgICAg
ICAgICBtX2ludGVyZmVyZXNXaXRoRnJhbWVQb2ludGVyLmVuc3VyZVNpemUodG1wQXJyYXlTaXpl
KGNvZGUpKTsKKyAgICAgICAgfQorCisgICAgICAgIGluaXRpYWxpemVQcmVjb2xvcmVkVG1wKCk7
CisgICAgICAgIGJ1aWxkKCk7CisgICAgICAgIGFsbG9jYXRlKCk7CisgICAgfQorCisgICAgVG1w
IGdldEFsaWFzKFRtcCB0bXApIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gQWJzb2x1dGVU
bXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KGdldEFsaWFzKEFic29sdXRlVG1w
TWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHRtcCkpKTsKKyAgICB9CisKKyAgICAvLyBUaGlz
IHRlbGxzIHlvdSBpZiBhIE1vdmUgd2lsbCBiZSBjb2FsZXNjYWJsZSBpZiB0aGUgc3JjIGFuZCBk
c3QgZW5kIHVwIG1hdGNoaW5nLiBUaGlzIG1ldGhvZAorICAgIC8vIHJlbGllcyBvbiBhbiBhbmFs
eXNpcyB0aGF0IGlzIGludmFsaWRhdGVkIGJ5IHJlZ2lzdGVyIGFsbG9jYXRpb24sIHNvIHlvdSBp
dCdzIG9ubHkgbWVhbmluZ2Z1bCB0bworICAgIC8vIGNhbGwgdGhpcyAqYmVmb3JlKiByZXBsYWNp
bmcgdGhlIFRtcCdzIGluIHRoaXMgSW5zdCB3aXRoIHJlZ2lzdGVycyBvciBzcGlsbCBzbG90cy4K
KyAgICBib29sIG1heUJlQ29hbGVzY2FibGUoY29uc3QgSW5zdCYgaW5zdCkgY29uc3QKKyAgICB7
CisgICAgICAgIHJldHVybiBtYXlCZUNvYWxlc2NhYmxlSW1wbChpbnN0LCAmbV90bXBXaWR0aCk7
CisgICAgfQorCisgICAgYm9vbCBpc1VzZWxlc3NNb3ZlKGNvbnN0IEluc3QmIGluc3QpIGNvbnN0
CisgICAgeworICAgICAgICByZXR1cm4gbWF5QmVDb2FsZXNjYWJsZUltcGwoaW5zdCwgbnVsbHB0
cikgJiYgaW5zdC5hcmdzWzBdLnRtcCgpID09IGluc3QuYXJnc1sxXS50bXAoKTsKKyAgICB9CisK
KyAgICBUbXAgZ2V0QWxpYXNXaGVuU3BpbGxpbmcoVG1wIHRtcCkgY29uc3QKKyAgICB7CisgICAg
ICAgIEFTU0VSVF9XSVRIX01FU1NBR0UoIW1fc3BpbGxlZFRtcHMuaXNFbXB0eSgpLCAiVGhpcyBm
dW5jdGlvbiBpcyBvbmx5IHZhbGlkIGZvciBjb2FsZXNjaW5nIGR1cmluZyBzcGlsbGluZy4iKTsK
KworICAgICAgICBpZiAobV9jb2FsZXNjZWRUbXBzQXRTcGlsbC5pc0VtcHR5KCkpCisgICAgICAg
ICAgICByZXR1cm4gdG1wOworCisgICAgICAgIHVuc2lnbmVkIGFsaWFzSW5kZXggPSBBYnNvbHV0
ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh0bXApOworICAgICAgICB3aGlsZSAodW5z
aWduZWQgbmV4dEFsaWFzSW5kZXggPSBtX2NvYWxlc2NlZFRtcHNBdFNwaWxsW2FsaWFzSW5kZXhd
KQorICAgICAgICAgICAgYWxpYXNJbmRleCA9IG5leHRBbGlhc0luZGV4OworCisgICAgICAgIFRt
cCBhbGlhcyA9IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleChh
bGlhc0luZGV4KTsKKworICAgICAgICBBU1NFUlRfV0lUSF9NRVNTQUdFKCFtX3NwaWxsZWRUbXBz
LmNvbnRhaW5zKGFsaWFzSW5kZXgpIHx8IGFsaWFzID09IHRtcCwgIlRoZSBhbGlhc2VzIGF0IHNw
aWxsIHNob3VsZCBhbHdheXMgYmUgY29sb3JhYmxlLiBTb21ldGhpbmcgd2VudCBob3JyaWJseSB3
cm9uZy4iKTsKKworICAgICAgICByZXR1cm4gYWxpYXM7CisgICAgfQorCisgICAgdGVtcGxhdGU8
dHlwZW5hbWUgSW5kZXhJdGVyYXRvcj4KKyAgICBjbGFzcyBJbmRleFRvVG1wSXRlcmF0b3JBZGFw
dG9yIHsKKyAgICBwdWJsaWM6CisgICAgICAgIEluZGV4VG9UbXBJdGVyYXRvckFkYXB0b3IoSW5k
ZXhJdGVyYXRvciYmIGluZGV4SXRlcmF0b3IpCisgICAgICAgICAgICA6IG1faW5kZXhJdGVyYXRv
cihXVEZNb3ZlKGluZGV4SXRlcmF0b3IpKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAg
ICBUbXAgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46
OnRtcEZyb21BYnNvbHV0ZUluZGV4KCptX2luZGV4SXRlcmF0b3IpOyB9CisgICAgICAgIEluZGV4
VG9UbXBJdGVyYXRvckFkYXB0b3ImIG9wZXJhdG9yKysoKSB7ICsrbV9pbmRleEl0ZXJhdG9yOyBy
ZXR1cm4gKnRoaXM7IH0KKworICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgSW5kZXhUb1Rt
cEl0ZXJhdG9yQWRhcHRvciYgb3RoZXIpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJl
dHVybiBtX2luZGV4SXRlcmF0b3IgPT0gb3RoZXIubV9pbmRleEl0ZXJhdG9yOworICAgICAgICB9
CisKKyAgICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEluZGV4VG9UbXBJdGVyYXRvckFkYXB0
b3ImIG90aGVyKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gISgqdGhpcyA9
PSBvdGhlcik7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIEluZGV4SXRlcmF0
b3IgbV9pbmRleEl0ZXJhdG9yOworICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDb2xs
ZWN0aW9uPgorICAgIGNsYXNzIEluZGV4VG9UbXBJdGVyYWJsZUFkYXB0b3IgeworICAgIHB1Ymxp
YzoKKyAgICAgICAgSW5kZXhUb1RtcEl0ZXJhYmxlQWRhcHRvcihjb25zdCBDb2xsZWN0aW9uJiBj
b2xsZWN0aW9uKQorICAgICAgICAgICAgOiBtX2NvbGxlY3Rpb24oY29sbGVjdGlvbikKKyAgICAg
ICAgeworICAgICAgICB9CisKKyAgICAgICAgSW5kZXhUb1RtcEl0ZXJhdG9yQWRhcHRvcjx0eXBl
bmFtZSBDb2xsZWN0aW9uOjpjb25zdF9pdGVyYXRvcj4gYmVnaW4oKSBjb25zdAorICAgICAgICB7
CisgICAgICAgICAgICByZXR1cm4gbV9jb2xsZWN0aW9uLmJlZ2luKCk7CisgICAgICAgIH0KKwor
ICAgICAgICBJbmRleFRvVG1wSXRlcmF0b3JBZGFwdG9yPHR5cGVuYW1lIENvbGxlY3Rpb246OmNv
bnN0X2l0ZXJhdG9yPiBlbmQoKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4g
bV9jb2xsZWN0aW9uLmVuZCgpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBj
b25zdCBDb2xsZWN0aW9uJiBtX2NvbGxlY3Rpb247CisgICAgfTsKKworICAgIEluZGV4VG9UbXBJ
dGVyYWJsZUFkYXB0b3I8VmVjdG9yPHVuc2lnbmVkPj4gc3BpbGxlZFRtcHMoKSBjb25zdCB7IHJl
dHVybiBtX3NwaWxsZWRUbXBzOyB9CisKKyAgICBib29sIHJlcXVpcmVzU3BpbGxpbmcoKSBjb25z
dCB7IHJldHVybiAhbV9zcGlsbGVkVG1wcy5pc0VtcHR5KCk7IH0KKworICAgIFJlZyBhbGxvY2F0
ZWRSZWcoVG1wIHRtcCkgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVCghdG1wLmlzUmVnKCkp
OworICAgICAgICBBU1NFUlQobV9jb2xvcmVkVG1wLnNpemUoKSk7CisgICAgICAgIEFTU0VSVCh0
bXAuaXNHUCgpID09ICh0eXBlID09IEFyZzo6R1ApKTsKKworICAgICAgICBSZWcgcmVnID0gbV9j
b2xvcmVkVG1wW0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHRtcCldOwor
ICAgICAgICBpZiAoIXJlZykgeworICAgICAgICAgICAgZGF0YUxvZygiRkFUQUw6IE5vIGNvbG9y
IGZvciAiLCB0bXAsICJcbiIpOworICAgICAgICAgICAgZGF0YUxvZygiQ29kZTpcbiIpOworICAg
ICAgICAgICAgZGF0YUxvZyhtX2NvZGUpOworICAgICAgICAgICAgUkVMRUFTRV9BU1NFUlRfTk9U
X1JFQUNIRUQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVnOworICAgIH0KKworcHJp
dmF0ZToKKyAgICBzdGF0aWMgdW5zaWduZWQgdG1wQXJyYXlTaXplKENvZGUmIGNvZGUpCisgICAg
eworICAgICAgICB1bnNpZ25lZCBudW1UbXBzID0gY29kZS5udW1UbXBzKHR5cGUpOworICAgICAg
ICByZXR1cm4gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgobnVtVG1wcyk7
CisgICAgfQorCisgICAgdm9pZCBpbml0aWFsaXplUHJlY29sb3JlZFRtcCgpCisgICAgeworICAg
ICAgICBtX2NvbG9yZWRUbXAucmVzaXplKG1fbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4ICsg
MSk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDE7IGkgPD0gbV9sYXN0UHJlY29sb3JlZFJl
Z2lzdGVySW5kZXg7ICsraSkgeworICAgICAgICAgICAgVG1wIHRtcCA9IEFic29sdXRlVG1wTWFw
cGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleChpKTsKKyAgICAgICAgICAgIEFTU0VSVCh0
bXAuaXNSZWcoKSk7CisgICAgICAgICAgICBtX2NvbG9yZWRUbXBbaV0gPSB0bXAucmVnKCk7Cisg
ICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIG1heUJlQ29hbGVzY2VkKEFyZyBsZWZ0LCBBcmcg
cmlnaHQpCisgICAgeworICAgICAgICBpZiAoIWxlZnQuaXNUbXAoKSB8fCAhcmlnaHQuaXNUbXAo
KSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBUbXAgbGVmdFRtcCA9IGxl
ZnQudG1wKCk7CisgICAgICAgIFRtcCByaWdodFRtcCA9IHJpZ2h0LnRtcCgpOworCisgICAgICAg
IGlmIChsZWZ0VG1wID09IHJpZ2h0VG1wKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgICAgIGlmIChsZWZ0VG1wLmlzR1AoKSAhPSAodHlwZSA9PSBBcmc6OkdQKSB8fCByaWdodFRt
cC5pc0dQKCkgIT0gKHR5cGUgPT0gQXJnOjpHUCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICAgICAgdW5zaWduZWQgbGVmdEluZGV4ID0gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46
OmFic29sdXRlSW5kZXgobGVmdFRtcCk7CisgICAgICAgIHVuc2lnbmVkIHJpZ2h0SW5kZXggPSBB
YnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChyaWdodFRtcCk7CisKKyAgICAg
ICAgcmV0dXJuICFtX2ludGVyZmVyZW5jZUVkZ2VzLmNvbnRhaW5zKEludGVyZmVyZW5jZUVkZ2Uo
bGVmdEluZGV4LCByaWdodEluZGV4KSk7CisgICAgfQorCisgICAgdm9pZCBhZGRUb0xvd1ByaW9y
aXR5Q29hbGVzY2luZ0NhbmRpZGF0ZXMoQXJnIGxlZnQsIEFyZyByaWdodCkKKyAgICB7CisgICAg
ICAgIEFTU0VSVChtYXlCZUNvYWxlc2NlZChsZWZ0LCByaWdodCkpOworICAgICAgICBUbXAgbGVm
dFRtcCA9IGxlZnQudG1wKCk7CisgICAgICAgIFRtcCByaWdodFRtcCA9IHJpZ2h0LnRtcCgpOwor
CisgICAgICAgIHVuc2lnbmVkIGxlZnRJbmRleCA9IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojph
YnNvbHV0ZUluZGV4KGxlZnRUbXApOworICAgICAgICB1bnNpZ25lZCByaWdodEluZGV4ID0gQWJz
b2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgocmlnaHRUbXApOworCisgICAgICAg
IHVuc2lnbmVkIG5leHRNb3ZlSW5kZXggPSBtX2NvYWxlc2NpbmdDYW5kaWRhdGVzLnNpemUoKTsK
KyAgICAgICAgbV9jb2FsZXNjaW5nQ2FuZGlkYXRlcy5hcHBlbmQoeyBsZWZ0SW5kZXgsIHJpZ2h0
SW5kZXggfSk7CisKKyAgICAgICAgdW5zaWduZWQgbmV3SW5kZXhJbldvcmtsaXN0ID0gbV93b3Jr
bGlzdE1vdmVzLmFkZExvd1ByaW9yaXR5TW92ZSgpOworICAgICAgICBBU1NFUlRfVU5VU0VEKG5l
d0luZGV4SW5Xb3JrbGlzdCwgbmV3SW5kZXhJbldvcmtsaXN0ID09IG5leHRNb3ZlSW5kZXgpOwor
CisgICAgICAgIEFTU0VSVChuZXh0TW92ZUluZGV4IDw9IG1fYWN0aXZlTW92ZXMuc2l6ZSgpKTsK
KyAgICAgICAgbV9hY3RpdmVNb3Zlcy5lbnN1cmVTaXplKG5leHRNb3ZlSW5kZXggKyAxKTsKKwor
ICAgICAgICBtX21vdmVMaXN0W2xlZnRJbmRleF0uYWRkKG5leHRNb3ZlSW5kZXgpOworICAgICAg
ICBtX21vdmVMaXN0W3JpZ2h0SW5kZXhdLmFkZChuZXh0TW92ZUluZGV4KTsKKyAgICB9CisKKyAg
ICB2b2lkIGJ1aWxkKCkKKyAgICB7CisgICAgICAgIFRtcExpdmVuZXNzPHR5cGU+IGxpdmVuZXNz
KG1fY29kZSk7CisgICAgICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBtX2NvZGUpIHsKKyAg
ICAgICAgICAgIHR5cGVuYW1lIFRtcExpdmVuZXNzPHR5cGU+OjpMb2NhbENhbGMgbG9jYWxDYWxj
KGxpdmVuZXNzLCBibG9jayk7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGluc3RJbmRleCA9
IGJsb2NrLT5zaXplKCk7IGluc3RJbmRleC0tOykgeworICAgICAgICAgICAgICAgIEluc3QmIGlu
c3QgPSBibG9jay0+YXQoaW5zdEluZGV4KTsKKyAgICAgICAgICAgICAgICBJbnN0KiBuZXh0SW5z
dCA9IGJsb2NrLT5nZXQoaW5zdEluZGV4ICsgMSk7CisgICAgICAgICAgICAgICAgYnVpbGQoJmlu
c3QsIG5leHRJbnN0LCBsb2NhbENhbGMpOworICAgICAgICAgICAgICAgIGxvY2FsQ2FsYy5leGVj
dXRlKGluc3RJbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWlsZChudWxscHRy
LCAmYmxvY2stPmF0KDApLCBsb2NhbENhbGMpOworICAgICAgICB9CisgICAgICAgIGJ1aWxkTG93
UHJpb3JpdHlNb3ZlTGlzdCgpOworICAgIH0KKworICAgIHZvaWQgYnVpbGQoSW5zdCogcHJldklu
c3QsIEluc3QqIG5leHRJbnN0LCBjb25zdCB0eXBlbmFtZSBUbXBMaXZlbmVzczx0eXBlPjo6TG9j
YWxDYWxjJiBsb2NhbENhbGMpCisgICAgeworICAgICAgICBpZiAodHJhY2VEZWJ1ZykKKyAgICAg
ICAgICAgIGRhdGFMb2coIkJ1aWxkaW5nIGJldHdlZW4gIiwgcG9pbnRlckR1bXAocHJldkluc3Qp
LCAiIGFuZCAiLCBwb2ludGVyRHVtcChuZXh0SW5zdCksICI6XG4iKTsKKyAgICAgICAgSW5zdDo6
Zm9yRWFjaERlZldpdGhFeHRyYUNsb2JiZXJlZFJlZ3M8VG1wPigKKyAgICAgICAgICAgIHByZXZJ
bnN0LCBuZXh0SW5zdCwKKyAgICAgICAgICAgIFsmXSAoY29uc3QgVG1wJiBhcmcsIEFyZzo6Um9s
ZSwgQXJnOjpUeXBlIGFyZ1R5cGUsIEFyZzo6V2lkdGgpIHsKKyAgICAgICAgICAgICAgICBpZiAo
YXJnVHlwZSAhPSB0eXBlKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAg
ICAgICAgCisgICAgICAgICAgICAgICAgLy8gQWxsIHRoZSBEZWYoKXMgaW50ZXJmZXJlIHdpdGgg
ZWFjaCBvdGhlciBhbmQgd2l0aCBhbGwgdGhlIGV4dHJhIGNsb2JiZXJlZCBUbXBzLgorICAgICAg
ICAgICAgICAgIC8vIFdlIHNob3VsZCBub3QgdXNlIGZvckVhY2hEZWZXaXRoRXh0cmFDbG9iYmVy
ZWRSZWdzKCkgaGVyZSBzaW5jZSBjb2xvcmVkIFRtcHMKKyAgICAgICAgICAgICAgICAvLyBkbyBu
b3QgbmVlZCBpbnRlcmZlcmVuY2UgZWRnZXMgaW4gb3VyIGltcGxlbWVudGF0aW9uLgorICAgICAg
ICAgICAgICAgIEluc3Q6OmZvckVhY2hEZWY8VG1wPigKKyAgICAgICAgICAgICAgICAgICAgcHJl
dkluc3QsIG5leHRJbnN0LAorICAgICAgICAgICAgICAgICAgICBbJl0gKFRtcCYgb3RoZXJBcmcs
IEFyZzo6Um9sZSwgQXJnOjpUeXBlIGFyZ1R5cGUsIEFyZzo6V2lkdGgpIHsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGlmIChhcmdUeXBlICE9IHR5cGUpCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAg
ICAgICAgICBpZiAodHJhY2VEZWJ1ZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRh
TG9nKCIgICAgQWRkaW5nIGRlZi1kZWYgZWRnZTogIiwgYXJnLCAiLCAiLCBvdGhlckFyZywgIlxu
Iik7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5hZGRFZGdlKGFyZywgb3RoZXJBcmcp
OworICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgIGlm
IChwcmV2SW5zdCAmJiBtYXlCZUNvYWxlc2NhYmxlKCpwcmV2SW5zdCkpIHsKKyAgICAgICAgICAg
IC8vIFdlIGRvIG5vdCB3YW50IHRoZSBVc2UoKSBvZiB0aGlzIG1vdmUgdG8gaW50ZXJmZXJlIHdp
dGggdGhlIERlZigpLCBldmVuIGlmIGl0IGlzIGxpdmUKKyAgICAgICAgICAgIC8vIGFmdGVyIHRo
ZSBNb3ZlLiBJZiB3ZSB3ZXJlIHRvIGFkZCB0aGUgaW50ZXJmZXJlbmNlIGVkZ2UsIGl0IHdvdWxk
IGJlIGltcG9zc2libGUgdG8KKyAgICAgICAgICAgIC8vIGNvYWxlc2NlIHRoZSBNb3ZlIGV2ZW4g
aWYgdGhlIHR3byBUbXAgbmV2ZXIgaW50ZXJmZXJlIGFueXdoZXJlLgorICAgICAgICAgICAgVG1w
IGRlZlRtcDsKKyAgICAgICAgICAgIFRtcCB1c2VUbXA7CisgICAgICAgICAgICBwcmV2SW5zdC0+
Zm9yRWFjaFRtcChbJmRlZlRtcCwgJnVzZVRtcF0gKFRtcCYgYXJnVG1wLCBBcmc6OlJvbGUgcm9s
ZSwgQXJnOjpUeXBlLCBBcmc6OldpZHRoKSB7CisgICAgICAgICAgICAgICAgaWYgKEFyZzo6aXNM
YXRlRGVmKHJvbGUpKQorICAgICAgICAgICAgICAgICAgICBkZWZUbXAgPSBhcmdUbXA7CisgICAg
ICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFTU0VSVChBcmc6OmlzRWFy
bHlVc2Uocm9sZSkpOworICAgICAgICAgICAgICAgICAgICB1c2VUbXAgPSBhcmdUbXA7CisgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBBU1NFUlQoZGVmVG1w
KTsKKyAgICAgICAgICAgIEFTU0VSVCh1c2VUbXApOworCisgICAgICAgICAgICB1bnNpZ25lZCBu
ZXh0TW92ZUluZGV4ID0gbV9jb2FsZXNjaW5nQ2FuZGlkYXRlcy5zaXplKCk7CisgICAgICAgICAg
ICBtX2NvYWxlc2NpbmdDYW5kaWRhdGVzLmFwcGVuZCh7IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+
OjphYnNvbHV0ZUluZGV4KHVzZVRtcCksIEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0
ZUluZGV4KGRlZlRtcCkgfSk7CisKKyAgICAgICAgICAgIHVuc2lnbmVkIG5ld0luZGV4SW5Xb3Jr
bGlzdCA9IG1fd29ya2xpc3RNb3Zlcy5hZGRNb3ZlKCk7CisgICAgICAgICAgICBBU1NFUlRfVU5V
U0VEKG5ld0luZGV4SW5Xb3JrbGlzdCwgbmV3SW5kZXhJbldvcmtsaXN0ID09IG5leHRNb3ZlSW5k
ZXgpOworCisgICAgICAgICAgICBBU1NFUlQobmV4dE1vdmVJbmRleCA8PSBtX2FjdGl2ZU1vdmVz
LnNpemUoKSk7CisgICAgICAgICAgICBtX2FjdGl2ZU1vdmVzLmVuc3VyZVNpemUobmV4dE1vdmVJ
bmRleCArIDEpOworCisgICAgICAgICAgICBmb3IgKGNvbnN0IEFyZyYgYXJnIDogcHJldkluc3Qt
PmFyZ3MpIHsKKyAgICAgICAgICAgICAgICBhdXRvJiBsaXN0ID0gbV9tb3ZlTGlzdFtBYnNvbHV0
ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChhcmcudG1wKCkpXTsKKyAgICAgICAgICAg
ICAgICBsaXN0LmFkZChuZXh0TW92ZUluZGV4KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgZm9yIChjb25zdCBUbXAmIGxpdmVUbXAgOiBsb2NhbENhbGMubGl2ZSgpKSB7CisgICAgICAg
ICAgICAgICAgaWYgKGxpdmVUbXAgIT0gdXNlVG1wKSB7CisgICAgICAgICAgICAgICAgICAgIGlm
ICh0cmFjZURlYnVnKQorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUxvZygiICAgIEFkZGlu
ZyBkZWYtbGl2ZSBmb3IgY29hbGVzY2FibGU6ICIsIGRlZlRtcCwgIiwgIiwgbGl2ZVRtcCwgIlxu
Iik7CisgICAgICAgICAgICAgICAgICAgIGFkZEVkZ2UoZGVmVG1wLCBsaXZlVG1wKTsKKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRoZSBuZXh0IGlu
c3RydWN0aW9uIGNvdWxkIGhhdmUgZWFybHkgY2xvYmJlcnMgb3IgZWFybHkgZGVmJ3MuIFdlIG5l
ZWQgdG8gY29uc2lkZXIKKyAgICAgICAgICAgIC8vIHRob3NlIG5vdy4KKyAgICAgICAgICAgIGFk
ZEVkZ2VzKG51bGxwdHIsIG5leHRJbnN0LCBsb2NhbENhbGMubGl2ZSgpKTsKKyAgICAgICAgfSBl
bHNlCisgICAgICAgICAgICBhZGRFZGdlcyhwcmV2SW5zdCwgbmV4dEluc3QsIGxvY2FsQ2FsYy5s
aXZlKCkpOworICAgIH0KKworICAgIHZvaWQgYnVpbGRMb3dQcmlvcml0eU1vdmVMaXN0KCkKKyAg
ICB7CisgICAgICAgIGlmICghaXNYODYoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAg
ICBtX3dvcmtsaXN0TW92ZXMuc3RhcnRBZGRpbmdMb3dQcmlvcml0eU1vdmVzKCk7CisgICAgICAg
IGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBtX2NvZGUpIHsKKyAgICAgICAgICAgIGZvciAoSW5z
dCYgaW5zdCA6ICpibG9jaykgeworICAgICAgICAgICAgICAgIGlmIChzdGQ6Om9wdGlvbmFsPHVu
c2lnbmVkPiBkZWZBcmdJbmRleCA9IGluc3Quc2hvdWxkVHJ5QWxpYXNpbmdEZWYoKSkgeworICAg
ICAgICAgICAgICAgICAgICBBcmcgb3AxID0gaW5zdC5hcmdzWypkZWZBcmdJbmRleCAtIDJdOwor
ICAgICAgICAgICAgICAgICAgICBBcmcgb3AyID0gaW5zdC5hcmdzWypkZWZBcmdJbmRleCAtIDFd
OworICAgICAgICAgICAgICAgICAgICBBcmcgZGVzdCA9IGluc3QuYXJnc1sqZGVmQXJnSW5kZXhd
OworCisgICAgICAgICAgICAgICAgICAgIGlmIChvcDEgPT0gZGVzdCB8fCBvcDIgPT0gZGVzdCkK
KyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAg
IGlmIChtYXlCZUNvYWxlc2NlZChvcDEsIGRlc3QpKQorICAgICAgICAgICAgICAgICAgICAgICAg
YWRkVG9Mb3dQcmlvcml0eUNvYWxlc2NpbmdDYW5kaWRhdGVzKG9wMSwgZGVzdCk7CisgICAgICAg
ICAgICAgICAgICAgIGlmIChvcDEgIT0gb3AyICYmIG1heUJlQ29hbGVzY2VkKG9wMiwgZGVzdCkp
CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRUb0xvd1ByaW9yaXR5Q29hbGVzY2luZ0NhbmRp
ZGF0ZXMob3AyLCBkZXN0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAg
ICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGFkZEVkZ2VzKEluc3QqIHByZXZJbnN0LCBJbnN0KiBu
ZXh0SW5zdCwgdHlwZW5hbWUgVG1wTGl2ZW5lc3M8dHlwZT46OkxvY2FsQ2FsYzo6SXRlcmFibGUg
bGl2ZVRtcHMpCisgICAgeworICAgICAgICAvLyBBbGwgdGhlIERlZigpcyBpbnRlcmZlcmUgd2l0
aCBldmVydGhpbmcgbGl2ZS4KKyAgICAgICAgSW5zdDo6Zm9yRWFjaERlZldpdGhFeHRyYUNsb2Ji
ZXJlZFJlZ3M8VG1wPigKKyAgICAgICAgICAgIHByZXZJbnN0LCBuZXh0SW5zdCwKKyAgICAgICAg
ICAgIFsmXSAoY29uc3QgVG1wJiBhcmcsIEFyZzo6Um9sZSwgQXJnOjpUeXBlIGFyZ1R5cGUsIEFy
Zzo6V2lkdGgpIHsKKyAgICAgICAgICAgICAgICBpZiAoYXJnVHlwZSAhPSB0eXBlKQorICAgICAg
ICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAg
Zm9yIChjb25zdCBUbXAmIGxpdmVUbXAgOiBsaXZlVG1wcykgeworICAgICAgICAgICAgICAgICAg
ICBBU1NFUlQobGl2ZVRtcC5pc0dQKCkgPT0gKHR5cGUgPT0gQXJnOjpHUCkpOworICAgICAgICAg
ICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpCisgICAgICAg
ICAgICAgICAgICAgICAgICBkYXRhTG9nKCIgICAgQWRkaW5nIGRlZi1saXZlIGVkZ2U6ICIsIGFy
ZywgIiwgIiwgbGl2ZVRtcCwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAg
ICAgICAgICAgICBhZGRFZGdlKGFyZywgbGl2ZVRtcCk7CisgICAgICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gQXJnOjpHUCAmJiAhYXJnLmlzR1BSKCkpCisgICAg
ICAgICAgICAgICAgICAgIG1faW50ZXJmZXJlc1dpdGhGcmFtZVBvaW50ZXIucXVpY2tTZXQoQWJz
b2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgoYXJnKSk7CisgICAgICAgICAgICB9
KTsKKyAgICB9CisKKyAgICB2b2lkIGFkZEVkZ2UoVG1wIGEsIFRtcCBiKQorICAgIHsKKyAgICAg
ICAgQVNTRVJUX1dJVEhfTUVTU0FHRShhLmlzR1AoKSA9PSBiLmlzR1AoKSwgIkFuIGludGVyZmVy
ZW5jZSBiZXR3ZWVuIHJlZ2lzdGVycyBvZiBkaWZmZXJlbnQgdHlwZXMgZG9lcyBub3QgbWFrZSBz
ZW5zZSwgaXQgY2FuIGxlYWQgdG8gbm9uLWNvbG9yYWJsZSBncmFwaHMuIik7CisKKyAgICAgICAg
YWRkRWRnZShBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChhKSwgQWJzb2x1
dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgoYikpOworICAgIH0KKworICAgIC8vIENh
bGxpbmcgdGhpcyB3aXRob3V0IGEgdG1wV2lkdGggd2lsbCBwZXJmb3JtIGEgbW9yZSBjb25zZXJ2
YXRpdmUgY29hbGVzY2luZyBhbmFseXNpcyB0aGF0IGFzc3VtZXMKKyAgICAvLyB0aGF0IE1vdmUz
MidzIGFyZSBub3QgY29hbGVzY2FibGUuCisgICAgc3RhdGljIGJvb2wgbWF5QmVDb2FsZXNjYWJs
ZUltcGwoY29uc3QgSW5zdCYgaW5zdCwgVG1wV2lkdGgqIHRtcFdpZHRoKQorICAgIHsKKyAgICAg
ICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgQXJnOjpHUDoKKyAgICAgICAgICAgIHN3
aXRjaCAoaW5zdC5raW5kLm9wY29kZSkgeworICAgICAgICAgICAgY2FzZSBNb3ZlOgorICAgICAg
ICAgICAgY2FzZSBNb3ZlMzI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBk
ZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFyZzo6RlA6CisgICAgICAgICAgICBzd2l0
Y2ggKGluc3Qua2luZC5vcGNvZGUpIHsKKyAgICAgICAgICAgIGNhc2UgTW92ZUZsb2F0OgorICAg
ICAgICAgICAgY2FzZSBNb3ZlRG91YmxlOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIEFTU0VSVF9XSVRI
X01FU1NBR0UoaW5zdC5hcmdzLnNpemUoKSA9PSAyLCAiV2UgYXNzdW1lIGNvYWxlY2FibGUgbW92
ZXMgb25seSBoYXZlIHR3byBhcmd1bWVudHMgaW4gYSBmZXcgcGxhY2VzLiIpOworCisgICAgICAg
IGlmICghaW5zdC5hcmdzWzBdLmlzVG1wKCkgfHwgIWluc3QuYXJnc1sxXS5pc1RtcCgpKQorICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIEFTU0VSVChpbnN0LmFyZ3NbMF0udHlw
ZSgpID09IHR5cGUpOworICAgICAgICBBU1NFUlQoaW5zdC5hcmdzWzFdLnR5cGUoKSA9PSB0eXBl
KTsKKworICAgICAgICAvLyBXZSBjYW4gY29hbGVzY2UgYSBNb3ZlMzIgc28gbG9uZyBhcyBlaXRo
ZXIgb2YgdGhlIGZvbGxvd2luZyBob2xkczoKKyAgICAgICAgLy8gLSBUaGUgaW5wdXQgaXMgYWxy
ZWFkeSB6ZXJvLWZpbGxlZC4KKyAgICAgICAgLy8gLSBUaGUgb3V0cHV0IG9ubHkgY2FyZXMgYWJv
dXQgdGhlIGxvdyAzMiBiaXRzLgorICAgICAgICAvLworICAgICAgICAvLyBOb3RlIHRoYXQgdGhl
IGlucHV0IHByb3BlcnR5IHJlcXVpcmVzIGFuIGFuYWx5c2lzIG92ZXIgWkRlZidzLCBzbyBpdCdz
IG9ubHkgdmFsaWQgc28gbG9uZworICAgICAgICAvLyBhcyB0aGUgaW5wdXQgZ2V0cyBhIHJlZ2lz
dGVyLiBXZSBkb24ndCBrbm93IGlmIHRoZSBpbnB1dCBnZXRzIGEgcmVnaXN0ZXIsIGJ1dCB3ZSBk
byBrbm93CisgICAgICAgIC8vIHRoYXQgaWYgaXQgZG9lc24ndCBnZXQgYSByZWdpc3RlciB0aGVu
IHdlIHdpbGwgc3RpbGwgZW1pdCB0aGlzIE1vdmUzMi4KKyAgICAgICAgaWYgKGluc3Qua2luZC5v
cGNvZGUgPT0gTW92ZTMyKSB7CisgICAgICAgICAgICBpZiAoIXRtcFdpZHRoKQorICAgICAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgaWYgKHRtcFdpZHRoLT5kZWZXaWR0
aChpbnN0LmFyZ3NbMF0udG1wKCkpID4gQXJnOjpXaWR0aDMyCisgICAgICAgICAgICAgICAgJiYg
dG1wV2lkdGgtPnVzZVdpZHRoKGluc3QuYXJnc1sxXS50bXAoKSkgPiBBcmc6OldpZHRoMzIpCisg
ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIAorICAgICAg
ICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2b2lkIHNlbGVjdFNwaWxsKCkKKyAgICB7Cisg
ICAgICAgIGlmICghbV9oYXNTZWxlY3RlZFNwaWxsKSB7CisgICAgICAgICAgICBtX2hhc1NlbGVj
dGVkU3BpbGwgPSB0cnVlOworCisgICAgICAgICAgICBpZiAobV9oYXNDb2FsZXNjZWROb25Ucml2
aWFsTW92ZSkKKyAgICAgICAgICAgICAgICBtX2NvYWxlc2NlZFRtcHNBdFNwaWxsID0gbV9jb2Fs
ZXNjZWRUbXBzOworICAgICAgICB9CisKKyAgICAgICAgYXV0byBpdGVyYXRvciA9IG1fc3BpbGxX
b3JrbGlzdC5iZWdpbigpOworCisgICAgICAgIFJFTEVBU0VfQVNTRVJUX1dJVEhfTUVTU0FHRShp
dGVyYXRvciAhPSBtX3NwaWxsV29ya2xpc3QuZW5kKCksICJzZWxlY3RTcGlsbCgpIGNhbGxlZCB3
aGVuIHRoZXJlIHdhcyBubyBzcGlsbC4iKTsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlRfV0lUSF9N
RVNTQUdFKCFtX3Vuc3BpbGxhYmxlVG1wcy5jb250YWlucygqaXRlcmF0b3IpLCAidHJ5aW5nIHRv
IHNwaWxsIHVuc3BpbGxhYmxlIHRtcCIpOworCisgICAgICAgIC8vIEhpZ2hlciBzY29yZSBtZWFu
cyBtb3JlIGRlc2lyYWJsZSB0byBzcGlsbC4gTG93ZXIgc2NvcmVzIG1heGltaXplIHRoZSBsaWtl
bGlob29kIHRoYXQgYSB0bXAKKyAgICAgICAgLy8gZ2V0cyBhIHJlZ2lzdGVyLgorICAgICAgICBh
dXRvIHNjb3JlID0gWyZdIChUbXAgdG1wKSAtPiBkb3VibGUgeworICAgICAgICAgICAgLy8gQWly
IGV4cG9zZXMgdGhlIGNvbmNlcHQgb2YgImZhc3QgdG1wcyIsIGFuZCB3ZSBpbnRlcnByZXQgdGhh
dCB0byBtZWFuIHRoYXQgdGhlIHRtcAorICAgICAgICAgICAgLy8gc2hvdWxkIGFsd2F5cyBiZSBp
biBhIHJlZ2lzdGVyLgorICAgICAgICAgICAgaWYgKG1fY29kZS5pc0Zhc3RUbXAodG1wKSkKKyAg
ICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gQWxs
IGVsc2UgYmVpbmcgZXF1YWwsIHRoZSBzY29yZSBzaG91bGQgYmUgZGlyZWN0bHkgcmVsYXRlZCB0
byB0aGUgZGVncmVlLgorICAgICAgICAgICAgZG91YmxlIGRlZ3JlZSA9IHN0YXRpY19jYXN0PGRv
dWJsZT4obV9kZWdyZWVzW0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHRt
cCldKTsKKworICAgICAgICAgICAgLy8gQWxsIGVsc2UgYmVpbmcgZXF1YWwsIHRoZSBzY29yZSBz
aG91bGQgYmUgaW52ZXJzZWx5IHJlbGF0ZWQgdG8gdGhlIG51bWJlciBvZiB3YXJtIHVzZXMgYW5k
CisgICAgICAgICAgICAvLyBkZWZzLgorICAgICAgICAgICAgY29uc3QgVXNlQ291bnRzPFRtcD46
OkNvdW50cyogY291bnRzID0gbV91c2VDb3VudHNbdG1wXTsKKyAgICAgICAgICAgIGlmICghY291
bnRzKQorICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46
OmluZmluaXR5KCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGRvdWJsZSB1c2VzID0gY291
bnRzLT5udW1XYXJtVXNlcyArIGNvdW50cy0+bnVtRGVmczsKKworICAgICAgICAgICAgLy8gSWYg
aXQncyBhIGNvbnN0YW50LCB0aGVuIGl0J3Mgbm90IGFzIGJhZCB0byBzcGlsbC4gV2UgY2FuIHJl
bWF0ZXJpYWxpemUgaXQgaW4gbWFueQorICAgICAgICAgICAgLy8gY2FzZXMuCisgICAgICAgICAg
ICBpZiAoY291bnRzLT5udW1Db25zdERlZnMgPT0gMSAmJiBjb3VudHMtPm51bURlZnMgPT0gMSkK
KyAgICAgICAgICAgICAgICB1c2VzIC89IDI7CisKKyAgICAgICAgICAgIHJldHVybiBkZWdyZWUg
LyB1c2VzOworICAgICAgICB9OworCisgICAgICAgIGF1dG8gdmljdGltSXRlcmF0b3IgPSBpdGVy
YXRvcjsKKyAgICAgICAgZG91YmxlIG1heFNjb3JlID0gc2NvcmUoQWJzb2x1dGVUbXBNYXBwZXI8
dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KCppdGVyYXRvcikpOworCisgICAgICAgICsraXRl
cmF0b3I7CisgICAgICAgIGZvciAoO2l0ZXJhdG9yICE9IG1fc3BpbGxXb3JrbGlzdC5lbmQoKTsg
KytpdGVyYXRvcikgeworICAgICAgICAgICAgZG91YmxlIHRtcFNjb3JlID0gc2NvcmUoQWJzb2x1
dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KCppdGVyYXRvcikpOworICAg
ICAgICAgICAgaWYgKHRtcFNjb3JlID4gbWF4U2NvcmUpIHsKKyAgICAgICAgICAgICAgICBBU1NF
UlQoIW1fdW5zcGlsbGFibGVUbXBzLmNvbnRhaW5zKCppdGVyYXRvcikpOworICAgICAgICAgICAg
ICAgIHZpY3RpbUl0ZXJhdG9yID0gaXRlcmF0b3I7CisgICAgICAgICAgICAgICAgbWF4U2NvcmUg
PSB0bXBTY29yZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHVuc2lnbmVk
IHZpY3RpbUluZGV4ID0gKnZpY3RpbUl0ZXJhdG9yOworICAgICAgICBtX3NwaWxsV29ya2xpc3Qu
cmVtb3ZlKHZpY3RpbUl0ZXJhdG9yKTsKKyAgICAgICAgbV9zaW1wbGlmeVdvcmtsaXN0LmFwcGVu
ZCh2aWN0aW1JbmRleCk7CisKKyAgICAgICAgZnJlZXplTW92ZXModmljdGltSW5kZXgpOworICAg
IH0KKworICAgIHZvaWQgYWxsb2NhdGUoKQorICAgIHsKKyAgICAgICAgQVNTRVJUX1dJVEhfTUVT
U0FHRShtX2FjdGl2ZU1vdmVzLnNpemUoKSA+PSBtX2NvYWxlc2NpbmdDYW5kaWRhdGVzLnNpemUo
KSwgIlRoZSBhY3RpdmVNb3ZlIHNldCBzaG91bGQgYmUgYmlnIGVub3VnaCBmb3IgdGhlIHF1aWNr
IG9wZXJhdGlvbnMgb2YgQml0VmVjdG9yLiIpOworCisgICAgICAgIG1ha2VXb3JrTGlzdCgpOwor
CisgICAgICAgIGlmIChkZWJ1ZykgeworICAgICAgICAgICAgZGF0YUxvZygiSW50ZXJmZXJlbmNl
OiAiLCBsaXN0RHVtcChtX2ludGVyZmVyZW5jZUVkZ2VzKSwgIlxuIik7CisgICAgICAgICAgICBk
dW1wSW50ZXJmZXJlbmNlR3JhcGhJbkRvdChXVEY6OmRhdGFGaWxlKCkpOworICAgICAgICAgICAg
ZGF0YUxvZygiQ29hbGVzY2luZyBjYW5kaWRhdGVzOlxuIik7CisgICAgICAgICAgICBmb3IgKE1v
dmVPcGVyYW5kcyYgbW92ZU9wIDogbV9jb2FsZXNjaW5nQ2FuZGlkYXRlcykgeworICAgICAgICAg
ICAgICAgIGRhdGFMb2coIiAgICAiLCBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFi
c29sdXRlSW5kZXgobW92ZU9wLnNyY0luZGV4KSwKKyAgICAgICAgICAgICAgICAgICAgIiAtPiAi
LCBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgobW92ZU9wLmRz
dEluZGV4KSwgIlxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkYXRhTG9nKCJJbml0
aWFsIHdvcmsgbGlzdFxuIik7CisgICAgICAgICAgICBkdW1wV29ya0xpc3RzKFdURjo6ZGF0YUZp
bGUoKSk7CisgICAgICAgIH0KKworICAgICAgICBkbyB7CisgICAgICAgICAgICBpZiAodHJhY2VE
ZWJ1ZykgeworICAgICAgICAgICAgICAgIGRhdGFMb2coIkJlZm9yZSBHcmFwaCBzaW1wbGlmaWNh
dGlvbiBpdGVyYXRpb25cbiIpOworICAgICAgICAgICAgICAgIGR1bXBXb3JrTGlzdHMoV1RGOjpk
YXRhRmlsZSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFtX3NpbXBsaWZ5
V29ya2xpc3QuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIHNpbXBsaWZ5KCk7CisgICAgICAg
ICAgICBlbHNlIGlmICghbV93b3JrbGlzdE1vdmVzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAg
ICBjb2FsZXNjZSgpOworICAgICAgICAgICAgZWxzZSBpZiAoIW1fZnJlZXplV29ya2xpc3QuaXNF
bXB0eSgpKQorICAgICAgICAgICAgICAgIGZyZWV6ZSgpOworICAgICAgICAgICAgZWxzZSBpZiAo
IW1fc3BpbGxXb3JrbGlzdC5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgc2VsZWN0U3BpbGwo
KTsKKworICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpIHsKKyAgICAgICAgICAgICAgICBkYXRh
TG9nKCJBZnRlciBHcmFwaCBzaW1wbGlmaWNhdGlvbiBpdGVyYXRpb25cbiIpOworICAgICAgICAg
ICAgICAgIGR1bXBXb3JrTGlzdHMoV1RGOjpkYXRhRmlsZSgpKTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgfSB3aGlsZSAoIW1fc2ltcGxpZnlXb3JrbGlzdC5pc0VtcHR5KCkgfHwgIW1fd29ya2xp
c3RNb3Zlcy5pc0VtcHR5KCkgfHwgIW1fZnJlZXplV29ya2xpc3QuaXNFbXB0eSgpIHx8ICFtX3Nw
aWxsV29ya2xpc3QuaXNFbXB0eSgpKTsKKworICAgICAgICBhc3NpZ25Db2xvcnMoKTsKKyAgICB9
CisKKyNpZiBQTEFURk9STShDT0NPQSkKKyNwcmFnbWEgbWFyayAtIERlYnVnZ2luZyBoZWxwZXJz
LgorI2VuZGlmCisKKyAgICB2b2lkIGR1bXBJbnRlcmZlcmVuY2VHcmFwaEluRG90KFByaW50U3Ry
ZWFtJiBvdXQpCisgICAgeworICAgICAgICBvdXQucHJpbnQoImdyYXBoIEludGVyZmVyZW5jZUdy
YXBoIHsgXG4iKTsKKworICAgICAgICBIYXNoU2V0PFRtcD4gdG1wc1dpdGhJbnRlcmZlcmVuY2Vz
OworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGVkZ2UgOiBtX2ludGVyZmVyZW5jZUVkZ2VzKSB7
CisgICAgICAgICAgICB0bXBzV2l0aEludGVyZmVyZW5jZXMuYWRkKEFic29sdXRlVG1wTWFwcGVy
PHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleChlZGdlLmZpcnN0KCkpKTsKKyAgICAgICAgICAg
IHRtcHNXaXRoSW50ZXJmZXJlbmNlcy5hZGQoQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZy
b21BYnNvbHV0ZUluZGV4KGVkZ2Uuc2Vjb25kKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZv
ciAoY29uc3QgYXV0byYgdG1wIDogdG1wc1dpdGhJbnRlcmZlcmVuY2VzKSB7CisgICAgICAgICAg
ICB1bnNpZ25lZCB0bXBJbmRleCA9IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUlu
ZGV4KHRtcCk7CisgICAgICAgICAgICBpZiAodG1wSW5kZXggPCBtX2RlZ3JlZXMuc2l6ZSgpKQor
ICAgICAgICAgICAgICAgIG91dC5wcmludCgiICAgICIsIHRtcC5pbnRlcm5hbFZhbHVlKCksICIg
W2xhYmVsPVwiIiwgdG1wLCAiICgiLCBtX2RlZ3JlZXNbdG1wSW5kZXhdLCAiKVwiXTtcbiIpOwor
ICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG91dC5wcmludCgiICAgICIsIHRtcC5p
bnRlcm5hbFZhbHVlKCksICIgW2xhYmVsPVwiIiwgdG1wLCAiXCJdO1xuIik7CisgICAgICAgIH0K
KworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGVkZ2UgOiBtX2ludGVyZmVyZW5jZUVkZ2VzKQor
ICAgICAgICAgICAgb3V0LnByaW50KCIgICAgIiwgZWRnZS5maXJzdCgpLCAiIC0tICIsIGVkZ2Uu
c2Vjb25kKCksICI7XG4iKTsKKyAgICAgICAgb3V0LnByaW50KCJ9XG4iKTsKKyAgICB9CisKKyAg
ICB2b2lkIGR1bXBXb3JrTGlzdHMoUHJpbnRTdHJlYW0mIG91dCkKKyAgICB7CisgICAgICAgIG91
dC5wcmludCgiU2ltcGxpZnkgd29yayBsaXN0OlxuIik7CisgICAgICAgIGZvciAodW5zaWduZWQg
dG1wSW5kZXggOiBtX3NpbXBsaWZ5V29ya2xpc3QpCisgICAgICAgICAgICBvdXQucHJpbnQoIiAg
ICAiLCBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgodG1wSW5k
ZXgpLCAiXG4iKTsKKyAgICAgICAgb3V0LnByaW50ZigiTW92ZXMgd29yayBsaXN0IGlzIGVtcHR5
PyAlZFxuIiwgbV93b3JrbGlzdE1vdmVzLmlzRW1wdHkoKSk7CisgICAgICAgIG91dC5wcmludCgi
RnJlZXplIHdvcmsgbGlzdDpcbiIpOworICAgICAgICBmb3IgKHVuc2lnbmVkIHRtcEluZGV4IDog
bV9mcmVlemVXb3JrbGlzdCkKKyAgICAgICAgICAgIG91dC5wcmludCgiICAgICIsIEFic29sdXRl
VG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleCh0bXBJbmRleCksICJcbiIpOwor
ICAgICAgICBvdXQucHJpbnQoIlNwaWxsIHdvcmsgbGlzdDpcbiIpOworICAgICAgICBmb3IgKHVu
c2lnbmVkIHRtcEluZGV4IDogbV9zcGlsbFdvcmtsaXN0KQorICAgICAgICAgICAgb3V0LnByaW50
KCIgICAgIiwgQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KHRt
cEluZGV4KSwgIlxuIik7CisgICAgfQorCisgICAgdXNpbmcgQWJzdHJhY3RDb2xvcmluZ0FsbG9j
YXRvcjx1bnNpZ25lZD46OmFkZEVkZ2U7CisgICAgdXNpbmcgQWJzdHJhY3RDb2xvcmluZ0FsbG9j
YXRvcjx1bnNpZ25lZD46OmdldEFsaWFzOworCisgICAgQ29kZSYgbV9jb2RlOworICAgIFRtcFdp
ZHRoJiBtX3RtcFdpZHRoOworICAgIC8vIEZJWE1FOiBzcGlsbGluZyBzaG91bGQgbm90IHR5cGUg
c3BlY2lmaWMuIEl0IGlzIG9ubHkgYSBzaWRlIGVmZmVjdCBvZiB1c2luZyBVc2VDb3VudHMuCisg
ICAgY29uc3QgVXNlQ291bnRzPFRtcD4mIG1fdXNlQ291bnRzOworfTsKKworY2xhc3MgSXRlcmF0
ZWRSZWdpc3RlckNvYWxlc2NpbmcgeworcHVibGljOgorICAgIEl0ZXJhdGVkUmVnaXN0ZXJDb2Fs
ZXNjaW5nKENvZGUmIGNvZGUpCisgICAgICAgIDogbV9jb2RlKGNvZGUpCisgICAgICAgICwgbV91
c2VDb3VudHMoY29kZSkKKyAgICB7CisgICAgfQorCisgICAgdm9pZCBydW4oKQorICAgIHsKKyAg
ICAgICAgcGFkSW50ZXJmZXJlbmNlKG1fY29kZSk7CisgICAgICAgIAorICAgICAgICBpdGVyYXRl
ZFJlZ2lzdGVyQ29hbGVzY2luZ09uVHlwZTxBcmc6OkdQPigpOworICAgICAgICBpdGVyYXRlZFJl
Z2lzdGVyQ29hbGVzY2luZ09uVHlwZTxBcmc6OkZQPigpOworCisgICAgICAgIGZpeFNwaWxsc0Fm
dGVyVGVybWluYWxzKCk7CisKKyAgICAgICAgaWYgKHJlcG9ydFN0YXRzKQorICAgICAgICAgICAg
ZGF0YUxvZygiTnVtIGl0ZXJhdGlvbnMgPSAiLCBtX251bUl0ZXJhdGlvbnMsICJcbiIpOworICAg
IH0KKworcHJpdmF0ZToKKyAgICB0ZW1wbGF0ZTxBcmc6OlR5cGUgdHlwZT4KKyAgICB2b2lkIGl0
ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nT25UeXBlKCkKKyAgICB7CisgICAgICAgIEhhc2hTZXQ8
dW5zaWduZWQ+IHVuc3BpbGxhYmxlVG1wcyA9IGNvbXB1dGVVbnNwaWxsYWJsZVRtcHM8dHlwZT4o
KTsKKworICAgICAgICAvLyBGSVhNRTogSWYgYSBUbXAgaXMgdXNlZCBvbmx5IGZyb20gYSBTY3Jh
dGNoIHJvbGUgYW5kIHRoYXQgYXJndW1lbnQgaXMgIWFkbWl0c1N0YWNrLCB0aGVuCisgICAgICAg
IC8vIHdlIHNob3VsZCBhZGQgdGhlIFRtcCB0byB1bnNwaWxsYWJsZVRtcHMuIFRoYXQgd2lsbCBo
ZWxwIGF2b2lkIHJlbG9vcGluZyBvbmx5IHRvIHR1cm4gdGhlCisgICAgICAgIC8vIFRtcCBpbnRv
IGFuIHVuc3BpbGxhYmxlIFRtcC4KKyAgICAgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTE1MjY5OQorICAgICAgICAKKyAgICAgICAgd2hpbGUgKHRydWUpIHsK
KyAgICAgICAgICAgICsrbV9udW1JdGVyYXRpb25zOworCisgICAgICAgICAgICBpZiAodHJhY2VE
ZWJ1ZykKKyAgICAgICAgICAgICAgICBkYXRhTG9nKCJDb2RlIGF0IGl0ZXJhdGlvbiAiLCBtX251
bUl0ZXJhdGlvbnMsICI6XG4iLCBtX2NvZGUpOworCisgICAgICAgICAgICAvLyBGSVhNRTogT25l
IHdheSB0byBvcHRpbWl6ZSB0aGlzIGNvZGUgaXMgdG8gcmVtb3ZlIHRoZSByZWNvbXB1dGF0aW9u
IGluc2lkZSB0aGUgZml4cG9pbnQuCisgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHJlY29tcHV0
ZSBiZWNhdXNlIHNwaWxsaW5nIGFkZHMgdG1wcywgYnV0IHdlIGNvdWxkIGp1c3QgdXBkYXRlIHRt
cFdpZHRoIHdoZW4gd2UKKyAgICAgICAgICAgIC8vIGFkZCB0aG9zZSB0bXBzLiBOb3RlIHRoYXQg
b25lIGVhc3kgd2F5IHRvIHJlbW92ZSB0aGUgcmVjb21wdXRhdGlvbiBpcyB0byBtYWtlIGFueSBu
ZXdseQorICAgICAgICAgICAgLy8gYWRkZWQgVG1wcyBnZXQgdGhlIHNhbWUgdXNlL2RlZiB3aWR0
aHMgdGhhdCB0aGUgb3JpZ2luYWwgVG1wIGdvdC4gQnV0LCB0aGlzIG1heSBodXJ0IHRoZQorICAg
ICAgICAgICAgLy8gc3BpbGwgY29kZSB3ZSBlbWl0LiBTaW5jZSB3ZSBjdXJyZW50bHkgcmVjb21w
dXRlIFRtcFdpZHRoIGFmdGVyIHNwaWxsaW5nLCB0aGUgbmV3bHkKKyAgICAgICAgICAgIC8vIGNy
ZWF0ZWQgVG1wcyBtYXkgZ2V0IG5hcnJvd2VyIHVzZS9kZWYgd2lkdGhzLiBPbiB0aGUgb3RoZXIg
aGFuZCwgdGhlIHNwaWxsZXIgYWxyZWFkeQorICAgICAgICAgICAgLy8gc2VsZWN0cyB3aGljaCBt
b3ZlIGluc3RydWN0aW9uIHRvIHVzZSBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgVG1wJ3Mgd2lkdGhz
LCBzbyBpdCBtYXkgbm90CisgICAgICAgICAgICAvLyBtYXR0ZXIgdGhhbiBhIHN1YnNlcXVlbnQg
aXRlcmF0aW9uIHNlZXMgYSBjb3NlcnZhdGl2ZSB3aWR0aCBmb3IgdGhlIG5ldyBUbXBzLiBBbHNv
LCB0aGUKKyAgICAgICAgICAgIC8vIHJlY29tcHV0YXRpb24gbWF5IG5vdCBhY3R1YWxseSBiZSBh
IHBlcmZvcm1hbmNlIHByb2JsZW07IGl0J3MgbGlrZWx5IHRoYXQgYSBiZXR0ZXIgd2F5IHRvCisg
ICAgICAgICAgICAvLyBpbXByb3ZlIHBlcmZvcm1hbmNlIG9mIFRtcFdpZHRoIGlzIHRvIHJlcGxh
Y2UgaXRzIEhhc2hNYXAgd2l0aCBzb21ldGhpbmcgZWxzZS4gSXQncworICAgICAgICAgICAgLy8g
cG9zc2libGUgdGhhdCBtb3N0IG9mIHRoZSBUbXBXaWR0aCBvdmVyaGVhZCBpcyBmcm9tIHF1ZXJp
ZXMgb2YgVG1wV2lkdGggcmF0aGVyIHRoYW4gdGhlCisgICAgICAgICAgICAvLyByZWNvbXB1dGF0
aW9uLCBpbiB3aGljaCBjYXNlIHNwZWVkaW5nIHVwIHRoZSBsb29rdXAgd291bGQgYmUgYSBiaWdn
ZXIgd2luLgorICAgICAgICAgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTE1MjQ3OAorICAgICAgICAgICAgbV90bXBXaWR0aC5yZWNvbXB1dGUobV9jb2RlKTsK
KyAgICAgICAgICAgIAorICAgICAgICAgICAgQ29sb3JpbmdBbGxvY2F0b3I8dHlwZT4gYWxsb2Nh
dG9yKG1fY29kZSwgbV90bXBXaWR0aCwgbV91c2VDb3VudHMsIHVuc3BpbGxhYmxlVG1wcyk7Cisg
ICAgICAgICAgICBpZiAoIWFsbG9jYXRvci5yZXF1aXJlc1NwaWxsaW5nKCkpIHsKKyAgICAgICAg
ICAgICAgICBhc3NpZ25SZWdpc3RlcnNUb1RtcChhbGxvY2F0b3IpOworICAgICAgICAgICAgICAg
IGlmICh0cmFjZURlYnVnKQorICAgICAgICAgICAgICAgICAgICBkYXRhTG9nKCJTdWNjZXNzZnVs
bCBhbGxvY2F0aW9uIGF0IGl0ZXJhdGlvbiAiLCBtX251bUl0ZXJhdGlvbnMsICI6XG4iLCBtX2Nv
ZGUpOworCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAg
ICAgYWRkU3BpbGxBbmRGaWxsPHR5cGU+KGFsbG9jYXRvciwgdW5zcGlsbGFibGVUbXBzKTsKKyAg
ICAgICAgfQorICAgIH0KKworICAgIHRlbXBsYXRlPEFyZzo6VHlwZSB0eXBlPgorICAgIEhhc2hT
ZXQ8dW5zaWduZWQ+IGNvbXB1dGVVbnNwaWxsYWJsZVRtcHMoKQorICAgIHsKKyAgICAgICAgSGFz
aFNldDx1bnNpZ25lZD4gdW5zcGlsbGFibGVUbXBzOworCisgICAgICAgIHN0cnVjdCBSYW5nZSB7
CisgICAgICAgICAgICB1bnNpZ25lZCBmaXJzdCB7IHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWdu
ZWQ+OjptYXgoKSB9OworICAgICAgICAgICAgdW5zaWduZWQgbGFzdCB7IDAgfTsKKyAgICAgICAg
ICAgIHVuc2lnbmVkIGNvdW50IHsgMCB9OworICAgICAgICAgICAgdW5zaWduZWQgYWRtaXRTdGFj
a0NvdW50IHsgMCB9OworICAgICAgICB9OworCisgICAgICAgIHVuc2lnbmVkIG51bVRtcHMgPSBt
X2NvZGUubnVtVG1wcyh0eXBlKTsKKyAgICAgICAgdW5zaWduZWQgYXJyYXlTaXplID0gQWJzb2x1
dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgobnVtVG1wcyk7CisKKyAgICAgICAgVmVj
dG9yPFJhbmdlLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gcmFuZ2VzOworICAgICAgICByYW5n
ZXMuZmlsbChSYW5nZSgpLCBhcnJheVNpemUpOworCisgICAgICAgIHVuc2lnbmVkIGdsb2JhbElu
ZGV4ID0gMDsKKyAgICAgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6IG1fY29kZSkgeworICAg
ICAgICAgICAgZm9yIChJbnN0JiBpbnN0IDogKmJsb2NrKSB7CisgICAgICAgICAgICAgICAgaW5z
dC5mb3JFYWNoQXJnKFsmXSAoQXJnJiBhcmcsIEFyZzo6Um9sZSwgQXJnOjpUeXBlIGFyZ1R5cGUs
IEFyZzo6V2lkdGgpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFyZy5pc1RtcCgpICYmIGlu
c3QuYWRtaXRzU3RhY2soYXJnKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ1R5
cGUgIT0gdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAg
ICAgICAgICAgICAgICAgICAgIFRtcCB0bXAgPSBhcmcudG1wKCk7CisgICAgICAgICAgICAgICAg
ICAgICAgICBSYW5nZSYgcmFuZ2UgPSByYW5nZXNbQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFi
c29sdXRlSW5kZXgodG1wKV07CisgICAgICAgICAgICAgICAgICAgICAgICByYW5nZS5jb3VudCsr
OworICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuYWRtaXRTdGFja0NvdW50Kys7CisgICAg
ICAgICAgICAgICAgICAgICAgICBpZiAoZ2xvYmFsSW5kZXggPCByYW5nZS5maXJzdCkgeworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmZpcnN0ID0gZ2xvYmFsSW5kZXg7CisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UubGFzdCA9IGdsb2JhbEluZGV4OworICAgICAg
ICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFu
Z2UubGFzdCA9IGdsb2JhbEluZGV4OworCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47
CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBhcmcuZm9yRWFj
aFRtcEZhc3QoWyZdIChUbXAmIHRtcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRt
cC5pc0dQKCkgIT0gKHR5cGUgPT0gQXJnOjpHUCkpCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuOworCisgICAgICAgICAgICAgICAgICAgICAgICBSYW5nZSYgcmFuZ2UgPSByYW5n
ZXNbQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodG1wKV07CisgICAgICAg
ICAgICAgICAgICAgICAgICByYW5nZS5jb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAg
aWYgKGdsb2JhbEluZGV4IDwgcmFuZ2UuZmlyc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICByYW5nZS5maXJzdCA9IGdsb2JhbEluZGV4OworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHJhbmdlLmxhc3QgPSBnbG9iYWxJbmRleDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0g
ZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmxhc3QgPSBnbG9iYWxJbmRl
eDsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAg
ICAgICAgICAgICArK2dsb2JhbEluZGV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgKytn
bG9iYWxJbmRleDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSBBYnNvbHV0
ZVRtcE1hcHBlcjx0eXBlPjo6bGFzdE1hY2hpbmVSZWdpc3RlckluZGV4KCkgKyAxOyBpIDwgcmFu
Z2VzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBSYW5nZSYgcmFuZ2UgPSByYW5nZXNbaV07
CisgICAgICAgICAgICBpZiAocmFuZ2UubGFzdCAtIHJhbmdlLmZpcnN0IDw9IDEgJiYgcmFuZ2Uu
Y291bnQgPiByYW5nZS5hZG1pdFN0YWNrQ291bnQpCisgICAgICAgICAgICAgICAgdW5zcGlsbGFi
bGVUbXBzLmFkZChpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB1bnNwaWxsYWJsZVRt
cHM7CisgICAgfQorCisgICAgdGVtcGxhdGU8QXJnOjpUeXBlIHR5cGU+CisgICAgdm9pZCBhc3Np
Z25SZWdpc3RlcnNUb1RtcChjb25zdCBDb2xvcmluZ0FsbG9jYXRvcjx0eXBlPiYgYWxsb2NhdG9y
KQorICAgIHsKKyAgICAgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6IG1fY29kZSkgeworICAg
ICAgICAgICAgLy8gR2l2ZSBUbXAgYSB2YWxpZCByZWdpc3Rlci4KKyAgICAgICAgICAgIGZvciAo
dW5zaWduZWQgaW5zdEluZGV4ID0gMDsgaW5zdEluZGV4IDwgYmxvY2stPnNpemUoKTsgKytpbnN0
SW5kZXgpIHsKKyAgICAgICAgICAgICAgICBJbnN0JiBpbnN0ID0gYmxvY2stPmF0KGluc3RJbmRl
eCk7CisKKyAgICAgICAgICAgICAgICAvLyBUaGUgbWF5QmVDb2FsZXNjYWJsZSgpIG1ldGhvZCB3
aWxsIGNoYW5nZSBpdHMgbWluZCBmb3Igc29tZSBvcGVyYXRpb25zIGFmdGVyIHdlCisgICAgICAg
ICAgICAgICAgLy8gY29tcGxldGUgcmVnaXN0ZXIgYWxsb2NhdGlvbi4gU28sIHdlIHJlY29yZCB0
aGlzIGJlZm9yZSBzdGFydGluZy4KKyAgICAgICAgICAgICAgICBib29sIG1heUJlQ29hbGVzY2Fi
bGUgPSBhbGxvY2F0b3IubWF5QmVDb2FsZXNjYWJsZShpbnN0KTsKKworICAgICAgICAgICAgICAg
IC8vIE1vdmUzMiBpcyBjaGVhcGVyIGlmIHdlIGtub3cgdGhhdCBpdCdzIGVxdWl2YWxlbnQgdG8g
YSBNb3ZlLiBJdCdzCisgICAgICAgICAgICAgICAgLy8gZXF1aXZhbGVudCBpZiB0aGUgZGVzdGlu
YXRpb24ncyBoaWdoIGJpdHMgYXJlIG5vdCBvYnNlcnZhYmxlIG9yIGlmIHRoZSBzb3VyY2UncyBo
aWdoCisgICAgICAgICAgICAgICAgLy8gYml0cyBhcmUgYWxsIHplcm8uIE5vdGUgdGhhdCB3ZSBk
b24ndCBoYXZlIHRoZSBvcHBvc2l0ZSBvcHRpbWl6YXRpb24gZm9yIG90aGVyCisgICAgICAgICAg
ICAgICAgLy8gYXJjaGl0ZWN0dXJlcywgd2hpY2ggbWF5IHByZWZlciBNb3ZlIG92ZXIgTW92ZTMy
LCBiZWNhdXNlIE1vdmUgaXMgY2Fub25pY2FsIGFscmVhZHkuCisgICAgICAgICAgICAgICAgaWYg
KHR5cGUgPT0gQXJnOjpHUCAmJiBpbnN0LmtpbmQub3Bjb2RlID09IE1vdmUKKyAgICAgICAgICAg
ICAgICAgICAgJiYgaW5zdC5hcmdzWzBdLmlzVG1wKCkgJiYgaW5zdC5hcmdzWzFdLmlzVG1wKCkp
IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdG1wV2lkdGgudXNlV2lkdGgoaW5zdC5hcmdz
WzFdLnRtcCgpKSA8PSBBcmc6OldpZHRoMzIKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1f
dG1wV2lkdGguZGVmV2lkdGgoaW5zdC5hcmdzWzBdLnRtcCgpKSA8PSBBcmc6OldpZHRoMzIpCisg
ICAgICAgICAgICAgICAgICAgICAgICBpbnN0LmtpbmQub3Bjb2RlID0gTW92ZTMyOworICAgICAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGluc3QuZm9yRWFjaFRtcEZhc3QoWyZdIChU
bXAmIHRtcCkgeworICAgICAgICAgICAgICAgICAgICBpZiAodG1wLmlzUmVnKCkgfHwgdG1wLmlz
R1AoKSA9PSAodHlwZSAhPSBBcmc6OkdQKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVy
bjsKKworICAgICAgICAgICAgICAgICAgICBUbXAgYWxpYXNUbXAgPSBhbGxvY2F0b3IuZ2V0QWxp
YXModG1wKTsKKyAgICAgICAgICAgICAgICAgICAgVG1wIGFzc2lnbmVkVG1wOworICAgICAgICAg
ICAgICAgICAgICBpZiAoYWxpYXNUbXAuaXNSZWcoKSkKKyAgICAgICAgICAgICAgICAgICAgICAg
IGFzc2lnbmVkVG1wID0gVG1wKGFsaWFzVG1wLnJlZygpKTsKKyAgICAgICAgICAgICAgICAgICAg
ZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIHJlZyA9IGFsbG9jYXRvci5hbGxv
Y2F0ZWRSZWcoYWxpYXNUbXApOworICAgICAgICAgICAgICAgICAgICAgICAgQVNTRVJUKHJlZyk7
CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZFRtcCA9IFRtcChyZWcpOworICAgICAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEFTU0VSVChhc3NpZ25lZFRtcC5p
c1JlZygpKTsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gYXNzaWduZWRUbXA7CisgICAgICAg
ICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgICBpZiAobWF5QmVDb2FsZXNjYWJsZSAmJiBp
bnN0LmFyZ3NbMF0uaXNUbXAoKSAmJiBpbnN0LmFyZ3NbMV0uaXNUbXAoKQorICAgICAgICAgICAg
ICAgICAgICAmJiBpbnN0LmFyZ3NbMF0udG1wKCkgPT0gaW5zdC5hcmdzWzFdLnRtcCgpKQorICAg
ICAgICAgICAgICAgICAgICBpbnN0ID0gSW5zdCgpOworICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICAvLyBSZW1vdmUgYWxsIHRoZSB1c2VsZXNzIG1vdmVzIHdlIGNyZWF0ZWQgaW4gdGhpcyBi
bG9jay4KKyAgICAgICAgICAgIGJsb2NrLT5pbnN0cygpLnJlbW92ZUFsbE1hdGNoaW5nKFsmXSAo
Y29uc3QgSW5zdCYgaW5zdCkgeworICAgICAgICAgICAgICAgIHJldHVybiAhaW5zdDsKKyAgICAg
ICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIHVuc2lnbmVkIHN0YWNr
U2xvdE1pbmltdW1XaWR0aChBcmc6OldpZHRoIHdpZHRoKQorICAgIHsKKyAgICAgICAgcmV0dXJu
IHdpZHRoIDw9IEFyZzo6V2lkdGgzMiA/IDQgOiA4OworICAgIH0KKworICAgIHRlbXBsYXRlPEFy
Zzo6VHlwZSB0eXBlPgorICAgIHZvaWQgYWRkU3BpbGxBbmRGaWxsKGNvbnN0IENvbG9yaW5nQWxs
b2NhdG9yPHR5cGU+JiBhbGxvY2F0b3IsIEhhc2hTZXQ8dW5zaWduZWQ+JiB1bnNwaWxsYWJsZVRt
cHMpCisgICAgeworICAgICAgICBIYXNoTWFwPFRtcCwgU3RhY2tTbG90Kj4gc3RhY2tTbG90czsK
KyAgICAgICAgZm9yIChUbXAgdG1wIDogYWxsb2NhdG9yLnNwaWxsZWRUbXBzKCkpIHsKKyAgICAg
ICAgICAgIC8vIEFsbCB0aGUgc3BpbGxlZCB2YWx1ZXMgYmVjb21lIHVuc3BpbGxhYmxlLgorICAg
ICAgICAgICAgdW5zcGlsbGFibGVUbXBzLmFkZChBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJz
b2x1dGVJbmRleCh0bXApKTsKKworICAgICAgICAgICAgLy8gQWxsb2NhdGUgc3RhY2sgc2xvdCBm
b3IgZWFjaCBzcGlsbGVkIHZhbHVlLgorICAgICAgICAgICAgU3RhY2tTbG90KiBzdGFja1Nsb3Qg
PSBtX2NvZGUuYWRkU3RhY2tTbG90KAorICAgICAgICAgICAgICAgIHN0YWNrU2xvdE1pbmltdW1X
aWR0aChtX3RtcFdpZHRoLnJlcXVpcmVkV2lkdGgodG1wKSksIFN0YWNrU2xvdEtpbmQ6OlNwaWxs
KTsKKyAgICAgICAgICAgIGJvb2wgaXNOZXdUbXAgPSBzdGFja1Nsb3RzLmFkZCh0bXAsIHN0YWNr
U2xvdCkuaXNOZXdFbnRyeTsKKyAgICAgICAgICAgIEFTU0VSVF9VTlVTRUQoaXNOZXdUbXAsIGlz
TmV3VG1wKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJld3JpdGUgdGhlIHByb2dyYW0gdG8g
Z2V0IHJpZCBvZiB0aGUgc3BpbGxlZCBUbXAuCisgICAgICAgIEluc2VydGlvblNldCBpbnNlcnRp
b25TZXQobV9jb2RlKTsKKyAgICAgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6IG1fY29kZSkg
eworICAgICAgICAgICAgYm9vbCBoYXNBbGlhc2VkVG1wcyA9IGZhbHNlOworCisgICAgICAgICAg
ICBmb3IgKHVuc2lnbmVkIGluc3RJbmRleCA9IDA7IGluc3RJbmRleCA8IGJsb2NrLT5zaXplKCk7
ICsraW5zdEluZGV4KSB7CisgICAgICAgICAgICAgICAgSW5zdCYgaW5zdCA9IGJsb2NrLT5hdChp
bnN0SW5kZXgpOworCisgICAgICAgICAgICAgICAgLy8gVGhlIFRtcFdpZHRoIGFuYWx5c2lzIHdp
bGwgc2F5IHRoYXQgYSBNb3ZlIG9ubHkgc3RvcmVzIDMyIGJpdHMgaW50byB0aGUgZGVzdGluYXRp
b24sCisgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHNvdXJjZSBvbmx5IGhhZCAzMiBiaXRzIHdv
cnRoIG9mIG5vbi16ZXJvIGJpdHMuIFNhbWUgZm9yIHRoZSBzb3VyY2U6IGl0IHdpbGwKKyAgICAg
ICAgICAgICAgICAvLyBvbmx5IGNsYWltIHRvIHJlYWQgMzIgYml0cyBmcm9tIHRoZSBzb3VyY2Ug
aWYgb25seSAzMiBiaXRzIG9mIHRoZSBkZXN0aW5hdGlvbiBhcmUKKyAgICAgICAgICAgICAgICAv
LyByZWFkLiBOb3RlIHRoYXQgd2Ugb25seSBhcHBseSB0aGlzIGxvZ2ljIGlmIHRoaXMgdHVybnMg
aW50byBhIGxvYWQgb3Igc3RvcmUsIHNpbmNlCisgICAgICAgICAgICAgICAgLy8gTW92ZSBpcyB0
aGUgY2Fub25pY2FsIHdheSB0byBtb3ZlIGRhdGEgYmV0d2VlbiBHUFJzLgorICAgICAgICAgICAg
ICAgIGJvb2wgY2FuVXNlTW92ZTMySWZEaWRTcGlsbCA9IGZhbHNlOworICAgICAgICAgICAgICAg
IGJvb2wgZGlkU3BpbGwgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBBcmc6
OkdQICYmIGluc3Qua2luZC5vcGNvZGUgPT0gTW92ZSkgeworICAgICAgICAgICAgICAgICAgICBp
ZiAoKGluc3QuYXJnc1swXS5pc1RtcCgpICYmIG1fdG1wV2lkdGgud2lkdGgoaW5zdC5hcmdzWzBd
LnRtcCgpKSA8PSBBcmc6OldpZHRoMzIpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoaW5z
dC5hcmdzWzFdLmlzVG1wKCkgJiYgbV90bXBXaWR0aC53aWR0aChpbnN0LmFyZ3NbMV0udG1wKCkp
IDw9IEFyZzo6V2lkdGgzMikpCisgICAgICAgICAgICAgICAgICAgICAgICBjYW5Vc2VNb3ZlMzJJ
ZkRpZFNwaWxsID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAv
LyBUcnkgdG8gcmVwbGFjZSB0aGUgcmVnaXN0ZXIgdXNlIGJ5IG1lbW9yeSB1c2Ugd2hlbiBwb3Nz
aWJsZS4KKyAgICAgICAgICAgICAgICBpbnN0LmZvckVhY2hBcmcoCisgICAgICAgICAgICAgICAg
ICAgIFsmXSAoQXJnJiBhcmcsIEFyZzo6Um9sZSByb2xlLCBBcmc6OlR5cGUgYXJnVHlwZSwgQXJn
OjpXaWR0aCB3aWR0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhcmcuaXNUbXAo
KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAg
ICAgICAgICBpZiAoYXJnVHlwZSAhPSB0eXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmcuaXNSZWcoKSkKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICAK
KyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gc3RhY2tTbG90RW50cnkgPSBzdGFja1Nsb3Rz
LmZpbmQoYXJnLnRtcCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFja1Nsb3RF
bnRyeSA9PSBzdGFja1Nsb3RzLmVuZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJl
dHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5zdC5hZG1pdHNTdGFjayhhcmcp
KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIFRtcCBob2xkcyBhIGNv
bnN0YW50IHRoZW4gd2Ugd2FudCB0byByZW1hdGVyaWFsaXplIGl0cworICAgICAgICAgICAgICAg
ICAgICAgICAgLy8gdmFsdWUgcmF0aGVyIHRoYW4gbG9hZGluZyBpdCBmcm9tIHRoZSBzdGFjay4g
SW4gb3JkZXIgZm9yIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGltaXphdGlv
biB0byBraWNrIGluLCB3ZSBuZWVkIHRvIGF2b2lkIHBsYWNpbmcgdGhlIFRtcCdzIHN0YWNrCisg
ICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGRyZXNzIGludG8gdGhlIGluc3RydWN0aW9uLgor
ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBcmc6OmlzQ29sZFVzZShyb2xlKSkgeworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVzZUNvdW50czxUbXA+OjpDb3VudHMqIGNv
dW50cyA9IG1fdXNlQ291bnRzW2FyZy50bXAoKV07CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgaWYgKGNvdW50cyAmJiBjb3VudHMtPm51bUNvbnN0RGVmcyA9PSAxICYmIGNvdW50cy0+bnVt
RGVmcyA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAg
ICAgICAgICAgICAgICAgIEFyZzo6V2lkdGggc3BpbGxXaWR0aCA9IG1fdG1wV2lkdGgucmVxdWly
ZWRXaWR0aChhcmcudG1wKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFyZzo6aXNB
bnlEZWYocm9sZSkgJiYgd2lkdGggPCBzcGlsbFdpZHRoKQorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFTU0VSVChpbnN0LmtpbmQu
b3Bjb2RlID09IE1vdmUgfHwgIShBcmc6OmlzQW55VXNlKHJvbGUpICYmIHdpZHRoID4gc3BpbGxX
aWR0aCkpOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAg
ICBpZiAoc3BpbGxXaWR0aCAhPSBBcmc6OldpZHRoMzIpCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgY2FuVXNlTW92ZTMySWZEaWRTcGlsbCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAg
ICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBzdGFja1Nsb3RFbnRyeS0+dmFsdWUtPmVu
c3VyZVNpemUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuVXNlTW92ZTMySWZEaWRT
cGlsbCA/IDQgOiBBcmc6OmJ5dGVzKHdpZHRoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBh
cmcgPSBBcmc6OnN0YWNrKHN0YWNrU2xvdEVudHJ5LT52YWx1ZSk7CisgICAgICAgICAgICAgICAg
ICAgICAgICBkaWRTcGlsbCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAg
ICAgICAgICAgICAgaWYgKGRpZFNwaWxsICYmIGNhblVzZU1vdmUzMklmRGlkU3BpbGwpCisgICAg
ICAgICAgICAgICAgICAgIGluc3Qua2luZC5vcGNvZGUgPSBNb3ZlMzI7CisKKyAgICAgICAgICAg
ICAgICAvLyBGb3IgZXZlcnkgb3RoZXIgY2FzZSwgYWRkIExvYWQvU3RvcmUgYXMgbmVlZGVkLgor
ICAgICAgICAgICAgICAgIGluc3QuZm9yRWFjaFRtcChbJl0gKFRtcCYgdG1wLCBBcmc6OlJvbGUg
cm9sZSwgQXJnOjpUeXBlIGFyZ1R5cGUsIEFyZzo6V2lkdGgpIHsKKyAgICAgICAgICAgICAgICAg
ICAgaWYgKHRtcC5pc1JlZygpIHx8IGFyZ1R5cGUgIT0gdHlwZSkKKyAgICAgICAgICAgICAgICAg
ICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgICAgICAgICBhdXRvIHN0YWNrU2xvdEVudHJ5
ID0gc3RhY2tTbG90cy5maW5kKHRtcCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGFja1Ns
b3RFbnRyeSA9PSBzdGFja1Nsb3RzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBU
bXAgYWxpYXMgPSBhbGxvY2F0b3IuZ2V0QWxpYXNXaGVuU3BpbGxpbmcodG1wKTsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGlmIChhbGlhcyAhPSB0bXApIHsKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB0bXAgPSBhbGlhczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNBbGlh
c2VkVG1wcyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAg
ICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
ICAgICAgICBBcmc6OldpZHRoIHNwaWxsV2lkdGggPSBtX3RtcFdpZHRoLnJlcXVpcmVkV2lkdGgo
dG1wKTsKKyAgICAgICAgICAgICAgICAgICAgT3Bjb2RlIG1vdmUgPSBPb3BzOworICAgICAgICAg
ICAgICAgICAgICBzd2l0Y2ggKHN0YWNrU2xvdE1pbmltdW1XaWR0aChzcGlsbFdpZHRoKSkgewor
ICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBtb3Zl
ID0gdHlwZSA9PSBBcmc6OkdQID8gTW92ZTMyIDogTW92ZUZsb2F0OworICAgICAgICAgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAg
ICAgICAgICAgICAgIG1vdmUgPSB0eXBlID09IEFyZzo6R1AgPyBNb3ZlIDogTW92ZURvdWJsZTsK
KyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZh
dWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQo
KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gbV9jb2RlLm5ld1RtcCh0eXBlKTsKKyAgICAg
ICAgICAgICAgICAgICAgdW5zcGlsbGFibGVUbXBzLmFkZChBYnNvbHV0ZVRtcE1hcHBlcjx0eXBl
Pjo6YWJzb2x1dGVJbmRleCh0bXApKTsKKworICAgICAgICAgICAgICAgICAgICBBcmcgYXJnID0g
QXJnOjpzdGFjayhzdGFja1Nsb3RFbnRyeS0+dmFsdWUpOworICAgICAgICAgICAgICAgICAgICBp
ZiAoQXJnOjppc0FueVVzZShyb2xlKSAmJiByb2xlICE9IEFyZzo6U2NyYXRjaCkKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGluc2VydGlvblNldC5pbnNlcnQoaW5zdEluZGV4LCBtb3ZlLCBpbnN0
Lm9yaWdpbiwgYXJnLCB0bXApOworICAgICAgICAgICAgICAgICAgICBpZiAoQXJnOjppc0FueURl
Zihyb2xlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydGlvblNldC5pbnNlcnQoaW5z
dEluZGV4ICsgMSwgbW92ZSwgaW5zdC5vcmlnaW4sIHRtcCwgYXJnKTsKKyAgICAgICAgICAgICAg
ICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluc2VydGlvblNldC5leGVjdXRlKGJs
b2NrKTsKKworICAgICAgICAgICAgaWYgKGhhc0FsaWFzZWRUbXBzKSB7CisgICAgICAgICAgICAg
ICAgYmxvY2stPmluc3RzKCkucmVtb3ZlQWxsTWF0Y2hpbmcoWyZdIChjb25zdCBJbnN0JiBpbnN0
KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhbGxvY2F0b3IuaXNVc2VsZXNzTW92ZShp
bnN0KTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAg
IH0KKworICAgIHZvaWQgZml4U3BpbGxzQWZ0ZXJUZXJtaW5hbHMoKQorICAgIHsKKyAgICAgICAg
Ly8gQmVjYXVzZSB0aGVyZSBtYXkgYmUgdGVybWluYWxzIHRoYXQgcHJvZHVjZSB2YWx1ZXMsIElS
QyBtYXkKKyAgICAgICAgLy8gd2FudCB0byBzcGlsbCB0aG9zZSB0ZXJtaW5hbHMuIEl0J2xsIGhh
cHBlbiB0byBzcGlsbCBpdCBhZnRlcgorICAgICAgICAvLyB0aGUgdGVybWluYWwuIElmIHdlIGxl
ZnQgdGhlIGdyYXBoIGluIHRoaXMgc3RhdGUsIGl0J2QgYmUgaW52YWxpZAorICAgICAgICAvLyBi
ZWNhdXNlIGEgdGVybWluYWwgbXVzdCBiZSB0aGUgbGFzdCBpbnN0cnVjdGlvbiBpbiBhIGJsb2Nr
LgorICAgICAgICAvLyBXZSBmaXggdGhhdCBoZXJlLgorCisgICAgICAgIEluc2VydGlvblNldCBp
bnNlcnRpb25TZXQobV9jb2RlKTsKKworICAgICAgICBib29sIGFkZGVkQmxvY2tzID0gZmFsc2U7
CisKKyAgICAgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6IG1fY29kZSkgeworICAgICAgICAg
ICAgdW5zaWduZWQgdGVybWluYWxJbmRleCA9IGJsb2NrLT5zaXplKCk7CisgICAgICAgICAgICBi
b29sIGZvdW5kVGVybWluYWwgPSBmYWxzZTsKKyAgICAgICAgICAgIHdoaWxlICh0ZXJtaW5hbElu
ZGV4LS0pIHsKKyAgICAgICAgICAgICAgICBpZiAoYmxvY2stPmF0KHRlcm1pbmFsSW5kZXgpLmlz
VGVybWluYWwoKSkgeworICAgICAgICAgICAgICAgICAgICBmb3VuZFRlcm1pbmFsID0gdHJ1ZTsK
KyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgfQorICAgICAgICAgICAgQVNTRVJUX1VOVVNFRChmb3VuZFRlcm1pbmFsLCBmb3VuZFRlcm1p
bmFsKTsKKworICAgICAgICAgICAgaWYgKHRlcm1pbmFsSW5kZXggPT0gYmxvY2stPnNpemUoKSAt
IDEpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIC8vIFRoZXJlIG11
c3QgYmUgaW5zdHJ1Y3Rpb25zIGFmdGVyIHRoZSB0ZXJtaW5hbCBiZWNhdXNlIGl0J3Mgbm90IHRo
ZSBsYXN0IGluc3RydWN0aW9uLgorICAgICAgICAgICAgQVNTRVJUKHRlcm1pbmFsSW5kZXggPCBi
bG9jay0+c2l6ZSgpIC0gMSk7CisgICAgICAgICAgICBWZWN0b3I8SW5zdCwgMT4gaW5zdHNUb01v
dmU7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSB0ZXJtaW5hbEluZGV4ICsgMTsgaSA8
IGJsb2NrLT5zaXplKCk7IGkrKykKKyAgICAgICAgICAgICAgICBpbnN0c1RvTW92ZS5hcHBlbmQo
YmxvY2stPmF0KGkpKTsKKyAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJUKGluc3RzVG9Nb3ZlLnNp
emUoKSk7CisKKyAgICAgICAgICAgIGZvciAoRnJlcXVlbnRlZEJsb2NrJiBmcmVxdWVudGVkU3Vj
Y2Vzc29yIDogYmxvY2stPnN1Y2Nlc3NvcnMoKSkgeworICAgICAgICAgICAgICAgIEJhc2ljQmxv
Y2sqIHN1Y2Nlc3NvciA9IGZyZXF1ZW50ZWRTdWNjZXNzb3IuYmxvY2soKTsKKyAgICAgICAgICAg
ICAgICAvLyBJZiBzdWNjZXNzb3IncyBvbmx5IHByZWRlY2Vzc29yIGlzIGJsb2NrLCB3ZSBjYW4g
cGxhbnQgdGhlIHNwaWxsIGluc2lkZQorICAgICAgICAgICAgICAgIC8vIHRoZSBzdWNjZXNzb3Iu
IE90aGVyd2lzZSwgd2UgbXVzdCBzcGxpdCB0aGUgY3JpdGljYWwgZWRnZSBhbmQgY3JlYXRlCisg
ICAgICAgICAgICAgICAgLy8gYSBuZXcgYmxvY2sgZm9yIHRoZSBzcGlsbC4KKyAgICAgICAgICAg
ICAgICBpZiAoc3VjY2Vzc29yLT5udW1QcmVkZWNlc3NvcnMoKSA9PSAxKSB7CisgICAgICAgICAg
ICAgICAgICAgIGluc2VydGlvblNldC5pbnNlcnRJbnN0cygwLCBpbnN0c1RvTW92ZSk7CisgICAg
ICAgICAgICAgICAgICAgIGluc2VydGlvblNldC5leGVjdXRlKHN1Y2Nlc3Nvcik7CisgICAgICAg
ICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkZWRCbG9ja3MgPSB0cnVl
OworICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogV2UgcHJvYmFibHkgd2FudCBiZXR0ZXIg
YmxvY2sgb3JkZXJpbmcgaGVyZS4KKyAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayogbmV3
QmxvY2sgPSBtX2NvZGUuYWRkQmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChjb25z
dCBJbnN0JiBpbnN0IDogaW5zdHNUb01vdmUpCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdC
bG9jay0+YXBwZW5kSW5zdChpbnN0KTsKKyAgICAgICAgICAgICAgICAgICAgbmV3QmxvY2stPmFw
cGVuZEluc3QoSW5zdChKdW1wLCBpbnN0c1RvTW92ZS5sYXN0KCkub3JpZ2luKSk7CisgICAgICAg
ICAgICAgICAgICAgIG5ld0Jsb2NrLT5zdWNjZXNzb3JzKCkuYXBwZW5kKHN1Y2Nlc3Nvcik7Cisg
ICAgICAgICAgICAgICAgICAgIGZyZXF1ZW50ZWRTdWNjZXNzb3IuYmxvY2soKSA9IG5ld0Jsb2Nr
OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmxvY2st
PnJlc2l6ZSh0ZXJtaW5hbEluZGV4ICsgMSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYWRk
ZWRCbG9ja3MpCisgICAgICAgICAgICBtX2NvZGUucmVzZXRSZWFjaGFiaWxpdHkoKTsKKyAgICB9
CisKKyAgICBDb2RlJiBtX2NvZGU7CisgICAgVG1wV2lkdGggbV90bXBXaWR0aDsKKyAgICBVc2VD
b3VudHM8VG1wPiBtX3VzZUNvdW50czsKKyAgICB1bnNpZ25lZCBtX251bUl0ZXJhdGlvbnMgeyAw
IH07Cit9OworCit9IC8vIGFub255bW91cyBuYW1lc3BhY2UKKwordm9pZCBpdGVyYXRlZFJlZ2lz
dGVyQ29hbGVzY2luZyhDb2RlJiBjb2RlKQoreworICAgIFBoYXNlU2NvcGUgcGhhc2VTY29wZShj
b2RlLCAiaXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmciKTsKKyAgICAKKyAgICBJdGVyYXRlZFJl
Z2lzdGVyQ29hbGVzY2luZyBpdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZyhjb2RlKTsKKyAgICBp
dGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5ydW4oKTsKK30KKworfSB9IH0gLy8gbmFtZXNwYWNl
IEpTQzo6QjM6OkFpcgorCisjZW5kaWYgLy8gRU5BQkxFKEIzX0pJVCkKSW5kZXg6IFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyUmVnaXN0ZXJBbGxvY2F0b3IuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyUmVnaXN0ZXJBbGxvY2F0b3IuY3Bw
CShyZXZpc2lvbiAyMTI2NjYpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclJl
Z2lzdGVyQWxsb2NhdG9yLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjQsNyArMjQsNyBAQAogICov
CiAKICNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJBaXJJdGVyYXRlZFJlZ2lzdGVyQ29h
bGVzY2luZy5oIgorI2luY2x1ZGUgIkFpclJlZ2lzdGVyQWxsb2NhdG9yLmgiCiAKICNpZiBFTkFC
TEUoQjNfSklUKQogCkBAIC00OSwxMyArNDksMTUgQEAgYm9vbCByZXBvcnRTdGF0cyA9IGZhbHNl
OwogCiAvLyBUaGUgQWJzdHJhY3RDb2xvcmluZ0FsbG9jYXRvciBkZWZpbmVzIGFsbCB0aGUgY29k
ZSB0aGF0IGlzIGluZGVwZW5kYW50CiAvLyBmcm9tIHRoZSB0eXBlIG9yIHJlZ2lzdGVyIGFuZCBj
YW4gYmUgc2hhcmVkIHdoZW4gYWxsb2NhdGluZyByZWdpc3RlcnMuCi10ZW1wbGF0ZTx0eXBlbmFt
ZSBJbmRleFR5cGU+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleFR5cGUsIHR5cGVuYW1lIFRtcE1h
cHBlcj4KIGNsYXNzIEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0b3IgewogcHVibGljOgotICAgIEFi
c3RyYWN0Q29sb3JpbmdBbGxvY2F0b3IoY29uc3QgVmVjdG9yPFJlZz4mIHJlZ3NJblByaW9yaXR5
T3JkZXIsIEluZGV4VHlwZSBsYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXgsIHVuc2lnbmVkIHRt
cEFycmF5U2l6ZSwgY29uc3QgSGFzaFNldDx1bnNpZ25lZD4mIHVuc3BpbGxhYmxlVG1wKQorICAg
IEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0b3IoQ29kZSYgY29kZSwgY29uc3QgVmVjdG9yPFJlZz4m
IHJlZ3NJblByaW9yaXR5T3JkZXIsIEluZGV4VHlwZSBsYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5k
ZXgsIHVuc2lnbmVkIHRtcEFycmF5U2l6ZSwgY29uc3QgSGFzaFNldDx1bnNpZ25lZD4mIHVuc3Bp
bGxhYmxlVG1wcywgY29uc3QgVXNlQ291bnRzPFRtcD4mIHVzZUNvdW50cykKICAgICAgICAgOiBt
X3JlZ3NJblByaW9yaXR5T3JkZXIocmVnc0luUHJpb3JpdHlPcmRlcikKICAgICAgICAgLCBtX2xh
c3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleChsYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXgpCi0g
ICAgICAgICwgbV91bnNwaWxsYWJsZVRtcHModW5zcGlsbGFibGVUbXApCisgICAgICAgICwgbV91
bnNwaWxsYWJsZVRtcHModW5zcGlsbGFibGVUbXBzKQorICAgICAgICAsIG1fdXNlQ291bnRzKHVz
ZUNvdW50cykKKyAgICAgICAgLCBtX2NvZGUoY29kZSkKICAgICB7CiAgICAgICAgIGZvciAoUmVn
IHJlZyA6IG1fcmVnc0luUHJpb3JpdHlPcmRlcikKICAgICAgICAgICAgIG1fbXV0YWJsZVJlZ3Mu
c2V0KHJlZyk7CkBAIC02Niw5ICs2OCwxMyBAQCBwdWJsaWM6CiAgICAgICAgIG1fbW92ZUxpc3Qu
cmVzaXplKHRtcEFycmF5U2l6ZSk7CiAgICAgICAgIG1fY29hbGVzY2VkVG1wcy5maWxsKDAsIHRt
cEFycmF5U2l6ZSk7CiAgICAgICAgIG1faXNPblNlbGVjdFN0YWNrLmVuc3VyZVNpemUodG1wQXJy
YXlTaXplKTsKKyAgICAgICAgbV9zcGlsbFdvcmtsaXN0LmVuc3VyZVNpemUodG1wQXJyYXlTaXpl
KTsKICAgICB9CiAKIHByb3RlY3RlZDoKKworICAgIHVuc2lnbmVkIHJlZ2lzdGVyQ291bnQoKSBj
b25zdCB7IHJldHVybiBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpOyB9CisKICAgICBJbmRl
eFR5cGUgZ2V0QWxpYXMoSW5kZXhUeXBlIHRtcEluZGV4KSBjb25zdAogICAgIHsKICAgICAgICAg
SW5kZXhUeXBlIGFsaWFzID0gdG1wSW5kZXg7CkBAIC04NCwyMCArOTAsNiBAQCBwcm90ZWN0ZWQ6
CiAgICAgICAgIGFkZEVkZ2VEaXN0aW5jdChhLCBiKTsKICAgICB9CiAKLSAgICB2b2lkIG1ha2VX
b3JrTGlzdCgpCi0gICAgewotICAgICAgICBJbmRleFR5cGUgZmlyc3ROb25SZWdJbmRleCA9IG1f
bGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4ICsgMTsKLSAgICAgICAgZm9yIChJbmRleFR5cGUg
aSA9IGZpcnN0Tm9uUmVnSW5kZXg7IGkgPCBtX2RlZ3JlZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAg
ICAgICAgIHVuc2lnbmVkIGRlZ3JlZSA9IG1fZGVncmVlc1tpXTsKLSAgICAgICAgICAgIGlmIChk
ZWdyZWUgPj0gbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKSkKLSAgICAgICAgICAgICAgICBh
ZGRUb1NwaWxsKGkpOwotICAgICAgICAgICAgZWxzZSBpZiAoIW1fbW92ZUxpc3RbaV0uaXNFbXB0
eSgpKQotICAgICAgICAgICAgICAgIG1fZnJlZXplV29ya2xpc3QuYWRkKGkpOwotICAgICAgICAg
ICAgZWxzZQotICAgICAgICAgICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5hcHBlbmQoaSk7Ci0g
ICAgICAgIH0KLSAgICB9Ci0KICAgICB2b2lkIGFkZFRvU3BpbGwodW5zaWduZWQgdG9TcGlsbCkK
ICAgICB7CiAgICAgICAgIGlmIChtX3Vuc3BpbGxhYmxlVG1wcy5jb250YWlucyh0b1NwaWxsKSkK
QEAgLTEwNiwxNDcgKzk4LDExIEBAIHByb3RlY3RlZDoKICAgICAgICAgbV9zcGlsbFdvcmtsaXN0
LmFkZCh0b1NwaWxsKTsKICAgICB9CiAKLSAgICAvLyBMb3ctZGVncmVlIHZlcnRleCBjYW4gYWx3
YXlzIGJlIGNvbG9yZWQ6IGp1c3QgcGljayBhbnkgb2YgdGhlIGNvbG9yIHRha2VuIGJ5IGFueQot
ICAgIC8vIG90aGVyIGFkamFjZW50IHZlcmljZXMuCi0gICAgLy8gVGhlICJTaW1wbGlmeSIgcGhh
c2UgdGFrZXMgYSBsb3ctZGVncmVlIG91dCBvZiB0aGUgaW50ZXJmZXJlbmNlIGdyYXBoIHRvIHNp
bXBsaWZ5IGl0LgotICAgIHZvaWQgc2ltcGxpZnkoKQotICAgIHsKLSAgICAgICAgSW5kZXhUeXBl
IGxhc3RJbmRleCA9IG1fc2ltcGxpZnlXb3JrbGlzdC50YWtlTGFzdCgpOwotCi0gICAgICAgIEFT
U0VSVCghbV9zZWxlY3RTdGFjay5jb250YWlucyhsYXN0SW5kZXgpKTsKLSAgICAgICAgQVNTRVJU
KCFtX2lzT25TZWxlY3RTdGFjay5nZXQobGFzdEluZGV4KSk7Ci0gICAgICAgIG1fc2VsZWN0U3Rh
Y2suYXBwZW5kKGxhc3RJbmRleCk7Ci0gICAgICAgIG1faXNPblNlbGVjdFN0YWNrLnF1aWNrU2V0
KGxhc3RJbmRleCk7Ci0KLSAgICAgICAgZm9yRWFjaEFkamFjZW50KGxhc3RJbmRleCwgW3RoaXNd
KEluZGV4VHlwZSBhZGphY2VudFRtcEluZGV4KSB7Ci0gICAgICAgICAgICBkZWNyZW1lbnREZWdy
ZWUoYWRqYWNlbnRUbXBJbmRleCk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHZvaWQgZnJl
ZXplKCkKLSAgICB7Ci0gICAgICAgIEluZGV4VHlwZSB2aWN0aW1JbmRleCA9IG1fZnJlZXplV29y
a2xpc3QudGFrZUFueSgpOwotICAgICAgICBBU1NFUlRfV0lUSF9NRVNTQUdFKGdldEFsaWFzKHZp
Y3RpbUluZGV4KSA9PSB2aWN0aW1JbmRleCwgImNvYWxlc2NlKCkgc2hvdWxkIG5vdCBsZWF2ZSBh
bGlhc2VkIFRtcCBpbiB0aGUgd29ya2xpc3QuIik7Ci0gICAgICAgIG1fc2ltcGxpZnlXb3JrbGlz
dC5hcHBlbmQodmljdGltSW5kZXgpOwotICAgICAgICBmcmVlemVNb3Zlcyh2aWN0aW1JbmRleCk7
Ci0gICAgfQotCi0gICAgdm9pZCBmcmVlemVNb3ZlcyhJbmRleFR5cGUgdG1wSW5kZXgpCi0gICAg
ewotICAgICAgICBmb3JFYWNoTm9kZU1vdmVzKHRtcEluZGV4LCBbdGhpcywgdG1wSW5kZXhdIChJ
bmRleFR5cGUgbW92ZUluZGV4KSB7Ci0gICAgICAgICAgICBpZiAoIW1fYWN0aXZlTW92ZXMucXVp
Y2tDbGVhcihtb3ZlSW5kZXgpKQotICAgICAgICAgICAgICAgIG1fd29ya2xpc3RNb3Zlcy50YWtl
TW92ZShtb3ZlSW5kZXgpOwotCi0gICAgICAgICAgICBjb25zdCBNb3ZlT3BlcmFuZHMmIG1vdmVP
cGVyYW5kcyA9IG1fY29hbGVzY2luZ0NhbmRpZGF0ZXNbbW92ZUluZGV4XTsKLSAgICAgICAgICAg
IEluZGV4VHlwZSBzcmNUbXBJbmRleCA9IG1vdmVPcGVyYW5kcy5zcmNJbmRleDsKLSAgICAgICAg
ICAgIEluZGV4VHlwZSBkc3RUbXBJbmRleCA9IG1vdmVPcGVyYW5kcy5kc3RJbmRleDsKLQotICAg
ICAgICAgICAgSW5kZXhUeXBlIG9yaWdpbmFsT3RoZXJUbXAgPSBzcmNUbXBJbmRleCAhPSB0bXBJ
bmRleCA/IHNyY1RtcEluZGV4IDogZHN0VG1wSW5kZXg7Ci0gICAgICAgICAgICBJbmRleFR5cGUg
b3RoZXJUbXBJbmRleCA9IGdldEFsaWFzKG9yaWdpbmFsT3RoZXJUbXApOwotICAgICAgICAgICAg
aWYgKG1fZGVncmVlc1tvdGhlclRtcEluZGV4XSA8IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXpl
KCkgJiYgIWlzTW92ZVJlbGF0ZWQob3RoZXJUbXBJbmRleCkpIHsKLSAgICAgICAgICAgICAgICBp
ZiAobV9mcmVlemVXb3JrbGlzdC5yZW1vdmUob3RoZXJUbXBJbmRleCkpCi0gICAgICAgICAgICAg
ICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5hcHBlbmQob3RoZXJUbXBJbmRleCk7Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHZvaWQgY29hbGVzY2UoKQotICAgIHsK
LSAgICAgICAgdW5zaWduZWQgbW92ZUluZGV4ID0gbV93b3JrbGlzdE1vdmVzLnRha2VMYXN0TW92
ZSgpOwotICAgICAgICBjb25zdCBNb3ZlT3BlcmFuZHMmIG1vdmVPcGVyYW5kcyA9IG1fY29hbGVz
Y2luZ0NhbmRpZGF0ZXNbbW92ZUluZGV4XTsKLSAgICAgICAgSW5kZXhUeXBlIHUgPSBnZXRBbGlh
cyhtb3ZlT3BlcmFuZHMuc3JjSW5kZXgpOwotICAgICAgICBJbmRleFR5cGUgdiA9IGdldEFsaWFz
KG1vdmVPcGVyYW5kcy5kc3RJbmRleCk7Ci0KLSAgICAgICAgaWYgKGlzUHJlY29sb3JlZCh2KSkK
LSAgICAgICAgICAgIHN0ZDo6c3dhcCh1LCB2KTsKLQotICAgICAgICBpZiAodHJhY2VEZWJ1ZykK
LSAgICAgICAgICAgIGRhdGFMb2coIkNvYWxlc2NpbmcgbW92ZSBhdCBpbmRleCAiLCBtb3ZlSW5k
ZXgsICIgdSA9ICIsIHUsICIgdiA9ICIsIHYsICJcbiIpOwotCi0gICAgICAgIGlmICh1ID09IHYp
IHsKLSAgICAgICAgICAgIGFkZFdvcmtMaXN0KHUpOwotCi0gICAgICAgICAgICBpZiAodHJhY2VE
ZWJ1ZykKLSAgICAgICAgICAgICAgICBkYXRhTG9nKCIgICAgQ29hbGVzY2VkXG4iKTsKLSAgICAg
ICAgfSBlbHNlIGlmIChpc1ByZWNvbG9yZWQodikKLSAgICAgICAgICAgIHx8IG1faW50ZXJmZXJl
bmNlRWRnZXMuY29udGFpbnMoSW50ZXJmZXJlbmNlRWRnZSh1LCB2KSkKLSAgICAgICAgICAgIHx8
ICh1ID09IG1fZnJhbWVQb2ludGVySW5kZXggJiYgbV9pbnRlcmZlcmVzV2l0aEZyYW1lUG9pbnRl
ci5xdWlja0dldCh2KSkpIHsKLSAgICAgICAgICAgIGFkZFdvcmtMaXN0KHUpOwotICAgICAgICAg
ICAgYWRkV29ya0xpc3Qodik7Ci0KLSAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQotICAgICAg
ICAgICAgICAgIGRhdGFMb2coIiAgICBDb25zdHJhaW5lZFxuIik7Ci0gICAgICAgIH0gZWxzZSBp
ZiAoY2FuQmVTYWZlbHlDb2FsZXNjZWQodSwgdikpIHsKLSAgICAgICAgICAgIGNvbWJpbmUodSwg
dik7Ci0gICAgICAgICAgICBhZGRXb3JrTGlzdCh1KTsKLSAgICAgICAgICAgIG1faGFzQ29hbGVz
Y2VkTm9uVHJpdmlhbE1vdmUgPSB0cnVlOwotCi0gICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykK
LSAgICAgICAgICAgICAgICBkYXRhTG9nKCIgICAgU2FmZSBDb2FsZXNjaW5nXG4iKTsKLSAgICAg
ICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fYWN0aXZlTW92ZXMucXVpY2tTZXQobW92ZUluZGV4
KTsKLQotICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpCi0gICAgICAgICAgICAgICAgZGF0YUxv
ZygiICAgIEZhaWxlZCBjb2FsZXNjaW5nLCBhZGRlZCB0byBhY3RpdmUgbW92ZXMuXG4iKTsKLSAg
ICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgYXNzaWduQ29sb3JzKCkKKyAgICBib29sIGlzUHJl
Y29sb3JlZChJbmRleFR5cGUgdG1wSW5kZXgpCiAgICAgewotICAgICAgICBBU1NFUlQobV9zaW1w
bGlmeVdvcmtsaXN0LmlzRW1wdHkoKSk7Ci0gICAgICAgIEFTU0VSVChtX3dvcmtsaXN0TW92ZXMu
aXNFbXB0eSgpKTsKLSAgICAgICAgQVNTRVJUKG1fZnJlZXplV29ya2xpc3QuaXNFbXB0eSgpKTsK
LSAgICAgICAgQVNTRVJUKG1fc3BpbGxXb3JrbGlzdC5pc0VtcHR5KCkpOwotCi0gICAgICAgIC8v
IFJlY2xhaW0gYXMgbXVjaCBtZW1vcnkgYXMgcG9zc2libGUuCi0gICAgICAgIG1faW50ZXJmZXJl
bmNlRWRnZXMuY2xlYXIoKTsKLSAgICAgICAgbV9kZWdyZWVzLmNsZWFyKCk7Ci0gICAgICAgIG1f
bW92ZUxpc3QuY2xlYXIoKTsKLSAgICAgICAgbV93b3JrbGlzdE1vdmVzLmNsZWFyKCk7Ci0gICAg
ICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5jbGVhcigpOwotICAgICAgICBtX3NwaWxsV29ya2xpc3Qu
Y2xlYXIoKTsKLSAgICAgICAgbV9mcmVlemVXb3JrbGlzdC5jbGVhcigpOwotCi0gICAgICAgIC8v
IFRyeSB0byBjb2xvciB0aGUgVG1wIG9uIHRoZSBzdGFjay4KLSAgICAgICAgbV9jb2xvcmVkVG1w
LnJlc2l6ZShtX2FkamFjZW5jeUxpc3Quc2l6ZSgpKTsKLQotICAgICAgICB3aGlsZSAoIW1fc2Vs
ZWN0U3RhY2suaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICB1bnNpZ25lZCB0bXBJbmRleCA9IG1f
c2VsZWN0U3RhY2sudGFrZUxhc3QoKTsKLSAgICAgICAgICAgIEFTU0VSVCghaXNQcmVjb2xvcmVk
KHRtcEluZGV4KSk7Ci0gICAgICAgICAgICBBU1NFUlQoIW1fY29sb3JlZFRtcFt0bXBJbmRleF0p
OwotCi0gICAgICAgICAgICBSZWdpc3RlclNldCBjb2xvcmVkUmVnaXN0ZXJzOwotICAgICAgICAg
ICAgZm9yIChJbmRleFR5cGUgYWRqYWNlbnRUbXBJbmRleCA6IG1fYWRqYWNlbmN5TGlzdFt0bXBJ
bmRleF0pIHsKLSAgICAgICAgICAgICAgICBJbmRleFR5cGUgYWxpYXNUbXBJbmRleCA9IGdldEFs
aWFzKGFkamFjZW50VG1wSW5kZXgpOwotICAgICAgICAgICAgICAgIFJlZyByZWcgPSBtX2NvbG9y
ZWRUbXBbYWxpYXNUbXBJbmRleF07Ci0KLSAgICAgICAgICAgICAgICBBU1NFUlQoIWlzUHJlY29s
b3JlZChhbGlhc1RtcEluZGV4KSB8fCAoaXNQcmVjb2xvcmVkKGFsaWFzVG1wSW5kZXgpICYmIHJl
ZykpOwotCi0gICAgICAgICAgICAgICAgaWYgKHJlZykKLSAgICAgICAgICAgICAgICAgICAgY29s
b3JlZFJlZ2lzdGVycy5zZXQocmVnKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYm9v
bCBjb2xvckFzc2lnbmVkID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKFJlZyByZWcgOiBtX3Jl
Z3NJblByaW9yaXR5T3JkZXIpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWNvbG9yZWRSZWdpc3Rl
cnMuZ2V0KHJlZykpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9jb2xvcmVkVG1wW3RtcEluZGV4
XSA9IHJlZzsKLSAgICAgICAgICAgICAgICAgICAgY29sb3JBc3NpZ25lZCA9IHRydWU7Ci0gICAg
ICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0K
LQotICAgICAgICAgICAgaWYgKCFjb2xvckFzc2lnbmVkKQotICAgICAgICAgICAgICAgIG1fc3Bp
bGxlZFRtcHMuYXBwZW5kKHRtcEluZGV4KTsKLSAgICAgICAgfQotICAgICAgICBtX3NlbGVjdFN0
YWNrLmNsZWFyKCk7Ci0KLSAgICAgICAgaWYgKG1fc3BpbGxlZFRtcHMuaXNFbXB0eSgpKQotICAg
ICAgICAgICAgbV9jb2FsZXNjZWRUbXBzQXRTcGlsbC5jbGVhcigpOwotICAgICAgICBlbHNlCi0g
ICAgICAgICAgICBtX2NvbG9yZWRUbXAuY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIHRtcEluZGV4
IDw9IG1fbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4OwogICAgIH0KIAotcHJpdmF0ZToKICAg
ICB2b2lkIGluaXRpYWxpemVEZWdyZWVzKHVuc2lnbmVkIHRtcEFycmF5U2l6ZSkKICAgICB7CiAg
ICAgICAgIG1fZGVncmVlcy5yZXNpemUodG1wQXJyYXlTaXplKTsKQEAgLTI2Miw3ICsxMTgsOCBA
QCBwcml2YXRlOgogICAgIHZvaWQgYWRkRWRnZURpc3RpbmN0KEluZGV4VHlwZSBhLCBJbmRleFR5
cGUgYikKICAgICB7CiAgICAgICAgIEFTU0VSVChhICE9IGIpOwotICAgICAgICBpZiAobV9pbnRl
cmZlcmVuY2VFZGdlcy5hZGQoSW50ZXJmZXJlbmNlRWRnZShhLCBiKSkuaXNOZXdFbnRyeSkgewor
ICAgICAgICBib29sIGlzTmV3RWRnZSA9IGFkZEludGVyZmVyZW5jZUVkZ2UoSW50ZXJmZXJlbmNl
RWRnZShhLCBiKSk7CisgICAgICAgIGlmIChpc05ld0VkZ2UpIHsKICAgICAgICAgICAgIGlmICgh
aXNQcmVjb2xvcmVkKGEpKSB7CiAgICAgICAgICAgICAgICAgQVNTRVJUKCFtX2FkamFjZW5jeUxp
c3RbYV0uY29udGFpbnMoYikpOwogICAgICAgICAgICAgICAgIG1fYWRqYWNlbmN5TGlzdFthXS5h
cHBlbmQoYik7CkBAIC0yNzcsMjYgKzEzNCwxMSBAQCBwcml2YXRlOgogICAgICAgICB9CiAgICAg
fQogCi0gICAgdm9pZCBkZWNyZW1lbnREZWdyZWUoSW5kZXhUeXBlIHRtcEluZGV4KQotICAgIHsK
LSAgICAgICAgQVNTRVJUKG1fZGVncmVlc1t0bXBJbmRleF0pOwotCi0gICAgICAgIHVuc2lnbmVk
IG9sZERlZ3JlZSA9IG1fZGVncmVlc1t0bXBJbmRleF0tLTsKLSAgICAgICAgaWYgKG9sZERlZ3Jl
ZSA9PSBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBlbmFibGVN
b3Zlc09uVmFsdWVBbmRBZGphY2VudHModG1wSW5kZXgpOwotICAgICAgICAgICAgbV9zcGlsbFdv
cmtsaXN0LnJlbW92ZSh0bXBJbmRleCk7Ci0gICAgICAgICAgICBpZiAoaXNNb3ZlUmVsYXRlZCh0
bXBJbmRleCkpCi0gICAgICAgICAgICAgICAgbV9mcmVlemVXb3JrbGlzdC5hZGQodG1wSW5kZXgp
OwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5h
cHBlbmQodG1wSW5kZXgpOwotICAgICAgICB9Ci0gICAgfQotCi0KICAgICBib29sIGFkZEVkZ2VE
aXN0aW5jdFdpdGhvdXREZWdyZWVDaGFuZ2UoSW5kZXhUeXBlIGEsIEluZGV4VHlwZSBiKQogICAg
IHsKICAgICAgICAgQVNTRVJUKGEgIT0gYik7Ci0gICAgICAgIGlmIChtX2ludGVyZmVyZW5jZUVk
Z2VzLmFkZChJbnRlcmZlcmVuY2VFZGdlKGEsIGIpKS5pc05ld0VudHJ5KSB7CisgICAgICAgIGJv
b2wgaXNOZXdFZGdlID0gYWRkSW50ZXJmZXJlbmNlRWRnZShJbnRlcmZlcmVuY2VFZGdlKGEsIGIp
KTsKKyAgICAgICAgaWYgKGlzTmV3RWRnZSkgewogICAgICAgICAgICAgaWYgKCFpc1ByZWNvbG9y
ZWQoYSkpIHsKICAgICAgICAgICAgICAgICBBU1NFUlQoIW1fYWRqYWNlbmN5TGlzdFthXS5jb250
YWlucyhiKSk7CiAgICAgICAgICAgICAgICAgbV9hZGphY2VuY3lMaXN0W2FdLmFwcGVuZChiKTsK
QEAgLTMxMSwxNSArMTUzLDYgQEAgcHJpdmF0ZToKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAg
IH0KIAotICAgIGJvb2wgaXNNb3ZlUmVsYXRlZChJbmRleFR5cGUgdG1wSW5kZXgpCi0gICAgewot
ICAgICAgICBmb3IgKHVuc2lnbmVkIG1vdmVJbmRleCA6IG1fbW92ZUxpc3RbdG1wSW5kZXhdKSB7
Ci0gICAgICAgICAgICBpZiAobV9hY3RpdmVNb3Zlcy5xdWlja0dldChtb3ZlSW5kZXgpIHx8IG1f
d29ya2xpc3RNb3Zlcy5jb250YWlucyhtb3ZlSW5kZXgpKQotICAgICAgICAgICAgICAgIHJldHVy
biB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KICAgICB0
ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdGlvbj4KICAgICB2b2lkIGZvckVhY2hBZGphY2VudChJbmRl
eFR5cGUgdG1wSW5kZXgsIEZ1bmN0aW9uIGZ1bmN0aW9uKQogICAgIHsKQEAgLTMzMSw4MCArMTY0
LDEyIEBAIHByaXZhdGU6CiAKICAgICBib29sIGhhc0JlZW5TaW1wbGlmaWVkKEluZGV4VHlwZSB0
bXBJbmRleCkKICAgICB7Ci0gICAgICAgIHJldHVybiBtX2lzT25TZWxlY3RTdGFjay5xdWlja0dl
dCh0bXBJbmRleCkgfHwgISFtX2NvYWxlc2NlZFRtcHNbdG1wSW5kZXhdOwotICAgIH0KLQotICAg
IHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0aW9uPgotICAgIHZvaWQgZm9yRWFjaE5vZGVNb3ZlcyhJ
bmRleFR5cGUgdG1wSW5kZXgsIEZ1bmN0aW9uIGZ1bmN0aW9uKQotICAgIHsKLSAgICAgICAgZm9y
ICh1bnNpZ25lZCBtb3ZlSW5kZXggOiBtX21vdmVMaXN0W3RtcEluZGV4XSkgewotICAgICAgICAg
ICAgaWYgKG1fYWN0aXZlTW92ZXMucXVpY2tHZXQobW92ZUluZGV4KSB8fCBtX3dvcmtsaXN0TW92
ZXMuY29udGFpbnMobW92ZUluZGV4KSkKLSAgICAgICAgICAgICAgICBmdW5jdGlvbihtb3ZlSW5k
ZXgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBlbmFibGVNb3Zlc09uVmFsdWUoSW5k
ZXhUeXBlIHRtcEluZGV4KQotICAgIHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBtb3ZlSW5kZXgg
OiBtX21vdmVMaXN0W3RtcEluZGV4XSkgewotICAgICAgICAgICAgaWYgKG1fYWN0aXZlTW92ZXMu
cXVpY2tDbGVhcihtb3ZlSW5kZXgpKQotICAgICAgICAgICAgICAgIG1fd29ya2xpc3RNb3Zlcy5y
ZXR1cm5Nb3ZlKG1vdmVJbmRleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGVuYWJs
ZU1vdmVzT25WYWx1ZUFuZEFkamFjZW50cyhJbmRleFR5cGUgdG1wSW5kZXgpCi0gICAgewotICAg
ICAgICBlbmFibGVNb3Zlc09uVmFsdWUodG1wSW5kZXgpOwotCi0gICAgICAgIGZvckVhY2hBZGph
Y2VudCh0bXBJbmRleCwgW3RoaXNdIChJbmRleFR5cGUgYWRqYWNlbnRUbXBJbmRleCkgewotICAg
ICAgICAgICAgZW5hYmxlTW92ZXNPblZhbHVlKGFkamFjZW50VG1wSW5kZXgpOwotICAgICAgICB9
KTsKLSAgICB9Ci0KLSAgICBib29sIGlzUHJlY29sb3JlZChJbmRleFR5cGUgdG1wSW5kZXgpCi0g
ICAgewotICAgICAgICByZXR1cm4gdG1wSW5kZXggPD0gbV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVy
SW5kZXg7Ci0gICAgfQotCi0gICAgdm9pZCBhZGRXb3JrTGlzdChJbmRleFR5cGUgdG1wSW5kZXgp
Ci0gICAgewotICAgICAgICBpZiAoIWlzUHJlY29sb3JlZCh0bXBJbmRleCkgJiYgbV9kZWdyZWVz
W3RtcEluZGV4XSA8IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkgJiYgIWlzTW92ZVJlbGF0
ZWQodG1wSW5kZXgpKSB7Ci0gICAgICAgICAgICBtX2ZyZWV6ZVdvcmtsaXN0LnJlbW92ZSh0bXBJ
bmRleCk7Ci0gICAgICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuYXBwZW5kKHRtcEluZGV4KTsK
KyAgICAgICAgaWYgKCFBU1NFUlRfRElTQUJMRUQpIHsKKyAgICAgICAgICAgIGlmICghIW1fY29h
bGVzY2VkVG1wc1t0bXBJbmRleF0pCisgICAgICAgICAgICAgICAgQVNTRVJUKGdldEFsaWFzKHRt
cEluZGV4KSAhPSB0bXBJbmRleCk7CiAgICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGNvbWJp
bmUoSW5kZXhUeXBlIHUsIEluZGV4VHlwZSB2KQotICAgIHsKLSAgICAgICAgaWYgKCFtX2ZyZWV6
ZVdvcmtsaXN0LnJlbW92ZSh2KSkKLSAgICAgICAgICAgIG1fc3BpbGxXb3JrbGlzdC5yZW1vdmUo
dik7Ci0KLSAgICAgICAgQVNTRVJUKCFtX2NvYWxlc2NlZFRtcHNbdl0pOwotICAgICAgICBtX2Nv
YWxlc2NlZFRtcHNbdl0gPSB1OwotCi0gICAgICAgIGF1dG8mIHZNb3ZlcyA9IG1fbW92ZUxpc3Rb
dl07Ci0gICAgICAgIG1fbW92ZUxpc3RbdV0uYWRkKHZNb3Zlcy5iZWdpbigpLCB2TW92ZXMuZW5k
KCkpOwotCi0gICAgICAgIGZvckVhY2hBZGphY2VudCh2LCBbdGhpcywgdV0gKEluZGV4VHlwZSBh
ZGphY2VudFRtcEluZGV4KSB7Ci0gICAgICAgICAgICBpZiAoYWRkRWRnZURpc3RpbmN0V2l0aG91
dERlZ3JlZUNoYW5nZShhZGphY2VudFRtcEluZGV4LCB1KSkgewotICAgICAgICAgICAgICAgIC8v
IElmIHdlIGFkZGVkIGEgbmV3IGVkZ2UgYmV0d2VlbiB0aGUgYWRqYWNlbnRUbXAgYW5kIHUsIGl0
IHJlcGxhY2VzIHRoZSBlZGdlCi0gICAgICAgICAgICAgICAgLy8gdGhhdCBleGlzdGVkIHdpdGgg
di4KLSAgICAgICAgICAgICAgICAvLyBUaGUgZGVncmVlIG9mIGFkamFjZW50VG1wIHJlbWFpbnMg
dGhlIHNhbWUgc2luY2UgdGhlIGVkZ2UganVzdCBjaGFuZ2VkIGZyb20gdSB0byB2LgotICAgICAg
ICAgICAgICAgIC8vIEFsbCB3ZSBuZWVkIHRvIGRvIGlzIHVwZGF0ZSB0aGUgZGVncmVlIG9mIHUu
Ci0gICAgICAgICAgICAgICAgaWYgKCFpc1ByZWNvbG9yZWQodSkpCi0gICAgICAgICAgICAgICAg
ICAgIG1fZGVncmVlc1t1XSsrOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAg
ICAvLyBJZiB3ZSBhbHJlYWR5IGhhZCBhbiBlZGdlIGJldHdlZW4gdGhlIGFkamFjZW50VG1wIGFu
ZCB1LCB0aGUgZGVncmVlIG9mIHUKLSAgICAgICAgICAgICAgICAvLyBpcyBhbHJlYWR5IGNvcnJl
Y3QuIFRoZSBkZWdyZWUgb2YgdGhlIGFkamFjZW50VG1wIGRlY3JlYXNlcyBzaW5jZSB0aGUgZWRn
ZQotICAgICAgICAgICAgICAgIC8vIHdpdGggdiBpcyBubyBsb25nZXIgcmVsZXZhbnQgKHdlIGNh
biB0aGluayBvZiBpdCBhcyBtZXJnZWQgd2l0aCB0aGUgZWRnZSB3aXRoIHUpLgotICAgICAgICAg
ICAgICAgIGRlY3JlbWVudERlZ3JlZShhZGphY2VudFRtcEluZGV4KTsKLSAgICAgICAgICAgIH0K
LSAgICAgICAgfSk7Ci0KLSAgICAgICAgaWYgKG1fZnJhbWVQb2ludGVySW5kZXggJiYgbV9pbnRl
cmZlcmVzV2l0aEZyYW1lUG9pbnRlci5xdWlja0dldCh2KSkKLSAgICAgICAgICAgIG1faW50ZXJm
ZXJlc1dpdGhGcmFtZVBvaW50ZXIucXVpY2tTZXQodSk7CiAKLSAgICAgICAgaWYgKG1fZGVncmVl
c1t1XSA+PSBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpICYmIG1fZnJlZXplV29ya2xpc3Qu
cmVtb3ZlKHUpKQotICAgICAgICAgICAgYWRkVG9TcGlsbCh1KTsKKyAgICAgICAgcmV0dXJuIG1f
aXNPblNlbGVjdFN0YWNrLnF1aWNrR2V0KHRtcEluZGV4KSB8fCAhIW1fY29hbGVzY2VkVG1wc1t0
bXBJbmRleF07CiAgICAgfQogCiAgICAgYm9vbCBjYW5CZVNhZmVseUNvYWxlc2NlZChJbmRleFR5
cGUgdSwgSW5kZXhUeXBlIHYpCkBAIC00MjksNyArMTk0LDcgQEAgcHJpdmF0ZToKICAgICAgICAg
Y29uc3QgYXV0byYgYWRqYWNlbnRzT2ZVID0gbV9hZGphY2VuY3lMaXN0W3VdOwogICAgICAgICBj
b25zdCBhdXRvJiBhZGphY2VudHNPZlYgPSBtX2FkamFjZW5jeUxpc3Rbdl07CiAKLSAgICAgICAg
aWYgKGFkamFjZW50c09mVS5zaXplKCkgKyBhZGphY2VudHNPZlYuc2l6ZSgpIDwgbV9yZWdzSW5Q
cmlvcml0eU9yZGVyLnNpemUoKSkgeworICAgICAgICBpZiAoYWRqYWNlbnRzT2ZVLnNpemUoKSAr
IGFkamFjZW50c09mVi5zaXplKCkgPCByZWdpc3RlckNvdW50KCkpIHsKICAgICAgICAgICAgIC8v
IFNob3J0Y3V0OiBpZiB0aGUgdG90YWwgbnVtYmVyIG9mIGFkamFjZW50cyBpcyBsZXNzIHRoYW4g
dGhlIG51bWJlciBvZiByZWdpc3RlciwgdGhlIGNvbmRpdGlvbiBpcyBhbHdheXMgbWV0LgogICAg
ICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KQEAgLTQzOSwyMyArMjA0LDIzIEBAIHBy
aXZhdGU6CiAgICAgICAgIGZvciAoSW5kZXhUeXBlIGFkamFjZW50VG1wSW5kZXggOiBhZGphY2Vu
dHNPZlUpIHsKICAgICAgICAgICAgIEFTU0VSVChhZGphY2VudFRtcEluZGV4ICE9IHYpOwogICAg
ICAgICAgICAgQVNTRVJUKGFkamFjZW50VG1wSW5kZXggIT0gdSk7Ci0gICAgICAgICAgICBpZiAo
IWhhc0JlZW5TaW1wbGlmaWVkKGFkamFjZW50VG1wSW5kZXgpICYmIG1fZGVncmVlc1thZGphY2Vu
dFRtcEluZGV4XSA+PSBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpKSB7CisgICAgICAgICAg
ICBpZiAoIWhhc0JlZW5TaW1wbGlmaWVkKGFkamFjZW50VG1wSW5kZXgpICYmIG1fZGVncmVlc1th
ZGphY2VudFRtcEluZGV4XSA+PSByZWdpc3RlckNvdW50KCkpIHsKICAgICAgICAgICAgICAgICBh
dXRvIGFkZFJlc3VsdCA9IGhpZ2hPcmRlckFkamFjZW50cy5hZGQoYWRqYWNlbnRUbXBJbmRleCk7
Ci0gICAgICAgICAgICAgICAgaWYgKGFkZFJlc3VsdC5pc05ld0VudHJ5ICYmIGhpZ2hPcmRlckFk
amFjZW50cy5zaXplKCkgPj0gbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKSkKKyAgICAgICAg
ICAgICAgICBpZiAoYWRkUmVzdWx0LmlzTmV3RW50cnkgJiYgaGlnaE9yZGVyQWRqYWNlbnRzLnNp
emUoKSA+PSByZWdpc3RlckNvdW50KCkpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBmb3IgKEluZGV4VHlwZSBhZGph
Y2VudFRtcEluZGV4IDogYWRqYWNlbnRzT2ZWKSB7CiAgICAgICAgICAgICBBU1NFUlQoYWRqYWNl
bnRUbXBJbmRleCAhPSB1KTsKICAgICAgICAgICAgIEFTU0VSVChhZGphY2VudFRtcEluZGV4ICE9
IHYpOwotICAgICAgICAgICAgaWYgKCFoYXNCZWVuU2ltcGxpZmllZChhZGphY2VudFRtcEluZGV4
KSAmJiBtX2RlZ3JlZXNbYWRqYWNlbnRUbXBJbmRleF0gPj0gbV9yZWdzSW5Qcmlvcml0eU9yZGVy
LnNpemUoKSkgeworICAgICAgICAgICAgaWYgKCFoYXNCZWVuU2ltcGxpZmllZChhZGphY2VudFRt
cEluZGV4KSAmJiBtX2RlZ3JlZXNbYWRqYWNlbnRUbXBJbmRleF0gPj0gcmVnaXN0ZXJDb3VudCgp
KSB7CiAgICAgICAgICAgICAgICAgYXV0byBhZGRSZXN1bHQgPSBoaWdoT3JkZXJBZGphY2VudHMu
YWRkKGFkamFjZW50VG1wSW5kZXgpOwotICAgICAgICAgICAgICAgIGlmIChhZGRSZXN1bHQuaXNO
ZXdFbnRyeSAmJiBoaWdoT3JkZXJBZGphY2VudHMuc2l6ZSgpID49IG1fcmVnc0luUHJpb3JpdHlP
cmRlci5zaXplKCkpCisgICAgICAgICAgICAgICAgaWYgKGFkZFJlc3VsdC5pc05ld0VudHJ5ICYm
IGhpZ2hPcmRlckFkamFjZW50cy5zaXplKCkgPj0gcmVnaXN0ZXJDb3VudCgpKQogICAgICAgICAg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAg
ICAgICBBU1NFUlQoaGlnaE9yZGVyQWRqYWNlbnRzLnNpemUoKSA8IG1fcmVnc0luUHJpb3JpdHlP
cmRlci5zaXplKCkpOworICAgICAgICBBU1NFUlQoaGlnaE9yZGVyQWRqYWNlbnRzLnNpemUoKSA8
IHJlZ2lzdGVyQ291bnQoKSk7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIApAQCAtNDc4
LDI0ICsyNDMsMTU4IEBAIHByaXZhdGU6CiAgICAgICAgIGZvciAodW5zaWduZWQgYWRqYWNlbnRU
bXBJbmRleCA6IGFkamFjZW50c09mVikgewogICAgICAgICAgICAgaWYgKCFpc1ByZWNvbG9yZWQo
YWRqYWNlbnRUbXBJbmRleCkKICAgICAgICAgICAgICAgICAmJiAhaGFzQmVlblNpbXBsaWZpZWQo
YWRqYWNlbnRUbXBJbmRleCkKLSAgICAgICAgICAgICAgICAmJiBtX2RlZ3JlZXNbYWRqYWNlbnRU
bXBJbmRleF0gPj0gbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKQotICAgICAgICAgICAgICAg
ICYmICFtX2ludGVyZmVyZW5jZUVkZ2VzLmNvbnRhaW5zKEludGVyZmVyZW5jZUVkZ2UodSwgYWRq
YWNlbnRUbXBJbmRleCkpKQorICAgICAgICAgICAgICAgICYmIG1fZGVncmVlc1thZGphY2VudFRt
cEluZGV4XSA+PSByZWdpc3RlckNvdW50KCkKKyAgICAgICAgICAgICAgICAmJiAhaGFzSW50ZXJm
ZXJlbmNlRWRnZShJbnRlcmZlcmVuY2VFZGdlKHUsIGFkamFjZW50VG1wSW5kZXgpKSkKICAgICAg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHRydWU7
CiAgICAgfQogCi1wcm90ZWN0ZWQ6Ci0jaWYgUExBVEZPUk0oQ09DT0EpCi0jcHJhZ21hIG1hcmsg
LQotI2VuZGlmCisgICAgSW5kZXhUeXBlIHNlbGVjdFNwaWxsKCkKKyAgICB7CisgICAgICAgIGlm
ICghbV9oYXNTZWxlY3RlZFNwaWxsKSB7CisgICAgICAgICAgICBtX2hhc1NlbGVjdGVkU3BpbGwg
PSB0cnVlOwogCi0gICAgLy8gSW50ZXJmZXJlbmNlIGVkZ2VzIGFyZSBub3QgZGlyZWN0ZWQuIEFu
IGVkZ2UgYmV0d2VlbiBhbnkgdHdvIFRtcHMgaXMgcmVwcmVzZW50ZWQKLSAgICAvLyBieSB0aGUg
Y29uY2F0ZW5hdGVkIHZhbHVlcyBvZiB0aGUgc21hbGxlc3QgVG1wIGZvbGxvd2VkIGJ5IHRoZSBi
aWdnZXIgVG1wLgotICAgIGNsYXNzIEludGVyZmVyZW5jZUVkZ2UgewotICAgIHB1YmxpYzoKLSAg
ICAgICAgSW50ZXJmZXJlbmNlRWRnZSgpCi0gICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtX2hh
c0NvYWxlc2NlZE5vblRyaXZpYWxNb3ZlKQorICAgICAgICAgICAgICAgIG1fY29hbGVzY2VkVG1w
c0F0U3BpbGwgPSBtX2NvYWxlc2NlZFRtcHM7CisgICAgICAgIH0KKworICAgICAgICBhdXRvIGl0
ZXJhdG9yID0gbV9zcGlsbFdvcmtsaXN0LmJlZ2luKCk7CisKKyAgICAgICAgUkVMRUFTRV9BU1NF
UlRfV0lUSF9NRVNTQUdFKGl0ZXJhdG9yICE9IG1fc3BpbGxXb3JrbGlzdC5lbmQoKSwgInNlbGVj
dFNwaWxsKCkgY2FsbGVkIHdoZW4gdGhlcmUgd2FzIG5vIHNwaWxsLiIpOworICAgICAgICBSRUxF
QVNFX0FTU0VSVF9XSVRIX01FU1NBR0UoIW1fdW5zcGlsbGFibGVUbXBzLmNvbnRhaW5zKCppdGVy
YXRvciksICJ0cnlpbmcgdG8gc3BpbGwgdW5zcGlsbGFibGUgdG1wIik7CisKKyAgICAgICAgLy8g
SGlnaGVyIHNjb3JlIG1lYW5zIG1vcmUgZGVzaXJhYmxlIHRvIHNwaWxsLiBMb3dlciBzY29yZXMg
bWF4aW1pemUgdGhlIGxpa2VsaWhvb2QgdGhhdCBhIHRtcAorICAgICAgICAvLyBnZXRzIGEgcmVn
aXN0ZXIuCisgICAgICAgIGF1dG8gc2NvcmUgPSBbJl0gKFRtcCB0bXApIC0+IGRvdWJsZSB7Cisg
ICAgICAgICAgICAvLyBBaXIgZXhwb3NlcyB0aGUgY29uY2VwdCBvZiAiZmFzdCB0bXBzIiwgYW5k
IHdlIGludGVycHJldCB0aGF0IHRvIG1lYW4gdGhhdCB0aGUgdG1wCisgICAgICAgICAgICAvLyBz
aG91bGQgYWx3YXlzIGJlIGluIGEgcmVnaXN0ZXIuCisgICAgICAgICAgICBpZiAobV9jb2RlLmlz
RmFzdFRtcCh0bXApKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgCisg
ICAgICAgICAgICAvLyBBbGwgZWxzZSBiZWluZyBlcXVhbCwgdGhlIHNjb3JlIHNob3VsZCBiZSBk
aXJlY3RseSByZWxhdGVkIHRvIHRoZSBkZWdyZWUuCisgICAgICAgICAgICBkb3VibGUgZGVncmVl
ID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihtX2RlZ3JlZXNbVG1wTWFwcGVyOjphYnNvbHV0ZUluZGV4
KHRtcCldKTsKKworICAgICAgICAgICAgLy8gQWxsIGVsc2UgYmVpbmcgZXF1YWwsIHRoZSBzY29y
ZSBzaG91bGQgYmUgaW52ZXJzZWx5IHJlbGF0ZWQgdG8gdGhlIG51bWJlciBvZiB3YXJtIHVzZXMg
YW5kCisgICAgICAgICAgICAvLyBkZWZzLgorICAgICAgICAgICAgY29uc3QgVXNlQ291bnRzPFRt
cD46OkNvdW50cyogY291bnRzID0gbV91c2VDb3VudHNbdG1wXTsKKyAgICAgICAgICAgIGlmICgh
Y291bnRzKQorICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJs
ZT46OmluZmluaXR5KCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGRvdWJsZSB1c2VzID0g
Y291bnRzLT5udW1XYXJtVXNlcyArIGNvdW50cy0+bnVtRGVmczsKKworICAgICAgICAgICAgLy8g
SWYgaXQncyBhIGNvbnN0YW50LCB0aGVuIGl0J3Mgbm90IGFzIGJhZCB0byBzcGlsbC4gV2UgY2Fu
IHJlbWF0ZXJpYWxpemUgaXQgaW4gbWFueQorICAgICAgICAgICAgLy8gY2FzZXMuCisgICAgICAg
ICAgICBpZiAoY291bnRzLT5udW1Db25zdERlZnMgPT0gMSAmJiBjb3VudHMtPm51bURlZnMgPT0g
MSkKKyAgICAgICAgICAgICAgICB1c2VzIC89IDI7CisKKyAgICAgICAgICAgIHJldHVybiBkZWdy
ZWUgLyB1c2VzOworICAgICAgICB9OworCisgICAgICAgIGF1dG8gdmljdGltSXRlcmF0b3IgPSBp
dGVyYXRvcjsKKyAgICAgICAgZG91YmxlIG1heFNjb3JlID0gc2NvcmUoVG1wTWFwcGVyOjp0bXBG
cm9tQWJzb2x1dGVJbmRleCgqaXRlcmF0b3IpKTsKKworICAgICAgICArK2l0ZXJhdG9yOworICAg
ICAgICBmb3IgKDtpdGVyYXRvciAhPSBtX3NwaWxsV29ya2xpc3QuZW5kKCk7ICsraXRlcmF0b3Ip
IHsKKyAgICAgICAgICAgIGRvdWJsZSB0bXBTY29yZSA9IHNjb3JlKFRtcE1hcHBlcjo6dG1wRnJv
bUFic29sdXRlSW5kZXgoKml0ZXJhdG9yKSk7CisgICAgICAgICAgICBpZiAodG1wU2NvcmUgPiBt
YXhTY29yZSkgeworICAgICAgICAgICAgICAgIEFTU0VSVCghbV91bnNwaWxsYWJsZVRtcHMuY29u
dGFpbnMoKml0ZXJhdG9yKSk7CisgICAgICAgICAgICAgICAgdmljdGltSXRlcmF0b3IgPSBpdGVy
YXRvcjsKKyAgICAgICAgICAgICAgICBtYXhTY29yZSA9IHRtcFNjb3JlOworICAgICAgICAgICAg
fQorICAgICAgICB9CisKKyAgICAgICAgSW5kZXhUeXBlIHZpY3RpbUluZGV4ID0gKnZpY3RpbUl0
ZXJhdG9yOworICAgICAgICBpZiAodHJhY2VEZWJ1ZykKKyAgICAgICAgICAgIGRhdGFMb2dMbigi
U2VsZWN0aW5nIHNwaWxsICIsIHZpY3RpbUluZGV4KTsKKyAgICAgICAgQVNTRVJUKCFpc1ByZWNv
bG9yZWQodmljdGltSW5kZXgpKTsKKyAgICAgICAgcmV0dXJuIHZpY3RpbUluZGV4OworICAgIH0K
KworICAgIHZvaWQgYXNzaWduQ29sb3JzKCkKKyAgICB7CisgICAgICAgIEFTU0VSVChtX3NpbXBs
aWZ5V29ya2xpc3QuaXNFbXB0eSgpKTsKKyAgICAgICAgQVNTRVJUKCFtX3NwaWxsV29ya2xpc3Qu
Yml0Q291bnQoKSk7CisKKyAgICAgICAgLy8gUmVjbGFpbSBhcyBtdWNoIG1lbW9yeSBhcyBwb3Nz
aWJsZS4KKyAgICAgICAgbV9pbnRlcmZlcmVuY2VFZGdlcy5jbGVhcigpOworCisgICAgICAgIG1f
ZGVncmVlcy5jbGVhcigpOworICAgICAgICBtX21vdmVMaXN0LmNsZWFyKCk7CisgICAgICAgIG1f
c2ltcGxpZnlXb3JrbGlzdC5jbGVhcigpOworICAgICAgICBtX3NwaWxsV29ya2xpc3QuY2xlYXJB
bGwoKTsKKworICAgICAgICAvLyBUcnkgdG8gY29sb3IgdGhlIFRtcCBvbiB0aGUgc3RhY2suCisg
ICAgICAgIG1fY29sb3JlZFRtcC5yZXNpemUobV9hZGphY2VuY3lMaXN0LnNpemUoKSk7CisKKyAg
ICAgICAgd2hpbGUgKCFtX3NlbGVjdFN0YWNrLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdW5z
aWduZWQgdG1wSW5kZXggPSBtX3NlbGVjdFN0YWNrLnRha2VMYXN0KCk7CisgICAgICAgICAgICBt
X2lzT25TZWxlY3RTdGFjay5xdWlja0NsZWFyKHRtcEluZGV4KTsKKyAgICAgICAgICAgIEFTU0VS
VCghaXNQcmVjb2xvcmVkKHRtcEluZGV4KSk7CisgICAgICAgICAgICBBU1NFUlQoIW1fY29sb3Jl
ZFRtcFt0bXBJbmRleF0pOworICAgICAgICAgICAgUkVMRUFTRV9BU1NFUlQoZ2V0QWxpYXModG1w
SW5kZXgpID09IHRtcEluZGV4KTsKKworICAgICAgICAgICAgUmVnaXN0ZXJTZXQgY29sb3JlZFJl
Z2lzdGVyczsKKyAgICAgICAgICAgIGZvciAoSW5kZXhUeXBlIGFkamFjZW50VG1wSW5kZXggOiBt
X2FkamFjZW5jeUxpc3RbdG1wSW5kZXhdKSB7CisgICAgICAgICAgICAgICAgSW5kZXhUeXBlIGFs
aWFzVG1wSW5kZXggPSBnZXRBbGlhcyhhZGphY2VudFRtcEluZGV4KTsKKyAgICAgICAgICAgICAg
ICBSZWcgcmVnID0gbV9jb2xvcmVkVG1wW2FsaWFzVG1wSW5kZXhdOworCisgICAgICAgICAgICAg
ICAgQVNTRVJUKCFpc1ByZWNvbG9yZWQoYWxpYXNUbXBJbmRleCkgfHwgKGlzUHJlY29sb3JlZChh
bGlhc1RtcEluZGV4KSAmJiByZWcpKTsKKworICAgICAgICAgICAgICAgIGlmIChyZWcpCisgICAg
ICAgICAgICAgICAgICAgIGNvbG9yZWRSZWdpc3RlcnMuc2V0KHJlZyk7CisgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgIGJvb2wgY29sb3JBc3NpZ25lZCA9IGZhbHNlOworICAgICAgICAgICAg
Zm9yIChSZWcgcmVnIDogbV9yZWdzSW5Qcmlvcml0eU9yZGVyKSB7CisgICAgICAgICAgICAgICAg
aWYgKCFjb2xvcmVkUmVnaXN0ZXJzLmdldChyZWcpKSB7CisgICAgICAgICAgICAgICAgICAgIG1f
Y29sb3JlZFRtcFt0bXBJbmRleF0gPSByZWc7CisgICAgICAgICAgICAgICAgICAgIGNvbG9yQXNz
aWduZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAg
ICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghY29sb3JBc3NpZ25lZCkKKyAg
ICAgICAgICAgICAgICBtX3NwaWxsZWRUbXBzLmFwcGVuZCh0bXBJbmRleCk7CisgICAgICAgIH0K
KworICAgICAgICBtX3NlbGVjdFN0YWNrLmNsZWFyKCk7CisKKyAgICAgICAgaWYgKG1fc3BpbGxl
ZFRtcHMuaXNFbXB0eSgpKQorICAgICAgICAgICAgbV9jb2FsZXNjZWRUbXBzQXRTcGlsbC5jbGVh
cigpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtX2NvbG9yZWRUbXAuY2xlYXIoKTsKKyAg
ICB9CisKKyAgICB2b2lkIGR1bXBJbnRlcmZlcmVuY2VHcmFwaEluRG90KFByaW50U3RyZWFtJiBv
dXQpCisgICAgeworICAgICAgICBvdXQucHJpbnQoImdyYXBoIEludGVyZmVyZW5jZUdyYXBoIHsg
XG4iKTsKKworICAgICAgICBIYXNoU2V0PFRtcD4gdG1wc1dpdGhJbnRlcmZlcmVuY2VzOworICAg
ICAgICBmb3IgKGNvbnN0IGF1dG8mIGVkZ2UgOiBtX2ludGVyZmVyZW5jZUVkZ2VzKSB7CisgICAg
ICAgICAgICB0bXBzV2l0aEludGVyZmVyZW5jZXMuYWRkKFRtcE1hcHBlcjo6dG1wRnJvbUFic29s
dXRlSW5kZXgoZWRnZS5maXJzdCgpKSk7CisgICAgICAgICAgICB0bXBzV2l0aEludGVyZmVyZW5j
ZXMuYWRkKFRtcE1hcHBlcjo6dG1wRnJvbUFic29sdXRlSW5kZXgoZWRnZS5zZWNvbmQoKSkpOwor
ICAgICAgICB9CisKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiB0bXAgOiB0bXBzV2l0aEludGVy
ZmVyZW5jZXMpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIHRtcEluZGV4ID0gVG1wTWFwcGVyOjph
YnNvbHV0ZUluZGV4KHRtcCk7CisgICAgICAgICAgICBpZiAodG1wSW5kZXggPCBtX2RlZ3JlZXMu
c2l6ZSgpKQorICAgICAgICAgICAgICAgIG91dC5wcmludCgiICAgICIsIHRtcC5pbnRlcm5hbFZh
bHVlKCksICIgW2xhYmVsPVwiIiwgdG1wLCAiICgiLCBtX2RlZ3JlZXNbdG1wSW5kZXhdLCAiKVwi
XTtcbiIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG91dC5wcmludCgiICAg
ICIsIHRtcC5pbnRlcm5hbFZhbHVlKCksICIgW2xhYmVsPVwiIiwgdG1wLCAiXCJdO1xuIik7Cisg
ICAgICAgIH0KKworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGVkZ2UgOiBtX2ludGVyZmVyZW5j
ZUVkZ2VzKQorICAgICAgICAgICAgb3V0LnByaW50KCIgICAgIiwgZWRnZS5maXJzdCgpLCAiIC0t
ICIsIGVkZ2Uuc2Vjb25kKCksICI7XG4iKTsKKyAgICAgICAgb3V0LnByaW50KCJ9XG4iKTsKKyAg
ICB9CisKKyAgICAvLyBJbnRlcmZlcmVuY2UgZWRnZXMgYXJlIG5vdCBkaXJlY3RlZC4gQW4gZWRn
ZSBiZXR3ZWVuIGFueSB0d28gVG1wcyBpcyByZXByZXNlbnRlZAorICAgIC8vIGJ5IHRoZSBjb25j
YXRlbmF0ZWQgdmFsdWVzIG9mIHRoZSBzbWFsbGVzdCBUbXAgZm9sbG93ZWQgYnkgdGhlIGJpZ2dl
ciBUbXAuCisgICAgY2xhc3MgSW50ZXJmZXJlbmNlRWRnZSB7CisgICAgcHVibGljOgorICAgICAg
ICBJbnRlcmZlcmVuY2VFZGdlKCkKKyAgICAgICAgewogICAgICAgICB9CiAKICAgICAgICAgSW50
ZXJmZXJlbmNlRWRnZShJbmRleFR5cGUgYSwgSW5kZXhUeXBlIGIpCkBAIC01NDgsNiArNDQ3LDE2
IEBAIHByb3RlY3RlZDoKICAgICAgICAgdWludDY0X3QgbV92YWx1ZSB7IDAgfTsKICAgICB9Owog
CisgICAgYm9vbCBhZGRJbnRlcmZlcmVuY2VFZGdlKEludGVyZmVyZW5jZUVkZ2UgZWRnZSkKKyAg
ICB7CisgICAgICAgIHJldHVybiBtX2ludGVyZmVyZW5jZUVkZ2VzLmFkZChlZGdlKS5pc05ld0Vu
dHJ5OworICAgIH0KKworICAgIGJvb2wgaGFzSW50ZXJmZXJlbmNlRWRnZShJbnRlcmZlcmVuY2VF
ZGdlIGVkZ2UpCisgICAgeworICAgICAgICByZXR1cm4gbV9pbnRlcmZlcmVuY2VFZGdlcy5jb250
YWlucyhlZGdlKTsKKyAgICB9CisKICAgICBzdHJ1Y3QgSW50ZXJmZXJlbmNlRWRnZUhhc2ggewog
ICAgICAgICBzdGF0aWMgdW5zaWduZWQgaGFzaChjb25zdCBJbnRlcmZlcmVuY2VFZGdlJiBrZXkp
IHsgcmV0dXJuIGtleS5oYXNoKCk7IH0KICAgICAgICAgc3RhdGljIGJvb2wgZXF1YWwoY29uc3Qg
SW50ZXJmZXJlbmNlRWRnZSYgYSwgY29uc3QgSW50ZXJmZXJlbmNlRWRnZSYgYikgeyByZXR1cm4g
YSA9PSBiOyB9CkBAIC01NTUsMzkgKzQ2NCw3MDUgQEAgcHJvdGVjdGVkOgogICAgIH07CiAgICAg
dHlwZWRlZiBTaW1wbGVDbGFzc0hhc2hUcmFpdHM8SW50ZXJmZXJlbmNlRWRnZT4gSW50ZXJmZXJl
bmNlRWRnZUhhc2hUcmFpdHM7CiAKLSAgICBjb25zdCBWZWN0b3I8UmVnPiYgbV9yZWdzSW5Qcmlv
cml0eU9yZGVyOwotICAgIFJlZ2lzdGVyU2V0IG1fbXV0YWJsZVJlZ3M7Ci0gICAgSW5kZXhUeXBl
IG1fbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4IHsgMCB9OworICAgIGNvbnN0IFZlY3RvcjxS
ZWc+JiBtX3JlZ3NJblByaW9yaXR5T3JkZXI7CisgICAgUmVnaXN0ZXJTZXQgbV9tdXRhYmxlUmVn
czsKKyAgICBJbmRleFR5cGUgbV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXggeyAwIH07CisK
KyAgICAvLyBUaGUgaW50ZXJmZXJlbmNlIGdyYXBoLgorICAgIEhhc2hTZXQ8SW50ZXJmZXJlbmNl
RWRnZSwgSW50ZXJmZXJlbmNlRWRnZUhhc2gsIEludGVyZmVyZW5jZUVkZ2VIYXNoVHJhaXRzPiBt
X2ludGVyZmVyZW5jZUVkZ2VzOworCisgICAgVmVjdG9yPFZlY3RvcjxJbmRleFR5cGUsIDAsIFVu
c2FmZVZlY3Rvck92ZXJmbG93LCA0PiwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fYWRqYWNl
bmN5TGlzdDsKKyAgICBWZWN0b3I8SW5kZXhUeXBlLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4g
bV9kZWdyZWVzOworCisgICAgLy8gSW5zdGVhZCBvZiBrZWVwaW5nIHRyYWNrIG9mIHRoZSBtb3Zl
IGluc3RydWN0aW9ucywgd2UganVzdCBrZWVwIHRoZWlyIG9wZXJhbmRzIGFyb3VuZCBhbmQgdXNl
IHRoZSBpbmRleAorICAgIC8vIGluIHRoZSB2ZWN0b3IgYXMgdGhlICJpZGVudGlmaWVyIiBmb3Ig
dGhlIG1vdmUuCisgICAgc3RydWN0IE1vdmVPcGVyYW5kcyB7CisgICAgICAgIEluZGV4VHlwZSBz
cmNJbmRleDsKKyAgICAgICAgSW5kZXhUeXBlIGRzdEluZGV4OworICAgIH07CisgICAgVmVjdG9y
PE1vdmVPcGVyYW5kcywgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fY29hbGVzY2luZ0NhbmRp
ZGF0ZXM7CisKKyAgICAvLyBMaXN0IG9mIGV2ZXJ5IG1vdmUgaW5zdHJ1Y3Rpb24gYXNzb2NpYXRl
ZCB3aXRoIGEgVG1wLgorICAgIFZlY3RvcjxIYXNoU2V0PEluZGV4VHlwZSwgdHlwZW5hbWUgRGVm
YXVsdEhhc2g8SW5kZXhUeXBlPjo6SGFzaCwgV1RGOjpVbnNpZ25lZFdpdGhaZXJvS2V5SGFzaFRy
YWl0czxJbmRleFR5cGU+Pj4gbV9tb3ZlTGlzdDsKKworICAgIC8vIENvbG9ycy4KKyAgICBWZWN0
b3I8UmVnLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9jb2xvcmVkVG1wOworICAgIFZlY3Rv
cjxJbmRleFR5cGU+IG1fc3BpbGxlZFRtcHM7CisKKyAgICAvLyBWYWx1ZXMgdGhhdCBoYXZlIGJl
ZW4gY29hbGVzY2VkIHdpdGggYW4gb3RoZXIgdmFsdWUuCisgICAgVmVjdG9yPEluZGV4VHlwZSwg
MCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fY29hbGVzY2VkVG1wczsKKworICAgIC8vIFRoZSBz
dGFjayBvZiBUbXAgcmVtb3ZlZCBmcm9tIHRoZSBncmFwaCBhbmQgcmVhZHkgZm9yIGNvbG9yaW5n
LgorICAgIEJpdFZlY3RvciBtX2lzT25TZWxlY3RTdGFjazsKKyAgICBWZWN0b3I8SW5kZXhUeXBl
PiBtX3NlbGVjdFN0YWNrOworCisgICAgSW5kZXhUeXBlIG1fZnJhbWVQb2ludGVySW5kZXggeyAw
IH07CisgICAgQml0VmVjdG9yIG1faW50ZXJmZXJlc1dpdGhGcmFtZVBvaW50ZXI7CisgICAgLy8g
TG93LWRlZ3JlZSwgbm9uLU1vdmUgcmVsYXRlZC4KKyAgICBWZWN0b3I8SW5kZXhUeXBlPiBtX3Np
bXBsaWZ5V29ya2xpc3Q7CisgICAgLy8gSGlnaC1kZWdyZWUgVG1wLgorICAgIEJpdFZlY3RvciBt
X3NwaWxsV29ya2xpc3Q7CisKKyAgICBib29sIG1faGFzU2VsZWN0ZWRTcGlsbCB7IGZhbHNlIH07
CisgICAgYm9vbCBtX2hhc0NvYWxlc2NlZE5vblRyaXZpYWxNb3ZlIHsgZmFsc2UgfTsKKworICAg
IC8vIFRoZSBtYXBwaW5nIG9mIFRtcCB0byB0aGVpciBhbGlhcyBmb3IgTW92ZXMgdGhhdCBhcmUg
YWx3YXlzIGNvYWxlc2NpbmcgcmVnYXJkbGVzcyBvZiBzcGlsbGluZy4KKyAgICBWZWN0b3I8SW5k
ZXhUeXBlLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9jb2FsZXNjZWRUbXBzQXRTcGlsbDsK
KworICAgIGNvbnN0IEhhc2hTZXQ8dW5zaWduZWQ+JiBtX3Vuc3BpbGxhYmxlVG1wczsKKyAgICBj
b25zdCBVc2VDb3VudHM8VG1wPiYgbV91c2VDb3VudHM7CisgICAgQ29kZSYgbV9jb2RlOworfTsK
KwordGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4VHlwZSwgdHlwZW5hbWUgVG1wTWFwcGVyPgorY2xh
c3MgQnJpZ2dzIDogcHVibGljIEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0b3I8SW5kZXhUeXBlLCBU
bXBNYXBwZXI+IHsKKyAgICB1c2luZyBCYXNlID0gQWJzdHJhY3RDb2xvcmluZ0FsbG9jYXRvcjxJ
bmRleFR5cGUsIFRtcE1hcHBlcj47Citwcm90ZWN0ZWQ6CisgICAgdXNpbmcgQmFzZTo6bV9pc09u
U2VsZWN0U3RhY2s7CisgICAgdXNpbmcgQmFzZTo6bV9zZWxlY3RTdGFjazsKKyAgICB1c2luZyBC
YXNlOjptX2ZyYW1lUG9pbnRlckluZGV4OworICAgIHVzaW5nIEJhc2U6Om1faW50ZXJmZXJlc1dp
dGhGcmFtZVBvaW50ZXI7CisgICAgdXNpbmcgQmFzZTo6bV9zaW1wbGlmeVdvcmtsaXN0OworICAg
IHVzaW5nIEJhc2U6Om1fc3BpbGxXb3JrbGlzdDsKKyAgICB1c2luZyBCYXNlOjptX2hhc1NlbGVj
dGVkU3BpbGw7CisgICAgdXNpbmcgQmFzZTo6bV9oYXNDb2FsZXNjZWROb25Ucml2aWFsTW92ZTsK
KyAgICB1c2luZyBCYXNlOjptX2RlZ3JlZXM7CisgICAgdXNpbmcgQmFzZTo6cmVnaXN0ZXJDb3Vu
dDsKKyAgICB1c2luZyBCYXNlOjptX2NvYWxlc2NlZFRtcHM7CisgICAgdXNpbmcgQmFzZTo6bV9t
b3ZlTGlzdDsKKyAgICB1c2luZyBCYXNlOjptX3VzZUNvdW50czsKKyAgICB1c2luZyBCYXNlOjpt
X2NvYWxlc2NlZFRtcHNBdFNwaWxsOworICAgIHVzaW5nIEJhc2U6Om1fc3BpbGxlZFRtcHM7Cisg
ICAgdXNpbmcgdHlwZW5hbWUgQmFzZTo6TW92ZU9wZXJhbmRzOworICAgIHVzaW5nIEJhc2U6Om1f
Y29hbGVzY2luZ0NhbmRpZGF0ZXM7CisgICAgdXNpbmcgQmFzZTo6bV9sYXN0UHJlY29sb3JlZFJl
Z2lzdGVySW5kZXg7CisgICAgdXNpbmcgQmFzZTo6bV9jb2xvcmVkVG1wOworICAgIHVzaW5nIEJh
c2U6Om1fY29kZTsKKyAgICB1c2luZyB0eXBlbmFtZSBCYXNlOjpJbnRlcmZlcmVuY2VFZGdlOwor
ICAgIHVzaW5nIEJhc2U6Om1fdW5zcGlsbGFibGVUbXBzOworICAgIHVzaW5nIEJhc2U6Omhhc0lu
dGVyZmVyZW5jZUVkZ2U7CisgICAgdXNpbmcgQmFzZTo6Z2V0QWxpYXM7CisgICAgdXNpbmcgQmFz
ZTo6YWRkRWRnZTsKKyAgICB1c2luZyBCYXNlOjppc1ByZWNvbG9yZWQ7CisgICAgdXNpbmcgQmFz
ZTo6Y2FuQmVTYWZlbHlDb2FsZXNjZWQ7CisgICAgdXNpbmcgQmFzZTo6YWRkRWRnZURpc3RpbmN0
V2l0aG91dERlZ3JlZUNoYW5nZTsKKyAgICB1c2luZyBCYXNlOjpmb3JFYWNoQWRqYWNlbnQ7Cisg
ICAgdXNpbmcgQmFzZTo6aGFzQmVlblNpbXBsaWZpZWQ7CisgICAgdXNpbmcgQmFzZTo6YWRkVG9T
cGlsbDsKKyAgICB1c2luZyBCYXNlOjptX2ludGVyZmVyZW5jZUVkZ2VzOworCitwdWJsaWM6Cisg
ICAgQnJpZ2dzKENvZGUmIGNvZGUsIGNvbnN0IFZlY3RvcjxSZWc+JiByZWdzSW5Qcmlvcml0eU9y
ZGVyLCBJbmRleFR5cGUgbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4LCB1bnNpZ25lZCB0bXBB
cnJheVNpemUsIGNvbnN0IEhhc2hTZXQ8dW5zaWduZWQ+JiB1bnNwaWxsYWJsZVRtcHMsIGNvbnN0
IFVzZUNvdW50czxUbXA+JiB1c2VDb3VudHMpCisgICAgICAgIDogQmFzZShjb2RlLCByZWdzSW5Q
cmlvcml0eU9yZGVyLCBsYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXgsIHRtcEFycmF5U2l6ZSwg
dW5zcGlsbGFibGVUbXBzLCB1c2VDb3VudHMpCisgICAgeworICAgIH0KKworICAgIHZvaWQgYWxs
b2NhdGUoKQorICAgIHsKKyAgICAgICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CisKKyAgICAgICAg
YXV0byBjb2FsZXNjZU1vdmUgPSBbJl0gKHVuc2lnbmVkJiBtb3ZlKSB7CisgICAgICAgICAgICBi
b29sIGNvYWxlc2NlZCA9IGNvYWxlc2NlKG1vdmUpOworICAgICAgICAgICAgaWYgKGNvYWxlc2Nl
ZCkgeworICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIC8v
IFdlIHdvbid0IG5lZWQgdG8gaGFuZGxlIHRoaXMgbW92ZSBpbiB0aGUgZnV0dXJlIHNpbmNlIGl0
J3MgYWxyZWFkeSBjb2FsZXNjZWQuCisgICAgICAgICAgICAgICAgbW92ZSA9IFVJTlRfTUFYOwor
ICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIC8vIFdlIGZpcnN0IGNvYWxlc2Nl
IHVudGlsIHdlIGNhbid0IGNvYWxlc2NlIGFueSBtb3JlLgorICAgICAgICBkbyB7CisgICAgICAg
ICAgICBjaGFuZ2VkID0gZmFsc2U7CisgICAgICAgICAgICBtX3dvcmtsaXN0TW92ZXMuZm9yRWFj
aE1vdmUoY29hbGVzY2VNb3ZlKTsKKyAgICAgICAgfSB3aGlsZSAoY2hhbmdlZCk7CisgICAgICAg
IGRvIHsKKyAgICAgICAgICAgIGNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIG1fd29ya2xp
c3RNb3Zlcy5mb3JFYWNoTG93UHJpb3JpdHlNb3ZlKGNvYWxlc2NlTW92ZSk7CisgICAgICAgIH0g
d2hpbGUgKGNoYW5nZWQpOworCisgICAgICAgIC8vIFRoZW4gd2UgY3JlYXRlIG91ciBzZWxlY3Qg
c3RhY2suIFRoZSBpbnZhcmlhbnQgd2Ugc3RhcnQgd2l0aCBoZXJlIGlzIHRoYXQgbm9kZXMgaW4K
KyAgICAgICAgLy8gdGhlIGludGVyZmVyZW5jZSBncmFwaCB3aXRoIGRlZ3JlZSA+PSBrIGFyZSBv
biB0aGUgc3BpbGwgbGlzdC4gTm9kZXMgd2l0aCBkZWdyZWUgPCBrCisgICAgICAgIC8vIGFyZSBv
biB0aGUgc2ltcGxpZnkgd29ya2xpc3QuIEEgbm9kZSBjYW4gbW92ZSBmcm9tIHRoZSBzcGlsbCBs
aXN0IHRvIHRoZSBzaW1wbGlmeQorICAgICAgICAvLyBsaXN0IChidXQgbm90IHRoZSBvdGhlciB3
YXkgYXJvdW5kLCBub3RlIHRoYXQgdGhpcyBpcyBkaWZmZXJlbnQgdGhhbiBJUkMgYmVjYXVzZSBJ
UkMKKyAgICAgICAgLy8gcnVucyB0aGlzIHdoaWxlIGNvYWxlc2NpbmcsIGJ1dCB3ZSBkbyBhbGwg
b3VyIGNvYWxlc2NpbmcgYmVmb3JlIHRoaXMpLiBPbmNlIGEgbm9kZSBpcworICAgICAgICAvLyBh
ZGRlZCB0byB0aGUgc2VsZWN0IHN0YWNrLCBpdCdzIG5vdCBvbiBlaXRoZXIgbGlzdCwgYnV0IG9u
bHkgb24gdGhlIHNlbGVjdCBzdGFjay4KKyAgICAgICAgLy8gT25jZSBvbiB0aGUgc2VsZWN0IHN0
YWNrLCBsb2dpY2FsbHksIGl0J3Mgbm8gbG9uZ2VyIGluIHRoZSBpbnRlcmZlcmVuY2UgZ3JhcGgu
CisgICAgICAgIGF1dG8gYXNzZXJ0SW52YXJpYW50cyA9IFsmXSAoKSB7CisgICAgICAgICAgICBp
ZiAoQVNTRVJUX0RJU0FCTEVEKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAg
ICAgSW5kZXhUeXBlIGZpcnN0Tm9uUmVnSW5kZXggPSBtX2xhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJ
bmRleCArIDE7CisgICAgICAgICAgICB1bnNpZ25lZCByZWdpc3RlckNvdW50ID0gdGhpcy0+cmVn
aXN0ZXJDb3VudCgpOworICAgICAgICAgICAgZm9yIChJbmRleFR5cGUgaSA9IGZpcnN0Tm9uUmVn
SW5kZXg7IGkgPCBtX2RlZ3JlZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAo
Z2V0QWxpYXMoaSkgIT0gaSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
ICAgICAgICAgaWYgKG1faXNPblNlbGVjdFN0YWNrLmNvbnRhaW5zKGkpKSB7CisgICAgICAgICAg
ICAgICAgICAgIEFTU0VSVCghbV9zaW1wbGlmeVdvcmtsaXN0LmNvbnRhaW5zKGkpICYmICFtX3Nw
aWxsV29ya2xpc3QuY29udGFpbnMoaSkpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdW5zaWduZWQgZGVncmVlID0gbV9k
ZWdyZWVzW2ldOworICAgICAgICAgICAgICAgIGlmIChkZWdyZWUgPj0gcmVnaXN0ZXJDb3VudCkg
eworICAgICAgICAgICAgICAgICAgICBBU1NFUlQobV91bnNwaWxsYWJsZVRtcHMuY29udGFpbnMo
aSkgfHwgbV9zcGlsbFdvcmtsaXN0LmNvbnRhaW5zKGkpKTsKKyAgICAgICAgICAgICAgICAgICAg
QVNTRVJUKCFtX3NpbXBsaWZ5V29ya2xpc3QuY29udGFpbnMoaSkpOworICAgICAgICAgICAgICAg
ICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQVNTRVJU
KG1fc2ltcGxpZnlXb3JrbGlzdC5jb250YWlucyhpKSk7CisgICAgICAgICAgICB9CisgICAgICAg
IH07CisKKyAgICAgICAgbWFrZUluaXRpYWxXb3JrbGlzdCgpOworICAgICAgICBhc3NlcnRJbnZh
cmlhbnRzKCk7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGNoYW5nZWQgPSBmYWxzZTsKKwor
ICAgICAgICAgICAgd2hpbGUgKG1fc2ltcGxpZnlXb3JrbGlzdC5zaXplKCkpIHsKKyAgICAgICAg
ICAgICAgICBzaW1wbGlmeSgpOworICAgICAgICAgICAgICAgIGFzc2VydEludmFyaWFudHMoKTsK
KyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1fc3BpbGxXb3JrbGlzdC5iaXRDb3Vu
dCgpKSB7CisgICAgICAgICAgICAgICAgc2VsZWN0U3BpbGwoKTsKKyAgICAgICAgICAgICAgICBj
aGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBBU1NFUlQobV9zaW1wbGlmeVdvcmtsaXN0
LnNpemUoKSA9PSAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoY2hhbmdlZCk7
CisKKyAgICAgICAgaWYgKCFBU1NFUlRfRElTQUJMRUQpIHsKKyAgICAgICAgICAgIEFTU0VSVCgh
bV9zaW1wbGlmeVdvcmtsaXN0LnNpemUoKSk7CisgICAgICAgICAgICBBU1NFUlQoIW1fc3BpbGxX
b3JrbGlzdC5iaXRDb3VudCgpKTsKKyAgICAgICAgICAgIEluZGV4VHlwZSBmaXJzdE5vblJlZ0lu
ZGV4ID0gbV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXggKyAxOworICAgICAgICAgICAgZm9y
IChJbmRleFR5cGUgaSA9IGZpcnN0Tm9uUmVnSW5kZXg7IGkgPCBtX2RlZ3JlZXMuc2l6ZSgpOyAr
K2kpCisgICAgICAgICAgICAgICAgQVNTRVJUKGhhc0JlZW5TaW1wbGlmaWVkKGkpKTsKKyAgICAg
ICAgfQorCisgICAgICAgIGFzc2lnbkNvbG9ycygpOworICAgIH0KKworcHJvdGVjdGVkOgorICAg
IAorICAgIGJvb2wgY29hbGVzY2UodW5zaWduZWQmIG1vdmVJbmRleCkKKyAgICB7CisgICAgICAg
IGNvbnN0IE1vdmVPcGVyYW5kcyYgbW92ZU9wZXJhbmRzID0gbV9jb2FsZXNjaW5nQ2FuZGlkYXRl
c1ttb3ZlSW5kZXhdOworICAgICAgICBJbmRleFR5cGUgdSA9IGdldEFsaWFzKG1vdmVPcGVyYW5k
cy5zcmNJbmRleCk7CisgICAgICAgIEluZGV4VHlwZSB2ID0gZ2V0QWxpYXMobW92ZU9wZXJhbmRz
LmRzdEluZGV4KTsKKworICAgICAgICBpZiAoaXNQcmVjb2xvcmVkKHYpKQorICAgICAgICAgICAg
c3RkOjpzd2FwKHUsIHYpOworCisgICAgICAgIGlmICh0cmFjZURlYnVnKQorICAgICAgICAgICAg
ZGF0YUxvZygiQ29hbGVzY2luZyBtb3ZlIGF0IGluZGV4ICIsIG1vdmVJbmRleCwgIiB1ID0gIiwg
VG1wTWFwcGVyOjp0bXBGcm9tQWJzb2x1dGVJbmRleCh1KSwgIiB2ID0gIiwgVG1wTWFwcGVyOjp0
bXBGcm9tQWJzb2x1dGVJbmRleCh2KSwgIiAgICAiKTsKKworICAgICAgICBpZiAodSA9PSB2KSB7
CisgICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKKyAgICAgICAgICAgICAgICBkYXRhTG9nKCJB
bHJlYWR5IENvYWxlc2NlZC4gVGhleSdyZSBlcXVhbC5cbiIpOworICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzUHJlY29sb3JlZCh2KQorICAgICAg
ICAgICAgfHwgaGFzSW50ZXJmZXJlbmNlRWRnZShJbnRlcmZlcmVuY2VFZGdlKHUsIHYpKQorICAg
ICAgICAgICAgfHwgKHUgPT0gbV9mcmFtZVBvaW50ZXJJbmRleCAmJiBtX2ludGVyZmVyZXNXaXRo
RnJhbWVQb2ludGVyLnF1aWNrR2V0KHYpKSkgeworCisgICAgICAgICAgICAvLyBObyBuZWVkIHRv
IGV2ZXIgY29uc2lkZXIgdGhpcyBtb3ZlIGFnYWluIGlmIGl0IGludGVyZmVyZXMuCisgICAgICAg
ICAgICAvLyBObyBjb2FsZXNjaW5nIHdpbGwgcmVtb3ZlIHRoZSBpbnRlcmZlcmVuY2UuCisgICAg
ICAgICAgICBtb3ZlSW5kZXggPSBVSU5UX01BWDsKKworICAgICAgICAgICAgaWYgKCFBU1NFUlRf
RElTQUJMRUQpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNQcmVjb2xvcmVkKHYpKQorICAgICAg
ICAgICAgICAgICAgICBBU1NFUlQoaXNQcmVjb2xvcmVkKHUpKTsKKyAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpCisgICAgICAgICAgICAgICAgZGF0YUxvZygiQ29u
c3RyYWluZWRcbiIpOworCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAg
ICAgICAgCisgICAgICAgIGlmIChjYW5CZVNhZmVseUNvYWxlc2NlZCh1LCB2KSkgeworICAgICAg
ICAgICAgY29tYmluZSh1LCB2KTsKKyAgICAgICAgICAgIG1faGFzQ29hbGVzY2VkTm9uVHJpdmlh
bE1vdmUgPSB0cnVlOworCisgICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKKyAgICAgICAgICAg
ICAgICBkYXRhTG9nKCIgICAgU2FmZSBDb2FsZXNjaW5nXG4iKTsKKyAgICAgICAgICAgIHJldHVy
biB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRyYWNlRGVidWcpCisgICAgICAgICAg
ICBkYXRhTG9nKCIgICAgRmFpbGVkIGNvYWxlc2NpbmcuXG4iKTsKKworICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgfQorCisgICAgdm9pZCBjb21iaW5lKEluZGV4VHlwZSB1LCBJbmRleFR5cGUg
dikKKyAgICB7CisgICAgICAgIEFTU0VSVCghbV9jb2FsZXNjZWRUbXBzW3ZdKTsKKyAgICAgICAg
bV9jb2FsZXNjZWRUbXBzW3ZdID0gdTsKKworICAgICAgICBhdXRvJiB2TW92ZXMgPSBtX21vdmVM
aXN0W3ZdOworICAgICAgICBtX21vdmVMaXN0W3VdLmFkZCh2TW92ZXMuYmVnaW4oKSwgdk1vdmVz
LmVuZCgpKTsKKworICAgICAgICBmb3JFYWNoQWRqYWNlbnQodiwgW3RoaXMsIHVdIChJbmRleFR5
cGUgYWRqYWNlbnRUbXBJbmRleCkgeworICAgICAgICAgICAgaWYgKGFkZEVkZ2VEaXN0aW5jdFdp
dGhvdXREZWdyZWVDaGFuZ2UoYWRqYWNlbnRUbXBJbmRleCwgdSkpIHsKKyAgICAgICAgICAgICAg
ICAvLyBJZiB3ZSBhZGRlZCBhIG5ldyBlZGdlIGJldHdlZW4gdGhlIGFkamFjZW50VG1wIGFuZCB1
LCBpdCByZXBsYWNlcyB0aGUgZWRnZQorICAgICAgICAgICAgICAgIC8vIHRoYXQgZXhpc3RlZCB3
aXRoIHYuCisgICAgICAgICAgICAgICAgLy8gVGhlIGRlZ3JlZSBvZiBhZGphY2VudFRtcCByZW1h
aW5zIHRoZSBzYW1lIHNpbmNlIHRoZSBlZGdlIGp1c3QgY2hhbmdlZCBmcm9tIHUgdG8gdi4KKyAg
ICAgICAgICAgICAgICAvLyBBbGwgd2UgbmVlZCB0byBkbyBpcyB1cGRhdGUgdGhlIGRlZ3JlZSBv
ZiB1LgorICAgICAgICAgICAgICAgIGlmICghaXNQcmVjb2xvcmVkKHUpKQorICAgICAgICAgICAg
ICAgICAgICBtX2RlZ3JlZXNbdV0rKzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAg
ICAgICAgLy8gSWYgd2UgYWxyZWFkeSBoYWQgYW4gZWRnZSBiZXR3ZWVuIHRoZSBhZGphY2VudFRt
cCBhbmQgdSwgdGhlIGRlZ3JlZSBvZiB1CisgICAgICAgICAgICAgICAgLy8gaXMgYWxyZWFkeSBj
b3JyZWN0LiBUaGUgZGVncmVlIG9mIHRoZSBhZGphY2VudFRtcCBkZWNyZWFzZXMgc2luY2UgdGhl
IGVkZ2UKKyAgICAgICAgICAgICAgICAvLyB3aXRoIHYgaXMgbm8gbG9uZ2VyIHJlbGV2YW50ICh3
ZSBjYW4gdGhpbmsgb2YgaXQgYXMgbWVyZ2VkIHdpdGggdGhlIGVkZ2Ugd2l0aCB1KS4KKyAgICAg
ICAgICAgICAgICBkZWNyZW1lbnREZWdyZWUoYWRqYWNlbnRUbXBJbmRleCk7CisgICAgICAgICAg
ICB9CisgICAgICAgIH0pOworCisgICAgICAgIGlmIChtX2ZyYW1lUG9pbnRlckluZGV4ICYmIG1f
aW50ZXJmZXJlc1dpdGhGcmFtZVBvaW50ZXIucXVpY2tHZXQodikpCisgICAgICAgICAgICBtX2lu
dGVyZmVyZXNXaXRoRnJhbWVQb2ludGVyLnF1aWNrU2V0KHUpOworICAgIH0KKworCisgICAgdm9p
ZCBtYWtlSW5pdGlhbFdvcmtsaXN0KCkKKyAgICB7CisgICAgICAgIG1fc2ltcGxpZnlXb3JrbGlz
dC5jbGVhcigpOworICAgICAgICBtX3NwaWxsV29ya2xpc3QuY2xlYXJBbGwoKTsKKworICAgICAg
ICBpZiAodHJhY2VEZWJ1ZykKKyAgICAgICAgICAgIGRhdGFMb2dMbigiLS0tLS0tLS0tLS0tLS0t
LS0tXG5NYWtpbmcgaW5pdGlhbCB3b3JrbGlzdCIpOworCisgICAgICAgIEluZGV4VHlwZSBmaXJz
dE5vblJlZ0luZGV4ID0gbV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXggKyAxOworICAgICAg
ICB1bnNpZ25lZCByZWdpc3RlckNvdW50ID0gdGhpcy0+cmVnaXN0ZXJDb3VudCgpOworICAgICAg
ICBmb3IgKEluZGV4VHlwZSBpID0gZmlyc3ROb25SZWdJbmRleDsgaSA8IG1fZGVncmVlcy5zaXpl
KCk7ICsraSkgeworICAgICAgICAgICAgQVNTRVJUKCFpc1ByZWNvbG9yZWQoaSkpOworICAgICAg
ICAgICAgaWYgKGhhc0JlZW5TaW1wbGlmaWVkKGkpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVl
OworICAgICAgICAgICAgdW5zaWduZWQgZGVncmVlID0gbV9kZWdyZWVzW2ldOworICAgICAgICAg
ICAgaWYgKGRlZ3JlZSA8IHJlZ2lzdGVyQ291bnQpIHsKKyAgICAgICAgICAgICAgICBpZiAodHJh
Y2VEZWJ1ZykKKyAgICAgICAgICAgICAgICAgICAgZGF0YUxvZ0xuKCJBZGRpbmcgIiwgVG1wTWFw
cGVyOjp0bXBGcm9tQWJzb2x1dGVJbmRleChpKSwgIiB0byBzaW1wbGlmeSB3b3JrbGlzdCIpOwor
ICAgICAgICAgICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5hcHBlbmQoaSk7CisgICAgICAgICAg
ICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQorICAgICAgICAgICAg
ICAgICAgICBkYXRhTG9nTG4oIkFkZGluZyAiLCBUbXBNYXBwZXI6OnRtcEZyb21BYnNvbHV0ZUlu
ZGV4KGkpLCAiIHRvIHNwaWxsIHdvcmtsaXN0Iik7CisgICAgICAgICAgICAgICAgYWRkVG9TcGls
bChpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIExvdy1kZWdy
ZWUgdmVydGV4IGNhbiBhbHdheXMgYmUgY29sb3JlZDoganVzdCBwaWNrIGFueSBvZiB0aGUgY29s
b3IgdGFrZW4gYnkgYW55CisgICAgLy8gb3RoZXIgYWRqYWNlbnQgdmVyaWNlcy4KKyAgICAvLyBU
aGUgIlNpbXBsaWZ5IiBwaGFzZSB0YWtlcyBhIGxvdy1kZWdyZWUgb3V0IG9mIHRoZSBpbnRlcmZl
cmVuY2UgZ3JhcGggdG8gc2ltcGxpZnkgaXQuCisgICAgdm9pZCBzaW1wbGlmeSgpCisgICAgewor
ICAgICAgICBJbmRleFR5cGUgbGFzdEluZGV4ID0gbV9zaW1wbGlmeVdvcmtsaXN0LnRha2VMYXN0
KCk7CisKKyAgICAgICAgQVNTRVJUKCFtX3NlbGVjdFN0YWNrLmNvbnRhaW5zKGxhc3RJbmRleCkp
OworICAgICAgICBBU1NFUlQoIW1faXNPblNlbGVjdFN0YWNrLmdldChsYXN0SW5kZXgpKTsKKyAg
ICAgICAgQVNTRVJUKCFtX3NwaWxsV29ya2xpc3QuY29udGFpbnMobGFzdEluZGV4KSk7CisKKyAg
ICAgICAgbV9zZWxlY3RTdGFjay5hcHBlbmQobGFzdEluZGV4KTsKKyAgICAgICAgbV9pc09uU2Vs
ZWN0U3RhY2sucXVpY2tTZXQobGFzdEluZGV4KTsKKworICAgICAgICBpZiAodHJhY2VEZWJ1ZykK
KyAgICAgICAgICAgIGRhdGFMb2dMbigiU2ltcGxpZnlpbmcgIiwgbGFzdEluZGV4LCAiIGJ5IGFk
ZGluZyBpdCB0byBzZWxlY3Qgc3RhY2siKTsKKworICAgICAgICBmb3JFYWNoQWRqYWNlbnQobGFz
dEluZGV4LCBbdGhpc10oSW5kZXhUeXBlIGFkamFjZW50VG1wSW5kZXgpIHsKKyAgICAgICAgICAg
IGRlY3JlbWVudERlZ3JlZUluU2ltcGxpZmljYXRpb24oYWRqYWNlbnRUbXBJbmRleCk7CisgICAg
ICAgIH0pOworICAgIH0KKworICAgIHZvaWQgc2VsZWN0U3BpbGwoKQorICAgIHsKKyAgICAgICAg
SW5kZXhUeXBlIHZpY3RpbUluZGV4ID0gQmFzZTo6c2VsZWN0U3BpbGwoKTsKKyAgICAgICAgbV9z
cGlsbFdvcmtsaXN0LnF1aWNrQ2xlYXIodmljdGltSW5kZXgpOworICAgICAgICBtX3NpbXBsaWZ5
V29ya2xpc3QuYXBwZW5kKHZpY3RpbUluZGV4KTsKKyAgICB9CisKKyAgICBzdHJ1Y3QgTW92ZVNl
dCB7CisgICAgICAgIHVuc2lnbmVkIGFkZE1vdmUoKQorICAgICAgICB7CisgICAgICAgICAgICBB
U1NFUlQobV9sb3dQcmlvcml0eU1vdmVMaXN0LmlzRW1wdHkoKSk7CisKKyAgICAgICAgICAgIHVu
c2lnbmVkIG5leHRJbmRleCA9IG1fcG9zaXRpb25Jbk1vdmVMaXN0Kys7CisgICAgICAgICAgICBt
X21vdmVMaXN0LmFwcGVuZChuZXh0SW5kZXgpOworICAgICAgICAgICAgcmV0dXJuIG5leHRJbmRl
eDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc3RhcnRBZGRpbmdMb3dQcmlvcml0eU1vdmVz
KCkKKyAgICAgICAgeworICAgICAgICAgICAgQVNTRVJUKG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5p
c0VtcHR5KCkpOworICAgICAgICB9CisKKyAgICAgICAgdW5zaWduZWQgYWRkTG93UHJpb3JpdHlN
b3ZlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgbmV4dEluZGV4ID0gbV9wb3Np
dGlvbkluTW92ZUxpc3QrKzsKKyAgICAgICAgICAgIG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5hcHBl
bmQobmV4dEluZGV4KTsKKworICAgICAgICAgICAgcmV0dXJuIG5leHRJbmRleDsKKyAgICAgICAg
fQorCisgICAgICAgIC8vIFdlIHVzZSByZWZlcmVuY2VzIHRvIG1vdmVzIGhlcmUgYmVjYXVzZSB0
aGUgZnVuY3Rpb24KKyAgICAgICAgLy8gbWF5IGRvIGNvYWxlc2NpbmcsIGluZGljYXRpbmcgaXQg
ZG9lc24ndCBuZWVkIHRvIHNlZQorICAgICAgICAvLyB0aGUgbW92ZSBhZ2Fpbi4KKyAgICAgICAg
dGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uPgorICAgICAgICB2b2lkIGZvckVhY2hNb3ZlKEZ1
bmN0aW9uIGZ1bmN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkJiBt
b3ZlIDogbV9tb3ZlTGlzdCkgeworICAgICAgICAgICAgICAgIGlmIChtb3ZlICE9IFVJTlRfTUFY
KQorICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihtb3ZlKTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbj4KKyAgICAgICAg
dm9pZCBmb3JFYWNoTG93UHJpb3JpdHlNb3ZlKEZ1bmN0aW9uIGZ1bmN0aW9uKQorICAgICAgICB7
CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkJiBtb3ZlIDogbV9sb3dQcmlvcml0eU1vdmVMaXN0
KSB7CisgICAgICAgICAgICAgICAgaWYgKG1vdmUgIT0gVUlOVF9NQVgpCisgICAgICAgICAgICAg
ICAgICAgIGZ1bmN0aW9uKG1vdmUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAg
ICAgdm9pZCBjbGVhcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fcG9zaXRpb25Jbk1vdmVM
aXN0ID0gMDsKKyAgICAgICAgICAgIG1fbW92ZUxpc3QuY2xlYXIoKTsKKyAgICAgICAgICAgIG1f
bG93UHJpb3JpdHlNb3ZlTGlzdC5jbGVhcigpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgor
ICAgICAgICB1bnNpZ25lZCBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdDsKKyAgICAgICAgVmVjdG9yPHVu
c2lnbmVkLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9tb3ZlTGlzdDsKKyAgICAgICAgVmVj
dG9yPHVuc2lnbmVkLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9sb3dQcmlvcml0eU1vdmVM
aXN0OworICAgIH07CisKKyAgICB2b2lkIGRlY3JlbWVudERlZ3JlZShJbmRleFR5cGUgdG1wSW5k
ZXgpCisgICAgeworICAgICAgICBBU1NFUlQobV9kZWdyZWVzW3RtcEluZGV4XSk7CisgICAgICAg
IC0tbV9kZWdyZWVzW3RtcEluZGV4XTsKKyAgICB9CisKKyAgICB2b2lkIGRlY3JlbWVudERlZ3Jl
ZUluU2ltcGxpZmljYXRpb24oSW5kZXhUeXBlIHRtcEluZGV4KQorICAgIHsKKyAgICAgICAgQVNT
RVJUKG1fZGVncmVlc1t0bXBJbmRleF0pOworICAgICAgICB1bnNpZ25lZCBvbGREZWdyZWUgPSBt
X2RlZ3JlZXNbdG1wSW5kZXhdLS07CisKKyAgICAgICAgaWYgKG9sZERlZ3JlZSA9PSByZWdpc3Rl
ckNvdW50KCkpIHsKKyAgICAgICAgICAgIEFTU0VSVChtX2RlZ3JlZXNbdG1wSW5kZXhdIDwgcmVn
aXN0ZXJDb3VudCgpKTsKKyAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQorICAgICAgICAgICAg
ICAgIGRhdGFMb2dMbigiTW92aW5nIHRtcCAiLCB0bXBJbmRleCwgIiBmcm9tIHNwaWxsIGxpc3Qg
dG8gc2ltcGxpZnkgbGlzdCBiZWNhdXNlIGl0J3MgZGVncmVlIGlzIG5vdyBsZXNzIHRoYW4gayIp
OworCisgICAgICAgICAgICBpZiAoIUFTU0VSVF9ESVNBQkxFRCkKKyAgICAgICAgICAgICAgICBB
U1NFUlQobV91bnNwaWxsYWJsZVRtcHMuY29udGFpbnModG1wSW5kZXgpIHx8IG1fc3BpbGxXb3Jr
bGlzdC5jb250YWlucyh0bXBJbmRleCkpOworICAgICAgICAgICAgbV9zcGlsbFdvcmtsaXN0LnF1
aWNrQ2xlYXIodG1wSW5kZXgpOworCisgICAgICAgICAgICBBU1NFUlQoIW1fc2ltcGxpZnlXb3Jr
bGlzdC5jb250YWlucyh0bXBJbmRleCkpOworICAgICAgICAgICAgbV9zaW1wbGlmeVdvcmtsaXN0
LmFwcGVuZCh0bXBJbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGFzc2lnbkNv
bG9ycygpCisgICAgeworICAgICAgICBtX3dvcmtsaXN0TW92ZXMuY2xlYXIoKTsKKyAgICAgICAg
QmFzZTo6YXNzaWduQ29sb3JzKCk7CisgICAgfQorCisgICAgLy8gU2V0IG9mICJtb3ZlIiBlbmFi
bGVkIGZvciBwb3NzaWJsZSBjb2FsZXNjaW5nLgorICAgIE1vdmVTZXQgbV93b3JrbGlzdE1vdmVz
OworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4VHlwZSwgdHlwZW5hbWUgVG1wTWFwcGVy
PgorY2xhc3MgSVJDIDogcHVibGljIEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0b3I8SW5kZXhUeXBl
LCBUbXBNYXBwZXI+IHsKKyAgICB1c2luZyBCYXNlID0gQWJzdHJhY3RDb2xvcmluZ0FsbG9jYXRv
cjxJbmRleFR5cGUsIFRtcE1hcHBlcj47Citwcm90ZWN0ZWQ6CisgICAgdXNpbmcgQmFzZTo6bV9p
c09uU2VsZWN0U3RhY2s7CisgICAgdXNpbmcgQmFzZTo6bV9zZWxlY3RTdGFjazsKKyAgICB1c2lu
ZyBCYXNlOjptX2ZyYW1lUG9pbnRlckluZGV4OworICAgIHVzaW5nIEJhc2U6Om1faW50ZXJmZXJl
c1dpdGhGcmFtZVBvaW50ZXI7CisgICAgdXNpbmcgQmFzZTo6bV9zaW1wbGlmeVdvcmtsaXN0Owor
ICAgIHVzaW5nIEJhc2U6Om1fc3BpbGxXb3JrbGlzdDsKKyAgICB1c2luZyBCYXNlOjptX2hhc1Nl
bGVjdGVkU3BpbGw7CisgICAgdXNpbmcgQmFzZTo6bV9oYXNDb2FsZXNjZWROb25Ucml2aWFsTW92
ZTsKKyAgICB1c2luZyBCYXNlOjptX2RlZ3JlZXM7CisgICAgdXNpbmcgQmFzZTo6cmVnaXN0ZXJD
b3VudDsKKyAgICB1c2luZyBCYXNlOjptX2NvYWxlc2NlZFRtcHM7CisgICAgdXNpbmcgQmFzZTo6
bV9tb3ZlTGlzdDsKKyAgICB1c2luZyBCYXNlOjptX3VzZUNvdW50czsKKyAgICB1c2luZyBCYXNl
OjptX2NvYWxlc2NlZFRtcHNBdFNwaWxsOworICAgIHVzaW5nIEJhc2U6Om1fc3BpbGxlZFRtcHM7
CisgICAgdXNpbmcgdHlwZW5hbWUgQmFzZTo6TW92ZU9wZXJhbmRzOworICAgIHVzaW5nIEJhc2U6
Om1fY29hbGVzY2luZ0NhbmRpZGF0ZXM7CisgICAgdXNpbmcgQmFzZTo6bV9sYXN0UHJlY29sb3Jl
ZFJlZ2lzdGVySW5kZXg7CisgICAgdXNpbmcgQmFzZTo6bV9jb2xvcmVkVG1wOworICAgIHVzaW5n
IEJhc2U6Om1fY29kZTsKKyAgICB1c2luZyB0eXBlbmFtZSBCYXNlOjpJbnRlcmZlcmVuY2VFZGdl
OworICAgIHVzaW5nIEJhc2U6Om1fdW5zcGlsbGFibGVUbXBzOworICAgIHVzaW5nIEJhc2U6Omhh
c0ludGVyZmVyZW5jZUVkZ2U7CisgICAgdXNpbmcgQmFzZTo6Z2V0QWxpYXM7CisgICAgdXNpbmcg
QmFzZTo6YWRkRWRnZTsKKyAgICB1c2luZyBCYXNlOjppc1ByZWNvbG9yZWQ7CisgICAgdXNpbmcg
QmFzZTo6Y2FuQmVTYWZlbHlDb2FsZXNjZWQ7CisgICAgdXNpbmcgQmFzZTo6YWRkRWRnZURpc3Rp
bmN0V2l0aG91dERlZ3JlZUNoYW5nZTsKKyAgICB1c2luZyBCYXNlOjpmb3JFYWNoQWRqYWNlbnQ7
CisgICAgdXNpbmcgQmFzZTo6aGFzQmVlblNpbXBsaWZpZWQ7CisgICAgdXNpbmcgQmFzZTo6YWRk
VG9TcGlsbDsKKyAgICB1c2luZyBCYXNlOjptX2ludGVyZmVyZW5jZUVkZ2VzOworICAgIHVzaW5n
IEJhc2U6Om1fYWRqYWNlbmN5TGlzdDsKKyAgICB1c2luZyBCYXNlOjpkdW1wSW50ZXJmZXJlbmNl
R3JhcGhJbkRvdDsKKworcHVibGljOgorICAgIElSQyhDb2RlJiBjb2RlLCBjb25zdCBWZWN0b3I8
UmVnPiYgcmVnc0luUHJpb3JpdHlPcmRlciwgSW5kZXhUeXBlIGxhc3RQcmVjb2xvcmVkUmVnaXN0
ZXJJbmRleCwgdW5zaWduZWQgdG1wQXJyYXlTaXplLCBjb25zdCBIYXNoU2V0PHVuc2lnbmVkPiYg
dW5zcGlsbGFibGVUbXBzLCBjb25zdCBVc2VDb3VudHM8VG1wPiYgdXNlQ291bnRzKQorICAgICAg
ICA6IEJhc2UoY29kZSwgcmVnc0luUHJpb3JpdHlPcmRlciwgbGFzdFByZWNvbG9yZWRSZWdpc3Rl
ckluZGV4LCB0bXBBcnJheVNpemUsIHVuc3BpbGxhYmxlVG1wcywgdXNlQ291bnRzKQorICAgIHsK
KyAgICB9CisKKyAgICB2b2lkIGFsbG9jYXRlKCkKKyAgICB7CisgICAgICAgIG1fYWN0aXZlTW92
ZXMuZW5zdXJlU2l6ZShtX3dvcmtsaXN0TW92ZXMudG90YWxOdW1iZXJPZk1vdmVzKCkpOworICAg
ICAgICBBU1NFUlRfV0lUSF9NRVNTQUdFKG1fYWN0aXZlTW92ZXMuc2l6ZSgpID49IG1fY29hbGVz
Y2luZ0NhbmRpZGF0ZXMuc2l6ZSgpLCAiVGhlIGFjdGl2ZU1vdmUgc2V0IHNob3VsZCBiZSBiaWcg
ZW5vdWdoIGZvciB0aGUgcXVpY2sgb3BlcmF0aW9ucyBvZiBCaXRWZWN0b3IuIik7CisKKyAgICAg
ICAgbWFrZVdvcmtMaXN0KCk7CisKKyAgICAgICAgaWYgKGRlYnVnKSB7CisgICAgICAgICAgICBk
dW1wSW50ZXJmZXJlbmNlR3JhcGhJbkRvdChXVEY6OmRhdGFGaWxlKCkpOworICAgICAgICAgICAg
ZGF0YUxvZygiQ29hbGVzY2luZyBjYW5kaWRhdGVzOlxuIik7CisgICAgICAgICAgICBmb3IgKE1v
dmVPcGVyYW5kcyYgbW92ZU9wIDogbV9jb2FsZXNjaW5nQ2FuZGlkYXRlcykgeworICAgICAgICAg
ICAgICAgIGRhdGFMb2coIiAgICAiLCBUbXBNYXBwZXI6OnRtcEZyb21BYnNvbHV0ZUluZGV4KG1v
dmVPcC5zcmNJbmRleCksCisgICAgICAgICAgICAgICAgICAgICIgLT4gIiwgVG1wTWFwcGVyOjp0
bXBGcm9tQWJzb2x1dGVJbmRleChtb3ZlT3AuZHN0SW5kZXgpLCAiXG4iKTsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIGRhdGFMb2coIkluaXRpYWwgd29yayBsaXN0XG4iKTsKKyAgICAgICAg
ICAgIGR1bXBXb3JrTGlzdHMoV1RGOjpkYXRhRmlsZSgpKTsKKyAgICAgICAgfQorCisgICAgICAg
IGRvIHsKKyAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKSB7CisgICAgICAgICAgICAgICAgZGF0
YUxvZygiQmVmb3JlIEdyYXBoIHNpbXBsaWZpY2F0aW9uIGl0ZXJhdGlvblxuIik7CisgICAgICAg
ICAgICAgICAgZHVtcFdvcmtMaXN0cyhXVEY6OmRhdGFGaWxlKCkpOworICAgICAgICAgICAgfQor
CisgICAgICAgICAgICBpZiAoIW1fc2ltcGxpZnlXb3JrbGlzdC5pc0VtcHR5KCkpCisgICAgICAg
ICAgICAgICAgc2ltcGxpZnkoKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCFtX3dvcmtsaXN0TW92
ZXMuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIGNvYWxlc2NlKCk7CisgICAgICAgICAgICBl
bHNlIGlmICghbV9mcmVlemVXb3JrbGlzdC5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgZnJl
ZXplKCk7CisgICAgICAgICAgICBlbHNlIGlmIChtX3NwaWxsV29ya2xpc3QuYml0Q291bnQoKSkK
KyAgICAgICAgICAgICAgICBzZWxlY3RTcGlsbCgpOworCisgICAgICAgICAgICBpZiAodHJhY2VE
ZWJ1ZykgeworICAgICAgICAgICAgICAgIGRhdGFMb2coIkFmdGVyIEdyYXBoIHNpbXBsaWZpY2F0
aW9uIGl0ZXJhdGlvblxuIik7CisgICAgICAgICAgICAgICAgZHVtcFdvcmtMaXN0cyhXVEY6OmRh
dGFGaWxlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlICghbV9zaW1wbGlmeVdv
cmtsaXN0LmlzRW1wdHkoKSB8fCAhbV93b3JrbGlzdE1vdmVzLmlzRW1wdHkoKSB8fCAhbV9mcmVl
emVXb3JrbGlzdC5pc0VtcHR5KCkgfHwgbV9zcGlsbFdvcmtsaXN0LmJpdENvdW50KCkpOworCisg
ICAgICAgIGFzc2lnbkNvbG9ycygpOworICAgIH0KKworcHJvdGVjdGVkOgorCisgICAgdm9pZCBt
YWtlV29ya0xpc3QoKQorICAgIHsKKyAgICAgICAgSW5kZXhUeXBlIGZpcnN0Tm9uUmVnSW5kZXgg
PSBtX2xhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleCArIDE7CisgICAgICAgIGZvciAoSW5kZXhU
eXBlIGkgPSBmaXJzdE5vblJlZ0luZGV4OyBpIDwgbV9kZWdyZWVzLnNpemUoKTsgKytpKSB7Cisg
ICAgICAgICAgICB1bnNpZ25lZCBkZWdyZWUgPSBtX2RlZ3JlZXNbaV07CisgICAgICAgICAgICBp
ZiAoZGVncmVlID49IHJlZ2lzdGVyQ291bnQoKSkKKyAgICAgICAgICAgICAgICBhZGRUb1NwaWxs
KGkpOworICAgICAgICAgICAgZWxzZSBpZiAoIW1fbW92ZUxpc3RbaV0uaXNFbXB0eSgpKQorICAg
ICAgICAgICAgICAgIG1fZnJlZXplV29ya2xpc3QuYWRkKGkpOworICAgICAgICAgICAgZWxzZQor
ICAgICAgICAgICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5hcHBlbmQoaSk7CisgICAgICAgIH0K
KyAgICB9CisKKyAgICAvLyBMb3ctZGVncmVlIHZlcnRleCBjYW4gYWx3YXlzIGJlIGNvbG9yZWQ6
IGp1c3QgcGljayBhbnkgb2YgdGhlIGNvbG9yIHRha2VuIGJ5IGFueQorICAgIC8vIG90aGVyIGFk
amFjZW50IHZlcmljZXMuCisgICAgLy8gVGhlICJTaW1wbGlmeSIgcGhhc2UgdGFrZXMgYSBsb3ct
ZGVncmVlIG91dCBvZiB0aGUgaW50ZXJmZXJlbmNlIGdyYXBoIHRvIHNpbXBsaWZ5IGl0LgorICAg
IHZvaWQgc2ltcGxpZnkoKQorICAgIHsKKyAgICAgICAgSW5kZXhUeXBlIGxhc3RJbmRleCA9IG1f
c2ltcGxpZnlXb3JrbGlzdC50YWtlTGFzdCgpOworCisgICAgICAgIEFTU0VSVCghbV9zZWxlY3RT
dGFjay5jb250YWlucyhsYXN0SW5kZXgpKTsKKyAgICAgICAgQVNTRVJUKCFtX2lzT25TZWxlY3RT
dGFjay5nZXQobGFzdEluZGV4KSk7CisgICAgICAgIG1fc2VsZWN0U3RhY2suYXBwZW5kKGxhc3RJ
bmRleCk7CisgICAgICAgIG1faXNPblNlbGVjdFN0YWNrLnF1aWNrU2V0KGxhc3RJbmRleCk7CisK
KyAgICAgICAgZm9yRWFjaEFkamFjZW50KGxhc3RJbmRleCwgW3RoaXNdKEluZGV4VHlwZSBhZGph
Y2VudFRtcEluZGV4KSB7CisgICAgICAgICAgICBkZWNyZW1lbnREZWdyZWUoYWRqYWNlbnRUbXBJ
bmRleCk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHZvaWQgY29hbGVzY2UoKQorICAgIHsK
KyAgICAgICAgdW5zaWduZWQgbW92ZUluZGV4ID0gbV93b3JrbGlzdE1vdmVzLnRha2VMYXN0TW92
ZSgpOworICAgICAgICBjb25zdCBNb3ZlT3BlcmFuZHMmIG1vdmVPcGVyYW5kcyA9IG1fY29hbGVz
Y2luZ0NhbmRpZGF0ZXNbbW92ZUluZGV4XTsKKyAgICAgICAgSW5kZXhUeXBlIHUgPSBnZXRBbGlh
cyhtb3ZlT3BlcmFuZHMuc3JjSW5kZXgpOworICAgICAgICBJbmRleFR5cGUgdiA9IGdldEFsaWFz
KG1vdmVPcGVyYW5kcy5kc3RJbmRleCk7CisKKyAgICAgICAgaWYgKGlzUHJlY29sb3JlZCh2KSkK
KyAgICAgICAgICAgIHN0ZDo6c3dhcCh1LCB2KTsKKworICAgICAgICBpZiAodHJhY2VEZWJ1ZykK
KyAgICAgICAgICAgIGRhdGFMb2coIkNvYWxlc2NpbmcgbW92ZSBhdCBpbmRleCAiLCBtb3ZlSW5k
ZXgsICIgdSA9ICIsIHUsICIgdiA9ICIsIHYsICJcbiIpOworCisgICAgICAgIGlmICh1ID09IHYp
IHsKKyAgICAgICAgICAgIGFkZFdvcmtMaXN0KHUpOworCisgICAgICAgICAgICBpZiAodHJhY2VE
ZWJ1ZykKKyAgICAgICAgICAgICAgICBkYXRhTG9nKCIgICAgQ29hbGVzY2VkXG4iKTsKKyAgICAg
ICAgfSBlbHNlIGlmIChpc1ByZWNvbG9yZWQodikKKyAgICAgICAgICAgIHx8IGhhc0ludGVyZmVy
ZW5jZUVkZ2UoSW50ZXJmZXJlbmNlRWRnZSh1LCB2KSkKKyAgICAgICAgICAgIHx8ICh1ID09IG1f
ZnJhbWVQb2ludGVySW5kZXggJiYgbV9pbnRlcmZlcmVzV2l0aEZyYW1lUG9pbnRlci5xdWlja0dl
dCh2KSkpIHsKKyAgICAgICAgICAgIGFkZFdvcmtMaXN0KHUpOworICAgICAgICAgICAgYWRkV29y
a0xpc3Qodik7CisKKyAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQorICAgICAgICAgICAgICAg
IGRhdGFMb2coIiAgICBDb25zdHJhaW5lZFxuIik7CisgICAgICAgIH0gZWxzZSBpZiAoY2FuQmVT
YWZlbHlDb2FsZXNjZWQodSwgdikpIHsKKyAgICAgICAgICAgIGNvbWJpbmUodSwgdik7CisgICAg
ICAgICAgICBhZGRXb3JrTGlzdCh1KTsKKyAgICAgICAgICAgIG1faGFzQ29hbGVzY2VkTm9uVHJp
dmlhbE1vdmUgPSB0cnVlOworCisgICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKKyAgICAgICAg
ICAgICAgICBkYXRhTG9nKCIgICAgU2FmZSBDb2FsZXNjaW5nXG4iKTsKKyAgICAgICAgfSBlbHNl
IHsKKyAgICAgICAgICAgIG1fYWN0aXZlTW92ZXMucXVpY2tTZXQobW92ZUluZGV4KTsKKyAgICAg
ICAgICAgIGlmICh0cmFjZURlYnVnKQorICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICBGYWls
ZWQgY29hbGVzY2luZywgYWRkZWQgdG8gYWN0aXZlIG1vdmVzLlxuIik7CisgICAgICAgIH0KKyAg
ICB9CisKKyAgICB2b2lkIGFkZFdvcmtMaXN0KEluZGV4VHlwZSB0bXBJbmRleCkKKyAgICB7Cisg
ICAgICAgIGlmICghaXNQcmVjb2xvcmVkKHRtcEluZGV4KSAmJiBtX2RlZ3JlZXNbdG1wSW5kZXhd
IDwgcmVnaXN0ZXJDb3VudCgpICYmICFpc01vdmVSZWxhdGVkKHRtcEluZGV4KSkgeworICAgICAg
ICAgICAgbV9mcmVlemVXb3JrbGlzdC5yZW1vdmUodG1wSW5kZXgpOworICAgICAgICAgICAgbV9z
aW1wbGlmeVdvcmtsaXN0LmFwcGVuZCh0bXBJbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAg
ICB2b2lkIGNvbWJpbmUoSW5kZXhUeXBlIHUsIEluZGV4VHlwZSB2KQorICAgIHsKKyAgICAgICAg
aWYgKCFtX2ZyZWV6ZVdvcmtsaXN0LnJlbW92ZSh2KSkKKyAgICAgICAgICAgIG1fc3BpbGxXb3Jr
bGlzdC5xdWlja0NsZWFyKHYpOworCisgICAgICAgIEFTU0VSVCghbV9jb2FsZXNjZWRUbXBzW3Zd
KTsKKyAgICAgICAgbV9jb2FsZXNjZWRUbXBzW3ZdID0gdTsKKworICAgICAgICBhdXRvJiB2TW92
ZXMgPSBtX21vdmVMaXN0W3ZdOworICAgICAgICBtX21vdmVMaXN0W3VdLmFkZCh2TW92ZXMuYmVn
aW4oKSwgdk1vdmVzLmVuZCgpKTsKKworICAgICAgICBmb3JFYWNoQWRqYWNlbnQodiwgW3RoaXMs
IHVdIChJbmRleFR5cGUgYWRqYWNlbnRUbXBJbmRleCkgeworICAgICAgICAgICAgaWYgKGFkZEVk
Z2VEaXN0aW5jdFdpdGhvdXREZWdyZWVDaGFuZ2UoYWRqYWNlbnRUbXBJbmRleCwgdSkpIHsKKyAg
ICAgICAgICAgICAgICAvLyBJZiB3ZSBhZGRlZCBhIG5ldyBlZGdlIGJldHdlZW4gdGhlIGFkamFj
ZW50VG1wIGFuZCB1LCBpdCByZXBsYWNlcyB0aGUgZWRnZQorICAgICAgICAgICAgICAgIC8vIHRo
YXQgZXhpc3RlZCB3aXRoIHYuCisgICAgICAgICAgICAgICAgLy8gVGhlIGRlZ3JlZSBvZiBhZGph
Y2VudFRtcCByZW1haW5zIHRoZSBzYW1lIHNpbmNlIHRoZSBlZGdlIGp1c3QgY2hhbmdlZCBmcm9t
IHUgdG8gdi4KKyAgICAgICAgICAgICAgICAvLyBBbGwgd2UgbmVlZCB0byBkbyBpcyB1cGRhdGUg
dGhlIGRlZ3JlZSBvZiB1LgorICAgICAgICAgICAgICAgIGlmICghaXNQcmVjb2xvcmVkKHUpKQor
ICAgICAgICAgICAgICAgICAgICBtX2RlZ3JlZXNbdV0rKzsKKyAgICAgICAgICAgIH0gZWxzZSB7
CisgICAgICAgICAgICAgICAgLy8gSWYgd2UgYWxyZWFkeSBoYWQgYW4gZWRnZSBiZXR3ZWVuIHRo
ZSBhZGphY2VudFRtcCBhbmQgdSwgdGhlIGRlZ3JlZSBvZiB1CisgICAgICAgICAgICAgICAgLy8g
aXMgYWxyZWFkeSBjb3JyZWN0LiBUaGUgZGVncmVlIG9mIHRoZSBhZGphY2VudFRtcCBkZWNyZWFz
ZXMgc2luY2UgdGhlIGVkZ2UKKyAgICAgICAgICAgICAgICAvLyB3aXRoIHYgaXMgbm8gbG9uZ2Vy
IHJlbGV2YW50ICh3ZSBjYW4gdGhpbmsgb2YgaXQgYXMgbWVyZ2VkIHdpdGggdGhlIGVkZ2Ugd2l0
aCB1KS4KKyAgICAgICAgICAgICAgICBkZWNyZW1lbnREZWdyZWUoYWRqYWNlbnRUbXBJbmRleCk7
CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIGlmIChtX2ZyYW1lUG9pbnRl
ckluZGV4ICYmIG1faW50ZXJmZXJlc1dpdGhGcmFtZVBvaW50ZXIucXVpY2tHZXQodikpCisgICAg
ICAgICAgICBtX2ludGVyZmVyZXNXaXRoRnJhbWVQb2ludGVyLnF1aWNrU2V0KHUpOworCisgICAg
ICAgIGlmIChtX2RlZ3JlZXNbdV0gPj0gcmVnaXN0ZXJDb3VudCgpICYmIG1fZnJlZXplV29ya2xp
c3QucmVtb3ZlKHUpKQorICAgICAgICAgICAgYWRkVG9TcGlsbCh1KTsKKyAgICB9CisKKyAgICB2
b2lkIGZyZWV6ZSgpCisgICAgeworICAgICAgICBJbmRleFR5cGUgdmljdGltSW5kZXggPSBtX2Zy
ZWV6ZVdvcmtsaXN0LnRha2VBbnkoKTsKKyAgICAgICAgQVNTRVJUX1dJVEhfTUVTU0FHRShnZXRB
bGlhcyh2aWN0aW1JbmRleCkgPT0gdmljdGltSW5kZXgsICJjb2FsZXNjZSgpIHNob3VsZCBub3Qg
bGVhdmUgYWxpYXNlZCBUbXAgaW4gdGhlIHdvcmtsaXN0LiIpOworICAgICAgICBtX3NpbXBsaWZ5
V29ya2xpc3QuYXBwZW5kKHZpY3RpbUluZGV4KTsKKyAgICAgICAgZnJlZXplTW92ZXModmljdGlt
SW5kZXgpOworICAgIH0KKworICAgIHZvaWQgZnJlZXplTW92ZXMoSW5kZXhUeXBlIHRtcEluZGV4
KQorICAgIHsKKyAgICAgICAgZm9yRWFjaE5vZGVNb3Zlcyh0bXBJbmRleCwgW3RoaXMsIHRtcElu
ZGV4XSAoSW5kZXhUeXBlIG1vdmVJbmRleCkgeworICAgICAgICAgICAgaWYgKCFtX2FjdGl2ZU1v
dmVzLnF1aWNrQ2xlYXIobW92ZUluZGV4KSkKKyAgICAgICAgICAgICAgICBtX3dvcmtsaXN0TW92
ZXMudGFrZU1vdmUobW92ZUluZGV4KTsKKworICAgICAgICAgICAgY29uc3QgTW92ZU9wZXJhbmRz
JiBtb3ZlT3BlcmFuZHMgPSBtX2NvYWxlc2NpbmdDYW5kaWRhdGVzW21vdmVJbmRleF07CisgICAg
ICAgICAgICBJbmRleFR5cGUgc3JjVG1wSW5kZXggPSBtb3ZlT3BlcmFuZHMuc3JjSW5kZXg7Cisg
ICAgICAgICAgICBJbmRleFR5cGUgZHN0VG1wSW5kZXggPSBtb3ZlT3BlcmFuZHMuZHN0SW5kZXg7
CisKKyAgICAgICAgICAgIEluZGV4VHlwZSBvcmlnaW5hbE90aGVyVG1wID0gc3JjVG1wSW5kZXgg
IT0gdG1wSW5kZXggPyBzcmNUbXBJbmRleCA6IGRzdFRtcEluZGV4OworICAgICAgICAgICAgSW5k
ZXhUeXBlIG90aGVyVG1wSW5kZXggPSBnZXRBbGlhcyhvcmlnaW5hbE90aGVyVG1wKTsKKyAgICAg
ICAgICAgIGlmIChtX2RlZ3JlZXNbb3RoZXJUbXBJbmRleF0gPCByZWdpc3RlckNvdW50KCkgJiYg
IWlzTW92ZVJlbGF0ZWQob3RoZXJUbXBJbmRleCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobV9m
cmVlemVXb3JrbGlzdC5yZW1vdmUob3RoZXJUbXBJbmRleCkpCisgICAgICAgICAgICAgICAgICAg
IG1fc2ltcGxpZnlXb3JrbGlzdC5hcHBlbmQob3RoZXJUbXBJbmRleCk7CisgICAgICAgICAgICB9
CisgICAgICAgIH0pOworICAgIH0KKworICAgIHZvaWQgZGVjcmVtZW50RGVncmVlKEluZGV4VHlw
ZSB0bXBJbmRleCkKKyAgICB7CisgICAgICAgIEFTU0VSVChtX2RlZ3JlZXNbdG1wSW5kZXhdKTsK
KworICAgICAgICB1bnNpZ25lZCBvbGREZWdyZWUgPSBtX2RlZ3JlZXNbdG1wSW5kZXhdLS07Cisg
ICAgICAgIGlmIChvbGREZWdyZWUgPT0gcmVnaXN0ZXJDb3VudCgpKSB7CisgICAgICAgICAgICBl
bmFibGVNb3Zlc09uVmFsdWVBbmRBZGphY2VudHModG1wSW5kZXgpOworICAgICAgICAgICAgbV9z
cGlsbFdvcmtsaXN0LnF1aWNrQ2xlYXIodG1wSW5kZXgpOworICAgICAgICAgICAgaWYgKGlzTW92
ZVJlbGF0ZWQodG1wSW5kZXgpKQorICAgICAgICAgICAgICAgIG1fZnJlZXplV29ya2xpc3QuYWRk
KHRtcEluZGV4KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtX3NpbXBsaWZ5
V29ya2xpc3QuYXBwZW5kKHRtcEluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQg
c2VsZWN0U3BpbGwoKQorICAgIHsKKyAgICAgICAgSW5kZXhUeXBlIHZpY3RpbUluZGV4ID0gQmFz
ZTo6c2VsZWN0U3BpbGwoKTsKKyAgICAgICAgbV9zcGlsbFdvcmtsaXN0LnF1aWNrQ2xlYXIodmlj
dGltSW5kZXgpOworICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuYXBwZW5kKHZpY3RpbUluZGV4
KTsKKyAgICAgICAgZnJlZXplTW92ZXModmljdGltSW5kZXgpOworICAgIH0KIAotICAgIC8vIFRo
ZSBpbnRlcmZlcmVuY2UgZ3JhcGguCi0gICAgSGFzaFNldDxJbnRlcmZlcmVuY2VFZGdlLCBJbnRl
cmZlcmVuY2VFZGdlSGFzaCwgSW50ZXJmZXJlbmNlRWRnZUhhc2hUcmFpdHM+IG1faW50ZXJmZXJl
bmNlRWRnZXM7Ci0gICAgVmVjdG9yPFZlY3RvcjxJbmRleFR5cGUsIDAsIFVuc2FmZVZlY3Rvck92
ZXJmbG93LCA0PiwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fYWRqYWNlbmN5TGlzdDsKLSAg
ICBWZWN0b3I8SW5kZXhUeXBlLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9kZWdyZWVzOwor
ICAgIHZvaWQgYXNzaWduQ29sb3JzKCkKKyAgICB7CisgICAgICAgIEFTU0VSVChtX2ZyZWV6ZVdv
cmtsaXN0LmlzRW1wdHkoKSk7CisgICAgICAgIG1fd29ya2xpc3RNb3Zlcy5jbGVhcigpOworICAg
ICAgICBCYXNlOjphc3NpZ25Db2xvcnMoKTsKKyAgICB9CiAKLSAgICAvLyBJbnN0ZWFkIG9mIGtl
ZXBpbmcgdHJhY2sgb2YgdGhlIG1vdmUgaW5zdHJ1Y3Rpb25zLCB3ZSBqdXN0IGtlZXAgdGhlaXIg
b3BlcmFuZHMgYXJvdW5kIGFuZCB1c2UgdGhlIGluZGV4Ci0gICAgLy8gaW4gdGhlIHZlY3RvciBh
cyB0aGUgImlkZW50aWZpZXIiIGZvciB0aGUgbW92ZS4KLSAgICBzdHJ1Y3QgTW92ZU9wZXJhbmRz
IHsKLSAgICAgICAgSW5kZXhUeXBlIHNyY0luZGV4OwotICAgICAgICBJbmRleFR5cGUgZHN0SW5k
ZXg7Ci0gICAgfTsKLSAgICBWZWN0b3I8TW92ZU9wZXJhbmRzLCAwLCBVbnNhZmVWZWN0b3JPdmVy
Zmxvdz4gbV9jb2FsZXNjaW5nQ2FuZGlkYXRlczsKIAotICAgIC8vIExpc3Qgb2YgZXZlcnkgbW92
ZSBpbnN0cnVjdGlvbiBhc3NvY2lhdGVkIHdpdGggYSBUbXAuCi0gICAgVmVjdG9yPEhhc2hTZXQ8
SW5kZXhUeXBlLCB0eXBlbmFtZSBEZWZhdWx0SGFzaDxJbmRleFR5cGU+OjpIYXNoLCBXVEY6OlVu
c2lnbmVkV2l0aFplcm9LZXlIYXNoVHJhaXRzPEluZGV4VHlwZT4+PiBtX21vdmVMaXN0OworICAg
IGJvb2wgaXNNb3ZlUmVsYXRlZChJbmRleFR5cGUgdG1wSW5kZXgpCisgICAgeworICAgICAgICBm
b3IgKHVuc2lnbmVkIG1vdmVJbmRleCA6IG1fbW92ZUxpc3RbdG1wSW5kZXhdKSB7CisgICAgICAg
ICAgICBpZiAobV9hY3RpdmVNb3Zlcy5xdWlja0dldChtb3ZlSW5kZXgpIHx8IG1fd29ya2xpc3RN
b3Zlcy5jb250YWlucyhtb3ZlSW5kZXgpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwor
ICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAKLSAgICAvLyBDb2xvcnMu
Ci0gICAgVmVjdG9yPFJlZywgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fY29sb3JlZFRtcDsK
LSAgICBWZWN0b3I8SW5kZXhUeXBlPiBtX3NwaWxsZWRUbXBzOworICAgIHRlbXBsYXRlPHR5cGVu
YW1lIEZ1bmN0aW9uPgorICAgIHZvaWQgZm9yRWFjaE5vZGVNb3ZlcyhJbmRleFR5cGUgdG1wSW5k
ZXgsIEZ1bmN0aW9uIGZ1bmN0aW9uKQorICAgIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBtb3Zl
SW5kZXggOiBtX21vdmVMaXN0W3RtcEluZGV4XSkgeworICAgICAgICAgICAgaWYgKG1fYWN0aXZl
TW92ZXMucXVpY2tHZXQobW92ZUluZGV4KSB8fCBtX3dvcmtsaXN0TW92ZXMuY29udGFpbnMobW92
ZUluZGV4KSkKKyAgICAgICAgICAgICAgICBmdW5jdGlvbihtb3ZlSW5kZXgpOworICAgICAgICB9
CisgICAgfQogCi0gICAgLy8gVmFsdWVzIHRoYXQgaGF2ZSBiZWVuIGNvYWxlc2NlZCB3aXRoIGFu
IG90aGVyIHZhbHVlLgotICAgIFZlY3RvcjxJbmRleFR5cGUsIDAsIFVuc2FmZVZlY3Rvck92ZXJm
bG93PiBtX2NvYWxlc2NlZFRtcHM7CisgICAgdm9pZCBlbmFibGVNb3Zlc09uVmFsdWUoSW5kZXhU
eXBlIHRtcEluZGV4KQorICAgIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBtb3ZlSW5kZXggOiBt
X21vdmVMaXN0W3RtcEluZGV4XSkgeworICAgICAgICAgICAgaWYgKG1fYWN0aXZlTW92ZXMucXVp
Y2tDbGVhcihtb3ZlSW5kZXgpKQorICAgICAgICAgICAgICAgIG1fd29ya2xpc3RNb3Zlcy5yZXR1
cm5Nb3ZlKG1vdmVJbmRleCk7CisgICAgICAgIH0KKyAgICB9CiAKLSAgICAvLyBUaGUgc3RhY2sg
b2YgVG1wIHJlbW92ZWQgZnJvbSB0aGUgZ3JhcGggYW5kIHJlYWR5IGZvciBjb2xvcmluZy4KLSAg
ICBCaXRWZWN0b3IgbV9pc09uU2VsZWN0U3RhY2s7Ci0gICAgVmVjdG9yPEluZGV4VHlwZT4gbV9z
ZWxlY3RTdGFjazsKKyAgICB2b2lkIGVuYWJsZU1vdmVzT25WYWx1ZUFuZEFkamFjZW50cyhJbmRl
eFR5cGUgdG1wSW5kZXgpCisgICAgeworICAgICAgICBlbmFibGVNb3Zlc09uVmFsdWUodG1wSW5k
ZXgpOwogCi0gICAgSW5kZXhUeXBlIG1fZnJhbWVQb2ludGVySW5kZXggeyAwIH07Ci0gICAgQml0
VmVjdG9yIG1faW50ZXJmZXJlc1dpdGhGcmFtZVBvaW50ZXI7CisgICAgICAgIGZvckVhY2hBZGph
Y2VudCh0bXBJbmRleCwgW3RoaXNdIChJbmRleFR5cGUgYWRqYWNlbnRUbXBJbmRleCkgeworICAg
ICAgICAgICAgZW5hYmxlTW92ZXNPblZhbHVlKGFkamFjZW50VG1wSW5kZXgpOworICAgICAgICB9
KTsKKyAgICB9CiAKICAgICBzdHJ1Y3QgT3JkZXJlZE1vdmVTZXQgewogICAgICAgICB1bnNpZ25l
ZCBhZGRNb3ZlKCkKQEAgLTcwMiw2ICsxMjc3LDExIEBAIHByb3RlY3RlZDoKICAgICAgICAgICAg
IG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5jbGVhcigpOwogICAgICAgICB9CiAKKyAgICAgICAgdW5z
aWduZWQgdG90YWxOdW1iZXJPZk1vdmVzKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJu
IG1fbW92ZUxpc3Quc2l6ZSgpICsgbV9sb3dQcmlvcml0eU1vdmVMaXN0LnNpemUoKTsKKyAgICAg
ICAgfQorCiAgICAgcHJpdmF0ZToKICAgICAgICAgVmVjdG9yPHVuc2lnbmVkLCAwLCBVbnNhZmVW
ZWN0b3JPdmVyZmxvdz4gbV9wb3NpdGlvbkluTW92ZUxpc3Q7CiAgICAgICAgIFZlY3Rvcjx1bnNp
Z25lZCwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fbW92ZUxpc3Q7CkBAIC03MDksNTAgKzEy
ODksNzkgQEAgcHJvdGVjdGVkOgogICAgICAgICB1bnNpZ25lZCBtX2ZpcnN0TG93UHJpb3JpdHlN
b3ZlSW5kZXggeyAwIH07CiAgICAgfTsKIAorICAgIHZvaWQgZHVtcFdvcmtMaXN0cyhQcmludFN0
cmVhbSYgb3V0KQorICAgIHsKKyAgICAgICAgb3V0LnByaW50KCJTaW1wbGlmeSB3b3JrIGxpc3Q6
XG4iKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCB0bXBJbmRleCA6IG1fc2ltcGxpZnlXb3JrbGlz
dCkKKyAgICAgICAgICAgIG91dC5wcmludCgiICAgICIsIFRtcE1hcHBlcjo6dG1wRnJvbUFic29s
dXRlSW5kZXgodG1wSW5kZXgpLCAiXG4iKTsKKyAgICAgICAgb3V0LnByaW50ZigiTW92ZXMgd29y
ayBsaXN0IGlzIGVtcHR5PyAlZFxuIiwgbV93b3JrbGlzdE1vdmVzLmlzRW1wdHkoKSk7CisgICAg
ICAgIG91dC5wcmludCgiRnJlZXplIHdvcmsgbGlzdDpcbiIpOworICAgICAgICBmb3IgKHVuc2ln
bmVkIHRtcEluZGV4IDogbV9mcmVlemVXb3JrbGlzdCkKKyAgICAgICAgICAgIG91dC5wcmludCgi
ICAgICIsIFRtcE1hcHBlcjo6dG1wRnJvbUFic29sdXRlSW5kZXgodG1wSW5kZXgpLCAiXG4iKTsK
KyAgICAgICAgb3V0LnByaW50KCJTcGlsbCB3b3JrIGxpc3Q6XG4iKTsKKyAgICAgICAgZm9yICh1
bnNpZ25lZCB0bXBJbmRleCA6IG1fc3BpbGxXb3JrbGlzdCkKKyAgICAgICAgICAgIG91dC5wcmlu
dCgiICAgICIsIFRtcE1hcHBlcjo6dG1wRnJvbUFic29sdXRlSW5kZXgodG1wSW5kZXgpLCAiXG4i
KTsKKyAgICB9CisKICAgICAvLyBXb3JrIGxpc3RzLgorICAgIC8vIExvdy1kZWdyZWUsIE1vdmUg
cmVsYXRlZC4KKyAgICBIYXNoU2V0PEluZGV4VHlwZT4gbV9mcmVlemVXb3JrbGlzdDsKICAgICAv
LyBTZXQgb2YgIm1vdmUiIGVuYWJsZWQgZm9yIHBvc3NpYmxlIGNvYWxlc2NpbmcuCiAgICAgT3Jk
ZXJlZE1vdmVTZXQgbV93b3JrbGlzdE1vdmVzOwogICAgIC8vIFNldCBvZiAibW92ZSIgbm90IHll
dCByZWFkeSBmb3IgY29hbGVzY2luZy4KICAgICBCaXRWZWN0b3IgbV9hY3RpdmVNb3ZlczsKLSAg
ICAvLyBMb3ctZGVncmVlLCBub24tTW92ZSByZWxhdGVkLgotICAgIFZlY3RvcjxJbmRleFR5cGU+
IG1fc2ltcGxpZnlXb3JrbGlzdDsKLSAgICAvLyBIaWdoLWRlZ3JlZSBUbXAuCi0gICAgSGFzaFNl
dDxJbmRleFR5cGU+IG1fc3BpbGxXb3JrbGlzdDsKLSAgICAvLyBMb3ctZGVncmVlLCBNb3ZlIHJl
bGF0ZWQuCi0gICAgSGFzaFNldDxJbmRleFR5cGU+IG1fZnJlZXplV29ya2xpc3Q7Ci0KLSAgICBi
b29sIG1faGFzU2VsZWN0ZWRTcGlsbCB7IGZhbHNlIH07Ci0gICAgYm9vbCBtX2hhc0NvYWxlc2Nl
ZE5vblRyaXZpYWxNb3ZlIHsgZmFsc2UgfTsKLQotICAgIC8vIFRoZSBtYXBwaW5nIG9mIFRtcCB0
byB0aGVpciBhbGlhcyBmb3IgTW92ZXMgdGhhdCBhcmUgYWx3YXlzIGNvYWxlc2NpbmcgcmVnYXJk
bGVzcyBvZiBzcGlsbGluZy4KLSAgICBWZWN0b3I8SW5kZXhUeXBlLCAwLCBVbnNhZmVWZWN0b3JP
dmVyZmxvdz4gbV9jb2FsZXNjZWRUbXBzQXRTcGlsbDsKLSAgICAKLSAgICBjb25zdCBIYXNoU2V0
PHVuc2lnbmVkPiYgbV91bnNwaWxsYWJsZVRtcHM7CiB9OwogCiAvLyBUaGlzIHBlcmZvcm0gYWxs
IHRoZSB0YXNrcyB0aGF0IGFyZSBzcGVjaWZpYyB0byBjZXJ0YWluIHJlZ2lzdGVyIHR5cGUuCi10
ZW1wbGF0ZTxBcmc6OlR5cGUgdHlwZT4KLWNsYXNzIENvbG9yaW5nQWxsb2NhdG9yIDogcHVibGlj
IEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0b3I8dW5zaWduZWQ+IHsKK3RlbXBsYXRlPEFyZzo6VHlw
ZSB0eXBlLCB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIEFsbG9jYXRvclR5cGU+
CitjbGFzcyBDb2xvcmluZ0FsbG9jYXRvciA6IHB1YmxpYyBBbGxvY2F0b3JUeXBlPHVuc2lnbmVk
LCBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPj4geworICAgIHVzaW5nIFRtcE1hcHBlciA9IEFic29s
dXRlVG1wTWFwcGVyPHR5cGU+OworICAgIHVzaW5nIEJhc2UgPSBBbGxvY2F0b3JUeXBlPHVuc2ln
bmVkLCBUbXBNYXBwZXI+OworICAgIHVzaW5nIEJhc2U6Om1faXNPblNlbGVjdFN0YWNrOworICAg
IHVzaW5nIEJhc2U6Om1fc2VsZWN0U3RhY2s7CisgICAgdXNpbmcgQmFzZTo6bV9mcmFtZVBvaW50
ZXJJbmRleDsKKyAgICB1c2luZyBCYXNlOjptX2ludGVyZmVyZXNXaXRoRnJhbWVQb2ludGVyOwor
ICAgIHVzaW5nIEJhc2U6Om1fc2ltcGxpZnlXb3JrbGlzdDsKKyAgICB1c2luZyBCYXNlOjptX3Nw
aWxsV29ya2xpc3Q7CisgICAgdXNpbmcgQmFzZTo6bV9oYXNTZWxlY3RlZFNwaWxsOworICAgIHVz
aW5nIEJhc2U6Om1faGFzQ29hbGVzY2VkTm9uVHJpdmlhbE1vdmU7CisgICAgdXNpbmcgQmFzZTo6
bV9kZWdyZWVzOworICAgIHVzaW5nIEJhc2U6OnJlZ2lzdGVyQ291bnQ7CisgICAgdXNpbmcgQmFz
ZTo6bV9jb2FsZXNjZWRUbXBzOworICAgIHVzaW5nIEJhc2U6Om1fbW92ZUxpc3Q7CisgICAgdXNp
bmcgQmFzZTo6bV91c2VDb3VudHM7CisgICAgdXNpbmcgQmFzZTo6bV9jb2FsZXNjZWRUbXBzQXRT
cGlsbDsKKyAgICB1c2luZyBCYXNlOjptX3NwaWxsZWRUbXBzOworICAgIHVzaW5nIHR5cGVuYW1l
IEJhc2U6Ok1vdmVPcGVyYW5kczsKKyAgICB1c2luZyBCYXNlOjptX2NvYWxlc2NpbmdDYW5kaWRh
dGVzOworICAgIHVzaW5nIEJhc2U6Om1fbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4OworICAg
IHVzaW5nIEJhc2U6Om1fY29sb3JlZFRtcDsKKyAgICB1c2luZyBCYXNlOjptX2NvZGU7CisgICAg
dXNpbmcgdHlwZW5hbWUgQmFzZTo6SW50ZXJmZXJlbmNlRWRnZTsKKyAgICB1c2luZyBCYXNlOjpt
X3dvcmtsaXN0TW92ZXM7CisgICAgdXNpbmcgQmFzZTo6aGFzSW50ZXJmZXJlbmNlRWRnZTsKKyAg
ICB1c2luZyBCYXNlOjpnZXRBbGlhczsKKyAgICB1c2luZyBCYXNlOjphZGRFZGdlOworICAgIHVz
aW5nIEJhc2U6Om1faW50ZXJmZXJlbmNlRWRnZXM7CisKIHB1YmxpYzoKKwogICAgIENvbG9yaW5n
QWxsb2NhdG9yKENvZGUmIGNvZGUsIFRtcFdpZHRoJiB0bXBXaWR0aCwgY29uc3QgVXNlQ291bnRz
PFRtcD4mIHVzZUNvdW50cywgY29uc3QgSGFzaFNldDx1bnNpZ25lZD4mIHVuc3BpbGxhYmxlVG1w
KQotICAgICAgICA6IEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0b3I8dW5zaWduZWQ+KGNvZGUucmVn
c0luUHJpb3JpdHlPcmRlcih0eXBlKSwgQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46Omxhc3RNYWNo
aW5lUmVnaXN0ZXJJbmRleCgpLCB0bXBBcnJheVNpemUoY29kZSksIHVuc3BpbGxhYmxlVG1wKQot
ICAgICAgICAsIG1fY29kZShjb2RlKQorICAgICAgICA6IEJhc2UoY29kZSwgY29kZS5yZWdzSW5Q
cmlvcml0eU9yZGVyKHR5cGUpLCBUbXBNYXBwZXI6Omxhc3RNYWNoaW5lUmVnaXN0ZXJJbmRleCgp
LCB0bXBBcnJheVNpemUoY29kZSksIHVuc3BpbGxhYmxlVG1wLCB1c2VDb3VudHMpCiAgICAgICAg
ICwgbV90bXBXaWR0aCh0bXBXaWR0aCkKLSAgICAgICAgLCBtX3VzZUNvdW50cyh1c2VDb3VudHMp
CiAgICAgewogICAgICAgICBpZiAodHlwZSA9PSBBcmc6OkdQKSB7Ci0gICAgICAgICAgICBtX2Zy
YW1lUG9pbnRlckluZGV4ID0gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgo
VG1wKE1hY3JvQXNzZW1ibGVyOjpmcmFtZVBvaW50ZXJSZWdpc3RlcikpOworICAgICAgICAgICAg
bV9mcmFtZVBvaW50ZXJJbmRleCA9IFRtcE1hcHBlcjo6YWJzb2x1dGVJbmRleChUbXAoTWFjcm9B
c3NlbWJsZXI6OmZyYW1lUG9pbnRlclJlZ2lzdGVyKSk7CiAgICAgICAgICAgICBtX2ludGVyZmVy
ZXNXaXRoRnJhbWVQb2ludGVyLmVuc3VyZVNpemUodG1wQXJyYXlTaXplKGNvZGUpKTsKICAgICAg
ICAgfQogCiAgICAgICAgIGluaXRpYWxpemVQcmVjb2xvcmVkVG1wKCk7CiAgICAgICAgIGJ1aWxk
KCk7Ci0gICAgICAgIGFsbG9jYXRlKCk7CiAgICAgfQogCiAgICAgVG1wIGdldEFsaWFzKFRtcCB0
bXApIGNvbnN0CiAgICAgewotICAgICAgICByZXR1cm4gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46
OnRtcEZyb21BYnNvbHV0ZUluZGV4KGdldEFsaWFzKEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojph
YnNvbHV0ZUluZGV4KHRtcCkpKTsKKyAgICAgICAgcmV0dXJuIFRtcE1hcHBlcjo6dG1wRnJvbUFi
c29sdXRlSW5kZXgoZ2V0QWxpYXMoVG1wTWFwcGVyOjphYnNvbHV0ZUluZGV4KHRtcCkpKTsKICAg
ICB9CiAKICAgICAvLyBUaGlzIHRlbGxzIHlvdSBpZiBhIE1vdmUgd2lsbCBiZSBjb2FsZXNjYWJs
ZSBpZiB0aGUgc3JjIGFuZCBkc3QgZW5kIHVwIG1hdGNoaW5nLiBUaGlzIG1ldGhvZApAQCAtNzc1
LDExICsxMzg0LDExIEBAIHB1YmxpYzoKICAgICAgICAgaWYgKG1fY29hbGVzY2VkVG1wc0F0U3Bp
bGwuaXNFbXB0eSgpKQogICAgICAgICAgICAgcmV0dXJuIHRtcDsKIAotICAgICAgICB1bnNpZ25l
ZCBhbGlhc0luZGV4ID0gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodG1w
KTsKKyAgICAgICAgdW5zaWduZWQgYWxpYXNJbmRleCA9IFRtcE1hcHBlcjo6YWJzb2x1dGVJbmRl
eCh0bXApOwogICAgICAgICB3aGlsZSAodW5zaWduZWQgbmV4dEFsaWFzSW5kZXggPSBtX2NvYWxl
c2NlZFRtcHNBdFNwaWxsW2FsaWFzSW5kZXhdKQogICAgICAgICAgICAgYWxpYXNJbmRleCA9IG5l
eHRBbGlhc0luZGV4OwogCi0gICAgICAgIFRtcCBhbGlhcyA9IEFic29sdXRlVG1wTWFwcGVyPHR5
cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleChhbGlhc0luZGV4KTsKKyAgICAgICAgVG1wIGFsaWFz
ID0gVG1wTWFwcGVyOjp0bXBGcm9tQWJzb2x1dGVJbmRleChhbGlhc0luZGV4KTsKIAogICAgICAg
ICBBU1NFUlRfV0lUSF9NRVNTQUdFKCFtX3NwaWxsZWRUbXBzLmNvbnRhaW5zKGFsaWFzSW5kZXgp
IHx8IGFsaWFzID09IHRtcCwgIlRoZSBhbGlhc2VzIGF0IHNwaWxsIHNob3VsZCBhbHdheXMgYmUg
Y29sb3JhYmxlLiBTb21ldGhpbmcgd2VudCBob3JyaWJseSB3cm9uZy4iKTsKIApAQCAtNzk0LDcg
KzE0MDMsNyBAQCBwdWJsaWM6CiAgICAgICAgIHsKICAgICAgICAgfQogCi0gICAgICAgIFRtcCBv
cGVyYXRvciooKSBjb25zdCB7IHJldHVybiBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJv
bUFic29sdXRlSW5kZXgoKm1faW5kZXhJdGVyYXRvcik7IH0KKyAgICAgICAgVG1wIG9wZXJhdG9y
KigpIGNvbnN0IHsgcmV0dXJuIFRtcE1hcHBlcjo6dG1wRnJvbUFic29sdXRlSW5kZXgoKm1faW5k
ZXhJdGVyYXRvcik7IH0KICAgICAgICAgSW5kZXhUb1RtcEl0ZXJhdG9yQWRhcHRvciYgb3BlcmF0
b3IrKygpIHsgKyttX2luZGV4SXRlcmF0b3I7IHJldHVybiAqdGhpczsgfQogCiAgICAgICAgIGJv
b2wgb3BlcmF0b3I9PShjb25zdCBJbmRleFRvVG1wSXRlcmF0b3JBZGFwdG9yJiBvdGhlcikgY29u
c3QKQEAgLTg0Myw3ICsxNDUyLDcgQEAgcHVibGljOgogICAgICAgICBBU1NFUlQobV9jb2xvcmVk
VG1wLnNpemUoKSk7CiAgICAgICAgIEFTU0VSVCh0bXAuaXNHUCgpID09ICh0eXBlID09IEFyZzo6
R1ApKTsKIAotICAgICAgICBSZWcgcmVnID0gbV9jb2xvcmVkVG1wW0Fic29sdXRlVG1wTWFwcGVy
PHR5cGU+OjphYnNvbHV0ZUluZGV4KHRtcCldOworICAgICAgICBSZWcgcmVnID0gbV9jb2xvcmVk
VG1wW1RtcE1hcHBlcjo6YWJzb2x1dGVJbmRleCh0bXApXTsKICAgICAgICAgaWYgKCFyZWcpIHsK
ICAgICAgICAgICAgIGRhdGFMb2coIkZBVEFMOiBObyBjb2xvciBmb3IgIiwgdG1wLCAiXG4iKTsK
ICAgICAgICAgICAgIGRhdGFMb2coIkNvZGU6XG4iKTsKQEAgLTg1MywxOCArMTQ2MiwxOCBAQCBw
dWJsaWM6CiAgICAgICAgIHJldHVybiByZWc7CiAgICAgfQogCi1wcml2YXRlOgorcHJvdGVjdGVk
OgogICAgIHN0YXRpYyB1bnNpZ25lZCB0bXBBcnJheVNpemUoQ29kZSYgY29kZSkKICAgICB7CiAg
ICAgICAgIHVuc2lnbmVkIG51bVRtcHMgPSBjb2RlLm51bVRtcHModHlwZSk7Ci0gICAgICAgIHJl
dHVybiBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChudW1UbXBzKTsKKyAg
ICAgICAgcmV0dXJuIFRtcE1hcHBlcjo6YWJzb2x1dGVJbmRleChudW1UbXBzKTsKICAgICB9CiAK
ICAgICB2b2lkIGluaXRpYWxpemVQcmVjb2xvcmVkVG1wKCkKICAgICB7CiAgICAgICAgIG1fY29s
b3JlZFRtcC5yZXNpemUobV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXggKyAxKTsKICAgICAg
ICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8PSBtX2xhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRl
eDsgKytpKSB7Ci0gICAgICAgICAgICBUbXAgdG1wID0gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46
OnRtcEZyb21BYnNvbHV0ZUluZGV4KGkpOworICAgICAgICAgICAgVG1wIHRtcCA9IFRtcE1hcHBl
cjo6dG1wRnJvbUFic29sdXRlSW5kZXgoaSk7CiAgICAgICAgICAgICBBU1NFUlQodG1wLmlzUmVn
KCkpOwogICAgICAgICAgICAgbV9jb2xvcmVkVG1wW2ldID0gdG1wLnJlZygpOwogICAgICAgICB9
CkBAIC04ODQsMTAgKzE0OTMsMTAgQEAgcHJpdmF0ZToKICAgICAgICAgaWYgKGxlZnRUbXAuaXNH
UCgpICE9ICh0eXBlID09IEFyZzo6R1ApIHx8IHJpZ2h0VG1wLmlzR1AoKSAhPSAodHlwZSA9PSBB
cmc6OkdQKSkKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgICAgICB1bnNpZ25lZCBs
ZWZ0SW5kZXggPSBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChsZWZ0VG1w
KTsKLSAgICAgICAgdW5zaWduZWQgcmlnaHRJbmRleCA9IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+
OjphYnNvbHV0ZUluZGV4KHJpZ2h0VG1wKTsKKyAgICAgICAgdW5zaWduZWQgbGVmdEluZGV4ID0g
VG1wTWFwcGVyOjphYnNvbHV0ZUluZGV4KGxlZnRUbXApOworICAgICAgICB1bnNpZ25lZCByaWdo
dEluZGV4ID0gVG1wTWFwcGVyOjphYnNvbHV0ZUluZGV4KHJpZ2h0VG1wKTsKIAotICAgICAgICBy
ZXR1cm4gIW1faW50ZXJmZXJlbmNlRWRnZXMuY29udGFpbnMoSW50ZXJmZXJlbmNlRWRnZShsZWZ0
SW5kZXgsIHJpZ2h0SW5kZXgpKTsKKyAgICAgICAgcmV0dXJuICFoYXNJbnRlcmZlcmVuY2VFZGdl
KEludGVyZmVyZW5jZUVkZ2UobGVmdEluZGV4LCByaWdodEluZGV4KSk7CiAgICAgfQogCiAgICAg
dm9pZCBhZGRUb0xvd1ByaW9yaXR5Q29hbGVzY2luZ0NhbmRpZGF0ZXMoQXJnIGxlZnQsIEFyZyBy
aWdodCkKQEAgLTg5Niw4ICsxNTA1LDggQEAgcHJpdmF0ZToKICAgICAgICAgVG1wIGxlZnRUbXAg
PSBsZWZ0LnRtcCgpOwogICAgICAgICBUbXAgcmlnaHRUbXAgPSByaWdodC50bXAoKTsKIAotICAg
ICAgICB1bnNpZ25lZCBsZWZ0SW5kZXggPSBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1
dGVJbmRleChsZWZ0VG1wKTsKLSAgICAgICAgdW5zaWduZWQgcmlnaHRJbmRleCA9IEFic29sdXRl
VG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHJpZ2h0VG1wKTsKKyAgICAgICAgdW5zaWdu
ZWQgbGVmdEluZGV4ID0gVG1wTWFwcGVyOjphYnNvbHV0ZUluZGV4KGxlZnRUbXApOworICAgICAg
ICB1bnNpZ25lZCByaWdodEluZGV4ID0gVG1wTWFwcGVyOjphYnNvbHV0ZUluZGV4KHJpZ2h0VG1w
KTsKIAogICAgICAgICB1bnNpZ25lZCBuZXh0TW92ZUluZGV4ID0gbV9jb2FsZXNjaW5nQ2FuZGlk
YXRlcy5zaXplKCk7CiAgICAgICAgIG1fY29hbGVzY2luZ0NhbmRpZGF0ZXMuYXBwZW5kKHsgbGVm
dEluZGV4LCByaWdodEluZGV4IH0pOwpAQCAtOTA1LDE1ICsxNTE0LDE1IEBAIHByaXZhdGU6CiAg
ICAgICAgIHVuc2lnbmVkIG5ld0luZGV4SW5Xb3JrbGlzdCA9IG1fd29ya2xpc3RNb3Zlcy5hZGRM
b3dQcmlvcml0eU1vdmUoKTsKICAgICAgICAgQVNTRVJUX1VOVVNFRChuZXdJbmRleEluV29ya2xp
c3QsIG5ld0luZGV4SW5Xb3JrbGlzdCA9PSBuZXh0TW92ZUluZGV4KTsKIAotICAgICAgICBBU1NF
UlQobmV4dE1vdmVJbmRleCA8PSBtX2FjdGl2ZU1vdmVzLnNpemUoKSk7Ci0gICAgICAgIG1fYWN0
aXZlTW92ZXMuZW5zdXJlU2l6ZShuZXh0TW92ZUluZGV4ICsgMSk7Ci0KICAgICAgICAgbV9tb3Zl
TGlzdFtsZWZ0SW5kZXhdLmFkZChuZXh0TW92ZUluZGV4KTsKICAgICAgICAgbV9tb3ZlTGlzdFty
aWdodEluZGV4XS5hZGQobmV4dE1vdmVJbmRleCk7CiAgICAgfQogCiAgICAgdm9pZCBidWlsZCgp
CiAgICAgeworICAgICAgICBtX2NvYWxlc2NpbmdDYW5kaWRhdGVzLmNsZWFyKCk7CisgICAgICAg
IG1fd29ya2xpc3RNb3Zlcy5jbGVhcigpOworCiAgICAgICAgIFRtcExpdmVuZXNzPHR5cGU+IGxp
dmVuZXNzKG1fY29kZSk7CiAgICAgICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBtX2NvZGUp
IHsKICAgICAgICAgICAgIHR5cGVuYW1lIFRtcExpdmVuZXNzPHR5cGU+OjpMb2NhbENhbGMgbG9j
YWxDYWxjKGxpdmVuZXNzLCBibG9jayk7CkBAIC05MzIsNiArMTU0MSw3IEBAIHByaXZhdGU6CiAg
ICAgewogICAgICAgICBpZiAodHJhY2VEZWJ1ZykKICAgICAgICAgICAgIGRhdGFMb2coIkJ1aWxk
aW5nIGJldHdlZW4gIiwgcG9pbnRlckR1bXAocHJldkluc3QpLCAiIGFuZCAiLCBwb2ludGVyRHVt
cChuZXh0SW5zdCksICI6XG4iKTsKKwogICAgICAgICBJbnN0Ojpmb3JFYWNoRGVmV2l0aEV4dHJh
Q2xvYmJlcmVkUmVnczxUbXA+KAogICAgICAgICAgICAgcHJldkluc3QsIG5leHRJbnN0LAogICAg
ICAgICAgICAgWyZdIChjb25zdCBUbXAmIGFyZywgQXJnOjpSb2xlLCBBcmc6OlR5cGUgYXJnVHlw
ZSwgQXJnOjpXaWR0aCkgewpAQCAtOTcxLDE2ICsxNTgxLDE1IEBAIHByaXZhdGU6CiAgICAgICAg
ICAgICBBU1NFUlQodXNlVG1wKTsKIAogICAgICAgICAgICAgdW5zaWduZWQgbmV4dE1vdmVJbmRl
eCA9IG1fY29hbGVzY2luZ0NhbmRpZGF0ZXMuc2l6ZSgpOwotICAgICAgICAgICAgbV9jb2FsZXNj
aW5nQ2FuZGlkYXRlcy5hcHBlbmQoeyBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJ
bmRleCh1c2VUbXApLCBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChkZWZU
bXApIH0pOworICAgICAgICAgICAgbV9jb2FsZXNjaW5nQ2FuZGlkYXRlcy5hcHBlbmQoeyBUbXBN
YXBwZXI6OmFic29sdXRlSW5kZXgodXNlVG1wKSwgVG1wTWFwcGVyOjphYnNvbHV0ZUluZGV4KGRl
ZlRtcCkgfSk7CisgICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKKyAgICAgICAgICAgICAgICBk
YXRhTG9nTG4oIk1vdmUgYXQgaW5kZXggIiwgbmV4dE1vdmVJbmRleCwgIiBpczogIiwgKnByZXZJ
bnN0KTsKIAogICAgICAgICAgICAgdW5zaWduZWQgbmV3SW5kZXhJbldvcmtsaXN0ID0gbV93b3Jr
bGlzdE1vdmVzLmFkZE1vdmUoKTsKICAgICAgICAgICAgIEFTU0VSVF9VTlVTRUQobmV3SW5kZXhJ
bldvcmtsaXN0LCBuZXdJbmRleEluV29ya2xpc3QgPT0gbmV4dE1vdmVJbmRleCk7CiAKLSAgICAg
ICAgICAgIEFTU0VSVChuZXh0TW92ZUluZGV4IDw9IG1fYWN0aXZlTW92ZXMuc2l6ZSgpKTsKLSAg
ICAgICAgICAgIG1fYWN0aXZlTW92ZXMuZW5zdXJlU2l6ZShuZXh0TW92ZUluZGV4ICsgMSk7Ci0K
ICAgICAgICAgICAgIGZvciAoY29uc3QgQXJnJiBhcmcgOiBwcmV2SW5zdC0+YXJncykgewotICAg
ICAgICAgICAgICAgIGF1dG8mIGxpc3QgPSBtX21vdmVMaXN0W0Fic29sdXRlVG1wTWFwcGVyPHR5
cGU+OjphYnNvbHV0ZUluZGV4KGFyZy50bXAoKSldOworICAgICAgICAgICAgICAgIGF1dG8mIGxp
c3QgPSBtX21vdmVMaXN0W1RtcE1hcHBlcjo6YWJzb2x1dGVJbmRleChhcmcudG1wKCkpXTsKICAg
ICAgICAgICAgICAgICBsaXN0LmFkZChuZXh0TW92ZUluZGV4KTsKICAgICAgICAgICAgIH0KIApA
QCAtMTA0Myw3ICsxNjUyLDcgQEAgcHJpdmF0ZToKICAgICAgICAgICAgICAgICB9CiAKICAgICAg
ICAgICAgICAgICBpZiAodHlwZSA9PSBBcmc6OkdQICYmICFhcmcuaXNHUFIoKSkKLSAgICAgICAg
ICAgICAgICAgICAgbV9pbnRlcmZlcmVzV2l0aEZyYW1lUG9pbnRlci5xdWlja1NldChBYnNvbHV0
ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChhcmcpKTsKKyAgICAgICAgICAgICAgICAg
ICAgbV9pbnRlcmZlcmVzV2l0aEZyYW1lUG9pbnRlci5xdWlja1NldChUbXBNYXBwZXI6OmFic29s
dXRlSW5kZXgoYXJnKSk7CiAgICAgICAgICAgICB9KTsKICAgICB9CiAKQEAgLTEwNTEsNyArMTY2
MCw3IEBAIHByaXZhdGU6CiAgICAgewogICAgICAgICBBU1NFUlRfV0lUSF9NRVNTQUdFKGEuaXNH
UCgpID09IGIuaXNHUCgpLCAiQW4gaW50ZXJmZXJlbmNlIGJldHdlZW4gcmVnaXN0ZXJzIG9mIGRp
ZmZlcmVudCB0eXBlcyBkb2VzIG5vdCBtYWtlIHNlbnNlLCBpdCBjYW4gbGVhZCB0byBub24tY29s
b3JhYmxlIGdyYXBocy4iKTsKIAotICAgICAgICBhZGRFZGdlKEFic29sdXRlVG1wTWFwcGVyPHR5
cGU+OjphYnNvbHV0ZUluZGV4KGEpLCBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJ
bmRleChiKSk7CisgICAgICAgIGFkZEVkZ2UoVG1wTWFwcGVyOjphYnNvbHV0ZUluZGV4KGEpLCBU
bXBNYXBwZXI6OmFic29sdXRlSW5kZXgoYikpOwogICAgIH0KIAogICAgIC8vIENhbGxpbmcgdGhp
cyB3aXRob3V0IGEgdG1wV2lkdGggd2lsbCBwZXJmb3JtIGEgbW9yZSBjb25zZXJ2YXRpdmUgY29h
bGVzY2luZyBhbmFseXNpcyB0aGF0IGFzc3VtZXMKQEAgLTExMDYsMTczICsxNzE1LDI0IEBAIHBy
aXZhdGU6CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIHZvaWQgc2VsZWN0U3Bp
bGwoKQotICAgIHsKLSAgICAgICAgaWYgKCFtX2hhc1NlbGVjdGVkU3BpbGwpIHsKLSAgICAgICAg
ICAgIG1faGFzU2VsZWN0ZWRTcGlsbCA9IHRydWU7Ci0KLSAgICAgICAgICAgIGlmIChtX2hhc0Nv
YWxlc2NlZE5vblRyaXZpYWxNb3ZlKQotICAgICAgICAgICAgICAgIG1fY29hbGVzY2VkVG1wc0F0
U3BpbGwgPSBtX2NvYWxlc2NlZFRtcHM7Ci0gICAgICAgIH0KLQotICAgICAgICBhdXRvIGl0ZXJh
dG9yID0gbV9zcGlsbFdvcmtsaXN0LmJlZ2luKCk7Ci0KLSAgICAgICAgUkVMRUFTRV9BU1NFUlRf
V0lUSF9NRVNTQUdFKGl0ZXJhdG9yICE9IG1fc3BpbGxXb3JrbGlzdC5lbmQoKSwgInNlbGVjdFNw
aWxsKCkgY2FsbGVkIHdoZW4gdGhlcmUgd2FzIG5vIHNwaWxsLiIpOwotICAgICAgICBSRUxFQVNF
X0FTU0VSVF9XSVRIX01FU1NBR0UoIW1fdW5zcGlsbGFibGVUbXBzLmNvbnRhaW5zKCppdGVyYXRv
ciksICJ0cnlpbmcgdG8gc3BpbGwgdW5zcGlsbGFibGUgdG1wIik7Ci0KLSAgICAgICAgLy8gSGln
aGVyIHNjb3JlIG1lYW5zIG1vcmUgZGVzaXJhYmxlIHRvIHNwaWxsLiBMb3dlciBzY29yZXMgbWF4
aW1pemUgdGhlIGxpa2VsaWhvb2QgdGhhdCBhIHRtcAotICAgICAgICAvLyBnZXRzIGEgcmVnaXN0
ZXIuCi0gICAgICAgIGF1dG8gc2NvcmUgPSBbJl0gKFRtcCB0bXApIC0+IGRvdWJsZSB7Ci0gICAg
ICAgICAgICAvLyBBaXIgZXhwb3NlcyB0aGUgY29uY2VwdCBvZiAiZmFzdCB0bXBzIiwgYW5kIHdl
IGludGVycHJldCB0aGF0IHRvIG1lYW4gdGhhdCB0aGUgdG1wCi0gICAgICAgICAgICAvLyBzaG91
bGQgYWx3YXlzIGJlIGluIGEgcmVnaXN0ZXIuCi0gICAgICAgICAgICBpZiAobV9jb2RlLmlzRmFz
dFRtcCh0bXApKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgCi0gICAg
ICAgICAgICAvLyBBbGwgZWxzZSBiZWluZyBlcXVhbCwgdGhlIHNjb3JlIHNob3VsZCBiZSBkaXJl
Y3RseSByZWxhdGVkIHRvIHRoZSBkZWdyZWUuCi0gICAgICAgICAgICBkb3VibGUgZGVncmVlID0g
c3RhdGljX2Nhc3Q8ZG91YmxlPihtX2RlZ3JlZXNbQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFi
c29sdXRlSW5kZXgodG1wKV0pOwotCi0gICAgICAgICAgICAvLyBBbGwgZWxzZSBiZWluZyBlcXVh
bCwgdGhlIHNjb3JlIHNob3VsZCBiZSBpbnZlcnNlbHkgcmVsYXRlZCB0byB0aGUgbnVtYmVyIG9m
IHdhcm0gdXNlcyBhbmQKLSAgICAgICAgICAgIC8vIGRlZnMuCi0gICAgICAgICAgICBjb25zdCBV
c2VDb3VudHM8VG1wPjo6Q291bnRzKiBjb3VudHMgPSBtX3VzZUNvdW50c1t0bXBdOwotICAgICAg
ICAgICAgaWYgKCFjb3VudHMpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19s
aW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZG91
YmxlIHVzZXMgPSBjb3VudHMtPm51bVdhcm1Vc2VzICsgY291bnRzLT5udW1EZWZzOwotCi0gICAg
ICAgICAgICAvLyBJZiBpdCdzIGEgY29uc3RhbnQsIHRoZW4gaXQncyBub3QgYXMgYmFkIHRvIHNw
aWxsLiBXZSBjYW4gcmVtYXRlcmlhbGl6ZSBpdCBpbiBtYW55Ci0gICAgICAgICAgICAvLyBjYXNl
cy4KLSAgICAgICAgICAgIGlmIChjb3VudHMtPm51bUNvbnN0RGVmcyA9PSAxICYmIGNvdW50cy0+
bnVtRGVmcyA9PSAxKQotICAgICAgICAgICAgICAgIHVzZXMgLz0gMjsKLQotICAgICAgICAgICAg
cmV0dXJuIGRlZ3JlZSAvIHVzZXM7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgYXV0byB2aWN0aW1J
dGVyYXRvciA9IGl0ZXJhdG9yOwotICAgICAgICBkb3VibGUgbWF4U2NvcmUgPSBzY29yZShBYnNv
bHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgoKml0ZXJhdG9yKSk7Ci0K
LSAgICAgICAgKytpdGVyYXRvcjsKLSAgICAgICAgZm9yICg7aXRlcmF0b3IgIT0gbV9zcGlsbFdv
cmtsaXN0LmVuZCgpOyArK2l0ZXJhdG9yKSB7Ci0gICAgICAgICAgICBkb3VibGUgdG1wU2NvcmUg
PSBzY29yZShBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgoKml0
ZXJhdG9yKSk7Ci0gICAgICAgICAgICBpZiAodG1wU2NvcmUgPiBtYXhTY29yZSkgewotICAgICAg
ICAgICAgICAgIEFTU0VSVCghbV91bnNwaWxsYWJsZVRtcHMuY29udGFpbnMoKml0ZXJhdG9yKSk7
Ci0gICAgICAgICAgICAgICAgdmljdGltSXRlcmF0b3IgPSBpdGVyYXRvcjsKLSAgICAgICAgICAg
ICAgICBtYXhTY29yZSA9IHRtcFNjb3JlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAg
ICAgICAgdW5zaWduZWQgdmljdGltSW5kZXggPSAqdmljdGltSXRlcmF0b3I7Ci0gICAgICAgIG1f
c3BpbGxXb3JrbGlzdC5yZW1vdmUodmljdGltSXRlcmF0b3IpOwotICAgICAgICBtX3NpbXBsaWZ5
V29ya2xpc3QuYXBwZW5kKHZpY3RpbUluZGV4KTsKLQotICAgICAgICBmcmVlemVNb3Zlcyh2aWN0
aW1JbmRleCk7Ci0gICAgfQotCi0gICAgdm9pZCBhbGxvY2F0ZSgpCi0gICAgewotICAgICAgICBB
U1NFUlRfV0lUSF9NRVNTQUdFKG1fYWN0aXZlTW92ZXMuc2l6ZSgpID49IG1fY29hbGVzY2luZ0Nh
bmRpZGF0ZXMuc2l6ZSgpLCAiVGhlIGFjdGl2ZU1vdmUgc2V0IHNob3VsZCBiZSBiaWcgZW5vdWdo
IGZvciB0aGUgcXVpY2sgb3BlcmF0aW9ucyBvZiBCaXRWZWN0b3IuIik7Ci0KLSAgICAgICAgbWFr
ZVdvcmtMaXN0KCk7Ci0KLSAgICAgICAgaWYgKGRlYnVnKSB7Ci0gICAgICAgICAgICBkYXRhTG9n
KCJJbnRlcmZlcmVuY2U6ICIsIGxpc3REdW1wKG1faW50ZXJmZXJlbmNlRWRnZXMpLCAiXG4iKTsK
LSAgICAgICAgICAgIGR1bXBJbnRlcmZlcmVuY2VHcmFwaEluRG90KFdURjo6ZGF0YUZpbGUoKSk7
Ci0gICAgICAgICAgICBkYXRhTG9nKCJDb2FsZXNjaW5nIGNhbmRpZGF0ZXM6XG4iKTsKLSAgICAg
ICAgICAgIGZvciAoTW92ZU9wZXJhbmRzJiBtb3ZlT3AgOiBtX2NvYWxlc2NpbmdDYW5kaWRhdGVz
KSB7Ci0gICAgICAgICAgICAgICAgZGF0YUxvZygiICAgICIsIEFic29sdXRlVG1wTWFwcGVyPHR5
cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleChtb3ZlT3Auc3JjSW5kZXgpLAotICAgICAgICAgICAg
ICAgICAgICAiIC0+ICIsIEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJ
bmRleChtb3ZlT3AuZHN0SW5kZXgpLCAiXG4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAg
IGRhdGFMb2coIkluaXRpYWwgd29yayBsaXN0XG4iKTsKLSAgICAgICAgICAgIGR1bXBXb3JrTGlz
dHMoV1RGOjpkYXRhRmlsZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGRvIHsKLSAgICAgICAg
ICAgIGlmICh0cmFjZURlYnVnKSB7Ci0gICAgICAgICAgICAgICAgZGF0YUxvZygiQmVmb3JlIEdy
YXBoIHNpbXBsaWZpY2F0aW9uIGl0ZXJhdGlvblxuIik7Ci0gICAgICAgICAgICAgICAgZHVtcFdv
cmtMaXN0cyhXVEY6OmRhdGFGaWxlKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBp
ZiAoIW1fc2ltcGxpZnlXb3JrbGlzdC5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgc2ltcGxp
ZnkoKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKCFtX3dvcmtsaXN0TW92ZXMuaXNFbXB0eSgpKQot
ICAgICAgICAgICAgICAgIGNvYWxlc2NlKCk7Ci0gICAgICAgICAgICBlbHNlIGlmICghbV9mcmVl
emVXb3JrbGlzdC5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgZnJlZXplKCk7Ci0gICAgICAg
ICAgICBlbHNlIGlmICghbV9zcGlsbFdvcmtsaXN0LmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAg
ICBzZWxlY3RTcGlsbCgpOwotCi0gICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykgewotICAgICAg
ICAgICAgICAgIGRhdGFMb2coIkFmdGVyIEdyYXBoIHNpbXBsaWZpY2F0aW9uIGl0ZXJhdGlvblxu
Iik7Ci0gICAgICAgICAgICAgICAgZHVtcFdvcmtMaXN0cyhXVEY6OmRhdGFGaWxlKCkpOwotICAg
ICAgICAgICAgfQotICAgICAgICB9IHdoaWxlICghbV9zaW1wbGlmeVdvcmtsaXN0LmlzRW1wdHko
KSB8fCAhbV93b3JrbGlzdE1vdmVzLmlzRW1wdHkoKSB8fCAhbV9mcmVlemVXb3JrbGlzdC5pc0Vt
cHR5KCkgfHwgIW1fc3BpbGxXb3JrbGlzdC5pc0VtcHR5KCkpOwotCi0gICAgICAgIGFzc2lnbkNv
bG9ycygpOwotICAgIH0KLQotI2lmIFBMQVRGT1JNKENPQ09BKQotI3ByYWdtYSBtYXJrIC0gRGVi
dWdnaW5nIGhlbHBlcnMuCi0jZW5kaWYKLQotICAgIHZvaWQgZHVtcEludGVyZmVyZW5jZUdyYXBo
SW5Eb3QoUHJpbnRTdHJlYW0mIG91dCkKLSAgICB7Ci0gICAgICAgIG91dC5wcmludCgiZ3JhcGgg
SW50ZXJmZXJlbmNlR3JhcGggeyBcbiIpOwotCi0gICAgICAgIEhhc2hTZXQ8VG1wPiB0bXBzV2l0
aEludGVyZmVyZW5jZXM7Ci0gICAgICAgIGZvciAoY29uc3QgYXV0byYgZWRnZSA6IG1faW50ZXJm
ZXJlbmNlRWRnZXMpIHsKLSAgICAgICAgICAgIHRtcHNXaXRoSW50ZXJmZXJlbmNlcy5hZGQoQWJz
b2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KGVkZ2UuZmlyc3QoKSkp
OwotICAgICAgICAgICAgdG1wc1dpdGhJbnRlcmZlcmVuY2VzLmFkZChBYnNvbHV0ZVRtcE1hcHBl
cjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgoZWRnZS5zZWNvbmQoKSkpOwotICAgICAgICB9
Ci0KLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiB0bXAgOiB0bXBzV2l0aEludGVyZmVyZW5jZXMp
IHsKLSAgICAgICAgICAgIHVuc2lnbmVkIHRtcEluZGV4ID0gQWJzb2x1dGVUbXBNYXBwZXI8dHlw
ZT46OmFic29sdXRlSW5kZXgodG1wKTsKLSAgICAgICAgICAgIGlmICh0bXBJbmRleCA8IG1fZGVn
cmVlcy5zaXplKCkpCi0gICAgICAgICAgICAgICAgb3V0LnByaW50KCIgICAgIiwgdG1wLmludGVy
bmFsVmFsdWUoKSwgIiBbbGFiZWw9XCIiLCB0bXAsICIgKCIsIG1fZGVncmVlc1t0bXBJbmRleF0s
ICIpXCJdO1xuIik7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgb3V0LnByaW50
KCIgICAgIiwgdG1wLmludGVybmFsVmFsdWUoKSwgIiBbbGFiZWw9XCIiLCB0bXAsICJcIl07XG4i
KTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoY29uc3QgYXV0byYgZWRnZSA6IG1faW50ZXJm
ZXJlbmNlRWRnZXMpCi0gICAgICAgICAgICBvdXQucHJpbnQoIiAgICAiLCBlZGdlLmZpcnN0KCks
ICIgLS0gIiwgZWRnZS5zZWNvbmQoKSwgIjtcbiIpOwotICAgICAgICBvdXQucHJpbnQoIn1cbiIp
OwotICAgIH0KLQotICAgIHZvaWQgZHVtcFdvcmtMaXN0cyhQcmludFN0cmVhbSYgb3V0KQotICAg
IHsKLSAgICAgICAgb3V0LnByaW50KCJTaW1wbGlmeSB3b3JrIGxpc3Q6XG4iKTsKLSAgICAgICAg
Zm9yICh1bnNpZ25lZCB0bXBJbmRleCA6IG1fc2ltcGxpZnlXb3JrbGlzdCkKLSAgICAgICAgICAg
IG91dC5wcmludCgiICAgICIsIEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1
dGVJbmRleCh0bXBJbmRleCksICJcbiIpOwotICAgICAgICBvdXQucHJpbnRmKCJNb3ZlcyB3b3Jr
IGxpc3QgaXMgZW1wdHk/ICVkXG4iLCBtX3dvcmtsaXN0TW92ZXMuaXNFbXB0eSgpKTsKLSAgICAg
ICAgb3V0LnByaW50KCJGcmVlemUgd29yayBsaXN0OlxuIik7Ci0gICAgICAgIGZvciAodW5zaWdu
ZWQgdG1wSW5kZXggOiBtX2ZyZWV6ZVdvcmtsaXN0KQotICAgICAgICAgICAgb3V0LnByaW50KCIg
ICAgIiwgQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KHRtcElu
ZGV4KSwgIlxuIik7Ci0gICAgICAgIG91dC5wcmludCgiU3BpbGwgd29yayBsaXN0OlxuIik7Ci0g
ICAgICAgIGZvciAodW5zaWduZWQgdG1wSW5kZXggOiBtX3NwaWxsV29ya2xpc3QpCi0gICAgICAg
ICAgICBvdXQucHJpbnQoIiAgICAiLCBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFi
c29sdXRlSW5kZXgodG1wSW5kZXgpLCAiXG4iKTsKLSAgICB9Ci0KLSAgICB1c2luZyBBYnN0cmFj
dENvbG9yaW5nQWxsb2NhdG9yPHVuc2lnbmVkPjo6YWRkRWRnZTsKLSAgICB1c2luZyBBYnN0cmFj
dENvbG9yaW5nQWxsb2NhdG9yPHVuc2lnbmVkPjo6Z2V0QWxpYXM7Ci0KLSAgICBDb2RlJiBtX2Nv
ZGU7CiAgICAgVG1wV2lkdGgmIG1fdG1wV2lkdGg7Ci0gICAgLy8gRklYTUU6IHNwaWxsaW5nIHNo
b3VsZCBub3QgdHlwZSBzcGVjaWZpYy4gSXQgaXMgb25seSBhIHNpZGUgZWZmZWN0IG9mIHVzaW5n
IFVzZUNvdW50cy4KLSAgICBjb25zdCBVc2VDb3VudHM8VG1wPiYgbV91c2VDb3VudHM7CiB9Owog
Ci1jbGFzcyBJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZyB7CitjbGFzcyBSZWdpc3RlckFsbG9j
YXRpb24gewogcHVibGljOgotICAgIEl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nKENvZGUmIGNv
ZGUpCisgICAgUmVnaXN0ZXJBbGxvY2F0aW9uKENvZGUmIGNvZGUsIFVzZUNvdW50czxUbXA+JiB1
c2VDb3VudHMpCiAgICAgICAgIDogbV9jb2RlKGNvZGUpCi0gICAgICAgICwgbV91c2VDb3VudHMo
Y29kZSkKKyAgICAgICAgLCBtX3VzZUNvdW50cyh1c2VDb3VudHMpCiAgICAgewogICAgIH0KIAog
ICAgIHZvaWQgcnVuKCkKICAgICB7CiAgICAgICAgIHBhZEludGVyZmVyZW5jZShtX2NvZGUpOwot
ICAgICAgICAKLSAgICAgICAgaXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmdPblR5cGU8QXJnOjpH
UD4oKTsKLSAgICAgICAgaXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmdPblR5cGU8QXJnOjpGUD4o
KTsKKworICAgICAgICBhbGxvY2F0ZU9uVHlwZTxBcmc6OkdQPigpOworICAgICAgICBtX251bUl0
ZXJhdGlvbnMgPSAwOworICAgICAgICBhbGxvY2F0ZU9uVHlwZTxBcmc6OkZQPigpOwogCiAgICAg
ICAgIGZpeFNwaWxsc0FmdGVyVGVybWluYWxzKCk7CiAKQEAgLTEyODIsNyArMTc0Miw3IEBAIHB1
YmxpYzoKIAogcHJpdmF0ZToKICAgICB0ZW1wbGF0ZTxBcmc6OlR5cGUgdHlwZT4KLSAgICB2b2lk
IGl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nT25UeXBlKCkKKyAgICB2b2lkIGFsbG9jYXRlT25U
eXBlKCkKICAgICB7CiAgICAgICAgIEhhc2hTZXQ8dW5zaWduZWQ+IHVuc3BpbGxhYmxlVG1wcyA9
IGNvbXB1dGVVbnNwaWxsYWJsZVRtcHM8dHlwZT4oKTsKIApAQCAtMTMxMSwyMiArMTc3MSwzOCBA
QCBwcml2YXRlOgogICAgICAgICAgICAgLy8gcmVjb21wdXRhdGlvbiwgaW4gd2hpY2ggY2FzZSBz
cGVlZGluZyB1cCB0aGUgbG9va3VwIHdvdWxkIGJlIGEgYmlnZ2VyIHdpbi4KICAgICAgICAgICAg
IC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTI0NzgKICAgICAg
ICAgICAgIG1fdG1wV2lkdGgucmVjb21wdXRlKG1fY29kZSk7Ci0gICAgICAgICAgICAKLSAgICAg
ICAgICAgIENvbG9yaW5nQWxsb2NhdG9yPHR5cGU+IGFsbG9jYXRvcihtX2NvZGUsIG1fdG1wV2lk
dGgsIG1fdXNlQ291bnRzLCB1bnNwaWxsYWJsZVRtcHMpOwotICAgICAgICAgICAgaWYgKCFhbGxv
Y2F0b3IucmVxdWlyZXNTcGlsbGluZygpKSB7Ci0gICAgICAgICAgICAgICAgYXNzaWduUmVnaXN0
ZXJzVG9UbXAoYWxsb2NhdG9yKTsKLSAgICAgICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKLSAg
ICAgICAgICAgICAgICAgICAgZGF0YUxvZygiU3VjY2Vzc2Z1bGwgYWxsb2NhdGlvbiBhdCBpdGVy
YXRpb24gIiwgbV9udW1JdGVyYXRpb25zLCAiOlxuIiwgbV9jb2RlKTsKIAotICAgICAgICAgICAg
ICAgIHJldHVybjsKKyAgICAgICAgICAgIGF1dG8gZG9BbGxvY2F0aW9uID0gWyZdIChhdXRvJiBh
bGxvY2F0b3IpIC0+IGJvb2wgeworICAgICAgICAgICAgICAgIGFsbG9jYXRvci5hbGxvY2F0ZSgp
OworICAgICAgICAgICAgICAgIGlmICghYWxsb2NhdG9yLnJlcXVpcmVzU3BpbGxpbmcoKSkgewor
ICAgICAgICAgICAgICAgICAgICBhc3NpZ25SZWdpc3RlcnNUb1RtcDx0eXBlPihhbGxvY2F0b3Ip
OworICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGRhdGFMb2coIlN1Y2Nlc3NmdWxsIGFsbG9jYXRpb24gYXQgaXRlcmF0aW9uICIsIG1f
bnVtSXRlcmF0aW9ucywgIjpcbiIsIG1fY29kZSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYWRkU3BpbGxB
bmRGaWxsPHR5cGU+KGFsbG9jYXRvciwgdW5zcGlsbGFibGVUbXBzKTsKKyAgICAgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgCisgICAgICAgICAg
ICBib29sIGRvbmU7CisgICAgICAgICAgICBpZiAoKGlzQVJNNjQoKSB8fCBPcHRpb25zOjphaXJG
b3JjZUJyaWdnc0FsbG9jYXRvcigpKSAmJiAhT3B0aW9uczo6YWlyRm9yY2VJUkNBbGxvY2F0b3Io
KSkgeworICAgICAgICAgICAgICAgIENvbG9yaW5nQWxsb2NhdG9yPHR5cGUsIEJyaWdncz4gYWxs
b2NhdG9yKG1fY29kZSwgbV90bXBXaWR0aCwgbV91c2VDb3VudHMsIHVuc3BpbGxhYmxlVG1wcyk7
CisgICAgICAgICAgICAgICAgZG9uZSA9IGRvQWxsb2NhdGlvbihhbGxvY2F0b3IpOworICAgICAg
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBDb2xvcmluZ0FsbG9jYXRvcjx0eXBlLCBJ
UkM+IGFsbG9jYXRvcihtX2NvZGUsIG1fdG1wV2lkdGgsIG1fdXNlQ291bnRzLCB1bnNwaWxsYWJs
ZVRtcHMpOworICAgICAgICAgICAgICAgIGRvbmUgPSBkb0FsbG9jYXRpb24oYWxsb2NhdG9yKTsK
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZFNwaWxsQW5kRmlsbDx0eXBlPihhbGxvY2F0
b3IsIHVuc3BpbGxhYmxlVG1wcyk7CisgICAgICAgICAgICBpZiAoZG9uZSkKKyAgICAgICAgICAg
ICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICB9CiAKICAgICB0ZW1wbGF0ZTxBcmc6OlR5cGUg
dHlwZT4KICAgICBIYXNoU2V0PHVuc2lnbmVkPiBjb21wdXRlVW5zcGlsbGFibGVUbXBzKCkKICAg
ICB7CisKICAgICAgICAgSGFzaFNldDx1bnNpZ25lZD4gdW5zcGlsbGFibGVUbXBzOwogCiAgICAg
ICAgIHN0cnVjdCBSYW5nZSB7CkBAIC0xMzkwLDggKzE4NjYsOCBAQCBwcml2YXRlOgogICAgICAg
ICByZXR1cm4gdW5zcGlsbGFibGVUbXBzOwogICAgIH0KIAotICAgIHRlbXBsYXRlPEFyZzo6VHlw
ZSB0eXBlPgotICAgIHZvaWQgYXNzaWduUmVnaXN0ZXJzVG9UbXAoY29uc3QgQ29sb3JpbmdBbGxv
Y2F0b3I8dHlwZT4mIGFsbG9jYXRvcikKKyAgICB0ZW1wbGF0ZTxBcmc6OlR5cGUgdHlwZSwgdHlw
ZW5hbWUgQWxsb2NhdG9yVHlwZT4KKyAgICB2b2lkIGFzc2lnblJlZ2lzdGVyc1RvVG1wKGNvbnN0
IEFsbG9jYXRvclR5cGUmIGFsbG9jYXRvcikKICAgICB7CiAgICAgICAgIGZvciAoQmFzaWNCbG9j
ayogYmxvY2sgOiBtX2NvZGUpIHsKICAgICAgICAgICAgIC8vIEdpdmUgVG1wIGEgdmFsaWQgcmVn
aXN0ZXIuCkBAIC0xNDQ3LDggKzE5MjMsOCBAQCBwcml2YXRlOgogICAgICAgICByZXR1cm4gd2lk
dGggPD0gQXJnOjpXaWR0aDMyID8gNCA6IDg7CiAgICAgfQogCi0gICAgdGVtcGxhdGU8QXJnOjpU
eXBlIHR5cGU+Ci0gICAgdm9pZCBhZGRTcGlsbEFuZEZpbGwoY29uc3QgQ29sb3JpbmdBbGxvY2F0
b3I8dHlwZT4mIGFsbG9jYXRvciwgSGFzaFNldDx1bnNpZ25lZD4mIHVuc3BpbGxhYmxlVG1wcykK
KyAgICB0ZW1wbGF0ZTxBcmc6OlR5cGUgdHlwZSwgdHlwZW5hbWUgQWxsb2NhdG9yVHlwZT4KKyAg
ICB2b2lkIGFkZFNwaWxsQW5kRmlsbChjb25zdCBBbGxvY2F0b3JUeXBlJiBhbGxvY2F0b3IsIEhh
c2hTZXQ8dW5zaWduZWQ+JiB1bnNwaWxsYWJsZVRtcHMpCiAgICAgewogICAgICAgICBIYXNoTWFw
PFRtcCwgU3RhY2tTbG90Kj4gc3RhY2tTbG90czsKICAgICAgICAgZm9yIChUbXAgdG1wIDogYWxs
b2NhdG9yLnNwaWxsZWRUbXBzKCkpIHsKQEAgLTE2MzcsMTggKzIxMTMsMTkgQEAgcHJpdmF0ZToK
IAogICAgIENvZGUmIG1fY29kZTsKICAgICBUbXBXaWR0aCBtX3RtcFdpZHRoOwotICAgIFVzZUNv
dW50czxUbXA+IG1fdXNlQ291bnRzOworICAgIFVzZUNvdW50czxUbXA+JiBtX3VzZUNvdW50czsK
ICAgICB1bnNpZ25lZCBtX251bUl0ZXJhdGlvbnMgeyAwIH07CiB9OwogCiB9IC8vIGFub255bW91
cyBuYW1lc3BhY2UKIAotdm9pZCBpdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZyhDb2RlJiBjb2Rl
KQordm9pZCBhbGxvY2F0ZVJlZ2lzdGVycyhDb2RlJiBjb2RlKQogewotICAgIFBoYXNlU2NvcGUg
cGhhc2VTY29wZShjb2RlLCAiaXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmciKTsKLSAgICAKLSAg
ICBJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZyBpdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZyhj
b2RlKTsKLSAgICBpdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5ydW4oKTsKKyAgICBQaGFzZVNj
b3BlIHBoYXNlU2NvcGUoY29kZSwgIkFpcjo6YWxsb2NhdGVSZWdpc3RlcnMiKTsKKworICAgIFVz
ZUNvdW50czxUbXA+IHVzZUNvdW50cyhjb2RlKTsKKyAgICBSZWdpc3RlckFsbG9jYXRpb24gcmVn
aXN0ZXJBbGxvY2F0aW9uKGNvZGUsIHVzZUNvdW50cyk7CisgICAgcmVnaXN0ZXJBbGxvY2F0aW9u
LnJ1bigpOwogfQogCiB9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCkluZGV4OiBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpclJlZ2lzdGVyQWxsb2NhdG9yLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJSZWdpc3RlckFsbG9jYXRvci5o
CShyZXZpc2lvbiAyMTI2NjYpCShmcm9tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWly
SXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuaDoyMTI2NjYpCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvYWlyL0FpclJlZ2lzdGVyQWxsb2NhdG9yLmgJKHdvcmtpbmcgY29weSkKQEAgLTAs
MCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisK
KyNwcmFnbWEgb25jZQorCisjaWYgRU5BQkxFKEIzX0pJVCkKKworbmFtZXNwYWNlIEpTQyB7IG5h
bWVzcGFjZSBCMyB7IG5hbWVzcGFjZSBBaXIgeworCitjbGFzcyBDb2RlOworCisvLyBUaGlzIGlz
IGEgcmVnaXN0ZXIgYWxsb2NhdGlvbiBwaGFzZSBiYXNlZCBvbiBBbmRyZXcgQXBwZWwncyBJdGVy
YXRlZCBSZWdpc3RlciBDb2FsZXNjaW5nCisvLyBodHRwOi8vd3d3LmNzLmNtdS5lZHUvYWZzL2Nz
L2FjYWRlbWljL2NsYXNzLzE1NzQ1LXMwNy93d3cvcGFwZXJzL2dlb3JnZS5wZGYKK3ZvaWQgaXRl
cmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcoQ29kZSYpOworCit9IH0gfSAvLyBuYW1lc3BhY2UgSlND
OjpCMzo6QWlyCisKKyNlbmRpZiAvLyBFTkFCTEUoQjNfSklUKQpJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL2Fpci9BaXJSZWdpc3RlckFsbG9jYXRvci5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyUmVnaXN0ZXJBbGxvY2F0b3IuaAkocmV2aXNp
b24gMjEyNjY2KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJSZWdpc3RlckFs
bG9jYXRvci5oCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdo
dCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTUtMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTMxLDkgKzMxLDE2IEBAIG5hbWVzcGFjZSBKU0MgeyBu
YW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UKIAogY2xhc3MgQ29kZTsKIAotLy8gVGhpcyBpcyBhIHJl
Z2lzdGVyIGFsbG9jYXRpb24gcGhhc2UgYmFzZWQgb24gQW5kcmV3IEFwcGVsJ3MgSXRlcmF0ZWQg
UmVnaXN0ZXIgQ29hbGVzY2luZworLy8gV2UgaGF2ZSB0d28gcmVnaXN0ZXIgYWxsb2NhdG9ycywg
Ym90aCBmdW5kYW1lbnRhbGx5IGRlcml2ZWQgZnJvbSBDaGFpdGluJ3MgWW9ya3Rvd24KKy8vIGFs
bG9jYXRvcjoKKy8vIGh0dHA6Ly9jcy5nbXUuZWR1L353aGl0ZS9DUzY0MC9wOTgtY2hhaXRpbi5w
ZGYKKy8vCisvLyBXZSBoYXZlIGFuIGltcGxlbWVudGF0aW9uIG9mIEJyaWdncydzIG9wdGltaXN0
aWMgYWxsb2NhdG9yIHdoaWNoIGlzIGRlcml2YXRpdmUgb2YgQ2hhaXRpbidzIGFsbG9jYXRvcjoK
Ky8vIGh0dHA6Ly93d3cuY3MudXRleGFzLmVkdS91c2Vycy9tY2tpbmxleS8zODBDL2xlY3MvYnJp
Z2dzLXRoZXNpcy0xOTkyLnBkZgorLy8KKy8vIEFuZCBhbiBpbXBsZW1lbnRhdGlvbiBvZiBBbmRy
ZXcgQXBwZWwncyBJdGVyYXRlZCBSZWdpc3RlciBDb2FsZXNjaW5nIHdoaWNoIGlzIGRlcml2YXRp
dmUgb2YgQnJpZ2dzJ3MgYWxsb2NhdG9yLgogLy8gaHR0cDovL3d3dy5jcy5jbXUuZWR1L2Fmcy9j
cy9hY2FkZW1pYy9jbGFzcy8xNTc0NS1zMDcvd3d3L3BhcGVycy9nZW9yZ2UucGRmCi12b2lkIGl0
ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nKENvZGUmKTsKK3ZvaWQgYWxsb2NhdGVSZWdpc3RlcnMo
Q29kZSYpOwogCiB9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCiAKSW5kZXg6IFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL09wdGlvbnMuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvcnVudGltZS9PcHRpb25zLmgJKHJldmlzaW9uIDIxMjY2NikKKysrIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL09wdGlvbnMuaAkod29ya2luZyBjb3B5KQpAQCAt
MzkzLDYgKzM5Myw4IEBAIHR5cGVkZWYgY29uc3QgY2hhciogb3B0aW9uU3RyaW5nOwogICAgIHYo
Ym9vbCwgbG9nQjNQaGFzZVRpbWVzLCBmYWxzZSwgTm9ybWFsLCBudWxscHRyKSBcCiAgICAgdihk
b3VibGUsIHJhcmVCbG9ja1BlbmFsdHksIDAuMDAxLCBOb3JtYWwsIG51bGxwdHIpIFwKICAgICB2
KGJvb2wsIGFpclNwaWxsc0V2ZXJ5dGhpbmcsIGZhbHNlLCBOb3JtYWwsIG51bGxwdHIpIFwKKyAg
ICB2KGJvb2wsIGFpckZvcmNlQnJpZ2dzQWxsb2NhdG9yLCBmYWxzZSwgTm9ybWFsLCBudWxscHRy
KSBcCisgICAgdihib29sLCBhaXJGb3JjZUlSQ0FsbG9jYXRvciwgZmFsc2UsIE5vcm1hbCwgbnVs
bHB0cikgXAogICAgIHYoYm9vbCwgbG9nQWlyUmVnaXN0ZXJQcmVzc3VyZSwgZmFsc2UsIE5vcm1h
bCwgbnVsbHB0cikgXAogICAgIHYodW5zaWduZWQsIG1heEIzVGFpbER1cEJsb2NrU2l6ZSwgMywg
Tm9ybWFsLCBudWxscHRyKSBcCiAgICAgdih1bnNpZ25lZCwgbWF4QjNUYWlsRHVwQmxvY2tTdWNj
ZXNzb3JzLCAzLCBOb3JtYWwsIG51bGxwdHIpIFwKSW5kZXg6IFRvb2xzL0NoYW5nZUxvZwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBUb29scy9DaGFuZ2VMb2cJKHJldmlzaW9uIDIxMjY2NikKKysrIFRvb2xzL0No
YW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDEyIEBACisyMDE3LTAyLTIwICBTYWFt
IEJhcmF0aSAgPHNiYXJhdGlAYXBwbGUuY29tPgorCisgICAgICAgIENvbnNpZGVyIG1vdmluZyBm
cm9tIElSQyB0byB0aGUgQnJpZ2dzIG9wdGltaXN0aWMgYWxsb2NhdG9yIHdpdGggYmlhc2VkIGNv
bG9yaW5nCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0x
Njg0NTQKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICAq
IFNjcmlwdHMvcnVuLWpzYy1zdHJlc3MtdGVzdHM6CisKIDIwMTctMDItMTcgIEFuZGVycyBDYXJs
c3NvbiAgPGFuZGVyc2NhQGFwcGxlLmNvbT4KIAogICAgICAgICBBZGQgYSBuZXcgZHJhZyBjb2Rl
IHBhdGggYW5kIHVzZSBpdCBmb3IgZHJhZ2dpbmcgcGxhaW4gdGV4dApJbmRleDogVG9vbHMvU2Ny
aXB0cy9ydW4tanNjLXN0cmVzcy10ZXN0cwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9TY3JpcHRzL3J1
bi1qc2Mtc3RyZXNzLXRlc3RzCShyZXZpc2lvbiAyMTI2NjYpCisrKyBUb29scy9TY3JpcHRzL3J1
bi1qc2Mtc3RyZXNzLXRlc3RzCSh3b3JraW5nIGNvcHkpCkBAIC04NTQsMTUgKzg1NCwxNSBAQCBk
ZWYgcnVuRlRMTm9DSklUKCpvcHRpb25hbFRlc3RTcGVjaWZpY09wCiBlbmQKIAogZGVmIHJ1bkZU
TE5vQ0pJVFZhbGlkYXRlKCpvcHRpb25hbFRlc3RTcGVjaWZpY09wdGlvbnMpCi0gICAgcnVuKCJm
dGwtbm8tY2ppdC12YWxpZGF0ZS1zYW1wbGluZy1wcm9maWxlciIsICItLXZhbGlkYXRlR3JhcGg9
dHJ1ZSIsICItLXVzZVNhbXBsaW5nUHJvZmlsZXI9dHJ1ZSIsICooRlRMX09QVElPTlMgKyBOT19D
SklUX09QVElPTlMgKyBvcHRpb25hbFRlc3RTcGVjaWZpY09wdGlvbnMpKQorICAgIHJ1bigiZnRs
LW5vLWNqaXQtdmFsaWRhdGUtc2FtcGxpbmctcHJvZmlsZXIiLCAiLS12YWxpZGF0ZUdyYXBoPXRy
dWUiLCAiLS11c2VTYW1wbGluZ1Byb2ZpbGVyPXRydWUiLCAiLS1haXJGb3JjZUlSQ0FsbG9jYXRv
cj10cnVlIiwgKihGVExfT1BUSU9OUyArIE5PX0NKSVRfT1BUSU9OUyArIG9wdGlvbmFsVGVzdFNw
ZWNpZmljT3B0aW9ucykpCiBlbmQKIAogZGVmIHJ1bkZUTE5vQ0pJVE5vUHV0U3RhY2tWYWxpZGF0
ZSgqb3B0aW9uYWxUZXN0U3BlY2lmaWNPcHRpb25zKQotICAgIHJ1bigiZnRsLW5vLWNqaXQtbm8t
cHV0LXN0YWNrLXZhbGlkYXRlIiwgIi0tdmFsaWRhdGVHcmFwaD10cnVlIiwgIi0tdXNlUHV0U3Rh
Y2tTaW5raW5nPWZhbHNlIiwgKihGVExfT1BUSU9OUyArIE5PX0NKSVRfT1BUSU9OUyArIG9wdGlv
bmFsVGVzdFNwZWNpZmljT3B0aW9ucykpCisgICAgcnVuKCJmdGwtbm8tY2ppdC1uby1wdXQtc3Rh
Y2stdmFsaWRhdGUiLCAiLS12YWxpZGF0ZUdyYXBoPXRydWUiLCAiLS11c2VQdXRTdGFja1Npbmtp
bmc9ZmFsc2UiLCAiLS1haXJGb3JjZUlSQ0FsbG9jYXRvcj10cnVlIiwgKihGVExfT1BUSU9OUyAr
IE5PX0NKSVRfT1BUSU9OUyArIG9wdGlvbmFsVGVzdFNwZWNpZmljT3B0aW9ucykpCiBlbmQKIAog
ZGVmIHJ1bkZUTE5vQ0pJVE5vSW5saW5lVmFsaWRhdGUoKm9wdGlvbmFsVGVzdFNwZWNpZmljT3B0
aW9ucykKLSAgICBydW4oImZ0bC1uby1jaml0LW5vLWlubGluZS12YWxpZGF0ZSIsICItLXZhbGlk
YXRlR3JhcGg9dHJ1ZSIsICItLW1heGltdW1JbmxpbmluZ0RlcHRoPTEiLCAqKEZUTF9PUFRJT05T
ICsgTk9fQ0pJVF9PUFRJT05TICsgb3B0aW9uYWxUZXN0U3BlY2lmaWNPcHRpb25zKSkKKyAgICBy
dW4oImZ0bC1uby1jaml0LW5vLWlubGluZS12YWxpZGF0ZSIsICItLXZhbGlkYXRlR3JhcGg9dHJ1
ZSIsICItLW1heGltdW1JbmxpbmluZ0RlcHRoPTEiLCAiLS1haXJGb3JjZUJyaWdnc0FsbG9jYXRv
cj10cnVlIiwgKihGVExfT1BUSU9OUyArIE5PX0NKSVRfT1BUSU9OUyArIG9wdGlvbmFsVGVzdFNw
ZWNpZmljT3B0aW9ucykpCiBlbmQKIAogZGVmIHJ1bkZUTE5vQ0pJVE9TUlZhbGlkYXRpb24oKm9w
dGlvbmFsVGVzdFNwZWNpZmljT3B0aW9ucykKQEAgLTg3OCwxMSArODc4LDExIEBAIGRlZiBydW5E
RkdFYWdlck5vQ0pJVFZhbGlkYXRlKCpvcHRpb25hbFQKIGVuZAogCiBkZWYgcnVuRlRMRWFnZXIo
Km9wdGlvbmFsVGVzdFNwZWNpZmljT3B0aW9ucykKLSAgICBydW4oImZ0bC1lYWdlciIsICooRlRM
X09QVElPTlMgKyBFQUdFUl9PUFRJT05TICsgQ09MTEVDVF9DT05USU5VT1VTTFlfT1BUSU9OUyAr
IG9wdGlvbmFsVGVzdFNwZWNpZmljT3B0aW9ucykpCisgICAgcnVuKCJmdGwtZWFnZXIiLCAiLS1h
aXJGb3JjZUlSQ0FsbG9jYXRvcj10cnVlIiwgKihGVExfT1BUSU9OUyArIEVBR0VSX09QVElPTlMg
KyBDT0xMRUNUX0NPTlRJTlVPVVNMWV9PUFRJT05TICsgb3B0aW9uYWxUZXN0U3BlY2lmaWNPcHRp
b25zKSkKIGVuZAogCiBkZWYgcnVuRlRMRWFnZXJOb0NKSVRWYWxpZGF0ZSgqb3B0aW9uYWxUZXN0
U3BlY2lmaWNPcHRpb25zKQotICAgIHJ1bigiZnRsLWVhZ2VyLW5vLWNqaXQiLCAiLS12YWxpZGF0
ZUdyYXBoPXRydWUiLCAqKEZUTF9PUFRJT05TICsgTk9fQ0pJVF9PUFRJT05TICsgRUFHRVJfT1BU
SU9OUyArIENPTExFQ1RfQ09OVElOVU9VU0xZX09QVElPTlMgKyBvcHRpb25hbFRlc3RTcGVjaWZp
Y09wdGlvbnMpKQorICAgIHJ1bigiZnRsLWVhZ2VyLW5vLWNqaXQiLCAiLS12YWxpZGF0ZUdyYXBo
PXRydWUiLCAiLS1haXJGb3JjZUJyaWdnc0FsbG9jYXRvcj10cnVlIiwgKihGVExfT1BUSU9OUyAr
IE5PX0NKSVRfT1BUSU9OUyArIEVBR0VSX09QVElPTlMgKyBDT0xMRUNUX0NPTlRJTlVPVVNMWV9P
UFRJT05TICsgb3B0aW9uYWxUZXN0U3BlY2lmaWNPcHRpb25zKSkKIGVuZAogCiBkZWYgcnVuRlRM
RWFnZXJOb0NKSVRPU1JWYWxpZGF0aW9uKCpvcHRpb25hbFRlc3RTcGVjaWZpY09wdGlvbnMpCg==
</data>
<flag name="review"
          id="323899"
          type_id="1"
          status="+"
          setter="fpizlo"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>302357</attachid>
            <date>2017-02-21 19:54:28 -0800</date>
            <delta_ts>2017-02-21 19:55:43 -0800</delta_ts>
            <desc>patch for landing testing gtk to see if it builds</desc>
            <filename>c-backup.diff</filename>
            <type>text/plain</type>
            <size>220473</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DTWFrZUxpc3RzLnR4dAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvQ01ha2VMaXN0cy50eHQJKHJldmlzaW9uIDIxMjc5NykK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DTWFrZUxpc3RzLnR4dAkod29ya2luZyBjb3B5KQpA
QCAtODcsMTAgKzg3LDEwIEBAIHNldChKYXZhU2NyaXB0Q29yZV9TT1VSQ0VTCiAgICAgYjMvYWly
L0FpckZpeFBhcnRpYWxSZWdpc3RlclN0YWxscy5jcHAKICAgICBiMy9haXIvQWlyR2VuZXJhdGUu
Y3BwCiAgICAgYjMvYWlyL0FpckdlbmVyYXRlZC5jcHAKKyAgICBiMy9haXIvQWlyR3JhcGhDb2xv
cmluZy5jcHAKICAgICBiMy9haXIvQWlySGFuZGxlQ2FsbGVlU2F2ZXMuY3BwCiAgICAgYjMvYWly
L0Fpckluc2VydGlvblNldC5jcHAKICAgICBiMy9haXIvQWlySW5zdC5jcHAKLSAgICBiMy9haXIv
QWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuY3BwCiAgICAgYjMvYWlyL0FpcktpbmQuY3Bw
CiAgICAgYjMvYWlyL0FpckxvZ1JlZ2lzdGVyUHJlc3N1cmUuY3BwCiAgICAgYjMvYWlyL0Fpckxv
d2VyQWZ0ZXJSZWdBbGxvYy5jcHAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2Ny
aXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShy
ZXZpc2lvbiAyMTI3OTcpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUu
eGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29ya2luZyBjb3B5KQpAQCAtMTIzOSw4ICsxMjM5
LDYgQEAKIAkJMjYwMEI1QTcxNTJCQUFBNzAwOTFFRTVGIC8qIEpTU3RyaW5nSm9pbmVyLmggaW4g
SGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyNjAwQjVBNTE1MkJB
QUE3MDA5MUVFNUYgLyogSlNTdHJpbmdKb2luZXIuaCAqLzsgfTsKIAkJMjYyRDg1QjYxQzBENjUw
RjAwNkFDQjYxIC8qIEFpckZpeFBhcnRpYWxSZWdpc3RlclN0YWxscy5jcHAgaW4gU291cmNlcyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyNjJEODVCNDFDMEQ2NTBGMDA2QUNC
NjEgLyogQWlyRml4UGFydGlhbFJlZ2lzdGVyU3RhbGxzLmNwcCAqLzsgfTsKIAkJMjYyRDg1Qjcx
QzBENjUwRjAwNkFDQjYxIC8qIEFpckZpeFBhcnRpYWxSZWdpc3RlclN0YWxscy5oIGluIEhlYWRl
cnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMjYyRDg1QjUxQzBENjUwRjAw
NkFDQjYxIC8qIEFpckZpeFBhcnRpYWxSZWdpc3RlclN0YWxscy5oICovOyB9OwotCQkyNjcxOEJB
NDFCRTk5Rjc4MDA1MjAxN0IgLyogQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuY3BwIGlu
IFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMjY3MThCQTIxQkU5
OUY3ODAwNTIwMTdCIC8qIEFpckl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nLmNwcCAqLzsgfTsK
LQkJMjY3MThCQTUxQkU5OUY3ODAwNTIwMTdCIC8qIEFpckl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNj
aW5nLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyNjcx
OEJBMzFCRTk5Rjc4MDA1MjAxN0IgLyogQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuaCAq
LzsgfTsKIAkJMjY4NEQ0MzgxQzAwMTYxQzAwODFENjYzIC8qIEFpckxpdmVuZXNzLmggaW4gSGVh
ZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyNjg0RDQzNzFDMDAxNjFD
MDA4MUQ2NjMgLyogQWlyTGl2ZW5lc3MuaCAqLzsgfTsKIAkJMjY5RDYzNkUxQkZCRTVEMTAwMTAx
QjFEIC8qIEZUTE91dHB1dC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBm
aWxlUmVmID0gMjY5RDYzNkQxQkZCRTVEMDAwMTAxQjFEIC8qIEZUTE91dHB1dC5oICovOyB9Owog
CQkyQTA1QUJENTE5NjFERjI0MDAzNDE3NTAgLyogSlNQcm9wZXJ0eU5hbWVFbnVtZXJhdG9yLmNw
cCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDJBMDVBQkQz
MTk2MURGMjQwMDM0MTc1MCAvKiBKU1Byb3BlcnR5TmFtZUVudW1lcmF0b3IuY3BwICovOyB9OwpA
QCAtMTQ1Myw2ICsxNDUxLDggQEAKIAkJNzk1QjE5OTgxRDc4QkUzNTAwMjYyRkEwIC8qIE1hcEJh
c2UuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDc5NUIx
OTk2MUQ3OEJFMzUwMDI2MkZBMCAvKiBNYXBCYXNlLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVU
RVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJNzk1RjA5OUQxRTAzNjAwNTAwQkJFMzdGIC8qIEIz
Q29tcGlsZS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYg
PSA3OTVGMDk5QzFFMDM2MDA1MDBCQkUzN0YgLyogQjNDb21waWxlLmNwcCAqLzsgfTsKIAkJNzk2
NDY1NkExQjk1MkZGMDAwMzA1OUVFIC8qIEdldFB1dEluZm8uaCBpbiBIZWFkZXJzICovID0ge2lz
YSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDc5NjQ2NTY4MUI5NTJGRjAwMDMwNTlFRSAvKiBH
ZXRQdXRJbmZvLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsg
fTsKKwkJNzk2NUExMTkxRTVEM0ZGRTAwMUJBNTBEIC8qIEFpckdyYXBoQ29sb3JpbmcuY3BwIGlu
IFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNzk2NUExMTcxRTVE
M0ZGRTAwMUJBNTBEIC8qIEFpckdyYXBoQ29sb3JpbmcuY3BwICovOyB9OworCQk3OTY1QTExQTFF
NUQzRkZFMDAxQkE1MEQgLyogQWlyR3JhcGhDb2xvcmluZy5oIGluIEhlYWRlcnMgKi8gPSB7aXNh
ID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNzk2NUExMTgxRTVEM0ZGRTAwMUJBNTBEIC8qIEFp
ckdyYXBoQ29sb3JpbmcuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCAp
OyB9OyB9OwogCQk3OTZGQjQzQTFERkY4QzNGMDAzOUM5NUQgLyogSlNXZWJBc3NlbWJseUhlbHBl
cnMuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDc5NkZC
NDM5MURGRjhDM0YwMDM5Qzk1RCAvKiBKU1dlYkFzc2VtYmx5SGVscGVycy5oICovOyBzZXR0aW5n
cyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCTc5N0UwN0E5MUI4RkNGQjkw
MDg0MDBCQSAvKiBKU0dsb2JhbExleGljYWxFbnZpcm9ubWVudC5jcHAgaW4gU291cmNlcyAqLyA9
IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA3OTdFMDdBNzFCOEZDRkI5MDA4NDAwQkEg
LyogSlNHbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQuY3BwICovOyB9OwogCQk3OTdFMDdBQTFCOEZD
RkI5MDA4NDAwQkEgLyogSlNHbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQuaCBpbiBIZWFkZXJzICov
ID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDc5N0UwN0E4MUI4RkNGQjkwMDg0MDBC
QSAvKiBKU0dsb2JhbExleGljYWxFbnZpcm9ubWVudC5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJV
VEVTID0gKFByaXZhdGUsICk7IH07IH07CkBAIC0zNjg3LDggKzM2ODcsNiBAQAogCQkyNjJEODVC
NDFDMEQ2NTBGMDA2QUNCNjEgLyogQWlyRml4UGFydGlhbFJlZ2lzdGVyU3RhbGxzLmNwcCAqLyA9
IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxl
VHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IEFpckZpeFBhcnRpYWxSZWdpc3RlclN0
YWxscy5jcHA7IHBhdGggPSBiMy9haXIvQWlyRml4UGFydGlhbFJlZ2lzdGVyU3RhbGxzLmNwcDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMjYyRDg1QjUxQzBENjUwRjAwNkFDQjYxIC8q
IEFpckZpeFBhcnRpYWxSZWdpc3RlclN0YWxscy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7
IG5hbWUgPSBBaXJGaXhQYXJ0aWFsUmVnaXN0ZXJTdGFsbHMuaDsgcGF0aCA9IGIzL2Fpci9BaXJG
aXhQYXJ0aWFsUmVnaXN0ZXJTdGFsbHMuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJ
MjY0MDkxRkExQkUyRkQ0MTAwNjg0REIyIC8qIEFpck9wY29kZS5vcGNvZGVzICovID0ge2lzYSA9
IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgbmFtZSA9IEFpck9w
Y29kZS5vcGNvZGVzOyBwYXRoID0gYjMvYWlyL0Fpck9wY29kZS5vcGNvZGVzOyBzb3VyY2VUcmVl
ID0gIjxncm91cD4iOyB9OwotCQkyNjcxOEJBMjFCRTk5Rjc4MDA1MjAxN0IgLyogQWlySXRlcmF0
ZWRSZWdpc3RlckNvYWxlc2NpbmcuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBu
YW1lID0gQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuY3BwOyBwYXRoID0gYjMvYWlyL0Fp
ckl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKLQkJMjY3MThCQTMxQkU5OUY3ODAwNTIwMTdCIC8qIEFpckl0ZXJhdGVkUmVnaXN0ZXJDb2Fs
ZXNjaW5nLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsg
bGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEFpckl0ZXJhdGVkUmVn
aXN0ZXJDb2FsZXNjaW5nLmg7IHBhdGggPSBiMy9haXIvQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxl
c2NpbmcuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMjY4NEQ0MzcxQzAwMTYxQzAw
ODFENjYzIC8qIEFpckxpdmVuZXNzLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9
IEFpckxpdmVuZXNzLmg7IHBhdGggPSBiMy9haXIvQWlyTGl2ZW5lc3MuaDsgc291cmNlVHJlZSA9
ICI8Z3JvdXA+IjsgfTsKIAkJMjY5RDYzNkQxQkZCRTVEMDAwMTAxQjFEIC8qIEZUTE91dHB1dC5o
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93
bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBGVExPdXRwdXQuaDsgcGF0aCA9IGZ0
bC9GVExPdXRwdXQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMkEwNUFCRDMxOTYx
REYyNDAwMzQxNzUwIC8qIEpTUHJvcGVydHlOYW1lRW51bWVyYXRvci5jcHAgKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBz
b3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBKU1Byb3BlcnR5TmFtZUVudW1lcmF0b3IuY3BwOyBz
b3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAtMzk0OCw2ICszOTQ2LDggQEAKIAkJNzk1QjE5
OTYxRDc4QkUzNTAwMjYyRkEwIC8qIE1hcEJhc2UuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJl
bmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5o
OyBwYXRoID0gTWFwQmFzZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk3OTVGMDk5
QzFFMDM2MDA1MDBCQkUzN0YgLyogQjNDb21waWxlLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUu
Y3BwLmNwcDsgbmFtZSA9IEIzQ29tcGlsZS5jcHA7IHBhdGggPSBiMy9CM0NvbXBpbGUuY3BwOyBz
b3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk3OTY0NjU2ODFCOTUyRkYwMDAzMDU5RUUgLyog
R2V0UHV0SW5mby5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9
IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBHZXRQdXRJbmZv
Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTc5NjVBMTE3MUU1RDNGRkUwMDFCQTUw
RCAvKiBBaXJHcmFwaENvbG9yaW5nLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBm
aWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsg
bmFtZSA9IEFpckdyYXBoQ29sb3JpbmcuY3BwOyBwYXRoID0gYjMvYWlyL0FpckdyYXBoQ29sb3Jp
bmcuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk3OTY1QTExODFFNUQzRkZFMDAx
QkE1MEQgLyogQWlyR3JhcGhDb2xvcmluZy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7
IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5h
bWUgPSBBaXJHcmFwaENvbG9yaW5nLmg7IHBhdGggPSBiMy9haXIvQWlyR3JhcGhDb2xvcmluZy5o
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk3OTZGQjQzOTFERkY4QzNGMDAzOUM5NUQg
LyogSlNXZWJBc3NlbWJseUhlbHBlcnMuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBm
aWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1l
ID0gSlNXZWJBc3NlbWJseUhlbHBlcnMuaDsgcGF0aCA9IGpzL0pTV2ViQXNzZW1ibHlIZWxwZXJz
Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTc5N0UwN0E3MUI4RkNGQjkwMDg0MDBC
QSAvKiBKU0dsb2JhbExleGljYWxFbnZpcm9ubWVudC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmNwcC5jcHA7IHBhdGggPSBKU0dsb2JhbExleGljYWxFbnZpcm9ubWVudC5jcHA7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CiAJCTc5N0UwN0E4MUI4RkNGQjkwMDg0MDBCQSAvKiBKU0dsb2Jh
bExleGljYWxFbnZpcm9ubWVudC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBK
U0dsb2JhbExleGljYWxFbnZpcm9ubWVudC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpA
QCAtNTQ3OSw2ICs1NDc5LDggQEAKIAkJCQkwRkVDODU1NDFCREFDREM3MDA4MEZGNzQgLyogQWly
R2VuZXJhdGUuaCAqLywKIAkJCQkwRkVDODU5MjFCREIxRTEwMDA4MEZGNzQgLyogQWlyR2VuZXJh
dGVkLmNwcCAqLywKIAkJCQkwRkVDODU1NTFCREFDREM3MDA4MEZGNzQgLyogQWlyR2VuZXJhdGlv
bkNvbnRleHQuaCAqLywKKwkJCQk3OTY1QTExNzFFNUQzRkZFMDAxQkE1MEQgLyogQWlyR3JhcGhD
b2xvcmluZy5jcHAgKi8sCisJCQkJNzk2NUExMTgxRTVEM0ZGRTAwMUJBNTBEIC8qIEFpckdyYXBo
Q29sb3JpbmcuaCAqLywKIAkJCQkwRkVDODU1NjFCREFDREM3MDA4MEZGNzQgLyogQWlySGFuZGxl
Q2FsbGVlU2F2ZXMuY3BwICovLAogCQkJCTBGRUM4NTU3MUJEQUNEQzcwMDgwRkY3NCAvKiBBaXJI
YW5kbGVDYWxsZWVTYXZlcy5oICovLAogCQkJCTBGRUM4NTU4MUJEQUNEQzcwMDgwRkY3NCAvKiBB
aXJJbnNlcnRpb25TZXQuY3BwICovLApAQCAtNTQ4Niw4ICs1NDg4LDYgQEAKIAkJCQkwRkVDODU1
QTFCREFDREM3MDA4MEZGNzQgLyogQWlySW5zdC5jcHAgKi8sCiAJCQkJMEZFQzg1NUIxQkRBQ0RD
NzAwODBGRjc0IC8qIEFpckluc3QuaCAqLywKIAkJCQkwRkVDODU1QzFCREFDREM3MDA4MEZGNzQg
LyogQWlySW5zdElubGluZXMuaCAqLywKLQkJCQkyNjcxOEJBMjFCRTk5Rjc4MDA1MjAxN0IgLyog
QWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuY3BwICovLAotCQkJCTI2NzE4QkEzMUJFOTlG
NzgwMDUyMDE3QiAvKiBBaXJJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5oICovLAogCQkJCTBG
REY2N0Q0MUQ5REM0M0UwMDFCOTgyNSAvKiBBaXJLaW5kLmNwcCAqLywKIAkJCQkwRkRGNjdENTFE
OURDNDNFMDAxQjk4MjUgLyogQWlyS2luZC5oICovLAogCQkJCTI2ODRENDM3MUMwMDE2MUMwMDgx
RDY2MyAvKiBBaXJMaXZlbmVzcy5oICovLApAQCAtNzkzOSw3ICs3OTM5LDYgQEAKIAkJCQkwRkVD
ODU3RTFCREFDREM3MDA4MEZGNzQgLyogQWlySW5zZXJ0aW9uU2V0LmggaW4gSGVhZGVycyAqLywK
IAkJCQkwRkVDODU4MDFCREFDREM3MDA4MEZGNzQgLyogQWlySW5zdC5oIGluIEhlYWRlcnMgKi8s
CiAJCQkJMEZFQzg1ODExQkRBQ0RDNzAwODBGRjc0IC8qIEFpckluc3RJbmxpbmVzLmggaW4gSGVh
ZGVycyAqLywKLQkJCQkyNjcxOEJBNTFCRTk5Rjc4MDA1MjAxN0IgLyogQWlySXRlcmF0ZWRSZWdp
c3RlckNvYWxlc2NpbmcuaCBpbiBIZWFkZXJzICovLAogCQkJCTBGREY2N0Q3MUQ5REM0NDIwMDFC
OTgyNSAvKiBBaXJLaW5kLmggaW4gSGVhZGVycyAqLywKIAkJCQkyNjg0RDQzODFDMDAxNjFDMDA4
MUQ2NjMgLyogQWlyTGl2ZW5lc3MuaCBpbiBIZWFkZXJzICovLAogCQkJCTBGRTM0QzFBMUM0QjM5
QUUwMDAzQTUxMiAvKiBBaXJMb2dSZWdpc3RlclByZXNzdXJlLmggaW4gSGVhZGVycyAqLywKQEAg
LTg2NjYsNiArODY2NSw3IEBACiAJCQkJOEI5RjZENTYxRDU5MTJGQTAwMUM3MzlGIC8qIEl0ZXJh
dGlvbktpbmQuaCBpbiBIZWFkZXJzICovLAogCQkJCUZFNEQ1NUI4MUFFNzE2Q0EwMDUyRTQ1OSAv
KiBJdGVyYXRpb25TdGF0dXMuaCBpbiBIZWFkZXJzICovLAogCQkJCTcwMTEzRDRDMUE4REIwOTMw
MDM4NDhDNCAvKiBJdGVyYXRvck9wZXJhdGlvbnMuaCBpbiBIZWFkZXJzICovLAorCQkJCTc5NjVB
MTFBMUU1RDNGRkUwMDFCQTUwRCAvKiBBaXJHcmFwaENvbG9yaW5nLmggaW4gSGVhZGVycyAqLywK
IAkJCQk3MERDM0UwQTFCMkRGMkM3MDAwNTQyOTkgLyogSXRlcmF0b3JQcm90b3R5cGUuaCBpbiBI
ZWFkZXJzICovLAogCQkJCUJDMThDNDEzMEUxNkY1Q0QwMEIzNDQ2MCAvKiBKYXZhU2NyaXB0Lmgg
aW4gSGVhZGVycyAqLywKIAkJCQlBNTAzRkExQTE4OEUwRkIwMDAxMTBGMTQgLyogSmF2YVNjcmlw
dENhbGxGcmFtZS5oIGluIEhlYWRlcnMgKi8sCkBAIC05Nzk0LDcgKzk3OTQsNiBAQAogCQkJCTBG
RUM4NTdCMUJEQUNEQzcwMDgwRkY3NCAvKiBBaXJIYW5kbGVDYWxsZWVTYXZlcy5jcHAgaW4gU291
cmNlcyAqLywKIAkJCQkwRkVDODU3RDFCREFDREM3MDA4MEZGNzQgLyogQWlySW5zZXJ0aW9uU2V0
LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTBGRUM4NTdGMUJEQUNEQzcwMDgwRkY3NCAvKiBBaXJJ
bnN0LmNwcCBpbiBTb3VyY2VzICovLAotCQkJCTI2NzE4QkE0MUJFOTlGNzgwMDUyMDE3QiAvKiBB
aXJJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkwRkRG
NjdENjFEOURDNDQwMDAxQjk4MjUgLyogQWlyS2luZC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkw
RkUzNEMxOTFDNEIzOUFFMDAwM0E1MTIgLyogQWlyTG9nUmVnaXN0ZXJQcmVzc3VyZS5jcHAgaW4g
U291cmNlcyAqLywKIAkJCQkwRjYxODMyRTFDNDVCRjA3MDA3MjQ1MEIgLyogQWlyTG93ZXJBZnRl
clJlZ0FsbG9jLmNwcCBpbiBTb3VyY2VzICovLApAQCAtOTk4MCw2ICs5OTc5LDcgQEAKIAkJCQkw
RkQzRTQwMTFCNjE4QUFGMDBDODBFMUUgLyogREZHQWRhcHRpdmVJbmZlcnJlZFByb3BlcnR5VmFs
dWVXYXRjaHBvaW50LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTBGMThEM0NGMUI1NUE2RTAwMDJD
NUM5RiAvKiBERkdBZGFwdGl2ZVN0cnVjdHVyZVdhdGNocG9pbnQuY3BwIGluIFNvdXJjZXMgKi8s
CiAJCQkJMEYyREQ4MTExQUIzRDhCRTAwQkJCOEU4IC8qIERGR0FyZ3VtZW50c0VsaW1pbmF0aW9u
UGhhc2UuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJNzk2NUExMTkxRTVEM0ZGRTAwMUJBNTBEIC8q
IEFpckdyYXBoQ29sb3JpbmcuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMEYyREQ4MTMxQUIzRDhC
RTAwQkJCOEU4IC8qIERGR0FyZ3VtZW50c1V0aWxpdGllcy5jcHAgaW4gU291cmNlcyAqLywKIAkJ
CQkwRjQ4NTMyMTE4Nzc1MDU2MDA4M0I2ODcgLyogREZHQXJpdGhNb2RlLmNwcCBpbiBTb3VyY2Vz
ICovLAogCQkJCTBGNjM5NDg0MTVFNDgxMTgwMDZBNTk3QyAvKiBERkdBcnJheU1vZGUuY3BwIGlu
IFNvdXJjZXMgKi8sCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckdlbmVy
YXRlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpckdl
bmVyYXRlLmNwcAkocmV2aXNpb24gMjEyNzk3KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L2Fpci9BaXJHZW5lcmF0ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM2LDcgKzM2LDcgQEAKICNp
bmNsdWRlICJBaXJGaXhQYXJ0aWFsUmVnaXN0ZXJTdGFsbHMuaCIKICNpbmNsdWRlICJBaXJHZW5l
cmF0aW9uQ29udGV4dC5oIgogI2luY2x1ZGUgIkFpckhhbmRsZUNhbGxlZVNhdmVzLmgiCi0jaW5j
bHVkZSAiQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuaCIKKyNpbmNsdWRlICJBaXJHcmFw
aENvbG9yaW5nLmgiCiAjaW5jbHVkZSAiQWlyTG9nUmVnaXN0ZXJQcmVzc3VyZS5oIgogI2luY2x1
ZGUgIkFpckxvd2VyQWZ0ZXJSZWdBbGxvYy5oIgogI2luY2x1ZGUgIkFpckxvd2VyRW50cnlTd2l0
Y2guaCIKQEAgLTg5LDcgKzg5LDcgQEAgdm9pZCBwcmVwYXJlRm9yR2VuZXJhdGlvbihDb2RlJiBj
b2RlKQogICAgIGlmIChPcHRpb25zOjphaXJTcGlsbHNFdmVyeXRoaW5nKCkpCiAgICAgICAgIHNw
aWxsRXZlcnl0aGluZyhjb2RlKTsKICAgICBlbHNlCi0gICAgICAgIGl0ZXJhdGVkUmVnaXN0ZXJD
b2FsZXNjaW5nKGNvZGUpOworICAgICAgICBhbGxvY2F0ZVJlZ2lzdGVyc1Rocm91Z2hHcmFwaENv
bG9yaW5nKGNvZGUpOwogCiAgICAgaWYgKE9wdGlvbnM6OmxvZ0FpclJlZ2lzdGVyUHJlc3N1cmUo
KSkgewogICAgICAgICBkYXRhTG9nKCJSZWdpc3RlciBwcmVzc3VyZSBhZnRlciByZWdpc3RlciBh
bGxvY2F0aW9uOlxuIik7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpckdy
YXBoQ29sb3JpbmcuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9h
aXIvQWlyR3JhcGhDb2xvcmluZy5jcHAJKHJldmlzaW9uIDIxMjc5NykJKGZyb20gU291cmNlL0ph
dmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5jcHA6MjEy
Nzk3KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJHcmFwaENvbG9yaW5nLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE2NTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTUtMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNs
dWRlICJBaXJJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5oIgorCisjaWYgRU5BQkxFKEIzX0pJ
VCkKKworI2luY2x1ZGUgIkFpckNvZGUuaCIKKyNpbmNsdWRlICJBaXJJbnNlcnRpb25TZXQuaCIK
KyNpbmNsdWRlICJBaXJJbnN0SW5saW5lcy5oIgorI2luY2x1ZGUgIkFpckxpdmVuZXNzLmgiCisj
aW5jbHVkZSAiQWlyUGFkSW50ZXJmZXJlbmNlLmgiCisjaW5jbHVkZSAiQWlyUGhhc2VTY29wZS5o
IgorI2luY2x1ZGUgIkFpclRtcElubGluZXMuaCIKKyNpbmNsdWRlICJBaXJUbXBXaWR0aC5oIgor
I2luY2x1ZGUgIkFpclVzZUNvdW50cy5oIgorI2luY2x1ZGUgPHd0Zi9MaXN0RHVtcC5oPgorCitu
YW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7CisKK25hbWVzcGFj
ZSB7CisKK2Jvb2wgZGVidWcgPSBmYWxzZTsKK2Jvb2wgdHJhY2VEZWJ1ZyA9IGZhbHNlOworYm9v
bCByZXBvcnRTdGF0cyA9IGZhbHNlOworCisvLyBUaGUgQWJzdHJhY3RDb2xvcmluZ0FsbG9jYXRv
ciBkZWZpbmVzIGFsbCB0aGUgY29kZSB0aGF0IGlzIGluZGVwZW5kYW50CisvLyBmcm9tIHRoZSB0
eXBlIG9yIHJlZ2lzdGVyIGFuZCBjYW4gYmUgc2hhcmVkIHdoZW4gYWxsb2NhdGluZyByZWdpc3Rl
cnMuCit0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleFR5cGU+CitjbGFzcyBBYnN0cmFjdENvbG9yaW5n
QWxsb2NhdG9yIHsKK3B1YmxpYzoKKyAgICBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yKGNvbnN0
IFZlY3RvcjxSZWc+JiByZWdzSW5Qcmlvcml0eU9yZGVyLCBJbmRleFR5cGUgbGFzdFByZWNvbG9y
ZWRSZWdpc3RlckluZGV4LCB1bnNpZ25lZCB0bXBBcnJheVNpemUsIGNvbnN0IEhhc2hTZXQ8dW5z
aWduZWQ+JiB1bnNwaWxsYWJsZVRtcCkKKyAgICAgICAgOiBtX3JlZ3NJblByaW9yaXR5T3JkZXIo
cmVnc0luUHJpb3JpdHlPcmRlcikKKyAgICAgICAgLCBtX2xhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJ
bmRleChsYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXgpCisgICAgICAgICwgbV91bnNwaWxsYWJs
ZVRtcHModW5zcGlsbGFibGVUbXApCisgICAgeworICAgICAgICBmb3IgKFJlZyByZWcgOiBtX3Jl
Z3NJblByaW9yaXR5T3JkZXIpCisgICAgICAgICAgICBtX211dGFibGVSZWdzLnNldChyZWcpOwor
ICAgICAgICAKKyAgICAgICAgaW5pdGlhbGl6ZURlZ3JlZXModG1wQXJyYXlTaXplKTsKKyAgICAg
ICAgCisgICAgICAgIG1fYWRqYWNlbmN5TGlzdC5yZXNpemUodG1wQXJyYXlTaXplKTsKKyAgICAg
ICAgbV9tb3ZlTGlzdC5yZXNpemUodG1wQXJyYXlTaXplKTsKKyAgICAgICAgbV9jb2FsZXNjZWRU
bXBzLmZpbGwoMCwgdG1wQXJyYXlTaXplKTsKKyAgICAgICAgbV9pc09uU2VsZWN0U3RhY2suZW5z
dXJlU2l6ZSh0bXBBcnJheVNpemUpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIEluZGV4VHlw
ZSBnZXRBbGlhcyhJbmRleFR5cGUgdG1wSW5kZXgpIGNvbnN0CisgICAgeworICAgICAgICBJbmRl
eFR5cGUgYWxpYXMgPSB0bXBJbmRleDsKKyAgICAgICAgd2hpbGUgKEluZGV4VHlwZSBuZXh0QWxp
YXMgPSBtX2NvYWxlc2NlZFRtcHNbYWxpYXNdKQorICAgICAgICAgICAgYWxpYXMgPSBuZXh0QWxp
YXM7CisgICAgICAgIHJldHVybiBhbGlhczsKKyAgICB9CisKKyAgICB2b2lkIGFkZEVkZ2UoSW5k
ZXhUeXBlIGEsIEluZGV4VHlwZSBiKQorICAgIHsKKyAgICAgICAgaWYgKGEgPT0gYikKKyAgICAg
ICAgICAgIHJldHVybjsKKyAgICAgICAgYWRkRWRnZURpc3RpbmN0KGEsIGIpOworICAgIH0KKwor
ICAgIHZvaWQgbWFrZVdvcmtMaXN0KCkKKyAgICB7CisgICAgICAgIEluZGV4VHlwZSBmaXJzdE5v
blJlZ0luZGV4ID0gbV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXggKyAxOworICAgICAgICBm
b3IgKEluZGV4VHlwZSBpID0gZmlyc3ROb25SZWdJbmRleDsgaSA8IG1fZGVncmVlcy5zaXplKCk7
ICsraSkgeworICAgICAgICAgICAgdW5zaWduZWQgZGVncmVlID0gbV9kZWdyZWVzW2ldOworICAg
ICAgICAgICAgaWYgKGRlZ3JlZSA+PSBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpKQorICAg
ICAgICAgICAgICAgIGFkZFRvU3BpbGwoaSk7CisgICAgICAgICAgICBlbHNlIGlmICghbV9tb3Zl
TGlzdFtpXS5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgbV9mcmVlemVXb3JrbGlzdC5hZGQo
aSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbV9zaW1wbGlmeVdvcmtsaXN0
LmFwcGVuZChpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgYWRkVG9TcGlsbCh1bnNp
Z25lZCB0b1NwaWxsKQorICAgIHsKKyAgICAgICAgaWYgKG1fdW5zcGlsbGFibGVUbXBzLmNvbnRh
aW5zKHRvU3BpbGwpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIG1fc3BpbGxXb3Jr
bGlzdC5hZGQodG9TcGlsbCk7CisgICAgfQorCisgICAgLy8gTG93LWRlZ3JlZSB2ZXJ0ZXggY2Fu
IGFsd2F5cyBiZSBjb2xvcmVkOiBqdXN0IHBpY2sgYW55IG9mIHRoZSBjb2xvciB0YWtlbiBieSBh
bnkKKyAgICAvLyBvdGhlciBhZGphY2VudCB2ZXJpY2VzLgorICAgIC8vIFRoZSAiU2ltcGxpZnki
IHBoYXNlIHRha2VzIGEgbG93LWRlZ3JlZSBvdXQgb2YgdGhlIGludGVyZmVyZW5jZSBncmFwaCB0
byBzaW1wbGlmeSBpdC4KKyAgICB2b2lkIHNpbXBsaWZ5KCkKKyAgICB7CisgICAgICAgIEluZGV4
VHlwZSBsYXN0SW5kZXggPSBtX3NpbXBsaWZ5V29ya2xpc3QudGFrZUxhc3QoKTsKKworICAgICAg
ICBBU1NFUlQoIW1fc2VsZWN0U3RhY2suY29udGFpbnMobGFzdEluZGV4KSk7CisgICAgICAgIEFT
U0VSVCghbV9pc09uU2VsZWN0U3RhY2suZ2V0KGxhc3RJbmRleCkpOworICAgICAgICBtX3NlbGVj
dFN0YWNrLmFwcGVuZChsYXN0SW5kZXgpOworICAgICAgICBtX2lzT25TZWxlY3RTdGFjay5xdWlj
a1NldChsYXN0SW5kZXgpOworCisgICAgICAgIGZvckVhY2hBZGphY2VudChsYXN0SW5kZXgsIFt0
aGlzXShJbmRleFR5cGUgYWRqYWNlbnRUbXBJbmRleCkgeworICAgICAgICAgICAgZGVjcmVtZW50
RGVncmVlKGFkamFjZW50VG1wSW5kZXgpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICB2b2lk
IGZyZWV6ZSgpCisgICAgeworICAgICAgICBJbmRleFR5cGUgdmljdGltSW5kZXggPSBtX2ZyZWV6
ZVdvcmtsaXN0LnRha2VBbnkoKTsKKyAgICAgICAgQVNTRVJUX1dJVEhfTUVTU0FHRShnZXRBbGlh
cyh2aWN0aW1JbmRleCkgPT0gdmljdGltSW5kZXgsICJjb2FsZXNjZSgpIHNob3VsZCBub3QgbGVh
dmUgYWxpYXNlZCBUbXAgaW4gdGhlIHdvcmtsaXN0LiIpOworICAgICAgICBtX3NpbXBsaWZ5V29y
a2xpc3QuYXBwZW5kKHZpY3RpbUluZGV4KTsKKyAgICAgICAgZnJlZXplTW92ZXModmljdGltSW5k
ZXgpOworICAgIH0KKworICAgIHZvaWQgZnJlZXplTW92ZXMoSW5kZXhUeXBlIHRtcEluZGV4KQor
ICAgIHsKKyAgICAgICAgZm9yRWFjaE5vZGVNb3Zlcyh0bXBJbmRleCwgW3RoaXMsIHRtcEluZGV4
XSAoSW5kZXhUeXBlIG1vdmVJbmRleCkgeworICAgICAgICAgICAgaWYgKCFtX2FjdGl2ZU1vdmVz
LnF1aWNrQ2xlYXIobW92ZUluZGV4KSkKKyAgICAgICAgICAgICAgICBtX3dvcmtsaXN0TW92ZXMu
dGFrZU1vdmUobW92ZUluZGV4KTsKKworICAgICAgICAgICAgY29uc3QgTW92ZU9wZXJhbmRzJiBt
b3ZlT3BlcmFuZHMgPSBtX2NvYWxlc2NpbmdDYW5kaWRhdGVzW21vdmVJbmRleF07CisgICAgICAg
ICAgICBJbmRleFR5cGUgc3JjVG1wSW5kZXggPSBtb3ZlT3BlcmFuZHMuc3JjSW5kZXg7CisgICAg
ICAgICAgICBJbmRleFR5cGUgZHN0VG1wSW5kZXggPSBtb3ZlT3BlcmFuZHMuZHN0SW5kZXg7CisK
KyAgICAgICAgICAgIEluZGV4VHlwZSBvcmlnaW5hbE90aGVyVG1wID0gc3JjVG1wSW5kZXggIT0g
dG1wSW5kZXggPyBzcmNUbXBJbmRleCA6IGRzdFRtcEluZGV4OworICAgICAgICAgICAgSW5kZXhU
eXBlIG90aGVyVG1wSW5kZXggPSBnZXRBbGlhcyhvcmlnaW5hbE90aGVyVG1wKTsKKyAgICAgICAg
ICAgIGlmIChtX2RlZ3JlZXNbb3RoZXJUbXBJbmRleF0gPCBtX3JlZ3NJblByaW9yaXR5T3JkZXIu
c2l6ZSgpICYmICFpc01vdmVSZWxhdGVkKG90aGVyVG1wSW5kZXgpKSB7CisgICAgICAgICAgICAg
ICAgaWYgKG1fZnJlZXplV29ya2xpc3QucmVtb3ZlKG90aGVyVG1wSW5kZXgpKQorICAgICAgICAg
ICAgICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuYXBwZW5kKG90aGVyVG1wSW5kZXgpOworICAg
ICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICB2b2lkIGNvYWxlc2NlKCkKKyAg
ICB7CisgICAgICAgIHVuc2lnbmVkIG1vdmVJbmRleCA9IG1fd29ya2xpc3RNb3Zlcy50YWtlTGFz
dE1vdmUoKTsKKyAgICAgICAgY29uc3QgTW92ZU9wZXJhbmRzJiBtb3ZlT3BlcmFuZHMgPSBtX2Nv
YWxlc2NpbmdDYW5kaWRhdGVzW21vdmVJbmRleF07CisgICAgICAgIEluZGV4VHlwZSB1ID0gZ2V0
QWxpYXMobW92ZU9wZXJhbmRzLnNyY0luZGV4KTsKKyAgICAgICAgSW5kZXhUeXBlIHYgPSBnZXRB
bGlhcyhtb3ZlT3BlcmFuZHMuZHN0SW5kZXgpOworCisgICAgICAgIGlmIChpc1ByZWNvbG9yZWQo
dikpCisgICAgICAgICAgICBzdGQ6OnN3YXAodSwgdik7CisKKyAgICAgICAgaWYgKHRyYWNlRGVi
dWcpCisgICAgICAgICAgICBkYXRhTG9nKCJDb2FsZXNjaW5nIG1vdmUgYXQgaW5kZXggIiwgbW92
ZUluZGV4LCAiIHUgPSAiLCB1LCAiIHYgPSAiLCB2LCAiXG4iKTsKKworICAgICAgICBpZiAodSA9
PSB2KSB7CisgICAgICAgICAgICBhZGRXb3JrTGlzdCh1KTsKKworICAgICAgICAgICAgaWYgKHRy
YWNlRGVidWcpCisgICAgICAgICAgICAgICAgZGF0YUxvZygiICAgIENvYWxlc2NlZFxuIik7Cisg
ICAgICAgIH0gZWxzZSBpZiAoaXNQcmVjb2xvcmVkKHYpCisgICAgICAgICAgICB8fCBtX2ludGVy
ZmVyZW5jZUVkZ2VzLmNvbnRhaW5zKEludGVyZmVyZW5jZUVkZ2UodSwgdikpCisgICAgICAgICAg
ICB8fCAodSA9PSBtX2ZyYW1lUG9pbnRlckluZGV4ICYmIG1faW50ZXJmZXJlc1dpdGhGcmFtZVBv
aW50ZXIucXVpY2tHZXQodikpKSB7CisgICAgICAgICAgICBhZGRXb3JrTGlzdCh1KTsKKyAgICAg
ICAgICAgIGFkZFdvcmtMaXN0KHYpOworCisgICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKKyAg
ICAgICAgICAgICAgICBkYXRhTG9nKCIgICAgQ29uc3RyYWluZWRcbiIpOworICAgICAgICB9IGVs
c2UgaWYgKGNhbkJlU2FmZWx5Q29hbGVzY2VkKHUsIHYpKSB7CisgICAgICAgICAgICBjb21iaW5l
KHUsIHYpOworICAgICAgICAgICAgYWRkV29ya0xpc3QodSk7CisgICAgICAgICAgICBtX2hhc0Nv
YWxlc2NlZE5vblRyaXZpYWxNb3ZlID0gdHJ1ZTsKKworICAgICAgICAgICAgaWYgKHRyYWNlRGVi
dWcpCisgICAgICAgICAgICAgICAgZGF0YUxvZygiICAgIFNhZmUgQ29hbGVzY2luZ1xuIik7Cisg
ICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtX2FjdGl2ZU1vdmVzLnF1aWNrU2V0KG1vdmVJ
bmRleCk7CisKKyAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQorICAgICAgICAgICAgICAgIGRh
dGFMb2coIiAgICBGYWlsZWQgY29hbGVzY2luZywgYWRkZWQgdG8gYWN0aXZlIG1vdmVzLlxuIik7
CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGFzc2lnbkNvbG9ycygpCisgICAgeworICAg
ICAgICBBU1NFUlQobV9zaW1wbGlmeVdvcmtsaXN0LmlzRW1wdHkoKSk7CisgICAgICAgIEFTU0VS
VChtX3dvcmtsaXN0TW92ZXMuaXNFbXB0eSgpKTsKKyAgICAgICAgQVNTRVJUKG1fZnJlZXplV29y
a2xpc3QuaXNFbXB0eSgpKTsKKyAgICAgICAgQVNTRVJUKG1fc3BpbGxXb3JrbGlzdC5pc0VtcHR5
KCkpOworCisgICAgICAgIC8vIFJlY2xhaW0gYXMgbXVjaCBtZW1vcnkgYXMgcG9zc2libGUuCisg
ICAgICAgIG1faW50ZXJmZXJlbmNlRWRnZXMuY2xlYXIoKTsKKyAgICAgICAgbV9kZWdyZWVzLmNs
ZWFyKCk7CisgICAgICAgIG1fbW92ZUxpc3QuY2xlYXIoKTsKKyAgICAgICAgbV93b3JrbGlzdE1v
dmVzLmNsZWFyKCk7CisgICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5jbGVhcigpOworICAgICAg
ICBtX3NwaWxsV29ya2xpc3QuY2xlYXIoKTsKKyAgICAgICAgbV9mcmVlemVXb3JrbGlzdC5jbGVh
cigpOworCisgICAgICAgIC8vIFRyeSB0byBjb2xvciB0aGUgVG1wIG9uIHRoZSBzdGFjay4KKyAg
ICAgICAgbV9jb2xvcmVkVG1wLnJlc2l6ZShtX2FkamFjZW5jeUxpc3Quc2l6ZSgpKTsKKworICAg
ICAgICB3aGlsZSAoIW1fc2VsZWN0U3RhY2suaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB1bnNp
Z25lZCB0bXBJbmRleCA9IG1fc2VsZWN0U3RhY2sudGFrZUxhc3QoKTsKKyAgICAgICAgICAgIEFT
U0VSVCghaXNQcmVjb2xvcmVkKHRtcEluZGV4KSk7CisgICAgICAgICAgICBBU1NFUlQoIW1fY29s
b3JlZFRtcFt0bXBJbmRleF0pOworCisgICAgICAgICAgICBSZWdpc3RlclNldCBjb2xvcmVkUmVn
aXN0ZXJzOworICAgICAgICAgICAgZm9yIChJbmRleFR5cGUgYWRqYWNlbnRUbXBJbmRleCA6IG1f
YWRqYWNlbmN5TGlzdFt0bXBJbmRleF0pIHsKKyAgICAgICAgICAgICAgICBJbmRleFR5cGUgYWxp
YXNUbXBJbmRleCA9IGdldEFsaWFzKGFkamFjZW50VG1wSW5kZXgpOworICAgICAgICAgICAgICAg
IFJlZyByZWcgPSBtX2NvbG9yZWRUbXBbYWxpYXNUbXBJbmRleF07CisKKyAgICAgICAgICAgICAg
ICBBU1NFUlQoIWlzUHJlY29sb3JlZChhbGlhc1RtcEluZGV4KSB8fCAoaXNQcmVjb2xvcmVkKGFs
aWFzVG1wSW5kZXgpICYmIHJlZykpOworCisgICAgICAgICAgICAgICAgaWYgKHJlZykKKyAgICAg
ICAgICAgICAgICAgICAgY29sb3JlZFJlZ2lzdGVycy5zZXQocmVnKTsKKyAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgYm9vbCBjb2xvckFzc2lnbmVkID0gZmFsc2U7CisgICAgICAgICAgICBm
b3IgKFJlZyByZWcgOiBtX3JlZ3NJblByaW9yaXR5T3JkZXIpIHsKKyAgICAgICAgICAgICAgICBp
ZiAoIWNvbG9yZWRSZWdpc3RlcnMuZ2V0KHJlZykpIHsKKyAgICAgICAgICAgICAgICAgICAgbV9j
b2xvcmVkVG1wW3RtcEluZGV4XSA9IHJlZzsKKyAgICAgICAgICAgICAgICAgICAgY29sb3JBc3Np
Z25lZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFjb2xvckFzc2lnbmVkKQorICAg
ICAgICAgICAgICAgIG1fc3BpbGxlZFRtcHMuYXBwZW5kKHRtcEluZGV4KTsKKyAgICAgICAgfQor
ICAgICAgICBtX3NlbGVjdFN0YWNrLmNsZWFyKCk7CisKKyAgICAgICAgaWYgKG1fc3BpbGxlZFRt
cHMuaXNFbXB0eSgpKQorICAgICAgICAgICAgbV9jb2FsZXNjZWRUbXBzQXRTcGlsbC5jbGVhcigp
OworICAgICAgICBlbHNlCisgICAgICAgICAgICBtX2NvbG9yZWRUbXAuY2xlYXIoKTsKKyAgICB9
CisKK3ByaXZhdGU6CisgICAgdm9pZCBpbml0aWFsaXplRGVncmVlcyh1bnNpZ25lZCB0bXBBcnJh
eVNpemUpCisgICAgeworICAgICAgICBtX2RlZ3JlZXMucmVzaXplKHRtcEFycmF5U2l6ZSk7CisK
KyAgICAgICAgLy8gQWxsIHByZWNvbG9yZWQgcmVnaXN0ZXJzIGhhdmUgIGFuICJpbmZpbml0ZSIg
ZGVncmVlLgorICAgICAgICB1bnNpZ25lZCBmaXJzdE5vblJlZ0luZGV4ID0gbV9sYXN0UHJlY29s
b3JlZFJlZ2lzdGVySW5kZXggKyAxOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwg
Zmlyc3ROb25SZWdJbmRleDsgKytpKQorICAgICAgICAgICAgbV9kZWdyZWVzW2ldID0gc3RkOjpu
dW1lcmljX2xpbWl0czx1bnNpZ25lZD46Om1heCgpOworCisgICAgICAgIG1lbXNldChtX2RlZ3Jl
ZXMuZGF0YSgpICsgZmlyc3ROb25SZWdJbmRleCwgMCwgKHRtcEFycmF5U2l6ZSAtIGZpcnN0Tm9u
UmVnSW5kZXgpICogc2l6ZW9mKHVuc2lnbmVkKSk7CisgICAgfQorCisgICAgdm9pZCBhZGRFZGdl
RGlzdGluY3QoSW5kZXhUeXBlIGEsIEluZGV4VHlwZSBiKQorICAgIHsKKyAgICAgICAgQVNTRVJU
KGEgIT0gYik7CisgICAgICAgIGlmIChtX2ludGVyZmVyZW5jZUVkZ2VzLmFkZChJbnRlcmZlcmVu
Y2VFZGdlKGEsIGIpKS5pc05ld0VudHJ5KSB7CisgICAgICAgICAgICBpZiAoIWlzUHJlY29sb3Jl
ZChhKSkgeworICAgICAgICAgICAgICAgIEFTU0VSVCghbV9hZGphY2VuY3lMaXN0W2FdLmNvbnRh
aW5zKGIpKTsKKyAgICAgICAgICAgICAgICBtX2FkamFjZW5jeUxpc3RbYV0uYXBwZW5kKGIpOwor
ICAgICAgICAgICAgICAgIG1fZGVncmVlc1thXSsrOworICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICBpZiAoIWlzUHJlY29sb3JlZChiKSkgeworICAgICAgICAgICAgICAgIEFTU0VSVCghbV9h
ZGphY2VuY3lMaXN0W2JdLmNvbnRhaW5zKGEpKTsKKyAgICAgICAgICAgICAgICBtX2FkamFjZW5j
eUxpc3RbYl0uYXBwZW5kKGEpOworICAgICAgICAgICAgICAgIG1fZGVncmVlc1tiXSsrOworICAg
ICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBkZWNyZW1lbnREZWdyZWUo
SW5kZXhUeXBlIHRtcEluZGV4KQorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fZGVncmVlc1t0bXBJ
bmRleF0pOworCisgICAgICAgIHVuc2lnbmVkIG9sZERlZ3JlZSA9IG1fZGVncmVlc1t0bXBJbmRl
eF0tLTsKKyAgICAgICAgaWYgKG9sZERlZ3JlZSA9PSBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6
ZSgpKSB7CisgICAgICAgICAgICBlbmFibGVNb3Zlc09uVmFsdWVBbmRBZGphY2VudHModG1wSW5k
ZXgpOworICAgICAgICAgICAgbV9zcGlsbFdvcmtsaXN0LnJlbW92ZSh0bXBJbmRleCk7CisgICAg
ICAgICAgICBpZiAoaXNNb3ZlUmVsYXRlZCh0bXBJbmRleCkpCisgICAgICAgICAgICAgICAgbV9m
cmVlemVXb3JrbGlzdC5hZGQodG1wSW5kZXgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAg
ICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5hcHBlbmQodG1wSW5kZXgpOworICAgICAgICB9Cisg
ICAgfQorCisKKyAgICBib29sIGFkZEVkZ2VEaXN0aW5jdFdpdGhvdXREZWdyZWVDaGFuZ2UoSW5k
ZXhUeXBlIGEsIEluZGV4VHlwZSBiKQorICAgIHsKKyAgICAgICAgQVNTRVJUKGEgIT0gYik7Cisg
ICAgICAgIGlmIChtX2ludGVyZmVyZW5jZUVkZ2VzLmFkZChJbnRlcmZlcmVuY2VFZGdlKGEsIGIp
KS5pc05ld0VudHJ5KSB7CisgICAgICAgICAgICBpZiAoIWlzUHJlY29sb3JlZChhKSkgeworICAg
ICAgICAgICAgICAgIEFTU0VSVCghbV9hZGphY2VuY3lMaXN0W2FdLmNvbnRhaW5zKGIpKTsKKyAg
ICAgICAgICAgICAgICBtX2FkamFjZW5jeUxpc3RbYV0uYXBwZW5kKGIpOworICAgICAgICAgICAg
fQorCisgICAgICAgICAgICBpZiAoIWlzUHJlY29sb3JlZChiKSkgeworICAgICAgICAgICAgICAg
IEFTU0VSVCghbV9hZGphY2VuY3lMaXN0W2JdLmNvbnRhaW5zKGEpKTsKKyAgICAgICAgICAgICAg
ICBtX2FkamFjZW5jeUxpc3RbYl0uYXBwZW5kKGEpOworICAgICAgICAgICAgfQorICAgICAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0K
KworICAgIGJvb2wgaXNNb3ZlUmVsYXRlZChJbmRleFR5cGUgdG1wSW5kZXgpCisgICAgeworICAg
ICAgICBmb3IgKHVuc2lnbmVkIG1vdmVJbmRleCA6IG1fbW92ZUxpc3RbdG1wSW5kZXhdKSB7Cisg
ICAgICAgICAgICBpZiAobV9hY3RpdmVNb3Zlcy5xdWlja0dldChtb3ZlSW5kZXgpIHx8IG1fd29y
a2xpc3RNb3Zlcy5jb250YWlucyhtb3ZlSW5kZXgpKQorICAgICAgICAgICAgICAgIHJldHVybiB0
cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB0ZW1w
bGF0ZTx0eXBlbmFtZSBGdW5jdGlvbj4KKyAgICB2b2lkIGZvckVhY2hBZGphY2VudChJbmRleFR5
cGUgdG1wSW5kZXgsIEZ1bmN0aW9uIGZ1bmN0aW9uKQorICAgIHsKKyAgICAgICAgZm9yIChJbmRl
eFR5cGUgYWRqYWNlbnRUbXBJbmRleCA6IG1fYWRqYWNlbmN5TGlzdFt0bXBJbmRleF0pIHsKKyAg
ICAgICAgICAgIGlmICghaGFzQmVlblNpbXBsaWZpZWQoYWRqYWNlbnRUbXBJbmRleCkpCisgICAg
ICAgICAgICAgICAgZnVuY3Rpb24oYWRqYWNlbnRUbXBJbmRleCk7CisgICAgICAgIH0KKyAgICB9
CisKKyAgICBib29sIGhhc0JlZW5TaW1wbGlmaWVkKEluZGV4VHlwZSB0bXBJbmRleCkKKyAgICB7
CisgICAgICAgIHJldHVybiBtX2lzT25TZWxlY3RTdGFjay5xdWlja0dldCh0bXBJbmRleCkgfHwg
ISFtX2NvYWxlc2NlZFRtcHNbdG1wSW5kZXhdOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVu
YW1lIEZ1bmN0aW9uPgorICAgIHZvaWQgZm9yRWFjaE5vZGVNb3ZlcyhJbmRleFR5cGUgdG1wSW5k
ZXgsIEZ1bmN0aW9uIGZ1bmN0aW9uKQorICAgIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBtb3Zl
SW5kZXggOiBtX21vdmVMaXN0W3RtcEluZGV4XSkgeworICAgICAgICAgICAgaWYgKG1fYWN0aXZl
TW92ZXMucXVpY2tHZXQobW92ZUluZGV4KSB8fCBtX3dvcmtsaXN0TW92ZXMuY29udGFpbnMobW92
ZUluZGV4KSkKKyAgICAgICAgICAgICAgICBmdW5jdGlvbihtb3ZlSW5kZXgpOworICAgICAgICB9
CisgICAgfQorCisgICAgdm9pZCBlbmFibGVNb3Zlc09uVmFsdWUoSW5kZXhUeXBlIHRtcEluZGV4
KQorICAgIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBtb3ZlSW5kZXggOiBtX21vdmVMaXN0W3Rt
cEluZGV4XSkgeworICAgICAgICAgICAgaWYgKG1fYWN0aXZlTW92ZXMucXVpY2tDbGVhcihtb3Zl
SW5kZXgpKQorICAgICAgICAgICAgICAgIG1fd29ya2xpc3RNb3Zlcy5yZXR1cm5Nb3ZlKG1vdmVJ
bmRleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGVuYWJsZU1vdmVzT25WYWx1ZUFu
ZEFkamFjZW50cyhJbmRleFR5cGUgdG1wSW5kZXgpCisgICAgeworICAgICAgICBlbmFibGVNb3Zl
c09uVmFsdWUodG1wSW5kZXgpOworCisgICAgICAgIGZvckVhY2hBZGphY2VudCh0bXBJbmRleCwg
W3RoaXNdIChJbmRleFR5cGUgYWRqYWNlbnRUbXBJbmRleCkgeworICAgICAgICAgICAgZW5hYmxl
TW92ZXNPblZhbHVlKGFkamFjZW50VG1wSW5kZXgpOworICAgICAgICB9KTsKKyAgICB9CisKKyAg
ICBib29sIGlzUHJlY29sb3JlZChJbmRleFR5cGUgdG1wSW5kZXgpCisgICAgeworICAgICAgICBy
ZXR1cm4gdG1wSW5kZXggPD0gbV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXg7CisgICAgfQor
CisgICAgdm9pZCBhZGRXb3JrTGlzdChJbmRleFR5cGUgdG1wSW5kZXgpCisgICAgeworICAgICAg
ICBpZiAoIWlzUHJlY29sb3JlZCh0bXBJbmRleCkgJiYgbV9kZWdyZWVzW3RtcEluZGV4XSA8IG1f
cmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkgJiYgIWlzTW92ZVJlbGF0ZWQodG1wSW5kZXgpKSB7
CisgICAgICAgICAgICBtX2ZyZWV6ZVdvcmtsaXN0LnJlbW92ZSh0bXBJbmRleCk7CisgICAgICAg
ICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuYXBwZW5kKHRtcEluZGV4KTsKKyAgICAgICAgfQorICAg
IH0KKworICAgIHZvaWQgY29tYmluZShJbmRleFR5cGUgdSwgSW5kZXhUeXBlIHYpCisgICAgewor
ICAgICAgICBpZiAoIW1fZnJlZXplV29ya2xpc3QucmVtb3ZlKHYpKQorICAgICAgICAgICAgbV9z
cGlsbFdvcmtsaXN0LnJlbW92ZSh2KTsKKworICAgICAgICBBU1NFUlQoIW1fY29hbGVzY2VkVG1w
c1t2XSk7CisgICAgICAgIG1fY29hbGVzY2VkVG1wc1t2XSA9IHU7CisKKyAgICAgICAgYXV0byYg
dk1vdmVzID0gbV9tb3ZlTGlzdFt2XTsKKyAgICAgICAgbV9tb3ZlTGlzdFt1XS5hZGQodk1vdmVz
LmJlZ2luKCksIHZNb3Zlcy5lbmQoKSk7CisKKyAgICAgICAgZm9yRWFjaEFkamFjZW50KHYsIFt0
aGlzLCB1XSAoSW5kZXhUeXBlIGFkamFjZW50VG1wSW5kZXgpIHsKKyAgICAgICAgICAgIGlmIChh
ZGRFZGdlRGlzdGluY3RXaXRob3V0RGVncmVlQ2hhbmdlKGFkamFjZW50VG1wSW5kZXgsIHUpKSB7
CisgICAgICAgICAgICAgICAgLy8gSWYgd2UgYWRkZWQgYSBuZXcgZWRnZSBiZXR3ZWVuIHRoZSBh
ZGphY2VudFRtcCBhbmQgdSwgaXQgcmVwbGFjZXMgdGhlIGVkZ2UKKyAgICAgICAgICAgICAgICAv
LyB0aGF0IGV4aXN0ZWQgd2l0aCB2LgorICAgICAgICAgICAgICAgIC8vIFRoZSBkZWdyZWUgb2Yg
YWRqYWNlbnRUbXAgcmVtYWlucyB0aGUgc2FtZSBzaW5jZSB0aGUgZWRnZSBqdXN0IGNoYW5nZWQg
ZnJvbSB1IHRvIHYuCisgICAgICAgICAgICAgICAgLy8gQWxsIHdlIG5lZWQgdG8gZG8gaXMgdXBk
YXRlIHRoZSBkZWdyZWUgb2YgdS4KKyAgICAgICAgICAgICAgICBpZiAoIWlzUHJlY29sb3JlZCh1
KSkKKyAgICAgICAgICAgICAgICAgICAgbV9kZWdyZWVzW3VdKys7CisgICAgICAgICAgICB9IGVs
c2UgeworICAgICAgICAgICAgICAgIC8vIElmIHdlIGFscmVhZHkgaGFkIGFuIGVkZ2UgYmV0d2Vl
biB0aGUgYWRqYWNlbnRUbXAgYW5kIHUsIHRoZSBkZWdyZWUgb2YgdQorICAgICAgICAgICAgICAg
IC8vIGlzIGFscmVhZHkgY29ycmVjdC4gVGhlIGRlZ3JlZSBvZiB0aGUgYWRqYWNlbnRUbXAgZGVj
cmVhc2VzIHNpbmNlIHRoZSBlZGdlCisgICAgICAgICAgICAgICAgLy8gd2l0aCB2IGlzIG5vIGxv
bmdlciByZWxldmFudCAod2UgY2FuIHRoaW5rIG9mIGl0IGFzIG1lcmdlZCB3aXRoIHRoZSBlZGdl
IHdpdGggdSkuCisgICAgICAgICAgICAgICAgZGVjcmVtZW50RGVncmVlKGFkamFjZW50VG1wSW5k
ZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBpZiAobV9mcmFtZVBv
aW50ZXJJbmRleCAmJiBtX2ludGVyZmVyZXNXaXRoRnJhbWVQb2ludGVyLnF1aWNrR2V0KHYpKQor
ICAgICAgICAgICAgbV9pbnRlcmZlcmVzV2l0aEZyYW1lUG9pbnRlci5xdWlja1NldCh1KTsKKwor
ICAgICAgICBpZiAobV9kZWdyZWVzW3VdID49IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkg
JiYgbV9mcmVlemVXb3JrbGlzdC5yZW1vdmUodSkpCisgICAgICAgICAgICBhZGRUb1NwaWxsKHUp
OworICAgIH0KKworICAgIGJvb2wgY2FuQmVTYWZlbHlDb2FsZXNjZWQoSW5kZXhUeXBlIHUsIElu
ZGV4VHlwZSB2KQorICAgIHsKKyAgICAgICAgQVNTRVJUKCFpc1ByZWNvbG9yZWQodikpOworICAg
ICAgICBpZiAoaXNQcmVjb2xvcmVkKHUpKQorICAgICAgICAgICAgcmV0dXJuIHByZWNvbG9yZWRD
b2FsZXNjaW5nSGV1cmlzdGljKHUsIHYpOworICAgICAgICByZXR1cm4gY29uc2VydmF0aXZlSGV1
cmlzdGljKHUsIHYpOworICAgIH0KKworICAgIGJvb2wgY29uc2VydmF0aXZlSGV1cmlzdGljKElu
ZGV4VHlwZSB1LCBJbmRleFR5cGUgdikKKyAgICB7CisgICAgICAgIC8vIFRoaXMgaXMgdXNpbmcg
dGhlIEJyaWdncycgY29uc2VydmF0aXZlIGNvYWxlc2NpbmcgcnVsZToKKyAgICAgICAgLy8gSWYg
dGhlIG51bWJlciBvZiBjb21iaW5lZCBhZGphY2VudCBub2RlIHdpdGggYSBkZWdyZWUgPj0gSyBp
cyBsZXNzIHRoYW4gSywKKyAgICAgICAgLy8gaXQgaXMgc2FmZSB0byBjb21iaW5lIHRoZSB0d28g
bm9kZXMuIFRoZSByZWFzb24gaXMgdGhhdCB3ZSBrbm93IHRoYXQgaWYgdGhlIGdyYXBoCisgICAg
ICAgIC8vIGlzIGNvbG9yYWJsZSwgd2UgaGF2ZSBmZXdlciB0aGFuIEsgYWRqYWNlbnRzIHdpdGgg
aGlnaCBvcmRlciBhbmQgdGhlcmUgaXMgYSBjb2xvcgorICAgICAgICAvLyBmb3IgdGhlIGN1cnJl
bnQgbm9kZS4KKyAgICAgICAgQVNTRVJUKHUgIT0gdik7CisgICAgICAgIEFTU0VSVCghaXNQcmVj
b2xvcmVkKHUpKTsKKyAgICAgICAgQVNTRVJUKCFpc1ByZWNvbG9yZWQodikpOworCisgICAgICAg
IGNvbnN0IGF1dG8mIGFkamFjZW50c09mVSA9IG1fYWRqYWNlbmN5TGlzdFt1XTsKKyAgICAgICAg
Y29uc3QgYXV0byYgYWRqYWNlbnRzT2ZWID0gbV9hZGphY2VuY3lMaXN0W3ZdOworCisgICAgICAg
IGlmIChhZGphY2VudHNPZlUuc2l6ZSgpICsgYWRqYWNlbnRzT2ZWLnNpemUoKSA8IG1fcmVnc0lu
UHJpb3JpdHlPcmRlci5zaXplKCkpIHsKKyAgICAgICAgICAgIC8vIFNob3J0Y3V0OiBpZiB0aGUg
dG90YWwgbnVtYmVyIG9mIGFkamFjZW50cyBpcyBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiByZWdp
c3RlciwgdGhlIGNvbmRpdGlvbiBpcyBhbHdheXMgbWV0LgorICAgICAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgICAgIH0KKworICAgICAgICBIYXNoU2V0PEluZGV4VHlwZT4gaGlnaE9yZGVyQWRq
YWNlbnRzOworCisgICAgICAgIGZvciAoSW5kZXhUeXBlIGFkamFjZW50VG1wSW5kZXggOiBhZGph
Y2VudHNPZlUpIHsKKyAgICAgICAgICAgIEFTU0VSVChhZGphY2VudFRtcEluZGV4ICE9IHYpOwor
ICAgICAgICAgICAgQVNTRVJUKGFkamFjZW50VG1wSW5kZXggIT0gdSk7CisgICAgICAgICAgICBp
ZiAoIWhhc0JlZW5TaW1wbGlmaWVkKGFkamFjZW50VG1wSW5kZXgpICYmIG1fZGVncmVlc1thZGph
Y2VudFRtcEluZGV4XSA+PSBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpKSB7CisgICAgICAg
ICAgICAgICAgYXV0byBhZGRSZXN1bHQgPSBoaWdoT3JkZXJBZGphY2VudHMuYWRkKGFkamFjZW50
VG1wSW5kZXgpOworICAgICAgICAgICAgICAgIGlmIChhZGRSZXN1bHQuaXNOZXdFbnRyeSAmJiBo
aWdoT3JkZXJBZGphY2VudHMuc2l6ZSgpID49IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkp
CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfQorICAgICAgICBmb3IgKEluZGV4VHlwZSBhZGphY2VudFRtcEluZGV4IDogYWRqYWNlbnRz
T2ZWKSB7CisgICAgICAgICAgICBBU1NFUlQoYWRqYWNlbnRUbXBJbmRleCAhPSB1KTsKKyAgICAg
ICAgICAgIEFTU0VSVChhZGphY2VudFRtcEluZGV4ICE9IHYpOworICAgICAgICAgICAgaWYgKCFo
YXNCZWVuU2ltcGxpZmllZChhZGphY2VudFRtcEluZGV4KSAmJiBtX2RlZ3JlZXNbYWRqYWNlbnRU
bXBJbmRleF0gPj0gbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKSkgeworICAgICAgICAgICAg
ICAgIGF1dG8gYWRkUmVzdWx0ID0gaGlnaE9yZGVyQWRqYWNlbnRzLmFkZChhZGphY2VudFRtcElu
ZGV4KTsKKyAgICAgICAgICAgICAgICBpZiAoYWRkUmVzdWx0LmlzTmV3RW50cnkgJiYgaGlnaE9y
ZGVyQWRqYWNlbnRzLnNpemUoKSA+PSBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpKQorICAg
ICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0K
KworICAgICAgICBBU1NFUlQoaGlnaE9yZGVyQWRqYWNlbnRzLnNpemUoKSA8IG1fcmVnc0luUHJp
b3JpdHlPcmRlci5zaXplKCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBi
b29sIHByZWNvbG9yZWRDb2FsZXNjaW5nSGV1cmlzdGljKEluZGV4VHlwZSB1LCBJbmRleFR5cGUg
dikKKyAgICB7CisgICAgICAgIGlmICh0cmFjZURlYnVnKQorICAgICAgICAgICAgZGF0YUxvZygi
ICAgIENoZWNraW5nIHByZWNvbG9yZWRDb2FsZXNjaW5nSGV1cmlzdGljXG4iKTsKKyAgICAgICAg
QVNTRVJUKGlzUHJlY29sb3JlZCh1KSk7CisgICAgICAgIEFTU0VSVCghaXNQcmVjb2xvcmVkKHYp
KTsKKyAgICAgICAgCisgICAgICAgIC8vIElmIHUgaXMgYSBwaW5uZWQgcmVnaXN0ZXIgdGhlbiBp
dCdzIGFsd2F5cyBzYWZlIHRvIGNvYWxlc2NlLiBOb3RlIHRoYXQgd2hlbiB3ZSBjYWxsIHRoaXMs
CisgICAgICAgIC8vIHdlIGhhdmUgYWxyZWFkeSBwcm92ZWQgdGhhdCB0aGVyZSBpcyBubyBpbnRl
cmZlcmVuY2UgYmV0d2VlbiB1IGFuZCB2LgorICAgICAgICBpZiAoIW1fbXV0YWJsZVJlZ3MuZ2V0
KG1fY29sb3JlZFRtcFt1XSkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAv
LyBJZiBhbnkgYWRqYWNlbnQgb2YgdGhlIG5vbi1jb2xvcmVkIG5vZGUgaXMgbm90IGFuIGFkamFj
ZW50IG9mIHRoZSBjb2xvcmVkIG5vZGUgQU5EIGhhcyBhIGRlZ3JlZSA+PSBLCisgICAgICAgIC8v
IHRoZXJlIGlzIGEgcmlzayB0aGF0IHRoaXMgbm9kZSBuZWVkcyB0byBoYXZlIHRoZSBzYW1lIGNv
bG9yIGFzIG91ciBwcmVjb2xvcmVkIG5vZGUuIElmIHdlIGNvYWxlc2NlIHN1Y2gKKyAgICAgICAg
Ly8gbW92ZSwgd2UgbWF5IGNyZWF0ZSBhbiB1bmNvbG9yYWJsZSBncmFwaC4KKyAgICAgICAgY29u
c3QgYXV0byYgYWRqYWNlbnRzT2ZWID0gbV9hZGphY2VuY3lMaXN0W3ZdOworICAgICAgICBmb3Ig
KHVuc2lnbmVkIGFkamFjZW50VG1wSW5kZXggOiBhZGphY2VudHNPZlYpIHsKKyAgICAgICAgICAg
IGlmICghaXNQcmVjb2xvcmVkKGFkamFjZW50VG1wSW5kZXgpCisgICAgICAgICAgICAgICAgJiYg
IWhhc0JlZW5TaW1wbGlmaWVkKGFkamFjZW50VG1wSW5kZXgpCisgICAgICAgICAgICAgICAgJiYg
bV9kZWdyZWVzW2FkamFjZW50VG1wSW5kZXhdID49IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXpl
KCkKKyAgICAgICAgICAgICAgICAmJiAhbV9pbnRlcmZlcmVuY2VFZGdlcy5jb250YWlucyhJbnRl
cmZlcmVuY2VFZGdlKHUsIGFkamFjZW50VG1wSW5kZXgpKSkKKyAgICAgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCitwcm90
ZWN0ZWQ6CisjaWYgUExBVEZPUk0oQ09DT0EpCisjcHJhZ21hIG1hcmsgLQorI2VuZGlmCisKKyAg
ICAvLyBJbnRlcmZlcmVuY2UgZWRnZXMgYXJlIG5vdCBkaXJlY3RlZC4gQW4gZWRnZSBiZXR3ZWVu
IGFueSB0d28gVG1wcyBpcyByZXByZXNlbnRlZAorICAgIC8vIGJ5IHRoZSBjb25jYXRlbmF0ZWQg
dmFsdWVzIG9mIHRoZSBzbWFsbGVzdCBUbXAgZm9sbG93ZWQgYnkgdGhlIGJpZ2dlciBUbXAuCisg
ICAgY2xhc3MgSW50ZXJmZXJlbmNlRWRnZSB7CisgICAgcHVibGljOgorICAgICAgICBJbnRlcmZl
cmVuY2VFZGdlKCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgSW50ZXJmZXJlbmNl
RWRnZShJbmRleFR5cGUgYSwgSW5kZXhUeXBlIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFT
U0VSVChhKTsKKyAgICAgICAgICAgIEFTU0VSVChiKTsKKyAgICAgICAgICAgIEFTU0VSVF9XSVRI
X01FU1NBR0UoYSAhPSBiLCAiQSBUbXAgY2FuIG5ldmVyIGludGVyZmVyZSB3aXRoIGl0c2VsZi4g
RG9pbmcgc28gd291bGQgZm9yY2UgaXQgdG8gYmUgdGhlIHN1cGVycG9zaXRpb24gb2YgdHdvIHJl
Z2lzdGVycy4iKTsKKworICAgICAgICAgICAgaWYgKGIgPCBhKQorICAgICAgICAgICAgICAgIHN0
ZDo6c3dhcChhLCBiKTsKKyAgICAgICAgICAgIG1fdmFsdWUgPSBzdGF0aWNfY2FzdDx1aW50NjRf
dD4oYSkgPDwgMzIgfCBiOworICAgICAgICB9CisKKyAgICAgICAgSW50ZXJmZXJlbmNlRWRnZShX
VEY6Okhhc2hUYWJsZURlbGV0ZWRWYWx1ZVR5cGUpCisgICAgICAgICAgICA6IG1fdmFsdWUoc3Rk
OjpudW1lcmljX2xpbWl0czx1aW50NjRfdD46Om1heCgpKQorICAgICAgICB7CisgICAgICAgIH0K
KworICAgICAgICBJbmRleFR5cGUgZmlyc3QoKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAg
ICByZXR1cm4gbV92YWx1ZSA+PiAzMiAmIDB4ZmZmZmZmZmY7CisgICAgICAgIH0KKworICAgICAg
ICBJbmRleFR5cGUgc2Vjb25kKCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJu
IG1fdmFsdWUgJiAweGZmZmZmZmZmOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBvcGVyYXRv
cj09KGNvbnN0IEludGVyZmVyZW5jZUVkZ2Ugb3RoZXIpIGNvbnN0CisgICAgICAgIHsKKyAgICAg
ICAgICAgIHJldHVybiBtX3ZhbHVlID09IG90aGVyLm1fdmFsdWU7CisgICAgICAgIH0KKworICAg
ICAgICBib29sIGlzSGFzaFRhYmxlRGVsZXRlZFZhbHVlKCkgY29uc3QKKyAgICAgICAgeworICAg
ICAgICAgICAgcmV0dXJuICp0aGlzID09IEludGVyZmVyZW5jZUVkZ2UoV1RGOjpIYXNoVGFibGVE
ZWxldGVkVmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgdW5zaWduZWQgaGFzaCgpIGNvbnN0
CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBXVEY6OkludEhhc2g8dWludDY0X3Q+Ojpo
YXNoKG1fdmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBkdW1wKFByaW50U3RyZWFt
JiBvdXQpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIG91dC5wcmludChmaXJzdCgpLCAi
PD0+Iiwgc2Vjb25kKCkpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICB1aW50
NjRfdCBtX3ZhbHVlIHsgMCB9OworICAgIH07CisKKyAgICBzdHJ1Y3QgSW50ZXJmZXJlbmNlRWRn
ZUhhc2ggeworICAgICAgICBzdGF0aWMgdW5zaWduZWQgaGFzaChjb25zdCBJbnRlcmZlcmVuY2VF
ZGdlJiBrZXkpIHsgcmV0dXJuIGtleS5oYXNoKCk7IH0KKyAgICAgICAgc3RhdGljIGJvb2wgZXF1
YWwoY29uc3QgSW50ZXJmZXJlbmNlRWRnZSYgYSwgY29uc3QgSW50ZXJmZXJlbmNlRWRnZSYgYikg
eyByZXR1cm4gYSA9PSBiOyB9CisgICAgICAgIHN0YXRpYyBjb25zdCBib29sIHNhZmVUb0NvbXBh
cmVUb0VtcHR5T3JEZWxldGVkID0gdHJ1ZTsKKyAgICB9OworICAgIHR5cGVkZWYgU2ltcGxlQ2xh
c3NIYXNoVHJhaXRzPEludGVyZmVyZW5jZUVkZ2U+IEludGVyZmVyZW5jZUVkZ2VIYXNoVHJhaXRz
OworCisgICAgY29uc3QgVmVjdG9yPFJlZz4mIG1fcmVnc0luUHJpb3JpdHlPcmRlcjsKKyAgICBS
ZWdpc3RlclNldCBtX211dGFibGVSZWdzOworICAgIEluZGV4VHlwZSBtX2xhc3RQcmVjb2xvcmVk
UmVnaXN0ZXJJbmRleCB7IDAgfTsKKworICAgIC8vIFRoZSBpbnRlcmZlcmVuY2UgZ3JhcGguCisg
ICAgSGFzaFNldDxJbnRlcmZlcmVuY2VFZGdlLCBJbnRlcmZlcmVuY2VFZGdlSGFzaCwgSW50ZXJm
ZXJlbmNlRWRnZUhhc2hUcmFpdHM+IG1faW50ZXJmZXJlbmNlRWRnZXM7CisgICAgVmVjdG9yPFZl
Y3RvcjxJbmRleFR5cGUsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93LCA0PiwgMCwgVW5zYWZlVmVj
dG9yT3ZlcmZsb3c+IG1fYWRqYWNlbmN5TGlzdDsKKyAgICBWZWN0b3I8SW5kZXhUeXBlLCAwLCBV
bnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9kZWdyZWVzOworCisgICAgLy8gSW5zdGVhZCBvZiBrZWVw
aW5nIHRyYWNrIG9mIHRoZSBtb3ZlIGluc3RydWN0aW9ucywgd2UganVzdCBrZWVwIHRoZWlyIG9w
ZXJhbmRzIGFyb3VuZCBhbmQgdXNlIHRoZSBpbmRleAorICAgIC8vIGluIHRoZSB2ZWN0b3IgYXMg
dGhlICJpZGVudGlmaWVyIiBmb3IgdGhlIG1vdmUuCisgICAgc3RydWN0IE1vdmVPcGVyYW5kcyB7
CisgICAgICAgIEluZGV4VHlwZSBzcmNJbmRleDsKKyAgICAgICAgSW5kZXhUeXBlIGRzdEluZGV4
OworICAgIH07CisgICAgVmVjdG9yPE1vdmVPcGVyYW5kcywgMCwgVW5zYWZlVmVjdG9yT3ZlcmZs
b3c+IG1fY29hbGVzY2luZ0NhbmRpZGF0ZXM7CisKKyAgICAvLyBMaXN0IG9mIGV2ZXJ5IG1vdmUg
aW5zdHJ1Y3Rpb24gYXNzb2NpYXRlZCB3aXRoIGEgVG1wLgorICAgIFZlY3RvcjxIYXNoU2V0PElu
ZGV4VHlwZSwgdHlwZW5hbWUgRGVmYXVsdEhhc2g8SW5kZXhUeXBlPjo6SGFzaCwgV1RGOjpVbnNp
Z25lZFdpdGhaZXJvS2V5SGFzaFRyYWl0czxJbmRleFR5cGU+Pj4gbV9tb3ZlTGlzdDsKKworICAg
IC8vIENvbG9ycy4KKyAgICBWZWN0b3I8UmVnLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9j
b2xvcmVkVG1wOworICAgIFZlY3RvcjxJbmRleFR5cGU+IG1fc3BpbGxlZFRtcHM7CisKKyAgICAv
LyBWYWx1ZXMgdGhhdCBoYXZlIGJlZW4gY29hbGVzY2VkIHdpdGggYW4gb3RoZXIgdmFsdWUuCisg
ICAgVmVjdG9yPEluZGV4VHlwZSwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fY29hbGVzY2Vk
VG1wczsKKworICAgIC8vIFRoZSBzdGFjayBvZiBUbXAgcmVtb3ZlZCBmcm9tIHRoZSBncmFwaCBh
bmQgcmVhZHkgZm9yIGNvbG9yaW5nLgorICAgIEJpdFZlY3RvciBtX2lzT25TZWxlY3RTdGFjazsK
KyAgICBWZWN0b3I8SW5kZXhUeXBlPiBtX3NlbGVjdFN0YWNrOworCisgICAgSW5kZXhUeXBlIG1f
ZnJhbWVQb2ludGVySW5kZXggeyAwIH07CisgICAgQml0VmVjdG9yIG1faW50ZXJmZXJlc1dpdGhG
cmFtZVBvaW50ZXI7CisKKyAgICBzdHJ1Y3QgT3JkZXJlZE1vdmVTZXQgeworICAgICAgICB1bnNp
Z25lZCBhZGRNb3ZlKCkKKyAgICAgICAgeworICAgICAgICAgICAgQVNTRVJUKG1fbG93UHJpb3Jp
dHlNb3ZlTGlzdC5pc0VtcHR5KCkpOworICAgICAgICAgICAgQVNTRVJUKCFtX2ZpcnN0TG93UHJp
b3JpdHlNb3ZlSW5kZXgpOworCisgICAgICAgICAgICB1bnNpZ25lZCBuZXh0SW5kZXggPSBtX3Bv
c2l0aW9uSW5Nb3ZlTGlzdC5zaXplKCk7CisgICAgICAgICAgICB1bnNpZ25lZCBwb3NpdGlvbiA9
IG1fbW92ZUxpc3Quc2l6ZSgpOworICAgICAgICAgICAgbV9tb3ZlTGlzdC5hcHBlbmQobmV4dElu
ZGV4KTsKKyAgICAgICAgICAgIG1fcG9zaXRpb25Jbk1vdmVMaXN0LmFwcGVuZChwb3NpdGlvbik7
CisgICAgICAgICAgICByZXR1cm4gbmV4dEluZGV4OworICAgICAgICB9CisKKyAgICAgICAgdm9p
ZCBzdGFydEFkZGluZ0xvd1ByaW9yaXR5TW92ZXMoKQorICAgICAgICB7CisgICAgICAgICAgICBB
U1NFUlQobV9sb3dQcmlvcml0eU1vdmVMaXN0LmlzRW1wdHkoKSk7CisgICAgICAgICAgICBtX2Zp
cnN0TG93UHJpb3JpdHlNb3ZlSW5kZXggPSBtX21vdmVMaXN0LnNpemUoKTsKKyAgICAgICAgfQor
CisgICAgICAgIHVuc2lnbmVkIGFkZExvd1ByaW9yaXR5TW92ZSgpCisgICAgICAgIHsKKyAgICAg
ICAgICAgIEFTU0VSVChtX2ZpcnN0TG93UHJpb3JpdHlNb3ZlSW5kZXggPT0gbV9tb3ZlTGlzdC5z
aXplKCkpOworCisgICAgICAgICAgICB1bnNpZ25lZCBuZXh0SW5kZXggPSBtX3Bvc2l0aW9uSW5N
b3ZlTGlzdC5zaXplKCk7CisgICAgICAgICAgICB1bnNpZ25lZCBwb3NpdGlvbiA9IG1fbG93UHJp
b3JpdHlNb3ZlTGlzdC5zaXplKCk7CisgICAgICAgICAgICBtX2xvd1ByaW9yaXR5TW92ZUxpc3Qu
YXBwZW5kKG5leHRJbmRleCk7CisgICAgICAgICAgICBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdC5hcHBl
bmQocG9zaXRpb24pOworCisgICAgICAgICAgICBBU1NFUlQobmV4dEluZGV4ID49IG1fZmlyc3RM
b3dQcmlvcml0eU1vdmVJbmRleCk7CisKKyAgICAgICAgICAgIHJldHVybiBuZXh0SW5kZXg7Cisg
ICAgICAgIH0KKworICAgICAgICBib29sIGlzRW1wdHkoKSBjb25zdAorICAgICAgICB7CisgICAg
ICAgICAgICByZXR1cm4gbV9tb3ZlTGlzdC5pc0VtcHR5KCkgJiYgbV9sb3dQcmlvcml0eU1vdmVM
aXN0LmlzRW1wdHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgY29udGFpbnModW5zaWdu
ZWQgaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtX3Bvc2l0aW9uSW5Nb3Zl
TGlzdFtpbmRleF0gIT0gc3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25lZD46Om1heCgpOworICAg
ICAgICB9CisKKyAgICAgICAgdm9pZCB0YWtlTW92ZSh1bnNpZ25lZCBtb3ZlSW5kZXgpCisgICAg
ICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIHBvc2l0aW9uSW5Nb3ZlTGlzdCA9IG1fcG9zaXRp
b25Jbk1vdmVMaXN0W21vdmVJbmRleF07CisgICAgICAgICAgICBpZiAocG9zaXRpb25Jbk1vdmVM
aXN0ID09IHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgoKSkKKyAgICAgICAgICAg
ICAgICByZXR1cm47CisKKyAgICAgICAgICAgIGlmIChtb3ZlSW5kZXggPCBtX2ZpcnN0TG93UHJp
b3JpdHlNb3ZlSW5kZXgpIHsKKyAgICAgICAgICAgICAgICBBU1NFUlQobV9tb3ZlTGlzdFtwb3Np
dGlvbkluTW92ZUxpc3RdID09IG1vdmVJbmRleCk7CisgICAgICAgICAgICAgICAgdW5zaWduZWQg
bGFzdEluZGV4ID0gbV9tb3ZlTGlzdC5sYXN0KCk7CisgICAgICAgICAgICAgICAgbV9wb3NpdGlv
bkluTW92ZUxpc3RbbGFzdEluZGV4XSA9IHBvc2l0aW9uSW5Nb3ZlTGlzdDsKKyAgICAgICAgICAg
ICAgICBtX21vdmVMaXN0W3Bvc2l0aW9uSW5Nb3ZlTGlzdF0gPSBsYXN0SW5kZXg7CisgICAgICAg
ICAgICAgICAgbV9tb3ZlTGlzdC5yZW1vdmVMYXN0KCk7CisgICAgICAgICAgICB9IGVsc2Ugewor
ICAgICAgICAgICAgICAgIEFTU0VSVChtX2xvd1ByaW9yaXR5TW92ZUxpc3RbcG9zaXRpb25Jbk1v
dmVMaXN0XSA9PSBtb3ZlSW5kZXgpOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxhc3RJbmRl
eCA9IG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5sYXN0KCk7CisgICAgICAgICAgICAgICAgbV9wb3Np
dGlvbkluTW92ZUxpc3RbbGFzdEluZGV4XSA9IHBvc2l0aW9uSW5Nb3ZlTGlzdDsKKyAgICAgICAg
ICAgICAgICBtX2xvd1ByaW9yaXR5TW92ZUxpc3RbcG9zaXRpb25Jbk1vdmVMaXN0XSA9IGxhc3RJ
bmRleDsKKyAgICAgICAgICAgICAgICBtX2xvd1ByaW9yaXR5TW92ZUxpc3QucmVtb3ZlTGFzdCgp
OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdFttb3Zl
SW5kZXhdID0gc3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25lZD46Om1heCgpOworCisgICAgICAg
ICAgICBBU1NFUlQoIWNvbnRhaW5zKG1vdmVJbmRleCkpOworICAgICAgICB9CisKKyAgICAgICAg
dW5zaWduZWQgdGFrZUxhc3RNb3ZlKCkKKyAgICAgICAgeworICAgICAgICAgICAgQVNTRVJUKCFp
c0VtcHR5KCkpOworCisgICAgICAgICAgICB1bnNpZ25lZCBsYXN0SW5kZXg7CisgICAgICAgICAg
ICBpZiAoIW1fbW92ZUxpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgbGFzdEluZGV4
ID0gbV9tb3ZlTGlzdC50YWtlTGFzdCgpOworICAgICAgICAgICAgICAgIEFTU0VSVChtX3Bvc2l0
aW9uSW5Nb3ZlTGlzdFtsYXN0SW5kZXhdID09IG1fbW92ZUxpc3Quc2l6ZSgpKTsKKyAgICAgICAg
ICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbGFzdEluZGV4ID0gbV9sb3dQcmlvcml0eU1v
dmVMaXN0LnRha2VMYXN0KCk7CisgICAgICAgICAgICAgICAgQVNTRVJUKG1fcG9zaXRpb25Jbk1v
dmVMaXN0W2xhc3RJbmRleF0gPT0gbV9sb3dQcmlvcml0eU1vdmVMaXN0LnNpemUoKSk7CisgICAg
ICAgICAgICB9CisgICAgICAgICAgICBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdFtsYXN0SW5kZXhdID0g
c3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25lZD46Om1heCgpOworCisgICAgICAgICAgICBBU1NF
UlQoIWNvbnRhaW5zKGxhc3RJbmRleCkpOworICAgICAgICAgICAgcmV0dXJuIGxhc3RJbmRleDsK
KyAgICAgICAgfQorCisgICAgICAgIHZvaWQgcmV0dXJuTW92ZSh1bnNpZ25lZCBpbmRleCkKKyAg
ICAgICAgeworICAgICAgICAgICAgLy8gVGhpcyBhc3NlcnRpb24gaXMgYSBiaXQgc3RyaWN0IGJ1
dCB0aGF0IGlzIGhvdyB0aGUgbW92ZSBsaXN0IHNob3VsZCBiZSB1c2VkLiBUaGUgb25seSBraW5k
IG9mIG1vdmVzIHRoYXQgY2FuCisgICAgICAgICAgICAvLyByZXR1cm4gdG8gdGhlIGxpc3QgYXJl
IHRoZSBvbmVzIHRoYXQgd2UgcHJldmlvdXNseSBmYWlsZWQgdG8gY29hbGVzY2Ugd2l0aCB0aGUg
Y29uc2VydmF0aXZlIGhldXJpc3RpY3MuCisgICAgICAgICAgICAvLyBWYWx1ZXMgc2hvdWxkIG5v
dCBiZSBhZGRlZCBiYWNrIGlmIHRoZXkgd2VyZSBuZXZlciB0YWtlbiBvdXQgd2hlbiBhdHRlbXB0
aW5nIGNvYWxlc2NpbmcuCisgICAgICAgICAgICBBU1NFUlQoIWNvbnRhaW5zKGluZGV4KSk7CisK
KyAgICAgICAgICAgIGlmIChpbmRleCA8IG1fZmlyc3RMb3dQcmlvcml0eU1vdmVJbmRleCkgewor
ICAgICAgICAgICAgICAgIHVuc2lnbmVkIHBvc2l0aW9uID0gbV9tb3ZlTGlzdC5zaXplKCk7Cisg
ICAgICAgICAgICAgICAgbV9tb3ZlTGlzdC5hcHBlbmQoaW5kZXgpOworICAgICAgICAgICAgICAg
IG1fcG9zaXRpb25Jbk1vdmVMaXN0W2luZGV4XSA9IHBvc2l0aW9uOworICAgICAgICAgICAgfSBl
bHNlIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBwb3NpdGlvbiA9IG1fbG93UHJpb3JpdHlN
b3ZlTGlzdC5zaXplKCk7CisgICAgICAgICAgICAgICAgbV9sb3dQcmlvcml0eU1vdmVMaXN0LmFw
cGVuZChpbmRleCk7CisgICAgICAgICAgICAgICAgbV9wb3NpdGlvbkluTW92ZUxpc3RbaW5kZXhd
ID0gcG9zaXRpb247CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFTU0VSVChjb250YWlu
cyhpbmRleCkpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBjbGVhcigpCisgICAgICAgIHsK
KyAgICAgICAgICAgIG1fcG9zaXRpb25Jbk1vdmVMaXN0LmNsZWFyKCk7CisgICAgICAgICAgICBt
X21vdmVMaXN0LmNsZWFyKCk7CisgICAgICAgICAgICBtX2xvd1ByaW9yaXR5TW92ZUxpc3QuY2xl
YXIoKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgVmVjdG9yPHVuc2lnbmVk
LCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9wb3NpdGlvbkluTW92ZUxpc3Q7CisgICAgICAg
IFZlY3Rvcjx1bnNpZ25lZCwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fbW92ZUxpc3Q7Cisg
ICAgICAgIFZlY3Rvcjx1bnNpZ25lZCwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fbG93UHJp
b3JpdHlNb3ZlTGlzdDsKKyAgICAgICAgdW5zaWduZWQgbV9maXJzdExvd1ByaW9yaXR5TW92ZUlu
ZGV4IHsgMCB9OworICAgIH07CisKKyAgICAvLyBXb3JrIGxpc3RzLgorICAgIC8vIFNldCBvZiAi
bW92ZSIgZW5hYmxlZCBmb3IgcG9zc2libGUgY29hbGVzY2luZy4KKyAgICBPcmRlcmVkTW92ZVNl
dCBtX3dvcmtsaXN0TW92ZXM7CisgICAgLy8gU2V0IG9mICJtb3ZlIiBub3QgeWV0IHJlYWR5IGZv
ciBjb2FsZXNjaW5nLgorICAgIEJpdFZlY3RvciBtX2FjdGl2ZU1vdmVzOworICAgIC8vIExvdy1k
ZWdyZWUsIG5vbi1Nb3ZlIHJlbGF0ZWQuCisgICAgVmVjdG9yPEluZGV4VHlwZT4gbV9zaW1wbGlm
eVdvcmtsaXN0OworICAgIC8vIEhpZ2gtZGVncmVlIFRtcC4KKyAgICBIYXNoU2V0PEluZGV4VHlw
ZT4gbV9zcGlsbFdvcmtsaXN0OworICAgIC8vIExvdy1kZWdyZWUsIE1vdmUgcmVsYXRlZC4KKyAg
ICBIYXNoU2V0PEluZGV4VHlwZT4gbV9mcmVlemVXb3JrbGlzdDsKKworICAgIGJvb2wgbV9oYXNT
ZWxlY3RlZFNwaWxsIHsgZmFsc2UgfTsKKyAgICBib29sIG1faGFzQ29hbGVzY2VkTm9uVHJpdmlh
bE1vdmUgeyBmYWxzZSB9OworCisgICAgLy8gVGhlIG1hcHBpbmcgb2YgVG1wIHRvIHRoZWlyIGFs
aWFzIGZvciBNb3ZlcyB0aGF0IGFyZSBhbHdheXMgY29hbGVzY2luZyByZWdhcmRsZXNzIG9mIHNw
aWxsaW5nLgorICAgIFZlY3RvcjxJbmRleFR5cGUsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBt
X2NvYWxlc2NlZFRtcHNBdFNwaWxsOworICAgIAorICAgIGNvbnN0IEhhc2hTZXQ8dW5zaWduZWQ+
JiBtX3Vuc3BpbGxhYmxlVG1wczsKK307CisKKy8vIFRoaXMgcGVyZm9ybSBhbGwgdGhlIHRhc2tz
IHRoYXQgYXJlIHNwZWNpZmljIHRvIGNlcnRhaW4gcmVnaXN0ZXIgdHlwZS4KK3RlbXBsYXRlPEFy
Zzo6VHlwZSB0eXBlPgorY2xhc3MgQ29sb3JpbmdBbGxvY2F0b3IgOiBwdWJsaWMgQWJzdHJhY3RD
b2xvcmluZ0FsbG9jYXRvcjx1bnNpZ25lZD4geworcHVibGljOgorICAgIENvbG9yaW5nQWxsb2Nh
dG9yKENvZGUmIGNvZGUsIFRtcFdpZHRoJiB0bXBXaWR0aCwgY29uc3QgVXNlQ291bnRzPFRtcD4m
IHVzZUNvdW50cywgY29uc3QgSGFzaFNldDx1bnNpZ25lZD4mIHVuc3BpbGxhYmxlVG1wKQorICAg
ICAgICA6IEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0b3I8dW5zaWduZWQ+KGNvZGUucmVnc0luUHJp
b3JpdHlPcmRlcih0eXBlKSwgQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46Omxhc3RNYWNoaW5lUmVn
aXN0ZXJJbmRleCgpLCB0bXBBcnJheVNpemUoY29kZSksIHVuc3BpbGxhYmxlVG1wKQorICAgICAg
ICAsIG1fY29kZShjb2RlKQorICAgICAgICAsIG1fdG1wV2lkdGgodG1wV2lkdGgpCisgICAgICAg
ICwgbV91c2VDb3VudHModXNlQ291bnRzKQorICAgIHsKKyAgICAgICAgaWYgKHR5cGUgPT0gQXJn
OjpHUCkgeworICAgICAgICAgICAgbV9mcmFtZVBvaW50ZXJJbmRleCA9IEFic29sdXRlVG1wTWFw
cGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KFRtcChNYWNyb0Fzc2VtYmxlcjo6ZnJhbWVQb2ludGVy
UmVnaXN0ZXIpKTsKKyAgICAgICAgICAgIG1faW50ZXJmZXJlc1dpdGhGcmFtZVBvaW50ZXIuZW5z
dXJlU2l6ZSh0bXBBcnJheVNpemUoY29kZSkpOworICAgICAgICB9CisKKyAgICAgICAgaW5pdGlh
bGl6ZVByZWNvbG9yZWRUbXAoKTsKKyAgICAgICAgYnVpbGQoKTsKKyAgICAgICAgYWxsb2NhdGUo
KTsKKyAgICB9CisKKyAgICBUbXAgZ2V0QWxpYXMoVG1wIHRtcCkgY29uc3QKKyAgICB7CisgICAg
ICAgIHJldHVybiBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgo
Z2V0QWxpYXMoQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodG1wKSkpOwor
ICAgIH0KKworICAgIC8vIFRoaXMgdGVsbHMgeW91IGlmIGEgTW92ZSB3aWxsIGJlIGNvYWxlc2Nh
YmxlIGlmIHRoZSBzcmMgYW5kIGRzdCBlbmQgdXAgbWF0Y2hpbmcuIFRoaXMgbWV0aG9kCisgICAg
Ly8gcmVsaWVzIG9uIGFuIGFuYWx5c2lzIHRoYXQgaXMgaW52YWxpZGF0ZWQgYnkgcmVnaXN0ZXIg
YWxsb2NhdGlvbiwgc28geW91IGl0J3Mgb25seSBtZWFuaW5nZnVsIHRvCisgICAgLy8gY2FsbCB0
aGlzICpiZWZvcmUqIHJlcGxhY2luZyB0aGUgVG1wJ3MgaW4gdGhpcyBJbnN0IHdpdGggcmVnaXN0
ZXJzIG9yIHNwaWxsIHNsb3RzLgorICAgIGJvb2wgbWF5QmVDb2FsZXNjYWJsZShjb25zdCBJbnN0
JiBpbnN0KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1heUJlQ29hbGVzY2FibGVJbXBs
KGluc3QsICZtX3RtcFdpZHRoKTsKKyAgICB9CisKKyAgICBib29sIGlzVXNlbGVzc01vdmUoY29u
c3QgSW5zdCYgaW5zdCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtYXlCZUNvYWxlc2Nh
YmxlSW1wbChpbnN0LCBudWxscHRyKSAmJiBpbnN0LmFyZ3NbMF0udG1wKCkgPT0gaW5zdC5hcmdz
WzFdLnRtcCgpOworICAgIH0KKworICAgIFRtcCBnZXRBbGlhc1doZW5TcGlsbGluZyhUbXAgdG1w
KSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUX1dJVEhfTUVTU0FHRSghbV9zcGlsbGVkVG1w
cy5pc0VtcHR5KCksICJUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgdmFsaWQgZm9yIGNvYWxlc2Npbmcg
ZHVyaW5nIHNwaWxsaW5nLiIpOworCisgICAgICAgIGlmIChtX2NvYWxlc2NlZFRtcHNBdFNwaWxs
LmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiB0bXA7CisKKyAgICAgICAgdW5zaWduZWQg
YWxpYXNJbmRleCA9IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHRtcCk7
CisgICAgICAgIHdoaWxlICh1bnNpZ25lZCBuZXh0QWxpYXNJbmRleCA9IG1fY29hbGVzY2VkVG1w
c0F0U3BpbGxbYWxpYXNJbmRleF0pCisgICAgICAgICAgICBhbGlhc0luZGV4ID0gbmV4dEFsaWFz
SW5kZXg7CisKKyAgICAgICAgVG1wIGFsaWFzID0gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRt
cEZyb21BYnNvbHV0ZUluZGV4KGFsaWFzSW5kZXgpOworCisgICAgICAgIEFTU0VSVF9XSVRIX01F
U1NBR0UoIW1fc3BpbGxlZFRtcHMuY29udGFpbnMoYWxpYXNJbmRleCkgfHwgYWxpYXMgPT0gdG1w
LCAiVGhlIGFsaWFzZXMgYXQgc3BpbGwgc2hvdWxkIGFsd2F5cyBiZSBjb2xvcmFibGUuIFNvbWV0
aGluZyB3ZW50IGhvcnJpYmx5IHdyb25nLiIpOworCisgICAgICAgIHJldHVybiBhbGlhczsKKyAg
ICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleEl0ZXJhdG9yPgorICAgIGNsYXNzIElu
ZGV4VG9UbXBJdGVyYXRvckFkYXB0b3IgeworICAgIHB1YmxpYzoKKyAgICAgICAgSW5kZXhUb1Rt
cEl0ZXJhdG9yQWRhcHRvcihJbmRleEl0ZXJhdG9yJiYgaW5kZXhJdGVyYXRvcikKKyAgICAgICAg
ICAgIDogbV9pbmRleEl0ZXJhdG9yKFdURk1vdmUoaW5kZXhJdGVyYXRvcikpCisgICAgICAgIHsK
KyAgICAgICAgfQorCisgICAgICAgIFRtcCBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBBYnNv
bHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgoKm1faW5kZXhJdGVyYXRv
cik7IH0KKyAgICAgICAgSW5kZXhUb1RtcEl0ZXJhdG9yQWRhcHRvciYgb3BlcmF0b3IrKygpIHsg
KyttX2luZGV4SXRlcmF0b3I7IHJldHVybiAqdGhpczsgfQorCisgICAgICAgIGJvb2wgb3BlcmF0
b3I9PShjb25zdCBJbmRleFRvVG1wSXRlcmF0b3JBZGFwdG9yJiBvdGhlcikgY29uc3QKKyAgICAg
ICAgeworICAgICAgICAgICAgcmV0dXJuIG1faW5kZXhJdGVyYXRvciA9PSBvdGhlci5tX2luZGV4
SXRlcmF0b3I7CisgICAgICAgIH0KKworICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgSW5k
ZXhUb1RtcEl0ZXJhdG9yQWRhcHRvciYgb3RoZXIpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAg
ICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToK
KyAgICAgICAgSW5kZXhJdGVyYXRvciBtX2luZGV4SXRlcmF0b3I7CisgICAgfTsKKworICAgIHRl
bXBsYXRlPHR5cGVuYW1lIENvbGxlY3Rpb24+CisgICAgY2xhc3MgSW5kZXhUb1RtcEl0ZXJhYmxl
QWRhcHRvciB7CisgICAgcHVibGljOgorICAgICAgICBJbmRleFRvVG1wSXRlcmFibGVBZGFwdG9y
KGNvbnN0IENvbGxlY3Rpb24mIGNvbGxlY3Rpb24pCisgICAgICAgICAgICA6IG1fY29sbGVjdGlv
bihjb2xsZWN0aW9uKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBJbmRleFRvVG1w
SXRlcmF0b3JBZGFwdG9yPHR5cGVuYW1lIENvbGxlY3Rpb246OmNvbnN0X2l0ZXJhdG9yPiBiZWdp
bigpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtX2NvbGxlY3Rpb24uYmVn
aW4oKTsKKyAgICAgICAgfQorCisgICAgICAgIEluZGV4VG9UbXBJdGVyYXRvckFkYXB0b3I8dHlw
ZW5hbWUgQ29sbGVjdGlvbjo6Y29uc3RfaXRlcmF0b3I+IGVuZCgpIGNvbnN0CisgICAgICAgIHsK
KyAgICAgICAgICAgIHJldHVybiBtX2NvbGxlY3Rpb24uZW5kKCk7CisgICAgICAgIH0KKworICAg
IHByaXZhdGU6CisgICAgICAgIGNvbnN0IENvbGxlY3Rpb24mIG1fY29sbGVjdGlvbjsKKyAgICB9
OworCisgICAgSW5kZXhUb1RtcEl0ZXJhYmxlQWRhcHRvcjxWZWN0b3I8dW5zaWduZWQ+PiBzcGls
bGVkVG1wcygpIGNvbnN0IHsgcmV0dXJuIG1fc3BpbGxlZFRtcHM7IH0KKworICAgIGJvb2wgcmVx
dWlyZXNTcGlsbGluZygpIGNvbnN0IHsgcmV0dXJuICFtX3NwaWxsZWRUbXBzLmlzRW1wdHkoKTsg
fQorCisgICAgUmVnIGFsbG9jYXRlZFJlZyhUbXAgdG1wKSBjb25zdAorICAgIHsKKyAgICAgICAg
QVNTRVJUKCF0bXAuaXNSZWcoKSk7CisgICAgICAgIEFTU0VSVChtX2NvbG9yZWRUbXAuc2l6ZSgp
KTsKKyAgICAgICAgQVNTRVJUKHRtcC5pc0dQKCkgPT0gKHR5cGUgPT0gQXJnOjpHUCkpOworCisg
ICAgICAgIFJlZyByZWcgPSBtX2NvbG9yZWRUbXBbQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFi
c29sdXRlSW5kZXgodG1wKV07CisgICAgICAgIGlmICghcmVnKSB7CisgICAgICAgICAgICBkYXRh
TG9nKCJGQVRBTDogTm8gY29sb3IgZm9yICIsIHRtcCwgIlxuIik7CisgICAgICAgICAgICBkYXRh
TG9nKCJDb2RlOlxuIik7CisgICAgICAgICAgICBkYXRhTG9nKG1fY29kZSk7CisgICAgICAgICAg
ICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICB9CisgICAgICAgIHJldHVy
biByZWc7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0YXRpYyB1bnNpZ25lZCB0bXBBcnJheVNp
emUoQ29kZSYgY29kZSkKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIG51bVRtcHMgPSBjb2RlLm51
bVRtcHModHlwZSk7CisgICAgICAgIHJldHVybiBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJz
b2x1dGVJbmRleChudW1UbXBzKTsKKyAgICB9CisKKyAgICB2b2lkIGluaXRpYWxpemVQcmVjb2xv
cmVkVG1wKCkKKyAgICB7CisgICAgICAgIG1fY29sb3JlZFRtcC5yZXNpemUobV9sYXN0UHJlY29s
b3JlZFJlZ2lzdGVySW5kZXggKyAxKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8
PSBtX2xhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleDsgKytpKSB7CisgICAgICAgICAgICBUbXAg
dG1wID0gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KGkpOwor
ICAgICAgICAgICAgQVNTRVJUKHRtcC5pc1JlZygpKTsKKyAgICAgICAgICAgIG1fY29sb3JlZFRt
cFtpXSA9IHRtcC5yZWcoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgbWF5QmVDb2Fs
ZXNjZWQoQXJnIGxlZnQsIEFyZyByaWdodCkKKyAgICB7CisgICAgICAgIGlmICghbGVmdC5pc1Rt
cCgpIHx8ICFyaWdodC5pc1RtcCgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
ICAgIFRtcCBsZWZ0VG1wID0gbGVmdC50bXAoKTsKKyAgICAgICAgVG1wIHJpZ2h0VG1wID0gcmln
aHQudG1wKCk7CisKKyAgICAgICAgaWYgKGxlZnRUbXAgPT0gcmlnaHRUbXApCisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKGxlZnRUbXAuaXNHUCgpICE9ICh0eXBlID09
IEFyZzo6R1ApIHx8IHJpZ2h0VG1wLmlzR1AoKSAhPSAodHlwZSA9PSBBcmc6OkdQKSkKKyAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICB1bnNpZ25lZCBsZWZ0SW5kZXggPSBBYnNv
bHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChsZWZ0VG1wKTsKKyAgICAgICAgdW5z
aWduZWQgcmlnaHRJbmRleCA9IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4
KHJpZ2h0VG1wKTsKKworICAgICAgICByZXR1cm4gIW1faW50ZXJmZXJlbmNlRWRnZXMuY29udGFp
bnMoSW50ZXJmZXJlbmNlRWRnZShsZWZ0SW5kZXgsIHJpZ2h0SW5kZXgpKTsKKyAgICB9CisKKyAg
ICB2b2lkIGFkZFRvTG93UHJpb3JpdHlDb2FsZXNjaW5nQ2FuZGlkYXRlcyhBcmcgbGVmdCwgQXJn
IHJpZ2h0KQorICAgIHsKKyAgICAgICAgQVNTRVJUKG1heUJlQ29hbGVzY2VkKGxlZnQsIHJpZ2h0
KSk7CisgICAgICAgIFRtcCBsZWZ0VG1wID0gbGVmdC50bXAoKTsKKyAgICAgICAgVG1wIHJpZ2h0
VG1wID0gcmlnaHQudG1wKCk7CisKKyAgICAgICAgdW5zaWduZWQgbGVmdEluZGV4ID0gQWJzb2x1
dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgobGVmdFRtcCk7CisgICAgICAgIHVuc2ln
bmVkIHJpZ2h0SW5kZXggPSBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChy
aWdodFRtcCk7CisKKyAgICAgICAgdW5zaWduZWQgbmV4dE1vdmVJbmRleCA9IG1fY29hbGVzY2lu
Z0NhbmRpZGF0ZXMuc2l6ZSgpOworICAgICAgICBtX2NvYWxlc2NpbmdDYW5kaWRhdGVzLmFwcGVu
ZCh7IGxlZnRJbmRleCwgcmlnaHRJbmRleCB9KTsKKworICAgICAgICB1bnNpZ25lZCBuZXdJbmRl
eEluV29ya2xpc3QgPSBtX3dvcmtsaXN0TW92ZXMuYWRkTG93UHJpb3JpdHlNb3ZlKCk7CisgICAg
ICAgIEFTU0VSVF9VTlVTRUQobmV3SW5kZXhJbldvcmtsaXN0LCBuZXdJbmRleEluV29ya2xpc3Qg
PT0gbmV4dE1vdmVJbmRleCk7CisKKyAgICAgICAgQVNTRVJUKG5leHRNb3ZlSW5kZXggPD0gbV9h
Y3RpdmVNb3Zlcy5zaXplKCkpOworICAgICAgICBtX2FjdGl2ZU1vdmVzLmVuc3VyZVNpemUobmV4
dE1vdmVJbmRleCArIDEpOworCisgICAgICAgIG1fbW92ZUxpc3RbbGVmdEluZGV4XS5hZGQobmV4
dE1vdmVJbmRleCk7CisgICAgICAgIG1fbW92ZUxpc3RbcmlnaHRJbmRleF0uYWRkKG5leHRNb3Zl
SW5kZXgpOworICAgIH0KKworICAgIHZvaWQgYnVpbGQoKQorICAgIHsKKyAgICAgICAgVG1wTGl2
ZW5lc3M8dHlwZT4gbGl2ZW5lc3MobV9jb2RlKTsKKyAgICAgICAgZm9yIChCYXNpY0Jsb2NrKiBi
bG9jayA6IG1fY29kZSkgeworICAgICAgICAgICAgdHlwZW5hbWUgVG1wTGl2ZW5lc3M8dHlwZT46
OkxvY2FsQ2FsYyBsb2NhbENhbGMobGl2ZW5lc3MsIGJsb2NrKTsKKyAgICAgICAgICAgIGZvciAo
dW5zaWduZWQgaW5zdEluZGV4ID0gYmxvY2stPnNpemUoKTsgaW5zdEluZGV4LS07KSB7CisgICAg
ICAgICAgICAgICAgSW5zdCYgaW5zdCA9IGJsb2NrLT5hdChpbnN0SW5kZXgpOworICAgICAgICAg
ICAgICAgIEluc3QqIG5leHRJbnN0ID0gYmxvY2stPmdldChpbnN0SW5kZXggKyAxKTsKKyAgICAg
ICAgICAgICAgICBidWlsZCgmaW5zdCwgbmV4dEluc3QsIGxvY2FsQ2FsYyk7CisgICAgICAgICAg
ICAgICAgbG9jYWxDYWxjLmV4ZWN1dGUoaW5zdEluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIGJ1aWxkKG51bGxwdHIsICZibG9jay0+YXQoMCksIGxvY2FsQ2FsYyk7CisgICAgICAg
IH0KKyAgICAgICAgYnVpbGRMb3dQcmlvcml0eU1vdmVMaXN0KCk7CisgICAgfQorCisgICAgdm9p
ZCBidWlsZChJbnN0KiBwcmV2SW5zdCwgSW5zdCogbmV4dEluc3QsIGNvbnN0IHR5cGVuYW1lIFRt
cExpdmVuZXNzPHR5cGU+OjpMb2NhbENhbGMmIGxvY2FsQ2FsYykKKyAgICB7CisgICAgICAgIGlm
ICh0cmFjZURlYnVnKQorICAgICAgICAgICAgZGF0YUxvZygiQnVpbGRpbmcgYmV0d2VlbiAiLCBw
b2ludGVyRHVtcChwcmV2SW5zdCksICIgYW5kICIsIHBvaW50ZXJEdW1wKG5leHRJbnN0KSwgIjpc
biIpOworICAgICAgICBJbnN0Ojpmb3JFYWNoRGVmV2l0aEV4dHJhQ2xvYmJlcmVkUmVnczxUbXA+
KAorICAgICAgICAgICAgcHJldkluc3QsIG5leHRJbnN0LAorICAgICAgICAgICAgWyZdIChjb25z
dCBUbXAmIGFyZywgQXJnOjpSb2xlLCBBcmc6OlR5cGUgYXJnVHlwZSwgQXJnOjpXaWR0aCkgewor
ICAgICAgICAgICAgICAgIGlmIChhcmdUeXBlICE9IHR5cGUpCisgICAgICAgICAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBBbGwgdGhlIERl
ZigpcyBpbnRlcmZlcmUgd2l0aCBlYWNoIG90aGVyIGFuZCB3aXRoIGFsbCB0aGUgZXh0cmEgY2xv
YmJlcmVkIFRtcHMuCisgICAgICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIG5vdCB1c2UgZm9yRWFj
aERlZldpdGhFeHRyYUNsb2JiZXJlZFJlZ3MoKSBoZXJlIHNpbmNlIGNvbG9yZWQgVG1wcworICAg
ICAgICAgICAgICAgIC8vIGRvIG5vdCBuZWVkIGludGVyZmVyZW5jZSBlZGdlcyBpbiBvdXIgaW1w
bGVtZW50YXRpb24uCisgICAgICAgICAgICAgICAgSW5zdDo6Zm9yRWFjaERlZjxUbXA+KAorICAg
ICAgICAgICAgICAgICAgICBwcmV2SW5zdCwgbmV4dEluc3QsCisgICAgICAgICAgICAgICAgICAg
IFsmXSAoVG1wJiBvdGhlckFyZywgQXJnOjpSb2xlLCBBcmc6OlR5cGUgYXJnVHlwZSwgQXJnOjpX
aWR0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ1R5cGUgIT0gdHlwZSkKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAg
ICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICBBZGRpbmcgZGVmLWRlZiBlZGdlOiAiLCBhcmcs
ICIsICIsIG90aGVyQXJnLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPmFk
ZEVkZ2UoYXJnLCBvdGhlckFyZyk7CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAg
ICAgfSk7CisKKyAgICAgICAgaWYgKHByZXZJbnN0ICYmIG1heUJlQ29hbGVzY2FibGUoKnByZXZJ
bnN0KSkgeworICAgICAgICAgICAgLy8gV2UgZG8gbm90IHdhbnQgdGhlIFVzZSgpIG9mIHRoaXMg
bW92ZSB0byBpbnRlcmZlcmUgd2l0aCB0aGUgRGVmKCksIGV2ZW4gaWYgaXQgaXMgbGl2ZQorICAg
ICAgICAgICAgLy8gYWZ0ZXIgdGhlIE1vdmUuIElmIHdlIHdlcmUgdG8gYWRkIHRoZSBpbnRlcmZl
cmVuY2UgZWRnZSwgaXQgd291bGQgYmUgaW1wb3NzaWJsZSB0bworICAgICAgICAgICAgLy8gY29h
bGVzY2UgdGhlIE1vdmUgZXZlbiBpZiB0aGUgdHdvIFRtcCBuZXZlciBpbnRlcmZlcmUgYW55d2hl
cmUuCisgICAgICAgICAgICBUbXAgZGVmVG1wOworICAgICAgICAgICAgVG1wIHVzZVRtcDsKKyAg
ICAgICAgICAgIHByZXZJbnN0LT5mb3JFYWNoVG1wKFsmZGVmVG1wLCAmdXNlVG1wXSAoVG1wJiBh
cmdUbXAsIEFyZzo6Um9sZSByb2xlLCBBcmc6OlR5cGUsIEFyZzo6V2lkdGgpIHsKKyAgICAgICAg
ICAgICAgICBpZiAoQXJnOjppc0xhdGVEZWYocm9sZSkpCisgICAgICAgICAgICAgICAgICAgIGRl
ZlRtcCA9IGFyZ1RtcDsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAg
ICAgQVNTRVJUKEFyZzo6aXNFYXJseVVzZShyb2xlKSk7CisgICAgICAgICAgICAgICAgICAgIHVz
ZVRtcCA9IGFyZ1RtcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAg
ICAgICAgIEFTU0VSVChkZWZUbXApOworICAgICAgICAgICAgQVNTRVJUKHVzZVRtcCk7CisKKyAg
ICAgICAgICAgIHVuc2lnbmVkIG5leHRNb3ZlSW5kZXggPSBtX2NvYWxlc2NpbmdDYW5kaWRhdGVz
LnNpemUoKTsKKyAgICAgICAgICAgIG1fY29hbGVzY2luZ0NhbmRpZGF0ZXMuYXBwZW5kKHsgQWJz
b2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodXNlVG1wKSwgQWJzb2x1dGVUbXBN
YXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgoZGVmVG1wKSB9KTsKKworICAgICAgICAgICAgdW5z
aWduZWQgbmV3SW5kZXhJbldvcmtsaXN0ID0gbV93b3JrbGlzdE1vdmVzLmFkZE1vdmUoKTsKKyAg
ICAgICAgICAgIEFTU0VSVF9VTlVTRUQobmV3SW5kZXhJbldvcmtsaXN0LCBuZXdJbmRleEluV29y
a2xpc3QgPT0gbmV4dE1vdmVJbmRleCk7CisKKyAgICAgICAgICAgIEFTU0VSVChuZXh0TW92ZUlu
ZGV4IDw9IG1fYWN0aXZlTW92ZXMuc2l6ZSgpKTsKKyAgICAgICAgICAgIG1fYWN0aXZlTW92ZXMu
ZW5zdXJlU2l6ZShuZXh0TW92ZUluZGV4ICsgMSk7CisKKyAgICAgICAgICAgIGZvciAoY29uc3Qg
QXJnJiBhcmcgOiBwcmV2SW5zdC0+YXJncykgeworICAgICAgICAgICAgICAgIGF1dG8mIGxpc3Qg
PSBtX21vdmVMaXN0W0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KGFyZy50
bXAoKSldOworICAgICAgICAgICAgICAgIGxpc3QuYWRkKG5leHRNb3ZlSW5kZXgpOworICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGNvbnN0IFRtcCYgbGl2ZVRtcCA6IGxvY2FsQ2Fs
Yy5saXZlKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobGl2ZVRtcCAhPSB1c2VUbXApIHsKKyAg
ICAgICAgICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpCisgICAgICAgICAgICAgICAgICAgICAg
ICBkYXRhTG9nKCIgICAgQWRkaW5nIGRlZi1saXZlIGZvciBjb2FsZXNjYWJsZTogIiwgZGVmVG1w
LCAiLCAiLCBsaXZlVG1wLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkRWRnZShkZWZU
bXAsIGxpdmVUbXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgLy8gVGhlIG5leHQgaW5zdHJ1Y3Rpb24gY291bGQgaGF2ZSBlYXJseSBjbG9iYmVycyBv
ciBlYXJseSBkZWYncy4gV2UgbmVlZCB0byBjb25zaWRlcgorICAgICAgICAgICAgLy8gdGhvc2Ug
bm93LgorICAgICAgICAgICAgYWRkRWRnZXMobnVsbHB0ciwgbmV4dEluc3QsIGxvY2FsQ2FsYy5s
aXZlKCkpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGFkZEVkZ2VzKHByZXZJbnN0LCBu
ZXh0SW5zdCwgbG9jYWxDYWxjLmxpdmUoKSk7CisgICAgfQorCisgICAgdm9pZCBidWlsZExvd1By
aW9yaXR5TW92ZUxpc3QoKQorICAgIHsKKyAgICAgICAgaWYgKCFpc1g4NigpKQorICAgICAgICAg
ICAgcmV0dXJuOworCisgICAgICAgIG1fd29ya2xpc3RNb3Zlcy5zdGFydEFkZGluZ0xvd1ByaW9y
aXR5TW92ZXMoKTsKKyAgICAgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6IG1fY29kZSkgewor
ICAgICAgICAgICAgZm9yIChJbnN0JiBpbnN0IDogKmJsb2NrKSB7CisgICAgICAgICAgICAgICAg
aWYgKHN0ZDo6b3B0aW9uYWw8dW5zaWduZWQ+IGRlZkFyZ0luZGV4ID0gaW5zdC5zaG91bGRUcnlB
bGlhc2luZ0RlZigpKSB7CisgICAgICAgICAgICAgICAgICAgIEFyZyBvcDEgPSBpbnN0LmFyZ3Nb
KmRlZkFyZ0luZGV4IC0gMl07CisgICAgICAgICAgICAgICAgICAgIEFyZyBvcDIgPSBpbnN0LmFy
Z3NbKmRlZkFyZ0luZGV4IC0gMV07CisgICAgICAgICAgICAgICAgICAgIEFyZyBkZXN0ID0gaW5z
dC5hcmdzWypkZWZBcmdJbmRleF07CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9wMSA9PSBk
ZXN0IHx8IG9wMiA9PSBkZXN0KQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisK
KyAgICAgICAgICAgICAgICAgICAgaWYgKG1heUJlQ29hbGVzY2VkKG9wMSwgZGVzdCkpCisgICAg
ICAgICAgICAgICAgICAgICAgICBhZGRUb0xvd1ByaW9yaXR5Q29hbGVzY2luZ0NhbmRpZGF0ZXMo
b3AxLCBkZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9wMSAhPSBvcDIgJiYgbWF5QmVD
b2FsZXNjZWQob3AyLCBkZXN0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZFRvTG93UHJp
b3JpdHlDb2FsZXNjaW5nQ2FuZGlkYXRlcyhvcDIsIGRlc3QpOworICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgYWRkRWRnZXMoSW5z
dCogcHJldkluc3QsIEluc3QqIG5leHRJbnN0LCB0eXBlbmFtZSBUbXBMaXZlbmVzczx0eXBlPjo6
TG9jYWxDYWxjOjpJdGVyYWJsZSBsaXZlVG1wcykKKyAgICB7CisgICAgICAgIC8vIEFsbCB0aGUg
RGVmKClzIGludGVyZmVyZSB3aXRoIGV2ZXJ0aGluZyBsaXZlLgorICAgICAgICBJbnN0Ojpmb3JF
YWNoRGVmV2l0aEV4dHJhQ2xvYmJlcmVkUmVnczxUbXA+KAorICAgICAgICAgICAgcHJldkluc3Qs
IG5leHRJbnN0LAorICAgICAgICAgICAgWyZdIChjb25zdCBUbXAmIGFyZywgQXJnOjpSb2xlLCBB
cmc6OlR5cGUgYXJnVHlwZSwgQXJnOjpXaWR0aCkgeworICAgICAgICAgICAgICAgIGlmIChhcmdU
eXBlICE9IHR5cGUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAg
ICAKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFRtcCYgbGl2ZVRtcCA6IGxpdmVUbXBzKSB7
CisgICAgICAgICAgICAgICAgICAgIEFTU0VSVChsaXZlVG1wLmlzR1AoKSA9PSAodHlwZSA9PSBB
cmc6OkdQKSk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAo
dHJhY2VEZWJ1ZykKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICBBZGRpbmcg
ZGVmLWxpdmUgZWRnZTogIiwgYXJnLCAiLCAiLCBsaXZlVG1wLCAiXG4iKTsKKyAgICAgICAgICAg
ICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGFkZEVkZ2UoYXJnLCBsaXZlVG1wKTsKKyAg
ICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBBcmc6OkdQICYm
ICFhcmcuaXNHUFIoKSkKKyAgICAgICAgICAgICAgICAgICAgbV9pbnRlcmZlcmVzV2l0aEZyYW1l
UG9pbnRlci5xdWlja1NldChBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChh
cmcpKTsKKyAgICAgICAgICAgIH0pOworICAgIH0KKworICAgIHZvaWQgYWRkRWRnZShUbXAgYSwg
VG1wIGIpCisgICAgeworICAgICAgICBBU1NFUlRfV0lUSF9NRVNTQUdFKGEuaXNHUCgpID09IGIu
aXNHUCgpLCAiQW4gaW50ZXJmZXJlbmNlIGJldHdlZW4gcmVnaXN0ZXJzIG9mIGRpZmZlcmVudCB0
eXBlcyBkb2VzIG5vdCBtYWtlIHNlbnNlLCBpdCBjYW4gbGVhZCB0byBub24tY29sb3JhYmxlIGdy
YXBocy4iKTsKKworICAgICAgICBhZGRFZGdlKEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNv
bHV0ZUluZGV4KGEpLCBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChiKSk7
CisgICAgfQorCisgICAgLy8gQ2FsbGluZyB0aGlzIHdpdGhvdXQgYSB0bXBXaWR0aCB3aWxsIHBl
cmZvcm0gYSBtb3JlIGNvbnNlcnZhdGl2ZSBjb2FsZXNjaW5nIGFuYWx5c2lzIHRoYXQgYXNzdW1l
cworICAgIC8vIHRoYXQgTW92ZTMyJ3MgYXJlIG5vdCBjb2FsZXNjYWJsZS4KKyAgICBzdGF0aWMg
Ym9vbCBtYXlCZUNvYWxlc2NhYmxlSW1wbChjb25zdCBJbnN0JiBpbnN0LCBUbXBXaWR0aCogdG1w
V2lkdGgpCisgICAgeworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBBcmc6
OkdQOgorICAgICAgICAgICAgc3dpdGNoIChpbnN0LmtpbmQub3Bjb2RlKSB7CisgICAgICAgICAg
ICBjYXNlIE1vdmU6CisgICAgICAgICAgICBjYXNlIE1vdmUzMjoKKyAgICAgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQXJnOjpG
UDoKKyAgICAgICAgICAgIHN3aXRjaCAoaW5zdC5raW5kLm9wY29kZSkgeworICAgICAgICAgICAg
Y2FzZSBNb3ZlRmxvYXQ6CisgICAgICAgICAgICBjYXNlIE1vdmVEb3VibGU6CisgICAgICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisK
KyAgICAgICAgQVNTRVJUX1dJVEhfTUVTU0FHRShpbnN0LmFyZ3Muc2l6ZSgpID09IDIsICJXZSBh
c3N1bWUgY29hbGVjYWJsZSBtb3ZlcyBvbmx5IGhhdmUgdHdvIGFyZ3VtZW50cyBpbiBhIGZldyBw
bGFjZXMuIik7CisKKyAgICAgICAgaWYgKCFpbnN0LmFyZ3NbMF0uaXNUbXAoKSB8fCAhaW5zdC5h
cmdzWzFdLmlzVG1wKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgQVNT
RVJUKGluc3QuYXJnc1swXS50eXBlKCkgPT0gdHlwZSk7CisgICAgICAgIEFTU0VSVChpbnN0LmFy
Z3NbMV0udHlwZSgpID09IHR5cGUpOworCisgICAgICAgIC8vIFdlIGNhbiBjb2FsZXNjZSBhIE1v
dmUzMiBzbyBsb25nIGFzIGVpdGhlciBvZiB0aGUgZm9sbG93aW5nIGhvbGRzOgorICAgICAgICAv
LyAtIFRoZSBpbnB1dCBpcyBhbHJlYWR5IHplcm8tZmlsbGVkLgorICAgICAgICAvLyAtIFRoZSBv
dXRwdXQgb25seSBjYXJlcyBhYm91dCB0aGUgbG93IDMyIGJpdHMuCisgICAgICAgIC8vCisgICAg
ICAgIC8vIE5vdGUgdGhhdCB0aGUgaW5wdXQgcHJvcGVydHkgcmVxdWlyZXMgYW4gYW5hbHlzaXMg
b3ZlciBaRGVmJ3MsIHNvIGl0J3Mgb25seSB2YWxpZCBzbyBsb25nCisgICAgICAgIC8vIGFzIHRo
ZSBpbnB1dCBnZXRzIGEgcmVnaXN0ZXIuIFdlIGRvbid0IGtub3cgaWYgdGhlIGlucHV0IGdldHMg
YSByZWdpc3RlciwgYnV0IHdlIGRvIGtub3cKKyAgICAgICAgLy8gdGhhdCBpZiBpdCBkb2Vzbid0
IGdldCBhIHJlZ2lzdGVyIHRoZW4gd2Ugd2lsbCBzdGlsbCBlbWl0IHRoaXMgTW92ZTMyLgorICAg
ICAgICBpZiAoaW5zdC5raW5kLm9wY29kZSA9PSBNb3ZlMzIpIHsKKyAgICAgICAgICAgIGlmICgh
dG1wV2lkdGgpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBp
ZiAodG1wV2lkdGgtPmRlZldpZHRoKGluc3QuYXJnc1swXS50bXAoKSkgPiBBcmc6OldpZHRoMzIK
KyAgICAgICAgICAgICAgICAmJiB0bXBXaWR0aC0+dXNlV2lkdGgoaW5zdC5hcmdzWzFdLnRtcCgp
KSA+IEFyZzo6V2lkdGgzMikKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
IH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHZvaWQgc2Vs
ZWN0U3BpbGwoKQorICAgIHsKKyAgICAgICAgaWYgKCFtX2hhc1NlbGVjdGVkU3BpbGwpIHsKKyAg
ICAgICAgICAgIG1faGFzU2VsZWN0ZWRTcGlsbCA9IHRydWU7CisKKyAgICAgICAgICAgIGlmICht
X2hhc0NvYWxlc2NlZE5vblRyaXZpYWxNb3ZlKQorICAgICAgICAgICAgICAgIG1fY29hbGVzY2Vk
VG1wc0F0U3BpbGwgPSBtX2NvYWxlc2NlZFRtcHM7CisgICAgICAgIH0KKworICAgICAgICBhdXRv
IGl0ZXJhdG9yID0gbV9zcGlsbFdvcmtsaXN0LmJlZ2luKCk7CisKKyAgICAgICAgUkVMRUFTRV9B
U1NFUlRfV0lUSF9NRVNTQUdFKGl0ZXJhdG9yICE9IG1fc3BpbGxXb3JrbGlzdC5lbmQoKSwgInNl
bGVjdFNwaWxsKCkgY2FsbGVkIHdoZW4gdGhlcmUgd2FzIG5vIHNwaWxsLiIpOworICAgICAgICBS
RUxFQVNFX0FTU0VSVF9XSVRIX01FU1NBR0UoIW1fdW5zcGlsbGFibGVUbXBzLmNvbnRhaW5zKCpp
dGVyYXRvciksICJ0cnlpbmcgdG8gc3BpbGwgdW5zcGlsbGFibGUgdG1wIik7CisKKyAgICAgICAg
Ly8gSGlnaGVyIHNjb3JlIG1lYW5zIG1vcmUgZGVzaXJhYmxlIHRvIHNwaWxsLiBMb3dlciBzY29y
ZXMgbWF4aW1pemUgdGhlIGxpa2VsaWhvb2QgdGhhdCBhIHRtcAorICAgICAgICAvLyBnZXRzIGEg
cmVnaXN0ZXIuCisgICAgICAgIGF1dG8gc2NvcmUgPSBbJl0gKFRtcCB0bXApIC0+IGRvdWJsZSB7
CisgICAgICAgICAgICAvLyBBaXIgZXhwb3NlcyB0aGUgY29uY2VwdCBvZiAiZmFzdCB0bXBzIiwg
YW5kIHdlIGludGVycHJldCB0aGF0IHRvIG1lYW4gdGhhdCB0aGUgdG1wCisgICAgICAgICAgICAv
LyBzaG91bGQgYWx3YXlzIGJlIGluIGEgcmVnaXN0ZXIuCisgICAgICAgICAgICBpZiAobV9jb2Rl
LmlzRmFzdFRtcCh0bXApKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAg
CisgICAgICAgICAgICAvLyBBbGwgZWxzZSBiZWluZyBlcXVhbCwgdGhlIHNjb3JlIHNob3VsZCBi
ZSBkaXJlY3RseSByZWxhdGVkIHRvIHRoZSBkZWdyZWUuCisgICAgICAgICAgICBkb3VibGUgZGVn
cmVlID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihtX2RlZ3JlZXNbQWJzb2x1dGVUbXBNYXBwZXI8dHlw
ZT46OmFic29sdXRlSW5kZXgodG1wKV0pOworCisgICAgICAgICAgICAvLyBBbGwgZWxzZSBiZWlu
ZyBlcXVhbCwgdGhlIHNjb3JlIHNob3VsZCBiZSBpbnZlcnNlbHkgcmVsYXRlZCB0byB0aGUgbnVt
YmVyIG9mIHdhcm0gdXNlcyBhbmQKKyAgICAgICAgICAgIC8vIGRlZnMuCisgICAgICAgICAgICBj
b25zdCBVc2VDb3VudHM8VG1wPjo6Q291bnRzKiBjb3VudHMgPSBtX3VzZUNvdW50c1t0bXBdOwor
ICAgICAgICAgICAgaWYgKCFjb3VudHMpCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bnVt
ZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKTsKKyAgICAgICAgICAgIAorICAgICAgICAg
ICAgZG91YmxlIHVzZXMgPSBjb3VudHMtPm51bVdhcm1Vc2VzICsgY291bnRzLT5udW1EZWZzOwor
CisgICAgICAgICAgICAvLyBJZiBpdCdzIGEgY29uc3RhbnQsIHRoZW4gaXQncyBub3QgYXMgYmFk
IHRvIHNwaWxsLiBXZSBjYW4gcmVtYXRlcmlhbGl6ZSBpdCBpbiBtYW55CisgICAgICAgICAgICAv
LyBjYXNlcy4KKyAgICAgICAgICAgIGlmIChjb3VudHMtPm51bUNvbnN0RGVmcyA9PSAxICYmIGNv
dW50cy0+bnVtRGVmcyA9PSAxKQorICAgICAgICAgICAgICAgIHVzZXMgLz0gMjsKKworICAgICAg
ICAgICAgcmV0dXJuIGRlZ3JlZSAvIHVzZXM7CisgICAgICAgIH07CisKKyAgICAgICAgYXV0byB2
aWN0aW1JdGVyYXRvciA9IGl0ZXJhdG9yOworICAgICAgICBkb3VibGUgbWF4U2NvcmUgPSBzY29y
ZShBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgoKml0ZXJhdG9y
KSk7CisKKyAgICAgICAgKytpdGVyYXRvcjsKKyAgICAgICAgZm9yICg7aXRlcmF0b3IgIT0gbV9z
cGlsbFdvcmtsaXN0LmVuZCgpOyArK2l0ZXJhdG9yKSB7CisgICAgICAgICAgICBkb3VibGUgdG1w
U2NvcmUgPSBzY29yZShBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5k
ZXgoKml0ZXJhdG9yKSk7CisgICAgICAgICAgICBpZiAodG1wU2NvcmUgPiBtYXhTY29yZSkgewor
ICAgICAgICAgICAgICAgIEFTU0VSVCghbV91bnNwaWxsYWJsZVRtcHMuY29udGFpbnMoKml0ZXJh
dG9yKSk7CisgICAgICAgICAgICAgICAgdmljdGltSXRlcmF0b3IgPSBpdGVyYXRvcjsKKyAgICAg
ICAgICAgICAgICBtYXhTY29yZSA9IHRtcFNjb3JlOworICAgICAgICAgICAgfQorICAgICAgICB9
CisKKyAgICAgICAgdW5zaWduZWQgdmljdGltSW5kZXggPSAqdmljdGltSXRlcmF0b3I7CisgICAg
ICAgIG1fc3BpbGxXb3JrbGlzdC5yZW1vdmUodmljdGltSXRlcmF0b3IpOworICAgICAgICBtX3Np
bXBsaWZ5V29ya2xpc3QuYXBwZW5kKHZpY3RpbUluZGV4KTsKKworICAgICAgICBmcmVlemVNb3Zl
cyh2aWN0aW1JbmRleCk7CisgICAgfQorCisgICAgdm9pZCBhbGxvY2F0ZSgpCisgICAgeworICAg
ICAgICBBU1NFUlRfV0lUSF9NRVNTQUdFKG1fYWN0aXZlTW92ZXMuc2l6ZSgpID49IG1fY29hbGVz
Y2luZ0NhbmRpZGF0ZXMuc2l6ZSgpLCAiVGhlIGFjdGl2ZU1vdmUgc2V0IHNob3VsZCBiZSBiaWcg
ZW5vdWdoIGZvciB0aGUgcXVpY2sgb3BlcmF0aW9ucyBvZiBCaXRWZWN0b3IuIik7CisKKyAgICAg
ICAgbWFrZVdvcmtMaXN0KCk7CisKKyAgICAgICAgaWYgKGRlYnVnKSB7CisgICAgICAgICAgICBk
YXRhTG9nKCJJbnRlcmZlcmVuY2U6ICIsIGxpc3REdW1wKG1faW50ZXJmZXJlbmNlRWRnZXMpLCAi
XG4iKTsKKyAgICAgICAgICAgIGR1bXBJbnRlcmZlcmVuY2VHcmFwaEluRG90KFdURjo6ZGF0YUZp
bGUoKSk7CisgICAgICAgICAgICBkYXRhTG9nKCJDb2FsZXNjaW5nIGNhbmRpZGF0ZXM6XG4iKTsK
KyAgICAgICAgICAgIGZvciAoTW92ZU9wZXJhbmRzJiBtb3ZlT3AgOiBtX2NvYWxlc2NpbmdDYW5k
aWRhdGVzKSB7CisgICAgICAgICAgICAgICAgZGF0YUxvZygiICAgICIsIEFic29sdXRlVG1wTWFw
cGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleChtb3ZlT3Auc3JjSW5kZXgpLAorICAgICAg
ICAgICAgICAgICAgICAiIC0+ICIsIEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJz
b2x1dGVJbmRleChtb3ZlT3AuZHN0SW5kZXgpLCAiXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIGRhdGFMb2coIkluaXRpYWwgd29yayBsaXN0XG4iKTsKKyAgICAgICAgICAgIGR1bXBX
b3JrTGlzdHMoV1RGOjpkYXRhRmlsZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGRvIHsKKyAg
ICAgICAgICAgIGlmICh0cmFjZURlYnVnKSB7CisgICAgICAgICAgICAgICAgZGF0YUxvZygiQmVm
b3JlIEdyYXBoIHNpbXBsaWZpY2F0aW9uIGl0ZXJhdGlvblxuIik7CisgICAgICAgICAgICAgICAg
ZHVtcFdvcmtMaXN0cyhXVEY6OmRhdGFGaWxlKCkpOworICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICBpZiAoIW1fc2ltcGxpZnlXb3JrbGlzdC5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAg
c2ltcGxpZnkoKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCFtX3dvcmtsaXN0TW92ZXMuaXNFbXB0
eSgpKQorICAgICAgICAgICAgICAgIGNvYWxlc2NlKCk7CisgICAgICAgICAgICBlbHNlIGlmICgh
bV9mcmVlemVXb3JrbGlzdC5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgZnJlZXplKCk7Cisg
ICAgICAgICAgICBlbHNlIGlmICghbV9zcGlsbFdvcmtsaXN0LmlzRW1wdHkoKSkKKyAgICAgICAg
ICAgICAgICBzZWxlY3RTcGlsbCgpOworCisgICAgICAgICAgICBpZiAodHJhY2VEZWJ1Zykgewor
ICAgICAgICAgICAgICAgIGRhdGFMb2coIkFmdGVyIEdyYXBoIHNpbXBsaWZpY2F0aW9uIGl0ZXJh
dGlvblxuIik7CisgICAgICAgICAgICAgICAgZHVtcFdvcmtMaXN0cyhXVEY6OmRhdGFGaWxlKCkp
OworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlICghbV9zaW1wbGlmeVdvcmtsaXN0Lmlz
RW1wdHkoKSB8fCAhbV93b3JrbGlzdE1vdmVzLmlzRW1wdHkoKSB8fCAhbV9mcmVlemVXb3JrbGlz
dC5pc0VtcHR5KCkgfHwgIW1fc3BpbGxXb3JrbGlzdC5pc0VtcHR5KCkpOworCisgICAgICAgIGFz
c2lnbkNvbG9ycygpOworICAgIH0KKworI2lmIFBMQVRGT1JNKENPQ09BKQorI3ByYWdtYSBtYXJr
IC0gRGVidWdnaW5nIGhlbHBlcnMuCisjZW5kaWYKKworICAgIHZvaWQgZHVtcEludGVyZmVyZW5j
ZUdyYXBoSW5Eb3QoUHJpbnRTdHJlYW0mIG91dCkKKyAgICB7CisgICAgICAgIG91dC5wcmludCgi
Z3JhcGggSW50ZXJmZXJlbmNlR3JhcGggeyBcbiIpOworCisgICAgICAgIEhhc2hTZXQ8VG1wPiB0
bXBzV2l0aEludGVyZmVyZW5jZXM7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgZWRnZSA6IG1f
aW50ZXJmZXJlbmNlRWRnZXMpIHsKKyAgICAgICAgICAgIHRtcHNXaXRoSW50ZXJmZXJlbmNlcy5h
ZGQoQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KGVkZ2UuZmly
c3QoKSkpOworICAgICAgICAgICAgdG1wc1dpdGhJbnRlcmZlcmVuY2VzLmFkZChBYnNvbHV0ZVRt
cE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgoZWRnZS5zZWNvbmQoKSkpOworICAg
ICAgICB9CisKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiB0bXAgOiB0bXBzV2l0aEludGVyZmVy
ZW5jZXMpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIHRtcEluZGV4ID0gQWJzb2x1dGVUbXBNYXBw
ZXI8dHlwZT46OmFic29sdXRlSW5kZXgodG1wKTsKKyAgICAgICAgICAgIGlmICh0bXBJbmRleCA8
IG1fZGVncmVlcy5zaXplKCkpCisgICAgICAgICAgICAgICAgb3V0LnByaW50KCIgICAgIiwgdG1w
LmludGVybmFsVmFsdWUoKSwgIiBbbGFiZWw9XCIiLCB0bXAsICIgKCIsIG1fZGVncmVlc1t0bXBJ
bmRleF0sICIpXCJdO1xuIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgb3V0
LnByaW50KCIgICAgIiwgdG1wLmludGVybmFsVmFsdWUoKSwgIiBbbGFiZWw9XCIiLCB0bXAsICJc
Il07XG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoY29uc3QgYXV0byYgZWRnZSA6IG1f
aW50ZXJmZXJlbmNlRWRnZXMpCisgICAgICAgICAgICBvdXQucHJpbnQoIiAgICAiLCBlZGdlLmZp
cnN0KCksICIgLS0gIiwgZWRnZS5zZWNvbmQoKSwgIjtcbiIpOworICAgICAgICBvdXQucHJpbnQo
In1cbiIpOworICAgIH0KKworICAgIHZvaWQgZHVtcFdvcmtMaXN0cyhQcmludFN0cmVhbSYgb3V0
KQorICAgIHsKKyAgICAgICAgb3V0LnByaW50KCJTaW1wbGlmeSB3b3JrIGxpc3Q6XG4iKTsKKyAg
ICAgICAgZm9yICh1bnNpZ25lZCB0bXBJbmRleCA6IG1fc2ltcGxpZnlXb3JrbGlzdCkKKyAgICAg
ICAgICAgIG91dC5wcmludCgiICAgICIsIEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9t
QWJzb2x1dGVJbmRleCh0bXBJbmRleCksICJcbiIpOworICAgICAgICBvdXQucHJpbnRmKCJNb3Zl
cyB3b3JrIGxpc3QgaXMgZW1wdHk/ICVkXG4iLCBtX3dvcmtsaXN0TW92ZXMuaXNFbXB0eSgpKTsK
KyAgICAgICAgb3V0LnByaW50KCJGcmVlemUgd29yayBsaXN0OlxuIik7CisgICAgICAgIGZvciAo
dW5zaWduZWQgdG1wSW5kZXggOiBtX2ZyZWV6ZVdvcmtsaXN0KQorICAgICAgICAgICAgb3V0LnBy
aW50KCIgICAgIiwgQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4
KHRtcEluZGV4KSwgIlxuIik7CisgICAgICAgIG91dC5wcmludCgiU3BpbGwgd29yayBsaXN0Olxu
Iik7CisgICAgICAgIGZvciAodW5zaWduZWQgdG1wSW5kZXggOiBtX3NwaWxsV29ya2xpc3QpCisg
ICAgICAgICAgICBvdXQucHJpbnQoIiAgICAiLCBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1w
RnJvbUFic29sdXRlSW5kZXgodG1wSW5kZXgpLCAiXG4iKTsKKyAgICB9CisKKyAgICB1c2luZyBB
YnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yPHVuc2lnbmVkPjo6YWRkRWRnZTsKKyAgICB1c2luZyBB
YnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yPHVuc2lnbmVkPjo6Z2V0QWxpYXM7CisKKyAgICBDb2Rl
JiBtX2NvZGU7CisgICAgVG1wV2lkdGgmIG1fdG1wV2lkdGg7CisgICAgLy8gRklYTUU6IHNwaWxs
aW5nIHNob3VsZCBub3QgdHlwZSBzcGVjaWZpYy4gSXQgaXMgb25seSBhIHNpZGUgZWZmZWN0IG9m
IHVzaW5nIFVzZUNvdW50cy4KKyAgICBjb25zdCBVc2VDb3VudHM8VG1wPiYgbV91c2VDb3VudHM7
Cit9OworCitjbGFzcyBJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZyB7CitwdWJsaWM6CisgICAg
SXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcoQ29kZSYgY29kZSkKKyAgICAgICAgOiBtX2NvZGUo
Y29kZSkKKyAgICAgICAgLCBtX3VzZUNvdW50cyhjb2RlKQorICAgIHsKKyAgICB9CisKKyAgICB2
b2lkIHJ1bigpCisgICAgeworICAgICAgICBwYWRJbnRlcmZlcmVuY2UobV9jb2RlKTsKKyAgICAg
ICAgCisgICAgICAgIGl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nT25UeXBlPEFyZzo6R1A+KCk7
CisgICAgICAgIGl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nT25UeXBlPEFyZzo6RlA+KCk7CisK
KyAgICAgICAgZml4U3BpbGxzQWZ0ZXJUZXJtaW5hbHMoKTsKKworICAgICAgICBpZiAocmVwb3J0
U3RhdHMpCisgICAgICAgICAgICBkYXRhTG9nKCJOdW0gaXRlcmF0aW9ucyA9ICIsIG1fbnVtSXRl
cmF0aW9ucywgIlxuIik7CisgICAgfQorCitwcml2YXRlOgorICAgIHRlbXBsYXRlPEFyZzo6VHlw
ZSB0eXBlPgorICAgIHZvaWQgaXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmdPblR5cGUoKQorICAg
IHsKKyAgICAgICAgSGFzaFNldDx1bnNpZ25lZD4gdW5zcGlsbGFibGVUbXBzID0gY29tcHV0ZVVu
c3BpbGxhYmxlVG1wczx0eXBlPigpOworCisgICAgICAgIC8vIEZJWE1FOiBJZiBhIFRtcCBpcyB1
c2VkIG9ubHkgZnJvbSBhIFNjcmF0Y2ggcm9sZSBhbmQgdGhhdCBhcmd1bWVudCBpcyAhYWRtaXRz
U3RhY2ssIHRoZW4KKyAgICAgICAgLy8gd2Ugc2hvdWxkIGFkZCB0aGUgVG1wIHRvIHVuc3BpbGxh
YmxlVG1wcy4gVGhhdCB3aWxsIGhlbHAgYXZvaWQgcmVsb29waW5nIG9ubHkgdG8gdHVybiB0aGUK
KyAgICAgICAgLy8gVG1wIGludG8gYW4gdW5zcGlsbGFibGUgVG1wLgorICAgICAgICAvLyBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTUyNjk5CisgICAgICAgIAorICAg
ICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgKyttX251bUl0ZXJhdGlvbnM7CisKKyAg
ICAgICAgICAgIGlmICh0cmFjZURlYnVnKQorICAgICAgICAgICAgICAgIGRhdGFMb2coIkNvZGUg
YXQgaXRlcmF0aW9uICIsIG1fbnVtSXRlcmF0aW9ucywgIjpcbiIsIG1fY29kZSk7CisKKyAgICAg
ICAgICAgIC8vIEZJWE1FOiBPbmUgd2F5IHRvIG9wdGltaXplIHRoaXMgY29kZSBpcyB0byByZW1v
dmUgdGhlIHJlY29tcHV0YXRpb24gaW5zaWRlIHRoZSBmaXhwb2ludC4KKyAgICAgICAgICAgIC8v
IFdlIG5lZWQgdG8gcmVjb21wdXRlIGJlY2F1c2Ugc3BpbGxpbmcgYWRkcyB0bXBzLCBidXQgd2Ug
Y291bGQganVzdCB1cGRhdGUgdG1wV2lkdGggd2hlbiB3ZQorICAgICAgICAgICAgLy8gYWRkIHRo
b3NlIHRtcHMuIE5vdGUgdGhhdCBvbmUgZWFzeSB3YXkgdG8gcmVtb3ZlIHRoZSByZWNvbXB1dGF0
aW9uIGlzIHRvIG1ha2UgYW55IG5ld2x5CisgICAgICAgICAgICAvLyBhZGRlZCBUbXBzIGdldCB0
aGUgc2FtZSB1c2UvZGVmIHdpZHRocyB0aGF0IHRoZSBvcmlnaW5hbCBUbXAgZ290LiBCdXQsIHRo
aXMgbWF5IGh1cnQgdGhlCisgICAgICAgICAgICAvLyBzcGlsbCBjb2RlIHdlIGVtaXQuIFNpbmNl
IHdlIGN1cnJlbnRseSByZWNvbXB1dGUgVG1wV2lkdGggYWZ0ZXIgc3BpbGxpbmcsIHRoZSBuZXds
eQorICAgICAgICAgICAgLy8gY3JlYXRlZCBUbXBzIG1heSBnZXQgbmFycm93ZXIgdXNlL2RlZiB3
aWR0aHMuIE9uIHRoZSBvdGhlciBoYW5kLCB0aGUgc3BpbGxlciBhbHJlYWR5CisgICAgICAgICAg
ICAvLyBzZWxlY3RzIHdoaWNoIG1vdmUgaW5zdHJ1Y3Rpb24gdG8gdXNlIGJhc2VkIG9uIHRoZSBv
cmlnaW5hbCBUbXAncyB3aWR0aHMsIHNvIGl0IG1heSBub3QKKyAgICAgICAgICAgIC8vIG1hdHRl
ciB0aGFuIGEgc3Vic2VxdWVudCBpdGVyYXRpb24gc2VlcyBhIGNvc2VydmF0aXZlIHdpZHRoIGZv
ciB0aGUgbmV3IFRtcHMuIEFsc28sIHRoZQorICAgICAgICAgICAgLy8gcmVjb21wdXRhdGlvbiBt
YXkgbm90IGFjdHVhbGx5IGJlIGEgcGVyZm9ybWFuY2UgcHJvYmxlbTsgaXQncyBsaWtlbHkgdGhh
dCBhIGJldHRlciB3YXkgdG8KKyAgICAgICAgICAgIC8vIGltcHJvdmUgcGVyZm9ybWFuY2Ugb2Yg
VG1wV2lkdGggaXMgdG8gcmVwbGFjZSBpdHMgSGFzaE1hcCB3aXRoIHNvbWV0aGluZyBlbHNlLiBJ
dCdzCisgICAgICAgICAgICAvLyBwb3NzaWJsZSB0aGF0IG1vc3Qgb2YgdGhlIFRtcFdpZHRoIG92
ZXJoZWFkIGlzIGZyb20gcXVlcmllcyBvZiBUbXBXaWR0aCByYXRoZXIgdGhhbiB0aGUKKyAgICAg
ICAgICAgIC8vIHJlY29tcHV0YXRpb24sIGluIHdoaWNoIGNhc2Ugc3BlZWRpbmcgdXAgdGhlIGxv
b2t1cCB3b3VsZCBiZSBhIGJpZ2dlciB3aW4uCisgICAgICAgICAgICAvLyBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTUyNDc4CisgICAgICAgICAgICBtX3RtcFdpZHRo
LnJlY29tcHV0ZShtX2NvZGUpOworICAgICAgICAgICAgCisgICAgICAgICAgICBDb2xvcmluZ0Fs
bG9jYXRvcjx0eXBlPiBhbGxvY2F0b3IobV9jb2RlLCBtX3RtcFdpZHRoLCBtX3VzZUNvdW50cywg
dW5zcGlsbGFibGVUbXBzKTsKKyAgICAgICAgICAgIGlmICghYWxsb2NhdG9yLnJlcXVpcmVzU3Bp
bGxpbmcoKSkgeworICAgICAgICAgICAgICAgIGFzc2lnblJlZ2lzdGVyc1RvVG1wKGFsbG9jYXRv
cik7CisgICAgICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpCisgICAgICAgICAgICAgICAgICAg
IGRhdGFMb2coIlN1Y2Nlc3NmdWxsIGFsbG9jYXRpb24gYXQgaXRlcmF0aW9uICIsIG1fbnVtSXRl
cmF0aW9ucywgIjpcbiIsIG1fY29kZSk7CisKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgICAgICB9CisgICAgICAgICAgICBhZGRTcGlsbEFuZEZpbGw8dHlwZT4oYWxsb2NhdG9yLCB1
bnNwaWxsYWJsZVRtcHMpOworICAgICAgICB9CisgICAgfQorCisgICAgdGVtcGxhdGU8QXJnOjpU
eXBlIHR5cGU+CisgICAgSGFzaFNldDx1bnNpZ25lZD4gY29tcHV0ZVVuc3BpbGxhYmxlVG1wcygp
CisgICAgeworICAgICAgICBIYXNoU2V0PHVuc2lnbmVkPiB1bnNwaWxsYWJsZVRtcHM7CisKKyAg
ICAgICAgc3RydWN0IFJhbmdlIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGZpcnN0IHsgc3RkOjpu
dW1lcmljX2xpbWl0czx1bnNpZ25lZD46Om1heCgpIH07CisgICAgICAgICAgICB1bnNpZ25lZCBs
YXN0IHsgMCB9OworICAgICAgICAgICAgdW5zaWduZWQgY291bnQgeyAwIH07CisgICAgICAgICAg
ICB1bnNpZ25lZCBhZG1pdFN0YWNrQ291bnQgeyAwIH07CisgICAgICAgIH07CisKKyAgICAgICAg
dW5zaWduZWQgbnVtVG1wcyA9IG1fY29kZS5udW1UbXBzKHR5cGUpOworICAgICAgICB1bnNpZ25l
ZCBhcnJheVNpemUgPSBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChudW1U
bXBzKTsKKworICAgICAgICBWZWN0b3I8UmFuZ2UsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBy
YW5nZXM7CisgICAgICAgIHJhbmdlcy5maWxsKFJhbmdlKCksIGFycmF5U2l6ZSk7CisKKyAgICAg
ICAgdW5zaWduZWQgZ2xvYmFsSW5kZXggPSAwOworICAgICAgICBmb3IgKEJhc2ljQmxvY2sqIGJs
b2NrIDogbV9jb2RlKSB7CisgICAgICAgICAgICBmb3IgKEluc3QmIGluc3QgOiAqYmxvY2spIHsK
KyAgICAgICAgICAgICAgICBpbnN0LmZvckVhY2hBcmcoWyZdIChBcmcmIGFyZywgQXJnOjpSb2xl
LCBBcmc6OlR5cGUgYXJnVHlwZSwgQXJnOjpXaWR0aCkgeworICAgICAgICAgICAgICAgICAgICBp
ZiAoYXJnLmlzVG1wKCkgJiYgaW5zdC5hZG1pdHNTdGFjayhhcmcpKSB7CisgICAgICAgICAgICAg
ICAgICAgICAgICBpZiAoYXJnVHlwZSAhPSB0eXBlKQorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHJldHVybjsKKworICAgICAgICAgICAgICAgICAgICAgICAgVG1wIHRtcCA9IGFyZy50bXAo
KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJhbmdlJiByYW5nZSA9IHJhbmdlc1tBYnNvbHV0
ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh0bXApXTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIHJhbmdlLmNvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICByYW5nZS5hZG1p
dFN0YWNrQ291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnbG9iYWxJbmRleCA8
IHJhbmdlLmZpcnN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuZmlyc3Qg
PSBnbG9iYWxJbmRleDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZS5sYXN0ID0g
Z2xvYmFsSW5kZXg7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICByYW5nZS5sYXN0ID0gZ2xvYmFsSW5kZXg7CisKKyAgICAgICAgICAg
ICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICAgICAgICAgIGFyZy5mb3JFYWNoVG1wRmFzdChbJl0gKFRtcCYgdG1wKSB7CisgICAgICAgICAg
ICAgICAgICAgICAgICBpZiAodG1wLmlzR1AoKSAhPSAodHlwZSA9PSBBcmc6OkdQKSkKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgICAgICAgICAgICAg
IFJhbmdlJiByYW5nZSA9IHJhbmdlc1tBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJ
bmRleCh0bXApXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmNvdW50Kys7CisgICAg
ICAgICAgICAgICAgICAgICAgICBpZiAoZ2xvYmFsSW5kZXggPCByYW5nZS5maXJzdCkgeworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmZpcnN0ID0gZ2xvYmFsSW5kZXg7CisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UubGFzdCA9IGdsb2JhbEluZGV4OworICAgICAg
ICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFu
Z2UubGFzdCA9IGdsb2JhbEluZGV4OworICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAg
ICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgICsrZ2xvYmFsSW5kZXg7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICArK2dsb2JhbEluZGV4OworICAgICAgICB9CisgICAgICAgIGZvciAo
dW5zaWduZWQgaSA9IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjpsYXN0TWFjaGluZVJlZ2lzdGVy
SW5kZXgoKSArIDE7IGkgPCByYW5nZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIFJhbmdl
JiByYW5nZSA9IHJhbmdlc1tpXTsKKyAgICAgICAgICAgIGlmIChyYW5nZS5sYXN0IC0gcmFuZ2Uu
Zmlyc3QgPD0gMSAmJiByYW5nZS5jb3VudCA+IHJhbmdlLmFkbWl0U3RhY2tDb3VudCkKKyAgICAg
ICAgICAgICAgICB1bnNwaWxsYWJsZVRtcHMuYWRkKGkpOworICAgICAgICB9CisKKyAgICAgICAg
cmV0dXJuIHVuc3BpbGxhYmxlVG1wczsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTxBcmc6OlR5cGUg
dHlwZT4KKyAgICB2b2lkIGFzc2lnblJlZ2lzdGVyc1RvVG1wKGNvbnN0IENvbG9yaW5nQWxsb2Nh
dG9yPHR5cGU+JiBhbGxvY2F0b3IpCisgICAgeworICAgICAgICBmb3IgKEJhc2ljQmxvY2sqIGJs
b2NrIDogbV9jb2RlKSB7CisgICAgICAgICAgICAvLyBHaXZlIFRtcCBhIHZhbGlkIHJlZ2lzdGVy
LgorICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnN0SW5kZXggPSAwOyBpbnN0SW5kZXggPCBi
bG9jay0+c2l6ZSgpOyArK2luc3RJbmRleCkgeworICAgICAgICAgICAgICAgIEluc3QmIGluc3Qg
PSBibG9jay0+YXQoaW5zdEluZGV4KTsKKworICAgICAgICAgICAgICAgIC8vIFRoZSBtYXlCZUNv
YWxlc2NhYmxlKCkgbWV0aG9kIHdpbGwgY2hhbmdlIGl0cyBtaW5kIGZvciBzb21lIG9wZXJhdGlv
bnMgYWZ0ZXIgd2UKKyAgICAgICAgICAgICAgICAvLyBjb21wbGV0ZSByZWdpc3RlciBhbGxvY2F0
aW9uLiBTbywgd2UgcmVjb3JkIHRoaXMgYmVmb3JlIHN0YXJ0aW5nLgorICAgICAgICAgICAgICAg
IGJvb2wgbWF5QmVDb2FsZXNjYWJsZSA9IGFsbG9jYXRvci5tYXlCZUNvYWxlc2NhYmxlKGluc3Qp
OworCisgICAgICAgICAgICAgICAgLy8gTW92ZTMyIGlzIGNoZWFwZXIgaWYgd2Uga25vdyB0aGF0
IGl0J3MgZXF1aXZhbGVudCB0byBhIE1vdmUuIEl0J3MKKyAgICAgICAgICAgICAgICAvLyBlcXVp
dmFsZW50IGlmIHRoZSBkZXN0aW5hdGlvbidzIGhpZ2ggYml0cyBhcmUgbm90IG9ic2VydmFibGUg
b3IgaWYgdGhlIHNvdXJjZSdzIGhpZ2gKKyAgICAgICAgICAgICAgICAvLyBiaXRzIGFyZSBhbGwg
emVyby4gTm90ZSB0aGF0IHdlIGRvbid0IGhhdmUgdGhlIG9wcG9zaXRlIG9wdGltaXphdGlvbiBm
b3Igb3RoZXIKKyAgICAgICAgICAgICAgICAvLyBhcmNoaXRlY3R1cmVzLCB3aGljaCBtYXkgcHJl
ZmVyIE1vdmUgb3ZlciBNb3ZlMzIsIGJlY2F1c2UgTW92ZSBpcyBjYW5vbmljYWwgYWxyZWFkeS4K
KyAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBBcmc6OkdQICYmIGluc3Qua2luZC5vcGNvZGUg
PT0gTW92ZQorICAgICAgICAgICAgICAgICAgICAmJiBpbnN0LmFyZ3NbMF0uaXNUbXAoKSAmJiBp
bnN0LmFyZ3NbMV0uaXNUbXAoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobV90bXBXaWR0
aC51c2VXaWR0aChpbnN0LmFyZ3NbMV0udG1wKCkpIDw9IEFyZzo6V2lkdGgzMgorICAgICAgICAg
ICAgICAgICAgICAgICAgfHwgbV90bXBXaWR0aC5kZWZXaWR0aChpbnN0LmFyZ3NbMF0udG1wKCkp
IDw9IEFyZzo6V2lkdGgzMikKKyAgICAgICAgICAgICAgICAgICAgICAgIGluc3Qua2luZC5vcGNv
ZGUgPSBNb3ZlMzI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW5zdC5m
b3JFYWNoVG1wRmFzdChbJl0gKFRtcCYgdG1wKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0
bXAuaXNSZWcoKSB8fCB0bXAuaXNHUCgpID09ICh0eXBlICE9IEFyZzo6R1ApKQorICAgICAgICAg
ICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAgICAgICAgIFRtcCBhbGlhc1Rt
cCA9IGFsbG9jYXRvci5nZXRBbGlhcyh0bXApOworICAgICAgICAgICAgICAgICAgICBUbXAgYXNz
aWduZWRUbXA7CisgICAgICAgICAgICAgICAgICAgIGlmIChhbGlhc1RtcC5pc1JlZygpKQorICAg
ICAgICAgICAgICAgICAgICAgICAgYXNzaWduZWRUbXAgPSBUbXAoYWxpYXNUbXAucmVnKCkpOwor
ICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8g
cmVnID0gYWxsb2NhdG9yLmFsbG9jYXRlZFJlZyhhbGlhc1RtcCk7CisgICAgICAgICAgICAgICAg
ICAgICAgICBBU1NFUlQocmVnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbmVkVG1w
ID0gVG1wKHJlZyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAg
QVNTRVJUKGFzc2lnbmVkVG1wLmlzUmVnKCkpOworICAgICAgICAgICAgICAgICAgICB0bXAgPSBh
c3NpZ25lZFRtcDsKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgIGlmICht
YXlCZUNvYWxlc2NhYmxlICYmIGluc3QuYXJnc1swXS5pc1RtcCgpICYmIGluc3QuYXJnc1sxXS5p
c1RtcCgpCisgICAgICAgICAgICAgICAgICAgICYmIGluc3QuYXJnc1swXS50bXAoKSA9PSBpbnN0
LmFyZ3NbMV0udG1wKCkpCisgICAgICAgICAgICAgICAgICAgIGluc3QgPSBJbnN0KCk7CisgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFJlbW92ZSBhbGwgdGhlIHVzZWxlc3MgbW92ZXMg
d2UgY3JlYXRlZCBpbiB0aGlzIGJsb2NrLgorICAgICAgICAgICAgYmxvY2stPmluc3RzKCkucmVt
b3ZlQWxsTWF0Y2hpbmcoWyZdIChjb25zdCBJbnN0JiBpbnN0KSB7CisgICAgICAgICAgICAgICAg
cmV0dXJuICFpbnN0OworICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBz
dGF0aWMgdW5zaWduZWQgc3RhY2tTbG90TWluaW11bVdpZHRoKEFyZzo6V2lkdGggd2lkdGgpCisg
ICAgeworICAgICAgICByZXR1cm4gd2lkdGggPD0gQXJnOjpXaWR0aDMyID8gNCA6IDg7CisgICAg
fQorCisgICAgdGVtcGxhdGU8QXJnOjpUeXBlIHR5cGU+CisgICAgdm9pZCBhZGRTcGlsbEFuZEZp
bGwoY29uc3QgQ29sb3JpbmdBbGxvY2F0b3I8dHlwZT4mIGFsbG9jYXRvciwgSGFzaFNldDx1bnNp
Z25lZD4mIHVuc3BpbGxhYmxlVG1wcykKKyAgICB7CisgICAgICAgIEhhc2hNYXA8VG1wLCBTdGFj
a1Nsb3QqPiBzdGFja1Nsb3RzOworICAgICAgICBmb3IgKFRtcCB0bXAgOiBhbGxvY2F0b3Iuc3Bp
bGxlZFRtcHMoKSkgeworICAgICAgICAgICAgLy8gQWxsIHRoZSBzcGlsbGVkIHZhbHVlcyBiZWNv
bWUgdW5zcGlsbGFibGUuCisgICAgICAgICAgICB1bnNwaWxsYWJsZVRtcHMuYWRkKEFic29sdXRl
VG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHRtcCkpOworCisgICAgICAgICAgICAvLyBB
bGxvY2F0ZSBzdGFjayBzbG90IGZvciBlYWNoIHNwaWxsZWQgdmFsdWUuCisgICAgICAgICAgICBT
dGFja1Nsb3QqIHN0YWNrU2xvdCA9IG1fY29kZS5hZGRTdGFja1Nsb3QoCisgICAgICAgICAgICAg
ICAgc3RhY2tTbG90TWluaW11bVdpZHRoKG1fdG1wV2lkdGgucmVxdWlyZWRXaWR0aCh0bXApKSwg
U3RhY2tTbG90S2luZDo6U3BpbGwpOworICAgICAgICAgICAgYm9vbCBpc05ld1RtcCA9IHN0YWNr
U2xvdHMuYWRkKHRtcCwgc3RhY2tTbG90KS5pc05ld0VudHJ5OworICAgICAgICAgICAgQVNTRVJU
X1VOVVNFRChpc05ld1RtcCwgaXNOZXdUbXApOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmV3
cml0ZSB0aGUgcHJvZ3JhbSB0byBnZXQgcmlkIG9mIHRoZSBzcGlsbGVkIFRtcC4KKyAgICAgICAg
SW5zZXJ0aW9uU2V0IGluc2VydGlvblNldChtX2NvZGUpOworICAgICAgICBmb3IgKEJhc2ljQmxv
Y2sqIGJsb2NrIDogbV9jb2RlKSB7CisgICAgICAgICAgICBib29sIGhhc0FsaWFzZWRUbXBzID0g
ZmFsc2U7CisKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW5zdEluZGV4ID0gMDsgaW5zdElu
ZGV4IDwgYmxvY2stPnNpemUoKTsgKytpbnN0SW5kZXgpIHsKKyAgICAgICAgICAgICAgICBJbnN0
JiBpbnN0ID0gYmxvY2stPmF0KGluc3RJbmRleCk7CisKKyAgICAgICAgICAgICAgICAvLyBUaGUg
VG1wV2lkdGggYW5hbHlzaXMgd2lsbCBzYXkgdGhhdCBhIE1vdmUgb25seSBzdG9yZXMgMzIgYml0
cyBpbnRvIHRoZSBkZXN0aW5hdGlvbiwKKyAgICAgICAgICAgICAgICAvLyBpZiB0aGUgc291cmNl
IG9ubHkgaGFkIDMyIGJpdHMgd29ydGggb2Ygbm9uLXplcm8gYml0cy4gU2FtZSBmb3IgdGhlIHNv
dXJjZTogaXQgd2lsbAorICAgICAgICAgICAgICAgIC8vIG9ubHkgY2xhaW0gdG8gcmVhZCAzMiBi
aXRzIGZyb20gdGhlIHNvdXJjZSBpZiBvbmx5IDMyIGJpdHMgb2YgdGhlIGRlc3RpbmF0aW9uIGFy
ZQorICAgICAgICAgICAgICAgIC8vIHJlYWQuIE5vdGUgdGhhdCB3ZSBvbmx5IGFwcGx5IHRoaXMg
bG9naWMgaWYgdGhpcyB0dXJucyBpbnRvIGEgbG9hZCBvciBzdG9yZSwgc2luY2UKKyAgICAgICAg
ICAgICAgICAvLyBNb3ZlIGlzIHRoZSBjYW5vbmljYWwgd2F5IHRvIG1vdmUgZGF0YSBiZXR3ZWVu
IEdQUnMuCisgICAgICAgICAgICAgICAgYm9vbCBjYW5Vc2VNb3ZlMzJJZkRpZFNwaWxsID0gZmFs
c2U7CisgICAgICAgICAgICAgICAgYm9vbCBkaWRTcGlsbCA9IGZhbHNlOworICAgICAgICAgICAg
ICAgIGlmICh0eXBlID09IEFyZzo6R1AgJiYgaW5zdC5raW5kLm9wY29kZSA9PSBNb3ZlKSB7Cisg
ICAgICAgICAgICAgICAgICAgIGlmICgoaW5zdC5hcmdzWzBdLmlzVG1wKCkgJiYgbV90bXBXaWR0
aC53aWR0aChpbnN0LmFyZ3NbMF0udG1wKCkpIDw9IEFyZzo6V2lkdGgzMikKKyAgICAgICAgICAg
ICAgICAgICAgICAgIHx8IChpbnN0LmFyZ3NbMV0uaXNUbXAoKSAmJiBtX3RtcFdpZHRoLndpZHRo
KGluc3QuYXJnc1sxXS50bXAoKSkgPD0gQXJnOjpXaWR0aDMyKSkKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGNhblVzZU1vdmUzMklmRGlkU3BpbGwgPSB0cnVlOworICAgICAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgICAgIC8vIFRyeSB0byByZXBsYWNlIHRoZSByZWdpc3RlciB1c2UgYnkg
bWVtb3J5IHVzZSB3aGVuIHBvc3NpYmxlLgorICAgICAgICAgICAgICAgIGluc3QuZm9yRWFjaEFy
ZygKKyAgICAgICAgICAgICAgICAgICAgWyZdIChBcmcmIGFyZywgQXJnOjpSb2xlIHJvbGUsIEFy
Zzo6VHlwZSBhcmdUeXBlLCBBcmc6OldpZHRoIHdpZHRoKSB7CisgICAgICAgICAgICAgICAgICAg
ICAgICBpZiAoIWFyZy5pc1RtcCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdUeXBlICE9IHR5cGUpCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgaWYg
KGFyZy5pc1JlZygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBzdGFja1Ns
b3RFbnRyeSA9IHN0YWNrU2xvdHMuZmluZChhcmcudG1wKCkpOworICAgICAgICAgICAgICAgICAg
ICAgICAgaWYgKHN0YWNrU2xvdEVudHJ5ID09IHN0YWNrU2xvdHMuZW5kKCkpCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFp
bnN0LmFkbWl0c1N0YWNrKGFyZykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJu
OworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJ
ZiB0aGUgVG1wIGhvbGRzIGEgY29uc3RhbnQgdGhlbiB3ZSB3YW50IHRvIHJlbWF0ZXJpYWxpemUg
aXRzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZSByYXRoZXIgdGhhbiBsb2FkaW5n
IGl0IGZyb20gdGhlIHN0YWNrLiBJbiBvcmRlciBmb3IgdGhhdAorICAgICAgICAgICAgICAgICAg
ICAgICAgLy8gb3B0aW1pemF0aW9uIHRvIGtpY2sgaW4sIHdlIG5lZWQgdG8gYXZvaWQgcGxhY2lu
ZyB0aGUgVG1wJ3Mgc3RhY2sKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZHJlc3MgaW50
byB0aGUgaW5zdHJ1Y3Rpb24uCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUFyZzo6aXND
b2xkVXNlKHJvbGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVXNlQ291
bnRzPFRtcD46OkNvdW50cyogY291bnRzID0gbV91c2VDb3VudHNbYXJnLnRtcCgpXTsKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBpZiAoY291bnRzICYmIGNvdW50cy0+bnVtQ29uc3REZWZz
ID09IDEgJiYgY291bnRzLT5udW1EZWZzID09IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg
ICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgQXJnOjpXaWR0aCBzcGlsbFdpZHRo
ID0gbV90bXBXaWR0aC5yZXF1aXJlZFdpZHRoKGFyZy50bXAoKSk7CisgICAgICAgICAgICAgICAg
ICAgICAgICBpZiAoQXJnOjppc0FueURlZihyb2xlKSAmJiB3aWR0aCA8IHNwaWxsV2lkdGgpCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAg
ICAgQVNTRVJUKGluc3Qua2luZC5vcGNvZGUgPT0gTW92ZSB8fCAhKEFyZzo6aXNBbnlVc2Uocm9s
ZSkgJiYgd2lkdGggPiBzcGlsbFdpZHRoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGlmIChzcGlsbFdpZHRoICE9IEFyZzo6V2lkdGgzMikKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5Vc2VNb3ZlMzJJZkRpZFNwaWxsID0gZmFsc2U7
CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNr
U2xvdEVudHJ5LT52YWx1ZS0+ZW5zdXJlU2l6ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBjYW5Vc2VNb3ZlMzJJZkRpZFNwaWxsID8gNCA6IEFyZzo6Ynl0ZXMod2lkdGgpKTsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGFyZyA9IEFyZzo6c3RhY2soc3RhY2tTbG90RW50cnktPnZhbHVl
KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpZFNwaWxsID0gdHJ1ZTsKKyAgICAgICAgICAg
ICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgICBpZiAoZGlkU3BpbGwgJiYgY2FuVXNlTW92
ZTMySWZEaWRTcGlsbCkKKyAgICAgICAgICAgICAgICAgICAgaW5zdC5raW5kLm9wY29kZSA9IE1v
dmUzMjsKKworICAgICAgICAgICAgICAgIC8vIEZvciBldmVyeSBvdGhlciBjYXNlLCBhZGQgTG9h
ZC9TdG9yZSBhcyBuZWVkZWQuCisgICAgICAgICAgICAgICAgaW5zdC5mb3JFYWNoVG1wKFsmXSAo
VG1wJiB0bXAsIEFyZzo6Um9sZSByb2xlLCBBcmc6OlR5cGUgYXJnVHlwZSwgQXJnOjpXaWR0aCkg
eworICAgICAgICAgICAgICAgICAgICBpZiAodG1wLmlzUmVnKCkgfHwgYXJnVHlwZSAhPSB0eXBl
KQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAgICAgICAg
IGF1dG8gc3RhY2tTbG90RW50cnkgPSBzdGFja1Nsb3RzLmZpbmQodG1wKTsKKyAgICAgICAgICAg
ICAgICAgICAgaWYgKHN0YWNrU2xvdEVudHJ5ID09IHN0YWNrU2xvdHMuZW5kKCkpIHsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIFRtcCBhbGlhcyA9IGFsbG9jYXRvci5nZXRBbGlhc1doZW5TcGls
bGluZyh0bXApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFsaWFzICE9IHRtcCkgewor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGFsaWFzOworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGhhc0FsaWFzZWRUbXBzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICAgICAgICAgIEFyZzo6V2lkdGggc3BpbGxXaWR0aCA9IG1fdG1w
V2lkdGgucmVxdWlyZWRXaWR0aCh0bXApOworICAgICAgICAgICAgICAgICAgICBPcGNvZGUgbW92
ZSA9IE9vcHM7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhY2tTbG90TWluaW11bVdp
ZHRoKHNwaWxsV2lkdGgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAg
ICAgICAgICAgICAgICAgIG1vdmUgPSB0eXBlID09IEFyZzo6R1AgPyBNb3ZlMzIgOiBNb3ZlRmxv
YXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAg
Y2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgbW92ZSA9IHR5cGUgPT0gQXJnOjpHUCA/
IE1vdmUgOiBNb3ZlRG91YmxlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBSRUxFQVNF
X0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0bXAgPSBtX2NvZGUu
bmV3VG1wKHR5cGUpOworICAgICAgICAgICAgICAgICAgICB1bnNwaWxsYWJsZVRtcHMuYWRkKEFi
c29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHRtcCkpOworCisgICAgICAgICAg
ICAgICAgICAgIEFyZyBhcmcgPSBBcmc6OnN0YWNrKHN0YWNrU2xvdEVudHJ5LT52YWx1ZSk7Cisg
ICAgICAgICAgICAgICAgICAgIGlmIChBcmc6OmlzQW55VXNlKHJvbGUpICYmIHJvbGUgIT0gQXJn
OjpTY3JhdGNoKQorICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0aW9uU2V0Lmluc2VydChp
bnN0SW5kZXgsIG1vdmUsIGluc3Qub3JpZ2luLCBhcmcsIHRtcCk7CisgICAgICAgICAgICAgICAg
ICAgIGlmIChBcmc6OmlzQW55RGVmKHJvbGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgaW5z
ZXJ0aW9uU2V0Lmluc2VydChpbnN0SW5kZXggKyAxLCBtb3ZlLCBpbnN0Lm9yaWdpbiwgdG1wLCBh
cmcpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5z
ZXJ0aW9uU2V0LmV4ZWN1dGUoYmxvY2spOworCisgICAgICAgICAgICBpZiAoaGFzQWxpYXNlZFRt
cHMpIHsKKyAgICAgICAgICAgICAgICBibG9jay0+aW5zdHMoKS5yZW1vdmVBbGxNYXRjaGluZyhb
Jl0gKGNvbnN0IEluc3QmIGluc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFsbG9j
YXRvci5pc1VzZWxlc3NNb3ZlKGluc3QpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAg
ICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBmaXhTcGlsbHNBZnRlclRlcm1pbmFs
cygpCisgICAgeworICAgICAgICAvLyBCZWNhdXNlIHRoZXJlIG1heSBiZSB0ZXJtaW5hbHMgdGhh
dCBwcm9kdWNlIHZhbHVlcywgSVJDIG1heQorICAgICAgICAvLyB3YW50IHRvIHNwaWxsIHRob3Nl
IHRlcm1pbmFscy4gSXQnbGwgaGFwcGVuIHRvIHNwaWxsIGl0IGFmdGVyCisgICAgICAgIC8vIHRo
ZSB0ZXJtaW5hbC4gSWYgd2UgbGVmdCB0aGUgZ3JhcGggaW4gdGhpcyBzdGF0ZSwgaXQnZCBiZSBp
bnZhbGlkCisgICAgICAgIC8vIGJlY2F1c2UgYSB0ZXJtaW5hbCBtdXN0IGJlIHRoZSBsYXN0IGlu
c3RydWN0aW9uIGluIGEgYmxvY2suCisgICAgICAgIC8vIFdlIGZpeCB0aGF0IGhlcmUuCisKKyAg
ICAgICAgSW5zZXJ0aW9uU2V0IGluc2VydGlvblNldChtX2NvZGUpOworCisgICAgICAgIGJvb2wg
YWRkZWRCbG9ja3MgPSBmYWxzZTsKKworICAgICAgICBmb3IgKEJhc2ljQmxvY2sqIGJsb2NrIDog
bV9jb2RlKSB7CisgICAgICAgICAgICB1bnNpZ25lZCB0ZXJtaW5hbEluZGV4ID0gYmxvY2stPnNp
emUoKTsKKyAgICAgICAgICAgIGJvb2wgZm91bmRUZXJtaW5hbCA9IGZhbHNlOworICAgICAgICAg
ICAgd2hpbGUgKHRlcm1pbmFsSW5kZXgtLSkgeworICAgICAgICAgICAgICAgIGlmIChibG9jay0+
YXQodGVybWluYWxJbmRleCkuaXNUZXJtaW5hbCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGZv
dW5kVGVybWluYWwgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBU1NFUlRfVU5VU0VEKGZvdW5k
VGVybWluYWwsIGZvdW5kVGVybWluYWwpOworCisgICAgICAgICAgICBpZiAodGVybWluYWxJbmRl
eCA9PSBibG9jay0+c2l6ZSgpIC0gMSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAg
ICAgICAgICAgLy8gVGhlcmUgbXVzdCBiZSBpbnN0cnVjdGlvbnMgYWZ0ZXIgdGhlIHRlcm1pbmFs
IGJlY2F1c2UgaXQncyBub3QgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24uCisgICAgICAgICAgICBBU1NF
UlQodGVybWluYWxJbmRleCA8IGJsb2NrLT5zaXplKCkgLSAxKTsKKyAgICAgICAgICAgIFZlY3Rv
cjxJbnN0LCAxPiBpbnN0c1RvTW92ZTsKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IHRl
cm1pbmFsSW5kZXggKyAxOyBpIDwgYmxvY2stPnNpemUoKTsgaSsrKQorICAgICAgICAgICAgICAg
IGluc3RzVG9Nb3ZlLmFwcGVuZChibG9jay0+YXQoaSkpOworICAgICAgICAgICAgUkVMRUFTRV9B
U1NFUlQoaW5zdHNUb01vdmUuc2l6ZSgpKTsKKworICAgICAgICAgICAgZm9yIChGcmVxdWVudGVk
QmxvY2smIGZyZXF1ZW50ZWRTdWNjZXNzb3IgOiBibG9jay0+c3VjY2Vzc29ycygpKSB7CisgICAg
ICAgICAgICAgICAgQmFzaWNCbG9jayogc3VjY2Vzc29yID0gZnJlcXVlbnRlZFN1Y2Nlc3Nvci5i
bG9jaygpOworICAgICAgICAgICAgICAgIC8vIElmIHN1Y2Nlc3NvcidzIG9ubHkgcHJlZGVjZXNz
b3IgaXMgYmxvY2ssIHdlIGNhbiBwbGFudCB0aGUgc3BpbGwgaW5zaWRlCisgICAgICAgICAgICAg
ICAgLy8gdGhlIHN1Y2Nlc3Nvci4gT3RoZXJ3aXNlLCB3ZSBtdXN0IHNwbGl0IHRoZSBjcml0aWNh
bCBlZGdlIGFuZCBjcmVhdGUKKyAgICAgICAgICAgICAgICAvLyBhIG5ldyBibG9jayBmb3IgdGhl
IHNwaWxsLgorICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzb3ItPm51bVByZWRlY2Vzc29ycygp
ID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5zZXJ0aW9uU2V0Lmluc2VydEluc3RzKDAs
IGluc3RzVG9Nb3ZlKTsKKyAgICAgICAgICAgICAgICAgICAgaW5zZXJ0aW9uU2V0LmV4ZWN1dGUo
c3VjY2Vzc29yKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAg
ICBhZGRlZEJsb2NrcyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBXZSBw
cm9iYWJseSB3YW50IGJldHRlciBibG9jayBvcmRlcmluZyBoZXJlLgorICAgICAgICAgICAgICAg
ICAgICBCYXNpY0Jsb2NrKiBuZXdCbG9jayA9IG1fY29kZS5hZGRCbG9jaygpOworICAgICAgICAg
ICAgICAgICAgICBmb3IgKGNvbnN0IEluc3QmIGluc3QgOiBpbnN0c1RvTW92ZSkKKyAgICAgICAg
ICAgICAgICAgICAgICAgIG5ld0Jsb2NrLT5hcHBlbmRJbnN0KGluc3QpOworICAgICAgICAgICAg
ICAgICAgICBuZXdCbG9jay0+YXBwZW5kSW5zdChJbnN0KEp1bXAsIGluc3RzVG9Nb3ZlLmxhc3Qo
KS5vcmlnaW4pKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3QmxvY2stPnN1Y2Nlc3NvcnMoKS5h
cHBlbmQoc3VjY2Vzc29yKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlcXVlbnRlZFN1Y2Nlc3Nv
ci5ibG9jaygpID0gbmV3QmxvY2s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQor
CisgICAgICAgICAgICBibG9jay0+cmVzaXplKHRlcm1pbmFsSW5kZXggKyAxKTsKKyAgICAgICAg
fQorCisgICAgICAgIGlmIChhZGRlZEJsb2NrcykKKyAgICAgICAgICAgIG1fY29kZS5yZXNldFJl
YWNoYWJpbGl0eSgpOworICAgIH0KKworICAgIENvZGUmIG1fY29kZTsKKyAgICBUbXBXaWR0aCBt
X3RtcFdpZHRoOworICAgIFVzZUNvdW50czxUbXA+IG1fdXNlQ291bnRzOworICAgIHVuc2lnbmVk
IG1fbnVtSXRlcmF0aW9ucyB7IDAgfTsKK307CisKK30gLy8gYW5vbnltb3VzIG5hbWVzcGFjZQor
Cit2b2lkIGl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nKENvZGUmIGNvZGUpCit7CisgICAgUGhh
c2VTY29wZSBwaGFzZVNjb3BlKGNvZGUsICJpdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZyIpOwor
ICAgIAorICAgIEl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nIGl0ZXJhdGVkUmVnaXN0ZXJDb2Fs
ZXNjaW5nKGNvZGUpOworICAgIGl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nLnJ1bigpOworfQor
Cit9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCisKKyNlbmRpZiAvLyBFTkFCTEUoQjNf
SklUKQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJHcmFwaENvbG9yaW5n
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckdyYXBo
Q29sb3JpbmcuY3BwCShyZXZpc2lvbiAyMTI3OTcpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvYWlyL0FpckdyYXBoQ29sb3JpbmcuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNCw3ICsyNCw3
IEBACiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIkFpckl0ZXJhdGVkUmVn
aXN0ZXJDb2FsZXNjaW5nLmgiCisjaW5jbHVkZSAiQWlyR3JhcGhDb2xvcmluZy5oIgogCiAjaWYg
RU5BQkxFKEIzX0pJVCkKIApAQCAtNDksMTMgKzQ5LDE1IEBAIGJvb2wgcmVwb3J0U3RhdHMgPSBm
YWxzZTsKIAogLy8gVGhlIEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0b3IgZGVmaW5lcyBhbGwgdGhl
IGNvZGUgdGhhdCBpcyBpbmRlcGVuZGFudAogLy8gZnJvbSB0aGUgdHlwZSBvciByZWdpc3RlciBh
bmQgY2FuIGJlIHNoYXJlZCB3aGVuIGFsbG9jYXRpbmcgcmVnaXN0ZXJzLgotdGVtcGxhdGU8dHlw
ZW5hbWUgSW5kZXhUeXBlPgordGVtcGxhdGU8dHlwZW5hbWUgSW5kZXhUeXBlLCB0eXBlbmFtZSBU
bXBNYXBwZXI+CiBjbGFzcyBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yIHsKIHB1YmxpYzoKLSAg
ICBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yKGNvbnN0IFZlY3RvcjxSZWc+JiByZWdzSW5Qcmlv
cml0eU9yZGVyLCBJbmRleFR5cGUgbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4LCB1bnNpZ25l
ZCB0bXBBcnJheVNpemUsIGNvbnN0IEhhc2hTZXQ8dW5zaWduZWQ+JiB1bnNwaWxsYWJsZVRtcCkK
KyAgICBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yKENvZGUmIGNvZGUsIGNvbnN0IFZlY3RvcjxS
ZWc+JiByZWdzSW5Qcmlvcml0eU9yZGVyLCBJbmRleFR5cGUgbGFzdFByZWNvbG9yZWRSZWdpc3Rl
ckluZGV4LCB1bnNpZ25lZCB0bXBBcnJheVNpemUsIGNvbnN0IEhhc2hTZXQ8dW5zaWduZWQ+JiB1
bnNwaWxsYWJsZVRtcHMsIGNvbnN0IFVzZUNvdW50czxUbXA+JiB1c2VDb3VudHMpCiAgICAgICAg
IDogbV9yZWdzSW5Qcmlvcml0eU9yZGVyKHJlZ3NJblByaW9yaXR5T3JkZXIpCiAgICAgICAgICwg
bV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXgobGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4
KQotICAgICAgICAsIG1fdW5zcGlsbGFibGVUbXBzKHVuc3BpbGxhYmxlVG1wKQorICAgICAgICAs
IG1fdW5zcGlsbGFibGVUbXBzKHVuc3BpbGxhYmxlVG1wcykKKyAgICAgICAgLCBtX3VzZUNvdW50
cyh1c2VDb3VudHMpCisgICAgICAgICwgbV9jb2RlKGNvZGUpCiAgICAgewogICAgICAgICBmb3Ig
KFJlZyByZWcgOiBtX3JlZ3NJblByaW9yaXR5T3JkZXIpCiAgICAgICAgICAgICBtX211dGFibGVS
ZWdzLnNldChyZWcpOwpAQCAtNjYsOSArNjgsMTMgQEAgcHVibGljOgogICAgICAgICBtX21vdmVM
aXN0LnJlc2l6ZSh0bXBBcnJheVNpemUpOwogICAgICAgICBtX2NvYWxlc2NlZFRtcHMuZmlsbCgw
LCB0bXBBcnJheVNpemUpOwogICAgICAgICBtX2lzT25TZWxlY3RTdGFjay5lbnN1cmVTaXplKHRt
cEFycmF5U2l6ZSk7CisgICAgICAgIG1fc3BpbGxXb3JrbGlzdC5lbnN1cmVTaXplKHRtcEFycmF5
U2l6ZSk7CiAgICAgfQogCiBwcm90ZWN0ZWQ6CisKKyAgICB1bnNpZ25lZCByZWdpc3RlckNvdW50
KCkgY29uc3QgeyByZXR1cm4gbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKTsgfQorCiAgICAg
SW5kZXhUeXBlIGdldEFsaWFzKEluZGV4VHlwZSB0bXBJbmRleCkgY29uc3QKICAgICB7CiAgICAg
ICAgIEluZGV4VHlwZSBhbGlhcyA9IHRtcEluZGV4OwpAQCAtODQsMjAgKzkwLDYgQEAgcHJvdGVj
dGVkOgogICAgICAgICBhZGRFZGdlRGlzdGluY3QoYSwgYik7CiAgICAgfQogCi0gICAgdm9pZCBt
YWtlV29ya0xpc3QoKQotICAgIHsKLSAgICAgICAgSW5kZXhUeXBlIGZpcnN0Tm9uUmVnSW5kZXgg
PSBtX2xhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleCArIDE7Ci0gICAgICAgIGZvciAoSW5kZXhU
eXBlIGkgPSBmaXJzdE5vblJlZ0luZGV4OyBpIDwgbV9kZWdyZWVzLnNpemUoKTsgKytpKSB7Ci0g
ICAgICAgICAgICB1bnNpZ25lZCBkZWdyZWUgPSBtX2RlZ3JlZXNbaV07Ci0gICAgICAgICAgICBp
ZiAoZGVncmVlID49IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkpCi0gICAgICAgICAgICAg
ICAgYWRkVG9TcGlsbChpKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKCFtX21vdmVMaXN0W2ldLmlz
RW1wdHkoKSkKLSAgICAgICAgICAgICAgICBtX2ZyZWV6ZVdvcmtsaXN0LmFkZChpKTsKLSAgICAg
ICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuYXBwZW5kKGkp
OwotICAgICAgICB9Ci0gICAgfQotCiAgICAgdm9pZCBhZGRUb1NwaWxsKHVuc2lnbmVkIHRvU3Bp
bGwpCiAgICAgewogICAgICAgICBpZiAobV91bnNwaWxsYWJsZVRtcHMuY29udGFpbnModG9TcGls
bCkpCkBAIC0xMDYsMTQ3ICs5OCwxMSBAQCBwcm90ZWN0ZWQ6CiAgICAgICAgIG1fc3BpbGxXb3Jr
bGlzdC5hZGQodG9TcGlsbCk7CiAgICAgfQogCi0gICAgLy8gTG93LWRlZ3JlZSB2ZXJ0ZXggY2Fu
IGFsd2F5cyBiZSBjb2xvcmVkOiBqdXN0IHBpY2sgYW55IG9mIHRoZSBjb2xvciB0YWtlbiBieSBh
bnkKLSAgICAvLyBvdGhlciBhZGphY2VudCB2ZXJpY2VzLgotICAgIC8vIFRoZSAiU2ltcGxpZnki
IHBoYXNlIHRha2VzIGEgbG93LWRlZ3JlZSBvdXQgb2YgdGhlIGludGVyZmVyZW5jZSBncmFwaCB0
byBzaW1wbGlmeSBpdC4KLSAgICB2b2lkIHNpbXBsaWZ5KCkKLSAgICB7Ci0gICAgICAgIEluZGV4
VHlwZSBsYXN0SW5kZXggPSBtX3NpbXBsaWZ5V29ya2xpc3QudGFrZUxhc3QoKTsKLQotICAgICAg
ICBBU1NFUlQoIW1fc2VsZWN0U3RhY2suY29udGFpbnMobGFzdEluZGV4KSk7Ci0gICAgICAgIEFT
U0VSVCghbV9pc09uU2VsZWN0U3RhY2suZ2V0KGxhc3RJbmRleCkpOwotICAgICAgICBtX3NlbGVj
dFN0YWNrLmFwcGVuZChsYXN0SW5kZXgpOwotICAgICAgICBtX2lzT25TZWxlY3RTdGFjay5xdWlj
a1NldChsYXN0SW5kZXgpOwotCi0gICAgICAgIGZvckVhY2hBZGphY2VudChsYXN0SW5kZXgsIFt0
aGlzXShJbmRleFR5cGUgYWRqYWNlbnRUbXBJbmRleCkgewotICAgICAgICAgICAgZGVjcmVtZW50
RGVncmVlKGFkamFjZW50VG1wSW5kZXgpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lk
IGZyZWV6ZSgpCi0gICAgewotICAgICAgICBJbmRleFR5cGUgdmljdGltSW5kZXggPSBtX2ZyZWV6
ZVdvcmtsaXN0LnRha2VBbnkoKTsKLSAgICAgICAgQVNTRVJUX1dJVEhfTUVTU0FHRShnZXRBbGlh
cyh2aWN0aW1JbmRleCkgPT0gdmljdGltSW5kZXgsICJjb2FsZXNjZSgpIHNob3VsZCBub3QgbGVh
dmUgYWxpYXNlZCBUbXAgaW4gdGhlIHdvcmtsaXN0LiIpOwotICAgICAgICBtX3NpbXBsaWZ5V29y
a2xpc3QuYXBwZW5kKHZpY3RpbUluZGV4KTsKLSAgICAgICAgZnJlZXplTW92ZXModmljdGltSW5k
ZXgpOwotICAgIH0KLQotICAgIHZvaWQgZnJlZXplTW92ZXMoSW5kZXhUeXBlIHRtcEluZGV4KQot
ICAgIHsKLSAgICAgICAgZm9yRWFjaE5vZGVNb3Zlcyh0bXBJbmRleCwgW3RoaXMsIHRtcEluZGV4
XSAoSW5kZXhUeXBlIG1vdmVJbmRleCkgewotICAgICAgICAgICAgaWYgKCFtX2FjdGl2ZU1vdmVz
LnF1aWNrQ2xlYXIobW92ZUluZGV4KSkKLSAgICAgICAgICAgICAgICBtX3dvcmtsaXN0TW92ZXMu
dGFrZU1vdmUobW92ZUluZGV4KTsKLQotICAgICAgICAgICAgY29uc3QgTW92ZU9wZXJhbmRzJiBt
b3ZlT3BlcmFuZHMgPSBtX2NvYWxlc2NpbmdDYW5kaWRhdGVzW21vdmVJbmRleF07Ci0gICAgICAg
ICAgICBJbmRleFR5cGUgc3JjVG1wSW5kZXggPSBtb3ZlT3BlcmFuZHMuc3JjSW5kZXg7Ci0gICAg
ICAgICAgICBJbmRleFR5cGUgZHN0VG1wSW5kZXggPSBtb3ZlT3BlcmFuZHMuZHN0SW5kZXg7Ci0K
LSAgICAgICAgICAgIEluZGV4VHlwZSBvcmlnaW5hbE90aGVyVG1wID0gc3JjVG1wSW5kZXggIT0g
dG1wSW5kZXggPyBzcmNUbXBJbmRleCA6IGRzdFRtcEluZGV4OwotICAgICAgICAgICAgSW5kZXhU
eXBlIG90aGVyVG1wSW5kZXggPSBnZXRBbGlhcyhvcmlnaW5hbE90aGVyVG1wKTsKLSAgICAgICAg
ICAgIGlmIChtX2RlZ3JlZXNbb3RoZXJUbXBJbmRleF0gPCBtX3JlZ3NJblByaW9yaXR5T3JkZXIu
c2l6ZSgpICYmICFpc01vdmVSZWxhdGVkKG90aGVyVG1wSW5kZXgpKSB7Ci0gICAgICAgICAgICAg
ICAgaWYgKG1fZnJlZXplV29ya2xpc3QucmVtb3ZlKG90aGVyVG1wSW5kZXgpKQotICAgICAgICAg
ICAgICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuYXBwZW5kKG90aGVyVG1wSW5kZXgpOwotICAg
ICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIGNvYWxlc2NlKCkKLSAg
ICB7Ci0gICAgICAgIHVuc2lnbmVkIG1vdmVJbmRleCA9IG1fd29ya2xpc3RNb3Zlcy50YWtlTGFz
dE1vdmUoKTsKLSAgICAgICAgY29uc3QgTW92ZU9wZXJhbmRzJiBtb3ZlT3BlcmFuZHMgPSBtX2Nv
YWxlc2NpbmdDYW5kaWRhdGVzW21vdmVJbmRleF07Ci0gICAgICAgIEluZGV4VHlwZSB1ID0gZ2V0
QWxpYXMobW92ZU9wZXJhbmRzLnNyY0luZGV4KTsKLSAgICAgICAgSW5kZXhUeXBlIHYgPSBnZXRB
bGlhcyhtb3ZlT3BlcmFuZHMuZHN0SW5kZXgpOwotCi0gICAgICAgIGlmIChpc1ByZWNvbG9yZWQo
dikpCi0gICAgICAgICAgICBzdGQ6OnN3YXAodSwgdik7Ci0KLSAgICAgICAgaWYgKHRyYWNlRGVi
dWcpCi0gICAgICAgICAgICBkYXRhTG9nKCJDb2FsZXNjaW5nIG1vdmUgYXQgaW5kZXggIiwgbW92
ZUluZGV4LCAiIHUgPSAiLCB1LCAiIHYgPSAiLCB2LCAiXG4iKTsKLQotICAgICAgICBpZiAodSA9
PSB2KSB7Ci0gICAgICAgICAgICBhZGRXb3JrTGlzdCh1KTsKLQotICAgICAgICAgICAgaWYgKHRy
YWNlRGVidWcpCi0gICAgICAgICAgICAgICAgZGF0YUxvZygiICAgIENvYWxlc2NlZFxuIik7Ci0g
ICAgICAgIH0gZWxzZSBpZiAoaXNQcmVjb2xvcmVkKHYpCi0gICAgICAgICAgICB8fCBtX2ludGVy
ZmVyZW5jZUVkZ2VzLmNvbnRhaW5zKEludGVyZmVyZW5jZUVkZ2UodSwgdikpCi0gICAgICAgICAg
ICB8fCAodSA9PSBtX2ZyYW1lUG9pbnRlckluZGV4ICYmIG1faW50ZXJmZXJlc1dpdGhGcmFtZVBv
aW50ZXIucXVpY2tHZXQodikpKSB7Ci0gICAgICAgICAgICBhZGRXb3JrTGlzdCh1KTsKLSAgICAg
ICAgICAgIGFkZFdvcmtMaXN0KHYpOwotCi0gICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKLSAg
ICAgICAgICAgICAgICBkYXRhTG9nKCIgICAgQ29uc3RyYWluZWRcbiIpOwotICAgICAgICB9IGVs
c2UgaWYgKGNhbkJlU2FmZWx5Q29hbGVzY2VkKHUsIHYpKSB7Ci0gICAgICAgICAgICBjb21iaW5l
KHUsIHYpOwotICAgICAgICAgICAgYWRkV29ya0xpc3QodSk7Ci0gICAgICAgICAgICBtX2hhc0Nv
YWxlc2NlZE5vblRyaXZpYWxNb3ZlID0gdHJ1ZTsKLQotICAgICAgICAgICAgaWYgKHRyYWNlRGVi
dWcpCi0gICAgICAgICAgICAgICAgZGF0YUxvZygiICAgIFNhZmUgQ29hbGVzY2luZ1xuIik7Ci0g
ICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX2FjdGl2ZU1vdmVzLnF1aWNrU2V0KG1vdmVJ
bmRleCk7Ci0KLSAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQotICAgICAgICAgICAgICAgIGRh
dGFMb2coIiAgICBGYWlsZWQgY29hbGVzY2luZywgYWRkZWQgdG8gYWN0aXZlIG1vdmVzLlxuIik7
Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGFzc2lnbkNvbG9ycygpCisgICAgYm9vbCBp
c1ByZWNvbG9yZWQoSW5kZXhUeXBlIHRtcEluZGV4KQogICAgIHsKLSAgICAgICAgQVNTRVJUKG1f
c2ltcGxpZnlXb3JrbGlzdC5pc0VtcHR5KCkpOwotICAgICAgICBBU1NFUlQobV93b3JrbGlzdE1v
dmVzLmlzRW1wdHkoKSk7Ci0gICAgICAgIEFTU0VSVChtX2ZyZWV6ZVdvcmtsaXN0LmlzRW1wdHko
KSk7Ci0gICAgICAgIEFTU0VSVChtX3NwaWxsV29ya2xpc3QuaXNFbXB0eSgpKTsKLQotICAgICAg
ICAvLyBSZWNsYWltIGFzIG11Y2ggbWVtb3J5IGFzIHBvc3NpYmxlLgotICAgICAgICBtX2ludGVy
ZmVyZW5jZUVkZ2VzLmNsZWFyKCk7Ci0gICAgICAgIG1fZGVncmVlcy5jbGVhcigpOwotICAgICAg
ICBtX21vdmVMaXN0LmNsZWFyKCk7Ci0gICAgICAgIG1fd29ya2xpc3RNb3Zlcy5jbGVhcigpOwot
ICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuY2xlYXIoKTsKLSAgICAgICAgbV9zcGlsbFdvcmts
aXN0LmNsZWFyKCk7Ci0gICAgICAgIG1fZnJlZXplV29ya2xpc3QuY2xlYXIoKTsKLQotICAgICAg
ICAvLyBUcnkgdG8gY29sb3IgdGhlIFRtcCBvbiB0aGUgc3RhY2suCi0gICAgICAgIG1fY29sb3Jl
ZFRtcC5yZXNpemUobV9hZGphY2VuY3lMaXN0LnNpemUoKSk7Ci0KLSAgICAgICAgd2hpbGUgKCFt
X3NlbGVjdFN0YWNrLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgdW5zaWduZWQgdG1wSW5kZXgg
PSBtX3NlbGVjdFN0YWNrLnRha2VMYXN0KCk7Ci0gICAgICAgICAgICBBU1NFUlQoIWlzUHJlY29s
b3JlZCh0bXBJbmRleCkpOwotICAgICAgICAgICAgQVNTRVJUKCFtX2NvbG9yZWRUbXBbdG1wSW5k
ZXhdKTsKLQotICAgICAgICAgICAgUmVnaXN0ZXJTZXQgY29sb3JlZFJlZ2lzdGVyczsKLSAgICAg
ICAgICAgIGZvciAoSW5kZXhUeXBlIGFkamFjZW50VG1wSW5kZXggOiBtX2FkamFjZW5jeUxpc3Rb
dG1wSW5kZXhdKSB7Ci0gICAgICAgICAgICAgICAgSW5kZXhUeXBlIGFsaWFzVG1wSW5kZXggPSBn
ZXRBbGlhcyhhZGphY2VudFRtcEluZGV4KTsKLSAgICAgICAgICAgICAgICBSZWcgcmVnID0gbV9j
b2xvcmVkVG1wW2FsaWFzVG1wSW5kZXhdOwotCi0gICAgICAgICAgICAgICAgQVNTRVJUKCFpc1By
ZWNvbG9yZWQoYWxpYXNUbXBJbmRleCkgfHwgKGlzUHJlY29sb3JlZChhbGlhc1RtcEluZGV4KSAm
JiByZWcpKTsKLQotICAgICAgICAgICAgICAgIGlmIChyZWcpCi0gICAgICAgICAgICAgICAgICAg
IGNvbG9yZWRSZWdpc3RlcnMuc2V0KHJlZyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAg
IGJvb2wgY29sb3JBc3NpZ25lZCA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChSZWcgcmVnIDog
bV9yZWdzSW5Qcmlvcml0eU9yZGVyKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFjb2xvcmVkUmVn
aXN0ZXJzLmdldChyZWcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fY29sb3JlZFRtcFt0bXBJ
bmRleF0gPSByZWc7Ci0gICAgICAgICAgICAgICAgICAgIGNvbG9yQXNzaWduZWQgPSB0cnVlOwot
ICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICB9Ci0KLSAgICAgICAgICAgIGlmICghY29sb3JBc3NpZ25lZCkKLSAgICAgICAgICAgICAgICBt
X3NwaWxsZWRUbXBzLmFwcGVuZCh0bXBJbmRleCk7Ci0gICAgICAgIH0KLSAgICAgICAgbV9zZWxl
Y3RTdGFjay5jbGVhcigpOwotCi0gICAgICAgIGlmIChtX3NwaWxsZWRUbXBzLmlzRW1wdHkoKSkK
LSAgICAgICAgICAgIG1fY29hbGVzY2VkVG1wc0F0U3BpbGwuY2xlYXIoKTsKLSAgICAgICAgZWxz
ZQotICAgICAgICAgICAgbV9jb2xvcmVkVG1wLmNsZWFyKCk7CisgICAgICAgIHJldHVybiB0bXBJ
bmRleCA8PSBtX2xhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleDsKICAgICB9CiAKLXByaXZhdGU6
CiAgICAgdm9pZCBpbml0aWFsaXplRGVncmVlcyh1bnNpZ25lZCB0bXBBcnJheVNpemUpCiAgICAg
ewogICAgICAgICBtX2RlZ3JlZXMucmVzaXplKHRtcEFycmF5U2l6ZSk7CkBAIC0yNjIsNyArMTE4
LDggQEAgcHJpdmF0ZToKICAgICB2b2lkIGFkZEVkZ2VEaXN0aW5jdChJbmRleFR5cGUgYSwgSW5k
ZXhUeXBlIGIpCiAgICAgewogICAgICAgICBBU1NFUlQoYSAhPSBiKTsKLSAgICAgICAgaWYgKG1f
aW50ZXJmZXJlbmNlRWRnZXMuYWRkKEludGVyZmVyZW5jZUVkZ2UoYSwgYikpLmlzTmV3RW50cnkp
IHsKKyAgICAgICAgYm9vbCBpc05ld0VkZ2UgPSBhZGRJbnRlcmZlcmVuY2VFZGdlKEludGVyZmVy
ZW5jZUVkZ2UoYSwgYikpOworICAgICAgICBpZiAoaXNOZXdFZGdlKSB7CiAgICAgICAgICAgICBp
ZiAoIWlzUHJlY29sb3JlZChhKSkgewogICAgICAgICAgICAgICAgIEFTU0VSVCghbV9hZGphY2Vu
Y3lMaXN0W2FdLmNvbnRhaW5zKGIpKTsKICAgICAgICAgICAgICAgICBtX2FkamFjZW5jeUxpc3Rb
YV0uYXBwZW5kKGIpOwpAQCAtMjc3LDI2ICsxMzQsMTEgQEAgcHJpdmF0ZToKICAgICAgICAgfQog
ICAgIH0KIAotICAgIHZvaWQgZGVjcmVtZW50RGVncmVlKEluZGV4VHlwZSB0bXBJbmRleCkKLSAg
ICB7Ci0gICAgICAgIEFTU0VSVChtX2RlZ3JlZXNbdG1wSW5kZXhdKTsKLQotICAgICAgICB1bnNp
Z25lZCBvbGREZWdyZWUgPSBtX2RlZ3JlZXNbdG1wSW5kZXhdLS07Ci0gICAgICAgIGlmIChvbGRE
ZWdyZWUgPT0gbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKSkgewotICAgICAgICAgICAgZW5h
YmxlTW92ZXNPblZhbHVlQW5kQWRqYWNlbnRzKHRtcEluZGV4KTsKLSAgICAgICAgICAgIG1fc3Bp
bGxXb3JrbGlzdC5yZW1vdmUodG1wSW5kZXgpOwotICAgICAgICAgICAgaWYgKGlzTW92ZVJlbGF0
ZWQodG1wSW5kZXgpKQotICAgICAgICAgICAgICAgIG1fZnJlZXplV29ya2xpc3QuYWRkKHRtcElu
ZGV4KTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBtX3NpbXBsaWZ5V29ya2xp
c3QuYXBwZW5kKHRtcEluZGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotCiAgICAgYm9vbCBhZGRF
ZGdlRGlzdGluY3RXaXRob3V0RGVncmVlQ2hhbmdlKEluZGV4VHlwZSBhLCBJbmRleFR5cGUgYikK
ICAgICB7CiAgICAgICAgIEFTU0VSVChhICE9IGIpOwotICAgICAgICBpZiAobV9pbnRlcmZlcmVu
Y2VFZGdlcy5hZGQoSW50ZXJmZXJlbmNlRWRnZShhLCBiKSkuaXNOZXdFbnRyeSkgeworICAgICAg
ICBib29sIGlzTmV3RWRnZSA9IGFkZEludGVyZmVyZW5jZUVkZ2UoSW50ZXJmZXJlbmNlRWRnZShh
LCBiKSk7CisgICAgICAgIGlmIChpc05ld0VkZ2UpIHsKICAgICAgICAgICAgIGlmICghaXNQcmVj
b2xvcmVkKGEpKSB7CiAgICAgICAgICAgICAgICAgQVNTRVJUKCFtX2FkamFjZW5jeUxpc3RbYV0u
Y29udGFpbnMoYikpOwogICAgICAgICAgICAgICAgIG1fYWRqYWNlbmN5TGlzdFthXS5hcHBlbmQo
Yik7CkBAIC0zMTEsMTUgKzE1Myw2IEBAIHByaXZhdGU6CiAgICAgICAgIHJldHVybiBmYWxzZTsK
ICAgICB9CiAKLSAgICBib29sIGlzTW92ZVJlbGF0ZWQoSW5kZXhUeXBlIHRtcEluZGV4KQotICAg
IHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBtb3ZlSW5kZXggOiBtX21vdmVMaXN0W3RtcEluZGV4
XSkgewotICAgICAgICAgICAgaWYgKG1fYWN0aXZlTW92ZXMucXVpY2tHZXQobW92ZUluZGV4KSB8
fCBtX3dvcmtsaXN0TW92ZXMuY29udGFpbnMobW92ZUluZGV4KSkKLSAgICAgICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCiAg
ICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rpb24+CiAgICAgdm9pZCBmb3JFYWNoQWRqYWNlbnQo
SW5kZXhUeXBlIHRtcEluZGV4LCBGdW5jdGlvbiBmdW5jdGlvbikKICAgICB7CkBAIC0zMzEsODAg
KzE2NCwxMiBAQCBwcml2YXRlOgogCiAgICAgYm9vbCBoYXNCZWVuU2ltcGxpZmllZChJbmRleFR5
cGUgdG1wSW5kZXgpCiAgICAgewotICAgICAgICByZXR1cm4gbV9pc09uU2VsZWN0U3RhY2sucXVp
Y2tHZXQodG1wSW5kZXgpIHx8ICEhbV9jb2FsZXNjZWRUbXBzW3RtcEluZGV4XTsKLSAgICB9Ci0K
LSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdGlvbj4KLSAgICB2b2lkIGZvckVhY2hOb2RlTW92
ZXMoSW5kZXhUeXBlIHRtcEluZGV4LCBGdW5jdGlvbiBmdW5jdGlvbikKLSAgICB7Ci0gICAgICAg
IGZvciAodW5zaWduZWQgbW92ZUluZGV4IDogbV9tb3ZlTGlzdFt0bXBJbmRleF0pIHsKLSAgICAg
ICAgICAgIGlmIChtX2FjdGl2ZU1vdmVzLnF1aWNrR2V0KG1vdmVJbmRleCkgfHwgbV93b3JrbGlz
dE1vdmVzLmNvbnRhaW5zKG1vdmVJbmRleCkpCi0gICAgICAgICAgICAgICAgZnVuY3Rpb24obW92
ZUluZGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZW5hYmxlTW92ZXNPblZhbHVl
KEluZGV4VHlwZSB0bXBJbmRleCkKLSAgICB7Ci0gICAgICAgIGZvciAodW5zaWduZWQgbW92ZUlu
ZGV4IDogbV9tb3ZlTGlzdFt0bXBJbmRleF0pIHsKLSAgICAgICAgICAgIGlmIChtX2FjdGl2ZU1v
dmVzLnF1aWNrQ2xlYXIobW92ZUluZGV4KSkKLSAgICAgICAgICAgICAgICBtX3dvcmtsaXN0TW92
ZXMucmV0dXJuTW92ZShtb3ZlSW5kZXgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBl
bmFibGVNb3Zlc09uVmFsdWVBbmRBZGphY2VudHMoSW5kZXhUeXBlIHRtcEluZGV4KQotICAgIHsK
LSAgICAgICAgZW5hYmxlTW92ZXNPblZhbHVlKHRtcEluZGV4KTsKLQotICAgICAgICBmb3JFYWNo
QWRqYWNlbnQodG1wSW5kZXgsIFt0aGlzXSAoSW5kZXhUeXBlIGFkamFjZW50VG1wSW5kZXgpIHsK
LSAgICAgICAgICAgIGVuYWJsZU1vdmVzT25WYWx1ZShhZGphY2VudFRtcEluZGV4KTsKLSAgICAg
ICAgfSk7Ci0gICAgfQotCi0gICAgYm9vbCBpc1ByZWNvbG9yZWQoSW5kZXhUeXBlIHRtcEluZGV4
KQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRtcEluZGV4IDw9IG1fbGFzdFByZWNvbG9yZWRSZWdp
c3RlckluZGV4OwotICAgIH0KLQotICAgIHZvaWQgYWRkV29ya0xpc3QoSW5kZXhUeXBlIHRtcElu
ZGV4KQotICAgIHsKLSAgICAgICAgaWYgKCFpc1ByZWNvbG9yZWQodG1wSW5kZXgpICYmIG1fZGVn
cmVlc1t0bXBJbmRleF0gPCBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpICYmICFpc01vdmVS
ZWxhdGVkKHRtcEluZGV4KSkgewotICAgICAgICAgICAgbV9mcmVlemVXb3JrbGlzdC5yZW1vdmUo
dG1wSW5kZXgpOwotICAgICAgICAgICAgbV9zaW1wbGlmeVdvcmtsaXN0LmFwcGVuZCh0bXBJbmRl
eCk7CisgICAgICAgIGlmICghQVNTRVJUX0RJU0FCTEVEKSB7CisgICAgICAgICAgICBpZiAoISFt
X2NvYWxlc2NlZFRtcHNbdG1wSW5kZXhdKQorICAgICAgICAgICAgICAgIEFTU0VSVChnZXRBbGlh
cyh0bXBJbmRleCkgIT0gdG1wSW5kZXgpOwogICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBj
b21iaW5lKEluZGV4VHlwZSB1LCBJbmRleFR5cGUgdikKLSAgICB7Ci0gICAgICAgIGlmICghbV9m
cmVlemVXb3JrbGlzdC5yZW1vdmUodikpCi0gICAgICAgICAgICBtX3NwaWxsV29ya2xpc3QucmVt
b3ZlKHYpOwotCi0gICAgICAgIEFTU0VSVCghbV9jb2FsZXNjZWRUbXBzW3ZdKTsKLSAgICAgICAg
bV9jb2FsZXNjZWRUbXBzW3ZdID0gdTsKLQotICAgICAgICBhdXRvJiB2TW92ZXMgPSBtX21vdmVM
aXN0W3ZdOwotICAgICAgICBtX21vdmVMaXN0W3VdLmFkZCh2TW92ZXMuYmVnaW4oKSwgdk1vdmVz
LmVuZCgpKTsKLQotICAgICAgICBmb3JFYWNoQWRqYWNlbnQodiwgW3RoaXMsIHVdIChJbmRleFR5
cGUgYWRqYWNlbnRUbXBJbmRleCkgewotICAgICAgICAgICAgaWYgKGFkZEVkZ2VEaXN0aW5jdFdp
dGhvdXREZWdyZWVDaGFuZ2UoYWRqYWNlbnRUbXBJbmRleCwgdSkpIHsKLSAgICAgICAgICAgICAg
ICAvLyBJZiB3ZSBhZGRlZCBhIG5ldyBlZGdlIGJldHdlZW4gdGhlIGFkamFjZW50VG1wIGFuZCB1
LCBpdCByZXBsYWNlcyB0aGUgZWRnZQotICAgICAgICAgICAgICAgIC8vIHRoYXQgZXhpc3RlZCB3
aXRoIHYuCi0gICAgICAgICAgICAgICAgLy8gVGhlIGRlZ3JlZSBvZiBhZGphY2VudFRtcCByZW1h
aW5zIHRoZSBzYW1lIHNpbmNlIHRoZSBlZGdlIGp1c3QgY2hhbmdlZCBmcm9tIHUgdG8gdi4KLSAg
ICAgICAgICAgICAgICAvLyBBbGwgd2UgbmVlZCB0byBkbyBpcyB1cGRhdGUgdGhlIGRlZ3JlZSBv
ZiB1LgotICAgICAgICAgICAgICAgIGlmICghaXNQcmVjb2xvcmVkKHUpKQotICAgICAgICAgICAg
ICAgICAgICBtX2RlZ3JlZXNbdV0rKzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAg
ICAgICAgLy8gSWYgd2UgYWxyZWFkeSBoYWQgYW4gZWRnZSBiZXR3ZWVuIHRoZSBhZGphY2VudFRt
cCBhbmQgdSwgdGhlIGRlZ3JlZSBvZiB1Ci0gICAgICAgICAgICAgICAgLy8gaXMgYWxyZWFkeSBj
b3JyZWN0LiBUaGUgZGVncmVlIG9mIHRoZSBhZGphY2VudFRtcCBkZWNyZWFzZXMgc2luY2UgdGhl
IGVkZ2UKLSAgICAgICAgICAgICAgICAvLyB3aXRoIHYgaXMgbm8gbG9uZ2VyIHJlbGV2YW50ICh3
ZSBjYW4gdGhpbmsgb2YgaXQgYXMgbWVyZ2VkIHdpdGggdGhlIGVkZ2Ugd2l0aCB1KS4KLSAgICAg
ICAgICAgICAgICBkZWNyZW1lbnREZWdyZWUoYWRqYWNlbnRUbXBJbmRleCk7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGlmIChtX2ZyYW1lUG9pbnRlckluZGV4ICYmIG1f
aW50ZXJmZXJlc1dpdGhGcmFtZVBvaW50ZXIucXVpY2tHZXQodikpCi0gICAgICAgICAgICBtX2lu
dGVyZmVyZXNXaXRoRnJhbWVQb2ludGVyLnF1aWNrU2V0KHUpOwogCi0gICAgICAgIGlmIChtX2Rl
Z3JlZXNbdV0gPj0gbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKSAmJiBtX2ZyZWV6ZVdvcmts
aXN0LnJlbW92ZSh1KSkKLSAgICAgICAgICAgIGFkZFRvU3BpbGwodSk7CisgICAgICAgIHJldHVy
biBtX2lzT25TZWxlY3RTdGFjay5xdWlja0dldCh0bXBJbmRleCkgfHwgISFtX2NvYWxlc2NlZFRt
cHNbdG1wSW5kZXhdOwogICAgIH0KIAogICAgIGJvb2wgY2FuQmVTYWZlbHlDb2FsZXNjZWQoSW5k
ZXhUeXBlIHUsIEluZGV4VHlwZSB2KQpAQCAtNDI5LDcgKzE5NCw3IEBAIHByaXZhdGU6CiAgICAg
ICAgIGNvbnN0IGF1dG8mIGFkamFjZW50c09mVSA9IG1fYWRqYWNlbmN5TGlzdFt1XTsKICAgICAg
ICAgY29uc3QgYXV0byYgYWRqYWNlbnRzT2ZWID0gbV9hZGphY2VuY3lMaXN0W3ZdOwogCi0gICAg
ICAgIGlmIChhZGphY2VudHNPZlUuc2l6ZSgpICsgYWRqYWNlbnRzT2ZWLnNpemUoKSA8IG1fcmVn
c0luUHJpb3JpdHlPcmRlci5zaXplKCkpIHsKKyAgICAgICAgaWYgKGFkamFjZW50c09mVS5zaXpl
KCkgKyBhZGphY2VudHNPZlYuc2l6ZSgpIDwgcmVnaXN0ZXJDb3VudCgpKSB7CiAgICAgICAgICAg
ICAvLyBTaG9ydGN1dDogaWYgdGhlIHRvdGFsIG51bWJlciBvZiBhZGphY2VudHMgaXMgbGVzcyB0
aGFuIHRoZSBudW1iZXIgb2YgcmVnaXN0ZXIsIHRoZSBjb25kaXRpb24gaXMgYWx3YXlzIG1ldC4K
ICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CkBAIC00MzksMjMgKzIwNCwyMyBA
QCBwcml2YXRlOgogICAgICAgICBmb3IgKEluZGV4VHlwZSBhZGphY2VudFRtcEluZGV4IDogYWRq
YWNlbnRzT2ZVKSB7CiAgICAgICAgICAgICBBU1NFUlQoYWRqYWNlbnRUbXBJbmRleCAhPSB2KTsK
ICAgICAgICAgICAgIEFTU0VSVChhZGphY2VudFRtcEluZGV4ICE9IHUpOwotICAgICAgICAgICAg
aWYgKCFoYXNCZWVuU2ltcGxpZmllZChhZGphY2VudFRtcEluZGV4KSAmJiBtX2RlZ3JlZXNbYWRq
YWNlbnRUbXBJbmRleF0gPj0gbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKSkgeworICAgICAg
ICAgICAgaWYgKCFoYXNCZWVuU2ltcGxpZmllZChhZGphY2VudFRtcEluZGV4KSAmJiBtX2RlZ3Jl
ZXNbYWRqYWNlbnRUbXBJbmRleF0gPj0gcmVnaXN0ZXJDb3VudCgpKSB7CiAgICAgICAgICAgICAg
ICAgYXV0byBhZGRSZXN1bHQgPSBoaWdoT3JkZXJBZGphY2VudHMuYWRkKGFkamFjZW50VG1wSW5k
ZXgpOwotICAgICAgICAgICAgICAgIGlmIChhZGRSZXN1bHQuaXNOZXdFbnRyeSAmJiBoaWdoT3Jk
ZXJBZGphY2VudHMuc2l6ZSgpID49IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkpCisgICAg
ICAgICAgICAgICAgaWYgKGFkZFJlc3VsdC5pc05ld0VudHJ5ICYmIGhpZ2hPcmRlckFkamFjZW50
cy5zaXplKCkgPj0gcmVnaXN0ZXJDb3VudCgpKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZm9yIChJbmRleFR5cGUg
YWRqYWNlbnRUbXBJbmRleCA6IGFkamFjZW50c09mVikgewogICAgICAgICAgICAgQVNTRVJUKGFk
amFjZW50VG1wSW5kZXggIT0gdSk7CiAgICAgICAgICAgICBBU1NFUlQoYWRqYWNlbnRUbXBJbmRl
eCAhPSB2KTsKLSAgICAgICAgICAgIGlmICghaGFzQmVlblNpbXBsaWZpZWQoYWRqYWNlbnRUbXBJ
bmRleCkgJiYgbV9kZWdyZWVzW2FkamFjZW50VG1wSW5kZXhdID49IG1fcmVnc0luUHJpb3JpdHlP
cmRlci5zaXplKCkpIHsKKyAgICAgICAgICAgIGlmICghaGFzQmVlblNpbXBsaWZpZWQoYWRqYWNl
bnRUbXBJbmRleCkgJiYgbV9kZWdyZWVzW2FkamFjZW50VG1wSW5kZXhdID49IHJlZ2lzdGVyQ291
bnQoKSkgewogICAgICAgICAgICAgICAgIGF1dG8gYWRkUmVzdWx0ID0gaGlnaE9yZGVyQWRqYWNl
bnRzLmFkZChhZGphY2VudFRtcEluZGV4KTsKLSAgICAgICAgICAgICAgICBpZiAoYWRkUmVzdWx0
LmlzTmV3RW50cnkgJiYgaGlnaE9yZGVyQWRqYWNlbnRzLnNpemUoKSA+PSBtX3JlZ3NJblByaW9y
aXR5T3JkZXIuc2l6ZSgpKQorICAgICAgICAgICAgICAgIGlmIChhZGRSZXN1bHQuaXNOZXdFbnRy
eSAmJiBoaWdoT3JkZXJBZGphY2VudHMuc2l6ZSgpID49IHJlZ2lzdGVyQ291bnQoKSkKICAgICAg
ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAK
LSAgICAgICAgQVNTRVJUKGhpZ2hPcmRlckFkamFjZW50cy5zaXplKCkgPCBtX3JlZ3NJblByaW9y
aXR5T3JkZXIuc2l6ZSgpKTsKKyAgICAgICAgQVNTRVJUKGhpZ2hPcmRlckFkamFjZW50cy5zaXpl
KCkgPCByZWdpc3RlckNvdW50KCkpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKQEAg
LTQ3OCwyNCArMjQzLDE1OCBAQCBwcml2YXRlOgogICAgICAgICBmb3IgKHVuc2lnbmVkIGFkamFj
ZW50VG1wSW5kZXggOiBhZGphY2VudHNPZlYpIHsKICAgICAgICAgICAgIGlmICghaXNQcmVjb2xv
cmVkKGFkamFjZW50VG1wSW5kZXgpCiAgICAgICAgICAgICAgICAgJiYgIWhhc0JlZW5TaW1wbGlm
aWVkKGFkamFjZW50VG1wSW5kZXgpCi0gICAgICAgICAgICAgICAgJiYgbV9kZWdyZWVzW2FkamFj
ZW50VG1wSW5kZXhdID49IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkKLSAgICAgICAgICAg
ICAgICAmJiAhbV9pbnRlcmZlcmVuY2VFZGdlcy5jb250YWlucyhJbnRlcmZlcmVuY2VFZGdlKHUs
IGFkamFjZW50VG1wSW5kZXgpKSkKKyAgICAgICAgICAgICAgICAmJiBtX2RlZ3JlZXNbYWRqYWNl
bnRUbXBJbmRleF0gPj0gcmVnaXN0ZXJDb3VudCgpCisgICAgICAgICAgICAgICAgJiYgIWhhc0lu
dGVyZmVyZW5jZUVkZ2UoSW50ZXJmZXJlbmNlRWRnZSh1LCBhZGphY2VudFRtcEluZGV4KSkpCiAg
ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiB0
cnVlOwogICAgIH0KIAotcHJvdGVjdGVkOgotI2lmIFBMQVRGT1JNKENPQ09BKQotI3ByYWdtYSBt
YXJrIC0KLSNlbmRpZgorICAgIEluZGV4VHlwZSBzZWxlY3RTcGlsbCgpCisgICAgeworICAgICAg
ICBpZiAoIW1faGFzU2VsZWN0ZWRTcGlsbCkgeworICAgICAgICAgICAgbV9oYXNTZWxlY3RlZFNw
aWxsID0gdHJ1ZTsKIAotICAgIC8vIEludGVyZmVyZW5jZSBlZGdlcyBhcmUgbm90IGRpcmVjdGVk
LiBBbiBlZGdlIGJldHdlZW4gYW55IHR3byBUbXBzIGlzIHJlcHJlc2VudGVkCi0gICAgLy8gYnkg
dGhlIGNvbmNhdGVuYXRlZCB2YWx1ZXMgb2YgdGhlIHNtYWxsZXN0IFRtcCBmb2xsb3dlZCBieSB0
aGUgYmlnZ2VyIFRtcC4KLSAgICBjbGFzcyBJbnRlcmZlcmVuY2VFZGdlIHsKLSAgICBwdWJsaWM6
Ci0gICAgICAgIEludGVyZmVyZW5jZUVkZ2UoKQotICAgICAgICB7CisgICAgICAgICAgICBpZiAo
bV9oYXNDb2FsZXNjZWROb25Ucml2aWFsTW92ZSkKKyAgICAgICAgICAgICAgICBtX2NvYWxlc2Nl
ZFRtcHNBdFNwaWxsID0gbV9jb2FsZXNjZWRUbXBzOworICAgICAgICB9CisKKyAgICAgICAgYXV0
byBpdGVyYXRvciA9IG1fc3BpbGxXb3JrbGlzdC5iZWdpbigpOworCisgICAgICAgIFJFTEVBU0Vf
QVNTRVJUX1dJVEhfTUVTU0FHRShpdGVyYXRvciAhPSBtX3NwaWxsV29ya2xpc3QuZW5kKCksICJz
ZWxlY3RTcGlsbCgpIGNhbGxlZCB3aGVuIHRoZXJlIHdhcyBubyBzcGlsbC4iKTsKKyAgICAgICAg
UkVMRUFTRV9BU1NFUlRfV0lUSF9NRVNTQUdFKCFtX3Vuc3BpbGxhYmxlVG1wcy5jb250YWlucygq
aXRlcmF0b3IpLCAidHJ5aW5nIHRvIHNwaWxsIHVuc3BpbGxhYmxlIHRtcCIpOworCisgICAgICAg
IC8vIEhpZ2hlciBzY29yZSBtZWFucyBtb3JlIGRlc2lyYWJsZSB0byBzcGlsbC4gTG93ZXIgc2Nv
cmVzIG1heGltaXplIHRoZSBsaWtlbGlob29kIHRoYXQgYSB0bXAKKyAgICAgICAgLy8gZ2V0cyBh
IHJlZ2lzdGVyLgorICAgICAgICBhdXRvIHNjb3JlID0gWyZdIChUbXAgdG1wKSAtPiBkb3VibGUg
eworICAgICAgICAgICAgLy8gQWlyIGV4cG9zZXMgdGhlIGNvbmNlcHQgb2YgImZhc3QgdG1wcyIs
IGFuZCB3ZSBpbnRlcnByZXQgdGhhdCB0byBtZWFuIHRoYXQgdGhlIHRtcAorICAgICAgICAgICAg
Ly8gc2hvdWxkIGFsd2F5cyBiZSBpbiBhIHJlZ2lzdGVyLgorICAgICAgICAgICAgaWYgKG1fY29k
ZS5pc0Zhc3RUbXAodG1wKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAg
IAorICAgICAgICAgICAgLy8gQWxsIGVsc2UgYmVpbmcgZXF1YWwsIHRoZSBzY29yZSBzaG91bGQg
YmUgZGlyZWN0bHkgcmVsYXRlZCB0byB0aGUgZGVncmVlLgorICAgICAgICAgICAgZG91YmxlIGRl
Z3JlZSA9IHN0YXRpY19jYXN0PGRvdWJsZT4obV9kZWdyZWVzW1RtcE1hcHBlcjo6YWJzb2x1dGVJ
bmRleCh0bXApXSk7CisKKyAgICAgICAgICAgIC8vIEFsbCBlbHNlIGJlaW5nIGVxdWFsLCB0aGUg
c2NvcmUgc2hvdWxkIGJlIGludmVyc2VseSByZWxhdGVkIHRvIHRoZSBudW1iZXIgb2Ygd2FybSB1
c2VzIGFuZAorICAgICAgICAgICAgLy8gZGVmcy4KKyAgICAgICAgICAgIGNvbnN0IFVzZUNvdW50
czxUbXA+OjpDb3VudHMqIGNvdW50cyA9IG1fdXNlQ291bnRzW3RtcF07CisgICAgICAgICAgICBp
ZiAoIWNvdW50cykKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxk
b3VibGU+OjppbmZpbml0eSgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBkb3VibGUgdXNl
cyA9IGNvdW50cy0+bnVtV2FybVVzZXMgKyBjb3VudHMtPm51bURlZnM7CisKKyAgICAgICAgICAg
IC8vIElmIGl0J3MgYSBjb25zdGFudCwgdGhlbiBpdCdzIG5vdCBhcyBiYWQgdG8gc3BpbGwuIFdl
IGNhbiByZW1hdGVyaWFsaXplIGl0IGluIG1hbnkKKyAgICAgICAgICAgIC8vIGNhc2VzLgorICAg
ICAgICAgICAgaWYgKGNvdW50cy0+bnVtQ29uc3REZWZzID09IDEgJiYgY291bnRzLT5udW1EZWZz
ID09IDEpCisgICAgICAgICAgICAgICAgdXNlcyAvPSAyOworCisgICAgICAgICAgICByZXR1cm4g
ZGVncmVlIC8gdXNlczsKKyAgICAgICAgfTsKKworICAgICAgICBhdXRvIHZpY3RpbUl0ZXJhdG9y
ID0gaXRlcmF0b3I7CisgICAgICAgIGRvdWJsZSBtYXhTY29yZSA9IHNjb3JlKFRtcE1hcHBlcjo6
dG1wRnJvbUFic29sdXRlSW5kZXgoKml0ZXJhdG9yKSk7CisKKyAgICAgICAgKytpdGVyYXRvcjsK
KyAgICAgICAgZm9yICg7aXRlcmF0b3IgIT0gbV9zcGlsbFdvcmtsaXN0LmVuZCgpOyArK2l0ZXJh
dG9yKSB7CisgICAgICAgICAgICBkb3VibGUgdG1wU2NvcmUgPSBzY29yZShUbXBNYXBwZXI6OnRt
cEZyb21BYnNvbHV0ZUluZGV4KCppdGVyYXRvcikpOworICAgICAgICAgICAgaWYgKHRtcFNjb3Jl
ID4gbWF4U2NvcmUpIHsKKyAgICAgICAgICAgICAgICBBU1NFUlQoIW1fdW5zcGlsbGFibGVUbXBz
LmNvbnRhaW5zKCppdGVyYXRvcikpOworICAgICAgICAgICAgICAgIHZpY3RpbUl0ZXJhdG9yID0g
aXRlcmF0b3I7CisgICAgICAgICAgICAgICAgbWF4U2NvcmUgPSB0bXBTY29yZTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEluZGV4VHlwZSB2aWN0aW1JbmRleCA9ICp2aWN0
aW1JdGVyYXRvcjsKKyAgICAgICAgaWYgKHRyYWNlRGVidWcpCisgICAgICAgICAgICBkYXRhTG9n
TG4oIlNlbGVjdGluZyBzcGlsbCAiLCB2aWN0aW1JbmRleCk7CisgICAgICAgIEFTU0VSVCghaXNQ
cmVjb2xvcmVkKHZpY3RpbUluZGV4KSk7CisgICAgICAgIHJldHVybiB2aWN0aW1JbmRleDsKKyAg
ICB9CisKKyAgICB2b2lkIGFzc2lnbkNvbG9ycygpCisgICAgeworICAgICAgICBBU1NFUlQobV9z
aW1wbGlmeVdvcmtsaXN0LmlzRW1wdHkoKSk7CisgICAgICAgIEFTU0VSVCghbV9zcGlsbFdvcmts
aXN0LmJpdENvdW50KCkpOworCisgICAgICAgIC8vIFJlY2xhaW0gYXMgbXVjaCBtZW1vcnkgYXMg
cG9zc2libGUuCisgICAgICAgIG1faW50ZXJmZXJlbmNlRWRnZXMuY2xlYXIoKTsKKworICAgICAg
ICBtX2RlZ3JlZXMuY2xlYXIoKTsKKyAgICAgICAgbV9tb3ZlTGlzdC5jbGVhcigpOworICAgICAg
ICBtX3NpbXBsaWZ5V29ya2xpc3QuY2xlYXIoKTsKKyAgICAgICAgbV9zcGlsbFdvcmtsaXN0LmNs
ZWFyQWxsKCk7CisKKyAgICAgICAgLy8gVHJ5IHRvIGNvbG9yIHRoZSBUbXAgb24gdGhlIHN0YWNr
LgorICAgICAgICBtX2NvbG9yZWRUbXAucmVzaXplKG1fYWRqYWNlbmN5TGlzdC5zaXplKCkpOwor
CisgICAgICAgIHdoaWxlICghbV9zZWxlY3RTdGFjay5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAg
IHVuc2lnbmVkIHRtcEluZGV4ID0gbV9zZWxlY3RTdGFjay50YWtlTGFzdCgpOworICAgICAgICAg
ICAgbV9pc09uU2VsZWN0U3RhY2sucXVpY2tDbGVhcih0bXBJbmRleCk7CisgICAgICAgICAgICBB
U1NFUlQoIWlzUHJlY29sb3JlZCh0bXBJbmRleCkpOworICAgICAgICAgICAgQVNTRVJUKCFtX2Nv
bG9yZWRUbXBbdG1wSW5kZXhdKTsKKyAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJUKGdldEFsaWFz
KHRtcEluZGV4KSA9PSB0bXBJbmRleCk7CisKKyAgICAgICAgICAgIFJlZ2lzdGVyU2V0IGNvbG9y
ZWRSZWdpc3RlcnM7CisgICAgICAgICAgICBmb3IgKEluZGV4VHlwZSBhZGphY2VudFRtcEluZGV4
IDogbV9hZGphY2VuY3lMaXN0W3RtcEluZGV4XSkgeworICAgICAgICAgICAgICAgIEluZGV4VHlw
ZSBhbGlhc1RtcEluZGV4ID0gZ2V0QWxpYXMoYWRqYWNlbnRUbXBJbmRleCk7CisgICAgICAgICAg
ICAgICAgUmVnIHJlZyA9IG1fY29sb3JlZFRtcFthbGlhc1RtcEluZGV4XTsKKworICAgICAgICAg
ICAgICAgIEFTU0VSVCghaXNQcmVjb2xvcmVkKGFsaWFzVG1wSW5kZXgpIHx8IChpc1ByZWNvbG9y
ZWQoYWxpYXNUbXBJbmRleCkgJiYgcmVnKSk7CisKKyAgICAgICAgICAgICAgICBpZiAocmVnKQor
ICAgICAgICAgICAgICAgICAgICBjb2xvcmVkUmVnaXN0ZXJzLnNldChyZWcpOworICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICBib29sIGNvbG9yQXNzaWduZWQgPSBmYWxzZTsKKyAgICAgICAg
ICAgIGZvciAoUmVnIHJlZyA6IG1fcmVnc0luUHJpb3JpdHlPcmRlcikgeworICAgICAgICAgICAg
ICAgIGlmICghY29sb3JlZFJlZ2lzdGVycy5nZXQocmVnKSkgeworICAgICAgICAgICAgICAgICAg
ICBtX2NvbG9yZWRUbXBbdG1wSW5kZXhdID0gcmVnOworICAgICAgICAgICAgICAgICAgICBjb2xv
ckFzc2lnbmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWNvbG9yQXNzaWduZWQp
CisgICAgICAgICAgICAgICAgbV9zcGlsbGVkVG1wcy5hcHBlbmQodG1wSW5kZXgpOworICAgICAg
ICB9CisKKyAgICAgICAgbV9zZWxlY3RTdGFjay5jbGVhcigpOworCisgICAgICAgIGlmIChtX3Nw
aWxsZWRUbXBzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIG1fY29hbGVzY2VkVG1wc0F0U3BpbGwu
Y2xlYXIoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbV9jb2xvcmVkVG1wLmNsZWFyKCk7
CisgICAgfQorCisgICAgdm9pZCBkdW1wSW50ZXJmZXJlbmNlR3JhcGhJbkRvdChQcmludFN0cmVh
bSYgb3V0KQorICAgIHsKKyAgICAgICAgb3V0LnByaW50KCJncmFwaCBJbnRlcmZlcmVuY2VHcmFw
aCB7IFxuIik7CisKKyAgICAgICAgSGFzaFNldDxUbXA+IHRtcHNXaXRoSW50ZXJmZXJlbmNlczsK
KyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBlZGdlIDogbV9pbnRlcmZlcmVuY2VFZGdlcykgewor
ICAgICAgICAgICAgdG1wc1dpdGhJbnRlcmZlcmVuY2VzLmFkZChUbXBNYXBwZXI6OnRtcEZyb21B
YnNvbHV0ZUluZGV4KGVkZ2UuZmlyc3QoKSkpOworICAgICAgICAgICAgdG1wc1dpdGhJbnRlcmZl
cmVuY2VzLmFkZChUbXBNYXBwZXI6OnRtcEZyb21BYnNvbHV0ZUluZGV4KGVkZ2Uuc2Vjb25kKCkp
KTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoY29uc3QgYXV0byYgdG1wIDogdG1wc1dpdGhJ
bnRlcmZlcmVuY2VzKSB7CisgICAgICAgICAgICB1bnNpZ25lZCB0bXBJbmRleCA9IFRtcE1hcHBl
cjo6YWJzb2x1dGVJbmRleCh0bXApOworICAgICAgICAgICAgaWYgKHRtcEluZGV4IDwgbV9kZWdy
ZWVzLnNpemUoKSkKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiAgICAiLCB0bXAuaW50ZXJu
YWxWYWx1ZSgpLCAiIFtsYWJlbD1cIiIsIHRtcCwgIiAoIiwgbV9kZWdyZWVzW3RtcEluZGV4XSwg
IilcIl07XG4iKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQo
IiAgICAiLCB0bXAuaW50ZXJuYWxWYWx1ZSgpLCAiIFtsYWJlbD1cIiIsIHRtcCwgIlwiXTtcbiIp
OworICAgICAgICB9CisKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBlZGdlIDogbV9pbnRlcmZl
cmVuY2VFZGdlcykKKyAgICAgICAgICAgIG91dC5wcmludCgiICAgICIsIGVkZ2UuZmlyc3QoKSwg
IiAtLSAiLCBlZGdlLnNlY29uZCgpLCAiO1xuIik7CisgICAgICAgIG91dC5wcmludCgifVxuIik7
CisgICAgfQorCisgICAgLy8gSW50ZXJmZXJlbmNlIGVkZ2VzIGFyZSBub3QgZGlyZWN0ZWQuIEFu
IGVkZ2UgYmV0d2VlbiBhbnkgdHdvIFRtcHMgaXMgcmVwcmVzZW50ZWQKKyAgICAvLyBieSB0aGUg
Y29uY2F0ZW5hdGVkIHZhbHVlcyBvZiB0aGUgc21hbGxlc3QgVG1wIGZvbGxvd2VkIGJ5IHRoZSBi
aWdnZXIgVG1wLgorICAgIGNsYXNzIEludGVyZmVyZW5jZUVkZ2UgeworICAgIHB1YmxpYzoKKyAg
ICAgICAgSW50ZXJmZXJlbmNlRWRnZSgpCisgICAgICAgIHsKICAgICAgICAgfQogCiAgICAgICAg
IEludGVyZmVyZW5jZUVkZ2UoSW5kZXhUeXBlIGEsIEluZGV4VHlwZSBiKQpAQCAtNTQ4LDYgKzQ0
NywxNiBAQCBwcm90ZWN0ZWQ6CiAgICAgICAgIHVpbnQ2NF90IG1fdmFsdWUgeyAwIH07CiAgICAg
fTsKIAorICAgIGJvb2wgYWRkSW50ZXJmZXJlbmNlRWRnZShJbnRlcmZlcmVuY2VFZGdlIGVkZ2Up
CisgICAgeworICAgICAgICByZXR1cm4gbV9pbnRlcmZlcmVuY2VFZGdlcy5hZGQoZWRnZSkuaXNO
ZXdFbnRyeTsKKyAgICB9CisKKyAgICBib29sIGhhc0ludGVyZmVyZW5jZUVkZ2UoSW50ZXJmZXJl
bmNlRWRnZSBlZGdlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1faW50ZXJmZXJlbmNlRWRnZXMu
Y29udGFpbnMoZWRnZSk7CisgICAgfQorCiAgICAgc3RydWN0IEludGVyZmVyZW5jZUVkZ2VIYXNo
IHsKICAgICAgICAgc3RhdGljIHVuc2lnbmVkIGhhc2goY29uc3QgSW50ZXJmZXJlbmNlRWRnZSYg
a2V5KSB7IHJldHVybiBrZXkuaGFzaCgpOyB9CiAgICAgICAgIHN0YXRpYyBib29sIGVxdWFsKGNv
bnN0IEludGVyZmVyZW5jZUVkZ2UmIGEsIGNvbnN0IEludGVyZmVyZW5jZUVkZ2UmIGIpIHsgcmV0
dXJuIGEgPT0gYjsgfQpAQCAtNTU1LDM5ICs0NjQsNzA1IEBAIHByb3RlY3RlZDoKICAgICB9Owog
ICAgIHR5cGVkZWYgU2ltcGxlQ2xhc3NIYXNoVHJhaXRzPEludGVyZmVyZW5jZUVkZ2U+IEludGVy
ZmVyZW5jZUVkZ2VIYXNoVHJhaXRzOwogCi0gICAgY29uc3QgVmVjdG9yPFJlZz4mIG1fcmVnc0lu
UHJpb3JpdHlPcmRlcjsKLSAgICBSZWdpc3RlclNldCBtX211dGFibGVSZWdzOwotICAgIEluZGV4
VHlwZSBtX2xhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleCB7IDAgfTsKKyAgICBjb25zdCBWZWN0
b3I8UmVnPiYgbV9yZWdzSW5Qcmlvcml0eU9yZGVyOworICAgIFJlZ2lzdGVyU2V0IG1fbXV0YWJs
ZVJlZ3M7CisgICAgSW5kZXhUeXBlIG1fbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4IHsgMCB9
OworCisgICAgLy8gVGhlIGludGVyZmVyZW5jZSBncmFwaC4KKyAgICBIYXNoU2V0PEludGVyZmVy
ZW5jZUVkZ2UsIEludGVyZmVyZW5jZUVkZ2VIYXNoLCBJbnRlcmZlcmVuY2VFZGdlSGFzaFRyYWl0
cz4gbV9pbnRlcmZlcmVuY2VFZGdlczsKKworICAgIFZlY3RvcjxWZWN0b3I8SW5kZXhUeXBlLCAw
LCBVbnNhZmVWZWN0b3JPdmVyZmxvdywgND4sIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX2Fk
amFjZW5jeUxpc3Q7CisgICAgVmVjdG9yPEluZGV4VHlwZSwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZs
b3c+IG1fZGVncmVlczsKKworICAgIC8vIEluc3RlYWQgb2Yga2VlcGluZyB0cmFjayBvZiB0aGUg
bW92ZSBpbnN0cnVjdGlvbnMsIHdlIGp1c3Qga2VlcCB0aGVpciBvcGVyYW5kcyBhcm91bmQgYW5k
IHVzZSB0aGUgaW5kZXgKKyAgICAvLyBpbiB0aGUgdmVjdG9yIGFzIHRoZSAiaWRlbnRpZmllciIg
Zm9yIHRoZSBtb3ZlLgorICAgIHN0cnVjdCBNb3ZlT3BlcmFuZHMgeworICAgICAgICBJbmRleFR5
cGUgc3JjSW5kZXg7CisgICAgICAgIEluZGV4VHlwZSBkc3RJbmRleDsKKyAgICB9OworICAgIFZl
Y3RvcjxNb3ZlT3BlcmFuZHMsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX2NvYWxlc2NpbmdD
YW5kaWRhdGVzOworCisgICAgLy8gTGlzdCBvZiBldmVyeSBtb3ZlIGluc3RydWN0aW9uIGFzc29j
aWF0ZWQgd2l0aCBhIFRtcC4KKyAgICBWZWN0b3I8SGFzaFNldDxJbmRleFR5cGUsIHR5cGVuYW1l
IERlZmF1bHRIYXNoPEluZGV4VHlwZT46Okhhc2gsIFdURjo6VW5zaWduZWRXaXRoWmVyb0tleUhh
c2hUcmFpdHM8SW5kZXhUeXBlPj4+IG1fbW92ZUxpc3Q7CisKKyAgICAvLyBDb2xvcnMuCisgICAg
VmVjdG9yPFJlZywgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fY29sb3JlZFRtcDsKKyAgICBW
ZWN0b3I8SW5kZXhUeXBlPiBtX3NwaWxsZWRUbXBzOworCisgICAgLy8gVmFsdWVzIHRoYXQgaGF2
ZSBiZWVuIGNvYWxlc2NlZCB3aXRoIGFuIG90aGVyIHZhbHVlLgorICAgIFZlY3RvcjxJbmRleFR5
cGUsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX2NvYWxlc2NlZFRtcHM7CisKKyAgICAvLyBU
aGUgc3RhY2sgb2YgVG1wIHJlbW92ZWQgZnJvbSB0aGUgZ3JhcGggYW5kIHJlYWR5IGZvciBjb2xv
cmluZy4KKyAgICBCaXRWZWN0b3IgbV9pc09uU2VsZWN0U3RhY2s7CisgICAgVmVjdG9yPEluZGV4
VHlwZT4gbV9zZWxlY3RTdGFjazsKKworICAgIEluZGV4VHlwZSBtX2ZyYW1lUG9pbnRlckluZGV4
IHsgMCB9OworICAgIEJpdFZlY3RvciBtX2ludGVyZmVyZXNXaXRoRnJhbWVQb2ludGVyOworICAg
IC8vIExvdy1kZWdyZWUsIG5vbi1Nb3ZlIHJlbGF0ZWQuCisgICAgVmVjdG9yPEluZGV4VHlwZT4g
bV9zaW1wbGlmeVdvcmtsaXN0OworICAgIC8vIEhpZ2gtZGVncmVlIFRtcC4KKyAgICBCaXRWZWN0
b3IgbV9zcGlsbFdvcmtsaXN0OworCisgICAgYm9vbCBtX2hhc1NlbGVjdGVkU3BpbGwgeyBmYWxz
ZSB9OworICAgIGJvb2wgbV9oYXNDb2FsZXNjZWROb25Ucml2aWFsTW92ZSB7IGZhbHNlIH07CisK
KyAgICAvLyBUaGUgbWFwcGluZyBvZiBUbXAgdG8gdGhlaXIgYWxpYXMgZm9yIE1vdmVzIHRoYXQg
YXJlIGFsd2F5cyBjb2FsZXNjaW5nIHJlZ2FyZGxlc3Mgb2Ygc3BpbGxpbmcuCisgICAgVmVjdG9y
PEluZGV4VHlwZSwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fY29hbGVzY2VkVG1wc0F0U3Bp
bGw7CisKKyAgICBjb25zdCBIYXNoU2V0PHVuc2lnbmVkPiYgbV91bnNwaWxsYWJsZVRtcHM7Cisg
ICAgY29uc3QgVXNlQ291bnRzPFRtcD4mIG1fdXNlQ291bnRzOworICAgIENvZGUmIG1fY29kZTsK
K307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbmRleFR5cGUsIHR5cGVuYW1lIFRtcE1hcHBlcj4K
K2NsYXNzIEJyaWdncyA6IHB1YmxpYyBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yPEluZGV4VHlw
ZSwgVG1wTWFwcGVyPiB7CisgICAgdXNpbmcgQmFzZSA9IEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0
b3I8SW5kZXhUeXBlLCBUbXBNYXBwZXI+OworcHJvdGVjdGVkOgorICAgIHVzaW5nIEJhc2U6Om1f
aXNPblNlbGVjdFN0YWNrOworICAgIHVzaW5nIEJhc2U6Om1fc2VsZWN0U3RhY2s7CisgICAgdXNp
bmcgQmFzZTo6bV9mcmFtZVBvaW50ZXJJbmRleDsKKyAgICB1c2luZyBCYXNlOjptX2ludGVyZmVy
ZXNXaXRoRnJhbWVQb2ludGVyOworICAgIHVzaW5nIEJhc2U6Om1fc2ltcGxpZnlXb3JrbGlzdDsK
KyAgICB1c2luZyBCYXNlOjptX3NwaWxsV29ya2xpc3Q7CisgICAgdXNpbmcgQmFzZTo6bV9oYXNT
ZWxlY3RlZFNwaWxsOworICAgIHVzaW5nIEJhc2U6Om1faGFzQ29hbGVzY2VkTm9uVHJpdmlhbE1v
dmU7CisgICAgdXNpbmcgQmFzZTo6bV9kZWdyZWVzOworICAgIHVzaW5nIEJhc2U6OnJlZ2lzdGVy
Q291bnQ7CisgICAgdXNpbmcgQmFzZTo6bV9jb2FsZXNjZWRUbXBzOworICAgIHVzaW5nIEJhc2U6
Om1fbW92ZUxpc3Q7CisgICAgdXNpbmcgQmFzZTo6bV91c2VDb3VudHM7CisgICAgdXNpbmcgQmFz
ZTo6bV9jb2FsZXNjZWRUbXBzQXRTcGlsbDsKKyAgICB1c2luZyBCYXNlOjptX3NwaWxsZWRUbXBz
OworICAgIHVzaW5nIHR5cGVuYW1lIEJhc2U6Ok1vdmVPcGVyYW5kczsKKyAgICB1c2luZyBCYXNl
OjptX2NvYWxlc2NpbmdDYW5kaWRhdGVzOworICAgIHVzaW5nIEJhc2U6Om1fbGFzdFByZWNvbG9y
ZWRSZWdpc3RlckluZGV4OworICAgIHVzaW5nIEJhc2U6Om1fY29sb3JlZFRtcDsKKyAgICB1c2lu
ZyBCYXNlOjptX2NvZGU7CisgICAgdXNpbmcgdHlwZW5hbWUgQmFzZTo6SW50ZXJmZXJlbmNlRWRn
ZTsKKyAgICB1c2luZyBCYXNlOjptX3Vuc3BpbGxhYmxlVG1wczsKKyAgICB1c2luZyBCYXNlOjpo
YXNJbnRlcmZlcmVuY2VFZGdlOworICAgIHVzaW5nIEJhc2U6OmdldEFsaWFzOworICAgIHVzaW5n
IEJhc2U6OmFkZEVkZ2U7CisgICAgdXNpbmcgQmFzZTo6aXNQcmVjb2xvcmVkOworICAgIHVzaW5n
IEJhc2U6OmNhbkJlU2FmZWx5Q29hbGVzY2VkOworICAgIHVzaW5nIEJhc2U6OmFkZEVkZ2VEaXN0
aW5jdFdpdGhvdXREZWdyZWVDaGFuZ2U7CisgICAgdXNpbmcgQmFzZTo6Zm9yRWFjaEFkamFjZW50
OworICAgIHVzaW5nIEJhc2U6Omhhc0JlZW5TaW1wbGlmaWVkOworICAgIHVzaW5nIEJhc2U6OmFk
ZFRvU3BpbGw7CisgICAgdXNpbmcgQmFzZTo6bV9pbnRlcmZlcmVuY2VFZGdlczsKKworcHVibGlj
OgorICAgIEJyaWdncyhDb2RlJiBjb2RlLCBjb25zdCBWZWN0b3I8UmVnPiYgcmVnc0luUHJpb3Jp
dHlPcmRlciwgSW5kZXhUeXBlIGxhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleCwgdW5zaWduZWQg
dG1wQXJyYXlTaXplLCBjb25zdCBIYXNoU2V0PHVuc2lnbmVkPiYgdW5zcGlsbGFibGVUbXBzLCBj
b25zdCBVc2VDb3VudHM8VG1wPiYgdXNlQ291bnRzKQorICAgICAgICA6IEJhc2UoY29kZSwgcmVn
c0luUHJpb3JpdHlPcmRlciwgbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4LCB0bXBBcnJheVNp
emUsIHVuc3BpbGxhYmxlVG1wcywgdXNlQ291bnRzKQorICAgIHsKKyAgICB9CisKKyAgICB2b2lk
IGFsbG9jYXRlKCkKKyAgICB7CisgICAgICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOworCisgICAg
ICAgIGF1dG8gY29hbGVzY2VNb3ZlID0gWyZdICh1bnNpZ25lZCYgbW92ZSkgeworICAgICAgICAg
ICAgYm9vbCBjb2FsZXNjZWQgPSBjb2FsZXNjZShtb3ZlKTsKKyAgICAgICAgICAgIGlmIChjb2Fs
ZXNjZWQpIHsKKyAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAg
ICAvLyBXZSB3b24ndCBuZWVkIHRvIGhhbmRsZSB0aGlzIG1vdmUgaW4gdGhlIGZ1dHVyZSBzaW5j
ZSBpdCdzIGFscmVhZHkgY29hbGVzY2VkLgorICAgICAgICAgICAgICAgIG1vdmUgPSBVSU5UX01B
WDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICAvLyBXZSBmaXJzdCBjb2Fs
ZXNjZSB1bnRpbCB3ZSBjYW4ndCBjb2FsZXNjZSBhbnkgbW9yZS4KKyAgICAgICAgZG8geworICAg
ICAgICAgICAgY2hhbmdlZCA9IGZhbHNlOworICAgICAgICAgICAgbV93b3JrbGlzdE1vdmVzLmZv
ckVhY2hNb3ZlKGNvYWxlc2NlTW92ZSk7CisgICAgICAgIH0gd2hpbGUgKGNoYW5nZWQpOworICAg
ICAgICBkbyB7CisgICAgICAgICAgICBjaGFuZ2VkID0gZmFsc2U7CisgICAgICAgICAgICBtX3dv
cmtsaXN0TW92ZXMuZm9yRWFjaExvd1ByaW9yaXR5TW92ZShjb2FsZXNjZU1vdmUpOworICAgICAg
ICB9IHdoaWxlIChjaGFuZ2VkKTsKKworICAgICAgICAvLyBUaGVuIHdlIGNyZWF0ZSBvdXIgc2Vs
ZWN0IHN0YWNrLiBUaGUgaW52YXJpYW50IHdlIHN0YXJ0IHdpdGggaGVyZSBpcyB0aGF0IG5vZGVz
IGluCisgICAgICAgIC8vIHRoZSBpbnRlcmZlcmVuY2UgZ3JhcGggd2l0aCBkZWdyZWUgPj0gayBh
cmUgb24gdGhlIHNwaWxsIGxpc3QuIE5vZGVzIHdpdGggZGVncmVlIDwgaworICAgICAgICAvLyBh
cmUgb24gdGhlIHNpbXBsaWZ5IHdvcmtsaXN0LiBBIG5vZGUgY2FuIG1vdmUgZnJvbSB0aGUgc3Bp
bGwgbGlzdCB0byB0aGUgc2ltcGxpZnkKKyAgICAgICAgLy8gbGlzdCAoYnV0IG5vdCB0aGUgb3Ro
ZXIgd2F5IGFyb3VuZCwgbm90ZSB0aGF0IHRoaXMgaXMgZGlmZmVyZW50IHRoYW4gSVJDIGJlY2F1
c2UgSVJDCisgICAgICAgIC8vIHJ1bnMgdGhpcyB3aGlsZSBjb2FsZXNjaW5nLCBidXQgd2UgZG8g
YWxsIG91ciBjb2FsZXNjaW5nIGJlZm9yZSB0aGlzKS4gT25jZSBhIG5vZGUgaXMKKyAgICAgICAg
Ly8gYWRkZWQgdG8gdGhlIHNlbGVjdCBzdGFjaywgaXQncyBub3Qgb24gZWl0aGVyIGxpc3QsIGJ1
dCBvbmx5IG9uIHRoZSBzZWxlY3Qgc3RhY2suCisgICAgICAgIC8vIE9uY2Ugb24gdGhlIHNlbGVj
dCBzdGFjaywgbG9naWNhbGx5LCBpdCdzIG5vIGxvbmdlciBpbiB0aGUgaW50ZXJmZXJlbmNlIGdy
YXBoLgorICAgICAgICBhdXRvIGFzc2VydEludmFyaWFudHMgPSBbJl0gKCkgeworICAgICAgICAg
ICAgaWYgKEFTU0VSVF9ESVNBQkxFRCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAg
ICAgICAgIEluZGV4VHlwZSBmaXJzdE5vblJlZ0luZGV4ID0gbV9sYXN0UHJlY29sb3JlZFJlZ2lz
dGVySW5kZXggKyAxOworICAgICAgICAgICAgdW5zaWduZWQgcmVnaXN0ZXJDb3VudCA9IHRoaXMt
PnJlZ2lzdGVyQ291bnQoKTsKKyAgICAgICAgICAgIGZvciAoSW5kZXhUeXBlIGkgPSBmaXJzdE5v
blJlZ0luZGV4OyBpIDwgbV9kZWdyZWVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAg
aWYgKGdldEFsaWFzKGkpICE9IGkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAg
ICAgICAgICAgICAgIGlmIChtX2lzT25TZWxlY3RTdGFjay5jb250YWlucyhpKSkgeworICAgICAg
ICAgICAgICAgICAgICBBU1NFUlQoIW1fc2ltcGxpZnlXb3JrbGlzdC5jb250YWlucyhpKSAmJiAh
bV9zcGlsbFdvcmtsaXN0LmNvbnRhaW5zKGkpKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGlu
dWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHVuc2lnbmVkIGRlZ3JlZSA9
IG1fZGVncmVlc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAoZGVncmVlID49IHJlZ2lzdGVyQ291
bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgQVNTRVJUKG1fdW5zcGlsbGFibGVUbXBzLmNvbnRh
aW5zKGkpIHx8IG1fc3BpbGxXb3JrbGlzdC5jb250YWlucyhpKSk7CisgICAgICAgICAgICAgICAg
ICAgIEFTU0VSVCghbV9zaW1wbGlmeVdvcmtsaXN0LmNvbnRhaW5zKGkpKTsKKyAgICAgICAgICAg
ICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFT
U0VSVChtX3NpbXBsaWZ5V29ya2xpc3QuY29udGFpbnMoaSkpOworICAgICAgICAgICAgfQorICAg
ICAgICB9OworCisgICAgICAgIG1ha2VJbml0aWFsV29ya2xpc3QoKTsKKyAgICAgICAgYXNzZXJ0
SW52YXJpYW50cygpOworICAgICAgICBkbyB7CisgICAgICAgICAgICBjaGFuZ2VkID0gZmFsc2U7
CisKKyAgICAgICAgICAgIHdoaWxlIChtX3NpbXBsaWZ5V29ya2xpc3Quc2l6ZSgpKSB7CisgICAg
ICAgICAgICAgICAgc2ltcGxpZnkoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRJbnZhcmlhbnRz
KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtX3NwaWxsV29ya2xpc3QuYml0
Q291bnQoKSkgeworICAgICAgICAgICAgICAgIHNlbGVjdFNwaWxsKCk7CisgICAgICAgICAgICAg
ICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgQVNTRVJUKG1fc2ltcGxpZnlXb3Jr
bGlzdC5zaXplKCkgPT0gMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKGNoYW5n
ZWQpOworCisgICAgICAgIGlmICghQVNTRVJUX0RJU0FCTEVEKSB7CisgICAgICAgICAgICBBU1NF
UlQoIW1fc2ltcGxpZnlXb3JrbGlzdC5zaXplKCkpOworICAgICAgICAgICAgQVNTRVJUKCFtX3Nw
aWxsV29ya2xpc3QuYml0Q291bnQoKSk7CisgICAgICAgICAgICBJbmRleFR5cGUgZmlyc3ROb25S
ZWdJbmRleCA9IG1fbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4ICsgMTsKKyAgICAgICAgICAg
IGZvciAoSW5kZXhUeXBlIGkgPSBmaXJzdE5vblJlZ0luZGV4OyBpIDwgbV9kZWdyZWVzLnNpemUo
KTsgKytpKQorICAgICAgICAgICAgICAgIEFTU0VSVChoYXNCZWVuU2ltcGxpZmllZChpKSk7Cisg
ICAgICAgIH0KKworICAgICAgICBhc3NpZ25Db2xvcnMoKTsKKyAgICB9CisKK3Byb3RlY3RlZDoK
KyAgICAKKyAgICBib29sIGNvYWxlc2NlKHVuc2lnbmVkJiBtb3ZlSW5kZXgpCisgICAgeworICAg
ICAgICBjb25zdCBNb3ZlT3BlcmFuZHMmIG1vdmVPcGVyYW5kcyA9IG1fY29hbGVzY2luZ0NhbmRp
ZGF0ZXNbbW92ZUluZGV4XTsKKyAgICAgICAgSW5kZXhUeXBlIHUgPSBnZXRBbGlhcyhtb3ZlT3Bl
cmFuZHMuc3JjSW5kZXgpOworICAgICAgICBJbmRleFR5cGUgdiA9IGdldEFsaWFzKG1vdmVPcGVy
YW5kcy5kc3RJbmRleCk7CisKKyAgICAgICAgaWYgKGlzUHJlY29sb3JlZCh2KSkKKyAgICAgICAg
ICAgIHN0ZDo6c3dhcCh1LCB2KTsKKworICAgICAgICBpZiAodHJhY2VEZWJ1ZykKKyAgICAgICAg
ICAgIGRhdGFMb2coIkNvYWxlc2NpbmcgbW92ZSBhdCBpbmRleCAiLCBtb3ZlSW5kZXgsICIgdSA9
ICIsIFRtcE1hcHBlcjo6dG1wRnJvbUFic29sdXRlSW5kZXgodSksICIgdiA9ICIsIFRtcE1hcHBl
cjo6dG1wRnJvbUFic29sdXRlSW5kZXgodiksICIgICAgIik7CisKKyAgICAgICAgaWYgKHUgPT0g
dikgeworICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpCisgICAgICAgICAgICAgICAgZGF0YUxv
ZygiQWxyZWFkeSBDb2FsZXNjZWQuIFRoZXkncmUgZXF1YWwuXG4iKTsKKyAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc1ByZWNvbG9yZWQodikKKyAg
ICAgICAgICAgIHx8IGhhc0ludGVyZmVyZW5jZUVkZ2UoSW50ZXJmZXJlbmNlRWRnZSh1LCB2KSkK
KyAgICAgICAgICAgIHx8ICh1ID09IG1fZnJhbWVQb2ludGVySW5kZXggJiYgbV9pbnRlcmZlcmVz
V2l0aEZyYW1lUG9pbnRlci5xdWlja0dldCh2KSkpIHsKKworICAgICAgICAgICAgLy8gTm8gbmVl
ZCB0byBldmVyIGNvbnNpZGVyIHRoaXMgbW92ZSBhZ2FpbiBpZiBpdCBpbnRlcmZlcmVzLgorICAg
ICAgICAgICAgLy8gTm8gY29hbGVzY2luZyB3aWxsIHJlbW92ZSB0aGUgaW50ZXJmZXJlbmNlLgor
ICAgICAgICAgICAgbW92ZUluZGV4ID0gVUlOVF9NQVg7CisKKyAgICAgICAgICAgIGlmICghQVNT
RVJUX0RJU0FCTEVEKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzUHJlY29sb3JlZCh2KSkKKyAg
ICAgICAgICAgICAgICAgICAgQVNTRVJUKGlzUHJlY29sb3JlZCh1KSk7CisgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQorICAgICAgICAgICAgICAgIGRhdGFMb2co
IkNvbnN0cmFpbmVkXG4iKTsKKworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9
CisgICAgICAgIAorICAgICAgICBpZiAoY2FuQmVTYWZlbHlDb2FsZXNjZWQodSwgdikpIHsKKyAg
ICAgICAgICAgIGNvbWJpbmUodSwgdik7CisgICAgICAgICAgICBtX2hhc0NvYWxlc2NlZE5vblRy
aXZpYWxNb3ZlID0gdHJ1ZTsKKworICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpCisgICAgICAg
ICAgICAgICAgZGF0YUxvZygiICAgIFNhZmUgQ29hbGVzY2luZ1xuIik7CisgICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0cmFjZURlYnVnKQorICAgICAg
ICAgICAgZGF0YUxvZygiICAgIEZhaWxlZCBjb2FsZXNjaW5nLlxuIik7CisKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgIH0KKworICAgIHZvaWQgY29tYmluZShJbmRleFR5cGUgdSwgSW5kZXhU
eXBlIHYpCisgICAgeworICAgICAgICBBU1NFUlQoIW1fY29hbGVzY2VkVG1wc1t2XSk7CisgICAg
ICAgIG1fY29hbGVzY2VkVG1wc1t2XSA9IHU7CisKKyAgICAgICAgYXV0byYgdk1vdmVzID0gbV9t
b3ZlTGlzdFt2XTsKKyAgICAgICAgbV9tb3ZlTGlzdFt1XS5hZGQodk1vdmVzLmJlZ2luKCksIHZN
b3Zlcy5lbmQoKSk7CisKKyAgICAgICAgZm9yRWFjaEFkamFjZW50KHYsIFt0aGlzLCB1XSAoSW5k
ZXhUeXBlIGFkamFjZW50VG1wSW5kZXgpIHsKKyAgICAgICAgICAgIGlmIChhZGRFZGdlRGlzdGlu
Y3RXaXRob3V0RGVncmVlQ2hhbmdlKGFkamFjZW50VG1wSW5kZXgsIHUpKSB7CisgICAgICAgICAg
ICAgICAgLy8gSWYgd2UgYWRkZWQgYSBuZXcgZWRnZSBiZXR3ZWVuIHRoZSBhZGphY2VudFRtcCBh
bmQgdSwgaXQgcmVwbGFjZXMgdGhlIGVkZ2UKKyAgICAgICAgICAgICAgICAvLyB0aGF0IGV4aXN0
ZWQgd2l0aCB2LgorICAgICAgICAgICAgICAgIC8vIFRoZSBkZWdyZWUgb2YgYWRqYWNlbnRUbXAg
cmVtYWlucyB0aGUgc2FtZSBzaW5jZSB0aGUgZWRnZSBqdXN0IGNoYW5nZWQgZnJvbSB1IHRvIHYu
CisgICAgICAgICAgICAgICAgLy8gQWxsIHdlIG5lZWQgdG8gZG8gaXMgdXBkYXRlIHRoZSBkZWdy
ZWUgb2YgdS4KKyAgICAgICAgICAgICAgICBpZiAoIWlzUHJlY29sb3JlZCh1KSkKKyAgICAgICAg
ICAgICAgICAgICAgbV9kZWdyZWVzW3VdKys7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgICAgICAgIC8vIElmIHdlIGFscmVhZHkgaGFkIGFuIGVkZ2UgYmV0d2VlbiB0aGUgYWRqYWNl
bnRUbXAgYW5kIHUsIHRoZSBkZWdyZWUgb2YgdQorICAgICAgICAgICAgICAgIC8vIGlzIGFscmVh
ZHkgY29ycmVjdC4gVGhlIGRlZ3JlZSBvZiB0aGUgYWRqYWNlbnRUbXAgZGVjcmVhc2VzIHNpbmNl
IHRoZSBlZGdlCisgICAgICAgICAgICAgICAgLy8gd2l0aCB2IGlzIG5vIGxvbmdlciByZWxldmFu
dCAod2UgY2FuIHRoaW5rIG9mIGl0IGFzIG1lcmdlZCB3aXRoIHRoZSBlZGdlIHdpdGggdSkuCisg
ICAgICAgICAgICAgICAgZGVjcmVtZW50RGVncmVlKGFkamFjZW50VG1wSW5kZXgpOworICAgICAg
ICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBpZiAobV9mcmFtZVBvaW50ZXJJbmRleCAm
JiBtX2ludGVyZmVyZXNXaXRoRnJhbWVQb2ludGVyLnF1aWNrR2V0KHYpKQorICAgICAgICAgICAg
bV9pbnRlcmZlcmVzV2l0aEZyYW1lUG9pbnRlci5xdWlja1NldCh1KTsKKyAgICB9CisKKworICAg
IHZvaWQgbWFrZUluaXRpYWxXb3JrbGlzdCgpCisgICAgeworICAgICAgICBtX3NpbXBsaWZ5V29y
a2xpc3QuY2xlYXIoKTsKKyAgICAgICAgbV9zcGlsbFdvcmtsaXN0LmNsZWFyQWxsKCk7CisKKyAg
ICAgICAgaWYgKHRyYWNlRGVidWcpCisgICAgICAgICAgICBkYXRhTG9nTG4oIi0tLS0tLS0tLS0t
LS0tLS0tLVxuTWFraW5nIGluaXRpYWwgd29ya2xpc3QiKTsKKworICAgICAgICBJbmRleFR5cGUg
Zmlyc3ROb25SZWdJbmRleCA9IG1fbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4ICsgMTsKKyAg
ICAgICAgdW5zaWduZWQgcmVnaXN0ZXJDb3VudCA9IHRoaXMtPnJlZ2lzdGVyQ291bnQoKTsKKyAg
ICAgICAgZm9yIChJbmRleFR5cGUgaSA9IGZpcnN0Tm9uUmVnSW5kZXg7IGkgPCBtX2RlZ3JlZXMu
c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIEFTU0VSVCghaXNQcmVjb2xvcmVkKGkpKTsKKyAg
ICAgICAgICAgIGlmIChoYXNCZWVuU2ltcGxpZmllZChpKSkKKyAgICAgICAgICAgICAgICBjb250
aW51ZTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGRlZ3JlZSA9IG1fZGVncmVlc1tpXTsKKyAgICAg
ICAgICAgIGlmIChkZWdyZWUgPCByZWdpc3RlckNvdW50KSB7CisgICAgICAgICAgICAgICAgaWYg
KHRyYWNlRGVidWcpCisgICAgICAgICAgICAgICAgICAgIGRhdGFMb2dMbigiQWRkaW5nICIsIFRt
cE1hcHBlcjo6dG1wRnJvbUFic29sdXRlSW5kZXgoaSksICIgdG8gc2ltcGxpZnkgd29ya2xpc3Qi
KTsKKyAgICAgICAgICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuYXBwZW5kKGkpOworICAgICAg
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKKyAgICAgICAg
ICAgICAgICAgICAgZGF0YUxvZ0xuKCJBZGRpbmcgIiwgVG1wTWFwcGVyOjp0bXBGcm9tQWJzb2x1
dGVJbmRleChpKSwgIiB0byBzcGlsbCB3b3JrbGlzdCIpOworICAgICAgICAgICAgICAgIGFkZFRv
U3BpbGwoaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBMb3ct
ZGVncmVlIHZlcnRleCBjYW4gYWx3YXlzIGJlIGNvbG9yZWQ6IGp1c3QgcGljayBhbnkgb2YgdGhl
IGNvbG9yIHRha2VuIGJ5IGFueQorICAgIC8vIG90aGVyIGFkamFjZW50IHZlcmljZXMuCisgICAg
Ly8gVGhlICJTaW1wbGlmeSIgcGhhc2UgdGFrZXMgYSBsb3ctZGVncmVlIG91dCBvZiB0aGUgaW50
ZXJmZXJlbmNlIGdyYXBoIHRvIHNpbXBsaWZ5IGl0LgorICAgIHZvaWQgc2ltcGxpZnkoKQorICAg
IHsKKyAgICAgICAgSW5kZXhUeXBlIGxhc3RJbmRleCA9IG1fc2ltcGxpZnlXb3JrbGlzdC50YWtl
TGFzdCgpOworCisgICAgICAgIEFTU0VSVCghbV9zZWxlY3RTdGFjay5jb250YWlucyhsYXN0SW5k
ZXgpKTsKKyAgICAgICAgQVNTRVJUKCFtX2lzT25TZWxlY3RTdGFjay5nZXQobGFzdEluZGV4KSk7
CisgICAgICAgIEFTU0VSVCghbV9zcGlsbFdvcmtsaXN0LmNvbnRhaW5zKGxhc3RJbmRleCkpOwor
CisgICAgICAgIG1fc2VsZWN0U3RhY2suYXBwZW5kKGxhc3RJbmRleCk7CisgICAgICAgIG1faXNP
blNlbGVjdFN0YWNrLnF1aWNrU2V0KGxhc3RJbmRleCk7CisKKyAgICAgICAgaWYgKHRyYWNlRGVi
dWcpCisgICAgICAgICAgICBkYXRhTG9nTG4oIlNpbXBsaWZ5aW5nICIsIGxhc3RJbmRleCwgIiBi
eSBhZGRpbmcgaXQgdG8gc2VsZWN0IHN0YWNrIik7CisKKyAgICAgICAgZm9yRWFjaEFkamFjZW50
KGxhc3RJbmRleCwgW3RoaXNdKEluZGV4VHlwZSBhZGphY2VudFRtcEluZGV4KSB7CisgICAgICAg
ICAgICBkZWNyZW1lbnREZWdyZWVJblNpbXBsaWZpY2F0aW9uKGFkamFjZW50VG1wSW5kZXgpOwor
ICAgICAgICB9KTsKKyAgICB9CisKKyAgICB2b2lkIHNlbGVjdFNwaWxsKCkKKyAgICB7CisgICAg
ICAgIEluZGV4VHlwZSB2aWN0aW1JbmRleCA9IEJhc2U6OnNlbGVjdFNwaWxsKCk7CisgICAgICAg
IG1fc3BpbGxXb3JrbGlzdC5xdWlja0NsZWFyKHZpY3RpbUluZGV4KTsKKyAgICAgICAgbV9zaW1w
bGlmeVdvcmtsaXN0LmFwcGVuZCh2aWN0aW1JbmRleCk7CisgICAgfQorCisgICAgc3RydWN0IE1v
dmVTZXQgeworICAgICAgICB1bnNpZ25lZCBhZGRNb3ZlKCkKKyAgICAgICAgeworICAgICAgICAg
ICAgQVNTRVJUKG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5pc0VtcHR5KCkpOworCisgICAgICAgICAg
ICB1bnNpZ25lZCBuZXh0SW5kZXggPSBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdCsrOworICAgICAgICAg
ICAgbV9tb3ZlTGlzdC5hcHBlbmQobmV4dEluZGV4KTsKKyAgICAgICAgICAgIHJldHVybiBuZXh0
SW5kZXg7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHN0YXJ0QWRkaW5nTG93UHJpb3JpdHlN
b3ZlcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFTU0VSVChtX2xvd1ByaW9yaXR5TW92ZUxp
c3QuaXNFbXB0eSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHVuc2lnbmVkIGFkZExvd1ByaW9y
aXR5TW92ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIG5leHRJbmRleCA9IG1f
cG9zaXRpb25Jbk1vdmVMaXN0Kys7CisgICAgICAgICAgICBtX2xvd1ByaW9yaXR5TW92ZUxpc3Qu
YXBwZW5kKG5leHRJbmRleCk7CisKKyAgICAgICAgICAgIHJldHVybiBuZXh0SW5kZXg7CisgICAg
ICAgIH0KKworICAgICAgICAvLyBXZSB1c2UgcmVmZXJlbmNlcyB0byBtb3ZlcyBoZXJlIGJlY2F1
c2UgdGhlIGZ1bmN0aW9uCisgICAgICAgIC8vIG1heSBkbyBjb2FsZXNjaW5nLCBpbmRpY2F0aW5n
IGl0IGRvZXNuJ3QgbmVlZCB0byBzZWUKKyAgICAgICAgLy8gdGhlIG1vdmUgYWdhaW4uCisgICAg
ICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbj4KKyAgICAgICAgdm9pZCBmb3JFYWNoTW92
ZShGdW5jdGlvbiBmdW5jdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICh1bnNpZ25l
ZCYgbW92ZSA6IG1fbW92ZUxpc3QpIHsKKyAgICAgICAgICAgICAgICBpZiAobW92ZSAhPSBVSU5U
X01BWCkKKyAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24obW92ZSk7CisgICAgICAgICAgICB9
CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24+CisgICAg
ICAgIHZvaWQgZm9yRWFjaExvd1ByaW9yaXR5TW92ZShGdW5jdGlvbiBmdW5jdGlvbikKKyAgICAg
ICAgeworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCYgbW92ZSA6IG1fbG93UHJpb3JpdHlNb3Zl
TGlzdCkgeworICAgICAgICAgICAgICAgIGlmIChtb3ZlICE9IFVJTlRfTUFYKQorICAgICAgICAg
ICAgICAgICAgICBmdW5jdGlvbihtb3ZlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisg
ICAgICAgIHZvaWQgY2xlYXIoKQorICAgICAgICB7CisgICAgICAgICAgICBtX3Bvc2l0aW9uSW5N
b3ZlTGlzdCA9IDA7CisgICAgICAgICAgICBtX21vdmVMaXN0LmNsZWFyKCk7CisgICAgICAgICAg
ICBtX2xvd1ByaW9yaXR5TW92ZUxpc3QuY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0
ZToKKyAgICAgICAgdW5zaWduZWQgbV9wb3NpdGlvbkluTW92ZUxpc3Q7CisgICAgICAgIFZlY3Rv
cjx1bnNpZ25lZCwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fbW92ZUxpc3Q7CisgICAgICAg
IFZlY3Rvcjx1bnNpZ25lZCwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fbG93UHJpb3JpdHlN
b3ZlTGlzdDsKKyAgICB9OworCisgICAgdm9pZCBkZWNyZW1lbnREZWdyZWUoSW5kZXhUeXBlIHRt
cEluZGV4KQorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fZGVncmVlc1t0bXBJbmRleF0pOworICAg
ICAgICAtLW1fZGVncmVlc1t0bXBJbmRleF07CisgICAgfQorCisgICAgdm9pZCBkZWNyZW1lbnRE
ZWdyZWVJblNpbXBsaWZpY2F0aW9uKEluZGV4VHlwZSB0bXBJbmRleCkKKyAgICB7CisgICAgICAg
IEFTU0VSVChtX2RlZ3JlZXNbdG1wSW5kZXhdKTsKKyAgICAgICAgdW5zaWduZWQgb2xkRGVncmVl
ID0gbV9kZWdyZWVzW3RtcEluZGV4XS0tOworCisgICAgICAgIGlmIChvbGREZWdyZWUgPT0gcmVn
aXN0ZXJDb3VudCgpKSB7CisgICAgICAgICAgICBBU1NFUlQobV9kZWdyZWVzW3RtcEluZGV4XSA8
IHJlZ2lzdGVyQ291bnQoKSk7CisgICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKKyAgICAgICAg
ICAgICAgICBkYXRhTG9nTG4oIk1vdmluZyB0bXAgIiwgdG1wSW5kZXgsICIgZnJvbSBzcGlsbCBs
aXN0IHRvIHNpbXBsaWZ5IGxpc3QgYmVjYXVzZSBpdCdzIGRlZ3JlZSBpcyBub3cgbGVzcyB0aGFu
IGsiKTsKKworICAgICAgICAgICAgaWYgKCFBU1NFUlRfRElTQUJMRUQpCisgICAgICAgICAgICAg
ICAgQVNTRVJUKG1fdW5zcGlsbGFibGVUbXBzLmNvbnRhaW5zKHRtcEluZGV4KSB8fCBtX3NwaWxs
V29ya2xpc3QuY29udGFpbnModG1wSW5kZXgpKTsKKyAgICAgICAgICAgIG1fc3BpbGxXb3JrbGlz
dC5xdWlja0NsZWFyKHRtcEluZGV4KTsKKworICAgICAgICAgICAgQVNTRVJUKCFtX3NpbXBsaWZ5
V29ya2xpc3QuY29udGFpbnModG1wSW5kZXgpKTsKKyAgICAgICAgICAgIG1fc2ltcGxpZnlXb3Jr
bGlzdC5hcHBlbmQodG1wSW5kZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBhc3Np
Z25Db2xvcnMoKQorICAgIHsKKyAgICAgICAgbV93b3JrbGlzdE1vdmVzLmNsZWFyKCk7CisgICAg
ICAgIEJhc2U6OmFzc2lnbkNvbG9ycygpOworICAgIH0KKworICAgIC8vIFNldCBvZiAibW92ZSIg
ZW5hYmxlZCBmb3IgcG9zc2libGUgY29hbGVzY2luZy4KKyAgICBNb3ZlU2V0IG1fd29ya2xpc3RN
b3ZlczsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbmRleFR5cGUsIHR5cGVuYW1lIFRtcE1h
cHBlcj4KK2NsYXNzIElSQyA6IHB1YmxpYyBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yPEluZGV4
VHlwZSwgVG1wTWFwcGVyPiB7CisgICAgdXNpbmcgQmFzZSA9IEFic3RyYWN0Q29sb3JpbmdBbGxv
Y2F0b3I8SW5kZXhUeXBlLCBUbXBNYXBwZXI+OworcHJvdGVjdGVkOgorICAgIHVzaW5nIEJhc2U6
Om1faXNPblNlbGVjdFN0YWNrOworICAgIHVzaW5nIEJhc2U6Om1fc2VsZWN0U3RhY2s7CisgICAg
dXNpbmcgQmFzZTo6bV9mcmFtZVBvaW50ZXJJbmRleDsKKyAgICB1c2luZyBCYXNlOjptX2ludGVy
ZmVyZXNXaXRoRnJhbWVQb2ludGVyOworICAgIHVzaW5nIEJhc2U6Om1fc2ltcGxpZnlXb3JrbGlz
dDsKKyAgICB1c2luZyBCYXNlOjptX3NwaWxsV29ya2xpc3Q7CisgICAgdXNpbmcgQmFzZTo6bV9o
YXNTZWxlY3RlZFNwaWxsOworICAgIHVzaW5nIEJhc2U6Om1faGFzQ29hbGVzY2VkTm9uVHJpdmlh
bE1vdmU7CisgICAgdXNpbmcgQmFzZTo6bV9kZWdyZWVzOworICAgIHVzaW5nIEJhc2U6OnJlZ2lz
dGVyQ291bnQ7CisgICAgdXNpbmcgQmFzZTo6bV9jb2FsZXNjZWRUbXBzOworICAgIHVzaW5nIEJh
c2U6Om1fbW92ZUxpc3Q7CisgICAgdXNpbmcgQmFzZTo6bV91c2VDb3VudHM7CisgICAgdXNpbmcg
QmFzZTo6bV9jb2FsZXNjZWRUbXBzQXRTcGlsbDsKKyAgICB1c2luZyBCYXNlOjptX3NwaWxsZWRU
bXBzOworICAgIHVzaW5nIHR5cGVuYW1lIEJhc2U6Ok1vdmVPcGVyYW5kczsKKyAgICB1c2luZyBC
YXNlOjptX2NvYWxlc2NpbmdDYW5kaWRhdGVzOworICAgIHVzaW5nIEJhc2U6Om1fbGFzdFByZWNv
bG9yZWRSZWdpc3RlckluZGV4OworICAgIHVzaW5nIEJhc2U6Om1fY29sb3JlZFRtcDsKKyAgICB1
c2luZyBCYXNlOjptX2NvZGU7CisgICAgdXNpbmcgdHlwZW5hbWUgQmFzZTo6SW50ZXJmZXJlbmNl
RWRnZTsKKyAgICB1c2luZyBCYXNlOjptX3Vuc3BpbGxhYmxlVG1wczsKKyAgICB1c2luZyBCYXNl
OjpoYXNJbnRlcmZlcmVuY2VFZGdlOworICAgIHVzaW5nIEJhc2U6OmdldEFsaWFzOworICAgIHVz
aW5nIEJhc2U6OmFkZEVkZ2U7CisgICAgdXNpbmcgQmFzZTo6aXNQcmVjb2xvcmVkOworICAgIHVz
aW5nIEJhc2U6OmNhbkJlU2FmZWx5Q29hbGVzY2VkOworICAgIHVzaW5nIEJhc2U6OmFkZEVkZ2VE
aXN0aW5jdFdpdGhvdXREZWdyZWVDaGFuZ2U7CisgICAgdXNpbmcgQmFzZTo6Zm9yRWFjaEFkamFj
ZW50OworICAgIHVzaW5nIEJhc2U6Omhhc0JlZW5TaW1wbGlmaWVkOworICAgIHVzaW5nIEJhc2U6
OmFkZFRvU3BpbGw7CisgICAgdXNpbmcgQmFzZTo6bV9pbnRlcmZlcmVuY2VFZGdlczsKKyAgICB1
c2luZyBCYXNlOjptX2FkamFjZW5jeUxpc3Q7CisgICAgdXNpbmcgQmFzZTo6ZHVtcEludGVyZmVy
ZW5jZUdyYXBoSW5Eb3Q7CisKK3B1YmxpYzoKKyAgICBJUkMoQ29kZSYgY29kZSwgY29uc3QgVmVj
dG9yPFJlZz4mIHJlZ3NJblByaW9yaXR5T3JkZXIsIEluZGV4VHlwZSBsYXN0UHJlY29sb3JlZFJl
Z2lzdGVySW5kZXgsIHVuc2lnbmVkIHRtcEFycmF5U2l6ZSwgY29uc3QgSGFzaFNldDx1bnNpZ25l
ZD4mIHVuc3BpbGxhYmxlVG1wcywgY29uc3QgVXNlQ291bnRzPFRtcD4mIHVzZUNvdW50cykKKyAg
ICAgICAgOiBCYXNlKGNvZGUsIHJlZ3NJblByaW9yaXR5T3JkZXIsIGxhc3RQcmVjb2xvcmVkUmVn
aXN0ZXJJbmRleCwgdG1wQXJyYXlTaXplLCB1bnNwaWxsYWJsZVRtcHMsIHVzZUNvdW50cykKKyAg
ICB7CisgICAgfQorCisgICAgdm9pZCBhbGxvY2F0ZSgpCisgICAgeworICAgICAgICBtX2FjdGl2
ZU1vdmVzLmVuc3VyZVNpemUobV93b3JrbGlzdE1vdmVzLnRvdGFsTnVtYmVyT2ZNb3ZlcygpKTsK
KyAgICAgICAgQVNTRVJUX1dJVEhfTUVTU0FHRShtX2FjdGl2ZU1vdmVzLnNpemUoKSA+PSBtX2Nv
YWxlc2NpbmdDYW5kaWRhdGVzLnNpemUoKSwgIlRoZSBhY3RpdmVNb3ZlIHNldCBzaG91bGQgYmUg
YmlnIGVub3VnaCBmb3IgdGhlIHF1aWNrIG9wZXJhdGlvbnMgb2YgQml0VmVjdG9yLiIpOworCisg
ICAgICAgIG1ha2VXb3JrTGlzdCgpOworCisgICAgICAgIGlmIChkZWJ1ZykgeworICAgICAgICAg
ICAgZHVtcEludGVyZmVyZW5jZUdyYXBoSW5Eb3QoV1RGOjpkYXRhRmlsZSgpKTsKKyAgICAgICAg
ICAgIGRhdGFMb2coIkNvYWxlc2NpbmcgY2FuZGlkYXRlczpcbiIpOworICAgICAgICAgICAgZm9y
IChNb3ZlT3BlcmFuZHMmIG1vdmVPcCA6IG1fY29hbGVzY2luZ0NhbmRpZGF0ZXMpIHsKKyAgICAg
ICAgICAgICAgICBkYXRhTG9nKCIgICAgIiwgVG1wTWFwcGVyOjp0bXBGcm9tQWJzb2x1dGVJbmRl
eChtb3ZlT3Auc3JjSW5kZXgpLAorICAgICAgICAgICAgICAgICAgICAiIC0+ICIsIFRtcE1hcHBl
cjo6dG1wRnJvbUFic29sdXRlSW5kZXgobW92ZU9wLmRzdEluZGV4KSwgIlxuIik7CisgICAgICAg
ICAgICB9CisgICAgICAgICAgICBkYXRhTG9nKCJJbml0aWFsIHdvcmsgbGlzdFxuIik7CisgICAg
ICAgICAgICBkdW1wV29ya0xpc3RzKFdURjo6ZGF0YUZpbGUoKSk7CisgICAgICAgIH0KKworICAg
ICAgICBkbyB7CisgICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykgeworICAgICAgICAgICAgICAg
IGRhdGFMb2coIkJlZm9yZSBHcmFwaCBzaW1wbGlmaWNhdGlvbiBpdGVyYXRpb25cbiIpOworICAg
ICAgICAgICAgICAgIGR1bXBXb3JrTGlzdHMoV1RGOjpkYXRhRmlsZSgpKTsKKyAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgaWYgKCFtX3NpbXBsaWZ5V29ya2xpc3QuaXNFbXB0eSgpKQorICAg
ICAgICAgICAgICAgIHNpbXBsaWZ5KCk7CisgICAgICAgICAgICBlbHNlIGlmICghbV93b3JrbGlz
dE1vdmVzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICBjb2FsZXNjZSgpOworICAgICAgICAg
ICAgZWxzZSBpZiAoIW1fZnJlZXplV29ya2xpc3QuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAg
IGZyZWV6ZSgpOworICAgICAgICAgICAgZWxzZSBpZiAobV9zcGlsbFdvcmtsaXN0LmJpdENvdW50
KCkpCisgICAgICAgICAgICAgICAgc2VsZWN0U3BpbGwoKTsKKworICAgICAgICAgICAgaWYgKHRy
YWNlRGVidWcpIHsKKyAgICAgICAgICAgICAgICBkYXRhTG9nKCJBZnRlciBHcmFwaCBzaW1wbGlm
aWNhdGlvbiBpdGVyYXRpb25cbiIpOworICAgICAgICAgICAgICAgIGR1bXBXb3JrTGlzdHMoV1RG
OjpkYXRhRmlsZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoIW1fc2ltcGxp
ZnlXb3JrbGlzdC5pc0VtcHR5KCkgfHwgIW1fd29ya2xpc3RNb3Zlcy5pc0VtcHR5KCkgfHwgIW1f
ZnJlZXplV29ya2xpc3QuaXNFbXB0eSgpIHx8IG1fc3BpbGxXb3JrbGlzdC5iaXRDb3VudCgpKTsK
KworICAgICAgICBhc3NpZ25Db2xvcnMoKTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKworICAgIHZv
aWQgbWFrZVdvcmtMaXN0KCkKKyAgICB7CisgICAgICAgIEluZGV4VHlwZSBmaXJzdE5vblJlZ0lu
ZGV4ID0gbV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXggKyAxOworICAgICAgICBmb3IgKElu
ZGV4VHlwZSBpID0gZmlyc3ROb25SZWdJbmRleDsgaSA8IG1fZGVncmVlcy5zaXplKCk7ICsraSkg
eworICAgICAgICAgICAgdW5zaWduZWQgZGVncmVlID0gbV9kZWdyZWVzW2ldOworICAgICAgICAg
ICAgaWYgKGRlZ3JlZSA+PSByZWdpc3RlckNvdW50KCkpCisgICAgICAgICAgICAgICAgYWRkVG9T
cGlsbChpKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCFtX21vdmVMaXN0W2ldLmlzRW1wdHkoKSkK
KyAgICAgICAgICAgICAgICBtX2ZyZWV6ZVdvcmtsaXN0LmFkZChpKTsKKyAgICAgICAgICAgIGVs
c2UKKyAgICAgICAgICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuYXBwZW5kKGkpOworICAgICAg
ICB9CisgICAgfQorCisgICAgLy8gTG93LWRlZ3JlZSB2ZXJ0ZXggY2FuIGFsd2F5cyBiZSBjb2xv
cmVkOiBqdXN0IHBpY2sgYW55IG9mIHRoZSBjb2xvciB0YWtlbiBieSBhbnkKKyAgICAvLyBvdGhl
ciBhZGphY2VudCB2ZXJpY2VzLgorICAgIC8vIFRoZSAiU2ltcGxpZnkiIHBoYXNlIHRha2VzIGEg
bG93LWRlZ3JlZSBvdXQgb2YgdGhlIGludGVyZmVyZW5jZSBncmFwaCB0byBzaW1wbGlmeSBpdC4K
KyAgICB2b2lkIHNpbXBsaWZ5KCkKKyAgICB7CisgICAgICAgIEluZGV4VHlwZSBsYXN0SW5kZXgg
PSBtX3NpbXBsaWZ5V29ya2xpc3QudGFrZUxhc3QoKTsKKworICAgICAgICBBU1NFUlQoIW1fc2Vs
ZWN0U3RhY2suY29udGFpbnMobGFzdEluZGV4KSk7CisgICAgICAgIEFTU0VSVCghbV9pc09uU2Vs
ZWN0U3RhY2suZ2V0KGxhc3RJbmRleCkpOworICAgICAgICBtX3NlbGVjdFN0YWNrLmFwcGVuZChs
YXN0SW5kZXgpOworICAgICAgICBtX2lzT25TZWxlY3RTdGFjay5xdWlja1NldChsYXN0SW5kZXgp
OworCisgICAgICAgIGZvckVhY2hBZGphY2VudChsYXN0SW5kZXgsIFt0aGlzXShJbmRleFR5cGUg
YWRqYWNlbnRUbXBJbmRleCkgeworICAgICAgICAgICAgZGVjcmVtZW50RGVncmVlKGFkamFjZW50
VG1wSW5kZXgpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICB2b2lkIGNvYWxlc2NlKCkKKyAg
ICB7CisgICAgICAgIHVuc2lnbmVkIG1vdmVJbmRleCA9IG1fd29ya2xpc3RNb3Zlcy50YWtlTGFz
dE1vdmUoKTsKKyAgICAgICAgY29uc3QgTW92ZU9wZXJhbmRzJiBtb3ZlT3BlcmFuZHMgPSBtX2Nv
YWxlc2NpbmdDYW5kaWRhdGVzW21vdmVJbmRleF07CisgICAgICAgIEluZGV4VHlwZSB1ID0gZ2V0
QWxpYXMobW92ZU9wZXJhbmRzLnNyY0luZGV4KTsKKyAgICAgICAgSW5kZXhUeXBlIHYgPSBnZXRB
bGlhcyhtb3ZlT3BlcmFuZHMuZHN0SW5kZXgpOworCisgICAgICAgIGlmIChpc1ByZWNvbG9yZWQo
dikpCisgICAgICAgICAgICBzdGQ6OnN3YXAodSwgdik7CisKKyAgICAgICAgaWYgKHRyYWNlRGVi
dWcpCisgICAgICAgICAgICBkYXRhTG9nKCJDb2FsZXNjaW5nIG1vdmUgYXQgaW5kZXggIiwgbW92
ZUluZGV4LCAiIHUgPSAiLCB1LCAiIHYgPSAiLCB2LCAiXG4iKTsKKworICAgICAgICBpZiAodSA9
PSB2KSB7CisgICAgICAgICAgICBhZGRXb3JrTGlzdCh1KTsKKworICAgICAgICAgICAgaWYgKHRy
YWNlRGVidWcpCisgICAgICAgICAgICAgICAgZGF0YUxvZygiICAgIENvYWxlc2NlZFxuIik7Cisg
ICAgICAgIH0gZWxzZSBpZiAoaXNQcmVjb2xvcmVkKHYpCisgICAgICAgICAgICB8fCBoYXNJbnRl
cmZlcmVuY2VFZGdlKEludGVyZmVyZW5jZUVkZ2UodSwgdikpCisgICAgICAgICAgICB8fCAodSA9
PSBtX2ZyYW1lUG9pbnRlckluZGV4ICYmIG1faW50ZXJmZXJlc1dpdGhGcmFtZVBvaW50ZXIucXVp
Y2tHZXQodikpKSB7CisgICAgICAgICAgICBhZGRXb3JrTGlzdCh1KTsKKyAgICAgICAgICAgIGFk
ZFdvcmtMaXN0KHYpOworCisgICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKKyAgICAgICAgICAg
ICAgICBkYXRhTG9nKCIgICAgQ29uc3RyYWluZWRcbiIpOworICAgICAgICB9IGVsc2UgaWYgKGNh
bkJlU2FmZWx5Q29hbGVzY2VkKHUsIHYpKSB7CisgICAgICAgICAgICBjb21iaW5lKHUsIHYpOwor
ICAgICAgICAgICAgYWRkV29ya0xpc3QodSk7CisgICAgICAgICAgICBtX2hhc0NvYWxlc2NlZE5v
blRyaXZpYWxNb3ZlID0gdHJ1ZTsKKworICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpCisgICAg
ICAgICAgICAgICAgZGF0YUxvZygiICAgIFNhZmUgQ29hbGVzY2luZ1xuIik7CisgICAgICAgIH0g
ZWxzZSB7CisgICAgICAgICAgICBtX2FjdGl2ZU1vdmVzLnF1aWNrU2V0KG1vdmVJbmRleCk7Cisg
ICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKKyAgICAgICAgICAgICAgICBkYXRhTG9nKCIgICAg
RmFpbGVkIGNvYWxlc2NpbmcsIGFkZGVkIHRvIGFjdGl2ZSBtb3Zlcy5cbiIpOworICAgICAgICB9
CisgICAgfQorCisgICAgdm9pZCBhZGRXb3JrTGlzdChJbmRleFR5cGUgdG1wSW5kZXgpCisgICAg
eworICAgICAgICBpZiAoIWlzUHJlY29sb3JlZCh0bXBJbmRleCkgJiYgbV9kZWdyZWVzW3RtcElu
ZGV4XSA8IHJlZ2lzdGVyQ291bnQoKSAmJiAhaXNNb3ZlUmVsYXRlZCh0bXBJbmRleCkpIHsKKyAg
ICAgICAgICAgIG1fZnJlZXplV29ya2xpc3QucmVtb3ZlKHRtcEluZGV4KTsKKyAgICAgICAgICAg
IG1fc2ltcGxpZnlXb3JrbGlzdC5hcHBlbmQodG1wSW5kZXgpOworICAgICAgICB9CisgICAgfQor
CisgICAgdm9pZCBjb21iaW5lKEluZGV4VHlwZSB1LCBJbmRleFR5cGUgdikKKyAgICB7CisgICAg
ICAgIGlmICghbV9mcmVlemVXb3JrbGlzdC5yZW1vdmUodikpCisgICAgICAgICAgICBtX3NwaWxs
V29ya2xpc3QucXVpY2tDbGVhcih2KTsKKworICAgICAgICBBU1NFUlQoIW1fY29hbGVzY2VkVG1w
c1t2XSk7CisgICAgICAgIG1fY29hbGVzY2VkVG1wc1t2XSA9IHU7CisKKyAgICAgICAgYXV0byYg
dk1vdmVzID0gbV9tb3ZlTGlzdFt2XTsKKyAgICAgICAgbV9tb3ZlTGlzdFt1XS5hZGQodk1vdmVz
LmJlZ2luKCksIHZNb3Zlcy5lbmQoKSk7CisKKyAgICAgICAgZm9yRWFjaEFkamFjZW50KHYsIFt0
aGlzLCB1XSAoSW5kZXhUeXBlIGFkamFjZW50VG1wSW5kZXgpIHsKKyAgICAgICAgICAgIGlmIChh
ZGRFZGdlRGlzdGluY3RXaXRob3V0RGVncmVlQ2hhbmdlKGFkamFjZW50VG1wSW5kZXgsIHUpKSB7
CisgICAgICAgICAgICAgICAgLy8gSWYgd2UgYWRkZWQgYSBuZXcgZWRnZSBiZXR3ZWVuIHRoZSBh
ZGphY2VudFRtcCBhbmQgdSwgaXQgcmVwbGFjZXMgdGhlIGVkZ2UKKyAgICAgICAgICAgICAgICAv
LyB0aGF0IGV4aXN0ZWQgd2l0aCB2LgorICAgICAgICAgICAgICAgIC8vIFRoZSBkZWdyZWUgb2Yg
YWRqYWNlbnRUbXAgcmVtYWlucyB0aGUgc2FtZSBzaW5jZSB0aGUgZWRnZSBqdXN0IGNoYW5nZWQg
ZnJvbSB1IHRvIHYuCisgICAgICAgICAgICAgICAgLy8gQWxsIHdlIG5lZWQgdG8gZG8gaXMgdXBk
YXRlIHRoZSBkZWdyZWUgb2YgdS4KKyAgICAgICAgICAgICAgICBpZiAoIWlzUHJlY29sb3JlZCh1
KSkKKyAgICAgICAgICAgICAgICAgICAgbV9kZWdyZWVzW3VdKys7CisgICAgICAgICAgICB9IGVs
c2UgeworICAgICAgICAgICAgICAgIC8vIElmIHdlIGFscmVhZHkgaGFkIGFuIGVkZ2UgYmV0d2Vl
biB0aGUgYWRqYWNlbnRUbXAgYW5kIHUsIHRoZSBkZWdyZWUgb2YgdQorICAgICAgICAgICAgICAg
IC8vIGlzIGFscmVhZHkgY29ycmVjdC4gVGhlIGRlZ3JlZSBvZiB0aGUgYWRqYWNlbnRUbXAgZGVj
cmVhc2VzIHNpbmNlIHRoZSBlZGdlCisgICAgICAgICAgICAgICAgLy8gd2l0aCB2IGlzIG5vIGxv
bmdlciByZWxldmFudCAod2UgY2FuIHRoaW5rIG9mIGl0IGFzIG1lcmdlZCB3aXRoIHRoZSBlZGdl
IHdpdGggdSkuCisgICAgICAgICAgICAgICAgZGVjcmVtZW50RGVncmVlKGFkamFjZW50VG1wSW5k
ZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBpZiAobV9mcmFtZVBv
aW50ZXJJbmRleCAmJiBtX2ludGVyZmVyZXNXaXRoRnJhbWVQb2ludGVyLnF1aWNrR2V0KHYpKQor
ICAgICAgICAgICAgbV9pbnRlcmZlcmVzV2l0aEZyYW1lUG9pbnRlci5xdWlja1NldCh1KTsKKwor
ICAgICAgICBpZiAobV9kZWdyZWVzW3VdID49IHJlZ2lzdGVyQ291bnQoKSAmJiBtX2ZyZWV6ZVdv
cmtsaXN0LnJlbW92ZSh1KSkKKyAgICAgICAgICAgIGFkZFRvU3BpbGwodSk7CisgICAgfQorCisg
ICAgdm9pZCBmcmVlemUoKQorICAgIHsKKyAgICAgICAgSW5kZXhUeXBlIHZpY3RpbUluZGV4ID0g
bV9mcmVlemVXb3JrbGlzdC50YWtlQW55KCk7CisgICAgICAgIEFTU0VSVF9XSVRIX01FU1NBR0Uo
Z2V0QWxpYXModmljdGltSW5kZXgpID09IHZpY3RpbUluZGV4LCAiY29hbGVzY2UoKSBzaG91bGQg
bm90IGxlYXZlIGFsaWFzZWQgVG1wIGluIHRoZSB3b3JrbGlzdC4iKTsKKyAgICAgICAgbV9zaW1w
bGlmeVdvcmtsaXN0LmFwcGVuZCh2aWN0aW1JbmRleCk7CisgICAgICAgIGZyZWV6ZU1vdmVzKHZp
Y3RpbUluZGV4KTsKKyAgICB9CisKKyAgICB2b2lkIGZyZWV6ZU1vdmVzKEluZGV4VHlwZSB0bXBJ
bmRleCkKKyAgICB7CisgICAgICAgIGZvckVhY2hOb2RlTW92ZXModG1wSW5kZXgsIFt0aGlzLCB0
bXBJbmRleF0gKEluZGV4VHlwZSBtb3ZlSW5kZXgpIHsKKyAgICAgICAgICAgIGlmICghbV9hY3Rp
dmVNb3Zlcy5xdWlja0NsZWFyKG1vdmVJbmRleCkpCisgICAgICAgICAgICAgICAgbV93b3JrbGlz
dE1vdmVzLnRha2VNb3ZlKG1vdmVJbmRleCk7CisKKyAgICAgICAgICAgIGNvbnN0IE1vdmVPcGVy
YW5kcyYgbW92ZU9wZXJhbmRzID0gbV9jb2FsZXNjaW5nQ2FuZGlkYXRlc1ttb3ZlSW5kZXhdOwor
ICAgICAgICAgICAgSW5kZXhUeXBlIHNyY1RtcEluZGV4ID0gbW92ZU9wZXJhbmRzLnNyY0luZGV4
OworICAgICAgICAgICAgSW5kZXhUeXBlIGRzdFRtcEluZGV4ID0gbW92ZU9wZXJhbmRzLmRzdElu
ZGV4OworCisgICAgICAgICAgICBJbmRleFR5cGUgb3JpZ2luYWxPdGhlclRtcCA9IHNyY1RtcElu
ZGV4ICE9IHRtcEluZGV4ID8gc3JjVG1wSW5kZXggOiBkc3RUbXBJbmRleDsKKyAgICAgICAgICAg
IEluZGV4VHlwZSBvdGhlclRtcEluZGV4ID0gZ2V0QWxpYXMob3JpZ2luYWxPdGhlclRtcCk7Cisg
ICAgICAgICAgICBpZiAobV9kZWdyZWVzW290aGVyVG1wSW5kZXhdIDwgcmVnaXN0ZXJDb3VudCgp
ICYmICFpc01vdmVSZWxhdGVkKG90aGVyVG1wSW5kZXgpKSB7CisgICAgICAgICAgICAgICAgaWYg
KG1fZnJlZXplV29ya2xpc3QucmVtb3ZlKG90aGVyVG1wSW5kZXgpKQorICAgICAgICAgICAgICAg
ICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuYXBwZW5kKG90aGVyVG1wSW5kZXgpOworICAgICAgICAg
ICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICB2b2lkIGRlY3JlbWVudERlZ3JlZShJbmRl
eFR5cGUgdG1wSW5kZXgpCisgICAgeworICAgICAgICBBU1NFUlQobV9kZWdyZWVzW3RtcEluZGV4
XSk7CisKKyAgICAgICAgdW5zaWduZWQgb2xkRGVncmVlID0gbV9kZWdyZWVzW3RtcEluZGV4XS0t
OworICAgICAgICBpZiAob2xkRGVncmVlID09IHJlZ2lzdGVyQ291bnQoKSkgeworICAgICAgICAg
ICAgZW5hYmxlTW92ZXNPblZhbHVlQW5kQWRqYWNlbnRzKHRtcEluZGV4KTsKKyAgICAgICAgICAg
IG1fc3BpbGxXb3JrbGlzdC5xdWlja0NsZWFyKHRtcEluZGV4KTsKKyAgICAgICAgICAgIGlmIChp
c01vdmVSZWxhdGVkKHRtcEluZGV4KSkKKyAgICAgICAgICAgICAgICBtX2ZyZWV6ZVdvcmtsaXN0
LmFkZCh0bXBJbmRleCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbV9zaW1w
bGlmeVdvcmtsaXN0LmFwcGVuZCh0bXBJbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2
b2lkIHNlbGVjdFNwaWxsKCkKKyAgICB7CisgICAgICAgIEluZGV4VHlwZSB2aWN0aW1JbmRleCA9
IEJhc2U6OnNlbGVjdFNwaWxsKCk7CisgICAgICAgIG1fc3BpbGxXb3JrbGlzdC5xdWlja0NsZWFy
KHZpY3RpbUluZGV4KTsKKyAgICAgICAgbV9zaW1wbGlmeVdvcmtsaXN0LmFwcGVuZCh2aWN0aW1J
bmRleCk7CisgICAgICAgIGZyZWV6ZU1vdmVzKHZpY3RpbUluZGV4KTsKKyAgICB9CiAKLSAgICAv
LyBUaGUgaW50ZXJmZXJlbmNlIGdyYXBoLgotICAgIEhhc2hTZXQ8SW50ZXJmZXJlbmNlRWRnZSwg
SW50ZXJmZXJlbmNlRWRnZUhhc2gsIEludGVyZmVyZW5jZUVkZ2VIYXNoVHJhaXRzPiBtX2ludGVy
ZmVyZW5jZUVkZ2VzOwotICAgIFZlY3RvcjxWZWN0b3I8SW5kZXhUeXBlLCAwLCBVbnNhZmVWZWN0
b3JPdmVyZmxvdywgND4sIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX2FkamFjZW5jeUxpc3Q7
Ci0gICAgVmVjdG9yPEluZGV4VHlwZSwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fZGVncmVl
czsKKyAgICB2b2lkIGFzc2lnbkNvbG9ycygpCisgICAgeworICAgICAgICBBU1NFUlQobV9mcmVl
emVXb3JrbGlzdC5pc0VtcHR5KCkpOworICAgICAgICBtX3dvcmtsaXN0TW92ZXMuY2xlYXIoKTsK
KyAgICAgICAgQmFzZTo6YXNzaWduQ29sb3JzKCk7CisgICAgfQogCi0gICAgLy8gSW5zdGVhZCBv
ZiBrZWVwaW5nIHRyYWNrIG9mIHRoZSBtb3ZlIGluc3RydWN0aW9ucywgd2UganVzdCBrZWVwIHRo
ZWlyIG9wZXJhbmRzIGFyb3VuZCBhbmQgdXNlIHRoZSBpbmRleAotICAgIC8vIGluIHRoZSB2ZWN0
b3IgYXMgdGhlICJpZGVudGlmaWVyIiBmb3IgdGhlIG1vdmUuCi0gICAgc3RydWN0IE1vdmVPcGVy
YW5kcyB7Ci0gICAgICAgIEluZGV4VHlwZSBzcmNJbmRleDsKLSAgICAgICAgSW5kZXhUeXBlIGRz
dEluZGV4OwotICAgIH07Ci0gICAgVmVjdG9yPE1vdmVPcGVyYW5kcywgMCwgVW5zYWZlVmVjdG9y
T3ZlcmZsb3c+IG1fY29hbGVzY2luZ0NhbmRpZGF0ZXM7CiAKLSAgICAvLyBMaXN0IG9mIGV2ZXJ5
IG1vdmUgaW5zdHJ1Y3Rpb24gYXNzb2NpYXRlZCB3aXRoIGEgVG1wLgotICAgIFZlY3RvcjxIYXNo
U2V0PEluZGV4VHlwZSwgdHlwZW5hbWUgRGVmYXVsdEhhc2g8SW5kZXhUeXBlPjo6SGFzaCwgV1RG
OjpVbnNpZ25lZFdpdGhaZXJvS2V5SGFzaFRyYWl0czxJbmRleFR5cGU+Pj4gbV9tb3ZlTGlzdDsK
KyAgICBib29sIGlzTW92ZVJlbGF0ZWQoSW5kZXhUeXBlIHRtcEluZGV4KQorICAgIHsKKyAgICAg
ICAgZm9yICh1bnNpZ25lZCBtb3ZlSW5kZXggOiBtX21vdmVMaXN0W3RtcEluZGV4XSkgeworICAg
ICAgICAgICAgaWYgKG1fYWN0aXZlTW92ZXMucXVpY2tHZXQobW92ZUluZGV4KSB8fCBtX3dvcmts
aXN0TW92ZXMuY29udGFpbnMobW92ZUluZGV4KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogCi0gICAgLy8gQ29s
b3JzLgotICAgIFZlY3RvcjxSZWcsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX2NvbG9yZWRU
bXA7Ci0gICAgVmVjdG9yPEluZGV4VHlwZT4gbV9zcGlsbGVkVG1wczsKKyAgICB0ZW1wbGF0ZTx0
eXBlbmFtZSBGdW5jdGlvbj4KKyAgICB2b2lkIGZvckVhY2hOb2RlTW92ZXMoSW5kZXhUeXBlIHRt
cEluZGV4LCBGdW5jdGlvbiBmdW5jdGlvbikKKyAgICB7CisgICAgICAgIGZvciAodW5zaWduZWQg
bW92ZUluZGV4IDogbV9tb3ZlTGlzdFt0bXBJbmRleF0pIHsKKyAgICAgICAgICAgIGlmIChtX2Fj
dGl2ZU1vdmVzLnF1aWNrR2V0KG1vdmVJbmRleCkgfHwgbV93b3JrbGlzdE1vdmVzLmNvbnRhaW5z
KG1vdmVJbmRleCkpCisgICAgICAgICAgICAgICAgZnVuY3Rpb24obW92ZUluZGV4KTsKKyAgICAg
ICAgfQorICAgIH0KIAotICAgIC8vIFZhbHVlcyB0aGF0IGhhdmUgYmVlbiBjb2FsZXNjZWQgd2l0
aCBhbiBvdGhlciB2YWx1ZS4KLSAgICBWZWN0b3I8SW5kZXhUeXBlLCAwLCBVbnNhZmVWZWN0b3JP
dmVyZmxvdz4gbV9jb2FsZXNjZWRUbXBzOworICAgIHZvaWQgZW5hYmxlTW92ZXNPblZhbHVlKElu
ZGV4VHlwZSB0bXBJbmRleCkKKyAgICB7CisgICAgICAgIGZvciAodW5zaWduZWQgbW92ZUluZGV4
IDogbV9tb3ZlTGlzdFt0bXBJbmRleF0pIHsKKyAgICAgICAgICAgIGlmIChtX2FjdGl2ZU1vdmVz
LnF1aWNrQ2xlYXIobW92ZUluZGV4KSkKKyAgICAgICAgICAgICAgICBtX3dvcmtsaXN0TW92ZXMu
cmV0dXJuTW92ZShtb3ZlSW5kZXgpOworICAgICAgICB9CisgICAgfQogCi0gICAgLy8gVGhlIHN0
YWNrIG9mIFRtcCByZW1vdmVkIGZyb20gdGhlIGdyYXBoIGFuZCByZWFkeSBmb3IgY29sb3Jpbmcu
Ci0gICAgQml0VmVjdG9yIG1faXNPblNlbGVjdFN0YWNrOwotICAgIFZlY3RvcjxJbmRleFR5cGU+
IG1fc2VsZWN0U3RhY2s7CisgICAgdm9pZCBlbmFibGVNb3Zlc09uVmFsdWVBbmRBZGphY2VudHMo
SW5kZXhUeXBlIHRtcEluZGV4KQorICAgIHsKKyAgICAgICAgZW5hYmxlTW92ZXNPblZhbHVlKHRt
cEluZGV4KTsKIAotICAgIEluZGV4VHlwZSBtX2ZyYW1lUG9pbnRlckluZGV4IHsgMCB9OwotICAg
IEJpdFZlY3RvciBtX2ludGVyZmVyZXNXaXRoRnJhbWVQb2ludGVyOworICAgICAgICBmb3JFYWNo
QWRqYWNlbnQodG1wSW5kZXgsIFt0aGlzXSAoSW5kZXhUeXBlIGFkamFjZW50VG1wSW5kZXgpIHsK
KyAgICAgICAgICAgIGVuYWJsZU1vdmVzT25WYWx1ZShhZGphY2VudFRtcEluZGV4KTsKKyAgICAg
ICAgfSk7CisgICAgfQogCiAgICAgc3RydWN0IE9yZGVyZWRNb3ZlU2V0IHsKICAgICAgICAgdW5z
aWduZWQgYWRkTW92ZSgpCkBAIC03MDIsNiArMTI3NywxMSBAQCBwcm90ZWN0ZWQ6CiAgICAgICAg
ICAgICBtX2xvd1ByaW9yaXR5TW92ZUxpc3QuY2xlYXIoKTsKICAgICAgICAgfQogCisgICAgICAg
IHVuc2lnbmVkIHRvdGFsTnVtYmVyT2ZNb3ZlcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJl
dHVybiBtX21vdmVMaXN0LnNpemUoKSArIG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5zaXplKCk7Cisg
ICAgICAgIH0KKwogICAgIHByaXZhdGU6CiAgICAgICAgIFZlY3Rvcjx1bnNpZ25lZCwgMCwgVW5z
YWZlVmVjdG9yT3ZlcmZsb3c+IG1fcG9zaXRpb25Jbk1vdmVMaXN0OwogICAgICAgICBWZWN0b3I8
dW5zaWduZWQsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX21vdmVMaXN0OwpAQCAtNzA5LDUw
ICsxMjg5LDc5IEBAIHByb3RlY3RlZDoKICAgICAgICAgdW5zaWduZWQgbV9maXJzdExvd1ByaW9y
aXR5TW92ZUluZGV4IHsgMCB9OwogICAgIH07CiAKKyAgICB2b2lkIGR1bXBXb3JrTGlzdHMoUHJp
bnRTdHJlYW0mIG91dCkKKyAgICB7CisgICAgICAgIG91dC5wcmludCgiU2ltcGxpZnkgd29yayBs
aXN0OlxuIik7CisgICAgICAgIGZvciAodW5zaWduZWQgdG1wSW5kZXggOiBtX3NpbXBsaWZ5V29y
a2xpc3QpCisgICAgICAgICAgICBvdXQucHJpbnQoIiAgICAiLCBUbXBNYXBwZXI6OnRtcEZyb21B
YnNvbHV0ZUluZGV4KHRtcEluZGV4KSwgIlxuIik7CisgICAgICAgIG91dC5wcmludGYoIk1vdmVz
IHdvcmsgbGlzdCBpcyBlbXB0eT8gJWRcbiIsIG1fd29ya2xpc3RNb3Zlcy5pc0VtcHR5KCkpOwor
ICAgICAgICBvdXQucHJpbnQoIkZyZWV6ZSB3b3JrIGxpc3Q6XG4iKTsKKyAgICAgICAgZm9yICh1
bnNpZ25lZCB0bXBJbmRleCA6IG1fZnJlZXplV29ya2xpc3QpCisgICAgICAgICAgICBvdXQucHJp
bnQoIiAgICAiLCBUbXBNYXBwZXI6OnRtcEZyb21BYnNvbHV0ZUluZGV4KHRtcEluZGV4KSwgIlxu
Iik7CisgICAgICAgIG91dC5wcmludCgiU3BpbGwgd29yayBsaXN0OlxuIik7CisgICAgICAgIGZv
ciAodW5zaWduZWQgdG1wSW5kZXggOiBtX3NwaWxsV29ya2xpc3QpCisgICAgICAgICAgICBvdXQu
cHJpbnQoIiAgICAiLCBUbXBNYXBwZXI6OnRtcEZyb21BYnNvbHV0ZUluZGV4KHRtcEluZGV4KSwg
IlxuIik7CisgICAgfQorCiAgICAgLy8gV29yayBsaXN0cy4KKyAgICAvLyBMb3ctZGVncmVlLCBN
b3ZlIHJlbGF0ZWQuCisgICAgSGFzaFNldDxJbmRleFR5cGU+IG1fZnJlZXplV29ya2xpc3Q7CiAg
ICAgLy8gU2V0IG9mICJtb3ZlIiBlbmFibGVkIGZvciBwb3NzaWJsZSBjb2FsZXNjaW5nLgogICAg
IE9yZGVyZWRNb3ZlU2V0IG1fd29ya2xpc3RNb3ZlczsKICAgICAvLyBTZXQgb2YgIm1vdmUiIG5v
dCB5ZXQgcmVhZHkgZm9yIGNvYWxlc2NpbmcuCiAgICAgQml0VmVjdG9yIG1fYWN0aXZlTW92ZXM7
Ci0gICAgLy8gTG93LWRlZ3JlZSwgbm9uLU1vdmUgcmVsYXRlZC4KLSAgICBWZWN0b3I8SW5kZXhU
eXBlPiBtX3NpbXBsaWZ5V29ya2xpc3Q7Ci0gICAgLy8gSGlnaC1kZWdyZWUgVG1wLgotICAgIEhh
c2hTZXQ8SW5kZXhUeXBlPiBtX3NwaWxsV29ya2xpc3Q7Ci0gICAgLy8gTG93LWRlZ3JlZSwgTW92
ZSByZWxhdGVkLgotICAgIEhhc2hTZXQ8SW5kZXhUeXBlPiBtX2ZyZWV6ZVdvcmtsaXN0OwotCi0g
ICAgYm9vbCBtX2hhc1NlbGVjdGVkU3BpbGwgeyBmYWxzZSB9OwotICAgIGJvb2wgbV9oYXNDb2Fs
ZXNjZWROb25Ucml2aWFsTW92ZSB7IGZhbHNlIH07Ci0KLSAgICAvLyBUaGUgbWFwcGluZyBvZiBU
bXAgdG8gdGhlaXIgYWxpYXMgZm9yIE1vdmVzIHRoYXQgYXJlIGFsd2F5cyBjb2FsZXNjaW5nIHJl
Z2FyZGxlc3Mgb2Ygc3BpbGxpbmcuCi0gICAgVmVjdG9yPEluZGV4VHlwZSwgMCwgVW5zYWZlVmVj
dG9yT3ZlcmZsb3c+IG1fY29hbGVzY2VkVG1wc0F0U3BpbGw7Ci0gICAgCi0gICAgY29uc3QgSGFz
aFNldDx1bnNpZ25lZD4mIG1fdW5zcGlsbGFibGVUbXBzOwogfTsKIAogLy8gVGhpcyBwZXJmb3Jt
IGFsbCB0aGUgdGFza3MgdGhhdCBhcmUgc3BlY2lmaWMgdG8gY2VydGFpbiByZWdpc3RlciB0eXBl
LgotdGVtcGxhdGU8QXJnOjpUeXBlIHR5cGU+Ci1jbGFzcyBDb2xvcmluZ0FsbG9jYXRvciA6IHB1
YmxpYyBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yPHVuc2lnbmVkPiB7Cit0ZW1wbGF0ZTxBcmc6
OlR5cGUgdHlwZSwgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBBbGxvY2F0b3JU
eXBlPgorY2xhc3MgQ29sb3JpbmdBbGxvY2F0b3IgOiBwdWJsaWMgQWxsb2NhdG9yVHlwZTx1bnNp
Z25lZCwgQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT4+IHsKKyAgICB1c2luZyBUbXBNYXBwZXIgPSBB
YnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjsKKyAgICB1c2luZyBCYXNlID0gQWxsb2NhdG9yVHlwZTx1
bnNpZ25lZCwgVG1wTWFwcGVyPjsKKyAgICB1c2luZyBCYXNlOjptX2lzT25TZWxlY3RTdGFjazsK
KyAgICB1c2luZyBCYXNlOjptX3NlbGVjdFN0YWNrOworICAgIHVzaW5nIEJhc2U6Om1fZnJhbWVQ
b2ludGVySW5kZXg7CisgICAgdXNpbmcgQmFzZTo6bV9pbnRlcmZlcmVzV2l0aEZyYW1lUG9pbnRl
cjsKKyAgICB1c2luZyBCYXNlOjptX3NpbXBsaWZ5V29ya2xpc3Q7CisgICAgdXNpbmcgQmFzZTo6
bV9zcGlsbFdvcmtsaXN0OworICAgIHVzaW5nIEJhc2U6Om1faGFzU2VsZWN0ZWRTcGlsbDsKKyAg
ICB1c2luZyBCYXNlOjptX2hhc0NvYWxlc2NlZE5vblRyaXZpYWxNb3ZlOworICAgIHVzaW5nIEJh
c2U6Om1fZGVncmVlczsKKyAgICB1c2luZyBCYXNlOjpyZWdpc3RlckNvdW50OworICAgIHVzaW5n
IEJhc2U6Om1fY29hbGVzY2VkVG1wczsKKyAgICB1c2luZyBCYXNlOjptX21vdmVMaXN0OworICAg
IHVzaW5nIEJhc2U6Om1fdXNlQ291bnRzOworICAgIHVzaW5nIEJhc2U6Om1fY29hbGVzY2VkVG1w
c0F0U3BpbGw7CisgICAgdXNpbmcgQmFzZTo6bV9zcGlsbGVkVG1wczsKKyAgICB1c2luZyB0eXBl
bmFtZSBCYXNlOjpNb3ZlT3BlcmFuZHM7CisgICAgdXNpbmcgQmFzZTo6bV9jb2FsZXNjaW5nQ2Fu
ZGlkYXRlczsKKyAgICB1c2luZyBCYXNlOjptX2xhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleDsK
KyAgICB1c2luZyBCYXNlOjptX2NvbG9yZWRUbXA7CisgICAgdXNpbmcgQmFzZTo6bV9jb2RlOwor
ICAgIHVzaW5nIHR5cGVuYW1lIEJhc2U6OkludGVyZmVyZW5jZUVkZ2U7CisgICAgdXNpbmcgQmFz
ZTo6bV93b3JrbGlzdE1vdmVzOworICAgIHVzaW5nIEJhc2U6Omhhc0ludGVyZmVyZW5jZUVkZ2U7
CisgICAgdXNpbmcgQmFzZTo6Z2V0QWxpYXM7CisgICAgdXNpbmcgQmFzZTo6YWRkRWRnZTsKKyAg
ICB1c2luZyBCYXNlOjptX2ludGVyZmVyZW5jZUVkZ2VzOworCiBwdWJsaWM6CisKICAgICBDb2xv
cmluZ0FsbG9jYXRvcihDb2RlJiBjb2RlLCBUbXBXaWR0aCYgdG1wV2lkdGgsIGNvbnN0IFVzZUNv
dW50czxUbXA+JiB1c2VDb3VudHMsIGNvbnN0IEhhc2hTZXQ8dW5zaWduZWQ+JiB1bnNwaWxsYWJs
ZVRtcCkKLSAgICAgICAgOiBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yPHVuc2lnbmVkPihjb2Rl
LnJlZ3NJblByaW9yaXR5T3JkZXIodHlwZSksIEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjpsYXN0
TWFjaGluZVJlZ2lzdGVySW5kZXgoKSwgdG1wQXJyYXlTaXplKGNvZGUpLCB1bnNwaWxsYWJsZVRt
cCkKLSAgICAgICAgLCBtX2NvZGUoY29kZSkKKyAgICAgICAgOiBCYXNlKGNvZGUsIGNvZGUucmVn
c0luUHJpb3JpdHlPcmRlcih0eXBlKSwgVG1wTWFwcGVyOjpsYXN0TWFjaGluZVJlZ2lzdGVySW5k
ZXgoKSwgdG1wQXJyYXlTaXplKGNvZGUpLCB1bnNwaWxsYWJsZVRtcCwgdXNlQ291bnRzKQogICAg
ICAgICAsIG1fdG1wV2lkdGgodG1wV2lkdGgpCi0gICAgICAgICwgbV91c2VDb3VudHModXNlQ291
bnRzKQogICAgIHsKICAgICAgICAgaWYgKHR5cGUgPT0gQXJnOjpHUCkgewotICAgICAgICAgICAg
bV9mcmFtZVBvaW50ZXJJbmRleCA9IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUlu
ZGV4KFRtcChNYWNyb0Fzc2VtYmxlcjo6ZnJhbWVQb2ludGVyUmVnaXN0ZXIpKTsKKyAgICAgICAg
ICAgIG1fZnJhbWVQb2ludGVySW5kZXggPSBUbXBNYXBwZXI6OmFic29sdXRlSW5kZXgoVG1wKE1h
Y3JvQXNzZW1ibGVyOjpmcmFtZVBvaW50ZXJSZWdpc3RlcikpOwogICAgICAgICAgICAgbV9pbnRl
cmZlcmVzV2l0aEZyYW1lUG9pbnRlci5lbnN1cmVTaXplKHRtcEFycmF5U2l6ZShjb2RlKSk7CiAg
ICAgICAgIH0KIAogICAgICAgICBpbml0aWFsaXplUHJlY29sb3JlZFRtcCgpOwogICAgICAgICBi
dWlsZCgpOwotICAgICAgICBhbGxvY2F0ZSgpOwogICAgIH0KIAogICAgIFRtcCBnZXRBbGlhcyhU
bXAgdG1wKSBjb25zdAogICAgIHsKLSAgICAgICAgcmV0dXJuIEFic29sdXRlVG1wTWFwcGVyPHR5
cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleChnZXRBbGlhcyhBYnNvbHV0ZVRtcE1hcHBlcjx0eXBl
Pjo6YWJzb2x1dGVJbmRleCh0bXApKSk7CisgICAgICAgIHJldHVybiBUbXBNYXBwZXI6OnRtcEZy
b21BYnNvbHV0ZUluZGV4KGdldEFsaWFzKFRtcE1hcHBlcjo6YWJzb2x1dGVJbmRleCh0bXApKSk7
CiAgICAgfQogCiAgICAgLy8gVGhpcyB0ZWxscyB5b3UgaWYgYSBNb3ZlIHdpbGwgYmUgY29hbGVz
Y2FibGUgaWYgdGhlIHNyYyBhbmQgZHN0IGVuZCB1cCBtYXRjaGluZy4gVGhpcyBtZXRob2QKQEAg
LTc3NSwxMSArMTM4NCwxMSBAQCBwdWJsaWM6CiAgICAgICAgIGlmIChtX2NvYWxlc2NlZFRtcHNB
dFNwaWxsLmlzRW1wdHkoKSkKICAgICAgICAgICAgIHJldHVybiB0bXA7CiAKLSAgICAgICAgdW5z
aWduZWQgYWxpYXNJbmRleCA9IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4
KHRtcCk7CisgICAgICAgIHVuc2lnbmVkIGFsaWFzSW5kZXggPSBUbXBNYXBwZXI6OmFic29sdXRl
SW5kZXgodG1wKTsKICAgICAgICAgd2hpbGUgKHVuc2lnbmVkIG5leHRBbGlhc0luZGV4ID0gbV9j
b2FsZXNjZWRUbXBzQXRTcGlsbFthbGlhc0luZGV4XSkKICAgICAgICAgICAgIGFsaWFzSW5kZXgg
PSBuZXh0QWxpYXNJbmRleDsKIAotICAgICAgICBUbXAgYWxpYXMgPSBBYnNvbHV0ZVRtcE1hcHBl
cjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgoYWxpYXNJbmRleCk7CisgICAgICAgIFRtcCBh
bGlhcyA9IFRtcE1hcHBlcjo6dG1wRnJvbUFic29sdXRlSW5kZXgoYWxpYXNJbmRleCk7CiAKICAg
ICAgICAgQVNTRVJUX1dJVEhfTUVTU0FHRSghbV9zcGlsbGVkVG1wcy5jb250YWlucyhhbGlhc0lu
ZGV4KSB8fCBhbGlhcyA9PSB0bXAsICJUaGUgYWxpYXNlcyBhdCBzcGlsbCBzaG91bGQgYWx3YXlz
IGJlIGNvbG9yYWJsZS4gU29tZXRoaW5nIHdlbnQgaG9ycmlibHkgd3JvbmcuIik7CiAKQEAgLTc5
NCw3ICsxNDAzLDcgQEAgcHVibGljOgogICAgICAgICB7CiAgICAgICAgIH0KIAotICAgICAgICBU
bXAgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRt
cEZyb21BYnNvbHV0ZUluZGV4KCptX2luZGV4SXRlcmF0b3IpOyB9CisgICAgICAgIFRtcCBvcGVy
YXRvciooKSBjb25zdCB7IHJldHVybiBUbXBNYXBwZXI6OnRtcEZyb21BYnNvbHV0ZUluZGV4KCpt
X2luZGV4SXRlcmF0b3IpOyB9CiAgICAgICAgIEluZGV4VG9UbXBJdGVyYXRvckFkYXB0b3ImIG9w
ZXJhdG9yKysoKSB7ICsrbV9pbmRleEl0ZXJhdG9yOyByZXR1cm4gKnRoaXM7IH0KIAogICAgICAg
ICBib29sIG9wZXJhdG9yPT0oY29uc3QgSW5kZXhUb1RtcEl0ZXJhdG9yQWRhcHRvciYgb3RoZXIp
IGNvbnN0CkBAIC04NDMsNyArMTQ1Miw3IEBAIHB1YmxpYzoKICAgICAgICAgQVNTRVJUKG1fY29s
b3JlZFRtcC5zaXplKCkpOwogICAgICAgICBBU1NFUlQodG1wLmlzR1AoKSA9PSAodHlwZSA9PSBB
cmc6OkdQKSk7CiAKLSAgICAgICAgUmVnIHJlZyA9IG1fY29sb3JlZFRtcFtBYnNvbHV0ZVRtcE1h
cHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh0bXApXTsKKyAgICAgICAgUmVnIHJlZyA9IG1fY29s
b3JlZFRtcFtUbXBNYXBwZXI6OmFic29sdXRlSW5kZXgodG1wKV07CiAgICAgICAgIGlmICghcmVn
KSB7CiAgICAgICAgICAgICBkYXRhTG9nKCJGQVRBTDogTm8gY29sb3IgZm9yICIsIHRtcCwgIlxu
Iik7CiAgICAgICAgICAgICBkYXRhTG9nKCJDb2RlOlxuIik7CkBAIC04NTMsMTggKzE0NjIsMTgg
QEAgcHVibGljOgogICAgICAgICByZXR1cm4gcmVnOwogICAgIH0KIAotcHJpdmF0ZToKK3Byb3Rl
Y3RlZDoKICAgICBzdGF0aWMgdW5zaWduZWQgdG1wQXJyYXlTaXplKENvZGUmIGNvZGUpCiAgICAg
ewogICAgICAgICB1bnNpZ25lZCBudW1UbXBzID0gY29kZS5udW1UbXBzKHR5cGUpOwotICAgICAg
ICByZXR1cm4gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgobnVtVG1wcyk7
CisgICAgICAgIHJldHVybiBUbXBNYXBwZXI6OmFic29sdXRlSW5kZXgobnVtVG1wcyk7CiAgICAg
fQogCiAgICAgdm9pZCBpbml0aWFsaXplUHJlY29sb3JlZFRtcCgpCiAgICAgewogICAgICAgICBt
X2NvbG9yZWRUbXAucmVzaXplKG1fbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4ICsgMSk7CiAg
ICAgICAgIGZvciAodW5zaWduZWQgaSA9IDE7IGkgPD0gbV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVy
SW5kZXg7ICsraSkgewotICAgICAgICAgICAgVG1wIHRtcCA9IEFic29sdXRlVG1wTWFwcGVyPHR5
cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleChpKTsKKyAgICAgICAgICAgIFRtcCB0bXAgPSBUbXBN
YXBwZXI6OnRtcEZyb21BYnNvbHV0ZUluZGV4KGkpOwogICAgICAgICAgICAgQVNTRVJUKHRtcC5p
c1JlZygpKTsKICAgICAgICAgICAgIG1fY29sb3JlZFRtcFtpXSA9IHRtcC5yZWcoKTsKICAgICAg
ICAgfQpAQCAtODg0LDEwICsxNDkzLDEwIEBAIHByaXZhdGU6CiAgICAgICAgIGlmIChsZWZ0VG1w
LmlzR1AoKSAhPSAodHlwZSA9PSBBcmc6OkdQKSB8fCByaWdodFRtcC5pc0dQKCkgIT0gKHR5cGUg
PT0gQXJnOjpHUCkpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICAgICAgdW5zaWdu
ZWQgbGVmdEluZGV4ID0gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgobGVm
dFRtcCk7Ci0gICAgICAgIHVuc2lnbmVkIHJpZ2h0SW5kZXggPSBBYnNvbHV0ZVRtcE1hcHBlcjx0
eXBlPjo6YWJzb2x1dGVJbmRleChyaWdodFRtcCk7CisgICAgICAgIHVuc2lnbmVkIGxlZnRJbmRl
eCA9IFRtcE1hcHBlcjo6YWJzb2x1dGVJbmRleChsZWZ0VG1wKTsKKyAgICAgICAgdW5zaWduZWQg
cmlnaHRJbmRleCA9IFRtcE1hcHBlcjo6YWJzb2x1dGVJbmRleChyaWdodFRtcCk7CiAKLSAgICAg
ICAgcmV0dXJuICFtX2ludGVyZmVyZW5jZUVkZ2VzLmNvbnRhaW5zKEludGVyZmVyZW5jZUVkZ2Uo
bGVmdEluZGV4LCByaWdodEluZGV4KSk7CisgICAgICAgIHJldHVybiAhaGFzSW50ZXJmZXJlbmNl
RWRnZShJbnRlcmZlcmVuY2VFZGdlKGxlZnRJbmRleCwgcmlnaHRJbmRleCkpOwogICAgIH0KIAog
ICAgIHZvaWQgYWRkVG9Mb3dQcmlvcml0eUNvYWxlc2NpbmdDYW5kaWRhdGVzKEFyZyBsZWZ0LCBB
cmcgcmlnaHQpCkBAIC04OTYsOCArMTUwNSw4IEBAIHByaXZhdGU6CiAgICAgICAgIFRtcCBsZWZ0
VG1wID0gbGVmdC50bXAoKTsKICAgICAgICAgVG1wIHJpZ2h0VG1wID0gcmlnaHQudG1wKCk7CiAK
LSAgICAgICAgdW5zaWduZWQgbGVmdEluZGV4ID0gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFi
c29sdXRlSW5kZXgobGVmdFRtcCk7Ci0gICAgICAgIHVuc2lnbmVkIHJpZ2h0SW5kZXggPSBBYnNv
bHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChyaWdodFRtcCk7CisgICAgICAgIHVu
c2lnbmVkIGxlZnRJbmRleCA9IFRtcE1hcHBlcjo6YWJzb2x1dGVJbmRleChsZWZ0VG1wKTsKKyAg
ICAgICAgdW5zaWduZWQgcmlnaHRJbmRleCA9IFRtcE1hcHBlcjo6YWJzb2x1dGVJbmRleChyaWdo
dFRtcCk7CiAKICAgICAgICAgdW5zaWduZWQgbmV4dE1vdmVJbmRleCA9IG1fY29hbGVzY2luZ0Nh
bmRpZGF0ZXMuc2l6ZSgpOwogICAgICAgICBtX2NvYWxlc2NpbmdDYW5kaWRhdGVzLmFwcGVuZCh7
IGxlZnRJbmRleCwgcmlnaHRJbmRleCB9KTsKQEAgLTkwNSwxNSArMTUxNCwxNSBAQCBwcml2YXRl
OgogICAgICAgICB1bnNpZ25lZCBuZXdJbmRleEluV29ya2xpc3QgPSBtX3dvcmtsaXN0TW92ZXMu
YWRkTG93UHJpb3JpdHlNb3ZlKCk7CiAgICAgICAgIEFTU0VSVF9VTlVTRUQobmV3SW5kZXhJbldv
cmtsaXN0LCBuZXdJbmRleEluV29ya2xpc3QgPT0gbmV4dE1vdmVJbmRleCk7CiAKLSAgICAgICAg
QVNTRVJUKG5leHRNb3ZlSW5kZXggPD0gbV9hY3RpdmVNb3Zlcy5zaXplKCkpOwotICAgICAgICBt
X2FjdGl2ZU1vdmVzLmVuc3VyZVNpemUobmV4dE1vdmVJbmRleCArIDEpOwotCiAgICAgICAgIG1f
bW92ZUxpc3RbbGVmdEluZGV4XS5hZGQobmV4dE1vdmVJbmRleCk7CiAgICAgICAgIG1fbW92ZUxp
c3RbcmlnaHRJbmRleF0uYWRkKG5leHRNb3ZlSW5kZXgpOwogICAgIH0KIAogICAgIHZvaWQgYnVp
bGQoKQogICAgIHsKKyAgICAgICAgbV9jb2FsZXNjaW5nQ2FuZGlkYXRlcy5jbGVhcigpOworICAg
ICAgICBtX3dvcmtsaXN0TW92ZXMuY2xlYXIoKTsKKwogICAgICAgICBUbXBMaXZlbmVzczx0eXBl
PiBsaXZlbmVzcyhtX2NvZGUpOwogICAgICAgICBmb3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogbV9j
b2RlKSB7CiAgICAgICAgICAgICB0eXBlbmFtZSBUbXBMaXZlbmVzczx0eXBlPjo6TG9jYWxDYWxj
IGxvY2FsQ2FsYyhsaXZlbmVzcywgYmxvY2spOwpAQCAtOTMyLDYgKzE1NDEsNyBAQCBwcml2YXRl
OgogICAgIHsKICAgICAgICAgaWYgKHRyYWNlRGVidWcpCiAgICAgICAgICAgICBkYXRhTG9nKCJC
dWlsZGluZyBiZXR3ZWVuICIsIHBvaW50ZXJEdW1wKHByZXZJbnN0KSwgIiBhbmQgIiwgcG9pbnRl
ckR1bXAobmV4dEluc3QpLCAiOlxuIik7CisKICAgICAgICAgSW5zdDo6Zm9yRWFjaERlZldpdGhF
eHRyYUNsb2JiZXJlZFJlZ3M8VG1wPigKICAgICAgICAgICAgIHByZXZJbnN0LCBuZXh0SW5zdCwK
ICAgICAgICAgICAgIFsmXSAoY29uc3QgVG1wJiBhcmcsIEFyZzo6Um9sZSwgQXJnOjpUeXBlIGFy
Z1R5cGUsIEFyZzo6V2lkdGgpIHsKQEAgLTk3MSwxNiArMTU4MSwxNSBAQCBwcml2YXRlOgogICAg
ICAgICAgICAgQVNTRVJUKHVzZVRtcCk7CiAKICAgICAgICAgICAgIHVuc2lnbmVkIG5leHRNb3Zl
SW5kZXggPSBtX2NvYWxlc2NpbmdDYW5kaWRhdGVzLnNpemUoKTsKLSAgICAgICAgICAgIG1fY29h
bGVzY2luZ0NhbmRpZGF0ZXMuYXBwZW5kKHsgQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29s
dXRlSW5kZXgodXNlVG1wKSwgQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgo
ZGVmVG1wKSB9KTsKKyAgICAgICAgICAgIG1fY29hbGVzY2luZ0NhbmRpZGF0ZXMuYXBwZW5kKHsg
VG1wTWFwcGVyOjphYnNvbHV0ZUluZGV4KHVzZVRtcCksIFRtcE1hcHBlcjo6YWJzb2x1dGVJbmRl
eChkZWZUbXApIH0pOworICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpCisgICAgICAgICAgICAg
ICAgZGF0YUxvZ0xuKCJNb3ZlIGF0IGluZGV4ICIsIG5leHRNb3ZlSW5kZXgsICIgaXM6ICIsICpw
cmV2SW5zdCk7CiAKICAgICAgICAgICAgIHVuc2lnbmVkIG5ld0luZGV4SW5Xb3JrbGlzdCA9IG1f
d29ya2xpc3RNb3Zlcy5hZGRNb3ZlKCk7CiAgICAgICAgICAgICBBU1NFUlRfVU5VU0VEKG5ld0lu
ZGV4SW5Xb3JrbGlzdCwgbmV3SW5kZXhJbldvcmtsaXN0ID09IG5leHRNb3ZlSW5kZXgpOwogCi0g
ICAgICAgICAgICBBU1NFUlQobmV4dE1vdmVJbmRleCA8PSBtX2FjdGl2ZU1vdmVzLnNpemUoKSk7
Ci0gICAgICAgICAgICBtX2FjdGl2ZU1vdmVzLmVuc3VyZVNpemUobmV4dE1vdmVJbmRleCArIDEp
OwotCiAgICAgICAgICAgICBmb3IgKGNvbnN0IEFyZyYgYXJnIDogcHJldkluc3QtPmFyZ3MpIHsK
LSAgICAgICAgICAgICAgICBhdXRvJiBsaXN0ID0gbV9tb3ZlTGlzdFtBYnNvbHV0ZVRtcE1hcHBl
cjx0eXBlPjo6YWJzb2x1dGVJbmRleChhcmcudG1wKCkpXTsKKyAgICAgICAgICAgICAgICBhdXRv
JiBsaXN0ID0gbV9tb3ZlTGlzdFtUbXBNYXBwZXI6OmFic29sdXRlSW5kZXgoYXJnLnRtcCgpKV07
CiAgICAgICAgICAgICAgICAgbGlzdC5hZGQobmV4dE1vdmVJbmRleCk7CiAgICAgICAgICAgICB9
CiAKQEAgLTEwNDMsNyArMTY1Miw3IEBAIHByaXZhdGU6CiAgICAgICAgICAgICAgICAgfQogCiAg
ICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gQXJnOjpHUCAmJiAhYXJnLmlzR1BSKCkpCi0gICAg
ICAgICAgICAgICAgICAgIG1faW50ZXJmZXJlc1dpdGhGcmFtZVBvaW50ZXIucXVpY2tTZXQoQWJz
b2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgoYXJnKSk7CisgICAgICAgICAgICAg
ICAgICAgIG1faW50ZXJmZXJlc1dpdGhGcmFtZVBvaW50ZXIucXVpY2tTZXQoVG1wTWFwcGVyOjph
YnNvbHV0ZUluZGV4KGFyZykpOwogICAgICAgICAgICAgfSk7CiAgICAgfQogCkBAIC0xMDUxLDcg
KzE2NjAsNyBAQCBwcml2YXRlOgogICAgIHsKICAgICAgICAgQVNTRVJUX1dJVEhfTUVTU0FHRShh
LmlzR1AoKSA9PSBiLmlzR1AoKSwgIkFuIGludGVyZmVyZW5jZSBiZXR3ZWVuIHJlZ2lzdGVycyBv
ZiBkaWZmZXJlbnQgdHlwZXMgZG9lcyBub3QgbWFrZSBzZW5zZSwgaXQgY2FuIGxlYWQgdG8gbm9u
LWNvbG9yYWJsZSBncmFwaHMuIik7CiAKLSAgICAgICAgYWRkRWRnZShBYnNvbHV0ZVRtcE1hcHBl
cjx0eXBlPjo6YWJzb2x1dGVJbmRleChhKSwgQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29s
dXRlSW5kZXgoYikpOworICAgICAgICBhZGRFZGdlKFRtcE1hcHBlcjo6YWJzb2x1dGVJbmRleChh
KSwgVG1wTWFwcGVyOjphYnNvbHV0ZUluZGV4KGIpKTsKICAgICB9CiAKICAgICAvLyBDYWxsaW5n
IHRoaXMgd2l0aG91dCBhIHRtcFdpZHRoIHdpbGwgcGVyZm9ybSBhIG1vcmUgY29uc2VydmF0aXZl
IGNvYWxlc2NpbmcgYW5hbHlzaXMgdGhhdCBhc3N1bWVzCkBAIC0xMTA2LDE3MyArMTcxNSwyNCBA
QCBwcml2YXRlOgogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICB2b2lkIHNlbGVj
dFNwaWxsKCkKLSAgICB7Ci0gICAgICAgIGlmICghbV9oYXNTZWxlY3RlZFNwaWxsKSB7Ci0gICAg
ICAgICAgICBtX2hhc1NlbGVjdGVkU3BpbGwgPSB0cnVlOwotCi0gICAgICAgICAgICBpZiAobV9o
YXNDb2FsZXNjZWROb25Ucml2aWFsTW92ZSkKLSAgICAgICAgICAgICAgICBtX2NvYWxlc2NlZFRt
cHNBdFNwaWxsID0gbV9jb2FsZXNjZWRUbXBzOwotICAgICAgICB9Ci0KLSAgICAgICAgYXV0byBp
dGVyYXRvciA9IG1fc3BpbGxXb3JrbGlzdC5iZWdpbigpOwotCi0gICAgICAgIFJFTEVBU0VfQVNT
RVJUX1dJVEhfTUVTU0FHRShpdGVyYXRvciAhPSBtX3NwaWxsV29ya2xpc3QuZW5kKCksICJzZWxl
Y3RTcGlsbCgpIGNhbGxlZCB3aGVuIHRoZXJlIHdhcyBubyBzcGlsbC4iKTsKLSAgICAgICAgUkVM
RUFTRV9BU1NFUlRfV0lUSF9NRVNTQUdFKCFtX3Vuc3BpbGxhYmxlVG1wcy5jb250YWlucygqaXRl
cmF0b3IpLCAidHJ5aW5nIHRvIHNwaWxsIHVuc3BpbGxhYmxlIHRtcCIpOwotCi0gICAgICAgIC8v
IEhpZ2hlciBzY29yZSBtZWFucyBtb3JlIGRlc2lyYWJsZSB0byBzcGlsbC4gTG93ZXIgc2NvcmVz
IG1heGltaXplIHRoZSBsaWtlbGlob29kIHRoYXQgYSB0bXAKLSAgICAgICAgLy8gZ2V0cyBhIHJl
Z2lzdGVyLgotICAgICAgICBhdXRvIHNjb3JlID0gWyZdIChUbXAgdG1wKSAtPiBkb3VibGUgewot
ICAgICAgICAgICAgLy8gQWlyIGV4cG9zZXMgdGhlIGNvbmNlcHQgb2YgImZhc3QgdG1wcyIsIGFu
ZCB3ZSBpbnRlcnByZXQgdGhhdCB0byBtZWFuIHRoYXQgdGhlIHRtcAotICAgICAgICAgICAgLy8g
c2hvdWxkIGFsd2F5cyBiZSBpbiBhIHJlZ2lzdGVyLgotICAgICAgICAgICAgaWYgKG1fY29kZS5p
c0Zhc3RUbXAodG1wKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIAot
ICAgICAgICAgICAgLy8gQWxsIGVsc2UgYmVpbmcgZXF1YWwsIHRoZSBzY29yZSBzaG91bGQgYmUg
ZGlyZWN0bHkgcmVsYXRlZCB0byB0aGUgZGVncmVlLgotICAgICAgICAgICAgZG91YmxlIGRlZ3Jl
ZSA9IHN0YXRpY19jYXN0PGRvdWJsZT4obV9kZWdyZWVzW0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+
OjphYnNvbHV0ZUluZGV4KHRtcCldKTsKLQotICAgICAgICAgICAgLy8gQWxsIGVsc2UgYmVpbmcg
ZXF1YWwsIHRoZSBzY29yZSBzaG91bGQgYmUgaW52ZXJzZWx5IHJlbGF0ZWQgdG8gdGhlIG51bWJl
ciBvZiB3YXJtIHVzZXMgYW5kCi0gICAgICAgICAgICAvLyBkZWZzLgotICAgICAgICAgICAgY29u
c3QgVXNlQ291bnRzPFRtcD46OkNvdW50cyogY291bnRzID0gbV91c2VDb3VudHNbdG1wXTsKLSAg
ICAgICAgICAgIGlmICghY291bnRzKQotICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6Om51bWVy
aWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAg
IGRvdWJsZSB1c2VzID0gY291bnRzLT5udW1XYXJtVXNlcyArIGNvdW50cy0+bnVtRGVmczsKLQot
ICAgICAgICAgICAgLy8gSWYgaXQncyBhIGNvbnN0YW50LCB0aGVuIGl0J3Mgbm90IGFzIGJhZCB0
byBzcGlsbC4gV2UgY2FuIHJlbWF0ZXJpYWxpemUgaXQgaW4gbWFueQotICAgICAgICAgICAgLy8g
Y2FzZXMuCi0gICAgICAgICAgICBpZiAoY291bnRzLT5udW1Db25zdERlZnMgPT0gMSAmJiBjb3Vu
dHMtPm51bURlZnMgPT0gMSkKLSAgICAgICAgICAgICAgICB1c2VzIC89IDI7Ci0KLSAgICAgICAg
ICAgIHJldHVybiBkZWdyZWUgLyB1c2VzOwotICAgICAgICB9OwotCi0gICAgICAgIGF1dG8gdmlj
dGltSXRlcmF0b3IgPSBpdGVyYXRvcjsKLSAgICAgICAgZG91YmxlIG1heFNjb3JlID0gc2NvcmUo
QWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KCppdGVyYXRvcikp
OwotCi0gICAgICAgICsraXRlcmF0b3I7Ci0gICAgICAgIGZvciAoO2l0ZXJhdG9yICE9IG1fc3Bp
bGxXb3JrbGlzdC5lbmQoKTsgKytpdGVyYXRvcikgewotICAgICAgICAgICAgZG91YmxlIHRtcFNj
b3JlID0gc2NvcmUoQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4
KCppdGVyYXRvcikpOwotICAgICAgICAgICAgaWYgKHRtcFNjb3JlID4gbWF4U2NvcmUpIHsKLSAg
ICAgICAgICAgICAgICBBU1NFUlQoIW1fdW5zcGlsbGFibGVUbXBzLmNvbnRhaW5zKCppdGVyYXRv
cikpOwotICAgICAgICAgICAgICAgIHZpY3RpbUl0ZXJhdG9yID0gaXRlcmF0b3I7Ci0gICAgICAg
ICAgICAgICAgbWF4U2NvcmUgPSB0bXBTY29yZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQot
Ci0gICAgICAgIHVuc2lnbmVkIHZpY3RpbUluZGV4ID0gKnZpY3RpbUl0ZXJhdG9yOwotICAgICAg
ICBtX3NwaWxsV29ya2xpc3QucmVtb3ZlKHZpY3RpbUl0ZXJhdG9yKTsKLSAgICAgICAgbV9zaW1w
bGlmeVdvcmtsaXN0LmFwcGVuZCh2aWN0aW1JbmRleCk7Ci0KLSAgICAgICAgZnJlZXplTW92ZXMo
dmljdGltSW5kZXgpOwotICAgIH0KLQotICAgIHZvaWQgYWxsb2NhdGUoKQotICAgIHsKLSAgICAg
ICAgQVNTRVJUX1dJVEhfTUVTU0FHRShtX2FjdGl2ZU1vdmVzLnNpemUoKSA+PSBtX2NvYWxlc2Np
bmdDYW5kaWRhdGVzLnNpemUoKSwgIlRoZSBhY3RpdmVNb3ZlIHNldCBzaG91bGQgYmUgYmlnIGVu
b3VnaCBmb3IgdGhlIHF1aWNrIG9wZXJhdGlvbnMgb2YgQml0VmVjdG9yLiIpOwotCi0gICAgICAg
IG1ha2VXb3JrTGlzdCgpOwotCi0gICAgICAgIGlmIChkZWJ1ZykgewotICAgICAgICAgICAgZGF0
YUxvZygiSW50ZXJmZXJlbmNlOiAiLCBsaXN0RHVtcChtX2ludGVyZmVyZW5jZUVkZ2VzKSwgIlxu
Iik7Ci0gICAgICAgICAgICBkdW1wSW50ZXJmZXJlbmNlR3JhcGhJbkRvdChXVEY6OmRhdGFGaWxl
KCkpOwotICAgICAgICAgICAgZGF0YUxvZygiQ29hbGVzY2luZyBjYW5kaWRhdGVzOlxuIik7Ci0g
ICAgICAgICAgICBmb3IgKE1vdmVPcGVyYW5kcyYgbW92ZU9wIDogbV9jb2FsZXNjaW5nQ2FuZGlk
YXRlcykgewotICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICAiLCBBYnNvbHV0ZVRtcE1hcHBl
cjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgobW92ZU9wLnNyY0luZGV4KSwKLSAgICAgICAg
ICAgICAgICAgICAgIiAtPiAiLCBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29s
dXRlSW5kZXgobW92ZU9wLmRzdEluZGV4KSwgIlxuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAg
ICAgICBkYXRhTG9nKCJJbml0aWFsIHdvcmsgbGlzdFxuIik7Ci0gICAgICAgICAgICBkdW1wV29y
a0xpc3RzKFdURjo6ZGF0YUZpbGUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBkbyB7Ci0gICAg
ICAgICAgICBpZiAodHJhY2VEZWJ1ZykgewotICAgICAgICAgICAgICAgIGRhdGFMb2coIkJlZm9y
ZSBHcmFwaCBzaW1wbGlmaWNhdGlvbiBpdGVyYXRpb25cbiIpOwotICAgICAgICAgICAgICAgIGR1
bXBXb3JrTGlzdHMoV1RGOjpkYXRhRmlsZSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAg
ICAgaWYgKCFtX3NpbXBsaWZ5V29ya2xpc3QuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIHNp
bXBsaWZ5KCk7Ci0gICAgICAgICAgICBlbHNlIGlmICghbV93b3JrbGlzdE1vdmVzLmlzRW1wdHko
KSkKLSAgICAgICAgICAgICAgICBjb2FsZXNjZSgpOwotICAgICAgICAgICAgZWxzZSBpZiAoIW1f
ZnJlZXplV29ya2xpc3QuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIGZyZWV6ZSgpOwotICAg
ICAgICAgICAgZWxzZSBpZiAoIW1fc3BpbGxXb3JrbGlzdC5pc0VtcHR5KCkpCi0gICAgICAgICAg
ICAgICAgc2VsZWN0U3BpbGwoKTsKLQotICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpIHsKLSAg
ICAgICAgICAgICAgICBkYXRhTG9nKCJBZnRlciBHcmFwaCBzaW1wbGlmaWNhdGlvbiBpdGVyYXRp
b25cbiIpOwotICAgICAgICAgICAgICAgIGR1bXBXb3JrTGlzdHMoV1RGOjpkYXRhRmlsZSgpKTsK
LSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSAoIW1fc2ltcGxpZnlXb3JrbGlzdC5pc0Vt
cHR5KCkgfHwgIW1fd29ya2xpc3RNb3Zlcy5pc0VtcHR5KCkgfHwgIW1fZnJlZXplV29ya2xpc3Qu
aXNFbXB0eSgpIHx8ICFtX3NwaWxsV29ya2xpc3QuaXNFbXB0eSgpKTsKLQotICAgICAgICBhc3Np
Z25Db2xvcnMoKTsKLSAgICB9Ci0KLSNpZiBQTEFURk9STShDT0NPQSkKLSNwcmFnbWEgbWFyayAt
IERlYnVnZ2luZyBoZWxwZXJzLgotI2VuZGlmCi0KLSAgICB2b2lkIGR1bXBJbnRlcmZlcmVuY2VH
cmFwaEluRG90KFByaW50U3RyZWFtJiBvdXQpCi0gICAgewotICAgICAgICBvdXQucHJpbnQoImdy
YXBoIEludGVyZmVyZW5jZUdyYXBoIHsgXG4iKTsKLQotICAgICAgICBIYXNoU2V0PFRtcD4gdG1w
c1dpdGhJbnRlcmZlcmVuY2VzOwotICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGVkZ2UgOiBtX2lu
dGVyZmVyZW5jZUVkZ2VzKSB7Ci0gICAgICAgICAgICB0bXBzV2l0aEludGVyZmVyZW5jZXMuYWRk
KEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleChlZGdlLmZpcnN0
KCkpKTsKLSAgICAgICAgICAgIHRtcHNXaXRoSW50ZXJmZXJlbmNlcy5hZGQoQWJzb2x1dGVUbXBN
YXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KGVkZ2Uuc2Vjb25kKCkpKTsKLSAgICAg
ICAgfQotCi0gICAgICAgIGZvciAoY29uc3QgYXV0byYgdG1wIDogdG1wc1dpdGhJbnRlcmZlcmVu
Y2VzKSB7Ci0gICAgICAgICAgICB1bnNpZ25lZCB0bXBJbmRleCA9IEFic29sdXRlVG1wTWFwcGVy
PHR5cGU+OjphYnNvbHV0ZUluZGV4KHRtcCk7Ci0gICAgICAgICAgICBpZiAodG1wSW5kZXggPCBt
X2RlZ3JlZXMuc2l6ZSgpKQotICAgICAgICAgICAgICAgIG91dC5wcmludCgiICAgICIsIHRtcC5p
bnRlcm5hbFZhbHVlKCksICIgW2xhYmVsPVwiIiwgdG1wLCAiICgiLCBtX2RlZ3JlZXNbdG1wSW5k
ZXhdLCAiKVwiXTtcbiIpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG91dC5w
cmludCgiICAgICIsIHRtcC5pbnRlcm5hbFZhbHVlKCksICIgW2xhYmVsPVwiIiwgdG1wLCAiXCJd
O1xuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGVkZ2UgOiBtX2lu
dGVyZmVyZW5jZUVkZ2VzKQotICAgICAgICAgICAgb3V0LnByaW50KCIgICAgIiwgZWRnZS5maXJz
dCgpLCAiIC0tICIsIGVkZ2Uuc2Vjb25kKCksICI7XG4iKTsKLSAgICAgICAgb3V0LnByaW50KCJ9
XG4iKTsKLSAgICB9Ci0KLSAgICB2b2lkIGR1bXBXb3JrTGlzdHMoUHJpbnRTdHJlYW0mIG91dCkK
LSAgICB7Ci0gICAgICAgIG91dC5wcmludCgiU2ltcGxpZnkgd29yayBsaXN0OlxuIik7Ci0gICAg
ICAgIGZvciAodW5zaWduZWQgdG1wSW5kZXggOiBtX3NpbXBsaWZ5V29ya2xpc3QpCi0gICAgICAg
ICAgICBvdXQucHJpbnQoIiAgICAiLCBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFi
c29sdXRlSW5kZXgodG1wSW5kZXgpLCAiXG4iKTsKLSAgICAgICAgb3V0LnByaW50ZigiTW92ZXMg
d29yayBsaXN0IGlzIGVtcHR5PyAlZFxuIiwgbV93b3JrbGlzdE1vdmVzLmlzRW1wdHkoKSk7Ci0g
ICAgICAgIG91dC5wcmludCgiRnJlZXplIHdvcmsgbGlzdDpcbiIpOwotICAgICAgICBmb3IgKHVu
c2lnbmVkIHRtcEluZGV4IDogbV9mcmVlemVXb3JrbGlzdCkKLSAgICAgICAgICAgIG91dC5wcmlu
dCgiICAgICIsIEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleCh0
bXBJbmRleCksICJcbiIpOwotICAgICAgICBvdXQucHJpbnQoIlNwaWxsIHdvcmsgbGlzdDpcbiIp
OwotICAgICAgICBmb3IgKHVuc2lnbmVkIHRtcEluZGV4IDogbV9zcGlsbFdvcmtsaXN0KQotICAg
ICAgICAgICAgb3V0LnByaW50KCIgICAgIiwgQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZy
b21BYnNvbHV0ZUluZGV4KHRtcEluZGV4KSwgIlxuIik7Ci0gICAgfQotCi0gICAgdXNpbmcgQWJz
dHJhY3RDb2xvcmluZ0FsbG9jYXRvcjx1bnNpZ25lZD46OmFkZEVkZ2U7Ci0gICAgdXNpbmcgQWJz
dHJhY3RDb2xvcmluZ0FsbG9jYXRvcjx1bnNpZ25lZD46OmdldEFsaWFzOwotCi0gICAgQ29kZSYg
bV9jb2RlOwogICAgIFRtcFdpZHRoJiBtX3RtcFdpZHRoOwotICAgIC8vIEZJWE1FOiBzcGlsbGlu
ZyBzaG91bGQgbm90IHR5cGUgc3BlY2lmaWMuIEl0IGlzIG9ubHkgYSBzaWRlIGVmZmVjdCBvZiB1
c2luZyBVc2VDb3VudHMuCi0gICAgY29uc3QgVXNlQ291bnRzPFRtcD4mIG1fdXNlQ291bnRzOwog
fTsKIAotY2xhc3MgSXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcgeworY2xhc3MgR3JhcGhDb2xv
cmluZ1JlZ2lzdGVyQWxsb2NhdGlvbiB7CiBwdWJsaWM6Ci0gICAgSXRlcmF0ZWRSZWdpc3RlckNv
YWxlc2NpbmcoQ29kZSYgY29kZSkKKyAgICBHcmFwaENvbG9yaW5nUmVnaXN0ZXJBbGxvY2F0aW9u
KENvZGUmIGNvZGUsIFVzZUNvdW50czxUbXA+JiB1c2VDb3VudHMpCiAgICAgICAgIDogbV9jb2Rl
KGNvZGUpCi0gICAgICAgICwgbV91c2VDb3VudHMoY29kZSkKKyAgICAgICAgLCBtX3VzZUNvdW50
cyh1c2VDb3VudHMpCiAgICAgewogICAgIH0KIAogICAgIHZvaWQgcnVuKCkKICAgICB7CiAgICAg
ICAgIHBhZEludGVyZmVyZW5jZShtX2NvZGUpOwotICAgICAgICAKLSAgICAgICAgaXRlcmF0ZWRS
ZWdpc3RlckNvYWxlc2NpbmdPblR5cGU8QXJnOjpHUD4oKTsKLSAgICAgICAgaXRlcmF0ZWRSZWdp
c3RlckNvYWxlc2NpbmdPblR5cGU8QXJnOjpGUD4oKTsKKworICAgICAgICBhbGxvY2F0ZU9uVHlw
ZTxBcmc6OkdQPigpOworICAgICAgICBtX251bUl0ZXJhdGlvbnMgPSAwOworICAgICAgICBhbGxv
Y2F0ZU9uVHlwZTxBcmc6OkZQPigpOwogCiAgICAgICAgIGZpeFNwaWxsc0FmdGVyVGVybWluYWxz
KCk7CiAKQEAgLTEyODIsNyArMTc0Miw3IEBAIHB1YmxpYzoKIAogcHJpdmF0ZToKICAgICB0ZW1w
bGF0ZTxBcmc6OlR5cGUgdHlwZT4KLSAgICB2b2lkIGl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5n
T25UeXBlKCkKKyAgICB2b2lkIGFsbG9jYXRlT25UeXBlKCkKICAgICB7CiAgICAgICAgIEhhc2hT
ZXQ8dW5zaWduZWQ+IHVuc3BpbGxhYmxlVG1wcyA9IGNvbXB1dGVVbnNwaWxsYWJsZVRtcHM8dHlw
ZT4oKTsKIApAQCAtMTMxMSwyMiArMTc3MSwzOCBAQCBwcml2YXRlOgogICAgICAgICAgICAgLy8g
cmVjb21wdXRhdGlvbiwgaW4gd2hpY2ggY2FzZSBzcGVlZGluZyB1cCB0aGUgbG9va3VwIHdvdWxk
IGJlIGEgYmlnZ2VyIHdpbi4KICAgICAgICAgICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD0xNTI0NzgKICAgICAgICAgICAgIG1fdG1wV2lkdGgucmVjb21wdXRl
KG1fY29kZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIENvbG9yaW5nQWxsb2NhdG9yPHR5
cGU+IGFsbG9jYXRvcihtX2NvZGUsIG1fdG1wV2lkdGgsIG1fdXNlQ291bnRzLCB1bnNwaWxsYWJs
ZVRtcHMpOwotICAgICAgICAgICAgaWYgKCFhbGxvY2F0b3IucmVxdWlyZXNTcGlsbGluZygpKSB7
Ci0gICAgICAgICAgICAgICAgYXNzaWduUmVnaXN0ZXJzVG9UbXAoYWxsb2NhdG9yKTsKLSAgICAg
ICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKLSAgICAgICAgICAgICAgICAgICAgZGF0YUxvZygi
U3VjY2Vzc2Z1bGwgYWxsb2NhdGlvbiBhdCBpdGVyYXRpb24gIiwgbV9udW1JdGVyYXRpb25zLCAi
OlxuIiwgbV9jb2RlKTsKIAotICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGF1
dG8gZG9BbGxvY2F0aW9uID0gWyZdIChhdXRvJiBhbGxvY2F0b3IpIC0+IGJvb2wgeworICAgICAg
ICAgICAgICAgIGFsbG9jYXRvci5hbGxvY2F0ZSgpOworICAgICAgICAgICAgICAgIGlmICghYWxs
b2NhdG9yLnJlcXVpcmVzU3BpbGxpbmcoKSkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLT5h
c3NpZ25SZWdpc3RlcnNUb1RtcDx0eXBlPihhbGxvY2F0b3IpOworICAgICAgICAgICAgICAgICAg
ICBpZiAodHJhY2VEZWJ1ZykKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFMb2coIlN1Y2Nl
c3NmdWxsIGFsbG9jYXRpb24gYXQgaXRlcmF0aW9uICIsIG1fbnVtSXRlcmF0aW9ucywgIjpcbiIs
IG1fY29kZSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhpcy0+YWRkU3BpbGxBbmRGaWxsPHR5cGU+KGFs
bG9jYXRvciwgdW5zcGlsbGFibGVUbXBzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgICAgICAgICB9OworICAgICAgICAgICAgCisgICAgICAgICAgICBib29sIGRvbmU7Cisg
ICAgICAgICAgICBpZiAoKGlzQVJNNjQoKSB8fCBPcHRpb25zOjphaXJGb3JjZUJyaWdnc0FsbG9j
YXRvcigpKSAmJiAhT3B0aW9uczo6YWlyRm9yY2VJUkNBbGxvY2F0b3IoKSkgeworICAgICAgICAg
ICAgICAgIENvbG9yaW5nQWxsb2NhdG9yPHR5cGUsIEJyaWdncz4gYWxsb2NhdG9yKG1fY29kZSwg
bV90bXBXaWR0aCwgbV91c2VDb3VudHMsIHVuc3BpbGxhYmxlVG1wcyk7CisgICAgICAgICAgICAg
ICAgZG9uZSA9IGRvQWxsb2NhdGlvbihhbGxvY2F0b3IpOworICAgICAgICAgICAgfSBlbHNlIHsK
KyAgICAgICAgICAgICAgICBDb2xvcmluZ0FsbG9jYXRvcjx0eXBlLCBJUkM+IGFsbG9jYXRvciht
X2NvZGUsIG1fdG1wV2lkdGgsIG1fdXNlQ291bnRzLCB1bnNwaWxsYWJsZVRtcHMpOworICAgICAg
ICAgICAgICAgIGRvbmUgPSBkb0FsbG9jYXRpb24oYWxsb2NhdG9yKTsKICAgICAgICAgICAgIH0K
LSAgICAgICAgICAgIGFkZFNwaWxsQW5kRmlsbDx0eXBlPihhbGxvY2F0b3IsIHVuc3BpbGxhYmxl
VG1wcyk7CisgICAgICAgICAgICBpZiAoZG9uZSkKKyAgICAgICAgICAgICAgICByZXR1cm47CiAg
ICAgICAgIH0KICAgICB9CiAKICAgICB0ZW1wbGF0ZTxBcmc6OlR5cGUgdHlwZT4KICAgICBIYXNo
U2V0PHVuc2lnbmVkPiBjb21wdXRlVW5zcGlsbGFibGVUbXBzKCkKICAgICB7CisKICAgICAgICAg
SGFzaFNldDx1bnNpZ25lZD4gdW5zcGlsbGFibGVUbXBzOwogCiAgICAgICAgIHN0cnVjdCBSYW5n
ZSB7CkBAIC0xMzkwLDggKzE4NjYsOCBAQCBwcml2YXRlOgogICAgICAgICByZXR1cm4gdW5zcGls
bGFibGVUbXBzOwogICAgIH0KIAotICAgIHRlbXBsYXRlPEFyZzo6VHlwZSB0eXBlPgotICAgIHZv
aWQgYXNzaWduUmVnaXN0ZXJzVG9UbXAoY29uc3QgQ29sb3JpbmdBbGxvY2F0b3I8dHlwZT4mIGFs
bG9jYXRvcikKKyAgICB0ZW1wbGF0ZTxBcmc6OlR5cGUgdHlwZSwgdHlwZW5hbWUgQWxsb2NhdG9y
VHlwZT4KKyAgICB2b2lkIGFzc2lnblJlZ2lzdGVyc1RvVG1wKGNvbnN0IEFsbG9jYXRvclR5cGUm
IGFsbG9jYXRvcikKICAgICB7CiAgICAgICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBtX2Nv
ZGUpIHsKICAgICAgICAgICAgIC8vIEdpdmUgVG1wIGEgdmFsaWQgcmVnaXN0ZXIuCkBAIC0xNDQ3
LDggKzE5MjMsOCBAQCBwcml2YXRlOgogICAgICAgICByZXR1cm4gd2lkdGggPD0gQXJnOjpXaWR0
aDMyID8gNCA6IDg7CiAgICAgfQogCi0gICAgdGVtcGxhdGU8QXJnOjpUeXBlIHR5cGU+Ci0gICAg
dm9pZCBhZGRTcGlsbEFuZEZpbGwoY29uc3QgQ29sb3JpbmdBbGxvY2F0b3I8dHlwZT4mIGFsbG9j
YXRvciwgSGFzaFNldDx1bnNpZ25lZD4mIHVuc3BpbGxhYmxlVG1wcykKKyAgICB0ZW1wbGF0ZTxB
cmc6OlR5cGUgdHlwZSwgdHlwZW5hbWUgQWxsb2NhdG9yVHlwZT4KKyAgICB2b2lkIGFkZFNwaWxs
QW5kRmlsbChjb25zdCBBbGxvY2F0b3JUeXBlJiBhbGxvY2F0b3IsIEhhc2hTZXQ8dW5zaWduZWQ+
JiB1bnNwaWxsYWJsZVRtcHMpCiAgICAgewogICAgICAgICBIYXNoTWFwPFRtcCwgU3RhY2tTbG90
Kj4gc3RhY2tTbG90czsKICAgICAgICAgZm9yIChUbXAgdG1wIDogYWxsb2NhdG9yLnNwaWxsZWRU
bXBzKCkpIHsKQEAgLTE2MzcsMTggKzIxMTMsMTkgQEAgcHJpdmF0ZToKIAogICAgIENvZGUmIG1f
Y29kZTsKICAgICBUbXBXaWR0aCBtX3RtcFdpZHRoOwotICAgIFVzZUNvdW50czxUbXA+IG1fdXNl
Q291bnRzOworICAgIFVzZUNvdW50czxUbXA+JiBtX3VzZUNvdW50czsKICAgICB1bnNpZ25lZCBt
X251bUl0ZXJhdGlvbnMgeyAwIH07CiB9OwogCiB9IC8vIGFub255bW91cyBuYW1lc3BhY2UKIAot
dm9pZCBpdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZyhDb2RlJiBjb2RlKQordm9pZCBhbGxvY2F0
ZVJlZ2lzdGVyc1Rocm91Z2hHcmFwaENvbG9yaW5nKENvZGUmIGNvZGUpCiB7Ci0gICAgUGhhc2VT
Y29wZSBwaGFzZVNjb3BlKGNvZGUsICJpdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZyIpOwotICAg
IAotICAgIEl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nIGl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNj
aW5nKGNvZGUpOwotICAgIGl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nLnJ1bigpOworICAgIFBo
YXNlU2NvcGUgcGhhc2VTY29wZShjb2RlLCAiQWlyOjphbGxvY2F0ZVJlZ2lzdGVyc1Rocm91Z2hH
cmFwaENvbG9yaW5nIik7CisKKyAgICBVc2VDb3VudHM8VG1wPiB1c2VDb3VudHMoY29kZSk7Cisg
ICAgR3JhcGhDb2xvcmluZ1JlZ2lzdGVyQWxsb2NhdGlvbiBncmFwaENvbG9yaW5nUmVnaXN0ZXJB
bGxvY2F0aW9uKGNvZGUsIHVzZUNvdW50cyk7CisgICAgZ3JhcGhDb2xvcmluZ1JlZ2lzdGVyQWxs
b2NhdGlvbi5ydW4oKTsKIH0KIAogfSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJHcmFwaENvbG9yaW5nLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJHcmFwaENvbG9yaW5nLmgJ
KHJldmlzaW9uIDIxMjc5NykJKGZyb20gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJJ
dGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5oOjIxMjc5NykKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9haXIvQWlyR3JhcGhDb2xvcmluZy5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
NDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJh
Z21hIG9uY2UKKworI2lmIEVOQUJMRShCM19KSVQpCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3Bh
Y2UgQjMgeyBuYW1lc3BhY2UgQWlyIHsKKworY2xhc3MgQ29kZTsKKworLy8gVGhpcyBpcyBhIHJl
Z2lzdGVyIGFsbG9jYXRpb24gcGhhc2UgYmFzZWQgb24gQW5kcmV3IEFwcGVsJ3MgSXRlcmF0ZWQg
UmVnaXN0ZXIgQ29hbGVzY2luZworLy8gaHR0cDovL3d3dy5jcy5jbXUuZWR1L2Fmcy9jcy9hY2Fk
ZW1pYy9jbGFzcy8xNTc0NS1zMDcvd3d3L3BhcGVycy9nZW9yZ2UucGRmCit2b2lkIGl0ZXJhdGVk
UmVnaXN0ZXJDb2FsZXNjaW5nKENvZGUmKTsKKworfSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6
OkFpcgorCisjZW5kaWYgLy8gRU5BQkxFKEIzX0pJVCkKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9haXIvQWlyR3JhcGhDb2xvcmluZy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy9haXIvQWlyR3JhcGhDb2xvcmluZy5oCShyZXZpc2lvbiAyMTI3OTcpCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckdyYXBoQ29sb3JpbmcuaAkod29ya2lu
ZyBjb3B5KQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTcgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCkBAIC0zMSw5ICszMSwxNiBAQCBuYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFt
ZXNwYWNlCiAKIGNsYXNzIENvZGU7CiAKLS8vIFRoaXMgaXMgYSByZWdpc3RlciBhbGxvY2F0aW9u
IHBoYXNlIGJhc2VkIG9uIEFuZHJldyBBcHBlbCdzIEl0ZXJhdGVkIFJlZ2lzdGVyIENvYWxlc2Np
bmcKKy8vIFdlIGhhdmUgdHdvIHJlZ2lzdGVyIGFsbG9jYXRvcnMsIGJvdGggZnVuZGFtZW50YWxs
eSBkZXJpdmVkIGZyb20gQ2hhaXRpbidzIFlvcmt0b3duCisvLyBhbGxvY2F0b3I6CisvLyBodHRw
Oi8vY3MuZ211LmVkdS9+d2hpdGUvQ1M2NDAvcDk4LWNoYWl0aW4ucGRmCisvLworLy8gV2UgaGF2
ZSBhbiBpbXBsZW1lbnRhdGlvbiBvZiBCcmlnZ3MncyBvcHRpbWlzdGljIGFsbG9jYXRvciB3aGlj
aCBpcyBkZXJpdmF0aXZlIG9mIENoYWl0aW4ncyBhbGxvY2F0b3I6CisvLyBodHRwOi8vd3d3LmNz
LnV0ZXhhcy5lZHUvdXNlcnMvbWNraW5sZXkvMzgwQy9sZWNzL2JyaWdncy10aGVzaXMtMTk5Mi5w
ZGYKKy8vCisvLyBBbmQgYW4gaW1wbGVtZW50YXRpb24gb2YgQW5kcmV3IEFwcGVsJ3MgSXRlcmF0
ZWQgUmVnaXN0ZXIgQ29hbGVzY2luZyB3aGljaCBpcyBkZXJpdmF0aXZlIG9mIEJyaWdncydzIGFs
bG9jYXRvci4KIC8vIGh0dHA6Ly93d3cuY3MuY211LmVkdS9hZnMvY3MvYWNhZGVtaWMvY2xhc3Mv
MTU3NDUtczA3L3d3dy9wYXBlcnMvZ2VvcmdlLnBkZgotdm9pZCBpdGVyYXRlZFJlZ2lzdGVyQ29h
bGVzY2luZyhDb2RlJik7Cit2b2lkIGFsbG9jYXRlUmVnaXN0ZXJzVGhyb3VnaEdyYXBoQ29sb3Jp
bmcoQ29kZSYpOwogCiB9IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpCMzo6QWlyCiAKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2Npbmcu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlySXRlcmF0
ZWRSZWdpc3RlckNvYWxlc2NpbmcuY3BwCShyZXZpc2lvbiAyMTI3OTcpCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvYWlyL0Fpckl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nLmNwcAkobm9u
ZXhpc3RlbnQpCkBAIC0xLDE2NTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNS0y
MDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKLSAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCi0gKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLSAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKLSAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgotICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
LSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIkFp
ckl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nLmgiCi0KLSNpZiBFTkFCTEUoQjNfSklUKQotCi0j
aW5jbHVkZSAiQWlyQ29kZS5oIgotI2luY2x1ZGUgIkFpckluc2VydGlvblNldC5oIgotI2luY2x1
ZGUgIkFpckluc3RJbmxpbmVzLmgiCi0jaW5jbHVkZSAiQWlyTGl2ZW5lc3MuaCIKLSNpbmNsdWRl
ICJBaXJQYWRJbnRlcmZlcmVuY2UuaCIKLSNpbmNsdWRlICJBaXJQaGFzZVNjb3BlLmgiCi0jaW5j
bHVkZSAiQWlyVG1wSW5saW5lcy5oIgotI2luY2x1ZGUgIkFpclRtcFdpZHRoLmgiCi0jaW5jbHVk
ZSAiQWlyVXNlQ291bnRzLmgiCi0jaW5jbHVkZSA8d3RmL0xpc3REdW1wLmg+Ci0KLW5hbWVzcGFj
ZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UgQWlyIHsKLQotbmFtZXNwYWNlIHsKLQot
Ym9vbCBkZWJ1ZyA9IGZhbHNlOwotYm9vbCB0cmFjZURlYnVnID0gZmFsc2U7Ci1ib29sIHJlcG9y
dFN0YXRzID0gZmFsc2U7Ci0KLS8vIFRoZSBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yIGRlZmlu
ZXMgYWxsIHRoZSBjb2RlIHRoYXQgaXMgaW5kZXBlbmRhbnQKLS8vIGZyb20gdGhlIHR5cGUgb3Ig
cmVnaXN0ZXIgYW5kIGNhbiBiZSBzaGFyZWQgd2hlbiBhbGxvY2F0aW5nIHJlZ2lzdGVycy4KLXRl
bXBsYXRlPHR5cGVuYW1lIEluZGV4VHlwZT4KLWNsYXNzIEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0
b3IgewotcHVibGljOgotICAgIEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0b3IoY29uc3QgVmVjdG9y
PFJlZz4mIHJlZ3NJblByaW9yaXR5T3JkZXIsIEluZGV4VHlwZSBsYXN0UHJlY29sb3JlZFJlZ2lz
dGVySW5kZXgsIHVuc2lnbmVkIHRtcEFycmF5U2l6ZSwgY29uc3QgSGFzaFNldDx1bnNpZ25lZD4m
IHVuc3BpbGxhYmxlVG1wKQotICAgICAgICA6IG1fcmVnc0luUHJpb3JpdHlPcmRlcihyZWdzSW5Q
cmlvcml0eU9yZGVyKQotICAgICAgICAsIG1fbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4KGxh
c3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleCkKLSAgICAgICAgLCBtX3Vuc3BpbGxhYmxlVG1wcyh1
bnNwaWxsYWJsZVRtcCkKLSAgICB7Ci0gICAgICAgIGZvciAoUmVnIHJlZyA6IG1fcmVnc0luUHJp
b3JpdHlPcmRlcikKLSAgICAgICAgICAgIG1fbXV0YWJsZVJlZ3Muc2V0KHJlZyk7Ci0gICAgICAg
IAotICAgICAgICBpbml0aWFsaXplRGVncmVlcyh0bXBBcnJheVNpemUpOwotICAgICAgICAKLSAg
ICAgICAgbV9hZGphY2VuY3lMaXN0LnJlc2l6ZSh0bXBBcnJheVNpemUpOwotICAgICAgICBtX21v
dmVMaXN0LnJlc2l6ZSh0bXBBcnJheVNpemUpOwotICAgICAgICBtX2NvYWxlc2NlZFRtcHMuZmls
bCgwLCB0bXBBcnJheVNpemUpOwotICAgICAgICBtX2lzT25TZWxlY3RTdGFjay5lbnN1cmVTaXpl
KHRtcEFycmF5U2l6ZSk7Ci0gICAgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgSW5kZXhUeXBlIGdldEFs
aWFzKEluZGV4VHlwZSB0bXBJbmRleCkgY29uc3QKLSAgICB7Ci0gICAgICAgIEluZGV4VHlwZSBh
bGlhcyA9IHRtcEluZGV4OwotICAgICAgICB3aGlsZSAoSW5kZXhUeXBlIG5leHRBbGlhcyA9IG1f
Y29hbGVzY2VkVG1wc1thbGlhc10pCi0gICAgICAgICAgICBhbGlhcyA9IG5leHRBbGlhczsKLSAg
ICAgICAgcmV0dXJuIGFsaWFzOwotICAgIH0KLQotICAgIHZvaWQgYWRkRWRnZShJbmRleFR5cGUg
YSwgSW5kZXhUeXBlIGIpCi0gICAgewotICAgICAgICBpZiAoYSA9PSBiKQotICAgICAgICAgICAg
cmV0dXJuOwotICAgICAgICBhZGRFZGdlRGlzdGluY3QoYSwgYik7Ci0gICAgfQotCi0gICAgdm9p
ZCBtYWtlV29ya0xpc3QoKQotICAgIHsKLSAgICAgICAgSW5kZXhUeXBlIGZpcnN0Tm9uUmVnSW5k
ZXggPSBtX2xhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleCArIDE7Ci0gICAgICAgIGZvciAoSW5k
ZXhUeXBlIGkgPSBmaXJzdE5vblJlZ0luZGV4OyBpIDwgbV9kZWdyZWVzLnNpemUoKTsgKytpKSB7
Ci0gICAgICAgICAgICB1bnNpZ25lZCBkZWdyZWUgPSBtX2RlZ3JlZXNbaV07Ci0gICAgICAgICAg
ICBpZiAoZGVncmVlID49IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkpCi0gICAgICAgICAg
ICAgICAgYWRkVG9TcGlsbChpKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKCFtX21vdmVMaXN0W2ld
LmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICBtX2ZyZWV6ZVdvcmtsaXN0LmFkZChpKTsKLSAg
ICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuYXBwZW5k
KGkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBhZGRUb1NwaWxsKHVuc2lnbmVkIHRv
U3BpbGwpCi0gICAgewotICAgICAgICBpZiAobV91bnNwaWxsYWJsZVRtcHMuY29udGFpbnModG9T
cGlsbCkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgbV9zcGlsbFdvcmtsaXN0LmFk
ZCh0b1NwaWxsKTsKLSAgICB9Ci0KLSAgICAvLyBMb3ctZGVncmVlIHZlcnRleCBjYW4gYWx3YXlz
IGJlIGNvbG9yZWQ6IGp1c3QgcGljayBhbnkgb2YgdGhlIGNvbG9yIHRha2VuIGJ5IGFueQotICAg
IC8vIG90aGVyIGFkamFjZW50IHZlcmljZXMuCi0gICAgLy8gVGhlICJTaW1wbGlmeSIgcGhhc2Ug
dGFrZXMgYSBsb3ctZGVncmVlIG91dCBvZiB0aGUgaW50ZXJmZXJlbmNlIGdyYXBoIHRvIHNpbXBs
aWZ5IGl0LgotICAgIHZvaWQgc2ltcGxpZnkoKQotICAgIHsKLSAgICAgICAgSW5kZXhUeXBlIGxh
c3RJbmRleCA9IG1fc2ltcGxpZnlXb3JrbGlzdC50YWtlTGFzdCgpOwotCi0gICAgICAgIEFTU0VS
VCghbV9zZWxlY3RTdGFjay5jb250YWlucyhsYXN0SW5kZXgpKTsKLSAgICAgICAgQVNTRVJUKCFt
X2lzT25TZWxlY3RTdGFjay5nZXQobGFzdEluZGV4KSk7Ci0gICAgICAgIG1fc2VsZWN0U3RhY2su
YXBwZW5kKGxhc3RJbmRleCk7Ci0gICAgICAgIG1faXNPblNlbGVjdFN0YWNrLnF1aWNrU2V0KGxh
c3RJbmRleCk7Ci0KLSAgICAgICAgZm9yRWFjaEFkamFjZW50KGxhc3RJbmRleCwgW3RoaXNdKElu
ZGV4VHlwZSBhZGphY2VudFRtcEluZGV4KSB7Ci0gICAgICAgICAgICBkZWNyZW1lbnREZWdyZWUo
YWRqYWNlbnRUbXBJbmRleCk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHZvaWQgZnJlZXpl
KCkKLSAgICB7Ci0gICAgICAgIEluZGV4VHlwZSB2aWN0aW1JbmRleCA9IG1fZnJlZXplV29ya2xp
c3QudGFrZUFueSgpOwotICAgICAgICBBU1NFUlRfV0lUSF9NRVNTQUdFKGdldEFsaWFzKHZpY3Rp
bUluZGV4KSA9PSB2aWN0aW1JbmRleCwgImNvYWxlc2NlKCkgc2hvdWxkIG5vdCBsZWF2ZSBhbGlh
c2VkIFRtcCBpbiB0aGUgd29ya2xpc3QuIik7Ci0gICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5h
cHBlbmQodmljdGltSW5kZXgpOwotICAgICAgICBmcmVlemVNb3Zlcyh2aWN0aW1JbmRleCk7Ci0g
ICAgfQotCi0gICAgdm9pZCBmcmVlemVNb3ZlcyhJbmRleFR5cGUgdG1wSW5kZXgpCi0gICAgewot
ICAgICAgICBmb3JFYWNoTm9kZU1vdmVzKHRtcEluZGV4LCBbdGhpcywgdG1wSW5kZXhdIChJbmRl
eFR5cGUgbW92ZUluZGV4KSB7Ci0gICAgICAgICAgICBpZiAoIW1fYWN0aXZlTW92ZXMucXVpY2tD
bGVhcihtb3ZlSW5kZXgpKQotICAgICAgICAgICAgICAgIG1fd29ya2xpc3RNb3Zlcy50YWtlTW92
ZShtb3ZlSW5kZXgpOwotCi0gICAgICAgICAgICBjb25zdCBNb3ZlT3BlcmFuZHMmIG1vdmVPcGVy
YW5kcyA9IG1fY29hbGVzY2luZ0NhbmRpZGF0ZXNbbW92ZUluZGV4XTsKLSAgICAgICAgICAgIElu
ZGV4VHlwZSBzcmNUbXBJbmRleCA9IG1vdmVPcGVyYW5kcy5zcmNJbmRleDsKLSAgICAgICAgICAg
IEluZGV4VHlwZSBkc3RUbXBJbmRleCA9IG1vdmVPcGVyYW5kcy5kc3RJbmRleDsKLQotICAgICAg
ICAgICAgSW5kZXhUeXBlIG9yaWdpbmFsT3RoZXJUbXAgPSBzcmNUbXBJbmRleCAhPSB0bXBJbmRl
eCA/IHNyY1RtcEluZGV4IDogZHN0VG1wSW5kZXg7Ci0gICAgICAgICAgICBJbmRleFR5cGUgb3Ro
ZXJUbXBJbmRleCA9IGdldEFsaWFzKG9yaWdpbmFsT3RoZXJUbXApOwotICAgICAgICAgICAgaWYg
KG1fZGVncmVlc1tvdGhlclRtcEluZGV4XSA8IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkg
JiYgIWlzTW92ZVJlbGF0ZWQob3RoZXJUbXBJbmRleCkpIHsKLSAgICAgICAgICAgICAgICBpZiAo
bV9mcmVlemVXb3JrbGlzdC5yZW1vdmUob3RoZXJUbXBJbmRleCkpCi0gICAgICAgICAgICAgICAg
ICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5hcHBlbmQob3RoZXJUbXBJbmRleCk7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHZvaWQgY29hbGVzY2UoKQotICAgIHsKLSAg
ICAgICAgdW5zaWduZWQgbW92ZUluZGV4ID0gbV93b3JrbGlzdE1vdmVzLnRha2VMYXN0TW92ZSgp
OwotICAgICAgICBjb25zdCBNb3ZlT3BlcmFuZHMmIG1vdmVPcGVyYW5kcyA9IG1fY29hbGVzY2lu
Z0NhbmRpZGF0ZXNbbW92ZUluZGV4XTsKLSAgICAgICAgSW5kZXhUeXBlIHUgPSBnZXRBbGlhcyht
b3ZlT3BlcmFuZHMuc3JjSW5kZXgpOwotICAgICAgICBJbmRleFR5cGUgdiA9IGdldEFsaWFzKG1v
dmVPcGVyYW5kcy5kc3RJbmRleCk7Ci0KLSAgICAgICAgaWYgKGlzUHJlY29sb3JlZCh2KSkKLSAg
ICAgICAgICAgIHN0ZDo6c3dhcCh1LCB2KTsKLQotICAgICAgICBpZiAodHJhY2VEZWJ1ZykKLSAg
ICAgICAgICAgIGRhdGFMb2coIkNvYWxlc2NpbmcgbW92ZSBhdCBpbmRleCAiLCBtb3ZlSW5kZXgs
ICIgdSA9ICIsIHUsICIgdiA9ICIsIHYsICJcbiIpOwotCi0gICAgICAgIGlmICh1ID09IHYpIHsK
LSAgICAgICAgICAgIGFkZFdvcmtMaXN0KHUpOwotCi0gICAgICAgICAgICBpZiAodHJhY2VEZWJ1
ZykKLSAgICAgICAgICAgICAgICBkYXRhTG9nKCIgICAgQ29hbGVzY2VkXG4iKTsKLSAgICAgICAg
fSBlbHNlIGlmIChpc1ByZWNvbG9yZWQodikKLSAgICAgICAgICAgIHx8IG1faW50ZXJmZXJlbmNl
RWRnZXMuY29udGFpbnMoSW50ZXJmZXJlbmNlRWRnZSh1LCB2KSkKLSAgICAgICAgICAgIHx8ICh1
ID09IG1fZnJhbWVQb2ludGVySW5kZXggJiYgbV9pbnRlcmZlcmVzV2l0aEZyYW1lUG9pbnRlci5x
dWlja0dldCh2KSkpIHsKLSAgICAgICAgICAgIGFkZFdvcmtMaXN0KHUpOwotICAgICAgICAgICAg
YWRkV29ya0xpc3Qodik7Ci0KLSAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQotICAgICAgICAg
ICAgICAgIGRhdGFMb2coIiAgICBDb25zdHJhaW5lZFxuIik7Ci0gICAgICAgIH0gZWxzZSBpZiAo
Y2FuQmVTYWZlbHlDb2FsZXNjZWQodSwgdikpIHsKLSAgICAgICAgICAgIGNvbWJpbmUodSwgdik7
Ci0gICAgICAgICAgICBhZGRXb3JrTGlzdCh1KTsKLSAgICAgICAgICAgIG1faGFzQ29hbGVzY2Vk
Tm9uVHJpdmlhbE1vdmUgPSB0cnVlOwotCi0gICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKLSAg
ICAgICAgICAgICAgICBkYXRhTG9nKCIgICAgU2FmZSBDb2FsZXNjaW5nXG4iKTsKLSAgICAgICAg
fSBlbHNlIHsKLSAgICAgICAgICAgIG1fYWN0aXZlTW92ZXMucXVpY2tTZXQobW92ZUluZGV4KTsK
LQotICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpCi0gICAgICAgICAgICAgICAgZGF0YUxvZygi
ICAgIEZhaWxlZCBjb2FsZXNjaW5nLCBhZGRlZCB0byBhY3RpdmUgbW92ZXMuXG4iKTsKLSAgICAg
ICAgfQotICAgIH0KLQotICAgIHZvaWQgYXNzaWduQ29sb3JzKCkKLSAgICB7Ci0gICAgICAgIEFT
U0VSVChtX3NpbXBsaWZ5V29ya2xpc3QuaXNFbXB0eSgpKTsKLSAgICAgICAgQVNTRVJUKG1fd29y
a2xpc3RNb3Zlcy5pc0VtcHR5KCkpOwotICAgICAgICBBU1NFUlQobV9mcmVlemVXb3JrbGlzdC5p
c0VtcHR5KCkpOwotICAgICAgICBBU1NFUlQobV9zcGlsbFdvcmtsaXN0LmlzRW1wdHkoKSk7Ci0K
LSAgICAgICAgLy8gUmVjbGFpbSBhcyBtdWNoIG1lbW9yeSBhcyBwb3NzaWJsZS4KLSAgICAgICAg
bV9pbnRlcmZlcmVuY2VFZGdlcy5jbGVhcigpOwotICAgICAgICBtX2RlZ3JlZXMuY2xlYXIoKTsK
LSAgICAgICAgbV9tb3ZlTGlzdC5jbGVhcigpOwotICAgICAgICBtX3dvcmtsaXN0TW92ZXMuY2xl
YXIoKTsKLSAgICAgICAgbV9zaW1wbGlmeVdvcmtsaXN0LmNsZWFyKCk7Ci0gICAgICAgIG1fc3Bp
bGxXb3JrbGlzdC5jbGVhcigpOwotICAgICAgICBtX2ZyZWV6ZVdvcmtsaXN0LmNsZWFyKCk7Ci0K
LSAgICAgICAgLy8gVHJ5IHRvIGNvbG9yIHRoZSBUbXAgb24gdGhlIHN0YWNrLgotICAgICAgICBt
X2NvbG9yZWRUbXAucmVzaXplKG1fYWRqYWNlbmN5TGlzdC5zaXplKCkpOwotCi0gICAgICAgIHdo
aWxlICghbV9zZWxlY3RTdGFjay5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIHRt
cEluZGV4ID0gbV9zZWxlY3RTdGFjay50YWtlTGFzdCgpOwotICAgICAgICAgICAgQVNTRVJUKCFp
c1ByZWNvbG9yZWQodG1wSW5kZXgpKTsKLSAgICAgICAgICAgIEFTU0VSVCghbV9jb2xvcmVkVG1w
W3RtcEluZGV4XSk7Ci0KLSAgICAgICAgICAgIFJlZ2lzdGVyU2V0IGNvbG9yZWRSZWdpc3RlcnM7
Ci0gICAgICAgICAgICBmb3IgKEluZGV4VHlwZSBhZGphY2VudFRtcEluZGV4IDogbV9hZGphY2Vu
Y3lMaXN0W3RtcEluZGV4XSkgewotICAgICAgICAgICAgICAgIEluZGV4VHlwZSBhbGlhc1RtcElu
ZGV4ID0gZ2V0QWxpYXMoYWRqYWNlbnRUbXBJbmRleCk7Ci0gICAgICAgICAgICAgICAgUmVnIHJl
ZyA9IG1fY29sb3JlZFRtcFthbGlhc1RtcEluZGV4XTsKLQotICAgICAgICAgICAgICAgIEFTU0VS
VCghaXNQcmVjb2xvcmVkKGFsaWFzVG1wSW5kZXgpIHx8IChpc1ByZWNvbG9yZWQoYWxpYXNUbXBJ
bmRleCkgJiYgcmVnKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVnKQotICAgICAgICAgICAg
ICAgICAgICBjb2xvcmVkUmVnaXN0ZXJzLnNldChyZWcpOwotICAgICAgICAgICAgfQotCi0gICAg
ICAgICAgICBib29sIGNvbG9yQXNzaWduZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGZvciAoUmVn
IHJlZyA6IG1fcmVnc0luUHJpb3JpdHlPcmRlcikgewotICAgICAgICAgICAgICAgIGlmICghY29s
b3JlZFJlZ2lzdGVycy5nZXQocmVnKSkgewotICAgICAgICAgICAgICAgICAgICBtX2NvbG9yZWRU
bXBbdG1wSW5kZXhdID0gcmVnOwotICAgICAgICAgICAgICAgICAgICBjb2xvckFzc2lnbmVkID0g
dHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWNvbG9yQXNzaWduZWQpCi0gICAgICAgICAg
ICAgICAgbV9zcGlsbGVkVG1wcy5hcHBlbmQodG1wSW5kZXgpOwotICAgICAgICB9Ci0gICAgICAg
IG1fc2VsZWN0U3RhY2suY2xlYXIoKTsKLQotICAgICAgICBpZiAobV9zcGlsbGVkVG1wcy5pc0Vt
cHR5KCkpCi0gICAgICAgICAgICBtX2NvYWxlc2NlZFRtcHNBdFNwaWxsLmNsZWFyKCk7Ci0gICAg
ICAgIGVsc2UKLSAgICAgICAgICAgIG1fY29sb3JlZFRtcC5jbGVhcigpOwotICAgIH0KLQotcHJp
dmF0ZToKLSAgICB2b2lkIGluaXRpYWxpemVEZWdyZWVzKHVuc2lnbmVkIHRtcEFycmF5U2l6ZSkK
LSAgICB7Ci0gICAgICAgIG1fZGVncmVlcy5yZXNpemUodG1wQXJyYXlTaXplKTsKLQotICAgICAg
ICAvLyBBbGwgcHJlY29sb3JlZCByZWdpc3RlcnMgaGF2ZSAgYW4gImluZmluaXRlIiBkZWdyZWUu
Ci0gICAgICAgIHVuc2lnbmVkIGZpcnN0Tm9uUmVnSW5kZXggPSBtX2xhc3RQcmVjb2xvcmVkUmVn
aXN0ZXJJbmRleCArIDE7Ci0gICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBmaXJzdE5v
blJlZ0luZGV4OyArK2kpCi0gICAgICAgICAgICBtX2RlZ3JlZXNbaV0gPSBzdGQ6Om51bWVyaWNf
bGltaXRzPHVuc2lnbmVkPjo6bWF4KCk7Ci0KLSAgICAgICAgbWVtc2V0KG1fZGVncmVlcy5kYXRh
KCkgKyBmaXJzdE5vblJlZ0luZGV4LCAwLCAodG1wQXJyYXlTaXplIC0gZmlyc3ROb25SZWdJbmRl
eCkgKiBzaXplb2YodW5zaWduZWQpKTsKLSAgICB9Ci0KLSAgICB2b2lkIGFkZEVkZ2VEaXN0aW5j
dChJbmRleFR5cGUgYSwgSW5kZXhUeXBlIGIpCi0gICAgewotICAgICAgICBBU1NFUlQoYSAhPSBi
KTsKLSAgICAgICAgaWYgKG1faW50ZXJmZXJlbmNlRWRnZXMuYWRkKEludGVyZmVyZW5jZUVkZ2Uo
YSwgYikpLmlzTmV3RW50cnkpIHsKLSAgICAgICAgICAgIGlmICghaXNQcmVjb2xvcmVkKGEpKSB7
Ci0gICAgICAgICAgICAgICAgQVNTRVJUKCFtX2FkamFjZW5jeUxpc3RbYV0uY29udGFpbnMoYikp
OwotICAgICAgICAgICAgICAgIG1fYWRqYWNlbmN5TGlzdFthXS5hcHBlbmQoYik7Ci0gICAgICAg
ICAgICAgICAgbV9kZWdyZWVzW2FdKys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlm
ICghaXNQcmVjb2xvcmVkKGIpKSB7Ci0gICAgICAgICAgICAgICAgQVNTRVJUKCFtX2FkamFjZW5j
eUxpc3RbYl0uY29udGFpbnMoYSkpOwotICAgICAgICAgICAgICAgIG1fYWRqYWNlbmN5TGlzdFti
XS5hcHBlbmQoYSk7Ci0gICAgICAgICAgICAgICAgbV9kZWdyZWVzW2JdKys7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGRlY3JlbWVudERlZ3JlZShJbmRleFR5
cGUgdG1wSW5kZXgpCi0gICAgewotICAgICAgICBBU1NFUlQobV9kZWdyZWVzW3RtcEluZGV4XSk7
Ci0KLSAgICAgICAgdW5zaWduZWQgb2xkRGVncmVlID0gbV9kZWdyZWVzW3RtcEluZGV4XS0tOwot
ICAgICAgICBpZiAob2xkRGVncmVlID09IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkpIHsK
LSAgICAgICAgICAgIGVuYWJsZU1vdmVzT25WYWx1ZUFuZEFkamFjZW50cyh0bXBJbmRleCk7Ci0g
ICAgICAgICAgICBtX3NwaWxsV29ya2xpc3QucmVtb3ZlKHRtcEluZGV4KTsKLSAgICAgICAgICAg
IGlmIChpc01vdmVSZWxhdGVkKHRtcEluZGV4KSkKLSAgICAgICAgICAgICAgICBtX2ZyZWV6ZVdv
cmtsaXN0LmFkZCh0bXBJbmRleCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAg
bV9zaW1wbGlmeVdvcmtsaXN0LmFwcGVuZCh0bXBJbmRleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0K
LQotICAgIGJvb2wgYWRkRWRnZURpc3RpbmN0V2l0aG91dERlZ3JlZUNoYW5nZShJbmRleFR5cGUg
YSwgSW5kZXhUeXBlIGIpCi0gICAgewotICAgICAgICBBU1NFUlQoYSAhPSBiKTsKLSAgICAgICAg
aWYgKG1faW50ZXJmZXJlbmNlRWRnZXMuYWRkKEludGVyZmVyZW5jZUVkZ2UoYSwgYikpLmlzTmV3
RW50cnkpIHsKLSAgICAgICAgICAgIGlmICghaXNQcmVjb2xvcmVkKGEpKSB7Ci0gICAgICAgICAg
ICAgICAgQVNTRVJUKCFtX2FkamFjZW5jeUxpc3RbYV0uY29udGFpbnMoYikpOwotICAgICAgICAg
ICAgICAgIG1fYWRqYWNlbmN5TGlzdFthXS5hcHBlbmQoYik7Ci0gICAgICAgICAgICB9Ci0KLSAg
ICAgICAgICAgIGlmICghaXNQcmVjb2xvcmVkKGIpKSB7Ci0gICAgICAgICAgICAgICAgQVNTRVJU
KCFtX2FkamFjZW5jeUxpc3RbYl0uY29udGFpbnMoYSkpOwotICAgICAgICAgICAgICAgIG1fYWRq
YWNlbmN5TGlzdFtiXS5hcHBlbmQoYSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAg
Ym9vbCBpc01vdmVSZWxhdGVkKEluZGV4VHlwZSB0bXBJbmRleCkKLSAgICB7Ci0gICAgICAgIGZv
ciAodW5zaWduZWQgbW92ZUluZGV4IDogbV9tb3ZlTGlzdFt0bXBJbmRleF0pIHsKLSAgICAgICAg
ICAgIGlmIChtX2FjdGl2ZU1vdmVzLnF1aWNrR2V0KG1vdmVJbmRleCkgfHwgbV93b3JrbGlzdE1v
dmVzLmNvbnRhaW5zKG1vdmVJbmRleCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0g
ICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHRlbXBsYXRlPHR5
cGVuYW1lIEZ1bmN0aW9uPgotICAgIHZvaWQgZm9yRWFjaEFkamFjZW50KEluZGV4VHlwZSB0bXBJ
bmRleCwgRnVuY3Rpb24gZnVuY3Rpb24pCi0gICAgewotICAgICAgICBmb3IgKEluZGV4VHlwZSBh
ZGphY2VudFRtcEluZGV4IDogbV9hZGphY2VuY3lMaXN0W3RtcEluZGV4XSkgewotICAgICAgICAg
ICAgaWYgKCFoYXNCZWVuU2ltcGxpZmllZChhZGphY2VudFRtcEluZGV4KSkKLSAgICAgICAgICAg
ICAgICBmdW5jdGlvbihhZGphY2VudFRtcEluZGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAg
IGJvb2wgaGFzQmVlblNpbXBsaWZpZWQoSW5kZXhUeXBlIHRtcEluZGV4KQotICAgIHsKLSAgICAg
ICAgcmV0dXJuIG1faXNPblNlbGVjdFN0YWNrLnF1aWNrR2V0KHRtcEluZGV4KSB8fCAhIW1fY29h
bGVzY2VkVG1wc1t0bXBJbmRleF07Ci0gICAgfQotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVu
Y3Rpb24+Ci0gICAgdm9pZCBmb3JFYWNoTm9kZU1vdmVzKEluZGV4VHlwZSB0bXBJbmRleCwgRnVu
Y3Rpb24gZnVuY3Rpb24pCi0gICAgewotICAgICAgICBmb3IgKHVuc2lnbmVkIG1vdmVJbmRleCA6
IG1fbW92ZUxpc3RbdG1wSW5kZXhdKSB7Ci0gICAgICAgICAgICBpZiAobV9hY3RpdmVNb3Zlcy5x
dWlja0dldChtb3ZlSW5kZXgpIHx8IG1fd29ya2xpc3RNb3Zlcy5jb250YWlucyhtb3ZlSW5kZXgp
KQotICAgICAgICAgICAgICAgIGZ1bmN0aW9uKG1vdmVJbmRleCk7Ci0gICAgICAgIH0KLSAgICB9
Ci0KLSAgICB2b2lkIGVuYWJsZU1vdmVzT25WYWx1ZShJbmRleFR5cGUgdG1wSW5kZXgpCi0gICAg
ewotICAgICAgICBmb3IgKHVuc2lnbmVkIG1vdmVJbmRleCA6IG1fbW92ZUxpc3RbdG1wSW5kZXhd
KSB7Ci0gICAgICAgICAgICBpZiAobV9hY3RpdmVNb3Zlcy5xdWlja0NsZWFyKG1vdmVJbmRleCkp
Ci0gICAgICAgICAgICAgICAgbV93b3JrbGlzdE1vdmVzLnJldHVybk1vdmUobW92ZUluZGV4KTsK
LSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZW5hYmxlTW92ZXNPblZhbHVlQW5kQWRqYWNl
bnRzKEluZGV4VHlwZSB0bXBJbmRleCkKLSAgICB7Ci0gICAgICAgIGVuYWJsZU1vdmVzT25WYWx1
ZSh0bXBJbmRleCk7Ci0KLSAgICAgICAgZm9yRWFjaEFkamFjZW50KHRtcEluZGV4LCBbdGhpc10g
KEluZGV4VHlwZSBhZGphY2VudFRtcEluZGV4KSB7Ci0gICAgICAgICAgICBlbmFibGVNb3Zlc09u
VmFsdWUoYWRqYWNlbnRUbXBJbmRleCk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIGJvb2wg
aXNQcmVjb2xvcmVkKEluZGV4VHlwZSB0bXBJbmRleCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0
bXBJbmRleCA8PSBtX2xhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleDsKLSAgICB9Ci0KLSAgICB2
b2lkIGFkZFdvcmtMaXN0KEluZGV4VHlwZSB0bXBJbmRleCkKLSAgICB7Ci0gICAgICAgIGlmICgh
aXNQcmVjb2xvcmVkKHRtcEluZGV4KSAmJiBtX2RlZ3JlZXNbdG1wSW5kZXhdIDwgbV9yZWdzSW5Q
cmlvcml0eU9yZGVyLnNpemUoKSAmJiAhaXNNb3ZlUmVsYXRlZCh0bXBJbmRleCkpIHsKLSAgICAg
ICAgICAgIG1fZnJlZXplV29ya2xpc3QucmVtb3ZlKHRtcEluZGV4KTsKLSAgICAgICAgICAgIG1f
c2ltcGxpZnlXb3JrbGlzdC5hcHBlbmQodG1wSW5kZXgpOwotICAgICAgICB9Ci0gICAgfQotCi0g
ICAgdm9pZCBjb21iaW5lKEluZGV4VHlwZSB1LCBJbmRleFR5cGUgdikKLSAgICB7Ci0gICAgICAg
IGlmICghbV9mcmVlemVXb3JrbGlzdC5yZW1vdmUodikpCi0gICAgICAgICAgICBtX3NwaWxsV29y
a2xpc3QucmVtb3ZlKHYpOwotCi0gICAgICAgIEFTU0VSVCghbV9jb2FsZXNjZWRUbXBzW3ZdKTsK
LSAgICAgICAgbV9jb2FsZXNjZWRUbXBzW3ZdID0gdTsKLQotICAgICAgICBhdXRvJiB2TW92ZXMg
PSBtX21vdmVMaXN0W3ZdOwotICAgICAgICBtX21vdmVMaXN0W3VdLmFkZCh2TW92ZXMuYmVnaW4o
KSwgdk1vdmVzLmVuZCgpKTsKLQotICAgICAgICBmb3JFYWNoQWRqYWNlbnQodiwgW3RoaXMsIHVd
IChJbmRleFR5cGUgYWRqYWNlbnRUbXBJbmRleCkgewotICAgICAgICAgICAgaWYgKGFkZEVkZ2VE
aXN0aW5jdFdpdGhvdXREZWdyZWVDaGFuZ2UoYWRqYWNlbnRUbXBJbmRleCwgdSkpIHsKLSAgICAg
ICAgICAgICAgICAvLyBJZiB3ZSBhZGRlZCBhIG5ldyBlZGdlIGJldHdlZW4gdGhlIGFkamFjZW50
VG1wIGFuZCB1LCBpdCByZXBsYWNlcyB0aGUgZWRnZQotICAgICAgICAgICAgICAgIC8vIHRoYXQg
ZXhpc3RlZCB3aXRoIHYuCi0gICAgICAgICAgICAgICAgLy8gVGhlIGRlZ3JlZSBvZiBhZGphY2Vu
dFRtcCByZW1haW5zIHRoZSBzYW1lIHNpbmNlIHRoZSBlZGdlIGp1c3QgY2hhbmdlZCBmcm9tIHUg
dG8gdi4KLSAgICAgICAgICAgICAgICAvLyBBbGwgd2UgbmVlZCB0byBkbyBpcyB1cGRhdGUgdGhl
IGRlZ3JlZSBvZiB1LgotICAgICAgICAgICAgICAgIGlmICghaXNQcmVjb2xvcmVkKHUpKQotICAg
ICAgICAgICAgICAgICAgICBtX2RlZ3JlZXNbdV0rKzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0g
ICAgICAgICAgICAgICAgLy8gSWYgd2UgYWxyZWFkeSBoYWQgYW4gZWRnZSBiZXR3ZWVuIHRoZSBh
ZGphY2VudFRtcCBhbmQgdSwgdGhlIGRlZ3JlZSBvZiB1Ci0gICAgICAgICAgICAgICAgLy8gaXMg
YWxyZWFkeSBjb3JyZWN0LiBUaGUgZGVncmVlIG9mIHRoZSBhZGphY2VudFRtcCBkZWNyZWFzZXMg
c2luY2UgdGhlIGVkZ2UKLSAgICAgICAgICAgICAgICAvLyB3aXRoIHYgaXMgbm8gbG9uZ2VyIHJl
bGV2YW50ICh3ZSBjYW4gdGhpbmsgb2YgaXQgYXMgbWVyZ2VkIHdpdGggdGhlIGVkZ2Ugd2l0aCB1
KS4KLSAgICAgICAgICAgICAgICBkZWNyZW1lbnREZWdyZWUoYWRqYWNlbnRUbXBJbmRleCk7Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGlmIChtX2ZyYW1lUG9pbnRlcklu
ZGV4ICYmIG1faW50ZXJmZXJlc1dpdGhGcmFtZVBvaW50ZXIucXVpY2tHZXQodikpCi0gICAgICAg
ICAgICBtX2ludGVyZmVyZXNXaXRoRnJhbWVQb2ludGVyLnF1aWNrU2V0KHUpOwotCi0gICAgICAg
IGlmIChtX2RlZ3JlZXNbdV0gPj0gbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKSAmJiBtX2Zy
ZWV6ZVdvcmtsaXN0LnJlbW92ZSh1KSkKLSAgICAgICAgICAgIGFkZFRvU3BpbGwodSk7Ci0gICAg
fQotCi0gICAgYm9vbCBjYW5CZVNhZmVseUNvYWxlc2NlZChJbmRleFR5cGUgdSwgSW5kZXhUeXBl
IHYpCi0gICAgewotICAgICAgICBBU1NFUlQoIWlzUHJlY29sb3JlZCh2KSk7Ci0gICAgICAgIGlm
IChpc1ByZWNvbG9yZWQodSkpCi0gICAgICAgICAgICByZXR1cm4gcHJlY29sb3JlZENvYWxlc2Np
bmdIZXVyaXN0aWModSwgdik7Ci0gICAgICAgIHJldHVybiBjb25zZXJ2YXRpdmVIZXVyaXN0aWMo
dSwgdik7Ci0gICAgfQotCi0gICAgYm9vbCBjb25zZXJ2YXRpdmVIZXVyaXN0aWMoSW5kZXhUeXBl
IHUsIEluZGV4VHlwZSB2KQotICAgIHsKLSAgICAgICAgLy8gVGhpcyBpcyB1c2luZyB0aGUgQnJp
Z2dzJyBjb25zZXJ2YXRpdmUgY29hbGVzY2luZyBydWxlOgotICAgICAgICAvLyBJZiB0aGUgbnVt
YmVyIG9mIGNvbWJpbmVkIGFkamFjZW50IG5vZGUgd2l0aCBhIGRlZ3JlZSA+PSBLIGlzIGxlc3Mg
dGhhbiBLLAotICAgICAgICAvLyBpdCBpcyBzYWZlIHRvIGNvbWJpbmUgdGhlIHR3byBub2Rlcy4g
VGhlIHJlYXNvbiBpcyB0aGF0IHdlIGtub3cgdGhhdCBpZiB0aGUgZ3JhcGgKLSAgICAgICAgLy8g
aXMgY29sb3JhYmxlLCB3ZSBoYXZlIGZld2VyIHRoYW4gSyBhZGphY2VudHMgd2l0aCBoaWdoIG9y
ZGVyIGFuZCB0aGVyZSBpcyBhIGNvbG9yCi0gICAgICAgIC8vIGZvciB0aGUgY3VycmVudCBub2Rl
LgotICAgICAgICBBU1NFUlQodSAhPSB2KTsKLSAgICAgICAgQVNTRVJUKCFpc1ByZWNvbG9yZWQo
dSkpOwotICAgICAgICBBU1NFUlQoIWlzUHJlY29sb3JlZCh2KSk7Ci0KLSAgICAgICAgY29uc3Qg
YXV0byYgYWRqYWNlbnRzT2ZVID0gbV9hZGphY2VuY3lMaXN0W3VdOwotICAgICAgICBjb25zdCBh
dXRvJiBhZGphY2VudHNPZlYgPSBtX2FkamFjZW5jeUxpc3Rbdl07Ci0KLSAgICAgICAgaWYgKGFk
amFjZW50c09mVS5zaXplKCkgKyBhZGphY2VudHNPZlYuc2l6ZSgpIDwgbV9yZWdzSW5Qcmlvcml0
eU9yZGVyLnNpemUoKSkgewotICAgICAgICAgICAgLy8gU2hvcnRjdXQ6IGlmIHRoZSB0b3RhbCBu
dW1iZXIgb2YgYWRqYWNlbnRzIGlzIGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIHJlZ2lzdGVyLCB0
aGUgY29uZGl0aW9uIGlzIGFsd2F5cyBtZXQuCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAg
ICAgICAgfQotCi0gICAgICAgIEhhc2hTZXQ8SW5kZXhUeXBlPiBoaWdoT3JkZXJBZGphY2VudHM7
Ci0KLSAgICAgICAgZm9yIChJbmRleFR5cGUgYWRqYWNlbnRUbXBJbmRleCA6IGFkamFjZW50c09m
VSkgewotICAgICAgICAgICAgQVNTRVJUKGFkamFjZW50VG1wSW5kZXggIT0gdik7Ci0gICAgICAg
ICAgICBBU1NFUlQoYWRqYWNlbnRUbXBJbmRleCAhPSB1KTsKLSAgICAgICAgICAgIGlmICghaGFz
QmVlblNpbXBsaWZpZWQoYWRqYWNlbnRUbXBJbmRleCkgJiYgbV9kZWdyZWVzW2FkamFjZW50VG1w
SW5kZXhdID49IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkpIHsKLSAgICAgICAgICAgICAg
ICBhdXRvIGFkZFJlc3VsdCA9IGhpZ2hPcmRlckFkamFjZW50cy5hZGQoYWRqYWNlbnRUbXBJbmRl
eCk7Ci0gICAgICAgICAgICAgICAgaWYgKGFkZFJlc3VsdC5pc05ld0VudHJ5ICYmIGhpZ2hPcmRl
ckFkamFjZW50cy5zaXplKCkgPj0gbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKSkKLSAgICAg
ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0g
ICAgICAgIGZvciAoSW5kZXhUeXBlIGFkamFjZW50VG1wSW5kZXggOiBhZGphY2VudHNPZlYpIHsK
LSAgICAgICAgICAgIEFTU0VSVChhZGphY2VudFRtcEluZGV4ICE9IHUpOwotICAgICAgICAgICAg
QVNTRVJUKGFkamFjZW50VG1wSW5kZXggIT0gdik7Ci0gICAgICAgICAgICBpZiAoIWhhc0JlZW5T
aW1wbGlmaWVkKGFkamFjZW50VG1wSW5kZXgpICYmIG1fZGVncmVlc1thZGphY2VudFRtcEluZGV4
XSA+PSBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgYXV0
byBhZGRSZXN1bHQgPSBoaWdoT3JkZXJBZGphY2VudHMuYWRkKGFkamFjZW50VG1wSW5kZXgpOwot
ICAgICAgICAgICAgICAgIGlmIChhZGRSZXN1bHQuaXNOZXdFbnRyeSAmJiBoaWdoT3JkZXJBZGph
Y2VudHMuc2l6ZSgpID49IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkpCi0gICAgICAgICAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAg
ICAgIEFTU0VSVChoaWdoT3JkZXJBZGphY2VudHMuc2l6ZSgpIDwgbV9yZWdzSW5Qcmlvcml0eU9y
ZGVyLnNpemUoKSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGJvb2wgcHJl
Y29sb3JlZENvYWxlc2NpbmdIZXVyaXN0aWMoSW5kZXhUeXBlIHUsIEluZGV4VHlwZSB2KQotICAg
IHsKLSAgICAgICAgaWYgKHRyYWNlRGVidWcpCi0gICAgICAgICAgICBkYXRhTG9nKCIgICAgQ2hl
Y2tpbmcgcHJlY29sb3JlZENvYWxlc2NpbmdIZXVyaXN0aWNcbiIpOwotICAgICAgICBBU1NFUlQo
aXNQcmVjb2xvcmVkKHUpKTsKLSAgICAgICAgQVNTRVJUKCFpc1ByZWNvbG9yZWQodikpOwotICAg
ICAgICAKLSAgICAgICAgLy8gSWYgdSBpcyBhIHBpbm5lZCByZWdpc3RlciB0aGVuIGl0J3MgYWx3
YXlzIHNhZmUgdG8gY29hbGVzY2UuIE5vdGUgdGhhdCB3aGVuIHdlIGNhbGwgdGhpcywKLSAgICAg
ICAgLy8gd2UgaGF2ZSBhbHJlYWR5IHByb3ZlZCB0aGF0IHRoZXJlIGlzIG5vIGludGVyZmVyZW5j
ZSBiZXR3ZWVuIHUgYW5kIHYuCi0gICAgICAgIGlmICghbV9tdXRhYmxlUmVncy5nZXQobV9jb2xv
cmVkVG1wW3VdKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIC8vIElmIGFu
eSBhZGphY2VudCBvZiB0aGUgbm9uLWNvbG9yZWQgbm9kZSBpcyBub3QgYW4gYWRqYWNlbnQgb2Yg
dGhlIGNvbG9yZWQgbm9kZSBBTkQgaGFzIGEgZGVncmVlID49IEsKLSAgICAgICAgLy8gdGhlcmUg
aXMgYSByaXNrIHRoYXQgdGhpcyBub2RlIG5lZWRzIHRvIGhhdmUgdGhlIHNhbWUgY29sb3IgYXMg
b3VyIHByZWNvbG9yZWQgbm9kZS4gSWYgd2UgY29hbGVzY2Ugc3VjaAotICAgICAgICAvLyBtb3Zl
LCB3ZSBtYXkgY3JlYXRlIGFuIHVuY29sb3JhYmxlIGdyYXBoLgotICAgICAgICBjb25zdCBhdXRv
JiBhZGphY2VudHNPZlYgPSBtX2FkamFjZW5jeUxpc3Rbdl07Ci0gICAgICAgIGZvciAodW5zaWdu
ZWQgYWRqYWNlbnRUbXBJbmRleCA6IGFkamFjZW50c09mVikgewotICAgICAgICAgICAgaWYgKCFp
c1ByZWNvbG9yZWQoYWRqYWNlbnRUbXBJbmRleCkKLSAgICAgICAgICAgICAgICAmJiAhaGFzQmVl
blNpbXBsaWZpZWQoYWRqYWNlbnRUbXBJbmRleCkKLSAgICAgICAgICAgICAgICAmJiBtX2RlZ3Jl
ZXNbYWRqYWNlbnRUbXBJbmRleF0gPj0gbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKQotICAg
ICAgICAgICAgICAgICYmICFtX2ludGVyZmVyZW5jZUVkZ2VzLmNvbnRhaW5zKEludGVyZmVyZW5j
ZUVkZ2UodSwgYWRqYWNlbnRUbXBJbmRleCkpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLXByb3RlY3RlZDoK
LSNpZiBQTEFURk9STShDT0NPQSkKLSNwcmFnbWEgbWFyayAtCi0jZW5kaWYKLQotICAgIC8vIElu
dGVyZmVyZW5jZSBlZGdlcyBhcmUgbm90IGRpcmVjdGVkLiBBbiBlZGdlIGJldHdlZW4gYW55IHR3
byBUbXBzIGlzIHJlcHJlc2VudGVkCi0gICAgLy8gYnkgdGhlIGNvbmNhdGVuYXRlZCB2YWx1ZXMg
b2YgdGhlIHNtYWxsZXN0IFRtcCBmb2xsb3dlZCBieSB0aGUgYmlnZ2VyIFRtcC4KLSAgICBjbGFz
cyBJbnRlcmZlcmVuY2VFZGdlIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIEludGVyZmVyZW5jZUVk
Z2UoKQotICAgICAgICB7Ci0gICAgICAgIH0KLQotICAgICAgICBJbnRlcmZlcmVuY2VFZGdlKElu
ZGV4VHlwZSBhLCBJbmRleFR5cGUgYikKLSAgICAgICAgewotICAgICAgICAgICAgQVNTRVJUKGEp
OwotICAgICAgICAgICAgQVNTRVJUKGIpOwotICAgICAgICAgICAgQVNTRVJUX1dJVEhfTUVTU0FH
RShhICE9IGIsICJBIFRtcCBjYW4gbmV2ZXIgaW50ZXJmZXJlIHdpdGggaXRzZWxmLiBEb2luZyBz
byB3b3VsZCBmb3JjZSBpdCB0byBiZSB0aGUgc3VwZXJwb3NpdGlvbiBvZiB0d28gcmVnaXN0ZXJz
LiIpOwotCi0gICAgICAgICAgICBpZiAoYiA8IGEpCi0gICAgICAgICAgICAgICAgc3RkOjpzd2Fw
KGEsIGIpOwotICAgICAgICAgICAgbV92YWx1ZSA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihhKSA8
PCAzMiB8IGI7Ci0gICAgICAgIH0KLQotICAgICAgICBJbnRlcmZlcmVuY2VFZGdlKFdURjo6SGFz
aFRhYmxlRGVsZXRlZFZhbHVlVHlwZSkKLSAgICAgICAgICAgIDogbV92YWx1ZShzdGQ6Om51bWVy
aWNfbGltaXRzPHVpbnQ2NF90Pjo6bWF4KCkpCi0gICAgICAgIHsKLSAgICAgICAgfQotCi0gICAg
ICAgIEluZGV4VHlwZSBmaXJzdCgpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVy
biBtX3ZhbHVlID4+IDMyICYgMHhmZmZmZmZmZjsKLSAgICAgICAgfQotCi0gICAgICAgIEluZGV4
VHlwZSBzZWNvbmQoKSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbV92YWx1
ZSAmIDB4ZmZmZmZmZmY7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sIG9wZXJhdG9yPT0oY29u
c3QgSW50ZXJmZXJlbmNlRWRnZSBvdGhlcikgY29uc3QKLSAgICAgICAgewotICAgICAgICAgICAg
cmV0dXJuIG1fdmFsdWUgPT0gb3RoZXIubV92YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGJv
b2wgaXNIYXNoVGFibGVEZWxldGVkVmFsdWUoKSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAg
ICByZXR1cm4gKnRoaXMgPT0gSW50ZXJmZXJlbmNlRWRnZShXVEY6Okhhc2hUYWJsZURlbGV0ZWRW
YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB1bnNpZ25lZCBoYXNoKCkgY29uc3QKLSAgICAg
ICAgewotICAgICAgICAgICAgcmV0dXJuIFdURjo6SW50SGFzaDx1aW50NjRfdD46Omhhc2gobV92
YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91dCkg
Y29uc3QKLSAgICAgICAgewotICAgICAgICAgICAgb3V0LnByaW50KGZpcnN0KCksICI8PT4iLCBz
ZWNvbmQoKSk7Ci0gICAgICAgIH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIHVpbnQ2NF90IG1f
dmFsdWUgeyAwIH07Ci0gICAgfTsKLQotICAgIHN0cnVjdCBJbnRlcmZlcmVuY2VFZGdlSGFzaCB7
Ci0gICAgICAgIHN0YXRpYyB1bnNpZ25lZCBoYXNoKGNvbnN0IEludGVyZmVyZW5jZUVkZ2UmIGtl
eSkgeyByZXR1cm4ga2V5Lmhhc2goKTsgfQotICAgICAgICBzdGF0aWMgYm9vbCBlcXVhbChjb25z
dCBJbnRlcmZlcmVuY2VFZGdlJiBhLCBjb25zdCBJbnRlcmZlcmVuY2VFZGdlJiBiKSB7IHJldHVy
biBhID09IGI7IH0KLSAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgc2FmZVRvQ29tcGFyZVRvRW1w
dHlPckRlbGV0ZWQgPSB0cnVlOwotICAgIH07Ci0gICAgdHlwZWRlZiBTaW1wbGVDbGFzc0hhc2hU
cmFpdHM8SW50ZXJmZXJlbmNlRWRnZT4gSW50ZXJmZXJlbmNlRWRnZUhhc2hUcmFpdHM7Ci0KLSAg
ICBjb25zdCBWZWN0b3I8UmVnPiYgbV9yZWdzSW5Qcmlvcml0eU9yZGVyOwotICAgIFJlZ2lzdGVy
U2V0IG1fbXV0YWJsZVJlZ3M7Ci0gICAgSW5kZXhUeXBlIG1fbGFzdFByZWNvbG9yZWRSZWdpc3Rl
ckluZGV4IHsgMCB9OwotCi0gICAgLy8gVGhlIGludGVyZmVyZW5jZSBncmFwaC4KLSAgICBIYXNo
U2V0PEludGVyZmVyZW5jZUVkZ2UsIEludGVyZmVyZW5jZUVkZ2VIYXNoLCBJbnRlcmZlcmVuY2VF
ZGdlSGFzaFRyYWl0cz4gbV9pbnRlcmZlcmVuY2VFZGdlczsKLSAgICBWZWN0b3I8VmVjdG9yPElu
ZGV4VHlwZSwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3csIDQ+LCAwLCBVbnNhZmVWZWN0b3JPdmVy
Zmxvdz4gbV9hZGphY2VuY3lMaXN0OwotICAgIFZlY3RvcjxJbmRleFR5cGUsIDAsIFVuc2FmZVZl
Y3Rvck92ZXJmbG93PiBtX2RlZ3JlZXM7Ci0KLSAgICAvLyBJbnN0ZWFkIG9mIGtlZXBpbmcgdHJh
Y2sgb2YgdGhlIG1vdmUgaW5zdHJ1Y3Rpb25zLCB3ZSBqdXN0IGtlZXAgdGhlaXIgb3BlcmFuZHMg
YXJvdW5kIGFuZCB1c2UgdGhlIGluZGV4Ci0gICAgLy8gaW4gdGhlIHZlY3RvciBhcyB0aGUgImlk
ZW50aWZpZXIiIGZvciB0aGUgbW92ZS4KLSAgICBzdHJ1Y3QgTW92ZU9wZXJhbmRzIHsKLSAgICAg
ICAgSW5kZXhUeXBlIHNyY0luZGV4OwotICAgICAgICBJbmRleFR5cGUgZHN0SW5kZXg7Ci0gICAg
fTsKLSAgICBWZWN0b3I8TW92ZU9wZXJhbmRzLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9j
b2FsZXNjaW5nQ2FuZGlkYXRlczsKLQotICAgIC8vIExpc3Qgb2YgZXZlcnkgbW92ZSBpbnN0cnVj
dGlvbiBhc3NvY2lhdGVkIHdpdGggYSBUbXAuCi0gICAgVmVjdG9yPEhhc2hTZXQ8SW5kZXhUeXBl
LCB0eXBlbmFtZSBEZWZhdWx0SGFzaDxJbmRleFR5cGU+OjpIYXNoLCBXVEY6OlVuc2lnbmVkV2l0
aFplcm9LZXlIYXNoVHJhaXRzPEluZGV4VHlwZT4+PiBtX21vdmVMaXN0OwotCi0gICAgLy8gQ29s
b3JzLgotICAgIFZlY3RvcjxSZWcsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX2NvbG9yZWRU
bXA7Ci0gICAgVmVjdG9yPEluZGV4VHlwZT4gbV9zcGlsbGVkVG1wczsKLQotICAgIC8vIFZhbHVl
cyB0aGF0IGhhdmUgYmVlbiBjb2FsZXNjZWQgd2l0aCBhbiBvdGhlciB2YWx1ZS4KLSAgICBWZWN0
b3I8SW5kZXhUeXBlLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9jb2FsZXNjZWRUbXBzOwot
Ci0gICAgLy8gVGhlIHN0YWNrIG9mIFRtcCByZW1vdmVkIGZyb20gdGhlIGdyYXBoIGFuZCByZWFk
eSBmb3IgY29sb3JpbmcuCi0gICAgQml0VmVjdG9yIG1faXNPblNlbGVjdFN0YWNrOwotICAgIFZl
Y3RvcjxJbmRleFR5cGU+IG1fc2VsZWN0U3RhY2s7Ci0KLSAgICBJbmRleFR5cGUgbV9mcmFtZVBv
aW50ZXJJbmRleCB7IDAgfTsKLSAgICBCaXRWZWN0b3IgbV9pbnRlcmZlcmVzV2l0aEZyYW1lUG9p
bnRlcjsKLQotICAgIHN0cnVjdCBPcmRlcmVkTW92ZVNldCB7Ci0gICAgICAgIHVuc2lnbmVkIGFk
ZE1vdmUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBBU1NFUlQobV9sb3dQcmlvcml0eU1vdmVM
aXN0LmlzRW1wdHkoKSk7Ci0gICAgICAgICAgICBBU1NFUlQoIW1fZmlyc3RMb3dQcmlvcml0eU1v
dmVJbmRleCk7Ci0KLSAgICAgICAgICAgIHVuc2lnbmVkIG5leHRJbmRleCA9IG1fcG9zaXRpb25J
bk1vdmVMaXN0LnNpemUoKTsKLSAgICAgICAgICAgIHVuc2lnbmVkIHBvc2l0aW9uID0gbV9tb3Zl
TGlzdC5zaXplKCk7Ci0gICAgICAgICAgICBtX21vdmVMaXN0LmFwcGVuZChuZXh0SW5kZXgpOwot
ICAgICAgICAgICAgbV9wb3NpdGlvbkluTW92ZUxpc3QuYXBwZW5kKHBvc2l0aW9uKTsKLSAgICAg
ICAgICAgIHJldHVybiBuZXh0SW5kZXg7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHN0YXJ0
QWRkaW5nTG93UHJpb3JpdHlNb3ZlcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFTU0VSVCht
X2xvd1ByaW9yaXR5TW92ZUxpc3QuaXNFbXB0eSgpKTsKLSAgICAgICAgICAgIG1fZmlyc3RMb3dQ
cmlvcml0eU1vdmVJbmRleCA9IG1fbW92ZUxpc3Quc2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAg
ICAgdW5zaWduZWQgYWRkTG93UHJpb3JpdHlNb3ZlKCkKLSAgICAgICAgewotICAgICAgICAgICAg
QVNTRVJUKG1fZmlyc3RMb3dQcmlvcml0eU1vdmVJbmRleCA9PSBtX21vdmVMaXN0LnNpemUoKSk7
Ci0KLSAgICAgICAgICAgIHVuc2lnbmVkIG5leHRJbmRleCA9IG1fcG9zaXRpb25Jbk1vdmVMaXN0
LnNpemUoKTsKLSAgICAgICAgICAgIHVuc2lnbmVkIHBvc2l0aW9uID0gbV9sb3dQcmlvcml0eU1v
dmVMaXN0LnNpemUoKTsKLSAgICAgICAgICAgIG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5hcHBlbmQo
bmV4dEluZGV4KTsKLSAgICAgICAgICAgIG1fcG9zaXRpb25Jbk1vdmVMaXN0LmFwcGVuZChwb3Np
dGlvbik7Ci0KLSAgICAgICAgICAgIEFTU0VSVChuZXh0SW5kZXggPj0gbV9maXJzdExvd1ByaW9y
aXR5TW92ZUluZGV4KTsKLQotICAgICAgICAgICAgcmV0dXJuIG5leHRJbmRleDsKLSAgICAgICAg
fQotCi0gICAgICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAg
IHJldHVybiBtX21vdmVMaXN0LmlzRW1wdHkoKSAmJiBtX2xvd1ByaW9yaXR5TW92ZUxpc3QuaXNF
bXB0eSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbCBjb250YWlucyh1bnNpZ25lZCBpbmRl
eCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1fcG9zaXRpb25Jbk1vdmVMaXN0W2lu
ZGV4XSAhPSBzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4KCk7Ci0gICAgICAgIH0K
LQotICAgICAgICB2b2lkIHRha2VNb3ZlKHVuc2lnbmVkIG1vdmVJbmRleCkKLSAgICAgICAgewot
ICAgICAgICAgICAgdW5zaWduZWQgcG9zaXRpb25Jbk1vdmVMaXN0ID0gbV9wb3NpdGlvbkluTW92
ZUxpc3RbbW92ZUluZGV4XTsKLSAgICAgICAgICAgIGlmIChwb3NpdGlvbkluTW92ZUxpc3QgPT0g
c3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25lZD46Om1heCgpKQotICAgICAgICAgICAgICAgIHJl
dHVybjsKLQotICAgICAgICAgICAgaWYgKG1vdmVJbmRleCA8IG1fZmlyc3RMb3dQcmlvcml0eU1v
dmVJbmRleCkgewotICAgICAgICAgICAgICAgIEFTU0VSVChtX21vdmVMaXN0W3Bvc2l0aW9uSW5N
b3ZlTGlzdF0gPT0gbW92ZUluZGV4KTsKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBsYXN0SW5k
ZXggPSBtX21vdmVMaXN0Lmxhc3QoKTsKLSAgICAgICAgICAgICAgICBtX3Bvc2l0aW9uSW5Nb3Zl
TGlzdFtsYXN0SW5kZXhdID0gcG9zaXRpb25Jbk1vdmVMaXN0OwotICAgICAgICAgICAgICAgIG1f
bW92ZUxpc3RbcG9zaXRpb25Jbk1vdmVMaXN0XSA9IGxhc3RJbmRleDsKLSAgICAgICAgICAgICAg
ICBtX21vdmVMaXN0LnJlbW92ZUxhc3QoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAg
ICAgICAgICAgQVNTRVJUKG1fbG93UHJpb3JpdHlNb3ZlTGlzdFtwb3NpdGlvbkluTW92ZUxpc3Rd
ID09IG1vdmVJbmRleCk7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgbGFzdEluZGV4ID0gbV9s
b3dQcmlvcml0eU1vdmVMaXN0Lmxhc3QoKTsKLSAgICAgICAgICAgICAgICBtX3Bvc2l0aW9uSW5N
b3ZlTGlzdFtsYXN0SW5kZXhdID0gcG9zaXRpb25Jbk1vdmVMaXN0OwotICAgICAgICAgICAgICAg
IG1fbG93UHJpb3JpdHlNb3ZlTGlzdFtwb3NpdGlvbkluTW92ZUxpc3RdID0gbGFzdEluZGV4Owot
ICAgICAgICAgICAgICAgIG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5yZW1vdmVMYXN0KCk7Ci0gICAg
ICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1fcG9zaXRpb25Jbk1vdmVMaXN0W21vdmVJbmRleF0g
PSBzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4KCk7Ci0KLSAgICAgICAgICAgIEFT
U0VSVCghY29udGFpbnMobW92ZUluZGV4KSk7Ci0gICAgICAgIH0KLQotICAgICAgICB1bnNpZ25l
ZCB0YWtlTGFzdE1vdmUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBBU1NFUlQoIWlzRW1wdHko
KSk7Ci0KLSAgICAgICAgICAgIHVuc2lnbmVkIGxhc3RJbmRleDsKLSAgICAgICAgICAgIGlmICgh
bV9tb3ZlTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBsYXN0SW5kZXggPSBtX21v
dmVMaXN0LnRha2VMYXN0KCk7Ci0gICAgICAgICAgICAgICAgQVNTRVJUKG1fcG9zaXRpb25Jbk1v
dmVMaXN0W2xhc3RJbmRleF0gPT0gbV9tb3ZlTGlzdC5zaXplKCkpOwotICAgICAgICAgICAgfSBl
bHNlIHsKLSAgICAgICAgICAgICAgICBsYXN0SW5kZXggPSBtX2xvd1ByaW9yaXR5TW92ZUxpc3Qu
dGFrZUxhc3QoKTsKLSAgICAgICAgICAgICAgICBBU1NFUlQobV9wb3NpdGlvbkluTW92ZUxpc3Rb
bGFzdEluZGV4XSA9PSBtX2xvd1ByaW9yaXR5TW92ZUxpc3Quc2l6ZSgpKTsKLSAgICAgICAgICAg
IH0KLSAgICAgICAgICAgIG1fcG9zaXRpb25Jbk1vdmVMaXN0W2xhc3RJbmRleF0gPSBzdGQ6Om51
bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4KCk7Ci0KLSAgICAgICAgICAgIEFTU0VSVCghY29u
dGFpbnMobGFzdEluZGV4KSk7Ci0gICAgICAgICAgICByZXR1cm4gbGFzdEluZGV4OwotICAgICAg
ICB9Ci0KLSAgICAgICAgdm9pZCByZXR1cm5Nb3ZlKHVuc2lnbmVkIGluZGV4KQotICAgICAgICB7
Ci0gICAgICAgICAgICAvLyBUaGlzIGFzc2VydGlvbiBpcyBhIGJpdCBzdHJpY3QgYnV0IHRoYXQg
aXMgaG93IHRoZSBtb3ZlIGxpc3Qgc2hvdWxkIGJlIHVzZWQuIFRoZSBvbmx5IGtpbmQgb2YgbW92
ZXMgdGhhdCBjYW4KLSAgICAgICAgICAgIC8vIHJldHVybiB0byB0aGUgbGlzdCBhcmUgdGhlIG9u
ZXMgdGhhdCB3ZSBwcmV2aW91c2x5IGZhaWxlZCB0byBjb2FsZXNjZSB3aXRoIHRoZSBjb25zZXJ2
YXRpdmUgaGV1cmlzdGljcy4KLSAgICAgICAgICAgIC8vIFZhbHVlcyBzaG91bGQgbm90IGJlIGFk
ZGVkIGJhY2sgaWYgdGhleSB3ZXJlIG5ldmVyIHRha2VuIG91dCB3aGVuIGF0dGVtcHRpbmcgY29h
bGVzY2luZy4KLSAgICAgICAgICAgIEFTU0VSVCghY29udGFpbnMoaW5kZXgpKTsKLQotICAgICAg
ICAgICAgaWYgKGluZGV4IDwgbV9maXJzdExvd1ByaW9yaXR5TW92ZUluZGV4KSB7Ci0gICAgICAg
ICAgICAgICAgdW5zaWduZWQgcG9zaXRpb24gPSBtX21vdmVMaXN0LnNpemUoKTsKLSAgICAgICAg
ICAgICAgICBtX21vdmVMaXN0LmFwcGVuZChpbmRleCk7Ci0gICAgICAgICAgICAgICAgbV9wb3Np
dGlvbkluTW92ZUxpc3RbaW5kZXhdID0gcG9zaXRpb247Ci0gICAgICAgICAgICB9IGVsc2Ugewot
ICAgICAgICAgICAgICAgIHVuc2lnbmVkIHBvc2l0aW9uID0gbV9sb3dQcmlvcml0eU1vdmVMaXN0
LnNpemUoKTsKLSAgICAgICAgICAgICAgICBtX2xvd1ByaW9yaXR5TW92ZUxpc3QuYXBwZW5kKGlu
ZGV4KTsKLSAgICAgICAgICAgICAgICBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdFtpbmRleF0gPSBwb3Np
dGlvbjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQVNTRVJUKGNvbnRhaW5zKGluZGV4
KSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGNsZWFyKCkKLSAgICAgICAgewotICAgICAg
ICAgICAgbV9wb3NpdGlvbkluTW92ZUxpc3QuY2xlYXIoKTsKLSAgICAgICAgICAgIG1fbW92ZUxp
c3QuY2xlYXIoKTsKLSAgICAgICAgICAgIG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5jbGVhcigpOwot
ICAgICAgICB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBWZWN0b3I8dW5zaWduZWQsIDAsIFVu
c2FmZVZlY3Rvck92ZXJmbG93PiBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdDsKLSAgICAgICAgVmVjdG9y
PHVuc2lnbmVkLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9tb3ZlTGlzdDsKLSAgICAgICAg
VmVjdG9yPHVuc2lnbmVkLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9sb3dQcmlvcml0eU1v
dmVMaXN0OwotICAgICAgICB1bnNpZ25lZCBtX2ZpcnN0TG93UHJpb3JpdHlNb3ZlSW5kZXggeyAw
IH07Ci0gICAgfTsKLQotICAgIC8vIFdvcmsgbGlzdHMuCi0gICAgLy8gU2V0IG9mICJtb3ZlIiBl
bmFibGVkIGZvciBwb3NzaWJsZSBjb2FsZXNjaW5nLgotICAgIE9yZGVyZWRNb3ZlU2V0IG1fd29y
a2xpc3RNb3ZlczsKLSAgICAvLyBTZXQgb2YgIm1vdmUiIG5vdCB5ZXQgcmVhZHkgZm9yIGNvYWxl
c2NpbmcuCi0gICAgQml0VmVjdG9yIG1fYWN0aXZlTW92ZXM7Ci0gICAgLy8gTG93LWRlZ3JlZSwg
bm9uLU1vdmUgcmVsYXRlZC4KLSAgICBWZWN0b3I8SW5kZXhUeXBlPiBtX3NpbXBsaWZ5V29ya2xp
c3Q7Ci0gICAgLy8gSGlnaC1kZWdyZWUgVG1wLgotICAgIEhhc2hTZXQ8SW5kZXhUeXBlPiBtX3Nw
aWxsV29ya2xpc3Q7Ci0gICAgLy8gTG93LWRlZ3JlZSwgTW92ZSByZWxhdGVkLgotICAgIEhhc2hT
ZXQ8SW5kZXhUeXBlPiBtX2ZyZWV6ZVdvcmtsaXN0OwotCi0gICAgYm9vbCBtX2hhc1NlbGVjdGVk
U3BpbGwgeyBmYWxzZSB9OwotICAgIGJvb2wgbV9oYXNDb2FsZXNjZWROb25Ucml2aWFsTW92ZSB7
IGZhbHNlIH07Ci0KLSAgICAvLyBUaGUgbWFwcGluZyBvZiBUbXAgdG8gdGhlaXIgYWxpYXMgZm9y
IE1vdmVzIHRoYXQgYXJlIGFsd2F5cyBjb2FsZXNjaW5nIHJlZ2FyZGxlc3Mgb2Ygc3BpbGxpbmcu
Ci0gICAgVmVjdG9yPEluZGV4VHlwZSwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fY29hbGVz
Y2VkVG1wc0F0U3BpbGw7Ci0gICAgCi0gICAgY29uc3QgSGFzaFNldDx1bnNpZ25lZD4mIG1fdW5z
cGlsbGFibGVUbXBzOwotfTsKLQotLy8gVGhpcyBwZXJmb3JtIGFsbCB0aGUgdGFza3MgdGhhdCBh
cmUgc3BlY2lmaWMgdG8gY2VydGFpbiByZWdpc3RlciB0eXBlLgotdGVtcGxhdGU8QXJnOjpUeXBl
IHR5cGU+Ci1jbGFzcyBDb2xvcmluZ0FsbG9jYXRvciA6IHB1YmxpYyBBYnN0cmFjdENvbG9yaW5n
QWxsb2NhdG9yPHVuc2lnbmVkPiB7Ci1wdWJsaWM6Ci0gICAgQ29sb3JpbmdBbGxvY2F0b3IoQ29k
ZSYgY29kZSwgVG1wV2lkdGgmIHRtcFdpZHRoLCBjb25zdCBVc2VDb3VudHM8VG1wPiYgdXNlQ291
bnRzLCBjb25zdCBIYXNoU2V0PHVuc2lnbmVkPiYgdW5zcGlsbGFibGVUbXApCi0gICAgICAgIDog
QWJzdHJhY3RDb2xvcmluZ0FsbG9jYXRvcjx1bnNpZ25lZD4oY29kZS5yZWdzSW5Qcmlvcml0eU9y
ZGVyKHR5cGUpLCBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6bGFzdE1hY2hpbmVSZWdpc3Rlcklu
ZGV4KCksIHRtcEFycmF5U2l6ZShjb2RlKSwgdW5zcGlsbGFibGVUbXApCi0gICAgICAgICwgbV9j
b2RlKGNvZGUpCi0gICAgICAgICwgbV90bXBXaWR0aCh0bXBXaWR0aCkKLSAgICAgICAgLCBtX3Vz
ZUNvdW50cyh1c2VDb3VudHMpCi0gICAgewotICAgICAgICBpZiAodHlwZSA9PSBBcmc6OkdQKSB7
Ci0gICAgICAgICAgICBtX2ZyYW1lUG9pbnRlckluZGV4ID0gQWJzb2x1dGVUbXBNYXBwZXI8dHlw
ZT46OmFic29sdXRlSW5kZXgoVG1wKE1hY3JvQXNzZW1ibGVyOjpmcmFtZVBvaW50ZXJSZWdpc3Rl
cikpOwotICAgICAgICAgICAgbV9pbnRlcmZlcmVzV2l0aEZyYW1lUG9pbnRlci5lbnN1cmVTaXpl
KHRtcEFycmF5U2l6ZShjb2RlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbml0aWFsaXplUHJl
Y29sb3JlZFRtcCgpOwotICAgICAgICBidWlsZCgpOwotICAgICAgICBhbGxvY2F0ZSgpOwotICAg
IH0KLQotICAgIFRtcCBnZXRBbGlhcyhUbXAgdG1wKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0
dXJuIEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleChnZXRBbGlh
cyhBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh0bXApKSk7Ci0gICAgfQot
Ci0gICAgLy8gVGhpcyB0ZWxscyB5b3UgaWYgYSBNb3ZlIHdpbGwgYmUgY29hbGVzY2FibGUgaWYg
dGhlIHNyYyBhbmQgZHN0IGVuZCB1cCBtYXRjaGluZy4gVGhpcyBtZXRob2QKLSAgICAvLyByZWxp
ZXMgb24gYW4gYW5hbHlzaXMgdGhhdCBpcyBpbnZhbGlkYXRlZCBieSByZWdpc3RlciBhbGxvY2F0
aW9uLCBzbyB5b3UgaXQncyBvbmx5IG1lYW5pbmdmdWwgdG8KLSAgICAvLyBjYWxsIHRoaXMgKmJl
Zm9yZSogcmVwbGFjaW5nIHRoZSBUbXAncyBpbiB0aGlzIEluc3Qgd2l0aCByZWdpc3RlcnMgb3Ig
c3BpbGwgc2xvdHMuCi0gICAgYm9vbCBtYXlCZUNvYWxlc2NhYmxlKGNvbnN0IEluc3QmIGluc3Qp
IGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbWF5QmVDb2FsZXNjYWJsZUltcGwoaW5zdCwg
Jm1fdG1wV2lkdGgpOwotICAgIH0KLQotICAgIGJvb2wgaXNVc2VsZXNzTW92ZShjb25zdCBJbnN0
JiBpbnN0KSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1heUJlQ29hbGVzY2FibGVJbXBs
KGluc3QsIG51bGxwdHIpICYmIGluc3QuYXJnc1swXS50bXAoKSA9PSBpbnN0LmFyZ3NbMV0udG1w
KCk7Ci0gICAgfQotCi0gICAgVG1wIGdldEFsaWFzV2hlblNwaWxsaW5nKFRtcCB0bXApIGNvbnN0
Ci0gICAgewotICAgICAgICBBU1NFUlRfV0lUSF9NRVNTQUdFKCFtX3NwaWxsZWRUbXBzLmlzRW1w
dHkoKSwgIlRoaXMgZnVuY3Rpb24gaXMgb25seSB2YWxpZCBmb3IgY29hbGVzY2luZyBkdXJpbmcg
c3BpbGxpbmcuIik7Ci0KLSAgICAgICAgaWYgKG1fY29hbGVzY2VkVG1wc0F0U3BpbGwuaXNFbXB0
eSgpKQotICAgICAgICAgICAgcmV0dXJuIHRtcDsKLQotICAgICAgICB1bnNpZ25lZCBhbGlhc0lu
ZGV4ID0gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodG1wKTsKLSAgICAg
ICAgd2hpbGUgKHVuc2lnbmVkIG5leHRBbGlhc0luZGV4ID0gbV9jb2FsZXNjZWRUbXBzQXRTcGls
bFthbGlhc0luZGV4XSkKLSAgICAgICAgICAgIGFsaWFzSW5kZXggPSBuZXh0QWxpYXNJbmRleDsK
LQotICAgICAgICBUbXAgYWxpYXMgPSBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFi
c29sdXRlSW5kZXgoYWxpYXNJbmRleCk7Ci0KLSAgICAgICAgQVNTRVJUX1dJVEhfTUVTU0FHRSgh
bV9zcGlsbGVkVG1wcy5jb250YWlucyhhbGlhc0luZGV4KSB8fCBhbGlhcyA9PSB0bXAsICJUaGUg
YWxpYXNlcyBhdCBzcGlsbCBzaG91bGQgYWx3YXlzIGJlIGNvbG9yYWJsZS4gU29tZXRoaW5nIHdl
bnQgaG9ycmlibHkgd3JvbmcuIik7Ci0KLSAgICAgICAgcmV0dXJuIGFsaWFzOwotICAgIH0KLQot
ICAgIHRlbXBsYXRlPHR5cGVuYW1lIEluZGV4SXRlcmF0b3I+Ci0gICAgY2xhc3MgSW5kZXhUb1Rt
cEl0ZXJhdG9yQWRhcHRvciB7Ci0gICAgcHVibGljOgotICAgICAgICBJbmRleFRvVG1wSXRlcmF0
b3JBZGFwdG9yKEluZGV4SXRlcmF0b3ImJiBpbmRleEl0ZXJhdG9yKQotICAgICAgICAgICAgOiBt
X2luZGV4SXRlcmF0b3IoV1RGTW92ZShpbmRleEl0ZXJhdG9yKSkKLSAgICAgICAgewotICAgICAg
ICB9Ci0KLSAgICAgICAgVG1wIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIEFic29sdXRlVG1w
TWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleCgqbV9pbmRleEl0ZXJhdG9yKTsgfQot
ICAgICAgICBJbmRleFRvVG1wSXRlcmF0b3JBZGFwdG9yJiBvcGVyYXRvcisrKCkgeyArK21faW5k
ZXhJdGVyYXRvcjsgcmV0dXJuICp0aGlzOyB9Ci0KLSAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNv
bnN0IEluZGV4VG9UbXBJdGVyYXRvckFkYXB0b3ImIG90aGVyKSBjb25zdAotICAgICAgICB7Ci0g
ICAgICAgICAgICByZXR1cm4gbV9pbmRleEl0ZXJhdG9yID09IG90aGVyLm1faW5kZXhJdGVyYXRv
cjsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBJbmRleFRvVG1w
SXRlcmF0b3JBZGFwdG9yJiBvdGhlcikgY29uc3QKLSAgICAgICAgewotICAgICAgICAgICAgcmV0
dXJuICEoKnRoaXMgPT0gb3RoZXIpOwotICAgICAgICB9Ci0KLSAgICBwcml2YXRlOgotICAgICAg
ICBJbmRleEl0ZXJhdG9yIG1faW5kZXhJdGVyYXRvcjsKLSAgICB9OwotCi0gICAgdGVtcGxhdGU8
dHlwZW5hbWUgQ29sbGVjdGlvbj4KLSAgICBjbGFzcyBJbmRleFRvVG1wSXRlcmFibGVBZGFwdG9y
IHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIEluZGV4VG9UbXBJdGVyYWJsZUFkYXB0b3IoY29uc3Qg
Q29sbGVjdGlvbiYgY29sbGVjdGlvbikKLSAgICAgICAgICAgIDogbV9jb2xsZWN0aW9uKGNvbGxl
Y3Rpb24pCi0gICAgICAgIHsKLSAgICAgICAgfQotCi0gICAgICAgIEluZGV4VG9UbXBJdGVyYXRv
ckFkYXB0b3I8dHlwZW5hbWUgQ29sbGVjdGlvbjo6Y29uc3RfaXRlcmF0b3I+IGJlZ2luKCkgY29u
c3QKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1fY29sbGVjdGlvbi5iZWdpbigpOwot
ICAgICAgICB9Ci0KLSAgICAgICAgSW5kZXhUb1RtcEl0ZXJhdG9yQWRhcHRvcjx0eXBlbmFtZSBD
b2xsZWN0aW9uOjpjb25zdF9pdGVyYXRvcj4gZW5kKCkgY29uc3QKLSAgICAgICAgewotICAgICAg
ICAgICAgcmV0dXJuIG1fY29sbGVjdGlvbi5lbmQoKTsKLSAgICAgICAgfQotCi0gICAgcHJpdmF0
ZToKLSAgICAgICAgY29uc3QgQ29sbGVjdGlvbiYgbV9jb2xsZWN0aW9uOwotICAgIH07Ci0KLSAg
ICBJbmRleFRvVG1wSXRlcmFibGVBZGFwdG9yPFZlY3Rvcjx1bnNpZ25lZD4+IHNwaWxsZWRUbXBz
KCkgY29uc3QgeyByZXR1cm4gbV9zcGlsbGVkVG1wczsgfQotCi0gICAgYm9vbCByZXF1aXJlc1Nw
aWxsaW5nKCkgY29uc3QgeyByZXR1cm4gIW1fc3BpbGxlZFRtcHMuaXNFbXB0eSgpOyB9Ci0KLSAg
ICBSZWcgYWxsb2NhdGVkUmVnKFRtcCB0bXApIGNvbnN0Ci0gICAgewotICAgICAgICBBU1NFUlQo
IXRtcC5pc1JlZygpKTsKLSAgICAgICAgQVNTRVJUKG1fY29sb3JlZFRtcC5zaXplKCkpOwotICAg
ICAgICBBU1NFUlQodG1wLmlzR1AoKSA9PSAodHlwZSA9PSBBcmc6OkdQKSk7Ci0KLSAgICAgICAg
UmVnIHJlZyA9IG1fY29sb3JlZFRtcFtBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJ
bmRleCh0bXApXTsKLSAgICAgICAgaWYgKCFyZWcpIHsKLSAgICAgICAgICAgIGRhdGFMb2coIkZB
VEFMOiBObyBjb2xvciBmb3IgIiwgdG1wLCAiXG4iKTsKLSAgICAgICAgICAgIGRhdGFMb2coIkNv
ZGU6XG4iKTsKLSAgICAgICAgICAgIGRhdGFMb2cobV9jb2RlKTsKLSAgICAgICAgICAgIFJFTEVB
U0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlZzsK
LSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgc3RhdGljIHVuc2lnbmVkIHRtcEFycmF5U2l6ZShDb2Rl
JiBjb2RlKQotICAgIHsKLSAgICAgICAgdW5zaWduZWQgbnVtVG1wcyA9IGNvZGUubnVtVG1wcyh0
eXBlKTsKLSAgICAgICAgcmV0dXJuIEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUlu
ZGV4KG51bVRtcHMpOwotICAgIH0KLQotICAgIHZvaWQgaW5pdGlhbGl6ZVByZWNvbG9yZWRUbXAo
KQotICAgIHsKLSAgICAgICAgbV9jb2xvcmVkVG1wLnJlc2l6ZShtX2xhc3RQcmVjb2xvcmVkUmVn
aXN0ZXJJbmRleCArIDEpOwotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAxOyBpIDw9IG1fbGFz
dFByZWNvbG9yZWRSZWdpc3RlckluZGV4OyArK2kpIHsKLSAgICAgICAgICAgIFRtcCB0bXAgPSBB
YnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgoaSk7Ci0gICAgICAg
ICAgICBBU1NFUlQodG1wLmlzUmVnKCkpOwotICAgICAgICAgICAgbV9jb2xvcmVkVG1wW2ldID0g
dG1wLnJlZygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYm9vbCBtYXlCZUNvYWxlc2NlZChB
cmcgbGVmdCwgQXJnIHJpZ2h0KQotICAgIHsKLSAgICAgICAgaWYgKCFsZWZ0LmlzVG1wKCkgfHwg
IXJpZ2h0LmlzVG1wKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgVG1w
IGxlZnRUbXAgPSBsZWZ0LnRtcCgpOwotICAgICAgICBUbXAgcmlnaHRUbXAgPSByaWdodC50bXAo
KTsKLQotICAgICAgICBpZiAobGVmdFRtcCA9PSByaWdodFRtcCkKLSAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKLQotICAgICAgICBpZiAobGVmdFRtcC5pc0dQKCkgIT0gKHR5cGUgPT0gQXJnOjpH
UCkgfHwgcmlnaHRUbXAuaXNHUCgpICE9ICh0eXBlID09IEFyZzo6R1ApKQotICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOwotCi0gICAgICAgIHVuc2lnbmVkIGxlZnRJbmRleCA9IEFic29sdXRlVG1w
TWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KGxlZnRUbXApOwotICAgICAgICB1bnNpZ25lZCBy
aWdodEluZGV4ID0gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgocmlnaHRU
bXApOwotCi0gICAgICAgIHJldHVybiAhbV9pbnRlcmZlcmVuY2VFZGdlcy5jb250YWlucyhJbnRl
cmZlcmVuY2VFZGdlKGxlZnRJbmRleCwgcmlnaHRJbmRleCkpOwotICAgIH0KLQotICAgIHZvaWQg
YWRkVG9Mb3dQcmlvcml0eUNvYWxlc2NpbmdDYW5kaWRhdGVzKEFyZyBsZWZ0LCBBcmcgcmlnaHQp
Ci0gICAgewotICAgICAgICBBU1NFUlQobWF5QmVDb2FsZXNjZWQobGVmdCwgcmlnaHQpKTsKLSAg
ICAgICAgVG1wIGxlZnRUbXAgPSBsZWZ0LnRtcCgpOwotICAgICAgICBUbXAgcmlnaHRUbXAgPSBy
aWdodC50bXAoKTsKLQotICAgICAgICB1bnNpZ25lZCBsZWZ0SW5kZXggPSBBYnNvbHV0ZVRtcE1h
cHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChsZWZ0VG1wKTsKLSAgICAgICAgdW5zaWduZWQgcmln
aHRJbmRleCA9IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHJpZ2h0VG1w
KTsKLQotICAgICAgICB1bnNpZ25lZCBuZXh0TW92ZUluZGV4ID0gbV9jb2FsZXNjaW5nQ2FuZGlk
YXRlcy5zaXplKCk7Ci0gICAgICAgIG1fY29hbGVzY2luZ0NhbmRpZGF0ZXMuYXBwZW5kKHsgbGVm
dEluZGV4LCByaWdodEluZGV4IH0pOwotCi0gICAgICAgIHVuc2lnbmVkIG5ld0luZGV4SW5Xb3Jr
bGlzdCA9IG1fd29ya2xpc3RNb3Zlcy5hZGRMb3dQcmlvcml0eU1vdmUoKTsKLSAgICAgICAgQVNT
RVJUX1VOVVNFRChuZXdJbmRleEluV29ya2xpc3QsIG5ld0luZGV4SW5Xb3JrbGlzdCA9PSBuZXh0
TW92ZUluZGV4KTsKLQotICAgICAgICBBU1NFUlQobmV4dE1vdmVJbmRleCA8PSBtX2FjdGl2ZU1v
dmVzLnNpemUoKSk7Ci0gICAgICAgIG1fYWN0aXZlTW92ZXMuZW5zdXJlU2l6ZShuZXh0TW92ZUlu
ZGV4ICsgMSk7Ci0KLSAgICAgICAgbV9tb3ZlTGlzdFtsZWZ0SW5kZXhdLmFkZChuZXh0TW92ZUlu
ZGV4KTsKLSAgICAgICAgbV9tb3ZlTGlzdFtyaWdodEluZGV4XS5hZGQobmV4dE1vdmVJbmRleCk7
Ci0gICAgfQotCi0gICAgdm9pZCBidWlsZCgpCi0gICAgewotICAgICAgICBUbXBMaXZlbmVzczx0
eXBlPiBsaXZlbmVzcyhtX2NvZGUpOwotICAgICAgICBmb3IgKEJhc2ljQmxvY2sqIGJsb2NrIDog
bV9jb2RlKSB7Ci0gICAgICAgICAgICB0eXBlbmFtZSBUbXBMaXZlbmVzczx0eXBlPjo6TG9jYWxD
YWxjIGxvY2FsQ2FsYyhsaXZlbmVzcywgYmxvY2spOwotICAgICAgICAgICAgZm9yICh1bnNpZ25l
ZCBpbnN0SW5kZXggPSBibG9jay0+c2l6ZSgpOyBpbnN0SW5kZXgtLTspIHsKLSAgICAgICAgICAg
ICAgICBJbnN0JiBpbnN0ID0gYmxvY2stPmF0KGluc3RJbmRleCk7Ci0gICAgICAgICAgICAgICAg
SW5zdCogbmV4dEluc3QgPSBibG9jay0+Z2V0KGluc3RJbmRleCArIDEpOwotICAgICAgICAgICAg
ICAgIGJ1aWxkKCZpbnN0LCBuZXh0SW5zdCwgbG9jYWxDYWxjKTsKLSAgICAgICAgICAgICAgICBs
b2NhbENhbGMuZXhlY3V0ZShpbnN0SW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAg
YnVpbGQobnVsbHB0ciwgJmJsb2NrLT5hdCgwKSwgbG9jYWxDYWxjKTsKLSAgICAgICAgfQotICAg
ICAgICBidWlsZExvd1ByaW9yaXR5TW92ZUxpc3QoKTsKLSAgICB9Ci0KLSAgICB2b2lkIGJ1aWxk
KEluc3QqIHByZXZJbnN0LCBJbnN0KiBuZXh0SW5zdCwgY29uc3QgdHlwZW5hbWUgVG1wTGl2ZW5l
c3M8dHlwZT46OkxvY2FsQ2FsYyYgbG9jYWxDYWxjKQotICAgIHsKLSAgICAgICAgaWYgKHRyYWNl
RGVidWcpCi0gICAgICAgICAgICBkYXRhTG9nKCJCdWlsZGluZyBiZXR3ZWVuICIsIHBvaW50ZXJE
dW1wKHByZXZJbnN0KSwgIiBhbmQgIiwgcG9pbnRlckR1bXAobmV4dEluc3QpLCAiOlxuIik7Ci0g
ICAgICAgIEluc3Q6OmZvckVhY2hEZWZXaXRoRXh0cmFDbG9iYmVyZWRSZWdzPFRtcD4oCi0gICAg
ICAgICAgICBwcmV2SW5zdCwgbmV4dEluc3QsCi0gICAgICAgICAgICBbJl0gKGNvbnN0IFRtcCYg
YXJnLCBBcmc6OlJvbGUsIEFyZzo6VHlwZSBhcmdUeXBlLCBBcmc6OldpZHRoKSB7Ci0gICAgICAg
ICAgICAgICAgaWYgKGFyZ1R5cGUgIT0gdHlwZSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJu
OwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIEFsbCB0aGUgRGVmKClzIGlu
dGVyZmVyZSB3aXRoIGVhY2ggb3RoZXIgYW5kIHdpdGggYWxsIHRoZSBleHRyYSBjbG9iYmVyZWQg
VG1wcy4KLSAgICAgICAgICAgICAgICAvLyBXZSBzaG91bGQgbm90IHVzZSBmb3JFYWNoRGVmV2l0
aEV4dHJhQ2xvYmJlcmVkUmVncygpIGhlcmUgc2luY2UgY29sb3JlZCBUbXBzCi0gICAgICAgICAg
ICAgICAgLy8gZG8gbm90IG5lZWQgaW50ZXJmZXJlbmNlIGVkZ2VzIGluIG91ciBpbXBsZW1lbnRh
dGlvbi4KLSAgICAgICAgICAgICAgICBJbnN0Ojpmb3JFYWNoRGVmPFRtcD4oCi0gICAgICAgICAg
ICAgICAgICAgIHByZXZJbnN0LCBuZXh0SW5zdCwKLSAgICAgICAgICAgICAgICAgICAgWyZdIChU
bXAmIG90aGVyQXJnLCBBcmc6OlJvbGUsIEFyZzo6VHlwZSBhcmdUeXBlLCBBcmc6OldpZHRoKSB7
Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnVHlwZSAhPSB0eXBlKQotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAg
ICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgZGF0YUxvZygiICAgIEFkZGluZyBkZWYtZGVmIGVkZ2U6ICIsIGFyZywgIiwgIiwg
b3RoZXJBcmcsICJcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+YWRkRWRnZShh
cmcsIG90aGVyQXJnKTsKLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICB9KTsK
LQotICAgICAgICBpZiAocHJldkluc3QgJiYgbWF5QmVDb2FsZXNjYWJsZSgqcHJldkluc3QpKSB7
Ci0gICAgICAgICAgICAvLyBXZSBkbyBub3Qgd2FudCB0aGUgVXNlKCkgb2YgdGhpcyBtb3ZlIHRv
IGludGVyZmVyZSB3aXRoIHRoZSBEZWYoKSwgZXZlbiBpZiBpdCBpcyBsaXZlCi0gICAgICAgICAg
ICAvLyBhZnRlciB0aGUgTW92ZS4gSWYgd2Ugd2VyZSB0byBhZGQgdGhlIGludGVyZmVyZW5jZSBl
ZGdlLCBpdCB3b3VsZCBiZSBpbXBvc3NpYmxlIHRvCi0gICAgICAgICAgICAvLyBjb2FsZXNjZSB0
aGUgTW92ZSBldmVuIGlmIHRoZSB0d28gVG1wIG5ldmVyIGludGVyZmVyZSBhbnl3aGVyZS4KLSAg
ICAgICAgICAgIFRtcCBkZWZUbXA7Ci0gICAgICAgICAgICBUbXAgdXNlVG1wOwotICAgICAgICAg
ICAgcHJldkluc3QtPmZvckVhY2hUbXAoWyZkZWZUbXAsICZ1c2VUbXBdIChUbXAmIGFyZ1RtcCwg
QXJnOjpSb2xlIHJvbGUsIEFyZzo6VHlwZSwgQXJnOjpXaWR0aCkgewotICAgICAgICAgICAgICAg
IGlmIChBcmc6OmlzTGF0ZURlZihyb2xlKSkKLSAgICAgICAgICAgICAgICAgICAgZGVmVG1wID0g
YXJnVG1wOwotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBU1NF
UlQoQXJnOjppc0Vhcmx5VXNlKHJvbGUpKTsKLSAgICAgICAgICAgICAgICAgICAgdXNlVG1wID0g
YXJnVG1wOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAg
QVNTRVJUKGRlZlRtcCk7Ci0gICAgICAgICAgICBBU1NFUlQodXNlVG1wKTsKLQotICAgICAgICAg
ICAgdW5zaWduZWQgbmV4dE1vdmVJbmRleCA9IG1fY29hbGVzY2luZ0NhbmRpZGF0ZXMuc2l6ZSgp
OwotICAgICAgICAgICAgbV9jb2FsZXNjaW5nQ2FuZGlkYXRlcy5hcHBlbmQoeyBBYnNvbHV0ZVRt
cE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh1c2VUbXApLCBBYnNvbHV0ZVRtcE1hcHBlcjx0
eXBlPjo6YWJzb2x1dGVJbmRleChkZWZUbXApIH0pOwotCi0gICAgICAgICAgICB1bnNpZ25lZCBu
ZXdJbmRleEluV29ya2xpc3QgPSBtX3dvcmtsaXN0TW92ZXMuYWRkTW92ZSgpOwotICAgICAgICAg
ICAgQVNTRVJUX1VOVVNFRChuZXdJbmRleEluV29ya2xpc3QsIG5ld0luZGV4SW5Xb3JrbGlzdCA9
PSBuZXh0TW92ZUluZGV4KTsKLQotICAgICAgICAgICAgQVNTRVJUKG5leHRNb3ZlSW5kZXggPD0g
bV9hY3RpdmVNb3Zlcy5zaXplKCkpOwotICAgICAgICAgICAgbV9hY3RpdmVNb3Zlcy5lbnN1cmVT
aXplKG5leHRNb3ZlSW5kZXggKyAxKTsKLQotICAgICAgICAgICAgZm9yIChjb25zdCBBcmcmIGFy
ZyA6IHByZXZJbnN0LT5hcmdzKSB7Ci0gICAgICAgICAgICAgICAgYXV0byYgbGlzdCA9IG1fbW92
ZUxpc3RbQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgoYXJnLnRtcCgpKV07
Ci0gICAgICAgICAgICAgICAgbGlzdC5hZGQobmV4dE1vdmVJbmRleCk7Ci0gICAgICAgICAgICB9
Ci0KLSAgICAgICAgICAgIGZvciAoY29uc3QgVG1wJiBsaXZlVG1wIDogbG9jYWxDYWxjLmxpdmUo
KSkgewotICAgICAgICAgICAgICAgIGlmIChsaXZlVG1wICE9IHVzZVRtcCkgewotICAgICAgICAg
ICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFM
b2coIiAgICBBZGRpbmcgZGVmLWxpdmUgZm9yIGNvYWxlc2NhYmxlOiAiLCBkZWZUbXAsICIsICIs
IGxpdmVUbXAsICJcbiIpOwotICAgICAgICAgICAgICAgICAgICBhZGRFZGdlKGRlZlRtcCwgbGl2
ZVRtcCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAv
LyBUaGUgbmV4dCBpbnN0cnVjdGlvbiBjb3VsZCBoYXZlIGVhcmx5IGNsb2JiZXJzIG9yIGVhcmx5
IGRlZidzLiBXZSBuZWVkIHRvIGNvbnNpZGVyCi0gICAgICAgICAgICAvLyB0aG9zZSBub3cuCi0g
ICAgICAgICAgICBhZGRFZGdlcyhudWxscHRyLCBuZXh0SW5zdCwgbG9jYWxDYWxjLmxpdmUoKSk7
Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgYWRkRWRnZXMocHJldkluc3QsIG5leHRJbnN0
LCBsb2NhbENhbGMubGl2ZSgpKTsKLSAgICB9Ci0KLSAgICB2b2lkIGJ1aWxkTG93UHJpb3JpdHlN
b3ZlTGlzdCgpCi0gICAgewotICAgICAgICBpZiAoIWlzWDg2KCkpCi0gICAgICAgICAgICByZXR1
cm47Ci0KLSAgICAgICAgbV93b3JrbGlzdE1vdmVzLnN0YXJ0QWRkaW5nTG93UHJpb3JpdHlNb3Zl
cygpOwotICAgICAgICBmb3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogbV9jb2RlKSB7Ci0gICAgICAg
ICAgICBmb3IgKEluc3QmIGluc3QgOiAqYmxvY2spIHsKLSAgICAgICAgICAgICAgICBpZiAoc3Rk
OjpvcHRpb25hbDx1bnNpZ25lZD4gZGVmQXJnSW5kZXggPSBpbnN0LnNob3VsZFRyeUFsaWFzaW5n
RGVmKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQXJnIG9wMSA9IGluc3QuYXJnc1sqZGVmQXJn
SW5kZXggLSAyXTsKLSAgICAgICAgICAgICAgICAgICAgQXJnIG9wMiA9IGluc3QuYXJnc1sqZGVm
QXJnSW5kZXggLSAxXTsKLSAgICAgICAgICAgICAgICAgICAgQXJnIGRlc3QgPSBpbnN0LmFyZ3Nb
KmRlZkFyZ0luZGV4XTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAob3AxID09IGRlc3QgfHwg
b3AyID09IGRlc3QpCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAg
ICAgICAgICAgICAgICBpZiAobWF5QmVDb2FsZXNjZWQob3AxLCBkZXN0KSkKLSAgICAgICAgICAg
ICAgICAgICAgICAgIGFkZFRvTG93UHJpb3JpdHlDb2FsZXNjaW5nQ2FuZGlkYXRlcyhvcDEsIGRl
c3QpOwotICAgICAgICAgICAgICAgICAgICBpZiAob3AxICE9IG9wMiAmJiBtYXlCZUNvYWxlc2Nl
ZChvcDIsIGRlc3QpKQotICAgICAgICAgICAgICAgICAgICAgICAgYWRkVG9Mb3dQcmlvcml0eUNv
YWxlc2NpbmdDYW5kaWRhdGVzKG9wMiwgZGVzdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAg
ICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBhZGRFZGdlcyhJbnN0KiBwcmV2
SW5zdCwgSW5zdCogbmV4dEluc3QsIHR5cGVuYW1lIFRtcExpdmVuZXNzPHR5cGU+OjpMb2NhbENh
bGM6Okl0ZXJhYmxlIGxpdmVUbXBzKQotICAgIHsKLSAgICAgICAgLy8gQWxsIHRoZSBEZWYoKXMg
aW50ZXJmZXJlIHdpdGggZXZlcnRoaW5nIGxpdmUuCi0gICAgICAgIEluc3Q6OmZvckVhY2hEZWZX
aXRoRXh0cmFDbG9iYmVyZWRSZWdzPFRtcD4oCi0gICAgICAgICAgICBwcmV2SW5zdCwgbmV4dElu
c3QsCi0gICAgICAgICAgICBbJl0gKGNvbnN0IFRtcCYgYXJnLCBBcmc6OlJvbGUsIEFyZzo6VHlw
ZSBhcmdUeXBlLCBBcmc6OldpZHRoKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFyZ1R5cGUgIT0g
dHlwZSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIAotICAg
ICAgICAgICAgICAgIGZvciAoY29uc3QgVG1wJiBsaXZlVG1wIDogbGl2ZVRtcHMpIHsKLSAgICAg
ICAgICAgICAgICAgICAgQVNTRVJUKGxpdmVUbXAuaXNHUCgpID09ICh0eXBlID09IEFyZzo6R1Ap
KTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmICh0cmFjZURl
YnVnKQotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUxvZygiICAgIEFkZGluZyBkZWYtbGl2
ZSBlZGdlOiAiLCBhcmcsICIsICIsIGxpdmVUbXAsICJcbiIpOwotICAgICAgICAgICAgICAgICAg
ICAKLSAgICAgICAgICAgICAgICAgICAgYWRkRWRnZShhcmcsIGxpdmVUbXApOwotICAgICAgICAg
ICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICh0eXBlID09IEFyZzo6R1AgJiYgIWFyZy5p
c0dQUigpKQotICAgICAgICAgICAgICAgICAgICBtX2ludGVyZmVyZXNXaXRoRnJhbWVQb2ludGVy
LnF1aWNrU2V0KEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KGFyZykpOwot
ICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBhZGRFZGdlKFRtcCBhLCBUbXAgYikK
LSAgICB7Ci0gICAgICAgIEFTU0VSVF9XSVRIX01FU1NBR0UoYS5pc0dQKCkgPT0gYi5pc0dQKCks
ICJBbiBpbnRlcmZlcmVuY2UgYmV0d2VlbiByZWdpc3RlcnMgb2YgZGlmZmVyZW50IHR5cGVzIGRv
ZXMgbm90IG1ha2Ugc2Vuc2UsIGl0IGNhbiBsZWFkIHRvIG5vbi1jb2xvcmFibGUgZ3JhcGhzLiIp
OwotCi0gICAgICAgIGFkZEVkZ2UoQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5k
ZXgoYSksIEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KGIpKTsKLSAgICB9
Ci0KLSAgICAvLyBDYWxsaW5nIHRoaXMgd2l0aG91dCBhIHRtcFdpZHRoIHdpbGwgcGVyZm9ybSBh
IG1vcmUgY29uc2VydmF0aXZlIGNvYWxlc2NpbmcgYW5hbHlzaXMgdGhhdCBhc3N1bWVzCi0gICAg
Ly8gdGhhdCBNb3ZlMzIncyBhcmUgbm90IGNvYWxlc2NhYmxlLgotICAgIHN0YXRpYyBib29sIG1h
eUJlQ29hbGVzY2FibGVJbXBsKGNvbnN0IEluc3QmIGluc3QsIFRtcFdpZHRoKiB0bXBXaWR0aCkK
LSAgICB7Ci0gICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICBjYXNlIEFyZzo6R1A6Ci0g
ICAgICAgICAgICBzd2l0Y2ggKGluc3Qua2luZC5vcGNvZGUpIHsKLSAgICAgICAgICAgIGNhc2Ug
TW92ZToKLSAgICAgICAgICAgIGNhc2UgTW92ZTMyOgotICAgICAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBcmc6OkZQOgotICAg
ICAgICAgICAgc3dpdGNoIChpbnN0LmtpbmQub3Bjb2RlKSB7Ci0gICAgICAgICAgICBjYXNlIE1v
dmVGbG9hdDoKLSAgICAgICAgICAgIGNhc2UgTW92ZURvdWJsZToKLSAgICAgICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAg
ICBBU1NFUlRfV0lUSF9NRVNTQUdFKGluc3QuYXJncy5zaXplKCkgPT0gMiwgIldlIGFzc3VtZSBj
b2FsZWNhYmxlIG1vdmVzIG9ubHkgaGF2ZSB0d28gYXJndW1lbnRzIGluIGEgZmV3IHBsYWNlcy4i
KTsKLQotICAgICAgICBpZiAoIWluc3QuYXJnc1swXS5pc1RtcCgpIHx8ICFpbnN0LmFyZ3NbMV0u
aXNUbXAoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBBU1NFUlQoaW5z
dC5hcmdzWzBdLnR5cGUoKSA9PSB0eXBlKTsKLSAgICAgICAgQVNTRVJUKGluc3QuYXJnc1sxXS50
eXBlKCkgPT0gdHlwZSk7Ci0KLSAgICAgICAgLy8gV2UgY2FuIGNvYWxlc2NlIGEgTW92ZTMyIHNv
IGxvbmcgYXMgZWl0aGVyIG9mIHRoZSBmb2xsb3dpbmcgaG9sZHM6Ci0gICAgICAgIC8vIC0gVGhl
IGlucHV0IGlzIGFscmVhZHkgemVyby1maWxsZWQuCi0gICAgICAgIC8vIC0gVGhlIG91dHB1dCBv
bmx5IGNhcmVzIGFib3V0IHRoZSBsb3cgMzIgYml0cy4KLSAgICAgICAgLy8KLSAgICAgICAgLy8g
Tm90ZSB0aGF0IHRoZSBpbnB1dCBwcm9wZXJ0eSByZXF1aXJlcyBhbiBhbmFseXNpcyBvdmVyIFpE
ZWYncywgc28gaXQncyBvbmx5IHZhbGlkIHNvIGxvbmcKLSAgICAgICAgLy8gYXMgdGhlIGlucHV0
IGdldHMgYSByZWdpc3Rlci4gV2UgZG9uJ3Qga25vdyBpZiB0aGUgaW5wdXQgZ2V0cyBhIHJlZ2lz
dGVyLCBidXQgd2UgZG8ga25vdwotICAgICAgICAvLyB0aGF0IGlmIGl0IGRvZXNuJ3QgZ2V0IGEg
cmVnaXN0ZXIgdGhlbiB3ZSB3aWxsIHN0aWxsIGVtaXQgdGhpcyBNb3ZlMzIuCi0gICAgICAgIGlm
IChpbnN0LmtpbmQub3Bjb2RlID09IE1vdmUzMikgewotICAgICAgICAgICAgaWYgKCF0bXBXaWR0
aCkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIGlmICh0bXBX
aWR0aC0+ZGVmV2lkdGgoaW5zdC5hcmdzWzBdLnRtcCgpKSA+IEFyZzo6V2lkdGgzMgotICAgICAg
ICAgICAgICAgICYmIHRtcFdpZHRoLT51c2VXaWR0aChpbnN0LmFyZ3NbMV0udG1wKCkpID4gQXJn
OjpXaWR0aDMyKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAg
ICAgICAKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgdm9pZCBzZWxlY3RTcGls
bCgpCi0gICAgewotICAgICAgICBpZiAoIW1faGFzU2VsZWN0ZWRTcGlsbCkgewotICAgICAgICAg
ICAgbV9oYXNTZWxlY3RlZFNwaWxsID0gdHJ1ZTsKLQotICAgICAgICAgICAgaWYgKG1faGFzQ29h
bGVzY2VkTm9uVHJpdmlhbE1vdmUpCi0gICAgICAgICAgICAgICAgbV9jb2FsZXNjZWRUbXBzQXRT
cGlsbCA9IG1fY29hbGVzY2VkVG1wczsKLSAgICAgICAgfQotCi0gICAgICAgIGF1dG8gaXRlcmF0
b3IgPSBtX3NwaWxsV29ya2xpc3QuYmVnaW4oKTsKLQotICAgICAgICBSRUxFQVNFX0FTU0VSVF9X
SVRIX01FU1NBR0UoaXRlcmF0b3IgIT0gbV9zcGlsbFdvcmtsaXN0LmVuZCgpLCAic2VsZWN0U3Bp
bGwoKSBjYWxsZWQgd2hlbiB0aGVyZSB3YXMgbm8gc3BpbGwuIik7Ci0gICAgICAgIFJFTEVBU0Vf
QVNTRVJUX1dJVEhfTUVTU0FHRSghbV91bnNwaWxsYWJsZVRtcHMuY29udGFpbnMoKml0ZXJhdG9y
KSwgInRyeWluZyB0byBzcGlsbCB1bnNwaWxsYWJsZSB0bXAiKTsKLQotICAgICAgICAvLyBIaWdo
ZXIgc2NvcmUgbWVhbnMgbW9yZSBkZXNpcmFibGUgdG8gc3BpbGwuIExvd2VyIHNjb3JlcyBtYXhp
bWl6ZSB0aGUgbGlrZWxpaG9vZCB0aGF0IGEgdG1wCi0gICAgICAgIC8vIGdldHMgYSByZWdpc3Rl
ci4KLSAgICAgICAgYXV0byBzY29yZSA9IFsmXSAoVG1wIHRtcCkgLT4gZG91YmxlIHsKLSAgICAg
ICAgICAgIC8vIEFpciBleHBvc2VzIHRoZSBjb25jZXB0IG9mICJmYXN0IHRtcHMiLCBhbmQgd2Ug
aW50ZXJwcmV0IHRoYXQgdG8gbWVhbiB0aGF0IHRoZSB0bXAKLSAgICAgICAgICAgIC8vIHNob3Vs
ZCBhbHdheXMgYmUgaW4gYSByZWdpc3Rlci4KLSAgICAgICAgICAgIGlmIChtX2NvZGUuaXNGYXN0
VG1wKHRtcCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAKLSAgICAg
ICAgICAgIC8vIEFsbCBlbHNlIGJlaW5nIGVxdWFsLCB0aGUgc2NvcmUgc2hvdWxkIGJlIGRpcmVj
dGx5IHJlbGF0ZWQgdG8gdGhlIGRlZ3JlZS4KLSAgICAgICAgICAgIGRvdWJsZSBkZWdyZWUgPSBz
dGF0aWNfY2FzdDxkb3VibGU+KG1fZGVncmVlc1tBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJz
b2x1dGVJbmRleCh0bXApXSk7Ci0KLSAgICAgICAgICAgIC8vIEFsbCBlbHNlIGJlaW5nIGVxdWFs
LCB0aGUgc2NvcmUgc2hvdWxkIGJlIGludmVyc2VseSByZWxhdGVkIHRvIHRoZSBudW1iZXIgb2Yg
d2FybSB1c2VzIGFuZAotICAgICAgICAgICAgLy8gZGVmcy4KLSAgICAgICAgICAgIGNvbnN0IFVz
ZUNvdW50czxUbXA+OjpDb3VudHMqIGNvdW50cyA9IG1fdXNlQ291bnRzW3RtcF07Ci0gICAgICAg
ICAgICBpZiAoIWNvdW50cykKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xp
bWl0czxkb3VibGU+OjppbmZpbml0eSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBkb3Vi
bGUgdXNlcyA9IGNvdW50cy0+bnVtV2FybVVzZXMgKyBjb3VudHMtPm51bURlZnM7Ci0KLSAgICAg
ICAgICAgIC8vIElmIGl0J3MgYSBjb25zdGFudCwgdGhlbiBpdCdzIG5vdCBhcyBiYWQgdG8gc3Bp
bGwuIFdlIGNhbiByZW1hdGVyaWFsaXplIGl0IGluIG1hbnkKLSAgICAgICAgICAgIC8vIGNhc2Vz
LgotICAgICAgICAgICAgaWYgKGNvdW50cy0+bnVtQ29uc3REZWZzID09IDEgJiYgY291bnRzLT5u
dW1EZWZzID09IDEpCi0gICAgICAgICAgICAgICAgdXNlcyAvPSAyOwotCi0gICAgICAgICAgICBy
ZXR1cm4gZGVncmVlIC8gdXNlczsKLSAgICAgICAgfTsKLQotICAgICAgICBhdXRvIHZpY3RpbUl0
ZXJhdG9yID0gaXRlcmF0b3I7Ci0gICAgICAgIGRvdWJsZSBtYXhTY29yZSA9IHNjb3JlKEFic29s
dXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleCgqaXRlcmF0b3IpKTsKLQot
ICAgICAgICArK2l0ZXJhdG9yOwotICAgICAgICBmb3IgKDtpdGVyYXRvciAhPSBtX3NwaWxsV29y
a2xpc3QuZW5kKCk7ICsraXRlcmF0b3IpIHsKLSAgICAgICAgICAgIGRvdWJsZSB0bXBTY29yZSA9
IHNjb3JlKEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleCgqaXRl
cmF0b3IpKTsKLSAgICAgICAgICAgIGlmICh0bXBTY29yZSA+IG1heFNjb3JlKSB7Ci0gICAgICAg
ICAgICAgICAgQVNTRVJUKCFtX3Vuc3BpbGxhYmxlVG1wcy5jb250YWlucygqaXRlcmF0b3IpKTsK
LSAgICAgICAgICAgICAgICB2aWN0aW1JdGVyYXRvciA9IGl0ZXJhdG9yOwotICAgICAgICAgICAg
ICAgIG1heFNjb3JlID0gdG1wU2NvcmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAg
ICAgICB1bnNpZ25lZCB2aWN0aW1JbmRleCA9ICp2aWN0aW1JdGVyYXRvcjsKLSAgICAgICAgbV9z
cGlsbFdvcmtsaXN0LnJlbW92ZSh2aWN0aW1JdGVyYXRvcik7Ci0gICAgICAgIG1fc2ltcGxpZnlX
b3JrbGlzdC5hcHBlbmQodmljdGltSW5kZXgpOwotCi0gICAgICAgIGZyZWV6ZU1vdmVzKHZpY3Rp
bUluZGV4KTsKLSAgICB9Ci0KLSAgICB2b2lkIGFsbG9jYXRlKCkKLSAgICB7Ci0gICAgICAgIEFT
U0VSVF9XSVRIX01FU1NBR0UobV9hY3RpdmVNb3Zlcy5zaXplKCkgPj0gbV9jb2FsZXNjaW5nQ2Fu
ZGlkYXRlcy5zaXplKCksICJUaGUgYWN0aXZlTW92ZSBzZXQgc2hvdWxkIGJlIGJpZyBlbm91Z2gg
Zm9yIHRoZSBxdWljayBvcGVyYXRpb25zIG9mIEJpdFZlY3Rvci4iKTsKLQotICAgICAgICBtYWtl
V29ya0xpc3QoKTsKLQotICAgICAgICBpZiAoZGVidWcpIHsKLSAgICAgICAgICAgIGRhdGFMb2co
IkludGVyZmVyZW5jZTogIiwgbGlzdER1bXAobV9pbnRlcmZlcmVuY2VFZGdlcyksICJcbiIpOwot
ICAgICAgICAgICAgZHVtcEludGVyZmVyZW5jZUdyYXBoSW5Eb3QoV1RGOjpkYXRhRmlsZSgpKTsK
LSAgICAgICAgICAgIGRhdGFMb2coIkNvYWxlc2NpbmcgY2FuZGlkYXRlczpcbiIpOwotICAgICAg
ICAgICAgZm9yIChNb3ZlT3BlcmFuZHMmIG1vdmVPcCA6IG1fY29hbGVzY2luZ0NhbmRpZGF0ZXMp
IHsKLSAgICAgICAgICAgICAgICBkYXRhTG9nKCIgICAgIiwgQWJzb2x1dGVUbXBNYXBwZXI8dHlw
ZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KG1vdmVPcC5zcmNJbmRleCksCi0gICAgICAgICAgICAg
ICAgICAgICIgLT4gIiwgQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUlu
ZGV4KG1vdmVPcC5kc3RJbmRleCksICJcbiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAg
ZGF0YUxvZygiSW5pdGlhbCB3b3JrIGxpc3RcbiIpOwotICAgICAgICAgICAgZHVtcFdvcmtMaXN0
cyhXVEY6OmRhdGFGaWxlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZG8gewotICAgICAgICAg
ICAgaWYgKHRyYWNlRGVidWcpIHsKLSAgICAgICAgICAgICAgICBkYXRhTG9nKCJCZWZvcmUgR3Jh
cGggc2ltcGxpZmljYXRpb24gaXRlcmF0aW9uXG4iKTsKLSAgICAgICAgICAgICAgICBkdW1wV29y
a0xpc3RzKFdURjo6ZGF0YUZpbGUoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlm
ICghbV9zaW1wbGlmeVdvcmtsaXN0LmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICBzaW1wbGlm
eSgpOwotICAgICAgICAgICAgZWxzZSBpZiAoIW1fd29ya2xpc3RNb3Zlcy5pc0VtcHR5KCkpCi0g
ICAgICAgICAgICAgICAgY29hbGVzY2UoKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKCFtX2ZyZWV6
ZVdvcmtsaXN0LmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICBmcmVlemUoKTsKLSAgICAgICAg
ICAgIGVsc2UgaWYgKCFtX3NwaWxsV29ya2xpc3QuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAg
IHNlbGVjdFNwaWxsKCk7Ci0KLSAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKSB7Ci0gICAgICAg
ICAgICAgICAgZGF0YUxvZygiQWZ0ZXIgR3JhcGggc2ltcGxpZmljYXRpb24gaXRlcmF0aW9uXG4i
KTsKLSAgICAgICAgICAgICAgICBkdW1wV29ya0xpc3RzKFdURjo6ZGF0YUZpbGUoKSk7Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUgKCFtX3NpbXBsaWZ5V29ya2xpc3QuaXNFbXB0eSgp
IHx8ICFtX3dvcmtsaXN0TW92ZXMuaXNFbXB0eSgpIHx8ICFtX2ZyZWV6ZVdvcmtsaXN0LmlzRW1w
dHkoKSB8fCAhbV9zcGlsbFdvcmtsaXN0LmlzRW1wdHkoKSk7Ci0KLSAgICAgICAgYXNzaWduQ29s
b3JzKCk7Ci0gICAgfQotCi0jaWYgUExBVEZPUk0oQ09DT0EpCi0jcHJhZ21hIG1hcmsgLSBEZWJ1
Z2dpbmcgaGVscGVycy4KLSNlbmRpZgotCi0gICAgdm9pZCBkdW1wSW50ZXJmZXJlbmNlR3JhcGhJ
bkRvdChQcmludFN0cmVhbSYgb3V0KQotICAgIHsKLSAgICAgICAgb3V0LnByaW50KCJncmFwaCBJ
bnRlcmZlcmVuY2VHcmFwaCB7IFxuIik7Ci0KLSAgICAgICAgSGFzaFNldDxUbXA+IHRtcHNXaXRo
SW50ZXJmZXJlbmNlczsKLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiBlZGdlIDogbV9pbnRlcmZl
cmVuY2VFZGdlcykgewotICAgICAgICAgICAgdG1wc1dpdGhJbnRlcmZlcmVuY2VzLmFkZChBYnNv
bHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgoZWRnZS5maXJzdCgpKSk7
Ci0gICAgICAgICAgICB0bXBzV2l0aEludGVyZmVyZW5jZXMuYWRkKEFic29sdXRlVG1wTWFwcGVy
PHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleChlZGdlLnNlY29uZCgpKSk7Ci0gICAgICAgIH0K
LQotICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHRtcCA6IHRtcHNXaXRoSW50ZXJmZXJlbmNlcykg
ewotICAgICAgICAgICAgdW5zaWduZWQgdG1wSW5kZXggPSBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBl
Pjo6YWJzb2x1dGVJbmRleCh0bXApOwotICAgICAgICAgICAgaWYgKHRtcEluZGV4IDwgbV9kZWdy
ZWVzLnNpemUoKSkKLSAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiAgICAiLCB0bXAuaW50ZXJu
YWxWYWx1ZSgpLCAiIFtsYWJlbD1cIiIsIHRtcCwgIiAoIiwgbV9kZWdyZWVzW3RtcEluZGV4XSwg
IilcIl07XG4iKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBvdXQucHJpbnQo
IiAgICAiLCB0bXAuaW50ZXJuYWxWYWx1ZSgpLCAiIFtsYWJlbD1cIiIsIHRtcCwgIlwiXTtcbiIp
OwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiBlZGdlIDogbV9pbnRlcmZl
cmVuY2VFZGdlcykKLSAgICAgICAgICAgIG91dC5wcmludCgiICAgICIsIGVkZ2UuZmlyc3QoKSwg
IiAtLSAiLCBlZGdlLnNlY29uZCgpLCAiO1xuIik7Ci0gICAgICAgIG91dC5wcmludCgifVxuIik7
Ci0gICAgfQotCi0gICAgdm9pZCBkdW1wV29ya0xpc3RzKFByaW50U3RyZWFtJiBvdXQpCi0gICAg
ewotICAgICAgICBvdXQucHJpbnQoIlNpbXBsaWZ5IHdvcmsgbGlzdDpcbiIpOwotICAgICAgICBm
b3IgKHVuc2lnbmVkIHRtcEluZGV4IDogbV9zaW1wbGlmeVdvcmtsaXN0KQotICAgICAgICAgICAg
b3V0LnByaW50KCIgICAgIiwgQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0
ZUluZGV4KHRtcEluZGV4KSwgIlxuIik7Ci0gICAgICAgIG91dC5wcmludGYoIk1vdmVzIHdvcmsg
bGlzdCBpcyBlbXB0eT8gJWRcbiIsIG1fd29ya2xpc3RNb3Zlcy5pc0VtcHR5KCkpOwotICAgICAg
ICBvdXQucHJpbnQoIkZyZWV6ZSB3b3JrIGxpc3Q6XG4iKTsKLSAgICAgICAgZm9yICh1bnNpZ25l
ZCB0bXBJbmRleCA6IG1fZnJlZXplV29ya2xpc3QpCi0gICAgICAgICAgICBvdXQucHJpbnQoIiAg
ICAiLCBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgodG1wSW5k
ZXgpLCAiXG4iKTsKLSAgICAgICAgb3V0LnByaW50KCJTcGlsbCB3b3JrIGxpc3Q6XG4iKTsKLSAg
ICAgICAgZm9yICh1bnNpZ25lZCB0bXBJbmRleCA6IG1fc3BpbGxXb3JrbGlzdCkKLSAgICAgICAg
ICAgIG91dC5wcmludCgiICAgICIsIEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJz
b2x1dGVJbmRleCh0bXBJbmRleCksICJcbiIpOwotICAgIH0KLQotICAgIHVzaW5nIEFic3RyYWN0
Q29sb3JpbmdBbGxvY2F0b3I8dW5zaWduZWQ+OjphZGRFZGdlOwotICAgIHVzaW5nIEFic3RyYWN0
Q29sb3JpbmdBbGxvY2F0b3I8dW5zaWduZWQ+OjpnZXRBbGlhczsKLQotICAgIENvZGUmIG1fY29k
ZTsKLSAgICBUbXBXaWR0aCYgbV90bXBXaWR0aDsKLSAgICAvLyBGSVhNRTogc3BpbGxpbmcgc2hv
dWxkIG5vdCB0eXBlIHNwZWNpZmljLiBJdCBpcyBvbmx5IGEgc2lkZSBlZmZlY3Qgb2YgdXNpbmcg
VXNlQ291bnRzLgotICAgIGNvbnN0IFVzZUNvdW50czxUbXA+JiBtX3VzZUNvdW50czsKLX07Ci0K
LWNsYXNzIEl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nIHsKLXB1YmxpYzoKLSAgICBJdGVyYXRl
ZFJlZ2lzdGVyQ29hbGVzY2luZyhDb2RlJiBjb2RlKQotICAgICAgICA6IG1fY29kZShjb2RlKQot
ICAgICAgICAsIG1fdXNlQ291bnRzKGNvZGUpCi0gICAgewotICAgIH0KLQotICAgIHZvaWQgcnVu
KCkKLSAgICB7Ci0gICAgICAgIHBhZEludGVyZmVyZW5jZShtX2NvZGUpOwotICAgICAgICAKLSAg
ICAgICAgaXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmdPblR5cGU8QXJnOjpHUD4oKTsKLSAgICAg
ICAgaXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmdPblR5cGU8QXJnOjpGUD4oKTsKLQotICAgICAg
ICBmaXhTcGlsbHNBZnRlclRlcm1pbmFscygpOwotCi0gICAgICAgIGlmIChyZXBvcnRTdGF0cykK
LSAgICAgICAgICAgIGRhdGFMb2coIk51bSBpdGVyYXRpb25zID0gIiwgbV9udW1JdGVyYXRpb25z
LCAiXG4iKTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgdGVtcGxhdGU8QXJnOjpUeXBlIHR5cGU+
Ci0gICAgdm9pZCBpdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZ09uVHlwZSgpCi0gICAgewotICAg
ICAgICBIYXNoU2V0PHVuc2lnbmVkPiB1bnNwaWxsYWJsZVRtcHMgPSBjb21wdXRlVW5zcGlsbGFi
bGVUbXBzPHR5cGU+KCk7Ci0KLSAgICAgICAgLy8gRklYTUU6IElmIGEgVG1wIGlzIHVzZWQgb25s
eSBmcm9tIGEgU2NyYXRjaCByb2xlIGFuZCB0aGF0IGFyZ3VtZW50IGlzICFhZG1pdHNTdGFjaywg
dGhlbgotICAgICAgICAvLyB3ZSBzaG91bGQgYWRkIHRoZSBUbXAgdG8gdW5zcGlsbGFibGVUbXBz
LiBUaGF0IHdpbGwgaGVscCBhdm9pZCByZWxvb3Bpbmcgb25seSB0byB0dXJuIHRoZQotICAgICAg
ICAvLyBUbXAgaW50byBhbiB1bnNwaWxsYWJsZSBUbXAuCi0gICAgICAgIC8vIGh0dHBzOi8vYnVn
cy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTI2OTkKLSAgICAgICAgCi0gICAgICAgIHdo
aWxlICh0cnVlKSB7Ci0gICAgICAgICAgICArK21fbnVtSXRlcmF0aW9uczsKLQotICAgICAgICAg
ICAgaWYgKHRyYWNlRGVidWcpCi0gICAgICAgICAgICAgICAgZGF0YUxvZygiQ29kZSBhdCBpdGVy
YXRpb24gIiwgbV9udW1JdGVyYXRpb25zLCAiOlxuIiwgbV9jb2RlKTsKLQotICAgICAgICAgICAg
Ly8gRklYTUU6IE9uZSB3YXkgdG8gb3B0aW1pemUgdGhpcyBjb2RlIGlzIHRvIHJlbW92ZSB0aGUg
cmVjb21wdXRhdGlvbiBpbnNpZGUgdGhlIGZpeHBvaW50LgotICAgICAgICAgICAgLy8gV2UgbmVl
ZCB0byByZWNvbXB1dGUgYmVjYXVzZSBzcGlsbGluZyBhZGRzIHRtcHMsIGJ1dCB3ZSBjb3VsZCBq
dXN0IHVwZGF0ZSB0bXBXaWR0aCB3aGVuIHdlCi0gICAgICAgICAgICAvLyBhZGQgdGhvc2UgdG1w
cy4gTm90ZSB0aGF0IG9uZSBlYXN5IHdheSB0byByZW1vdmUgdGhlIHJlY29tcHV0YXRpb24gaXMg
dG8gbWFrZSBhbnkgbmV3bHkKLSAgICAgICAgICAgIC8vIGFkZGVkIFRtcHMgZ2V0IHRoZSBzYW1l
IHVzZS9kZWYgd2lkdGhzIHRoYXQgdGhlIG9yaWdpbmFsIFRtcCBnb3QuIEJ1dCwgdGhpcyBtYXkg
aHVydCB0aGUKLSAgICAgICAgICAgIC8vIHNwaWxsIGNvZGUgd2UgZW1pdC4gU2luY2Ugd2UgY3Vy
cmVudGx5IHJlY29tcHV0ZSBUbXBXaWR0aCBhZnRlciBzcGlsbGluZywgdGhlIG5ld2x5Ci0gICAg
ICAgICAgICAvLyBjcmVhdGVkIFRtcHMgbWF5IGdldCBuYXJyb3dlciB1c2UvZGVmIHdpZHRocy4g
T24gdGhlIG90aGVyIGhhbmQsIHRoZSBzcGlsbGVyIGFscmVhZHkKLSAgICAgICAgICAgIC8vIHNl
bGVjdHMgd2hpY2ggbW92ZSBpbnN0cnVjdGlvbiB0byB1c2UgYmFzZWQgb24gdGhlIG9yaWdpbmFs
IFRtcCdzIHdpZHRocywgc28gaXQgbWF5IG5vdAotICAgICAgICAgICAgLy8gbWF0dGVyIHRoYW4g
YSBzdWJzZXF1ZW50IGl0ZXJhdGlvbiBzZWVzIGEgY29zZXJ2YXRpdmUgd2lkdGggZm9yIHRoZSBu
ZXcgVG1wcy4gQWxzbywgdGhlCi0gICAgICAgICAgICAvLyByZWNvbXB1dGF0aW9uIG1heSBub3Qg
YWN0dWFsbHkgYmUgYSBwZXJmb3JtYW5jZSBwcm9ibGVtOyBpdCdzIGxpa2VseSB0aGF0IGEgYmV0
dGVyIHdheSB0bwotICAgICAgICAgICAgLy8gaW1wcm92ZSBwZXJmb3JtYW5jZSBvZiBUbXBXaWR0
aCBpcyB0byByZXBsYWNlIGl0cyBIYXNoTWFwIHdpdGggc29tZXRoaW5nIGVsc2UuIEl0J3MKLSAg
ICAgICAgICAgIC8vIHBvc3NpYmxlIHRoYXQgbW9zdCBvZiB0aGUgVG1wV2lkdGggb3ZlcmhlYWQg
aXMgZnJvbSBxdWVyaWVzIG9mIFRtcFdpZHRoIHJhdGhlciB0aGFuIHRoZQotICAgICAgICAgICAg
Ly8gcmVjb21wdXRhdGlvbiwgaW4gd2hpY2ggY2FzZSBzcGVlZGluZyB1cCB0aGUgbG9va3VwIHdv
dWxkIGJlIGEgYmlnZ2VyIHdpbi4KLSAgICAgICAgICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQu
b3JnL3Nob3dfYnVnLmNnaT9pZD0xNTI0NzgKLSAgICAgICAgICAgIG1fdG1wV2lkdGgucmVjb21w
dXRlKG1fY29kZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIENvbG9yaW5nQWxsb2NhdG9y
PHR5cGU+IGFsbG9jYXRvcihtX2NvZGUsIG1fdG1wV2lkdGgsIG1fdXNlQ291bnRzLCB1bnNwaWxs
YWJsZVRtcHMpOwotICAgICAgICAgICAgaWYgKCFhbGxvY2F0b3IucmVxdWlyZXNTcGlsbGluZygp
KSB7Ci0gICAgICAgICAgICAgICAgYXNzaWduUmVnaXN0ZXJzVG9UbXAoYWxsb2NhdG9yKTsKLSAg
ICAgICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKLSAgICAgICAgICAgICAgICAgICAgZGF0YUxv
ZygiU3VjY2Vzc2Z1bGwgYWxsb2NhdGlvbiBhdCBpdGVyYXRpb24gIiwgbV9udW1JdGVyYXRpb25z
LCAiOlxuIiwgbV9jb2RlKTsKLQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAg
IH0KLSAgICAgICAgICAgIGFkZFNwaWxsQW5kRmlsbDx0eXBlPihhbGxvY2F0b3IsIHVuc3BpbGxh
YmxlVG1wcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZTxBcmc6OlR5cGUgdHlw
ZT4KLSAgICBIYXNoU2V0PHVuc2lnbmVkPiBjb21wdXRlVW5zcGlsbGFibGVUbXBzKCkKLSAgICB7
Ci0gICAgICAgIEhhc2hTZXQ8dW5zaWduZWQ+IHVuc3BpbGxhYmxlVG1wczsKLQotICAgICAgICBz
dHJ1Y3QgUmFuZ2UgewotICAgICAgICAgICAgdW5zaWduZWQgZmlyc3QgeyBzdGQ6Om51bWVyaWNf
bGltaXRzPHVuc2lnbmVkPjo6bWF4KCkgfTsKLSAgICAgICAgICAgIHVuc2lnbmVkIGxhc3QgeyAw
IH07Ci0gICAgICAgICAgICB1bnNpZ25lZCBjb3VudCB7IDAgfTsKLSAgICAgICAgICAgIHVuc2ln
bmVkIGFkbWl0U3RhY2tDb3VudCB7IDAgfTsKLSAgICAgICAgfTsKLQotICAgICAgICB1bnNpZ25l
ZCBudW1UbXBzID0gbV9jb2RlLm51bVRtcHModHlwZSk7Ci0gICAgICAgIHVuc2lnbmVkIGFycmF5
U2l6ZSA9IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KG51bVRtcHMpOwot
Ci0gICAgICAgIFZlY3RvcjxSYW5nZSwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IHJhbmdlczsK
LSAgICAgICAgcmFuZ2VzLmZpbGwoUmFuZ2UoKSwgYXJyYXlTaXplKTsKLQotICAgICAgICB1bnNp
Z25lZCBnbG9iYWxJbmRleCA9IDA7Ci0gICAgICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBt
X2NvZGUpIHsKLSAgICAgICAgICAgIGZvciAoSW5zdCYgaW5zdCA6ICpibG9jaykgewotICAgICAg
ICAgICAgICAgIGluc3QuZm9yRWFjaEFyZyhbJl0gKEFyZyYgYXJnLCBBcmc6OlJvbGUsIEFyZzo6
VHlwZSBhcmdUeXBlLCBBcmc6OldpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhcmcu
aXNUbXAoKSAmJiBpbnN0LmFkbWl0c1N0YWNrKGFyZykpIHsKLSAgICAgICAgICAgICAgICAgICAg
ICAgIGlmIChhcmdUeXBlICE9IHR5cGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0
dXJuOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBUbXAgdG1wID0gYXJnLnRtcCgpOwotICAg
ICAgICAgICAgICAgICAgICAgICAgUmFuZ2UmIHJhbmdlID0gcmFuZ2VzW0Fic29sdXRlVG1wTWFw
cGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHRtcCldOwotICAgICAgICAgICAgICAgICAgICAgICAg
cmFuZ2UuY291bnQrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmFkbWl0U3RhY2tD
b3VudCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdsb2JhbEluZGV4IDwgcmFuZ2Uu
Zmlyc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZS5maXJzdCA9IGdsb2Jh
bEluZGV4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmxhc3QgPSBnbG9iYWxJ
bmRleDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHJhbmdlLmxhc3QgPSBnbG9iYWxJbmRleDsKLQotICAgICAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAg
ICAgYXJnLmZvckVhY2hUbXBGYXN0KFsmXSAoVG1wJiB0bXApIHsKLSAgICAgICAgICAgICAgICAg
ICAgICAgIGlmICh0bXAuaXNHUCgpICE9ICh0eXBlID09IEFyZzo6R1ApKQotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgUmFuZ2Um
IHJhbmdlID0gcmFuZ2VzW0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHRt
cCldOwotICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuY291bnQrKzsKLSAgICAgICAgICAg
ICAgICAgICAgICAgIGlmIChnbG9iYWxJbmRleCA8IHJhbmdlLmZpcnN0KSB7Ci0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgcmFuZ2UuZmlyc3QgPSBnbG9iYWxJbmRleDsKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICByYW5nZS5sYXN0ID0gZ2xvYmFsSW5kZXg7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZS5sYXN0
ID0gZ2xvYmFsSW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAg
IH0pOwotCi0gICAgICAgICAgICAgICAgKytnbG9iYWxJbmRleDsKLSAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgICsrZ2xvYmFsSW5kZXg7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yICh1bnNpZ25l
ZCBpID0gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46Omxhc3RNYWNoaW5lUmVnaXN0ZXJJbmRleCgp
ICsgMTsgaSA8IHJhbmdlcy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgUmFuZ2UmIHJhbmdl
ID0gcmFuZ2VzW2ldOwotICAgICAgICAgICAgaWYgKHJhbmdlLmxhc3QgLSByYW5nZS5maXJzdCA8
PSAxICYmIHJhbmdlLmNvdW50ID4gcmFuZ2UuYWRtaXRTdGFja0NvdW50KQotICAgICAgICAgICAg
ICAgIHVuc3BpbGxhYmxlVG1wcy5hZGQoaSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4g
dW5zcGlsbGFibGVUbXBzOwotICAgIH0KLQotICAgIHRlbXBsYXRlPEFyZzo6VHlwZSB0eXBlPgot
ICAgIHZvaWQgYXNzaWduUmVnaXN0ZXJzVG9UbXAoY29uc3QgQ29sb3JpbmdBbGxvY2F0b3I8dHlw
ZT4mIGFsbG9jYXRvcikKLSAgICB7Ci0gICAgICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBt
X2NvZGUpIHsKLSAgICAgICAgICAgIC8vIEdpdmUgVG1wIGEgdmFsaWQgcmVnaXN0ZXIuCi0gICAg
ICAgICAgICBmb3IgKHVuc2lnbmVkIGluc3RJbmRleCA9IDA7IGluc3RJbmRleCA8IGJsb2NrLT5z
aXplKCk7ICsraW5zdEluZGV4KSB7Ci0gICAgICAgICAgICAgICAgSW5zdCYgaW5zdCA9IGJsb2Nr
LT5hdChpbnN0SW5kZXgpOwotCi0gICAgICAgICAgICAgICAgLy8gVGhlIG1heUJlQ29hbGVzY2Fi
bGUoKSBtZXRob2Qgd2lsbCBjaGFuZ2UgaXRzIG1pbmQgZm9yIHNvbWUgb3BlcmF0aW9ucyBhZnRl
ciB3ZQotICAgICAgICAgICAgICAgIC8vIGNvbXBsZXRlIHJlZ2lzdGVyIGFsbG9jYXRpb24uIFNv
LCB3ZSByZWNvcmQgdGhpcyBiZWZvcmUgc3RhcnRpbmcuCi0gICAgICAgICAgICAgICAgYm9vbCBt
YXlCZUNvYWxlc2NhYmxlID0gYWxsb2NhdG9yLm1heUJlQ29hbGVzY2FibGUoaW5zdCk7Ci0KLSAg
ICAgICAgICAgICAgICAvLyBNb3ZlMzIgaXMgY2hlYXBlciBpZiB3ZSBrbm93IHRoYXQgaXQncyBl
cXVpdmFsZW50IHRvIGEgTW92ZS4gSXQncwotICAgICAgICAgICAgICAgIC8vIGVxdWl2YWxlbnQg
aWYgdGhlIGRlc3RpbmF0aW9uJ3MgaGlnaCBiaXRzIGFyZSBub3Qgb2JzZXJ2YWJsZSBvciBpZiB0
aGUgc291cmNlJ3MgaGlnaAotICAgICAgICAgICAgICAgIC8vIGJpdHMgYXJlIGFsbCB6ZXJvLiBO
b3RlIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0aGUgb3Bwb3NpdGUgb3B0aW1pemF0aW9uIGZvciBvdGhl
cgotICAgICAgICAgICAgICAgIC8vIGFyY2hpdGVjdHVyZXMsIHdoaWNoIG1heSBwcmVmZXIgTW92
ZSBvdmVyIE1vdmUzMiwgYmVjYXVzZSBNb3ZlIGlzIGNhbm9uaWNhbCBhbHJlYWR5LgotICAgICAg
ICAgICAgICAgIGlmICh0eXBlID09IEFyZzo6R1AgJiYgaW5zdC5raW5kLm9wY29kZSA9PSBNb3Zl
Ci0gICAgICAgICAgICAgICAgICAgICYmIGluc3QuYXJnc1swXS5pc1RtcCgpICYmIGluc3QuYXJn
c1sxXS5pc1RtcCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtX3RtcFdpZHRoLnVzZVdp
ZHRoKGluc3QuYXJnc1sxXS50bXAoKSkgPD0gQXJnOjpXaWR0aDMyCi0gICAgICAgICAgICAgICAg
ICAgICAgICB8fCBtX3RtcFdpZHRoLmRlZldpZHRoKGluc3QuYXJnc1swXS50bXAoKSkgPD0gQXJn
OjpXaWR0aDMyKQotICAgICAgICAgICAgICAgICAgICAgICAgaW5zdC5raW5kLm9wY29kZSA9IE1v
dmUzMjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpbnN0LmZvckVhY2hU
bXBGYXN0KFsmXSAoVG1wJiB0bXApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRtcC5pc1Jl
ZygpIHx8IHRtcC5pc0dQKCkgPT0gKHR5cGUgIT0gQXJnOjpHUCkpCi0gICAgICAgICAgICAgICAg
ICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgICAgICAgICAgVG1wIGFsaWFzVG1wID0gYWxs
b2NhdG9yLmdldEFsaWFzKHRtcCk7Ci0gICAgICAgICAgICAgICAgICAgIFRtcCBhc3NpZ25lZFRt
cDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFsaWFzVG1wLmlzUmVnKCkpCi0gICAgICAgICAg
ICAgICAgICAgICAgICBhc3NpZ25lZFRtcCA9IFRtcChhbGlhc1RtcC5yZWcoKSk7Ci0gICAgICAg
ICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgYXV0byByZWcgPSBh
bGxvY2F0b3IuYWxsb2NhdGVkUmVnKGFsaWFzVG1wKTsKLSAgICAgICAgICAgICAgICAgICAgICAg
IEFTU0VSVChyZWcpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXNzaWduZWRUbXAgPSBUbXAo
cmVnKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBBU1NFUlQo
YXNzaWduZWRUbXAuaXNSZWcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRtcCA9IGFzc2lnbmVk
VG1wOwotICAgICAgICAgICAgICAgIH0pOwotCi0gICAgICAgICAgICAgICAgaWYgKG1heUJlQ29h
bGVzY2FibGUgJiYgaW5zdC5hcmdzWzBdLmlzVG1wKCkgJiYgaW5zdC5hcmdzWzFdLmlzVG1wKCkK
LSAgICAgICAgICAgICAgICAgICAgJiYgaW5zdC5hcmdzWzBdLnRtcCgpID09IGluc3QuYXJnc1sx
XS50bXAoKSkKLSAgICAgICAgICAgICAgICAgICAgaW5zdCA9IEluc3QoKTsKLSAgICAgICAgICAg
IH0KLQotICAgICAgICAgICAgLy8gUmVtb3ZlIGFsbCB0aGUgdXNlbGVzcyBtb3ZlcyB3ZSBjcmVh
dGVkIGluIHRoaXMgYmxvY2suCi0gICAgICAgICAgICBibG9jay0+aW5zdHMoKS5yZW1vdmVBbGxN
YXRjaGluZyhbJl0gKGNvbnN0IEluc3QmIGluc3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4g
IWluc3Q7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyB1
bnNpZ25lZCBzdGFja1Nsb3RNaW5pbXVtV2lkdGgoQXJnOjpXaWR0aCB3aWR0aCkKLSAgICB7Ci0g
ICAgICAgIHJldHVybiB3aWR0aCA8PSBBcmc6OldpZHRoMzIgPyA0IDogODsKLSAgICB9Ci0KLSAg
ICB0ZW1wbGF0ZTxBcmc6OlR5cGUgdHlwZT4KLSAgICB2b2lkIGFkZFNwaWxsQW5kRmlsbChjb25z
dCBDb2xvcmluZ0FsbG9jYXRvcjx0eXBlPiYgYWxsb2NhdG9yLCBIYXNoU2V0PHVuc2lnbmVkPiYg
dW5zcGlsbGFibGVUbXBzKQotICAgIHsKLSAgICAgICAgSGFzaE1hcDxUbXAsIFN0YWNrU2xvdCo+
IHN0YWNrU2xvdHM7Ci0gICAgICAgIGZvciAoVG1wIHRtcCA6IGFsbG9jYXRvci5zcGlsbGVkVG1w
cygpKSB7Ci0gICAgICAgICAgICAvLyBBbGwgdGhlIHNwaWxsZWQgdmFsdWVzIGJlY29tZSB1bnNw
aWxsYWJsZS4KLSAgICAgICAgICAgIHVuc3BpbGxhYmxlVG1wcy5hZGQoQWJzb2x1dGVUbXBNYXBw
ZXI8dHlwZT46OmFic29sdXRlSW5kZXgodG1wKSk7Ci0KLSAgICAgICAgICAgIC8vIEFsbG9jYXRl
IHN0YWNrIHNsb3QgZm9yIGVhY2ggc3BpbGxlZCB2YWx1ZS4KLSAgICAgICAgICAgIFN0YWNrU2xv
dCogc3RhY2tTbG90ID0gbV9jb2RlLmFkZFN0YWNrU2xvdCgKLSAgICAgICAgICAgICAgICBzdGFj
a1Nsb3RNaW5pbXVtV2lkdGgobV90bXBXaWR0aC5yZXF1aXJlZFdpZHRoKHRtcCkpLCBTdGFja1Ns
b3RLaW5kOjpTcGlsbCk7Ci0gICAgICAgICAgICBib29sIGlzTmV3VG1wID0gc3RhY2tTbG90cy5h
ZGQodG1wLCBzdGFja1Nsb3QpLmlzTmV3RW50cnk7Ci0gICAgICAgICAgICBBU1NFUlRfVU5VU0VE
KGlzTmV3VG1wLCBpc05ld1RtcCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZXdyaXRlIHRo
ZSBwcm9ncmFtIHRvIGdldCByaWQgb2YgdGhlIHNwaWxsZWQgVG1wLgotICAgICAgICBJbnNlcnRp
b25TZXQgaW5zZXJ0aW9uU2V0KG1fY29kZSk7Ci0gICAgICAgIGZvciAoQmFzaWNCbG9jayogYmxv
Y2sgOiBtX2NvZGUpIHsKLSAgICAgICAgICAgIGJvb2wgaGFzQWxpYXNlZFRtcHMgPSBmYWxzZTsK
LQotICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnN0SW5kZXggPSAwOyBpbnN0SW5kZXggPCBi
bG9jay0+c2l6ZSgpOyArK2luc3RJbmRleCkgewotICAgICAgICAgICAgICAgIEluc3QmIGluc3Qg
PSBibG9jay0+YXQoaW5zdEluZGV4KTsKLQotICAgICAgICAgICAgICAgIC8vIFRoZSBUbXBXaWR0
aCBhbmFseXNpcyB3aWxsIHNheSB0aGF0IGEgTW92ZSBvbmx5IHN0b3JlcyAzMiBiaXRzIGludG8g
dGhlIGRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBzb3VyY2Ugb25seSBo
YWQgMzIgYml0cyB3b3J0aCBvZiBub24temVybyBiaXRzLiBTYW1lIGZvciB0aGUgc291cmNlOiBp
dCB3aWxsCi0gICAgICAgICAgICAgICAgLy8gb25seSBjbGFpbSB0byByZWFkIDMyIGJpdHMgZnJv
bSB0aGUgc291cmNlIGlmIG9ubHkgMzIgYml0cyBvZiB0aGUgZGVzdGluYXRpb24gYXJlCi0gICAg
ICAgICAgICAgICAgLy8gcmVhZC4gTm90ZSB0aGF0IHdlIG9ubHkgYXBwbHkgdGhpcyBsb2dpYyBp
ZiB0aGlzIHR1cm5zIGludG8gYSBsb2FkIG9yIHN0b3JlLCBzaW5jZQotICAgICAgICAgICAgICAg
IC8vIE1vdmUgaXMgdGhlIGNhbm9uaWNhbCB3YXkgdG8gbW92ZSBkYXRhIGJldHdlZW4gR1BScy4K
LSAgICAgICAgICAgICAgICBib29sIGNhblVzZU1vdmUzMklmRGlkU3BpbGwgPSBmYWxzZTsKLSAg
ICAgICAgICAgICAgICBib29sIGRpZFNwaWxsID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaWYg
KHR5cGUgPT0gQXJnOjpHUCAmJiBpbnN0LmtpbmQub3Bjb2RlID09IE1vdmUpIHsKLSAgICAgICAg
ICAgICAgICAgICAgaWYgKChpbnN0LmFyZ3NbMF0uaXNUbXAoKSAmJiBtX3RtcFdpZHRoLndpZHRo
KGluc3QuYXJnc1swXS50bXAoKSkgPD0gQXJnOjpXaWR0aDMyKQotICAgICAgICAgICAgICAgICAg
ICAgICAgfHwgKGluc3QuYXJnc1sxXS5pc1RtcCgpICYmIG1fdG1wV2lkdGgud2lkdGgoaW5zdC5h
cmdzWzFdLnRtcCgpKSA8PSBBcmc6OldpZHRoMzIpKQotICAgICAgICAgICAgICAgICAgICAgICAg
Y2FuVXNlTW92ZTMySWZEaWRTcGlsbCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAg
ICAgICAgICAgICAgLy8gVHJ5IHRvIHJlcGxhY2UgdGhlIHJlZ2lzdGVyIHVzZSBieSBtZW1vcnkg
dXNlIHdoZW4gcG9zc2libGUuCi0gICAgICAgICAgICAgICAgaW5zdC5mb3JFYWNoQXJnKAotICAg
ICAgICAgICAgICAgICAgICBbJl0gKEFyZyYgYXJnLCBBcmc6OlJvbGUgcm9sZSwgQXJnOjpUeXBl
IGFyZ1R5cGUsIEFyZzo6V2lkdGggd2lkdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlm
ICghYXJnLmlzVG1wKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAg
ICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ1R5cGUgIT0gdHlwZSkKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnLmlz
UmVnKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAg
ICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBhdXRvIHN0YWNrU2xvdEVudHJ5
ID0gc3RhY2tTbG90cy5maW5kKGFyZy50bXAoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBp
ZiAoc3RhY2tTbG90RW50cnkgPT0gc3RhY2tTbG90cy5lbmQoKSkKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWluc3QuYWRt
aXRzU3RhY2soYXJnKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAg
ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBU
bXAgaG9sZHMgYSBjb25zdGFudCB0aGVuIHdlIHdhbnQgdG8gcmVtYXRlcmlhbGl6ZSBpdHMKLSAg
ICAgICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlIHJhdGhlciB0aGFuIGxvYWRpbmcgaXQgZnJv
bSB0aGUgc3RhY2suIEluIG9yZGVyIGZvciB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAv
LyBvcHRpbWl6YXRpb24gdG8ga2ljayBpbiwgd2UgbmVlZCB0byBhdm9pZCBwbGFjaW5nIHRoZSBU
bXAncyBzdGFjawotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkcmVzcyBpbnRvIHRoZSBp
bnN0cnVjdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQXJnOjppc0NvbGRVc2Uo
cm9sZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVc2VDb3VudHM8VG1w
Pjo6Q291bnRzKiBjb3VudHMgPSBtX3VzZUNvdW50c1thcmcudG1wKCldOwotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGlmIChjb3VudHMgJiYgY291bnRzLT5udW1Db25zdERlZnMgPT0gMSAm
JiBjb3VudHMtPm51bURlZnMgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
cmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAg
ICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBBcmc6OldpZHRoIHNwaWxsV2lkdGggPSBtX3Rt
cFdpZHRoLnJlcXVpcmVkV2lkdGgoYXJnLnRtcCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAg
IGlmIChBcmc6OmlzQW55RGVmKHJvbGUpICYmIHdpZHRoIDwgc3BpbGxXaWR0aCkKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICBBU1NF
UlQoaW5zdC5raW5kLm9wY29kZSA9PSBNb3ZlIHx8ICEoQXJnOjppc0FueVVzZShyb2xlKSAmJiB3
aWR0aCA+IHNwaWxsV2lkdGgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAg
ICAgICAgICAgICAgICAgaWYgKHNwaWxsV2lkdGggIT0gQXJnOjpXaWR0aDMyKQotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGNhblVzZU1vdmUzMklmRGlkU3BpbGwgPSBmYWxzZTsKLSAgICAg
ICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tTbG90RW50
cnktPnZhbHVlLT5lbnN1cmVTaXplKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhblVz
ZU1vdmUzMklmRGlkU3BpbGwgPyA0IDogQXJnOjpieXRlcyh3aWR0aCkpOwotICAgICAgICAgICAg
ICAgICAgICAgICAgYXJnID0gQXJnOjpzdGFjayhzdGFja1Nsb3RFbnRyeS0+dmFsdWUpOwotICAg
ICAgICAgICAgICAgICAgICAgICAgZGlkU3BpbGwgPSB0cnVlOwotICAgICAgICAgICAgICAgICAg
ICB9KTsKLQotICAgICAgICAgICAgICAgIGlmIChkaWRTcGlsbCAmJiBjYW5Vc2VNb3ZlMzJJZkRp
ZFNwaWxsKQotICAgICAgICAgICAgICAgICAgICBpbnN0LmtpbmQub3Bjb2RlID0gTW92ZTMyOwot
Ci0gICAgICAgICAgICAgICAgLy8gRm9yIGV2ZXJ5IG90aGVyIGNhc2UsIGFkZCBMb2FkL1N0b3Jl
IGFzIG5lZWRlZC4KLSAgICAgICAgICAgICAgICBpbnN0LmZvckVhY2hUbXAoWyZdIChUbXAmIHRt
cCwgQXJnOjpSb2xlIHJvbGUsIEFyZzo6VHlwZSBhcmdUeXBlLCBBcmc6OldpZHRoKSB7Ci0gICAg
ICAgICAgICAgICAgICAgIGlmICh0bXAuaXNSZWcoKSB8fCBhcmdUeXBlICE9IHR5cGUpCi0gICAg
ICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgICAgICAgICAgYXV0byBz
dGFja1Nsb3RFbnRyeSA9IHN0YWNrU2xvdHMuZmluZCh0bXApOwotICAgICAgICAgICAgICAgICAg
ICBpZiAoc3RhY2tTbG90RW50cnkgPT0gc3RhY2tTbG90cy5lbmQoKSkgewotICAgICAgICAgICAg
ICAgICAgICAgICAgVG1wIGFsaWFzID0gYWxsb2NhdG9yLmdldEFsaWFzV2hlblNwaWxsaW5nKHRt
cCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxpYXMgIT0gdG1wKSB7Ci0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgdG1wID0gYWxpYXM7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgaGFzQWxpYXNlZFRtcHMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0K
LSAgICAgICAgICAgICAgICAgICAgQXJnOjpXaWR0aCBzcGlsbFdpZHRoID0gbV90bXBXaWR0aC5y
ZXF1aXJlZFdpZHRoKHRtcCk7Ci0gICAgICAgICAgICAgICAgICAgIE9wY29kZSBtb3ZlID0gT29w
czsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdGFja1Nsb3RNaW5pbXVtV2lkdGgoc3Bp
bGxXaWR0aCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAg
ICAgICAgICAgbW92ZSA9IHR5cGUgPT0gQXJnOjpHUCA/IE1vdmUzMiA6IE1vdmVGbG9hdDsKLSAg
ICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDg6
Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb3ZlID0gdHlwZSA9PSBBcmc6OkdQID8gTW92ZSA6
IE1vdmVEb3VibGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAg
ICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJU
X05PVF9SRUFDSEVEKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAg
ICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHRtcCA9IG1fY29kZS5uZXdUbXAo
dHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIHVuc3BpbGxhYmxlVG1wcy5hZGQoQWJzb2x1dGVU
bXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodG1wKSk7Ci0KLSAgICAgICAgICAgICAgICAg
ICAgQXJnIGFyZyA9IEFyZzo6c3RhY2soc3RhY2tTbG90RW50cnktPnZhbHVlKTsKLSAgICAgICAg
ICAgICAgICAgICAgaWYgKEFyZzo6aXNBbnlVc2Uocm9sZSkgJiYgcm9sZSAhPSBBcmc6OlNjcmF0
Y2gpCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRpb25TZXQuaW5zZXJ0KGluc3RJbmRl
eCwgbW92ZSwgaW5zdC5vcmlnaW4sIGFyZywgdG1wKTsKLSAgICAgICAgICAgICAgICAgICAgaWYg
KEFyZzo6aXNBbnlEZWYocm9sZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRpb25T
ZXQuaW5zZXJ0KGluc3RJbmRleCArIDEsIG1vdmUsIGluc3Qub3JpZ2luLCB0bXAsIGFyZyk7Ci0g
ICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnNlcnRpb25T
ZXQuZXhlY3V0ZShibG9jayk7Ci0KLSAgICAgICAgICAgIGlmIChoYXNBbGlhc2VkVG1wcykgewot
ICAgICAgICAgICAgICAgIGJsb2NrLT5pbnN0cygpLnJlbW92ZUFsbE1hdGNoaW5nKFsmXSAoY29u
c3QgSW5zdCYgaW5zdCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWxsb2NhdG9yLmlz
VXNlbGVzc01vdmUoaW5zdCk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICB9Ci0g
ICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGZpeFNwaWxsc0FmdGVyVGVybWluYWxzKCkKLSAg
ICB7Ci0gICAgICAgIC8vIEJlY2F1c2UgdGhlcmUgbWF5IGJlIHRlcm1pbmFscyB0aGF0IHByb2R1
Y2UgdmFsdWVzLCBJUkMgbWF5Ci0gICAgICAgIC8vIHdhbnQgdG8gc3BpbGwgdGhvc2UgdGVybWlu
YWxzLiBJdCdsbCBoYXBwZW4gdG8gc3BpbGwgaXQgYWZ0ZXIKLSAgICAgICAgLy8gdGhlIHRlcm1p
bmFsLiBJZiB3ZSBsZWZ0IHRoZSBncmFwaCBpbiB0aGlzIHN0YXRlLCBpdCdkIGJlIGludmFsaWQK
LSAgICAgICAgLy8gYmVjYXVzZSBhIHRlcm1pbmFsIG11c3QgYmUgdGhlIGxhc3QgaW5zdHJ1Y3Rp
b24gaW4gYSBibG9jay4KLSAgICAgICAgLy8gV2UgZml4IHRoYXQgaGVyZS4KLQotICAgICAgICBJ
bnNlcnRpb25TZXQgaW5zZXJ0aW9uU2V0KG1fY29kZSk7Ci0KLSAgICAgICAgYm9vbCBhZGRlZEJs
b2NrcyA9IGZhbHNlOwotCi0gICAgICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBtX2NvZGUp
IHsKLSAgICAgICAgICAgIHVuc2lnbmVkIHRlcm1pbmFsSW5kZXggPSBibG9jay0+c2l6ZSgpOwot
ICAgICAgICAgICAgYm9vbCBmb3VuZFRlcm1pbmFsID0gZmFsc2U7Ci0gICAgICAgICAgICB3aGls
ZSAodGVybWluYWxJbmRleC0tKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJsb2NrLT5hdCh0ZXJt
aW5hbEluZGV4KS5pc1Rlcm1pbmFsKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZm91bmRUZXJt
aW5hbCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFTU0VSVF9VTlVTRUQoZm91bmRUZXJtaW5h
bCwgZm91bmRUZXJtaW5hbCk7Ci0KLSAgICAgICAgICAgIGlmICh0ZXJtaW5hbEluZGV4ID09IGJs
b2NrLT5zaXplKCkgLSAxKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAg
ICAvLyBUaGVyZSBtdXN0IGJlIGluc3RydWN0aW9ucyBhZnRlciB0aGUgdGVybWluYWwgYmVjYXVz
ZSBpdCdzIG5vdCB0aGUgbGFzdCBpbnN0cnVjdGlvbi4KLSAgICAgICAgICAgIEFTU0VSVCh0ZXJt
aW5hbEluZGV4IDwgYmxvY2stPnNpemUoKSAtIDEpOwotICAgICAgICAgICAgVmVjdG9yPEluc3Qs
IDE+IGluc3RzVG9Nb3ZlOwotICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gdGVybWluYWxJ
bmRleCArIDE7IGkgPCBibG9jay0+c2l6ZSgpOyBpKyspCi0gICAgICAgICAgICAgICAgaW5zdHNU
b01vdmUuYXBwZW5kKGJsb2NrLT5hdChpKSk7Ci0gICAgICAgICAgICBSRUxFQVNFX0FTU0VSVChp
bnN0c1RvTW92ZS5zaXplKCkpOwotCi0gICAgICAgICAgICBmb3IgKEZyZXF1ZW50ZWRCbG9jayYg
ZnJlcXVlbnRlZFN1Y2Nlc3NvciA6IGJsb2NrLT5zdWNjZXNzb3JzKCkpIHsKLSAgICAgICAgICAg
ICAgICBCYXNpY0Jsb2NrKiBzdWNjZXNzb3IgPSBmcmVxdWVudGVkU3VjY2Vzc29yLmJsb2NrKCk7
Ci0gICAgICAgICAgICAgICAgLy8gSWYgc3VjY2Vzc29yJ3Mgb25seSBwcmVkZWNlc3NvciBpcyBi
bG9jaywgd2UgY2FuIHBsYW50IHRoZSBzcGlsbCBpbnNpZGUKLSAgICAgICAgICAgICAgICAvLyB0
aGUgc3VjY2Vzc29yLiBPdGhlcndpc2UsIHdlIG11c3Qgc3BsaXQgdGhlIGNyaXRpY2FsIGVkZ2Ug
YW5kIGNyZWF0ZQotICAgICAgICAgICAgICAgIC8vIGEgbmV3IGJsb2NrIGZvciB0aGUgc3BpbGwu
Ci0gICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3Nvci0+bnVtUHJlZGVjZXNzb3JzKCkgPT0gMSkg
ewotICAgICAgICAgICAgICAgICAgICBpbnNlcnRpb25TZXQuaW5zZXJ0SW5zdHMoMCwgaW5zdHNU
b01vdmUpOwotICAgICAgICAgICAgICAgICAgICBpbnNlcnRpb25TZXQuZXhlY3V0ZShzdWNjZXNz
b3IpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZGVk
QmxvY2tzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IFdlIHByb2JhYmx5
IHdhbnQgYmV0dGVyIGJsb2NrIG9yZGVyaW5nIGhlcmUuCi0gICAgICAgICAgICAgICAgICAgIEJh
c2ljQmxvY2sqIG5ld0Jsb2NrID0gbV9jb2RlLmFkZEJsb2NrKCk7Ci0gICAgICAgICAgICAgICAg
ICAgIGZvciAoY29uc3QgSW5zdCYgaW5zdCA6IGluc3RzVG9Nb3ZlKQotICAgICAgICAgICAgICAg
ICAgICAgICAgbmV3QmxvY2stPmFwcGVuZEluc3QoaW5zdCk7Ci0gICAgICAgICAgICAgICAgICAg
IG5ld0Jsb2NrLT5hcHBlbmRJbnN0KEluc3QoSnVtcCwgaW5zdHNUb01vdmUubGFzdCgpLm9yaWdp
bikpOwotICAgICAgICAgICAgICAgICAgICBuZXdCbG9jay0+c3VjY2Vzc29ycygpLmFwcGVuZChz
dWNjZXNzb3IpOwotICAgICAgICAgICAgICAgICAgICBmcmVxdWVudGVkU3VjY2Vzc29yLmJsb2Nr
KCkgPSBuZXdCbG9jazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAg
ICAgICAgIGJsb2NrLT5yZXNpemUodGVybWluYWxJbmRleCArIDEpOwotICAgICAgICB9Ci0KLSAg
ICAgICAgaWYgKGFkZGVkQmxvY2tzKQotICAgICAgICAgICAgbV9jb2RlLnJlc2V0UmVhY2hhYmls
aXR5KCk7Ci0gICAgfQotCi0gICAgQ29kZSYgbV9jb2RlOwotICAgIFRtcFdpZHRoIG1fdG1wV2lk
dGg7Ci0gICAgVXNlQ291bnRzPFRtcD4gbV91c2VDb3VudHM7Ci0gICAgdW5zaWduZWQgbV9udW1J
dGVyYXRpb25zIHsgMCB9OwotfTsKLQotfSAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCi0KLXZvaWQg
aXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcoQ29kZSYgY29kZSkKLXsKLSAgICBQaGFzZVNjb3Bl
IHBoYXNlU2NvcGUoY29kZSwgIml0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nIik7Ci0gICAgCi0g
ICAgSXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcgaXRlcmF0ZWRSZWdpc3RlckNvYWxlc2Npbmco
Y29kZSk7Ci0gICAgaXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcucnVuKCk7Ci19Ci0KLX0gfSB9
IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIKLQotI2VuZGlmIC8vIEVOQUJMRShCM19KSVQpCklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpckl0ZXJhdGVkUmVnaXN0ZXJDb2Fs
ZXNjaW5nLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJJ
dGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5oCShyZXZpc2lvbiAyMTI3OTcpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpckl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nLmgJKG5v
bmV4aXN0ZW50KQpAQCAtMSw0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCi0gKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLSAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgotICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpZiBFTkFCTEUoQjNfSklUKQotCi1u
YW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7Ci0KLWNsYXNzIENv
ZGU7Ci0KLS8vIFRoaXMgaXMgYSByZWdpc3RlciBhbGxvY2F0aW9uIHBoYXNlIGJhc2VkIG9uIEFu
ZHJldyBBcHBlbCdzIEl0ZXJhdGVkIFJlZ2lzdGVyIENvYWxlc2NpbmcKLS8vIGh0dHA6Ly93d3cu
Y3MuY211LmVkdS9hZnMvY3MvYWNhZGVtaWMvY2xhc3MvMTU3NDUtczA3L3d3dy9wYXBlcnMvZ2Vv
cmdlLnBkZgotdm9pZCBpdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZyhDb2RlJik7Ci0KLX0gfSB9
IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIKLQotI2VuZGlmIC8vIEVOQUJMRShCM19KSVQpCklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9PcHRpb25zLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvT3B0aW9ucy5oCShyZXZpc2lvbiAyMTI3
OTcpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9PcHRpb25zLmgJKHdvcmtpbmcg
Y29weSkKQEAgLTM5Myw2ICszOTMsOCBAQCB0eXBlZGVmIGNvbnN0IGNoYXIqIG9wdGlvblN0cmlu
ZzsKICAgICB2KGJvb2wsIGxvZ0IzUGhhc2VUaW1lcywgZmFsc2UsIE5vcm1hbCwgbnVsbHB0cikg
XAogICAgIHYoZG91YmxlLCByYXJlQmxvY2tQZW5hbHR5LCAwLjAwMSwgTm9ybWFsLCBudWxscHRy
KSBcCiAgICAgdihib29sLCBhaXJTcGlsbHNFdmVyeXRoaW5nLCBmYWxzZSwgTm9ybWFsLCBudWxs
cHRyKSBcCisgICAgdihib29sLCBhaXJGb3JjZUJyaWdnc0FsbG9jYXRvciwgZmFsc2UsIE5vcm1h
bCwgbnVsbHB0cikgXAorICAgIHYoYm9vbCwgYWlyRm9yY2VJUkNBbGxvY2F0b3IsIGZhbHNlLCBO
b3JtYWwsIG51bGxwdHIpIFwKICAgICB2KGJvb2wsIGxvZ0FpclJlZ2lzdGVyUHJlc3N1cmUsIGZh
bHNlLCBOb3JtYWwsIG51bGxwdHIpIFwKICAgICB2KHVuc2lnbmVkLCBtYXhCM1RhaWxEdXBCbG9j
a1NpemUsIDMsIE5vcm1hbCwgbnVsbHB0cikgXAogICAgIHYodW5zaWduZWQsIG1heEIzVGFpbER1
cEJsb2NrU3VjY2Vzc29ycywgMywgTm9ybWFsLCBudWxscHRyKSBcCkluZGV4OiBUb29scy9TY3Jp
cHRzL3J1bi1qc2Mtc3RyZXNzLXRlc3RzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL1NjcmlwdHMvcnVu
LWpzYy1zdHJlc3MtdGVzdHMJKHJldmlzaW9uIDIxMjc5NykKKysrIFRvb2xzL1NjcmlwdHMvcnVu
LWpzYy1zdHJlc3MtdGVzdHMJKHdvcmtpbmcgY29weSkKQEAgLTg1NCwxNSArODU0LDE1IEBAIGRl
ZiBydW5GVExOb0NKSVQoKm9wdGlvbmFsVGVzdFNwZWNpZmljT3AKIGVuZAogCiBkZWYgcnVuRlRM
Tm9DSklUVmFsaWRhdGUoKm9wdGlvbmFsVGVzdFNwZWNpZmljT3B0aW9ucykKLSAgICBydW4oImZ0
bC1uby1jaml0LXZhbGlkYXRlLXNhbXBsaW5nLXByb2ZpbGVyIiwgIi0tdmFsaWRhdGVHcmFwaD10
cnVlIiwgIi0tdXNlU2FtcGxpbmdQcm9maWxlcj10cnVlIiwgKihGVExfT1BUSU9OUyArIE5PX0NK
SVRfT1BUSU9OUyArIG9wdGlvbmFsVGVzdFNwZWNpZmljT3B0aW9ucykpCisgICAgcnVuKCJmdGwt
bm8tY2ppdC12YWxpZGF0ZS1zYW1wbGluZy1wcm9maWxlciIsICItLXZhbGlkYXRlR3JhcGg9dHJ1
ZSIsICItLXVzZVNhbXBsaW5nUHJvZmlsZXI9dHJ1ZSIsICItLWFpckZvcmNlSVJDQWxsb2NhdG9y
PXRydWUiLCAqKEZUTF9PUFRJT05TICsgTk9fQ0pJVF9PUFRJT05TICsgb3B0aW9uYWxUZXN0U3Bl
Y2lmaWNPcHRpb25zKSkKIGVuZAogCiBkZWYgcnVuRlRMTm9DSklUTm9QdXRTdGFja1ZhbGlkYXRl
KCpvcHRpb25hbFRlc3RTcGVjaWZpY09wdGlvbnMpCi0gICAgcnVuKCJmdGwtbm8tY2ppdC1uby1w
dXQtc3RhY2stdmFsaWRhdGUiLCAiLS12YWxpZGF0ZUdyYXBoPXRydWUiLCAiLS11c2VQdXRTdGFj
a1Npbmtpbmc9ZmFsc2UiLCAqKEZUTF9PUFRJT05TICsgTk9fQ0pJVF9PUFRJT05TICsgb3B0aW9u
YWxUZXN0U3BlY2lmaWNPcHRpb25zKSkKKyAgICBydW4oImZ0bC1uby1jaml0LW5vLXB1dC1zdGFj
ay12YWxpZGF0ZSIsICItLXZhbGlkYXRlR3JhcGg9dHJ1ZSIsICItLXVzZVB1dFN0YWNrU2lua2lu
Zz1mYWxzZSIsICItLWFpckZvcmNlSVJDQWxsb2NhdG9yPXRydWUiLCAqKEZUTF9PUFRJT05TICsg
Tk9fQ0pJVF9PUFRJT05TICsgb3B0aW9uYWxUZXN0U3BlY2lmaWNPcHRpb25zKSkKIGVuZAogCiBk
ZWYgcnVuRlRMTm9DSklUTm9JbmxpbmVWYWxpZGF0ZSgqb3B0aW9uYWxUZXN0U3BlY2lmaWNPcHRp
b25zKQotICAgIHJ1bigiZnRsLW5vLWNqaXQtbm8taW5saW5lLXZhbGlkYXRlIiwgIi0tdmFsaWRh
dGVHcmFwaD10cnVlIiwgIi0tbWF4aW11bUlubGluaW5nRGVwdGg9MSIsICooRlRMX09QVElPTlMg
KyBOT19DSklUX09QVElPTlMgKyBvcHRpb25hbFRlc3RTcGVjaWZpY09wdGlvbnMpKQorICAgIHJ1
bigiZnRsLW5vLWNqaXQtbm8taW5saW5lLXZhbGlkYXRlIiwgIi0tdmFsaWRhdGVHcmFwaD10cnVl
IiwgIi0tbWF4aW11bUlubGluaW5nRGVwdGg9MSIsICItLWFpckZvcmNlQnJpZ2dzQWxsb2NhdG9y
PXRydWUiLCAqKEZUTF9PUFRJT05TICsgTk9fQ0pJVF9PUFRJT05TICsgb3B0aW9uYWxUZXN0U3Bl
Y2lmaWNPcHRpb25zKSkKIGVuZAogCiBkZWYgcnVuRlRMTm9DSklUT1NSVmFsaWRhdGlvbigqb3B0
aW9uYWxUZXN0U3BlY2lmaWNPcHRpb25zKQpAQCAtODc4LDExICs4NzgsMTEgQEAgZGVmIHJ1bkRG
R0VhZ2VyTm9DSklUVmFsaWRhdGUoKm9wdGlvbmFsVAogZW5kCiAKIGRlZiBydW5GVExFYWdlcigq
b3B0aW9uYWxUZXN0U3BlY2lmaWNPcHRpb25zKQotICAgIHJ1bigiZnRsLWVhZ2VyIiwgKihGVExf
T1BUSU9OUyArIEVBR0VSX09QVElPTlMgKyBDT0xMRUNUX0NPTlRJTlVPVVNMWV9PUFRJT05TICsg
b3B0aW9uYWxUZXN0U3BlY2lmaWNPcHRpb25zKSkKKyAgICBydW4oImZ0bC1lYWdlciIsICItLWFp
ckZvcmNlSVJDQWxsb2NhdG9yPXRydWUiLCAqKEZUTF9PUFRJT05TICsgRUFHRVJfT1BUSU9OUyAr
IENPTExFQ1RfQ09OVElOVU9VU0xZX09QVElPTlMgKyBvcHRpb25hbFRlc3RTcGVjaWZpY09wdGlv
bnMpKQogZW5kCiAKIGRlZiBydW5GVExFYWdlck5vQ0pJVFZhbGlkYXRlKCpvcHRpb25hbFRlc3RT
cGVjaWZpY09wdGlvbnMpCi0gICAgcnVuKCJmdGwtZWFnZXItbm8tY2ppdCIsICItLXZhbGlkYXRl
R3JhcGg9dHJ1ZSIsICooRlRMX09QVElPTlMgKyBOT19DSklUX09QVElPTlMgKyBFQUdFUl9PUFRJ
T05TICsgQ09MTEVDVF9DT05USU5VT1VTTFlfT1BUSU9OUyArIG9wdGlvbmFsVGVzdFNwZWNpZmlj
T3B0aW9ucykpCisgICAgcnVuKCJmdGwtZWFnZXItbm8tY2ppdCIsICItLXZhbGlkYXRlR3JhcGg9
dHJ1ZSIsICItLWFpckZvcmNlQnJpZ2dzQWxsb2NhdG9yPXRydWUiLCAqKEZUTF9PUFRJT05TICsg
Tk9fQ0pJVF9PUFRJT05TICsgRUFHRVJfT1BUSU9OUyArIENPTExFQ1RfQ09OVElOVU9VU0xZX09Q
VElPTlMgKyBvcHRpb25hbFRlc3RTcGVjaWZpY09wdGlvbnMpKQogZW5kCiAKIGRlZiBydW5GVExF
YWdlck5vQ0pJVE9TUlZhbGlkYXRpb24oKm9wdGlvbmFsVGVzdFNwZWNpZmljT3B0aW9ucykK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>302358</attachid>
            <date>2017-02-21 19:55:43 -0800</date>
            <delta_ts>2017-02-21 20:06:50 -0800</delta_ts>
            <desc>patch for landing testing gtk to see if it builds v2</desc>
            <filename>c-backup.diff</filename>
            <type>text/plain</type>
            <size>220453</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DTWFrZUxpc3RzLnR4dAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvQ01ha2VMaXN0cy50eHQJKHJldmlzaW9uIDIxMjc5NykK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DTWFrZUxpc3RzLnR4dAkod29ya2luZyBjb3B5KQpA
QCAtODcsMTAgKzg3LDEwIEBAIHNldChKYXZhU2NyaXB0Q29yZV9TT1VSQ0VTCiAgICAgYjMvYWly
L0FpckZpeFBhcnRpYWxSZWdpc3RlclN0YWxscy5jcHAKICAgICBiMy9haXIvQWlyR2VuZXJhdGUu
Y3BwCiAgICAgYjMvYWlyL0FpckdlbmVyYXRlZC5jcHAKKyAgICBiMy9haXIvQWlyR3JhcGhDb2xv
cmluZy5jcHAKICAgICBiMy9haXIvQWlySGFuZGxlQ2FsbGVlU2F2ZXMuY3BwCiAgICAgYjMvYWly
L0Fpckluc2VydGlvblNldC5jcHAKICAgICBiMy9haXIvQWlySW5zdC5jcHAKLSAgICBiMy9haXIv
QWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuY3BwCiAgICAgYjMvYWlyL0FpcktpbmQuY3Bw
CiAgICAgYjMvYWlyL0FpckxvZ1JlZ2lzdGVyUHJlc3N1cmUuY3BwCiAgICAgYjMvYWlyL0Fpckxv
d2VyQWZ0ZXJSZWdBbGxvYy5jcHAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2Ny
aXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShy
ZXZpc2lvbiAyMTI3OTcpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUu
eGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29ya2luZyBjb3B5KQpAQCAtMTIzOSw4ICsxMjM5
LDYgQEAKIAkJMjYwMEI1QTcxNTJCQUFBNzAwOTFFRTVGIC8qIEpTU3RyaW5nSm9pbmVyLmggaW4g
SGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyNjAwQjVBNTE1MkJB
QUE3MDA5MUVFNUYgLyogSlNTdHJpbmdKb2luZXIuaCAqLzsgfTsKIAkJMjYyRDg1QjYxQzBENjUw
RjAwNkFDQjYxIC8qIEFpckZpeFBhcnRpYWxSZWdpc3RlclN0YWxscy5jcHAgaW4gU291cmNlcyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyNjJEODVCNDFDMEQ2NTBGMDA2QUNC
NjEgLyogQWlyRml4UGFydGlhbFJlZ2lzdGVyU3RhbGxzLmNwcCAqLzsgfTsKIAkJMjYyRDg1Qjcx
QzBENjUwRjAwNkFDQjYxIC8qIEFpckZpeFBhcnRpYWxSZWdpc3RlclN0YWxscy5oIGluIEhlYWRl
cnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMjYyRDg1QjUxQzBENjUwRjAw
NkFDQjYxIC8qIEFpckZpeFBhcnRpYWxSZWdpc3RlclN0YWxscy5oICovOyB9OwotCQkyNjcxOEJB
NDFCRTk5Rjc4MDA1MjAxN0IgLyogQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuY3BwIGlu
IFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMjY3MThCQTIxQkU5
OUY3ODAwNTIwMTdCIC8qIEFpckl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nLmNwcCAqLzsgfTsK
LQkJMjY3MThCQTUxQkU5OUY3ODAwNTIwMTdCIC8qIEFpckl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNj
aW5nLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyNjcx
OEJBMzFCRTk5Rjc4MDA1MjAxN0IgLyogQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuaCAq
LzsgfTsKIAkJMjY4NEQ0MzgxQzAwMTYxQzAwODFENjYzIC8qIEFpckxpdmVuZXNzLmggaW4gSGVh
ZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyNjg0RDQzNzFDMDAxNjFD
MDA4MUQ2NjMgLyogQWlyTGl2ZW5lc3MuaCAqLzsgfTsKIAkJMjY5RDYzNkUxQkZCRTVEMTAwMTAx
QjFEIC8qIEZUTE91dHB1dC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBm
aWxlUmVmID0gMjY5RDYzNkQxQkZCRTVEMDAwMTAxQjFEIC8qIEZUTE91dHB1dC5oICovOyB9Owog
CQkyQTA1QUJENTE5NjFERjI0MDAzNDE3NTAgLyogSlNQcm9wZXJ0eU5hbWVFbnVtZXJhdG9yLmNw
cCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDJBMDVBQkQz
MTk2MURGMjQwMDM0MTc1MCAvKiBKU1Byb3BlcnR5TmFtZUVudW1lcmF0b3IuY3BwICovOyB9OwpA
QCAtMTQ1Myw2ICsxNDUxLDggQEAKIAkJNzk1QjE5OTgxRDc4QkUzNTAwMjYyRkEwIC8qIE1hcEJh
c2UuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDc5NUIx
OTk2MUQ3OEJFMzUwMDI2MkZBMCAvKiBNYXBCYXNlLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVU
RVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJNzk1RjA5OUQxRTAzNjAwNTAwQkJFMzdGIC8qIEIz
Q29tcGlsZS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYg
PSA3OTVGMDk5QzFFMDM2MDA1MDBCQkUzN0YgLyogQjNDb21waWxlLmNwcCAqLzsgfTsKIAkJNzk2
NDY1NkExQjk1MkZGMDAwMzA1OUVFIC8qIEdldFB1dEluZm8uaCBpbiBIZWFkZXJzICovID0ge2lz
YSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDc5NjQ2NTY4MUI5NTJGRjAwMDMwNTlFRSAvKiBH
ZXRQdXRJbmZvLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsg
fTsKKwkJNzk2NUExMTkxRTVEM0ZGRTAwMUJBNTBEIC8qIEFpckdyYXBoQ29sb3JpbmcuY3BwIGlu
IFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNzk2NUExMTcxRTVE
M0ZGRTAwMUJBNTBEIC8qIEFpckdyYXBoQ29sb3JpbmcuY3BwICovOyB9OworCQk3OTY1QTExQTFF
NUQzRkZFMDAxQkE1MEQgLyogQWlyR3JhcGhDb2xvcmluZy5oIGluIEhlYWRlcnMgKi8gPSB7aXNh
ID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNzk2NUExMTgxRTVEM0ZGRTAwMUJBNTBEIC8qIEFp
ckdyYXBoQ29sb3JpbmcuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCAp
OyB9OyB9OwogCQk3OTZGQjQzQTFERkY4QzNGMDAzOUM5NUQgLyogSlNXZWJBc3NlbWJseUhlbHBl
cnMuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDc5NkZC
NDM5MURGRjhDM0YwMDM5Qzk1RCAvKiBKU1dlYkFzc2VtYmx5SGVscGVycy5oICovOyBzZXR0aW5n
cyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCTc5N0UwN0E5MUI4RkNGQjkw
MDg0MDBCQSAvKiBKU0dsb2JhbExleGljYWxFbnZpcm9ubWVudC5jcHAgaW4gU291cmNlcyAqLyA9
IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA3OTdFMDdBNzFCOEZDRkI5MDA4NDAwQkEg
LyogSlNHbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQuY3BwICovOyB9OwogCQk3OTdFMDdBQTFCOEZD
RkI5MDA4NDAwQkEgLyogSlNHbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQuaCBpbiBIZWFkZXJzICov
ID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDc5N0UwN0E4MUI4RkNGQjkwMDg0MDBC
QSAvKiBKU0dsb2JhbExleGljYWxFbnZpcm9ubWVudC5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJV
VEVTID0gKFByaXZhdGUsICk7IH07IH07CkBAIC0zNjg3LDggKzM2ODcsNiBAQAogCQkyNjJEODVC
NDFDMEQ2NTBGMDA2QUNCNjEgLyogQWlyRml4UGFydGlhbFJlZ2lzdGVyU3RhbGxzLmNwcCAqLyA9
IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxl
VHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IEFpckZpeFBhcnRpYWxSZWdpc3RlclN0
YWxscy5jcHA7IHBhdGggPSBiMy9haXIvQWlyRml4UGFydGlhbFJlZ2lzdGVyU3RhbGxzLmNwcDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMjYyRDg1QjUxQzBENjUwRjAwNkFDQjYxIC8q
IEFpckZpeFBhcnRpYWxSZWdpc3RlclN0YWxscy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7
IG5hbWUgPSBBaXJGaXhQYXJ0aWFsUmVnaXN0ZXJTdGFsbHMuaDsgcGF0aCA9IGIzL2Fpci9BaXJG
aXhQYXJ0aWFsUmVnaXN0ZXJTdGFsbHMuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJ
MjY0MDkxRkExQkUyRkQ0MTAwNjg0REIyIC8qIEFpck9wY29kZS5vcGNvZGVzICovID0ge2lzYSA9
IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgbmFtZSA9IEFpck9w
Y29kZS5vcGNvZGVzOyBwYXRoID0gYjMvYWlyL0Fpck9wY29kZS5vcGNvZGVzOyBzb3VyY2VUcmVl
ID0gIjxncm91cD4iOyB9OwotCQkyNjcxOEJBMjFCRTk5Rjc4MDA1MjAxN0IgLyogQWlySXRlcmF0
ZWRSZWdpc3RlckNvYWxlc2NpbmcuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBu
YW1lID0gQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuY3BwOyBwYXRoID0gYjMvYWlyL0Fp
ckl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKLQkJMjY3MThCQTMxQkU5OUY3ODAwNTIwMTdCIC8qIEFpckl0ZXJhdGVkUmVnaXN0ZXJDb2Fs
ZXNjaW5nLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsg
bGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEFpckl0ZXJhdGVkUmVn
aXN0ZXJDb2FsZXNjaW5nLmg7IHBhdGggPSBiMy9haXIvQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxl
c2NpbmcuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMjY4NEQ0MzcxQzAwMTYxQzAw
ODFENjYzIC8qIEFpckxpdmVuZXNzLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9
IEFpckxpdmVuZXNzLmg7IHBhdGggPSBiMy9haXIvQWlyTGl2ZW5lc3MuaDsgc291cmNlVHJlZSA9
ICI8Z3JvdXA+IjsgfTsKIAkJMjY5RDYzNkQxQkZCRTVEMDAwMTAxQjFEIC8qIEZUTE91dHB1dC5o
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93
bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBGVExPdXRwdXQuaDsgcGF0aCA9IGZ0
bC9GVExPdXRwdXQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMkEwNUFCRDMxOTYx
REYyNDAwMzQxNzUwIC8qIEpTUHJvcGVydHlOYW1lRW51bWVyYXRvci5jcHAgKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBz
b3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBKU1Byb3BlcnR5TmFtZUVudW1lcmF0b3IuY3BwOyBz
b3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAtMzk0OCw2ICszOTQ2LDggQEAKIAkJNzk1QjE5
OTYxRDc4QkUzNTAwMjYyRkEwIC8qIE1hcEJhc2UuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJl
bmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5o
OyBwYXRoID0gTWFwQmFzZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk3OTVGMDk5
QzFFMDM2MDA1MDBCQkUzN0YgLyogQjNDb21waWxlLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUu
Y3BwLmNwcDsgbmFtZSA9IEIzQ29tcGlsZS5jcHA7IHBhdGggPSBiMy9CM0NvbXBpbGUuY3BwOyBz
b3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk3OTY0NjU2ODFCOTUyRkYwMDAzMDU5RUUgLyog
R2V0UHV0SW5mby5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9
IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBHZXRQdXRJbmZv
Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTc5NjVBMTE3MUU1RDNGRkUwMDFCQTUw
RCAvKiBBaXJHcmFwaENvbG9yaW5nLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBm
aWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsg
bmFtZSA9IEFpckdyYXBoQ29sb3JpbmcuY3BwOyBwYXRoID0gYjMvYWlyL0FpckdyYXBoQ29sb3Jp
bmcuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk3OTY1QTExODFFNUQzRkZFMDAx
QkE1MEQgLyogQWlyR3JhcGhDb2xvcmluZy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7
IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5h
bWUgPSBBaXJHcmFwaENvbG9yaW5nLmg7IHBhdGggPSBiMy9haXIvQWlyR3JhcGhDb2xvcmluZy5o
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk3OTZGQjQzOTFERkY4QzNGMDAzOUM5NUQg
LyogSlNXZWJBc3NlbWJseUhlbHBlcnMuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBm
aWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1l
ID0gSlNXZWJBc3NlbWJseUhlbHBlcnMuaDsgcGF0aCA9IGpzL0pTV2ViQXNzZW1ibHlIZWxwZXJz
Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTc5N0UwN0E3MUI4RkNGQjkwMDg0MDBC
QSAvKiBKU0dsb2JhbExleGljYWxFbnZpcm9ubWVudC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmNwcC5jcHA7IHBhdGggPSBKU0dsb2JhbExleGljYWxFbnZpcm9ubWVudC5jcHA7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CiAJCTc5N0UwN0E4MUI4RkNGQjkwMDg0MDBCQSAvKiBKU0dsb2Jh
bExleGljYWxFbnZpcm9ubWVudC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBK
U0dsb2JhbExleGljYWxFbnZpcm9ubWVudC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpA
QCAtNTQ3OSw2ICs1NDc5LDggQEAKIAkJCQkwRkVDODU1NDFCREFDREM3MDA4MEZGNzQgLyogQWly
R2VuZXJhdGUuaCAqLywKIAkJCQkwRkVDODU5MjFCREIxRTEwMDA4MEZGNzQgLyogQWlyR2VuZXJh
dGVkLmNwcCAqLywKIAkJCQkwRkVDODU1NTFCREFDREM3MDA4MEZGNzQgLyogQWlyR2VuZXJhdGlv
bkNvbnRleHQuaCAqLywKKwkJCQk3OTY1QTExNzFFNUQzRkZFMDAxQkE1MEQgLyogQWlyR3JhcGhD
b2xvcmluZy5jcHAgKi8sCisJCQkJNzk2NUExMTgxRTVEM0ZGRTAwMUJBNTBEIC8qIEFpckdyYXBo
Q29sb3JpbmcuaCAqLywKIAkJCQkwRkVDODU1NjFCREFDREM3MDA4MEZGNzQgLyogQWlySGFuZGxl
Q2FsbGVlU2F2ZXMuY3BwICovLAogCQkJCTBGRUM4NTU3MUJEQUNEQzcwMDgwRkY3NCAvKiBBaXJI
YW5kbGVDYWxsZWVTYXZlcy5oICovLAogCQkJCTBGRUM4NTU4MUJEQUNEQzcwMDgwRkY3NCAvKiBB
aXJJbnNlcnRpb25TZXQuY3BwICovLApAQCAtNTQ4Niw4ICs1NDg4LDYgQEAKIAkJCQkwRkVDODU1
QTFCREFDREM3MDA4MEZGNzQgLyogQWlySW5zdC5jcHAgKi8sCiAJCQkJMEZFQzg1NUIxQkRBQ0RD
NzAwODBGRjc0IC8qIEFpckluc3QuaCAqLywKIAkJCQkwRkVDODU1QzFCREFDREM3MDA4MEZGNzQg
LyogQWlySW5zdElubGluZXMuaCAqLywKLQkJCQkyNjcxOEJBMjFCRTk5Rjc4MDA1MjAxN0IgLyog
QWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuY3BwICovLAotCQkJCTI2NzE4QkEzMUJFOTlG
NzgwMDUyMDE3QiAvKiBBaXJJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5oICovLAogCQkJCTBG
REY2N0Q0MUQ5REM0M0UwMDFCOTgyNSAvKiBBaXJLaW5kLmNwcCAqLywKIAkJCQkwRkRGNjdENTFE
OURDNDNFMDAxQjk4MjUgLyogQWlyS2luZC5oICovLAogCQkJCTI2ODRENDM3MUMwMDE2MUMwMDgx
RDY2MyAvKiBBaXJMaXZlbmVzcy5oICovLApAQCAtNzkzOSw3ICs3OTM5LDYgQEAKIAkJCQkwRkVD
ODU3RTFCREFDREM3MDA4MEZGNzQgLyogQWlySW5zZXJ0aW9uU2V0LmggaW4gSGVhZGVycyAqLywK
IAkJCQkwRkVDODU4MDFCREFDREM3MDA4MEZGNzQgLyogQWlySW5zdC5oIGluIEhlYWRlcnMgKi8s
CiAJCQkJMEZFQzg1ODExQkRBQ0RDNzAwODBGRjc0IC8qIEFpckluc3RJbmxpbmVzLmggaW4gSGVh
ZGVycyAqLywKLQkJCQkyNjcxOEJBNTFCRTk5Rjc4MDA1MjAxN0IgLyogQWlySXRlcmF0ZWRSZWdp
c3RlckNvYWxlc2NpbmcuaCBpbiBIZWFkZXJzICovLAogCQkJCTBGREY2N0Q3MUQ5REM0NDIwMDFC
OTgyNSAvKiBBaXJLaW5kLmggaW4gSGVhZGVycyAqLywKIAkJCQkyNjg0RDQzODFDMDAxNjFDMDA4
MUQ2NjMgLyogQWlyTGl2ZW5lc3MuaCBpbiBIZWFkZXJzICovLAogCQkJCTBGRTM0QzFBMUM0QjM5
QUUwMDAzQTUxMiAvKiBBaXJMb2dSZWdpc3RlclByZXNzdXJlLmggaW4gSGVhZGVycyAqLywKQEAg
LTg2NjYsNiArODY2NSw3IEBACiAJCQkJOEI5RjZENTYxRDU5MTJGQTAwMUM3MzlGIC8qIEl0ZXJh
dGlvbktpbmQuaCBpbiBIZWFkZXJzICovLAogCQkJCUZFNEQ1NUI4MUFFNzE2Q0EwMDUyRTQ1OSAv
KiBJdGVyYXRpb25TdGF0dXMuaCBpbiBIZWFkZXJzICovLAogCQkJCTcwMTEzRDRDMUE4REIwOTMw
MDM4NDhDNCAvKiBJdGVyYXRvck9wZXJhdGlvbnMuaCBpbiBIZWFkZXJzICovLAorCQkJCTc5NjVB
MTFBMUU1RDNGRkUwMDFCQTUwRCAvKiBBaXJHcmFwaENvbG9yaW5nLmggaW4gSGVhZGVycyAqLywK
IAkJCQk3MERDM0UwQTFCMkRGMkM3MDAwNTQyOTkgLyogSXRlcmF0b3JQcm90b3R5cGUuaCBpbiBI
ZWFkZXJzICovLAogCQkJCUJDMThDNDEzMEUxNkY1Q0QwMEIzNDQ2MCAvKiBKYXZhU2NyaXB0Lmgg
aW4gSGVhZGVycyAqLywKIAkJCQlBNTAzRkExQTE4OEUwRkIwMDAxMTBGMTQgLyogSmF2YVNjcmlw
dENhbGxGcmFtZS5oIGluIEhlYWRlcnMgKi8sCkBAIC05Nzk0LDcgKzk3OTQsNiBAQAogCQkJCTBG
RUM4NTdCMUJEQUNEQzcwMDgwRkY3NCAvKiBBaXJIYW5kbGVDYWxsZWVTYXZlcy5jcHAgaW4gU291
cmNlcyAqLywKIAkJCQkwRkVDODU3RDFCREFDREM3MDA4MEZGNzQgLyogQWlySW5zZXJ0aW9uU2V0
LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTBGRUM4NTdGMUJEQUNEQzcwMDgwRkY3NCAvKiBBaXJJ
bnN0LmNwcCBpbiBTb3VyY2VzICovLAotCQkJCTI2NzE4QkE0MUJFOTlGNzgwMDUyMDE3QiAvKiBB
aXJJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkwRkRG
NjdENjFEOURDNDQwMDAxQjk4MjUgLyogQWlyS2luZC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkw
RkUzNEMxOTFDNEIzOUFFMDAwM0E1MTIgLyogQWlyTG9nUmVnaXN0ZXJQcmVzc3VyZS5jcHAgaW4g
U291cmNlcyAqLywKIAkJCQkwRjYxODMyRTFDNDVCRjA3MDA3MjQ1MEIgLyogQWlyTG93ZXJBZnRl
clJlZ0FsbG9jLmNwcCBpbiBTb3VyY2VzICovLApAQCAtOTk4MCw2ICs5OTc5LDcgQEAKIAkJCQkw
RkQzRTQwMTFCNjE4QUFGMDBDODBFMUUgLyogREZHQWRhcHRpdmVJbmZlcnJlZFByb3BlcnR5VmFs
dWVXYXRjaHBvaW50LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTBGMThEM0NGMUI1NUE2RTAwMDJD
NUM5RiAvKiBERkdBZGFwdGl2ZVN0cnVjdHVyZVdhdGNocG9pbnQuY3BwIGluIFNvdXJjZXMgKi8s
CiAJCQkJMEYyREQ4MTExQUIzRDhCRTAwQkJCOEU4IC8qIERGR0FyZ3VtZW50c0VsaW1pbmF0aW9u
UGhhc2UuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJNzk2NUExMTkxRTVEM0ZGRTAwMUJBNTBEIC8q
IEFpckdyYXBoQ29sb3JpbmcuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMEYyREQ4MTMxQUIzRDhC
RTAwQkJCOEU4IC8qIERGR0FyZ3VtZW50c1V0aWxpdGllcy5jcHAgaW4gU291cmNlcyAqLywKIAkJ
CQkwRjQ4NTMyMTE4Nzc1MDU2MDA4M0I2ODcgLyogREZHQXJpdGhNb2RlLmNwcCBpbiBTb3VyY2Vz
ICovLAogCQkJCTBGNjM5NDg0MTVFNDgxMTgwMDZBNTk3QyAvKiBERkdBcnJheU1vZGUuY3BwIGlu
IFNvdXJjZXMgKi8sCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckdlbmVy
YXRlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpckdl
bmVyYXRlLmNwcAkocmV2aXNpb24gMjEyNzk3KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L2Fpci9BaXJHZW5lcmF0ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM2LDcgKzM2LDcgQEAKICNp
bmNsdWRlICJBaXJGaXhQYXJ0aWFsUmVnaXN0ZXJTdGFsbHMuaCIKICNpbmNsdWRlICJBaXJHZW5l
cmF0aW9uQ29udGV4dC5oIgogI2luY2x1ZGUgIkFpckhhbmRsZUNhbGxlZVNhdmVzLmgiCi0jaW5j
bHVkZSAiQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuaCIKKyNpbmNsdWRlICJBaXJHcmFw
aENvbG9yaW5nLmgiCiAjaW5jbHVkZSAiQWlyTG9nUmVnaXN0ZXJQcmVzc3VyZS5oIgogI2luY2x1
ZGUgIkFpckxvd2VyQWZ0ZXJSZWdBbGxvYy5oIgogI2luY2x1ZGUgIkFpckxvd2VyRW50cnlTd2l0
Y2guaCIKQEAgLTg5LDcgKzg5LDcgQEAgdm9pZCBwcmVwYXJlRm9yR2VuZXJhdGlvbihDb2RlJiBj
b2RlKQogICAgIGlmIChPcHRpb25zOjphaXJTcGlsbHNFdmVyeXRoaW5nKCkpCiAgICAgICAgIHNw
aWxsRXZlcnl0aGluZyhjb2RlKTsKICAgICBlbHNlCi0gICAgICAgIGl0ZXJhdGVkUmVnaXN0ZXJD
b2FsZXNjaW5nKGNvZGUpOworICAgICAgICBhbGxvY2F0ZVJlZ2lzdGVyc0J5R3JhcGhDb2xvcmlu
Zyhjb2RlKTsKIAogICAgIGlmIChPcHRpb25zOjpsb2dBaXJSZWdpc3RlclByZXNzdXJlKCkpIHsK
ICAgICAgICAgZGF0YUxvZygiUmVnaXN0ZXIgcHJlc3N1cmUgYWZ0ZXIgcmVnaXN0ZXIgYWxsb2Nh
dGlvbjpcbiIpOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJHcmFwaENv
bG9yaW5nLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fp
ckdyYXBoQ29sb3JpbmcuY3BwCShyZXZpc2lvbiAyMTI3OTcpCShmcm9tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9iMy9haXIvQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuY3BwOjIxMjc5NykK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyR3JhcGhDb2xvcmluZy5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSwxNjU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1
LTIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAi
QWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuaCIKKworI2lmIEVOQUJMRShCM19KSVQpCisK
KyNpbmNsdWRlICJBaXJDb2RlLmgiCisjaW5jbHVkZSAiQWlySW5zZXJ0aW9uU2V0LmgiCisjaW5j
bHVkZSAiQWlySW5zdElubGluZXMuaCIKKyNpbmNsdWRlICJBaXJMaXZlbmVzcy5oIgorI2luY2x1
ZGUgIkFpclBhZEludGVyZmVyZW5jZS5oIgorI2luY2x1ZGUgIkFpclBoYXNlU2NvcGUuaCIKKyNp
bmNsdWRlICJBaXJUbXBJbmxpbmVzLmgiCisjaW5jbHVkZSAiQWlyVG1wV2lkdGguaCIKKyNpbmNs
dWRlICJBaXJVc2VDb3VudHMuaCIKKyNpbmNsdWRlIDx3dGYvTGlzdER1bXAuaD4KKworbmFtZXNw
YWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5hbWVzcGFjZSBBaXIgeworCituYW1lc3BhY2Ugewor
Citib29sIGRlYnVnID0gZmFsc2U7Citib29sIHRyYWNlRGVidWcgPSBmYWxzZTsKK2Jvb2wgcmVw
b3J0U3RhdHMgPSBmYWxzZTsKKworLy8gVGhlIEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0b3IgZGVm
aW5lcyBhbGwgdGhlIGNvZGUgdGhhdCBpcyBpbmRlcGVuZGFudAorLy8gZnJvbSB0aGUgdHlwZSBv
ciByZWdpc3RlciBhbmQgY2FuIGJlIHNoYXJlZCB3aGVuIGFsbG9jYXRpbmcgcmVnaXN0ZXJzLgor
dGVtcGxhdGU8dHlwZW5hbWUgSW5kZXhUeXBlPgorY2xhc3MgQWJzdHJhY3RDb2xvcmluZ0FsbG9j
YXRvciB7CitwdWJsaWM6CisgICAgQWJzdHJhY3RDb2xvcmluZ0FsbG9jYXRvcihjb25zdCBWZWN0
b3I8UmVnPiYgcmVnc0luUHJpb3JpdHlPcmRlciwgSW5kZXhUeXBlIGxhc3RQcmVjb2xvcmVkUmVn
aXN0ZXJJbmRleCwgdW5zaWduZWQgdG1wQXJyYXlTaXplLCBjb25zdCBIYXNoU2V0PHVuc2lnbmVk
PiYgdW5zcGlsbGFibGVUbXApCisgICAgICAgIDogbV9yZWdzSW5Qcmlvcml0eU9yZGVyKHJlZ3NJ
blByaW9yaXR5T3JkZXIpCisgICAgICAgICwgbV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXgo
bGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4KQorICAgICAgICAsIG1fdW5zcGlsbGFibGVUbXBz
KHVuc3BpbGxhYmxlVG1wKQorICAgIHsKKyAgICAgICAgZm9yIChSZWcgcmVnIDogbV9yZWdzSW5Q
cmlvcml0eU9yZGVyKQorICAgICAgICAgICAgbV9tdXRhYmxlUmVncy5zZXQocmVnKTsKKyAgICAg
ICAgCisgICAgICAgIGluaXRpYWxpemVEZWdyZWVzKHRtcEFycmF5U2l6ZSk7CisgICAgICAgIAor
ICAgICAgICBtX2FkamFjZW5jeUxpc3QucmVzaXplKHRtcEFycmF5U2l6ZSk7CisgICAgICAgIG1f
bW92ZUxpc3QucmVzaXplKHRtcEFycmF5U2l6ZSk7CisgICAgICAgIG1fY29hbGVzY2VkVG1wcy5m
aWxsKDAsIHRtcEFycmF5U2l6ZSk7CisgICAgICAgIG1faXNPblNlbGVjdFN0YWNrLmVuc3VyZVNp
emUodG1wQXJyYXlTaXplKTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBJbmRleFR5cGUgZ2V0
QWxpYXMoSW5kZXhUeXBlIHRtcEluZGV4KSBjb25zdAorICAgIHsKKyAgICAgICAgSW5kZXhUeXBl
IGFsaWFzID0gdG1wSW5kZXg7CisgICAgICAgIHdoaWxlIChJbmRleFR5cGUgbmV4dEFsaWFzID0g
bV9jb2FsZXNjZWRUbXBzW2FsaWFzXSkKKyAgICAgICAgICAgIGFsaWFzID0gbmV4dEFsaWFzOwor
ICAgICAgICByZXR1cm4gYWxpYXM7CisgICAgfQorCisgICAgdm9pZCBhZGRFZGdlKEluZGV4VHlw
ZSBhLCBJbmRleFR5cGUgYikKKyAgICB7CisgICAgICAgIGlmIChhID09IGIpCisgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgIGFkZEVkZ2VEaXN0aW5jdChhLCBiKTsKKyAgICB9CisKKyAgICB2
b2lkIG1ha2VXb3JrTGlzdCgpCisgICAgeworICAgICAgICBJbmRleFR5cGUgZmlyc3ROb25SZWdJ
bmRleCA9IG1fbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4ICsgMTsKKyAgICAgICAgZm9yIChJ
bmRleFR5cGUgaSA9IGZpcnN0Tm9uUmVnSW5kZXg7IGkgPCBtX2RlZ3JlZXMuc2l6ZSgpOyArK2kp
IHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGRlZ3JlZSA9IG1fZGVncmVlc1tpXTsKKyAgICAgICAg
ICAgIGlmIChkZWdyZWUgPj0gbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKSkKKyAgICAgICAg
ICAgICAgICBhZGRUb1NwaWxsKGkpOworICAgICAgICAgICAgZWxzZSBpZiAoIW1fbW92ZUxpc3Rb
aV0uaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIG1fZnJlZXplV29ya2xpc3QuYWRkKGkpOwor
ICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5hcHBl
bmQoaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGFkZFRvU3BpbGwodW5zaWduZWQg
dG9TcGlsbCkKKyAgICB7CisgICAgICAgIGlmIChtX3Vuc3BpbGxhYmxlVG1wcy5jb250YWlucyh0
b1NwaWxsKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBtX3NwaWxsV29ya2xpc3Qu
YWRkKHRvU3BpbGwpOworICAgIH0KKworICAgIC8vIExvdy1kZWdyZWUgdmVydGV4IGNhbiBhbHdh
eXMgYmUgY29sb3JlZDoganVzdCBwaWNrIGFueSBvZiB0aGUgY29sb3IgdGFrZW4gYnkgYW55Cisg
ICAgLy8gb3RoZXIgYWRqYWNlbnQgdmVyaWNlcy4KKyAgICAvLyBUaGUgIlNpbXBsaWZ5IiBwaGFz
ZSB0YWtlcyBhIGxvdy1kZWdyZWUgb3V0IG9mIHRoZSBpbnRlcmZlcmVuY2UgZ3JhcGggdG8gc2lt
cGxpZnkgaXQuCisgICAgdm9pZCBzaW1wbGlmeSgpCisgICAgeworICAgICAgICBJbmRleFR5cGUg
bGFzdEluZGV4ID0gbV9zaW1wbGlmeVdvcmtsaXN0LnRha2VMYXN0KCk7CisKKyAgICAgICAgQVNT
RVJUKCFtX3NlbGVjdFN0YWNrLmNvbnRhaW5zKGxhc3RJbmRleCkpOworICAgICAgICBBU1NFUlQo
IW1faXNPblNlbGVjdFN0YWNrLmdldChsYXN0SW5kZXgpKTsKKyAgICAgICAgbV9zZWxlY3RTdGFj
ay5hcHBlbmQobGFzdEluZGV4KTsKKyAgICAgICAgbV9pc09uU2VsZWN0U3RhY2sucXVpY2tTZXQo
bGFzdEluZGV4KTsKKworICAgICAgICBmb3JFYWNoQWRqYWNlbnQobGFzdEluZGV4LCBbdGhpc10o
SW5kZXhUeXBlIGFkamFjZW50VG1wSW5kZXgpIHsKKyAgICAgICAgICAgIGRlY3JlbWVudERlZ3Jl
ZShhZGphY2VudFRtcEluZGV4KTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgdm9pZCBmcmVl
emUoKQorICAgIHsKKyAgICAgICAgSW5kZXhUeXBlIHZpY3RpbUluZGV4ID0gbV9mcmVlemVXb3Jr
bGlzdC50YWtlQW55KCk7CisgICAgICAgIEFTU0VSVF9XSVRIX01FU1NBR0UoZ2V0QWxpYXModmlj
dGltSW5kZXgpID09IHZpY3RpbUluZGV4LCAiY29hbGVzY2UoKSBzaG91bGQgbm90IGxlYXZlIGFs
aWFzZWQgVG1wIGluIHRoZSB3b3JrbGlzdC4iKTsKKyAgICAgICAgbV9zaW1wbGlmeVdvcmtsaXN0
LmFwcGVuZCh2aWN0aW1JbmRleCk7CisgICAgICAgIGZyZWV6ZU1vdmVzKHZpY3RpbUluZGV4KTsK
KyAgICB9CisKKyAgICB2b2lkIGZyZWV6ZU1vdmVzKEluZGV4VHlwZSB0bXBJbmRleCkKKyAgICB7
CisgICAgICAgIGZvckVhY2hOb2RlTW92ZXModG1wSW5kZXgsIFt0aGlzLCB0bXBJbmRleF0gKElu
ZGV4VHlwZSBtb3ZlSW5kZXgpIHsKKyAgICAgICAgICAgIGlmICghbV9hY3RpdmVNb3Zlcy5xdWlj
a0NsZWFyKG1vdmVJbmRleCkpCisgICAgICAgICAgICAgICAgbV93b3JrbGlzdE1vdmVzLnRha2VN
b3ZlKG1vdmVJbmRleCk7CisKKyAgICAgICAgICAgIGNvbnN0IE1vdmVPcGVyYW5kcyYgbW92ZU9w
ZXJhbmRzID0gbV9jb2FsZXNjaW5nQ2FuZGlkYXRlc1ttb3ZlSW5kZXhdOworICAgICAgICAgICAg
SW5kZXhUeXBlIHNyY1RtcEluZGV4ID0gbW92ZU9wZXJhbmRzLnNyY0luZGV4OworICAgICAgICAg
ICAgSW5kZXhUeXBlIGRzdFRtcEluZGV4ID0gbW92ZU9wZXJhbmRzLmRzdEluZGV4OworCisgICAg
ICAgICAgICBJbmRleFR5cGUgb3JpZ2luYWxPdGhlclRtcCA9IHNyY1RtcEluZGV4ICE9IHRtcElu
ZGV4ID8gc3JjVG1wSW5kZXggOiBkc3RUbXBJbmRleDsKKyAgICAgICAgICAgIEluZGV4VHlwZSBv
dGhlclRtcEluZGV4ID0gZ2V0QWxpYXMob3JpZ2luYWxPdGhlclRtcCk7CisgICAgICAgICAgICBp
ZiAobV9kZWdyZWVzW290aGVyVG1wSW5kZXhdIDwgbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUo
KSAmJiAhaXNNb3ZlUmVsYXRlZChvdGhlclRtcEluZGV4KSkgeworICAgICAgICAgICAgICAgIGlm
IChtX2ZyZWV6ZVdvcmtsaXN0LnJlbW92ZShvdGhlclRtcEluZGV4KSkKKyAgICAgICAgICAgICAg
ICAgICAgbV9zaW1wbGlmeVdvcmtsaXN0LmFwcGVuZChvdGhlclRtcEluZGV4KTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgdm9pZCBjb2FsZXNjZSgpCisgICAgewor
ICAgICAgICB1bnNpZ25lZCBtb3ZlSW5kZXggPSBtX3dvcmtsaXN0TW92ZXMudGFrZUxhc3RNb3Zl
KCk7CisgICAgICAgIGNvbnN0IE1vdmVPcGVyYW5kcyYgbW92ZU9wZXJhbmRzID0gbV9jb2FsZXNj
aW5nQ2FuZGlkYXRlc1ttb3ZlSW5kZXhdOworICAgICAgICBJbmRleFR5cGUgdSA9IGdldEFsaWFz
KG1vdmVPcGVyYW5kcy5zcmNJbmRleCk7CisgICAgICAgIEluZGV4VHlwZSB2ID0gZ2V0QWxpYXMo
bW92ZU9wZXJhbmRzLmRzdEluZGV4KTsKKworICAgICAgICBpZiAoaXNQcmVjb2xvcmVkKHYpKQor
ICAgICAgICAgICAgc3RkOjpzd2FwKHUsIHYpOworCisgICAgICAgIGlmICh0cmFjZURlYnVnKQor
ICAgICAgICAgICAgZGF0YUxvZygiQ29hbGVzY2luZyBtb3ZlIGF0IGluZGV4ICIsIG1vdmVJbmRl
eCwgIiB1ID0gIiwgdSwgIiB2ID0gIiwgdiwgIlxuIik7CisKKyAgICAgICAgaWYgKHUgPT0gdikg
eworICAgICAgICAgICAgYWRkV29ya0xpc3QodSk7CisKKyAgICAgICAgICAgIGlmICh0cmFjZURl
YnVnKQorICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICBDb2FsZXNjZWRcbiIpOworICAgICAg
ICB9IGVsc2UgaWYgKGlzUHJlY29sb3JlZCh2KQorICAgICAgICAgICAgfHwgbV9pbnRlcmZlcmVu
Y2VFZGdlcy5jb250YWlucyhJbnRlcmZlcmVuY2VFZGdlKHUsIHYpKQorICAgICAgICAgICAgfHwg
KHUgPT0gbV9mcmFtZVBvaW50ZXJJbmRleCAmJiBtX2ludGVyZmVyZXNXaXRoRnJhbWVQb2ludGVy
LnF1aWNrR2V0KHYpKSkgeworICAgICAgICAgICAgYWRkV29ya0xpc3QodSk7CisgICAgICAgICAg
ICBhZGRXb3JrTGlzdCh2KTsKKworICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpCisgICAgICAg
ICAgICAgICAgZGF0YUxvZygiICAgIENvbnN0cmFpbmVkXG4iKTsKKyAgICAgICAgfSBlbHNlIGlm
IChjYW5CZVNhZmVseUNvYWxlc2NlZCh1LCB2KSkgeworICAgICAgICAgICAgY29tYmluZSh1LCB2
KTsKKyAgICAgICAgICAgIGFkZFdvcmtMaXN0KHUpOworICAgICAgICAgICAgbV9oYXNDb2FsZXNj
ZWROb25Ucml2aWFsTW92ZSA9IHRydWU7CisKKyAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQor
ICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICBTYWZlIENvYWxlc2NpbmdcbiIpOworICAgICAg
ICB9IGVsc2UgeworICAgICAgICAgICAgbV9hY3RpdmVNb3Zlcy5xdWlja1NldChtb3ZlSW5kZXgp
OworCisgICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKKyAgICAgICAgICAgICAgICBkYXRhTG9n
KCIgICAgRmFpbGVkIGNvYWxlc2NpbmcsIGFkZGVkIHRvIGFjdGl2ZSBtb3Zlcy5cbiIpOworICAg
ICAgICB9CisgICAgfQorCisgICAgdm9pZCBhc3NpZ25Db2xvcnMoKQorICAgIHsKKyAgICAgICAg
QVNTRVJUKG1fc2ltcGxpZnlXb3JrbGlzdC5pc0VtcHR5KCkpOworICAgICAgICBBU1NFUlQobV93
b3JrbGlzdE1vdmVzLmlzRW1wdHkoKSk7CisgICAgICAgIEFTU0VSVChtX2ZyZWV6ZVdvcmtsaXN0
LmlzRW1wdHkoKSk7CisgICAgICAgIEFTU0VSVChtX3NwaWxsV29ya2xpc3QuaXNFbXB0eSgpKTsK
KworICAgICAgICAvLyBSZWNsYWltIGFzIG11Y2ggbWVtb3J5IGFzIHBvc3NpYmxlLgorICAgICAg
ICBtX2ludGVyZmVyZW5jZUVkZ2VzLmNsZWFyKCk7CisgICAgICAgIG1fZGVncmVlcy5jbGVhcigp
OworICAgICAgICBtX21vdmVMaXN0LmNsZWFyKCk7CisgICAgICAgIG1fd29ya2xpc3RNb3Zlcy5j
bGVhcigpOworICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuY2xlYXIoKTsKKyAgICAgICAgbV9z
cGlsbFdvcmtsaXN0LmNsZWFyKCk7CisgICAgICAgIG1fZnJlZXplV29ya2xpc3QuY2xlYXIoKTsK
KworICAgICAgICAvLyBUcnkgdG8gY29sb3IgdGhlIFRtcCBvbiB0aGUgc3RhY2suCisgICAgICAg
IG1fY29sb3JlZFRtcC5yZXNpemUobV9hZGphY2VuY3lMaXN0LnNpemUoKSk7CisKKyAgICAgICAg
d2hpbGUgKCFtX3NlbGVjdFN0YWNrLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdW5zaWduZWQg
dG1wSW5kZXggPSBtX3NlbGVjdFN0YWNrLnRha2VMYXN0KCk7CisgICAgICAgICAgICBBU1NFUlQo
IWlzUHJlY29sb3JlZCh0bXBJbmRleCkpOworICAgICAgICAgICAgQVNTRVJUKCFtX2NvbG9yZWRU
bXBbdG1wSW5kZXhdKTsKKworICAgICAgICAgICAgUmVnaXN0ZXJTZXQgY29sb3JlZFJlZ2lzdGVy
czsKKyAgICAgICAgICAgIGZvciAoSW5kZXhUeXBlIGFkamFjZW50VG1wSW5kZXggOiBtX2FkamFj
ZW5jeUxpc3RbdG1wSW5kZXhdKSB7CisgICAgICAgICAgICAgICAgSW5kZXhUeXBlIGFsaWFzVG1w
SW5kZXggPSBnZXRBbGlhcyhhZGphY2VudFRtcEluZGV4KTsKKyAgICAgICAgICAgICAgICBSZWcg
cmVnID0gbV9jb2xvcmVkVG1wW2FsaWFzVG1wSW5kZXhdOworCisgICAgICAgICAgICAgICAgQVNT
RVJUKCFpc1ByZWNvbG9yZWQoYWxpYXNUbXBJbmRleCkgfHwgKGlzUHJlY29sb3JlZChhbGlhc1Rt
cEluZGV4KSAmJiByZWcpKTsKKworICAgICAgICAgICAgICAgIGlmIChyZWcpCisgICAgICAgICAg
ICAgICAgICAgIGNvbG9yZWRSZWdpc3RlcnMuc2V0KHJlZyk7CisgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgIGJvb2wgY29sb3JBc3NpZ25lZCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChS
ZWcgcmVnIDogbV9yZWdzSW5Qcmlvcml0eU9yZGVyKSB7CisgICAgICAgICAgICAgICAgaWYgKCFj
b2xvcmVkUmVnaXN0ZXJzLmdldChyZWcpKSB7CisgICAgICAgICAgICAgICAgICAgIG1fY29sb3Jl
ZFRtcFt0bXBJbmRleF0gPSByZWc7CisgICAgICAgICAgICAgICAgICAgIGNvbG9yQXNzaWduZWQg
PSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghY29sb3JBc3NpZ25lZCkKKyAgICAgICAg
ICAgICAgICBtX3NwaWxsZWRUbXBzLmFwcGVuZCh0bXBJbmRleCk7CisgICAgICAgIH0KKyAgICAg
ICAgbV9zZWxlY3RTdGFjay5jbGVhcigpOworCisgICAgICAgIGlmIChtX3NwaWxsZWRUbXBzLmlz
RW1wdHkoKSkKKyAgICAgICAgICAgIG1fY29hbGVzY2VkVG1wc0F0U3BpbGwuY2xlYXIoKTsKKyAg
ICAgICAgZWxzZQorICAgICAgICAgICAgbV9jb2xvcmVkVG1wLmNsZWFyKCk7CisgICAgfQorCitw
cml2YXRlOgorICAgIHZvaWQgaW5pdGlhbGl6ZURlZ3JlZXModW5zaWduZWQgdG1wQXJyYXlTaXpl
KQorICAgIHsKKyAgICAgICAgbV9kZWdyZWVzLnJlc2l6ZSh0bXBBcnJheVNpemUpOworCisgICAg
ICAgIC8vIEFsbCBwcmVjb2xvcmVkIHJlZ2lzdGVycyBoYXZlICBhbiAiaW5maW5pdGUiIGRlZ3Jl
ZS4KKyAgICAgICAgdW5zaWduZWQgZmlyc3ROb25SZWdJbmRleCA9IG1fbGFzdFByZWNvbG9yZWRS
ZWdpc3RlckluZGV4ICsgMTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGZpcnN0
Tm9uUmVnSW5kZXg7ICsraSkKKyAgICAgICAgICAgIG1fZGVncmVlc1tpXSA9IHN0ZDo6bnVtZXJp
Y19saW1pdHM8dW5zaWduZWQ+OjptYXgoKTsKKworICAgICAgICBtZW1zZXQobV9kZWdyZWVzLmRh
dGEoKSArIGZpcnN0Tm9uUmVnSW5kZXgsIDAsICh0bXBBcnJheVNpemUgLSBmaXJzdE5vblJlZ0lu
ZGV4KSAqIHNpemVvZih1bnNpZ25lZCkpOworICAgIH0KKworICAgIHZvaWQgYWRkRWRnZURpc3Rp
bmN0KEluZGV4VHlwZSBhLCBJbmRleFR5cGUgYikKKyAgICB7CisgICAgICAgIEFTU0VSVChhICE9
IGIpOworICAgICAgICBpZiAobV9pbnRlcmZlcmVuY2VFZGdlcy5hZGQoSW50ZXJmZXJlbmNlRWRn
ZShhLCBiKSkuaXNOZXdFbnRyeSkgeworICAgICAgICAgICAgaWYgKCFpc1ByZWNvbG9yZWQoYSkp
IHsKKyAgICAgICAgICAgICAgICBBU1NFUlQoIW1fYWRqYWNlbmN5TGlzdFthXS5jb250YWlucyhi
KSk7CisgICAgICAgICAgICAgICAgbV9hZGphY2VuY3lMaXN0W2FdLmFwcGVuZChiKTsKKyAgICAg
ICAgICAgICAgICBtX2RlZ3JlZXNbYV0rKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
aWYgKCFpc1ByZWNvbG9yZWQoYikpIHsKKyAgICAgICAgICAgICAgICBBU1NFUlQoIW1fYWRqYWNl
bmN5TGlzdFtiXS5jb250YWlucyhhKSk7CisgICAgICAgICAgICAgICAgbV9hZGphY2VuY3lMaXN0
W2JdLmFwcGVuZChhKTsKKyAgICAgICAgICAgICAgICBtX2RlZ3JlZXNbYl0rKzsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgZGVjcmVtZW50RGVncmVlKEluZGV4
VHlwZSB0bXBJbmRleCkKKyAgICB7CisgICAgICAgIEFTU0VSVChtX2RlZ3JlZXNbdG1wSW5kZXhd
KTsKKworICAgICAgICB1bnNpZ25lZCBvbGREZWdyZWUgPSBtX2RlZ3JlZXNbdG1wSW5kZXhdLS07
CisgICAgICAgIGlmIChvbGREZWdyZWUgPT0gbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKSkg
eworICAgICAgICAgICAgZW5hYmxlTW92ZXNPblZhbHVlQW5kQWRqYWNlbnRzKHRtcEluZGV4KTsK
KyAgICAgICAgICAgIG1fc3BpbGxXb3JrbGlzdC5yZW1vdmUodG1wSW5kZXgpOworICAgICAgICAg
ICAgaWYgKGlzTW92ZVJlbGF0ZWQodG1wSW5kZXgpKQorICAgICAgICAgICAgICAgIG1fZnJlZXpl
V29ya2xpc3QuYWRkKHRtcEluZGV4KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAg
ICBtX3NpbXBsaWZ5V29ya2xpc3QuYXBwZW5kKHRtcEluZGV4KTsKKyAgICAgICAgfQorICAgIH0K
KworCisgICAgYm9vbCBhZGRFZGdlRGlzdGluY3RXaXRob3V0RGVncmVlQ2hhbmdlKEluZGV4VHlw
ZSBhLCBJbmRleFR5cGUgYikKKyAgICB7CisgICAgICAgIEFTU0VSVChhICE9IGIpOworICAgICAg
ICBpZiAobV9pbnRlcmZlcmVuY2VFZGdlcy5hZGQoSW50ZXJmZXJlbmNlRWRnZShhLCBiKSkuaXNO
ZXdFbnRyeSkgeworICAgICAgICAgICAgaWYgKCFpc1ByZWNvbG9yZWQoYSkpIHsKKyAgICAgICAg
ICAgICAgICBBU1NFUlQoIW1fYWRqYWNlbmN5TGlzdFthXS5jb250YWlucyhiKSk7CisgICAgICAg
ICAgICAgICAgbV9hZGphY2VuY3lMaXN0W2FdLmFwcGVuZChiKTsKKyAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgaWYgKCFpc1ByZWNvbG9yZWQoYikpIHsKKyAgICAgICAgICAgICAgICBBU1NF
UlQoIW1fYWRqYWNlbmN5TGlzdFtiXS5jb250YWlucyhhKSk7CisgICAgICAgICAgICAgICAgbV9h
ZGphY2VuY3lMaXN0W2JdLmFwcGVuZChhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJl
dHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAg
ICBib29sIGlzTW92ZVJlbGF0ZWQoSW5kZXhUeXBlIHRtcEluZGV4KQorICAgIHsKKyAgICAgICAg
Zm9yICh1bnNpZ25lZCBtb3ZlSW5kZXggOiBtX21vdmVMaXN0W3RtcEluZGV4XSkgeworICAgICAg
ICAgICAgaWYgKG1fYWN0aXZlTW92ZXMucXVpY2tHZXQobW92ZUluZGV4KSB8fCBtX3dvcmtsaXN0
TW92ZXMuY29udGFpbnMobW92ZUluZGV4KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdGVtcGxhdGU8
dHlwZW5hbWUgRnVuY3Rpb24+CisgICAgdm9pZCBmb3JFYWNoQWRqYWNlbnQoSW5kZXhUeXBlIHRt
cEluZGV4LCBGdW5jdGlvbiBmdW5jdGlvbikKKyAgICB7CisgICAgICAgIGZvciAoSW5kZXhUeXBl
IGFkamFjZW50VG1wSW5kZXggOiBtX2FkamFjZW5jeUxpc3RbdG1wSW5kZXhdKSB7CisgICAgICAg
ICAgICBpZiAoIWhhc0JlZW5TaW1wbGlmaWVkKGFkamFjZW50VG1wSW5kZXgpKQorICAgICAgICAg
ICAgICAgIGZ1bmN0aW9uKGFkamFjZW50VG1wSW5kZXgpOworICAgICAgICB9CisgICAgfQorCisg
ICAgYm9vbCBoYXNCZWVuU2ltcGxpZmllZChJbmRleFR5cGUgdG1wSW5kZXgpCisgICAgeworICAg
ICAgICByZXR1cm4gbV9pc09uU2VsZWN0U3RhY2sucXVpY2tHZXQodG1wSW5kZXgpIHx8ICEhbV9j
b2FsZXNjZWRUbXBzW3RtcEluZGV4XTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBG
dW5jdGlvbj4KKyAgICB2b2lkIGZvckVhY2hOb2RlTW92ZXMoSW5kZXhUeXBlIHRtcEluZGV4LCBG
dW5jdGlvbiBmdW5jdGlvbikKKyAgICB7CisgICAgICAgIGZvciAodW5zaWduZWQgbW92ZUluZGV4
IDogbV9tb3ZlTGlzdFt0bXBJbmRleF0pIHsKKyAgICAgICAgICAgIGlmIChtX2FjdGl2ZU1vdmVz
LnF1aWNrR2V0KG1vdmVJbmRleCkgfHwgbV93b3JrbGlzdE1vdmVzLmNvbnRhaW5zKG1vdmVJbmRl
eCkpCisgICAgICAgICAgICAgICAgZnVuY3Rpb24obW92ZUluZGV4KTsKKyAgICAgICAgfQorICAg
IH0KKworICAgIHZvaWQgZW5hYmxlTW92ZXNPblZhbHVlKEluZGV4VHlwZSB0bXBJbmRleCkKKyAg
ICB7CisgICAgICAgIGZvciAodW5zaWduZWQgbW92ZUluZGV4IDogbV9tb3ZlTGlzdFt0bXBJbmRl
eF0pIHsKKyAgICAgICAgICAgIGlmIChtX2FjdGl2ZU1vdmVzLnF1aWNrQ2xlYXIobW92ZUluZGV4
KSkKKyAgICAgICAgICAgICAgICBtX3dvcmtsaXN0TW92ZXMucmV0dXJuTW92ZShtb3ZlSW5kZXgp
OworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBlbmFibGVNb3Zlc09uVmFsdWVBbmRBZGph
Y2VudHMoSW5kZXhUeXBlIHRtcEluZGV4KQorICAgIHsKKyAgICAgICAgZW5hYmxlTW92ZXNPblZh
bHVlKHRtcEluZGV4KTsKKworICAgICAgICBmb3JFYWNoQWRqYWNlbnQodG1wSW5kZXgsIFt0aGlz
XSAoSW5kZXhUeXBlIGFkamFjZW50VG1wSW5kZXgpIHsKKyAgICAgICAgICAgIGVuYWJsZU1vdmVz
T25WYWx1ZShhZGphY2VudFRtcEluZGV4KTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgYm9v
bCBpc1ByZWNvbG9yZWQoSW5kZXhUeXBlIHRtcEluZGV4KQorICAgIHsKKyAgICAgICAgcmV0dXJu
IHRtcEluZGV4IDw9IG1fbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4OworICAgIH0KKworICAg
IHZvaWQgYWRkV29ya0xpc3QoSW5kZXhUeXBlIHRtcEluZGV4KQorICAgIHsKKyAgICAgICAgaWYg
KCFpc1ByZWNvbG9yZWQodG1wSW5kZXgpICYmIG1fZGVncmVlc1t0bXBJbmRleF0gPCBtX3JlZ3NJ
blByaW9yaXR5T3JkZXIuc2l6ZSgpICYmICFpc01vdmVSZWxhdGVkKHRtcEluZGV4KSkgeworICAg
ICAgICAgICAgbV9mcmVlemVXb3JrbGlzdC5yZW1vdmUodG1wSW5kZXgpOworICAgICAgICAgICAg
bV9zaW1wbGlmeVdvcmtsaXN0LmFwcGVuZCh0bXBJbmRleCk7CisgICAgICAgIH0KKyAgICB9CisK
KyAgICB2b2lkIGNvbWJpbmUoSW5kZXhUeXBlIHUsIEluZGV4VHlwZSB2KQorICAgIHsKKyAgICAg
ICAgaWYgKCFtX2ZyZWV6ZVdvcmtsaXN0LnJlbW92ZSh2KSkKKyAgICAgICAgICAgIG1fc3BpbGxX
b3JrbGlzdC5yZW1vdmUodik7CisKKyAgICAgICAgQVNTRVJUKCFtX2NvYWxlc2NlZFRtcHNbdl0p
OworICAgICAgICBtX2NvYWxlc2NlZFRtcHNbdl0gPSB1OworCisgICAgICAgIGF1dG8mIHZNb3Zl
cyA9IG1fbW92ZUxpc3Rbdl07CisgICAgICAgIG1fbW92ZUxpc3RbdV0uYWRkKHZNb3Zlcy5iZWdp
bigpLCB2TW92ZXMuZW5kKCkpOworCisgICAgICAgIGZvckVhY2hBZGphY2VudCh2LCBbdGhpcywg
dV0gKEluZGV4VHlwZSBhZGphY2VudFRtcEluZGV4KSB7CisgICAgICAgICAgICBpZiAoYWRkRWRn
ZURpc3RpbmN0V2l0aG91dERlZ3JlZUNoYW5nZShhZGphY2VudFRtcEluZGV4LCB1KSkgeworICAg
ICAgICAgICAgICAgIC8vIElmIHdlIGFkZGVkIGEgbmV3IGVkZ2UgYmV0d2VlbiB0aGUgYWRqYWNl
bnRUbXAgYW5kIHUsIGl0IHJlcGxhY2VzIHRoZSBlZGdlCisgICAgICAgICAgICAgICAgLy8gdGhh
dCBleGlzdGVkIHdpdGggdi4KKyAgICAgICAgICAgICAgICAvLyBUaGUgZGVncmVlIG9mIGFkamFj
ZW50VG1wIHJlbWFpbnMgdGhlIHNhbWUgc2luY2UgdGhlIGVkZ2UganVzdCBjaGFuZ2VkIGZyb20g
dSB0byB2LgorICAgICAgICAgICAgICAgIC8vIEFsbCB3ZSBuZWVkIHRvIGRvIGlzIHVwZGF0ZSB0
aGUgZGVncmVlIG9mIHUuCisgICAgICAgICAgICAgICAgaWYgKCFpc1ByZWNvbG9yZWQodSkpCisg
ICAgICAgICAgICAgICAgICAgIG1fZGVncmVlc1t1XSsrOworICAgICAgICAgICAgfSBlbHNlIHsK
KyAgICAgICAgICAgICAgICAvLyBJZiB3ZSBhbHJlYWR5IGhhZCBhbiBlZGdlIGJldHdlZW4gdGhl
IGFkamFjZW50VG1wIGFuZCB1LCB0aGUgZGVncmVlIG9mIHUKKyAgICAgICAgICAgICAgICAvLyBp
cyBhbHJlYWR5IGNvcnJlY3QuIFRoZSBkZWdyZWUgb2YgdGhlIGFkamFjZW50VG1wIGRlY3JlYXNl
cyBzaW5jZSB0aGUgZWRnZQorICAgICAgICAgICAgICAgIC8vIHdpdGggdiBpcyBubyBsb25nZXIg
cmVsZXZhbnQgKHdlIGNhbiB0aGluayBvZiBpdCBhcyBtZXJnZWQgd2l0aCB0aGUgZWRnZSB3aXRo
IHUpLgorICAgICAgICAgICAgICAgIGRlY3JlbWVudERlZ3JlZShhZGphY2VudFRtcEluZGV4KTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgaWYgKG1fZnJhbWVQb2ludGVy
SW5kZXggJiYgbV9pbnRlcmZlcmVzV2l0aEZyYW1lUG9pbnRlci5xdWlja0dldCh2KSkKKyAgICAg
ICAgICAgIG1faW50ZXJmZXJlc1dpdGhGcmFtZVBvaW50ZXIucXVpY2tTZXQodSk7CisKKyAgICAg
ICAgaWYgKG1fZGVncmVlc1t1XSA+PSBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpICYmIG1f
ZnJlZXplV29ya2xpc3QucmVtb3ZlKHUpKQorICAgICAgICAgICAgYWRkVG9TcGlsbCh1KTsKKyAg
ICB9CisKKyAgICBib29sIGNhbkJlU2FmZWx5Q29hbGVzY2VkKEluZGV4VHlwZSB1LCBJbmRleFR5
cGUgdikKKyAgICB7CisgICAgICAgIEFTU0VSVCghaXNQcmVjb2xvcmVkKHYpKTsKKyAgICAgICAg
aWYgKGlzUHJlY29sb3JlZCh1KSkKKyAgICAgICAgICAgIHJldHVybiBwcmVjb2xvcmVkQ29hbGVz
Y2luZ0hldXJpc3RpYyh1LCB2KTsKKyAgICAgICAgcmV0dXJuIGNvbnNlcnZhdGl2ZUhldXJpc3Rp
Yyh1LCB2KTsKKyAgICB9CisKKyAgICBib29sIGNvbnNlcnZhdGl2ZUhldXJpc3RpYyhJbmRleFR5
cGUgdSwgSW5kZXhUeXBlIHYpCisgICAgeworICAgICAgICAvLyBUaGlzIGlzIHVzaW5nIHRoZSBC
cmlnZ3MnIGNvbnNlcnZhdGl2ZSBjb2FsZXNjaW5nIHJ1bGU6CisgICAgICAgIC8vIElmIHRoZSBu
dW1iZXIgb2YgY29tYmluZWQgYWRqYWNlbnQgbm9kZSB3aXRoIGEgZGVncmVlID49IEsgaXMgbGVz
cyB0aGFuIEssCisgICAgICAgIC8vIGl0IGlzIHNhZmUgdG8gY29tYmluZSB0aGUgdHdvIG5vZGVz
LiBUaGUgcmVhc29uIGlzIHRoYXQgd2Uga25vdyB0aGF0IGlmIHRoZSBncmFwaAorICAgICAgICAv
LyBpcyBjb2xvcmFibGUsIHdlIGhhdmUgZmV3ZXIgdGhhbiBLIGFkamFjZW50cyB3aXRoIGhpZ2gg
b3JkZXIgYW5kIHRoZXJlIGlzIGEgY29sb3IKKyAgICAgICAgLy8gZm9yIHRoZSBjdXJyZW50IG5v
ZGUuCisgICAgICAgIEFTU0VSVCh1ICE9IHYpOworICAgICAgICBBU1NFUlQoIWlzUHJlY29sb3Jl
ZCh1KSk7CisgICAgICAgIEFTU0VSVCghaXNQcmVjb2xvcmVkKHYpKTsKKworICAgICAgICBjb25z
dCBhdXRvJiBhZGphY2VudHNPZlUgPSBtX2FkamFjZW5jeUxpc3RbdV07CisgICAgICAgIGNvbnN0
IGF1dG8mIGFkamFjZW50c09mViA9IG1fYWRqYWNlbmN5TGlzdFt2XTsKKworICAgICAgICBpZiAo
YWRqYWNlbnRzT2ZVLnNpemUoKSArIGFkamFjZW50c09mVi5zaXplKCkgPCBtX3JlZ3NJblByaW9y
aXR5T3JkZXIuc2l6ZSgpKSB7CisgICAgICAgICAgICAvLyBTaG9ydGN1dDogaWYgdGhlIHRvdGFs
IG51bWJlciBvZiBhZGphY2VudHMgaXMgbGVzcyB0aGFuIHRoZSBudW1iZXIgb2YgcmVnaXN0ZXIs
IHRoZSBjb25kaXRpb24gaXMgYWx3YXlzIG1ldC4KKyAgICAgICAgICAgIHJldHVybiB0cnVlOwor
ICAgICAgICB9CisKKyAgICAgICAgSGFzaFNldDxJbmRleFR5cGU+IGhpZ2hPcmRlckFkamFjZW50
czsKKworICAgICAgICBmb3IgKEluZGV4VHlwZSBhZGphY2VudFRtcEluZGV4IDogYWRqYWNlbnRz
T2ZVKSB7CisgICAgICAgICAgICBBU1NFUlQoYWRqYWNlbnRUbXBJbmRleCAhPSB2KTsKKyAgICAg
ICAgICAgIEFTU0VSVChhZGphY2VudFRtcEluZGV4ICE9IHUpOworICAgICAgICAgICAgaWYgKCFo
YXNCZWVuU2ltcGxpZmllZChhZGphY2VudFRtcEluZGV4KSAmJiBtX2RlZ3JlZXNbYWRqYWNlbnRU
bXBJbmRleF0gPj0gbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKSkgeworICAgICAgICAgICAg
ICAgIGF1dG8gYWRkUmVzdWx0ID0gaGlnaE9yZGVyQWRqYWNlbnRzLmFkZChhZGphY2VudFRtcElu
ZGV4KTsKKyAgICAgICAgICAgICAgICBpZiAoYWRkUmVzdWx0LmlzTmV3RW50cnkgJiYgaGlnaE9y
ZGVyQWRqYWNlbnRzLnNpemUoKSA+PSBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpKQorICAg
ICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0K
KyAgICAgICAgZm9yIChJbmRleFR5cGUgYWRqYWNlbnRUbXBJbmRleCA6IGFkamFjZW50c09mVikg
eworICAgICAgICAgICAgQVNTRVJUKGFkamFjZW50VG1wSW5kZXggIT0gdSk7CisgICAgICAgICAg
ICBBU1NFUlQoYWRqYWNlbnRUbXBJbmRleCAhPSB2KTsKKyAgICAgICAgICAgIGlmICghaGFzQmVl
blNpbXBsaWZpZWQoYWRqYWNlbnRUbXBJbmRleCkgJiYgbV9kZWdyZWVzW2FkamFjZW50VG1wSW5k
ZXhdID49IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBh
dXRvIGFkZFJlc3VsdCA9IGhpZ2hPcmRlckFkamFjZW50cy5hZGQoYWRqYWNlbnRUbXBJbmRleCk7
CisgICAgICAgICAgICAgICAgaWYgKGFkZFJlc3VsdC5pc05ld0VudHJ5ICYmIGhpZ2hPcmRlckFk
amFjZW50cy5zaXplKCkgPj0gbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKSkKKyAgICAgICAg
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAg
ICAgICAgQVNTRVJUKGhpZ2hPcmRlckFkamFjZW50cy5zaXplKCkgPCBtX3JlZ3NJblByaW9yaXR5
T3JkZXIuc2l6ZSgpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCBw
cmVjb2xvcmVkQ29hbGVzY2luZ0hldXJpc3RpYyhJbmRleFR5cGUgdSwgSW5kZXhUeXBlIHYpCisg
ICAgeworICAgICAgICBpZiAodHJhY2VEZWJ1ZykKKyAgICAgICAgICAgIGRhdGFMb2coIiAgICBD
aGVja2luZyBwcmVjb2xvcmVkQ29hbGVzY2luZ0hldXJpc3RpY1xuIik7CisgICAgICAgIEFTU0VS
VChpc1ByZWNvbG9yZWQodSkpOworICAgICAgICBBU1NFUlQoIWlzUHJlY29sb3JlZCh2KSk7Cisg
ICAgICAgIAorICAgICAgICAvLyBJZiB1IGlzIGEgcGlubmVkIHJlZ2lzdGVyIHRoZW4gaXQncyBh
bHdheXMgc2FmZSB0byBjb2FsZXNjZS4gTm90ZSB0aGF0IHdoZW4gd2UgY2FsbCB0aGlzLAorICAg
ICAgICAvLyB3ZSBoYXZlIGFscmVhZHkgcHJvdmVkIHRoYXQgdGhlcmUgaXMgbm8gaW50ZXJmZXJl
bmNlIGJldHdlZW4gdSBhbmQgdi4KKyAgICAgICAgaWYgKCFtX211dGFibGVSZWdzLmdldChtX2Nv
bG9yZWRUbXBbdV0pKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgLy8gSWYg
YW55IGFkamFjZW50IG9mIHRoZSBub24tY29sb3JlZCBub2RlIGlzIG5vdCBhbiBhZGphY2VudCBv
ZiB0aGUgY29sb3JlZCBub2RlIEFORCBoYXMgYSBkZWdyZWUgPj0gSworICAgICAgICAvLyB0aGVy
ZSBpcyBhIHJpc2sgdGhhdCB0aGlzIG5vZGUgbmVlZHMgdG8gaGF2ZSB0aGUgc2FtZSBjb2xvciBh
cyBvdXIgcHJlY29sb3JlZCBub2RlLiBJZiB3ZSBjb2FsZXNjZSBzdWNoCisgICAgICAgIC8vIG1v
dmUsIHdlIG1heSBjcmVhdGUgYW4gdW5jb2xvcmFibGUgZ3JhcGguCisgICAgICAgIGNvbnN0IGF1
dG8mIGFkamFjZW50c09mViA9IG1fYWRqYWNlbmN5TGlzdFt2XTsKKyAgICAgICAgZm9yICh1bnNp
Z25lZCBhZGphY2VudFRtcEluZGV4IDogYWRqYWNlbnRzT2ZWKSB7CisgICAgICAgICAgICBpZiAo
IWlzUHJlY29sb3JlZChhZGphY2VudFRtcEluZGV4KQorICAgICAgICAgICAgICAgICYmICFoYXNC
ZWVuU2ltcGxpZmllZChhZGphY2VudFRtcEluZGV4KQorICAgICAgICAgICAgICAgICYmIG1fZGVn
cmVlc1thZGphY2VudFRtcEluZGV4XSA+PSBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpCisg
ICAgICAgICAgICAgICAgJiYgIW1faW50ZXJmZXJlbmNlRWRnZXMuY29udGFpbnMoSW50ZXJmZXJl
bmNlRWRnZSh1LCBhZGphY2VudFRtcEluZGV4KSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworcHJvdGVjdGVk
OgorI2lmIFBMQVRGT1JNKENPQ09BKQorI3ByYWdtYSBtYXJrIC0KKyNlbmRpZgorCisgICAgLy8g
SW50ZXJmZXJlbmNlIGVkZ2VzIGFyZSBub3QgZGlyZWN0ZWQuIEFuIGVkZ2UgYmV0d2VlbiBhbnkg
dHdvIFRtcHMgaXMgcmVwcmVzZW50ZWQKKyAgICAvLyBieSB0aGUgY29uY2F0ZW5hdGVkIHZhbHVl
cyBvZiB0aGUgc21hbGxlc3QgVG1wIGZvbGxvd2VkIGJ5IHRoZSBiaWdnZXIgVG1wLgorICAgIGNs
YXNzIEludGVyZmVyZW5jZUVkZ2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgSW50ZXJmZXJlbmNl
RWRnZSgpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIEludGVyZmVyZW5jZUVkZ2Uo
SW5kZXhUeXBlIGEsIEluZGV4VHlwZSBiKQorICAgICAgICB7CisgICAgICAgICAgICBBU1NFUlQo
YSk7CisgICAgICAgICAgICBBU1NFUlQoYik7CisgICAgICAgICAgICBBU1NFUlRfV0lUSF9NRVNT
QUdFKGEgIT0gYiwgIkEgVG1wIGNhbiBuZXZlciBpbnRlcmZlcmUgd2l0aCBpdHNlbGYuIERvaW5n
IHNvIHdvdWxkIGZvcmNlIGl0IHRvIGJlIHRoZSBzdXBlcnBvc2l0aW9uIG9mIHR3byByZWdpc3Rl
cnMuIik7CisKKyAgICAgICAgICAgIGlmIChiIDwgYSkKKyAgICAgICAgICAgICAgICBzdGQ6OnN3
YXAoYSwgYik7CisgICAgICAgICAgICBtX3ZhbHVlID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGEp
IDw8IDMyIHwgYjsKKyAgICAgICAgfQorCisgICAgICAgIEludGVyZmVyZW5jZUVkZ2UoV1RGOjpI
YXNoVGFibGVEZWxldGVkVmFsdWVUeXBlKQorICAgICAgICAgICAgOiBtX3ZhbHVlKHN0ZDo6bnVt
ZXJpY19saW1pdHM8dWludDY0X3Q+OjptYXgoKSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAg
ICAgICAgSW5kZXhUeXBlIGZpcnN0KCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0
dXJuIG1fdmFsdWUgPj4gMzIgJiAweGZmZmZmZmZmOworICAgICAgICB9CisKKyAgICAgICAgSW5k
ZXhUeXBlIHNlY29uZCgpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtX3Zh
bHVlICYgMHhmZmZmZmZmZjsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgb3BlcmF0b3I9PShj
b25zdCBJbnRlcmZlcmVuY2VFZGdlIG90aGVyKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAg
ICByZXR1cm4gbV92YWx1ZSA9PSBvdGhlci5tX3ZhbHVlOworICAgICAgICB9CisKKyAgICAgICAg
Ym9vbCBpc0hhc2hUYWJsZURlbGV0ZWRWYWx1ZSgpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAg
ICAgIHJldHVybiAqdGhpcyA9PSBJbnRlcmZlcmVuY2VFZGdlKFdURjo6SGFzaFRhYmxlRGVsZXRl
ZFZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHVuc2lnbmVkIGhhc2goKSBjb25zdAorICAg
ICAgICB7CisgICAgICAgICAgICByZXR1cm4gV1RGOjpJbnRIYXNoPHVpbnQ2NF90Pjo6aGFzaCht
X3ZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYgb3V0
KSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICBvdXQucHJpbnQoZmlyc3QoKSwgIjw9PiIs
IHNlY29uZCgpKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgdWludDY0X3Qg
bV92YWx1ZSB7IDAgfTsKKyAgICB9OworCisgICAgc3RydWN0IEludGVyZmVyZW5jZUVkZ2VIYXNo
IHsKKyAgICAgICAgc3RhdGljIHVuc2lnbmVkIGhhc2goY29uc3QgSW50ZXJmZXJlbmNlRWRnZSYg
a2V5KSB7IHJldHVybiBrZXkuaGFzaCgpOyB9CisgICAgICAgIHN0YXRpYyBib29sIGVxdWFsKGNv
bnN0IEludGVyZmVyZW5jZUVkZ2UmIGEsIGNvbnN0IEludGVyZmVyZW5jZUVkZ2UmIGIpIHsgcmV0
dXJuIGEgPT0gYjsgfQorICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBzYWZlVG9Db21wYXJlVG9F
bXB0eU9yRGVsZXRlZCA9IHRydWU7CisgICAgfTsKKyAgICB0eXBlZGVmIFNpbXBsZUNsYXNzSGFz
aFRyYWl0czxJbnRlcmZlcmVuY2VFZGdlPiBJbnRlcmZlcmVuY2VFZGdlSGFzaFRyYWl0czsKKwor
ICAgIGNvbnN0IFZlY3RvcjxSZWc+JiBtX3JlZ3NJblByaW9yaXR5T3JkZXI7CisgICAgUmVnaXN0
ZXJTZXQgbV9tdXRhYmxlUmVnczsKKyAgICBJbmRleFR5cGUgbV9sYXN0UHJlY29sb3JlZFJlZ2lz
dGVySW5kZXggeyAwIH07CisKKyAgICAvLyBUaGUgaW50ZXJmZXJlbmNlIGdyYXBoLgorICAgIEhh
c2hTZXQ8SW50ZXJmZXJlbmNlRWRnZSwgSW50ZXJmZXJlbmNlRWRnZUhhc2gsIEludGVyZmVyZW5j
ZUVkZ2VIYXNoVHJhaXRzPiBtX2ludGVyZmVyZW5jZUVkZ2VzOworICAgIFZlY3RvcjxWZWN0b3I8
SW5kZXhUeXBlLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdywgND4sIDAsIFVuc2FmZVZlY3Rvck92
ZXJmbG93PiBtX2FkamFjZW5jeUxpc3Q7CisgICAgVmVjdG9yPEluZGV4VHlwZSwgMCwgVW5zYWZl
VmVjdG9yT3ZlcmZsb3c+IG1fZGVncmVlczsKKworICAgIC8vIEluc3RlYWQgb2Yga2VlcGluZyB0
cmFjayBvZiB0aGUgbW92ZSBpbnN0cnVjdGlvbnMsIHdlIGp1c3Qga2VlcCB0aGVpciBvcGVyYW5k
cyBhcm91bmQgYW5kIHVzZSB0aGUgaW5kZXgKKyAgICAvLyBpbiB0aGUgdmVjdG9yIGFzIHRoZSAi
aWRlbnRpZmllciIgZm9yIHRoZSBtb3ZlLgorICAgIHN0cnVjdCBNb3ZlT3BlcmFuZHMgeworICAg
ICAgICBJbmRleFR5cGUgc3JjSW5kZXg7CisgICAgICAgIEluZGV4VHlwZSBkc3RJbmRleDsKKyAg
ICB9OworICAgIFZlY3RvcjxNb3ZlT3BlcmFuZHMsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBt
X2NvYWxlc2NpbmdDYW5kaWRhdGVzOworCisgICAgLy8gTGlzdCBvZiBldmVyeSBtb3ZlIGluc3Ry
dWN0aW9uIGFzc29jaWF0ZWQgd2l0aCBhIFRtcC4KKyAgICBWZWN0b3I8SGFzaFNldDxJbmRleFR5
cGUsIHR5cGVuYW1lIERlZmF1bHRIYXNoPEluZGV4VHlwZT46Okhhc2gsIFdURjo6VW5zaWduZWRX
aXRoWmVyb0tleUhhc2hUcmFpdHM8SW5kZXhUeXBlPj4+IG1fbW92ZUxpc3Q7CisKKyAgICAvLyBD
b2xvcnMuCisgICAgVmVjdG9yPFJlZywgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fY29sb3Jl
ZFRtcDsKKyAgICBWZWN0b3I8SW5kZXhUeXBlPiBtX3NwaWxsZWRUbXBzOworCisgICAgLy8gVmFs
dWVzIHRoYXQgaGF2ZSBiZWVuIGNvYWxlc2NlZCB3aXRoIGFuIG90aGVyIHZhbHVlLgorICAgIFZl
Y3RvcjxJbmRleFR5cGUsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX2NvYWxlc2NlZFRtcHM7
CisKKyAgICAvLyBUaGUgc3RhY2sgb2YgVG1wIHJlbW92ZWQgZnJvbSB0aGUgZ3JhcGggYW5kIHJl
YWR5IGZvciBjb2xvcmluZy4KKyAgICBCaXRWZWN0b3IgbV9pc09uU2VsZWN0U3RhY2s7CisgICAg
VmVjdG9yPEluZGV4VHlwZT4gbV9zZWxlY3RTdGFjazsKKworICAgIEluZGV4VHlwZSBtX2ZyYW1l
UG9pbnRlckluZGV4IHsgMCB9OworICAgIEJpdFZlY3RvciBtX2ludGVyZmVyZXNXaXRoRnJhbWVQ
b2ludGVyOworCisgICAgc3RydWN0IE9yZGVyZWRNb3ZlU2V0IHsKKyAgICAgICAgdW5zaWduZWQg
YWRkTW92ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFTU0VSVChtX2xvd1ByaW9yaXR5TW92
ZUxpc3QuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgIEFTU0VSVCghbV9maXJzdExvd1ByaW9yaXR5
TW92ZUluZGV4KTsKKworICAgICAgICAgICAgdW5zaWduZWQgbmV4dEluZGV4ID0gbV9wb3NpdGlv
bkluTW92ZUxpc3Quc2l6ZSgpOworICAgICAgICAgICAgdW5zaWduZWQgcG9zaXRpb24gPSBtX21v
dmVMaXN0LnNpemUoKTsKKyAgICAgICAgICAgIG1fbW92ZUxpc3QuYXBwZW5kKG5leHRJbmRleCk7
CisgICAgICAgICAgICBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdC5hcHBlbmQocG9zaXRpb24pOworICAg
ICAgICAgICAgcmV0dXJuIG5leHRJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc3Rh
cnRBZGRpbmdMb3dQcmlvcml0eU1vdmVzKCkKKyAgICAgICAgeworICAgICAgICAgICAgQVNTRVJU
KG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5pc0VtcHR5KCkpOworICAgICAgICAgICAgbV9maXJzdExv
d1ByaW9yaXR5TW92ZUluZGV4ID0gbV9tb3ZlTGlzdC5zaXplKCk7CisgICAgICAgIH0KKworICAg
ICAgICB1bnNpZ25lZCBhZGRMb3dQcmlvcml0eU1vdmUoKQorICAgICAgICB7CisgICAgICAgICAg
ICBBU1NFUlQobV9maXJzdExvd1ByaW9yaXR5TW92ZUluZGV4ID09IG1fbW92ZUxpc3Quc2l6ZSgp
KTsKKworICAgICAgICAgICAgdW5zaWduZWQgbmV4dEluZGV4ID0gbV9wb3NpdGlvbkluTW92ZUxp
c3Quc2l6ZSgpOworICAgICAgICAgICAgdW5zaWduZWQgcG9zaXRpb24gPSBtX2xvd1ByaW9yaXR5
TW92ZUxpc3Quc2l6ZSgpOworICAgICAgICAgICAgbV9sb3dQcmlvcml0eU1vdmVMaXN0LmFwcGVu
ZChuZXh0SW5kZXgpOworICAgICAgICAgICAgbV9wb3NpdGlvbkluTW92ZUxpc3QuYXBwZW5kKHBv
c2l0aW9uKTsKKworICAgICAgICAgICAgQVNTRVJUKG5leHRJbmRleCA+PSBtX2ZpcnN0TG93UHJp
b3JpdHlNb3ZlSW5kZXgpOworCisgICAgICAgICAgICByZXR1cm4gbmV4dEluZGV4OworICAgICAg
ICB9CisKKyAgICAgICAgYm9vbCBpc0VtcHR5KCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAg
ICAgcmV0dXJuIG1fbW92ZUxpc3QuaXNFbXB0eSgpICYmIG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5p
c0VtcHR5KCk7CisgICAgICAgIH0KKworICAgICAgICBib29sIGNvbnRhaW5zKHVuc2lnbmVkIGlu
ZGV4KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbV9wb3NpdGlvbkluTW92ZUxpc3Rb
aW5kZXhdICE9IHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgoKTsKKyAgICAgICAg
fQorCisgICAgICAgIHZvaWQgdGFrZU1vdmUodW5zaWduZWQgbW92ZUluZGV4KQorICAgICAgICB7
CisgICAgICAgICAgICB1bnNpZ25lZCBwb3NpdGlvbkluTW92ZUxpc3QgPSBtX3Bvc2l0aW9uSW5N
b3ZlTGlzdFttb3ZlSW5kZXhdOworICAgICAgICAgICAgaWYgKHBvc2l0aW9uSW5Nb3ZlTGlzdCA9
PSBzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4KCkpCisgICAgICAgICAgICAgICAg
cmV0dXJuOworCisgICAgICAgICAgICBpZiAobW92ZUluZGV4IDwgbV9maXJzdExvd1ByaW9yaXR5
TW92ZUluZGV4KSB7CisgICAgICAgICAgICAgICAgQVNTRVJUKG1fbW92ZUxpc3RbcG9zaXRpb25J
bk1vdmVMaXN0XSA9PSBtb3ZlSW5kZXgpOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxhc3RJ
bmRleCA9IG1fbW92ZUxpc3QubGFzdCgpOworICAgICAgICAgICAgICAgIG1fcG9zaXRpb25Jbk1v
dmVMaXN0W2xhc3RJbmRleF0gPSBwb3NpdGlvbkluTW92ZUxpc3Q7CisgICAgICAgICAgICAgICAg
bV9tb3ZlTGlzdFtwb3NpdGlvbkluTW92ZUxpc3RdID0gbGFzdEluZGV4OworICAgICAgICAgICAg
ICAgIG1fbW92ZUxpc3QucmVtb3ZlTGFzdCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgICAgICAgICBBU1NFUlQobV9sb3dQcmlvcml0eU1vdmVMaXN0W3Bvc2l0aW9uSW5Nb3ZlTGlz
dF0gPT0gbW92ZUluZGV4KTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBsYXN0SW5kZXggPSBt
X2xvd1ByaW9yaXR5TW92ZUxpc3QubGFzdCgpOworICAgICAgICAgICAgICAgIG1fcG9zaXRpb25J
bk1vdmVMaXN0W2xhc3RJbmRleF0gPSBwb3NpdGlvbkluTW92ZUxpc3Q7CisgICAgICAgICAgICAg
ICAgbV9sb3dQcmlvcml0eU1vdmVMaXN0W3Bvc2l0aW9uSW5Nb3ZlTGlzdF0gPSBsYXN0SW5kZXg7
CisgICAgICAgICAgICAgICAgbV9sb3dQcmlvcml0eU1vdmVMaXN0LnJlbW92ZUxhc3QoKTsKKyAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgbV9wb3NpdGlvbkluTW92ZUxpc3RbbW92ZUluZGV4
XSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgoKTsKKworICAgICAgICAgICAg
QVNTRVJUKCFjb250YWlucyhtb3ZlSW5kZXgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHVuc2ln
bmVkIHRha2VMYXN0TW92ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFTU0VSVCghaXNFbXB0
eSgpKTsKKworICAgICAgICAgICAgdW5zaWduZWQgbGFzdEluZGV4OworICAgICAgICAgICAgaWYg
KCFtX21vdmVMaXN0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGxhc3RJbmRleCA9IG1f
bW92ZUxpc3QudGFrZUxhc3QoKTsKKyAgICAgICAgICAgICAgICBBU1NFUlQobV9wb3NpdGlvbklu
TW92ZUxpc3RbbGFzdEluZGV4XSA9PSBtX21vdmVMaXN0LnNpemUoKSk7CisgICAgICAgICAgICB9
IGVsc2UgeworICAgICAgICAgICAgICAgIGxhc3RJbmRleCA9IG1fbG93UHJpb3JpdHlNb3ZlTGlz
dC50YWtlTGFzdCgpOworICAgICAgICAgICAgICAgIEFTU0VSVChtX3Bvc2l0aW9uSW5Nb3ZlTGlz
dFtsYXN0SW5kZXhdID09IG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5zaXplKCkpOworICAgICAgICAg
ICAgfQorICAgICAgICAgICAgbV9wb3NpdGlvbkluTW92ZUxpc3RbbGFzdEluZGV4XSA9IHN0ZDo6
bnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgoKTsKKworICAgICAgICAgICAgQVNTRVJUKCFj
b250YWlucyhsYXN0SW5kZXgpKTsKKyAgICAgICAgICAgIHJldHVybiBsYXN0SW5kZXg7CisgICAg
ICAgIH0KKworICAgICAgICB2b2lkIHJldHVybk1vdmUodW5zaWduZWQgaW5kZXgpCisgICAgICAg
IHsKKyAgICAgICAgICAgIC8vIFRoaXMgYXNzZXJ0aW9uIGlzIGEgYml0IHN0cmljdCBidXQgdGhh
dCBpcyBob3cgdGhlIG1vdmUgbGlzdCBzaG91bGQgYmUgdXNlZC4gVGhlIG9ubHkga2luZCBvZiBt
b3ZlcyB0aGF0IGNhbgorICAgICAgICAgICAgLy8gcmV0dXJuIHRvIHRoZSBsaXN0IGFyZSB0aGUg
b25lcyB0aGF0IHdlIHByZXZpb3VzbHkgZmFpbGVkIHRvIGNvYWxlc2NlIHdpdGggdGhlIGNvbnNl
cnZhdGl2ZSBoZXVyaXN0aWNzLgorICAgICAgICAgICAgLy8gVmFsdWVzIHNob3VsZCBub3QgYmUg
YWRkZWQgYmFjayBpZiB0aGV5IHdlcmUgbmV2ZXIgdGFrZW4gb3V0IHdoZW4gYXR0ZW1wdGluZyBj
b2FsZXNjaW5nLgorICAgICAgICAgICAgQVNTRVJUKCFjb250YWlucyhpbmRleCkpOworCisgICAg
ICAgICAgICBpZiAoaW5kZXggPCBtX2ZpcnN0TG93UHJpb3JpdHlNb3ZlSW5kZXgpIHsKKyAgICAg
ICAgICAgICAgICB1bnNpZ25lZCBwb3NpdGlvbiA9IG1fbW92ZUxpc3Quc2l6ZSgpOworICAgICAg
ICAgICAgICAgIG1fbW92ZUxpc3QuYXBwZW5kKGluZGV4KTsKKyAgICAgICAgICAgICAgICBtX3Bv
c2l0aW9uSW5Nb3ZlTGlzdFtpbmRleF0gPSBwb3NpdGlvbjsKKyAgICAgICAgICAgIH0gZWxzZSB7
CisgICAgICAgICAgICAgICAgdW5zaWduZWQgcG9zaXRpb24gPSBtX2xvd1ByaW9yaXR5TW92ZUxp
c3Quc2l6ZSgpOworICAgICAgICAgICAgICAgIG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5hcHBlbmQo
aW5kZXgpOworICAgICAgICAgICAgICAgIG1fcG9zaXRpb25Jbk1vdmVMaXN0W2luZGV4XSA9IHBv
c2l0aW9uOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBU1NFUlQoY29udGFpbnMoaW5k
ZXgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgY2xlYXIoKQorICAgICAgICB7CisgICAg
ICAgICAgICBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdC5jbGVhcigpOworICAgICAgICAgICAgbV9tb3Zl
TGlzdC5jbGVhcigpOworICAgICAgICAgICAgbV9sb3dQcmlvcml0eU1vdmVMaXN0LmNsZWFyKCk7
CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFZlY3Rvcjx1bnNpZ25lZCwgMCwg
VW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fcG9zaXRpb25Jbk1vdmVMaXN0OworICAgICAgICBWZWN0
b3I8dW5zaWduZWQsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX21vdmVMaXN0OworICAgICAg
ICBWZWN0b3I8dW5zaWduZWQsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX2xvd1ByaW9yaXR5
TW92ZUxpc3Q7CisgICAgICAgIHVuc2lnbmVkIG1fZmlyc3RMb3dQcmlvcml0eU1vdmVJbmRleCB7
IDAgfTsKKyAgICB9OworCisgICAgLy8gV29yayBsaXN0cy4KKyAgICAvLyBTZXQgb2YgIm1vdmUi
IGVuYWJsZWQgZm9yIHBvc3NpYmxlIGNvYWxlc2NpbmcuCisgICAgT3JkZXJlZE1vdmVTZXQgbV93
b3JrbGlzdE1vdmVzOworICAgIC8vIFNldCBvZiAibW92ZSIgbm90IHlldCByZWFkeSBmb3IgY29h
bGVzY2luZy4KKyAgICBCaXRWZWN0b3IgbV9hY3RpdmVNb3ZlczsKKyAgICAvLyBMb3ctZGVncmVl
LCBub24tTW92ZSByZWxhdGVkLgorICAgIFZlY3RvcjxJbmRleFR5cGU+IG1fc2ltcGxpZnlXb3Jr
bGlzdDsKKyAgICAvLyBIaWdoLWRlZ3JlZSBUbXAuCisgICAgSGFzaFNldDxJbmRleFR5cGU+IG1f
c3BpbGxXb3JrbGlzdDsKKyAgICAvLyBMb3ctZGVncmVlLCBNb3ZlIHJlbGF0ZWQuCisgICAgSGFz
aFNldDxJbmRleFR5cGU+IG1fZnJlZXplV29ya2xpc3Q7CisKKyAgICBib29sIG1faGFzU2VsZWN0
ZWRTcGlsbCB7IGZhbHNlIH07CisgICAgYm9vbCBtX2hhc0NvYWxlc2NlZE5vblRyaXZpYWxNb3Zl
IHsgZmFsc2UgfTsKKworICAgIC8vIFRoZSBtYXBwaW5nIG9mIFRtcCB0byB0aGVpciBhbGlhcyBm
b3IgTW92ZXMgdGhhdCBhcmUgYWx3YXlzIGNvYWxlc2NpbmcgcmVnYXJkbGVzcyBvZiBzcGlsbGlu
Zy4KKyAgICBWZWN0b3I8SW5kZXhUeXBlLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9jb2Fs
ZXNjZWRUbXBzQXRTcGlsbDsKKyAgICAKKyAgICBjb25zdCBIYXNoU2V0PHVuc2lnbmVkPiYgbV91
bnNwaWxsYWJsZVRtcHM7Cit9OworCisvLyBUaGlzIHBlcmZvcm0gYWxsIHRoZSB0YXNrcyB0aGF0
IGFyZSBzcGVjaWZpYyB0byBjZXJ0YWluIHJlZ2lzdGVyIHR5cGUuCit0ZW1wbGF0ZTxBcmc6OlR5
cGUgdHlwZT4KK2NsYXNzIENvbG9yaW5nQWxsb2NhdG9yIDogcHVibGljIEFic3RyYWN0Q29sb3Jp
bmdBbGxvY2F0b3I8dW5zaWduZWQ+IHsKK3B1YmxpYzoKKyAgICBDb2xvcmluZ0FsbG9jYXRvcihD
b2RlJiBjb2RlLCBUbXBXaWR0aCYgdG1wV2lkdGgsIGNvbnN0IFVzZUNvdW50czxUbXA+JiB1c2VD
b3VudHMsIGNvbnN0IEhhc2hTZXQ8dW5zaWduZWQ+JiB1bnNwaWxsYWJsZVRtcCkKKyAgICAgICAg
OiBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yPHVuc2lnbmVkPihjb2RlLnJlZ3NJblByaW9yaXR5
T3JkZXIodHlwZSksIEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjpsYXN0TWFjaGluZVJlZ2lzdGVy
SW5kZXgoKSwgdG1wQXJyYXlTaXplKGNvZGUpLCB1bnNwaWxsYWJsZVRtcCkKKyAgICAgICAgLCBt
X2NvZGUoY29kZSkKKyAgICAgICAgLCBtX3RtcFdpZHRoKHRtcFdpZHRoKQorICAgICAgICAsIG1f
dXNlQ291bnRzKHVzZUNvdW50cykKKyAgICB7CisgICAgICAgIGlmICh0eXBlID09IEFyZzo6R1Ap
IHsKKyAgICAgICAgICAgIG1fZnJhbWVQb2ludGVySW5kZXggPSBBYnNvbHV0ZVRtcE1hcHBlcjx0
eXBlPjo6YWJzb2x1dGVJbmRleChUbXAoTWFjcm9Bc3NlbWJsZXI6OmZyYW1lUG9pbnRlclJlZ2lz
dGVyKSk7CisgICAgICAgICAgICBtX2ludGVyZmVyZXNXaXRoRnJhbWVQb2ludGVyLmVuc3VyZVNp
emUodG1wQXJyYXlTaXplKGNvZGUpKTsKKyAgICAgICAgfQorCisgICAgICAgIGluaXRpYWxpemVQ
cmVjb2xvcmVkVG1wKCk7CisgICAgICAgIGJ1aWxkKCk7CisgICAgICAgIGFsbG9jYXRlKCk7Cisg
ICAgfQorCisgICAgVG1wIGdldEFsaWFzKFRtcCB0bXApIGNvbnN0CisgICAgeworICAgICAgICBy
ZXR1cm4gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KGdldEFs
aWFzKEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHRtcCkpKTsKKyAgICB9
CisKKyAgICAvLyBUaGlzIHRlbGxzIHlvdSBpZiBhIE1vdmUgd2lsbCBiZSBjb2FsZXNjYWJsZSBp
ZiB0aGUgc3JjIGFuZCBkc3QgZW5kIHVwIG1hdGNoaW5nLiBUaGlzIG1ldGhvZAorICAgIC8vIHJl
bGllcyBvbiBhbiBhbmFseXNpcyB0aGF0IGlzIGludmFsaWRhdGVkIGJ5IHJlZ2lzdGVyIGFsbG9j
YXRpb24sIHNvIHlvdSBpdCdzIG9ubHkgbWVhbmluZ2Z1bCB0bworICAgIC8vIGNhbGwgdGhpcyAq
YmVmb3JlKiByZXBsYWNpbmcgdGhlIFRtcCdzIGluIHRoaXMgSW5zdCB3aXRoIHJlZ2lzdGVycyBv
ciBzcGlsbCBzbG90cy4KKyAgICBib29sIG1heUJlQ29hbGVzY2FibGUoY29uc3QgSW5zdCYgaW5z
dCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtYXlCZUNvYWxlc2NhYmxlSW1wbChpbnN0
LCAmbV90bXBXaWR0aCk7CisgICAgfQorCisgICAgYm9vbCBpc1VzZWxlc3NNb3ZlKGNvbnN0IElu
c3QmIGluc3QpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbWF5QmVDb2FsZXNjYWJsZUlt
cGwoaW5zdCwgbnVsbHB0cikgJiYgaW5zdC5hcmdzWzBdLnRtcCgpID09IGluc3QuYXJnc1sxXS50
bXAoKTsKKyAgICB9CisKKyAgICBUbXAgZ2V0QWxpYXNXaGVuU3BpbGxpbmcoVG1wIHRtcCkgY29u
c3QKKyAgICB7CisgICAgICAgIEFTU0VSVF9XSVRIX01FU1NBR0UoIW1fc3BpbGxlZFRtcHMuaXNF
bXB0eSgpLCAiVGhpcyBmdW5jdGlvbiBpcyBvbmx5IHZhbGlkIGZvciBjb2FsZXNjaW5nIGR1cmlu
ZyBzcGlsbGluZy4iKTsKKworICAgICAgICBpZiAobV9jb2FsZXNjZWRUbXBzQXRTcGlsbC5pc0Vt
cHR5KCkpCisgICAgICAgICAgICByZXR1cm4gdG1wOworCisgICAgICAgIHVuc2lnbmVkIGFsaWFz
SW5kZXggPSBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh0bXApOworICAg
ICAgICB3aGlsZSAodW5zaWduZWQgbmV4dEFsaWFzSW5kZXggPSBtX2NvYWxlc2NlZFRtcHNBdFNw
aWxsW2FsaWFzSW5kZXhdKQorICAgICAgICAgICAgYWxpYXNJbmRleCA9IG5leHRBbGlhc0luZGV4
OworCisgICAgICAgIFRtcCBhbGlhcyA9IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9t
QWJzb2x1dGVJbmRleChhbGlhc0luZGV4KTsKKworICAgICAgICBBU1NFUlRfV0lUSF9NRVNTQUdF
KCFtX3NwaWxsZWRUbXBzLmNvbnRhaW5zKGFsaWFzSW5kZXgpIHx8IGFsaWFzID09IHRtcCwgIlRo
ZSBhbGlhc2VzIGF0IHNwaWxsIHNob3VsZCBhbHdheXMgYmUgY29sb3JhYmxlLiBTb21ldGhpbmcg
d2VudCBob3JyaWJseSB3cm9uZy4iKTsKKworICAgICAgICByZXR1cm4gYWxpYXM7CisgICAgfQor
CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSW5kZXhJdGVyYXRvcj4KKyAgICBjbGFzcyBJbmRleFRv
VG1wSXRlcmF0b3JBZGFwdG9yIHsKKyAgICBwdWJsaWM6CisgICAgICAgIEluZGV4VG9UbXBJdGVy
YXRvckFkYXB0b3IoSW5kZXhJdGVyYXRvciYmIGluZGV4SXRlcmF0b3IpCisgICAgICAgICAgICA6
IG1faW5kZXhJdGVyYXRvcihXVEZNb3ZlKGluZGV4SXRlcmF0b3IpKQorICAgICAgICB7CisgICAg
ICAgIH0KKworICAgICAgICBUbXAgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gQWJzb2x1dGVU
bXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KCptX2luZGV4SXRlcmF0b3IpOyB9
CisgICAgICAgIEluZGV4VG9UbXBJdGVyYXRvckFkYXB0b3ImIG9wZXJhdG9yKysoKSB7ICsrbV9p
bmRleEl0ZXJhdG9yOyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgICBib29sIG9wZXJhdG9yPT0o
Y29uc3QgSW5kZXhUb1RtcEl0ZXJhdG9yQWRhcHRvciYgb3RoZXIpIGNvbnN0CisgICAgICAgIHsK
KyAgICAgICAgICAgIHJldHVybiBtX2luZGV4SXRlcmF0b3IgPT0gb3RoZXIubV9pbmRleEl0ZXJh
dG9yOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEluZGV4VG9U
bXBJdGVyYXRvckFkYXB0b3ImIG90aGVyKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICBy
ZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAg
ICAgIEluZGV4SXRlcmF0b3IgbV9pbmRleEl0ZXJhdG9yOworICAgIH07CisKKyAgICB0ZW1wbGF0
ZTx0eXBlbmFtZSBDb2xsZWN0aW9uPgorICAgIGNsYXNzIEluZGV4VG9UbXBJdGVyYWJsZUFkYXB0
b3IgeworICAgIHB1YmxpYzoKKyAgICAgICAgSW5kZXhUb1RtcEl0ZXJhYmxlQWRhcHRvcihjb25z
dCBDb2xsZWN0aW9uJiBjb2xsZWN0aW9uKQorICAgICAgICAgICAgOiBtX2NvbGxlY3Rpb24oY29s
bGVjdGlvbikKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgSW5kZXhUb1RtcEl0ZXJh
dG9yQWRhcHRvcjx0eXBlbmFtZSBDb2xsZWN0aW9uOjpjb25zdF9pdGVyYXRvcj4gYmVnaW4oKSBj
b25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbV9jb2xsZWN0aW9uLmJlZ2luKCk7
CisgICAgICAgIH0KKworICAgICAgICBJbmRleFRvVG1wSXRlcmF0b3JBZGFwdG9yPHR5cGVuYW1l
IENvbGxlY3Rpb246OmNvbnN0X2l0ZXJhdG9yPiBlbmQoKSBjb25zdAorICAgICAgICB7CisgICAg
ICAgICAgICByZXR1cm4gbV9jb2xsZWN0aW9uLmVuZCgpOworICAgICAgICB9CisKKyAgICBwcml2
YXRlOgorICAgICAgICBjb25zdCBDb2xsZWN0aW9uJiBtX2NvbGxlY3Rpb247CisgICAgfTsKKwor
ICAgIEluZGV4VG9UbXBJdGVyYWJsZUFkYXB0b3I8VmVjdG9yPHVuc2lnbmVkPj4gc3BpbGxlZFRt
cHMoKSBjb25zdCB7IHJldHVybiBtX3NwaWxsZWRUbXBzOyB9CisKKyAgICBib29sIHJlcXVpcmVz
U3BpbGxpbmcoKSBjb25zdCB7IHJldHVybiAhbV9zcGlsbGVkVG1wcy5pc0VtcHR5KCk7IH0KKwor
ICAgIFJlZyBhbGxvY2F0ZWRSZWcoVG1wIHRtcCkgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VS
VCghdG1wLmlzUmVnKCkpOworICAgICAgICBBU1NFUlQobV9jb2xvcmVkVG1wLnNpemUoKSk7Cisg
ICAgICAgIEFTU0VSVCh0bXAuaXNHUCgpID09ICh0eXBlID09IEFyZzo6R1ApKTsKKworICAgICAg
ICBSZWcgcmVnID0gbV9jb2xvcmVkVG1wW0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0
ZUluZGV4KHRtcCldOworICAgICAgICBpZiAoIXJlZykgeworICAgICAgICAgICAgZGF0YUxvZygi
RkFUQUw6IE5vIGNvbG9yIGZvciAiLCB0bXAsICJcbiIpOworICAgICAgICAgICAgZGF0YUxvZygi
Q29kZTpcbiIpOworICAgICAgICAgICAgZGF0YUxvZyhtX2NvZGUpOworICAgICAgICAgICAgUkVM
RUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVn
OworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGF0aWMgdW5zaWduZWQgdG1wQXJyYXlTaXplKENv
ZGUmIGNvZGUpCisgICAgeworICAgICAgICB1bnNpZ25lZCBudW1UbXBzID0gY29kZS5udW1UbXBz
KHR5cGUpOworICAgICAgICByZXR1cm4gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRl
SW5kZXgobnVtVG1wcyk7CisgICAgfQorCisgICAgdm9pZCBpbml0aWFsaXplUHJlY29sb3JlZFRt
cCgpCisgICAgeworICAgICAgICBtX2NvbG9yZWRUbXAucmVzaXplKG1fbGFzdFByZWNvbG9yZWRS
ZWdpc3RlckluZGV4ICsgMSk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDE7IGkgPD0gbV9s
YXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXg7ICsraSkgeworICAgICAgICAgICAgVG1wIHRtcCA9
IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleChpKTsKKyAgICAg
ICAgICAgIEFTU0VSVCh0bXAuaXNSZWcoKSk7CisgICAgICAgICAgICBtX2NvbG9yZWRUbXBbaV0g
PSB0bXAucmVnKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIG1heUJlQ29hbGVzY2Vk
KEFyZyBsZWZ0LCBBcmcgcmlnaHQpCisgICAgeworICAgICAgICBpZiAoIWxlZnQuaXNUbXAoKSB8
fCAhcmlnaHQuaXNUbXAoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBU
bXAgbGVmdFRtcCA9IGxlZnQudG1wKCk7CisgICAgICAgIFRtcCByaWdodFRtcCA9IHJpZ2h0LnRt
cCgpOworCisgICAgICAgIGlmIChsZWZ0VG1wID09IHJpZ2h0VG1wKQorICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgICAgIGlmIChsZWZ0VG1wLmlzR1AoKSAhPSAodHlwZSA9PSBBcmc6
OkdQKSB8fCByaWdodFRtcC5pc0dQKCkgIT0gKHR5cGUgPT0gQXJnOjpHUCkpCisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgdW5zaWduZWQgbGVmdEluZGV4ID0gQWJzb2x1dGVU
bXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgobGVmdFRtcCk7CisgICAgICAgIHVuc2lnbmVk
IHJpZ2h0SW5kZXggPSBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChyaWdo
dFRtcCk7CisKKyAgICAgICAgcmV0dXJuICFtX2ludGVyZmVyZW5jZUVkZ2VzLmNvbnRhaW5zKElu
dGVyZmVyZW5jZUVkZ2UobGVmdEluZGV4LCByaWdodEluZGV4KSk7CisgICAgfQorCisgICAgdm9p
ZCBhZGRUb0xvd1ByaW9yaXR5Q29hbGVzY2luZ0NhbmRpZGF0ZXMoQXJnIGxlZnQsIEFyZyByaWdo
dCkKKyAgICB7CisgICAgICAgIEFTU0VSVChtYXlCZUNvYWxlc2NlZChsZWZ0LCByaWdodCkpOwor
ICAgICAgICBUbXAgbGVmdFRtcCA9IGxlZnQudG1wKCk7CisgICAgICAgIFRtcCByaWdodFRtcCA9
IHJpZ2h0LnRtcCgpOworCisgICAgICAgIHVuc2lnbmVkIGxlZnRJbmRleCA9IEFic29sdXRlVG1w
TWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KGxlZnRUbXApOworICAgICAgICB1bnNpZ25lZCBy
aWdodEluZGV4ID0gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgocmlnaHRU
bXApOworCisgICAgICAgIHVuc2lnbmVkIG5leHRNb3ZlSW5kZXggPSBtX2NvYWxlc2NpbmdDYW5k
aWRhdGVzLnNpemUoKTsKKyAgICAgICAgbV9jb2FsZXNjaW5nQ2FuZGlkYXRlcy5hcHBlbmQoeyBs
ZWZ0SW5kZXgsIHJpZ2h0SW5kZXggfSk7CisKKyAgICAgICAgdW5zaWduZWQgbmV3SW5kZXhJbldv
cmtsaXN0ID0gbV93b3JrbGlzdE1vdmVzLmFkZExvd1ByaW9yaXR5TW92ZSgpOworICAgICAgICBB
U1NFUlRfVU5VU0VEKG5ld0luZGV4SW5Xb3JrbGlzdCwgbmV3SW5kZXhJbldvcmtsaXN0ID09IG5l
eHRNb3ZlSW5kZXgpOworCisgICAgICAgIEFTU0VSVChuZXh0TW92ZUluZGV4IDw9IG1fYWN0aXZl
TW92ZXMuc2l6ZSgpKTsKKyAgICAgICAgbV9hY3RpdmVNb3Zlcy5lbnN1cmVTaXplKG5leHRNb3Zl
SW5kZXggKyAxKTsKKworICAgICAgICBtX21vdmVMaXN0W2xlZnRJbmRleF0uYWRkKG5leHRNb3Zl
SW5kZXgpOworICAgICAgICBtX21vdmVMaXN0W3JpZ2h0SW5kZXhdLmFkZChuZXh0TW92ZUluZGV4
KTsKKyAgICB9CisKKyAgICB2b2lkIGJ1aWxkKCkKKyAgICB7CisgICAgICAgIFRtcExpdmVuZXNz
PHR5cGU+IGxpdmVuZXNzKG1fY29kZSk7CisgICAgICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sg
OiBtX2NvZGUpIHsKKyAgICAgICAgICAgIHR5cGVuYW1lIFRtcExpdmVuZXNzPHR5cGU+OjpMb2Nh
bENhbGMgbG9jYWxDYWxjKGxpdmVuZXNzLCBibG9jayk7CisgICAgICAgICAgICBmb3IgKHVuc2ln
bmVkIGluc3RJbmRleCA9IGJsb2NrLT5zaXplKCk7IGluc3RJbmRleC0tOykgeworICAgICAgICAg
ICAgICAgIEluc3QmIGluc3QgPSBibG9jay0+YXQoaW5zdEluZGV4KTsKKyAgICAgICAgICAgICAg
ICBJbnN0KiBuZXh0SW5zdCA9IGJsb2NrLT5nZXQoaW5zdEluZGV4ICsgMSk7CisgICAgICAgICAg
ICAgICAgYnVpbGQoJmluc3QsIG5leHRJbnN0LCBsb2NhbENhbGMpOworICAgICAgICAgICAgICAg
IGxvY2FsQ2FsYy5leGVjdXRlKGluc3RJbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAg
ICBidWlsZChudWxscHRyLCAmYmxvY2stPmF0KDApLCBsb2NhbENhbGMpOworICAgICAgICB9Cisg
ICAgICAgIGJ1aWxkTG93UHJpb3JpdHlNb3ZlTGlzdCgpOworICAgIH0KKworICAgIHZvaWQgYnVp
bGQoSW5zdCogcHJldkluc3QsIEluc3QqIG5leHRJbnN0LCBjb25zdCB0eXBlbmFtZSBUbXBMaXZl
bmVzczx0eXBlPjo6TG9jYWxDYWxjJiBsb2NhbENhbGMpCisgICAgeworICAgICAgICBpZiAodHJh
Y2VEZWJ1ZykKKyAgICAgICAgICAgIGRhdGFMb2coIkJ1aWxkaW5nIGJldHdlZW4gIiwgcG9pbnRl
ckR1bXAocHJldkluc3QpLCAiIGFuZCAiLCBwb2ludGVyRHVtcChuZXh0SW5zdCksICI6XG4iKTsK
KyAgICAgICAgSW5zdDo6Zm9yRWFjaERlZldpdGhFeHRyYUNsb2JiZXJlZFJlZ3M8VG1wPigKKyAg
ICAgICAgICAgIHByZXZJbnN0LCBuZXh0SW5zdCwKKyAgICAgICAgICAgIFsmXSAoY29uc3QgVG1w
JiBhcmcsIEFyZzo6Um9sZSwgQXJnOjpUeXBlIGFyZ1R5cGUsIEFyZzo6V2lkdGgpIHsKKyAgICAg
ICAgICAgICAgICBpZiAoYXJnVHlwZSAhPSB0eXBlKQorICAgICAgICAgICAgICAgICAgICByZXR1
cm47CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gQWxsIHRoZSBEZWYoKXMg
aW50ZXJmZXJlIHdpdGggZWFjaCBvdGhlciBhbmQgd2l0aCBhbGwgdGhlIGV4dHJhIGNsb2JiZXJl
ZCBUbXBzLgorICAgICAgICAgICAgICAgIC8vIFdlIHNob3VsZCBub3QgdXNlIGZvckVhY2hEZWZX
aXRoRXh0cmFDbG9iYmVyZWRSZWdzKCkgaGVyZSBzaW5jZSBjb2xvcmVkIFRtcHMKKyAgICAgICAg
ICAgICAgICAvLyBkbyBub3QgbmVlZCBpbnRlcmZlcmVuY2UgZWRnZXMgaW4gb3VyIGltcGxlbWVu
dGF0aW9uLgorICAgICAgICAgICAgICAgIEluc3Q6OmZvckVhY2hEZWY8VG1wPigKKyAgICAgICAg
ICAgICAgICAgICAgcHJldkluc3QsIG5leHRJbnN0LAorICAgICAgICAgICAgICAgICAgICBbJl0g
KFRtcCYgb3RoZXJBcmcsIEFyZzo6Um9sZSwgQXJnOjpUeXBlIGFyZ1R5cGUsIEFyZzo6V2lkdGgp
IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdUeXBlICE9IHR5cGUpCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgCisg
ICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBkYXRhTG9nKCIgICAgQWRkaW5nIGRlZi1kZWYgZWRnZTogIiwgYXJnLCAiLCAi
LCBvdGhlckFyZywgIlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5hZGRFZGdl
KGFyZywgb3RoZXJBcmcpOworICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0p
OworCisgICAgICAgIGlmIChwcmV2SW5zdCAmJiBtYXlCZUNvYWxlc2NhYmxlKCpwcmV2SW5zdCkp
IHsKKyAgICAgICAgICAgIC8vIFdlIGRvIG5vdCB3YW50IHRoZSBVc2UoKSBvZiB0aGlzIG1vdmUg
dG8gaW50ZXJmZXJlIHdpdGggdGhlIERlZigpLCBldmVuIGlmIGl0IGlzIGxpdmUKKyAgICAgICAg
ICAgIC8vIGFmdGVyIHRoZSBNb3ZlLiBJZiB3ZSB3ZXJlIHRvIGFkZCB0aGUgaW50ZXJmZXJlbmNl
IGVkZ2UsIGl0IHdvdWxkIGJlIGltcG9zc2libGUgdG8KKyAgICAgICAgICAgIC8vIGNvYWxlc2Nl
IHRoZSBNb3ZlIGV2ZW4gaWYgdGhlIHR3byBUbXAgbmV2ZXIgaW50ZXJmZXJlIGFueXdoZXJlLgor
ICAgICAgICAgICAgVG1wIGRlZlRtcDsKKyAgICAgICAgICAgIFRtcCB1c2VUbXA7CisgICAgICAg
ICAgICBwcmV2SW5zdC0+Zm9yRWFjaFRtcChbJmRlZlRtcCwgJnVzZVRtcF0gKFRtcCYgYXJnVG1w
LCBBcmc6OlJvbGUgcm9sZSwgQXJnOjpUeXBlLCBBcmc6OldpZHRoKSB7CisgICAgICAgICAgICAg
ICAgaWYgKEFyZzo6aXNMYXRlRGVmKHJvbGUpKQorICAgICAgICAgICAgICAgICAgICBkZWZUbXAg
PSBhcmdUbXA7CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFT
U0VSVChBcmc6OmlzRWFybHlVc2Uocm9sZSkpOworICAgICAgICAgICAgICAgICAgICB1c2VUbXAg
PSBhcmdUbXA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAg
ICBBU1NFUlQoZGVmVG1wKTsKKyAgICAgICAgICAgIEFTU0VSVCh1c2VUbXApOworCisgICAgICAg
ICAgICB1bnNpZ25lZCBuZXh0TW92ZUluZGV4ID0gbV9jb2FsZXNjaW5nQ2FuZGlkYXRlcy5zaXpl
KCk7CisgICAgICAgICAgICBtX2NvYWxlc2NpbmdDYW5kaWRhdGVzLmFwcGVuZCh7IEFic29sdXRl
VG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHVzZVRtcCksIEFic29sdXRlVG1wTWFwcGVy
PHR5cGU+OjphYnNvbHV0ZUluZGV4KGRlZlRtcCkgfSk7CisKKyAgICAgICAgICAgIHVuc2lnbmVk
IG5ld0luZGV4SW5Xb3JrbGlzdCA9IG1fd29ya2xpc3RNb3Zlcy5hZGRNb3ZlKCk7CisgICAgICAg
ICAgICBBU1NFUlRfVU5VU0VEKG5ld0luZGV4SW5Xb3JrbGlzdCwgbmV3SW5kZXhJbldvcmtsaXN0
ID09IG5leHRNb3ZlSW5kZXgpOworCisgICAgICAgICAgICBBU1NFUlQobmV4dE1vdmVJbmRleCA8
PSBtX2FjdGl2ZU1vdmVzLnNpemUoKSk7CisgICAgICAgICAgICBtX2FjdGl2ZU1vdmVzLmVuc3Vy
ZVNpemUobmV4dE1vdmVJbmRleCArIDEpOworCisgICAgICAgICAgICBmb3IgKGNvbnN0IEFyZyYg
YXJnIDogcHJldkluc3QtPmFyZ3MpIHsKKyAgICAgICAgICAgICAgICBhdXRvJiBsaXN0ID0gbV9t
b3ZlTGlzdFtBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChhcmcudG1wKCkp
XTsKKyAgICAgICAgICAgICAgICBsaXN0LmFkZChuZXh0TW92ZUluZGV4KTsKKyAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgZm9yIChjb25zdCBUbXAmIGxpdmVUbXAgOiBsb2NhbENhbGMubGl2
ZSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGxpdmVUbXAgIT0gdXNlVG1wKSB7CisgICAgICAg
ICAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQorICAgICAgICAgICAgICAgICAgICAgICAgZGF0
YUxvZygiICAgIEFkZGluZyBkZWYtbGl2ZSBmb3IgY29hbGVzY2FibGU6ICIsIGRlZlRtcCwgIiwg
IiwgbGl2ZVRtcCwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIGFkZEVkZ2UoZGVmVG1wLCBs
aXZlVG1wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
IC8vIFRoZSBuZXh0IGluc3RydWN0aW9uIGNvdWxkIGhhdmUgZWFybHkgY2xvYmJlcnMgb3IgZWFy
bHkgZGVmJ3MuIFdlIG5lZWQgdG8gY29uc2lkZXIKKyAgICAgICAgICAgIC8vIHRob3NlIG5vdy4K
KyAgICAgICAgICAgIGFkZEVkZ2VzKG51bGxwdHIsIG5leHRJbnN0LCBsb2NhbENhbGMubGl2ZSgp
KTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBhZGRFZGdlcyhwcmV2SW5zdCwgbmV4dElu
c3QsIGxvY2FsQ2FsYy5saXZlKCkpOworICAgIH0KKworICAgIHZvaWQgYnVpbGRMb3dQcmlvcml0
eU1vdmVMaXN0KCkKKyAgICB7CisgICAgICAgIGlmICghaXNYODYoKSkKKyAgICAgICAgICAgIHJl
dHVybjsKKworICAgICAgICBtX3dvcmtsaXN0TW92ZXMuc3RhcnRBZGRpbmdMb3dQcmlvcml0eU1v
dmVzKCk7CisgICAgICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBtX2NvZGUpIHsKKyAgICAg
ICAgICAgIGZvciAoSW5zdCYgaW5zdCA6ICpibG9jaykgeworICAgICAgICAgICAgICAgIGlmIChz
dGQ6Om9wdGlvbmFsPHVuc2lnbmVkPiBkZWZBcmdJbmRleCA9IGluc3Quc2hvdWxkVHJ5QWxpYXNp
bmdEZWYoKSkgeworICAgICAgICAgICAgICAgICAgICBBcmcgb3AxID0gaW5zdC5hcmdzWypkZWZB
cmdJbmRleCAtIDJdOworICAgICAgICAgICAgICAgICAgICBBcmcgb3AyID0gaW5zdC5hcmdzWypk
ZWZBcmdJbmRleCAtIDFdOworICAgICAgICAgICAgICAgICAgICBBcmcgZGVzdCA9IGluc3QuYXJn
c1sqZGVmQXJnSW5kZXhdOworCisgICAgICAgICAgICAgICAgICAgIGlmIChvcDEgPT0gZGVzdCB8
fCBvcDIgPT0gZGVzdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAg
ICAgICAgICAgICAgICAgIGlmIChtYXlCZUNvYWxlc2NlZChvcDEsIGRlc3QpKQorICAgICAgICAg
ICAgICAgICAgICAgICAgYWRkVG9Mb3dQcmlvcml0eUNvYWxlc2NpbmdDYW5kaWRhdGVzKG9wMSwg
ZGVzdCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvcDEgIT0gb3AyICYmIG1heUJlQ29hbGVz
Y2VkKG9wMiwgZGVzdCkpCisgICAgICAgICAgICAgICAgICAgICAgICBhZGRUb0xvd1ByaW9yaXR5
Q29hbGVzY2luZ0NhbmRpZGF0ZXMob3AyLCBkZXN0KTsKKyAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGFkZEVkZ2VzKEluc3QqIHBy
ZXZJbnN0LCBJbnN0KiBuZXh0SW5zdCwgdHlwZW5hbWUgVG1wTGl2ZW5lc3M8dHlwZT46OkxvY2Fs
Q2FsYzo6SXRlcmFibGUgbGl2ZVRtcHMpCisgICAgeworICAgICAgICAvLyBBbGwgdGhlIERlZigp
cyBpbnRlcmZlcmUgd2l0aCBldmVydGhpbmcgbGl2ZS4KKyAgICAgICAgSW5zdDo6Zm9yRWFjaERl
ZldpdGhFeHRyYUNsb2JiZXJlZFJlZ3M8VG1wPigKKyAgICAgICAgICAgIHByZXZJbnN0LCBuZXh0
SW5zdCwKKyAgICAgICAgICAgIFsmXSAoY29uc3QgVG1wJiBhcmcsIEFyZzo6Um9sZSwgQXJnOjpU
eXBlIGFyZ1R5cGUsIEFyZzo6V2lkdGgpIHsKKyAgICAgICAgICAgICAgICBpZiAoYXJnVHlwZSAh
PSB0eXBlKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgCisg
ICAgICAgICAgICAgICAgZm9yIChjb25zdCBUbXAmIGxpdmVUbXAgOiBsaXZlVG1wcykgeworICAg
ICAgICAgICAgICAgICAgICBBU1NFUlQobGl2ZVRtcC5pc0dQKCkgPT0gKHR5cGUgPT0gQXJnOjpH
UCkpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNl
RGVidWcpCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhTG9nKCIgICAgQWRkaW5nIGRlZi1s
aXZlIGVkZ2U6ICIsIGFyZywgIiwgIiwgbGl2ZVRtcCwgIlxuIik7CisgICAgICAgICAgICAgICAg
ICAgIAorICAgICAgICAgICAgICAgICAgICBhZGRFZGdlKGFyZywgbGl2ZVRtcCk7CisgICAgICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gQXJnOjpHUCAmJiAhYXJn
LmlzR1BSKCkpCisgICAgICAgICAgICAgICAgICAgIG1faW50ZXJmZXJlc1dpdGhGcmFtZVBvaW50
ZXIucXVpY2tTZXQoQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgoYXJnKSk7
CisgICAgICAgICAgICB9KTsKKyAgICB9CisKKyAgICB2b2lkIGFkZEVkZ2UoVG1wIGEsIFRtcCBi
KQorICAgIHsKKyAgICAgICAgQVNTRVJUX1dJVEhfTUVTU0FHRShhLmlzR1AoKSA9PSBiLmlzR1Ao
KSwgIkFuIGludGVyZmVyZW5jZSBiZXR3ZWVuIHJlZ2lzdGVycyBvZiBkaWZmZXJlbnQgdHlwZXMg
ZG9lcyBub3QgbWFrZSBzZW5zZSwgaXQgY2FuIGxlYWQgdG8gbm9uLWNvbG9yYWJsZSBncmFwaHMu
Iik7CisKKyAgICAgICAgYWRkRWRnZShBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJ
bmRleChhKSwgQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgoYikpOworICAg
IH0KKworICAgIC8vIENhbGxpbmcgdGhpcyB3aXRob3V0IGEgdG1wV2lkdGggd2lsbCBwZXJmb3Jt
IGEgbW9yZSBjb25zZXJ2YXRpdmUgY29hbGVzY2luZyBhbmFseXNpcyB0aGF0IGFzc3VtZXMKKyAg
ICAvLyB0aGF0IE1vdmUzMidzIGFyZSBub3QgY29hbGVzY2FibGUuCisgICAgc3RhdGljIGJvb2wg
bWF5QmVDb2FsZXNjYWJsZUltcGwoY29uc3QgSW5zdCYgaW5zdCwgVG1wV2lkdGgqIHRtcFdpZHRo
KQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgQXJnOjpHUDoK
KyAgICAgICAgICAgIHN3aXRjaCAoaW5zdC5raW5kLm9wY29kZSkgeworICAgICAgICAgICAgY2Fz
ZSBNb3ZlOgorICAgICAgICAgICAgY2FzZSBNb3ZlMzI6CisgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFyZzo6RlA6Cisg
ICAgICAgICAgICBzd2l0Y2ggKGluc3Qua2luZC5vcGNvZGUpIHsKKyAgICAgICAgICAgIGNhc2Ug
TW92ZUZsb2F0OgorICAgICAgICAgICAgY2FzZSBNb3ZlRG91YmxlOgorICAgICAgICAgICAgICAg
IGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAg
ICAgIEFTU0VSVF9XSVRIX01FU1NBR0UoaW5zdC5hcmdzLnNpemUoKSA9PSAyLCAiV2UgYXNzdW1l
IGNvYWxlY2FibGUgbW92ZXMgb25seSBoYXZlIHR3byBhcmd1bWVudHMgaW4gYSBmZXcgcGxhY2Vz
LiIpOworCisgICAgICAgIGlmICghaW5zdC5hcmdzWzBdLmlzVG1wKCkgfHwgIWluc3QuYXJnc1sx
XS5pc1RtcCgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIEFTU0VSVChp
bnN0LmFyZ3NbMF0udHlwZSgpID09IHR5cGUpOworICAgICAgICBBU1NFUlQoaW5zdC5hcmdzWzFd
LnR5cGUoKSA9PSB0eXBlKTsKKworICAgICAgICAvLyBXZSBjYW4gY29hbGVzY2UgYSBNb3ZlMzIg
c28gbG9uZyBhcyBlaXRoZXIgb2YgdGhlIGZvbGxvd2luZyBob2xkczoKKyAgICAgICAgLy8gLSBU
aGUgaW5wdXQgaXMgYWxyZWFkeSB6ZXJvLWZpbGxlZC4KKyAgICAgICAgLy8gLSBUaGUgb3V0cHV0
IG9ubHkgY2FyZXMgYWJvdXQgdGhlIGxvdyAzMiBiaXRzLgorICAgICAgICAvLworICAgICAgICAv
LyBOb3RlIHRoYXQgdGhlIGlucHV0IHByb3BlcnR5IHJlcXVpcmVzIGFuIGFuYWx5c2lzIG92ZXIg
WkRlZidzLCBzbyBpdCdzIG9ubHkgdmFsaWQgc28gbG9uZworICAgICAgICAvLyBhcyB0aGUgaW5w
dXQgZ2V0cyBhIHJlZ2lzdGVyLiBXZSBkb24ndCBrbm93IGlmIHRoZSBpbnB1dCBnZXRzIGEgcmVn
aXN0ZXIsIGJ1dCB3ZSBkbyBrbm93CisgICAgICAgIC8vIHRoYXQgaWYgaXQgZG9lc24ndCBnZXQg
YSByZWdpc3RlciB0aGVuIHdlIHdpbGwgc3RpbGwgZW1pdCB0aGlzIE1vdmUzMi4KKyAgICAgICAg
aWYgKGluc3Qua2luZC5vcGNvZGUgPT0gTW92ZTMyKSB7CisgICAgICAgICAgICBpZiAoIXRtcFdp
ZHRoKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgaWYgKHRt
cFdpZHRoLT5kZWZXaWR0aChpbnN0LmFyZ3NbMF0udG1wKCkpID4gQXJnOjpXaWR0aDMyCisgICAg
ICAgICAgICAgICAgJiYgdG1wV2lkdGgtPnVzZVdpZHRoKGluc3QuYXJnc1sxXS50bXAoKSkgPiBB
cmc6OldpZHRoMzIpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9Cisg
ICAgICAgIAorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2b2lkIHNlbGVjdFNw
aWxsKCkKKyAgICB7CisgICAgICAgIGlmICghbV9oYXNTZWxlY3RlZFNwaWxsKSB7CisgICAgICAg
ICAgICBtX2hhc1NlbGVjdGVkU3BpbGwgPSB0cnVlOworCisgICAgICAgICAgICBpZiAobV9oYXND
b2FsZXNjZWROb25Ucml2aWFsTW92ZSkKKyAgICAgICAgICAgICAgICBtX2NvYWxlc2NlZFRtcHNB
dFNwaWxsID0gbV9jb2FsZXNjZWRUbXBzOworICAgICAgICB9CisKKyAgICAgICAgYXV0byBpdGVy
YXRvciA9IG1fc3BpbGxXb3JrbGlzdC5iZWdpbigpOworCisgICAgICAgIFJFTEVBU0VfQVNTRVJU
X1dJVEhfTUVTU0FHRShpdGVyYXRvciAhPSBtX3NwaWxsV29ya2xpc3QuZW5kKCksICJzZWxlY3RT
cGlsbCgpIGNhbGxlZCB3aGVuIHRoZXJlIHdhcyBubyBzcGlsbC4iKTsKKyAgICAgICAgUkVMRUFT
RV9BU1NFUlRfV0lUSF9NRVNTQUdFKCFtX3Vuc3BpbGxhYmxlVG1wcy5jb250YWlucygqaXRlcmF0
b3IpLCAidHJ5aW5nIHRvIHNwaWxsIHVuc3BpbGxhYmxlIHRtcCIpOworCisgICAgICAgIC8vIEhp
Z2hlciBzY29yZSBtZWFucyBtb3JlIGRlc2lyYWJsZSB0byBzcGlsbC4gTG93ZXIgc2NvcmVzIG1h
eGltaXplIHRoZSBsaWtlbGlob29kIHRoYXQgYSB0bXAKKyAgICAgICAgLy8gZ2V0cyBhIHJlZ2lz
dGVyLgorICAgICAgICBhdXRvIHNjb3JlID0gWyZdIChUbXAgdG1wKSAtPiBkb3VibGUgeworICAg
ICAgICAgICAgLy8gQWlyIGV4cG9zZXMgdGhlIGNvbmNlcHQgb2YgImZhc3QgdG1wcyIsIGFuZCB3
ZSBpbnRlcnByZXQgdGhhdCB0byBtZWFuIHRoYXQgdGhlIHRtcAorICAgICAgICAgICAgLy8gc2hv
dWxkIGFsd2F5cyBiZSBpbiBhIHJlZ2lzdGVyLgorICAgICAgICAgICAgaWYgKG1fY29kZS5pc0Zh
c3RUbXAodG1wKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIAorICAg
ICAgICAgICAgLy8gQWxsIGVsc2UgYmVpbmcgZXF1YWwsIHRoZSBzY29yZSBzaG91bGQgYmUgZGly
ZWN0bHkgcmVsYXRlZCB0byB0aGUgZGVncmVlLgorICAgICAgICAgICAgZG91YmxlIGRlZ3JlZSA9
IHN0YXRpY19jYXN0PGRvdWJsZT4obV9kZWdyZWVzW0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojph
YnNvbHV0ZUluZGV4KHRtcCldKTsKKworICAgICAgICAgICAgLy8gQWxsIGVsc2UgYmVpbmcgZXF1
YWwsIHRoZSBzY29yZSBzaG91bGQgYmUgaW52ZXJzZWx5IHJlbGF0ZWQgdG8gdGhlIG51bWJlciBv
ZiB3YXJtIHVzZXMgYW5kCisgICAgICAgICAgICAvLyBkZWZzLgorICAgICAgICAgICAgY29uc3Qg
VXNlQ291bnRzPFRtcD46OkNvdW50cyogY291bnRzID0gbV91c2VDb3VudHNbdG1wXTsKKyAgICAg
ICAgICAgIGlmICghY291bnRzKQorICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNf
bGltaXRzPGRvdWJsZT46OmluZmluaXR5KCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGRv
dWJsZSB1c2VzID0gY291bnRzLT5udW1XYXJtVXNlcyArIGNvdW50cy0+bnVtRGVmczsKKworICAg
ICAgICAgICAgLy8gSWYgaXQncyBhIGNvbnN0YW50LCB0aGVuIGl0J3Mgbm90IGFzIGJhZCB0byBz
cGlsbC4gV2UgY2FuIHJlbWF0ZXJpYWxpemUgaXQgaW4gbWFueQorICAgICAgICAgICAgLy8gY2Fz
ZXMuCisgICAgICAgICAgICBpZiAoY291bnRzLT5udW1Db25zdERlZnMgPT0gMSAmJiBjb3VudHMt
Pm51bURlZnMgPT0gMSkKKyAgICAgICAgICAgICAgICB1c2VzIC89IDI7CisKKyAgICAgICAgICAg
IHJldHVybiBkZWdyZWUgLyB1c2VzOworICAgICAgICB9OworCisgICAgICAgIGF1dG8gdmljdGlt
SXRlcmF0b3IgPSBpdGVyYXRvcjsKKyAgICAgICAgZG91YmxlIG1heFNjb3JlID0gc2NvcmUoQWJz
b2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KCppdGVyYXRvcikpOwor
CisgICAgICAgICsraXRlcmF0b3I7CisgICAgICAgIGZvciAoO2l0ZXJhdG9yICE9IG1fc3BpbGxX
b3JrbGlzdC5lbmQoKTsgKytpdGVyYXRvcikgeworICAgICAgICAgICAgZG91YmxlIHRtcFNjb3Jl
ID0gc2NvcmUoQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KCpp
dGVyYXRvcikpOworICAgICAgICAgICAgaWYgKHRtcFNjb3JlID4gbWF4U2NvcmUpIHsKKyAgICAg
ICAgICAgICAgICBBU1NFUlQoIW1fdW5zcGlsbGFibGVUbXBzLmNvbnRhaW5zKCppdGVyYXRvcikp
OworICAgICAgICAgICAgICAgIHZpY3RpbUl0ZXJhdG9yID0gaXRlcmF0b3I7CisgICAgICAgICAg
ICAgICAgbWF4U2NvcmUgPSB0bXBTY29yZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisg
ICAgICAgIHVuc2lnbmVkIHZpY3RpbUluZGV4ID0gKnZpY3RpbUl0ZXJhdG9yOworICAgICAgICBt
X3NwaWxsV29ya2xpc3QucmVtb3ZlKHZpY3RpbUl0ZXJhdG9yKTsKKyAgICAgICAgbV9zaW1wbGlm
eVdvcmtsaXN0LmFwcGVuZCh2aWN0aW1JbmRleCk7CisKKyAgICAgICAgZnJlZXplTW92ZXModmlj
dGltSW5kZXgpOworICAgIH0KKworICAgIHZvaWQgYWxsb2NhdGUoKQorICAgIHsKKyAgICAgICAg
QVNTRVJUX1dJVEhfTUVTU0FHRShtX2FjdGl2ZU1vdmVzLnNpemUoKSA+PSBtX2NvYWxlc2NpbmdD
YW5kaWRhdGVzLnNpemUoKSwgIlRoZSBhY3RpdmVNb3ZlIHNldCBzaG91bGQgYmUgYmlnIGVub3Vn
aCBmb3IgdGhlIHF1aWNrIG9wZXJhdGlvbnMgb2YgQml0VmVjdG9yLiIpOworCisgICAgICAgIG1h
a2VXb3JrTGlzdCgpOworCisgICAgICAgIGlmIChkZWJ1ZykgeworICAgICAgICAgICAgZGF0YUxv
ZygiSW50ZXJmZXJlbmNlOiAiLCBsaXN0RHVtcChtX2ludGVyZmVyZW5jZUVkZ2VzKSwgIlxuIik7
CisgICAgICAgICAgICBkdW1wSW50ZXJmZXJlbmNlR3JhcGhJbkRvdChXVEY6OmRhdGFGaWxlKCkp
OworICAgICAgICAgICAgZGF0YUxvZygiQ29hbGVzY2luZyBjYW5kaWRhdGVzOlxuIik7CisgICAg
ICAgICAgICBmb3IgKE1vdmVPcGVyYW5kcyYgbW92ZU9wIDogbV9jb2FsZXNjaW5nQ2FuZGlkYXRl
cykgeworICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICAiLCBBYnNvbHV0ZVRtcE1hcHBlcjx0
eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgobW92ZU9wLnNyY0luZGV4KSwKKyAgICAgICAgICAg
ICAgICAgICAgIiAtPiAiLCBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRl
SW5kZXgobW92ZU9wLmRzdEluZGV4KSwgIlxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAg
ICBkYXRhTG9nKCJJbml0aWFsIHdvcmsgbGlzdFxuIik7CisgICAgICAgICAgICBkdW1wV29ya0xp
c3RzKFdURjo6ZGF0YUZpbGUoKSk7CisgICAgICAgIH0KKworICAgICAgICBkbyB7CisgICAgICAg
ICAgICBpZiAodHJhY2VEZWJ1ZykgeworICAgICAgICAgICAgICAgIGRhdGFMb2coIkJlZm9yZSBH
cmFwaCBzaW1wbGlmaWNhdGlvbiBpdGVyYXRpb25cbiIpOworICAgICAgICAgICAgICAgIGR1bXBX
b3JrTGlzdHMoV1RGOjpkYXRhRmlsZSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
aWYgKCFtX3NpbXBsaWZ5V29ya2xpc3QuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIHNpbXBs
aWZ5KCk7CisgICAgICAgICAgICBlbHNlIGlmICghbV93b3JrbGlzdE1vdmVzLmlzRW1wdHkoKSkK
KyAgICAgICAgICAgICAgICBjb2FsZXNjZSgpOworICAgICAgICAgICAgZWxzZSBpZiAoIW1fZnJl
ZXplV29ya2xpc3QuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIGZyZWV6ZSgpOworICAgICAg
ICAgICAgZWxzZSBpZiAoIW1fc3BpbGxXb3JrbGlzdC5pc0VtcHR5KCkpCisgICAgICAgICAgICAg
ICAgc2VsZWN0U3BpbGwoKTsKKworICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpIHsKKyAgICAg
ICAgICAgICAgICBkYXRhTG9nKCJBZnRlciBHcmFwaCBzaW1wbGlmaWNhdGlvbiBpdGVyYXRpb25c
biIpOworICAgICAgICAgICAgICAgIGR1bXBXb3JrTGlzdHMoV1RGOjpkYXRhRmlsZSgpKTsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoIW1fc2ltcGxpZnlXb3JrbGlzdC5pc0VtcHR5
KCkgfHwgIW1fd29ya2xpc3RNb3Zlcy5pc0VtcHR5KCkgfHwgIW1fZnJlZXplV29ya2xpc3QuaXNF
bXB0eSgpIHx8ICFtX3NwaWxsV29ya2xpc3QuaXNFbXB0eSgpKTsKKworICAgICAgICBhc3NpZ25D
b2xvcnMoKTsKKyAgICB9CisKKyNpZiBQTEFURk9STShDT0NPQSkKKyNwcmFnbWEgbWFyayAtIERl
YnVnZ2luZyBoZWxwZXJzLgorI2VuZGlmCisKKyAgICB2b2lkIGR1bXBJbnRlcmZlcmVuY2VHcmFw
aEluRG90KFByaW50U3RyZWFtJiBvdXQpCisgICAgeworICAgICAgICBvdXQucHJpbnQoImdyYXBo
IEludGVyZmVyZW5jZUdyYXBoIHsgXG4iKTsKKworICAgICAgICBIYXNoU2V0PFRtcD4gdG1wc1dp
dGhJbnRlcmZlcmVuY2VzOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGVkZ2UgOiBtX2ludGVy
ZmVyZW5jZUVkZ2VzKSB7CisgICAgICAgICAgICB0bXBzV2l0aEludGVyZmVyZW5jZXMuYWRkKEFi
c29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleChlZGdlLmZpcnN0KCkp
KTsKKyAgICAgICAgICAgIHRtcHNXaXRoSW50ZXJmZXJlbmNlcy5hZGQoQWJzb2x1dGVUbXBNYXBw
ZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KGVkZ2Uuc2Vjb25kKCkpKTsKKyAgICAgICAg
fQorCisgICAgICAgIGZvciAoY29uc3QgYXV0byYgdG1wIDogdG1wc1dpdGhJbnRlcmZlcmVuY2Vz
KSB7CisgICAgICAgICAgICB1bnNpZ25lZCB0bXBJbmRleCA9IEFic29sdXRlVG1wTWFwcGVyPHR5
cGU+OjphYnNvbHV0ZUluZGV4KHRtcCk7CisgICAgICAgICAgICBpZiAodG1wSW5kZXggPCBtX2Rl
Z3JlZXMuc2l6ZSgpKQorICAgICAgICAgICAgICAgIG91dC5wcmludCgiICAgICIsIHRtcC5pbnRl
cm5hbFZhbHVlKCksICIgW2xhYmVsPVwiIiwgdG1wLCAiICgiLCBtX2RlZ3JlZXNbdG1wSW5kZXhd
LCAiKVwiXTtcbiIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG91dC5wcmlu
dCgiICAgICIsIHRtcC5pbnRlcm5hbFZhbHVlKCksICIgW2xhYmVsPVwiIiwgdG1wLCAiXCJdO1xu
Iik7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGVkZ2UgOiBtX2ludGVy
ZmVyZW5jZUVkZ2VzKQorICAgICAgICAgICAgb3V0LnByaW50KCIgICAgIiwgZWRnZS5maXJzdCgp
LCAiIC0tICIsIGVkZ2Uuc2Vjb25kKCksICI7XG4iKTsKKyAgICAgICAgb3V0LnByaW50KCJ9XG4i
KTsKKyAgICB9CisKKyAgICB2b2lkIGR1bXBXb3JrTGlzdHMoUHJpbnRTdHJlYW0mIG91dCkKKyAg
ICB7CisgICAgICAgIG91dC5wcmludCgiU2ltcGxpZnkgd29yayBsaXN0OlxuIik7CisgICAgICAg
IGZvciAodW5zaWduZWQgdG1wSW5kZXggOiBtX3NpbXBsaWZ5V29ya2xpc3QpCisgICAgICAgICAg
ICBvdXQucHJpbnQoIiAgICAiLCBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29s
dXRlSW5kZXgodG1wSW5kZXgpLCAiXG4iKTsKKyAgICAgICAgb3V0LnByaW50ZigiTW92ZXMgd29y
ayBsaXN0IGlzIGVtcHR5PyAlZFxuIiwgbV93b3JrbGlzdE1vdmVzLmlzRW1wdHkoKSk7CisgICAg
ICAgIG91dC5wcmludCgiRnJlZXplIHdvcmsgbGlzdDpcbiIpOworICAgICAgICBmb3IgKHVuc2ln
bmVkIHRtcEluZGV4IDogbV9mcmVlemVXb3JrbGlzdCkKKyAgICAgICAgICAgIG91dC5wcmludCgi
ICAgICIsIEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleCh0bXBJ
bmRleCksICJcbiIpOworICAgICAgICBvdXQucHJpbnQoIlNwaWxsIHdvcmsgbGlzdDpcbiIpOwor
ICAgICAgICBmb3IgKHVuc2lnbmVkIHRtcEluZGV4IDogbV9zcGlsbFdvcmtsaXN0KQorICAgICAg
ICAgICAgb3V0LnByaW50KCIgICAgIiwgQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21B
YnNvbHV0ZUluZGV4KHRtcEluZGV4KSwgIlxuIik7CisgICAgfQorCisgICAgdXNpbmcgQWJzdHJh
Y3RDb2xvcmluZ0FsbG9jYXRvcjx1bnNpZ25lZD46OmFkZEVkZ2U7CisgICAgdXNpbmcgQWJzdHJh
Y3RDb2xvcmluZ0FsbG9jYXRvcjx1bnNpZ25lZD46OmdldEFsaWFzOworCisgICAgQ29kZSYgbV9j
b2RlOworICAgIFRtcFdpZHRoJiBtX3RtcFdpZHRoOworICAgIC8vIEZJWE1FOiBzcGlsbGluZyBz
aG91bGQgbm90IHR5cGUgc3BlY2lmaWMuIEl0IGlzIG9ubHkgYSBzaWRlIGVmZmVjdCBvZiB1c2lu
ZyBVc2VDb3VudHMuCisgICAgY29uc3QgVXNlQ291bnRzPFRtcD4mIG1fdXNlQ291bnRzOworfTsK
KworY2xhc3MgSXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcgeworcHVibGljOgorICAgIEl0ZXJh
dGVkUmVnaXN0ZXJDb2FsZXNjaW5nKENvZGUmIGNvZGUpCisgICAgICAgIDogbV9jb2RlKGNvZGUp
CisgICAgICAgICwgbV91c2VDb3VudHMoY29kZSkKKyAgICB7CisgICAgfQorCisgICAgdm9pZCBy
dW4oKQorICAgIHsKKyAgICAgICAgcGFkSW50ZXJmZXJlbmNlKG1fY29kZSk7CisgICAgICAgIAor
ICAgICAgICBpdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZ09uVHlwZTxBcmc6OkdQPigpOworICAg
ICAgICBpdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZ09uVHlwZTxBcmc6OkZQPigpOworCisgICAg
ICAgIGZpeFNwaWxsc0FmdGVyVGVybWluYWxzKCk7CisKKyAgICAgICAgaWYgKHJlcG9ydFN0YXRz
KQorICAgICAgICAgICAgZGF0YUxvZygiTnVtIGl0ZXJhdGlvbnMgPSAiLCBtX251bUl0ZXJhdGlv
bnMsICJcbiIpOworICAgIH0KKworcHJpdmF0ZToKKyAgICB0ZW1wbGF0ZTxBcmc6OlR5cGUgdHlw
ZT4KKyAgICB2b2lkIGl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nT25UeXBlKCkKKyAgICB7Cisg
ICAgICAgIEhhc2hTZXQ8dW5zaWduZWQ+IHVuc3BpbGxhYmxlVG1wcyA9IGNvbXB1dGVVbnNwaWxs
YWJsZVRtcHM8dHlwZT4oKTsKKworICAgICAgICAvLyBGSVhNRTogSWYgYSBUbXAgaXMgdXNlZCBv
bmx5IGZyb20gYSBTY3JhdGNoIHJvbGUgYW5kIHRoYXQgYXJndW1lbnQgaXMgIWFkbWl0c1N0YWNr
LCB0aGVuCisgICAgICAgIC8vIHdlIHNob3VsZCBhZGQgdGhlIFRtcCB0byB1bnNwaWxsYWJsZVRt
cHMuIFRoYXQgd2lsbCBoZWxwIGF2b2lkIHJlbG9vcGluZyBvbmx5IHRvIHR1cm4gdGhlCisgICAg
ICAgIC8vIFRtcCBpbnRvIGFuIHVuc3BpbGxhYmxlIFRtcC4KKyAgICAgICAgLy8gaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1MjY5OQorICAgICAgICAKKyAgICAgICAg
d2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICsrbV9udW1JdGVyYXRpb25zOworCisgICAgICAg
ICAgICBpZiAodHJhY2VEZWJ1ZykKKyAgICAgICAgICAgICAgICBkYXRhTG9nKCJDb2RlIGF0IGl0
ZXJhdGlvbiAiLCBtX251bUl0ZXJhdGlvbnMsICI6XG4iLCBtX2NvZGUpOworCisgICAgICAgICAg
ICAvLyBGSVhNRTogT25lIHdheSB0byBvcHRpbWl6ZSB0aGlzIGNvZGUgaXMgdG8gcmVtb3ZlIHRo
ZSByZWNvbXB1dGF0aW9uIGluc2lkZSB0aGUgZml4cG9pbnQuCisgICAgICAgICAgICAvLyBXZSBu
ZWVkIHRvIHJlY29tcHV0ZSBiZWNhdXNlIHNwaWxsaW5nIGFkZHMgdG1wcywgYnV0IHdlIGNvdWxk
IGp1c3QgdXBkYXRlIHRtcFdpZHRoIHdoZW4gd2UKKyAgICAgICAgICAgIC8vIGFkZCB0aG9zZSB0
bXBzLiBOb3RlIHRoYXQgb25lIGVhc3kgd2F5IHRvIHJlbW92ZSB0aGUgcmVjb21wdXRhdGlvbiBp
cyB0byBtYWtlIGFueSBuZXdseQorICAgICAgICAgICAgLy8gYWRkZWQgVG1wcyBnZXQgdGhlIHNh
bWUgdXNlL2RlZiB3aWR0aHMgdGhhdCB0aGUgb3JpZ2luYWwgVG1wIGdvdC4gQnV0LCB0aGlzIG1h
eSBodXJ0IHRoZQorICAgICAgICAgICAgLy8gc3BpbGwgY29kZSB3ZSBlbWl0LiBTaW5jZSB3ZSBj
dXJyZW50bHkgcmVjb21wdXRlIFRtcFdpZHRoIGFmdGVyIHNwaWxsaW5nLCB0aGUgbmV3bHkKKyAg
ICAgICAgICAgIC8vIGNyZWF0ZWQgVG1wcyBtYXkgZ2V0IG5hcnJvd2VyIHVzZS9kZWYgd2lkdGhz
LiBPbiB0aGUgb3RoZXIgaGFuZCwgdGhlIHNwaWxsZXIgYWxyZWFkeQorICAgICAgICAgICAgLy8g
c2VsZWN0cyB3aGljaCBtb3ZlIGluc3RydWN0aW9uIHRvIHVzZSBiYXNlZCBvbiB0aGUgb3JpZ2lu
YWwgVG1wJ3Mgd2lkdGhzLCBzbyBpdCBtYXkgbm90CisgICAgICAgICAgICAvLyBtYXR0ZXIgdGhh
biBhIHN1YnNlcXVlbnQgaXRlcmF0aW9uIHNlZXMgYSBjb3NlcnZhdGl2ZSB3aWR0aCBmb3IgdGhl
IG5ldyBUbXBzLiBBbHNvLCB0aGUKKyAgICAgICAgICAgIC8vIHJlY29tcHV0YXRpb24gbWF5IG5v
dCBhY3R1YWxseSBiZSBhIHBlcmZvcm1hbmNlIHByb2JsZW07IGl0J3MgbGlrZWx5IHRoYXQgYSBi
ZXR0ZXIgd2F5IHRvCisgICAgICAgICAgICAvLyBpbXByb3ZlIHBlcmZvcm1hbmNlIG9mIFRtcFdp
ZHRoIGlzIHRvIHJlcGxhY2UgaXRzIEhhc2hNYXAgd2l0aCBzb21ldGhpbmcgZWxzZS4gSXQncwor
ICAgICAgICAgICAgLy8gcG9zc2libGUgdGhhdCBtb3N0IG9mIHRoZSBUbXBXaWR0aCBvdmVyaGVh
ZCBpcyBmcm9tIHF1ZXJpZXMgb2YgVG1wV2lkdGggcmF0aGVyIHRoYW4gdGhlCisgICAgICAgICAg
ICAvLyByZWNvbXB1dGF0aW9uLCBpbiB3aGljaCBjYXNlIHNwZWVkaW5nIHVwIHRoZSBsb29rdXAg
d291bGQgYmUgYSBiaWdnZXIgd2luLgorICAgICAgICAgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTE1MjQ3OAorICAgICAgICAgICAgbV90bXBXaWR0aC5yZWNv
bXB1dGUobV9jb2RlKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgQ29sb3JpbmdBbGxvY2F0
b3I8dHlwZT4gYWxsb2NhdG9yKG1fY29kZSwgbV90bXBXaWR0aCwgbV91c2VDb3VudHMsIHVuc3Bp
bGxhYmxlVG1wcyk7CisgICAgICAgICAgICBpZiAoIWFsbG9jYXRvci5yZXF1aXJlc1NwaWxsaW5n
KCkpIHsKKyAgICAgICAgICAgICAgICBhc3NpZ25SZWdpc3RlcnNUb1RtcChhbGxvY2F0b3IpOwor
ICAgICAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQorICAgICAgICAgICAgICAgICAgICBkYXRh
TG9nKCJTdWNjZXNzZnVsbCBhbGxvY2F0aW9uIGF0IGl0ZXJhdGlvbiAiLCBtX251bUl0ZXJhdGlv
bnMsICI6XG4iLCBtX2NvZGUpOworCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAg
ICAgfQorICAgICAgICAgICAgYWRkU3BpbGxBbmRGaWxsPHR5cGU+KGFsbG9jYXRvciwgdW5zcGls
bGFibGVUbXBzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHRlbXBsYXRlPEFyZzo6VHlwZSB0
eXBlPgorICAgIEhhc2hTZXQ8dW5zaWduZWQ+IGNvbXB1dGVVbnNwaWxsYWJsZVRtcHMoKQorICAg
IHsKKyAgICAgICAgSGFzaFNldDx1bnNpZ25lZD4gdW5zcGlsbGFibGVUbXBzOworCisgICAgICAg
IHN0cnVjdCBSYW5nZSB7CisgICAgICAgICAgICB1bnNpZ25lZCBmaXJzdCB7IHN0ZDo6bnVtZXJp
Y19saW1pdHM8dW5zaWduZWQ+OjptYXgoKSB9OworICAgICAgICAgICAgdW5zaWduZWQgbGFzdCB7
IDAgfTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNvdW50IHsgMCB9OworICAgICAgICAgICAgdW5z
aWduZWQgYWRtaXRTdGFja0NvdW50IHsgMCB9OworICAgICAgICB9OworCisgICAgICAgIHVuc2ln
bmVkIG51bVRtcHMgPSBtX2NvZGUubnVtVG1wcyh0eXBlKTsKKyAgICAgICAgdW5zaWduZWQgYXJy
YXlTaXplID0gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgobnVtVG1wcyk7
CisKKyAgICAgICAgVmVjdG9yPFJhbmdlLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gcmFuZ2Vz
OworICAgICAgICByYW5nZXMuZmlsbChSYW5nZSgpLCBhcnJheVNpemUpOworCisgICAgICAgIHVu
c2lnbmVkIGdsb2JhbEluZGV4ID0gMDsKKyAgICAgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6
IG1fY29kZSkgeworICAgICAgICAgICAgZm9yIChJbnN0JiBpbnN0IDogKmJsb2NrKSB7CisgICAg
ICAgICAgICAgICAgaW5zdC5mb3JFYWNoQXJnKFsmXSAoQXJnJiBhcmcsIEFyZzo6Um9sZSwgQXJn
OjpUeXBlIGFyZ1R5cGUsIEFyZzo6V2lkdGgpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFy
Zy5pc1RtcCgpICYmIGluc3QuYWRtaXRzU3RhY2soYXJnKSkgeworICAgICAgICAgICAgICAgICAg
ICAgICAgaWYgKGFyZ1R5cGUgIT0gdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBy
ZXR1cm47CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFRtcCB0bXAgPSBhcmcudG1wKCk7Cisg
ICAgICAgICAgICAgICAgICAgICAgICBSYW5nZSYgcmFuZ2UgPSByYW5nZXNbQWJzb2x1dGVUbXBN
YXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodG1wKV07CisgICAgICAgICAgICAgICAgICAgICAg
ICByYW5nZS5jb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuYWRtaXRTdGFj
a0NvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2xvYmFsSW5kZXggPCByYW5n
ZS5maXJzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmZpcnN0ID0gZ2xv
YmFsSW5kZXg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UubGFzdCA9IGdsb2Jh
bEluZGV4OworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgcmFuZ2UubGFzdCA9IGdsb2JhbEluZGV4OworCisgICAgICAgICAgICAgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAg
ICAgICBhcmcuZm9yRWFjaFRtcEZhc3QoWyZdIChUbXAmIHRtcCkgeworICAgICAgICAgICAgICAg
ICAgICAgICAgaWYgKHRtcC5pc0dQKCkgIT0gKHR5cGUgPT0gQXJnOjpHUCkpCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAgICAgICAgICAgICBSYW5n
ZSYgcmFuZ2UgPSByYW5nZXNbQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgo
dG1wKV07CisgICAgICAgICAgICAgICAgICAgICAgICByYW5nZS5jb3VudCsrOworICAgICAgICAg
ICAgICAgICAgICAgICAgaWYgKGdsb2JhbEluZGV4IDwgcmFuZ2UuZmlyc3QpIHsKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICByYW5nZS5maXJzdCA9IGdsb2JhbEluZGV4OworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHJhbmdlLmxhc3QgPSBnbG9iYWxJbmRleDsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmxh
c3QgPSBnbG9iYWxJbmRleDsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAg
ICAgfSk7CisKKyAgICAgICAgICAgICAgICArK2dsb2JhbEluZGV4OworICAgICAgICAgICAgfQor
ICAgICAgICAgICAgKytnbG9iYWxJbmRleDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHVuc2ln
bmVkIGkgPSBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6bGFzdE1hY2hpbmVSZWdpc3RlckluZGV4
KCkgKyAxOyBpIDwgcmFuZ2VzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBSYW5nZSYgcmFu
Z2UgPSByYW5nZXNbaV07CisgICAgICAgICAgICBpZiAocmFuZ2UubGFzdCAtIHJhbmdlLmZpcnN0
IDw9IDEgJiYgcmFuZ2UuY291bnQgPiByYW5nZS5hZG1pdFN0YWNrQ291bnQpCisgICAgICAgICAg
ICAgICAgdW5zcGlsbGFibGVUbXBzLmFkZChpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVy
biB1bnNwaWxsYWJsZVRtcHM7CisgICAgfQorCisgICAgdGVtcGxhdGU8QXJnOjpUeXBlIHR5cGU+
CisgICAgdm9pZCBhc3NpZ25SZWdpc3RlcnNUb1RtcChjb25zdCBDb2xvcmluZ0FsbG9jYXRvcjx0
eXBlPiYgYWxsb2NhdG9yKQorICAgIHsKKyAgICAgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6
IG1fY29kZSkgeworICAgICAgICAgICAgLy8gR2l2ZSBUbXAgYSB2YWxpZCByZWdpc3Rlci4KKyAg
ICAgICAgICAgIGZvciAodW5zaWduZWQgaW5zdEluZGV4ID0gMDsgaW5zdEluZGV4IDwgYmxvY2st
PnNpemUoKTsgKytpbnN0SW5kZXgpIHsKKyAgICAgICAgICAgICAgICBJbnN0JiBpbnN0ID0gYmxv
Y2stPmF0KGluc3RJbmRleCk7CisKKyAgICAgICAgICAgICAgICAvLyBUaGUgbWF5QmVDb2FsZXNj
YWJsZSgpIG1ldGhvZCB3aWxsIGNoYW5nZSBpdHMgbWluZCBmb3Igc29tZSBvcGVyYXRpb25zIGFm
dGVyIHdlCisgICAgICAgICAgICAgICAgLy8gY29tcGxldGUgcmVnaXN0ZXIgYWxsb2NhdGlvbi4g
U28sIHdlIHJlY29yZCB0aGlzIGJlZm9yZSBzdGFydGluZy4KKyAgICAgICAgICAgICAgICBib29s
IG1heUJlQ29hbGVzY2FibGUgPSBhbGxvY2F0b3IubWF5QmVDb2FsZXNjYWJsZShpbnN0KTsKKwor
ICAgICAgICAgICAgICAgIC8vIE1vdmUzMiBpcyBjaGVhcGVyIGlmIHdlIGtub3cgdGhhdCBpdCdz
IGVxdWl2YWxlbnQgdG8gYSBNb3ZlLiBJdCdzCisgICAgICAgICAgICAgICAgLy8gZXF1aXZhbGVu
dCBpZiB0aGUgZGVzdGluYXRpb24ncyBoaWdoIGJpdHMgYXJlIG5vdCBvYnNlcnZhYmxlIG9yIGlm
IHRoZSBzb3VyY2UncyBoaWdoCisgICAgICAgICAgICAgICAgLy8gYml0cyBhcmUgYWxsIHplcm8u
IE5vdGUgdGhhdCB3ZSBkb24ndCBoYXZlIHRoZSBvcHBvc2l0ZSBvcHRpbWl6YXRpb24gZm9yIG90
aGVyCisgICAgICAgICAgICAgICAgLy8gYXJjaGl0ZWN0dXJlcywgd2hpY2ggbWF5IHByZWZlciBN
b3ZlIG92ZXIgTW92ZTMyLCBiZWNhdXNlIE1vdmUgaXMgY2Fub25pY2FsIGFscmVhZHkuCisgICAg
ICAgICAgICAgICAgaWYgKHR5cGUgPT0gQXJnOjpHUCAmJiBpbnN0LmtpbmQub3Bjb2RlID09IE1v
dmUKKyAgICAgICAgICAgICAgICAgICAgJiYgaW5zdC5hcmdzWzBdLmlzVG1wKCkgJiYgaW5zdC5h
cmdzWzFdLmlzVG1wKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdG1wV2lkdGgudXNl
V2lkdGgoaW5zdC5hcmdzWzFdLnRtcCgpKSA8PSBBcmc6OldpZHRoMzIKKyAgICAgICAgICAgICAg
ICAgICAgICAgIHx8IG1fdG1wV2lkdGguZGVmV2lkdGgoaW5zdC5hcmdzWzBdLnRtcCgpKSA8PSBB
cmc6OldpZHRoMzIpCisgICAgICAgICAgICAgICAgICAgICAgICBpbnN0LmtpbmQub3Bjb2RlID0g
TW92ZTMyOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGluc3QuZm9yRWFj
aFRtcEZhc3QoWyZdIChUbXAmIHRtcCkgeworICAgICAgICAgICAgICAgICAgICBpZiAodG1wLmlz
UmVnKCkgfHwgdG1wLmlzR1AoKSA9PSAodHlwZSAhPSBBcmc6OkdQKSkKKyAgICAgICAgICAgICAg
ICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgICAgICAgICBUbXAgYWxpYXNUbXAgPSBh
bGxvY2F0b3IuZ2V0QWxpYXModG1wKTsKKyAgICAgICAgICAgICAgICAgICAgVG1wIGFzc2lnbmVk
VG1wOworICAgICAgICAgICAgICAgICAgICBpZiAoYWxpYXNUbXAuaXNSZWcoKSkKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGFzc2lnbmVkVG1wID0gVG1wKGFsaWFzVG1wLnJlZygpKTsKKyAgICAg
ICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIHJlZyA9
IGFsbG9jYXRvci5hbGxvY2F0ZWRSZWcoYWxpYXNUbXApOworICAgICAgICAgICAgICAgICAgICAg
ICAgQVNTRVJUKHJlZyk7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZFRtcCA9IFRt
cChyZWcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEFTU0VS
VChhc3NpZ25lZFRtcC5pc1JlZygpKTsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gYXNzaWdu
ZWRUbXA7CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgICBpZiAobWF5QmVD
b2FsZXNjYWJsZSAmJiBpbnN0LmFyZ3NbMF0uaXNUbXAoKSAmJiBpbnN0LmFyZ3NbMV0uaXNUbXAo
KQorICAgICAgICAgICAgICAgICAgICAmJiBpbnN0LmFyZ3NbMF0udG1wKCkgPT0gaW5zdC5hcmdz
WzFdLnRtcCgpKQorICAgICAgICAgICAgICAgICAgICBpbnN0ID0gSW5zdCgpOworICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICAvLyBSZW1vdmUgYWxsIHRoZSB1c2VsZXNzIG1vdmVzIHdlIGNy
ZWF0ZWQgaW4gdGhpcyBibG9jay4KKyAgICAgICAgICAgIGJsb2NrLT5pbnN0cygpLnJlbW92ZUFs
bE1hdGNoaW5nKFsmXSAoY29uc3QgSW5zdCYgaW5zdCkgeworICAgICAgICAgICAgICAgIHJldHVy
biAhaW5zdDsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGlj
IHVuc2lnbmVkIHN0YWNrU2xvdE1pbmltdW1XaWR0aChBcmc6OldpZHRoIHdpZHRoKQorICAgIHsK
KyAgICAgICAgcmV0dXJuIHdpZHRoIDw9IEFyZzo6V2lkdGgzMiA/IDQgOiA4OworICAgIH0KKwor
ICAgIHRlbXBsYXRlPEFyZzo6VHlwZSB0eXBlPgorICAgIHZvaWQgYWRkU3BpbGxBbmRGaWxsKGNv
bnN0IENvbG9yaW5nQWxsb2NhdG9yPHR5cGU+JiBhbGxvY2F0b3IsIEhhc2hTZXQ8dW5zaWduZWQ+
JiB1bnNwaWxsYWJsZVRtcHMpCisgICAgeworICAgICAgICBIYXNoTWFwPFRtcCwgU3RhY2tTbG90
Kj4gc3RhY2tTbG90czsKKyAgICAgICAgZm9yIChUbXAgdG1wIDogYWxsb2NhdG9yLnNwaWxsZWRU
bXBzKCkpIHsKKyAgICAgICAgICAgIC8vIEFsbCB0aGUgc3BpbGxlZCB2YWx1ZXMgYmVjb21lIHVu
c3BpbGxhYmxlLgorICAgICAgICAgICAgdW5zcGlsbGFibGVUbXBzLmFkZChBYnNvbHV0ZVRtcE1h
cHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh0bXApKTsKKworICAgICAgICAgICAgLy8gQWxsb2Nh
dGUgc3RhY2sgc2xvdCBmb3IgZWFjaCBzcGlsbGVkIHZhbHVlLgorICAgICAgICAgICAgU3RhY2tT
bG90KiBzdGFja1Nsb3QgPSBtX2NvZGUuYWRkU3RhY2tTbG90KAorICAgICAgICAgICAgICAgIHN0
YWNrU2xvdE1pbmltdW1XaWR0aChtX3RtcFdpZHRoLnJlcXVpcmVkV2lkdGgodG1wKSksIFN0YWNr
U2xvdEtpbmQ6OlNwaWxsKTsKKyAgICAgICAgICAgIGJvb2wgaXNOZXdUbXAgPSBzdGFja1Nsb3Rz
LmFkZCh0bXAsIHN0YWNrU2xvdCkuaXNOZXdFbnRyeTsKKyAgICAgICAgICAgIEFTU0VSVF9VTlVT
RUQoaXNOZXdUbXAsIGlzTmV3VG1wKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJld3JpdGUg
dGhlIHByb2dyYW0gdG8gZ2V0IHJpZCBvZiB0aGUgc3BpbGxlZCBUbXAuCisgICAgICAgIEluc2Vy
dGlvblNldCBpbnNlcnRpb25TZXQobV9jb2RlKTsKKyAgICAgICAgZm9yIChCYXNpY0Jsb2NrKiBi
bG9jayA6IG1fY29kZSkgeworICAgICAgICAgICAgYm9vbCBoYXNBbGlhc2VkVG1wcyA9IGZhbHNl
OworCisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGluc3RJbmRleCA9IDA7IGluc3RJbmRleCA8
IGJsb2NrLT5zaXplKCk7ICsraW5zdEluZGV4KSB7CisgICAgICAgICAgICAgICAgSW5zdCYgaW5z
dCA9IGJsb2NrLT5hdChpbnN0SW5kZXgpOworCisgICAgICAgICAgICAgICAgLy8gVGhlIFRtcFdp
ZHRoIGFuYWx5c2lzIHdpbGwgc2F5IHRoYXQgYSBNb3ZlIG9ubHkgc3RvcmVzIDMyIGJpdHMgaW50
byB0aGUgZGVzdGluYXRpb24sCisgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHNvdXJjZSBvbmx5
IGhhZCAzMiBiaXRzIHdvcnRoIG9mIG5vbi16ZXJvIGJpdHMuIFNhbWUgZm9yIHRoZSBzb3VyY2U6
IGl0IHdpbGwKKyAgICAgICAgICAgICAgICAvLyBvbmx5IGNsYWltIHRvIHJlYWQgMzIgYml0cyBm
cm9tIHRoZSBzb3VyY2UgaWYgb25seSAzMiBiaXRzIG9mIHRoZSBkZXN0aW5hdGlvbiBhcmUKKyAg
ICAgICAgICAgICAgICAvLyByZWFkLiBOb3RlIHRoYXQgd2Ugb25seSBhcHBseSB0aGlzIGxvZ2lj
IGlmIHRoaXMgdHVybnMgaW50byBhIGxvYWQgb3Igc3RvcmUsIHNpbmNlCisgICAgICAgICAgICAg
ICAgLy8gTW92ZSBpcyB0aGUgY2Fub25pY2FsIHdheSB0byBtb3ZlIGRhdGEgYmV0d2VlbiBHUFJz
LgorICAgICAgICAgICAgICAgIGJvb2wgY2FuVXNlTW92ZTMySWZEaWRTcGlsbCA9IGZhbHNlOwor
ICAgICAgICAgICAgICAgIGJvb2wgZGlkU3BpbGwgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBp
ZiAodHlwZSA9PSBBcmc6OkdQICYmIGluc3Qua2luZC5vcGNvZGUgPT0gTW92ZSkgeworICAgICAg
ICAgICAgICAgICAgICBpZiAoKGluc3QuYXJnc1swXS5pc1RtcCgpICYmIG1fdG1wV2lkdGgud2lk
dGgoaW5zdC5hcmdzWzBdLnRtcCgpKSA8PSBBcmc6OldpZHRoMzIpCisgICAgICAgICAgICAgICAg
ICAgICAgICB8fCAoaW5zdC5hcmdzWzFdLmlzVG1wKCkgJiYgbV90bXBXaWR0aC53aWR0aChpbnN0
LmFyZ3NbMV0udG1wKCkpIDw9IEFyZzo6V2lkdGgzMikpCisgICAgICAgICAgICAgICAgICAgICAg
ICBjYW5Vc2VNb3ZlMzJJZkRpZFNwaWxsID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgICAgICAvLyBUcnkgdG8gcmVwbGFjZSB0aGUgcmVnaXN0ZXIgdXNlIGJ5IG1lbW9y
eSB1c2Ugd2hlbiBwb3NzaWJsZS4KKyAgICAgICAgICAgICAgICBpbnN0LmZvckVhY2hBcmcoCisg
ICAgICAgICAgICAgICAgICAgIFsmXSAoQXJnJiBhcmcsIEFyZzo6Um9sZSByb2xlLCBBcmc6OlR5
cGUgYXJnVHlwZSwgQXJnOjpXaWR0aCB3aWR0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAg
aWYgKCFhcmcuaXNUbXAoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Cisg
ICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnVHlwZSAhPSB0eXBlKQorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmcu
aXNSZWcoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAg
ICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gc3RhY2tTbG90RW50
cnkgPSBzdGFja1Nsb3RzLmZpbmQoYXJnLnRtcCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAg
IGlmIChzdGFja1Nsb3RFbnRyeSA9PSBzdGFja1Nsb3RzLmVuZCgpKQorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5zdC5h
ZG1pdHNTdGFjayhhcmcpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhl
IFRtcCBob2xkcyBhIGNvbnN0YW50IHRoZW4gd2Ugd2FudCB0byByZW1hdGVyaWFsaXplIGl0cwor
ICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWUgcmF0aGVyIHRoYW4gbG9hZGluZyBpdCBm
cm9tIHRoZSBzdGFjay4gSW4gb3JkZXIgZm9yIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAg
IC8vIG9wdGltaXphdGlvbiB0byBraWNrIGluLCB3ZSBuZWVkIHRvIGF2b2lkIHBsYWNpbmcgdGhl
IFRtcCdzIHN0YWNrCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGRyZXNzIGludG8gdGhl
IGluc3RydWN0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBcmc6OmlzQ29sZFVz
ZShyb2xlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVzZUNvdW50czxU
bXA+OjpDb3VudHMqIGNvdW50cyA9IG1fdXNlQ291bnRzW2FyZy50bXAoKV07CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgaWYgKGNvdW50cyAmJiBjb3VudHMtPm51bUNvbnN0RGVmcyA9PSAx
ICYmIGNvdW50cy0+bnVtRGVmcyA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAg
ICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIEFyZzo6V2lkdGggc3BpbGxXaWR0aCA9IG1f
dG1wV2lkdGgucmVxdWlyZWRXaWR0aChhcmcudG1wKCkpOworICAgICAgICAgICAgICAgICAgICAg
ICAgaWYgKEFyZzo6aXNBbnlEZWYocm9sZSkgJiYgd2lkdGggPCBzcGlsbFdpZHRoKQorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFT
U0VSVChpbnN0LmtpbmQub3Bjb2RlID09IE1vdmUgfHwgIShBcmc6OmlzQW55VXNlKHJvbGUpICYm
IHdpZHRoID4gc3BpbGxXaWR0aCkpOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAg
ICAgICAgICAgICAgICAgICBpZiAoc3BpbGxXaWR0aCAhPSBBcmc6OldpZHRoMzIpCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgY2FuVXNlTW92ZTMySWZEaWRTcGlsbCA9IGZhbHNlOworICAg
ICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBzdGFja1Nsb3RF
bnRyeS0+dmFsdWUtPmVuc3VyZVNpemUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Fu
VXNlTW92ZTMySWZEaWRTcGlsbCA/IDQgOiBBcmc6OmJ5dGVzKHdpZHRoKSk7CisgICAgICAgICAg
ICAgICAgICAgICAgICBhcmcgPSBBcmc6OnN0YWNrKHN0YWNrU2xvdEVudHJ5LT52YWx1ZSk7Cisg
ICAgICAgICAgICAgICAgICAgICAgICBkaWRTcGlsbCA9IHRydWU7CisgICAgICAgICAgICAgICAg
ICAgIH0pOworCisgICAgICAgICAgICAgICAgaWYgKGRpZFNwaWxsICYmIGNhblVzZU1vdmUzMklm
RGlkU3BpbGwpCisgICAgICAgICAgICAgICAgICAgIGluc3Qua2luZC5vcGNvZGUgPSBNb3ZlMzI7
CisKKyAgICAgICAgICAgICAgICAvLyBGb3IgZXZlcnkgb3RoZXIgY2FzZSwgYWRkIExvYWQvU3Rv
cmUgYXMgbmVlZGVkLgorICAgICAgICAgICAgICAgIGluc3QuZm9yRWFjaFRtcChbJl0gKFRtcCYg
dG1wLCBBcmc6OlJvbGUgcm9sZSwgQXJnOjpUeXBlIGFyZ1R5cGUsIEFyZzo6V2lkdGgpIHsKKyAg
ICAgICAgICAgICAgICAgICAgaWYgKHRtcC5pc1JlZygpIHx8IGFyZ1R5cGUgIT0gdHlwZSkKKyAg
ICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgICAgICAgICBhdXRv
IHN0YWNrU2xvdEVudHJ5ID0gc3RhY2tTbG90cy5maW5kKHRtcCk7CisgICAgICAgICAgICAgICAg
ICAgIGlmIChzdGFja1Nsb3RFbnRyeSA9PSBzdGFja1Nsb3RzLmVuZCgpKSB7CisgICAgICAgICAg
ICAgICAgICAgICAgICBUbXAgYWxpYXMgPSBhbGxvY2F0b3IuZ2V0QWxpYXNXaGVuU3BpbGxpbmco
dG1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbGlhcyAhPSB0bXApIHsKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBhbGlhczsKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBoYXNBbGlhc2VkVG1wcyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgICAgICAgICBBcmc6OldpZHRoIHNwaWxsV2lkdGggPSBtX3RtcFdpZHRo
LnJlcXVpcmVkV2lkdGgodG1wKTsKKyAgICAgICAgICAgICAgICAgICAgT3Bjb2RlIG1vdmUgPSBP
b3BzOworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN0YWNrU2xvdE1pbmltdW1XaWR0aChz
cGlsbFdpZHRoKSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAg
ICAgICAgICAgICBtb3ZlID0gdHlwZSA9PSBBcmc6OkdQID8gTW92ZTMyIDogTW92ZUZsb2F0Owor
ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2Ug
ODoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vdmUgPSB0eXBlID09IEFyZzo6R1AgPyBNb3Zl
IDogTW92ZURvdWJsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAg
ICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgUkVMRUFTRV9BU1NF
UlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gbV9jb2RlLm5ld1Rt
cCh0eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgdW5zcGlsbGFibGVUbXBzLmFkZChBYnNvbHV0
ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh0bXApKTsKKworICAgICAgICAgICAgICAg
ICAgICBBcmcgYXJnID0gQXJnOjpzdGFjayhzdGFja1Nsb3RFbnRyeS0+dmFsdWUpOworICAgICAg
ICAgICAgICAgICAgICBpZiAoQXJnOjppc0FueVVzZShyb2xlKSAmJiByb2xlICE9IEFyZzo6U2Ny
YXRjaCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydGlvblNldC5pbnNlcnQoaW5zdElu
ZGV4LCBtb3ZlLCBpbnN0Lm9yaWdpbiwgYXJnLCB0bXApOworICAgICAgICAgICAgICAgICAgICBp
ZiAoQXJnOjppc0FueURlZihyb2xlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydGlv
blNldC5pbnNlcnQoaW5zdEluZGV4ICsgMSwgbW92ZSwgaW5zdC5vcmlnaW4sIHRtcCwgYXJnKTsK
KyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluc2VydGlv
blNldC5leGVjdXRlKGJsb2NrKTsKKworICAgICAgICAgICAgaWYgKGhhc0FsaWFzZWRUbXBzKSB7
CisgICAgICAgICAgICAgICAgYmxvY2stPmluc3RzKCkucmVtb3ZlQWxsTWF0Y2hpbmcoWyZdIChj
b25zdCBJbnN0JiBpbnN0KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhbGxvY2F0b3Iu
aXNVc2VsZXNzTW92ZShpbnN0KTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgZml4U3BpbGxzQWZ0ZXJUZXJtaW5hbHMoKQor
ICAgIHsKKyAgICAgICAgLy8gQmVjYXVzZSB0aGVyZSBtYXkgYmUgdGVybWluYWxzIHRoYXQgcHJv
ZHVjZSB2YWx1ZXMsIElSQyBtYXkKKyAgICAgICAgLy8gd2FudCB0byBzcGlsbCB0aG9zZSB0ZXJt
aW5hbHMuIEl0J2xsIGhhcHBlbiB0byBzcGlsbCBpdCBhZnRlcgorICAgICAgICAvLyB0aGUgdGVy
bWluYWwuIElmIHdlIGxlZnQgdGhlIGdyYXBoIGluIHRoaXMgc3RhdGUsIGl0J2QgYmUgaW52YWxp
ZAorICAgICAgICAvLyBiZWNhdXNlIGEgdGVybWluYWwgbXVzdCBiZSB0aGUgbGFzdCBpbnN0cnVj
dGlvbiBpbiBhIGJsb2NrLgorICAgICAgICAvLyBXZSBmaXggdGhhdCBoZXJlLgorCisgICAgICAg
IEluc2VydGlvblNldCBpbnNlcnRpb25TZXQobV9jb2RlKTsKKworICAgICAgICBib29sIGFkZGVk
QmxvY2tzID0gZmFsc2U7CisKKyAgICAgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6IG1fY29k
ZSkgeworICAgICAgICAgICAgdW5zaWduZWQgdGVybWluYWxJbmRleCA9IGJsb2NrLT5zaXplKCk7
CisgICAgICAgICAgICBib29sIGZvdW5kVGVybWluYWwgPSBmYWxzZTsKKyAgICAgICAgICAgIHdo
aWxlICh0ZXJtaW5hbEluZGV4LS0pIHsKKyAgICAgICAgICAgICAgICBpZiAoYmxvY2stPmF0KHRl
cm1pbmFsSW5kZXgpLmlzVGVybWluYWwoKSkgeworICAgICAgICAgICAgICAgICAgICBmb3VuZFRl
cm1pbmFsID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgQVNTRVJUX1VOVVNFRChmb3VuZFRlcm1p
bmFsLCBmb3VuZFRlcm1pbmFsKTsKKworICAgICAgICAgICAgaWYgKHRlcm1pbmFsSW5kZXggPT0g
YmxvY2stPnNpemUoKSAtIDEpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAg
ICAgIC8vIFRoZXJlIG11c3QgYmUgaW5zdHJ1Y3Rpb25zIGFmdGVyIHRoZSB0ZXJtaW5hbCBiZWNh
dXNlIGl0J3Mgbm90IHRoZSBsYXN0IGluc3RydWN0aW9uLgorICAgICAgICAgICAgQVNTRVJUKHRl
cm1pbmFsSW5kZXggPCBibG9jay0+c2l6ZSgpIC0gMSk7CisgICAgICAgICAgICBWZWN0b3I8SW5z
dCwgMT4gaW5zdHNUb01vdmU7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSB0ZXJtaW5h
bEluZGV4ICsgMTsgaSA8IGJsb2NrLT5zaXplKCk7IGkrKykKKyAgICAgICAgICAgICAgICBpbnN0
c1RvTW92ZS5hcHBlbmQoYmxvY2stPmF0KGkpKTsKKyAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJU
KGluc3RzVG9Nb3ZlLnNpemUoKSk7CisKKyAgICAgICAgICAgIGZvciAoRnJlcXVlbnRlZEJsb2Nr
JiBmcmVxdWVudGVkU3VjY2Vzc29yIDogYmxvY2stPnN1Y2Nlc3NvcnMoKSkgeworICAgICAgICAg
ICAgICAgIEJhc2ljQmxvY2sqIHN1Y2Nlc3NvciA9IGZyZXF1ZW50ZWRTdWNjZXNzb3IuYmxvY2so
KTsKKyAgICAgICAgICAgICAgICAvLyBJZiBzdWNjZXNzb3IncyBvbmx5IHByZWRlY2Vzc29yIGlz
IGJsb2NrLCB3ZSBjYW4gcGxhbnQgdGhlIHNwaWxsIGluc2lkZQorICAgICAgICAgICAgICAgIC8v
IHRoZSBzdWNjZXNzb3IuIE90aGVyd2lzZSwgd2UgbXVzdCBzcGxpdCB0aGUgY3JpdGljYWwgZWRn
ZSBhbmQgY3JlYXRlCisgICAgICAgICAgICAgICAgLy8gYSBuZXcgYmxvY2sgZm9yIHRoZSBzcGls
bC4KKyAgICAgICAgICAgICAgICBpZiAoc3VjY2Vzc29yLT5udW1QcmVkZWNlc3NvcnMoKSA9PSAx
KSB7CisgICAgICAgICAgICAgICAgICAgIGluc2VydGlvblNldC5pbnNlcnRJbnN0cygwLCBpbnN0
c1RvTW92ZSk7CisgICAgICAgICAgICAgICAgICAgIGluc2VydGlvblNldC5leGVjdXRlKHN1Y2Nl
c3Nvcik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYWRk
ZWRCbG9ja3MgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogV2UgcHJvYmFi
bHkgd2FudCBiZXR0ZXIgYmxvY2sgb3JkZXJpbmcgaGVyZS4KKyAgICAgICAgICAgICAgICAgICAg
QmFzaWNCbG9jayogbmV3QmxvY2sgPSBtX2NvZGUuYWRkQmxvY2soKTsKKyAgICAgICAgICAgICAg
ICAgICAgZm9yIChjb25zdCBJbnN0JiBpbnN0IDogaW5zdHNUb01vdmUpCisgICAgICAgICAgICAg
ICAgICAgICAgICBuZXdCbG9jay0+YXBwZW5kSW5zdChpbnN0KTsKKyAgICAgICAgICAgICAgICAg
ICAgbmV3QmxvY2stPmFwcGVuZEluc3QoSW5zdChKdW1wLCBpbnN0c1RvTW92ZS5sYXN0KCkub3Jp
Z2luKSk7CisgICAgICAgICAgICAgICAgICAgIG5ld0Jsb2NrLT5zdWNjZXNzb3JzKCkuYXBwZW5k
KHN1Y2Nlc3Nvcik7CisgICAgICAgICAgICAgICAgICAgIGZyZXF1ZW50ZWRTdWNjZXNzb3IuYmxv
Y2soKSA9IG5ld0Jsb2NrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgYmxvY2stPnJlc2l6ZSh0ZXJtaW5hbEluZGV4ICsgMSk7CisgICAgICAgIH0KKwor
ICAgICAgICBpZiAoYWRkZWRCbG9ja3MpCisgICAgICAgICAgICBtX2NvZGUucmVzZXRSZWFjaGFi
aWxpdHkoKTsKKyAgICB9CisKKyAgICBDb2RlJiBtX2NvZGU7CisgICAgVG1wV2lkdGggbV90bXBX
aWR0aDsKKyAgICBVc2VDb3VudHM8VG1wPiBtX3VzZUNvdW50czsKKyAgICB1bnNpZ25lZCBtX251
bUl0ZXJhdGlvbnMgeyAwIH07Cit9OworCit9IC8vIGFub255bW91cyBuYW1lc3BhY2UKKwordm9p
ZCBpdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZyhDb2RlJiBjb2RlKQoreworICAgIFBoYXNlU2Nv
cGUgcGhhc2VTY29wZShjb2RlLCAiaXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmciKTsKKyAgICAK
KyAgICBJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZyBpdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2lu
Zyhjb2RlKTsKKyAgICBpdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5ydW4oKTsKK30KKworfSB9
IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCisjZW5kaWYgLy8gRU5BQkxFKEIzX0pJVCkK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyR3JhcGhDb2xvcmluZy5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJHcmFwaENvbG9y
aW5nLmNwcAkocmV2aXNpb24gMjEyNzk3KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fp
ci9BaXJHcmFwaENvbG9yaW5nLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjQsNyArMjQsNyBAQAog
ICovCiAKICNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJBaXJJdGVyYXRlZFJlZ2lzdGVy
Q29hbGVzY2luZy5oIgorI2luY2x1ZGUgIkFpckdyYXBoQ29sb3JpbmcuaCIKIAogI2lmIEVOQUJM
RShCM19KSVQpCiAKQEAgLTQ5LDEzICs0OSwxNSBAQCBib29sIHJlcG9ydFN0YXRzID0gZmFsc2U7
CiAKIC8vIFRoZSBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yIGRlZmluZXMgYWxsIHRoZSBjb2Rl
IHRoYXQgaXMgaW5kZXBlbmRhbnQKIC8vIGZyb20gdGhlIHR5cGUgb3IgcmVnaXN0ZXIgYW5kIGNh
biBiZSBzaGFyZWQgd2hlbiBhbGxvY2F0aW5nIHJlZ2lzdGVycy4KLXRlbXBsYXRlPHR5cGVuYW1l
IEluZGV4VHlwZT4KK3RlbXBsYXRlPHR5cGVuYW1lIEluZGV4VHlwZSwgdHlwZW5hbWUgVG1wTWFw
cGVyPgogY2xhc3MgQWJzdHJhY3RDb2xvcmluZ0FsbG9jYXRvciB7CiBwdWJsaWM6Ci0gICAgQWJz
dHJhY3RDb2xvcmluZ0FsbG9jYXRvcihjb25zdCBWZWN0b3I8UmVnPiYgcmVnc0luUHJpb3JpdHlP
cmRlciwgSW5kZXhUeXBlIGxhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleCwgdW5zaWduZWQgdG1w
QXJyYXlTaXplLCBjb25zdCBIYXNoU2V0PHVuc2lnbmVkPiYgdW5zcGlsbGFibGVUbXApCisgICAg
QWJzdHJhY3RDb2xvcmluZ0FsbG9jYXRvcihDb2RlJiBjb2RlLCBjb25zdCBWZWN0b3I8UmVnPiYg
cmVnc0luUHJpb3JpdHlPcmRlciwgSW5kZXhUeXBlIGxhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRl
eCwgdW5zaWduZWQgdG1wQXJyYXlTaXplLCBjb25zdCBIYXNoU2V0PHVuc2lnbmVkPiYgdW5zcGls
bGFibGVUbXBzLCBjb25zdCBVc2VDb3VudHM8VG1wPiYgdXNlQ291bnRzKQogICAgICAgICA6IG1f
cmVnc0luUHJpb3JpdHlPcmRlcihyZWdzSW5Qcmlvcml0eU9yZGVyKQogICAgICAgICAsIG1fbGFz
dFByZWNvbG9yZWRSZWdpc3RlckluZGV4KGxhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleCkKLSAg
ICAgICAgLCBtX3Vuc3BpbGxhYmxlVG1wcyh1bnNwaWxsYWJsZVRtcCkKKyAgICAgICAgLCBtX3Vu
c3BpbGxhYmxlVG1wcyh1bnNwaWxsYWJsZVRtcHMpCisgICAgICAgICwgbV91c2VDb3VudHModXNl
Q291bnRzKQorICAgICAgICAsIG1fY29kZShjb2RlKQogICAgIHsKICAgICAgICAgZm9yIChSZWcg
cmVnIDogbV9yZWdzSW5Qcmlvcml0eU9yZGVyKQogICAgICAgICAgICAgbV9tdXRhYmxlUmVncy5z
ZXQocmVnKTsKQEAgLTY2LDkgKzY4LDEzIEBAIHB1YmxpYzoKICAgICAgICAgbV9tb3ZlTGlzdC5y
ZXNpemUodG1wQXJyYXlTaXplKTsKICAgICAgICAgbV9jb2FsZXNjZWRUbXBzLmZpbGwoMCwgdG1w
QXJyYXlTaXplKTsKICAgICAgICAgbV9pc09uU2VsZWN0U3RhY2suZW5zdXJlU2l6ZSh0bXBBcnJh
eVNpemUpOworICAgICAgICBtX3NwaWxsV29ya2xpc3QuZW5zdXJlU2l6ZSh0bXBBcnJheVNpemUp
OwogICAgIH0KIAogcHJvdGVjdGVkOgorCisgICAgdW5zaWduZWQgcmVnaXN0ZXJDb3VudCgpIGNv
bnN0IHsgcmV0dXJuIG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCk7IH0KKwogICAgIEluZGV4
VHlwZSBnZXRBbGlhcyhJbmRleFR5cGUgdG1wSW5kZXgpIGNvbnN0CiAgICAgewogICAgICAgICBJ
bmRleFR5cGUgYWxpYXMgPSB0bXBJbmRleDsKQEAgLTg0LDIwICs5MCw2IEBAIHByb3RlY3RlZDoK
ICAgICAgICAgYWRkRWRnZURpc3RpbmN0KGEsIGIpOwogICAgIH0KIAotICAgIHZvaWQgbWFrZVdv
cmtMaXN0KCkKLSAgICB7Ci0gICAgICAgIEluZGV4VHlwZSBmaXJzdE5vblJlZ0luZGV4ID0gbV9s
YXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXggKyAxOwotICAgICAgICBmb3IgKEluZGV4VHlwZSBp
ID0gZmlyc3ROb25SZWdJbmRleDsgaSA8IG1fZGVncmVlcy5zaXplKCk7ICsraSkgewotICAgICAg
ICAgICAgdW5zaWduZWQgZGVncmVlID0gbV9kZWdyZWVzW2ldOwotICAgICAgICAgICAgaWYgKGRl
Z3JlZSA+PSBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpKQotICAgICAgICAgICAgICAgIGFk
ZFRvU3BpbGwoaSk7Ci0gICAgICAgICAgICBlbHNlIGlmICghbV9tb3ZlTGlzdFtpXS5pc0VtcHR5
KCkpCi0gICAgICAgICAgICAgICAgbV9mcmVlemVXb3JrbGlzdC5hZGQoaSk7Ci0gICAgICAgICAg
ICBlbHNlCi0gICAgICAgICAgICAgICAgbV9zaW1wbGlmeVdvcmtsaXN0LmFwcGVuZChpKTsKLSAg
ICAgICAgfQotICAgIH0KLQogICAgIHZvaWQgYWRkVG9TcGlsbCh1bnNpZ25lZCB0b1NwaWxsKQog
ICAgIHsKICAgICAgICAgaWYgKG1fdW5zcGlsbGFibGVUbXBzLmNvbnRhaW5zKHRvU3BpbGwpKQpA
QCAtMTA2LDE0NyArOTgsMTEgQEAgcHJvdGVjdGVkOgogICAgICAgICBtX3NwaWxsV29ya2xpc3Qu
YWRkKHRvU3BpbGwpOwogICAgIH0KIAotICAgIC8vIExvdy1kZWdyZWUgdmVydGV4IGNhbiBhbHdh
eXMgYmUgY29sb3JlZDoganVzdCBwaWNrIGFueSBvZiB0aGUgY29sb3IgdGFrZW4gYnkgYW55Ci0g
ICAgLy8gb3RoZXIgYWRqYWNlbnQgdmVyaWNlcy4KLSAgICAvLyBUaGUgIlNpbXBsaWZ5IiBwaGFz
ZSB0YWtlcyBhIGxvdy1kZWdyZWUgb3V0IG9mIHRoZSBpbnRlcmZlcmVuY2UgZ3JhcGggdG8gc2lt
cGxpZnkgaXQuCi0gICAgdm9pZCBzaW1wbGlmeSgpCi0gICAgewotICAgICAgICBJbmRleFR5cGUg
bGFzdEluZGV4ID0gbV9zaW1wbGlmeVdvcmtsaXN0LnRha2VMYXN0KCk7Ci0KLSAgICAgICAgQVNT
RVJUKCFtX3NlbGVjdFN0YWNrLmNvbnRhaW5zKGxhc3RJbmRleCkpOwotICAgICAgICBBU1NFUlQo
IW1faXNPblNlbGVjdFN0YWNrLmdldChsYXN0SW5kZXgpKTsKLSAgICAgICAgbV9zZWxlY3RTdGFj
ay5hcHBlbmQobGFzdEluZGV4KTsKLSAgICAgICAgbV9pc09uU2VsZWN0U3RhY2sucXVpY2tTZXQo
bGFzdEluZGV4KTsKLQotICAgICAgICBmb3JFYWNoQWRqYWNlbnQobGFzdEluZGV4LCBbdGhpc10o
SW5kZXhUeXBlIGFkamFjZW50VG1wSW5kZXgpIHsKLSAgICAgICAgICAgIGRlY3JlbWVudERlZ3Jl
ZShhZGphY2VudFRtcEluZGV4KTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBmcmVl
emUoKQotICAgIHsKLSAgICAgICAgSW5kZXhUeXBlIHZpY3RpbUluZGV4ID0gbV9mcmVlemVXb3Jr
bGlzdC50YWtlQW55KCk7Ci0gICAgICAgIEFTU0VSVF9XSVRIX01FU1NBR0UoZ2V0QWxpYXModmlj
dGltSW5kZXgpID09IHZpY3RpbUluZGV4LCAiY29hbGVzY2UoKSBzaG91bGQgbm90IGxlYXZlIGFs
aWFzZWQgVG1wIGluIHRoZSB3b3JrbGlzdC4iKTsKLSAgICAgICAgbV9zaW1wbGlmeVdvcmtsaXN0
LmFwcGVuZCh2aWN0aW1JbmRleCk7Ci0gICAgICAgIGZyZWV6ZU1vdmVzKHZpY3RpbUluZGV4KTsK
LSAgICB9Ci0KLSAgICB2b2lkIGZyZWV6ZU1vdmVzKEluZGV4VHlwZSB0bXBJbmRleCkKLSAgICB7
Ci0gICAgICAgIGZvckVhY2hOb2RlTW92ZXModG1wSW5kZXgsIFt0aGlzLCB0bXBJbmRleF0gKElu
ZGV4VHlwZSBtb3ZlSW5kZXgpIHsKLSAgICAgICAgICAgIGlmICghbV9hY3RpdmVNb3Zlcy5xdWlj
a0NsZWFyKG1vdmVJbmRleCkpCi0gICAgICAgICAgICAgICAgbV93b3JrbGlzdE1vdmVzLnRha2VN
b3ZlKG1vdmVJbmRleCk7Ci0KLSAgICAgICAgICAgIGNvbnN0IE1vdmVPcGVyYW5kcyYgbW92ZU9w
ZXJhbmRzID0gbV9jb2FsZXNjaW5nQ2FuZGlkYXRlc1ttb3ZlSW5kZXhdOwotICAgICAgICAgICAg
SW5kZXhUeXBlIHNyY1RtcEluZGV4ID0gbW92ZU9wZXJhbmRzLnNyY0luZGV4OwotICAgICAgICAg
ICAgSW5kZXhUeXBlIGRzdFRtcEluZGV4ID0gbW92ZU9wZXJhbmRzLmRzdEluZGV4OwotCi0gICAg
ICAgICAgICBJbmRleFR5cGUgb3JpZ2luYWxPdGhlclRtcCA9IHNyY1RtcEluZGV4ICE9IHRtcElu
ZGV4ID8gc3JjVG1wSW5kZXggOiBkc3RUbXBJbmRleDsKLSAgICAgICAgICAgIEluZGV4VHlwZSBv
dGhlclRtcEluZGV4ID0gZ2V0QWxpYXMob3JpZ2luYWxPdGhlclRtcCk7Ci0gICAgICAgICAgICBp
ZiAobV9kZWdyZWVzW290aGVyVG1wSW5kZXhdIDwgbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUo
KSAmJiAhaXNNb3ZlUmVsYXRlZChvdGhlclRtcEluZGV4KSkgewotICAgICAgICAgICAgICAgIGlm
IChtX2ZyZWV6ZVdvcmtsaXN0LnJlbW92ZShvdGhlclRtcEluZGV4KSkKLSAgICAgICAgICAgICAg
ICAgICAgbV9zaW1wbGlmeVdvcmtsaXN0LmFwcGVuZChvdGhlclRtcEluZGV4KTsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBjb2FsZXNjZSgpCi0gICAgewot
ICAgICAgICB1bnNpZ25lZCBtb3ZlSW5kZXggPSBtX3dvcmtsaXN0TW92ZXMudGFrZUxhc3RNb3Zl
KCk7Ci0gICAgICAgIGNvbnN0IE1vdmVPcGVyYW5kcyYgbW92ZU9wZXJhbmRzID0gbV9jb2FsZXNj
aW5nQ2FuZGlkYXRlc1ttb3ZlSW5kZXhdOwotICAgICAgICBJbmRleFR5cGUgdSA9IGdldEFsaWFz
KG1vdmVPcGVyYW5kcy5zcmNJbmRleCk7Ci0gICAgICAgIEluZGV4VHlwZSB2ID0gZ2V0QWxpYXMo
bW92ZU9wZXJhbmRzLmRzdEluZGV4KTsKLQotICAgICAgICBpZiAoaXNQcmVjb2xvcmVkKHYpKQot
ICAgICAgICAgICAgc3RkOjpzd2FwKHUsIHYpOwotCi0gICAgICAgIGlmICh0cmFjZURlYnVnKQot
ICAgICAgICAgICAgZGF0YUxvZygiQ29hbGVzY2luZyBtb3ZlIGF0IGluZGV4ICIsIG1vdmVJbmRl
eCwgIiB1ID0gIiwgdSwgIiB2ID0gIiwgdiwgIlxuIik7Ci0KLSAgICAgICAgaWYgKHUgPT0gdikg
ewotICAgICAgICAgICAgYWRkV29ya0xpc3QodSk7Ci0KLSAgICAgICAgICAgIGlmICh0cmFjZURl
YnVnKQotICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICBDb2FsZXNjZWRcbiIpOwotICAgICAg
ICB9IGVsc2UgaWYgKGlzUHJlY29sb3JlZCh2KQotICAgICAgICAgICAgfHwgbV9pbnRlcmZlcmVu
Y2VFZGdlcy5jb250YWlucyhJbnRlcmZlcmVuY2VFZGdlKHUsIHYpKQotICAgICAgICAgICAgfHwg
KHUgPT0gbV9mcmFtZVBvaW50ZXJJbmRleCAmJiBtX2ludGVyZmVyZXNXaXRoRnJhbWVQb2ludGVy
LnF1aWNrR2V0KHYpKSkgewotICAgICAgICAgICAgYWRkV29ya0xpc3QodSk7Ci0gICAgICAgICAg
ICBhZGRXb3JrTGlzdCh2KTsKLQotICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpCi0gICAgICAg
ICAgICAgICAgZGF0YUxvZygiICAgIENvbnN0cmFpbmVkXG4iKTsKLSAgICAgICAgfSBlbHNlIGlm
IChjYW5CZVNhZmVseUNvYWxlc2NlZCh1LCB2KSkgewotICAgICAgICAgICAgY29tYmluZSh1LCB2
KTsKLSAgICAgICAgICAgIGFkZFdvcmtMaXN0KHUpOwotICAgICAgICAgICAgbV9oYXNDb2FsZXNj
ZWROb25Ucml2aWFsTW92ZSA9IHRydWU7Ci0KLSAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQot
ICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICBTYWZlIENvYWxlc2NpbmdcbiIpOwotICAgICAg
ICB9IGVsc2UgewotICAgICAgICAgICAgbV9hY3RpdmVNb3Zlcy5xdWlja1NldChtb3ZlSW5kZXgp
OwotCi0gICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKLSAgICAgICAgICAgICAgICBkYXRhTG9n
KCIgICAgRmFpbGVkIGNvYWxlc2NpbmcsIGFkZGVkIHRvIGFjdGl2ZSBtb3Zlcy5cbiIpOwotICAg
ICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBhc3NpZ25Db2xvcnMoKQorICAgIGJvb2wgaXNQcmVj
b2xvcmVkKEluZGV4VHlwZSB0bXBJbmRleCkKICAgICB7Ci0gICAgICAgIEFTU0VSVChtX3NpbXBs
aWZ5V29ya2xpc3QuaXNFbXB0eSgpKTsKLSAgICAgICAgQVNTRVJUKG1fd29ya2xpc3RNb3Zlcy5p
c0VtcHR5KCkpOwotICAgICAgICBBU1NFUlQobV9mcmVlemVXb3JrbGlzdC5pc0VtcHR5KCkpOwot
ICAgICAgICBBU1NFUlQobV9zcGlsbFdvcmtsaXN0LmlzRW1wdHkoKSk7Ci0KLSAgICAgICAgLy8g
UmVjbGFpbSBhcyBtdWNoIG1lbW9yeSBhcyBwb3NzaWJsZS4KLSAgICAgICAgbV9pbnRlcmZlcmVu
Y2VFZGdlcy5jbGVhcigpOwotICAgICAgICBtX2RlZ3JlZXMuY2xlYXIoKTsKLSAgICAgICAgbV9t
b3ZlTGlzdC5jbGVhcigpOwotICAgICAgICBtX3dvcmtsaXN0TW92ZXMuY2xlYXIoKTsKLSAgICAg
ICAgbV9zaW1wbGlmeVdvcmtsaXN0LmNsZWFyKCk7Ci0gICAgICAgIG1fc3BpbGxXb3JrbGlzdC5j
bGVhcigpOwotICAgICAgICBtX2ZyZWV6ZVdvcmtsaXN0LmNsZWFyKCk7Ci0KLSAgICAgICAgLy8g
VHJ5IHRvIGNvbG9yIHRoZSBUbXAgb24gdGhlIHN0YWNrLgotICAgICAgICBtX2NvbG9yZWRUbXAu
cmVzaXplKG1fYWRqYWNlbmN5TGlzdC5zaXplKCkpOwotCi0gICAgICAgIHdoaWxlICghbV9zZWxl
Y3RTdGFjay5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIHRtcEluZGV4ID0gbV9z
ZWxlY3RTdGFjay50YWtlTGFzdCgpOwotICAgICAgICAgICAgQVNTRVJUKCFpc1ByZWNvbG9yZWQo
dG1wSW5kZXgpKTsKLSAgICAgICAgICAgIEFTU0VSVCghbV9jb2xvcmVkVG1wW3RtcEluZGV4XSk7
Ci0KLSAgICAgICAgICAgIFJlZ2lzdGVyU2V0IGNvbG9yZWRSZWdpc3RlcnM7Ci0gICAgICAgICAg
ICBmb3IgKEluZGV4VHlwZSBhZGphY2VudFRtcEluZGV4IDogbV9hZGphY2VuY3lMaXN0W3RtcElu
ZGV4XSkgewotICAgICAgICAgICAgICAgIEluZGV4VHlwZSBhbGlhc1RtcEluZGV4ID0gZ2V0QWxp
YXMoYWRqYWNlbnRUbXBJbmRleCk7Ci0gICAgICAgICAgICAgICAgUmVnIHJlZyA9IG1fY29sb3Jl
ZFRtcFthbGlhc1RtcEluZGV4XTsKLQotICAgICAgICAgICAgICAgIEFTU0VSVCghaXNQcmVjb2xv
cmVkKGFsaWFzVG1wSW5kZXgpIHx8IChpc1ByZWNvbG9yZWQoYWxpYXNUbXBJbmRleCkgJiYgcmVn
KSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVnKQotICAgICAgICAgICAgICAgICAgICBjb2xv
cmVkUmVnaXN0ZXJzLnNldChyZWcpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBib29s
IGNvbG9yQXNzaWduZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGZvciAoUmVnIHJlZyA6IG1fcmVn
c0luUHJpb3JpdHlPcmRlcikgewotICAgICAgICAgICAgICAgIGlmICghY29sb3JlZFJlZ2lzdGVy
cy5nZXQocmVnKSkgewotICAgICAgICAgICAgICAgICAgICBtX2NvbG9yZWRUbXBbdG1wSW5kZXhd
ID0gcmVnOwotICAgICAgICAgICAgICAgICAgICBjb2xvckFzc2lnbmVkID0gdHJ1ZTsKLSAgICAg
ICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQot
Ci0gICAgICAgICAgICBpZiAoIWNvbG9yQXNzaWduZWQpCi0gICAgICAgICAgICAgICAgbV9zcGls
bGVkVG1wcy5hcHBlbmQodG1wSW5kZXgpOwotICAgICAgICB9Ci0gICAgICAgIG1fc2VsZWN0U3Rh
Y2suY2xlYXIoKTsKLQotICAgICAgICBpZiAobV9zcGlsbGVkVG1wcy5pc0VtcHR5KCkpCi0gICAg
ICAgICAgICBtX2NvYWxlc2NlZFRtcHNBdFNwaWxsLmNsZWFyKCk7Ci0gICAgICAgIGVsc2UKLSAg
ICAgICAgICAgIG1fY29sb3JlZFRtcC5jbGVhcigpOworICAgICAgICByZXR1cm4gdG1wSW5kZXgg
PD0gbV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXg7CiAgICAgfQogCi1wcml2YXRlOgogICAg
IHZvaWQgaW5pdGlhbGl6ZURlZ3JlZXModW5zaWduZWQgdG1wQXJyYXlTaXplKQogICAgIHsKICAg
ICAgICAgbV9kZWdyZWVzLnJlc2l6ZSh0bXBBcnJheVNpemUpOwpAQCAtMjYyLDcgKzExOCw4IEBA
IHByaXZhdGU6CiAgICAgdm9pZCBhZGRFZGdlRGlzdGluY3QoSW5kZXhUeXBlIGEsIEluZGV4VHlw
ZSBiKQogICAgIHsKICAgICAgICAgQVNTRVJUKGEgIT0gYik7Ci0gICAgICAgIGlmIChtX2ludGVy
ZmVyZW5jZUVkZ2VzLmFkZChJbnRlcmZlcmVuY2VFZGdlKGEsIGIpKS5pc05ld0VudHJ5KSB7Cisg
ICAgICAgIGJvb2wgaXNOZXdFZGdlID0gYWRkSW50ZXJmZXJlbmNlRWRnZShJbnRlcmZlcmVuY2VF
ZGdlKGEsIGIpKTsKKyAgICAgICAgaWYgKGlzTmV3RWRnZSkgewogICAgICAgICAgICAgaWYgKCFp
c1ByZWNvbG9yZWQoYSkpIHsKICAgICAgICAgICAgICAgICBBU1NFUlQoIW1fYWRqYWNlbmN5TGlz
dFthXS5jb250YWlucyhiKSk7CiAgICAgICAgICAgICAgICAgbV9hZGphY2VuY3lMaXN0W2FdLmFw
cGVuZChiKTsKQEAgLTI3NywyNiArMTM0LDExIEBAIHByaXZhdGU6CiAgICAgICAgIH0KICAgICB9
CiAKLSAgICB2b2lkIGRlY3JlbWVudERlZ3JlZShJbmRleFR5cGUgdG1wSW5kZXgpCi0gICAgewot
ICAgICAgICBBU1NFUlQobV9kZWdyZWVzW3RtcEluZGV4XSk7Ci0KLSAgICAgICAgdW5zaWduZWQg
b2xkRGVncmVlID0gbV9kZWdyZWVzW3RtcEluZGV4XS0tOwotICAgICAgICBpZiAob2xkRGVncmVl
ID09IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkpIHsKLSAgICAgICAgICAgIGVuYWJsZU1v
dmVzT25WYWx1ZUFuZEFkamFjZW50cyh0bXBJbmRleCk7Ci0gICAgICAgICAgICBtX3NwaWxsV29y
a2xpc3QucmVtb3ZlKHRtcEluZGV4KTsKLSAgICAgICAgICAgIGlmIChpc01vdmVSZWxhdGVkKHRt
cEluZGV4KSkKLSAgICAgICAgICAgICAgICBtX2ZyZWV6ZVdvcmtsaXN0LmFkZCh0bXBJbmRleCk7
Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbV9zaW1wbGlmeVdvcmtsaXN0LmFw
cGVuZCh0bXBJbmRleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQogICAgIGJvb2wgYWRkRWRnZURp
c3RpbmN0V2l0aG91dERlZ3JlZUNoYW5nZShJbmRleFR5cGUgYSwgSW5kZXhUeXBlIGIpCiAgICAg
ewogICAgICAgICBBU1NFUlQoYSAhPSBiKTsKLSAgICAgICAgaWYgKG1faW50ZXJmZXJlbmNlRWRn
ZXMuYWRkKEludGVyZmVyZW5jZUVkZ2UoYSwgYikpLmlzTmV3RW50cnkpIHsKKyAgICAgICAgYm9v
bCBpc05ld0VkZ2UgPSBhZGRJbnRlcmZlcmVuY2VFZGdlKEludGVyZmVyZW5jZUVkZ2UoYSwgYikp
OworICAgICAgICBpZiAoaXNOZXdFZGdlKSB7CiAgICAgICAgICAgICBpZiAoIWlzUHJlY29sb3Jl
ZChhKSkgewogICAgICAgICAgICAgICAgIEFTU0VSVCghbV9hZGphY2VuY3lMaXN0W2FdLmNvbnRh
aW5zKGIpKTsKICAgICAgICAgICAgICAgICBtX2FkamFjZW5jeUxpc3RbYV0uYXBwZW5kKGIpOwpA
QCAtMzExLDE1ICsxNTMsNiBAQCBwcml2YXRlOgogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAg
fQogCi0gICAgYm9vbCBpc01vdmVSZWxhdGVkKEluZGV4VHlwZSB0bXBJbmRleCkKLSAgICB7Ci0g
ICAgICAgIGZvciAodW5zaWduZWQgbW92ZUluZGV4IDogbV9tb3ZlTGlzdFt0bXBJbmRleF0pIHsK
LSAgICAgICAgICAgIGlmIChtX2FjdGl2ZU1vdmVzLnF1aWNrR2V0KG1vdmVJbmRleCkgfHwgbV93
b3JrbGlzdE1vdmVzLmNvbnRhaW5zKG1vdmVJbmRleCkpCi0gICAgICAgICAgICAgICAgcmV0dXJu
IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQogICAgIHRl
bXBsYXRlPHR5cGVuYW1lIEZ1bmN0aW9uPgogICAgIHZvaWQgZm9yRWFjaEFkamFjZW50KEluZGV4
VHlwZSB0bXBJbmRleCwgRnVuY3Rpb24gZnVuY3Rpb24pCiAgICAgewpAQCAtMzMxLDgwICsxNjQs
MTIgQEAgcHJpdmF0ZToKIAogICAgIGJvb2wgaGFzQmVlblNpbXBsaWZpZWQoSW5kZXhUeXBlIHRt
cEluZGV4KQogICAgIHsKLSAgICAgICAgcmV0dXJuIG1faXNPblNlbGVjdFN0YWNrLnF1aWNrR2V0
KHRtcEluZGV4KSB8fCAhIW1fY29hbGVzY2VkVG1wc1t0bXBJbmRleF07Ci0gICAgfQotCi0gICAg
dGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rpb24+Ci0gICAgdm9pZCBmb3JFYWNoTm9kZU1vdmVzKElu
ZGV4VHlwZSB0bXBJbmRleCwgRnVuY3Rpb24gZnVuY3Rpb24pCi0gICAgewotICAgICAgICBmb3Ig
KHVuc2lnbmVkIG1vdmVJbmRleCA6IG1fbW92ZUxpc3RbdG1wSW5kZXhdKSB7Ci0gICAgICAgICAg
ICBpZiAobV9hY3RpdmVNb3Zlcy5xdWlja0dldChtb3ZlSW5kZXgpIHx8IG1fd29ya2xpc3RNb3Zl
cy5jb250YWlucyhtb3ZlSW5kZXgpKQotICAgICAgICAgICAgICAgIGZ1bmN0aW9uKG1vdmVJbmRl
eCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGVuYWJsZU1vdmVzT25WYWx1ZShJbmRl
eFR5cGUgdG1wSW5kZXgpCi0gICAgewotICAgICAgICBmb3IgKHVuc2lnbmVkIG1vdmVJbmRleCA6
IG1fbW92ZUxpc3RbdG1wSW5kZXhdKSB7Ci0gICAgICAgICAgICBpZiAobV9hY3RpdmVNb3Zlcy5x
dWlja0NsZWFyKG1vdmVJbmRleCkpCi0gICAgICAgICAgICAgICAgbV93b3JrbGlzdE1vdmVzLnJl
dHVybk1vdmUobW92ZUluZGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZW5hYmxl
TW92ZXNPblZhbHVlQW5kQWRqYWNlbnRzKEluZGV4VHlwZSB0bXBJbmRleCkKLSAgICB7Ci0gICAg
ICAgIGVuYWJsZU1vdmVzT25WYWx1ZSh0bXBJbmRleCk7Ci0KLSAgICAgICAgZm9yRWFjaEFkamFj
ZW50KHRtcEluZGV4LCBbdGhpc10gKEluZGV4VHlwZSBhZGphY2VudFRtcEluZGV4KSB7Ci0gICAg
ICAgICAgICBlbmFibGVNb3Zlc09uVmFsdWUoYWRqYWNlbnRUbXBJbmRleCk7Ci0gICAgICAgIH0p
OwotICAgIH0KLQotICAgIGJvb2wgaXNQcmVjb2xvcmVkKEluZGV4VHlwZSB0bXBJbmRleCkKLSAg
ICB7Ci0gICAgICAgIHJldHVybiB0bXBJbmRleCA8PSBtX2xhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJ
bmRleDsKLSAgICB9Ci0KLSAgICB2b2lkIGFkZFdvcmtMaXN0KEluZGV4VHlwZSB0bXBJbmRleCkK
LSAgICB7Ci0gICAgICAgIGlmICghaXNQcmVjb2xvcmVkKHRtcEluZGV4KSAmJiBtX2RlZ3JlZXNb
dG1wSW5kZXhdIDwgbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKSAmJiAhaXNNb3ZlUmVsYXRl
ZCh0bXBJbmRleCkpIHsKLSAgICAgICAgICAgIG1fZnJlZXplV29ya2xpc3QucmVtb3ZlKHRtcElu
ZGV4KTsKLSAgICAgICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5hcHBlbmQodG1wSW5kZXgpOwor
ICAgICAgICBpZiAoIUFTU0VSVF9ESVNBQkxFRCkgeworICAgICAgICAgICAgaWYgKCEhbV9jb2Fs
ZXNjZWRUbXBzW3RtcEluZGV4XSkKKyAgICAgICAgICAgICAgICBBU1NFUlQoZ2V0QWxpYXModG1w
SW5kZXgpICE9IHRtcEluZGV4KTsKICAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgY29tYmlu
ZShJbmRleFR5cGUgdSwgSW5kZXhUeXBlIHYpCi0gICAgewotICAgICAgICBpZiAoIW1fZnJlZXpl
V29ya2xpc3QucmVtb3ZlKHYpKQotICAgICAgICAgICAgbV9zcGlsbFdvcmtsaXN0LnJlbW92ZSh2
KTsKLQotICAgICAgICBBU1NFUlQoIW1fY29hbGVzY2VkVG1wc1t2XSk7Ci0gICAgICAgIG1fY29h
bGVzY2VkVG1wc1t2XSA9IHU7Ci0KLSAgICAgICAgYXV0byYgdk1vdmVzID0gbV9tb3ZlTGlzdFt2
XTsKLSAgICAgICAgbV9tb3ZlTGlzdFt1XS5hZGQodk1vdmVzLmJlZ2luKCksIHZNb3Zlcy5lbmQo
KSk7Ci0KLSAgICAgICAgZm9yRWFjaEFkamFjZW50KHYsIFt0aGlzLCB1XSAoSW5kZXhUeXBlIGFk
amFjZW50VG1wSW5kZXgpIHsKLSAgICAgICAgICAgIGlmIChhZGRFZGdlRGlzdGluY3RXaXRob3V0
RGVncmVlQ2hhbmdlKGFkamFjZW50VG1wSW5kZXgsIHUpKSB7Ci0gICAgICAgICAgICAgICAgLy8g
SWYgd2UgYWRkZWQgYSBuZXcgZWRnZSBiZXR3ZWVuIHRoZSBhZGphY2VudFRtcCBhbmQgdSwgaXQg
cmVwbGFjZXMgdGhlIGVkZ2UKLSAgICAgICAgICAgICAgICAvLyB0aGF0IGV4aXN0ZWQgd2l0aCB2
LgotICAgICAgICAgICAgICAgIC8vIFRoZSBkZWdyZWUgb2YgYWRqYWNlbnRUbXAgcmVtYWlucyB0
aGUgc2FtZSBzaW5jZSB0aGUgZWRnZSBqdXN0IGNoYW5nZWQgZnJvbSB1IHRvIHYuCi0gICAgICAg
ICAgICAgICAgLy8gQWxsIHdlIG5lZWQgdG8gZG8gaXMgdXBkYXRlIHRoZSBkZWdyZWUgb2YgdS4K
LSAgICAgICAgICAgICAgICBpZiAoIWlzUHJlY29sb3JlZCh1KSkKLSAgICAgICAgICAgICAgICAg
ICAgbV9kZWdyZWVzW3VdKys7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAg
IC8vIElmIHdlIGFscmVhZHkgaGFkIGFuIGVkZ2UgYmV0d2VlbiB0aGUgYWRqYWNlbnRUbXAgYW5k
IHUsIHRoZSBkZWdyZWUgb2YgdQotICAgICAgICAgICAgICAgIC8vIGlzIGFscmVhZHkgY29ycmVj
dC4gVGhlIGRlZ3JlZSBvZiB0aGUgYWRqYWNlbnRUbXAgZGVjcmVhc2VzIHNpbmNlIHRoZSBlZGdl
Ci0gICAgICAgICAgICAgICAgLy8gd2l0aCB2IGlzIG5vIGxvbmdlciByZWxldmFudCAod2UgY2Fu
IHRoaW5rIG9mIGl0IGFzIG1lcmdlZCB3aXRoIHRoZSBlZGdlIHdpdGggdSkuCi0gICAgICAgICAg
ICAgICAgZGVjcmVtZW50RGVncmVlKGFkamFjZW50VG1wSW5kZXgpOwotICAgICAgICAgICAgfQot
ICAgICAgICB9KTsKLQotICAgICAgICBpZiAobV9mcmFtZVBvaW50ZXJJbmRleCAmJiBtX2ludGVy
ZmVyZXNXaXRoRnJhbWVQb2ludGVyLnF1aWNrR2V0KHYpKQotICAgICAgICAgICAgbV9pbnRlcmZl
cmVzV2l0aEZyYW1lUG9pbnRlci5xdWlja1NldCh1KTsKIAotICAgICAgICBpZiAobV9kZWdyZWVz
W3VdID49IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkgJiYgbV9mcmVlemVXb3JrbGlzdC5y
ZW1vdmUodSkpCi0gICAgICAgICAgICBhZGRUb1NwaWxsKHUpOworICAgICAgICByZXR1cm4gbV9p
c09uU2VsZWN0U3RhY2sucXVpY2tHZXQodG1wSW5kZXgpIHx8ICEhbV9jb2FsZXNjZWRUbXBzW3Rt
cEluZGV4XTsKICAgICB9CiAKICAgICBib29sIGNhbkJlU2FmZWx5Q29hbGVzY2VkKEluZGV4VHlw
ZSB1LCBJbmRleFR5cGUgdikKQEAgLTQyOSw3ICsxOTQsNyBAQCBwcml2YXRlOgogICAgICAgICBj
b25zdCBhdXRvJiBhZGphY2VudHNPZlUgPSBtX2FkamFjZW5jeUxpc3RbdV07CiAgICAgICAgIGNv
bnN0IGF1dG8mIGFkamFjZW50c09mViA9IG1fYWRqYWNlbmN5TGlzdFt2XTsKIAotICAgICAgICBp
ZiAoYWRqYWNlbnRzT2ZVLnNpemUoKSArIGFkamFjZW50c09mVi5zaXplKCkgPCBtX3JlZ3NJblBy
aW9yaXR5T3JkZXIuc2l6ZSgpKSB7CisgICAgICAgIGlmIChhZGphY2VudHNPZlUuc2l6ZSgpICsg
YWRqYWNlbnRzT2ZWLnNpemUoKSA8IHJlZ2lzdGVyQ291bnQoKSkgewogICAgICAgICAgICAgLy8g
U2hvcnRjdXQ6IGlmIHRoZSB0b3RhbCBudW1iZXIgb2YgYWRqYWNlbnRzIGlzIGxlc3MgdGhhbiB0
aGUgbnVtYmVyIG9mIHJlZ2lzdGVyLCB0aGUgY29uZGl0aW9uIGlzIGFsd2F5cyBtZXQuCiAgICAg
ICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQpAQCAtNDM5LDIzICsyMDQsMjMgQEAgcHJp
dmF0ZToKICAgICAgICAgZm9yIChJbmRleFR5cGUgYWRqYWNlbnRUbXBJbmRleCA6IGFkamFjZW50
c09mVSkgewogICAgICAgICAgICAgQVNTRVJUKGFkamFjZW50VG1wSW5kZXggIT0gdik7CiAgICAg
ICAgICAgICBBU1NFUlQoYWRqYWNlbnRUbXBJbmRleCAhPSB1KTsKLSAgICAgICAgICAgIGlmICgh
aGFzQmVlblNpbXBsaWZpZWQoYWRqYWNlbnRUbXBJbmRleCkgJiYgbV9kZWdyZWVzW2FkamFjZW50
VG1wSW5kZXhdID49IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkpIHsKKyAgICAgICAgICAg
IGlmICghaGFzQmVlblNpbXBsaWZpZWQoYWRqYWNlbnRUbXBJbmRleCkgJiYgbV9kZWdyZWVzW2Fk
amFjZW50VG1wSW5kZXhdID49IHJlZ2lzdGVyQ291bnQoKSkgewogICAgICAgICAgICAgICAgIGF1
dG8gYWRkUmVzdWx0ID0gaGlnaE9yZGVyQWRqYWNlbnRzLmFkZChhZGphY2VudFRtcEluZGV4KTsK
LSAgICAgICAgICAgICAgICBpZiAoYWRkUmVzdWx0LmlzTmV3RW50cnkgJiYgaGlnaE9yZGVyQWRq
YWNlbnRzLnNpemUoKSA+PSBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpKQorICAgICAgICAg
ICAgICAgIGlmIChhZGRSZXN1bHQuaXNOZXdFbnRyeSAmJiBoaWdoT3JkZXJBZGphY2VudHMuc2l6
ZSgpID49IHJlZ2lzdGVyQ291bnQoKSkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGZvciAoSW5kZXhUeXBlIGFkamFj
ZW50VG1wSW5kZXggOiBhZGphY2VudHNPZlYpIHsKICAgICAgICAgICAgIEFTU0VSVChhZGphY2Vu
dFRtcEluZGV4ICE9IHUpOwogICAgICAgICAgICAgQVNTRVJUKGFkamFjZW50VG1wSW5kZXggIT0g
dik7Ci0gICAgICAgICAgICBpZiAoIWhhc0JlZW5TaW1wbGlmaWVkKGFkamFjZW50VG1wSW5kZXgp
ICYmIG1fZGVncmVlc1thZGphY2VudFRtcEluZGV4XSA+PSBtX3JlZ3NJblByaW9yaXR5T3JkZXIu
c2l6ZSgpKSB7CisgICAgICAgICAgICBpZiAoIWhhc0JlZW5TaW1wbGlmaWVkKGFkamFjZW50VG1w
SW5kZXgpICYmIG1fZGVncmVlc1thZGphY2VudFRtcEluZGV4XSA+PSByZWdpc3RlckNvdW50KCkp
IHsKICAgICAgICAgICAgICAgICBhdXRvIGFkZFJlc3VsdCA9IGhpZ2hPcmRlckFkamFjZW50cy5h
ZGQoYWRqYWNlbnRUbXBJbmRleCk7Ci0gICAgICAgICAgICAgICAgaWYgKGFkZFJlc3VsdC5pc05l
d0VudHJ5ICYmIGhpZ2hPcmRlckFkamFjZW50cy5zaXplKCkgPj0gbV9yZWdzSW5Qcmlvcml0eU9y
ZGVyLnNpemUoKSkKKyAgICAgICAgICAgICAgICBpZiAoYWRkUmVzdWx0LmlzTmV3RW50cnkgJiYg
aGlnaE9yZGVyQWRqYWNlbnRzLnNpemUoKSA+PSByZWdpc3RlckNvdW50KCkpCiAgICAgICAgICAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAg
ICAgIEFTU0VSVChoaWdoT3JkZXJBZGphY2VudHMuc2l6ZSgpIDwgbV9yZWdzSW5Qcmlvcml0eU9y
ZGVyLnNpemUoKSk7CisgICAgICAgIEFTU0VSVChoaWdoT3JkZXJBZGphY2VudHMuc2l6ZSgpIDwg
cmVnaXN0ZXJDb3VudCgpKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCkBAIC00Nzgs
MjQgKzI0MywxNTggQEAgcHJpdmF0ZToKICAgICAgICAgZm9yICh1bnNpZ25lZCBhZGphY2VudFRt
cEluZGV4IDogYWRqYWNlbnRzT2ZWKSB7CiAgICAgICAgICAgICBpZiAoIWlzUHJlY29sb3JlZChh
ZGphY2VudFRtcEluZGV4KQogICAgICAgICAgICAgICAgICYmICFoYXNCZWVuU2ltcGxpZmllZChh
ZGphY2VudFRtcEluZGV4KQotICAgICAgICAgICAgICAgICYmIG1fZGVncmVlc1thZGphY2VudFRt
cEluZGV4XSA+PSBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpCi0gICAgICAgICAgICAgICAg
JiYgIW1faW50ZXJmZXJlbmNlRWRnZXMuY29udGFpbnMoSW50ZXJmZXJlbmNlRWRnZSh1LCBhZGph
Y2VudFRtcEluZGV4KSkpCisgICAgICAgICAgICAgICAgJiYgbV9kZWdyZWVzW2FkamFjZW50VG1w
SW5kZXhdID49IHJlZ2lzdGVyQ291bnQoKQorICAgICAgICAgICAgICAgICYmICFoYXNJbnRlcmZl
cmVuY2VFZGdlKEludGVyZmVyZW5jZUVkZ2UodSwgYWRqYWNlbnRUbXBJbmRleCkpKQogICAgICAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gdHJ1ZTsK
ICAgICB9CiAKLXByb3RlY3RlZDoKLSNpZiBQTEFURk9STShDT0NPQSkKLSNwcmFnbWEgbWFyayAt
Ci0jZW5kaWYKKyAgICBJbmRleFR5cGUgc2VsZWN0U3BpbGwoKQorICAgIHsKKyAgICAgICAgaWYg
KCFtX2hhc1NlbGVjdGVkU3BpbGwpIHsKKyAgICAgICAgICAgIG1faGFzU2VsZWN0ZWRTcGlsbCA9
IHRydWU7CiAKLSAgICAvLyBJbnRlcmZlcmVuY2UgZWRnZXMgYXJlIG5vdCBkaXJlY3RlZC4gQW4g
ZWRnZSBiZXR3ZWVuIGFueSB0d28gVG1wcyBpcyByZXByZXNlbnRlZAotICAgIC8vIGJ5IHRoZSBj
b25jYXRlbmF0ZWQgdmFsdWVzIG9mIHRoZSBzbWFsbGVzdCBUbXAgZm9sbG93ZWQgYnkgdGhlIGJp
Z2dlciBUbXAuCi0gICAgY2xhc3MgSW50ZXJmZXJlbmNlRWRnZSB7Ci0gICAgcHVibGljOgotICAg
ICAgICBJbnRlcmZlcmVuY2VFZGdlKCkKLSAgICAgICAgeworICAgICAgICAgICAgaWYgKG1faGFz
Q29hbGVzY2VkTm9uVHJpdmlhbE1vdmUpCisgICAgICAgICAgICAgICAgbV9jb2FsZXNjZWRUbXBz
QXRTcGlsbCA9IG1fY29hbGVzY2VkVG1wczsKKyAgICAgICAgfQorCisgICAgICAgIGF1dG8gaXRl
cmF0b3IgPSBtX3NwaWxsV29ya2xpc3QuYmVnaW4oKTsKKworICAgICAgICBSRUxFQVNFX0FTU0VS
VF9XSVRIX01FU1NBR0UoaXRlcmF0b3IgIT0gbV9zcGlsbFdvcmtsaXN0LmVuZCgpLCAic2VsZWN0
U3BpbGwoKSBjYWxsZWQgd2hlbiB0aGVyZSB3YXMgbm8gc3BpbGwuIik7CisgICAgICAgIFJFTEVB
U0VfQVNTRVJUX1dJVEhfTUVTU0FHRSghbV91bnNwaWxsYWJsZVRtcHMuY29udGFpbnMoKml0ZXJh
dG9yKSwgInRyeWluZyB0byBzcGlsbCB1bnNwaWxsYWJsZSB0bXAiKTsKKworICAgICAgICAvLyBI
aWdoZXIgc2NvcmUgbWVhbnMgbW9yZSBkZXNpcmFibGUgdG8gc3BpbGwuIExvd2VyIHNjb3JlcyBt
YXhpbWl6ZSB0aGUgbGlrZWxpaG9vZCB0aGF0IGEgdG1wCisgICAgICAgIC8vIGdldHMgYSByZWdp
c3Rlci4KKyAgICAgICAgYXV0byBzY29yZSA9IFsmXSAoVG1wIHRtcCkgLT4gZG91YmxlIHsKKyAg
ICAgICAgICAgIC8vIEFpciBleHBvc2VzIHRoZSBjb25jZXB0IG9mICJmYXN0IHRtcHMiLCBhbmQg
d2UgaW50ZXJwcmV0IHRoYXQgdG8gbWVhbiB0aGF0IHRoZSB0bXAKKyAgICAgICAgICAgIC8vIHNo
b3VsZCBhbHdheXMgYmUgaW4gYSByZWdpc3Rlci4KKyAgICAgICAgICAgIGlmIChtX2NvZGUuaXNG
YXN0VG1wKHRtcCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAKKyAg
ICAgICAgICAgIC8vIEFsbCBlbHNlIGJlaW5nIGVxdWFsLCB0aGUgc2NvcmUgc2hvdWxkIGJlIGRp
cmVjdGx5IHJlbGF0ZWQgdG8gdGhlIGRlZ3JlZS4KKyAgICAgICAgICAgIGRvdWJsZSBkZWdyZWUg
PSBzdGF0aWNfY2FzdDxkb3VibGU+KG1fZGVncmVlc1tUbXBNYXBwZXI6OmFic29sdXRlSW5kZXgo
dG1wKV0pOworCisgICAgICAgICAgICAvLyBBbGwgZWxzZSBiZWluZyBlcXVhbCwgdGhlIHNjb3Jl
IHNob3VsZCBiZSBpbnZlcnNlbHkgcmVsYXRlZCB0byB0aGUgbnVtYmVyIG9mIHdhcm0gdXNlcyBh
bmQKKyAgICAgICAgICAgIC8vIGRlZnMuCisgICAgICAgICAgICBjb25zdCBVc2VDb3VudHM8VG1w
Pjo6Q291bnRzKiBjb3VudHMgPSBtX3VzZUNvdW50c1t0bXBdOworICAgICAgICAgICAgaWYgKCFj
b3VudHMpCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91Ymxl
Pjo6aW5maW5pdHkoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZG91YmxlIHVzZXMgPSBj
b3VudHMtPm51bVdhcm1Vc2VzICsgY291bnRzLT5udW1EZWZzOworCisgICAgICAgICAgICAvLyBJ
ZiBpdCdzIGEgY29uc3RhbnQsIHRoZW4gaXQncyBub3QgYXMgYmFkIHRvIHNwaWxsLiBXZSBjYW4g
cmVtYXRlcmlhbGl6ZSBpdCBpbiBtYW55CisgICAgICAgICAgICAvLyBjYXNlcy4KKyAgICAgICAg
ICAgIGlmIChjb3VudHMtPm51bUNvbnN0RGVmcyA9PSAxICYmIGNvdW50cy0+bnVtRGVmcyA9PSAx
KQorICAgICAgICAgICAgICAgIHVzZXMgLz0gMjsKKworICAgICAgICAgICAgcmV0dXJuIGRlZ3Jl
ZSAvIHVzZXM7CisgICAgICAgIH07CisKKyAgICAgICAgYXV0byB2aWN0aW1JdGVyYXRvciA9IGl0
ZXJhdG9yOworICAgICAgICBkb3VibGUgbWF4U2NvcmUgPSBzY29yZShUbXBNYXBwZXI6OnRtcEZy
b21BYnNvbHV0ZUluZGV4KCppdGVyYXRvcikpOworCisgICAgICAgICsraXRlcmF0b3I7CisgICAg
ICAgIGZvciAoO2l0ZXJhdG9yICE9IG1fc3BpbGxXb3JrbGlzdC5lbmQoKTsgKytpdGVyYXRvcikg
eworICAgICAgICAgICAgZG91YmxlIHRtcFNjb3JlID0gc2NvcmUoVG1wTWFwcGVyOjp0bXBGcm9t
QWJzb2x1dGVJbmRleCgqaXRlcmF0b3IpKTsKKyAgICAgICAgICAgIGlmICh0bXBTY29yZSA+IG1h
eFNjb3JlKSB7CisgICAgICAgICAgICAgICAgQVNTRVJUKCFtX3Vuc3BpbGxhYmxlVG1wcy5jb250
YWlucygqaXRlcmF0b3IpKTsKKyAgICAgICAgICAgICAgICB2aWN0aW1JdGVyYXRvciA9IGl0ZXJh
dG9yOworICAgICAgICAgICAgICAgIG1heFNjb3JlID0gdG1wU2NvcmU7CisgICAgICAgICAgICB9
CisgICAgICAgIH0KKworICAgICAgICBJbmRleFR5cGUgdmljdGltSW5kZXggPSAqdmljdGltSXRl
cmF0b3I7CisgICAgICAgIGlmICh0cmFjZURlYnVnKQorICAgICAgICAgICAgZGF0YUxvZ0xuKCJT
ZWxlY3Rpbmcgc3BpbGwgIiwgdmljdGltSW5kZXgpOworICAgICAgICBBU1NFUlQoIWlzUHJlY29s
b3JlZCh2aWN0aW1JbmRleCkpOworICAgICAgICByZXR1cm4gdmljdGltSW5kZXg7CisgICAgfQor
CisgICAgdm9pZCBhc3NpZ25Db2xvcnMoKQorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fc2ltcGxp
ZnlXb3JrbGlzdC5pc0VtcHR5KCkpOworICAgICAgICBBU1NFUlQoIW1fc3BpbGxXb3JrbGlzdC5i
aXRDb3VudCgpKTsKKworICAgICAgICAvLyBSZWNsYWltIGFzIG11Y2ggbWVtb3J5IGFzIHBvc3Np
YmxlLgorICAgICAgICBtX2ludGVyZmVyZW5jZUVkZ2VzLmNsZWFyKCk7CisKKyAgICAgICAgbV9k
ZWdyZWVzLmNsZWFyKCk7CisgICAgICAgIG1fbW92ZUxpc3QuY2xlYXIoKTsKKyAgICAgICAgbV9z
aW1wbGlmeVdvcmtsaXN0LmNsZWFyKCk7CisgICAgICAgIG1fc3BpbGxXb3JrbGlzdC5jbGVhckFs
bCgpOworCisgICAgICAgIC8vIFRyeSB0byBjb2xvciB0aGUgVG1wIG9uIHRoZSBzdGFjay4KKyAg
ICAgICAgbV9jb2xvcmVkVG1wLnJlc2l6ZShtX2FkamFjZW5jeUxpc3Quc2l6ZSgpKTsKKworICAg
ICAgICB3aGlsZSAoIW1fc2VsZWN0U3RhY2suaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB1bnNp
Z25lZCB0bXBJbmRleCA9IG1fc2VsZWN0U3RhY2sudGFrZUxhc3QoKTsKKyAgICAgICAgICAgIG1f
aXNPblNlbGVjdFN0YWNrLnF1aWNrQ2xlYXIodG1wSW5kZXgpOworICAgICAgICAgICAgQVNTRVJU
KCFpc1ByZWNvbG9yZWQodG1wSW5kZXgpKTsKKyAgICAgICAgICAgIEFTU0VSVCghbV9jb2xvcmVk
VG1wW3RtcEluZGV4XSk7CisgICAgICAgICAgICBSRUxFQVNFX0FTU0VSVChnZXRBbGlhcyh0bXBJ
bmRleCkgPT0gdG1wSW5kZXgpOworCisgICAgICAgICAgICBSZWdpc3RlclNldCBjb2xvcmVkUmVn
aXN0ZXJzOworICAgICAgICAgICAgZm9yIChJbmRleFR5cGUgYWRqYWNlbnRUbXBJbmRleCA6IG1f
YWRqYWNlbmN5TGlzdFt0bXBJbmRleF0pIHsKKyAgICAgICAgICAgICAgICBJbmRleFR5cGUgYWxp
YXNUbXBJbmRleCA9IGdldEFsaWFzKGFkamFjZW50VG1wSW5kZXgpOworICAgICAgICAgICAgICAg
IFJlZyByZWcgPSBtX2NvbG9yZWRUbXBbYWxpYXNUbXBJbmRleF07CisKKyAgICAgICAgICAgICAg
ICBBU1NFUlQoIWlzUHJlY29sb3JlZChhbGlhc1RtcEluZGV4KSB8fCAoaXNQcmVjb2xvcmVkKGFs
aWFzVG1wSW5kZXgpICYmIHJlZykpOworCisgICAgICAgICAgICAgICAgaWYgKHJlZykKKyAgICAg
ICAgICAgICAgICAgICAgY29sb3JlZFJlZ2lzdGVycy5zZXQocmVnKTsKKyAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgYm9vbCBjb2xvckFzc2lnbmVkID0gZmFsc2U7CisgICAgICAgICAgICBm
b3IgKFJlZyByZWcgOiBtX3JlZ3NJblByaW9yaXR5T3JkZXIpIHsKKyAgICAgICAgICAgICAgICBp
ZiAoIWNvbG9yZWRSZWdpc3RlcnMuZ2V0KHJlZykpIHsKKyAgICAgICAgICAgICAgICAgICAgbV9j
b2xvcmVkVG1wW3RtcEluZGV4XSA9IHJlZzsKKyAgICAgICAgICAgICAgICAgICAgY29sb3JBc3Np
Z25lZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFjb2xvckFzc2lnbmVkKQorICAg
ICAgICAgICAgICAgIG1fc3BpbGxlZFRtcHMuYXBwZW5kKHRtcEluZGV4KTsKKyAgICAgICAgfQor
CisgICAgICAgIG1fc2VsZWN0U3RhY2suY2xlYXIoKTsKKworICAgICAgICBpZiAobV9zcGlsbGVk
VG1wcy5pc0VtcHR5KCkpCisgICAgICAgICAgICBtX2NvYWxlc2NlZFRtcHNBdFNwaWxsLmNsZWFy
KCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1fY29sb3JlZFRtcC5jbGVhcigpOworICAg
IH0KKworICAgIHZvaWQgZHVtcEludGVyZmVyZW5jZUdyYXBoSW5Eb3QoUHJpbnRTdHJlYW0mIG91
dCkKKyAgICB7CisgICAgICAgIG91dC5wcmludCgiZ3JhcGggSW50ZXJmZXJlbmNlR3JhcGggeyBc
biIpOworCisgICAgICAgIEhhc2hTZXQ8VG1wPiB0bXBzV2l0aEludGVyZmVyZW5jZXM7CisgICAg
ICAgIGZvciAoY29uc3QgYXV0byYgZWRnZSA6IG1faW50ZXJmZXJlbmNlRWRnZXMpIHsKKyAgICAg
ICAgICAgIHRtcHNXaXRoSW50ZXJmZXJlbmNlcy5hZGQoVG1wTWFwcGVyOjp0bXBGcm9tQWJzb2x1
dGVJbmRleChlZGdlLmZpcnN0KCkpKTsKKyAgICAgICAgICAgIHRtcHNXaXRoSW50ZXJmZXJlbmNl
cy5hZGQoVG1wTWFwcGVyOjp0bXBGcm9tQWJzb2x1dGVJbmRleChlZGdlLnNlY29uZCgpKSk7Cisg
ICAgICAgIH0KKworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHRtcCA6IHRtcHNXaXRoSW50ZXJm
ZXJlbmNlcykgeworICAgICAgICAgICAgdW5zaWduZWQgdG1wSW5kZXggPSBUbXBNYXBwZXI6OmFi
c29sdXRlSW5kZXgodG1wKTsKKyAgICAgICAgICAgIGlmICh0bXBJbmRleCA8IG1fZGVncmVlcy5z
aXplKCkpCisgICAgICAgICAgICAgICAgb3V0LnByaW50KCIgICAgIiwgdG1wLmludGVybmFsVmFs
dWUoKSwgIiBbbGFiZWw9XCIiLCB0bXAsICIgKCIsIG1fZGVncmVlc1t0bXBJbmRleF0sICIpXCJd
O1xuIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgb3V0LnByaW50KCIgICAg
IiwgdG1wLmludGVybmFsVmFsdWUoKSwgIiBbbGFiZWw9XCIiLCB0bXAsICJcIl07XG4iKTsKKyAg
ICAgICAgfQorCisgICAgICAgIGZvciAoY29uc3QgYXV0byYgZWRnZSA6IG1faW50ZXJmZXJlbmNl
RWRnZXMpCisgICAgICAgICAgICBvdXQucHJpbnQoIiAgICAiLCBlZGdlLmZpcnN0KCksICIgLS0g
IiwgZWRnZS5zZWNvbmQoKSwgIjtcbiIpOworICAgICAgICBvdXQucHJpbnQoIn1cbiIpOworICAg
IH0KKworICAgIC8vIEludGVyZmVyZW5jZSBlZGdlcyBhcmUgbm90IGRpcmVjdGVkLiBBbiBlZGdl
IGJldHdlZW4gYW55IHR3byBUbXBzIGlzIHJlcHJlc2VudGVkCisgICAgLy8gYnkgdGhlIGNvbmNh
dGVuYXRlZCB2YWx1ZXMgb2YgdGhlIHNtYWxsZXN0IFRtcCBmb2xsb3dlZCBieSB0aGUgYmlnZ2Vy
IFRtcC4KKyAgICBjbGFzcyBJbnRlcmZlcmVuY2VFZGdlIHsKKyAgICBwdWJsaWM6CisgICAgICAg
IEludGVyZmVyZW5jZUVkZ2UoKQorICAgICAgICB7CiAgICAgICAgIH0KIAogICAgICAgICBJbnRl
cmZlcmVuY2VFZGdlKEluZGV4VHlwZSBhLCBJbmRleFR5cGUgYikKQEAgLTU0OCw2ICs0NDcsMTYg
QEAgcHJvdGVjdGVkOgogICAgICAgICB1aW50NjRfdCBtX3ZhbHVlIHsgMCB9OwogICAgIH07CiAK
KyAgICBib29sIGFkZEludGVyZmVyZW5jZUVkZ2UoSW50ZXJmZXJlbmNlRWRnZSBlZGdlKQorICAg
IHsKKyAgICAgICAgcmV0dXJuIG1faW50ZXJmZXJlbmNlRWRnZXMuYWRkKGVkZ2UpLmlzTmV3RW50
cnk7CisgICAgfQorCisgICAgYm9vbCBoYXNJbnRlcmZlcmVuY2VFZGdlKEludGVyZmVyZW5jZUVk
Z2UgZWRnZSkKKyAgICB7CisgICAgICAgIHJldHVybiBtX2ludGVyZmVyZW5jZUVkZ2VzLmNvbnRh
aW5zKGVkZ2UpOworICAgIH0KKwogICAgIHN0cnVjdCBJbnRlcmZlcmVuY2VFZGdlSGFzaCB7CiAg
ICAgICAgIHN0YXRpYyB1bnNpZ25lZCBoYXNoKGNvbnN0IEludGVyZmVyZW5jZUVkZ2UmIGtleSkg
eyByZXR1cm4ga2V5Lmhhc2goKTsgfQogICAgICAgICBzdGF0aWMgYm9vbCBlcXVhbChjb25zdCBJ
bnRlcmZlcmVuY2VFZGdlJiBhLCBjb25zdCBJbnRlcmZlcmVuY2VFZGdlJiBiKSB7IHJldHVybiBh
ID09IGI7IH0KQEAgLTU1NSwzOSArNDY0LDcwNSBAQCBwcm90ZWN0ZWQ6CiAgICAgfTsKICAgICB0
eXBlZGVmIFNpbXBsZUNsYXNzSGFzaFRyYWl0czxJbnRlcmZlcmVuY2VFZGdlPiBJbnRlcmZlcmVu
Y2VFZGdlSGFzaFRyYWl0czsKIAotICAgIGNvbnN0IFZlY3RvcjxSZWc+JiBtX3JlZ3NJblByaW9y
aXR5T3JkZXI7Ci0gICAgUmVnaXN0ZXJTZXQgbV9tdXRhYmxlUmVnczsKLSAgICBJbmRleFR5cGUg
bV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXggeyAwIH07CisgICAgY29uc3QgVmVjdG9yPFJl
Zz4mIG1fcmVnc0luUHJpb3JpdHlPcmRlcjsKKyAgICBSZWdpc3RlclNldCBtX211dGFibGVSZWdz
OworICAgIEluZGV4VHlwZSBtX2xhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleCB7IDAgfTsKKwor
ICAgIC8vIFRoZSBpbnRlcmZlcmVuY2UgZ3JhcGguCisgICAgSGFzaFNldDxJbnRlcmZlcmVuY2VF
ZGdlLCBJbnRlcmZlcmVuY2VFZGdlSGFzaCwgSW50ZXJmZXJlbmNlRWRnZUhhc2hUcmFpdHM+IG1f
aW50ZXJmZXJlbmNlRWRnZXM7CisKKyAgICBWZWN0b3I8VmVjdG9yPEluZGV4VHlwZSwgMCwgVW5z
YWZlVmVjdG9yT3ZlcmZsb3csIDQ+LCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9hZGphY2Vu
Y3lMaXN0OworICAgIFZlY3RvcjxJbmRleFR5cGUsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBt
X2RlZ3JlZXM7CisKKyAgICAvLyBJbnN0ZWFkIG9mIGtlZXBpbmcgdHJhY2sgb2YgdGhlIG1vdmUg
aW5zdHJ1Y3Rpb25zLCB3ZSBqdXN0IGtlZXAgdGhlaXIgb3BlcmFuZHMgYXJvdW5kIGFuZCB1c2Ug
dGhlIGluZGV4CisgICAgLy8gaW4gdGhlIHZlY3RvciBhcyB0aGUgImlkZW50aWZpZXIiIGZvciB0
aGUgbW92ZS4KKyAgICBzdHJ1Y3QgTW92ZU9wZXJhbmRzIHsKKyAgICAgICAgSW5kZXhUeXBlIHNy
Y0luZGV4OworICAgICAgICBJbmRleFR5cGUgZHN0SW5kZXg7CisgICAgfTsKKyAgICBWZWN0b3I8
TW92ZU9wZXJhbmRzLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9jb2FsZXNjaW5nQ2FuZGlk
YXRlczsKKworICAgIC8vIExpc3Qgb2YgZXZlcnkgbW92ZSBpbnN0cnVjdGlvbiBhc3NvY2lhdGVk
IHdpdGggYSBUbXAuCisgICAgVmVjdG9yPEhhc2hTZXQ8SW5kZXhUeXBlLCB0eXBlbmFtZSBEZWZh
dWx0SGFzaDxJbmRleFR5cGU+OjpIYXNoLCBXVEY6OlVuc2lnbmVkV2l0aFplcm9LZXlIYXNoVHJh
aXRzPEluZGV4VHlwZT4+PiBtX21vdmVMaXN0OworCisgICAgLy8gQ29sb3JzLgorICAgIFZlY3Rv
cjxSZWcsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX2NvbG9yZWRUbXA7CisgICAgVmVjdG9y
PEluZGV4VHlwZT4gbV9zcGlsbGVkVG1wczsKKworICAgIC8vIFZhbHVlcyB0aGF0IGhhdmUgYmVl
biBjb2FsZXNjZWQgd2l0aCBhbiBvdGhlciB2YWx1ZS4KKyAgICBWZWN0b3I8SW5kZXhUeXBlLCAw
LCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9jb2FsZXNjZWRUbXBzOworCisgICAgLy8gVGhlIHN0
YWNrIG9mIFRtcCByZW1vdmVkIGZyb20gdGhlIGdyYXBoIGFuZCByZWFkeSBmb3IgY29sb3Jpbmcu
CisgICAgQml0VmVjdG9yIG1faXNPblNlbGVjdFN0YWNrOworICAgIFZlY3RvcjxJbmRleFR5cGU+
IG1fc2VsZWN0U3RhY2s7CisKKyAgICBJbmRleFR5cGUgbV9mcmFtZVBvaW50ZXJJbmRleCB7IDAg
fTsKKyAgICBCaXRWZWN0b3IgbV9pbnRlcmZlcmVzV2l0aEZyYW1lUG9pbnRlcjsKKyAgICAvLyBM
b3ctZGVncmVlLCBub24tTW92ZSByZWxhdGVkLgorICAgIFZlY3RvcjxJbmRleFR5cGU+IG1fc2lt
cGxpZnlXb3JrbGlzdDsKKyAgICAvLyBIaWdoLWRlZ3JlZSBUbXAuCisgICAgQml0VmVjdG9yIG1f
c3BpbGxXb3JrbGlzdDsKKworICAgIGJvb2wgbV9oYXNTZWxlY3RlZFNwaWxsIHsgZmFsc2UgfTsK
KyAgICBib29sIG1faGFzQ29hbGVzY2VkTm9uVHJpdmlhbE1vdmUgeyBmYWxzZSB9OworCisgICAg
Ly8gVGhlIG1hcHBpbmcgb2YgVG1wIHRvIHRoZWlyIGFsaWFzIGZvciBNb3ZlcyB0aGF0IGFyZSBh
bHdheXMgY29hbGVzY2luZyByZWdhcmRsZXNzIG9mIHNwaWxsaW5nLgorICAgIFZlY3RvcjxJbmRl
eFR5cGUsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX2NvYWxlc2NlZFRtcHNBdFNwaWxsOwor
CisgICAgY29uc3QgSGFzaFNldDx1bnNpZ25lZD4mIG1fdW5zcGlsbGFibGVUbXBzOworICAgIGNv
bnN0IFVzZUNvdW50czxUbXA+JiBtX3VzZUNvdW50czsKKyAgICBDb2RlJiBtX2NvZGU7Cit9Owor
Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5kZXhUeXBlLCB0eXBlbmFtZSBUbXBNYXBwZXI+CitjbGFz
cyBCcmlnZ3MgOiBwdWJsaWMgQWJzdHJhY3RDb2xvcmluZ0FsbG9jYXRvcjxJbmRleFR5cGUsIFRt
cE1hcHBlcj4geworICAgIHVzaW5nIEJhc2UgPSBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yPElu
ZGV4VHlwZSwgVG1wTWFwcGVyPjsKK3Byb3RlY3RlZDoKKyAgICB1c2luZyBCYXNlOjptX2lzT25T
ZWxlY3RTdGFjazsKKyAgICB1c2luZyBCYXNlOjptX3NlbGVjdFN0YWNrOworICAgIHVzaW5nIEJh
c2U6Om1fZnJhbWVQb2ludGVySW5kZXg7CisgICAgdXNpbmcgQmFzZTo6bV9pbnRlcmZlcmVzV2l0
aEZyYW1lUG9pbnRlcjsKKyAgICB1c2luZyBCYXNlOjptX3NpbXBsaWZ5V29ya2xpc3Q7CisgICAg
dXNpbmcgQmFzZTo6bV9zcGlsbFdvcmtsaXN0OworICAgIHVzaW5nIEJhc2U6Om1faGFzU2VsZWN0
ZWRTcGlsbDsKKyAgICB1c2luZyBCYXNlOjptX2hhc0NvYWxlc2NlZE5vblRyaXZpYWxNb3ZlOwor
ICAgIHVzaW5nIEJhc2U6Om1fZGVncmVlczsKKyAgICB1c2luZyBCYXNlOjpyZWdpc3RlckNvdW50
OworICAgIHVzaW5nIEJhc2U6Om1fY29hbGVzY2VkVG1wczsKKyAgICB1c2luZyBCYXNlOjptX21v
dmVMaXN0OworICAgIHVzaW5nIEJhc2U6Om1fdXNlQ291bnRzOworICAgIHVzaW5nIEJhc2U6Om1f
Y29hbGVzY2VkVG1wc0F0U3BpbGw7CisgICAgdXNpbmcgQmFzZTo6bV9zcGlsbGVkVG1wczsKKyAg
ICB1c2luZyB0eXBlbmFtZSBCYXNlOjpNb3ZlT3BlcmFuZHM7CisgICAgdXNpbmcgQmFzZTo6bV9j
b2FsZXNjaW5nQ2FuZGlkYXRlczsKKyAgICB1c2luZyBCYXNlOjptX2xhc3RQcmVjb2xvcmVkUmVn
aXN0ZXJJbmRleDsKKyAgICB1c2luZyBCYXNlOjptX2NvbG9yZWRUbXA7CisgICAgdXNpbmcgQmFz
ZTo6bV9jb2RlOworICAgIHVzaW5nIHR5cGVuYW1lIEJhc2U6OkludGVyZmVyZW5jZUVkZ2U7Cisg
ICAgdXNpbmcgQmFzZTo6bV91bnNwaWxsYWJsZVRtcHM7CisgICAgdXNpbmcgQmFzZTo6aGFzSW50
ZXJmZXJlbmNlRWRnZTsKKyAgICB1c2luZyBCYXNlOjpnZXRBbGlhczsKKyAgICB1c2luZyBCYXNl
OjphZGRFZGdlOworICAgIHVzaW5nIEJhc2U6OmlzUHJlY29sb3JlZDsKKyAgICB1c2luZyBCYXNl
OjpjYW5CZVNhZmVseUNvYWxlc2NlZDsKKyAgICB1c2luZyBCYXNlOjphZGRFZGdlRGlzdGluY3RX
aXRob3V0RGVncmVlQ2hhbmdlOworICAgIHVzaW5nIEJhc2U6OmZvckVhY2hBZGphY2VudDsKKyAg
ICB1c2luZyBCYXNlOjpoYXNCZWVuU2ltcGxpZmllZDsKKyAgICB1c2luZyBCYXNlOjphZGRUb1Nw
aWxsOworICAgIHVzaW5nIEJhc2U6Om1faW50ZXJmZXJlbmNlRWRnZXM7CisKK3B1YmxpYzoKKyAg
ICBCcmlnZ3MoQ29kZSYgY29kZSwgY29uc3QgVmVjdG9yPFJlZz4mIHJlZ3NJblByaW9yaXR5T3Jk
ZXIsIEluZGV4VHlwZSBsYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXgsIHVuc2lnbmVkIHRtcEFy
cmF5U2l6ZSwgY29uc3QgSGFzaFNldDx1bnNpZ25lZD4mIHVuc3BpbGxhYmxlVG1wcywgY29uc3Qg
VXNlQ291bnRzPFRtcD4mIHVzZUNvdW50cykKKyAgICAgICAgOiBCYXNlKGNvZGUsIHJlZ3NJblBy
aW9yaXR5T3JkZXIsIGxhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleCwgdG1wQXJyYXlTaXplLCB1
bnNwaWxsYWJsZVRtcHMsIHVzZUNvdW50cykKKyAgICB7CisgICAgfQorCisgICAgdm9pZCBhbGxv
Y2F0ZSgpCisgICAgeworICAgICAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKKworICAgICAgICBh
dXRvIGNvYWxlc2NlTW92ZSA9IFsmXSAodW5zaWduZWQmIG1vdmUpIHsKKyAgICAgICAgICAgIGJv
b2wgY29hbGVzY2VkID0gY29hbGVzY2UobW92ZSk7CisgICAgICAgICAgICBpZiAoY29hbGVzY2Vk
KSB7CisgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgLy8g
V2Ugd29uJ3QgbmVlZCB0byBoYW5kbGUgdGhpcyBtb3ZlIGluIHRoZSBmdXR1cmUgc2luY2UgaXQn
cyBhbHJlYWR5IGNvYWxlc2NlZC4KKyAgICAgICAgICAgICAgICBtb3ZlID0gVUlOVF9NQVg7Cisg
ICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgLy8gV2UgZmlyc3QgY29hbGVzY2Ug
dW50aWwgd2UgY2FuJ3QgY29hbGVzY2UgYW55IG1vcmUuCisgICAgICAgIGRvIHsKKyAgICAgICAg
ICAgIGNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIG1fd29ya2xpc3RNb3Zlcy5mb3JFYWNo
TW92ZShjb2FsZXNjZU1vdmUpOworICAgICAgICB9IHdoaWxlIChjaGFuZ2VkKTsKKyAgICAgICAg
ZG8geworICAgICAgICAgICAgY2hhbmdlZCA9IGZhbHNlOworICAgICAgICAgICAgbV93b3JrbGlz
dE1vdmVzLmZvckVhY2hMb3dQcmlvcml0eU1vdmUoY29hbGVzY2VNb3ZlKTsKKyAgICAgICAgfSB3
aGlsZSAoY2hhbmdlZCk7CisKKyAgICAgICAgLy8gVGhlbiB3ZSBjcmVhdGUgb3VyIHNlbGVjdCBz
dGFjay4gVGhlIGludmFyaWFudCB3ZSBzdGFydCB3aXRoIGhlcmUgaXMgdGhhdCBub2RlcyBpbgor
ICAgICAgICAvLyB0aGUgaW50ZXJmZXJlbmNlIGdyYXBoIHdpdGggZGVncmVlID49IGsgYXJlIG9u
IHRoZSBzcGlsbCBsaXN0LiBOb2RlcyB3aXRoIGRlZ3JlZSA8IGsKKyAgICAgICAgLy8gYXJlIG9u
IHRoZSBzaW1wbGlmeSB3b3JrbGlzdC4gQSBub2RlIGNhbiBtb3ZlIGZyb20gdGhlIHNwaWxsIGxp
c3QgdG8gdGhlIHNpbXBsaWZ5CisgICAgICAgIC8vIGxpc3QgKGJ1dCBub3QgdGhlIG90aGVyIHdh
eSBhcm91bmQsIG5vdGUgdGhhdCB0aGlzIGlzIGRpZmZlcmVudCB0aGFuIElSQyBiZWNhdXNlIElS
QworICAgICAgICAvLyBydW5zIHRoaXMgd2hpbGUgY29hbGVzY2luZywgYnV0IHdlIGRvIGFsbCBv
dXIgY29hbGVzY2luZyBiZWZvcmUgdGhpcykuIE9uY2UgYSBub2RlIGlzCisgICAgICAgIC8vIGFk
ZGVkIHRvIHRoZSBzZWxlY3Qgc3RhY2ssIGl0J3Mgbm90IG9uIGVpdGhlciBsaXN0LCBidXQgb25s
eSBvbiB0aGUgc2VsZWN0IHN0YWNrLgorICAgICAgICAvLyBPbmNlIG9uIHRoZSBzZWxlY3Qgc3Rh
Y2ssIGxvZ2ljYWxseSwgaXQncyBubyBsb25nZXIgaW4gdGhlIGludGVyZmVyZW5jZSBncmFwaC4K
KyAgICAgICAgYXV0byBhc3NlcnRJbnZhcmlhbnRzID0gWyZdICgpIHsKKyAgICAgICAgICAgIGlm
IChBU1NFUlRfRElTQUJMRUQpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAg
ICBJbmRleFR5cGUgZmlyc3ROb25SZWdJbmRleCA9IG1fbGFzdFByZWNvbG9yZWRSZWdpc3Rlcklu
ZGV4ICsgMTsKKyAgICAgICAgICAgIHVuc2lnbmVkIHJlZ2lzdGVyQ291bnQgPSB0aGlzLT5yZWdp
c3RlckNvdW50KCk7CisgICAgICAgICAgICBmb3IgKEluZGV4VHlwZSBpID0gZmlyc3ROb25SZWdJ
bmRleDsgaSA8IG1fZGVncmVlcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgIGlmIChn
ZXRBbGlhcyhpKSAhPSBpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
ICAgICAgICBpZiAobV9pc09uU2VsZWN0U3RhY2suY29udGFpbnMoaSkpIHsKKyAgICAgICAgICAg
ICAgICAgICAgQVNTRVJUKCFtX3NpbXBsaWZ5V29ya2xpc3QuY29udGFpbnMoaSkgJiYgIW1fc3Bp
bGxXb3JrbGlzdC5jb250YWlucyhpKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwor
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBkZWdyZWUgPSBtX2Rl
Z3JlZXNbaV07CisgICAgICAgICAgICAgICAgaWYgKGRlZ3JlZSA+PSByZWdpc3RlckNvdW50KSB7
CisgICAgICAgICAgICAgICAgICAgIEFTU0VSVChtX3Vuc3BpbGxhYmxlVG1wcy5jb250YWlucyhp
KSB8fCBtX3NwaWxsV29ya2xpc3QuY29udGFpbnMoaSkpOworICAgICAgICAgICAgICAgICAgICBB
U1NFUlQoIW1fc2ltcGxpZnlXb3JrbGlzdC5jb250YWlucyhpKSk7CisgICAgICAgICAgICAgICAg
ICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBU1NFUlQo
bV9zaW1wbGlmeVdvcmtsaXN0LmNvbnRhaW5zKGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
fTsKKworICAgICAgICBtYWtlSW5pdGlhbFdvcmtsaXN0KCk7CisgICAgICAgIGFzc2VydEludmFy
aWFudHMoKTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgY2hhbmdlZCA9IGZhbHNlOworCisg
ICAgICAgICAgICB3aGlsZSAobV9zaW1wbGlmeVdvcmtsaXN0LnNpemUoKSkgeworICAgICAgICAg
ICAgICAgIHNpbXBsaWZ5KCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0SW52YXJpYW50cygpOwor
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobV9zcGlsbFdvcmtsaXN0LmJpdENvdW50
KCkpIHsKKyAgICAgICAgICAgICAgICBzZWxlY3RTcGlsbCgpOworICAgICAgICAgICAgICAgIGNo
YW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIEFTU0VSVChtX3NpbXBsaWZ5V29ya2xpc3Qu
c2l6ZSgpID09IDEpOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChjaGFuZ2VkKTsK
KworICAgICAgICBpZiAoIUFTU0VSVF9ESVNBQkxFRCkgeworICAgICAgICAgICAgQVNTRVJUKCFt
X3NpbXBsaWZ5V29ya2xpc3Quc2l6ZSgpKTsKKyAgICAgICAgICAgIEFTU0VSVCghbV9zcGlsbFdv
cmtsaXN0LmJpdENvdW50KCkpOworICAgICAgICAgICAgSW5kZXhUeXBlIGZpcnN0Tm9uUmVnSW5k
ZXggPSBtX2xhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleCArIDE7CisgICAgICAgICAgICBmb3Ig
KEluZGV4VHlwZSBpID0gZmlyc3ROb25SZWdJbmRleDsgaSA8IG1fZGVncmVlcy5zaXplKCk7ICsr
aSkKKyAgICAgICAgICAgICAgICBBU1NFUlQoaGFzQmVlblNpbXBsaWZpZWQoaSkpOworICAgICAg
ICB9CisKKyAgICAgICAgYXNzaWduQ29sb3JzKCk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAg
CisgICAgYm9vbCBjb2FsZXNjZSh1bnNpZ25lZCYgbW92ZUluZGV4KQorICAgIHsKKyAgICAgICAg
Y29uc3QgTW92ZU9wZXJhbmRzJiBtb3ZlT3BlcmFuZHMgPSBtX2NvYWxlc2NpbmdDYW5kaWRhdGVz
W21vdmVJbmRleF07CisgICAgICAgIEluZGV4VHlwZSB1ID0gZ2V0QWxpYXMobW92ZU9wZXJhbmRz
LnNyY0luZGV4KTsKKyAgICAgICAgSW5kZXhUeXBlIHYgPSBnZXRBbGlhcyhtb3ZlT3BlcmFuZHMu
ZHN0SW5kZXgpOworCisgICAgICAgIGlmIChpc1ByZWNvbG9yZWQodikpCisgICAgICAgICAgICBz
dGQ6OnN3YXAodSwgdik7CisKKyAgICAgICAgaWYgKHRyYWNlRGVidWcpCisgICAgICAgICAgICBk
YXRhTG9nKCJDb2FsZXNjaW5nIG1vdmUgYXQgaW5kZXggIiwgbW92ZUluZGV4LCAiIHUgPSAiLCBU
bXBNYXBwZXI6OnRtcEZyb21BYnNvbHV0ZUluZGV4KHUpLCAiIHYgPSAiLCBUbXBNYXBwZXI6OnRt
cEZyb21BYnNvbHV0ZUluZGV4KHYpLCAiICAgICIpOworCisgICAgICAgIGlmICh1ID09IHYpIHsK
KyAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQorICAgICAgICAgICAgICAgIGRhdGFMb2coIkFs
cmVhZHkgQ29hbGVzY2VkLiBUaGV5J3JlIGVxdWFsLlxuIik7CisgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNQcmVjb2xvcmVkKHYpCisgICAgICAg
ICAgICB8fCBoYXNJbnRlcmZlcmVuY2VFZGdlKEludGVyZmVyZW5jZUVkZ2UodSwgdikpCisgICAg
ICAgICAgICB8fCAodSA9PSBtX2ZyYW1lUG9pbnRlckluZGV4ICYmIG1faW50ZXJmZXJlc1dpdGhG
cmFtZVBvaW50ZXIucXVpY2tHZXQodikpKSB7CisKKyAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8g
ZXZlciBjb25zaWRlciB0aGlzIG1vdmUgYWdhaW4gaWYgaXQgaW50ZXJmZXJlcy4KKyAgICAgICAg
ICAgIC8vIE5vIGNvYWxlc2Npbmcgd2lsbCByZW1vdmUgdGhlIGludGVyZmVyZW5jZS4KKyAgICAg
ICAgICAgIG1vdmVJbmRleCA9IFVJTlRfTUFYOworCisgICAgICAgICAgICBpZiAoIUFTU0VSVF9E
SVNBQkxFRCkgeworICAgICAgICAgICAgICAgIGlmIChpc1ByZWNvbG9yZWQodikpCisgICAgICAg
ICAgICAgICAgICAgIEFTU0VSVChpc1ByZWNvbG9yZWQodSkpOworICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKKyAgICAgICAgICAgICAgICBkYXRhTG9nKCJDb25z
dHJhaW5lZFxuIik7CisKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAg
ICAgICAKKyAgICAgICAgaWYgKGNhbkJlU2FmZWx5Q29hbGVzY2VkKHUsIHYpKSB7CisgICAgICAg
ICAgICBjb21iaW5lKHUsIHYpOworICAgICAgICAgICAgbV9oYXNDb2FsZXNjZWROb25Ucml2aWFs
TW92ZSA9IHRydWU7CisKKyAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQorICAgICAgICAgICAg
ICAgIGRhdGFMb2coIiAgICBTYWZlIENvYWxlc2NpbmdcbiIpOworICAgICAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAodHJhY2VEZWJ1ZykKKyAgICAgICAgICAg
IGRhdGFMb2coIiAgICBGYWlsZWQgY29hbGVzY2luZy5cbiIpOworCisgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICB9CisKKyAgICB2b2lkIGNvbWJpbmUoSW5kZXhUeXBlIHUsIEluZGV4VHlwZSB2
KQorICAgIHsKKyAgICAgICAgQVNTRVJUKCFtX2NvYWxlc2NlZFRtcHNbdl0pOworICAgICAgICBt
X2NvYWxlc2NlZFRtcHNbdl0gPSB1OworCisgICAgICAgIGF1dG8mIHZNb3ZlcyA9IG1fbW92ZUxp
c3Rbdl07CisgICAgICAgIG1fbW92ZUxpc3RbdV0uYWRkKHZNb3Zlcy5iZWdpbigpLCB2TW92ZXMu
ZW5kKCkpOworCisgICAgICAgIGZvckVhY2hBZGphY2VudCh2LCBbdGhpcywgdV0gKEluZGV4VHlw
ZSBhZGphY2VudFRtcEluZGV4KSB7CisgICAgICAgICAgICBpZiAoYWRkRWRnZURpc3RpbmN0V2l0
aG91dERlZ3JlZUNoYW5nZShhZGphY2VudFRtcEluZGV4LCB1KSkgeworICAgICAgICAgICAgICAg
IC8vIElmIHdlIGFkZGVkIGEgbmV3IGVkZ2UgYmV0d2VlbiB0aGUgYWRqYWNlbnRUbXAgYW5kIHUs
IGl0IHJlcGxhY2VzIHRoZSBlZGdlCisgICAgICAgICAgICAgICAgLy8gdGhhdCBleGlzdGVkIHdp
dGggdi4KKyAgICAgICAgICAgICAgICAvLyBUaGUgZGVncmVlIG9mIGFkamFjZW50VG1wIHJlbWFp
bnMgdGhlIHNhbWUgc2luY2UgdGhlIGVkZ2UganVzdCBjaGFuZ2VkIGZyb20gdSB0byB2LgorICAg
ICAgICAgICAgICAgIC8vIEFsbCB3ZSBuZWVkIHRvIGRvIGlzIHVwZGF0ZSB0aGUgZGVncmVlIG9m
IHUuCisgICAgICAgICAgICAgICAgaWYgKCFpc1ByZWNvbG9yZWQodSkpCisgICAgICAgICAgICAg
ICAgICAgIG1fZGVncmVlc1t1XSsrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg
ICAgICAvLyBJZiB3ZSBhbHJlYWR5IGhhZCBhbiBlZGdlIGJldHdlZW4gdGhlIGFkamFjZW50VG1w
IGFuZCB1LCB0aGUgZGVncmVlIG9mIHUKKyAgICAgICAgICAgICAgICAvLyBpcyBhbHJlYWR5IGNv
cnJlY3QuIFRoZSBkZWdyZWUgb2YgdGhlIGFkamFjZW50VG1wIGRlY3JlYXNlcyBzaW5jZSB0aGUg
ZWRnZQorICAgICAgICAgICAgICAgIC8vIHdpdGggdiBpcyBubyBsb25nZXIgcmVsZXZhbnQgKHdl
IGNhbiB0aGluayBvZiBpdCBhcyBtZXJnZWQgd2l0aCB0aGUgZWRnZSB3aXRoIHUpLgorICAgICAg
ICAgICAgICAgIGRlY3JlbWVudERlZ3JlZShhZGphY2VudFRtcEluZGV4KTsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgaWYgKG1fZnJhbWVQb2ludGVySW5kZXggJiYgbV9p
bnRlcmZlcmVzV2l0aEZyYW1lUG9pbnRlci5xdWlja0dldCh2KSkKKyAgICAgICAgICAgIG1faW50
ZXJmZXJlc1dpdGhGcmFtZVBvaW50ZXIucXVpY2tTZXQodSk7CisgICAgfQorCisKKyAgICB2b2lk
IG1ha2VJbml0aWFsV29ya2xpc3QoKQorICAgIHsKKyAgICAgICAgbV9zaW1wbGlmeVdvcmtsaXN0
LmNsZWFyKCk7CisgICAgICAgIG1fc3BpbGxXb3JrbGlzdC5jbGVhckFsbCgpOworCisgICAgICAg
IGlmICh0cmFjZURlYnVnKQorICAgICAgICAgICAgZGF0YUxvZ0xuKCItLS0tLS0tLS0tLS0tLS0t
LS1cbk1ha2luZyBpbml0aWFsIHdvcmtsaXN0Iik7CisKKyAgICAgICAgSW5kZXhUeXBlIGZpcnN0
Tm9uUmVnSW5kZXggPSBtX2xhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleCArIDE7CisgICAgICAg
IHVuc2lnbmVkIHJlZ2lzdGVyQ291bnQgPSB0aGlzLT5yZWdpc3RlckNvdW50KCk7CisgICAgICAg
IGZvciAoSW5kZXhUeXBlIGkgPSBmaXJzdE5vblJlZ0luZGV4OyBpIDwgbV9kZWdyZWVzLnNpemUo
KTsgKytpKSB7CisgICAgICAgICAgICBBU1NFUlQoIWlzUHJlY29sb3JlZChpKSk7CisgICAgICAg
ICAgICBpZiAoaGFzQmVlblNpbXBsaWZpZWQoaSkpCisgICAgICAgICAgICAgICAgY29udGludWU7
CisgICAgICAgICAgICB1bnNpZ25lZCBkZWdyZWUgPSBtX2RlZ3JlZXNbaV07CisgICAgICAgICAg
ICBpZiAoZGVncmVlIDwgcmVnaXN0ZXJDb3VudCkgeworICAgICAgICAgICAgICAgIGlmICh0cmFj
ZURlYnVnKQorICAgICAgICAgICAgICAgICAgICBkYXRhTG9nTG4oIkFkZGluZyAiLCBUbXBNYXBw
ZXI6OnRtcEZyb21BYnNvbHV0ZUluZGV4KGkpLCAiIHRvIHNpbXBsaWZ5IHdvcmtsaXN0Iik7Cisg
ICAgICAgICAgICAgICAgbV9zaW1wbGlmeVdvcmtsaXN0LmFwcGVuZChpKTsKKyAgICAgICAgICAg
IH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpCisgICAgICAgICAgICAg
ICAgICAgIGRhdGFMb2dMbigiQWRkaW5nICIsIFRtcE1hcHBlcjo6dG1wRnJvbUFic29sdXRlSW5k
ZXgoaSksICIgdG8gc3BpbGwgd29ya2xpc3QiKTsKKyAgICAgICAgICAgICAgICBhZGRUb1NwaWxs
KGkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gTG93LWRlZ3Jl
ZSB2ZXJ0ZXggY2FuIGFsd2F5cyBiZSBjb2xvcmVkOiBqdXN0IHBpY2sgYW55IG9mIHRoZSBjb2xv
ciB0YWtlbiBieSBhbnkKKyAgICAvLyBvdGhlciBhZGphY2VudCB2ZXJpY2VzLgorICAgIC8vIFRo
ZSAiU2ltcGxpZnkiIHBoYXNlIHRha2VzIGEgbG93LWRlZ3JlZSBvdXQgb2YgdGhlIGludGVyZmVy
ZW5jZSBncmFwaCB0byBzaW1wbGlmeSBpdC4KKyAgICB2b2lkIHNpbXBsaWZ5KCkKKyAgICB7Cisg
ICAgICAgIEluZGV4VHlwZSBsYXN0SW5kZXggPSBtX3NpbXBsaWZ5V29ya2xpc3QudGFrZUxhc3Qo
KTsKKworICAgICAgICBBU1NFUlQoIW1fc2VsZWN0U3RhY2suY29udGFpbnMobGFzdEluZGV4KSk7
CisgICAgICAgIEFTU0VSVCghbV9pc09uU2VsZWN0U3RhY2suZ2V0KGxhc3RJbmRleCkpOworICAg
ICAgICBBU1NFUlQoIW1fc3BpbGxXb3JrbGlzdC5jb250YWlucyhsYXN0SW5kZXgpKTsKKworICAg
ICAgICBtX3NlbGVjdFN0YWNrLmFwcGVuZChsYXN0SW5kZXgpOworICAgICAgICBtX2lzT25TZWxl
Y3RTdGFjay5xdWlja1NldChsYXN0SW5kZXgpOworCisgICAgICAgIGlmICh0cmFjZURlYnVnKQor
ICAgICAgICAgICAgZGF0YUxvZ0xuKCJTaW1wbGlmeWluZyAiLCBsYXN0SW5kZXgsICIgYnkgYWRk
aW5nIGl0IHRvIHNlbGVjdCBzdGFjayIpOworCisgICAgICAgIGZvckVhY2hBZGphY2VudChsYXN0
SW5kZXgsIFt0aGlzXShJbmRleFR5cGUgYWRqYWNlbnRUbXBJbmRleCkgeworICAgICAgICAgICAg
ZGVjcmVtZW50RGVncmVlSW5TaW1wbGlmaWNhdGlvbihhZGphY2VudFRtcEluZGV4KTsKKyAgICAg
ICAgfSk7CisgICAgfQorCisgICAgdm9pZCBzZWxlY3RTcGlsbCgpCisgICAgeworICAgICAgICBJ
bmRleFR5cGUgdmljdGltSW5kZXggPSBCYXNlOjpzZWxlY3RTcGlsbCgpOworICAgICAgICBtX3Nw
aWxsV29ya2xpc3QucXVpY2tDbGVhcih2aWN0aW1JbmRleCk7CisgICAgICAgIG1fc2ltcGxpZnlX
b3JrbGlzdC5hcHBlbmQodmljdGltSW5kZXgpOworICAgIH0KKworICAgIHN0cnVjdCBNb3ZlU2V0
IHsKKyAgICAgICAgdW5zaWduZWQgYWRkTW92ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFT
U0VSVChtX2xvd1ByaW9yaXR5TW92ZUxpc3QuaXNFbXB0eSgpKTsKKworICAgICAgICAgICAgdW5z
aWduZWQgbmV4dEluZGV4ID0gbV9wb3NpdGlvbkluTW92ZUxpc3QrKzsKKyAgICAgICAgICAgIG1f
bW92ZUxpc3QuYXBwZW5kKG5leHRJbmRleCk7CisgICAgICAgICAgICByZXR1cm4gbmV4dEluZGV4
OworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzdGFydEFkZGluZ0xvd1ByaW9yaXR5TW92ZXMo
KQorICAgICAgICB7CisgICAgICAgICAgICBBU1NFUlQobV9sb3dQcmlvcml0eU1vdmVMaXN0Lmlz
RW1wdHkoKSk7CisgICAgICAgIH0KKworICAgICAgICB1bnNpZ25lZCBhZGRMb3dQcmlvcml0eU1v
dmUoKQorICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBuZXh0SW5kZXggPSBtX3Bvc2l0
aW9uSW5Nb3ZlTGlzdCsrOworICAgICAgICAgICAgbV9sb3dQcmlvcml0eU1vdmVMaXN0LmFwcGVu
ZChuZXh0SW5kZXgpOworCisgICAgICAgICAgICByZXR1cm4gbmV4dEluZGV4OworICAgICAgICB9
CisKKyAgICAgICAgLy8gV2UgdXNlIHJlZmVyZW5jZXMgdG8gbW92ZXMgaGVyZSBiZWNhdXNlIHRo
ZSBmdW5jdGlvbgorICAgICAgICAvLyBtYXkgZG8gY29hbGVzY2luZywgaW5kaWNhdGluZyBpdCBk
b2Vzbid0IG5lZWQgdG8gc2VlCisgICAgICAgIC8vIHRoZSBtb3ZlIGFnYWluLgorICAgICAgICB0
ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24+CisgICAgICAgIHZvaWQgZm9yRWFjaE1vdmUoRnVu
Y3Rpb24gZnVuY3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQmIG1v
dmUgOiBtX21vdmVMaXN0KSB7CisgICAgICAgICAgICAgICAgaWYgKG1vdmUgIT0gVUlOVF9NQVgp
CisgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKG1vdmUpOworICAgICAgICAgICAgfQorICAg
ICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uPgorICAgICAgICB2
b2lkIGZvckVhY2hMb3dQcmlvcml0eU1vdmUoRnVuY3Rpb24gZnVuY3Rpb24pCisgICAgICAgIHsK
KyAgICAgICAgICAgIGZvciAodW5zaWduZWQmIG1vdmUgOiBtX2xvd1ByaW9yaXR5TW92ZUxpc3Qp
IHsKKyAgICAgICAgICAgICAgICBpZiAobW92ZSAhPSBVSU5UX01BWCkKKyAgICAgICAgICAgICAg
ICAgICAgZnVuY3Rpb24obW92ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAg
ICB2b2lkIGNsZWFyKCkKKyAgICAgICAgeworICAgICAgICAgICAgbV9wb3NpdGlvbkluTW92ZUxp
c3QgPSAwOworICAgICAgICAgICAgbV9tb3ZlTGlzdC5jbGVhcigpOworICAgICAgICAgICAgbV9s
b3dQcmlvcml0eU1vdmVMaXN0LmNsZWFyKCk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6Cisg
ICAgICAgIHVuc2lnbmVkIG1fcG9zaXRpb25Jbk1vdmVMaXN0OworICAgICAgICBWZWN0b3I8dW5z
aWduZWQsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX21vdmVMaXN0OworICAgICAgICBWZWN0
b3I8dW5zaWduZWQsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX2xvd1ByaW9yaXR5TW92ZUxp
c3Q7CisgICAgfTsKKworICAgIHZvaWQgZGVjcmVtZW50RGVncmVlKEluZGV4VHlwZSB0bXBJbmRl
eCkKKyAgICB7CisgICAgICAgIEFTU0VSVChtX2RlZ3JlZXNbdG1wSW5kZXhdKTsKKyAgICAgICAg
LS1tX2RlZ3JlZXNbdG1wSW5kZXhdOworICAgIH0KKworICAgIHZvaWQgZGVjcmVtZW50RGVncmVl
SW5TaW1wbGlmaWNhdGlvbihJbmRleFR5cGUgdG1wSW5kZXgpCisgICAgeworICAgICAgICBBU1NF
UlQobV9kZWdyZWVzW3RtcEluZGV4XSk7CisgICAgICAgIHVuc2lnbmVkIG9sZERlZ3JlZSA9IG1f
ZGVncmVlc1t0bXBJbmRleF0tLTsKKworICAgICAgICBpZiAob2xkRGVncmVlID09IHJlZ2lzdGVy
Q291bnQoKSkgeworICAgICAgICAgICAgQVNTRVJUKG1fZGVncmVlc1t0bXBJbmRleF0gPCByZWdp
c3RlckNvdW50KCkpOworICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpCisgICAgICAgICAgICAg
ICAgZGF0YUxvZ0xuKCJNb3ZpbmcgdG1wICIsIHRtcEluZGV4LCAiIGZyb20gc3BpbGwgbGlzdCB0
byBzaW1wbGlmeSBsaXN0IGJlY2F1c2UgaXQncyBkZWdyZWUgaXMgbm93IGxlc3MgdGhhbiBrIik7
CisKKyAgICAgICAgICAgIGlmICghQVNTRVJUX0RJU0FCTEVEKQorICAgICAgICAgICAgICAgIEFT
U0VSVChtX3Vuc3BpbGxhYmxlVG1wcy5jb250YWlucyh0bXBJbmRleCkgfHwgbV9zcGlsbFdvcmts
aXN0LmNvbnRhaW5zKHRtcEluZGV4KSk7CisgICAgICAgICAgICBtX3NwaWxsV29ya2xpc3QucXVp
Y2tDbGVhcih0bXBJbmRleCk7CisKKyAgICAgICAgICAgIEFTU0VSVCghbV9zaW1wbGlmeVdvcmts
aXN0LmNvbnRhaW5zKHRtcEluZGV4KSk7CisgICAgICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3Qu
YXBwZW5kKHRtcEluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgYXNzaWduQ29s
b3JzKCkKKyAgICB7CisgICAgICAgIG1fd29ya2xpc3RNb3Zlcy5jbGVhcigpOworICAgICAgICBC
YXNlOjphc3NpZ25Db2xvcnMoKTsKKyAgICB9CisKKyAgICAvLyBTZXQgb2YgIm1vdmUiIGVuYWJs
ZWQgZm9yIHBvc3NpYmxlIGNvYWxlc2NpbmcuCisgICAgTW92ZVNldCBtX3dvcmtsaXN0TW92ZXM7
Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5kZXhUeXBlLCB0eXBlbmFtZSBUbXBNYXBwZXI+
CitjbGFzcyBJUkMgOiBwdWJsaWMgQWJzdHJhY3RDb2xvcmluZ0FsbG9jYXRvcjxJbmRleFR5cGUs
IFRtcE1hcHBlcj4geworICAgIHVzaW5nIEJhc2UgPSBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9y
PEluZGV4VHlwZSwgVG1wTWFwcGVyPjsKK3Byb3RlY3RlZDoKKyAgICB1c2luZyBCYXNlOjptX2lz
T25TZWxlY3RTdGFjazsKKyAgICB1c2luZyBCYXNlOjptX3NlbGVjdFN0YWNrOworICAgIHVzaW5n
IEJhc2U6Om1fZnJhbWVQb2ludGVySW5kZXg7CisgICAgdXNpbmcgQmFzZTo6bV9pbnRlcmZlcmVz
V2l0aEZyYW1lUG9pbnRlcjsKKyAgICB1c2luZyBCYXNlOjptX3NpbXBsaWZ5V29ya2xpc3Q7Cisg
ICAgdXNpbmcgQmFzZTo6bV9zcGlsbFdvcmtsaXN0OworICAgIHVzaW5nIEJhc2U6Om1faGFzU2Vs
ZWN0ZWRTcGlsbDsKKyAgICB1c2luZyBCYXNlOjptX2hhc0NvYWxlc2NlZE5vblRyaXZpYWxNb3Zl
OworICAgIHVzaW5nIEJhc2U6Om1fZGVncmVlczsKKyAgICB1c2luZyBCYXNlOjpyZWdpc3RlckNv
dW50OworICAgIHVzaW5nIEJhc2U6Om1fY29hbGVzY2VkVG1wczsKKyAgICB1c2luZyBCYXNlOjpt
X21vdmVMaXN0OworICAgIHVzaW5nIEJhc2U6Om1fdXNlQ291bnRzOworICAgIHVzaW5nIEJhc2U6
Om1fY29hbGVzY2VkVG1wc0F0U3BpbGw7CisgICAgdXNpbmcgQmFzZTo6bV9zcGlsbGVkVG1wczsK
KyAgICB1c2luZyB0eXBlbmFtZSBCYXNlOjpNb3ZlT3BlcmFuZHM7CisgICAgdXNpbmcgQmFzZTo6
bV9jb2FsZXNjaW5nQ2FuZGlkYXRlczsKKyAgICB1c2luZyBCYXNlOjptX2xhc3RQcmVjb2xvcmVk
UmVnaXN0ZXJJbmRleDsKKyAgICB1c2luZyBCYXNlOjptX2NvbG9yZWRUbXA7CisgICAgdXNpbmcg
QmFzZTo6bV9jb2RlOworICAgIHVzaW5nIHR5cGVuYW1lIEJhc2U6OkludGVyZmVyZW5jZUVkZ2U7
CisgICAgdXNpbmcgQmFzZTo6bV91bnNwaWxsYWJsZVRtcHM7CisgICAgdXNpbmcgQmFzZTo6aGFz
SW50ZXJmZXJlbmNlRWRnZTsKKyAgICB1c2luZyBCYXNlOjpnZXRBbGlhczsKKyAgICB1c2luZyBC
YXNlOjphZGRFZGdlOworICAgIHVzaW5nIEJhc2U6OmlzUHJlY29sb3JlZDsKKyAgICB1c2luZyBC
YXNlOjpjYW5CZVNhZmVseUNvYWxlc2NlZDsKKyAgICB1c2luZyBCYXNlOjphZGRFZGdlRGlzdGlu
Y3RXaXRob3V0RGVncmVlQ2hhbmdlOworICAgIHVzaW5nIEJhc2U6OmZvckVhY2hBZGphY2VudDsK
KyAgICB1c2luZyBCYXNlOjpoYXNCZWVuU2ltcGxpZmllZDsKKyAgICB1c2luZyBCYXNlOjphZGRU
b1NwaWxsOworICAgIHVzaW5nIEJhc2U6Om1faW50ZXJmZXJlbmNlRWRnZXM7CisgICAgdXNpbmcg
QmFzZTo6bV9hZGphY2VuY3lMaXN0OworICAgIHVzaW5nIEJhc2U6OmR1bXBJbnRlcmZlcmVuY2VH
cmFwaEluRG90OworCitwdWJsaWM6CisgICAgSVJDKENvZGUmIGNvZGUsIGNvbnN0IFZlY3RvcjxS
ZWc+JiByZWdzSW5Qcmlvcml0eU9yZGVyLCBJbmRleFR5cGUgbGFzdFByZWNvbG9yZWRSZWdpc3Rl
ckluZGV4LCB1bnNpZ25lZCB0bXBBcnJheVNpemUsIGNvbnN0IEhhc2hTZXQ8dW5zaWduZWQ+JiB1
bnNwaWxsYWJsZVRtcHMsIGNvbnN0IFVzZUNvdW50czxUbXA+JiB1c2VDb3VudHMpCisgICAgICAg
IDogQmFzZShjb2RlLCByZWdzSW5Qcmlvcml0eU9yZGVyLCBsYXN0UHJlY29sb3JlZFJlZ2lzdGVy
SW5kZXgsIHRtcEFycmF5U2l6ZSwgdW5zcGlsbGFibGVUbXBzLCB1c2VDb3VudHMpCisgICAgewor
ICAgIH0KKworICAgIHZvaWQgYWxsb2NhdGUoKQorICAgIHsKKyAgICAgICAgbV9hY3RpdmVNb3Zl
cy5lbnN1cmVTaXplKG1fd29ya2xpc3RNb3Zlcy50b3RhbE51bWJlck9mTW92ZXMoKSk7CisgICAg
ICAgIEFTU0VSVF9XSVRIX01FU1NBR0UobV9hY3RpdmVNb3Zlcy5zaXplKCkgPj0gbV9jb2FsZXNj
aW5nQ2FuZGlkYXRlcy5zaXplKCksICJUaGUgYWN0aXZlTW92ZSBzZXQgc2hvdWxkIGJlIGJpZyBl
bm91Z2ggZm9yIHRoZSBxdWljayBvcGVyYXRpb25zIG9mIEJpdFZlY3Rvci4iKTsKKworICAgICAg
ICBtYWtlV29ya0xpc3QoKTsKKworICAgICAgICBpZiAoZGVidWcpIHsKKyAgICAgICAgICAgIGR1
bXBJbnRlcmZlcmVuY2VHcmFwaEluRG90KFdURjo6ZGF0YUZpbGUoKSk7CisgICAgICAgICAgICBk
YXRhTG9nKCJDb2FsZXNjaW5nIGNhbmRpZGF0ZXM6XG4iKTsKKyAgICAgICAgICAgIGZvciAoTW92
ZU9wZXJhbmRzJiBtb3ZlT3AgOiBtX2NvYWxlc2NpbmdDYW5kaWRhdGVzKSB7CisgICAgICAgICAg
ICAgICAgZGF0YUxvZygiICAgICIsIFRtcE1hcHBlcjo6dG1wRnJvbUFic29sdXRlSW5kZXgobW92
ZU9wLnNyY0luZGV4KSwKKyAgICAgICAgICAgICAgICAgICAgIiAtPiAiLCBUbXBNYXBwZXI6OnRt
cEZyb21BYnNvbHV0ZUluZGV4KG1vdmVPcC5kc3RJbmRleCksICJcbiIpOworICAgICAgICAgICAg
fQorICAgICAgICAgICAgZGF0YUxvZygiSW5pdGlhbCB3b3JrIGxpc3RcbiIpOworICAgICAgICAg
ICAgZHVtcFdvcmtMaXN0cyhXVEY6OmRhdGFGaWxlKCkpOworICAgICAgICB9CisKKyAgICAgICAg
ZG8geworICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpIHsKKyAgICAgICAgICAgICAgICBkYXRh
TG9nKCJCZWZvcmUgR3JhcGggc2ltcGxpZmljYXRpb24gaXRlcmF0aW9uXG4iKTsKKyAgICAgICAg
ICAgICAgICBkdW1wV29ya0xpc3RzKFdURjo6ZGF0YUZpbGUoKSk7CisgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgIGlmICghbV9zaW1wbGlmeVdvcmtsaXN0LmlzRW1wdHkoKSkKKyAgICAgICAg
ICAgICAgICBzaW1wbGlmeSgpOworICAgICAgICAgICAgZWxzZSBpZiAoIW1fd29ya2xpc3RNb3Zl
cy5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgY29hbGVzY2UoKTsKKyAgICAgICAgICAgIGVs
c2UgaWYgKCFtX2ZyZWV6ZVdvcmtsaXN0LmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICBmcmVl
emUoKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKG1fc3BpbGxXb3JrbGlzdC5iaXRDb3VudCgpKQor
ICAgICAgICAgICAgICAgIHNlbGVjdFNwaWxsKCk7CisKKyAgICAgICAgICAgIGlmICh0cmFjZURl
YnVnKSB7CisgICAgICAgICAgICAgICAgZGF0YUxvZygiQWZ0ZXIgR3JhcGggc2ltcGxpZmljYXRp
b24gaXRlcmF0aW9uXG4iKTsKKyAgICAgICAgICAgICAgICBkdW1wV29ya0xpc3RzKFdURjo6ZGF0
YUZpbGUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKCFtX3NpbXBsaWZ5V29y
a2xpc3QuaXNFbXB0eSgpIHx8ICFtX3dvcmtsaXN0TW92ZXMuaXNFbXB0eSgpIHx8ICFtX2ZyZWV6
ZVdvcmtsaXN0LmlzRW1wdHkoKSB8fCBtX3NwaWxsV29ya2xpc3QuYml0Q291bnQoKSk7CisKKyAg
ICAgICAgYXNzaWduQ29sb3JzKCk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisKKyAgICB2b2lkIG1h
a2VXb3JrTGlzdCgpCisgICAgeworICAgICAgICBJbmRleFR5cGUgZmlyc3ROb25SZWdJbmRleCA9
IG1fbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4ICsgMTsKKyAgICAgICAgZm9yIChJbmRleFR5
cGUgaSA9IGZpcnN0Tm9uUmVnSW5kZXg7IGkgPCBtX2RlZ3JlZXMuc2l6ZSgpOyArK2kpIHsKKyAg
ICAgICAgICAgIHVuc2lnbmVkIGRlZ3JlZSA9IG1fZGVncmVlc1tpXTsKKyAgICAgICAgICAgIGlm
IChkZWdyZWUgPj0gcmVnaXN0ZXJDb3VudCgpKQorICAgICAgICAgICAgICAgIGFkZFRvU3BpbGwo
aSk7CisgICAgICAgICAgICBlbHNlIGlmICghbV9tb3ZlTGlzdFtpXS5pc0VtcHR5KCkpCisgICAg
ICAgICAgICAgICAgbV9mcmVlemVXb3JrbGlzdC5hZGQoaSk7CisgICAgICAgICAgICBlbHNlCisg
ICAgICAgICAgICAgICAgbV9zaW1wbGlmeVdvcmtsaXN0LmFwcGVuZChpKTsKKyAgICAgICAgfQor
ICAgIH0KKworICAgIC8vIExvdy1kZWdyZWUgdmVydGV4IGNhbiBhbHdheXMgYmUgY29sb3JlZDog
anVzdCBwaWNrIGFueSBvZiB0aGUgY29sb3IgdGFrZW4gYnkgYW55CisgICAgLy8gb3RoZXIgYWRq
YWNlbnQgdmVyaWNlcy4KKyAgICAvLyBUaGUgIlNpbXBsaWZ5IiBwaGFzZSB0YWtlcyBhIGxvdy1k
ZWdyZWUgb3V0IG9mIHRoZSBpbnRlcmZlcmVuY2UgZ3JhcGggdG8gc2ltcGxpZnkgaXQuCisgICAg
dm9pZCBzaW1wbGlmeSgpCisgICAgeworICAgICAgICBJbmRleFR5cGUgbGFzdEluZGV4ID0gbV9z
aW1wbGlmeVdvcmtsaXN0LnRha2VMYXN0KCk7CisKKyAgICAgICAgQVNTRVJUKCFtX3NlbGVjdFN0
YWNrLmNvbnRhaW5zKGxhc3RJbmRleCkpOworICAgICAgICBBU1NFUlQoIW1faXNPblNlbGVjdFN0
YWNrLmdldChsYXN0SW5kZXgpKTsKKyAgICAgICAgbV9zZWxlY3RTdGFjay5hcHBlbmQobGFzdElu
ZGV4KTsKKyAgICAgICAgbV9pc09uU2VsZWN0U3RhY2sucXVpY2tTZXQobGFzdEluZGV4KTsKKwor
ICAgICAgICBmb3JFYWNoQWRqYWNlbnQobGFzdEluZGV4LCBbdGhpc10oSW5kZXhUeXBlIGFkamFj
ZW50VG1wSW5kZXgpIHsKKyAgICAgICAgICAgIGRlY3JlbWVudERlZ3JlZShhZGphY2VudFRtcElu
ZGV4KTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgdm9pZCBjb2FsZXNjZSgpCisgICAgewor
ICAgICAgICB1bnNpZ25lZCBtb3ZlSW5kZXggPSBtX3dvcmtsaXN0TW92ZXMudGFrZUxhc3RNb3Zl
KCk7CisgICAgICAgIGNvbnN0IE1vdmVPcGVyYW5kcyYgbW92ZU9wZXJhbmRzID0gbV9jb2FsZXNj
aW5nQ2FuZGlkYXRlc1ttb3ZlSW5kZXhdOworICAgICAgICBJbmRleFR5cGUgdSA9IGdldEFsaWFz
KG1vdmVPcGVyYW5kcy5zcmNJbmRleCk7CisgICAgICAgIEluZGV4VHlwZSB2ID0gZ2V0QWxpYXMo
bW92ZU9wZXJhbmRzLmRzdEluZGV4KTsKKworICAgICAgICBpZiAoaXNQcmVjb2xvcmVkKHYpKQor
ICAgICAgICAgICAgc3RkOjpzd2FwKHUsIHYpOworCisgICAgICAgIGlmICh0cmFjZURlYnVnKQor
ICAgICAgICAgICAgZGF0YUxvZygiQ29hbGVzY2luZyBtb3ZlIGF0IGluZGV4ICIsIG1vdmVJbmRl
eCwgIiB1ID0gIiwgdSwgIiB2ID0gIiwgdiwgIlxuIik7CisKKyAgICAgICAgaWYgKHUgPT0gdikg
eworICAgICAgICAgICAgYWRkV29ya0xpc3QodSk7CisKKyAgICAgICAgICAgIGlmICh0cmFjZURl
YnVnKQorICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICBDb2FsZXNjZWRcbiIpOworICAgICAg
ICB9IGVsc2UgaWYgKGlzUHJlY29sb3JlZCh2KQorICAgICAgICAgICAgfHwgaGFzSW50ZXJmZXJl
bmNlRWRnZShJbnRlcmZlcmVuY2VFZGdlKHUsIHYpKQorICAgICAgICAgICAgfHwgKHUgPT0gbV9m
cmFtZVBvaW50ZXJJbmRleCAmJiBtX2ludGVyZmVyZXNXaXRoRnJhbWVQb2ludGVyLnF1aWNrR2V0
KHYpKSkgeworICAgICAgICAgICAgYWRkV29ya0xpc3QodSk7CisgICAgICAgICAgICBhZGRXb3Jr
TGlzdCh2KTsKKworICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpCisgICAgICAgICAgICAgICAg
ZGF0YUxvZygiICAgIENvbnN0cmFpbmVkXG4iKTsKKyAgICAgICAgfSBlbHNlIGlmIChjYW5CZVNh
ZmVseUNvYWxlc2NlZCh1LCB2KSkgeworICAgICAgICAgICAgY29tYmluZSh1LCB2KTsKKyAgICAg
ICAgICAgIGFkZFdvcmtMaXN0KHUpOworICAgICAgICAgICAgbV9oYXNDb2FsZXNjZWROb25Ucml2
aWFsTW92ZSA9IHRydWU7CisKKyAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQorICAgICAgICAg
ICAgICAgIGRhdGFMb2coIiAgICBTYWZlIENvYWxlc2NpbmdcbiIpOworICAgICAgICB9IGVsc2Ug
eworICAgICAgICAgICAgbV9hY3RpdmVNb3Zlcy5xdWlja1NldChtb3ZlSW5kZXgpOworICAgICAg
ICAgICAgaWYgKHRyYWNlRGVidWcpCisgICAgICAgICAgICAgICAgZGF0YUxvZygiICAgIEZhaWxl
ZCBjb2FsZXNjaW5nLCBhZGRlZCB0byBhY3RpdmUgbW92ZXMuXG4iKTsKKyAgICAgICAgfQorICAg
IH0KKworICAgIHZvaWQgYWRkV29ya0xpc3QoSW5kZXhUeXBlIHRtcEluZGV4KQorICAgIHsKKyAg
ICAgICAgaWYgKCFpc1ByZWNvbG9yZWQodG1wSW5kZXgpICYmIG1fZGVncmVlc1t0bXBJbmRleF0g
PCByZWdpc3RlckNvdW50KCkgJiYgIWlzTW92ZVJlbGF0ZWQodG1wSW5kZXgpKSB7CisgICAgICAg
ICAgICBtX2ZyZWV6ZVdvcmtsaXN0LnJlbW92ZSh0bXBJbmRleCk7CisgICAgICAgICAgICBtX3Np
bXBsaWZ5V29ya2xpc3QuYXBwZW5kKHRtcEluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAg
IHZvaWQgY29tYmluZShJbmRleFR5cGUgdSwgSW5kZXhUeXBlIHYpCisgICAgeworICAgICAgICBp
ZiAoIW1fZnJlZXplV29ya2xpc3QucmVtb3ZlKHYpKQorICAgICAgICAgICAgbV9zcGlsbFdvcmts
aXN0LnF1aWNrQ2xlYXIodik7CisKKyAgICAgICAgQVNTRVJUKCFtX2NvYWxlc2NlZFRtcHNbdl0p
OworICAgICAgICBtX2NvYWxlc2NlZFRtcHNbdl0gPSB1OworCisgICAgICAgIGF1dG8mIHZNb3Zl
cyA9IG1fbW92ZUxpc3Rbdl07CisgICAgICAgIG1fbW92ZUxpc3RbdV0uYWRkKHZNb3Zlcy5iZWdp
bigpLCB2TW92ZXMuZW5kKCkpOworCisgICAgICAgIGZvckVhY2hBZGphY2VudCh2LCBbdGhpcywg
dV0gKEluZGV4VHlwZSBhZGphY2VudFRtcEluZGV4KSB7CisgICAgICAgICAgICBpZiAoYWRkRWRn
ZURpc3RpbmN0V2l0aG91dERlZ3JlZUNoYW5nZShhZGphY2VudFRtcEluZGV4LCB1KSkgeworICAg
ICAgICAgICAgICAgIC8vIElmIHdlIGFkZGVkIGEgbmV3IGVkZ2UgYmV0d2VlbiB0aGUgYWRqYWNl
bnRUbXAgYW5kIHUsIGl0IHJlcGxhY2VzIHRoZSBlZGdlCisgICAgICAgICAgICAgICAgLy8gdGhh
dCBleGlzdGVkIHdpdGggdi4KKyAgICAgICAgICAgICAgICAvLyBUaGUgZGVncmVlIG9mIGFkamFj
ZW50VG1wIHJlbWFpbnMgdGhlIHNhbWUgc2luY2UgdGhlIGVkZ2UganVzdCBjaGFuZ2VkIGZyb20g
dSB0byB2LgorICAgICAgICAgICAgICAgIC8vIEFsbCB3ZSBuZWVkIHRvIGRvIGlzIHVwZGF0ZSB0
aGUgZGVncmVlIG9mIHUuCisgICAgICAgICAgICAgICAgaWYgKCFpc1ByZWNvbG9yZWQodSkpCisg
ICAgICAgICAgICAgICAgICAgIG1fZGVncmVlc1t1XSsrOworICAgICAgICAgICAgfSBlbHNlIHsK
KyAgICAgICAgICAgICAgICAvLyBJZiB3ZSBhbHJlYWR5IGhhZCBhbiBlZGdlIGJldHdlZW4gdGhl
IGFkamFjZW50VG1wIGFuZCB1LCB0aGUgZGVncmVlIG9mIHUKKyAgICAgICAgICAgICAgICAvLyBp
cyBhbHJlYWR5IGNvcnJlY3QuIFRoZSBkZWdyZWUgb2YgdGhlIGFkamFjZW50VG1wIGRlY3JlYXNl
cyBzaW5jZSB0aGUgZWRnZQorICAgICAgICAgICAgICAgIC8vIHdpdGggdiBpcyBubyBsb25nZXIg
cmVsZXZhbnQgKHdlIGNhbiB0aGluayBvZiBpdCBhcyBtZXJnZWQgd2l0aCB0aGUgZWRnZSB3aXRo
IHUpLgorICAgICAgICAgICAgICAgIGRlY3JlbWVudERlZ3JlZShhZGphY2VudFRtcEluZGV4KTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgaWYgKG1fZnJhbWVQb2ludGVy
SW5kZXggJiYgbV9pbnRlcmZlcmVzV2l0aEZyYW1lUG9pbnRlci5xdWlja0dldCh2KSkKKyAgICAg
ICAgICAgIG1faW50ZXJmZXJlc1dpdGhGcmFtZVBvaW50ZXIucXVpY2tTZXQodSk7CisKKyAgICAg
ICAgaWYgKG1fZGVncmVlc1t1XSA+PSByZWdpc3RlckNvdW50KCkgJiYgbV9mcmVlemVXb3JrbGlz
dC5yZW1vdmUodSkpCisgICAgICAgICAgICBhZGRUb1NwaWxsKHUpOworICAgIH0KKworICAgIHZv
aWQgZnJlZXplKCkKKyAgICB7CisgICAgICAgIEluZGV4VHlwZSB2aWN0aW1JbmRleCA9IG1fZnJl
ZXplV29ya2xpc3QudGFrZUFueSgpOworICAgICAgICBBU1NFUlRfV0lUSF9NRVNTQUdFKGdldEFs
aWFzKHZpY3RpbUluZGV4KSA9PSB2aWN0aW1JbmRleCwgImNvYWxlc2NlKCkgc2hvdWxkIG5vdCBs
ZWF2ZSBhbGlhc2VkIFRtcCBpbiB0aGUgd29ya2xpc3QuIik7CisgICAgICAgIG1fc2ltcGxpZnlX
b3JrbGlzdC5hcHBlbmQodmljdGltSW5kZXgpOworICAgICAgICBmcmVlemVNb3Zlcyh2aWN0aW1J
bmRleCk7CisgICAgfQorCisgICAgdm9pZCBmcmVlemVNb3ZlcyhJbmRleFR5cGUgdG1wSW5kZXgp
CisgICAgeworICAgICAgICBmb3JFYWNoTm9kZU1vdmVzKHRtcEluZGV4LCBbdGhpcywgdG1wSW5k
ZXhdIChJbmRleFR5cGUgbW92ZUluZGV4KSB7CisgICAgICAgICAgICBpZiAoIW1fYWN0aXZlTW92
ZXMucXVpY2tDbGVhcihtb3ZlSW5kZXgpKQorICAgICAgICAgICAgICAgIG1fd29ya2xpc3RNb3Zl
cy50YWtlTW92ZShtb3ZlSW5kZXgpOworCisgICAgICAgICAgICBjb25zdCBNb3ZlT3BlcmFuZHMm
IG1vdmVPcGVyYW5kcyA9IG1fY29hbGVzY2luZ0NhbmRpZGF0ZXNbbW92ZUluZGV4XTsKKyAgICAg
ICAgICAgIEluZGV4VHlwZSBzcmNUbXBJbmRleCA9IG1vdmVPcGVyYW5kcy5zcmNJbmRleDsKKyAg
ICAgICAgICAgIEluZGV4VHlwZSBkc3RUbXBJbmRleCA9IG1vdmVPcGVyYW5kcy5kc3RJbmRleDsK
KworICAgICAgICAgICAgSW5kZXhUeXBlIG9yaWdpbmFsT3RoZXJUbXAgPSBzcmNUbXBJbmRleCAh
PSB0bXBJbmRleCA/IHNyY1RtcEluZGV4IDogZHN0VG1wSW5kZXg7CisgICAgICAgICAgICBJbmRl
eFR5cGUgb3RoZXJUbXBJbmRleCA9IGdldEFsaWFzKG9yaWdpbmFsT3RoZXJUbXApOworICAgICAg
ICAgICAgaWYgKG1fZGVncmVlc1tvdGhlclRtcEluZGV4XSA8IHJlZ2lzdGVyQ291bnQoKSAmJiAh
aXNNb3ZlUmVsYXRlZChvdGhlclRtcEluZGV4KSkgeworICAgICAgICAgICAgICAgIGlmIChtX2Zy
ZWV6ZVdvcmtsaXN0LnJlbW92ZShvdGhlclRtcEluZGV4KSkKKyAgICAgICAgICAgICAgICAgICAg
bV9zaW1wbGlmeVdvcmtsaXN0LmFwcGVuZChvdGhlclRtcEluZGV4KTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgfSk7CisgICAgfQorCisgICAgdm9pZCBkZWNyZW1lbnREZWdyZWUoSW5kZXhUeXBl
IHRtcEluZGV4KQorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fZGVncmVlc1t0bXBJbmRleF0pOwor
CisgICAgICAgIHVuc2lnbmVkIG9sZERlZ3JlZSA9IG1fZGVncmVlc1t0bXBJbmRleF0tLTsKKyAg
ICAgICAgaWYgKG9sZERlZ3JlZSA9PSByZWdpc3RlckNvdW50KCkpIHsKKyAgICAgICAgICAgIGVu
YWJsZU1vdmVzT25WYWx1ZUFuZEFkamFjZW50cyh0bXBJbmRleCk7CisgICAgICAgICAgICBtX3Nw
aWxsV29ya2xpc3QucXVpY2tDbGVhcih0bXBJbmRleCk7CisgICAgICAgICAgICBpZiAoaXNNb3Zl
UmVsYXRlZCh0bXBJbmRleCkpCisgICAgICAgICAgICAgICAgbV9mcmVlemVXb3JrbGlzdC5hZGQo
dG1wSW5kZXgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1fc2ltcGxpZnlX
b3JrbGlzdC5hcHBlbmQodG1wSW5kZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBz
ZWxlY3RTcGlsbCgpCisgICAgeworICAgICAgICBJbmRleFR5cGUgdmljdGltSW5kZXggPSBCYXNl
OjpzZWxlY3RTcGlsbCgpOworICAgICAgICBtX3NwaWxsV29ya2xpc3QucXVpY2tDbGVhcih2aWN0
aW1JbmRleCk7CisgICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5hcHBlbmQodmljdGltSW5kZXgp
OworICAgICAgICBmcmVlemVNb3Zlcyh2aWN0aW1JbmRleCk7CisgICAgfQogCi0gICAgLy8gVGhl
IGludGVyZmVyZW5jZSBncmFwaC4KLSAgICBIYXNoU2V0PEludGVyZmVyZW5jZUVkZ2UsIEludGVy
ZmVyZW5jZUVkZ2VIYXNoLCBJbnRlcmZlcmVuY2VFZGdlSGFzaFRyYWl0cz4gbV9pbnRlcmZlcmVu
Y2VFZGdlczsKLSAgICBWZWN0b3I8VmVjdG9yPEluZGV4VHlwZSwgMCwgVW5zYWZlVmVjdG9yT3Zl
cmZsb3csIDQ+LCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9hZGphY2VuY3lMaXN0OwotICAg
IFZlY3RvcjxJbmRleFR5cGUsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX2RlZ3JlZXM7Cisg
ICAgdm9pZCBhc3NpZ25Db2xvcnMoKQorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fZnJlZXplV29y
a2xpc3QuaXNFbXB0eSgpKTsKKyAgICAgICAgbV93b3JrbGlzdE1vdmVzLmNsZWFyKCk7CisgICAg
ICAgIEJhc2U6OmFzc2lnbkNvbG9ycygpOworICAgIH0KIAotICAgIC8vIEluc3RlYWQgb2Yga2Vl
cGluZyB0cmFjayBvZiB0aGUgbW92ZSBpbnN0cnVjdGlvbnMsIHdlIGp1c3Qga2VlcCB0aGVpciBv
cGVyYW5kcyBhcm91bmQgYW5kIHVzZSB0aGUgaW5kZXgKLSAgICAvLyBpbiB0aGUgdmVjdG9yIGFz
IHRoZSAiaWRlbnRpZmllciIgZm9yIHRoZSBtb3ZlLgotICAgIHN0cnVjdCBNb3ZlT3BlcmFuZHMg
ewotICAgICAgICBJbmRleFR5cGUgc3JjSW5kZXg7Ci0gICAgICAgIEluZGV4VHlwZSBkc3RJbmRl
eDsKLSAgICB9OwotICAgIFZlY3RvcjxNb3ZlT3BlcmFuZHMsIDAsIFVuc2FmZVZlY3Rvck92ZXJm
bG93PiBtX2NvYWxlc2NpbmdDYW5kaWRhdGVzOwogCi0gICAgLy8gTGlzdCBvZiBldmVyeSBtb3Zl
IGluc3RydWN0aW9uIGFzc29jaWF0ZWQgd2l0aCBhIFRtcC4KLSAgICBWZWN0b3I8SGFzaFNldDxJ
bmRleFR5cGUsIHR5cGVuYW1lIERlZmF1bHRIYXNoPEluZGV4VHlwZT46Okhhc2gsIFdURjo6VW5z
aWduZWRXaXRoWmVyb0tleUhhc2hUcmFpdHM8SW5kZXhUeXBlPj4+IG1fbW92ZUxpc3Q7CisgICAg
Ym9vbCBpc01vdmVSZWxhdGVkKEluZGV4VHlwZSB0bXBJbmRleCkKKyAgICB7CisgICAgICAgIGZv
ciAodW5zaWduZWQgbW92ZUluZGV4IDogbV9tb3ZlTGlzdFt0bXBJbmRleF0pIHsKKyAgICAgICAg
ICAgIGlmIChtX2FjdGl2ZU1vdmVzLnF1aWNrR2V0KG1vdmVJbmRleCkgfHwgbV93b3JrbGlzdE1v
dmVzLmNvbnRhaW5zKG1vdmVJbmRleCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIAotICAgIC8vIENvbG9ycy4K
LSAgICBWZWN0b3I8UmVnLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9jb2xvcmVkVG1wOwot
ICAgIFZlY3RvcjxJbmRleFR5cGU+IG1fc3BpbGxlZFRtcHM7CisgICAgdGVtcGxhdGU8dHlwZW5h
bWUgRnVuY3Rpb24+CisgICAgdm9pZCBmb3JFYWNoTm9kZU1vdmVzKEluZGV4VHlwZSB0bXBJbmRl
eCwgRnVuY3Rpb24gZnVuY3Rpb24pCisgICAgeworICAgICAgICBmb3IgKHVuc2lnbmVkIG1vdmVJ
bmRleCA6IG1fbW92ZUxpc3RbdG1wSW5kZXhdKSB7CisgICAgICAgICAgICBpZiAobV9hY3RpdmVN
b3Zlcy5xdWlja0dldChtb3ZlSW5kZXgpIHx8IG1fd29ya2xpc3RNb3Zlcy5jb250YWlucyhtb3Zl
SW5kZXgpKQorICAgICAgICAgICAgICAgIGZ1bmN0aW9uKG1vdmVJbmRleCk7CisgICAgICAgIH0K
KyAgICB9CiAKLSAgICAvLyBWYWx1ZXMgdGhhdCBoYXZlIGJlZW4gY29hbGVzY2VkIHdpdGggYW4g
b3RoZXIgdmFsdWUuCi0gICAgVmVjdG9yPEluZGV4VHlwZSwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZs
b3c+IG1fY29hbGVzY2VkVG1wczsKKyAgICB2b2lkIGVuYWJsZU1vdmVzT25WYWx1ZShJbmRleFR5
cGUgdG1wSW5kZXgpCisgICAgeworICAgICAgICBmb3IgKHVuc2lnbmVkIG1vdmVJbmRleCA6IG1f
bW92ZUxpc3RbdG1wSW5kZXhdKSB7CisgICAgICAgICAgICBpZiAobV9hY3RpdmVNb3Zlcy5xdWlj
a0NsZWFyKG1vdmVJbmRleCkpCisgICAgICAgICAgICAgICAgbV93b3JrbGlzdE1vdmVzLnJldHVy
bk1vdmUobW92ZUluZGV4KTsKKyAgICAgICAgfQorICAgIH0KIAotICAgIC8vIFRoZSBzdGFjayBv
ZiBUbXAgcmVtb3ZlZCBmcm9tIHRoZSBncmFwaCBhbmQgcmVhZHkgZm9yIGNvbG9yaW5nLgotICAg
IEJpdFZlY3RvciBtX2lzT25TZWxlY3RTdGFjazsKLSAgICBWZWN0b3I8SW5kZXhUeXBlPiBtX3Nl
bGVjdFN0YWNrOworICAgIHZvaWQgZW5hYmxlTW92ZXNPblZhbHVlQW5kQWRqYWNlbnRzKEluZGV4
VHlwZSB0bXBJbmRleCkKKyAgICB7CisgICAgICAgIGVuYWJsZU1vdmVzT25WYWx1ZSh0bXBJbmRl
eCk7CiAKLSAgICBJbmRleFR5cGUgbV9mcmFtZVBvaW50ZXJJbmRleCB7IDAgfTsKLSAgICBCaXRW
ZWN0b3IgbV9pbnRlcmZlcmVzV2l0aEZyYW1lUG9pbnRlcjsKKyAgICAgICAgZm9yRWFjaEFkamFj
ZW50KHRtcEluZGV4LCBbdGhpc10gKEluZGV4VHlwZSBhZGphY2VudFRtcEluZGV4KSB7CisgICAg
ICAgICAgICBlbmFibGVNb3Zlc09uVmFsdWUoYWRqYWNlbnRUbXBJbmRleCk7CisgICAgICAgIH0p
OworICAgIH0KIAogICAgIHN0cnVjdCBPcmRlcmVkTW92ZVNldCB7CiAgICAgICAgIHVuc2lnbmVk
IGFkZE1vdmUoKQpAQCAtNzAyLDYgKzEyNzcsMTEgQEAgcHJvdGVjdGVkOgogICAgICAgICAgICAg
bV9sb3dQcmlvcml0eU1vdmVMaXN0LmNsZWFyKCk7CiAgICAgICAgIH0KIAorICAgICAgICB1bnNp
Z25lZCB0b3RhbE51bWJlck9mTW92ZXMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4g
bV9tb3ZlTGlzdC5zaXplKCkgKyBtX2xvd1ByaW9yaXR5TW92ZUxpc3Quc2l6ZSgpOworICAgICAg
ICB9CisKICAgICBwcml2YXRlOgogICAgICAgICBWZWN0b3I8dW5zaWduZWQsIDAsIFVuc2FmZVZl
Y3Rvck92ZXJmbG93PiBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdDsKICAgICAgICAgVmVjdG9yPHVuc2ln
bmVkLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9tb3ZlTGlzdDsKQEAgLTcwOSw1MCArMTI4
OSw3OSBAQCBwcm90ZWN0ZWQ6CiAgICAgICAgIHVuc2lnbmVkIG1fZmlyc3RMb3dQcmlvcml0eU1v
dmVJbmRleCB7IDAgfTsKICAgICB9OwogCisgICAgdm9pZCBkdW1wV29ya0xpc3RzKFByaW50U3Ry
ZWFtJiBvdXQpCisgICAgeworICAgICAgICBvdXQucHJpbnQoIlNpbXBsaWZ5IHdvcmsgbGlzdDpc
biIpOworICAgICAgICBmb3IgKHVuc2lnbmVkIHRtcEluZGV4IDogbV9zaW1wbGlmeVdvcmtsaXN0
KQorICAgICAgICAgICAgb3V0LnByaW50KCIgICAgIiwgVG1wTWFwcGVyOjp0bXBGcm9tQWJzb2x1
dGVJbmRleCh0bXBJbmRleCksICJcbiIpOworICAgICAgICBvdXQucHJpbnRmKCJNb3ZlcyB3b3Jr
IGxpc3QgaXMgZW1wdHk/ICVkXG4iLCBtX3dvcmtsaXN0TW92ZXMuaXNFbXB0eSgpKTsKKyAgICAg
ICAgb3V0LnByaW50KCJGcmVlemUgd29yayBsaXN0OlxuIik7CisgICAgICAgIGZvciAodW5zaWdu
ZWQgdG1wSW5kZXggOiBtX2ZyZWV6ZVdvcmtsaXN0KQorICAgICAgICAgICAgb3V0LnByaW50KCIg
ICAgIiwgVG1wTWFwcGVyOjp0bXBGcm9tQWJzb2x1dGVJbmRleCh0bXBJbmRleCksICJcbiIpOwor
ICAgICAgICBvdXQucHJpbnQoIlNwaWxsIHdvcmsgbGlzdDpcbiIpOworICAgICAgICBmb3IgKHVu
c2lnbmVkIHRtcEluZGV4IDogbV9zcGlsbFdvcmtsaXN0KQorICAgICAgICAgICAgb3V0LnByaW50
KCIgICAgIiwgVG1wTWFwcGVyOjp0bXBGcm9tQWJzb2x1dGVJbmRleCh0bXBJbmRleCksICJcbiIp
OworICAgIH0KKwogICAgIC8vIFdvcmsgbGlzdHMuCisgICAgLy8gTG93LWRlZ3JlZSwgTW92ZSBy
ZWxhdGVkLgorICAgIEhhc2hTZXQ8SW5kZXhUeXBlPiBtX2ZyZWV6ZVdvcmtsaXN0OwogICAgIC8v
IFNldCBvZiAibW92ZSIgZW5hYmxlZCBmb3IgcG9zc2libGUgY29hbGVzY2luZy4KICAgICBPcmRl
cmVkTW92ZVNldCBtX3dvcmtsaXN0TW92ZXM7CiAgICAgLy8gU2V0IG9mICJtb3ZlIiBub3QgeWV0
IHJlYWR5IGZvciBjb2FsZXNjaW5nLgogICAgIEJpdFZlY3RvciBtX2FjdGl2ZU1vdmVzOwotICAg
IC8vIExvdy1kZWdyZWUsIG5vbi1Nb3ZlIHJlbGF0ZWQuCi0gICAgVmVjdG9yPEluZGV4VHlwZT4g
bV9zaW1wbGlmeVdvcmtsaXN0OwotICAgIC8vIEhpZ2gtZGVncmVlIFRtcC4KLSAgICBIYXNoU2V0
PEluZGV4VHlwZT4gbV9zcGlsbFdvcmtsaXN0OwotICAgIC8vIExvdy1kZWdyZWUsIE1vdmUgcmVs
YXRlZC4KLSAgICBIYXNoU2V0PEluZGV4VHlwZT4gbV9mcmVlemVXb3JrbGlzdDsKLQotICAgIGJv
b2wgbV9oYXNTZWxlY3RlZFNwaWxsIHsgZmFsc2UgfTsKLSAgICBib29sIG1faGFzQ29hbGVzY2Vk
Tm9uVHJpdmlhbE1vdmUgeyBmYWxzZSB9OwotCi0gICAgLy8gVGhlIG1hcHBpbmcgb2YgVG1wIHRv
IHRoZWlyIGFsaWFzIGZvciBNb3ZlcyB0aGF0IGFyZSBhbHdheXMgY29hbGVzY2luZyByZWdhcmRs
ZXNzIG9mIHNwaWxsaW5nLgotICAgIFZlY3RvcjxJbmRleFR5cGUsIDAsIFVuc2FmZVZlY3Rvck92
ZXJmbG93PiBtX2NvYWxlc2NlZFRtcHNBdFNwaWxsOwotICAgIAotICAgIGNvbnN0IEhhc2hTZXQ8
dW5zaWduZWQ+JiBtX3Vuc3BpbGxhYmxlVG1wczsKIH07CiAKIC8vIFRoaXMgcGVyZm9ybSBhbGwg
dGhlIHRhc2tzIHRoYXQgYXJlIHNwZWNpZmljIHRvIGNlcnRhaW4gcmVnaXN0ZXIgdHlwZS4KLXRl
bXBsYXRlPEFyZzo6VHlwZSB0eXBlPgotY2xhc3MgQ29sb3JpbmdBbGxvY2F0b3IgOiBwdWJsaWMg
QWJzdHJhY3RDb2xvcmluZ0FsbG9jYXRvcjx1bnNpZ25lZD4gewordGVtcGxhdGU8QXJnOjpUeXBl
IHR5cGUsIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgQWxsb2NhdG9yVHlwZT4K
K2NsYXNzIENvbG9yaW5nQWxsb2NhdG9yIDogcHVibGljIEFsbG9jYXRvclR5cGU8dW5zaWduZWQs
IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+PiB7CisgICAgdXNpbmcgVG1wTWFwcGVyID0gQWJzb2x1
dGVUbXBNYXBwZXI8dHlwZT47CisgICAgdXNpbmcgQmFzZSA9IEFsbG9jYXRvclR5cGU8dW5zaWdu
ZWQsIFRtcE1hcHBlcj47CisgICAgdXNpbmcgQmFzZTo6bV9pc09uU2VsZWN0U3RhY2s7CisgICAg
dXNpbmcgQmFzZTo6bV9zZWxlY3RTdGFjazsKKyAgICB1c2luZyBCYXNlOjptX2ZyYW1lUG9pbnRl
ckluZGV4OworICAgIHVzaW5nIEJhc2U6Om1faW50ZXJmZXJlc1dpdGhGcmFtZVBvaW50ZXI7Cisg
ICAgdXNpbmcgQmFzZTo6bV9zaW1wbGlmeVdvcmtsaXN0OworICAgIHVzaW5nIEJhc2U6Om1fc3Bp
bGxXb3JrbGlzdDsKKyAgICB1c2luZyBCYXNlOjptX2hhc1NlbGVjdGVkU3BpbGw7CisgICAgdXNp
bmcgQmFzZTo6bV9oYXNDb2FsZXNjZWROb25Ucml2aWFsTW92ZTsKKyAgICB1c2luZyBCYXNlOjpt
X2RlZ3JlZXM7CisgICAgdXNpbmcgQmFzZTo6cmVnaXN0ZXJDb3VudDsKKyAgICB1c2luZyBCYXNl
OjptX2NvYWxlc2NlZFRtcHM7CisgICAgdXNpbmcgQmFzZTo6bV9tb3ZlTGlzdDsKKyAgICB1c2lu
ZyBCYXNlOjptX3VzZUNvdW50czsKKyAgICB1c2luZyBCYXNlOjptX2NvYWxlc2NlZFRtcHNBdFNw
aWxsOworICAgIHVzaW5nIEJhc2U6Om1fc3BpbGxlZFRtcHM7CisgICAgdXNpbmcgdHlwZW5hbWUg
QmFzZTo6TW92ZU9wZXJhbmRzOworICAgIHVzaW5nIEJhc2U6Om1fY29hbGVzY2luZ0NhbmRpZGF0
ZXM7CisgICAgdXNpbmcgQmFzZTo6bV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXg7CisgICAg
dXNpbmcgQmFzZTo6bV9jb2xvcmVkVG1wOworICAgIHVzaW5nIEJhc2U6Om1fY29kZTsKKyAgICB1
c2luZyB0eXBlbmFtZSBCYXNlOjpJbnRlcmZlcmVuY2VFZGdlOworICAgIHVzaW5nIEJhc2U6Om1f
d29ya2xpc3RNb3ZlczsKKyAgICB1c2luZyBCYXNlOjpoYXNJbnRlcmZlcmVuY2VFZGdlOworICAg
IHVzaW5nIEJhc2U6OmdldEFsaWFzOworICAgIHVzaW5nIEJhc2U6OmFkZEVkZ2U7CisgICAgdXNp
bmcgQmFzZTo6bV9pbnRlcmZlcmVuY2VFZGdlczsKKwogcHVibGljOgorCiAgICAgQ29sb3JpbmdB
bGxvY2F0b3IoQ29kZSYgY29kZSwgVG1wV2lkdGgmIHRtcFdpZHRoLCBjb25zdCBVc2VDb3VudHM8
VG1wPiYgdXNlQ291bnRzLCBjb25zdCBIYXNoU2V0PHVuc2lnbmVkPiYgdW5zcGlsbGFibGVUbXAp
Ci0gICAgICAgIDogQWJzdHJhY3RDb2xvcmluZ0FsbG9jYXRvcjx1bnNpZ25lZD4oY29kZS5yZWdz
SW5Qcmlvcml0eU9yZGVyKHR5cGUpLCBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6bGFzdE1hY2hp
bmVSZWdpc3RlckluZGV4KCksIHRtcEFycmF5U2l6ZShjb2RlKSwgdW5zcGlsbGFibGVUbXApCi0g
ICAgICAgICwgbV9jb2RlKGNvZGUpCisgICAgICAgIDogQmFzZShjb2RlLCBjb2RlLnJlZ3NJblBy
aW9yaXR5T3JkZXIodHlwZSksIFRtcE1hcHBlcjo6bGFzdE1hY2hpbmVSZWdpc3RlckluZGV4KCks
IHRtcEFycmF5U2l6ZShjb2RlKSwgdW5zcGlsbGFibGVUbXAsIHVzZUNvdW50cykKICAgICAgICAg
LCBtX3RtcFdpZHRoKHRtcFdpZHRoKQotICAgICAgICAsIG1fdXNlQ291bnRzKHVzZUNvdW50cykK
ICAgICB7CiAgICAgICAgIGlmICh0eXBlID09IEFyZzo6R1ApIHsKLSAgICAgICAgICAgIG1fZnJh
bWVQb2ludGVySW5kZXggPSBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChU
bXAoTWFjcm9Bc3NlbWJsZXI6OmZyYW1lUG9pbnRlclJlZ2lzdGVyKSk7CisgICAgICAgICAgICBt
X2ZyYW1lUG9pbnRlckluZGV4ID0gVG1wTWFwcGVyOjphYnNvbHV0ZUluZGV4KFRtcChNYWNyb0Fz
c2VtYmxlcjo6ZnJhbWVQb2ludGVyUmVnaXN0ZXIpKTsKICAgICAgICAgICAgIG1faW50ZXJmZXJl
c1dpdGhGcmFtZVBvaW50ZXIuZW5zdXJlU2l6ZSh0bXBBcnJheVNpemUoY29kZSkpOwogICAgICAg
ICB9CiAKICAgICAgICAgaW5pdGlhbGl6ZVByZWNvbG9yZWRUbXAoKTsKICAgICAgICAgYnVpbGQo
KTsKLSAgICAgICAgYWxsb2NhdGUoKTsKICAgICB9CiAKICAgICBUbXAgZ2V0QWxpYXMoVG1wIHRt
cCkgY29uc3QKICAgICB7Ci0gICAgICAgIHJldHVybiBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6
dG1wRnJvbUFic29sdXRlSW5kZXgoZ2V0QWxpYXMoQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFi
c29sdXRlSW5kZXgodG1wKSkpOworICAgICAgICByZXR1cm4gVG1wTWFwcGVyOjp0bXBGcm9tQWJz
b2x1dGVJbmRleChnZXRBbGlhcyhUbXBNYXBwZXI6OmFic29sdXRlSW5kZXgodG1wKSkpOwogICAg
IH0KIAogICAgIC8vIFRoaXMgdGVsbHMgeW91IGlmIGEgTW92ZSB3aWxsIGJlIGNvYWxlc2NhYmxl
IGlmIHRoZSBzcmMgYW5kIGRzdCBlbmQgdXAgbWF0Y2hpbmcuIFRoaXMgbWV0aG9kCkBAIC03NzUs
MTEgKzEzODQsMTEgQEAgcHVibGljOgogICAgICAgICBpZiAobV9jb2FsZXNjZWRUbXBzQXRTcGls
bC5pc0VtcHR5KCkpCiAgICAgICAgICAgICByZXR1cm4gdG1wOwogCi0gICAgICAgIHVuc2lnbmVk
IGFsaWFzSW5kZXggPSBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh0bXAp
OworICAgICAgICB1bnNpZ25lZCBhbGlhc0luZGV4ID0gVG1wTWFwcGVyOjphYnNvbHV0ZUluZGV4
KHRtcCk7CiAgICAgICAgIHdoaWxlICh1bnNpZ25lZCBuZXh0QWxpYXNJbmRleCA9IG1fY29hbGVz
Y2VkVG1wc0F0U3BpbGxbYWxpYXNJbmRleF0pCiAgICAgICAgICAgICBhbGlhc0luZGV4ID0gbmV4
dEFsaWFzSW5kZXg7CiAKLSAgICAgICAgVG1wIGFsaWFzID0gQWJzb2x1dGVUbXBNYXBwZXI8dHlw
ZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KGFsaWFzSW5kZXgpOworICAgICAgICBUbXAgYWxpYXMg
PSBUbXBNYXBwZXI6OnRtcEZyb21BYnNvbHV0ZUluZGV4KGFsaWFzSW5kZXgpOwogCiAgICAgICAg
IEFTU0VSVF9XSVRIX01FU1NBR0UoIW1fc3BpbGxlZFRtcHMuY29udGFpbnMoYWxpYXNJbmRleCkg
fHwgYWxpYXMgPT0gdG1wLCAiVGhlIGFsaWFzZXMgYXQgc3BpbGwgc2hvdWxkIGFsd2F5cyBiZSBj
b2xvcmFibGUuIFNvbWV0aGluZyB3ZW50IGhvcnJpYmx5IHdyb25nLiIpOwogCkBAIC03OTQsNyAr
MTQwMyw3IEBAIHB1YmxpYzoKICAgICAgICAgewogICAgICAgICB9CiAKLSAgICAgICAgVG1wIG9w
ZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9t
QWJzb2x1dGVJbmRleCgqbV9pbmRleEl0ZXJhdG9yKTsgfQorICAgICAgICBUbXAgb3BlcmF0b3Iq
KCkgY29uc3QgeyByZXR1cm4gVG1wTWFwcGVyOjp0bXBGcm9tQWJzb2x1dGVJbmRleCgqbV9pbmRl
eEl0ZXJhdG9yKTsgfQogICAgICAgICBJbmRleFRvVG1wSXRlcmF0b3JBZGFwdG9yJiBvcGVyYXRv
cisrKCkgeyArK21faW5kZXhJdGVyYXRvcjsgcmV0dXJuICp0aGlzOyB9CiAKICAgICAgICAgYm9v
bCBvcGVyYXRvcj09KGNvbnN0IEluZGV4VG9UbXBJdGVyYXRvckFkYXB0b3ImIG90aGVyKSBjb25z
dApAQCAtODQzLDcgKzE0NTIsNyBAQCBwdWJsaWM6CiAgICAgICAgIEFTU0VSVChtX2NvbG9yZWRU
bXAuc2l6ZSgpKTsKICAgICAgICAgQVNTRVJUKHRtcC5pc0dQKCkgPT0gKHR5cGUgPT0gQXJnOjpH
UCkpOwogCi0gICAgICAgIFJlZyByZWcgPSBtX2NvbG9yZWRUbXBbQWJzb2x1dGVUbXBNYXBwZXI8
dHlwZT46OmFic29sdXRlSW5kZXgodG1wKV07CisgICAgICAgIFJlZyByZWcgPSBtX2NvbG9yZWRU
bXBbVG1wTWFwcGVyOjphYnNvbHV0ZUluZGV4KHRtcCldOwogICAgICAgICBpZiAoIXJlZykgewog
ICAgICAgICAgICAgZGF0YUxvZygiRkFUQUw6IE5vIGNvbG9yIGZvciAiLCB0bXAsICJcbiIpOwog
ICAgICAgICAgICAgZGF0YUxvZygiQ29kZTpcbiIpOwpAQCAtODUzLDE4ICsxNDYyLDE4IEBAIHB1
YmxpYzoKICAgICAgICAgcmV0dXJuIHJlZzsKICAgICB9CiAKLXByaXZhdGU6Citwcm90ZWN0ZWQ6
CiAgICAgc3RhdGljIHVuc2lnbmVkIHRtcEFycmF5U2l6ZShDb2RlJiBjb2RlKQogICAgIHsKICAg
ICAgICAgdW5zaWduZWQgbnVtVG1wcyA9IGNvZGUubnVtVG1wcyh0eXBlKTsKLSAgICAgICAgcmV0
dXJuIEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KG51bVRtcHMpOworICAg
ICAgICByZXR1cm4gVG1wTWFwcGVyOjphYnNvbHV0ZUluZGV4KG51bVRtcHMpOwogICAgIH0KIAog
ICAgIHZvaWQgaW5pdGlhbGl6ZVByZWNvbG9yZWRUbXAoKQogICAgIHsKICAgICAgICAgbV9jb2xv
cmVkVG1wLnJlc2l6ZShtX2xhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleCArIDEpOwogICAgICAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAxOyBpIDw9IG1fbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4
OyArK2kpIHsKLSAgICAgICAgICAgIFRtcCB0bXAgPSBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6
dG1wRnJvbUFic29sdXRlSW5kZXgoaSk7CisgICAgICAgICAgICBUbXAgdG1wID0gVG1wTWFwcGVy
Ojp0bXBGcm9tQWJzb2x1dGVJbmRleChpKTsKICAgICAgICAgICAgIEFTU0VSVCh0bXAuaXNSZWco
KSk7CiAgICAgICAgICAgICBtX2NvbG9yZWRUbXBbaV0gPSB0bXAucmVnKCk7CiAgICAgICAgIH0K
QEAgLTg4NCwxMCArMTQ5MywxMCBAQCBwcml2YXRlOgogICAgICAgICBpZiAobGVmdFRtcC5pc0dQ
KCkgIT0gKHR5cGUgPT0gQXJnOjpHUCkgfHwgcmlnaHRUbXAuaXNHUCgpICE9ICh0eXBlID09IEFy
Zzo6R1ApKQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgICAgIHVuc2lnbmVkIGxl
ZnRJbmRleCA9IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KGxlZnRUbXAp
OwotICAgICAgICB1bnNpZ25lZCByaWdodEluZGV4ID0gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46
OmFic29sdXRlSW5kZXgocmlnaHRUbXApOworICAgICAgICB1bnNpZ25lZCBsZWZ0SW5kZXggPSBU
bXBNYXBwZXI6OmFic29sdXRlSW5kZXgobGVmdFRtcCk7CisgICAgICAgIHVuc2lnbmVkIHJpZ2h0
SW5kZXggPSBUbXBNYXBwZXI6OmFic29sdXRlSW5kZXgocmlnaHRUbXApOwogCi0gICAgICAgIHJl
dHVybiAhbV9pbnRlcmZlcmVuY2VFZGdlcy5jb250YWlucyhJbnRlcmZlcmVuY2VFZGdlKGxlZnRJ
bmRleCwgcmlnaHRJbmRleCkpOworICAgICAgICByZXR1cm4gIWhhc0ludGVyZmVyZW5jZUVkZ2Uo
SW50ZXJmZXJlbmNlRWRnZShsZWZ0SW5kZXgsIHJpZ2h0SW5kZXgpKTsKICAgICB9CiAKICAgICB2
b2lkIGFkZFRvTG93UHJpb3JpdHlDb2FsZXNjaW5nQ2FuZGlkYXRlcyhBcmcgbGVmdCwgQXJnIHJp
Z2h0KQpAQCAtODk2LDggKzE1MDUsOCBAQCBwcml2YXRlOgogICAgICAgICBUbXAgbGVmdFRtcCA9
IGxlZnQudG1wKCk7CiAgICAgICAgIFRtcCByaWdodFRtcCA9IHJpZ2h0LnRtcCgpOwogCi0gICAg
ICAgIHVuc2lnbmVkIGxlZnRJbmRleCA9IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0
ZUluZGV4KGxlZnRUbXApOwotICAgICAgICB1bnNpZ25lZCByaWdodEluZGV4ID0gQWJzb2x1dGVU
bXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgocmlnaHRUbXApOworICAgICAgICB1bnNpZ25l
ZCBsZWZ0SW5kZXggPSBUbXBNYXBwZXI6OmFic29sdXRlSW5kZXgobGVmdFRtcCk7CisgICAgICAg
IHVuc2lnbmVkIHJpZ2h0SW5kZXggPSBUbXBNYXBwZXI6OmFic29sdXRlSW5kZXgocmlnaHRUbXAp
OwogCiAgICAgICAgIHVuc2lnbmVkIG5leHRNb3ZlSW5kZXggPSBtX2NvYWxlc2NpbmdDYW5kaWRh
dGVzLnNpemUoKTsKICAgICAgICAgbV9jb2FsZXNjaW5nQ2FuZGlkYXRlcy5hcHBlbmQoeyBsZWZ0
SW5kZXgsIHJpZ2h0SW5kZXggfSk7CkBAIC05MDUsMTUgKzE1MTQsMTUgQEAgcHJpdmF0ZToKICAg
ICAgICAgdW5zaWduZWQgbmV3SW5kZXhJbldvcmtsaXN0ID0gbV93b3JrbGlzdE1vdmVzLmFkZExv
d1ByaW9yaXR5TW92ZSgpOwogICAgICAgICBBU1NFUlRfVU5VU0VEKG5ld0luZGV4SW5Xb3JrbGlz
dCwgbmV3SW5kZXhJbldvcmtsaXN0ID09IG5leHRNb3ZlSW5kZXgpOwogCi0gICAgICAgIEFTU0VS
VChuZXh0TW92ZUluZGV4IDw9IG1fYWN0aXZlTW92ZXMuc2l6ZSgpKTsKLSAgICAgICAgbV9hY3Rp
dmVNb3Zlcy5lbnN1cmVTaXplKG5leHRNb3ZlSW5kZXggKyAxKTsKLQogICAgICAgICBtX21vdmVM
aXN0W2xlZnRJbmRleF0uYWRkKG5leHRNb3ZlSW5kZXgpOwogICAgICAgICBtX21vdmVMaXN0W3Jp
Z2h0SW5kZXhdLmFkZChuZXh0TW92ZUluZGV4KTsKICAgICB9CiAKICAgICB2b2lkIGJ1aWxkKCkK
ICAgICB7CisgICAgICAgIG1fY29hbGVzY2luZ0NhbmRpZGF0ZXMuY2xlYXIoKTsKKyAgICAgICAg
bV93b3JrbGlzdE1vdmVzLmNsZWFyKCk7CisKICAgICAgICAgVG1wTGl2ZW5lc3M8dHlwZT4gbGl2
ZW5lc3MobV9jb2RlKTsKICAgICAgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6IG1fY29kZSkg
ewogICAgICAgICAgICAgdHlwZW5hbWUgVG1wTGl2ZW5lc3M8dHlwZT46OkxvY2FsQ2FsYyBsb2Nh
bENhbGMobGl2ZW5lc3MsIGJsb2NrKTsKQEAgLTkzMiw2ICsxNTQxLDcgQEAgcHJpdmF0ZToKICAg
ICB7CiAgICAgICAgIGlmICh0cmFjZURlYnVnKQogICAgICAgICAgICAgZGF0YUxvZygiQnVpbGRp
bmcgYmV0d2VlbiAiLCBwb2ludGVyRHVtcChwcmV2SW5zdCksICIgYW5kICIsIHBvaW50ZXJEdW1w
KG5leHRJbnN0KSwgIjpcbiIpOworCiAgICAgICAgIEluc3Q6OmZvckVhY2hEZWZXaXRoRXh0cmFD
bG9iYmVyZWRSZWdzPFRtcD4oCiAgICAgICAgICAgICBwcmV2SW5zdCwgbmV4dEluc3QsCiAgICAg
ICAgICAgICBbJl0gKGNvbnN0IFRtcCYgYXJnLCBBcmc6OlJvbGUsIEFyZzo6VHlwZSBhcmdUeXBl
LCBBcmc6OldpZHRoKSB7CkBAIC05NzEsMTYgKzE1ODEsMTUgQEAgcHJpdmF0ZToKICAgICAgICAg
ICAgIEFTU0VSVCh1c2VUbXApOwogCiAgICAgICAgICAgICB1bnNpZ25lZCBuZXh0TW92ZUluZGV4
ID0gbV9jb2FsZXNjaW5nQ2FuZGlkYXRlcy5zaXplKCk7Ci0gICAgICAgICAgICBtX2NvYWxlc2Np
bmdDYW5kaWRhdGVzLmFwcGVuZCh7IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUlu
ZGV4KHVzZVRtcCksIEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KGRlZlRt
cCkgfSk7CisgICAgICAgICAgICBtX2NvYWxlc2NpbmdDYW5kaWRhdGVzLmFwcGVuZCh7IFRtcE1h
cHBlcjo6YWJzb2x1dGVJbmRleCh1c2VUbXApLCBUbXBNYXBwZXI6OmFic29sdXRlSW5kZXgoZGVm
VG1wKSB9KTsKKyAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQorICAgICAgICAgICAgICAgIGRh
dGFMb2dMbigiTW92ZSBhdCBpbmRleCAiLCBuZXh0TW92ZUluZGV4LCAiIGlzOiAiLCAqcHJldklu
c3QpOwogCiAgICAgICAgICAgICB1bnNpZ25lZCBuZXdJbmRleEluV29ya2xpc3QgPSBtX3dvcmts
aXN0TW92ZXMuYWRkTW92ZSgpOwogICAgICAgICAgICAgQVNTRVJUX1VOVVNFRChuZXdJbmRleElu
V29ya2xpc3QsIG5ld0luZGV4SW5Xb3JrbGlzdCA9PSBuZXh0TW92ZUluZGV4KTsKIAotICAgICAg
ICAgICAgQVNTRVJUKG5leHRNb3ZlSW5kZXggPD0gbV9hY3RpdmVNb3Zlcy5zaXplKCkpOwotICAg
ICAgICAgICAgbV9hY3RpdmVNb3Zlcy5lbnN1cmVTaXplKG5leHRNb3ZlSW5kZXggKyAxKTsKLQog
ICAgICAgICAgICAgZm9yIChjb25zdCBBcmcmIGFyZyA6IHByZXZJbnN0LT5hcmdzKSB7Ci0gICAg
ICAgICAgICAgICAgYXV0byYgbGlzdCA9IG1fbW92ZUxpc3RbQWJzb2x1dGVUbXBNYXBwZXI8dHlw
ZT46OmFic29sdXRlSW5kZXgoYXJnLnRtcCgpKV07CisgICAgICAgICAgICAgICAgYXV0byYgbGlz
dCA9IG1fbW92ZUxpc3RbVG1wTWFwcGVyOjphYnNvbHV0ZUluZGV4KGFyZy50bXAoKSldOwogICAg
ICAgICAgICAgICAgIGxpc3QuYWRkKG5leHRNb3ZlSW5kZXgpOwogICAgICAgICAgICAgfQogCkBA
IC0xMDQzLDcgKzE2NTIsNyBAQCBwcml2YXRlOgogICAgICAgICAgICAgICAgIH0KIAogICAgICAg
ICAgICAgICAgIGlmICh0eXBlID09IEFyZzo6R1AgJiYgIWFyZy5pc0dQUigpKQotICAgICAgICAg
ICAgICAgICAgICBtX2ludGVyZmVyZXNXaXRoRnJhbWVQb2ludGVyLnF1aWNrU2V0KEFic29sdXRl
VG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KGFyZykpOworICAgICAgICAgICAgICAgICAg
ICBtX2ludGVyZmVyZXNXaXRoRnJhbWVQb2ludGVyLnF1aWNrU2V0KFRtcE1hcHBlcjo6YWJzb2x1
dGVJbmRleChhcmcpKTsKICAgICAgICAgICAgIH0pOwogICAgIH0KIApAQCAtMTA1MSw3ICsxNjYw
LDcgQEAgcHJpdmF0ZToKICAgICB7CiAgICAgICAgIEFTU0VSVF9XSVRIX01FU1NBR0UoYS5pc0dQ
KCkgPT0gYi5pc0dQKCksICJBbiBpbnRlcmZlcmVuY2UgYmV0d2VlbiByZWdpc3RlcnMgb2YgZGlm
ZmVyZW50IHR5cGVzIGRvZXMgbm90IG1ha2Ugc2Vuc2UsIGl0IGNhbiBsZWFkIHRvIG5vbi1jb2xv
cmFibGUgZ3JhcGhzLiIpOwogCi0gICAgICAgIGFkZEVkZ2UoQWJzb2x1dGVUbXBNYXBwZXI8dHlw
ZT46OmFic29sdXRlSW5kZXgoYSksIEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUlu
ZGV4KGIpKTsKKyAgICAgICAgYWRkRWRnZShUbXBNYXBwZXI6OmFic29sdXRlSW5kZXgoYSksIFRt
cE1hcHBlcjo6YWJzb2x1dGVJbmRleChiKSk7CiAgICAgfQogCiAgICAgLy8gQ2FsbGluZyB0aGlz
IHdpdGhvdXQgYSB0bXBXaWR0aCB3aWxsIHBlcmZvcm0gYSBtb3JlIGNvbnNlcnZhdGl2ZSBjb2Fs
ZXNjaW5nIGFuYWx5c2lzIHRoYXQgYXNzdW1lcwpAQCAtMTEwNiwxNzMgKzE3MTUsMjQgQEAgcHJp
dmF0ZToKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgdm9pZCBzZWxlY3RTcGls
bCgpCi0gICAgewotICAgICAgICBpZiAoIW1faGFzU2VsZWN0ZWRTcGlsbCkgewotICAgICAgICAg
ICAgbV9oYXNTZWxlY3RlZFNwaWxsID0gdHJ1ZTsKLQotICAgICAgICAgICAgaWYgKG1faGFzQ29h
bGVzY2VkTm9uVHJpdmlhbE1vdmUpCi0gICAgICAgICAgICAgICAgbV9jb2FsZXNjZWRUbXBzQXRT
cGlsbCA9IG1fY29hbGVzY2VkVG1wczsKLSAgICAgICAgfQotCi0gICAgICAgIGF1dG8gaXRlcmF0
b3IgPSBtX3NwaWxsV29ya2xpc3QuYmVnaW4oKTsKLQotICAgICAgICBSRUxFQVNFX0FTU0VSVF9X
SVRIX01FU1NBR0UoaXRlcmF0b3IgIT0gbV9zcGlsbFdvcmtsaXN0LmVuZCgpLCAic2VsZWN0U3Bp
bGwoKSBjYWxsZWQgd2hlbiB0aGVyZSB3YXMgbm8gc3BpbGwuIik7Ci0gICAgICAgIFJFTEVBU0Vf
QVNTRVJUX1dJVEhfTUVTU0FHRSghbV91bnNwaWxsYWJsZVRtcHMuY29udGFpbnMoKml0ZXJhdG9y
KSwgInRyeWluZyB0byBzcGlsbCB1bnNwaWxsYWJsZSB0bXAiKTsKLQotICAgICAgICAvLyBIaWdo
ZXIgc2NvcmUgbWVhbnMgbW9yZSBkZXNpcmFibGUgdG8gc3BpbGwuIExvd2VyIHNjb3JlcyBtYXhp
bWl6ZSB0aGUgbGlrZWxpaG9vZCB0aGF0IGEgdG1wCi0gICAgICAgIC8vIGdldHMgYSByZWdpc3Rl
ci4KLSAgICAgICAgYXV0byBzY29yZSA9IFsmXSAoVG1wIHRtcCkgLT4gZG91YmxlIHsKLSAgICAg
ICAgICAgIC8vIEFpciBleHBvc2VzIHRoZSBjb25jZXB0IG9mICJmYXN0IHRtcHMiLCBhbmQgd2Ug
aW50ZXJwcmV0IHRoYXQgdG8gbWVhbiB0aGF0IHRoZSB0bXAKLSAgICAgICAgICAgIC8vIHNob3Vs
ZCBhbHdheXMgYmUgaW4gYSByZWdpc3Rlci4KLSAgICAgICAgICAgIGlmIChtX2NvZGUuaXNGYXN0
VG1wKHRtcCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAKLSAgICAg
ICAgICAgIC8vIEFsbCBlbHNlIGJlaW5nIGVxdWFsLCB0aGUgc2NvcmUgc2hvdWxkIGJlIGRpcmVj
dGx5IHJlbGF0ZWQgdG8gdGhlIGRlZ3JlZS4KLSAgICAgICAgICAgIGRvdWJsZSBkZWdyZWUgPSBz
dGF0aWNfY2FzdDxkb3VibGU+KG1fZGVncmVlc1tBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJz
b2x1dGVJbmRleCh0bXApXSk7Ci0KLSAgICAgICAgICAgIC8vIEFsbCBlbHNlIGJlaW5nIGVxdWFs
LCB0aGUgc2NvcmUgc2hvdWxkIGJlIGludmVyc2VseSByZWxhdGVkIHRvIHRoZSBudW1iZXIgb2Yg
d2FybSB1c2VzIGFuZAotICAgICAgICAgICAgLy8gZGVmcy4KLSAgICAgICAgICAgIGNvbnN0IFVz
ZUNvdW50czxUbXA+OjpDb3VudHMqIGNvdW50cyA9IG1fdXNlQ291bnRzW3RtcF07Ci0gICAgICAg
ICAgICBpZiAoIWNvdW50cykKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xp
bWl0czxkb3VibGU+OjppbmZpbml0eSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBkb3Vi
bGUgdXNlcyA9IGNvdW50cy0+bnVtV2FybVVzZXMgKyBjb3VudHMtPm51bURlZnM7Ci0KLSAgICAg
ICAgICAgIC8vIElmIGl0J3MgYSBjb25zdGFudCwgdGhlbiBpdCdzIG5vdCBhcyBiYWQgdG8gc3Bp
bGwuIFdlIGNhbiByZW1hdGVyaWFsaXplIGl0IGluIG1hbnkKLSAgICAgICAgICAgIC8vIGNhc2Vz
LgotICAgICAgICAgICAgaWYgKGNvdW50cy0+bnVtQ29uc3REZWZzID09IDEgJiYgY291bnRzLT5u
dW1EZWZzID09IDEpCi0gICAgICAgICAgICAgICAgdXNlcyAvPSAyOwotCi0gICAgICAgICAgICBy
ZXR1cm4gZGVncmVlIC8gdXNlczsKLSAgICAgICAgfTsKLQotICAgICAgICBhdXRvIHZpY3RpbUl0
ZXJhdG9yID0gaXRlcmF0b3I7Ci0gICAgICAgIGRvdWJsZSBtYXhTY29yZSA9IHNjb3JlKEFic29s
dXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleCgqaXRlcmF0b3IpKTsKLQot
ICAgICAgICArK2l0ZXJhdG9yOwotICAgICAgICBmb3IgKDtpdGVyYXRvciAhPSBtX3NwaWxsV29y
a2xpc3QuZW5kKCk7ICsraXRlcmF0b3IpIHsKLSAgICAgICAgICAgIGRvdWJsZSB0bXBTY29yZSA9
IHNjb3JlKEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleCgqaXRl
cmF0b3IpKTsKLSAgICAgICAgICAgIGlmICh0bXBTY29yZSA+IG1heFNjb3JlKSB7Ci0gICAgICAg
ICAgICAgICAgQVNTRVJUKCFtX3Vuc3BpbGxhYmxlVG1wcy5jb250YWlucygqaXRlcmF0b3IpKTsK
LSAgICAgICAgICAgICAgICB2aWN0aW1JdGVyYXRvciA9IGl0ZXJhdG9yOwotICAgICAgICAgICAg
ICAgIG1heFNjb3JlID0gdG1wU2NvcmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAg
ICAgICB1bnNpZ25lZCB2aWN0aW1JbmRleCA9ICp2aWN0aW1JdGVyYXRvcjsKLSAgICAgICAgbV9z
cGlsbFdvcmtsaXN0LnJlbW92ZSh2aWN0aW1JdGVyYXRvcik7Ci0gICAgICAgIG1fc2ltcGxpZnlX
b3JrbGlzdC5hcHBlbmQodmljdGltSW5kZXgpOwotCi0gICAgICAgIGZyZWV6ZU1vdmVzKHZpY3Rp
bUluZGV4KTsKLSAgICB9Ci0KLSAgICB2b2lkIGFsbG9jYXRlKCkKLSAgICB7Ci0gICAgICAgIEFT
U0VSVF9XSVRIX01FU1NBR0UobV9hY3RpdmVNb3Zlcy5zaXplKCkgPj0gbV9jb2FsZXNjaW5nQ2Fu
ZGlkYXRlcy5zaXplKCksICJUaGUgYWN0aXZlTW92ZSBzZXQgc2hvdWxkIGJlIGJpZyBlbm91Z2gg
Zm9yIHRoZSBxdWljayBvcGVyYXRpb25zIG9mIEJpdFZlY3Rvci4iKTsKLQotICAgICAgICBtYWtl
V29ya0xpc3QoKTsKLQotICAgICAgICBpZiAoZGVidWcpIHsKLSAgICAgICAgICAgIGRhdGFMb2co
IkludGVyZmVyZW5jZTogIiwgbGlzdER1bXAobV9pbnRlcmZlcmVuY2VFZGdlcyksICJcbiIpOwot
ICAgICAgICAgICAgZHVtcEludGVyZmVyZW5jZUdyYXBoSW5Eb3QoV1RGOjpkYXRhRmlsZSgpKTsK
LSAgICAgICAgICAgIGRhdGFMb2coIkNvYWxlc2NpbmcgY2FuZGlkYXRlczpcbiIpOwotICAgICAg
ICAgICAgZm9yIChNb3ZlT3BlcmFuZHMmIG1vdmVPcCA6IG1fY29hbGVzY2luZ0NhbmRpZGF0ZXMp
IHsKLSAgICAgICAgICAgICAgICBkYXRhTG9nKCIgICAgIiwgQWJzb2x1dGVUbXBNYXBwZXI8dHlw
ZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KG1vdmVPcC5zcmNJbmRleCksCi0gICAgICAgICAgICAg
ICAgICAgICIgLT4gIiwgQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUlu
ZGV4KG1vdmVPcC5kc3RJbmRleCksICJcbiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAg
ZGF0YUxvZygiSW5pdGlhbCB3b3JrIGxpc3RcbiIpOwotICAgICAgICAgICAgZHVtcFdvcmtMaXN0
cyhXVEY6OmRhdGFGaWxlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZG8gewotICAgICAgICAg
ICAgaWYgKHRyYWNlRGVidWcpIHsKLSAgICAgICAgICAgICAgICBkYXRhTG9nKCJCZWZvcmUgR3Jh
cGggc2ltcGxpZmljYXRpb24gaXRlcmF0aW9uXG4iKTsKLSAgICAgICAgICAgICAgICBkdW1wV29y
a0xpc3RzKFdURjo6ZGF0YUZpbGUoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlm
ICghbV9zaW1wbGlmeVdvcmtsaXN0LmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICBzaW1wbGlm
eSgpOwotICAgICAgICAgICAgZWxzZSBpZiAoIW1fd29ya2xpc3RNb3Zlcy5pc0VtcHR5KCkpCi0g
ICAgICAgICAgICAgICAgY29hbGVzY2UoKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKCFtX2ZyZWV6
ZVdvcmtsaXN0LmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICBmcmVlemUoKTsKLSAgICAgICAg
ICAgIGVsc2UgaWYgKCFtX3NwaWxsV29ya2xpc3QuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAg
IHNlbGVjdFNwaWxsKCk7Ci0KLSAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKSB7Ci0gICAgICAg
ICAgICAgICAgZGF0YUxvZygiQWZ0ZXIgR3JhcGggc2ltcGxpZmljYXRpb24gaXRlcmF0aW9uXG4i
KTsKLSAgICAgICAgICAgICAgICBkdW1wV29ya0xpc3RzKFdURjo6ZGF0YUZpbGUoKSk7Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUgKCFtX3NpbXBsaWZ5V29ya2xpc3QuaXNFbXB0eSgp
IHx8ICFtX3dvcmtsaXN0TW92ZXMuaXNFbXB0eSgpIHx8ICFtX2ZyZWV6ZVdvcmtsaXN0LmlzRW1w
dHkoKSB8fCAhbV9zcGlsbFdvcmtsaXN0LmlzRW1wdHkoKSk7Ci0KLSAgICAgICAgYXNzaWduQ29s
b3JzKCk7Ci0gICAgfQotCi0jaWYgUExBVEZPUk0oQ09DT0EpCi0jcHJhZ21hIG1hcmsgLSBEZWJ1
Z2dpbmcgaGVscGVycy4KLSNlbmRpZgotCi0gICAgdm9pZCBkdW1wSW50ZXJmZXJlbmNlR3JhcGhJ
bkRvdChQcmludFN0cmVhbSYgb3V0KQotICAgIHsKLSAgICAgICAgb3V0LnByaW50KCJncmFwaCBJ
bnRlcmZlcmVuY2VHcmFwaCB7IFxuIik7Ci0KLSAgICAgICAgSGFzaFNldDxUbXA+IHRtcHNXaXRo
SW50ZXJmZXJlbmNlczsKLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiBlZGdlIDogbV9pbnRlcmZl
cmVuY2VFZGdlcykgewotICAgICAgICAgICAgdG1wc1dpdGhJbnRlcmZlcmVuY2VzLmFkZChBYnNv
bHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgoZWRnZS5maXJzdCgpKSk7
Ci0gICAgICAgICAgICB0bXBzV2l0aEludGVyZmVyZW5jZXMuYWRkKEFic29sdXRlVG1wTWFwcGVy
PHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleChlZGdlLnNlY29uZCgpKSk7Ci0gICAgICAgIH0K
LQotICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHRtcCA6IHRtcHNXaXRoSW50ZXJmZXJlbmNlcykg
ewotICAgICAgICAgICAgdW5zaWduZWQgdG1wSW5kZXggPSBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBl
Pjo6YWJzb2x1dGVJbmRleCh0bXApOwotICAgICAgICAgICAgaWYgKHRtcEluZGV4IDwgbV9kZWdy
ZWVzLnNpemUoKSkKLSAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiAgICAiLCB0bXAuaW50ZXJu
YWxWYWx1ZSgpLCAiIFtsYWJlbD1cIiIsIHRtcCwgIiAoIiwgbV9kZWdyZWVzW3RtcEluZGV4XSwg
IilcIl07XG4iKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBvdXQucHJpbnQo
IiAgICAiLCB0bXAuaW50ZXJuYWxWYWx1ZSgpLCAiIFtsYWJlbD1cIiIsIHRtcCwgIlwiXTtcbiIp
OwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiBlZGdlIDogbV9pbnRlcmZl
cmVuY2VFZGdlcykKLSAgICAgICAgICAgIG91dC5wcmludCgiICAgICIsIGVkZ2UuZmlyc3QoKSwg
IiAtLSAiLCBlZGdlLnNlY29uZCgpLCAiO1xuIik7Ci0gICAgICAgIG91dC5wcmludCgifVxuIik7
Ci0gICAgfQotCi0gICAgdm9pZCBkdW1wV29ya0xpc3RzKFByaW50U3RyZWFtJiBvdXQpCi0gICAg
ewotICAgICAgICBvdXQucHJpbnQoIlNpbXBsaWZ5IHdvcmsgbGlzdDpcbiIpOwotICAgICAgICBm
b3IgKHVuc2lnbmVkIHRtcEluZGV4IDogbV9zaW1wbGlmeVdvcmtsaXN0KQotICAgICAgICAgICAg
b3V0LnByaW50KCIgICAgIiwgQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0
ZUluZGV4KHRtcEluZGV4KSwgIlxuIik7Ci0gICAgICAgIG91dC5wcmludGYoIk1vdmVzIHdvcmsg
bGlzdCBpcyBlbXB0eT8gJWRcbiIsIG1fd29ya2xpc3RNb3Zlcy5pc0VtcHR5KCkpOwotICAgICAg
ICBvdXQucHJpbnQoIkZyZWV6ZSB3b3JrIGxpc3Q6XG4iKTsKLSAgICAgICAgZm9yICh1bnNpZ25l
ZCB0bXBJbmRleCA6IG1fZnJlZXplV29ya2xpc3QpCi0gICAgICAgICAgICBvdXQucHJpbnQoIiAg
ICAiLCBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgodG1wSW5k
ZXgpLCAiXG4iKTsKLSAgICAgICAgb3V0LnByaW50KCJTcGlsbCB3b3JrIGxpc3Q6XG4iKTsKLSAg
ICAgICAgZm9yICh1bnNpZ25lZCB0bXBJbmRleCA6IG1fc3BpbGxXb3JrbGlzdCkKLSAgICAgICAg
ICAgIG91dC5wcmludCgiICAgICIsIEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJz
b2x1dGVJbmRleCh0bXBJbmRleCksICJcbiIpOwotICAgIH0KLQotICAgIHVzaW5nIEFic3RyYWN0
Q29sb3JpbmdBbGxvY2F0b3I8dW5zaWduZWQ+OjphZGRFZGdlOwotICAgIHVzaW5nIEFic3RyYWN0
Q29sb3JpbmdBbGxvY2F0b3I8dW5zaWduZWQ+OjpnZXRBbGlhczsKLQotICAgIENvZGUmIG1fY29k
ZTsKICAgICBUbXBXaWR0aCYgbV90bXBXaWR0aDsKLSAgICAvLyBGSVhNRTogc3BpbGxpbmcgc2hv
dWxkIG5vdCB0eXBlIHNwZWNpZmljLiBJdCBpcyBvbmx5IGEgc2lkZSBlZmZlY3Qgb2YgdXNpbmcg
VXNlQ291bnRzLgotICAgIGNvbnN0IFVzZUNvdW50czxUbXA+JiBtX3VzZUNvdW50czsKIH07CiAK
LWNsYXNzIEl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nIHsKK2NsYXNzIEdyYXBoQ29sb3JpbmdS
ZWdpc3RlckFsbG9jYXRpb24gewogcHVibGljOgotICAgIEl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNj
aW5nKENvZGUmIGNvZGUpCisgICAgR3JhcGhDb2xvcmluZ1JlZ2lzdGVyQWxsb2NhdGlvbihDb2Rl
JiBjb2RlLCBVc2VDb3VudHM8VG1wPiYgdXNlQ291bnRzKQogICAgICAgICA6IG1fY29kZShjb2Rl
KQotICAgICAgICAsIG1fdXNlQ291bnRzKGNvZGUpCisgICAgICAgICwgbV91c2VDb3VudHModXNl
Q291bnRzKQogICAgIHsKICAgICB9CiAKICAgICB2b2lkIHJ1bigpCiAgICAgewogICAgICAgICBw
YWRJbnRlcmZlcmVuY2UobV9jb2RlKTsKLSAgICAgICAgCi0gICAgICAgIGl0ZXJhdGVkUmVnaXN0
ZXJDb2FsZXNjaW5nT25UeXBlPEFyZzo6R1A+KCk7Ci0gICAgICAgIGl0ZXJhdGVkUmVnaXN0ZXJD
b2FsZXNjaW5nT25UeXBlPEFyZzo6RlA+KCk7CisKKyAgICAgICAgYWxsb2NhdGVPblR5cGU8QXJn
OjpHUD4oKTsKKyAgICAgICAgbV9udW1JdGVyYXRpb25zID0gMDsKKyAgICAgICAgYWxsb2NhdGVP
blR5cGU8QXJnOjpGUD4oKTsKIAogICAgICAgICBmaXhTcGlsbHNBZnRlclRlcm1pbmFscygpOwog
CkBAIC0xMjgyLDcgKzE3NDIsNyBAQCBwdWJsaWM6CiAKIHByaXZhdGU6CiAgICAgdGVtcGxhdGU8
QXJnOjpUeXBlIHR5cGU+Ci0gICAgdm9pZCBpdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZ09uVHlw
ZSgpCisgICAgdm9pZCBhbGxvY2F0ZU9uVHlwZSgpCiAgICAgewogICAgICAgICBIYXNoU2V0PHVu
c2lnbmVkPiB1bnNwaWxsYWJsZVRtcHMgPSBjb21wdXRlVW5zcGlsbGFibGVUbXBzPHR5cGU+KCk7
CiAKQEAgLTEzMTEsMjIgKzE3NzEsMzggQEAgcHJpdmF0ZToKICAgICAgICAgICAgIC8vIHJlY29t
cHV0YXRpb24sIGluIHdoaWNoIGNhc2Ugc3BlZWRpbmcgdXAgdGhlIGxvb2t1cCB3b3VsZCBiZSBh
IGJpZ2dlciB3aW4uCiAgICAgICAgICAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9MTUyNDc4CiAgICAgICAgICAgICBtX3RtcFdpZHRoLnJlY29tcHV0ZShtX2Nv
ZGUpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBDb2xvcmluZ0FsbG9jYXRvcjx0eXBlPiBh
bGxvY2F0b3IobV9jb2RlLCBtX3RtcFdpZHRoLCBtX3VzZUNvdW50cywgdW5zcGlsbGFibGVUbXBz
KTsKLSAgICAgICAgICAgIGlmICghYWxsb2NhdG9yLnJlcXVpcmVzU3BpbGxpbmcoKSkgewotICAg
ICAgICAgICAgICAgIGFzc2lnblJlZ2lzdGVyc1RvVG1wKGFsbG9jYXRvcik7Ci0gICAgICAgICAg
ICAgICAgaWYgKHRyYWNlRGVidWcpCi0gICAgICAgICAgICAgICAgICAgIGRhdGFMb2coIlN1Y2Nl
c3NmdWxsIGFsbG9jYXRpb24gYXQgaXRlcmF0aW9uICIsIG1fbnVtSXRlcmF0aW9ucywgIjpcbiIs
IG1fY29kZSk7CiAKLSAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBhdXRvIGRv
QWxsb2NhdGlvbiA9IFsmXSAoYXV0byYgYWxsb2NhdG9yKSAtPiBib29sIHsKKyAgICAgICAgICAg
ICAgICBhbGxvY2F0b3IuYWxsb2NhdGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWFsbG9jYXRv
ci5yZXF1aXJlc1NwaWxsaW5nKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy0+YXNzaWdu
UmVnaXN0ZXJzVG9UbXA8dHlwZT4oYWxsb2NhdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgaWYg
KHRyYWNlRGVidWcpCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhTG9nKCJTdWNjZXNzZnVs
bCBhbGxvY2F0aW9uIGF0IGl0ZXJhdGlvbiAiLCBtX251bUl0ZXJhdGlvbnMsICI6XG4iLCBtX2Nv
ZGUpOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgICAgIHRoaXMtPmFkZFNwaWxsQW5kRmlsbDx0eXBlPihhbGxvY2F0
b3IsIHVuc3BpbGxhYmxlVG1wcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgICAgICAgfTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYm9vbCBkb25lOworICAgICAg
ICAgICAgaWYgKChpc0FSTTY0KCkgfHwgT3B0aW9uczo6YWlyRm9yY2VCcmlnZ3NBbGxvY2F0b3Io
KSkgJiYgIU9wdGlvbnM6OmFpckZvcmNlSVJDQWxsb2NhdG9yKCkpIHsKKyAgICAgICAgICAgICAg
ICBDb2xvcmluZ0FsbG9jYXRvcjx0eXBlLCBCcmlnZ3M+IGFsbG9jYXRvcihtX2NvZGUsIG1fdG1w
V2lkdGgsIG1fdXNlQ291bnRzLCB1bnNwaWxsYWJsZVRtcHMpOworICAgICAgICAgICAgICAgIGRv
bmUgPSBkb0FsbG9jYXRpb24oYWxsb2NhdG9yKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAg
ICAgICAgICAgICAgQ29sb3JpbmdBbGxvY2F0b3I8dHlwZSwgSVJDPiBhbGxvY2F0b3IobV9jb2Rl
LCBtX3RtcFdpZHRoLCBtX3VzZUNvdW50cywgdW5zcGlsbGFibGVUbXBzKTsKKyAgICAgICAgICAg
ICAgICBkb25lID0gZG9BbGxvY2F0aW9uKGFsbG9jYXRvcik7CiAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICBhZGRTcGlsbEFuZEZpbGw8dHlwZT4oYWxsb2NhdG9yLCB1bnNwaWxsYWJsZVRtcHMp
OworICAgICAgICAgICAgaWYgKGRvbmUpCisgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAg
ICB9CiAgICAgfQogCiAgICAgdGVtcGxhdGU8QXJnOjpUeXBlIHR5cGU+CiAgICAgSGFzaFNldDx1
bnNpZ25lZD4gY29tcHV0ZVVuc3BpbGxhYmxlVG1wcygpCiAgICAgeworCiAgICAgICAgIEhhc2hT
ZXQ8dW5zaWduZWQ+IHVuc3BpbGxhYmxlVG1wczsKIAogICAgICAgICBzdHJ1Y3QgUmFuZ2UgewpA
QCAtMTM5MCw4ICsxODY2LDggQEAgcHJpdmF0ZToKICAgICAgICAgcmV0dXJuIHVuc3BpbGxhYmxl
VG1wczsKICAgICB9CiAKLSAgICB0ZW1wbGF0ZTxBcmc6OlR5cGUgdHlwZT4KLSAgICB2b2lkIGFz
c2lnblJlZ2lzdGVyc1RvVG1wKGNvbnN0IENvbG9yaW5nQWxsb2NhdG9yPHR5cGU+JiBhbGxvY2F0
b3IpCisgICAgdGVtcGxhdGU8QXJnOjpUeXBlIHR5cGUsIHR5cGVuYW1lIEFsbG9jYXRvclR5cGU+
CisgICAgdm9pZCBhc3NpZ25SZWdpc3RlcnNUb1RtcChjb25zdCBBbGxvY2F0b3JUeXBlJiBhbGxv
Y2F0b3IpCiAgICAgewogICAgICAgICBmb3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogbV9jb2RlKSB7
CiAgICAgICAgICAgICAvLyBHaXZlIFRtcCBhIHZhbGlkIHJlZ2lzdGVyLgpAQCAtMTQ0Nyw4ICsx
OTIzLDggQEAgcHJpdmF0ZToKICAgICAgICAgcmV0dXJuIHdpZHRoIDw9IEFyZzo6V2lkdGgzMiA/
IDQgOiA4OwogICAgIH0KIAotICAgIHRlbXBsYXRlPEFyZzo6VHlwZSB0eXBlPgotICAgIHZvaWQg
YWRkU3BpbGxBbmRGaWxsKGNvbnN0IENvbG9yaW5nQWxsb2NhdG9yPHR5cGU+JiBhbGxvY2F0b3Is
IEhhc2hTZXQ8dW5zaWduZWQ+JiB1bnNwaWxsYWJsZVRtcHMpCisgICAgdGVtcGxhdGU8QXJnOjpU
eXBlIHR5cGUsIHR5cGVuYW1lIEFsbG9jYXRvclR5cGU+CisgICAgdm9pZCBhZGRTcGlsbEFuZEZp
bGwoY29uc3QgQWxsb2NhdG9yVHlwZSYgYWxsb2NhdG9yLCBIYXNoU2V0PHVuc2lnbmVkPiYgdW5z
cGlsbGFibGVUbXBzKQogICAgIHsKICAgICAgICAgSGFzaE1hcDxUbXAsIFN0YWNrU2xvdCo+IHN0
YWNrU2xvdHM7CiAgICAgICAgIGZvciAoVG1wIHRtcCA6IGFsbG9jYXRvci5zcGlsbGVkVG1wcygp
KSB7CkBAIC0xNjM3LDE4ICsyMTEzLDE5IEBAIHByaXZhdGU6CiAKICAgICBDb2RlJiBtX2NvZGU7
CiAgICAgVG1wV2lkdGggbV90bXBXaWR0aDsKLSAgICBVc2VDb3VudHM8VG1wPiBtX3VzZUNvdW50
czsKKyAgICBVc2VDb3VudHM8VG1wPiYgbV91c2VDb3VudHM7CiAgICAgdW5zaWduZWQgbV9udW1J
dGVyYXRpb25zIHsgMCB9OwogfTsKIAogfSAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCiAKLXZvaWQg
aXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcoQ29kZSYgY29kZSkKK3ZvaWQgYWxsb2NhdGVSZWdp
c3RlcnNCeUdyYXBoQ29sb3JpbmcoQ29kZSYgY29kZSkKIHsKLSAgICBQaGFzZVNjb3BlIHBoYXNl
U2NvcGUoY29kZSwgIml0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nIik7Ci0gICAgCi0gICAgSXRl
cmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcgaXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcoY29kZSk7
Ci0gICAgaXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcucnVuKCk7CisgICAgUGhhc2VTY29wZSBw
aGFzZVNjb3BlKGNvZGUsICJBaXI6OmFsbG9jYXRlUmVnaXN0ZXJzQnlHcmFwaENvbG9yaW5nIik7
CisKKyAgICBVc2VDb3VudHM8VG1wPiB1c2VDb3VudHMoY29kZSk7CisgICAgR3JhcGhDb2xvcmlu
Z1JlZ2lzdGVyQWxsb2NhdGlvbiBncmFwaENvbG9yaW5nUmVnaXN0ZXJBbGxvY2F0aW9uKGNvZGUs
IHVzZUNvdW50cyk7CisgICAgZ3JhcGhDb2xvcmluZ1JlZ2lzdGVyQWxsb2NhdGlvbi5ydW4oKTsK
IH0KIAogfSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgpJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL2IzL2Fpci9BaXJHcmFwaENvbG9yaW5nLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJHcmFwaENvbG9yaW5nLmgJKHJldmlzaW9uIDIxMjc5
NykJKGZyb20gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJJdGVyYXRlZFJlZ2lzdGVy
Q29hbGVzY2luZy5oOjIxMjc5NykKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWly
R3JhcGhDb2xvcmluZy5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2lm
IEVOQUJMRShCM19KSVQpCisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3Bh
Y2UgQWlyIHsKKworY2xhc3MgQ29kZTsKKworLy8gVGhpcyBpcyBhIHJlZ2lzdGVyIGFsbG9jYXRp
b24gcGhhc2UgYmFzZWQgb24gQW5kcmV3IEFwcGVsJ3MgSXRlcmF0ZWQgUmVnaXN0ZXIgQ29hbGVz
Y2luZworLy8gaHR0cDovL3d3dy5jcy5jbXUuZWR1L2Fmcy9jcy9hY2FkZW1pYy9jbGFzcy8xNTc0
NS1zMDcvd3d3L3BhcGVycy9nZW9yZ2UucGRmCit2b2lkIGl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNj
aW5nKENvZGUmKTsKKworfSB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgorCisjZW5kaWYg
Ly8gRU5BQkxFKEIzX0pJVCkKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWly
R3JhcGhDb2xvcmluZy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9h
aXIvQWlyR3JhcGhDb2xvcmluZy5oCShyZXZpc2lvbiAyMTI3OTcpCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvYWlyL0FpckdyYXBoQ29sb3JpbmcuaAkod29ya2luZyBjb3B5KQpAQCAtMSw1
ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTcgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0zMSw5ICsz
MSwxNiBAQCBuYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlCiAKIGNsYXNz
IENvZGU7CiAKLS8vIFRoaXMgaXMgYSByZWdpc3RlciBhbGxvY2F0aW9uIHBoYXNlIGJhc2VkIG9u
IEFuZHJldyBBcHBlbCdzIEl0ZXJhdGVkIFJlZ2lzdGVyIENvYWxlc2NpbmcKKy8vIFdlIGhhdmUg
dHdvIHJlZ2lzdGVyIGFsbG9jYXRvcnMsIGJvdGggZnVuZGFtZW50YWxseSBkZXJpdmVkIGZyb20g
Q2hhaXRpbidzIFlvcmt0b3duCisvLyBhbGxvY2F0b3I6CisvLyBodHRwOi8vY3MuZ211LmVkdS9+
d2hpdGUvQ1M2NDAvcDk4LWNoYWl0aW4ucGRmCisvLworLy8gV2UgaGF2ZSBhbiBpbXBsZW1lbnRh
dGlvbiBvZiBCcmlnZ3MncyBvcHRpbWlzdGljIGFsbG9jYXRvciB3aGljaCBpcyBkZXJpdmF0aXZl
IG9mIENoYWl0aW4ncyBhbGxvY2F0b3I6CisvLyBodHRwOi8vd3d3LmNzLnV0ZXhhcy5lZHUvdXNl
cnMvbWNraW5sZXkvMzgwQy9sZWNzL2JyaWdncy10aGVzaXMtMTk5Mi5wZGYKKy8vCisvLyBBbmQg
YW4gaW1wbGVtZW50YXRpb24gb2YgQW5kcmV3IEFwcGVsJ3MgSXRlcmF0ZWQgUmVnaXN0ZXIgQ29h
bGVzY2luZyB3aGljaCBpcyBkZXJpdmF0aXZlIG9mIEJyaWdncydzIGFsbG9jYXRvci4KIC8vIGh0
dHA6Ly93d3cuY3MuY211LmVkdS9hZnMvY3MvYWNhZGVtaWMvY2xhc3MvMTU3NDUtczA3L3d3dy9w
YXBlcnMvZ2VvcmdlLnBkZgotdm9pZCBpdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZyhDb2RlJik7
Cit2b2lkIGFsbG9jYXRlUmVnaXN0ZXJzQnlHcmFwaENvbG9yaW5nKENvZGUmKTsKIAogfSB9IH0g
Ly8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgogCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvYWlyL0Fpckl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpckl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5n
LmNwcAkocmV2aXNpb24gMjEyNzk3KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9B
aXJJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5jcHAJKG5vbmV4aXN0ZW50KQpAQCAtMSwxNjU2
ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNyBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBt
ZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
SU5DLiBPUgotICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi0gKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLSAq
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkKLSAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICov
Ci0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJBaXJJdGVyYXRlZFJlZ2lzdGVyQ29h
bGVzY2luZy5oIgotCi0jaWYgRU5BQkxFKEIzX0pJVCkKLQotI2luY2x1ZGUgIkFpckNvZGUuaCIK
LSNpbmNsdWRlICJBaXJJbnNlcnRpb25TZXQuaCIKLSNpbmNsdWRlICJBaXJJbnN0SW5saW5lcy5o
IgotI2luY2x1ZGUgIkFpckxpdmVuZXNzLmgiCi0jaW5jbHVkZSAiQWlyUGFkSW50ZXJmZXJlbmNl
LmgiCi0jaW5jbHVkZSAiQWlyUGhhc2VTY29wZS5oIgotI2luY2x1ZGUgIkFpclRtcElubGluZXMu
aCIKLSNpbmNsdWRlICJBaXJUbXBXaWR0aC5oIgotI2luY2x1ZGUgIkFpclVzZUNvdW50cy5oIgot
I2luY2x1ZGUgPHd0Zi9MaXN0RHVtcC5oPgotCi1uYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIz
IHsgbmFtZXNwYWNlIEFpciB7Ci0KLW5hbWVzcGFjZSB7Ci0KLWJvb2wgZGVidWcgPSBmYWxzZTsK
LWJvb2wgdHJhY2VEZWJ1ZyA9IGZhbHNlOwotYm9vbCByZXBvcnRTdGF0cyA9IGZhbHNlOwotCi0v
LyBUaGUgQWJzdHJhY3RDb2xvcmluZ0FsbG9jYXRvciBkZWZpbmVzIGFsbCB0aGUgY29kZSB0aGF0
IGlzIGluZGVwZW5kYW50Ci0vLyBmcm9tIHRoZSB0eXBlIG9yIHJlZ2lzdGVyIGFuZCBjYW4gYmUg
c2hhcmVkIHdoZW4gYWxsb2NhdGluZyByZWdpc3RlcnMuCi10ZW1wbGF0ZTx0eXBlbmFtZSBJbmRl
eFR5cGU+Ci1jbGFzcyBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yIHsKLXB1YmxpYzoKLSAgICBB
YnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yKGNvbnN0IFZlY3RvcjxSZWc+JiByZWdzSW5Qcmlvcml0
eU9yZGVyLCBJbmRleFR5cGUgbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4LCB1bnNpZ25lZCB0
bXBBcnJheVNpemUsIGNvbnN0IEhhc2hTZXQ8dW5zaWduZWQ+JiB1bnNwaWxsYWJsZVRtcCkKLSAg
ICAgICAgOiBtX3JlZ3NJblByaW9yaXR5T3JkZXIocmVnc0luUHJpb3JpdHlPcmRlcikKLSAgICAg
ICAgLCBtX2xhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleChsYXN0UHJlY29sb3JlZFJlZ2lzdGVy
SW5kZXgpCi0gICAgICAgICwgbV91bnNwaWxsYWJsZVRtcHModW5zcGlsbGFibGVUbXApCi0gICAg
ewotICAgICAgICBmb3IgKFJlZyByZWcgOiBtX3JlZ3NJblByaW9yaXR5T3JkZXIpCi0gICAgICAg
ICAgICBtX211dGFibGVSZWdzLnNldChyZWcpOwotICAgICAgICAKLSAgICAgICAgaW5pdGlhbGl6
ZURlZ3JlZXModG1wQXJyYXlTaXplKTsKLSAgICAgICAgCi0gICAgICAgIG1fYWRqYWNlbmN5TGlz
dC5yZXNpemUodG1wQXJyYXlTaXplKTsKLSAgICAgICAgbV9tb3ZlTGlzdC5yZXNpemUodG1wQXJy
YXlTaXplKTsKLSAgICAgICAgbV9jb2FsZXNjZWRUbXBzLmZpbGwoMCwgdG1wQXJyYXlTaXplKTsK
LSAgICAgICAgbV9pc09uU2VsZWN0U3RhY2suZW5zdXJlU2l6ZSh0bXBBcnJheVNpemUpOwotICAg
IH0KLQotcHJvdGVjdGVkOgotICAgIEluZGV4VHlwZSBnZXRBbGlhcyhJbmRleFR5cGUgdG1wSW5k
ZXgpIGNvbnN0Ci0gICAgewotICAgICAgICBJbmRleFR5cGUgYWxpYXMgPSB0bXBJbmRleDsKLSAg
ICAgICAgd2hpbGUgKEluZGV4VHlwZSBuZXh0QWxpYXMgPSBtX2NvYWxlc2NlZFRtcHNbYWxpYXNd
KQotICAgICAgICAgICAgYWxpYXMgPSBuZXh0QWxpYXM7Ci0gICAgICAgIHJldHVybiBhbGlhczsK
LSAgICB9Ci0KLSAgICB2b2lkIGFkZEVkZ2UoSW5kZXhUeXBlIGEsIEluZGV4VHlwZSBiKQotICAg
IHsKLSAgICAgICAgaWYgKGEgPT0gYikKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgYWRk
RWRnZURpc3RpbmN0KGEsIGIpOwotICAgIH0KLQotICAgIHZvaWQgbWFrZVdvcmtMaXN0KCkKLSAg
ICB7Ci0gICAgICAgIEluZGV4VHlwZSBmaXJzdE5vblJlZ0luZGV4ID0gbV9sYXN0UHJlY29sb3Jl
ZFJlZ2lzdGVySW5kZXggKyAxOwotICAgICAgICBmb3IgKEluZGV4VHlwZSBpID0gZmlyc3ROb25S
ZWdJbmRleDsgaSA8IG1fZGVncmVlcy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgdW5zaWdu
ZWQgZGVncmVlID0gbV9kZWdyZWVzW2ldOwotICAgICAgICAgICAgaWYgKGRlZ3JlZSA+PSBtX3Jl
Z3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpKQotICAgICAgICAgICAgICAgIGFkZFRvU3BpbGwoaSk7
Ci0gICAgICAgICAgICBlbHNlIGlmICghbV9tb3ZlTGlzdFtpXS5pc0VtcHR5KCkpCi0gICAgICAg
ICAgICAgICAgbV9mcmVlemVXb3JrbGlzdC5hZGQoaSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAg
ICAgICAgICAgICAgbV9zaW1wbGlmeVdvcmtsaXN0LmFwcGVuZChpKTsKLSAgICAgICAgfQotICAg
IH0KLQotICAgIHZvaWQgYWRkVG9TcGlsbCh1bnNpZ25lZCB0b1NwaWxsKQotICAgIHsKLSAgICAg
ICAgaWYgKG1fdW5zcGlsbGFibGVUbXBzLmNvbnRhaW5zKHRvU3BpbGwpKQotICAgICAgICAgICAg
cmV0dXJuOwotCi0gICAgICAgIG1fc3BpbGxXb3JrbGlzdC5hZGQodG9TcGlsbCk7Ci0gICAgfQot
Ci0gICAgLy8gTG93LWRlZ3JlZSB2ZXJ0ZXggY2FuIGFsd2F5cyBiZSBjb2xvcmVkOiBqdXN0IHBp
Y2sgYW55IG9mIHRoZSBjb2xvciB0YWtlbiBieSBhbnkKLSAgICAvLyBvdGhlciBhZGphY2VudCB2
ZXJpY2VzLgotICAgIC8vIFRoZSAiU2ltcGxpZnkiIHBoYXNlIHRha2VzIGEgbG93LWRlZ3JlZSBv
dXQgb2YgdGhlIGludGVyZmVyZW5jZSBncmFwaCB0byBzaW1wbGlmeSBpdC4KLSAgICB2b2lkIHNp
bXBsaWZ5KCkKLSAgICB7Ci0gICAgICAgIEluZGV4VHlwZSBsYXN0SW5kZXggPSBtX3NpbXBsaWZ5
V29ya2xpc3QudGFrZUxhc3QoKTsKLQotICAgICAgICBBU1NFUlQoIW1fc2VsZWN0U3RhY2suY29u
dGFpbnMobGFzdEluZGV4KSk7Ci0gICAgICAgIEFTU0VSVCghbV9pc09uU2VsZWN0U3RhY2suZ2V0
KGxhc3RJbmRleCkpOwotICAgICAgICBtX3NlbGVjdFN0YWNrLmFwcGVuZChsYXN0SW5kZXgpOwot
ICAgICAgICBtX2lzT25TZWxlY3RTdGFjay5xdWlja1NldChsYXN0SW5kZXgpOwotCi0gICAgICAg
IGZvckVhY2hBZGphY2VudChsYXN0SW5kZXgsIFt0aGlzXShJbmRleFR5cGUgYWRqYWNlbnRUbXBJ
bmRleCkgewotICAgICAgICAgICAgZGVjcmVtZW50RGVncmVlKGFkamFjZW50VG1wSW5kZXgpOwot
ICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIGZyZWV6ZSgpCi0gICAgewotICAgICAgICBJ
bmRleFR5cGUgdmljdGltSW5kZXggPSBtX2ZyZWV6ZVdvcmtsaXN0LnRha2VBbnkoKTsKLSAgICAg
ICAgQVNTRVJUX1dJVEhfTUVTU0FHRShnZXRBbGlhcyh2aWN0aW1JbmRleCkgPT0gdmljdGltSW5k
ZXgsICJjb2FsZXNjZSgpIHNob3VsZCBub3QgbGVhdmUgYWxpYXNlZCBUbXAgaW4gdGhlIHdvcmts
aXN0LiIpOwotICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuYXBwZW5kKHZpY3RpbUluZGV4KTsK
LSAgICAgICAgZnJlZXplTW92ZXModmljdGltSW5kZXgpOwotICAgIH0KLQotICAgIHZvaWQgZnJl
ZXplTW92ZXMoSW5kZXhUeXBlIHRtcEluZGV4KQotICAgIHsKLSAgICAgICAgZm9yRWFjaE5vZGVN
b3Zlcyh0bXBJbmRleCwgW3RoaXMsIHRtcEluZGV4XSAoSW5kZXhUeXBlIG1vdmVJbmRleCkgewot
ICAgICAgICAgICAgaWYgKCFtX2FjdGl2ZU1vdmVzLnF1aWNrQ2xlYXIobW92ZUluZGV4KSkKLSAg
ICAgICAgICAgICAgICBtX3dvcmtsaXN0TW92ZXMudGFrZU1vdmUobW92ZUluZGV4KTsKLQotICAg
ICAgICAgICAgY29uc3QgTW92ZU9wZXJhbmRzJiBtb3ZlT3BlcmFuZHMgPSBtX2NvYWxlc2NpbmdD
YW5kaWRhdGVzW21vdmVJbmRleF07Ci0gICAgICAgICAgICBJbmRleFR5cGUgc3JjVG1wSW5kZXgg
PSBtb3ZlT3BlcmFuZHMuc3JjSW5kZXg7Ci0gICAgICAgICAgICBJbmRleFR5cGUgZHN0VG1wSW5k
ZXggPSBtb3ZlT3BlcmFuZHMuZHN0SW5kZXg7Ci0KLSAgICAgICAgICAgIEluZGV4VHlwZSBvcmln
aW5hbE90aGVyVG1wID0gc3JjVG1wSW5kZXggIT0gdG1wSW5kZXggPyBzcmNUbXBJbmRleCA6IGRz
dFRtcEluZGV4OwotICAgICAgICAgICAgSW5kZXhUeXBlIG90aGVyVG1wSW5kZXggPSBnZXRBbGlh
cyhvcmlnaW5hbE90aGVyVG1wKTsKLSAgICAgICAgICAgIGlmIChtX2RlZ3JlZXNbb3RoZXJUbXBJ
bmRleF0gPCBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpICYmICFpc01vdmVSZWxhdGVkKG90
aGVyVG1wSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1fZnJlZXplV29ya2xpc3QucmVt
b3ZlKG90aGVyVG1wSW5kZXgpKQotICAgICAgICAgICAgICAgICAgICBtX3NpbXBsaWZ5V29ya2xp
c3QuYXBwZW5kKG90aGVyVG1wSW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAg
ICB9Ci0KLSAgICB2b2lkIGNvYWxlc2NlKCkKLSAgICB7Ci0gICAgICAgIHVuc2lnbmVkIG1vdmVJ
bmRleCA9IG1fd29ya2xpc3RNb3Zlcy50YWtlTGFzdE1vdmUoKTsKLSAgICAgICAgY29uc3QgTW92
ZU9wZXJhbmRzJiBtb3ZlT3BlcmFuZHMgPSBtX2NvYWxlc2NpbmdDYW5kaWRhdGVzW21vdmVJbmRl
eF07Ci0gICAgICAgIEluZGV4VHlwZSB1ID0gZ2V0QWxpYXMobW92ZU9wZXJhbmRzLnNyY0luZGV4
KTsKLSAgICAgICAgSW5kZXhUeXBlIHYgPSBnZXRBbGlhcyhtb3ZlT3BlcmFuZHMuZHN0SW5kZXgp
OwotCi0gICAgICAgIGlmIChpc1ByZWNvbG9yZWQodikpCi0gICAgICAgICAgICBzdGQ6OnN3YXAo
dSwgdik7Ci0KLSAgICAgICAgaWYgKHRyYWNlRGVidWcpCi0gICAgICAgICAgICBkYXRhTG9nKCJD
b2FsZXNjaW5nIG1vdmUgYXQgaW5kZXggIiwgbW92ZUluZGV4LCAiIHUgPSAiLCB1LCAiIHYgPSAi
LCB2LCAiXG4iKTsKLQotICAgICAgICBpZiAodSA9PSB2KSB7Ci0gICAgICAgICAgICBhZGRXb3Jr
TGlzdCh1KTsKLQotICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpCi0gICAgICAgICAgICAgICAg
ZGF0YUxvZygiICAgIENvYWxlc2NlZFxuIik7Ci0gICAgICAgIH0gZWxzZSBpZiAoaXNQcmVjb2xv
cmVkKHYpCi0gICAgICAgICAgICB8fCBtX2ludGVyZmVyZW5jZUVkZ2VzLmNvbnRhaW5zKEludGVy
ZmVyZW5jZUVkZ2UodSwgdikpCi0gICAgICAgICAgICB8fCAodSA9PSBtX2ZyYW1lUG9pbnRlcklu
ZGV4ICYmIG1faW50ZXJmZXJlc1dpdGhGcmFtZVBvaW50ZXIucXVpY2tHZXQodikpKSB7Ci0gICAg
ICAgICAgICBhZGRXb3JrTGlzdCh1KTsKLSAgICAgICAgICAgIGFkZFdvcmtMaXN0KHYpOwotCi0g
ICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKLSAgICAgICAgICAgICAgICBkYXRhTG9nKCIgICAg
Q29uc3RyYWluZWRcbiIpOwotICAgICAgICB9IGVsc2UgaWYgKGNhbkJlU2FmZWx5Q29hbGVzY2Vk
KHUsIHYpKSB7Ci0gICAgICAgICAgICBjb21iaW5lKHUsIHYpOwotICAgICAgICAgICAgYWRkV29y
a0xpc3QodSk7Ci0gICAgICAgICAgICBtX2hhc0NvYWxlc2NlZE5vblRyaXZpYWxNb3ZlID0gdHJ1
ZTsKLQotICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpCi0gICAgICAgICAgICAgICAgZGF0YUxv
ZygiICAgIFNhZmUgQ29hbGVzY2luZ1xuIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAg
ICBtX2FjdGl2ZU1vdmVzLnF1aWNrU2V0KG1vdmVJbmRleCk7Ci0KLSAgICAgICAgICAgIGlmICh0
cmFjZURlYnVnKQotICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICBGYWlsZWQgY29hbGVzY2lu
ZywgYWRkZWQgdG8gYWN0aXZlIG1vdmVzLlxuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2
b2lkIGFzc2lnbkNvbG9ycygpCi0gICAgewotICAgICAgICBBU1NFUlQobV9zaW1wbGlmeVdvcmts
aXN0LmlzRW1wdHkoKSk7Ci0gICAgICAgIEFTU0VSVChtX3dvcmtsaXN0TW92ZXMuaXNFbXB0eSgp
KTsKLSAgICAgICAgQVNTRVJUKG1fZnJlZXplV29ya2xpc3QuaXNFbXB0eSgpKTsKLSAgICAgICAg
QVNTRVJUKG1fc3BpbGxXb3JrbGlzdC5pc0VtcHR5KCkpOwotCi0gICAgICAgIC8vIFJlY2xhaW0g
YXMgbXVjaCBtZW1vcnkgYXMgcG9zc2libGUuCi0gICAgICAgIG1faW50ZXJmZXJlbmNlRWRnZXMu
Y2xlYXIoKTsKLSAgICAgICAgbV9kZWdyZWVzLmNsZWFyKCk7Ci0gICAgICAgIG1fbW92ZUxpc3Qu
Y2xlYXIoKTsKLSAgICAgICAgbV93b3JrbGlzdE1vdmVzLmNsZWFyKCk7Ci0gICAgICAgIG1fc2lt
cGxpZnlXb3JrbGlzdC5jbGVhcigpOwotICAgICAgICBtX3NwaWxsV29ya2xpc3QuY2xlYXIoKTsK
LSAgICAgICAgbV9mcmVlemVXb3JrbGlzdC5jbGVhcigpOwotCi0gICAgICAgIC8vIFRyeSB0byBj
b2xvciB0aGUgVG1wIG9uIHRoZSBzdGFjay4KLSAgICAgICAgbV9jb2xvcmVkVG1wLnJlc2l6ZSht
X2FkamFjZW5jeUxpc3Quc2l6ZSgpKTsKLQotICAgICAgICB3aGlsZSAoIW1fc2VsZWN0U3RhY2su
aXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICB1bnNpZ25lZCB0bXBJbmRleCA9IG1fc2VsZWN0U3Rh
Y2sudGFrZUxhc3QoKTsKLSAgICAgICAgICAgIEFTU0VSVCghaXNQcmVjb2xvcmVkKHRtcEluZGV4
KSk7Ci0gICAgICAgICAgICBBU1NFUlQoIW1fY29sb3JlZFRtcFt0bXBJbmRleF0pOwotCi0gICAg
ICAgICAgICBSZWdpc3RlclNldCBjb2xvcmVkUmVnaXN0ZXJzOwotICAgICAgICAgICAgZm9yIChJ
bmRleFR5cGUgYWRqYWNlbnRUbXBJbmRleCA6IG1fYWRqYWNlbmN5TGlzdFt0bXBJbmRleF0pIHsK
LSAgICAgICAgICAgICAgICBJbmRleFR5cGUgYWxpYXNUbXBJbmRleCA9IGdldEFsaWFzKGFkamFj
ZW50VG1wSW5kZXgpOwotICAgICAgICAgICAgICAgIFJlZyByZWcgPSBtX2NvbG9yZWRUbXBbYWxp
YXNUbXBJbmRleF07Ci0KLSAgICAgICAgICAgICAgICBBU1NFUlQoIWlzUHJlY29sb3JlZChhbGlh
c1RtcEluZGV4KSB8fCAoaXNQcmVjb2xvcmVkKGFsaWFzVG1wSW5kZXgpICYmIHJlZykpOwotCi0g
ICAgICAgICAgICAgICAgaWYgKHJlZykKLSAgICAgICAgICAgICAgICAgICAgY29sb3JlZFJlZ2lz
dGVycy5zZXQocmVnKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYm9vbCBjb2xvckFz
c2lnbmVkID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKFJlZyByZWcgOiBtX3JlZ3NJblByaW9y
aXR5T3JkZXIpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWNvbG9yZWRSZWdpc3RlcnMuZ2V0KHJl
ZykpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9jb2xvcmVkVG1wW3RtcEluZGV4XSA9IHJlZzsK
LSAgICAgICAgICAgICAgICAgICAgY29sb3JBc3NpZ25lZCA9IHRydWU7Ci0gICAgICAgICAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAg
ICAgICAgaWYgKCFjb2xvckFzc2lnbmVkKQotICAgICAgICAgICAgICAgIG1fc3BpbGxlZFRtcHMu
YXBwZW5kKHRtcEluZGV4KTsKLSAgICAgICAgfQotICAgICAgICBtX3NlbGVjdFN0YWNrLmNsZWFy
KCk7Ci0KLSAgICAgICAgaWYgKG1fc3BpbGxlZFRtcHMuaXNFbXB0eSgpKQotICAgICAgICAgICAg
bV9jb2FsZXNjZWRUbXBzQXRTcGlsbC5jbGVhcigpOwotICAgICAgICBlbHNlCi0gICAgICAgICAg
ICBtX2NvbG9yZWRUbXAuY2xlYXIoKTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgdm9pZCBpbml0
aWFsaXplRGVncmVlcyh1bnNpZ25lZCB0bXBBcnJheVNpemUpCi0gICAgewotICAgICAgICBtX2Rl
Z3JlZXMucmVzaXplKHRtcEFycmF5U2l6ZSk7Ci0KLSAgICAgICAgLy8gQWxsIHByZWNvbG9yZWQg
cmVnaXN0ZXJzIGhhdmUgIGFuICJpbmZpbml0ZSIgZGVncmVlLgotICAgICAgICB1bnNpZ25lZCBm
aXJzdE5vblJlZ0luZGV4ID0gbV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXggKyAxOwotICAg
ICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZmlyc3ROb25SZWdJbmRleDsgKytpKQotICAg
ICAgICAgICAgbV9kZWdyZWVzW2ldID0gc3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25lZD46Om1h
eCgpOwotCi0gICAgICAgIG1lbXNldChtX2RlZ3JlZXMuZGF0YSgpICsgZmlyc3ROb25SZWdJbmRl
eCwgMCwgKHRtcEFycmF5U2l6ZSAtIGZpcnN0Tm9uUmVnSW5kZXgpICogc2l6ZW9mKHVuc2lnbmVk
KSk7Ci0gICAgfQotCi0gICAgdm9pZCBhZGRFZGdlRGlzdGluY3QoSW5kZXhUeXBlIGEsIEluZGV4
VHlwZSBiKQotICAgIHsKLSAgICAgICAgQVNTRVJUKGEgIT0gYik7Ci0gICAgICAgIGlmIChtX2lu
dGVyZmVyZW5jZUVkZ2VzLmFkZChJbnRlcmZlcmVuY2VFZGdlKGEsIGIpKS5pc05ld0VudHJ5KSB7
Ci0gICAgICAgICAgICBpZiAoIWlzUHJlY29sb3JlZChhKSkgewotICAgICAgICAgICAgICAgIEFT
U0VSVCghbV9hZGphY2VuY3lMaXN0W2FdLmNvbnRhaW5zKGIpKTsKLSAgICAgICAgICAgICAgICBt
X2FkamFjZW5jeUxpc3RbYV0uYXBwZW5kKGIpOwotICAgICAgICAgICAgICAgIG1fZGVncmVlc1th
XSsrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWlzUHJlY29sb3JlZChiKSkg
ewotICAgICAgICAgICAgICAgIEFTU0VSVCghbV9hZGphY2VuY3lMaXN0W2JdLmNvbnRhaW5zKGEp
KTsKLSAgICAgICAgICAgICAgICBtX2FkamFjZW5jeUxpc3RbYl0uYXBwZW5kKGEpOwotICAgICAg
ICAgICAgICAgIG1fZGVncmVlc1tiXSsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAg
fQotCi0gICAgdm9pZCBkZWNyZW1lbnREZWdyZWUoSW5kZXhUeXBlIHRtcEluZGV4KQotICAgIHsK
LSAgICAgICAgQVNTRVJUKG1fZGVncmVlc1t0bXBJbmRleF0pOwotCi0gICAgICAgIHVuc2lnbmVk
IG9sZERlZ3JlZSA9IG1fZGVncmVlc1t0bXBJbmRleF0tLTsKLSAgICAgICAgaWYgKG9sZERlZ3Jl
ZSA9PSBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBlbmFibGVN
b3Zlc09uVmFsdWVBbmRBZGphY2VudHModG1wSW5kZXgpOwotICAgICAgICAgICAgbV9zcGlsbFdv
cmtsaXN0LnJlbW92ZSh0bXBJbmRleCk7Ci0gICAgICAgICAgICBpZiAoaXNNb3ZlUmVsYXRlZCh0
bXBJbmRleCkpCi0gICAgICAgICAgICAgICAgbV9mcmVlemVXb3JrbGlzdC5hZGQodG1wSW5kZXgp
OwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5h
cHBlbmQodG1wSW5kZXgpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBib29sIGFkZEVkZ2VE
aXN0aW5jdFdpdGhvdXREZWdyZWVDaGFuZ2UoSW5kZXhUeXBlIGEsIEluZGV4VHlwZSBiKQotICAg
IHsKLSAgICAgICAgQVNTRVJUKGEgIT0gYik7Ci0gICAgICAgIGlmIChtX2ludGVyZmVyZW5jZUVk
Z2VzLmFkZChJbnRlcmZlcmVuY2VFZGdlKGEsIGIpKS5pc05ld0VudHJ5KSB7Ci0gICAgICAgICAg
ICBpZiAoIWlzUHJlY29sb3JlZChhKSkgewotICAgICAgICAgICAgICAgIEFTU0VSVCghbV9hZGph
Y2VuY3lMaXN0W2FdLmNvbnRhaW5zKGIpKTsKLSAgICAgICAgICAgICAgICBtX2FkamFjZW5jeUxp
c3RbYV0uYXBwZW5kKGIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWlzUHJl
Y29sb3JlZChiKSkgewotICAgICAgICAgICAgICAgIEFTU0VSVCghbV9hZGphY2VuY3lMaXN0W2Jd
LmNvbnRhaW5zKGEpKTsKLSAgICAgICAgICAgICAgICBtX2FkamFjZW5jeUxpc3RbYl0uYXBwZW5k
KGEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0K
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2wgaXNNb3ZlUmVsYXRlZChJ
bmRleFR5cGUgdG1wSW5kZXgpCi0gICAgewotICAgICAgICBmb3IgKHVuc2lnbmVkIG1vdmVJbmRl
eCA6IG1fbW92ZUxpc3RbdG1wSW5kZXhdKSB7Ci0gICAgICAgICAgICBpZiAobV9hY3RpdmVNb3Zl
cy5xdWlja0dldChtb3ZlSW5kZXgpIHx8IG1fd29ya2xpc3RNb3Zlcy5jb250YWlucyhtb3ZlSW5k
ZXgpKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdGlvbj4KLSAg
ICB2b2lkIGZvckVhY2hBZGphY2VudChJbmRleFR5cGUgdG1wSW5kZXgsIEZ1bmN0aW9uIGZ1bmN0
aW9uKQotICAgIHsKLSAgICAgICAgZm9yIChJbmRleFR5cGUgYWRqYWNlbnRUbXBJbmRleCA6IG1f
YWRqYWNlbmN5TGlzdFt0bXBJbmRleF0pIHsKLSAgICAgICAgICAgIGlmICghaGFzQmVlblNpbXBs
aWZpZWQoYWRqYWNlbnRUbXBJbmRleCkpCi0gICAgICAgICAgICAgICAgZnVuY3Rpb24oYWRqYWNl
bnRUbXBJbmRleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBib29sIGhhc0JlZW5TaW1wbGlm
aWVkKEluZGV4VHlwZSB0bXBJbmRleCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2lzT25TZWxl
Y3RTdGFjay5xdWlja0dldCh0bXBJbmRleCkgfHwgISFtX2NvYWxlc2NlZFRtcHNbdG1wSW5kZXhd
OwotICAgIH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0aW9uPgotICAgIHZvaWQgZm9y
RWFjaE5vZGVNb3ZlcyhJbmRleFR5cGUgdG1wSW5kZXgsIEZ1bmN0aW9uIGZ1bmN0aW9uKQotICAg
IHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBtb3ZlSW5kZXggOiBtX21vdmVMaXN0W3RtcEluZGV4
XSkgewotICAgICAgICAgICAgaWYgKG1fYWN0aXZlTW92ZXMucXVpY2tHZXQobW92ZUluZGV4KSB8
fCBtX3dvcmtsaXN0TW92ZXMuY29udGFpbnMobW92ZUluZGV4KSkKLSAgICAgICAgICAgICAgICBm
dW5jdGlvbihtb3ZlSW5kZXgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBlbmFibGVN
b3Zlc09uVmFsdWUoSW5kZXhUeXBlIHRtcEluZGV4KQotICAgIHsKLSAgICAgICAgZm9yICh1bnNp
Z25lZCBtb3ZlSW5kZXggOiBtX21vdmVMaXN0W3RtcEluZGV4XSkgewotICAgICAgICAgICAgaWYg
KG1fYWN0aXZlTW92ZXMucXVpY2tDbGVhcihtb3ZlSW5kZXgpKQotICAgICAgICAgICAgICAgIG1f
d29ya2xpc3RNb3Zlcy5yZXR1cm5Nb3ZlKG1vdmVJbmRleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0K
LSAgICB2b2lkIGVuYWJsZU1vdmVzT25WYWx1ZUFuZEFkamFjZW50cyhJbmRleFR5cGUgdG1wSW5k
ZXgpCi0gICAgewotICAgICAgICBlbmFibGVNb3Zlc09uVmFsdWUodG1wSW5kZXgpOwotCi0gICAg
ICAgIGZvckVhY2hBZGphY2VudCh0bXBJbmRleCwgW3RoaXNdIChJbmRleFR5cGUgYWRqYWNlbnRU
bXBJbmRleCkgewotICAgICAgICAgICAgZW5hYmxlTW92ZXNPblZhbHVlKGFkamFjZW50VG1wSW5k
ZXgpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBib29sIGlzUHJlY29sb3JlZChJbmRleFR5
cGUgdG1wSW5kZXgpCi0gICAgewotICAgICAgICByZXR1cm4gdG1wSW5kZXggPD0gbV9sYXN0UHJl
Y29sb3JlZFJlZ2lzdGVySW5kZXg7Ci0gICAgfQotCi0gICAgdm9pZCBhZGRXb3JrTGlzdChJbmRl
eFR5cGUgdG1wSW5kZXgpCi0gICAgewotICAgICAgICBpZiAoIWlzUHJlY29sb3JlZCh0bXBJbmRl
eCkgJiYgbV9kZWdyZWVzW3RtcEluZGV4XSA8IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkg
JiYgIWlzTW92ZVJlbGF0ZWQodG1wSW5kZXgpKSB7Ci0gICAgICAgICAgICBtX2ZyZWV6ZVdvcmts
aXN0LnJlbW92ZSh0bXBJbmRleCk7Ci0gICAgICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuYXBw
ZW5kKHRtcEluZGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgY29tYmluZShJbmRl
eFR5cGUgdSwgSW5kZXhUeXBlIHYpCi0gICAgewotICAgICAgICBpZiAoIW1fZnJlZXplV29ya2xp
c3QucmVtb3ZlKHYpKQotICAgICAgICAgICAgbV9zcGlsbFdvcmtsaXN0LnJlbW92ZSh2KTsKLQot
ICAgICAgICBBU1NFUlQoIW1fY29hbGVzY2VkVG1wc1t2XSk7Ci0gICAgICAgIG1fY29hbGVzY2Vk
VG1wc1t2XSA9IHU7Ci0KLSAgICAgICAgYXV0byYgdk1vdmVzID0gbV9tb3ZlTGlzdFt2XTsKLSAg
ICAgICAgbV9tb3ZlTGlzdFt1XS5hZGQodk1vdmVzLmJlZ2luKCksIHZNb3Zlcy5lbmQoKSk7Ci0K
LSAgICAgICAgZm9yRWFjaEFkamFjZW50KHYsIFt0aGlzLCB1XSAoSW5kZXhUeXBlIGFkamFjZW50
VG1wSW5kZXgpIHsKLSAgICAgICAgICAgIGlmIChhZGRFZGdlRGlzdGluY3RXaXRob3V0RGVncmVl
Q2hhbmdlKGFkamFjZW50VG1wSW5kZXgsIHUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgd2Ug
YWRkZWQgYSBuZXcgZWRnZSBiZXR3ZWVuIHRoZSBhZGphY2VudFRtcCBhbmQgdSwgaXQgcmVwbGFj
ZXMgdGhlIGVkZ2UKLSAgICAgICAgICAgICAgICAvLyB0aGF0IGV4aXN0ZWQgd2l0aCB2LgotICAg
ICAgICAgICAgICAgIC8vIFRoZSBkZWdyZWUgb2YgYWRqYWNlbnRUbXAgcmVtYWlucyB0aGUgc2Ft
ZSBzaW5jZSB0aGUgZWRnZSBqdXN0IGNoYW5nZWQgZnJvbSB1IHRvIHYuCi0gICAgICAgICAgICAg
ICAgLy8gQWxsIHdlIG5lZWQgdG8gZG8gaXMgdXBkYXRlIHRoZSBkZWdyZWUgb2YgdS4KLSAgICAg
ICAgICAgICAgICBpZiAoIWlzUHJlY29sb3JlZCh1KSkKLSAgICAgICAgICAgICAgICAgICAgbV9k
ZWdyZWVzW3VdKys7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIElm
IHdlIGFscmVhZHkgaGFkIGFuIGVkZ2UgYmV0d2VlbiB0aGUgYWRqYWNlbnRUbXAgYW5kIHUsIHRo
ZSBkZWdyZWUgb2YgdQotICAgICAgICAgICAgICAgIC8vIGlzIGFscmVhZHkgY29ycmVjdC4gVGhl
IGRlZ3JlZSBvZiB0aGUgYWRqYWNlbnRUbXAgZGVjcmVhc2VzIHNpbmNlIHRoZSBlZGdlCi0gICAg
ICAgICAgICAgICAgLy8gd2l0aCB2IGlzIG5vIGxvbmdlciByZWxldmFudCAod2UgY2FuIHRoaW5r
IG9mIGl0IGFzIG1lcmdlZCB3aXRoIHRoZSBlZGdlIHdpdGggdSkuCi0gICAgICAgICAgICAgICAg
ZGVjcmVtZW50RGVncmVlKGFkamFjZW50VG1wSW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAg
ICB9KTsKLQotICAgICAgICBpZiAobV9mcmFtZVBvaW50ZXJJbmRleCAmJiBtX2ludGVyZmVyZXNX
aXRoRnJhbWVQb2ludGVyLnF1aWNrR2V0KHYpKQotICAgICAgICAgICAgbV9pbnRlcmZlcmVzV2l0
aEZyYW1lUG9pbnRlci5xdWlja1NldCh1KTsKLQotICAgICAgICBpZiAobV9kZWdyZWVzW3VdID49
IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkgJiYgbV9mcmVlemVXb3JrbGlzdC5yZW1vdmUo
dSkpCi0gICAgICAgICAgICBhZGRUb1NwaWxsKHUpOwotICAgIH0KLQotICAgIGJvb2wgY2FuQmVT
YWZlbHlDb2FsZXNjZWQoSW5kZXhUeXBlIHUsIEluZGV4VHlwZSB2KQotICAgIHsKLSAgICAgICAg
QVNTRVJUKCFpc1ByZWNvbG9yZWQodikpOwotICAgICAgICBpZiAoaXNQcmVjb2xvcmVkKHUpKQot
ICAgICAgICAgICAgcmV0dXJuIHByZWNvbG9yZWRDb2FsZXNjaW5nSGV1cmlzdGljKHUsIHYpOwot
ICAgICAgICByZXR1cm4gY29uc2VydmF0aXZlSGV1cmlzdGljKHUsIHYpOwotICAgIH0KLQotICAg
IGJvb2wgY29uc2VydmF0aXZlSGV1cmlzdGljKEluZGV4VHlwZSB1LCBJbmRleFR5cGUgdikKLSAg
ICB7Ci0gICAgICAgIC8vIFRoaXMgaXMgdXNpbmcgdGhlIEJyaWdncycgY29uc2VydmF0aXZlIGNv
YWxlc2NpbmcgcnVsZToKLSAgICAgICAgLy8gSWYgdGhlIG51bWJlciBvZiBjb21iaW5lZCBhZGph
Y2VudCBub2RlIHdpdGggYSBkZWdyZWUgPj0gSyBpcyBsZXNzIHRoYW4gSywKLSAgICAgICAgLy8g
aXQgaXMgc2FmZSB0byBjb21iaW5lIHRoZSB0d28gbm9kZXMuIFRoZSByZWFzb24gaXMgdGhhdCB3
ZSBrbm93IHRoYXQgaWYgdGhlIGdyYXBoCi0gICAgICAgIC8vIGlzIGNvbG9yYWJsZSwgd2UgaGF2
ZSBmZXdlciB0aGFuIEsgYWRqYWNlbnRzIHdpdGggaGlnaCBvcmRlciBhbmQgdGhlcmUgaXMgYSBj
b2xvcgotICAgICAgICAvLyBmb3IgdGhlIGN1cnJlbnQgbm9kZS4KLSAgICAgICAgQVNTRVJUKHUg
IT0gdik7Ci0gICAgICAgIEFTU0VSVCghaXNQcmVjb2xvcmVkKHUpKTsKLSAgICAgICAgQVNTRVJU
KCFpc1ByZWNvbG9yZWQodikpOwotCi0gICAgICAgIGNvbnN0IGF1dG8mIGFkamFjZW50c09mVSA9
IG1fYWRqYWNlbmN5TGlzdFt1XTsKLSAgICAgICAgY29uc3QgYXV0byYgYWRqYWNlbnRzT2ZWID0g
bV9hZGphY2VuY3lMaXN0W3ZdOwotCi0gICAgICAgIGlmIChhZGphY2VudHNPZlUuc2l6ZSgpICsg
YWRqYWNlbnRzT2ZWLnNpemUoKSA8IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkpIHsKLSAg
ICAgICAgICAgIC8vIFNob3J0Y3V0OiBpZiB0aGUgdG90YWwgbnVtYmVyIG9mIGFkamFjZW50cyBp
cyBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiByZWdpc3RlciwgdGhlIGNvbmRpdGlvbiBpcyBhbHdh
eXMgbWV0LgotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBI
YXNoU2V0PEluZGV4VHlwZT4gaGlnaE9yZGVyQWRqYWNlbnRzOwotCi0gICAgICAgIGZvciAoSW5k
ZXhUeXBlIGFkamFjZW50VG1wSW5kZXggOiBhZGphY2VudHNPZlUpIHsKLSAgICAgICAgICAgIEFT
U0VSVChhZGphY2VudFRtcEluZGV4ICE9IHYpOwotICAgICAgICAgICAgQVNTRVJUKGFkamFjZW50
VG1wSW5kZXggIT0gdSk7Ci0gICAgICAgICAgICBpZiAoIWhhc0JlZW5TaW1wbGlmaWVkKGFkamFj
ZW50VG1wSW5kZXgpICYmIG1fZGVncmVlc1thZGphY2VudFRtcEluZGV4XSA+PSBtX3JlZ3NJblBy
aW9yaXR5T3JkZXIuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgYXV0byBhZGRSZXN1bHQgPSBo
aWdoT3JkZXJBZGphY2VudHMuYWRkKGFkamFjZW50VG1wSW5kZXgpOwotICAgICAgICAgICAgICAg
IGlmIChhZGRSZXN1bHQuaXNOZXdFbnRyeSAmJiBoaWdoT3JkZXJBZGphY2VudHMuc2l6ZSgpID49
IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmb3IgKEluZGV4VHlw
ZSBhZGphY2VudFRtcEluZGV4IDogYWRqYWNlbnRzT2ZWKSB7Ci0gICAgICAgICAgICBBU1NFUlQo
YWRqYWNlbnRUbXBJbmRleCAhPSB1KTsKLSAgICAgICAgICAgIEFTU0VSVChhZGphY2VudFRtcElu
ZGV4ICE9IHYpOwotICAgICAgICAgICAgaWYgKCFoYXNCZWVuU2ltcGxpZmllZChhZGphY2VudFRt
cEluZGV4KSAmJiBtX2RlZ3JlZXNbYWRqYWNlbnRUbXBJbmRleF0gPj0gbV9yZWdzSW5Qcmlvcml0
eU9yZGVyLnNpemUoKSkgewotICAgICAgICAgICAgICAgIGF1dG8gYWRkUmVzdWx0ID0gaGlnaE9y
ZGVyQWRqYWNlbnRzLmFkZChhZGphY2VudFRtcEluZGV4KTsKLSAgICAgICAgICAgICAgICBpZiAo
YWRkUmVzdWx0LmlzTmV3RW50cnkgJiYgaGlnaE9yZGVyQWRqYWNlbnRzLnNpemUoKSA+PSBtX3Jl
Z3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFs
c2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBBU1NFUlQoaGlnaE9yZGVy
QWRqYWNlbnRzLnNpemUoKSA8IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkpOwotICAgICAg
ICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBib29sIHByZWNvbG9yZWRDb2FsZXNjaW5nSGV1
cmlzdGljKEluZGV4VHlwZSB1LCBJbmRleFR5cGUgdikKLSAgICB7Ci0gICAgICAgIGlmICh0cmFj
ZURlYnVnKQotICAgICAgICAgICAgZGF0YUxvZygiICAgIENoZWNraW5nIHByZWNvbG9yZWRDb2Fs
ZXNjaW5nSGV1cmlzdGljXG4iKTsKLSAgICAgICAgQVNTRVJUKGlzUHJlY29sb3JlZCh1KSk7Ci0g
ICAgICAgIEFTU0VSVCghaXNQcmVjb2xvcmVkKHYpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIElm
IHUgaXMgYSBwaW5uZWQgcmVnaXN0ZXIgdGhlbiBpdCdzIGFsd2F5cyBzYWZlIHRvIGNvYWxlc2Nl
LiBOb3RlIHRoYXQgd2hlbiB3ZSBjYWxsIHRoaXMsCi0gICAgICAgIC8vIHdlIGhhdmUgYWxyZWFk
eSBwcm92ZWQgdGhhdCB0aGVyZSBpcyBubyBpbnRlcmZlcmVuY2UgYmV0d2VlbiB1IGFuZCB2Lgot
ICAgICAgICBpZiAoIW1fbXV0YWJsZVJlZ3MuZ2V0KG1fY29sb3JlZFRtcFt1XSkpCi0gICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICAvLyBJZiBhbnkgYWRqYWNlbnQgb2YgdGhlIG5v
bi1jb2xvcmVkIG5vZGUgaXMgbm90IGFuIGFkamFjZW50IG9mIHRoZSBjb2xvcmVkIG5vZGUgQU5E
IGhhcyBhIGRlZ3JlZSA+PSBLCi0gICAgICAgIC8vIHRoZXJlIGlzIGEgcmlzayB0aGF0IHRoaXMg
bm9kZSBuZWVkcyB0byBoYXZlIHRoZSBzYW1lIGNvbG9yIGFzIG91ciBwcmVjb2xvcmVkIG5vZGUu
IElmIHdlIGNvYWxlc2NlIHN1Y2gKLSAgICAgICAgLy8gbW92ZSwgd2UgbWF5IGNyZWF0ZSBhbiB1
bmNvbG9yYWJsZSBncmFwaC4KLSAgICAgICAgY29uc3QgYXV0byYgYWRqYWNlbnRzT2ZWID0gbV9h
ZGphY2VuY3lMaXN0W3ZdOwotICAgICAgICBmb3IgKHVuc2lnbmVkIGFkamFjZW50VG1wSW5kZXgg
OiBhZGphY2VudHNPZlYpIHsKLSAgICAgICAgICAgIGlmICghaXNQcmVjb2xvcmVkKGFkamFjZW50
VG1wSW5kZXgpCi0gICAgICAgICAgICAgICAgJiYgIWhhc0JlZW5TaW1wbGlmaWVkKGFkamFjZW50
VG1wSW5kZXgpCi0gICAgICAgICAgICAgICAgJiYgbV9kZWdyZWVzW2FkamFjZW50VG1wSW5kZXhd
ID49IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkKLSAgICAgICAgICAgICAgICAmJiAhbV9p
bnRlcmZlcmVuY2VFZGdlcy5jb250YWlucyhJbnRlcmZlcmVuY2VFZGdlKHUsIGFkamFjZW50VG1w
SW5kZXgpKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAg
ICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi1wcm90ZWN0ZWQ6Ci0jaWYgUExBVEZPUk0oQ09DT0Ep
Ci0jcHJhZ21hIG1hcmsgLQotI2VuZGlmCi0KLSAgICAvLyBJbnRlcmZlcmVuY2UgZWRnZXMgYXJl
IG5vdCBkaXJlY3RlZC4gQW4gZWRnZSBiZXR3ZWVuIGFueSB0d28gVG1wcyBpcyByZXByZXNlbnRl
ZAotICAgIC8vIGJ5IHRoZSBjb25jYXRlbmF0ZWQgdmFsdWVzIG9mIHRoZSBzbWFsbGVzdCBUbXAg
Zm9sbG93ZWQgYnkgdGhlIGJpZ2dlciBUbXAuCi0gICAgY2xhc3MgSW50ZXJmZXJlbmNlRWRnZSB7
Ci0gICAgcHVibGljOgotICAgICAgICBJbnRlcmZlcmVuY2VFZGdlKCkKLSAgICAgICAgewotICAg
ICAgICB9Ci0KLSAgICAgICAgSW50ZXJmZXJlbmNlRWRnZShJbmRleFR5cGUgYSwgSW5kZXhUeXBl
IGIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFTU0VSVChhKTsKLSAgICAgICAgICAgIEFTU0VS
VChiKTsKLSAgICAgICAgICAgIEFTU0VSVF9XSVRIX01FU1NBR0UoYSAhPSBiLCAiQSBUbXAgY2Fu
IG5ldmVyIGludGVyZmVyZSB3aXRoIGl0c2VsZi4gRG9pbmcgc28gd291bGQgZm9yY2UgaXQgdG8g
YmUgdGhlIHN1cGVycG9zaXRpb24gb2YgdHdvIHJlZ2lzdGVycy4iKTsKLQotICAgICAgICAgICAg
aWYgKGIgPCBhKQotICAgICAgICAgICAgICAgIHN0ZDo6c3dhcChhLCBiKTsKLSAgICAgICAgICAg
IG1fdmFsdWUgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oYSkgPDwgMzIgfCBiOwotICAgICAgICB9
Ci0KLSAgICAgICAgSW50ZXJmZXJlbmNlRWRnZShXVEY6Okhhc2hUYWJsZURlbGV0ZWRWYWx1ZVR5
cGUpCi0gICAgICAgICAgICA6IG1fdmFsdWUoc3RkOjpudW1lcmljX2xpbWl0czx1aW50NjRfdD46
Om1heCgpKQotICAgICAgICB7Ci0gICAgICAgIH0KLQotICAgICAgICBJbmRleFR5cGUgZmlyc3Qo
KSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbV92YWx1ZSA+PiAzMiAmIDB4
ZmZmZmZmZmY7Ci0gICAgICAgIH0KLQotICAgICAgICBJbmRleFR5cGUgc2Vjb25kKCkgY29uc3QK
LSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1fdmFsdWUgJiAweGZmZmZmZmZmOwotICAg
ICAgICB9Ci0KLSAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEludGVyZmVyZW5jZUVkZ2Ug
b3RoZXIpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtX3ZhbHVlID09IG90
aGVyLm1fdmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sIGlzSGFzaFRhYmxlRGVsZXRl
ZFZhbHVlKCkgY29uc3QKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICp0aGlzID09IElu
dGVyZmVyZW5jZUVkZ2UoV1RGOjpIYXNoVGFibGVEZWxldGVkVmFsdWUpOwotICAgICAgICB9Ci0K
LSAgICAgICAgdW5zaWduZWQgaGFzaCgpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJl
dHVybiBXVEY6OkludEhhc2g8dWludDY0X3Q+OjpoYXNoKG1fdmFsdWUpOwotICAgICAgICB9Ci0K
LSAgICAgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Ci0gICAgICAgIHsKLSAg
ICAgICAgICAgIG91dC5wcmludChmaXJzdCgpLCAiPD0+Iiwgc2Vjb25kKCkpOwotICAgICAgICB9
Ci0KLSAgICBwcml2YXRlOgotICAgICAgICB1aW50NjRfdCBtX3ZhbHVlIHsgMCB9OwotICAgIH07
Ci0KLSAgICBzdHJ1Y3QgSW50ZXJmZXJlbmNlRWRnZUhhc2ggewotICAgICAgICBzdGF0aWMgdW5z
aWduZWQgaGFzaChjb25zdCBJbnRlcmZlcmVuY2VFZGdlJiBrZXkpIHsgcmV0dXJuIGtleS5oYXNo
KCk7IH0KLSAgICAgICAgc3RhdGljIGJvb2wgZXF1YWwoY29uc3QgSW50ZXJmZXJlbmNlRWRnZSYg
YSwgY29uc3QgSW50ZXJmZXJlbmNlRWRnZSYgYikgeyByZXR1cm4gYSA9PSBiOyB9Ci0gICAgICAg
IHN0YXRpYyBjb25zdCBib29sIHNhZmVUb0NvbXBhcmVUb0VtcHR5T3JEZWxldGVkID0gdHJ1ZTsK
LSAgICB9OwotICAgIHR5cGVkZWYgU2ltcGxlQ2xhc3NIYXNoVHJhaXRzPEludGVyZmVyZW5jZUVk
Z2U+IEludGVyZmVyZW5jZUVkZ2VIYXNoVHJhaXRzOwotCi0gICAgY29uc3QgVmVjdG9yPFJlZz4m
IG1fcmVnc0luUHJpb3JpdHlPcmRlcjsKLSAgICBSZWdpc3RlclNldCBtX211dGFibGVSZWdzOwot
ICAgIEluZGV4VHlwZSBtX2xhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleCB7IDAgfTsKLQotICAg
IC8vIFRoZSBpbnRlcmZlcmVuY2UgZ3JhcGguCi0gICAgSGFzaFNldDxJbnRlcmZlcmVuY2VFZGdl
LCBJbnRlcmZlcmVuY2VFZGdlSGFzaCwgSW50ZXJmZXJlbmNlRWRnZUhhc2hUcmFpdHM+IG1faW50
ZXJmZXJlbmNlRWRnZXM7Ci0gICAgVmVjdG9yPFZlY3RvcjxJbmRleFR5cGUsIDAsIFVuc2FmZVZl
Y3Rvck92ZXJmbG93LCA0PiwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fYWRqYWNlbmN5TGlz
dDsKLSAgICBWZWN0b3I8SW5kZXhUeXBlLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9kZWdy
ZWVzOwotCi0gICAgLy8gSW5zdGVhZCBvZiBrZWVwaW5nIHRyYWNrIG9mIHRoZSBtb3ZlIGluc3Ry
dWN0aW9ucywgd2UganVzdCBrZWVwIHRoZWlyIG9wZXJhbmRzIGFyb3VuZCBhbmQgdXNlIHRoZSBp
bmRleAotICAgIC8vIGluIHRoZSB2ZWN0b3IgYXMgdGhlICJpZGVudGlmaWVyIiBmb3IgdGhlIG1v
dmUuCi0gICAgc3RydWN0IE1vdmVPcGVyYW5kcyB7Ci0gICAgICAgIEluZGV4VHlwZSBzcmNJbmRl
eDsKLSAgICAgICAgSW5kZXhUeXBlIGRzdEluZGV4OwotICAgIH07Ci0gICAgVmVjdG9yPE1vdmVP
cGVyYW5kcywgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fY29hbGVzY2luZ0NhbmRpZGF0ZXM7
Ci0KLSAgICAvLyBMaXN0IG9mIGV2ZXJ5IG1vdmUgaW5zdHJ1Y3Rpb24gYXNzb2NpYXRlZCB3aXRo
IGEgVG1wLgotICAgIFZlY3RvcjxIYXNoU2V0PEluZGV4VHlwZSwgdHlwZW5hbWUgRGVmYXVsdEhh
c2g8SW5kZXhUeXBlPjo6SGFzaCwgV1RGOjpVbnNpZ25lZFdpdGhaZXJvS2V5SGFzaFRyYWl0czxJ
bmRleFR5cGU+Pj4gbV9tb3ZlTGlzdDsKLQotICAgIC8vIENvbG9ycy4KLSAgICBWZWN0b3I8UmVn
LCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9jb2xvcmVkVG1wOwotICAgIFZlY3RvcjxJbmRl
eFR5cGU+IG1fc3BpbGxlZFRtcHM7Ci0KLSAgICAvLyBWYWx1ZXMgdGhhdCBoYXZlIGJlZW4gY29h
bGVzY2VkIHdpdGggYW4gb3RoZXIgdmFsdWUuCi0gICAgVmVjdG9yPEluZGV4VHlwZSwgMCwgVW5z
YWZlVmVjdG9yT3ZlcmZsb3c+IG1fY29hbGVzY2VkVG1wczsKLQotICAgIC8vIFRoZSBzdGFjayBv
ZiBUbXAgcmVtb3ZlZCBmcm9tIHRoZSBncmFwaCBhbmQgcmVhZHkgZm9yIGNvbG9yaW5nLgotICAg
IEJpdFZlY3RvciBtX2lzT25TZWxlY3RTdGFjazsKLSAgICBWZWN0b3I8SW5kZXhUeXBlPiBtX3Nl
bGVjdFN0YWNrOwotCi0gICAgSW5kZXhUeXBlIG1fZnJhbWVQb2ludGVySW5kZXggeyAwIH07Ci0g
ICAgQml0VmVjdG9yIG1faW50ZXJmZXJlc1dpdGhGcmFtZVBvaW50ZXI7Ci0KLSAgICBzdHJ1Y3Qg
T3JkZXJlZE1vdmVTZXQgewotICAgICAgICB1bnNpZ25lZCBhZGRNb3ZlKCkKLSAgICAgICAgewot
ICAgICAgICAgICAgQVNTRVJUKG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5pc0VtcHR5KCkpOwotICAg
ICAgICAgICAgQVNTRVJUKCFtX2ZpcnN0TG93UHJpb3JpdHlNb3ZlSW5kZXgpOwotCi0gICAgICAg
ICAgICB1bnNpZ25lZCBuZXh0SW5kZXggPSBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdC5zaXplKCk7Ci0g
ICAgICAgICAgICB1bnNpZ25lZCBwb3NpdGlvbiA9IG1fbW92ZUxpc3Quc2l6ZSgpOwotICAgICAg
ICAgICAgbV9tb3ZlTGlzdC5hcHBlbmQobmV4dEluZGV4KTsKLSAgICAgICAgICAgIG1fcG9zaXRp
b25Jbk1vdmVMaXN0LmFwcGVuZChwb3NpdGlvbik7Ci0gICAgICAgICAgICByZXR1cm4gbmV4dElu
ZGV4OwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzdGFydEFkZGluZ0xvd1ByaW9yaXR5TW92
ZXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICBBU1NFUlQobV9sb3dQcmlvcml0eU1vdmVMaXN0
LmlzRW1wdHkoKSk7Ci0gICAgICAgICAgICBtX2ZpcnN0TG93UHJpb3JpdHlNb3ZlSW5kZXggPSBt
X21vdmVMaXN0LnNpemUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHVuc2lnbmVkIGFkZExvd1By
aW9yaXR5TW92ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFTU0VSVChtX2ZpcnN0TG93UHJp
b3JpdHlNb3ZlSW5kZXggPT0gbV9tb3ZlTGlzdC5zaXplKCkpOwotCi0gICAgICAgICAgICB1bnNp
Z25lZCBuZXh0SW5kZXggPSBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdC5zaXplKCk7Ci0gICAgICAgICAg
ICB1bnNpZ25lZCBwb3NpdGlvbiA9IG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5zaXplKCk7Ci0gICAg
ICAgICAgICBtX2xvd1ByaW9yaXR5TW92ZUxpc3QuYXBwZW5kKG5leHRJbmRleCk7Ci0gICAgICAg
ICAgICBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdC5hcHBlbmQocG9zaXRpb24pOwotCi0gICAgICAgICAg
ICBBU1NFUlQobmV4dEluZGV4ID49IG1fZmlyc3RMb3dQcmlvcml0eU1vdmVJbmRleCk7Ci0KLSAg
ICAgICAgICAgIHJldHVybiBuZXh0SW5kZXg7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sIGlz
RW1wdHkoKSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbV9tb3ZlTGlzdC5p
c0VtcHR5KCkgJiYgbV9sb3dQcmlvcml0eU1vdmVMaXN0LmlzRW1wdHkoKTsKLSAgICAgICAgfQot
Ci0gICAgICAgIGJvb2wgY29udGFpbnModW5zaWduZWQgaW5kZXgpCi0gICAgICAgIHsKLSAgICAg
ICAgICAgIHJldHVybiBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdFtpbmRleF0gIT0gc3RkOjpudW1lcmlj
X2xpbWl0czx1bnNpZ25lZD46Om1heCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB0YWtl
TW92ZSh1bnNpZ25lZCBtb3ZlSW5kZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVuc2lnbmVk
IHBvc2l0aW9uSW5Nb3ZlTGlzdCA9IG1fcG9zaXRpb25Jbk1vdmVMaXN0W21vdmVJbmRleF07Ci0g
ICAgICAgICAgICBpZiAocG9zaXRpb25Jbk1vdmVMaXN0ID09IHN0ZDo6bnVtZXJpY19saW1pdHM8
dW5zaWduZWQ+OjptYXgoKSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAg
IGlmIChtb3ZlSW5kZXggPCBtX2ZpcnN0TG93UHJpb3JpdHlNb3ZlSW5kZXgpIHsKLSAgICAgICAg
ICAgICAgICBBU1NFUlQobV9tb3ZlTGlzdFtwb3NpdGlvbkluTW92ZUxpc3RdID09IG1vdmVJbmRl
eCk7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgbGFzdEluZGV4ID0gbV9tb3ZlTGlzdC5sYXN0
KCk7Ci0gICAgICAgICAgICAgICAgbV9wb3NpdGlvbkluTW92ZUxpc3RbbGFzdEluZGV4XSA9IHBv
c2l0aW9uSW5Nb3ZlTGlzdDsKLSAgICAgICAgICAgICAgICBtX21vdmVMaXN0W3Bvc2l0aW9uSW5N
b3ZlTGlzdF0gPSBsYXN0SW5kZXg7Ci0gICAgICAgICAgICAgICAgbV9tb3ZlTGlzdC5yZW1vdmVM
YXN0KCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFTU0VSVChtX2xv
d1ByaW9yaXR5TW92ZUxpc3RbcG9zaXRpb25Jbk1vdmVMaXN0XSA9PSBtb3ZlSW5kZXgpOwotICAg
ICAgICAgICAgICAgIHVuc2lnbmVkIGxhc3RJbmRleCA9IG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5s
YXN0KCk7Ci0gICAgICAgICAgICAgICAgbV9wb3NpdGlvbkluTW92ZUxpc3RbbGFzdEluZGV4XSA9
IHBvc2l0aW9uSW5Nb3ZlTGlzdDsKLSAgICAgICAgICAgICAgICBtX2xvd1ByaW9yaXR5TW92ZUxp
c3RbcG9zaXRpb25Jbk1vdmVMaXN0XSA9IGxhc3RJbmRleDsKLSAgICAgICAgICAgICAgICBtX2xv
d1ByaW9yaXR5TW92ZUxpc3QucmVtb3ZlTGFzdCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAg
ICAgICBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdFttb3ZlSW5kZXhdID0gc3RkOjpudW1lcmljX2xpbWl0
czx1bnNpZ25lZD46Om1heCgpOwotCi0gICAgICAgICAgICBBU1NFUlQoIWNvbnRhaW5zKG1vdmVJ
bmRleCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgdW5zaWduZWQgdGFrZUxhc3RNb3ZlKCkKLSAg
ICAgICAgewotICAgICAgICAgICAgQVNTRVJUKCFpc0VtcHR5KCkpOwotCi0gICAgICAgICAgICB1
bnNpZ25lZCBsYXN0SW5kZXg7Ci0gICAgICAgICAgICBpZiAoIW1fbW92ZUxpc3QuaXNFbXB0eSgp
KSB7Ci0gICAgICAgICAgICAgICAgbGFzdEluZGV4ID0gbV9tb3ZlTGlzdC50YWtlTGFzdCgpOwot
ICAgICAgICAgICAgICAgIEFTU0VSVChtX3Bvc2l0aW9uSW5Nb3ZlTGlzdFtsYXN0SW5kZXhdID09
IG1fbW92ZUxpc3Quc2l6ZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAg
ICAgbGFzdEluZGV4ID0gbV9sb3dQcmlvcml0eU1vdmVMaXN0LnRha2VMYXN0KCk7Ci0gICAgICAg
ICAgICAgICAgQVNTRVJUKG1fcG9zaXRpb25Jbk1vdmVMaXN0W2xhc3RJbmRleF0gPT0gbV9sb3dQ
cmlvcml0eU1vdmVMaXN0LnNpemUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX3Bv
c2l0aW9uSW5Nb3ZlTGlzdFtsYXN0SW5kZXhdID0gc3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25l
ZD46Om1heCgpOwotCi0gICAgICAgICAgICBBU1NFUlQoIWNvbnRhaW5zKGxhc3RJbmRleCkpOwot
ICAgICAgICAgICAgcmV0dXJuIGxhc3RJbmRleDsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQg
cmV0dXJuTW92ZSh1bnNpZ25lZCBpbmRleCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gVGhp
cyBhc3NlcnRpb24gaXMgYSBiaXQgc3RyaWN0IGJ1dCB0aGF0IGlzIGhvdyB0aGUgbW92ZSBsaXN0
IHNob3VsZCBiZSB1c2VkLiBUaGUgb25seSBraW5kIG9mIG1vdmVzIHRoYXQgY2FuCi0gICAgICAg
ICAgICAvLyByZXR1cm4gdG8gdGhlIGxpc3QgYXJlIHRoZSBvbmVzIHRoYXQgd2UgcHJldmlvdXNs
eSBmYWlsZWQgdG8gY29hbGVzY2Ugd2l0aCB0aGUgY29uc2VydmF0aXZlIGhldXJpc3RpY3MuCi0g
ICAgICAgICAgICAvLyBWYWx1ZXMgc2hvdWxkIG5vdCBiZSBhZGRlZCBiYWNrIGlmIHRoZXkgd2Vy
ZSBuZXZlciB0YWtlbiBvdXQgd2hlbiBhdHRlbXB0aW5nIGNvYWxlc2NpbmcuCi0gICAgICAgICAg
ICBBU1NFUlQoIWNvbnRhaW5zKGluZGV4KSk7Ci0KLSAgICAgICAgICAgIGlmIChpbmRleCA8IG1f
Zmlyc3RMb3dQcmlvcml0eU1vdmVJbmRleCkgewotICAgICAgICAgICAgICAgIHVuc2lnbmVkIHBv
c2l0aW9uID0gbV9tb3ZlTGlzdC5zaXplKCk7Ci0gICAgICAgICAgICAgICAgbV9tb3ZlTGlzdC5h
cHBlbmQoaW5kZXgpOwotICAgICAgICAgICAgICAgIG1fcG9zaXRpb25Jbk1vdmVMaXN0W2luZGV4
XSA9IHBvc2l0aW9uOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB1bnNp
Z25lZCBwb3NpdGlvbiA9IG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5zaXplKCk7Ci0gICAgICAgICAg
ICAgICAgbV9sb3dQcmlvcml0eU1vdmVMaXN0LmFwcGVuZChpbmRleCk7Ci0gICAgICAgICAgICAg
ICAgbV9wb3NpdGlvbkluTW92ZUxpc3RbaW5kZXhdID0gcG9zaXRpb247Ci0gICAgICAgICAgICB9
Ci0KLSAgICAgICAgICAgIEFTU0VSVChjb250YWlucyhpbmRleCkpOwotICAgICAgICB9Ci0KLSAg
ICAgICAgdm9pZCBjbGVhcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1fcG9zaXRpb25Jbk1v
dmVMaXN0LmNsZWFyKCk7Ci0gICAgICAgICAgICBtX21vdmVMaXN0LmNsZWFyKCk7Ci0gICAgICAg
ICAgICBtX2xvd1ByaW9yaXR5TW92ZUxpc3QuY2xlYXIoKTsKLSAgICAgICAgfQotCi0gICAgcHJp
dmF0ZToKLSAgICAgICAgVmVjdG9yPHVuc2lnbmVkLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4g
bV9wb3NpdGlvbkluTW92ZUxpc3Q7Ci0gICAgICAgIFZlY3Rvcjx1bnNpZ25lZCwgMCwgVW5zYWZl
VmVjdG9yT3ZlcmZsb3c+IG1fbW92ZUxpc3Q7Ci0gICAgICAgIFZlY3Rvcjx1bnNpZ25lZCwgMCwg
VW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fbG93UHJpb3JpdHlNb3ZlTGlzdDsKLSAgICAgICAgdW5z
aWduZWQgbV9maXJzdExvd1ByaW9yaXR5TW92ZUluZGV4IHsgMCB9OwotICAgIH07Ci0KLSAgICAv
LyBXb3JrIGxpc3RzLgotICAgIC8vIFNldCBvZiAibW92ZSIgZW5hYmxlZCBmb3IgcG9zc2libGUg
Y29hbGVzY2luZy4KLSAgICBPcmRlcmVkTW92ZVNldCBtX3dvcmtsaXN0TW92ZXM7Ci0gICAgLy8g
U2V0IG9mICJtb3ZlIiBub3QgeWV0IHJlYWR5IGZvciBjb2FsZXNjaW5nLgotICAgIEJpdFZlY3Rv
ciBtX2FjdGl2ZU1vdmVzOwotICAgIC8vIExvdy1kZWdyZWUsIG5vbi1Nb3ZlIHJlbGF0ZWQuCi0g
ICAgVmVjdG9yPEluZGV4VHlwZT4gbV9zaW1wbGlmeVdvcmtsaXN0OwotICAgIC8vIEhpZ2gtZGVn
cmVlIFRtcC4KLSAgICBIYXNoU2V0PEluZGV4VHlwZT4gbV9zcGlsbFdvcmtsaXN0OwotICAgIC8v
IExvdy1kZWdyZWUsIE1vdmUgcmVsYXRlZC4KLSAgICBIYXNoU2V0PEluZGV4VHlwZT4gbV9mcmVl
emVXb3JrbGlzdDsKLQotICAgIGJvb2wgbV9oYXNTZWxlY3RlZFNwaWxsIHsgZmFsc2UgfTsKLSAg
ICBib29sIG1faGFzQ29hbGVzY2VkTm9uVHJpdmlhbE1vdmUgeyBmYWxzZSB9OwotCi0gICAgLy8g
VGhlIG1hcHBpbmcgb2YgVG1wIHRvIHRoZWlyIGFsaWFzIGZvciBNb3ZlcyB0aGF0IGFyZSBhbHdh
eXMgY29hbGVzY2luZyByZWdhcmRsZXNzIG9mIHNwaWxsaW5nLgotICAgIFZlY3RvcjxJbmRleFR5
cGUsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX2NvYWxlc2NlZFRtcHNBdFNwaWxsOwotICAg
IAotICAgIGNvbnN0IEhhc2hTZXQ8dW5zaWduZWQ+JiBtX3Vuc3BpbGxhYmxlVG1wczsKLX07Ci0K
LS8vIFRoaXMgcGVyZm9ybSBhbGwgdGhlIHRhc2tzIHRoYXQgYXJlIHNwZWNpZmljIHRvIGNlcnRh
aW4gcmVnaXN0ZXIgdHlwZS4KLXRlbXBsYXRlPEFyZzo6VHlwZSB0eXBlPgotY2xhc3MgQ29sb3Jp
bmdBbGxvY2F0b3IgOiBwdWJsaWMgQWJzdHJhY3RDb2xvcmluZ0FsbG9jYXRvcjx1bnNpZ25lZD4g
ewotcHVibGljOgotICAgIENvbG9yaW5nQWxsb2NhdG9yKENvZGUmIGNvZGUsIFRtcFdpZHRoJiB0
bXBXaWR0aCwgY29uc3QgVXNlQ291bnRzPFRtcD4mIHVzZUNvdW50cywgY29uc3QgSGFzaFNldDx1
bnNpZ25lZD4mIHVuc3BpbGxhYmxlVG1wKQotICAgICAgICA6IEFic3RyYWN0Q29sb3JpbmdBbGxv
Y2F0b3I8dW5zaWduZWQ+KGNvZGUucmVnc0luUHJpb3JpdHlPcmRlcih0eXBlKSwgQWJzb2x1dGVU
bXBNYXBwZXI8dHlwZT46Omxhc3RNYWNoaW5lUmVnaXN0ZXJJbmRleCgpLCB0bXBBcnJheVNpemUo
Y29kZSksIHVuc3BpbGxhYmxlVG1wKQotICAgICAgICAsIG1fY29kZShjb2RlKQotICAgICAgICAs
IG1fdG1wV2lkdGgodG1wV2lkdGgpCi0gICAgICAgICwgbV91c2VDb3VudHModXNlQ291bnRzKQot
ICAgIHsKLSAgICAgICAgaWYgKHR5cGUgPT0gQXJnOjpHUCkgewotICAgICAgICAgICAgbV9mcmFt
ZVBvaW50ZXJJbmRleCA9IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KFRt
cChNYWNyb0Fzc2VtYmxlcjo6ZnJhbWVQb2ludGVyUmVnaXN0ZXIpKTsKLSAgICAgICAgICAgIG1f
aW50ZXJmZXJlc1dpdGhGcmFtZVBvaW50ZXIuZW5zdXJlU2l6ZSh0bXBBcnJheVNpemUoY29kZSkp
OwotICAgICAgICB9Ci0KLSAgICAgICAgaW5pdGlhbGl6ZVByZWNvbG9yZWRUbXAoKTsKLSAgICAg
ICAgYnVpbGQoKTsKLSAgICAgICAgYWxsb2NhdGUoKTsKLSAgICB9Ci0KLSAgICBUbXAgZ2V0QWxp
YXMoVG1wIHRtcCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBBYnNvbHV0ZVRtcE1hcHBl
cjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgoZ2V0QWxpYXMoQWJzb2x1dGVUbXBNYXBwZXI8
dHlwZT46OmFic29sdXRlSW5kZXgodG1wKSkpOwotICAgIH0KLQotICAgIC8vIFRoaXMgdGVsbHMg
eW91IGlmIGEgTW92ZSB3aWxsIGJlIGNvYWxlc2NhYmxlIGlmIHRoZSBzcmMgYW5kIGRzdCBlbmQg
dXAgbWF0Y2hpbmcuIFRoaXMgbWV0aG9kCi0gICAgLy8gcmVsaWVzIG9uIGFuIGFuYWx5c2lzIHRo
YXQgaXMgaW52YWxpZGF0ZWQgYnkgcmVnaXN0ZXIgYWxsb2NhdGlvbiwgc28geW91IGl0J3Mgb25s
eSBtZWFuaW5nZnVsIHRvCi0gICAgLy8gY2FsbCB0aGlzICpiZWZvcmUqIHJlcGxhY2luZyB0aGUg
VG1wJ3MgaW4gdGhpcyBJbnN0IHdpdGggcmVnaXN0ZXJzIG9yIHNwaWxsIHNsb3RzLgotICAgIGJv
b2wgbWF5QmVDb2FsZXNjYWJsZShjb25zdCBJbnN0JiBpbnN0KSBjb25zdAotICAgIHsKLSAgICAg
ICAgcmV0dXJuIG1heUJlQ29hbGVzY2FibGVJbXBsKGluc3QsICZtX3RtcFdpZHRoKTsKLSAgICB9
Ci0KLSAgICBib29sIGlzVXNlbGVzc01vdmUoY29uc3QgSW5zdCYgaW5zdCkgY29uc3QKLSAgICB7
Ci0gICAgICAgIHJldHVybiBtYXlCZUNvYWxlc2NhYmxlSW1wbChpbnN0LCBudWxscHRyKSAmJiBp
bnN0LmFyZ3NbMF0udG1wKCkgPT0gaW5zdC5hcmdzWzFdLnRtcCgpOwotICAgIH0KLQotICAgIFRt
cCBnZXRBbGlhc1doZW5TcGlsbGluZyhUbXAgdG1wKSBjb25zdAotICAgIHsKLSAgICAgICAgQVNT
RVJUX1dJVEhfTUVTU0FHRSghbV9zcGlsbGVkVG1wcy5pc0VtcHR5KCksICJUaGlzIGZ1bmN0aW9u
IGlzIG9ubHkgdmFsaWQgZm9yIGNvYWxlc2NpbmcgZHVyaW5nIHNwaWxsaW5nLiIpOwotCi0gICAg
ICAgIGlmIChtX2NvYWxlc2NlZFRtcHNBdFNwaWxsLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJl
dHVybiB0bXA7Ci0KLSAgICAgICAgdW5zaWduZWQgYWxpYXNJbmRleCA9IEFic29sdXRlVG1wTWFw
cGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHRtcCk7Ci0gICAgICAgIHdoaWxlICh1bnNpZ25lZCBu
ZXh0QWxpYXNJbmRleCA9IG1fY29hbGVzY2VkVG1wc0F0U3BpbGxbYWxpYXNJbmRleF0pCi0gICAg
ICAgICAgICBhbGlhc0luZGV4ID0gbmV4dEFsaWFzSW5kZXg7Ci0KLSAgICAgICAgVG1wIGFsaWFz
ID0gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KGFsaWFzSW5k
ZXgpOwotCi0gICAgICAgIEFTU0VSVF9XSVRIX01FU1NBR0UoIW1fc3BpbGxlZFRtcHMuY29udGFp
bnMoYWxpYXNJbmRleCkgfHwgYWxpYXMgPT0gdG1wLCAiVGhlIGFsaWFzZXMgYXQgc3BpbGwgc2hv
dWxkIGFsd2F5cyBiZSBjb2xvcmFibGUuIFNvbWV0aGluZyB3ZW50IGhvcnJpYmx5IHdyb25nLiIp
OwotCi0gICAgICAgIHJldHVybiBhbGlhczsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFt
ZSBJbmRleEl0ZXJhdG9yPgotICAgIGNsYXNzIEluZGV4VG9UbXBJdGVyYXRvckFkYXB0b3Igewot
ICAgIHB1YmxpYzoKLSAgICAgICAgSW5kZXhUb1RtcEl0ZXJhdG9yQWRhcHRvcihJbmRleEl0ZXJh
dG9yJiYgaW5kZXhJdGVyYXRvcikKLSAgICAgICAgICAgIDogbV9pbmRleEl0ZXJhdG9yKFdURk1v
dmUoaW5kZXhJdGVyYXRvcikpCi0gICAgICAgIHsKLSAgICAgICAgfQotCi0gICAgICAgIFRtcCBv
cGVyYXRvciooKSBjb25zdCB7IHJldHVybiBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJv
bUFic29sdXRlSW5kZXgoKm1faW5kZXhJdGVyYXRvcik7IH0KLSAgICAgICAgSW5kZXhUb1RtcEl0
ZXJhdG9yQWRhcHRvciYgb3BlcmF0b3IrKygpIHsgKyttX2luZGV4SXRlcmF0b3I7IHJldHVybiAq
dGhpczsgfQotCi0gICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJbmRleFRvVG1wSXRlcmF0
b3JBZGFwdG9yJiBvdGhlcikgY29uc3QKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1f
aW5kZXhJdGVyYXRvciA9PSBvdGhlci5tX2luZGV4SXRlcmF0b3I7Ci0gICAgICAgIH0KLQotICAg
ICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgSW5kZXhUb1RtcEl0ZXJhdG9yQWRhcHRvciYgb3Ro
ZXIpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAhKCp0aGlzID09IG90aGVy
KTsKLSAgICAgICAgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgSW5kZXhJdGVyYXRvciBtX2lu
ZGV4SXRlcmF0b3I7Ci0gICAgfTsKLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIENvbGxlY3Rpb24+
Ci0gICAgY2xhc3MgSW5kZXhUb1RtcEl0ZXJhYmxlQWRhcHRvciB7Ci0gICAgcHVibGljOgotICAg
ICAgICBJbmRleFRvVG1wSXRlcmFibGVBZGFwdG9yKGNvbnN0IENvbGxlY3Rpb24mIGNvbGxlY3Rp
b24pCi0gICAgICAgICAgICA6IG1fY29sbGVjdGlvbihjb2xsZWN0aW9uKQotICAgICAgICB7Ci0g
ICAgICAgIH0KLQotICAgICAgICBJbmRleFRvVG1wSXRlcmF0b3JBZGFwdG9yPHR5cGVuYW1lIENv
bGxlY3Rpb246OmNvbnN0X2l0ZXJhdG9yPiBiZWdpbigpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAg
ICAgICAgIHJldHVybiBtX2NvbGxlY3Rpb24uYmVnaW4oKTsKLSAgICAgICAgfQotCi0gICAgICAg
IEluZGV4VG9UbXBJdGVyYXRvckFkYXB0b3I8dHlwZW5hbWUgQ29sbGVjdGlvbjo6Y29uc3RfaXRl
cmF0b3I+IGVuZCgpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtX2NvbGxl
Y3Rpb24uZW5kKCk7Ci0gICAgICAgIH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGNvbnN0IENv
bGxlY3Rpb24mIG1fY29sbGVjdGlvbjsKLSAgICB9OwotCi0gICAgSW5kZXhUb1RtcEl0ZXJhYmxl
QWRhcHRvcjxWZWN0b3I8dW5zaWduZWQ+PiBzcGlsbGVkVG1wcygpIGNvbnN0IHsgcmV0dXJuIG1f
c3BpbGxlZFRtcHM7IH0KLQotICAgIGJvb2wgcmVxdWlyZXNTcGlsbGluZygpIGNvbnN0IHsgcmV0
dXJuICFtX3NwaWxsZWRUbXBzLmlzRW1wdHkoKTsgfQotCi0gICAgUmVnIGFsbG9jYXRlZFJlZyhU
bXAgdG1wKSBjb25zdAotICAgIHsKLSAgICAgICAgQVNTRVJUKCF0bXAuaXNSZWcoKSk7Ci0gICAg
ICAgIEFTU0VSVChtX2NvbG9yZWRUbXAuc2l6ZSgpKTsKLSAgICAgICAgQVNTRVJUKHRtcC5pc0dQ
KCkgPT0gKHR5cGUgPT0gQXJnOjpHUCkpOwotCi0gICAgICAgIFJlZyByZWcgPSBtX2NvbG9yZWRU
bXBbQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodG1wKV07Ci0gICAgICAg
IGlmICghcmVnKSB7Ci0gICAgICAgICAgICBkYXRhTG9nKCJGQVRBTDogTm8gY29sb3IgZm9yICIs
IHRtcCwgIlxuIik7Ci0gICAgICAgICAgICBkYXRhTG9nKCJDb2RlOlxuIik7Ci0gICAgICAgICAg
ICBkYXRhTG9nKG1fY29kZSk7Ci0gICAgICAgICAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hF
RCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZWc7Ci0gICAgfQotCi1wcml2YXRlOgot
ICAgIHN0YXRpYyB1bnNpZ25lZCB0bXBBcnJheVNpemUoQ29kZSYgY29kZSkKLSAgICB7Ci0gICAg
ICAgIHVuc2lnbmVkIG51bVRtcHMgPSBjb2RlLm51bVRtcHModHlwZSk7Ci0gICAgICAgIHJldHVy
biBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChudW1UbXBzKTsKLSAgICB9
Ci0KLSAgICB2b2lkIGluaXRpYWxpemVQcmVjb2xvcmVkVG1wKCkKLSAgICB7Ci0gICAgICAgIG1f
Y29sb3JlZFRtcC5yZXNpemUobV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXggKyAxKTsKLSAg
ICAgICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8PSBtX2xhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJ
bmRleDsgKytpKSB7Ci0gICAgICAgICAgICBUbXAgdG1wID0gQWJzb2x1dGVUbXBNYXBwZXI8dHlw
ZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KGkpOwotICAgICAgICAgICAgQVNTRVJUKHRtcC5pc1Jl
ZygpKTsKLSAgICAgICAgICAgIG1fY29sb3JlZFRtcFtpXSA9IHRtcC5yZWcoKTsKLSAgICAgICAg
fQotICAgIH0KLQotICAgIGJvb2wgbWF5QmVDb2FsZXNjZWQoQXJnIGxlZnQsIEFyZyByaWdodCkK
LSAgICB7Ci0gICAgICAgIGlmICghbGVmdC5pc1RtcCgpIHx8ICFyaWdodC5pc1RtcCgpKQotICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIFRtcCBsZWZ0VG1wID0gbGVmdC50bXAo
KTsKLSAgICAgICAgVG1wIHJpZ2h0VG1wID0gcmlnaHQudG1wKCk7Ci0KLSAgICAgICAgaWYgKGxl
ZnRUbXAgPT0gcmlnaHRUbXApCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAg
aWYgKGxlZnRUbXAuaXNHUCgpICE9ICh0eXBlID09IEFyZzo6R1ApIHx8IHJpZ2h0VG1wLmlzR1Ao
KSAhPSAodHlwZSA9PSBBcmc6OkdQKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAg
ICAgICB1bnNpZ25lZCBsZWZ0SW5kZXggPSBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1
dGVJbmRleChsZWZ0VG1wKTsKLSAgICAgICAgdW5zaWduZWQgcmlnaHRJbmRleCA9IEFic29sdXRl
VG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHJpZ2h0VG1wKTsKLQotICAgICAgICByZXR1
cm4gIW1faW50ZXJmZXJlbmNlRWRnZXMuY29udGFpbnMoSW50ZXJmZXJlbmNlRWRnZShsZWZ0SW5k
ZXgsIHJpZ2h0SW5kZXgpKTsKLSAgICB9Ci0KLSAgICB2b2lkIGFkZFRvTG93UHJpb3JpdHlDb2Fs
ZXNjaW5nQ2FuZGlkYXRlcyhBcmcgbGVmdCwgQXJnIHJpZ2h0KQotICAgIHsKLSAgICAgICAgQVNT
RVJUKG1heUJlQ29hbGVzY2VkKGxlZnQsIHJpZ2h0KSk7Ci0gICAgICAgIFRtcCBsZWZ0VG1wID0g
bGVmdC50bXAoKTsKLSAgICAgICAgVG1wIHJpZ2h0VG1wID0gcmlnaHQudG1wKCk7Ci0KLSAgICAg
ICAgdW5zaWduZWQgbGVmdEluZGV4ID0gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRl
SW5kZXgobGVmdFRtcCk7Ci0gICAgICAgIHVuc2lnbmVkIHJpZ2h0SW5kZXggPSBBYnNvbHV0ZVRt
cE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChyaWdodFRtcCk7Ci0KLSAgICAgICAgdW5zaWdu
ZWQgbmV4dE1vdmVJbmRleCA9IG1fY29hbGVzY2luZ0NhbmRpZGF0ZXMuc2l6ZSgpOwotICAgICAg
ICBtX2NvYWxlc2NpbmdDYW5kaWRhdGVzLmFwcGVuZCh7IGxlZnRJbmRleCwgcmlnaHRJbmRleCB9
KTsKLQotICAgICAgICB1bnNpZ25lZCBuZXdJbmRleEluV29ya2xpc3QgPSBtX3dvcmtsaXN0TW92
ZXMuYWRkTG93UHJpb3JpdHlNb3ZlKCk7Ci0gICAgICAgIEFTU0VSVF9VTlVTRUQobmV3SW5kZXhJ
bldvcmtsaXN0LCBuZXdJbmRleEluV29ya2xpc3QgPT0gbmV4dE1vdmVJbmRleCk7Ci0KLSAgICAg
ICAgQVNTRVJUKG5leHRNb3ZlSW5kZXggPD0gbV9hY3RpdmVNb3Zlcy5zaXplKCkpOwotICAgICAg
ICBtX2FjdGl2ZU1vdmVzLmVuc3VyZVNpemUobmV4dE1vdmVJbmRleCArIDEpOwotCi0gICAgICAg
IG1fbW92ZUxpc3RbbGVmdEluZGV4XS5hZGQobmV4dE1vdmVJbmRleCk7Ci0gICAgICAgIG1fbW92
ZUxpc3RbcmlnaHRJbmRleF0uYWRkKG5leHRNb3ZlSW5kZXgpOwotICAgIH0KLQotICAgIHZvaWQg
YnVpbGQoKQotICAgIHsKLSAgICAgICAgVG1wTGl2ZW5lc3M8dHlwZT4gbGl2ZW5lc3MobV9jb2Rl
KTsKLSAgICAgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6IG1fY29kZSkgewotICAgICAgICAg
ICAgdHlwZW5hbWUgVG1wTGl2ZW5lc3M8dHlwZT46OkxvY2FsQ2FsYyBsb2NhbENhbGMobGl2ZW5l
c3MsIGJsb2NrKTsKLSAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW5zdEluZGV4ID0gYmxvY2st
PnNpemUoKTsgaW5zdEluZGV4LS07KSB7Ci0gICAgICAgICAgICAgICAgSW5zdCYgaW5zdCA9IGJs
b2NrLT5hdChpbnN0SW5kZXgpOwotICAgICAgICAgICAgICAgIEluc3QqIG5leHRJbnN0ID0gYmxv
Y2stPmdldChpbnN0SW5kZXggKyAxKTsKLSAgICAgICAgICAgICAgICBidWlsZCgmaW5zdCwgbmV4
dEluc3QsIGxvY2FsQ2FsYyk7Ci0gICAgICAgICAgICAgICAgbG9jYWxDYWxjLmV4ZWN1dGUoaW5z
dEluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1aWxkKG51bGxwdHIsICZibG9j
ay0+YXQoMCksIGxvY2FsQ2FsYyk7Ci0gICAgICAgIH0KLSAgICAgICAgYnVpbGRMb3dQcmlvcml0
eU1vdmVMaXN0KCk7Ci0gICAgfQotCi0gICAgdm9pZCBidWlsZChJbnN0KiBwcmV2SW5zdCwgSW5z
dCogbmV4dEluc3QsIGNvbnN0IHR5cGVuYW1lIFRtcExpdmVuZXNzPHR5cGU+OjpMb2NhbENhbGMm
IGxvY2FsQ2FsYykKLSAgICB7Ci0gICAgICAgIGlmICh0cmFjZURlYnVnKQotICAgICAgICAgICAg
ZGF0YUxvZygiQnVpbGRpbmcgYmV0d2VlbiAiLCBwb2ludGVyRHVtcChwcmV2SW5zdCksICIgYW5k
ICIsIHBvaW50ZXJEdW1wKG5leHRJbnN0KSwgIjpcbiIpOwotICAgICAgICBJbnN0Ojpmb3JFYWNo
RGVmV2l0aEV4dHJhQ2xvYmJlcmVkUmVnczxUbXA+KAotICAgICAgICAgICAgcHJldkluc3QsIG5l
eHRJbnN0LAotICAgICAgICAgICAgWyZdIChjb25zdCBUbXAmIGFyZywgQXJnOjpSb2xlLCBBcmc6
OlR5cGUgYXJnVHlwZSwgQXJnOjpXaWR0aCkgewotICAgICAgICAgICAgICAgIGlmIChhcmdUeXBl
ICE9IHR5cGUpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAK
LSAgICAgICAgICAgICAgICAvLyBBbGwgdGhlIERlZigpcyBpbnRlcmZlcmUgd2l0aCBlYWNoIG90
aGVyIGFuZCB3aXRoIGFsbCB0aGUgZXh0cmEgY2xvYmJlcmVkIFRtcHMuCi0gICAgICAgICAgICAg
ICAgLy8gV2Ugc2hvdWxkIG5vdCB1c2UgZm9yRWFjaERlZldpdGhFeHRyYUNsb2JiZXJlZFJlZ3Mo
KSBoZXJlIHNpbmNlIGNvbG9yZWQgVG1wcwotICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBuZWVk
IGludGVyZmVyZW5jZSBlZGdlcyBpbiBvdXIgaW1wbGVtZW50YXRpb24uCi0gICAgICAgICAgICAg
ICAgSW5zdDo6Zm9yRWFjaERlZjxUbXA+KAotICAgICAgICAgICAgICAgICAgICBwcmV2SW5zdCwg
bmV4dEluc3QsCi0gICAgICAgICAgICAgICAgICAgIFsmXSAoVG1wJiBvdGhlckFyZywgQXJnOjpS
b2xlLCBBcmc6OlR5cGUgYXJnVHlwZSwgQXJnOjpXaWR0aCkgewotICAgICAgICAgICAgICAgICAg
ICAgICAgaWYgKGFyZ1R5cGUgIT0gdHlwZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBy
ZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAg
IGlmICh0cmFjZURlYnVnKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFMb2coIiAg
ICBBZGRpbmcgZGVmLWRlZiBlZGdlOiAiLCBhcmcsICIsICIsIG90aGVyQXJnLCAiXG4iKTsKLSAg
ICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPmFkZEVkZ2UoYXJnLCBvdGhlckFyZyk7Ci0gICAg
ICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgaWYgKHByZXZJ
bnN0ICYmIG1heUJlQ29hbGVzY2FibGUoKnByZXZJbnN0KSkgewotICAgICAgICAgICAgLy8gV2Ug
ZG8gbm90IHdhbnQgdGhlIFVzZSgpIG9mIHRoaXMgbW92ZSB0byBpbnRlcmZlcmUgd2l0aCB0aGUg
RGVmKCksIGV2ZW4gaWYgaXQgaXMgbGl2ZQotICAgICAgICAgICAgLy8gYWZ0ZXIgdGhlIE1vdmUu
IElmIHdlIHdlcmUgdG8gYWRkIHRoZSBpbnRlcmZlcmVuY2UgZWRnZSwgaXQgd291bGQgYmUgaW1w
b3NzaWJsZSB0bwotICAgICAgICAgICAgLy8gY29hbGVzY2UgdGhlIE1vdmUgZXZlbiBpZiB0aGUg
dHdvIFRtcCBuZXZlciBpbnRlcmZlcmUgYW55d2hlcmUuCi0gICAgICAgICAgICBUbXAgZGVmVG1w
OwotICAgICAgICAgICAgVG1wIHVzZVRtcDsKLSAgICAgICAgICAgIHByZXZJbnN0LT5mb3JFYWNo
VG1wKFsmZGVmVG1wLCAmdXNlVG1wXSAoVG1wJiBhcmdUbXAsIEFyZzo6Um9sZSByb2xlLCBBcmc6
OlR5cGUsIEFyZzo6V2lkdGgpIHsKLSAgICAgICAgICAgICAgICBpZiAoQXJnOjppc0xhdGVEZWYo
cm9sZSkpCi0gICAgICAgICAgICAgICAgICAgIGRlZlRtcCA9IGFyZ1RtcDsKLSAgICAgICAgICAg
ICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQVNTRVJUKEFyZzo6aXNFYXJseVVzZShy
b2xlKSk7Ci0gICAgICAgICAgICAgICAgICAgIHVzZVRtcCA9IGFyZ1RtcDsKLSAgICAgICAgICAg
ICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIEFTU0VSVChkZWZUbXApOwotICAg
ICAgICAgICAgQVNTRVJUKHVzZVRtcCk7Ci0KLSAgICAgICAgICAgIHVuc2lnbmVkIG5leHRNb3Zl
SW5kZXggPSBtX2NvYWxlc2NpbmdDYW5kaWRhdGVzLnNpemUoKTsKLSAgICAgICAgICAgIG1fY29h
bGVzY2luZ0NhbmRpZGF0ZXMuYXBwZW5kKHsgQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29s
dXRlSW5kZXgodXNlVG1wKSwgQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgo
ZGVmVG1wKSB9KTsKLQotICAgICAgICAgICAgdW5zaWduZWQgbmV3SW5kZXhJbldvcmtsaXN0ID0g
bV93b3JrbGlzdE1vdmVzLmFkZE1vdmUoKTsKLSAgICAgICAgICAgIEFTU0VSVF9VTlVTRUQobmV3
SW5kZXhJbldvcmtsaXN0LCBuZXdJbmRleEluV29ya2xpc3QgPT0gbmV4dE1vdmVJbmRleCk7Ci0K
LSAgICAgICAgICAgIEFTU0VSVChuZXh0TW92ZUluZGV4IDw9IG1fYWN0aXZlTW92ZXMuc2l6ZSgp
KTsKLSAgICAgICAgICAgIG1fYWN0aXZlTW92ZXMuZW5zdXJlU2l6ZShuZXh0TW92ZUluZGV4ICsg
MSk7Ci0KLSAgICAgICAgICAgIGZvciAoY29uc3QgQXJnJiBhcmcgOiBwcmV2SW5zdC0+YXJncykg
ewotICAgICAgICAgICAgICAgIGF1dG8mIGxpc3QgPSBtX21vdmVMaXN0W0Fic29sdXRlVG1wTWFw
cGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KGFyZy50bXAoKSldOwotICAgICAgICAgICAgICAgIGxp
c3QuYWRkKG5leHRNb3ZlSW5kZXgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3Ig
KGNvbnN0IFRtcCYgbGl2ZVRtcCA6IGxvY2FsQ2FsYy5saXZlKCkpIHsKLSAgICAgICAgICAgICAg
ICBpZiAobGl2ZVRtcCAhPSB1c2VUbXApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNl
RGVidWcpCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhTG9nKCIgICAgQWRkaW5nIGRlZi1s
aXZlIGZvciBjb2FsZXNjYWJsZTogIiwgZGVmVG1wLCAiLCAiLCBsaXZlVG1wLCAiXG4iKTsKLSAg
ICAgICAgICAgICAgICAgICAgYWRkRWRnZShkZWZUbXAsIGxpdmVUbXApOwotICAgICAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVGhlIG5leHQgaW5zdHJ1Y3Rp
b24gY291bGQgaGF2ZSBlYXJseSBjbG9iYmVycyBvciBlYXJseSBkZWYncy4gV2UgbmVlZCB0byBj
b25zaWRlcgotICAgICAgICAgICAgLy8gdGhvc2Ugbm93LgotICAgICAgICAgICAgYWRkRWRnZXMo
bnVsbHB0ciwgbmV4dEluc3QsIGxvY2FsQ2FsYy5saXZlKCkpOwotICAgICAgICB9IGVsc2UKLSAg
ICAgICAgICAgIGFkZEVkZ2VzKHByZXZJbnN0LCBuZXh0SW5zdCwgbG9jYWxDYWxjLmxpdmUoKSk7
Ci0gICAgfQotCi0gICAgdm9pZCBidWlsZExvd1ByaW9yaXR5TW92ZUxpc3QoKQotICAgIHsKLSAg
ICAgICAgaWYgKCFpc1g4NigpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIG1fd29y
a2xpc3RNb3Zlcy5zdGFydEFkZGluZ0xvd1ByaW9yaXR5TW92ZXMoKTsKLSAgICAgICAgZm9yIChC
YXNpY0Jsb2NrKiBibG9jayA6IG1fY29kZSkgewotICAgICAgICAgICAgZm9yIChJbnN0JiBpbnN0
IDogKmJsb2NrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0ZDo6b3B0aW9uYWw8dW5zaWduZWQ+
IGRlZkFyZ0luZGV4ID0gaW5zdC5zaG91bGRUcnlBbGlhc2luZ0RlZigpKSB7Ci0gICAgICAgICAg
ICAgICAgICAgIEFyZyBvcDEgPSBpbnN0LmFyZ3NbKmRlZkFyZ0luZGV4IC0gMl07Ci0gICAgICAg
ICAgICAgICAgICAgIEFyZyBvcDIgPSBpbnN0LmFyZ3NbKmRlZkFyZ0luZGV4IC0gMV07Ci0gICAg
ICAgICAgICAgICAgICAgIEFyZyBkZXN0ID0gaW5zdC5hcmdzWypkZWZBcmdJbmRleF07Ci0KLSAg
ICAgICAgICAgICAgICAgICAgaWYgKG9wMSA9PSBkZXN0IHx8IG9wMiA9PSBkZXN0KQotICAgICAg
ICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1h
eUJlQ29hbGVzY2VkKG9wMSwgZGVzdCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBhZGRUb0xv
d1ByaW9yaXR5Q29hbGVzY2luZ0NhbmRpZGF0ZXMob3AxLCBkZXN0KTsKLSAgICAgICAgICAgICAg
ICAgICAgaWYgKG9wMSAhPSBvcDIgJiYgbWF5QmVDb2FsZXNjZWQob3AyLCBkZXN0KSkKLSAgICAg
ICAgICAgICAgICAgICAgICAgIGFkZFRvTG93UHJpb3JpdHlDb2FsZXNjaW5nQ2FuZGlkYXRlcyhv
cDIsIGRlc3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQot
ICAgIH0KLQotICAgIHZvaWQgYWRkRWRnZXMoSW5zdCogcHJldkluc3QsIEluc3QqIG5leHRJbnN0
LCB0eXBlbmFtZSBUbXBMaXZlbmVzczx0eXBlPjo6TG9jYWxDYWxjOjpJdGVyYWJsZSBsaXZlVG1w
cykKLSAgICB7Ci0gICAgICAgIC8vIEFsbCB0aGUgRGVmKClzIGludGVyZmVyZSB3aXRoIGV2ZXJ0
aGluZyBsaXZlLgotICAgICAgICBJbnN0Ojpmb3JFYWNoRGVmV2l0aEV4dHJhQ2xvYmJlcmVkUmVn
czxUbXA+KAotICAgICAgICAgICAgcHJldkluc3QsIG5leHRJbnN0LAotICAgICAgICAgICAgWyZd
IChjb25zdCBUbXAmIGFyZywgQXJnOjpSb2xlLCBBcmc6OlR5cGUgYXJnVHlwZSwgQXJnOjpXaWR0
aCkgewotICAgICAgICAgICAgICAgIGlmIChhcmdUeXBlICE9IHR5cGUpCi0gICAgICAgICAgICAg
ICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IgKGNv
bnN0IFRtcCYgbGl2ZVRtcCA6IGxpdmVUbXBzKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFTU0VS
VChsaXZlVG1wLmlzR1AoKSA9PSAodHlwZSA9PSBBcmc6OkdQKSk7Ci0gICAgICAgICAgICAgICAg
ICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKLSAgICAgICAgICAgICAg
ICAgICAgICAgIGRhdGFMb2coIiAgICBBZGRpbmcgZGVmLWxpdmUgZWRnZTogIiwgYXJnLCAiLCAi
LCBsaXZlVG1wLCAiXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAg
ICAgIGFkZEVkZ2UoYXJnLCBsaXZlVG1wKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAg
ICAgICAgICBpZiAodHlwZSA9PSBBcmc6OkdQICYmICFhcmcuaXNHUFIoKSkKLSAgICAgICAgICAg
ICAgICAgICAgbV9pbnRlcmZlcmVzV2l0aEZyYW1lUG9pbnRlci5xdWlja1NldChBYnNvbHV0ZVRt
cE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChhcmcpKTsKLSAgICAgICAgICAgIH0pOwotICAg
IH0KLQotICAgIHZvaWQgYWRkRWRnZShUbXAgYSwgVG1wIGIpCi0gICAgewotICAgICAgICBBU1NF
UlRfV0lUSF9NRVNTQUdFKGEuaXNHUCgpID09IGIuaXNHUCgpLCAiQW4gaW50ZXJmZXJlbmNlIGJl
dHdlZW4gcmVnaXN0ZXJzIG9mIGRpZmZlcmVudCB0eXBlcyBkb2VzIG5vdCBtYWtlIHNlbnNlLCBp
dCBjYW4gbGVhZCB0byBub24tY29sb3JhYmxlIGdyYXBocy4iKTsKLQotICAgICAgICBhZGRFZGdl
KEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KGEpLCBBYnNvbHV0ZVRtcE1h
cHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChiKSk7Ci0gICAgfQotCi0gICAgLy8gQ2FsbGluZyB0
aGlzIHdpdGhvdXQgYSB0bXBXaWR0aCB3aWxsIHBlcmZvcm0gYSBtb3JlIGNvbnNlcnZhdGl2ZSBj
b2FsZXNjaW5nIGFuYWx5c2lzIHRoYXQgYXNzdW1lcwotICAgIC8vIHRoYXQgTW92ZTMyJ3MgYXJl
IG5vdCBjb2FsZXNjYWJsZS4KLSAgICBzdGF0aWMgYm9vbCBtYXlCZUNvYWxlc2NhYmxlSW1wbChj
b25zdCBJbnN0JiBpbnN0LCBUbXBXaWR0aCogdG1wV2lkdGgpCi0gICAgewotICAgICAgICBzd2l0
Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBBcmc6OkdQOgotICAgICAgICAgICAgc3dpdGNoIChp
bnN0LmtpbmQub3Bjb2RlKSB7Ci0gICAgICAgICAgICBjYXNlIE1vdmU6Ci0gICAgICAgICAgICBj
YXNlIE1vdmUzMjoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6
Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQXJnOjpGUDoKLSAgICAgICAgICAgIHN3aXRjaCAoaW5z
dC5raW5kLm9wY29kZSkgewotICAgICAgICAgICAgY2FzZSBNb3ZlRmxvYXQ6Ci0gICAgICAgICAg
ICBjYXNlIE1vdmVEb3VibGU6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBk
ZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgQVNTRVJUX1dJVEhfTUVTU0FH
RShpbnN0LmFyZ3Muc2l6ZSgpID09IDIsICJXZSBhc3N1bWUgY29hbGVjYWJsZSBtb3ZlcyBvbmx5
IGhhdmUgdHdvIGFyZ3VtZW50cyBpbiBhIGZldyBwbGFjZXMuIik7Ci0KLSAgICAgICAgaWYgKCFp
bnN0LmFyZ3NbMF0uaXNUbXAoKSB8fCAhaW5zdC5hcmdzWzFdLmlzVG1wKCkpCi0gICAgICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgQVNTRVJUKGluc3QuYXJnc1swXS50eXBlKCkgPT0g
dHlwZSk7Ci0gICAgICAgIEFTU0VSVChpbnN0LmFyZ3NbMV0udHlwZSgpID09IHR5cGUpOwotCi0g
ICAgICAgIC8vIFdlIGNhbiBjb2FsZXNjZSBhIE1vdmUzMiBzbyBsb25nIGFzIGVpdGhlciBvZiB0
aGUgZm9sbG93aW5nIGhvbGRzOgotICAgICAgICAvLyAtIFRoZSBpbnB1dCBpcyBhbHJlYWR5IHpl
cm8tZmlsbGVkLgotICAgICAgICAvLyAtIFRoZSBvdXRwdXQgb25seSBjYXJlcyBhYm91dCB0aGUg
bG93IDMyIGJpdHMuCi0gICAgICAgIC8vCi0gICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgaW5wdXQg
cHJvcGVydHkgcmVxdWlyZXMgYW4gYW5hbHlzaXMgb3ZlciBaRGVmJ3MsIHNvIGl0J3Mgb25seSB2
YWxpZCBzbyBsb25nCi0gICAgICAgIC8vIGFzIHRoZSBpbnB1dCBnZXRzIGEgcmVnaXN0ZXIuIFdl
IGRvbid0IGtub3cgaWYgdGhlIGlucHV0IGdldHMgYSByZWdpc3RlciwgYnV0IHdlIGRvIGtub3cK
LSAgICAgICAgLy8gdGhhdCBpZiBpdCBkb2Vzbid0IGdldCBhIHJlZ2lzdGVyIHRoZW4gd2Ugd2ls
bCBzdGlsbCBlbWl0IHRoaXMgTW92ZTMyLgotICAgICAgICBpZiAoaW5zdC5raW5kLm9wY29kZSA9
PSBNb3ZlMzIpIHsKLSAgICAgICAgICAgIGlmICghdG1wV2lkdGgpCi0gICAgICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICBpZiAodG1wV2lkdGgtPmRlZldpZHRoKGluc3Qu
YXJnc1swXS50bXAoKSkgPiBBcmc6OldpZHRoMzIKLSAgICAgICAgICAgICAgICAmJiB0bXBXaWR0
aC0+dXNlV2lkdGgoaW5zdC5hcmdzWzFdLnRtcCgpKSA+IEFyZzo6V2lkdGgzMikKLSAgICAgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVy
biB0cnVlOwotICAgIH0KLQotICAgIHZvaWQgc2VsZWN0U3BpbGwoKQotICAgIHsKLSAgICAgICAg
aWYgKCFtX2hhc1NlbGVjdGVkU3BpbGwpIHsKLSAgICAgICAgICAgIG1faGFzU2VsZWN0ZWRTcGls
bCA9IHRydWU7Ci0KLSAgICAgICAgICAgIGlmIChtX2hhc0NvYWxlc2NlZE5vblRyaXZpYWxNb3Zl
KQotICAgICAgICAgICAgICAgIG1fY29hbGVzY2VkVG1wc0F0U3BpbGwgPSBtX2NvYWxlc2NlZFRt
cHM7Ci0gICAgICAgIH0KLQotICAgICAgICBhdXRvIGl0ZXJhdG9yID0gbV9zcGlsbFdvcmtsaXN0
LmJlZ2luKCk7Ci0KLSAgICAgICAgUkVMRUFTRV9BU1NFUlRfV0lUSF9NRVNTQUdFKGl0ZXJhdG9y
ICE9IG1fc3BpbGxXb3JrbGlzdC5lbmQoKSwgInNlbGVjdFNwaWxsKCkgY2FsbGVkIHdoZW4gdGhl
cmUgd2FzIG5vIHNwaWxsLiIpOwotICAgICAgICBSRUxFQVNFX0FTU0VSVF9XSVRIX01FU1NBR0Uo
IW1fdW5zcGlsbGFibGVUbXBzLmNvbnRhaW5zKCppdGVyYXRvciksICJ0cnlpbmcgdG8gc3BpbGwg
dW5zcGlsbGFibGUgdG1wIik7Ci0KLSAgICAgICAgLy8gSGlnaGVyIHNjb3JlIG1lYW5zIG1vcmUg
ZGVzaXJhYmxlIHRvIHNwaWxsLiBMb3dlciBzY29yZXMgbWF4aW1pemUgdGhlIGxpa2VsaWhvb2Qg
dGhhdCBhIHRtcAotICAgICAgICAvLyBnZXRzIGEgcmVnaXN0ZXIuCi0gICAgICAgIGF1dG8gc2Nv
cmUgPSBbJl0gKFRtcCB0bXApIC0+IGRvdWJsZSB7Ci0gICAgICAgICAgICAvLyBBaXIgZXhwb3Nl
cyB0aGUgY29uY2VwdCBvZiAiZmFzdCB0bXBzIiwgYW5kIHdlIGludGVycHJldCB0aGF0IHRvIG1l
YW4gdGhhdCB0aGUgdG1wCi0gICAgICAgICAgICAvLyBzaG91bGQgYWx3YXlzIGJlIGluIGEgcmVn
aXN0ZXIuCi0gICAgICAgICAgICBpZiAobV9jb2RlLmlzRmFzdFRtcCh0bXApKQotICAgICAgICAg
ICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBBbGwgZWxzZSBi
ZWluZyBlcXVhbCwgdGhlIHNjb3JlIHNob3VsZCBiZSBkaXJlY3RseSByZWxhdGVkIHRvIHRoZSBk
ZWdyZWUuCi0gICAgICAgICAgICBkb3VibGUgZGVncmVlID0gc3RhdGljX2Nhc3Q8ZG91YmxlPiht
X2RlZ3JlZXNbQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodG1wKV0pOwot
Ci0gICAgICAgICAgICAvLyBBbGwgZWxzZSBiZWluZyBlcXVhbCwgdGhlIHNjb3JlIHNob3VsZCBi
ZSBpbnZlcnNlbHkgcmVsYXRlZCB0byB0aGUgbnVtYmVyIG9mIHdhcm0gdXNlcyBhbmQKLSAgICAg
ICAgICAgIC8vIGRlZnMuCi0gICAgICAgICAgICBjb25zdCBVc2VDb3VudHM8VG1wPjo6Q291bnRz
KiBjb3VudHMgPSBtX3VzZUNvdW50c1t0bXBdOwotICAgICAgICAgICAgaWYgKCFjb3VudHMpCi0g
ICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5p
dHkoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZG91YmxlIHVzZXMgPSBjb3VudHMtPm51
bVdhcm1Vc2VzICsgY291bnRzLT5udW1EZWZzOwotCi0gICAgICAgICAgICAvLyBJZiBpdCdzIGEg
Y29uc3RhbnQsIHRoZW4gaXQncyBub3QgYXMgYmFkIHRvIHNwaWxsLiBXZSBjYW4gcmVtYXRlcmlh
bGl6ZSBpdCBpbiBtYW55Ci0gICAgICAgICAgICAvLyBjYXNlcy4KLSAgICAgICAgICAgIGlmIChj
b3VudHMtPm51bUNvbnN0RGVmcyA9PSAxICYmIGNvdW50cy0+bnVtRGVmcyA9PSAxKQotICAgICAg
ICAgICAgICAgIHVzZXMgLz0gMjsKLQotICAgICAgICAgICAgcmV0dXJuIGRlZ3JlZSAvIHVzZXM7
Ci0gICAgICAgIH07Ci0KLSAgICAgICAgYXV0byB2aWN0aW1JdGVyYXRvciA9IGl0ZXJhdG9yOwot
ICAgICAgICBkb3VibGUgbWF4U2NvcmUgPSBzY29yZShBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6
dG1wRnJvbUFic29sdXRlSW5kZXgoKml0ZXJhdG9yKSk7Ci0KLSAgICAgICAgKytpdGVyYXRvcjsK
LSAgICAgICAgZm9yICg7aXRlcmF0b3IgIT0gbV9zcGlsbFdvcmtsaXN0LmVuZCgpOyArK2l0ZXJh
dG9yKSB7Ci0gICAgICAgICAgICBkb3VibGUgdG1wU2NvcmUgPSBzY29yZShBYnNvbHV0ZVRtcE1h
cHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgoKml0ZXJhdG9yKSk7Ci0gICAgICAgICAg
ICBpZiAodG1wU2NvcmUgPiBtYXhTY29yZSkgewotICAgICAgICAgICAgICAgIEFTU0VSVCghbV91
bnNwaWxsYWJsZVRtcHMuY29udGFpbnMoKml0ZXJhdG9yKSk7Ci0gICAgICAgICAgICAgICAgdmlj
dGltSXRlcmF0b3IgPSBpdGVyYXRvcjsKLSAgICAgICAgICAgICAgICBtYXhTY29yZSA9IHRtcFNj
b3JlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdW5zaWduZWQgdmljdGlt
SW5kZXggPSAqdmljdGltSXRlcmF0b3I7Ci0gICAgICAgIG1fc3BpbGxXb3JrbGlzdC5yZW1vdmUo
dmljdGltSXRlcmF0b3IpOwotICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuYXBwZW5kKHZpY3Rp
bUluZGV4KTsKLQotICAgICAgICBmcmVlemVNb3Zlcyh2aWN0aW1JbmRleCk7Ci0gICAgfQotCi0g
ICAgdm9pZCBhbGxvY2F0ZSgpCi0gICAgewotICAgICAgICBBU1NFUlRfV0lUSF9NRVNTQUdFKG1f
YWN0aXZlTW92ZXMuc2l6ZSgpID49IG1fY29hbGVzY2luZ0NhbmRpZGF0ZXMuc2l6ZSgpLCAiVGhl
IGFjdGl2ZU1vdmUgc2V0IHNob3VsZCBiZSBiaWcgZW5vdWdoIGZvciB0aGUgcXVpY2sgb3BlcmF0
aW9ucyBvZiBCaXRWZWN0b3IuIik7Ci0KLSAgICAgICAgbWFrZVdvcmtMaXN0KCk7Ci0KLSAgICAg
ICAgaWYgKGRlYnVnKSB7Ci0gICAgICAgICAgICBkYXRhTG9nKCJJbnRlcmZlcmVuY2U6ICIsIGxp
c3REdW1wKG1faW50ZXJmZXJlbmNlRWRnZXMpLCAiXG4iKTsKLSAgICAgICAgICAgIGR1bXBJbnRl
cmZlcmVuY2VHcmFwaEluRG90KFdURjo6ZGF0YUZpbGUoKSk7Ci0gICAgICAgICAgICBkYXRhTG9n
KCJDb2FsZXNjaW5nIGNhbmRpZGF0ZXM6XG4iKTsKLSAgICAgICAgICAgIGZvciAoTW92ZU9wZXJh
bmRzJiBtb3ZlT3AgOiBtX2NvYWxlc2NpbmdDYW5kaWRhdGVzKSB7Ci0gICAgICAgICAgICAgICAg
ZGF0YUxvZygiICAgICIsIEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJ
bmRleChtb3ZlT3Auc3JjSW5kZXgpLAotICAgICAgICAgICAgICAgICAgICAiIC0+ICIsIEFic29s
dXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleChtb3ZlT3AuZHN0SW5kZXgp
LCAiXG4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRhdGFMb2coIkluaXRpYWwgd29y
ayBsaXN0XG4iKTsKLSAgICAgICAgICAgIGR1bXBXb3JrTGlzdHMoV1RGOjpkYXRhRmlsZSgpKTsK
LSAgICAgICAgfQotCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKSB7
Ci0gICAgICAgICAgICAgICAgZGF0YUxvZygiQmVmb3JlIEdyYXBoIHNpbXBsaWZpY2F0aW9uIGl0
ZXJhdGlvblxuIik7Ci0gICAgICAgICAgICAgICAgZHVtcFdvcmtMaXN0cyhXVEY6OmRhdGFGaWxl
KCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIW1fc2ltcGxpZnlXb3JrbGlz
dC5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgc2ltcGxpZnkoKTsKLSAgICAgICAgICAgIGVs
c2UgaWYgKCFtX3dvcmtsaXN0TW92ZXMuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIGNvYWxl
c2NlKCk7Ci0gICAgICAgICAgICBlbHNlIGlmICghbV9mcmVlemVXb3JrbGlzdC5pc0VtcHR5KCkp
Ci0gICAgICAgICAgICAgICAgZnJlZXplKCk7Ci0gICAgICAgICAgICBlbHNlIGlmICghbV9zcGls
bFdvcmtsaXN0LmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICBzZWxlY3RTcGlsbCgpOwotCi0g
ICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykgewotICAgICAgICAgICAgICAgIGRhdGFMb2coIkFm
dGVyIEdyYXBoIHNpbXBsaWZpY2F0aW9uIGl0ZXJhdGlvblxuIik7Ci0gICAgICAgICAgICAgICAg
ZHVtcFdvcmtMaXN0cyhXVEY6OmRhdGFGaWxlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9
IHdoaWxlICghbV9zaW1wbGlmeVdvcmtsaXN0LmlzRW1wdHkoKSB8fCAhbV93b3JrbGlzdE1vdmVz
LmlzRW1wdHkoKSB8fCAhbV9mcmVlemVXb3JrbGlzdC5pc0VtcHR5KCkgfHwgIW1fc3BpbGxXb3Jr
bGlzdC5pc0VtcHR5KCkpOwotCi0gICAgICAgIGFzc2lnbkNvbG9ycygpOwotICAgIH0KLQotI2lm
IFBMQVRGT1JNKENPQ09BKQotI3ByYWdtYSBtYXJrIC0gRGVidWdnaW5nIGhlbHBlcnMuCi0jZW5k
aWYKLQotICAgIHZvaWQgZHVtcEludGVyZmVyZW5jZUdyYXBoSW5Eb3QoUHJpbnRTdHJlYW0mIG91
dCkKLSAgICB7Ci0gICAgICAgIG91dC5wcmludCgiZ3JhcGggSW50ZXJmZXJlbmNlR3JhcGggeyBc
biIpOwotCi0gICAgICAgIEhhc2hTZXQ8VG1wPiB0bXBzV2l0aEludGVyZmVyZW5jZXM7Ci0gICAg
ICAgIGZvciAoY29uc3QgYXV0byYgZWRnZSA6IG1faW50ZXJmZXJlbmNlRWRnZXMpIHsKLSAgICAg
ICAgICAgIHRtcHNXaXRoSW50ZXJmZXJlbmNlcy5hZGQoQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46
OnRtcEZyb21BYnNvbHV0ZUluZGV4KGVkZ2UuZmlyc3QoKSkpOwotICAgICAgICAgICAgdG1wc1dp
dGhJbnRlcmZlcmVuY2VzLmFkZChBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29s
dXRlSW5kZXgoZWRnZS5zZWNvbmQoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChjb25z
dCBhdXRvJiB0bXAgOiB0bXBzV2l0aEludGVyZmVyZW5jZXMpIHsKLSAgICAgICAgICAgIHVuc2ln
bmVkIHRtcEluZGV4ID0gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodG1w
KTsKLSAgICAgICAgICAgIGlmICh0bXBJbmRleCA8IG1fZGVncmVlcy5zaXplKCkpCi0gICAgICAg
ICAgICAgICAgb3V0LnByaW50KCIgICAgIiwgdG1wLmludGVybmFsVmFsdWUoKSwgIiBbbGFiZWw9
XCIiLCB0bXAsICIgKCIsIG1fZGVncmVlc1t0bXBJbmRleF0sICIpXCJdO1xuIik7Ci0gICAgICAg
ICAgICBlbHNlCi0gICAgICAgICAgICAgICAgb3V0LnByaW50KCIgICAgIiwgdG1wLmludGVybmFs
VmFsdWUoKSwgIiBbbGFiZWw9XCIiLCB0bXAsICJcIl07XG4iKTsKLSAgICAgICAgfQotCi0gICAg
ICAgIGZvciAoY29uc3QgYXV0byYgZWRnZSA6IG1faW50ZXJmZXJlbmNlRWRnZXMpCi0gICAgICAg
ICAgICBvdXQucHJpbnQoIiAgICAiLCBlZGdlLmZpcnN0KCksICIgLS0gIiwgZWRnZS5zZWNvbmQo
KSwgIjtcbiIpOwotICAgICAgICBvdXQucHJpbnQoIn1cbiIpOwotICAgIH0KLQotICAgIHZvaWQg
ZHVtcFdvcmtMaXN0cyhQcmludFN0cmVhbSYgb3V0KQotICAgIHsKLSAgICAgICAgb3V0LnByaW50
KCJTaW1wbGlmeSB3b3JrIGxpc3Q6XG4iKTsKLSAgICAgICAgZm9yICh1bnNpZ25lZCB0bXBJbmRl
eCA6IG1fc2ltcGxpZnlXb3JrbGlzdCkKLSAgICAgICAgICAgIG91dC5wcmludCgiICAgICIsIEFi
c29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleCh0bXBJbmRleCksICJc
biIpOwotICAgICAgICBvdXQucHJpbnRmKCJNb3ZlcyB3b3JrIGxpc3QgaXMgZW1wdHk/ICVkXG4i
LCBtX3dvcmtsaXN0TW92ZXMuaXNFbXB0eSgpKTsKLSAgICAgICAgb3V0LnByaW50KCJGcmVlemUg
d29yayBsaXN0OlxuIik7Ci0gICAgICAgIGZvciAodW5zaWduZWQgdG1wSW5kZXggOiBtX2ZyZWV6
ZVdvcmtsaXN0KQotICAgICAgICAgICAgb3V0LnByaW50KCIgICAgIiwgQWJzb2x1dGVUbXBNYXBw
ZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KHRtcEluZGV4KSwgIlxuIik7Ci0gICAgICAg
IG91dC5wcmludCgiU3BpbGwgd29yayBsaXN0OlxuIik7Ci0gICAgICAgIGZvciAodW5zaWduZWQg
dG1wSW5kZXggOiBtX3NwaWxsV29ya2xpc3QpCi0gICAgICAgICAgICBvdXQucHJpbnQoIiAgICAi
LCBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgodG1wSW5kZXgp
LCAiXG4iKTsKLSAgICB9Ci0KLSAgICB1c2luZyBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yPHVu
c2lnbmVkPjo6YWRkRWRnZTsKLSAgICB1c2luZyBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yPHVu
c2lnbmVkPjo6Z2V0QWxpYXM7Ci0KLSAgICBDb2RlJiBtX2NvZGU7Ci0gICAgVG1wV2lkdGgmIG1f
dG1wV2lkdGg7Ci0gICAgLy8gRklYTUU6IHNwaWxsaW5nIHNob3VsZCBub3QgdHlwZSBzcGVjaWZp
Yy4gSXQgaXMgb25seSBhIHNpZGUgZWZmZWN0IG9mIHVzaW5nIFVzZUNvdW50cy4KLSAgICBjb25z
dCBVc2VDb3VudHM8VG1wPiYgbV91c2VDb3VudHM7Ci19OwotCi1jbGFzcyBJdGVyYXRlZFJlZ2lz
dGVyQ29hbGVzY2luZyB7Ci1wdWJsaWM6Ci0gICAgSXRlcmF0ZWRSZWdpc3RlckNvYWxlc2Npbmco
Q29kZSYgY29kZSkKLSAgICAgICAgOiBtX2NvZGUoY29kZSkKLSAgICAgICAgLCBtX3VzZUNvdW50
cyhjb2RlKQotICAgIHsKLSAgICB9Ci0KLSAgICB2b2lkIHJ1bigpCi0gICAgewotICAgICAgICBw
YWRJbnRlcmZlcmVuY2UobV9jb2RlKTsKLSAgICAgICAgCi0gICAgICAgIGl0ZXJhdGVkUmVnaXN0
ZXJDb2FsZXNjaW5nT25UeXBlPEFyZzo6R1A+KCk7Ci0gICAgICAgIGl0ZXJhdGVkUmVnaXN0ZXJD
b2FsZXNjaW5nT25UeXBlPEFyZzo6RlA+KCk7Ci0KLSAgICAgICAgZml4U3BpbGxzQWZ0ZXJUZXJt
aW5hbHMoKTsKLQotICAgICAgICBpZiAocmVwb3J0U3RhdHMpCi0gICAgICAgICAgICBkYXRhTG9n
KCJOdW0gaXRlcmF0aW9ucyA9ICIsIG1fbnVtSXRlcmF0aW9ucywgIlxuIik7Ci0gICAgfQotCi1w
cml2YXRlOgotICAgIHRlbXBsYXRlPEFyZzo6VHlwZSB0eXBlPgotICAgIHZvaWQgaXRlcmF0ZWRS
ZWdpc3RlckNvYWxlc2NpbmdPblR5cGUoKQotICAgIHsKLSAgICAgICAgSGFzaFNldDx1bnNpZ25l
ZD4gdW5zcGlsbGFibGVUbXBzID0gY29tcHV0ZVVuc3BpbGxhYmxlVG1wczx0eXBlPigpOwotCi0g
ICAgICAgIC8vIEZJWE1FOiBJZiBhIFRtcCBpcyB1c2VkIG9ubHkgZnJvbSBhIFNjcmF0Y2ggcm9s
ZSBhbmQgdGhhdCBhcmd1bWVudCBpcyAhYWRtaXRzU3RhY2ssIHRoZW4KLSAgICAgICAgLy8gd2Ug
c2hvdWxkIGFkZCB0aGUgVG1wIHRvIHVuc3BpbGxhYmxlVG1wcy4gVGhhdCB3aWxsIGhlbHAgYXZv
aWQgcmVsb29waW5nIG9ubHkgdG8gdHVybiB0aGUKLSAgICAgICAgLy8gVG1wIGludG8gYW4gdW5z
cGlsbGFibGUgVG1wLgotICAgICAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9MTUyNjk5Ci0gICAgICAgIAotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAg
ICAgICAgKyttX251bUl0ZXJhdGlvbnM7Ci0KLSAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQot
ICAgICAgICAgICAgICAgIGRhdGFMb2coIkNvZGUgYXQgaXRlcmF0aW9uICIsIG1fbnVtSXRlcmF0
aW9ucywgIjpcbiIsIG1fY29kZSk7Ci0KLSAgICAgICAgICAgIC8vIEZJWE1FOiBPbmUgd2F5IHRv
IG9wdGltaXplIHRoaXMgY29kZSBpcyB0byByZW1vdmUgdGhlIHJlY29tcHV0YXRpb24gaW5zaWRl
IHRoZSBmaXhwb2ludC4KLSAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gcmVjb21wdXRlIGJlY2F1
c2Ugc3BpbGxpbmcgYWRkcyB0bXBzLCBidXQgd2UgY291bGQganVzdCB1cGRhdGUgdG1wV2lkdGgg
d2hlbiB3ZQotICAgICAgICAgICAgLy8gYWRkIHRob3NlIHRtcHMuIE5vdGUgdGhhdCBvbmUgZWFz
eSB3YXkgdG8gcmVtb3ZlIHRoZSByZWNvbXB1dGF0aW9uIGlzIHRvIG1ha2UgYW55IG5ld2x5Ci0g
ICAgICAgICAgICAvLyBhZGRlZCBUbXBzIGdldCB0aGUgc2FtZSB1c2UvZGVmIHdpZHRocyB0aGF0
IHRoZSBvcmlnaW5hbCBUbXAgZ290LiBCdXQsIHRoaXMgbWF5IGh1cnQgdGhlCi0gICAgICAgICAg
ICAvLyBzcGlsbCBjb2RlIHdlIGVtaXQuIFNpbmNlIHdlIGN1cnJlbnRseSByZWNvbXB1dGUgVG1w
V2lkdGggYWZ0ZXIgc3BpbGxpbmcsIHRoZSBuZXdseQotICAgICAgICAgICAgLy8gY3JlYXRlZCBU
bXBzIG1heSBnZXQgbmFycm93ZXIgdXNlL2RlZiB3aWR0aHMuIE9uIHRoZSBvdGhlciBoYW5kLCB0
aGUgc3BpbGxlciBhbHJlYWR5Ci0gICAgICAgICAgICAvLyBzZWxlY3RzIHdoaWNoIG1vdmUgaW5z
dHJ1Y3Rpb24gdG8gdXNlIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCBUbXAncyB3aWR0aHMsIHNvIGl0
IG1heSBub3QKLSAgICAgICAgICAgIC8vIG1hdHRlciB0aGFuIGEgc3Vic2VxdWVudCBpdGVyYXRp
b24gc2VlcyBhIGNvc2VydmF0aXZlIHdpZHRoIGZvciB0aGUgbmV3IFRtcHMuIEFsc28sIHRoZQot
ICAgICAgICAgICAgLy8gcmVjb21wdXRhdGlvbiBtYXkgbm90IGFjdHVhbGx5IGJlIGEgcGVyZm9y
bWFuY2UgcHJvYmxlbTsgaXQncyBsaWtlbHkgdGhhdCBhIGJldHRlciB3YXkgdG8KLSAgICAgICAg
ICAgIC8vIGltcHJvdmUgcGVyZm9ybWFuY2Ugb2YgVG1wV2lkdGggaXMgdG8gcmVwbGFjZSBpdHMg
SGFzaE1hcCB3aXRoIHNvbWV0aGluZyBlbHNlLiBJdCdzCi0gICAgICAgICAgICAvLyBwb3NzaWJs
ZSB0aGF0IG1vc3Qgb2YgdGhlIFRtcFdpZHRoIG92ZXJoZWFkIGlzIGZyb20gcXVlcmllcyBvZiBU
bXBXaWR0aCByYXRoZXIgdGhhbiB0aGUKLSAgICAgICAgICAgIC8vIHJlY29tcHV0YXRpb24sIGlu
IHdoaWNoIGNhc2Ugc3BlZWRpbmcgdXAgdGhlIGxvb2t1cCB3b3VsZCBiZSBhIGJpZ2dlciB3aW4u
Ci0gICAgICAgICAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
MTUyNDc4Ci0gICAgICAgICAgICBtX3RtcFdpZHRoLnJlY29tcHV0ZShtX2NvZGUpOwotICAgICAg
ICAgICAgCi0gICAgICAgICAgICBDb2xvcmluZ0FsbG9jYXRvcjx0eXBlPiBhbGxvY2F0b3IobV9j
b2RlLCBtX3RtcFdpZHRoLCBtX3VzZUNvdW50cywgdW5zcGlsbGFibGVUbXBzKTsKLSAgICAgICAg
ICAgIGlmICghYWxsb2NhdG9yLnJlcXVpcmVzU3BpbGxpbmcoKSkgewotICAgICAgICAgICAgICAg
IGFzc2lnblJlZ2lzdGVyc1RvVG1wKGFsbG9jYXRvcik7Ci0gICAgICAgICAgICAgICAgaWYgKHRy
YWNlRGVidWcpCi0gICAgICAgICAgICAgICAgICAgIGRhdGFMb2coIlN1Y2Nlc3NmdWxsIGFsbG9j
YXRpb24gYXQgaXRlcmF0aW9uICIsIG1fbnVtSXRlcmF0aW9ucywgIjpcbiIsIG1fY29kZSk7Ci0K
LSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhZGRT
cGlsbEFuZEZpbGw8dHlwZT4oYWxsb2NhdG9yLCB1bnNwaWxsYWJsZVRtcHMpOwotICAgICAgICB9
Ci0gICAgfQotCi0gICAgdGVtcGxhdGU8QXJnOjpUeXBlIHR5cGU+Ci0gICAgSGFzaFNldDx1bnNp
Z25lZD4gY29tcHV0ZVVuc3BpbGxhYmxlVG1wcygpCi0gICAgewotICAgICAgICBIYXNoU2V0PHVu
c2lnbmVkPiB1bnNwaWxsYWJsZVRtcHM7Ci0KLSAgICAgICAgc3RydWN0IFJhbmdlIHsKLSAgICAg
ICAgICAgIHVuc2lnbmVkIGZpcnN0IHsgc3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25lZD46Om1h
eCgpIH07Ci0gICAgICAgICAgICB1bnNpZ25lZCBsYXN0IHsgMCB9OwotICAgICAgICAgICAgdW5z
aWduZWQgY291bnQgeyAwIH07Ci0gICAgICAgICAgICB1bnNpZ25lZCBhZG1pdFN0YWNrQ291bnQg
eyAwIH07Ci0gICAgICAgIH07Ci0KLSAgICAgICAgdW5zaWduZWQgbnVtVG1wcyA9IG1fY29kZS5u
dW1UbXBzKHR5cGUpOwotICAgICAgICB1bnNpZ25lZCBhcnJheVNpemUgPSBBYnNvbHV0ZVRtcE1h
cHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChudW1UbXBzKTsKLQotICAgICAgICBWZWN0b3I8UmFu
Z2UsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiByYW5nZXM7Ci0gICAgICAgIHJhbmdlcy5maWxs
KFJhbmdlKCksIGFycmF5U2l6ZSk7Ci0KLSAgICAgICAgdW5zaWduZWQgZ2xvYmFsSW5kZXggPSAw
OwotICAgICAgICBmb3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogbV9jb2RlKSB7Ci0gICAgICAgICAg
ICBmb3IgKEluc3QmIGluc3QgOiAqYmxvY2spIHsKLSAgICAgICAgICAgICAgICBpbnN0LmZvckVh
Y2hBcmcoWyZdIChBcmcmIGFyZywgQXJnOjpSb2xlLCBBcmc6OlR5cGUgYXJnVHlwZSwgQXJnOjpX
aWR0aCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYXJnLmlzVG1wKCkgJiYgaW5zdC5hZG1p
dHNTdGFjayhhcmcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnVHlwZSAhPSB0
eXBlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAg
ICAgICAgICAgICAgVG1wIHRtcCA9IGFyZy50bXAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAg
IFJhbmdlJiByYW5nZSA9IHJhbmdlc1tBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJ
bmRleCh0bXApXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmNvdW50Kys7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICByYW5nZS5hZG1pdFN0YWNrQ291bnQrKzsKLSAgICAgICAgICAg
ICAgICAgICAgICAgIGlmIChnbG9iYWxJbmRleCA8IHJhbmdlLmZpcnN0KSB7Ci0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgcmFuZ2UuZmlyc3QgPSBnbG9iYWxJbmRleDsKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICByYW5nZS5sYXN0ID0gZ2xvYmFsSW5kZXg7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZS5sYXN0
ID0gZ2xvYmFsSW5kZXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAg
ICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGFyZy5mb3JFYWNoVG1wRmFz
dChbJl0gKFRtcCYgdG1wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wLmlzR1Ao
KSAhPSAodHlwZSA9PSBBcmc6OkdQKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1
cm47Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFJhbmdlJiByYW5nZSA9IHJhbmdlc1tBYnNv
bHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh0bXApXTsKLSAgICAgICAgICAgICAg
ICAgICAgICAgIHJhbmdlLmNvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2xv
YmFsSW5kZXggPCByYW5nZS5maXJzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJh
bmdlLmZpcnN0ID0gZ2xvYmFsSW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFu
Z2UubGFzdCA9IGdsb2JhbEluZGV4OwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UubGFzdCA9IGdsb2JhbEluZGV4OwotICAg
ICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICB9KTsKLQotICAgICAgICAgICAg
ICAgICsrZ2xvYmFsSW5kZXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICArK2dsb2JhbElu
ZGV4OwotICAgICAgICB9Ci0gICAgICAgIGZvciAodW5zaWduZWQgaSA9IEFic29sdXRlVG1wTWFw
cGVyPHR5cGU+OjpsYXN0TWFjaGluZVJlZ2lzdGVySW5kZXgoKSArIDE7IGkgPCByYW5nZXMuc2l6
ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIFJhbmdlJiByYW5nZSA9IHJhbmdlc1tpXTsKLSAgICAg
ICAgICAgIGlmIChyYW5nZS5sYXN0IC0gcmFuZ2UuZmlyc3QgPD0gMSAmJiByYW5nZS5jb3VudCA+
IHJhbmdlLmFkbWl0U3RhY2tDb3VudCkKLSAgICAgICAgICAgICAgICB1bnNwaWxsYWJsZVRtcHMu
YWRkKGkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHVuc3BpbGxhYmxlVG1wczsKLSAg
ICB9Ci0KLSAgICB0ZW1wbGF0ZTxBcmc6OlR5cGUgdHlwZT4KLSAgICB2b2lkIGFzc2lnblJlZ2lz
dGVyc1RvVG1wKGNvbnN0IENvbG9yaW5nQWxsb2NhdG9yPHR5cGU+JiBhbGxvY2F0b3IpCi0gICAg
ewotICAgICAgICBmb3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogbV9jb2RlKSB7Ci0gICAgICAgICAg
ICAvLyBHaXZlIFRtcCBhIHZhbGlkIHJlZ2lzdGVyLgotICAgICAgICAgICAgZm9yICh1bnNpZ25l
ZCBpbnN0SW5kZXggPSAwOyBpbnN0SW5kZXggPCBibG9jay0+c2l6ZSgpOyArK2luc3RJbmRleCkg
ewotICAgICAgICAgICAgICAgIEluc3QmIGluc3QgPSBibG9jay0+YXQoaW5zdEluZGV4KTsKLQot
ICAgICAgICAgICAgICAgIC8vIFRoZSBtYXlCZUNvYWxlc2NhYmxlKCkgbWV0aG9kIHdpbGwgY2hh
bmdlIGl0cyBtaW5kIGZvciBzb21lIG9wZXJhdGlvbnMgYWZ0ZXIgd2UKLSAgICAgICAgICAgICAg
ICAvLyBjb21wbGV0ZSByZWdpc3RlciBhbGxvY2F0aW9uLiBTbywgd2UgcmVjb3JkIHRoaXMgYmVm
b3JlIHN0YXJ0aW5nLgotICAgICAgICAgICAgICAgIGJvb2wgbWF5QmVDb2FsZXNjYWJsZSA9IGFs
bG9jYXRvci5tYXlCZUNvYWxlc2NhYmxlKGluc3QpOwotCi0gICAgICAgICAgICAgICAgLy8gTW92
ZTMyIGlzIGNoZWFwZXIgaWYgd2Uga25vdyB0aGF0IGl0J3MgZXF1aXZhbGVudCB0byBhIE1vdmUu
IEl0J3MKLSAgICAgICAgICAgICAgICAvLyBlcXVpdmFsZW50IGlmIHRoZSBkZXN0aW5hdGlvbidz
IGhpZ2ggYml0cyBhcmUgbm90IG9ic2VydmFibGUgb3IgaWYgdGhlIHNvdXJjZSdzIGhpZ2gKLSAg
ICAgICAgICAgICAgICAvLyBiaXRzIGFyZSBhbGwgemVyby4gTm90ZSB0aGF0IHdlIGRvbid0IGhh
dmUgdGhlIG9wcG9zaXRlIG9wdGltaXphdGlvbiBmb3Igb3RoZXIKLSAgICAgICAgICAgICAgICAv
LyBhcmNoaXRlY3R1cmVzLCB3aGljaCBtYXkgcHJlZmVyIE1vdmUgb3ZlciBNb3ZlMzIsIGJlY2F1
c2UgTW92ZSBpcyBjYW5vbmljYWwgYWxyZWFkeS4KLSAgICAgICAgICAgICAgICBpZiAodHlwZSA9
PSBBcmc6OkdQICYmIGluc3Qua2luZC5vcGNvZGUgPT0gTW92ZQotICAgICAgICAgICAgICAgICAg
ICAmJiBpbnN0LmFyZ3NbMF0uaXNUbXAoKSAmJiBpbnN0LmFyZ3NbMV0uaXNUbXAoKSkgewotICAg
ICAgICAgICAgICAgICAgICBpZiAobV90bXBXaWR0aC51c2VXaWR0aChpbnN0LmFyZ3NbMV0udG1w
KCkpIDw9IEFyZzo6V2lkdGgzMgotICAgICAgICAgICAgICAgICAgICAgICAgfHwgbV90bXBXaWR0
aC5kZWZXaWR0aChpbnN0LmFyZ3NbMF0udG1wKCkpIDw9IEFyZzo6V2lkdGgzMikKLSAgICAgICAg
ICAgICAgICAgICAgICAgIGluc3Qua2luZC5vcGNvZGUgPSBNb3ZlMzI7Ci0gICAgICAgICAgICAg
ICAgfQotCi0gICAgICAgICAgICAgICAgaW5zdC5mb3JFYWNoVG1wRmFzdChbJl0gKFRtcCYgdG1w
KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0bXAuaXNSZWcoKSB8fCB0bXAuaXNHUCgpID09
ICh0eXBlICE9IEFyZzo6R1ApKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotCi0g
ICAgICAgICAgICAgICAgICAgIFRtcCBhbGlhc1RtcCA9IGFsbG9jYXRvci5nZXRBbGlhcyh0bXAp
OwotICAgICAgICAgICAgICAgICAgICBUbXAgYXNzaWduZWRUbXA7Ci0gICAgICAgICAgICAgICAg
ICAgIGlmIChhbGlhc1RtcC5pc1JlZygpKQotICAgICAgICAgICAgICAgICAgICAgICAgYXNzaWdu
ZWRUbXAgPSBUbXAoYWxpYXNUbXAucmVnKCkpOwotICAgICAgICAgICAgICAgICAgICBlbHNlIHsK
LSAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gcmVnID0gYWxsb2NhdG9yLmFsbG9jYXRlZFJl
ZyhhbGlhc1RtcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBU1NFUlQocmVnKTsKLSAgICAg
ICAgICAgICAgICAgICAgICAgIGFzc2lnbmVkVG1wID0gVG1wKHJlZyk7Ci0gICAgICAgICAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgQVNTRVJUKGFzc2lnbmVkVG1wLmlzUmVnKCkp
OwotICAgICAgICAgICAgICAgICAgICB0bXAgPSBhc3NpZ25lZFRtcDsKLSAgICAgICAgICAgICAg
ICB9KTsKLQotICAgICAgICAgICAgICAgIGlmIChtYXlCZUNvYWxlc2NhYmxlICYmIGluc3QuYXJn
c1swXS5pc1RtcCgpICYmIGluc3QuYXJnc1sxXS5pc1RtcCgpCi0gICAgICAgICAgICAgICAgICAg
ICYmIGluc3QuYXJnc1swXS50bXAoKSA9PSBpbnN0LmFyZ3NbMV0udG1wKCkpCi0gICAgICAgICAg
ICAgICAgICAgIGluc3QgPSBJbnN0KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8v
IFJlbW92ZSBhbGwgdGhlIHVzZWxlc3MgbW92ZXMgd2UgY3JlYXRlZCBpbiB0aGlzIGJsb2NrLgot
ICAgICAgICAgICAgYmxvY2stPmluc3RzKCkucmVtb3ZlQWxsTWF0Y2hpbmcoWyZdIChjb25zdCBJ
bnN0JiBpbnN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICFpbnN0OwotICAgICAgICAgICAg
fSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgdW5zaWduZWQgc3RhY2tTbG90TWlu
aW11bVdpZHRoKEFyZzo6V2lkdGggd2lkdGgpCi0gICAgewotICAgICAgICByZXR1cm4gd2lkdGgg
PD0gQXJnOjpXaWR0aDMyID8gNCA6IDg7Ci0gICAgfQotCi0gICAgdGVtcGxhdGU8QXJnOjpUeXBl
IHR5cGU+Ci0gICAgdm9pZCBhZGRTcGlsbEFuZEZpbGwoY29uc3QgQ29sb3JpbmdBbGxvY2F0b3I8
dHlwZT4mIGFsbG9jYXRvciwgSGFzaFNldDx1bnNpZ25lZD4mIHVuc3BpbGxhYmxlVG1wcykKLSAg
ICB7Ci0gICAgICAgIEhhc2hNYXA8VG1wLCBTdGFja1Nsb3QqPiBzdGFja1Nsb3RzOwotICAgICAg
ICBmb3IgKFRtcCB0bXAgOiBhbGxvY2F0b3Iuc3BpbGxlZFRtcHMoKSkgewotICAgICAgICAgICAg
Ly8gQWxsIHRoZSBzcGlsbGVkIHZhbHVlcyBiZWNvbWUgdW5zcGlsbGFibGUuCi0gICAgICAgICAg
ICB1bnNwaWxsYWJsZVRtcHMuYWRkKEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUlu
ZGV4KHRtcCkpOwotCi0gICAgICAgICAgICAvLyBBbGxvY2F0ZSBzdGFjayBzbG90IGZvciBlYWNo
IHNwaWxsZWQgdmFsdWUuCi0gICAgICAgICAgICBTdGFja1Nsb3QqIHN0YWNrU2xvdCA9IG1fY29k
ZS5hZGRTdGFja1Nsb3QoCi0gICAgICAgICAgICAgICAgc3RhY2tTbG90TWluaW11bVdpZHRoKG1f
dG1wV2lkdGgucmVxdWlyZWRXaWR0aCh0bXApKSwgU3RhY2tTbG90S2luZDo6U3BpbGwpOwotICAg
ICAgICAgICAgYm9vbCBpc05ld1RtcCA9IHN0YWNrU2xvdHMuYWRkKHRtcCwgc3RhY2tTbG90KS5p
c05ld0VudHJ5OwotICAgICAgICAgICAgQVNTRVJUX1VOVVNFRChpc05ld1RtcCwgaXNOZXdUbXAp
OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmV3cml0ZSB0aGUgcHJvZ3JhbSB0byBnZXQgcmlk
IG9mIHRoZSBzcGlsbGVkIFRtcC4KLSAgICAgICAgSW5zZXJ0aW9uU2V0IGluc2VydGlvblNldCht
X2NvZGUpOwotICAgICAgICBmb3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogbV9jb2RlKSB7Ci0gICAg
ICAgICAgICBib29sIGhhc0FsaWFzZWRUbXBzID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIGZvciAo
dW5zaWduZWQgaW5zdEluZGV4ID0gMDsgaW5zdEluZGV4IDwgYmxvY2stPnNpemUoKTsgKytpbnN0
SW5kZXgpIHsKLSAgICAgICAgICAgICAgICBJbnN0JiBpbnN0ID0gYmxvY2stPmF0KGluc3RJbmRl
eCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBUaGUgVG1wV2lkdGggYW5hbHlzaXMgd2lsbCBzYXkg
dGhhdCBhIE1vdmUgb25seSBzdG9yZXMgMzIgYml0cyBpbnRvIHRoZSBkZXN0aW5hdGlvbiwKLSAg
ICAgICAgICAgICAgICAvLyBpZiB0aGUgc291cmNlIG9ubHkgaGFkIDMyIGJpdHMgd29ydGggb2Yg
bm9uLXplcm8gYml0cy4gU2FtZSBmb3IgdGhlIHNvdXJjZTogaXQgd2lsbAotICAgICAgICAgICAg
ICAgIC8vIG9ubHkgY2xhaW0gdG8gcmVhZCAzMiBiaXRzIGZyb20gdGhlIHNvdXJjZSBpZiBvbmx5
IDMyIGJpdHMgb2YgdGhlIGRlc3RpbmF0aW9uIGFyZQotICAgICAgICAgICAgICAgIC8vIHJlYWQu
IE5vdGUgdGhhdCB3ZSBvbmx5IGFwcGx5IHRoaXMgbG9naWMgaWYgdGhpcyB0dXJucyBpbnRvIGEg
bG9hZCBvciBzdG9yZSwgc2luY2UKLSAgICAgICAgICAgICAgICAvLyBNb3ZlIGlzIHRoZSBjYW5v
bmljYWwgd2F5IHRvIG1vdmUgZGF0YSBiZXR3ZWVuIEdQUnMuCi0gICAgICAgICAgICAgICAgYm9v
bCBjYW5Vc2VNb3ZlMzJJZkRpZFNwaWxsID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgYm9vbCBk
aWRTcGlsbCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGlmICh0eXBlID09IEFyZzo6R1AgJiYg
aW5zdC5raW5kLm9wY29kZSA9PSBNb3ZlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoaW5z
dC5hcmdzWzBdLmlzVG1wKCkgJiYgbV90bXBXaWR0aC53aWR0aChpbnN0LmFyZ3NbMF0udG1wKCkp
IDw9IEFyZzo6V2lkdGgzMikKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IChpbnN0LmFyZ3Nb
MV0uaXNUbXAoKSAmJiBtX3RtcFdpZHRoLndpZHRoKGluc3QuYXJnc1sxXS50bXAoKSkgPD0gQXJn
OjpXaWR0aDMyKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhblVzZU1vdmUzMklmRGlkU3Bp
bGwgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFRyeSB0
byByZXBsYWNlIHRoZSByZWdpc3RlciB1c2UgYnkgbWVtb3J5IHVzZSB3aGVuIHBvc3NpYmxlLgot
ICAgICAgICAgICAgICAgIGluc3QuZm9yRWFjaEFyZygKLSAgICAgICAgICAgICAgICAgICAgWyZd
IChBcmcmIGFyZywgQXJnOjpSb2xlIHJvbGUsIEFyZzo6VHlwZSBhcmdUeXBlLCBBcmc6OldpZHRo
IHdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFyZy5pc1RtcCgpKQotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAg
IGlmIChhcmdUeXBlICE9IHR5cGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJu
OwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZy5pc1JlZygpKQotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAg
ICAgICAgICAgICAgICAgICAgYXV0byBzdGFja1Nsb3RFbnRyeSA9IHN0YWNrU2xvdHMuZmluZChh
cmcudG1wKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrU2xvdEVudHJ5ID09
IHN0YWNrU2xvdHMuZW5kKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwot
ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnN0LmFkbWl0c1N0YWNrKGFyZykpCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAg
Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgVG1wIGhvbGRzIGEgY29uc3RhbnQg
dGhlbiB3ZSB3YW50IHRvIHJlbWF0ZXJpYWxpemUgaXRzCi0gICAgICAgICAgICAgICAgICAgICAg
ICAvLyB2YWx1ZSByYXRoZXIgdGhhbiBsb2FkaW5nIGl0IGZyb20gdGhlIHN0YWNrLiBJbiBvcmRl
ciBmb3IgdGhhdAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW1pemF0aW9uIHRvIGtp
Y2sgaW4sIHdlIG5lZWQgdG8gYXZvaWQgcGxhY2luZyB0aGUgVG1wJ3Mgc3RhY2sKLSAgICAgICAg
ICAgICAgICAgICAgICAgIC8vIGFkZHJlc3MgaW50byB0aGUgaW5zdHJ1Y3Rpb24uCi0gICAgICAg
ICAgICAgICAgICAgICAgICBpZiAoIUFyZzo6aXNDb2xkVXNlKHJvbGUpKSB7Ci0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgY29uc3QgVXNlQ291bnRzPFRtcD46OkNvdW50cyogY291bnRzID0g
bV91c2VDb3VudHNbYXJnLnRtcCgpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAo
Y291bnRzICYmIGNvdW50cy0+bnVtQ29uc3REZWZzID09IDEgJiYgY291bnRzLT5udW1EZWZzID09
IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAg
ICAgICAgICAgQXJnOjpXaWR0aCBzcGlsbFdpZHRoID0gbV90bXBXaWR0aC5yZXF1aXJlZFdpZHRo
KGFyZy50bXAoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJnOjppc0FueURlZihy
b2xlKSAmJiB3aWR0aCA8IHNwaWxsV2lkdGgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
cmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgQVNTRVJUKGluc3Qua2luZC5vcGNvZGUg
PT0gTW92ZSB8fCAhKEFyZzo6aXNBbnlVc2Uocm9sZSkgJiYgd2lkdGggPiBzcGlsbFdpZHRoKSk7
Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChz
cGlsbFdpZHRoICE9IEFyZzo6V2lkdGgzMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBj
YW5Vc2VNb3ZlMzJJZkRpZFNwaWxsID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAK
LSAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrU2xvdEVudHJ5LT52YWx1ZS0+ZW5zdXJlU2l6
ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5Vc2VNb3ZlMzJJZkRpZFNwaWxsID8g
NCA6IEFyZzo6Ynl0ZXMod2lkdGgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IEFy
Zzo6c3RhY2soc3RhY2tTbG90RW50cnktPnZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAg
IGRpZFNwaWxsID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAg
ICAgICBpZiAoZGlkU3BpbGwgJiYgY2FuVXNlTW92ZTMySWZEaWRTcGlsbCkKLSAgICAgICAgICAg
ICAgICAgICAgaW5zdC5raW5kLm9wY29kZSA9IE1vdmUzMjsKLQotICAgICAgICAgICAgICAgIC8v
IEZvciBldmVyeSBvdGhlciBjYXNlLCBhZGQgTG9hZC9TdG9yZSBhcyBuZWVkZWQuCi0gICAgICAg
ICAgICAgICAgaW5zdC5mb3JFYWNoVG1wKFsmXSAoVG1wJiB0bXAsIEFyZzo6Um9sZSByb2xlLCBB
cmc6OlR5cGUgYXJnVHlwZSwgQXJnOjpXaWR0aCkgewotICAgICAgICAgICAgICAgICAgICBpZiAo
dG1wLmlzUmVnKCkgfHwgYXJnVHlwZSAhPSB0eXBlKQotICAgICAgICAgICAgICAgICAgICAgICAg
cmV0dXJuOwotCi0gICAgICAgICAgICAgICAgICAgIGF1dG8gc3RhY2tTbG90RW50cnkgPSBzdGFj
a1Nsb3RzLmZpbmQodG1wKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrU2xvdEVudHJ5
ID09IHN0YWNrU2xvdHMuZW5kKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFRtcCBhbGlh
cyA9IGFsbG9jYXRvci5nZXRBbGlhc1doZW5TcGlsbGluZyh0bXApOwotICAgICAgICAgICAgICAg
ICAgICAgICAgaWYgKGFsaWFzICE9IHRtcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHRtcCA9IGFsaWFzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0FsaWFzZWRUbXBz
ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAg
ICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAg
IEFyZzo6V2lkdGggc3BpbGxXaWR0aCA9IG1fdG1wV2lkdGgucmVxdWlyZWRXaWR0aCh0bXApOwot
ICAgICAgICAgICAgICAgICAgICBPcGNvZGUgbW92ZSA9IE9vcHM7Ci0gICAgICAgICAgICAgICAg
ICAgIHN3aXRjaCAoc3RhY2tTbG90TWluaW11bVdpZHRoKHNwaWxsV2lkdGgpKSB7Ci0gICAgICAg
ICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vdmUgPSB0eXBl
ID09IEFyZzo6R1AgPyBNb3ZlMzIgOiBNb3ZlRmxvYXQ7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgICAgICAg
ICAgICAgbW92ZSA9IHR5cGUgPT0gQXJnOjpHUCA/IE1vdmUgOiBNb3ZlRG91YmxlOwotICAgICAg
ICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0g
ICAgICAgICAgICAgICAgICAgICAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAg
ICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAg
ICAgICAgICAgICAgICAgICB0bXAgPSBtX2NvZGUubmV3VG1wKHR5cGUpOwotICAgICAgICAgICAg
ICAgICAgICB1bnNwaWxsYWJsZVRtcHMuYWRkKEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNv
bHV0ZUluZGV4KHRtcCkpOwotCi0gICAgICAgICAgICAgICAgICAgIEFyZyBhcmcgPSBBcmc6OnN0
YWNrKHN0YWNrU2xvdEVudHJ5LT52YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChBcmc6
OmlzQW55VXNlKHJvbGUpICYmIHJvbGUgIT0gQXJnOjpTY3JhdGNoKQotICAgICAgICAgICAgICAg
ICAgICAgICAgaW5zZXJ0aW9uU2V0Lmluc2VydChpbnN0SW5kZXgsIG1vdmUsIGluc3Qub3JpZ2lu
LCBhcmcsIHRtcCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChBcmc6OmlzQW55RGVmKHJvbGUp
KQotICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0aW9uU2V0Lmluc2VydChpbnN0SW5kZXgg
KyAxLCBtb3ZlLCBpbnN0Lm9yaWdpbiwgdG1wLCBhcmcpOwotICAgICAgICAgICAgICAgIH0pOwot
ICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5zZXJ0aW9uU2V0LmV4ZWN1dGUoYmxvY2spOwot
Ci0gICAgICAgICAgICBpZiAoaGFzQWxpYXNlZFRtcHMpIHsKLSAgICAgICAgICAgICAgICBibG9j
ay0+aW5zdHMoKS5yZW1vdmVBbGxNYXRjaGluZyhbJl0gKGNvbnN0IEluc3QmIGluc3QpIHsKLSAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuIGFsbG9jYXRvci5pc1VzZWxlc3NNb3ZlKGluc3QpOwot
ICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0g
ICAgdm9pZCBmaXhTcGlsbHNBZnRlclRlcm1pbmFscygpCi0gICAgewotICAgICAgICAvLyBCZWNh
dXNlIHRoZXJlIG1heSBiZSB0ZXJtaW5hbHMgdGhhdCBwcm9kdWNlIHZhbHVlcywgSVJDIG1heQot
ICAgICAgICAvLyB3YW50IHRvIHNwaWxsIHRob3NlIHRlcm1pbmFscy4gSXQnbGwgaGFwcGVuIHRv
IHNwaWxsIGl0IGFmdGVyCi0gICAgICAgIC8vIHRoZSB0ZXJtaW5hbC4gSWYgd2UgbGVmdCB0aGUg
Z3JhcGggaW4gdGhpcyBzdGF0ZSwgaXQnZCBiZSBpbnZhbGlkCi0gICAgICAgIC8vIGJlY2F1c2Ug
YSB0ZXJtaW5hbCBtdXN0IGJlIHRoZSBsYXN0IGluc3RydWN0aW9uIGluIGEgYmxvY2suCi0gICAg
ICAgIC8vIFdlIGZpeCB0aGF0IGhlcmUuCi0KLSAgICAgICAgSW5zZXJ0aW9uU2V0IGluc2VydGlv
blNldChtX2NvZGUpOwotCi0gICAgICAgIGJvb2wgYWRkZWRCbG9ja3MgPSBmYWxzZTsKLQotICAg
ICAgICBmb3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogbV9jb2RlKSB7Ci0gICAgICAgICAgICB1bnNp
Z25lZCB0ZXJtaW5hbEluZGV4ID0gYmxvY2stPnNpemUoKTsKLSAgICAgICAgICAgIGJvb2wgZm91
bmRUZXJtaW5hbCA9IGZhbHNlOwotICAgICAgICAgICAgd2hpbGUgKHRlcm1pbmFsSW5kZXgtLSkg
ewotICAgICAgICAgICAgICAgIGlmIChibG9jay0+YXQodGVybWluYWxJbmRleCkuaXNUZXJtaW5h
bCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvdW5kVGVybWluYWwgPSB0cnVlOwotICAgICAg
ICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0g
ICAgICAgICAgICBBU1NFUlRfVU5VU0VEKGZvdW5kVGVybWluYWwsIGZvdW5kVGVybWluYWwpOwot
Ci0gICAgICAgICAgICBpZiAodGVybWluYWxJbmRleCA9PSBibG9jay0+c2l6ZSgpIC0gMSkKLSAg
ICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgLy8gVGhlcmUgbXVzdCBiZSBp
bnN0cnVjdGlvbnMgYWZ0ZXIgdGhlIHRlcm1pbmFsIGJlY2F1c2UgaXQncyBub3QgdGhlIGxhc3Qg
aW5zdHJ1Y3Rpb24uCi0gICAgICAgICAgICBBU1NFUlQodGVybWluYWxJbmRleCA8IGJsb2NrLT5z
aXplKCkgLSAxKTsKLSAgICAgICAgICAgIFZlY3RvcjxJbnN0LCAxPiBpbnN0c1RvTW92ZTsKLSAg
ICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IHRlcm1pbmFsSW5kZXggKyAxOyBpIDwgYmxvY2st
PnNpemUoKTsgaSsrKQotICAgICAgICAgICAgICAgIGluc3RzVG9Nb3ZlLmFwcGVuZChibG9jay0+
YXQoaSkpOwotICAgICAgICAgICAgUkVMRUFTRV9BU1NFUlQoaW5zdHNUb01vdmUuc2l6ZSgpKTsK
LQotICAgICAgICAgICAgZm9yIChGcmVxdWVudGVkQmxvY2smIGZyZXF1ZW50ZWRTdWNjZXNzb3Ig
OiBibG9jay0+c3VjY2Vzc29ycygpKSB7Ci0gICAgICAgICAgICAgICAgQmFzaWNCbG9jayogc3Vj
Y2Vzc29yID0gZnJlcXVlbnRlZFN1Y2Nlc3Nvci5ibG9jaygpOwotICAgICAgICAgICAgICAgIC8v
IElmIHN1Y2Nlc3NvcidzIG9ubHkgcHJlZGVjZXNzb3IgaXMgYmxvY2ssIHdlIGNhbiBwbGFudCB0
aGUgc3BpbGwgaW5zaWRlCi0gICAgICAgICAgICAgICAgLy8gdGhlIHN1Y2Nlc3Nvci4gT3RoZXJ3
aXNlLCB3ZSBtdXN0IHNwbGl0IHRoZSBjcml0aWNhbCBlZGdlIGFuZCBjcmVhdGUKLSAgICAgICAg
ICAgICAgICAvLyBhIG5ldyBibG9jayBmb3IgdGhlIHNwaWxsLgotICAgICAgICAgICAgICAgIGlm
IChzdWNjZXNzb3ItPm51bVByZWRlY2Vzc29ycygpID09IDEpIHsKLSAgICAgICAgICAgICAgICAg
ICAgaW5zZXJ0aW9uU2V0Lmluc2VydEluc3RzKDAsIGluc3RzVG9Nb3ZlKTsKLSAgICAgICAgICAg
ICAgICAgICAgaW5zZXJ0aW9uU2V0LmV4ZWN1dGUoc3VjY2Vzc29yKTsKLSAgICAgICAgICAgICAg
ICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhZGRlZEJsb2NrcyA9IHRydWU7Ci0gICAg
ICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBXZSBwcm9iYWJseSB3YW50IGJldHRlciBibG9jayBv
cmRlcmluZyBoZXJlLgotICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrKiBuZXdCbG9jayA9
IG1fY29kZS5hZGRCbG9jaygpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IEluc3Qm
IGluc3QgOiBpbnN0c1RvTW92ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Jsb2NrLT5h
cHBlbmRJbnN0KGluc3QpOwotICAgICAgICAgICAgICAgICAgICBuZXdCbG9jay0+YXBwZW5kSW5z
dChJbnN0KEp1bXAsIGluc3RzVG9Nb3ZlLmxhc3QoKS5vcmlnaW4pKTsKLSAgICAgICAgICAgICAg
ICAgICAgbmV3QmxvY2stPnN1Y2Nlc3NvcnMoKS5hcHBlbmQoc3VjY2Vzc29yKTsKLSAgICAgICAg
ICAgICAgICAgICAgZnJlcXVlbnRlZFN1Y2Nlc3Nvci5ibG9jaygpID0gbmV3QmxvY2s7Ci0gICAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBibG9jay0+cmVzaXpl
KHRlcm1pbmFsSW5kZXggKyAxKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhZGRlZEJsb2Nr
cykKLSAgICAgICAgICAgIG1fY29kZS5yZXNldFJlYWNoYWJpbGl0eSgpOwotICAgIH0KLQotICAg
IENvZGUmIG1fY29kZTsKLSAgICBUbXBXaWR0aCBtX3RtcFdpZHRoOwotICAgIFVzZUNvdW50czxU
bXA+IG1fdXNlQ291bnRzOwotICAgIHVuc2lnbmVkIG1fbnVtSXRlcmF0aW9ucyB7IDAgfTsKLX07
Ci0KLX0gLy8gYW5vbnltb3VzIG5hbWVzcGFjZQotCi12b2lkIGl0ZXJhdGVkUmVnaXN0ZXJDb2Fs
ZXNjaW5nKENvZGUmIGNvZGUpCi17Ci0gICAgUGhhc2VTY29wZSBwaGFzZVNjb3BlKGNvZGUsICJp
dGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZyIpOwotICAgIAotICAgIEl0ZXJhdGVkUmVnaXN0ZXJD
b2FsZXNjaW5nIGl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nKGNvZGUpOwotICAgIGl0ZXJhdGVk
UmVnaXN0ZXJDb2FsZXNjaW5nLnJ1bigpOwotfQotCi19IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpC
Mzo6QWlyCi0KLSNlbmRpZiAvLyBFTkFCTEUoQjNfSklUKQpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL2Fpci9BaXJJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxl
c2NpbmcuaAkocmV2aXNpb24gMjEyNzk3KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fp
ci9BaXJJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5oCShub25leGlzdGVudCkKQEAgLTEsNDAg
KzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0g
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
LSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0g
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgotICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCi0gKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLSAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKLSAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNw
cmFnbWEgb25jZQotCi0jaWYgRU5BQkxFKEIzX0pJVCkKLQotbmFtZXNwYWNlIEpTQyB7IG5hbWVz
cGFjZSBCMyB7IG5hbWVzcGFjZSBBaXIgewotCi1jbGFzcyBDb2RlOwotCi0vLyBUaGlzIGlzIGEg
cmVnaXN0ZXIgYWxsb2NhdGlvbiBwaGFzZSBiYXNlZCBvbiBBbmRyZXcgQXBwZWwncyBJdGVyYXRl
ZCBSZWdpc3RlciBDb2FsZXNjaW5nCi0vLyBodHRwOi8vd3d3LmNzLmNtdS5lZHUvYWZzL2NzL2Fj
YWRlbWljL2NsYXNzLzE1NzQ1LXMwNy93d3cvcGFwZXJzL2dlb3JnZS5wZGYKLXZvaWQgaXRlcmF0
ZWRSZWdpc3RlckNvYWxlc2NpbmcoQ29kZSYpOwotCi19IH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpC
Mzo6QWlyCi0KLSNlbmRpZiAvLyBFTkFCTEUoQjNfSklUKQpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL3J1bnRpbWUvT3B0aW9ucy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9ydW50aW1lL09wdGlvbnMuaAkocmV2aXNpb24gMjEyNzk3KQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL3J1bnRpbWUvT3B0aW9ucy5oCSh3b3JraW5nIGNvcHkpCkBAIC0zOTMsNiArMzkz
LDggQEAgdHlwZWRlZiBjb25zdCBjaGFyKiBvcHRpb25TdHJpbmc7CiAgICAgdihib29sLCBsb2dC
M1BoYXNlVGltZXMsIGZhbHNlLCBOb3JtYWwsIG51bGxwdHIpIFwKICAgICB2KGRvdWJsZSwgcmFy
ZUJsb2NrUGVuYWx0eSwgMC4wMDEsIE5vcm1hbCwgbnVsbHB0cikgXAogICAgIHYoYm9vbCwgYWly
U3BpbGxzRXZlcnl0aGluZywgZmFsc2UsIE5vcm1hbCwgbnVsbHB0cikgXAorICAgIHYoYm9vbCwg
YWlyRm9yY2VCcmlnZ3NBbGxvY2F0b3IsIGZhbHNlLCBOb3JtYWwsIG51bGxwdHIpIFwKKyAgICB2
KGJvb2wsIGFpckZvcmNlSVJDQWxsb2NhdG9yLCBmYWxzZSwgTm9ybWFsLCBudWxscHRyKSBcCiAg
ICAgdihib29sLCBsb2dBaXJSZWdpc3RlclByZXNzdXJlLCBmYWxzZSwgTm9ybWFsLCBudWxscHRy
KSBcCiAgICAgdih1bnNpZ25lZCwgbWF4QjNUYWlsRHVwQmxvY2tTaXplLCAzLCBOb3JtYWwsIG51
bGxwdHIpIFwKICAgICB2KHVuc2lnbmVkLCBtYXhCM1RhaWxEdXBCbG9ja1N1Y2Nlc3NvcnMsIDMs
IE5vcm1hbCwgbnVsbHB0cikgXApJbmRleDogVG9vbHMvU2NyaXB0cy9ydW4tanNjLXN0cmVzcy10
ZXN0cwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBUb29scy9TY3JpcHRzL3J1bi1qc2Mtc3RyZXNzLXRlc3RzCShy
ZXZpc2lvbiAyMTI3OTcpCisrKyBUb29scy9TY3JpcHRzL3J1bi1qc2Mtc3RyZXNzLXRlc3RzCSh3
b3JraW5nIGNvcHkpCkBAIC04NTQsMTUgKzg1NCwxNSBAQCBkZWYgcnVuRlRMTm9DSklUKCpvcHRp
b25hbFRlc3RTcGVjaWZpY09wCiBlbmQKIAogZGVmIHJ1bkZUTE5vQ0pJVFZhbGlkYXRlKCpvcHRp
b25hbFRlc3RTcGVjaWZpY09wdGlvbnMpCi0gICAgcnVuKCJmdGwtbm8tY2ppdC12YWxpZGF0ZS1z
YW1wbGluZy1wcm9maWxlciIsICItLXZhbGlkYXRlR3JhcGg9dHJ1ZSIsICItLXVzZVNhbXBsaW5n
UHJvZmlsZXI9dHJ1ZSIsICooRlRMX09QVElPTlMgKyBOT19DSklUX09QVElPTlMgKyBvcHRpb25h
bFRlc3RTcGVjaWZpY09wdGlvbnMpKQorICAgIHJ1bigiZnRsLW5vLWNqaXQtdmFsaWRhdGUtc2Ft
cGxpbmctcHJvZmlsZXIiLCAiLS12YWxpZGF0ZUdyYXBoPXRydWUiLCAiLS11c2VTYW1wbGluZ1By
b2ZpbGVyPXRydWUiLCAiLS1haXJGb3JjZUlSQ0FsbG9jYXRvcj10cnVlIiwgKihGVExfT1BUSU9O
UyArIE5PX0NKSVRfT1BUSU9OUyArIG9wdGlvbmFsVGVzdFNwZWNpZmljT3B0aW9ucykpCiBlbmQK
IAogZGVmIHJ1bkZUTE5vQ0pJVE5vUHV0U3RhY2tWYWxpZGF0ZSgqb3B0aW9uYWxUZXN0U3BlY2lm
aWNPcHRpb25zKQotICAgIHJ1bigiZnRsLW5vLWNqaXQtbm8tcHV0LXN0YWNrLXZhbGlkYXRlIiwg
Ii0tdmFsaWRhdGVHcmFwaD10cnVlIiwgIi0tdXNlUHV0U3RhY2tTaW5raW5nPWZhbHNlIiwgKihG
VExfT1BUSU9OUyArIE5PX0NKSVRfT1BUSU9OUyArIG9wdGlvbmFsVGVzdFNwZWNpZmljT3B0aW9u
cykpCisgICAgcnVuKCJmdGwtbm8tY2ppdC1uby1wdXQtc3RhY2stdmFsaWRhdGUiLCAiLS12YWxp
ZGF0ZUdyYXBoPXRydWUiLCAiLS11c2VQdXRTdGFja1Npbmtpbmc9ZmFsc2UiLCAiLS1haXJGb3Jj
ZUlSQ0FsbG9jYXRvcj10cnVlIiwgKihGVExfT1BUSU9OUyArIE5PX0NKSVRfT1BUSU9OUyArIG9w
dGlvbmFsVGVzdFNwZWNpZmljT3B0aW9ucykpCiBlbmQKIAogZGVmIHJ1bkZUTE5vQ0pJVE5vSW5s
aW5lVmFsaWRhdGUoKm9wdGlvbmFsVGVzdFNwZWNpZmljT3B0aW9ucykKLSAgICBydW4oImZ0bC1u
by1jaml0LW5vLWlubGluZS12YWxpZGF0ZSIsICItLXZhbGlkYXRlR3JhcGg9dHJ1ZSIsICItLW1h
eGltdW1JbmxpbmluZ0RlcHRoPTEiLCAqKEZUTF9PUFRJT05TICsgTk9fQ0pJVF9PUFRJT05TICsg
b3B0aW9uYWxUZXN0U3BlY2lmaWNPcHRpb25zKSkKKyAgICBydW4oImZ0bC1uby1jaml0LW5vLWlu
bGluZS12YWxpZGF0ZSIsICItLXZhbGlkYXRlR3JhcGg9dHJ1ZSIsICItLW1heGltdW1Jbmxpbmlu
Z0RlcHRoPTEiLCAiLS1haXJGb3JjZUJyaWdnc0FsbG9jYXRvcj10cnVlIiwgKihGVExfT1BUSU9O
UyArIE5PX0NKSVRfT1BUSU9OUyArIG9wdGlvbmFsVGVzdFNwZWNpZmljT3B0aW9ucykpCiBlbmQK
IAogZGVmIHJ1bkZUTE5vQ0pJVE9TUlZhbGlkYXRpb24oKm9wdGlvbmFsVGVzdFNwZWNpZmljT3B0
aW9ucykKQEAgLTg3OCwxMSArODc4LDExIEBAIGRlZiBydW5ERkdFYWdlck5vQ0pJVFZhbGlkYXRl
KCpvcHRpb25hbFQKIGVuZAogCiBkZWYgcnVuRlRMRWFnZXIoKm9wdGlvbmFsVGVzdFNwZWNpZmlj
T3B0aW9ucykKLSAgICBydW4oImZ0bC1lYWdlciIsICooRlRMX09QVElPTlMgKyBFQUdFUl9PUFRJ
T05TICsgQ09MTEVDVF9DT05USU5VT1VTTFlfT1BUSU9OUyArIG9wdGlvbmFsVGVzdFNwZWNpZmlj
T3B0aW9ucykpCisgICAgcnVuKCJmdGwtZWFnZXIiLCAiLS1haXJGb3JjZUlSQ0FsbG9jYXRvcj10
cnVlIiwgKihGVExfT1BUSU9OUyArIEVBR0VSX09QVElPTlMgKyBDT0xMRUNUX0NPTlRJTlVPVVNM
WV9PUFRJT05TICsgb3B0aW9uYWxUZXN0U3BlY2lmaWNPcHRpb25zKSkKIGVuZAogCiBkZWYgcnVu
RlRMRWFnZXJOb0NKSVRWYWxpZGF0ZSgqb3B0aW9uYWxUZXN0U3BlY2lmaWNPcHRpb25zKQotICAg
IHJ1bigiZnRsLWVhZ2VyLW5vLWNqaXQiLCAiLS12YWxpZGF0ZUdyYXBoPXRydWUiLCAqKEZUTF9P
UFRJT05TICsgTk9fQ0pJVF9PUFRJT05TICsgRUFHRVJfT1BUSU9OUyArIENPTExFQ1RfQ09OVElO
VU9VU0xZX09QVElPTlMgKyBvcHRpb25hbFRlc3RTcGVjaWZpY09wdGlvbnMpKQorICAgIHJ1bigi
ZnRsLWVhZ2VyLW5vLWNqaXQiLCAiLS12YWxpZGF0ZUdyYXBoPXRydWUiLCAiLS1haXJGb3JjZUJy
aWdnc0FsbG9jYXRvcj10cnVlIiwgKihGVExfT1BUSU9OUyArIE5PX0NKSVRfT1BUSU9OUyArIEVB
R0VSX09QVElPTlMgKyBDT0xMRUNUX0NPTlRJTlVPVVNMWV9PUFRJT05TICsgb3B0aW9uYWxUZXN0
U3BlY2lmaWNPcHRpb25zKSkKIGVuZAogCiBkZWYgcnVuRlRMRWFnZXJOb0NKSVRPU1JWYWxpZGF0
aW9uKCpvcHRpb25hbFRlc3RTcGVjaWZpY09wdGlvbnMpCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>302359</attachid>
            <date>2017-02-21 20:06:50 -0800</date>
            <delta_ts>2017-02-21 20:06:50 -0800</delta_ts>
            <desc>patch for landing testing gtk to see if it builds v3</desc>
            <filename>c-backup.diff</filename>
            <type>text/plain</type>
            <size>220589</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DTWFrZUxpc3RzLnR4dAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvQ01ha2VMaXN0cy50eHQJKHJldmlzaW9uIDIxMjc5NykK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DTWFrZUxpc3RzLnR4dAkod29ya2luZyBjb3B5KQpA
QCAtODcsMTAgKzg3LDEwIEBAIHNldChKYXZhU2NyaXB0Q29yZV9TT1VSQ0VTCiAgICAgYjMvYWly
L0FpckZpeFBhcnRpYWxSZWdpc3RlclN0YWxscy5jcHAKICAgICBiMy9haXIvQWlyR2VuZXJhdGUu
Y3BwCiAgICAgYjMvYWlyL0FpckdlbmVyYXRlZC5jcHAKKyAgICBiMy9haXIvQWlyR3JhcGhDb2xv
cmluZy5jcHAKICAgICBiMy9haXIvQWlySGFuZGxlQ2FsbGVlU2F2ZXMuY3BwCiAgICAgYjMvYWly
L0Fpckluc2VydGlvblNldC5jcHAKICAgICBiMy9haXIvQWlySW5zdC5jcHAKLSAgICBiMy9haXIv
QWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuY3BwCiAgICAgYjMvYWlyL0FpcktpbmQuY3Bw
CiAgICAgYjMvYWlyL0FpckxvZ1JlZ2lzdGVyUHJlc3N1cmUuY3BwCiAgICAgYjMvYWlyL0Fpckxv
d2VyQWZ0ZXJSZWdBbGxvYy5jcHAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2Ny
aXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShy
ZXZpc2lvbiAyMTI3OTcpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUu
eGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29ya2luZyBjb3B5KQpAQCAtMTIzOSw4ICsxMjM5
LDYgQEAKIAkJMjYwMEI1QTcxNTJCQUFBNzAwOTFFRTVGIC8qIEpTU3RyaW5nSm9pbmVyLmggaW4g
SGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyNjAwQjVBNTE1MkJB
QUE3MDA5MUVFNUYgLyogSlNTdHJpbmdKb2luZXIuaCAqLzsgfTsKIAkJMjYyRDg1QjYxQzBENjUw
RjAwNkFDQjYxIC8qIEFpckZpeFBhcnRpYWxSZWdpc3RlclN0YWxscy5jcHAgaW4gU291cmNlcyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyNjJEODVCNDFDMEQ2NTBGMDA2QUNC
NjEgLyogQWlyRml4UGFydGlhbFJlZ2lzdGVyU3RhbGxzLmNwcCAqLzsgfTsKIAkJMjYyRDg1Qjcx
QzBENjUwRjAwNkFDQjYxIC8qIEFpckZpeFBhcnRpYWxSZWdpc3RlclN0YWxscy5oIGluIEhlYWRl
cnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMjYyRDg1QjUxQzBENjUwRjAw
NkFDQjYxIC8qIEFpckZpeFBhcnRpYWxSZWdpc3RlclN0YWxscy5oICovOyB9OwotCQkyNjcxOEJB
NDFCRTk5Rjc4MDA1MjAxN0IgLyogQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuY3BwIGlu
IFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMjY3MThCQTIxQkU5
OUY3ODAwNTIwMTdCIC8qIEFpckl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nLmNwcCAqLzsgfTsK
LQkJMjY3MThCQTUxQkU5OUY3ODAwNTIwMTdCIC8qIEFpckl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNj
aW5nLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyNjcx
OEJBMzFCRTk5Rjc4MDA1MjAxN0IgLyogQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuaCAq
LzsgfTsKIAkJMjY4NEQ0MzgxQzAwMTYxQzAwODFENjYzIC8qIEFpckxpdmVuZXNzLmggaW4gSGVh
ZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyNjg0RDQzNzFDMDAxNjFD
MDA4MUQ2NjMgLyogQWlyTGl2ZW5lc3MuaCAqLzsgfTsKIAkJMjY5RDYzNkUxQkZCRTVEMTAwMTAx
QjFEIC8qIEZUTE91dHB1dC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBm
aWxlUmVmID0gMjY5RDYzNkQxQkZCRTVEMDAwMTAxQjFEIC8qIEZUTE91dHB1dC5oICovOyB9Owog
CQkyQTA1QUJENTE5NjFERjI0MDAzNDE3NTAgLyogSlNQcm9wZXJ0eU5hbWVFbnVtZXJhdG9yLmNw
cCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDJBMDVBQkQz
MTk2MURGMjQwMDM0MTc1MCAvKiBKU1Byb3BlcnR5TmFtZUVudW1lcmF0b3IuY3BwICovOyB9OwpA
QCAtMTQ1Myw2ICsxNDUxLDggQEAKIAkJNzk1QjE5OTgxRDc4QkUzNTAwMjYyRkEwIC8qIE1hcEJh
c2UuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDc5NUIx
OTk2MUQ3OEJFMzUwMDI2MkZBMCAvKiBNYXBCYXNlLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVU
RVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJNzk1RjA5OUQxRTAzNjAwNTAwQkJFMzdGIC8qIEIz
Q29tcGlsZS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYg
PSA3OTVGMDk5QzFFMDM2MDA1MDBCQkUzN0YgLyogQjNDb21waWxlLmNwcCAqLzsgfTsKIAkJNzk2
NDY1NkExQjk1MkZGMDAwMzA1OUVFIC8qIEdldFB1dEluZm8uaCBpbiBIZWFkZXJzICovID0ge2lz
YSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDc5NjQ2NTY4MUI5NTJGRjAwMDMwNTlFRSAvKiBH
ZXRQdXRJbmZvLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsg
fTsKKwkJNzk2NUExMTkxRTVEM0ZGRTAwMUJBNTBEIC8qIEFpckdyYXBoQ29sb3JpbmcuY3BwIGlu
IFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNzk2NUExMTcxRTVE
M0ZGRTAwMUJBNTBEIC8qIEFpckdyYXBoQ29sb3JpbmcuY3BwICovOyB9OworCQk3OTY1QTExQTFF
NUQzRkZFMDAxQkE1MEQgLyogQWlyR3JhcGhDb2xvcmluZy5oIGluIEhlYWRlcnMgKi8gPSB7aXNh
ID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNzk2NUExMTgxRTVEM0ZGRTAwMUJBNTBEIC8qIEFp
ckdyYXBoQ29sb3JpbmcuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCAp
OyB9OyB9OwogCQk3OTZGQjQzQTFERkY4QzNGMDAzOUM5NUQgLyogSlNXZWJBc3NlbWJseUhlbHBl
cnMuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDc5NkZC
NDM5MURGRjhDM0YwMDM5Qzk1RCAvKiBKU1dlYkFzc2VtYmx5SGVscGVycy5oICovOyBzZXR0aW5n
cyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCTc5N0UwN0E5MUI4RkNGQjkw
MDg0MDBCQSAvKiBKU0dsb2JhbExleGljYWxFbnZpcm9ubWVudC5jcHAgaW4gU291cmNlcyAqLyA9
IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA3OTdFMDdBNzFCOEZDRkI5MDA4NDAwQkEg
LyogSlNHbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQuY3BwICovOyB9OwogCQk3OTdFMDdBQTFCOEZD
RkI5MDA4NDAwQkEgLyogSlNHbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQuaCBpbiBIZWFkZXJzICov
ID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDc5N0UwN0E4MUI4RkNGQjkwMDg0MDBC
QSAvKiBKU0dsb2JhbExleGljYWxFbnZpcm9ubWVudC5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJV
VEVTID0gKFByaXZhdGUsICk7IH07IH07CkBAIC0zNjg3LDggKzM2ODcsNiBAQAogCQkyNjJEODVC
NDFDMEQ2NTBGMDA2QUNCNjEgLyogQWlyRml4UGFydGlhbFJlZ2lzdGVyU3RhbGxzLmNwcCAqLyA9
IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxl
VHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IEFpckZpeFBhcnRpYWxSZWdpc3RlclN0
YWxscy5jcHA7IHBhdGggPSBiMy9haXIvQWlyRml4UGFydGlhbFJlZ2lzdGVyU3RhbGxzLmNwcDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMjYyRDg1QjUxQzBENjUwRjAwNkFDQjYxIC8q
IEFpckZpeFBhcnRpYWxSZWdpc3RlclN0YWxscy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7
IG5hbWUgPSBBaXJGaXhQYXJ0aWFsUmVnaXN0ZXJTdGFsbHMuaDsgcGF0aCA9IGIzL2Fpci9BaXJG
aXhQYXJ0aWFsUmVnaXN0ZXJTdGFsbHMuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJ
MjY0MDkxRkExQkUyRkQ0MTAwNjg0REIyIC8qIEFpck9wY29kZS5vcGNvZGVzICovID0ge2lzYSA9
IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgbmFtZSA9IEFpck9w
Y29kZS5vcGNvZGVzOyBwYXRoID0gYjMvYWlyL0Fpck9wY29kZS5vcGNvZGVzOyBzb3VyY2VUcmVl
ID0gIjxncm91cD4iOyB9OwotCQkyNjcxOEJBMjFCRTk5Rjc4MDA1MjAxN0IgLyogQWlySXRlcmF0
ZWRSZWdpc3RlckNvYWxlc2NpbmcuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBu
YW1lID0gQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuY3BwOyBwYXRoID0gYjMvYWlyL0Fp
ckl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKLQkJMjY3MThCQTMxQkU5OUY3ODAwNTIwMTdCIC8qIEFpckl0ZXJhdGVkUmVnaXN0ZXJDb2Fs
ZXNjaW5nLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsg
bGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEFpckl0ZXJhdGVkUmVn
aXN0ZXJDb2FsZXNjaW5nLmg7IHBhdGggPSBiMy9haXIvQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxl
c2NpbmcuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMjY4NEQ0MzcxQzAwMTYxQzAw
ODFENjYzIC8qIEFpckxpdmVuZXNzLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9
IEFpckxpdmVuZXNzLmg7IHBhdGggPSBiMy9haXIvQWlyTGl2ZW5lc3MuaDsgc291cmNlVHJlZSA9
ICI8Z3JvdXA+IjsgfTsKIAkJMjY5RDYzNkQxQkZCRTVEMDAwMTAxQjFEIC8qIEZUTE91dHB1dC5o
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93
bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBGVExPdXRwdXQuaDsgcGF0aCA9IGZ0
bC9GVExPdXRwdXQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMkEwNUFCRDMxOTYx
REYyNDAwMzQxNzUwIC8qIEpTUHJvcGVydHlOYW1lRW51bWVyYXRvci5jcHAgKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBz
b3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBKU1Byb3BlcnR5TmFtZUVudW1lcmF0b3IuY3BwOyBz
b3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAtMzk0OCw2ICszOTQ2LDggQEAKIAkJNzk1QjE5
OTYxRDc4QkUzNTAwMjYyRkEwIC8qIE1hcEJhc2UuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJl
bmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5o
OyBwYXRoID0gTWFwQmFzZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk3OTVGMDk5
QzFFMDM2MDA1MDBCQkUzN0YgLyogQjNDb21waWxlLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUu
Y3BwLmNwcDsgbmFtZSA9IEIzQ29tcGlsZS5jcHA7IHBhdGggPSBiMy9CM0NvbXBpbGUuY3BwOyBz
b3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk3OTY0NjU2ODFCOTUyRkYwMDAzMDU5RUUgLyog
R2V0UHV0SW5mby5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9
IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBHZXRQdXRJbmZv
Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTc5NjVBMTE3MUU1RDNGRkUwMDFCQTUw
RCAvKiBBaXJHcmFwaENvbG9yaW5nLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBm
aWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsg
bmFtZSA9IEFpckdyYXBoQ29sb3JpbmcuY3BwOyBwYXRoID0gYjMvYWlyL0FpckdyYXBoQ29sb3Jp
bmcuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk3OTY1QTExODFFNUQzRkZFMDAx
QkE1MEQgLyogQWlyR3JhcGhDb2xvcmluZy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7
IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5h
bWUgPSBBaXJHcmFwaENvbG9yaW5nLmg7IHBhdGggPSBiMy9haXIvQWlyR3JhcGhDb2xvcmluZy5o
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk3OTZGQjQzOTFERkY4QzNGMDAzOUM5NUQg
LyogSlNXZWJBc3NlbWJseUhlbHBlcnMuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBm
aWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1l
ID0gSlNXZWJBc3NlbWJseUhlbHBlcnMuaDsgcGF0aCA9IGpzL0pTV2ViQXNzZW1ibHlIZWxwZXJz
Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTc5N0UwN0E3MUI4RkNGQjkwMDg0MDBC
QSAvKiBKU0dsb2JhbExleGljYWxFbnZpcm9ubWVudC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmNwcC5jcHA7IHBhdGggPSBKU0dsb2JhbExleGljYWxFbnZpcm9ubWVudC5jcHA7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CiAJCTc5N0UwN0E4MUI4RkNGQjkwMDg0MDBCQSAvKiBKU0dsb2Jh
bExleGljYWxFbnZpcm9ubWVudC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBK
U0dsb2JhbExleGljYWxFbnZpcm9ubWVudC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpA
QCAtNTQ3OSw2ICs1NDc5LDggQEAKIAkJCQkwRkVDODU1NDFCREFDREM3MDA4MEZGNzQgLyogQWly
R2VuZXJhdGUuaCAqLywKIAkJCQkwRkVDODU5MjFCREIxRTEwMDA4MEZGNzQgLyogQWlyR2VuZXJh
dGVkLmNwcCAqLywKIAkJCQkwRkVDODU1NTFCREFDREM3MDA4MEZGNzQgLyogQWlyR2VuZXJhdGlv
bkNvbnRleHQuaCAqLywKKwkJCQk3OTY1QTExNzFFNUQzRkZFMDAxQkE1MEQgLyogQWlyR3JhcGhD
b2xvcmluZy5jcHAgKi8sCisJCQkJNzk2NUExMTgxRTVEM0ZGRTAwMUJBNTBEIC8qIEFpckdyYXBo
Q29sb3JpbmcuaCAqLywKIAkJCQkwRkVDODU1NjFCREFDREM3MDA4MEZGNzQgLyogQWlySGFuZGxl
Q2FsbGVlU2F2ZXMuY3BwICovLAogCQkJCTBGRUM4NTU3MUJEQUNEQzcwMDgwRkY3NCAvKiBBaXJI
YW5kbGVDYWxsZWVTYXZlcy5oICovLAogCQkJCTBGRUM4NTU4MUJEQUNEQzcwMDgwRkY3NCAvKiBB
aXJJbnNlcnRpb25TZXQuY3BwICovLApAQCAtNTQ4Niw4ICs1NDg4LDYgQEAKIAkJCQkwRkVDODU1
QTFCREFDREM3MDA4MEZGNzQgLyogQWlySW5zdC5jcHAgKi8sCiAJCQkJMEZFQzg1NUIxQkRBQ0RD
NzAwODBGRjc0IC8qIEFpckluc3QuaCAqLywKIAkJCQkwRkVDODU1QzFCREFDREM3MDA4MEZGNzQg
LyogQWlySW5zdElubGluZXMuaCAqLywKLQkJCQkyNjcxOEJBMjFCRTk5Rjc4MDA1MjAxN0IgLyog
QWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuY3BwICovLAotCQkJCTI2NzE4QkEzMUJFOTlG
NzgwMDUyMDE3QiAvKiBBaXJJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5oICovLAogCQkJCTBG
REY2N0Q0MUQ5REM0M0UwMDFCOTgyNSAvKiBBaXJLaW5kLmNwcCAqLywKIAkJCQkwRkRGNjdENTFE
OURDNDNFMDAxQjk4MjUgLyogQWlyS2luZC5oICovLAogCQkJCTI2ODRENDM3MUMwMDE2MUMwMDgx
RDY2MyAvKiBBaXJMaXZlbmVzcy5oICovLApAQCAtNzkzOSw3ICs3OTM5LDYgQEAKIAkJCQkwRkVD
ODU3RTFCREFDREM3MDA4MEZGNzQgLyogQWlySW5zZXJ0aW9uU2V0LmggaW4gSGVhZGVycyAqLywK
IAkJCQkwRkVDODU4MDFCREFDREM3MDA4MEZGNzQgLyogQWlySW5zdC5oIGluIEhlYWRlcnMgKi8s
CiAJCQkJMEZFQzg1ODExQkRBQ0RDNzAwODBGRjc0IC8qIEFpckluc3RJbmxpbmVzLmggaW4gSGVh
ZGVycyAqLywKLQkJCQkyNjcxOEJBNTFCRTk5Rjc4MDA1MjAxN0IgLyogQWlySXRlcmF0ZWRSZWdp
c3RlckNvYWxlc2NpbmcuaCBpbiBIZWFkZXJzICovLAogCQkJCTBGREY2N0Q3MUQ5REM0NDIwMDFC
OTgyNSAvKiBBaXJLaW5kLmggaW4gSGVhZGVycyAqLywKIAkJCQkyNjg0RDQzODFDMDAxNjFDMDA4
MUQ2NjMgLyogQWlyTGl2ZW5lc3MuaCBpbiBIZWFkZXJzICovLAogCQkJCTBGRTM0QzFBMUM0QjM5
QUUwMDAzQTUxMiAvKiBBaXJMb2dSZWdpc3RlclByZXNzdXJlLmggaW4gSGVhZGVycyAqLywKQEAg
LTg2NjYsNiArODY2NSw3IEBACiAJCQkJOEI5RjZENTYxRDU5MTJGQTAwMUM3MzlGIC8qIEl0ZXJh
dGlvbktpbmQuaCBpbiBIZWFkZXJzICovLAogCQkJCUZFNEQ1NUI4MUFFNzE2Q0EwMDUyRTQ1OSAv
KiBJdGVyYXRpb25TdGF0dXMuaCBpbiBIZWFkZXJzICovLAogCQkJCTcwMTEzRDRDMUE4REIwOTMw
MDM4NDhDNCAvKiBJdGVyYXRvck9wZXJhdGlvbnMuaCBpbiBIZWFkZXJzICovLAorCQkJCTc5NjVB
MTFBMUU1RDNGRkUwMDFCQTUwRCAvKiBBaXJHcmFwaENvbG9yaW5nLmggaW4gSGVhZGVycyAqLywK
IAkJCQk3MERDM0UwQTFCMkRGMkM3MDAwNTQyOTkgLyogSXRlcmF0b3JQcm90b3R5cGUuaCBpbiBI
ZWFkZXJzICovLAogCQkJCUJDMThDNDEzMEUxNkY1Q0QwMEIzNDQ2MCAvKiBKYXZhU2NyaXB0Lmgg
aW4gSGVhZGVycyAqLywKIAkJCQlBNTAzRkExQTE4OEUwRkIwMDAxMTBGMTQgLyogSmF2YVNjcmlw
dENhbGxGcmFtZS5oIGluIEhlYWRlcnMgKi8sCkBAIC05Nzk0LDcgKzk3OTQsNiBAQAogCQkJCTBG
RUM4NTdCMUJEQUNEQzcwMDgwRkY3NCAvKiBBaXJIYW5kbGVDYWxsZWVTYXZlcy5jcHAgaW4gU291
cmNlcyAqLywKIAkJCQkwRkVDODU3RDFCREFDREM3MDA4MEZGNzQgLyogQWlySW5zZXJ0aW9uU2V0
LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTBGRUM4NTdGMUJEQUNEQzcwMDgwRkY3NCAvKiBBaXJJ
bnN0LmNwcCBpbiBTb3VyY2VzICovLAotCQkJCTI2NzE4QkE0MUJFOTlGNzgwMDUyMDE3QiAvKiBB
aXJJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkwRkRG
NjdENjFEOURDNDQwMDAxQjk4MjUgLyogQWlyS2luZC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkw
RkUzNEMxOTFDNEIzOUFFMDAwM0E1MTIgLyogQWlyTG9nUmVnaXN0ZXJQcmVzc3VyZS5jcHAgaW4g
U291cmNlcyAqLywKIAkJCQkwRjYxODMyRTFDNDVCRjA3MDA3MjQ1MEIgLyogQWlyTG93ZXJBZnRl
clJlZ0FsbG9jLmNwcCBpbiBTb3VyY2VzICovLApAQCAtOTk4MCw2ICs5OTc5LDcgQEAKIAkJCQkw
RkQzRTQwMTFCNjE4QUFGMDBDODBFMUUgLyogREZHQWRhcHRpdmVJbmZlcnJlZFByb3BlcnR5VmFs
dWVXYXRjaHBvaW50LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTBGMThEM0NGMUI1NUE2RTAwMDJD
NUM5RiAvKiBERkdBZGFwdGl2ZVN0cnVjdHVyZVdhdGNocG9pbnQuY3BwIGluIFNvdXJjZXMgKi8s
CiAJCQkJMEYyREQ4MTExQUIzRDhCRTAwQkJCOEU4IC8qIERGR0FyZ3VtZW50c0VsaW1pbmF0aW9u
UGhhc2UuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJNzk2NUExMTkxRTVEM0ZGRTAwMUJBNTBEIC8q
IEFpckdyYXBoQ29sb3JpbmcuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMEYyREQ4MTMxQUIzRDhC
RTAwQkJCOEU4IC8qIERGR0FyZ3VtZW50c1V0aWxpdGllcy5jcHAgaW4gU291cmNlcyAqLywKIAkJ
CQkwRjQ4NTMyMTE4Nzc1MDU2MDA4M0I2ODcgLyogREZHQXJpdGhNb2RlLmNwcCBpbiBTb3VyY2Vz
ICovLAogCQkJCTBGNjM5NDg0MTVFNDgxMTgwMDZBNTk3QyAvKiBERkdBcnJheU1vZGUuY3BwIGlu
IFNvdXJjZXMgKi8sCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckdlbmVy
YXRlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpckdl
bmVyYXRlLmNwcAkocmV2aXNpb24gMjEyNzk3KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L2Fpci9BaXJHZW5lcmF0ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM1LDggKzM1LDggQEAKICNp
bmNsdWRlICJBaXJGaXhPYnZpb3VzU3BpbGxzLmgiCiAjaW5jbHVkZSAiQWlyRml4UGFydGlhbFJl
Z2lzdGVyU3RhbGxzLmgiCiAjaW5jbHVkZSAiQWlyR2VuZXJhdGlvbkNvbnRleHQuaCIKKyNpbmNs
dWRlICJBaXJHcmFwaENvbG9yaW5nLmgiCiAjaW5jbHVkZSAiQWlySGFuZGxlQ2FsbGVlU2F2ZXMu
aCIKLSNpbmNsdWRlICJBaXJJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5oIgogI2luY2x1ZGUg
IkFpckxvZ1JlZ2lzdGVyUHJlc3N1cmUuaCIKICNpbmNsdWRlICJBaXJMb3dlckFmdGVyUmVnQWxs
b2MuaCIKICNpbmNsdWRlICJBaXJMb3dlckVudHJ5U3dpdGNoLmgiCkBAIC04OSw3ICs4OSw3IEBA
IHZvaWQgcHJlcGFyZUZvckdlbmVyYXRpb24oQ29kZSYgY29kZSkKICAgICBpZiAoT3B0aW9uczo6
YWlyU3BpbGxzRXZlcnl0aGluZygpKQogICAgICAgICBzcGlsbEV2ZXJ5dGhpbmcoY29kZSk7CiAg
ICAgZWxzZQotICAgICAgICBpdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZyhjb2RlKTsKKyAgICAg
ICAgYWxsb2NhdGVSZWdpc3RlcnNCeUdyYXBoQ29sb3JpbmcoY29kZSk7CiAKICAgICBpZiAoT3B0
aW9uczo6bG9nQWlyUmVnaXN0ZXJQcmVzc3VyZSgpKSB7CiAgICAgICAgIGRhdGFMb2coIlJlZ2lz
dGVyIHByZXNzdXJlIGFmdGVyIHJlZ2lzdGVyIGFsbG9jYXRpb246XG4iKTsKSW5kZXg6IFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyR3JhcGhDb2xvcmluZy5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJHcmFwaENvbG9yaW5nLmNwcAkocmV2
aXNpb24gMjEyNzk3KQkoZnJvbSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fpckl0ZXJh
dGVkUmVnaXN0ZXJDb2FsZXNjaW5nLmNwcDoyMTI3OTcpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYjMvYWlyL0FpckdyYXBoQ29sb3JpbmcuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
MTY1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE3IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkFpckl0ZXJhdGVkUmVnaXN0ZXJDb2Fs
ZXNjaW5nLmgiCisKKyNpZiBFTkFCTEUoQjNfSklUKQorCisjaW5jbHVkZSAiQWlyQ29kZS5oIgor
I2luY2x1ZGUgIkFpckluc2VydGlvblNldC5oIgorI2luY2x1ZGUgIkFpckluc3RJbmxpbmVzLmgi
CisjaW5jbHVkZSAiQWlyTGl2ZW5lc3MuaCIKKyNpbmNsdWRlICJBaXJQYWRJbnRlcmZlcmVuY2Uu
aCIKKyNpbmNsdWRlICJBaXJQaGFzZVNjb3BlLmgiCisjaW5jbHVkZSAiQWlyVG1wSW5saW5lcy5o
IgorI2luY2x1ZGUgIkFpclRtcFdpZHRoLmgiCisjaW5jbHVkZSAiQWlyVXNlQ291bnRzLmgiCisj
aW5jbHVkZSA8d3RmL0xpc3REdW1wLmg+CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMg
eyBuYW1lc3BhY2UgQWlyIHsKKworbmFtZXNwYWNlIHsKKworYm9vbCBkZWJ1ZyA9IGZhbHNlOwor
Ym9vbCB0cmFjZURlYnVnID0gZmFsc2U7Citib29sIHJlcG9ydFN0YXRzID0gZmFsc2U7CisKKy8v
IFRoZSBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yIGRlZmluZXMgYWxsIHRoZSBjb2RlIHRoYXQg
aXMgaW5kZXBlbmRhbnQKKy8vIGZyb20gdGhlIHR5cGUgb3IgcmVnaXN0ZXIgYW5kIGNhbiBiZSBz
aGFyZWQgd2hlbiBhbGxvY2F0aW5nIHJlZ2lzdGVycy4KK3RlbXBsYXRlPHR5cGVuYW1lIEluZGV4
VHlwZT4KK2NsYXNzIEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0b3IgeworcHVibGljOgorICAgIEFi
c3RyYWN0Q29sb3JpbmdBbGxvY2F0b3IoY29uc3QgVmVjdG9yPFJlZz4mIHJlZ3NJblByaW9yaXR5
T3JkZXIsIEluZGV4VHlwZSBsYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXgsIHVuc2lnbmVkIHRt
cEFycmF5U2l6ZSwgY29uc3QgSGFzaFNldDx1bnNpZ25lZD4mIHVuc3BpbGxhYmxlVG1wKQorICAg
ICAgICA6IG1fcmVnc0luUHJpb3JpdHlPcmRlcihyZWdzSW5Qcmlvcml0eU9yZGVyKQorICAgICAg
ICAsIG1fbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4KGxhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJ
bmRleCkKKyAgICAgICAgLCBtX3Vuc3BpbGxhYmxlVG1wcyh1bnNwaWxsYWJsZVRtcCkKKyAgICB7
CisgICAgICAgIGZvciAoUmVnIHJlZyA6IG1fcmVnc0luUHJpb3JpdHlPcmRlcikKKyAgICAgICAg
ICAgIG1fbXV0YWJsZVJlZ3Muc2V0KHJlZyk7CisgICAgICAgIAorICAgICAgICBpbml0aWFsaXpl
RGVncmVlcyh0bXBBcnJheVNpemUpOworICAgICAgICAKKyAgICAgICAgbV9hZGphY2VuY3lMaXN0
LnJlc2l6ZSh0bXBBcnJheVNpemUpOworICAgICAgICBtX21vdmVMaXN0LnJlc2l6ZSh0bXBBcnJh
eVNpemUpOworICAgICAgICBtX2NvYWxlc2NlZFRtcHMuZmlsbCgwLCB0bXBBcnJheVNpemUpOwor
ICAgICAgICBtX2lzT25TZWxlY3RTdGFjay5lbnN1cmVTaXplKHRtcEFycmF5U2l6ZSk7CisgICAg
fQorCitwcm90ZWN0ZWQ6CisgICAgSW5kZXhUeXBlIGdldEFsaWFzKEluZGV4VHlwZSB0bXBJbmRl
eCkgY29uc3QKKyAgICB7CisgICAgICAgIEluZGV4VHlwZSBhbGlhcyA9IHRtcEluZGV4OworICAg
ICAgICB3aGlsZSAoSW5kZXhUeXBlIG5leHRBbGlhcyA9IG1fY29hbGVzY2VkVG1wc1thbGlhc10p
CisgICAgICAgICAgICBhbGlhcyA9IG5leHRBbGlhczsKKyAgICAgICAgcmV0dXJuIGFsaWFzOwor
ICAgIH0KKworICAgIHZvaWQgYWRkRWRnZShJbmRleFR5cGUgYSwgSW5kZXhUeXBlIGIpCisgICAg
eworICAgICAgICBpZiAoYSA9PSBiKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBhZGRF
ZGdlRGlzdGluY3QoYSwgYik7CisgICAgfQorCisgICAgdm9pZCBtYWtlV29ya0xpc3QoKQorICAg
IHsKKyAgICAgICAgSW5kZXhUeXBlIGZpcnN0Tm9uUmVnSW5kZXggPSBtX2xhc3RQcmVjb2xvcmVk
UmVnaXN0ZXJJbmRleCArIDE7CisgICAgICAgIGZvciAoSW5kZXhUeXBlIGkgPSBmaXJzdE5vblJl
Z0luZGV4OyBpIDwgbV9kZWdyZWVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICB1bnNpZ25l
ZCBkZWdyZWUgPSBtX2RlZ3JlZXNbaV07CisgICAgICAgICAgICBpZiAoZGVncmVlID49IG1fcmVn
c0luUHJpb3JpdHlPcmRlci5zaXplKCkpCisgICAgICAgICAgICAgICAgYWRkVG9TcGlsbChpKTsK
KyAgICAgICAgICAgIGVsc2UgaWYgKCFtX21vdmVMaXN0W2ldLmlzRW1wdHkoKSkKKyAgICAgICAg
ICAgICAgICBtX2ZyZWV6ZVdvcmtsaXN0LmFkZChpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAg
ICAgICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuYXBwZW5kKGkpOworICAgICAgICB9CisgICAg
fQorCisgICAgdm9pZCBhZGRUb1NwaWxsKHVuc2lnbmVkIHRvU3BpbGwpCisgICAgeworICAgICAg
ICBpZiAobV91bnNwaWxsYWJsZVRtcHMuY29udGFpbnModG9TcGlsbCkpCisgICAgICAgICAgICBy
ZXR1cm47CisKKyAgICAgICAgbV9zcGlsbFdvcmtsaXN0LmFkZCh0b1NwaWxsKTsKKyAgICB9CisK
KyAgICAvLyBMb3ctZGVncmVlIHZlcnRleCBjYW4gYWx3YXlzIGJlIGNvbG9yZWQ6IGp1c3QgcGlj
ayBhbnkgb2YgdGhlIGNvbG9yIHRha2VuIGJ5IGFueQorICAgIC8vIG90aGVyIGFkamFjZW50IHZl
cmljZXMuCisgICAgLy8gVGhlICJTaW1wbGlmeSIgcGhhc2UgdGFrZXMgYSBsb3ctZGVncmVlIG91
dCBvZiB0aGUgaW50ZXJmZXJlbmNlIGdyYXBoIHRvIHNpbXBsaWZ5IGl0LgorICAgIHZvaWQgc2lt
cGxpZnkoKQorICAgIHsKKyAgICAgICAgSW5kZXhUeXBlIGxhc3RJbmRleCA9IG1fc2ltcGxpZnlX
b3JrbGlzdC50YWtlTGFzdCgpOworCisgICAgICAgIEFTU0VSVCghbV9zZWxlY3RTdGFjay5jb250
YWlucyhsYXN0SW5kZXgpKTsKKyAgICAgICAgQVNTRVJUKCFtX2lzT25TZWxlY3RTdGFjay5nZXQo
bGFzdEluZGV4KSk7CisgICAgICAgIG1fc2VsZWN0U3RhY2suYXBwZW5kKGxhc3RJbmRleCk7Cisg
ICAgICAgIG1faXNPblNlbGVjdFN0YWNrLnF1aWNrU2V0KGxhc3RJbmRleCk7CisKKyAgICAgICAg
Zm9yRWFjaEFkamFjZW50KGxhc3RJbmRleCwgW3RoaXNdKEluZGV4VHlwZSBhZGphY2VudFRtcElu
ZGV4KSB7CisgICAgICAgICAgICBkZWNyZW1lbnREZWdyZWUoYWRqYWNlbnRUbXBJbmRleCk7Cisg
ICAgICAgIH0pOworICAgIH0KKworICAgIHZvaWQgZnJlZXplKCkKKyAgICB7CisgICAgICAgIElu
ZGV4VHlwZSB2aWN0aW1JbmRleCA9IG1fZnJlZXplV29ya2xpc3QudGFrZUFueSgpOworICAgICAg
ICBBU1NFUlRfV0lUSF9NRVNTQUdFKGdldEFsaWFzKHZpY3RpbUluZGV4KSA9PSB2aWN0aW1JbmRl
eCwgImNvYWxlc2NlKCkgc2hvdWxkIG5vdCBsZWF2ZSBhbGlhc2VkIFRtcCBpbiB0aGUgd29ya2xp
c3QuIik7CisgICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5hcHBlbmQodmljdGltSW5kZXgpOwor
ICAgICAgICBmcmVlemVNb3Zlcyh2aWN0aW1JbmRleCk7CisgICAgfQorCisgICAgdm9pZCBmcmVl
emVNb3ZlcyhJbmRleFR5cGUgdG1wSW5kZXgpCisgICAgeworICAgICAgICBmb3JFYWNoTm9kZU1v
dmVzKHRtcEluZGV4LCBbdGhpcywgdG1wSW5kZXhdIChJbmRleFR5cGUgbW92ZUluZGV4KSB7Cisg
ICAgICAgICAgICBpZiAoIW1fYWN0aXZlTW92ZXMucXVpY2tDbGVhcihtb3ZlSW5kZXgpKQorICAg
ICAgICAgICAgICAgIG1fd29ya2xpc3RNb3Zlcy50YWtlTW92ZShtb3ZlSW5kZXgpOworCisgICAg
ICAgICAgICBjb25zdCBNb3ZlT3BlcmFuZHMmIG1vdmVPcGVyYW5kcyA9IG1fY29hbGVzY2luZ0Nh
bmRpZGF0ZXNbbW92ZUluZGV4XTsKKyAgICAgICAgICAgIEluZGV4VHlwZSBzcmNUbXBJbmRleCA9
IG1vdmVPcGVyYW5kcy5zcmNJbmRleDsKKyAgICAgICAgICAgIEluZGV4VHlwZSBkc3RUbXBJbmRl
eCA9IG1vdmVPcGVyYW5kcy5kc3RJbmRleDsKKworICAgICAgICAgICAgSW5kZXhUeXBlIG9yaWdp
bmFsT3RoZXJUbXAgPSBzcmNUbXBJbmRleCAhPSB0bXBJbmRleCA/IHNyY1RtcEluZGV4IDogZHN0
VG1wSW5kZXg7CisgICAgICAgICAgICBJbmRleFR5cGUgb3RoZXJUbXBJbmRleCA9IGdldEFsaWFz
KG9yaWdpbmFsT3RoZXJUbXApOworICAgICAgICAgICAgaWYgKG1fZGVncmVlc1tvdGhlclRtcElu
ZGV4XSA8IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkgJiYgIWlzTW92ZVJlbGF0ZWQob3Ro
ZXJUbXBJbmRleCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobV9mcmVlemVXb3JrbGlzdC5yZW1v
dmUob3RoZXJUbXBJbmRleCkpCisgICAgICAgICAgICAgICAgICAgIG1fc2ltcGxpZnlXb3JrbGlz
dC5hcHBlbmQob3RoZXJUbXBJbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAg
IH0KKworICAgIHZvaWQgY29hbGVzY2UoKQorICAgIHsKKyAgICAgICAgdW5zaWduZWQgbW92ZUlu
ZGV4ID0gbV93b3JrbGlzdE1vdmVzLnRha2VMYXN0TW92ZSgpOworICAgICAgICBjb25zdCBNb3Zl
T3BlcmFuZHMmIG1vdmVPcGVyYW5kcyA9IG1fY29hbGVzY2luZ0NhbmRpZGF0ZXNbbW92ZUluZGV4
XTsKKyAgICAgICAgSW5kZXhUeXBlIHUgPSBnZXRBbGlhcyhtb3ZlT3BlcmFuZHMuc3JjSW5kZXgp
OworICAgICAgICBJbmRleFR5cGUgdiA9IGdldEFsaWFzKG1vdmVPcGVyYW5kcy5kc3RJbmRleCk7
CisKKyAgICAgICAgaWYgKGlzUHJlY29sb3JlZCh2KSkKKyAgICAgICAgICAgIHN0ZDo6c3dhcCh1
LCB2KTsKKworICAgICAgICBpZiAodHJhY2VEZWJ1ZykKKyAgICAgICAgICAgIGRhdGFMb2coIkNv
YWxlc2NpbmcgbW92ZSBhdCBpbmRleCAiLCBtb3ZlSW5kZXgsICIgdSA9ICIsIHUsICIgdiA9ICIs
IHYsICJcbiIpOworCisgICAgICAgIGlmICh1ID09IHYpIHsKKyAgICAgICAgICAgIGFkZFdvcmtM
aXN0KHUpOworCisgICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKKyAgICAgICAgICAgICAgICBk
YXRhTG9nKCIgICAgQ29hbGVzY2VkXG4iKTsKKyAgICAgICAgfSBlbHNlIGlmIChpc1ByZWNvbG9y
ZWQodikKKyAgICAgICAgICAgIHx8IG1faW50ZXJmZXJlbmNlRWRnZXMuY29udGFpbnMoSW50ZXJm
ZXJlbmNlRWRnZSh1LCB2KSkKKyAgICAgICAgICAgIHx8ICh1ID09IG1fZnJhbWVQb2ludGVySW5k
ZXggJiYgbV9pbnRlcmZlcmVzV2l0aEZyYW1lUG9pbnRlci5xdWlja0dldCh2KSkpIHsKKyAgICAg
ICAgICAgIGFkZFdvcmtMaXN0KHUpOworICAgICAgICAgICAgYWRkV29ya0xpc3Qodik7CisKKyAg
ICAgICAgICAgIGlmICh0cmFjZURlYnVnKQorICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICBD
b25zdHJhaW5lZFxuIik7CisgICAgICAgIH0gZWxzZSBpZiAoY2FuQmVTYWZlbHlDb2FsZXNjZWQo
dSwgdikpIHsKKyAgICAgICAgICAgIGNvbWJpbmUodSwgdik7CisgICAgICAgICAgICBhZGRXb3Jr
TGlzdCh1KTsKKyAgICAgICAgICAgIG1faGFzQ29hbGVzY2VkTm9uVHJpdmlhbE1vdmUgPSB0cnVl
OworCisgICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKKyAgICAgICAgICAgICAgICBkYXRhTG9n
KCIgICAgU2FmZSBDb2FsZXNjaW5nXG4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg
IG1fYWN0aXZlTW92ZXMucXVpY2tTZXQobW92ZUluZGV4KTsKKworICAgICAgICAgICAgaWYgKHRy
YWNlRGVidWcpCisgICAgICAgICAgICAgICAgZGF0YUxvZygiICAgIEZhaWxlZCBjb2FsZXNjaW5n
LCBhZGRlZCB0byBhY3RpdmUgbW92ZXMuXG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZv
aWQgYXNzaWduQ29sb3JzKCkKKyAgICB7CisgICAgICAgIEFTU0VSVChtX3NpbXBsaWZ5V29ya2xp
c3QuaXNFbXB0eSgpKTsKKyAgICAgICAgQVNTRVJUKG1fd29ya2xpc3RNb3Zlcy5pc0VtcHR5KCkp
OworICAgICAgICBBU1NFUlQobV9mcmVlemVXb3JrbGlzdC5pc0VtcHR5KCkpOworICAgICAgICBB
U1NFUlQobV9zcGlsbFdvcmtsaXN0LmlzRW1wdHkoKSk7CisKKyAgICAgICAgLy8gUmVjbGFpbSBh
cyBtdWNoIG1lbW9yeSBhcyBwb3NzaWJsZS4KKyAgICAgICAgbV9pbnRlcmZlcmVuY2VFZGdlcy5j
bGVhcigpOworICAgICAgICBtX2RlZ3JlZXMuY2xlYXIoKTsKKyAgICAgICAgbV9tb3ZlTGlzdC5j
bGVhcigpOworICAgICAgICBtX3dvcmtsaXN0TW92ZXMuY2xlYXIoKTsKKyAgICAgICAgbV9zaW1w
bGlmeVdvcmtsaXN0LmNsZWFyKCk7CisgICAgICAgIG1fc3BpbGxXb3JrbGlzdC5jbGVhcigpOwor
ICAgICAgICBtX2ZyZWV6ZVdvcmtsaXN0LmNsZWFyKCk7CisKKyAgICAgICAgLy8gVHJ5IHRvIGNv
bG9yIHRoZSBUbXAgb24gdGhlIHN0YWNrLgorICAgICAgICBtX2NvbG9yZWRUbXAucmVzaXplKG1f
YWRqYWNlbmN5TGlzdC5zaXplKCkpOworCisgICAgICAgIHdoaWxlICghbV9zZWxlY3RTdGFjay5p
c0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIHRtcEluZGV4ID0gbV9zZWxlY3RTdGFj
ay50YWtlTGFzdCgpOworICAgICAgICAgICAgQVNTRVJUKCFpc1ByZWNvbG9yZWQodG1wSW5kZXgp
KTsKKyAgICAgICAgICAgIEFTU0VSVCghbV9jb2xvcmVkVG1wW3RtcEluZGV4XSk7CisKKyAgICAg
ICAgICAgIFJlZ2lzdGVyU2V0IGNvbG9yZWRSZWdpc3RlcnM7CisgICAgICAgICAgICBmb3IgKElu
ZGV4VHlwZSBhZGphY2VudFRtcEluZGV4IDogbV9hZGphY2VuY3lMaXN0W3RtcEluZGV4XSkgewor
ICAgICAgICAgICAgICAgIEluZGV4VHlwZSBhbGlhc1RtcEluZGV4ID0gZ2V0QWxpYXMoYWRqYWNl
bnRUbXBJbmRleCk7CisgICAgICAgICAgICAgICAgUmVnIHJlZyA9IG1fY29sb3JlZFRtcFthbGlh
c1RtcEluZGV4XTsKKworICAgICAgICAgICAgICAgIEFTU0VSVCghaXNQcmVjb2xvcmVkKGFsaWFz
VG1wSW5kZXgpIHx8IChpc1ByZWNvbG9yZWQoYWxpYXNUbXBJbmRleCkgJiYgcmVnKSk7CisKKyAg
ICAgICAgICAgICAgICBpZiAocmVnKQorICAgICAgICAgICAgICAgICAgICBjb2xvcmVkUmVnaXN0
ZXJzLnNldChyZWcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sIGNvbG9yQXNz
aWduZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoUmVnIHJlZyA6IG1fcmVnc0luUHJpb3Jp
dHlPcmRlcikgeworICAgICAgICAgICAgICAgIGlmICghY29sb3JlZFJlZ2lzdGVycy5nZXQocmVn
KSkgeworICAgICAgICAgICAgICAgICAgICBtX2NvbG9yZWRUbXBbdG1wSW5kZXhdID0gcmVnOwor
ICAgICAgICAgICAgICAgICAgICBjb2xvckFzc2lnbmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICBpZiAoIWNvbG9yQXNzaWduZWQpCisgICAgICAgICAgICAgICAgbV9zcGlsbGVkVG1wcy5h
cHBlbmQodG1wSW5kZXgpOworICAgICAgICB9CisgICAgICAgIG1fc2VsZWN0U3RhY2suY2xlYXIo
KTsKKworICAgICAgICBpZiAobV9zcGlsbGVkVG1wcy5pc0VtcHR5KCkpCisgICAgICAgICAgICBt
X2NvYWxlc2NlZFRtcHNBdFNwaWxsLmNsZWFyKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAg
IG1fY29sb3JlZFRtcC5jbGVhcigpOworICAgIH0KKworcHJpdmF0ZToKKyAgICB2b2lkIGluaXRp
YWxpemVEZWdyZWVzKHVuc2lnbmVkIHRtcEFycmF5U2l6ZSkKKyAgICB7CisgICAgICAgIG1fZGVn
cmVlcy5yZXNpemUodG1wQXJyYXlTaXplKTsKKworICAgICAgICAvLyBBbGwgcHJlY29sb3JlZCBy
ZWdpc3RlcnMgaGF2ZSAgYW4gImluZmluaXRlIiBkZWdyZWUuCisgICAgICAgIHVuc2lnbmVkIGZp
cnN0Tm9uUmVnSW5kZXggPSBtX2xhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleCArIDE7CisgICAg
ICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBmaXJzdE5vblJlZ0luZGV4OyArK2kpCisgICAg
ICAgICAgICBtX2RlZ3JlZXNbaV0gPSBzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4
KCk7CisKKyAgICAgICAgbWVtc2V0KG1fZGVncmVlcy5kYXRhKCkgKyBmaXJzdE5vblJlZ0luZGV4
LCAwLCAodG1wQXJyYXlTaXplIC0gZmlyc3ROb25SZWdJbmRleCkgKiBzaXplb2YodW5zaWduZWQp
KTsKKyAgICB9CisKKyAgICB2b2lkIGFkZEVkZ2VEaXN0aW5jdChJbmRleFR5cGUgYSwgSW5kZXhU
eXBlIGIpCisgICAgeworICAgICAgICBBU1NFUlQoYSAhPSBiKTsKKyAgICAgICAgaWYgKG1faW50
ZXJmZXJlbmNlRWRnZXMuYWRkKEludGVyZmVyZW5jZUVkZ2UoYSwgYikpLmlzTmV3RW50cnkpIHsK
KyAgICAgICAgICAgIGlmICghaXNQcmVjb2xvcmVkKGEpKSB7CisgICAgICAgICAgICAgICAgQVNT
RVJUKCFtX2FkamFjZW5jeUxpc3RbYV0uY29udGFpbnMoYikpOworICAgICAgICAgICAgICAgIG1f
YWRqYWNlbmN5TGlzdFthXS5hcHBlbmQoYik7CisgICAgICAgICAgICAgICAgbV9kZWdyZWVzW2Fd
Kys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghaXNQcmVjb2xvcmVkKGIpKSB7
CisgICAgICAgICAgICAgICAgQVNTRVJUKCFtX2FkamFjZW5jeUxpc3RbYl0uY29udGFpbnMoYSkp
OworICAgICAgICAgICAgICAgIG1fYWRqYWNlbmN5TGlzdFtiXS5hcHBlbmQoYSk7CisgICAgICAg
ICAgICAgICAgbV9kZWdyZWVzW2JdKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9
CisKKyAgICB2b2lkIGRlY3JlbWVudERlZ3JlZShJbmRleFR5cGUgdG1wSW5kZXgpCisgICAgewor
ICAgICAgICBBU1NFUlQobV9kZWdyZWVzW3RtcEluZGV4XSk7CisKKyAgICAgICAgdW5zaWduZWQg
b2xkRGVncmVlID0gbV9kZWdyZWVzW3RtcEluZGV4XS0tOworICAgICAgICBpZiAob2xkRGVncmVl
ID09IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkpIHsKKyAgICAgICAgICAgIGVuYWJsZU1v
dmVzT25WYWx1ZUFuZEFkamFjZW50cyh0bXBJbmRleCk7CisgICAgICAgICAgICBtX3NwaWxsV29y
a2xpc3QucmVtb3ZlKHRtcEluZGV4KTsKKyAgICAgICAgICAgIGlmIChpc01vdmVSZWxhdGVkKHRt
cEluZGV4KSkKKyAgICAgICAgICAgICAgICBtX2ZyZWV6ZVdvcmtsaXN0LmFkZCh0bXBJbmRleCk7
CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbV9zaW1wbGlmeVdvcmtsaXN0LmFw
cGVuZCh0bXBJbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIGJvb2wgYWRkRWRnZURp
c3RpbmN0V2l0aG91dERlZ3JlZUNoYW5nZShJbmRleFR5cGUgYSwgSW5kZXhUeXBlIGIpCisgICAg
eworICAgICAgICBBU1NFUlQoYSAhPSBiKTsKKyAgICAgICAgaWYgKG1faW50ZXJmZXJlbmNlRWRn
ZXMuYWRkKEludGVyZmVyZW5jZUVkZ2UoYSwgYikpLmlzTmV3RW50cnkpIHsKKyAgICAgICAgICAg
IGlmICghaXNQcmVjb2xvcmVkKGEpKSB7CisgICAgICAgICAgICAgICAgQVNTRVJUKCFtX2FkamFj
ZW5jeUxpc3RbYV0uY29udGFpbnMoYikpOworICAgICAgICAgICAgICAgIG1fYWRqYWNlbmN5TGlz
dFthXS5hcHBlbmQoYik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghaXNQcmVj
b2xvcmVkKGIpKSB7CisgICAgICAgICAgICAgICAgQVNTRVJUKCFtX2FkamFjZW5jeUxpc3RbYl0u
Y29udGFpbnMoYSkpOworICAgICAgICAgICAgICAgIG1fYWRqYWNlbmN5TGlzdFtiXS5hcHBlbmQo
YSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCBpc01vdmVSZWxhdGVkKElu
ZGV4VHlwZSB0bXBJbmRleCkKKyAgICB7CisgICAgICAgIGZvciAodW5zaWduZWQgbW92ZUluZGV4
IDogbV9tb3ZlTGlzdFt0bXBJbmRleF0pIHsKKyAgICAgICAgICAgIGlmIChtX2FjdGl2ZU1vdmVz
LnF1aWNrR2V0KG1vdmVJbmRleCkgfHwgbV93b3JrbGlzdE1vdmVzLmNvbnRhaW5zKG1vdmVJbmRl
eCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0aW9uPgorICAg
IHZvaWQgZm9yRWFjaEFkamFjZW50KEluZGV4VHlwZSB0bXBJbmRleCwgRnVuY3Rpb24gZnVuY3Rp
b24pCisgICAgeworICAgICAgICBmb3IgKEluZGV4VHlwZSBhZGphY2VudFRtcEluZGV4IDogbV9h
ZGphY2VuY3lMaXN0W3RtcEluZGV4XSkgeworICAgICAgICAgICAgaWYgKCFoYXNCZWVuU2ltcGxp
ZmllZChhZGphY2VudFRtcEluZGV4KSkKKyAgICAgICAgICAgICAgICBmdW5jdGlvbihhZGphY2Vu
dFRtcEluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgaGFzQmVlblNpbXBsaWZp
ZWQoSW5kZXhUeXBlIHRtcEluZGV4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1faXNPblNlbGVj
dFN0YWNrLnF1aWNrR2V0KHRtcEluZGV4KSB8fCAhIW1fY29hbGVzY2VkVG1wc1t0bXBJbmRleF07
CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rpb24+CisgICAgdm9pZCBmb3JF
YWNoTm9kZU1vdmVzKEluZGV4VHlwZSB0bXBJbmRleCwgRnVuY3Rpb24gZnVuY3Rpb24pCisgICAg
eworICAgICAgICBmb3IgKHVuc2lnbmVkIG1vdmVJbmRleCA6IG1fbW92ZUxpc3RbdG1wSW5kZXhd
KSB7CisgICAgICAgICAgICBpZiAobV9hY3RpdmVNb3Zlcy5xdWlja0dldChtb3ZlSW5kZXgpIHx8
IG1fd29ya2xpc3RNb3Zlcy5jb250YWlucyhtb3ZlSW5kZXgpKQorICAgICAgICAgICAgICAgIGZ1
bmN0aW9uKG1vdmVJbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGVuYWJsZU1v
dmVzT25WYWx1ZShJbmRleFR5cGUgdG1wSW5kZXgpCisgICAgeworICAgICAgICBmb3IgKHVuc2ln
bmVkIG1vdmVJbmRleCA6IG1fbW92ZUxpc3RbdG1wSW5kZXhdKSB7CisgICAgICAgICAgICBpZiAo
bV9hY3RpdmVNb3Zlcy5xdWlja0NsZWFyKG1vdmVJbmRleCkpCisgICAgICAgICAgICAgICAgbV93
b3JrbGlzdE1vdmVzLnJldHVybk1vdmUobW92ZUluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKwor
ICAgIHZvaWQgZW5hYmxlTW92ZXNPblZhbHVlQW5kQWRqYWNlbnRzKEluZGV4VHlwZSB0bXBJbmRl
eCkKKyAgICB7CisgICAgICAgIGVuYWJsZU1vdmVzT25WYWx1ZSh0bXBJbmRleCk7CisKKyAgICAg
ICAgZm9yRWFjaEFkamFjZW50KHRtcEluZGV4LCBbdGhpc10gKEluZGV4VHlwZSBhZGphY2VudFRt
cEluZGV4KSB7CisgICAgICAgICAgICBlbmFibGVNb3Zlc09uVmFsdWUoYWRqYWNlbnRUbXBJbmRl
eCk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIGJvb2wgaXNQcmVjb2xvcmVkKEluZGV4VHlw
ZSB0bXBJbmRleCkKKyAgICB7CisgICAgICAgIHJldHVybiB0bXBJbmRleCA8PSBtX2xhc3RQcmVj
b2xvcmVkUmVnaXN0ZXJJbmRleDsKKyAgICB9CisKKyAgICB2b2lkIGFkZFdvcmtMaXN0KEluZGV4
VHlwZSB0bXBJbmRleCkKKyAgICB7CisgICAgICAgIGlmICghaXNQcmVjb2xvcmVkKHRtcEluZGV4
KSAmJiBtX2RlZ3JlZXNbdG1wSW5kZXhdIDwgbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKSAm
JiAhaXNNb3ZlUmVsYXRlZCh0bXBJbmRleCkpIHsKKyAgICAgICAgICAgIG1fZnJlZXplV29ya2xp
c3QucmVtb3ZlKHRtcEluZGV4KTsKKyAgICAgICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5hcHBl
bmQodG1wSW5kZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBjb21iaW5lKEluZGV4
VHlwZSB1LCBJbmRleFR5cGUgdikKKyAgICB7CisgICAgICAgIGlmICghbV9mcmVlemVXb3JrbGlz
dC5yZW1vdmUodikpCisgICAgICAgICAgICBtX3NwaWxsV29ya2xpc3QucmVtb3ZlKHYpOworCisg
ICAgICAgIEFTU0VSVCghbV9jb2FsZXNjZWRUbXBzW3ZdKTsKKyAgICAgICAgbV9jb2FsZXNjZWRU
bXBzW3ZdID0gdTsKKworICAgICAgICBhdXRvJiB2TW92ZXMgPSBtX21vdmVMaXN0W3ZdOworICAg
ICAgICBtX21vdmVMaXN0W3VdLmFkZCh2TW92ZXMuYmVnaW4oKSwgdk1vdmVzLmVuZCgpKTsKKwor
ICAgICAgICBmb3JFYWNoQWRqYWNlbnQodiwgW3RoaXMsIHVdIChJbmRleFR5cGUgYWRqYWNlbnRU
bXBJbmRleCkgeworICAgICAgICAgICAgaWYgKGFkZEVkZ2VEaXN0aW5jdFdpdGhvdXREZWdyZWVD
aGFuZ2UoYWRqYWNlbnRUbXBJbmRleCwgdSkpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSBh
ZGRlZCBhIG5ldyBlZGdlIGJldHdlZW4gdGhlIGFkamFjZW50VG1wIGFuZCB1LCBpdCByZXBsYWNl
cyB0aGUgZWRnZQorICAgICAgICAgICAgICAgIC8vIHRoYXQgZXhpc3RlZCB3aXRoIHYuCisgICAg
ICAgICAgICAgICAgLy8gVGhlIGRlZ3JlZSBvZiBhZGphY2VudFRtcCByZW1haW5zIHRoZSBzYW1l
IHNpbmNlIHRoZSBlZGdlIGp1c3QgY2hhbmdlZCBmcm9tIHUgdG8gdi4KKyAgICAgICAgICAgICAg
ICAvLyBBbGwgd2UgbmVlZCB0byBkbyBpcyB1cGRhdGUgdGhlIGRlZ3JlZSBvZiB1LgorICAgICAg
ICAgICAgICAgIGlmICghaXNQcmVjb2xvcmVkKHUpKQorICAgICAgICAgICAgICAgICAgICBtX2Rl
Z3JlZXNbdV0rKzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gSWYg
d2UgYWxyZWFkeSBoYWQgYW4gZWRnZSBiZXR3ZWVuIHRoZSBhZGphY2VudFRtcCBhbmQgdSwgdGhl
IGRlZ3JlZSBvZiB1CisgICAgICAgICAgICAgICAgLy8gaXMgYWxyZWFkeSBjb3JyZWN0LiBUaGUg
ZGVncmVlIG9mIHRoZSBhZGphY2VudFRtcCBkZWNyZWFzZXMgc2luY2UgdGhlIGVkZ2UKKyAgICAg
ICAgICAgICAgICAvLyB3aXRoIHYgaXMgbm8gbG9uZ2VyIHJlbGV2YW50ICh3ZSBjYW4gdGhpbmsg
b2YgaXQgYXMgbWVyZ2VkIHdpdGggdGhlIGVkZ2Ugd2l0aCB1KS4KKyAgICAgICAgICAgICAgICBk
ZWNyZW1lbnREZWdyZWUoYWRqYWNlbnRUbXBJbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAg
IH0pOworCisgICAgICAgIGlmIChtX2ZyYW1lUG9pbnRlckluZGV4ICYmIG1faW50ZXJmZXJlc1dp
dGhGcmFtZVBvaW50ZXIucXVpY2tHZXQodikpCisgICAgICAgICAgICBtX2ludGVyZmVyZXNXaXRo
RnJhbWVQb2ludGVyLnF1aWNrU2V0KHUpOworCisgICAgICAgIGlmIChtX2RlZ3JlZXNbdV0gPj0g
bV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKSAmJiBtX2ZyZWV6ZVdvcmtsaXN0LnJlbW92ZSh1
KSkKKyAgICAgICAgICAgIGFkZFRvU3BpbGwodSk7CisgICAgfQorCisgICAgYm9vbCBjYW5CZVNh
ZmVseUNvYWxlc2NlZChJbmRleFR5cGUgdSwgSW5kZXhUeXBlIHYpCisgICAgeworICAgICAgICBB
U1NFUlQoIWlzUHJlY29sb3JlZCh2KSk7CisgICAgICAgIGlmIChpc1ByZWNvbG9yZWQodSkpCisg
ICAgICAgICAgICByZXR1cm4gcHJlY29sb3JlZENvYWxlc2NpbmdIZXVyaXN0aWModSwgdik7Cisg
ICAgICAgIHJldHVybiBjb25zZXJ2YXRpdmVIZXVyaXN0aWModSwgdik7CisgICAgfQorCisgICAg
Ym9vbCBjb25zZXJ2YXRpdmVIZXVyaXN0aWMoSW5kZXhUeXBlIHUsIEluZGV4VHlwZSB2KQorICAg
IHsKKyAgICAgICAgLy8gVGhpcyBpcyB1c2luZyB0aGUgQnJpZ2dzJyBjb25zZXJ2YXRpdmUgY29h
bGVzY2luZyBydWxlOgorICAgICAgICAvLyBJZiB0aGUgbnVtYmVyIG9mIGNvbWJpbmVkIGFkamFj
ZW50IG5vZGUgd2l0aCBhIGRlZ3JlZSA+PSBLIGlzIGxlc3MgdGhhbiBLLAorICAgICAgICAvLyBp
dCBpcyBzYWZlIHRvIGNvbWJpbmUgdGhlIHR3byBub2Rlcy4gVGhlIHJlYXNvbiBpcyB0aGF0IHdl
IGtub3cgdGhhdCBpZiB0aGUgZ3JhcGgKKyAgICAgICAgLy8gaXMgY29sb3JhYmxlLCB3ZSBoYXZl
IGZld2VyIHRoYW4gSyBhZGphY2VudHMgd2l0aCBoaWdoIG9yZGVyIGFuZCB0aGVyZSBpcyBhIGNv
bG9yCisgICAgICAgIC8vIGZvciB0aGUgY3VycmVudCBub2RlLgorICAgICAgICBBU1NFUlQodSAh
PSB2KTsKKyAgICAgICAgQVNTRVJUKCFpc1ByZWNvbG9yZWQodSkpOworICAgICAgICBBU1NFUlQo
IWlzUHJlY29sb3JlZCh2KSk7CisKKyAgICAgICAgY29uc3QgYXV0byYgYWRqYWNlbnRzT2ZVID0g
bV9hZGphY2VuY3lMaXN0W3VdOworICAgICAgICBjb25zdCBhdXRvJiBhZGphY2VudHNPZlYgPSBt
X2FkamFjZW5jeUxpc3Rbdl07CisKKyAgICAgICAgaWYgKGFkamFjZW50c09mVS5zaXplKCkgKyBh
ZGphY2VudHNPZlYuc2l6ZSgpIDwgbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKSkgeworICAg
ICAgICAgICAgLy8gU2hvcnRjdXQ6IGlmIHRoZSB0b3RhbCBudW1iZXIgb2YgYWRqYWNlbnRzIGlz
IGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIHJlZ2lzdGVyLCB0aGUgY29uZGl0aW9uIGlzIGFsd2F5
cyBtZXQuCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEhh
c2hTZXQ8SW5kZXhUeXBlPiBoaWdoT3JkZXJBZGphY2VudHM7CisKKyAgICAgICAgZm9yIChJbmRl
eFR5cGUgYWRqYWNlbnRUbXBJbmRleCA6IGFkamFjZW50c09mVSkgeworICAgICAgICAgICAgQVNT
RVJUKGFkamFjZW50VG1wSW5kZXggIT0gdik7CisgICAgICAgICAgICBBU1NFUlQoYWRqYWNlbnRU
bXBJbmRleCAhPSB1KTsKKyAgICAgICAgICAgIGlmICghaGFzQmVlblNpbXBsaWZpZWQoYWRqYWNl
bnRUbXBJbmRleCkgJiYgbV9kZWdyZWVzW2FkamFjZW50VG1wSW5kZXhdID49IG1fcmVnc0luUHJp
b3JpdHlPcmRlci5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGFkZFJlc3VsdCA9IGhp
Z2hPcmRlckFkamFjZW50cy5hZGQoYWRqYWNlbnRUbXBJbmRleCk7CisgICAgICAgICAgICAgICAg
aWYgKGFkZFJlc3VsdC5pc05ld0VudHJ5ICYmIGhpZ2hPcmRlckFkamFjZW50cy5zaXplKCkgPj0g
bV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoSW5kZXhUeXBl
IGFkamFjZW50VG1wSW5kZXggOiBhZGphY2VudHNPZlYpIHsKKyAgICAgICAgICAgIEFTU0VSVChh
ZGphY2VudFRtcEluZGV4ICE9IHUpOworICAgICAgICAgICAgQVNTRVJUKGFkamFjZW50VG1wSW5k
ZXggIT0gdik7CisgICAgICAgICAgICBpZiAoIWhhc0JlZW5TaW1wbGlmaWVkKGFkamFjZW50VG1w
SW5kZXgpICYmIG1fZGVncmVlc1thZGphY2VudFRtcEluZGV4XSA+PSBtX3JlZ3NJblByaW9yaXR5
T3JkZXIuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgYXV0byBhZGRSZXN1bHQgPSBoaWdoT3Jk
ZXJBZGphY2VudHMuYWRkKGFkamFjZW50VG1wSW5kZXgpOworICAgICAgICAgICAgICAgIGlmIChh
ZGRSZXN1bHQuaXNOZXdFbnRyeSAmJiBoaWdoT3JkZXJBZGphY2VudHMuc2l6ZSgpID49IG1fcmVn
c0luUHJpb3JpdHlPcmRlci5zaXplKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEFTU0VSVChoaWdoT3JkZXJB
ZGphY2VudHMuc2l6ZSgpIDwgbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKSk7CisgICAgICAg
IHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgcHJlY29sb3JlZENvYWxlc2NpbmdIZXVy
aXN0aWMoSW5kZXhUeXBlIHUsIEluZGV4VHlwZSB2KQorICAgIHsKKyAgICAgICAgaWYgKHRyYWNl
RGVidWcpCisgICAgICAgICAgICBkYXRhTG9nKCIgICAgQ2hlY2tpbmcgcHJlY29sb3JlZENvYWxl
c2NpbmdIZXVyaXN0aWNcbiIpOworICAgICAgICBBU1NFUlQoaXNQcmVjb2xvcmVkKHUpKTsKKyAg
ICAgICAgQVNTRVJUKCFpc1ByZWNvbG9yZWQodikpOworICAgICAgICAKKyAgICAgICAgLy8gSWYg
dSBpcyBhIHBpbm5lZCByZWdpc3RlciB0aGVuIGl0J3MgYWx3YXlzIHNhZmUgdG8gY29hbGVzY2Uu
IE5vdGUgdGhhdCB3aGVuIHdlIGNhbGwgdGhpcywKKyAgICAgICAgLy8gd2UgaGF2ZSBhbHJlYWR5
IHByb3ZlZCB0aGF0IHRoZXJlIGlzIG5vIGludGVyZmVyZW5jZSBiZXR3ZWVuIHUgYW5kIHYuCisg
ICAgICAgIGlmICghbV9tdXRhYmxlUmVncy5nZXQobV9jb2xvcmVkVG1wW3VdKSkKKyAgICAgICAg
ICAgIHJldHVybiB0cnVlOworCisgICAgICAgIC8vIElmIGFueSBhZGphY2VudCBvZiB0aGUgbm9u
LWNvbG9yZWQgbm9kZSBpcyBub3QgYW4gYWRqYWNlbnQgb2YgdGhlIGNvbG9yZWQgbm9kZSBBTkQg
aGFzIGEgZGVncmVlID49IEsKKyAgICAgICAgLy8gdGhlcmUgaXMgYSByaXNrIHRoYXQgdGhpcyBu
b2RlIG5lZWRzIHRvIGhhdmUgdGhlIHNhbWUgY29sb3IgYXMgb3VyIHByZWNvbG9yZWQgbm9kZS4g
SWYgd2UgY29hbGVzY2Ugc3VjaAorICAgICAgICAvLyBtb3ZlLCB3ZSBtYXkgY3JlYXRlIGFuIHVu
Y29sb3JhYmxlIGdyYXBoLgorICAgICAgICBjb25zdCBhdXRvJiBhZGphY2VudHNPZlYgPSBtX2Fk
amFjZW5jeUxpc3Rbdl07CisgICAgICAgIGZvciAodW5zaWduZWQgYWRqYWNlbnRUbXBJbmRleCA6
IGFkamFjZW50c09mVikgeworICAgICAgICAgICAgaWYgKCFpc1ByZWNvbG9yZWQoYWRqYWNlbnRU
bXBJbmRleCkKKyAgICAgICAgICAgICAgICAmJiAhaGFzQmVlblNpbXBsaWZpZWQoYWRqYWNlbnRU
bXBJbmRleCkKKyAgICAgICAgICAgICAgICAmJiBtX2RlZ3JlZXNbYWRqYWNlbnRUbXBJbmRleF0g
Pj0gbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKQorICAgICAgICAgICAgICAgICYmICFtX2lu
dGVyZmVyZW5jZUVkZ2VzLmNvbnRhaW5zKEludGVyZmVyZW5jZUVkZ2UodSwgYWRqYWNlbnRUbXBJ
bmRleCkpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAg
ICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyNpZiBQTEFURk9STShDT0NPQSkK
KyNwcmFnbWEgbWFyayAtCisjZW5kaWYKKworICAgIC8vIEludGVyZmVyZW5jZSBlZGdlcyBhcmUg
bm90IGRpcmVjdGVkLiBBbiBlZGdlIGJldHdlZW4gYW55IHR3byBUbXBzIGlzIHJlcHJlc2VudGVk
CisgICAgLy8gYnkgdGhlIGNvbmNhdGVuYXRlZCB2YWx1ZXMgb2YgdGhlIHNtYWxsZXN0IFRtcCBm
b2xsb3dlZCBieSB0aGUgYmlnZ2VyIFRtcC4KKyAgICBjbGFzcyBJbnRlcmZlcmVuY2VFZGdlIHsK
KyAgICBwdWJsaWM6CisgICAgICAgIEludGVyZmVyZW5jZUVkZ2UoKQorICAgICAgICB7CisgICAg
ICAgIH0KKworICAgICAgICBJbnRlcmZlcmVuY2VFZGdlKEluZGV4VHlwZSBhLCBJbmRleFR5cGUg
YikKKyAgICAgICAgeworICAgICAgICAgICAgQVNTRVJUKGEpOworICAgICAgICAgICAgQVNTRVJU
KGIpOworICAgICAgICAgICAgQVNTRVJUX1dJVEhfTUVTU0FHRShhICE9IGIsICJBIFRtcCBjYW4g
bmV2ZXIgaW50ZXJmZXJlIHdpdGggaXRzZWxmLiBEb2luZyBzbyB3b3VsZCBmb3JjZSBpdCB0byBi
ZSB0aGUgc3VwZXJwb3NpdGlvbiBvZiB0d28gcmVnaXN0ZXJzLiIpOworCisgICAgICAgICAgICBp
ZiAoYiA8IGEpCisgICAgICAgICAgICAgICAgc3RkOjpzd2FwKGEsIGIpOworICAgICAgICAgICAg
bV92YWx1ZSA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihhKSA8PCAzMiB8IGI7CisgICAgICAgIH0K
KworICAgICAgICBJbnRlcmZlcmVuY2VFZGdlKFdURjo6SGFzaFRhYmxlRGVsZXRlZFZhbHVlVHlw
ZSkKKyAgICAgICAgICAgIDogbV92YWx1ZShzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ2NF90Pjo6
bWF4KCkpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIEluZGV4VHlwZSBmaXJzdCgp
IGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtX3ZhbHVlID4+IDMyICYgMHhm
ZmZmZmZmZjsKKyAgICAgICAgfQorCisgICAgICAgIEluZGV4VHlwZSBzZWNvbmQoKSBjb25zdAor
ICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbV92YWx1ZSAmIDB4ZmZmZmZmZmY7CisgICAg
ICAgIH0KKworICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgSW50ZXJmZXJlbmNlRWRnZSBv
dGhlcikgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1fdmFsdWUgPT0gb3Ro
ZXIubV92YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgaXNIYXNoVGFibGVEZWxldGVk
VmFsdWUoKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKnRoaXMgPT0gSW50
ZXJmZXJlbmNlRWRnZShXVEY6Okhhc2hUYWJsZURlbGV0ZWRWYWx1ZSk7CisgICAgICAgIH0KKwor
ICAgICAgICB1bnNpZ25lZCBoYXNoKCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0
dXJuIFdURjo6SW50SGFzaDx1aW50NjRfdD46Omhhc2gobV92YWx1ZSk7CisgICAgICAgIH0KKwor
ICAgICAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKKyAgICAgICAgeworICAg
ICAgICAgICAgb3V0LnByaW50KGZpcnN0KCksICI8PT4iLCBzZWNvbmQoKSk7CisgICAgICAgIH0K
KworICAgIHByaXZhdGU6CisgICAgICAgIHVpbnQ2NF90IG1fdmFsdWUgeyAwIH07CisgICAgfTsK
KworICAgIHN0cnVjdCBJbnRlcmZlcmVuY2VFZGdlSGFzaCB7CisgICAgICAgIHN0YXRpYyB1bnNp
Z25lZCBoYXNoKGNvbnN0IEludGVyZmVyZW5jZUVkZ2UmIGtleSkgeyByZXR1cm4ga2V5Lmhhc2go
KTsgfQorICAgICAgICBzdGF0aWMgYm9vbCBlcXVhbChjb25zdCBJbnRlcmZlcmVuY2VFZGdlJiBh
LCBjb25zdCBJbnRlcmZlcmVuY2VFZGdlJiBiKSB7IHJldHVybiBhID09IGI7IH0KKyAgICAgICAg
c3RhdGljIGNvbnN0IGJvb2wgc2FmZVRvQ29tcGFyZVRvRW1wdHlPckRlbGV0ZWQgPSB0cnVlOwor
ICAgIH07CisgICAgdHlwZWRlZiBTaW1wbGVDbGFzc0hhc2hUcmFpdHM8SW50ZXJmZXJlbmNlRWRn
ZT4gSW50ZXJmZXJlbmNlRWRnZUhhc2hUcmFpdHM7CisKKyAgICBjb25zdCBWZWN0b3I8UmVnPiYg
bV9yZWdzSW5Qcmlvcml0eU9yZGVyOworICAgIFJlZ2lzdGVyU2V0IG1fbXV0YWJsZVJlZ3M7Cisg
ICAgSW5kZXhUeXBlIG1fbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4IHsgMCB9OworCisgICAg
Ly8gVGhlIGludGVyZmVyZW5jZSBncmFwaC4KKyAgICBIYXNoU2V0PEludGVyZmVyZW5jZUVkZ2Us
IEludGVyZmVyZW5jZUVkZ2VIYXNoLCBJbnRlcmZlcmVuY2VFZGdlSGFzaFRyYWl0cz4gbV9pbnRl
cmZlcmVuY2VFZGdlczsKKyAgICBWZWN0b3I8VmVjdG9yPEluZGV4VHlwZSwgMCwgVW5zYWZlVmVj
dG9yT3ZlcmZsb3csIDQ+LCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9hZGphY2VuY3lMaXN0
OworICAgIFZlY3RvcjxJbmRleFR5cGUsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX2RlZ3Jl
ZXM7CisKKyAgICAvLyBJbnN0ZWFkIG9mIGtlZXBpbmcgdHJhY2sgb2YgdGhlIG1vdmUgaW5zdHJ1
Y3Rpb25zLCB3ZSBqdXN0IGtlZXAgdGhlaXIgb3BlcmFuZHMgYXJvdW5kIGFuZCB1c2UgdGhlIGlu
ZGV4CisgICAgLy8gaW4gdGhlIHZlY3RvciBhcyB0aGUgImlkZW50aWZpZXIiIGZvciB0aGUgbW92
ZS4KKyAgICBzdHJ1Y3QgTW92ZU9wZXJhbmRzIHsKKyAgICAgICAgSW5kZXhUeXBlIHNyY0luZGV4
OworICAgICAgICBJbmRleFR5cGUgZHN0SW5kZXg7CisgICAgfTsKKyAgICBWZWN0b3I8TW92ZU9w
ZXJhbmRzLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9jb2FsZXNjaW5nQ2FuZGlkYXRlczsK
KworICAgIC8vIExpc3Qgb2YgZXZlcnkgbW92ZSBpbnN0cnVjdGlvbiBhc3NvY2lhdGVkIHdpdGgg
YSBUbXAuCisgICAgVmVjdG9yPEhhc2hTZXQ8SW5kZXhUeXBlLCB0eXBlbmFtZSBEZWZhdWx0SGFz
aDxJbmRleFR5cGU+OjpIYXNoLCBXVEY6OlVuc2lnbmVkV2l0aFplcm9LZXlIYXNoVHJhaXRzPElu
ZGV4VHlwZT4+PiBtX21vdmVMaXN0OworCisgICAgLy8gQ29sb3JzLgorICAgIFZlY3RvcjxSZWcs
IDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX2NvbG9yZWRUbXA7CisgICAgVmVjdG9yPEluZGV4
VHlwZT4gbV9zcGlsbGVkVG1wczsKKworICAgIC8vIFZhbHVlcyB0aGF0IGhhdmUgYmVlbiBjb2Fs
ZXNjZWQgd2l0aCBhbiBvdGhlciB2YWx1ZS4KKyAgICBWZWN0b3I8SW5kZXhUeXBlLCAwLCBVbnNh
ZmVWZWN0b3JPdmVyZmxvdz4gbV9jb2FsZXNjZWRUbXBzOworCisgICAgLy8gVGhlIHN0YWNrIG9m
IFRtcCByZW1vdmVkIGZyb20gdGhlIGdyYXBoIGFuZCByZWFkeSBmb3IgY29sb3JpbmcuCisgICAg
Qml0VmVjdG9yIG1faXNPblNlbGVjdFN0YWNrOworICAgIFZlY3RvcjxJbmRleFR5cGU+IG1fc2Vs
ZWN0U3RhY2s7CisKKyAgICBJbmRleFR5cGUgbV9mcmFtZVBvaW50ZXJJbmRleCB7IDAgfTsKKyAg
ICBCaXRWZWN0b3IgbV9pbnRlcmZlcmVzV2l0aEZyYW1lUG9pbnRlcjsKKworICAgIHN0cnVjdCBP
cmRlcmVkTW92ZVNldCB7CisgICAgICAgIHVuc2lnbmVkIGFkZE1vdmUoKQorICAgICAgICB7Cisg
ICAgICAgICAgICBBU1NFUlQobV9sb3dQcmlvcml0eU1vdmVMaXN0LmlzRW1wdHkoKSk7CisgICAg
ICAgICAgICBBU1NFUlQoIW1fZmlyc3RMb3dQcmlvcml0eU1vdmVJbmRleCk7CisKKyAgICAgICAg
ICAgIHVuc2lnbmVkIG5leHRJbmRleCA9IG1fcG9zaXRpb25Jbk1vdmVMaXN0LnNpemUoKTsKKyAg
ICAgICAgICAgIHVuc2lnbmVkIHBvc2l0aW9uID0gbV9tb3ZlTGlzdC5zaXplKCk7CisgICAgICAg
ICAgICBtX21vdmVMaXN0LmFwcGVuZChuZXh0SW5kZXgpOworICAgICAgICAgICAgbV9wb3NpdGlv
bkluTW92ZUxpc3QuYXBwZW5kKHBvc2l0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiBuZXh0SW5k
ZXg7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHN0YXJ0QWRkaW5nTG93UHJpb3JpdHlNb3Zl
cygpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFTU0VSVChtX2xvd1ByaW9yaXR5TW92ZUxpc3Qu
aXNFbXB0eSgpKTsKKyAgICAgICAgICAgIG1fZmlyc3RMb3dQcmlvcml0eU1vdmVJbmRleCA9IG1f
bW92ZUxpc3Quc2l6ZSgpOworICAgICAgICB9CisKKyAgICAgICAgdW5zaWduZWQgYWRkTG93UHJp
b3JpdHlNb3ZlKCkKKyAgICAgICAgeworICAgICAgICAgICAgQVNTRVJUKG1fZmlyc3RMb3dQcmlv
cml0eU1vdmVJbmRleCA9PSBtX21vdmVMaXN0LnNpemUoKSk7CisKKyAgICAgICAgICAgIHVuc2ln
bmVkIG5leHRJbmRleCA9IG1fcG9zaXRpb25Jbk1vdmVMaXN0LnNpemUoKTsKKyAgICAgICAgICAg
IHVuc2lnbmVkIHBvc2l0aW9uID0gbV9sb3dQcmlvcml0eU1vdmVMaXN0LnNpemUoKTsKKyAgICAg
ICAgICAgIG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5hcHBlbmQobmV4dEluZGV4KTsKKyAgICAgICAg
ICAgIG1fcG9zaXRpb25Jbk1vdmVMaXN0LmFwcGVuZChwb3NpdGlvbik7CisKKyAgICAgICAgICAg
IEFTU0VSVChuZXh0SW5kZXggPj0gbV9maXJzdExvd1ByaW9yaXR5TW92ZUluZGV4KTsKKworICAg
ICAgICAgICAgcmV0dXJuIG5leHRJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgaXNF
bXB0eSgpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtX21vdmVMaXN0Lmlz
RW1wdHkoKSAmJiBtX2xvd1ByaW9yaXR5TW92ZUxpc3QuaXNFbXB0eSgpOworICAgICAgICB9CisK
KyAgICAgICAgYm9vbCBjb250YWlucyh1bnNpZ25lZCBpbmRleCkKKyAgICAgICAgeworICAgICAg
ICAgICAgcmV0dXJuIG1fcG9zaXRpb25Jbk1vdmVMaXN0W2luZGV4XSAhPSBzdGQ6Om51bWVyaWNf
bGltaXRzPHVuc2lnbmVkPjo6bWF4KCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHRha2VN
b3ZlKHVuc2lnbmVkIG1vdmVJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQg
cG9zaXRpb25Jbk1vdmVMaXN0ID0gbV9wb3NpdGlvbkluTW92ZUxpc3RbbW92ZUluZGV4XTsKKyAg
ICAgICAgICAgIGlmIChwb3NpdGlvbkluTW92ZUxpc3QgPT0gc3RkOjpudW1lcmljX2xpbWl0czx1
bnNpZ25lZD46Om1heCgpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAg
aWYgKG1vdmVJbmRleCA8IG1fZmlyc3RMb3dQcmlvcml0eU1vdmVJbmRleCkgeworICAgICAgICAg
ICAgICAgIEFTU0VSVChtX21vdmVMaXN0W3Bvc2l0aW9uSW5Nb3ZlTGlzdF0gPT0gbW92ZUluZGV4
KTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBsYXN0SW5kZXggPSBtX21vdmVMaXN0Lmxhc3Qo
KTsKKyAgICAgICAgICAgICAgICBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdFtsYXN0SW5kZXhdID0gcG9z
aXRpb25Jbk1vdmVMaXN0OworICAgICAgICAgICAgICAgIG1fbW92ZUxpc3RbcG9zaXRpb25Jbk1v
dmVMaXN0XSA9IGxhc3RJbmRleDsKKyAgICAgICAgICAgICAgICBtX21vdmVMaXN0LnJlbW92ZUxh
c3QoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQVNTRVJUKG1fbG93
UHJpb3JpdHlNb3ZlTGlzdFtwb3NpdGlvbkluTW92ZUxpc3RdID09IG1vdmVJbmRleCk7CisgICAg
ICAgICAgICAgICAgdW5zaWduZWQgbGFzdEluZGV4ID0gbV9sb3dQcmlvcml0eU1vdmVMaXN0Lmxh
c3QoKTsKKyAgICAgICAgICAgICAgICBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdFtsYXN0SW5kZXhdID0g
cG9zaXRpb25Jbk1vdmVMaXN0OworICAgICAgICAgICAgICAgIG1fbG93UHJpb3JpdHlNb3ZlTGlz
dFtwb3NpdGlvbkluTW92ZUxpc3RdID0gbGFzdEluZGV4OworICAgICAgICAgICAgICAgIG1fbG93
UHJpb3JpdHlNb3ZlTGlzdC5yZW1vdmVMYXN0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgIG1fcG9zaXRpb25Jbk1vdmVMaXN0W21vdmVJbmRleF0gPSBzdGQ6Om51bWVyaWNfbGltaXRz
PHVuc2lnbmVkPjo6bWF4KCk7CisKKyAgICAgICAgICAgIEFTU0VSVCghY29udGFpbnMobW92ZUlu
ZGV4KSk7CisgICAgICAgIH0KKworICAgICAgICB1bnNpZ25lZCB0YWtlTGFzdE1vdmUoKQorICAg
ICAgICB7CisgICAgICAgICAgICBBU1NFUlQoIWlzRW1wdHkoKSk7CisKKyAgICAgICAgICAgIHVu
c2lnbmVkIGxhc3RJbmRleDsKKyAgICAgICAgICAgIGlmICghbV9tb3ZlTGlzdC5pc0VtcHR5KCkp
IHsKKyAgICAgICAgICAgICAgICBsYXN0SW5kZXggPSBtX21vdmVMaXN0LnRha2VMYXN0KCk7Cisg
ICAgICAgICAgICAgICAgQVNTRVJUKG1fcG9zaXRpb25Jbk1vdmVMaXN0W2xhc3RJbmRleF0gPT0g
bV9tb3ZlTGlzdC5zaXplKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAg
ICBsYXN0SW5kZXggPSBtX2xvd1ByaW9yaXR5TW92ZUxpc3QudGFrZUxhc3QoKTsKKyAgICAgICAg
ICAgICAgICBBU1NFUlQobV9wb3NpdGlvbkluTW92ZUxpc3RbbGFzdEluZGV4XSA9PSBtX2xvd1By
aW9yaXR5TW92ZUxpc3Quc2l6ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fcG9z
aXRpb25Jbk1vdmVMaXN0W2xhc3RJbmRleF0gPSBzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVk
Pjo6bWF4KCk7CisKKyAgICAgICAgICAgIEFTU0VSVCghY29udGFpbnMobGFzdEluZGV4KSk7Cisg
ICAgICAgICAgICByZXR1cm4gbGFzdEluZGV4OworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBy
ZXR1cm5Nb3ZlKHVuc2lnbmVkIGluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUaGlz
IGFzc2VydGlvbiBpcyBhIGJpdCBzdHJpY3QgYnV0IHRoYXQgaXMgaG93IHRoZSBtb3ZlIGxpc3Qg
c2hvdWxkIGJlIHVzZWQuIFRoZSBvbmx5IGtpbmQgb2YgbW92ZXMgdGhhdCBjYW4KKyAgICAgICAg
ICAgIC8vIHJldHVybiB0byB0aGUgbGlzdCBhcmUgdGhlIG9uZXMgdGhhdCB3ZSBwcmV2aW91c2x5
IGZhaWxlZCB0byBjb2FsZXNjZSB3aXRoIHRoZSBjb25zZXJ2YXRpdmUgaGV1cmlzdGljcy4KKyAg
ICAgICAgICAgIC8vIFZhbHVlcyBzaG91bGQgbm90IGJlIGFkZGVkIGJhY2sgaWYgdGhleSB3ZXJl
IG5ldmVyIHRha2VuIG91dCB3aGVuIGF0dGVtcHRpbmcgY29hbGVzY2luZy4KKyAgICAgICAgICAg
IEFTU0VSVCghY29udGFpbnMoaW5kZXgpKTsKKworICAgICAgICAgICAgaWYgKGluZGV4IDwgbV9m
aXJzdExvd1ByaW9yaXR5TW92ZUluZGV4KSB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgcG9z
aXRpb24gPSBtX21vdmVMaXN0LnNpemUoKTsKKyAgICAgICAgICAgICAgICBtX21vdmVMaXN0LmFw
cGVuZChpbmRleCk7CisgICAgICAgICAgICAgICAgbV9wb3NpdGlvbkluTW92ZUxpc3RbaW5kZXhd
ID0gcG9zaXRpb247CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHVuc2ln
bmVkIHBvc2l0aW9uID0gbV9sb3dQcmlvcml0eU1vdmVMaXN0LnNpemUoKTsKKyAgICAgICAgICAg
ICAgICBtX2xvd1ByaW9yaXR5TW92ZUxpc3QuYXBwZW5kKGluZGV4KTsKKyAgICAgICAgICAgICAg
ICBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdFtpbmRleF0gPSBwb3NpdGlvbjsKKyAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgQVNTRVJUKGNvbnRhaW5zKGluZGV4KSk7CisgICAgICAgIH0KKworICAg
ICAgICB2b2lkIGNsZWFyKCkKKyAgICAgICAgeworICAgICAgICAgICAgbV9wb3NpdGlvbkluTW92
ZUxpc3QuY2xlYXIoKTsKKyAgICAgICAgICAgIG1fbW92ZUxpc3QuY2xlYXIoKTsKKyAgICAgICAg
ICAgIG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5jbGVhcigpOworICAgICAgICB9CisKKyAgICBwcml2
YXRlOgorICAgICAgICBWZWN0b3I8dW5zaWduZWQsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBt
X3Bvc2l0aW9uSW5Nb3ZlTGlzdDsKKyAgICAgICAgVmVjdG9yPHVuc2lnbmVkLCAwLCBVbnNhZmVW
ZWN0b3JPdmVyZmxvdz4gbV9tb3ZlTGlzdDsKKyAgICAgICAgVmVjdG9yPHVuc2lnbmVkLCAwLCBV
bnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9sb3dQcmlvcml0eU1vdmVMaXN0OworICAgICAgICB1bnNp
Z25lZCBtX2ZpcnN0TG93UHJpb3JpdHlNb3ZlSW5kZXggeyAwIH07CisgICAgfTsKKworICAgIC8v
IFdvcmsgbGlzdHMuCisgICAgLy8gU2V0IG9mICJtb3ZlIiBlbmFibGVkIGZvciBwb3NzaWJsZSBj
b2FsZXNjaW5nLgorICAgIE9yZGVyZWRNb3ZlU2V0IG1fd29ya2xpc3RNb3ZlczsKKyAgICAvLyBT
ZXQgb2YgIm1vdmUiIG5vdCB5ZXQgcmVhZHkgZm9yIGNvYWxlc2NpbmcuCisgICAgQml0VmVjdG9y
IG1fYWN0aXZlTW92ZXM7CisgICAgLy8gTG93LWRlZ3JlZSwgbm9uLU1vdmUgcmVsYXRlZC4KKyAg
ICBWZWN0b3I8SW5kZXhUeXBlPiBtX3NpbXBsaWZ5V29ya2xpc3Q7CisgICAgLy8gSGlnaC1kZWdy
ZWUgVG1wLgorICAgIEhhc2hTZXQ8SW5kZXhUeXBlPiBtX3NwaWxsV29ya2xpc3Q7CisgICAgLy8g
TG93LWRlZ3JlZSwgTW92ZSByZWxhdGVkLgorICAgIEhhc2hTZXQ8SW5kZXhUeXBlPiBtX2ZyZWV6
ZVdvcmtsaXN0OworCisgICAgYm9vbCBtX2hhc1NlbGVjdGVkU3BpbGwgeyBmYWxzZSB9OworICAg
IGJvb2wgbV9oYXNDb2FsZXNjZWROb25Ucml2aWFsTW92ZSB7IGZhbHNlIH07CisKKyAgICAvLyBU
aGUgbWFwcGluZyBvZiBUbXAgdG8gdGhlaXIgYWxpYXMgZm9yIE1vdmVzIHRoYXQgYXJlIGFsd2F5
cyBjb2FsZXNjaW5nIHJlZ2FyZGxlc3Mgb2Ygc3BpbGxpbmcuCisgICAgVmVjdG9yPEluZGV4VHlw
ZSwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fY29hbGVzY2VkVG1wc0F0U3BpbGw7CisgICAg
CisgICAgY29uc3QgSGFzaFNldDx1bnNpZ25lZD4mIG1fdW5zcGlsbGFibGVUbXBzOworfTsKKwor
Ly8gVGhpcyBwZXJmb3JtIGFsbCB0aGUgdGFza3MgdGhhdCBhcmUgc3BlY2lmaWMgdG8gY2VydGFp
biByZWdpc3RlciB0eXBlLgordGVtcGxhdGU8QXJnOjpUeXBlIHR5cGU+CitjbGFzcyBDb2xvcmlu
Z0FsbG9jYXRvciA6IHB1YmxpYyBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yPHVuc2lnbmVkPiB7
CitwdWJsaWM6CisgICAgQ29sb3JpbmdBbGxvY2F0b3IoQ29kZSYgY29kZSwgVG1wV2lkdGgmIHRt
cFdpZHRoLCBjb25zdCBVc2VDb3VudHM8VG1wPiYgdXNlQ291bnRzLCBjb25zdCBIYXNoU2V0PHVu
c2lnbmVkPiYgdW5zcGlsbGFibGVUbXApCisgICAgICAgIDogQWJzdHJhY3RDb2xvcmluZ0FsbG9j
YXRvcjx1bnNpZ25lZD4oY29kZS5yZWdzSW5Qcmlvcml0eU9yZGVyKHR5cGUpLCBBYnNvbHV0ZVRt
cE1hcHBlcjx0eXBlPjo6bGFzdE1hY2hpbmVSZWdpc3RlckluZGV4KCksIHRtcEFycmF5U2l6ZShj
b2RlKSwgdW5zcGlsbGFibGVUbXApCisgICAgICAgICwgbV9jb2RlKGNvZGUpCisgICAgICAgICwg
bV90bXBXaWR0aCh0bXBXaWR0aCkKKyAgICAgICAgLCBtX3VzZUNvdW50cyh1c2VDb3VudHMpCisg
ICAgeworICAgICAgICBpZiAodHlwZSA9PSBBcmc6OkdQKSB7CisgICAgICAgICAgICBtX2ZyYW1l
UG9pbnRlckluZGV4ID0gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgoVG1w
KE1hY3JvQXNzZW1ibGVyOjpmcmFtZVBvaW50ZXJSZWdpc3RlcikpOworICAgICAgICAgICAgbV9p
bnRlcmZlcmVzV2l0aEZyYW1lUG9pbnRlci5lbnN1cmVTaXplKHRtcEFycmF5U2l6ZShjb2RlKSk7
CisgICAgICAgIH0KKworICAgICAgICBpbml0aWFsaXplUHJlY29sb3JlZFRtcCgpOworICAgICAg
ICBidWlsZCgpOworICAgICAgICBhbGxvY2F0ZSgpOworICAgIH0KKworICAgIFRtcCBnZXRBbGlh
cyhUbXAgdG1wKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIEFic29sdXRlVG1wTWFwcGVy
PHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleChnZXRBbGlhcyhBYnNvbHV0ZVRtcE1hcHBlcjx0
eXBlPjo6YWJzb2x1dGVJbmRleCh0bXApKSk7CisgICAgfQorCisgICAgLy8gVGhpcyB0ZWxscyB5
b3UgaWYgYSBNb3ZlIHdpbGwgYmUgY29hbGVzY2FibGUgaWYgdGhlIHNyYyBhbmQgZHN0IGVuZCB1
cCBtYXRjaGluZy4gVGhpcyBtZXRob2QKKyAgICAvLyByZWxpZXMgb24gYW4gYW5hbHlzaXMgdGhh
dCBpcyBpbnZhbGlkYXRlZCBieSByZWdpc3RlciBhbGxvY2F0aW9uLCBzbyB5b3UgaXQncyBvbmx5
IG1lYW5pbmdmdWwgdG8KKyAgICAvLyBjYWxsIHRoaXMgKmJlZm9yZSogcmVwbGFjaW5nIHRoZSBU
bXAncyBpbiB0aGlzIEluc3Qgd2l0aCByZWdpc3RlcnMgb3Igc3BpbGwgc2xvdHMuCisgICAgYm9v
bCBtYXlCZUNvYWxlc2NhYmxlKGNvbnN0IEluc3QmIGluc3QpIGNvbnN0CisgICAgeworICAgICAg
ICByZXR1cm4gbWF5QmVDb2FsZXNjYWJsZUltcGwoaW5zdCwgJm1fdG1wV2lkdGgpOworICAgIH0K
KworICAgIGJvb2wgaXNVc2VsZXNzTW92ZShjb25zdCBJbnN0JiBpbnN0KSBjb25zdAorICAgIHsK
KyAgICAgICAgcmV0dXJuIG1heUJlQ29hbGVzY2FibGVJbXBsKGluc3QsIG51bGxwdHIpICYmIGlu
c3QuYXJnc1swXS50bXAoKSA9PSBpbnN0LmFyZ3NbMV0udG1wKCk7CisgICAgfQorCisgICAgVG1w
IGdldEFsaWFzV2hlblNwaWxsaW5nKFRtcCB0bXApIGNvbnN0CisgICAgeworICAgICAgICBBU1NF
UlRfV0lUSF9NRVNTQUdFKCFtX3NwaWxsZWRUbXBzLmlzRW1wdHkoKSwgIlRoaXMgZnVuY3Rpb24g
aXMgb25seSB2YWxpZCBmb3IgY29hbGVzY2luZyBkdXJpbmcgc3BpbGxpbmcuIik7CisKKyAgICAg
ICAgaWYgKG1fY29hbGVzY2VkVG1wc0F0U3BpbGwuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0
dXJuIHRtcDsKKworICAgICAgICB1bnNpZ25lZCBhbGlhc0luZGV4ID0gQWJzb2x1dGVUbXBNYXBw
ZXI8dHlwZT46OmFic29sdXRlSW5kZXgodG1wKTsKKyAgICAgICAgd2hpbGUgKHVuc2lnbmVkIG5l
eHRBbGlhc0luZGV4ID0gbV9jb2FsZXNjZWRUbXBzQXRTcGlsbFthbGlhc0luZGV4XSkKKyAgICAg
ICAgICAgIGFsaWFzSW5kZXggPSBuZXh0QWxpYXNJbmRleDsKKworICAgICAgICBUbXAgYWxpYXMg
PSBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgoYWxpYXNJbmRl
eCk7CisKKyAgICAgICAgQVNTRVJUX1dJVEhfTUVTU0FHRSghbV9zcGlsbGVkVG1wcy5jb250YWlu
cyhhbGlhc0luZGV4KSB8fCBhbGlhcyA9PSB0bXAsICJUaGUgYWxpYXNlcyBhdCBzcGlsbCBzaG91
bGQgYWx3YXlzIGJlIGNvbG9yYWJsZS4gU29tZXRoaW5nIHdlbnQgaG9ycmlibHkgd3JvbmcuIik7
CisKKyAgICAgICAgcmV0dXJuIGFsaWFzOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1l
IEluZGV4SXRlcmF0b3I+CisgICAgY2xhc3MgSW5kZXhUb1RtcEl0ZXJhdG9yQWRhcHRvciB7Cisg
ICAgcHVibGljOgorICAgICAgICBJbmRleFRvVG1wSXRlcmF0b3JBZGFwdG9yKEluZGV4SXRlcmF0
b3ImJiBpbmRleEl0ZXJhdG9yKQorICAgICAgICAgICAgOiBtX2luZGV4SXRlcmF0b3IoV1RGTW92
ZShpbmRleEl0ZXJhdG9yKSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgVG1wIG9w
ZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9t
QWJzb2x1dGVJbmRleCgqbV9pbmRleEl0ZXJhdG9yKTsgfQorICAgICAgICBJbmRleFRvVG1wSXRl
cmF0b3JBZGFwdG9yJiBvcGVyYXRvcisrKCkgeyArK21faW5kZXhJdGVyYXRvcjsgcmV0dXJuICp0
aGlzOyB9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEluZGV4VG9UbXBJdGVyYXRv
ckFkYXB0b3ImIG90aGVyKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbV9p
bmRleEl0ZXJhdG9yID09IG90aGVyLm1faW5kZXhJdGVyYXRvcjsKKyAgICAgICAgfQorCisgICAg
ICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBJbmRleFRvVG1wSXRlcmF0b3JBZGFwdG9yJiBvdGhl
cikgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIp
OworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBJbmRleEl0ZXJhdG9yIG1faW5k
ZXhJdGVyYXRvcjsKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ29sbGVjdGlvbj4K
KyAgICBjbGFzcyBJbmRleFRvVG1wSXRlcmFibGVBZGFwdG9yIHsKKyAgICBwdWJsaWM6CisgICAg
ICAgIEluZGV4VG9UbXBJdGVyYWJsZUFkYXB0b3IoY29uc3QgQ29sbGVjdGlvbiYgY29sbGVjdGlv
bikKKyAgICAgICAgICAgIDogbV9jb2xsZWN0aW9uKGNvbGxlY3Rpb24pCisgICAgICAgIHsKKyAg
ICAgICAgfQorCisgICAgICAgIEluZGV4VG9UbXBJdGVyYXRvckFkYXB0b3I8dHlwZW5hbWUgQ29s
bGVjdGlvbjo6Y29uc3RfaXRlcmF0b3I+IGJlZ2luKCkgY29uc3QKKyAgICAgICAgeworICAgICAg
ICAgICAgcmV0dXJuIG1fY29sbGVjdGlvbi5iZWdpbigpOworICAgICAgICB9CisKKyAgICAgICAg
SW5kZXhUb1RtcEl0ZXJhdG9yQWRhcHRvcjx0eXBlbmFtZSBDb2xsZWN0aW9uOjpjb25zdF9pdGVy
YXRvcj4gZW5kKCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1fY29sbGVj
dGlvbi5lbmQoKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3QgQ29s
bGVjdGlvbiYgbV9jb2xsZWN0aW9uOworICAgIH07CisKKyAgICBJbmRleFRvVG1wSXRlcmFibGVB
ZGFwdG9yPFZlY3Rvcjx1bnNpZ25lZD4+IHNwaWxsZWRUbXBzKCkgY29uc3QgeyByZXR1cm4gbV9z
cGlsbGVkVG1wczsgfQorCisgICAgYm9vbCByZXF1aXJlc1NwaWxsaW5nKCkgY29uc3QgeyByZXR1
cm4gIW1fc3BpbGxlZFRtcHMuaXNFbXB0eSgpOyB9CisKKyAgICBSZWcgYWxsb2NhdGVkUmVnKFRt
cCB0bXApIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQoIXRtcC5pc1JlZygpKTsKKyAgICAg
ICAgQVNTRVJUKG1fY29sb3JlZFRtcC5zaXplKCkpOworICAgICAgICBBU1NFUlQodG1wLmlzR1Ao
KSA9PSAodHlwZSA9PSBBcmc6OkdQKSk7CisKKyAgICAgICAgUmVnIHJlZyA9IG1fY29sb3JlZFRt
cFtBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh0bXApXTsKKyAgICAgICAg
aWYgKCFyZWcpIHsKKyAgICAgICAgICAgIGRhdGFMb2coIkZBVEFMOiBObyBjb2xvciBmb3IgIiwg
dG1wLCAiXG4iKTsKKyAgICAgICAgICAgIGRhdGFMb2coIkNvZGU6XG4iKTsKKyAgICAgICAgICAg
IGRhdGFMb2cobV9jb2RlKTsKKyAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVE
KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlZzsKKyAgICB9CisKK3ByaXZhdGU6Cisg
ICAgc3RhdGljIHVuc2lnbmVkIHRtcEFycmF5U2l6ZShDb2RlJiBjb2RlKQorICAgIHsKKyAgICAg
ICAgdW5zaWduZWQgbnVtVG1wcyA9IGNvZGUubnVtVG1wcyh0eXBlKTsKKyAgICAgICAgcmV0dXJu
IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KG51bVRtcHMpOworICAgIH0K
KworICAgIHZvaWQgaW5pdGlhbGl6ZVByZWNvbG9yZWRUbXAoKQorICAgIHsKKyAgICAgICAgbV9j
b2xvcmVkVG1wLnJlc2l6ZShtX2xhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleCArIDEpOworICAg
ICAgICBmb3IgKHVuc2lnbmVkIGkgPSAxOyBpIDw9IG1fbGFzdFByZWNvbG9yZWRSZWdpc3Rlcklu
ZGV4OyArK2kpIHsKKyAgICAgICAgICAgIFRtcCB0bXAgPSBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBl
Pjo6dG1wRnJvbUFic29sdXRlSW5kZXgoaSk7CisgICAgICAgICAgICBBU1NFUlQodG1wLmlzUmVn
KCkpOworICAgICAgICAgICAgbV9jb2xvcmVkVG1wW2ldID0gdG1wLnJlZygpOworICAgICAgICB9
CisgICAgfQorCisgICAgYm9vbCBtYXlCZUNvYWxlc2NlZChBcmcgbGVmdCwgQXJnIHJpZ2h0KQor
ICAgIHsKKyAgICAgICAgaWYgKCFsZWZ0LmlzVG1wKCkgfHwgIXJpZ2h0LmlzVG1wKCkpCisgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgVG1wIGxlZnRUbXAgPSBsZWZ0LnRtcCgp
OworICAgICAgICBUbXAgcmlnaHRUbXAgPSByaWdodC50bXAoKTsKKworICAgICAgICBpZiAobGVm
dFRtcCA9PSByaWdodFRtcCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBp
ZiAobGVmdFRtcC5pc0dQKCkgIT0gKHR5cGUgPT0gQXJnOjpHUCkgfHwgcmlnaHRUbXAuaXNHUCgp
ICE9ICh0eXBlID09IEFyZzo6R1ApKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
ICAgIHVuc2lnbmVkIGxlZnRJbmRleCA9IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0
ZUluZGV4KGxlZnRUbXApOworICAgICAgICB1bnNpZ25lZCByaWdodEluZGV4ID0gQWJzb2x1dGVU
bXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgocmlnaHRUbXApOworCisgICAgICAgIHJldHVy
biAhbV9pbnRlcmZlcmVuY2VFZGdlcy5jb250YWlucyhJbnRlcmZlcmVuY2VFZGdlKGxlZnRJbmRl
eCwgcmlnaHRJbmRleCkpOworICAgIH0KKworICAgIHZvaWQgYWRkVG9Mb3dQcmlvcml0eUNvYWxl
c2NpbmdDYW5kaWRhdGVzKEFyZyBsZWZ0LCBBcmcgcmlnaHQpCisgICAgeworICAgICAgICBBU1NF
UlQobWF5QmVDb2FsZXNjZWQobGVmdCwgcmlnaHQpKTsKKyAgICAgICAgVG1wIGxlZnRUbXAgPSBs
ZWZ0LnRtcCgpOworICAgICAgICBUbXAgcmlnaHRUbXAgPSByaWdodC50bXAoKTsKKworICAgICAg
ICB1bnNpZ25lZCBsZWZ0SW5kZXggPSBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJ
bmRleChsZWZ0VG1wKTsKKyAgICAgICAgdW5zaWduZWQgcmlnaHRJbmRleCA9IEFic29sdXRlVG1w
TWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHJpZ2h0VG1wKTsKKworICAgICAgICB1bnNpZ25l
ZCBuZXh0TW92ZUluZGV4ID0gbV9jb2FsZXNjaW5nQ2FuZGlkYXRlcy5zaXplKCk7CisgICAgICAg
IG1fY29hbGVzY2luZ0NhbmRpZGF0ZXMuYXBwZW5kKHsgbGVmdEluZGV4LCByaWdodEluZGV4IH0p
OworCisgICAgICAgIHVuc2lnbmVkIG5ld0luZGV4SW5Xb3JrbGlzdCA9IG1fd29ya2xpc3RNb3Zl
cy5hZGRMb3dQcmlvcml0eU1vdmUoKTsKKyAgICAgICAgQVNTRVJUX1VOVVNFRChuZXdJbmRleElu
V29ya2xpc3QsIG5ld0luZGV4SW5Xb3JrbGlzdCA9PSBuZXh0TW92ZUluZGV4KTsKKworICAgICAg
ICBBU1NFUlQobmV4dE1vdmVJbmRleCA8PSBtX2FjdGl2ZU1vdmVzLnNpemUoKSk7CisgICAgICAg
IG1fYWN0aXZlTW92ZXMuZW5zdXJlU2l6ZShuZXh0TW92ZUluZGV4ICsgMSk7CisKKyAgICAgICAg
bV9tb3ZlTGlzdFtsZWZ0SW5kZXhdLmFkZChuZXh0TW92ZUluZGV4KTsKKyAgICAgICAgbV9tb3Zl
TGlzdFtyaWdodEluZGV4XS5hZGQobmV4dE1vdmVJbmRleCk7CisgICAgfQorCisgICAgdm9pZCBi
dWlsZCgpCisgICAgeworICAgICAgICBUbXBMaXZlbmVzczx0eXBlPiBsaXZlbmVzcyhtX2NvZGUp
OworICAgICAgICBmb3IgKEJhc2ljQmxvY2sqIGJsb2NrIDogbV9jb2RlKSB7CisgICAgICAgICAg
ICB0eXBlbmFtZSBUbXBMaXZlbmVzczx0eXBlPjo6TG9jYWxDYWxjIGxvY2FsQ2FsYyhsaXZlbmVz
cywgYmxvY2spOworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnN0SW5kZXggPSBibG9jay0+
c2l6ZSgpOyBpbnN0SW5kZXgtLTspIHsKKyAgICAgICAgICAgICAgICBJbnN0JiBpbnN0ID0gYmxv
Y2stPmF0KGluc3RJbmRleCk7CisgICAgICAgICAgICAgICAgSW5zdCogbmV4dEluc3QgPSBibG9j
ay0+Z2V0KGluc3RJbmRleCArIDEpOworICAgICAgICAgICAgICAgIGJ1aWxkKCZpbnN0LCBuZXh0
SW5zdCwgbG9jYWxDYWxjKTsKKyAgICAgICAgICAgICAgICBsb2NhbENhbGMuZXhlY3V0ZShpbnN0
SW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVpbGQobnVsbHB0ciwgJmJsb2Nr
LT5hdCgwKSwgbG9jYWxDYWxjKTsKKyAgICAgICAgfQorICAgICAgICBidWlsZExvd1ByaW9yaXR5
TW92ZUxpc3QoKTsKKyAgICB9CisKKyAgICB2b2lkIGJ1aWxkKEluc3QqIHByZXZJbnN0LCBJbnN0
KiBuZXh0SW5zdCwgY29uc3QgdHlwZW5hbWUgVG1wTGl2ZW5lc3M8dHlwZT46OkxvY2FsQ2FsYyYg
bG9jYWxDYWxjKQorICAgIHsKKyAgICAgICAgaWYgKHRyYWNlRGVidWcpCisgICAgICAgICAgICBk
YXRhTG9nKCJCdWlsZGluZyBiZXR3ZWVuICIsIHBvaW50ZXJEdW1wKHByZXZJbnN0KSwgIiBhbmQg
IiwgcG9pbnRlckR1bXAobmV4dEluc3QpLCAiOlxuIik7CisgICAgICAgIEluc3Q6OmZvckVhY2hE
ZWZXaXRoRXh0cmFDbG9iYmVyZWRSZWdzPFRtcD4oCisgICAgICAgICAgICBwcmV2SW5zdCwgbmV4
dEluc3QsCisgICAgICAgICAgICBbJl0gKGNvbnN0IFRtcCYgYXJnLCBBcmc6OlJvbGUsIEFyZzo6
VHlwZSBhcmdUeXBlLCBBcmc6OldpZHRoKSB7CisgICAgICAgICAgICAgICAgaWYgKGFyZ1R5cGUg
IT0gdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIAor
ICAgICAgICAgICAgICAgIC8vIEFsbCB0aGUgRGVmKClzIGludGVyZmVyZSB3aXRoIGVhY2ggb3Ro
ZXIgYW5kIHdpdGggYWxsIHRoZSBleHRyYSBjbG9iYmVyZWQgVG1wcy4KKyAgICAgICAgICAgICAg
ICAvLyBXZSBzaG91bGQgbm90IHVzZSBmb3JFYWNoRGVmV2l0aEV4dHJhQ2xvYmJlcmVkUmVncygp
IGhlcmUgc2luY2UgY29sb3JlZCBUbXBzCisgICAgICAgICAgICAgICAgLy8gZG8gbm90IG5lZWQg
aW50ZXJmZXJlbmNlIGVkZ2VzIGluIG91ciBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgICAgICAg
ICBJbnN0Ojpmb3JFYWNoRGVmPFRtcD4oCisgICAgICAgICAgICAgICAgICAgIHByZXZJbnN0LCBu
ZXh0SW5zdCwKKyAgICAgICAgICAgICAgICAgICAgWyZdIChUbXAmIG90aGVyQXJnLCBBcmc6OlJv
bGUsIEFyZzo6VHlwZSBhcmdUeXBlLCBBcmc6OldpZHRoKSB7CisgICAgICAgICAgICAgICAgICAg
ICAgICBpZiAoYXJnVHlwZSAhPSB0eXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJl
dHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAg
aWYgKHRyYWNlRGVidWcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUxvZygiICAg
IEFkZGluZyBkZWYtZGVmIGVkZ2U6ICIsIGFyZywgIiwgIiwgb3RoZXJBcmcsICJcbiIpOworICAg
ICAgICAgICAgICAgICAgICAgICAgdGhpcy0+YWRkRWRnZShhcmcsIG90aGVyQXJnKTsKKyAgICAg
ICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9KTsKKworICAgICAgICBpZiAocHJldklu
c3QgJiYgbWF5QmVDb2FsZXNjYWJsZSgqcHJldkluc3QpKSB7CisgICAgICAgICAgICAvLyBXZSBk
byBub3Qgd2FudCB0aGUgVXNlKCkgb2YgdGhpcyBtb3ZlIHRvIGludGVyZmVyZSB3aXRoIHRoZSBE
ZWYoKSwgZXZlbiBpZiBpdCBpcyBsaXZlCisgICAgICAgICAgICAvLyBhZnRlciB0aGUgTW92ZS4g
SWYgd2Ugd2VyZSB0byBhZGQgdGhlIGludGVyZmVyZW5jZSBlZGdlLCBpdCB3b3VsZCBiZSBpbXBv
c3NpYmxlIHRvCisgICAgICAgICAgICAvLyBjb2FsZXNjZSB0aGUgTW92ZSBldmVuIGlmIHRoZSB0
d28gVG1wIG5ldmVyIGludGVyZmVyZSBhbnl3aGVyZS4KKyAgICAgICAgICAgIFRtcCBkZWZUbXA7
CisgICAgICAgICAgICBUbXAgdXNlVG1wOworICAgICAgICAgICAgcHJldkluc3QtPmZvckVhY2hU
bXAoWyZkZWZUbXAsICZ1c2VUbXBdIChUbXAmIGFyZ1RtcCwgQXJnOjpSb2xlIHJvbGUsIEFyZzo6
VHlwZSwgQXJnOjpXaWR0aCkgeworICAgICAgICAgICAgICAgIGlmIChBcmc6OmlzTGF0ZURlZihy
b2xlKSkKKyAgICAgICAgICAgICAgICAgICAgZGVmVG1wID0gYXJnVG1wOworICAgICAgICAgICAg
ICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBU1NFUlQoQXJnOjppc0Vhcmx5VXNlKHJv
bGUpKTsKKyAgICAgICAgICAgICAgICAgICAgdXNlVG1wID0gYXJnVG1wOworICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgQVNTRVJUKGRlZlRtcCk7CisgICAg
ICAgICAgICBBU1NFUlQodXNlVG1wKTsKKworICAgICAgICAgICAgdW5zaWduZWQgbmV4dE1vdmVJ
bmRleCA9IG1fY29hbGVzY2luZ0NhbmRpZGF0ZXMuc2l6ZSgpOworICAgICAgICAgICAgbV9jb2Fs
ZXNjaW5nQ2FuZGlkYXRlcy5hcHBlbmQoeyBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1
dGVJbmRleCh1c2VUbXApLCBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChk
ZWZUbXApIH0pOworCisgICAgICAgICAgICB1bnNpZ25lZCBuZXdJbmRleEluV29ya2xpc3QgPSBt
X3dvcmtsaXN0TW92ZXMuYWRkTW92ZSgpOworICAgICAgICAgICAgQVNTRVJUX1VOVVNFRChuZXdJ
bmRleEluV29ya2xpc3QsIG5ld0luZGV4SW5Xb3JrbGlzdCA9PSBuZXh0TW92ZUluZGV4KTsKKwor
ICAgICAgICAgICAgQVNTRVJUKG5leHRNb3ZlSW5kZXggPD0gbV9hY3RpdmVNb3Zlcy5zaXplKCkp
OworICAgICAgICAgICAgbV9hY3RpdmVNb3Zlcy5lbnN1cmVTaXplKG5leHRNb3ZlSW5kZXggKyAx
KTsKKworICAgICAgICAgICAgZm9yIChjb25zdCBBcmcmIGFyZyA6IHByZXZJbnN0LT5hcmdzKSB7
CisgICAgICAgICAgICAgICAgYXV0byYgbGlzdCA9IG1fbW92ZUxpc3RbQWJzb2x1dGVUbXBNYXBw
ZXI8dHlwZT46OmFic29sdXRlSW5kZXgoYXJnLnRtcCgpKV07CisgICAgICAgICAgICAgICAgbGlz
dC5hZGQobmV4dE1vdmVJbmRleCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAo
Y29uc3QgVG1wJiBsaXZlVG1wIDogbG9jYWxDYWxjLmxpdmUoKSkgeworICAgICAgICAgICAgICAg
IGlmIChsaXZlVG1wICE9IHVzZVRtcCkgeworICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2VE
ZWJ1ZykKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICBBZGRpbmcgZGVmLWxp
dmUgZm9yIGNvYWxlc2NhYmxlOiAiLCBkZWZUbXAsICIsICIsIGxpdmVUbXAsICJcbiIpOworICAg
ICAgICAgICAgICAgICAgICBhZGRFZGdlKGRlZlRtcCwgbGl2ZVRtcCk7CisgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUaGUgbmV4dCBpbnN0cnVjdGlv
biBjb3VsZCBoYXZlIGVhcmx5IGNsb2JiZXJzIG9yIGVhcmx5IGRlZidzLiBXZSBuZWVkIHRvIGNv
bnNpZGVyCisgICAgICAgICAgICAvLyB0aG9zZSBub3cuCisgICAgICAgICAgICBhZGRFZGdlcyhu
dWxscHRyLCBuZXh0SW5zdCwgbG9jYWxDYWxjLmxpdmUoKSk7CisgICAgICAgIH0gZWxzZQorICAg
ICAgICAgICAgYWRkRWRnZXMocHJldkluc3QsIG5leHRJbnN0LCBsb2NhbENhbGMubGl2ZSgpKTsK
KyAgICB9CisKKyAgICB2b2lkIGJ1aWxkTG93UHJpb3JpdHlNb3ZlTGlzdCgpCisgICAgeworICAg
ICAgICBpZiAoIWlzWDg2KCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgbV93b3Jr
bGlzdE1vdmVzLnN0YXJ0QWRkaW5nTG93UHJpb3JpdHlNb3ZlcygpOworICAgICAgICBmb3IgKEJh
c2ljQmxvY2sqIGJsb2NrIDogbV9jb2RlKSB7CisgICAgICAgICAgICBmb3IgKEluc3QmIGluc3Qg
OiAqYmxvY2spIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RkOjpvcHRpb25hbDx1bnNpZ25lZD4g
ZGVmQXJnSW5kZXggPSBpbnN0LnNob3VsZFRyeUFsaWFzaW5nRGVmKCkpIHsKKyAgICAgICAgICAg
ICAgICAgICAgQXJnIG9wMSA9IGluc3QuYXJnc1sqZGVmQXJnSW5kZXggLSAyXTsKKyAgICAgICAg
ICAgICAgICAgICAgQXJnIG9wMiA9IGluc3QuYXJnc1sqZGVmQXJnSW5kZXggLSAxXTsKKyAgICAg
ICAgICAgICAgICAgICAgQXJnIGRlc3QgPSBpbnN0LmFyZ3NbKmRlZkFyZ0luZGV4XTsKKworICAg
ICAgICAgICAgICAgICAgICBpZiAob3AxID09IGRlc3QgfHwgb3AyID09IGRlc3QpCisgICAgICAg
ICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICBpZiAobWF5
QmVDb2FsZXNjZWQob3AxLCBkZXN0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZFRvTG93
UHJpb3JpdHlDb2FsZXNjaW5nQ2FuZGlkYXRlcyhvcDEsIGRlc3QpOworICAgICAgICAgICAgICAg
ICAgICBpZiAob3AxICE9IG9wMiAmJiBtYXlCZUNvYWxlc2NlZChvcDIsIGRlc3QpKQorICAgICAg
ICAgICAgICAgICAgICAgICAgYWRkVG9Mb3dQcmlvcml0eUNvYWxlc2NpbmdDYW5kaWRhdGVzKG9w
MiwgZGVzdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9Cisg
ICAgfQorCisgICAgdm9pZCBhZGRFZGdlcyhJbnN0KiBwcmV2SW5zdCwgSW5zdCogbmV4dEluc3Qs
IHR5cGVuYW1lIFRtcExpdmVuZXNzPHR5cGU+OjpMb2NhbENhbGM6Okl0ZXJhYmxlIGxpdmVUbXBz
KQorICAgIHsKKyAgICAgICAgLy8gQWxsIHRoZSBEZWYoKXMgaW50ZXJmZXJlIHdpdGggZXZlcnRo
aW5nIGxpdmUuCisgICAgICAgIEluc3Q6OmZvckVhY2hEZWZXaXRoRXh0cmFDbG9iYmVyZWRSZWdz
PFRtcD4oCisgICAgICAgICAgICBwcmV2SW5zdCwgbmV4dEluc3QsCisgICAgICAgICAgICBbJl0g
KGNvbnN0IFRtcCYgYXJnLCBBcmc6OlJvbGUsIEFyZzo6VHlwZSBhcmdUeXBlLCBBcmc6OldpZHRo
KSB7CisgICAgICAgICAgICAgICAgaWYgKGFyZ1R5cGUgIT0gdHlwZSkKKyAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGZvciAoY29u
c3QgVG1wJiBsaXZlVG1wIDogbGl2ZVRtcHMpIHsKKyAgICAgICAgICAgICAgICAgICAgQVNTRVJU
KGxpdmVUbXAuaXNHUCgpID09ICh0eXBlID09IEFyZzo6R1ApKTsKKyAgICAgICAgICAgICAgICAg
ICAgCisgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQorICAgICAgICAgICAgICAg
ICAgICAgICAgZGF0YUxvZygiICAgIEFkZGluZyBkZWYtbGl2ZSBlZGdlOiAiLCBhcmcsICIsICIs
IGxpdmVUbXAsICJcbiIpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAg
ICAgYWRkRWRnZShhcmcsIGxpdmVUbXApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgICAgIGlmICh0eXBlID09IEFyZzo6R1AgJiYgIWFyZy5pc0dQUigpKQorICAgICAgICAgICAg
ICAgICAgICBtX2ludGVyZmVyZXNXaXRoRnJhbWVQb2ludGVyLnF1aWNrU2V0KEFic29sdXRlVG1w
TWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KGFyZykpOworICAgICAgICAgICAgfSk7CisgICAg
fQorCisgICAgdm9pZCBhZGRFZGdlKFRtcCBhLCBUbXAgYikKKyAgICB7CisgICAgICAgIEFTU0VS
VF9XSVRIX01FU1NBR0UoYS5pc0dQKCkgPT0gYi5pc0dQKCksICJBbiBpbnRlcmZlcmVuY2UgYmV0
d2VlbiByZWdpc3RlcnMgb2YgZGlmZmVyZW50IHR5cGVzIGRvZXMgbm90IG1ha2Ugc2Vuc2UsIGl0
IGNhbiBsZWFkIHRvIG5vbi1jb2xvcmFibGUgZ3JhcGhzLiIpOworCisgICAgICAgIGFkZEVkZ2Uo
QWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgoYSksIEFic29sdXRlVG1wTWFw
cGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KGIpKTsKKyAgICB9CisKKyAgICAvLyBDYWxsaW5nIHRo
aXMgd2l0aG91dCBhIHRtcFdpZHRoIHdpbGwgcGVyZm9ybSBhIG1vcmUgY29uc2VydmF0aXZlIGNv
YWxlc2NpbmcgYW5hbHlzaXMgdGhhdCBhc3N1bWVzCisgICAgLy8gdGhhdCBNb3ZlMzIncyBhcmUg
bm90IGNvYWxlc2NhYmxlLgorICAgIHN0YXRpYyBib29sIG1heUJlQ29hbGVzY2FibGVJbXBsKGNv
bnN0IEluc3QmIGluc3QsIFRtcFdpZHRoKiB0bXBXaWR0aCkKKyAgICB7CisgICAgICAgIHN3aXRj
aCAodHlwZSkgeworICAgICAgICBjYXNlIEFyZzo6R1A6CisgICAgICAgICAgICBzd2l0Y2ggKGlu
c3Qua2luZC5vcGNvZGUpIHsKKyAgICAgICAgICAgIGNhc2UgTW92ZToKKyAgICAgICAgICAgIGNh
c2UgTW92ZTMyOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoK
KyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgY2FzZSBBcmc6OkZQOgorICAgICAgICAgICAgc3dpdGNoIChpbnN0
LmtpbmQub3Bjb2RlKSB7CisgICAgICAgICAgICBjYXNlIE1vdmVGbG9hdDoKKyAgICAgICAgICAg
IGNhc2UgTW92ZURvdWJsZToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRl
ZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBBU1NFUlRfV0lUSF9NRVNTQUdF
KGluc3QuYXJncy5zaXplKCkgPT0gMiwgIldlIGFzc3VtZSBjb2FsZWNhYmxlIG1vdmVzIG9ubHkg
aGF2ZSB0d28gYXJndW1lbnRzIGluIGEgZmV3IHBsYWNlcy4iKTsKKworICAgICAgICBpZiAoIWlu
c3QuYXJnc1swXS5pc1RtcCgpIHx8ICFpbnN0LmFyZ3NbMV0uaXNUbXAoKSkKKyAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgICAgICBBU1NFUlQoaW5zdC5hcmdzWzBdLnR5cGUoKSA9PSB0
eXBlKTsKKyAgICAgICAgQVNTRVJUKGluc3QuYXJnc1sxXS50eXBlKCkgPT0gdHlwZSk7CisKKyAg
ICAgICAgLy8gV2UgY2FuIGNvYWxlc2NlIGEgTW92ZTMyIHNvIGxvbmcgYXMgZWl0aGVyIG9mIHRo
ZSBmb2xsb3dpbmcgaG9sZHM6CisgICAgICAgIC8vIC0gVGhlIGlucHV0IGlzIGFscmVhZHkgemVy
by1maWxsZWQuCisgICAgICAgIC8vIC0gVGhlIG91dHB1dCBvbmx5IGNhcmVzIGFib3V0IHRoZSBs
b3cgMzIgYml0cy4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBpbnB1dCBw
cm9wZXJ0eSByZXF1aXJlcyBhbiBhbmFseXNpcyBvdmVyIFpEZWYncywgc28gaXQncyBvbmx5IHZh
bGlkIHNvIGxvbmcKKyAgICAgICAgLy8gYXMgdGhlIGlucHV0IGdldHMgYSByZWdpc3Rlci4gV2Ug
ZG9uJ3Qga25vdyBpZiB0aGUgaW5wdXQgZ2V0cyBhIHJlZ2lzdGVyLCBidXQgd2UgZG8ga25vdwor
ICAgICAgICAvLyB0aGF0IGlmIGl0IGRvZXNuJ3QgZ2V0IGEgcmVnaXN0ZXIgdGhlbiB3ZSB3aWxs
IHN0aWxsIGVtaXQgdGhpcyBNb3ZlMzIuCisgICAgICAgIGlmIChpbnN0LmtpbmQub3Bjb2RlID09
IE1vdmUzMikgeworICAgICAgICAgICAgaWYgKCF0bXBXaWR0aCkKKyAgICAgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIGlmICh0bXBXaWR0aC0+ZGVmV2lkdGgoaW5zdC5h
cmdzWzBdLnRtcCgpKSA+IEFyZzo6V2lkdGgzMgorICAgICAgICAgICAgICAgICYmIHRtcFdpZHRo
LT51c2VXaWR0aChpbnN0LmFyZ3NbMV0udG1wKCkpID4gQXJnOjpXaWR0aDMyKQorICAgICAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgfQorCisgICAgdm9pZCBzZWxlY3RTcGlsbCgpCisgICAgeworICAgICAgICBp
ZiAoIW1faGFzU2VsZWN0ZWRTcGlsbCkgeworICAgICAgICAgICAgbV9oYXNTZWxlY3RlZFNwaWxs
ID0gdHJ1ZTsKKworICAgICAgICAgICAgaWYgKG1faGFzQ29hbGVzY2VkTm9uVHJpdmlhbE1vdmUp
CisgICAgICAgICAgICAgICAgbV9jb2FsZXNjZWRUbXBzQXRTcGlsbCA9IG1fY29hbGVzY2VkVG1w
czsKKyAgICAgICAgfQorCisgICAgICAgIGF1dG8gaXRlcmF0b3IgPSBtX3NwaWxsV29ya2xpc3Qu
YmVnaW4oKTsKKworICAgICAgICBSRUxFQVNFX0FTU0VSVF9XSVRIX01FU1NBR0UoaXRlcmF0b3Ig
IT0gbV9zcGlsbFdvcmtsaXN0LmVuZCgpLCAic2VsZWN0U3BpbGwoKSBjYWxsZWQgd2hlbiB0aGVy
ZSB3YXMgbm8gc3BpbGwuIik7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUX1dJVEhfTUVTU0FHRSgh
bV91bnNwaWxsYWJsZVRtcHMuY29udGFpbnMoKml0ZXJhdG9yKSwgInRyeWluZyB0byBzcGlsbCB1
bnNwaWxsYWJsZSB0bXAiKTsKKworICAgICAgICAvLyBIaWdoZXIgc2NvcmUgbWVhbnMgbW9yZSBk
ZXNpcmFibGUgdG8gc3BpbGwuIExvd2VyIHNjb3JlcyBtYXhpbWl6ZSB0aGUgbGlrZWxpaG9vZCB0
aGF0IGEgdG1wCisgICAgICAgIC8vIGdldHMgYSByZWdpc3Rlci4KKyAgICAgICAgYXV0byBzY29y
ZSA9IFsmXSAoVG1wIHRtcCkgLT4gZG91YmxlIHsKKyAgICAgICAgICAgIC8vIEFpciBleHBvc2Vz
IHRoZSBjb25jZXB0IG9mICJmYXN0IHRtcHMiLCBhbmQgd2UgaW50ZXJwcmV0IHRoYXQgdG8gbWVh
biB0aGF0IHRoZSB0bXAKKyAgICAgICAgICAgIC8vIHNob3VsZCBhbHdheXMgYmUgaW4gYSByZWdp
c3Rlci4KKyAgICAgICAgICAgIGlmIChtX2NvZGUuaXNGYXN0VG1wKHRtcCkpCisgICAgICAgICAg
ICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIEFsbCBlbHNlIGJl
aW5nIGVxdWFsLCB0aGUgc2NvcmUgc2hvdWxkIGJlIGRpcmVjdGx5IHJlbGF0ZWQgdG8gdGhlIGRl
Z3JlZS4KKyAgICAgICAgICAgIGRvdWJsZSBkZWdyZWUgPSBzdGF0aWNfY2FzdDxkb3VibGU+KG1f
ZGVncmVlc1tBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh0bXApXSk7CisK
KyAgICAgICAgICAgIC8vIEFsbCBlbHNlIGJlaW5nIGVxdWFsLCB0aGUgc2NvcmUgc2hvdWxkIGJl
IGludmVyc2VseSByZWxhdGVkIHRvIHRoZSBudW1iZXIgb2Ygd2FybSB1c2VzIGFuZAorICAgICAg
ICAgICAgLy8gZGVmcy4KKyAgICAgICAgICAgIGNvbnN0IFVzZUNvdW50czxUbXA+OjpDb3VudHMq
IGNvdW50cyA9IG1fdXNlQ291bnRzW3RtcF07CisgICAgICAgICAgICBpZiAoIWNvdW50cykKKyAg
ICAgICAgICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0
eSgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBkb3VibGUgdXNlcyA9IGNvdW50cy0+bnVt
V2FybVVzZXMgKyBjb3VudHMtPm51bURlZnM7CisKKyAgICAgICAgICAgIC8vIElmIGl0J3MgYSBj
b25zdGFudCwgdGhlbiBpdCdzIG5vdCBhcyBiYWQgdG8gc3BpbGwuIFdlIGNhbiByZW1hdGVyaWFs
aXplIGl0IGluIG1hbnkKKyAgICAgICAgICAgIC8vIGNhc2VzLgorICAgICAgICAgICAgaWYgKGNv
dW50cy0+bnVtQ29uc3REZWZzID09IDEgJiYgY291bnRzLT5udW1EZWZzID09IDEpCisgICAgICAg
ICAgICAgICAgdXNlcyAvPSAyOworCisgICAgICAgICAgICByZXR1cm4gZGVncmVlIC8gdXNlczsK
KyAgICAgICAgfTsKKworICAgICAgICBhdXRvIHZpY3RpbUl0ZXJhdG9yID0gaXRlcmF0b3I7Cisg
ICAgICAgIGRvdWJsZSBtYXhTY29yZSA9IHNjb3JlKEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0
bXBGcm9tQWJzb2x1dGVJbmRleCgqaXRlcmF0b3IpKTsKKworICAgICAgICArK2l0ZXJhdG9yOwor
ICAgICAgICBmb3IgKDtpdGVyYXRvciAhPSBtX3NwaWxsV29ya2xpc3QuZW5kKCk7ICsraXRlcmF0
b3IpIHsKKyAgICAgICAgICAgIGRvdWJsZSB0bXBTY29yZSA9IHNjb3JlKEFic29sdXRlVG1wTWFw
cGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleCgqaXRlcmF0b3IpKTsKKyAgICAgICAgICAg
IGlmICh0bXBTY29yZSA+IG1heFNjb3JlKSB7CisgICAgICAgICAgICAgICAgQVNTRVJUKCFtX3Vu
c3BpbGxhYmxlVG1wcy5jb250YWlucygqaXRlcmF0b3IpKTsKKyAgICAgICAgICAgICAgICB2aWN0
aW1JdGVyYXRvciA9IGl0ZXJhdG9yOworICAgICAgICAgICAgICAgIG1heFNjb3JlID0gdG1wU2Nv
cmU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB1bnNpZ25lZCB2aWN0aW1J
bmRleCA9ICp2aWN0aW1JdGVyYXRvcjsKKyAgICAgICAgbV9zcGlsbFdvcmtsaXN0LnJlbW92ZSh2
aWN0aW1JdGVyYXRvcik7CisgICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5hcHBlbmQodmljdGlt
SW5kZXgpOworCisgICAgICAgIGZyZWV6ZU1vdmVzKHZpY3RpbUluZGV4KTsKKyAgICB9CisKKyAg
ICB2b2lkIGFsbG9jYXRlKCkKKyAgICB7CisgICAgICAgIEFTU0VSVF9XSVRIX01FU1NBR0UobV9h
Y3RpdmVNb3Zlcy5zaXplKCkgPj0gbV9jb2FsZXNjaW5nQ2FuZGlkYXRlcy5zaXplKCksICJUaGUg
YWN0aXZlTW92ZSBzZXQgc2hvdWxkIGJlIGJpZyBlbm91Z2ggZm9yIHRoZSBxdWljayBvcGVyYXRp
b25zIG9mIEJpdFZlY3Rvci4iKTsKKworICAgICAgICBtYWtlV29ya0xpc3QoKTsKKworICAgICAg
ICBpZiAoZGVidWcpIHsKKyAgICAgICAgICAgIGRhdGFMb2coIkludGVyZmVyZW5jZTogIiwgbGlz
dER1bXAobV9pbnRlcmZlcmVuY2VFZGdlcyksICJcbiIpOworICAgICAgICAgICAgZHVtcEludGVy
ZmVyZW5jZUdyYXBoSW5Eb3QoV1RGOjpkYXRhRmlsZSgpKTsKKyAgICAgICAgICAgIGRhdGFMb2co
IkNvYWxlc2NpbmcgY2FuZGlkYXRlczpcbiIpOworICAgICAgICAgICAgZm9yIChNb3ZlT3BlcmFu
ZHMmIG1vdmVPcCA6IG1fY29hbGVzY2luZ0NhbmRpZGF0ZXMpIHsKKyAgICAgICAgICAgICAgICBk
YXRhTG9nKCIgICAgIiwgQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUlu
ZGV4KG1vdmVPcC5zcmNJbmRleCksCisgICAgICAgICAgICAgICAgICAgICIgLT4gIiwgQWJzb2x1
dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KG1vdmVPcC5kc3RJbmRleCks
ICJcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGF0YUxvZygiSW5pdGlhbCB3b3Jr
IGxpc3RcbiIpOworICAgICAgICAgICAgZHVtcFdvcmtMaXN0cyhXVEY6OmRhdGFGaWxlKCkpOwor
ICAgICAgICB9CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpIHsK
KyAgICAgICAgICAgICAgICBkYXRhTG9nKCJCZWZvcmUgR3JhcGggc2ltcGxpZmljYXRpb24gaXRl
cmF0aW9uXG4iKTsKKyAgICAgICAgICAgICAgICBkdW1wV29ya0xpc3RzKFdURjo6ZGF0YUZpbGUo
KSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghbV9zaW1wbGlmeVdvcmtsaXN0
LmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICBzaW1wbGlmeSgpOworICAgICAgICAgICAgZWxz
ZSBpZiAoIW1fd29ya2xpc3RNb3Zlcy5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgY29hbGVz
Y2UoKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCFtX2ZyZWV6ZVdvcmtsaXN0LmlzRW1wdHkoKSkK
KyAgICAgICAgICAgICAgICBmcmVlemUoKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCFtX3NwaWxs
V29ya2xpc3QuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIHNlbGVjdFNwaWxsKCk7CisKKyAg
ICAgICAgICAgIGlmICh0cmFjZURlYnVnKSB7CisgICAgICAgICAgICAgICAgZGF0YUxvZygiQWZ0
ZXIgR3JhcGggc2ltcGxpZmljYXRpb24gaXRlcmF0aW9uXG4iKTsKKyAgICAgICAgICAgICAgICBk
dW1wV29ya0xpc3RzKFdURjo6ZGF0YUZpbGUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0g
d2hpbGUgKCFtX3NpbXBsaWZ5V29ya2xpc3QuaXNFbXB0eSgpIHx8ICFtX3dvcmtsaXN0TW92ZXMu
aXNFbXB0eSgpIHx8ICFtX2ZyZWV6ZVdvcmtsaXN0LmlzRW1wdHkoKSB8fCAhbV9zcGlsbFdvcmts
aXN0LmlzRW1wdHkoKSk7CisKKyAgICAgICAgYXNzaWduQ29sb3JzKCk7CisgICAgfQorCisjaWYg
UExBVEZPUk0oQ09DT0EpCisjcHJhZ21hIG1hcmsgLSBEZWJ1Z2dpbmcgaGVscGVycy4KKyNlbmRp
ZgorCisgICAgdm9pZCBkdW1wSW50ZXJmZXJlbmNlR3JhcGhJbkRvdChQcmludFN0cmVhbSYgb3V0
KQorICAgIHsKKyAgICAgICAgb3V0LnByaW50KCJncmFwaCBJbnRlcmZlcmVuY2VHcmFwaCB7IFxu
Iik7CisKKyAgICAgICAgSGFzaFNldDxUbXA+IHRtcHNXaXRoSW50ZXJmZXJlbmNlczsKKyAgICAg
ICAgZm9yIChjb25zdCBhdXRvJiBlZGdlIDogbV9pbnRlcmZlcmVuY2VFZGdlcykgeworICAgICAg
ICAgICAgdG1wc1dpdGhJbnRlcmZlcmVuY2VzLmFkZChBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6
dG1wRnJvbUFic29sdXRlSW5kZXgoZWRnZS5maXJzdCgpKSk7CisgICAgICAgICAgICB0bXBzV2l0
aEludGVyZmVyZW5jZXMuYWRkKEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1
dGVJbmRleChlZGdlLnNlY29uZCgpKSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGNvbnN0
IGF1dG8mIHRtcCA6IHRtcHNXaXRoSW50ZXJmZXJlbmNlcykgeworICAgICAgICAgICAgdW5zaWdu
ZWQgdG1wSW5kZXggPSBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh0bXAp
OworICAgICAgICAgICAgaWYgKHRtcEluZGV4IDwgbV9kZWdyZWVzLnNpemUoKSkKKyAgICAgICAg
ICAgICAgICBvdXQucHJpbnQoIiAgICAiLCB0bXAuaW50ZXJuYWxWYWx1ZSgpLCAiIFtsYWJlbD1c
IiIsIHRtcCwgIiAoIiwgbV9kZWdyZWVzW3RtcEluZGV4XSwgIilcIl07XG4iKTsKKyAgICAgICAg
ICAgIGVsc2UKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiAgICAiLCB0bXAuaW50ZXJuYWxW
YWx1ZSgpLCAiIFtsYWJlbD1cIiIsIHRtcCwgIlwiXTtcbiIpOworICAgICAgICB9CisKKyAgICAg
ICAgZm9yIChjb25zdCBhdXRvJiBlZGdlIDogbV9pbnRlcmZlcmVuY2VFZGdlcykKKyAgICAgICAg
ICAgIG91dC5wcmludCgiICAgICIsIGVkZ2UuZmlyc3QoKSwgIiAtLSAiLCBlZGdlLnNlY29uZCgp
LCAiO1xuIik7CisgICAgICAgIG91dC5wcmludCgifVxuIik7CisgICAgfQorCisgICAgdm9pZCBk
dW1wV29ya0xpc3RzKFByaW50U3RyZWFtJiBvdXQpCisgICAgeworICAgICAgICBvdXQucHJpbnQo
IlNpbXBsaWZ5IHdvcmsgbGlzdDpcbiIpOworICAgICAgICBmb3IgKHVuc2lnbmVkIHRtcEluZGV4
IDogbV9zaW1wbGlmeVdvcmtsaXN0KQorICAgICAgICAgICAgb3V0LnByaW50KCIgICAgIiwgQWJz
b2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KHRtcEluZGV4KSwgIlxu
Iik7CisgICAgICAgIG91dC5wcmludGYoIk1vdmVzIHdvcmsgbGlzdCBpcyBlbXB0eT8gJWRcbiIs
IG1fd29ya2xpc3RNb3Zlcy5pc0VtcHR5KCkpOworICAgICAgICBvdXQucHJpbnQoIkZyZWV6ZSB3
b3JrIGxpc3Q6XG4iKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCB0bXBJbmRleCA6IG1fZnJlZXpl
V29ya2xpc3QpCisgICAgICAgICAgICBvdXQucHJpbnQoIiAgICAiLCBBYnNvbHV0ZVRtcE1hcHBl
cjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgodG1wSW5kZXgpLCAiXG4iKTsKKyAgICAgICAg
b3V0LnByaW50KCJTcGlsbCB3b3JrIGxpc3Q6XG4iKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCB0
bXBJbmRleCA6IG1fc3BpbGxXb3JrbGlzdCkKKyAgICAgICAgICAgIG91dC5wcmludCgiICAgICIs
IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleCh0bXBJbmRleCks
ICJcbiIpOworICAgIH0KKworICAgIHVzaW5nIEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0b3I8dW5z
aWduZWQ+OjphZGRFZGdlOworICAgIHVzaW5nIEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0b3I8dW5z
aWduZWQ+OjpnZXRBbGlhczsKKworICAgIENvZGUmIG1fY29kZTsKKyAgICBUbXBXaWR0aCYgbV90
bXBXaWR0aDsKKyAgICAvLyBGSVhNRTogc3BpbGxpbmcgc2hvdWxkIG5vdCB0eXBlIHNwZWNpZmlj
LiBJdCBpcyBvbmx5IGEgc2lkZSBlZmZlY3Qgb2YgdXNpbmcgVXNlQ291bnRzLgorICAgIGNvbnN0
IFVzZUNvdW50czxUbXA+JiBtX3VzZUNvdW50czsKK307CisKK2NsYXNzIEl0ZXJhdGVkUmVnaXN0
ZXJDb2FsZXNjaW5nIHsKK3B1YmxpYzoKKyAgICBJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZyhD
b2RlJiBjb2RlKQorICAgICAgICA6IG1fY29kZShjb2RlKQorICAgICAgICAsIG1fdXNlQ291bnRz
KGNvZGUpCisgICAgeworICAgIH0KKworICAgIHZvaWQgcnVuKCkKKyAgICB7CisgICAgICAgIHBh
ZEludGVyZmVyZW5jZShtX2NvZGUpOworICAgICAgICAKKyAgICAgICAgaXRlcmF0ZWRSZWdpc3Rl
ckNvYWxlc2NpbmdPblR5cGU8QXJnOjpHUD4oKTsKKyAgICAgICAgaXRlcmF0ZWRSZWdpc3RlckNv
YWxlc2NpbmdPblR5cGU8QXJnOjpGUD4oKTsKKworICAgICAgICBmaXhTcGlsbHNBZnRlclRlcm1p
bmFscygpOworCisgICAgICAgIGlmIChyZXBvcnRTdGF0cykKKyAgICAgICAgICAgIGRhdGFMb2co
Ik51bSBpdGVyYXRpb25zID0gIiwgbV9udW1JdGVyYXRpb25zLCAiXG4iKTsKKyAgICB9CisKK3By
aXZhdGU6CisgICAgdGVtcGxhdGU8QXJnOjpUeXBlIHR5cGU+CisgICAgdm9pZCBpdGVyYXRlZFJl
Z2lzdGVyQ29hbGVzY2luZ09uVHlwZSgpCisgICAgeworICAgICAgICBIYXNoU2V0PHVuc2lnbmVk
PiB1bnNwaWxsYWJsZVRtcHMgPSBjb21wdXRlVW5zcGlsbGFibGVUbXBzPHR5cGU+KCk7CisKKyAg
ICAgICAgLy8gRklYTUU6IElmIGEgVG1wIGlzIHVzZWQgb25seSBmcm9tIGEgU2NyYXRjaCByb2xl
IGFuZCB0aGF0IGFyZ3VtZW50IGlzICFhZG1pdHNTdGFjaywgdGhlbgorICAgICAgICAvLyB3ZSBz
aG91bGQgYWRkIHRoZSBUbXAgdG8gdW5zcGlsbGFibGVUbXBzLiBUaGF0IHdpbGwgaGVscCBhdm9p
ZCByZWxvb3Bpbmcgb25seSB0byB0dXJuIHRoZQorICAgICAgICAvLyBUbXAgaW50byBhbiB1bnNw
aWxsYWJsZSBUbXAuCisgICAgICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD0xNTI2OTkKKyAgICAgICAgCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAg
ICAgICArK21fbnVtSXRlcmF0aW9uczsKKworICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpCisg
ICAgICAgICAgICAgICAgZGF0YUxvZygiQ29kZSBhdCBpdGVyYXRpb24gIiwgbV9udW1JdGVyYXRp
b25zLCAiOlxuIiwgbV9jb2RlKTsKKworICAgICAgICAgICAgLy8gRklYTUU6IE9uZSB3YXkgdG8g
b3B0aW1pemUgdGhpcyBjb2RlIGlzIHRvIHJlbW92ZSB0aGUgcmVjb21wdXRhdGlvbiBpbnNpZGUg
dGhlIGZpeHBvaW50LgorICAgICAgICAgICAgLy8gV2UgbmVlZCB0byByZWNvbXB1dGUgYmVjYXVz
ZSBzcGlsbGluZyBhZGRzIHRtcHMsIGJ1dCB3ZSBjb3VsZCBqdXN0IHVwZGF0ZSB0bXBXaWR0aCB3
aGVuIHdlCisgICAgICAgICAgICAvLyBhZGQgdGhvc2UgdG1wcy4gTm90ZSB0aGF0IG9uZSBlYXN5
IHdheSB0byByZW1vdmUgdGhlIHJlY29tcHV0YXRpb24gaXMgdG8gbWFrZSBhbnkgbmV3bHkKKyAg
ICAgICAgICAgIC8vIGFkZGVkIFRtcHMgZ2V0IHRoZSBzYW1lIHVzZS9kZWYgd2lkdGhzIHRoYXQg
dGhlIG9yaWdpbmFsIFRtcCBnb3QuIEJ1dCwgdGhpcyBtYXkgaHVydCB0aGUKKyAgICAgICAgICAg
IC8vIHNwaWxsIGNvZGUgd2UgZW1pdC4gU2luY2Ugd2UgY3VycmVudGx5IHJlY29tcHV0ZSBUbXBX
aWR0aCBhZnRlciBzcGlsbGluZywgdGhlIG5ld2x5CisgICAgICAgICAgICAvLyBjcmVhdGVkIFRt
cHMgbWF5IGdldCBuYXJyb3dlciB1c2UvZGVmIHdpZHRocy4gT24gdGhlIG90aGVyIGhhbmQsIHRo
ZSBzcGlsbGVyIGFscmVhZHkKKyAgICAgICAgICAgIC8vIHNlbGVjdHMgd2hpY2ggbW92ZSBpbnN0
cnVjdGlvbiB0byB1c2UgYmFzZWQgb24gdGhlIG9yaWdpbmFsIFRtcCdzIHdpZHRocywgc28gaXQg
bWF5IG5vdAorICAgICAgICAgICAgLy8gbWF0dGVyIHRoYW4gYSBzdWJzZXF1ZW50IGl0ZXJhdGlv
biBzZWVzIGEgY29zZXJ2YXRpdmUgd2lkdGggZm9yIHRoZSBuZXcgVG1wcy4gQWxzbywgdGhlCisg
ICAgICAgICAgICAvLyByZWNvbXB1dGF0aW9uIG1heSBub3QgYWN0dWFsbHkgYmUgYSBwZXJmb3Jt
YW5jZSBwcm9ibGVtOyBpdCdzIGxpa2VseSB0aGF0IGEgYmV0dGVyIHdheSB0bworICAgICAgICAg
ICAgLy8gaW1wcm92ZSBwZXJmb3JtYW5jZSBvZiBUbXBXaWR0aCBpcyB0byByZXBsYWNlIGl0cyBI
YXNoTWFwIHdpdGggc29tZXRoaW5nIGVsc2UuIEl0J3MKKyAgICAgICAgICAgIC8vIHBvc3NpYmxl
IHRoYXQgbW9zdCBvZiB0aGUgVG1wV2lkdGggb3ZlcmhlYWQgaXMgZnJvbSBxdWVyaWVzIG9mIFRt
cFdpZHRoIHJhdGhlciB0aGFuIHRoZQorICAgICAgICAgICAgLy8gcmVjb21wdXRhdGlvbiwgaW4g
d2hpY2ggY2FzZSBzcGVlZGluZyB1cCB0aGUgbG9va3VwIHdvdWxkIGJlIGEgYmlnZ2VyIHdpbi4K
KyAgICAgICAgICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0x
NTI0NzgKKyAgICAgICAgICAgIG1fdG1wV2lkdGgucmVjb21wdXRlKG1fY29kZSk7CisgICAgICAg
ICAgICAKKyAgICAgICAgICAgIENvbG9yaW5nQWxsb2NhdG9yPHR5cGU+IGFsbG9jYXRvcihtX2Nv
ZGUsIG1fdG1wV2lkdGgsIG1fdXNlQ291bnRzLCB1bnNwaWxsYWJsZVRtcHMpOworICAgICAgICAg
ICAgaWYgKCFhbGxvY2F0b3IucmVxdWlyZXNTcGlsbGluZygpKSB7CisgICAgICAgICAgICAgICAg
YXNzaWduUmVnaXN0ZXJzVG9UbXAoYWxsb2NhdG9yKTsKKyAgICAgICAgICAgICAgICBpZiAodHJh
Y2VEZWJ1ZykKKyAgICAgICAgICAgICAgICAgICAgZGF0YUxvZygiU3VjY2Vzc2Z1bGwgYWxsb2Nh
dGlvbiBhdCBpdGVyYXRpb24gIiwgbV9udW1JdGVyYXRpb25zLCAiOlxuIiwgbV9jb2RlKTsKKwor
ICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZFNw
aWxsQW5kRmlsbDx0eXBlPihhbGxvY2F0b3IsIHVuc3BpbGxhYmxlVG1wcyk7CisgICAgICAgIH0K
KyAgICB9CisKKyAgICB0ZW1wbGF0ZTxBcmc6OlR5cGUgdHlwZT4KKyAgICBIYXNoU2V0PHVuc2ln
bmVkPiBjb21wdXRlVW5zcGlsbGFibGVUbXBzKCkKKyAgICB7CisgICAgICAgIEhhc2hTZXQ8dW5z
aWduZWQ+IHVuc3BpbGxhYmxlVG1wczsKKworICAgICAgICBzdHJ1Y3QgUmFuZ2UgeworICAgICAg
ICAgICAgdW5zaWduZWQgZmlyc3QgeyBzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4
KCkgfTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGxhc3QgeyAwIH07CisgICAgICAgICAgICB1bnNp
Z25lZCBjb3VudCB7IDAgfTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGFkbWl0U3RhY2tDb3VudCB7
IDAgfTsKKyAgICAgICAgfTsKKworICAgICAgICB1bnNpZ25lZCBudW1UbXBzID0gbV9jb2RlLm51
bVRtcHModHlwZSk7CisgICAgICAgIHVuc2lnbmVkIGFycmF5U2l6ZSA9IEFic29sdXRlVG1wTWFw
cGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KG51bVRtcHMpOworCisgICAgICAgIFZlY3RvcjxSYW5n
ZSwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IHJhbmdlczsKKyAgICAgICAgcmFuZ2VzLmZpbGwo
UmFuZ2UoKSwgYXJyYXlTaXplKTsKKworICAgICAgICB1bnNpZ25lZCBnbG9iYWxJbmRleCA9IDA7
CisgICAgICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBtX2NvZGUpIHsKKyAgICAgICAgICAg
IGZvciAoSW5zdCYgaW5zdCA6ICpibG9jaykgeworICAgICAgICAgICAgICAgIGluc3QuZm9yRWFj
aEFyZyhbJl0gKEFyZyYgYXJnLCBBcmc6OlJvbGUsIEFyZzo6VHlwZSBhcmdUeXBlLCBBcmc6Oldp
ZHRoKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChhcmcuaXNUbXAoKSAmJiBpbnN0LmFkbWl0
c1N0YWNrKGFyZykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdUeXBlICE9IHR5
cGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAg
ICAgICAgICAgICBUbXAgdG1wID0gYXJnLnRtcCgpOworICAgICAgICAgICAgICAgICAgICAgICAg
UmFuZ2UmIHJhbmdlID0gcmFuZ2VzW0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUlu
ZGV4KHRtcCldOworICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuY291bnQrKzsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIHJhbmdlLmFkbWl0U3RhY2tDb3VudCsrOworICAgICAgICAgICAg
ICAgICAgICAgICAgaWYgKGdsb2JhbEluZGV4IDwgcmFuZ2UuZmlyc3QpIHsKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICByYW5nZS5maXJzdCA9IGdsb2JhbEluZGV4OworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHJhbmdlLmxhc3QgPSBnbG9iYWxJbmRleDsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmxhc3Qg
PSBnbG9iYWxJbmRleDsKKworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAg
ICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgYXJnLmZvckVhY2hUbXBGYXN0
KFsmXSAoVG1wJiB0bXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXAuaXNHUCgp
ICE9ICh0eXBlID09IEFyZzo6R1ApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVy
bjsKKworICAgICAgICAgICAgICAgICAgICAgICAgUmFuZ2UmIHJhbmdlID0gcmFuZ2VzW0Fic29s
dXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHRtcCldOworICAgICAgICAgICAgICAg
ICAgICAgICAgcmFuZ2UuY291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnbG9i
YWxJbmRleCA8IHJhbmdlLmZpcnN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFu
Z2UuZmlyc3QgPSBnbG9iYWxJbmRleDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5n
ZS5sYXN0ID0gZ2xvYmFsSW5kZXg7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZS5sYXN0ID0gZ2xvYmFsSW5kZXg7CisgICAg
ICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAg
ICAgKytnbG9iYWxJbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsrZ2xvYmFsSW5k
ZXg7CisgICAgICAgIH0KKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gQWJzb2x1dGVUbXBNYXBw
ZXI8dHlwZT46Omxhc3RNYWNoaW5lUmVnaXN0ZXJJbmRleCgpICsgMTsgaSA8IHJhbmdlcy5zaXpl
KCk7ICsraSkgeworICAgICAgICAgICAgUmFuZ2UmIHJhbmdlID0gcmFuZ2VzW2ldOworICAgICAg
ICAgICAgaWYgKHJhbmdlLmxhc3QgLSByYW5nZS5maXJzdCA8PSAxICYmIHJhbmdlLmNvdW50ID4g
cmFuZ2UuYWRtaXRTdGFja0NvdW50KQorICAgICAgICAgICAgICAgIHVuc3BpbGxhYmxlVG1wcy5h
ZGQoaSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdW5zcGlsbGFibGVUbXBzOworICAg
IH0KKworICAgIHRlbXBsYXRlPEFyZzo6VHlwZSB0eXBlPgorICAgIHZvaWQgYXNzaWduUmVnaXN0
ZXJzVG9UbXAoY29uc3QgQ29sb3JpbmdBbGxvY2F0b3I8dHlwZT4mIGFsbG9jYXRvcikKKyAgICB7
CisgICAgICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBtX2NvZGUpIHsKKyAgICAgICAgICAg
IC8vIEdpdmUgVG1wIGEgdmFsaWQgcmVnaXN0ZXIuCisgICAgICAgICAgICBmb3IgKHVuc2lnbmVk
IGluc3RJbmRleCA9IDA7IGluc3RJbmRleCA8IGJsb2NrLT5zaXplKCk7ICsraW5zdEluZGV4KSB7
CisgICAgICAgICAgICAgICAgSW5zdCYgaW5zdCA9IGJsb2NrLT5hdChpbnN0SW5kZXgpOworCisg
ICAgICAgICAgICAgICAgLy8gVGhlIG1heUJlQ29hbGVzY2FibGUoKSBtZXRob2Qgd2lsbCBjaGFu
Z2UgaXRzIG1pbmQgZm9yIHNvbWUgb3BlcmF0aW9ucyBhZnRlciB3ZQorICAgICAgICAgICAgICAg
IC8vIGNvbXBsZXRlIHJlZ2lzdGVyIGFsbG9jYXRpb24uIFNvLCB3ZSByZWNvcmQgdGhpcyBiZWZv
cmUgc3RhcnRpbmcuCisgICAgICAgICAgICAgICAgYm9vbCBtYXlCZUNvYWxlc2NhYmxlID0gYWxs
b2NhdG9yLm1heUJlQ29hbGVzY2FibGUoaW5zdCk7CisKKyAgICAgICAgICAgICAgICAvLyBNb3Zl
MzIgaXMgY2hlYXBlciBpZiB3ZSBrbm93IHRoYXQgaXQncyBlcXVpdmFsZW50IHRvIGEgTW92ZS4g
SXQncworICAgICAgICAgICAgICAgIC8vIGVxdWl2YWxlbnQgaWYgdGhlIGRlc3RpbmF0aW9uJ3Mg
aGlnaCBiaXRzIGFyZSBub3Qgb2JzZXJ2YWJsZSBvciBpZiB0aGUgc291cmNlJ3MgaGlnaAorICAg
ICAgICAgICAgICAgIC8vIGJpdHMgYXJlIGFsbCB6ZXJvLiBOb3RlIHRoYXQgd2UgZG9uJ3QgaGF2
ZSB0aGUgb3Bwb3NpdGUgb3B0aW1pemF0aW9uIGZvciBvdGhlcgorICAgICAgICAgICAgICAgIC8v
IGFyY2hpdGVjdHVyZXMsIHdoaWNoIG1heSBwcmVmZXIgTW92ZSBvdmVyIE1vdmUzMiwgYmVjYXVz
ZSBNb3ZlIGlzIGNhbm9uaWNhbCBhbHJlYWR5LgorICAgICAgICAgICAgICAgIGlmICh0eXBlID09
IEFyZzo6R1AgJiYgaW5zdC5raW5kLm9wY29kZSA9PSBNb3ZlCisgICAgICAgICAgICAgICAgICAg
ICYmIGluc3QuYXJnc1swXS5pc1RtcCgpICYmIGluc3QuYXJnc1sxXS5pc1RtcCgpKSB7CisgICAg
ICAgICAgICAgICAgICAgIGlmIChtX3RtcFdpZHRoLnVzZVdpZHRoKGluc3QuYXJnc1sxXS50bXAo
KSkgPD0gQXJnOjpXaWR0aDMyCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBtX3RtcFdpZHRo
LmRlZldpZHRoKGluc3QuYXJnc1swXS50bXAoKSkgPD0gQXJnOjpXaWR0aDMyKQorICAgICAgICAg
ICAgICAgICAgICAgICAgaW5zdC5raW5kLm9wY29kZSA9IE1vdmUzMjsKKyAgICAgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgICAgICBpbnN0LmZvckVhY2hUbXBGYXN0KFsmXSAoVG1wJiB0bXAp
IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRtcC5pc1JlZygpIHx8IHRtcC5pc0dQKCkgPT0g
KHR5cGUgIT0gQXJnOjpHUCkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisKKyAg
ICAgICAgICAgICAgICAgICAgVG1wIGFsaWFzVG1wID0gYWxsb2NhdG9yLmdldEFsaWFzKHRtcCk7
CisgICAgICAgICAgICAgICAgICAgIFRtcCBhc3NpZ25lZFRtcDsKKyAgICAgICAgICAgICAgICAg
ICAgaWYgKGFsaWFzVG1wLmlzUmVnKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25l
ZFRtcCA9IFRtcChhbGlhc1RtcC5yZWcoKSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2Ugewor
ICAgICAgICAgICAgICAgICAgICAgICAgYXV0byByZWcgPSBhbGxvY2F0b3IuYWxsb2NhdGVkUmVn
KGFsaWFzVG1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFTU0VSVChyZWcpOworICAgICAg
ICAgICAgICAgICAgICAgICAgYXNzaWduZWRUbXAgPSBUbXAocmVnKTsKKyAgICAgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgICAgICAgICBBU1NFUlQoYXNzaWduZWRUbXAuaXNSZWcoKSk7
CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IGFzc2lnbmVkVG1wOworICAgICAgICAgICAgICAg
IH0pOworCisgICAgICAgICAgICAgICAgaWYgKG1heUJlQ29hbGVzY2FibGUgJiYgaW5zdC5hcmdz
WzBdLmlzVG1wKCkgJiYgaW5zdC5hcmdzWzFdLmlzVG1wKCkKKyAgICAgICAgICAgICAgICAgICAg
JiYgaW5zdC5hcmdzWzBdLnRtcCgpID09IGluc3QuYXJnc1sxXS50bXAoKSkKKyAgICAgICAgICAg
ICAgICAgICAgaW5zdCA9IEluc3QoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8g
UmVtb3ZlIGFsbCB0aGUgdXNlbGVzcyBtb3ZlcyB3ZSBjcmVhdGVkIGluIHRoaXMgYmxvY2suCisg
ICAgICAgICAgICBibG9jay0+aW5zdHMoKS5yZW1vdmVBbGxNYXRjaGluZyhbJl0gKGNvbnN0IElu
c3QmIGluc3QpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIWluc3Q7CisgICAgICAgICAgICB9
KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyB1bnNpZ25lZCBzdGFja1Nsb3RNaW5p
bXVtV2lkdGgoQXJnOjpXaWR0aCB3aWR0aCkKKyAgICB7CisgICAgICAgIHJldHVybiB3aWR0aCA8
PSBBcmc6OldpZHRoMzIgPyA0IDogODsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTxBcmc6OlR5cGUg
dHlwZT4KKyAgICB2b2lkIGFkZFNwaWxsQW5kRmlsbChjb25zdCBDb2xvcmluZ0FsbG9jYXRvcjx0
eXBlPiYgYWxsb2NhdG9yLCBIYXNoU2V0PHVuc2lnbmVkPiYgdW5zcGlsbGFibGVUbXBzKQorICAg
IHsKKyAgICAgICAgSGFzaE1hcDxUbXAsIFN0YWNrU2xvdCo+IHN0YWNrU2xvdHM7CisgICAgICAg
IGZvciAoVG1wIHRtcCA6IGFsbG9jYXRvci5zcGlsbGVkVG1wcygpKSB7CisgICAgICAgICAgICAv
LyBBbGwgdGhlIHNwaWxsZWQgdmFsdWVzIGJlY29tZSB1bnNwaWxsYWJsZS4KKyAgICAgICAgICAg
IHVuc3BpbGxhYmxlVG1wcy5hZGQoQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5k
ZXgodG1wKSk7CisKKyAgICAgICAgICAgIC8vIEFsbG9jYXRlIHN0YWNrIHNsb3QgZm9yIGVhY2gg
c3BpbGxlZCB2YWx1ZS4KKyAgICAgICAgICAgIFN0YWNrU2xvdCogc3RhY2tTbG90ID0gbV9jb2Rl
LmFkZFN0YWNrU2xvdCgKKyAgICAgICAgICAgICAgICBzdGFja1Nsb3RNaW5pbXVtV2lkdGgobV90
bXBXaWR0aC5yZXF1aXJlZFdpZHRoKHRtcCkpLCBTdGFja1Nsb3RLaW5kOjpTcGlsbCk7CisgICAg
ICAgICAgICBib29sIGlzTmV3VG1wID0gc3RhY2tTbG90cy5hZGQodG1wLCBzdGFja1Nsb3QpLmlz
TmV3RW50cnk7CisgICAgICAgICAgICBBU1NFUlRfVU5VU0VEKGlzTmV3VG1wLCBpc05ld1RtcCk7
CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXdyaXRlIHRoZSBwcm9ncmFtIHRvIGdldCByaWQg
b2YgdGhlIHNwaWxsZWQgVG1wLgorICAgICAgICBJbnNlcnRpb25TZXQgaW5zZXJ0aW9uU2V0KG1f
Y29kZSk7CisgICAgICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBtX2NvZGUpIHsKKyAgICAg
ICAgICAgIGJvb2wgaGFzQWxpYXNlZFRtcHMgPSBmYWxzZTsKKworICAgICAgICAgICAgZm9yICh1
bnNpZ25lZCBpbnN0SW5kZXggPSAwOyBpbnN0SW5kZXggPCBibG9jay0+c2l6ZSgpOyArK2luc3RJ
bmRleCkgeworICAgICAgICAgICAgICAgIEluc3QmIGluc3QgPSBibG9jay0+YXQoaW5zdEluZGV4
KTsKKworICAgICAgICAgICAgICAgIC8vIFRoZSBUbXBXaWR0aCBhbmFseXNpcyB3aWxsIHNheSB0
aGF0IGEgTW92ZSBvbmx5IHN0b3JlcyAzMiBiaXRzIGludG8gdGhlIGRlc3RpbmF0aW9uLAorICAg
ICAgICAgICAgICAgIC8vIGlmIHRoZSBzb3VyY2Ugb25seSBoYWQgMzIgYml0cyB3b3J0aCBvZiBu
b24temVybyBiaXRzLiBTYW1lIGZvciB0aGUgc291cmNlOiBpdCB3aWxsCisgICAgICAgICAgICAg
ICAgLy8gb25seSBjbGFpbSB0byByZWFkIDMyIGJpdHMgZnJvbSB0aGUgc291cmNlIGlmIG9ubHkg
MzIgYml0cyBvZiB0aGUgZGVzdGluYXRpb24gYXJlCisgICAgICAgICAgICAgICAgLy8gcmVhZC4g
Tm90ZSB0aGF0IHdlIG9ubHkgYXBwbHkgdGhpcyBsb2dpYyBpZiB0aGlzIHR1cm5zIGludG8gYSBs
b2FkIG9yIHN0b3JlLCBzaW5jZQorICAgICAgICAgICAgICAgIC8vIE1vdmUgaXMgdGhlIGNhbm9u
aWNhbCB3YXkgdG8gbW92ZSBkYXRhIGJldHdlZW4gR1BScy4KKyAgICAgICAgICAgICAgICBib29s
IGNhblVzZU1vdmUzMklmRGlkU3BpbGwgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBib29sIGRp
ZFNwaWxsID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gQXJnOjpHUCAmJiBp
bnN0LmtpbmQub3Bjb2RlID09IE1vdmUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChpbnN0
LmFyZ3NbMF0uaXNUbXAoKSAmJiBtX3RtcFdpZHRoLndpZHRoKGluc3QuYXJnc1swXS50bXAoKSkg
PD0gQXJnOjpXaWR0aDMyKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGluc3QuYXJnc1sx
XS5pc1RtcCgpICYmIG1fdG1wV2lkdGgud2lkdGgoaW5zdC5hcmdzWzFdLnRtcCgpKSA8PSBBcmc6
OldpZHRoMzIpKQorICAgICAgICAgICAgICAgICAgICAgICAgY2FuVXNlTW92ZTMySWZEaWRTcGls
bCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gVHJ5IHRv
IHJlcGxhY2UgdGhlIHJlZ2lzdGVyIHVzZSBieSBtZW1vcnkgdXNlIHdoZW4gcG9zc2libGUuCisg
ICAgICAgICAgICAgICAgaW5zdC5mb3JFYWNoQXJnKAorICAgICAgICAgICAgICAgICAgICBbJl0g
KEFyZyYgYXJnLCBBcmc6OlJvbGUgcm9sZSwgQXJnOjpUeXBlIGFyZ1R5cGUsIEFyZzo6V2lkdGgg
d2lkdGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXJnLmlzVG1wKCkpCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAg
aWYgKGFyZ1R5cGUgIT0gdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47
CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnLmlzUmVnKCkpCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAg
ICAgICAgICAgICAgICAgICBhdXRvIHN0YWNrU2xvdEVudHJ5ID0gc3RhY2tTbG90cy5maW5kKGFy
Zy50bXAoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tTbG90RW50cnkgPT0g
c3RhY2tTbG90cy5lbmQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Cisg
ICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWluc3QuYWRtaXRzU3RhY2soYXJnKSkKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICAK
KyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBUbXAgaG9sZHMgYSBjb25zdGFudCB0
aGVuIHdlIHdhbnQgdG8gcmVtYXRlcmlhbGl6ZSBpdHMKKyAgICAgICAgICAgICAgICAgICAgICAg
IC8vIHZhbHVlIHJhdGhlciB0aGFuIGxvYWRpbmcgaXQgZnJvbSB0aGUgc3RhY2suIEluIG9yZGVy
IGZvciB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvcHRpbWl6YXRpb24gdG8ga2lj
ayBpbiwgd2UgbmVlZCB0byBhdm9pZCBwbGFjaW5nIHRoZSBUbXAncyBzdGFjaworICAgICAgICAg
ICAgICAgICAgICAgICAgLy8gYWRkcmVzcyBpbnRvIHRoZSBpbnN0cnVjdGlvbi4KKyAgICAgICAg
ICAgICAgICAgICAgICAgIGlmICghQXJnOjppc0NvbGRVc2Uocm9sZSkpIHsKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBjb25zdCBVc2VDb3VudHM8VG1wPjo6Q291bnRzKiBjb3VudHMgPSBt
X3VzZUNvdW50c1thcmcudG1wKCldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChj
b3VudHMgJiYgY291bnRzLT5udW1Db25zdERlZnMgPT0gMSAmJiBjb3VudHMtPm51bURlZnMgPT0g
MSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAg
ICAgICAgICBBcmc6OldpZHRoIHNwaWxsV2lkdGggPSBtX3RtcFdpZHRoLnJlcXVpcmVkV2lkdGgo
YXJnLnRtcCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcmc6OmlzQW55RGVmKHJv
bGUpICYmIHdpZHRoIDwgc3BpbGxXaWR0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBy
ZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICBBU1NFUlQoaW5zdC5raW5kLm9wY29kZSA9
PSBNb3ZlIHx8ICEoQXJnOjppc0FueVVzZShyb2xlKSAmJiB3aWR0aCA+IHNwaWxsV2lkdGgpKTsK
KyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNw
aWxsV2lkdGggIT0gQXJnOjpXaWR0aDMyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNh
blVzZU1vdmUzMklmRGlkU3BpbGwgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAor
ICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tTbG90RW50cnktPnZhbHVlLT5lbnN1cmVTaXpl
KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhblVzZU1vdmUzMklmRGlkU3BpbGwgPyA0
IDogQXJnOjpieXRlcyh3aWR0aCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gQXJn
OjpzdGFjayhzdGFja1Nsb3RFbnRyeS0+dmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAg
ZGlkU3BpbGwgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAg
ICAgIGlmIChkaWRTcGlsbCAmJiBjYW5Vc2VNb3ZlMzJJZkRpZFNwaWxsKQorICAgICAgICAgICAg
ICAgICAgICBpbnN0LmtpbmQub3Bjb2RlID0gTW92ZTMyOworCisgICAgICAgICAgICAgICAgLy8g
Rm9yIGV2ZXJ5IG90aGVyIGNhc2UsIGFkZCBMb2FkL1N0b3JlIGFzIG5lZWRlZC4KKyAgICAgICAg
ICAgICAgICBpbnN0LmZvckVhY2hUbXAoWyZdIChUbXAmIHRtcCwgQXJnOjpSb2xlIHJvbGUsIEFy
Zzo6VHlwZSBhcmdUeXBlLCBBcmc6OldpZHRoKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0
bXAuaXNSZWcoKSB8fCBhcmdUeXBlICE9IHR5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICBy
ZXR1cm47CisKKyAgICAgICAgICAgICAgICAgICAgYXV0byBzdGFja1Nsb3RFbnRyeSA9IHN0YWNr
U2xvdHMuZmluZCh0bXApOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tTbG90RW50cnkg
PT0gc3RhY2tTbG90cy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgVG1wIGFsaWFz
ID0gYWxsb2NhdG9yLmdldEFsaWFzV2hlblNwaWxsaW5nKHRtcCk7CisgICAgICAgICAgICAgICAg
ICAgICAgICBpZiAoYWxpYXMgIT0gdG1wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
dG1wID0gYWxpYXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQWxpYXNlZFRtcHMg
PSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAg
QXJnOjpXaWR0aCBzcGlsbFdpZHRoID0gbV90bXBXaWR0aC5yZXF1aXJlZFdpZHRoKHRtcCk7Cisg
ICAgICAgICAgICAgICAgICAgIE9wY29kZSBtb3ZlID0gT29wczsKKyAgICAgICAgICAgICAgICAg
ICAgc3dpdGNoIChzdGFja1Nsb3RNaW5pbXVtV2lkdGgoc3BpbGxXaWR0aCkpIHsKKyAgICAgICAg
ICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgbW92ZSA9IHR5cGUg
PT0gQXJnOjpHUCA/IE1vdmUzMiA6IE1vdmVGbG9hdDsKKyAgICAgICAgICAgICAgICAgICAgICAg
IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAg
ICAgICBtb3ZlID0gdHlwZSA9PSBBcmc6OkdQID8gTW92ZSA6IE1vdmVEb3VibGU7CisgICAgICAg
ICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAg
ICAgICAgICAgICAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAg
ICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICAgICAgICAgIHRtcCA9IG1fY29kZS5uZXdUbXAodHlwZSk7CisgICAgICAgICAgICAg
ICAgICAgIHVuc3BpbGxhYmxlVG1wcy5hZGQoQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29s
dXRlSW5kZXgodG1wKSk7CisKKyAgICAgICAgICAgICAgICAgICAgQXJnIGFyZyA9IEFyZzo6c3Rh
Y2soc3RhY2tTbG90RW50cnktPnZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEFyZzo6
aXNBbnlVc2Uocm9sZSkgJiYgcm9sZSAhPSBBcmc6OlNjcmF0Y2gpCisgICAgICAgICAgICAgICAg
ICAgICAgICBpbnNlcnRpb25TZXQuaW5zZXJ0KGluc3RJbmRleCwgbW92ZSwgaW5zdC5vcmlnaW4s
IGFyZywgdG1wKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEFyZzo6aXNBbnlEZWYocm9sZSkp
CisgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRpb25TZXQuaW5zZXJ0KGluc3RJbmRleCAr
IDEsIG1vdmUsIGluc3Qub3JpZ2luLCB0bXAsIGFyZyk7CisgICAgICAgICAgICAgICAgfSk7Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgICBpbnNlcnRpb25TZXQuZXhlY3V0ZShibG9jayk7CisK
KyAgICAgICAgICAgIGlmIChoYXNBbGlhc2VkVG1wcykgeworICAgICAgICAgICAgICAgIGJsb2Nr
LT5pbnN0cygpLnJlbW92ZUFsbE1hdGNoaW5nKFsmXSAoY29uc3QgSW5zdCYgaW5zdCkgeworICAg
ICAgICAgICAgICAgICAgICByZXR1cm4gYWxsb2NhdG9yLmlzVXNlbGVzc01vdmUoaW5zdCk7Cisg
ICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAg
ICB2b2lkIGZpeFNwaWxsc0FmdGVyVGVybWluYWxzKCkKKyAgICB7CisgICAgICAgIC8vIEJlY2F1
c2UgdGhlcmUgbWF5IGJlIHRlcm1pbmFscyB0aGF0IHByb2R1Y2UgdmFsdWVzLCBJUkMgbWF5Cisg
ICAgICAgIC8vIHdhbnQgdG8gc3BpbGwgdGhvc2UgdGVybWluYWxzLiBJdCdsbCBoYXBwZW4gdG8g
c3BpbGwgaXQgYWZ0ZXIKKyAgICAgICAgLy8gdGhlIHRlcm1pbmFsLiBJZiB3ZSBsZWZ0IHRoZSBn
cmFwaCBpbiB0aGlzIHN0YXRlLCBpdCdkIGJlIGludmFsaWQKKyAgICAgICAgLy8gYmVjYXVzZSBh
IHRlcm1pbmFsIG11c3QgYmUgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24gaW4gYSBibG9jay4KKyAgICAg
ICAgLy8gV2UgZml4IHRoYXQgaGVyZS4KKworICAgICAgICBJbnNlcnRpb25TZXQgaW5zZXJ0aW9u
U2V0KG1fY29kZSk7CisKKyAgICAgICAgYm9vbCBhZGRlZEJsb2NrcyA9IGZhbHNlOworCisgICAg
ICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBtX2NvZGUpIHsKKyAgICAgICAgICAgIHVuc2ln
bmVkIHRlcm1pbmFsSW5kZXggPSBibG9jay0+c2l6ZSgpOworICAgICAgICAgICAgYm9vbCBmb3Vu
ZFRlcm1pbmFsID0gZmFsc2U7CisgICAgICAgICAgICB3aGlsZSAodGVybWluYWxJbmRleC0tKSB7
CisgICAgICAgICAgICAgICAgaWYgKGJsb2NrLT5hdCh0ZXJtaW5hbEluZGV4KS5pc1Rlcm1pbmFs
KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZm91bmRUZXJtaW5hbCA9IHRydWU7CisgICAgICAg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIEFTU0VSVF9VTlVTRUQoZm91bmRUZXJtaW5hbCwgZm91bmRUZXJtaW5hbCk7CisK
KyAgICAgICAgICAgIGlmICh0ZXJtaW5hbEluZGV4ID09IGJsb2NrLT5zaXplKCkgLSAxKQorICAg
ICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAvLyBUaGVyZSBtdXN0IGJlIGlu
c3RydWN0aW9ucyBhZnRlciB0aGUgdGVybWluYWwgYmVjYXVzZSBpdCdzIG5vdCB0aGUgbGFzdCBp
bnN0cnVjdGlvbi4KKyAgICAgICAgICAgIEFTU0VSVCh0ZXJtaW5hbEluZGV4IDwgYmxvY2stPnNp
emUoKSAtIDEpOworICAgICAgICAgICAgVmVjdG9yPEluc3QsIDE+IGluc3RzVG9Nb3ZlOworICAg
ICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gdGVybWluYWxJbmRleCArIDE7IGkgPCBibG9jay0+
c2l6ZSgpOyBpKyspCisgICAgICAgICAgICAgICAgaW5zdHNUb01vdmUuYXBwZW5kKGJsb2NrLT5h
dChpKSk7CisgICAgICAgICAgICBSRUxFQVNFX0FTU0VSVChpbnN0c1RvTW92ZS5zaXplKCkpOwor
CisgICAgICAgICAgICBmb3IgKEZyZXF1ZW50ZWRCbG9jayYgZnJlcXVlbnRlZFN1Y2Nlc3NvciA6
IGJsb2NrLT5zdWNjZXNzb3JzKCkpIHsKKyAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrKiBzdWNj
ZXNzb3IgPSBmcmVxdWVudGVkU3VjY2Vzc29yLmJsb2NrKCk7CisgICAgICAgICAgICAgICAgLy8g
SWYgc3VjY2Vzc29yJ3Mgb25seSBwcmVkZWNlc3NvciBpcyBibG9jaywgd2UgY2FuIHBsYW50IHRo
ZSBzcGlsbCBpbnNpZGUKKyAgICAgICAgICAgICAgICAvLyB0aGUgc3VjY2Vzc29yLiBPdGhlcndp
c2UsIHdlIG11c3Qgc3BsaXQgdGhlIGNyaXRpY2FsIGVkZ2UgYW5kIGNyZWF0ZQorICAgICAgICAg
ICAgICAgIC8vIGEgbmV3IGJsb2NrIGZvciB0aGUgc3BpbGwuCisgICAgICAgICAgICAgICAgaWYg
KHN1Y2Nlc3Nvci0+bnVtUHJlZGVjZXNzb3JzKCkgPT0gMSkgeworICAgICAgICAgICAgICAgICAg
ICBpbnNlcnRpb25TZXQuaW5zZXJ0SW5zdHMoMCwgaW5zdHNUb01vdmUpOworICAgICAgICAgICAg
ICAgICAgICBpbnNlcnRpb25TZXQuZXhlY3V0ZShzdWNjZXNzb3IpOworICAgICAgICAgICAgICAg
IH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGFkZGVkQmxvY2tzID0gdHJ1ZTsKKyAgICAg
ICAgICAgICAgICAgICAgLy8gRklYTUU6IFdlIHByb2JhYmx5IHdhbnQgYmV0dGVyIGJsb2NrIG9y
ZGVyaW5nIGhlcmUuCisgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sqIG5ld0Jsb2NrID0g
bV9jb2RlLmFkZEJsb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgSW5zdCYg
aW5zdCA6IGluc3RzVG9Nb3ZlKQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3QmxvY2stPmFw
cGVuZEluc3QoaW5zdCk7CisgICAgICAgICAgICAgICAgICAgIG5ld0Jsb2NrLT5hcHBlbmRJbnN0
KEluc3QoSnVtcCwgaW5zdHNUb01vdmUubGFzdCgpLm9yaWdpbikpOworICAgICAgICAgICAgICAg
ICAgICBuZXdCbG9jay0+c3VjY2Vzc29ycygpLmFwcGVuZChzdWNjZXNzb3IpOworICAgICAgICAg
ICAgICAgICAgICBmcmVxdWVudGVkU3VjY2Vzc29yLmJsb2NrKCkgPSBuZXdCbG9jazsKKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJsb2NrLT5yZXNpemUo
dGVybWluYWxJbmRleCArIDEpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGFkZGVkQmxvY2tz
KQorICAgICAgICAgICAgbV9jb2RlLnJlc2V0UmVhY2hhYmlsaXR5KCk7CisgICAgfQorCisgICAg
Q29kZSYgbV9jb2RlOworICAgIFRtcFdpZHRoIG1fdG1wV2lkdGg7CisgICAgVXNlQ291bnRzPFRt
cD4gbV91c2VDb3VudHM7CisgICAgdW5zaWduZWQgbV9udW1JdGVyYXRpb25zIHsgMCB9OworfTsK
KworfSAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK3ZvaWQgaXRlcmF0ZWRSZWdpc3RlckNvYWxl
c2NpbmcoQ29kZSYgY29kZSkKK3sKKyAgICBQaGFzZVNjb3BlIHBoYXNlU2NvcGUoY29kZSwgIml0
ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nIik7CisgICAgCisgICAgSXRlcmF0ZWRSZWdpc3RlckNv
YWxlc2NpbmcgaXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcoY29kZSk7CisgICAgaXRlcmF0ZWRS
ZWdpc3RlckNvYWxlc2NpbmcucnVuKCk7Cit9CisKK30gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIz
OjpBaXIKKworI2VuZGlmIC8vIEVOQUJMRShCM19KSVQpCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvYWlyL0FpckdyYXBoQ29sb3JpbmcuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyR3JhcGhDb2xvcmluZy5jcHAJKHJldmlzaW9uIDIxMjc5
NykKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyR3JhcGhDb2xvcmluZy5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTI0LDcgKzI0LDcgQEAKICAqLwogCiAjaW5jbHVkZSAiY29uZmln
LmgiCi0jaW5jbHVkZSAiQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuaCIKKyNpbmNsdWRl
ICJBaXJHcmFwaENvbG9yaW5nLmgiCiAKICNpZiBFTkFCTEUoQjNfSklUKQogCkBAIC00OSwxMyAr
NDksMTUgQEAgYm9vbCByZXBvcnRTdGF0cyA9IGZhbHNlOwogCiAvLyBUaGUgQWJzdHJhY3RDb2xv
cmluZ0FsbG9jYXRvciBkZWZpbmVzIGFsbCB0aGUgY29kZSB0aGF0IGlzIGluZGVwZW5kYW50CiAv
LyBmcm9tIHRoZSB0eXBlIG9yIHJlZ2lzdGVyIGFuZCBjYW4gYmUgc2hhcmVkIHdoZW4gYWxsb2Nh
dGluZyByZWdpc3RlcnMuCi10ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleFR5cGU+Cit0ZW1wbGF0ZTx0
eXBlbmFtZSBJbmRleFR5cGUsIHR5cGVuYW1lIFRtcE1hcHBlcj4KIGNsYXNzIEFic3RyYWN0Q29s
b3JpbmdBbGxvY2F0b3IgewogcHVibGljOgotICAgIEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0b3Io
Y29uc3QgVmVjdG9yPFJlZz4mIHJlZ3NJblByaW9yaXR5T3JkZXIsIEluZGV4VHlwZSBsYXN0UHJl
Y29sb3JlZFJlZ2lzdGVySW5kZXgsIHVuc2lnbmVkIHRtcEFycmF5U2l6ZSwgY29uc3QgSGFzaFNl
dDx1bnNpZ25lZD4mIHVuc3BpbGxhYmxlVG1wKQorICAgIEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0
b3IoQ29kZSYgY29kZSwgY29uc3QgVmVjdG9yPFJlZz4mIHJlZ3NJblByaW9yaXR5T3JkZXIsIElu
ZGV4VHlwZSBsYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXgsIHVuc2lnbmVkIHRtcEFycmF5U2l6
ZSwgY29uc3QgSGFzaFNldDx1bnNpZ25lZD4mIHVuc3BpbGxhYmxlVG1wcywgY29uc3QgVXNlQ291
bnRzPFRtcD4mIHVzZUNvdW50cykKICAgICAgICAgOiBtX3JlZ3NJblByaW9yaXR5T3JkZXIocmVn
c0luUHJpb3JpdHlPcmRlcikKICAgICAgICAgLCBtX2xhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRl
eChsYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXgpCi0gICAgICAgICwgbV91bnNwaWxsYWJsZVRt
cHModW5zcGlsbGFibGVUbXApCisgICAgICAgICwgbV91bnNwaWxsYWJsZVRtcHModW5zcGlsbGFi
bGVUbXBzKQorICAgICAgICAsIG1fdXNlQ291bnRzKHVzZUNvdW50cykKKyAgICAgICAgLCBtX2Nv
ZGUoY29kZSkKICAgICB7CiAgICAgICAgIGZvciAoUmVnIHJlZyA6IG1fcmVnc0luUHJpb3JpdHlP
cmRlcikKICAgICAgICAgICAgIG1fbXV0YWJsZVJlZ3Muc2V0KHJlZyk7CkBAIC02Niw5ICs2OCwx
MyBAQCBwdWJsaWM6CiAgICAgICAgIG1fbW92ZUxpc3QucmVzaXplKHRtcEFycmF5U2l6ZSk7CiAg
ICAgICAgIG1fY29hbGVzY2VkVG1wcy5maWxsKDAsIHRtcEFycmF5U2l6ZSk7CiAgICAgICAgIG1f
aXNPblNlbGVjdFN0YWNrLmVuc3VyZVNpemUodG1wQXJyYXlTaXplKTsKKyAgICAgICAgbV9zcGls
bFdvcmtsaXN0LmVuc3VyZVNpemUodG1wQXJyYXlTaXplKTsKICAgICB9CiAKIHByb3RlY3RlZDoK
KworICAgIHVuc2lnbmVkIHJlZ2lzdGVyQ291bnQoKSBjb25zdCB7IHJldHVybiBtX3JlZ3NJblBy
aW9yaXR5T3JkZXIuc2l6ZSgpOyB9CisKICAgICBJbmRleFR5cGUgZ2V0QWxpYXMoSW5kZXhUeXBl
IHRtcEluZGV4KSBjb25zdAogICAgIHsKICAgICAgICAgSW5kZXhUeXBlIGFsaWFzID0gdG1wSW5k
ZXg7CkBAIC04NCwyMCArOTAsNiBAQCBwcm90ZWN0ZWQ6CiAgICAgICAgIGFkZEVkZ2VEaXN0aW5j
dChhLCBiKTsKICAgICB9CiAKLSAgICB2b2lkIG1ha2VXb3JrTGlzdCgpCi0gICAgewotICAgICAg
ICBJbmRleFR5cGUgZmlyc3ROb25SZWdJbmRleCA9IG1fbGFzdFByZWNvbG9yZWRSZWdpc3Rlcklu
ZGV4ICsgMTsKLSAgICAgICAgZm9yIChJbmRleFR5cGUgaSA9IGZpcnN0Tm9uUmVnSW5kZXg7IGkg
PCBtX2RlZ3JlZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIGRlZ3JlZSA9
IG1fZGVncmVlc1tpXTsKLSAgICAgICAgICAgIGlmIChkZWdyZWUgPj0gbV9yZWdzSW5Qcmlvcml0
eU9yZGVyLnNpemUoKSkKLSAgICAgICAgICAgICAgICBhZGRUb1NwaWxsKGkpOwotICAgICAgICAg
ICAgZWxzZSBpZiAoIW1fbW92ZUxpc3RbaV0uaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIG1f
ZnJlZXplV29ya2xpc3QuYWRkKGkpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAg
IG1fc2ltcGxpZnlXb3JrbGlzdC5hcHBlbmQoaSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICB2
b2lkIGFkZFRvU3BpbGwodW5zaWduZWQgdG9TcGlsbCkKICAgICB7CiAgICAgICAgIGlmIChtX3Vu
c3BpbGxhYmxlVG1wcy5jb250YWlucyh0b1NwaWxsKSkKQEAgLTEwNiwxNDcgKzk4LDExIEBAIHBy
b3RlY3RlZDoKICAgICAgICAgbV9zcGlsbFdvcmtsaXN0LmFkZCh0b1NwaWxsKTsKICAgICB9CiAK
LSAgICAvLyBMb3ctZGVncmVlIHZlcnRleCBjYW4gYWx3YXlzIGJlIGNvbG9yZWQ6IGp1c3QgcGlj
ayBhbnkgb2YgdGhlIGNvbG9yIHRha2VuIGJ5IGFueQotICAgIC8vIG90aGVyIGFkamFjZW50IHZl
cmljZXMuCi0gICAgLy8gVGhlICJTaW1wbGlmeSIgcGhhc2UgdGFrZXMgYSBsb3ctZGVncmVlIG91
dCBvZiB0aGUgaW50ZXJmZXJlbmNlIGdyYXBoIHRvIHNpbXBsaWZ5IGl0LgotICAgIHZvaWQgc2lt
cGxpZnkoKQotICAgIHsKLSAgICAgICAgSW5kZXhUeXBlIGxhc3RJbmRleCA9IG1fc2ltcGxpZnlX
b3JrbGlzdC50YWtlTGFzdCgpOwotCi0gICAgICAgIEFTU0VSVCghbV9zZWxlY3RTdGFjay5jb250
YWlucyhsYXN0SW5kZXgpKTsKLSAgICAgICAgQVNTRVJUKCFtX2lzT25TZWxlY3RTdGFjay5nZXQo
bGFzdEluZGV4KSk7Ci0gICAgICAgIG1fc2VsZWN0U3RhY2suYXBwZW5kKGxhc3RJbmRleCk7Ci0g
ICAgICAgIG1faXNPblNlbGVjdFN0YWNrLnF1aWNrU2V0KGxhc3RJbmRleCk7Ci0KLSAgICAgICAg
Zm9yRWFjaEFkamFjZW50KGxhc3RJbmRleCwgW3RoaXNdKEluZGV4VHlwZSBhZGphY2VudFRtcElu
ZGV4KSB7Ci0gICAgICAgICAgICBkZWNyZW1lbnREZWdyZWUoYWRqYWNlbnRUbXBJbmRleCk7Ci0g
ICAgICAgIH0pOwotICAgIH0KLQotICAgIHZvaWQgZnJlZXplKCkKLSAgICB7Ci0gICAgICAgIElu
ZGV4VHlwZSB2aWN0aW1JbmRleCA9IG1fZnJlZXplV29ya2xpc3QudGFrZUFueSgpOwotICAgICAg
ICBBU1NFUlRfV0lUSF9NRVNTQUdFKGdldEFsaWFzKHZpY3RpbUluZGV4KSA9PSB2aWN0aW1JbmRl
eCwgImNvYWxlc2NlKCkgc2hvdWxkIG5vdCBsZWF2ZSBhbGlhc2VkIFRtcCBpbiB0aGUgd29ya2xp
c3QuIik7Ci0gICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5hcHBlbmQodmljdGltSW5kZXgpOwot
ICAgICAgICBmcmVlemVNb3Zlcyh2aWN0aW1JbmRleCk7Ci0gICAgfQotCi0gICAgdm9pZCBmcmVl
emVNb3ZlcyhJbmRleFR5cGUgdG1wSW5kZXgpCi0gICAgewotICAgICAgICBmb3JFYWNoTm9kZU1v
dmVzKHRtcEluZGV4LCBbdGhpcywgdG1wSW5kZXhdIChJbmRleFR5cGUgbW92ZUluZGV4KSB7Ci0g
ICAgICAgICAgICBpZiAoIW1fYWN0aXZlTW92ZXMucXVpY2tDbGVhcihtb3ZlSW5kZXgpKQotICAg
ICAgICAgICAgICAgIG1fd29ya2xpc3RNb3Zlcy50YWtlTW92ZShtb3ZlSW5kZXgpOwotCi0gICAg
ICAgICAgICBjb25zdCBNb3ZlT3BlcmFuZHMmIG1vdmVPcGVyYW5kcyA9IG1fY29hbGVzY2luZ0Nh
bmRpZGF0ZXNbbW92ZUluZGV4XTsKLSAgICAgICAgICAgIEluZGV4VHlwZSBzcmNUbXBJbmRleCA9
IG1vdmVPcGVyYW5kcy5zcmNJbmRleDsKLSAgICAgICAgICAgIEluZGV4VHlwZSBkc3RUbXBJbmRl
eCA9IG1vdmVPcGVyYW5kcy5kc3RJbmRleDsKLQotICAgICAgICAgICAgSW5kZXhUeXBlIG9yaWdp
bmFsT3RoZXJUbXAgPSBzcmNUbXBJbmRleCAhPSB0bXBJbmRleCA/IHNyY1RtcEluZGV4IDogZHN0
VG1wSW5kZXg7Ci0gICAgICAgICAgICBJbmRleFR5cGUgb3RoZXJUbXBJbmRleCA9IGdldEFsaWFz
KG9yaWdpbmFsT3RoZXJUbXApOwotICAgICAgICAgICAgaWYgKG1fZGVncmVlc1tvdGhlclRtcElu
ZGV4XSA8IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkgJiYgIWlzTW92ZVJlbGF0ZWQob3Ro
ZXJUbXBJbmRleCkpIHsKLSAgICAgICAgICAgICAgICBpZiAobV9mcmVlemVXb3JrbGlzdC5yZW1v
dmUob3RoZXJUbXBJbmRleCkpCi0gICAgICAgICAgICAgICAgICAgIG1fc2ltcGxpZnlXb3JrbGlz
dC5hcHBlbmQob3RoZXJUbXBJbmRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAg
IH0KLQotICAgIHZvaWQgY29hbGVzY2UoKQotICAgIHsKLSAgICAgICAgdW5zaWduZWQgbW92ZUlu
ZGV4ID0gbV93b3JrbGlzdE1vdmVzLnRha2VMYXN0TW92ZSgpOwotICAgICAgICBjb25zdCBNb3Zl
T3BlcmFuZHMmIG1vdmVPcGVyYW5kcyA9IG1fY29hbGVzY2luZ0NhbmRpZGF0ZXNbbW92ZUluZGV4
XTsKLSAgICAgICAgSW5kZXhUeXBlIHUgPSBnZXRBbGlhcyhtb3ZlT3BlcmFuZHMuc3JjSW5kZXgp
OwotICAgICAgICBJbmRleFR5cGUgdiA9IGdldEFsaWFzKG1vdmVPcGVyYW5kcy5kc3RJbmRleCk7
Ci0KLSAgICAgICAgaWYgKGlzUHJlY29sb3JlZCh2KSkKLSAgICAgICAgICAgIHN0ZDo6c3dhcCh1
LCB2KTsKLQotICAgICAgICBpZiAodHJhY2VEZWJ1ZykKLSAgICAgICAgICAgIGRhdGFMb2coIkNv
YWxlc2NpbmcgbW92ZSBhdCBpbmRleCAiLCBtb3ZlSW5kZXgsICIgdSA9ICIsIHUsICIgdiA9ICIs
IHYsICJcbiIpOwotCi0gICAgICAgIGlmICh1ID09IHYpIHsKLSAgICAgICAgICAgIGFkZFdvcmtM
aXN0KHUpOwotCi0gICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKLSAgICAgICAgICAgICAgICBk
YXRhTG9nKCIgICAgQ29hbGVzY2VkXG4iKTsKLSAgICAgICAgfSBlbHNlIGlmIChpc1ByZWNvbG9y
ZWQodikKLSAgICAgICAgICAgIHx8IG1faW50ZXJmZXJlbmNlRWRnZXMuY29udGFpbnMoSW50ZXJm
ZXJlbmNlRWRnZSh1LCB2KSkKLSAgICAgICAgICAgIHx8ICh1ID09IG1fZnJhbWVQb2ludGVySW5k
ZXggJiYgbV9pbnRlcmZlcmVzV2l0aEZyYW1lUG9pbnRlci5xdWlja0dldCh2KSkpIHsKLSAgICAg
ICAgICAgIGFkZFdvcmtMaXN0KHUpOwotICAgICAgICAgICAgYWRkV29ya0xpc3Qodik7Ci0KLSAg
ICAgICAgICAgIGlmICh0cmFjZURlYnVnKQotICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICBD
b25zdHJhaW5lZFxuIik7Ci0gICAgICAgIH0gZWxzZSBpZiAoY2FuQmVTYWZlbHlDb2FsZXNjZWQo
dSwgdikpIHsKLSAgICAgICAgICAgIGNvbWJpbmUodSwgdik7Ci0gICAgICAgICAgICBhZGRXb3Jr
TGlzdCh1KTsKLSAgICAgICAgICAgIG1faGFzQ29hbGVzY2VkTm9uVHJpdmlhbE1vdmUgPSB0cnVl
OwotCi0gICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKLSAgICAgICAgICAgICAgICBkYXRhTG9n
KCIgICAgU2FmZSBDb2FsZXNjaW5nXG4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAg
IG1fYWN0aXZlTW92ZXMucXVpY2tTZXQobW92ZUluZGV4KTsKLQotICAgICAgICAgICAgaWYgKHRy
YWNlRGVidWcpCi0gICAgICAgICAgICAgICAgZGF0YUxvZygiICAgIEZhaWxlZCBjb2FsZXNjaW5n
LCBhZGRlZCB0byBhY3RpdmUgbW92ZXMuXG4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZv
aWQgYXNzaWduQ29sb3JzKCkKKyAgICBib29sIGlzUHJlY29sb3JlZChJbmRleFR5cGUgdG1wSW5k
ZXgpCiAgICAgewotICAgICAgICBBU1NFUlQobV9zaW1wbGlmeVdvcmtsaXN0LmlzRW1wdHkoKSk7
Ci0gICAgICAgIEFTU0VSVChtX3dvcmtsaXN0TW92ZXMuaXNFbXB0eSgpKTsKLSAgICAgICAgQVNT
RVJUKG1fZnJlZXplV29ya2xpc3QuaXNFbXB0eSgpKTsKLSAgICAgICAgQVNTRVJUKG1fc3BpbGxX
b3JrbGlzdC5pc0VtcHR5KCkpOwotCi0gICAgICAgIC8vIFJlY2xhaW0gYXMgbXVjaCBtZW1vcnkg
YXMgcG9zc2libGUuCi0gICAgICAgIG1faW50ZXJmZXJlbmNlRWRnZXMuY2xlYXIoKTsKLSAgICAg
ICAgbV9kZWdyZWVzLmNsZWFyKCk7Ci0gICAgICAgIG1fbW92ZUxpc3QuY2xlYXIoKTsKLSAgICAg
ICAgbV93b3JrbGlzdE1vdmVzLmNsZWFyKCk7Ci0gICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5j
bGVhcigpOwotICAgICAgICBtX3NwaWxsV29ya2xpc3QuY2xlYXIoKTsKLSAgICAgICAgbV9mcmVl
emVXb3JrbGlzdC5jbGVhcigpOwotCi0gICAgICAgIC8vIFRyeSB0byBjb2xvciB0aGUgVG1wIG9u
IHRoZSBzdGFjay4KLSAgICAgICAgbV9jb2xvcmVkVG1wLnJlc2l6ZShtX2FkamFjZW5jeUxpc3Qu
c2l6ZSgpKTsKLQotICAgICAgICB3aGlsZSAoIW1fc2VsZWN0U3RhY2suaXNFbXB0eSgpKSB7Ci0g
ICAgICAgICAgICB1bnNpZ25lZCB0bXBJbmRleCA9IG1fc2VsZWN0U3RhY2sudGFrZUxhc3QoKTsK
LSAgICAgICAgICAgIEFTU0VSVCghaXNQcmVjb2xvcmVkKHRtcEluZGV4KSk7Ci0gICAgICAgICAg
ICBBU1NFUlQoIW1fY29sb3JlZFRtcFt0bXBJbmRleF0pOwotCi0gICAgICAgICAgICBSZWdpc3Rl
clNldCBjb2xvcmVkUmVnaXN0ZXJzOwotICAgICAgICAgICAgZm9yIChJbmRleFR5cGUgYWRqYWNl
bnRUbXBJbmRleCA6IG1fYWRqYWNlbmN5TGlzdFt0bXBJbmRleF0pIHsKLSAgICAgICAgICAgICAg
ICBJbmRleFR5cGUgYWxpYXNUbXBJbmRleCA9IGdldEFsaWFzKGFkamFjZW50VG1wSW5kZXgpOwot
ICAgICAgICAgICAgICAgIFJlZyByZWcgPSBtX2NvbG9yZWRUbXBbYWxpYXNUbXBJbmRleF07Ci0K
LSAgICAgICAgICAgICAgICBBU1NFUlQoIWlzUHJlY29sb3JlZChhbGlhc1RtcEluZGV4KSB8fCAo
aXNQcmVjb2xvcmVkKGFsaWFzVG1wSW5kZXgpICYmIHJlZykpOwotCi0gICAgICAgICAgICAgICAg
aWYgKHJlZykKLSAgICAgICAgICAgICAgICAgICAgY29sb3JlZFJlZ2lzdGVycy5zZXQocmVnKTsK
LSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYm9vbCBjb2xvckFzc2lnbmVkID0gZmFsc2U7
Ci0gICAgICAgICAgICBmb3IgKFJlZyByZWcgOiBtX3JlZ3NJblByaW9yaXR5T3JkZXIpIHsKLSAg
ICAgICAgICAgICAgICBpZiAoIWNvbG9yZWRSZWdpc3RlcnMuZ2V0KHJlZykpIHsKLSAgICAgICAg
ICAgICAgICAgICAgbV9jb2xvcmVkVG1wW3RtcEluZGV4XSA9IHJlZzsKLSAgICAgICAgICAgICAg
ICAgICAgY29sb3JBc3NpZ25lZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFjb2xv
ckFzc2lnbmVkKQotICAgICAgICAgICAgICAgIG1fc3BpbGxlZFRtcHMuYXBwZW5kKHRtcEluZGV4
KTsKLSAgICAgICAgfQotICAgICAgICBtX3NlbGVjdFN0YWNrLmNsZWFyKCk7Ci0KLSAgICAgICAg
aWYgKG1fc3BpbGxlZFRtcHMuaXNFbXB0eSgpKQotICAgICAgICAgICAgbV9jb2FsZXNjZWRUbXBz
QXRTcGlsbC5jbGVhcigpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtX2NvbG9yZWRUbXAu
Y2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIHRtcEluZGV4IDw9IG1fbGFzdFByZWNvbG9yZWRSZWdp
c3RlckluZGV4OwogICAgIH0KIAotcHJpdmF0ZToKICAgICB2b2lkIGluaXRpYWxpemVEZWdyZWVz
KHVuc2lnbmVkIHRtcEFycmF5U2l6ZSkKICAgICB7CiAgICAgICAgIG1fZGVncmVlcy5yZXNpemUo
dG1wQXJyYXlTaXplKTsKQEAgLTI2Miw3ICsxMTgsOCBAQCBwcml2YXRlOgogICAgIHZvaWQgYWRk
RWRnZURpc3RpbmN0KEluZGV4VHlwZSBhLCBJbmRleFR5cGUgYikKICAgICB7CiAgICAgICAgIEFT
U0VSVChhICE9IGIpOwotICAgICAgICBpZiAobV9pbnRlcmZlcmVuY2VFZGdlcy5hZGQoSW50ZXJm
ZXJlbmNlRWRnZShhLCBiKSkuaXNOZXdFbnRyeSkgeworICAgICAgICBib29sIGlzTmV3RWRnZSA9
IGFkZEludGVyZmVyZW5jZUVkZ2UoSW50ZXJmZXJlbmNlRWRnZShhLCBiKSk7CisgICAgICAgIGlm
IChpc05ld0VkZ2UpIHsKICAgICAgICAgICAgIGlmICghaXNQcmVjb2xvcmVkKGEpKSB7CiAgICAg
ICAgICAgICAgICAgQVNTRVJUKCFtX2FkamFjZW5jeUxpc3RbYV0uY29udGFpbnMoYikpOwogICAg
ICAgICAgICAgICAgIG1fYWRqYWNlbmN5TGlzdFthXS5hcHBlbmQoYik7CkBAIC0yNzcsMjYgKzEz
NCwxMSBAQCBwcml2YXRlOgogICAgICAgICB9CiAgICAgfQogCi0gICAgdm9pZCBkZWNyZW1lbnRE
ZWdyZWUoSW5kZXhUeXBlIHRtcEluZGV4KQotICAgIHsKLSAgICAgICAgQVNTRVJUKG1fZGVncmVl
c1t0bXBJbmRleF0pOwotCi0gICAgICAgIHVuc2lnbmVkIG9sZERlZ3JlZSA9IG1fZGVncmVlc1t0
bXBJbmRleF0tLTsKLSAgICAgICAgaWYgKG9sZERlZ3JlZSA9PSBtX3JlZ3NJblByaW9yaXR5T3Jk
ZXIuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBlbmFibGVNb3Zlc09uVmFsdWVBbmRBZGphY2VudHMo
dG1wSW5kZXgpOwotICAgICAgICAgICAgbV9zcGlsbFdvcmtsaXN0LnJlbW92ZSh0bXBJbmRleCk7
Ci0gICAgICAgICAgICBpZiAoaXNNb3ZlUmVsYXRlZCh0bXBJbmRleCkpCi0gICAgICAgICAgICAg
ICAgbV9mcmVlemVXb3JrbGlzdC5hZGQodG1wSW5kZXgpOwotICAgICAgICAgICAgZWxzZQotICAg
ICAgICAgICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5hcHBlbmQodG1wSW5kZXgpOwotICAgICAg
ICB9Ci0gICAgfQotCi0KICAgICBib29sIGFkZEVkZ2VEaXN0aW5jdFdpdGhvdXREZWdyZWVDaGFu
Z2UoSW5kZXhUeXBlIGEsIEluZGV4VHlwZSBiKQogICAgIHsKICAgICAgICAgQVNTRVJUKGEgIT0g
Yik7Ci0gICAgICAgIGlmIChtX2ludGVyZmVyZW5jZUVkZ2VzLmFkZChJbnRlcmZlcmVuY2VFZGdl
KGEsIGIpKS5pc05ld0VudHJ5KSB7CisgICAgICAgIGJvb2wgaXNOZXdFZGdlID0gYWRkSW50ZXJm
ZXJlbmNlRWRnZShJbnRlcmZlcmVuY2VFZGdlKGEsIGIpKTsKKyAgICAgICAgaWYgKGlzTmV3RWRn
ZSkgewogICAgICAgICAgICAgaWYgKCFpc1ByZWNvbG9yZWQoYSkpIHsKICAgICAgICAgICAgICAg
ICBBU1NFUlQoIW1fYWRqYWNlbmN5TGlzdFthXS5jb250YWlucyhiKSk7CiAgICAgICAgICAgICAg
ICAgbV9hZGphY2VuY3lMaXN0W2FdLmFwcGVuZChiKTsKQEAgLTMxMSwxNSArMTUzLDYgQEAgcHJp
dmF0ZToKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGJvb2wgaXNNb3ZlUmVs
YXRlZChJbmRleFR5cGUgdG1wSW5kZXgpCi0gICAgewotICAgICAgICBmb3IgKHVuc2lnbmVkIG1v
dmVJbmRleCA6IG1fbW92ZUxpc3RbdG1wSW5kZXhdKSB7Ci0gICAgICAgICAgICBpZiAobV9hY3Rp
dmVNb3Zlcy5xdWlja0dldChtb3ZlSW5kZXgpIHx8IG1fd29ya2xpc3RNb3Zlcy5jb250YWlucyht
b3ZlSW5kZXgpKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdGlv
bj4KICAgICB2b2lkIGZvckVhY2hBZGphY2VudChJbmRleFR5cGUgdG1wSW5kZXgsIEZ1bmN0aW9u
IGZ1bmN0aW9uKQogICAgIHsKQEAgLTMzMSw4MCArMTY0LDEyIEBAIHByaXZhdGU6CiAKICAgICBi
b29sIGhhc0JlZW5TaW1wbGlmaWVkKEluZGV4VHlwZSB0bXBJbmRleCkKICAgICB7Ci0gICAgICAg
IHJldHVybiBtX2lzT25TZWxlY3RTdGFjay5xdWlja0dldCh0bXBJbmRleCkgfHwgISFtX2NvYWxl
c2NlZFRtcHNbdG1wSW5kZXhdOwotICAgIH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0
aW9uPgotICAgIHZvaWQgZm9yRWFjaE5vZGVNb3ZlcyhJbmRleFR5cGUgdG1wSW5kZXgsIEZ1bmN0
aW9uIGZ1bmN0aW9uKQotICAgIHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBtb3ZlSW5kZXggOiBt
X21vdmVMaXN0W3RtcEluZGV4XSkgewotICAgICAgICAgICAgaWYgKG1fYWN0aXZlTW92ZXMucXVp
Y2tHZXQobW92ZUluZGV4KSB8fCBtX3dvcmtsaXN0TW92ZXMuY29udGFpbnMobW92ZUluZGV4KSkK
LSAgICAgICAgICAgICAgICBmdW5jdGlvbihtb3ZlSW5kZXgpOwotICAgICAgICB9Ci0gICAgfQot
Ci0gICAgdm9pZCBlbmFibGVNb3Zlc09uVmFsdWUoSW5kZXhUeXBlIHRtcEluZGV4KQotICAgIHsK
LSAgICAgICAgZm9yICh1bnNpZ25lZCBtb3ZlSW5kZXggOiBtX21vdmVMaXN0W3RtcEluZGV4XSkg
ewotICAgICAgICAgICAgaWYgKG1fYWN0aXZlTW92ZXMucXVpY2tDbGVhcihtb3ZlSW5kZXgpKQot
ICAgICAgICAgICAgICAgIG1fd29ya2xpc3RNb3Zlcy5yZXR1cm5Nb3ZlKG1vdmVJbmRleCk7Ci0g
ICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGVuYWJsZU1vdmVzT25WYWx1ZUFuZEFkamFjZW50
cyhJbmRleFR5cGUgdG1wSW5kZXgpCi0gICAgewotICAgICAgICBlbmFibGVNb3Zlc09uVmFsdWUo
dG1wSW5kZXgpOwotCi0gICAgICAgIGZvckVhY2hBZGphY2VudCh0bXBJbmRleCwgW3RoaXNdIChJ
bmRleFR5cGUgYWRqYWNlbnRUbXBJbmRleCkgewotICAgICAgICAgICAgZW5hYmxlTW92ZXNPblZh
bHVlKGFkamFjZW50VG1wSW5kZXgpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBib29sIGlz
UHJlY29sb3JlZChJbmRleFR5cGUgdG1wSW5kZXgpCi0gICAgewotICAgICAgICByZXR1cm4gdG1w
SW5kZXggPD0gbV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXg7Ci0gICAgfQotCi0gICAgdm9p
ZCBhZGRXb3JrTGlzdChJbmRleFR5cGUgdG1wSW5kZXgpCi0gICAgewotICAgICAgICBpZiAoIWlz
UHJlY29sb3JlZCh0bXBJbmRleCkgJiYgbV9kZWdyZWVzW3RtcEluZGV4XSA8IG1fcmVnc0luUHJp
b3JpdHlPcmRlci5zaXplKCkgJiYgIWlzTW92ZVJlbGF0ZWQodG1wSW5kZXgpKSB7Ci0gICAgICAg
ICAgICBtX2ZyZWV6ZVdvcmtsaXN0LnJlbW92ZSh0bXBJbmRleCk7Ci0gICAgICAgICAgICBtX3Np
bXBsaWZ5V29ya2xpc3QuYXBwZW5kKHRtcEluZGV4KTsKKyAgICAgICAgaWYgKCFBU1NFUlRfRElT
QUJMRUQpIHsKKyAgICAgICAgICAgIGlmICghIW1fY29hbGVzY2VkVG1wc1t0bXBJbmRleF0pCisg
ICAgICAgICAgICAgICAgQVNTRVJUKGdldEFsaWFzKHRtcEluZGV4KSAhPSB0bXBJbmRleCk7CiAg
ICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGNvbWJpbmUoSW5kZXhUeXBlIHUsIEluZGV4VHlw
ZSB2KQotICAgIHsKLSAgICAgICAgaWYgKCFtX2ZyZWV6ZVdvcmtsaXN0LnJlbW92ZSh2KSkKLSAg
ICAgICAgICAgIG1fc3BpbGxXb3JrbGlzdC5yZW1vdmUodik7Ci0KLSAgICAgICAgQVNTRVJUKCFt
X2NvYWxlc2NlZFRtcHNbdl0pOwotICAgICAgICBtX2NvYWxlc2NlZFRtcHNbdl0gPSB1OwotCi0g
ICAgICAgIGF1dG8mIHZNb3ZlcyA9IG1fbW92ZUxpc3Rbdl07Ci0gICAgICAgIG1fbW92ZUxpc3Rb
dV0uYWRkKHZNb3Zlcy5iZWdpbigpLCB2TW92ZXMuZW5kKCkpOwotCi0gICAgICAgIGZvckVhY2hB
ZGphY2VudCh2LCBbdGhpcywgdV0gKEluZGV4VHlwZSBhZGphY2VudFRtcEluZGV4KSB7Ci0gICAg
ICAgICAgICBpZiAoYWRkRWRnZURpc3RpbmN0V2l0aG91dERlZ3JlZUNoYW5nZShhZGphY2VudFRt
cEluZGV4LCB1KSkgewotICAgICAgICAgICAgICAgIC8vIElmIHdlIGFkZGVkIGEgbmV3IGVkZ2Ug
YmV0d2VlbiB0aGUgYWRqYWNlbnRUbXAgYW5kIHUsIGl0IHJlcGxhY2VzIHRoZSBlZGdlCi0gICAg
ICAgICAgICAgICAgLy8gdGhhdCBleGlzdGVkIHdpdGggdi4KLSAgICAgICAgICAgICAgICAvLyBU
aGUgZGVncmVlIG9mIGFkamFjZW50VG1wIHJlbWFpbnMgdGhlIHNhbWUgc2luY2UgdGhlIGVkZ2Ug
anVzdCBjaGFuZ2VkIGZyb20gdSB0byB2LgotICAgICAgICAgICAgICAgIC8vIEFsbCB3ZSBuZWVk
IHRvIGRvIGlzIHVwZGF0ZSB0aGUgZGVncmVlIG9mIHUuCi0gICAgICAgICAgICAgICAgaWYgKCFp
c1ByZWNvbG9yZWQodSkpCi0gICAgICAgICAgICAgICAgICAgIG1fZGVncmVlc1t1XSsrOwotICAg
ICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB3ZSBhbHJlYWR5IGhhZCBh
biBlZGdlIGJldHdlZW4gdGhlIGFkamFjZW50VG1wIGFuZCB1LCB0aGUgZGVncmVlIG9mIHUKLSAg
ICAgICAgICAgICAgICAvLyBpcyBhbHJlYWR5IGNvcnJlY3QuIFRoZSBkZWdyZWUgb2YgdGhlIGFk
amFjZW50VG1wIGRlY3JlYXNlcyBzaW5jZSB0aGUgZWRnZQotICAgICAgICAgICAgICAgIC8vIHdp
dGggdiBpcyBubyBsb25nZXIgcmVsZXZhbnQgKHdlIGNhbiB0aGluayBvZiBpdCBhcyBtZXJnZWQg
d2l0aCB0aGUgZWRnZSB3aXRoIHUpLgotICAgICAgICAgICAgICAgIGRlY3JlbWVudERlZ3JlZShh
ZGphY2VudFRtcEluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAg
aWYgKG1fZnJhbWVQb2ludGVySW5kZXggJiYgbV9pbnRlcmZlcmVzV2l0aEZyYW1lUG9pbnRlci5x
dWlja0dldCh2KSkKLSAgICAgICAgICAgIG1faW50ZXJmZXJlc1dpdGhGcmFtZVBvaW50ZXIucXVp
Y2tTZXQodSk7CiAKLSAgICAgICAgaWYgKG1fZGVncmVlc1t1XSA+PSBtX3JlZ3NJblByaW9yaXR5
T3JkZXIuc2l6ZSgpICYmIG1fZnJlZXplV29ya2xpc3QucmVtb3ZlKHUpKQotICAgICAgICAgICAg
YWRkVG9TcGlsbCh1KTsKKyAgICAgICAgcmV0dXJuIG1faXNPblNlbGVjdFN0YWNrLnF1aWNrR2V0
KHRtcEluZGV4KSB8fCAhIW1fY29hbGVzY2VkVG1wc1t0bXBJbmRleF07CiAgICAgfQogCiAgICAg
Ym9vbCBjYW5CZVNhZmVseUNvYWxlc2NlZChJbmRleFR5cGUgdSwgSW5kZXhUeXBlIHYpCkBAIC00
MjksNyArMTk0LDcgQEAgcHJpdmF0ZToKICAgICAgICAgY29uc3QgYXV0byYgYWRqYWNlbnRzT2ZV
ID0gbV9hZGphY2VuY3lMaXN0W3VdOwogICAgICAgICBjb25zdCBhdXRvJiBhZGphY2VudHNPZlYg
PSBtX2FkamFjZW5jeUxpc3Rbdl07CiAKLSAgICAgICAgaWYgKGFkamFjZW50c09mVS5zaXplKCkg
KyBhZGphY2VudHNPZlYuc2l6ZSgpIDwgbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKSkgewor
ICAgICAgICBpZiAoYWRqYWNlbnRzT2ZVLnNpemUoKSArIGFkamFjZW50c09mVi5zaXplKCkgPCBy
ZWdpc3RlckNvdW50KCkpIHsKICAgICAgICAgICAgIC8vIFNob3J0Y3V0OiBpZiB0aGUgdG90YWwg
bnVtYmVyIG9mIGFkamFjZW50cyBpcyBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiByZWdpc3Rlciwg
dGhlIGNvbmRpdGlvbiBpcyBhbHdheXMgbWV0LgogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAg
ICAgICAgIH0KQEAgLTQzOSwyMyArMjA0LDIzIEBAIHByaXZhdGU6CiAgICAgICAgIGZvciAoSW5k
ZXhUeXBlIGFkamFjZW50VG1wSW5kZXggOiBhZGphY2VudHNPZlUpIHsKICAgICAgICAgICAgIEFT
U0VSVChhZGphY2VudFRtcEluZGV4ICE9IHYpOwogICAgICAgICAgICAgQVNTRVJUKGFkamFjZW50
VG1wSW5kZXggIT0gdSk7Ci0gICAgICAgICAgICBpZiAoIWhhc0JlZW5TaW1wbGlmaWVkKGFkamFj
ZW50VG1wSW5kZXgpICYmIG1fZGVncmVlc1thZGphY2VudFRtcEluZGV4XSA+PSBtX3JlZ3NJblBy
aW9yaXR5T3JkZXIuc2l6ZSgpKSB7CisgICAgICAgICAgICBpZiAoIWhhc0JlZW5TaW1wbGlmaWVk
KGFkamFjZW50VG1wSW5kZXgpICYmIG1fZGVncmVlc1thZGphY2VudFRtcEluZGV4XSA+PSByZWdp
c3RlckNvdW50KCkpIHsKICAgICAgICAgICAgICAgICBhdXRvIGFkZFJlc3VsdCA9IGhpZ2hPcmRl
ckFkamFjZW50cy5hZGQoYWRqYWNlbnRUbXBJbmRleCk7Ci0gICAgICAgICAgICAgICAgaWYgKGFk
ZFJlc3VsdC5pc05ld0VudHJ5ICYmIGhpZ2hPcmRlckFkamFjZW50cy5zaXplKCkgPj0gbV9yZWdz
SW5Qcmlvcml0eU9yZGVyLnNpemUoKSkKKyAgICAgICAgICAgICAgICBpZiAoYWRkUmVzdWx0Lmlz
TmV3RW50cnkgJiYgaGlnaE9yZGVyQWRqYWNlbnRzLnNpemUoKSA+PSByZWdpc3RlckNvdW50KCkp
CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAg
ICAgfQogICAgICAgICBmb3IgKEluZGV4VHlwZSBhZGphY2VudFRtcEluZGV4IDogYWRqYWNlbnRz
T2ZWKSB7CiAgICAgICAgICAgICBBU1NFUlQoYWRqYWNlbnRUbXBJbmRleCAhPSB1KTsKICAgICAg
ICAgICAgIEFTU0VSVChhZGphY2VudFRtcEluZGV4ICE9IHYpOwotICAgICAgICAgICAgaWYgKCFo
YXNCZWVuU2ltcGxpZmllZChhZGphY2VudFRtcEluZGV4KSAmJiBtX2RlZ3JlZXNbYWRqYWNlbnRU
bXBJbmRleF0gPj0gbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKSkgeworICAgICAgICAgICAg
aWYgKCFoYXNCZWVuU2ltcGxpZmllZChhZGphY2VudFRtcEluZGV4KSAmJiBtX2RlZ3JlZXNbYWRq
YWNlbnRUbXBJbmRleF0gPj0gcmVnaXN0ZXJDb3VudCgpKSB7CiAgICAgICAgICAgICAgICAgYXV0
byBhZGRSZXN1bHQgPSBoaWdoT3JkZXJBZGphY2VudHMuYWRkKGFkamFjZW50VG1wSW5kZXgpOwot
ICAgICAgICAgICAgICAgIGlmIChhZGRSZXN1bHQuaXNOZXdFbnRyeSAmJiBoaWdoT3JkZXJBZGph
Y2VudHMuc2l6ZSgpID49IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkpCisgICAgICAgICAg
ICAgICAgaWYgKGFkZFJlc3VsdC5pc05ld0VudHJ5ICYmIGhpZ2hPcmRlckFkamFjZW50cy5zaXpl
KCkgPj0gcmVnaXN0ZXJDb3VudCgpKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBBU1NFUlQoaGlnaE9yZGVyQWRq
YWNlbnRzLnNpemUoKSA8IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkpOworICAgICAgICBB
U1NFUlQoaGlnaE9yZGVyQWRqYWNlbnRzLnNpemUoKSA8IHJlZ2lzdGVyQ291bnQoKSk7CiAgICAg
ICAgIHJldHVybiB0cnVlOwogICAgIH0KIApAQCAtNDc4LDI0ICsyNDMsMTU4IEBAIHByaXZhdGU6
CiAgICAgICAgIGZvciAodW5zaWduZWQgYWRqYWNlbnRUbXBJbmRleCA6IGFkamFjZW50c09mVikg
ewogICAgICAgICAgICAgaWYgKCFpc1ByZWNvbG9yZWQoYWRqYWNlbnRUbXBJbmRleCkKICAgICAg
ICAgICAgICAgICAmJiAhaGFzQmVlblNpbXBsaWZpZWQoYWRqYWNlbnRUbXBJbmRleCkKLSAgICAg
ICAgICAgICAgICAmJiBtX2RlZ3JlZXNbYWRqYWNlbnRUbXBJbmRleF0gPj0gbV9yZWdzSW5Qcmlv
cml0eU9yZGVyLnNpemUoKQotICAgICAgICAgICAgICAgICYmICFtX2ludGVyZmVyZW5jZUVkZ2Vz
LmNvbnRhaW5zKEludGVyZmVyZW5jZUVkZ2UodSwgYWRqYWNlbnRUbXBJbmRleCkpKQorICAgICAg
ICAgICAgICAgICYmIG1fZGVncmVlc1thZGphY2VudFRtcEluZGV4XSA+PSByZWdpc3RlckNvdW50
KCkKKyAgICAgICAgICAgICAgICAmJiAhaGFzSW50ZXJmZXJlbmNlRWRnZShJbnRlcmZlcmVuY2VF
ZGdlKHUsIGFkamFjZW50VG1wSW5kZXgpKSkKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi1wcm90ZWN0ZWQ6Ci0j
aWYgUExBVEZPUk0oQ09DT0EpCi0jcHJhZ21hIG1hcmsgLQotI2VuZGlmCisgICAgSW5kZXhUeXBl
IHNlbGVjdFNwaWxsKCkKKyAgICB7CisgICAgICAgIGlmICghbV9oYXNTZWxlY3RlZFNwaWxsKSB7
CisgICAgICAgICAgICBtX2hhc1NlbGVjdGVkU3BpbGwgPSB0cnVlOwogCi0gICAgLy8gSW50ZXJm
ZXJlbmNlIGVkZ2VzIGFyZSBub3QgZGlyZWN0ZWQuIEFuIGVkZ2UgYmV0d2VlbiBhbnkgdHdvIFRt
cHMgaXMgcmVwcmVzZW50ZWQKLSAgICAvLyBieSB0aGUgY29uY2F0ZW5hdGVkIHZhbHVlcyBvZiB0
aGUgc21hbGxlc3QgVG1wIGZvbGxvd2VkIGJ5IHRoZSBiaWdnZXIgVG1wLgotICAgIGNsYXNzIElu
dGVyZmVyZW5jZUVkZ2UgewotICAgIHB1YmxpYzoKLSAgICAgICAgSW50ZXJmZXJlbmNlRWRnZSgp
Ci0gICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtX2hhc0NvYWxlc2NlZE5vblRyaXZpYWxNb3Zl
KQorICAgICAgICAgICAgICAgIG1fY29hbGVzY2VkVG1wc0F0U3BpbGwgPSBtX2NvYWxlc2NlZFRt
cHM7CisgICAgICAgIH0KKworICAgICAgICBhdXRvIGl0ZXJhdG9yID0gbV9zcGlsbFdvcmtsaXN0
LmJlZ2luKCk7CisKKyAgICAgICAgUkVMRUFTRV9BU1NFUlRfV0lUSF9NRVNTQUdFKGl0ZXJhdG9y
ICE9IG1fc3BpbGxXb3JrbGlzdC5lbmQoKSwgInNlbGVjdFNwaWxsKCkgY2FsbGVkIHdoZW4gdGhl
cmUgd2FzIG5vIHNwaWxsLiIpOworICAgICAgICBSRUxFQVNFX0FTU0VSVF9XSVRIX01FU1NBR0Uo
IW1fdW5zcGlsbGFibGVUbXBzLmNvbnRhaW5zKCppdGVyYXRvciksICJ0cnlpbmcgdG8gc3BpbGwg
dW5zcGlsbGFibGUgdG1wIik7CisKKyAgICAgICAgLy8gSGlnaGVyIHNjb3JlIG1lYW5zIG1vcmUg
ZGVzaXJhYmxlIHRvIHNwaWxsLiBMb3dlciBzY29yZXMgbWF4aW1pemUgdGhlIGxpa2VsaWhvb2Qg
dGhhdCBhIHRtcAorICAgICAgICAvLyBnZXRzIGEgcmVnaXN0ZXIuCisgICAgICAgIGF1dG8gc2Nv
cmUgPSBbJl0gKFRtcCB0bXApIC0+IGRvdWJsZSB7CisgICAgICAgICAgICAvLyBBaXIgZXhwb3Nl
cyB0aGUgY29uY2VwdCBvZiAiZmFzdCB0bXBzIiwgYW5kIHdlIGludGVycHJldCB0aGF0IHRvIG1l
YW4gdGhhdCB0aGUgdG1wCisgICAgICAgICAgICAvLyBzaG91bGQgYWx3YXlzIGJlIGluIGEgcmVn
aXN0ZXIuCisgICAgICAgICAgICBpZiAobV9jb2RlLmlzRmFzdFRtcCh0bXApKQorICAgICAgICAg
ICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBBbGwgZWxzZSBi
ZWluZyBlcXVhbCwgdGhlIHNjb3JlIHNob3VsZCBiZSBkaXJlY3RseSByZWxhdGVkIHRvIHRoZSBk
ZWdyZWUuCisgICAgICAgICAgICBkb3VibGUgZGVncmVlID0gc3RhdGljX2Nhc3Q8ZG91YmxlPiht
X2RlZ3JlZXNbVG1wTWFwcGVyOjphYnNvbHV0ZUluZGV4KHRtcCldKTsKKworICAgICAgICAgICAg
Ly8gQWxsIGVsc2UgYmVpbmcgZXF1YWwsIHRoZSBzY29yZSBzaG91bGQgYmUgaW52ZXJzZWx5IHJl
bGF0ZWQgdG8gdGhlIG51bWJlciBvZiB3YXJtIHVzZXMgYW5kCisgICAgICAgICAgICAvLyBkZWZz
LgorICAgICAgICAgICAgY29uc3QgVXNlQ291bnRzPFRtcD46OkNvdW50cyogY291bnRzID0gbV91
c2VDb3VudHNbdG1wXTsKKyAgICAgICAgICAgIGlmICghY291bnRzKQorICAgICAgICAgICAgICAg
IHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCk7CisgICAgICAg
ICAgICAKKyAgICAgICAgICAgIGRvdWJsZSB1c2VzID0gY291bnRzLT5udW1XYXJtVXNlcyArIGNv
dW50cy0+bnVtRGVmczsKKworICAgICAgICAgICAgLy8gSWYgaXQncyBhIGNvbnN0YW50LCB0aGVu
IGl0J3Mgbm90IGFzIGJhZCB0byBzcGlsbC4gV2UgY2FuIHJlbWF0ZXJpYWxpemUgaXQgaW4gbWFu
eQorICAgICAgICAgICAgLy8gY2FzZXMuCisgICAgICAgICAgICBpZiAoY291bnRzLT5udW1Db25z
dERlZnMgPT0gMSAmJiBjb3VudHMtPm51bURlZnMgPT0gMSkKKyAgICAgICAgICAgICAgICB1c2Vz
IC89IDI7CisKKyAgICAgICAgICAgIHJldHVybiBkZWdyZWUgLyB1c2VzOworICAgICAgICB9Owor
CisgICAgICAgIGF1dG8gdmljdGltSXRlcmF0b3IgPSBpdGVyYXRvcjsKKyAgICAgICAgZG91Ymxl
IG1heFNjb3JlID0gc2NvcmUoVG1wTWFwcGVyOjp0bXBGcm9tQWJzb2x1dGVJbmRleCgqaXRlcmF0
b3IpKTsKKworICAgICAgICArK2l0ZXJhdG9yOworICAgICAgICBmb3IgKDtpdGVyYXRvciAhPSBt
X3NwaWxsV29ya2xpc3QuZW5kKCk7ICsraXRlcmF0b3IpIHsKKyAgICAgICAgICAgIGRvdWJsZSB0
bXBTY29yZSA9IHNjb3JlKFRtcE1hcHBlcjo6dG1wRnJvbUFic29sdXRlSW5kZXgoKml0ZXJhdG9y
KSk7CisgICAgICAgICAgICBpZiAodG1wU2NvcmUgPiBtYXhTY29yZSkgeworICAgICAgICAgICAg
ICAgIEFTU0VSVCghbV91bnNwaWxsYWJsZVRtcHMuY29udGFpbnMoKml0ZXJhdG9yKSk7CisgICAg
ICAgICAgICAgICAgdmljdGltSXRlcmF0b3IgPSBpdGVyYXRvcjsKKyAgICAgICAgICAgICAgICBt
YXhTY29yZSA9IHRtcFNjb3JlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAg
SW5kZXhUeXBlIHZpY3RpbUluZGV4ID0gKnZpY3RpbUl0ZXJhdG9yOworICAgICAgICBpZiAodHJh
Y2VEZWJ1ZykKKyAgICAgICAgICAgIGRhdGFMb2dMbigiU2VsZWN0aW5nIHNwaWxsICIsIHZpY3Rp
bUluZGV4KTsKKyAgICAgICAgQVNTRVJUKCFpc1ByZWNvbG9yZWQodmljdGltSW5kZXgpKTsKKyAg
ICAgICAgcmV0dXJuIHZpY3RpbUluZGV4OworICAgIH0KKworICAgIHZvaWQgYXNzaWduQ29sb3Jz
KCkKKyAgICB7CisgICAgICAgIEFTU0VSVChtX3NpbXBsaWZ5V29ya2xpc3QuaXNFbXB0eSgpKTsK
KyAgICAgICAgQVNTRVJUKCFtX3NwaWxsV29ya2xpc3QuYml0Q291bnQoKSk7CisKKyAgICAgICAg
Ly8gUmVjbGFpbSBhcyBtdWNoIG1lbW9yeSBhcyBwb3NzaWJsZS4KKyAgICAgICAgbV9pbnRlcmZl
cmVuY2VFZGdlcy5jbGVhcigpOworCisgICAgICAgIG1fZGVncmVlcy5jbGVhcigpOworICAgICAg
ICBtX21vdmVMaXN0LmNsZWFyKCk7CisgICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5jbGVhcigp
OworICAgICAgICBtX3NwaWxsV29ya2xpc3QuY2xlYXJBbGwoKTsKKworICAgICAgICAvLyBUcnkg
dG8gY29sb3IgdGhlIFRtcCBvbiB0aGUgc3RhY2suCisgICAgICAgIG1fY29sb3JlZFRtcC5yZXNp
emUobV9hZGphY2VuY3lMaXN0LnNpemUoKSk7CisKKyAgICAgICAgd2hpbGUgKCFtX3NlbGVjdFN0
YWNrLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdW5zaWduZWQgdG1wSW5kZXggPSBtX3NlbGVj
dFN0YWNrLnRha2VMYXN0KCk7CisgICAgICAgICAgICBtX2lzT25TZWxlY3RTdGFjay5xdWlja0Ns
ZWFyKHRtcEluZGV4KTsKKyAgICAgICAgICAgIEFTU0VSVCghaXNQcmVjb2xvcmVkKHRtcEluZGV4
KSk7CisgICAgICAgICAgICBBU1NFUlQoIW1fY29sb3JlZFRtcFt0bXBJbmRleF0pOworICAgICAg
ICAgICAgUkVMRUFTRV9BU1NFUlQoZ2V0QWxpYXModG1wSW5kZXgpID09IHRtcEluZGV4KTsKKwor
ICAgICAgICAgICAgUmVnaXN0ZXJTZXQgY29sb3JlZFJlZ2lzdGVyczsKKyAgICAgICAgICAgIGZv
ciAoSW5kZXhUeXBlIGFkamFjZW50VG1wSW5kZXggOiBtX2FkamFjZW5jeUxpc3RbdG1wSW5kZXhd
KSB7CisgICAgICAgICAgICAgICAgSW5kZXhUeXBlIGFsaWFzVG1wSW5kZXggPSBnZXRBbGlhcyhh
ZGphY2VudFRtcEluZGV4KTsKKyAgICAgICAgICAgICAgICBSZWcgcmVnID0gbV9jb2xvcmVkVG1w
W2FsaWFzVG1wSW5kZXhdOworCisgICAgICAgICAgICAgICAgQVNTRVJUKCFpc1ByZWNvbG9yZWQo
YWxpYXNUbXBJbmRleCkgfHwgKGlzUHJlY29sb3JlZChhbGlhc1RtcEluZGV4KSAmJiByZWcpKTsK
KworICAgICAgICAgICAgICAgIGlmIChyZWcpCisgICAgICAgICAgICAgICAgICAgIGNvbG9yZWRS
ZWdpc3RlcnMuc2V0KHJlZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgY29s
b3JBc3NpZ25lZCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChSZWcgcmVnIDogbV9yZWdzSW5Q
cmlvcml0eU9yZGVyKSB7CisgICAgICAgICAgICAgICAgaWYgKCFjb2xvcmVkUmVnaXN0ZXJzLmdl
dChyZWcpKSB7CisgICAgICAgICAgICAgICAgICAgIG1fY29sb3JlZFRtcFt0bXBJbmRleF0gPSBy
ZWc7CisgICAgICAgICAgICAgICAgICAgIGNvbG9yQXNzaWduZWQgPSB0cnVlOworICAgICAgICAg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgIGlmICghY29sb3JBc3NpZ25lZCkKKyAgICAgICAgICAgICAgICBtX3NwaWxsZWRU
bXBzLmFwcGVuZCh0bXBJbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBtX3NlbGVjdFN0YWNr
LmNsZWFyKCk7CisKKyAgICAgICAgaWYgKG1fc3BpbGxlZFRtcHMuaXNFbXB0eSgpKQorICAgICAg
ICAgICAgbV9jb2FsZXNjZWRUbXBzQXRTcGlsbC5jbGVhcigpOworICAgICAgICBlbHNlCisgICAg
ICAgICAgICBtX2NvbG9yZWRUbXAuY2xlYXIoKTsKKyAgICB9CisKKyAgICB2b2lkIGR1bXBJbnRl
cmZlcmVuY2VHcmFwaEluRG90KFByaW50U3RyZWFtJiBvdXQpCisgICAgeworICAgICAgICBvdXQu
cHJpbnQoImdyYXBoIEludGVyZmVyZW5jZUdyYXBoIHsgXG4iKTsKKworICAgICAgICBIYXNoU2V0
PFRtcD4gdG1wc1dpdGhJbnRlcmZlcmVuY2VzOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGVk
Z2UgOiBtX2ludGVyZmVyZW5jZUVkZ2VzKSB7CisgICAgICAgICAgICB0bXBzV2l0aEludGVyZmVy
ZW5jZXMuYWRkKFRtcE1hcHBlcjo6dG1wRnJvbUFic29sdXRlSW5kZXgoZWRnZS5maXJzdCgpKSk7
CisgICAgICAgICAgICB0bXBzV2l0aEludGVyZmVyZW5jZXMuYWRkKFRtcE1hcHBlcjo6dG1wRnJv
bUFic29sdXRlSW5kZXgoZWRnZS5zZWNvbmQoKSkpOworICAgICAgICB9CisKKyAgICAgICAgZm9y
IChjb25zdCBhdXRvJiB0bXAgOiB0bXBzV2l0aEludGVyZmVyZW5jZXMpIHsKKyAgICAgICAgICAg
IHVuc2lnbmVkIHRtcEluZGV4ID0gVG1wTWFwcGVyOjphYnNvbHV0ZUluZGV4KHRtcCk7CisgICAg
ICAgICAgICBpZiAodG1wSW5kZXggPCBtX2RlZ3JlZXMuc2l6ZSgpKQorICAgICAgICAgICAgICAg
IG91dC5wcmludCgiICAgICIsIHRtcC5pbnRlcm5hbFZhbHVlKCksICIgW2xhYmVsPVwiIiwgdG1w
LCAiICgiLCBtX2RlZ3JlZXNbdG1wSW5kZXhdLCAiKVwiXTtcbiIpOworICAgICAgICAgICAgZWxz
ZQorICAgICAgICAgICAgICAgIG91dC5wcmludCgiICAgICIsIHRtcC5pbnRlcm5hbFZhbHVlKCks
ICIgW2xhYmVsPVwiIiwgdG1wLCAiXCJdO1xuIik7CisgICAgICAgIH0KKworICAgICAgICBmb3Ig
KGNvbnN0IGF1dG8mIGVkZ2UgOiBtX2ludGVyZmVyZW5jZUVkZ2VzKQorICAgICAgICAgICAgb3V0
LnByaW50KCIgICAgIiwgZWRnZS5maXJzdCgpLCAiIC0tICIsIGVkZ2Uuc2Vjb25kKCksICI7XG4i
KTsKKyAgICAgICAgb3V0LnByaW50KCJ9XG4iKTsKKyAgICB9CisKKyAgICAvLyBJbnRlcmZlcmVu
Y2UgZWRnZXMgYXJlIG5vdCBkaXJlY3RlZC4gQW4gZWRnZSBiZXR3ZWVuIGFueSB0d28gVG1wcyBp
cyByZXByZXNlbnRlZAorICAgIC8vIGJ5IHRoZSBjb25jYXRlbmF0ZWQgdmFsdWVzIG9mIHRoZSBz
bWFsbGVzdCBUbXAgZm9sbG93ZWQgYnkgdGhlIGJpZ2dlciBUbXAuCisgICAgY2xhc3MgSW50ZXJm
ZXJlbmNlRWRnZSB7CisgICAgcHVibGljOgorICAgICAgICBJbnRlcmZlcmVuY2VFZGdlKCkKKyAg
ICAgICAgewogICAgICAgICB9CiAKICAgICAgICAgSW50ZXJmZXJlbmNlRWRnZShJbmRleFR5cGUg
YSwgSW5kZXhUeXBlIGIpCkBAIC01NDgsNiArNDQ3LDE2IEBAIHByb3RlY3RlZDoKICAgICAgICAg
dWludDY0X3QgbV92YWx1ZSB7IDAgfTsKICAgICB9OwogCisgICAgYm9vbCBhZGRJbnRlcmZlcmVu
Y2VFZGdlKEludGVyZmVyZW5jZUVkZ2UgZWRnZSkKKyAgICB7CisgICAgICAgIHJldHVybiBtX2lu
dGVyZmVyZW5jZUVkZ2VzLmFkZChlZGdlKS5pc05ld0VudHJ5OworICAgIH0KKworICAgIGJvb2wg
aGFzSW50ZXJmZXJlbmNlRWRnZShJbnRlcmZlcmVuY2VFZGdlIGVkZ2UpCisgICAgeworICAgICAg
ICByZXR1cm4gbV9pbnRlcmZlcmVuY2VFZGdlcy5jb250YWlucyhlZGdlKTsKKyAgICB9CisKICAg
ICBzdHJ1Y3QgSW50ZXJmZXJlbmNlRWRnZUhhc2ggewogICAgICAgICBzdGF0aWMgdW5zaWduZWQg
aGFzaChjb25zdCBJbnRlcmZlcmVuY2VFZGdlJiBrZXkpIHsgcmV0dXJuIGtleS5oYXNoKCk7IH0K
ICAgICAgICAgc3RhdGljIGJvb2wgZXF1YWwoY29uc3QgSW50ZXJmZXJlbmNlRWRnZSYgYSwgY29u
c3QgSW50ZXJmZXJlbmNlRWRnZSYgYikgeyByZXR1cm4gYSA9PSBiOyB9CkBAIC01NTUsMzkgKzQ2
NCw3MDUgQEAgcHJvdGVjdGVkOgogICAgIH07CiAgICAgdHlwZWRlZiBTaW1wbGVDbGFzc0hhc2hU
cmFpdHM8SW50ZXJmZXJlbmNlRWRnZT4gSW50ZXJmZXJlbmNlRWRnZUhhc2hUcmFpdHM7CiAKLSAg
ICBjb25zdCBWZWN0b3I8UmVnPiYgbV9yZWdzSW5Qcmlvcml0eU9yZGVyOwotICAgIFJlZ2lzdGVy
U2V0IG1fbXV0YWJsZVJlZ3M7Ci0gICAgSW5kZXhUeXBlIG1fbGFzdFByZWNvbG9yZWRSZWdpc3Rl
ckluZGV4IHsgMCB9OworICAgIGNvbnN0IFZlY3RvcjxSZWc+JiBtX3JlZ3NJblByaW9yaXR5T3Jk
ZXI7CisgICAgUmVnaXN0ZXJTZXQgbV9tdXRhYmxlUmVnczsKKyAgICBJbmRleFR5cGUgbV9sYXN0
UHJlY29sb3JlZFJlZ2lzdGVySW5kZXggeyAwIH07CisKKyAgICAvLyBUaGUgaW50ZXJmZXJlbmNl
IGdyYXBoLgorICAgIEhhc2hTZXQ8SW50ZXJmZXJlbmNlRWRnZSwgSW50ZXJmZXJlbmNlRWRnZUhh
c2gsIEludGVyZmVyZW5jZUVkZ2VIYXNoVHJhaXRzPiBtX2ludGVyZmVyZW5jZUVkZ2VzOworCisg
ICAgVmVjdG9yPFZlY3RvcjxJbmRleFR5cGUsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93LCA0Piwg
MCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fYWRqYWNlbmN5TGlzdDsKKyAgICBWZWN0b3I8SW5k
ZXhUeXBlLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9kZWdyZWVzOworCisgICAgLy8gSW5z
dGVhZCBvZiBrZWVwaW5nIHRyYWNrIG9mIHRoZSBtb3ZlIGluc3RydWN0aW9ucywgd2UganVzdCBr
ZWVwIHRoZWlyIG9wZXJhbmRzIGFyb3VuZCBhbmQgdXNlIHRoZSBpbmRleAorICAgIC8vIGluIHRo
ZSB2ZWN0b3IgYXMgdGhlICJpZGVudGlmaWVyIiBmb3IgdGhlIG1vdmUuCisgICAgc3RydWN0IE1v
dmVPcGVyYW5kcyB7CisgICAgICAgIEluZGV4VHlwZSBzcmNJbmRleDsKKyAgICAgICAgSW5kZXhU
eXBlIGRzdEluZGV4OworICAgIH07CisgICAgVmVjdG9yPE1vdmVPcGVyYW5kcywgMCwgVW5zYWZl
VmVjdG9yT3ZlcmZsb3c+IG1fY29hbGVzY2luZ0NhbmRpZGF0ZXM7CisKKyAgICAvLyBMaXN0IG9m
IGV2ZXJ5IG1vdmUgaW5zdHJ1Y3Rpb24gYXNzb2NpYXRlZCB3aXRoIGEgVG1wLgorICAgIFZlY3Rv
cjxIYXNoU2V0PEluZGV4VHlwZSwgdHlwZW5hbWUgRGVmYXVsdEhhc2g8SW5kZXhUeXBlPjo6SGFz
aCwgV1RGOjpVbnNpZ25lZFdpdGhaZXJvS2V5SGFzaFRyYWl0czxJbmRleFR5cGU+Pj4gbV9tb3Zl
TGlzdDsKKworICAgIC8vIENvbG9ycy4KKyAgICBWZWN0b3I8UmVnLCAwLCBVbnNhZmVWZWN0b3JP
dmVyZmxvdz4gbV9jb2xvcmVkVG1wOworICAgIFZlY3RvcjxJbmRleFR5cGU+IG1fc3BpbGxlZFRt
cHM7CisKKyAgICAvLyBWYWx1ZXMgdGhhdCBoYXZlIGJlZW4gY29hbGVzY2VkIHdpdGggYW4gb3Ro
ZXIgdmFsdWUuCisgICAgVmVjdG9yPEluZGV4VHlwZSwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+
IG1fY29hbGVzY2VkVG1wczsKKworICAgIC8vIFRoZSBzdGFjayBvZiBUbXAgcmVtb3ZlZCBmcm9t
IHRoZSBncmFwaCBhbmQgcmVhZHkgZm9yIGNvbG9yaW5nLgorICAgIEJpdFZlY3RvciBtX2lzT25T
ZWxlY3RTdGFjazsKKyAgICBWZWN0b3I8SW5kZXhUeXBlPiBtX3NlbGVjdFN0YWNrOworCisgICAg
SW5kZXhUeXBlIG1fZnJhbWVQb2ludGVySW5kZXggeyAwIH07CisgICAgQml0VmVjdG9yIG1faW50
ZXJmZXJlc1dpdGhGcmFtZVBvaW50ZXI7CisgICAgLy8gTG93LWRlZ3JlZSwgbm9uLU1vdmUgcmVs
YXRlZC4KKyAgICBWZWN0b3I8SW5kZXhUeXBlPiBtX3NpbXBsaWZ5V29ya2xpc3Q7CisgICAgLy8g
SGlnaC1kZWdyZWUgVG1wLgorICAgIEJpdFZlY3RvciBtX3NwaWxsV29ya2xpc3Q7CisKKyAgICBi
b29sIG1faGFzU2VsZWN0ZWRTcGlsbCB7IGZhbHNlIH07CisgICAgYm9vbCBtX2hhc0NvYWxlc2Nl
ZE5vblRyaXZpYWxNb3ZlIHsgZmFsc2UgfTsKKworICAgIC8vIFRoZSBtYXBwaW5nIG9mIFRtcCB0
byB0aGVpciBhbGlhcyBmb3IgTW92ZXMgdGhhdCBhcmUgYWx3YXlzIGNvYWxlc2NpbmcgcmVnYXJk
bGVzcyBvZiBzcGlsbGluZy4KKyAgICBWZWN0b3I8SW5kZXhUeXBlLCAwLCBVbnNhZmVWZWN0b3JP
dmVyZmxvdz4gbV9jb2FsZXNjZWRUbXBzQXRTcGlsbDsKKworICAgIGNvbnN0IEhhc2hTZXQ8dW5z
aWduZWQ+JiBtX3Vuc3BpbGxhYmxlVG1wczsKKyAgICBjb25zdCBVc2VDb3VudHM8VG1wPiYgbV91
c2VDb3VudHM7CisgICAgQ29kZSYgbV9jb2RlOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIElu
ZGV4VHlwZSwgdHlwZW5hbWUgVG1wTWFwcGVyPgorY2xhc3MgQnJpZ2dzIDogcHVibGljIEFic3Ry
YWN0Q29sb3JpbmdBbGxvY2F0b3I8SW5kZXhUeXBlLCBUbXBNYXBwZXI+IHsKKyAgICB1c2luZyBC
YXNlID0gQWJzdHJhY3RDb2xvcmluZ0FsbG9jYXRvcjxJbmRleFR5cGUsIFRtcE1hcHBlcj47Citw
cm90ZWN0ZWQ6CisgICAgdXNpbmcgQmFzZTo6bV9pc09uU2VsZWN0U3RhY2s7CisgICAgdXNpbmcg
QmFzZTo6bV9zZWxlY3RTdGFjazsKKyAgICB1c2luZyBCYXNlOjptX2ZyYW1lUG9pbnRlckluZGV4
OworICAgIHVzaW5nIEJhc2U6Om1faW50ZXJmZXJlc1dpdGhGcmFtZVBvaW50ZXI7CisgICAgdXNp
bmcgQmFzZTo6bV9zaW1wbGlmeVdvcmtsaXN0OworICAgIHVzaW5nIEJhc2U6Om1fc3BpbGxXb3Jr
bGlzdDsKKyAgICB1c2luZyBCYXNlOjptX2hhc1NlbGVjdGVkU3BpbGw7CisgICAgdXNpbmcgQmFz
ZTo6bV9oYXNDb2FsZXNjZWROb25Ucml2aWFsTW92ZTsKKyAgICB1c2luZyBCYXNlOjptX2RlZ3Jl
ZXM7CisgICAgdXNpbmcgQmFzZTo6cmVnaXN0ZXJDb3VudDsKKyAgICB1c2luZyBCYXNlOjptX2Nv
YWxlc2NlZFRtcHM7CisgICAgdXNpbmcgQmFzZTo6bV9tb3ZlTGlzdDsKKyAgICB1c2luZyBCYXNl
OjptX3VzZUNvdW50czsKKyAgICB1c2luZyBCYXNlOjptX2NvYWxlc2NlZFRtcHNBdFNwaWxsOwor
ICAgIHVzaW5nIEJhc2U6Om1fc3BpbGxlZFRtcHM7CisgICAgdXNpbmcgTW92ZU9wZXJhbmRzID0g
dHlwZW5hbWUgQmFzZTo6TW92ZU9wZXJhbmRzOworICAgIHVzaW5nIEJhc2U6Om1fY29hbGVzY2lu
Z0NhbmRpZGF0ZXM7CisgICAgdXNpbmcgQmFzZTo6bV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5k
ZXg7CisgICAgdXNpbmcgQmFzZTo6bV9jb2xvcmVkVG1wOworICAgIHVzaW5nIEJhc2U6Om1fY29k
ZTsKKyAgICB1c2luZyBJbnRlcmZlcmVuY2VFZGdlID0gdHlwZW5hbWUgQmFzZTo6SW50ZXJmZXJl
bmNlRWRnZTsKKyAgICB1c2luZyBCYXNlOjptX3Vuc3BpbGxhYmxlVG1wczsKKyAgICB1c2luZyBC
YXNlOjpoYXNJbnRlcmZlcmVuY2VFZGdlOworICAgIHVzaW5nIEJhc2U6OmdldEFsaWFzOworICAg
IHVzaW5nIEJhc2U6OmFkZEVkZ2U7CisgICAgdXNpbmcgQmFzZTo6aXNQcmVjb2xvcmVkOworICAg
IHVzaW5nIEJhc2U6OmNhbkJlU2FmZWx5Q29hbGVzY2VkOworICAgIHVzaW5nIEJhc2U6OmFkZEVk
Z2VEaXN0aW5jdFdpdGhvdXREZWdyZWVDaGFuZ2U7CisgICAgdXNpbmcgQmFzZTo6Zm9yRWFjaEFk
amFjZW50OworICAgIHVzaW5nIEJhc2U6Omhhc0JlZW5TaW1wbGlmaWVkOworICAgIHVzaW5nIEJh
c2U6OmFkZFRvU3BpbGw7CisgICAgdXNpbmcgQmFzZTo6bV9pbnRlcmZlcmVuY2VFZGdlczsKKwor
cHVibGljOgorICAgIEJyaWdncyhDb2RlJiBjb2RlLCBjb25zdCBWZWN0b3I8UmVnPiYgcmVnc0lu
UHJpb3JpdHlPcmRlciwgSW5kZXhUeXBlIGxhc3RQcmVjb2xvcmVkUmVnaXN0ZXJJbmRleCwgdW5z
aWduZWQgdG1wQXJyYXlTaXplLCBjb25zdCBIYXNoU2V0PHVuc2lnbmVkPiYgdW5zcGlsbGFibGVU
bXBzLCBjb25zdCBVc2VDb3VudHM8VG1wPiYgdXNlQ291bnRzKQorICAgICAgICA6IEJhc2UoY29k
ZSwgcmVnc0luUHJpb3JpdHlPcmRlciwgbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4LCB0bXBB
cnJheVNpemUsIHVuc3BpbGxhYmxlVG1wcywgdXNlQ291bnRzKQorICAgIHsKKyAgICB9CisKKyAg
ICB2b2lkIGFsbG9jYXRlKCkKKyAgICB7CisgICAgICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOwor
CisgICAgICAgIGF1dG8gY29hbGVzY2VNb3ZlID0gWyZdICh1bnNpZ25lZCYgbW92ZSkgeworICAg
ICAgICAgICAgYm9vbCBjb2FsZXNjZWQgPSBjb2FsZXNjZShtb3ZlKTsKKyAgICAgICAgICAgIGlm
IChjb2FsZXNjZWQpIHsKKyAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAg
ICAgICAgICAvLyBXZSB3b24ndCBuZWVkIHRvIGhhbmRsZSB0aGlzIG1vdmUgaW4gdGhlIGZ1dHVy
ZSBzaW5jZSBpdCdzIGFscmVhZHkgY29hbGVzY2VkLgorICAgICAgICAgICAgICAgIG1vdmUgPSBV
SU5UX01BWDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICAvLyBXZSBmaXJz
dCBjb2FsZXNjZSB1bnRpbCB3ZSBjYW4ndCBjb2FsZXNjZSBhbnkgbW9yZS4KKyAgICAgICAgZG8g
eworICAgICAgICAgICAgY2hhbmdlZCA9IGZhbHNlOworICAgICAgICAgICAgbV93b3JrbGlzdE1v
dmVzLmZvckVhY2hNb3ZlKGNvYWxlc2NlTW92ZSk7CisgICAgICAgIH0gd2hpbGUgKGNoYW5nZWQp
OworICAgICAgICBkbyB7CisgICAgICAgICAgICBjaGFuZ2VkID0gZmFsc2U7CisgICAgICAgICAg
ICBtX3dvcmtsaXN0TW92ZXMuZm9yRWFjaExvd1ByaW9yaXR5TW92ZShjb2FsZXNjZU1vdmUpOwor
ICAgICAgICB9IHdoaWxlIChjaGFuZ2VkKTsKKworICAgICAgICAvLyBUaGVuIHdlIGNyZWF0ZSBv
dXIgc2VsZWN0IHN0YWNrLiBUaGUgaW52YXJpYW50IHdlIHN0YXJ0IHdpdGggaGVyZSBpcyB0aGF0
IG5vZGVzIGluCisgICAgICAgIC8vIHRoZSBpbnRlcmZlcmVuY2UgZ3JhcGggd2l0aCBkZWdyZWUg
Pj0gayBhcmUgb24gdGhlIHNwaWxsIGxpc3QuIE5vZGVzIHdpdGggZGVncmVlIDwgaworICAgICAg
ICAvLyBhcmUgb24gdGhlIHNpbXBsaWZ5IHdvcmtsaXN0LiBBIG5vZGUgY2FuIG1vdmUgZnJvbSB0
aGUgc3BpbGwgbGlzdCB0byB0aGUgc2ltcGxpZnkKKyAgICAgICAgLy8gbGlzdCAoYnV0IG5vdCB0
aGUgb3RoZXIgd2F5IGFyb3VuZCwgbm90ZSB0aGF0IHRoaXMgaXMgZGlmZmVyZW50IHRoYW4gSVJD
IGJlY2F1c2UgSVJDCisgICAgICAgIC8vIHJ1bnMgdGhpcyB3aGlsZSBjb2FsZXNjaW5nLCBidXQg
d2UgZG8gYWxsIG91ciBjb2FsZXNjaW5nIGJlZm9yZSB0aGlzKS4gT25jZSBhIG5vZGUgaXMKKyAg
ICAgICAgLy8gYWRkZWQgdG8gdGhlIHNlbGVjdCBzdGFjaywgaXQncyBub3Qgb24gZWl0aGVyIGxp
c3QsIGJ1dCBvbmx5IG9uIHRoZSBzZWxlY3Qgc3RhY2suCisgICAgICAgIC8vIE9uY2Ugb24gdGhl
IHNlbGVjdCBzdGFjaywgbG9naWNhbGx5LCBpdCdzIG5vIGxvbmdlciBpbiB0aGUgaW50ZXJmZXJl
bmNlIGdyYXBoLgorICAgICAgICBhdXRvIGFzc2VydEludmFyaWFudHMgPSBbJl0gKCkgeworICAg
ICAgICAgICAgaWYgKEFTU0VSVF9ESVNBQkxFRCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisK
KyAgICAgICAgICAgIEluZGV4VHlwZSBmaXJzdE5vblJlZ0luZGV4ID0gbV9sYXN0UHJlY29sb3Jl
ZFJlZ2lzdGVySW5kZXggKyAxOworICAgICAgICAgICAgdW5zaWduZWQgcmVnaXN0ZXJDb3VudCA9
IHRoaXMtPnJlZ2lzdGVyQ291bnQoKTsKKyAgICAgICAgICAgIGZvciAoSW5kZXhUeXBlIGkgPSBm
aXJzdE5vblJlZ0luZGV4OyBpIDwgbV9kZWdyZWVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAg
ICAgICAgaWYgKGdldEFsaWFzKGkpICE9IGkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVl
OworICAgICAgICAgICAgICAgIGlmIChtX2lzT25TZWxlY3RTdGFjay5jb250YWlucyhpKSkgewor
ICAgICAgICAgICAgICAgICAgICBBU1NFUlQoIW1fc2ltcGxpZnlXb3JrbGlzdC5jb250YWlucyhp
KSAmJiAhbV9zcGlsbFdvcmtsaXN0LmNvbnRhaW5zKGkpKTsKKyAgICAgICAgICAgICAgICAgICAg
Y29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHVuc2lnbmVkIGRl
Z3JlZSA9IG1fZGVncmVlc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAoZGVncmVlID49IHJlZ2lz
dGVyQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgQVNTRVJUKG1fdW5zcGlsbGFibGVUbXBz
LmNvbnRhaW5zKGkpIHx8IG1fc3BpbGxXb3JrbGlzdC5jb250YWlucyhpKSk7CisgICAgICAgICAg
ICAgICAgICAgIEFTU0VSVCghbV9zaW1wbGlmeVdvcmtsaXN0LmNvbnRhaW5zKGkpKTsKKyAgICAg
ICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
ICAgIEFTU0VSVChtX3NpbXBsaWZ5V29ya2xpc3QuY29udGFpbnMoaSkpOworICAgICAgICAgICAg
fQorICAgICAgICB9OworCisgICAgICAgIG1ha2VJbml0aWFsV29ya2xpc3QoKTsKKyAgICAgICAg
YXNzZXJ0SW52YXJpYW50cygpOworICAgICAgICBkbyB7CisgICAgICAgICAgICBjaGFuZ2VkID0g
ZmFsc2U7CisKKyAgICAgICAgICAgIHdoaWxlIChtX3NpbXBsaWZ5V29ya2xpc3Quc2l6ZSgpKSB7
CisgICAgICAgICAgICAgICAgc2ltcGxpZnkoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRJbnZh
cmlhbnRzKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtX3NwaWxsV29ya2xp
c3QuYml0Q291bnQoKSkgeworICAgICAgICAgICAgICAgIHNlbGVjdFNwaWxsKCk7CisgICAgICAg
ICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgQVNTRVJUKG1fc2ltcGxp
ZnlXb3JrbGlzdC5zaXplKCkgPT0gMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUg
KGNoYW5nZWQpOworCisgICAgICAgIGlmICghQVNTRVJUX0RJU0FCTEVEKSB7CisgICAgICAgICAg
ICBBU1NFUlQoIW1fc2ltcGxpZnlXb3JrbGlzdC5zaXplKCkpOworICAgICAgICAgICAgQVNTRVJU
KCFtX3NwaWxsV29ya2xpc3QuYml0Q291bnQoKSk7CisgICAgICAgICAgICBJbmRleFR5cGUgZmly
c3ROb25SZWdJbmRleCA9IG1fbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4ICsgMTsKKyAgICAg
ICAgICAgIGZvciAoSW5kZXhUeXBlIGkgPSBmaXJzdE5vblJlZ0luZGV4OyBpIDwgbV9kZWdyZWVz
LnNpemUoKTsgKytpKQorICAgICAgICAgICAgICAgIEFTU0VSVChoYXNCZWVuU2ltcGxpZmllZChp
KSk7CisgICAgICAgIH0KKworICAgICAgICBhc3NpZ25Db2xvcnMoKTsKKyAgICB9CisKK3Byb3Rl
Y3RlZDoKKyAgICAKKyAgICBib29sIGNvYWxlc2NlKHVuc2lnbmVkJiBtb3ZlSW5kZXgpCisgICAg
eworICAgICAgICBjb25zdCBNb3ZlT3BlcmFuZHMmIG1vdmVPcGVyYW5kcyA9IG1fY29hbGVzY2lu
Z0NhbmRpZGF0ZXNbbW92ZUluZGV4XTsKKyAgICAgICAgSW5kZXhUeXBlIHUgPSBnZXRBbGlhcyht
b3ZlT3BlcmFuZHMuc3JjSW5kZXgpOworICAgICAgICBJbmRleFR5cGUgdiA9IGdldEFsaWFzKG1v
dmVPcGVyYW5kcy5kc3RJbmRleCk7CisKKyAgICAgICAgaWYgKGlzUHJlY29sb3JlZCh2KSkKKyAg
ICAgICAgICAgIHN0ZDo6c3dhcCh1LCB2KTsKKworICAgICAgICBpZiAodHJhY2VEZWJ1ZykKKyAg
ICAgICAgICAgIGRhdGFMb2coIkNvYWxlc2NpbmcgbW92ZSBhdCBpbmRleCAiLCBtb3ZlSW5kZXgs
ICIgdSA9ICIsIFRtcE1hcHBlcjo6dG1wRnJvbUFic29sdXRlSW5kZXgodSksICIgdiA9ICIsIFRt
cE1hcHBlcjo6dG1wRnJvbUFic29sdXRlSW5kZXgodiksICIgICAgIik7CisKKyAgICAgICAgaWYg
KHUgPT0gdikgeworICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpCisgICAgICAgICAgICAgICAg
ZGF0YUxvZygiQWxyZWFkeSBDb2FsZXNjZWQuIFRoZXkncmUgZXF1YWwuXG4iKTsKKyAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc1ByZWNvbG9yZWQo
dikKKyAgICAgICAgICAgIHx8IGhhc0ludGVyZmVyZW5jZUVkZ2UoSW50ZXJmZXJlbmNlRWRnZSh1
LCB2KSkKKyAgICAgICAgICAgIHx8ICh1ID09IG1fZnJhbWVQb2ludGVySW5kZXggJiYgbV9pbnRl
cmZlcmVzV2l0aEZyYW1lUG9pbnRlci5xdWlja0dldCh2KSkpIHsKKworICAgICAgICAgICAgLy8g
Tm8gbmVlZCB0byBldmVyIGNvbnNpZGVyIHRoaXMgbW92ZSBhZ2FpbiBpZiBpdCBpbnRlcmZlcmVz
LgorICAgICAgICAgICAgLy8gTm8gY29hbGVzY2luZyB3aWxsIHJlbW92ZSB0aGUgaW50ZXJmZXJl
bmNlLgorICAgICAgICAgICAgbW92ZUluZGV4ID0gVUlOVF9NQVg7CisKKyAgICAgICAgICAgIGlm
ICghQVNTRVJUX0RJU0FCTEVEKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzUHJlY29sb3JlZCh2
KSkKKyAgICAgICAgICAgICAgICAgICAgQVNTRVJUKGlzUHJlY29sb3JlZCh1KSk7CisgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQorICAgICAgICAgICAgICAgIGRh
dGFMb2coIkNvbnN0cmFpbmVkXG4iKTsKKworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoY2FuQmVTYWZlbHlDb2FsZXNjZWQodSwgdikp
IHsKKyAgICAgICAgICAgIGNvbWJpbmUodSwgdik7CisgICAgICAgICAgICBtX2hhc0NvYWxlc2Nl
ZE5vblRyaXZpYWxNb3ZlID0gdHJ1ZTsKKworICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpCisg
ICAgICAgICAgICAgICAgZGF0YUxvZygiICAgIFNhZmUgQ29hbGVzY2luZ1xuIik7CisgICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0cmFjZURlYnVnKQor
ICAgICAgICAgICAgZGF0YUxvZygiICAgIEZhaWxlZCBjb2FsZXNjaW5nLlxuIik7CisKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZvaWQgY29tYmluZShJbmRleFR5cGUgdSwg
SW5kZXhUeXBlIHYpCisgICAgeworICAgICAgICBBU1NFUlQoIW1fY29hbGVzY2VkVG1wc1t2XSk7
CisgICAgICAgIG1fY29hbGVzY2VkVG1wc1t2XSA9IHU7CisKKyAgICAgICAgYXV0byYgdk1vdmVz
ID0gbV9tb3ZlTGlzdFt2XTsKKyAgICAgICAgbV9tb3ZlTGlzdFt1XS5hZGQodk1vdmVzLmJlZ2lu
KCksIHZNb3Zlcy5lbmQoKSk7CisKKyAgICAgICAgZm9yRWFjaEFkamFjZW50KHYsIFt0aGlzLCB1
XSAoSW5kZXhUeXBlIGFkamFjZW50VG1wSW5kZXgpIHsKKyAgICAgICAgICAgIGlmIChhZGRFZGdl
RGlzdGluY3RXaXRob3V0RGVncmVlQ2hhbmdlKGFkamFjZW50VG1wSW5kZXgsIHUpKSB7CisgICAg
ICAgICAgICAgICAgLy8gSWYgd2UgYWRkZWQgYSBuZXcgZWRnZSBiZXR3ZWVuIHRoZSBhZGphY2Vu
dFRtcCBhbmQgdSwgaXQgcmVwbGFjZXMgdGhlIGVkZ2UKKyAgICAgICAgICAgICAgICAvLyB0aGF0
IGV4aXN0ZWQgd2l0aCB2LgorICAgICAgICAgICAgICAgIC8vIFRoZSBkZWdyZWUgb2YgYWRqYWNl
bnRUbXAgcmVtYWlucyB0aGUgc2FtZSBzaW5jZSB0aGUgZWRnZSBqdXN0IGNoYW5nZWQgZnJvbSB1
IHRvIHYuCisgICAgICAgICAgICAgICAgLy8gQWxsIHdlIG5lZWQgdG8gZG8gaXMgdXBkYXRlIHRo
ZSBkZWdyZWUgb2YgdS4KKyAgICAgICAgICAgICAgICBpZiAoIWlzUHJlY29sb3JlZCh1KSkKKyAg
ICAgICAgICAgICAgICAgICAgbV9kZWdyZWVzW3VdKys7CisgICAgICAgICAgICB9IGVsc2Ugewor
ICAgICAgICAgICAgICAgIC8vIElmIHdlIGFscmVhZHkgaGFkIGFuIGVkZ2UgYmV0d2VlbiB0aGUg
YWRqYWNlbnRUbXAgYW5kIHUsIHRoZSBkZWdyZWUgb2YgdQorICAgICAgICAgICAgICAgIC8vIGlz
IGFscmVhZHkgY29ycmVjdC4gVGhlIGRlZ3JlZSBvZiB0aGUgYWRqYWNlbnRUbXAgZGVjcmVhc2Vz
IHNpbmNlIHRoZSBlZGdlCisgICAgICAgICAgICAgICAgLy8gd2l0aCB2IGlzIG5vIGxvbmdlciBy
ZWxldmFudCAod2UgY2FuIHRoaW5rIG9mIGl0IGFzIG1lcmdlZCB3aXRoIHRoZSBlZGdlIHdpdGgg
dSkuCisgICAgICAgICAgICAgICAgZGVjcmVtZW50RGVncmVlKGFkamFjZW50VG1wSW5kZXgpOwor
ICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBpZiAobV9mcmFtZVBvaW50ZXJJ
bmRleCAmJiBtX2ludGVyZmVyZXNXaXRoRnJhbWVQb2ludGVyLnF1aWNrR2V0KHYpKQorICAgICAg
ICAgICAgbV9pbnRlcmZlcmVzV2l0aEZyYW1lUG9pbnRlci5xdWlja1NldCh1KTsKKyAgICB9CisK
KworICAgIHZvaWQgbWFrZUluaXRpYWxXb3JrbGlzdCgpCisgICAgeworICAgICAgICBtX3NpbXBs
aWZ5V29ya2xpc3QuY2xlYXIoKTsKKyAgICAgICAgbV9zcGlsbFdvcmtsaXN0LmNsZWFyQWxsKCk7
CisKKyAgICAgICAgaWYgKHRyYWNlRGVidWcpCisgICAgICAgICAgICBkYXRhTG9nTG4oIi0tLS0t
LS0tLS0tLS0tLS0tLVxuTWFraW5nIGluaXRpYWwgd29ya2xpc3QiKTsKKworICAgICAgICBJbmRl
eFR5cGUgZmlyc3ROb25SZWdJbmRleCA9IG1fbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4ICsg
MTsKKyAgICAgICAgdW5zaWduZWQgcmVnaXN0ZXJDb3VudCA9IHRoaXMtPnJlZ2lzdGVyQ291bnQo
KTsKKyAgICAgICAgZm9yIChJbmRleFR5cGUgaSA9IGZpcnN0Tm9uUmVnSW5kZXg7IGkgPCBtX2Rl
Z3JlZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIEFTU0VSVCghaXNQcmVjb2xvcmVkKGkp
KTsKKyAgICAgICAgICAgIGlmIChoYXNCZWVuU2ltcGxpZmllZChpKSkKKyAgICAgICAgICAgICAg
ICBjb250aW51ZTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGRlZ3JlZSA9IG1fZGVncmVlc1tpXTsK
KyAgICAgICAgICAgIGlmIChkZWdyZWUgPCByZWdpc3RlckNvdW50KSB7CisgICAgICAgICAgICAg
ICAgaWYgKHRyYWNlRGVidWcpCisgICAgICAgICAgICAgICAgICAgIGRhdGFMb2dMbigiQWRkaW5n
ICIsIFRtcE1hcHBlcjo6dG1wRnJvbUFic29sdXRlSW5kZXgoaSksICIgdG8gc2ltcGxpZnkgd29y
a2xpc3QiKTsKKyAgICAgICAgICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuYXBwZW5kKGkpOwor
ICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKKyAg
ICAgICAgICAgICAgICAgICAgZGF0YUxvZ0xuKCJBZGRpbmcgIiwgVG1wTWFwcGVyOjp0bXBGcm9t
QWJzb2x1dGVJbmRleChpKSwgIiB0byBzcGlsbCB3b3JrbGlzdCIpOworICAgICAgICAgICAgICAg
IGFkZFRvU3BpbGwoaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAv
LyBMb3ctZGVncmVlIHZlcnRleCBjYW4gYWx3YXlzIGJlIGNvbG9yZWQ6IGp1c3QgcGljayBhbnkg
b2YgdGhlIGNvbG9yIHRha2VuIGJ5IGFueQorICAgIC8vIG90aGVyIGFkamFjZW50IHZlcmljZXMu
CisgICAgLy8gVGhlICJTaW1wbGlmeSIgcGhhc2UgdGFrZXMgYSBsb3ctZGVncmVlIG91dCBvZiB0
aGUgaW50ZXJmZXJlbmNlIGdyYXBoIHRvIHNpbXBsaWZ5IGl0LgorICAgIHZvaWQgc2ltcGxpZnko
KQorICAgIHsKKyAgICAgICAgSW5kZXhUeXBlIGxhc3RJbmRleCA9IG1fc2ltcGxpZnlXb3JrbGlz
dC50YWtlTGFzdCgpOworCisgICAgICAgIEFTU0VSVCghbV9zZWxlY3RTdGFjay5jb250YWlucyhs
YXN0SW5kZXgpKTsKKyAgICAgICAgQVNTRVJUKCFtX2lzT25TZWxlY3RTdGFjay5nZXQobGFzdElu
ZGV4KSk7CisgICAgICAgIEFTU0VSVCghbV9zcGlsbFdvcmtsaXN0LmNvbnRhaW5zKGxhc3RJbmRl
eCkpOworCisgICAgICAgIG1fc2VsZWN0U3RhY2suYXBwZW5kKGxhc3RJbmRleCk7CisgICAgICAg
IG1faXNPblNlbGVjdFN0YWNrLnF1aWNrU2V0KGxhc3RJbmRleCk7CisKKyAgICAgICAgaWYgKHRy
YWNlRGVidWcpCisgICAgICAgICAgICBkYXRhTG9nTG4oIlNpbXBsaWZ5aW5nICIsIGxhc3RJbmRl
eCwgIiBieSBhZGRpbmcgaXQgdG8gc2VsZWN0IHN0YWNrIik7CisKKyAgICAgICAgZm9yRWFjaEFk
amFjZW50KGxhc3RJbmRleCwgW3RoaXNdKEluZGV4VHlwZSBhZGphY2VudFRtcEluZGV4KSB7Cisg
ICAgICAgICAgICBkZWNyZW1lbnREZWdyZWVJblNpbXBsaWZpY2F0aW9uKGFkamFjZW50VG1wSW5k
ZXgpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICB2b2lkIHNlbGVjdFNwaWxsKCkKKyAgICB7
CisgICAgICAgIEluZGV4VHlwZSB2aWN0aW1JbmRleCA9IEJhc2U6OnNlbGVjdFNwaWxsKCk7Cisg
ICAgICAgIG1fc3BpbGxXb3JrbGlzdC5xdWlja0NsZWFyKHZpY3RpbUluZGV4KTsKKyAgICAgICAg
bV9zaW1wbGlmeVdvcmtsaXN0LmFwcGVuZCh2aWN0aW1JbmRleCk7CisgICAgfQorCisgICAgc3Ry
dWN0IE1vdmVTZXQgeworICAgICAgICB1bnNpZ25lZCBhZGRNb3ZlKCkKKyAgICAgICAgeworICAg
ICAgICAgICAgQVNTRVJUKG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5pc0VtcHR5KCkpOworCisgICAg
ICAgICAgICB1bnNpZ25lZCBuZXh0SW5kZXggPSBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdCsrOworICAg
ICAgICAgICAgbV9tb3ZlTGlzdC5hcHBlbmQobmV4dEluZGV4KTsKKyAgICAgICAgICAgIHJldHVy
biBuZXh0SW5kZXg7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHN0YXJ0QWRkaW5nTG93UHJp
b3JpdHlNb3ZlcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFTU0VSVChtX2xvd1ByaW9yaXR5
TW92ZUxpc3QuaXNFbXB0eSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHVuc2lnbmVkIGFkZExv
d1ByaW9yaXR5TW92ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIG5leHRJbmRl
eCA9IG1fcG9zaXRpb25Jbk1vdmVMaXN0Kys7CisgICAgICAgICAgICBtX2xvd1ByaW9yaXR5TW92
ZUxpc3QuYXBwZW5kKG5leHRJbmRleCk7CisKKyAgICAgICAgICAgIHJldHVybiBuZXh0SW5kZXg7
CisgICAgICAgIH0KKworICAgICAgICAvLyBXZSB1c2UgcmVmZXJlbmNlcyB0byBtb3ZlcyBoZXJl
IGJlY2F1c2UgdGhlIGZ1bmN0aW9uCisgICAgICAgIC8vIG1heSBkbyBjb2FsZXNjaW5nLCBpbmRp
Y2F0aW5nIGl0IGRvZXNuJ3QgbmVlZCB0byBzZWUKKyAgICAgICAgLy8gdGhlIG1vdmUgYWdhaW4u
CisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbj4KKyAgICAgICAgdm9pZCBmb3JF
YWNoTW92ZShGdW5jdGlvbiBmdW5jdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICh1
bnNpZ25lZCYgbW92ZSA6IG1fbW92ZUxpc3QpIHsKKyAgICAgICAgICAgICAgICBpZiAobW92ZSAh
PSBVSU5UX01BWCkKKyAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24obW92ZSk7CisgICAgICAg
ICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24+
CisgICAgICAgIHZvaWQgZm9yRWFjaExvd1ByaW9yaXR5TW92ZShGdW5jdGlvbiBmdW5jdGlvbikK
KyAgICAgICAgeworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCYgbW92ZSA6IG1fbG93UHJpb3Jp
dHlNb3ZlTGlzdCkgeworICAgICAgICAgICAgICAgIGlmIChtb3ZlICE9IFVJTlRfTUFYKQorICAg
ICAgICAgICAgICAgICAgICBmdW5jdGlvbihtb3ZlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
fQorCisgICAgICAgIHZvaWQgY2xlYXIoKQorICAgICAgICB7CisgICAgICAgICAgICBtX3Bvc2l0
aW9uSW5Nb3ZlTGlzdCA9IDA7CisgICAgICAgICAgICBtX21vdmVMaXN0LmNsZWFyKCk7CisgICAg
ICAgICAgICBtX2xvd1ByaW9yaXR5TW92ZUxpc3QuY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAg
cHJpdmF0ZToKKyAgICAgICAgdW5zaWduZWQgbV9wb3NpdGlvbkluTW92ZUxpc3Q7CisgICAgICAg
IFZlY3Rvcjx1bnNpZ25lZCwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fbW92ZUxpc3Q7Cisg
ICAgICAgIFZlY3Rvcjx1bnNpZ25lZCwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fbG93UHJp
b3JpdHlNb3ZlTGlzdDsKKyAgICB9OworCisgICAgdm9pZCBkZWNyZW1lbnREZWdyZWUoSW5kZXhU
eXBlIHRtcEluZGV4KQorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fZGVncmVlc1t0bXBJbmRleF0p
OworICAgICAgICAtLW1fZGVncmVlc1t0bXBJbmRleF07CisgICAgfQorCisgICAgdm9pZCBkZWNy
ZW1lbnREZWdyZWVJblNpbXBsaWZpY2F0aW9uKEluZGV4VHlwZSB0bXBJbmRleCkKKyAgICB7Cisg
ICAgICAgIEFTU0VSVChtX2RlZ3JlZXNbdG1wSW5kZXhdKTsKKyAgICAgICAgdW5zaWduZWQgb2xk
RGVncmVlID0gbV9kZWdyZWVzW3RtcEluZGV4XS0tOworCisgICAgICAgIGlmIChvbGREZWdyZWUg
PT0gcmVnaXN0ZXJDb3VudCgpKSB7CisgICAgICAgICAgICBBU1NFUlQobV9kZWdyZWVzW3RtcElu
ZGV4XSA8IHJlZ2lzdGVyQ291bnQoKSk7CisgICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKKyAg
ICAgICAgICAgICAgICBkYXRhTG9nTG4oIk1vdmluZyB0bXAgIiwgdG1wSW5kZXgsICIgZnJvbSBz
cGlsbCBsaXN0IHRvIHNpbXBsaWZ5IGxpc3QgYmVjYXVzZSBpdCdzIGRlZ3JlZSBpcyBub3cgbGVz
cyB0aGFuIGsiKTsKKworICAgICAgICAgICAgaWYgKCFBU1NFUlRfRElTQUJMRUQpCisgICAgICAg
ICAgICAgICAgQVNTRVJUKG1fdW5zcGlsbGFibGVUbXBzLmNvbnRhaW5zKHRtcEluZGV4KSB8fCBt
X3NwaWxsV29ya2xpc3QuY29udGFpbnModG1wSW5kZXgpKTsKKyAgICAgICAgICAgIG1fc3BpbGxX
b3JrbGlzdC5xdWlja0NsZWFyKHRtcEluZGV4KTsKKworICAgICAgICAgICAgQVNTRVJUKCFtX3Np
bXBsaWZ5V29ya2xpc3QuY29udGFpbnModG1wSW5kZXgpKTsKKyAgICAgICAgICAgIG1fc2ltcGxp
ZnlXb3JrbGlzdC5hcHBlbmQodG1wSW5kZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9p
ZCBhc3NpZ25Db2xvcnMoKQorICAgIHsKKyAgICAgICAgbV93b3JrbGlzdE1vdmVzLmNsZWFyKCk7
CisgICAgICAgIEJhc2U6OmFzc2lnbkNvbG9ycygpOworICAgIH0KKworICAgIC8vIFNldCBvZiAi
bW92ZSIgZW5hYmxlZCBmb3IgcG9zc2libGUgY29hbGVzY2luZy4KKyAgICBNb3ZlU2V0IG1fd29y
a2xpc3RNb3ZlczsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbmRleFR5cGUsIHR5cGVuYW1l
IFRtcE1hcHBlcj4KK2NsYXNzIElSQyA6IHB1YmxpYyBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9y
PEluZGV4VHlwZSwgVG1wTWFwcGVyPiB7CisgICAgdXNpbmcgQmFzZSA9IEFic3RyYWN0Q29sb3Jp
bmdBbGxvY2F0b3I8SW5kZXhUeXBlLCBUbXBNYXBwZXI+OworcHJvdGVjdGVkOgorICAgIHVzaW5n
IEJhc2U6Om1faXNPblNlbGVjdFN0YWNrOworICAgIHVzaW5nIEJhc2U6Om1fc2VsZWN0U3RhY2s7
CisgICAgdXNpbmcgQmFzZTo6bV9mcmFtZVBvaW50ZXJJbmRleDsKKyAgICB1c2luZyBCYXNlOjpt
X2ludGVyZmVyZXNXaXRoRnJhbWVQb2ludGVyOworICAgIHVzaW5nIEJhc2U6Om1fc2ltcGxpZnlX
b3JrbGlzdDsKKyAgICB1c2luZyBCYXNlOjptX3NwaWxsV29ya2xpc3Q7CisgICAgdXNpbmcgQmFz
ZTo6bV9oYXNTZWxlY3RlZFNwaWxsOworICAgIHVzaW5nIEJhc2U6Om1faGFzQ29hbGVzY2VkTm9u
VHJpdmlhbE1vdmU7CisgICAgdXNpbmcgQmFzZTo6bV9kZWdyZWVzOworICAgIHVzaW5nIEJhc2U6
OnJlZ2lzdGVyQ291bnQ7CisgICAgdXNpbmcgQmFzZTo6bV9jb2FsZXNjZWRUbXBzOworICAgIHVz
aW5nIEJhc2U6Om1fbW92ZUxpc3Q7CisgICAgdXNpbmcgQmFzZTo6bV91c2VDb3VudHM7CisgICAg
dXNpbmcgQmFzZTo6bV9jb2FsZXNjZWRUbXBzQXRTcGlsbDsKKyAgICB1c2luZyBCYXNlOjptX3Nw
aWxsZWRUbXBzOworICAgIHVzaW5nIE1vdmVPcGVyYW5kcyA9IHR5cGVuYW1lIEJhc2U6Ok1vdmVP
cGVyYW5kczsKKyAgICB1c2luZyBCYXNlOjptX2NvYWxlc2NpbmdDYW5kaWRhdGVzOworICAgIHVz
aW5nIEJhc2U6Om1fbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4OworICAgIHVzaW5nIEJhc2U6
Om1fY29sb3JlZFRtcDsKKyAgICB1c2luZyBCYXNlOjptX2NvZGU7CisgICAgdXNpbmcgSW50ZXJm
ZXJlbmNlRWRnZSA9IHR5cGVuYW1lIEJhc2U6OkludGVyZmVyZW5jZUVkZ2U7CisgICAgdXNpbmcg
QmFzZTo6bV91bnNwaWxsYWJsZVRtcHM7CisgICAgdXNpbmcgQmFzZTo6aGFzSW50ZXJmZXJlbmNl
RWRnZTsKKyAgICB1c2luZyBCYXNlOjpnZXRBbGlhczsKKyAgICB1c2luZyBCYXNlOjphZGRFZGdl
OworICAgIHVzaW5nIEJhc2U6OmlzUHJlY29sb3JlZDsKKyAgICB1c2luZyBCYXNlOjpjYW5CZVNh
ZmVseUNvYWxlc2NlZDsKKyAgICB1c2luZyBCYXNlOjphZGRFZGdlRGlzdGluY3RXaXRob3V0RGVn
cmVlQ2hhbmdlOworICAgIHVzaW5nIEJhc2U6OmZvckVhY2hBZGphY2VudDsKKyAgICB1c2luZyBC
YXNlOjpoYXNCZWVuU2ltcGxpZmllZDsKKyAgICB1c2luZyBCYXNlOjphZGRUb1NwaWxsOworICAg
IHVzaW5nIEJhc2U6Om1faW50ZXJmZXJlbmNlRWRnZXM7CisgICAgdXNpbmcgQmFzZTo6bV9hZGph
Y2VuY3lMaXN0OworICAgIHVzaW5nIEJhc2U6OmR1bXBJbnRlcmZlcmVuY2VHcmFwaEluRG90Owor
CitwdWJsaWM6CisgICAgSVJDKENvZGUmIGNvZGUsIGNvbnN0IFZlY3RvcjxSZWc+JiByZWdzSW5Q
cmlvcml0eU9yZGVyLCBJbmRleFR5cGUgbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4LCB1bnNp
Z25lZCB0bXBBcnJheVNpemUsIGNvbnN0IEhhc2hTZXQ8dW5zaWduZWQ+JiB1bnNwaWxsYWJsZVRt
cHMsIGNvbnN0IFVzZUNvdW50czxUbXA+JiB1c2VDb3VudHMpCisgICAgICAgIDogQmFzZShjb2Rl
LCByZWdzSW5Qcmlvcml0eU9yZGVyLCBsYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXgsIHRtcEFy
cmF5U2l6ZSwgdW5zcGlsbGFibGVUbXBzLCB1c2VDb3VudHMpCisgICAgeworICAgIH0KKworICAg
IHZvaWQgYWxsb2NhdGUoKQorICAgIHsKKyAgICAgICAgbV9hY3RpdmVNb3Zlcy5lbnN1cmVTaXpl
KG1fd29ya2xpc3RNb3Zlcy50b3RhbE51bWJlck9mTW92ZXMoKSk7CisgICAgICAgIEFTU0VSVF9X
SVRIX01FU1NBR0UobV9hY3RpdmVNb3Zlcy5zaXplKCkgPj0gbV9jb2FsZXNjaW5nQ2FuZGlkYXRl
cy5zaXplKCksICJUaGUgYWN0aXZlTW92ZSBzZXQgc2hvdWxkIGJlIGJpZyBlbm91Z2ggZm9yIHRo
ZSBxdWljayBvcGVyYXRpb25zIG9mIEJpdFZlY3Rvci4iKTsKKworICAgICAgICBtYWtlV29ya0xp
c3QoKTsKKworICAgICAgICBpZiAoZGVidWcpIHsKKyAgICAgICAgICAgIGR1bXBJbnRlcmZlcmVu
Y2VHcmFwaEluRG90KFdURjo6ZGF0YUZpbGUoKSk7CisgICAgICAgICAgICBkYXRhTG9nKCJDb2Fs
ZXNjaW5nIGNhbmRpZGF0ZXM6XG4iKTsKKyAgICAgICAgICAgIGZvciAoTW92ZU9wZXJhbmRzJiBt
b3ZlT3AgOiBtX2NvYWxlc2NpbmdDYW5kaWRhdGVzKSB7CisgICAgICAgICAgICAgICAgZGF0YUxv
ZygiICAgICIsIFRtcE1hcHBlcjo6dG1wRnJvbUFic29sdXRlSW5kZXgobW92ZU9wLnNyY0luZGV4
KSwKKyAgICAgICAgICAgICAgICAgICAgIiAtPiAiLCBUbXBNYXBwZXI6OnRtcEZyb21BYnNvbHV0
ZUluZGV4KG1vdmVPcC5kc3RJbmRleCksICJcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAg
ICAgZGF0YUxvZygiSW5pdGlhbCB3b3JrIGxpc3RcbiIpOworICAgICAgICAgICAgZHVtcFdvcmtM
aXN0cyhXVEY6OmRhdGFGaWxlKCkpOworICAgICAgICB9CisKKyAgICAgICAgZG8geworICAgICAg
ICAgICAgaWYgKHRyYWNlRGVidWcpIHsKKyAgICAgICAgICAgICAgICBkYXRhTG9nKCJCZWZvcmUg
R3JhcGggc2ltcGxpZmljYXRpb24gaXRlcmF0aW9uXG4iKTsKKyAgICAgICAgICAgICAgICBkdW1w
V29ya0xpc3RzKFdURjo6ZGF0YUZpbGUoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
IGlmICghbV9zaW1wbGlmeVdvcmtsaXN0LmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICBzaW1w
bGlmeSgpOworICAgICAgICAgICAgZWxzZSBpZiAoIW1fd29ya2xpc3RNb3Zlcy5pc0VtcHR5KCkp
CisgICAgICAgICAgICAgICAgY29hbGVzY2UoKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCFtX2Zy
ZWV6ZVdvcmtsaXN0LmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICBmcmVlemUoKTsKKyAgICAg
ICAgICAgIGVsc2UgaWYgKG1fc3BpbGxXb3JrbGlzdC5iaXRDb3VudCgpKQorICAgICAgICAgICAg
ICAgIHNlbGVjdFNwaWxsKCk7CisKKyAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKSB7CisgICAg
ICAgICAgICAgICAgZGF0YUxvZygiQWZ0ZXIgR3JhcGggc2ltcGxpZmljYXRpb24gaXRlcmF0aW9u
XG4iKTsKKyAgICAgICAgICAgICAgICBkdW1wV29ya0xpc3RzKFdURjo6ZGF0YUZpbGUoKSk7Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKCFtX3NpbXBsaWZ5V29ya2xpc3QuaXNFbXB0
eSgpIHx8ICFtX3dvcmtsaXN0TW92ZXMuaXNFbXB0eSgpIHx8ICFtX2ZyZWV6ZVdvcmtsaXN0Lmlz
RW1wdHkoKSB8fCBtX3NwaWxsV29ya2xpc3QuYml0Q291bnQoKSk7CisKKyAgICAgICAgYXNzaWdu
Q29sb3JzKCk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisKKyAgICB2b2lkIG1ha2VXb3JrTGlzdCgp
CisgICAgeworICAgICAgICBJbmRleFR5cGUgZmlyc3ROb25SZWdJbmRleCA9IG1fbGFzdFByZWNv
bG9yZWRSZWdpc3RlckluZGV4ICsgMTsKKyAgICAgICAgZm9yIChJbmRleFR5cGUgaSA9IGZpcnN0
Tm9uUmVnSW5kZXg7IGkgPCBtX2RlZ3JlZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIHVu
c2lnbmVkIGRlZ3JlZSA9IG1fZGVncmVlc1tpXTsKKyAgICAgICAgICAgIGlmIChkZWdyZWUgPj0g
cmVnaXN0ZXJDb3VudCgpKQorICAgICAgICAgICAgICAgIGFkZFRvU3BpbGwoaSk7CisgICAgICAg
ICAgICBlbHNlIGlmICghbV9tb3ZlTGlzdFtpXS5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAg
bV9mcmVlemVXb3JrbGlzdC5hZGQoaSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAg
ICAgbV9zaW1wbGlmeVdvcmtsaXN0LmFwcGVuZChpKTsKKyAgICAgICAgfQorICAgIH0KKworICAg
IC8vIExvdy1kZWdyZWUgdmVydGV4IGNhbiBhbHdheXMgYmUgY29sb3JlZDoganVzdCBwaWNrIGFu
eSBvZiB0aGUgY29sb3IgdGFrZW4gYnkgYW55CisgICAgLy8gb3RoZXIgYWRqYWNlbnQgdmVyaWNl
cy4KKyAgICAvLyBUaGUgIlNpbXBsaWZ5IiBwaGFzZSB0YWtlcyBhIGxvdy1kZWdyZWUgb3V0IG9m
IHRoZSBpbnRlcmZlcmVuY2UgZ3JhcGggdG8gc2ltcGxpZnkgaXQuCisgICAgdm9pZCBzaW1wbGlm
eSgpCisgICAgeworICAgICAgICBJbmRleFR5cGUgbGFzdEluZGV4ID0gbV9zaW1wbGlmeVdvcmts
aXN0LnRha2VMYXN0KCk7CisKKyAgICAgICAgQVNTRVJUKCFtX3NlbGVjdFN0YWNrLmNvbnRhaW5z
KGxhc3RJbmRleCkpOworICAgICAgICBBU1NFUlQoIW1faXNPblNlbGVjdFN0YWNrLmdldChsYXN0
SW5kZXgpKTsKKyAgICAgICAgbV9zZWxlY3RTdGFjay5hcHBlbmQobGFzdEluZGV4KTsKKyAgICAg
ICAgbV9pc09uU2VsZWN0U3RhY2sucXVpY2tTZXQobGFzdEluZGV4KTsKKworICAgICAgICBmb3JF
YWNoQWRqYWNlbnQobGFzdEluZGV4LCBbdGhpc10oSW5kZXhUeXBlIGFkamFjZW50VG1wSW5kZXgp
IHsKKyAgICAgICAgICAgIGRlY3JlbWVudERlZ3JlZShhZGphY2VudFRtcEluZGV4KTsKKyAgICAg
ICAgfSk7CisgICAgfQorCisgICAgdm9pZCBjb2FsZXNjZSgpCisgICAgeworICAgICAgICB1bnNp
Z25lZCBtb3ZlSW5kZXggPSBtX3dvcmtsaXN0TW92ZXMudGFrZUxhc3RNb3ZlKCk7CisgICAgICAg
IGNvbnN0IE1vdmVPcGVyYW5kcyYgbW92ZU9wZXJhbmRzID0gbV9jb2FsZXNjaW5nQ2FuZGlkYXRl
c1ttb3ZlSW5kZXhdOworICAgICAgICBJbmRleFR5cGUgdSA9IGdldEFsaWFzKG1vdmVPcGVyYW5k
cy5zcmNJbmRleCk7CisgICAgICAgIEluZGV4VHlwZSB2ID0gZ2V0QWxpYXMobW92ZU9wZXJhbmRz
LmRzdEluZGV4KTsKKworICAgICAgICBpZiAoaXNQcmVjb2xvcmVkKHYpKQorICAgICAgICAgICAg
c3RkOjpzd2FwKHUsIHYpOworCisgICAgICAgIGlmICh0cmFjZURlYnVnKQorICAgICAgICAgICAg
ZGF0YUxvZygiQ29hbGVzY2luZyBtb3ZlIGF0IGluZGV4ICIsIG1vdmVJbmRleCwgIiB1ID0gIiwg
dSwgIiB2ID0gIiwgdiwgIlxuIik7CisKKyAgICAgICAgaWYgKHUgPT0gdikgeworICAgICAgICAg
ICAgYWRkV29ya0xpc3QodSk7CisKKyAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQorICAgICAg
ICAgICAgICAgIGRhdGFMb2coIiAgICBDb2FsZXNjZWRcbiIpOworICAgICAgICB9IGVsc2UgaWYg
KGlzUHJlY29sb3JlZCh2KQorICAgICAgICAgICAgfHwgaGFzSW50ZXJmZXJlbmNlRWRnZShJbnRl
cmZlcmVuY2VFZGdlKHUsIHYpKQorICAgICAgICAgICAgfHwgKHUgPT0gbV9mcmFtZVBvaW50ZXJJ
bmRleCAmJiBtX2ludGVyZmVyZXNXaXRoRnJhbWVQb2ludGVyLnF1aWNrR2V0KHYpKSkgeworICAg
ICAgICAgICAgYWRkV29ya0xpc3QodSk7CisgICAgICAgICAgICBhZGRXb3JrTGlzdCh2KTsKKwor
ICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpCisgICAgICAgICAgICAgICAgZGF0YUxvZygiICAg
IENvbnN0cmFpbmVkXG4iKTsKKyAgICAgICAgfSBlbHNlIGlmIChjYW5CZVNhZmVseUNvYWxlc2Nl
ZCh1LCB2KSkgeworICAgICAgICAgICAgY29tYmluZSh1LCB2KTsKKyAgICAgICAgICAgIGFkZFdv
cmtMaXN0KHUpOworICAgICAgICAgICAgbV9oYXNDb2FsZXNjZWROb25Ucml2aWFsTW92ZSA9IHRy
dWU7CisKKyAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQorICAgICAgICAgICAgICAgIGRhdGFM
b2coIiAgICBTYWZlIENvYWxlc2NpbmdcbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAg
ICAgbV9hY3RpdmVNb3Zlcy5xdWlja1NldChtb3ZlSW5kZXgpOworICAgICAgICAgICAgaWYgKHRy
YWNlRGVidWcpCisgICAgICAgICAgICAgICAgZGF0YUxvZygiICAgIEZhaWxlZCBjb2FsZXNjaW5n
LCBhZGRlZCB0byBhY3RpdmUgbW92ZXMuXG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZv
aWQgYWRkV29ya0xpc3QoSW5kZXhUeXBlIHRtcEluZGV4KQorICAgIHsKKyAgICAgICAgaWYgKCFp
c1ByZWNvbG9yZWQodG1wSW5kZXgpICYmIG1fZGVncmVlc1t0bXBJbmRleF0gPCByZWdpc3RlckNv
dW50KCkgJiYgIWlzTW92ZVJlbGF0ZWQodG1wSW5kZXgpKSB7CisgICAgICAgICAgICBtX2ZyZWV6
ZVdvcmtsaXN0LnJlbW92ZSh0bXBJbmRleCk7CisgICAgICAgICAgICBtX3NpbXBsaWZ5V29ya2xp
c3QuYXBwZW5kKHRtcEluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgY29tYmlu
ZShJbmRleFR5cGUgdSwgSW5kZXhUeXBlIHYpCisgICAgeworICAgICAgICBpZiAoIW1fZnJlZXpl
V29ya2xpc3QucmVtb3ZlKHYpKQorICAgICAgICAgICAgbV9zcGlsbFdvcmtsaXN0LnF1aWNrQ2xl
YXIodik7CisKKyAgICAgICAgQVNTRVJUKCFtX2NvYWxlc2NlZFRtcHNbdl0pOworICAgICAgICBt
X2NvYWxlc2NlZFRtcHNbdl0gPSB1OworCisgICAgICAgIGF1dG8mIHZNb3ZlcyA9IG1fbW92ZUxp
c3Rbdl07CisgICAgICAgIG1fbW92ZUxpc3RbdV0uYWRkKHZNb3Zlcy5iZWdpbigpLCB2TW92ZXMu
ZW5kKCkpOworCisgICAgICAgIGZvckVhY2hBZGphY2VudCh2LCBbdGhpcywgdV0gKEluZGV4VHlw
ZSBhZGphY2VudFRtcEluZGV4KSB7CisgICAgICAgICAgICBpZiAoYWRkRWRnZURpc3RpbmN0V2l0
aG91dERlZ3JlZUNoYW5nZShhZGphY2VudFRtcEluZGV4LCB1KSkgeworICAgICAgICAgICAgICAg
IC8vIElmIHdlIGFkZGVkIGEgbmV3IGVkZ2UgYmV0d2VlbiB0aGUgYWRqYWNlbnRUbXAgYW5kIHUs
IGl0IHJlcGxhY2VzIHRoZSBlZGdlCisgICAgICAgICAgICAgICAgLy8gdGhhdCBleGlzdGVkIHdp
dGggdi4KKyAgICAgICAgICAgICAgICAvLyBUaGUgZGVncmVlIG9mIGFkamFjZW50VG1wIHJlbWFp
bnMgdGhlIHNhbWUgc2luY2UgdGhlIGVkZ2UganVzdCBjaGFuZ2VkIGZyb20gdSB0byB2LgorICAg
ICAgICAgICAgICAgIC8vIEFsbCB3ZSBuZWVkIHRvIGRvIGlzIHVwZGF0ZSB0aGUgZGVncmVlIG9m
IHUuCisgICAgICAgICAgICAgICAgaWYgKCFpc1ByZWNvbG9yZWQodSkpCisgICAgICAgICAgICAg
ICAgICAgIG1fZGVncmVlc1t1XSsrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg
ICAgICAvLyBJZiB3ZSBhbHJlYWR5IGhhZCBhbiBlZGdlIGJldHdlZW4gdGhlIGFkamFjZW50VG1w
IGFuZCB1LCB0aGUgZGVncmVlIG9mIHUKKyAgICAgICAgICAgICAgICAvLyBpcyBhbHJlYWR5IGNv
cnJlY3QuIFRoZSBkZWdyZWUgb2YgdGhlIGFkamFjZW50VG1wIGRlY3JlYXNlcyBzaW5jZSB0aGUg
ZWRnZQorICAgICAgICAgICAgICAgIC8vIHdpdGggdiBpcyBubyBsb25nZXIgcmVsZXZhbnQgKHdl
IGNhbiB0aGluayBvZiBpdCBhcyBtZXJnZWQgd2l0aCB0aGUgZWRnZSB3aXRoIHUpLgorICAgICAg
ICAgICAgICAgIGRlY3JlbWVudERlZ3JlZShhZGphY2VudFRtcEluZGV4KTsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgaWYgKG1fZnJhbWVQb2ludGVySW5kZXggJiYgbV9p
bnRlcmZlcmVzV2l0aEZyYW1lUG9pbnRlci5xdWlja0dldCh2KSkKKyAgICAgICAgICAgIG1faW50
ZXJmZXJlc1dpdGhGcmFtZVBvaW50ZXIucXVpY2tTZXQodSk7CisKKyAgICAgICAgaWYgKG1fZGVn
cmVlc1t1XSA+PSByZWdpc3RlckNvdW50KCkgJiYgbV9mcmVlemVXb3JrbGlzdC5yZW1vdmUodSkp
CisgICAgICAgICAgICBhZGRUb1NwaWxsKHUpOworICAgIH0KKworICAgIHZvaWQgZnJlZXplKCkK
KyAgICB7CisgICAgICAgIEluZGV4VHlwZSB2aWN0aW1JbmRleCA9IG1fZnJlZXplV29ya2xpc3Qu
dGFrZUFueSgpOworICAgICAgICBBU1NFUlRfV0lUSF9NRVNTQUdFKGdldEFsaWFzKHZpY3RpbUlu
ZGV4KSA9PSB2aWN0aW1JbmRleCwgImNvYWxlc2NlKCkgc2hvdWxkIG5vdCBsZWF2ZSBhbGlhc2Vk
IFRtcCBpbiB0aGUgd29ya2xpc3QuIik7CisgICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5hcHBl
bmQodmljdGltSW5kZXgpOworICAgICAgICBmcmVlemVNb3Zlcyh2aWN0aW1JbmRleCk7CisgICAg
fQorCisgICAgdm9pZCBmcmVlemVNb3ZlcyhJbmRleFR5cGUgdG1wSW5kZXgpCisgICAgeworICAg
ICAgICBmb3JFYWNoTm9kZU1vdmVzKHRtcEluZGV4LCBbdGhpcywgdG1wSW5kZXhdIChJbmRleFR5
cGUgbW92ZUluZGV4KSB7CisgICAgICAgICAgICBpZiAoIW1fYWN0aXZlTW92ZXMucXVpY2tDbGVh
cihtb3ZlSW5kZXgpKQorICAgICAgICAgICAgICAgIG1fd29ya2xpc3RNb3Zlcy50YWtlTW92ZSht
b3ZlSW5kZXgpOworCisgICAgICAgICAgICBjb25zdCBNb3ZlT3BlcmFuZHMmIG1vdmVPcGVyYW5k
cyA9IG1fY29hbGVzY2luZ0NhbmRpZGF0ZXNbbW92ZUluZGV4XTsKKyAgICAgICAgICAgIEluZGV4
VHlwZSBzcmNUbXBJbmRleCA9IG1vdmVPcGVyYW5kcy5zcmNJbmRleDsKKyAgICAgICAgICAgIElu
ZGV4VHlwZSBkc3RUbXBJbmRleCA9IG1vdmVPcGVyYW5kcy5kc3RJbmRleDsKKworICAgICAgICAg
ICAgSW5kZXhUeXBlIG9yaWdpbmFsT3RoZXJUbXAgPSBzcmNUbXBJbmRleCAhPSB0bXBJbmRleCA/
IHNyY1RtcEluZGV4IDogZHN0VG1wSW5kZXg7CisgICAgICAgICAgICBJbmRleFR5cGUgb3RoZXJU
bXBJbmRleCA9IGdldEFsaWFzKG9yaWdpbmFsT3RoZXJUbXApOworICAgICAgICAgICAgaWYgKG1f
ZGVncmVlc1tvdGhlclRtcEluZGV4XSA8IHJlZ2lzdGVyQ291bnQoKSAmJiAhaXNNb3ZlUmVsYXRl
ZChvdGhlclRtcEluZGV4KSkgeworICAgICAgICAgICAgICAgIGlmIChtX2ZyZWV6ZVdvcmtsaXN0
LnJlbW92ZShvdGhlclRtcEluZGV4KSkKKyAgICAgICAgICAgICAgICAgICAgbV9zaW1wbGlmeVdv
cmtsaXN0LmFwcGVuZChvdGhlclRtcEluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7
CisgICAgfQorCisgICAgdm9pZCBkZWNyZW1lbnREZWdyZWUoSW5kZXhUeXBlIHRtcEluZGV4KQor
ICAgIHsKKyAgICAgICAgQVNTRVJUKG1fZGVncmVlc1t0bXBJbmRleF0pOworCisgICAgICAgIHVu
c2lnbmVkIG9sZERlZ3JlZSA9IG1fZGVncmVlc1t0bXBJbmRleF0tLTsKKyAgICAgICAgaWYgKG9s
ZERlZ3JlZSA9PSByZWdpc3RlckNvdW50KCkpIHsKKyAgICAgICAgICAgIGVuYWJsZU1vdmVzT25W
YWx1ZUFuZEFkamFjZW50cyh0bXBJbmRleCk7CisgICAgICAgICAgICBtX3NwaWxsV29ya2xpc3Qu
cXVpY2tDbGVhcih0bXBJbmRleCk7CisgICAgICAgICAgICBpZiAoaXNNb3ZlUmVsYXRlZCh0bXBJ
bmRleCkpCisgICAgICAgICAgICAgICAgbV9mcmVlemVXb3JrbGlzdC5hZGQodG1wSW5kZXgpOwor
ICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5hcHBl
bmQodG1wSW5kZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBzZWxlY3RTcGlsbCgp
CisgICAgeworICAgICAgICBJbmRleFR5cGUgdmljdGltSW5kZXggPSBCYXNlOjpzZWxlY3RTcGls
bCgpOworICAgICAgICBtX3NwaWxsV29ya2xpc3QucXVpY2tDbGVhcih2aWN0aW1JbmRleCk7Cisg
ICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5hcHBlbmQodmljdGltSW5kZXgpOworICAgICAgICBm
cmVlemVNb3Zlcyh2aWN0aW1JbmRleCk7CisgICAgfQogCi0gICAgLy8gVGhlIGludGVyZmVyZW5j
ZSBncmFwaC4KLSAgICBIYXNoU2V0PEludGVyZmVyZW5jZUVkZ2UsIEludGVyZmVyZW5jZUVkZ2VI
YXNoLCBJbnRlcmZlcmVuY2VFZGdlSGFzaFRyYWl0cz4gbV9pbnRlcmZlcmVuY2VFZGdlczsKLSAg
ICBWZWN0b3I8VmVjdG9yPEluZGV4VHlwZSwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3csIDQ+LCAw
LCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9hZGphY2VuY3lMaXN0OwotICAgIFZlY3RvcjxJbmRl
eFR5cGUsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX2RlZ3JlZXM7CisgICAgdm9pZCBhc3Np
Z25Db2xvcnMoKQorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fZnJlZXplV29ya2xpc3QuaXNFbXB0
eSgpKTsKKyAgICAgICAgbV93b3JrbGlzdE1vdmVzLmNsZWFyKCk7CisgICAgICAgIEJhc2U6OmFz
c2lnbkNvbG9ycygpOworICAgIH0KIAotICAgIC8vIEluc3RlYWQgb2Yga2VlcGluZyB0cmFjayBv
ZiB0aGUgbW92ZSBpbnN0cnVjdGlvbnMsIHdlIGp1c3Qga2VlcCB0aGVpciBvcGVyYW5kcyBhcm91
bmQgYW5kIHVzZSB0aGUgaW5kZXgKLSAgICAvLyBpbiB0aGUgdmVjdG9yIGFzIHRoZSAiaWRlbnRp
ZmllciIgZm9yIHRoZSBtb3ZlLgotICAgIHN0cnVjdCBNb3ZlT3BlcmFuZHMgewotICAgICAgICBJ
bmRleFR5cGUgc3JjSW5kZXg7Ci0gICAgICAgIEluZGV4VHlwZSBkc3RJbmRleDsKLSAgICB9Owot
ICAgIFZlY3RvcjxNb3ZlT3BlcmFuZHMsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX2NvYWxl
c2NpbmdDYW5kaWRhdGVzOwogCi0gICAgLy8gTGlzdCBvZiBldmVyeSBtb3ZlIGluc3RydWN0aW9u
IGFzc29jaWF0ZWQgd2l0aCBhIFRtcC4KLSAgICBWZWN0b3I8SGFzaFNldDxJbmRleFR5cGUsIHR5
cGVuYW1lIERlZmF1bHRIYXNoPEluZGV4VHlwZT46Okhhc2gsIFdURjo6VW5zaWduZWRXaXRoWmVy
b0tleUhhc2hUcmFpdHM8SW5kZXhUeXBlPj4+IG1fbW92ZUxpc3Q7CisgICAgYm9vbCBpc01vdmVS
ZWxhdGVkKEluZGV4VHlwZSB0bXBJbmRleCkKKyAgICB7CisgICAgICAgIGZvciAodW5zaWduZWQg
bW92ZUluZGV4IDogbV9tb3ZlTGlzdFt0bXBJbmRleF0pIHsKKyAgICAgICAgICAgIGlmIChtX2Fj
dGl2ZU1vdmVzLnF1aWNrR2V0KG1vdmVJbmRleCkgfHwgbV93b3JrbGlzdE1vdmVzLmNvbnRhaW5z
KG1vdmVJbmRleCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIAotICAgIC8vIENvbG9ycy4KLSAgICBWZWN0b3I8
UmVnLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9jb2xvcmVkVG1wOwotICAgIFZlY3RvcjxJ
bmRleFR5cGU+IG1fc3BpbGxlZFRtcHM7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rpb24+
CisgICAgdm9pZCBmb3JFYWNoTm9kZU1vdmVzKEluZGV4VHlwZSB0bXBJbmRleCwgRnVuY3Rpb24g
ZnVuY3Rpb24pCisgICAgeworICAgICAgICBmb3IgKHVuc2lnbmVkIG1vdmVJbmRleCA6IG1fbW92
ZUxpc3RbdG1wSW5kZXhdKSB7CisgICAgICAgICAgICBpZiAobV9hY3RpdmVNb3Zlcy5xdWlja0dl
dChtb3ZlSW5kZXgpIHx8IG1fd29ya2xpc3RNb3Zlcy5jb250YWlucyhtb3ZlSW5kZXgpKQorICAg
ICAgICAgICAgICAgIGZ1bmN0aW9uKG1vdmVJbmRleCk7CisgICAgICAgIH0KKyAgICB9CiAKLSAg
ICAvLyBWYWx1ZXMgdGhhdCBoYXZlIGJlZW4gY29hbGVzY2VkIHdpdGggYW4gb3RoZXIgdmFsdWUu
Ci0gICAgVmVjdG9yPEluZGV4VHlwZSwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fY29hbGVz
Y2VkVG1wczsKKyAgICB2b2lkIGVuYWJsZU1vdmVzT25WYWx1ZShJbmRleFR5cGUgdG1wSW5kZXgp
CisgICAgeworICAgICAgICBmb3IgKHVuc2lnbmVkIG1vdmVJbmRleCA6IG1fbW92ZUxpc3RbdG1w
SW5kZXhdKSB7CisgICAgICAgICAgICBpZiAobV9hY3RpdmVNb3Zlcy5xdWlja0NsZWFyKG1vdmVJ
bmRleCkpCisgICAgICAgICAgICAgICAgbV93b3JrbGlzdE1vdmVzLnJldHVybk1vdmUobW92ZUlu
ZGV4KTsKKyAgICAgICAgfQorICAgIH0KIAotICAgIC8vIFRoZSBzdGFjayBvZiBUbXAgcmVtb3Zl
ZCBmcm9tIHRoZSBncmFwaCBhbmQgcmVhZHkgZm9yIGNvbG9yaW5nLgotICAgIEJpdFZlY3RvciBt
X2lzT25TZWxlY3RTdGFjazsKLSAgICBWZWN0b3I8SW5kZXhUeXBlPiBtX3NlbGVjdFN0YWNrOwor
ICAgIHZvaWQgZW5hYmxlTW92ZXNPblZhbHVlQW5kQWRqYWNlbnRzKEluZGV4VHlwZSB0bXBJbmRl
eCkKKyAgICB7CisgICAgICAgIGVuYWJsZU1vdmVzT25WYWx1ZSh0bXBJbmRleCk7CiAKLSAgICBJ
bmRleFR5cGUgbV9mcmFtZVBvaW50ZXJJbmRleCB7IDAgfTsKLSAgICBCaXRWZWN0b3IgbV9pbnRl
cmZlcmVzV2l0aEZyYW1lUG9pbnRlcjsKKyAgICAgICAgZm9yRWFjaEFkamFjZW50KHRtcEluZGV4
LCBbdGhpc10gKEluZGV4VHlwZSBhZGphY2VudFRtcEluZGV4KSB7CisgICAgICAgICAgICBlbmFi
bGVNb3Zlc09uVmFsdWUoYWRqYWNlbnRUbXBJbmRleCk7CisgICAgICAgIH0pOworICAgIH0KIAog
ICAgIHN0cnVjdCBPcmRlcmVkTW92ZVNldCB7CiAgICAgICAgIHVuc2lnbmVkIGFkZE1vdmUoKQpA
QCAtNzAyLDYgKzEyNzcsMTEgQEAgcHJvdGVjdGVkOgogICAgICAgICAgICAgbV9sb3dQcmlvcml0
eU1vdmVMaXN0LmNsZWFyKCk7CiAgICAgICAgIH0KIAorICAgICAgICB1bnNpZ25lZCB0b3RhbE51
bWJlck9mTW92ZXMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbV9tb3ZlTGlzdC5z
aXplKCkgKyBtX2xvd1ByaW9yaXR5TW92ZUxpc3Quc2l6ZSgpOworICAgICAgICB9CisKICAgICBw
cml2YXRlOgogICAgICAgICBWZWN0b3I8dW5zaWduZWQsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93
PiBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdDsKICAgICAgICAgVmVjdG9yPHVuc2lnbmVkLCAwLCBVbnNh
ZmVWZWN0b3JPdmVyZmxvdz4gbV9tb3ZlTGlzdDsKQEAgLTcwOSw1MCArMTI4OSw3OSBAQCBwcm90
ZWN0ZWQ6CiAgICAgICAgIHVuc2lnbmVkIG1fZmlyc3RMb3dQcmlvcml0eU1vdmVJbmRleCB7IDAg
fTsKICAgICB9OwogCisgICAgdm9pZCBkdW1wV29ya0xpc3RzKFByaW50U3RyZWFtJiBvdXQpCisg
ICAgeworICAgICAgICBvdXQucHJpbnQoIlNpbXBsaWZ5IHdvcmsgbGlzdDpcbiIpOworICAgICAg
ICBmb3IgKHVuc2lnbmVkIHRtcEluZGV4IDogbV9zaW1wbGlmeVdvcmtsaXN0KQorICAgICAgICAg
ICAgb3V0LnByaW50KCIgICAgIiwgVG1wTWFwcGVyOjp0bXBGcm9tQWJzb2x1dGVJbmRleCh0bXBJ
bmRleCksICJcbiIpOworICAgICAgICBvdXQucHJpbnRmKCJNb3ZlcyB3b3JrIGxpc3QgaXMgZW1w
dHk/ICVkXG4iLCBtX3dvcmtsaXN0TW92ZXMuaXNFbXB0eSgpKTsKKyAgICAgICAgb3V0LnByaW50
KCJGcmVlemUgd29yayBsaXN0OlxuIik7CisgICAgICAgIGZvciAodW5zaWduZWQgdG1wSW5kZXgg
OiBtX2ZyZWV6ZVdvcmtsaXN0KQorICAgICAgICAgICAgb3V0LnByaW50KCIgICAgIiwgVG1wTWFw
cGVyOjp0bXBGcm9tQWJzb2x1dGVJbmRleCh0bXBJbmRleCksICJcbiIpOworICAgICAgICBvdXQu
cHJpbnQoIlNwaWxsIHdvcmsgbGlzdDpcbiIpOworICAgICAgICBmb3IgKHVuc2lnbmVkIHRtcElu
ZGV4IDogbV9zcGlsbFdvcmtsaXN0KQorICAgICAgICAgICAgb3V0LnByaW50KCIgICAgIiwgVG1w
TWFwcGVyOjp0bXBGcm9tQWJzb2x1dGVJbmRleCh0bXBJbmRleCksICJcbiIpOworICAgIH0KKwog
ICAgIC8vIFdvcmsgbGlzdHMuCisgICAgLy8gTG93LWRlZ3JlZSwgTW92ZSByZWxhdGVkLgorICAg
IEhhc2hTZXQ8SW5kZXhUeXBlPiBtX2ZyZWV6ZVdvcmtsaXN0OwogICAgIC8vIFNldCBvZiAibW92
ZSIgZW5hYmxlZCBmb3IgcG9zc2libGUgY29hbGVzY2luZy4KICAgICBPcmRlcmVkTW92ZVNldCBt
X3dvcmtsaXN0TW92ZXM7CiAgICAgLy8gU2V0IG9mICJtb3ZlIiBub3QgeWV0IHJlYWR5IGZvciBj
b2FsZXNjaW5nLgogICAgIEJpdFZlY3RvciBtX2FjdGl2ZU1vdmVzOwotICAgIC8vIExvdy1kZWdy
ZWUsIG5vbi1Nb3ZlIHJlbGF0ZWQuCi0gICAgVmVjdG9yPEluZGV4VHlwZT4gbV9zaW1wbGlmeVdv
cmtsaXN0OwotICAgIC8vIEhpZ2gtZGVncmVlIFRtcC4KLSAgICBIYXNoU2V0PEluZGV4VHlwZT4g
bV9zcGlsbFdvcmtsaXN0OwotICAgIC8vIExvdy1kZWdyZWUsIE1vdmUgcmVsYXRlZC4KLSAgICBI
YXNoU2V0PEluZGV4VHlwZT4gbV9mcmVlemVXb3JrbGlzdDsKLQotICAgIGJvb2wgbV9oYXNTZWxl
Y3RlZFNwaWxsIHsgZmFsc2UgfTsKLSAgICBib29sIG1faGFzQ29hbGVzY2VkTm9uVHJpdmlhbE1v
dmUgeyBmYWxzZSB9OwotCi0gICAgLy8gVGhlIG1hcHBpbmcgb2YgVG1wIHRvIHRoZWlyIGFsaWFz
IGZvciBNb3ZlcyB0aGF0IGFyZSBhbHdheXMgY29hbGVzY2luZyByZWdhcmRsZXNzIG9mIHNwaWxs
aW5nLgotICAgIFZlY3RvcjxJbmRleFR5cGUsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX2Nv
YWxlc2NlZFRtcHNBdFNwaWxsOwotICAgIAotICAgIGNvbnN0IEhhc2hTZXQ8dW5zaWduZWQ+JiBt
X3Vuc3BpbGxhYmxlVG1wczsKIH07CiAKIC8vIFRoaXMgcGVyZm9ybSBhbGwgdGhlIHRhc2tzIHRo
YXQgYXJlIHNwZWNpZmljIHRvIGNlcnRhaW4gcmVnaXN0ZXIgdHlwZS4KLXRlbXBsYXRlPEFyZzo6
VHlwZSB0eXBlPgotY2xhc3MgQ29sb3JpbmdBbGxvY2F0b3IgOiBwdWJsaWMgQWJzdHJhY3RDb2xv
cmluZ0FsbG9jYXRvcjx1bnNpZ25lZD4gewordGVtcGxhdGU8QXJnOjpUeXBlIHR5cGUsIHRlbXBs
YXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgQWxsb2NhdG9yVHlwZT4KK2NsYXNzIENvbG9y
aW5nQWxsb2NhdG9yIDogcHVibGljIEFsbG9jYXRvclR5cGU8dW5zaWduZWQsIEFic29sdXRlVG1w
TWFwcGVyPHR5cGU+PiB7CisgICAgdXNpbmcgVG1wTWFwcGVyID0gQWJzb2x1dGVUbXBNYXBwZXI8
dHlwZT47CisgICAgdXNpbmcgQmFzZSA9IEFsbG9jYXRvclR5cGU8dW5zaWduZWQsIFRtcE1hcHBl
cj47CisgICAgdXNpbmcgQmFzZTo6bV9pc09uU2VsZWN0U3RhY2s7CisgICAgdXNpbmcgQmFzZTo6
bV9zZWxlY3RTdGFjazsKKyAgICB1c2luZyBCYXNlOjptX2ZyYW1lUG9pbnRlckluZGV4OworICAg
IHVzaW5nIEJhc2U6Om1faW50ZXJmZXJlc1dpdGhGcmFtZVBvaW50ZXI7CisgICAgdXNpbmcgQmFz
ZTo6bV9zaW1wbGlmeVdvcmtsaXN0OworICAgIHVzaW5nIEJhc2U6Om1fc3BpbGxXb3JrbGlzdDsK
KyAgICB1c2luZyBCYXNlOjptX2hhc1NlbGVjdGVkU3BpbGw7CisgICAgdXNpbmcgQmFzZTo6bV9o
YXNDb2FsZXNjZWROb25Ucml2aWFsTW92ZTsKKyAgICB1c2luZyBCYXNlOjptX2RlZ3JlZXM7Cisg
ICAgdXNpbmcgQmFzZTo6cmVnaXN0ZXJDb3VudDsKKyAgICB1c2luZyBCYXNlOjptX2NvYWxlc2Nl
ZFRtcHM7CisgICAgdXNpbmcgQmFzZTo6bV9tb3ZlTGlzdDsKKyAgICB1c2luZyBCYXNlOjptX3Vz
ZUNvdW50czsKKyAgICB1c2luZyBCYXNlOjptX2NvYWxlc2NlZFRtcHNBdFNwaWxsOworICAgIHVz
aW5nIEJhc2U6Om1fc3BpbGxlZFRtcHM7CisgICAgdXNpbmcgTW92ZU9wZXJhbmRzID0gdHlwZW5h
bWUgQmFzZTo6TW92ZU9wZXJhbmRzOworICAgIHVzaW5nIEJhc2U6Om1fY29hbGVzY2luZ0NhbmRp
ZGF0ZXM7CisgICAgdXNpbmcgQmFzZTo6bV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXg7Cisg
ICAgdXNpbmcgQmFzZTo6bV9jb2xvcmVkVG1wOworICAgIHVzaW5nIEJhc2U6Om1fY29kZTsKKyAg
ICB1c2luZyBJbnRlcmZlcmVuY2VFZGdlID0gdHlwZW5hbWUgQmFzZTo6SW50ZXJmZXJlbmNlRWRn
ZTsKKyAgICB1c2luZyBCYXNlOjptX3dvcmtsaXN0TW92ZXM7CisgICAgdXNpbmcgQmFzZTo6aGFz
SW50ZXJmZXJlbmNlRWRnZTsKKyAgICB1c2luZyBCYXNlOjpnZXRBbGlhczsKKyAgICB1c2luZyBC
YXNlOjphZGRFZGdlOworICAgIHVzaW5nIEJhc2U6Om1faW50ZXJmZXJlbmNlRWRnZXM7CisKIHB1
YmxpYzoKKwogICAgIENvbG9yaW5nQWxsb2NhdG9yKENvZGUmIGNvZGUsIFRtcFdpZHRoJiB0bXBX
aWR0aCwgY29uc3QgVXNlQ291bnRzPFRtcD4mIHVzZUNvdW50cywgY29uc3QgSGFzaFNldDx1bnNp
Z25lZD4mIHVuc3BpbGxhYmxlVG1wKQotICAgICAgICA6IEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0
b3I8dW5zaWduZWQ+KGNvZGUucmVnc0luUHJpb3JpdHlPcmRlcih0eXBlKSwgQWJzb2x1dGVUbXBN
YXBwZXI8dHlwZT46Omxhc3RNYWNoaW5lUmVnaXN0ZXJJbmRleCgpLCB0bXBBcnJheVNpemUoY29k
ZSksIHVuc3BpbGxhYmxlVG1wKQotICAgICAgICAsIG1fY29kZShjb2RlKQorICAgICAgICA6IEJh
c2UoY29kZSwgY29kZS5yZWdzSW5Qcmlvcml0eU9yZGVyKHR5cGUpLCBUbXBNYXBwZXI6Omxhc3RN
YWNoaW5lUmVnaXN0ZXJJbmRleCgpLCB0bXBBcnJheVNpemUoY29kZSksIHVuc3BpbGxhYmxlVG1w
LCB1c2VDb3VudHMpCiAgICAgICAgICwgbV90bXBXaWR0aCh0bXBXaWR0aCkKLSAgICAgICAgLCBt
X3VzZUNvdW50cyh1c2VDb3VudHMpCiAgICAgewogICAgICAgICBpZiAodHlwZSA9PSBBcmc6OkdQ
KSB7Ci0gICAgICAgICAgICBtX2ZyYW1lUG9pbnRlckluZGV4ID0gQWJzb2x1dGVUbXBNYXBwZXI8
dHlwZT46OmFic29sdXRlSW5kZXgoVG1wKE1hY3JvQXNzZW1ibGVyOjpmcmFtZVBvaW50ZXJSZWdp
c3RlcikpOworICAgICAgICAgICAgbV9mcmFtZVBvaW50ZXJJbmRleCA9IFRtcE1hcHBlcjo6YWJz
b2x1dGVJbmRleChUbXAoTWFjcm9Bc3NlbWJsZXI6OmZyYW1lUG9pbnRlclJlZ2lzdGVyKSk7CiAg
ICAgICAgICAgICBtX2ludGVyZmVyZXNXaXRoRnJhbWVQb2ludGVyLmVuc3VyZVNpemUodG1wQXJy
YXlTaXplKGNvZGUpKTsKICAgICAgICAgfQogCiAgICAgICAgIGluaXRpYWxpemVQcmVjb2xvcmVk
VG1wKCk7CiAgICAgICAgIGJ1aWxkKCk7Ci0gICAgICAgIGFsbG9jYXRlKCk7CiAgICAgfQogCiAg
ICAgVG1wIGdldEFsaWFzKFRtcCB0bXApIGNvbnN0CiAgICAgewotICAgICAgICByZXR1cm4gQWJz
b2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KGdldEFsaWFzKEFic29s
dXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHRtcCkpKTsKKyAgICAgICAgcmV0dXJu
IFRtcE1hcHBlcjo6dG1wRnJvbUFic29sdXRlSW5kZXgoZ2V0QWxpYXMoVG1wTWFwcGVyOjphYnNv
bHV0ZUluZGV4KHRtcCkpKTsKICAgICB9CiAKICAgICAvLyBUaGlzIHRlbGxzIHlvdSBpZiBhIE1v
dmUgd2lsbCBiZSBjb2FsZXNjYWJsZSBpZiB0aGUgc3JjIGFuZCBkc3QgZW5kIHVwIG1hdGNoaW5n
LiBUaGlzIG1ldGhvZApAQCAtNzc1LDExICsxMzg0LDExIEBAIHB1YmxpYzoKICAgICAgICAgaWYg
KG1fY29hbGVzY2VkVG1wc0F0U3BpbGwuaXNFbXB0eSgpKQogICAgICAgICAgICAgcmV0dXJuIHRt
cDsKIAotICAgICAgICB1bnNpZ25lZCBhbGlhc0luZGV4ID0gQWJzb2x1dGVUbXBNYXBwZXI8dHlw
ZT46OmFic29sdXRlSW5kZXgodG1wKTsKKyAgICAgICAgdW5zaWduZWQgYWxpYXNJbmRleCA9IFRt
cE1hcHBlcjo6YWJzb2x1dGVJbmRleCh0bXApOwogICAgICAgICB3aGlsZSAodW5zaWduZWQgbmV4
dEFsaWFzSW5kZXggPSBtX2NvYWxlc2NlZFRtcHNBdFNwaWxsW2FsaWFzSW5kZXhdKQogICAgICAg
ICAgICAgYWxpYXNJbmRleCA9IG5leHRBbGlhc0luZGV4OwogCi0gICAgICAgIFRtcCBhbGlhcyA9
IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleChhbGlhc0luZGV4
KTsKKyAgICAgICAgVG1wIGFsaWFzID0gVG1wTWFwcGVyOjp0bXBGcm9tQWJzb2x1dGVJbmRleChh
bGlhc0luZGV4KTsKIAogICAgICAgICBBU1NFUlRfV0lUSF9NRVNTQUdFKCFtX3NwaWxsZWRUbXBz
LmNvbnRhaW5zKGFsaWFzSW5kZXgpIHx8IGFsaWFzID09IHRtcCwgIlRoZSBhbGlhc2VzIGF0IHNw
aWxsIHNob3VsZCBhbHdheXMgYmUgY29sb3JhYmxlLiBTb21ldGhpbmcgd2VudCBob3JyaWJseSB3
cm9uZy4iKTsKIApAQCAtNzk0LDcgKzE0MDMsNyBAQCBwdWJsaWM6CiAgICAgICAgIHsKICAgICAg
ICAgfQogCi0gICAgICAgIFRtcCBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBBYnNvbHV0ZVRt
cE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgoKm1faW5kZXhJdGVyYXRvcik7IH0K
KyAgICAgICAgVG1wIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIFRtcE1hcHBlcjo6dG1wRnJv
bUFic29sdXRlSW5kZXgoKm1faW5kZXhJdGVyYXRvcik7IH0KICAgICAgICAgSW5kZXhUb1RtcEl0
ZXJhdG9yQWRhcHRvciYgb3BlcmF0b3IrKygpIHsgKyttX2luZGV4SXRlcmF0b3I7IHJldHVybiAq
dGhpczsgfQogCiAgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJbmRleFRvVG1wSXRlcmF0
b3JBZGFwdG9yJiBvdGhlcikgY29uc3QKQEAgLTg0Myw3ICsxNDUyLDcgQEAgcHVibGljOgogICAg
ICAgICBBU1NFUlQobV9jb2xvcmVkVG1wLnNpemUoKSk7CiAgICAgICAgIEFTU0VSVCh0bXAuaXNH
UCgpID09ICh0eXBlID09IEFyZzo6R1ApKTsKIAotICAgICAgICBSZWcgcmVnID0gbV9jb2xvcmVk
VG1wW0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHRtcCldOworICAgICAg
ICBSZWcgcmVnID0gbV9jb2xvcmVkVG1wW1RtcE1hcHBlcjo6YWJzb2x1dGVJbmRleCh0bXApXTsK
ICAgICAgICAgaWYgKCFyZWcpIHsKICAgICAgICAgICAgIGRhdGFMb2coIkZBVEFMOiBObyBjb2xv
ciBmb3IgIiwgdG1wLCAiXG4iKTsKICAgICAgICAgICAgIGRhdGFMb2coIkNvZGU6XG4iKTsKQEAg
LTg1MywxOCArMTQ2MiwxOCBAQCBwdWJsaWM6CiAgICAgICAgIHJldHVybiByZWc7CiAgICAgfQog
Ci1wcml2YXRlOgorcHJvdGVjdGVkOgogICAgIHN0YXRpYyB1bnNpZ25lZCB0bXBBcnJheVNpemUo
Q29kZSYgY29kZSkKICAgICB7CiAgICAgICAgIHVuc2lnbmVkIG51bVRtcHMgPSBjb2RlLm51bVRt
cHModHlwZSk7Ci0gICAgICAgIHJldHVybiBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1
dGVJbmRleChudW1UbXBzKTsKKyAgICAgICAgcmV0dXJuIFRtcE1hcHBlcjo6YWJzb2x1dGVJbmRl
eChudW1UbXBzKTsKICAgICB9CiAKICAgICB2b2lkIGluaXRpYWxpemVQcmVjb2xvcmVkVG1wKCkK
ICAgICB7CiAgICAgICAgIG1fY29sb3JlZFRtcC5yZXNpemUobV9sYXN0UHJlY29sb3JlZFJlZ2lz
dGVySW5kZXggKyAxKTsKICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8PSBtX2xhc3RQ
cmVjb2xvcmVkUmVnaXN0ZXJJbmRleDsgKytpKSB7Ci0gICAgICAgICAgICBUbXAgdG1wID0gQWJz
b2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KGkpOworICAgICAgICAg
ICAgVG1wIHRtcCA9IFRtcE1hcHBlcjo6dG1wRnJvbUFic29sdXRlSW5kZXgoaSk7CiAgICAgICAg
ICAgICBBU1NFUlQodG1wLmlzUmVnKCkpOwogICAgICAgICAgICAgbV9jb2xvcmVkVG1wW2ldID0g
dG1wLnJlZygpOwogICAgICAgICB9CkBAIC04ODQsMTAgKzE0OTMsMTAgQEAgcHJpdmF0ZToKICAg
ICAgICAgaWYgKGxlZnRUbXAuaXNHUCgpICE9ICh0eXBlID09IEFyZzo6R1ApIHx8IHJpZ2h0VG1w
LmlzR1AoKSAhPSAodHlwZSA9PSBBcmc6OkdQKSkKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
IAotICAgICAgICB1bnNpZ25lZCBsZWZ0SW5kZXggPSBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6
YWJzb2x1dGVJbmRleChsZWZ0VG1wKTsKLSAgICAgICAgdW5zaWduZWQgcmlnaHRJbmRleCA9IEFi
c29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHJpZ2h0VG1wKTsKKyAgICAgICAg
dW5zaWduZWQgbGVmdEluZGV4ID0gVG1wTWFwcGVyOjphYnNvbHV0ZUluZGV4KGxlZnRUbXApOwor
ICAgICAgICB1bnNpZ25lZCByaWdodEluZGV4ID0gVG1wTWFwcGVyOjphYnNvbHV0ZUluZGV4KHJp
Z2h0VG1wKTsKIAotICAgICAgICByZXR1cm4gIW1faW50ZXJmZXJlbmNlRWRnZXMuY29udGFpbnMo
SW50ZXJmZXJlbmNlRWRnZShsZWZ0SW5kZXgsIHJpZ2h0SW5kZXgpKTsKKyAgICAgICAgcmV0dXJu
ICFoYXNJbnRlcmZlcmVuY2VFZGdlKEludGVyZmVyZW5jZUVkZ2UobGVmdEluZGV4LCByaWdodElu
ZGV4KSk7CiAgICAgfQogCiAgICAgdm9pZCBhZGRUb0xvd1ByaW9yaXR5Q29hbGVzY2luZ0NhbmRp
ZGF0ZXMoQXJnIGxlZnQsIEFyZyByaWdodCkKQEAgLTg5Niw4ICsxNTA1LDggQEAgcHJpdmF0ZToK
ICAgICAgICAgVG1wIGxlZnRUbXAgPSBsZWZ0LnRtcCgpOwogICAgICAgICBUbXAgcmlnaHRUbXAg
PSByaWdodC50bXAoKTsKIAotICAgICAgICB1bnNpZ25lZCBsZWZ0SW5kZXggPSBBYnNvbHV0ZVRt
cE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChsZWZ0VG1wKTsKLSAgICAgICAgdW5zaWduZWQg
cmlnaHRJbmRleCA9IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHJpZ2h0
VG1wKTsKKyAgICAgICAgdW5zaWduZWQgbGVmdEluZGV4ID0gVG1wTWFwcGVyOjphYnNvbHV0ZUlu
ZGV4KGxlZnRUbXApOworICAgICAgICB1bnNpZ25lZCByaWdodEluZGV4ID0gVG1wTWFwcGVyOjph
YnNvbHV0ZUluZGV4KHJpZ2h0VG1wKTsKIAogICAgICAgICB1bnNpZ25lZCBuZXh0TW92ZUluZGV4
ID0gbV9jb2FsZXNjaW5nQ2FuZGlkYXRlcy5zaXplKCk7CiAgICAgICAgIG1fY29hbGVzY2luZ0Nh
bmRpZGF0ZXMuYXBwZW5kKHsgbGVmdEluZGV4LCByaWdodEluZGV4IH0pOwpAQCAtOTA1LDE1ICsx
NTE0LDE1IEBAIHByaXZhdGU6CiAgICAgICAgIHVuc2lnbmVkIG5ld0luZGV4SW5Xb3JrbGlzdCA9
IG1fd29ya2xpc3RNb3Zlcy5hZGRMb3dQcmlvcml0eU1vdmUoKTsKICAgICAgICAgQVNTRVJUX1VO
VVNFRChuZXdJbmRleEluV29ya2xpc3QsIG5ld0luZGV4SW5Xb3JrbGlzdCA9PSBuZXh0TW92ZUlu
ZGV4KTsKIAotICAgICAgICBBU1NFUlQobmV4dE1vdmVJbmRleCA8PSBtX2FjdGl2ZU1vdmVzLnNp
emUoKSk7Ci0gICAgICAgIG1fYWN0aXZlTW92ZXMuZW5zdXJlU2l6ZShuZXh0TW92ZUluZGV4ICsg
MSk7Ci0KICAgICAgICAgbV9tb3ZlTGlzdFtsZWZ0SW5kZXhdLmFkZChuZXh0TW92ZUluZGV4KTsK
ICAgICAgICAgbV9tb3ZlTGlzdFtyaWdodEluZGV4XS5hZGQobmV4dE1vdmVJbmRleCk7CiAgICAg
fQogCiAgICAgdm9pZCBidWlsZCgpCiAgICAgeworICAgICAgICBtX2NvYWxlc2NpbmdDYW5kaWRh
dGVzLmNsZWFyKCk7CisgICAgICAgIG1fd29ya2xpc3RNb3Zlcy5jbGVhcigpOworCiAgICAgICAg
IFRtcExpdmVuZXNzPHR5cGU+IGxpdmVuZXNzKG1fY29kZSk7CiAgICAgICAgIGZvciAoQmFzaWNC
bG9jayogYmxvY2sgOiBtX2NvZGUpIHsKICAgICAgICAgICAgIHR5cGVuYW1lIFRtcExpdmVuZXNz
PHR5cGU+OjpMb2NhbENhbGMgbG9jYWxDYWxjKGxpdmVuZXNzLCBibG9jayk7CkBAIC05MzIsNiAr
MTU0MSw3IEBAIHByaXZhdGU6CiAgICAgewogICAgICAgICBpZiAodHJhY2VEZWJ1ZykKICAgICAg
ICAgICAgIGRhdGFMb2coIkJ1aWxkaW5nIGJldHdlZW4gIiwgcG9pbnRlckR1bXAocHJldkluc3Qp
LCAiIGFuZCAiLCBwb2ludGVyRHVtcChuZXh0SW5zdCksICI6XG4iKTsKKwogICAgICAgICBJbnN0
Ojpmb3JFYWNoRGVmV2l0aEV4dHJhQ2xvYmJlcmVkUmVnczxUbXA+KAogICAgICAgICAgICAgcHJl
dkluc3QsIG5leHRJbnN0LAogICAgICAgICAgICAgWyZdIChjb25zdCBUbXAmIGFyZywgQXJnOjpS
b2xlLCBBcmc6OlR5cGUgYXJnVHlwZSwgQXJnOjpXaWR0aCkgewpAQCAtOTcxLDE2ICsxNTgxLDE1
IEBAIHByaXZhdGU6CiAgICAgICAgICAgICBBU1NFUlQodXNlVG1wKTsKIAogICAgICAgICAgICAg
dW5zaWduZWQgbmV4dE1vdmVJbmRleCA9IG1fY29hbGVzY2luZ0NhbmRpZGF0ZXMuc2l6ZSgpOwot
ICAgICAgICAgICAgbV9jb2FsZXNjaW5nQ2FuZGlkYXRlcy5hcHBlbmQoeyBBYnNvbHV0ZVRtcE1h
cHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh1c2VUbXApLCBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBl
Pjo6YWJzb2x1dGVJbmRleChkZWZUbXApIH0pOworICAgICAgICAgICAgbV9jb2FsZXNjaW5nQ2Fu
ZGlkYXRlcy5hcHBlbmQoeyBUbXBNYXBwZXI6OmFic29sdXRlSW5kZXgodXNlVG1wKSwgVG1wTWFw
cGVyOjphYnNvbHV0ZUluZGV4KGRlZlRtcCkgfSk7CisgICAgICAgICAgICBpZiAodHJhY2VEZWJ1
ZykKKyAgICAgICAgICAgICAgICBkYXRhTG9nTG4oIk1vdmUgYXQgaW5kZXggIiwgbmV4dE1vdmVJ
bmRleCwgIiBpczogIiwgKnByZXZJbnN0KTsKIAogICAgICAgICAgICAgdW5zaWduZWQgbmV3SW5k
ZXhJbldvcmtsaXN0ID0gbV93b3JrbGlzdE1vdmVzLmFkZE1vdmUoKTsKICAgICAgICAgICAgIEFT
U0VSVF9VTlVTRUQobmV3SW5kZXhJbldvcmtsaXN0LCBuZXdJbmRleEluV29ya2xpc3QgPT0gbmV4
dE1vdmVJbmRleCk7CiAKLSAgICAgICAgICAgIEFTU0VSVChuZXh0TW92ZUluZGV4IDw9IG1fYWN0
aXZlTW92ZXMuc2l6ZSgpKTsKLSAgICAgICAgICAgIG1fYWN0aXZlTW92ZXMuZW5zdXJlU2l6ZShu
ZXh0TW92ZUluZGV4ICsgMSk7Ci0KICAgICAgICAgICAgIGZvciAoY29uc3QgQXJnJiBhcmcgOiBw
cmV2SW5zdC0+YXJncykgewotICAgICAgICAgICAgICAgIGF1dG8mIGxpc3QgPSBtX21vdmVMaXN0
W0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KGFyZy50bXAoKSldOworICAg
ICAgICAgICAgICAgIGF1dG8mIGxpc3QgPSBtX21vdmVMaXN0W1RtcE1hcHBlcjo6YWJzb2x1dGVJ
bmRleChhcmcudG1wKCkpXTsKICAgICAgICAgICAgICAgICBsaXN0LmFkZChuZXh0TW92ZUluZGV4
KTsKICAgICAgICAgICAgIH0KIApAQCAtMTA0Myw3ICsxNjUyLDcgQEAgcHJpdmF0ZToKICAgICAg
ICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBBcmc6OkdQICYmICFh
cmcuaXNHUFIoKSkKLSAgICAgICAgICAgICAgICAgICAgbV9pbnRlcmZlcmVzV2l0aEZyYW1lUG9p
bnRlci5xdWlja1NldChBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChhcmcp
KTsKKyAgICAgICAgICAgICAgICAgICAgbV9pbnRlcmZlcmVzV2l0aEZyYW1lUG9pbnRlci5xdWlj
a1NldChUbXBNYXBwZXI6OmFic29sdXRlSW5kZXgoYXJnKSk7CiAgICAgICAgICAgICB9KTsKICAg
ICB9CiAKQEAgLTEwNTEsNyArMTY2MCw3IEBAIHByaXZhdGU6CiAgICAgewogICAgICAgICBBU1NF
UlRfV0lUSF9NRVNTQUdFKGEuaXNHUCgpID09IGIuaXNHUCgpLCAiQW4gaW50ZXJmZXJlbmNlIGJl
dHdlZW4gcmVnaXN0ZXJzIG9mIGRpZmZlcmVudCB0eXBlcyBkb2VzIG5vdCBtYWtlIHNlbnNlLCBp
dCBjYW4gbGVhZCB0byBub24tY29sb3JhYmxlIGdyYXBocy4iKTsKIAotICAgICAgICBhZGRFZGdl
KEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KGEpLCBBYnNvbHV0ZVRtcE1h
cHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChiKSk7CisgICAgICAgIGFkZEVkZ2UoVG1wTWFwcGVy
OjphYnNvbHV0ZUluZGV4KGEpLCBUbXBNYXBwZXI6OmFic29sdXRlSW5kZXgoYikpOwogICAgIH0K
IAogICAgIC8vIENhbGxpbmcgdGhpcyB3aXRob3V0IGEgdG1wV2lkdGggd2lsbCBwZXJmb3JtIGEg
bW9yZSBjb25zZXJ2YXRpdmUgY29hbGVzY2luZyBhbmFseXNpcyB0aGF0IGFzc3VtZXMKQEAgLTEx
MDYsMTczICsxNzE1LDI0IEBAIHByaXZhdGU6CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0K
IAotICAgIHZvaWQgc2VsZWN0U3BpbGwoKQotICAgIHsKLSAgICAgICAgaWYgKCFtX2hhc1NlbGVj
dGVkU3BpbGwpIHsKLSAgICAgICAgICAgIG1faGFzU2VsZWN0ZWRTcGlsbCA9IHRydWU7Ci0KLSAg
ICAgICAgICAgIGlmIChtX2hhc0NvYWxlc2NlZE5vblRyaXZpYWxNb3ZlKQotICAgICAgICAgICAg
ICAgIG1fY29hbGVzY2VkVG1wc0F0U3BpbGwgPSBtX2NvYWxlc2NlZFRtcHM7Ci0gICAgICAgIH0K
LQotICAgICAgICBhdXRvIGl0ZXJhdG9yID0gbV9zcGlsbFdvcmtsaXN0LmJlZ2luKCk7Ci0KLSAg
ICAgICAgUkVMRUFTRV9BU1NFUlRfV0lUSF9NRVNTQUdFKGl0ZXJhdG9yICE9IG1fc3BpbGxXb3Jr
bGlzdC5lbmQoKSwgInNlbGVjdFNwaWxsKCkgY2FsbGVkIHdoZW4gdGhlcmUgd2FzIG5vIHNwaWxs
LiIpOwotICAgICAgICBSRUxFQVNFX0FTU0VSVF9XSVRIX01FU1NBR0UoIW1fdW5zcGlsbGFibGVU
bXBzLmNvbnRhaW5zKCppdGVyYXRvciksICJ0cnlpbmcgdG8gc3BpbGwgdW5zcGlsbGFibGUgdG1w
Iik7Ci0KLSAgICAgICAgLy8gSGlnaGVyIHNjb3JlIG1lYW5zIG1vcmUgZGVzaXJhYmxlIHRvIHNw
aWxsLiBMb3dlciBzY29yZXMgbWF4aW1pemUgdGhlIGxpa2VsaWhvb2QgdGhhdCBhIHRtcAotICAg
ICAgICAvLyBnZXRzIGEgcmVnaXN0ZXIuCi0gICAgICAgIGF1dG8gc2NvcmUgPSBbJl0gKFRtcCB0
bXApIC0+IGRvdWJsZSB7Ci0gICAgICAgICAgICAvLyBBaXIgZXhwb3NlcyB0aGUgY29uY2VwdCBv
ZiAiZmFzdCB0bXBzIiwgYW5kIHdlIGludGVycHJldCB0aGF0IHRvIG1lYW4gdGhhdCB0aGUgdG1w
Ci0gICAgICAgICAgICAvLyBzaG91bGQgYWx3YXlzIGJlIGluIGEgcmVnaXN0ZXIuCi0gICAgICAg
ICAgICBpZiAobV9jb2RlLmlzRmFzdFRtcCh0bXApKQotICAgICAgICAgICAgICAgIHJldHVybiAw
OwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBBbGwgZWxzZSBiZWluZyBlcXVhbCwgdGhl
IHNjb3JlIHNob3VsZCBiZSBkaXJlY3RseSByZWxhdGVkIHRvIHRoZSBkZWdyZWUuCi0gICAgICAg
ICAgICBkb3VibGUgZGVncmVlID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihtX2RlZ3JlZXNbQWJzb2x1
dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodG1wKV0pOwotCi0gICAgICAgICAgICAv
LyBBbGwgZWxzZSBiZWluZyBlcXVhbCwgdGhlIHNjb3JlIHNob3VsZCBiZSBpbnZlcnNlbHkgcmVs
YXRlZCB0byB0aGUgbnVtYmVyIG9mIHdhcm0gdXNlcyBhbmQKLSAgICAgICAgICAgIC8vIGRlZnMu
Ci0gICAgICAgICAgICBjb25zdCBVc2VDb3VudHM8VG1wPjo6Q291bnRzKiBjb3VudHMgPSBtX3Vz
ZUNvdW50c1t0bXBdOwotICAgICAgICAgICAgaWYgKCFjb3VudHMpCi0gICAgICAgICAgICAgICAg
cmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKTsKLSAgICAgICAg
ICAgIAotICAgICAgICAgICAgZG91YmxlIHVzZXMgPSBjb3VudHMtPm51bVdhcm1Vc2VzICsgY291
bnRzLT5udW1EZWZzOwotCi0gICAgICAgICAgICAvLyBJZiBpdCdzIGEgY29uc3RhbnQsIHRoZW4g
aXQncyBub3QgYXMgYmFkIHRvIHNwaWxsLiBXZSBjYW4gcmVtYXRlcmlhbGl6ZSBpdCBpbiBtYW55
Ci0gICAgICAgICAgICAvLyBjYXNlcy4KLSAgICAgICAgICAgIGlmIChjb3VudHMtPm51bUNvbnN0
RGVmcyA9PSAxICYmIGNvdW50cy0+bnVtRGVmcyA9PSAxKQotICAgICAgICAgICAgICAgIHVzZXMg
Lz0gMjsKLQotICAgICAgICAgICAgcmV0dXJuIGRlZ3JlZSAvIHVzZXM7Ci0gICAgICAgIH07Ci0K
LSAgICAgICAgYXV0byB2aWN0aW1JdGVyYXRvciA9IGl0ZXJhdG9yOwotICAgICAgICBkb3VibGUg
bWF4U2NvcmUgPSBzY29yZShBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRl
SW5kZXgoKml0ZXJhdG9yKSk7Ci0KLSAgICAgICAgKytpdGVyYXRvcjsKLSAgICAgICAgZm9yICg7
aXRlcmF0b3IgIT0gbV9zcGlsbFdvcmtsaXN0LmVuZCgpOyArK2l0ZXJhdG9yKSB7Ci0gICAgICAg
ICAgICBkb3VibGUgdG1wU2NvcmUgPSBzY29yZShBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1w
RnJvbUFic29sdXRlSW5kZXgoKml0ZXJhdG9yKSk7Ci0gICAgICAgICAgICBpZiAodG1wU2NvcmUg
PiBtYXhTY29yZSkgewotICAgICAgICAgICAgICAgIEFTU0VSVCghbV91bnNwaWxsYWJsZVRtcHMu
Y29udGFpbnMoKml0ZXJhdG9yKSk7Ci0gICAgICAgICAgICAgICAgdmljdGltSXRlcmF0b3IgPSBp
dGVyYXRvcjsKLSAgICAgICAgICAgICAgICBtYXhTY29yZSA9IHRtcFNjb3JlOwotICAgICAgICAg
ICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdW5zaWduZWQgdmljdGltSW5kZXggPSAqdmljdGlt
SXRlcmF0b3I7Ci0gICAgICAgIG1fc3BpbGxXb3JrbGlzdC5yZW1vdmUodmljdGltSXRlcmF0b3Ip
OwotICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuYXBwZW5kKHZpY3RpbUluZGV4KTsKLQotICAg
ICAgICBmcmVlemVNb3Zlcyh2aWN0aW1JbmRleCk7Ci0gICAgfQotCi0gICAgdm9pZCBhbGxvY2F0
ZSgpCi0gICAgewotICAgICAgICBBU1NFUlRfV0lUSF9NRVNTQUdFKG1fYWN0aXZlTW92ZXMuc2l6
ZSgpID49IG1fY29hbGVzY2luZ0NhbmRpZGF0ZXMuc2l6ZSgpLCAiVGhlIGFjdGl2ZU1vdmUgc2V0
IHNob3VsZCBiZSBiaWcgZW5vdWdoIGZvciB0aGUgcXVpY2sgb3BlcmF0aW9ucyBvZiBCaXRWZWN0
b3IuIik7Ci0KLSAgICAgICAgbWFrZVdvcmtMaXN0KCk7Ci0KLSAgICAgICAgaWYgKGRlYnVnKSB7
Ci0gICAgICAgICAgICBkYXRhTG9nKCJJbnRlcmZlcmVuY2U6ICIsIGxpc3REdW1wKG1faW50ZXJm
ZXJlbmNlRWRnZXMpLCAiXG4iKTsKLSAgICAgICAgICAgIGR1bXBJbnRlcmZlcmVuY2VHcmFwaElu
RG90KFdURjo6ZGF0YUZpbGUoKSk7Ci0gICAgICAgICAgICBkYXRhTG9nKCJDb2FsZXNjaW5nIGNh
bmRpZGF0ZXM6XG4iKTsKLSAgICAgICAgICAgIGZvciAoTW92ZU9wZXJhbmRzJiBtb3ZlT3AgOiBt
X2NvYWxlc2NpbmdDYW5kaWRhdGVzKSB7Ci0gICAgICAgICAgICAgICAgZGF0YUxvZygiICAgICIs
IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleChtb3ZlT3Auc3Jj
SW5kZXgpLAotICAgICAgICAgICAgICAgICAgICAiIC0+ICIsIEFic29sdXRlVG1wTWFwcGVyPHR5
cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleChtb3ZlT3AuZHN0SW5kZXgpLCAiXG4iKTsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgIGRhdGFMb2coIkluaXRpYWwgd29yayBsaXN0XG4iKTsKLSAg
ICAgICAgICAgIGR1bXBXb3JrTGlzdHMoV1RGOjpkYXRhRmlsZSgpKTsKLSAgICAgICAgfQotCi0g
ICAgICAgIGRvIHsKLSAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKSB7Ci0gICAgICAgICAgICAg
ICAgZGF0YUxvZygiQmVmb3JlIEdyYXBoIHNpbXBsaWZpY2F0aW9uIGl0ZXJhdGlvblxuIik7Ci0g
ICAgICAgICAgICAgICAgZHVtcFdvcmtMaXN0cyhXVEY6OmRhdGFGaWxlKCkpOwotICAgICAgICAg
ICAgfQotCi0gICAgICAgICAgICBpZiAoIW1fc2ltcGxpZnlXb3JrbGlzdC5pc0VtcHR5KCkpCi0g
ICAgICAgICAgICAgICAgc2ltcGxpZnkoKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKCFtX3dvcmts
aXN0TW92ZXMuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIGNvYWxlc2NlKCk7Ci0gICAgICAg
ICAgICBlbHNlIGlmICghbV9mcmVlemVXb3JrbGlzdC5pc0VtcHR5KCkpCi0gICAgICAgICAgICAg
ICAgZnJlZXplKCk7Ci0gICAgICAgICAgICBlbHNlIGlmICghbV9zcGlsbFdvcmtsaXN0LmlzRW1w
dHkoKSkKLSAgICAgICAgICAgICAgICBzZWxlY3RTcGlsbCgpOwotCi0gICAgICAgICAgICBpZiAo
dHJhY2VEZWJ1ZykgewotICAgICAgICAgICAgICAgIGRhdGFMb2coIkFmdGVyIEdyYXBoIHNpbXBs
aWZpY2F0aW9uIGl0ZXJhdGlvblxuIik7Ci0gICAgICAgICAgICAgICAgZHVtcFdvcmtMaXN0cyhX
VEY6OmRhdGFGaWxlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlICghbV9zaW1w
bGlmeVdvcmtsaXN0LmlzRW1wdHkoKSB8fCAhbV93b3JrbGlzdE1vdmVzLmlzRW1wdHkoKSB8fCAh
bV9mcmVlemVXb3JrbGlzdC5pc0VtcHR5KCkgfHwgIW1fc3BpbGxXb3JrbGlzdC5pc0VtcHR5KCkp
OwotCi0gICAgICAgIGFzc2lnbkNvbG9ycygpOwotICAgIH0KLQotI2lmIFBMQVRGT1JNKENPQ09B
KQotI3ByYWdtYSBtYXJrIC0gRGVidWdnaW5nIGhlbHBlcnMuCi0jZW5kaWYKLQotICAgIHZvaWQg
ZHVtcEludGVyZmVyZW5jZUdyYXBoSW5Eb3QoUHJpbnRTdHJlYW0mIG91dCkKLSAgICB7Ci0gICAg
ICAgIG91dC5wcmludCgiZ3JhcGggSW50ZXJmZXJlbmNlR3JhcGggeyBcbiIpOwotCi0gICAgICAg
IEhhc2hTZXQ8VG1wPiB0bXBzV2l0aEludGVyZmVyZW5jZXM7Ci0gICAgICAgIGZvciAoY29uc3Qg
YXV0byYgZWRnZSA6IG1faW50ZXJmZXJlbmNlRWRnZXMpIHsKLSAgICAgICAgICAgIHRtcHNXaXRo
SW50ZXJmZXJlbmNlcy5hZGQoQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0
ZUluZGV4KGVkZ2UuZmlyc3QoKSkpOwotICAgICAgICAgICAgdG1wc1dpdGhJbnRlcmZlcmVuY2Vz
LmFkZChBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgoZWRnZS5z
ZWNvbmQoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiB0bXAgOiB0
bXBzV2l0aEludGVyZmVyZW5jZXMpIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIHRtcEluZGV4ID0g
QWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodG1wKTsKLSAgICAgICAgICAg
IGlmICh0bXBJbmRleCA8IG1fZGVncmVlcy5zaXplKCkpCi0gICAgICAgICAgICAgICAgb3V0LnBy
aW50KCIgICAgIiwgdG1wLmludGVybmFsVmFsdWUoKSwgIiBbbGFiZWw9XCIiLCB0bXAsICIgKCIs
IG1fZGVncmVlc1t0bXBJbmRleF0sICIpXCJdO1xuIik7Ci0gICAgICAgICAgICBlbHNlCi0gICAg
ICAgICAgICAgICAgb3V0LnByaW50KCIgICAgIiwgdG1wLmludGVybmFsVmFsdWUoKSwgIiBbbGFi
ZWw9XCIiLCB0bXAsICJcIl07XG4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoY29uc3Qg
YXV0byYgZWRnZSA6IG1faW50ZXJmZXJlbmNlRWRnZXMpCi0gICAgICAgICAgICBvdXQucHJpbnQo
IiAgICAiLCBlZGdlLmZpcnN0KCksICIgLS0gIiwgZWRnZS5zZWNvbmQoKSwgIjtcbiIpOwotICAg
ICAgICBvdXQucHJpbnQoIn1cbiIpOwotICAgIH0KLQotICAgIHZvaWQgZHVtcFdvcmtMaXN0cyhQ
cmludFN0cmVhbSYgb3V0KQotICAgIHsKLSAgICAgICAgb3V0LnByaW50KCJTaW1wbGlmeSB3b3Jr
IGxpc3Q6XG4iKTsKLSAgICAgICAgZm9yICh1bnNpZ25lZCB0bXBJbmRleCA6IG1fc2ltcGxpZnlX
b3JrbGlzdCkKLSAgICAgICAgICAgIG91dC5wcmludCgiICAgICIsIEFic29sdXRlVG1wTWFwcGVy
PHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleCh0bXBJbmRleCksICJcbiIpOwotICAgICAgICBv
dXQucHJpbnRmKCJNb3ZlcyB3b3JrIGxpc3QgaXMgZW1wdHk/ICVkXG4iLCBtX3dvcmtsaXN0TW92
ZXMuaXNFbXB0eSgpKTsKLSAgICAgICAgb3V0LnByaW50KCJGcmVlemUgd29yayBsaXN0OlxuIik7
Ci0gICAgICAgIGZvciAodW5zaWduZWQgdG1wSW5kZXggOiBtX2ZyZWV6ZVdvcmtsaXN0KQotICAg
ICAgICAgICAgb3V0LnByaW50KCIgICAgIiwgQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZy
b21BYnNvbHV0ZUluZGV4KHRtcEluZGV4KSwgIlxuIik7Ci0gICAgICAgIG91dC5wcmludCgiU3Bp
bGwgd29yayBsaXN0OlxuIik7Ci0gICAgICAgIGZvciAodW5zaWduZWQgdG1wSW5kZXggOiBtX3Nw
aWxsV29ya2xpc3QpCi0gICAgICAgICAgICBvdXQucHJpbnQoIiAgICAiLCBBYnNvbHV0ZVRtcE1h
cHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgodG1wSW5kZXgpLCAiXG4iKTsKLSAgICB9
Ci0KLSAgICB1c2luZyBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yPHVuc2lnbmVkPjo6YWRkRWRn
ZTsKLSAgICB1c2luZyBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yPHVuc2lnbmVkPjo6Z2V0QWxp
YXM7Ci0KLSAgICBDb2RlJiBtX2NvZGU7CiAgICAgVG1wV2lkdGgmIG1fdG1wV2lkdGg7Ci0gICAg
Ly8gRklYTUU6IHNwaWxsaW5nIHNob3VsZCBub3QgdHlwZSBzcGVjaWZpYy4gSXQgaXMgb25seSBh
IHNpZGUgZWZmZWN0IG9mIHVzaW5nIFVzZUNvdW50cy4KLSAgICBjb25zdCBVc2VDb3VudHM8VG1w
PiYgbV91c2VDb3VudHM7CiB9OwogCi1jbGFzcyBJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZyB7
CitjbGFzcyBHcmFwaENvbG9yaW5nUmVnaXN0ZXJBbGxvY2F0aW9uIHsKIHB1YmxpYzoKLSAgICBJ
dGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZyhDb2RlJiBjb2RlKQorICAgIEdyYXBoQ29sb3JpbmdS
ZWdpc3RlckFsbG9jYXRpb24oQ29kZSYgY29kZSwgVXNlQ291bnRzPFRtcD4mIHVzZUNvdW50cykK
ICAgICAgICAgOiBtX2NvZGUoY29kZSkKLSAgICAgICAgLCBtX3VzZUNvdW50cyhjb2RlKQorICAg
ICAgICAsIG1fdXNlQ291bnRzKHVzZUNvdW50cykKICAgICB7CiAgICAgfQogCiAgICAgdm9pZCBy
dW4oKQogICAgIHsKICAgICAgICAgcGFkSW50ZXJmZXJlbmNlKG1fY29kZSk7Ci0gICAgICAgIAot
ICAgICAgICBpdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZ09uVHlwZTxBcmc6OkdQPigpOwotICAg
ICAgICBpdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZ09uVHlwZTxBcmc6OkZQPigpOworCisgICAg
ICAgIGFsbG9jYXRlT25UeXBlPEFyZzo6R1A+KCk7CisgICAgICAgIG1fbnVtSXRlcmF0aW9ucyA9
IDA7CisgICAgICAgIGFsbG9jYXRlT25UeXBlPEFyZzo6RlA+KCk7CiAKICAgICAgICAgZml4U3Bp
bGxzQWZ0ZXJUZXJtaW5hbHMoKTsKIApAQCAtMTI4Miw3ICsxNzQyLDcgQEAgcHVibGljOgogCiBw
cml2YXRlOgogICAgIHRlbXBsYXRlPEFyZzo6VHlwZSB0eXBlPgotICAgIHZvaWQgaXRlcmF0ZWRS
ZWdpc3RlckNvYWxlc2NpbmdPblR5cGUoKQorICAgIHZvaWQgYWxsb2NhdGVPblR5cGUoKQogICAg
IHsKICAgICAgICAgSGFzaFNldDx1bnNpZ25lZD4gdW5zcGlsbGFibGVUbXBzID0gY29tcHV0ZVVu
c3BpbGxhYmxlVG1wczx0eXBlPigpOwogCkBAIC0xMzExLDIyICsxNzcxLDM4IEBAIHByaXZhdGU6
CiAgICAgICAgICAgICAvLyByZWNvbXB1dGF0aW9uLCBpbiB3aGljaCBjYXNlIHNwZWVkaW5nIHVw
IHRoZSBsb29rdXAgd291bGQgYmUgYSBiaWdnZXIgd2luLgogICAgICAgICAgICAgLy8gaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1MjQ3OAogICAgICAgICAgICAgbV90
bXBXaWR0aC5yZWNvbXB1dGUobV9jb2RlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgQ29s
b3JpbmdBbGxvY2F0b3I8dHlwZT4gYWxsb2NhdG9yKG1fY29kZSwgbV90bXBXaWR0aCwgbV91c2VD
b3VudHMsIHVuc3BpbGxhYmxlVG1wcyk7Ci0gICAgICAgICAgICBpZiAoIWFsbG9jYXRvci5yZXF1
aXJlc1NwaWxsaW5nKCkpIHsKLSAgICAgICAgICAgICAgICBhc3NpZ25SZWdpc3RlcnNUb1RtcChh
bGxvY2F0b3IpOwotICAgICAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQotICAgICAgICAgICAg
ICAgICAgICBkYXRhTG9nKCJTdWNjZXNzZnVsbCBhbGxvY2F0aW9uIGF0IGl0ZXJhdGlvbiAiLCBt
X251bUl0ZXJhdGlvbnMsICI6XG4iLCBtX2NvZGUpOwogCi0gICAgICAgICAgICAgICAgcmV0dXJu
OworICAgICAgICAgICAgYXV0byBkb0FsbG9jYXRpb24gPSBbJl0gKGF1dG8mIGFsbG9jYXRvcikg
LT4gYm9vbCB7CisgICAgICAgICAgICAgICAgYWxsb2NhdG9yLmFsbG9jYXRlKCk7CisgICAgICAg
ICAgICAgICAgaWYgKCFhbGxvY2F0b3IucmVxdWlyZXNTcGlsbGluZygpKSB7CisgICAgICAgICAg
ICAgICAgICAgIHRoaXMtPmFzc2lnblJlZ2lzdGVyc1RvVG1wPHR5cGU+KGFsbG9jYXRvcik7Cisg
ICAgICAgICAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQorICAgICAgICAgICAgICAgICAgICAg
ICAgZGF0YUxvZygiU3VjY2Vzc2Z1bGwgYWxsb2NhdGlvbiBhdCBpdGVyYXRpb24gIiwgbV9udW1J
dGVyYXRpb25zLCAiOlxuIiwgbV9jb2RlKTsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0aGlzLT5hZGRTcGls
bEFuZEZpbGw8dHlwZT4oYWxsb2NhdG9yLCB1bnNwaWxsYWJsZVRtcHMpOworICAgICAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICAKKyAgICAgICAg
ICAgIGJvb2wgZG9uZTsKKyAgICAgICAgICAgIGlmICgoaXNBUk02NCgpIHx8IE9wdGlvbnM6OmFp
ckZvcmNlQnJpZ2dzQWxsb2NhdG9yKCkpICYmICFPcHRpb25zOjphaXJGb3JjZUlSQ0FsbG9jYXRv
cigpKSB7CisgICAgICAgICAgICAgICAgQ29sb3JpbmdBbGxvY2F0b3I8dHlwZSwgQnJpZ2dzPiBh
bGxvY2F0b3IobV9jb2RlLCBtX3RtcFdpZHRoLCBtX3VzZUNvdW50cywgdW5zcGlsbGFibGVUbXBz
KTsKKyAgICAgICAgICAgICAgICBkb25lID0gZG9BbGxvY2F0aW9uKGFsbG9jYXRvcik7CisgICAg
ICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIENvbG9yaW5nQWxsb2NhdG9yPHR5cGUs
IElSQz4gYWxsb2NhdG9yKG1fY29kZSwgbV90bXBXaWR0aCwgbV91c2VDb3VudHMsIHVuc3BpbGxh
YmxlVG1wcyk7CisgICAgICAgICAgICAgICAgZG9uZSA9IGRvQWxsb2NhdGlvbihhbGxvY2F0b3Ip
OwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYWRkU3BpbGxBbmRGaWxsPHR5cGU+KGFsbG9j
YXRvciwgdW5zcGlsbGFibGVUbXBzKTsKKyAgICAgICAgICAgIGlmIChkb25lKQorICAgICAgICAg
ICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgIH0KIAogICAgIHRlbXBsYXRlPEFyZzo6VHlw
ZSB0eXBlPgogICAgIEhhc2hTZXQ8dW5zaWduZWQ+IGNvbXB1dGVVbnNwaWxsYWJsZVRtcHMoKQog
ICAgIHsKKwogICAgICAgICBIYXNoU2V0PHVuc2lnbmVkPiB1bnNwaWxsYWJsZVRtcHM7CiAKICAg
ICAgICAgc3RydWN0IFJhbmdlIHsKQEAgLTEzOTAsOCArMTg2Niw4IEBAIHByaXZhdGU6CiAgICAg
ICAgIHJldHVybiB1bnNwaWxsYWJsZVRtcHM7CiAgICAgfQogCi0gICAgdGVtcGxhdGU8QXJnOjpU
eXBlIHR5cGU+Ci0gICAgdm9pZCBhc3NpZ25SZWdpc3RlcnNUb1RtcChjb25zdCBDb2xvcmluZ0Fs
bG9jYXRvcjx0eXBlPiYgYWxsb2NhdG9yKQorICAgIHRlbXBsYXRlPEFyZzo6VHlwZSB0eXBlLCB0
eXBlbmFtZSBBbGxvY2F0b3JUeXBlPgorICAgIHZvaWQgYXNzaWduUmVnaXN0ZXJzVG9UbXAoY29u
c3QgQWxsb2NhdG9yVHlwZSYgYWxsb2NhdG9yKQogICAgIHsKICAgICAgICAgZm9yIChCYXNpY0Js
b2NrKiBibG9jayA6IG1fY29kZSkgewogICAgICAgICAgICAgLy8gR2l2ZSBUbXAgYSB2YWxpZCBy
ZWdpc3Rlci4KQEAgLTE0NDcsOCArMTkyMyw4IEBAIHByaXZhdGU6CiAgICAgICAgIHJldHVybiB3
aWR0aCA8PSBBcmc6OldpZHRoMzIgPyA0IDogODsKICAgICB9CiAKLSAgICB0ZW1wbGF0ZTxBcmc6
OlR5cGUgdHlwZT4KLSAgICB2b2lkIGFkZFNwaWxsQW5kRmlsbChjb25zdCBDb2xvcmluZ0FsbG9j
YXRvcjx0eXBlPiYgYWxsb2NhdG9yLCBIYXNoU2V0PHVuc2lnbmVkPiYgdW5zcGlsbGFibGVUbXBz
KQorICAgIHRlbXBsYXRlPEFyZzo6VHlwZSB0eXBlLCB0eXBlbmFtZSBBbGxvY2F0b3JUeXBlPgor
ICAgIHZvaWQgYWRkU3BpbGxBbmRGaWxsKGNvbnN0IEFsbG9jYXRvclR5cGUmIGFsbG9jYXRvciwg
SGFzaFNldDx1bnNpZ25lZD4mIHVuc3BpbGxhYmxlVG1wcykKICAgICB7CiAgICAgICAgIEhhc2hN
YXA8VG1wLCBTdGFja1Nsb3QqPiBzdGFja1Nsb3RzOwogICAgICAgICBmb3IgKFRtcCB0bXAgOiBh
bGxvY2F0b3Iuc3BpbGxlZFRtcHMoKSkgewpAQCAtMTYzNywxOCArMjExMywxOSBAQCBwcml2YXRl
OgogCiAgICAgQ29kZSYgbV9jb2RlOwogICAgIFRtcFdpZHRoIG1fdG1wV2lkdGg7Ci0gICAgVXNl
Q291bnRzPFRtcD4gbV91c2VDb3VudHM7CisgICAgVXNlQ291bnRzPFRtcD4mIG1fdXNlQ291bnRz
OwogICAgIHVuc2lnbmVkIG1fbnVtSXRlcmF0aW9ucyB7IDAgfTsKIH07CiAKIH0gLy8gYW5vbnlt
b3VzIG5hbWVzcGFjZQogCi12b2lkIGl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nKENvZGUmIGNv
ZGUpCit2b2lkIGFsbG9jYXRlUmVnaXN0ZXJzQnlHcmFwaENvbG9yaW5nKENvZGUmIGNvZGUpCiB7
Ci0gICAgUGhhc2VTY29wZSBwaGFzZVNjb3BlKGNvZGUsICJpdGVyYXRlZFJlZ2lzdGVyQ29hbGVz
Y2luZyIpOwotICAgIAotICAgIEl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nIGl0ZXJhdGVkUmVn
aXN0ZXJDb2FsZXNjaW5nKGNvZGUpOwotICAgIGl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nLnJ1
bigpOworICAgIFBoYXNlU2NvcGUgcGhhc2VTY29wZShjb2RlLCAiQWlyOjphbGxvY2F0ZVJlZ2lz
dGVyc0J5R3JhcGhDb2xvcmluZyIpOworCisgICAgVXNlQ291bnRzPFRtcD4gdXNlQ291bnRzKGNv
ZGUpOworICAgIEdyYXBoQ29sb3JpbmdSZWdpc3RlckFsbG9jYXRpb24gZ3JhcGhDb2xvcmluZ1Jl
Z2lzdGVyQWxsb2NhdGlvbihjb2RlLCB1c2VDb3VudHMpOworICAgIGdyYXBoQ29sb3JpbmdSZWdp
c3RlckFsbG9jYXRpb24ucnVuKCk7CiB9CiAKIH0gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpB
aXIKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyR3JhcGhDb2xvcmluZy5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyR3JhcGhDb2xv
cmluZy5oCShyZXZpc2lvbiAyMTI3OTcpCShmcm9tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9h
aXIvQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuaDoyMTI3OTcpCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvYWlyL0FpckdyYXBoQ29sb3JpbmcuaAkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8K
KworI3ByYWdtYSBvbmNlCisKKyNpZiBFTkFCTEUoQjNfSklUKQorCituYW1lc3BhY2UgSlNDIHsg
bmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlIEFpciB7CisKK2NsYXNzIENvZGU7CisKKy8vIFRoaXMg
aXMgYSByZWdpc3RlciBhbGxvY2F0aW9uIHBoYXNlIGJhc2VkIG9uIEFuZHJldyBBcHBlbCdzIEl0
ZXJhdGVkIFJlZ2lzdGVyIENvYWxlc2NpbmcKKy8vIGh0dHA6Ly93d3cuY3MuY211LmVkdS9hZnMv
Y3MvYWNhZGVtaWMvY2xhc3MvMTU3NDUtczA3L3d3dy9wYXBlcnMvZ2VvcmdlLnBkZgordm9pZCBp
dGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZyhDb2RlJik7CisKK30gfSB9IC8vIG5hbWVzcGFjZSBK
U0M6OkIzOjpBaXIKKworI2VuZGlmIC8vIEVOQUJMRShCM19KSVQpCkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYjMvYWlyL0FpckdyYXBoQ29sb3JpbmcuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckdyYXBoQ29sb3JpbmcuaAkocmV2aXNpb24gMjEy
Nzk3KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJHcmFwaENvbG9yaW5nLmgJ
KHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDE1
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxNS0y
MDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucwpAQCAtMzEsOSArMzEsMTYgQEAgbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBC
MyB7IG5hbWVzcGFjZQogCiBjbGFzcyBDb2RlOwogCi0vLyBUaGlzIGlzIGEgcmVnaXN0ZXIgYWxs
b2NhdGlvbiBwaGFzZSBiYXNlZCBvbiBBbmRyZXcgQXBwZWwncyBJdGVyYXRlZCBSZWdpc3RlciBD
b2FsZXNjaW5nCisvLyBXZSBoYXZlIHR3byByZWdpc3RlciBhbGxvY2F0b3JzLCBib3RoIGZ1bmRh
bWVudGFsbHkgZGVyaXZlZCBmcm9tIENoYWl0aW4ncyBZb3JrdG93bgorLy8gYWxsb2NhdG9yOgor
Ly8gaHR0cDovL2NzLmdtdS5lZHUvfndoaXRlL0NTNjQwL3A5OC1jaGFpdGluLnBkZgorLy8KKy8v
IFdlIGhhdmUgYW4gaW1wbGVtZW50YXRpb24gb2YgQnJpZ2dzJ3Mgb3B0aW1pc3RpYyBhbGxvY2F0
b3Igd2hpY2ggaXMgZGVyaXZhdGl2ZSBvZiBDaGFpdGluJ3MgYWxsb2NhdG9yOgorLy8gaHR0cDov
L3d3dy5jcy51dGV4YXMuZWR1L3VzZXJzL21ja2lubGV5LzM4MEMvbGVjcy9icmlnZ3MtdGhlc2lz
LTE5OTIucGRmCisvLworLy8gQW5kIGFuIGltcGxlbWVudGF0aW9uIG9mIEFuZHJldyBBcHBlbCdz
IEl0ZXJhdGVkIFJlZ2lzdGVyIENvYWxlc2Npbmcgd2hpY2ggaXMgZGVyaXZhdGl2ZSBvZiBCcmln
Z3MncyBhbGxvY2F0b3IuCiAvLyBodHRwOi8vd3d3LmNzLmNtdS5lZHUvYWZzL2NzL2FjYWRlbWlj
L2NsYXNzLzE1NzQ1LXMwNy93d3cvcGFwZXJzL2dlb3JnZS5wZGYKLXZvaWQgaXRlcmF0ZWRSZWdp
c3RlckNvYWxlc2NpbmcoQ29kZSYpOwordm9pZCBhbGxvY2F0ZVJlZ2lzdGVyc0J5R3JhcGhDb2xv
cmluZyhDb2RlJik7CiAKIH0gfSB9IC8vIG5hbWVzcGFjZSBKU0M6OkIzOjpBaXIKIApJbmRleDog
U291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2lu
Zy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJJdGVy
YXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5jcHAJKHJldmlzaW9uIDIxMjc5NykKKysrIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9iMy9haXIvQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuY3BwCShu
b25leGlzdGVudCkKQEAgLTEsMTY1NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1
LTIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAot
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQot
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKLSAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAotICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCi0gKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi0gKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAi
QWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuaCIKLQotI2lmIEVOQUJMRShCM19KSVQpCi0K
LSNpbmNsdWRlICJBaXJDb2RlLmgiCi0jaW5jbHVkZSAiQWlySW5zZXJ0aW9uU2V0LmgiCi0jaW5j
bHVkZSAiQWlySW5zdElubGluZXMuaCIKLSNpbmNsdWRlICJBaXJMaXZlbmVzcy5oIgotI2luY2x1
ZGUgIkFpclBhZEludGVyZmVyZW5jZS5oIgotI2luY2x1ZGUgIkFpclBoYXNlU2NvcGUuaCIKLSNp
bmNsdWRlICJBaXJUbXBJbmxpbmVzLmgiCi0jaW5jbHVkZSAiQWlyVG1wV2lkdGguaCIKLSNpbmNs
dWRlICJBaXJVc2VDb3VudHMuaCIKLSNpbmNsdWRlIDx3dGYvTGlzdER1bXAuaD4KLQotbmFtZXNw
YWNlIEpTQyB7IG5hbWVzcGFjZSBCMyB7IG5hbWVzcGFjZSBBaXIgewotCi1uYW1lc3BhY2Ugewot
Ci1ib29sIGRlYnVnID0gZmFsc2U7Ci1ib29sIHRyYWNlRGVidWcgPSBmYWxzZTsKLWJvb2wgcmVw
b3J0U3RhdHMgPSBmYWxzZTsKLQotLy8gVGhlIEFic3RyYWN0Q29sb3JpbmdBbGxvY2F0b3IgZGVm
aW5lcyBhbGwgdGhlIGNvZGUgdGhhdCBpcyBpbmRlcGVuZGFudAotLy8gZnJvbSB0aGUgdHlwZSBv
ciByZWdpc3RlciBhbmQgY2FuIGJlIHNoYXJlZCB3aGVuIGFsbG9jYXRpbmcgcmVnaXN0ZXJzLgot
dGVtcGxhdGU8dHlwZW5hbWUgSW5kZXhUeXBlPgotY2xhc3MgQWJzdHJhY3RDb2xvcmluZ0FsbG9j
YXRvciB7Ci1wdWJsaWM6Ci0gICAgQWJzdHJhY3RDb2xvcmluZ0FsbG9jYXRvcihjb25zdCBWZWN0
b3I8UmVnPiYgcmVnc0luUHJpb3JpdHlPcmRlciwgSW5kZXhUeXBlIGxhc3RQcmVjb2xvcmVkUmVn
aXN0ZXJJbmRleCwgdW5zaWduZWQgdG1wQXJyYXlTaXplLCBjb25zdCBIYXNoU2V0PHVuc2lnbmVk
PiYgdW5zcGlsbGFibGVUbXApCi0gICAgICAgIDogbV9yZWdzSW5Qcmlvcml0eU9yZGVyKHJlZ3NJ
blByaW9yaXR5T3JkZXIpCi0gICAgICAgICwgbV9sYXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXgo
bGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4KQotICAgICAgICAsIG1fdW5zcGlsbGFibGVUbXBz
KHVuc3BpbGxhYmxlVG1wKQotICAgIHsKLSAgICAgICAgZm9yIChSZWcgcmVnIDogbV9yZWdzSW5Q
cmlvcml0eU9yZGVyKQotICAgICAgICAgICAgbV9tdXRhYmxlUmVncy5zZXQocmVnKTsKLSAgICAg
ICAgCi0gICAgICAgIGluaXRpYWxpemVEZWdyZWVzKHRtcEFycmF5U2l6ZSk7Ci0gICAgICAgIAot
ICAgICAgICBtX2FkamFjZW5jeUxpc3QucmVzaXplKHRtcEFycmF5U2l6ZSk7Ci0gICAgICAgIG1f
bW92ZUxpc3QucmVzaXplKHRtcEFycmF5U2l6ZSk7Ci0gICAgICAgIG1fY29hbGVzY2VkVG1wcy5m
aWxsKDAsIHRtcEFycmF5U2l6ZSk7Ci0gICAgICAgIG1faXNPblNlbGVjdFN0YWNrLmVuc3VyZVNp
emUodG1wQXJyYXlTaXplKTsKLSAgICB9Ci0KLXByb3RlY3RlZDoKLSAgICBJbmRleFR5cGUgZ2V0
QWxpYXMoSW5kZXhUeXBlIHRtcEluZGV4KSBjb25zdAotICAgIHsKLSAgICAgICAgSW5kZXhUeXBl
IGFsaWFzID0gdG1wSW5kZXg7Ci0gICAgICAgIHdoaWxlIChJbmRleFR5cGUgbmV4dEFsaWFzID0g
bV9jb2FsZXNjZWRUbXBzW2FsaWFzXSkKLSAgICAgICAgICAgIGFsaWFzID0gbmV4dEFsaWFzOwot
ICAgICAgICByZXR1cm4gYWxpYXM7Ci0gICAgfQotCi0gICAgdm9pZCBhZGRFZGdlKEluZGV4VHlw
ZSBhLCBJbmRleFR5cGUgYikKLSAgICB7Ci0gICAgICAgIGlmIChhID09IGIpCi0gICAgICAgICAg
ICByZXR1cm47Ci0gICAgICAgIGFkZEVkZ2VEaXN0aW5jdChhLCBiKTsKLSAgICB9Ci0KLSAgICB2
b2lkIG1ha2VXb3JrTGlzdCgpCi0gICAgewotICAgICAgICBJbmRleFR5cGUgZmlyc3ROb25SZWdJ
bmRleCA9IG1fbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4ICsgMTsKLSAgICAgICAgZm9yIChJ
bmRleFR5cGUgaSA9IGZpcnN0Tm9uUmVnSW5kZXg7IGkgPCBtX2RlZ3JlZXMuc2l6ZSgpOyArK2kp
IHsKLSAgICAgICAgICAgIHVuc2lnbmVkIGRlZ3JlZSA9IG1fZGVncmVlc1tpXTsKLSAgICAgICAg
ICAgIGlmIChkZWdyZWUgPj0gbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKSkKLSAgICAgICAg
ICAgICAgICBhZGRUb1NwaWxsKGkpOwotICAgICAgICAgICAgZWxzZSBpZiAoIW1fbW92ZUxpc3Rb
aV0uaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIG1fZnJlZXplV29ya2xpc3QuYWRkKGkpOwot
ICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG1fc2ltcGxpZnlXb3JrbGlzdC5hcHBl
bmQoaSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGFkZFRvU3BpbGwodW5zaWduZWQg
dG9TcGlsbCkKLSAgICB7Ci0gICAgICAgIGlmIChtX3Vuc3BpbGxhYmxlVG1wcy5jb250YWlucyh0
b1NwaWxsKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBtX3NwaWxsV29ya2xpc3Qu
YWRkKHRvU3BpbGwpOwotICAgIH0KLQotICAgIC8vIExvdy1kZWdyZWUgdmVydGV4IGNhbiBhbHdh
eXMgYmUgY29sb3JlZDoganVzdCBwaWNrIGFueSBvZiB0aGUgY29sb3IgdGFrZW4gYnkgYW55Ci0g
ICAgLy8gb3RoZXIgYWRqYWNlbnQgdmVyaWNlcy4KLSAgICAvLyBUaGUgIlNpbXBsaWZ5IiBwaGFz
ZSB0YWtlcyBhIGxvdy1kZWdyZWUgb3V0IG9mIHRoZSBpbnRlcmZlcmVuY2UgZ3JhcGggdG8gc2lt
cGxpZnkgaXQuCi0gICAgdm9pZCBzaW1wbGlmeSgpCi0gICAgewotICAgICAgICBJbmRleFR5cGUg
bGFzdEluZGV4ID0gbV9zaW1wbGlmeVdvcmtsaXN0LnRha2VMYXN0KCk7Ci0KLSAgICAgICAgQVNT
RVJUKCFtX3NlbGVjdFN0YWNrLmNvbnRhaW5zKGxhc3RJbmRleCkpOwotICAgICAgICBBU1NFUlQo
IW1faXNPblNlbGVjdFN0YWNrLmdldChsYXN0SW5kZXgpKTsKLSAgICAgICAgbV9zZWxlY3RTdGFj
ay5hcHBlbmQobGFzdEluZGV4KTsKLSAgICAgICAgbV9pc09uU2VsZWN0U3RhY2sucXVpY2tTZXQo
bGFzdEluZGV4KTsKLQotICAgICAgICBmb3JFYWNoQWRqYWNlbnQobGFzdEluZGV4LCBbdGhpc10o
SW5kZXhUeXBlIGFkamFjZW50VG1wSW5kZXgpIHsKLSAgICAgICAgICAgIGRlY3JlbWVudERlZ3Jl
ZShhZGphY2VudFRtcEluZGV4KTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBmcmVl
emUoKQotICAgIHsKLSAgICAgICAgSW5kZXhUeXBlIHZpY3RpbUluZGV4ID0gbV9mcmVlemVXb3Jr
bGlzdC50YWtlQW55KCk7Ci0gICAgICAgIEFTU0VSVF9XSVRIX01FU1NBR0UoZ2V0QWxpYXModmlj
dGltSW5kZXgpID09IHZpY3RpbUluZGV4LCAiY29hbGVzY2UoKSBzaG91bGQgbm90IGxlYXZlIGFs
aWFzZWQgVG1wIGluIHRoZSB3b3JrbGlzdC4iKTsKLSAgICAgICAgbV9zaW1wbGlmeVdvcmtsaXN0
LmFwcGVuZCh2aWN0aW1JbmRleCk7Ci0gICAgICAgIGZyZWV6ZU1vdmVzKHZpY3RpbUluZGV4KTsK
LSAgICB9Ci0KLSAgICB2b2lkIGZyZWV6ZU1vdmVzKEluZGV4VHlwZSB0bXBJbmRleCkKLSAgICB7
Ci0gICAgICAgIGZvckVhY2hOb2RlTW92ZXModG1wSW5kZXgsIFt0aGlzLCB0bXBJbmRleF0gKElu
ZGV4VHlwZSBtb3ZlSW5kZXgpIHsKLSAgICAgICAgICAgIGlmICghbV9hY3RpdmVNb3Zlcy5xdWlj
a0NsZWFyKG1vdmVJbmRleCkpCi0gICAgICAgICAgICAgICAgbV93b3JrbGlzdE1vdmVzLnRha2VN
b3ZlKG1vdmVJbmRleCk7Ci0KLSAgICAgICAgICAgIGNvbnN0IE1vdmVPcGVyYW5kcyYgbW92ZU9w
ZXJhbmRzID0gbV9jb2FsZXNjaW5nQ2FuZGlkYXRlc1ttb3ZlSW5kZXhdOwotICAgICAgICAgICAg
SW5kZXhUeXBlIHNyY1RtcEluZGV4ID0gbW92ZU9wZXJhbmRzLnNyY0luZGV4OwotICAgICAgICAg
ICAgSW5kZXhUeXBlIGRzdFRtcEluZGV4ID0gbW92ZU9wZXJhbmRzLmRzdEluZGV4OwotCi0gICAg
ICAgICAgICBJbmRleFR5cGUgb3JpZ2luYWxPdGhlclRtcCA9IHNyY1RtcEluZGV4ICE9IHRtcElu
ZGV4ID8gc3JjVG1wSW5kZXggOiBkc3RUbXBJbmRleDsKLSAgICAgICAgICAgIEluZGV4VHlwZSBv
dGhlclRtcEluZGV4ID0gZ2V0QWxpYXMob3JpZ2luYWxPdGhlclRtcCk7Ci0gICAgICAgICAgICBp
ZiAobV9kZWdyZWVzW290aGVyVG1wSW5kZXhdIDwgbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUo
KSAmJiAhaXNNb3ZlUmVsYXRlZChvdGhlclRtcEluZGV4KSkgewotICAgICAgICAgICAgICAgIGlm
IChtX2ZyZWV6ZVdvcmtsaXN0LnJlbW92ZShvdGhlclRtcEluZGV4KSkKLSAgICAgICAgICAgICAg
ICAgICAgbV9zaW1wbGlmeVdvcmtsaXN0LmFwcGVuZChvdGhlclRtcEluZGV4KTsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBjb2FsZXNjZSgpCi0gICAgewot
ICAgICAgICB1bnNpZ25lZCBtb3ZlSW5kZXggPSBtX3dvcmtsaXN0TW92ZXMudGFrZUxhc3RNb3Zl
KCk7Ci0gICAgICAgIGNvbnN0IE1vdmVPcGVyYW5kcyYgbW92ZU9wZXJhbmRzID0gbV9jb2FsZXNj
aW5nQ2FuZGlkYXRlc1ttb3ZlSW5kZXhdOwotICAgICAgICBJbmRleFR5cGUgdSA9IGdldEFsaWFz
KG1vdmVPcGVyYW5kcy5zcmNJbmRleCk7Ci0gICAgICAgIEluZGV4VHlwZSB2ID0gZ2V0QWxpYXMo
bW92ZU9wZXJhbmRzLmRzdEluZGV4KTsKLQotICAgICAgICBpZiAoaXNQcmVjb2xvcmVkKHYpKQot
ICAgICAgICAgICAgc3RkOjpzd2FwKHUsIHYpOwotCi0gICAgICAgIGlmICh0cmFjZURlYnVnKQot
ICAgICAgICAgICAgZGF0YUxvZygiQ29hbGVzY2luZyBtb3ZlIGF0IGluZGV4ICIsIG1vdmVJbmRl
eCwgIiB1ID0gIiwgdSwgIiB2ID0gIiwgdiwgIlxuIik7Ci0KLSAgICAgICAgaWYgKHUgPT0gdikg
ewotICAgICAgICAgICAgYWRkV29ya0xpc3QodSk7Ci0KLSAgICAgICAgICAgIGlmICh0cmFjZURl
YnVnKQotICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICBDb2FsZXNjZWRcbiIpOwotICAgICAg
ICB9IGVsc2UgaWYgKGlzUHJlY29sb3JlZCh2KQotICAgICAgICAgICAgfHwgbV9pbnRlcmZlcmVu
Y2VFZGdlcy5jb250YWlucyhJbnRlcmZlcmVuY2VFZGdlKHUsIHYpKQotICAgICAgICAgICAgfHwg
KHUgPT0gbV9mcmFtZVBvaW50ZXJJbmRleCAmJiBtX2ludGVyZmVyZXNXaXRoRnJhbWVQb2ludGVy
LnF1aWNrR2V0KHYpKSkgewotICAgICAgICAgICAgYWRkV29ya0xpc3QodSk7Ci0gICAgICAgICAg
ICBhZGRXb3JrTGlzdCh2KTsKLQotICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpCi0gICAgICAg
ICAgICAgICAgZGF0YUxvZygiICAgIENvbnN0cmFpbmVkXG4iKTsKLSAgICAgICAgfSBlbHNlIGlm
IChjYW5CZVNhZmVseUNvYWxlc2NlZCh1LCB2KSkgewotICAgICAgICAgICAgY29tYmluZSh1LCB2
KTsKLSAgICAgICAgICAgIGFkZFdvcmtMaXN0KHUpOwotICAgICAgICAgICAgbV9oYXNDb2FsZXNj
ZWROb25Ucml2aWFsTW92ZSA9IHRydWU7Ci0KLSAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQot
ICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICBTYWZlIENvYWxlc2NpbmdcbiIpOwotICAgICAg
ICB9IGVsc2UgewotICAgICAgICAgICAgbV9hY3RpdmVNb3Zlcy5xdWlja1NldChtb3ZlSW5kZXgp
OwotCi0gICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKLSAgICAgICAgICAgICAgICBkYXRhTG9n
KCIgICAgRmFpbGVkIGNvYWxlc2NpbmcsIGFkZGVkIHRvIGFjdGl2ZSBtb3Zlcy5cbiIpOwotICAg
ICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBhc3NpZ25Db2xvcnMoKQotICAgIHsKLSAgICAgICAg
QVNTRVJUKG1fc2ltcGxpZnlXb3JrbGlzdC5pc0VtcHR5KCkpOwotICAgICAgICBBU1NFUlQobV93
b3JrbGlzdE1vdmVzLmlzRW1wdHkoKSk7Ci0gICAgICAgIEFTU0VSVChtX2ZyZWV6ZVdvcmtsaXN0
LmlzRW1wdHkoKSk7Ci0gICAgICAgIEFTU0VSVChtX3NwaWxsV29ya2xpc3QuaXNFbXB0eSgpKTsK
LQotICAgICAgICAvLyBSZWNsYWltIGFzIG11Y2ggbWVtb3J5IGFzIHBvc3NpYmxlLgotICAgICAg
ICBtX2ludGVyZmVyZW5jZUVkZ2VzLmNsZWFyKCk7Ci0gICAgICAgIG1fZGVncmVlcy5jbGVhcigp
OwotICAgICAgICBtX21vdmVMaXN0LmNsZWFyKCk7Ci0gICAgICAgIG1fd29ya2xpc3RNb3Zlcy5j
bGVhcigpOwotICAgICAgICBtX3NpbXBsaWZ5V29ya2xpc3QuY2xlYXIoKTsKLSAgICAgICAgbV9z
cGlsbFdvcmtsaXN0LmNsZWFyKCk7Ci0gICAgICAgIG1fZnJlZXplV29ya2xpc3QuY2xlYXIoKTsK
LQotICAgICAgICAvLyBUcnkgdG8gY29sb3IgdGhlIFRtcCBvbiB0aGUgc3RhY2suCi0gICAgICAg
IG1fY29sb3JlZFRtcC5yZXNpemUobV9hZGphY2VuY3lMaXN0LnNpemUoKSk7Ci0KLSAgICAgICAg
d2hpbGUgKCFtX3NlbGVjdFN0YWNrLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgdW5zaWduZWQg
dG1wSW5kZXggPSBtX3NlbGVjdFN0YWNrLnRha2VMYXN0KCk7Ci0gICAgICAgICAgICBBU1NFUlQo
IWlzUHJlY29sb3JlZCh0bXBJbmRleCkpOwotICAgICAgICAgICAgQVNTRVJUKCFtX2NvbG9yZWRU
bXBbdG1wSW5kZXhdKTsKLQotICAgICAgICAgICAgUmVnaXN0ZXJTZXQgY29sb3JlZFJlZ2lzdGVy
czsKLSAgICAgICAgICAgIGZvciAoSW5kZXhUeXBlIGFkamFjZW50VG1wSW5kZXggOiBtX2FkamFj
ZW5jeUxpc3RbdG1wSW5kZXhdKSB7Ci0gICAgICAgICAgICAgICAgSW5kZXhUeXBlIGFsaWFzVG1w
SW5kZXggPSBnZXRBbGlhcyhhZGphY2VudFRtcEluZGV4KTsKLSAgICAgICAgICAgICAgICBSZWcg
cmVnID0gbV9jb2xvcmVkVG1wW2FsaWFzVG1wSW5kZXhdOwotCi0gICAgICAgICAgICAgICAgQVNT
RVJUKCFpc1ByZWNvbG9yZWQoYWxpYXNUbXBJbmRleCkgfHwgKGlzUHJlY29sb3JlZChhbGlhc1Rt
cEluZGV4KSAmJiByZWcpKTsKLQotICAgICAgICAgICAgICAgIGlmIChyZWcpCi0gICAgICAgICAg
ICAgICAgICAgIGNvbG9yZWRSZWdpc3RlcnMuc2V0KHJlZyk7Ci0gICAgICAgICAgICB9Ci0KLSAg
ICAgICAgICAgIGJvb2wgY29sb3JBc3NpZ25lZCA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChS
ZWcgcmVnIDogbV9yZWdzSW5Qcmlvcml0eU9yZGVyKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFj
b2xvcmVkUmVnaXN0ZXJzLmdldChyZWcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fY29sb3Jl
ZFRtcFt0bXBJbmRleF0gPSByZWc7Ci0gICAgICAgICAgICAgICAgICAgIGNvbG9yQXNzaWduZWQg
PSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghY29sb3JBc3NpZ25lZCkKLSAgICAgICAg
ICAgICAgICBtX3NwaWxsZWRUbXBzLmFwcGVuZCh0bXBJbmRleCk7Ci0gICAgICAgIH0KLSAgICAg
ICAgbV9zZWxlY3RTdGFjay5jbGVhcigpOwotCi0gICAgICAgIGlmIChtX3NwaWxsZWRUbXBzLmlz
RW1wdHkoKSkKLSAgICAgICAgICAgIG1fY29hbGVzY2VkVG1wc0F0U3BpbGwuY2xlYXIoKTsKLSAg
ICAgICAgZWxzZQotICAgICAgICAgICAgbV9jb2xvcmVkVG1wLmNsZWFyKCk7Ci0gICAgfQotCi1w
cml2YXRlOgotICAgIHZvaWQgaW5pdGlhbGl6ZURlZ3JlZXModW5zaWduZWQgdG1wQXJyYXlTaXpl
KQotICAgIHsKLSAgICAgICAgbV9kZWdyZWVzLnJlc2l6ZSh0bXBBcnJheVNpemUpOwotCi0gICAg
ICAgIC8vIEFsbCBwcmVjb2xvcmVkIHJlZ2lzdGVycyBoYXZlICBhbiAiaW5maW5pdGUiIGRlZ3Jl
ZS4KLSAgICAgICAgdW5zaWduZWQgZmlyc3ROb25SZWdJbmRleCA9IG1fbGFzdFByZWNvbG9yZWRS
ZWdpc3RlckluZGV4ICsgMTsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGZpcnN0
Tm9uUmVnSW5kZXg7ICsraSkKLSAgICAgICAgICAgIG1fZGVncmVlc1tpXSA9IHN0ZDo6bnVtZXJp
Y19saW1pdHM8dW5zaWduZWQ+OjptYXgoKTsKLQotICAgICAgICBtZW1zZXQobV9kZWdyZWVzLmRh
dGEoKSArIGZpcnN0Tm9uUmVnSW5kZXgsIDAsICh0bXBBcnJheVNpemUgLSBmaXJzdE5vblJlZ0lu
ZGV4KSAqIHNpemVvZih1bnNpZ25lZCkpOwotICAgIH0KLQotICAgIHZvaWQgYWRkRWRnZURpc3Rp
bmN0KEluZGV4VHlwZSBhLCBJbmRleFR5cGUgYikKLSAgICB7Ci0gICAgICAgIEFTU0VSVChhICE9
IGIpOwotICAgICAgICBpZiAobV9pbnRlcmZlcmVuY2VFZGdlcy5hZGQoSW50ZXJmZXJlbmNlRWRn
ZShhLCBiKSkuaXNOZXdFbnRyeSkgewotICAgICAgICAgICAgaWYgKCFpc1ByZWNvbG9yZWQoYSkp
IHsKLSAgICAgICAgICAgICAgICBBU1NFUlQoIW1fYWRqYWNlbmN5TGlzdFthXS5jb250YWlucyhi
KSk7Ci0gICAgICAgICAgICAgICAgbV9hZGphY2VuY3lMaXN0W2FdLmFwcGVuZChiKTsKLSAgICAg
ICAgICAgICAgICBtX2RlZ3JlZXNbYV0rKzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAg
aWYgKCFpc1ByZWNvbG9yZWQoYikpIHsKLSAgICAgICAgICAgICAgICBBU1NFUlQoIW1fYWRqYWNl
bmN5TGlzdFtiXS5jb250YWlucyhhKSk7Ci0gICAgICAgICAgICAgICAgbV9hZGphY2VuY3lMaXN0
W2JdLmFwcGVuZChhKTsKLSAgICAgICAgICAgICAgICBtX2RlZ3JlZXNbYl0rKzsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZGVjcmVtZW50RGVncmVlKEluZGV4
VHlwZSB0bXBJbmRleCkKLSAgICB7Ci0gICAgICAgIEFTU0VSVChtX2RlZ3JlZXNbdG1wSW5kZXhd
KTsKLQotICAgICAgICB1bnNpZ25lZCBvbGREZWdyZWUgPSBtX2RlZ3JlZXNbdG1wSW5kZXhdLS07
Ci0gICAgICAgIGlmIChvbGREZWdyZWUgPT0gbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKSkg
ewotICAgICAgICAgICAgZW5hYmxlTW92ZXNPblZhbHVlQW5kQWRqYWNlbnRzKHRtcEluZGV4KTsK
LSAgICAgICAgICAgIG1fc3BpbGxXb3JrbGlzdC5yZW1vdmUodG1wSW5kZXgpOwotICAgICAgICAg
ICAgaWYgKGlzTW92ZVJlbGF0ZWQodG1wSW5kZXgpKQotICAgICAgICAgICAgICAgIG1fZnJlZXpl
V29ya2xpc3QuYWRkKHRtcEluZGV4KTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAg
ICBtX3NpbXBsaWZ5V29ya2xpc3QuYXBwZW5kKHRtcEluZGV4KTsKLSAgICAgICAgfQotICAgIH0K
LQotCi0gICAgYm9vbCBhZGRFZGdlRGlzdGluY3RXaXRob3V0RGVncmVlQ2hhbmdlKEluZGV4VHlw
ZSBhLCBJbmRleFR5cGUgYikKLSAgICB7Ci0gICAgICAgIEFTU0VSVChhICE9IGIpOwotICAgICAg
ICBpZiAobV9pbnRlcmZlcmVuY2VFZGdlcy5hZGQoSW50ZXJmZXJlbmNlRWRnZShhLCBiKSkuaXNO
ZXdFbnRyeSkgewotICAgICAgICAgICAgaWYgKCFpc1ByZWNvbG9yZWQoYSkpIHsKLSAgICAgICAg
ICAgICAgICBBU1NFUlQoIW1fYWRqYWNlbmN5TGlzdFthXS5jb250YWlucyhiKSk7Ci0gICAgICAg
ICAgICAgICAgbV9hZGphY2VuY3lMaXN0W2FdLmFwcGVuZChiKTsKLSAgICAgICAgICAgIH0KLQot
ICAgICAgICAgICAgaWYgKCFpc1ByZWNvbG9yZWQoYikpIHsKLSAgICAgICAgICAgICAgICBBU1NF
UlQoIW1fYWRqYWNlbmN5TGlzdFtiXS5jb250YWlucyhhKSk7Ci0gICAgICAgICAgICAgICAgbV9h
ZGphY2VuY3lMaXN0W2JdLmFwcGVuZChhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJl
dHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAg
ICBib29sIGlzTW92ZVJlbGF0ZWQoSW5kZXhUeXBlIHRtcEluZGV4KQotICAgIHsKLSAgICAgICAg
Zm9yICh1bnNpZ25lZCBtb3ZlSW5kZXggOiBtX21vdmVMaXN0W3RtcEluZGV4XSkgewotICAgICAg
ICAgICAgaWYgKG1fYWN0aXZlTW92ZXMucXVpY2tHZXQobW92ZUluZGV4KSB8fCBtX3dvcmtsaXN0
TW92ZXMuY29udGFpbnMobW92ZUluZGV4KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsK
LSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdGVtcGxhdGU8
dHlwZW5hbWUgRnVuY3Rpb24+Ci0gICAgdm9pZCBmb3JFYWNoQWRqYWNlbnQoSW5kZXhUeXBlIHRt
cEluZGV4LCBGdW5jdGlvbiBmdW5jdGlvbikKLSAgICB7Ci0gICAgICAgIGZvciAoSW5kZXhUeXBl
IGFkamFjZW50VG1wSW5kZXggOiBtX2FkamFjZW5jeUxpc3RbdG1wSW5kZXhdKSB7Ci0gICAgICAg
ICAgICBpZiAoIWhhc0JlZW5TaW1wbGlmaWVkKGFkamFjZW50VG1wSW5kZXgpKQotICAgICAgICAg
ICAgICAgIGZ1bmN0aW9uKGFkamFjZW50VG1wSW5kZXgpOwotICAgICAgICB9Ci0gICAgfQotCi0g
ICAgYm9vbCBoYXNCZWVuU2ltcGxpZmllZChJbmRleFR5cGUgdG1wSW5kZXgpCi0gICAgewotICAg
ICAgICByZXR1cm4gbV9pc09uU2VsZWN0U3RhY2sucXVpY2tHZXQodG1wSW5kZXgpIHx8ICEhbV9j
b2FsZXNjZWRUbXBzW3RtcEluZGV4XTsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBG
dW5jdGlvbj4KLSAgICB2b2lkIGZvckVhY2hOb2RlTW92ZXMoSW5kZXhUeXBlIHRtcEluZGV4LCBG
dW5jdGlvbiBmdW5jdGlvbikKLSAgICB7Ci0gICAgICAgIGZvciAodW5zaWduZWQgbW92ZUluZGV4
IDogbV9tb3ZlTGlzdFt0bXBJbmRleF0pIHsKLSAgICAgICAgICAgIGlmIChtX2FjdGl2ZU1vdmVz
LnF1aWNrR2V0KG1vdmVJbmRleCkgfHwgbV93b3JrbGlzdE1vdmVzLmNvbnRhaW5zKG1vdmVJbmRl
eCkpCi0gICAgICAgICAgICAgICAgZnVuY3Rpb24obW92ZUluZGV4KTsKLSAgICAgICAgfQotICAg
IH0KLQotICAgIHZvaWQgZW5hYmxlTW92ZXNPblZhbHVlKEluZGV4VHlwZSB0bXBJbmRleCkKLSAg
ICB7Ci0gICAgICAgIGZvciAodW5zaWduZWQgbW92ZUluZGV4IDogbV9tb3ZlTGlzdFt0bXBJbmRl
eF0pIHsKLSAgICAgICAgICAgIGlmIChtX2FjdGl2ZU1vdmVzLnF1aWNrQ2xlYXIobW92ZUluZGV4
KSkKLSAgICAgICAgICAgICAgICBtX3dvcmtsaXN0TW92ZXMucmV0dXJuTW92ZShtb3ZlSW5kZXgp
OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBlbmFibGVNb3Zlc09uVmFsdWVBbmRBZGph
Y2VudHMoSW5kZXhUeXBlIHRtcEluZGV4KQotICAgIHsKLSAgICAgICAgZW5hYmxlTW92ZXNPblZh
bHVlKHRtcEluZGV4KTsKLQotICAgICAgICBmb3JFYWNoQWRqYWNlbnQodG1wSW5kZXgsIFt0aGlz
XSAoSW5kZXhUeXBlIGFkamFjZW50VG1wSW5kZXgpIHsKLSAgICAgICAgICAgIGVuYWJsZU1vdmVz
T25WYWx1ZShhZGphY2VudFRtcEluZGV4KTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgYm9v
bCBpc1ByZWNvbG9yZWQoSW5kZXhUeXBlIHRtcEluZGV4KQotICAgIHsKLSAgICAgICAgcmV0dXJu
IHRtcEluZGV4IDw9IG1fbGFzdFByZWNvbG9yZWRSZWdpc3RlckluZGV4OwotICAgIH0KLQotICAg
IHZvaWQgYWRkV29ya0xpc3QoSW5kZXhUeXBlIHRtcEluZGV4KQotICAgIHsKLSAgICAgICAgaWYg
KCFpc1ByZWNvbG9yZWQodG1wSW5kZXgpICYmIG1fZGVncmVlc1t0bXBJbmRleF0gPCBtX3JlZ3NJ
blByaW9yaXR5T3JkZXIuc2l6ZSgpICYmICFpc01vdmVSZWxhdGVkKHRtcEluZGV4KSkgewotICAg
ICAgICAgICAgbV9mcmVlemVXb3JrbGlzdC5yZW1vdmUodG1wSW5kZXgpOwotICAgICAgICAgICAg
bV9zaW1wbGlmeVdvcmtsaXN0LmFwcGVuZCh0bXBJbmRleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0K
LSAgICB2b2lkIGNvbWJpbmUoSW5kZXhUeXBlIHUsIEluZGV4VHlwZSB2KQotICAgIHsKLSAgICAg
ICAgaWYgKCFtX2ZyZWV6ZVdvcmtsaXN0LnJlbW92ZSh2KSkKLSAgICAgICAgICAgIG1fc3BpbGxX
b3JrbGlzdC5yZW1vdmUodik7Ci0KLSAgICAgICAgQVNTRVJUKCFtX2NvYWxlc2NlZFRtcHNbdl0p
OwotICAgICAgICBtX2NvYWxlc2NlZFRtcHNbdl0gPSB1OwotCi0gICAgICAgIGF1dG8mIHZNb3Zl
cyA9IG1fbW92ZUxpc3Rbdl07Ci0gICAgICAgIG1fbW92ZUxpc3RbdV0uYWRkKHZNb3Zlcy5iZWdp
bigpLCB2TW92ZXMuZW5kKCkpOwotCi0gICAgICAgIGZvckVhY2hBZGphY2VudCh2LCBbdGhpcywg
dV0gKEluZGV4VHlwZSBhZGphY2VudFRtcEluZGV4KSB7Ci0gICAgICAgICAgICBpZiAoYWRkRWRn
ZURpc3RpbmN0V2l0aG91dERlZ3JlZUNoYW5nZShhZGphY2VudFRtcEluZGV4LCB1KSkgewotICAg
ICAgICAgICAgICAgIC8vIElmIHdlIGFkZGVkIGEgbmV3IGVkZ2UgYmV0d2VlbiB0aGUgYWRqYWNl
bnRUbXAgYW5kIHUsIGl0IHJlcGxhY2VzIHRoZSBlZGdlCi0gICAgICAgICAgICAgICAgLy8gdGhh
dCBleGlzdGVkIHdpdGggdi4KLSAgICAgICAgICAgICAgICAvLyBUaGUgZGVncmVlIG9mIGFkamFj
ZW50VG1wIHJlbWFpbnMgdGhlIHNhbWUgc2luY2UgdGhlIGVkZ2UganVzdCBjaGFuZ2VkIGZyb20g
dSB0byB2LgotICAgICAgICAgICAgICAgIC8vIEFsbCB3ZSBuZWVkIHRvIGRvIGlzIHVwZGF0ZSB0
aGUgZGVncmVlIG9mIHUuCi0gICAgICAgICAgICAgICAgaWYgKCFpc1ByZWNvbG9yZWQodSkpCi0g
ICAgICAgICAgICAgICAgICAgIG1fZGVncmVlc1t1XSsrOwotICAgICAgICAgICAgfSBlbHNlIHsK
LSAgICAgICAgICAgICAgICAvLyBJZiB3ZSBhbHJlYWR5IGhhZCBhbiBlZGdlIGJldHdlZW4gdGhl
IGFkamFjZW50VG1wIGFuZCB1LCB0aGUgZGVncmVlIG9mIHUKLSAgICAgICAgICAgICAgICAvLyBp
cyBhbHJlYWR5IGNvcnJlY3QuIFRoZSBkZWdyZWUgb2YgdGhlIGFkamFjZW50VG1wIGRlY3JlYXNl
cyBzaW5jZSB0aGUgZWRnZQotICAgICAgICAgICAgICAgIC8vIHdpdGggdiBpcyBubyBsb25nZXIg
cmVsZXZhbnQgKHdlIGNhbiB0aGluayBvZiBpdCBhcyBtZXJnZWQgd2l0aCB0aGUgZWRnZSB3aXRo
IHUpLgotICAgICAgICAgICAgICAgIGRlY3JlbWVudERlZ3JlZShhZGphY2VudFRtcEluZGV4KTsK
LSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgaWYgKG1fZnJhbWVQb2ludGVy
SW5kZXggJiYgbV9pbnRlcmZlcmVzV2l0aEZyYW1lUG9pbnRlci5xdWlja0dldCh2KSkKLSAgICAg
ICAgICAgIG1faW50ZXJmZXJlc1dpdGhGcmFtZVBvaW50ZXIucXVpY2tTZXQodSk7Ci0KLSAgICAg
ICAgaWYgKG1fZGVncmVlc1t1XSA+PSBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpICYmIG1f
ZnJlZXplV29ya2xpc3QucmVtb3ZlKHUpKQotICAgICAgICAgICAgYWRkVG9TcGlsbCh1KTsKLSAg
ICB9Ci0KLSAgICBib29sIGNhbkJlU2FmZWx5Q29hbGVzY2VkKEluZGV4VHlwZSB1LCBJbmRleFR5
cGUgdikKLSAgICB7Ci0gICAgICAgIEFTU0VSVCghaXNQcmVjb2xvcmVkKHYpKTsKLSAgICAgICAg
aWYgKGlzUHJlY29sb3JlZCh1KSkKLSAgICAgICAgICAgIHJldHVybiBwcmVjb2xvcmVkQ29hbGVz
Y2luZ0hldXJpc3RpYyh1LCB2KTsKLSAgICAgICAgcmV0dXJuIGNvbnNlcnZhdGl2ZUhldXJpc3Rp
Yyh1LCB2KTsKLSAgICB9Ci0KLSAgICBib29sIGNvbnNlcnZhdGl2ZUhldXJpc3RpYyhJbmRleFR5
cGUgdSwgSW5kZXhUeXBlIHYpCi0gICAgewotICAgICAgICAvLyBUaGlzIGlzIHVzaW5nIHRoZSBC
cmlnZ3MnIGNvbnNlcnZhdGl2ZSBjb2FsZXNjaW5nIHJ1bGU6Ci0gICAgICAgIC8vIElmIHRoZSBu
dW1iZXIgb2YgY29tYmluZWQgYWRqYWNlbnQgbm9kZSB3aXRoIGEgZGVncmVlID49IEsgaXMgbGVz
cyB0aGFuIEssCi0gICAgICAgIC8vIGl0IGlzIHNhZmUgdG8gY29tYmluZSB0aGUgdHdvIG5vZGVz
LiBUaGUgcmVhc29uIGlzIHRoYXQgd2Uga25vdyB0aGF0IGlmIHRoZSBncmFwaAotICAgICAgICAv
LyBpcyBjb2xvcmFibGUsIHdlIGhhdmUgZmV3ZXIgdGhhbiBLIGFkamFjZW50cyB3aXRoIGhpZ2gg
b3JkZXIgYW5kIHRoZXJlIGlzIGEgY29sb3IKLSAgICAgICAgLy8gZm9yIHRoZSBjdXJyZW50IG5v
ZGUuCi0gICAgICAgIEFTU0VSVCh1ICE9IHYpOwotICAgICAgICBBU1NFUlQoIWlzUHJlY29sb3Jl
ZCh1KSk7Ci0gICAgICAgIEFTU0VSVCghaXNQcmVjb2xvcmVkKHYpKTsKLQotICAgICAgICBjb25z
dCBhdXRvJiBhZGphY2VudHNPZlUgPSBtX2FkamFjZW5jeUxpc3RbdV07Ci0gICAgICAgIGNvbnN0
IGF1dG8mIGFkamFjZW50c09mViA9IG1fYWRqYWNlbmN5TGlzdFt2XTsKLQotICAgICAgICBpZiAo
YWRqYWNlbnRzT2ZVLnNpemUoKSArIGFkamFjZW50c09mVi5zaXplKCkgPCBtX3JlZ3NJblByaW9y
aXR5T3JkZXIuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAvLyBTaG9ydGN1dDogaWYgdGhlIHRvdGFs
IG51bWJlciBvZiBhZGphY2VudHMgaXMgbGVzcyB0aGFuIHRoZSBudW1iZXIgb2YgcmVnaXN0ZXIs
IHRoZSBjb25kaXRpb24gaXMgYWx3YXlzIG1ldC4KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwot
ICAgICAgICB9Ci0KLSAgICAgICAgSGFzaFNldDxJbmRleFR5cGU+IGhpZ2hPcmRlckFkamFjZW50
czsKLQotICAgICAgICBmb3IgKEluZGV4VHlwZSBhZGphY2VudFRtcEluZGV4IDogYWRqYWNlbnRz
T2ZVKSB7Ci0gICAgICAgICAgICBBU1NFUlQoYWRqYWNlbnRUbXBJbmRleCAhPSB2KTsKLSAgICAg
ICAgICAgIEFTU0VSVChhZGphY2VudFRtcEluZGV4ICE9IHUpOwotICAgICAgICAgICAgaWYgKCFo
YXNCZWVuU2ltcGxpZmllZChhZGphY2VudFRtcEluZGV4KSAmJiBtX2RlZ3JlZXNbYWRqYWNlbnRU
bXBJbmRleF0gPj0gbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKSkgewotICAgICAgICAgICAg
ICAgIGF1dG8gYWRkUmVzdWx0ID0gaGlnaE9yZGVyQWRqYWNlbnRzLmFkZChhZGphY2VudFRtcElu
ZGV4KTsKLSAgICAgICAgICAgICAgICBpZiAoYWRkUmVzdWx0LmlzTmV3RW50cnkgJiYgaGlnaE9y
ZGVyQWRqYWNlbnRzLnNpemUoKSA+PSBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpKQotICAg
ICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0K
LSAgICAgICAgZm9yIChJbmRleFR5cGUgYWRqYWNlbnRUbXBJbmRleCA6IGFkamFjZW50c09mVikg
ewotICAgICAgICAgICAgQVNTRVJUKGFkamFjZW50VG1wSW5kZXggIT0gdSk7Ci0gICAgICAgICAg
ICBBU1NFUlQoYWRqYWNlbnRUbXBJbmRleCAhPSB2KTsKLSAgICAgICAgICAgIGlmICghaGFzQmVl
blNpbXBsaWZpZWQoYWRqYWNlbnRUbXBJbmRleCkgJiYgbV9kZWdyZWVzW2FkamFjZW50VG1wSW5k
ZXhdID49IG1fcmVnc0luUHJpb3JpdHlPcmRlci5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICBh
dXRvIGFkZFJlc3VsdCA9IGhpZ2hPcmRlckFkamFjZW50cy5hZGQoYWRqYWNlbnRUbXBJbmRleCk7
Ci0gICAgICAgICAgICAgICAgaWYgKGFkZFJlc3VsdC5pc05ld0VudHJ5ICYmIGhpZ2hPcmRlckFk
amFjZW50cy5zaXplKCkgPj0gbV9yZWdzSW5Qcmlvcml0eU9yZGVyLnNpemUoKSkKLSAgICAgICAg
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAg
ICAgICAgQVNTRVJUKGhpZ2hPcmRlckFkamFjZW50cy5zaXplKCkgPCBtX3JlZ3NJblByaW9yaXR5
T3JkZXIuc2l6ZSgpKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgYm9vbCBw
cmVjb2xvcmVkQ29hbGVzY2luZ0hldXJpc3RpYyhJbmRleFR5cGUgdSwgSW5kZXhUeXBlIHYpCi0g
ICAgewotICAgICAgICBpZiAodHJhY2VEZWJ1ZykKLSAgICAgICAgICAgIGRhdGFMb2coIiAgICBD
aGVja2luZyBwcmVjb2xvcmVkQ29hbGVzY2luZ0hldXJpc3RpY1xuIik7Ci0gICAgICAgIEFTU0VS
VChpc1ByZWNvbG9yZWQodSkpOwotICAgICAgICBBU1NFUlQoIWlzUHJlY29sb3JlZCh2KSk7Ci0g
ICAgICAgIAotICAgICAgICAvLyBJZiB1IGlzIGEgcGlubmVkIHJlZ2lzdGVyIHRoZW4gaXQncyBh
bHdheXMgc2FmZSB0byBjb2FsZXNjZS4gTm90ZSB0aGF0IHdoZW4gd2UgY2FsbCB0aGlzLAotICAg
ICAgICAvLyB3ZSBoYXZlIGFscmVhZHkgcHJvdmVkIHRoYXQgdGhlcmUgaXMgbm8gaW50ZXJmZXJl
bmNlIGJldHdlZW4gdSBhbmQgdi4KLSAgICAgICAgaWYgKCFtX211dGFibGVSZWdzLmdldChtX2Nv
bG9yZWRUbXBbdV0pKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgLy8gSWYg
YW55IGFkamFjZW50IG9mIHRoZSBub24tY29sb3JlZCBub2RlIGlzIG5vdCBhbiBhZGphY2VudCBv
ZiB0aGUgY29sb3JlZCBub2RlIEFORCBoYXMgYSBkZWdyZWUgPj0gSwotICAgICAgICAvLyB0aGVy
ZSBpcyBhIHJpc2sgdGhhdCB0aGlzIG5vZGUgbmVlZHMgdG8gaGF2ZSB0aGUgc2FtZSBjb2xvciBh
cyBvdXIgcHJlY29sb3JlZCBub2RlLiBJZiB3ZSBjb2FsZXNjZSBzdWNoCi0gICAgICAgIC8vIG1v
dmUsIHdlIG1heSBjcmVhdGUgYW4gdW5jb2xvcmFibGUgZ3JhcGguCi0gICAgICAgIGNvbnN0IGF1
dG8mIGFkamFjZW50c09mViA9IG1fYWRqYWNlbmN5TGlzdFt2XTsKLSAgICAgICAgZm9yICh1bnNp
Z25lZCBhZGphY2VudFRtcEluZGV4IDogYWRqYWNlbnRzT2ZWKSB7Ci0gICAgICAgICAgICBpZiAo
IWlzUHJlY29sb3JlZChhZGphY2VudFRtcEluZGV4KQotICAgICAgICAgICAgICAgICYmICFoYXNC
ZWVuU2ltcGxpZmllZChhZGphY2VudFRtcEluZGV4KQotICAgICAgICAgICAgICAgICYmIG1fZGVn
cmVlc1thZGphY2VudFRtcEluZGV4XSA+PSBtX3JlZ3NJblByaW9yaXR5T3JkZXIuc2l6ZSgpCi0g
ICAgICAgICAgICAgICAgJiYgIW1faW50ZXJmZXJlbmNlRWRnZXMuY29udGFpbnMoSW50ZXJmZXJl
bmNlRWRnZSh1LCBhZGphY2VudFRtcEluZGV4KSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotcHJvdGVjdGVk
OgotI2lmIFBMQVRGT1JNKENPQ09BKQotI3ByYWdtYSBtYXJrIC0KLSNlbmRpZgotCi0gICAgLy8g
SW50ZXJmZXJlbmNlIGVkZ2VzIGFyZSBub3QgZGlyZWN0ZWQuIEFuIGVkZ2UgYmV0d2VlbiBhbnkg
dHdvIFRtcHMgaXMgcmVwcmVzZW50ZWQKLSAgICAvLyBieSB0aGUgY29uY2F0ZW5hdGVkIHZhbHVl
cyBvZiB0aGUgc21hbGxlc3QgVG1wIGZvbGxvd2VkIGJ5IHRoZSBiaWdnZXIgVG1wLgotICAgIGNs
YXNzIEludGVyZmVyZW5jZUVkZ2UgewotICAgIHB1YmxpYzoKLSAgICAgICAgSW50ZXJmZXJlbmNl
RWRnZSgpCi0gICAgICAgIHsKLSAgICAgICAgfQotCi0gICAgICAgIEludGVyZmVyZW5jZUVkZ2Uo
SW5kZXhUeXBlIGEsIEluZGV4VHlwZSBiKQotICAgICAgICB7Ci0gICAgICAgICAgICBBU1NFUlQo
YSk7Ci0gICAgICAgICAgICBBU1NFUlQoYik7Ci0gICAgICAgICAgICBBU1NFUlRfV0lUSF9NRVNT
QUdFKGEgIT0gYiwgIkEgVG1wIGNhbiBuZXZlciBpbnRlcmZlcmUgd2l0aCBpdHNlbGYuIERvaW5n
IHNvIHdvdWxkIGZvcmNlIGl0IHRvIGJlIHRoZSBzdXBlcnBvc2l0aW9uIG9mIHR3byByZWdpc3Rl
cnMuIik7Ci0KLSAgICAgICAgICAgIGlmIChiIDwgYSkKLSAgICAgICAgICAgICAgICBzdGQ6OnN3
YXAoYSwgYik7Ci0gICAgICAgICAgICBtX3ZhbHVlID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGEp
IDw8IDMyIHwgYjsKLSAgICAgICAgfQotCi0gICAgICAgIEludGVyZmVyZW5jZUVkZ2UoV1RGOjpI
YXNoVGFibGVEZWxldGVkVmFsdWVUeXBlKQotICAgICAgICAgICAgOiBtX3ZhbHVlKHN0ZDo6bnVt
ZXJpY19saW1pdHM8dWludDY0X3Q+OjptYXgoKSkKLSAgICAgICAgewotICAgICAgICB9Ci0KLSAg
ICAgICAgSW5kZXhUeXBlIGZpcnN0KCkgY29uc3QKLSAgICAgICAgewotICAgICAgICAgICAgcmV0
dXJuIG1fdmFsdWUgPj4gMzIgJiAweGZmZmZmZmZmOwotICAgICAgICB9Ci0KLSAgICAgICAgSW5k
ZXhUeXBlIHNlY29uZCgpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtX3Zh
bHVlICYgMHhmZmZmZmZmZjsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2wgb3BlcmF0b3I9PShj
b25zdCBJbnRlcmZlcmVuY2VFZGdlIG90aGVyKSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAg
ICByZXR1cm4gbV92YWx1ZSA9PSBvdGhlci5tX3ZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAg
Ym9vbCBpc0hhc2hUYWJsZURlbGV0ZWRWYWx1ZSgpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAg
ICAgIHJldHVybiAqdGhpcyA9PSBJbnRlcmZlcmVuY2VFZGdlKFdURjo6SGFzaFRhYmxlRGVsZXRl
ZFZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHVuc2lnbmVkIGhhc2goKSBjb25zdAotICAg
ICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gV1RGOjpJbnRIYXNoPHVpbnQ2NF90Pjo6aGFzaCht
X3ZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYgb3V0
KSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAgICBvdXQucHJpbnQoZmlyc3QoKSwgIjw9PiIs
IHNlY29uZCgpKTsKLSAgICAgICAgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgdWludDY0X3Qg
bV92YWx1ZSB7IDAgfTsKLSAgICB9OwotCi0gICAgc3RydWN0IEludGVyZmVyZW5jZUVkZ2VIYXNo
IHsKLSAgICAgICAgc3RhdGljIHVuc2lnbmVkIGhhc2goY29uc3QgSW50ZXJmZXJlbmNlRWRnZSYg
a2V5KSB7IHJldHVybiBrZXkuaGFzaCgpOyB9Ci0gICAgICAgIHN0YXRpYyBib29sIGVxdWFsKGNv
bnN0IEludGVyZmVyZW5jZUVkZ2UmIGEsIGNvbnN0IEludGVyZmVyZW5jZUVkZ2UmIGIpIHsgcmV0
dXJuIGEgPT0gYjsgfQotICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBzYWZlVG9Db21wYXJlVG9F
bXB0eU9yRGVsZXRlZCA9IHRydWU7Ci0gICAgfTsKLSAgICB0eXBlZGVmIFNpbXBsZUNsYXNzSGFz
aFRyYWl0czxJbnRlcmZlcmVuY2VFZGdlPiBJbnRlcmZlcmVuY2VFZGdlSGFzaFRyYWl0czsKLQot
ICAgIGNvbnN0IFZlY3RvcjxSZWc+JiBtX3JlZ3NJblByaW9yaXR5T3JkZXI7Ci0gICAgUmVnaXN0
ZXJTZXQgbV9tdXRhYmxlUmVnczsKLSAgICBJbmRleFR5cGUgbV9sYXN0UHJlY29sb3JlZFJlZ2lz
dGVySW5kZXggeyAwIH07Ci0KLSAgICAvLyBUaGUgaW50ZXJmZXJlbmNlIGdyYXBoLgotICAgIEhh
c2hTZXQ8SW50ZXJmZXJlbmNlRWRnZSwgSW50ZXJmZXJlbmNlRWRnZUhhc2gsIEludGVyZmVyZW5j
ZUVkZ2VIYXNoVHJhaXRzPiBtX2ludGVyZmVyZW5jZUVkZ2VzOwotICAgIFZlY3RvcjxWZWN0b3I8
SW5kZXhUeXBlLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdywgND4sIDAsIFVuc2FmZVZlY3Rvck92
ZXJmbG93PiBtX2FkamFjZW5jeUxpc3Q7Ci0gICAgVmVjdG9yPEluZGV4VHlwZSwgMCwgVW5zYWZl
VmVjdG9yT3ZlcmZsb3c+IG1fZGVncmVlczsKLQotICAgIC8vIEluc3RlYWQgb2Yga2VlcGluZyB0
cmFjayBvZiB0aGUgbW92ZSBpbnN0cnVjdGlvbnMsIHdlIGp1c3Qga2VlcCB0aGVpciBvcGVyYW5k
cyBhcm91bmQgYW5kIHVzZSB0aGUgaW5kZXgKLSAgICAvLyBpbiB0aGUgdmVjdG9yIGFzIHRoZSAi
aWRlbnRpZmllciIgZm9yIHRoZSBtb3ZlLgotICAgIHN0cnVjdCBNb3ZlT3BlcmFuZHMgewotICAg
ICAgICBJbmRleFR5cGUgc3JjSW5kZXg7Ci0gICAgICAgIEluZGV4VHlwZSBkc3RJbmRleDsKLSAg
ICB9OwotICAgIFZlY3RvcjxNb3ZlT3BlcmFuZHMsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBt
X2NvYWxlc2NpbmdDYW5kaWRhdGVzOwotCi0gICAgLy8gTGlzdCBvZiBldmVyeSBtb3ZlIGluc3Ry
dWN0aW9uIGFzc29jaWF0ZWQgd2l0aCBhIFRtcC4KLSAgICBWZWN0b3I8SGFzaFNldDxJbmRleFR5
cGUsIHR5cGVuYW1lIERlZmF1bHRIYXNoPEluZGV4VHlwZT46Okhhc2gsIFdURjo6VW5zaWduZWRX
aXRoWmVyb0tleUhhc2hUcmFpdHM8SW5kZXhUeXBlPj4+IG1fbW92ZUxpc3Q7Ci0KLSAgICAvLyBD
b2xvcnMuCi0gICAgVmVjdG9yPFJlZywgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fY29sb3Jl
ZFRtcDsKLSAgICBWZWN0b3I8SW5kZXhUeXBlPiBtX3NwaWxsZWRUbXBzOwotCi0gICAgLy8gVmFs
dWVzIHRoYXQgaGF2ZSBiZWVuIGNvYWxlc2NlZCB3aXRoIGFuIG90aGVyIHZhbHVlLgotICAgIFZl
Y3RvcjxJbmRleFR5cGUsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX2NvYWxlc2NlZFRtcHM7
Ci0KLSAgICAvLyBUaGUgc3RhY2sgb2YgVG1wIHJlbW92ZWQgZnJvbSB0aGUgZ3JhcGggYW5kIHJl
YWR5IGZvciBjb2xvcmluZy4KLSAgICBCaXRWZWN0b3IgbV9pc09uU2VsZWN0U3RhY2s7Ci0gICAg
VmVjdG9yPEluZGV4VHlwZT4gbV9zZWxlY3RTdGFjazsKLQotICAgIEluZGV4VHlwZSBtX2ZyYW1l
UG9pbnRlckluZGV4IHsgMCB9OwotICAgIEJpdFZlY3RvciBtX2ludGVyZmVyZXNXaXRoRnJhbWVQ
b2ludGVyOwotCi0gICAgc3RydWN0IE9yZGVyZWRNb3ZlU2V0IHsKLSAgICAgICAgdW5zaWduZWQg
YWRkTW92ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFTU0VSVChtX2xvd1ByaW9yaXR5TW92
ZUxpc3QuaXNFbXB0eSgpKTsKLSAgICAgICAgICAgIEFTU0VSVCghbV9maXJzdExvd1ByaW9yaXR5
TW92ZUluZGV4KTsKLQotICAgICAgICAgICAgdW5zaWduZWQgbmV4dEluZGV4ID0gbV9wb3NpdGlv
bkluTW92ZUxpc3Quc2l6ZSgpOwotICAgICAgICAgICAgdW5zaWduZWQgcG9zaXRpb24gPSBtX21v
dmVMaXN0LnNpemUoKTsKLSAgICAgICAgICAgIG1fbW92ZUxpc3QuYXBwZW5kKG5leHRJbmRleCk7
Ci0gICAgICAgICAgICBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdC5hcHBlbmQocG9zaXRpb24pOwotICAg
ICAgICAgICAgcmV0dXJuIG5leHRJbmRleDsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc3Rh
cnRBZGRpbmdMb3dQcmlvcml0eU1vdmVzKCkKLSAgICAgICAgewotICAgICAgICAgICAgQVNTRVJU
KG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5pc0VtcHR5KCkpOwotICAgICAgICAgICAgbV9maXJzdExv
d1ByaW9yaXR5TW92ZUluZGV4ID0gbV9tb3ZlTGlzdC5zaXplKCk7Ci0gICAgICAgIH0KLQotICAg
ICAgICB1bnNpZ25lZCBhZGRMb3dQcmlvcml0eU1vdmUoKQotICAgICAgICB7Ci0gICAgICAgICAg
ICBBU1NFUlQobV9maXJzdExvd1ByaW9yaXR5TW92ZUluZGV4ID09IG1fbW92ZUxpc3Quc2l6ZSgp
KTsKLQotICAgICAgICAgICAgdW5zaWduZWQgbmV4dEluZGV4ID0gbV9wb3NpdGlvbkluTW92ZUxp
c3Quc2l6ZSgpOwotICAgICAgICAgICAgdW5zaWduZWQgcG9zaXRpb24gPSBtX2xvd1ByaW9yaXR5
TW92ZUxpc3Quc2l6ZSgpOwotICAgICAgICAgICAgbV9sb3dQcmlvcml0eU1vdmVMaXN0LmFwcGVu
ZChuZXh0SW5kZXgpOwotICAgICAgICAgICAgbV9wb3NpdGlvbkluTW92ZUxpc3QuYXBwZW5kKHBv
c2l0aW9uKTsKLQotICAgICAgICAgICAgQVNTRVJUKG5leHRJbmRleCA+PSBtX2ZpcnN0TG93UHJp
b3JpdHlNb3ZlSW5kZXgpOwotCi0gICAgICAgICAgICByZXR1cm4gbmV4dEluZGV4OwotICAgICAg
ICB9Ci0KLSAgICAgICAgYm9vbCBpc0VtcHR5KCkgY29uc3QKLSAgICAgICAgewotICAgICAgICAg
ICAgcmV0dXJuIG1fbW92ZUxpc3QuaXNFbXB0eSgpICYmIG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5p
c0VtcHR5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sIGNvbnRhaW5zKHVuc2lnbmVkIGlu
ZGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbV9wb3NpdGlvbkluTW92ZUxpc3Rb
aW5kZXhdICE9IHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgoKTsKLSAgICAgICAg
fQotCi0gICAgICAgIHZvaWQgdGFrZU1vdmUodW5zaWduZWQgbW92ZUluZGV4KQotICAgICAgICB7
Ci0gICAgICAgICAgICB1bnNpZ25lZCBwb3NpdGlvbkluTW92ZUxpc3QgPSBtX3Bvc2l0aW9uSW5N
b3ZlTGlzdFttb3ZlSW5kZXhdOwotICAgICAgICAgICAgaWYgKHBvc2l0aW9uSW5Nb3ZlTGlzdCA9
PSBzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4KCkpCi0gICAgICAgICAgICAgICAg
cmV0dXJuOwotCi0gICAgICAgICAgICBpZiAobW92ZUluZGV4IDwgbV9maXJzdExvd1ByaW9yaXR5
TW92ZUluZGV4KSB7Ci0gICAgICAgICAgICAgICAgQVNTRVJUKG1fbW92ZUxpc3RbcG9zaXRpb25J
bk1vdmVMaXN0XSA9PSBtb3ZlSW5kZXgpOwotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxhc3RJ
bmRleCA9IG1fbW92ZUxpc3QubGFzdCgpOwotICAgICAgICAgICAgICAgIG1fcG9zaXRpb25Jbk1v
dmVMaXN0W2xhc3RJbmRleF0gPSBwb3NpdGlvbkluTW92ZUxpc3Q7Ci0gICAgICAgICAgICAgICAg
bV9tb3ZlTGlzdFtwb3NpdGlvbkluTW92ZUxpc3RdID0gbGFzdEluZGV4OwotICAgICAgICAgICAg
ICAgIG1fbW92ZUxpc3QucmVtb3ZlTGFzdCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAg
ICAgICAgICAgICBBU1NFUlQobV9sb3dQcmlvcml0eU1vdmVMaXN0W3Bvc2l0aW9uSW5Nb3ZlTGlz
dF0gPT0gbW92ZUluZGV4KTsKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBsYXN0SW5kZXggPSBt
X2xvd1ByaW9yaXR5TW92ZUxpc3QubGFzdCgpOwotICAgICAgICAgICAgICAgIG1fcG9zaXRpb25J
bk1vdmVMaXN0W2xhc3RJbmRleF0gPSBwb3NpdGlvbkluTW92ZUxpc3Q7Ci0gICAgICAgICAgICAg
ICAgbV9sb3dQcmlvcml0eU1vdmVMaXN0W3Bvc2l0aW9uSW5Nb3ZlTGlzdF0gPSBsYXN0SW5kZXg7
Ci0gICAgICAgICAgICAgICAgbV9sb3dQcmlvcml0eU1vdmVMaXN0LnJlbW92ZUxhc3QoKTsKLSAg
ICAgICAgICAgIH0KLQotICAgICAgICAgICAgbV9wb3NpdGlvbkluTW92ZUxpc3RbbW92ZUluZGV4
XSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgoKTsKLQotICAgICAgICAgICAg
QVNTRVJUKCFjb250YWlucyhtb3ZlSW5kZXgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHVuc2ln
bmVkIHRha2VMYXN0TW92ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFTU0VSVCghaXNFbXB0
eSgpKTsKLQotICAgICAgICAgICAgdW5zaWduZWQgbGFzdEluZGV4OwotICAgICAgICAgICAgaWYg
KCFtX21vdmVMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGxhc3RJbmRleCA9IG1f
bW92ZUxpc3QudGFrZUxhc3QoKTsKLSAgICAgICAgICAgICAgICBBU1NFUlQobV9wb3NpdGlvbklu
TW92ZUxpc3RbbGFzdEluZGV4XSA9PSBtX21vdmVMaXN0LnNpemUoKSk7Ci0gICAgICAgICAgICB9
IGVsc2UgewotICAgICAgICAgICAgICAgIGxhc3RJbmRleCA9IG1fbG93UHJpb3JpdHlNb3ZlTGlz
dC50YWtlTGFzdCgpOwotICAgICAgICAgICAgICAgIEFTU0VSVChtX3Bvc2l0aW9uSW5Nb3ZlTGlz
dFtsYXN0SW5kZXhdID09IG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5zaXplKCkpOwotICAgICAgICAg
ICAgfQotICAgICAgICAgICAgbV9wb3NpdGlvbkluTW92ZUxpc3RbbGFzdEluZGV4XSA9IHN0ZDo6
bnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgoKTsKLQotICAgICAgICAgICAgQVNTRVJUKCFj
b250YWlucyhsYXN0SW5kZXgpKTsKLSAgICAgICAgICAgIHJldHVybiBsYXN0SW5kZXg7Ci0gICAg
ICAgIH0KLQotICAgICAgICB2b2lkIHJldHVybk1vdmUodW5zaWduZWQgaW5kZXgpCi0gICAgICAg
IHsKLSAgICAgICAgICAgIC8vIFRoaXMgYXNzZXJ0aW9uIGlzIGEgYml0IHN0cmljdCBidXQgdGhh
dCBpcyBob3cgdGhlIG1vdmUgbGlzdCBzaG91bGQgYmUgdXNlZC4gVGhlIG9ubHkga2luZCBvZiBt
b3ZlcyB0aGF0IGNhbgotICAgICAgICAgICAgLy8gcmV0dXJuIHRvIHRoZSBsaXN0IGFyZSB0aGUg
b25lcyB0aGF0IHdlIHByZXZpb3VzbHkgZmFpbGVkIHRvIGNvYWxlc2NlIHdpdGggdGhlIGNvbnNl
cnZhdGl2ZSBoZXVyaXN0aWNzLgotICAgICAgICAgICAgLy8gVmFsdWVzIHNob3VsZCBub3QgYmUg
YWRkZWQgYmFjayBpZiB0aGV5IHdlcmUgbmV2ZXIgdGFrZW4gb3V0IHdoZW4gYXR0ZW1wdGluZyBj
b2FsZXNjaW5nLgotICAgICAgICAgICAgQVNTRVJUKCFjb250YWlucyhpbmRleCkpOwotCi0gICAg
ICAgICAgICBpZiAoaW5kZXggPCBtX2ZpcnN0TG93UHJpb3JpdHlNb3ZlSW5kZXgpIHsKLSAgICAg
ICAgICAgICAgICB1bnNpZ25lZCBwb3NpdGlvbiA9IG1fbW92ZUxpc3Quc2l6ZSgpOwotICAgICAg
ICAgICAgICAgIG1fbW92ZUxpc3QuYXBwZW5kKGluZGV4KTsKLSAgICAgICAgICAgICAgICBtX3Bv
c2l0aW9uSW5Nb3ZlTGlzdFtpbmRleF0gPSBwb3NpdGlvbjsKLSAgICAgICAgICAgIH0gZWxzZSB7
Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgcG9zaXRpb24gPSBtX2xvd1ByaW9yaXR5TW92ZUxp
c3Quc2l6ZSgpOwotICAgICAgICAgICAgICAgIG1fbG93UHJpb3JpdHlNb3ZlTGlzdC5hcHBlbmQo
aW5kZXgpOwotICAgICAgICAgICAgICAgIG1fcG9zaXRpb25Jbk1vdmVMaXN0W2luZGV4XSA9IHBv
c2l0aW9uOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBU1NFUlQoY29udGFpbnMoaW5k
ZXgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgY2xlYXIoKQotICAgICAgICB7Ci0gICAg
ICAgICAgICBtX3Bvc2l0aW9uSW5Nb3ZlTGlzdC5jbGVhcigpOwotICAgICAgICAgICAgbV9tb3Zl
TGlzdC5jbGVhcigpOwotICAgICAgICAgICAgbV9sb3dQcmlvcml0eU1vdmVMaXN0LmNsZWFyKCk7
Ci0gICAgICAgIH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIFZlY3Rvcjx1bnNpZ25lZCwgMCwg
VW5zYWZlVmVjdG9yT3ZlcmZsb3c+IG1fcG9zaXRpb25Jbk1vdmVMaXN0OwotICAgICAgICBWZWN0
b3I8dW5zaWduZWQsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX21vdmVMaXN0OwotICAgICAg
ICBWZWN0b3I8dW5zaWduZWQsIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBtX2xvd1ByaW9yaXR5
TW92ZUxpc3Q7Ci0gICAgICAgIHVuc2lnbmVkIG1fZmlyc3RMb3dQcmlvcml0eU1vdmVJbmRleCB7
IDAgfTsKLSAgICB9OwotCi0gICAgLy8gV29yayBsaXN0cy4KLSAgICAvLyBTZXQgb2YgIm1vdmUi
IGVuYWJsZWQgZm9yIHBvc3NpYmxlIGNvYWxlc2NpbmcuCi0gICAgT3JkZXJlZE1vdmVTZXQgbV93
b3JrbGlzdE1vdmVzOwotICAgIC8vIFNldCBvZiAibW92ZSIgbm90IHlldCByZWFkeSBmb3IgY29h
bGVzY2luZy4KLSAgICBCaXRWZWN0b3IgbV9hY3RpdmVNb3ZlczsKLSAgICAvLyBMb3ctZGVncmVl
LCBub24tTW92ZSByZWxhdGVkLgotICAgIFZlY3RvcjxJbmRleFR5cGU+IG1fc2ltcGxpZnlXb3Jr
bGlzdDsKLSAgICAvLyBIaWdoLWRlZ3JlZSBUbXAuCi0gICAgSGFzaFNldDxJbmRleFR5cGU+IG1f
c3BpbGxXb3JrbGlzdDsKLSAgICAvLyBMb3ctZGVncmVlLCBNb3ZlIHJlbGF0ZWQuCi0gICAgSGFz
aFNldDxJbmRleFR5cGU+IG1fZnJlZXplV29ya2xpc3Q7Ci0KLSAgICBib29sIG1faGFzU2VsZWN0
ZWRTcGlsbCB7IGZhbHNlIH07Ci0gICAgYm9vbCBtX2hhc0NvYWxlc2NlZE5vblRyaXZpYWxNb3Zl
IHsgZmFsc2UgfTsKLQotICAgIC8vIFRoZSBtYXBwaW5nIG9mIFRtcCB0byB0aGVpciBhbGlhcyBm
b3IgTW92ZXMgdGhhdCBhcmUgYWx3YXlzIGNvYWxlc2NpbmcgcmVnYXJkbGVzcyBvZiBzcGlsbGlu
Zy4KLSAgICBWZWN0b3I8SW5kZXhUeXBlLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gbV9jb2Fs
ZXNjZWRUbXBzQXRTcGlsbDsKLSAgICAKLSAgICBjb25zdCBIYXNoU2V0PHVuc2lnbmVkPiYgbV91
bnNwaWxsYWJsZVRtcHM7Ci19OwotCi0vLyBUaGlzIHBlcmZvcm0gYWxsIHRoZSB0YXNrcyB0aGF0
IGFyZSBzcGVjaWZpYyB0byBjZXJ0YWluIHJlZ2lzdGVyIHR5cGUuCi10ZW1wbGF0ZTxBcmc6OlR5
cGUgdHlwZT4KLWNsYXNzIENvbG9yaW5nQWxsb2NhdG9yIDogcHVibGljIEFic3RyYWN0Q29sb3Jp
bmdBbGxvY2F0b3I8dW5zaWduZWQ+IHsKLXB1YmxpYzoKLSAgICBDb2xvcmluZ0FsbG9jYXRvcihD
b2RlJiBjb2RlLCBUbXBXaWR0aCYgdG1wV2lkdGgsIGNvbnN0IFVzZUNvdW50czxUbXA+JiB1c2VD
b3VudHMsIGNvbnN0IEhhc2hTZXQ8dW5zaWduZWQ+JiB1bnNwaWxsYWJsZVRtcCkKLSAgICAgICAg
OiBBYnN0cmFjdENvbG9yaW5nQWxsb2NhdG9yPHVuc2lnbmVkPihjb2RlLnJlZ3NJblByaW9yaXR5
T3JkZXIodHlwZSksIEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjpsYXN0TWFjaGluZVJlZ2lzdGVy
SW5kZXgoKSwgdG1wQXJyYXlTaXplKGNvZGUpLCB1bnNwaWxsYWJsZVRtcCkKLSAgICAgICAgLCBt
X2NvZGUoY29kZSkKLSAgICAgICAgLCBtX3RtcFdpZHRoKHRtcFdpZHRoKQotICAgICAgICAsIG1f
dXNlQ291bnRzKHVzZUNvdW50cykKLSAgICB7Ci0gICAgICAgIGlmICh0eXBlID09IEFyZzo6R1Ap
IHsKLSAgICAgICAgICAgIG1fZnJhbWVQb2ludGVySW5kZXggPSBBYnNvbHV0ZVRtcE1hcHBlcjx0
eXBlPjo6YWJzb2x1dGVJbmRleChUbXAoTWFjcm9Bc3NlbWJsZXI6OmZyYW1lUG9pbnRlclJlZ2lz
dGVyKSk7Ci0gICAgICAgICAgICBtX2ludGVyZmVyZXNXaXRoRnJhbWVQb2ludGVyLmVuc3VyZVNp
emUodG1wQXJyYXlTaXplKGNvZGUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGluaXRpYWxpemVQ
cmVjb2xvcmVkVG1wKCk7Ci0gICAgICAgIGJ1aWxkKCk7Ci0gICAgICAgIGFsbG9jYXRlKCk7Ci0g
ICAgfQotCi0gICAgVG1wIGdldEFsaWFzKFRtcCB0bXApIGNvbnN0Ci0gICAgewotICAgICAgICBy
ZXR1cm4gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KGdldEFs
aWFzKEFic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHRtcCkpKTsKLSAgICB9
Ci0KLSAgICAvLyBUaGlzIHRlbGxzIHlvdSBpZiBhIE1vdmUgd2lsbCBiZSBjb2FsZXNjYWJsZSBp
ZiB0aGUgc3JjIGFuZCBkc3QgZW5kIHVwIG1hdGNoaW5nLiBUaGlzIG1ldGhvZAotICAgIC8vIHJl
bGllcyBvbiBhbiBhbmFseXNpcyB0aGF0IGlzIGludmFsaWRhdGVkIGJ5IHJlZ2lzdGVyIGFsbG9j
YXRpb24sIHNvIHlvdSBpdCdzIG9ubHkgbWVhbmluZ2Z1bCB0bwotICAgIC8vIGNhbGwgdGhpcyAq
YmVmb3JlKiByZXBsYWNpbmcgdGhlIFRtcCdzIGluIHRoaXMgSW5zdCB3aXRoIHJlZ2lzdGVycyBv
ciBzcGlsbCBzbG90cy4KLSAgICBib29sIG1heUJlQ29hbGVzY2FibGUoY29uc3QgSW5zdCYgaW5z
dCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtYXlCZUNvYWxlc2NhYmxlSW1wbChpbnN0
LCAmbV90bXBXaWR0aCk7Ci0gICAgfQotCi0gICAgYm9vbCBpc1VzZWxlc3NNb3ZlKGNvbnN0IElu
c3QmIGluc3QpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbWF5QmVDb2FsZXNjYWJsZUlt
cGwoaW5zdCwgbnVsbHB0cikgJiYgaW5zdC5hcmdzWzBdLnRtcCgpID09IGluc3QuYXJnc1sxXS50
bXAoKTsKLSAgICB9Ci0KLSAgICBUbXAgZ2V0QWxpYXNXaGVuU3BpbGxpbmcoVG1wIHRtcCkgY29u
c3QKLSAgICB7Ci0gICAgICAgIEFTU0VSVF9XSVRIX01FU1NBR0UoIW1fc3BpbGxlZFRtcHMuaXNF
bXB0eSgpLCAiVGhpcyBmdW5jdGlvbiBpcyBvbmx5IHZhbGlkIGZvciBjb2FsZXNjaW5nIGR1cmlu
ZyBzcGlsbGluZy4iKTsKLQotICAgICAgICBpZiAobV9jb2FsZXNjZWRUbXBzQXRTcGlsbC5pc0Vt
cHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gdG1wOwotCi0gICAgICAgIHVuc2lnbmVkIGFsaWFz
SW5kZXggPSBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh0bXApOwotICAg
ICAgICB3aGlsZSAodW5zaWduZWQgbmV4dEFsaWFzSW5kZXggPSBtX2NvYWxlc2NlZFRtcHNBdFNw
aWxsW2FsaWFzSW5kZXhdKQotICAgICAgICAgICAgYWxpYXNJbmRleCA9IG5leHRBbGlhc0luZGV4
OwotCi0gICAgICAgIFRtcCBhbGlhcyA9IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9t
QWJzb2x1dGVJbmRleChhbGlhc0luZGV4KTsKLQotICAgICAgICBBU1NFUlRfV0lUSF9NRVNTQUdF
KCFtX3NwaWxsZWRUbXBzLmNvbnRhaW5zKGFsaWFzSW5kZXgpIHx8IGFsaWFzID09IHRtcCwgIlRo
ZSBhbGlhc2VzIGF0IHNwaWxsIHNob3VsZCBhbHdheXMgYmUgY29sb3JhYmxlLiBTb21ldGhpbmcg
d2VudCBob3JyaWJseSB3cm9uZy4iKTsKLQotICAgICAgICByZXR1cm4gYWxpYXM7Ci0gICAgfQot
Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUgSW5kZXhJdGVyYXRvcj4KLSAgICBjbGFzcyBJbmRleFRv
VG1wSXRlcmF0b3JBZGFwdG9yIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIEluZGV4VG9UbXBJdGVy
YXRvckFkYXB0b3IoSW5kZXhJdGVyYXRvciYmIGluZGV4SXRlcmF0b3IpCi0gICAgICAgICAgICA6
IG1faW5kZXhJdGVyYXRvcihXVEZNb3ZlKGluZGV4SXRlcmF0b3IpKQotICAgICAgICB7Ci0gICAg
ICAgIH0KLQotICAgICAgICBUbXAgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gQWJzb2x1dGVU
bXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KCptX2luZGV4SXRlcmF0b3IpOyB9
Ci0gICAgICAgIEluZGV4VG9UbXBJdGVyYXRvckFkYXB0b3ImIG9wZXJhdG9yKysoKSB7ICsrbV9p
bmRleEl0ZXJhdG9yOyByZXR1cm4gKnRoaXM7IH0KLQotICAgICAgICBib29sIG9wZXJhdG9yPT0o
Y29uc3QgSW5kZXhUb1RtcEl0ZXJhdG9yQWRhcHRvciYgb3RoZXIpIGNvbnN0Ci0gICAgICAgIHsK
LSAgICAgICAgICAgIHJldHVybiBtX2luZGV4SXRlcmF0b3IgPT0gb3RoZXIubV9pbmRleEl0ZXJh
dG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEluZGV4VG9U
bXBJdGVyYXRvckFkYXB0b3ImIG90aGVyKSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAgICBy
ZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7Ci0gICAgICAgIH0KLQotICAgIHByaXZhdGU6Ci0gICAg
ICAgIEluZGV4SXRlcmF0b3IgbV9pbmRleEl0ZXJhdG9yOwotICAgIH07Ci0KLSAgICB0ZW1wbGF0
ZTx0eXBlbmFtZSBDb2xsZWN0aW9uPgotICAgIGNsYXNzIEluZGV4VG9UbXBJdGVyYWJsZUFkYXB0
b3IgewotICAgIHB1YmxpYzoKLSAgICAgICAgSW5kZXhUb1RtcEl0ZXJhYmxlQWRhcHRvcihjb25z
dCBDb2xsZWN0aW9uJiBjb2xsZWN0aW9uKQotICAgICAgICAgICAgOiBtX2NvbGxlY3Rpb24oY29s
bGVjdGlvbikKLSAgICAgICAgewotICAgICAgICB9Ci0KLSAgICAgICAgSW5kZXhUb1RtcEl0ZXJh
dG9yQWRhcHRvcjx0eXBlbmFtZSBDb2xsZWN0aW9uOjpjb25zdF9pdGVyYXRvcj4gYmVnaW4oKSBj
b25zdAotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbV9jb2xsZWN0aW9uLmJlZ2luKCk7
Ci0gICAgICAgIH0KLQotICAgICAgICBJbmRleFRvVG1wSXRlcmF0b3JBZGFwdG9yPHR5cGVuYW1l
IENvbGxlY3Rpb246OmNvbnN0X2l0ZXJhdG9yPiBlbmQoKSBjb25zdAotICAgICAgICB7Ci0gICAg
ICAgICAgICByZXR1cm4gbV9jb2xsZWN0aW9uLmVuZCgpOwotICAgICAgICB9Ci0KLSAgICBwcml2
YXRlOgotICAgICAgICBjb25zdCBDb2xsZWN0aW9uJiBtX2NvbGxlY3Rpb247Ci0gICAgfTsKLQot
ICAgIEluZGV4VG9UbXBJdGVyYWJsZUFkYXB0b3I8VmVjdG9yPHVuc2lnbmVkPj4gc3BpbGxlZFRt
cHMoKSBjb25zdCB7IHJldHVybiBtX3NwaWxsZWRUbXBzOyB9Ci0KLSAgICBib29sIHJlcXVpcmVz
U3BpbGxpbmcoKSBjb25zdCB7IHJldHVybiAhbV9zcGlsbGVkVG1wcy5pc0VtcHR5KCk7IH0KLQot
ICAgIFJlZyBhbGxvY2F0ZWRSZWcoVG1wIHRtcCkgY29uc3QKLSAgICB7Ci0gICAgICAgIEFTU0VS
VCghdG1wLmlzUmVnKCkpOwotICAgICAgICBBU1NFUlQobV9jb2xvcmVkVG1wLnNpemUoKSk7Ci0g
ICAgICAgIEFTU0VSVCh0bXAuaXNHUCgpID09ICh0eXBlID09IEFyZzo6R1ApKTsKLQotICAgICAg
ICBSZWcgcmVnID0gbV9jb2xvcmVkVG1wW0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0
ZUluZGV4KHRtcCldOwotICAgICAgICBpZiAoIXJlZykgewotICAgICAgICAgICAgZGF0YUxvZygi
RkFUQUw6IE5vIGNvbG9yIGZvciAiLCB0bXAsICJcbiIpOwotICAgICAgICAgICAgZGF0YUxvZygi
Q29kZTpcbiIpOwotICAgICAgICAgICAgZGF0YUxvZyhtX2NvZGUpOwotICAgICAgICAgICAgUkVM
RUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVn
OwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBzdGF0aWMgdW5zaWduZWQgdG1wQXJyYXlTaXplKENv
ZGUmIGNvZGUpCi0gICAgewotICAgICAgICB1bnNpZ25lZCBudW1UbXBzID0gY29kZS5udW1UbXBz
KHR5cGUpOwotICAgICAgICByZXR1cm4gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRl
SW5kZXgobnVtVG1wcyk7Ci0gICAgfQotCi0gICAgdm9pZCBpbml0aWFsaXplUHJlY29sb3JlZFRt
cCgpCi0gICAgewotICAgICAgICBtX2NvbG9yZWRUbXAucmVzaXplKG1fbGFzdFByZWNvbG9yZWRS
ZWdpc3RlckluZGV4ICsgMSk7Ci0gICAgICAgIGZvciAodW5zaWduZWQgaSA9IDE7IGkgPD0gbV9s
YXN0UHJlY29sb3JlZFJlZ2lzdGVySW5kZXg7ICsraSkgewotICAgICAgICAgICAgVG1wIHRtcCA9
IEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleChpKTsKLSAgICAg
ICAgICAgIEFTU0VSVCh0bXAuaXNSZWcoKSk7Ci0gICAgICAgICAgICBtX2NvbG9yZWRUbXBbaV0g
PSB0bXAucmVnKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBib29sIG1heUJlQ29hbGVzY2Vk
KEFyZyBsZWZ0LCBBcmcgcmlnaHQpCi0gICAgewotICAgICAgICBpZiAoIWxlZnQuaXNUbXAoKSB8
fCAhcmlnaHQuaXNUbXAoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBU
bXAgbGVmdFRtcCA9IGxlZnQudG1wKCk7Ci0gICAgICAgIFRtcCByaWdodFRtcCA9IHJpZ2h0LnRt
cCgpOwotCi0gICAgICAgIGlmIChsZWZ0VG1wID09IHJpZ2h0VG1wKQotICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOwotCi0gICAgICAgIGlmIChsZWZ0VG1wLmlzR1AoKSAhPSAodHlwZSA9PSBBcmc6
OkdQKSB8fCByaWdodFRtcC5pc0dQKCkgIT0gKHR5cGUgPT0gQXJnOjpHUCkpCi0gICAgICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgdW5zaWduZWQgbGVmdEluZGV4ID0gQWJzb2x1dGVU
bXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgobGVmdFRtcCk7Ci0gICAgICAgIHVuc2lnbmVk
IHJpZ2h0SW5kZXggPSBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChyaWdo
dFRtcCk7Ci0KLSAgICAgICAgcmV0dXJuICFtX2ludGVyZmVyZW5jZUVkZ2VzLmNvbnRhaW5zKElu
dGVyZmVyZW5jZUVkZ2UobGVmdEluZGV4LCByaWdodEluZGV4KSk7Ci0gICAgfQotCi0gICAgdm9p
ZCBhZGRUb0xvd1ByaW9yaXR5Q29hbGVzY2luZ0NhbmRpZGF0ZXMoQXJnIGxlZnQsIEFyZyByaWdo
dCkKLSAgICB7Ci0gICAgICAgIEFTU0VSVChtYXlCZUNvYWxlc2NlZChsZWZ0LCByaWdodCkpOwot
ICAgICAgICBUbXAgbGVmdFRtcCA9IGxlZnQudG1wKCk7Ci0gICAgICAgIFRtcCByaWdodFRtcCA9
IHJpZ2h0LnRtcCgpOwotCi0gICAgICAgIHVuc2lnbmVkIGxlZnRJbmRleCA9IEFic29sdXRlVG1w
TWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KGxlZnRUbXApOwotICAgICAgICB1bnNpZ25lZCBy
aWdodEluZGV4ID0gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgocmlnaHRU
bXApOwotCi0gICAgICAgIHVuc2lnbmVkIG5leHRNb3ZlSW5kZXggPSBtX2NvYWxlc2NpbmdDYW5k
aWRhdGVzLnNpemUoKTsKLSAgICAgICAgbV9jb2FsZXNjaW5nQ2FuZGlkYXRlcy5hcHBlbmQoeyBs
ZWZ0SW5kZXgsIHJpZ2h0SW5kZXggfSk7Ci0KLSAgICAgICAgdW5zaWduZWQgbmV3SW5kZXhJbldv
cmtsaXN0ID0gbV93b3JrbGlzdE1vdmVzLmFkZExvd1ByaW9yaXR5TW92ZSgpOwotICAgICAgICBB
U1NFUlRfVU5VU0VEKG5ld0luZGV4SW5Xb3JrbGlzdCwgbmV3SW5kZXhJbldvcmtsaXN0ID09IG5l
eHRNb3ZlSW5kZXgpOwotCi0gICAgICAgIEFTU0VSVChuZXh0TW92ZUluZGV4IDw9IG1fYWN0aXZl
TW92ZXMuc2l6ZSgpKTsKLSAgICAgICAgbV9hY3RpdmVNb3Zlcy5lbnN1cmVTaXplKG5leHRNb3Zl
SW5kZXggKyAxKTsKLQotICAgICAgICBtX21vdmVMaXN0W2xlZnRJbmRleF0uYWRkKG5leHRNb3Zl
SW5kZXgpOwotICAgICAgICBtX21vdmVMaXN0W3JpZ2h0SW5kZXhdLmFkZChuZXh0TW92ZUluZGV4
KTsKLSAgICB9Ci0KLSAgICB2b2lkIGJ1aWxkKCkKLSAgICB7Ci0gICAgICAgIFRtcExpdmVuZXNz
PHR5cGU+IGxpdmVuZXNzKG1fY29kZSk7Ci0gICAgICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sg
OiBtX2NvZGUpIHsKLSAgICAgICAgICAgIHR5cGVuYW1lIFRtcExpdmVuZXNzPHR5cGU+OjpMb2Nh
bENhbGMgbG9jYWxDYWxjKGxpdmVuZXNzLCBibG9jayk7Ci0gICAgICAgICAgICBmb3IgKHVuc2ln
bmVkIGluc3RJbmRleCA9IGJsb2NrLT5zaXplKCk7IGluc3RJbmRleC0tOykgewotICAgICAgICAg
ICAgICAgIEluc3QmIGluc3QgPSBibG9jay0+YXQoaW5zdEluZGV4KTsKLSAgICAgICAgICAgICAg
ICBJbnN0KiBuZXh0SW5zdCA9IGJsb2NrLT5nZXQoaW5zdEluZGV4ICsgMSk7Ci0gICAgICAgICAg
ICAgICAgYnVpbGQoJmluc3QsIG5leHRJbnN0LCBsb2NhbENhbGMpOwotICAgICAgICAgICAgICAg
IGxvY2FsQ2FsYy5leGVjdXRlKGluc3RJbmRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAg
ICBidWlsZChudWxscHRyLCAmYmxvY2stPmF0KDApLCBsb2NhbENhbGMpOwotICAgICAgICB9Ci0g
ICAgICAgIGJ1aWxkTG93UHJpb3JpdHlNb3ZlTGlzdCgpOwotICAgIH0KLQotICAgIHZvaWQgYnVp
bGQoSW5zdCogcHJldkluc3QsIEluc3QqIG5leHRJbnN0LCBjb25zdCB0eXBlbmFtZSBUbXBMaXZl
bmVzczx0eXBlPjo6TG9jYWxDYWxjJiBsb2NhbENhbGMpCi0gICAgewotICAgICAgICBpZiAodHJh
Y2VEZWJ1ZykKLSAgICAgICAgICAgIGRhdGFMb2coIkJ1aWxkaW5nIGJldHdlZW4gIiwgcG9pbnRl
ckR1bXAocHJldkluc3QpLCAiIGFuZCAiLCBwb2ludGVyRHVtcChuZXh0SW5zdCksICI6XG4iKTsK
LSAgICAgICAgSW5zdDo6Zm9yRWFjaERlZldpdGhFeHRyYUNsb2JiZXJlZFJlZ3M8VG1wPigKLSAg
ICAgICAgICAgIHByZXZJbnN0LCBuZXh0SW5zdCwKLSAgICAgICAgICAgIFsmXSAoY29uc3QgVG1w
JiBhcmcsIEFyZzo6Um9sZSwgQXJnOjpUeXBlIGFyZ1R5cGUsIEFyZzo6V2lkdGgpIHsKLSAgICAg
ICAgICAgICAgICBpZiAoYXJnVHlwZSAhPSB0eXBlKQotICAgICAgICAgICAgICAgICAgICByZXR1
cm47Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gQWxsIHRoZSBEZWYoKXMg
aW50ZXJmZXJlIHdpdGggZWFjaCBvdGhlciBhbmQgd2l0aCBhbGwgdGhlIGV4dHJhIGNsb2JiZXJl
ZCBUbXBzLgotICAgICAgICAgICAgICAgIC8vIFdlIHNob3VsZCBub3QgdXNlIGZvckVhY2hEZWZX
aXRoRXh0cmFDbG9iYmVyZWRSZWdzKCkgaGVyZSBzaW5jZSBjb2xvcmVkIFRtcHMKLSAgICAgICAg
ICAgICAgICAvLyBkbyBub3QgbmVlZCBpbnRlcmZlcmVuY2UgZWRnZXMgaW4gb3VyIGltcGxlbWVu
dGF0aW9uLgotICAgICAgICAgICAgICAgIEluc3Q6OmZvckVhY2hEZWY8VG1wPigKLSAgICAgICAg
ICAgICAgICAgICAgcHJldkluc3QsIG5leHRJbnN0LAotICAgICAgICAgICAgICAgICAgICBbJl0g
KFRtcCYgb3RoZXJBcmcsIEFyZzo6Um9sZSwgQXJnOjpUeXBlIGFyZ1R5cGUsIEFyZzo6V2lkdGgp
IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdUeXBlICE9IHR5cGUpCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0g
ICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2VEZWJ1ZykKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBkYXRhTG9nKCIgICAgQWRkaW5nIGRlZi1kZWYgZWRnZTogIiwgYXJnLCAiLCAi
LCBvdGhlckFyZywgIlxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5hZGRFZGdl
KGFyZywgb3RoZXJBcmcpOwotICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0p
OwotCi0gICAgICAgIGlmIChwcmV2SW5zdCAmJiBtYXlCZUNvYWxlc2NhYmxlKCpwcmV2SW5zdCkp
IHsKLSAgICAgICAgICAgIC8vIFdlIGRvIG5vdCB3YW50IHRoZSBVc2UoKSBvZiB0aGlzIG1vdmUg
dG8gaW50ZXJmZXJlIHdpdGggdGhlIERlZigpLCBldmVuIGlmIGl0IGlzIGxpdmUKLSAgICAgICAg
ICAgIC8vIGFmdGVyIHRoZSBNb3ZlLiBJZiB3ZSB3ZXJlIHRvIGFkZCB0aGUgaW50ZXJmZXJlbmNl
IGVkZ2UsIGl0IHdvdWxkIGJlIGltcG9zc2libGUgdG8KLSAgICAgICAgICAgIC8vIGNvYWxlc2Nl
IHRoZSBNb3ZlIGV2ZW4gaWYgdGhlIHR3byBUbXAgbmV2ZXIgaW50ZXJmZXJlIGFueXdoZXJlLgot
ICAgICAgICAgICAgVG1wIGRlZlRtcDsKLSAgICAgICAgICAgIFRtcCB1c2VUbXA7Ci0gICAgICAg
ICAgICBwcmV2SW5zdC0+Zm9yRWFjaFRtcChbJmRlZlRtcCwgJnVzZVRtcF0gKFRtcCYgYXJnVG1w
LCBBcmc6OlJvbGUgcm9sZSwgQXJnOjpUeXBlLCBBcmc6OldpZHRoKSB7Ci0gICAgICAgICAgICAg
ICAgaWYgKEFyZzo6aXNMYXRlRGVmKHJvbGUpKQotICAgICAgICAgICAgICAgICAgICBkZWZUbXAg
PSBhcmdUbXA7Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEFT
U0VSVChBcmc6OmlzRWFybHlVc2Uocm9sZSkpOwotICAgICAgICAgICAgICAgICAgICB1c2VUbXAg
PSBhcmdUbXA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAg
ICBBU1NFUlQoZGVmVG1wKTsKLSAgICAgICAgICAgIEFTU0VSVCh1c2VUbXApOwotCi0gICAgICAg
ICAgICB1bnNpZ25lZCBuZXh0TW92ZUluZGV4ID0gbV9jb2FsZXNjaW5nQ2FuZGlkYXRlcy5zaXpl
KCk7Ci0gICAgICAgICAgICBtX2NvYWxlc2NpbmdDYW5kaWRhdGVzLmFwcGVuZCh7IEFic29sdXRl
VG1wTWFwcGVyPHR5cGU+OjphYnNvbHV0ZUluZGV4KHVzZVRtcCksIEFic29sdXRlVG1wTWFwcGVy
PHR5cGU+OjphYnNvbHV0ZUluZGV4KGRlZlRtcCkgfSk7Ci0KLSAgICAgICAgICAgIHVuc2lnbmVk
IG5ld0luZGV4SW5Xb3JrbGlzdCA9IG1fd29ya2xpc3RNb3Zlcy5hZGRNb3ZlKCk7Ci0gICAgICAg
ICAgICBBU1NFUlRfVU5VU0VEKG5ld0luZGV4SW5Xb3JrbGlzdCwgbmV3SW5kZXhJbldvcmtsaXN0
ID09IG5leHRNb3ZlSW5kZXgpOwotCi0gICAgICAgICAgICBBU1NFUlQobmV4dE1vdmVJbmRleCA8
PSBtX2FjdGl2ZU1vdmVzLnNpemUoKSk7Ci0gICAgICAgICAgICBtX2FjdGl2ZU1vdmVzLmVuc3Vy
ZVNpemUobmV4dE1vdmVJbmRleCArIDEpOwotCi0gICAgICAgICAgICBmb3IgKGNvbnN0IEFyZyYg
YXJnIDogcHJldkluc3QtPmFyZ3MpIHsKLSAgICAgICAgICAgICAgICBhdXRvJiBsaXN0ID0gbV9t
b3ZlTGlzdFtBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleChhcmcudG1wKCkp
XTsKLSAgICAgICAgICAgICAgICBsaXN0LmFkZChuZXh0TW92ZUluZGV4KTsKLSAgICAgICAgICAg
IH0KLQotICAgICAgICAgICAgZm9yIChjb25zdCBUbXAmIGxpdmVUbXAgOiBsb2NhbENhbGMubGl2
ZSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxpdmVUbXAgIT0gdXNlVG1wKSB7Ci0gICAgICAg
ICAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQotICAgICAgICAgICAgICAgICAgICAgICAgZGF0
YUxvZygiICAgIEFkZGluZyBkZWYtbGl2ZSBmb3IgY29hbGVzY2FibGU6ICIsIGRlZlRtcCwgIiwg
IiwgbGl2ZVRtcCwgIlxuIik7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEVkZ2UoZGVmVG1wLCBs
aXZlVG1wKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAg
IC8vIFRoZSBuZXh0IGluc3RydWN0aW9uIGNvdWxkIGhhdmUgZWFybHkgY2xvYmJlcnMgb3IgZWFy
bHkgZGVmJ3MuIFdlIG5lZWQgdG8gY29uc2lkZXIKLSAgICAgICAgICAgIC8vIHRob3NlIG5vdy4K
LSAgICAgICAgICAgIGFkZEVkZ2VzKG51bGxwdHIsIG5leHRJbnN0LCBsb2NhbENhbGMubGl2ZSgp
KTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBhZGRFZGdlcyhwcmV2SW5zdCwgbmV4dElu
c3QsIGxvY2FsQ2FsYy5saXZlKCkpOwotICAgIH0KLQotICAgIHZvaWQgYnVpbGRMb3dQcmlvcml0
eU1vdmVMaXN0KCkKLSAgICB7Ci0gICAgICAgIGlmICghaXNYODYoKSkKLSAgICAgICAgICAgIHJl
dHVybjsKLQotICAgICAgICBtX3dvcmtsaXN0TW92ZXMuc3RhcnRBZGRpbmdMb3dQcmlvcml0eU1v
dmVzKCk7Ci0gICAgICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBtX2NvZGUpIHsKLSAgICAg
ICAgICAgIGZvciAoSW5zdCYgaW5zdCA6ICpibG9jaykgewotICAgICAgICAgICAgICAgIGlmIChz
dGQ6Om9wdGlvbmFsPHVuc2lnbmVkPiBkZWZBcmdJbmRleCA9IGluc3Quc2hvdWxkVHJ5QWxpYXNp
bmdEZWYoKSkgewotICAgICAgICAgICAgICAgICAgICBBcmcgb3AxID0gaW5zdC5hcmdzWypkZWZB
cmdJbmRleCAtIDJdOwotICAgICAgICAgICAgICAgICAgICBBcmcgb3AyID0gaW5zdC5hcmdzWypk
ZWZBcmdJbmRleCAtIDFdOwotICAgICAgICAgICAgICAgICAgICBBcmcgZGVzdCA9IGluc3QuYXJn
c1sqZGVmQXJnSW5kZXhdOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChvcDEgPT0gZGVzdCB8
fCBvcDIgPT0gZGVzdCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAg
ICAgICAgICAgICAgICAgIGlmIChtYXlCZUNvYWxlc2NlZChvcDEsIGRlc3QpKQotICAgICAgICAg
ICAgICAgICAgICAgICAgYWRkVG9Mb3dQcmlvcml0eUNvYWxlc2NpbmdDYW5kaWRhdGVzKG9wMSwg
ZGVzdCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvcDEgIT0gb3AyICYmIG1heUJlQ29hbGVz
Y2VkKG9wMiwgZGVzdCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBhZGRUb0xvd1ByaW9yaXR5
Q29hbGVzY2luZ0NhbmRpZGF0ZXMob3AyLCBkZXN0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGFkZEVkZ2VzKEluc3QqIHBy
ZXZJbnN0LCBJbnN0KiBuZXh0SW5zdCwgdHlwZW5hbWUgVG1wTGl2ZW5lc3M8dHlwZT46OkxvY2Fs
Q2FsYzo6SXRlcmFibGUgbGl2ZVRtcHMpCi0gICAgewotICAgICAgICAvLyBBbGwgdGhlIERlZigp
cyBpbnRlcmZlcmUgd2l0aCBldmVydGhpbmcgbGl2ZS4KLSAgICAgICAgSW5zdDo6Zm9yRWFjaERl
ZldpdGhFeHRyYUNsb2JiZXJlZFJlZ3M8VG1wPigKLSAgICAgICAgICAgIHByZXZJbnN0LCBuZXh0
SW5zdCwKLSAgICAgICAgICAgIFsmXSAoY29uc3QgVG1wJiBhcmcsIEFyZzo6Um9sZSwgQXJnOjpU
eXBlIGFyZ1R5cGUsIEFyZzo6V2lkdGgpIHsKLSAgICAgICAgICAgICAgICBpZiAoYXJnVHlwZSAh
PSB0eXBlKQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgCi0g
ICAgICAgICAgICAgICAgZm9yIChjb25zdCBUbXAmIGxpdmVUbXAgOiBsaXZlVG1wcykgewotICAg
ICAgICAgICAgICAgICAgICBBU1NFUlQobGl2ZVRtcC5pc0dQKCkgPT0gKHR5cGUgPT0gQXJnOjpH
UCkpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNl
RGVidWcpCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhTG9nKCIgICAgQWRkaW5nIGRlZi1s
aXZlIGVkZ2U6ICIsIGFyZywgIiwgIiwgbGl2ZVRtcCwgIlxuIik7Ci0gICAgICAgICAgICAgICAg
ICAgIAotICAgICAgICAgICAgICAgICAgICBhZGRFZGdlKGFyZywgbGl2ZVRtcCk7Ci0gICAgICAg
ICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gQXJnOjpHUCAmJiAhYXJn
LmlzR1BSKCkpCi0gICAgICAgICAgICAgICAgICAgIG1faW50ZXJmZXJlc1dpdGhGcmFtZVBvaW50
ZXIucXVpY2tTZXQoQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgoYXJnKSk7
Ci0gICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIGFkZEVkZ2UoVG1wIGEsIFRtcCBi
KQotICAgIHsKLSAgICAgICAgQVNTRVJUX1dJVEhfTUVTU0FHRShhLmlzR1AoKSA9PSBiLmlzR1Ao
KSwgIkFuIGludGVyZmVyZW5jZSBiZXR3ZWVuIHJlZ2lzdGVycyBvZiBkaWZmZXJlbnQgdHlwZXMg
ZG9lcyBub3QgbWFrZSBzZW5zZSwgaXQgY2FuIGxlYWQgdG8gbm9uLWNvbG9yYWJsZSBncmFwaHMu
Iik7Ci0KLSAgICAgICAgYWRkRWRnZShBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJ
bmRleChhKSwgQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgoYikpOwotICAg
IH0KLQotICAgIC8vIENhbGxpbmcgdGhpcyB3aXRob3V0IGEgdG1wV2lkdGggd2lsbCBwZXJmb3Jt
IGEgbW9yZSBjb25zZXJ2YXRpdmUgY29hbGVzY2luZyBhbmFseXNpcyB0aGF0IGFzc3VtZXMKLSAg
ICAvLyB0aGF0IE1vdmUzMidzIGFyZSBub3QgY29hbGVzY2FibGUuCi0gICAgc3RhdGljIGJvb2wg
bWF5QmVDb2FsZXNjYWJsZUltcGwoY29uc3QgSW5zdCYgaW5zdCwgVG1wV2lkdGgqIHRtcFdpZHRo
KQotICAgIHsKLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgIGNhc2UgQXJnOjpHUDoK
LSAgICAgICAgICAgIHN3aXRjaCAoaW5zdC5raW5kLm9wY29kZSkgewotICAgICAgICAgICAgY2Fz
ZSBNb3ZlOgotICAgICAgICAgICAgY2FzZSBNb3ZlMzI6Ci0gICAgICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFyZzo6RlA6Ci0g
ICAgICAgICAgICBzd2l0Y2ggKGluc3Qua2luZC5vcGNvZGUpIHsKLSAgICAgICAgICAgIGNhc2Ug
TW92ZUZsb2F0OgotICAgICAgICAgICAgY2FzZSBNb3ZlRG91YmxlOgotICAgICAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFs
c2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAg
ICAgIEFTU0VSVF9XSVRIX01FU1NBR0UoaW5zdC5hcmdzLnNpemUoKSA9PSAyLCAiV2UgYXNzdW1l
IGNvYWxlY2FibGUgbW92ZXMgb25seSBoYXZlIHR3byBhcmd1bWVudHMgaW4gYSBmZXcgcGxhY2Vz
LiIpOwotCi0gICAgICAgIGlmICghaW5zdC5hcmdzWzBdLmlzVG1wKCkgfHwgIWluc3QuYXJnc1sx
XS5pc1RtcCgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIEFTU0VSVChp
bnN0LmFyZ3NbMF0udHlwZSgpID09IHR5cGUpOwotICAgICAgICBBU1NFUlQoaW5zdC5hcmdzWzFd
LnR5cGUoKSA9PSB0eXBlKTsKLQotICAgICAgICAvLyBXZSBjYW4gY29hbGVzY2UgYSBNb3ZlMzIg
c28gbG9uZyBhcyBlaXRoZXIgb2YgdGhlIGZvbGxvd2luZyBob2xkczoKLSAgICAgICAgLy8gLSBU
aGUgaW5wdXQgaXMgYWxyZWFkeSB6ZXJvLWZpbGxlZC4KLSAgICAgICAgLy8gLSBUaGUgb3V0cHV0
IG9ubHkgY2FyZXMgYWJvdXQgdGhlIGxvdyAzMiBiaXRzLgotICAgICAgICAvLwotICAgICAgICAv
LyBOb3RlIHRoYXQgdGhlIGlucHV0IHByb3BlcnR5IHJlcXVpcmVzIGFuIGFuYWx5c2lzIG92ZXIg
WkRlZidzLCBzbyBpdCdzIG9ubHkgdmFsaWQgc28gbG9uZwotICAgICAgICAvLyBhcyB0aGUgaW5w
dXQgZ2V0cyBhIHJlZ2lzdGVyLiBXZSBkb24ndCBrbm93IGlmIHRoZSBpbnB1dCBnZXRzIGEgcmVn
aXN0ZXIsIGJ1dCB3ZSBkbyBrbm93Ci0gICAgICAgIC8vIHRoYXQgaWYgaXQgZG9lc24ndCBnZXQg
YSByZWdpc3RlciB0aGVuIHdlIHdpbGwgc3RpbGwgZW1pdCB0aGlzIE1vdmUzMi4KLSAgICAgICAg
aWYgKGluc3Qua2luZC5vcGNvZGUgPT0gTW92ZTMyKSB7Ci0gICAgICAgICAgICBpZiAoIXRtcFdp
ZHRoKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgaWYgKHRt
cFdpZHRoLT5kZWZXaWR0aChpbnN0LmFyZ3NbMF0udG1wKCkpID4gQXJnOjpXaWR0aDMyCi0gICAg
ICAgICAgICAgICAgJiYgdG1wV2lkdGgtPnVzZVdpZHRoKGluc3QuYXJnc1sxXS50bXAoKSkgPiBB
cmc6OldpZHRoMzIpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0g
ICAgICAgIAotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICB2b2lkIHNlbGVjdFNw
aWxsKCkKLSAgICB7Ci0gICAgICAgIGlmICghbV9oYXNTZWxlY3RlZFNwaWxsKSB7Ci0gICAgICAg
ICAgICBtX2hhc1NlbGVjdGVkU3BpbGwgPSB0cnVlOwotCi0gICAgICAgICAgICBpZiAobV9oYXND
b2FsZXNjZWROb25Ucml2aWFsTW92ZSkKLSAgICAgICAgICAgICAgICBtX2NvYWxlc2NlZFRtcHNB
dFNwaWxsID0gbV9jb2FsZXNjZWRUbXBzOwotICAgICAgICB9Ci0KLSAgICAgICAgYXV0byBpdGVy
YXRvciA9IG1fc3BpbGxXb3JrbGlzdC5iZWdpbigpOwotCi0gICAgICAgIFJFTEVBU0VfQVNTRVJU
X1dJVEhfTUVTU0FHRShpdGVyYXRvciAhPSBtX3NwaWxsV29ya2xpc3QuZW5kKCksICJzZWxlY3RT
cGlsbCgpIGNhbGxlZCB3aGVuIHRoZXJlIHdhcyBubyBzcGlsbC4iKTsKLSAgICAgICAgUkVMRUFT
RV9BU1NFUlRfV0lUSF9NRVNTQUdFKCFtX3Vuc3BpbGxhYmxlVG1wcy5jb250YWlucygqaXRlcmF0
b3IpLCAidHJ5aW5nIHRvIHNwaWxsIHVuc3BpbGxhYmxlIHRtcCIpOwotCi0gICAgICAgIC8vIEhp
Z2hlciBzY29yZSBtZWFucyBtb3JlIGRlc2lyYWJsZSB0byBzcGlsbC4gTG93ZXIgc2NvcmVzIG1h
eGltaXplIHRoZSBsaWtlbGlob29kIHRoYXQgYSB0bXAKLSAgICAgICAgLy8gZ2V0cyBhIHJlZ2lz
dGVyLgotICAgICAgICBhdXRvIHNjb3JlID0gWyZdIChUbXAgdG1wKSAtPiBkb3VibGUgewotICAg
ICAgICAgICAgLy8gQWlyIGV4cG9zZXMgdGhlIGNvbmNlcHQgb2YgImZhc3QgdG1wcyIsIGFuZCB3
ZSBpbnRlcnByZXQgdGhhdCB0byBtZWFuIHRoYXQgdGhlIHRtcAotICAgICAgICAgICAgLy8gc2hv
dWxkIGFsd2F5cyBiZSBpbiBhIHJlZ2lzdGVyLgotICAgICAgICAgICAgaWYgKG1fY29kZS5pc0Zh
c3RUbXAodG1wKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIAotICAg
ICAgICAgICAgLy8gQWxsIGVsc2UgYmVpbmcgZXF1YWwsIHRoZSBzY29yZSBzaG91bGQgYmUgZGly
ZWN0bHkgcmVsYXRlZCB0byB0aGUgZGVncmVlLgotICAgICAgICAgICAgZG91YmxlIGRlZ3JlZSA9
IHN0YXRpY19jYXN0PGRvdWJsZT4obV9kZWdyZWVzW0Fic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojph
YnNvbHV0ZUluZGV4KHRtcCldKTsKLQotICAgICAgICAgICAgLy8gQWxsIGVsc2UgYmVpbmcgZXF1
YWwsIHRoZSBzY29yZSBzaG91bGQgYmUgaW52ZXJzZWx5IHJlbGF0ZWQgdG8gdGhlIG51bWJlciBv
ZiB3YXJtIHVzZXMgYW5kCi0gICAgICAgICAgICAvLyBkZWZzLgotICAgICAgICAgICAgY29uc3Qg
VXNlQ291bnRzPFRtcD46OkNvdW50cyogY291bnRzID0gbV91c2VDb3VudHNbdG1wXTsKLSAgICAg
ICAgICAgIGlmICghY291bnRzKQotICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNf
bGltaXRzPGRvdWJsZT46OmluZmluaXR5KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGRv
dWJsZSB1c2VzID0gY291bnRzLT5udW1XYXJtVXNlcyArIGNvdW50cy0+bnVtRGVmczsKLQotICAg
ICAgICAgICAgLy8gSWYgaXQncyBhIGNvbnN0YW50LCB0aGVuIGl0J3Mgbm90IGFzIGJhZCB0byBz
cGlsbC4gV2UgY2FuIHJlbWF0ZXJpYWxpemUgaXQgaW4gbWFueQotICAgICAgICAgICAgLy8gY2Fz
ZXMuCi0gICAgICAgICAgICBpZiAoY291bnRzLT5udW1Db25zdERlZnMgPT0gMSAmJiBjb3VudHMt
Pm51bURlZnMgPT0gMSkKLSAgICAgICAgICAgICAgICB1c2VzIC89IDI7Ci0KLSAgICAgICAgICAg
IHJldHVybiBkZWdyZWUgLyB1c2VzOwotICAgICAgICB9OwotCi0gICAgICAgIGF1dG8gdmljdGlt
SXRlcmF0b3IgPSBpdGVyYXRvcjsKLSAgICAgICAgZG91YmxlIG1heFNjb3JlID0gc2NvcmUoQWJz
b2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KCppdGVyYXRvcikpOwot
Ci0gICAgICAgICsraXRlcmF0b3I7Ci0gICAgICAgIGZvciAoO2l0ZXJhdG9yICE9IG1fc3BpbGxX
b3JrbGlzdC5lbmQoKTsgKytpdGVyYXRvcikgewotICAgICAgICAgICAgZG91YmxlIHRtcFNjb3Jl
ID0gc2NvcmUoQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KCpp
dGVyYXRvcikpOwotICAgICAgICAgICAgaWYgKHRtcFNjb3JlID4gbWF4U2NvcmUpIHsKLSAgICAg
ICAgICAgICAgICBBU1NFUlQoIW1fdW5zcGlsbGFibGVUbXBzLmNvbnRhaW5zKCppdGVyYXRvcikp
OwotICAgICAgICAgICAgICAgIHZpY3RpbUl0ZXJhdG9yID0gaXRlcmF0b3I7Ci0gICAgICAgICAg
ICAgICAgbWF4U2NvcmUgPSB0bXBTY29yZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0g
ICAgICAgIHVuc2lnbmVkIHZpY3RpbUluZGV4ID0gKnZpY3RpbUl0ZXJhdG9yOwotICAgICAgICBt
X3NwaWxsV29ya2xpc3QucmVtb3ZlKHZpY3RpbUl0ZXJhdG9yKTsKLSAgICAgICAgbV9zaW1wbGlm
eVdvcmtsaXN0LmFwcGVuZCh2aWN0aW1JbmRleCk7Ci0KLSAgICAgICAgZnJlZXplTW92ZXModmlj
dGltSW5kZXgpOwotICAgIH0KLQotICAgIHZvaWQgYWxsb2NhdGUoKQotICAgIHsKLSAgICAgICAg
QVNTRVJUX1dJVEhfTUVTU0FHRShtX2FjdGl2ZU1vdmVzLnNpemUoKSA+PSBtX2NvYWxlc2NpbmdD
YW5kaWRhdGVzLnNpemUoKSwgIlRoZSBhY3RpdmVNb3ZlIHNldCBzaG91bGQgYmUgYmlnIGVub3Vn
aCBmb3IgdGhlIHF1aWNrIG9wZXJhdGlvbnMgb2YgQml0VmVjdG9yLiIpOwotCi0gICAgICAgIG1h
a2VXb3JrTGlzdCgpOwotCi0gICAgICAgIGlmIChkZWJ1ZykgewotICAgICAgICAgICAgZGF0YUxv
ZygiSW50ZXJmZXJlbmNlOiAiLCBsaXN0RHVtcChtX2ludGVyZmVyZW5jZUVkZ2VzKSwgIlxuIik7
Ci0gICAgICAgICAgICBkdW1wSW50ZXJmZXJlbmNlR3JhcGhJbkRvdChXVEY6OmRhdGFGaWxlKCkp
OwotICAgICAgICAgICAgZGF0YUxvZygiQ29hbGVzY2luZyBjYW5kaWRhdGVzOlxuIik7Ci0gICAg
ICAgICAgICBmb3IgKE1vdmVPcGVyYW5kcyYgbW92ZU9wIDogbV9jb2FsZXNjaW5nQ2FuZGlkYXRl
cykgewotICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICAiLCBBYnNvbHV0ZVRtcE1hcHBlcjx0
eXBlPjo6dG1wRnJvbUFic29sdXRlSW5kZXgobW92ZU9wLnNyY0luZGV4KSwKLSAgICAgICAgICAg
ICAgICAgICAgIiAtPiAiLCBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29sdXRl
SW5kZXgobW92ZU9wLmRzdEluZGV4KSwgIlxuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAg
ICBkYXRhTG9nKCJJbml0aWFsIHdvcmsgbGlzdFxuIik7Ci0gICAgICAgICAgICBkdW1wV29ya0xp
c3RzKFdURjo6ZGF0YUZpbGUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBkbyB7Ci0gICAgICAg
ICAgICBpZiAodHJhY2VEZWJ1ZykgewotICAgICAgICAgICAgICAgIGRhdGFMb2coIkJlZm9yZSBH
cmFwaCBzaW1wbGlmaWNhdGlvbiBpdGVyYXRpb25cbiIpOwotICAgICAgICAgICAgICAgIGR1bXBX
b3JrTGlzdHMoV1RGOjpkYXRhRmlsZSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAg
aWYgKCFtX3NpbXBsaWZ5V29ya2xpc3QuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIHNpbXBs
aWZ5KCk7Ci0gICAgICAgICAgICBlbHNlIGlmICghbV93b3JrbGlzdE1vdmVzLmlzRW1wdHkoKSkK
LSAgICAgICAgICAgICAgICBjb2FsZXNjZSgpOwotICAgICAgICAgICAgZWxzZSBpZiAoIW1fZnJl
ZXplV29ya2xpc3QuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIGZyZWV6ZSgpOwotICAgICAg
ICAgICAgZWxzZSBpZiAoIW1fc3BpbGxXb3JrbGlzdC5pc0VtcHR5KCkpCi0gICAgICAgICAgICAg
ICAgc2VsZWN0U3BpbGwoKTsKLQotICAgICAgICAgICAgaWYgKHRyYWNlRGVidWcpIHsKLSAgICAg
ICAgICAgICAgICBkYXRhTG9nKCJBZnRlciBHcmFwaCBzaW1wbGlmaWNhdGlvbiBpdGVyYXRpb25c
biIpOwotICAgICAgICAgICAgICAgIGR1bXBXb3JrTGlzdHMoV1RGOjpkYXRhRmlsZSgpKTsKLSAg
ICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSAoIW1fc2ltcGxpZnlXb3JrbGlzdC5pc0VtcHR5
KCkgfHwgIW1fd29ya2xpc3RNb3Zlcy5pc0VtcHR5KCkgfHwgIW1fZnJlZXplV29ya2xpc3QuaXNF
bXB0eSgpIHx8ICFtX3NwaWxsV29ya2xpc3QuaXNFbXB0eSgpKTsKLQotICAgICAgICBhc3NpZ25D
b2xvcnMoKTsKLSAgICB9Ci0KLSNpZiBQTEFURk9STShDT0NPQSkKLSNwcmFnbWEgbWFyayAtIERl
YnVnZ2luZyBoZWxwZXJzLgotI2VuZGlmCi0KLSAgICB2b2lkIGR1bXBJbnRlcmZlcmVuY2VHcmFw
aEluRG90KFByaW50U3RyZWFtJiBvdXQpCi0gICAgewotICAgICAgICBvdXQucHJpbnQoImdyYXBo
IEludGVyZmVyZW5jZUdyYXBoIHsgXG4iKTsKLQotICAgICAgICBIYXNoU2V0PFRtcD4gdG1wc1dp
dGhJbnRlcmZlcmVuY2VzOwotICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGVkZ2UgOiBtX2ludGVy
ZmVyZW5jZUVkZ2VzKSB7Ci0gICAgICAgICAgICB0bXBzV2l0aEludGVyZmVyZW5jZXMuYWRkKEFi
c29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleChlZGdlLmZpcnN0KCkp
KTsKLSAgICAgICAgICAgIHRtcHNXaXRoSW50ZXJmZXJlbmNlcy5hZGQoQWJzb2x1dGVUbXBNYXBw
ZXI8dHlwZT46OnRtcEZyb21BYnNvbHV0ZUluZGV4KGVkZ2Uuc2Vjb25kKCkpKTsKLSAgICAgICAg
fQotCi0gICAgICAgIGZvciAoY29uc3QgYXV0byYgdG1wIDogdG1wc1dpdGhJbnRlcmZlcmVuY2Vz
KSB7Ci0gICAgICAgICAgICB1bnNpZ25lZCB0bXBJbmRleCA9IEFic29sdXRlVG1wTWFwcGVyPHR5
cGU+OjphYnNvbHV0ZUluZGV4KHRtcCk7Ci0gICAgICAgICAgICBpZiAodG1wSW5kZXggPCBtX2Rl
Z3JlZXMuc2l6ZSgpKQotICAgICAgICAgICAgICAgIG91dC5wcmludCgiICAgICIsIHRtcC5pbnRl
cm5hbFZhbHVlKCksICIgW2xhYmVsPVwiIiwgdG1wLCAiICgiLCBtX2RlZ3JlZXNbdG1wSW5kZXhd
LCAiKVwiXTtcbiIpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG91dC5wcmlu
dCgiICAgICIsIHRtcC5pbnRlcm5hbFZhbHVlKCksICIgW2xhYmVsPVwiIiwgdG1wLCAiXCJdO1xu
Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGVkZ2UgOiBtX2ludGVy
ZmVyZW5jZUVkZ2VzKQotICAgICAgICAgICAgb3V0LnByaW50KCIgICAgIiwgZWRnZS5maXJzdCgp
LCAiIC0tICIsIGVkZ2Uuc2Vjb25kKCksICI7XG4iKTsKLSAgICAgICAgb3V0LnByaW50KCJ9XG4i
KTsKLSAgICB9Ci0KLSAgICB2b2lkIGR1bXBXb3JrTGlzdHMoUHJpbnRTdHJlYW0mIG91dCkKLSAg
ICB7Ci0gICAgICAgIG91dC5wcmludCgiU2ltcGxpZnkgd29yayBsaXN0OlxuIik7Ci0gICAgICAg
IGZvciAodW5zaWduZWQgdG1wSW5kZXggOiBtX3NpbXBsaWZ5V29ya2xpc3QpCi0gICAgICAgICAg
ICBvdXQucHJpbnQoIiAgICAiLCBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6dG1wRnJvbUFic29s
dXRlSW5kZXgodG1wSW5kZXgpLCAiXG4iKTsKLSAgICAgICAgb3V0LnByaW50ZigiTW92ZXMgd29y
ayBsaXN0IGlzIGVtcHR5PyAlZFxuIiwgbV93b3JrbGlzdE1vdmVzLmlzRW1wdHkoKSk7Ci0gICAg
ICAgIG91dC5wcmludCgiRnJlZXplIHdvcmsgbGlzdDpcbiIpOwotICAgICAgICBmb3IgKHVuc2ln
bmVkIHRtcEluZGV4IDogbV9mcmVlemVXb3JrbGlzdCkKLSAgICAgICAgICAgIG91dC5wcmludCgi
ICAgICIsIEFic29sdXRlVG1wTWFwcGVyPHR5cGU+Ojp0bXBGcm9tQWJzb2x1dGVJbmRleCh0bXBJ
bmRleCksICJcbiIpOwotICAgICAgICBvdXQucHJpbnQoIlNwaWxsIHdvcmsgbGlzdDpcbiIpOwot
ICAgICAgICBmb3IgKHVuc2lnbmVkIHRtcEluZGV4IDogbV9zcGlsbFdvcmtsaXN0KQotICAgICAg
ICAgICAgb3V0LnByaW50KCIgICAgIiwgQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OnRtcEZyb21B
YnNvbHV0ZUluZGV4KHRtcEluZGV4KSwgIlxuIik7Ci0gICAgfQotCi0gICAgdXNpbmcgQWJzdHJh
Y3RDb2xvcmluZ0FsbG9jYXRvcjx1bnNpZ25lZD46OmFkZEVkZ2U7Ci0gICAgdXNpbmcgQWJzdHJh
Y3RDb2xvcmluZ0FsbG9jYXRvcjx1bnNpZ25lZD46OmdldEFsaWFzOwotCi0gICAgQ29kZSYgbV9j
b2RlOwotICAgIFRtcFdpZHRoJiBtX3RtcFdpZHRoOwotICAgIC8vIEZJWE1FOiBzcGlsbGluZyBz
aG91bGQgbm90IHR5cGUgc3BlY2lmaWMuIEl0IGlzIG9ubHkgYSBzaWRlIGVmZmVjdCBvZiB1c2lu
ZyBVc2VDb3VudHMuCi0gICAgY29uc3QgVXNlQ291bnRzPFRtcD4mIG1fdXNlQ291bnRzOwotfTsK
LQotY2xhc3MgSXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcgewotcHVibGljOgotICAgIEl0ZXJh
dGVkUmVnaXN0ZXJDb2FsZXNjaW5nKENvZGUmIGNvZGUpCi0gICAgICAgIDogbV9jb2RlKGNvZGUp
Ci0gICAgICAgICwgbV91c2VDb3VudHMoY29kZSkKLSAgICB7Ci0gICAgfQotCi0gICAgdm9pZCBy
dW4oKQotICAgIHsKLSAgICAgICAgcGFkSW50ZXJmZXJlbmNlKG1fY29kZSk7Ci0gICAgICAgIAot
ICAgICAgICBpdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZ09uVHlwZTxBcmc6OkdQPigpOwotICAg
ICAgICBpdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZ09uVHlwZTxBcmc6OkZQPigpOwotCi0gICAg
ICAgIGZpeFNwaWxsc0FmdGVyVGVybWluYWxzKCk7Ci0KLSAgICAgICAgaWYgKHJlcG9ydFN0YXRz
KQotICAgICAgICAgICAgZGF0YUxvZygiTnVtIGl0ZXJhdGlvbnMgPSAiLCBtX251bUl0ZXJhdGlv
bnMsICJcbiIpOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICB0ZW1wbGF0ZTxBcmc6OlR5cGUgdHlw
ZT4KLSAgICB2b2lkIGl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nT25UeXBlKCkKLSAgICB7Ci0g
ICAgICAgIEhhc2hTZXQ8dW5zaWduZWQ+IHVuc3BpbGxhYmxlVG1wcyA9IGNvbXB1dGVVbnNwaWxs
YWJsZVRtcHM8dHlwZT4oKTsKLQotICAgICAgICAvLyBGSVhNRTogSWYgYSBUbXAgaXMgdXNlZCBv
bmx5IGZyb20gYSBTY3JhdGNoIHJvbGUgYW5kIHRoYXQgYXJndW1lbnQgaXMgIWFkbWl0c1N0YWNr
LCB0aGVuCi0gICAgICAgIC8vIHdlIHNob3VsZCBhZGQgdGhlIFRtcCB0byB1bnNwaWxsYWJsZVRt
cHMuIFRoYXQgd2lsbCBoZWxwIGF2b2lkIHJlbG9vcGluZyBvbmx5IHRvIHR1cm4gdGhlCi0gICAg
ICAgIC8vIFRtcCBpbnRvIGFuIHVuc3BpbGxhYmxlIFRtcC4KLSAgICAgICAgLy8gaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1MjY5OQotICAgICAgICAKLSAgICAgICAg
d2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICsrbV9udW1JdGVyYXRpb25zOwotCi0gICAgICAg
ICAgICBpZiAodHJhY2VEZWJ1ZykKLSAgICAgICAgICAgICAgICBkYXRhTG9nKCJDb2RlIGF0IGl0
ZXJhdGlvbiAiLCBtX251bUl0ZXJhdGlvbnMsICI6XG4iLCBtX2NvZGUpOwotCi0gICAgICAgICAg
ICAvLyBGSVhNRTogT25lIHdheSB0byBvcHRpbWl6ZSB0aGlzIGNvZGUgaXMgdG8gcmVtb3ZlIHRo
ZSByZWNvbXB1dGF0aW9uIGluc2lkZSB0aGUgZml4cG9pbnQuCi0gICAgICAgICAgICAvLyBXZSBu
ZWVkIHRvIHJlY29tcHV0ZSBiZWNhdXNlIHNwaWxsaW5nIGFkZHMgdG1wcywgYnV0IHdlIGNvdWxk
IGp1c3QgdXBkYXRlIHRtcFdpZHRoIHdoZW4gd2UKLSAgICAgICAgICAgIC8vIGFkZCB0aG9zZSB0
bXBzLiBOb3RlIHRoYXQgb25lIGVhc3kgd2F5IHRvIHJlbW92ZSB0aGUgcmVjb21wdXRhdGlvbiBp
cyB0byBtYWtlIGFueSBuZXdseQotICAgICAgICAgICAgLy8gYWRkZWQgVG1wcyBnZXQgdGhlIHNh
bWUgdXNlL2RlZiB3aWR0aHMgdGhhdCB0aGUgb3JpZ2luYWwgVG1wIGdvdC4gQnV0LCB0aGlzIG1h
eSBodXJ0IHRoZQotICAgICAgICAgICAgLy8gc3BpbGwgY29kZSB3ZSBlbWl0LiBTaW5jZSB3ZSBj
dXJyZW50bHkgcmVjb21wdXRlIFRtcFdpZHRoIGFmdGVyIHNwaWxsaW5nLCB0aGUgbmV3bHkKLSAg
ICAgICAgICAgIC8vIGNyZWF0ZWQgVG1wcyBtYXkgZ2V0IG5hcnJvd2VyIHVzZS9kZWYgd2lkdGhz
LiBPbiB0aGUgb3RoZXIgaGFuZCwgdGhlIHNwaWxsZXIgYWxyZWFkeQotICAgICAgICAgICAgLy8g
c2VsZWN0cyB3aGljaCBtb3ZlIGluc3RydWN0aW9uIHRvIHVzZSBiYXNlZCBvbiB0aGUgb3JpZ2lu
YWwgVG1wJ3Mgd2lkdGhzLCBzbyBpdCBtYXkgbm90Ci0gICAgICAgICAgICAvLyBtYXR0ZXIgdGhh
biBhIHN1YnNlcXVlbnQgaXRlcmF0aW9uIHNlZXMgYSBjb3NlcnZhdGl2ZSB3aWR0aCBmb3IgdGhl
IG5ldyBUbXBzLiBBbHNvLCB0aGUKLSAgICAgICAgICAgIC8vIHJlY29tcHV0YXRpb24gbWF5IG5v
dCBhY3R1YWxseSBiZSBhIHBlcmZvcm1hbmNlIHByb2JsZW07IGl0J3MgbGlrZWx5IHRoYXQgYSBi
ZXR0ZXIgd2F5IHRvCi0gICAgICAgICAgICAvLyBpbXByb3ZlIHBlcmZvcm1hbmNlIG9mIFRtcFdp
ZHRoIGlzIHRvIHJlcGxhY2UgaXRzIEhhc2hNYXAgd2l0aCBzb21ldGhpbmcgZWxzZS4gSXQncwot
ICAgICAgICAgICAgLy8gcG9zc2libGUgdGhhdCBtb3N0IG9mIHRoZSBUbXBXaWR0aCBvdmVyaGVh
ZCBpcyBmcm9tIHF1ZXJpZXMgb2YgVG1wV2lkdGggcmF0aGVyIHRoYW4gdGhlCi0gICAgICAgICAg
ICAvLyByZWNvbXB1dGF0aW9uLCBpbiB3aGljaCBjYXNlIHNwZWVkaW5nIHVwIHRoZSBsb29rdXAg
d291bGQgYmUgYSBiaWdnZXIgd2luLgotICAgICAgICAgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTE1MjQ3OAotICAgICAgICAgICAgbV90bXBXaWR0aC5yZWNv
bXB1dGUobV9jb2RlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgQ29sb3JpbmdBbGxvY2F0
b3I8dHlwZT4gYWxsb2NhdG9yKG1fY29kZSwgbV90bXBXaWR0aCwgbV91c2VDb3VudHMsIHVuc3Bp
bGxhYmxlVG1wcyk7Ci0gICAgICAgICAgICBpZiAoIWFsbG9jYXRvci5yZXF1aXJlc1NwaWxsaW5n
KCkpIHsKLSAgICAgICAgICAgICAgICBhc3NpZ25SZWdpc3RlcnNUb1RtcChhbGxvY2F0b3IpOwot
ICAgICAgICAgICAgICAgIGlmICh0cmFjZURlYnVnKQotICAgICAgICAgICAgICAgICAgICBkYXRh
TG9nKCJTdWNjZXNzZnVsbCBhbGxvY2F0aW9uIGF0IGl0ZXJhdGlvbiAiLCBtX251bUl0ZXJhdGlv
bnMsICI6XG4iLCBtX2NvZGUpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAg
ICAgfQotICAgICAgICAgICAgYWRkU3BpbGxBbmRGaWxsPHR5cGU+KGFsbG9jYXRvciwgdW5zcGls
bGFibGVUbXBzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHRlbXBsYXRlPEFyZzo6VHlwZSB0
eXBlPgotICAgIEhhc2hTZXQ8dW5zaWduZWQ+IGNvbXB1dGVVbnNwaWxsYWJsZVRtcHMoKQotICAg
IHsKLSAgICAgICAgSGFzaFNldDx1bnNpZ25lZD4gdW5zcGlsbGFibGVUbXBzOwotCi0gICAgICAg
IHN0cnVjdCBSYW5nZSB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBmaXJzdCB7IHN0ZDo6bnVtZXJp
Y19saW1pdHM8dW5zaWduZWQ+OjptYXgoKSB9OwotICAgICAgICAgICAgdW5zaWduZWQgbGFzdCB7
IDAgfTsKLSAgICAgICAgICAgIHVuc2lnbmVkIGNvdW50IHsgMCB9OwotICAgICAgICAgICAgdW5z
aWduZWQgYWRtaXRTdGFja0NvdW50IHsgMCB9OwotICAgICAgICB9OwotCi0gICAgICAgIHVuc2ln
bmVkIG51bVRtcHMgPSBtX2NvZGUubnVtVG1wcyh0eXBlKTsKLSAgICAgICAgdW5zaWduZWQgYXJy
YXlTaXplID0gQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgobnVtVG1wcyk7
Ci0KLSAgICAgICAgVmVjdG9yPFJhbmdlLCAwLCBVbnNhZmVWZWN0b3JPdmVyZmxvdz4gcmFuZ2Vz
OwotICAgICAgICByYW5nZXMuZmlsbChSYW5nZSgpLCBhcnJheVNpemUpOwotCi0gICAgICAgIHVu
c2lnbmVkIGdsb2JhbEluZGV4ID0gMDsKLSAgICAgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6
IG1fY29kZSkgewotICAgICAgICAgICAgZm9yIChJbnN0JiBpbnN0IDogKmJsb2NrKSB7Ci0gICAg
ICAgICAgICAgICAgaW5zdC5mb3JFYWNoQXJnKFsmXSAoQXJnJiBhcmcsIEFyZzo6Um9sZSwgQXJn
OjpUeXBlIGFyZ1R5cGUsIEFyZzo6V2lkdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFy
Zy5pc1RtcCgpICYmIGluc3QuYWRtaXRzU3RhY2soYXJnKSkgewotICAgICAgICAgICAgICAgICAg
ICAgICAgaWYgKGFyZ1R5cGUgIT0gdHlwZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBy
ZXR1cm47Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRtcCB0bXAgPSBhcmcudG1wKCk7Ci0g
ICAgICAgICAgICAgICAgICAgICAgICBSYW5nZSYgcmFuZ2UgPSByYW5nZXNbQWJzb2x1dGVUbXBN
YXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgodG1wKV07Ci0gICAgICAgICAgICAgICAgICAgICAg
ICByYW5nZS5jb3VudCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuYWRtaXRTdGFj
a0NvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2xvYmFsSW5kZXggPCByYW5n
ZS5maXJzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmZpcnN0ID0gZ2xv
YmFsSW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UubGFzdCA9IGdsb2Jh
bEluZGV4OwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgcmFuZ2UubGFzdCA9IGdsb2JhbEluZGV4OwotCi0gICAgICAgICAgICAgICAg
ICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAg
ICAgICBhcmcuZm9yRWFjaFRtcEZhc3QoWyZdIChUbXAmIHRtcCkgewotICAgICAgICAgICAgICAg
ICAgICAgICAgaWYgKHRtcC5pc0dQKCkgIT0gKHR5cGUgPT0gQXJnOjpHUCkpCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBSYW5n
ZSYgcmFuZ2UgPSByYW5nZXNbQWJzb2x1dGVUbXBNYXBwZXI8dHlwZT46OmFic29sdXRlSW5kZXgo
dG1wKV07Ci0gICAgICAgICAgICAgICAgICAgICAgICByYW5nZS5jb3VudCsrOwotICAgICAgICAg
ICAgICAgICAgICAgICAgaWYgKGdsb2JhbEluZGV4IDwgcmFuZ2UuZmlyc3QpIHsKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICByYW5nZS5maXJzdCA9IGdsb2JhbEluZGV4OwotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHJhbmdlLmxhc3QgPSBnbG9iYWxJbmRleDsKLSAgICAgICAgICAg
ICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmxh
c3QgPSBnbG9iYWxJbmRleDsKLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAg
ICAgfSk7Ci0KLSAgICAgICAgICAgICAgICArK2dsb2JhbEluZGV4OwotICAgICAgICAgICAgfQot
ICAgICAgICAgICAgKytnbG9iYWxJbmRleDsKLSAgICAgICAgfQotICAgICAgICBmb3IgKHVuc2ln
bmVkIGkgPSBBYnNvbHV0ZVRtcE1hcHBlcjx0eXBlPjo6bGFzdE1hY2hpbmVSZWdpc3RlckluZGV4
KCkgKyAxOyBpIDwgcmFuZ2VzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICBSYW5nZSYgcmFu
Z2UgPSByYW5nZXNbaV07Ci0gICAgICAgICAgICBpZiAocmFuZ2UubGFzdCAtIHJhbmdlLmZpcnN0
IDw9IDEgJiYgcmFuZ2UuY291bnQgPiByYW5nZS5hZG1pdFN0YWNrQ291bnQpCi0gICAgICAgICAg
ICAgICAgdW5zcGlsbGFibGVUbXBzLmFkZChpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVy
biB1bnNwaWxsYWJsZVRtcHM7Ci0gICAgfQotCi0gICAgdGVtcGxhdGU8QXJnOjpUeXBlIHR5cGU+
Ci0gICAgdm9pZCBhc3NpZ25SZWdpc3RlcnNUb1RtcChjb25zdCBDb2xvcmluZ0FsbG9jYXRvcjx0
eXBlPiYgYWxsb2NhdG9yKQotICAgIHsKLSAgICAgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6
IG1fY29kZSkgewotICAgICAgICAgICAgLy8gR2l2ZSBUbXAgYSB2YWxpZCByZWdpc3Rlci4KLSAg
ICAgICAgICAgIGZvciAodW5zaWduZWQgaW5zdEluZGV4ID0gMDsgaW5zdEluZGV4IDwgYmxvY2st
PnNpemUoKTsgKytpbnN0SW5kZXgpIHsKLSAgICAgICAgICAgICAgICBJbnN0JiBpbnN0ID0gYmxv
Y2stPmF0KGluc3RJbmRleCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBUaGUgbWF5QmVDb2FsZXNj
YWJsZSgpIG1ldGhvZCB3aWxsIGNoYW5nZSBpdHMgbWluZCBmb3Igc29tZSBvcGVyYXRpb25zIGFm
dGVyIHdlCi0gICAgICAgICAgICAgICAgLy8gY29tcGxldGUgcmVnaXN0ZXIgYWxsb2NhdGlvbi4g
U28sIHdlIHJlY29yZCB0aGlzIGJlZm9yZSBzdGFydGluZy4KLSAgICAgICAgICAgICAgICBib29s
IG1heUJlQ29hbGVzY2FibGUgPSBhbGxvY2F0b3IubWF5QmVDb2FsZXNjYWJsZShpbnN0KTsKLQot
ICAgICAgICAgICAgICAgIC8vIE1vdmUzMiBpcyBjaGVhcGVyIGlmIHdlIGtub3cgdGhhdCBpdCdz
IGVxdWl2YWxlbnQgdG8gYSBNb3ZlLiBJdCdzCi0gICAgICAgICAgICAgICAgLy8gZXF1aXZhbGVu
dCBpZiB0aGUgZGVzdGluYXRpb24ncyBoaWdoIGJpdHMgYXJlIG5vdCBvYnNlcnZhYmxlIG9yIGlm
IHRoZSBzb3VyY2UncyBoaWdoCi0gICAgICAgICAgICAgICAgLy8gYml0cyBhcmUgYWxsIHplcm8u
IE5vdGUgdGhhdCB3ZSBkb24ndCBoYXZlIHRoZSBvcHBvc2l0ZSBvcHRpbWl6YXRpb24gZm9yIG90
aGVyCi0gICAgICAgICAgICAgICAgLy8gYXJjaGl0ZWN0dXJlcywgd2hpY2ggbWF5IHByZWZlciBN
b3ZlIG92ZXIgTW92ZTMyLCBiZWNhdXNlIE1vdmUgaXMgY2Fub25pY2FsIGFscmVhZHkuCi0gICAg
ICAgICAgICAgICAgaWYgKHR5cGUgPT0gQXJnOjpHUCAmJiBpbnN0LmtpbmQub3Bjb2RlID09IE1v
dmUKLSAgICAgICAgICAgICAgICAgICAgJiYgaW5zdC5hcmdzWzBdLmlzVG1wKCkgJiYgaW5zdC5h
cmdzWzFdLmlzVG1wKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1fdG1wV2lkdGgudXNl
V2lkdGgoaW5zdC5hcmdzWzFdLnRtcCgpKSA8PSBBcmc6OldpZHRoMzIKLSAgICAgICAgICAgICAg
ICAgICAgICAgIHx8IG1fdG1wV2lkdGguZGVmV2lkdGgoaW5zdC5hcmdzWzBdLnRtcCgpKSA8PSBB
cmc6OldpZHRoMzIpCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnN0LmtpbmQub3Bjb2RlID0g
TW92ZTMyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGluc3QuZm9yRWFj
aFRtcEZhc3QoWyZdIChUbXAmIHRtcCkgewotICAgICAgICAgICAgICAgICAgICBpZiAodG1wLmlz
UmVnKCkgfHwgdG1wLmlzR1AoKSA9PSAodHlwZSAhPSBBcmc6OkdQKSkKLSAgICAgICAgICAgICAg
ICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgICAgICAgICBUbXAgYWxpYXNUbXAgPSBh
bGxvY2F0b3IuZ2V0QWxpYXModG1wKTsKLSAgICAgICAgICAgICAgICAgICAgVG1wIGFzc2lnbmVk
VG1wOwotICAgICAgICAgICAgICAgICAgICBpZiAoYWxpYXNUbXAuaXNSZWcoKSkKLSAgICAgICAg
ICAgICAgICAgICAgICAgIGFzc2lnbmVkVG1wID0gVG1wKGFsaWFzVG1wLnJlZygpKTsKLSAgICAg
ICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdXRvIHJlZyA9
IGFsbG9jYXRvci5hbGxvY2F0ZWRSZWcoYWxpYXNUbXApOwotICAgICAgICAgICAgICAgICAgICAg
ICAgQVNTRVJUKHJlZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZFRtcCA9IFRt
cChyZWcpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEFTU0VS
VChhc3NpZ25lZFRtcC5pc1JlZygpKTsKLSAgICAgICAgICAgICAgICAgICAgdG1wID0gYXNzaWdu
ZWRUbXA7Ci0gICAgICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobWF5QmVD
b2FsZXNjYWJsZSAmJiBpbnN0LmFyZ3NbMF0uaXNUbXAoKSAmJiBpbnN0LmFyZ3NbMV0uaXNUbXAo
KQotICAgICAgICAgICAgICAgICAgICAmJiBpbnN0LmFyZ3NbMF0udG1wKCkgPT0gaW5zdC5hcmdz
WzFdLnRtcCgpKQotICAgICAgICAgICAgICAgICAgICBpbnN0ID0gSW5zdCgpOwotICAgICAgICAg
ICAgfQotCi0gICAgICAgICAgICAvLyBSZW1vdmUgYWxsIHRoZSB1c2VsZXNzIG1vdmVzIHdlIGNy
ZWF0ZWQgaW4gdGhpcyBibG9jay4KLSAgICAgICAgICAgIGJsb2NrLT5pbnN0cygpLnJlbW92ZUFs
bE1hdGNoaW5nKFsmXSAoY29uc3QgSW5zdCYgaW5zdCkgewotICAgICAgICAgICAgICAgIHJldHVy
biAhaW5zdDsKLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGlj
IHVuc2lnbmVkIHN0YWNrU2xvdE1pbmltdW1XaWR0aChBcmc6OldpZHRoIHdpZHRoKQotICAgIHsK
LSAgICAgICAgcmV0dXJuIHdpZHRoIDw9IEFyZzo6V2lkdGgzMiA/IDQgOiA4OwotICAgIH0KLQot
ICAgIHRlbXBsYXRlPEFyZzo6VHlwZSB0eXBlPgotICAgIHZvaWQgYWRkU3BpbGxBbmRGaWxsKGNv
bnN0IENvbG9yaW5nQWxsb2NhdG9yPHR5cGU+JiBhbGxvY2F0b3IsIEhhc2hTZXQ8dW5zaWduZWQ+
JiB1bnNwaWxsYWJsZVRtcHMpCi0gICAgewotICAgICAgICBIYXNoTWFwPFRtcCwgU3RhY2tTbG90
Kj4gc3RhY2tTbG90czsKLSAgICAgICAgZm9yIChUbXAgdG1wIDogYWxsb2NhdG9yLnNwaWxsZWRU
bXBzKCkpIHsKLSAgICAgICAgICAgIC8vIEFsbCB0aGUgc3BpbGxlZCB2YWx1ZXMgYmVjb21lIHVu
c3BpbGxhYmxlLgotICAgICAgICAgICAgdW5zcGlsbGFibGVUbXBzLmFkZChBYnNvbHV0ZVRtcE1h
cHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh0bXApKTsKLQotICAgICAgICAgICAgLy8gQWxsb2Nh
dGUgc3RhY2sgc2xvdCBmb3IgZWFjaCBzcGlsbGVkIHZhbHVlLgotICAgICAgICAgICAgU3RhY2tT
bG90KiBzdGFja1Nsb3QgPSBtX2NvZGUuYWRkU3RhY2tTbG90KAotICAgICAgICAgICAgICAgIHN0
YWNrU2xvdE1pbmltdW1XaWR0aChtX3RtcFdpZHRoLnJlcXVpcmVkV2lkdGgodG1wKSksIFN0YWNr
U2xvdEtpbmQ6OlNwaWxsKTsKLSAgICAgICAgICAgIGJvb2wgaXNOZXdUbXAgPSBzdGFja1Nsb3Rz
LmFkZCh0bXAsIHN0YWNrU2xvdCkuaXNOZXdFbnRyeTsKLSAgICAgICAgICAgIEFTU0VSVF9VTlVT
RUQoaXNOZXdUbXAsIGlzTmV3VG1wKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJld3JpdGUg
dGhlIHByb2dyYW0gdG8gZ2V0IHJpZCBvZiB0aGUgc3BpbGxlZCBUbXAuCi0gICAgICAgIEluc2Vy
dGlvblNldCBpbnNlcnRpb25TZXQobV9jb2RlKTsKLSAgICAgICAgZm9yIChCYXNpY0Jsb2NrKiBi
bG9jayA6IG1fY29kZSkgewotICAgICAgICAgICAgYm9vbCBoYXNBbGlhc2VkVG1wcyA9IGZhbHNl
OwotCi0gICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGluc3RJbmRleCA9IDA7IGluc3RJbmRleCA8
IGJsb2NrLT5zaXplKCk7ICsraW5zdEluZGV4KSB7Ci0gICAgICAgICAgICAgICAgSW5zdCYgaW5z
dCA9IGJsb2NrLT5hdChpbnN0SW5kZXgpOwotCi0gICAgICAgICAgICAgICAgLy8gVGhlIFRtcFdp
ZHRoIGFuYWx5c2lzIHdpbGwgc2F5IHRoYXQgYSBNb3ZlIG9ubHkgc3RvcmVzIDMyIGJpdHMgaW50
byB0aGUgZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgLy8gaWYgdGhlIHNvdXJjZSBvbmx5
IGhhZCAzMiBiaXRzIHdvcnRoIG9mIG5vbi16ZXJvIGJpdHMuIFNhbWUgZm9yIHRoZSBzb3VyY2U6
IGl0IHdpbGwKLSAgICAgICAgICAgICAgICAvLyBvbmx5IGNsYWltIHRvIHJlYWQgMzIgYml0cyBm
cm9tIHRoZSBzb3VyY2UgaWYgb25seSAzMiBiaXRzIG9mIHRoZSBkZXN0aW5hdGlvbiBhcmUKLSAg
ICAgICAgICAgICAgICAvLyByZWFkLiBOb3RlIHRoYXQgd2Ugb25seSBhcHBseSB0aGlzIGxvZ2lj
IGlmIHRoaXMgdHVybnMgaW50byBhIGxvYWQgb3Igc3RvcmUsIHNpbmNlCi0gICAgICAgICAgICAg
ICAgLy8gTW92ZSBpcyB0aGUgY2Fub25pY2FsIHdheSB0byBtb3ZlIGRhdGEgYmV0d2VlbiBHUFJz
LgotICAgICAgICAgICAgICAgIGJvb2wgY2FuVXNlTW92ZTMySWZEaWRTcGlsbCA9IGZhbHNlOwot
ICAgICAgICAgICAgICAgIGJvb2wgZGlkU3BpbGwgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBp
ZiAodHlwZSA9PSBBcmc6OkdQICYmIGluc3Qua2luZC5vcGNvZGUgPT0gTW92ZSkgewotICAgICAg
ICAgICAgICAgICAgICBpZiAoKGluc3QuYXJnc1swXS5pc1RtcCgpICYmIG1fdG1wV2lkdGgud2lk
dGgoaW5zdC5hcmdzWzBdLnRtcCgpKSA8PSBBcmc6OldpZHRoMzIpCi0gICAgICAgICAgICAgICAg
ICAgICAgICB8fCAoaW5zdC5hcmdzWzFdLmlzVG1wKCkgJiYgbV90bXBXaWR0aC53aWR0aChpbnN0
LmFyZ3NbMV0udG1wKCkpIDw9IEFyZzo6V2lkdGgzMikpCi0gICAgICAgICAgICAgICAgICAgICAg
ICBjYW5Vc2VNb3ZlMzJJZkRpZFNwaWxsID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAg
ICAgICAgICAgICAgICAvLyBUcnkgdG8gcmVwbGFjZSB0aGUgcmVnaXN0ZXIgdXNlIGJ5IG1lbW9y
eSB1c2Ugd2hlbiBwb3NzaWJsZS4KLSAgICAgICAgICAgICAgICBpbnN0LmZvckVhY2hBcmcoCi0g
ICAgICAgICAgICAgICAgICAgIFsmXSAoQXJnJiBhcmcsIEFyZzo6Um9sZSByb2xlLCBBcmc6OlR5
cGUgYXJnVHlwZSwgQXJnOjpXaWR0aCB3aWR0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAg
aWYgKCFhcmcuaXNUbXAoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0g
ICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnVHlwZSAhPSB0eXBlKQotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmcu
aXNSZWcoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAg
ICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gc3RhY2tTbG90RW50
cnkgPSBzdGFja1Nsb3RzLmZpbmQoYXJnLnRtcCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAg
IGlmIChzdGFja1Nsb3RFbnRyeSA9PSBzdGFja1Nsb3RzLmVuZCgpKQotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5zdC5h
ZG1pdHNTdGFjayhhcmcpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAg
ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhl
IFRtcCBob2xkcyBhIGNvbnN0YW50IHRoZW4gd2Ugd2FudCB0byByZW1hdGVyaWFsaXplIGl0cwot
ICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWUgcmF0aGVyIHRoYW4gbG9hZGluZyBpdCBm
cm9tIHRoZSBzdGFjay4gSW4gb3JkZXIgZm9yIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAg
IC8vIG9wdGltaXphdGlvbiB0byBraWNrIGluLCB3ZSBuZWVkIHRvIGF2b2lkIHBsYWNpbmcgdGhl
IFRtcCdzIHN0YWNrCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGRyZXNzIGludG8gdGhl
IGluc3RydWN0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBcmc6OmlzQ29sZFVz
ZShyb2xlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVzZUNvdW50czxU
bXA+OjpDb3VudHMqIGNvdW50cyA9IG1fdXNlQ291bnRzW2FyZy50bXAoKV07Ci0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgaWYgKGNvdW50cyAmJiBjb3VudHMtPm51bUNvbnN0RGVmcyA9PSAx
ICYmIGNvdW50cy0+bnVtRGVmcyA9PSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAg
ICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIEFyZzo6V2lkdGggc3BpbGxXaWR0aCA9IG1f
dG1wV2lkdGgucmVxdWlyZWRXaWR0aChhcmcudG1wKCkpOwotICAgICAgICAgICAgICAgICAgICAg
ICAgaWYgKEFyZzo6aXNBbnlEZWYocm9sZSkgJiYgd2lkdGggPCBzcGlsbFdpZHRoKQotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFT
U0VSVChpbnN0LmtpbmQub3Bjb2RlID09IE1vdmUgfHwgIShBcmc6OmlzQW55VXNlKHJvbGUpICYm
IHdpZHRoID4gc3BpbGxXaWR0aCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAg
ICAgICAgICAgICAgICAgICBpZiAoc3BpbGxXaWR0aCAhPSBBcmc6OldpZHRoMzIpCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgY2FuVXNlTW92ZTMySWZEaWRTcGlsbCA9IGZhbHNlOwotICAg
ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGFja1Nsb3RF
bnRyeS0+dmFsdWUtPmVuc3VyZVNpemUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Fu
VXNlTW92ZTMySWZEaWRTcGlsbCA/IDQgOiBBcmc6OmJ5dGVzKHdpZHRoKSk7Ci0gICAgICAgICAg
ICAgICAgICAgICAgICBhcmcgPSBBcmc6OnN0YWNrKHN0YWNrU2xvdEVudHJ5LT52YWx1ZSk7Ci0g
ICAgICAgICAgICAgICAgICAgICAgICBkaWRTcGlsbCA9IHRydWU7Ci0gICAgICAgICAgICAgICAg
ICAgIH0pOwotCi0gICAgICAgICAgICAgICAgaWYgKGRpZFNwaWxsICYmIGNhblVzZU1vdmUzMklm
RGlkU3BpbGwpCi0gICAgICAgICAgICAgICAgICAgIGluc3Qua2luZC5vcGNvZGUgPSBNb3ZlMzI7
Ci0KLSAgICAgICAgICAgICAgICAvLyBGb3IgZXZlcnkgb3RoZXIgY2FzZSwgYWRkIExvYWQvU3Rv
cmUgYXMgbmVlZGVkLgotICAgICAgICAgICAgICAgIGluc3QuZm9yRWFjaFRtcChbJl0gKFRtcCYg
dG1wLCBBcmc6OlJvbGUgcm9sZSwgQXJnOjpUeXBlIGFyZ1R5cGUsIEFyZzo6V2lkdGgpIHsKLSAg
ICAgICAgICAgICAgICAgICAgaWYgKHRtcC5pc1JlZygpIHx8IGFyZ1R5cGUgIT0gdHlwZSkKLSAg
ICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgICAgICAgICBhdXRv
IHN0YWNrU2xvdEVudHJ5ID0gc3RhY2tTbG90cy5maW5kKHRtcCk7Ci0gICAgICAgICAgICAgICAg
ICAgIGlmIChzdGFja1Nsb3RFbnRyeSA9PSBzdGFja1Nsb3RzLmVuZCgpKSB7Ci0gICAgICAgICAg
ICAgICAgICAgICAgICBUbXAgYWxpYXMgPSBhbGxvY2F0b3IuZ2V0QWxpYXNXaGVuU3BpbGxpbmco
dG1wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbGlhcyAhPSB0bXApIHsKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBhbGlhczsKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBoYXNBbGlhc2VkVG1wcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9
Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0K
LQotICAgICAgICAgICAgICAgICAgICBBcmc6OldpZHRoIHNwaWxsV2lkdGggPSBtX3RtcFdpZHRo
LnJlcXVpcmVkV2lkdGgodG1wKTsKLSAgICAgICAgICAgICAgICAgICAgT3Bjb2RlIG1vdmUgPSBP
b3BzOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN0YWNrU2xvdE1pbmltdW1XaWR0aChz
cGlsbFdpZHRoKSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAg
ICAgICAgICAgICBtb3ZlID0gdHlwZSA9PSBBcmc6OkdQID8gTW92ZTMyIDogTW92ZUZsb2F0Owot
ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2Ug
ODoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vdmUgPSB0eXBlID09IEFyZzo6R1AgPyBNb3Zl
IDogTW92ZURvdWJsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAg
ICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgUkVMRUFTRV9BU1NF
UlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgdG1wID0gbV9jb2RlLm5ld1Rt
cCh0eXBlKTsKLSAgICAgICAgICAgICAgICAgICAgdW5zcGlsbGFibGVUbXBzLmFkZChBYnNvbHV0
ZVRtcE1hcHBlcjx0eXBlPjo6YWJzb2x1dGVJbmRleCh0bXApKTsKLQotICAgICAgICAgICAgICAg
ICAgICBBcmcgYXJnID0gQXJnOjpzdGFjayhzdGFja1Nsb3RFbnRyeS0+dmFsdWUpOwotICAgICAg
ICAgICAgICAgICAgICBpZiAoQXJnOjppc0FueVVzZShyb2xlKSAmJiByb2xlICE9IEFyZzo6U2Ny
YXRjaCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydGlvblNldC5pbnNlcnQoaW5zdElu
ZGV4LCBtb3ZlLCBpbnN0Lm9yaWdpbiwgYXJnLCB0bXApOwotICAgICAgICAgICAgICAgICAgICBp
ZiAoQXJnOjppc0FueURlZihyb2xlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydGlv
blNldC5pbnNlcnQoaW5zdEluZGV4ICsgMSwgbW92ZSwgaW5zdC5vcmlnaW4sIHRtcCwgYXJnKTsK
LSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGluc2VydGlv
blNldC5leGVjdXRlKGJsb2NrKTsKLQotICAgICAgICAgICAgaWYgKGhhc0FsaWFzZWRUbXBzKSB7
Ci0gICAgICAgICAgICAgICAgYmxvY2stPmluc3RzKCkucmVtb3ZlQWxsTWF0Y2hpbmcoWyZdIChj
b25zdCBJbnN0JiBpbnN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBhbGxvY2F0b3Iu
aXNVc2VsZXNzTW92ZShpbnN0KTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0K
LSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZml4U3BpbGxzQWZ0ZXJUZXJtaW5hbHMoKQot
ICAgIHsKLSAgICAgICAgLy8gQmVjYXVzZSB0aGVyZSBtYXkgYmUgdGVybWluYWxzIHRoYXQgcHJv
ZHVjZSB2YWx1ZXMsIElSQyBtYXkKLSAgICAgICAgLy8gd2FudCB0byBzcGlsbCB0aG9zZSB0ZXJt
aW5hbHMuIEl0J2xsIGhhcHBlbiB0byBzcGlsbCBpdCBhZnRlcgotICAgICAgICAvLyB0aGUgdGVy
bWluYWwuIElmIHdlIGxlZnQgdGhlIGdyYXBoIGluIHRoaXMgc3RhdGUsIGl0J2QgYmUgaW52YWxp
ZAotICAgICAgICAvLyBiZWNhdXNlIGEgdGVybWluYWwgbXVzdCBiZSB0aGUgbGFzdCBpbnN0cnVj
dGlvbiBpbiBhIGJsb2NrLgotICAgICAgICAvLyBXZSBmaXggdGhhdCBoZXJlLgotCi0gICAgICAg
IEluc2VydGlvblNldCBpbnNlcnRpb25TZXQobV9jb2RlKTsKLQotICAgICAgICBib29sIGFkZGVk
QmxvY2tzID0gZmFsc2U7Ci0KLSAgICAgICAgZm9yIChCYXNpY0Jsb2NrKiBibG9jayA6IG1fY29k
ZSkgewotICAgICAgICAgICAgdW5zaWduZWQgdGVybWluYWxJbmRleCA9IGJsb2NrLT5zaXplKCk7
Ci0gICAgICAgICAgICBib29sIGZvdW5kVGVybWluYWwgPSBmYWxzZTsKLSAgICAgICAgICAgIHdo
aWxlICh0ZXJtaW5hbEluZGV4LS0pIHsKLSAgICAgICAgICAgICAgICBpZiAoYmxvY2stPmF0KHRl
cm1pbmFsSW5kZXgpLmlzVGVybWluYWwoKSkgewotICAgICAgICAgICAgICAgICAgICBmb3VuZFRl
cm1pbmFsID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAg
ICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgQVNTRVJUX1VOVVNFRChmb3VuZFRlcm1p
bmFsLCBmb3VuZFRlcm1pbmFsKTsKLQotICAgICAgICAgICAgaWYgKHRlcm1pbmFsSW5kZXggPT0g
YmxvY2stPnNpemUoKSAtIDEpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAg
ICAgIC8vIFRoZXJlIG11c3QgYmUgaW5zdHJ1Y3Rpb25zIGFmdGVyIHRoZSB0ZXJtaW5hbCBiZWNh
dXNlIGl0J3Mgbm90IHRoZSBsYXN0IGluc3RydWN0aW9uLgotICAgICAgICAgICAgQVNTRVJUKHRl
cm1pbmFsSW5kZXggPCBibG9jay0+c2l6ZSgpIC0gMSk7Ci0gICAgICAgICAgICBWZWN0b3I8SW5z
dCwgMT4gaW5zdHNUb01vdmU7Ci0gICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSB0ZXJtaW5h
bEluZGV4ICsgMTsgaSA8IGJsb2NrLT5zaXplKCk7IGkrKykKLSAgICAgICAgICAgICAgICBpbnN0
c1RvTW92ZS5hcHBlbmQoYmxvY2stPmF0KGkpKTsKLSAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJU
KGluc3RzVG9Nb3ZlLnNpemUoKSk7Ci0KLSAgICAgICAgICAgIGZvciAoRnJlcXVlbnRlZEJsb2Nr
JiBmcmVxdWVudGVkU3VjY2Vzc29yIDogYmxvY2stPnN1Y2Nlc3NvcnMoKSkgewotICAgICAgICAg
ICAgICAgIEJhc2ljQmxvY2sqIHN1Y2Nlc3NvciA9IGZyZXF1ZW50ZWRTdWNjZXNzb3IuYmxvY2so
KTsKLSAgICAgICAgICAgICAgICAvLyBJZiBzdWNjZXNzb3IncyBvbmx5IHByZWRlY2Vzc29yIGlz
IGJsb2NrLCB3ZSBjYW4gcGxhbnQgdGhlIHNwaWxsIGluc2lkZQotICAgICAgICAgICAgICAgIC8v
IHRoZSBzdWNjZXNzb3IuIE90aGVyd2lzZSwgd2UgbXVzdCBzcGxpdCB0aGUgY3JpdGljYWwgZWRn
ZSBhbmQgY3JlYXRlCi0gICAgICAgICAgICAgICAgLy8gYSBuZXcgYmxvY2sgZm9yIHRoZSBzcGls
bC4KLSAgICAgICAgICAgICAgICBpZiAoc3VjY2Vzc29yLT5udW1QcmVkZWNlc3NvcnMoKSA9PSAx
KSB7Ci0gICAgICAgICAgICAgICAgICAgIGluc2VydGlvblNldC5pbnNlcnRJbnN0cygwLCBpbnN0
c1RvTW92ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGluc2VydGlvblNldC5leGVjdXRlKHN1Y2Nl
c3Nvcik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYWRk
ZWRCbG9ja3MgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogV2UgcHJvYmFi
bHkgd2FudCBiZXR0ZXIgYmxvY2sgb3JkZXJpbmcgaGVyZS4KLSAgICAgICAgICAgICAgICAgICAg
QmFzaWNCbG9jayogbmV3QmxvY2sgPSBtX2NvZGUuYWRkQmxvY2soKTsKLSAgICAgICAgICAgICAg
ICAgICAgZm9yIChjb25zdCBJbnN0JiBpbnN0IDogaW5zdHNUb01vdmUpCi0gICAgICAgICAgICAg
ICAgICAgICAgICBuZXdCbG9jay0+YXBwZW5kSW5zdChpbnN0KTsKLSAgICAgICAgICAgICAgICAg
ICAgbmV3QmxvY2stPmFwcGVuZEluc3QoSW5zdChKdW1wLCBpbnN0c1RvTW92ZS5sYXN0KCkub3Jp
Z2luKSk7Ci0gICAgICAgICAgICAgICAgICAgIG5ld0Jsb2NrLT5zdWNjZXNzb3JzKCkuYXBwZW5k
KHN1Y2Nlc3Nvcik7Ci0gICAgICAgICAgICAgICAgICAgIGZyZXF1ZW50ZWRTdWNjZXNzb3IuYmxv
Y2soKSA9IG5ld0Jsb2NrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAg
ICAgICAgICAgYmxvY2stPnJlc2l6ZSh0ZXJtaW5hbEluZGV4ICsgMSk7Ci0gICAgICAgIH0KLQot
ICAgICAgICBpZiAoYWRkZWRCbG9ja3MpCi0gICAgICAgICAgICBtX2NvZGUucmVzZXRSZWFjaGFi
aWxpdHkoKTsKLSAgICB9Ci0KLSAgICBDb2RlJiBtX2NvZGU7Ci0gICAgVG1wV2lkdGggbV90bXBX
aWR0aDsKLSAgICBVc2VDb3VudHM8VG1wPiBtX3VzZUNvdW50czsKLSAgICB1bnNpZ25lZCBtX251
bUl0ZXJhdGlvbnMgeyAwIH07Ci19OwotCi19IC8vIGFub255bW91cyBuYW1lc3BhY2UKLQotdm9p
ZCBpdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZyhDb2RlJiBjb2RlKQotewotICAgIFBoYXNlU2Nv
cGUgcGhhc2VTY29wZShjb2RlLCAiaXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmciKTsKLSAgICAK
LSAgICBJdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZyBpdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2lu
Zyhjb2RlKTsKLSAgICBpdGVyYXRlZFJlZ2lzdGVyQ29hbGVzY2luZy5ydW4oKTsKLX0KLQotfSB9
IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgotCi0jZW5kaWYgLy8gRU5BQkxFKEIzX0pJVCkK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlySXRlcmF0ZWRSZWdpc3RlckNv
YWxlc2NpbmcuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0Fp
ckl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nLmgJKHJldmlzaW9uIDIxMjc5NykKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlySXRlcmF0ZWRSZWdpc3RlckNvYWxlc2NpbmcuaAko
bm9uZXhpc3RlbnQpCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQotICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKLSAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAot
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCi0gKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi0gKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2lmIEVOQUJMRShCM19KSVQpCi0K
LW5hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgQjMgeyBuYW1lc3BhY2UgQWlyIHsKLQotY2xhc3Mg
Q29kZTsKLQotLy8gVGhpcyBpcyBhIHJlZ2lzdGVyIGFsbG9jYXRpb24gcGhhc2UgYmFzZWQgb24g
QW5kcmV3IEFwcGVsJ3MgSXRlcmF0ZWQgUmVnaXN0ZXIgQ29hbGVzY2luZwotLy8gaHR0cDovL3d3
dy5jcy5jbXUuZWR1L2Fmcy9jcy9hY2FkZW1pYy9jbGFzcy8xNTc0NS1zMDcvd3d3L3BhcGVycy9n
ZW9yZ2UucGRmCi12b2lkIGl0ZXJhdGVkUmVnaXN0ZXJDb2FsZXNjaW5nKENvZGUmKTsKLQotfSB9
IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjM6OkFpcgotCi0jZW5kaWYgLy8gRU5BQkxFKEIzX0pJVCkK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL09wdGlvbnMuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9PcHRpb25zLmgJKHJldmlzaW9uIDIx
Mjc5NykKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL09wdGlvbnMuaAkod29ya2lu
ZyBjb3B5KQpAQCAtMzkzLDYgKzM5Myw4IEBAIHR5cGVkZWYgY29uc3QgY2hhciogb3B0aW9uU3Ry
aW5nOwogICAgIHYoYm9vbCwgbG9nQjNQaGFzZVRpbWVzLCBmYWxzZSwgTm9ybWFsLCBudWxscHRy
KSBcCiAgICAgdihkb3VibGUsIHJhcmVCbG9ja1BlbmFsdHksIDAuMDAxLCBOb3JtYWwsIG51bGxw
dHIpIFwKICAgICB2KGJvb2wsIGFpclNwaWxsc0V2ZXJ5dGhpbmcsIGZhbHNlLCBOb3JtYWwsIG51
bGxwdHIpIFwKKyAgICB2KGJvb2wsIGFpckZvcmNlQnJpZ2dzQWxsb2NhdG9yLCBmYWxzZSwgTm9y
bWFsLCBudWxscHRyKSBcCisgICAgdihib29sLCBhaXJGb3JjZUlSQ0FsbG9jYXRvciwgZmFsc2Us
IE5vcm1hbCwgbnVsbHB0cikgXAogICAgIHYoYm9vbCwgbG9nQWlyUmVnaXN0ZXJQcmVzc3VyZSwg
ZmFsc2UsIE5vcm1hbCwgbnVsbHB0cikgXAogICAgIHYodW5zaWduZWQsIG1heEIzVGFpbER1cEJs
b2NrU2l6ZSwgMywgTm9ybWFsLCBudWxscHRyKSBcCiAgICAgdih1bnNpZ25lZCwgbWF4QjNUYWls
RHVwQmxvY2tTdWNjZXNzb3JzLCAzLCBOb3JtYWwsIG51bGxwdHIpIFwKSW5kZXg6IFRvb2xzL1Nj
cmlwdHMvcnVuLWpzYy1zdHJlc3MtdGVzdHMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvU2NyaXB0cy9y
dW4tanNjLXN0cmVzcy10ZXN0cwkocmV2aXNpb24gMjEyNzk3KQorKysgVG9vbHMvU2NyaXB0cy9y
dW4tanNjLXN0cmVzcy10ZXN0cwkod29ya2luZyBjb3B5KQpAQCAtODU0LDE1ICs4NTQsMTUgQEAg
ZGVmIHJ1bkZUTE5vQ0pJVCgqb3B0aW9uYWxUZXN0U3BlY2lmaWNPcAogZW5kCiAKIGRlZiBydW5G
VExOb0NKSVRWYWxpZGF0ZSgqb3B0aW9uYWxUZXN0U3BlY2lmaWNPcHRpb25zKQotICAgIHJ1bigi
ZnRsLW5vLWNqaXQtdmFsaWRhdGUtc2FtcGxpbmctcHJvZmlsZXIiLCAiLS12YWxpZGF0ZUdyYXBo
PXRydWUiLCAiLS11c2VTYW1wbGluZ1Byb2ZpbGVyPXRydWUiLCAqKEZUTF9PUFRJT05TICsgTk9f
Q0pJVF9PUFRJT05TICsgb3B0aW9uYWxUZXN0U3BlY2lmaWNPcHRpb25zKSkKKyAgICBydW4oImZ0
bC1uby1jaml0LXZhbGlkYXRlLXNhbXBsaW5nLXByb2ZpbGVyIiwgIi0tdmFsaWRhdGVHcmFwaD10
cnVlIiwgIi0tdXNlU2FtcGxpbmdQcm9maWxlcj10cnVlIiwgIi0tYWlyRm9yY2VJUkNBbGxvY2F0
b3I9dHJ1ZSIsICooRlRMX09QVElPTlMgKyBOT19DSklUX09QVElPTlMgKyBvcHRpb25hbFRlc3RT
cGVjaWZpY09wdGlvbnMpKQogZW5kCiAKIGRlZiBydW5GVExOb0NKSVROb1B1dFN0YWNrVmFsaWRh
dGUoKm9wdGlvbmFsVGVzdFNwZWNpZmljT3B0aW9ucykKLSAgICBydW4oImZ0bC1uby1jaml0LW5v
LXB1dC1zdGFjay12YWxpZGF0ZSIsICItLXZhbGlkYXRlR3JhcGg9dHJ1ZSIsICItLXVzZVB1dFN0
YWNrU2lua2luZz1mYWxzZSIsICooRlRMX09QVElPTlMgKyBOT19DSklUX09QVElPTlMgKyBvcHRp
b25hbFRlc3RTcGVjaWZpY09wdGlvbnMpKQorICAgIHJ1bigiZnRsLW5vLWNqaXQtbm8tcHV0LXN0
YWNrLXZhbGlkYXRlIiwgIi0tdmFsaWRhdGVHcmFwaD10cnVlIiwgIi0tdXNlUHV0U3RhY2tTaW5r
aW5nPWZhbHNlIiwgIi0tYWlyRm9yY2VJUkNBbGxvY2F0b3I9dHJ1ZSIsICooRlRMX09QVElPTlMg
KyBOT19DSklUX09QVElPTlMgKyBvcHRpb25hbFRlc3RTcGVjaWZpY09wdGlvbnMpKQogZW5kCiAK
IGRlZiBydW5GVExOb0NKSVROb0lubGluZVZhbGlkYXRlKCpvcHRpb25hbFRlc3RTcGVjaWZpY09w
dGlvbnMpCi0gICAgcnVuKCJmdGwtbm8tY2ppdC1uby1pbmxpbmUtdmFsaWRhdGUiLCAiLS12YWxp
ZGF0ZUdyYXBoPXRydWUiLCAiLS1tYXhpbXVtSW5saW5pbmdEZXB0aD0xIiwgKihGVExfT1BUSU9O
UyArIE5PX0NKSVRfT1BUSU9OUyArIG9wdGlvbmFsVGVzdFNwZWNpZmljT3B0aW9ucykpCisgICAg
cnVuKCJmdGwtbm8tY2ppdC1uby1pbmxpbmUtdmFsaWRhdGUiLCAiLS12YWxpZGF0ZUdyYXBoPXRy
dWUiLCAiLS1tYXhpbXVtSW5saW5pbmdEZXB0aD0xIiwgIi0tYWlyRm9yY2VCcmlnZ3NBbGxvY2F0
b3I9dHJ1ZSIsICooRlRMX09QVElPTlMgKyBOT19DSklUX09QVElPTlMgKyBvcHRpb25hbFRlc3RT
cGVjaWZpY09wdGlvbnMpKQogZW5kCiAKIGRlZiBydW5GVExOb0NKSVRPU1JWYWxpZGF0aW9uKCpv
cHRpb25hbFRlc3RTcGVjaWZpY09wdGlvbnMpCkBAIC04NzgsMTEgKzg3OCwxMSBAQCBkZWYgcnVu
REZHRWFnZXJOb0NKSVRWYWxpZGF0ZSgqb3B0aW9uYWxUCiBlbmQKIAogZGVmIHJ1bkZUTEVhZ2Vy
KCpvcHRpb25hbFRlc3RTcGVjaWZpY09wdGlvbnMpCi0gICAgcnVuKCJmdGwtZWFnZXIiLCAqKEZU
TF9PUFRJT05TICsgRUFHRVJfT1BUSU9OUyArIENPTExFQ1RfQ09OVElOVU9VU0xZX09QVElPTlMg
KyBvcHRpb25hbFRlc3RTcGVjaWZpY09wdGlvbnMpKQorICAgIHJ1bigiZnRsLWVhZ2VyIiwgIi0t
YWlyRm9yY2VJUkNBbGxvY2F0b3I9dHJ1ZSIsICooRlRMX09QVElPTlMgKyBFQUdFUl9PUFRJT05T
ICsgQ09MTEVDVF9DT05USU5VT1VTTFlfT1BUSU9OUyArIG9wdGlvbmFsVGVzdFNwZWNpZmljT3B0
aW9ucykpCiBlbmQKIAogZGVmIHJ1bkZUTEVhZ2VyTm9DSklUVmFsaWRhdGUoKm9wdGlvbmFsVGVz
dFNwZWNpZmljT3B0aW9ucykKLSAgICBydW4oImZ0bC1lYWdlci1uby1jaml0IiwgIi0tdmFsaWRh
dGVHcmFwaD10cnVlIiwgKihGVExfT1BUSU9OUyArIE5PX0NKSVRfT1BUSU9OUyArIEVBR0VSX09Q
VElPTlMgKyBDT0xMRUNUX0NPTlRJTlVPVVNMWV9PUFRJT05TICsgb3B0aW9uYWxUZXN0U3BlY2lm
aWNPcHRpb25zKSkKKyAgICBydW4oImZ0bC1lYWdlci1uby1jaml0IiwgIi0tdmFsaWRhdGVHcmFw
aD10cnVlIiwgIi0tYWlyRm9yY2VCcmlnZ3NBbGxvY2F0b3I9dHJ1ZSIsICooRlRMX09QVElPTlMg
KyBOT19DSklUX09QVElPTlMgKyBFQUdFUl9PUFRJT05TICsgQ09MTEVDVF9DT05USU5VT1VTTFlf
T1BUSU9OUyArIG9wdGlvbmFsVGVzdFNwZWNpZmljT3B0aW9ucykpCiBlbmQKIAogZGVmIHJ1bkZU
TEVhZ2VyTm9DSklUT1NSVmFsaWRhdGlvbigqb3B0aW9uYWxUZXN0U3BlY2lmaWNPcHRpb25zKQo=
</data>

          </attachment>
      

    </bug>

</bugzilla>