<?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>13430</bug_id>
          
          <creation_ts>2007-04-21 03:17:10 -0700</creation_ts>
          <short_desc>Block and inline continuations are O(n^2)</short_desc>
          <delta_ts>2025-12-25 15:52:16 -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>Layout and Rendering</component>
          <version>523.x (Safari 3)</version>
          <rep_platform>Mac</rep_platform>
          <op_sys>OS X 10.4</op_sys>
          <bug_status>ASSIGNED</bug_status>
          <resolution></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>13351</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Dave Hyatt">hyatt</reporter>
          <assigned_to name="Dave Hyatt">hyatt</assigned_to>
          <cc>ahmad.saleem792</cc>
    
    <cc>bjonesbe</cc>
    
    <cc>commit-queue</cc>
    
    <cc>eoconnor</cc>
    
    <cc>eric</cc>
    
    <cc>esprehn</cc>
    
    <cc>jchaffraix</cc>
    
    <cc>leviw</cc>
    
    <cc>mitz</cc>
    
    <cc>oliver</cc>
    
    <cc>robert</cc>
    
    <cc>simon.fraser</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>13621</commentid>
    <comment_count>0</comment_count>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2007-04-21 03:17:10 -0700</bug_when>
    <thetext>Continuations are too slow, since pathological nesting results in O(n^2) RenderObjects being made (and then our O(n^2) algorithms run on it to create a really horrible performance bottleneck).

They should be phased out in favor of a new approach that uses anonymous inline blocks to enable blocks to live inside inlines.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>13622</commentid>
    <comment_count>1</comment_count>
      <attachid>14120</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2007-04-21 03:19:58 -0700</bug_when>
    <thetext>Created attachment 14120
Work in progress

Here is a first cut that demonstrates the gigantic performance gains.  On the tag nesting PLT, this patch cuts the time from 34 seconds down to 6 seconds.

Open issues abound though:
(1) Margin collapsing has to run on contiguous inline blocks.  This could complicate line layout a fair bit, as it would have to become even more of a hybrid.
(2) Floats need a lot more testing.  There is some concern that certain cases could get slower in DHTML scenarios if floats are present.
(3) Selection is kind of horked.
(4) Many editing tests fail.  Editing&apos;s typical fragility makes it unprepared for the use of inline blocks.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>13618</commentid>
    <comment_count>2</comment_count>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2007-04-21 03:22:54 -0700</bug_when>
    <thetext>Another issue is that the line gets descent in strict mode.  This should be pretty easy to fix though.
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>141703</commentid>
    <comment_count>3</comment_count>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2009-08-19 19:17:37 -0700</bug_when>
    <thetext>Little test to remind myself of some other issues:

&lt;!doctype html&gt;
&lt;div style=&quot;float:left; width:100px;height:100px;background-color:lime&quot;&gt;&lt;/div&gt;
&lt;span style=&quot;border:5px solid red&quot;&gt;Hello
&lt;div style=&quot;border:1px solid black&quot;&gt;world&lt;/div&gt;
wow&lt;/span&gt;

Paint stacking order is wrong.  The inline block has to pretend to be a block as far as stacking order and painting goes.  This means the float background should paint above the black border of the div block that is inside the inline.

Whitespace needs to be consumed at the end of the line preceding the anonymous inline block.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>141704</commentid>
    <comment_count>4</comment_count>
      <attachid>35178</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2009-08-19 19:18:17 -0700</bug_when>
    <thetext>Created attachment 35178
Patch that has been updated to ToT</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>142143</commentid>
    <comment_count>5</comment_count>
      <attachid>38435</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2009-08-22 12:33:26 -0700</bug_when>
    <thetext>Created attachment 38435
This patch fixes a bunch of bugs in margin collapsing and pref width calculations.  

With this patch 001.html in fast/margin-collapsing passes (which is great given how complex the test is).  I&apos;ll be working to ensure that all 65 margin collapsing tests pass when every block is wrapped in a span.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>142150</commentid>
    <comment_count>6</comment_count>
      <attachid>38437</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2009-08-22 14:04:44 -0700</bug_when>
    <thetext>Created attachment 38437
This patch gets the position of self-collapsing blocks correct (up to 15 / 65 tests converted and passing)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>142165</commentid>
    <comment_count>7</comment_count>
      <attachid>38441</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2009-08-22 19:32:47 -0700</bug_when>
    <thetext>Created attachment 38441
001-031.html now pass.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>142170</commentid>
    <comment_count>8</comment_count>
      <attachid>38442</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2009-08-22 21:24:22 -0700</bug_when>
    <thetext>Created attachment 38442
001.html-033.html pass

This patch fixes the paint stacking issue, the trailing whitespace issue, and a number of float issues.  It gets basic float positioning working.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>142177</commentid>
    <comment_count>9</comment_count>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2009-08-22 22:12:09 -0700</bug_when>
    <thetext>More notes:

(1) Have to make determineStartPosition work.  This means rerunning as much of margin collapsing as is needed to get the right state for the next child and to have the right state at the top of the block.

(2) Not necessarily something that has to be fixed for landing, but need to teach line layout how to do multiple start/end positions since missing out on clean lines is lame.  If line 2 changes and line 10000 changes, throwing away all the clean lines in between is dumb.

(3) Have to make sure repainting is pretty smart, although this is also not super critical, since continuations don&apos;t do well when they split.  We should at least make the common case of appending into the same anonymous inline block work correctly.

(4) Selection painting is not good.

(5) Probably huge layout test failures still in other areas. :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>142201</commentid>
    <comment_count>10</comment_count>
      <attachid>38448</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2009-08-23 01:06:39 -0700</bug_when>
    <thetext>Created attachment 38448
Clean up some layout test failures.  No progress on margin-collapsing test suite, but fixed some errors and crashes in other layout tests.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>188721</commentid>
    <comment_count>11</comment_count>
      <attachid>48351</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2010-02-08 12:27:48 -0800</bug_when>
    <thetext>Created attachment 48351
Patch updated to ToT (no logical changes, just keeping it merged)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>188739</commentid>
    <comment_count>12</comment_count>
      <attachid>48356</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2010-02-08 13:03:35 -0800</bug_when>
    <thetext>Created attachment 48356
Fix failing ruby layout tests.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>188914</commentid>
    <comment_count>13</comment_count>
      <attachid>48394</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2010-02-08 23:48:29 -0800</bug_when>
    <thetext>Created attachment 48394
Fix outside list markers.  Fix repainting bugs with relpositioned inlines.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>189091</commentid>
    <comment_count>14</comment_count>
      <attachid>48431</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2010-02-09 11:40:50 -0800</bug_when>
    <thetext>Created attachment 48431
This patch fixes selection painting.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>189095</commentid>
    <comment_count>15</comment_count>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2010-02-09 11:45:32 -0800</bug_when>
    <thetext>Current issues:

(1) Have to make determineStartPosition work.  This means rerunning as much of
margin collapsing as is needed to get the right state for the next child and to
have the right state at the top of the block.

(2) Not necessarily something that has to be fixed for landing, but need to
teach line layout how to do multiple start/end positions since missing out on
clean lines is lame.  If line 2 changes and line 10000 changes, throwing away
all the clean lines in between is dumb.

(3) Have to make sure repainting is pretty smart, although this is also not
super critical, since continuations don&apos;t do well when they split.  We should
at least make the common case of appending into the same anonymous inline block
work correctly.

(4) Hit testing doesn&apos;t work yet in the margins of anonymous inline blocks.  Need to special case this in the line hit testing code.

(5) Floats will need lots of testing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>189168</commentid>
    <comment_count>16</comment_count>
      <attachid>48449</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2010-02-09 15:44:12 -0800</bug_when>
    <thetext>Created attachment 48449
Fixes to hit testing and selection painting.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>189447</commentid>
    <comment_count>17</comment_count>
      <attachid>48514</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2010-02-10 13:10:34 -0800</bug_when>
    <thetext>Created attachment 48514
Patch that makes blocks work inside inlines with layers

And now for something totally awesome:

&lt;span style=&quot;position:relative;left:100px; opacity:0.7&quot;&gt;&lt;i&gt;Hello &lt;div style=&quot;border:5px solid blue&quot;&gt;world&lt;/div&gt; goodbye&lt;/span&gt;

This patch makes the above finally work in WebKit for the first time.  Blocks will now work when nested inside enclosing inlines with layers.

Even better, the inlines that enclose an anonymous inline block are only created if they have a layer or an outline.  Otherwise they don&apos;t get made.  This optimization will be applicable even to the normal line box tree eventually (e.g., don&apos;t make line boxes that don&apos;t paint anything or provide any useful info).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>189466</commentid>
    <comment_count>18</comment_count>
      <attachid>48515</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2010-02-10 14:33:56 -0800</bug_when>
    <thetext>Created attachment 48515
Make hit testing work inside layers.  Refine painting and hit testing to fix some glitches.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>189503</commentid>
    <comment_count>19</comment_count>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2010-02-10 15:33:31 -0800</bug_when>
    <thetext>Current notes:

(1) Have to make determineStartPosition work.  This means rerunning as much of
margin collapsing as is needed to get the right state for the next child and to
have the right state at the top of the block.

(2) Not necessarily something that has to be fixed for landing, but need to
teach line layout how to do multiple start/end positions since missing out on
clean lines is lame.  If line 2 changes and line 10000 changes, throwing away
all the clean lines in between is dumb.

(3) Have to make sure repainting is pretty smart, although this is also not
super critical, since continuations don&apos;t do well when they split.  We should
at least make the common case of appending into the same anonymous inline block
work correctly.

(4) Outline painting is messed up in the non-auto case.

(5) Empty inlines with borders/padding are no longer showing up.  Maybe they are being subsumed by the anonymous inline block line?

(6) Because of the culling of line boxes (in order to avoid O(n^2) behavior), methods on RenderInline like absoluteRects and linesBoundingBox don&apos;t know about the inline block lines.  Options are to disable the culling or to taint the RenderInline so that it has to grovel into descendants looking for the anonymous inline blocks.

(7) When line boxes don&apos;t get culled, they still need to have the dimensions of the anonymous inline block.  However right now because of height() on InlineFlowBox just returning the font&apos;s height, it isn&apos;t possible to customize the height of these boxes.  I will probably need to make a special subclass of InlineFlowBox with a height member to deal with this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>189781</commentid>
    <comment_count>20</comment_count>
      <attachid>48589</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2010-02-11 13:22:22 -0800</bug_when>
    <thetext>Created attachment 48589
Smaller patch now that I landed the InlineIterator/BidiRun breakout.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>189837</commentid>
    <comment_count>21</comment_count>
      <attachid>48597</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2010-02-11 17:00:05 -0800</bug_when>
    <thetext>Created attachment 48597
Fix the line box culling issue and the box height issue.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>190075</commentid>
    <comment_count>22</comment_count>
      <attachid>48648</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2010-02-12 09:08:37 -0800</bug_when>
    <thetext>Created attachment 48648
Sync to ToT</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>190513</commentid>
    <comment_count>23</comment_count>
      <attachid>48766</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2010-02-15 11:57:16 -0800</bug_when>
    <thetext>Created attachment 48766
Fix the determineStartPosition problem

This patch fixes the determineStartPosition issue and makes sure margin collapsing re-runs like it&apos;s supposed to.

The performance issues continue to be pretty complex though.

(1) If only an anonymous inline block is dirty, you end up repainting the whole block plus everything that follows it.

(2) If only an anonymous inline block is dirty, you end up extracting all the lines that follow and then re-attaching them.   This makes layout way more expensive if say images are loading in earlier blocks.

The &quot;cars&quot; pages on the nesting PLT is way way slower, mainly because 50% of the time is spent in attach/extractLine.   So this means determineStartPosition/EndPosition are working, but the problem is content is coming in to early anonymous blocks, causing the extraction/attachment to run over and over on all the later lines for each layout operation.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>396202</commentid>
    <comment_count>24</comment_count>
    <who name="Oliver Hunt">oliver</who>
    <bug_when>2011-05-01 19:52:04 -0700</bug_when>
    <thetext>Did this ever get landed?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>545231</commentid>
    <comment_count>25</comment_count>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2012-01-30 11:23:33 -0800</bug_when>
    <thetext>Nope.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>623371</commentid>
    <comment_count>26</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2012-05-14 15:02:34 -0700</bug_when>
    <thetext>I&apos;m interested in this.  I&apos;ll see if I can take a whack at it next month.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>661768</commentid>
    <comment_count>27</comment_count>
    <who name="Elliott Sprehn">esprehn</who>
    <bug_when>2012-07-02 15:36:21 -0700</bug_when>
    <thetext>(In reply to comment #17)
&gt; Created an attachment (id=48514) [details]
&gt; Patch that makes blocks work inside inlines with layers
&gt; 
&gt; And now for something totally awesome:
&gt; 
&gt; &lt;span style=&quot;position:relative;left:100px; opacity:0.7&quot;&gt;&lt;i&gt;Hello &lt;div style=&quot;border:5px solid blue&quot;&gt;world&lt;/div&gt; goodbye&lt;/span&gt;
&gt; 
&gt; This patch makes the above finally work in WebKit for the first time.  Blocks will now work when nested inside enclosing inlines with layers.
&gt; 
&gt; Even better, the inlines that enclose an anonymous inline block are only created if they have a layer or an outline.  Otherwise they don&apos;t get made.  This optimization will be applicable even to the normal line box tree eventually (e.g., don&apos;t make line boxes that don&apos;t paint anything or provide any useful info).

This test renders identically in Firefox and Webkit now, did a fix get landed separately? Are they both wrong?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1000015</commentid>
    <comment_count>28</comment_count>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2014-04-11 13:44:16 -0700</bug_when>
    <thetext>(In reply to comment #27)
&gt; (In reply to comment #17)
&gt; &gt; Created an attachment (id=48514) [details] [details]
&gt; &gt; Patch that makes blocks work inside inlines with layers
&gt; &gt; 
&gt; &gt; And now for something totally awesome:
&gt; &gt; 
&gt; &gt; &lt;span style=&quot;position:relative;left:100px; opacity:0.7&quot;&gt;&lt;i&gt;Hello &lt;div style=&quot;border:5px solid blue&quot;&gt;world&lt;/div&gt; goodbye&lt;/span&gt;
&gt; &gt; 
&gt; &gt; This patch makes the above finally work in WebKit for the first time.  Blocks will now work when nested inside enclosing inlines with layers.
&gt; &gt; 
&gt; &gt; Even better, the inlines that enclose an anonymous inline block are only created if they have a layer or an outline.  Otherwise they don&apos;t get made.  This optimization will be applicable even to the normal line box tree eventually (e.g., don&apos;t make line boxes that don&apos;t paint anything or provide any useful info).
&gt; 
&gt; This test renders identically in Firefox and Webkit now, did a fix get landed separately? Are they both wrong?

There&apos;s a hack that made the positioning part work for continuations, so this is less about correctness now and more about better performance and code simplicity.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1076488</commentid>
    <comment_count>29</comment_count>
      <attachid>248464</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2015-03-11 16:43:36 -0700</bug_when>
    <thetext>Created attachment 248464
Starting to update this to ToT

Just recording this work so I don&apos;t lose it. Doesn&apos;t compile.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1076681</commentid>
    <comment_count>30</comment_count>
      <attachid>248528</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2015-03-12 11:32:03 -0700</bug_when>
    <thetext>Created attachment 248528
More work to bring patch to ToT (about 75% merged)

Does not compile.

One big new issue that will have to be dealt with is pagination. We&apos;re going to have to make sure that the anonymous inline-block line is not treated as unsplittable, and that pagination really will drill down into it and never move the line.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1076684</commentid>
    <comment_count>31</comment_count>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2015-03-12 11:41:54 -0700</bug_when>
    <thetext>Recording thoughts:

We should add a special mode to line layout that can lay out anonymous inline blocks and not make them contribute to the repaint rect or to line dirtying. 

What we&apos;d like to do is, as long as we hit anonymous inline blocks first when looking for dirty lines, try to lay it out and see if it moves.

If the anonymous inline block does not move or change size and does not have any overhanging floats, then we simply undirty the line and keep going.

If the anonymous inline block does move or change size but does not have overhanging floats, then we can move the lines that follow without extraction.

Another big thing to think about is pagination. Pagination came online after the 2010 patch. We have to make sure to drill into anonymous inline blocks and paginate them, and our line is irrelevant for pagination and should just be allowed to sit where it wants.

Pagination struts may need to be handled for contiguous inline blocks.

The dirty line optimizations mentioned above may need to turn off when pagination is involved.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1076686</commentid>
    <comment_count>32</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-03-12 11:51:11 -0700</bug_when>
    <thetext>Attachment 248528 did not pass style-queue:


ERROR: Source/WebCore/rendering/InlineFlowBox.cpp:1136:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
ERROR: Source/WebCore/accessibility/AccessibilityRenderObject.cpp:339:  This { should be at the end of the previous line  [whitespace/braces] [4]
ERROR: Source/WebCore/rendering/InlineElementBox.cpp:70:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
ERROR: Source/WebCore/rendering/InlineElementBox.cpp:76:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
ERROR: Source/WebCore/rendering/InlineElementBox.cpp:121:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
ERROR: Source/WebCore/rendering/RenderInline.h:171:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
ERROR: Source/WebCore/rendering/RenderBlock.cpp:2654:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
ERROR: Source/WebCore/rendering/RenderBlock.cpp:3190:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
ERROR: Source/WebCore/rendering/RenderBlock.cpp:3428:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
ERROR: Source/WebCore/rendering/InlineBox.h:38:  This { should be at the end of the previous line  [whitespace/braces] [4]
ERROR: Source/WebCore/rendering/InlineBox.h:40:  Missing spaces around :  [whitespace/init] [4]
ERROR: Source/WebCore/rendering/InlineBox.h:40:  Wrong number of spaces before statement. (expected: 8)  [whitespace/indent] [4]
ERROR: Source/WebCore/rendering/InlineBox.h:42:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
ERROR: Source/WebCore/rendering/InlineBox.h:47:  This { should be at the end of the previous line  [whitespace/braces] [4]
ERROR: Source/WebCore/rendering/InlineBox.h:49:  Missing spaces around :  [whitespace/init] [4]
ERROR: Source/WebCore/rendering/InlineBox.h:49:  Wrong number of spaces before statement. (expected: 8)  [whitespace/indent] [4]
ERROR: Source/WebCore/rendering/InlineBox.h:54:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
ERROR: Source/WebCore/rendering/RenderBlockLineLayout.cpp:1023:  Should have only a single space after a punctuation in a comment.  [whitespace/comments] [5]
ERROR: Source/WebCore/rendering/RenderBlockLineLayout.cpp:1078:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
ERROR: Source/WebCore/rendering/RenderBlockLineLayout.cpp:1566:  Should have only a single space after a punctuation in a comment.  [whitespace/comments] [5]
ERROR: Source/WebCore/rendering/RenderBlockLineLayout.cpp:1575:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
ERROR: Source/WebCore/rendering/RenderBlockLineLayout.cpp:2080:  Should have only a single space after a punctuation in a comment.  [whitespace/comments] [5]
ERROR: Source/WebCore/rendering/RenderBlockLineLayout.cpp:2095:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
ERROR: Source/WebCore/rendering/RenderBlockLineLayout.cpp:2099:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
ERROR: Source/WebCore/rendering/RenderBlockLineLayout.cpp:2103:  More than one command on the same line in for  [whitespace/parens] [4]
ERROR: Source/WebCore/rendering/RenderBlockLineLayout.cpp:2104:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
ERROR: Source/WebCore/rendering/RenderBlockLineLayout.cpp:2107:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
ERROR: Source/WebCore/rendering/RenderBlockLineLayout.cpp:2112:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
ERROR: Source/WebCore/rendering/InlineBox.cpp:29:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/WebCore/rendering/RenderBlockFlow.cpp:2747:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
ERROR: Source/WebCore/rendering/RenderBlockFlow.cpp:3103:  Boolean expressions that span multiple lines should have their operators on the left side of the line instead of the right side.  [whitespace/operators] [4]
ERROR: Source/WebCore/rendering/RenderBlockFlow.cpp:3103:  Multi line control clauses should use braces.  [whitespace/braces] [4]
ERROR: Source/WebCore/rendering/RenderBlockFlow.cpp:3372:  Boolean expressions that span multiple lines should have their operators on the left side of the line instead of the right side.  [whitespace/operators] [4]
ERROR: Source/WebCore/rendering/RenderBlockFlow.cpp:3372:  Multi line control clauses should use braces.  [whitespace/braces] [4]
ERROR: Source/WebCore/rendering/RenderBlockFlow.cpp:3377:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
ERROR: Source/WebCore/rendering/InlineFlowBox.h:357:  This { should be at the end of the previous line  [whitespace/braces] [4]
ERROR: Source/WebCore/rendering/InlineFlowBox.h:360:  Wrong number of spaces before statement. (expected: 8)  [whitespace/indent] [4]
ERROR: Source/WebCore/rendering/RenderBlock.h:474:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
ERROR: Source/WebCore/rendering/RootInlineBox.h:240:  This { should be at the end of the previous line  [whitespace/braces] [4]
ERROR: Source/WebCore/rendering/RootInlineBox.h:243:  Wrong number of spaces before statement. (expected: 8)  [whitespace/indent] [4]
ERROR: Source/WebCore/rendering/RootInlineBox.h:244:  Wrong number of spaces before statement. (expected: 8)  [whitespace/indent] [4]
ERROR: Source/WebCore/rendering/RootInlineBox.h:257:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Total errors found: 42 in 29 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>1081235</commentid>
    <comment_count>33</comment_count>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2015-03-30 11:04:12 -0700</bug_when>
    <thetext>https://bugs.webkit.org/show_bug.cgi?id=143145 merged in concept of isAnonymousInlineBlock and the addChild code for RenderInline.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1081686</commentid>
    <comment_count>34</comment_count>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2015-03-31 10:44:42 -0700</bug_when>
    <thetext>https://bugs.webkit.org/show_bug.cgi?id=143238 merged the preferred width calculation and the concept of a bit on RootInlineBoxes to know about anonymous inline blocks. Line construction was fixed up to set the bit and avoid intermediate boxes. Line layout was patched to make sure breaks occurred before and after the anonymous inline-block.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1081727</commentid>
    <comment_count>35</comment_count>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2015-03-31 12:15:49 -0700</bug_when>
    <thetext>https://bugs.webkit.org/show_bug.cgi?id=143271 got the width of the inline-block correct.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1082055</commentid>
    <comment_count>36</comment_count>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2015-04-01 11:12:41 -0700</bug_when>
    <thetext>https://bugs.webkit.org/show_bug.cgi?id=143307 has merged in the behavior of floats intruding into the inline-block, as well as making sure lines have the correct height excluding margins.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1082288</commentid>
    <comment_count>37</comment_count>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2015-04-02 11:36:49 -0700</bug_when>
    <thetext>https://bugs.webkit.org/show_bug.cgi?id=143320 merged in the code to get painting and hit testing stacking correct. Note that there is some subtle stuff with collapsed margins in RenderLineBoxList that has not yet been merged. That will come once I merge margin collapsing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1125044</commentid>
    <comment_count>38</comment_count>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2015-09-10 15:17:01 -0700</bug_when>
    <thetext>https://bugs.webkit.org/show_bug.cgi?id=149042 added the tweak to isSelfCollapsingBlock(), and line boxes now have an anonymousInlineBlock() accessor.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1126076</commentid>
    <comment_count>39</comment_count>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2015-09-15 11:39:32 -0700</bug_when>
    <thetext>https://bugs.webkit.org/show_bug.cgi?id=149132 landed margin collapsing and the first handful of margin collapsing tests. Still didn&apos;t merge the subtle code from RenderLineBoxList.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1126745</commentid>
    <comment_count>40</comment_count>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2015-09-17 11:00:22 -0700</bug_when>
    <thetext>So one new problem is the handling of empty inlines with border and padding. The current continuation code handles this pretty naturally because you have two RenderInlines (one before and one after the split).

The new code can handle the inline before the split, but there is no second inline after the split, so getting a line box built there is problematic.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2168209</commentid>
    <comment_count>41</comment_count>
    <who name="Ahmad Saleem">ahmad.saleem792</who>
    <bug_when>2025-12-25 15:52:16 -0800</bug_when>
    <thetext>@Alan &amp; @Antti - is it applicable anymore?</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>14120</attachid>
            <date>2007-04-21 03:19:58 -0700</date>
            <delta_ts>2009-08-19 19:18:17 -0700</delta_ts>
            <desc>Work in progress</desc>
            <filename>patch.txt</filename>
            <type>text/plain</type>
            <size>45823</size>
            <attacher name="Dave Hyatt">hyatt</attacher>
            
              <data encoding="base64">SW5kZXg6IGJyaWRnZS9tYWMvV2ViQ29yZUFYT2JqZWN0Lm1tCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGJyaWRn
ZS9tYWMvV2ViQ29yZUFYT2JqZWN0Lm1tCShyZXZpc2lvbiAyMDk4NSkKKysrIGJyaWRnZS9tYWMv
V2ViQ29yZUFYT2JqZWN0Lm1tCSh3b3JraW5nIGNvcHkpCkBAIC0xMjksMTQgKzEyOSwxMSBAQCB1
c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwogICAgIGlmIChtX2FyZWFFbGVtZW50KQogICAgICAg
ICByZXR1cm4gbV9hcmVhRWxlbWVudDsKIAotICAgIC8vIHNlYXJjaCB1cCB0aGUgcmVuZGVyIHRy
ZWUgZm9yIGEgUmVuZGVyT2JqZWN0IHdpdGggYSBET00gbm9kZS4gIERlZmVyIHRvIGFuIGVhcmxp
ZXIgY29udGludWF0aW9uLCB0aG91Z2guCisgICAgLy8gc2VhcmNoIHVwIHRoZSByZW5kZXIgdHJl
ZSBmb3IgYSBSZW5kZXJPYmplY3Qgd2l0aCBhIERPTSBub2RlLgogICAgIFJlbmRlck9iamVjdCog
Y3VyclJlbmRlcmVyOwotICAgIGZvciAoY3VyclJlbmRlcmVyID0gbV9yZW5kZXJlcjsgY3VyclJl
bmRlcmVyICYmICFjdXJyUmVuZGVyZXItPmVsZW1lbnQoKTsgY3VyclJlbmRlcmVyID0gY3VyclJl
bmRlcmVyLT5wYXJlbnQoKSkgewotICAgICAgICBpZiAoY3VyclJlbmRlcmVyLT5jb250aW51YXRp
b24oKSkKLSAgICAgICAgICAgIHJldHVybiBbY3VyclJlbmRlcmVyLT5kb2N1bWVudCgpLT5heE9i
amVjdENhY2hlKCktPmdldChjdXJyUmVuZGVyZXItPmNvbnRpbnVhdGlvbigpKSBhbmNob3JFbGVt
ZW50XTsKLSAgICB9Ci0gICAgCi0gICAgLy8gYmFpbCBvZiBub25lIGZvdW5kCisgICAgZm9yIChj
dXJyUmVuZGVyZXIgPSBtX3JlbmRlcmVyOyBjdXJyUmVuZGVyZXIgJiYgIWN1cnJSZW5kZXJlci0+
ZWxlbWVudCgpOyBjdXJyUmVuZGVyZXIgPSBjdXJyUmVuZGVyZXItPnBhcmVudCgpKTsKKworICAg
IC8vIGJhaWwgaWYgbm9uZSBmb3VuZAogICAgIGlmICghY3VyclJlbmRlcmVyKQogICAgICAgICBy
ZXR1cm4gMDsKICAgICAKQEAgLTE1OCw3ICsxNTUsNiBAQCB1c2luZyBuYW1lc3BhY2UgSFRNTE5h
bWVzOwogCiAtKEVsZW1lbnQqKW1vdXNlQnV0dG9uTGlzdGVuZXIKIHsKLSAgICAvLyBGSVhNRTog
RG8gdGhlIGNvbnRpbnVhdGlvbiBzZWFyY2ggbGlrZSBhbmNob3JFbGVtZW50IGRvZXMKICAgICBm
b3IgKEV2ZW50VGFyZ2V0Tm9kZSogZWx0ID0gc3RhdGljX2Nhc3Q8RXZlbnRUYXJnZXROb2RlKj4o
bV9yZW5kZXJlci0+ZWxlbWVudCgpKTsgZWx0OyBlbHQgPSBzdGF0aWNfY2FzdDxFdmVudFRhcmdl
dE5vZGUqPihlbHQtPnBhcmVudE5vZGUoKSkpIHsKICAgICAgICAgaWYgKGVsdC0+Z2V0SFRNTEV2
ZW50TGlzdGVuZXIoY2xpY2tFdmVudCkgfHwgZWx0LT5nZXRIVE1MRXZlbnRMaXN0ZW5lcihtb3Vz
ZWRvd25FdmVudCkgfHwgZWx0LT5nZXRIVE1MRXZlbnRMaXN0ZW5lcihtb3VzZXVwRXZlbnQpKQog
ICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEVsZW1lbnQqPihlbHQpOwpAQCAtNzAxLDgg
KzY5Nyw2IEBAIHN0YXRpYyBJbnRSZWN0IGJvdW5kaW5nQm94UmVjdChSZW5kZXJPYmoKIHsKICAg
ICBJbnRSZWN0IHJlY3Q7CiAgICAgaWYgKG9iaikgewotICAgICAgICBpZiAob2JqLT5pc0lubGlu
ZUNvbnRpbnVhdGlvbigpKQotICAgICAgICAgICAgb2JqID0gb2JqLT5lbGVtZW50KCktPnJlbmRl
cmVyKCk7CiAgICAgICAgIFZlY3RvcjxJbnRSZWN0PiByZWN0czsKICAgICAgICAgaW50IHgsIHk7
CiAgICAgICAgIG9iai0+YWJzb2x1dGVQb3NpdGlvbih4LCB5KTsKSW5kZXg6IGVkaXRpbmcvdmlz
aWJsZV91bml0cy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gZWRpdGluZy92aXNpYmxlX3VuaXRzLmNwcAko
cmV2aXNpb24gMjA5ODUpCisrKyBlZGl0aW5nL3Zpc2libGVfdW5pdHMuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC00OTAsNyArNDkwLDcgQEAgVmlzaWJsZVBvc2l0aW9uIG5leHRMaW5lUG9zaXRpb24o
Y29uc3QgVgogICAgICAgICAgICAgY29udGFpbmluZ0Jsb2NrLT5sYXllcigpLT5zdWJ0cmFjdFNj
cm9sbE9mZnNldChhYnN4LCBhYnN5KTsKICAgICAgICAgUmVuZGVyT2JqZWN0ICpyZW5kZXJlciA9
IHJvb3QtPmNsb3Nlc3RMZWFmQ2hpbGRGb3JYUG9zKHggLSBhYnN4KS0+b2JqZWN0KCk7CiAgICAg
ICAgIE5vZGUqIG5vZGUgPSByZW5kZXJlci0+ZWxlbWVudCgpOwotICAgICAgICBpZiAoZWRpdGlu
Z0lnbm9yZXNDb250ZW50KG5vZGUpKQorICAgICAgICBpZiAobm9kZSAmJiBlZGl0aW5nSWdub3Jl
c0NvbnRlbnQobm9kZSkpCiAgICAgICAgICAgICByZXR1cm4gUG9zaXRpb24obm9kZS0+cGFyZW50
KCksIG5vZGUtPm5vZGVJbmRleCgpKTsKICAgICAgICAgcmV0dXJuIHJlbmRlcmVyLT5wb3NpdGlv
bkZvckNvb3JkaW5hdGVzKHggLSBhYnN4LCByb290LT50b3BPdmVyZmxvdygpKTsKICAgICB9ICAg
IApJbmRleDogaHRtbC9IVE1MQW5jaG9yRWxlbWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gaHRtbC9I
VE1MQW5jaG9yRWxlbWVudC5jcHAJKHJldmlzaW9uIDIwOTg1KQorKysgaHRtbC9IVE1MQW5jaG9y
RWxlbWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTg2LDExICs4NiwxMCBAQCBib29sIEhUTUxB
bmNob3JFbGVtZW50Ojppc0ZvY3VzYWJsZSgpIGNvCiAgICAgICAgIHJldHVybiBmYWxzZTsKIAog
ICAgIC8vIEJlZm9yZSBjYWxsaW5nIGFic29sdXRlUmVjdHMsIGNoZWNrIGZvciB0aGUgY29tbW9u
IGNhc2Ugd2hlcmUgdGhlIHJlbmRlcmVyCi0gICAgLy8gb3Igb25lIG9mIHRoZSBjb250aW51YXRp
b25zIGlzIG5vbi1lbXB0eSwgc2luY2UgdGhpcyBpcyBhIGZhc3RlciBjaGVjayBhbmQKLSAgICAv
LyBhbG1vc3QgYWx3YXlzIHJldHVybnMgdHJ1ZS4KLSAgICBmb3IgKFJlbmRlck9iamVjdCogciA9
IHJlbmRlcmVyKCk7IHI7IHIgPSByLT5jb250aW51YXRpb24oKSkKLSAgICAgICAgaWYgKHItPndp
ZHRoKCkgPiAwICYmIHItPmhlaWdodCgpID4gMCkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwor
ICAgIC8vIGlzIG5vbi1lbXB0eSwgc2luY2UgdGhpcyBpcyBhIGZhc3RlciBjaGVjayBhbmQgYWxt
b3N0IGFsd2F5cyByZXR1cm5zIHRydWUuCisgICAgUmVuZGVyT2JqZWN0KiByID0gcmVuZGVyZXIo
KTsKKyAgICBpZiAoci0+d2lkdGgoKSA+IDAgJiYgci0+aGVpZ2h0KCkgPiAwKQorICAgICAgICBy
ZXR1cm4gdHJ1ZTsKIAogICAgIFZlY3RvcjxJbnRSZWN0PiByZWN0czsKICAgICBpbnQgeCwgeTsK
SW5kZXg6IHJlbmRlcmluZy9JbmxpbmVGbG93Qm94LmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSByZW5kZXJp
bmcvSW5saW5lRmxvd0JveC5jcHAJKHJldmlzaW9uIDIwOTg1KQorKysgcmVuZGVyaW5nL0lubGlu
ZUZsb3dCb3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMjEsMTEgKzIyMSwxMSBAQCB2b2lkIElu
bGluZUZsb3dCb3g6OmRldGVybWluZVNwYWNpbmdGb3JGCiAgICAgICAgIGlmICghZmxvdy0+bGFz
dExpbmVCb3goKS0+aXNDb25zdHJ1Y3RlZCgpKSB7CiAgICAgICAgICAgICBpZiAobHRyKSB7CiAg
ICAgICAgICAgICAgICAgaWYgKCFuZXh0TGluZUJveCgpICYmCi0gICAgICAgICAgICAgICAgICAg
ICgobGFzdExpbmUgJiYgIW9iamVjdCgpLT5jb250aW51YXRpb24oKSkgfHwgbmV4dE9uTGluZUV4
aXN0cygpIHx8IG9uRW5kQ2hhaW4oZW5kT2JqZWN0KSkpCisgICAgICAgICAgICAgICAgICAgIChs
YXN0TGluZSB8fCBuZXh0T25MaW5lRXhpc3RzKCkgfHwgb25FbmRDaGFpbihlbmRPYmplY3QpKSkK
ICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZVJpZ2h0RWRnZSA9IHRydWU7CiAgICAgICAgICAg
ICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmICgoIXByZXZMaW5lQm94KCkgfHwgcHJldkxp
bmVCb3goKS0+aXNDb25zdHJ1Y3RlZCgpKSAmJgotICAgICAgICAgICAgICAgICAgICAoKGxhc3RM
aW5lICYmICFvYmplY3QoKS0+Y29udGludWF0aW9uKCkpIHx8IHByZXZPbkxpbmVFeGlzdHMoKSB8
fCBvbkVuZENoYWluKGVuZE9iamVjdCkpKQorICAgICAgICAgICAgICAgICAgICAobGFzdExpbmUg
fHwgcHJldk9uTGluZUV4aXN0cygpIHx8IG9uRW5kQ2hhaW4oZW5kT2JqZWN0KSkpCiAgICAgICAg
ICAgICAgICAgICAgIGluY2x1ZGVMZWZ0RWRnZSA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAg
ICAgIH0KQEAgLTU1OCw4ICs1NTgsNyBAQCB2b2lkIElubGluZUZsb3dCb3g6OnBhaW50KFJlbmRl
ck9iamVjdDo6CiAgICAgICAgIGlmIChwYWludEluZm8ucGhhc2UgPT0gUGFpbnRQaGFzZU91dGxp
bmUgfHwgcGFpbnRJbmZvLnBoYXNlID09IFBhaW50UGhhc2VTZWxmT3V0bGluZSkgewogICAgICAg
ICAgICAgLy8gQWRkIG91cnNlbHZlcyB0byB0aGUgcGFpbnQgaW5mbyBzdHJ1Y3QncyBsaXN0IG9m
IGlubGluZXMgdGhhdCBuZWVkIHRvIHBhaW50IHRoZWlyCiAgICAgICAgICAgICAvLyBvdXRsaW5l
cy4KLSAgICAgICAgICAgIGlmIChvYmplY3QoKS0+c3R5bGUoKS0+dmlzaWJpbGl0eSgpID09IFZJ
U0lCTEUgJiYgb2JqZWN0KCktPmhhc091dGxpbmUoKSAmJgotICAgICAgICAgICAgICAgICAgICAh
b2JqZWN0KCktPmlzSW5saW5lQ29udGludWF0aW9uKCkgJiYgIWlzUm9vdElubGluZUJveCgpKQor
ICAgICAgICAgICAgaWYgKG9iamVjdCgpLT5zdHlsZSgpLT52aXNpYmlsaXR5KCkgPT0gVklTSUJM
RSAmJiBvYmplY3QoKS0+aGFzT3V0bGluZSgpICYmICFpc1Jvb3RJbmxpbmVCb3goKSkKICAgICAg
ICAgICAgICAgICBwYWludEluZm8ub3V0bGluZU9iamVjdHMtPmFkZChmbG93T2JqZWN0KCkpOwog
ICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gMS4gUGFpbnQgb3VyIGJhY2tncm91bmQs
IGJvcmRlciBhbmQgYm94LXNoYWRvdy4KSW5kZXg6IHJlbmRlcmluZy9SZW5kZXJCbG9jay5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gcmVuZGVyaW5nL1JlbmRlckJsb2NrLmNwcAkocmV2aXNpb24gMjA5ODUp
CisrKyByZW5kZXJpbmcvUmVuZGVyQmxvY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMzAsMTkg
KzEzMCwxNSBAQCB2b2lkIFJlbmRlckJsb2NrOjpzZXRTdHlsZShSZW5kZXJTdHlsZSogCiAKICAg
ICBSZW5kZXJGbG93OjpzZXRTdHlsZShfc3R5bGUpOwogCi0gICAgLy8gIyMjIHdlIGNvdWxkIHNh
dmUgdGhpcyBjYWxsIHdoZW4gdGhlIGNoYW5nZSBvbmx5IGFmZmVjdGVkCi0gICAgLy8gbm9uIGlu
aGVyaXRlZCBwcm9wZXJ0aWVzCi0gICAgUmVuZGVyT2JqZWN0ICpjaGlsZCA9IGZpcnN0Q2hpbGQo
KTsKLSAgICB3aGlsZSAoY2hpbGQgIT0gMCkKLSAgICB7ICAgCi0gICAgICAgIGlmIChjaGlsZC0+
aXNBbm9ueW1vdXNCbG9jaygpKQotICAgICAgICB7CisgICAgLy8gRklYTUU6IFdlIGNvdWxkIGF2
b2lkIHRoaXMgY2FsbCBpZiB0aGUgc3R5bGUgY2hhbmdlIG9ubHkgYWZmZWN0ZWQKKyAgICAvLyBu
b24taW5oZXJpdGVkIHByb3BlcnRpZXMKKyAgICBmb3IgKFJlbmRlck9iamVjdCogY2hpbGQgPSBm
aXJzdENoaWxkKCk7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygpKSB7CisgICAg
ICAgIGlmIChjaGlsZC0+aXNBbm9ueW1vdXNCbG9jaygpKSB7CiAgICAgICAgICAgICBSZW5kZXJT
dHlsZSogbmV3U3R5bGUgPSBuZXcgKHJlbmRlckFyZW5hKCkpIFJlbmRlclN0eWxlKCk7CiAgICAg
ICAgICAgICBuZXdTdHlsZS0+aW5oZXJpdEZyb20oc3R5bGUoKSk7CiAgICAgICAgICAgICBuZXdT
dHlsZS0+c2V0RGlzcGxheShCTE9DSyk7CiAgICAgICAgICAgICBjaGlsZC0+c2V0U3R5bGUobmV3
U3R5bGUpOwogICAgICAgICB9Ci0gICAgICAgIGNoaWxkID0gY2hpbGQtPm5leHRTaWJsaW5nKCk7
CiAgICAgfQogCiAgICAgbV9saW5lSGVpZ2h0ID0gLTE7CkBAIC0zNDQsNyArMzQwLDYgQEAgdm9p
ZCBSZW5kZXJCbG9jazo6cmVtb3ZlQ2hpbGQoUmVuZGVyT2JqZQogICAgIFJlbmRlck9iamVjdCog
cHJldiA9IG9sZENoaWxkLT5wcmV2aW91c1NpYmxpbmcoKTsKICAgICBSZW5kZXJPYmplY3QqIG5l
eHQgPSBvbGRDaGlsZC0+bmV4dFNpYmxpbmcoKTsKICAgICBib29sIGNhbkRlbGV0ZUFub255bW91
c0Jsb2NrcyA9ICFkb2N1bWVudEJlaW5nRGVzdHJveWVkKCkgJiYgIWlzSW5saW5lKCkgJiYgIW9s
ZENoaWxkLT5pc0lubGluZSgpICYmIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIW9sZENoaWxkLT5jb250aW51YXRpb24oKSAmJiAKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICghcHJldiB8fCAocHJldi0+aXNBbm9ueW1vdXNCbG9jaygpICYmIHByZXYt
PmNoaWxkcmVuSW5saW5lKCkpKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgKCFuZXh0IHx8IChuZXh0LT5pc0Fub255bW91c0Jsb2NrKCkgJiYgbmV4dC0+Y2hpbGRyZW5J
bmxpbmUoKSkpOwogICAgIGlmIChjYW5EZWxldGVBbm9ueW1vdXNCbG9ja3MgJiYgcHJldiAmJiBu
ZXh0KSB7CkBAIC01NjMsNyArNTU4LDcgQEAgdm9pZCBSZW5kZXJCbG9jazo6bGF5b3V0QmxvY2so
Ym9vbCByZWxheQogCiAgICAgLy8gRXhwYW5kIG91ciBpbnRyaW5zaWMgaGVpZ2h0IHRvIGVuY29t
cGFzcyBmbG9hdHMuCiAgICAgaW50IHRvQWRkID0gYm9yZGVyQm90dG9tKCkgKyBwYWRkaW5nQm90
dG9tKCkgKyBob3Jpem9udGFsU2Nyb2xsYmFySGVpZ2h0KCk7Ci0gICAgaWYgKGZsb2F0Qm90dG9t
KCkgPiAobV9oZWlnaHQgLSB0b0FkZCkgJiYgKGlzSW5saW5lQmxvY2tPcklubGluZVRhYmxlKCkg
fHwgaXNGbG9hdGluZ09yUG9zaXRpb25lZCgpIHx8IGhhc092ZXJmbG93Q2xpcCgpIHx8CisgICAg
aWYgKGZsb2F0Qm90dG9tKCkgPiAobV9oZWlnaHQgLSB0b0FkZCkgJiYgKChpc0lubGluZUJsb2Nr
T3JJbmxpbmVUYWJsZSgpICYmICFpc0Fub255bW91c0Jsb2NrKCkpIHx8IGlzRmxvYXRpbmdPclBv
c2l0aW9uZWQoKSB8fCBoYXNPdmVyZmxvd0NsaXAoKSB8fAogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgKHBhcmVudCgpICYmIHBhcmVudCgpLT5pc0ZsZXhpYmxlQm94KCkgfHwg
bV9oYXNDb2x1bW5zKSkpCiAgICAgICAgIG1faGVpZ2h0ID0gZmxvYXRCb3R0b20oKSArIHRvQWRk
OwogICAgIApAQCAtMjQzOCw3ICsyNDMzLDE4IEBAIFJlbmRlckJsb2NrOjpjbGVhckZsb2F0cygp
CiAgICAgaWYgKG1fZmxvYXRpbmdPYmplY3RzKQogICAgICAgICBtX2Zsb2F0aW5nT2JqZWN0cy0+
Y2xlYXIoKTsKIAotICAgIC8vIElubGluZSBibG9ja3MgYXJlIGNvdmVyZWQgYnkgdGhlIGlzUmVw
bGFjZWQoKSBjaGVjayBpbiB0aGUgYXZvaWRGbG9hdHMgbWV0aG9kLgorICAgIC8vIEFub255bW91
cyBibG9ja3MgKGZvciB0aGUgYmxvY2tzIGluc2lkZSBpbmxpbmVzIGNhc2UpIG5lZWQgdG8gYWxs
b3cgZmxvYXRzIGZyb20gdGhlIHBhcmVudCB0byBpbnRydWRlIGludG8gdGhlaXIKKyAgICAvLyBz
cGFjZS4KKyAgICBpZiAoaXNJbmxpbmUoKSAmJiBpc0Fub255bW91c0Jsb2NrKCkpIHsKKyAgICAg
ICAgUmVuZGVyQmxvY2sqIGNiID0gY29udGFpbmluZ0Jsb2NrKCk7CisgICAgICAgIGlmIChjYi0+
Y29udGFpbnNGbG9hdHMoKSkgeworICAgICAgICAgICAgaW50IG9mZnNldCA9IG1feTsKKyAgICAg
ICAgICAgIGFkZEludHJ1ZGluZ0Zsb2F0cyhjYiwgY2ItPmJvcmRlckxlZnQoKSArIGNiLT5wYWRk
aW5nTGVmdCgpLCBvZmZzZXQpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9Cisg
ICAgICAgIAorICAgIC8vIElubGluZSBibG9ja3MgYXJlIGNvdmVyZWQgYnkgdGhlIGlzUmVwbGFj
ZWQoKSBjaGVjayBpbiB0aGUgYXZvaWRzRmxvYXRzIG1ldGhvZC4KICAgICBpZiAoYXZvaWRzRmxv
YXRzKCkgfHwgaXNSb290KCkgfHwgaXNSZW5kZXJWaWV3KCkgfHwgaXNGbG9hdGluZ09yUG9zaXRp
b25lZCgpIHx8IGlzVGFibGVDZWxsKCkpCiAgICAgICAgIHJldHVybjsKICAgICAKQEAgLTM1MTgs
NiArMzUyNCwxMyBAQCB2b2lkIFJlbmRlckJsb2NrOjpjYWxjSW5saW5lTWluTWF4V2lkdGgoCiAg
ICAgICAgICAgICAgICAgICAgIGlubGluZU1heCArPSBjaGlsZE1heDsKICAgICAgICAgICAgICAg
ICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIHdl
IGFyZSBhbiBhbm9ueW1vdXMgaW5saW5lIGJsb2NrIHRoZW4gYm90aCBtaW4gYW5kIG1heCB3aWR0
aCBhcmUgcmVzZXQuCisgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC0+aXNBbm9ueW1vdXNC
bG9jaygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX21pbldpZHRoID0gbWF4KGlubGlu
ZU1pbiwgbV9taW5XaWR0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtX21heFdpZHRoID0g
bWF4KGlubGluZU1heCwgbV9tYXhXaWR0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmxp
bmVNaW4gPSBpbmxpbmVNYXggPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAvLyBJbmxpbmUgcmVwbGFjZWQgZWx0cyBh
ZGQgaW4gdGhlaXIgbWFyZ2lucyB0byB0aGVpciBtaW4vbWF4IHZhbHVlcy4KICAgICAgICAgICAg
ICAgICAgICAgaW50IG1hcmdpbnMgPSAwOwogICAgICAgICAgICAgICAgICAgICBMZW5ndGggbGVm
dE1hcmdpbiA9IGNzdHlsZS0+bWFyZ2luTGVmdCgpOwpJbmRleDogcmVuZGVyaW5nL1JlbmRlckNv
bnRhaW5lci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gcmVuZGVyaW5nL1JlbmRlckNvbnRhaW5lci5jcHAJ
KHJldmlzaW9uIDIwOTg1KQorKysgcmVuZGVyaW5nL1JlbmRlckNvbnRhaW5lci5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTI2OCwxNiArMjY4LDYgQEAgdm9pZCBSZW5kZXJDb250YWluZXI6OnVwZGF0
ZVBzZXVkb0NoaWxkRgogCiAgICAgLy8gV2hldGhlciBvciBub3Qgd2Ugbm93IHdhbnQgZ2VuZXJh
dGVkIGNvbnRlbnQuICAKICAgICBib29sIG5ld0NvbnRlbnRXYW50ZWQgPSBwc2V1ZG8gJiYgcHNl
dWRvLT5kaXNwbGF5KCkgIT0gTk9ORTsKLQotICAgIC8vIEZvciA8cT48cC8+PC9xPiwgaWYgdGhp
cyBvYmplY3QgaXMgdGhlIGlubGluZSBjb250aW51YXRpb24gb2YgdGhlIDxxPiwgd2Ugb25seSB3
YW50IHRvIGdlbmVyYXRlCi0gICAgLy8gOmFmdGVyIGNvbnRlbnQgYW5kIG5vdCA6YmVmb3JlIGNv
bnRlbnQuCi0gICAgaWYgKG5ld0NvbnRlbnRXYW50ZWQgJiYgdHlwZSA9PSBSZW5kZXJTdHlsZTo6
QkVGT1JFICYmIGlzSW5saW5lQ29udGludWF0aW9uKCkpCi0gICAgICAgIG5ld0NvbnRlbnRXYW50
ZWQgPSBmYWxzZTsKLQotICAgIC8vIFNpbWlsYXJseSwgaWYgd2UncmUgdGhlIGJlZ2lubmluZyBv
ZiBhIDxxPiwgYW5kIHRoZXJlJ3MgYW4gaW5saW5lIGNvbnRpbnVhdGlvbiBmb3Igb3VyIG9iamVj
dCwKLSAgICAvLyB0aGVuIHdlIGRvbid0IGdlbmVyYXRlIHRoZSA6YWZ0ZXIgY29udGVudC4KLSAg
ICBpZiAobmV3Q29udGVudFdhbnRlZCAmJiB0eXBlID09IFJlbmRlclN0eWxlOjpBRlRFUiAmJiBp
c1JlbmRlcklubGluZSgpICYmIGNvbnRpbnVhdGlvbigpKQotICAgICAgICBuZXdDb250ZW50V2Fu
dGVkID0gZmFsc2U7CiAgICAgCiAgICAgLy8gSWYgd2UgZG9uJ3Qgd2FudCBnZW5lcmF0ZWQgY29u
dGVudCBhbnkgbG9uZ2VyLCBvciBpZiB3ZSBoYXZlIGdlbmVyYXRlZCBjb250ZW50LCBidXQgaXQn
cyBubyBsb25nZXIKICAgICAvLyBpZGVudGljYWwgdG8gdGhlIG5ldyBjb250ZW50IGRhdGEgd2Ug
d2FudCB0byBidWlsZCByZW5kZXIgb2JqZWN0cyBmb3IsIHRoZW4gd2UgbnVrZSBhbGwKQEAgLTQ5
MCw3ICs0ODAsNyBAQCB2b2lkIFJlbmRlckNvbnRhaW5lcjo6cmVtb3ZlTGVmdG92ZXJBbm9uCiAg
ICAgd2hpbGUoIGNoaWxkICkgewogICAgICAgICBSZW5kZXJPYmplY3QqIG5leHQgPSBjaGlsZC0+
bmV4dFNpYmxpbmcoKTsKICAgICAgICAgCi0gICAgICAgIGlmICggY2hpbGQtPmlzUmVuZGVyQmxv
Y2soKSAmJiBjaGlsZC0+aXNBbm9ueW1vdXNCbG9jaygpICYmICFjaGlsZC0+Y29udGludWF0aW9u
KCkgJiYgIWNoaWxkLT5jaGlsZHJlbklubGluZSgpICYmICFjaGlsZC0+aXNUYWJsZUNlbGwoKSAp
IHsKKyAgICAgICAgaWYgKCFjaGlsZC0+aXNJbmxpbmUoKSAmJiBjaGlsZC0+aXNBbm9ueW1vdXNC
bG9jaygpICYmICFjaGlsZC0+Y2hpbGRyZW5JbmxpbmUoKSAmJiAhY2hpbGQtPmlzVGFibGVDZWxs
KCkgKSB7CiAgICAgICAgICAgICBSZW5kZXJPYmplY3QqIGZpcnN0QW5DaGlsZCA9IGNoaWxkLT5m
aXJzdENoaWxkKCk7CiAgICAgICAgICAgICBSZW5kZXJPYmplY3QqIGxhc3RBbkNoaWxkID0gY2hp
bGQtPmxhc3RDaGlsZCgpOwogICAgICAgICAgICAgaWYgKCBmaXJzdEFuQ2hpbGQgKSB7CkBAIC01
MjksNyArNTE5LDcgQEAgdm9pZCBSZW5kZXJDb250YWluZXI6OnJlbW92ZUxlZnRvdmVyQW5vbgog
ICAgICAgICBjaGlsZCA9IG5leHQ7CiAgICAgfQogCi0gICAgaWYgKHBhcmVudCgpKSAvLyAmJiBp
c0Fub255bW91c0Jsb2NrKCkgJiYgIWNvbnRpbnVhdGlvbigpICYmICFjaGlsZHJlbklubGluZSgp
ICYmICFpc1RhYmxlQ2VsbCgpKQorICAgIGlmIChwYXJlbnQoKSkKICAgICAgICAgcGFyZW50KCkt
PnJlbW92ZUxlZnRvdmVyQW5vbnltb3VzQm94ZXMoKTsKIH0KIApJbmRleDogcmVuZGVyaW5nL1Jl
bmRlckZsb3cuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHJlbmRlcmluZy9SZW5kZXJGbG93LmNwcAkocmV2
aXNpb24gMjA5ODUpCisrKyByZW5kZXJpbmcvUmVuZGVyRmxvdy5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTUwLDY2ICs1MCw4IEBAIFJlbmRlckZsb3cqIFJlbmRlckZsb3c6OmNyZWF0ZUFub255bW91
c0YKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1SZW5kZXJGbG93KiBSZW5kZXJGbG93Ojpjb250
aW51YXRpb25CZWZvcmUoUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCkKLXsKLSAgICBpZiAoYmVm
b3JlQ2hpbGQgJiYgYmVmb3JlQ2hpbGQtPnBhcmVudCgpID09IHRoaXMpCi0gICAgICAgIHJldHVy
biB0aGlzOwotCi0gICAgUmVuZGVyRmxvdyogY3VyciA9IGNvbnRpbnVhdGlvbigpOwotICAgIFJl
bmRlckZsb3cqIG5leHRUb0xhc3QgPSB0aGlzOwotICAgIFJlbmRlckZsb3cqIGxhc3QgPSB0aGlz
OwotICAgIHdoaWxlIChjdXJyKSB7Ci0gICAgICAgIGlmIChiZWZvcmVDaGlsZCAmJiBiZWZvcmVD
aGlsZC0+cGFyZW50KCkgPT0gY3VycikgewotICAgICAgICAgICAgaWYgKGN1cnItPmZpcnN0Q2hp
bGQoKSA9PSBiZWZvcmVDaGlsZCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbGFzdDsKLSAgICAg
ICAgICAgIHJldHVybiBjdXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgbmV4dFRvTGFzdCA9IGxh
c3Q7Ci0gICAgICAgIGxhc3QgPSBjdXJyOwotICAgICAgICBjdXJyID0gY3Vyci0+Y29udGludWF0
aW9uKCk7Ci0gICAgfQotCi0gICAgaWYgKCFiZWZvcmVDaGlsZCAmJiAhbGFzdC0+Zmlyc3RDaGls
ZCgpKQotICAgICAgICByZXR1cm4gbmV4dFRvTGFzdDsKLSAgICByZXR1cm4gbGFzdDsKLX0KLQot
dm9pZCBSZW5kZXJGbG93OjphZGRDaGlsZFdpdGhDb250aW51YXRpb24oUmVuZGVyT2JqZWN0KiBu
ZXdDaGlsZCwgUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCkKLXsKLSAgICBSZW5kZXJGbG93KiBm
bG93ID0gY29udGludWF0aW9uQmVmb3JlKGJlZm9yZUNoaWxkKTsKLSAgICBBU1NFUlQoIWJlZm9y
ZUNoaWxkIHx8IGJlZm9yZUNoaWxkLT5wYXJlbnQoKS0+aXNSZW5kZXJCbG9jaygpIHx8Ci0gICAg
ICAgICAgICAgICAgYmVmb3JlQ2hpbGQtPnBhcmVudCgpLT5pc1JlbmRlcklubGluZSgpKTsKLSAg
ICBSZW5kZXJGbG93KiBiZWZvcmVDaGlsZFBhcmVudCA9IGJlZm9yZUNoaWxkID8gc3RhdGljX2Nh
c3Q8UmVuZGVyRmxvdyo+KGJlZm9yZUNoaWxkLT5wYXJlbnQoKSkgOiAKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIChmbG93LT5jb250aW51YXRpb24oKSA/IGZsb3ctPmNvbnRp
bnVhdGlvbigpIDogZmxvdyk7Ci0KLSAgICBpZiAobmV3Q2hpbGQtPmlzRmxvYXRpbmdPclBvc2l0
aW9uZWQoKSkKLSAgICAgICAgcmV0dXJuIGJlZm9yZUNoaWxkUGFyZW50LT5hZGRDaGlsZFRvRmxv
dyhuZXdDaGlsZCwgYmVmb3JlQ2hpbGQpOwotCi0gICAgLy8gQSBjb250aW51YXRpb24gYWx3YXlz
IGNvbnNpc3RzIG9mIHR3byBwb3RlbnRpYWwgY2FuZGlkYXRlczogYW4gaW5saW5lIG9yIGFuIGFu
b255bW91cwotICAgIC8vIGJsb2NrIGJveCBob2xkaW5nIGJsb2NrIGNoaWxkcmVuLgotICAgIGJv
b2wgY2hpbGRJbmxpbmUgPSBuZXdDaGlsZC0+aXNJbmxpbmUoKTsKLSAgICBib29sIGJjcElubGlu
ZSA9IGJlZm9yZUNoaWxkUGFyZW50LT5pc0lubGluZSgpOwotICAgIGJvb2wgZmxvd0lubGluZSA9
IGZsb3ctPmlzSW5saW5lKCk7Ci0KLSAgICBpZiAoZmxvdyA9PSBiZWZvcmVDaGlsZFBhcmVudCkK
LSAgICAgICAgcmV0dXJuIGZsb3ctPmFkZENoaWxkVG9GbG93KG5ld0NoaWxkLCBiZWZvcmVDaGls
ZCk7Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8vIFRoZSBnb2FsIGhlcmUgaXMgdG8gbWF0Y2ggdXAg
aWYgd2UgY2FuLCBzbyB0aGF0IHdlIGNhbiBjb2FsZXNjZSBhbmQgY3JlYXRlIHRoZQotICAgICAg
ICAvLyBtaW5pbWFsICMgb2YgY29udGludWF0aW9ucyBuZWVkZWQgZm9yIHRoZSBpbmxpbmUuCi0g
ICAgICAgIGlmIChjaGlsZElubGluZSA9PSBiY3BJbmxpbmUpCi0gICAgICAgICAgICByZXR1cm4g
YmVmb3JlQ2hpbGRQYXJlbnQtPmFkZENoaWxkVG9GbG93KG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7
Ci0gICAgICAgIGVsc2UgaWYgKGZsb3dJbmxpbmUgPT0gY2hpbGRJbmxpbmUpCi0gICAgICAgICAg
ICByZXR1cm4gZmxvdy0+YWRkQ2hpbGRUb0Zsb3cobmV3Q2hpbGQsIDApOyAvLyBKdXN0IHRyZWF0
IGxpa2UgYW4gYXBwZW5kLgotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gYmVmb3Jl
Q2hpbGRQYXJlbnQtPmFkZENoaWxkVG9GbG93KG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7Ci0gICAg
fQotfQotCiB2b2lkIFJlbmRlckZsb3c6OmFkZENoaWxkKFJlbmRlck9iamVjdCogbmV3Q2hpbGQs
IFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQpCiB7Ci0gICAgaWYgKGNvbnRpbnVhdGlvbigpKQot
ICAgICAgICByZXR1cm4gYWRkQ2hpbGRXaXRoQ29udGludWF0aW9uKG5ld0NoaWxkLCBiZWZvcmVD
aGlsZCk7CiAgICAgcmV0dXJuIGFkZENoaWxkVG9GbG93KG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7
CiB9CiAKQEAgLTE2OSwxMSArMTExLDYgQEAgdm9pZCBSZW5kZXJGbG93OjpkZWxldGVMaW5lQm94
ZXMoKQogCiB2b2lkIFJlbmRlckZsb3c6OmRlc3Ryb3koKQogewotICAgIC8vIERldGFjaCBvdXIg
Y29udGludWF0aW9uIGZpcnN0LgotICAgIGlmIChtX2NvbnRpbnVhdGlvbikKLSAgICAgICAgbV9j
b250aW51YXRpb24tPmRlc3Ryb3koKTsKLSAgICBtX2NvbnRpbnVhdGlvbiA9IDA7Ci0KICAgICAv
LyBNYWtlIHN1cmUgdG8gZGVzdHJveSBhbm9ueW1vdXMgY2hpbGRyZW4gZmlyc3Qgd2hpbGUgdGhl
eSBhcmUgc3RpbGwgY29ubmVjdGVkIHRvIHRoZSByZXN0IG9mIHRoZSB0cmVlLCBzbyB0aGF0IHRo
ZXkgd2lsbAogICAgIC8vIHByb3Blcmx5IGRpcnR5IGxpbmUgYm94ZXMgdGhhdCB0aGV5IGFyZSBy
ZW1vdmVkIGZyb20uICBFZmZlY3RzIHRoYXQgZG8gOmJlZm9yZS86YWZ0ZXIgb25seSBvbiBob3Zl
ciBjb3VsZCBjcmFzaCBvdGhlcndpc2UuCiAgICAgUmVuZGVyQ29udGFpbmVyOjpkZXN0cm95TGVm
dG92ZXJDaGlsZHJlbigpOwpAQCAtNDkxLDExICs0MjgsNiBAQCBJbnRSZWN0IFJlbmRlckZsb3c6
OmFic29sdXRlQ2xpcHBlZE92ZXJmCiAgICAgICAgICAgICAgICAgICAgIHIudW5pdGUoY2hpbGRS
ZWN0KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlm
IChjb250aW51YXRpb24oKSAmJiAhY29udGludWF0aW9uKCktPmlzSW5saW5lKCkpIHsKLSAgICAg
ICAgICAgICAgICBJbnRSZWN0IGNvbnRSZWN0ID0gY29udGludWF0aW9uKCktPmdldEFic29sdXRl
UmVwYWludFJlY3RXaXRoT3V0bGluZShvdyk7Ci0gICAgICAgICAgICAgICAgci51bml0ZShjb250
UmVjdCk7Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gcjsKQEAg
LTY3MSwxMSArNjAzLDYgQEAgdm9pZCBSZW5kZXJGbG93OjphZGRGb2N1c1JpbmdSZWN0cyhHcmFw
aAogICAgICAgICAgICAgaWYgKCFjdXJyLT5pc1RleHQoKSAmJiAhY3Vyci0+aXNMaXN0TWFya2Vy
KCkpCiAgICAgICAgICAgICAgICAgY3Vyci0+YWRkRm9jdXNSaW5nUmVjdHMoZ3JhcGhpY3NDb250
ZXh0LCB0eCArIGN1cnItPnhQb3MoKSwgdHkgKyBjdXJyLT55UG9zKCkpOwogICAgIH0KLQotICAg
IGlmIChjb250aW51YXRpb24oKSkKLSAgICAgICAgY29udGludWF0aW9uKCktPmFkZEZvY3VzUmlu
Z1JlY3RzKGdyYXBoaWNzQ29udGV4dCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB0eCAtIGNvbnRhaW5pbmdCbG9jaygpLT54UG9zKCkgKyBjb250aW51YXRpb24o
KS0+eFBvcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHkg
LSBjb250YWluaW5nQmxvY2soKS0+eVBvcygpICsgY29udGludWF0aW9uKCktPnlQb3MoKSk7CiB9
CiAKIHZvaWQgUmVuZGVyRmxvdzo6cGFpbnRPdXRsaW5lKEdyYXBoaWNzQ29udGV4dCogZ3JhcGhp
Y3NDb250ZXh0LCBpbnQgdHgsIGludCB0eSkKSW5kZXg6IHJlbmRlcmluZy9SZW5kZXJGbG93LmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gcmVuZGVyaW5nL1JlbmRlckZsb3cuaAkocmV2aXNpb24gMjA5ODUpCisr
KyByZW5kZXJpbmcvUmVuZGVyRmxvdy5oCSh3b3JraW5nIGNvcHkpCkBAIC00Miw3ICs0Miw2IEBA
IGNsYXNzIFJlbmRlckZsb3cgOiBwdWJsaWMgUmVuZGVyQ29udGFpbmUKIHB1YmxpYzoKICAgICBS
ZW5kZXJGbG93KE5vZGUqIG5vZGUpCiAgICAgICAgIDogUmVuZGVyQ29udGFpbmVyKG5vZGUpCi0g
ICAgICAgICwgbV9jb250aW51YXRpb24oMCkKICAgICAgICAgLCBtX2ZpcnN0TGluZUJveCgwKQog
ICAgICAgICAsIG1fbGFzdExpbmVCb3goMCkKICAgICAgICAgLCBtX2xpbmVIZWlnaHQoLTEpCkBA
IC01NCwxNSArNTMsOSBAQCBwdWJsaWM6CiAgICAgICAgICwgbV9oYXNNYXJrdXBUcnVuY2F0aW9u
KGZhbHNlKQogICAgICAgICAsIG1fc2VsZWN0aW9uU3RhdGUoU2VsZWN0aW9uTm9uZSkKICAgICAg
ICAgLCBtX2hhc0NvbHVtbnMoZmFsc2UpCi0gICAgICAgICwgbV9pc0NvbnRpbnVhdGlvbihmYWxz
ZSkKICAgICB7CiAgICAgfQogCi0gICAgdmlydHVhbCBSZW5kZXJGbG93KiBjb250aW51YXRpb24o
KSBjb25zdCB7IHJldHVybiBtX2NvbnRpbnVhdGlvbjsgfQotICAgIHZvaWQgc2V0Q29udGludWF0
aW9uKFJlbmRlckZsb3cqIGMpIHsgbV9jb250aW51YXRpb24gPSBjOyB9Ci0gICAgUmVuZGVyRmxv
dyogY29udGludWF0aW9uQmVmb3JlKFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQpOwotCi0gICAg
dm9pZCBhZGRDaGlsZFdpdGhDb250aW51YXRpb24oUmVuZGVyT2JqZWN0KiBuZXdDaGlsZCwgUmVu
ZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCk7CiAgICAgdmlydHVhbCB2b2lkIGFkZENoaWxkVG9GbG93
KFJlbmRlck9iamVjdCogbmV3Q2hpbGQsIFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQpID0gMDsK
ICAgICB2aXJ0dWFsIHZvaWQgYWRkQ2hpbGQoUmVuZGVyT2JqZWN0KiBuZXdDaGlsZCwgUmVuZGVy
T2JqZWN0KiBiZWZvcmVDaGlsZCA9IDApOwogCkBAIC0xMDEsMTMgKzk0LDYgQEAgcHVibGljOgog
CiAgICAgdmlydHVhbCBib29sIGhhc0NvbHVtbnMoKSBjb25zdCB7IHJldHVybiBtX2hhc0NvbHVt
bnM7IH0KIAotcHJpdmF0ZToKLSAgICAvLyBBbiBpbmxpbmUgY2FuIGJlIHNwbGl0IHdpdGggYmxv
Y2tzIG9jY3VycmluZyBpbiBiZXR3ZWVuIHRoZSBpbmxpbmUgY29udGVudC4KLSAgICAvLyBXaGVu
IHRoaXMgb2NjdXJzIHdlIG5lZWQgYSBwb2ludGVyIHRvIG91ciBuZXh0IG9iamVjdC4gIFdlIGNh
biBiYXNpY2FsbHkgYmUKLSAgICAvLyBzcGxpdCBpbnRvIGEgc2VxdWVuY2Ugb2YgaW5saW5lcyBh
bmQgYmxvY2tzLiAgVGhlIGNvbnRpbnVhdGlvbiB3aWxsIGVpdGhlciBiZQotICAgIC8vIGFuIGFu
b255bW91cyBibG9jayAodGhhdCBob3VzZXMgb3RoZXIgYmxvY2tzKSBvciBpdCB3aWxsIGJlIGFu
IGlubGluZSBmbG93LgotICAgIFJlbmRlckZsb3cqIG1fY29udGludWF0aW9uOwotCiBwcm90ZWN0
ZWQ6CiAgICAgLy8gRm9yIGJsb2NrIGZsb3dzLCBlYWNoIGJveCByZXByZXNlbnRzIHRoZSByb290
IGlubGluZSBib3ggZm9yIGEgbGluZSBpbiB0aGUKICAgICAvLyBwYXJhZ3JhcGguCkBAIC0xMjcs
OSArMTEzLDYgQEAgcHJvdGVjdGVkOgogICAgIGJvb2wgbV9oYXNNYXJrdXBUcnVuY2F0aW9uIDog
MTsKICAgICB1bnNpZ25lZCBtX3NlbGVjdGlvblN0YXRlIDogMzsgLy8gU2VsZWN0aW9uU3RhdGUK
ICAgICBib29sIG1faGFzQ29sdW1ucyA6IDE7Ci0gICAgCi0gICAgLy8gZnJvbSBSZW5kZXJJbmxp
bmUKLSAgICBib29sIG1faXNDb250aW51YXRpb24gOiAxOyAvLyBXaGV0aGVyIG9yIG5vdCB3ZSdy
ZSBhIGNvbnRpbnVhdGlvbiBvZiBhbiBpbmxpbmUuCiB9OwogCiB9IC8vIG5hbWVzcGFjZSBXZWJD
b3JlCkluZGV4OiByZW5kZXJpbmcvUmVuZGVySW5saW5lLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSByZW5k
ZXJpbmcvUmVuZGVySW5saW5lLmNwcAkocmV2aXNpb24gMjA5ODUpCisrKyByZW5kZXJpbmcvUmVu
ZGVySW5saW5lLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDYsMjMgKzQ2LDYgQEAgdm9pZCBSZW5k
ZXJJbmxpbmU6OnNldFN0eWxlKFJlbmRlclN0eWxlKgogICAgIFJlbmRlckZsb3c6OnNldFN0eWxl
KG5ld1N0eWxlKTsKICAgICBzZXRJbmxpbmUodHJ1ZSk7CiAKLSAgICAvLyBFbnN1cmUgdGhhdCBh
bGwgb2YgdGhlIHNwbGl0IGlubGluZXMgcGljayB1cCB0aGUgbmV3IHN0eWxlLiBXZQotICAgIC8v
IG9ubHkgZG8gdGhpcyBpZiB3ZSdyZSBhbiBpbmxpbmUsIHNpbmNlIHdlIGRvbid0IHdhbnQgdG8g
cHJvcGFnYXRlCi0gICAgLy8gYSBibG9jaydzIHN0eWxlIHRvIHRoZSBvdGhlciBpbmxpbmVzLgot
ICAgIC8vIGUuZy4sIDxmb250PmZvbyA8aDQ+Z29vPC9oND4gbW9vPC9mb250Pi4gIFRoZSA8Zm9u
dD4gaW5saW5lcyBiZWZvcmUKLSAgICAvLyBhbmQgYWZ0ZXIgdGhlIGJsb2NrIHNoYXJlIHRoZSBz
YW1lIHN0eWxlLCBidXQgdGhlIGJsb2NrIGRvZXNuJ3QKLSAgICAvLyBuZWVkIHRvIHBhc3MgaXRz
IHN0eWxlIG9uIHRvIGFueW9uZSBlbHNlLgotICAgIFJlbmRlckZsb3cqIGN1cnJDb250ID0gY29u
dGludWF0aW9uKCk7Ci0gICAgd2hpbGUgKGN1cnJDb250KSB7Ci0gICAgICAgIGlmIChjdXJyQ29u
dC0+aXNJbmxpbmUoKSkgewotICAgICAgICAgICAgUmVuZGVyRmxvdyogbmV4dENvbnQgPSBjdXJy
Q29udC0+Y29udGludWF0aW9uKCk7Ci0gICAgICAgICAgICBjdXJyQ29udC0+c2V0Q29udGludWF0
aW9uKDApOwotICAgICAgICAgICAgY3VyckNvbnQtPnNldFN0eWxlKHN0eWxlKCkpOwotICAgICAg
ICAgICAgY3VyckNvbnQtPnNldENvbnRpbnVhdGlvbihuZXh0Q29udCk7Ci0gICAgICAgIH0KLSAg
ICAgICAgY3VyckNvbnQgPSBjdXJyQ29udC0+Y29udGludWF0aW9uKCk7Ci0gICAgfQotCiAgICAg
bV9saW5lSGVpZ2h0ID0gLTE7CiAKICAgICAvLyBVcGRhdGUgcHNldWRvcyBmb3IgOmJlZm9yZSBh
bmQgOmFmdGVyIG5vdy4KQEAgLTcwLDExICs1Myw2IEBAIHZvaWQgUmVuZGVySW5saW5lOjpzZXRT
dHlsZShSZW5kZXJTdHlsZSoKICAgICB1cGRhdGVQc2V1ZG9DaGlsZChSZW5kZXJTdHlsZTo6QUZU
RVIpOwogfQogCi1ib29sIFJlbmRlcklubGluZTo6aXNJbmxpbmVDb250aW51YXRpb24oKSBjb25z
dAotewotICAgIHJldHVybiBtX2lzQ29udGludWF0aW9uOwotfQotCiBzdGF0aWMgaW5saW5lIGJv
b2wgaXNBZnRlckNvbnRlbnQoUmVuZGVyT2JqZWN0KiBjaGlsZCkKIHsKICAgICBpZiAoIWNoaWxk
KQpAQCAtOTMsMTcyICs3MSw1MyBAQCB2b2lkIFJlbmRlcklubGluZTo6YWRkQ2hpbGRUb0Zsb3co
UmVuZGVyCiAgICAgaWYgKCFiZWZvcmVDaGlsZCAmJiBpc0FmdGVyQ29udGVudChsYXN0Q2hpbGQo
KSkpCiAgICAgICAgIGJlZm9yZUNoaWxkID0gbGFzdENoaWxkKCk7CiAKLSAgICBpZiAoIW5ld0No
aWxkLT5pc0lubGluZSgpICYmICFuZXdDaGlsZC0+aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpICYm
IGNvbnRhaW5pbmdCbG9jaygpLT5pc0Jsb2NrRmxvdygpKSB7Ci0gICAgICAgIC8vIFdlIGFyZSBw
bGFjaW5nIGEgYmxvY2sgaW5zaWRlIGFuIGlubGluZS4gV2UgaGF2ZSB0byBwZXJmb3JtIGEgc3Bs
aXQgb2YgdGhpcwotICAgICAgICAvLyBpbmxpbmUgaW50byBjb250aW51YXRpb25zLiAgVGhpcyBp
bnZvbHZlcyBjcmVhdGluZyBhbiBhbm9ueW1vdXMgYmxvY2sgYm94IHRvIGhvbGQKLSAgICAgICAg
Ly8gfG5ld0NoaWxkfC4gIFdlIHRoZW4gbWFrZSB0aGF0IGJsb2NrIGJveCBhIGNvbnRpbnVhdGlv
biBvZiB0aGlzIGlubGluZS4gIFdlIHRha2UgYWxsIG9mCi0gICAgICAgIC8vIHRoZSBjaGlsZHJl
biBhZnRlciB8YmVmb3JlQ2hpbGR8IGFuZCBwdXQgdGhlbSBpbiBhIGNsb25lIG9mIHRoaXMgb2Jq
ZWN0LgotICAgICAgICBSZW5kZXJTdHlsZSogbmV3U3R5bGUgPSBuZXcgKHJlbmRlckFyZW5hKCkp
IFJlbmRlclN0eWxlKCk7Ci0gICAgICAgIG5ld1N0eWxlLT5pbmhlcml0RnJvbShzdHlsZSgpKTsK
LSAgICAgICAgbmV3U3R5bGUtPnNldERpc3BsYXkoQkxPQ0spOwotCi0gICAgICAgIFJlbmRlckJs
b2NrKiBuZXdCb3ggPSBuZXcgKHJlbmRlckFyZW5hKCkpIFJlbmRlckJsb2NrKGRvY3VtZW50KCkg
LyogYW5vbnltb3VzIGJveCAqLyk7Ci0gICAgICAgIG5ld0JveC0+c2V0U3R5bGUobmV3U3R5bGUp
OwotICAgICAgICBSZW5kZXJGbG93KiBvbGRDb250aW51YXRpb24gPSBjb250aW51YXRpb24oKTsK
LSAgICAgICAgc2V0Q29udGludWF0aW9uKG5ld0JveCk7Ci0KLSAgICAgICAgLy8gU29tZW9uZSBt
YXkgaGF2ZSBwdXQgYSA8cD4gaW5zaWRlIGEgPHE+LCBjYXVzaW5nIGEgc3BsaXQuICBXaGVuIHRo
aXMgaGFwcGVucywgdGhlIDphZnRlciBjb250ZW50Ci0gICAgICAgIC8vIGhhcyB0byBtb3ZlIGlu
dG8gdGhlIGlubGluZSBjb250aW51YXRpb24uICBDYWxsIHVwZGF0ZVBzZXVkb0NoaWxkIHRvIGVu
c3VyZSB0aGF0IG91ciA6YWZ0ZXIKLSAgICAgICAgLy8gY29udGVudCBnZXRzIHByb3Blcmx5IGRl
c3Ryb3llZC4KLSAgICAgICAgYm9vbCBpc0xhc3RDaGlsZCA9IChiZWZvcmVDaGlsZCA9PSBsYXN0
Q2hpbGQoKSk7Ci0gICAgICAgIHVwZGF0ZVBzZXVkb0NoaWxkKFJlbmRlclN0eWxlOjpBRlRFUik7
Ci0gICAgICAgIGlmIChpc0xhc3RDaGlsZCAmJiBiZWZvcmVDaGlsZCAhPSBsYXN0Q2hpbGQoKSkK
LSAgICAgICAgICAgIGJlZm9yZUNoaWxkID0gMDsgLy8gV2UgZGVzdHJveWVkIHRoZSBsYXN0IGNo
aWxkLCBzbyBub3cgd2UgbmVlZCB0byB1cGRhdGUgb3VyIGluc2VydGlvbgotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAvLyBwb2ludCB0byBiZSAwLiAgSXQncyBqdXN0IGEgc3RyYWlnaHQg
YXBwZW5kIG5vdy4KLQotICAgICAgICBzcGxpdEZsb3coYmVmb3JlQ2hpbGQsIG5ld0JveCwgbmV3
Q2hpbGQsIG9sZENvbnRpbnVhdGlvbik7CisgICAgLy8gSWYgdGhlIHJlcXVlc3RlZCBiZWZvcmVD
aGlsZCBpcyBub3Qgb25lIG9mIG91ciBjaGlsZHJlbiwgdGhlbiB0aGlzIGlzIG1vc3QgbGlrZWx5
IGJlY2F1c2UKKyAgICAvLyB0aGVyZSBpcyBhbiBhbm9ueW1vdXMgaW5saW5lLWJsb2NrIGJveCB3
aXRoaW4gdGhpcyBvYmplY3QgdGhhdCBjb250YWlucyB0aGUgYmVmb3JlQ2hpbGQuIFNvCisgICAg
Ly8ganVzdCBpbnNlcnQgdGhlIGNoaWxkIGludG8gdGhlIGFub255bW91cyBpbmxpbmUtYmxvY2sg
Ym94IGluc3RlYWQgb2YgaGVyZS4KKyAgICBpZiAoYmVmb3JlQ2hpbGQgJiYgYmVmb3JlQ2hpbGQt
PnBhcmVudCgpICE9IHRoaXMpIHsKKyAgICAgICAgQVNTRVJUKGJlZm9yZUNoaWxkLT5wYXJlbnQo
KSk7CisgICAgICAgIEFTU0VSVChiZWZvcmVDaGlsZC0+cGFyZW50KCktPmlzQW5vbnltb3VzQmxv
Y2soKSk7CisgICAgICAgIGlmICghbmV3Q2hpbGQtPmlzSW5saW5lKCkgfHwgKG5ld0NoaWxkLT5p
c0lubGluZSgpICYmIGJlZm9yZUNoaWxkLT5wYXJlbnQoKS0+Zmlyc3RDaGlsZCgpICE9IGJlZm9y
ZUNoaWxkKSkKKyAgICAgICAgICAgIGJlZm9yZUNoaWxkLT5wYXJlbnQoKS0+YWRkQ2hpbGQobmV3
Q2hpbGQsIGJlZm9yZUNoaWxkKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYWRkQ2hpbGRU
b0Zsb3cobmV3Q2hpbGQsIGJlZm9yZUNoaWxkLT5wYXJlbnQoKSk7CiAgICAgICAgIHJldHVybjsK
ICAgICB9CiAKLSAgICBSZW5kZXJDb250YWluZXI6OmFkZENoaWxkKG5ld0NoaWxkLGJlZm9yZUNo
aWxkKTsKLQotICAgIG5ld0NoaWxkLT5zZXROZWVkc0xheW91dEFuZE1pbk1heFJlY2FsYygpOwot
fQotCi1SZW5kZXJJbmxpbmUqIFJlbmRlcklubGluZTo6Y2xvbmVJbmxpbmUoUmVuZGVyRmxvdyog
c3JjKQotewotICAgIFJlbmRlcklubGluZSogbyA9IG5ldyAoc3JjLT5yZW5kZXJBcmVuYSgpKSBS
ZW5kZXJJbmxpbmUoc3JjLT5lbGVtZW50KCkpOwotICAgIG8tPm1faXNDb250aW51YXRpb24gPSB0
cnVlOwotICAgIG8tPnNldFN0eWxlKHNyYy0+c3R5bGUoKSk7Ci0gICAgcmV0dXJuIG87Ci19Ci0K
LXZvaWQgUmVuZGVySW5saW5lOjpzcGxpdElubGluZXMoUmVuZGVyQmxvY2sqIGZyb21CbG9jaywg
UmVuZGVyQmxvY2sqIHRvQmxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJl
bmRlckJsb2NrKiBtaWRkbGVCbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
UmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCwgUmVuZGVyRmxvdyogb2xkQ29udCkKLXsKLSAgICAv
LyBDcmVhdGUgYSBjbG9uZSBvZiB0aGlzIGlubGluZS4KLSAgICBSZW5kZXJJbmxpbmUqIGNsb25l
ID0gY2xvbmVJbmxpbmUodGhpcyk7Ci0gICAgY2xvbmUtPnNldENvbnRpbnVhdGlvbihvbGRDb250
KTsKLQotICAgIC8vIE5vdyB0YWtlIGFsbCBvZiB0aGUgY2hpbGRyZW4gZnJvbSBiZWZvcmVDaGls
ZCB0byB0aGUgZW5kIGFuZCByZW1vdmUKLSAgICAvLyB0aGVtIGZyb20gfHRoaXN8IGFuZCBwbGFj
ZSB0aGVtIGluIHRoZSBjbG9uZS4KLSAgICBSZW5kZXJPYmplY3QqIG8gPSBiZWZvcmVDaGlsZDsK
LSAgICB3aGlsZSAobykgewotICAgICAgICBSZW5kZXJPYmplY3QqIHRtcCA9IG87Ci0gICAgICAg
IG8gPSB0bXAtPm5leHRTaWJsaW5nKCk7Ci0gICAgICAgIGNsb25lLT5hZGRDaGlsZFRvRmxvdyhy
ZW1vdmVDaGlsZE5vZGUodG1wKSwgMCk7Ci0gICAgICAgIHRtcC0+c2V0TmVlZHNMYXlvdXRBbmRN
aW5NYXhSZWNhbGMoKTsKLSAgICB9Ci0KLSAgICAvLyBIb29rIHxjbG9uZXwgdXAgYXMgdGhlIGNv
bnRpbnVhdGlvbiBvZiB0aGUgbWlkZGxlIGJsb2NrLgotICAgIG1pZGRsZUJsb2NrLT5zZXRDb250
aW51YXRpb24oY2xvbmUpOwotCi0gICAgLy8gV2UgaGF2ZSBiZWVuIHJlcGFyZW50ZWQgYW5kIGFy
ZSBub3cgdW5kZXIgdGhlIGZyb21CbG9jay4gIFdlIG5lZWQKLSAgICAvLyB0byB3YWxrIHVwIG91
ciBpbmxpbmUgcGFyZW50IGNoYWluIHVudGlsIHdlIGhpdCB0aGUgY29udGFpbmluZyBibG9jay4K
LSAgICAvLyBPbmNlIHdlIGhpdCB0aGUgY29udGFpbmluZyBibG9jayB3ZSdyZSBkb25lLgotICAg
IFJlbmRlckZsb3cqIGN1cnIgPSBzdGF0aWNfY2FzdDxSZW5kZXJGbG93Kj4ocGFyZW50KCkpOwot
ICAgIFJlbmRlckZsb3cqIGN1cnJDaGlsZCA9IHRoaXM7Ci0gICAgd2hpbGUgKGN1cnIgJiYgY3Vy
ciAhPSBmcm9tQmxvY2spIHsKLSAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGNsb25lLgotICAgICAg
ICBSZW5kZXJJbmxpbmUqIGNsb25lQ2hpbGQgPSBjbG9uZTsKLSAgICAgICAgY2xvbmUgPSBjbG9u
ZUlubGluZShjdXJyKTsKLQotICAgICAgICAvLyBJbnNlcnQgb3VyIGNoaWxkIGNsb25lIGFzIHRo
ZSBmaXJzdCBjaGlsZC4KLSAgICAgICAgY2xvbmUtPmFkZENoaWxkVG9GbG93KGNsb25lQ2hpbGQs
IDApOwotCi0gICAgICAgIC8vIEhvb2sgdGhlIGNsb25lIHVwIGFzIGEgY29udGludWF0aW9uIG9m
IHxjdXJyfC4KLSAgICAgICAgUmVuZGVyRmxvdyogb2xkQ29udCA9IGN1cnItPmNvbnRpbnVhdGlv
bigpOwotICAgICAgICBjdXJyLT5zZXRDb250aW51YXRpb24oY2xvbmUpOwotICAgICAgICBjbG9u
ZS0+c2V0Q29udGludWF0aW9uKG9sZENvbnQpOwotCi0gICAgICAgIC8vIFNvbWVvbmUgbWF5IGhh
dmUgaW5kaXJlY3RseSBjYXVzZWQgYSA8cT4gdG8gc3BsaXQuICBXaGVuIHRoaXMgaGFwcGVucywg
dGhlIDphZnRlciBjb250ZW50Ci0gICAgICAgIC8vIGhhcyB0byBtb3ZlIGludG8gdGhlIGlubGlu
ZSBjb250aW51YXRpb24uICBDYWxsIHVwZGF0ZVBzZXVkb0NoaWxkIHRvIGVuc3VyZSB0aGF0IHRo
ZSBpbmxpbmUncyA6YWZ0ZXIKLSAgICAgICAgLy8gY29udGVudCBnZXRzIHByb3Blcmx5IGRlc3Ry
b3llZC4KLSAgICAgICAgY3Vyci0+dXBkYXRlUHNldWRvQ2hpbGQoUmVuZGVyU3R5bGU6OkFGVEVS
KTsKLQotICAgICAgICAvLyBOb3cgd2UgbmVlZCB0byB0YWtlIGFsbCBvZiB0aGUgY2hpbGRyZW4g
c3RhcnRpbmcgZnJvbSB0aGUgZmlyc3QgY2hpbGQKLSAgICAgICAgLy8gKmFmdGVyKiBjdXJyQ2hp
bGQgYW5kIGFwcGVuZCB0aGVtIGFsbCB0byB0aGUgY2xvbmUuCi0gICAgICAgIG8gPSBjdXJyQ2hp
bGQtPm5leHRTaWJsaW5nKCk7Ci0gICAgICAgIHdoaWxlIChvKSB7Ci0gICAgICAgICAgICBSZW5k
ZXJPYmplY3QqIHRtcCA9IG87Ci0gICAgICAgICAgICBvID0gdG1wLT5uZXh0U2libGluZygpOwot
ICAgICAgICAgICAgY2xvbmUtPmFkZENoaWxkVG9GbG93KGN1cnItPnJlbW92ZUNoaWxkTm9kZSh0
bXApLCAwKTsKLSAgICAgICAgICAgIHRtcC0+c2V0TmVlZHNMYXlvdXRBbmRNaW5NYXhSZWNhbGMo
KTsKKyAgICBpZiAoIW5ld0NoaWxkLT5pc0lubGluZSgpKSB7CisgICAgICAgIC8vIFdlIGFyZSBw
bGFjaW5nIGEgYmxvY2sgaW5zaWRlIGFuIGlubGluZS4gV2UgaGF2ZSB0byBwbGFjZSB0aGUgYmxv
Y2sgaW5zaWRlIGFuIGFub255bW91cyBpbmxpbmUtYmxvY2suCisgICAgICAgIC8vIFRoaXMgaW5s
aW5lLWJsb2NrIGNhbiBob3VzZSBhIHNlcXVlbmNlIG9mIGNvbnRpZ3VvdXMgYmxvY2stbGV2ZWwg
Y2hpbGRyZW4sIGFuZCB0aGV5IHdpbGwgYWxsIHNpdCBvbiB0aGUKKyAgICAgICAgLy8gc2FtZSBs
aW5lIHRvZ2V0aGVyLiAgV2UgdHJ5IHRvIHJldXNlIG9uZSBmaXJzdCBpcyBwb3NzaWJsZS4KKyAg
ICAgICAgaWYgKGJlZm9yZUNoaWxkKSB7CisgICAgICAgICAgICBpZiAoYmVmb3JlQ2hpbGQtPnBy
ZXZpb3VzU2libGluZygpICYmIGJlZm9yZUNoaWxkLT5wcmV2aW91c1NpYmxpbmcoKS0+aXNBbm9u
eW1vdXNCbG9jaygpKSB7CisgICAgICAgICAgICAgICAgYmVmb3JlQ2hpbGQtPnByZXZpb3VzU2li
bGluZygpLT5hZGRDaGlsZChuZXdDaGlsZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAg
ICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGxhc3RDaGlsZCgp
ICYmIGxhc3RDaGlsZCgpLT5pc0Fub255bW91c0Jsb2NrKCkpIHsKKyAgICAgICAgICAgICAgICBs
YXN0Q2hpbGQoKS0+YWRkQ2hpbGQobmV3Q2hpbGQpOworICAgICAgICAgICAgICAgIHJldHVybjsK
KyAgICAgICAgICAgIH0KICAgICAgICAgfQotCi0gICAgICAgIC8vIEtlZXAgd2Fsa2luZyB1cCB0
aGUgY2hhaW4uCi0gICAgICAgIGN1cnJDaGlsZCA9IGN1cnI7Ci0gICAgICAgIGN1cnIgPSBzdGF0
aWNfY2FzdDxSZW5kZXJGbG93Kj4oY3Vyci0+cGFyZW50KCkpOwotICAgIH0KLQotICAgIC8vIE5v
dyB3ZSBhcmUgYXQgdGhlIGJsb2NrIGxldmVsLiBXZSBuZWVkIHRvIHB1dCB0aGUgY2xvbmUgaW50
byB0aGUgdG9CbG9jay4KLSAgICB0b0Jsb2NrLT5hcHBlbmRDaGlsZE5vZGUoY2xvbmUpOwotCi0g
ICAgLy8gTm93IHRha2UgYWxsIHRoZSBjaGlsZHJlbiBhZnRlciBjdXJyQ2hpbGQgYW5kIHJlbW92
ZSB0aGVtIGZyb20gdGhlIGZyb21CbG9jawotICAgIC8vIGFuZCBwdXQgdGhlbSBpbiB0aGUgdG9C
bG9jay4KLSAgICBvID0gY3VyckNoaWxkLT5uZXh0U2libGluZygpOwotICAgIHdoaWxlIChvKSB7
Ci0gICAgICAgIFJlbmRlck9iamVjdCogdG1wID0gbzsKLSAgICAgICAgbyA9IHRtcC0+bmV4dFNp
YmxpbmcoKTsKLSAgICAgICAgdG9CbG9jay0+YXBwZW5kQ2hpbGROb2RlKGZyb21CbG9jay0+cmVt
b3ZlQ2hpbGROb2RlKHRtcCkpOwotICAgIH0KLX0KLQotdm9pZCBSZW5kZXJJbmxpbmU6OnNwbGl0
RmxvdyhSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkLCBSZW5kZXJCbG9jayogbmV3QmxvY2tCb3gs
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbmRlck9iamVjdCogbmV3Q2hpbGQsIFJl
bmRlckZsb3cqIG9sZENvbnQpCi17Ci0gICAgUmVuZGVyQmxvY2sqIHByZSA9IDA7Ci0gICAgUmVu
ZGVyQmxvY2sqIGJsb2NrID0gY29udGFpbmluZ0Jsb2NrKCk7Ci0gICAgYm9vbCBtYWRlTmV3QmVm
b3JlQmxvY2sgPSBmYWxzZTsKLSAgICBpZiAoYmxvY2stPmlzQW5vbnltb3VzQmxvY2soKSAmJiAo
IWJsb2NrLT5wYXJlbnQoKSB8fCAhYmxvY2stPnBhcmVudCgpLT5jcmVhdGVzQW5vbnltb3VzV3Jh
cHBlcigpKSkgewotICAgICAgICAvLyBXZSBjYW4gcmV1c2UgdGhpcyBibG9jayBhbmQgbWFrZSBp
dCB0aGUgcHJlQmxvY2sgb2YgdGhlIG5leHQgY29udGludWF0aW9uLgotICAgICAgICBwcmUgPSBi
bG9jazsKLSAgICAgICAgYmxvY2sgPSBibG9jay0+Y29udGFpbmluZ0Jsb2NrKCk7Ci0gICAgfSBl
bHNlIHsKLSAgICAgICAgLy8gTm8gYW5vbnltb3VzIGJsb2NrIGF2YWlsYWJsZSBmb3IgdXNlLiAg
TWFrZSBvbmUuCi0gICAgICAgIHByZSA9IGJsb2NrLT5jcmVhdGVBbm9ueW1vdXNCbG9jaygpOwot
ICAgICAgICBtYWRlTmV3QmVmb3JlQmxvY2sgPSB0cnVlOwotICAgIH0KLQotICAgIFJlbmRlckJs
b2NrKiBwb3N0ID0gYmxvY2stPmNyZWF0ZUFub255bW91c0Jsb2NrKCk7Ci0KLSAgICBSZW5kZXJP
YmplY3QqIGJveEZpcnN0ID0gbWFkZU5ld0JlZm9yZUJsb2NrID8gYmxvY2stPmZpcnN0Q2hpbGQo
KSA6IHByZS0+bmV4dFNpYmxpbmcoKTsKLSAgICBpZiAobWFkZU5ld0JlZm9yZUJsb2NrKQotICAg
ICAgICBibG9jay0+aW5zZXJ0Q2hpbGROb2RlKHByZSwgYm94Rmlyc3QpOwotICAgIGJsb2NrLT5p
bnNlcnRDaGlsZE5vZGUobmV3QmxvY2tCb3gsIGJveEZpcnN0KTsKLSAgICBibG9jay0+aW5zZXJ0
Q2hpbGROb2RlKHBvc3QsIGJveEZpcnN0KTsKLSAgICBibG9jay0+c2V0Q2hpbGRyZW5JbmxpbmUo
ZmFsc2UpOwotCi0gICAgaWYgKG1hZGVOZXdCZWZvcmVCbG9jaykgewotICAgICAgICBSZW5kZXJP
YmplY3QqIG8gPSBib3hGaXJzdDsKLSAgICAgICAgd2hpbGUgKG8pIHsKLSAgICAgICAgICAgIFJl
bmRlck9iamVjdCogbm8gPSBvOwotICAgICAgICAgICAgbyA9IG5vLT5uZXh0U2libGluZygpOwot
ICAgICAgICAgICAgcHJlLT5hcHBlbmRDaGlsZE5vZGUoYmxvY2stPnJlbW92ZUNoaWxkTm9kZShu
bykpOwotICAgICAgICAgICAgbm8tPnNldE5lZWRzTGF5b3V0QW5kTWluTWF4UmVjYWxjKCk7Cisg
ICAgICAgIAorICAgICAgICBpZiAoIW5ld0NoaWxkLT5pc0Zsb2F0aW5nT3JQb3NpdGlvbmVkKCkp
IHsKKyAgICAgICAgICAgIC8vIFRoZXJlIHdhcyBubyBzdWl0YWJsZSBleGlzdGluZyBhbm9ueW1v
dXMgYm94LiAgQ3JlYXRlIGEgbmV3IG9uZS4KKyAgICAgICAgICAgIFJlbmRlclN0eWxlKiBuZXdT
dHlsZSA9IG5ldyAocmVuZGVyQXJlbmEoKSkgUmVuZGVyU3R5bGUoKTsKKyAgICAgICAgICAgIG5l
d1N0eWxlLT5pbmhlcml0RnJvbShzdHlsZSgpKTsKKyAgICAgICAgICAgIG5ld1N0eWxlLT5zZXRE
aXNwbGF5KElOTElORV9CTE9DSyk7CisgICAgICAgICAgICBuZXdTdHlsZS0+c2V0V2lkdGgoTGVu
Z3RoKDEwMC4wLCBQZXJjZW50KSk7CisgICAgICAgIAorICAgICAgICAgICAgUmVuZGVyQmxvY2sq
IG5ld0JveCA9IG5ldyAocmVuZGVyQXJlbmEoKSkgUmVuZGVyQmxvY2soZG9jdW1lbnQoKSk7Cisg
ICAgICAgICAgICBuZXdCb3gtPnNldFN0eWxlKG5ld1N0eWxlKTsKKyAgICAgICAgICAgIFJlbmRl
ckNvbnRhaW5lcjo6YWRkQ2hpbGQobmV3Qm94LCBiZWZvcmVDaGlsZCk7CisgICAgICAgICAgICBu
ZXdCb3gtPmFkZENoaWxkKG5ld0NoaWxkKTsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAg
fQogICAgIH0KIAotICAgIHNwbGl0SW5saW5lcyhwcmUsIHBvc3QsIG5ld0Jsb2NrQm94LCBiZWZv
cmVDaGlsZCwgb2xkQ29udCk7CisgICAgUmVuZGVyQ29udGFpbmVyOjphZGRDaGlsZChuZXdDaGls
ZCwgYmVmb3JlQ2hpbGQpOwogCi0gICAgLy8gV2UgYWxyZWFkeSBrbm93IHRoZSBuZXdCbG9ja0Jv
eCBpc24ndCBnb2luZyB0byBjb250YWluIGlubGluZSBraWRzLCBzbyBhdm9pZCB3YXN0aW5nCi0g
ICAgLy8gdGltZSBpbiBtYWtlQ2hpbGRyZW5Ob25JbmxpbmUgYnkganVzdCBzZXR0aW5nIHRoaXMg
ZXhwbGljaXRseSB1cCBmcm9udC4KLSAgICBuZXdCbG9ja0JveC0+c2V0Q2hpbGRyZW5JbmxpbmUo
ZmFsc2UpOwotCi0gICAgLy8gV2UgZG9uJ3QganVzdCBjYWxsIGFkZENoaWxkLCBzaW5jZSBpdCB3
b3VsZCBwYXNzIHRoaW5ncyBvZmYgdG8gdGhlCi0gICAgLy8gY29udGludWF0aW9uLCBzbyB3ZSBj
YWxsIGFkZENoaWxkVG9GbG93IGV4cGxpY2l0bHkgaW5zdGVhZC4gIFdlIGRlbGF5ZWQKLSAgICAv
LyBhZGRpbmcgdGhlIG5ld0NoaWxkIHVudGlsIG5vdyBzbyB0aGF0IHRoZSB8bmV3QmxvY2tCb3h8
IHdvdWxkIGJlIGZ1bGx5Ci0gICAgLy8gY29ubmVjdGVkLCB0aHVzIGFsbG93aW5nIG5ld0NoaWxk
IGFjY2VzcyB0byBhIHJlbmRlckFyZW5hIHNob3VsZCBpdCBuZWVkCi0gICAgLy8gdG8gd3JhcCBp
dHNlbGYgaW4gYWRkaXRpb25hbCBib3hlcyAoZS5nLiwgdGFibGUgY29uc3RydWN0aW9uKS4KLSAg
ICBuZXdCbG9ja0JveC0+YWRkQ2hpbGRUb0Zsb3cobmV3Q2hpbGQsIDApOwotCi0gICAgLy8gQWx3
YXlzIGp1c3QgZG8gYSBmdWxsIGxheW91dCBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCBsaW5lIGJv
eGVzIChlc3BlY2lhbGx5IHdyYXBwZXJzIGZvciBpbWFnZXMpCi0gICAgLy8gZ2V0IGRlbGV0ZWQg
cHJvcGVybHkuICBCZWNhdXNlIG9iamVjdHMgbW92ZXMgZnJvbSB0aGUgcHJlIGJsb2NrIGludG8g
dGhlIHBvc3QgYmxvY2ssIHdlIHdhbnQgdG8KLSAgICAvLyBtYWtlIG5ldyBsaW5lIGJveGVzIGlu
c3RlYWQgb2YgbGVhdmluZyB0aGUgb2xkIGxpbmUgYm94ZXMgYXJvdW5kLgotICAgIHByZS0+c2V0
TmVlZHNMYXlvdXRBbmRNaW5NYXhSZWNhbGMoKTsKLSAgICBibG9jay0+c2V0TmVlZHNMYXlvdXRB
bmRNaW5NYXhSZWNhbGMoKTsKLSAgICBwb3N0LT5zZXROZWVkc0xheW91dEFuZE1pbk1heFJlY2Fs
YygpOworICAgIG5ld0NoaWxkLT5zZXROZWVkc0xheW91dEFuZE1pbk1heFJlY2FsYygpOwogfQog
CiB2b2lkIFJlbmRlcklubGluZTo6cGFpbnQoUGFpbnRJbmZvJiBwYWludEluZm8sIGludCB0eCwg
aW50IHR5KQpAQCAtMjc1LDExICsxMzQsNiBAQCB2b2lkIFJlbmRlcklubGluZTo6YWJzb2x1dGVS
ZWN0cyhWZWN0b3I8CiAgICAgICAgIGlmICghY3Vyci0+aXNUZXh0KCkpCiAgICAgICAgICAgICBj
dXJyLT5hYnNvbHV0ZVJlY3RzKHJlY3RzLCB0eCArIGN1cnItPnhQb3MoKSwgdHkgKyBjdXJyLT55
UG9zKCkpOwogICAgIH0KLQotICAgIGlmIChjb250aW51YXRpb24oKSkKLSAgICAgICAgY29udGlu
dWF0aW9uKCktPmFic29sdXRlUmVjdHMocmVjdHMsIAotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICB0eCAtIGNvbnRhaW5pbmdCbG9jaygpLT54UG9zKCkgKyBjb250aW51YXRp
b24oKS0+eFBvcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eSAt
IGNvbnRhaW5pbmdCbG9jaygpLT55UG9zKCkgKyBjb250aW51YXRpb24oKS0+eVBvcygpKTsKIH0K
IAogdm9pZCBSZW5kZXJJbmxpbmU6OmNhbGNNaW5NYXhXaWR0aCgpCkBAIC0zNTEsMjEgKzIwNSw0
IEBAIGJvb2wgUmVuZGVySW5saW5lOjpub2RlQXRQb2ludChjb25zdCBIaXQKICAgICByZXR1cm4g
aGl0VGVzdExpbmVzKHJlcXVlc3QsIHJlc3VsdCwgeCwgeSwgdHgsIHR5LCBoaXRUZXN0QWN0aW9u
KTsKIH0KIAotVmlzaWJsZVBvc2l0aW9uIFJlbmRlcklubGluZTo6cG9zaXRpb25Gb3JDb29yZGlu
YXRlcyhpbnQgeCwgaW50IHkpCi17Ci0gICAgLy8gVHJhbnNsYXRlIHRoZSBjb29yZHMgZnJvbSB0
aGUgcHJlLWFub255bW91cyBibG9jayB0byB0aGUgcG9zdC1hbm9ueW1vdXMgYmxvY2suCi0gICAg
UmVuZGVyQmxvY2sqIGNiID0gY29udGFpbmluZ0Jsb2NrKCk7Ci0gICAgaW50IHBhcmVudEJsb2Nr
WCA9IGNiLT54UG9zKCkgKyB4OwotICAgIGludCBwYXJlbnRCbG9ja1kgPSBjYi0+eVBvcygpICsg
eTsKLSAgICBmb3IgKFJlbmRlck9iamVjdCogYyA9IGNvbnRpbnVhdGlvbigpOyBjOyBjID0gYy0+
Y29udGludWF0aW9uKCkpIHsKLSAgICAgICAgUmVuZGVyT2JqZWN0KiBjb250QmxvY2sgPSBjOwot
ICAgICAgICBpZiAoYy0+aXNJbmxpbmUoKSkKLSAgICAgICAgICAgIGNvbnRCbG9jayA9IGMtPmNv
bnRhaW5pbmdCbG9jaygpOwotICAgICAgICBpZiAoYy0+aXNJbmxpbmUoKSB8fCBjLT5maXJzdENo
aWxkKCkpCi0gICAgICAgICAgICByZXR1cm4gYy0+cG9zaXRpb25Gb3JDb29yZGluYXRlcyhwYXJl
bnRCbG9ja1ggLSBjb250QmxvY2stPnhQb3MoKSwgcGFyZW50QmxvY2tZIC0gY29udEJsb2NrLT55
UG9zKCkpOwotICAgIH0KLQotICAgIHJldHVybiBSZW5kZXJGbG93Ojpwb3NpdGlvbkZvckNvb3Jk
aW5hdGVzKHgsIHkpOwotfQotCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiByZW5kZXJp
bmcvUmVuZGVySW5saW5lLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gcmVuZGVyaW5nL1JlbmRlcklubGluZS5o
CShyZXZpc2lvbiAyMDk4NSkKKysrIHJlbmRlcmluZy9SZW5kZXJJbmxpbmUuaAkod29ya2luZyBj
b3B5KQpAQCAtNDIsMTMgKzQyLDcgQEAgcHVibGljOgogICAgIHZpcnR1YWwgYm9vbCBpc0lubGlu
ZUZsb3coKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CiAgICAgdmlydHVhbCBib29sIGNoaWxkcmVu
SW5saW5lKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQogCi0gICAgdmlydHVhbCBib29sIGlzSW5s
aW5lQ29udGludWF0aW9uKCkgY29uc3Q7Ci0KICAgICB2aXJ0dWFsIHZvaWQgYWRkQ2hpbGRUb0Zs
b3coUmVuZGVyT2JqZWN0KiBuZXdDaGlsZCwgUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCk7Ci0g
ICAgdm9pZCBzcGxpdElubGluZXMoUmVuZGVyQmxvY2sqIGZyb21CbG9jaywgUmVuZGVyQmxvY2sq
IHRvQmxvY2ssIFJlbmRlckJsb2NrKiBtaWRkbGVCbG9jaywKLSAgICAgICAgICAgICAgICAgICAg
ICBSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkLCBSZW5kZXJGbG93KiBvbGRDb250KTsKLSAgICB2
b2lkIHNwbGl0RmxvdyhSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkLCBSZW5kZXJCbG9jayogbmV3
QmxvY2tCb3gsCi0gICAgICAgICAgICAgICAgICAgUmVuZGVyT2JqZWN0KiBuZXdDaGlsZCwgUmVu
ZGVyRmxvdyogb2xkQ29udCk7CiAKICAgICB2aXJ0dWFsIHZvaWQgc2V0U3R5bGUoUmVuZGVyU3R5
bGUqKTsKIApAQCAtNzMsOCArNjcsNiBAQCBwdWJsaWM6CiAKICAgICB2b2lkIGFic29sdXRlUmVj
dHMoVmVjdG9yPEludFJlY3Q+JiwgaW50IHR4LCBpbnQgdHkpOwogCi0gICAgdmlydHVhbCBWaXNp
YmxlUG9zaXRpb24gcG9zaXRpb25Gb3JDb29yZGluYXRlcyhpbnQgeCwgaW50IHkpOwotCiBwcm90
ZWN0ZWQ6CiAgICAgc3RhdGljIFJlbmRlcklubGluZSogY2xvbmVJbmxpbmUoUmVuZGVyRmxvdyog
c3JjKTsKIApJbmRleDogcmVuZGVyaW5nL1JlbmRlck9iamVjdC5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
cmVuZGVyaW5nL1JlbmRlck9iamVjdC5jcHAJKHJldmlzaW9uIDIwOTg1KQorKysgcmVuZGVyaW5n
L1JlbmRlck9iamVjdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIzNywxNiArMjM3LDYgQEAgYm9v
bCBSZW5kZXJPYmplY3Q6OmNhbkhhdmVDaGlsZHJlbigpIGNvbgogICAgIHJldHVybiBmYWxzZTsK
IH0KIAotUmVuZGVyRmxvdyogUmVuZGVyT2JqZWN0Ojpjb250aW51YXRpb24oKSBjb25zdAotewot
ICAgIHJldHVybiAwOwotfQotCi1ib29sIFJlbmRlck9iamVjdDo6aXNJbmxpbmVDb250aW51YXRp
b24oKSBjb25zdAotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQogdm9pZCBSZW5kZXJPYmplY3Q6
OmFkZENoaWxkKFJlbmRlck9iamVjdCosIFJlbmRlck9iamVjdCopCiB7CiAgICAgQVNTRVJUX05P
VF9SRUFDSEVEKCk7CkBAIC0xNTY5LDE3ICsxNTU5LDcgQEAgdm9pZCBSZW5kZXJPYmplY3Q6OmFk
ZExpbmVCb3hSZWN0cyhWZWN0bwogCiB2b2lkIFJlbmRlck9iamVjdDo6YWJzb2x1dGVSZWN0cyhW
ZWN0b3I8SW50UmVjdD4mIHJlY3RzLCBpbnQgdHgsIGludCB0eSkKIHsKLSAgICAvLyBGb3IgYmxv
Y2tzIGluc2lkZSBpbmxpbmVzLCB3ZSBnbyBhaGVhZCBhbmQgaW5jbHVkZSBtYXJnaW5zIHNvIHRo
YXQgd2UgcnVuIHJpZ2h0IHVwIHRvIHRoZQotICAgIC8vIGlubGluZSBib3hlcyBhYm92ZSBhbmQg
YmVsb3cgdXMgKHRodXMgZ2V0dGluZyBtZXJnZWQgd2l0aCB0aGVtIHRvIGZvcm0gYSBzaW5nbGUg
aXJyZWd1bGFyCi0gICAgLy8gc2hhcGUpLgotICAgIGlmIChjb250aW51YXRpb24oKSkgewotICAg
ICAgICByZWN0cy5hcHBlbmQoSW50UmVjdCh0eCwgdHkgLSBjb2xsYXBzZWRNYXJnaW5Ub3AoKSwK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgoKSwgaGVpZ2h0KCkgKyBjb2xsYXBz
ZWRNYXJnaW5Ub3AoKSArIGNvbGxhcHNlZE1hcmdpbkJvdHRvbSgpKSk7Ci0gICAgICAgIGNvbnRp
bnVhdGlvbigpLT5hYnNvbHV0ZVJlY3RzKHJlY3RzLAotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICB0eCAtIHhQb3MoKSArIGNvbnRpbnVhdGlvbigpLT5jb250YWluaW5nQmxv
Y2soKS0+eFBvcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eSAt
IHlQb3MoKSArIGNvbnRpbnVhdGlvbigpLT5jb250YWluaW5nQmxvY2soKS0+eVBvcygpKTsKLSAg
ICB9IGVsc2UKLSAgICAgICAgcmVjdHMuYXBwZW5kKEludFJlY3QodHgsIHR5LCB3aWR0aCgpLCBo
ZWlnaHQoKSArIGJvcmRlclRvcEV4dHJhKCkgKyBib3JkZXJCb3R0b21FeHRyYSgpKSk7CisgICAg
cmVjdHMuYXBwZW5kKEludFJlY3QodHgsIHR5LCB3aWR0aCgpLCBoZWlnaHQoKSArIGJvcmRlclRv
cEV4dHJhKCkgKyBib3JkZXJCb3R0b21FeHRyYSgpKSk7CiB9CiAKIEludFJlY3QgUmVuZGVyT2Jq
ZWN0OjphYnNvbHV0ZUJvdW5kaW5nQm94UmVjdCgpCkBAIC0xNjQwLDE2ICsxNjIwLDcgQEAgdm9p
ZCBSZW5kZXJPYmplY3Q6OmFkZFBERlVSTFJlY3QoR3JhcGhpYwogCiB2b2lkIFJlbmRlck9iamVj
dDo6YWRkRm9jdXNSaW5nUmVjdHMoR3JhcGhpY3NDb250ZXh0KiBncmFwaGljc0NvbnRleHQsIGlu
dCB0eCwgaW50IHR5KQogewotICAgIC8vIEZvciBibG9ja3MgaW5zaWRlIGlubGluZXMsIHdlIGdv
IGFoZWFkIGFuZCBpbmNsdWRlIG1hcmdpbnMgc28gdGhhdCB3ZSBydW4gcmlnaHQgdXAgdG8gdGhl
Ci0gICAgLy8gaW5saW5lIGJveGVzIGFib3ZlIGFuZCBiZWxvdyB1cyAodGh1cyBnZXR0aW5nIG1l
cmdlZCB3aXRoIHRoZW0gdG8gZm9ybSBhIHNpbmdsZSBpcnJlZ3VsYXIKLSAgICAvLyBzaGFwZSku
Ci0gICAgaWYgKGNvbnRpbnVhdGlvbigpKSB7Ci0gICAgICAgIGdyYXBoaWNzQ29udGV4dC0+YWRk
Rm9jdXNSaW5nUmVjdChJbnRSZWN0KHR4LCB0eSAtIGNvbGxhcHNlZE1hcmdpblRvcCgpLCB3aWR0
aCgpLCBoZWlnaHQoKSArIGNvbGxhcHNlZE1hcmdpblRvcCgpICsgY29sbGFwc2VkTWFyZ2luQm90
dG9tKCkpKTsKLSAgICAgICAgY29udGludWF0aW9uKCktPmFkZEZvY3VzUmluZ1JlY3RzKGdyYXBo
aWNzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4
IC0geFBvcygpICsgY29udGludWF0aW9uKCktPmNvbnRhaW5pbmdCbG9jaygpLT54UG9zKCksCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eSAtIHlQb3MoKSArIGNv
bnRpbnVhdGlvbigpLT5jb250YWluaW5nQmxvY2soKS0+eVBvcygpKTsKLSAgICB9IGVsc2UKLSAg
ICAgICAgZ3JhcGhpY3NDb250ZXh0LT5hZGRGb2N1c1JpbmdSZWN0KEludFJlY3QodHgsIHR5LCB3
aWR0aCgpLCBoZWlnaHQoKSkpOworICAgIGdyYXBoaWNzQ29udGV4dC0+YWRkRm9jdXNSaW5nUmVj
dChJbnRSZWN0KHR4LCB0eSwgd2lkdGgoKSwgaGVpZ2h0KCkpKTsKIH0KIAogdm9pZCBSZW5kZXJP
YmplY3Q6OnBhaW50T3V0bGluZShHcmFwaGljc0NvbnRleHQqIGdyYXBoaWNzQ29udGV4dCwgaW50
IHR4LCBpbnQgdHksIGludCB3LCBpbnQgaCwgY29uc3QgUmVuZGVyU3R5bGUqIHN0eWxlKQpAQCAt
MTg2MCw5ICsxODMxLDYgQEAgSW50UmVjdCBSZW5kZXJPYmplY3Q6OmdldEFic29sdXRlUmVwYWlu
dAogICAgIEludFJlY3QgcihhYnNvbHV0ZUNsaXBwZWRPdmVyZmxvd1JlY3QoKSk7CiAgICAgci5p
bmZsYXRlKG93KTsKIAotICAgIGlmIChjb250aW51YXRpb24oKSAmJiAhaXNJbmxpbmUoKSkKLSAg
ICAgICAgci5pbmZsYXRlWShjb2xsYXBzZWRNYXJnaW5Ub3AoKSk7Ci0KICAgICBpZiAoaXNJbmxp
bmVGbG93KCkpIHsKICAgICAgICAgZm9yIChSZW5kZXJPYmplY3QqIGN1cnIgPSBmaXJzdENoaWxk
KCk7IGN1cnI7IGN1cnIgPSBjdXJyLT5uZXh0U2libGluZygpKSB7CiAgICAgICAgICAgICBpZiAo
IWN1cnItPmlzVGV4dCgpKQpAQCAtMjEwMCwyMSArMjA2OCw5IEBAIHZvaWQgUmVuZGVyT2JqZWN0
OjpoYW5kbGVEeW5hbWljRmxvYXRQb3MKICAgICAvLyBjaGlsZHJlbklubGluZSgpIHN0YXRlIGFu
ZCBvdXIgc3RhdGUuCiAgICAgc2V0SW5saW5lKHN0eWxlKCktPmlzRGlzcGxheUlubGluZVR5cGUo
KSk7CiAgICAgaWYgKGlzSW5saW5lKCkgIT0gcGFyZW50KCktPmNoaWxkcmVuSW5saW5lKCkpIHsK
LSAgICAgICAgaWYgKCFpc0lubGluZSgpKSB7Ci0gICAgICAgICAgICBpZiAocGFyZW50KCktPmlz
UmVuZGVySW5saW5lKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIHRvIHNwbGl0IHRo
ZSBwYXJlbnQgZmxvdy4KLSAgICAgICAgICAgICAgICBSZW5kZXJJbmxpbmUqIHBhcmVudElubGlu
ZSA9IHN0YXRpY19jYXN0PFJlbmRlcklubGluZSo+KHBhcmVudCgpKTsKLSAgICAgICAgICAgICAg
ICBSZW5kZXJCbG9jayogbmV3Qm94ID0gcGFyZW50SW5saW5lLT5jcmVhdGVBbm9ueW1vdXNCbG9j
aygpOwotCi0gICAgICAgICAgICAgICAgUmVuZGVyRmxvdyogb2xkQ29udGludWF0aW9uID0gcGFy
ZW50KCktPmNvbnRpbnVhdGlvbigpOwotICAgICAgICAgICAgICAgIHBhcmVudElubGluZS0+c2V0
Q29udGludWF0aW9uKG5ld0JveCk7Ci0KLSAgICAgICAgICAgICAgICBSZW5kZXJPYmplY3QqIGJl
Zm9yZUNoaWxkID0gbmV4dFNpYmxpbmcoKTsKLSAgICAgICAgICAgICAgICBwYXJlbnQoKS0+cmVt
b3ZlQ2hpbGROb2RlKHRoaXMpOwotICAgICAgICAgICAgICAgIHBhcmVudElubGluZS0+c3BsaXRG
bG93KGJlZm9yZUNoaWxkLCBuZXdCb3gsIHRoaXMsIG9sZENvbnRpbnVhdGlvbik7Ci0gICAgICAg
ICAgICB9IGVsc2UgaWYgKHBhcmVudCgpLT5pc1JlbmRlckJsb2NrKCkpCi0gICAgICAgICAgICAg
ICAgc3RhdGljX2Nhc3Q8UmVuZGVyQmxvY2sqPihwYXJlbnQoKSktPm1ha2VDaGlsZHJlbk5vbklu
bGluZSgpOwotICAgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoIWlzSW5saW5lKCkgJiYgcGFy
ZW50KCktPmlzUmVuZGVyQmxvY2soKSkKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlckJs
b2NrKj4ocGFyZW50KCkpLT5tYWtlQ2hpbGRyZW5Ob25JbmxpbmUoKTsKKyAgICAgICAgZWxzZSB7
CiAgICAgICAgICAgICAvLyBBbiBhbm9ueW1vdXMgYmxvY2sgbXVzdCBiZSBtYWRlIHRvIHdyYXAg
dGhpcyBpbmxpbmUuCiAgICAgICAgICAgICBSZW5kZXJCbG9jayogYm94ID0gY3JlYXRlQW5vbnlt
b3VzQmxvY2soKTsKICAgICAgICAgICAgIHBhcmVudCgpLT5pbnNlcnRDaGlsZE5vZGUoYm94LCB0
aGlzKTsKQEAgLTI0MzgsNyArMjM5NCw3IEBAIFJlbmRlck9iamVjdCogUmVuZGVyT2JqZWN0Ojpj
b250YWluZXIoKSAKIC8vIGNvbnRlbnQgKGFuZCBwZXJoYXBzIFhCTCkuICBUaGF0J3Mgd2h5IGl0
IHVzZXMgdGhlIHJlbmRlciB0cmVlIGFuZCBub3QgdGhlIERPTSB0cmVlLgogUmVuZGVyT2JqZWN0
KiBSZW5kZXJPYmplY3Q6OmhvdmVyQW5jZXN0b3IoKSBjb25zdAogewotICAgIHJldHVybiAoIWlz
SW5saW5lKCkgJiYgY29udGludWF0aW9uKCkpID8gY29udGludWF0aW9uKCkgOiBwYXJlbnQoKTsK
KyAgICByZXR1cm4gcGFyZW50KCk7CiB9CiAKIGJvb2wgUmVuZGVyT2JqZWN0Ojppc1NlbGVjdGlv
bkJvcmRlcigpIGNvbnN0CkBAIC0yNTQzLDggKzI0OTksNiBAQCB2b2lkIFJlbmRlck9iamVjdDo6
dXBkYXRlRHJhZ1N0YXRlKGJvb2wgCiAgICAgICAgIGVsZW1lbnQoKS0+c2V0Q2hhbmdlZCgpOwog
ICAgIGZvciAoUmVuZGVyT2JqZWN0KiBjdXJyID0gZmlyc3RDaGlsZCgpOyBjdXJyOyBjdXJyID0g
Y3Vyci0+bmV4dFNpYmxpbmcoKSkKICAgICAgICAgY3Vyci0+dXBkYXRlRHJhZ1N0YXRlKGRyYWdP
bik7Ci0gICAgaWYgKGNvbnRpbnVhdGlvbigpKQotICAgICAgICBjb250aW51YXRpb24oKS0+dXBk
YXRlRHJhZ1N0YXRlKGRyYWdPbik7CiB9CiAKIGJvb2wgUmVuZGVyT2JqZWN0OjpoaXRUZXN0KGNv
bnN0IEhpdFRlc3RSZXF1ZXN0JiByZXF1ZXN0LCBIaXRUZXN0UmVzdWx0JiByZXN1bHQsIGludCB4
LCBpbnQgeSwgaW50IHR4LCBpbnQgdHksIEhpdFRlc3RGaWx0ZXIgaGl0VGVzdEZpbHRlcikKQEAg
LTI1NzksMjYgKzI1MzMsOCBAQCB2b2lkIFJlbmRlck9iamVjdDo6dXBkYXRlSGl0VGVzdFJlc3Vs
dChICiAgICAgSW50UG9pbnQgbG9jYWxQb2ludChwb2ludCk7CiAgICAgaWYgKGlzUmVuZGVyVmll
dygpKQogICAgICAgICBub2RlID0gZG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50KCk7Ci0gICAg
ZWxzZSBpZiAoIWlzSW5saW5lKCkgJiYgY29udGludWF0aW9uKCkpCi0gICAgICAgIC8vIFdlIGFy
ZSBpbiB0aGUgbWFyZ2lucyBvZiBibG9jayBlbGVtZW50cyB0aGF0IGFyZSBwYXJ0IG9mIGEgY29u
dGludWF0aW9uLiAgSW4KLSAgICAgICAgLy8gdGhpcyBjYXNlIHdlJ3JlIGFjdHVhbGx5IHN0aWxs
IGluc2lkZSB0aGUgZW5jbG9zaW5nIGlubGluZSBlbGVtZW50IHRoYXQgd2FzCi0gICAgICAgIC8v
IHNwbGl0LiAgR28gYWhlYWQgYW5kIHNldCBvdXIgaW5uZXIgbm9kZSBhY2NvcmRpbmdseS4KLSAg
ICAgICAgbm9kZSA9IGNvbnRpbnVhdGlvbigpLT5lbGVtZW50KCk7CiAKICAgICBpZiAobm9kZSkg
ewotICAgICAgICBpZiAobm9kZS0+cmVuZGVyZXIoKSAmJiBub2RlLT5yZW5kZXJlcigpLT5jb250
aW51YXRpb24oKSAmJiBub2RlLT5yZW5kZXJlcigpICE9IHRoaXMpIHsKLSAgICAgICAgICAgIC8v
IFdlJ3JlIGluIHRoZSBjb250aW51YXRpb24gb2YgYSBzcGxpdCBpbmxpbmUuICBBZGp1c3Qgb3Vy
IGxvY2FsIHBvaW50IHRvIGJlIGluIHRoZSBjb29yZGluYXRlIHNwYWNlCi0gICAgICAgICAgICAv
LyBvZiB0aGUgcHJpbmNpcGFsIHJlbmRlcmVyJ3MgY29udGFpbmluZyBibG9jay4gIFRoaXMgd2ls
bCBlbmQgdXAgYmVpbmcgdGhlIGlubmVyTm9uU2hhcmVkTm9kZS4KLSAgICAgICAgICAgIFJlbmRl
ck9iamVjdCogZmlyc3RCbG9jayA9IG5vZGUtPnJlbmRlcmVyKCktPmNvbnRhaW5pbmdCbG9jaygp
OwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBHZXQgb3VyIGNvbnRhaW5pbmcgYmxvY2su
Ci0gICAgICAgICAgICBSZW5kZXJPYmplY3QqIGJsb2NrID0gdGhpczsKLSAgICAgICAgICAgIGlm
IChpc0lubGluZSgpKQotICAgICAgICAgICAgICAgIGJsb2NrID0gY29udGFpbmluZ0Jsb2NrKCk7
Ci0gICAgICAgIAotICAgICAgICAgICAgbG9jYWxQb2ludC5tb3ZlKGJsb2NrLT54UG9zKCkgLSBm
aXJzdEJsb2NrLT54UG9zKCksIGJsb2NrLT55UG9zKCkgLSBmaXJzdEJsb2NrLT55UG9zKCkpOwot
ICAgICAgICB9Ci0KICAgICAgICAgcmVzdWx0LnNldElubmVyTm9kZShub2RlKTsKICAgICAgICAg
aWYgKCFyZXN1bHQuaW5uZXJOb25TaGFyZWROb2RlKCkpCiAgICAgICAgICAgICByZXN1bHQuc2V0
SW5uZXJOb25TaGFyZWROb2RlKG5vZGUpOwpAQCAtMjg2OSw4ICsyODA1LDYgQEAgdm9pZCBSZW5k
ZXJPYmplY3Q6OmdldFRleHREZWNvcmF0aW9uQ29sbwogICAgICAgICAgICAgfQogICAgICAgICB9
CiAgICAgICAgIGN1cnIgPSBjdXJyLT5wYXJlbnQoKTsKLSAgICAgICAgaWYgKGN1cnIgJiYgY3Vy
ci0+aXNSZW5kZXJCbG9jaygpICYmIGN1cnItPmNvbnRpbnVhdGlvbigpKQotICAgICAgICAgICAg
Y3VyciA9IGN1cnItPmNvbnRpbnVhdGlvbigpOwogICAgIH0gd2hpbGUgKGN1cnIgJiYgZGVjb3Jh
dGlvbnMgJiYgKCFxdWlya3NNb2RlIHx8ICFjdXJyLT5lbGVtZW50KCkgfHwKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAoIWN1cnItPmVsZW1lbnQoKS0+aGFzVGFnTmFtZShh
VGFnKSAmJiAhY3Vyci0+ZWxlbWVudCgpLT5oYXNUYWdOYW1lKGZvbnRUYWcpKSkpOwogCkluZGV4
OiByZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gcmVuZGVyaW5nL1JlbmRl
ck9iamVjdC5oCShyZXZpc2lvbiAyMDk4NSkKKysrIHJlbmRlcmluZy9SZW5kZXJPYmplY3QuaAko
d29ya2luZyBjb3B5KQpAQCAtMjQ4LDcgKzI0OCw2IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIGJv
b2wgaXNJbmxpbmVGbG93KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KICAgICB2aXJ0dWFsIGJv
b2wgaXNCbG9ja0Zsb3coKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQogICAgIHZpcnR1YWwgYm9v
bCBpc0lubGluZUJsb2NrT3JJbmxpbmVUYWJsZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0g
ICAgdmlydHVhbCBib29sIGlzSW5saW5lQ29udGludWF0aW9uKCkgY29uc3Q7CiAgICAgdmlydHVh
bCBib29sIGlzTGlzdEl0ZW0oKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQogICAgIHZpcnR1YWwg
Ym9vbCBpc0xpc3RNYXJrZXIoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQogICAgIHZpcnR1YWwg
Ym9vbCBpc0NvdW50ZXIoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQpAQCAtMjc3LDggKzI3Niw2
IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIGJvb2wgY2hpbGRyZW5JbmxpbmUoKSBjb25zdCB7IHJl
dHVybiBmYWxzZTsgfQogICAgIHZpcnR1YWwgdm9pZCBzZXRDaGlsZHJlbklubGluZShib29sKSB7
IH0KIAotICAgIHZpcnR1YWwgUmVuZGVyRmxvdyogY29udGludWF0aW9uKCkgY29uc3Q7Ci0KICNp
ZiBFTkFCTEUoU1ZHKQogICAgIHZpcnR1YWwgYm9vbCBpc1NWR0NvbnRhaW5lcigpIGNvbnN0IHsg
cmV0dXJuIGZhbHNlOyB9CiAgICAgdmlydHVhbCBib29sIGlzUmVuZGVyUGF0aCgpIGNvbnN0IHsg
cmV0dXJuIGZhbHNlOyB9CkBAIC0yOTcsNyArMjk0LDcgQEAgcHVibGljOgogICAgIHZvaWQgc2V0
SXNBbm9ueW1vdXMoYm9vbCBiKSB7IG1faXNBbm9ueW1vdXMgPSBiOyB9CiAgICAgYm9vbCBpc0Fu
b255bW91c0Jsb2NrKCkgY29uc3QKICAgICB7Ci0gICAgICAgIHJldHVybiBtX2lzQW5vbnltb3Vz
ICYmIHN0eWxlKCktPmRpc3BsYXkoKSA9PSBCTE9DSyAmJiBzdHlsZSgpLT5zdHlsZVR5cGUoKSA9
PSBSZW5kZXJTdHlsZTo6Tk9QU0VVRE8gJiYgIWlzTGlzdE1hcmtlcigpOworICAgICAgICByZXR1
cm4gbV9pc0Fub255bW91cyAmJiAoc3R5bGUoKS0+ZGlzcGxheSgpID09IEJMT0NLIHx8IHN0eWxl
KCktPmRpc3BsYXkoKSA9PSBJTkxJTkVfQkxPQ0spICYmIHN0eWxlKCktPnN0eWxlVHlwZSgpID09
IFJlbmRlclN0eWxlOjpOT1BTRVVETyAmJiAhaXNMaXN0TWFya2VyKCk7CiAgICAgfQogCiAgICAg
Ym9vbCBpc0Zsb2F0aW5nKCkgY29uc3QgeyByZXR1cm4gbV9mbG9hdGluZzsgfQpJbmRleDogcmVu
ZGVyaW5nL2JpZGkuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHJlbmRlcmluZy9iaWRpLmNwcAkocmV2aXNp
b24gMjA5ODUpCisrKyByZW5kZXJpbmcvYmlkaS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTg4Nywx
MiArODg3LDE2IEBAIFJvb3RJbmxpbmVCb3gqIFJlbmRlckJsb2NrOjpjb25zdHJ1Y3RMaW4KICAg
ICAgICAgICAgIGlzT25seVJ1biA9ICgoc3R5bGUoKS0+ZGlyZWN0aW9uKCkgPT0gUlRMKSA/IHNM
YXN0QmlkaVJ1biA6IHNGaXJzdEJpZGlSdW4pLT5vYmotPmlzTGlzdE1hcmtlcigpOwogICAgICAg
ICByLT5ib3ggPSByLT5vYmotPmNyZWF0ZUlubGluZUJveChyLT5vYmotPmlzUG9zaXRpb25lZCgp
LCBmYWxzZSwgaXNPbmx5UnVuKTsKICAgICAgICAgaWYgKHItPmJveCkgeworICAgICAgICAgICAg
Ly8gQW5vbnltb3VzIGlubGluZSBibG9ja3MgKHVzZWQgdG8gaG9sZCBibG9ja3MgaW5zaWRlIGlu
bGluZXMpIGRvbid0IG5lZWQgdG8gd2FzdGUgdGltZSB3cmFwcGluZworICAgICAgICAgICAgLy8g
dGhlbXNlbHZlcyBpbiB0aG9zZSBpbmxpbmVzIChzaW5jZSB3ZSB3YW50IHRvIHByZXRlbmQgbGlr
ZSB0aGV5IGRvbid0IGV4aXN0IG9uIHRoaXMgZmFrZSBsaW5lKS4KKyAgICAgICAgICAgIFJlbmRl
ck9iamVjdCogYW5jZXN0b3JSZW5kZXJlciA9IHItPm9iai0+aXNBbm9ueW1vdXNCbG9jaygpID8g
dGhpcyA6IHItPm9iai0+cGFyZW50KCk7CisgICAgICAgICAgIAogICAgICAgICAgICAgLy8gSWYg
d2UgaGF2ZSBubyBwYXJlbnQgYm94IHlldCwgb3IgaWYgdGhlIHJ1biBpcyBub3Qgc2ltcGx5IGEg
c2libGluZywKICAgICAgICAgICAgIC8vIHRoZW4gd2UgbmVlZCB0byBjb25zdHJ1Y3QgaW5saW5l
IGJveGVzIGFzIG5lY2Vzc2FyeSB0byBwcm9wZXJseSBlbmNsb3NlIHRoZQogICAgICAgICAgICAg
Ly8gcnVuJ3MgaW5saW5lIGJveC4KLSAgICAgICAgICAgIGlmICghcGFyZW50Qm94IHx8IHBhcmVu
dEJveC0+b2JqZWN0KCkgIT0gci0+b2JqLT5wYXJlbnQoKSkKKyAgICAgICAgICAgIGlmICghcGFy
ZW50Qm94IHx8IHBhcmVudEJveC0+b2JqZWN0KCkgIT0gYW5jZXN0b3JSZW5kZXJlcikKICAgICAg
ICAgICAgICAgICAvLyBDcmVhdGUgbmV3IGlubGluZSBib3hlcyBhbGwgdGhlIHdheSBiYWNrIHRv
IHRoZSBhcHByb3ByaWF0ZSBpbnNlcnRpb24gcG9pbnQuCi0gICAgICAgICAgICAgICAgcGFyZW50
Qm94ID0gY3JlYXRlTGluZUJveGVzKHItPm9iai0+cGFyZW50KCkpOworICAgICAgICAgICAgICAg
IHBhcmVudEJveCA9IGNyZWF0ZUxpbmVCb3hlcyhhbmNlc3RvclJlbmRlcmVyKTsKIAogICAgICAg
ICAgICAgLy8gQXBwZW5kIHRoZSBpbmxpbmUgYm94IHRvIHRoaXMgbGluZS4KICAgICAgICAgICAg
IHBhcmVudEJveC0+YWRkVG9MaW5lKHItPmJveCk7CkBAIC05MzYsNiArOTQwLDcgQEAgdm9pZCBS
ZW5kZXJCbG9jazo6Y29tcHV0ZUhvcml6b250YWxQb3NpdAogICAgIGludCB0b3RXaWR0aCA9IGxp
bmVCb3gtPmdldEZsb3dTcGFjaW5nV2lkdGgoKTsKICAgICBCaWRpUnVuKiByID0gMDsKICAgICBi
b29sIG5lZWRzV29yZFNwYWNpbmcgPSBmYWxzZTsKKyAgICBpbnQgeCA9IGxlZnRPZmZzZXQobV9o
ZWlnaHQpOwogICAgIGZvciAociA9IHNGaXJzdEJpZGlSdW47IHI7IHIgPSByLT5uZXh0UnVuKSB7
CiAgICAgICAgIGlmICghci0+Ym94IHx8IHItPm9iai0+aXNQb3NpdGlvbmVkKCkgfHwgci0+Ym94
LT5pc0xpbmVCcmVhaygpKQogICAgICAgICAgICAgY29udGludWU7IC8vIFBvc2l0aW9uZWQgb2Jq
ZWN0cyBhcmUgb25seSBwYXJ0aWNpcGF0aW5nIHRvIGZpZ3VyZSBvdXQgdGhlaXIKQEAgLTk1Nyw2
ICs5NjIsMTEgQEAgdm9pZCBSZW5kZXJCbG9jazo6Y29tcHV0ZUhvcml6b250YWxQb3NpdAogICAg
ICAgICAgICAgci0+Ym94LT5zZXRXaWR0aChyLT5vYmotPndpZHRoKCkpOwogICAgICAgICAgICAg
aWYgKCFyLT5jb21wYWN0KQogICAgICAgICAgICAgICAgICB0b3RXaWR0aCArPSByLT5vYmotPm1h
cmdpbkxlZnQoKSArIHItPm9iai0+bWFyZ2luUmlnaHQoKTsKKyAgICAgICAgICAgIGlmIChyLT5v
YmotPmlzQW5vbnltb3VzQmxvY2soKSkgeworICAgICAgICAgICAgICAgIC8vIEFsbG93IHRoZSBm
dWxsIGF2YWlsYWJsZSB3aWR0aCB0byBiZSB1c2VkLCBzaW5jZSBmbG9hdHMgd2lsbCBpbnRydWRl
IGludG8gb3VyIHNwYWNlLgorICAgICAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoID0gcmlnaHRP
ZmZzZXQoKSAtIGxlZnRPZmZzZXQoKTsKKyAgICAgICAgICAgICAgICB4ID0gbGVmdE9mZnNldCgp
OworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLy8gQ29tcGFjdHMgZG9uJ3Qg
Y29udHJpYnV0ZSB0byB0aGUgd2lkdGggb2YgdGhlIGxpbmUsIHNpbmNlIHRoZXkgYXJlIHBsYWNl
ZCBpbiB0aGUgbWFyZ2luLgpAQCAtOTc1LDcgKzk4NSw2IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmNv
bXB1dGVIb3Jpem9udGFsUG9zaXQKICAgICAvLyB3ZSBub3cgZXhhbWluZSBvdXIgdGV4dC1hbGln
biBwcm9wZXJ0eSBpbiBvcmRlciB0byBkZXRlcm1pbmUgd2hlcmUgdG8gcG9zaXRpb24gdGhlCiAg
ICAgLy8gb2JqZWN0cyBob3Jpem9udGFsbHkuICBUaGUgdG90YWwgd2lkdGggb2YgdGhlIGxpbmUg
Y2FuIGJlIGluY3JlYXNlZCBpZiB3ZSBlbmQgdXAKICAgICAvLyBqdXN0aWZ5aW5nIHRleHQuCi0g
ICAgaW50IHggPSBsZWZ0T2Zmc2V0KG1faGVpZ2h0KTsKICAgICBzd2l0Y2goc3R5bGUoKS0+dGV4
dEFsaWduKCkpIHsKICAgICAgICAgY2FzZSBMRUZUOgogICAgICAgICBjYXNlIFdFQktJVF9MRUZU
OgpAQCAtMTU4Nyw3ICsxNTk2LDcgQEAgdm9pZCBSZW5kZXJCbG9jazo6bGF5b3V0SW5saW5lQ2hp
bGRyZW4oYgogICAgICAgICBib29sIGhhc0Zsb2F0ID0gZmFsc2U7CiAgICAgICAgIHdoaWxlIChv
KSB7CiAgICAgICAgICAgICBpZiAoby0+aXNSZXBsYWNlZCgpIHx8IG8tPmlzRmxvYXRpbmcoKSB8
fCBvLT5pc1Bvc2l0aW9uZWQoKSkgewotICAgICAgICAgICAgICAgIGlmIChyZWxheW91dENoaWxk
cmVuIHx8IG8tPnN0eWxlKCktPndpZHRoKCkuaXNQZXJjZW50KCkgfHwgby0+c3R5bGUoKS0+aGVp
Z2h0KCkuaXNQZXJjZW50KCkpCisgICAgICAgICAgICAgICAgaWYgKHJlbGF5b3V0Q2hpbGRyZW4g
fHwgby0+c3R5bGUoKS0+aGVpZ2h0KCkuaXNQZXJjZW50KCkpCiAgICAgICAgICAgICAgICAgICAg
IG8tPnNldENoaWxkTmVlZHNMYXlvdXQodHJ1ZSwgZmFsc2UpOwogICAgICAgICAgICAgICAgIGlm
IChvLT5pc1Bvc2l0aW9uZWQoKSkKICAgICAgICAgICAgICAgICAgICAgby0+Y29udGFpbmluZ0Js
b2NrKCktPmluc2VydFBvc2l0aW9uZWRPYmplY3Qobyk7CkBAIC0xNTk2LDcgKzE2MDUsOSBAQCB2
b2lkIFJlbmRlckJsb2NrOjpsYXlvdXRJbmxpbmVDaGlsZHJlbihiCiAgICAgICAgICAgICAgICAg
ICAgICAgICBoYXNGbG9hdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZ1
bGxMYXlvdXQgfHwgby0+bmVlZHNMYXlvdXQoKSkgLy8gUmVwbGFjZWQgZWxlbWVudHMKICAgICAg
ICAgICAgICAgICAgICAgICAgIG8tPmRpcnR5TGluZUJveGVzKGZ1bGxMYXlvdXQpOwotICAgICAg
ICAgICAgICAgICAgICBvLT5sYXlvdXRJZk5lZWRlZCgpOworICAgICAgICAgICAgICAgICAgICAK
KyAgICAgICAgICAgICAgICAgICAgaWYgKCFvLT5pc1JlcGxhY2VkKCkgfHwgIW8tPmlzQW5vbnlt
b3VzQmxvY2soKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG8tPmxheW91dElmTmVlZGVkKCk7
CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSBpZiAo
by0+aXNUZXh0KCkgfHwgKG8tPmlzSW5saW5lRmxvdygpICYmICFlbmRPZklubGluZSkpIHsKQEAg
LTIwNzAsMTIgKzIwODEsMTUgQEAgQmlkaUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpmaW5kTmV4dExp
bmVCcgogCiAgICAgYm9vbCBhdXRvV3JhcFdhc0V2ZXJUcnVlT25MaW5lID0gZmFsc2U7CiAgICAg
CisgICAgYm9vbCBpc0Jsb2NrSW5zaWRlSW5saW5lID0gZmFsc2U7CisKICAgICBFV2hpdGVTcGFj
ZSBjdXJyV1MgPSBzdHlsZSgpLT53aGl0ZVNwYWNlKCk7CiAgICAgRVdoaXRlU3BhY2UgbGFzdFdT
ID0gY3VycldTOwogICAgIHdoaWxlIChvKSB7CiAgICAgICAgIGN1cnJXUyA9IG8tPmlzUmVwbGFj
ZWQoKSA/IG8tPnBhcmVudCgpLT5zdHlsZSgpLT53aGl0ZVNwYWNlKCkgOiBvLT5zdHlsZSgpLT53
aGl0ZVNwYWNlKCk7CiAgICAgICAgIGxhc3RXUyA9IGxhc3QtPmlzUmVwbGFjZWQoKSA/IGxhc3Qt
PnBhcmVudCgpLT5zdHlsZSgpLT53aGl0ZVNwYWNlKCkgOiBsYXN0LT5zdHlsZSgpLT53aGl0ZVNw
YWNlKCk7Ci0gICAgICAgIAorICAgICAgICBpc0Jsb2NrSW5zaWRlSW5saW5lID0gby0+aXNBbm9u
eW1vdXNCbG9jaygpOworCiAgICAgICAgIGJvb2wgYXV0b1dyYXAgPSBSZW5kZXJTdHlsZTo6YXV0
b1dyYXAoY3VycldTKTsKICAgICAgICAgYXV0b1dyYXBXYXNFdmVyVHJ1ZU9uTGluZSA9IGF1dG9X
cmFwV2FzRXZlclRydWVPbkxpbmUgfHwgYXV0b1dyYXA7CiAKQEAgLTIxNjgsMTQgKzIxODIsMzQg
QEAgQmlkaUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpmaW5kTmV4dExpbmVCcgogICAgICAgICAgICAg
dG1wVyArPSBvLT5tYXJnaW5MZWZ0KCkgKyBvLT5ib3JkZXJMZWZ0KCkgKyBvLT5wYWRkaW5nTGVm
dCgpICsKICAgICAgICAgICAgICAgICAgICAgby0+bWFyZ2luUmlnaHQoKSArIG8tPmJvcmRlclJp
Z2h0KCkgKyBvLT5wYWRkaW5nUmlnaHQoKTsKICAgICAgICAgfSBlbHNlIGlmIChvLT5pc1JlcGxh
Y2VkKCkpIHsKLSAgICAgICAgICAgIC8vIEJyZWFrIG9uIHJlcGxhY2VkIGVsZW1lbnRzIGlmIGVp
dGhlciBoYXMgbm9ybWFsIHdoaXRlLXNwYWNlLgotICAgICAgICAgICAgaWYgKGF1dG9XcmFwIHx8
IFJlbmRlclN0eWxlOjphdXRvV3JhcChsYXN0V1MpKSB7CisgICAgICAgICAgICAvLyBCcmVhayBv
biByZXBsYWNlZCBlbGVtZW50cyBpZiBlaXRoZXIgaGFzIG5vcm1hbCB3aGl0ZS1zcGFjZS4gIFdl
IGFsc28gYWx3YXlzIGJyZWFrIGlmIHdlCisgICAgICAgICAgICAvLyBlbmNvdW50ZXIgYSBzcGVj
aWFsIGFub255bW91cyBpbmxpbmUgYmxvY2sgKHVzZWQgdG8gaG9sZCBibG9ja3MgaW5zaWRlIGlu
bGluZXMpLgorICAgICAgICAgICAgaWYgKGF1dG9XcmFwIHx8IFJlbmRlclN0eWxlOjphdXRvV3Jh
cChsYXN0V1MpIHx8IGlzQmxvY2tJbnNpZGVJbmxpbmUpIHsKICAgICAgICAgICAgICAgICB3ICs9
IHRtcFc7CiAgICAgICAgICAgICAgICAgdG1wVyA9IDA7CiAgICAgICAgICAgICAgICAgbEJyZWFr
Lm9iaiA9IG87CiAgICAgICAgICAgICAgICAgbEJyZWFrLnBvcyA9IDA7CiAgICAgICAgICAgICB9
CiAKKyAgICAgICAgICAgIGlmIChpc0Jsb2NrSW5zaWRlSW5saW5lKSB7CisgICAgICAgICAgICAg
ICAgaWYgKCFpc0xpbmVFbXB0eSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBlbmQ7CisKKyAg
ICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgd2lkdGggdG8gaWdub3JlIGZsb2F0cywgc2luY2Ug
d2UncmUgZ29pbmcgdG8gYWxsb3cgdGhlbSB0byBpbnRydWRlIGludG8gb3VyIHNwYWNlLgorICAg
ICAgICAgICAgICAgIHdpZHRoID0gcmlnaHRPZmZzZXQoKSAtIGxlZnRPZmZzZXQoKTsKKyAgICAg
ICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBMYXkgb3V0IG5vdyBhbmQgbWFrZSBzdXJl
IG91ciB5LXBvc2l0aW9uIGlzIGFjY3VyYXRlIHNvIHRoYXQgd2Uga25vdyBhYm91dCB0aGUgZmxv
YXRzIGludHJ1ZGluZworICAgICAgICAgICAgICAgIC8vIGludG8gb3VyIHNwYWNlLgorICAgICAg
ICAgICAgICAgIHZpZXcoKS0+YWRkTGF5b3V0RGVsdGEoSW50U2l6ZShvLT54UG9zKCkgLSBsZWZ0
T2Zmc2V0KCksIG8tPnlQb3MoKSAtIG1faGVpZ2h0KSk7CisgICAgICAgICAgICAgICAgby0+c2V0
UG9zKGxlZnRPZmZzZXQoKSwgbV9oZWlnaHQpOworICAgICAgICAgICAgICAgIG8tPmxheW91dElm
TmVlZGVkKCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gTm93IGFkZCBh
bnkgb3ZlcmhhbmdpbmcgZmxvYXRzIGZyb20gdGhpcyBhbm9ueW1vdXMgYmxvY2sgaW50byBvdXIg
bGlzdC4KKyAgICAgICAgICAgICAgICBhZGRPdmVyaGFuZ2luZ0Zsb2F0cyhzdGF0aWNfY2FzdDxS
ZW5kZXJCbG9jayo+KG8pLCAtby0+eFBvcygpLCAtby0+eVBvcygpKTsKKyAgICAgICAgICAgICAg
ICAKKyAgICAgICAgICAgICAgICBiZXR3ZWVuTWlkcG9pbnRzID0gZmFsc2U7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICAKICAgICAgICAgICAgIGlmIChpZ25vcmluZ1NwYWNlcykgewogICAg
ICAgICAgICAgICAgIEJpZGlJdGVyYXRvciBzdGFydE1pZCggMCwgbywgMCApOwogICAgICAgICAg
ICAgICAgIGFkZE1pZHBvaW50KHN0YXJ0TWlkKTsKQEAgLTIyMDcsNiArMjI0MSwxNSBAQCBCaWRp
SXRlcmF0b3IgUmVuZGVyQmxvY2s6OmZpbmROZXh0TGluZUJyCiAgICAgICAgICAgICAgICAgfQog
ICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgdG1wVyArPSBvLT53aWR0aCgpICsg
by0+bWFyZ2luTGVmdCgpICsgby0+bWFyZ2luUmlnaHQoKSArIGlubGluZVdpZHRoKG8pOworICAg
ICAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGlzQmxvY2tJbnNpZGVJbmxpbmUpIHsKKyAg
ICAgICAgICAgICAgICB3ICs9IHRtcFc7CisgICAgICAgICAgICAgICAgdG1wVyA9IDA7CisgICAg
ICAgICAgICAgICAgbEJyZWFrLm9iaiA9IG87CisgICAgICAgICAgICAgICAgbEJyZWFrLnBvcyA9
IDA7CisgICAgICAgICAgICAgICAgbEJyZWFrLmluY3JlbWVudChiaWRpKTsKKyAgICAgICAgICAg
ICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChvLT5pc1Rl
eHQoKSkgewogICAgICAgICAgICAgUmVuZGVyVGV4dCogdCA9IHN0YXRpY19jYXN0PFJlbmRlclRl
eHQqPihvKTsKICAgICAgICAgICAgIGludCBzdHJsZW4gPSB0LT50ZXh0TGVuZ3RoKCk7Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>35178</attachid>
            <date>2009-08-19 19:18:17 -0700</date>
            <delta_ts>2009-08-22 12:33:26 -0700</delta_ts>
            <desc>Patch that has been updated to ToT</desc>
            <filename>patch.txt</filename>
            <type>text/plain</type>
            <size>55645</size>
            <attacher name="Dave Hyatt">hyatt</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0LmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eVJlbmRl
ck9iamVjdC5jcHAJKHJldmlzaW9uIDQ3NDM5KQorKysgV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0Fj
Y2Vzc2liaWxpdHlSZW5kZXJPYmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01MjMsMTIgKzUy
Myw4IEBAIEVsZW1lbnQqIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmFuY2gKICAgICBSZW5k
ZXJPYmplY3QqIGN1cnJSZW5kZXJlcjsKICAgICAKICAgICAvLyBTZWFyY2ggdXAgdGhlIHJlbmRl
ciB0cmVlIGZvciBhIFJlbmRlck9iamVjdCB3aXRoIGEgRE9NIG5vZGUuICBEZWZlciB0byBhbiBl
YXJsaWVyIGNvbnRpbnVhdGlvbiwgdGhvdWdoLgotICAgIGZvciAoY3VyclJlbmRlcmVyID0gbV9y
ZW5kZXJlcjsgY3VyclJlbmRlcmVyICYmICFjdXJyUmVuZGVyZXItPm5vZGUoKTsgY3VyclJlbmRl
cmVyID0gY3VyclJlbmRlcmVyLT5wYXJlbnQoKSkgewotICAgICAgICBpZiAoY3VyclJlbmRlcmVy
LT5pc1JlbmRlckJsb2NrKCkpIHsKLSAgICAgICAgICAgIFJlbmRlcklubGluZSogY29udGludWF0
aW9uID0gdG9SZW5kZXJCbG9jayhjdXJyUmVuZGVyZXIpLT5pbmxpbmVDb250aW51YXRpb24oKTsK
LSAgICAgICAgICAgIGlmIChjb250aW51YXRpb24pCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNh
Y2hlLT5nZXRPckNyZWF0ZShjb250aW51YXRpb24pLT5hbmNob3JFbGVtZW50KCk7Ci0gICAgICAg
IH0KKyAgICBmb3IgKGN1cnJSZW5kZXJlciA9IG1fcmVuZGVyZXI7IGN1cnJSZW5kZXJlciAmJiAh
Y3VyclJlbmRlcmVyLT5ub2RlKCk7IGN1cnJSZW5kZXJlciA9IGN1cnJSZW5kZXJlci0+cGFyZW50
KCkpCisgICAgewogICAgIH0KICAgICAKICAgICAvLyBiYWlsIGlmIG5vbmUgZm91bmQKSW5kZXg6
IFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUZsb3dCb3guY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvcmVuZGVyaW5nL0lubGluZUZsb3dCb3guY3BwCShyZXZpc2lvbiA0NzUxNykKKysrIFdlYkNv
cmUvcmVuZGVyaW5nL0lubGluZUZsb3dCb3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMjcsMTQg
KzIyNywxMyBAQCB2b2lkIElubGluZUZsb3dCb3g6OmRldGVybWluZVNwYWNpbmdGb3JGCiAgICAg
ICAgIC8vICgzKSBUaGUgbGluZSBtYXkgZW5kIG9uIHRoZSBpbmxpbmUuICBJZiB3ZSBhcmUgdGhl
IGxhc3QgY2hpbGQgKGNsaW1iaW5nIHVwCiAgICAgICAgIC8vIHRoZSBlbmQgb2JqZWN0J3MgY2hh
aW4pLCB0aGVuIHdlIGp1c3QgY2xvc2VkIGFzIHdlbGwuCiAgICAgICAgIGlmICghbGluZUJveExp
c3QtPmxhc3RMaW5lQm94KCktPmlzQ29uc3RydWN0ZWQoKSkgewotICAgICAgICAgICAgUmVuZGVy
SW5saW5lKiBpbmxpbmVGbG93ID0gdG9SZW5kZXJJbmxpbmUocmVuZGVyZXIoKSk7CiAgICAgICAg
ICAgICBpZiAobHRyKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFuZXh0TGluZUJveCgpICYmCi0g
ICAgICAgICAgICAgICAgICAgICgobGFzdExpbmUgJiYgIWlubGluZUZsb3ctPmNvbnRpbnVhdGlv
bigpKSB8fCBuZXh0T25MaW5lRXhpc3RzKCkgfHwgb25FbmRDaGFpbihlbmRPYmplY3QpKSkKKyAg
ICAgICAgICAgICAgICAgICAgKGxhc3RMaW5lIHx8IG5leHRPbkxpbmVFeGlzdHMoKSB8fCBvbkVu
ZENoYWluKGVuZE9iamVjdCkpKQogICAgICAgICAgICAgICAgICAgICBpbmNsdWRlUmlnaHRFZGdl
ID0gdHJ1ZTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKCghcHJl
dkxpbmVCb3goKSB8fCBwcmV2TGluZUJveCgpLT5pc0NvbnN0cnVjdGVkKCkpICYmCi0gICAgICAg
ICAgICAgICAgICAgICgobGFzdExpbmUgJiYgIWlubGluZUZsb3ctPmNvbnRpbnVhdGlvbigpKSB8
fCBwcmV2T25MaW5lRXhpc3RzKCkgfHwgb25FbmRDaGFpbihlbmRPYmplY3QpKSkKKyAgICAgICAg
ICAgICAgICAgICAgKGxhc3RMaW5lIHx8IHByZXZPbkxpbmVFeGlzdHMoKSB8fCBvbkVuZENoYWlu
KGVuZE9iamVjdCkpKQogICAgICAgICAgICAgICAgICAgICBpbmNsdWRlTGVmdEVkZ2UgPSB0cnVl
OwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC02MzgsMTMgKzYzNyw3IEBAIHZvaWQgSW5s
aW5lRmxvd0JveDo6cGFpbnQoUmVuZGVyT2JqZWN0OjoKICAgICAgICAgICAgIC8vIG91dGxpbmVz
LgogICAgICAgICAgICAgaWYgKHJlbmRlcmVyKCktPnN0eWxlKCktPnZpc2liaWxpdHkoKSA9PSBW
SVNJQkxFICYmIHJlbmRlcmVyKCktPmhhc091dGxpbmUoKSAmJiAhaXNSb290SW5saW5lQm94KCkp
IHsKICAgICAgICAgICAgICAgICBSZW5kZXJJbmxpbmUqIGlubGluZUZsb3cgPSB0b1JlbmRlcklu
bGluZShyZW5kZXJlcigpKTsKLSAgICAgICAgICAgICAgICBpZiAoKGlubGluZUZsb3ctPmNvbnRp
bnVhdGlvbigpIHx8IGlubGluZUZsb3ctPmlzSW5saW5lQ29udGludWF0aW9uKCkpICYmICFib3hN
b2RlbE9iamVjdCgpLT5oYXNTZWxmUGFpbnRpbmdMYXllcigpKSB7Ci0gICAgICAgICAgICAgICAg
ICAgIC8vIEFkZCBvdXJzZWx2ZXMgdG8gdGhlIGNvbnRhaW5pbmcgYmxvY2sgb2YgdGhlIGVudGly
ZSBjb250aW51YXRpb24gc28gdGhhdCBpdCBjYW4KLSAgICAgICAgICAgICAgICAgICAgLy8gcGFp
bnQgdXMgYXRvbWljYWxseS4KLSAgICAgICAgICAgICAgICAgICAgUmVuZGVyQmxvY2sqIGJsb2Nr
ID0gcmVuZGVyZXIoKS0+Y29udGFpbmluZ0Jsb2NrKCktPmNvbnRhaW5pbmdCbG9jaygpOwotICAg
ICAgICAgICAgICAgICAgICBibG9jay0+YWRkQ29udGludWF0aW9uV2l0aE91dGxpbmUodG9SZW5k
ZXJJbmxpbmUocmVuZGVyZXIoKS0+bm9kZSgpLT5yZW5kZXJlcigpKSk7Ci0gICAgICAgICAgICAg
ICAgfSBlbHNlIGlmICghaW5saW5lRmxvdy0+aXNJbmxpbmVDb250aW51YXRpb24oKSkKLSAgICAg
ICAgICAgICAgICAgICAgcGFpbnRJbmZvLm91dGxpbmVPYmplY3RzLT5hZGQoaW5saW5lRmxvdyk7
CisgICAgICAgICAgICAgICAgcGFpbnRJbmZvLm91dGxpbmVPYmplY3RzLT5hZGQoaW5saW5lRmxv
dyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAocGFpbnRJbmZvLnBoYXNlID09
IFBhaW50UGhhc2VNYXNrKSB7CiAgICAgICAgICAgICBwYWludE1hc2socGFpbnRJbmZvLCB0eCwg
dHkpOwpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmNwcAkocmV2aXNpb24gNDc1MTcpCisr
KyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTgy
LDggKzgyLDYgQEAgc3RhdGljIFBlcmNlbnRIZWlnaHREZXNjZW5kYW50c01hcCogZ1BlcgogCiB0
eXBlZGVmIFdURjo6SGFzaE1hcDxjb25zdCBSZW5kZXJCb3gqLCBIYXNoU2V0PFJlbmRlckJsb2Nr
Kj4qPiBQZXJjZW50SGVpZ2h0Q29udGFpbmVyTWFwOwogc3RhdGljIFBlcmNlbnRIZWlnaHRDb250
YWluZXJNYXAqIGdQZXJjZW50SGVpZ2h0Q29udGFpbmVyTWFwID0gMDsKLSAgICAKLXR5cGVkZWYg
V1RGOjpIYXNoTWFwPFJlbmRlckJsb2NrKiwgTGlzdEhhc2hTZXQ8UmVuZGVySW5saW5lKj4qPiBD
b250aW51YXRpb25PdXRsaW5lVGFibGVNYXA7CiAKIHR5cGVkZWYgV1RGOjpIYXNoU2V0PFJlbmRl
ckJsb2NrKj4gRGVsYXllZFVwZGF0ZVNjcm9sbEluZm9TZXQ7CiBzdGF0aWMgaW50IGdEZWxheVVw
ZGF0ZVNjcm9sbEluZm8gPSAwOwpAQCAtMTI3LDcgKzEyNSw2IEBAIFJlbmRlckJsb2NrOjpSZW5k
ZXJCbG9jayhOb2RlKiBub2RlKQogICAgICAgOiBSZW5kZXJCb3gobm9kZSkKICAgICAgICwgbV9m
bG9hdGluZ09iamVjdHMoMCkKICAgICAgICwgbV9wb3NpdGlvbmVkT2JqZWN0cygwKQotICAgICAg
LCBtX2lubGluZUNvbnRpbnVhdGlvbigwKQogICAgICAgLCBtX21heE1hcmdpbigwKQogICAgICAg
LCBtX2xpbmVIZWlnaHQoLTEpCiB7CkBAIC0xNjUsMTEgKzE2Miw2IEBAIFJlbmRlckJsb2NrOjp+
UmVuZGVyQmxvY2soKQogCiB2b2lkIFJlbmRlckJsb2NrOjpkZXN0cm95KCkKIHsKLSAgICAvLyBE
ZXRhY2ggb3VyIGNvbnRpbnVhdGlvbiBmaXJzdC4KLSAgICBpZiAobV9pbmxpbmVDb250aW51YXRp
b24pCi0gICAgICAgIG1faW5saW5lQ29udGludWF0aW9uLT5kZXN0cm95KCk7Ci0gICAgbV9pbmxp
bmVDb250aW51YXRpb24gPSAwOwotICAgIAogICAgIC8vIE1ha2Ugc3VyZSB0byBkZXN0cm95IGFu
b255bW91cyBjaGlsZHJlbiBmaXJzdCB3aGlsZSB0aGV5IGFyZSBzdGlsbCBjb25uZWN0ZWQgdG8g
dGhlIHJlc3Qgb2YgdGhlIHRyZWUsIHNvIHRoYXQgdGhleSB3aWxsCiAgICAgLy8gcHJvcGVybHkg
ZGlydHkgbGluZSBib3hlcyB0aGF0IHRoZXkgYXJlIHJlbW92ZWQgZnJvbS4gIEVmZmVjdHMgdGhh
dCBkbyA6YmVmb3JlLzphZnRlciBvbmx5IG9uIGhvdmVyIGNvdWxkIGNyYXNoIG90aGVyd2lzZS4K
ICAgICBjaGlsZHJlbigpLT5kZXN0cm95TGVmdG92ZXJDaGlsZHJlbigpOwpAQCAtNDU2LDkgKzQ0
OCw2IEBAIHZvaWQgUmVuZGVyQmxvY2s6OnJlbW92ZUxlZnRvdmVyQW5vbnltb3UKICAgICBBU1NF
UlQoY2hpbGQtPmlzQW5vbnltb3VzQmxvY2soKSk7CiAgICAgQVNTRVJUKCFjaGlsZC0+Y2hpbGRy
ZW5JbmxpbmUoKSk7CiAgICAgCi0gICAgaWYgKGNoaWxkLT5pbmxpbmVDb250aW51YXRpb24oKSkg
Ci0gICAgICAgIHJldHVybjsKLSAgICAKICAgICBSZW5kZXJPYmplY3QqIGZpcnN0QW5DaGlsZCA9
IGNoaWxkLT5tX2NoaWxkcmVuLmZpcnN0Q2hpbGQoKTsKICAgICBSZW5kZXJPYmplY3QqIGxhc3RB
bkNoaWxkID0gY2hpbGQtPm1fY2hpbGRyZW4ubGFzdENoaWxkKCk7CiAgICAgaWYgKGZpcnN0QW5D
aGlsZCkgewpAQCAtNTAxLDcgKzQ5MCw3IEBAIHZvaWQgUmVuZGVyQmxvY2s6OnJlbW92ZUNoaWxk
KFJlbmRlck9iamUKICAgICBSZW5kZXJPYmplY3QqIHByZXYgPSBvbGRDaGlsZC0+cHJldmlvdXNT
aWJsaW5nKCk7CiAgICAgUmVuZGVyT2JqZWN0KiBuZXh0ID0gb2xkQ2hpbGQtPm5leHRTaWJsaW5n
KCk7CiAgICAgYm9vbCBjYW5EZWxldGVBbm9ueW1vdXNCbG9ja3MgPSAhZG9jdW1lbnRCZWluZ0Rl
c3Ryb3llZCgpICYmICFpc0lubGluZSgpICYmICFvbGRDaGlsZC0+aXNJbmxpbmUoKSAmJiAKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghb2xkQ2hpbGQtPmlzUmVuZGVyQmxv
Y2soKSB8fCAhdG9SZW5kZXJCbG9jayhvbGRDaGlsZCktPmlubGluZUNvbnRpbnVhdGlvbigpKSAm
JiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFvbGRDaGlsZC0+aXNSZW5k
ZXJCbG9jaygpICYmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFwcmV2
IHx8IChwcmV2LT5pc0Fub255bW91c0Jsb2NrKCkgJiYgcHJldi0+Y2hpbGRyZW5JbmxpbmUoKSkp
ICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIW5leHQgfHwgKG5leHQt
PmlzQW5vbnltb3VzQmxvY2soKSAmJiBuZXh0LT5jaGlsZHJlbklubGluZSgpKSk7CiAgICAgaWYg
KGNhbkRlbGV0ZUFub255bW91c0Jsb2NrcyAmJiBwcmV2ICYmIG5leHQpIHsKQEAgLTgyOSw3ICs4
MTgsOCBAQCB2b2lkIFJlbmRlckJsb2NrOjphZGRPdmVyZmxvd0Zyb21GbG9hdHMoCiAKIGJvb2wg
UmVuZGVyQmxvY2s6OmV4cGFuZHNUb0VuY2xvc2VPdmVyaGFuZ2luZ0Zsb2F0cygpIGNvbnN0CiB7
Ci0gICAgcmV0dXJuIGlzSW5saW5lQmxvY2tPcklubGluZVRhYmxlKCkgfHwgaXNGbG9hdGluZ09y
UG9zaXRpb25lZCgpIHx8IGhhc092ZXJmbG93Q2xpcCgpIHx8IChwYXJlbnQoKSAmJiBwYXJlbnQo
KS0+aXNGbGV4aWJsZUJveCgpKSB8fCBoYXNDb2x1bW5zKCkgfHwgaXNUYWJsZUNlbGwoKSB8fCBp
c0ZpZWxkc2V0KCk7CisgICAgcmV0dXJuIGlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSB8fCBoYXNP
dmVyZmxvd0NsaXAoKSB8fCAocGFyZW50KCkgJiYgcGFyZW50KCktPmlzRmxleGlibGVCb3goKSkg
fHwgaGFzQ29sdW1ucygpIHx8IGlzVGFibGVDZWxsKCkgfHwgaXNGaWVsZHNldCgpIHx8CisgICAg
ICAgICAgIChpc0lubGluZUJsb2NrT3JJbmxpbmVUYWJsZSgpICYmICFpc0Fub255bW91c0lubGlu
ZUJsb2NrKCkpOwogfQogCiB2b2lkIFJlbmRlckJsb2NrOjphZGp1c3RQb3NpdGlvbmVkQmxvY2so
UmVuZGVyQm94KiBjaGlsZCwgY29uc3QgTWFyZ2luSW5mbyYgbWFyZ2luSW5mbykKQEAgLTE3MTUs
MjAgKzE3MDUsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjpwYWludE9iamVjdChQYWludEluZm8mCiAg
ICAgaWYgKChwYWludFBoYXNlID09IFBhaW50UGhhc2VPdXRsaW5lIHx8IHBhaW50UGhhc2UgPT0g
UGFpbnRQaGFzZVNlbGZPdXRsaW5lKSAmJiBoYXNPdXRsaW5lKCkgJiYgc3R5bGUoKS0+dmlzaWJp
bGl0eSgpID09IFZJU0lCTEUpCiAgICAgICAgIHBhaW50T3V0bGluZShwYWludEluZm8uY29udGV4
dCwgdHgsIHR5LCB3aWR0aCgpLCBoZWlnaHQoKSwgc3R5bGUoKSk7CiAKLSAgICAvLyA2LiBwYWlu
dCBjb250aW51YXRpb24gb3V0bGluZXMuCi0gICAgaWYgKChwYWludFBoYXNlID09IFBhaW50UGhh
c2VPdXRsaW5lIHx8IHBhaW50UGhhc2UgPT0gUGFpbnRQaGFzZUNoaWxkT3V0bGluZXMpKSB7Ci0g
ICAgICAgIGlmIChpbmxpbmVDb250aW51YXRpb24oKSAmJiBpbmxpbmVDb250aW51YXRpb24oKS0+
aGFzT3V0bGluZSgpICYmIGlubGluZUNvbnRpbnVhdGlvbigpLT5zdHlsZSgpLT52aXNpYmlsaXR5
KCkgPT0gVklTSUJMRSkgewotICAgICAgICAgICAgUmVuZGVySW5saW5lKiBpbmxpbmVSZW5kZXJl
ciA9IHRvUmVuZGVySW5saW5lKGlubGluZUNvbnRpbnVhdGlvbigpLT5ub2RlKCktPnJlbmRlcmVy
KCkpOwotICAgICAgICAgICAgaWYgKCFpbmxpbmVSZW5kZXJlci0+aGFzU2VsZlBhaW50aW5nTGF5
ZXIoKSkKLSAgICAgICAgICAgICAgICBjb250YWluaW5nQmxvY2soKS0+YWRkQ29udGludWF0aW9u
V2l0aE91dGxpbmUoaW5saW5lUmVuZGVyZXIpOwotICAgICAgICAgICAgZWxzZSBpZiAoIWlubGlu
ZVJlbmRlcmVyLT5maXJzdExpbmVCb3goKSkKLSAgICAgICAgICAgICAgICBpbmxpbmVSZW5kZXJl
ci0+cGFpbnRPdXRsaW5lKHBhaW50SW5mby5jb250ZXh0LCB0eCAtIHgoKSArIGlubGluZVJlbmRl
cmVyLT5jb250YWluaW5nQmxvY2soKS0+eCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgdHkgLSB5KCkgKyBpbmxpbmVSZW5kZXJlci0+Y29udGFpbmluZ0Js
b2NrKCktPnkoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcGFpbnRDb250aW51YXRpb25PdXRsaW5l
cyhwYWludEluZm8sIHR4LCB0eSk7Ci0gICAgfQotCi0gICAgLy8gNy4gcGFpbnQgY2FyZXQuCisg
ICAgLy8gNi4gcGFpbnQgY2FyZXQuCiAgICAgLy8gSWYgdGhlIGNhcmV0J3Mgbm9kZSdzIHJlbmRl
ciBvYmplY3QncyBjb250YWluaW5nIGJsb2NrIGlzIHRoaXMgYmxvY2ssIGFuZCB0aGUgcGFpbnQg
YWN0aW9uIGlzIFBhaW50UGhhc2VGb3JlZ3JvdW5kLAogICAgIC8vIHRoZW4gcGFpbnQgdGhlIGNh
cmV0LgogICAgIGlmIChwYWludFBoYXNlID09IFBhaW50UGhhc2VGb3JlZ3JvdW5kKSB7ICAgICAg
ICAKQEAgLTE3OTEsNTcgKzE3NjgsNiBAQCB2b2lkIFJlbmRlckJsb2NrOjpwYWludEVsbGlwc2lz
Qm94ZXMoUGFpCiAgICAgfQogfQogCi1zdGF0aWMgQ29udGludWF0aW9uT3V0bGluZVRhYmxlTWFw
KiBjb250aW51YXRpb25PdXRsaW5lVGFibGUoKQotewotICAgIERFRklORV9TVEFUSUNfTE9DQUwo
Q29udGludWF0aW9uT3V0bGluZVRhYmxlTWFwLCB0YWJsZSwgKCkpOwotICAgIHJldHVybiAmdGFi
bGU7Ci19Ci0KLXZvaWQgUmVuZGVyQmxvY2s6OmFkZENvbnRpbnVhdGlvbldpdGhPdXRsaW5lKFJl
bmRlcklubGluZSogZmxvdykKLXsKLSAgICAvLyBXZSBjYW4ndCBtYWtlIHRoaXMgd29yayBpZiB0
aGUgaW5saW5lIGlzIGluIGEgbGF5ZXIuICBXZSdsbCBqdXN0IHJlbHkgb24gdGhlIGJyb2tlbgot
ICAgIC8vIHdheSBvZiBwYWludGluZy4KLSAgICBBU1NFUlQoIWZsb3ctPmxheWVyKCkgJiYgIWZs
b3ctPmlzSW5saW5lQ29udGludWF0aW9uKCkpOwotICAgIAotICAgIENvbnRpbnVhdGlvbk91dGxp
bmVUYWJsZU1hcCogdGFibGUgPSBjb250aW51YXRpb25PdXRsaW5lVGFibGUoKTsKLSAgICBMaXN0
SGFzaFNldDxSZW5kZXJJbmxpbmUqPiogY29udGludWF0aW9ucyA9IHRhYmxlLT5nZXQodGhpcyk7
Ci0gICAgaWYgKCFjb250aW51YXRpb25zKSB7Ci0gICAgICAgIGNvbnRpbnVhdGlvbnMgPSBuZXcg
TGlzdEhhc2hTZXQ8UmVuZGVySW5saW5lKj47Ci0gICAgICAgIHRhYmxlLT5zZXQodGhpcywgY29u
dGludWF0aW9ucyk7Ci0gICAgfQotICAgIAotICAgIGNvbnRpbnVhdGlvbnMtPmFkZChmbG93KTsK
LX0KLQotdm9pZCBSZW5kZXJCbG9jazo6cGFpbnRDb250aW51YXRpb25PdXRsaW5lcyhQYWludElu
Zm8mIGluZm8sIGludCB0eCwgaW50IHR5KQotewotICAgIENvbnRpbnVhdGlvbk91dGxpbmVUYWJs
ZU1hcCogdGFibGUgPSBjb250aW51YXRpb25PdXRsaW5lVGFibGUoKTsKLSAgICBpZiAodGFibGUt
PmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAgICBMaXN0SGFzaFNldDxS
ZW5kZXJJbmxpbmUqPiogY29udGludWF0aW9ucyA9IHRhYmxlLT5nZXQodGhpcyk7Ci0gICAgaWYg
KCFjb250aW51YXRpb25zKQotICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgIC8vIFBhaW50
IGVhY2ggY29udGludWF0aW9uIG91dGxpbmUuCi0gICAgTGlzdEhhc2hTZXQ8UmVuZGVySW5saW5l
Kj46Oml0ZXJhdG9yIGVuZCA9IGNvbnRpbnVhdGlvbnMtPmVuZCgpOwotICAgIGZvciAoTGlzdEhh
c2hTZXQ8UmVuZGVySW5saW5lKj46Oml0ZXJhdG9yIGl0ID0gY29udGludWF0aW9ucy0+YmVnaW4o
KTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgIC8vIE5lZWQgdG8gYWRkIGluIHRoZSBjb29y
ZGluYXRlcyBvZiB0aGUgaW50ZXJ2ZW5pbmcgYmxvY2tzLgotICAgICAgICBSZW5kZXJJbmxpbmUq
IGZsb3cgPSAqaXQ7Ci0gICAgICAgIFJlbmRlckJsb2NrKiBibG9jayA9IGZsb3ctPmNvbnRhaW5p
bmdCbG9jaygpOwotICAgICAgICBmb3IgKCA7IGJsb2NrICYmIGJsb2NrICE9IHRoaXM7IGJsb2Nr
ID0gYmxvY2stPmNvbnRhaW5pbmdCbG9jaygpKSB7Ci0gICAgICAgICAgICB0eCArPSBibG9jay0+
eCgpOwotICAgICAgICAgICAgdHkgKz0gYmxvY2stPnkoKTsKLSAgICAgICAgfQotICAgICAgICBB
U1NFUlQoYmxvY2spOyAgIAotICAgICAgICBmbG93LT5wYWludE91dGxpbmUoaW5mby5jb250ZXh0
LCB0eCwgdHkpOwotICAgIH0KLSAgICAKLSAgICAvLyBEZWxldGUKLSAgICBkZWxldGUgY29udGlu
dWF0aW9uczsKLSAgICB0YWJsZS0+cmVtb3ZlKHRoaXMpOwotfQotCiB2b2lkIFJlbmRlckJsb2Nr
OjpzZXRTZWxlY3Rpb25TdGF0ZShTZWxlY3Rpb25TdGF0ZSBzKQogewogICAgIGlmIChzZWxlY3Rp
b25TdGF0ZSgpID09IHMpCkBAIC0yOTI3LDIwICsyODUzLDI3IEBAIHZvaWQgUmVuZGVyQmxvY2s6
OmNsZWFyRmxvYXRzKCkKICAgICAvLyBvdXQgb2YgZmxvdyAobGlrZSBmbG9hdGluZy9wb3NpdGlv
bmVkIGVsZW1lbnRzKSwgYW5kIHdlIGFsc28gc2tpcCBvdmVyIGFueSBvYmplY3RzIHRoYXQgbWF5
IGhhdmUgc2hpZnRlZAogICAgIC8vIHRvIGF2b2lkIGZsb2F0cy4KICAgICBib29sIHBhcmVudEhh
c0Zsb2F0cyA9IGZhbHNlOwotICAgIFJlbmRlck9iamVjdCogcHJldiA9IHByZXZpb3VzU2libGlu
ZygpOwotICAgIHdoaWxlIChwcmV2ICYmIChwcmV2LT5pc0Zsb2F0aW5nT3JQb3NpdGlvbmVkKCkg
fHwgIXByZXYtPmlzQm94KCkgfHwgIXByZXYtPmlzUmVuZGVyQmxvY2soKSB8fCB0b1JlbmRlckJs
b2NrKHByZXYpLT5hdm9pZHNGbG9hdHMoKSkpIHsKLSAgICAgICAgaWYgKHByZXYtPmlzRmxvYXRp
bmcoKSkKLSAgICAgICAgICAgIHBhcmVudEhhc0Zsb2F0cyA9IHRydWU7Ci0gICAgICAgICBwcmV2
ID0gcHJldi0+cHJldmlvdXNTaWJsaW5nKCk7CisgICAgUmVuZGVyT2JqZWN0KiBwcmV2ID0gMDsK
KyAgICBSZW5kZXJCbG9jayogcGFyZW50QmxvY2sgPSAwOworICAgIGlmIChpc0Fub255bW91c0lu
bGluZUJsb2NrKCkpIHsKKyAgICAgICAgcGFyZW50QmxvY2sgPSBjb250YWluaW5nQmxvY2soKTsK
KyAgICAgICAgcGFyZW50SGFzRmxvYXRzID0gcGFyZW50QmxvY2stPmNvbnRhaW5zRmxvYXRzKCk7
CisgICAgfSBlbHNlIHsgICAgCisgICAgICAgIHdoaWxlIChwcmV2ICYmIChwcmV2LT5pc0Zsb2F0
aW5nT3JQb3NpdGlvbmVkKCkgfHwgIXByZXYtPmlzQm94KCkgfHwgIXByZXYtPmlzUmVuZGVyQmxv
Y2soKSB8fCB0b1JlbmRlckJsb2NrKHByZXYpLT5hdm9pZHNGbG9hdHMoKSkpIHsKKyAgICAgICAg
ICAgIGlmIChwcmV2LT5pc0Zsb2F0aW5nKCkpCisgICAgICAgICAgICAgICAgcGFyZW50SGFzRmxv
YXRzID0gdHJ1ZTsKKyAgICAgICAgICAgICBwcmV2ID0gcHJldi0+cHJldmlvdXNTaWJsaW5nKCk7
CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChwYXJlbnRIYXNGbG9hdHMpCisgICAg
ICAgICAgICBwYXJlbnRCbG9jayA9IHRvUmVuZGVyQmxvY2socGFyZW50KCkpOwogICAgIH0KIAog
ICAgIC8vIEZpcnN0IGFkZCBpbiBmbG9hdHMgZnJvbSB0aGUgcGFyZW50LgogICAgIGludCBvZmZz
ZXQgPSB5KCk7Ci0gICAgaWYgKHBhcmVudEhhc0Zsb2F0cykgewotICAgICAgICBSZW5kZXJCbG9j
ayogcGFyZW50QmxvY2sgPSB0b1JlbmRlckJsb2NrKHBhcmVudCgpKTsKKyAgICBpZiAocGFyZW50
SGFzRmxvYXRzKQogICAgICAgICBhZGRJbnRydWRpbmdGbG9hdHMocGFyZW50QmxvY2ssIHBhcmVu
dEJsb2NrLT5ib3JkZXJMZWZ0KCkgKyBwYXJlbnRCbG9jay0+cGFkZGluZ0xlZnQoKSwgb2Zmc2V0
KTsKLSAgICB9Ci0gICAgCisKICAgICBpbnQgeG9mZnNldCA9IDA7CiAgICAgaWYgKHByZXYpCiAg
ICAgICAgIG9mZnNldCAtPSB0b1JlbmRlckJveChwcmV2KS0+eSgpOwpAQCAtNDAxOCw2ICszOTUx
LDE0IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmNhbGNJbmxpbmVQcmVmV2lkdGhzKCkKICAgICAgICAg
ICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIGNoaWxkLT5zZXRQcmVmV2lkdGhzRGly
dHkoZmFsc2UpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAg
IC8vIElmIHdlIGFyZSBhbiBhbm9ueW1vdXMgaW5saW5lIGJsb2NrIHRoZW4gYm90aCBtaW4gYW5k
IG1heCB3aWR0aCBhcmUgcmVzZXQuCisgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC0+aXNB
bm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX21pblBy
ZWZXaWR0aCA9IG1heChpbmxpbmVNaW4sIG1fbWluUHJlZldpZHRoKTsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIG1fbWF4UHJlZldpZHRoID0gbWF4KGlubGluZU1heCwgbV9tYXhQcmVmV2lkdGgp
OworICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lTWluID0gMDsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGlubGluZU1heCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAg
ICAgICAgICAgICAgICAvLyBJbmxpbmUgcmVwbGFjZWQgZWx0cyBhZGQgaW4gdGhlaXIgbWFyZ2lu
cyB0byB0aGVpciBtaW4vbWF4IHZhbHVlcy4KICAgICAgICAgICAgICAgICAgICAgaW50IG1hcmdp
bnMgPSAwOwogICAgICAgICAgICAgICAgICAgICBMZW5ndGggbGVmdE1hcmdpbiA9IGNzdHlsZS0+
bWFyZ2luTGVmdCgpOwpAQCAtNDc3Niw2MCArNDcxNyw2IEBAIHZvaWQgUmVuZGVyQmxvY2s6OnNl
dE1heEJvdHRvbU1hcmdpbnMoaW4KICAgICBtX21heE1hcmdpbi0+bV9ib3R0b21OZWcgPSBuZWc7
CiB9CiAKLXZvaWQgUmVuZGVyQmxvY2s6OmFic29sdXRlUmVjdHMoVmVjdG9yPEludFJlY3Q+JiBy
ZWN0cywgaW50IHR4LCBpbnQgdHkpCi17Ci0gICAgLy8gRm9yIGJsb2NrcyBpbnNpZGUgaW5saW5l
cywgd2UgZ28gYWhlYWQgYW5kIGluY2x1ZGUgbWFyZ2lucyBzbyB0aGF0IHdlIHJ1biByaWdodCB1
cCB0byB0aGUKLSAgICAvLyBpbmxpbmUgYm94ZXMgYWJvdmUgYW5kIGJlbG93IHVzICh0aHVzIGdl
dHRpbmcgbWVyZ2VkIHdpdGggdGhlbSB0byBmb3JtIGEgc2luZ2xlIGlycmVndWxhcgotICAgIC8v
IHNoYXBlKS4KLSAgICBpZiAoaW5saW5lQ29udGludWF0aW9uKCkpIHsKLSAgICAgICAgcmVjdHMu
YXBwZW5kKEludFJlY3QodHgsIHR5IC0gY29sbGFwc2VkTWFyZ2luVG9wKCksCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHdpZHRoKCksIGhlaWdodCgpICsgY29sbGFwc2VkTWFyZ2luVG9w
KCkgKyBjb2xsYXBzZWRNYXJnaW5Cb3R0b20oKSkpOwotICAgICAgICBpbmxpbmVDb250aW51YXRp
b24oKS0+YWJzb2x1dGVSZWN0cyhyZWN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgdHggLSB4KCkgKyBpbmxpbmVDb250aW51YXRpb24oKS0+Y29udGFpbmlu
Z0Jsb2NrKCktPngoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgdHkgLSB5KCkgKyBpbmxpbmVDb250aW51YXRpb24oKS0+Y29udGFpbmluZ0Jsb2NrKCktPnko
KSk7Ci0gICAgfSBlbHNlCi0gICAgICAgIHJlY3RzLmFwcGVuZChJbnRSZWN0KHR4LCB0eSwgd2lk
dGgoKSwgaGVpZ2h0KCkpKTsKLX0KLQotdm9pZCBSZW5kZXJCbG9jazo6YWJzb2x1dGVRdWFkcyhW
ZWN0b3I8RmxvYXRRdWFkPiYgcXVhZHMpCi17Ci0gICAgLy8gRm9yIGJsb2NrcyBpbnNpZGUgaW5s
aW5lcywgd2UgZ28gYWhlYWQgYW5kIGluY2x1ZGUgbWFyZ2lucyBzbyB0aGF0IHdlIHJ1biByaWdo
dCB1cCB0byB0aGUKLSAgICAvLyBpbmxpbmUgYm94ZXMgYWJvdmUgYW5kIGJlbG93IHVzICh0aHVz
IGdldHRpbmcgbWVyZ2VkIHdpdGggdGhlbSB0byBmb3JtIGEgc2luZ2xlIGlycmVndWxhcgotICAg
IC8vIHNoYXBlKS4KLSAgICBpZiAoaW5saW5lQ29udGludWF0aW9uKCkpIHsKLSAgICAgICAgRmxv
YXRSZWN0IGxvY2FsUmVjdCgwLCAtY29sbGFwc2VkTWFyZ2luVG9wKCksCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgd2lkdGgoKSwgaGVpZ2h0KCkgKyBjb2xsYXBzZWRNYXJnaW5Ub3AoKSAr
IGNvbGxhcHNlZE1hcmdpbkJvdHRvbSgpKTsKLSAgICAgICAgcXVhZHMuYXBwZW5kKGxvY2FsVG9B
YnNvbHV0ZVF1YWQobG9jYWxSZWN0KSk7Ci0gICAgICAgIGlubGluZUNvbnRpbnVhdGlvbigpLT5h
YnNvbHV0ZVF1YWRzKHF1YWRzKTsKLSAgICB9IGVsc2UKLSAgICAgICAgcXVhZHMuYXBwZW5kKFJl
bmRlckJveDo6bG9jYWxUb0Fic29sdXRlUXVhZChGbG9hdFJlY3QoMCwgMCwgd2lkdGgoKSwgaGVp
Z2h0KCkpKSk7Ci19Ci0KLUludFJlY3QgUmVuZGVyQmxvY2s6OnJlY3RXaXRoT3V0bGluZUZvclJl
cGFpbnQoUmVuZGVyQm94TW9kZWxPYmplY3QqIHJlcGFpbnRDb250YWluZXIsIGludCBvdXRsaW5l
V2lkdGgpCi17Ci0gICAgSW50UmVjdCByKFJlbmRlckJveDo6cmVjdFdpdGhPdXRsaW5lRm9yUmVw
YWludChyZXBhaW50Q29udGFpbmVyLCBvdXRsaW5lV2lkdGgpKTsKLSAgICBpZiAoaW5saW5lQ29u
dGludWF0aW9uKCkpCi0gICAgICAgIHIuaW5mbGF0ZVkoY29sbGFwc2VkTWFyZ2luVG9wKCkpOwot
ICAgIHJldHVybiByOwotfQotCi1SZW5kZXJPYmplY3QqIFJlbmRlckJsb2NrOjpob3ZlckFuY2Vz
dG9yKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaW5saW5lQ29udGludWF0aW9uKCkgPyBpbmxpbmVD
b250aW51YXRpb24oKSA6IFJlbmRlckJveDo6aG92ZXJBbmNlc3RvcigpOwotfQotCi12b2lkIFJl
bmRlckJsb2NrOjp1cGRhdGVEcmFnU3RhdGUoYm9vbCBkcmFnT24pCi17Ci0gICAgUmVuZGVyQm94
Ojp1cGRhdGVEcmFnU3RhdGUoZHJhZ09uKTsKLSAgICBpZiAoaW5saW5lQ29udGludWF0aW9uKCkp
Ci0gICAgICAgIGlubGluZUNvbnRpbnVhdGlvbigpLT51cGRhdGVEcmFnU3RhdGUoZHJhZ09uKTsK
LX0KLQotUmVuZGVyU3R5bGUqIFJlbmRlckJsb2NrOjpvdXRsaW5lU3R5bGVGb3JSZXBhaW50KCkg
Y29uc3QKLXsKLSAgICByZXR1cm4gaW5saW5lQ29udGludWF0aW9uKCkgPyBpbmxpbmVDb250aW51
YXRpb24oKS0+c3R5bGUoKSA6IHN0eWxlKCk7Ci19Ci0KIHZvaWQgUmVuZGVyQmxvY2s6OmNoaWxk
QmVjYW1lTm9uSW5saW5lKFJlbmRlck9iamVjdCopCiB7CiAgICAgbWFrZUNoaWxkcmVuTm9uSW5s
aW5lKCk7CkBAIC00ODM4LDI2ICs0NzI1LDYgQEAgdm9pZCBSZW5kZXJCbG9jazo6Y2hpbGRCZWNh
bWVOb25JbmxpbmUoUgogICAgIC8vIHx0aGlzfCBtYXkgYmUgZGVhZCBoZXJlCiB9CiAKLXZvaWQg
UmVuZGVyQmxvY2s6OnVwZGF0ZUhpdFRlc3RSZXN1bHQoSGl0VGVzdFJlc3VsdCYgcmVzdWx0LCBj
b25zdCBJbnRQb2ludCYgcG9pbnQpCi17Ci0gICAgaWYgKHJlc3VsdC5pbm5lck5vZGUoKSkKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgTm9kZSogbiA9IG5vZGUoKTsKLSAgICBpZiAoaW5saW5lQ29u
dGludWF0aW9uKCkpCi0gICAgICAgIC8vIFdlIGFyZSBpbiB0aGUgbWFyZ2lucyBvZiBibG9jayBl
bGVtZW50cyB0aGF0IGFyZSBwYXJ0IG9mIGEgY29udGludWF0aW9uLiAgSW4KLSAgICAgICAgLy8g
dGhpcyBjYXNlIHdlJ3JlIGFjdHVhbGx5IHN0aWxsIGluc2lkZSB0aGUgZW5jbG9zaW5nIGlubGlu
ZSBlbGVtZW50IHRoYXQgd2FzCi0gICAgICAgIC8vIHNwbGl0LiAgR28gYWhlYWQgYW5kIHNldCBv
dXIgaW5uZXIgbm9kZSBhY2NvcmRpbmdseS4KLSAgICAgICAgbiA9IGlubGluZUNvbnRpbnVhdGlv
bigpLT5ub2RlKCk7Ci0KLSAgICBpZiAobikgewotICAgICAgICByZXN1bHQuc2V0SW5uZXJOb2Rl
KG4pOwotICAgICAgICBpZiAoIXJlc3VsdC5pbm5lck5vblNoYXJlZE5vZGUoKSkKLSAgICAgICAg
ICAgIHJlc3VsdC5zZXRJbm5lck5vblNoYXJlZE5vZGUobik7Ci0gICAgICAgIHJlc3VsdC5zZXRM
b2NhbFBvaW50KHBvaW50KTsKLSAgICB9Ci19Ci0KIEludFJlY3QgUmVuZGVyQmxvY2s6OmxvY2Fs
Q2FyZXRSZWN0KElubGluZUJveCogaW5saW5lQm94LCBpbnQgY2FyZXRPZmZzZXQsIGludCogZXh0
cmFXaWR0aFRvRW5kT2ZMaW5lKQogewogICAgIC8vIERvIHRoZSBub3JtYWwgY2FsY3VsYXRpb24g
aW4gbW9zdCBjYXNlcy4KQEAgLTQ5NDEsMTcgKzQ4MDgsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjph
ZGRGb2N1c1JpbmdSZWN0cyhHcmFwCiAgICAgLy8gRm9yIGJsb2NrcyBpbnNpZGUgaW5saW5lcywg
d2UgZ28gYWhlYWQgYW5kIGluY2x1ZGUgbWFyZ2lucyBzbyB0aGF0IHdlIHJ1biByaWdodCB1cCB0
byB0aGUKICAgICAvLyBpbmxpbmUgYm94ZXMgYWJvdmUgYW5kIGJlbG93IHVzICh0aHVzIGdldHRp
bmcgbWVyZ2VkIHdpdGggdGhlbSB0byBmb3JtIGEgc2luZ2xlIGlycmVndWxhcgogICAgIC8vIHNo
YXBlKS4KLSAgICBpZiAoaW5saW5lQ29udGludWF0aW9uKCkpIHsKLSAgICAgICAgLy8gRklYTUU6
IFRoaXMgY2hlY2sgcmVhbGx5IGlzbid0IGFjY3VyYXRlLiAKLSAgICAgICAgYm9vbCBuZXh0SW5s
aW5lSGFzTGluZUJveCA9IGlubGluZUNvbnRpbnVhdGlvbigpLT5maXJzdExpbmVCb3goKTsKLSAg
ICAgICAgLy8gRklYTUU6IFRoaXMgaXMgd3JvbmcuIFRoZSBwcmluY2lwYWwgcmVuZGVyZXIgbWF5
IG5vdCBiZSB0aGUgY29udGludWF0aW9uIHByZWNlZGluZyB0aGlzIGJsb2NrLgotICAgICAgICBi
b29sIHByZXZJbmxpbmVIYXNMaW5lQm94ID0gdG9SZW5kZXJJbmxpbmUoaW5saW5lQ29udGludWF0
aW9uKCktPm5vZGUoKS0+cmVuZGVyZXIoKSktPmZpcnN0TGluZUJveCgpOyAKLSAgICAgICAgaW50
IHRvcE1hcmdpbiA9IHByZXZJbmxpbmVIYXNMaW5lQm94ID8gY29sbGFwc2VkTWFyZ2luVG9wKCkg
OiAwOwotICAgICAgICBpbnQgYm90dG9tTWFyZ2luID0gbmV4dElubGluZUhhc0xpbmVCb3ggPyBj
b2xsYXBzZWRNYXJnaW5Cb3R0b20oKSA6IDA7Ci0gICAgICAgIGdyYXBoaWNzQ29udGV4dC0+YWRk
Rm9jdXNSaW5nUmVjdChJbnRSZWN0KHR4LCB0eSAtIHRvcE1hcmdpbiwgCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoKCksIGhlaWdodCgpICsg
dG9wTWFyZ2luICsgYm90dG9tTWFyZ2luKSk7Ci0gICAgfSBlbHNlCi0gICAgICAgIGdyYXBoaWNz
Q29udGV4dC0+YWRkRm9jdXNSaW5nUmVjdChJbnRSZWN0KHR4LCB0eSwgd2lkdGgoKSwgaGVpZ2h0
KCkpKTsKKyAgICBncmFwaGljc0NvbnRleHQtPmFkZEZvY3VzUmluZ1JlY3QoSW50UmVjdCh0eCwg
dHksIHdpZHRoKCksIGhlaWdodCgpKSk7CiAKICAgICBpZiAoIWhhc092ZXJmbG93Q2xpcCgpICYm
ICFoYXNDb250cm9sQ2xpcCgpKSB7CiAgICAgICAgIGZvciAoSW5saW5lUnVuQm94KiBjdXJyID0g
Zmlyc3RMaW5lQm94KCk7IGN1cnI7IGN1cnIgPSBjdXJyLT5uZXh0TGluZUJveCgpKQpAQCAtNDk3
MCwxMSArNDgyNyw2IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmFkZEZvY3VzUmluZ1JlY3RzKEdyYXAK
ICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLQotICAgIGlmIChpbmxpbmVDb250aW51
YXRpb24oKSkKLSAgICAgICAgaW5saW5lQ29udGludWF0aW9uKCktPmFkZEZvY3VzUmluZ1JlY3Rz
KGdyYXBoaWNzQ29udGV4dCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB0eCAtIHgoKSArIGlubGluZUNvbnRpbnVhdGlvbigpLT5jb250YWluaW5nQmxv
Y2soKS0+eCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgdHkgLSB5KCkgKyBpbmxpbmVDb250aW51YXRpb24oKS0+Y29udGFpbmluZ0Jsb2NrKCktPnko
KSk7CiB9CiAKIFJlbmRlckJsb2NrKiBSZW5kZXJCbG9jazo6Y3JlYXRlQW5vbnltb3VzQmxvY2so
Ym9vbCBpc0ZsZXhpYmxlQm94KSBjb25zdApJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVy
QmxvY2suaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5oCShy
ZXZpc2lvbiA0NzUxNykKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmgJKHdvcmtp
bmcgY29weSkKQEAgLTEzMCwxMSArMTMwLDYgQEAgcHVibGljOgogCiAgICAgdm9pZCBhZGp1c3RS
ZWN0Rm9yQ29sdW1ucyhJbnRSZWN0JikgY29uc3Q7CiAKLSAgICB2b2lkIGFkZENvbnRpbnVhdGlv
bldpdGhPdXRsaW5lKFJlbmRlcklubGluZSopOwotCi0gICAgUmVuZGVySW5saW5lKiBpbmxpbmVD
b250aW51YXRpb24oKSBjb25zdCB7IHJldHVybiBtX2lubGluZUNvbnRpbnVhdGlvbjsgfQotICAg
IHZvaWQgc2V0SW5saW5lQ29udGludWF0aW9uKFJlbmRlcklubGluZSogYykgeyBtX2lubGluZUNv
bnRpbnVhdGlvbiA9IGM7IH0KLQogICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgYSBjb252ZW5pZW5j
ZSBoZWxwZXIgZm9yIGNyZWF0aW5nIGFuIGFub255bW91cyBibG9jayB0aGF0IGluaGVyaXRzIGl0
cwogICAgIC8vIHN0eWxlIGZyb20gdGhpcyBSZW5kZXJCbG9jay4KICAgICBSZW5kZXJCbG9jayog
Y3JlYXRlQW5vbnltb3VzQmxvY2soYm9vbCBpc0ZsZXhpYmxlQm94ID0gZmFsc2UpIGNvbnN0OwpA
QCAtMTc2LDggKzE3MSw2IEBAIHByb3RlY3RlZDoKIAogICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVG
aXJzdExldHRlcigpOwogCi0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZUhpdFRlc3RSZXN1bHQoSGl0
VGVzdFJlc3VsdCYsIGNvbnN0IEludFBvaW50Jik7Ci0KICAgICAvLyBEZWxheSB1cGRhdGUgc2Ny
b2xsYmFyIHVudGlsIGZpbmlzaERlbGF5UmVwYWludCgpIHdpbGwgYmUKICAgICAvLyBjYWxsZWQu
IFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB3aGVuIGEgZmxleGJveCBpcyBsYXlpbmcgb3V0IGl0cwog
ICAgIC8vIGRlc2NlbmRhbnQuIElmIG11bHRpcGxlIGNhbGxzIGFyZSBtYWRlIHRvIHN0YXJ0RGVs
YXlSZXBhaW50KCksCkBAIC0zMTAsMTIgKzMwMyw3IEBAIHByaXZhdGU6CiAgICAgLy8gY2hpbGRy
ZW4uCiAgICAgdmlydHVhbCBSZW5kZXJCbG9jayogZmlyc3RMaW5lQmxvY2soKSBjb25zdDsKICAg
ICBib29sIGluUm9vdEJsb2NrQ29udGV4dCgpIGNvbnN0OwotCi0gICAgdmlydHVhbCBJbnRSZWN0
IHJlY3RXaXRoT3V0bGluZUZvclJlcGFpbnQoUmVuZGVyQm94TW9kZWxPYmplY3QqIHJlcGFpbnRD
b250YWluZXIsIGludCBvdXRsaW5lV2lkdGgpOwotICAgIHZpcnR1YWwgUmVuZGVyU3R5bGUqIG91
dGxpbmVTdHlsZUZvclJlcGFpbnQoKSBjb25zdDsKICAgICAKLSAgICB2aXJ0dWFsIFJlbmRlck9i
amVjdCogaG92ZXJBbmNlc3RvcigpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVEcmFn
U3RhdGUoYm9vbCBkcmFnT24pOwogICAgIHZpcnR1YWwgdm9pZCBjaGlsZEJlY2FtZU5vbklubGlu
ZShSZW5kZXJPYmplY3QqIGNoaWxkKTsKIAogICAgIHZpcnR1YWwgSW50UmVjdCBzZWxlY3Rpb25S
ZWN0Rm9yUmVwYWludChSZW5kZXJCb3hNb2RlbE9iamVjdCogcmVwYWludENvbnRhaW5lciwgYm9v
bCAvKmNsaXBUb1Zpc2libGVDb250ZW50Ki8pCkBAIC0zMzUsMTYgKzMyMywxMSBAQCBwcml2YXRl
OgogICAgIGludCBsZWZ0U2VsZWN0aW9uT2Zmc2V0KFJlbmRlckJsb2NrKiByb290QmxvY2ssIGlu
dCB5KTsKICAgICBpbnQgcmlnaHRTZWxlY3Rpb25PZmZzZXQoUmVuZGVyQmxvY2sqIHJvb3RCbG9j
aywgaW50IHkpOwogCi0gICAgdmlydHVhbCB2b2lkIGFic29sdXRlUmVjdHMoVmVjdG9yPEludFJl
Y3Q+JiwgaW50IHR4LCBpbnQgdHkpOwotICAgIHZpcnR1YWwgdm9pZCBhYnNvbHV0ZVF1YWRzKFZl
Y3RvcjxGbG9hdFF1YWQ+Jik7Ci0KICAgICBpbnQgZGVzaXJlZENvbHVtbldpZHRoKCkgY29uc3Q7
CiAgICAgdW5zaWduZWQgZGVzaXJlZENvbHVtbkNvdW50KCkgY29uc3Q7CiAgICAgVmVjdG9yPElu
dFJlY3Q+KiBjb2x1bW5SZWN0cygpIGNvbnN0OwogICAgIHZvaWQgc2V0RGVzaXJlZENvbHVtbkNv
dW50QW5kV2lkdGgoaW50IGNvdW50LCBpbnQgd2lkdGgpOwogICAgIGludCBjb2x1bW5HYXAoKSBj
b25zdDsKLSAgICAKLSAgICB2b2lkIHBhaW50Q29udGludWF0aW9uT3V0bGluZXMoUGFpbnRJbmZv
JiwgaW50IHR4LCBpbnQgdHkpOwogCiAgICAgdmlydHVhbCBJbnRSZWN0IGxvY2FsQ2FyZXRSZWN0
KElubGluZUJveCosIGludCBjYXJldE9mZnNldCwgaW50KiBleHRyYVdpZHRoVG9FbmRPZkxpbmUg
PSAwKTsKIApAQCAtNDg1LDEyICs0NjgsNiBAQCBwcml2YXRlOgogICAgIERlcHJlY2F0ZWRQdHJM
aXN0PEZsb2F0aW5nT2JqZWN0PiogbV9mbG9hdGluZ09iamVjdHM7CiAgICAgTGlzdEhhc2hTZXQ8
UmVuZGVyQm94Kj4qIG1fcG9zaXRpb25lZE9iamVjdHM7CiAKLSAgICAvLyBBbiBpbmxpbmUgY2Fu
IGJlIHNwbGl0IHdpdGggYmxvY2tzIG9jY3VycmluZyBpbiBiZXR3ZWVuIHRoZSBpbmxpbmUgY29u
dGVudC4KLSAgICAvLyBXaGVuIHRoaXMgb2NjdXJzIHdlIG5lZWQgYSBwb2ludGVyIHRvIG91ciBu
ZXh0IG9iamVjdC4gIFdlIGNhbiBiYXNpY2FsbHkgYmUKLSAgICAvLyBzcGxpdCBpbnRvIGEgc2Vx
dWVuY2Ugb2YgaW5saW5lcyBhbmQgYmxvY2tzLiAgVGhlIGNvbnRpbnVhdGlvbiB3aWxsIGVpdGhl
ciBiZQotICAgIC8vIGFuIGFub255bW91cyBibG9jayAodGhhdCBob3VzZXMgb3RoZXIgYmxvY2tz
KSBvciBpdCB3aWxsIGJlIGFuIGlubGluZSBmbG93LgotICAgIFJlbmRlcklubGluZSogbV9pbmxp
bmVDb250aW51YXRpb247Ci0KICAgICAvLyBBbGxvY2F0ZWQgb25seSB3aGVuIHNvbWUgb2YgdGhl
c2UgZmllbGRzIGhhdmUgbm9uLWRlZmF1bHQgdmFsdWVzCiAgICAgc3RydWN0IE1heE1hcmdpbiB7
CiAgICAgICAgIE1heE1hcmdpbihjb25zdCBSZW5kZXJCbG9jayogbykgCkluZGV4OiBXZWJDb3Jl
L3JlbmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5jcHAJKHJldmlzaW9uIDQ3NTE3KQor
KysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcAkod29ya2luZyBj
b3B5KQpAQCAtNTcwLDEyICs1NzAsMTYgQEAgUm9vdElubGluZUJveCogUmVuZGVyQmxvY2s6OmNv
bnN0cnVjdExpbgogICAgICAgICBpZiAoIWJveCkKICAgICAgICAgICAgIGNvbnRpbnVlOwogCisg
ICAgICAgIC8vIEFub255bW91cyBpbmxpbmUgYmxvY2tzICh1c2VkIHRvIGhvbGQgYmxvY2tzIGlu
c2lkZSBpbmxpbmVzKSBkb24ndCBuZWVkIHRvIHdhc3RlIHRpbWUgd3JhcHBpbmcKKyAgICAgICAg
Ly8gdGhlbXNlbHZlcyBpbiB0aG9zZSBpbmxpbmVzIChzaW5jZSB3ZSB3YW50IHRvIHByZXRlbmQg
bGlrZSB0aGV5IGRvbid0IGV4aXN0IG9uIHRoaXMgZmFrZSBsaW5lKS4KKyAgICAgICAgUmVuZGVy
T2JqZWN0KiBhbmNlc3RvclJlbmRlcmVyID0gci0+bV9vYmplY3QtPmlzQW5vbnltb3VzSW5saW5l
QmxvY2soKSA/IHRoaXMgOiByLT5tX29iamVjdC0+cGFyZW50KCk7CisgCiAgICAgICAgIC8vIElm
IHdlIGhhdmUgbm8gcGFyZW50IGJveCB5ZXQsIG9yIGlmIHRoZSBydW4gaXMgbm90IHNpbXBseSBh
IHNpYmxpbmcsCiAgICAgICAgIC8vIHRoZW4gd2UgbmVlZCB0byBjb25zdHJ1Y3QgaW5saW5lIGJv
eGVzIGFzIG5lY2Vzc2FyeSB0byBwcm9wZXJseSBlbmNsb3NlIHRoZQogICAgICAgICAvLyBydW4n
cyBpbmxpbmUgYm94LgotICAgICAgICBpZiAoIXBhcmVudEJveCB8fCBwYXJlbnRCb3gtPnJlbmRl
cmVyKCkgIT0gci0+bV9vYmplY3QtPnBhcmVudCgpKQorICAgICAgICBpZiAoIXBhcmVudEJveCB8
fCBwYXJlbnRCb3gtPnJlbmRlcmVyKCkgIT0gYW5jZXN0b3JSZW5kZXJlcikKICAgICAgICAgICAg
IC8vIENyZWF0ZSBuZXcgaW5saW5lIGJveGVzIGFsbCB0aGUgd2F5IGJhY2sgdG8gdGhlIGFwcHJv
cHJpYXRlIGluc2VydGlvbiBwb2ludC4KLSAgICAgICAgICAgIHBhcmVudEJveCA9IGNyZWF0ZUxp
bmVCb3hlcyhyLT5tX29iamVjdC0+cGFyZW50KCksIGZpcnN0TGluZSk7CisgICAgICAgICAgICBw
YXJlbnRCb3ggPSBjcmVhdGVMaW5lQm94ZXMoYW5jZXN0b3JSZW5kZXJlciwgZmlyc3RMaW5lKTsK
IAogICAgICAgICAvLyBBcHBlbmQgdGhlIGlubGluZSBib3ggdG8gdGhpcyBsaW5lLgogICAgICAg
ICBwYXJlbnRCb3gtPmFkZFRvTGluZShib3gpOwpAQCAtNjE3LDYgKzYyMSw4IEBAIHZvaWQgUmVu
ZGVyQmxvY2s6OmNvbXB1dGVIb3Jpem9udGFsUG9zaXQKICAgICB1bnNpZ25lZCBudW1TcGFjZXMg
PSAwOwogICAgIEVUZXh0QWxpZ24gdGV4dEFsaWduID0gc3R5bGUoKS0+dGV4dEFsaWduKCk7CiAK
KyAgICBpbnQgeCA9IGxlZnRPZmZzZXQoaGVpZ2h0KCksIGZpcnN0TGluZSk7CisKICAgICBmb3Ig
KEJpZGlSdW4qIHIgPSBmaXJzdFJ1bjsgcjsgciA9IHItPm5leHQoKSkgewogICAgICAgICBpZiAo
IXItPm1fYm94IHx8IHItPm1fb2JqZWN0LT5pc1Bvc2l0aW9uZWQoKSB8fCByLT5tX2JveC0+aXNM
aW5lQnJlYWsoKSkKICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBQb3NpdGlvbmVkIG9iamVjdHMg
YXJlIG9ubHkgcGFydGljaXBhdGluZyB0byBmaWd1cmUgb3V0IHRoZWlyCkBAIC02NTQsNiArNjYw
LDEyIEBAIHZvaWQgUmVuZGVyQmxvY2s6OmNvbXB1dGVIb3Jpem9udGFsUG9zaXQKICAgICAgICAg
ICAgIHJlbmRlckJveC0+Y2FsY1dpZHRoKCk7CiAgICAgICAgICAgICByLT5tX2JveC0+c2V0V2lk
dGgocmVuZGVyQm94LT53aWR0aCgpKTsKICAgICAgICAgICAgIHRvdFdpZHRoICs9IHJlbmRlckJv
eC0+bWFyZ2luTGVmdCgpICsgcmVuZGVyQm94LT5tYXJnaW5SaWdodCgpOworICAgICAgICAgICAg
CisgICAgICAgICAgICBpZiAoci0+bV9vYmplY3QtPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkg
eworICAgICAgICAgICAgICAgIC8vIEFsbG93IHRoZSBmdWxsIGF2YWlsYWJsZSB3aWR0aCB0byBi
ZSB1c2VkLCBzaW5jZSBmbG9hdHMgd2lsbCBpbnRydWRlIGludG8gb3VyIHNwYWNlLgorICAgICAg
ICAgICAgICAgIGF2YWlsYWJsZVdpZHRoID0gcmlnaHRPZmZzZXQoKSAtIGxlZnRPZmZzZXQoKTsK
KyAgICAgICAgICAgICAgICB4ID0gbGVmdE9mZnNldCgpOworICAgICAgICAgICAgfQogICAgICAg
ICB9CiAKICAgICAgICAgdG90V2lkdGggKz0gci0+bV9ib3gtPndpZHRoKCk7CkBAIC02NjMsNyAr
Njc1LDYgQEAgdm9pZCBSZW5kZXJCbG9jazo6Y29tcHV0ZUhvcml6b250YWxQb3NpdAogICAgIC8v
IHdlIG5vdyBleGFtaW5lIG91ciB0ZXh0LWFsaWduIHByb3BlcnR5IGluIG9yZGVyIHRvIGRldGVy
bWluZSB3aGVyZSB0byBwb3NpdGlvbiB0aGUKICAgICAvLyBvYmplY3RzIGhvcml6b250YWxseS4g
IFRoZSB0b3RhbCB3aWR0aCBvZiB0aGUgbGluZSBjYW4gYmUgaW5jcmVhc2VkIGlmIHdlIGVuZCB1
cAogICAgIC8vIGp1c3RpZnlpbmcgdGV4dC4KLSAgICBpbnQgeCA9IGxlZnRPZmZzZXQoaGVpZ2h0
KCksIGZpcnN0TGluZSk7CiAgICAgc3dpdGNoICh0ZXh0QWxpZ24pIHsKICAgICAgICAgY2FzZSBM
RUZUOgogICAgICAgICBjYXNlIFdFQktJVF9MRUZUOgpAQCAtODQ3LDcgKzg1OCw3IEBAIHZvaWQg
UmVuZGVyQmxvY2s6OmxheW91dElubGluZUNoaWxkcmVuKGIKICAgICAgICAgICAgIGlmIChvLT5p
c1JlcGxhY2VkKCkgfHwgby0+aXNGbG9hdGluZygpIHx8IG8tPmlzUG9zaXRpb25lZCgpKSB7CiAg
ICAgICAgICAgICAgICAgUmVuZGVyQm94KiBib3ggPSB0b1JlbmRlckJveChvKTsKICAgICAgICAg
ICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVsYXlvdXRDaGlsZHJlbiB8fCBvLT5zdHls
ZSgpLT53aWR0aCgpLmlzUGVyY2VudCgpIHx8IG8tPnN0eWxlKCktPmhlaWdodCgpLmlzUGVyY2Vu
dCgpKQorICAgICAgICAgICAgICAgIGlmIChyZWxheW91dENoaWxkcmVuIHx8ICgoby0+c3R5bGUo
KS0+d2lkdGgoKS5pc1BlcmNlbnQoKSB8fCBvLT5zdHlsZSgpLT5oZWlnaHQoKS5pc1BlcmNlbnQo
KSkgJiYgIW8tPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkpCiAgICAgICAgICAgICAgICAgICAg
IG8tPnNldENoaWxkTmVlZHNMYXlvdXQodHJ1ZSwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAg
ICAKICAgICAgICAgICAgICAgICAvLyBJZiByZWxheW91dENoaWxkcmVuIGlzIHNldCBhbmQgd2Ug
aGF2ZSBwZXJjZW50YWdlIHBhZGRpbmcsIHdlIGFsc28gbmVlZCB0byBpbnZhbGlkYXRlIHRoZSBj
aGlsZCdzIHByZWYgd2lkdGhzLgpAQCAtODYyLDcgKzg3Myw4IEBAIHZvaWQgUmVuZGVyQmxvY2s6
OmxheW91dElubGluZUNoaWxkcmVuKGIKICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZnVs
bExheW91dCB8fCBvLT5uZWVkc0xheW91dCgpKSAvLyBSZXBsYWNlZCBlbGVtZW50cwogICAgICAg
ICAgICAgICAgICAgICAgICAgdG9SZW5kZXJCb3gobyktPmRpcnR5TGluZUJveGVzKGZ1bGxMYXlv
dXQpOwogCi0gICAgICAgICAgICAgICAgICAgIG8tPmxheW91dElmTmVlZGVkKCk7CisgICAgICAg
ICAgICAgICAgICAgIGlmICghby0+aXNSZXBsYWNlZCgpIHx8ICFvLT5pc0Fub255bW91c0lubGlu
ZUJsb2NrKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBvLT5sYXlvdXRJZk5lZWRlZCgpOwog
ICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAoby0+aXNUZXh0KCkgfHwg
KG8tPmlzUmVuZGVySW5saW5lKCkgJiYgIWVuZE9mSW5saW5lKSkgewogICAgICAgICAgICAgICAg
IGlmIChmdWxsTGF5b3V0IHx8IG8tPnNlbGZOZWVkc0xheW91dCgpKQpAQCAtMTYyMyw2ICsxNjM1
LDcgQEAgSW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6OmZpbmROZXh0TGluZQogCiAgICAgYm9v
bCBhdXRvV3JhcFdhc0V2ZXJUcnVlT25MaW5lID0gZmFsc2U7CiAgICAgYm9vbCBmbG9hdHNGaXRP
bkxpbmUgPSB0cnVlOworICAgIGJvb2wgaXNCbG9ja0luc2lkZUlubGluZSA9IGZhbHNlOwogICAg
IAogICAgIC8vIEZpcmVmb3ggYW5kIE9wZXJhIHdpbGwgYWxsb3cgYSB0YWJsZSBjZWxsIHRvIGdy
b3cgdG8gZml0IGFuIGltYWdlIGluc2lkZSBpdCB1bmRlcgogICAgIC8vIHZlcnkgc3BlY2lmaWMg
Y2lyY3Vtc3RhbmNlcyAoaW4gb3JkZXIgdG8gbWF0Y2ggY29tbW9uIFdpbklFIHJlbmRlcmluZ3Mp
LiAKQEAgLTE2MzQsNyArMTY0Nyw4IEBAIElubGluZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpmaW5k
TmV4dExpbmUKICAgICB3aGlsZSAobykgewogICAgICAgICBjdXJyV1MgPSBvLT5pc1JlcGxhY2Vk
KCkgPyBvLT5wYXJlbnQoKS0+c3R5bGUoKS0+d2hpdGVTcGFjZSgpIDogby0+c3R5bGUoKS0+d2hp
dGVTcGFjZSgpOwogICAgICAgICBsYXN0V1MgPSBsYXN0LT5pc1JlcGxhY2VkKCkgPyBsYXN0LT5w
YXJlbnQoKS0+c3R5bGUoKS0+d2hpdGVTcGFjZSgpIDogbGFzdC0+c3R5bGUoKS0+d2hpdGVTcGFj
ZSgpOwotICAgICAgICAKKyAgICAgICAgaXNCbG9ja0luc2lkZUlubGluZSA9IG8tPmlzQW5vbnlt
b3VzSW5saW5lQmxvY2soKTsKKwogICAgICAgICBib29sIGF1dG9XcmFwID0gUmVuZGVyU3R5bGU6
OmF1dG9XcmFwKGN1cnJXUyk7CiAgICAgICAgIGF1dG9XcmFwV2FzRXZlclRydWVPbkxpbmUgPSBh
dXRvV3JhcFdhc0V2ZXJUcnVlT25MaW5lIHx8IGF1dG9XcmFwOwogCkBAIC0xNzUyLDggKzE3NjYs
OSBAQCBJbmxpbmVJdGVyYXRvciBSZW5kZXJCbG9jazo6ZmluZE5leHRMaW5lCiAgICAgICAgIH0g
ZWxzZSBpZiAoby0+aXNSZXBsYWNlZCgpKSB7CiAgICAgICAgICAgICBSZW5kZXJCb3gqIHJlcGxh
Y2VkQm94ID0gdG9SZW5kZXJCb3gobyk7CiAKLSAgICAgICAgICAgIC8vIEJyZWFrIG9uIHJlcGxh
Y2VkIGVsZW1lbnRzIGlmIGVpdGhlciBoYXMgbm9ybWFsIHdoaXRlLXNwYWNlLgotICAgICAgICAg
ICAgaWYgKChhdXRvV3JhcCB8fCBSZW5kZXJTdHlsZTo6YXV0b1dyYXAobGFzdFdTKSkgJiYgKCFv
LT5pc0ltYWdlKCkgfHwgYWxsb3dJbWFnZXNUb0JyZWFrKSkgeworICAgICAgICAgICAgLy8gQnJl
YWsgb24gcmVwbGFjZWQgZWxlbWVudHMgaWYgZWl0aGVyIGhhcyBub3JtYWwgd2hpdGUtc3BhY2Uu
ICBXZSBhbHNvIGFsd2F5cyBicmVhayBpZiB3ZQorICAgICAgICAgICAgLy8gZW5jb3VudGVyIGEg
c3BlY2lhbCBhbm9ueW1vdXMgaW5saW5lIGJsb2NrICh1c2VkIHRvIGhvbGQgYmxvY2tzIGluc2lk
ZSBpbmxpbmVzKS4KKyAgICAgICAgICAgIGlmICgoYXV0b1dyYXAgfHwgUmVuZGVyU3R5bGU6OmF1
dG9XcmFwKGxhc3RXUykgfHwgaXNCbG9ja0luc2lkZUlubGluZSkgICYmICghby0+aXNJbWFnZSgp
IHx8IGFsbG93SW1hZ2VzVG9CcmVhaykpIHsKICAgICAgICAgICAgICAgICB3ICs9IHRtcFc7CiAg
ICAgICAgICAgICAgICAgdG1wVyA9IDA7CiAgICAgICAgICAgICAgICAgbEJyZWFrLm9iaiA9IG87
CkBAIC0xNzYxLDYgKzE3NzYsMjQgQEAgSW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6OmZpbmRO
ZXh0TGluZQogICAgICAgICAgICAgICAgIGxCcmVhay5uZXh0QnJlYWthYmxlUG9zaXRpb24gPSAt
MTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaWYgKGlzQmxvY2tJbnNpZGVJbmxpbmUp
IHsKKyAgICAgICAgICAgICAgICBpZiAoIWlzTGluZUVtcHR5KQorICAgICAgICAgICAgICAgICAg
ICBnb3RvIGVuZDsKKworICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSB3aWR0aCB0byBpZ25v
cmUgZmxvYXRzLCBzaW5jZSB3ZSdyZSBnb2luZyB0byBhbGxvdyB0aGVtIHRvIGludHJ1ZGUgaW50
byBvdXIgc3BhY2UuCisgICAgICAgICAgICAgICAgd2lkdGggPSByaWdodE9mZnNldCgpIC0gbGVm
dE9mZnNldCgpOworCisgICAgICAgICAgICAgICAgLy8gTGF5IG91dCBub3cgYW5kIG1ha2Ugc3Vy
ZSBvdXIgeS1wb3NpdGlvbiBpcyBhY2N1cmF0ZSBzbyB0aGF0IHdlIGtub3cgYWJvdXQgdGhlIGZs
b2F0cyBpbnRydWRpbmcKKyAgICAgICAgICAgICAgICAvLyBpbnRvIG91ciBzcGFjZS4KKyAgICAg
ICAgICAgICAgICB2aWV3KCktPmFkZExheW91dERlbHRhKEludFNpemUocmVwbGFjZWRCb3gtPngo
KSAtIGxlZnRPZmZzZXQoKSwgcmVwbGFjZWRCb3gtPnkoKSAtIGhlaWdodCgpKSk7CisgICAgICAg
ICAgICAgICAgcmVwbGFjZWRCb3gtPnNldExvY2F0aW9uKGxlZnRPZmZzZXQoKSwgaGVpZ2h0KCkp
OworICAgICAgICAgICAgICAgIHJlcGxhY2VkQm94LT5sYXlvdXRJZk5lZWRlZCgpOworCisgICAg
ICAgICAgICAgICAgLy8gTm93IGFkZCBhbnkgb3ZlcmhhbmdpbmcgZmxvYXRzIGZyb20gdGhpcyBh
bm9ueW1vdXMgYmxvY2sgaW50byBvdXIgbGlzdC4KKyAgICAgICAgICAgICAgICBhZGRPdmVyaGFu
Z2luZ0Zsb2F0cyh0b1JlbmRlckJsb2NrKHJlcGxhY2VkQm94KSwgLXJlcGxhY2VkQm94LT54KCks
IC1yZXBsYWNlZEJveC0+eSgpLCBmYWxzZSk7IC8vIEZJWE1FOiBHZXQgbGFzdCBhcmd1bWVudCBy
aWdodC4KKyAgICAgICAgICAgICAgICBsaW5lTWlkcG9pbnRTdGF0ZS5iZXR3ZWVuTWlkcG9pbnRz
ID0gZmFsc2U7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChpZ25vcmluZ1NwYWNl
cykKICAgICAgICAgICAgICAgICBhZGRNaWRwb2ludChsaW5lTWlkcG9pbnRTdGF0ZSwgSW5saW5l
SXRlcmF0b3IoMCwgbywgMCkpOwogCkBAIC0xNzgyLDYgKzE4MTUsMTUgQEAgSW5saW5lSXRlcmF0
b3IgUmVuZGVyQmxvY2s6OmZpbmROZXh0TGluZQogICAgICAgICAgICAgICAgIH0KICAgICAgICAg
ICAgIH0gZWxzZQogICAgICAgICAgICAgICAgIHRtcFcgKz0gcmVwbGFjZWRCb3gtPndpZHRoKCkg
KyByZXBsYWNlZEJveC0+bWFyZ2luTGVmdCgpICsgcmVwbGFjZWRCb3gtPm1hcmdpblJpZ2h0KCkg
KyBpbmxpbmVXaWR0aChvKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChpc0Js
b2NrSW5zaWRlSW5saW5lKSB7CisgICAgICAgICAgICAgICAgdyArPSB0bXBXOworICAgICAgICAg
ICAgICAgIHRtcFcgPSAwOworICAgICAgICAgICAgICAgIGxCcmVhay5vYmogPSBvOworICAgICAg
ICAgICAgICAgIGxCcmVhay5wb3MgPSAwOworICAgICAgICAgICAgICAgIGxCcmVhay5uZXh0QnJl
YWthYmxlUG9zaXRpb24gPSAtMTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAg
ICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChvLT5pc1RleHQoKSkgewogICAgICAgICAgICAgaWYg
KCFwb3MpCiAgICAgICAgICAgICAgICAgYXBwbGllZFN0YXJ0V2lkdGggPSBmYWxzZTsKSW5kZXg6
IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJveC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9y
ZW5kZXJpbmcvUmVuZGVyQm94LmNwcAkocmV2aXNpb24gNDc1MTcpCisrKyBXZWJDb3JlL3JlbmRl
cmluZy9SZW5kZXJCb3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNzY0LDcgKzI3NjQsNyBAQCBi
b29sIFJlbmRlckJveDo6c2hyaW5rVG9Bdm9pZEZsb2F0cygpIGNvCiAKIGJvb2wgUmVuZGVyQm94
Ojphdm9pZHNGbG9hdHMoKSBjb25zdAogewotICAgIHJldHVybiBpc1JlcGxhY2VkKCkgfHwgaGFz
T3ZlcmZsb3dDbGlwKCkgfHwgaXNIUigpOworICAgIHJldHVybiAhaXNBbm9ueW1vdXNJbmxpbmVC
bG9jaygpICYmIChpc1JlcGxhY2VkKCkgfHwgaGFzT3ZlcmZsb3dDbGlwKCkgfHwgaXNIUigpKTsK
IH0KIAogdm9pZCBSZW5kZXJCb3g6OmFkZFNoYWRvd092ZXJmbG93KCkKSW5kZXg6IFdlYkNvcmUv
cmVuZGVyaW5nL1JlbmRlcklubGluZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJp
bmcvUmVuZGVySW5saW5lLmNwcAkocmV2aXNpb24gNDc0MzkpCisrKyBXZWJDb3JlL3JlbmRlcmlu
Zy9SZW5kZXJJbmxpbmUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00Miw3ICs0Miw2IEBAIG5hbWVz
cGFjZSBXZWJDb3JlIHsKIAogUmVuZGVySW5saW5lOjpSZW5kZXJJbmxpbmUoTm9kZSogbm9kZSkK
ICAgICA6IFJlbmRlckJveE1vZGVsT2JqZWN0KG5vZGUpCi0gICAgLCBtX2NvbnRpbnVhdGlvbigw
KQogICAgICwgbV9saW5lSGVpZ2h0KC0xKQogICAgICwgbV92ZXJ0aWNhbFBvc2l0aW9uKFBvc2l0
aW9uVW5kZWZpbmVkKQogewpAQCAtNTEsMTEgKzUwLDYgQEAgUmVuZGVySW5saW5lOjpSZW5kZXJJ
bmxpbmUoTm9kZSogbm9kZSkKIAogdm9pZCBSZW5kZXJJbmxpbmU6OmRlc3Ryb3koKQogewotICAg
IC8vIERldGFjaCBvdXIgY29udGludWF0aW9uIGZpcnN0LgotICAgIGlmIChtX2NvbnRpbnVhdGlv
bikKLSAgICAgICAgbV9jb250aW51YXRpb24tPmRlc3Ryb3koKTsKLSAgICBtX2NvbnRpbnVhdGlv
biA9IDA7Ci0gICAgCiAgICAgLy8gTWFrZSBzdXJlIHRvIGRlc3Ryb3kgYW5vbnltb3VzIGNoaWxk
cmVuIGZpcnN0IHdoaWxlIHRoZXkgYXJlIHN0aWxsIGNvbm5lY3RlZCB0byB0aGUgcmVzdCBvZiB0
aGUgdHJlZSwgc28gdGhhdCB0aGV5IHdpbGwKICAgICAvLyBwcm9wZXJseSBkaXJ0eSBsaW5lIGJv
eGVzIHRoYXQgdGhleSBhcmUgcmVtb3ZlZCBmcm9tLiAgRWZmZWN0cyB0aGF0IGRvIDpiZWZvcmUv
OmFmdGVyIG9ubHkgb24gaG92ZXIgY291bGQgY3Jhc2ggb3RoZXJ3aXNlLgogICAgIGNoaWxkcmVu
KCktPmRlc3Ryb3lMZWZ0b3ZlckNoaWxkcmVuKCk7CkBAIC04NywxMyArODEsNiBAQCB2b2lkIFJl
bmRlcklubGluZTo6ZGVzdHJveSgpCiAgICAgUmVuZGVyQm94TW9kZWxPYmplY3Q6OmRlc3Ryb3ko
KTsKIH0KIAotUmVuZGVySW5saW5lKiBSZW5kZXJJbmxpbmU6OmlubGluZUNvbnRpbnVhdGlvbigp
IGNvbnN0Ci17Ci0gICAgaWYgKCFtX2NvbnRpbnVhdGlvbiB8fCBtX2NvbnRpbnVhdGlvbi0+aXNJ
bmxpbmUoKSkKLSAgICAgICAgcmV0dXJuIHRvUmVuZGVySW5saW5lKG1fY29udGludWF0aW9uKTsK
LSAgICByZXR1cm4gdG9SZW5kZXJCbG9jayhtX2NvbnRpbnVhdGlvbiktPmlubGluZUNvbnRpbnVh
dGlvbigpOwotfQotCiB2b2lkIFJlbmRlcklubGluZTo6dXBkYXRlQm94TW9kZWxJbmZvRnJvbVN0
eWxlKCkKIHsKICAgICBSZW5kZXJCb3hNb2RlbE9iamVjdDo6dXBkYXRlQm94TW9kZWxJbmZvRnJv
bVN0eWxlKCk7CkBAIC0xMDksMTkgKzk2LDYgQEAgdm9pZCBSZW5kZXJJbmxpbmU6OnN0eWxlRGlk
Q2hhbmdlKFN0eWxlRAogewogICAgIFJlbmRlckJveE1vZGVsT2JqZWN0OjpzdHlsZURpZENoYW5n
ZShkaWZmLCBvbGRTdHlsZSk7CiAKLSAgICAvLyBFbnN1cmUgdGhhdCBhbGwgb2YgdGhlIHNwbGl0
IGlubGluZXMgcGljayB1cCB0aGUgbmV3IHN0eWxlLiBXZQotICAgIC8vIG9ubHkgZG8gdGhpcyBp
ZiB3ZSdyZSBhbiBpbmxpbmUsIHNpbmNlIHdlIGRvbid0IHdhbnQgdG8gcHJvcGFnYXRlCi0gICAg
Ly8gYSBibG9jaydzIHN0eWxlIHRvIHRoZSBvdGhlciBpbmxpbmVzLgotICAgIC8vIGUuZy4sIDxm
b250PmZvbyA8aDQ+Z29vPC9oND4gbW9vPC9mb250Pi4gIFRoZSA8Zm9udD4gaW5saW5lcyBiZWZv
cmUKLSAgICAvLyBhbmQgYWZ0ZXIgdGhlIGJsb2NrIHNoYXJlIHRoZSBzYW1lIHN0eWxlLCBidXQg
dGhlIGJsb2NrIGRvZXNuJ3QKLSAgICAvLyBuZWVkIHRvIHBhc3MgaXRzIHN0eWxlIG9uIHRvIGFu
eW9uZSBlbHNlLgotICAgIGZvciAoUmVuZGVySW5saW5lKiBjdXJyQ29udCA9IGlubGluZUNvbnRp
bnVhdGlvbigpOyBjdXJyQ29udDsgY3VyckNvbnQgPSBjdXJyQ29udC0+aW5saW5lQ29udGludWF0
aW9uKCkpIHsKLSAgICAgICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIG5leHRDb250ID0gY3VyckNv
bnQtPmNvbnRpbnVhdGlvbigpOwotICAgICAgICBjdXJyQ29udC0+c2V0Q29udGludWF0aW9uKDAp
OwotICAgICAgICBjdXJyQ29udC0+c2V0U3R5bGUoc3R5bGUoKSk7Ci0gICAgICAgIGN1cnJDb250
LT5zZXRDb250aW51YXRpb24obmV4dENvbnQpOwotICAgIH0KLQogICAgIG1fbGluZUhlaWdodCA9
IC0xOwogCiAgICAgLy8gVXBkYXRlIHBzZXVkb3MgZm9yIDpiZWZvcmUgYW5kIDphZnRlciBub3cu
CkBAIC0xMzMsNzcgKzEwNyw1NCBAQCB2b2lkIFJlbmRlcklubGluZTo6c3R5bGVEaWRDaGFuZ2Uo
U3R5bGVECiAKIHZvaWQgUmVuZGVySW5saW5lOjphZGRDaGlsZChSZW5kZXJPYmplY3QqIG5ld0No
aWxkLCBSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkKQogewotICAgIGlmIChjb250aW51YXRpb24o
KSkKLSAgICAgICAgcmV0dXJuIGFkZENoaWxkVG9Db250aW51YXRpb24obmV3Q2hpbGQsIGJlZm9y
ZUNoaWxkKTsKLSAgICByZXR1cm4gYWRkQ2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihuZXdDaGls
ZCwgYmVmb3JlQ2hpbGQpOwotfQotCi1zdGF0aWMgUmVuZGVyQm94TW9kZWxPYmplY3QqIG5leHRD
b250aW51YXRpb24oUmVuZGVyT2JqZWN0KiByZW5kZXJlcikKLXsKLSAgICBpZiAocmVuZGVyZXIt
PmlzSW5saW5lKCkgJiYgIXJlbmRlcmVyLT5pc1JlcGxhY2VkKCkpCi0gICAgICAgIHJldHVybiB0
b1JlbmRlcklubGluZShyZW5kZXJlciktPmNvbnRpbnVhdGlvbigpOwotICAgIHJldHVybiB0b1Jl
bmRlckJsb2NrKHJlbmRlcmVyKS0+aW5saW5lQ29udGludWF0aW9uKCk7Ci19Ci0KLVJlbmRlckJv
eE1vZGVsT2JqZWN0KiBSZW5kZXJJbmxpbmU6OmNvbnRpbnVhdGlvbkJlZm9yZShSZW5kZXJPYmpl
Y3QqIGJlZm9yZUNoaWxkKQotewotICAgIGlmIChiZWZvcmVDaGlsZCAmJiBiZWZvcmVDaGlsZC0+
cGFyZW50KCkgPT0gdGhpcykKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0KLSAgICBSZW5kZXJCb3hN
b2RlbE9iamVjdCogY3VyciA9IG5leHRDb250aW51YXRpb24odGhpcyk7Ci0gICAgUmVuZGVyQm94
TW9kZWxPYmplY3QqIG5leHRUb0xhc3QgPSB0aGlzOwotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0
KiBsYXN0ID0gdGhpczsKLSAgICB3aGlsZSAoY3VycikgewotICAgICAgICBpZiAoYmVmb3JlQ2hp
bGQgJiYgYmVmb3JlQ2hpbGQtPnBhcmVudCgpID09IGN1cnIpIHsKLSAgICAgICAgICAgIGlmIChj
dXJyLT5maXJzdENoaWxkKCkgPT0gYmVmb3JlQ2hpbGQpCi0gICAgICAgICAgICAgICAgcmV0dXJu
IGxhc3Q7Ci0gICAgICAgICAgICByZXR1cm4gY3VycjsKLSAgICAgICAgfQotCi0gICAgICAgIG5l
eHRUb0xhc3QgPSBsYXN0OwotICAgICAgICBsYXN0ID0gY3VycjsKLSAgICAgICAgY3VyciA9IG5l
eHRDb250aW51YXRpb24oY3Vycik7Ci0gICAgfQotCi0gICAgaWYgKCFiZWZvcmVDaGlsZCAmJiAh
bGFzdC0+Zmlyc3RDaGlsZCgpKQotICAgICAgICByZXR1cm4gbmV4dFRvTGFzdDsKLSAgICByZXR1
cm4gbGFzdDsKLX0KLQotdm9pZCBSZW5kZXJJbmxpbmU6OmFkZENoaWxkSWdub3JpbmdDb250aW51
YXRpb24oUmVuZGVyT2JqZWN0KiBuZXdDaGlsZCwgUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCkK
LXsKICAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3QgYXBwZW5kIHRoaW5ncyBhZnRlciA6YWZ0ZXIt
Z2VuZXJhdGVkIGNvbnRlbnQgaWYgd2UgaGF2ZSBpdC4KICAgICBpZiAoIWJlZm9yZUNoaWxkICYm
IGlzQWZ0ZXJDb250ZW50KGxhc3RDaGlsZCgpKSkKICAgICAgICAgYmVmb3JlQ2hpbGQgPSBsYXN0
Q2hpbGQoKTsKIAotICAgIGlmICghbmV3Q2hpbGQtPmlzSW5saW5lKCkgJiYgIW5ld0NoaWxkLT5p
c0Zsb2F0aW5nT3JQb3NpdGlvbmVkKCkpIHsKLSAgICAgICAgLy8gV2UgYXJlIHBsYWNpbmcgYSBi
bG9jayBpbnNpZGUgYW4gaW5saW5lLiBXZSBoYXZlIHRvIHBlcmZvcm0gYSBzcGxpdCBvZiB0aGlz
Ci0gICAgICAgIC8vIGlubGluZSBpbnRvIGNvbnRpbnVhdGlvbnMuICBUaGlzIGludm9sdmVzIGNy
ZWF0aW5nIGFuIGFub255bW91cyBibG9jayBib3ggdG8gaG9sZAotICAgICAgICAvLyB8bmV3Q2hp
bGR8LiAgV2UgdGhlbiBtYWtlIHRoYXQgYmxvY2sgYm94IGEgY29udGludWF0aW9uIG9mIHRoaXMg
aW5saW5lLiAgV2UgdGFrZSBhbGwgb2YKLSAgICAgICAgLy8gdGhlIGNoaWxkcmVuIGFmdGVyIHxi
ZWZvcmVDaGlsZHwgYW5kIHB1dCB0aGVtIGluIGEgY2xvbmUgb2YgdGhpcyBvYmplY3QuCi0gICAg
ICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gbmV3U3R5bGUgPSBSZW5kZXJTdHlsZTo6Y3JlYXRlKCk7
Ci0gICAgICAgIG5ld1N0eWxlLT5pbmhlcml0RnJvbShzdHlsZSgpKTsKLSAgICAgICAgbmV3U3R5
bGUtPnNldERpc3BsYXkoQkxPQ0spOwotCi0gICAgICAgIFJlbmRlckJsb2NrKiBuZXdCb3ggPSBu
ZXcgKHJlbmRlckFyZW5hKCkpIFJlbmRlckJsb2NrKGRvY3VtZW50KCkgLyogYW5vbnltb3VzIGJv
eCAqLyk7Ci0gICAgICAgIG5ld0JveC0+c2V0U3R5bGUobmV3U3R5bGUucmVsZWFzZSgpKTsKLSAg
ICAgICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIG9sZENvbnRpbnVhdGlvbiA9IGNvbnRpbnVhdGlv
bigpOwotICAgICAgICBzZXRDb250aW51YXRpb24obmV3Qm94KTsKLQotICAgICAgICAvLyBTb21l
b25lIG1heSBoYXZlIHB1dCBhIDxwPiBpbnNpZGUgYSA8cT4sIGNhdXNpbmcgYSBzcGxpdC4gIFdo
ZW4gdGhpcyBoYXBwZW5zLCB0aGUgOmFmdGVyIGNvbnRlbnQKLSAgICAgICAgLy8gaGFzIHRvIG1v
dmUgaW50byB0aGUgaW5saW5lIGNvbnRpbnVhdGlvbi4gIENhbGwgdXBkYXRlQmVmb3JlQWZ0ZXJD
b250ZW50IHRvIGVuc3VyZSB0aGF0IG91ciA6YWZ0ZXIKLSAgICAgICAgLy8gY29udGVudCBnZXRz
IHByb3Blcmx5IGRlc3Ryb3llZC4KLSAgICAgICAgYm9vbCBpc0xhc3RDaGlsZCA9IChiZWZvcmVD
aGlsZCA9PSBsYXN0Q2hpbGQoKSk7Ci0gICAgICAgIGlmIChkb2N1bWVudCgpLT51c2VzQmVmb3Jl
QWZ0ZXJSdWxlcygpKQotICAgICAgICAgICAgY2hpbGRyZW4oKS0+dXBkYXRlQmVmb3JlQWZ0ZXJD
b250ZW50KHRoaXMsIEFGVEVSKTsKLSAgICAgICAgaWYgKGlzTGFzdENoaWxkICYmIGJlZm9yZUNo
aWxkICE9IGxhc3RDaGlsZCgpKQotICAgICAgICAgICAgYmVmb3JlQ2hpbGQgPSAwOyAvLyBXZSBk
ZXN0cm95ZWQgdGhlIGxhc3QgY2hpbGQsIHNvIG5vdyB3ZSBuZWVkIHRvIHVwZGF0ZSBvdXIgaW5z
ZXJ0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvaW50IHRvIGJlIDAuICBJ
dCdzIGp1c3QgYSBzdHJhaWdodCBhcHBlbmQgbm93LgotCi0gICAgICAgIHNwbGl0RmxvdyhiZWZv
cmVDaGlsZCwgbmV3Qm94LCBuZXdDaGlsZCwgb2xkQ29udGludWF0aW9uKTsKKyAgICAvLyBJZiB0
aGUgcmVxdWVzdGVkIGJlZm9yZUNoaWxkIGlzIG5vdCBvbmUgb2Ygb3VyIGNoaWxkcmVuLCB0aGVu
IHRoaXMgaXMgbW9zdCBsaWtlbHkgYmVjYXVzZQorICAgIC8vIHRoZXJlIGlzIGFuIGFub255bW91
cyBpbmxpbmUtYmxvY2sgYm94IHdpdGhpbiB0aGlzIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBi
ZWZvcmVDaGlsZC4gU28KKyAgICAvLyBqdXN0IGluc2VydCB0aGUgY2hpbGQgaW50byB0aGUgYW5v
bnltb3VzIGlubGluZS1ibG9jayBib3ggaW5zdGVhZCBvZiBoZXJlLgorICAgIGlmIChiZWZvcmVD
aGlsZCAmJiBiZWZvcmVDaGlsZC0+cGFyZW50KCkgIT0gdGhpcykgeworICAgICAgICBBU1NFUlQo
YmVmb3JlQ2hpbGQtPnBhcmVudCgpKTsKKyAgICAgICAgQVNTRVJUKGJlZm9yZUNoaWxkLT5wYXJl
bnQoKS0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKTsKKyAgICAgICAgaWYgKCFuZXdDaGlsZC0+
aXNJbmxpbmUoKSB8fCAobmV3Q2hpbGQtPmlzSW5saW5lKCkgJiYgYmVmb3JlQ2hpbGQtPnBhcmVu
dCgpLT5maXJzdENoaWxkKCkgIT0gYmVmb3JlQ2hpbGQpKQorICAgICAgICAgICAgYmVmb3JlQ2hp
bGQtPnBhcmVudCgpLT5hZGRDaGlsZChuZXdDaGlsZCwgYmVmb3JlQ2hpbGQpOworICAgICAgICBl
bHNlCisgICAgICAgICAgICBhZGRDaGlsZChuZXdDaGlsZCwgYmVmb3JlQ2hpbGQtPnBhcmVudCgp
KTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIGlmICghbmV3Q2hpbGQtPmlzSW5saW5l
KCkpIHsKKyAgICAgICAgLy8gV2UgYXJlIHBsYWNpbmcgYSBibG9jayBpbnNpZGUgYW4gaW5saW5l
LiBXZSBoYXZlIHRvIHBsYWNlIHRoZSBibG9jayBpbnNpZGUgYW4gYW5vbnltb3VzIGlubGluZS1i
bG9jay4KKyAgICAgICAgLy8gVGhpcyBpbmxpbmUtYmxvY2sgY2FuIGhvdXNlIGEgc2VxdWVuY2Ug
b2YgY29udGlndW91cyBibG9jay1sZXZlbCBjaGlsZHJlbiwgYW5kIHRoZXkgd2lsbCBhbGwgc2l0
IG9uIHRoZQorICAgICAgICAvLyBzYW1lIGxpbmUgdG9nZXRoZXIuICBXZSB0cnkgdG8gcmV1c2Ug
b25lIGZpcnN0IGlmIHBvc3NpYmxlLgorICAgICAgICBpZiAoYmVmb3JlQ2hpbGQpIHsKKyAgICAg
ICAgICAgIGlmIChiZWZvcmVDaGlsZC0+cHJldmlvdXNTaWJsaW5nKCkgJiYgYmVmb3JlQ2hpbGQt
PnByZXZpb3VzU2libGluZygpLT5pc0Fub255bW91c0lubGluZUJsb2NrKCkpIHsKKyAgICAgICAg
ICAgICAgICBiZWZvcmVDaGlsZC0+cHJldmlvdXNTaWJsaW5nKCktPmFkZENoaWxkKG5ld0NoaWxk
KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxz
ZSB7CisgICAgICAgICAgICBpZiAobGFzdENoaWxkKCkgJiYgbGFzdENoaWxkKCktPmlzQW5vbnlt
b3VzSW5saW5lQmxvY2soKSkgeworICAgICAgICAgICAgICAgIGxhc3RDaGlsZCgpLT5hZGRDaGls
ZChuZXdDaGlsZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAg
ICAgICB9CisgCisgICAgICAgIGlmICghbmV3Q2hpbGQtPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQo
KSkgeworICAgICAgICAgICAgLy8gVGhlcmUgd2FzIG5vIHN1aXRhYmxlIGV4aXN0aW5nIGFub255
bW91cyBib3guICBDcmVhdGUgYSBuZXcgb25lLgorICAgICAgICAgICAgUmVmUHRyPFJlbmRlclN0
eWxlPiBuZXdTdHlsZSA9IFJlbmRlclN0eWxlOjpjcmVhdGUoKTsKKyAgICAgICAgICAgIG5ld1N0
eWxlLT5pbmhlcml0RnJvbShzdHlsZSgpKTsKKyAgICAgICAgICAgIG5ld1N0eWxlLT5zZXREaXNw
bGF5KElOTElORV9CTE9DSyk7CisgICAgICAgICAgICBuZXdTdHlsZS0+c2V0V2lkdGgoTGVuZ3Ro
KDEwMC4wLCBQZXJjZW50KSk7CisgIAorICAgICAgICAgICAgUmVuZGVyQmxvY2sqIG5ld0JveCA9
IG5ldyAocmVuZGVyQXJlbmEoKSkgUmVuZGVyQmxvY2soZG9jdW1lbnQoKSk7CisgICAgICAgICAg
ICBuZXdCb3gtPnNldFN0eWxlKG5ld1N0eWxlKTsKKyAgICAgICAgICAgIFJlbmRlckJveE1vZGVs
T2JqZWN0OjphZGRDaGlsZChuZXdCb3gsIGJlZm9yZUNoaWxkKTsKKyAgICAgICAgICAgIG5ld0Jv
eC0+YWRkQ2hpbGQobmV3Q2hpbGQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9Cisg
ICAgfQorCiAgICAgUmVuZGVyQm94TW9kZWxPYmplY3Q6OmFkZENoaWxkKG5ld0NoaWxkLCBiZWZv
cmVDaGlsZCk7CiAKICAgICBuZXdDaGlsZC0+c2V0TmVlZHNMYXlvdXRBbmRQcmVmV2lkdGhzUmVj
YWxjKCk7CkBAIC0yMTYsMTg4ICsxNjcsNiBAQCBSZW5kZXJJbmxpbmUqIFJlbmRlcklubGluZTo6
Y2xvbmVJbmxpbmUoCiAgICAgcmV0dXJuIG87CiB9CiAKLXZvaWQgUmVuZGVySW5saW5lOjpzcGxp
dElubGluZXMoUmVuZGVyQmxvY2sqIGZyb21CbG9jaywgUmVuZGVyQmxvY2sqIHRvQmxvY2ssCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbmRlckJsb2NrKiBtaWRkbGVCbG9jaywK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGls
ZCwgUmVuZGVyQm94TW9kZWxPYmplY3QqIG9sZENvbnQpCi17Ci0gICAgLy8gQ3JlYXRlIGEgY2xv
bmUgb2YgdGhpcyBpbmxpbmUuCi0gICAgUmVuZGVySW5saW5lKiBjbG9uZSA9IGNsb25lSW5saW5l
KHRoaXMpOwotICAgIGNsb25lLT5zZXRDb250aW51YXRpb24ob2xkQ29udCk7Ci0KLSAgICAvLyBO
b3cgdGFrZSBhbGwgb2YgdGhlIGNoaWxkcmVuIGZyb20gYmVmb3JlQ2hpbGQgdG8gdGhlIGVuZCBh
bmQgcmVtb3ZlCi0gICAgLy8gdGhlbSBmcm9tIHx0aGlzfCBhbmQgcGxhY2UgdGhlbSBpbiB0aGUg
Y2xvbmUuCi0gICAgUmVuZGVyT2JqZWN0KiBvID0gYmVmb3JlQ2hpbGQ7Ci0gICAgd2hpbGUgKG8p
IHsKLSAgICAgICAgUmVuZGVyT2JqZWN0KiB0bXAgPSBvOwotICAgICAgICBvID0gdG1wLT5uZXh0
U2libGluZygpOwotICAgICAgICBjbG9uZS0+YWRkQ2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihj
aGlsZHJlbigpLT5yZW1vdmVDaGlsZE5vZGUodGhpcywgdG1wKSwgMCk7Ci0gICAgICAgIHRtcC0+
c2V0TmVlZHNMYXlvdXRBbmRQcmVmV2lkdGhzUmVjYWxjKCk7Ci0gICAgfQotCi0gICAgLy8gSG9v
ayB8Y2xvbmV8IHVwIGFzIHRoZSBjb250aW51YXRpb24gb2YgdGhlIG1pZGRsZSBibG9jay4KLSAg
ICBtaWRkbGVCbG9jay0+c2V0SW5saW5lQ29udGludWF0aW9uKGNsb25lKTsKLQotICAgIC8vIFdl
IGhhdmUgYmVlbiByZXBhcmVudGVkIGFuZCBhcmUgbm93IHVuZGVyIHRoZSBmcm9tQmxvY2suICBX
ZSBuZWVkCi0gICAgLy8gdG8gd2FsayB1cCBvdXIgaW5saW5lIHBhcmVudCBjaGFpbiB1bnRpbCB3
ZSBoaXQgdGhlIGNvbnRhaW5pbmcgYmxvY2suCi0gICAgLy8gT25jZSB3ZSBoaXQgdGhlIGNvbnRh
aW5pbmcgYmxvY2sgd2UncmUgZG9uZS4KLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogY3VyciA9
IHRvUmVuZGVyQm94TW9kZWxPYmplY3QocGFyZW50KCkpOwotICAgIFJlbmRlckJveE1vZGVsT2Jq
ZWN0KiBjdXJyQ2hpbGQgPSB0aGlzOwotICAgIAotICAgIC8vIEZJWE1FOiBCZWNhdXNlIHNwbGl0
dGluZyBpcyBPKG5eMikgYXMgdGFncyBuZXN0IHBhdGhvbG9naWNhbGx5LCB3ZSBjYXAgdGhlIGRl
cHRoIGF0IHdoaWNoIHdlJ3JlIHdpbGxpbmcgdG8gY2xvbmUuCi0gICAgLy8gVGhlcmUgd2lsbCBl
dmVudHVhbGx5IGJlIGEgYmV0dGVyIGFwcHJvYWNoIHRvIHRoaXMgcHJvYmxlbSB0aGF0IHdpbGwg
bGV0IHVzIG5lc3QgdG8gYSBtdWNoCi0gICAgLy8gZ3JlYXRlciBkZXB0aCAoc2VlIGJ1Z3ppbGxh
IGJ1ZyAxMzQzMCkgYnV0IGZvciBub3cgd2UgaGF2ZSBhIGxpbWl0LiAgVGhpcyAqd2lsbCogcmVz
dWx0IGluCi0gICAgLy8gaW5jb3JyZWN0IHJlbmRlcmluZywgYnV0IHRoZSBhbHRlcm5hdGl2ZSBp
cyB0byBoYW5nIGZvcmV2ZXIuCi0gICAgdW5zaWduZWQgc3BsaXREZXB0aCA9IDE7Ci0gICAgY29u
c3QgdW5zaWduZWQgY01heFNwbGl0RGVwdGggPSAyMDA7IAotICAgIHdoaWxlIChjdXJyICYmIGN1
cnIgIT0gZnJvbUJsb2NrKSB7Ci0gICAgICAgIEFTU0VSVChjdXJyLT5pc1JlbmRlcklubGluZSgp
KTsKLSAgICAgICAgaWYgKHNwbGl0RGVwdGggPCBjTWF4U3BsaXREZXB0aCkgewotICAgICAgICAg
ICAgLy8gQ3JlYXRlIGEgbmV3IGNsb25lLgotICAgICAgICAgICAgUmVuZGVySW5saW5lKiBjbG9u
ZUNoaWxkID0gY2xvbmU7Ci0gICAgICAgICAgICBjbG9uZSA9IGNsb25lSW5saW5lKHRvUmVuZGVy
SW5saW5lKGN1cnIpKTsKLQotICAgICAgICAgICAgLy8gSW5zZXJ0IG91ciBjaGlsZCBjbG9uZSBh
cyB0aGUgZmlyc3QgY2hpbGQuCi0gICAgICAgICAgICBjbG9uZS0+YWRkQ2hpbGRJZ25vcmluZ0Nv
bnRpbnVhdGlvbihjbG9uZUNoaWxkLCAwKTsKLQotICAgICAgICAgICAgLy8gSG9vayB0aGUgY2xv
bmUgdXAgYXMgYSBjb250aW51YXRpb24gb2YgfGN1cnJ8LgotICAgICAgICAgICAgUmVuZGVySW5s
aW5lKiBpbmxpbmVDdXJyID0gdG9SZW5kZXJJbmxpbmUoY3Vycik7Ci0gICAgICAgICAgICBvbGRD
b250ID0gaW5saW5lQ3Vyci0+Y29udGludWF0aW9uKCk7Ci0gICAgICAgICAgICBpbmxpbmVDdXJy
LT5zZXRDb250aW51YXRpb24oY2xvbmUpOwotICAgICAgICAgICAgY2xvbmUtPnNldENvbnRpbnVh
dGlvbihvbGRDb250KTsKLQotICAgICAgICAgICAgLy8gU29tZW9uZSBtYXkgaGF2ZSBpbmRpcmVj
dGx5IGNhdXNlZCBhIDxxPiB0byBzcGxpdC4gIFdoZW4gdGhpcyBoYXBwZW5zLCB0aGUgOmFmdGVy
IGNvbnRlbnQKLSAgICAgICAgICAgIC8vIGhhcyB0byBtb3ZlIGludG8gdGhlIGlubGluZSBjb250
aW51YXRpb24uICBDYWxsIHVwZGF0ZUJlZm9yZUFmdGVyQ29udGVudCB0byBlbnN1cmUgdGhhdCB0
aGUgaW5saW5lJ3MgOmFmdGVyCi0gICAgICAgICAgICAvLyBjb250ZW50IGdldHMgcHJvcGVybHkg
ZGVzdHJveWVkLgotICAgICAgICAgICAgaWYgKGRvY3VtZW50KCktPnVzZXNCZWZvcmVBZnRlclJ1
bGVzKCkpCi0gICAgICAgICAgICAgICAgaW5saW5lQ3Vyci0+Y2hpbGRyZW4oKS0+dXBkYXRlQmVm
b3JlQWZ0ZXJDb250ZW50KHRoaXMsIEFGVEVSKTsKLQotICAgICAgICAgICAgLy8gTm93IHdlIG5l
ZWQgdG8gdGFrZSBhbGwgb2YgdGhlIGNoaWxkcmVuIHN0YXJ0aW5nIGZyb20gdGhlIGZpcnN0IGNo
aWxkCi0gICAgICAgICAgICAvLyAqYWZ0ZXIqIGN1cnJDaGlsZCBhbmQgYXBwZW5kIHRoZW0gYWxs
IHRvIHRoZSBjbG9uZS4KLSAgICAgICAgICAgIG8gPSBjdXJyQ2hpbGQtPm5leHRTaWJsaW5nKCk7
Ci0gICAgICAgICAgICB3aGlsZSAobykgewotICAgICAgICAgICAgICAgIFJlbmRlck9iamVjdCog
dG1wID0gbzsKLSAgICAgICAgICAgICAgICBvID0gdG1wLT5uZXh0U2libGluZygpOwotICAgICAg
ICAgICAgICAgIGNsb25lLT5hZGRDaGlsZElnbm9yaW5nQ29udGludWF0aW9uKGlubGluZUN1cnIt
PmNoaWxkcmVuKCktPnJlbW92ZUNoaWxkTm9kZShjdXJyLCB0bXApLCAwKTsKLSAgICAgICAgICAg
ICAgICB0bXAtPnNldE5lZWRzTGF5b3V0QW5kUHJlZldpZHRoc1JlY2FsYygpOwotICAgICAgICAg
ICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBLZWVwIHdhbGtpbmcgdXAgdGhl
IGNoYWluLgotICAgICAgICBjdXJyQ2hpbGQgPSBjdXJyOwotICAgICAgICBjdXJyID0gdG9SZW5k
ZXJCb3hNb2RlbE9iamVjdChjdXJyLT5wYXJlbnQoKSk7Ci0gICAgICAgIHNwbGl0RGVwdGgrKzsK
LSAgICB9Ci0KLSAgICAvLyBOb3cgd2UgYXJlIGF0IHRoZSBibG9jayBsZXZlbC4gV2UgbmVlZCB0
byBwdXQgdGhlIGNsb25lIGludG8gdGhlIHRvQmxvY2suCi0gICAgdG9CbG9jay0+Y2hpbGRyZW4o
KS0+YXBwZW5kQ2hpbGROb2RlKHRvQmxvY2ssIGNsb25lKTsKLQotICAgIC8vIE5vdyB0YWtlIGFs
bCB0aGUgY2hpbGRyZW4gYWZ0ZXIgY3VyckNoaWxkIGFuZCByZW1vdmUgdGhlbSBmcm9tIHRoZSBm
cm9tQmxvY2sKLSAgICAvLyBhbmQgcHV0IHRoZW0gaW4gdGhlIHRvQmxvY2suCi0gICAgbyA9IGN1
cnJDaGlsZC0+bmV4dFNpYmxpbmcoKTsKLSAgICB3aGlsZSAobykgewotICAgICAgICBSZW5kZXJP
YmplY3QqIHRtcCA9IG87Ci0gICAgICAgIG8gPSB0bXAtPm5leHRTaWJsaW5nKCk7Ci0gICAgICAg
IHRvQmxvY2stPmNoaWxkcmVuKCktPmFwcGVuZENoaWxkTm9kZSh0b0Jsb2NrLCBmcm9tQmxvY2st
PmNoaWxkcmVuKCktPnJlbW92ZUNoaWxkTm9kZShmcm9tQmxvY2ssIHRtcCkpOwotICAgIH0KLX0K
LQotdm9pZCBSZW5kZXJJbmxpbmU6OnNwbGl0RmxvdyhSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxk
LCBSZW5kZXJCbG9jayogbmV3QmxvY2tCb3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
IFJlbmRlck9iamVjdCogbmV3Q2hpbGQsIFJlbmRlckJveE1vZGVsT2JqZWN0KiBvbGRDb250KQot
ewotICAgIFJlbmRlckJsb2NrKiBwcmUgPSAwOwotICAgIFJlbmRlckJsb2NrKiBibG9jayA9IGNv
bnRhaW5pbmdCbG9jaygpOwotICAgIAotICAgIC8vIERlbGV0ZSBvdXIgbGluZSBib3hlcyBiZWZv
cmUgd2UgZG8gdGhlIGlubGluZSBzcGxpdCBpbnRvIGNvbnRpbnVhdGlvbnMuCi0gICAgYmxvY2st
PmRlbGV0ZUxpbmVCb3hUcmVlKCk7Ci0gICAgCi0gICAgYm9vbCBtYWRlTmV3QmVmb3JlQmxvY2sg
PSBmYWxzZTsKLSAgICBpZiAoYmxvY2stPmlzQW5vbnltb3VzQmxvY2soKSAmJiAoIWJsb2NrLT5w
YXJlbnQoKSB8fCAhYmxvY2stPnBhcmVudCgpLT5jcmVhdGVzQW5vbnltb3VzV3JhcHBlcigpKSkg
ewotICAgICAgICAvLyBXZSBjYW4gcmV1c2UgdGhpcyBibG9jayBhbmQgbWFrZSBpdCB0aGUgcHJl
QmxvY2sgb2YgdGhlIG5leHQgY29udGludWF0aW9uLgotICAgICAgICBwcmUgPSBibG9jazsKLSAg
ICAgICAgcHJlLT5yZW1vdmVQb3NpdGlvbmVkT2JqZWN0cygwKTsKLSAgICAgICAgYmxvY2sgPSBi
bG9jay0+Y29udGFpbmluZ0Jsb2NrKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gTm8gYW5v
bnltb3VzIGJsb2NrIGF2YWlsYWJsZSBmb3IgdXNlLiAgTWFrZSBvbmUuCi0gICAgICAgIHByZSA9
IGJsb2NrLT5jcmVhdGVBbm9ueW1vdXNCbG9jaygpOwotICAgICAgICBtYWRlTmV3QmVmb3JlQmxv
Y2sgPSB0cnVlOwotICAgIH0KLQotICAgIFJlbmRlckJsb2NrKiBwb3N0ID0gYmxvY2stPmNyZWF0
ZUFub255bW91c0Jsb2NrKCk7Ci0KLSAgICBSZW5kZXJPYmplY3QqIGJveEZpcnN0ID0gbWFkZU5l
d0JlZm9yZUJsb2NrID8gYmxvY2stPmZpcnN0Q2hpbGQoKSA6IHByZS0+bmV4dFNpYmxpbmcoKTsK
LSAgICBpZiAobWFkZU5ld0JlZm9yZUJsb2NrKQotICAgICAgICBibG9jay0+Y2hpbGRyZW4oKS0+
aW5zZXJ0Q2hpbGROb2RlKGJsb2NrLCBwcmUsIGJveEZpcnN0KTsKLSAgICBibG9jay0+Y2hpbGRy
ZW4oKS0+aW5zZXJ0Q2hpbGROb2RlKGJsb2NrLCBuZXdCbG9ja0JveCwgYm94Rmlyc3QpOwotICAg
IGJsb2NrLT5jaGlsZHJlbigpLT5pbnNlcnRDaGlsZE5vZGUoYmxvY2ssIHBvc3QsIGJveEZpcnN0
KTsKLSAgICBibG9jay0+c2V0Q2hpbGRyZW5JbmxpbmUoZmFsc2UpOwotICAgIAotICAgIGlmICht
YWRlTmV3QmVmb3JlQmxvY2spIHsKLSAgICAgICAgUmVuZGVyT2JqZWN0KiBvID0gYm94Rmlyc3Q7
Ci0gICAgICAgIHdoaWxlIChvKSB7Ci0gICAgICAgICAgICBSZW5kZXJPYmplY3QqIG5vID0gbzsK
LSAgICAgICAgICAgIG8gPSBuby0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgICAgIHByZS0+Y2hp
bGRyZW4oKS0+YXBwZW5kQ2hpbGROb2RlKHByZSwgYmxvY2stPmNoaWxkcmVuKCktPnJlbW92ZUNo
aWxkTm9kZShibG9jaywgbm8pKTsKLSAgICAgICAgICAgIG5vLT5zZXROZWVkc0xheW91dEFuZFBy
ZWZXaWR0aHNSZWNhbGMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHNwbGl0SW5saW5lcyhw
cmUsIHBvc3QsIG5ld0Jsb2NrQm94LCBiZWZvcmVDaGlsZCwgb2xkQ29udCk7Ci0KLSAgICAvLyBX
ZSBhbHJlYWR5IGtub3cgdGhlIG5ld0Jsb2NrQm94IGlzbid0IGdvaW5nIHRvIGNvbnRhaW4gaW5s
aW5lIGtpZHMsIHNvIGF2b2lkIHdhc3RpbmcKLSAgICAvLyB0aW1lIGluIG1ha2VDaGlsZHJlbk5v
bklubGluZSBieSBqdXN0IHNldHRpbmcgdGhpcyBleHBsaWNpdGx5IHVwIGZyb250LgotICAgIG5l
d0Jsb2NrQm94LT5zZXRDaGlsZHJlbklubGluZShmYWxzZSk7Ci0KLSAgICAvLyBXZSBkZWxheWVk
IGFkZGluZyB0aGUgbmV3Q2hpbGQgdW50aWwgbm93IHNvIHRoYXQgdGhlIHxuZXdCbG9ja0JveHwg
d291bGQgYmUgZnVsbHkKLSAgICAvLyBjb25uZWN0ZWQsIHRodXMgYWxsb3dpbmcgbmV3Q2hpbGQg
YWNjZXNzIHRvIGEgcmVuZGVyQXJlbmEgc2hvdWxkIGl0IG5lZWQKLSAgICAvLyB0byB3cmFwIGl0
c2VsZiBpbiBhZGRpdGlvbmFsIGJveGVzIChlLmcuLCB0YWJsZSBjb25zdHJ1Y3Rpb24pLgotICAg
IG5ld0Jsb2NrQm94LT5hZGRDaGlsZChuZXdDaGlsZCk7Ci0KLSAgICAvLyBBbHdheXMganVzdCBk
byBhIGZ1bGwgbGF5b3V0IGluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IGxpbmUgYm94ZXMgKGVzcGVj
aWFsbHkgd3JhcHBlcnMgZm9yIGltYWdlcykKLSAgICAvLyBnZXQgZGVsZXRlZCBwcm9wZXJseS4g
IEJlY2F1c2Ugb2JqZWN0cyBtb3ZlcyBmcm9tIHRoZSBwcmUgYmxvY2sgaW50byB0aGUgcG9zdCBi
bG9jaywgd2Ugd2FudCB0bwotICAgIC8vIG1ha2UgbmV3IGxpbmUgYm94ZXMgaW5zdGVhZCBvZiBs
ZWF2aW5nIHRoZSBvbGQgbGluZSBib3hlcyBhcm91bmQuCi0gICAgcHJlLT5zZXROZWVkc0xheW91
dEFuZFByZWZXaWR0aHNSZWNhbGMoKTsKLSAgICBibG9jay0+c2V0TmVlZHNMYXlvdXRBbmRQcmVm
V2lkdGhzUmVjYWxjKCk7Ci0gICAgcG9zdC0+c2V0TmVlZHNMYXlvdXRBbmRQcmVmV2lkdGhzUmVj
YWxjKCk7Ci19Ci0KLXZvaWQgUmVuZGVySW5saW5lOjphZGRDaGlsZFRvQ29udGludWF0aW9uKFJl
bmRlck9iamVjdCogbmV3Q2hpbGQsIFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQpCi17Ci0gICAg
UmVuZGVyQm94TW9kZWxPYmplY3QqIGZsb3cgPSBjb250aW51YXRpb25CZWZvcmUoYmVmb3JlQ2hp
bGQpOwotICAgIEFTU0VSVCghYmVmb3JlQ2hpbGQgfHwgYmVmb3JlQ2hpbGQtPnBhcmVudCgpLT5p
c1JlbmRlckJsb2NrKCkgfHwgYmVmb3JlQ2hpbGQtPnBhcmVudCgpLT5pc1JlbmRlcklubGluZSgp
KTsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogYmVmb3JlQ2hpbGRQYXJlbnQgPSAwOwotICAg
IGlmIChiZWZvcmVDaGlsZCkKLSAgICAgICAgYmVmb3JlQ2hpbGRQYXJlbnQgPSB0b1JlbmRlckJv
eE1vZGVsT2JqZWN0KGJlZm9yZUNoaWxkLT5wYXJlbnQoKSk7Ci0gICAgZWxzZSB7Ci0gICAgICAg
IFJlbmRlckJveE1vZGVsT2JqZWN0KiBjb250ID0gbmV4dENvbnRpbnVhdGlvbihmbG93KTsKLSAg
ICAgICAgaWYgKGNvbnQpCi0gICAgICAgICAgICBiZWZvcmVDaGlsZFBhcmVudCA9IGNvbnQ7Ci0g
ICAgICAgIGVsc2UKLSAgICAgICAgICAgIGJlZm9yZUNoaWxkUGFyZW50ID0gZmxvdzsKLSAgICB9
Ci0KLSAgICBpZiAobmV3Q2hpbGQtPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSkKLSAgICAgICAg
cmV0dXJuIGJlZm9yZUNoaWxkUGFyZW50LT5hZGRDaGlsZElnbm9yaW5nQ29udGludWF0aW9uKG5l
d0NoaWxkLCBiZWZvcmVDaGlsZCk7Ci0KLSAgICAvLyBBIGNvbnRpbnVhdGlvbiBhbHdheXMgY29u
c2lzdHMgb2YgdHdvIHBvdGVudGlhbCBjYW5kaWRhdGVzOiBhbiBpbmxpbmUgb3IgYW4gYW5vbnlt
b3VzCi0gICAgLy8gYmxvY2sgYm94IGhvbGRpbmcgYmxvY2sgY2hpbGRyZW4uCi0gICAgYm9vbCBj
aGlsZElubGluZSA9IG5ld0NoaWxkLT5pc0lubGluZSgpOwotICAgIGJvb2wgYmNwSW5saW5lID0g
YmVmb3JlQ2hpbGRQYXJlbnQtPmlzSW5saW5lKCk7Ci0gICAgYm9vbCBmbG93SW5saW5lID0gZmxv
dy0+aXNJbmxpbmUoKTsKLQotICAgIGlmIChmbG93ID09IGJlZm9yZUNoaWxkUGFyZW50KQotICAg
ICAgICByZXR1cm4gZmxvdy0+YWRkQ2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihuZXdDaGlsZCwg
YmVmb3JlQ2hpbGQpOwotICAgIGVsc2UgewotICAgICAgICAvLyBUaGUgZ29hbCBoZXJlIGlzIHRv
IG1hdGNoIHVwIGlmIHdlIGNhbiwgc28gdGhhdCB3ZSBjYW4gY29hbGVzY2UgYW5kIGNyZWF0ZSB0
aGUKLSAgICAgICAgLy8gbWluaW1hbCAjIG9mIGNvbnRpbnVhdGlvbnMgbmVlZGVkIGZvciB0aGUg
aW5saW5lLgotICAgICAgICBpZiAoY2hpbGRJbmxpbmUgPT0gYmNwSW5saW5lKQotICAgICAgICAg
ICAgcmV0dXJuIGJlZm9yZUNoaWxkUGFyZW50LT5hZGRDaGlsZElnbm9yaW5nQ29udGludWF0aW9u
KG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7Ci0gICAgICAgIGVsc2UgaWYgKGZsb3dJbmxpbmUgPT0g
Y2hpbGRJbmxpbmUpCi0gICAgICAgICAgICByZXR1cm4gZmxvdy0+YWRkQ2hpbGRJZ25vcmluZ0Nv
bnRpbnVhdGlvbihuZXdDaGlsZCwgMCk7IC8vIEp1c3QgdHJlYXQgbGlrZSBhbiBhcHBlbmQuCi0g
ICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBiZWZvcmVDaGlsZFBhcmVudC0+YWRkQ2hp
bGRJZ25vcmluZ0NvbnRpbnVhdGlvbihuZXdDaGlsZCwgYmVmb3JlQ2hpbGQpOwotICAgIH0KLX0K
LQogdm9pZCBSZW5kZXJJbmxpbmU6OnBhaW50KFBhaW50SW5mbyYgcGFpbnRJbmZvLCBpbnQgdHgs
IGludCB0eSkKIHsKICAgICBtX2xpbmVCb3hlcy5wYWludCh0aGlzLCBwYWludEluZm8sIHR4LCB0
eSk7CkBAIC00MTAsMTYgKzE3OSw2IEBAIHZvaWQgUmVuZGVySW5saW5lOjphYnNvbHV0ZVJlY3Rz
KFZlY3RvcjwKICAgICAgICAgICAgIHJlY3RzLmFwcGVuZChJbnRSZWN0KHR4ICsgY3Vyci0+eCgp
LCB0eSArIGN1cnItPnkoKSwgY3Vyci0+d2lkdGgoKSwgY3Vyci0+aGVpZ2h0KCkpKTsKICAgICB9
IGVsc2UKICAgICAgICAgcmVjdHMuYXBwZW5kKEludFJlY3QodHgsIHR5LCAwLCAwKSk7Ci0KLSAg
ICBpZiAoY29udGludWF0aW9uKCkpIHsKLSAgICAgICAgaWYgKGNvbnRpbnVhdGlvbigpLT5pc0Jv
eCgpKSB7Ci0gICAgICAgICAgICBSZW5kZXJCb3gqIGJveCA9IHRvUmVuZGVyQm94KGNvbnRpbnVh
dGlvbigpKTsKLSAgICAgICAgICAgIGNvbnRpbnVhdGlvbigpLT5hYnNvbHV0ZVJlY3RzKHJlY3Rz
LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4IC0gY29udGFp
bmluZ0Jsb2NrKCktPngoKSArIGJveC0+eCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgdHkgLSBjb250YWluaW5nQmxvY2soKS0+eSgpICsgYm94LT55KCkpOwot
ICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIGNvbnRpbnVhdGlvbigpLT5hYnNvbHV0ZVJlY3Rz
KHJlY3RzLCB0eCAtIGNvbnRhaW5pbmdCbG9jaygpLT54KCksIHR5IC0gY29udGFpbmluZ0Jsb2Nr
KCktPnkoKSk7Ci0gICAgfQogfQogCiB2b2lkIFJlbmRlcklubGluZTo6YWJzb2x1dGVRdWFkcyhW
ZWN0b3I8RmxvYXRRdWFkPiYgcXVhZHMpCkBAIC00MzEsOSArMTkwLDYgQEAgdm9pZCBSZW5kZXJJ
bmxpbmU6OmFic29sdXRlUXVhZHMoVmVjdG9yPAogICAgICAgICB9CiAgICAgfSBlbHNlCiAgICAg
ICAgIHF1YWRzLmFwcGVuZChsb2NhbFRvQWJzb2x1dGVRdWFkKEZsb2F0UmVjdCgpKSk7Ci0KLSAg
ICBpZiAoY29udGludWF0aW9uKCkpCi0gICAgICAgIGNvbnRpbnVhdGlvbigpLT5hYnNvbHV0ZVF1
YWRzKHF1YWRzKTsKIH0KIAogaW50IFJlbmRlcklubGluZTo6b2Zmc2V0TGVmdCgpIGNvbnN0CkBA
IC01MDIsMTggKzI1OCw2IEBAIFZpc2libGVQb3NpdGlvbiBSZW5kZXJJbmxpbmU6OnBvc2l0aW9u
Rm8KICAgICAgICAgLy8gc2hvdWxkIHRyeSB0byBmaW5kIGEgcmVzdWx0IGJ5IGFza2luZyBvdXIg
Y29udGFpbmluZyBibG9jay4KICAgICAgICAgcmV0dXJuIGNiLT5wb3NpdGlvbkZvclBvaW50KHBv
aW50KTsKICAgICB9Ci0KLSAgICAvLyBUcmFuc2xhdGUgdGhlIGNvb3JkcyBmcm9tIHRoZSBwcmUt
YW5vbnltb3VzIGJsb2NrIHRvIHRoZSBwb3N0LWFub255bW91cyBibG9jay4KLSAgICBpbnQgcGFy
ZW50QmxvY2tYID0gY2ItPngoKSArIHBvaW50LngoKTsKLSAgICBpbnQgcGFyZW50QmxvY2tZID0g
Y2ItPnkoKSArIHBvaW50LnkoKTsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogYyA9IGNvbnRp
bnVhdGlvbigpOwotICAgIHdoaWxlIChjKSB7Ci0gICAgICAgIFJlbmRlckJveCogY29udEJsb2Nr
ID0gYy0+aXNJbmxpbmUoKSA/IGMtPmNvbnRhaW5pbmdCbG9jaygpIDogdG9SZW5kZXJCbG9jayhj
KTsKLSAgICAgICAgaWYgKGMtPmlzSW5saW5lKCkgfHwgYy0+Zmlyc3RDaGlsZCgpKQotICAgICAg
ICAgICAgcmV0dXJuIGMtPnBvc2l0aW9uRm9yQ29vcmRpbmF0ZXMocGFyZW50QmxvY2tYIC0gY29u
dEJsb2NrLT54KCksIHBhcmVudEJsb2NrWSAtIGNvbnRCbG9jay0+eSgpKTsKLSAgICAgICAgYyA9
IHRvUmVuZGVyQmxvY2soYyktPmlubGluZUNvbnRpbnVhdGlvbigpOwotICAgIH0KLSAgICAKICAg
ICByZXR1cm4gUmVuZGVyQm94TW9kZWxPYmplY3Q6OnBvc2l0aW9uRm9yUG9pbnQocG9pbnQpOwog
fQogCkBAIC01NDksNyArMjkzLDcgQEAgSW50UmVjdCBSZW5kZXJJbmxpbmU6OmNsaXBwZWRPdmVy
Zmxvd1JlYwogICAgIC8vIE9ubHkgcnVuLWlucyBhcmUgYWxsb3dlZCBpbiBoZXJlIGR1cmluZyBs
YXlvdXQuCiAgICAgQVNTRVJUKCF2aWV3KCkgfHwgIXZpZXcoKS0+bGF5b3V0U3RhdGVFbmFibGVk
KCkgfHwgaXNSdW5JbigpKTsKIAotICAgIGlmICghZmlyc3RMaW5lQm94KCkgJiYgIWNvbnRpbnVh
dGlvbigpKQorICAgIGlmICghZmlyc3RMaW5lQm94KCkpCiAgICAgICAgIHJldHVybiBJbnRSZWN0
KCk7CiAKICAgICAvLyBGaW5kIG91ciBsZWZ0bW9zdCBwb3NpdGlvbi4KQEAgLTU5NywxMSArMzQx
LDYgQEAgSW50UmVjdCBSZW5kZXJJbmxpbmU6OmNsaXBwZWRPdmVyZmxvd1JlYwogICAgICAgICAg
ICAgICAgIHIudW5pdGUoY2hpbGRSZWN0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotCi0g
ICAgICAgIGlmIChjb250aW51YXRpb24oKSAmJiAhY29udGludWF0aW9uKCktPmlzSW5saW5lKCkp
IHsKLSAgICAgICAgICAgIEludFJlY3QgY29udFJlY3QgPSBjb250aW51YXRpb24oKS0+cmVjdFdp
dGhPdXRsaW5lRm9yUmVwYWludChyZXBhaW50Q29udGFpbmVyLCBvdyk7Ci0gICAgICAgICAgICBy
LnVuaXRlKGNvbnRSZWN0KTsKLSAgICAgICAgfQogICAgIH0KIAogICAgIHJldHVybiByOwpAQCAt
NjgwLDQ5ICs0MTksNiBAQCB2b2lkIFJlbmRlcklubGluZTo6Y29tcHV0ZVJlY3RGb3JSZXBhaW50
CiAgICAgby0+Y29tcHV0ZVJlY3RGb3JSZXBhaW50KHJlcGFpbnRDb250YWluZXIsIHJlY3QsIGZp
eGVkKTsKIH0KIAotdm9pZCBSZW5kZXJJbmxpbmU6OnVwZGF0ZURyYWdTdGF0ZShib29sIGRyYWdP
bikKLXsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdDo6dXBkYXRlRHJhZ1N0YXRlKGRyYWdPbik7
Ci0gICAgaWYgKGNvbnRpbnVhdGlvbigpKQotICAgICAgICBjb250aW51YXRpb24oKS0+dXBkYXRl
RHJhZ1N0YXRlKGRyYWdPbik7Ci19Ci0KLXZvaWQgUmVuZGVySW5saW5lOjpjaGlsZEJlY2FtZU5v
bklubGluZShSZW5kZXJPYmplY3QqIGNoaWxkKQotewotICAgIC8vIFdlIGhhdmUgdG8gc3BsaXQg
dGhlIHBhcmVudCBmbG93LgotICAgIFJlbmRlckJsb2NrKiBuZXdCb3ggPSBjb250YWluaW5nQmxv
Y2soKS0+Y3JlYXRlQW5vbnltb3VzQmxvY2soKTsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCog
b2xkQ29udGludWF0aW9uID0gY29udGludWF0aW9uKCk7Ci0gICAgc2V0Q29udGludWF0aW9uKG5l
d0JveCk7Ci0gICAgUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCA9IGNoaWxkLT5uZXh0U2libGlu
ZygpOwotICAgIGNoaWxkcmVuKCktPnJlbW92ZUNoaWxkTm9kZSh0aGlzLCBjaGlsZCk7Ci0gICAg
c3BsaXRGbG93KGJlZm9yZUNoaWxkLCBuZXdCb3gsIGNoaWxkLCBvbGRDb250aW51YXRpb24pOwot
fQotCi12b2lkIFJlbmRlcklubGluZTo6dXBkYXRlSGl0VGVzdFJlc3VsdChIaXRUZXN0UmVzdWx0
JiByZXN1bHQsIGNvbnN0IEludFBvaW50JiBwb2ludCkKLXsKLSAgICBpZiAocmVzdWx0LmlubmVy
Tm9kZSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBOb2RlKiBuID0gbm9kZSgpOwotICAgIElu
dFBvaW50IGxvY2FsUG9pbnQocG9pbnQpOwotICAgIGlmIChuKSB7Ci0gICAgICAgIGlmIChpc0lu
bGluZUNvbnRpbnVhdGlvbigpKSB7Ci0gICAgICAgICAgICAvLyBXZSdyZSBpbiB0aGUgY29udGlu
dWF0aW9uIG9mIGEgc3BsaXQgaW5saW5lLiAgQWRqdXN0IG91ciBsb2NhbCBwb2ludCB0byBiZSBp
biB0aGUgY29vcmRpbmF0ZSBzcGFjZQotICAgICAgICAgICAgLy8gb2YgdGhlIHByaW5jaXBhbCBy
ZW5kZXJlcidzIGNvbnRhaW5pbmcgYmxvY2suICBUaGlzIHdpbGwgZW5kIHVwIGJlaW5nIHRoZSBp
bm5lck5vblNoYXJlZE5vZGUuCi0gICAgICAgICAgICBSZW5kZXJCbG9jayogZmlyc3RCbG9jayA9
IG4tPnJlbmRlcmVyKCktPmNvbnRhaW5pbmdCbG9jaygpOwotICAgICAgICAgICAgCi0gICAgICAg
ICAgICAvLyBHZXQgb3VyIGNvbnRhaW5pbmcgYmxvY2suCi0gICAgICAgICAgICBSZW5kZXJCb3gq
IGJsb2NrID0gY29udGFpbmluZ0Jsb2NrKCk7Ci0gICAgICAgICAgICBsb2NhbFBvaW50Lm1vdmUo
YmxvY2stPngoKSAtIGZpcnN0QmxvY2stPngoKSwgYmxvY2stPnkoKSAtIGZpcnN0QmxvY2stPnko
KSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQuc2V0SW5uZXJOb2RlKG4pOwotICAgICAg
ICBpZiAoIXJlc3VsdC5pbm5lck5vblNoYXJlZE5vZGUoKSkKLSAgICAgICAgICAgIHJlc3VsdC5z
ZXRJbm5lck5vblNoYXJlZE5vZGUobik7Ci0gICAgICAgIHJlc3VsdC5zZXRMb2NhbFBvaW50KGxv
Y2FsUG9pbnQpOwotICAgIH0KLX0KLQogdm9pZCBSZW5kZXJJbmxpbmU6OmRpcnR5TGluZUJveGVz
KGJvb2wgZnVsbExheW91dCkKIHsKICAgICBpZiAoZnVsbExheW91dCkKQEAgLTgzMiwxNyArNTI4
LDYgQEAgdm9pZCBSZW5kZXJJbmxpbmU6OmFkZEZvY3VzUmluZ1JlY3RzKEdyYQogICAgICAgICAg
ICBjdXJyLT5hZGRGb2N1c1JpbmdSZWN0cyhncmFwaGljc0NvbnRleHQsIHBvcy54KCksIHBvcy55
KCkpOwogICAgICAgICB9CiAgICAgfQotCi0gICAgaWYgKGNvbnRpbnVhdGlvbigpKSB7Ci0gICAg
ICAgIGlmIChjb250aW51YXRpb24oKS0+aXNJbmxpbmUoKSkKLSAgICAgICAgICAgIGNvbnRpbnVh
dGlvbigpLT5hZGRGb2N1c1JpbmdSZWN0cyhncmFwaGljc0NvbnRleHQsIAotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4IC0gY29udGFpbmluZ0Jsb2NrKCkt
PngoKSArIGNvbnRpbnVhdGlvbigpLT5jb250YWluaW5nQmxvY2soKS0+eCgpLAotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5IC0gY29udGFpbmluZ0Jsb2Nr
KCktPnkoKSArIGNvbnRpbnVhdGlvbigpLT5jb250YWluaW5nQmxvY2soKS0+eSgpKTsKLSAgICAg
ICAgZWxzZQotICAgICAgICAgICAgY29udGludWF0aW9uKCktPmFkZEZvY3VzUmluZ1JlY3RzKGdy
YXBoaWNzQ29udGV4dCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgdHggLSBjb250YWluaW5nQmxvY2soKS0+eCgpICsgdG9SZW5kZXJCb3goY29udGludWF0
aW9uKCkpLT54KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgdHkgLSBjb250YWluaW5nQmxvY2soKS0+eSgpICsgdG9SZW5kZXJCb3goY29udGludWF0aW9u
KCkpLT55KCkpOwotICAgIH0KIH0KIAogdm9pZCBSZW5kZXJJbmxpbmU6OnBhaW50T3V0bGluZShH
cmFwaGljc0NvbnRleHQqIGdyYXBoaWNzQ29udGV4dCwgaW50IHR4LCBpbnQgdHkpCkluZGV4OiBX
ZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJJbmxpbmUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3Jl
bmRlcmluZy9SZW5kZXJJbmxpbmUuaAkocmV2aXNpb24gNDc0MzkpCisrKyBXZWJDb3JlL3JlbmRl
cmluZy9SZW5kZXJJbmxpbmUuaAkod29ya2luZyBjb3B5KQpAQCAtNTUsMTAgKzU1LDYgQEAgcHVi
bGljOgogCiAgICAgSW5saW5lRmxvd0JveCogZmlyc3RMaW5lQm94KCkgY29uc3QgeyByZXR1cm4g
bV9saW5lQm94ZXMuZmlyc3RMaW5lQm94KCk7IH0KICAgICBJbmxpbmVGbG93Qm94KiBsYXN0TGlu
ZUJveCgpIGNvbnN0IHsgcmV0dXJuIG1fbGluZUJveGVzLmxhc3RMaW5lQm94KCk7IH0KLQotICAg
IFJlbmRlckJveE1vZGVsT2JqZWN0KiBjb250aW51YXRpb24oKSBjb25zdCB7IHJldHVybiBtX2Nv
bnRpbnVhdGlvbjsgfQotCi0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZURyYWdTdGF0ZShib29sIGRy
YWdPbik7CiAgICAgCiAgICAgSW50U2l6ZSByZWxhdGl2ZVBvc2l0aW9uZWRJbmxpbmVPZmZzZXQo
Y29uc3QgUmVuZGVyQm94KiBjaGlsZCkgY29uc3Q7CiAKQEAgLTc4LDkgKzc0LDYgQEAgcHJpdmF0
ZToKIAogICAgIHZpcnR1YWwgYm9vbCBpc1JlbmRlcklubGluZSgpIGNvbnN0IHsgcmV0dXJuIHRy
dWU7IH0KIAotICAgIHZvaWQgYWRkQ2hpbGRUb0NvbnRpbnVhdGlvbihSZW5kZXJPYmplY3QqIG5l
d0NoaWxkLCBSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkKTsKLSAgICB2aXJ0dWFsIHZvaWQgYWRk
Q2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihSZW5kZXJPYmplY3QqIG5ld0NoaWxkLCBSZW5kZXJP
YmplY3QqIGJlZm9yZUNoaWxkID0gMCk7Ci0KICAgICB2b2lkIHNwbGl0SW5saW5lcyhSZW5kZXJC
bG9jayogZnJvbUJsb2NrLCBSZW5kZXJCbG9jayogdG9CbG9jaywgUmVuZGVyQmxvY2sqIG1pZGRs
ZUJsb2NrLAogICAgICAgICAgICAgICAgICAgICAgIFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQs
IFJlbmRlckJveE1vZGVsT2JqZWN0KiBvbGRDb250KTsKICAgICB2b2lkIHNwbGl0RmxvdyhSZW5k
ZXJPYmplY3QqIGJlZm9yZUNoaWxkLCBSZW5kZXJCbG9jayogbmV3QmxvY2tCb3gsCkBAIC0xMjAs
MTMgKzExMyw2IEBAIHByaXZhdGU6CiAKICAgICB2aXJ0dWFsIGludCBsaW5lSGVpZ2h0KGJvb2wg
Zmlyc3RMaW5lLCBib29sIGlzUm9vdExpbmVCb3ggPSBmYWxzZSkgY29uc3Q7CiAKLSAgICBSZW5k
ZXJJbmxpbmUqIGlubGluZUNvbnRpbnVhdGlvbigpIGNvbnN0OwotICAgIHZvaWQgc2V0Q29udGlu
dWF0aW9uKFJlbmRlckJveE1vZGVsT2JqZWN0KiBjKSB7IG1fY29udGludWF0aW9uID0gYzsgfQot
ICAgIAotICAgIHZpcnR1YWwgdm9pZCBjaGlsZEJlY2FtZU5vbklubGluZShSZW5kZXJPYmplY3Qq
IGNoaWxkKTsKLQotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVIaXRUZXN0UmVzdWx0KEhpdFRlc3RS
ZXN1bHQmLCBjb25zdCBJbnRQb2ludCYpOwotCiAgICAgdmlydHVhbCB2b2lkIGltYWdlQ2hhbmdl
ZChXcmFwcGVkSW1hZ2VQdHIsIGNvbnN0IEludFJlY3QqID0gMCk7CiAKICNpZiBFTkFCTEUoREFT
SEJPQVJEX1NVUFBPUlQpCkBAIC0xMzksMTMgKzEyNSwxMCBAQCBwcml2YXRlOgogICAgIHN0YXRp
YyBSZW5kZXJJbmxpbmUqIGNsb25lSW5saW5lKFJlbmRlcklubGluZSogc3JjKTsKIAogICAgIHZv
aWQgcGFpbnRPdXRsaW5lRm9yTGluZShHcmFwaGljc0NvbnRleHQqLCBpbnQgdHgsIGludCB0eSwg
Y29uc3QgSW50UmVjdCYgcHJldkxpbmUsIGNvbnN0IEludFJlY3QmIHRoaXNMaW5lLCBjb25zdCBJ
bnRSZWN0JiBuZXh0TGluZSk7Ci0gICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGNvbnRpbnVhdGlv
bkJlZm9yZShSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkKTsKIAogICAgIFJlbmRlck9iamVjdENo
aWxkTGlzdCBtX2NoaWxkcmVuOwogICAgIFJlbmRlckxpbmVCb3hMaXN0IG1fbGluZUJveGVzOyAg
IC8vIEFsbCBvZiB0aGUgbGluZSBib3hlcyBjcmVhdGVkIGZvciB0aGlzIGlubGluZSBmbG93LiAg
Rm9yIGV4YW1wbGUsIDxpPkhlbGxvPGJyPndvcmxkLjwvaT4gd2lsbCBoYXZlIHR3byA8aT4gbGlu
ZSBib3hlcy4KIAotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBtX2NvbnRpbnVhdGlvbjsgLy8g
Q2FuIGJlIGVpdGhlciBhIGJsb2NrIG9yIGFuIGlubGluZS4gPGI+PGk+PHA+SGVsbG88L3A+PC9p
PjwvYj4uIEluIHRoaXMgZXhhbXBsZSB0aGUgPGk+IHdpbGwgaGF2ZSBhIGJsb2NrIGFzIGl0cyBj
b250aW51YXRpb24gYnV0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgLy8gPGI+IHdpbGwganVzdCBoYXZlIGFuIGlubGluZSBhcyBpdHMgY29udGludWF0aW9u
LgogICAgIG11dGFibGUgaW50IG1fbGluZUhlaWdodDsKICAgICBtdXRhYmxlIGludCBtX3ZlcnRp
Y2FsUG9zaXRpb247CiB9OwpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3QuY3BwCShyZXZp
c2lvbiA0NzQ0MCkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdC5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTIxMTIsOCArMjExMiw2IEBAIHZvaWQgUmVuZGVyT2JqZWN0OjpnZXRUZXh0
RGVjb3JhdGlvbkNvbG8KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBjdXJyID0g
Y3Vyci0+cGFyZW50KCk7Ci0gICAgICAgIGlmIChjdXJyICYmIGN1cnItPmlzUmVuZGVyQmxvY2so
KSAmJiB0b1JlbmRlckJsb2NrKGN1cnIpLT5pbmxpbmVDb250aW51YXRpb24oKSkKLSAgICAgICAg
ICAgIGN1cnIgPSB0b1JlbmRlckJsb2NrKGN1cnIpLT5pbmxpbmVDb250aW51YXRpb24oKTsKICAg
ICB9IHdoaWxlIChjdXJyICYmIGRlY29yYXRpb25zICYmICghcXVpcmtzTW9kZSB8fCAhY3Vyci0+
bm9kZSgpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFjdXJyLT5u
b2RlKCktPmhhc1RhZ05hbWUoYVRhZykgJiYgIWN1cnItPm5vZGUoKS0+aGFzVGFnTmFtZShmb250
VGFnKSkpKTsKIApJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmgJKHJldmlzaW9uIDQ3NDQw
KQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmgJKHdvcmtpbmcgY29weSkKQEAg
LTM0Myw2ICszNDMsMTAgQEAgcHVibGljOgogICAgIHsKICAgICAgICAgcmV0dXJuIG1faXNBbm9u
eW1vdXMgJiYgc3R5bGUoKS0+ZGlzcGxheSgpID09IEJMT0NLICYmIHN0eWxlKCktPnN0eWxlVHlw
ZSgpID09IE5PUFNFVURPICYmICFpc0xpc3RNYXJrZXIoKTsKICAgICB9CisgICAgYm9vbCBpc0Fu
b255bW91c0lubGluZUJsb2NrKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX2lzQW5v
bnltb3VzICYmIHN0eWxlKCktPmRpc3BsYXkoKSA9PSBJTkxJTkVfQkxPQ0sgJiYgc3R5bGUoKS0+
c3R5bGVUeXBlKCkgPT0gTk9QU0VVRE87CisgICAgfQogICAgIGJvb2wgaXNJbmxpbmVDb250aW51
YXRpb24oKSBjb25zdCB7IHJldHVybiAobm9kZSgpID8gbm9kZSgpLT5yZW5kZXJlcigpICE9IHRo
aXMgOiBmYWxzZSkgJiYgaXNSZW5kZXJJbmxpbmUoKTsgfQogICAgIGJvb2wgaXNGbG9hdGluZygp
IGNvbnN0IHsgcmV0dXJuIG1fZmxvYXRpbmc7IH0KICAgICBib29sIGlzUG9zaXRpb25lZCgpIGNv
bnN0IHsgcmV0dXJuIG1fcG9zaXRpb25lZDsgfSAvLyBhYnNvbHV0ZSBvciBmaXhlZCBwb3NpdGlv
bmluZwpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0Q2hpbGRMaXN0LmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3RDaGlsZExpc3QuY3Bw
CShyZXZpc2lvbiA0NzQzOSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdENoaWxk
TGlzdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMxMSwxNiArMzExLDYgQEAgdm9pZCBSZW5kZXJP
YmplY3RDaGlsZExpc3Q6OnVwZGF0ZUJlZm9yZQogCiAgICAgLy8gV2hldGhlciBvciBub3Qgd2Ug
bm93IHdhbnQgZ2VuZXJhdGVkIGNvbnRlbnQuICAKICAgICBib29sIG5ld0NvbnRlbnRXYW50ZWQg
PSBwc2V1ZG9FbGVtZW50U3R5bGUgJiYgcHNldWRvRWxlbWVudFN0eWxlLT5kaXNwbGF5KCkgIT0g
Tk9ORTsKLQotICAgIC8vIEZvciA8cT48cC8+PC9xPiwgaWYgdGhpcyBvYmplY3QgaXMgdGhlIGlu
bGluZSBjb250aW51YXRpb24gb2YgdGhlIDxxPiwgd2Ugb25seSB3YW50IHRvIGdlbmVyYXRlCi0g
ICAgLy8gOmFmdGVyIGNvbnRlbnQgYW5kIG5vdCA6YmVmb3JlIGNvbnRlbnQuCi0gICAgaWYgKG5l
d0NvbnRlbnRXYW50ZWQgJiYgdHlwZSA9PSBCRUZPUkUgJiYgb3duZXItPmlzUmVuZGVySW5saW5l
KCkgJiYgdG9SZW5kZXJJbmxpbmUob3duZXIpLT5pc0lubGluZUNvbnRpbnVhdGlvbigpKQotICAg
ICAgICBuZXdDb250ZW50V2FudGVkID0gZmFsc2U7Ci0KLSAgICAvLyBTaW1pbGFybHksIGlmIHdl
J3JlIHRoZSBiZWdpbm5pbmcgb2YgYSA8cT4sIGFuZCB0aGVyZSdzIGFuIGlubGluZSBjb250aW51
YXRpb24gZm9yIG91ciBvYmplY3QsCi0gICAgLy8gdGhlbiB3ZSBkb24ndCBnZW5lcmF0ZSB0aGUg
OmFmdGVyIGNvbnRlbnQuCi0gICAgaWYgKG5ld0NvbnRlbnRXYW50ZWQgJiYgdHlwZSA9PSBBRlRF
UiAmJiBvd25lci0+aXNSZW5kZXJJbmxpbmUoKSAmJiB0b1JlbmRlcklubGluZShvd25lciktPmNv
bnRpbnVhdGlvbigpKQotICAgICAgICBuZXdDb250ZW50V2FudGVkID0gZmFsc2U7CiAgICAgCiAg
ICAgLy8gSWYgd2UgZG9uJ3Qgd2FudCBnZW5lcmF0ZWQgY29udGVudCBhbnkgbG9uZ2VyLCBvciBp
ZiB3ZSBoYXZlIGdlbmVyYXRlZCBjb250ZW50LCBidXQgaXQncyBubyBsb25nZXIKICAgICAvLyBp
ZGVudGljYWwgdG8gdGhlIG5ldyBjb250ZW50IGRhdGEgd2Ugd2FudCB0byBidWlsZCByZW5kZXIg
b2JqZWN0cyBmb3IsIHRoZW4gd2UgbnVrZSBhbGwKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1Jv
b3RJbmxpbmVCb3guY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1Jvb3RJbmxp
bmVCb3guY3BwCShyZXZpc2lvbiA0NzQ0MCkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1Jvb3RJbmxp
bmVCb3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00MjksNCArNDI5LDkgQEAgdm9pZCBSb290SW5s
aW5lQm94OjphdHRhY2hMaW5lQm94VG9SZW5kZQogICAgIGJsb2NrKCktPmxpbmVCb3hlcygpLT5h
dHRhY2hMaW5lQm94KHRoaXMpOwogfQogCitSZW5kZXJCbG9jayogUm9vdElubGluZUJveDo6YW5v
bnltb3VzSW5saW5lQmxvY2soKSBjb25zdAoreworICAgIHJldHVybiBmaXJzdENoaWxkKCkgJiYg
Zmlyc3RDaGlsZCgpID09IGxhc3RDaGlsZCgpICYmIGZpcnN0Q2hpbGQoKS0+cmVuZGVyZXIoKS0+
aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpID8gdG9SZW5kZXJCbG9jayhmaXJzdENoaWxkKCktPnJl
bmRlcmVyKCkpIDogMDsKK30KKwogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29y
ZS9yZW5kZXJpbmcvUm9vdElubGluZUJveC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVy
aW5nL1Jvb3RJbmxpbmVCb3guaAkocmV2aXNpb24gNDc0NDApCisrKyBXZWJDb3JlL3JlbmRlcmlu
Zy9Sb290SW5saW5lQm94LmgJKHdvcmtpbmcgY29weSkKQEAgLTEzNCw2ICsxMzQsOCBAQCBwdWJs
aWM6CiAgICAgdmlydHVhbCB2b2lkIGF0dGFjaExpbmVCb3hUb1JlbmRlck9iamVjdCgpOwogICAg
IHZpcnR1YWwgdm9pZCByZW1vdmVMaW5lQm94RnJvbVJlbmRlck9iamVjdCgpOwogCisgICAgUmVu
ZGVyQmxvY2sqIGFub255bW91c0lubGluZUJsb2NrKCkgY29uc3Q7CisKIHByb3RlY3RlZDoKICAg
ICAvLyBXaGVyZSB0aGlzIGxpbmUgZW5kZWQuICBUaGUgZXhhY3Qgb2JqZWN0IGFuZCB0aGUgcG9z
aXRpb24gd2l0aGluIHRoYXQgb2JqZWN0IGFyZSBzdG9yZWQgc28gdGhhdAogICAgIC8vIHdlIGNh
biBjcmVhdGUgYW4gSW5saW5lSXRlcmF0b3IgYmVnaW5uaW5nIGp1c3QgYWZ0ZXIgdGhlIGVuZCBv
ZiB0aGlzIGxpbmUuCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>38435</attachid>
            <date>2009-08-22 12:33:26 -0700</date>
            <delta_ts>2009-08-22 14:04:44 -0700</delta_ts>
            <desc>This patch fixes a bunch of bugs in margin collapsing and pref width calculations.  </desc>
            <filename>patch.txt</filename>
            <type>text/plain</type>
            <size>69587</size>
            <attacher name="Dave Hyatt">hyatt</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0LmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eVJlbmRl
ck9iamVjdC5jcHAJKHJldmlzaW9uIDQ3NTkxKQorKysgV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0Fj
Y2Vzc2liaWxpdHlSZW5kZXJPYmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01MjMsMTIgKzUy
Myw4IEBAIEVsZW1lbnQqIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmFuY2gKICAgICBSZW5k
ZXJPYmplY3QqIGN1cnJSZW5kZXJlcjsKICAgICAKICAgICAvLyBTZWFyY2ggdXAgdGhlIHJlbmRl
ciB0cmVlIGZvciBhIFJlbmRlck9iamVjdCB3aXRoIGEgRE9NIG5vZGUuICBEZWZlciB0byBhbiBl
YXJsaWVyIGNvbnRpbnVhdGlvbiwgdGhvdWdoLgotICAgIGZvciAoY3VyclJlbmRlcmVyID0gbV9y
ZW5kZXJlcjsgY3VyclJlbmRlcmVyICYmICFjdXJyUmVuZGVyZXItPm5vZGUoKTsgY3VyclJlbmRl
cmVyID0gY3VyclJlbmRlcmVyLT5wYXJlbnQoKSkgewotICAgICAgICBpZiAoY3VyclJlbmRlcmVy
LT5pc1JlbmRlckJsb2NrKCkpIHsKLSAgICAgICAgICAgIFJlbmRlcklubGluZSogY29udGludWF0
aW9uID0gdG9SZW5kZXJCbG9jayhjdXJyUmVuZGVyZXIpLT5pbmxpbmVDb250aW51YXRpb24oKTsK
LSAgICAgICAgICAgIGlmIChjb250aW51YXRpb24pCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNh
Y2hlLT5nZXRPckNyZWF0ZShjb250aW51YXRpb24pLT5hbmNob3JFbGVtZW50KCk7Ci0gICAgICAg
IH0KKyAgICBmb3IgKGN1cnJSZW5kZXJlciA9IG1fcmVuZGVyZXI7IGN1cnJSZW5kZXJlciAmJiAh
Y3VyclJlbmRlcmVyLT5ub2RlKCk7IGN1cnJSZW5kZXJlciA9IGN1cnJSZW5kZXJlci0+cGFyZW50
KCkpCisgICAgewogICAgIH0KICAgICAKICAgICAvLyBiYWlsIGlmIG5vbmUgZm91bmQKSW5kZXg6
IFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUZsb3dCb3guY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvcmVuZGVyaW5nL0lubGluZUZsb3dCb3guY3BwCShyZXZpc2lvbiA0NzU5MSkKKysrIFdlYkNv
cmUvcmVuZGVyaW5nL0lubGluZUZsb3dCb3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMjcsMTQg
KzIyNywxMyBAQCB2b2lkIElubGluZUZsb3dCb3g6OmRldGVybWluZVNwYWNpbmdGb3JGCiAgICAg
ICAgIC8vICgzKSBUaGUgbGluZSBtYXkgZW5kIG9uIHRoZSBpbmxpbmUuICBJZiB3ZSBhcmUgdGhl
IGxhc3QgY2hpbGQgKGNsaW1iaW5nIHVwCiAgICAgICAgIC8vIHRoZSBlbmQgb2JqZWN0J3MgY2hh
aW4pLCB0aGVuIHdlIGp1c3QgY2xvc2VkIGFzIHdlbGwuCiAgICAgICAgIGlmICghbGluZUJveExp
c3QtPmxhc3RMaW5lQm94KCktPmlzQ29uc3RydWN0ZWQoKSkgewotICAgICAgICAgICAgUmVuZGVy
SW5saW5lKiBpbmxpbmVGbG93ID0gdG9SZW5kZXJJbmxpbmUocmVuZGVyZXIoKSk7CiAgICAgICAg
ICAgICBpZiAobHRyKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFuZXh0TGluZUJveCgpICYmCi0g
ICAgICAgICAgICAgICAgICAgICgobGFzdExpbmUgJiYgIWlubGluZUZsb3ctPmNvbnRpbnVhdGlv
bigpKSB8fCBuZXh0T25MaW5lRXhpc3RzKCkgfHwgb25FbmRDaGFpbihlbmRPYmplY3QpKSkKKyAg
ICAgICAgICAgICAgICAgICAgKGxhc3RMaW5lIHx8IG5leHRPbkxpbmVFeGlzdHMoKSB8fCBvbkVu
ZENoYWluKGVuZE9iamVjdCkpKQogICAgICAgICAgICAgICAgICAgICBpbmNsdWRlUmlnaHRFZGdl
ID0gdHJ1ZTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKCghcHJl
dkxpbmVCb3goKSB8fCBwcmV2TGluZUJveCgpLT5pc0NvbnN0cnVjdGVkKCkpICYmCi0gICAgICAg
ICAgICAgICAgICAgICgobGFzdExpbmUgJiYgIWlubGluZUZsb3ctPmNvbnRpbnVhdGlvbigpKSB8
fCBwcmV2T25MaW5lRXhpc3RzKCkgfHwgb25FbmRDaGFpbihlbmRPYmplY3QpKSkKKyAgICAgICAg
ICAgICAgICAgICAgKGxhc3RMaW5lIHx8IHByZXZPbkxpbmVFeGlzdHMoKSB8fCBvbkVuZENoYWlu
KGVuZE9iamVjdCkpKQogICAgICAgICAgICAgICAgICAgICBpbmNsdWRlTGVmdEVkZ2UgPSB0cnVl
OwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC01MDQsNyArNTAzLDcgQEAgdm9pZCBJbmxp
bmVGbG93Qm94OjpwbGFjZUJveGVzVmVydGljYWxseQogICAgICAgICAgICAgICAgIG5ld1kgLT0g
Y3Vyci0+Ym94TW9kZWxPYmplY3QoKS0+Ym9yZGVyVG9wKCkgKyBjdXJyLT5ib3hNb2RlbE9iamVj
dCgpLT5wYWRkaW5nVG9wKCk7CiAgICAgICAgIH0gZWxzZSBpZiAoIWN1cnItPnJlbmRlcmVyKCkt
PmlzQlIoKSkgewogICAgICAgICAgICAgUmVuZGVyQm94KiBib3ggPSB0b1JlbmRlckJveChjdXJy
LT5yZW5kZXJlcigpKTsKLSAgICAgICAgICAgIG5ld1kgKz0gYm94LT5tYXJnaW5Ub3AoKTsKKyAg
ICAgICAgICAgIG5ld1kgKz0gY3Vyci0+cmVuZGVyZXIoKS0+aXNBbm9ueW1vdXNJbmxpbmVCbG9j
aygpID8gMCA6IGJveC0+bWFyZ2luVG9wKCk7CiAgICAgICAgIH0KIAogICAgICAgICBjdXJyLT5z
ZXRZKG5ld1kpOwpAQCAtNjQzLDEzICs2NDIsNyBAQCB2b2lkIElubGluZUZsb3dCb3g6OnBhaW50
KFJlbmRlck9iamVjdDo6CiAgICAgICAgICAgICAvLyBvdXRsaW5lcy4KICAgICAgICAgICAgIGlm
IChyZW5kZXJlcigpLT5zdHlsZSgpLT52aXNpYmlsaXR5KCkgPT0gVklTSUJMRSAmJiByZW5kZXJl
cigpLT5oYXNPdXRsaW5lKCkgJiYgIWlzUm9vdElubGluZUJveCgpKSB7CiAgICAgICAgICAgICAg
ICAgUmVuZGVySW5saW5lKiBpbmxpbmVGbG93ID0gdG9SZW5kZXJJbmxpbmUocmVuZGVyZXIoKSk7
Ci0gICAgICAgICAgICAgICAgaWYgKChpbmxpbmVGbG93LT5jb250aW51YXRpb24oKSB8fCBpbmxp
bmVGbG93LT5pc0lubGluZUNvbnRpbnVhdGlvbigpKSAmJiAhYm94TW9kZWxPYmplY3QoKS0+aGFz
U2VsZlBhaW50aW5nTGF5ZXIoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBBZGQgb3Vyc2Vs
dmVzIHRvIHRoZSBjb250YWluaW5nIGJsb2NrIG9mIHRoZSBlbnRpcmUgY29udGludWF0aW9uIHNv
IHRoYXQgaXQgY2FuCi0gICAgICAgICAgICAgICAgICAgIC8vIHBhaW50IHVzIGF0b21pY2FsbHku
Ci0gICAgICAgICAgICAgICAgICAgIFJlbmRlckJsb2NrKiBibG9jayA9IHJlbmRlcmVyKCktPmNv
bnRhaW5pbmdCbG9jaygpLT5jb250YWluaW5nQmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAg
YmxvY2stPmFkZENvbnRpbnVhdGlvbldpdGhPdXRsaW5lKHRvUmVuZGVySW5saW5lKHJlbmRlcmVy
KCktPm5vZGUoKS0+cmVuZGVyZXIoKSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlu
bGluZUZsb3ctPmlzSW5saW5lQ29udGludWF0aW9uKCkpCi0gICAgICAgICAgICAgICAgICAgIHBh
aW50SW5mby5vdXRsaW5lT2JqZWN0cy0+YWRkKGlubGluZUZsb3cpOworICAgICAgICAgICAgICAg
IHBhaW50SW5mby5vdXRsaW5lT2JqZWN0cy0+YWRkKGlubGluZUZsb3cpOwogICAgICAgICAgICAg
fQogICAgICAgICB9IGVsc2UgaWYgKHBhaW50SW5mby5waGFzZSA9PSBQYWludFBoYXNlTWFzaykg
ewogICAgICAgICAgICAgcGFpbnRNYXNrKHBhaW50SW5mbywgdHgsIHR5KTsKSW5kZXg6IFdlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRl
cmluZy9SZW5kZXJCbG9jay5jcHAJKHJldmlzaW9uIDQ3NjQzKQorKysgV2ViQ29yZS9yZW5kZXJp
bmcvUmVuZGVyQmxvY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC04Miw4ICs4Miw2IEBAIHN0YXRp
YyBQZXJjZW50SGVpZ2h0RGVzY2VuZGFudHNNYXAqIGdQZXIKIAogdHlwZWRlZiBXVEY6Okhhc2hN
YXA8Y29uc3QgUmVuZGVyQm94KiwgSGFzaFNldDxSZW5kZXJCbG9jayo+Kj4gUGVyY2VudEhlaWdo
dENvbnRhaW5lck1hcDsKIHN0YXRpYyBQZXJjZW50SGVpZ2h0Q29udGFpbmVyTWFwKiBnUGVyY2Vu
dEhlaWdodENvbnRhaW5lck1hcCA9IDA7Ci0gICAgCi10eXBlZGVmIFdURjo6SGFzaE1hcDxSZW5k
ZXJCbG9jayosIExpc3RIYXNoU2V0PFJlbmRlcklubGluZSo+Kj4gQ29udGludWF0aW9uT3V0bGlu
ZVRhYmxlTWFwOwogCiB0eXBlZGVmIFdURjo6SGFzaFNldDxSZW5kZXJCbG9jayo+IERlbGF5ZWRV
cGRhdGVTY3JvbGxJbmZvU2V0Owogc3RhdGljIGludCBnRGVsYXlVcGRhdGVTY3JvbGxJbmZvID0g
MDsKQEAgLTk2LDcgKzk0LDcgQEAgUmVuZGVyQmxvY2s6Ok1hcmdpbkluZm86Ok1hcmdpbkluZm8o
UmVuZAogICAgIC8vIGlmIHdlIGhhZCBhbnkgYm9yZGVyL3BhZGRpbmcgKG9idmlvdXNseSksIGlm
IHdlJ3JlIHRoZSByb290IG9yIEhUTUwgZWxlbWVudHMsIG9yIGlmCiAgICAgLy8gd2UncmUgcG9z
aXRpb25lZCwgZmxvYXRpbmcsIGEgdGFibGUgY2VsbC4KICAgICBtX2NhbkNvbGxhcHNlV2l0aENo
aWxkcmVuID0gIWJsb2NrLT5pc1JlbmRlclZpZXcoKSAmJiAhYmxvY2stPmlzUm9vdCgpICYmICFi
bG9jay0+aXNQb3NpdGlvbmVkKCkgJiYKLSAgICAgICAgIWJsb2NrLT5pc0Zsb2F0aW5nKCkgJiYg
IWJsb2NrLT5pc1RhYmxlQ2VsbCgpICYmICFibG9jay0+aGFzT3ZlcmZsb3dDbGlwKCkgJiYgIWJs
b2NrLT5pc0lubGluZUJsb2NrT3JJbmxpbmVUYWJsZSgpOworICAgICAgICAhYmxvY2stPmlzRmxv
YXRpbmcoKSAmJiAhYmxvY2stPmlzVGFibGVDZWxsKCkgJiYgIWJsb2NrLT5oYXNPdmVyZmxvd0Ns
aXAoKSAmJiAoIWJsb2NrLT5pc0lubGluZUJsb2NrT3JJbmxpbmVUYWJsZSgpIHx8IGJsb2NrLT5p
c0Fub255bW91c0lubGluZUJsb2NrKCkpOwogCiAgICAgbV9jYW5Db2xsYXBzZVRvcFdpdGhDaGls
ZHJlbiA9IG1fY2FuQ29sbGFwc2VXaXRoQ2hpbGRyZW4gJiYgKHRvcCA9PSAwKSAmJiBibG9jay0+
c3R5bGUoKS0+bWFyZ2luVG9wQ29sbGFwc2UoKSAhPSBNU0VQQVJBVEU7CiAKQEAgLTEyNyw3ICsx
MjUsNiBAQCBSZW5kZXJCbG9jazo6UmVuZGVyQmxvY2soTm9kZSogbm9kZSkKICAgICAgIDogUmVu
ZGVyQm94KG5vZGUpCiAgICAgICAsIG1fZmxvYXRpbmdPYmplY3RzKDApCiAgICAgICAsIG1fcG9z
aXRpb25lZE9iamVjdHMoMCkKLSAgICAgICwgbV9pbmxpbmVDb250aW51YXRpb24oMCkKICAgICAg
ICwgbV9tYXhNYXJnaW4oMCkKICAgICAgICwgbV9saW5lSGVpZ2h0KC0xKQogewpAQCAtMTY1LDEx
ICsxNjIsNiBAQCBSZW5kZXJCbG9jazo6flJlbmRlckJsb2NrKCkKIAogdm9pZCBSZW5kZXJCbG9j
azo6ZGVzdHJveSgpCiB7Ci0gICAgLy8gRGV0YWNoIG91ciBjb250aW51YXRpb24gZmlyc3QuCi0g
ICAgaWYgKG1faW5saW5lQ29udGludWF0aW9uKQotICAgICAgICBtX2lubGluZUNvbnRpbnVhdGlv
bi0+ZGVzdHJveSgpOwotICAgIG1faW5saW5lQ29udGludWF0aW9uID0gMDsKLSAgICAKICAgICAv
LyBNYWtlIHN1cmUgdG8gZGVzdHJveSBhbm9ueW1vdXMgY2hpbGRyZW4gZmlyc3Qgd2hpbGUgdGhl
eSBhcmUgc3RpbGwgY29ubmVjdGVkIHRvIHRoZSByZXN0IG9mIHRoZSB0cmVlLCBzbyB0aGF0IHRo
ZXkgd2lsbAogICAgIC8vIHByb3Blcmx5IGRpcnR5IGxpbmUgYm94ZXMgdGhhdCB0aGV5IGFyZSBy
ZW1vdmVkIGZyb20uICBFZmZlY3RzIHRoYXQgZG8gOmJlZm9yZS86YWZ0ZXIgb25seSBvbiBob3Zl
ciBjb3VsZCBjcmFzaCBvdGhlcndpc2UuCiAgICAgY2hpbGRyZW4oKS0+ZGVzdHJveUxlZnRvdmVy
Q2hpbGRyZW4oKTsKQEAgLTMyMCw3ICszMTIsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjphZGRDaGls
ZChSZW5kZXJPYmplY3QqCiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFjaGlsZHJlbklubGlu
ZSgpICYmIChuZXdDaGlsZC0+aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpIHx8IG5ld0NoaWxkLT5p
c0lubGluZSgpKSkgewogICAgICAgICAvLyBJZiB3ZSdyZSBpbnNlcnRpbmcgYW4gaW5saW5lIGNo
aWxkIGJ1dCBhbGwgb2Ygb3VyIGNoaWxkcmVuIGFyZSBibG9ja3MsIHRoZW4gd2UgaGF2ZSB0byBt
YWtlIHN1cmUKLSAgICAgICAgLy8gaXQgaXMgcHV0IGludG8gYW4gYW5vbXlvdXMgYmxvY2sgYm94
LiBXZSB0cnkgdG8gdXNlIGFuIGV4aXN0aW5nIGFub255bW91cyBib3ggaWYgcG9zc2libGUsIG90
aGVyd2lzZQorICAgICAgICAvLyBpdCBpcyBwdXQgaW50byBhbiBhbm9ueW1vdXMgYmxvY2sgYm94
LiBXZSB0cnkgdG8gdXNlIGFuIGV4aXN0aW5nIGFub255bW91cyBib3ggaWYgcG9zc2libGUsIG90
aGVyd2lzZQogICAgICAgICAvLyBhIG5ldyBvbmUgaXMgY3JlYXRlZCBhbmQgaW5zZXJ0ZWQgaW50
byBvdXIgbGlzdCBvZiBjaGlsZHJlbiBpbiB0aGUgYXBwcm9wcmlhdGUgcG9zaXRpb24uCiAgICAg
ICAgIFJlbmRlck9iamVjdCogYWZ0ZXJDaGlsZCA9IGJlZm9yZUNoaWxkID8gYmVmb3JlQ2hpbGQt
PnByZXZpb3VzU2libGluZygpIDogbGFzdENoaWxkKCk7CiAKQEAgLTQ1Niw5ICs0NDgsNiBAQCB2
b2lkIFJlbmRlckJsb2NrOjpyZW1vdmVMZWZ0b3ZlckFub255bW91CiAgICAgQVNTRVJUKGNoaWxk
LT5pc0Fub255bW91c0Jsb2NrKCkpOwogICAgIEFTU0VSVCghY2hpbGQtPmNoaWxkcmVuSW5saW5l
KCkpOwogICAgIAotICAgIGlmIChjaGlsZC0+aW5saW5lQ29udGludWF0aW9uKCkpIAotICAgICAg
ICByZXR1cm47Ci0gICAgCiAgICAgUmVuZGVyT2JqZWN0KiBmaXJzdEFuQ2hpbGQgPSBjaGlsZC0+
bV9jaGlsZHJlbi5maXJzdENoaWxkKCk7CiAgICAgUmVuZGVyT2JqZWN0KiBsYXN0QW5DaGlsZCA9
IGNoaWxkLT5tX2NoaWxkcmVuLmxhc3RDaGlsZCgpOwogICAgIGlmIChmaXJzdEFuQ2hpbGQpIHsK
QEAgLTUwMSw3ICs0OTAsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjpyZW1vdmVDaGlsZChSZW5kZXJP
YmplCiAgICAgUmVuZGVyT2JqZWN0KiBwcmV2ID0gb2xkQ2hpbGQtPnByZXZpb3VzU2libGluZygp
OwogICAgIFJlbmRlck9iamVjdCogbmV4dCA9IG9sZENoaWxkLT5uZXh0U2libGluZygpOwogICAg
IGJvb2wgY2FuRGVsZXRlQW5vbnltb3VzQmxvY2tzID0gIWRvY3VtZW50QmVpbmdEZXN0cm95ZWQo
KSAmJiAhaXNJbmxpbmUoKSAmJiAhb2xkQ2hpbGQtPmlzSW5saW5lKCkgJiYgCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAoIW9sZENoaWxkLT5pc1JlbmRlckJsb2NrKCkgfHwg
IXRvUmVuZGVyQmxvY2sob2xkQ2hpbGQpLT5pbmxpbmVDb250aW51YXRpb24oKSkgJiYgCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhb2xkQ2hpbGQtPmlzUmVuZGVyQmxvY2so
KSAmJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghcHJldiB8fCAocHJl
di0+aXNBbm9ueW1vdXNCbG9jaygpICYmIHByZXYtPmNoaWxkcmVuSW5saW5lKCkpKSAmJgogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFuZXh0IHx8IChuZXh0LT5pc0Fub255
bW91c0Jsb2NrKCkgJiYgbmV4dC0+Y2hpbGRyZW5JbmxpbmUoKSkpOwogICAgIGlmIChjYW5EZWxl
dGVBbm9ueW1vdXNCbG9ja3MgJiYgcHJldiAmJiBuZXh0KSB7CkBAIC01NzQsOSArNTYzLDE1IEBA
IGJvb2wgUmVuZGVyQmxvY2s6OmlzU2VsZkNvbGxhcHNpbmdCbG9jaygKICAgICAvLyBvbiB3aGV0
aGVyIHdlIGhhdmUgY29udGVudCB0aGF0IGlzIGFsbCBzZWxmLWNvbGxhcHNpbmcgb3Igbm90Lgog
ICAgIGlmIChoYXNBdXRvSGVpZ2h0IHx8ICgoc3R5bGUoKS0+aGVpZ2h0KCkuaXNGaXhlZCgpIHx8
IHN0eWxlKCktPmhlaWdodCgpLmlzUGVyY2VudCgpKSAmJiBzdHlsZSgpLT5oZWlnaHQoKS5pc1pl
cm8oKSkpIHsKICAgICAgICAgLy8gSWYgdGhlIGJsb2NrIGhhcyBpbmxpbmUgY2hpbGRyZW4sIHNl
ZSBpZiB3ZSBnZW5lcmF0ZWQgYW55IGxpbmUgYm94ZXMuICBJZiB3ZSBoYXZlIGFueQotICAgICAg
ICAvLyBsaW5lIGJveGVzLCB0aGVuIHdlIGNhbid0IGJlIHNlbGYtY29sbGFwc2luZywgc2luY2Ug
d2UgaGF2ZSBjb250ZW50LgotICAgICAgICBpZiAoY2hpbGRyZW5JbmxpbmUoKSkKLSAgICAgICAg
ICAgIHJldHVybiAhZmlyc3RMaW5lQm94KCk7CisgICAgICAgIC8vIGxpbmUgYm94ZXMsIHRoZW4g
d2UgY2FuIG9ubHkgYmUgc2VsZi1jb2xsYXBzaW5nIGlmIHdlIGhhdmUgbm90aGluZyBidXQgYW5v
bnltb3VzIGlubGluZSBibG9ja3MKKyAgICAgICAgLy8gdGhhdCBhcmUgYWxzbyBzZWxmLWNvbGxh
cHNpbmcgaW5zaWRlIHVzLgorICAgICAgICBpZiAoY2hpbGRyZW5JbmxpbmUoKSkgeworICAgICAg
ICAgICAgZm9yIChSb290SW5saW5lQm94KiBjaGlsZCA9IGZpcnN0Um9vdEJveCgpOyBjaGlsZDsg
Y2hpbGQgPSBjaGlsZC0+bmV4dFJvb3RCb3goKSkgeworICAgICAgICAgICAgICAgIGlmICghY2hp
bGQtPmFub255bW91c0lubGluZUJsb2NrKCkgfHwgIWNoaWxkLT5hbm9ueW1vdXNJbmxpbmVCbG9j
aygpLT5pc1NlbGZDb2xsYXBzaW5nQmxvY2soKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIFdlIGhh
dmUgbm8gbGluZSBib3hlcywgc28gd2UgbXVzdCBiZSBzZWxmLWNvbGxhcHNpbmcuCisgICAgICAg
IH0KICAgICAgICAgCiAgICAgICAgIC8vIFdoZXRoZXIgb3Igbm90IHdlIGNvbGxhcHNlIGlzIGRl
cGVuZGVudCBvbiB3aGV0aGVyIGFsbCBvdXIgbm9ybWFsIGZsb3cgY2hpbGRyZW4KICAgICAgICAg
Ly8gYXJlIGFsc28gc2VsZi1jb2xsYXBzaW5nLgpAQCAtODI5LDcgKzgyNCw4IEBAIHZvaWQgUmVu
ZGVyQmxvY2s6OmFkZE92ZXJmbG93RnJvbUZsb2F0cygKIAogYm9vbCBSZW5kZXJCbG9jazo6ZXhw
YW5kc1RvRW5jbG9zZU92ZXJoYW5naW5nRmxvYXRzKCkgY29uc3QKIHsKLSAgICByZXR1cm4gaXNJ
bmxpbmVCbG9ja09ySW5saW5lVGFibGUoKSB8fCBpc0Zsb2F0aW5nT3JQb3NpdGlvbmVkKCkgfHwg
aGFzT3ZlcmZsb3dDbGlwKCkgfHwgKHBhcmVudCgpICYmIHBhcmVudCgpLT5pc0ZsZXhpYmxlQm94
KCkpIHx8IGhhc0NvbHVtbnMoKSB8fCBpc1RhYmxlQ2VsbCgpIHx8IGlzRmllbGRzZXQoKTsKKyAg
ICByZXR1cm4gaXNGbG9hdGluZ09yUG9zaXRpb25lZCgpIHx8IGhhc092ZXJmbG93Q2xpcCgpIHx8
IChwYXJlbnQoKSAmJiBwYXJlbnQoKS0+aXNGbGV4aWJsZUJveCgpKSB8fCBoYXNDb2x1bW5zKCkg
fHwgaXNUYWJsZUNlbGwoKSB8fCBpc0ZpZWxkc2V0KCkgfHwKKyAgICAgICAgICAgKGlzSW5saW5l
QmxvY2tPcklubGluZVRhYmxlKCkgJiYgIWlzQW5vbnltb3VzSW5saW5lQmxvY2soKSk7CiB9CiAK
IHZvaWQgUmVuZGVyQmxvY2s6OmFkanVzdFBvc2l0aW9uZWRCbG9jayhSZW5kZXJCb3gqIGNoaWxk
LCBjb25zdCBNYXJnaW5JbmZvJiBtYXJnaW5JbmZvKQpAQCAtMTcyMSwyMCArMTcxNyw3IEBAIHZv
aWQgUmVuZGVyQmxvY2s6OnBhaW50T2JqZWN0KFBhaW50SW5mbyYKICAgICBpZiAoKHBhaW50UGhh
c2UgPT0gUGFpbnRQaGFzZU91dGxpbmUgfHwgcGFpbnRQaGFzZSA9PSBQYWludFBoYXNlU2VsZk91
dGxpbmUpICYmIGhhc091dGxpbmUoKSAmJiBzdHlsZSgpLT52aXNpYmlsaXR5KCkgPT0gVklTSUJM
RSkKICAgICAgICAgcGFpbnRPdXRsaW5lKHBhaW50SW5mby5jb250ZXh0LCB0eCwgdHksIHdpZHRo
KCksIGhlaWdodCgpLCBzdHlsZSgpKTsKIAotICAgIC8vIDYuIHBhaW50IGNvbnRpbnVhdGlvbiBv
dXRsaW5lcy4KLSAgICBpZiAoKHBhaW50UGhhc2UgPT0gUGFpbnRQaGFzZU91dGxpbmUgfHwgcGFp
bnRQaGFzZSA9PSBQYWludFBoYXNlQ2hpbGRPdXRsaW5lcykpIHsKLSAgICAgICAgaWYgKGlubGlu
ZUNvbnRpbnVhdGlvbigpICYmIGlubGluZUNvbnRpbnVhdGlvbigpLT5oYXNPdXRsaW5lKCkgJiYg
aW5saW5lQ29udGludWF0aW9uKCktPnN0eWxlKCktPnZpc2liaWxpdHkoKSA9PSBWSVNJQkxFKSB7
Ci0gICAgICAgICAgICBSZW5kZXJJbmxpbmUqIGlubGluZVJlbmRlcmVyID0gdG9SZW5kZXJJbmxp
bmUoaW5saW5lQ29udGludWF0aW9uKCktPm5vZGUoKS0+cmVuZGVyZXIoKSk7Ci0gICAgICAgICAg
ICBpZiAoIWlubGluZVJlbmRlcmVyLT5oYXNTZWxmUGFpbnRpbmdMYXllcigpKQotICAgICAgICAg
ICAgICAgIGNvbnRhaW5pbmdCbG9jaygpLT5hZGRDb250aW51YXRpb25XaXRoT3V0bGluZShpbmxp
bmVSZW5kZXJlcik7Ci0gICAgICAgICAgICBlbHNlIGlmICghaW5saW5lUmVuZGVyZXItPmZpcnN0
TGluZUJveCgpKQotICAgICAgICAgICAgICAgIGlubGluZVJlbmRlcmVyLT5wYWludE91dGxpbmUo
cGFpbnRJbmZvLmNvbnRleHQsIHR4IC0geCgpICsgaW5saW5lUmVuZGVyZXItPmNvbnRhaW5pbmdC
bG9jaygpLT54KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICB0eSAtIHkoKSArIGlubGluZVJlbmRlcmVyLT5jb250YWluaW5nQmxvY2soKS0+eSgpKTsKLSAg
ICAgICAgfQotICAgICAgICBwYWludENvbnRpbnVhdGlvbk91dGxpbmVzKHBhaW50SW5mbywgdHgs
IHR5KTsKLSAgICB9Ci0KLSAgICAvLyA3LiBwYWludCBjYXJldC4KKyAgICAvLyA2LiBwYWludCBj
YXJldC4KICAgICAvLyBJZiB0aGUgY2FyZXQncyBub2RlJ3MgcmVuZGVyIG9iamVjdCdzIGNvbnRh
aW5pbmcgYmxvY2sgaXMgdGhpcyBibG9jaywgYW5kIHRoZSBwYWludCBhY3Rpb24gaXMgUGFpbnRQ
aGFzZUZvcmVncm91bmQsCiAgICAgLy8gdGhlbiBwYWludCB0aGUgY2FyZXQuCiAgICAgaWYgKHBh
aW50UGhhc2UgPT0gUGFpbnRQaGFzZUZvcmVncm91bmQpIHsgICAgICAgIApAQCAtMTc5Nyw1NyAr
MTc4MCw2IEBAIHZvaWQgUmVuZGVyQmxvY2s6OnBhaW50RWxsaXBzaXNCb3hlcyhQYWkKICAgICB9
CiB9CiAKLXN0YXRpYyBDb250aW51YXRpb25PdXRsaW5lVGFibGVNYXAqIGNvbnRpbnVhdGlvbk91
dGxpbmVUYWJsZSgpCi17Ci0gICAgREVGSU5FX1NUQVRJQ19MT0NBTChDb250aW51YXRpb25PdXRs
aW5lVGFibGVNYXAsIHRhYmxlLCAoKSk7Ci0gICAgcmV0dXJuICZ0YWJsZTsKLX0KLQotdm9pZCBS
ZW5kZXJCbG9jazo6YWRkQ29udGludWF0aW9uV2l0aE91dGxpbmUoUmVuZGVySW5saW5lKiBmbG93
KQotewotICAgIC8vIFdlIGNhbid0IG1ha2UgdGhpcyB3b3JrIGlmIHRoZSBpbmxpbmUgaXMgaW4g
YSBsYXllci4gIFdlJ2xsIGp1c3QgcmVseSBvbiB0aGUgYnJva2VuCi0gICAgLy8gd2F5IG9mIHBh
aW50aW5nLgotICAgIEFTU0VSVCghZmxvdy0+bGF5ZXIoKSAmJiAhZmxvdy0+aXNJbmxpbmVDb250
aW51YXRpb24oKSk7Ci0gICAgCi0gICAgQ29udGludWF0aW9uT3V0bGluZVRhYmxlTWFwKiB0YWJs
ZSA9IGNvbnRpbnVhdGlvbk91dGxpbmVUYWJsZSgpOwotICAgIExpc3RIYXNoU2V0PFJlbmRlcklu
bGluZSo+KiBjb250aW51YXRpb25zID0gdGFibGUtPmdldCh0aGlzKTsKLSAgICBpZiAoIWNvbnRp
bnVhdGlvbnMpIHsKLSAgICAgICAgY29udGludWF0aW9ucyA9IG5ldyBMaXN0SGFzaFNldDxSZW5k
ZXJJbmxpbmUqPjsKLSAgICAgICAgdGFibGUtPnNldCh0aGlzLCBjb250aW51YXRpb25zKTsKLSAg
ICB9Ci0gICAgCi0gICAgY29udGludWF0aW9ucy0+YWRkKGZsb3cpOwotfQotCi12b2lkIFJlbmRl
ckJsb2NrOjpwYWludENvbnRpbnVhdGlvbk91dGxpbmVzKFBhaW50SW5mbyYgaW5mbywgaW50IHR4
LCBpbnQgdHkpCi17Ci0gICAgQ29udGludWF0aW9uT3V0bGluZVRhYmxlTWFwKiB0YWJsZSA9IGNv
bnRpbnVhdGlvbk91dGxpbmVUYWJsZSgpOwotICAgIGlmICh0YWJsZS0+aXNFbXB0eSgpKQotICAg
ICAgICByZXR1cm47Ci0gICAgICAgIAotICAgIExpc3RIYXNoU2V0PFJlbmRlcklubGluZSo+KiBj
b250aW51YXRpb25zID0gdGFibGUtPmdldCh0aGlzKTsKLSAgICBpZiAoIWNvbnRpbnVhdGlvbnMp
Ci0gICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgLy8gUGFpbnQgZWFjaCBjb250aW51YXRp
b24gb3V0bGluZS4KLSAgICBMaXN0SGFzaFNldDxSZW5kZXJJbmxpbmUqPjo6aXRlcmF0b3IgZW5k
ID0gY29udGludWF0aW9ucy0+ZW5kKCk7Ci0gICAgZm9yIChMaXN0SGFzaFNldDxSZW5kZXJJbmxp
bmUqPjo6aXRlcmF0b3IgaXQgPSBjb250aW51YXRpb25zLT5iZWdpbigpOyBpdCAhPSBlbmQ7ICsr
aXQpIHsKLSAgICAgICAgLy8gTmVlZCB0byBhZGQgaW4gdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBp
bnRlcnZlbmluZyBibG9ja3MuCi0gICAgICAgIFJlbmRlcklubGluZSogZmxvdyA9ICppdDsKLSAg
ICAgICAgUmVuZGVyQmxvY2sqIGJsb2NrID0gZmxvdy0+Y29udGFpbmluZ0Jsb2NrKCk7Ci0gICAg
ICAgIGZvciAoIDsgYmxvY2sgJiYgYmxvY2sgIT0gdGhpczsgYmxvY2sgPSBibG9jay0+Y29udGFp
bmluZ0Jsb2NrKCkpIHsKLSAgICAgICAgICAgIHR4ICs9IGJsb2NrLT54KCk7Ci0gICAgICAgICAg
ICB0eSArPSBibG9jay0+eSgpOwotICAgICAgICB9Ci0gICAgICAgIEFTU0VSVChibG9jayk7ICAg
Ci0gICAgICAgIGZsb3ctPnBhaW50T3V0bGluZShpbmZvLmNvbnRleHQsIHR4LCB0eSk7Ci0gICAg
fQotICAgIAotICAgIC8vIERlbGV0ZQotICAgIGRlbGV0ZSBjb250aW51YXRpb25zOwotICAgIHRh
YmxlLT5yZW1vdmUodGhpcyk7Ci19Ci0KIHZvaWQgUmVuZGVyQmxvY2s6OnNldFNlbGVjdGlvblN0
YXRlKFNlbGVjdGlvblN0YXRlIHMpCiB7CiAgICAgaWYgKHNlbGVjdGlvblN0YXRlKCkgPT0gcykK
QEAgLTI5MzMsMjAgKzI4NjUsMjcgQEAgdm9pZCBSZW5kZXJCbG9jazo6Y2xlYXJGbG9hdHMoKQog
ICAgIC8vIG91dCBvZiBmbG93IChsaWtlIGZsb2F0aW5nL3Bvc2l0aW9uZWQgZWxlbWVudHMpLCBh
bmQgd2UgYWxzbyBza2lwIG92ZXIgYW55IG9iamVjdHMgdGhhdCBtYXkgaGF2ZSBzaGlmdGVkCiAg
ICAgLy8gdG8gYXZvaWQgZmxvYXRzLgogICAgIGJvb2wgcGFyZW50SGFzRmxvYXRzID0gZmFsc2U7
Ci0gICAgUmVuZGVyT2JqZWN0KiBwcmV2ID0gcHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgd2hpbGUg
KHByZXYgJiYgKHByZXYtPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSB8fCAhcHJldi0+aXNCb3go
KSB8fCAhcHJldi0+aXNSZW5kZXJCbG9jaygpIHx8IHRvUmVuZGVyQmxvY2socHJldiktPmF2b2lk
c0Zsb2F0cygpKSkgewotICAgICAgICBpZiAocHJldi0+aXNGbG9hdGluZygpKQotICAgICAgICAg
ICAgcGFyZW50SGFzRmxvYXRzID0gdHJ1ZTsKLSAgICAgICAgIHByZXYgPSBwcmV2LT5wcmV2aW91
c1NpYmxpbmcoKTsKKyAgICBSZW5kZXJPYmplY3QqIHByZXYgPSAwOworICAgIFJlbmRlckJsb2Nr
KiBwYXJlbnRCbG9jayA9IDA7CisgICAgaWYgKGlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkgewor
ICAgICAgICBwYXJlbnRCbG9jayA9IGNvbnRhaW5pbmdCbG9jaygpOworICAgICAgICBwYXJlbnRI
YXNGbG9hdHMgPSBwYXJlbnRCbG9jay0+Y29udGFpbnNGbG9hdHMoKTsKKyAgICB9IGVsc2UgeyAg
ICAKKyAgICAgICAgd2hpbGUgKHByZXYgJiYgKHByZXYtPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQo
KSB8fCAhcHJldi0+aXNCb3goKSB8fCAhcHJldi0+aXNSZW5kZXJCbG9jaygpIHx8IHRvUmVuZGVy
QmxvY2socHJldiktPmF2b2lkc0Zsb2F0cygpKSkgeworICAgICAgICAgICAgaWYgKHByZXYtPmlz
RmxvYXRpbmcoKSkKKyAgICAgICAgICAgICAgICBwYXJlbnRIYXNGbG9hdHMgPSB0cnVlOworICAg
ICAgICAgICAgIHByZXYgPSBwcmV2LT5wcmV2aW91c1NpYmxpbmcoKTsKKyAgICAgICAgfQorICAg
ICAgICAKKyAgICAgICAgaWYgKHBhcmVudEhhc0Zsb2F0cykKKyAgICAgICAgICAgIHBhcmVudEJs
b2NrID0gdG9SZW5kZXJCbG9jayhwYXJlbnQoKSk7CiAgICAgfQogCiAgICAgLy8gRmlyc3QgYWRk
IGluIGZsb2F0cyBmcm9tIHRoZSBwYXJlbnQuCiAgICAgaW50IG9mZnNldCA9IHkoKTsKLSAgICBp
ZiAocGFyZW50SGFzRmxvYXRzKSB7Ci0gICAgICAgIFJlbmRlckJsb2NrKiBwYXJlbnRCbG9jayA9
IHRvUmVuZGVyQmxvY2socGFyZW50KCkpOworICAgIGlmIChwYXJlbnRIYXNGbG9hdHMpCiAgICAg
ICAgIGFkZEludHJ1ZGluZ0Zsb2F0cyhwYXJlbnRCbG9jaywgcGFyZW50QmxvY2stPmJvcmRlckxl
ZnQoKSArIHBhcmVudEJsb2NrLT5wYWRkaW5nTGVmdCgpLCBvZmZzZXQpOwotICAgIH0KLSAgICAK
KwogICAgIGludCB4b2Zmc2V0ID0gMDsKICAgICBpZiAocHJldikKICAgICAgICAgb2Zmc2V0IC09
IHRvUmVuZGVyQm94KHByZXYpLT55KCk7CkBAIC00MDUzLDE0ICszOTkyLDE1IEBAIHZvaWQgUmVu
ZGVyQmxvY2s6OmNhbGNJbmxpbmVQcmVmV2lkdGhzKCkKICAgICAgICAgICAgICAgICB9IGVsc2UK
ICAgICAgICAgICAgICAgICAgICAgY2xlYXJQcmV2aW91c0Zsb2F0ID0gZmFsc2U7CiAKLSAgICAg
ICAgICAgICAgICBib29sIGNhbkJyZWFrUmVwbGFjZWRFbGVtZW50ID0gIWNoaWxkLT5pc0ltYWdl
KCkgfHwgYWxsb3dJbWFnZXNUb0JyZWFrOworICAgICAgICAgICAgICAgIGJvb2wgY2FuQnJlYWtS
ZXBsYWNlZEVsZW1lbnQgPSAhY2hpbGQtPmlzSW1hZ2UoKSB8fCBhbGxvd0ltYWdlc1RvQnJlYWsg
fHwgY2hpbGQtPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKTsKICAgICAgICAgICAgICAgICBpZiAo
KGNhbkJyZWFrUmVwbGFjZWRFbGVtZW50ICYmIChhdXRvV3JhcCB8fCBvbGRBdXRvV3JhcCkpIHx8
IGNsZWFyUHJldmlvdXNGbG9hdCkgewogICAgICAgICAgICAgICAgICAgICBtX21pblByZWZXaWR0
aCA9IG1heChpbmxpbmVNaW4sIG1fbWluUHJlZldpZHRoKTsKICAgICAgICAgICAgICAgICAgICAg
aW5saW5lTWluID0gMDsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAvLyBJ
ZiB3ZSdyZSBzdXBwb3NlZCB0byBjbGVhciB0aGUgcHJldmlvdXMgZmxvYXQsIHRoZW4gdGVybWlu
YXRlIG1heHdpZHRoIGFzIHdlbGwuCi0gICAgICAgICAgICAgICAgaWYgKGNsZWFyUHJldmlvdXNG
bG9hdCkgeworICAgICAgICAgICAgICAgIC8vIEFsc28gZG8gdGhpcyBmb3IgYW5vbnltb3VzIGlu
bGluZSBibG9ja3MuCisgICAgICAgICAgICAgICAgaWYgKGNsZWFyUHJldmlvdXNGbG9hdCB8fCBj
aGlsZC0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CiAgICAgICAgICAgICAgICAgICAgIG1f
bWF4UHJlZldpZHRoID0gbWF4KGlubGluZU1heCwgbV9tYXhQcmVmV2lkdGgpOwogICAgICAgICAg
ICAgICAgICAgICBpbmxpbmVNYXggPSAwOwogICAgICAgICAgICAgICAgIH0KQEAgLTQwNjksMTUg
KzQwMDksMTcgQEAgdm9pZCBSZW5kZXJCbG9jazo6Y2FsY0lubGluZVByZWZXaWR0aHMoKQogICAg
ICAgICAgICAgICAgIGludCB0aSA9IDA7CiAgICAgICAgICAgICAgICAgaWYgKCFhZGRlZFRleHRJ
bmRlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgYWRkZWRUZXh0SW5kZW50ID0gdHJ1ZTsKLSAg
ICAgICAgICAgICAgICAgICAgdGkgPSBzdHlsZSgpLT50ZXh0SW5kZW50KCkuY2FsY01pblZhbHVl
KGN3KTsKLSAgICAgICAgICAgICAgICAgICAgY2hpbGRNaW4rPXRpOwotICAgICAgICAgICAgICAg
ICAgICBjaGlsZE1heCs9dGk7CisgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGQtPmlzQW5v
bnltb3VzSW5saW5lQmxvY2soKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGkgPSBzdHls
ZSgpLT50ZXh0SW5kZW50KCkuY2FsY01pblZhbHVlKGN3KTsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGNoaWxkTWluICs9IHRpOworICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRNYXggKz0g
dGk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAg
ICAgICAgICAvLyBBZGQgb3VyIHdpZHRoIHRvIHRoZSBtYXguCiAgICAgICAgICAgICAgICAgaW5s
aW5lTWF4ICs9IGNoaWxkTWF4OwogCi0gICAgICAgICAgICAgICAgaWYgKCFhdXRvV3JhcCB8fCAh
Y2FuQnJlYWtSZXBsYWNlZEVsZW1lbnQpIHsKKyAgICAgICAgICAgICAgICBpZiAoKCFhdXRvV3Jh
cCB8fCAhY2FuQnJlYWtSZXBsYWNlZEVsZW1lbnQpICYmICFjaGlsZC0+aXNBbm9ueW1vdXNJbmxp
bmVCbG9jaygpKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC0+aXNGbG9hdGluZygp
KQogICAgICAgICAgICAgICAgICAgICAgICAgbV9taW5QcmVmV2lkdGggPSBtYXgoY2hpbGRNaW4s
IG1fbWluUHJlZldpZHRoKTsKICAgICAgICAgICAgICAgICAgICAgZWxzZQpAQCAtNDA4OCw2ICs0
MDMwLDEyIEBAIHZvaWQgUmVuZGVyQmxvY2s6OmNhbGNJbmxpbmVQcmVmV2lkdGhzKCkKIAogICAg
ICAgICAgICAgICAgICAgICAvLyBOb3cgc3RhcnQgYSBuZXcgbGluZS4KICAgICAgICAgICAgICAg
ICAgICAgaW5saW5lTWluID0gMDsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAg
ICAgICAgIGlmIChjaGlsZC0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CisgICAgICAgICAg
ICAgICAgICAgICAgICAvLyBUZXJtaW5hdGUgbWF4IHdpZHRoIGFzIHdlbGwuCisgICAgICAgICAg
ICAgICAgICAgICAgICBtX21heFByZWZXaWR0aCA9IG1heChjaGlsZE1heCwgbV9tYXhQcmVmV2lk
dGgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lTWF4ID0gMDsKKyAgICAgICAgICAg
ICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIFdlIGFy
ZSBubyBsb25nZXIgc3RyaXBwaW5nIHdoaXRlc3BhY2UgYXQgdGhlIHN0YXJ0IG9mCkBAIC00MzI0
LDkgKzQyNzIsMTIgQEAgaW50IFJlbmRlckJsb2NrOjpsaW5lSGVpZ2h0KGJvb2wgZmlyc3RMaQog
ICAgIC8vIHRoZSBiYXNlIGNsYXNzLiAgSWYgd2UncmUgYmVpbmcgcXVlcmllZCBhcyB0aG91Z2gg
d2UncmUgdGhlIHJvb3QgbGluZQogICAgIC8vIGJveCwgdGhlbiB0aGUgZmFjdCB0aGF0IHdlJ3Jl
IGFuIGlubGluZS1ibG9jayBpcyBpcnJlbGV2YW50LCBhbmQgd2UgYmVoYXZlCiAgICAgLy8ganVz
dCBsaWtlIGEgYmxvY2suCi0gICAgaWYgKGlzUmVwbGFjZWQoKSAmJiAhaXNSb290TGluZUJveCkK
KyAgICBpZiAoaXNSZXBsYWNlZCgpICYmICFpc1Jvb3RMaW5lQm94KSB7CisgICAgICAgIGlmIChp
c0Fub255bW91c0lubGluZUJsb2NrKCkpCisgICAgICAgICAgICByZXR1cm4gaGVpZ2h0KCk7CiAg
ICAgICAgIHJldHVybiBoZWlnaHQoKSArIG1hcmdpblRvcCgpICsgbWFyZ2luQm90dG9tKCk7Ci0g
ICAgCisgICAgfQorCiAgICAgaWYgKGZpcnN0TGluZSAmJiBkb2N1bWVudCgpLT51c2VzRmlyc3RM
aW5lUnVsZXMoKSkgewogICAgICAgICBSZW5kZXJTdHlsZSogcyA9IHN0eWxlKGZpcnN0TGluZSk7
CiAgICAgICAgIGlmIChzICE9IHN0eWxlKCkpCkBAIC00MzU4LDYgKzQzMDksOCBAQCBpbnQgUmVu
ZGVyQmxvY2s6OmJhc2VsaW5lUG9zaXRpb24oYm9vbCBiCiAgICAgICAgIC8vIFdlIGFsc28gZ2l2
ZSB1cCBvbiBmaW5kaW5nIGEgYmFzZWxpbmUgaWYgd2UgaGF2ZSBhIHZlcnRpY2FsIHNjcm9sbGJh
ciwgb3IgaWYgd2UgYXJlIHNjcm9sbGVkCiAgICAgICAgIC8vIHZlcnRpY2FsbHkgKGUuZy4sIGFu
IG92ZXJmbG93OmhpZGRlbiBibG9jayB0aGF0IGhhcyBoYWQgc2Nyb2xsVG9wIG1vdmVkKSBvciBp
ZiB0aGUgYmFzZWxpbmUgaXMgb3V0c2lkZQogICAgICAgICAvLyBvZiBvdXIgY29udGVudCBib3gu
CisgICAgICAgIGlmIChpc0Fub255bW91c0lubGluZUJsb2NrKCkpCisgICAgICAgICAgICByZXR1
cm4gaGVpZ2h0KCk7CiAgICAgICAgIGludCBiYXNlbGluZVBvcyA9IChsYXllcigpICYmIChsYXll
cigpLT5tYXJxdWVlKCkgfHwgbGF5ZXIoKS0+dmVydGljYWxTY3JvbGxiYXIoKSB8fCBsYXllcigp
LT5zY3JvbGxZT2Zmc2V0KCkgIT0gMCkpID8gLTEgOiBsYXN0TGluZUJveEJhc2VsaW5lKCk7CiAg
ICAgICAgIGlmIChiYXNlbGluZVBvcyAhPSAtMSAmJiBiYXNlbGluZVBvcyA8PSBib3JkZXJUb3Ao
KSArIHBhZGRpbmdUb3AoKSArIGNvbnRlbnRIZWlnaHQoKSkKICAgICAgICAgICAgIHJldHVybiBt
YXJnaW5Ub3AoKSArIGJhc2VsaW5lUG9zOwpAQCAtNDc4Miw2MCArNDczNSw2IEBAIHZvaWQgUmVu
ZGVyQmxvY2s6OnNldE1heEJvdHRvbU1hcmdpbnMoaW4KICAgICBtX21heE1hcmdpbi0+bV9ib3R0
b21OZWcgPSBuZWc7CiB9CiAKLXZvaWQgUmVuZGVyQmxvY2s6OmFic29sdXRlUmVjdHMoVmVjdG9y
PEludFJlY3Q+JiByZWN0cywgaW50IHR4LCBpbnQgdHkpCi17Ci0gICAgLy8gRm9yIGJsb2NrcyBp
bnNpZGUgaW5saW5lcywgd2UgZ28gYWhlYWQgYW5kIGluY2x1ZGUgbWFyZ2lucyBzbyB0aGF0IHdl
IHJ1biByaWdodCB1cCB0byB0aGUKLSAgICAvLyBpbmxpbmUgYm94ZXMgYWJvdmUgYW5kIGJlbG93
IHVzICh0aHVzIGdldHRpbmcgbWVyZ2VkIHdpdGggdGhlbSB0byBmb3JtIGEgc2luZ2xlIGlycmVn
dWxhcgotICAgIC8vIHNoYXBlKS4KLSAgICBpZiAoaW5saW5lQ29udGludWF0aW9uKCkpIHsKLSAg
ICAgICAgcmVjdHMuYXBwZW5kKEludFJlY3QodHgsIHR5IC0gY29sbGFwc2VkTWFyZ2luVG9wKCks
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoKCksIGhlaWdodCgpICsgY29sbGFw
c2VkTWFyZ2luVG9wKCkgKyBjb2xsYXBzZWRNYXJnaW5Cb3R0b20oKSkpOwotICAgICAgICBpbmxp
bmVDb250aW51YXRpb24oKS0+YWJzb2x1dGVSZWN0cyhyZWN0cywKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgdHggLSB4KCkgKyBpbmxpbmVDb250aW51YXRpb24o
KS0+Y29udGFpbmluZ0Jsb2NrKCktPngoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgdHkgLSB5KCkgKyBpbmxpbmVDb250aW51YXRpb24oKS0+Y29udGFpbmlu
Z0Jsb2NrKCktPnkoKSk7Ci0gICAgfSBlbHNlCi0gICAgICAgIHJlY3RzLmFwcGVuZChJbnRSZWN0
KHR4LCB0eSwgd2lkdGgoKSwgaGVpZ2h0KCkpKTsKLX0KLQotdm9pZCBSZW5kZXJCbG9jazo6YWJz
b2x1dGVRdWFkcyhWZWN0b3I8RmxvYXRRdWFkPiYgcXVhZHMpCi17Ci0gICAgLy8gRm9yIGJsb2Nr
cyBpbnNpZGUgaW5saW5lcywgd2UgZ28gYWhlYWQgYW5kIGluY2x1ZGUgbWFyZ2lucyBzbyB0aGF0
IHdlIHJ1biByaWdodCB1cCB0byB0aGUKLSAgICAvLyBpbmxpbmUgYm94ZXMgYWJvdmUgYW5kIGJl
bG93IHVzICh0aHVzIGdldHRpbmcgbWVyZ2VkIHdpdGggdGhlbSB0byBmb3JtIGEgc2luZ2xlIGly
cmVndWxhcgotICAgIC8vIHNoYXBlKS4KLSAgICBpZiAoaW5saW5lQ29udGludWF0aW9uKCkpIHsK
LSAgICAgICAgRmxvYXRSZWN0IGxvY2FsUmVjdCgwLCAtY29sbGFwc2VkTWFyZ2luVG9wKCksCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgoKSwgaGVpZ2h0KCkgKyBjb2xsYXBzZWRN
YXJnaW5Ub3AoKSArIGNvbGxhcHNlZE1hcmdpbkJvdHRvbSgpKTsKLSAgICAgICAgcXVhZHMuYXBw
ZW5kKGxvY2FsVG9BYnNvbHV0ZVF1YWQobG9jYWxSZWN0KSk7Ci0gICAgICAgIGlubGluZUNvbnRp
bnVhdGlvbigpLT5hYnNvbHV0ZVF1YWRzKHF1YWRzKTsKLSAgICB9IGVsc2UKLSAgICAgICAgcXVh
ZHMuYXBwZW5kKFJlbmRlckJveDo6bG9jYWxUb0Fic29sdXRlUXVhZChGbG9hdFJlY3QoMCwgMCwg
d2lkdGgoKSwgaGVpZ2h0KCkpKSk7Ci19Ci0KLUludFJlY3QgUmVuZGVyQmxvY2s6OnJlY3RXaXRo
T3V0bGluZUZvclJlcGFpbnQoUmVuZGVyQm94TW9kZWxPYmplY3QqIHJlcGFpbnRDb250YWluZXIs
IGludCBvdXRsaW5lV2lkdGgpCi17Ci0gICAgSW50UmVjdCByKFJlbmRlckJveDo6cmVjdFdpdGhP
dXRsaW5lRm9yUmVwYWludChyZXBhaW50Q29udGFpbmVyLCBvdXRsaW5lV2lkdGgpKTsKLSAgICBp
ZiAoaW5saW5lQ29udGludWF0aW9uKCkpCi0gICAgICAgIHIuaW5mbGF0ZVkoY29sbGFwc2VkTWFy
Z2luVG9wKCkpOwotICAgIHJldHVybiByOwotfQotCi1SZW5kZXJPYmplY3QqIFJlbmRlckJsb2Nr
Ojpob3ZlckFuY2VzdG9yKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaW5saW5lQ29udGludWF0aW9u
KCkgPyBpbmxpbmVDb250aW51YXRpb24oKSA6IFJlbmRlckJveDo6aG92ZXJBbmNlc3RvcigpOwot
fQotCi12b2lkIFJlbmRlckJsb2NrOjp1cGRhdGVEcmFnU3RhdGUoYm9vbCBkcmFnT24pCi17Ci0g
ICAgUmVuZGVyQm94Ojp1cGRhdGVEcmFnU3RhdGUoZHJhZ09uKTsKLSAgICBpZiAoaW5saW5lQ29u
dGludWF0aW9uKCkpCi0gICAgICAgIGlubGluZUNvbnRpbnVhdGlvbigpLT51cGRhdGVEcmFnU3Rh
dGUoZHJhZ09uKTsKLX0KLQotUmVuZGVyU3R5bGUqIFJlbmRlckJsb2NrOjpvdXRsaW5lU3R5bGVG
b3JSZXBhaW50KCkgY29uc3QKLXsKLSAgICByZXR1cm4gaW5saW5lQ29udGludWF0aW9uKCkgPyBp
bmxpbmVDb250aW51YXRpb24oKS0+c3R5bGUoKSA6IHN0eWxlKCk7Ci19Ci0KIHZvaWQgUmVuZGVy
QmxvY2s6OmNoaWxkQmVjYW1lTm9uSW5saW5lKFJlbmRlck9iamVjdCopCiB7CiAgICAgbWFrZUNo
aWxkcmVuTm9uSW5saW5lKCk7CkBAIC00ODQ0LDI2ICs0NzQzLDYgQEAgdm9pZCBSZW5kZXJCbG9j
azo6Y2hpbGRCZWNhbWVOb25JbmxpbmUoUgogICAgIC8vIHx0aGlzfCBtYXkgYmUgZGVhZCBoZXJl
CiB9CiAKLXZvaWQgUmVuZGVyQmxvY2s6OnVwZGF0ZUhpdFRlc3RSZXN1bHQoSGl0VGVzdFJlc3Vs
dCYgcmVzdWx0LCBjb25zdCBJbnRQb2ludCYgcG9pbnQpCi17Ci0gICAgaWYgKHJlc3VsdC5pbm5l
ck5vZGUoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgTm9kZSogbiA9IG5vZGUoKTsKLSAgICBp
ZiAoaW5saW5lQ29udGludWF0aW9uKCkpCi0gICAgICAgIC8vIFdlIGFyZSBpbiB0aGUgbWFyZ2lu
cyBvZiBibG9jayBlbGVtZW50cyB0aGF0IGFyZSBwYXJ0IG9mIGEgY29udGludWF0aW9uLiAgSW4K
LSAgICAgICAgLy8gdGhpcyBjYXNlIHdlJ3JlIGFjdHVhbGx5IHN0aWxsIGluc2lkZSB0aGUgZW5j
bG9zaW5nIGlubGluZSBlbGVtZW50IHRoYXQgd2FzCi0gICAgICAgIC8vIHNwbGl0LiAgR28gYWhl
YWQgYW5kIHNldCBvdXIgaW5uZXIgbm9kZSBhY2NvcmRpbmdseS4KLSAgICAgICAgbiA9IGlubGlu
ZUNvbnRpbnVhdGlvbigpLT5ub2RlKCk7Ci0KLSAgICBpZiAobikgewotICAgICAgICByZXN1bHQu
c2V0SW5uZXJOb2RlKG4pOwotICAgICAgICBpZiAoIXJlc3VsdC5pbm5lck5vblNoYXJlZE5vZGUo
KSkKLSAgICAgICAgICAgIHJlc3VsdC5zZXRJbm5lck5vblNoYXJlZE5vZGUobik7Ci0gICAgICAg
IHJlc3VsdC5zZXRMb2NhbFBvaW50KHBvaW50KTsKLSAgICB9Ci19Ci0KIEludFJlY3QgUmVuZGVy
QmxvY2s6OmxvY2FsQ2FyZXRSZWN0KElubGluZUJveCogaW5saW5lQm94LCBpbnQgY2FyZXRPZmZz
ZXQsIGludCogZXh0cmFXaWR0aFRvRW5kT2ZMaW5lKQogewogICAgIC8vIERvIHRoZSBub3JtYWwg
Y2FsY3VsYXRpb24gaW4gbW9zdCBjYXNlcy4KQEAgLTQ5NDcsMTcgKzQ4MjYsNyBAQCB2b2lkIFJl
bmRlckJsb2NrOjphZGRGb2N1c1JpbmdSZWN0cyhHcmFwCiAgICAgLy8gRm9yIGJsb2NrcyBpbnNp
ZGUgaW5saW5lcywgd2UgZ28gYWhlYWQgYW5kIGluY2x1ZGUgbWFyZ2lucyBzbyB0aGF0IHdlIHJ1
biByaWdodCB1cCB0byB0aGUKICAgICAvLyBpbmxpbmUgYm94ZXMgYWJvdmUgYW5kIGJlbG93IHVz
ICh0aHVzIGdldHRpbmcgbWVyZ2VkIHdpdGggdGhlbSB0byBmb3JtIGEgc2luZ2xlIGlycmVndWxh
cgogICAgIC8vIHNoYXBlKS4KLSAgICBpZiAoaW5saW5lQ29udGludWF0aW9uKCkpIHsKLSAgICAg
ICAgLy8gRklYTUU6IFRoaXMgY2hlY2sgcmVhbGx5IGlzbid0IGFjY3VyYXRlLiAKLSAgICAgICAg
Ym9vbCBuZXh0SW5saW5lSGFzTGluZUJveCA9IGlubGluZUNvbnRpbnVhdGlvbigpLT5maXJzdExp
bmVCb3goKTsKLSAgICAgICAgLy8gRklYTUU6IFRoaXMgaXMgd3JvbmcuIFRoZSBwcmluY2lwYWwg
cmVuZGVyZXIgbWF5IG5vdCBiZSB0aGUgY29udGludWF0aW9uIHByZWNlZGluZyB0aGlzIGJsb2Nr
LgotICAgICAgICBib29sIHByZXZJbmxpbmVIYXNMaW5lQm94ID0gdG9SZW5kZXJJbmxpbmUoaW5s
aW5lQ29udGludWF0aW9uKCktPm5vZGUoKS0+cmVuZGVyZXIoKSktPmZpcnN0TGluZUJveCgpOyAK
LSAgICAgICAgaW50IHRvcE1hcmdpbiA9IHByZXZJbmxpbmVIYXNMaW5lQm94ID8gY29sbGFwc2Vk
TWFyZ2luVG9wKCkgOiAwOwotICAgICAgICBpbnQgYm90dG9tTWFyZ2luID0gbmV4dElubGluZUhh
c0xpbmVCb3ggPyBjb2xsYXBzZWRNYXJnaW5Cb3R0b20oKSA6IDA7Ci0gICAgICAgIGdyYXBoaWNz
Q29udGV4dC0+YWRkRm9jdXNSaW5nUmVjdChJbnRSZWN0KHR4LCB0eSAtIHRvcE1hcmdpbiwgCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoKCks
IGhlaWdodCgpICsgdG9wTWFyZ2luICsgYm90dG9tTWFyZ2luKSk7Ci0gICAgfSBlbHNlCi0gICAg
ICAgIGdyYXBoaWNzQ29udGV4dC0+YWRkRm9jdXNSaW5nUmVjdChJbnRSZWN0KHR4LCB0eSwgd2lk
dGgoKSwgaGVpZ2h0KCkpKTsKKyAgICBncmFwaGljc0NvbnRleHQtPmFkZEZvY3VzUmluZ1JlY3Qo
SW50UmVjdCh0eCwgdHksIHdpZHRoKCksIGhlaWdodCgpKSk7CiAKICAgICBpZiAoIWhhc092ZXJm
bG93Q2xpcCgpICYmICFoYXNDb250cm9sQ2xpcCgpKSB7CiAgICAgICAgIGZvciAoUm9vdElubGlu
ZUJveCogY3VyciA9IGZpcnN0Um9vdEJveCgpOyBjdXJyOyBjdXJyID0gY3Vyci0+bmV4dFJvb3RC
b3goKSkgewpAQCAtNDk3OSwxMSArNDg0OCw2IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmFkZEZvY3Vz
UmluZ1JlY3RzKEdyYXAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLQotICAgIGlm
IChpbmxpbmVDb250aW51YXRpb24oKSkKLSAgICAgICAgaW5saW5lQ29udGludWF0aW9uKCktPmFk
ZEZvY3VzUmluZ1JlY3RzKGdyYXBoaWNzQ29udGV4dCwgCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB0eCAtIHgoKSArIGlubGluZUNvbnRpbnVhdGlvbigp
LT5jb250YWluaW5nQmxvY2soKS0+eCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgdHkgLSB5KCkgKyBpbmxpbmVDb250aW51YXRpb24oKS0+Y29udGFp
bmluZ0Jsb2NrKCktPnkoKSk7CiB9CiAKIFJlbmRlckJsb2NrKiBSZW5kZXJCbG9jazo6Y3JlYXRl
QW5vbnltb3VzQmxvY2soYm9vbCBpc0ZsZXhpYmxlQm94KSBjb25zdApAQCAtNTAxNSw2ICs0ODc5
LDggQEAgY29uc3QgY2hhciogUmVuZGVyQmxvY2s6OnJlbmRlck5hbWUoKSBjbwogICAgICAgICBy
ZXR1cm4gIlJlbmRlckJsb2NrIChwb3NpdGlvbmVkKSI7CiAgICAgaWYgKGlzQW5vbnltb3VzQmxv
Y2soKSkKICAgICAgICAgcmV0dXJuICJSZW5kZXJCbG9jayAoYW5vbnltb3VzKSI7CisgICAgZWxz
ZSBpZiAoaXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKQorICAgICAgICByZXR1cm4gIlJlbmRlckJs
b2NrIChhbm9ueW1vdXMgaW5saW5lLWJsb2NrKSI7CiAgICAgZWxzZSBpZiAoaXNBbm9ueW1vdXMo
KSkKICAgICAgICAgcmV0dXJuICJSZW5kZXJCbG9jayAoZ2VuZXJhdGVkKSI7CiAgICAgaWYgKGlz
UmVsUG9zaXRpb25lZCgpKQpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5oCShyZXZpc2lvbiA0
NzU5NSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmgJKHdvcmtpbmcgY29weSkK
QEAgLTEzMCwxMSArMTMwLDYgQEAgcHVibGljOgogCiAgICAgdm9pZCBhZGp1c3RSZWN0Rm9yQ29s
dW1ucyhJbnRSZWN0JikgY29uc3Q7CiAKLSAgICB2b2lkIGFkZENvbnRpbnVhdGlvbldpdGhPdXRs
aW5lKFJlbmRlcklubGluZSopOwotCi0gICAgUmVuZGVySW5saW5lKiBpbmxpbmVDb250aW51YXRp
b24oKSBjb25zdCB7IHJldHVybiBtX2lubGluZUNvbnRpbnVhdGlvbjsgfQotICAgIHZvaWQgc2V0
SW5saW5lQ29udGludWF0aW9uKFJlbmRlcklubGluZSogYykgeyBtX2lubGluZUNvbnRpbnVhdGlv
biA9IGM7IH0KLQogICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgYSBjb252ZW5pZW5jZSBoZWxwZXIg
Zm9yIGNyZWF0aW5nIGFuIGFub255bW91cyBibG9jayB0aGF0IGluaGVyaXRzIGl0cwogICAgIC8v
IHN0eWxlIGZyb20gdGhpcyBSZW5kZXJCbG9jay4KICAgICBSZW5kZXJCbG9jayogY3JlYXRlQW5v
bnltb3VzQmxvY2soYm9vbCBpc0ZsZXhpYmxlQm94ID0gZmFsc2UpIGNvbnN0OwpAQCAtMTc2LDgg
KzE3MSw2IEBAIHByb3RlY3RlZDoKIAogICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVGaXJzdExldHRl
cigpOwogCi0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZUhpdFRlc3RSZXN1bHQoSGl0VGVzdFJlc3Vs
dCYsIGNvbnN0IEludFBvaW50Jik7Ci0KICAgICAvLyBEZWxheSB1cGRhdGUgc2Nyb2xsYmFyIHVu
dGlsIGZpbmlzaERlbGF5UmVwYWludCgpIHdpbGwgYmUKICAgICAvLyBjYWxsZWQuIFRoaXMgZnVu
Y3Rpb24gaXMgdXNlZCB3aGVuIGEgZmxleGJveCBpcyBsYXlpbmcgb3V0IGl0cwogICAgIC8vIGRl
c2NlbmRhbnQuIElmIG11bHRpcGxlIGNhbGxzIGFyZSBtYWRlIHRvIHN0YXJ0RGVsYXlSZXBhaW50
KCksCkBAIC0yNDEsNyArMjM0LDkgQEAgcHJpdmF0ZToKICAgICAgICAgYm9vbCBldmVySGFkTGF5
b3V0OwogICAgIH07CiAKLSAgICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucycgaW1wbGVtZW50
YXRpb25zIGFyZSBpbiBSZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwLgorICAgIGNsYXNzIE1hcmdp
bkluZm87CisKKyAgICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucycgaW1wbGVtZW50YXRpb25z
IGFyZSBpbiBSZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwLiAgICAKICAgICB2b2lkIGJpZGlSZW9y
ZGVyTGluZShJbmxpbmVCaWRpUmVzb2x2ZXImLCBjb25zdCBJbmxpbmVJdGVyYXRvciYgZW5kLCBi
b29sIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSk7CiAgICAgUm9vdElubGluZUJveCogZGV0ZXJt
aW5lU3RhcnRQb3NpdGlvbihib29sJiBmaXJzdExpbmUsIGJvb2wmIGZ1bGxMYXlvdXQsIGJvb2wm
IHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIElubGluZUJpZGlSZXNvbHZlciYsIFZlY3RvcjxGbG9hdFdpdGhSZWN0PiYg
ZmxvYXRzLCB1bnNpZ25lZCYgbnVtQ2xlYW5GbG9hdHMpOwpAQCAtMjU0LDcgKzI0OSw3IEBAIHBy
aXZhdGU6CiAgICAgdm9pZCBza2lwVHJhaWxpbmdXaGl0ZXNwYWNlKElubGluZUl0ZXJhdG9yJiwg
Ym9vbCBpc0xpbmVFbXB0eSwgYm9vbCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHkpOwogICAgIGlu
dCBza2lwTGVhZGluZ1doaXRlc3BhY2UoSW5saW5lQmlkaVJlc29sdmVyJiwgYm9vbCBmaXJzdExp
bmUsIGJvb2wgaXNMaW5lRW1wdHksIGJvb2wgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KTsKICAg
ICB2b2lkIGZpdEJlbG93RmxvYXRzKGludCB3aWR0aFRvRml0LCBib29sIGZpcnN0TGluZSwgaW50
JiBhdmFpbGFibGVXaWR0aCk7Ci0gICAgSW5saW5lSXRlcmF0b3IgZmluZE5leHRMaW5lQnJlYWso
SW5saW5lQmlkaVJlc29sdmVyJiwgYm9vbCBmaXJzdExpbmUsIGJvb2wmIGlzTGluZUVtcHR5LCBi
b29sJiBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHksIEVDbGVhciogY2xlYXIgPSAwKTsKKyAgICBJ
bmxpbmVJdGVyYXRvciBmaW5kTmV4dExpbmVCcmVhayhJbmxpbmVCaWRpUmVzb2x2ZXImLCBib29s
IGZpcnN0TGluZSwgYm9vbCYgaXNMaW5lRW1wdHksIGJvb2wmIHByZXZpb3VzTGluZUJyb2tlQ2xl
YW5seSwgTWFyZ2luSW5mbyYsIEVDbGVhciogY2xlYXIgPSAwKTsKICAgICBSb290SW5saW5lQm94
KiBjb25zdHJ1Y3RMaW5lKHVuc2lnbmVkIHJ1bkNvdW50LCBCaWRpUnVuKiBmaXJzdFJ1biwgQmlk
aVJ1biogbGFzdFJ1biwgYm9vbCBmaXJzdExpbmUsIGJvb2wgbGFzdExpbmUsIFJlbmRlck9iamVj
dCogZW5kT2JqZWN0KTsKICAgICBJbmxpbmVGbG93Qm94KiBjcmVhdGVMaW5lQm94ZXMoUmVuZGVy
T2JqZWN0KiwgYm9vbCBmaXJzdExpbmUpOwogICAgIHZvaWQgY29tcHV0ZUhvcml6b250YWxQb3Np
dGlvbnNGb3JMaW5lKFJvb3RJbmxpbmVCb3gqLCBib29sIGZpcnN0TGluZSwgQmlkaVJ1biogZmly
c3RSdW4sIEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4sIGJvb2wgcmVhY2hlZEVuZCk7CkBAIC0z
MTAsMTIgKzMwNSw3IEBAIHByaXZhdGU6CiAgICAgLy8gY2hpbGRyZW4uCiAgICAgdmlydHVhbCBS
ZW5kZXJCbG9jayogZmlyc3RMaW5lQmxvY2soKSBjb25zdDsKICAgICBib29sIGluUm9vdEJsb2Nr
Q29udGV4dCgpIGNvbnN0OwotCi0gICAgdmlydHVhbCBJbnRSZWN0IHJlY3RXaXRoT3V0bGluZUZv
clJlcGFpbnQoUmVuZGVyQm94TW9kZWxPYmplY3QqIHJlcGFpbnRDb250YWluZXIsIGludCBvdXRs
aW5lV2lkdGgpOwotICAgIHZpcnR1YWwgUmVuZGVyU3R5bGUqIG91dGxpbmVTdHlsZUZvclJlcGFp
bnQoKSBjb25zdDsKICAgICAKLSAgICB2aXJ0dWFsIFJlbmRlck9iamVjdCogaG92ZXJBbmNlc3Rv
cigpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVEcmFnU3RhdGUoYm9vbCBkcmFnT24p
OwogICAgIHZpcnR1YWwgdm9pZCBjaGlsZEJlY2FtZU5vbklubGluZShSZW5kZXJPYmplY3QqIGNo
aWxkKTsKIAogICAgIHZpcnR1YWwgSW50UmVjdCBzZWxlY3Rpb25SZWN0Rm9yUmVwYWludChSZW5k
ZXJCb3hNb2RlbE9iamVjdCogcmVwYWludENvbnRhaW5lciwgYm9vbCAvKmNsaXBUb1Zpc2libGVD
b250ZW50Ki8pCkBAIC0zMzUsMTYgKzMyNSwxMSBAQCBwcml2YXRlOgogICAgIGludCBsZWZ0U2Vs
ZWN0aW9uT2Zmc2V0KFJlbmRlckJsb2NrKiByb290QmxvY2ssIGludCB5KTsKICAgICBpbnQgcmln
aHRTZWxlY3Rpb25PZmZzZXQoUmVuZGVyQmxvY2sqIHJvb3RCbG9jaywgaW50IHkpOwogCi0gICAg
dmlydHVhbCB2b2lkIGFic29sdXRlUmVjdHMoVmVjdG9yPEludFJlY3Q+JiwgaW50IHR4LCBpbnQg
dHkpOwotICAgIHZpcnR1YWwgdm9pZCBhYnNvbHV0ZVF1YWRzKFZlY3RvcjxGbG9hdFF1YWQ+Jik7
Ci0KICAgICBpbnQgZGVzaXJlZENvbHVtbldpZHRoKCkgY29uc3Q7CiAgICAgdW5zaWduZWQgZGVz
aXJlZENvbHVtbkNvdW50KCkgY29uc3Q7CiAgICAgVmVjdG9yPEludFJlY3Q+KiBjb2x1bW5SZWN0
cygpIGNvbnN0OwogICAgIHZvaWQgc2V0RGVzaXJlZENvbHVtbkNvdW50QW5kV2lkdGgoaW50IGNv
dW50LCBpbnQgd2lkdGgpOwogICAgIGludCBjb2x1bW5HYXAoKSBjb25zdDsKLSAgICAKLSAgICB2
b2lkIHBhaW50Q29udGludWF0aW9uT3V0bGluZXMoUGFpbnRJbmZvJiwgaW50IHR4LCBpbnQgdHkp
OwogCiAgICAgdmlydHVhbCBJbnRSZWN0IGxvY2FsQ2FyZXRSZWN0KElubGluZUJveCosIGludCBj
YXJldE9mZnNldCwgaW50KiBleHRyYVdpZHRoVG9FbmRPZkxpbmUgPSAwKTsKIApAQCAtNDg2LDEy
ICs0NzEsNiBAQCBwcml2YXRlOgogICAgIERlcHJlY2F0ZWRQdHJMaXN0PEZsb2F0aW5nT2JqZWN0
PiogbV9mbG9hdGluZ09iamVjdHM7CiAgICAgTGlzdEhhc2hTZXQ8UmVuZGVyQm94Kj4qIG1fcG9z
aXRpb25lZE9iamVjdHM7CiAKLSAgICAvLyBBbiBpbmxpbmUgY2FuIGJlIHNwbGl0IHdpdGggYmxv
Y2tzIG9jY3VycmluZyBpbiBiZXR3ZWVuIHRoZSBpbmxpbmUgY29udGVudC4KLSAgICAvLyBXaGVu
IHRoaXMgb2NjdXJzIHdlIG5lZWQgYSBwb2ludGVyIHRvIG91ciBuZXh0IG9iamVjdC4gIFdlIGNh
biBiYXNpY2FsbHkgYmUKLSAgICAvLyBzcGxpdCBpbnRvIGEgc2VxdWVuY2Ugb2YgaW5saW5lcyBh
bmQgYmxvY2tzLiAgVGhlIGNvbnRpbnVhdGlvbiB3aWxsIGVpdGhlciBiZQotICAgIC8vIGFuIGFu
b255bW91cyBibG9jayAodGhhdCBob3VzZXMgb3RoZXIgYmxvY2tzKSBvciBpdCB3aWxsIGJlIGFu
IGlubGluZSBmbG93LgotICAgIFJlbmRlcklubGluZSogbV9pbmxpbmVDb250aW51YXRpb247Ci0K
ICAgICAvLyBBbGxvY2F0ZWQgb25seSB3aGVuIHNvbWUgb2YgdGhlc2UgZmllbGRzIGhhdmUgbm9u
LWRlZmF1bHQgdmFsdWVzCiAgICAgc3RydWN0IE1heE1hcmdpbiB7CiAgICAgICAgIE1heE1hcmdp
bihjb25zdCBSZW5kZXJCbG9jayogbykgCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJC
bG9ja0xpbmVMYXlvdXQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRl
ckJsb2NrTGluZUxheW91dC5jcHAJKHJldmlzaW9uIDQ3NTkxKQorKysgV2ViQ29yZS9yZW5kZXJp
bmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTcwLDEyICs1
NzAsMTYgQEAgUm9vdElubGluZUJveCogUmVuZGVyQmxvY2s6OmNvbnN0cnVjdExpbgogICAgICAg
ICBpZiAoIWJveCkKICAgICAgICAgICAgIGNvbnRpbnVlOwogCisgICAgICAgIC8vIEFub255bW91
cyBpbmxpbmUgYmxvY2tzICh1c2VkIHRvIGhvbGQgYmxvY2tzIGluc2lkZSBpbmxpbmVzKSBkb24n
dCBuZWVkIHRvIHdhc3RlIHRpbWUgd3JhcHBpbmcKKyAgICAgICAgLy8gdGhlbXNlbHZlcyBpbiB0
aG9zZSBpbmxpbmVzIChzaW5jZSB3ZSB3YW50IHRvIHByZXRlbmQgbGlrZSB0aGV5IGRvbid0IGV4
aXN0IG9uIHRoaXMgZmFrZSBsaW5lKS4KKyAgICAgICAgUmVuZGVyT2JqZWN0KiBhbmNlc3RvclJl
bmRlcmVyID0gci0+bV9vYmplY3QtPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSA/IHRoaXMgOiBy
LT5tX29iamVjdC0+cGFyZW50KCk7CisgCiAgICAgICAgIC8vIElmIHdlIGhhdmUgbm8gcGFyZW50
IGJveCB5ZXQsIG9yIGlmIHRoZSBydW4gaXMgbm90IHNpbXBseSBhIHNpYmxpbmcsCiAgICAgICAg
IC8vIHRoZW4gd2UgbmVlZCB0byBjb25zdHJ1Y3QgaW5saW5lIGJveGVzIGFzIG5lY2Vzc2FyeSB0
byBwcm9wZXJseSBlbmNsb3NlIHRoZQogICAgICAgICAvLyBydW4ncyBpbmxpbmUgYm94LgotICAg
ICAgICBpZiAoIXBhcmVudEJveCB8fCBwYXJlbnRCb3gtPnJlbmRlcmVyKCkgIT0gci0+bV9vYmpl
Y3QtPnBhcmVudCgpKQorICAgICAgICBpZiAoIXBhcmVudEJveCB8fCBwYXJlbnRCb3gtPnJlbmRl
cmVyKCkgIT0gYW5jZXN0b3JSZW5kZXJlcikKICAgICAgICAgICAgIC8vIENyZWF0ZSBuZXcgaW5s
aW5lIGJveGVzIGFsbCB0aGUgd2F5IGJhY2sgdG8gdGhlIGFwcHJvcHJpYXRlIGluc2VydGlvbiBw
b2ludC4KLSAgICAgICAgICAgIHBhcmVudEJveCA9IGNyZWF0ZUxpbmVCb3hlcyhyLT5tX29iamVj
dC0+cGFyZW50KCksIGZpcnN0TGluZSk7CisgICAgICAgICAgICBwYXJlbnRCb3ggPSBjcmVhdGVM
aW5lQm94ZXMoYW5jZXN0b3JSZW5kZXJlciwgZmlyc3RMaW5lKTsKIAogICAgICAgICAvLyBBcHBl
bmQgdGhlIGlubGluZSBib3ggdG8gdGhpcyBsaW5lLgogICAgICAgICBwYXJlbnRCb3gtPmFkZFRv
TGluZShib3gpOwpAQCAtNjE3LDYgKzYyMSw4IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmNvbXB1dGVI
b3Jpem9udGFsUG9zaXQKICAgICB1bnNpZ25lZCBudW1TcGFjZXMgPSAwOwogICAgIEVUZXh0QWxp
Z24gdGV4dEFsaWduID0gc3R5bGUoKS0+dGV4dEFsaWduKCk7CiAKKyAgICBpbnQgeCA9IGxlZnRP
ZmZzZXQoaGVpZ2h0KCksIGZpcnN0TGluZSk7CisKICAgICBmb3IgKEJpZGlSdW4qIHIgPSBmaXJz
dFJ1bjsgcjsgciA9IHItPm5leHQoKSkgewogICAgICAgICBpZiAoIXItPm1fYm94IHx8IHItPm1f
b2JqZWN0LT5pc1Bvc2l0aW9uZWQoKSB8fCByLT5tX2JveC0+aXNMaW5lQnJlYWsoKSkKICAgICAg
ICAgICAgIGNvbnRpbnVlOyAvLyBQb3NpdGlvbmVkIG9iamVjdHMgYXJlIG9ubHkgcGFydGljaXBh
dGluZyB0byBmaWd1cmUgb3V0IHRoZWlyCkBAIC02NTQsNiArNjYwLDEyIEBAIHZvaWQgUmVuZGVy
QmxvY2s6OmNvbXB1dGVIb3Jpem9udGFsUG9zaXQKICAgICAgICAgICAgIHJlbmRlckJveC0+Y2Fs
Y1dpZHRoKCk7CiAgICAgICAgICAgICByLT5tX2JveC0+c2V0V2lkdGgocmVuZGVyQm94LT53aWR0
aCgpKTsKICAgICAgICAgICAgIHRvdFdpZHRoICs9IHJlbmRlckJveC0+bWFyZ2luTGVmdCgpICsg
cmVuZGVyQm94LT5tYXJnaW5SaWdodCgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAo
ci0+bV9vYmplY3QtPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkgeworICAgICAgICAgICAgICAg
IC8vIEFsbG93IHRoZSBmdWxsIGF2YWlsYWJsZSB3aWR0aCB0byBiZSB1c2VkLCBzaW5jZSBmbG9h
dHMgd2lsbCBpbnRydWRlIGludG8gb3VyIHNwYWNlLgorICAgICAgICAgICAgICAgIGF2YWlsYWJs
ZVdpZHRoID0gcmlnaHRPZmZzZXQoKSAtIGxlZnRPZmZzZXQoKTsKKyAgICAgICAgICAgICAgICB4
ID0gbGVmdE9mZnNldCgpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgdG90
V2lkdGggKz0gci0+bV9ib3gtPndpZHRoKCk7CkBAIC02NjMsNyArNjc1LDYgQEAgdm9pZCBSZW5k
ZXJCbG9jazo6Y29tcHV0ZUhvcml6b250YWxQb3NpdAogICAgIC8vIHdlIG5vdyBleGFtaW5lIG91
ciB0ZXh0LWFsaWduIHByb3BlcnR5IGluIG9yZGVyIHRvIGRldGVybWluZSB3aGVyZSB0byBwb3Np
dGlvbiB0aGUKICAgICAvLyBvYmplY3RzIGhvcml6b250YWxseS4gIFRoZSB0b3RhbCB3aWR0aCBv
ZiB0aGUgbGluZSBjYW4gYmUgaW5jcmVhc2VkIGlmIHdlIGVuZCB1cAogICAgIC8vIGp1c3RpZnlp
bmcgdGV4dC4KLSAgICBpbnQgeCA9IGxlZnRPZmZzZXQoaGVpZ2h0KCksIGZpcnN0TGluZSk7CiAg
ICAgc3dpdGNoICh0ZXh0QWxpZ24pIHsKICAgICAgICAgY2FzZSBMRUZUOgogICAgICAgICBjYXNl
IFdFQktJVF9MRUZUOgpAQCAtODE3LDkgKzgyOCwxNSBAQCB2b2lkIFJlbmRlckJsb2NrOjpsYXlv
dXRJbmxpbmVDaGlsZHJlbihiCiAgICAgYm9vbCB1c2VSZXBhaW50Qm91bmRzID0gZmFsc2U7CiAg
ICAgCiAgICAgbV9vdmVyZmxvdy5jbGVhcigpOwotICAgICAgICAKLSAgICBzZXRIZWlnaHQoYm9y
ZGVyVG9wKCkgKyBwYWRkaW5nVG9wKCkpOwotICAgIGludCB0b0FkZCA9IGJvcmRlckJvdHRvbSgp
ICsgcGFkZGluZ0JvdHRvbSgpICsgaG9yaXpvbnRhbFNjcm9sbGJhckhlaWdodCgpOworICAgIAor
ICAgIGludCB0b3AgPSBib3JkZXJUb3AoKSArIHBhZGRpbmdUb3AoKTsKKyAgICBpbnQgYm90dG9t
ID0gYm9yZGVyQm90dG9tKCkgKyBwYWRkaW5nQm90dG9tKCkgKyBob3Jpem9udGFsU2Nyb2xsYmFy
SGVpZ2h0KCk7CisKKyAgICBzZXRIZWlnaHQodG9wKTsKKworICAgIC8vIFRoZSBtYXJnaW4gc3Ry
dWN0IGNhY2hlcyBhbGwgb3VyIGN1cnJlbnQgbWFyZ2luIGNvbGxhcHNpbmcgc3RhdGUuIFdlIHJ1
biBtYXJnaW4gY29sbGFwc2luZyB3aGVuIHdlIGVuY291bnRlciBhbm9ueW1vdXMgaW5saW5lIGJs
b2NrcyB0aGF0IGFyZSBiZWluZyB1c2VkCisgICAgLy8gZm9yIHRoZSBibG9ja3MtaW5zaWRlLWlu
bGluZXMgY2FzZSAoYW5kIHRoZSBpbmxpbmVzIGFyZSBlbXB0eSksIGUuZywgPHNwYW4+PGRpdj5P
bmU8L2Rpdj48L3NwYW4+LgorICAgIE1hcmdpbkluZm8gbWFyZ2luSW5mbyh0aGlzLCB0b3AsIGJv
dHRvbSk7CiAKICAgICAvLyBGaWd1cmUgb3V0IGlmIHdlIHNob3VsZCBjbGVhciBvdXQgb3VyIGxp
bmUgYm94ZXMuCiAgICAgLy8gRklYTUU6IEhhbmRsZSByZXNpemUgZXZlbnR1YWxseSEKQEAgLTg0
NywxMiArODY0LDE1IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmxheW91dElubGluZUNoaWxkcmVuKGIK
ICAgICAgICAgICAgIGlmIChvLT5pc1JlcGxhY2VkKCkgfHwgby0+aXNGbG9hdGluZygpIHx8IG8t
PmlzUG9zaXRpb25lZCgpKSB7CiAgICAgICAgICAgICAgICAgUmVuZGVyQm94KiBib3ggPSB0b1Jl
bmRlckJveChvKTsKICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVsYXlv
dXRDaGlsZHJlbiB8fCBvLT5zdHlsZSgpLT53aWR0aCgpLmlzUGVyY2VudCgpIHx8IG8tPnN0eWxl
KCktPmhlaWdodCgpLmlzUGVyY2VudCgpKQotICAgICAgICAgICAgICAgICAgICBvLT5zZXRDaGls
ZE5lZWRzTGF5b3V0KHRydWUsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgCisgICAgICAg
ICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGxheW91dCBjaGlsZHJlbiBpZiB0aGV5IG5lZWQgaXQu
CisgICAgICAgICAgICAgICAgLy8gRklYTUU6IFRlY2huaWNhbGx5IHBlcmNlbnRhZ2UgaGVpZ2h0
IG9iamVjdHMgb25seSBuZWVkIGEgcmVsYXlvdXQgaWYgdGhlaXIgcGVyY2VudGFnZSBpc24ndCBn
b2luZyB0byBiZSB0dXJuZWQgaW50bworICAgICAgICAgICAgICAgIC8vIGFuIGF1dG8gdmFsdWUu
ICBBZGQgYSBtZXRob2QgdG8gZGV0ZXJtaW5lIHRoaXMsIHNvIHRoYXQgd2UgY2FuIGF2b2lkIHRo
ZSByZWxheW91dC4KKyAgICAgICAgICAgICAgICBpZiAocmVsYXlvdXRDaGlsZHJlbiB8fCAoKGJv
eC0+c3R5bGUoKS0+aGVpZ2h0KCkuaXNQZXJjZW50KCkgfHwgYm94LT5zdHlsZSgpLT5taW5IZWln
aHQoKS5pc1BlcmNlbnQoKSB8fCBib3gtPnN0eWxlKCktPm1heEhlaWdodCgpLmlzUGVyY2VudCgp
KSkpCisgICAgICAgICAgICAgICAgICAgIGJveC0+c2V0Q2hpbGROZWVkc0xheW91dCh0cnVlLCBm
YWxzZSk7CisKICAgICAgICAgICAgICAgICAvLyBJZiByZWxheW91dENoaWxkcmVuIGlzIHNldCBh
bmQgd2UgaGF2ZSBwZXJjZW50YWdlIHBhZGRpbmcsIHdlIGFsc28gbmVlZCB0byBpbnZhbGlkYXRl
IHRoZSBjaGlsZCdzIHByZWYgd2lkdGhzLgotICAgICAgICAgICAgICAgIGlmIChyZWxheW91dENo
aWxkcmVuICYmIChvLT5zdHlsZSgpLT5wYWRkaW5nTGVmdCgpLmlzUGVyY2VudCgpIHx8IG8tPnN0
eWxlKCktPnBhZGRpbmdSaWdodCgpLmlzUGVyY2VudCgpKSkKLSAgICAgICAgICAgICAgICAgICAg
by0+c2V0UHJlZldpZHRoc0RpcnR5KHRydWUsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBpZiAo
cmVsYXlvdXRDaGlsZHJlbiAmJiAoYm94LT5zdHlsZSgpLT5wYWRkaW5nTGVmdCgpLmlzUGVyY2Vu
dCgpIHx8IGJveC0+c3R5bGUoKS0+cGFkZGluZ1JpZ2h0KCkuaXNQZXJjZW50KCkpKQorICAgICAg
ICAgICAgICAgICAgICBib3gtPnNldFByZWZXaWR0aHNEaXJ0eSh0cnVlLCBmYWxzZSk7CiAgICAg
ICAgICAgICAKICAgICAgICAgICAgICAgICBpZiAoby0+aXNQb3NpdGlvbmVkKCkpCiAgICAgICAg
ICAgICAgICAgICAgIG8tPmNvbnRhaW5pbmdCbG9jaygpLT5pbnNlcnRQb3NpdGlvbmVkT2JqZWN0
KGJveCk7CkBAIC04NjIsNyArODgyLDggQEAgdm9pZCBSZW5kZXJCbG9jazo6bGF5b3V0SW5saW5l
Q2hpbGRyZW4oYgogICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmdWxsTGF5b3V0IHx8IG8t
Pm5lZWRzTGF5b3V0KCkpIC8vIFJlcGxhY2VkIGVsZW1lbnRzCiAgICAgICAgICAgICAgICAgICAg
ICAgICB0b1JlbmRlckJveChvKS0+ZGlydHlMaW5lQm94ZXMoZnVsbExheW91dCk7CiAKLSAgICAg
ICAgICAgICAgICAgICAgby0+bGF5b3V0SWZOZWVkZWQoKTsKKyAgICAgICAgICAgICAgICAgICAg
aWYgKCFvLT5pc1JlcGxhY2VkKCkgfHwgIW8tPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkKKyAg
ICAgICAgICAgICAgICAgICAgICAgIG8tPmxheW91dElmTmVlZGVkKCk7CiAgICAgICAgICAgICAg
ICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmIChvLT5pc1RleHQoKSB8fCAoby0+aXNSZW5kZXJJ
bmxpbmUoKSAmJiAhZW5kT2ZJbmxpbmUpKSB7CiAgICAgICAgICAgICAgICAgaWYgKGZ1bGxMYXlv
dXQgfHwgby0+c2VsZk5lZWRzTGF5b3V0KCkpCkBAIC05NTYsNyArOTc3LDcgQEAgdm9pZCBSZW5k
ZXJCbG9jazo6bGF5b3V0SW5saW5lQ2hpbGRyZW4oYgogICAgICAgICAgICAgaXNMaW5lRW1wdHkg
PSB0cnVlOwogICAgICAgICAgICAgCiAgICAgICAgICAgICBFQ2xlYXIgY2xlYXIgPSBDTk9ORTsK
LSAgICAgICAgICAgIGVuZCA9IGZpbmROZXh0TGluZUJyZWFrKHJlc29sdmVyLCBmaXJzdExpbmUs
IGlzTGluZUVtcHR5LCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHksICZjbGVhcik7CisgICAgICAg
ICAgICBlbmQgPSBmaW5kTmV4dExpbmVCcmVhayhyZXNvbHZlciwgZmlyc3RMaW5lLCBpc0xpbmVF
bXB0eSwgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5LCBtYXJnaW5JbmZvLCAmY2xlYXIpOwogICAg
ICAgICAgICAgaWYgKHJlc29sdmVyLnBvc2l0aW9uKCkuYXRFbmQoKSkgewogICAgICAgICAgICAg
ICAgIHJlc29sdmVyLmRlbGV0ZVJ1bnMoKTsKICAgICAgICAgICAgICAgICBjaGVja0ZvckZsb2F0
c0Zyb21MYXN0TGluZSA9IHRydWU7CkBAIC0xMTQ3LDggKzExNjgsOSBAQCB2b2lkIFJlbmRlckJs
b2NrOjpsYXlvdXRJbmxpbmVDaGlsZHJlbihiCiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBO
b3cgYWRkIGluIHRoZSBib3R0b20gYm9yZGVyL3BhZGRpbmcuCi0gICAgc2V0SGVpZ2h0KGhlaWdo
dCgpICsgdG9BZGQpOworICAgIC8vIE5vdyBkbyB0aGUgaGFuZGxpbmcgb2YgdGhlIGJvdHRvbSBv
ZiB0aGUgYmxvY2ssIGFkZGluZyBpbiBvdXIgYm90dG9tIGJvcmRlci9wYWRkaW5nIGFuZAorICAg
IC8vIGRldGVybWluaW5nIHRoZSBjb3JyZWN0IGNvbGxhcHNlZCBib3R0b20gbWFyZ2luIGluZm9y
bWF0aW9uLgorICAgIGhhbmRsZUJvdHRvbU9mQmxvY2sodG9wLCBib3R0b20sIG1hcmdpbkluZm8p
OwogCiAgICAgaWYgKCFmaXJzdExpbmVCb3goKSAmJiBoYXNMaW5lSWZFbXB0eSgpKQogICAgICAg
ICBzZXRIZWlnaHQoaGVpZ2h0KCkgKyBsaW5lSGVpZ2h0KHRydWUsIHRydWUpKTsKQEAgLTExNjks
NiArMTE5MSwxMiBAQCBSb290SW5saW5lQm94KiBSZW5kZXJCbG9jazo6ZGV0ZXJtaW5lU3RhCiAg
ICAgaWYgKCFmdWxsTGF5b3V0KSB7CiAgICAgICAgIHNpemVfdCBmbG9hdEluZGV4ID0gMDsKICAg
ICAgICAgZm9yIChjdXJyID0gZmlyc3RSb290Qm94KCk7IGN1cnIgJiYgIWN1cnItPmlzRGlydHko
KTsgY3VyciA9IGN1cnItPm5leHRSb290Qm94KCkpIHsKKyAgICAgICAgICAgIGlmIChjdXJyLT5h
bm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CisgICAgICAgICAgICAgICAgLy8gRklYTUU6IFdlIGhh
dmUgdG8gZG8gYmV0dGVyIHRoYW4gdGhpcyBvciB3ZSB3aWxsIHJlcGFpbnQgdG9vIG11Y2ggYXMg
Y29udGVudCBpbnNpZGUgYW4KKyAgICAgICAgICAgICAgICAvLyBhbm9ueW1vdXMgaW5saW5lIGJs
b2NrIGNvbWVzIGluLgorICAgICAgICAgICAgICAgIGZ1bGxMYXlvdXQgPSB0cnVlOworICAgICAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKFZlY3RvcjxS
ZW5kZXJCb3gqPiogY2xlYW5MaW5lRmxvYXRzID0gY3Vyci0+ZmxvYXRzUHRyKCkpIHsKICAgICAg
ICAgICAgICAgICBWZWN0b3I8UmVuZGVyQm94Kj46Oml0ZXJhdG9yIGVuZCA9IGNsZWFuTGluZUZs
b2F0cy0+ZW5kKCk7CiAgICAgICAgICAgICAgICAgZm9yIChWZWN0b3I8UmVuZGVyQm94Kj46Oml0
ZXJhdG9yIG8gPSBjbGVhbkxpbmVGbG9hdHMtPmJlZ2luKCk7IG8gIT0gZW5kOyArK28pIHsKQEAg
LTE1ODMsNyArMTYxMSw3IEBAIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgdGV4dFdpZHRoKFJlbmRl
clQKIH0KIAogSW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6OmZpbmROZXh0TGluZUJyZWFrKElu
bGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIsIGJvb2wgZmlyc3RMaW5lLCAgYm9vbCYgaXNMaW5l
RW1wdHksIGJvb2wmIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSwgCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUNsZWFyKiBjbGVhcikKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXJnaW5JbmZvJiBtYXJnaW5JbmZv
LCBFQ2xlYXIqIGNsZWFyKQogewogICAgIEFTU0VSVChyZXNvbHZlci5wb3NpdGlvbigpLmJsb2Nr
ID09IHRoaXMpOwogCkBAIC0xNjI0LDYgKzE2NTIsMTAgQEAgSW5saW5lSXRlcmF0b3IgUmVuZGVy
QmxvY2s6OmZpbmROZXh0TGluZQogICAgIGJvb2wgYXV0b1dyYXBXYXNFdmVyVHJ1ZU9uTGluZSA9
IGZhbHNlOwogICAgIGJvb2wgZmxvYXRzRml0T25MaW5lID0gdHJ1ZTsKICAgICAKKyAgICBib29s
IGlzQmxvY2tJbnNpZGVJbmxpbmUgPSBmYWxzZTsKKyAgICBpbnQgcHJldmlvdXNCbG9ja0Zsb2F0
Qm90dG9tID0gMDsKKyAgICBpbnQgbWF4QmxvY2tGbG9hdEJvdHRvbSA9IDA7CisKICAgICAvLyBG
aXJlZm94IGFuZCBPcGVyYSB3aWxsIGFsbG93IGEgdGFibGUgY2VsbCB0byBncm93IHRvIGZpdCBh
biBpbWFnZSBpbnNpZGUgaXQgdW5kZXIKICAgICAvLyB2ZXJ5IHNwZWNpZmljIGNpcmN1bXN0YW5j
ZXMgKGluIG9yZGVyIHRvIG1hdGNoIGNvbW1vbiBXaW5JRSByZW5kZXJpbmdzKS4gCiAgICAgLy8g
Tm90IHN1cHBvcnRpbmcgdGhlIHF1aXJrIGhhcyBjYXVzZWQgdXMgdG8gbWlzLXJlbmRlciBzb21l
IHJlYWwgc2l0ZXMuIChTZWUgQnVnemlsbGEgMTA1MTcuKSAKQEAgLTE2MzQsNyArMTY2Niw4IEBA
IElubGluZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpmaW5kTmV4dExpbmUKICAgICB3aGlsZSAobykg
ewogICAgICAgICBjdXJyV1MgPSBvLT5pc1JlcGxhY2VkKCkgPyBvLT5wYXJlbnQoKS0+c3R5bGUo
KS0+d2hpdGVTcGFjZSgpIDogby0+c3R5bGUoKS0+d2hpdGVTcGFjZSgpOwogICAgICAgICBsYXN0
V1MgPSBsYXN0LT5pc1JlcGxhY2VkKCkgPyBsYXN0LT5wYXJlbnQoKS0+c3R5bGUoKS0+d2hpdGVT
cGFjZSgpIDogbGFzdC0+c3R5bGUoKS0+d2hpdGVTcGFjZSgpOwotICAgICAgICAKKyAgICAgICAg
aXNCbG9ja0luc2lkZUlubGluZSA9IG8tPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKTsKKwogICAg
ICAgICBib29sIGF1dG9XcmFwID0gUmVuZGVyU3R5bGU6OmF1dG9XcmFwKGN1cnJXUyk7CiAgICAg
ICAgIGF1dG9XcmFwV2FzRXZlclRydWVPbkxpbmUgPSBhdXRvV3JhcFdhc0V2ZXJUcnVlT25MaW5l
IHx8IGF1dG9XcmFwOwogCkBAIC0xNjQ1LDcgKzE2NzgsMTIgQEAgSW5saW5lSXRlcmF0b3IgUmVu
ZGVyQmxvY2s6OmZpbmROZXh0TGluZQogI2VuZGlmCiAKICAgICAgICAgYm9vbCBjb2xsYXBzZVdo
aXRlU3BhY2UgPSBSZW5kZXJTdHlsZTo6Y29sbGFwc2VXaGl0ZVNwYWNlKGN1cnJXUyk7Ci0gICAg
ICAgICAgICAKKyAgICAgICAgCisgICAgICAgIGlmICghaXNCbG9ja0luc2lkZUlubGluZSkgewor
ICAgICAgICAgICAgbWFyZ2luSW5mby5zZXRBdFRvcE9mQmxvY2soZmFsc2UpOworICAgICAgICAg
ICAgbWFyZ2luSW5mby5jbGVhck1hcmdpbigpOworICAgICAgICB9CisKICAgICAgICAgaWYgKG8t
PmlzQlIoKSkgewogICAgICAgICAgICAgaWYgKHcgKyB0bXBXIDw9IHdpZHRoKSB7CiAgICAgICAg
ICAgICAgICAgbEJyZWFrLm9iaiA9IG87CkBAIC0xNzUyLDggKzE3OTAsOSBAQCBJbmxpbmVJdGVy
YXRvciBSZW5kZXJCbG9jazo6ZmluZE5leHRMaW5lCiAgICAgICAgIH0gZWxzZSBpZiAoby0+aXNS
ZXBsYWNlZCgpKSB7CiAgICAgICAgICAgICBSZW5kZXJCb3gqIHJlcGxhY2VkQm94ID0gdG9SZW5k
ZXJCb3gobyk7CiAKLSAgICAgICAgICAgIC8vIEJyZWFrIG9uIHJlcGxhY2VkIGVsZW1lbnRzIGlm
IGVpdGhlciBoYXMgbm9ybWFsIHdoaXRlLXNwYWNlLgotICAgICAgICAgICAgaWYgKChhdXRvV3Jh
cCB8fCBSZW5kZXJTdHlsZTo6YXV0b1dyYXAobGFzdFdTKSkgJiYgKCFvLT5pc0ltYWdlKCkgfHwg
YWxsb3dJbWFnZXNUb0JyZWFrKSkgeworICAgICAgICAgICAgLy8gQnJlYWsgb24gcmVwbGFjZWQg
ZWxlbWVudHMgaWYgZWl0aGVyIGhhcyBub3JtYWwgd2hpdGUtc3BhY2UuICBXZSBhbHNvIGFsd2F5
cyBicmVhayBpZiB3ZQorICAgICAgICAgICAgLy8gZW5jb3VudGVyIGEgc3BlY2lhbCBhbm9ueW1v
dXMgaW5saW5lIGJsb2NrICh1c2VkIHRvIGhvbGQgYmxvY2tzIGluc2lkZSBpbmxpbmVzKS4KKyAg
ICAgICAgICAgIGlmICgoYXV0b1dyYXAgfHwgUmVuZGVyU3R5bGU6OmF1dG9XcmFwKGxhc3RXUykg
fHwgaXNCbG9ja0luc2lkZUlubGluZSkgICYmICghby0+aXNJbWFnZSgpIHx8IGFsbG93SW1hZ2Vz
VG9CcmVhaykpIHsKICAgICAgICAgICAgICAgICB3ICs9IHRtcFc7CiAgICAgICAgICAgICAgICAg
dG1wVyA9IDA7CiAgICAgICAgICAgICAgICAgbEJyZWFrLm9iaiA9IG87CkBAIC0xNzYxLDYgKzE4
MDAsMjAgQEAgSW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6OmZpbmROZXh0TGluZQogICAgICAg
ICAgICAgICAgIGxCcmVhay5uZXh0QnJlYWthYmxlUG9zaXRpb24gPSAtMTsKICAgICAgICAgICAg
IH0KIAorICAgICAgICAgICAgaWYgKGlzQmxvY2tJbnNpZGVJbmxpbmUpIHsKKyAgICAgICAgICAg
ICAgICBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHkgPSB0cnVlOworICAgICAgICAgICAgICAgIGlm
ICghaXNMaW5lRW1wdHkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOworCisgICAgICAg
ICAgICAgICAgLy8gUmVzZXQgdGhlIHdpZHRoIHRvIGlnbm9yZSBmbG9hdHMsIHNpbmNlIHdlJ3Jl
IGdvaW5nIHRvIGFsbG93IHRoZW0gdG8gaW50cnVkZSBpbnRvIG91ciBzcGFjZS4KKyAgICAgICAg
ICAgICAgICB3aWR0aCA9IHJpZ2h0T2Zmc2V0KCkgLSBsZWZ0T2Zmc2V0KCk7CisKKyAgICAgICAg
ICAgICAgICBsYXlvdXRCbG9ja0NoaWxkKHJlcGxhY2VkQm94LCBtYXJnaW5JbmZvLCBwcmV2aW91
c0Jsb2NrRmxvYXRCb3R0b20sIG1heEJsb2NrRmxvYXRCb3R0b20pOworICAgICAgICAgICAgICAg
IHNldEhlaWdodChoZWlnaHQoKSAtIHJlcGxhY2VkQm94LT5oZWlnaHQoKSk7CisKKyAgICAgICAg
ICAgICAgICBsaW5lTWlkcG9pbnRTdGF0ZS5iZXR3ZWVuTWlkcG9pbnRzID0gZmFsc2U7CisgICAg
ICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChpZ25vcmluZ1NwYWNlcykKICAgICAgICAgICAg
ICAgICBhZGRNaWRwb2ludChsaW5lTWlkcG9pbnRTdGF0ZSwgSW5saW5lSXRlcmF0b3IoMCwgbywg
MCkpOwogCkBAIC0xNzgyLDYgKzE4MzUsMTUgQEAgSW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6
OmZpbmROZXh0TGluZQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZQogICAg
ICAgICAgICAgICAgIHRtcFcgKz0gcmVwbGFjZWRCb3gtPndpZHRoKCkgKyByZXBsYWNlZEJveC0+
bWFyZ2luTGVmdCgpICsgcmVwbGFjZWRCb3gtPm1hcmdpblJpZ2h0KCkgKyBpbmxpbmVXaWR0aChv
KTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChpc0Jsb2NrSW5zaWRlSW5saW5l
KSB7CisgICAgICAgICAgICAgICAgdyArPSB0bXBXOworICAgICAgICAgICAgICAgIHRtcFcgPSAw
OworICAgICAgICAgICAgICAgIGxCcmVhay5vYmogPSBvOworICAgICAgICAgICAgICAgIGxCcmVh
ay5wb3MgPSAwOworICAgICAgICAgICAgICAgIGxCcmVhay5uZXh0QnJlYWthYmxlUG9zaXRpb24g
PSAtMTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KICAgICAgICAg
fSBlbHNlIGlmIChvLT5pc1RleHQoKSkgewogICAgICAgICAgICAgaWYgKCFwb3MpCiAgICAgICAg
ICAgICAgICAgYXBwbGllZFN0YXJ0V2lkdGggPSBmYWxzZTsKSW5kZXg6IFdlYkNvcmUvcmVuZGVy
aW5nL1JlbmRlckJveC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVy
Qm94LmNwcAkocmV2aXNpb24gNDc1OTEpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCb3gu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMjg0LDcgKzEyODQsNyBAQCB2b2lkIFJlbmRlckJveDo6
Y2FsY1dpZHRoKCkKICAgICB9CiAKICAgICBpZiAoY29udGFpbmVyV2lkdGggJiYgY29udGFpbmVy
V2lkdGggIT0gKHdpZHRoKCkgKyBtX21hcmdpbkxlZnQgKyBtX21hcmdpblJpZ2h0KQotICAgICAg
ICAgICAgJiYgIWlzRmxvYXRpbmcoKSAmJiAhaXNJbmxpbmUoKSAmJiAhY2ItPmlzRmxleGlibGVC
b3goKSkgeworICAgICAgICAgICAgJiYgIWlzRmxvYXRpbmcoKSAmJiAoIWlzSW5saW5lKCkgfHwg
aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKSAmJiAhY2ItPmlzRmxleGlibGVCb3goKSkgewogICAg
ICAgICBpZiAoY2ItPnN0eWxlKCktPmRpcmVjdGlvbigpID09IExUUikKICAgICAgICAgICAgIG1f
bWFyZ2luUmlnaHQgPSBjb250YWluZXJXaWR0aCAtIHdpZHRoKCkgLSBtX21hcmdpbkxlZnQ7CiAg
ICAgICAgIGVsc2UKQEAgLTEzMjMsNyArMTMyMyw3IEBAIGJvb2wgUmVuZGVyQm94OjpzaXplc1Rv
SW50cmluc2ljV2lkdGgoV2kKIHsKICAgICAvLyBNYXJxdWVlcyBpbiBXaW5JRSBhcmUgbGlrZSBh
IG1peHR1cmUgb2YgYmxvY2tzIGFuZCBpbmxpbmUtYmxvY2tzLiAgVGhleSBzaXplIGFzIHRob3Vn
aCB0aGV5J3JlIGJsb2NrcywKICAgICAvLyBidXQgdGhleSBhbGxvdyB0ZXh0IHRvIHNpdCBvbiB0
aGUgc2FtZSBsaW5lIGFzIHRoZSBtYXJxdWVlLgotICAgIGlmIChpc0Zsb2F0aW5nKCkgfHwgKGlz
SW5saW5lQmxvY2tPcklubGluZVRhYmxlKCkgJiYgIWlzSFRNTE1hcnF1ZWUoKSkpCisgICAgaWYg
KGlzRmxvYXRpbmcoKSB8fCAoaXNJbmxpbmVCbG9ja09ySW5saW5lVGFibGUoKSAmJiAhaXNIVE1M
TWFycXVlZSgpICYmICFpc0Fub255bW91c0lubGluZUJsb2NrKCkpKQogICAgICAgICByZXR1cm4g
dHJ1ZTsKIAogICAgIC8vIFRoaXMgY29kZSBtYXkgbG9vayBhIGJpdCBzdHJhbmdlLiAgQmFzaWNh
bGx5IHdpZHRoOmludHJpbnNpYyBzaG91bGQgY2xhbXAgdGhlIHNpemUgd2hlbiB0ZXN0aW5nIGJv
dGgKQEAgLTI3NjksNyArMjc2OSw3IEBAIGJvb2wgUmVuZGVyQm94OjpzaHJpbmtUb0F2b2lkRmxv
YXRzKCkgY28KIAogYm9vbCBSZW5kZXJCb3g6OmF2b2lkc0Zsb2F0cygpIGNvbnN0CiB7Ci0gICAg
cmV0dXJuIGlzUmVwbGFjZWQoKSB8fCBoYXNPdmVyZmxvd0NsaXAoKSB8fCBpc0hSKCk7CisgICAg
cmV0dXJuICFpc0Fub255bW91c0lubGluZUJsb2NrKCkgJiYgKGlzUmVwbGFjZWQoKSB8fCBoYXNP
dmVyZmxvd0NsaXAoKSB8fCBpc0hSKCkpOwogfQogCiB2b2lkIFJlbmRlckJveDo6YWRkU2hhZG93
T3ZlcmZsb3coKQpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVySW5saW5lLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJJbmxpbmUuY3BwCShyZXZpc2lvbiA0
NzY0MykKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlcklubGluZS5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTQyLDcgKzQyLDYgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogCiBSZW5kZXJJbmxpbmU6
OlJlbmRlcklubGluZShOb2RlKiBub2RlKQogICAgIDogUmVuZGVyQm94TW9kZWxPYmplY3Qobm9k
ZSkKLSAgICAsIG1fY29udGludWF0aW9uKDApCiAgICAgLCBtX2xpbmVIZWlnaHQoLTEpCiAgICAg
LCBtX3ZlcnRpY2FsUG9zaXRpb24oUG9zaXRpb25VbmRlZmluZWQpCiB7CkBAIC01MSwxMSArNTAs
NiBAQCBSZW5kZXJJbmxpbmU6OlJlbmRlcklubGluZShOb2RlKiBub2RlKQogCiB2b2lkIFJlbmRl
cklubGluZTo6ZGVzdHJveSgpCiB7Ci0gICAgLy8gRGV0YWNoIG91ciBjb250aW51YXRpb24gZmly
c3QuCi0gICAgaWYgKG1fY29udGludWF0aW9uKQotICAgICAgICBtX2NvbnRpbnVhdGlvbi0+ZGVz
dHJveSgpOwotICAgIG1fY29udGludWF0aW9uID0gMDsKLSAgICAKICAgICAvLyBNYWtlIHN1cmUg
dG8gZGVzdHJveSBhbm9ueW1vdXMgY2hpbGRyZW4gZmlyc3Qgd2hpbGUgdGhleSBhcmUgc3RpbGwg
Y29ubmVjdGVkIHRvIHRoZSByZXN0IG9mIHRoZSB0cmVlLCBzbyB0aGF0IHRoZXkgd2lsbAogICAg
IC8vIHByb3Blcmx5IGRpcnR5IGxpbmUgYm94ZXMgdGhhdCB0aGV5IGFyZSByZW1vdmVkIGZyb20u
ICBFZmZlY3RzIHRoYXQgZG8gOmJlZm9yZS86YWZ0ZXIgb25seSBvbiBob3ZlciBjb3VsZCBjcmFz
aCBvdGhlcndpc2UuCiAgICAgY2hpbGRyZW4oKS0+ZGVzdHJveUxlZnRvdmVyQ2hpbGRyZW4oKTsK
QEAgLTg3LDEzICs4MSw2IEBAIHZvaWQgUmVuZGVySW5saW5lOjpkZXN0cm95KCkKICAgICBSZW5k
ZXJCb3hNb2RlbE9iamVjdDo6ZGVzdHJveSgpOwogfQogCi1SZW5kZXJJbmxpbmUqIFJlbmRlcklu
bGluZTo6aW5saW5lQ29udGludWF0aW9uKCkgY29uc3QKLXsKLSAgICBpZiAoIW1fY29udGludWF0
aW9uIHx8IG1fY29udGludWF0aW9uLT5pc0lubGluZSgpKQotICAgICAgICByZXR1cm4gdG9SZW5k
ZXJJbmxpbmUobV9jb250aW51YXRpb24pOwotICAgIHJldHVybiB0b1JlbmRlckJsb2NrKG1fY29u
dGludWF0aW9uKS0+aW5saW5lQ29udGludWF0aW9uKCk7Ci19Ci0KIHZvaWQgUmVuZGVySW5saW5l
Ojp1cGRhdGVCb3hNb2RlbEluZm9Gcm9tU3R5bGUoKQogewogICAgIFJlbmRlckJveE1vZGVsT2Jq
ZWN0Ojp1cGRhdGVCb3hNb2RlbEluZm9Gcm9tU3R5bGUoKTsKQEAgLTEwOSwxOSArOTYsNiBAQCB2
b2lkIFJlbmRlcklubGluZTo6c3R5bGVEaWRDaGFuZ2UoU3R5bGVECiB7CiAgICAgUmVuZGVyQm94
TW9kZWxPYmplY3Q6OnN0eWxlRGlkQ2hhbmdlKGRpZmYsIG9sZFN0eWxlKTsKIAotICAgIC8vIEVu
c3VyZSB0aGF0IGFsbCBvZiB0aGUgc3BsaXQgaW5saW5lcyBwaWNrIHVwIHRoZSBuZXcgc3R5bGUu
IFdlCi0gICAgLy8gb25seSBkbyB0aGlzIGlmIHdlJ3JlIGFuIGlubGluZSwgc2luY2Ugd2UgZG9u
J3Qgd2FudCB0byBwcm9wYWdhdGUKLSAgICAvLyBhIGJsb2NrJ3Mgc3R5bGUgdG8gdGhlIG90aGVy
IGlubGluZXMuCi0gICAgLy8gZS5nLiwgPGZvbnQ+Zm9vIDxoND5nb288L2g0PiBtb288L2ZvbnQ+
LiAgVGhlIDxmb250PiBpbmxpbmVzIGJlZm9yZQotICAgIC8vIGFuZCBhZnRlciB0aGUgYmxvY2sg
c2hhcmUgdGhlIHNhbWUgc3R5bGUsIGJ1dCB0aGUgYmxvY2sgZG9lc24ndAotICAgIC8vIG5lZWQg
dG8gcGFzcyBpdHMgc3R5bGUgb24gdG8gYW55b25lIGVsc2UuCi0gICAgZm9yIChSZW5kZXJJbmxp
bmUqIGN1cnJDb250ID0gaW5saW5lQ29udGludWF0aW9uKCk7IGN1cnJDb250OyBjdXJyQ29udCA9
IGN1cnJDb250LT5pbmxpbmVDb250aW51YXRpb24oKSkgewotICAgICAgICBSZW5kZXJCb3hNb2Rl
bE9iamVjdCogbmV4dENvbnQgPSBjdXJyQ29udC0+Y29udGludWF0aW9uKCk7Ci0gICAgICAgIGN1
cnJDb250LT5zZXRDb250aW51YXRpb24oMCk7Ci0gICAgICAgIGN1cnJDb250LT5zZXRTdHlsZShz
dHlsZSgpKTsKLSAgICAgICAgY3VyckNvbnQtPnNldENvbnRpbnVhdGlvbihuZXh0Q29udCk7Ci0g
ICAgfQotCiAgICAgbV9saW5lSGVpZ2h0ID0gLTE7CiAKICAgICAvLyBVcGRhdGUgcHNldWRvcyBm
b3IgOmJlZm9yZSBhbmQgOmFmdGVyIG5vdy4KQEAgLTEzMyw3NyArMTA3LDUyIEBAIHZvaWQgUmVu
ZGVySW5saW5lOjpzdHlsZURpZENoYW5nZShTdHlsZUQKIAogdm9pZCBSZW5kZXJJbmxpbmU6OmFk
ZENoaWxkKFJlbmRlck9iamVjdCogbmV3Q2hpbGQsIFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQp
CiB7Ci0gICAgaWYgKGNvbnRpbnVhdGlvbigpKQotICAgICAgICByZXR1cm4gYWRkQ2hpbGRUb0Nv
bnRpbnVhdGlvbihuZXdDaGlsZCwgYmVmb3JlQ2hpbGQpOwotICAgIHJldHVybiBhZGRDaGlsZEln
bm9yaW5nQ29udGludWF0aW9uKG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7Ci19Ci0KLXN0YXRpYyBS
ZW5kZXJCb3hNb2RlbE9iamVjdCogbmV4dENvbnRpbnVhdGlvbihSZW5kZXJPYmplY3QqIHJlbmRl
cmVyKQotewotICAgIGlmIChyZW5kZXJlci0+aXNJbmxpbmUoKSAmJiAhcmVuZGVyZXItPmlzUmVw
bGFjZWQoKSkKLSAgICAgICAgcmV0dXJuIHRvUmVuZGVySW5saW5lKHJlbmRlcmVyKS0+Y29udGlu
dWF0aW9uKCk7Ci0gICAgcmV0dXJuIHRvUmVuZGVyQmxvY2socmVuZGVyZXIpLT5pbmxpbmVDb250
aW51YXRpb24oKTsKLX0KLQotUmVuZGVyQm94TW9kZWxPYmplY3QqIFJlbmRlcklubGluZTo6Y29u
dGludWF0aW9uQmVmb3JlKFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQpCi17Ci0gICAgaWYgKGJl
Zm9yZUNoaWxkICYmIGJlZm9yZUNoaWxkLT5wYXJlbnQoKSA9PSB0aGlzKQotICAgICAgICByZXR1
cm4gdGhpczsKLQotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBjdXJyID0gbmV4dENvbnRpbnVh
dGlvbih0aGlzKTsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogbmV4dFRvTGFzdCA9IHRoaXM7
Ci0gICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGxhc3QgPSB0aGlzOwotICAgIHdoaWxlIChjdXJy
KSB7Ci0gICAgICAgIGlmIChiZWZvcmVDaGlsZCAmJiBiZWZvcmVDaGlsZC0+cGFyZW50KCkgPT0g
Y3VycikgewotICAgICAgICAgICAgaWYgKGN1cnItPmZpcnN0Q2hpbGQoKSA9PSBiZWZvcmVDaGls
ZCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbGFzdDsKLSAgICAgICAgICAgIHJldHVybiBjdXJy
OwotICAgICAgICB9Ci0KLSAgICAgICAgbmV4dFRvTGFzdCA9IGxhc3Q7Ci0gICAgICAgIGxhc3Qg
PSBjdXJyOwotICAgICAgICBjdXJyID0gbmV4dENvbnRpbnVhdGlvbihjdXJyKTsKLSAgICB9Ci0K
LSAgICBpZiAoIWJlZm9yZUNoaWxkICYmICFsYXN0LT5maXJzdENoaWxkKCkpCi0gICAgICAgIHJl
dHVybiBuZXh0VG9MYXN0OwotICAgIHJldHVybiBsYXN0OwotfQotCi12b2lkIFJlbmRlcklubGlu
ZTo6YWRkQ2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihSZW5kZXJPYmplY3QqIG5ld0NoaWxkLCBS
ZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkKQotewogICAgIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBh
cHBlbmQgdGhpbmdzIGFmdGVyIDphZnRlci1nZW5lcmF0ZWQgY29udGVudCBpZiB3ZSBoYXZlIGl0
LgogICAgIGlmICghYmVmb3JlQ2hpbGQgJiYgaXNBZnRlckNvbnRlbnQobGFzdENoaWxkKCkpKQog
ICAgICAgICBiZWZvcmVDaGlsZCA9IGxhc3RDaGlsZCgpOwogCi0gICAgaWYgKCFuZXdDaGlsZC0+
aXNJbmxpbmUoKSAmJiAhbmV3Q2hpbGQtPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSkgewotICAg
ICAgICAvLyBXZSBhcmUgcGxhY2luZyBhIGJsb2NrIGluc2lkZSBhbiBpbmxpbmUuIFdlIGhhdmUg
dG8gcGVyZm9ybSBhIHNwbGl0IG9mIHRoaXMKLSAgICAgICAgLy8gaW5saW5lIGludG8gY29udGlu
dWF0aW9ucy4gIFRoaXMgaW52b2x2ZXMgY3JlYXRpbmcgYW4gYW5vbnltb3VzIGJsb2NrIGJveCB0
byBob2xkCi0gICAgICAgIC8vIHxuZXdDaGlsZHwuICBXZSB0aGVuIG1ha2UgdGhhdCBibG9jayBi
b3ggYSBjb250aW51YXRpb24gb2YgdGhpcyBpbmxpbmUuICBXZSB0YWtlIGFsbCBvZgotICAgICAg
ICAvLyB0aGUgY2hpbGRyZW4gYWZ0ZXIgfGJlZm9yZUNoaWxkfCBhbmQgcHV0IHRoZW0gaW4gYSBj
bG9uZSBvZiB0aGlzIG9iamVjdC4KLSAgICAgICAgUmVmUHRyPFJlbmRlclN0eWxlPiBuZXdTdHls
ZSA9IFJlbmRlclN0eWxlOjpjcmVhdGUoKTsKLSAgICAgICAgbmV3U3R5bGUtPmluaGVyaXRGcm9t
KHN0eWxlKCkpOwotICAgICAgICBuZXdTdHlsZS0+c2V0RGlzcGxheShCTE9DSyk7Ci0KLSAgICAg
ICAgUmVuZGVyQmxvY2sqIG5ld0JveCA9IG5ldyAocmVuZGVyQXJlbmEoKSkgUmVuZGVyQmxvY2so
ZG9jdW1lbnQoKSAvKiBhbm9ueW1vdXMgYm94ICovKTsKLSAgICAgICAgbmV3Qm94LT5zZXRTdHls
ZShuZXdTdHlsZS5yZWxlYXNlKCkpOwotICAgICAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogb2xk
Q29udGludWF0aW9uID0gY29udGludWF0aW9uKCk7Ci0gICAgICAgIHNldENvbnRpbnVhdGlvbihu
ZXdCb3gpOwotCi0gICAgICAgIC8vIFNvbWVvbmUgbWF5IGhhdmUgcHV0IGEgPHA+IGluc2lkZSBh
IDxxPiwgY2F1c2luZyBhIHNwbGl0LiAgV2hlbiB0aGlzIGhhcHBlbnMsIHRoZSA6YWZ0ZXIgY29u
dGVudAotICAgICAgICAvLyBoYXMgdG8gbW92ZSBpbnRvIHRoZSBpbmxpbmUgY29udGludWF0aW9u
LiAgQ2FsbCB1cGRhdGVCZWZvcmVBZnRlckNvbnRlbnQgdG8gZW5zdXJlIHRoYXQgb3VyIDphZnRl
cgotICAgICAgICAvLyBjb250ZW50IGdldHMgcHJvcGVybHkgZGVzdHJveWVkLgotICAgICAgICBi
b29sIGlzTGFzdENoaWxkID0gKGJlZm9yZUNoaWxkID09IGxhc3RDaGlsZCgpKTsKLSAgICAgICAg
aWYgKGRvY3VtZW50KCktPnVzZXNCZWZvcmVBZnRlclJ1bGVzKCkpCi0gICAgICAgICAgICBjaGls
ZHJlbigpLT51cGRhdGVCZWZvcmVBZnRlckNvbnRlbnQodGhpcywgQUZURVIpOwotICAgICAgICBp
ZiAoaXNMYXN0Q2hpbGQgJiYgYmVmb3JlQ2hpbGQgIT0gbGFzdENoaWxkKCkpCi0gICAgICAgICAg
ICBiZWZvcmVDaGlsZCA9IDA7IC8vIFdlIGRlc3Ryb3llZCB0aGUgbGFzdCBjaGlsZCwgc28gbm93
IHdlIG5lZWQgdG8gdXBkYXRlIG91ciBpbnNlcnRpb24KLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgLy8gcG9pbnQgdG8gYmUgMC4gIEl0J3MganVzdCBhIHN0cmFpZ2h0IGFwcGVuZCBub3cu
Ci0KLSAgICAgICAgc3BsaXRGbG93KGJlZm9yZUNoaWxkLCBuZXdCb3gsIG5ld0NoaWxkLCBvbGRD
b250aW51YXRpb24pOworICAgIC8vIElmIHRoZSByZXF1ZXN0ZWQgYmVmb3JlQ2hpbGQgaXMgbm90
IG9uZSBvZiBvdXIgY2hpbGRyZW4sIHRoZW4gdGhpcyBpcyBtb3N0IGxpa2VseSBiZWNhdXNlCisg
ICAgLy8gdGhlcmUgaXMgYW4gYW5vbnltb3VzIGlubGluZS1ibG9jayBib3ggd2l0aGluIHRoaXMg
b2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIGJlZm9yZUNoaWxkLiBTbworICAgIC8vIGp1c3QgaW5z
ZXJ0IHRoZSBjaGlsZCBpbnRvIHRoZSBhbm9ueW1vdXMgaW5saW5lLWJsb2NrIGJveCBpbnN0ZWFk
IG9mIGhlcmUuCisgICAgaWYgKGJlZm9yZUNoaWxkICYmIGJlZm9yZUNoaWxkLT5wYXJlbnQoKSAh
PSB0aGlzKSB7CisgICAgICAgIEFTU0VSVChiZWZvcmVDaGlsZC0+cGFyZW50KCkpOworICAgICAg
ICBBU1NFUlQoYmVmb3JlQ2hpbGQtPnBhcmVudCgpLT5pc0Fub255bW91c0lubGluZUJsb2NrKCkp
OworICAgICAgICBpZiAoIW5ld0NoaWxkLT5pc0lubGluZSgpIHx8IChuZXdDaGlsZC0+aXNJbmxp
bmUoKSAmJiBiZWZvcmVDaGlsZC0+cGFyZW50KCktPmZpcnN0Q2hpbGQoKSAhPSBiZWZvcmVDaGls
ZCkpCisgICAgICAgICAgICBiZWZvcmVDaGlsZC0+cGFyZW50KCktPmFkZENoaWxkKG5ld0NoaWxk
LCBiZWZvcmVDaGlsZCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFkZENoaWxkKG5ld0No
aWxkLCBiZWZvcmVDaGlsZC0+cGFyZW50KCkpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCisg
ICAgaWYgKCFuZXdDaGlsZC0+aXNJbmxpbmUoKSkgeworICAgICAgICAvLyBXZSBhcmUgcGxhY2lu
ZyBhIGJsb2NrIGluc2lkZSBhbiBpbmxpbmUuIFdlIGhhdmUgdG8gcGxhY2UgdGhlIGJsb2NrIGlu
c2lkZSBhbiBhbm9ueW1vdXMgaW5saW5lLWJsb2NrLgorICAgICAgICAvLyBUaGlzIGlubGluZS1i
bG9jayBjYW4gaG91c2UgYSBzZXF1ZW5jZSBvZiBjb250aWd1b3VzIGJsb2NrLWxldmVsIGNoaWxk
cmVuLCBhbmQgdGhleSB3aWxsIGFsbCBzaXQgb24gdGhlCisgICAgICAgIC8vIHNhbWUgbGluZSB0
b2dldGhlci4gIFdlIHRyeSB0byByZXVzZSBvbmUgZmlyc3QgaWYgcG9zc2libGUuCisgICAgICAg
IGlmIChiZWZvcmVDaGlsZCkgeworICAgICAgICAgICAgaWYgKGJlZm9yZUNoaWxkLT5wcmV2aW91
c1NpYmxpbmcoKSAmJiBiZWZvcmVDaGlsZC0+cHJldmlvdXNTaWJsaW5nKCktPmlzQW5vbnltb3Vz
SW5saW5lQmxvY2soKSkgeworICAgICAgICAgICAgICAgIGJlZm9yZUNoaWxkLT5wcmV2aW91c1Np
YmxpbmcoKS0+YWRkQ2hpbGQobmV3Q2hpbGQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChsYXN0Q2hpbGQo
KSAmJiBsYXN0Q2hpbGQoKS0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CisgICAgICAgICAg
ICAgICAgbGFzdENoaWxkKCktPmFkZENoaWxkKG5ld0NoaWxkKTsKKyAgICAgICAgICAgICAgICBy
ZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAKKyAgICAgICAgaWYgKCFuZXdDaGls
ZC0+aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpKSB7CisgICAgICAgICAgICAvLyBUaGVyZSB3YXMg
bm8gc3VpdGFibGUgZXhpc3RpbmcgYW5vbnltb3VzIGJveC4gIENyZWF0ZSBhIG5ldyBvbmUuCisg
ICAgICAgICAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IG5ld1N0eWxlID0gUmVuZGVyU3R5bGU6OmNy
ZWF0ZSgpOworICAgICAgICAgICAgbmV3U3R5bGUtPmluaGVyaXRGcm9tKHN0eWxlKCkpOworICAg
ICAgICAgICAgbmV3U3R5bGUtPnNldERpc3BsYXkoSU5MSU5FX0JMT0NLKTsKKyAgICAgICAgICAg
IFJlbmRlckJsb2NrKiBuZXdCb3ggPSBuZXcgKHJlbmRlckFyZW5hKCkpIFJlbmRlckJsb2NrKGRv
Y3VtZW50KCkpOworICAgICAgICAgICAgbmV3Qm94LT5zZXRTdHlsZShuZXdTdHlsZSk7CisgICAg
ICAgICAgICBSZW5kZXJCb3hNb2RlbE9iamVjdDo6YWRkQ2hpbGQobmV3Qm94LCBiZWZvcmVDaGls
ZCk7CisgICAgICAgICAgICBuZXdCb3gtPmFkZENoaWxkKG5ld0NoaWxkKTsKKyAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKwogICAgIFJlbmRlckJveE1vZGVsT2JqZWN0Ojph
ZGRDaGlsZChuZXdDaGlsZCwgYmVmb3JlQ2hpbGQpOwogCiAgICAgbmV3Q2hpbGQtPnNldE5lZWRz
TGF5b3V0QW5kUHJlZldpZHRoc1JlY2FsYygpOwpAQCAtMjE2LDE4OCArMTY1LDYgQEAgUmVuZGVy
SW5saW5lKiBSZW5kZXJJbmxpbmU6OmNsb25lSW5saW5lKAogICAgIHJldHVybiBvOwogfQogCi12
b2lkIFJlbmRlcklubGluZTo6c3BsaXRJbmxpbmVzKFJlbmRlckJsb2NrKiBmcm9tQmxvY2ssIFJl
bmRlckJsb2NrKiB0b0Jsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW5k
ZXJCbG9jayogbWlkZGxlQmxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJl
bmRlck9iamVjdCogYmVmb3JlQ2hpbGQsIFJlbmRlckJveE1vZGVsT2JqZWN0KiBvbGRDb250KQot
ewotICAgIC8vIENyZWF0ZSBhIGNsb25lIG9mIHRoaXMgaW5saW5lLgotICAgIFJlbmRlcklubGlu
ZSogY2xvbmUgPSBjbG9uZUlubGluZSh0aGlzKTsKLSAgICBjbG9uZS0+c2V0Q29udGludWF0aW9u
KG9sZENvbnQpOwotCi0gICAgLy8gTm93IHRha2UgYWxsIG9mIHRoZSBjaGlsZHJlbiBmcm9tIGJl
Zm9yZUNoaWxkIHRvIHRoZSBlbmQgYW5kIHJlbW92ZQotICAgIC8vIHRoZW0gZnJvbSB8dGhpc3wg
YW5kIHBsYWNlIHRoZW0gaW4gdGhlIGNsb25lLgotICAgIFJlbmRlck9iamVjdCogbyA9IGJlZm9y
ZUNoaWxkOwotICAgIHdoaWxlIChvKSB7Ci0gICAgICAgIFJlbmRlck9iamVjdCogdG1wID0gbzsK
LSAgICAgICAgbyA9IHRtcC0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgY2xvbmUtPmFkZENoaWxk
SWdub3JpbmdDb250aW51YXRpb24oY2hpbGRyZW4oKS0+cmVtb3ZlQ2hpbGROb2RlKHRoaXMsIHRt
cCksIDApOwotICAgICAgICB0bXAtPnNldE5lZWRzTGF5b3V0QW5kUHJlZldpZHRoc1JlY2FsYygp
OwotICAgIH0KLQotICAgIC8vIEhvb2sgfGNsb25lfCB1cCBhcyB0aGUgY29udGludWF0aW9uIG9m
IHRoZSBtaWRkbGUgYmxvY2suCi0gICAgbWlkZGxlQmxvY2stPnNldElubGluZUNvbnRpbnVhdGlv
bihjbG9uZSk7Ci0KLSAgICAvLyBXZSBoYXZlIGJlZW4gcmVwYXJlbnRlZCBhbmQgYXJlIG5vdyB1
bmRlciB0aGUgZnJvbUJsb2NrLiAgV2UgbmVlZAotICAgIC8vIHRvIHdhbGsgdXAgb3VyIGlubGlu
ZSBwYXJlbnQgY2hhaW4gdW50aWwgd2UgaGl0IHRoZSBjb250YWluaW5nIGJsb2NrLgotICAgIC8v
IE9uY2Ugd2UgaGl0IHRoZSBjb250YWluaW5nIGJsb2NrIHdlJ3JlIGRvbmUuCi0gICAgUmVuZGVy
Qm94TW9kZWxPYmplY3QqIGN1cnIgPSB0b1JlbmRlckJveE1vZGVsT2JqZWN0KHBhcmVudCgpKTsK
LSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogY3VyckNoaWxkID0gdGhpczsKLSAgICAKLSAgICAv
LyBGSVhNRTogQmVjYXVzZSBzcGxpdHRpbmcgaXMgTyhuXjIpIGFzIHRhZ3MgbmVzdCBwYXRob2xv
Z2ljYWxseSwgd2UgY2FwIHRoZSBkZXB0aCBhdCB3aGljaCB3ZSdyZSB3aWxsaW5nIHRvIGNsb25l
LgotICAgIC8vIFRoZXJlIHdpbGwgZXZlbnR1YWxseSBiZSBhIGJldHRlciBhcHByb2FjaCB0byB0
aGlzIHByb2JsZW0gdGhhdCB3aWxsIGxldCB1cyBuZXN0IHRvIGEgbXVjaAotICAgIC8vIGdyZWF0
ZXIgZGVwdGggKHNlZSBidWd6aWxsYSBidWcgMTM0MzApIGJ1dCBmb3Igbm93IHdlIGhhdmUgYSBs
aW1pdC4gIFRoaXMgKndpbGwqIHJlc3VsdCBpbgotICAgIC8vIGluY29ycmVjdCByZW5kZXJpbmcs
IGJ1dCB0aGUgYWx0ZXJuYXRpdmUgaXMgdG8gaGFuZyBmb3JldmVyLgotICAgIHVuc2lnbmVkIHNw
bGl0RGVwdGggPSAxOwotICAgIGNvbnN0IHVuc2lnbmVkIGNNYXhTcGxpdERlcHRoID0gMjAwOyAK
LSAgICB3aGlsZSAoY3VyciAmJiBjdXJyICE9IGZyb21CbG9jaykgewotICAgICAgICBBU1NFUlQo
Y3Vyci0+aXNSZW5kZXJJbmxpbmUoKSk7Ci0gICAgICAgIGlmIChzcGxpdERlcHRoIDwgY01heFNw
bGl0RGVwdGgpIHsKLSAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBjbG9uZS4KLSAgICAgICAg
ICAgIFJlbmRlcklubGluZSogY2xvbmVDaGlsZCA9IGNsb25lOwotICAgICAgICAgICAgY2xvbmUg
PSBjbG9uZUlubGluZSh0b1JlbmRlcklubGluZShjdXJyKSk7Ci0KLSAgICAgICAgICAgIC8vIElu
c2VydCBvdXIgY2hpbGQgY2xvbmUgYXMgdGhlIGZpcnN0IGNoaWxkLgotICAgICAgICAgICAgY2xv
bmUtPmFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24oY2xvbmVDaGlsZCwgMCk7Ci0KLSAgICAg
ICAgICAgIC8vIEhvb2sgdGhlIGNsb25lIHVwIGFzIGEgY29udGludWF0aW9uIG9mIHxjdXJyfC4K
LSAgICAgICAgICAgIFJlbmRlcklubGluZSogaW5saW5lQ3VyciA9IHRvUmVuZGVySW5saW5lKGN1
cnIpOwotICAgICAgICAgICAgb2xkQ29udCA9IGlubGluZUN1cnItPmNvbnRpbnVhdGlvbigpOwot
ICAgICAgICAgICAgaW5saW5lQ3Vyci0+c2V0Q29udGludWF0aW9uKGNsb25lKTsKLSAgICAgICAg
ICAgIGNsb25lLT5zZXRDb250aW51YXRpb24ob2xkQ29udCk7Ci0KLSAgICAgICAgICAgIC8vIFNv
bWVvbmUgbWF5IGhhdmUgaW5kaXJlY3RseSBjYXVzZWQgYSA8cT4gdG8gc3BsaXQuICBXaGVuIHRo
aXMgaGFwcGVucywgdGhlIDphZnRlciBjb250ZW50Ci0gICAgICAgICAgICAvLyBoYXMgdG8gbW92
ZSBpbnRvIHRoZSBpbmxpbmUgY29udGludWF0aW9uLiAgQ2FsbCB1cGRhdGVCZWZvcmVBZnRlckNv
bnRlbnQgdG8gZW5zdXJlIHRoYXQgdGhlIGlubGluZSdzIDphZnRlcgotICAgICAgICAgICAgLy8g
Y29udGVudCBnZXRzIHByb3Blcmx5IGRlc3Ryb3llZC4KLSAgICAgICAgICAgIGlmIChkb2N1bWVu
dCgpLT51c2VzQmVmb3JlQWZ0ZXJSdWxlcygpKQotICAgICAgICAgICAgICAgIGlubGluZUN1cnIt
PmNoaWxkcmVuKCktPnVwZGF0ZUJlZm9yZUFmdGVyQ29udGVudCh0aGlzLCBBRlRFUik7Ci0KLSAg
ICAgICAgICAgIC8vIE5vdyB3ZSBuZWVkIHRvIHRha2UgYWxsIG9mIHRoZSBjaGlsZHJlbiBzdGFy
dGluZyBmcm9tIHRoZSBmaXJzdCBjaGlsZAotICAgICAgICAgICAgLy8gKmFmdGVyKiBjdXJyQ2hp
bGQgYW5kIGFwcGVuZCB0aGVtIGFsbCB0byB0aGUgY2xvbmUuCi0gICAgICAgICAgICBvID0gY3Vy
ckNoaWxkLT5uZXh0U2libGluZygpOwotICAgICAgICAgICAgd2hpbGUgKG8pIHsKLSAgICAgICAg
ICAgICAgICBSZW5kZXJPYmplY3QqIHRtcCA9IG87Ci0gICAgICAgICAgICAgICAgbyA9IHRtcC0+
bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgICAgICAgICBjbG9uZS0+YWRkQ2hpbGRJZ25vcmluZ0Nv
bnRpbnVhdGlvbihpbmxpbmVDdXJyLT5jaGlsZHJlbigpLT5yZW1vdmVDaGlsZE5vZGUoY3Vyciwg
dG1wKSwgMCk7Ci0gICAgICAgICAgICAgICAgdG1wLT5zZXROZWVkc0xheW91dEFuZFByZWZXaWR0
aHNSZWNhbGMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAg
Ly8gS2VlcCB3YWxraW5nIHVwIHRoZSBjaGFpbi4KLSAgICAgICAgY3VyckNoaWxkID0gY3VycjsK
LSAgICAgICAgY3VyciA9IHRvUmVuZGVyQm94TW9kZWxPYmplY3QoY3Vyci0+cGFyZW50KCkpOwot
ICAgICAgICBzcGxpdERlcHRoKys7Ci0gICAgfQotCi0gICAgLy8gTm93IHdlIGFyZSBhdCB0aGUg
YmxvY2sgbGV2ZWwuIFdlIG5lZWQgdG8gcHV0IHRoZSBjbG9uZSBpbnRvIHRoZSB0b0Jsb2NrLgot
ICAgIHRvQmxvY2stPmNoaWxkcmVuKCktPmFwcGVuZENoaWxkTm9kZSh0b0Jsb2NrLCBjbG9uZSk7
Ci0KLSAgICAvLyBOb3cgdGFrZSBhbGwgdGhlIGNoaWxkcmVuIGFmdGVyIGN1cnJDaGlsZCBhbmQg
cmVtb3ZlIHRoZW0gZnJvbSB0aGUgZnJvbUJsb2NrCi0gICAgLy8gYW5kIHB1dCB0aGVtIGluIHRo
ZSB0b0Jsb2NrLgotICAgIG8gPSBjdXJyQ2hpbGQtPm5leHRTaWJsaW5nKCk7Ci0gICAgd2hpbGUg
KG8pIHsKLSAgICAgICAgUmVuZGVyT2JqZWN0KiB0bXAgPSBvOwotICAgICAgICBvID0gdG1wLT5u
ZXh0U2libGluZygpOwotICAgICAgICB0b0Jsb2NrLT5jaGlsZHJlbigpLT5hcHBlbmRDaGlsZE5v
ZGUodG9CbG9jaywgZnJvbUJsb2NrLT5jaGlsZHJlbigpLT5yZW1vdmVDaGlsZE5vZGUoZnJvbUJs
b2NrLCB0bXApKTsKLSAgICB9Ci19Ci0KLXZvaWQgUmVuZGVySW5saW5lOjpzcGxpdEZsb3coUmVu
ZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCwgUmVuZGVyQmxvY2sqIG5ld0Jsb2NrQm94LAotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXJPYmplY3QqIG5ld0NoaWxkLCBSZW5kZXJCb3hN
b2RlbE9iamVjdCogb2xkQ29udCkKLXsKLSAgICBSZW5kZXJCbG9jayogcHJlID0gMDsKLSAgICBS
ZW5kZXJCbG9jayogYmxvY2sgPSBjb250YWluaW5nQmxvY2soKTsKLSAgICAKLSAgICAvLyBEZWxl
dGUgb3VyIGxpbmUgYm94ZXMgYmVmb3JlIHdlIGRvIHRoZSBpbmxpbmUgc3BsaXQgaW50byBjb250
aW51YXRpb25zLgotICAgIGJsb2NrLT5kZWxldGVMaW5lQm94VHJlZSgpOwotICAgIAotICAgIGJv
b2wgbWFkZU5ld0JlZm9yZUJsb2NrID0gZmFsc2U7Ci0gICAgaWYgKGJsb2NrLT5pc0Fub255bW91
c0Jsb2NrKCkgJiYgKCFibG9jay0+cGFyZW50KCkgfHwgIWJsb2NrLT5wYXJlbnQoKS0+Y3JlYXRl
c0Fub255bW91c1dyYXBwZXIoKSkpIHsKLSAgICAgICAgLy8gV2UgY2FuIHJldXNlIHRoaXMgYmxv
Y2sgYW5kIG1ha2UgaXQgdGhlIHByZUJsb2NrIG9mIHRoZSBuZXh0IGNvbnRpbnVhdGlvbi4KLSAg
ICAgICAgcHJlID0gYmxvY2s7Ci0gICAgICAgIHByZS0+cmVtb3ZlUG9zaXRpb25lZE9iamVjdHMo
MCk7Ci0gICAgICAgIGJsb2NrID0gYmxvY2stPmNvbnRhaW5pbmdCbG9jaygpOwotICAgIH0gZWxz
ZSB7Ci0gICAgICAgIC8vIE5vIGFub255bW91cyBibG9jayBhdmFpbGFibGUgZm9yIHVzZS4gIE1h
a2Ugb25lLgotICAgICAgICBwcmUgPSBibG9jay0+Y3JlYXRlQW5vbnltb3VzQmxvY2soKTsKLSAg
ICAgICAgbWFkZU5ld0JlZm9yZUJsb2NrID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBSZW5kZXJCbG9j
ayogcG9zdCA9IGJsb2NrLT5jcmVhdGVBbm9ueW1vdXNCbG9jaygpOwotCi0gICAgUmVuZGVyT2Jq
ZWN0KiBib3hGaXJzdCA9IG1hZGVOZXdCZWZvcmVCbG9jayA/IGJsb2NrLT5maXJzdENoaWxkKCkg
OiBwcmUtPm5leHRTaWJsaW5nKCk7Ci0gICAgaWYgKG1hZGVOZXdCZWZvcmVCbG9jaykKLSAgICAg
ICAgYmxvY2stPmNoaWxkcmVuKCktPmluc2VydENoaWxkTm9kZShibG9jaywgcHJlLCBib3hGaXJz
dCk7Ci0gICAgYmxvY2stPmNoaWxkcmVuKCktPmluc2VydENoaWxkTm9kZShibG9jaywgbmV3Qmxv
Y2tCb3gsIGJveEZpcnN0KTsKLSAgICBibG9jay0+Y2hpbGRyZW4oKS0+aW5zZXJ0Q2hpbGROb2Rl
KGJsb2NrLCBwb3N0LCBib3hGaXJzdCk7Ci0gICAgYmxvY2stPnNldENoaWxkcmVuSW5saW5lKGZh
bHNlKTsKLSAgICAKLSAgICBpZiAobWFkZU5ld0JlZm9yZUJsb2NrKSB7Ci0gICAgICAgIFJlbmRl
ck9iamVjdCogbyA9IGJveEZpcnN0OwotICAgICAgICB3aGlsZSAobykgewotICAgICAgICAgICAg
UmVuZGVyT2JqZWN0KiBubyA9IG87Ci0gICAgICAgICAgICBvID0gbm8tPm5leHRTaWJsaW5nKCk7
Ci0gICAgICAgICAgICBwcmUtPmNoaWxkcmVuKCktPmFwcGVuZENoaWxkTm9kZShwcmUsIGJsb2Nr
LT5jaGlsZHJlbigpLT5yZW1vdmVDaGlsZE5vZGUoYmxvY2ssIG5vKSk7Ci0gICAgICAgICAgICBu
by0+c2V0TmVlZHNMYXlvdXRBbmRQcmVmV2lkdGhzUmVjYWxjKCk7Ci0gICAgICAgIH0KLSAgICB9
Ci0KLSAgICBzcGxpdElubGluZXMocHJlLCBwb3N0LCBuZXdCbG9ja0JveCwgYmVmb3JlQ2hpbGQs
IG9sZENvbnQpOwotCi0gICAgLy8gV2UgYWxyZWFkeSBrbm93IHRoZSBuZXdCbG9ja0JveCBpc24n
dCBnb2luZyB0byBjb250YWluIGlubGluZSBraWRzLCBzbyBhdm9pZCB3YXN0aW5nCi0gICAgLy8g
dGltZSBpbiBtYWtlQ2hpbGRyZW5Ob25JbmxpbmUgYnkganVzdCBzZXR0aW5nIHRoaXMgZXhwbGlj
aXRseSB1cCBmcm9udC4KLSAgICBuZXdCbG9ja0JveC0+c2V0Q2hpbGRyZW5JbmxpbmUoZmFsc2Up
OwotCi0gICAgLy8gV2UgZGVsYXllZCBhZGRpbmcgdGhlIG5ld0NoaWxkIHVudGlsIG5vdyBzbyB0
aGF0IHRoZSB8bmV3QmxvY2tCb3h8IHdvdWxkIGJlIGZ1bGx5Ci0gICAgLy8gY29ubmVjdGVkLCB0
aHVzIGFsbG93aW5nIG5ld0NoaWxkIGFjY2VzcyB0byBhIHJlbmRlckFyZW5hIHNob3VsZCBpdCBu
ZWVkCi0gICAgLy8gdG8gd3JhcCBpdHNlbGYgaW4gYWRkaXRpb25hbCBib3hlcyAoZS5nLiwgdGFi
bGUgY29uc3RydWN0aW9uKS4KLSAgICBuZXdCbG9ja0JveC0+YWRkQ2hpbGQobmV3Q2hpbGQpOwot
Ci0gICAgLy8gQWx3YXlzIGp1c3QgZG8gYSBmdWxsIGxheW91dCBpbiBvcmRlciB0byBlbnN1cmUg
dGhhdCBsaW5lIGJveGVzIChlc3BlY2lhbGx5IHdyYXBwZXJzIGZvciBpbWFnZXMpCi0gICAgLy8g
Z2V0IGRlbGV0ZWQgcHJvcGVybHkuICBCZWNhdXNlIG9iamVjdHMgbW92ZXMgZnJvbSB0aGUgcHJl
IGJsb2NrIGludG8gdGhlIHBvc3QgYmxvY2ssIHdlIHdhbnQgdG8KLSAgICAvLyBtYWtlIG5ldyBs
aW5lIGJveGVzIGluc3RlYWQgb2YgbGVhdmluZyB0aGUgb2xkIGxpbmUgYm94ZXMgYXJvdW5kLgot
ICAgIHByZS0+c2V0TmVlZHNMYXlvdXRBbmRQcmVmV2lkdGhzUmVjYWxjKCk7Ci0gICAgYmxvY2st
PnNldE5lZWRzTGF5b3V0QW5kUHJlZldpZHRoc1JlY2FsYygpOwotICAgIHBvc3QtPnNldE5lZWRz
TGF5b3V0QW5kUHJlZldpZHRoc1JlY2FsYygpOwotfQotCi12b2lkIFJlbmRlcklubGluZTo6YWRk
Q2hpbGRUb0NvbnRpbnVhdGlvbihSZW5kZXJPYmplY3QqIG5ld0NoaWxkLCBSZW5kZXJPYmplY3Qq
IGJlZm9yZUNoaWxkKQotewotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBmbG93ID0gY29udGlu
dWF0aW9uQmVmb3JlKGJlZm9yZUNoaWxkKTsKLSAgICBBU1NFUlQoIWJlZm9yZUNoaWxkIHx8IGJl
Zm9yZUNoaWxkLT5wYXJlbnQoKS0+aXNSZW5kZXJCbG9jaygpIHx8IGJlZm9yZUNoaWxkLT5wYXJl
bnQoKS0+aXNSZW5kZXJJbmxpbmUoKSk7Ci0gICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGJlZm9y
ZUNoaWxkUGFyZW50ID0gMDsKLSAgICBpZiAoYmVmb3JlQ2hpbGQpCi0gICAgICAgIGJlZm9yZUNo
aWxkUGFyZW50ID0gdG9SZW5kZXJCb3hNb2RlbE9iamVjdChiZWZvcmVDaGlsZC0+cGFyZW50KCkp
OwotICAgIGVsc2UgewotICAgICAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogY29udCA9IG5leHRD
b250aW51YXRpb24oZmxvdyk7Ci0gICAgICAgIGlmIChjb250KQotICAgICAgICAgICAgYmVmb3Jl
Q2hpbGRQYXJlbnQgPSBjb250OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBiZWZvcmVDaGls
ZFBhcmVudCA9IGZsb3c7Ci0gICAgfQotCi0gICAgaWYgKG5ld0NoaWxkLT5pc0Zsb2F0aW5nT3JQ
b3NpdGlvbmVkKCkpCi0gICAgICAgIHJldHVybiBiZWZvcmVDaGlsZFBhcmVudC0+YWRkQ2hpbGRJ
Z25vcmluZ0NvbnRpbnVhdGlvbihuZXdDaGlsZCwgYmVmb3JlQ2hpbGQpOwotCi0gICAgLy8gQSBj
b250aW51YXRpb24gYWx3YXlzIGNvbnNpc3RzIG9mIHR3byBwb3RlbnRpYWwgY2FuZGlkYXRlczog
YW4gaW5saW5lIG9yIGFuIGFub255bW91cwotICAgIC8vIGJsb2NrIGJveCBob2xkaW5nIGJsb2Nr
IGNoaWxkcmVuLgotICAgIGJvb2wgY2hpbGRJbmxpbmUgPSBuZXdDaGlsZC0+aXNJbmxpbmUoKTsK
LSAgICBib29sIGJjcElubGluZSA9IGJlZm9yZUNoaWxkUGFyZW50LT5pc0lubGluZSgpOwotICAg
IGJvb2wgZmxvd0lubGluZSA9IGZsb3ctPmlzSW5saW5lKCk7Ci0KLSAgICBpZiAoZmxvdyA9PSBi
ZWZvcmVDaGlsZFBhcmVudCkKLSAgICAgICAgcmV0dXJuIGZsb3ctPmFkZENoaWxkSWdub3JpbmdD
b250aW51YXRpb24obmV3Q2hpbGQsIGJlZm9yZUNoaWxkKTsKLSAgICBlbHNlIHsKLSAgICAgICAg
Ly8gVGhlIGdvYWwgaGVyZSBpcyB0byBtYXRjaCB1cCBpZiB3ZSBjYW4sIHNvIHRoYXQgd2UgY2Fu
IGNvYWxlc2NlIGFuZCBjcmVhdGUgdGhlCi0gICAgICAgIC8vIG1pbmltYWwgIyBvZiBjb250aW51
YXRpb25zIG5lZWRlZCBmb3IgdGhlIGlubGluZS4KLSAgICAgICAgaWYgKGNoaWxkSW5saW5lID09
IGJjcElubGluZSkKLSAgICAgICAgICAgIHJldHVybiBiZWZvcmVDaGlsZFBhcmVudC0+YWRkQ2hp
bGRJZ25vcmluZ0NvbnRpbnVhdGlvbihuZXdDaGlsZCwgYmVmb3JlQ2hpbGQpOwotICAgICAgICBl
bHNlIGlmIChmbG93SW5saW5lID09IGNoaWxkSW5saW5lKQotICAgICAgICAgICAgcmV0dXJuIGZs
b3ctPmFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24obmV3Q2hpbGQsIDApOyAvLyBKdXN0IHRy
ZWF0IGxpa2UgYW4gYXBwZW5kLgotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gYmVm
b3JlQ2hpbGRQYXJlbnQtPmFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24obmV3Q2hpbGQsIGJl
Zm9yZUNoaWxkKTsKLSAgICB9Ci19Ci0KIHZvaWQgUmVuZGVySW5saW5lOjpwYWludChQYWludElu
Zm8mIHBhaW50SW5mbywgaW50IHR4LCBpbnQgdHkpCiB7CiAgICAgbV9saW5lQm94ZXMucGFpbnQo
dGhpcywgcGFpbnRJbmZvLCB0eCwgdHkpOwpAQCAtNDEwLDE2ICsxNzcsNiBAQCB2b2lkIFJlbmRl
cklubGluZTo6YWJzb2x1dGVSZWN0cyhWZWN0b3I8CiAgICAgICAgICAgICByZWN0cy5hcHBlbmQo
SW50UmVjdCh0eCArIGN1cnItPngoKSwgdHkgKyBjdXJyLT55KCksIGN1cnItPndpZHRoKCksIGN1
cnItPmhlaWdodCgpKSk7CiAgICAgfSBlbHNlCiAgICAgICAgIHJlY3RzLmFwcGVuZChJbnRSZWN0
KHR4LCB0eSwgMCwgMCkpOwotCi0gICAgaWYgKGNvbnRpbnVhdGlvbigpKSB7Ci0gICAgICAgIGlm
IChjb250aW51YXRpb24oKS0+aXNCb3goKSkgewotICAgICAgICAgICAgUmVuZGVyQm94KiBib3gg
PSB0b1JlbmRlckJveChjb250aW51YXRpb24oKSk7Ci0gICAgICAgICAgICBjb250aW51YXRpb24o
KS0+YWJzb2x1dGVSZWN0cyhyZWN0cywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB0eCAtIGNvbnRhaW5pbmdCbG9jaygpLT54KCkgKyBib3gtPngoKSwKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5IC0gY29udGFpbmluZ0Jsb2Nr
KCktPnkoKSArIGJveC0+eSgpKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBjb250aW51
YXRpb24oKS0+YWJzb2x1dGVSZWN0cyhyZWN0cywgdHggLSBjb250YWluaW5nQmxvY2soKS0+eCgp
LCB0eSAtIGNvbnRhaW5pbmdCbG9jaygpLT55KCkpOwotICAgIH0KIH0KIAogdm9pZCBSZW5kZXJJ
bmxpbmU6OmFic29sdXRlUXVhZHMoVmVjdG9yPEZsb2F0UXVhZD4mIHF1YWRzKQpAQCAtNDMxLDkg
KzE4OCw2IEBAIHZvaWQgUmVuZGVySW5saW5lOjphYnNvbHV0ZVF1YWRzKFZlY3RvcjwKICAgICAg
ICAgfQogICAgIH0gZWxzZQogICAgICAgICBxdWFkcy5hcHBlbmQobG9jYWxUb0Fic29sdXRlUXVh
ZChGbG9hdFJlY3QoKSkpOwotCi0gICAgaWYgKGNvbnRpbnVhdGlvbigpKQotICAgICAgICBjb250
aW51YXRpb24oKS0+YWJzb2x1dGVRdWFkcyhxdWFkcyk7CiB9CiAKIGludCBSZW5kZXJJbmxpbmU6
Om9mZnNldExlZnQoKSBjb25zdApAQCAtNTAyLDE4ICsyNTYsNiBAQCBWaXNpYmxlUG9zaXRpb24g
UmVuZGVySW5saW5lOjpwb3NpdGlvbkZvCiAgICAgICAgIC8vIHNob3VsZCB0cnkgdG8gZmluZCBh
IHJlc3VsdCBieSBhc2tpbmcgb3VyIGNvbnRhaW5pbmcgYmxvY2suCiAgICAgICAgIHJldHVybiBj
Yi0+cG9zaXRpb25Gb3JQb2ludChwb2ludCk7CiAgICAgfQotCi0gICAgLy8gVHJhbnNsYXRlIHRo
ZSBjb29yZHMgZnJvbSB0aGUgcHJlLWFub255bW91cyBibG9jayB0byB0aGUgcG9zdC1hbm9ueW1v
dXMgYmxvY2suCi0gICAgaW50IHBhcmVudEJsb2NrWCA9IGNiLT54KCkgKyBwb2ludC54KCk7Ci0g
ICAgaW50IHBhcmVudEJsb2NrWSA9IGNiLT55KCkgKyBwb2ludC55KCk7Ci0gICAgUmVuZGVyQm94
TW9kZWxPYmplY3QqIGMgPSBjb250aW51YXRpb24oKTsKLSAgICB3aGlsZSAoYykgewotICAgICAg
ICBSZW5kZXJCb3gqIGNvbnRCbG9jayA9IGMtPmlzSW5saW5lKCkgPyBjLT5jb250YWluaW5nQmxv
Y2soKSA6IHRvUmVuZGVyQmxvY2soYyk7Ci0gICAgICAgIGlmIChjLT5pc0lubGluZSgpIHx8IGMt
PmZpcnN0Q2hpbGQoKSkKLSAgICAgICAgICAgIHJldHVybiBjLT5wb3NpdGlvbkZvckNvb3JkaW5h
dGVzKHBhcmVudEJsb2NrWCAtIGNvbnRCbG9jay0+eCgpLCBwYXJlbnRCbG9ja1kgLSBjb250Qmxv
Y2stPnkoKSk7Ci0gICAgICAgIGMgPSB0b1JlbmRlckJsb2NrKGMpLT5pbmxpbmVDb250aW51YXRp
b24oKTsKLSAgICB9Ci0gICAgCiAgICAgcmV0dXJuIFJlbmRlckJveE1vZGVsT2JqZWN0Ojpwb3Np
dGlvbkZvclBvaW50KHBvaW50KTsKIH0KIApAQCAtNTQ5LDcgKzI5MSw3IEBAIEludFJlY3QgUmVu
ZGVySW5saW5lOjpjbGlwcGVkT3ZlcmZsb3dSZWMKICAgICAvLyBPbmx5IHJ1bi1pbnMgYXJlIGFs
bG93ZWQgaW4gaGVyZSBkdXJpbmcgbGF5b3V0LgogICAgIEFTU0VSVCghdmlldygpIHx8ICF2aWV3
KCktPmxheW91dFN0YXRlRW5hYmxlZCgpIHx8IGlzUnVuSW4oKSk7CiAKLSAgICBpZiAoIWZpcnN0
TGluZUJveCgpICYmICFjb250aW51YXRpb24oKSkKKyAgICBpZiAoIWZpcnN0TGluZUJveCgpKQog
ICAgICAgICByZXR1cm4gSW50UmVjdCgpOwogCiAgICAgLy8gRmluZCBvdXIgbGVmdG1vc3QgcG9z
aXRpb24uCkBAIC01OTcsMTEgKzMzOSw2IEBAIEludFJlY3QgUmVuZGVySW5saW5lOjpjbGlwcGVk
T3ZlcmZsb3dSZWMKICAgICAgICAgICAgICAgICByLnVuaXRlKGNoaWxkUmVjdCk7CiAgICAgICAg
ICAgICB9CiAgICAgICAgIH0KLQotICAgICAgICBpZiAoY29udGludWF0aW9uKCkgJiYgIWNvbnRp
bnVhdGlvbigpLT5pc0lubGluZSgpKSB7Ci0gICAgICAgICAgICBJbnRSZWN0IGNvbnRSZWN0ID0g
Y29udGludWF0aW9uKCktPnJlY3RXaXRoT3V0bGluZUZvclJlcGFpbnQocmVwYWludENvbnRhaW5l
ciwgb3cpOwotICAgICAgICAgICAgci51bml0ZShjb250UmVjdCk7Ci0gICAgICAgIH0KICAgICB9
CiAKICAgICByZXR1cm4gcjsKQEAgLTY4MCw0OSArNDE3LDYgQEAgdm9pZCBSZW5kZXJJbmxpbmU6
OmNvbXB1dGVSZWN0Rm9yUmVwYWludAogICAgIG8tPmNvbXB1dGVSZWN0Rm9yUmVwYWludChyZXBh
aW50Q29udGFpbmVyLCByZWN0LCBmaXhlZCk7CiB9CiAKLXZvaWQgUmVuZGVySW5saW5lOjp1cGRh
dGVEcmFnU3RhdGUoYm9vbCBkcmFnT24pCi17Ci0gICAgUmVuZGVyQm94TW9kZWxPYmplY3Q6OnVw
ZGF0ZURyYWdTdGF0ZShkcmFnT24pOwotICAgIGlmIChjb250aW51YXRpb24oKSkKLSAgICAgICAg
Y29udGludWF0aW9uKCktPnVwZGF0ZURyYWdTdGF0ZShkcmFnT24pOwotfQotCi12b2lkIFJlbmRl
cklubGluZTo6Y2hpbGRCZWNhbWVOb25JbmxpbmUoUmVuZGVyT2JqZWN0KiBjaGlsZCkKLXsKLSAg
ICAvLyBXZSBoYXZlIHRvIHNwbGl0IHRoZSBwYXJlbnQgZmxvdy4KLSAgICBSZW5kZXJCbG9jayog
bmV3Qm94ID0gY29udGFpbmluZ0Jsb2NrKCktPmNyZWF0ZUFub255bW91c0Jsb2NrKCk7Ci0gICAg
UmVuZGVyQm94TW9kZWxPYmplY3QqIG9sZENvbnRpbnVhdGlvbiA9IGNvbnRpbnVhdGlvbigpOwot
ICAgIHNldENvbnRpbnVhdGlvbihuZXdCb3gpOwotICAgIFJlbmRlck9iamVjdCogYmVmb3JlQ2hp
bGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKTsKLSAgICBjaGlsZHJlbigpLT5yZW1vdmVDaGlsZE5v
ZGUodGhpcywgY2hpbGQpOwotICAgIHNwbGl0RmxvdyhiZWZvcmVDaGlsZCwgbmV3Qm94LCBjaGls
ZCwgb2xkQ29udGludWF0aW9uKTsKLX0KLQotdm9pZCBSZW5kZXJJbmxpbmU6OnVwZGF0ZUhpdFRl
c3RSZXN1bHQoSGl0VGVzdFJlc3VsdCYgcmVzdWx0LCBjb25zdCBJbnRQb2ludCYgcG9pbnQpCi17
Ci0gICAgaWYgKHJlc3VsdC5pbm5lck5vZGUoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgTm9k
ZSogbiA9IG5vZGUoKTsKLSAgICBJbnRQb2ludCBsb2NhbFBvaW50KHBvaW50KTsKLSAgICBpZiAo
bikgewotICAgICAgICBpZiAoaXNJbmxpbmVDb250aW51YXRpb24oKSkgewotICAgICAgICAgICAg
Ly8gV2UncmUgaW4gdGhlIGNvbnRpbnVhdGlvbiBvZiBhIHNwbGl0IGlubGluZS4gIEFkanVzdCBv
dXIgbG9jYWwgcG9pbnQgdG8gYmUgaW4gdGhlIGNvb3JkaW5hdGUgc3BhY2UKLSAgICAgICAgICAg
IC8vIG9mIHRoZSBwcmluY2lwYWwgcmVuZGVyZXIncyBjb250YWluaW5nIGJsb2NrLiAgVGhpcyB3
aWxsIGVuZCB1cCBiZWluZyB0aGUgaW5uZXJOb25TaGFyZWROb2RlLgotICAgICAgICAgICAgUmVu
ZGVyQmxvY2sqIGZpcnN0QmxvY2sgPSBuLT5yZW5kZXJlcigpLT5jb250YWluaW5nQmxvY2soKTsK
LSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gR2V0IG91ciBjb250YWluaW5nIGJsb2NrLgot
ICAgICAgICAgICAgUmVuZGVyQm94KiBibG9jayA9IGNvbnRhaW5pbmdCbG9jaygpOwotICAgICAg
ICAgICAgbG9jYWxQb2ludC5tb3ZlKGJsb2NrLT54KCkgLSBmaXJzdEJsb2NrLT54KCksIGJsb2Nr
LT55KCkgLSBmaXJzdEJsb2NrLT55KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzdWx0LnNl
dElubmVyTm9kZShuKTsKLSAgICAgICAgaWYgKCFyZXN1bHQuaW5uZXJOb25TaGFyZWROb2RlKCkp
Ci0gICAgICAgICAgICByZXN1bHQuc2V0SW5uZXJOb25TaGFyZWROb2RlKG4pOwotICAgICAgICBy
ZXN1bHQuc2V0TG9jYWxQb2ludChsb2NhbFBvaW50KTsKLSAgICB9Ci19Ci0KIHZvaWQgUmVuZGVy
SW5saW5lOjpkaXJ0eUxpbmVCb3hlcyhib29sIGZ1bGxMYXlvdXQpCiB7CiAgICAgaWYgKGZ1bGxM
YXlvdXQpCkBAIC04MzYsMTcgKzUzMCw2IEBAIHZvaWQgUmVuZGVySW5saW5lOjphZGRGb2N1c1Jp
bmdSZWN0cyhHcmEKICAgICAgICAgICAgY3Vyci0+YWRkRm9jdXNSaW5nUmVjdHMoZ3JhcGhpY3ND
b250ZXh0LCBwb3MueCgpLCBwb3MueSgpKTsKICAgICAgICAgfQogICAgIH0KLQotICAgIGlmIChj
b250aW51YXRpb24oKSkgewotICAgICAgICBpZiAoY29udGludWF0aW9uKCktPmlzSW5saW5lKCkp
Ci0gICAgICAgICAgICBjb250aW51YXRpb24oKS0+YWRkRm9jdXNSaW5nUmVjdHMoZ3JhcGhpY3ND
b250ZXh0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0
eCAtIGNvbnRhaW5pbmdCbG9jaygpLT54KCkgKyBjb250aW51YXRpb24oKS0+Y29udGFpbmluZ0Js
b2NrKCktPngoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICB0eSAtIGNvbnRhaW5pbmdCbG9jaygpLT55KCkgKyBjb250aW51YXRpb24oKS0+Y29udGFpbmlu
Z0Jsb2NrKCktPnkoKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNvbnRpbnVhdGlvbigp
LT5hZGRGb2N1c1JpbmdSZWN0cyhncmFwaGljc0NvbnRleHQsIAotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4IC0gY29udGFpbmluZ0Jsb2NrKCktPngoKSAr
IHRvUmVuZGVyQm94KGNvbnRpbnVhdGlvbigpKS0+eCgpLAotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHR5IC0gY29udGFpbmluZ0Jsb2NrKCktPnkoKSArIHRv
UmVuZGVyQm94KGNvbnRpbnVhdGlvbigpKS0+eSgpKTsKLSAgICB9CiB9CiAKIHZvaWQgUmVuZGVy
SW5saW5lOjpwYWludE91dGxpbmUoR3JhcGhpY3NDb250ZXh0KiBncmFwaGljc0NvbnRleHQsIGlu
dCB0eCwgaW50IHR5KQpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVySW5saW5lLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVySW5saW5lLmgJKHJldmlzaW9uIDQ3
NTkxKQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVySW5saW5lLmgJKHdvcmtpbmcgY29weSkK
QEAgLTU1LDEwICs1NSw2IEBAIHB1YmxpYzoKIAogICAgIElubGluZUZsb3dCb3gqIGZpcnN0TGlu
ZUJveCgpIGNvbnN0IHsgcmV0dXJuIG1fbGluZUJveGVzLmZpcnN0TGluZUJveCgpOyB9CiAgICAg
SW5saW5lRmxvd0JveCogbGFzdExpbmVCb3goKSBjb25zdCB7IHJldHVybiBtX2xpbmVCb3hlcy5s
YXN0TGluZUJveCgpOyB9Ci0KLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogY29udGludWF0aW9u
KCkgY29uc3QgeyByZXR1cm4gbV9jb250aW51YXRpb247IH0KLQotICAgIHZpcnR1YWwgdm9pZCB1
cGRhdGVEcmFnU3RhdGUoYm9vbCBkcmFnT24pOwogICAgIAogICAgIEludFNpemUgcmVsYXRpdmVQ
b3NpdGlvbmVkSW5saW5lT2Zmc2V0KGNvbnN0IFJlbmRlckJveCogY2hpbGQpIGNvbnN0OwogCkBA
IC03OCw5ICs3NCw2IEBAIHByaXZhdGU6CiAKICAgICB2aXJ0dWFsIGJvb2wgaXNSZW5kZXJJbmxp
bmUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CiAKLSAgICB2b2lkIGFkZENoaWxkVG9Db250aW51
YXRpb24oUmVuZGVyT2JqZWN0KiBuZXdDaGlsZCwgUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCk7
Ci0gICAgdmlydHVhbCB2b2lkIGFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24oUmVuZGVyT2Jq
ZWN0KiBuZXdDaGlsZCwgUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCA9IDApOwotCiAgICAgdm9p
ZCBzcGxpdElubGluZXMoUmVuZGVyQmxvY2sqIGZyb21CbG9jaywgUmVuZGVyQmxvY2sqIHRvQmxv
Y2ssIFJlbmRlckJsb2NrKiBtaWRkbGVCbG9jaywKICAgICAgICAgICAgICAgICAgICAgICBSZW5k
ZXJPYmplY3QqIGJlZm9yZUNoaWxkLCBSZW5kZXJCb3hNb2RlbE9iamVjdCogb2xkQ29udCk7CiAg
ICAgdm9pZCBzcGxpdEZsb3coUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCwgUmVuZGVyQmxvY2sq
IG5ld0Jsb2NrQm94LApAQCAtMTIwLDEzICsxMTMsNiBAQCBwcml2YXRlOgogCiAgICAgdmlydHVh
bCBpbnQgbGluZUhlaWdodChib29sIGZpcnN0TGluZSwgYm9vbCBpc1Jvb3RMaW5lQm94ID0gZmFs
c2UpIGNvbnN0OwogCi0gICAgUmVuZGVySW5saW5lKiBpbmxpbmVDb250aW51YXRpb24oKSBjb25z
dDsKLSAgICB2b2lkIHNldENvbnRpbnVhdGlvbihSZW5kZXJCb3hNb2RlbE9iamVjdCogYykgeyBt
X2NvbnRpbnVhdGlvbiA9IGM7IH0KLSAgICAKLSAgICB2aXJ0dWFsIHZvaWQgY2hpbGRCZWNhbWVO
b25JbmxpbmUoUmVuZGVyT2JqZWN0KiBjaGlsZCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRl
SGl0VGVzdFJlc3VsdChIaXRUZXN0UmVzdWx0JiwgY29uc3QgSW50UG9pbnQmKTsKLQogICAgIHZp
cnR1YWwgdm9pZCBpbWFnZUNoYW5nZWQoV3JhcHBlZEltYWdlUHRyLCBjb25zdCBJbnRSZWN0KiA9
IDApOwogCiAjaWYgRU5BQkxFKERBU0hCT0FSRF9TVVBQT1JUKQpAQCAtMTM5LDEzICsxMjUsMTAg
QEAgcHJpdmF0ZToKICAgICBzdGF0aWMgUmVuZGVySW5saW5lKiBjbG9uZUlubGluZShSZW5kZXJJ
bmxpbmUqIHNyYyk7CiAKICAgICB2b2lkIHBhaW50T3V0bGluZUZvckxpbmUoR3JhcGhpY3NDb250
ZXh0KiwgaW50IHR4LCBpbnQgdHksIGNvbnN0IEludFJlY3QmIHByZXZMaW5lLCBjb25zdCBJbnRS
ZWN0JiB0aGlzTGluZSwgY29uc3QgSW50UmVjdCYgbmV4dExpbmUpOwotICAgIFJlbmRlckJveE1v
ZGVsT2JqZWN0KiBjb250aW51YXRpb25CZWZvcmUoUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCk7
CiAKICAgICBSZW5kZXJPYmplY3RDaGlsZExpc3QgbV9jaGlsZHJlbjsKICAgICBSZW5kZXJMaW5l
Qm94TGlzdCBtX2xpbmVCb3hlczsgICAvLyBBbGwgb2YgdGhlIGxpbmUgYm94ZXMgY3JlYXRlZCBm
b3IgdGhpcyBpbmxpbmUgZmxvdy4gIEZvciBleGFtcGxlLCA8aT5IZWxsbzxicj53b3JsZC48L2k+
IHdpbGwgaGF2ZSB0d28gPGk+IGxpbmUgYm94ZXMuCiAKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVj
dCogbV9jb250aW51YXRpb247IC8vIENhbiBiZSBlaXRoZXIgYSBibG9jayBvciBhbiBpbmxpbmUu
IDxiPjxpPjxwPkhlbGxvPC9wPjwvaT48L2I+LiBJbiB0aGlzIGV4YW1wbGUgdGhlIDxpPiB3aWxs
IGhhdmUgYSBibG9jayBhcyBpdHMgY29udGludWF0aW9uIGJ1dCB0aGUKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDxiPiB3aWxsIGp1c3QgaGF2ZSBhbiBpbmxp
bmUgYXMgaXRzIGNvbnRpbnVhdGlvbi4KICAgICBtdXRhYmxlIGludCBtX2xpbmVIZWlnaHQ7CiAg
ICAgbXV0YWJsZSBpbnQgbV92ZXJ0aWNhbFBvc2l0aW9uOwogfTsKSW5kZXg6IFdlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlck9iamVjdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcv
UmVuZGVyT2JqZWN0LmNwcAkocmV2aXNpb24gNDc1OTEpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9S
ZW5kZXJPYmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMTEyLDggKzIxMTIsNiBAQCB2b2lk
IFJlbmRlck9iamVjdDo6Z2V0VGV4dERlY29yYXRpb25Db2xvCiAgICAgICAgICAgICB9CiAgICAg
ICAgIH0KICAgICAgICAgY3VyciA9IGN1cnItPnBhcmVudCgpOwotICAgICAgICBpZiAoY3VyciAm
JiBjdXJyLT5pc1JlbmRlckJsb2NrKCkgJiYgdG9SZW5kZXJCbG9jayhjdXJyKS0+aW5saW5lQ29u
dGludWF0aW9uKCkpCi0gICAgICAgICAgICBjdXJyID0gdG9SZW5kZXJCbG9jayhjdXJyKS0+aW5s
aW5lQ29udGludWF0aW9uKCk7CiAgICAgfSB3aGlsZSAoY3VyciAmJiBkZWNvcmF0aW9ucyAmJiAo
IXF1aXJrc01vZGUgfHwgIWN1cnItPm5vZGUoKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICghY3Vyci0+bm9kZSgpLT5oYXNUYWdOYW1lKGFUYWcpICYmICFjdXJyLT5u
b2RlKCktPmhhc1RhZ05hbWUoZm9udFRhZykpKSk7CiAKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5n
L1JlbmRlck9iamVjdC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlck9i
amVjdC5oCShyZXZpc2lvbiA0NzU5MSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlck9iamVj
dC5oCSh3b3JraW5nIGNvcHkpCkBAIC0zNDMsNiArMzQzLDEwIEBAIHB1YmxpYzoKICAgICB7CiAg
ICAgICAgIHJldHVybiBtX2lzQW5vbnltb3VzICYmIHN0eWxlKCktPmRpc3BsYXkoKSA9PSBCTE9D
SyAmJiBzdHlsZSgpLT5zdHlsZVR5cGUoKSA9PSBOT1BTRVVETyAmJiAhaXNMaXN0TWFya2VyKCk7
CiAgICAgfQorICAgIGJvb2wgaXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpIGNvbnN0CisgICAgewor
ICAgICAgICByZXR1cm4gbV9pc0Fub255bW91cyAmJiBzdHlsZSgpLT5kaXNwbGF5KCkgPT0gSU5M
SU5FX0JMT0NLICYmIHN0eWxlKCktPnN0eWxlVHlwZSgpID09IE5PUFNFVURPOworICAgIH0KICAg
ICBib29sIGlzSW5saW5lQ29udGludWF0aW9uKCkgY29uc3QgeyByZXR1cm4gKG5vZGUoKSA/IG5v
ZGUoKS0+cmVuZGVyZXIoKSAhPSB0aGlzIDogZmFsc2UpICYmIGlzUmVuZGVySW5saW5lKCk7IH0K
ICAgICBib29sIGlzRmxvYXRpbmcoKSBjb25zdCB7IHJldHVybiBtX2Zsb2F0aW5nOyB9CiAgICAg
Ym9vbCBpc1Bvc2l0aW9uZWQoKSBjb25zdCB7IHJldHVybiBtX3Bvc2l0aW9uZWQ7IH0gLy8gYWJz
b2x1dGUgb3IgZml4ZWQgcG9zaXRpb25pbmcKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRl
ck9iamVjdENoaWxkTGlzdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVu
ZGVyT2JqZWN0Q2hpbGRMaXN0LmNwcAkocmV2aXNpb24gNDc1OTEpCisrKyBXZWJDb3JlL3JlbmRl
cmluZy9SZW5kZXJPYmplY3RDaGlsZExpc3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMTEsMTYg
KzMxMSw2IEBAIHZvaWQgUmVuZGVyT2JqZWN0Q2hpbGRMaXN0Ojp1cGRhdGVCZWZvcmUKIAogICAg
IC8vIFdoZXRoZXIgb3Igbm90IHdlIG5vdyB3YW50IGdlbmVyYXRlZCBjb250ZW50LiAgCiAgICAg
Ym9vbCBuZXdDb250ZW50V2FudGVkID0gcHNldWRvRWxlbWVudFN0eWxlICYmIHBzZXVkb0VsZW1l
bnRTdHlsZS0+ZGlzcGxheSgpICE9IE5PTkU7Ci0KLSAgICAvLyBGb3IgPHE+PHAvPjwvcT4sIGlm
IHRoaXMgb2JqZWN0IGlzIHRoZSBpbmxpbmUgY29udGludWF0aW9uIG9mIHRoZSA8cT4sIHdlIG9u
bHkgd2FudCB0byBnZW5lcmF0ZQotICAgIC8vIDphZnRlciBjb250ZW50IGFuZCBub3QgOmJlZm9y
ZSBjb250ZW50LgotICAgIGlmIChuZXdDb250ZW50V2FudGVkICYmIHR5cGUgPT0gQkVGT1JFICYm
IG93bmVyLT5pc1JlbmRlcklubGluZSgpICYmIHRvUmVuZGVySW5saW5lKG93bmVyKS0+aXNJbmxp
bmVDb250aW51YXRpb24oKSkKLSAgICAgICAgbmV3Q29udGVudFdhbnRlZCA9IGZhbHNlOwotCi0g
ICAgLy8gU2ltaWxhcmx5LCBpZiB3ZSdyZSB0aGUgYmVnaW5uaW5nIG9mIGEgPHE+LCBhbmQgdGhl
cmUncyBhbiBpbmxpbmUgY29udGludWF0aW9uIGZvciBvdXIgb2JqZWN0LAotICAgIC8vIHRoZW4g
d2UgZG9uJ3QgZ2VuZXJhdGUgdGhlIDphZnRlciBjb250ZW50LgotICAgIGlmIChuZXdDb250ZW50
V2FudGVkICYmIHR5cGUgPT0gQUZURVIgJiYgb3duZXItPmlzUmVuZGVySW5saW5lKCkgJiYgdG9S
ZW5kZXJJbmxpbmUob3duZXIpLT5jb250aW51YXRpb24oKSkKLSAgICAgICAgbmV3Q29udGVudFdh
bnRlZCA9IGZhbHNlOwogICAgIAogICAgIC8vIElmIHdlIGRvbid0IHdhbnQgZ2VuZXJhdGVkIGNv
bnRlbnQgYW55IGxvbmdlciwgb3IgaWYgd2UgaGF2ZSBnZW5lcmF0ZWQgY29udGVudCwgYnV0IGl0
J3Mgbm8gbG9uZ2VyCiAgICAgLy8gaWRlbnRpY2FsIHRvIHRoZSBuZXcgY29udGVudCBkYXRhIHdl
IHdhbnQgdG8gYnVpbGQgcmVuZGVyIG9iamVjdHMgZm9yLCB0aGVuIHdlIG51a2UgYWxsCkluZGV4
OiBXZWJDb3JlL3JlbmRlcmluZy9Sb290SW5saW5lQm94LmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL3JlbmRlcmluZy9Sb290SW5saW5lQm94LmNwcAkocmV2aXNpb24gNDc1OTEpCisrKyBXZWJD
b3JlL3JlbmRlcmluZy9Sb290SW5saW5lQm94LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjE1LDEw
ICsyMTUsMTMgQEAgaW50IFJvb3RJbmxpbmVCb3g6OnZlcnRpY2FsbHlBbGlnbkJveGVzKAogICAg
ICAgICBjdXJyID0gY3Vyci0+Y29udGFpbmVyKCk7CiAgICAgYm9vbCBzdHJpY3RNb2RlID0gKGN1
cnIgJiYgY3Vyci0+ZG9jdW1lbnQoKS0+aW5TdHJpY3RNb2RlKCkpOwogCi0gICAgY29tcHV0ZUxv
Z2ljYWxCb3hIZWlnaHRzKG1heFBvc2l0aW9uVG9wLCBtYXhQb3NpdGlvbkJvdHRvbSwgbWF4QXNj
ZW50LCBtYXhEZXNjZW50LCBzdHJpY3RNb2RlKTsKLQotICAgIGlmIChtYXhBc2NlbnQgKyBtYXhE
ZXNjZW50IDwgbWF4KG1heFBvc2l0aW9uVG9wLCBtYXhQb3NpdGlvbkJvdHRvbSkpCi0gICAgICAg
IGFkanVzdE1heEFzY2VudEFuZERlc2NlbnQobWF4QXNjZW50LCBtYXhEZXNjZW50LCBtYXhQb3Np
dGlvblRvcCwgbWF4UG9zaXRpb25Cb3R0b20pOworICAgIGlmIChhbm9ueW1vdXNJbmxpbmVCbG9j
aygpKQorICAgICAgICBtYXhBc2NlbnQgPSBmaXJzdENoaWxkKCktPmhlaWdodCgpOworICAgIGVs
c2UgeworICAgICAgICBjb21wdXRlTG9naWNhbEJveEhlaWdodHMobWF4UG9zaXRpb25Ub3AsIG1h
eFBvc2l0aW9uQm90dG9tLCBtYXhBc2NlbnQsIG1heERlc2NlbnQsIHN0cmljdE1vZGUpOworICAg
ICAgICBpZiAobWF4QXNjZW50ICsgbWF4RGVzY2VudCA8IG1heChtYXhQb3NpdGlvblRvcCwgbWF4
UG9zaXRpb25Cb3R0b20pKQorICAgICAgICAgICAgYWRqdXN0TWF4QXNjZW50QW5kRGVzY2VudCht
YXhBc2NlbnQsIG1heERlc2NlbnQsIG1heFBvc2l0aW9uVG9wLCBtYXhQb3NpdGlvbkJvdHRvbSk7
CisgICAgfQogCiAgICAgaW50IG1heEhlaWdodCA9IG1heEFzY2VudCArIG1heERlc2NlbnQ7CiAg
ICAgaW50IGxpbmVUb3AgPSBoZWlnaHRPZkJsb2NrOwpAQCAtNDI5LDQgKzQzMiw5IEBAIHZvaWQg
Um9vdElubGluZUJveDo6YXR0YWNoTGluZUJveFRvUmVuZGUKICAgICBibG9jaygpLT5saW5lQm94
ZXMoKS0+YXR0YWNoTGluZUJveCh0aGlzKTsKIH0KIAorUmVuZGVyQmxvY2sqIFJvb3RJbmxpbmVC
b3g6OmFub255bW91c0lubGluZUJsb2NrKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZmlyc3RDaGls
ZCgpICYmIGZpcnN0Q2hpbGQoKSA9PSBsYXN0Q2hpbGQoKSAmJiAhZmlyc3RDaGlsZCgpLT5pc1Rl
eHQoKSAmJiBmaXJzdENoaWxkKCktPnJlbmRlcmVyKCktPmlzQW5vbnltb3VzSW5saW5lQmxvY2so
KSA/IHRvUmVuZGVyQmxvY2soZmlyc3RDaGlsZCgpLT5yZW5kZXJlcigpKSA6IDA7Cit9CisKIH0g
Ly8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1Jvb3RJbmxpbmVC
b3guaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9Sb290SW5saW5lQm94LmgJKHJl
dmlzaW9uIDQ3NTkxKQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUm9vdElubGluZUJveC5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xMzQsNiArMTM0LDggQEAgcHVibGljOgogICAgIHZpcnR1YWwgdm9pZCBh
dHRhY2hMaW5lQm94VG9SZW5kZXJPYmplY3QoKTsKICAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlTGlu
ZUJveEZyb21SZW5kZXJPYmplY3QoKTsKIAorICAgIFJlbmRlckJsb2NrKiBhbm9ueW1vdXNJbmxp
bmVCbG9jaygpIGNvbnN0OworCiBwcm90ZWN0ZWQ6CiAgICAgLy8gV2hlcmUgdGhpcyBsaW5lIGVu
ZGVkLiAgVGhlIGV4YWN0IG9iamVjdCBhbmQgdGhlIHBvc2l0aW9uIHdpdGhpbiB0aGF0IG9iamVj
dCBhcmUgc3RvcmVkIHNvIHRoYXQKICAgICAvLyB3ZSBjYW4gY3JlYXRlIGFuIElubGluZUl0ZXJh
dG9yIGJlZ2lubmluZyBqdXN0IGFmdGVyIHRoZSBlbmQgb2YgdGhpcyBsaW5lLgo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>38437</attachid>
            <date>2009-08-22 14:04:44 -0700</date>
            <delta_ts>2009-08-22 19:32:47 -0700</delta_ts>
            <desc>This patch gets the position of self-collapsing blocks correct (up to 15 / 65 tests converted and passing)</desc>
            <filename>patch.txt</filename>
            <type>text/plain</type>
            <size>69783</size>
            <attacher name="Dave Hyatt">hyatt</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0LmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eVJlbmRl
ck9iamVjdC5jcHAJKHJldmlzaW9uIDQ3NTkxKQorKysgV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0Fj
Y2Vzc2liaWxpdHlSZW5kZXJPYmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01MjMsMTIgKzUy
Myw4IEBAIEVsZW1lbnQqIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmFuY2gKICAgICBSZW5k
ZXJPYmplY3QqIGN1cnJSZW5kZXJlcjsKICAgICAKICAgICAvLyBTZWFyY2ggdXAgdGhlIHJlbmRl
ciB0cmVlIGZvciBhIFJlbmRlck9iamVjdCB3aXRoIGEgRE9NIG5vZGUuICBEZWZlciB0byBhbiBl
YXJsaWVyIGNvbnRpbnVhdGlvbiwgdGhvdWdoLgotICAgIGZvciAoY3VyclJlbmRlcmVyID0gbV9y
ZW5kZXJlcjsgY3VyclJlbmRlcmVyICYmICFjdXJyUmVuZGVyZXItPm5vZGUoKTsgY3VyclJlbmRl
cmVyID0gY3VyclJlbmRlcmVyLT5wYXJlbnQoKSkgewotICAgICAgICBpZiAoY3VyclJlbmRlcmVy
LT5pc1JlbmRlckJsb2NrKCkpIHsKLSAgICAgICAgICAgIFJlbmRlcklubGluZSogY29udGludWF0
aW9uID0gdG9SZW5kZXJCbG9jayhjdXJyUmVuZGVyZXIpLT5pbmxpbmVDb250aW51YXRpb24oKTsK
LSAgICAgICAgICAgIGlmIChjb250aW51YXRpb24pCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNh
Y2hlLT5nZXRPckNyZWF0ZShjb250aW51YXRpb24pLT5hbmNob3JFbGVtZW50KCk7Ci0gICAgICAg
IH0KKyAgICBmb3IgKGN1cnJSZW5kZXJlciA9IG1fcmVuZGVyZXI7IGN1cnJSZW5kZXJlciAmJiAh
Y3VyclJlbmRlcmVyLT5ub2RlKCk7IGN1cnJSZW5kZXJlciA9IGN1cnJSZW5kZXJlci0+cGFyZW50
KCkpCisgICAgewogICAgIH0KICAgICAKICAgICAvLyBiYWlsIGlmIG5vbmUgZm91bmQKSW5kZXg6
IFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUZsb3dCb3guY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvcmVuZGVyaW5nL0lubGluZUZsb3dCb3guY3BwCShyZXZpc2lvbiA0NzU5MSkKKysrIFdlYkNv
cmUvcmVuZGVyaW5nL0lubGluZUZsb3dCb3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMjcsMTQg
KzIyNywxMyBAQCB2b2lkIElubGluZUZsb3dCb3g6OmRldGVybWluZVNwYWNpbmdGb3JGCiAgICAg
ICAgIC8vICgzKSBUaGUgbGluZSBtYXkgZW5kIG9uIHRoZSBpbmxpbmUuICBJZiB3ZSBhcmUgdGhl
IGxhc3QgY2hpbGQgKGNsaW1iaW5nIHVwCiAgICAgICAgIC8vIHRoZSBlbmQgb2JqZWN0J3MgY2hh
aW4pLCB0aGVuIHdlIGp1c3QgY2xvc2VkIGFzIHdlbGwuCiAgICAgICAgIGlmICghbGluZUJveExp
c3QtPmxhc3RMaW5lQm94KCktPmlzQ29uc3RydWN0ZWQoKSkgewotICAgICAgICAgICAgUmVuZGVy
SW5saW5lKiBpbmxpbmVGbG93ID0gdG9SZW5kZXJJbmxpbmUocmVuZGVyZXIoKSk7CiAgICAgICAg
ICAgICBpZiAobHRyKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFuZXh0TGluZUJveCgpICYmCi0g
ICAgICAgICAgICAgICAgICAgICgobGFzdExpbmUgJiYgIWlubGluZUZsb3ctPmNvbnRpbnVhdGlv
bigpKSB8fCBuZXh0T25MaW5lRXhpc3RzKCkgfHwgb25FbmRDaGFpbihlbmRPYmplY3QpKSkKKyAg
ICAgICAgICAgICAgICAgICAgKGxhc3RMaW5lIHx8IG5leHRPbkxpbmVFeGlzdHMoKSB8fCBvbkVu
ZENoYWluKGVuZE9iamVjdCkpKQogICAgICAgICAgICAgICAgICAgICBpbmNsdWRlUmlnaHRFZGdl
ID0gdHJ1ZTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKCghcHJl
dkxpbmVCb3goKSB8fCBwcmV2TGluZUJveCgpLT5pc0NvbnN0cnVjdGVkKCkpICYmCi0gICAgICAg
ICAgICAgICAgICAgICgobGFzdExpbmUgJiYgIWlubGluZUZsb3ctPmNvbnRpbnVhdGlvbigpKSB8
fCBwcmV2T25MaW5lRXhpc3RzKCkgfHwgb25FbmRDaGFpbihlbmRPYmplY3QpKSkKKyAgICAgICAg
ICAgICAgICAgICAgKGxhc3RMaW5lIHx8IHByZXZPbkxpbmVFeGlzdHMoKSB8fCBvbkVuZENoYWlu
KGVuZE9iamVjdCkpKQogICAgICAgICAgICAgICAgICAgICBpbmNsdWRlTGVmdEVkZ2UgPSB0cnVl
OwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC01MDQsNyArNTAzLDcgQEAgdm9pZCBJbmxp
bmVGbG93Qm94OjpwbGFjZUJveGVzVmVydGljYWxseQogICAgICAgICAgICAgICAgIG5ld1kgLT0g
Y3Vyci0+Ym94TW9kZWxPYmplY3QoKS0+Ym9yZGVyVG9wKCkgKyBjdXJyLT5ib3hNb2RlbE9iamVj
dCgpLT5wYWRkaW5nVG9wKCk7CiAgICAgICAgIH0gZWxzZSBpZiAoIWN1cnItPnJlbmRlcmVyKCkt
PmlzQlIoKSkgewogICAgICAgICAgICAgUmVuZGVyQm94KiBib3ggPSB0b1JlbmRlckJveChjdXJy
LT5yZW5kZXJlcigpKTsKLSAgICAgICAgICAgIG5ld1kgKz0gYm94LT5tYXJnaW5Ub3AoKTsKKyAg
ICAgICAgICAgIG5ld1kgKz0gY3Vyci0+cmVuZGVyZXIoKS0+aXNBbm9ueW1vdXNJbmxpbmVCbG9j
aygpID8gMCA6IGJveC0+bWFyZ2luVG9wKCk7CiAgICAgICAgIH0KIAogICAgICAgICBjdXJyLT5z
ZXRZKG5ld1kpOwpAQCAtNjQzLDEzICs2NDIsNyBAQCB2b2lkIElubGluZUZsb3dCb3g6OnBhaW50
KFJlbmRlck9iamVjdDo6CiAgICAgICAgICAgICAvLyBvdXRsaW5lcy4KICAgICAgICAgICAgIGlm
IChyZW5kZXJlcigpLT5zdHlsZSgpLT52aXNpYmlsaXR5KCkgPT0gVklTSUJMRSAmJiByZW5kZXJl
cigpLT5oYXNPdXRsaW5lKCkgJiYgIWlzUm9vdElubGluZUJveCgpKSB7CiAgICAgICAgICAgICAg
ICAgUmVuZGVySW5saW5lKiBpbmxpbmVGbG93ID0gdG9SZW5kZXJJbmxpbmUocmVuZGVyZXIoKSk7
Ci0gICAgICAgICAgICAgICAgaWYgKChpbmxpbmVGbG93LT5jb250aW51YXRpb24oKSB8fCBpbmxp
bmVGbG93LT5pc0lubGluZUNvbnRpbnVhdGlvbigpKSAmJiAhYm94TW9kZWxPYmplY3QoKS0+aGFz
U2VsZlBhaW50aW5nTGF5ZXIoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBBZGQgb3Vyc2Vs
dmVzIHRvIHRoZSBjb250YWluaW5nIGJsb2NrIG9mIHRoZSBlbnRpcmUgY29udGludWF0aW9uIHNv
IHRoYXQgaXQgY2FuCi0gICAgICAgICAgICAgICAgICAgIC8vIHBhaW50IHVzIGF0b21pY2FsbHku
Ci0gICAgICAgICAgICAgICAgICAgIFJlbmRlckJsb2NrKiBibG9jayA9IHJlbmRlcmVyKCktPmNv
bnRhaW5pbmdCbG9jaygpLT5jb250YWluaW5nQmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAg
YmxvY2stPmFkZENvbnRpbnVhdGlvbldpdGhPdXRsaW5lKHRvUmVuZGVySW5saW5lKHJlbmRlcmVy
KCktPm5vZGUoKS0+cmVuZGVyZXIoKSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlu
bGluZUZsb3ctPmlzSW5saW5lQ29udGludWF0aW9uKCkpCi0gICAgICAgICAgICAgICAgICAgIHBh
aW50SW5mby5vdXRsaW5lT2JqZWN0cy0+YWRkKGlubGluZUZsb3cpOworICAgICAgICAgICAgICAg
IHBhaW50SW5mby5vdXRsaW5lT2JqZWN0cy0+YWRkKGlubGluZUZsb3cpOwogICAgICAgICAgICAg
fQogICAgICAgICB9IGVsc2UgaWYgKHBhaW50SW5mby5waGFzZSA9PSBQYWludFBoYXNlTWFzaykg
ewogICAgICAgICAgICAgcGFpbnRNYXNrKHBhaW50SW5mbywgdHgsIHR5KTsKSW5kZXg6IFdlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRl
cmluZy9SZW5kZXJCbG9jay5jcHAJKHJldmlzaW9uIDQ3NjQzKQorKysgV2ViQ29yZS9yZW5kZXJp
bmcvUmVuZGVyQmxvY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC04Miw4ICs4Miw2IEBAIHN0YXRp
YyBQZXJjZW50SGVpZ2h0RGVzY2VuZGFudHNNYXAqIGdQZXIKIAogdHlwZWRlZiBXVEY6Okhhc2hN
YXA8Y29uc3QgUmVuZGVyQm94KiwgSGFzaFNldDxSZW5kZXJCbG9jayo+Kj4gUGVyY2VudEhlaWdo
dENvbnRhaW5lck1hcDsKIHN0YXRpYyBQZXJjZW50SGVpZ2h0Q29udGFpbmVyTWFwKiBnUGVyY2Vu
dEhlaWdodENvbnRhaW5lck1hcCA9IDA7Ci0gICAgCi10eXBlZGVmIFdURjo6SGFzaE1hcDxSZW5k
ZXJCbG9jayosIExpc3RIYXNoU2V0PFJlbmRlcklubGluZSo+Kj4gQ29udGludWF0aW9uT3V0bGlu
ZVRhYmxlTWFwOwogCiB0eXBlZGVmIFdURjo6SGFzaFNldDxSZW5kZXJCbG9jayo+IERlbGF5ZWRV
cGRhdGVTY3JvbGxJbmZvU2V0Owogc3RhdGljIGludCBnRGVsYXlVcGRhdGVTY3JvbGxJbmZvID0g
MDsKQEAgLTk2LDcgKzk0LDcgQEAgUmVuZGVyQmxvY2s6Ok1hcmdpbkluZm86Ok1hcmdpbkluZm8o
UmVuZAogICAgIC8vIGlmIHdlIGhhZCBhbnkgYm9yZGVyL3BhZGRpbmcgKG9idmlvdXNseSksIGlm
IHdlJ3JlIHRoZSByb290IG9yIEhUTUwgZWxlbWVudHMsIG9yIGlmCiAgICAgLy8gd2UncmUgcG9z
aXRpb25lZCwgZmxvYXRpbmcsIGEgdGFibGUgY2VsbC4KICAgICBtX2NhbkNvbGxhcHNlV2l0aENo
aWxkcmVuID0gIWJsb2NrLT5pc1JlbmRlclZpZXcoKSAmJiAhYmxvY2stPmlzUm9vdCgpICYmICFi
bG9jay0+aXNQb3NpdGlvbmVkKCkgJiYKLSAgICAgICAgIWJsb2NrLT5pc0Zsb2F0aW5nKCkgJiYg
IWJsb2NrLT5pc1RhYmxlQ2VsbCgpICYmICFibG9jay0+aGFzT3ZlcmZsb3dDbGlwKCkgJiYgIWJs
b2NrLT5pc0lubGluZUJsb2NrT3JJbmxpbmVUYWJsZSgpOworICAgICAgICAhYmxvY2stPmlzRmxv
YXRpbmcoKSAmJiAhYmxvY2stPmlzVGFibGVDZWxsKCkgJiYgIWJsb2NrLT5oYXNPdmVyZmxvd0Ns
aXAoKSAmJiAoIWJsb2NrLT5pc0lubGluZUJsb2NrT3JJbmxpbmVUYWJsZSgpIHx8IGJsb2NrLT5p
c0Fub255bW91c0lubGluZUJsb2NrKCkpOwogCiAgICAgbV9jYW5Db2xsYXBzZVRvcFdpdGhDaGls
ZHJlbiA9IG1fY2FuQ29sbGFwc2VXaXRoQ2hpbGRyZW4gJiYgKHRvcCA9PSAwKSAmJiBibG9jay0+
c3R5bGUoKS0+bWFyZ2luVG9wQ29sbGFwc2UoKSAhPSBNU0VQQVJBVEU7CiAKQEAgLTEyNyw3ICsx
MjUsNiBAQCBSZW5kZXJCbG9jazo6UmVuZGVyQmxvY2soTm9kZSogbm9kZSkKICAgICAgIDogUmVu
ZGVyQm94KG5vZGUpCiAgICAgICAsIG1fZmxvYXRpbmdPYmplY3RzKDApCiAgICAgICAsIG1fcG9z
aXRpb25lZE9iamVjdHMoMCkKLSAgICAgICwgbV9pbmxpbmVDb250aW51YXRpb24oMCkKICAgICAg
ICwgbV9tYXhNYXJnaW4oMCkKICAgICAgICwgbV9saW5lSGVpZ2h0KC0xKQogewpAQCAtMTY1LDEx
ICsxNjIsNiBAQCBSZW5kZXJCbG9jazo6flJlbmRlckJsb2NrKCkKIAogdm9pZCBSZW5kZXJCbG9j
azo6ZGVzdHJveSgpCiB7Ci0gICAgLy8gRGV0YWNoIG91ciBjb250aW51YXRpb24gZmlyc3QuCi0g
ICAgaWYgKG1faW5saW5lQ29udGludWF0aW9uKQotICAgICAgICBtX2lubGluZUNvbnRpbnVhdGlv
bi0+ZGVzdHJveSgpOwotICAgIG1faW5saW5lQ29udGludWF0aW9uID0gMDsKLSAgICAKICAgICAv
LyBNYWtlIHN1cmUgdG8gZGVzdHJveSBhbm9ueW1vdXMgY2hpbGRyZW4gZmlyc3Qgd2hpbGUgdGhl
eSBhcmUgc3RpbGwgY29ubmVjdGVkIHRvIHRoZSByZXN0IG9mIHRoZSB0cmVlLCBzbyB0aGF0IHRo
ZXkgd2lsbAogICAgIC8vIHByb3Blcmx5IGRpcnR5IGxpbmUgYm94ZXMgdGhhdCB0aGV5IGFyZSBy
ZW1vdmVkIGZyb20uICBFZmZlY3RzIHRoYXQgZG8gOmJlZm9yZS86YWZ0ZXIgb25seSBvbiBob3Zl
ciBjb3VsZCBjcmFzaCBvdGhlcndpc2UuCiAgICAgY2hpbGRyZW4oKS0+ZGVzdHJveUxlZnRvdmVy
Q2hpbGRyZW4oKTsKQEAgLTMyMCw3ICszMTIsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjphZGRDaGls
ZChSZW5kZXJPYmplY3QqCiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFjaGlsZHJlbklubGlu
ZSgpICYmIChuZXdDaGlsZC0+aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpIHx8IG5ld0NoaWxkLT5p
c0lubGluZSgpKSkgewogICAgICAgICAvLyBJZiB3ZSdyZSBpbnNlcnRpbmcgYW4gaW5saW5lIGNo
aWxkIGJ1dCBhbGwgb2Ygb3VyIGNoaWxkcmVuIGFyZSBibG9ja3MsIHRoZW4gd2UgaGF2ZSB0byBt
YWtlIHN1cmUKLSAgICAgICAgLy8gaXQgaXMgcHV0IGludG8gYW4gYW5vbXlvdXMgYmxvY2sgYm94
LiBXZSB0cnkgdG8gdXNlIGFuIGV4aXN0aW5nIGFub255bW91cyBib3ggaWYgcG9zc2libGUsIG90
aGVyd2lzZQorICAgICAgICAvLyBpdCBpcyBwdXQgaW50byBhbiBhbm9ueW1vdXMgYmxvY2sgYm94
LiBXZSB0cnkgdG8gdXNlIGFuIGV4aXN0aW5nIGFub255bW91cyBib3ggaWYgcG9zc2libGUsIG90
aGVyd2lzZQogICAgICAgICAvLyBhIG5ldyBvbmUgaXMgY3JlYXRlZCBhbmQgaW5zZXJ0ZWQgaW50
byBvdXIgbGlzdCBvZiBjaGlsZHJlbiBpbiB0aGUgYXBwcm9wcmlhdGUgcG9zaXRpb24uCiAgICAg
ICAgIFJlbmRlck9iamVjdCogYWZ0ZXJDaGlsZCA9IGJlZm9yZUNoaWxkID8gYmVmb3JlQ2hpbGQt
PnByZXZpb3VzU2libGluZygpIDogbGFzdENoaWxkKCk7CiAKQEAgLTQ1Niw5ICs0NDgsNiBAQCB2
b2lkIFJlbmRlckJsb2NrOjpyZW1vdmVMZWZ0b3ZlckFub255bW91CiAgICAgQVNTRVJUKGNoaWxk
LT5pc0Fub255bW91c0Jsb2NrKCkpOwogICAgIEFTU0VSVCghY2hpbGQtPmNoaWxkcmVuSW5saW5l
KCkpOwogICAgIAotICAgIGlmIChjaGlsZC0+aW5saW5lQ29udGludWF0aW9uKCkpIAotICAgICAg
ICByZXR1cm47Ci0gICAgCiAgICAgUmVuZGVyT2JqZWN0KiBmaXJzdEFuQ2hpbGQgPSBjaGlsZC0+
bV9jaGlsZHJlbi5maXJzdENoaWxkKCk7CiAgICAgUmVuZGVyT2JqZWN0KiBsYXN0QW5DaGlsZCA9
IGNoaWxkLT5tX2NoaWxkcmVuLmxhc3RDaGlsZCgpOwogICAgIGlmIChmaXJzdEFuQ2hpbGQpIHsK
QEAgLTUwMSw3ICs0OTAsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjpyZW1vdmVDaGlsZChSZW5kZXJP
YmplCiAgICAgUmVuZGVyT2JqZWN0KiBwcmV2ID0gb2xkQ2hpbGQtPnByZXZpb3VzU2libGluZygp
OwogICAgIFJlbmRlck9iamVjdCogbmV4dCA9IG9sZENoaWxkLT5uZXh0U2libGluZygpOwogICAg
IGJvb2wgY2FuRGVsZXRlQW5vbnltb3VzQmxvY2tzID0gIWRvY3VtZW50QmVpbmdEZXN0cm95ZWQo
KSAmJiAhaXNJbmxpbmUoKSAmJiAhb2xkQ2hpbGQtPmlzSW5saW5lKCkgJiYgCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAoIW9sZENoaWxkLT5pc1JlbmRlckJsb2NrKCkgfHwg
IXRvUmVuZGVyQmxvY2sob2xkQ2hpbGQpLT5pbmxpbmVDb250aW51YXRpb24oKSkgJiYgCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhb2xkQ2hpbGQtPmlzUmVuZGVyQmxvY2so
KSAmJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghcHJldiB8fCAocHJl
di0+aXNBbm9ueW1vdXNCbG9jaygpICYmIHByZXYtPmNoaWxkcmVuSW5saW5lKCkpKSAmJgogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFuZXh0IHx8IChuZXh0LT5pc0Fub255
bW91c0Jsb2NrKCkgJiYgbmV4dC0+Y2hpbGRyZW5JbmxpbmUoKSkpOwogICAgIGlmIChjYW5EZWxl
dGVBbm9ueW1vdXNCbG9ja3MgJiYgcHJldiAmJiBuZXh0KSB7CkBAIC01NzQsOSArNTYzLDE1IEBA
IGJvb2wgUmVuZGVyQmxvY2s6OmlzU2VsZkNvbGxhcHNpbmdCbG9jaygKICAgICAvLyBvbiB3aGV0
aGVyIHdlIGhhdmUgY29udGVudCB0aGF0IGlzIGFsbCBzZWxmLWNvbGxhcHNpbmcgb3Igbm90Lgog
ICAgIGlmIChoYXNBdXRvSGVpZ2h0IHx8ICgoc3R5bGUoKS0+aGVpZ2h0KCkuaXNGaXhlZCgpIHx8
IHN0eWxlKCktPmhlaWdodCgpLmlzUGVyY2VudCgpKSAmJiBzdHlsZSgpLT5oZWlnaHQoKS5pc1pl
cm8oKSkpIHsKICAgICAgICAgLy8gSWYgdGhlIGJsb2NrIGhhcyBpbmxpbmUgY2hpbGRyZW4sIHNl
ZSBpZiB3ZSBnZW5lcmF0ZWQgYW55IGxpbmUgYm94ZXMuICBJZiB3ZSBoYXZlIGFueQotICAgICAg
ICAvLyBsaW5lIGJveGVzLCB0aGVuIHdlIGNhbid0IGJlIHNlbGYtY29sbGFwc2luZywgc2luY2Ug
d2UgaGF2ZSBjb250ZW50LgotICAgICAgICBpZiAoY2hpbGRyZW5JbmxpbmUoKSkKLSAgICAgICAg
ICAgIHJldHVybiAhZmlyc3RMaW5lQm94KCk7CisgICAgICAgIC8vIGxpbmUgYm94ZXMsIHRoZW4g
d2UgY2FuIG9ubHkgYmUgc2VsZi1jb2xsYXBzaW5nIGlmIHdlIGhhdmUgbm90aGluZyBidXQgYW5v
bnltb3VzIGlubGluZSBibG9ja3MKKyAgICAgICAgLy8gdGhhdCBhcmUgYWxzbyBzZWxmLWNvbGxh
cHNpbmcgaW5zaWRlIHVzLgorICAgICAgICBpZiAoY2hpbGRyZW5JbmxpbmUoKSkgeworICAgICAg
ICAgICAgZm9yIChSb290SW5saW5lQm94KiBjaGlsZCA9IGZpcnN0Um9vdEJveCgpOyBjaGlsZDsg
Y2hpbGQgPSBjaGlsZC0+bmV4dFJvb3RCb3goKSkgeworICAgICAgICAgICAgICAgIGlmICghY2hp
bGQtPmFub255bW91c0lubGluZUJsb2NrKCkgfHwgIWNoaWxkLT5hbm9ueW1vdXNJbmxpbmVCbG9j
aygpLT5pc1NlbGZDb2xsYXBzaW5nQmxvY2soKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIFdlIGhh
dmUgbm8gbGluZSBib3hlcywgc28gd2UgbXVzdCBiZSBzZWxmLWNvbGxhcHNpbmcuCisgICAgICAg
IH0KICAgICAgICAgCiAgICAgICAgIC8vIFdoZXRoZXIgb3Igbm90IHdlIGNvbGxhcHNlIGlzIGRl
cGVuZGVudCBvbiB3aGV0aGVyIGFsbCBvdXIgbm9ybWFsIGZsb3cgY2hpbGRyZW4KICAgICAgICAg
Ly8gYXJlIGFsc28gc2VsZi1jb2xsYXBzaW5nLgpAQCAtODI5LDcgKzgyNCw4IEBAIHZvaWQgUmVu
ZGVyQmxvY2s6OmFkZE92ZXJmbG93RnJvbUZsb2F0cygKIAogYm9vbCBSZW5kZXJCbG9jazo6ZXhw
YW5kc1RvRW5jbG9zZU92ZXJoYW5naW5nRmxvYXRzKCkgY29uc3QKIHsKLSAgICByZXR1cm4gaXNJ
bmxpbmVCbG9ja09ySW5saW5lVGFibGUoKSB8fCBpc0Zsb2F0aW5nT3JQb3NpdGlvbmVkKCkgfHwg
aGFzT3ZlcmZsb3dDbGlwKCkgfHwgKHBhcmVudCgpICYmIHBhcmVudCgpLT5pc0ZsZXhpYmxlQm94
KCkpIHx8IGhhc0NvbHVtbnMoKSB8fCBpc1RhYmxlQ2VsbCgpIHx8IGlzRmllbGRzZXQoKTsKKyAg
ICByZXR1cm4gaXNGbG9hdGluZ09yUG9zaXRpb25lZCgpIHx8IGhhc092ZXJmbG93Q2xpcCgpIHx8
IChwYXJlbnQoKSAmJiBwYXJlbnQoKS0+aXNGbGV4aWJsZUJveCgpKSB8fCBoYXNDb2x1bW5zKCkg
fHwgaXNUYWJsZUNlbGwoKSB8fCBpc0ZpZWxkc2V0KCkgfHwKKyAgICAgICAgICAgKGlzSW5saW5l
QmxvY2tPcklubGluZVRhYmxlKCkgJiYgIWlzQW5vbnltb3VzSW5saW5lQmxvY2soKSk7CiB9CiAK
IHZvaWQgUmVuZGVyQmxvY2s6OmFkanVzdFBvc2l0aW9uZWRCbG9jayhSZW5kZXJCb3gqIGNoaWxk
LCBjb25zdCBNYXJnaW5JbmZvJiBtYXJnaW5JbmZvKQpAQCAtMTcyMSwyMCArMTcxNyw3IEBAIHZv
aWQgUmVuZGVyQmxvY2s6OnBhaW50T2JqZWN0KFBhaW50SW5mbyYKICAgICBpZiAoKHBhaW50UGhh
c2UgPT0gUGFpbnRQaGFzZU91dGxpbmUgfHwgcGFpbnRQaGFzZSA9PSBQYWludFBoYXNlU2VsZk91
dGxpbmUpICYmIGhhc091dGxpbmUoKSAmJiBzdHlsZSgpLT52aXNpYmlsaXR5KCkgPT0gVklTSUJM
RSkKICAgICAgICAgcGFpbnRPdXRsaW5lKHBhaW50SW5mby5jb250ZXh0LCB0eCwgdHksIHdpZHRo
KCksIGhlaWdodCgpLCBzdHlsZSgpKTsKIAotICAgIC8vIDYuIHBhaW50IGNvbnRpbnVhdGlvbiBv
dXRsaW5lcy4KLSAgICBpZiAoKHBhaW50UGhhc2UgPT0gUGFpbnRQaGFzZU91dGxpbmUgfHwgcGFp
bnRQaGFzZSA9PSBQYWludFBoYXNlQ2hpbGRPdXRsaW5lcykpIHsKLSAgICAgICAgaWYgKGlubGlu
ZUNvbnRpbnVhdGlvbigpICYmIGlubGluZUNvbnRpbnVhdGlvbigpLT5oYXNPdXRsaW5lKCkgJiYg
aW5saW5lQ29udGludWF0aW9uKCktPnN0eWxlKCktPnZpc2liaWxpdHkoKSA9PSBWSVNJQkxFKSB7
Ci0gICAgICAgICAgICBSZW5kZXJJbmxpbmUqIGlubGluZVJlbmRlcmVyID0gdG9SZW5kZXJJbmxp
bmUoaW5saW5lQ29udGludWF0aW9uKCktPm5vZGUoKS0+cmVuZGVyZXIoKSk7Ci0gICAgICAgICAg
ICBpZiAoIWlubGluZVJlbmRlcmVyLT5oYXNTZWxmUGFpbnRpbmdMYXllcigpKQotICAgICAgICAg
ICAgICAgIGNvbnRhaW5pbmdCbG9jaygpLT5hZGRDb250aW51YXRpb25XaXRoT3V0bGluZShpbmxp
bmVSZW5kZXJlcik7Ci0gICAgICAgICAgICBlbHNlIGlmICghaW5saW5lUmVuZGVyZXItPmZpcnN0
TGluZUJveCgpKQotICAgICAgICAgICAgICAgIGlubGluZVJlbmRlcmVyLT5wYWludE91dGxpbmUo
cGFpbnRJbmZvLmNvbnRleHQsIHR4IC0geCgpICsgaW5saW5lUmVuZGVyZXItPmNvbnRhaW5pbmdC
bG9jaygpLT54KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICB0eSAtIHkoKSArIGlubGluZVJlbmRlcmVyLT5jb250YWluaW5nQmxvY2soKS0+eSgpKTsKLSAg
ICAgICAgfQotICAgICAgICBwYWludENvbnRpbnVhdGlvbk91dGxpbmVzKHBhaW50SW5mbywgdHgs
IHR5KTsKLSAgICB9Ci0KLSAgICAvLyA3LiBwYWludCBjYXJldC4KKyAgICAvLyA2LiBwYWludCBj
YXJldC4KICAgICAvLyBJZiB0aGUgY2FyZXQncyBub2RlJ3MgcmVuZGVyIG9iamVjdCdzIGNvbnRh
aW5pbmcgYmxvY2sgaXMgdGhpcyBibG9jaywgYW5kIHRoZSBwYWludCBhY3Rpb24gaXMgUGFpbnRQ
aGFzZUZvcmVncm91bmQsCiAgICAgLy8gdGhlbiBwYWludCB0aGUgY2FyZXQuCiAgICAgaWYgKHBh
aW50UGhhc2UgPT0gUGFpbnRQaGFzZUZvcmVncm91bmQpIHsgICAgICAgIApAQCAtMTc5Nyw1NyAr
MTc4MCw2IEBAIHZvaWQgUmVuZGVyQmxvY2s6OnBhaW50RWxsaXBzaXNCb3hlcyhQYWkKICAgICB9
CiB9CiAKLXN0YXRpYyBDb250aW51YXRpb25PdXRsaW5lVGFibGVNYXAqIGNvbnRpbnVhdGlvbk91
dGxpbmVUYWJsZSgpCi17Ci0gICAgREVGSU5FX1NUQVRJQ19MT0NBTChDb250aW51YXRpb25PdXRs
aW5lVGFibGVNYXAsIHRhYmxlLCAoKSk7Ci0gICAgcmV0dXJuICZ0YWJsZTsKLX0KLQotdm9pZCBS
ZW5kZXJCbG9jazo6YWRkQ29udGludWF0aW9uV2l0aE91dGxpbmUoUmVuZGVySW5saW5lKiBmbG93
KQotewotICAgIC8vIFdlIGNhbid0IG1ha2UgdGhpcyB3b3JrIGlmIHRoZSBpbmxpbmUgaXMgaW4g
YSBsYXllci4gIFdlJ2xsIGp1c3QgcmVseSBvbiB0aGUgYnJva2VuCi0gICAgLy8gd2F5IG9mIHBh
aW50aW5nLgotICAgIEFTU0VSVCghZmxvdy0+bGF5ZXIoKSAmJiAhZmxvdy0+aXNJbmxpbmVDb250
aW51YXRpb24oKSk7Ci0gICAgCi0gICAgQ29udGludWF0aW9uT3V0bGluZVRhYmxlTWFwKiB0YWJs
ZSA9IGNvbnRpbnVhdGlvbk91dGxpbmVUYWJsZSgpOwotICAgIExpc3RIYXNoU2V0PFJlbmRlcklu
bGluZSo+KiBjb250aW51YXRpb25zID0gdGFibGUtPmdldCh0aGlzKTsKLSAgICBpZiAoIWNvbnRp
bnVhdGlvbnMpIHsKLSAgICAgICAgY29udGludWF0aW9ucyA9IG5ldyBMaXN0SGFzaFNldDxSZW5k
ZXJJbmxpbmUqPjsKLSAgICAgICAgdGFibGUtPnNldCh0aGlzLCBjb250aW51YXRpb25zKTsKLSAg
ICB9Ci0gICAgCi0gICAgY29udGludWF0aW9ucy0+YWRkKGZsb3cpOwotfQotCi12b2lkIFJlbmRl
ckJsb2NrOjpwYWludENvbnRpbnVhdGlvbk91dGxpbmVzKFBhaW50SW5mbyYgaW5mbywgaW50IHR4
LCBpbnQgdHkpCi17Ci0gICAgQ29udGludWF0aW9uT3V0bGluZVRhYmxlTWFwKiB0YWJsZSA9IGNv
bnRpbnVhdGlvbk91dGxpbmVUYWJsZSgpOwotICAgIGlmICh0YWJsZS0+aXNFbXB0eSgpKQotICAg
ICAgICByZXR1cm47Ci0gICAgICAgIAotICAgIExpc3RIYXNoU2V0PFJlbmRlcklubGluZSo+KiBj
b250aW51YXRpb25zID0gdGFibGUtPmdldCh0aGlzKTsKLSAgICBpZiAoIWNvbnRpbnVhdGlvbnMp
Ci0gICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgLy8gUGFpbnQgZWFjaCBjb250aW51YXRp
b24gb3V0bGluZS4KLSAgICBMaXN0SGFzaFNldDxSZW5kZXJJbmxpbmUqPjo6aXRlcmF0b3IgZW5k
ID0gY29udGludWF0aW9ucy0+ZW5kKCk7Ci0gICAgZm9yIChMaXN0SGFzaFNldDxSZW5kZXJJbmxp
bmUqPjo6aXRlcmF0b3IgaXQgPSBjb250aW51YXRpb25zLT5iZWdpbigpOyBpdCAhPSBlbmQ7ICsr
aXQpIHsKLSAgICAgICAgLy8gTmVlZCB0byBhZGQgaW4gdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBp
bnRlcnZlbmluZyBibG9ja3MuCi0gICAgICAgIFJlbmRlcklubGluZSogZmxvdyA9ICppdDsKLSAg
ICAgICAgUmVuZGVyQmxvY2sqIGJsb2NrID0gZmxvdy0+Y29udGFpbmluZ0Jsb2NrKCk7Ci0gICAg
ICAgIGZvciAoIDsgYmxvY2sgJiYgYmxvY2sgIT0gdGhpczsgYmxvY2sgPSBibG9jay0+Y29udGFp
bmluZ0Jsb2NrKCkpIHsKLSAgICAgICAgICAgIHR4ICs9IGJsb2NrLT54KCk7Ci0gICAgICAgICAg
ICB0eSArPSBibG9jay0+eSgpOwotICAgICAgICB9Ci0gICAgICAgIEFTU0VSVChibG9jayk7ICAg
Ci0gICAgICAgIGZsb3ctPnBhaW50T3V0bGluZShpbmZvLmNvbnRleHQsIHR4LCB0eSk7Ci0gICAg
fQotICAgIAotICAgIC8vIERlbGV0ZQotICAgIGRlbGV0ZSBjb250aW51YXRpb25zOwotICAgIHRh
YmxlLT5yZW1vdmUodGhpcyk7Ci19Ci0KIHZvaWQgUmVuZGVyQmxvY2s6OnNldFNlbGVjdGlvblN0
YXRlKFNlbGVjdGlvblN0YXRlIHMpCiB7CiAgICAgaWYgKHNlbGVjdGlvblN0YXRlKCkgPT0gcykK
QEAgLTI5MzMsMjAgKzI4NjUsMjcgQEAgdm9pZCBSZW5kZXJCbG9jazo6Y2xlYXJGbG9hdHMoKQog
ICAgIC8vIG91dCBvZiBmbG93IChsaWtlIGZsb2F0aW5nL3Bvc2l0aW9uZWQgZWxlbWVudHMpLCBh
bmQgd2UgYWxzbyBza2lwIG92ZXIgYW55IG9iamVjdHMgdGhhdCBtYXkgaGF2ZSBzaGlmdGVkCiAg
ICAgLy8gdG8gYXZvaWQgZmxvYXRzLgogICAgIGJvb2wgcGFyZW50SGFzRmxvYXRzID0gZmFsc2U7
Ci0gICAgUmVuZGVyT2JqZWN0KiBwcmV2ID0gcHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgd2hpbGUg
KHByZXYgJiYgKHByZXYtPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSB8fCAhcHJldi0+aXNCb3go
KSB8fCAhcHJldi0+aXNSZW5kZXJCbG9jaygpIHx8IHRvUmVuZGVyQmxvY2socHJldiktPmF2b2lk
c0Zsb2F0cygpKSkgewotICAgICAgICBpZiAocHJldi0+aXNGbG9hdGluZygpKQotICAgICAgICAg
ICAgcGFyZW50SGFzRmxvYXRzID0gdHJ1ZTsKLSAgICAgICAgIHByZXYgPSBwcmV2LT5wcmV2aW91
c1NpYmxpbmcoKTsKKyAgICBSZW5kZXJPYmplY3QqIHByZXYgPSAwOworICAgIFJlbmRlckJsb2Nr
KiBwYXJlbnRCbG9jayA9IDA7CisgICAgaWYgKGlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkgewor
ICAgICAgICBwYXJlbnRCbG9jayA9IGNvbnRhaW5pbmdCbG9jaygpOworICAgICAgICBwYXJlbnRI
YXNGbG9hdHMgPSBwYXJlbnRCbG9jay0+Y29udGFpbnNGbG9hdHMoKTsKKyAgICB9IGVsc2UgeyAg
ICAKKyAgICAgICAgd2hpbGUgKHByZXYgJiYgKHByZXYtPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQo
KSB8fCAhcHJldi0+aXNCb3goKSB8fCAhcHJldi0+aXNSZW5kZXJCbG9jaygpIHx8IHRvUmVuZGVy
QmxvY2socHJldiktPmF2b2lkc0Zsb2F0cygpKSkgeworICAgICAgICAgICAgaWYgKHByZXYtPmlz
RmxvYXRpbmcoKSkKKyAgICAgICAgICAgICAgICBwYXJlbnRIYXNGbG9hdHMgPSB0cnVlOworICAg
ICAgICAgICAgIHByZXYgPSBwcmV2LT5wcmV2aW91c1NpYmxpbmcoKTsKKyAgICAgICAgfQorICAg
ICAgICAKKyAgICAgICAgaWYgKHBhcmVudEhhc0Zsb2F0cykKKyAgICAgICAgICAgIHBhcmVudEJs
b2NrID0gdG9SZW5kZXJCbG9jayhwYXJlbnQoKSk7CiAgICAgfQogCiAgICAgLy8gRmlyc3QgYWRk
IGluIGZsb2F0cyBmcm9tIHRoZSBwYXJlbnQuCiAgICAgaW50IG9mZnNldCA9IHkoKTsKLSAgICBp
ZiAocGFyZW50SGFzRmxvYXRzKSB7Ci0gICAgICAgIFJlbmRlckJsb2NrKiBwYXJlbnRCbG9jayA9
IHRvUmVuZGVyQmxvY2socGFyZW50KCkpOworICAgIGlmIChwYXJlbnRIYXNGbG9hdHMpCiAgICAg
ICAgIGFkZEludHJ1ZGluZ0Zsb2F0cyhwYXJlbnRCbG9jaywgcGFyZW50QmxvY2stPmJvcmRlckxl
ZnQoKSArIHBhcmVudEJsb2NrLT5wYWRkaW5nTGVmdCgpLCBvZmZzZXQpOwotICAgIH0KLSAgICAK
KwogICAgIGludCB4b2Zmc2V0ID0gMDsKICAgICBpZiAocHJldikKICAgICAgICAgb2Zmc2V0IC09
IHRvUmVuZGVyQm94KHByZXYpLT55KCk7CkBAIC00MDUzLDE0ICszOTkyLDE1IEBAIHZvaWQgUmVu
ZGVyQmxvY2s6OmNhbGNJbmxpbmVQcmVmV2lkdGhzKCkKICAgICAgICAgICAgICAgICB9IGVsc2UK
ICAgICAgICAgICAgICAgICAgICAgY2xlYXJQcmV2aW91c0Zsb2F0ID0gZmFsc2U7CiAKLSAgICAg
ICAgICAgICAgICBib29sIGNhbkJyZWFrUmVwbGFjZWRFbGVtZW50ID0gIWNoaWxkLT5pc0ltYWdl
KCkgfHwgYWxsb3dJbWFnZXNUb0JyZWFrOworICAgICAgICAgICAgICAgIGJvb2wgY2FuQnJlYWtS
ZXBsYWNlZEVsZW1lbnQgPSAhY2hpbGQtPmlzSW1hZ2UoKSB8fCBhbGxvd0ltYWdlc1RvQnJlYWsg
fHwgY2hpbGQtPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKTsKICAgICAgICAgICAgICAgICBpZiAo
KGNhbkJyZWFrUmVwbGFjZWRFbGVtZW50ICYmIChhdXRvV3JhcCB8fCBvbGRBdXRvV3JhcCkpIHx8
IGNsZWFyUHJldmlvdXNGbG9hdCkgewogICAgICAgICAgICAgICAgICAgICBtX21pblByZWZXaWR0
aCA9IG1heChpbmxpbmVNaW4sIG1fbWluUHJlZldpZHRoKTsKICAgICAgICAgICAgICAgICAgICAg
aW5saW5lTWluID0gMDsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAvLyBJ
ZiB3ZSdyZSBzdXBwb3NlZCB0byBjbGVhciB0aGUgcHJldmlvdXMgZmxvYXQsIHRoZW4gdGVybWlu
YXRlIG1heHdpZHRoIGFzIHdlbGwuCi0gICAgICAgICAgICAgICAgaWYgKGNsZWFyUHJldmlvdXNG
bG9hdCkgeworICAgICAgICAgICAgICAgIC8vIEFsc28gZG8gdGhpcyBmb3IgYW5vbnltb3VzIGlu
bGluZSBibG9ja3MuCisgICAgICAgICAgICAgICAgaWYgKGNsZWFyUHJldmlvdXNGbG9hdCB8fCBj
aGlsZC0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CiAgICAgICAgICAgICAgICAgICAgIG1f
bWF4UHJlZldpZHRoID0gbWF4KGlubGluZU1heCwgbV9tYXhQcmVmV2lkdGgpOwogICAgICAgICAg
ICAgICAgICAgICBpbmxpbmVNYXggPSAwOwogICAgICAgICAgICAgICAgIH0KQEAgLTQwNjksMTUg
KzQwMDksMTcgQEAgdm9pZCBSZW5kZXJCbG9jazo6Y2FsY0lubGluZVByZWZXaWR0aHMoKQogICAg
ICAgICAgICAgICAgIGludCB0aSA9IDA7CiAgICAgICAgICAgICAgICAgaWYgKCFhZGRlZFRleHRJ
bmRlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgYWRkZWRUZXh0SW5kZW50ID0gdHJ1ZTsKLSAg
ICAgICAgICAgICAgICAgICAgdGkgPSBzdHlsZSgpLT50ZXh0SW5kZW50KCkuY2FsY01pblZhbHVl
KGN3KTsKLSAgICAgICAgICAgICAgICAgICAgY2hpbGRNaW4rPXRpOwotICAgICAgICAgICAgICAg
ICAgICBjaGlsZE1heCs9dGk7CisgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGQtPmlzQW5v
bnltb3VzSW5saW5lQmxvY2soKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGkgPSBzdHls
ZSgpLT50ZXh0SW5kZW50KCkuY2FsY01pblZhbHVlKGN3KTsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGNoaWxkTWluICs9IHRpOworICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRNYXggKz0g
dGk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAg
ICAgICAgICAvLyBBZGQgb3VyIHdpZHRoIHRvIHRoZSBtYXguCiAgICAgICAgICAgICAgICAgaW5s
aW5lTWF4ICs9IGNoaWxkTWF4OwogCi0gICAgICAgICAgICAgICAgaWYgKCFhdXRvV3JhcCB8fCAh
Y2FuQnJlYWtSZXBsYWNlZEVsZW1lbnQpIHsKKyAgICAgICAgICAgICAgICBpZiAoKCFhdXRvV3Jh
cCB8fCAhY2FuQnJlYWtSZXBsYWNlZEVsZW1lbnQpICYmICFjaGlsZC0+aXNBbm9ueW1vdXNJbmxp
bmVCbG9jaygpKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC0+aXNGbG9hdGluZygp
KQogICAgICAgICAgICAgICAgICAgICAgICAgbV9taW5QcmVmV2lkdGggPSBtYXgoY2hpbGRNaW4s
IG1fbWluUHJlZldpZHRoKTsKICAgICAgICAgICAgICAgICAgICAgZWxzZQpAQCAtNDA4OCw2ICs0
MDMwLDEyIEBAIHZvaWQgUmVuZGVyQmxvY2s6OmNhbGNJbmxpbmVQcmVmV2lkdGhzKCkKIAogICAg
ICAgICAgICAgICAgICAgICAvLyBOb3cgc3RhcnQgYSBuZXcgbGluZS4KICAgICAgICAgICAgICAg
ICAgICAgaW5saW5lTWluID0gMDsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAg
ICAgICAgIGlmIChjaGlsZC0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CisgICAgICAgICAg
ICAgICAgICAgICAgICAvLyBUZXJtaW5hdGUgbWF4IHdpZHRoIGFzIHdlbGwuCisgICAgICAgICAg
ICAgICAgICAgICAgICBtX21heFByZWZXaWR0aCA9IG1heChjaGlsZE1heCwgbV9tYXhQcmVmV2lk
dGgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lTWF4ID0gMDsKKyAgICAgICAgICAg
ICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIFdlIGFy
ZSBubyBsb25nZXIgc3RyaXBwaW5nIHdoaXRlc3BhY2UgYXQgdGhlIHN0YXJ0IG9mCkBAIC00MzI0
LDkgKzQyNzIsMTIgQEAgaW50IFJlbmRlckJsb2NrOjpsaW5lSGVpZ2h0KGJvb2wgZmlyc3RMaQog
ICAgIC8vIHRoZSBiYXNlIGNsYXNzLiAgSWYgd2UncmUgYmVpbmcgcXVlcmllZCBhcyB0aG91Z2gg
d2UncmUgdGhlIHJvb3QgbGluZQogICAgIC8vIGJveCwgdGhlbiB0aGUgZmFjdCB0aGF0IHdlJ3Jl
IGFuIGlubGluZS1ibG9jayBpcyBpcnJlbGV2YW50LCBhbmQgd2UgYmVoYXZlCiAgICAgLy8ganVz
dCBsaWtlIGEgYmxvY2suCi0gICAgaWYgKGlzUmVwbGFjZWQoKSAmJiAhaXNSb290TGluZUJveCkK
KyAgICBpZiAoaXNSZXBsYWNlZCgpICYmICFpc1Jvb3RMaW5lQm94KSB7CisgICAgICAgIGlmIChp
c0Fub255bW91c0lubGluZUJsb2NrKCkpCisgICAgICAgICAgICByZXR1cm4gaGVpZ2h0KCk7CiAg
ICAgICAgIHJldHVybiBoZWlnaHQoKSArIG1hcmdpblRvcCgpICsgbWFyZ2luQm90dG9tKCk7Ci0g
ICAgCisgICAgfQorCiAgICAgaWYgKGZpcnN0TGluZSAmJiBkb2N1bWVudCgpLT51c2VzRmlyc3RM
aW5lUnVsZXMoKSkgewogICAgICAgICBSZW5kZXJTdHlsZSogcyA9IHN0eWxlKGZpcnN0TGluZSk7
CiAgICAgICAgIGlmIChzICE9IHN0eWxlKCkpCkBAIC00MzU4LDYgKzQzMDksOCBAQCBpbnQgUmVu
ZGVyQmxvY2s6OmJhc2VsaW5lUG9zaXRpb24oYm9vbCBiCiAgICAgICAgIC8vIFdlIGFsc28gZ2l2
ZSB1cCBvbiBmaW5kaW5nIGEgYmFzZWxpbmUgaWYgd2UgaGF2ZSBhIHZlcnRpY2FsIHNjcm9sbGJh
ciwgb3IgaWYgd2UgYXJlIHNjcm9sbGVkCiAgICAgICAgIC8vIHZlcnRpY2FsbHkgKGUuZy4sIGFu
IG92ZXJmbG93OmhpZGRlbiBibG9jayB0aGF0IGhhcyBoYWQgc2Nyb2xsVG9wIG1vdmVkKSBvciBp
ZiB0aGUgYmFzZWxpbmUgaXMgb3V0c2lkZQogICAgICAgICAvLyBvZiBvdXIgY29udGVudCBib3gu
CisgICAgICAgIGlmIChpc0Fub255bW91c0lubGluZUJsb2NrKCkpCisgICAgICAgICAgICByZXR1
cm4gaGVpZ2h0KCk7CiAgICAgICAgIGludCBiYXNlbGluZVBvcyA9IChsYXllcigpICYmIChsYXll
cigpLT5tYXJxdWVlKCkgfHwgbGF5ZXIoKS0+dmVydGljYWxTY3JvbGxiYXIoKSB8fCBsYXllcigp
LT5zY3JvbGxZT2Zmc2V0KCkgIT0gMCkpID8gLTEgOiBsYXN0TGluZUJveEJhc2VsaW5lKCk7CiAg
ICAgICAgIGlmIChiYXNlbGluZVBvcyAhPSAtMSAmJiBiYXNlbGluZVBvcyA8PSBib3JkZXJUb3Ao
KSArIHBhZGRpbmdUb3AoKSArIGNvbnRlbnRIZWlnaHQoKSkKICAgICAgICAgICAgIHJldHVybiBt
YXJnaW5Ub3AoKSArIGJhc2VsaW5lUG9zOwpAQCAtNDc4Miw2MCArNDczNSw2IEBAIHZvaWQgUmVu
ZGVyQmxvY2s6OnNldE1heEJvdHRvbU1hcmdpbnMoaW4KICAgICBtX21heE1hcmdpbi0+bV9ib3R0
b21OZWcgPSBuZWc7CiB9CiAKLXZvaWQgUmVuZGVyQmxvY2s6OmFic29sdXRlUmVjdHMoVmVjdG9y
PEludFJlY3Q+JiByZWN0cywgaW50IHR4LCBpbnQgdHkpCi17Ci0gICAgLy8gRm9yIGJsb2NrcyBp
bnNpZGUgaW5saW5lcywgd2UgZ28gYWhlYWQgYW5kIGluY2x1ZGUgbWFyZ2lucyBzbyB0aGF0IHdl
IHJ1biByaWdodCB1cCB0byB0aGUKLSAgICAvLyBpbmxpbmUgYm94ZXMgYWJvdmUgYW5kIGJlbG93
IHVzICh0aHVzIGdldHRpbmcgbWVyZ2VkIHdpdGggdGhlbSB0byBmb3JtIGEgc2luZ2xlIGlycmVn
dWxhcgotICAgIC8vIHNoYXBlKS4KLSAgICBpZiAoaW5saW5lQ29udGludWF0aW9uKCkpIHsKLSAg
ICAgICAgcmVjdHMuYXBwZW5kKEludFJlY3QodHgsIHR5IC0gY29sbGFwc2VkTWFyZ2luVG9wKCks
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoKCksIGhlaWdodCgpICsgY29sbGFw
c2VkTWFyZ2luVG9wKCkgKyBjb2xsYXBzZWRNYXJnaW5Cb3R0b20oKSkpOwotICAgICAgICBpbmxp
bmVDb250aW51YXRpb24oKS0+YWJzb2x1dGVSZWN0cyhyZWN0cywKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgdHggLSB4KCkgKyBpbmxpbmVDb250aW51YXRpb24o
KS0+Y29udGFpbmluZ0Jsb2NrKCktPngoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgdHkgLSB5KCkgKyBpbmxpbmVDb250aW51YXRpb24oKS0+Y29udGFpbmlu
Z0Jsb2NrKCktPnkoKSk7Ci0gICAgfSBlbHNlCi0gICAgICAgIHJlY3RzLmFwcGVuZChJbnRSZWN0
KHR4LCB0eSwgd2lkdGgoKSwgaGVpZ2h0KCkpKTsKLX0KLQotdm9pZCBSZW5kZXJCbG9jazo6YWJz
b2x1dGVRdWFkcyhWZWN0b3I8RmxvYXRRdWFkPiYgcXVhZHMpCi17Ci0gICAgLy8gRm9yIGJsb2Nr
cyBpbnNpZGUgaW5saW5lcywgd2UgZ28gYWhlYWQgYW5kIGluY2x1ZGUgbWFyZ2lucyBzbyB0aGF0
IHdlIHJ1biByaWdodCB1cCB0byB0aGUKLSAgICAvLyBpbmxpbmUgYm94ZXMgYWJvdmUgYW5kIGJl
bG93IHVzICh0aHVzIGdldHRpbmcgbWVyZ2VkIHdpdGggdGhlbSB0byBmb3JtIGEgc2luZ2xlIGly
cmVndWxhcgotICAgIC8vIHNoYXBlKS4KLSAgICBpZiAoaW5saW5lQ29udGludWF0aW9uKCkpIHsK
LSAgICAgICAgRmxvYXRSZWN0IGxvY2FsUmVjdCgwLCAtY29sbGFwc2VkTWFyZ2luVG9wKCksCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgoKSwgaGVpZ2h0KCkgKyBjb2xsYXBzZWRN
YXJnaW5Ub3AoKSArIGNvbGxhcHNlZE1hcmdpbkJvdHRvbSgpKTsKLSAgICAgICAgcXVhZHMuYXBw
ZW5kKGxvY2FsVG9BYnNvbHV0ZVF1YWQobG9jYWxSZWN0KSk7Ci0gICAgICAgIGlubGluZUNvbnRp
bnVhdGlvbigpLT5hYnNvbHV0ZVF1YWRzKHF1YWRzKTsKLSAgICB9IGVsc2UKLSAgICAgICAgcXVh
ZHMuYXBwZW5kKFJlbmRlckJveDo6bG9jYWxUb0Fic29sdXRlUXVhZChGbG9hdFJlY3QoMCwgMCwg
d2lkdGgoKSwgaGVpZ2h0KCkpKSk7Ci19Ci0KLUludFJlY3QgUmVuZGVyQmxvY2s6OnJlY3RXaXRo
T3V0bGluZUZvclJlcGFpbnQoUmVuZGVyQm94TW9kZWxPYmplY3QqIHJlcGFpbnRDb250YWluZXIs
IGludCBvdXRsaW5lV2lkdGgpCi17Ci0gICAgSW50UmVjdCByKFJlbmRlckJveDo6cmVjdFdpdGhP
dXRsaW5lRm9yUmVwYWludChyZXBhaW50Q29udGFpbmVyLCBvdXRsaW5lV2lkdGgpKTsKLSAgICBp
ZiAoaW5saW5lQ29udGludWF0aW9uKCkpCi0gICAgICAgIHIuaW5mbGF0ZVkoY29sbGFwc2VkTWFy
Z2luVG9wKCkpOwotICAgIHJldHVybiByOwotfQotCi1SZW5kZXJPYmplY3QqIFJlbmRlckJsb2Nr
Ojpob3ZlckFuY2VzdG9yKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaW5saW5lQ29udGludWF0aW9u
KCkgPyBpbmxpbmVDb250aW51YXRpb24oKSA6IFJlbmRlckJveDo6aG92ZXJBbmNlc3RvcigpOwot
fQotCi12b2lkIFJlbmRlckJsb2NrOjp1cGRhdGVEcmFnU3RhdGUoYm9vbCBkcmFnT24pCi17Ci0g
ICAgUmVuZGVyQm94Ojp1cGRhdGVEcmFnU3RhdGUoZHJhZ09uKTsKLSAgICBpZiAoaW5saW5lQ29u
dGludWF0aW9uKCkpCi0gICAgICAgIGlubGluZUNvbnRpbnVhdGlvbigpLT51cGRhdGVEcmFnU3Rh
dGUoZHJhZ09uKTsKLX0KLQotUmVuZGVyU3R5bGUqIFJlbmRlckJsb2NrOjpvdXRsaW5lU3R5bGVG
b3JSZXBhaW50KCkgY29uc3QKLXsKLSAgICByZXR1cm4gaW5saW5lQ29udGludWF0aW9uKCkgPyBp
bmxpbmVDb250aW51YXRpb24oKS0+c3R5bGUoKSA6IHN0eWxlKCk7Ci19Ci0KIHZvaWQgUmVuZGVy
QmxvY2s6OmNoaWxkQmVjYW1lTm9uSW5saW5lKFJlbmRlck9iamVjdCopCiB7CiAgICAgbWFrZUNo
aWxkcmVuTm9uSW5saW5lKCk7CkBAIC00ODQ0LDI2ICs0NzQzLDYgQEAgdm9pZCBSZW5kZXJCbG9j
azo6Y2hpbGRCZWNhbWVOb25JbmxpbmUoUgogICAgIC8vIHx0aGlzfCBtYXkgYmUgZGVhZCBoZXJl
CiB9CiAKLXZvaWQgUmVuZGVyQmxvY2s6OnVwZGF0ZUhpdFRlc3RSZXN1bHQoSGl0VGVzdFJlc3Vs
dCYgcmVzdWx0LCBjb25zdCBJbnRQb2ludCYgcG9pbnQpCi17Ci0gICAgaWYgKHJlc3VsdC5pbm5l
ck5vZGUoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgTm9kZSogbiA9IG5vZGUoKTsKLSAgICBp
ZiAoaW5saW5lQ29udGludWF0aW9uKCkpCi0gICAgICAgIC8vIFdlIGFyZSBpbiB0aGUgbWFyZ2lu
cyBvZiBibG9jayBlbGVtZW50cyB0aGF0IGFyZSBwYXJ0IG9mIGEgY29udGludWF0aW9uLiAgSW4K
LSAgICAgICAgLy8gdGhpcyBjYXNlIHdlJ3JlIGFjdHVhbGx5IHN0aWxsIGluc2lkZSB0aGUgZW5j
bG9zaW5nIGlubGluZSBlbGVtZW50IHRoYXQgd2FzCi0gICAgICAgIC8vIHNwbGl0LiAgR28gYWhl
YWQgYW5kIHNldCBvdXIgaW5uZXIgbm9kZSBhY2NvcmRpbmdseS4KLSAgICAgICAgbiA9IGlubGlu
ZUNvbnRpbnVhdGlvbigpLT5ub2RlKCk7Ci0KLSAgICBpZiAobikgewotICAgICAgICByZXN1bHQu
c2V0SW5uZXJOb2RlKG4pOwotICAgICAgICBpZiAoIXJlc3VsdC5pbm5lck5vblNoYXJlZE5vZGUo
KSkKLSAgICAgICAgICAgIHJlc3VsdC5zZXRJbm5lck5vblNoYXJlZE5vZGUobik7Ci0gICAgICAg
IHJlc3VsdC5zZXRMb2NhbFBvaW50KHBvaW50KTsKLSAgICB9Ci19Ci0KIEludFJlY3QgUmVuZGVy
QmxvY2s6OmxvY2FsQ2FyZXRSZWN0KElubGluZUJveCogaW5saW5lQm94LCBpbnQgY2FyZXRPZmZz
ZXQsIGludCogZXh0cmFXaWR0aFRvRW5kT2ZMaW5lKQogewogICAgIC8vIERvIHRoZSBub3JtYWwg
Y2FsY3VsYXRpb24gaW4gbW9zdCBjYXNlcy4KQEAgLTQ5NDcsMTcgKzQ4MjYsNyBAQCB2b2lkIFJl
bmRlckJsb2NrOjphZGRGb2N1c1JpbmdSZWN0cyhHcmFwCiAgICAgLy8gRm9yIGJsb2NrcyBpbnNp
ZGUgaW5saW5lcywgd2UgZ28gYWhlYWQgYW5kIGluY2x1ZGUgbWFyZ2lucyBzbyB0aGF0IHdlIHJ1
biByaWdodCB1cCB0byB0aGUKICAgICAvLyBpbmxpbmUgYm94ZXMgYWJvdmUgYW5kIGJlbG93IHVz
ICh0aHVzIGdldHRpbmcgbWVyZ2VkIHdpdGggdGhlbSB0byBmb3JtIGEgc2luZ2xlIGlycmVndWxh
cgogICAgIC8vIHNoYXBlKS4KLSAgICBpZiAoaW5saW5lQ29udGludWF0aW9uKCkpIHsKLSAgICAg
ICAgLy8gRklYTUU6IFRoaXMgY2hlY2sgcmVhbGx5IGlzbid0IGFjY3VyYXRlLiAKLSAgICAgICAg
Ym9vbCBuZXh0SW5saW5lSGFzTGluZUJveCA9IGlubGluZUNvbnRpbnVhdGlvbigpLT5maXJzdExp
bmVCb3goKTsKLSAgICAgICAgLy8gRklYTUU6IFRoaXMgaXMgd3JvbmcuIFRoZSBwcmluY2lwYWwg
cmVuZGVyZXIgbWF5IG5vdCBiZSB0aGUgY29udGludWF0aW9uIHByZWNlZGluZyB0aGlzIGJsb2Nr
LgotICAgICAgICBib29sIHByZXZJbmxpbmVIYXNMaW5lQm94ID0gdG9SZW5kZXJJbmxpbmUoaW5s
aW5lQ29udGludWF0aW9uKCktPm5vZGUoKS0+cmVuZGVyZXIoKSktPmZpcnN0TGluZUJveCgpOyAK
LSAgICAgICAgaW50IHRvcE1hcmdpbiA9IHByZXZJbmxpbmVIYXNMaW5lQm94ID8gY29sbGFwc2Vk
TWFyZ2luVG9wKCkgOiAwOwotICAgICAgICBpbnQgYm90dG9tTWFyZ2luID0gbmV4dElubGluZUhh
c0xpbmVCb3ggPyBjb2xsYXBzZWRNYXJnaW5Cb3R0b20oKSA6IDA7Ci0gICAgICAgIGdyYXBoaWNz
Q29udGV4dC0+YWRkRm9jdXNSaW5nUmVjdChJbnRSZWN0KHR4LCB0eSAtIHRvcE1hcmdpbiwgCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoKCks
IGhlaWdodCgpICsgdG9wTWFyZ2luICsgYm90dG9tTWFyZ2luKSk7Ci0gICAgfSBlbHNlCi0gICAg
ICAgIGdyYXBoaWNzQ29udGV4dC0+YWRkRm9jdXNSaW5nUmVjdChJbnRSZWN0KHR4LCB0eSwgd2lk
dGgoKSwgaGVpZ2h0KCkpKTsKKyAgICBncmFwaGljc0NvbnRleHQtPmFkZEZvY3VzUmluZ1JlY3Qo
SW50UmVjdCh0eCwgdHksIHdpZHRoKCksIGhlaWdodCgpKSk7CiAKICAgICBpZiAoIWhhc092ZXJm
bG93Q2xpcCgpICYmICFoYXNDb250cm9sQ2xpcCgpKSB7CiAgICAgICAgIGZvciAoUm9vdElubGlu
ZUJveCogY3VyciA9IGZpcnN0Um9vdEJveCgpOyBjdXJyOyBjdXJyID0gY3Vyci0+bmV4dFJvb3RC
b3goKSkgewpAQCAtNDk3OSwxMSArNDg0OCw2IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmFkZEZvY3Vz
UmluZ1JlY3RzKEdyYXAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLQotICAgIGlm
IChpbmxpbmVDb250aW51YXRpb24oKSkKLSAgICAgICAgaW5saW5lQ29udGludWF0aW9uKCktPmFk
ZEZvY3VzUmluZ1JlY3RzKGdyYXBoaWNzQ29udGV4dCwgCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB0eCAtIHgoKSArIGlubGluZUNvbnRpbnVhdGlvbigp
LT5jb250YWluaW5nQmxvY2soKS0+eCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgdHkgLSB5KCkgKyBpbmxpbmVDb250aW51YXRpb24oKS0+Y29udGFp
bmluZ0Jsb2NrKCktPnkoKSk7CiB9CiAKIFJlbmRlckJsb2NrKiBSZW5kZXJCbG9jazo6Y3JlYXRl
QW5vbnltb3VzQmxvY2soYm9vbCBpc0ZsZXhpYmxlQm94KSBjb25zdApAQCAtNTAxNSw2ICs0ODc5
LDggQEAgY29uc3QgY2hhciogUmVuZGVyQmxvY2s6OnJlbmRlck5hbWUoKSBjbwogICAgICAgICBy
ZXR1cm4gIlJlbmRlckJsb2NrIChwb3NpdGlvbmVkKSI7CiAgICAgaWYgKGlzQW5vbnltb3VzQmxv
Y2soKSkKICAgICAgICAgcmV0dXJuICJSZW5kZXJCbG9jayAoYW5vbnltb3VzKSI7CisgICAgZWxz
ZSBpZiAoaXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKQorICAgICAgICByZXR1cm4gIlJlbmRlckJs
b2NrIChhbm9ueW1vdXMgaW5saW5lLWJsb2NrKSI7CiAgICAgZWxzZSBpZiAoaXNBbm9ueW1vdXMo
KSkKICAgICAgICAgcmV0dXJuICJSZW5kZXJCbG9jayAoZ2VuZXJhdGVkKSI7CiAgICAgaWYgKGlz
UmVsUG9zaXRpb25lZCgpKQpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5oCShyZXZpc2lvbiA0
NzU5NSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmgJKHdvcmtpbmcgY29weSkK
QEAgLTEzMCwxMSArMTMwLDYgQEAgcHVibGljOgogCiAgICAgdm9pZCBhZGp1c3RSZWN0Rm9yQ29s
dW1ucyhJbnRSZWN0JikgY29uc3Q7CiAKLSAgICB2b2lkIGFkZENvbnRpbnVhdGlvbldpdGhPdXRs
aW5lKFJlbmRlcklubGluZSopOwotCi0gICAgUmVuZGVySW5saW5lKiBpbmxpbmVDb250aW51YXRp
b24oKSBjb25zdCB7IHJldHVybiBtX2lubGluZUNvbnRpbnVhdGlvbjsgfQotICAgIHZvaWQgc2V0
SW5saW5lQ29udGludWF0aW9uKFJlbmRlcklubGluZSogYykgeyBtX2lubGluZUNvbnRpbnVhdGlv
biA9IGM7IH0KLQogICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgYSBjb252ZW5pZW5jZSBoZWxwZXIg
Zm9yIGNyZWF0aW5nIGFuIGFub255bW91cyBibG9jayB0aGF0IGluaGVyaXRzIGl0cwogICAgIC8v
IHN0eWxlIGZyb20gdGhpcyBSZW5kZXJCbG9jay4KICAgICBSZW5kZXJCbG9jayogY3JlYXRlQW5v
bnltb3VzQmxvY2soYm9vbCBpc0ZsZXhpYmxlQm94ID0gZmFsc2UpIGNvbnN0OwpAQCAtMTc2LDgg
KzE3MSw2IEBAIHByb3RlY3RlZDoKIAogICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVGaXJzdExldHRl
cigpOwogCi0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZUhpdFRlc3RSZXN1bHQoSGl0VGVzdFJlc3Vs
dCYsIGNvbnN0IEludFBvaW50Jik7Ci0KICAgICAvLyBEZWxheSB1cGRhdGUgc2Nyb2xsYmFyIHVu
dGlsIGZpbmlzaERlbGF5UmVwYWludCgpIHdpbGwgYmUKICAgICAvLyBjYWxsZWQuIFRoaXMgZnVu
Y3Rpb24gaXMgdXNlZCB3aGVuIGEgZmxleGJveCBpcyBsYXlpbmcgb3V0IGl0cwogICAgIC8vIGRl
c2NlbmRhbnQuIElmIG11bHRpcGxlIGNhbGxzIGFyZSBtYWRlIHRvIHN0YXJ0RGVsYXlSZXBhaW50
KCksCkBAIC0yNDEsNyArMjM0LDkgQEAgcHJpdmF0ZToKICAgICAgICAgYm9vbCBldmVySGFkTGF5
b3V0OwogICAgIH07CiAKLSAgICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucycgaW1wbGVtZW50
YXRpb25zIGFyZSBpbiBSZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwLgorICAgIGNsYXNzIE1hcmdp
bkluZm87CisKKyAgICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucycgaW1wbGVtZW50YXRpb25z
IGFyZSBpbiBSZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwLiAgICAKICAgICB2b2lkIGJpZGlSZW9y
ZGVyTGluZShJbmxpbmVCaWRpUmVzb2x2ZXImLCBjb25zdCBJbmxpbmVJdGVyYXRvciYgZW5kLCBi
b29sIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSk7CiAgICAgUm9vdElubGluZUJveCogZGV0ZXJt
aW5lU3RhcnRQb3NpdGlvbihib29sJiBmaXJzdExpbmUsIGJvb2wmIGZ1bGxMYXlvdXQsIGJvb2wm
IHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIElubGluZUJpZGlSZXNvbHZlciYsIFZlY3RvcjxGbG9hdFdpdGhSZWN0PiYg
ZmxvYXRzLCB1bnNpZ25lZCYgbnVtQ2xlYW5GbG9hdHMpOwpAQCAtMjU0LDcgKzI0OSw3IEBAIHBy
aXZhdGU6CiAgICAgdm9pZCBza2lwVHJhaWxpbmdXaGl0ZXNwYWNlKElubGluZUl0ZXJhdG9yJiwg
Ym9vbCBpc0xpbmVFbXB0eSwgYm9vbCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHkpOwogICAgIGlu
dCBza2lwTGVhZGluZ1doaXRlc3BhY2UoSW5saW5lQmlkaVJlc29sdmVyJiwgYm9vbCBmaXJzdExp
bmUsIGJvb2wgaXNMaW5lRW1wdHksIGJvb2wgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KTsKICAg
ICB2b2lkIGZpdEJlbG93RmxvYXRzKGludCB3aWR0aFRvRml0LCBib29sIGZpcnN0TGluZSwgaW50
JiBhdmFpbGFibGVXaWR0aCk7Ci0gICAgSW5saW5lSXRlcmF0b3IgZmluZE5leHRMaW5lQnJlYWso
SW5saW5lQmlkaVJlc29sdmVyJiwgYm9vbCBmaXJzdExpbmUsIGJvb2wmIGlzTGluZUVtcHR5LCBi
b29sJiBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHksIEVDbGVhciogY2xlYXIgPSAwKTsKKyAgICBJ
bmxpbmVJdGVyYXRvciBmaW5kTmV4dExpbmVCcmVhayhJbmxpbmVCaWRpUmVzb2x2ZXImLCBib29s
IGZpcnN0TGluZSwgYm9vbCYgaXNMaW5lRW1wdHksIGJvb2wmIHByZXZpb3VzTGluZUJyb2tlQ2xl
YW5seSwgTWFyZ2luSW5mbyYsIEVDbGVhciogY2xlYXIgPSAwKTsKICAgICBSb290SW5saW5lQm94
KiBjb25zdHJ1Y3RMaW5lKHVuc2lnbmVkIHJ1bkNvdW50LCBCaWRpUnVuKiBmaXJzdFJ1biwgQmlk
aVJ1biogbGFzdFJ1biwgYm9vbCBmaXJzdExpbmUsIGJvb2wgbGFzdExpbmUsIFJlbmRlck9iamVj
dCogZW5kT2JqZWN0KTsKICAgICBJbmxpbmVGbG93Qm94KiBjcmVhdGVMaW5lQm94ZXMoUmVuZGVy
T2JqZWN0KiwgYm9vbCBmaXJzdExpbmUpOwogICAgIHZvaWQgY29tcHV0ZUhvcml6b250YWxQb3Np
dGlvbnNGb3JMaW5lKFJvb3RJbmxpbmVCb3gqLCBib29sIGZpcnN0TGluZSwgQmlkaVJ1biogZmly
c3RSdW4sIEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4sIGJvb2wgcmVhY2hlZEVuZCk7CkBAIC0z
MTAsMTIgKzMwNSw3IEBAIHByaXZhdGU6CiAgICAgLy8gY2hpbGRyZW4uCiAgICAgdmlydHVhbCBS
ZW5kZXJCbG9jayogZmlyc3RMaW5lQmxvY2soKSBjb25zdDsKICAgICBib29sIGluUm9vdEJsb2Nr
Q29udGV4dCgpIGNvbnN0OwotCi0gICAgdmlydHVhbCBJbnRSZWN0IHJlY3RXaXRoT3V0bGluZUZv
clJlcGFpbnQoUmVuZGVyQm94TW9kZWxPYmplY3QqIHJlcGFpbnRDb250YWluZXIsIGludCBvdXRs
aW5lV2lkdGgpOwotICAgIHZpcnR1YWwgUmVuZGVyU3R5bGUqIG91dGxpbmVTdHlsZUZvclJlcGFp
bnQoKSBjb25zdDsKICAgICAKLSAgICB2aXJ0dWFsIFJlbmRlck9iamVjdCogaG92ZXJBbmNlc3Rv
cigpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVEcmFnU3RhdGUoYm9vbCBkcmFnT24p
OwogICAgIHZpcnR1YWwgdm9pZCBjaGlsZEJlY2FtZU5vbklubGluZShSZW5kZXJPYmplY3QqIGNo
aWxkKTsKIAogICAgIHZpcnR1YWwgSW50UmVjdCBzZWxlY3Rpb25SZWN0Rm9yUmVwYWludChSZW5k
ZXJCb3hNb2RlbE9iamVjdCogcmVwYWludENvbnRhaW5lciwgYm9vbCAvKmNsaXBUb1Zpc2libGVD
b250ZW50Ki8pCkBAIC0zMzUsMTYgKzMyNSwxMSBAQCBwcml2YXRlOgogICAgIGludCBsZWZ0U2Vs
ZWN0aW9uT2Zmc2V0KFJlbmRlckJsb2NrKiByb290QmxvY2ssIGludCB5KTsKICAgICBpbnQgcmln
aHRTZWxlY3Rpb25PZmZzZXQoUmVuZGVyQmxvY2sqIHJvb3RCbG9jaywgaW50IHkpOwogCi0gICAg
dmlydHVhbCB2b2lkIGFic29sdXRlUmVjdHMoVmVjdG9yPEludFJlY3Q+JiwgaW50IHR4LCBpbnQg
dHkpOwotICAgIHZpcnR1YWwgdm9pZCBhYnNvbHV0ZVF1YWRzKFZlY3RvcjxGbG9hdFF1YWQ+Jik7
Ci0KICAgICBpbnQgZGVzaXJlZENvbHVtbldpZHRoKCkgY29uc3Q7CiAgICAgdW5zaWduZWQgZGVz
aXJlZENvbHVtbkNvdW50KCkgY29uc3Q7CiAgICAgVmVjdG9yPEludFJlY3Q+KiBjb2x1bW5SZWN0
cygpIGNvbnN0OwogICAgIHZvaWQgc2V0RGVzaXJlZENvbHVtbkNvdW50QW5kV2lkdGgoaW50IGNv
dW50LCBpbnQgd2lkdGgpOwogICAgIGludCBjb2x1bW5HYXAoKSBjb25zdDsKLSAgICAKLSAgICB2
b2lkIHBhaW50Q29udGludWF0aW9uT3V0bGluZXMoUGFpbnRJbmZvJiwgaW50IHR4LCBpbnQgdHkp
OwogCiAgICAgdmlydHVhbCBJbnRSZWN0IGxvY2FsQ2FyZXRSZWN0KElubGluZUJveCosIGludCBj
YXJldE9mZnNldCwgaW50KiBleHRyYVdpZHRoVG9FbmRPZkxpbmUgPSAwKTsKIApAQCAtNDg2LDEy
ICs0NzEsNiBAQCBwcml2YXRlOgogICAgIERlcHJlY2F0ZWRQdHJMaXN0PEZsb2F0aW5nT2JqZWN0
PiogbV9mbG9hdGluZ09iamVjdHM7CiAgICAgTGlzdEhhc2hTZXQ8UmVuZGVyQm94Kj4qIG1fcG9z
aXRpb25lZE9iamVjdHM7CiAKLSAgICAvLyBBbiBpbmxpbmUgY2FuIGJlIHNwbGl0IHdpdGggYmxv
Y2tzIG9jY3VycmluZyBpbiBiZXR3ZWVuIHRoZSBpbmxpbmUgY29udGVudC4KLSAgICAvLyBXaGVu
IHRoaXMgb2NjdXJzIHdlIG5lZWQgYSBwb2ludGVyIHRvIG91ciBuZXh0IG9iamVjdC4gIFdlIGNh
biBiYXNpY2FsbHkgYmUKLSAgICAvLyBzcGxpdCBpbnRvIGEgc2VxdWVuY2Ugb2YgaW5saW5lcyBh
bmQgYmxvY2tzLiAgVGhlIGNvbnRpbnVhdGlvbiB3aWxsIGVpdGhlciBiZQotICAgIC8vIGFuIGFu
b255bW91cyBibG9jayAodGhhdCBob3VzZXMgb3RoZXIgYmxvY2tzKSBvciBpdCB3aWxsIGJlIGFu
IGlubGluZSBmbG93LgotICAgIFJlbmRlcklubGluZSogbV9pbmxpbmVDb250aW51YXRpb247Ci0K
ICAgICAvLyBBbGxvY2F0ZWQgb25seSB3aGVuIHNvbWUgb2YgdGhlc2UgZmllbGRzIGhhdmUgbm9u
LWRlZmF1bHQgdmFsdWVzCiAgICAgc3RydWN0IE1heE1hcmdpbiB7CiAgICAgICAgIE1heE1hcmdp
bihjb25zdCBSZW5kZXJCbG9jayogbykgCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJC
bG9ja0xpbmVMYXlvdXQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRl
ckJsb2NrTGluZUxheW91dC5jcHAJKHJldmlzaW9uIDQ3NTkxKQorKysgV2ViQ29yZS9yZW5kZXJp
bmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTcwLDEyICs1
NzAsMTYgQEAgUm9vdElubGluZUJveCogUmVuZGVyQmxvY2s6OmNvbnN0cnVjdExpbgogICAgICAg
ICBpZiAoIWJveCkKICAgICAgICAgICAgIGNvbnRpbnVlOwogCisgICAgICAgIC8vIEFub255bW91
cyBpbmxpbmUgYmxvY2tzICh1c2VkIHRvIGhvbGQgYmxvY2tzIGluc2lkZSBpbmxpbmVzKSBkb24n
dCBuZWVkIHRvIHdhc3RlIHRpbWUgd3JhcHBpbmcKKyAgICAgICAgLy8gdGhlbXNlbHZlcyBpbiB0
aG9zZSBpbmxpbmVzIChzaW5jZSB3ZSB3YW50IHRvIHByZXRlbmQgbGlrZSB0aGV5IGRvbid0IGV4
aXN0IG9uIHRoaXMgZmFrZSBsaW5lKS4KKyAgICAgICAgUmVuZGVyT2JqZWN0KiBhbmNlc3RvclJl
bmRlcmVyID0gci0+bV9vYmplY3QtPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSA/IHRoaXMgOiBy
LT5tX29iamVjdC0+cGFyZW50KCk7CisgCiAgICAgICAgIC8vIElmIHdlIGhhdmUgbm8gcGFyZW50
IGJveCB5ZXQsIG9yIGlmIHRoZSBydW4gaXMgbm90IHNpbXBseSBhIHNpYmxpbmcsCiAgICAgICAg
IC8vIHRoZW4gd2UgbmVlZCB0byBjb25zdHJ1Y3QgaW5saW5lIGJveGVzIGFzIG5lY2Vzc2FyeSB0
byBwcm9wZXJseSBlbmNsb3NlIHRoZQogICAgICAgICAvLyBydW4ncyBpbmxpbmUgYm94LgotICAg
ICAgICBpZiAoIXBhcmVudEJveCB8fCBwYXJlbnRCb3gtPnJlbmRlcmVyKCkgIT0gci0+bV9vYmpl
Y3QtPnBhcmVudCgpKQorICAgICAgICBpZiAoIXBhcmVudEJveCB8fCBwYXJlbnRCb3gtPnJlbmRl
cmVyKCkgIT0gYW5jZXN0b3JSZW5kZXJlcikKICAgICAgICAgICAgIC8vIENyZWF0ZSBuZXcgaW5s
aW5lIGJveGVzIGFsbCB0aGUgd2F5IGJhY2sgdG8gdGhlIGFwcHJvcHJpYXRlIGluc2VydGlvbiBw
b2ludC4KLSAgICAgICAgICAgIHBhcmVudEJveCA9IGNyZWF0ZUxpbmVCb3hlcyhyLT5tX29iamVj
dC0+cGFyZW50KCksIGZpcnN0TGluZSk7CisgICAgICAgICAgICBwYXJlbnRCb3ggPSBjcmVhdGVM
aW5lQm94ZXMoYW5jZXN0b3JSZW5kZXJlciwgZmlyc3RMaW5lKTsKIAogICAgICAgICAvLyBBcHBl
bmQgdGhlIGlubGluZSBib3ggdG8gdGhpcyBsaW5lLgogICAgICAgICBwYXJlbnRCb3gtPmFkZFRv
TGluZShib3gpOwpAQCAtNjE3LDYgKzYyMSw4IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmNvbXB1dGVI
b3Jpem9udGFsUG9zaXQKICAgICB1bnNpZ25lZCBudW1TcGFjZXMgPSAwOwogICAgIEVUZXh0QWxp
Z24gdGV4dEFsaWduID0gc3R5bGUoKS0+dGV4dEFsaWduKCk7CiAKKyAgICBpbnQgeCA9IGxlZnRP
ZmZzZXQoaGVpZ2h0KCksIGZpcnN0TGluZSk7CisKICAgICBmb3IgKEJpZGlSdW4qIHIgPSBmaXJz
dFJ1bjsgcjsgciA9IHItPm5leHQoKSkgewogICAgICAgICBpZiAoIXItPm1fYm94IHx8IHItPm1f
b2JqZWN0LT5pc1Bvc2l0aW9uZWQoKSB8fCByLT5tX2JveC0+aXNMaW5lQnJlYWsoKSkKICAgICAg
ICAgICAgIGNvbnRpbnVlOyAvLyBQb3NpdGlvbmVkIG9iamVjdHMgYXJlIG9ubHkgcGFydGljaXBh
dGluZyB0byBmaWd1cmUgb3V0IHRoZWlyCkBAIC02NTQsNiArNjYwLDEyIEBAIHZvaWQgUmVuZGVy
QmxvY2s6OmNvbXB1dGVIb3Jpem9udGFsUG9zaXQKICAgICAgICAgICAgIHJlbmRlckJveC0+Y2Fs
Y1dpZHRoKCk7CiAgICAgICAgICAgICByLT5tX2JveC0+c2V0V2lkdGgocmVuZGVyQm94LT53aWR0
aCgpKTsKICAgICAgICAgICAgIHRvdFdpZHRoICs9IHJlbmRlckJveC0+bWFyZ2luTGVmdCgpICsg
cmVuZGVyQm94LT5tYXJnaW5SaWdodCgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAo
ci0+bV9vYmplY3QtPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkgeworICAgICAgICAgICAgICAg
IC8vIEFsbG93IHRoZSBmdWxsIGF2YWlsYWJsZSB3aWR0aCB0byBiZSB1c2VkLCBzaW5jZSBmbG9h
dHMgd2lsbCBpbnRydWRlIGludG8gb3VyIHNwYWNlLgorICAgICAgICAgICAgICAgIGF2YWlsYWJs
ZVdpZHRoID0gcmlnaHRPZmZzZXQoKSAtIGxlZnRPZmZzZXQoKTsKKyAgICAgICAgICAgICAgICB4
ID0gbGVmdE9mZnNldCgpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgdG90
V2lkdGggKz0gci0+bV9ib3gtPndpZHRoKCk7CkBAIC02NjMsNyArNjc1LDYgQEAgdm9pZCBSZW5k
ZXJCbG9jazo6Y29tcHV0ZUhvcml6b250YWxQb3NpdAogICAgIC8vIHdlIG5vdyBleGFtaW5lIG91
ciB0ZXh0LWFsaWduIHByb3BlcnR5IGluIG9yZGVyIHRvIGRldGVybWluZSB3aGVyZSB0byBwb3Np
dGlvbiB0aGUKICAgICAvLyBvYmplY3RzIGhvcml6b250YWxseS4gIFRoZSB0b3RhbCB3aWR0aCBv
ZiB0aGUgbGluZSBjYW4gYmUgaW5jcmVhc2VkIGlmIHdlIGVuZCB1cAogICAgIC8vIGp1c3RpZnlp
bmcgdGV4dC4KLSAgICBpbnQgeCA9IGxlZnRPZmZzZXQoaGVpZ2h0KCksIGZpcnN0TGluZSk7CiAg
ICAgc3dpdGNoICh0ZXh0QWxpZ24pIHsKICAgICAgICAgY2FzZSBMRUZUOgogICAgICAgICBjYXNl
IFdFQktJVF9MRUZUOgpAQCAtODE3LDkgKzgyOCwxNSBAQCB2b2lkIFJlbmRlckJsb2NrOjpsYXlv
dXRJbmxpbmVDaGlsZHJlbihiCiAgICAgYm9vbCB1c2VSZXBhaW50Qm91bmRzID0gZmFsc2U7CiAg
ICAgCiAgICAgbV9vdmVyZmxvdy5jbGVhcigpOwotICAgICAgICAKLSAgICBzZXRIZWlnaHQoYm9y
ZGVyVG9wKCkgKyBwYWRkaW5nVG9wKCkpOwotICAgIGludCB0b0FkZCA9IGJvcmRlckJvdHRvbSgp
ICsgcGFkZGluZ0JvdHRvbSgpICsgaG9yaXpvbnRhbFNjcm9sbGJhckhlaWdodCgpOworICAgIAor
ICAgIGludCB0b3AgPSBib3JkZXJUb3AoKSArIHBhZGRpbmdUb3AoKTsKKyAgICBpbnQgYm90dG9t
ID0gYm9yZGVyQm90dG9tKCkgKyBwYWRkaW5nQm90dG9tKCkgKyBob3Jpem9udGFsU2Nyb2xsYmFy
SGVpZ2h0KCk7CisKKyAgICBzZXRIZWlnaHQodG9wKTsKKworICAgIC8vIFRoZSBtYXJnaW4gc3Ry
dWN0IGNhY2hlcyBhbGwgb3VyIGN1cnJlbnQgbWFyZ2luIGNvbGxhcHNpbmcgc3RhdGUuIFdlIHJ1
biBtYXJnaW4gY29sbGFwc2luZyB3aGVuIHdlIGVuY291bnRlciBhbm9ueW1vdXMgaW5saW5lIGJs
b2NrcyB0aGF0IGFyZSBiZWluZyB1c2VkCisgICAgLy8gZm9yIHRoZSBibG9ja3MtaW5zaWRlLWlu
bGluZXMgY2FzZSAoYW5kIHRoZSBpbmxpbmVzIGFyZSBlbXB0eSksIGUuZywgPHNwYW4+PGRpdj5P
bmU8L2Rpdj48L3NwYW4+LgorICAgIE1hcmdpbkluZm8gbWFyZ2luSW5mbyh0aGlzLCB0b3AsIGJv
dHRvbSk7CiAKICAgICAvLyBGaWd1cmUgb3V0IGlmIHdlIHNob3VsZCBjbGVhciBvdXQgb3VyIGxp
bmUgYm94ZXMuCiAgICAgLy8gRklYTUU6IEhhbmRsZSByZXNpemUgZXZlbnR1YWxseSEKQEAgLTg0
NywxMiArODY0LDE1IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmxheW91dElubGluZUNoaWxkcmVuKGIK
ICAgICAgICAgICAgIGlmIChvLT5pc1JlcGxhY2VkKCkgfHwgby0+aXNGbG9hdGluZygpIHx8IG8t
PmlzUG9zaXRpb25lZCgpKSB7CiAgICAgICAgICAgICAgICAgUmVuZGVyQm94KiBib3ggPSB0b1Jl
bmRlckJveChvKTsKICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVsYXlv
dXRDaGlsZHJlbiB8fCBvLT5zdHlsZSgpLT53aWR0aCgpLmlzUGVyY2VudCgpIHx8IG8tPnN0eWxl
KCktPmhlaWdodCgpLmlzUGVyY2VudCgpKQotICAgICAgICAgICAgICAgICAgICBvLT5zZXRDaGls
ZE5lZWRzTGF5b3V0KHRydWUsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgCisgICAgICAg
ICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGxheW91dCBjaGlsZHJlbiBpZiB0aGV5IG5lZWQgaXQu
CisgICAgICAgICAgICAgICAgLy8gRklYTUU6IFRlY2huaWNhbGx5IHBlcmNlbnRhZ2UgaGVpZ2h0
IG9iamVjdHMgb25seSBuZWVkIGEgcmVsYXlvdXQgaWYgdGhlaXIgcGVyY2VudGFnZSBpc24ndCBn
b2luZyB0byBiZSB0dXJuZWQgaW50bworICAgICAgICAgICAgICAgIC8vIGFuIGF1dG8gdmFsdWUu
ICBBZGQgYSBtZXRob2QgdG8gZGV0ZXJtaW5lIHRoaXMsIHNvIHRoYXQgd2UgY2FuIGF2b2lkIHRo
ZSByZWxheW91dC4KKyAgICAgICAgICAgICAgICBpZiAocmVsYXlvdXRDaGlsZHJlbiB8fCAoKGJv
eC0+c3R5bGUoKS0+aGVpZ2h0KCkuaXNQZXJjZW50KCkgfHwgYm94LT5zdHlsZSgpLT5taW5IZWln
aHQoKS5pc1BlcmNlbnQoKSB8fCBib3gtPnN0eWxlKCktPm1heEhlaWdodCgpLmlzUGVyY2VudCgp
KSkpCisgICAgICAgICAgICAgICAgICAgIGJveC0+c2V0Q2hpbGROZWVkc0xheW91dCh0cnVlLCBm
YWxzZSk7CisKICAgICAgICAgICAgICAgICAvLyBJZiByZWxheW91dENoaWxkcmVuIGlzIHNldCBh
bmQgd2UgaGF2ZSBwZXJjZW50YWdlIHBhZGRpbmcsIHdlIGFsc28gbmVlZCB0byBpbnZhbGlkYXRl
IHRoZSBjaGlsZCdzIHByZWYgd2lkdGhzLgotICAgICAgICAgICAgICAgIGlmIChyZWxheW91dENo
aWxkcmVuICYmIChvLT5zdHlsZSgpLT5wYWRkaW5nTGVmdCgpLmlzUGVyY2VudCgpIHx8IG8tPnN0
eWxlKCktPnBhZGRpbmdSaWdodCgpLmlzUGVyY2VudCgpKSkKLSAgICAgICAgICAgICAgICAgICAg
by0+c2V0UHJlZldpZHRoc0RpcnR5KHRydWUsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBpZiAo
cmVsYXlvdXRDaGlsZHJlbiAmJiAoYm94LT5zdHlsZSgpLT5wYWRkaW5nTGVmdCgpLmlzUGVyY2Vu
dCgpIHx8IGJveC0+c3R5bGUoKS0+cGFkZGluZ1JpZ2h0KCkuaXNQZXJjZW50KCkpKQorICAgICAg
ICAgICAgICAgICAgICBib3gtPnNldFByZWZXaWR0aHNEaXJ0eSh0cnVlLCBmYWxzZSk7CiAgICAg
ICAgICAgICAKICAgICAgICAgICAgICAgICBpZiAoby0+aXNQb3NpdGlvbmVkKCkpCiAgICAgICAg
ICAgICAgICAgICAgIG8tPmNvbnRhaW5pbmdCbG9jaygpLT5pbnNlcnRQb3NpdGlvbmVkT2JqZWN0
KGJveCk7CkBAIC04NjIsNyArODgyLDggQEAgdm9pZCBSZW5kZXJCbG9jazo6bGF5b3V0SW5saW5l
Q2hpbGRyZW4oYgogICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmdWxsTGF5b3V0IHx8IG8t
Pm5lZWRzTGF5b3V0KCkpIC8vIFJlcGxhY2VkIGVsZW1lbnRzCiAgICAgICAgICAgICAgICAgICAg
ICAgICB0b1JlbmRlckJveChvKS0+ZGlydHlMaW5lQm94ZXMoZnVsbExheW91dCk7CiAKLSAgICAg
ICAgICAgICAgICAgICAgby0+bGF5b3V0SWZOZWVkZWQoKTsKKyAgICAgICAgICAgICAgICAgICAg
aWYgKCFvLT5pc1JlcGxhY2VkKCkgfHwgIW8tPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkKKyAg
ICAgICAgICAgICAgICAgICAgICAgIG8tPmxheW91dElmTmVlZGVkKCk7CiAgICAgICAgICAgICAg
ICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmIChvLT5pc1RleHQoKSB8fCAoby0+aXNSZW5kZXJJ
bmxpbmUoKSAmJiAhZW5kT2ZJbmxpbmUpKSB7CiAgICAgICAgICAgICAgICAgaWYgKGZ1bGxMYXlv
dXQgfHwgby0+c2VsZk5lZWRzTGF5b3V0KCkpCkBAIC05NTYsNyArOTc3LDcgQEAgdm9pZCBSZW5k
ZXJCbG9jazo6bGF5b3V0SW5saW5lQ2hpbGRyZW4oYgogICAgICAgICAgICAgaXNMaW5lRW1wdHkg
PSB0cnVlOwogICAgICAgICAgICAgCiAgICAgICAgICAgICBFQ2xlYXIgY2xlYXIgPSBDTk9ORTsK
LSAgICAgICAgICAgIGVuZCA9IGZpbmROZXh0TGluZUJyZWFrKHJlc29sdmVyLCBmaXJzdExpbmUs
IGlzTGluZUVtcHR5LCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHksICZjbGVhcik7CisgICAgICAg
ICAgICBlbmQgPSBmaW5kTmV4dExpbmVCcmVhayhyZXNvbHZlciwgZmlyc3RMaW5lLCBpc0xpbmVF
bXB0eSwgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5LCBtYXJnaW5JbmZvLCAmY2xlYXIpOwogICAg
ICAgICAgICAgaWYgKHJlc29sdmVyLnBvc2l0aW9uKCkuYXRFbmQoKSkgewogICAgICAgICAgICAg
ICAgIHJlc29sdmVyLmRlbGV0ZVJ1bnMoKTsKICAgICAgICAgICAgICAgICBjaGVja0ZvckZsb2F0
c0Zyb21MYXN0TGluZSA9IHRydWU7CkBAIC0xMTQ3LDggKzExNjgsOSBAQCB2b2lkIFJlbmRlckJs
b2NrOjpsYXlvdXRJbmxpbmVDaGlsZHJlbihiCiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBO
b3cgYWRkIGluIHRoZSBib3R0b20gYm9yZGVyL3BhZGRpbmcuCi0gICAgc2V0SGVpZ2h0KGhlaWdo
dCgpICsgdG9BZGQpOworICAgIC8vIE5vdyBkbyB0aGUgaGFuZGxpbmcgb2YgdGhlIGJvdHRvbSBv
ZiB0aGUgYmxvY2ssIGFkZGluZyBpbiBvdXIgYm90dG9tIGJvcmRlci9wYWRkaW5nIGFuZAorICAg
IC8vIGRldGVybWluaW5nIHRoZSBjb3JyZWN0IGNvbGxhcHNlZCBib3R0b20gbWFyZ2luIGluZm9y
bWF0aW9uLgorICAgIGhhbmRsZUJvdHRvbU9mQmxvY2sodG9wLCBib3R0b20sIG1hcmdpbkluZm8p
OwogCiAgICAgaWYgKCFmaXJzdExpbmVCb3goKSAmJiBoYXNMaW5lSWZFbXB0eSgpKQogICAgICAg
ICBzZXRIZWlnaHQoaGVpZ2h0KCkgKyBsaW5lSGVpZ2h0KHRydWUsIHRydWUpKTsKQEAgLTExNjks
NiArMTE5MSwxMiBAQCBSb290SW5saW5lQm94KiBSZW5kZXJCbG9jazo6ZGV0ZXJtaW5lU3RhCiAg
ICAgaWYgKCFmdWxsTGF5b3V0KSB7CiAgICAgICAgIHNpemVfdCBmbG9hdEluZGV4ID0gMDsKICAg
ICAgICAgZm9yIChjdXJyID0gZmlyc3RSb290Qm94KCk7IGN1cnIgJiYgIWN1cnItPmlzRGlydHko
KTsgY3VyciA9IGN1cnItPm5leHRSb290Qm94KCkpIHsKKyAgICAgICAgICAgIGlmIChjdXJyLT5h
bm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CisgICAgICAgICAgICAgICAgLy8gRklYTUU6IFdlIGhh
dmUgdG8gZG8gYmV0dGVyIHRoYW4gdGhpcyBvciB3ZSB3aWxsIHJlcGFpbnQgdG9vIG11Y2ggYXMg
Y29udGVudCBpbnNpZGUgYW4KKyAgICAgICAgICAgICAgICAvLyBhbm9ueW1vdXMgaW5saW5lIGJs
b2NrIGNvbWVzIGluLgorICAgICAgICAgICAgICAgIGZ1bGxMYXlvdXQgPSB0cnVlOworICAgICAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKFZlY3RvcjxS
ZW5kZXJCb3gqPiogY2xlYW5MaW5lRmxvYXRzID0gY3Vyci0+ZmxvYXRzUHRyKCkpIHsKICAgICAg
ICAgICAgICAgICBWZWN0b3I8UmVuZGVyQm94Kj46Oml0ZXJhdG9yIGVuZCA9IGNsZWFuTGluZUZs
b2F0cy0+ZW5kKCk7CiAgICAgICAgICAgICAgICAgZm9yIChWZWN0b3I8UmVuZGVyQm94Kj46Oml0
ZXJhdG9yIG8gPSBjbGVhbkxpbmVGbG9hdHMtPmJlZ2luKCk7IG8gIT0gZW5kOyArK28pIHsKQEAg
LTE1ODMsNyArMTYxMSw3IEBAIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgdGV4dFdpZHRoKFJlbmRl
clQKIH0KIAogSW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6OmZpbmROZXh0TGluZUJyZWFrKElu
bGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIsIGJvb2wgZmlyc3RMaW5lLCAgYm9vbCYgaXNMaW5l
RW1wdHksIGJvb2wmIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSwgCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUNsZWFyKiBjbGVhcikKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXJnaW5JbmZvJiBtYXJnaW5JbmZv
LCBFQ2xlYXIqIGNsZWFyKQogewogICAgIEFTU0VSVChyZXNvbHZlci5wb3NpdGlvbigpLmJsb2Nr
ID09IHRoaXMpOwogCkBAIC0xNjI0LDYgKzE2NTIsMTAgQEAgSW5saW5lSXRlcmF0b3IgUmVuZGVy
QmxvY2s6OmZpbmROZXh0TGluZQogICAgIGJvb2wgYXV0b1dyYXBXYXNFdmVyVHJ1ZU9uTGluZSA9
IGZhbHNlOwogICAgIGJvb2wgZmxvYXRzRml0T25MaW5lID0gdHJ1ZTsKICAgICAKKyAgICBib29s
IGlzQmxvY2tJbnNpZGVJbmxpbmUgPSBmYWxzZTsKKyAgICBpbnQgcHJldmlvdXNCbG9ja0Zsb2F0
Qm90dG9tID0gMDsKKyAgICBpbnQgbWF4QmxvY2tGbG9hdEJvdHRvbSA9IDA7CisKICAgICAvLyBG
aXJlZm94IGFuZCBPcGVyYSB3aWxsIGFsbG93IGEgdGFibGUgY2VsbCB0byBncm93IHRvIGZpdCBh
biBpbWFnZSBpbnNpZGUgaXQgdW5kZXIKICAgICAvLyB2ZXJ5IHNwZWNpZmljIGNpcmN1bXN0YW5j
ZXMgKGluIG9yZGVyIHRvIG1hdGNoIGNvbW1vbiBXaW5JRSByZW5kZXJpbmdzKS4gCiAgICAgLy8g
Tm90IHN1cHBvcnRpbmcgdGhlIHF1aXJrIGhhcyBjYXVzZWQgdXMgdG8gbWlzLXJlbmRlciBzb21l
IHJlYWwgc2l0ZXMuIChTZWUgQnVnemlsbGEgMTA1MTcuKSAKQEAgLTE2MzQsNyArMTY2Niw4IEBA
IElubGluZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpmaW5kTmV4dExpbmUKICAgICB3aGlsZSAobykg
ewogICAgICAgICBjdXJyV1MgPSBvLT5pc1JlcGxhY2VkKCkgPyBvLT5wYXJlbnQoKS0+c3R5bGUo
KS0+d2hpdGVTcGFjZSgpIDogby0+c3R5bGUoKS0+d2hpdGVTcGFjZSgpOwogICAgICAgICBsYXN0
V1MgPSBsYXN0LT5pc1JlcGxhY2VkKCkgPyBsYXN0LT5wYXJlbnQoKS0+c3R5bGUoKS0+d2hpdGVT
cGFjZSgpIDogbGFzdC0+c3R5bGUoKS0+d2hpdGVTcGFjZSgpOwotICAgICAgICAKKyAgICAgICAg
aXNCbG9ja0luc2lkZUlubGluZSA9IG8tPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKTsKKwogICAg
ICAgICBib29sIGF1dG9XcmFwID0gUmVuZGVyU3R5bGU6OmF1dG9XcmFwKGN1cnJXUyk7CiAgICAg
ICAgIGF1dG9XcmFwV2FzRXZlclRydWVPbkxpbmUgPSBhdXRvV3JhcFdhc0V2ZXJUcnVlT25MaW5l
IHx8IGF1dG9XcmFwOwogCkBAIC0xNjQ1LDcgKzE2NzgsMTIgQEAgSW5saW5lSXRlcmF0b3IgUmVu
ZGVyQmxvY2s6OmZpbmROZXh0TGluZQogI2VuZGlmCiAKICAgICAgICAgYm9vbCBjb2xsYXBzZVdo
aXRlU3BhY2UgPSBSZW5kZXJTdHlsZTo6Y29sbGFwc2VXaGl0ZVNwYWNlKGN1cnJXUyk7Ci0gICAg
ICAgICAgICAKKyAgICAgICAgCisgICAgICAgIGlmICghaXNCbG9ja0luc2lkZUlubGluZSkgewor
ICAgICAgICAgICAgbWFyZ2luSW5mby5zZXRBdFRvcE9mQmxvY2soZmFsc2UpOworICAgICAgICAg
ICAgbWFyZ2luSW5mby5jbGVhck1hcmdpbigpOworICAgICAgICB9CisKICAgICAgICAgaWYgKG8t
PmlzQlIoKSkgewogICAgICAgICAgICAgaWYgKHcgKyB0bXBXIDw9IHdpZHRoKSB7CiAgICAgICAg
ICAgICAgICAgbEJyZWFrLm9iaiA9IG87CkBAIC0xNzUyLDggKzE3OTAsOSBAQCBJbmxpbmVJdGVy
YXRvciBSZW5kZXJCbG9jazo6ZmluZE5leHRMaW5lCiAgICAgICAgIH0gZWxzZSBpZiAoby0+aXNS
ZXBsYWNlZCgpKSB7CiAgICAgICAgICAgICBSZW5kZXJCb3gqIHJlcGxhY2VkQm94ID0gdG9SZW5k
ZXJCb3gobyk7CiAKLSAgICAgICAgICAgIC8vIEJyZWFrIG9uIHJlcGxhY2VkIGVsZW1lbnRzIGlm
IGVpdGhlciBoYXMgbm9ybWFsIHdoaXRlLXNwYWNlLgotICAgICAgICAgICAgaWYgKChhdXRvV3Jh
cCB8fCBSZW5kZXJTdHlsZTo6YXV0b1dyYXAobGFzdFdTKSkgJiYgKCFvLT5pc0ltYWdlKCkgfHwg
YWxsb3dJbWFnZXNUb0JyZWFrKSkgeworICAgICAgICAgICAgLy8gQnJlYWsgb24gcmVwbGFjZWQg
ZWxlbWVudHMgaWYgZWl0aGVyIGhhcyBub3JtYWwgd2hpdGUtc3BhY2UuICBXZSBhbHNvIGFsd2F5
cyBicmVhayBpZiB3ZQorICAgICAgICAgICAgLy8gZW5jb3VudGVyIGEgc3BlY2lhbCBhbm9ueW1v
dXMgaW5saW5lIGJsb2NrICh1c2VkIHRvIGhvbGQgYmxvY2tzIGluc2lkZSBpbmxpbmVzKS4KKyAg
ICAgICAgICAgIGlmICgoYXV0b1dyYXAgfHwgUmVuZGVyU3R5bGU6OmF1dG9XcmFwKGxhc3RXUykg
fHwgaXNCbG9ja0luc2lkZUlubGluZSkgICYmICghby0+aXNJbWFnZSgpIHx8IGFsbG93SW1hZ2Vz
VG9CcmVhaykpIHsKICAgICAgICAgICAgICAgICB3ICs9IHRtcFc7CiAgICAgICAgICAgICAgICAg
dG1wVyA9IDA7CiAgICAgICAgICAgICAgICAgbEJyZWFrLm9iaiA9IG87CkBAIC0xNzYxLDYgKzE4
MDAsMjAgQEAgSW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6OmZpbmROZXh0TGluZQogICAgICAg
ICAgICAgICAgIGxCcmVhay5uZXh0QnJlYWthYmxlUG9zaXRpb24gPSAtMTsKICAgICAgICAgICAg
IH0KIAorICAgICAgICAgICAgaWYgKGlzQmxvY2tJbnNpZGVJbmxpbmUpIHsKKyAgICAgICAgICAg
ICAgICBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHkgPSB0cnVlOworICAgICAgICAgICAgICAgIGlm
ICghaXNMaW5lRW1wdHkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOworCisgICAgICAg
ICAgICAgICAgLy8gUmVzZXQgdGhlIHdpZHRoIHRvIGlnbm9yZSBmbG9hdHMsIHNpbmNlIHdlJ3Jl
IGdvaW5nIHRvIGFsbG93IHRoZW0gdG8gaW50cnVkZSBpbnRvIG91ciBzcGFjZS4KKyAgICAgICAg
ICAgICAgICB3aWR0aCA9IHJpZ2h0T2Zmc2V0KCkgLSBsZWZ0T2Zmc2V0KCk7CisKKyAgICAgICAg
ICAgICAgICAvLyBGSVhNRTogVGhpcyBjYWxsIHdpbGwgdXBkYXRlIHRoZSBoZWlnaHQgb2Ygb3Vy
IGJsb2NrLiAgSXQncyBub3QgY2xlYXIgaWYgdGhhdCdzIGdvaW5nIHRvIGJlIG9rIG9yIG5vdCB5
ZXQuCisgICAgICAgICAgICAgICAgbGF5b3V0QmxvY2tDaGlsZChyZXBsYWNlZEJveCwgbWFyZ2lu
SW5mbywgcHJldmlvdXNCbG9ja0Zsb2F0Qm90dG9tLCBtYXhCbG9ja0Zsb2F0Qm90dG9tKTsKKwor
ICAgICAgICAgICAgICAgIGxpbmVNaWRwb2ludFN0YXRlLmJldHdlZW5NaWRwb2ludHMgPSBmYWxz
ZTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKGlnbm9yaW5nU3BhY2VzKQogICAg
ICAgICAgICAgICAgIGFkZE1pZHBvaW50KGxpbmVNaWRwb2ludFN0YXRlLCBJbmxpbmVJdGVyYXRv
cigwLCBvLCAwKSk7CiAKQEAgLTE3ODIsNiArMTgzNSwxNSBAQCBJbmxpbmVJdGVyYXRvciBSZW5k
ZXJCbG9jazo6ZmluZE5leHRMaW5lCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBl
bHNlCiAgICAgICAgICAgICAgICAgdG1wVyArPSByZXBsYWNlZEJveC0+d2lkdGgoKSArIHJlcGxh
Y2VkQm94LT5tYXJnaW5MZWZ0KCkgKyByZXBsYWNlZEJveC0+bWFyZ2luUmlnaHQoKSArIGlubGlu
ZVdpZHRoKG8pOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGlzQmxvY2tJbnNp
ZGVJbmxpbmUpIHsKKyAgICAgICAgICAgICAgICB3ICs9IHRtcFc7CisgICAgICAgICAgICAgICAg
dG1wVyA9IDA7CisgICAgICAgICAgICAgICAgbEJyZWFrLm9iaiA9IG87CisgICAgICAgICAgICAg
ICAgbEJyZWFrLnBvcyA9IDA7CisgICAgICAgICAgICAgICAgbEJyZWFrLm5leHRCcmVha2FibGVQ
b3NpdGlvbiA9IC0xOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgfQog
ICAgICAgICB9IGVsc2UgaWYgKG8tPmlzVGV4dCgpKSB7CiAgICAgICAgICAgICBpZiAoIXBvcykK
ICAgICAgICAgICAgICAgICBhcHBsaWVkU3RhcnRXaWR0aCA9IGZhbHNlOwpJbmRleDogV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVyQm94LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmlu
Zy9SZW5kZXJCb3guY3BwCShyZXZpc2lvbiA0NzU5MSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1Jl
bmRlckJveC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEyODQsNyArMTI4NCw3IEBAIHZvaWQgUmVu
ZGVyQm94OjpjYWxjV2lkdGgoKQogICAgIH0KIAogICAgIGlmIChjb250YWluZXJXaWR0aCAmJiBj
b250YWluZXJXaWR0aCAhPSAod2lkdGgoKSArIG1fbWFyZ2luTGVmdCArIG1fbWFyZ2luUmlnaHQp
Ci0gICAgICAgICAgICAmJiAhaXNGbG9hdGluZygpICYmICFpc0lubGluZSgpICYmICFjYi0+aXNG
bGV4aWJsZUJveCgpKSB7CisgICAgICAgICAgICAmJiAhaXNGbG9hdGluZygpICYmICghaXNJbmxp
bmUoKSB8fCBpc0Fub255bW91c0lubGluZUJsb2NrKCkpICYmICFjYi0+aXNGbGV4aWJsZUJveCgp
KSB7CiAgICAgICAgIGlmIChjYi0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkgPT0gTFRSKQogICAgICAg
ICAgICAgbV9tYXJnaW5SaWdodCA9IGNvbnRhaW5lcldpZHRoIC0gd2lkdGgoKSAtIG1fbWFyZ2lu
TGVmdDsKICAgICAgICAgZWxzZQpAQCAtMTMyMyw3ICsxMzIzLDcgQEAgYm9vbCBSZW5kZXJCb3g6
OnNpemVzVG9JbnRyaW5zaWNXaWR0aChXaQogewogICAgIC8vIE1hcnF1ZWVzIGluIFdpbklFIGFy
ZSBsaWtlIGEgbWl4dHVyZSBvZiBibG9ja3MgYW5kIGlubGluZS1ibG9ja3MuICBUaGV5IHNpemUg
YXMgdGhvdWdoIHRoZXkncmUgYmxvY2tzLAogICAgIC8vIGJ1dCB0aGV5IGFsbG93IHRleHQgdG8g
c2l0IG9uIHRoZSBzYW1lIGxpbmUgYXMgdGhlIG1hcnF1ZWUuCi0gICAgaWYgKGlzRmxvYXRpbmco
KSB8fCAoaXNJbmxpbmVCbG9ja09ySW5saW5lVGFibGUoKSAmJiAhaXNIVE1MTWFycXVlZSgpKSkK
KyAgICBpZiAoaXNGbG9hdGluZygpIHx8IChpc0lubGluZUJsb2NrT3JJbmxpbmVUYWJsZSgpICYm
ICFpc0hUTUxNYXJxdWVlKCkgJiYgIWlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkpCiAgICAgICAg
IHJldHVybiB0cnVlOwogCiAgICAgLy8gVGhpcyBjb2RlIG1heSBsb29rIGEgYml0IHN0cmFuZ2Uu
ICBCYXNpY2FsbHkgd2lkdGg6aW50cmluc2ljIHNob3VsZCBjbGFtcCB0aGUgc2l6ZSB3aGVuIHRl
c3RpbmcgYm90aApAQCAtMjc2OSw3ICsyNzY5LDcgQEAgYm9vbCBSZW5kZXJCb3g6OnNocmlua1Rv
QXZvaWRGbG9hdHMoKSBjbwogCiBib29sIFJlbmRlckJveDo6YXZvaWRzRmxvYXRzKCkgY29uc3QK
IHsKLSAgICByZXR1cm4gaXNSZXBsYWNlZCgpIHx8IGhhc092ZXJmbG93Q2xpcCgpIHx8IGlzSFIo
KTsKKyAgICByZXR1cm4gIWlzQW5vbnltb3VzSW5saW5lQmxvY2soKSAmJiAoaXNSZXBsYWNlZCgp
IHx8IGhhc092ZXJmbG93Q2xpcCgpIHx8IGlzSFIoKSk7CiB9CiAKIHZvaWQgUmVuZGVyQm94Ojph
ZGRTaGFkb3dPdmVyZmxvdygpCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJJbmxpbmUu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlcklubGluZS5jcHAJKHJl
dmlzaW9uIDQ3NjQzKQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVySW5saW5lLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtNDIsNyArNDIsNiBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIFJlbmRl
cklubGluZTo6UmVuZGVySW5saW5lKE5vZGUqIG5vZGUpCiAgICAgOiBSZW5kZXJCb3hNb2RlbE9i
amVjdChub2RlKQotICAgICwgbV9jb250aW51YXRpb24oMCkKICAgICAsIG1fbGluZUhlaWdodCgt
MSkKICAgICAsIG1fdmVydGljYWxQb3NpdGlvbihQb3NpdGlvblVuZGVmaW5lZCkKIHsKQEAgLTUx
LDExICs1MCw2IEBAIFJlbmRlcklubGluZTo6UmVuZGVySW5saW5lKE5vZGUqIG5vZGUpCiAKIHZv
aWQgUmVuZGVySW5saW5lOjpkZXN0cm95KCkKIHsKLSAgICAvLyBEZXRhY2ggb3VyIGNvbnRpbnVh
dGlvbiBmaXJzdC4KLSAgICBpZiAobV9jb250aW51YXRpb24pCi0gICAgICAgIG1fY29udGludWF0
aW9uLT5kZXN0cm95KCk7Ci0gICAgbV9jb250aW51YXRpb24gPSAwOwotICAgIAogICAgIC8vIE1h
a2Ugc3VyZSB0byBkZXN0cm95IGFub255bW91cyBjaGlsZHJlbiBmaXJzdCB3aGlsZSB0aGV5IGFy
ZSBzdGlsbCBjb25uZWN0ZWQgdG8gdGhlIHJlc3Qgb2YgdGhlIHRyZWUsIHNvIHRoYXQgdGhleSB3
aWxsCiAgICAgLy8gcHJvcGVybHkgZGlydHkgbGluZSBib3hlcyB0aGF0IHRoZXkgYXJlIHJlbW92
ZWQgZnJvbS4gIEVmZmVjdHMgdGhhdCBkbyA6YmVmb3JlLzphZnRlciBvbmx5IG9uIGhvdmVyIGNv
dWxkIGNyYXNoIG90aGVyd2lzZS4KICAgICBjaGlsZHJlbigpLT5kZXN0cm95TGVmdG92ZXJDaGls
ZHJlbigpOwpAQCAtODcsMTMgKzgxLDYgQEAgdm9pZCBSZW5kZXJJbmxpbmU6OmRlc3Ryb3koKQog
ICAgIFJlbmRlckJveE1vZGVsT2JqZWN0OjpkZXN0cm95KCk7CiB9CiAKLVJlbmRlcklubGluZSog
UmVuZGVySW5saW5lOjppbmxpbmVDb250aW51YXRpb24oKSBjb25zdAotewotICAgIGlmICghbV9j
b250aW51YXRpb24gfHwgbV9jb250aW51YXRpb24tPmlzSW5saW5lKCkpCi0gICAgICAgIHJldHVy
biB0b1JlbmRlcklubGluZShtX2NvbnRpbnVhdGlvbik7Ci0gICAgcmV0dXJuIHRvUmVuZGVyQmxv
Y2sobV9jb250aW51YXRpb24pLT5pbmxpbmVDb250aW51YXRpb24oKTsKLX0KLQogdm9pZCBSZW5k
ZXJJbmxpbmU6OnVwZGF0ZUJveE1vZGVsSW5mb0Zyb21TdHlsZSgpCiB7CiAgICAgUmVuZGVyQm94
TW9kZWxPYmplY3Q6OnVwZGF0ZUJveE1vZGVsSW5mb0Zyb21TdHlsZSgpOwpAQCAtMTA5LDE5ICs5
Niw2IEBAIHZvaWQgUmVuZGVySW5saW5lOjpzdHlsZURpZENoYW5nZShTdHlsZUQKIHsKICAgICBS
ZW5kZXJCb3hNb2RlbE9iamVjdDo6c3R5bGVEaWRDaGFuZ2UoZGlmZiwgb2xkU3R5bGUpOwogCi0g
ICAgLy8gRW5zdXJlIHRoYXQgYWxsIG9mIHRoZSBzcGxpdCBpbmxpbmVzIHBpY2sgdXAgdGhlIG5l
dyBzdHlsZS4gV2UKLSAgICAvLyBvbmx5IGRvIHRoaXMgaWYgd2UncmUgYW4gaW5saW5lLCBzaW5j
ZSB3ZSBkb24ndCB3YW50IHRvIHByb3BhZ2F0ZQotICAgIC8vIGEgYmxvY2sncyBzdHlsZSB0byB0
aGUgb3RoZXIgaW5saW5lcy4KLSAgICAvLyBlLmcuLCA8Zm9udD5mb28gPGg0PmdvbzwvaDQ+IG1v
bzwvZm9udD4uICBUaGUgPGZvbnQ+IGlubGluZXMgYmVmb3JlCi0gICAgLy8gYW5kIGFmdGVyIHRo
ZSBibG9jayBzaGFyZSB0aGUgc2FtZSBzdHlsZSwgYnV0IHRoZSBibG9jayBkb2Vzbid0Ci0gICAg
Ly8gbmVlZCB0byBwYXNzIGl0cyBzdHlsZSBvbiB0byBhbnlvbmUgZWxzZS4KLSAgICBmb3IgKFJl
bmRlcklubGluZSogY3VyckNvbnQgPSBpbmxpbmVDb250aW51YXRpb24oKTsgY3VyckNvbnQ7IGN1
cnJDb250ID0gY3VyckNvbnQtPmlubGluZUNvbnRpbnVhdGlvbigpKSB7Ci0gICAgICAgIFJlbmRl
ckJveE1vZGVsT2JqZWN0KiBuZXh0Q29udCA9IGN1cnJDb250LT5jb250aW51YXRpb24oKTsKLSAg
ICAgICAgY3VyckNvbnQtPnNldENvbnRpbnVhdGlvbigwKTsKLSAgICAgICAgY3VyckNvbnQtPnNl
dFN0eWxlKHN0eWxlKCkpOwotICAgICAgICBjdXJyQ29udC0+c2V0Q29udGludWF0aW9uKG5leHRD
b250KTsKLSAgICB9Ci0KICAgICBtX2xpbmVIZWlnaHQgPSAtMTsKIAogICAgIC8vIFVwZGF0ZSBw
c2V1ZG9zIGZvciA6YmVmb3JlIGFuZCA6YWZ0ZXIgbm93LgpAQCAtMTMzLDc3ICsxMDcsNTIgQEAg
dm9pZCBSZW5kZXJJbmxpbmU6OnN0eWxlRGlkQ2hhbmdlKFN0eWxlRAogCiB2b2lkIFJlbmRlcklu
bGluZTo6YWRkQ2hpbGQoUmVuZGVyT2JqZWN0KiBuZXdDaGlsZCwgUmVuZGVyT2JqZWN0KiBiZWZv
cmVDaGlsZCkKIHsKLSAgICBpZiAoY29udGludWF0aW9uKCkpCi0gICAgICAgIHJldHVybiBhZGRD
aGlsZFRvQ29udGludWF0aW9uKG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7Ci0gICAgcmV0dXJuIGFk
ZENoaWxkSWdub3JpbmdDb250aW51YXRpb24obmV3Q2hpbGQsIGJlZm9yZUNoaWxkKTsKLX0KLQot
c3RhdGljIFJlbmRlckJveE1vZGVsT2JqZWN0KiBuZXh0Q29udGludWF0aW9uKFJlbmRlck9iamVj
dCogcmVuZGVyZXIpCi17Ci0gICAgaWYgKHJlbmRlcmVyLT5pc0lubGluZSgpICYmICFyZW5kZXJl
ci0+aXNSZXBsYWNlZCgpKQotICAgICAgICByZXR1cm4gdG9SZW5kZXJJbmxpbmUocmVuZGVyZXIp
LT5jb250aW51YXRpb24oKTsKLSAgICByZXR1cm4gdG9SZW5kZXJCbG9jayhyZW5kZXJlciktPmlu
bGluZUNvbnRpbnVhdGlvbigpOwotfQotCi1SZW5kZXJCb3hNb2RlbE9iamVjdCogUmVuZGVySW5s
aW5lOjpjb250aW51YXRpb25CZWZvcmUoUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCkKLXsKLSAg
ICBpZiAoYmVmb3JlQ2hpbGQgJiYgYmVmb3JlQ2hpbGQtPnBhcmVudCgpID09IHRoaXMpCi0gICAg
ICAgIHJldHVybiB0aGlzOwotCi0gICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGN1cnIgPSBuZXh0
Q29udGludWF0aW9uKHRoaXMpOwotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBuZXh0VG9MYXN0
ID0gdGhpczsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogbGFzdCA9IHRoaXM7Ci0gICAgd2hp
bGUgKGN1cnIpIHsKLSAgICAgICAgaWYgKGJlZm9yZUNoaWxkICYmIGJlZm9yZUNoaWxkLT5wYXJl
bnQoKSA9PSBjdXJyKSB7Ci0gICAgICAgICAgICBpZiAoY3Vyci0+Zmlyc3RDaGlsZCgpID09IGJl
Zm9yZUNoaWxkKQotICAgICAgICAgICAgICAgIHJldHVybiBsYXN0OwotICAgICAgICAgICAgcmV0
dXJuIGN1cnI7Ci0gICAgICAgIH0KLQotICAgICAgICBuZXh0VG9MYXN0ID0gbGFzdDsKLSAgICAg
ICAgbGFzdCA9IGN1cnI7Ci0gICAgICAgIGN1cnIgPSBuZXh0Q29udGludWF0aW9uKGN1cnIpOwot
ICAgIH0KLQotICAgIGlmICghYmVmb3JlQ2hpbGQgJiYgIWxhc3QtPmZpcnN0Q2hpbGQoKSkKLSAg
ICAgICAgcmV0dXJuIG5leHRUb0xhc3Q7Ci0gICAgcmV0dXJuIGxhc3Q7Ci19Ci0KLXZvaWQgUmVu
ZGVySW5saW5lOjphZGRDaGlsZElnbm9yaW5nQ29udGludWF0aW9uKFJlbmRlck9iamVjdCogbmV3
Q2hpbGQsIFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQpCi17CiAgICAgLy8gTWFrZSBzdXJlIHdl
IGRvbid0IGFwcGVuZCB0aGluZ3MgYWZ0ZXIgOmFmdGVyLWdlbmVyYXRlZCBjb250ZW50IGlmIHdl
IGhhdmUgaXQuCiAgICAgaWYgKCFiZWZvcmVDaGlsZCAmJiBpc0FmdGVyQ29udGVudChsYXN0Q2hp
bGQoKSkpCiAgICAgICAgIGJlZm9yZUNoaWxkID0gbGFzdENoaWxkKCk7CiAKLSAgICBpZiAoIW5l
d0NoaWxkLT5pc0lubGluZSgpICYmICFuZXdDaGlsZC0+aXNGbG9hdGluZ09yUG9zaXRpb25lZCgp
KSB7Ci0gICAgICAgIC8vIFdlIGFyZSBwbGFjaW5nIGEgYmxvY2sgaW5zaWRlIGFuIGlubGluZS4g
V2UgaGF2ZSB0byBwZXJmb3JtIGEgc3BsaXQgb2YgdGhpcwotICAgICAgICAvLyBpbmxpbmUgaW50
byBjb250aW51YXRpb25zLiAgVGhpcyBpbnZvbHZlcyBjcmVhdGluZyBhbiBhbm9ueW1vdXMgYmxv
Y2sgYm94IHRvIGhvbGQKLSAgICAgICAgLy8gfG5ld0NoaWxkfC4gIFdlIHRoZW4gbWFrZSB0aGF0
IGJsb2NrIGJveCBhIGNvbnRpbnVhdGlvbiBvZiB0aGlzIGlubGluZS4gIFdlIHRha2UgYWxsIG9m
Ci0gICAgICAgIC8vIHRoZSBjaGlsZHJlbiBhZnRlciB8YmVmb3JlQ2hpbGR8IGFuZCBwdXQgdGhl
bSBpbiBhIGNsb25lIG9mIHRoaXMgb2JqZWN0LgotICAgICAgICBSZWZQdHI8UmVuZGVyU3R5bGU+
IG5ld1N0eWxlID0gUmVuZGVyU3R5bGU6OmNyZWF0ZSgpOwotICAgICAgICBuZXdTdHlsZS0+aW5o
ZXJpdEZyb20oc3R5bGUoKSk7Ci0gICAgICAgIG5ld1N0eWxlLT5zZXREaXNwbGF5KEJMT0NLKTsK
LQotICAgICAgICBSZW5kZXJCbG9jayogbmV3Qm94ID0gbmV3IChyZW5kZXJBcmVuYSgpKSBSZW5k
ZXJCbG9jayhkb2N1bWVudCgpIC8qIGFub255bW91cyBib3ggKi8pOwotICAgICAgICBuZXdCb3gt
PnNldFN0eWxlKG5ld1N0eWxlLnJlbGVhc2UoKSk7Ci0gICAgICAgIFJlbmRlckJveE1vZGVsT2Jq
ZWN0KiBvbGRDb250aW51YXRpb24gPSBjb250aW51YXRpb24oKTsKLSAgICAgICAgc2V0Q29udGlu
dWF0aW9uKG5ld0JveCk7Ci0KLSAgICAgICAgLy8gU29tZW9uZSBtYXkgaGF2ZSBwdXQgYSA8cD4g
aW5zaWRlIGEgPHE+LCBjYXVzaW5nIGEgc3BsaXQuICBXaGVuIHRoaXMgaGFwcGVucywgdGhlIDph
ZnRlciBjb250ZW50Ci0gICAgICAgIC8vIGhhcyB0byBtb3ZlIGludG8gdGhlIGlubGluZSBjb250
aW51YXRpb24uICBDYWxsIHVwZGF0ZUJlZm9yZUFmdGVyQ29udGVudCB0byBlbnN1cmUgdGhhdCBv
dXIgOmFmdGVyCi0gICAgICAgIC8vIGNvbnRlbnQgZ2V0cyBwcm9wZXJseSBkZXN0cm95ZWQuCi0g
ICAgICAgIGJvb2wgaXNMYXN0Q2hpbGQgPSAoYmVmb3JlQ2hpbGQgPT0gbGFzdENoaWxkKCkpOwot
ICAgICAgICBpZiAoZG9jdW1lbnQoKS0+dXNlc0JlZm9yZUFmdGVyUnVsZXMoKSkKLSAgICAgICAg
ICAgIGNoaWxkcmVuKCktPnVwZGF0ZUJlZm9yZUFmdGVyQ29udGVudCh0aGlzLCBBRlRFUik7Ci0g
ICAgICAgIGlmIChpc0xhc3RDaGlsZCAmJiBiZWZvcmVDaGlsZCAhPSBsYXN0Q2hpbGQoKSkKLSAg
ICAgICAgICAgIGJlZm9yZUNoaWxkID0gMDsgLy8gV2UgZGVzdHJveWVkIHRoZSBsYXN0IGNoaWxk
LCBzbyBub3cgd2UgbmVlZCB0byB1cGRhdGUgb3VyIGluc2VydGlvbgotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAvLyBwb2ludCB0byBiZSAwLiAgSXQncyBqdXN0IGEgc3RyYWlnaHQgYXBw
ZW5kIG5vdy4KLQotICAgICAgICBzcGxpdEZsb3coYmVmb3JlQ2hpbGQsIG5ld0JveCwgbmV3Q2hp
bGQsIG9sZENvbnRpbnVhdGlvbik7CisgICAgLy8gSWYgdGhlIHJlcXVlc3RlZCBiZWZvcmVDaGls
ZCBpcyBub3Qgb25lIG9mIG91ciBjaGlsZHJlbiwgdGhlbiB0aGlzIGlzIG1vc3QgbGlrZWx5IGJl
Y2F1c2UKKyAgICAvLyB0aGVyZSBpcyBhbiBhbm9ueW1vdXMgaW5saW5lLWJsb2NrIGJveCB3aXRo
aW4gdGhpcyBvYmplY3QgdGhhdCBjb250YWlucyB0aGUgYmVmb3JlQ2hpbGQuIFNvCisgICAgLy8g
anVzdCBpbnNlcnQgdGhlIGNoaWxkIGludG8gdGhlIGFub255bW91cyBpbmxpbmUtYmxvY2sgYm94
IGluc3RlYWQgb2YgaGVyZS4KKyAgICBpZiAoYmVmb3JlQ2hpbGQgJiYgYmVmb3JlQ2hpbGQtPnBh
cmVudCgpICE9IHRoaXMpIHsKKyAgICAgICAgQVNTRVJUKGJlZm9yZUNoaWxkLT5wYXJlbnQoKSk7
CisgICAgICAgIEFTU0VSVChiZWZvcmVDaGlsZC0+cGFyZW50KCktPmlzQW5vbnltb3VzSW5saW5l
QmxvY2soKSk7CisgICAgICAgIGlmICghbmV3Q2hpbGQtPmlzSW5saW5lKCkgfHwgKG5ld0NoaWxk
LT5pc0lubGluZSgpICYmIGJlZm9yZUNoaWxkLT5wYXJlbnQoKS0+Zmlyc3RDaGlsZCgpICE9IGJl
Zm9yZUNoaWxkKSkKKyAgICAgICAgICAgIGJlZm9yZUNoaWxkLT5wYXJlbnQoKS0+YWRkQ2hpbGQo
bmV3Q2hpbGQsIGJlZm9yZUNoaWxkKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYWRkQ2hp
bGQobmV3Q2hpbGQsIGJlZm9yZUNoaWxkLT5wYXJlbnQoKSk7CiAgICAgICAgIHJldHVybjsKICAg
ICB9CiAKKyAgICBpZiAoIW5ld0NoaWxkLT5pc0lubGluZSgpKSB7CisgICAgICAgIC8vIFdlIGFy
ZSBwbGFjaW5nIGEgYmxvY2sgaW5zaWRlIGFuIGlubGluZS4gV2UgaGF2ZSB0byBwbGFjZSB0aGUg
YmxvY2sgaW5zaWRlIGFuIGFub255bW91cyBpbmxpbmUtYmxvY2suCisgICAgICAgIC8vIFRoaXMg
aW5saW5lLWJsb2NrIGNhbiBob3VzZSBhIHNlcXVlbmNlIG9mIGNvbnRpZ3VvdXMgYmxvY2stbGV2
ZWwgY2hpbGRyZW4sIGFuZCB0aGV5IHdpbGwgYWxsIHNpdCBvbiB0aGUKKyAgICAgICAgLy8gc2Ft
ZSBsaW5lIHRvZ2V0aGVyLiAgV2UgdHJ5IHRvIHJldXNlIG9uZSBmaXJzdCBpZiBwb3NzaWJsZS4K
KyAgICAgICAgaWYgKGJlZm9yZUNoaWxkKSB7CisgICAgICAgICAgICBpZiAoYmVmb3JlQ2hpbGQt
PnByZXZpb3VzU2libGluZygpICYmIGJlZm9yZUNoaWxkLT5wcmV2aW91c1NpYmxpbmcoKS0+aXNB
bm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CisgICAgICAgICAgICAgICAgYmVmb3JlQ2hpbGQtPnBy
ZXZpb3VzU2libGluZygpLT5hZGRDaGlsZChuZXdDaGlsZCk7CisgICAgICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGxh
c3RDaGlsZCgpICYmIGxhc3RDaGlsZCgpLT5pc0Fub255bW91c0lubGluZUJsb2NrKCkpIHsKKyAg
ICAgICAgICAgICAgICBsYXN0Q2hpbGQoKS0+YWRkQ2hpbGQobmV3Q2hpbGQpOworICAgICAgICAg
ICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorIAorICAgICAgICBpZiAo
IW5ld0NoaWxkLT5pc0Zsb2F0aW5nT3JQb3NpdGlvbmVkKCkpIHsKKyAgICAgICAgICAgIC8vIFRo
ZXJlIHdhcyBubyBzdWl0YWJsZSBleGlzdGluZyBhbm9ueW1vdXMgYm94LiAgQ3JlYXRlIGEgbmV3
IG9uZS4KKyAgICAgICAgICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gbmV3U3R5bGUgPSBSZW5kZXJT
dHlsZTo6Y3JlYXRlKCk7CisgICAgICAgICAgICBuZXdTdHlsZS0+aW5oZXJpdEZyb20oc3R5bGUo
KSk7CisgICAgICAgICAgICBuZXdTdHlsZS0+c2V0RGlzcGxheShJTkxJTkVfQkxPQ0spOworICAg
ICAgICAgICAgUmVuZGVyQmxvY2sqIG5ld0JveCA9IG5ldyAocmVuZGVyQXJlbmEoKSkgUmVuZGVy
QmxvY2soZG9jdW1lbnQoKSk7CisgICAgICAgICAgICBuZXdCb3gtPnNldFN0eWxlKG5ld1N0eWxl
KTsKKyAgICAgICAgICAgIFJlbmRlckJveE1vZGVsT2JqZWN0OjphZGRDaGlsZChuZXdCb3gsIGJl
Zm9yZUNoaWxkKTsKKyAgICAgICAgICAgIG5ld0JveC0+YWRkQ2hpbGQobmV3Q2hpbGQpOworICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCiAgICAgUmVuZGVyQm94TW9kZWxP
YmplY3Q6OmFkZENoaWxkKG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7CiAKICAgICBuZXdDaGlsZC0+
c2V0TmVlZHNMYXlvdXRBbmRQcmVmV2lkdGhzUmVjYWxjKCk7CkBAIC0yMTYsMTg4ICsxNjUsNiBA
QCBSZW5kZXJJbmxpbmUqIFJlbmRlcklubGluZTo6Y2xvbmVJbmxpbmUoCiAgICAgcmV0dXJuIG87
CiB9CiAKLXZvaWQgUmVuZGVySW5saW5lOjpzcGxpdElubGluZXMoUmVuZGVyQmxvY2sqIGZyb21C
bG9jaywgUmVuZGVyQmxvY2sqIHRvQmxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIFJlbmRlckJsb2NrKiBtaWRkbGVCbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCwgUmVuZGVyQm94TW9kZWxPYmplY3QqIG9s
ZENvbnQpCi17Ci0gICAgLy8gQ3JlYXRlIGEgY2xvbmUgb2YgdGhpcyBpbmxpbmUuCi0gICAgUmVu
ZGVySW5saW5lKiBjbG9uZSA9IGNsb25lSW5saW5lKHRoaXMpOwotICAgIGNsb25lLT5zZXRDb250
aW51YXRpb24ob2xkQ29udCk7Ci0KLSAgICAvLyBOb3cgdGFrZSBhbGwgb2YgdGhlIGNoaWxkcmVu
IGZyb20gYmVmb3JlQ2hpbGQgdG8gdGhlIGVuZCBhbmQgcmVtb3ZlCi0gICAgLy8gdGhlbSBmcm9t
IHx0aGlzfCBhbmQgcGxhY2UgdGhlbSBpbiB0aGUgY2xvbmUuCi0gICAgUmVuZGVyT2JqZWN0KiBv
ID0gYmVmb3JlQ2hpbGQ7Ci0gICAgd2hpbGUgKG8pIHsKLSAgICAgICAgUmVuZGVyT2JqZWN0KiB0
bXAgPSBvOwotICAgICAgICBvID0gdG1wLT5uZXh0U2libGluZygpOwotICAgICAgICBjbG9uZS0+
YWRkQ2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihjaGlsZHJlbigpLT5yZW1vdmVDaGlsZE5vZGUo
dGhpcywgdG1wKSwgMCk7Ci0gICAgICAgIHRtcC0+c2V0TmVlZHNMYXlvdXRBbmRQcmVmV2lkdGhz
UmVjYWxjKCk7Ci0gICAgfQotCi0gICAgLy8gSG9vayB8Y2xvbmV8IHVwIGFzIHRoZSBjb250aW51
YXRpb24gb2YgdGhlIG1pZGRsZSBibG9jay4KLSAgICBtaWRkbGVCbG9jay0+c2V0SW5saW5lQ29u
dGludWF0aW9uKGNsb25lKTsKLQotICAgIC8vIFdlIGhhdmUgYmVlbiByZXBhcmVudGVkIGFuZCBh
cmUgbm93IHVuZGVyIHRoZSBmcm9tQmxvY2suICBXZSBuZWVkCi0gICAgLy8gdG8gd2FsayB1cCBv
dXIgaW5saW5lIHBhcmVudCBjaGFpbiB1bnRpbCB3ZSBoaXQgdGhlIGNvbnRhaW5pbmcgYmxvY2su
Ci0gICAgLy8gT25jZSB3ZSBoaXQgdGhlIGNvbnRhaW5pbmcgYmxvY2sgd2UncmUgZG9uZS4KLSAg
ICBSZW5kZXJCb3hNb2RlbE9iamVjdCogY3VyciA9IHRvUmVuZGVyQm94TW9kZWxPYmplY3QocGFy
ZW50KCkpOwotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBjdXJyQ2hpbGQgPSB0aGlzOwotICAg
IAotICAgIC8vIEZJWE1FOiBCZWNhdXNlIHNwbGl0dGluZyBpcyBPKG5eMikgYXMgdGFncyBuZXN0
IHBhdGhvbG9naWNhbGx5LCB3ZSBjYXAgdGhlIGRlcHRoIGF0IHdoaWNoIHdlJ3JlIHdpbGxpbmcg
dG8gY2xvbmUuCi0gICAgLy8gVGhlcmUgd2lsbCBldmVudHVhbGx5IGJlIGEgYmV0dGVyIGFwcHJv
YWNoIHRvIHRoaXMgcHJvYmxlbSB0aGF0IHdpbGwgbGV0IHVzIG5lc3QgdG8gYSBtdWNoCi0gICAg
Ly8gZ3JlYXRlciBkZXB0aCAoc2VlIGJ1Z3ppbGxhIGJ1ZyAxMzQzMCkgYnV0IGZvciBub3cgd2Ug
aGF2ZSBhIGxpbWl0LiAgVGhpcyAqd2lsbCogcmVzdWx0IGluCi0gICAgLy8gaW5jb3JyZWN0IHJl
bmRlcmluZywgYnV0IHRoZSBhbHRlcm5hdGl2ZSBpcyB0byBoYW5nIGZvcmV2ZXIuCi0gICAgdW5z
aWduZWQgc3BsaXREZXB0aCA9IDE7Ci0gICAgY29uc3QgdW5zaWduZWQgY01heFNwbGl0RGVwdGgg
PSAyMDA7IAotICAgIHdoaWxlIChjdXJyICYmIGN1cnIgIT0gZnJvbUJsb2NrKSB7Ci0gICAgICAg
IEFTU0VSVChjdXJyLT5pc1JlbmRlcklubGluZSgpKTsKLSAgICAgICAgaWYgKHNwbGl0RGVwdGgg
PCBjTWF4U3BsaXREZXB0aCkgewotICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGNsb25lLgot
ICAgICAgICAgICAgUmVuZGVySW5saW5lKiBjbG9uZUNoaWxkID0gY2xvbmU7Ci0gICAgICAgICAg
ICBjbG9uZSA9IGNsb25lSW5saW5lKHRvUmVuZGVySW5saW5lKGN1cnIpKTsKLQotICAgICAgICAg
ICAgLy8gSW5zZXJ0IG91ciBjaGlsZCBjbG9uZSBhcyB0aGUgZmlyc3QgY2hpbGQuCi0gICAgICAg
ICAgICBjbG9uZS0+YWRkQ2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihjbG9uZUNoaWxkLCAwKTsK
LQotICAgICAgICAgICAgLy8gSG9vayB0aGUgY2xvbmUgdXAgYXMgYSBjb250aW51YXRpb24gb2Yg
fGN1cnJ8LgotICAgICAgICAgICAgUmVuZGVySW5saW5lKiBpbmxpbmVDdXJyID0gdG9SZW5kZXJJ
bmxpbmUoY3Vycik7Ci0gICAgICAgICAgICBvbGRDb250ID0gaW5saW5lQ3Vyci0+Y29udGludWF0
aW9uKCk7Ci0gICAgICAgICAgICBpbmxpbmVDdXJyLT5zZXRDb250aW51YXRpb24oY2xvbmUpOwot
ICAgICAgICAgICAgY2xvbmUtPnNldENvbnRpbnVhdGlvbihvbGRDb250KTsKLQotICAgICAgICAg
ICAgLy8gU29tZW9uZSBtYXkgaGF2ZSBpbmRpcmVjdGx5IGNhdXNlZCBhIDxxPiB0byBzcGxpdC4g
IFdoZW4gdGhpcyBoYXBwZW5zLCB0aGUgOmFmdGVyIGNvbnRlbnQKLSAgICAgICAgICAgIC8vIGhh
cyB0byBtb3ZlIGludG8gdGhlIGlubGluZSBjb250aW51YXRpb24uICBDYWxsIHVwZGF0ZUJlZm9y
ZUFmdGVyQ29udGVudCB0byBlbnN1cmUgdGhhdCB0aGUgaW5saW5lJ3MgOmFmdGVyCi0gICAgICAg
ICAgICAvLyBjb250ZW50IGdldHMgcHJvcGVybHkgZGVzdHJveWVkLgotICAgICAgICAgICAgaWYg
KGRvY3VtZW50KCktPnVzZXNCZWZvcmVBZnRlclJ1bGVzKCkpCi0gICAgICAgICAgICAgICAgaW5s
aW5lQ3Vyci0+Y2hpbGRyZW4oKS0+dXBkYXRlQmVmb3JlQWZ0ZXJDb250ZW50KHRoaXMsIEFGVEVS
KTsKLQotICAgICAgICAgICAgLy8gTm93IHdlIG5lZWQgdG8gdGFrZSBhbGwgb2YgdGhlIGNoaWxk
cmVuIHN0YXJ0aW5nIGZyb20gdGhlIGZpcnN0IGNoaWxkCi0gICAgICAgICAgICAvLyAqYWZ0ZXIq
IGN1cnJDaGlsZCBhbmQgYXBwZW5kIHRoZW0gYWxsIHRvIHRoZSBjbG9uZS4KLSAgICAgICAgICAg
IG8gPSBjdXJyQ2hpbGQtPm5leHRTaWJsaW5nKCk7Ci0gICAgICAgICAgICB3aGlsZSAobykgewot
ICAgICAgICAgICAgICAgIFJlbmRlck9iamVjdCogdG1wID0gbzsKLSAgICAgICAgICAgICAgICBv
ID0gdG1wLT5uZXh0U2libGluZygpOwotICAgICAgICAgICAgICAgIGNsb25lLT5hZGRDaGlsZEln
bm9yaW5nQ29udGludWF0aW9uKGlubGluZUN1cnItPmNoaWxkcmVuKCktPnJlbW92ZUNoaWxkTm9k
ZShjdXJyLCB0bXApLCAwKTsKLSAgICAgICAgICAgICAgICB0bXAtPnNldE5lZWRzTGF5b3V0QW5k
UHJlZldpZHRoc1JlY2FsYygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAot
ICAgICAgICAvLyBLZWVwIHdhbGtpbmcgdXAgdGhlIGNoYWluLgotICAgICAgICBjdXJyQ2hpbGQg
PSBjdXJyOwotICAgICAgICBjdXJyID0gdG9SZW5kZXJCb3hNb2RlbE9iamVjdChjdXJyLT5wYXJl
bnQoKSk7Ci0gICAgICAgIHNwbGl0RGVwdGgrKzsKLSAgICB9Ci0KLSAgICAvLyBOb3cgd2UgYXJl
IGF0IHRoZSBibG9jayBsZXZlbC4gV2UgbmVlZCB0byBwdXQgdGhlIGNsb25lIGludG8gdGhlIHRv
QmxvY2suCi0gICAgdG9CbG9jay0+Y2hpbGRyZW4oKS0+YXBwZW5kQ2hpbGROb2RlKHRvQmxvY2ss
IGNsb25lKTsKLQotICAgIC8vIE5vdyB0YWtlIGFsbCB0aGUgY2hpbGRyZW4gYWZ0ZXIgY3VyckNo
aWxkIGFuZCByZW1vdmUgdGhlbSBmcm9tIHRoZSBmcm9tQmxvY2sKLSAgICAvLyBhbmQgcHV0IHRo
ZW0gaW4gdGhlIHRvQmxvY2suCi0gICAgbyA9IGN1cnJDaGlsZC0+bmV4dFNpYmxpbmcoKTsKLSAg
ICB3aGlsZSAobykgewotICAgICAgICBSZW5kZXJPYmplY3QqIHRtcCA9IG87Ci0gICAgICAgIG8g
PSB0bXAtPm5leHRTaWJsaW5nKCk7Ci0gICAgICAgIHRvQmxvY2stPmNoaWxkcmVuKCktPmFwcGVu
ZENoaWxkTm9kZSh0b0Jsb2NrLCBmcm9tQmxvY2stPmNoaWxkcmVuKCktPnJlbW92ZUNoaWxkTm9k
ZShmcm9tQmxvY2ssIHRtcCkpOwotICAgIH0KLX0KLQotdm9pZCBSZW5kZXJJbmxpbmU6OnNwbGl0
RmxvdyhSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkLCBSZW5kZXJCbG9jayogbmV3QmxvY2tCb3gs
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbmRlck9iamVjdCogbmV3Q2hpbGQsIFJl
bmRlckJveE1vZGVsT2JqZWN0KiBvbGRDb250KQotewotICAgIFJlbmRlckJsb2NrKiBwcmUgPSAw
OwotICAgIFJlbmRlckJsb2NrKiBibG9jayA9IGNvbnRhaW5pbmdCbG9jaygpOwotICAgIAotICAg
IC8vIERlbGV0ZSBvdXIgbGluZSBib3hlcyBiZWZvcmUgd2UgZG8gdGhlIGlubGluZSBzcGxpdCBp
bnRvIGNvbnRpbnVhdGlvbnMuCi0gICAgYmxvY2stPmRlbGV0ZUxpbmVCb3hUcmVlKCk7Ci0gICAg
Ci0gICAgYm9vbCBtYWRlTmV3QmVmb3JlQmxvY2sgPSBmYWxzZTsKLSAgICBpZiAoYmxvY2stPmlz
QW5vbnltb3VzQmxvY2soKSAmJiAoIWJsb2NrLT5wYXJlbnQoKSB8fCAhYmxvY2stPnBhcmVudCgp
LT5jcmVhdGVzQW5vbnltb3VzV3JhcHBlcigpKSkgewotICAgICAgICAvLyBXZSBjYW4gcmV1c2Ug
dGhpcyBibG9jayBhbmQgbWFrZSBpdCB0aGUgcHJlQmxvY2sgb2YgdGhlIG5leHQgY29udGludWF0
aW9uLgotICAgICAgICBwcmUgPSBibG9jazsKLSAgICAgICAgcHJlLT5yZW1vdmVQb3NpdGlvbmVk
T2JqZWN0cygwKTsKLSAgICAgICAgYmxvY2sgPSBibG9jay0+Y29udGFpbmluZ0Jsb2NrKCk7Ci0g
ICAgfSBlbHNlIHsKLSAgICAgICAgLy8gTm8gYW5vbnltb3VzIGJsb2NrIGF2YWlsYWJsZSBmb3Ig
dXNlLiAgTWFrZSBvbmUuCi0gICAgICAgIHByZSA9IGJsb2NrLT5jcmVhdGVBbm9ueW1vdXNCbG9j
aygpOwotICAgICAgICBtYWRlTmV3QmVmb3JlQmxvY2sgPSB0cnVlOwotICAgIH0KLQotICAgIFJl
bmRlckJsb2NrKiBwb3N0ID0gYmxvY2stPmNyZWF0ZUFub255bW91c0Jsb2NrKCk7Ci0KLSAgICBS
ZW5kZXJPYmplY3QqIGJveEZpcnN0ID0gbWFkZU5ld0JlZm9yZUJsb2NrID8gYmxvY2stPmZpcnN0
Q2hpbGQoKSA6IHByZS0+bmV4dFNpYmxpbmcoKTsKLSAgICBpZiAobWFkZU5ld0JlZm9yZUJsb2Nr
KQotICAgICAgICBibG9jay0+Y2hpbGRyZW4oKS0+aW5zZXJ0Q2hpbGROb2RlKGJsb2NrLCBwcmUs
IGJveEZpcnN0KTsKLSAgICBibG9jay0+Y2hpbGRyZW4oKS0+aW5zZXJ0Q2hpbGROb2RlKGJsb2Nr
LCBuZXdCbG9ja0JveCwgYm94Rmlyc3QpOwotICAgIGJsb2NrLT5jaGlsZHJlbigpLT5pbnNlcnRD
aGlsZE5vZGUoYmxvY2ssIHBvc3QsIGJveEZpcnN0KTsKLSAgICBibG9jay0+c2V0Q2hpbGRyZW5J
bmxpbmUoZmFsc2UpOwotICAgIAotICAgIGlmIChtYWRlTmV3QmVmb3JlQmxvY2spIHsKLSAgICAg
ICAgUmVuZGVyT2JqZWN0KiBvID0gYm94Rmlyc3Q7Ci0gICAgICAgIHdoaWxlIChvKSB7Ci0gICAg
ICAgICAgICBSZW5kZXJPYmplY3QqIG5vID0gbzsKLSAgICAgICAgICAgIG8gPSBuby0+bmV4dFNp
YmxpbmcoKTsKLSAgICAgICAgICAgIHByZS0+Y2hpbGRyZW4oKS0+YXBwZW5kQ2hpbGROb2RlKHBy
ZSwgYmxvY2stPmNoaWxkcmVuKCktPnJlbW92ZUNoaWxkTm9kZShibG9jaywgbm8pKTsKLSAgICAg
ICAgICAgIG5vLT5zZXROZWVkc0xheW91dEFuZFByZWZXaWR0aHNSZWNhbGMoKTsKLSAgICAgICAg
fQotICAgIH0KLQotICAgIHNwbGl0SW5saW5lcyhwcmUsIHBvc3QsIG5ld0Jsb2NrQm94LCBiZWZv
cmVDaGlsZCwgb2xkQ29udCk7Ci0KLSAgICAvLyBXZSBhbHJlYWR5IGtub3cgdGhlIG5ld0Jsb2Nr
Qm94IGlzbid0IGdvaW5nIHRvIGNvbnRhaW4gaW5saW5lIGtpZHMsIHNvIGF2b2lkIHdhc3RpbmcK
LSAgICAvLyB0aW1lIGluIG1ha2VDaGlsZHJlbk5vbklubGluZSBieSBqdXN0IHNldHRpbmcgdGhp
cyBleHBsaWNpdGx5IHVwIGZyb250LgotICAgIG5ld0Jsb2NrQm94LT5zZXRDaGlsZHJlbklubGlu
ZShmYWxzZSk7Ci0KLSAgICAvLyBXZSBkZWxheWVkIGFkZGluZyB0aGUgbmV3Q2hpbGQgdW50aWwg
bm93IHNvIHRoYXQgdGhlIHxuZXdCbG9ja0JveHwgd291bGQgYmUgZnVsbHkKLSAgICAvLyBjb25u
ZWN0ZWQsIHRodXMgYWxsb3dpbmcgbmV3Q2hpbGQgYWNjZXNzIHRvIGEgcmVuZGVyQXJlbmEgc2hv
dWxkIGl0IG5lZWQKLSAgICAvLyB0byB3cmFwIGl0c2VsZiBpbiBhZGRpdGlvbmFsIGJveGVzIChl
LmcuLCB0YWJsZSBjb25zdHJ1Y3Rpb24pLgotICAgIG5ld0Jsb2NrQm94LT5hZGRDaGlsZChuZXdD
aGlsZCk7Ci0KLSAgICAvLyBBbHdheXMganVzdCBkbyBhIGZ1bGwgbGF5b3V0IGluIG9yZGVyIHRv
IGVuc3VyZSB0aGF0IGxpbmUgYm94ZXMgKGVzcGVjaWFsbHkgd3JhcHBlcnMgZm9yIGltYWdlcykK
LSAgICAvLyBnZXQgZGVsZXRlZCBwcm9wZXJseS4gIEJlY2F1c2Ugb2JqZWN0cyBtb3ZlcyBmcm9t
IHRoZSBwcmUgYmxvY2sgaW50byB0aGUgcG9zdCBibG9jaywgd2Ugd2FudCB0bwotICAgIC8vIG1h
a2UgbmV3IGxpbmUgYm94ZXMgaW5zdGVhZCBvZiBsZWF2aW5nIHRoZSBvbGQgbGluZSBib3hlcyBh
cm91bmQuCi0gICAgcHJlLT5zZXROZWVkc0xheW91dEFuZFByZWZXaWR0aHNSZWNhbGMoKTsKLSAg
ICBibG9jay0+c2V0TmVlZHNMYXlvdXRBbmRQcmVmV2lkdGhzUmVjYWxjKCk7Ci0gICAgcG9zdC0+
c2V0TmVlZHNMYXlvdXRBbmRQcmVmV2lkdGhzUmVjYWxjKCk7Ci19Ci0KLXZvaWQgUmVuZGVySW5s
aW5lOjphZGRDaGlsZFRvQ29udGludWF0aW9uKFJlbmRlck9iamVjdCogbmV3Q2hpbGQsIFJlbmRl
ck9iamVjdCogYmVmb3JlQ2hpbGQpCi17Ci0gICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGZsb3cg
PSBjb250aW51YXRpb25CZWZvcmUoYmVmb3JlQ2hpbGQpOwotICAgIEFTU0VSVCghYmVmb3JlQ2hp
bGQgfHwgYmVmb3JlQ2hpbGQtPnBhcmVudCgpLT5pc1JlbmRlckJsb2NrKCkgfHwgYmVmb3JlQ2hp
bGQtPnBhcmVudCgpLT5pc1JlbmRlcklubGluZSgpKTsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVj
dCogYmVmb3JlQ2hpbGRQYXJlbnQgPSAwOwotICAgIGlmIChiZWZvcmVDaGlsZCkKLSAgICAgICAg
YmVmb3JlQ2hpbGRQYXJlbnQgPSB0b1JlbmRlckJveE1vZGVsT2JqZWN0KGJlZm9yZUNoaWxkLT5w
YXJlbnQoKSk7Ci0gICAgZWxzZSB7Ci0gICAgICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBjb250
ID0gbmV4dENvbnRpbnVhdGlvbihmbG93KTsKLSAgICAgICAgaWYgKGNvbnQpCi0gICAgICAgICAg
ICBiZWZvcmVDaGlsZFBhcmVudCA9IGNvbnQ7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGJl
Zm9yZUNoaWxkUGFyZW50ID0gZmxvdzsKLSAgICB9Ci0KLSAgICBpZiAobmV3Q2hpbGQtPmlzRmxv
YXRpbmdPclBvc2l0aW9uZWQoKSkKLSAgICAgICAgcmV0dXJuIGJlZm9yZUNoaWxkUGFyZW50LT5h
ZGRDaGlsZElnbm9yaW5nQ29udGludWF0aW9uKG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7Ci0KLSAg
ICAvLyBBIGNvbnRpbnVhdGlvbiBhbHdheXMgY29uc2lzdHMgb2YgdHdvIHBvdGVudGlhbCBjYW5k
aWRhdGVzOiBhbiBpbmxpbmUgb3IgYW4gYW5vbnltb3VzCi0gICAgLy8gYmxvY2sgYm94IGhvbGRp
bmcgYmxvY2sgY2hpbGRyZW4uCi0gICAgYm9vbCBjaGlsZElubGluZSA9IG5ld0NoaWxkLT5pc0lu
bGluZSgpOwotICAgIGJvb2wgYmNwSW5saW5lID0gYmVmb3JlQ2hpbGRQYXJlbnQtPmlzSW5saW5l
KCk7Ci0gICAgYm9vbCBmbG93SW5saW5lID0gZmxvdy0+aXNJbmxpbmUoKTsKLQotICAgIGlmIChm
bG93ID09IGJlZm9yZUNoaWxkUGFyZW50KQotICAgICAgICByZXR1cm4gZmxvdy0+YWRkQ2hpbGRJ
Z25vcmluZ0NvbnRpbnVhdGlvbihuZXdDaGlsZCwgYmVmb3JlQ2hpbGQpOwotICAgIGVsc2Ugewot
ICAgICAgICAvLyBUaGUgZ29hbCBoZXJlIGlzIHRvIG1hdGNoIHVwIGlmIHdlIGNhbiwgc28gdGhh
dCB3ZSBjYW4gY29hbGVzY2UgYW5kIGNyZWF0ZSB0aGUKLSAgICAgICAgLy8gbWluaW1hbCAjIG9m
IGNvbnRpbnVhdGlvbnMgbmVlZGVkIGZvciB0aGUgaW5saW5lLgotICAgICAgICBpZiAoY2hpbGRJ
bmxpbmUgPT0gYmNwSW5saW5lKQotICAgICAgICAgICAgcmV0dXJuIGJlZm9yZUNoaWxkUGFyZW50
LT5hZGRDaGlsZElnbm9yaW5nQ29udGludWF0aW9uKG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7Ci0g
ICAgICAgIGVsc2UgaWYgKGZsb3dJbmxpbmUgPT0gY2hpbGRJbmxpbmUpCi0gICAgICAgICAgICBy
ZXR1cm4gZmxvdy0+YWRkQ2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihuZXdDaGlsZCwgMCk7IC8v
IEp1c3QgdHJlYXQgbGlrZSBhbiBhcHBlbmQuCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJl
dHVybiBiZWZvcmVDaGlsZFBhcmVudC0+YWRkQ2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihuZXdD
aGlsZCwgYmVmb3JlQ2hpbGQpOwotICAgIH0KLX0KLQogdm9pZCBSZW5kZXJJbmxpbmU6OnBhaW50
KFBhaW50SW5mbyYgcGFpbnRJbmZvLCBpbnQgdHgsIGludCB0eSkKIHsKICAgICBtX2xpbmVCb3hl
cy5wYWludCh0aGlzLCBwYWludEluZm8sIHR4LCB0eSk7CkBAIC00MTAsMTYgKzE3Nyw2IEBAIHZv
aWQgUmVuZGVySW5saW5lOjphYnNvbHV0ZVJlY3RzKFZlY3RvcjwKICAgICAgICAgICAgIHJlY3Rz
LmFwcGVuZChJbnRSZWN0KHR4ICsgY3Vyci0+eCgpLCB0eSArIGN1cnItPnkoKSwgY3Vyci0+d2lk
dGgoKSwgY3Vyci0+aGVpZ2h0KCkpKTsKICAgICB9IGVsc2UKICAgICAgICAgcmVjdHMuYXBwZW5k
KEludFJlY3QodHgsIHR5LCAwLCAwKSk7Ci0KLSAgICBpZiAoY29udGludWF0aW9uKCkpIHsKLSAg
ICAgICAgaWYgKGNvbnRpbnVhdGlvbigpLT5pc0JveCgpKSB7Ci0gICAgICAgICAgICBSZW5kZXJC
b3gqIGJveCA9IHRvUmVuZGVyQm94KGNvbnRpbnVhdGlvbigpKTsKLSAgICAgICAgICAgIGNvbnRp
bnVhdGlvbigpLT5hYnNvbHV0ZVJlY3RzKHJlY3RzLCAKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHR4IC0gY29udGFpbmluZ0Jsb2NrKCktPngoKSArIGJveC0+eCgp
LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHkgLSBjb250YWlu
aW5nQmxvY2soKS0+eSgpICsgYm94LT55KCkpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAg
IGNvbnRpbnVhdGlvbigpLT5hYnNvbHV0ZVJlY3RzKHJlY3RzLCB0eCAtIGNvbnRhaW5pbmdCbG9j
aygpLT54KCksIHR5IC0gY29udGFpbmluZ0Jsb2NrKCktPnkoKSk7Ci0gICAgfQogfQogCiB2b2lk
IFJlbmRlcklubGluZTo6YWJzb2x1dGVRdWFkcyhWZWN0b3I8RmxvYXRRdWFkPiYgcXVhZHMpCkBA
IC00MzEsOSArMTg4LDYgQEAgdm9pZCBSZW5kZXJJbmxpbmU6OmFic29sdXRlUXVhZHMoVmVjdG9y
PAogICAgICAgICB9CiAgICAgfSBlbHNlCiAgICAgICAgIHF1YWRzLmFwcGVuZChsb2NhbFRvQWJz
b2x1dGVRdWFkKEZsb2F0UmVjdCgpKSk7Ci0KLSAgICBpZiAoY29udGludWF0aW9uKCkpCi0gICAg
ICAgIGNvbnRpbnVhdGlvbigpLT5hYnNvbHV0ZVF1YWRzKHF1YWRzKTsKIH0KIAogaW50IFJlbmRl
cklubGluZTo6b2Zmc2V0TGVmdCgpIGNvbnN0CkBAIC01MDIsMTggKzI1Niw2IEBAIFZpc2libGVQ
b3NpdGlvbiBSZW5kZXJJbmxpbmU6OnBvc2l0aW9uRm8KICAgICAgICAgLy8gc2hvdWxkIHRyeSB0
byBmaW5kIGEgcmVzdWx0IGJ5IGFza2luZyBvdXIgY29udGFpbmluZyBibG9jay4KICAgICAgICAg
cmV0dXJuIGNiLT5wb3NpdGlvbkZvclBvaW50KHBvaW50KTsKICAgICB9Ci0KLSAgICAvLyBUcmFu
c2xhdGUgdGhlIGNvb3JkcyBmcm9tIHRoZSBwcmUtYW5vbnltb3VzIGJsb2NrIHRvIHRoZSBwb3N0
LWFub255bW91cyBibG9jay4KLSAgICBpbnQgcGFyZW50QmxvY2tYID0gY2ItPngoKSArIHBvaW50
LngoKTsKLSAgICBpbnQgcGFyZW50QmxvY2tZID0gY2ItPnkoKSArIHBvaW50LnkoKTsKLSAgICBS
ZW5kZXJCb3hNb2RlbE9iamVjdCogYyA9IGNvbnRpbnVhdGlvbigpOwotICAgIHdoaWxlIChjKSB7
Ci0gICAgICAgIFJlbmRlckJveCogY29udEJsb2NrID0gYy0+aXNJbmxpbmUoKSA/IGMtPmNvbnRh
aW5pbmdCbG9jaygpIDogdG9SZW5kZXJCbG9jayhjKTsKLSAgICAgICAgaWYgKGMtPmlzSW5saW5l
KCkgfHwgYy0+Zmlyc3RDaGlsZCgpKQotICAgICAgICAgICAgcmV0dXJuIGMtPnBvc2l0aW9uRm9y
Q29vcmRpbmF0ZXMocGFyZW50QmxvY2tYIC0gY29udEJsb2NrLT54KCksIHBhcmVudEJsb2NrWSAt
IGNvbnRCbG9jay0+eSgpKTsKLSAgICAgICAgYyA9IHRvUmVuZGVyQmxvY2soYyktPmlubGluZUNv
bnRpbnVhdGlvbigpOwotICAgIH0KLSAgICAKICAgICByZXR1cm4gUmVuZGVyQm94TW9kZWxPYmpl
Y3Q6OnBvc2l0aW9uRm9yUG9pbnQocG9pbnQpOwogfQogCkBAIC01NDksNyArMjkxLDcgQEAgSW50
UmVjdCBSZW5kZXJJbmxpbmU6OmNsaXBwZWRPdmVyZmxvd1JlYwogICAgIC8vIE9ubHkgcnVuLWlu
cyBhcmUgYWxsb3dlZCBpbiBoZXJlIGR1cmluZyBsYXlvdXQuCiAgICAgQVNTRVJUKCF2aWV3KCkg
fHwgIXZpZXcoKS0+bGF5b3V0U3RhdGVFbmFibGVkKCkgfHwgaXNSdW5JbigpKTsKIAotICAgIGlm
ICghZmlyc3RMaW5lQm94KCkgJiYgIWNvbnRpbnVhdGlvbigpKQorICAgIGlmICghZmlyc3RMaW5l
Qm94KCkpCiAgICAgICAgIHJldHVybiBJbnRSZWN0KCk7CiAKICAgICAvLyBGaW5kIG91ciBsZWZ0
bW9zdCBwb3NpdGlvbi4KQEAgLTU5NywxMSArMzM5LDYgQEAgSW50UmVjdCBSZW5kZXJJbmxpbmU6
OmNsaXBwZWRPdmVyZmxvd1JlYwogICAgICAgICAgICAgICAgIHIudW5pdGUoY2hpbGRSZWN0KTsK
ICAgICAgICAgICAgIH0KICAgICAgICAgfQotCi0gICAgICAgIGlmIChjb250aW51YXRpb24oKSAm
JiAhY29udGludWF0aW9uKCktPmlzSW5saW5lKCkpIHsKLSAgICAgICAgICAgIEludFJlY3QgY29u
dFJlY3QgPSBjb250aW51YXRpb24oKS0+cmVjdFdpdGhPdXRsaW5lRm9yUmVwYWludChyZXBhaW50
Q29udGFpbmVyLCBvdyk7Ci0gICAgICAgICAgICByLnVuaXRlKGNvbnRSZWN0KTsKLSAgICAgICAg
fQogICAgIH0KIAogICAgIHJldHVybiByOwpAQCAtNjgwLDQ5ICs0MTcsNiBAQCB2b2lkIFJlbmRl
cklubGluZTo6Y29tcHV0ZVJlY3RGb3JSZXBhaW50CiAgICAgby0+Y29tcHV0ZVJlY3RGb3JSZXBh
aW50KHJlcGFpbnRDb250YWluZXIsIHJlY3QsIGZpeGVkKTsKIH0KIAotdm9pZCBSZW5kZXJJbmxp
bmU6OnVwZGF0ZURyYWdTdGF0ZShib29sIGRyYWdPbikKLXsKLSAgICBSZW5kZXJCb3hNb2RlbE9i
amVjdDo6dXBkYXRlRHJhZ1N0YXRlKGRyYWdPbik7Ci0gICAgaWYgKGNvbnRpbnVhdGlvbigpKQot
ICAgICAgICBjb250aW51YXRpb24oKS0+dXBkYXRlRHJhZ1N0YXRlKGRyYWdPbik7Ci19Ci0KLXZv
aWQgUmVuZGVySW5saW5lOjpjaGlsZEJlY2FtZU5vbklubGluZShSZW5kZXJPYmplY3QqIGNoaWxk
KQotewotICAgIC8vIFdlIGhhdmUgdG8gc3BsaXQgdGhlIHBhcmVudCBmbG93LgotICAgIFJlbmRl
ckJsb2NrKiBuZXdCb3ggPSBjb250YWluaW5nQmxvY2soKS0+Y3JlYXRlQW5vbnltb3VzQmxvY2so
KTsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogb2xkQ29udGludWF0aW9uID0gY29udGludWF0
aW9uKCk7Ci0gICAgc2V0Q29udGludWF0aW9uKG5ld0JveCk7Ci0gICAgUmVuZGVyT2JqZWN0KiBi
ZWZvcmVDaGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygpOwotICAgIGNoaWxkcmVuKCktPnJlbW92
ZUNoaWxkTm9kZSh0aGlzLCBjaGlsZCk7Ci0gICAgc3BsaXRGbG93KGJlZm9yZUNoaWxkLCBuZXdC
b3gsIGNoaWxkLCBvbGRDb250aW51YXRpb24pOwotfQotCi12b2lkIFJlbmRlcklubGluZTo6dXBk
YXRlSGl0VGVzdFJlc3VsdChIaXRUZXN0UmVzdWx0JiByZXN1bHQsIGNvbnN0IEludFBvaW50JiBw
b2ludCkKLXsKLSAgICBpZiAocmVzdWx0LmlubmVyTm9kZSgpKQotICAgICAgICByZXR1cm47Ci0K
LSAgICBOb2RlKiBuID0gbm9kZSgpOwotICAgIEludFBvaW50IGxvY2FsUG9pbnQocG9pbnQpOwot
ICAgIGlmIChuKSB7Ci0gICAgICAgIGlmIChpc0lubGluZUNvbnRpbnVhdGlvbigpKSB7Ci0gICAg
ICAgICAgICAvLyBXZSdyZSBpbiB0aGUgY29udGludWF0aW9uIG9mIGEgc3BsaXQgaW5saW5lLiAg
QWRqdXN0IG91ciBsb2NhbCBwb2ludCB0byBiZSBpbiB0aGUgY29vcmRpbmF0ZSBzcGFjZQotICAg
ICAgICAgICAgLy8gb2YgdGhlIHByaW5jaXBhbCByZW5kZXJlcidzIGNvbnRhaW5pbmcgYmxvY2su
ICBUaGlzIHdpbGwgZW5kIHVwIGJlaW5nIHRoZSBpbm5lck5vblNoYXJlZE5vZGUuCi0gICAgICAg
ICAgICBSZW5kZXJCbG9jayogZmlyc3RCbG9jayA9IG4tPnJlbmRlcmVyKCktPmNvbnRhaW5pbmdC
bG9jaygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBHZXQgb3VyIGNvbnRhaW5pbmcg
YmxvY2suCi0gICAgICAgICAgICBSZW5kZXJCb3gqIGJsb2NrID0gY29udGFpbmluZ0Jsb2NrKCk7
Ci0gICAgICAgICAgICBsb2NhbFBvaW50Lm1vdmUoYmxvY2stPngoKSAtIGZpcnN0QmxvY2stPngo
KSwgYmxvY2stPnkoKSAtIGZpcnN0QmxvY2stPnkoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBy
ZXN1bHQuc2V0SW5uZXJOb2RlKG4pOwotICAgICAgICBpZiAoIXJlc3VsdC5pbm5lck5vblNoYXJl
ZE5vZGUoKSkKLSAgICAgICAgICAgIHJlc3VsdC5zZXRJbm5lck5vblNoYXJlZE5vZGUobik7Ci0g
ICAgICAgIHJlc3VsdC5zZXRMb2NhbFBvaW50KGxvY2FsUG9pbnQpOwotICAgIH0KLX0KLQogdm9p
ZCBSZW5kZXJJbmxpbmU6OmRpcnR5TGluZUJveGVzKGJvb2wgZnVsbExheW91dCkKIHsKICAgICBp
ZiAoZnVsbExheW91dCkKQEAgLTgzNiwxNyArNTMwLDYgQEAgdm9pZCBSZW5kZXJJbmxpbmU6OmFk
ZEZvY3VzUmluZ1JlY3RzKEdyYQogICAgICAgICAgICBjdXJyLT5hZGRGb2N1c1JpbmdSZWN0cyhn
cmFwaGljc0NvbnRleHQsIHBvcy54KCksIHBvcy55KCkpOwogICAgICAgICB9CiAgICAgfQotCi0g
ICAgaWYgKGNvbnRpbnVhdGlvbigpKSB7Ci0gICAgICAgIGlmIChjb250aW51YXRpb24oKS0+aXNJ
bmxpbmUoKSkKLSAgICAgICAgICAgIGNvbnRpbnVhdGlvbigpLT5hZGRGb2N1c1JpbmdSZWN0cyhn
cmFwaGljc0NvbnRleHQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHR4IC0gY29udGFpbmluZ0Jsb2NrKCktPngoKSArIGNvbnRpbnVhdGlvbigpLT5jb250
YWluaW5nQmxvY2soKS0+eCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHR5IC0gY29udGFpbmluZ0Jsb2NrKCktPnkoKSArIGNvbnRpbnVhdGlvbigpLT5j
b250YWluaW5nQmxvY2soKS0+eSgpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgY29udGlu
dWF0aW9uKCktPmFkZEZvY3VzUmluZ1JlY3RzKGdyYXBoaWNzQ29udGV4dCwgCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHggLSBjb250YWluaW5nQmxvY2so
KS0+eCgpICsgdG9SZW5kZXJCb3goY29udGludWF0aW9uKCkpLT54KCksCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHkgLSBjb250YWluaW5nQmxvY2soKS0+
eSgpICsgdG9SZW5kZXJCb3goY29udGludWF0aW9uKCkpLT55KCkpOwotICAgIH0KIH0KIAogdm9p
ZCBSZW5kZXJJbmxpbmU6OnBhaW50T3V0bGluZShHcmFwaGljc0NvbnRleHQqIGdyYXBoaWNzQ29u
dGV4dCwgaW50IHR4LCBpbnQgdHkpCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJJbmxp
bmUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJJbmxpbmUuaAkocmV2
aXNpb24gNDc1OTEpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJJbmxpbmUuaAkod29ya2lu
ZyBjb3B5KQpAQCAtNTUsMTAgKzU1LDYgQEAgcHVibGljOgogCiAgICAgSW5saW5lRmxvd0JveCog
Zmlyc3RMaW5lQm94KCkgY29uc3QgeyByZXR1cm4gbV9saW5lQm94ZXMuZmlyc3RMaW5lQm94KCk7
IH0KICAgICBJbmxpbmVGbG93Qm94KiBsYXN0TGluZUJveCgpIGNvbnN0IHsgcmV0dXJuIG1fbGlu
ZUJveGVzLmxhc3RMaW5lQm94KCk7IH0KLQotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBjb250
aW51YXRpb24oKSBjb25zdCB7IHJldHVybiBtX2NvbnRpbnVhdGlvbjsgfQotCi0gICAgdmlydHVh
bCB2b2lkIHVwZGF0ZURyYWdTdGF0ZShib29sIGRyYWdPbik7CiAgICAgCiAgICAgSW50U2l6ZSBy
ZWxhdGl2ZVBvc2l0aW9uZWRJbmxpbmVPZmZzZXQoY29uc3QgUmVuZGVyQm94KiBjaGlsZCkgY29u
c3Q7CiAKQEAgLTc4LDkgKzc0LDYgQEAgcHJpdmF0ZToKIAogICAgIHZpcnR1YWwgYm9vbCBpc1Jl
bmRlcklubGluZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KIAotICAgIHZvaWQgYWRkQ2hpbGRU
b0NvbnRpbnVhdGlvbihSZW5kZXJPYmplY3QqIG5ld0NoaWxkLCBSZW5kZXJPYmplY3QqIGJlZm9y
ZUNoaWxkKTsKLSAgICB2aXJ0dWFsIHZvaWQgYWRkQ2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihS
ZW5kZXJPYmplY3QqIG5ld0NoaWxkLCBSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkID0gMCk7Ci0K
ICAgICB2b2lkIHNwbGl0SW5saW5lcyhSZW5kZXJCbG9jayogZnJvbUJsb2NrLCBSZW5kZXJCbG9j
ayogdG9CbG9jaywgUmVuZGVyQmxvY2sqIG1pZGRsZUJsb2NrLAogICAgICAgICAgICAgICAgICAg
ICAgIFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQsIFJlbmRlckJveE1vZGVsT2JqZWN0KiBvbGRD
b250KTsKICAgICB2b2lkIHNwbGl0RmxvdyhSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkLCBSZW5k
ZXJCbG9jayogbmV3QmxvY2tCb3gsCkBAIC0xMjAsMTMgKzExMyw2IEBAIHByaXZhdGU6CiAKICAg
ICB2aXJ0dWFsIGludCBsaW5lSGVpZ2h0KGJvb2wgZmlyc3RMaW5lLCBib29sIGlzUm9vdExpbmVC
b3ggPSBmYWxzZSkgY29uc3Q7CiAKLSAgICBSZW5kZXJJbmxpbmUqIGlubGluZUNvbnRpbnVhdGlv
bigpIGNvbnN0OwotICAgIHZvaWQgc2V0Q29udGludWF0aW9uKFJlbmRlckJveE1vZGVsT2JqZWN0
KiBjKSB7IG1fY29udGludWF0aW9uID0gYzsgfQotICAgIAotICAgIHZpcnR1YWwgdm9pZCBjaGls
ZEJlY2FtZU5vbklubGluZShSZW5kZXJPYmplY3QqIGNoaWxkKTsKLQotICAgIHZpcnR1YWwgdm9p
ZCB1cGRhdGVIaXRUZXN0UmVzdWx0KEhpdFRlc3RSZXN1bHQmLCBjb25zdCBJbnRQb2ludCYpOwot
CiAgICAgdmlydHVhbCB2b2lkIGltYWdlQ2hhbmdlZChXcmFwcGVkSW1hZ2VQdHIsIGNvbnN0IElu
dFJlY3QqID0gMCk7CiAKICNpZiBFTkFCTEUoREFTSEJPQVJEX1NVUFBPUlQpCkBAIC0xMzksMTMg
KzEyNSwxMCBAQCBwcml2YXRlOgogICAgIHN0YXRpYyBSZW5kZXJJbmxpbmUqIGNsb25lSW5saW5l
KFJlbmRlcklubGluZSogc3JjKTsKIAogICAgIHZvaWQgcGFpbnRPdXRsaW5lRm9yTGluZShHcmFw
aGljc0NvbnRleHQqLCBpbnQgdHgsIGludCB0eSwgY29uc3QgSW50UmVjdCYgcHJldkxpbmUsIGNv
bnN0IEludFJlY3QmIHRoaXNMaW5lLCBjb25zdCBJbnRSZWN0JiBuZXh0TGluZSk7Ci0gICAgUmVu
ZGVyQm94TW9kZWxPYmplY3QqIGNvbnRpbnVhdGlvbkJlZm9yZShSZW5kZXJPYmplY3QqIGJlZm9y
ZUNoaWxkKTsKIAogICAgIFJlbmRlck9iamVjdENoaWxkTGlzdCBtX2NoaWxkcmVuOwogICAgIFJl
bmRlckxpbmVCb3hMaXN0IG1fbGluZUJveGVzOyAgIC8vIEFsbCBvZiB0aGUgbGluZSBib3hlcyBj
cmVhdGVkIGZvciB0aGlzIGlubGluZSBmbG93LiAgRm9yIGV4YW1wbGUsIDxpPkhlbGxvPGJyPndv
cmxkLjwvaT4gd2lsbCBoYXZlIHR3byA8aT4gbGluZSBib3hlcy4KIAotICAgIFJlbmRlckJveE1v
ZGVsT2JqZWN0KiBtX2NvbnRpbnVhdGlvbjsgLy8gQ2FuIGJlIGVpdGhlciBhIGJsb2NrIG9yIGFu
IGlubGluZS4gPGI+PGk+PHA+SGVsbG88L3A+PC9pPjwvYj4uIEluIHRoaXMgZXhhbXBsZSB0aGUg
PGk+IHdpbGwgaGF2ZSBhIGJsb2NrIGFzIGl0cyBjb250aW51YXRpb24gYnV0IHRoZQotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPGI+IHdpbGwganVzdCBoYXZl
IGFuIGlubGluZSBhcyBpdHMgY29udGludWF0aW9uLgogICAgIG11dGFibGUgaW50IG1fbGluZUhl
aWdodDsKICAgICBtdXRhYmxlIGludCBtX3ZlcnRpY2FsUG9zaXRpb247CiB9OwpJbmRleDogV2Vi
Q29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3Jl
bmRlcmluZy9SZW5kZXJPYmplY3QuY3BwCShyZXZpc2lvbiA0NzU5MSkKKysrIFdlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlck9iamVjdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIxMTIsOCArMjExMiw2
IEBAIHZvaWQgUmVuZGVyT2JqZWN0OjpnZXRUZXh0RGVjb3JhdGlvbkNvbG8KICAgICAgICAgICAg
IH0KICAgICAgICAgfQogICAgICAgICBjdXJyID0gY3Vyci0+cGFyZW50KCk7Ci0gICAgICAgIGlm
IChjdXJyICYmIGN1cnItPmlzUmVuZGVyQmxvY2soKSAmJiB0b1JlbmRlckJsb2NrKGN1cnIpLT5p
bmxpbmVDb250aW51YXRpb24oKSkKLSAgICAgICAgICAgIGN1cnIgPSB0b1JlbmRlckJsb2NrKGN1
cnIpLT5pbmxpbmVDb250aW51YXRpb24oKTsKICAgICB9IHdoaWxlIChjdXJyICYmIGRlY29yYXRp
b25zICYmICghcXVpcmtzTW9kZSB8fCAhY3Vyci0+bm9kZSgpIHx8CiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgKCFjdXJyLT5ub2RlKCktPmhhc1RhZ05hbWUoYVRhZykgJiYg
IWN1cnItPm5vZGUoKS0+aGFzVGFnTmFtZShmb250VGFnKSkpKTsKIApJbmRleDogV2ViQ29yZS9y
ZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcv
UmVuZGVyT2JqZWN0LmgJKHJldmlzaW9uIDQ3NTkxKQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUmVu
ZGVyT2JqZWN0LmgJKHdvcmtpbmcgY29weSkKQEAgLTM0Myw2ICszNDMsMTAgQEAgcHVibGljOgog
ICAgIHsKICAgICAgICAgcmV0dXJuIG1faXNBbm9ueW1vdXMgJiYgc3R5bGUoKS0+ZGlzcGxheSgp
ID09IEJMT0NLICYmIHN0eWxlKCktPnN0eWxlVHlwZSgpID09IE5PUFNFVURPICYmICFpc0xpc3RN
YXJrZXIoKTsKICAgICB9CisgICAgYm9vbCBpc0Fub255bW91c0lubGluZUJsb2NrKCkgY29uc3QK
KyAgICB7CisgICAgICAgIHJldHVybiBtX2lzQW5vbnltb3VzICYmIHN0eWxlKCktPmRpc3BsYXko
KSA9PSBJTkxJTkVfQkxPQ0sgJiYgc3R5bGUoKS0+c3R5bGVUeXBlKCkgPT0gTk9QU0VVRE87Cisg
ICAgfQogICAgIGJvb2wgaXNJbmxpbmVDb250aW51YXRpb24oKSBjb25zdCB7IHJldHVybiAobm9k
ZSgpID8gbm9kZSgpLT5yZW5kZXJlcigpICE9IHRoaXMgOiBmYWxzZSkgJiYgaXNSZW5kZXJJbmxp
bmUoKTsgfQogICAgIGJvb2wgaXNGbG9hdGluZygpIGNvbnN0IHsgcmV0dXJuIG1fZmxvYXRpbmc7
IH0KICAgICBib29sIGlzUG9zaXRpb25lZCgpIGNvbnN0IHsgcmV0dXJuIG1fcG9zaXRpb25lZDsg
fSAvLyBhYnNvbHV0ZSBvciBmaXhlZCBwb3NpdGlvbmluZwpJbmRleDogV2ViQ29yZS9yZW5kZXJp
bmcvUmVuZGVyT2JqZWN0Q2hpbGRMaXN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRl
cmluZy9SZW5kZXJPYmplY3RDaGlsZExpc3QuY3BwCShyZXZpc2lvbiA0NzU5MSkKKysrIFdlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdENoaWxkTGlzdC5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTMxMSwxNiArMzExLDYgQEAgdm9pZCBSZW5kZXJPYmplY3RDaGlsZExpc3Q6OnVwZGF0ZUJlZm9y
ZQogCiAgICAgLy8gV2hldGhlciBvciBub3Qgd2Ugbm93IHdhbnQgZ2VuZXJhdGVkIGNvbnRlbnQu
ICAKICAgICBib29sIG5ld0NvbnRlbnRXYW50ZWQgPSBwc2V1ZG9FbGVtZW50U3R5bGUgJiYgcHNl
dWRvRWxlbWVudFN0eWxlLT5kaXNwbGF5KCkgIT0gTk9ORTsKLQotICAgIC8vIEZvciA8cT48cC8+
PC9xPiwgaWYgdGhpcyBvYmplY3QgaXMgdGhlIGlubGluZSBjb250aW51YXRpb24gb2YgdGhlIDxx
Piwgd2Ugb25seSB3YW50IHRvIGdlbmVyYXRlCi0gICAgLy8gOmFmdGVyIGNvbnRlbnQgYW5kIG5v
dCA6YmVmb3JlIGNvbnRlbnQuCi0gICAgaWYgKG5ld0NvbnRlbnRXYW50ZWQgJiYgdHlwZSA9PSBC
RUZPUkUgJiYgb3duZXItPmlzUmVuZGVySW5saW5lKCkgJiYgdG9SZW5kZXJJbmxpbmUob3duZXIp
LT5pc0lubGluZUNvbnRpbnVhdGlvbigpKQotICAgICAgICBuZXdDb250ZW50V2FudGVkID0gZmFs
c2U7Ci0KLSAgICAvLyBTaW1pbGFybHksIGlmIHdlJ3JlIHRoZSBiZWdpbm5pbmcgb2YgYSA8cT4s
IGFuZCB0aGVyZSdzIGFuIGlubGluZSBjb250aW51YXRpb24gZm9yIG91ciBvYmplY3QsCi0gICAg
Ly8gdGhlbiB3ZSBkb24ndCBnZW5lcmF0ZSB0aGUgOmFmdGVyIGNvbnRlbnQuCi0gICAgaWYgKG5l
d0NvbnRlbnRXYW50ZWQgJiYgdHlwZSA9PSBBRlRFUiAmJiBvd25lci0+aXNSZW5kZXJJbmxpbmUo
KSAmJiB0b1JlbmRlcklubGluZShvd25lciktPmNvbnRpbnVhdGlvbigpKQotICAgICAgICBuZXdD
b250ZW50V2FudGVkID0gZmFsc2U7CiAgICAgCiAgICAgLy8gSWYgd2UgZG9uJ3Qgd2FudCBnZW5l
cmF0ZWQgY29udGVudCBhbnkgbG9uZ2VyLCBvciBpZiB3ZSBoYXZlIGdlbmVyYXRlZCBjb250ZW50
LCBidXQgaXQncyBubyBsb25nZXIKICAgICAvLyBpZGVudGljYWwgdG8gdGhlIG5ldyBjb250ZW50
IGRhdGEgd2Ugd2FudCB0byBidWlsZCByZW5kZXIgb2JqZWN0cyBmb3IsIHRoZW4gd2UgbnVrZSBh
bGwKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1Jvb3RJbmxpbmVCb3guY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvcmVuZGVyaW5nL1Jvb3RJbmxpbmVCb3guY3BwCShyZXZpc2lvbiA0NzU5MSkK
KysrIFdlYkNvcmUvcmVuZGVyaW5nL1Jvb3RJbmxpbmVCb3guY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0yMDMsNiArMjAzLDE3IEBAIHZvaWQgUm9vdElubGluZUJveDo6Y2hpbGRSZW1vdmVkKElubGlu
ZUIKIAogaW50IFJvb3RJbmxpbmVCb3g6OnZlcnRpY2FsbHlBbGlnbkJveGVzKGludCBoZWlnaHRP
ZkJsb2NrKQogeworICAgIFJlbmRlckJsb2NrKiBpbmxpbmVCbG9jayA9IGFub255bW91c0lubGlu
ZUJsb2NrKCk7CisgICAgaWYgKGlubGluZUJsb2NrKSB7CisgICAgICAgIGludCBsaW5lVG9wID0g
aW5saW5lQmxvY2stPnkoKTsKKyAgICAgICAgaW50IGxpbmVCb3R0b20gPSBpbmxpbmVCbG9jay0+
eSgpICsgaW5saW5lQmxvY2stPmhlaWdodCgpOworICAgICAgICBmaXJzdENoaWxkKCktPnNldFko
bGluZVRvcCk7CisgICAgICAgIHNldFkobGluZVRvcCk7CisgICAgICAgIGNvbXB1dGVWZXJ0aWNh
bE92ZXJmbG93KGxpbmVUb3AsIGxpbmVCb3R0b20sIHRydWUpOworICAgICAgICBzZXRMaW5lVG9w
Qm90dG9tUG9zaXRpb25zKGxpbmVUb3AsIGxpbmVCb3R0b20pOworICAgICAgICByZXR1cm4gaGVp
Z2h0T2ZCbG9jazsKKyAgICB9CisgICAgCiAgICAgaW50IG1heFBvc2l0aW9uVG9wID0gMDsKICAg
ICBpbnQgbWF4UG9zaXRpb25Cb3R0b20gPSAwOwogICAgIGludCBtYXhBc2NlbnQgPSAwOwpAQCAt
MjE2LDcgKzIyNyw2IEBAIGludCBSb290SW5saW5lQm94Ojp2ZXJ0aWNhbGx5QWxpZ25Cb3hlcygK
ICAgICBib29sIHN0cmljdE1vZGUgPSAoY3VyciAmJiBjdXJyLT5kb2N1bWVudCgpLT5pblN0cmlj
dE1vZGUoKSk7CiAKICAgICBjb21wdXRlTG9naWNhbEJveEhlaWdodHMobWF4UG9zaXRpb25Ub3As
IG1heFBvc2l0aW9uQm90dG9tLCBtYXhBc2NlbnQsIG1heERlc2NlbnQsIHN0cmljdE1vZGUpOwot
CiAgICAgaWYgKG1heEFzY2VudCArIG1heERlc2NlbnQgPCBtYXgobWF4UG9zaXRpb25Ub3AsIG1h
eFBvc2l0aW9uQm90dG9tKSkKICAgICAgICAgYWRqdXN0TWF4QXNjZW50QW5kRGVzY2VudChtYXhB
c2NlbnQsIG1heERlc2NlbnQsIG1heFBvc2l0aW9uVG9wLCBtYXhQb3NpdGlvbkJvdHRvbSk7CiAK
QEAgLTQyOSw0ICs0MzksOSBAQCB2b2lkIFJvb3RJbmxpbmVCb3g6OmF0dGFjaExpbmVCb3hUb1Jl
bmRlCiAgICAgYmxvY2soKS0+bGluZUJveGVzKCktPmF0dGFjaExpbmVCb3godGhpcyk7CiB9CiAK
K1JlbmRlckJsb2NrKiBSb290SW5saW5lQm94Ojphbm9ueW1vdXNJbmxpbmVCbG9jaygpIGNvbnN0
Cit7CisgICAgcmV0dXJuIGZpcnN0Q2hpbGQoKSAmJiBmaXJzdENoaWxkKCkgPT0gbGFzdENoaWxk
KCkgJiYgIWZpcnN0Q2hpbGQoKS0+aXNUZXh0KCkgJiYgZmlyc3RDaGlsZCgpLT5yZW5kZXJlcigp
LT5pc0Fub255bW91c0lubGluZUJsb2NrKCkgPyB0b1JlbmRlckJsb2NrKGZpcnN0Q2hpbGQoKS0+
cmVuZGVyZXIoKSkgOiAwOworfQorCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJD
b3JlL3JlbmRlcmluZy9Sb290SW5saW5lQm94LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5k
ZXJpbmcvUm9vdElubGluZUJveC5oCShyZXZpc2lvbiA0NzU5MSkKKysrIFdlYkNvcmUvcmVuZGVy
aW5nL1Jvb3RJbmxpbmVCb3guaAkod29ya2luZyBjb3B5KQpAQCAtMTM0LDYgKzEzNCw4IEBAIHB1
YmxpYzoKICAgICB2aXJ0dWFsIHZvaWQgYXR0YWNoTGluZUJveFRvUmVuZGVyT2JqZWN0KCk7CiAg
ICAgdmlydHVhbCB2b2lkIHJlbW92ZUxpbmVCb3hGcm9tUmVuZGVyT2JqZWN0KCk7CiAKKyAgICBS
ZW5kZXJCbG9jayogYW5vbnltb3VzSW5saW5lQmxvY2soKSBjb25zdDsKKwogcHJvdGVjdGVkOgog
ICAgIC8vIFdoZXJlIHRoaXMgbGluZSBlbmRlZC4gIFRoZSBleGFjdCBvYmplY3QgYW5kIHRoZSBw
b3NpdGlvbiB3aXRoaW4gdGhhdCBvYmplY3QgYXJlIHN0b3JlZCBzbyB0aGF0CiAgICAgLy8gd2Ug
Y2FuIGNyZWF0ZSBhbiBJbmxpbmVJdGVyYXRvciBiZWdpbm5pbmcganVzdCBhZnRlciB0aGUgZW5k
IG9mIHRoaXMgbGluZS4K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>38441</attachid>
            <date>2009-08-22 19:32:47 -0700</date>
            <delta_ts>2009-08-22 21:24:22 -0700</delta_ts>
            <desc>001-031.html now pass.</desc>
            <filename>patch.txt</filename>
            <type>text/plain</type>
            <size>74245</size>
            <attacher name="Dave Hyatt">hyatt</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0LmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eVJlbmRl
ck9iamVjdC5jcHAJKHJldmlzaW9uIDQ3NTkxKQorKysgV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0Fj
Y2Vzc2liaWxpdHlSZW5kZXJPYmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01MjMsMTIgKzUy
Myw4IEBAIEVsZW1lbnQqIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmFuY2gKICAgICBSZW5k
ZXJPYmplY3QqIGN1cnJSZW5kZXJlcjsKICAgICAKICAgICAvLyBTZWFyY2ggdXAgdGhlIHJlbmRl
ciB0cmVlIGZvciBhIFJlbmRlck9iamVjdCB3aXRoIGEgRE9NIG5vZGUuICBEZWZlciB0byBhbiBl
YXJsaWVyIGNvbnRpbnVhdGlvbiwgdGhvdWdoLgotICAgIGZvciAoY3VyclJlbmRlcmVyID0gbV9y
ZW5kZXJlcjsgY3VyclJlbmRlcmVyICYmICFjdXJyUmVuZGVyZXItPm5vZGUoKTsgY3VyclJlbmRl
cmVyID0gY3VyclJlbmRlcmVyLT5wYXJlbnQoKSkgewotICAgICAgICBpZiAoY3VyclJlbmRlcmVy
LT5pc1JlbmRlckJsb2NrKCkpIHsKLSAgICAgICAgICAgIFJlbmRlcklubGluZSogY29udGludWF0
aW9uID0gdG9SZW5kZXJCbG9jayhjdXJyUmVuZGVyZXIpLT5pbmxpbmVDb250aW51YXRpb24oKTsK
LSAgICAgICAgICAgIGlmIChjb250aW51YXRpb24pCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNh
Y2hlLT5nZXRPckNyZWF0ZShjb250aW51YXRpb24pLT5hbmNob3JFbGVtZW50KCk7Ci0gICAgICAg
IH0KKyAgICBmb3IgKGN1cnJSZW5kZXJlciA9IG1fcmVuZGVyZXI7IGN1cnJSZW5kZXJlciAmJiAh
Y3VyclJlbmRlcmVyLT5ub2RlKCk7IGN1cnJSZW5kZXJlciA9IGN1cnJSZW5kZXJlci0+cGFyZW50
KCkpCisgICAgewogICAgIH0KICAgICAKICAgICAvLyBiYWlsIGlmIG5vbmUgZm91bmQKSW5kZXg6
IFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUZsb3dCb3guY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvcmVuZGVyaW5nL0lubGluZUZsb3dCb3guY3BwCShyZXZpc2lvbiA0NzU5MSkKKysrIFdlYkNv
cmUvcmVuZGVyaW5nL0lubGluZUZsb3dCb3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMjcsMTQg
KzIyNywxMyBAQCB2b2lkIElubGluZUZsb3dCb3g6OmRldGVybWluZVNwYWNpbmdGb3JGCiAgICAg
ICAgIC8vICgzKSBUaGUgbGluZSBtYXkgZW5kIG9uIHRoZSBpbmxpbmUuICBJZiB3ZSBhcmUgdGhl
IGxhc3QgY2hpbGQgKGNsaW1iaW5nIHVwCiAgICAgICAgIC8vIHRoZSBlbmQgb2JqZWN0J3MgY2hh
aW4pLCB0aGVuIHdlIGp1c3QgY2xvc2VkIGFzIHdlbGwuCiAgICAgICAgIGlmICghbGluZUJveExp
c3QtPmxhc3RMaW5lQm94KCktPmlzQ29uc3RydWN0ZWQoKSkgewotICAgICAgICAgICAgUmVuZGVy
SW5saW5lKiBpbmxpbmVGbG93ID0gdG9SZW5kZXJJbmxpbmUocmVuZGVyZXIoKSk7CiAgICAgICAg
ICAgICBpZiAobHRyKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFuZXh0TGluZUJveCgpICYmCi0g
ICAgICAgICAgICAgICAgICAgICgobGFzdExpbmUgJiYgIWlubGluZUZsb3ctPmNvbnRpbnVhdGlv
bigpKSB8fCBuZXh0T25MaW5lRXhpc3RzKCkgfHwgb25FbmRDaGFpbihlbmRPYmplY3QpKSkKKyAg
ICAgICAgICAgICAgICAgICAgKGxhc3RMaW5lIHx8IG5leHRPbkxpbmVFeGlzdHMoKSB8fCBvbkVu
ZENoYWluKGVuZE9iamVjdCkpKQogICAgICAgICAgICAgICAgICAgICBpbmNsdWRlUmlnaHRFZGdl
ID0gdHJ1ZTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKCghcHJl
dkxpbmVCb3goKSB8fCBwcmV2TGluZUJveCgpLT5pc0NvbnN0cnVjdGVkKCkpICYmCi0gICAgICAg
ICAgICAgICAgICAgICgobGFzdExpbmUgJiYgIWlubGluZUZsb3ctPmNvbnRpbnVhdGlvbigpKSB8
fCBwcmV2T25MaW5lRXhpc3RzKCkgfHwgb25FbmRDaGFpbihlbmRPYmplY3QpKSkKKyAgICAgICAg
ICAgICAgICAgICAgKGxhc3RMaW5lIHx8IHByZXZPbkxpbmVFeGlzdHMoKSB8fCBvbkVuZENoYWlu
KGVuZE9iamVjdCkpKQogICAgICAgICAgICAgICAgICAgICBpbmNsdWRlTGVmdEVkZ2UgPSB0cnVl
OwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC01MDQsNyArNTAzLDcgQEAgdm9pZCBJbmxp
bmVGbG93Qm94OjpwbGFjZUJveGVzVmVydGljYWxseQogICAgICAgICAgICAgICAgIG5ld1kgLT0g
Y3Vyci0+Ym94TW9kZWxPYmplY3QoKS0+Ym9yZGVyVG9wKCkgKyBjdXJyLT5ib3hNb2RlbE9iamVj
dCgpLT5wYWRkaW5nVG9wKCk7CiAgICAgICAgIH0gZWxzZSBpZiAoIWN1cnItPnJlbmRlcmVyKCkt
PmlzQlIoKSkgewogICAgICAgICAgICAgUmVuZGVyQm94KiBib3ggPSB0b1JlbmRlckJveChjdXJy
LT5yZW5kZXJlcigpKTsKLSAgICAgICAgICAgIG5ld1kgKz0gYm94LT5tYXJnaW5Ub3AoKTsKKyAg
ICAgICAgICAgIG5ld1kgKz0gY3Vyci0+cmVuZGVyZXIoKS0+aXNBbm9ueW1vdXNJbmxpbmVCbG9j
aygpID8gMCA6IGJveC0+bWFyZ2luVG9wKCk7CiAgICAgICAgIH0KIAogICAgICAgICBjdXJyLT5z
ZXRZKG5ld1kpOwpAQCAtNjQzLDEzICs2NDIsNyBAQCB2b2lkIElubGluZUZsb3dCb3g6OnBhaW50
KFJlbmRlck9iamVjdDo6CiAgICAgICAgICAgICAvLyBvdXRsaW5lcy4KICAgICAgICAgICAgIGlm
IChyZW5kZXJlcigpLT5zdHlsZSgpLT52aXNpYmlsaXR5KCkgPT0gVklTSUJMRSAmJiByZW5kZXJl
cigpLT5oYXNPdXRsaW5lKCkgJiYgIWlzUm9vdElubGluZUJveCgpKSB7CiAgICAgICAgICAgICAg
ICAgUmVuZGVySW5saW5lKiBpbmxpbmVGbG93ID0gdG9SZW5kZXJJbmxpbmUocmVuZGVyZXIoKSk7
Ci0gICAgICAgICAgICAgICAgaWYgKChpbmxpbmVGbG93LT5jb250aW51YXRpb24oKSB8fCBpbmxp
bmVGbG93LT5pc0lubGluZUNvbnRpbnVhdGlvbigpKSAmJiAhYm94TW9kZWxPYmplY3QoKS0+aGFz
U2VsZlBhaW50aW5nTGF5ZXIoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBBZGQgb3Vyc2Vs
dmVzIHRvIHRoZSBjb250YWluaW5nIGJsb2NrIG9mIHRoZSBlbnRpcmUgY29udGludWF0aW9uIHNv
IHRoYXQgaXQgY2FuCi0gICAgICAgICAgICAgICAgICAgIC8vIHBhaW50IHVzIGF0b21pY2FsbHku
Ci0gICAgICAgICAgICAgICAgICAgIFJlbmRlckJsb2NrKiBibG9jayA9IHJlbmRlcmVyKCktPmNv
bnRhaW5pbmdCbG9jaygpLT5jb250YWluaW5nQmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAg
YmxvY2stPmFkZENvbnRpbnVhdGlvbldpdGhPdXRsaW5lKHRvUmVuZGVySW5saW5lKHJlbmRlcmVy
KCktPm5vZGUoKS0+cmVuZGVyZXIoKSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlu
bGluZUZsb3ctPmlzSW5saW5lQ29udGludWF0aW9uKCkpCi0gICAgICAgICAgICAgICAgICAgIHBh
aW50SW5mby5vdXRsaW5lT2JqZWN0cy0+YWRkKGlubGluZUZsb3cpOworICAgICAgICAgICAgICAg
IHBhaW50SW5mby5vdXRsaW5lT2JqZWN0cy0+YWRkKGlubGluZUZsb3cpOwogICAgICAgICAgICAg
fQogICAgICAgICB9IGVsc2UgaWYgKHBhaW50SW5mby5waGFzZSA9PSBQYWludFBoYXNlTWFzaykg
ewogICAgICAgICAgICAgcGFpbnRNYXNrKHBhaW50SW5mbywgdHgsIHR5KTsKSW5kZXg6IFdlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRl
cmluZy9SZW5kZXJCbG9jay5jcHAJKHJldmlzaW9uIDQ3Njc4KQorKysgV2ViQ29yZS9yZW5kZXJp
bmcvUmVuZGVyQmxvY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC04Miw4ICs4Miw2IEBAIHN0YXRp
YyBQZXJjZW50SGVpZ2h0RGVzY2VuZGFudHNNYXAqIGdQZXIKIAogdHlwZWRlZiBXVEY6Okhhc2hN
YXA8Y29uc3QgUmVuZGVyQm94KiwgSGFzaFNldDxSZW5kZXJCbG9jayo+Kj4gUGVyY2VudEhlaWdo
dENvbnRhaW5lck1hcDsKIHN0YXRpYyBQZXJjZW50SGVpZ2h0Q29udGFpbmVyTWFwKiBnUGVyY2Vu
dEhlaWdodENvbnRhaW5lck1hcCA9IDA7Ci0gICAgCi10eXBlZGVmIFdURjo6SGFzaE1hcDxSZW5k
ZXJCbG9jayosIExpc3RIYXNoU2V0PFJlbmRlcklubGluZSo+Kj4gQ29udGludWF0aW9uT3V0bGlu
ZVRhYmxlTWFwOwogCiB0eXBlZGVmIFdURjo6SGFzaFNldDxSZW5kZXJCbG9jayo+IERlbGF5ZWRV
cGRhdGVTY3JvbGxJbmZvU2V0Owogc3RhdGljIGludCBnRGVsYXlVcGRhdGVTY3JvbGxJbmZvID0g
MDsKQEAgLTk2LDcgKzk0LDcgQEAgUmVuZGVyQmxvY2s6Ok1hcmdpbkluZm86Ok1hcmdpbkluZm8o
UmVuZAogICAgIC8vIGlmIHdlIGhhZCBhbnkgYm9yZGVyL3BhZGRpbmcgKG9idmlvdXNseSksIGlm
IHdlJ3JlIHRoZSByb290IG9yIEhUTUwgZWxlbWVudHMsIG9yIGlmCiAgICAgLy8gd2UncmUgcG9z
aXRpb25lZCwgZmxvYXRpbmcsIGEgdGFibGUgY2VsbC4KICAgICBtX2NhbkNvbGxhcHNlV2l0aENo
aWxkcmVuID0gIWJsb2NrLT5pc1JlbmRlclZpZXcoKSAmJiAhYmxvY2stPmlzUm9vdCgpICYmICFi
bG9jay0+aXNQb3NpdGlvbmVkKCkgJiYKLSAgICAgICAgIWJsb2NrLT5pc0Zsb2F0aW5nKCkgJiYg
IWJsb2NrLT5pc1RhYmxlQ2VsbCgpICYmICFibG9jay0+aGFzT3ZlcmZsb3dDbGlwKCkgJiYgIWJs
b2NrLT5pc0lubGluZUJsb2NrT3JJbmxpbmVUYWJsZSgpOworICAgICAgICAhYmxvY2stPmlzRmxv
YXRpbmcoKSAmJiAhYmxvY2stPmlzVGFibGVDZWxsKCkgJiYgIWJsb2NrLT5oYXNPdmVyZmxvd0Ns
aXAoKSAmJiAoIWJsb2NrLT5pc0lubGluZUJsb2NrT3JJbmxpbmVUYWJsZSgpIHx8IGJsb2NrLT5p
c0Fub255bW91c0lubGluZUJsb2NrKCkpOwogCiAgICAgbV9jYW5Db2xsYXBzZVRvcFdpdGhDaGls
ZHJlbiA9IG1fY2FuQ29sbGFwc2VXaXRoQ2hpbGRyZW4gJiYgKHRvcCA9PSAwKSAmJiBibG9jay0+
c3R5bGUoKS0+bWFyZ2luVG9wQ29sbGFwc2UoKSAhPSBNU0VQQVJBVEU7CiAKQEAgLTEyNSw3ICsx
MjMsNiBAQCBSZW5kZXJCbG9jazo6UmVuZGVyQmxvY2soTm9kZSogbm9kZSkKICAgICAgIDogUmVu
ZGVyQm94KG5vZGUpCiAgICAgICAsIG1fZmxvYXRpbmdPYmplY3RzKDApCiAgICAgICAsIG1fcG9z
aXRpb25lZE9iamVjdHMoMCkKLSAgICAgICwgbV9pbmxpbmVDb250aW51YXRpb24oMCkKICAgICAg
ICwgbV9tYXhNYXJnaW4oMCkKICAgICAgICwgbV9saW5lSGVpZ2h0KC0xKQogewpAQCAtMTYzLDEx
ICsxNjAsNiBAQCBSZW5kZXJCbG9jazo6flJlbmRlckJsb2NrKCkKIAogdm9pZCBSZW5kZXJCbG9j
azo6ZGVzdHJveSgpCiB7Ci0gICAgLy8gRGV0YWNoIG91ciBjb250aW51YXRpb24gZmlyc3QuCi0g
ICAgaWYgKG1faW5saW5lQ29udGludWF0aW9uKQotICAgICAgICBtX2lubGluZUNvbnRpbnVhdGlv
bi0+ZGVzdHJveSgpOwotICAgIG1faW5saW5lQ29udGludWF0aW9uID0gMDsKLSAgICAKICAgICAv
LyBNYWtlIHN1cmUgdG8gZGVzdHJveSBhbm9ueW1vdXMgY2hpbGRyZW4gZmlyc3Qgd2hpbGUgdGhl
eSBhcmUgc3RpbGwgY29ubmVjdGVkIHRvIHRoZSByZXN0IG9mIHRoZSB0cmVlLCBzbyB0aGF0IHRo
ZXkgd2lsbAogICAgIC8vIHByb3Blcmx5IGRpcnR5IGxpbmUgYm94ZXMgdGhhdCB0aGV5IGFyZSBy
ZW1vdmVkIGZyb20uICBFZmZlY3RzIHRoYXQgZG8gOmJlZm9yZS86YWZ0ZXIgb25seSBvbiBob3Zl
ciBjb3VsZCBjcmFzaCBvdGhlcndpc2UuCiAgICAgY2hpbGRyZW4oKS0+ZGVzdHJveUxlZnRvdmVy
Q2hpbGRyZW4oKTsKQEAgLTMxOCw3ICszMTAsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjphZGRDaGls
ZChSZW5kZXJPYmplY3QqCiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFjaGlsZHJlbklubGlu
ZSgpICYmIChuZXdDaGlsZC0+aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpIHx8IG5ld0NoaWxkLT5p
c0lubGluZSgpKSkgewogICAgICAgICAvLyBJZiB3ZSdyZSBpbnNlcnRpbmcgYW4gaW5saW5lIGNo
aWxkIGJ1dCBhbGwgb2Ygb3VyIGNoaWxkcmVuIGFyZSBibG9ja3MsIHRoZW4gd2UgaGF2ZSB0byBt
YWtlIHN1cmUKLSAgICAgICAgLy8gaXQgaXMgcHV0IGludG8gYW4gYW5vbXlvdXMgYmxvY2sgYm94
LiBXZSB0cnkgdG8gdXNlIGFuIGV4aXN0aW5nIGFub255bW91cyBib3ggaWYgcG9zc2libGUsIG90
aGVyd2lzZQorICAgICAgICAvLyBpdCBpcyBwdXQgaW50byBhbiBhbm9ueW1vdXMgYmxvY2sgYm94
LiBXZSB0cnkgdG8gdXNlIGFuIGV4aXN0aW5nIGFub255bW91cyBib3ggaWYgcG9zc2libGUsIG90
aGVyd2lzZQogICAgICAgICAvLyBhIG5ldyBvbmUgaXMgY3JlYXRlZCBhbmQgaW5zZXJ0ZWQgaW50
byBvdXIgbGlzdCBvZiBjaGlsZHJlbiBpbiB0aGUgYXBwcm9wcmlhdGUgcG9zaXRpb24uCiAgICAg
ICAgIFJlbmRlck9iamVjdCogYWZ0ZXJDaGlsZCA9IGJlZm9yZUNoaWxkID8gYmVmb3JlQ2hpbGQt
PnByZXZpb3VzU2libGluZygpIDogbGFzdENoaWxkKCk7CiAKQEAgLTQ1NCw5ICs0NDYsNiBAQCB2
b2lkIFJlbmRlckJsb2NrOjpyZW1vdmVMZWZ0b3ZlckFub255bW91CiAgICAgQVNTRVJUKGNoaWxk
LT5pc0Fub255bW91c0Jsb2NrKCkpOwogICAgIEFTU0VSVCghY2hpbGQtPmNoaWxkcmVuSW5saW5l
KCkpOwogICAgIAotICAgIGlmIChjaGlsZC0+aW5saW5lQ29udGludWF0aW9uKCkpIAotICAgICAg
ICByZXR1cm47Ci0gICAgCiAgICAgUmVuZGVyT2JqZWN0KiBmaXJzdEFuQ2hpbGQgPSBjaGlsZC0+
bV9jaGlsZHJlbi5maXJzdENoaWxkKCk7CiAgICAgUmVuZGVyT2JqZWN0KiBsYXN0QW5DaGlsZCA9
IGNoaWxkLT5tX2NoaWxkcmVuLmxhc3RDaGlsZCgpOwogICAgIGlmIChmaXJzdEFuQ2hpbGQpIHsK
QEAgLTQ5OSw3ICs0ODgsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjpyZW1vdmVDaGlsZChSZW5kZXJP
YmplCiAgICAgUmVuZGVyT2JqZWN0KiBwcmV2ID0gb2xkQ2hpbGQtPnByZXZpb3VzU2libGluZygp
OwogICAgIFJlbmRlck9iamVjdCogbmV4dCA9IG9sZENoaWxkLT5uZXh0U2libGluZygpOwogICAg
IGJvb2wgY2FuRGVsZXRlQW5vbnltb3VzQmxvY2tzID0gIWRvY3VtZW50QmVpbmdEZXN0cm95ZWQo
KSAmJiAhaXNJbmxpbmUoKSAmJiAhb2xkQ2hpbGQtPmlzSW5saW5lKCkgJiYgCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAoIW9sZENoaWxkLT5pc1JlbmRlckJsb2NrKCkgfHwg
IXRvUmVuZGVyQmxvY2sob2xkQ2hpbGQpLT5pbmxpbmVDb250aW51YXRpb24oKSkgJiYgCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhb2xkQ2hpbGQtPmlzUmVuZGVyQmxvY2so
KSAmJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghcHJldiB8fCAocHJl
di0+aXNBbm9ueW1vdXNCbG9jaygpICYmIHByZXYtPmNoaWxkcmVuSW5saW5lKCkpKSAmJgogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFuZXh0IHx8IChuZXh0LT5pc0Fub255
bW91c0Jsb2NrKCkgJiYgbmV4dC0+Y2hpbGRyZW5JbmxpbmUoKSkpOwogICAgIGlmIChjYW5EZWxl
dGVBbm9ueW1vdXNCbG9ja3MgJiYgcHJldiAmJiBuZXh0KSB7CkBAIC01NzIsOSArNTYxLDE1IEBA
IGJvb2wgUmVuZGVyQmxvY2s6OmlzU2VsZkNvbGxhcHNpbmdCbG9jaygKICAgICAvLyBvbiB3aGV0
aGVyIHdlIGhhdmUgY29udGVudCB0aGF0IGlzIGFsbCBzZWxmLWNvbGxhcHNpbmcgb3Igbm90Lgog
ICAgIGlmIChoYXNBdXRvSGVpZ2h0IHx8ICgoc3R5bGUoKS0+aGVpZ2h0KCkuaXNGaXhlZCgpIHx8
IHN0eWxlKCktPmhlaWdodCgpLmlzUGVyY2VudCgpKSAmJiBzdHlsZSgpLT5oZWlnaHQoKS5pc1pl
cm8oKSkpIHsKICAgICAgICAgLy8gSWYgdGhlIGJsb2NrIGhhcyBpbmxpbmUgY2hpbGRyZW4sIHNl
ZSBpZiB3ZSBnZW5lcmF0ZWQgYW55IGxpbmUgYm94ZXMuICBJZiB3ZSBoYXZlIGFueQotICAgICAg
ICAvLyBsaW5lIGJveGVzLCB0aGVuIHdlIGNhbid0IGJlIHNlbGYtY29sbGFwc2luZywgc2luY2Ug
d2UgaGF2ZSBjb250ZW50LgotICAgICAgICBpZiAoY2hpbGRyZW5JbmxpbmUoKSkKLSAgICAgICAg
ICAgIHJldHVybiAhZmlyc3RMaW5lQm94KCk7CisgICAgICAgIC8vIGxpbmUgYm94ZXMsIHRoZW4g
d2UgY2FuIG9ubHkgYmUgc2VsZi1jb2xsYXBzaW5nIGlmIHdlIGhhdmUgbm90aGluZyBidXQgYW5v
bnltb3VzIGlubGluZSBibG9ja3MKKyAgICAgICAgLy8gdGhhdCBhcmUgYWxzbyBzZWxmLWNvbGxh
cHNpbmcgaW5zaWRlIHVzLgorICAgICAgICBpZiAoY2hpbGRyZW5JbmxpbmUoKSkgeworICAgICAg
ICAgICAgZm9yIChSb290SW5saW5lQm94KiBjaGlsZCA9IGZpcnN0Um9vdEJveCgpOyBjaGlsZDsg
Y2hpbGQgPSBjaGlsZC0+bmV4dFJvb3RCb3goKSkgeworICAgICAgICAgICAgICAgIGlmICghY2hp
bGQtPmFub255bW91c0lubGluZUJsb2NrKCkgfHwgIWNoaWxkLT5hbm9ueW1vdXNJbmxpbmVCbG9j
aygpLT5pc1NlbGZDb2xsYXBzaW5nQmxvY2soKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIFdlIGhh
dmUgbm8gbGluZSBib3hlcywgc28gd2UgbXVzdCBiZSBzZWxmLWNvbGxhcHNpbmcuCisgICAgICAg
IH0KICAgICAgICAgCiAgICAgICAgIC8vIFdoZXRoZXIgb3Igbm90IHdlIGNvbGxhcHNlIGlzIGRl
cGVuZGVudCBvbiB3aGV0aGVyIGFsbCBvdXIgbm9ybWFsIGZsb3cgY2hpbGRyZW4KICAgICAgICAg
Ly8gYXJlIGFsc28gc2VsZi1jb2xsYXBzaW5nLgpAQCAtODI3LDcgKzgyMiw4IEBAIHZvaWQgUmVu
ZGVyQmxvY2s6OmFkZE92ZXJmbG93RnJvbUZsb2F0cygKIAogYm9vbCBSZW5kZXJCbG9jazo6ZXhw
YW5kc1RvRW5jbG9zZU92ZXJoYW5naW5nRmxvYXRzKCkgY29uc3QKIHsKLSAgICByZXR1cm4gaXNJ
bmxpbmVCbG9ja09ySW5saW5lVGFibGUoKSB8fCBpc0Zsb2F0aW5nT3JQb3NpdGlvbmVkKCkgfHwg
aGFzT3ZlcmZsb3dDbGlwKCkgfHwgKHBhcmVudCgpICYmIHBhcmVudCgpLT5pc0ZsZXhpYmxlQm94
KCkpIHx8IGhhc0NvbHVtbnMoKSB8fCBpc1RhYmxlQ2VsbCgpIHx8IGlzRmllbGRzZXQoKTsKKyAg
ICByZXR1cm4gaXNGbG9hdGluZ09yUG9zaXRpb25lZCgpIHx8IGhhc092ZXJmbG93Q2xpcCgpIHx8
IChwYXJlbnQoKSAmJiBwYXJlbnQoKS0+aXNGbGV4aWJsZUJveCgpKSB8fCBoYXNDb2x1bW5zKCkg
fHwgaXNUYWJsZUNlbGwoKSB8fCBpc0ZpZWxkc2V0KCkgfHwKKyAgICAgICAgICAgKGlzSW5saW5l
QmxvY2tPcklubGluZVRhYmxlKCkgJiYgIWlzQW5vbnltb3VzSW5saW5lQmxvY2soKSk7CiB9CiAK
IHZvaWQgUmVuZGVyQmxvY2s6OmFkanVzdFBvc2l0aW9uZWRCbG9jayhSZW5kZXJCb3gqIGNoaWxk
LCBjb25zdCBNYXJnaW5JbmZvJiBtYXJnaW5JbmZvKQpAQCAtOTY5LDE5ICs5NjUsMTkgQEAgYm9v
bCBSZW5kZXJCbG9jazo6aGFuZGxlUnVuSW5DaGlsZChSZW5kZQogaW50IFJlbmRlckJsb2NrOjpj
b2xsYXBzZU1hcmdpbnMoUmVuZGVyQm94KiBjaGlsZCwgTWFyZ2luSW5mbyYgbWFyZ2luSW5mbykK
IHsKICAgICAvLyBHZXQgb3VyIG1heCBwb3MgYW5kIG5lZyB0b3AgbWFyZ2lucy4KLSAgICBpbnQg
cG9zVG9wID0gY2hpbGQtPm1heFRvcE1hcmdpbih0cnVlKTsKLSAgICBpbnQgbmVnVG9wID0gY2hp
bGQtPm1heFRvcE1hcmdpbihmYWxzZSk7CisgICAgaW50IHBvc1RvcCA9IGNoaWxkID8gY2hpbGQt
Pm1heFRvcE1hcmdpbih0cnVlKSA6IDA7CisgICAgaW50IG5lZ1RvcCA9IGNoaWxkID8gY2hpbGQt
Pm1heFRvcE1hcmdpbihmYWxzZSkgOiAwOwogCiAgICAgLy8gRm9yIHNlbGYtY29sbGFwc2luZyBi
bG9ja3MsIGNvbGxhcHNlIG91ciBib3R0b20gbWFyZ2lucyBpbnRvIG91cgogICAgIC8vIHRvcCB0
byBnZXQgbmV3IHBvc1RvcCBhbmQgbmVnVG9wIHZhbHVlcy4KLSAgICBpZiAoY2hpbGQtPmlzU2Vs
ZkNvbGxhcHNpbmdCbG9jaygpKSB7CisgICAgaWYgKGNoaWxkICYmIGNoaWxkLT5pc1NlbGZDb2xs
YXBzaW5nQmxvY2soKSkgewogICAgICAgICBwb3NUb3AgPSBtYXgocG9zVG9wLCBjaGlsZC0+bWF4
Qm90dG9tTWFyZ2luKHRydWUpKTsKICAgICAgICAgbmVnVG9wID0gbWF4KG5lZ1RvcCwgY2hpbGQt
Pm1heEJvdHRvbU1hcmdpbihmYWxzZSkpOwogICAgIH0KICAgICAKICAgICAvLyBTZWUgaWYgdGhl
IHRvcCBtYXJnaW4gaXMgcXVpcmt5LiBXZSBvbmx5IGNhcmUgaWYgdGhpcyBjaGlsZCBoYXMKICAg
ICAvLyBtYXJnaW5zIHRoYXQgd2lsbCBjb2xsYXBzZSB3aXRoIHVzLgotICAgIGJvb2wgdG9wUXVp
cmsgPSBjaGlsZC0+aXNUb3BNYXJnaW5RdWlyaygpIHx8IHN0eWxlKCktPm1hcmdpblRvcENvbGxh
cHNlKCkgPT0gTURJU0NBUkQ7CisgICAgYm9vbCB0b3BRdWlyayA9IChjaGlsZCAmJiBjaGlsZC0+
aXNUb3BNYXJnaW5RdWlyaygpKSB8fCBzdHlsZSgpLT5tYXJnaW5Ub3BDb2xsYXBzZSgpID09IE1E
SVNDQVJEOwogCiAgICAgaWYgKG1hcmdpbkluZm8uY2FuQ29sbGFwc2VXaXRoVG9wKCkpIHsKICAg
ICAgICAgLy8gVGhpcyBjaGlsZCBpcyBjb2xsYXBzaW5nIHdpdGggdGhlIHRvcCBvZiB0aGUKQEAg
LTk5NCw3ICs5OTAsNyBAQCBpbnQgUmVuZGVyQmxvY2s6OmNvbGxhcHNlTWFyZ2lucyhSZW5kZXJC
CiAgICAgICAgIC8vIGNvbGxhcHNlIGl0IGF3YXksIGV2ZW4gaWYgdGhlIG1hcmdpbiBpcyBzbWFs
bGVyICh3d3cud2VicmVmZXJlbmNlLmNvbQogICAgICAgICAvLyBoYXMgYW4gZXhhbXBsZSBvZiB0
aGlzLCBhIDxkdD4gd2l0aCAwLjhlbSBhdXRob3Itc3BlY2lmaWVkIGluc2lkZQogICAgICAgICAv
LyBhIDxkbD4gaW5zaWRlIGEgPHRkPi4KLSAgICAgICAgaWYgKCFtYXJnaW5JbmZvLmRldGVybWlu
ZWRUb3BRdWlyaygpICYmICF0b3BRdWlyayAmJiAocG9zVG9wLW5lZ1RvcCkpIHsKKyAgICAgICAg
aWYgKCFtYXJnaW5JbmZvLmRldGVybWluZWRUb3BRdWlyaygpICYmICF0b3BRdWlyayAmJiAocG9z
VG9wIC0gbmVnVG9wKSkgewogICAgICAgICAgICAgc2V0VG9wTWFyZ2luUXVpcmsoZmFsc2UpOwog
ICAgICAgICAgICAgbWFyZ2luSW5mby5zZXREZXRlcm1pbmVkVG9wUXVpcmsodHJ1ZSk7CiAgICAg
ICAgIH0KQEAgLTEwMTIsNyArMTAwOCw3IEBAIGludCBSZW5kZXJCbG9jazo6Y29sbGFwc2VNYXJn
aW5zKFJlbmRlckIKICAgICAgICAgbWFyZ2luSW5mby5zZXRUb3BRdWlyayh0b3BRdWlyayk7CiAK
ICAgICBpbnQgeXBvcyA9IGhlaWdodCgpOwotICAgIGlmIChjaGlsZC0+aXNTZWxmQ29sbGFwc2lu
Z0Jsb2NrKCkpIHsKKyAgICBpZiAoY2hpbGQgJiYgY2hpbGQtPmlzU2VsZkNvbGxhcHNpbmdCbG9j
aygpKSB7CiAgICAgICAgIC8vIFRoaXMgY2hpbGQgaGFzIG5vIGhlaWdodC4gIFdlIG5lZWQgdG8g
Y29tcHV0ZSBvdXIKICAgICAgICAgLy8gcG9zaXRpb24gYmVmb3JlIHdlIGNvbGxhcHNlIHRoZSBj
aGlsZCdzIG1hcmdpbnMgdG9nZXRoZXIsCiAgICAgICAgIC8vIHNvIHRoYXQgd2UgY2FuIGdldCBh
biBhY2N1cmF0ZSBwb3NpdGlvbiBmb3IgdGhlIHplcm8taGVpZ2h0IGJsb2NrLgpAQCAtMTAzMSwx
MyArMTAyNywxMSBAQCBpbnQgUmVuZGVyQmxvY2s6OmNvbGxhcHNlTWFyZ2lucyhSZW5kZXJCCiAg
ICAgICAgICAgICAvLyB0aGF0IG5lZWRzIHRvIGJlIHBvc2l0aW9uZWQgY29ycmVjdGx5IChlLmcu
LCBhIGJsb2NrIHRoYXQKICAgICAgICAgICAgIC8vIGhhZCBhIHNwZWNpZmllZCBoZWlnaHQgb2Yg
MCBidXQgdGhhdCBhY3R1YWxseSBoYWQgc3ViY29udGVudCkuCiAgICAgICAgICAgICB5cG9zID0g
aGVpZ2h0KCkgKyBjb2xsYXBzZWRUb3BQb3MgLSBjb2xsYXBzZWRUb3BOZWc7Ci0gICAgfQotICAg
IGVsc2UgewotICAgICAgICBpZiAoY2hpbGQtPnN0eWxlKCktPm1hcmdpblRvcENvbGxhcHNlKCkg
PT0gTVNFUEFSQVRFKSB7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGNoaWxkICYmIGNoaWxk
LT5zdHlsZSgpLT5tYXJnaW5Ub3BDb2xsYXBzZSgpID09IE1TRVBBUkFURSkgewogICAgICAgICAg
ICAgc2V0SGVpZ2h0KGhlaWdodCgpICsgbWFyZ2luSW5mby5tYXJnaW4oKSArIGNoaWxkLT5tYXJn
aW5Ub3AoKSk7CiAgICAgICAgICAgICB5cG9zID0gaGVpZ2h0KCk7Ci0gICAgICAgIH0KLSAgICAg
ICAgZWxzZSBpZiAoIW1hcmdpbkluZm8uYXRUb3BPZkJsb2NrKCkgfHwKKyAgICAgICAgfSBlbHNl
IGlmICghbWFyZ2luSW5mby5hdFRvcE9mQmxvY2soKSB8fAogICAgICAgICAgICAgKCFtYXJnaW5J
bmZvLmNhbkNvbGxhcHNlVG9wV2l0aENoaWxkcmVuKCkKICAgICAgICAgICAgICAmJiAoIXN0eWxl
KCktPmh0bWxIYWNrcygpIHx8ICFtYXJnaW5JbmZvLnF1aXJrQ29udGFpbmVyKCkgfHwgIW1hcmdp
bkluZm8udG9wUXVpcmsoKSkpKSB7CiAgICAgICAgICAgICAvLyBXZSdyZSBjb2xsYXBzaW5nIHdp
dGggYSBwcmV2aW91cyBzaWJsaW5nJ3MgbWFyZ2lucyBhbmQgbm90CkBAIC0xMDQ2LDggKzEwNDAs
OCBAQCBpbnQgUmVuZGVyQmxvY2s6OmNvbGxhcHNlTWFyZ2lucyhSZW5kZXJCCiAgICAgICAgICAg
ICB5cG9zID0gaGVpZ2h0KCk7CiAgICAgICAgIH0KIAotICAgICAgICBtYXJnaW5JbmZvLnNldFBv
c01hcmdpbihjaGlsZC0+bWF4Qm90dG9tTWFyZ2luKHRydWUpKTsKLSAgICAgICAgbWFyZ2luSW5m
by5zZXROZWdNYXJnaW4oY2hpbGQtPm1heEJvdHRvbU1hcmdpbihmYWxzZSkpOworICAgICAgICBt
YXJnaW5JbmZvLnNldFBvc01hcmdpbihjaGlsZCA/IGNoaWxkLT5tYXhCb3R0b21NYXJnaW4odHJ1
ZSkgOiAwKTsKKyAgICAgICAgbWFyZ2luSW5mby5zZXROZWdNYXJnaW4oY2hpbGQgPyBjaGlsZC0+
bWF4Qm90dG9tTWFyZ2luKGZhbHNlKSA6IDApOwogCiAgICAgICAgIGlmIChtYXJnaW5JbmZvLm1h
cmdpbigpKQogICAgICAgICAgICAgbWFyZ2luSW5mby5zZXRCb3R0b21RdWlyayhjaGlsZC0+aXNC
b3R0b21NYXJnaW5RdWlyaygpIHx8IHN0eWxlKCktPm1hcmdpbkJvdHRvbUNvbGxhcHNlKCkgPT0g
TURJU0NBUkQpOwpAQCAtMTcxNywyMCArMTcxMSw3IEBAIHZvaWQgUmVuZGVyQmxvY2s6OnBhaW50
T2JqZWN0KFBhaW50SW5mbyYKICAgICBpZiAoKHBhaW50UGhhc2UgPT0gUGFpbnRQaGFzZU91dGxp
bmUgfHwgcGFpbnRQaGFzZSA9PSBQYWludFBoYXNlU2VsZk91dGxpbmUpICYmIGhhc091dGxpbmUo
KSAmJiBzdHlsZSgpLT52aXNpYmlsaXR5KCkgPT0gVklTSUJMRSkKICAgICAgICAgcGFpbnRPdXRs
aW5lKHBhaW50SW5mby5jb250ZXh0LCB0eCwgdHksIHdpZHRoKCksIGhlaWdodCgpLCBzdHlsZSgp
KTsKIAotICAgIC8vIDYuIHBhaW50IGNvbnRpbnVhdGlvbiBvdXRsaW5lcy4KLSAgICBpZiAoKHBh
aW50UGhhc2UgPT0gUGFpbnRQaGFzZU91dGxpbmUgfHwgcGFpbnRQaGFzZSA9PSBQYWludFBoYXNl
Q2hpbGRPdXRsaW5lcykpIHsKLSAgICAgICAgaWYgKGlubGluZUNvbnRpbnVhdGlvbigpICYmIGlu
bGluZUNvbnRpbnVhdGlvbigpLT5oYXNPdXRsaW5lKCkgJiYgaW5saW5lQ29udGludWF0aW9uKCkt
PnN0eWxlKCktPnZpc2liaWxpdHkoKSA9PSBWSVNJQkxFKSB7Ci0gICAgICAgICAgICBSZW5kZXJJ
bmxpbmUqIGlubGluZVJlbmRlcmVyID0gdG9SZW5kZXJJbmxpbmUoaW5saW5lQ29udGludWF0aW9u
KCktPm5vZGUoKS0+cmVuZGVyZXIoKSk7Ci0gICAgICAgICAgICBpZiAoIWlubGluZVJlbmRlcmVy
LT5oYXNTZWxmUGFpbnRpbmdMYXllcigpKQotICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdCbG9j
aygpLT5hZGRDb250aW51YXRpb25XaXRoT3V0bGluZShpbmxpbmVSZW5kZXJlcik7Ci0gICAgICAg
ICAgICBlbHNlIGlmICghaW5saW5lUmVuZGVyZXItPmZpcnN0TGluZUJveCgpKQotICAgICAgICAg
ICAgICAgIGlubGluZVJlbmRlcmVyLT5wYWludE91dGxpbmUocGFpbnRJbmZvLmNvbnRleHQsIHR4
IC0geCgpICsgaW5saW5lUmVuZGVyZXItPmNvbnRhaW5pbmdCbG9jaygpLT54KCksCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eSAtIHkoKSArIGlubGluZVJl
bmRlcmVyLT5jb250YWluaW5nQmxvY2soKS0+eSgpKTsKLSAgICAgICAgfQotICAgICAgICBwYWlu
dENvbnRpbnVhdGlvbk91dGxpbmVzKHBhaW50SW5mbywgdHgsIHR5KTsKLSAgICB9Ci0KLSAgICAv
LyA3LiBwYWludCBjYXJldC4KKyAgICAvLyA2LiBwYWludCBjYXJldC4KICAgICAvLyBJZiB0aGUg
Y2FyZXQncyBub2RlJ3MgcmVuZGVyIG9iamVjdCdzIGNvbnRhaW5pbmcgYmxvY2sgaXMgdGhpcyBi
bG9jaywgYW5kIHRoZSBwYWludCBhY3Rpb24gaXMgUGFpbnRQaGFzZUZvcmVncm91bmQsCiAgICAg
Ly8gdGhlbiBwYWludCB0aGUgY2FyZXQuCiAgICAgaWYgKHBhaW50UGhhc2UgPT0gUGFpbnRQaGFz
ZUZvcmVncm91bmQpIHsgICAgICAgIApAQCAtMTc5Myw1NyArMTc3NCw2IEBAIHZvaWQgUmVuZGVy
QmxvY2s6OnBhaW50RWxsaXBzaXNCb3hlcyhQYWkKICAgICB9CiB9CiAKLXN0YXRpYyBDb250aW51
YXRpb25PdXRsaW5lVGFibGVNYXAqIGNvbnRpbnVhdGlvbk91dGxpbmVUYWJsZSgpCi17Ci0gICAg
REVGSU5FX1NUQVRJQ19MT0NBTChDb250aW51YXRpb25PdXRsaW5lVGFibGVNYXAsIHRhYmxlLCAo
KSk7Ci0gICAgcmV0dXJuICZ0YWJsZTsKLX0KLQotdm9pZCBSZW5kZXJCbG9jazo6YWRkQ29udGlu
dWF0aW9uV2l0aE91dGxpbmUoUmVuZGVySW5saW5lKiBmbG93KQotewotICAgIC8vIFdlIGNhbid0
IG1ha2UgdGhpcyB3b3JrIGlmIHRoZSBpbmxpbmUgaXMgaW4gYSBsYXllci4gIFdlJ2xsIGp1c3Qg
cmVseSBvbiB0aGUgYnJva2VuCi0gICAgLy8gd2F5IG9mIHBhaW50aW5nLgotICAgIEFTU0VSVCgh
Zmxvdy0+bGF5ZXIoKSAmJiAhZmxvdy0+aXNJbmxpbmVDb250aW51YXRpb24oKSk7Ci0gICAgCi0g
ICAgQ29udGludWF0aW9uT3V0bGluZVRhYmxlTWFwKiB0YWJsZSA9IGNvbnRpbnVhdGlvbk91dGxp
bmVUYWJsZSgpOwotICAgIExpc3RIYXNoU2V0PFJlbmRlcklubGluZSo+KiBjb250aW51YXRpb25z
ID0gdGFibGUtPmdldCh0aGlzKTsKLSAgICBpZiAoIWNvbnRpbnVhdGlvbnMpIHsKLSAgICAgICAg
Y29udGludWF0aW9ucyA9IG5ldyBMaXN0SGFzaFNldDxSZW5kZXJJbmxpbmUqPjsKLSAgICAgICAg
dGFibGUtPnNldCh0aGlzLCBjb250aW51YXRpb25zKTsKLSAgICB9Ci0gICAgCi0gICAgY29udGlu
dWF0aW9ucy0+YWRkKGZsb3cpOwotfQotCi12b2lkIFJlbmRlckJsb2NrOjpwYWludENvbnRpbnVh
dGlvbk91dGxpbmVzKFBhaW50SW5mbyYgaW5mbywgaW50IHR4LCBpbnQgdHkpCi17Ci0gICAgQ29u
dGludWF0aW9uT3V0bGluZVRhYmxlTWFwKiB0YWJsZSA9IGNvbnRpbnVhdGlvbk91dGxpbmVUYWJs
ZSgpOwotICAgIGlmICh0YWJsZS0+aXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0gICAgICAg
IAotICAgIExpc3RIYXNoU2V0PFJlbmRlcklubGluZSo+KiBjb250aW51YXRpb25zID0gdGFibGUt
PmdldCh0aGlzKTsKLSAgICBpZiAoIWNvbnRpbnVhdGlvbnMpCi0gICAgICAgIHJldHVybjsKLSAg
ICAgICAgCi0gICAgLy8gUGFpbnQgZWFjaCBjb250aW51YXRpb24gb3V0bGluZS4KLSAgICBMaXN0
SGFzaFNldDxSZW5kZXJJbmxpbmUqPjo6aXRlcmF0b3IgZW5kID0gY29udGludWF0aW9ucy0+ZW5k
KCk7Ci0gICAgZm9yIChMaXN0SGFzaFNldDxSZW5kZXJJbmxpbmUqPjo6aXRlcmF0b3IgaXQgPSBj
b250aW51YXRpb25zLT5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgLy8gTmVl
ZCB0byBhZGQgaW4gdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBpbnRlcnZlbmluZyBibG9ja3MuCi0g
ICAgICAgIFJlbmRlcklubGluZSogZmxvdyA9ICppdDsKLSAgICAgICAgUmVuZGVyQmxvY2sqIGJs
b2NrID0gZmxvdy0+Y29udGFpbmluZ0Jsb2NrKCk7Ci0gICAgICAgIGZvciAoIDsgYmxvY2sgJiYg
YmxvY2sgIT0gdGhpczsgYmxvY2sgPSBibG9jay0+Y29udGFpbmluZ0Jsb2NrKCkpIHsKLSAgICAg
ICAgICAgIHR4ICs9IGJsb2NrLT54KCk7Ci0gICAgICAgICAgICB0eSArPSBibG9jay0+eSgpOwot
ICAgICAgICB9Ci0gICAgICAgIEFTU0VSVChibG9jayk7ICAgCi0gICAgICAgIGZsb3ctPnBhaW50
T3V0bGluZShpbmZvLmNvbnRleHQsIHR4LCB0eSk7Ci0gICAgfQotICAgIAotICAgIC8vIERlbGV0
ZQotICAgIGRlbGV0ZSBjb250aW51YXRpb25zOwotICAgIHRhYmxlLT5yZW1vdmUodGhpcyk7Ci19
Ci0KIHZvaWQgUmVuZGVyQmxvY2s6OnNldFNlbGVjdGlvblN0YXRlKFNlbGVjdGlvblN0YXRlIHMp
CiB7CiAgICAgaWYgKHNlbGVjdGlvblN0YXRlKCkgPT0gcykKQEAgLTI5MjksMjAgKzI4NTksMjcg
QEAgdm9pZCBSZW5kZXJCbG9jazo6Y2xlYXJGbG9hdHMoKQogICAgIC8vIG91dCBvZiBmbG93IChs
aWtlIGZsb2F0aW5nL3Bvc2l0aW9uZWQgZWxlbWVudHMpLCBhbmQgd2UgYWxzbyBza2lwIG92ZXIg
YW55IG9iamVjdHMgdGhhdCBtYXkgaGF2ZSBzaGlmdGVkCiAgICAgLy8gdG8gYXZvaWQgZmxvYXRz
LgogICAgIGJvb2wgcGFyZW50SGFzRmxvYXRzID0gZmFsc2U7Ci0gICAgUmVuZGVyT2JqZWN0KiBw
cmV2ID0gcHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgd2hpbGUgKHByZXYgJiYgKHByZXYtPmlzRmxv
YXRpbmdPclBvc2l0aW9uZWQoKSB8fCAhcHJldi0+aXNCb3goKSB8fCAhcHJldi0+aXNSZW5kZXJC
bG9jaygpIHx8IHRvUmVuZGVyQmxvY2socHJldiktPmF2b2lkc0Zsb2F0cygpKSkgewotICAgICAg
ICBpZiAocHJldi0+aXNGbG9hdGluZygpKQotICAgICAgICAgICAgcGFyZW50SGFzRmxvYXRzID0g
dHJ1ZTsKLSAgICAgICAgIHByZXYgPSBwcmV2LT5wcmV2aW91c1NpYmxpbmcoKTsKKyAgICBSZW5k
ZXJPYmplY3QqIHByZXYgPSAwOworICAgIFJlbmRlckJsb2NrKiBwYXJlbnRCbG9jayA9IDA7Cisg
ICAgaWYgKGlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkgeworICAgICAgICBwYXJlbnRCbG9jayA9
IGNvbnRhaW5pbmdCbG9jaygpOworICAgICAgICBwYXJlbnRIYXNGbG9hdHMgPSBwYXJlbnRCbG9j
ay0+Y29udGFpbnNGbG9hdHMoKTsKKyAgICB9IGVsc2UgeyAgICAKKyAgICAgICAgd2hpbGUgKHBy
ZXYgJiYgKHByZXYtPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSB8fCAhcHJldi0+aXNCb3goKSB8
fCAhcHJldi0+aXNSZW5kZXJCbG9jaygpIHx8IHRvUmVuZGVyQmxvY2socHJldiktPmF2b2lkc0Zs
b2F0cygpKSkgeworICAgICAgICAgICAgaWYgKHByZXYtPmlzRmxvYXRpbmcoKSkKKyAgICAgICAg
ICAgICAgICBwYXJlbnRIYXNGbG9hdHMgPSB0cnVlOworICAgICAgICAgICAgIHByZXYgPSBwcmV2
LT5wcmV2aW91c1NpYmxpbmcoKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKHBh
cmVudEhhc0Zsb2F0cykKKyAgICAgICAgICAgIHBhcmVudEJsb2NrID0gdG9SZW5kZXJCbG9jayhw
YXJlbnQoKSk7CiAgICAgfQogCiAgICAgLy8gRmlyc3QgYWRkIGluIGZsb2F0cyBmcm9tIHRoZSBw
YXJlbnQuCiAgICAgaW50IG9mZnNldCA9IHkoKTsKLSAgICBpZiAocGFyZW50SGFzRmxvYXRzKSB7
Ci0gICAgICAgIFJlbmRlckJsb2NrKiBwYXJlbnRCbG9jayA9IHRvUmVuZGVyQmxvY2socGFyZW50
KCkpOworICAgIGlmIChwYXJlbnRIYXNGbG9hdHMpCiAgICAgICAgIGFkZEludHJ1ZGluZ0Zsb2F0
cyhwYXJlbnRCbG9jaywgcGFyZW50QmxvY2stPmJvcmRlckxlZnQoKSArIHBhcmVudEJsb2NrLT5w
YWRkaW5nTGVmdCgpLCBvZmZzZXQpOwotICAgIH0KLSAgICAKKwogICAgIGludCB4b2Zmc2V0ID0g
MDsKICAgICBpZiAocHJldikKICAgICAgICAgb2Zmc2V0IC09IHRvUmVuZGVyQm94KHByZXYpLT55
KCk7CkBAIC00MDQ5LDE0ICszOTg2LDE1IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmNhbGNJbmxpbmVQ
cmVmV2lkdGhzKCkKICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAg
Y2xlYXJQcmV2aW91c0Zsb2F0ID0gZmFsc2U7CiAKLSAgICAgICAgICAgICAgICBib29sIGNhbkJy
ZWFrUmVwbGFjZWRFbGVtZW50ID0gIWNoaWxkLT5pc0ltYWdlKCkgfHwgYWxsb3dJbWFnZXNUb0Jy
ZWFrOworICAgICAgICAgICAgICAgIGJvb2wgY2FuQnJlYWtSZXBsYWNlZEVsZW1lbnQgPSAhY2hp
bGQtPmlzSW1hZ2UoKSB8fCBhbGxvd0ltYWdlc1RvQnJlYWsgfHwgY2hpbGQtPmlzQW5vbnltb3Vz
SW5saW5lQmxvY2soKTsKICAgICAgICAgICAgICAgICBpZiAoKGNhbkJyZWFrUmVwbGFjZWRFbGVt
ZW50ICYmIChhdXRvV3JhcCB8fCBvbGRBdXRvV3JhcCkpIHx8IGNsZWFyUHJldmlvdXNGbG9hdCkg
ewogICAgICAgICAgICAgICAgICAgICBtX21pblByZWZXaWR0aCA9IG1heChpbmxpbmVNaW4sIG1f
bWluUHJlZldpZHRoKTsKICAgICAgICAgICAgICAgICAgICAgaW5saW5lTWluID0gMDsKICAgICAg
ICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAvLyBJZiB3ZSdyZSBzdXBwb3NlZCB0byBj
bGVhciB0aGUgcHJldmlvdXMgZmxvYXQsIHRoZW4gdGVybWluYXRlIG1heHdpZHRoIGFzIHdlbGwu
Ci0gICAgICAgICAgICAgICAgaWYgKGNsZWFyUHJldmlvdXNGbG9hdCkgeworICAgICAgICAgICAg
ICAgIC8vIEFsc28gZG8gdGhpcyBmb3IgYW5vbnltb3VzIGlubGluZSBibG9ja3MuCisgICAgICAg
ICAgICAgICAgaWYgKGNsZWFyUHJldmlvdXNGbG9hdCB8fCBjaGlsZC0+aXNBbm9ueW1vdXNJbmxp
bmVCbG9jaygpKSB7CiAgICAgICAgICAgICAgICAgICAgIG1fbWF4UHJlZldpZHRoID0gbWF4KGlu
bGluZU1heCwgbV9tYXhQcmVmV2lkdGgpOwogICAgICAgICAgICAgICAgICAgICBpbmxpbmVNYXgg
PSAwOwogICAgICAgICAgICAgICAgIH0KQEAgLTQwNjUsMTUgKzQwMDMsMTcgQEAgdm9pZCBSZW5k
ZXJCbG9jazo6Y2FsY0lubGluZVByZWZXaWR0aHMoKQogICAgICAgICAgICAgICAgIGludCB0aSA9
IDA7CiAgICAgICAgICAgICAgICAgaWYgKCFhZGRlZFRleHRJbmRlbnQpIHsKICAgICAgICAgICAg
ICAgICAgICAgYWRkZWRUZXh0SW5kZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgdGkg
PSBzdHlsZSgpLT50ZXh0SW5kZW50KCkuY2FsY01pblZhbHVlKGN3KTsKLSAgICAgICAgICAgICAg
ICAgICAgY2hpbGRNaW4rPXRpOwotICAgICAgICAgICAgICAgICAgICBjaGlsZE1heCs9dGk7Cisg
ICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGQtPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkg
eworICAgICAgICAgICAgICAgICAgICAgICAgdGkgPSBzdHlsZSgpLT50ZXh0SW5kZW50KCkuY2Fs
Y01pblZhbHVlKGN3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkTWluICs9IHRpOwor
ICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRNYXggKz0gdGk7CisgICAgICAgICAgICAgICAg
ICAgIH0KICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAvLyBBZGQgb3VyIHdp
ZHRoIHRvIHRoZSBtYXguCiAgICAgICAgICAgICAgICAgaW5saW5lTWF4ICs9IGNoaWxkTWF4Owog
Ci0gICAgICAgICAgICAgICAgaWYgKCFhdXRvV3JhcCB8fCAhY2FuQnJlYWtSZXBsYWNlZEVsZW1l
bnQpIHsKKyAgICAgICAgICAgICAgICBpZiAoKCFhdXRvV3JhcCB8fCAhY2FuQnJlYWtSZXBsYWNl
ZEVsZW1lbnQpICYmICFjaGlsZC0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CiAgICAgICAg
ICAgICAgICAgICAgIGlmIChjaGlsZC0+aXNGbG9hdGluZygpKQogICAgICAgICAgICAgICAgICAg
ICAgICAgbV9taW5QcmVmV2lkdGggPSBtYXgoY2hpbGRNaW4sIG1fbWluUHJlZldpZHRoKTsKICAg
ICAgICAgICAgICAgICAgICAgZWxzZQpAQCAtNDA4NCw2ICs0MDI0LDEyIEBAIHZvaWQgUmVuZGVy
QmxvY2s6OmNhbGNJbmxpbmVQcmVmV2lkdGhzKCkKIAogICAgICAgICAgICAgICAgICAgICAvLyBO
b3cgc3RhcnQgYSBuZXcgbGluZS4KICAgICAgICAgICAgICAgICAgICAgaW5saW5lTWluID0gMDsK
KyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC0+aXNB
bm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUZXJt
aW5hdGUgbWF4IHdpZHRoIGFzIHdlbGwuCisgICAgICAgICAgICAgICAgICAgICAgICBtX21heFBy
ZWZXaWR0aCA9IG1heChjaGlsZE1heCwgbV9tYXhQcmVmV2lkdGgpOworICAgICAgICAgICAgICAg
ICAgICAgICAgaW5saW5lTWF4ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAg
ICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBubyBsb25nZXIgc3RyaXBwaW5n
IHdoaXRlc3BhY2UgYXQgdGhlIHN0YXJ0IG9mCkBAIC00MzIwLDkgKzQyNjYsMTIgQEAgaW50IFJl
bmRlckJsb2NrOjpsaW5lSGVpZ2h0KGJvb2wgZmlyc3RMaQogICAgIC8vIHRoZSBiYXNlIGNsYXNz
LiAgSWYgd2UncmUgYmVpbmcgcXVlcmllZCBhcyB0aG91Z2ggd2UncmUgdGhlIHJvb3QgbGluZQog
ICAgIC8vIGJveCwgdGhlbiB0aGUgZmFjdCB0aGF0IHdlJ3JlIGFuIGlubGluZS1ibG9jayBpcyBp
cnJlbGV2YW50LCBhbmQgd2UgYmVoYXZlCiAgICAgLy8ganVzdCBsaWtlIGEgYmxvY2suCi0gICAg
aWYgKGlzUmVwbGFjZWQoKSAmJiAhaXNSb290TGluZUJveCkKKyAgICBpZiAoaXNSZXBsYWNlZCgp
ICYmICFpc1Jvb3RMaW5lQm94KSB7CisgICAgICAgIGlmIChpc0Fub255bW91c0lubGluZUJsb2Nr
KCkpCisgICAgICAgICAgICByZXR1cm4gaGVpZ2h0KCk7CiAgICAgICAgIHJldHVybiBoZWlnaHQo
KSArIG1hcmdpblRvcCgpICsgbWFyZ2luQm90dG9tKCk7Ci0gICAgCisgICAgfQorCiAgICAgaWYg
KGZpcnN0TGluZSAmJiBkb2N1bWVudCgpLT51c2VzRmlyc3RMaW5lUnVsZXMoKSkgewogICAgICAg
ICBSZW5kZXJTdHlsZSogcyA9IHN0eWxlKGZpcnN0TGluZSk7CiAgICAgICAgIGlmIChzICE9IHN0
eWxlKCkpCkBAIC00MzU0LDYgKzQzMDMsOCBAQCBpbnQgUmVuZGVyQmxvY2s6OmJhc2VsaW5lUG9z
aXRpb24oYm9vbCBiCiAgICAgICAgIC8vIFdlIGFsc28gZ2l2ZSB1cCBvbiBmaW5kaW5nIGEgYmFz
ZWxpbmUgaWYgd2UgaGF2ZSBhIHZlcnRpY2FsIHNjcm9sbGJhciwgb3IgaWYgd2UgYXJlIHNjcm9s
bGVkCiAgICAgICAgIC8vIHZlcnRpY2FsbHkgKGUuZy4sIGFuIG92ZXJmbG93OmhpZGRlbiBibG9j
ayB0aGF0IGhhcyBoYWQgc2Nyb2xsVG9wIG1vdmVkKSBvciBpZiB0aGUgYmFzZWxpbmUgaXMgb3V0
c2lkZQogICAgICAgICAvLyBvZiBvdXIgY29udGVudCBib3guCisgICAgICAgIGlmIChpc0Fub255
bW91c0lubGluZUJsb2NrKCkpCisgICAgICAgICAgICByZXR1cm4gaGVpZ2h0KCk7CiAgICAgICAg
IGludCBiYXNlbGluZVBvcyA9IChsYXllcigpICYmIChsYXllcigpLT5tYXJxdWVlKCkgfHwgbGF5
ZXIoKS0+dmVydGljYWxTY3JvbGxiYXIoKSB8fCBsYXllcigpLT5zY3JvbGxZT2Zmc2V0KCkgIT0g
MCkpID8gLTEgOiBsYXN0TGluZUJveEJhc2VsaW5lKCk7CiAgICAgICAgIGlmIChiYXNlbGluZVBv
cyAhPSAtMSAmJiBiYXNlbGluZVBvcyA8PSBib3JkZXJUb3AoKSArIHBhZGRpbmdUb3AoKSArIGNv
bnRlbnRIZWlnaHQoKSkKICAgICAgICAgICAgIHJldHVybiBtYXJnaW5Ub3AoKSArIGJhc2VsaW5l
UG9zOwpAQCAtNDc3OCw2MCArNDcyOSw2IEBAIHZvaWQgUmVuZGVyQmxvY2s6OnNldE1heEJvdHRv
bU1hcmdpbnMoaW4KICAgICBtX21heE1hcmdpbi0+bV9ib3R0b21OZWcgPSBuZWc7CiB9CiAKLXZv
aWQgUmVuZGVyQmxvY2s6OmFic29sdXRlUmVjdHMoVmVjdG9yPEludFJlY3Q+JiByZWN0cywgaW50
IHR4LCBpbnQgdHkpCi17Ci0gICAgLy8gRm9yIGJsb2NrcyBpbnNpZGUgaW5saW5lcywgd2UgZ28g
YWhlYWQgYW5kIGluY2x1ZGUgbWFyZ2lucyBzbyB0aGF0IHdlIHJ1biByaWdodCB1cCB0byB0aGUK
LSAgICAvLyBpbmxpbmUgYm94ZXMgYWJvdmUgYW5kIGJlbG93IHVzICh0aHVzIGdldHRpbmcgbWVy
Z2VkIHdpdGggdGhlbSB0byBmb3JtIGEgc2luZ2xlIGlycmVndWxhcgotICAgIC8vIHNoYXBlKS4K
LSAgICBpZiAoaW5saW5lQ29udGludWF0aW9uKCkpIHsKLSAgICAgICAgcmVjdHMuYXBwZW5kKElu
dFJlY3QodHgsIHR5IC0gY29sbGFwc2VkTWFyZ2luVG9wKCksCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHdpZHRoKCksIGhlaWdodCgpICsgY29sbGFwc2VkTWFyZ2luVG9wKCkgKyBjb2xs
YXBzZWRNYXJnaW5Cb3R0b20oKSkpOwotICAgICAgICBpbmxpbmVDb250aW51YXRpb24oKS0+YWJz
b2x1dGVSZWN0cyhyZWN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgdHggLSB4KCkgKyBpbmxpbmVDb250aW51YXRpb24oKS0+Y29udGFpbmluZ0Jsb2NrKCkt
PngoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHkgLSB5
KCkgKyBpbmxpbmVDb250aW51YXRpb24oKS0+Y29udGFpbmluZ0Jsb2NrKCktPnkoKSk7Ci0gICAg
fSBlbHNlCi0gICAgICAgIHJlY3RzLmFwcGVuZChJbnRSZWN0KHR4LCB0eSwgd2lkdGgoKSwgaGVp
Z2h0KCkpKTsKLX0KLQotdm9pZCBSZW5kZXJCbG9jazo6YWJzb2x1dGVRdWFkcyhWZWN0b3I8Rmxv
YXRRdWFkPiYgcXVhZHMpCi17Ci0gICAgLy8gRm9yIGJsb2NrcyBpbnNpZGUgaW5saW5lcywgd2Ug
Z28gYWhlYWQgYW5kIGluY2x1ZGUgbWFyZ2lucyBzbyB0aGF0IHdlIHJ1biByaWdodCB1cCB0byB0
aGUKLSAgICAvLyBpbmxpbmUgYm94ZXMgYWJvdmUgYW5kIGJlbG93IHVzICh0aHVzIGdldHRpbmcg
bWVyZ2VkIHdpdGggdGhlbSB0byBmb3JtIGEgc2luZ2xlIGlycmVndWxhcgotICAgIC8vIHNoYXBl
KS4KLSAgICBpZiAoaW5saW5lQ29udGludWF0aW9uKCkpIHsKLSAgICAgICAgRmxvYXRSZWN0IGxv
Y2FsUmVjdCgwLCAtY29sbGFwc2VkTWFyZ2luVG9wKCksCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgd2lkdGgoKSwgaGVpZ2h0KCkgKyBjb2xsYXBzZWRNYXJnaW5Ub3AoKSArIGNvbGxhcHNl
ZE1hcmdpbkJvdHRvbSgpKTsKLSAgICAgICAgcXVhZHMuYXBwZW5kKGxvY2FsVG9BYnNvbHV0ZVF1
YWQobG9jYWxSZWN0KSk7Ci0gICAgICAgIGlubGluZUNvbnRpbnVhdGlvbigpLT5hYnNvbHV0ZVF1
YWRzKHF1YWRzKTsKLSAgICB9IGVsc2UKLSAgICAgICAgcXVhZHMuYXBwZW5kKFJlbmRlckJveDo6
bG9jYWxUb0Fic29sdXRlUXVhZChGbG9hdFJlY3QoMCwgMCwgd2lkdGgoKSwgaGVpZ2h0KCkpKSk7
Ci19Ci0KLUludFJlY3QgUmVuZGVyQmxvY2s6OnJlY3RXaXRoT3V0bGluZUZvclJlcGFpbnQoUmVu
ZGVyQm94TW9kZWxPYmplY3QqIHJlcGFpbnRDb250YWluZXIsIGludCBvdXRsaW5lV2lkdGgpCi17
Ci0gICAgSW50UmVjdCByKFJlbmRlckJveDo6cmVjdFdpdGhPdXRsaW5lRm9yUmVwYWludChyZXBh
aW50Q29udGFpbmVyLCBvdXRsaW5lV2lkdGgpKTsKLSAgICBpZiAoaW5saW5lQ29udGludWF0aW9u
KCkpCi0gICAgICAgIHIuaW5mbGF0ZVkoY29sbGFwc2VkTWFyZ2luVG9wKCkpOwotICAgIHJldHVy
biByOwotfQotCi1SZW5kZXJPYmplY3QqIFJlbmRlckJsb2NrOjpob3ZlckFuY2VzdG9yKCkgY29u
c3QKLXsKLSAgICByZXR1cm4gaW5saW5lQ29udGludWF0aW9uKCkgPyBpbmxpbmVDb250aW51YXRp
b24oKSA6IFJlbmRlckJveDo6aG92ZXJBbmNlc3RvcigpOwotfQotCi12b2lkIFJlbmRlckJsb2Nr
Ojp1cGRhdGVEcmFnU3RhdGUoYm9vbCBkcmFnT24pCi17Ci0gICAgUmVuZGVyQm94Ojp1cGRhdGVE
cmFnU3RhdGUoZHJhZ09uKTsKLSAgICBpZiAoaW5saW5lQ29udGludWF0aW9uKCkpCi0gICAgICAg
IGlubGluZUNvbnRpbnVhdGlvbigpLT51cGRhdGVEcmFnU3RhdGUoZHJhZ09uKTsKLX0KLQotUmVu
ZGVyU3R5bGUqIFJlbmRlckJsb2NrOjpvdXRsaW5lU3R5bGVGb3JSZXBhaW50KCkgY29uc3QKLXsK
LSAgICByZXR1cm4gaW5saW5lQ29udGludWF0aW9uKCkgPyBpbmxpbmVDb250aW51YXRpb24oKS0+
c3R5bGUoKSA6IHN0eWxlKCk7Ci19Ci0KIHZvaWQgUmVuZGVyQmxvY2s6OmNoaWxkQmVjYW1lTm9u
SW5saW5lKFJlbmRlck9iamVjdCopCiB7CiAgICAgbWFrZUNoaWxkcmVuTm9uSW5saW5lKCk7CkBA
IC00ODQwLDI2ICs0NzM3LDYgQEAgdm9pZCBSZW5kZXJCbG9jazo6Y2hpbGRCZWNhbWVOb25Jbmxp
bmUoUgogICAgIC8vIHx0aGlzfCBtYXkgYmUgZGVhZCBoZXJlCiB9CiAKLXZvaWQgUmVuZGVyQmxv
Y2s6OnVwZGF0ZUhpdFRlc3RSZXN1bHQoSGl0VGVzdFJlc3VsdCYgcmVzdWx0LCBjb25zdCBJbnRQ
b2ludCYgcG9pbnQpCi17Ci0gICAgaWYgKHJlc3VsdC5pbm5lck5vZGUoKSkKLSAgICAgICAgcmV0
dXJuOwotCi0gICAgTm9kZSogbiA9IG5vZGUoKTsKLSAgICBpZiAoaW5saW5lQ29udGludWF0aW9u
KCkpCi0gICAgICAgIC8vIFdlIGFyZSBpbiB0aGUgbWFyZ2lucyBvZiBibG9jayBlbGVtZW50cyB0
aGF0IGFyZSBwYXJ0IG9mIGEgY29udGludWF0aW9uLiAgSW4KLSAgICAgICAgLy8gdGhpcyBjYXNl
IHdlJ3JlIGFjdHVhbGx5IHN0aWxsIGluc2lkZSB0aGUgZW5jbG9zaW5nIGlubGluZSBlbGVtZW50
IHRoYXQgd2FzCi0gICAgICAgIC8vIHNwbGl0LiAgR28gYWhlYWQgYW5kIHNldCBvdXIgaW5uZXIg
bm9kZSBhY2NvcmRpbmdseS4KLSAgICAgICAgbiA9IGlubGluZUNvbnRpbnVhdGlvbigpLT5ub2Rl
KCk7Ci0KLSAgICBpZiAobikgewotICAgICAgICByZXN1bHQuc2V0SW5uZXJOb2RlKG4pOwotICAg
ICAgICBpZiAoIXJlc3VsdC5pbm5lck5vblNoYXJlZE5vZGUoKSkKLSAgICAgICAgICAgIHJlc3Vs
dC5zZXRJbm5lck5vblNoYXJlZE5vZGUobik7Ci0gICAgICAgIHJlc3VsdC5zZXRMb2NhbFBvaW50
KHBvaW50KTsKLSAgICB9Ci19Ci0KIEludFJlY3QgUmVuZGVyQmxvY2s6OmxvY2FsQ2FyZXRSZWN0
KElubGluZUJveCogaW5saW5lQm94LCBpbnQgY2FyZXRPZmZzZXQsIGludCogZXh0cmFXaWR0aFRv
RW5kT2ZMaW5lKQogewogICAgIC8vIERvIHRoZSBub3JtYWwgY2FsY3VsYXRpb24gaW4gbW9zdCBj
YXNlcy4KQEAgLTQ5NDMsMTcgKzQ4MjAsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjphZGRGb2N1c1Jp
bmdSZWN0cyhHcmFwCiAgICAgLy8gRm9yIGJsb2NrcyBpbnNpZGUgaW5saW5lcywgd2UgZ28gYWhl
YWQgYW5kIGluY2x1ZGUgbWFyZ2lucyBzbyB0aGF0IHdlIHJ1biByaWdodCB1cCB0byB0aGUKICAg
ICAvLyBpbmxpbmUgYm94ZXMgYWJvdmUgYW5kIGJlbG93IHVzICh0aHVzIGdldHRpbmcgbWVyZ2Vk
IHdpdGggdGhlbSB0byBmb3JtIGEgc2luZ2xlIGlycmVndWxhcgogICAgIC8vIHNoYXBlKS4KLSAg
ICBpZiAoaW5saW5lQ29udGludWF0aW9uKCkpIHsKLSAgICAgICAgLy8gRklYTUU6IFRoaXMgY2hl
Y2sgcmVhbGx5IGlzbid0IGFjY3VyYXRlLiAKLSAgICAgICAgYm9vbCBuZXh0SW5saW5lSGFzTGlu
ZUJveCA9IGlubGluZUNvbnRpbnVhdGlvbigpLT5maXJzdExpbmVCb3goKTsKLSAgICAgICAgLy8g
RklYTUU6IFRoaXMgaXMgd3JvbmcuIFRoZSBwcmluY2lwYWwgcmVuZGVyZXIgbWF5IG5vdCBiZSB0
aGUgY29udGludWF0aW9uIHByZWNlZGluZyB0aGlzIGJsb2NrLgotICAgICAgICBib29sIHByZXZJ
bmxpbmVIYXNMaW5lQm94ID0gdG9SZW5kZXJJbmxpbmUoaW5saW5lQ29udGludWF0aW9uKCktPm5v
ZGUoKS0+cmVuZGVyZXIoKSktPmZpcnN0TGluZUJveCgpOyAKLSAgICAgICAgaW50IHRvcE1hcmdp
biA9IHByZXZJbmxpbmVIYXNMaW5lQm94ID8gY29sbGFwc2VkTWFyZ2luVG9wKCkgOiAwOwotICAg
ICAgICBpbnQgYm90dG9tTWFyZ2luID0gbmV4dElubGluZUhhc0xpbmVCb3ggPyBjb2xsYXBzZWRN
YXJnaW5Cb3R0b20oKSA6IDA7Ci0gICAgICAgIGdyYXBoaWNzQ29udGV4dC0+YWRkRm9jdXNSaW5n
UmVjdChJbnRSZWN0KHR4LCB0eSAtIHRvcE1hcmdpbiwgCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoKCksIGhlaWdodCgpICsgdG9wTWFyZ2lu
ICsgYm90dG9tTWFyZ2luKSk7Ci0gICAgfSBlbHNlCi0gICAgICAgIGdyYXBoaWNzQ29udGV4dC0+
YWRkRm9jdXNSaW5nUmVjdChJbnRSZWN0KHR4LCB0eSwgd2lkdGgoKSwgaGVpZ2h0KCkpKTsKKyAg
ICBncmFwaGljc0NvbnRleHQtPmFkZEZvY3VzUmluZ1JlY3QoSW50UmVjdCh0eCwgdHksIHdpZHRo
KCksIGhlaWdodCgpKSk7CiAKICAgICBpZiAoIWhhc092ZXJmbG93Q2xpcCgpICYmICFoYXNDb250
cm9sQ2xpcCgpKSB7CiAgICAgICAgIGZvciAoUm9vdElubGluZUJveCogY3VyciA9IGZpcnN0Um9v
dEJveCgpOyBjdXJyOyBjdXJyID0gY3Vyci0+bmV4dFJvb3RCb3goKSkgewpAQCAtNDk3NSwxMSAr
NDg0Miw2IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmFkZEZvY3VzUmluZ1JlY3RzKEdyYXAKICAgICAg
ICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLQotICAgIGlmIChpbmxpbmVDb250aW51YXRpb24o
KSkKLSAgICAgICAgaW5saW5lQ29udGludWF0aW9uKCktPmFkZEZvY3VzUmluZ1JlY3RzKGdyYXBo
aWNzQ29udGV4dCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB0eCAtIHgoKSArIGlubGluZUNvbnRpbnVhdGlvbigpLT5jb250YWluaW5nQmxvY2soKS0+
eCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHkg
LSB5KCkgKyBpbmxpbmVDb250aW51YXRpb24oKS0+Y29udGFpbmluZ0Jsb2NrKCktPnkoKSk7CiB9
CiAKIFJlbmRlckJsb2NrKiBSZW5kZXJCbG9jazo6Y3JlYXRlQW5vbnltb3VzQmxvY2soYm9vbCBp
c0ZsZXhpYmxlQm94KSBjb25zdApAQCAtNTAxMSw2ICs0ODczLDggQEAgY29uc3QgY2hhciogUmVu
ZGVyQmxvY2s6OnJlbmRlck5hbWUoKSBjbwogICAgICAgICByZXR1cm4gIlJlbmRlckJsb2NrIChw
b3NpdGlvbmVkKSI7CiAgICAgaWYgKGlzQW5vbnltb3VzQmxvY2soKSkKICAgICAgICAgcmV0dXJu
ICJSZW5kZXJCbG9jayAoYW5vbnltb3VzKSI7CisgICAgZWxzZSBpZiAoaXNBbm9ueW1vdXNJbmxp
bmVCbG9jaygpKQorICAgICAgICByZXR1cm4gIlJlbmRlckJsb2NrIChhbm9ueW1vdXMgaW5saW5l
LWJsb2NrKSI7CiAgICAgZWxzZSBpZiAoaXNBbm9ueW1vdXMoKSkKICAgICAgICAgcmV0dXJuICJS
ZW5kZXJCbG9jayAoZ2VuZXJhdGVkKSI7CiAgICAgaWYgKGlzUmVsUG9zaXRpb25lZCgpKQpJbmRl
eDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3JlbmRlcmluZy9SZW5kZXJCbG9jay5oCShyZXZpc2lvbiA0NzY3OCkKKysrIFdlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlckJsb2NrLmgJKHdvcmtpbmcgY29weSkKQEAgLTEzMCwxMSArMTMwLDYgQEAg
cHVibGljOgogCiAgICAgdm9pZCBhZGp1c3RSZWN0Rm9yQ29sdW1ucyhJbnRSZWN0JikgY29uc3Q7
CiAKLSAgICB2b2lkIGFkZENvbnRpbnVhdGlvbldpdGhPdXRsaW5lKFJlbmRlcklubGluZSopOwot
Ci0gICAgUmVuZGVySW5saW5lKiBpbmxpbmVDb250aW51YXRpb24oKSBjb25zdCB7IHJldHVybiBt
X2lubGluZUNvbnRpbnVhdGlvbjsgfQotICAgIHZvaWQgc2V0SW5saW5lQ29udGludWF0aW9uKFJl
bmRlcklubGluZSogYykgeyBtX2lubGluZUNvbnRpbnVhdGlvbiA9IGM7IH0KLQogICAgIC8vIFRo
aXMgZnVuY3Rpb24gaXMgYSBjb252ZW5pZW5jZSBoZWxwZXIgZm9yIGNyZWF0aW5nIGFuIGFub255
bW91cyBibG9jayB0aGF0IGluaGVyaXRzIGl0cwogICAgIC8vIHN0eWxlIGZyb20gdGhpcyBSZW5k
ZXJCbG9jay4KICAgICBSZW5kZXJCbG9jayogY3JlYXRlQW5vbnltb3VzQmxvY2soYm9vbCBpc0Zs
ZXhpYmxlQm94ID0gZmFsc2UpIGNvbnN0OwpAQCAtMTc2LDggKzE3MSw2IEBAIHByb3RlY3RlZDoK
IAogICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVGaXJzdExldHRlcigpOwogCi0gICAgdmlydHVhbCB2
b2lkIHVwZGF0ZUhpdFRlc3RSZXN1bHQoSGl0VGVzdFJlc3VsdCYsIGNvbnN0IEludFBvaW50Jik7
Ci0KICAgICAvLyBEZWxheSB1cGRhdGUgc2Nyb2xsYmFyIHVudGlsIGZpbmlzaERlbGF5UmVwYWlu
dCgpIHdpbGwgYmUKICAgICAvLyBjYWxsZWQuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB3aGVuIGEg
ZmxleGJveCBpcyBsYXlpbmcgb3V0IGl0cwogICAgIC8vIGRlc2NlbmRhbnQuIElmIG11bHRpcGxl
IGNhbGxzIGFyZSBtYWRlIHRvIHN0YXJ0RGVsYXlSZXBhaW50KCksCkBAIC0yNDEsNyArMjM0LDkg
QEAgcHJpdmF0ZToKICAgICAgICAgYm9vbCBldmVySGFkTGF5b3V0OwogICAgIH07CiAKLSAgICAv
LyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucycgaW1wbGVtZW50YXRpb25zIGFyZSBpbiBSZW5kZXJC
bG9ja0xpbmVMYXlvdXQuY3BwLgorICAgIGNsYXNzIE1hcmdpbkluZm87CisKKyAgICAvLyBUaGUg
Zm9sbG93aW5nIGZ1bmN0aW9ucycgaW1wbGVtZW50YXRpb25zIGFyZSBpbiBSZW5kZXJCbG9ja0xp
bmVMYXlvdXQuY3BwLiAgICAKICAgICB2b2lkIGJpZGlSZW9yZGVyTGluZShJbmxpbmVCaWRpUmVz
b2x2ZXImLCBjb25zdCBJbmxpbmVJdGVyYXRvciYgZW5kLCBib29sIHByZXZpb3VzTGluZUJyb2tl
Q2xlYW5seSk7CiAgICAgUm9vdElubGluZUJveCogZGV0ZXJtaW5lU3RhcnRQb3NpdGlvbihib29s
JiBmaXJzdExpbmUsIGJvb2wmIGZ1bGxMYXlvdXQsIGJvb2wmIHByZXZpb3VzTGluZUJyb2tlQ2xl
YW5seSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElubGluZUJp
ZGlSZXNvbHZlciYsIFZlY3RvcjxGbG9hdFdpdGhSZWN0PiYgZmxvYXRzLCB1bnNpZ25lZCYgbnVt
Q2xlYW5GbG9hdHMpOwpAQCAtMjU0LDcgKzI0OSw3IEBAIHByaXZhdGU6CiAgICAgdm9pZCBza2lw
VHJhaWxpbmdXaGl0ZXNwYWNlKElubGluZUl0ZXJhdG9yJiwgYm9vbCBpc0xpbmVFbXB0eSwgYm9v
bCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHkpOwogICAgIGludCBza2lwTGVhZGluZ1doaXRlc3Bh
Y2UoSW5saW5lQmlkaVJlc29sdmVyJiwgYm9vbCBmaXJzdExpbmUsIGJvb2wgaXNMaW5lRW1wdHks
IGJvb2wgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KTsKICAgICB2b2lkIGZpdEJlbG93RmxvYXRz
KGludCB3aWR0aFRvRml0LCBib29sIGZpcnN0TGluZSwgaW50JiBhdmFpbGFibGVXaWR0aCk7Ci0g
ICAgSW5saW5lSXRlcmF0b3IgZmluZE5leHRMaW5lQnJlYWsoSW5saW5lQmlkaVJlc29sdmVyJiwg
Ym9vbCBmaXJzdExpbmUsIGJvb2wmIGlzTGluZUVtcHR5LCBib29sJiBwcmV2aW91c0xpbmVCcm9r
ZUNsZWFubHksIEVDbGVhciogY2xlYXIgPSAwKTsKKyAgICBJbmxpbmVJdGVyYXRvciBmaW5kTmV4
dExpbmVCcmVhayhJbmxpbmVCaWRpUmVzb2x2ZXImLCBib29sIGZpcnN0TGluZSwgYm9vbCYgaXNM
aW5lRW1wdHksIGJvb2wmIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSwgTWFyZ2luSW5mbyYsIEVD
bGVhciogY2xlYXIgPSAwKTsKICAgICBSb290SW5saW5lQm94KiBjb25zdHJ1Y3RMaW5lKHVuc2ln
bmVkIHJ1bkNvdW50LCBCaWRpUnVuKiBmaXJzdFJ1biwgQmlkaVJ1biogbGFzdFJ1biwgYm9vbCBm
aXJzdExpbmUsIGJvb2wgbGFzdExpbmUsIFJlbmRlck9iamVjdCogZW5kT2JqZWN0KTsKICAgICBJ
bmxpbmVGbG93Qm94KiBjcmVhdGVMaW5lQm94ZXMoUmVuZGVyT2JqZWN0KiwgYm9vbCBmaXJzdExp
bmUpOwogICAgIHZvaWQgY29tcHV0ZUhvcml6b250YWxQb3NpdGlvbnNGb3JMaW5lKFJvb3RJbmxp
bmVCb3gqLCBib29sIGZpcnN0TGluZSwgQmlkaVJ1biogZmlyc3RSdW4sIEJpZGlSdW4qIHRyYWls
aW5nU3BhY2VSdW4sIGJvb2wgcmVhY2hlZEVuZCk7CkBAIC0zMTAsMTIgKzMwNSw3IEBAIHByaXZh
dGU6CiAgICAgLy8gY2hpbGRyZW4uCiAgICAgdmlydHVhbCBSZW5kZXJCbG9jayogZmlyc3RMaW5l
QmxvY2soKSBjb25zdDsKICAgICBib29sIGluUm9vdEJsb2NrQ29udGV4dCgpIGNvbnN0OwotCi0g
ICAgdmlydHVhbCBJbnRSZWN0IHJlY3RXaXRoT3V0bGluZUZvclJlcGFpbnQoUmVuZGVyQm94TW9k
ZWxPYmplY3QqIHJlcGFpbnRDb250YWluZXIsIGludCBvdXRsaW5lV2lkdGgpOwotICAgIHZpcnR1
YWwgUmVuZGVyU3R5bGUqIG91dGxpbmVTdHlsZUZvclJlcGFpbnQoKSBjb25zdDsKICAgICAKLSAg
ICB2aXJ0dWFsIFJlbmRlck9iamVjdCogaG92ZXJBbmNlc3RvcigpIGNvbnN0OwotICAgIHZpcnR1
YWwgdm9pZCB1cGRhdGVEcmFnU3RhdGUoYm9vbCBkcmFnT24pOwogICAgIHZpcnR1YWwgdm9pZCBj
aGlsZEJlY2FtZU5vbklubGluZShSZW5kZXJPYmplY3QqIGNoaWxkKTsKIAogICAgIHZpcnR1YWwg
SW50UmVjdCBzZWxlY3Rpb25SZWN0Rm9yUmVwYWludChSZW5kZXJCb3hNb2RlbE9iamVjdCogcmVw
YWludENvbnRhaW5lciwgYm9vbCAvKmNsaXBUb1Zpc2libGVDb250ZW50Ki8pCkBAIC0zMzUsMTYg
KzMyNSwxMSBAQCBwcml2YXRlOgogICAgIGludCBsZWZ0U2VsZWN0aW9uT2Zmc2V0KFJlbmRlckJs
b2NrKiByb290QmxvY2ssIGludCB5KTsKICAgICBpbnQgcmlnaHRTZWxlY3Rpb25PZmZzZXQoUmVu
ZGVyQmxvY2sqIHJvb3RCbG9jaywgaW50IHkpOwogCi0gICAgdmlydHVhbCB2b2lkIGFic29sdXRl
UmVjdHMoVmVjdG9yPEludFJlY3Q+JiwgaW50IHR4LCBpbnQgdHkpOwotICAgIHZpcnR1YWwgdm9p
ZCBhYnNvbHV0ZVF1YWRzKFZlY3RvcjxGbG9hdFF1YWQ+Jik7Ci0KICAgICBpbnQgZGVzaXJlZENv
bHVtbldpZHRoKCkgY29uc3Q7CiAgICAgdW5zaWduZWQgZGVzaXJlZENvbHVtbkNvdW50KCkgY29u
c3Q7CiAgICAgVmVjdG9yPEludFJlY3Q+KiBjb2x1bW5SZWN0cygpIGNvbnN0OwogICAgIHZvaWQg
c2V0RGVzaXJlZENvbHVtbkNvdW50QW5kV2lkdGgoaW50IGNvdW50LCBpbnQgd2lkdGgpOwogICAg
IGludCBjb2x1bW5HYXAoKSBjb25zdDsKLSAgICAKLSAgICB2b2lkIHBhaW50Q29udGludWF0aW9u
T3V0bGluZXMoUGFpbnRJbmZvJiwgaW50IHR4LCBpbnQgdHkpOwogCiAgICAgdmlydHVhbCBJbnRS
ZWN0IGxvY2FsQ2FyZXRSZWN0KElubGluZUJveCosIGludCBjYXJldE9mZnNldCwgaW50KiBleHRy
YVdpZHRoVG9FbmRPZkxpbmUgPSAwKTsKIApAQCAtNDgwLDEyICs0NjUsNiBAQCBwcml2YXRlOgog
ICAgIERlcHJlY2F0ZWRQdHJMaXN0PEZsb2F0aW5nT2JqZWN0PiogbV9mbG9hdGluZ09iamVjdHM7
CiAgICAgTGlzdEhhc2hTZXQ8UmVuZGVyQm94Kj4qIG1fcG9zaXRpb25lZE9iamVjdHM7CiAKLSAg
ICAvLyBBbiBpbmxpbmUgY2FuIGJlIHNwbGl0IHdpdGggYmxvY2tzIG9jY3VycmluZyBpbiBiZXR3
ZWVuIHRoZSBpbmxpbmUgY29udGVudC4KLSAgICAvLyBXaGVuIHRoaXMgb2NjdXJzIHdlIG5lZWQg
YSBwb2ludGVyIHRvIG91ciBuZXh0IG9iamVjdC4gIFdlIGNhbiBiYXNpY2FsbHkgYmUKLSAgICAv
LyBzcGxpdCBpbnRvIGEgc2VxdWVuY2Ugb2YgaW5saW5lcyBhbmQgYmxvY2tzLiAgVGhlIGNvbnRp
bnVhdGlvbiB3aWxsIGVpdGhlciBiZQotICAgIC8vIGFuIGFub255bW91cyBibG9jayAodGhhdCBo
b3VzZXMgb3RoZXIgYmxvY2tzKSBvciBpdCB3aWxsIGJlIGFuIGlubGluZSBmbG93LgotICAgIFJl
bmRlcklubGluZSogbV9pbmxpbmVDb250aW51YXRpb247Ci0KICAgICAvLyBBbGxvY2F0ZWQgb25s
eSB3aGVuIHNvbWUgb2YgdGhlc2UgZmllbGRzIGhhdmUgbm9uLWRlZmF1bHQgdmFsdWVzCiAgICAg
c3RydWN0IE1heE1hcmdpbiB7CiAgICAgICAgIE1heE1hcmdpbihjb25zdCBSZW5kZXJCbG9jayog
bykgCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5jcHAJ
KHJldmlzaW9uIDQ3NTkxKQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5
b3V0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTcwLDEyICs1NzAsMTYgQEAgUm9vdElubGluZUJv
eCogUmVuZGVyQmxvY2s6OmNvbnN0cnVjdExpbgogICAgICAgICBpZiAoIWJveCkKICAgICAgICAg
ICAgIGNvbnRpbnVlOwogCisgICAgICAgIC8vIEFub255bW91cyBpbmxpbmUgYmxvY2tzICh1c2Vk
IHRvIGhvbGQgYmxvY2tzIGluc2lkZSBpbmxpbmVzKSBkb24ndCBuZWVkIHRvIHdhc3RlIHRpbWUg
d3JhcHBpbmcKKyAgICAgICAgLy8gdGhlbXNlbHZlcyBpbiB0aG9zZSBpbmxpbmVzIChzaW5jZSB3
ZSB3YW50IHRvIHByZXRlbmQgbGlrZSB0aGV5IGRvbid0IGV4aXN0IG9uIHRoaXMgZmFrZSBsaW5l
KS4KKyAgICAgICAgUmVuZGVyT2JqZWN0KiBhbmNlc3RvclJlbmRlcmVyID0gci0+bV9vYmplY3Qt
PmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSA/IHRoaXMgOiByLT5tX29iamVjdC0+cGFyZW50KCk7
CisgCiAgICAgICAgIC8vIElmIHdlIGhhdmUgbm8gcGFyZW50IGJveCB5ZXQsIG9yIGlmIHRoZSBy
dW4gaXMgbm90IHNpbXBseSBhIHNpYmxpbmcsCiAgICAgICAgIC8vIHRoZW4gd2UgbmVlZCB0byBj
b25zdHJ1Y3QgaW5saW5lIGJveGVzIGFzIG5lY2Vzc2FyeSB0byBwcm9wZXJseSBlbmNsb3NlIHRo
ZQogICAgICAgICAvLyBydW4ncyBpbmxpbmUgYm94LgotICAgICAgICBpZiAoIXBhcmVudEJveCB8
fCBwYXJlbnRCb3gtPnJlbmRlcmVyKCkgIT0gci0+bV9vYmplY3QtPnBhcmVudCgpKQorICAgICAg
ICBpZiAoIXBhcmVudEJveCB8fCBwYXJlbnRCb3gtPnJlbmRlcmVyKCkgIT0gYW5jZXN0b3JSZW5k
ZXJlcikKICAgICAgICAgICAgIC8vIENyZWF0ZSBuZXcgaW5saW5lIGJveGVzIGFsbCB0aGUgd2F5
IGJhY2sgdG8gdGhlIGFwcHJvcHJpYXRlIGluc2VydGlvbiBwb2ludC4KLSAgICAgICAgICAgIHBh
cmVudEJveCA9IGNyZWF0ZUxpbmVCb3hlcyhyLT5tX29iamVjdC0+cGFyZW50KCksIGZpcnN0TGlu
ZSk7CisgICAgICAgICAgICBwYXJlbnRCb3ggPSBjcmVhdGVMaW5lQm94ZXMoYW5jZXN0b3JSZW5k
ZXJlciwgZmlyc3RMaW5lKTsKIAogICAgICAgICAvLyBBcHBlbmQgdGhlIGlubGluZSBib3ggdG8g
dGhpcyBsaW5lLgogICAgICAgICBwYXJlbnRCb3gtPmFkZFRvTGluZShib3gpOwpAQCAtNjE3LDYg
KzYyMSw4IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmNvbXB1dGVIb3Jpem9udGFsUG9zaXQKICAgICB1
bnNpZ25lZCBudW1TcGFjZXMgPSAwOwogICAgIEVUZXh0QWxpZ24gdGV4dEFsaWduID0gc3R5bGUo
KS0+dGV4dEFsaWduKCk7CiAKKyAgICBpbnQgeCA9IGxlZnRPZmZzZXQoaGVpZ2h0KCksIGZpcnN0
TGluZSk7CisKICAgICBmb3IgKEJpZGlSdW4qIHIgPSBmaXJzdFJ1bjsgcjsgciA9IHItPm5leHQo
KSkgewogICAgICAgICBpZiAoIXItPm1fYm94IHx8IHItPm1fb2JqZWN0LT5pc1Bvc2l0aW9uZWQo
KSB8fCByLT5tX2JveC0+aXNMaW5lQnJlYWsoKSkKICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBQ
b3NpdGlvbmVkIG9iamVjdHMgYXJlIG9ubHkgcGFydGljaXBhdGluZyB0byBmaWd1cmUgb3V0IHRo
ZWlyCkBAIC02NTQsNiArNjYwLDEyIEBAIHZvaWQgUmVuZGVyQmxvY2s6OmNvbXB1dGVIb3Jpem9u
dGFsUG9zaXQKICAgICAgICAgICAgIHJlbmRlckJveC0+Y2FsY1dpZHRoKCk7CiAgICAgICAgICAg
ICByLT5tX2JveC0+c2V0V2lkdGgocmVuZGVyQm94LT53aWR0aCgpKTsKICAgICAgICAgICAgIHRv
dFdpZHRoICs9IHJlbmRlckJveC0+bWFyZ2luTGVmdCgpICsgcmVuZGVyQm94LT5tYXJnaW5SaWdo
dCgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoci0+bV9vYmplY3QtPmlzQW5vbnlt
b3VzSW5saW5lQmxvY2soKSkgeworICAgICAgICAgICAgICAgIC8vIEFsbG93IHRoZSBmdWxsIGF2
YWlsYWJsZSB3aWR0aCB0byBiZSB1c2VkLCBzaW5jZSBmbG9hdHMgd2lsbCBpbnRydWRlIGludG8g
b3VyIHNwYWNlLgorICAgICAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoID0gcmlnaHRPZmZzZXQo
KSAtIGxlZnRPZmZzZXQoKTsKKyAgICAgICAgICAgICAgICB4ID0gbGVmdE9mZnNldCgpOworICAg
ICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgdG90V2lkdGggKz0gci0+bV9ib3gtPndp
ZHRoKCk7CkBAIC02NjMsNyArNjc1LDYgQEAgdm9pZCBSZW5kZXJCbG9jazo6Y29tcHV0ZUhvcml6
b250YWxQb3NpdAogICAgIC8vIHdlIG5vdyBleGFtaW5lIG91ciB0ZXh0LWFsaWduIHByb3BlcnR5
IGluIG9yZGVyIHRvIGRldGVybWluZSB3aGVyZSB0byBwb3NpdGlvbiB0aGUKICAgICAvLyBvYmpl
Y3RzIGhvcml6b250YWxseS4gIFRoZSB0b3RhbCB3aWR0aCBvZiB0aGUgbGluZSBjYW4gYmUgaW5j
cmVhc2VkIGlmIHdlIGVuZCB1cAogICAgIC8vIGp1c3RpZnlpbmcgdGV4dC4KLSAgICBpbnQgeCA9
IGxlZnRPZmZzZXQoaGVpZ2h0KCksIGZpcnN0TGluZSk7CiAgICAgc3dpdGNoICh0ZXh0QWxpZ24p
IHsKICAgICAgICAgY2FzZSBMRUZUOgogICAgICAgICBjYXNlIFdFQktJVF9MRUZUOgpAQCAtODE3
LDkgKzgyOCwxNSBAQCB2b2lkIFJlbmRlckJsb2NrOjpsYXlvdXRJbmxpbmVDaGlsZHJlbihiCiAg
ICAgYm9vbCB1c2VSZXBhaW50Qm91bmRzID0gZmFsc2U7CiAgICAgCiAgICAgbV9vdmVyZmxvdy5j
bGVhcigpOwotICAgICAgICAKLSAgICBzZXRIZWlnaHQoYm9yZGVyVG9wKCkgKyBwYWRkaW5nVG9w
KCkpOwotICAgIGludCB0b0FkZCA9IGJvcmRlckJvdHRvbSgpICsgcGFkZGluZ0JvdHRvbSgpICsg
aG9yaXpvbnRhbFNjcm9sbGJhckhlaWdodCgpOworICAgIAorICAgIGludCB0b3AgPSBib3JkZXJU
b3AoKSArIHBhZGRpbmdUb3AoKTsKKyAgICBpbnQgYm90dG9tID0gYm9yZGVyQm90dG9tKCkgKyBw
YWRkaW5nQm90dG9tKCkgKyBob3Jpem9udGFsU2Nyb2xsYmFySGVpZ2h0KCk7CisKKyAgICBzZXRI
ZWlnaHQodG9wKTsKKworICAgIC8vIFRoZSBtYXJnaW4gc3RydWN0IGNhY2hlcyBhbGwgb3VyIGN1
cnJlbnQgbWFyZ2luIGNvbGxhcHNpbmcgc3RhdGUuIFdlIHJ1biBtYXJnaW4gY29sbGFwc2luZyB3
aGVuIHdlIGVuY291bnRlciBhbm9ueW1vdXMgaW5saW5lIGJsb2NrcyB0aGF0IGFyZSBiZWluZyB1
c2VkCisgICAgLy8gZm9yIHRoZSBibG9ja3MtaW5zaWRlLWlubGluZXMgY2FzZSAoYW5kIHRoZSBp
bmxpbmVzIGFyZSBlbXB0eSksIGUuZywgPHNwYW4+PGRpdj5PbmU8L2Rpdj48L3NwYW4+LgorICAg
IE1hcmdpbkluZm8gbWFyZ2luSW5mbyh0aGlzLCB0b3AsIGJvdHRvbSk7CiAKICAgICAvLyBGaWd1
cmUgb3V0IGlmIHdlIHNob3VsZCBjbGVhciBvdXQgb3VyIGxpbmUgYm94ZXMuCiAgICAgLy8gRklY
TUU6IEhhbmRsZSByZXNpemUgZXZlbnR1YWxseSEKQEAgLTg0NywxMiArODY0LDE1IEBAIHZvaWQg
UmVuZGVyQmxvY2s6OmxheW91dElubGluZUNoaWxkcmVuKGIKICAgICAgICAgICAgIGlmIChvLT5p
c1JlcGxhY2VkKCkgfHwgby0+aXNGbG9hdGluZygpIHx8IG8tPmlzUG9zaXRpb25lZCgpKSB7CiAg
ICAgICAgICAgICAgICAgUmVuZGVyQm94KiBib3ggPSB0b1JlbmRlckJveChvKTsKICAgICAgICAg
ICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVsYXlvdXRDaGlsZHJlbiB8fCBvLT5zdHls
ZSgpLT53aWR0aCgpLmlzUGVyY2VudCgpIHx8IG8tPnN0eWxlKCktPmhlaWdodCgpLmlzUGVyY2Vu
dCgpKQotICAgICAgICAgICAgICAgICAgICBvLT5zZXRDaGlsZE5lZWRzTGF5b3V0KHRydWUsIGZh
bHNlKTsKLSAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJl
IHdlIGxheW91dCBjaGlsZHJlbiBpZiB0aGV5IG5lZWQgaXQuCisgICAgICAgICAgICAgICAgLy8g
RklYTUU6IFRlY2huaWNhbGx5IHBlcmNlbnRhZ2UgaGVpZ2h0IG9iamVjdHMgb25seSBuZWVkIGEg
cmVsYXlvdXQgaWYgdGhlaXIgcGVyY2VudGFnZSBpc24ndCBnb2luZyB0byBiZSB0dXJuZWQgaW50
bworICAgICAgICAgICAgICAgIC8vIGFuIGF1dG8gdmFsdWUuICBBZGQgYSBtZXRob2QgdG8gZGV0
ZXJtaW5lIHRoaXMsIHNvIHRoYXQgd2UgY2FuIGF2b2lkIHRoZSByZWxheW91dC4KKyAgICAgICAg
ICAgICAgICBpZiAocmVsYXlvdXRDaGlsZHJlbiB8fCAoKGJveC0+c3R5bGUoKS0+aGVpZ2h0KCku
aXNQZXJjZW50KCkgfHwgYm94LT5zdHlsZSgpLT5taW5IZWlnaHQoKS5pc1BlcmNlbnQoKSB8fCBi
b3gtPnN0eWxlKCktPm1heEhlaWdodCgpLmlzUGVyY2VudCgpKSkpCisgICAgICAgICAgICAgICAg
ICAgIGJveC0+c2V0Q2hpbGROZWVkc0xheW91dCh0cnVlLCBmYWxzZSk7CisKICAgICAgICAgICAg
ICAgICAvLyBJZiByZWxheW91dENoaWxkcmVuIGlzIHNldCBhbmQgd2UgaGF2ZSBwZXJjZW50YWdl
IHBhZGRpbmcsIHdlIGFsc28gbmVlZCB0byBpbnZhbGlkYXRlIHRoZSBjaGlsZCdzIHByZWYgd2lk
dGhzLgotICAgICAgICAgICAgICAgIGlmIChyZWxheW91dENoaWxkcmVuICYmIChvLT5zdHlsZSgp
LT5wYWRkaW5nTGVmdCgpLmlzUGVyY2VudCgpIHx8IG8tPnN0eWxlKCktPnBhZGRpbmdSaWdodCgp
LmlzUGVyY2VudCgpKSkKLSAgICAgICAgICAgICAgICAgICAgby0+c2V0UHJlZldpZHRoc0RpcnR5
KHRydWUsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBpZiAocmVsYXlvdXRDaGlsZHJlbiAmJiAo
Ym94LT5zdHlsZSgpLT5wYWRkaW5nTGVmdCgpLmlzUGVyY2VudCgpIHx8IGJveC0+c3R5bGUoKS0+
cGFkZGluZ1JpZ2h0KCkuaXNQZXJjZW50KCkpKQorICAgICAgICAgICAgICAgICAgICBib3gtPnNl
dFByZWZXaWR0aHNEaXJ0eSh0cnVlLCBmYWxzZSk7CiAgICAgICAgICAgICAKICAgICAgICAgICAg
ICAgICBpZiAoby0+aXNQb3NpdGlvbmVkKCkpCiAgICAgICAgICAgICAgICAgICAgIG8tPmNvbnRh
aW5pbmdCbG9jaygpLT5pbnNlcnRQb3NpdGlvbmVkT2JqZWN0KGJveCk7CkBAIC04NjIsNyArODgy
LDggQEAgdm9pZCBSZW5kZXJCbG9jazo6bGF5b3V0SW5saW5lQ2hpbGRyZW4oYgogICAgICAgICAg
ICAgICAgICAgICBlbHNlIGlmIChmdWxsTGF5b3V0IHx8IG8tPm5lZWRzTGF5b3V0KCkpIC8vIFJl
cGxhY2VkIGVsZW1lbnRzCiAgICAgICAgICAgICAgICAgICAgICAgICB0b1JlbmRlckJveChvKS0+
ZGlydHlMaW5lQm94ZXMoZnVsbExheW91dCk7CiAKLSAgICAgICAgICAgICAgICAgICAgby0+bGF5
b3V0SWZOZWVkZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFvLT5pc1JlcGxhY2VkKCkg
fHwgIW8tPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkKKyAgICAgICAgICAgICAgICAgICAgICAg
IG8tPmxheW91dElmTmVlZGVkKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBl
bHNlIGlmIChvLT5pc1RleHQoKSB8fCAoby0+aXNSZW5kZXJJbmxpbmUoKSAmJiAhZW5kT2ZJbmxp
bmUpKSB7CiAgICAgICAgICAgICAgICAgaWYgKGZ1bGxMYXlvdXQgfHwgby0+c2VsZk5lZWRzTGF5
b3V0KCkpCkBAIC05NTYsNyArOTc3LDcgQEAgdm9pZCBSZW5kZXJCbG9jazo6bGF5b3V0SW5saW5l
Q2hpbGRyZW4oYgogICAgICAgICAgICAgaXNMaW5lRW1wdHkgPSB0cnVlOwogICAgICAgICAgICAg
CiAgICAgICAgICAgICBFQ2xlYXIgY2xlYXIgPSBDTk9ORTsKLSAgICAgICAgICAgIGVuZCA9IGZp
bmROZXh0TGluZUJyZWFrKHJlc29sdmVyLCBmaXJzdExpbmUsIGlzTGluZUVtcHR5LCBwcmV2aW91
c0xpbmVCcm9rZUNsZWFubHksICZjbGVhcik7CisgICAgICAgICAgICBlbmQgPSBmaW5kTmV4dExp
bmVCcmVhayhyZXNvbHZlciwgZmlyc3RMaW5lLCBpc0xpbmVFbXB0eSwgcHJldmlvdXNMaW5lQnJv
a2VDbGVhbmx5LCBtYXJnaW5JbmZvLCAmY2xlYXIpOwogICAgICAgICAgICAgaWYgKHJlc29sdmVy
LnBvc2l0aW9uKCkuYXRFbmQoKSkgewogICAgICAgICAgICAgICAgIHJlc29sdmVyLmRlbGV0ZVJ1
bnMoKTsKICAgICAgICAgICAgICAgICBjaGVja0ZvckZsb2F0c0Zyb21MYXN0TGluZSA9IHRydWU7
CkBAIC0xMDI2LDYgKzEwNDcsMTQgQEAgdm9pZCBSZW5kZXJCbG9jazo6bGF5b3V0SW5saW5lQ2hp
bGRyZW4oYgogICAgICAgICAgICAgICAgICAgICBpZiAobGluZUJveCkgewogICAgICAgICAgICAg
ICAgICAgICAgICAgbGluZUJveC0+c2V0RW5kc1dpdGhCcmVhayhwcmV2aW91c0xpbmVCcm9rZUNs
ZWFubHkpOwogCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBvdXIgcHJldmlvdXMgbGlu
ZSB3YXMgYW4gYW5vbnltb3VzIGJsb2NrIGFuZCB3ZSBhcmUgbm90IGFuIGFub255bW91cyBibG9j
aywgc2ltdWxhdGUgYSBtYXJnaW4gY29sbGFwc2Ugbm93IHNvIHRoYXQgd2UgZ2V0IHRoZSBwcm9w
ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluY3JlYXNlZCBoZWlnaHQuICBXZSBhbHNv
IGhhdmUgdG8gc2ltdWxhdGUgYSBtYXJnaW4gY29sbGFwc2UgdG8gcHJvcGFnYXRlIG1hcmdpbnMg
dGhyb3VnaCB0byB0aGUgdG9wIG9mIG91ciBibG9jay4KKyAgICAgICAgICAgICAgICAgICAgICAg
IGlmICghbGluZUJveC0+YW5vbnltb3VzSW5saW5lQmxvY2soKSkgeworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGlmICghbGluZUJveC0+cHJldlJvb3RCb3goKSB8fCBsaW5lQm94LT5wcmV2
Um9vdEJveCgpLT5hbm9ueW1vdXNJbmxpbmVCbG9jaygpKQorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBjb2xsYXBzZU1hcmdpbnMoMCwgbWFyZ2luSW5mbyk7CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgbWFyZ2luSW5mby5zZXRBdFRvcE9mQmxvY2soZmFsc2UpOworICAgICAg
ICAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3cgd2Ug
cG9zaXRpb24gYWxsIG9mIG91ciB0ZXh0IHJ1bnMgaG9yaXpvbnRhbGx5LgogICAgICAgICAgICAg
ICAgICAgICAgICAgY29tcHV0ZUhvcml6b250YWxQb3NpdGlvbnNGb3JMaW5lKGxpbmVCb3gsIGZp
cnN0TGluZSwgcmVzb2x2ZXIuZmlyc3RSdW4oKSwgdHJhaWxpbmdTcGFjZVJ1biwgZW5kLmF0RW5k
KCkpOwogCkBAIC0xMTQ3LDggKzExNzYsOSBAQCB2b2lkIFJlbmRlckJsb2NrOjpsYXlvdXRJbmxp
bmVDaGlsZHJlbihiCiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBOb3cgYWRkIGluIHRoZSBi
b3R0b20gYm9yZGVyL3BhZGRpbmcuCi0gICAgc2V0SGVpZ2h0KGhlaWdodCgpICsgdG9BZGQpOwor
ICAgIC8vIE5vdyBkbyB0aGUgaGFuZGxpbmcgb2YgdGhlIGJvdHRvbSBvZiB0aGUgYmxvY2ssIGFk
ZGluZyBpbiBvdXIgYm90dG9tIGJvcmRlci9wYWRkaW5nIGFuZAorICAgIC8vIGRldGVybWluaW5n
IHRoZSBjb3JyZWN0IGNvbGxhcHNlZCBib3R0b20gbWFyZ2luIGluZm9ybWF0aW9uLgorICAgIGhh
bmRsZUJvdHRvbU9mQmxvY2sodG9wLCBib3R0b20sIG1hcmdpbkluZm8pOwogCiAgICAgaWYgKCFm
aXJzdExpbmVCb3goKSAmJiBoYXNMaW5lSWZFbXB0eSgpKQogICAgICAgICBzZXRIZWlnaHQoaGVp
Z2h0KCkgKyBsaW5lSGVpZ2h0KHRydWUsIHRydWUpKTsKQEAgLTExNjksNiArMTE5OSwxMiBAQCBS
b290SW5saW5lQm94KiBSZW5kZXJCbG9jazo6ZGV0ZXJtaW5lU3RhCiAgICAgaWYgKCFmdWxsTGF5
b3V0KSB7CiAgICAgICAgIHNpemVfdCBmbG9hdEluZGV4ID0gMDsKICAgICAgICAgZm9yIChjdXJy
ID0gZmlyc3RSb290Qm94KCk7IGN1cnIgJiYgIWN1cnItPmlzRGlydHkoKTsgY3VyciA9IGN1cnIt
Pm5leHRSb290Qm94KCkpIHsKKyAgICAgICAgICAgIGlmIChjdXJyLT5hbm9ueW1vdXNJbmxpbmVC
bG9jaygpKSB7CisgICAgICAgICAgICAgICAgLy8gRklYTUU6IFdlIGhhdmUgdG8gZG8gYmV0dGVy
IHRoYW4gdGhpcyBvciB3ZSB3aWxsIHJlcGFpbnQgdG9vIG11Y2ggYXMgY29udGVudCBpbnNpZGUg
YW4KKyAgICAgICAgICAgICAgICAvLyBhbm9ueW1vdXMgaW5saW5lIGJsb2NrIGNvbWVzIGluLgor
ICAgICAgICAgICAgICAgIGZ1bGxMYXlvdXQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKFZlY3RvcjxSZW5kZXJCb3gqPiogY2xl
YW5MaW5lRmxvYXRzID0gY3Vyci0+ZmxvYXRzUHRyKCkpIHsKICAgICAgICAgICAgICAgICBWZWN0
b3I8UmVuZGVyQm94Kj46Oml0ZXJhdG9yIGVuZCA9IGNsZWFuTGluZUZsb2F0cy0+ZW5kKCk7CiAg
ICAgICAgICAgICAgICAgZm9yIChWZWN0b3I8UmVuZGVyQm94Kj46Oml0ZXJhdG9yIG8gPSBjbGVh
bkxpbmVGbG9hdHMtPmJlZ2luKCk7IG8gIT0gZW5kOyArK28pIHsKQEAgLTE1ODMsNyArMTYxOSw3
IEBAIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgdGV4dFdpZHRoKFJlbmRlclQKIH0KIAogSW5saW5l
SXRlcmF0b3IgUmVuZGVyQmxvY2s6OmZpbmROZXh0TGluZUJyZWFrKElubGluZUJpZGlSZXNvbHZl
ciYgcmVzb2x2ZXIsIGJvb2wgZmlyc3RMaW5lLCAgYm9vbCYgaXNMaW5lRW1wdHksIGJvb2wmIHBy
ZXZpb3VzTGluZUJyb2tlQ2xlYW5seSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgRUNsZWFyKiBjbGVhcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBNYXJnaW5JbmZvJiBtYXJnaW5JbmZvLCBFQ2xlYXIqIGNsZWFy
KQogewogICAgIEFTU0VSVChyZXNvbHZlci5wb3NpdGlvbigpLmJsb2NrID09IHRoaXMpOwogCkBA
IC0xNjI0LDYgKzE2NjAsMTEgQEAgSW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6OmZpbmROZXh0
TGluZQogICAgIGJvb2wgYXV0b1dyYXBXYXNFdmVyVHJ1ZU9uTGluZSA9IGZhbHNlOwogICAgIGJv
b2wgZmxvYXRzRml0T25MaW5lID0gdHJ1ZTsKICAgICAKKyAgICBib29sIGlzQmxvY2tJbnNpZGVJ
bmxpbmUgPSBmYWxzZTsKKyAgICAKKyAgICBpbnQgcHJldmlvdXNCbG9ja0Zsb2F0Qm90dG9tID0g
MDsKKyAgICBpbnQgbWF4QmxvY2tGbG9hdEJvdHRvbSA9IDA7CisKICAgICAvLyBGaXJlZm94IGFu
ZCBPcGVyYSB3aWxsIGFsbG93IGEgdGFibGUgY2VsbCB0byBncm93IHRvIGZpdCBhbiBpbWFnZSBp
bnNpZGUgaXQgdW5kZXIKICAgICAvLyB2ZXJ5IHNwZWNpZmljIGNpcmN1bXN0YW5jZXMgKGluIG9y
ZGVyIHRvIG1hdGNoIGNvbW1vbiBXaW5JRSByZW5kZXJpbmdzKS4gCiAgICAgLy8gTm90IHN1cHBv
cnRpbmcgdGhlIHF1aXJrIGhhcyBjYXVzZWQgdXMgdG8gbWlzLXJlbmRlciBzb21lIHJlYWwgc2l0
ZXMuIChTZWUgQnVnemlsbGEgMTA1MTcuKSAKQEAgLTE2MzQsNyArMTY3NSw4IEBAIElubGluZUl0
ZXJhdG9yIFJlbmRlckJsb2NrOjpmaW5kTmV4dExpbmUKICAgICB3aGlsZSAobykgewogICAgICAg
ICBjdXJyV1MgPSBvLT5pc1JlcGxhY2VkKCkgPyBvLT5wYXJlbnQoKS0+c3R5bGUoKS0+d2hpdGVT
cGFjZSgpIDogby0+c3R5bGUoKS0+d2hpdGVTcGFjZSgpOwogICAgICAgICBsYXN0V1MgPSBsYXN0
LT5pc1JlcGxhY2VkKCkgPyBsYXN0LT5wYXJlbnQoKS0+c3R5bGUoKS0+d2hpdGVTcGFjZSgpIDog
bGFzdC0+c3R5bGUoKS0+d2hpdGVTcGFjZSgpOwotICAgICAgICAKKyAgICAgICAgaXNCbG9ja0lu
c2lkZUlubGluZSA9IG8tPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKTsKKwogICAgICAgICBib29s
IGF1dG9XcmFwID0gUmVuZGVyU3R5bGU6OmF1dG9XcmFwKGN1cnJXUyk7CiAgICAgICAgIGF1dG9X
cmFwV2FzRXZlclRydWVPbkxpbmUgPSBhdXRvV3JhcFdhc0V2ZXJUcnVlT25MaW5lIHx8IGF1dG9X
cmFwOwogCkBAIC0xNjQ1LDcgKzE2ODcsNyBAQCBJbmxpbmVJdGVyYXRvciBSZW5kZXJCbG9jazo6
ZmluZE5leHRMaW5lCiAjZW5kaWYKIAogICAgICAgICBib29sIGNvbGxhcHNlV2hpdGVTcGFjZSA9
IFJlbmRlclN0eWxlOjpjb2xsYXBzZVdoaXRlU3BhY2UoY3VycldTKTsKLSAgICAgICAgICAgIAor
CiAgICAgICAgIGlmIChvLT5pc0JSKCkpIHsKICAgICAgICAgICAgIGlmICh3ICsgdG1wVyA8PSB3
aWR0aCkgewogICAgICAgICAgICAgICAgIGxCcmVhay5vYmogPSBvOwpAQCAtMTc1Miw4ICsxNzk0
LDkgQEAgSW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6OmZpbmROZXh0TGluZQogICAgICAgICB9
IGVsc2UgaWYgKG8tPmlzUmVwbGFjZWQoKSkgewogICAgICAgICAgICAgUmVuZGVyQm94KiByZXBs
YWNlZEJveCA9IHRvUmVuZGVyQm94KG8pOwogCi0gICAgICAgICAgICAvLyBCcmVhayBvbiByZXBs
YWNlZCBlbGVtZW50cyBpZiBlaXRoZXIgaGFzIG5vcm1hbCB3aGl0ZS1zcGFjZS4KLSAgICAgICAg
ICAgIGlmICgoYXV0b1dyYXAgfHwgUmVuZGVyU3R5bGU6OmF1dG9XcmFwKGxhc3RXUykpICYmICgh
by0+aXNJbWFnZSgpIHx8IGFsbG93SW1hZ2VzVG9CcmVhaykpIHsKKyAgICAgICAgICAgIC8vIEJy
ZWFrIG9uIHJlcGxhY2VkIGVsZW1lbnRzIGlmIGVpdGhlciBoYXMgbm9ybWFsIHdoaXRlLXNwYWNl
LiAgV2UgYWxzbyBhbHdheXMgYnJlYWsgaWYgd2UKKyAgICAgICAgICAgIC8vIGVuY291bnRlciBh
IHNwZWNpYWwgYW5vbnltb3VzIGlubGluZSBibG9jayAodXNlZCB0byBob2xkIGJsb2NrcyBpbnNp
ZGUgaW5saW5lcykuCisgICAgICAgICAgICBpZiAoKGF1dG9XcmFwIHx8IFJlbmRlclN0eWxlOjph
dXRvV3JhcChsYXN0V1MpIHx8IGlzQmxvY2tJbnNpZGVJbmxpbmUpICAmJiAoIW8tPmlzSW1hZ2Uo
KSB8fCBhbGxvd0ltYWdlc1RvQnJlYWspKSB7CiAgICAgICAgICAgICAgICAgdyArPSB0bXBXOwog
ICAgICAgICAgICAgICAgIHRtcFcgPSAwOwogICAgICAgICAgICAgICAgIGxCcmVhay5vYmogPSBv
OwpAQCAtMTc2MSw2ICsxODA0LDIwIEBAIElubGluZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpmaW5k
TmV4dExpbmUKICAgICAgICAgICAgICAgICBsQnJlYWsubmV4dEJyZWFrYWJsZVBvc2l0aW9uID0g
LTE7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGlmIChpc0Jsb2NrSW5zaWRlSW5saW5l
KSB7CisgICAgICAgICAgICAgICAgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5ID0gdHJ1ZTsKKyAg
ICAgICAgICAgICAgICBpZiAoIWlzTGluZUVtcHR5KQorICAgICAgICAgICAgICAgICAgICBnb3Rv
IGVuZDsKKworICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSB3aWR0aCB0byBpZ25vcmUgZmxv
YXRzLCBzaW5jZSB3ZSdyZSBnb2luZyB0byBhbGxvdyB0aGVtIHRvIGludHJ1ZGUgaW50byBvdXIg
c3BhY2UuCisgICAgICAgICAgICAgICAgd2lkdGggPSByaWdodE9mZnNldCgpIC0gbGVmdE9mZnNl
dCgpOworCisgICAgICAgICAgICAgICAgLy8gRklYTUU6IFRoaXMgY2FsbCB3aWxsIHVwZGF0ZSB0
aGUgaGVpZ2h0IG9mIG91ciBibG9jay4gIEl0J3Mgbm90IGNsZWFyIGlmIHRoYXQncyBnb2luZyB0
byBiZSBvayBvciBub3QgeWV0LgorICAgICAgICAgICAgICAgIGxheW91dEJsb2NrQ2hpbGQocmVw
bGFjZWRCb3gsIG1hcmdpbkluZm8sIHByZXZpb3VzQmxvY2tGbG9hdEJvdHRvbSwgbWF4QmxvY2tG
bG9hdEJvdHRvbSk7CisKKyAgICAgICAgICAgICAgICBsaW5lTWlkcG9pbnRTdGF0ZS5iZXR3ZWVu
TWlkcG9pbnRzID0gZmFsc2U7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChpZ25v
cmluZ1NwYWNlcykKICAgICAgICAgICAgICAgICBhZGRNaWRwb2ludChsaW5lTWlkcG9pbnRTdGF0
ZSwgSW5saW5lSXRlcmF0b3IoMCwgbywgMCkpOwogCkBAIC0xNzgyLDYgKzE4MzksMTUgQEAgSW5s
aW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6OmZpbmROZXh0TGluZQogICAgICAgICAgICAgICAgIH0K
ICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgIHRtcFcgKz0gcmVwbGFjZWRCb3gt
PndpZHRoKCkgKyByZXBsYWNlZEJveC0+bWFyZ2luTGVmdCgpICsgcmVwbGFjZWRCb3gtPm1hcmdp
blJpZ2h0KCkgKyBpbmxpbmVXaWR0aChvKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAg
IGlmIChpc0Jsb2NrSW5zaWRlSW5saW5lKSB7CisgICAgICAgICAgICAgICAgdyArPSB0bXBXOwor
ICAgICAgICAgICAgICAgIHRtcFcgPSAwOworICAgICAgICAgICAgICAgIGxCcmVhay5vYmogPSBv
OworICAgICAgICAgICAgICAgIGxCcmVhay5wb3MgPSAwOworICAgICAgICAgICAgICAgIGxCcmVh
ay5uZXh0QnJlYWthYmxlUG9zaXRpb24gPSAtMTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsK
KyAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChvLT5pc1RleHQoKSkgewogICAgICAg
ICAgICAgaWYgKCFwb3MpCiAgICAgICAgICAgICAgICAgYXBwbGllZFN0YXJ0V2lkdGggPSBmYWxz
ZTsKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJveC5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQm94LmNwcAkocmV2aXNpb24gNDc1OTEpCisrKyBXZWJD
b3JlL3JlbmRlcmluZy9SZW5kZXJCb3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMjg0LDcgKzEy
ODQsNyBAQCB2b2lkIFJlbmRlckJveDo6Y2FsY1dpZHRoKCkKICAgICB9CiAKICAgICBpZiAoY29u
dGFpbmVyV2lkdGggJiYgY29udGFpbmVyV2lkdGggIT0gKHdpZHRoKCkgKyBtX21hcmdpbkxlZnQg
KyBtX21hcmdpblJpZ2h0KQotICAgICAgICAgICAgJiYgIWlzRmxvYXRpbmcoKSAmJiAhaXNJbmxp
bmUoKSAmJiAhY2ItPmlzRmxleGlibGVCb3goKSkgeworICAgICAgICAgICAgJiYgIWlzRmxvYXRp
bmcoKSAmJiAoIWlzSW5saW5lKCkgfHwgaXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKSAmJiAhY2It
PmlzRmxleGlibGVCb3goKSkgewogICAgICAgICBpZiAoY2ItPnN0eWxlKCktPmRpcmVjdGlvbigp
ID09IExUUikKICAgICAgICAgICAgIG1fbWFyZ2luUmlnaHQgPSBjb250YWluZXJXaWR0aCAtIHdp
ZHRoKCkgLSBtX21hcmdpbkxlZnQ7CiAgICAgICAgIGVsc2UKQEAgLTEzMjMsNyArMTMyMyw3IEBA
IGJvb2wgUmVuZGVyQm94OjpzaXplc1RvSW50cmluc2ljV2lkdGgoV2kKIHsKICAgICAvLyBNYXJx
dWVlcyBpbiBXaW5JRSBhcmUgbGlrZSBhIG1peHR1cmUgb2YgYmxvY2tzIGFuZCBpbmxpbmUtYmxv
Y2tzLiAgVGhleSBzaXplIGFzIHRob3VnaCB0aGV5J3JlIGJsb2NrcywKICAgICAvLyBidXQgdGhl
eSBhbGxvdyB0ZXh0IHRvIHNpdCBvbiB0aGUgc2FtZSBsaW5lIGFzIHRoZSBtYXJxdWVlLgotICAg
IGlmIChpc0Zsb2F0aW5nKCkgfHwgKGlzSW5saW5lQmxvY2tPcklubGluZVRhYmxlKCkgJiYgIWlz
SFRNTE1hcnF1ZWUoKSkpCisgICAgaWYgKGlzRmxvYXRpbmcoKSB8fCAoaXNJbmxpbmVCbG9ja09y
SW5saW5lVGFibGUoKSAmJiAhaXNIVE1MTWFycXVlZSgpICYmICFpc0Fub255bW91c0lubGluZUJs
b2NrKCkpKQogICAgICAgICByZXR1cm4gdHJ1ZTsKIAogICAgIC8vIFRoaXMgY29kZSBtYXkgbG9v
ayBhIGJpdCBzdHJhbmdlLiAgQmFzaWNhbGx5IHdpZHRoOmludHJpbnNpYyBzaG91bGQgY2xhbXAg
dGhlIHNpemUgd2hlbiB0ZXN0aW5nIGJvdGgKQEAgLTI3NjksNyArMjc2OSw3IEBAIGJvb2wgUmVu
ZGVyQm94OjpzaHJpbmtUb0F2b2lkRmxvYXRzKCkgY28KIAogYm9vbCBSZW5kZXJCb3g6OmF2b2lk
c0Zsb2F0cygpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIGlzUmVwbGFjZWQoKSB8fCBoYXNPdmVyZmxv
d0NsaXAoKSB8fCBpc0hSKCk7CisgICAgcmV0dXJuICFpc0Fub255bW91c0lubGluZUJsb2NrKCkg
JiYgKGlzUmVwbGFjZWQoKSB8fCBoYXNPdmVyZmxvd0NsaXAoKSB8fCBpc0hSKCkpOwogfQogCiB2
b2lkIFJlbmRlckJveDo6YWRkU2hhZG93T3ZlcmZsb3coKQpJbmRleDogV2ViQ29yZS9yZW5kZXJp
bmcvUmVuZGVySW5saW5lLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5k
ZXJJbmxpbmUuY3BwCShyZXZpc2lvbiA0NzY0MykKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRl
cklubGluZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQyLDcgKzQyLDYgQEAgbmFtZXNwYWNlIFdl
YkNvcmUgewogCiBSZW5kZXJJbmxpbmU6OlJlbmRlcklubGluZShOb2RlKiBub2RlKQogICAgIDog
UmVuZGVyQm94TW9kZWxPYmplY3Qobm9kZSkKLSAgICAsIG1fY29udGludWF0aW9uKDApCiAgICAg
LCBtX2xpbmVIZWlnaHQoLTEpCiAgICAgLCBtX3ZlcnRpY2FsUG9zaXRpb24oUG9zaXRpb25VbmRl
ZmluZWQpCiB7CkBAIC01MSwxMSArNTAsNiBAQCBSZW5kZXJJbmxpbmU6OlJlbmRlcklubGluZShO
b2RlKiBub2RlKQogCiB2b2lkIFJlbmRlcklubGluZTo6ZGVzdHJveSgpCiB7Ci0gICAgLy8gRGV0
YWNoIG91ciBjb250aW51YXRpb24gZmlyc3QuCi0gICAgaWYgKG1fY29udGludWF0aW9uKQotICAg
ICAgICBtX2NvbnRpbnVhdGlvbi0+ZGVzdHJveSgpOwotICAgIG1fY29udGludWF0aW9uID0gMDsK
LSAgICAKICAgICAvLyBNYWtlIHN1cmUgdG8gZGVzdHJveSBhbm9ueW1vdXMgY2hpbGRyZW4gZmly
c3Qgd2hpbGUgdGhleSBhcmUgc3RpbGwgY29ubmVjdGVkIHRvIHRoZSByZXN0IG9mIHRoZSB0cmVl
LCBzbyB0aGF0IHRoZXkgd2lsbAogICAgIC8vIHByb3Blcmx5IGRpcnR5IGxpbmUgYm94ZXMgdGhh
dCB0aGV5IGFyZSByZW1vdmVkIGZyb20uICBFZmZlY3RzIHRoYXQgZG8gOmJlZm9yZS86YWZ0ZXIg
b25seSBvbiBob3ZlciBjb3VsZCBjcmFzaCBvdGhlcndpc2UuCiAgICAgY2hpbGRyZW4oKS0+ZGVz
dHJveUxlZnRvdmVyQ2hpbGRyZW4oKTsKQEAgLTg3LDEzICs4MSw2IEBAIHZvaWQgUmVuZGVySW5s
aW5lOjpkZXN0cm95KCkKICAgICBSZW5kZXJCb3hNb2RlbE9iamVjdDo6ZGVzdHJveSgpOwogfQog
Ci1SZW5kZXJJbmxpbmUqIFJlbmRlcklubGluZTo6aW5saW5lQ29udGludWF0aW9uKCkgY29uc3QK
LXsKLSAgICBpZiAoIW1fY29udGludWF0aW9uIHx8IG1fY29udGludWF0aW9uLT5pc0lubGluZSgp
KQotICAgICAgICByZXR1cm4gdG9SZW5kZXJJbmxpbmUobV9jb250aW51YXRpb24pOwotICAgIHJl
dHVybiB0b1JlbmRlckJsb2NrKG1fY29udGludWF0aW9uKS0+aW5saW5lQ29udGludWF0aW9uKCk7
Ci19Ci0KIHZvaWQgUmVuZGVySW5saW5lOjp1cGRhdGVCb3hNb2RlbEluZm9Gcm9tU3R5bGUoKQog
ewogICAgIFJlbmRlckJveE1vZGVsT2JqZWN0Ojp1cGRhdGVCb3hNb2RlbEluZm9Gcm9tU3R5bGUo
KTsKQEAgLTEwOSwxOSArOTYsNiBAQCB2b2lkIFJlbmRlcklubGluZTo6c3R5bGVEaWRDaGFuZ2Uo
U3R5bGVECiB7CiAgICAgUmVuZGVyQm94TW9kZWxPYmplY3Q6OnN0eWxlRGlkQ2hhbmdlKGRpZmYs
IG9sZFN0eWxlKTsKIAotICAgIC8vIEVuc3VyZSB0aGF0IGFsbCBvZiB0aGUgc3BsaXQgaW5saW5l
cyBwaWNrIHVwIHRoZSBuZXcgc3R5bGUuIFdlCi0gICAgLy8gb25seSBkbyB0aGlzIGlmIHdlJ3Jl
IGFuIGlubGluZSwgc2luY2Ugd2UgZG9uJ3Qgd2FudCB0byBwcm9wYWdhdGUKLSAgICAvLyBhIGJs
b2NrJ3Mgc3R5bGUgdG8gdGhlIG90aGVyIGlubGluZXMuCi0gICAgLy8gZS5nLiwgPGZvbnQ+Zm9v
IDxoND5nb288L2g0PiBtb288L2ZvbnQ+LiAgVGhlIDxmb250PiBpbmxpbmVzIGJlZm9yZQotICAg
IC8vIGFuZCBhZnRlciB0aGUgYmxvY2sgc2hhcmUgdGhlIHNhbWUgc3R5bGUsIGJ1dCB0aGUgYmxv
Y2sgZG9lc24ndAotICAgIC8vIG5lZWQgdG8gcGFzcyBpdHMgc3R5bGUgb24gdG8gYW55b25lIGVs
c2UuCi0gICAgZm9yIChSZW5kZXJJbmxpbmUqIGN1cnJDb250ID0gaW5saW5lQ29udGludWF0aW9u
KCk7IGN1cnJDb250OyBjdXJyQ29udCA9IGN1cnJDb250LT5pbmxpbmVDb250aW51YXRpb24oKSkg
ewotICAgICAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogbmV4dENvbnQgPSBjdXJyQ29udC0+Y29u
dGludWF0aW9uKCk7Ci0gICAgICAgIGN1cnJDb250LT5zZXRDb250aW51YXRpb24oMCk7Ci0gICAg
ICAgIGN1cnJDb250LT5zZXRTdHlsZShzdHlsZSgpKTsKLSAgICAgICAgY3VyckNvbnQtPnNldENv
bnRpbnVhdGlvbihuZXh0Q29udCk7Ci0gICAgfQotCiAgICAgbV9saW5lSGVpZ2h0ID0gLTE7CiAK
ICAgICAvLyBVcGRhdGUgcHNldWRvcyBmb3IgOmJlZm9yZSBhbmQgOmFmdGVyIG5vdy4KQEAgLTEz
Myw3NyArMTA3LDUyIEBAIHZvaWQgUmVuZGVySW5saW5lOjpzdHlsZURpZENoYW5nZShTdHlsZUQK
IAogdm9pZCBSZW5kZXJJbmxpbmU6OmFkZENoaWxkKFJlbmRlck9iamVjdCogbmV3Q2hpbGQsIFJl
bmRlck9iamVjdCogYmVmb3JlQ2hpbGQpCiB7Ci0gICAgaWYgKGNvbnRpbnVhdGlvbigpKQotICAg
ICAgICByZXR1cm4gYWRkQ2hpbGRUb0NvbnRpbnVhdGlvbihuZXdDaGlsZCwgYmVmb3JlQ2hpbGQp
OwotICAgIHJldHVybiBhZGRDaGlsZElnbm9yaW5nQ29udGludWF0aW9uKG5ld0NoaWxkLCBiZWZv
cmVDaGlsZCk7Ci19Ci0KLXN0YXRpYyBSZW5kZXJCb3hNb2RlbE9iamVjdCogbmV4dENvbnRpbnVh
dGlvbihSZW5kZXJPYmplY3QqIHJlbmRlcmVyKQotewotICAgIGlmIChyZW5kZXJlci0+aXNJbmxp
bmUoKSAmJiAhcmVuZGVyZXItPmlzUmVwbGFjZWQoKSkKLSAgICAgICAgcmV0dXJuIHRvUmVuZGVy
SW5saW5lKHJlbmRlcmVyKS0+Y29udGludWF0aW9uKCk7Ci0gICAgcmV0dXJuIHRvUmVuZGVyQmxv
Y2socmVuZGVyZXIpLT5pbmxpbmVDb250aW51YXRpb24oKTsKLX0KLQotUmVuZGVyQm94TW9kZWxP
YmplY3QqIFJlbmRlcklubGluZTo6Y29udGludWF0aW9uQmVmb3JlKFJlbmRlck9iamVjdCogYmVm
b3JlQ2hpbGQpCi17Ci0gICAgaWYgKGJlZm9yZUNoaWxkICYmIGJlZm9yZUNoaWxkLT5wYXJlbnQo
KSA9PSB0aGlzKQotICAgICAgICByZXR1cm4gdGhpczsKLQotICAgIFJlbmRlckJveE1vZGVsT2Jq
ZWN0KiBjdXJyID0gbmV4dENvbnRpbnVhdGlvbih0aGlzKTsKLSAgICBSZW5kZXJCb3hNb2RlbE9i
amVjdCogbmV4dFRvTGFzdCA9IHRoaXM7Ci0gICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGxhc3Qg
PSB0aGlzOwotICAgIHdoaWxlIChjdXJyKSB7Ci0gICAgICAgIGlmIChiZWZvcmVDaGlsZCAmJiBi
ZWZvcmVDaGlsZC0+cGFyZW50KCkgPT0gY3VycikgewotICAgICAgICAgICAgaWYgKGN1cnItPmZp
cnN0Q2hpbGQoKSA9PSBiZWZvcmVDaGlsZCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbGFzdDsK
LSAgICAgICAgICAgIHJldHVybiBjdXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgbmV4dFRvTGFz
dCA9IGxhc3Q7Ci0gICAgICAgIGxhc3QgPSBjdXJyOwotICAgICAgICBjdXJyID0gbmV4dENvbnRp
bnVhdGlvbihjdXJyKTsKLSAgICB9Ci0KLSAgICBpZiAoIWJlZm9yZUNoaWxkICYmICFsYXN0LT5m
aXJzdENoaWxkKCkpCi0gICAgICAgIHJldHVybiBuZXh0VG9MYXN0OwotICAgIHJldHVybiBsYXN0
OwotfQotCi12b2lkIFJlbmRlcklubGluZTo6YWRkQ2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihS
ZW5kZXJPYmplY3QqIG5ld0NoaWxkLCBSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkKQotewogICAg
IC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBhcHBlbmQgdGhpbmdzIGFmdGVyIDphZnRlci1nZW5lcmF0
ZWQgY29udGVudCBpZiB3ZSBoYXZlIGl0LgogICAgIGlmICghYmVmb3JlQ2hpbGQgJiYgaXNBZnRl
ckNvbnRlbnQobGFzdENoaWxkKCkpKQogICAgICAgICBiZWZvcmVDaGlsZCA9IGxhc3RDaGlsZCgp
OwogCi0gICAgaWYgKCFuZXdDaGlsZC0+aXNJbmxpbmUoKSAmJiAhbmV3Q2hpbGQtPmlzRmxvYXRp
bmdPclBvc2l0aW9uZWQoKSkgewotICAgICAgICAvLyBXZSBhcmUgcGxhY2luZyBhIGJsb2NrIGlu
c2lkZSBhbiBpbmxpbmUuIFdlIGhhdmUgdG8gcGVyZm9ybSBhIHNwbGl0IG9mIHRoaXMKLSAgICAg
ICAgLy8gaW5saW5lIGludG8gY29udGludWF0aW9ucy4gIFRoaXMgaW52b2x2ZXMgY3JlYXRpbmcg
YW4gYW5vbnltb3VzIGJsb2NrIGJveCB0byBob2xkCi0gICAgICAgIC8vIHxuZXdDaGlsZHwuICBX
ZSB0aGVuIG1ha2UgdGhhdCBibG9jayBib3ggYSBjb250aW51YXRpb24gb2YgdGhpcyBpbmxpbmUu
ICBXZSB0YWtlIGFsbCBvZgotICAgICAgICAvLyB0aGUgY2hpbGRyZW4gYWZ0ZXIgfGJlZm9yZUNo
aWxkfCBhbmQgcHV0IHRoZW0gaW4gYSBjbG9uZSBvZiB0aGlzIG9iamVjdC4KLSAgICAgICAgUmVm
UHRyPFJlbmRlclN0eWxlPiBuZXdTdHlsZSA9IFJlbmRlclN0eWxlOjpjcmVhdGUoKTsKLSAgICAg
ICAgbmV3U3R5bGUtPmluaGVyaXRGcm9tKHN0eWxlKCkpOwotICAgICAgICBuZXdTdHlsZS0+c2V0
RGlzcGxheShCTE9DSyk7Ci0KLSAgICAgICAgUmVuZGVyQmxvY2sqIG5ld0JveCA9IG5ldyAocmVu
ZGVyQXJlbmEoKSkgUmVuZGVyQmxvY2soZG9jdW1lbnQoKSAvKiBhbm9ueW1vdXMgYm94ICovKTsK
LSAgICAgICAgbmV3Qm94LT5zZXRTdHlsZShuZXdTdHlsZS5yZWxlYXNlKCkpOwotICAgICAgICBS
ZW5kZXJCb3hNb2RlbE9iamVjdCogb2xkQ29udGludWF0aW9uID0gY29udGludWF0aW9uKCk7Ci0g
ICAgICAgIHNldENvbnRpbnVhdGlvbihuZXdCb3gpOwotCi0gICAgICAgIC8vIFNvbWVvbmUgbWF5
IGhhdmUgcHV0IGEgPHA+IGluc2lkZSBhIDxxPiwgY2F1c2luZyBhIHNwbGl0LiAgV2hlbiB0aGlz
IGhhcHBlbnMsIHRoZSA6YWZ0ZXIgY29udGVudAotICAgICAgICAvLyBoYXMgdG8gbW92ZSBpbnRv
IHRoZSBpbmxpbmUgY29udGludWF0aW9uLiAgQ2FsbCB1cGRhdGVCZWZvcmVBZnRlckNvbnRlbnQg
dG8gZW5zdXJlIHRoYXQgb3VyIDphZnRlcgotICAgICAgICAvLyBjb250ZW50IGdldHMgcHJvcGVy
bHkgZGVzdHJveWVkLgotICAgICAgICBib29sIGlzTGFzdENoaWxkID0gKGJlZm9yZUNoaWxkID09
IGxhc3RDaGlsZCgpKTsKLSAgICAgICAgaWYgKGRvY3VtZW50KCktPnVzZXNCZWZvcmVBZnRlclJ1
bGVzKCkpCi0gICAgICAgICAgICBjaGlsZHJlbigpLT51cGRhdGVCZWZvcmVBZnRlckNvbnRlbnQo
dGhpcywgQUZURVIpOwotICAgICAgICBpZiAoaXNMYXN0Q2hpbGQgJiYgYmVmb3JlQ2hpbGQgIT0g
bGFzdENoaWxkKCkpCi0gICAgICAgICAgICBiZWZvcmVDaGlsZCA9IDA7IC8vIFdlIGRlc3Ryb3ll
ZCB0aGUgbGFzdCBjaGlsZCwgc28gbm93IHdlIG5lZWQgdG8gdXBkYXRlIG91ciBpbnNlcnRpb24K
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9pbnQgdG8gYmUgMC4gIEl0J3MganVz
dCBhIHN0cmFpZ2h0IGFwcGVuZCBub3cuCi0KLSAgICAgICAgc3BsaXRGbG93KGJlZm9yZUNoaWxk
LCBuZXdCb3gsIG5ld0NoaWxkLCBvbGRDb250aW51YXRpb24pOworICAgIC8vIElmIHRoZSByZXF1
ZXN0ZWQgYmVmb3JlQ2hpbGQgaXMgbm90IG9uZSBvZiBvdXIgY2hpbGRyZW4sIHRoZW4gdGhpcyBp
cyBtb3N0IGxpa2VseSBiZWNhdXNlCisgICAgLy8gdGhlcmUgaXMgYW4gYW5vbnltb3VzIGlubGlu
ZS1ibG9jayBib3ggd2l0aGluIHRoaXMgb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIGJlZm9yZUNo
aWxkLiBTbworICAgIC8vIGp1c3QgaW5zZXJ0IHRoZSBjaGlsZCBpbnRvIHRoZSBhbm9ueW1vdXMg
aW5saW5lLWJsb2NrIGJveCBpbnN0ZWFkIG9mIGhlcmUuCisgICAgaWYgKGJlZm9yZUNoaWxkICYm
IGJlZm9yZUNoaWxkLT5wYXJlbnQoKSAhPSB0aGlzKSB7CisgICAgICAgIEFTU0VSVChiZWZvcmVD
aGlsZC0+cGFyZW50KCkpOworICAgICAgICBBU1NFUlQoYmVmb3JlQ2hpbGQtPnBhcmVudCgpLT5p
c0Fub255bW91c0lubGluZUJsb2NrKCkpOworICAgICAgICBpZiAoIW5ld0NoaWxkLT5pc0lubGlu
ZSgpIHx8IChuZXdDaGlsZC0+aXNJbmxpbmUoKSAmJiBiZWZvcmVDaGlsZC0+cGFyZW50KCktPmZp
cnN0Q2hpbGQoKSAhPSBiZWZvcmVDaGlsZCkpCisgICAgICAgICAgICBiZWZvcmVDaGlsZC0+cGFy
ZW50KCktPmFkZENoaWxkKG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7CisgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgIGFkZENoaWxkKG5ld0NoaWxkLCBiZWZvcmVDaGlsZC0+cGFyZW50KCkpOwogICAg
ICAgICByZXR1cm47CiAgICAgfQogCisgICAgaWYgKCFuZXdDaGlsZC0+aXNJbmxpbmUoKSkgewor
ICAgICAgICAvLyBXZSBhcmUgcGxhY2luZyBhIGJsb2NrIGluc2lkZSBhbiBpbmxpbmUuIFdlIGhh
dmUgdG8gcGxhY2UgdGhlIGJsb2NrIGluc2lkZSBhbiBhbm9ueW1vdXMgaW5saW5lLWJsb2NrLgor
ICAgICAgICAvLyBUaGlzIGlubGluZS1ibG9jayBjYW4gaG91c2UgYSBzZXF1ZW5jZSBvZiBjb250
aWd1b3VzIGJsb2NrLWxldmVsIGNoaWxkcmVuLCBhbmQgdGhleSB3aWxsIGFsbCBzaXQgb24gdGhl
CisgICAgICAgIC8vIHNhbWUgbGluZSB0b2dldGhlci4gIFdlIHRyeSB0byByZXVzZSBvbmUgZmly
c3QgaWYgcG9zc2libGUuCisgICAgICAgIGlmIChiZWZvcmVDaGlsZCkgeworICAgICAgICAgICAg
aWYgKGJlZm9yZUNoaWxkLT5wcmV2aW91c1NpYmxpbmcoKSAmJiBiZWZvcmVDaGlsZC0+cHJldmlv
dXNTaWJsaW5nKCktPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkgeworICAgICAgICAgICAgICAg
IGJlZm9yZUNoaWxkLT5wcmV2aW91c1NpYmxpbmcoKS0+YWRkQ2hpbGQobmV3Q2hpbGQpOworICAg
ICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgICAgIGlmIChsYXN0Q2hpbGQoKSAmJiBsYXN0Q2hpbGQoKS0+aXNBbm9ueW1vdXNJbmxp
bmVCbG9jaygpKSB7CisgICAgICAgICAgICAgICAgbGFzdENoaWxkKCktPmFkZENoaWxkKG5ld0No
aWxkKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0K
KyAKKyAgICAgICAgaWYgKCFuZXdDaGlsZC0+aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpKSB7Cisg
ICAgICAgICAgICAvLyBUaGVyZSB3YXMgbm8gc3VpdGFibGUgZXhpc3RpbmcgYW5vbnltb3VzIGJv
eC4gIENyZWF0ZSBhIG5ldyBvbmUuCisgICAgICAgICAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IG5l
d1N0eWxlID0gUmVuZGVyU3R5bGU6OmNyZWF0ZSgpOworICAgICAgICAgICAgbmV3U3R5bGUtPmlu
aGVyaXRGcm9tKHN0eWxlKCkpOworICAgICAgICAgICAgbmV3U3R5bGUtPnNldERpc3BsYXkoSU5M
SU5FX0JMT0NLKTsKKyAgICAgICAgICAgIFJlbmRlckJsb2NrKiBuZXdCb3ggPSBuZXcgKHJlbmRl
ckFyZW5hKCkpIFJlbmRlckJsb2NrKGRvY3VtZW50KCkpOworICAgICAgICAgICAgbmV3Qm94LT5z
ZXRTdHlsZShuZXdTdHlsZSk7CisgICAgICAgICAgICBSZW5kZXJCb3hNb2RlbE9iamVjdDo6YWRk
Q2hpbGQobmV3Qm94LCBiZWZvcmVDaGlsZCk7CisgICAgICAgICAgICBuZXdCb3gtPmFkZENoaWxk
KG5ld0NoaWxkKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKwogICAg
IFJlbmRlckJveE1vZGVsT2JqZWN0OjphZGRDaGlsZChuZXdDaGlsZCwgYmVmb3JlQ2hpbGQpOwog
CiAgICAgbmV3Q2hpbGQtPnNldE5lZWRzTGF5b3V0QW5kUHJlZldpZHRoc1JlY2FsYygpOwpAQCAt
MjE2LDE4OCArMTY1LDYgQEAgUmVuZGVySW5saW5lKiBSZW5kZXJJbmxpbmU6OmNsb25lSW5saW5l
KAogICAgIHJldHVybiBvOwogfQogCi12b2lkIFJlbmRlcklubGluZTo6c3BsaXRJbmxpbmVzKFJl
bmRlckJsb2NrKiBmcm9tQmxvY2ssIFJlbmRlckJsb2NrKiB0b0Jsb2NrLAotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBSZW5kZXJCbG9jayogbWlkZGxlQmxvY2ssCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQsIFJlbmRlckJv
eE1vZGVsT2JqZWN0KiBvbGRDb250KQotewotICAgIC8vIENyZWF0ZSBhIGNsb25lIG9mIHRoaXMg
aW5saW5lLgotICAgIFJlbmRlcklubGluZSogY2xvbmUgPSBjbG9uZUlubGluZSh0aGlzKTsKLSAg
ICBjbG9uZS0+c2V0Q29udGludWF0aW9uKG9sZENvbnQpOwotCi0gICAgLy8gTm93IHRha2UgYWxs
IG9mIHRoZSBjaGlsZHJlbiBmcm9tIGJlZm9yZUNoaWxkIHRvIHRoZSBlbmQgYW5kIHJlbW92ZQot
ICAgIC8vIHRoZW0gZnJvbSB8dGhpc3wgYW5kIHBsYWNlIHRoZW0gaW4gdGhlIGNsb25lLgotICAg
IFJlbmRlck9iamVjdCogbyA9IGJlZm9yZUNoaWxkOwotICAgIHdoaWxlIChvKSB7Ci0gICAgICAg
IFJlbmRlck9iamVjdCogdG1wID0gbzsKLSAgICAgICAgbyA9IHRtcC0+bmV4dFNpYmxpbmcoKTsK
LSAgICAgICAgY2xvbmUtPmFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24oY2hpbGRyZW4oKS0+
cmVtb3ZlQ2hpbGROb2RlKHRoaXMsIHRtcCksIDApOwotICAgICAgICB0bXAtPnNldE5lZWRzTGF5
b3V0QW5kUHJlZldpZHRoc1JlY2FsYygpOwotICAgIH0KLQotICAgIC8vIEhvb2sgfGNsb25lfCB1
cCBhcyB0aGUgY29udGludWF0aW9uIG9mIHRoZSBtaWRkbGUgYmxvY2suCi0gICAgbWlkZGxlQmxv
Y2stPnNldElubGluZUNvbnRpbnVhdGlvbihjbG9uZSk7Ci0KLSAgICAvLyBXZSBoYXZlIGJlZW4g
cmVwYXJlbnRlZCBhbmQgYXJlIG5vdyB1bmRlciB0aGUgZnJvbUJsb2NrLiAgV2UgbmVlZAotICAg
IC8vIHRvIHdhbGsgdXAgb3VyIGlubGluZSBwYXJlbnQgY2hhaW4gdW50aWwgd2UgaGl0IHRoZSBj
b250YWluaW5nIGJsb2NrLgotICAgIC8vIE9uY2Ugd2UgaGl0IHRoZSBjb250YWluaW5nIGJsb2Nr
IHdlJ3JlIGRvbmUuCi0gICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGN1cnIgPSB0b1JlbmRlckJv
eE1vZGVsT2JqZWN0KHBhcmVudCgpKTsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogY3VyckNo
aWxkID0gdGhpczsKLSAgICAKLSAgICAvLyBGSVhNRTogQmVjYXVzZSBzcGxpdHRpbmcgaXMgTyhu
XjIpIGFzIHRhZ3MgbmVzdCBwYXRob2xvZ2ljYWxseSwgd2UgY2FwIHRoZSBkZXB0aCBhdCB3aGlj
aCB3ZSdyZSB3aWxsaW5nIHRvIGNsb25lLgotICAgIC8vIFRoZXJlIHdpbGwgZXZlbnR1YWxseSBi
ZSBhIGJldHRlciBhcHByb2FjaCB0byB0aGlzIHByb2JsZW0gdGhhdCB3aWxsIGxldCB1cyBuZXN0
IHRvIGEgbXVjaAotICAgIC8vIGdyZWF0ZXIgZGVwdGggKHNlZSBidWd6aWxsYSBidWcgMTM0MzAp
IGJ1dCBmb3Igbm93IHdlIGhhdmUgYSBsaW1pdC4gIFRoaXMgKndpbGwqIHJlc3VsdCBpbgotICAg
IC8vIGluY29ycmVjdCByZW5kZXJpbmcsIGJ1dCB0aGUgYWx0ZXJuYXRpdmUgaXMgdG8gaGFuZyBm
b3JldmVyLgotICAgIHVuc2lnbmVkIHNwbGl0RGVwdGggPSAxOwotICAgIGNvbnN0IHVuc2lnbmVk
IGNNYXhTcGxpdERlcHRoID0gMjAwOyAKLSAgICB3aGlsZSAoY3VyciAmJiBjdXJyICE9IGZyb21C
bG9jaykgewotICAgICAgICBBU1NFUlQoY3Vyci0+aXNSZW5kZXJJbmxpbmUoKSk7Ci0gICAgICAg
IGlmIChzcGxpdERlcHRoIDwgY01heFNwbGl0RGVwdGgpIHsKLSAgICAgICAgICAgIC8vIENyZWF0
ZSBhIG5ldyBjbG9uZS4KLSAgICAgICAgICAgIFJlbmRlcklubGluZSogY2xvbmVDaGlsZCA9IGNs
b25lOwotICAgICAgICAgICAgY2xvbmUgPSBjbG9uZUlubGluZSh0b1JlbmRlcklubGluZShjdXJy
KSk7Ci0KLSAgICAgICAgICAgIC8vIEluc2VydCBvdXIgY2hpbGQgY2xvbmUgYXMgdGhlIGZpcnN0
IGNoaWxkLgotICAgICAgICAgICAgY2xvbmUtPmFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24o
Y2xvbmVDaGlsZCwgMCk7Ci0KLSAgICAgICAgICAgIC8vIEhvb2sgdGhlIGNsb25lIHVwIGFzIGEg
Y29udGludWF0aW9uIG9mIHxjdXJyfC4KLSAgICAgICAgICAgIFJlbmRlcklubGluZSogaW5saW5l
Q3VyciA9IHRvUmVuZGVySW5saW5lKGN1cnIpOwotICAgICAgICAgICAgb2xkQ29udCA9IGlubGlu
ZUN1cnItPmNvbnRpbnVhdGlvbigpOwotICAgICAgICAgICAgaW5saW5lQ3Vyci0+c2V0Q29udGlu
dWF0aW9uKGNsb25lKTsKLSAgICAgICAgICAgIGNsb25lLT5zZXRDb250aW51YXRpb24ob2xkQ29u
dCk7Ci0KLSAgICAgICAgICAgIC8vIFNvbWVvbmUgbWF5IGhhdmUgaW5kaXJlY3RseSBjYXVzZWQg
YSA8cT4gdG8gc3BsaXQuICBXaGVuIHRoaXMgaGFwcGVucywgdGhlIDphZnRlciBjb250ZW50Ci0g
ICAgICAgICAgICAvLyBoYXMgdG8gbW92ZSBpbnRvIHRoZSBpbmxpbmUgY29udGludWF0aW9uLiAg
Q2FsbCB1cGRhdGVCZWZvcmVBZnRlckNvbnRlbnQgdG8gZW5zdXJlIHRoYXQgdGhlIGlubGluZSdz
IDphZnRlcgotICAgICAgICAgICAgLy8gY29udGVudCBnZXRzIHByb3Blcmx5IGRlc3Ryb3llZC4K
LSAgICAgICAgICAgIGlmIChkb2N1bWVudCgpLT51c2VzQmVmb3JlQWZ0ZXJSdWxlcygpKQotICAg
ICAgICAgICAgICAgIGlubGluZUN1cnItPmNoaWxkcmVuKCktPnVwZGF0ZUJlZm9yZUFmdGVyQ29u
dGVudCh0aGlzLCBBRlRFUik7Ci0KLSAgICAgICAgICAgIC8vIE5vdyB3ZSBuZWVkIHRvIHRha2Ug
YWxsIG9mIHRoZSBjaGlsZHJlbiBzdGFydGluZyBmcm9tIHRoZSBmaXJzdCBjaGlsZAotICAgICAg
ICAgICAgLy8gKmFmdGVyKiBjdXJyQ2hpbGQgYW5kIGFwcGVuZCB0aGVtIGFsbCB0byB0aGUgY2xv
bmUuCi0gICAgICAgICAgICBvID0gY3VyckNoaWxkLT5uZXh0U2libGluZygpOwotICAgICAgICAg
ICAgd2hpbGUgKG8pIHsKLSAgICAgICAgICAgICAgICBSZW5kZXJPYmplY3QqIHRtcCA9IG87Ci0g
ICAgICAgICAgICAgICAgbyA9IHRtcC0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgICAgICAgICBj
bG9uZS0+YWRkQ2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihpbmxpbmVDdXJyLT5jaGlsZHJlbigp
LT5yZW1vdmVDaGlsZE5vZGUoY3VyciwgdG1wKSwgMCk7Ci0gICAgICAgICAgICAgICAgdG1wLT5z
ZXROZWVkc0xheW91dEFuZFByZWZXaWR0aHNSZWNhbGMoKTsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgfQotICAgICAgICAKLSAgICAgICAgLy8gS2VlcCB3YWxraW5nIHVwIHRoZSBjaGFpbi4KLSAg
ICAgICAgY3VyckNoaWxkID0gY3VycjsKLSAgICAgICAgY3VyciA9IHRvUmVuZGVyQm94TW9kZWxP
YmplY3QoY3Vyci0+cGFyZW50KCkpOwotICAgICAgICBzcGxpdERlcHRoKys7Ci0gICAgfQotCi0g
ICAgLy8gTm93IHdlIGFyZSBhdCB0aGUgYmxvY2sgbGV2ZWwuIFdlIG5lZWQgdG8gcHV0IHRoZSBj
bG9uZSBpbnRvIHRoZSB0b0Jsb2NrLgotICAgIHRvQmxvY2stPmNoaWxkcmVuKCktPmFwcGVuZENo
aWxkTm9kZSh0b0Jsb2NrLCBjbG9uZSk7Ci0KLSAgICAvLyBOb3cgdGFrZSBhbGwgdGhlIGNoaWxk
cmVuIGFmdGVyIGN1cnJDaGlsZCBhbmQgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgZnJvbUJsb2NrCi0g
ICAgLy8gYW5kIHB1dCB0aGVtIGluIHRoZSB0b0Jsb2NrLgotICAgIG8gPSBjdXJyQ2hpbGQtPm5l
eHRTaWJsaW5nKCk7Ci0gICAgd2hpbGUgKG8pIHsKLSAgICAgICAgUmVuZGVyT2JqZWN0KiB0bXAg
PSBvOwotICAgICAgICBvID0gdG1wLT5uZXh0U2libGluZygpOwotICAgICAgICB0b0Jsb2NrLT5j
aGlsZHJlbigpLT5hcHBlbmRDaGlsZE5vZGUodG9CbG9jaywgZnJvbUJsb2NrLT5jaGlsZHJlbigp
LT5yZW1vdmVDaGlsZE5vZGUoZnJvbUJsb2NrLCB0bXApKTsKLSAgICB9Ci19Ci0KLXZvaWQgUmVu
ZGVySW5saW5lOjpzcGxpdEZsb3coUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCwgUmVuZGVyQmxv
Y2sqIG5ld0Jsb2NrQm94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXJPYmpl
Y3QqIG5ld0NoaWxkLCBSZW5kZXJCb3hNb2RlbE9iamVjdCogb2xkQ29udCkKLXsKLSAgICBSZW5k
ZXJCbG9jayogcHJlID0gMDsKLSAgICBSZW5kZXJCbG9jayogYmxvY2sgPSBjb250YWluaW5nQmxv
Y2soKTsKLSAgICAKLSAgICAvLyBEZWxldGUgb3VyIGxpbmUgYm94ZXMgYmVmb3JlIHdlIGRvIHRo
ZSBpbmxpbmUgc3BsaXQgaW50byBjb250aW51YXRpb25zLgotICAgIGJsb2NrLT5kZWxldGVMaW5l
Qm94VHJlZSgpOwotICAgIAotICAgIGJvb2wgbWFkZU5ld0JlZm9yZUJsb2NrID0gZmFsc2U7Ci0g
ICAgaWYgKGJsb2NrLT5pc0Fub255bW91c0Jsb2NrKCkgJiYgKCFibG9jay0+cGFyZW50KCkgfHwg
IWJsb2NrLT5wYXJlbnQoKS0+Y3JlYXRlc0Fub255bW91c1dyYXBwZXIoKSkpIHsKLSAgICAgICAg
Ly8gV2UgY2FuIHJldXNlIHRoaXMgYmxvY2sgYW5kIG1ha2UgaXQgdGhlIHByZUJsb2NrIG9mIHRo
ZSBuZXh0IGNvbnRpbnVhdGlvbi4KLSAgICAgICAgcHJlID0gYmxvY2s7Ci0gICAgICAgIHByZS0+
cmVtb3ZlUG9zaXRpb25lZE9iamVjdHMoMCk7Ci0gICAgICAgIGJsb2NrID0gYmxvY2stPmNvbnRh
aW5pbmdCbG9jaygpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIE5vIGFub255bW91cyBibG9j
ayBhdmFpbGFibGUgZm9yIHVzZS4gIE1ha2Ugb25lLgotICAgICAgICBwcmUgPSBibG9jay0+Y3Jl
YXRlQW5vbnltb3VzQmxvY2soKTsKLSAgICAgICAgbWFkZU5ld0JlZm9yZUJsb2NrID0gdHJ1ZTsK
LSAgICB9Ci0KLSAgICBSZW5kZXJCbG9jayogcG9zdCA9IGJsb2NrLT5jcmVhdGVBbm9ueW1vdXNC
bG9jaygpOwotCi0gICAgUmVuZGVyT2JqZWN0KiBib3hGaXJzdCA9IG1hZGVOZXdCZWZvcmVCbG9j
ayA/IGJsb2NrLT5maXJzdENoaWxkKCkgOiBwcmUtPm5leHRTaWJsaW5nKCk7Ci0gICAgaWYgKG1h
ZGVOZXdCZWZvcmVCbG9jaykKLSAgICAgICAgYmxvY2stPmNoaWxkcmVuKCktPmluc2VydENoaWxk
Tm9kZShibG9jaywgcHJlLCBib3hGaXJzdCk7Ci0gICAgYmxvY2stPmNoaWxkcmVuKCktPmluc2Vy
dENoaWxkTm9kZShibG9jaywgbmV3QmxvY2tCb3gsIGJveEZpcnN0KTsKLSAgICBibG9jay0+Y2hp
bGRyZW4oKS0+aW5zZXJ0Q2hpbGROb2RlKGJsb2NrLCBwb3N0LCBib3hGaXJzdCk7Ci0gICAgYmxv
Y2stPnNldENoaWxkcmVuSW5saW5lKGZhbHNlKTsKLSAgICAKLSAgICBpZiAobWFkZU5ld0JlZm9y
ZUJsb2NrKSB7Ci0gICAgICAgIFJlbmRlck9iamVjdCogbyA9IGJveEZpcnN0OwotICAgICAgICB3
aGlsZSAobykgewotICAgICAgICAgICAgUmVuZGVyT2JqZWN0KiBubyA9IG87Ci0gICAgICAgICAg
ICBvID0gbm8tPm5leHRTaWJsaW5nKCk7Ci0gICAgICAgICAgICBwcmUtPmNoaWxkcmVuKCktPmFw
cGVuZENoaWxkTm9kZShwcmUsIGJsb2NrLT5jaGlsZHJlbigpLT5yZW1vdmVDaGlsZE5vZGUoYmxv
Y2ssIG5vKSk7Ci0gICAgICAgICAgICBuby0+c2V0TmVlZHNMYXlvdXRBbmRQcmVmV2lkdGhzUmVj
YWxjKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzcGxpdElubGluZXMocHJlLCBwb3N0LCBu
ZXdCbG9ja0JveCwgYmVmb3JlQ2hpbGQsIG9sZENvbnQpOwotCi0gICAgLy8gV2UgYWxyZWFkeSBr
bm93IHRoZSBuZXdCbG9ja0JveCBpc24ndCBnb2luZyB0byBjb250YWluIGlubGluZSBraWRzLCBz
byBhdm9pZCB3YXN0aW5nCi0gICAgLy8gdGltZSBpbiBtYWtlQ2hpbGRyZW5Ob25JbmxpbmUgYnkg
anVzdCBzZXR0aW5nIHRoaXMgZXhwbGljaXRseSB1cCBmcm9udC4KLSAgICBuZXdCbG9ja0JveC0+
c2V0Q2hpbGRyZW5JbmxpbmUoZmFsc2UpOwotCi0gICAgLy8gV2UgZGVsYXllZCBhZGRpbmcgdGhl
IG5ld0NoaWxkIHVudGlsIG5vdyBzbyB0aGF0IHRoZSB8bmV3QmxvY2tCb3h8IHdvdWxkIGJlIGZ1
bGx5Ci0gICAgLy8gY29ubmVjdGVkLCB0aHVzIGFsbG93aW5nIG5ld0NoaWxkIGFjY2VzcyB0byBh
IHJlbmRlckFyZW5hIHNob3VsZCBpdCBuZWVkCi0gICAgLy8gdG8gd3JhcCBpdHNlbGYgaW4gYWRk
aXRpb25hbCBib3hlcyAoZS5nLiwgdGFibGUgY29uc3RydWN0aW9uKS4KLSAgICBuZXdCbG9ja0Jv
eC0+YWRkQ2hpbGQobmV3Q2hpbGQpOwotCi0gICAgLy8gQWx3YXlzIGp1c3QgZG8gYSBmdWxsIGxh
eW91dCBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCBsaW5lIGJveGVzIChlc3BlY2lhbGx5IHdyYXBw
ZXJzIGZvciBpbWFnZXMpCi0gICAgLy8gZ2V0IGRlbGV0ZWQgcHJvcGVybHkuICBCZWNhdXNlIG9i
amVjdHMgbW92ZXMgZnJvbSB0aGUgcHJlIGJsb2NrIGludG8gdGhlIHBvc3QgYmxvY2ssIHdlIHdh
bnQgdG8KLSAgICAvLyBtYWtlIG5ldyBsaW5lIGJveGVzIGluc3RlYWQgb2YgbGVhdmluZyB0aGUg
b2xkIGxpbmUgYm94ZXMgYXJvdW5kLgotICAgIHByZS0+c2V0TmVlZHNMYXlvdXRBbmRQcmVmV2lk
dGhzUmVjYWxjKCk7Ci0gICAgYmxvY2stPnNldE5lZWRzTGF5b3V0QW5kUHJlZldpZHRoc1JlY2Fs
YygpOwotICAgIHBvc3QtPnNldE5lZWRzTGF5b3V0QW5kUHJlZldpZHRoc1JlY2FsYygpOwotfQot
Ci12b2lkIFJlbmRlcklubGluZTo6YWRkQ2hpbGRUb0NvbnRpbnVhdGlvbihSZW5kZXJPYmplY3Qq
IG5ld0NoaWxkLCBSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkKQotewotICAgIFJlbmRlckJveE1v
ZGVsT2JqZWN0KiBmbG93ID0gY29udGludWF0aW9uQmVmb3JlKGJlZm9yZUNoaWxkKTsKLSAgICBB
U1NFUlQoIWJlZm9yZUNoaWxkIHx8IGJlZm9yZUNoaWxkLT5wYXJlbnQoKS0+aXNSZW5kZXJCbG9j
aygpIHx8IGJlZm9yZUNoaWxkLT5wYXJlbnQoKS0+aXNSZW5kZXJJbmxpbmUoKSk7Ci0gICAgUmVu
ZGVyQm94TW9kZWxPYmplY3QqIGJlZm9yZUNoaWxkUGFyZW50ID0gMDsKLSAgICBpZiAoYmVmb3Jl
Q2hpbGQpCi0gICAgICAgIGJlZm9yZUNoaWxkUGFyZW50ID0gdG9SZW5kZXJCb3hNb2RlbE9iamVj
dChiZWZvcmVDaGlsZC0+cGFyZW50KCkpOwotICAgIGVsc2UgewotICAgICAgICBSZW5kZXJCb3hN
b2RlbE9iamVjdCogY29udCA9IG5leHRDb250aW51YXRpb24oZmxvdyk7Ci0gICAgICAgIGlmIChj
b250KQotICAgICAgICAgICAgYmVmb3JlQ2hpbGRQYXJlbnQgPSBjb250OwotICAgICAgICBlbHNl
Ci0gICAgICAgICAgICBiZWZvcmVDaGlsZFBhcmVudCA9IGZsb3c7Ci0gICAgfQotCi0gICAgaWYg
KG5ld0NoaWxkLT5pc0Zsb2F0aW5nT3JQb3NpdGlvbmVkKCkpCi0gICAgICAgIHJldHVybiBiZWZv
cmVDaGlsZFBhcmVudC0+YWRkQ2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihuZXdDaGlsZCwgYmVm
b3JlQ2hpbGQpOwotCi0gICAgLy8gQSBjb250aW51YXRpb24gYWx3YXlzIGNvbnNpc3RzIG9mIHR3
byBwb3RlbnRpYWwgY2FuZGlkYXRlczogYW4gaW5saW5lIG9yIGFuIGFub255bW91cwotICAgIC8v
IGJsb2NrIGJveCBob2xkaW5nIGJsb2NrIGNoaWxkcmVuLgotICAgIGJvb2wgY2hpbGRJbmxpbmUg
PSBuZXdDaGlsZC0+aXNJbmxpbmUoKTsKLSAgICBib29sIGJjcElubGluZSA9IGJlZm9yZUNoaWxk
UGFyZW50LT5pc0lubGluZSgpOwotICAgIGJvb2wgZmxvd0lubGluZSA9IGZsb3ctPmlzSW5saW5l
KCk7Ci0KLSAgICBpZiAoZmxvdyA9PSBiZWZvcmVDaGlsZFBhcmVudCkKLSAgICAgICAgcmV0dXJu
IGZsb3ctPmFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24obmV3Q2hpbGQsIGJlZm9yZUNoaWxk
KTsKLSAgICBlbHNlIHsKLSAgICAgICAgLy8gVGhlIGdvYWwgaGVyZSBpcyB0byBtYXRjaCB1cCBp
ZiB3ZSBjYW4sIHNvIHRoYXQgd2UgY2FuIGNvYWxlc2NlIGFuZCBjcmVhdGUgdGhlCi0gICAgICAg
IC8vIG1pbmltYWwgIyBvZiBjb250aW51YXRpb25zIG5lZWRlZCBmb3IgdGhlIGlubGluZS4KLSAg
ICAgICAgaWYgKGNoaWxkSW5saW5lID09IGJjcElubGluZSkKLSAgICAgICAgICAgIHJldHVybiBi
ZWZvcmVDaGlsZFBhcmVudC0+YWRkQ2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihuZXdDaGlsZCwg
YmVmb3JlQ2hpbGQpOwotICAgICAgICBlbHNlIGlmIChmbG93SW5saW5lID09IGNoaWxkSW5saW5l
KQotICAgICAgICAgICAgcmV0dXJuIGZsb3ctPmFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24o
bmV3Q2hpbGQsIDApOyAvLyBKdXN0IHRyZWF0IGxpa2UgYW4gYXBwZW5kLgotICAgICAgICBlbHNl
Ci0gICAgICAgICAgICByZXR1cm4gYmVmb3JlQ2hpbGRQYXJlbnQtPmFkZENoaWxkSWdub3JpbmdD
b250aW51YXRpb24obmV3Q2hpbGQsIGJlZm9yZUNoaWxkKTsKLSAgICB9Ci19Ci0KIHZvaWQgUmVu
ZGVySW5saW5lOjpwYWludChQYWludEluZm8mIHBhaW50SW5mbywgaW50IHR4LCBpbnQgdHkpCiB7
CiAgICAgbV9saW5lQm94ZXMucGFpbnQodGhpcywgcGFpbnRJbmZvLCB0eCwgdHkpOwpAQCAtNDEw
LDE2ICsxNzcsNiBAQCB2b2lkIFJlbmRlcklubGluZTo6YWJzb2x1dGVSZWN0cyhWZWN0b3I8CiAg
ICAgICAgICAgICByZWN0cy5hcHBlbmQoSW50UmVjdCh0eCArIGN1cnItPngoKSwgdHkgKyBjdXJy
LT55KCksIGN1cnItPndpZHRoKCksIGN1cnItPmhlaWdodCgpKSk7CiAgICAgfSBlbHNlCiAgICAg
ICAgIHJlY3RzLmFwcGVuZChJbnRSZWN0KHR4LCB0eSwgMCwgMCkpOwotCi0gICAgaWYgKGNvbnRp
bnVhdGlvbigpKSB7Ci0gICAgICAgIGlmIChjb250aW51YXRpb24oKS0+aXNCb3goKSkgewotICAg
ICAgICAgICAgUmVuZGVyQm94KiBib3ggPSB0b1JlbmRlckJveChjb250aW51YXRpb24oKSk7Ci0g
ICAgICAgICAgICBjb250aW51YXRpb24oKS0+YWJzb2x1dGVSZWN0cyhyZWN0cywgCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eCAtIGNvbnRhaW5pbmdCbG9jaygp
LT54KCkgKyBib3gtPngoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHR5IC0gY29udGFpbmluZ0Jsb2NrKCktPnkoKSArIGJveC0+eSgpKTsKLSAgICAgICAgfSBl
bHNlCi0gICAgICAgICAgICBjb250aW51YXRpb24oKS0+YWJzb2x1dGVSZWN0cyhyZWN0cywgdHgg
LSBjb250YWluaW5nQmxvY2soKS0+eCgpLCB0eSAtIGNvbnRhaW5pbmdCbG9jaygpLT55KCkpOwot
ICAgIH0KIH0KIAogdm9pZCBSZW5kZXJJbmxpbmU6OmFic29sdXRlUXVhZHMoVmVjdG9yPEZsb2F0
UXVhZD4mIHF1YWRzKQpAQCAtNDMxLDkgKzE4OCw2IEBAIHZvaWQgUmVuZGVySW5saW5lOjphYnNv
bHV0ZVF1YWRzKFZlY3RvcjwKICAgICAgICAgfQogICAgIH0gZWxzZQogICAgICAgICBxdWFkcy5h
cHBlbmQobG9jYWxUb0Fic29sdXRlUXVhZChGbG9hdFJlY3QoKSkpOwotCi0gICAgaWYgKGNvbnRp
bnVhdGlvbigpKQotICAgICAgICBjb250aW51YXRpb24oKS0+YWJzb2x1dGVRdWFkcyhxdWFkcyk7
CiB9CiAKIGludCBSZW5kZXJJbmxpbmU6Om9mZnNldExlZnQoKSBjb25zdApAQCAtNTAyLDE4ICsy
NTYsNiBAQCBWaXNpYmxlUG9zaXRpb24gUmVuZGVySW5saW5lOjpwb3NpdGlvbkZvCiAgICAgICAg
IC8vIHNob3VsZCB0cnkgdG8gZmluZCBhIHJlc3VsdCBieSBhc2tpbmcgb3VyIGNvbnRhaW5pbmcg
YmxvY2suCiAgICAgICAgIHJldHVybiBjYi0+cG9zaXRpb25Gb3JQb2ludChwb2ludCk7CiAgICAg
fQotCi0gICAgLy8gVHJhbnNsYXRlIHRoZSBjb29yZHMgZnJvbSB0aGUgcHJlLWFub255bW91cyBi
bG9jayB0byB0aGUgcG9zdC1hbm9ueW1vdXMgYmxvY2suCi0gICAgaW50IHBhcmVudEJsb2NrWCA9
IGNiLT54KCkgKyBwb2ludC54KCk7Ci0gICAgaW50IHBhcmVudEJsb2NrWSA9IGNiLT55KCkgKyBw
b2ludC55KCk7Ci0gICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGMgPSBjb250aW51YXRpb24oKTsK
LSAgICB3aGlsZSAoYykgewotICAgICAgICBSZW5kZXJCb3gqIGNvbnRCbG9jayA9IGMtPmlzSW5s
aW5lKCkgPyBjLT5jb250YWluaW5nQmxvY2soKSA6IHRvUmVuZGVyQmxvY2soYyk7Ci0gICAgICAg
IGlmIChjLT5pc0lubGluZSgpIHx8IGMtPmZpcnN0Q2hpbGQoKSkKLSAgICAgICAgICAgIHJldHVy
biBjLT5wb3NpdGlvbkZvckNvb3JkaW5hdGVzKHBhcmVudEJsb2NrWCAtIGNvbnRCbG9jay0+eCgp
LCBwYXJlbnRCbG9ja1kgLSBjb250QmxvY2stPnkoKSk7Ci0gICAgICAgIGMgPSB0b1JlbmRlckJs
b2NrKGMpLT5pbmxpbmVDb250aW51YXRpb24oKTsKLSAgICB9Ci0gICAgCiAgICAgcmV0dXJuIFJl
bmRlckJveE1vZGVsT2JqZWN0Ojpwb3NpdGlvbkZvclBvaW50KHBvaW50KTsKIH0KIApAQCAtNTQ5
LDcgKzI5MSw3IEBAIEludFJlY3QgUmVuZGVySW5saW5lOjpjbGlwcGVkT3ZlcmZsb3dSZWMKICAg
ICAvLyBPbmx5IHJ1bi1pbnMgYXJlIGFsbG93ZWQgaW4gaGVyZSBkdXJpbmcgbGF5b3V0LgogICAg
IEFTU0VSVCghdmlldygpIHx8ICF2aWV3KCktPmxheW91dFN0YXRlRW5hYmxlZCgpIHx8IGlzUnVu
SW4oKSk7CiAKLSAgICBpZiAoIWZpcnN0TGluZUJveCgpICYmICFjb250aW51YXRpb24oKSkKKyAg
ICBpZiAoIWZpcnN0TGluZUJveCgpKQogICAgICAgICByZXR1cm4gSW50UmVjdCgpOwogCiAgICAg
Ly8gRmluZCBvdXIgbGVmdG1vc3QgcG9zaXRpb24uCkBAIC01OTcsMTEgKzMzOSw2IEBAIEludFJl
Y3QgUmVuZGVySW5saW5lOjpjbGlwcGVkT3ZlcmZsb3dSZWMKICAgICAgICAgICAgICAgICByLnVu
aXRlKGNoaWxkUmVjdCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQotICAgICAgICBpZiAo
Y29udGludWF0aW9uKCkgJiYgIWNvbnRpbnVhdGlvbigpLT5pc0lubGluZSgpKSB7Ci0gICAgICAg
ICAgICBJbnRSZWN0IGNvbnRSZWN0ID0gY29udGludWF0aW9uKCktPnJlY3RXaXRoT3V0bGluZUZv
clJlcGFpbnQocmVwYWludENvbnRhaW5lciwgb3cpOwotICAgICAgICAgICAgci51bml0ZShjb250
UmVjdCk7Ci0gICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gcjsKQEAgLTY4MCw0OSArNDE3
LDYgQEAgdm9pZCBSZW5kZXJJbmxpbmU6OmNvbXB1dGVSZWN0Rm9yUmVwYWludAogICAgIG8tPmNv
bXB1dGVSZWN0Rm9yUmVwYWludChyZXBhaW50Q29udGFpbmVyLCByZWN0LCBmaXhlZCk7CiB9CiAK
LXZvaWQgUmVuZGVySW5saW5lOjp1cGRhdGVEcmFnU3RhdGUoYm9vbCBkcmFnT24pCi17Ci0gICAg
UmVuZGVyQm94TW9kZWxPYmplY3Q6OnVwZGF0ZURyYWdTdGF0ZShkcmFnT24pOwotICAgIGlmIChj
b250aW51YXRpb24oKSkKLSAgICAgICAgY29udGludWF0aW9uKCktPnVwZGF0ZURyYWdTdGF0ZShk
cmFnT24pOwotfQotCi12b2lkIFJlbmRlcklubGluZTo6Y2hpbGRCZWNhbWVOb25JbmxpbmUoUmVu
ZGVyT2JqZWN0KiBjaGlsZCkKLXsKLSAgICAvLyBXZSBoYXZlIHRvIHNwbGl0IHRoZSBwYXJlbnQg
Zmxvdy4KLSAgICBSZW5kZXJCbG9jayogbmV3Qm94ID0gY29udGFpbmluZ0Jsb2NrKCktPmNyZWF0
ZUFub255bW91c0Jsb2NrKCk7Ci0gICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIG9sZENvbnRpbnVh
dGlvbiA9IGNvbnRpbnVhdGlvbigpOwotICAgIHNldENvbnRpbnVhdGlvbihuZXdCb3gpOwotICAg
IFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKTsKLSAgICBj
aGlsZHJlbigpLT5yZW1vdmVDaGlsZE5vZGUodGhpcywgY2hpbGQpOwotICAgIHNwbGl0Rmxvdyhi
ZWZvcmVDaGlsZCwgbmV3Qm94LCBjaGlsZCwgb2xkQ29udGludWF0aW9uKTsKLX0KLQotdm9pZCBS
ZW5kZXJJbmxpbmU6OnVwZGF0ZUhpdFRlc3RSZXN1bHQoSGl0VGVzdFJlc3VsdCYgcmVzdWx0LCBj
b25zdCBJbnRQb2ludCYgcG9pbnQpCi17Ci0gICAgaWYgKHJlc3VsdC5pbm5lck5vZGUoKSkKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgTm9kZSogbiA9IG5vZGUoKTsKLSAgICBJbnRQb2ludCBsb2Nh
bFBvaW50KHBvaW50KTsKLSAgICBpZiAobikgewotICAgICAgICBpZiAoaXNJbmxpbmVDb250aW51
YXRpb24oKSkgewotICAgICAgICAgICAgLy8gV2UncmUgaW4gdGhlIGNvbnRpbnVhdGlvbiBvZiBh
IHNwbGl0IGlubGluZS4gIEFkanVzdCBvdXIgbG9jYWwgcG9pbnQgdG8gYmUgaW4gdGhlIGNvb3Jk
aW5hdGUgc3BhY2UKLSAgICAgICAgICAgIC8vIG9mIHRoZSBwcmluY2lwYWwgcmVuZGVyZXIncyBj
b250YWluaW5nIGJsb2NrLiAgVGhpcyB3aWxsIGVuZCB1cCBiZWluZyB0aGUgaW5uZXJOb25TaGFy
ZWROb2RlLgotICAgICAgICAgICAgUmVuZGVyQmxvY2sqIGZpcnN0QmxvY2sgPSBuLT5yZW5kZXJl
cigpLT5jb250YWluaW5nQmxvY2soKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gR2V0
IG91ciBjb250YWluaW5nIGJsb2NrLgotICAgICAgICAgICAgUmVuZGVyQm94KiBibG9jayA9IGNv
bnRhaW5pbmdCbG9jaygpOwotICAgICAgICAgICAgbG9jYWxQb2ludC5tb3ZlKGJsb2NrLT54KCkg
LSBmaXJzdEJsb2NrLT54KCksIGJsb2NrLT55KCkgLSBmaXJzdEJsb2NrLT55KCkpOwotICAgICAg
ICB9Ci0KLSAgICAgICAgcmVzdWx0LnNldElubmVyTm9kZShuKTsKLSAgICAgICAgaWYgKCFyZXN1
bHQuaW5uZXJOb25TaGFyZWROb2RlKCkpCi0gICAgICAgICAgICByZXN1bHQuc2V0SW5uZXJOb25T
aGFyZWROb2RlKG4pOwotICAgICAgICByZXN1bHQuc2V0TG9jYWxQb2ludChsb2NhbFBvaW50KTsK
LSAgICB9Ci19Ci0KIHZvaWQgUmVuZGVySW5saW5lOjpkaXJ0eUxpbmVCb3hlcyhib29sIGZ1bGxM
YXlvdXQpCiB7CiAgICAgaWYgKGZ1bGxMYXlvdXQpCkBAIC04MzYsMTcgKzUzMCw2IEBAIHZvaWQg
UmVuZGVySW5saW5lOjphZGRGb2N1c1JpbmdSZWN0cyhHcmEKICAgICAgICAgICAgY3Vyci0+YWRk
Rm9jdXNSaW5nUmVjdHMoZ3JhcGhpY3NDb250ZXh0LCBwb3MueCgpLCBwb3MueSgpKTsKICAgICAg
ICAgfQogICAgIH0KLQotICAgIGlmIChjb250aW51YXRpb24oKSkgewotICAgICAgICBpZiAoY29u
dGludWF0aW9uKCktPmlzSW5saW5lKCkpCi0gICAgICAgICAgICBjb250aW51YXRpb24oKS0+YWRk
Rm9jdXNSaW5nUmVjdHMoZ3JhcGhpY3NDb250ZXh0LCAKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICB0eCAtIGNvbnRhaW5pbmdCbG9jaygpLT54KCkgKyBjb250
aW51YXRpb24oKS0+Y29udGFpbmluZ0Jsb2NrKCktPngoKSwKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB0eSAtIGNvbnRhaW5pbmdCbG9jaygpLT55KCkgKyBj
b250aW51YXRpb24oKS0+Y29udGFpbmluZ0Jsb2NrKCktPnkoKSk7Ci0gICAgICAgIGVsc2UKLSAg
ICAgICAgICAgIGNvbnRpbnVhdGlvbigpLT5hZGRGb2N1c1JpbmdSZWN0cyhncmFwaGljc0NvbnRl
eHQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4IC0g
Y29udGFpbmluZ0Jsb2NrKCktPngoKSArIHRvUmVuZGVyQm94KGNvbnRpbnVhdGlvbigpKS0+eCgp
LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5IC0gY29u
dGFpbmluZ0Jsb2NrKCktPnkoKSArIHRvUmVuZGVyQm94KGNvbnRpbnVhdGlvbigpKS0+eSgpKTsK
LSAgICB9CiB9CiAKIHZvaWQgUmVuZGVySW5saW5lOjpwYWludE91dGxpbmUoR3JhcGhpY3NDb250
ZXh0KiBncmFwaGljc0NvbnRleHQsIGludCB0eCwgaW50IHR5KQpJbmRleDogV2ViQ29yZS9yZW5k
ZXJpbmcvUmVuZGVySW5saW5lLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVu
ZGVySW5saW5lLmgJKHJldmlzaW9uIDQ3NTkxKQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVy
SW5saW5lLmgJKHdvcmtpbmcgY29weSkKQEAgLTU1LDEwICs1NSw2IEBAIHB1YmxpYzoKIAogICAg
IElubGluZUZsb3dCb3gqIGZpcnN0TGluZUJveCgpIGNvbnN0IHsgcmV0dXJuIG1fbGluZUJveGVz
LmZpcnN0TGluZUJveCgpOyB9CiAgICAgSW5saW5lRmxvd0JveCogbGFzdExpbmVCb3goKSBjb25z
dCB7IHJldHVybiBtX2xpbmVCb3hlcy5sYXN0TGluZUJveCgpOyB9Ci0KLSAgICBSZW5kZXJCb3hN
b2RlbE9iamVjdCogY29udGludWF0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9jb250aW51YXRpb247
IH0KLQotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVEcmFnU3RhdGUoYm9vbCBkcmFnT24pOwogICAg
IAogICAgIEludFNpemUgcmVsYXRpdmVQb3NpdGlvbmVkSW5saW5lT2Zmc2V0KGNvbnN0IFJlbmRl
ckJveCogY2hpbGQpIGNvbnN0OwogCkBAIC03OCw5ICs3NCw2IEBAIHByaXZhdGU6CiAKICAgICB2
aXJ0dWFsIGJvb2wgaXNSZW5kZXJJbmxpbmUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CiAKLSAg
ICB2b2lkIGFkZENoaWxkVG9Db250aW51YXRpb24oUmVuZGVyT2JqZWN0KiBuZXdDaGlsZCwgUmVu
ZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCk7Ci0gICAgdmlydHVhbCB2b2lkIGFkZENoaWxkSWdub3Jp
bmdDb250aW51YXRpb24oUmVuZGVyT2JqZWN0KiBuZXdDaGlsZCwgUmVuZGVyT2JqZWN0KiBiZWZv
cmVDaGlsZCA9IDApOwotCiAgICAgdm9pZCBzcGxpdElubGluZXMoUmVuZGVyQmxvY2sqIGZyb21C
bG9jaywgUmVuZGVyQmxvY2sqIHRvQmxvY2ssIFJlbmRlckJsb2NrKiBtaWRkbGVCbG9jaywKICAg
ICAgICAgICAgICAgICAgICAgICBSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkLCBSZW5kZXJCb3hN
b2RlbE9iamVjdCogb2xkQ29udCk7CiAgICAgdm9pZCBzcGxpdEZsb3coUmVuZGVyT2JqZWN0KiBi
ZWZvcmVDaGlsZCwgUmVuZGVyQmxvY2sqIG5ld0Jsb2NrQm94LApAQCAtMTIwLDEzICsxMTMsNiBA
QCBwcml2YXRlOgogCiAgICAgdmlydHVhbCBpbnQgbGluZUhlaWdodChib29sIGZpcnN0TGluZSwg
Ym9vbCBpc1Jvb3RMaW5lQm94ID0gZmFsc2UpIGNvbnN0OwogCi0gICAgUmVuZGVySW5saW5lKiBp
bmxpbmVDb250aW51YXRpb24oKSBjb25zdDsKLSAgICB2b2lkIHNldENvbnRpbnVhdGlvbihSZW5k
ZXJCb3hNb2RlbE9iamVjdCogYykgeyBtX2NvbnRpbnVhdGlvbiA9IGM7IH0KLSAgICAKLSAgICB2
aXJ0dWFsIHZvaWQgY2hpbGRCZWNhbWVOb25JbmxpbmUoUmVuZGVyT2JqZWN0KiBjaGlsZCk7Ci0K
LSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlSGl0VGVzdFJlc3VsdChIaXRUZXN0UmVzdWx0JiwgY29u
c3QgSW50UG9pbnQmKTsKLQogICAgIHZpcnR1YWwgdm9pZCBpbWFnZUNoYW5nZWQoV3JhcHBlZElt
YWdlUHRyLCBjb25zdCBJbnRSZWN0KiA9IDApOwogCiAjaWYgRU5BQkxFKERBU0hCT0FSRF9TVVBQ
T1JUKQpAQCAtMTM5LDEzICsxMjUsMTAgQEAgcHJpdmF0ZToKICAgICBzdGF0aWMgUmVuZGVySW5s
aW5lKiBjbG9uZUlubGluZShSZW5kZXJJbmxpbmUqIHNyYyk7CiAKICAgICB2b2lkIHBhaW50T3V0
bGluZUZvckxpbmUoR3JhcGhpY3NDb250ZXh0KiwgaW50IHR4LCBpbnQgdHksIGNvbnN0IEludFJl
Y3QmIHByZXZMaW5lLCBjb25zdCBJbnRSZWN0JiB0aGlzTGluZSwgY29uc3QgSW50UmVjdCYgbmV4
dExpbmUpOwotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBjb250aW51YXRpb25CZWZvcmUoUmVu
ZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCk7CiAKICAgICBSZW5kZXJPYmplY3RDaGlsZExpc3QgbV9j
aGlsZHJlbjsKICAgICBSZW5kZXJMaW5lQm94TGlzdCBtX2xpbmVCb3hlczsgICAvLyBBbGwgb2Yg
dGhlIGxpbmUgYm94ZXMgY3JlYXRlZCBmb3IgdGhpcyBpbmxpbmUgZmxvdy4gIEZvciBleGFtcGxl
LCA8aT5IZWxsbzxicj53b3JsZC48L2k+IHdpbGwgaGF2ZSB0d28gPGk+IGxpbmUgYm94ZXMuCiAK
LSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogbV9jb250aW51YXRpb247IC8vIENhbiBiZSBlaXRo
ZXIgYSBibG9jayBvciBhbiBpbmxpbmUuIDxiPjxpPjxwPkhlbGxvPC9wPjwvaT48L2I+LiBJbiB0
aGlzIGV4YW1wbGUgdGhlIDxpPiB3aWxsIGhhdmUgYSBibG9jayBhcyBpdHMgY29udGludWF0aW9u
IGJ1dCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDxi
PiB3aWxsIGp1c3QgaGF2ZSBhbiBpbmxpbmUgYXMgaXRzIGNvbnRpbnVhdGlvbi4KICAgICBtdXRh
YmxlIGludCBtX2xpbmVIZWlnaHQ7CiAgICAgbXV0YWJsZSBpbnQgbV92ZXJ0aWNhbFBvc2l0aW9u
OwogfTsKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdC5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmNwcAkocmV2aXNpb24gNDc1OTEp
CisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0yMTEyLDggKzIxMTIsNiBAQCB2b2lkIFJlbmRlck9iamVjdDo6Z2V0VGV4dERlY29yYXRpb25D
b2xvCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgY3VyciA9IGN1cnItPnBhcmVu
dCgpOwotICAgICAgICBpZiAoY3VyciAmJiBjdXJyLT5pc1JlbmRlckJsb2NrKCkgJiYgdG9SZW5k
ZXJCbG9jayhjdXJyKS0+aW5saW5lQ29udGludWF0aW9uKCkpCi0gICAgICAgICAgICBjdXJyID0g
dG9SZW5kZXJCbG9jayhjdXJyKS0+aW5saW5lQ29udGludWF0aW9uKCk7CiAgICAgfSB3aGlsZSAo
Y3VyciAmJiBkZWNvcmF0aW9ucyAmJiAoIXF1aXJrc01vZGUgfHwgIWN1cnItPm5vZGUoKSB8fAog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghY3Vyci0+bm9kZSgpLT5oYXNU
YWdOYW1lKGFUYWcpICYmICFjdXJyLT5ub2RlKCktPmhhc1RhZ05hbWUoZm9udFRhZykpKSk7CiAK
SW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdC5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdC5oCShyZXZpc2lvbiA0NzU5MSkKKysrIFdlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdC5oCSh3b3JraW5nIGNvcHkpCkBAIC0zNDMsNiArMzQz
LDEwIEBAIHB1YmxpYzoKICAgICB7CiAgICAgICAgIHJldHVybiBtX2lzQW5vbnltb3VzICYmIHN0
eWxlKCktPmRpc3BsYXkoKSA9PSBCTE9DSyAmJiBzdHlsZSgpLT5zdHlsZVR5cGUoKSA9PSBOT1BT
RVVETyAmJiAhaXNMaXN0TWFya2VyKCk7CiAgICAgfQorICAgIGJvb2wgaXNBbm9ueW1vdXNJbmxp
bmVCbG9jaygpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV9pc0Fub255bW91cyAmJiBz
dHlsZSgpLT5kaXNwbGF5KCkgPT0gSU5MSU5FX0JMT0NLICYmIHN0eWxlKCktPnN0eWxlVHlwZSgp
ID09IE5PUFNFVURPOworICAgIH0KICAgICBib29sIGlzSW5saW5lQ29udGludWF0aW9uKCkgY29u
c3QgeyByZXR1cm4gKG5vZGUoKSA/IG5vZGUoKS0+cmVuZGVyZXIoKSAhPSB0aGlzIDogZmFsc2Up
ICYmIGlzUmVuZGVySW5saW5lKCk7IH0KICAgICBib29sIGlzRmxvYXRpbmcoKSBjb25zdCB7IHJl
dHVybiBtX2Zsb2F0aW5nOyB9CiAgICAgYm9vbCBpc1Bvc2l0aW9uZWQoKSBjb25zdCB7IHJldHVy
biBtX3Bvc2l0aW9uZWQ7IH0gLy8gYWJzb2x1dGUgb3IgZml4ZWQgcG9zaXRpb25pbmcKSW5kZXg6
IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdENoaWxkTGlzdC5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0Q2hpbGRMaXN0LmNwcAkocmV2aXNpb24g
NDc1OTEpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3RDaGlsZExpc3QuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0zMTEsMTYgKzMxMSw2IEBAIHZvaWQgUmVuZGVyT2JqZWN0Q2hpbGRM
aXN0Ojp1cGRhdGVCZWZvcmUKIAogICAgIC8vIFdoZXRoZXIgb3Igbm90IHdlIG5vdyB3YW50IGdl
bmVyYXRlZCBjb250ZW50LiAgCiAgICAgYm9vbCBuZXdDb250ZW50V2FudGVkID0gcHNldWRvRWxl
bWVudFN0eWxlICYmIHBzZXVkb0VsZW1lbnRTdHlsZS0+ZGlzcGxheSgpICE9IE5PTkU7Ci0KLSAg
ICAvLyBGb3IgPHE+PHAvPjwvcT4sIGlmIHRoaXMgb2JqZWN0IGlzIHRoZSBpbmxpbmUgY29udGlu
dWF0aW9uIG9mIHRoZSA8cT4sIHdlIG9ubHkgd2FudCB0byBnZW5lcmF0ZQotICAgIC8vIDphZnRl
ciBjb250ZW50IGFuZCBub3QgOmJlZm9yZSBjb250ZW50LgotICAgIGlmIChuZXdDb250ZW50V2Fu
dGVkICYmIHR5cGUgPT0gQkVGT1JFICYmIG93bmVyLT5pc1JlbmRlcklubGluZSgpICYmIHRvUmVu
ZGVySW5saW5lKG93bmVyKS0+aXNJbmxpbmVDb250aW51YXRpb24oKSkKLSAgICAgICAgbmV3Q29u
dGVudFdhbnRlZCA9IGZhbHNlOwotCi0gICAgLy8gU2ltaWxhcmx5LCBpZiB3ZSdyZSB0aGUgYmVn
aW5uaW5nIG9mIGEgPHE+LCBhbmQgdGhlcmUncyBhbiBpbmxpbmUgY29udGludWF0aW9uIGZvciBv
dXIgb2JqZWN0LAotICAgIC8vIHRoZW4gd2UgZG9uJ3QgZ2VuZXJhdGUgdGhlIDphZnRlciBjb250
ZW50LgotICAgIGlmIChuZXdDb250ZW50V2FudGVkICYmIHR5cGUgPT0gQUZURVIgJiYgb3duZXIt
PmlzUmVuZGVySW5saW5lKCkgJiYgdG9SZW5kZXJJbmxpbmUob3duZXIpLT5jb250aW51YXRpb24o
KSkKLSAgICAgICAgbmV3Q29udGVudFdhbnRlZCA9IGZhbHNlOwogICAgIAogICAgIC8vIElmIHdl
IGRvbid0IHdhbnQgZ2VuZXJhdGVkIGNvbnRlbnQgYW55IGxvbmdlciwgb3IgaWYgd2UgaGF2ZSBn
ZW5lcmF0ZWQgY29udGVudCwgYnV0IGl0J3Mgbm8gbG9uZ2VyCiAgICAgLy8gaWRlbnRpY2FsIHRv
IHRoZSBuZXcgY29udGVudCBkYXRhIHdlIHdhbnQgdG8gYnVpbGQgcmVuZGVyIG9iamVjdHMgZm9y
LCB0aGVuIHdlIG51a2UgYWxsCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9Sb290SW5saW5lQm94
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9Sb290SW5saW5lQm94LmNwcAko
cmV2aXNpb24gNDc1OTEpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9Sb290SW5saW5lQm94LmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMjAzLDYgKzIwMywxNyBAQCB2b2lkIFJvb3RJbmxpbmVCb3g6OmNo
aWxkUmVtb3ZlZChJbmxpbmVCCiAKIGludCBSb290SW5saW5lQm94Ojp2ZXJ0aWNhbGx5QWxpZ25C
b3hlcyhpbnQgaGVpZ2h0T2ZCbG9jaykKIHsKKyAgICBSZW5kZXJCbG9jayogaW5saW5lQmxvY2sg
PSBhbm9ueW1vdXNJbmxpbmVCbG9jaygpOworICAgIGlmIChpbmxpbmVCbG9jaykgeworICAgICAg
ICBpbnQgbGluZVRvcCA9IGlubGluZUJsb2NrLT55KCk7CisgICAgICAgIGludCBsaW5lQm90dG9t
ID0gaW5saW5lQmxvY2stPnkoKSArIGlubGluZUJsb2NrLT5oZWlnaHQoKTsKKyAgICAgICAgZmly
c3RDaGlsZCgpLT5zZXRZKGxpbmVUb3ApOworICAgICAgICBzZXRZKGxpbmVUb3ApOworICAgICAg
ICBjb21wdXRlVmVydGljYWxPdmVyZmxvdyhsaW5lVG9wLCBsaW5lQm90dG9tLCB0cnVlKTsKKyAg
ICAgICAgc2V0TGluZVRvcEJvdHRvbVBvc2l0aW9ucyhsaW5lVG9wLCBsaW5lQm90dG9tKTsKKyAg
ICAgICAgcmV0dXJuIGhlaWdodE9mQmxvY2s7CisgICAgfQorICAgIAogICAgIGludCBtYXhQb3Np
dGlvblRvcCA9IDA7CiAgICAgaW50IG1heFBvc2l0aW9uQm90dG9tID0gMDsKICAgICBpbnQgbWF4
QXNjZW50ID0gMDsKQEAgLTIxNiw3ICsyMjcsNiBAQCBpbnQgUm9vdElubGluZUJveDo6dmVydGlj
YWxseUFsaWduQm94ZXMoCiAgICAgYm9vbCBzdHJpY3RNb2RlID0gKGN1cnIgJiYgY3Vyci0+ZG9j
dW1lbnQoKS0+aW5TdHJpY3RNb2RlKCkpOwogCiAgICAgY29tcHV0ZUxvZ2ljYWxCb3hIZWlnaHRz
KG1heFBvc2l0aW9uVG9wLCBtYXhQb3NpdGlvbkJvdHRvbSwgbWF4QXNjZW50LCBtYXhEZXNjZW50
LCBzdHJpY3RNb2RlKTsKLQogICAgIGlmIChtYXhBc2NlbnQgKyBtYXhEZXNjZW50IDwgbWF4KG1h
eFBvc2l0aW9uVG9wLCBtYXhQb3NpdGlvbkJvdHRvbSkpCiAgICAgICAgIGFkanVzdE1heEFzY2Vu
dEFuZERlc2NlbnQobWF4QXNjZW50LCBtYXhEZXNjZW50LCBtYXhQb3NpdGlvblRvcCwgbWF4UG9z
aXRpb25Cb3R0b20pOwogCkBAIC00MjksNCArNDM5LDkgQEAgdm9pZCBSb290SW5saW5lQm94Ojph
dHRhY2hMaW5lQm94VG9SZW5kZQogICAgIGJsb2NrKCktPmxpbmVCb3hlcygpLT5hdHRhY2hMaW5l
Qm94KHRoaXMpOwogfQogCitSZW5kZXJCbG9jayogUm9vdElubGluZUJveDo6YW5vbnltb3VzSW5s
aW5lQmxvY2soKSBjb25zdAoreworICAgIHJldHVybiBmaXJzdENoaWxkKCkgJiYgZmlyc3RDaGls
ZCgpID09IGxhc3RDaGlsZCgpICYmICFmaXJzdENoaWxkKCktPmlzVGV4dCgpICYmIGZpcnN0Q2hp
bGQoKS0+cmVuZGVyZXIoKS0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpID8gdG9SZW5kZXJCbG9j
ayhmaXJzdENoaWxkKCktPnJlbmRlcmVyKCkpIDogMDsKK30KKwogfSAvLyBuYW1lc3BhY2UgV2Vi
Q29yZQpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUm9vdElubGluZUJveC5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvcmVuZGVyaW5nL1Jvb3RJbmxpbmVCb3guaAkocmV2aXNpb24gNDc1OTEpCisr
KyBXZWJDb3JlL3JlbmRlcmluZy9Sb290SW5saW5lQm94LmgJKHdvcmtpbmcgY29weSkKQEAgLTEz
NCw2ICsxMzQsOCBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCB2b2lkIGF0dGFjaExpbmVCb3hUb1Jl
bmRlck9iamVjdCgpOwogICAgIHZpcnR1YWwgdm9pZCByZW1vdmVMaW5lQm94RnJvbVJlbmRlck9i
amVjdCgpOwogCisgICAgUmVuZGVyQmxvY2sqIGFub255bW91c0lubGluZUJsb2NrKCkgY29uc3Q7
CisKIHByb3RlY3RlZDoKICAgICAvLyBXaGVyZSB0aGlzIGxpbmUgZW5kZWQuICBUaGUgZXhhY3Qg
b2JqZWN0IGFuZCB0aGUgcG9zaXRpb24gd2l0aGluIHRoYXQgb2JqZWN0IGFyZSBzdG9yZWQgc28g
dGhhdAogICAgIC8vIHdlIGNhbiBjcmVhdGUgYW4gSW5saW5lSXRlcmF0b3IgYmVnaW5uaW5nIGp1
c3QgYWZ0ZXIgdGhlIGVuZCBvZiB0aGlzIGxpbmUuCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>38442</attachid>
            <date>2009-08-22 21:24:22 -0700</date>
            <delta_ts>2009-08-23 01:06:39 -0700</delta_ts>
            <desc>001.html-033.html pass</desc>
            <filename>patch.txt</filename>
            <type>text/plain</type>
            <size>81059</size>
            <attacher name="Dave Hyatt">hyatt</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0LmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eVJlbmRl
ck9iamVjdC5jcHAJKHJldmlzaW9uIDQ3NTkxKQorKysgV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0Fj
Y2Vzc2liaWxpdHlSZW5kZXJPYmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01MjMsMTIgKzUy
Myw4IEBAIEVsZW1lbnQqIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmFuY2gKICAgICBSZW5k
ZXJPYmplY3QqIGN1cnJSZW5kZXJlcjsKICAgICAKICAgICAvLyBTZWFyY2ggdXAgdGhlIHJlbmRl
ciB0cmVlIGZvciBhIFJlbmRlck9iamVjdCB3aXRoIGEgRE9NIG5vZGUuICBEZWZlciB0byBhbiBl
YXJsaWVyIGNvbnRpbnVhdGlvbiwgdGhvdWdoLgotICAgIGZvciAoY3VyclJlbmRlcmVyID0gbV9y
ZW5kZXJlcjsgY3VyclJlbmRlcmVyICYmICFjdXJyUmVuZGVyZXItPm5vZGUoKTsgY3VyclJlbmRl
cmVyID0gY3VyclJlbmRlcmVyLT5wYXJlbnQoKSkgewotICAgICAgICBpZiAoY3VyclJlbmRlcmVy
LT5pc1JlbmRlckJsb2NrKCkpIHsKLSAgICAgICAgICAgIFJlbmRlcklubGluZSogY29udGludWF0
aW9uID0gdG9SZW5kZXJCbG9jayhjdXJyUmVuZGVyZXIpLT5pbmxpbmVDb250aW51YXRpb24oKTsK
LSAgICAgICAgICAgIGlmIChjb250aW51YXRpb24pCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNh
Y2hlLT5nZXRPckNyZWF0ZShjb250aW51YXRpb24pLT5hbmNob3JFbGVtZW50KCk7Ci0gICAgICAg
IH0KKyAgICBmb3IgKGN1cnJSZW5kZXJlciA9IG1fcmVuZGVyZXI7IGN1cnJSZW5kZXJlciAmJiAh
Y3VyclJlbmRlcmVyLT5ub2RlKCk7IGN1cnJSZW5kZXJlciA9IGN1cnJSZW5kZXJlci0+cGFyZW50
KCkpCisgICAgewogICAgIH0KICAgICAKICAgICAvLyBiYWlsIGlmIG5vbmUgZm91bmQKSW5kZXg6
IFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUZsb3dCb3guY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvcmVuZGVyaW5nL0lubGluZUZsb3dCb3guY3BwCShyZXZpc2lvbiA0NzU5MSkKKysrIFdlYkNv
cmUvcmVuZGVyaW5nL0lubGluZUZsb3dCb3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMjcsMTQg
KzIyNywxMyBAQCB2b2lkIElubGluZUZsb3dCb3g6OmRldGVybWluZVNwYWNpbmdGb3JGCiAgICAg
ICAgIC8vICgzKSBUaGUgbGluZSBtYXkgZW5kIG9uIHRoZSBpbmxpbmUuICBJZiB3ZSBhcmUgdGhl
IGxhc3QgY2hpbGQgKGNsaW1iaW5nIHVwCiAgICAgICAgIC8vIHRoZSBlbmQgb2JqZWN0J3MgY2hh
aW4pLCB0aGVuIHdlIGp1c3QgY2xvc2VkIGFzIHdlbGwuCiAgICAgICAgIGlmICghbGluZUJveExp
c3QtPmxhc3RMaW5lQm94KCktPmlzQ29uc3RydWN0ZWQoKSkgewotICAgICAgICAgICAgUmVuZGVy
SW5saW5lKiBpbmxpbmVGbG93ID0gdG9SZW5kZXJJbmxpbmUocmVuZGVyZXIoKSk7CiAgICAgICAg
ICAgICBpZiAobHRyKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFuZXh0TGluZUJveCgpICYmCi0g
ICAgICAgICAgICAgICAgICAgICgobGFzdExpbmUgJiYgIWlubGluZUZsb3ctPmNvbnRpbnVhdGlv
bigpKSB8fCBuZXh0T25MaW5lRXhpc3RzKCkgfHwgb25FbmRDaGFpbihlbmRPYmplY3QpKSkKKyAg
ICAgICAgICAgICAgICAgICAgKGxhc3RMaW5lIHx8IG5leHRPbkxpbmVFeGlzdHMoKSB8fCBvbkVu
ZENoYWluKGVuZE9iamVjdCkpKQogICAgICAgICAgICAgICAgICAgICBpbmNsdWRlUmlnaHRFZGdl
ID0gdHJ1ZTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKCghcHJl
dkxpbmVCb3goKSB8fCBwcmV2TGluZUJveCgpLT5pc0NvbnN0cnVjdGVkKCkpICYmCi0gICAgICAg
ICAgICAgICAgICAgICgobGFzdExpbmUgJiYgIWlubGluZUZsb3ctPmNvbnRpbnVhdGlvbigpKSB8
fCBwcmV2T25MaW5lRXhpc3RzKCkgfHwgb25FbmRDaGFpbihlbmRPYmplY3QpKSkKKyAgICAgICAg
ICAgICAgICAgICAgKGxhc3RMaW5lIHx8IHByZXZPbkxpbmVFeGlzdHMoKSB8fCBvbkVuZENoYWlu
KGVuZE9iamVjdCkpKQogICAgICAgICAgICAgICAgICAgICBpbmNsdWRlTGVmdEVkZ2UgPSB0cnVl
OwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC01MDQsNyArNTAzLDcgQEAgdm9pZCBJbmxp
bmVGbG93Qm94OjpwbGFjZUJveGVzVmVydGljYWxseQogICAgICAgICAgICAgICAgIG5ld1kgLT0g
Y3Vyci0+Ym94TW9kZWxPYmplY3QoKS0+Ym9yZGVyVG9wKCkgKyBjdXJyLT5ib3hNb2RlbE9iamVj
dCgpLT5wYWRkaW5nVG9wKCk7CiAgICAgICAgIH0gZWxzZSBpZiAoIWN1cnItPnJlbmRlcmVyKCkt
PmlzQlIoKSkgewogICAgICAgICAgICAgUmVuZGVyQm94KiBib3ggPSB0b1JlbmRlckJveChjdXJy
LT5yZW5kZXJlcigpKTsKLSAgICAgICAgICAgIG5ld1kgKz0gYm94LT5tYXJnaW5Ub3AoKTsKKyAg
ICAgICAgICAgIG5ld1kgKz0gY3Vyci0+cmVuZGVyZXIoKS0+aXNBbm9ueW1vdXNJbmxpbmVCbG9j
aygpID8gMCA6IGJveC0+bWFyZ2luVG9wKCk7CiAgICAgICAgIH0KIAogICAgICAgICBjdXJyLT5z
ZXRZKG5ld1kpOwpAQCAtNjQzLDEzICs2NDIsNyBAQCB2b2lkIElubGluZUZsb3dCb3g6OnBhaW50
KFJlbmRlck9iamVjdDo6CiAgICAgICAgICAgICAvLyBvdXRsaW5lcy4KICAgICAgICAgICAgIGlm
IChyZW5kZXJlcigpLT5zdHlsZSgpLT52aXNpYmlsaXR5KCkgPT0gVklTSUJMRSAmJiByZW5kZXJl
cigpLT5oYXNPdXRsaW5lKCkgJiYgIWlzUm9vdElubGluZUJveCgpKSB7CiAgICAgICAgICAgICAg
ICAgUmVuZGVySW5saW5lKiBpbmxpbmVGbG93ID0gdG9SZW5kZXJJbmxpbmUocmVuZGVyZXIoKSk7
Ci0gICAgICAgICAgICAgICAgaWYgKChpbmxpbmVGbG93LT5jb250aW51YXRpb24oKSB8fCBpbmxp
bmVGbG93LT5pc0lubGluZUNvbnRpbnVhdGlvbigpKSAmJiAhYm94TW9kZWxPYmplY3QoKS0+aGFz
U2VsZlBhaW50aW5nTGF5ZXIoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBBZGQgb3Vyc2Vs
dmVzIHRvIHRoZSBjb250YWluaW5nIGJsb2NrIG9mIHRoZSBlbnRpcmUgY29udGludWF0aW9uIHNv
IHRoYXQgaXQgY2FuCi0gICAgICAgICAgICAgICAgICAgIC8vIHBhaW50IHVzIGF0b21pY2FsbHku
Ci0gICAgICAgICAgICAgICAgICAgIFJlbmRlckJsb2NrKiBibG9jayA9IHJlbmRlcmVyKCktPmNv
bnRhaW5pbmdCbG9jaygpLT5jb250YWluaW5nQmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAg
YmxvY2stPmFkZENvbnRpbnVhdGlvbldpdGhPdXRsaW5lKHRvUmVuZGVySW5saW5lKHJlbmRlcmVy
KCktPm5vZGUoKS0+cmVuZGVyZXIoKSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlu
bGluZUZsb3ctPmlzSW5saW5lQ29udGludWF0aW9uKCkpCi0gICAgICAgICAgICAgICAgICAgIHBh
aW50SW5mby5vdXRsaW5lT2JqZWN0cy0+YWRkKGlubGluZUZsb3cpOworICAgICAgICAgICAgICAg
IHBhaW50SW5mby5vdXRsaW5lT2JqZWN0cy0+YWRkKGlubGluZUZsb3cpOwogICAgICAgICAgICAg
fQogICAgICAgICB9IGVsc2UgaWYgKHBhaW50SW5mby5waGFzZSA9PSBQYWludFBoYXNlTWFzaykg
ewogICAgICAgICAgICAgcGFpbnRNYXNrKHBhaW50SW5mbywgdHgsIHR5KTsKSW5kZXg6IFdlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRl
cmluZy9SZW5kZXJCbG9jay5jcHAJKHJldmlzaW9uIDQ3Njc4KQorKysgV2ViQ29yZS9yZW5kZXJp
bmcvUmVuZGVyQmxvY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC04Miw4ICs4Miw2IEBAIHN0YXRp
YyBQZXJjZW50SGVpZ2h0RGVzY2VuZGFudHNNYXAqIGdQZXIKIAogdHlwZWRlZiBXVEY6Okhhc2hN
YXA8Y29uc3QgUmVuZGVyQm94KiwgSGFzaFNldDxSZW5kZXJCbG9jayo+Kj4gUGVyY2VudEhlaWdo
dENvbnRhaW5lck1hcDsKIHN0YXRpYyBQZXJjZW50SGVpZ2h0Q29udGFpbmVyTWFwKiBnUGVyY2Vu
dEhlaWdodENvbnRhaW5lck1hcCA9IDA7Ci0gICAgCi10eXBlZGVmIFdURjo6SGFzaE1hcDxSZW5k
ZXJCbG9jayosIExpc3RIYXNoU2V0PFJlbmRlcklubGluZSo+Kj4gQ29udGludWF0aW9uT3V0bGlu
ZVRhYmxlTWFwOwogCiB0eXBlZGVmIFdURjo6SGFzaFNldDxSZW5kZXJCbG9jayo+IERlbGF5ZWRV
cGRhdGVTY3JvbGxJbmZvU2V0Owogc3RhdGljIGludCBnRGVsYXlVcGRhdGVTY3JvbGxJbmZvID0g
MDsKQEAgLTk2LDcgKzk0LDcgQEAgUmVuZGVyQmxvY2s6Ok1hcmdpbkluZm86Ok1hcmdpbkluZm8o
UmVuZAogICAgIC8vIGlmIHdlIGhhZCBhbnkgYm9yZGVyL3BhZGRpbmcgKG9idmlvdXNseSksIGlm
IHdlJ3JlIHRoZSByb290IG9yIEhUTUwgZWxlbWVudHMsIG9yIGlmCiAgICAgLy8gd2UncmUgcG9z
aXRpb25lZCwgZmxvYXRpbmcsIGEgdGFibGUgY2VsbC4KICAgICBtX2NhbkNvbGxhcHNlV2l0aENo
aWxkcmVuID0gIWJsb2NrLT5pc1JlbmRlclZpZXcoKSAmJiAhYmxvY2stPmlzUm9vdCgpICYmICFi
bG9jay0+aXNQb3NpdGlvbmVkKCkgJiYKLSAgICAgICAgIWJsb2NrLT5pc0Zsb2F0aW5nKCkgJiYg
IWJsb2NrLT5pc1RhYmxlQ2VsbCgpICYmICFibG9jay0+aGFzT3ZlcmZsb3dDbGlwKCkgJiYgIWJs
b2NrLT5pc0lubGluZUJsb2NrT3JJbmxpbmVUYWJsZSgpOworICAgICAgICAhYmxvY2stPmlzRmxv
YXRpbmcoKSAmJiAhYmxvY2stPmlzVGFibGVDZWxsKCkgJiYgIWJsb2NrLT5oYXNPdmVyZmxvd0Ns
aXAoKSAmJiAoIWJsb2NrLT5pc0lubGluZUJsb2NrT3JJbmxpbmVUYWJsZSgpIHx8IGJsb2NrLT5p
c0Fub255bW91c0lubGluZUJsb2NrKCkpOwogCiAgICAgbV9jYW5Db2xsYXBzZVRvcFdpdGhDaGls
ZHJlbiA9IG1fY2FuQ29sbGFwc2VXaXRoQ2hpbGRyZW4gJiYgKHRvcCA9PSAwKSAmJiBibG9jay0+
c3R5bGUoKS0+bWFyZ2luVG9wQ29sbGFwc2UoKSAhPSBNU0VQQVJBVEU7CiAKQEAgLTEyNSw3ICsx
MjMsNiBAQCBSZW5kZXJCbG9jazo6UmVuZGVyQmxvY2soTm9kZSogbm9kZSkKICAgICAgIDogUmVu
ZGVyQm94KG5vZGUpCiAgICAgICAsIG1fZmxvYXRpbmdPYmplY3RzKDApCiAgICAgICAsIG1fcG9z
aXRpb25lZE9iamVjdHMoMCkKLSAgICAgICwgbV9pbmxpbmVDb250aW51YXRpb24oMCkKICAgICAg
ICwgbV9tYXhNYXJnaW4oMCkKICAgICAgICwgbV9saW5lSGVpZ2h0KC0xKQogewpAQCAtMTYzLDEx
ICsxNjAsNiBAQCBSZW5kZXJCbG9jazo6flJlbmRlckJsb2NrKCkKIAogdm9pZCBSZW5kZXJCbG9j
azo6ZGVzdHJveSgpCiB7Ci0gICAgLy8gRGV0YWNoIG91ciBjb250aW51YXRpb24gZmlyc3QuCi0g
ICAgaWYgKG1faW5saW5lQ29udGludWF0aW9uKQotICAgICAgICBtX2lubGluZUNvbnRpbnVhdGlv
bi0+ZGVzdHJveSgpOwotICAgIG1faW5saW5lQ29udGludWF0aW9uID0gMDsKLSAgICAKICAgICAv
LyBNYWtlIHN1cmUgdG8gZGVzdHJveSBhbm9ueW1vdXMgY2hpbGRyZW4gZmlyc3Qgd2hpbGUgdGhl
eSBhcmUgc3RpbGwgY29ubmVjdGVkIHRvIHRoZSByZXN0IG9mIHRoZSB0cmVlLCBzbyB0aGF0IHRo
ZXkgd2lsbAogICAgIC8vIHByb3Blcmx5IGRpcnR5IGxpbmUgYm94ZXMgdGhhdCB0aGV5IGFyZSBy
ZW1vdmVkIGZyb20uICBFZmZlY3RzIHRoYXQgZG8gOmJlZm9yZS86YWZ0ZXIgb25seSBvbiBob3Zl
ciBjb3VsZCBjcmFzaCBvdGhlcndpc2UuCiAgICAgY2hpbGRyZW4oKS0+ZGVzdHJveUxlZnRvdmVy
Q2hpbGRyZW4oKTsKQEAgLTMxOCw3ICszMTAsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjphZGRDaGls
ZChSZW5kZXJPYmplY3QqCiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFjaGlsZHJlbklubGlu
ZSgpICYmIChuZXdDaGlsZC0+aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpIHx8IG5ld0NoaWxkLT5p
c0lubGluZSgpKSkgewogICAgICAgICAvLyBJZiB3ZSdyZSBpbnNlcnRpbmcgYW4gaW5saW5lIGNo
aWxkIGJ1dCBhbGwgb2Ygb3VyIGNoaWxkcmVuIGFyZSBibG9ja3MsIHRoZW4gd2UgaGF2ZSB0byBt
YWtlIHN1cmUKLSAgICAgICAgLy8gaXQgaXMgcHV0IGludG8gYW4gYW5vbXlvdXMgYmxvY2sgYm94
LiBXZSB0cnkgdG8gdXNlIGFuIGV4aXN0aW5nIGFub255bW91cyBib3ggaWYgcG9zc2libGUsIG90
aGVyd2lzZQorICAgICAgICAvLyBpdCBpcyBwdXQgaW50byBhbiBhbm9ueW1vdXMgYmxvY2sgYm94
LiBXZSB0cnkgdG8gdXNlIGFuIGV4aXN0aW5nIGFub255bW91cyBib3ggaWYgcG9zc2libGUsIG90
aGVyd2lzZQogICAgICAgICAvLyBhIG5ldyBvbmUgaXMgY3JlYXRlZCBhbmQgaW5zZXJ0ZWQgaW50
byBvdXIgbGlzdCBvZiBjaGlsZHJlbiBpbiB0aGUgYXBwcm9wcmlhdGUgcG9zaXRpb24uCiAgICAg
ICAgIFJlbmRlck9iamVjdCogYWZ0ZXJDaGlsZCA9IGJlZm9yZUNoaWxkID8gYmVmb3JlQ2hpbGQt
PnByZXZpb3VzU2libGluZygpIDogbGFzdENoaWxkKCk7CiAKQEAgLTQ1NCw5ICs0NDYsNiBAQCB2
b2lkIFJlbmRlckJsb2NrOjpyZW1vdmVMZWZ0b3ZlckFub255bW91CiAgICAgQVNTRVJUKGNoaWxk
LT5pc0Fub255bW91c0Jsb2NrKCkpOwogICAgIEFTU0VSVCghY2hpbGQtPmNoaWxkcmVuSW5saW5l
KCkpOwogICAgIAotICAgIGlmIChjaGlsZC0+aW5saW5lQ29udGludWF0aW9uKCkpIAotICAgICAg
ICByZXR1cm47Ci0gICAgCiAgICAgUmVuZGVyT2JqZWN0KiBmaXJzdEFuQ2hpbGQgPSBjaGlsZC0+
bV9jaGlsZHJlbi5maXJzdENoaWxkKCk7CiAgICAgUmVuZGVyT2JqZWN0KiBsYXN0QW5DaGlsZCA9
IGNoaWxkLT5tX2NoaWxkcmVuLmxhc3RDaGlsZCgpOwogICAgIGlmIChmaXJzdEFuQ2hpbGQpIHsK
QEAgLTQ5OSw3ICs0ODgsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjpyZW1vdmVDaGlsZChSZW5kZXJP
YmplCiAgICAgUmVuZGVyT2JqZWN0KiBwcmV2ID0gb2xkQ2hpbGQtPnByZXZpb3VzU2libGluZygp
OwogICAgIFJlbmRlck9iamVjdCogbmV4dCA9IG9sZENoaWxkLT5uZXh0U2libGluZygpOwogICAg
IGJvb2wgY2FuRGVsZXRlQW5vbnltb3VzQmxvY2tzID0gIWRvY3VtZW50QmVpbmdEZXN0cm95ZWQo
KSAmJiAhaXNJbmxpbmUoKSAmJiAhb2xkQ2hpbGQtPmlzSW5saW5lKCkgJiYgCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAoIW9sZENoaWxkLT5pc1JlbmRlckJsb2NrKCkgfHwg
IXRvUmVuZGVyQmxvY2sob2xkQ2hpbGQpLT5pbmxpbmVDb250aW51YXRpb24oKSkgJiYgCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhb2xkQ2hpbGQtPmlzUmVuZGVyQmxvY2so
KSAmJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghcHJldiB8fCAocHJl
di0+aXNBbm9ueW1vdXNCbG9jaygpICYmIHByZXYtPmNoaWxkcmVuSW5saW5lKCkpKSAmJgogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFuZXh0IHx8IChuZXh0LT5pc0Fub255
bW91c0Jsb2NrKCkgJiYgbmV4dC0+Y2hpbGRyZW5JbmxpbmUoKSkpOwogICAgIGlmIChjYW5EZWxl
dGVBbm9ueW1vdXNCbG9ja3MgJiYgcHJldiAmJiBuZXh0KSB7CkBAIC01NzIsOSArNTYxLDE1IEBA
IGJvb2wgUmVuZGVyQmxvY2s6OmlzU2VsZkNvbGxhcHNpbmdCbG9jaygKICAgICAvLyBvbiB3aGV0
aGVyIHdlIGhhdmUgY29udGVudCB0aGF0IGlzIGFsbCBzZWxmLWNvbGxhcHNpbmcgb3Igbm90Lgog
ICAgIGlmIChoYXNBdXRvSGVpZ2h0IHx8ICgoc3R5bGUoKS0+aGVpZ2h0KCkuaXNGaXhlZCgpIHx8
IHN0eWxlKCktPmhlaWdodCgpLmlzUGVyY2VudCgpKSAmJiBzdHlsZSgpLT5oZWlnaHQoKS5pc1pl
cm8oKSkpIHsKICAgICAgICAgLy8gSWYgdGhlIGJsb2NrIGhhcyBpbmxpbmUgY2hpbGRyZW4sIHNl
ZSBpZiB3ZSBnZW5lcmF0ZWQgYW55IGxpbmUgYm94ZXMuICBJZiB3ZSBoYXZlIGFueQotICAgICAg
ICAvLyBsaW5lIGJveGVzLCB0aGVuIHdlIGNhbid0IGJlIHNlbGYtY29sbGFwc2luZywgc2luY2Ug
d2UgaGF2ZSBjb250ZW50LgotICAgICAgICBpZiAoY2hpbGRyZW5JbmxpbmUoKSkKLSAgICAgICAg
ICAgIHJldHVybiAhZmlyc3RMaW5lQm94KCk7CisgICAgICAgIC8vIGxpbmUgYm94ZXMsIHRoZW4g
d2UgY2FuIG9ubHkgYmUgc2VsZi1jb2xsYXBzaW5nIGlmIHdlIGhhdmUgbm90aGluZyBidXQgYW5v
bnltb3VzIGlubGluZSBibG9ja3MKKyAgICAgICAgLy8gdGhhdCBhcmUgYWxzbyBzZWxmLWNvbGxh
cHNpbmcgaW5zaWRlIHVzLgorICAgICAgICBpZiAoY2hpbGRyZW5JbmxpbmUoKSkgeworICAgICAg
ICAgICAgZm9yIChSb290SW5saW5lQm94KiBjaGlsZCA9IGZpcnN0Um9vdEJveCgpOyBjaGlsZDsg
Y2hpbGQgPSBjaGlsZC0+bmV4dFJvb3RCb3goKSkgeworICAgICAgICAgICAgICAgIGlmICghY2hp
bGQtPmFub255bW91c0lubGluZUJsb2NrKCkgfHwgIWNoaWxkLT5hbm9ueW1vdXNJbmxpbmVCbG9j
aygpLT5pc1NlbGZDb2xsYXBzaW5nQmxvY2soKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIFdlIGhh
dmUgbm8gbGluZSBib3hlcywgc28gd2UgbXVzdCBiZSBzZWxmLWNvbGxhcHNpbmcuCisgICAgICAg
IH0KICAgICAgICAgCiAgICAgICAgIC8vIFdoZXRoZXIgb3Igbm90IHdlIGNvbGxhcHNlIGlzIGRl
cGVuZGVudCBvbiB3aGV0aGVyIGFsbCBvdXIgbm9ybWFsIGZsb3cgY2hpbGRyZW4KICAgICAgICAg
Ly8gYXJlIGFsc28gc2VsZi1jb2xsYXBzaW5nLgpAQCAtODI3LDcgKzgyMiw4IEBAIHZvaWQgUmVu
ZGVyQmxvY2s6OmFkZE92ZXJmbG93RnJvbUZsb2F0cygKIAogYm9vbCBSZW5kZXJCbG9jazo6ZXhw
YW5kc1RvRW5jbG9zZU92ZXJoYW5naW5nRmxvYXRzKCkgY29uc3QKIHsKLSAgICByZXR1cm4gaXNJ
bmxpbmVCbG9ja09ySW5saW5lVGFibGUoKSB8fCBpc0Zsb2F0aW5nT3JQb3NpdGlvbmVkKCkgfHwg
aGFzT3ZlcmZsb3dDbGlwKCkgfHwgKHBhcmVudCgpICYmIHBhcmVudCgpLT5pc0ZsZXhpYmxlQm94
KCkpIHx8IGhhc0NvbHVtbnMoKSB8fCBpc1RhYmxlQ2VsbCgpIHx8IGlzRmllbGRzZXQoKTsKKyAg
ICByZXR1cm4gaXNGbG9hdGluZ09yUG9zaXRpb25lZCgpIHx8IGhhc092ZXJmbG93Q2xpcCgpIHx8
IChwYXJlbnQoKSAmJiBwYXJlbnQoKS0+aXNGbGV4aWJsZUJveCgpKSB8fCBoYXNDb2x1bW5zKCkg
fHwgaXNUYWJsZUNlbGwoKSB8fCBpc0ZpZWxkc2V0KCkgfHwKKyAgICAgICAgICAgKGlzSW5saW5l
QmxvY2tPcklubGluZVRhYmxlKCkgJiYgIWlzQW5vbnltb3VzSW5saW5lQmxvY2soKSk7CiB9CiAK
IHZvaWQgUmVuZGVyQmxvY2s6OmFkanVzdFBvc2l0aW9uZWRCbG9jayhSZW5kZXJCb3gqIGNoaWxk
LCBjb25zdCBNYXJnaW5JbmZvJiBtYXJnaW5JbmZvKQpAQCAtOTY5LDE5ICs5NjUsMTkgQEAgYm9v
bCBSZW5kZXJCbG9jazo6aGFuZGxlUnVuSW5DaGlsZChSZW5kZQogaW50IFJlbmRlckJsb2NrOjpj
b2xsYXBzZU1hcmdpbnMoUmVuZGVyQm94KiBjaGlsZCwgTWFyZ2luSW5mbyYgbWFyZ2luSW5mbykK
IHsKICAgICAvLyBHZXQgb3VyIG1heCBwb3MgYW5kIG5lZyB0b3AgbWFyZ2lucy4KLSAgICBpbnQg
cG9zVG9wID0gY2hpbGQtPm1heFRvcE1hcmdpbih0cnVlKTsKLSAgICBpbnQgbmVnVG9wID0gY2hp
bGQtPm1heFRvcE1hcmdpbihmYWxzZSk7CisgICAgaW50IHBvc1RvcCA9IGNoaWxkID8gY2hpbGQt
Pm1heFRvcE1hcmdpbih0cnVlKSA6IDA7CisgICAgaW50IG5lZ1RvcCA9IGNoaWxkID8gY2hpbGQt
Pm1heFRvcE1hcmdpbihmYWxzZSkgOiAwOwogCiAgICAgLy8gRm9yIHNlbGYtY29sbGFwc2luZyBi
bG9ja3MsIGNvbGxhcHNlIG91ciBib3R0b20gbWFyZ2lucyBpbnRvIG91cgogICAgIC8vIHRvcCB0
byBnZXQgbmV3IHBvc1RvcCBhbmQgbmVnVG9wIHZhbHVlcy4KLSAgICBpZiAoY2hpbGQtPmlzU2Vs
ZkNvbGxhcHNpbmdCbG9jaygpKSB7CisgICAgaWYgKGNoaWxkICYmIGNoaWxkLT5pc1NlbGZDb2xs
YXBzaW5nQmxvY2soKSkgewogICAgICAgICBwb3NUb3AgPSBtYXgocG9zVG9wLCBjaGlsZC0+bWF4
Qm90dG9tTWFyZ2luKHRydWUpKTsKICAgICAgICAgbmVnVG9wID0gbWF4KG5lZ1RvcCwgY2hpbGQt
Pm1heEJvdHRvbU1hcmdpbihmYWxzZSkpOwogICAgIH0KICAgICAKICAgICAvLyBTZWUgaWYgdGhl
IHRvcCBtYXJnaW4gaXMgcXVpcmt5LiBXZSBvbmx5IGNhcmUgaWYgdGhpcyBjaGlsZCBoYXMKICAg
ICAvLyBtYXJnaW5zIHRoYXQgd2lsbCBjb2xsYXBzZSB3aXRoIHVzLgotICAgIGJvb2wgdG9wUXVp
cmsgPSBjaGlsZC0+aXNUb3BNYXJnaW5RdWlyaygpIHx8IHN0eWxlKCktPm1hcmdpblRvcENvbGxh
cHNlKCkgPT0gTURJU0NBUkQ7CisgICAgYm9vbCB0b3BRdWlyayA9IChjaGlsZCAmJiBjaGlsZC0+
aXNUb3BNYXJnaW5RdWlyaygpKSB8fCBzdHlsZSgpLT5tYXJnaW5Ub3BDb2xsYXBzZSgpID09IE1E
SVNDQVJEOwogCiAgICAgaWYgKG1hcmdpbkluZm8uY2FuQ29sbGFwc2VXaXRoVG9wKCkpIHsKICAg
ICAgICAgLy8gVGhpcyBjaGlsZCBpcyBjb2xsYXBzaW5nIHdpdGggdGhlIHRvcCBvZiB0aGUKQEAg
LTk5NCw3ICs5OTAsNyBAQCBpbnQgUmVuZGVyQmxvY2s6OmNvbGxhcHNlTWFyZ2lucyhSZW5kZXJC
CiAgICAgICAgIC8vIGNvbGxhcHNlIGl0IGF3YXksIGV2ZW4gaWYgdGhlIG1hcmdpbiBpcyBzbWFs
bGVyICh3d3cud2VicmVmZXJlbmNlLmNvbQogICAgICAgICAvLyBoYXMgYW4gZXhhbXBsZSBvZiB0
aGlzLCBhIDxkdD4gd2l0aCAwLjhlbSBhdXRob3Itc3BlY2lmaWVkIGluc2lkZQogICAgICAgICAv
LyBhIDxkbD4gaW5zaWRlIGEgPHRkPi4KLSAgICAgICAgaWYgKCFtYXJnaW5JbmZvLmRldGVybWlu
ZWRUb3BRdWlyaygpICYmICF0b3BRdWlyayAmJiAocG9zVG9wLW5lZ1RvcCkpIHsKKyAgICAgICAg
aWYgKCFtYXJnaW5JbmZvLmRldGVybWluZWRUb3BRdWlyaygpICYmICF0b3BRdWlyayAmJiAocG9z
VG9wIC0gbmVnVG9wKSkgewogICAgICAgICAgICAgc2V0VG9wTWFyZ2luUXVpcmsoZmFsc2UpOwog
ICAgICAgICAgICAgbWFyZ2luSW5mby5zZXREZXRlcm1pbmVkVG9wUXVpcmsodHJ1ZSk7CiAgICAg
ICAgIH0KQEAgLTEwMTIsNyArMTAwOCw3IEBAIGludCBSZW5kZXJCbG9jazo6Y29sbGFwc2VNYXJn
aW5zKFJlbmRlckIKICAgICAgICAgbWFyZ2luSW5mby5zZXRUb3BRdWlyayh0b3BRdWlyayk7CiAK
ICAgICBpbnQgeXBvcyA9IGhlaWdodCgpOwotICAgIGlmIChjaGlsZC0+aXNTZWxmQ29sbGFwc2lu
Z0Jsb2NrKCkpIHsKKyAgICBpZiAoY2hpbGQgJiYgY2hpbGQtPmlzU2VsZkNvbGxhcHNpbmdCbG9j
aygpKSB7CiAgICAgICAgIC8vIFRoaXMgY2hpbGQgaGFzIG5vIGhlaWdodC4gIFdlIG5lZWQgdG8g
Y29tcHV0ZSBvdXIKICAgICAgICAgLy8gcG9zaXRpb24gYmVmb3JlIHdlIGNvbGxhcHNlIHRoZSBj
aGlsZCdzIG1hcmdpbnMgdG9nZXRoZXIsCiAgICAgICAgIC8vIHNvIHRoYXQgd2UgY2FuIGdldCBh
biBhY2N1cmF0ZSBwb3NpdGlvbiBmb3IgdGhlIHplcm8taGVpZ2h0IGJsb2NrLgpAQCAtMTAzMSwx
MyArMTAyNywxMSBAQCBpbnQgUmVuZGVyQmxvY2s6OmNvbGxhcHNlTWFyZ2lucyhSZW5kZXJCCiAg
ICAgICAgICAgICAvLyB0aGF0IG5lZWRzIHRvIGJlIHBvc2l0aW9uZWQgY29ycmVjdGx5IChlLmcu
LCBhIGJsb2NrIHRoYXQKICAgICAgICAgICAgIC8vIGhhZCBhIHNwZWNpZmllZCBoZWlnaHQgb2Yg
MCBidXQgdGhhdCBhY3R1YWxseSBoYWQgc3ViY29udGVudCkuCiAgICAgICAgICAgICB5cG9zID0g
aGVpZ2h0KCkgKyBjb2xsYXBzZWRUb3BQb3MgLSBjb2xsYXBzZWRUb3BOZWc7Ci0gICAgfQotICAg
IGVsc2UgewotICAgICAgICBpZiAoY2hpbGQtPnN0eWxlKCktPm1hcmdpblRvcENvbGxhcHNlKCkg
PT0gTVNFUEFSQVRFKSB7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGNoaWxkICYmIGNoaWxk
LT5zdHlsZSgpLT5tYXJnaW5Ub3BDb2xsYXBzZSgpID09IE1TRVBBUkFURSkgewogICAgICAgICAg
ICAgc2V0SGVpZ2h0KGhlaWdodCgpICsgbWFyZ2luSW5mby5tYXJnaW4oKSArIGNoaWxkLT5tYXJn
aW5Ub3AoKSk7CiAgICAgICAgICAgICB5cG9zID0gaGVpZ2h0KCk7Ci0gICAgICAgIH0KLSAgICAg
ICAgZWxzZSBpZiAoIW1hcmdpbkluZm8uYXRUb3BPZkJsb2NrKCkgfHwKKyAgICAgICAgfSBlbHNl
IGlmICghbWFyZ2luSW5mby5hdFRvcE9mQmxvY2soKSB8fAogICAgICAgICAgICAgKCFtYXJnaW5J
bmZvLmNhbkNvbGxhcHNlVG9wV2l0aENoaWxkcmVuKCkKICAgICAgICAgICAgICAmJiAoIXN0eWxl
KCktPmh0bWxIYWNrcygpIHx8ICFtYXJnaW5JbmZvLnF1aXJrQ29udGFpbmVyKCkgfHwgIW1hcmdp
bkluZm8udG9wUXVpcmsoKSkpKSB7CiAgICAgICAgICAgICAvLyBXZSdyZSBjb2xsYXBzaW5nIHdp
dGggYSBwcmV2aW91cyBzaWJsaW5nJ3MgbWFyZ2lucyBhbmQgbm90CkBAIC0xMDQ2LDggKzEwNDAs
OCBAQCBpbnQgUmVuZGVyQmxvY2s6OmNvbGxhcHNlTWFyZ2lucyhSZW5kZXJCCiAgICAgICAgICAg
ICB5cG9zID0gaGVpZ2h0KCk7CiAgICAgICAgIH0KIAotICAgICAgICBtYXJnaW5JbmZvLnNldFBv
c01hcmdpbihjaGlsZC0+bWF4Qm90dG9tTWFyZ2luKHRydWUpKTsKLSAgICAgICAgbWFyZ2luSW5m
by5zZXROZWdNYXJnaW4oY2hpbGQtPm1heEJvdHRvbU1hcmdpbihmYWxzZSkpOworICAgICAgICBt
YXJnaW5JbmZvLnNldFBvc01hcmdpbihjaGlsZCA/IGNoaWxkLT5tYXhCb3R0b21NYXJnaW4odHJ1
ZSkgOiAwKTsKKyAgICAgICAgbWFyZ2luSW5mby5zZXROZWdNYXJnaW4oY2hpbGQgPyBjaGlsZC0+
bWF4Qm90dG9tTWFyZ2luKGZhbHNlKSA6IDApOwogCiAgICAgICAgIGlmIChtYXJnaW5JbmZvLm1h
cmdpbigpKQogICAgICAgICAgICAgbWFyZ2luSW5mby5zZXRCb3R0b21RdWlyayhjaGlsZC0+aXNC
b3R0b21NYXJnaW5RdWlyaygpIHx8IHN0eWxlKCktPm1hcmdpbkJvdHRvbUNvbGxhcHNlKCkgPT0g
TURJU0NBUkQpOwpAQCAtMTcxNywyMCArMTcxMSw3IEBAIHZvaWQgUmVuZGVyQmxvY2s6OnBhaW50
T2JqZWN0KFBhaW50SW5mbyYKICAgICBpZiAoKHBhaW50UGhhc2UgPT0gUGFpbnRQaGFzZU91dGxp
bmUgfHwgcGFpbnRQaGFzZSA9PSBQYWludFBoYXNlU2VsZk91dGxpbmUpICYmIGhhc091dGxpbmUo
KSAmJiBzdHlsZSgpLT52aXNpYmlsaXR5KCkgPT0gVklTSUJMRSkKICAgICAgICAgcGFpbnRPdXRs
aW5lKHBhaW50SW5mby5jb250ZXh0LCB0eCwgdHksIHdpZHRoKCksIGhlaWdodCgpLCBzdHlsZSgp
KTsKIAotICAgIC8vIDYuIHBhaW50IGNvbnRpbnVhdGlvbiBvdXRsaW5lcy4KLSAgICBpZiAoKHBh
aW50UGhhc2UgPT0gUGFpbnRQaGFzZU91dGxpbmUgfHwgcGFpbnRQaGFzZSA9PSBQYWludFBoYXNl
Q2hpbGRPdXRsaW5lcykpIHsKLSAgICAgICAgaWYgKGlubGluZUNvbnRpbnVhdGlvbigpICYmIGlu
bGluZUNvbnRpbnVhdGlvbigpLT5oYXNPdXRsaW5lKCkgJiYgaW5saW5lQ29udGludWF0aW9uKCkt
PnN0eWxlKCktPnZpc2liaWxpdHkoKSA9PSBWSVNJQkxFKSB7Ci0gICAgICAgICAgICBSZW5kZXJJ
bmxpbmUqIGlubGluZVJlbmRlcmVyID0gdG9SZW5kZXJJbmxpbmUoaW5saW5lQ29udGludWF0aW9u
KCktPm5vZGUoKS0+cmVuZGVyZXIoKSk7Ci0gICAgICAgICAgICBpZiAoIWlubGluZVJlbmRlcmVy
LT5oYXNTZWxmUGFpbnRpbmdMYXllcigpKQotICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdCbG9j
aygpLT5hZGRDb250aW51YXRpb25XaXRoT3V0bGluZShpbmxpbmVSZW5kZXJlcik7Ci0gICAgICAg
ICAgICBlbHNlIGlmICghaW5saW5lUmVuZGVyZXItPmZpcnN0TGluZUJveCgpKQotICAgICAgICAg
ICAgICAgIGlubGluZVJlbmRlcmVyLT5wYWludE91dGxpbmUocGFpbnRJbmZvLmNvbnRleHQsIHR4
IC0geCgpICsgaW5saW5lUmVuZGVyZXItPmNvbnRhaW5pbmdCbG9jaygpLT54KCksCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eSAtIHkoKSArIGlubGluZVJl
bmRlcmVyLT5jb250YWluaW5nQmxvY2soKS0+eSgpKTsKLSAgICAgICAgfQotICAgICAgICBwYWlu
dENvbnRpbnVhdGlvbk91dGxpbmVzKHBhaW50SW5mbywgdHgsIHR5KTsKLSAgICB9Ci0KLSAgICAv
LyA3LiBwYWludCBjYXJldC4KKyAgICAvLyA2LiBwYWludCBjYXJldC4KICAgICAvLyBJZiB0aGUg
Y2FyZXQncyBub2RlJ3MgcmVuZGVyIG9iamVjdCdzIGNvbnRhaW5pbmcgYmxvY2sgaXMgdGhpcyBi
bG9jaywgYW5kIHRoZSBwYWludCBhY3Rpb24gaXMgUGFpbnRQaGFzZUZvcmVncm91bmQsCiAgICAg
Ly8gdGhlbiBwYWludCB0aGUgY2FyZXQuCiAgICAgaWYgKHBhaW50UGhhc2UgPT0gUGFpbnRQaGFz
ZUZvcmVncm91bmQpIHsgICAgICAgIApAQCAtMTc5Myw1NyArMTc3NCw2IEBAIHZvaWQgUmVuZGVy
QmxvY2s6OnBhaW50RWxsaXBzaXNCb3hlcyhQYWkKICAgICB9CiB9CiAKLXN0YXRpYyBDb250aW51
YXRpb25PdXRsaW5lVGFibGVNYXAqIGNvbnRpbnVhdGlvbk91dGxpbmVUYWJsZSgpCi17Ci0gICAg
REVGSU5FX1NUQVRJQ19MT0NBTChDb250aW51YXRpb25PdXRsaW5lVGFibGVNYXAsIHRhYmxlLCAo
KSk7Ci0gICAgcmV0dXJuICZ0YWJsZTsKLX0KLQotdm9pZCBSZW5kZXJCbG9jazo6YWRkQ29udGlu
dWF0aW9uV2l0aE91dGxpbmUoUmVuZGVySW5saW5lKiBmbG93KQotewotICAgIC8vIFdlIGNhbid0
IG1ha2UgdGhpcyB3b3JrIGlmIHRoZSBpbmxpbmUgaXMgaW4gYSBsYXllci4gIFdlJ2xsIGp1c3Qg
cmVseSBvbiB0aGUgYnJva2VuCi0gICAgLy8gd2F5IG9mIHBhaW50aW5nLgotICAgIEFTU0VSVCgh
Zmxvdy0+bGF5ZXIoKSAmJiAhZmxvdy0+aXNJbmxpbmVDb250aW51YXRpb24oKSk7Ci0gICAgCi0g
ICAgQ29udGludWF0aW9uT3V0bGluZVRhYmxlTWFwKiB0YWJsZSA9IGNvbnRpbnVhdGlvbk91dGxp
bmVUYWJsZSgpOwotICAgIExpc3RIYXNoU2V0PFJlbmRlcklubGluZSo+KiBjb250aW51YXRpb25z
ID0gdGFibGUtPmdldCh0aGlzKTsKLSAgICBpZiAoIWNvbnRpbnVhdGlvbnMpIHsKLSAgICAgICAg
Y29udGludWF0aW9ucyA9IG5ldyBMaXN0SGFzaFNldDxSZW5kZXJJbmxpbmUqPjsKLSAgICAgICAg
dGFibGUtPnNldCh0aGlzLCBjb250aW51YXRpb25zKTsKLSAgICB9Ci0gICAgCi0gICAgY29udGlu
dWF0aW9ucy0+YWRkKGZsb3cpOwotfQotCi12b2lkIFJlbmRlckJsb2NrOjpwYWludENvbnRpbnVh
dGlvbk91dGxpbmVzKFBhaW50SW5mbyYgaW5mbywgaW50IHR4LCBpbnQgdHkpCi17Ci0gICAgQ29u
dGludWF0aW9uT3V0bGluZVRhYmxlTWFwKiB0YWJsZSA9IGNvbnRpbnVhdGlvbk91dGxpbmVUYWJs
ZSgpOwotICAgIGlmICh0YWJsZS0+aXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0gICAgICAg
IAotICAgIExpc3RIYXNoU2V0PFJlbmRlcklubGluZSo+KiBjb250aW51YXRpb25zID0gdGFibGUt
PmdldCh0aGlzKTsKLSAgICBpZiAoIWNvbnRpbnVhdGlvbnMpCi0gICAgICAgIHJldHVybjsKLSAg
ICAgICAgCi0gICAgLy8gUGFpbnQgZWFjaCBjb250aW51YXRpb24gb3V0bGluZS4KLSAgICBMaXN0
SGFzaFNldDxSZW5kZXJJbmxpbmUqPjo6aXRlcmF0b3IgZW5kID0gY29udGludWF0aW9ucy0+ZW5k
KCk7Ci0gICAgZm9yIChMaXN0SGFzaFNldDxSZW5kZXJJbmxpbmUqPjo6aXRlcmF0b3IgaXQgPSBj
b250aW51YXRpb25zLT5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgLy8gTmVl
ZCB0byBhZGQgaW4gdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBpbnRlcnZlbmluZyBibG9ja3MuCi0g
ICAgICAgIFJlbmRlcklubGluZSogZmxvdyA9ICppdDsKLSAgICAgICAgUmVuZGVyQmxvY2sqIGJs
b2NrID0gZmxvdy0+Y29udGFpbmluZ0Jsb2NrKCk7Ci0gICAgICAgIGZvciAoIDsgYmxvY2sgJiYg
YmxvY2sgIT0gdGhpczsgYmxvY2sgPSBibG9jay0+Y29udGFpbmluZ0Jsb2NrKCkpIHsKLSAgICAg
ICAgICAgIHR4ICs9IGJsb2NrLT54KCk7Ci0gICAgICAgICAgICB0eSArPSBibG9jay0+eSgpOwot
ICAgICAgICB9Ci0gICAgICAgIEFTU0VSVChibG9jayk7ICAgCi0gICAgICAgIGZsb3ctPnBhaW50
T3V0bGluZShpbmZvLmNvbnRleHQsIHR4LCB0eSk7Ci0gICAgfQotICAgIAotICAgIC8vIERlbGV0
ZQotICAgIGRlbGV0ZSBjb250aW51YXRpb25zOwotICAgIHRhYmxlLT5yZW1vdmUodGhpcyk7Ci19
Ci0KIHZvaWQgUmVuZGVyQmxvY2s6OnNldFNlbGVjdGlvblN0YXRlKFNlbGVjdGlvblN0YXRlIHMp
CiB7CiAgICAgaWYgKHNlbGVjdGlvblN0YXRlKCkgPT0gcykKQEAgLTI5MjksMjUgKzI4NTksMzEg
QEAgdm9pZCBSZW5kZXJCbG9jazo6Y2xlYXJGbG9hdHMoKQogICAgIC8vIG91dCBvZiBmbG93IChs
aWtlIGZsb2F0aW5nL3Bvc2l0aW9uZWQgZWxlbWVudHMpLCBhbmQgd2UgYWxzbyBza2lwIG92ZXIg
YW55IG9iamVjdHMgdGhhdCBtYXkgaGF2ZSBzaGlmdGVkCiAgICAgLy8gdG8gYXZvaWQgZmxvYXRz
LgogICAgIGJvb2wgcGFyZW50SGFzRmxvYXRzID0gZmFsc2U7Ci0gICAgUmVuZGVyT2JqZWN0KiBw
cmV2ID0gcHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgd2hpbGUgKHByZXYgJiYgKHByZXYtPmlzRmxv
YXRpbmdPclBvc2l0aW9uZWQoKSB8fCAhcHJldi0+aXNCb3goKSB8fCAhcHJldi0+aXNSZW5kZXJC
bG9jaygpIHx8IHRvUmVuZGVyQmxvY2socHJldiktPmF2b2lkc0Zsb2F0cygpKSkgewotICAgICAg
ICBpZiAocHJldi0+aXNGbG9hdGluZygpKQotICAgICAgICAgICAgcGFyZW50SGFzRmxvYXRzID0g
dHJ1ZTsKLSAgICAgICAgIHByZXYgPSBwcmV2LT5wcmV2aW91c1NpYmxpbmcoKTsKKyAgICBSZW5k
ZXJPYmplY3QqIHByZXYgPSAwOworICAgIFJlbmRlckJsb2NrKiBwYXJlbnRCbG9jayA9IDA7Cisg
ICAgaWYgKGlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkgeworICAgICAgICBwYXJlbnRCbG9jayA9
IGNvbnRhaW5pbmdCbG9jaygpOworICAgICAgICBwYXJlbnRIYXNGbG9hdHMgPSBwYXJlbnRCbG9j
ay0+Y29udGFpbnNGbG9hdHMoKTsKKyAgICB9IGVsc2UgeyAgICAKKyAgICAgICAgd2hpbGUgKHBy
ZXYgJiYgKHByZXYtPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSB8fCAhcHJldi0+aXNCb3goKSB8
fCAhcHJldi0+aXNSZW5kZXJCbG9jaygpIHx8IHRvUmVuZGVyQmxvY2socHJldiktPmF2b2lkc0Zs
b2F0cygpKSkgeworICAgICAgICAgICAgaWYgKHByZXYtPmlzRmxvYXRpbmcoKSkKKyAgICAgICAg
ICAgICAgICBwYXJlbnRIYXNGbG9hdHMgPSB0cnVlOworICAgICAgICAgICAgcHJldiA9IHByZXYt
PnByZXZpb3VzU2libGluZygpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwYXJlbnRC
bG9jayA9IHBhcmVudCgpLT5pc1JlbmRlckJsb2NrKCkgPyB0b1JlbmRlckJsb2NrKHBhcmVudCgp
KSA6IDA7CiAgICAgfQogCiAgICAgLy8gRmlyc3QgYWRkIGluIGZsb2F0cyBmcm9tIHRoZSBwYXJl
bnQuCiAgICAgaW50IG9mZnNldCA9IHkoKTsKLSAgICBpZiAocGFyZW50SGFzRmxvYXRzKSB7Ci0g
ICAgICAgIFJlbmRlckJsb2NrKiBwYXJlbnRCbG9jayA9IHRvUmVuZGVyQmxvY2socGFyZW50KCkp
OworICAgIGlmIChwYXJlbnRIYXNGbG9hdHMpCiAgICAgICAgIGFkZEludHJ1ZGluZ0Zsb2F0cyhw
YXJlbnRCbG9jaywgcGFyZW50QmxvY2stPmJvcmRlckxlZnQoKSArIHBhcmVudEJsb2NrLT5wYWRk
aW5nTGVmdCgpLCBvZmZzZXQpOwotICAgIH0KLSAgICAKKwogICAgIGludCB4b2Zmc2V0ID0gMDsK
ICAgICBpZiAocHJldikKICAgICAgICAgb2Zmc2V0IC09IHRvUmVuZGVyQm94KHByZXYpLT55KCk7
Ci0gICAgZWxzZSBpZiAocGFyZW50KCktPmlzQm94KCkpIHsKLSAgICAgICAgcHJldiA9IHBhcmVu
dCgpOworICAgIGVsc2UgaWYgKHBhcmVudEJsb2NrKSB7CisgICAgICAgIHByZXYgPSBwYXJlbnRC
bG9jazsKICAgICAgICAgeG9mZnNldCArPSB0b1JlbmRlckJveChwcmV2KS0+Ym9yZGVyTGVmdCgp
ICsgdG9SZW5kZXJCb3gocHJldiktPnBhZGRpbmdMZWZ0KCk7CiAgICAgfQogCkBAIC0zMDgyLDcg
KzMwMTgsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjphZGRJbnRydWRpbmdGbG9hdHMoUmVuCiAgICAg
ICAgICAgICAgICAgLy8gYWJvdmUuICB8eG9mZnwgd2lsbCBlcXVhbCAtZmxvdy0+bWFyZ2luTGVm
dCgpIGluIHRoaXMgY2FzZSwgc28gaXQncyBhbHJlYWR5IGJlZW4gdGFrZW4KICAgICAgICAgICAg
ICAgICAvLyBpbnRvIGFjY291bnQuICBPbmx5IGFwcGx5IHRoaXMgY29kZSBpZiB8Y2hpbGR8IGlz
IGZhbHNlLCBzaW5jZSBvdGhlcndpc2UgdGhlIGxlZnQgbWFyZ2luCiAgICAgICAgICAgICAgICAg
Ly8gd2lsbCBnZXQgYXBwbGllZCB0d2ljZS4KLSAgICAgICAgICAgICAgICBpZiAocHJldiAhPSBw
YXJlbnQoKSkKKyAgICAgICAgICAgICAgICBpZiAocHJldiAhPSBjb250YWluaW5nQmxvY2soKSkK
ICAgICAgICAgICAgICAgICAgICAgZmxvYXRpbmdPYmotPm1fbGVmdCArPSBwcmV2LT5tYXJnaW5M
ZWZ0KCk7CiAgICAgICAgICAgICAgICAgZmxvYXRpbmdPYmotPm1fbGVmdCAtPSBtYXJnaW5MZWZ0
KCk7CiAgICAgICAgICAgICAgICAgZmxvYXRpbmdPYmotPm1fc2hvdWxkUGFpbnQgPSBmYWxzZTsg
IC8vIFdlIGFyZSBub3QgaW4gdGhlIGRpcmVjdCBpbmhlcml0YW5jZSBjaGFpbiBmb3IgdGhpcyBm
bG9hdC4gV2Ugd2lsbCBuZXZlciBwYWludCBpdC4KQEAgLTMxMjcsNyArMzA2MywxMyBAQCB2b2lk
IFJlbmRlckJsb2NrOjptYXJrQWxsRGVzY2VuZGFudHNXaXRoCiAgICAgICAgIHJlbW92ZUZsb2F0
aW5nT2JqZWN0KGZsb2F0VG9SZW1vdmUpOwogCiAgICAgLy8gSXRlcmF0ZSBvdmVyIG91ciBjaGls
ZHJlbiBhbmQgbWFyayB0aGVtIGFzIG5lZWRlZC4KLSAgICBpZiAoIWNoaWxkcmVuSW5saW5lKCkp
IHsKKyAgICBpZiAoY2hpbGRyZW5JbmxpbmUoKSkgeworICAgICAgICBmb3IgKFJvb3RJbmxpbmVC
b3gqIGJveCA9IGZpcnN0Um9vdEJveCgpOyBib3g7IGJveCA9IGJveC0+bmV4dFJvb3RCb3goKSkg
eworICAgICAgICAgICAgUmVuZGVyQmxvY2sqIGNoaWxkQmxvY2sgPSBib3gtPmFub255bW91c0lu
bGluZUJsb2NrKCk7CisgICAgICAgICAgICBpZiAoY2hpbGRCbG9jayAmJiAoZmxvYXRUb1JlbW92
ZSA/IGNoaWxkQmxvY2stPmNvbnRhaW5zRmxvYXQoZmxvYXRUb1JlbW92ZSkgOiBjaGlsZEJsb2Nr
LT5jb250YWluc0Zsb2F0cygpKSkKKyAgICAgICAgICAgICAgICBjaGlsZEJsb2NrLT5tYXJrQWxs
RGVzY2VuZGFudHNXaXRoRmxvYXRzRm9yTGF5b3V0KGZsb2F0VG9SZW1vdmUsIGluTGF5b3V0KTsK
KyAgICAgICAgfQorICAgIH0gZWxzZSB7CiAgICAgICAgIGZvciAoUmVuZGVyT2JqZWN0KiBjaGls
ZCA9IGZpcnN0Q2hpbGQoKTsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHRTaWJsaW5nKCkpIHsK
ICAgICAgICAgICAgIGlmICgoIWZsb2F0VG9SZW1vdmUgJiYgY2hpbGQtPmlzRmxvYXRpbmdPclBv
c2l0aW9uZWQoKSkgfHwgIWNoaWxkLT5pc1JlbmRlckJsb2NrKCkpCiAgICAgICAgICAgICAgICAg
Y29udGludWU7CkBAIC00MDQ5LDE0ICszOTkxLDE1IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmNhbGNJ
bmxpbmVQcmVmV2lkdGhzKCkKICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAg
ICAgICAgY2xlYXJQcmV2aW91c0Zsb2F0ID0gZmFsc2U7CiAKLSAgICAgICAgICAgICAgICBib29s
IGNhbkJyZWFrUmVwbGFjZWRFbGVtZW50ID0gIWNoaWxkLT5pc0ltYWdlKCkgfHwgYWxsb3dJbWFn
ZXNUb0JyZWFrOworICAgICAgICAgICAgICAgIGJvb2wgY2FuQnJlYWtSZXBsYWNlZEVsZW1lbnQg
PSAhY2hpbGQtPmlzSW1hZ2UoKSB8fCBhbGxvd0ltYWdlc1RvQnJlYWsgfHwgY2hpbGQtPmlzQW5v
bnltb3VzSW5saW5lQmxvY2soKTsKICAgICAgICAgICAgICAgICBpZiAoKGNhbkJyZWFrUmVwbGFj
ZWRFbGVtZW50ICYmIChhdXRvV3JhcCB8fCBvbGRBdXRvV3JhcCkpIHx8IGNsZWFyUHJldmlvdXNG
bG9hdCkgewogICAgICAgICAgICAgICAgICAgICBtX21pblByZWZXaWR0aCA9IG1heChpbmxpbmVN
aW4sIG1fbWluUHJlZldpZHRoKTsKICAgICAgICAgICAgICAgICAgICAgaW5saW5lTWluID0gMDsK
ICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAvLyBJZiB3ZSdyZSBzdXBwb3Nl
ZCB0byBjbGVhciB0aGUgcHJldmlvdXMgZmxvYXQsIHRoZW4gdGVybWluYXRlIG1heHdpZHRoIGFz
IHdlbGwuCi0gICAgICAgICAgICAgICAgaWYgKGNsZWFyUHJldmlvdXNGbG9hdCkgeworICAgICAg
ICAgICAgICAgIC8vIEFsc28gZG8gdGhpcyBmb3IgYW5vbnltb3VzIGlubGluZSBibG9ja3MuCisg
ICAgICAgICAgICAgICAgaWYgKGNsZWFyUHJldmlvdXNGbG9hdCB8fCBjaGlsZC0+aXNBbm9ueW1v
dXNJbmxpbmVCbG9jaygpKSB7CiAgICAgICAgICAgICAgICAgICAgIG1fbWF4UHJlZldpZHRoID0g
bWF4KGlubGluZU1heCwgbV9tYXhQcmVmV2lkdGgpOwogICAgICAgICAgICAgICAgICAgICBpbmxp
bmVNYXggPSAwOwogICAgICAgICAgICAgICAgIH0KQEAgLTQwNjUsMTUgKzQwMDgsMTcgQEAgdm9p
ZCBSZW5kZXJCbG9jazo6Y2FsY0lubGluZVByZWZXaWR0aHMoKQogICAgICAgICAgICAgICAgIGlu
dCB0aSA9IDA7CiAgICAgICAgICAgICAgICAgaWYgKCFhZGRlZFRleHRJbmRlbnQpIHsKICAgICAg
ICAgICAgICAgICAgICAgYWRkZWRUZXh0SW5kZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAg
ICAgdGkgPSBzdHlsZSgpLT50ZXh0SW5kZW50KCkuY2FsY01pblZhbHVlKGN3KTsKLSAgICAgICAg
ICAgICAgICAgICAgY2hpbGRNaW4rPXRpOwotICAgICAgICAgICAgICAgICAgICBjaGlsZE1heCs9
dGk7CisgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGQtPmlzQW5vbnltb3VzSW5saW5lQmxv
Y2soKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGkgPSBzdHlsZSgpLT50ZXh0SW5kZW50
KCkuY2FsY01pblZhbHVlKGN3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkTWluICs9
IHRpOworICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRNYXggKz0gdGk7CisgICAgICAgICAg
ICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAvLyBBZGQg
b3VyIHdpZHRoIHRvIHRoZSBtYXguCiAgICAgICAgICAgICAgICAgaW5saW5lTWF4ICs9IGNoaWxk
TWF4OwogCi0gICAgICAgICAgICAgICAgaWYgKCFhdXRvV3JhcCB8fCAhY2FuQnJlYWtSZXBsYWNl
ZEVsZW1lbnQpIHsKKyAgICAgICAgICAgICAgICBpZiAoKCFhdXRvV3JhcCB8fCAhY2FuQnJlYWtS
ZXBsYWNlZEVsZW1lbnQpICYmICFjaGlsZC0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CiAg
ICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC0+aXNGbG9hdGluZygpKQogICAgICAgICAgICAg
ICAgICAgICAgICAgbV9taW5QcmVmV2lkdGggPSBtYXgoY2hpbGRNaW4sIG1fbWluUHJlZldpZHRo
KTsKICAgICAgICAgICAgICAgICAgICAgZWxzZQpAQCAtNDA4NCw2ICs0MDI5LDEyIEBAIHZvaWQg
UmVuZGVyQmxvY2s6OmNhbGNJbmxpbmVQcmVmV2lkdGhzKCkKIAogICAgICAgICAgICAgICAgICAg
ICAvLyBOb3cgc3RhcnQgYSBuZXcgbGluZS4KICAgICAgICAgICAgICAgICAgICAgaW5saW5lTWlu
ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGlmIChjaGls
ZC0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAv
LyBUZXJtaW5hdGUgbWF4IHdpZHRoIGFzIHdlbGwuCisgICAgICAgICAgICAgICAgICAgICAgICBt
X21heFByZWZXaWR0aCA9IG1heChjaGlsZE1heCwgbV9tYXhQcmVmV2lkdGgpOworICAgICAgICAg
ICAgICAgICAgICAgICAgaW5saW5lTWF4ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQogICAg
ICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBubyBsb25nZXIgc3Ry
aXBwaW5nIHdoaXRlc3BhY2UgYXQgdGhlIHN0YXJ0IG9mCkBAIC00MzIwLDkgKzQyNzEsMTIgQEAg
aW50IFJlbmRlckJsb2NrOjpsaW5lSGVpZ2h0KGJvb2wgZmlyc3RMaQogICAgIC8vIHRoZSBiYXNl
IGNsYXNzLiAgSWYgd2UncmUgYmVpbmcgcXVlcmllZCBhcyB0aG91Z2ggd2UncmUgdGhlIHJvb3Qg
bGluZQogICAgIC8vIGJveCwgdGhlbiB0aGUgZmFjdCB0aGF0IHdlJ3JlIGFuIGlubGluZS1ibG9j
ayBpcyBpcnJlbGV2YW50LCBhbmQgd2UgYmVoYXZlCiAgICAgLy8ganVzdCBsaWtlIGEgYmxvY2su
Ci0gICAgaWYgKGlzUmVwbGFjZWQoKSAmJiAhaXNSb290TGluZUJveCkKKyAgICBpZiAoaXNSZXBs
YWNlZCgpICYmICFpc1Jvb3RMaW5lQm94KSB7CisgICAgICAgIGlmIChpc0Fub255bW91c0lubGlu
ZUJsb2NrKCkpCisgICAgICAgICAgICByZXR1cm4gaGVpZ2h0KCk7CiAgICAgICAgIHJldHVybiBo
ZWlnaHQoKSArIG1hcmdpblRvcCgpICsgbWFyZ2luQm90dG9tKCk7Ci0gICAgCisgICAgfQorCiAg
ICAgaWYgKGZpcnN0TGluZSAmJiBkb2N1bWVudCgpLT51c2VzRmlyc3RMaW5lUnVsZXMoKSkgewog
ICAgICAgICBSZW5kZXJTdHlsZSogcyA9IHN0eWxlKGZpcnN0TGluZSk7CiAgICAgICAgIGlmIChz
ICE9IHN0eWxlKCkpCkBAIC00MzU0LDYgKzQzMDgsOCBAQCBpbnQgUmVuZGVyQmxvY2s6OmJhc2Vs
aW5lUG9zaXRpb24oYm9vbCBiCiAgICAgICAgIC8vIFdlIGFsc28gZ2l2ZSB1cCBvbiBmaW5kaW5n
IGEgYmFzZWxpbmUgaWYgd2UgaGF2ZSBhIHZlcnRpY2FsIHNjcm9sbGJhciwgb3IgaWYgd2UgYXJl
IHNjcm9sbGVkCiAgICAgICAgIC8vIHZlcnRpY2FsbHkgKGUuZy4sIGFuIG92ZXJmbG93OmhpZGRl
biBibG9jayB0aGF0IGhhcyBoYWQgc2Nyb2xsVG9wIG1vdmVkKSBvciBpZiB0aGUgYmFzZWxpbmUg
aXMgb3V0c2lkZQogICAgICAgICAvLyBvZiBvdXIgY29udGVudCBib3guCisgICAgICAgIGlmIChp
c0Fub255bW91c0lubGluZUJsb2NrKCkpCisgICAgICAgICAgICByZXR1cm4gaGVpZ2h0KCk7CiAg
ICAgICAgIGludCBiYXNlbGluZVBvcyA9IChsYXllcigpICYmIChsYXllcigpLT5tYXJxdWVlKCkg
fHwgbGF5ZXIoKS0+dmVydGljYWxTY3JvbGxiYXIoKSB8fCBsYXllcigpLT5zY3JvbGxZT2Zmc2V0
KCkgIT0gMCkpID8gLTEgOiBsYXN0TGluZUJveEJhc2VsaW5lKCk7CiAgICAgICAgIGlmIChiYXNl
bGluZVBvcyAhPSAtMSAmJiBiYXNlbGluZVBvcyA8PSBib3JkZXJUb3AoKSArIHBhZGRpbmdUb3Ao
KSArIGNvbnRlbnRIZWlnaHQoKSkKICAgICAgICAgICAgIHJldHVybiBtYXJnaW5Ub3AoKSArIGJh
c2VsaW5lUG9zOwpAQCAtNDc3OCw2MCArNDczNCw2IEBAIHZvaWQgUmVuZGVyQmxvY2s6OnNldE1h
eEJvdHRvbU1hcmdpbnMoaW4KICAgICBtX21heE1hcmdpbi0+bV9ib3R0b21OZWcgPSBuZWc7CiB9
CiAKLXZvaWQgUmVuZGVyQmxvY2s6OmFic29sdXRlUmVjdHMoVmVjdG9yPEludFJlY3Q+JiByZWN0
cywgaW50IHR4LCBpbnQgdHkpCi17Ci0gICAgLy8gRm9yIGJsb2NrcyBpbnNpZGUgaW5saW5lcywg
d2UgZ28gYWhlYWQgYW5kIGluY2x1ZGUgbWFyZ2lucyBzbyB0aGF0IHdlIHJ1biByaWdodCB1cCB0
byB0aGUKLSAgICAvLyBpbmxpbmUgYm94ZXMgYWJvdmUgYW5kIGJlbG93IHVzICh0aHVzIGdldHRp
bmcgbWVyZ2VkIHdpdGggdGhlbSB0byBmb3JtIGEgc2luZ2xlIGlycmVndWxhcgotICAgIC8vIHNo
YXBlKS4KLSAgICBpZiAoaW5saW5lQ29udGludWF0aW9uKCkpIHsKLSAgICAgICAgcmVjdHMuYXBw
ZW5kKEludFJlY3QodHgsIHR5IC0gY29sbGFwc2VkTWFyZ2luVG9wKCksCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHdpZHRoKCksIGhlaWdodCgpICsgY29sbGFwc2VkTWFyZ2luVG9wKCkg
KyBjb2xsYXBzZWRNYXJnaW5Cb3R0b20oKSkpOwotICAgICAgICBpbmxpbmVDb250aW51YXRpb24o
KS0+YWJzb2x1dGVSZWN0cyhyZWN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgdHggLSB4KCkgKyBpbmxpbmVDb250aW51YXRpb24oKS0+Y29udGFpbmluZ0Js
b2NrKCktPngoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
dHkgLSB5KCkgKyBpbmxpbmVDb250aW51YXRpb24oKS0+Y29udGFpbmluZ0Jsb2NrKCktPnkoKSk7
Ci0gICAgfSBlbHNlCi0gICAgICAgIHJlY3RzLmFwcGVuZChJbnRSZWN0KHR4LCB0eSwgd2lkdGgo
KSwgaGVpZ2h0KCkpKTsKLX0KLQotdm9pZCBSZW5kZXJCbG9jazo6YWJzb2x1dGVRdWFkcyhWZWN0
b3I8RmxvYXRRdWFkPiYgcXVhZHMpCi17Ci0gICAgLy8gRm9yIGJsb2NrcyBpbnNpZGUgaW5saW5l
cywgd2UgZ28gYWhlYWQgYW5kIGluY2x1ZGUgbWFyZ2lucyBzbyB0aGF0IHdlIHJ1biByaWdodCB1
cCB0byB0aGUKLSAgICAvLyBpbmxpbmUgYm94ZXMgYWJvdmUgYW5kIGJlbG93IHVzICh0aHVzIGdl
dHRpbmcgbWVyZ2VkIHdpdGggdGhlbSB0byBmb3JtIGEgc2luZ2xlIGlycmVndWxhcgotICAgIC8v
IHNoYXBlKS4KLSAgICBpZiAoaW5saW5lQ29udGludWF0aW9uKCkpIHsKLSAgICAgICAgRmxvYXRS
ZWN0IGxvY2FsUmVjdCgwLCAtY29sbGFwc2VkTWFyZ2luVG9wKCksCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgd2lkdGgoKSwgaGVpZ2h0KCkgKyBjb2xsYXBzZWRNYXJnaW5Ub3AoKSArIGNv
bGxhcHNlZE1hcmdpbkJvdHRvbSgpKTsKLSAgICAgICAgcXVhZHMuYXBwZW5kKGxvY2FsVG9BYnNv
bHV0ZVF1YWQobG9jYWxSZWN0KSk7Ci0gICAgICAgIGlubGluZUNvbnRpbnVhdGlvbigpLT5hYnNv
bHV0ZVF1YWRzKHF1YWRzKTsKLSAgICB9IGVsc2UKLSAgICAgICAgcXVhZHMuYXBwZW5kKFJlbmRl
ckJveDo6bG9jYWxUb0Fic29sdXRlUXVhZChGbG9hdFJlY3QoMCwgMCwgd2lkdGgoKSwgaGVpZ2h0
KCkpKSk7Ci19Ci0KLUludFJlY3QgUmVuZGVyQmxvY2s6OnJlY3RXaXRoT3V0bGluZUZvclJlcGFp
bnQoUmVuZGVyQm94TW9kZWxPYmplY3QqIHJlcGFpbnRDb250YWluZXIsIGludCBvdXRsaW5lV2lk
dGgpCi17Ci0gICAgSW50UmVjdCByKFJlbmRlckJveDo6cmVjdFdpdGhPdXRsaW5lRm9yUmVwYWlu
dChyZXBhaW50Q29udGFpbmVyLCBvdXRsaW5lV2lkdGgpKTsKLSAgICBpZiAoaW5saW5lQ29udGlu
dWF0aW9uKCkpCi0gICAgICAgIHIuaW5mbGF0ZVkoY29sbGFwc2VkTWFyZ2luVG9wKCkpOwotICAg
IHJldHVybiByOwotfQotCi1SZW5kZXJPYmplY3QqIFJlbmRlckJsb2NrOjpob3ZlckFuY2VzdG9y
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gaW5saW5lQ29udGludWF0aW9uKCkgPyBpbmxpbmVDb250
aW51YXRpb24oKSA6IFJlbmRlckJveDo6aG92ZXJBbmNlc3RvcigpOwotfQotCi12b2lkIFJlbmRl
ckJsb2NrOjp1cGRhdGVEcmFnU3RhdGUoYm9vbCBkcmFnT24pCi17Ci0gICAgUmVuZGVyQm94Ojp1
cGRhdGVEcmFnU3RhdGUoZHJhZ09uKTsKLSAgICBpZiAoaW5saW5lQ29udGludWF0aW9uKCkpCi0g
ICAgICAgIGlubGluZUNvbnRpbnVhdGlvbigpLT51cGRhdGVEcmFnU3RhdGUoZHJhZ09uKTsKLX0K
LQotUmVuZGVyU3R5bGUqIFJlbmRlckJsb2NrOjpvdXRsaW5lU3R5bGVGb3JSZXBhaW50KCkgY29u
c3QKLXsKLSAgICByZXR1cm4gaW5saW5lQ29udGludWF0aW9uKCkgPyBpbmxpbmVDb250aW51YXRp
b24oKS0+c3R5bGUoKSA6IHN0eWxlKCk7Ci19Ci0KIHZvaWQgUmVuZGVyQmxvY2s6OmNoaWxkQmVj
YW1lTm9uSW5saW5lKFJlbmRlck9iamVjdCopCiB7CiAgICAgbWFrZUNoaWxkcmVuTm9uSW5saW5l
KCk7CkBAIC00ODQwLDI2ICs0NzQyLDYgQEAgdm9pZCBSZW5kZXJCbG9jazo6Y2hpbGRCZWNhbWVO
b25JbmxpbmUoUgogICAgIC8vIHx0aGlzfCBtYXkgYmUgZGVhZCBoZXJlCiB9CiAKLXZvaWQgUmVu
ZGVyQmxvY2s6OnVwZGF0ZUhpdFRlc3RSZXN1bHQoSGl0VGVzdFJlc3VsdCYgcmVzdWx0LCBjb25z
dCBJbnRQb2ludCYgcG9pbnQpCi17Ci0gICAgaWYgKHJlc3VsdC5pbm5lck5vZGUoKSkKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgTm9kZSogbiA9IG5vZGUoKTsKLSAgICBpZiAoaW5saW5lQ29udGlu
dWF0aW9uKCkpCi0gICAgICAgIC8vIFdlIGFyZSBpbiB0aGUgbWFyZ2lucyBvZiBibG9jayBlbGVt
ZW50cyB0aGF0IGFyZSBwYXJ0IG9mIGEgY29udGludWF0aW9uLiAgSW4KLSAgICAgICAgLy8gdGhp
cyBjYXNlIHdlJ3JlIGFjdHVhbGx5IHN0aWxsIGluc2lkZSB0aGUgZW5jbG9zaW5nIGlubGluZSBl
bGVtZW50IHRoYXQgd2FzCi0gICAgICAgIC8vIHNwbGl0LiAgR28gYWhlYWQgYW5kIHNldCBvdXIg
aW5uZXIgbm9kZSBhY2NvcmRpbmdseS4KLSAgICAgICAgbiA9IGlubGluZUNvbnRpbnVhdGlvbigp
LT5ub2RlKCk7Ci0KLSAgICBpZiAobikgewotICAgICAgICByZXN1bHQuc2V0SW5uZXJOb2RlKG4p
OwotICAgICAgICBpZiAoIXJlc3VsdC5pbm5lck5vblNoYXJlZE5vZGUoKSkKLSAgICAgICAgICAg
IHJlc3VsdC5zZXRJbm5lck5vblNoYXJlZE5vZGUobik7Ci0gICAgICAgIHJlc3VsdC5zZXRMb2Nh
bFBvaW50KHBvaW50KTsKLSAgICB9Ci19Ci0KIEludFJlY3QgUmVuZGVyQmxvY2s6OmxvY2FsQ2Fy
ZXRSZWN0KElubGluZUJveCogaW5saW5lQm94LCBpbnQgY2FyZXRPZmZzZXQsIGludCogZXh0cmFX
aWR0aFRvRW5kT2ZMaW5lKQogewogICAgIC8vIERvIHRoZSBub3JtYWwgY2FsY3VsYXRpb24gaW4g
bW9zdCBjYXNlcy4KQEAgLTQ5NDMsMTcgKzQ4MjUsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjphZGRG
b2N1c1JpbmdSZWN0cyhHcmFwCiAgICAgLy8gRm9yIGJsb2NrcyBpbnNpZGUgaW5saW5lcywgd2Ug
Z28gYWhlYWQgYW5kIGluY2x1ZGUgbWFyZ2lucyBzbyB0aGF0IHdlIHJ1biByaWdodCB1cCB0byB0
aGUKICAgICAvLyBpbmxpbmUgYm94ZXMgYWJvdmUgYW5kIGJlbG93IHVzICh0aHVzIGdldHRpbmcg
bWVyZ2VkIHdpdGggdGhlbSB0byBmb3JtIGEgc2luZ2xlIGlycmVndWxhcgogICAgIC8vIHNoYXBl
KS4KLSAgICBpZiAoaW5saW5lQ29udGludWF0aW9uKCkpIHsKLSAgICAgICAgLy8gRklYTUU6IFRo
aXMgY2hlY2sgcmVhbGx5IGlzbid0IGFjY3VyYXRlLiAKLSAgICAgICAgYm9vbCBuZXh0SW5saW5l
SGFzTGluZUJveCA9IGlubGluZUNvbnRpbnVhdGlvbigpLT5maXJzdExpbmVCb3goKTsKLSAgICAg
ICAgLy8gRklYTUU6IFRoaXMgaXMgd3JvbmcuIFRoZSBwcmluY2lwYWwgcmVuZGVyZXIgbWF5IG5v
dCBiZSB0aGUgY29udGludWF0aW9uIHByZWNlZGluZyB0aGlzIGJsb2NrLgotICAgICAgICBib29s
IHByZXZJbmxpbmVIYXNMaW5lQm94ID0gdG9SZW5kZXJJbmxpbmUoaW5saW5lQ29udGludWF0aW9u
KCktPm5vZGUoKS0+cmVuZGVyZXIoKSktPmZpcnN0TGluZUJveCgpOyAKLSAgICAgICAgaW50IHRv
cE1hcmdpbiA9IHByZXZJbmxpbmVIYXNMaW5lQm94ID8gY29sbGFwc2VkTWFyZ2luVG9wKCkgOiAw
OwotICAgICAgICBpbnQgYm90dG9tTWFyZ2luID0gbmV4dElubGluZUhhc0xpbmVCb3ggPyBjb2xs
YXBzZWRNYXJnaW5Cb3R0b20oKSA6IDA7Ci0gICAgICAgIGdyYXBoaWNzQ29udGV4dC0+YWRkRm9j
dXNSaW5nUmVjdChJbnRSZWN0KHR4LCB0eSAtIHRvcE1hcmdpbiwgCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoKCksIGhlaWdodCgpICsgdG9w
TWFyZ2luICsgYm90dG9tTWFyZ2luKSk7Ci0gICAgfSBlbHNlCi0gICAgICAgIGdyYXBoaWNzQ29u
dGV4dC0+YWRkRm9jdXNSaW5nUmVjdChJbnRSZWN0KHR4LCB0eSwgd2lkdGgoKSwgaGVpZ2h0KCkp
KTsKKyAgICBncmFwaGljc0NvbnRleHQtPmFkZEZvY3VzUmluZ1JlY3QoSW50UmVjdCh0eCwgdHks
IHdpZHRoKCksIGhlaWdodCgpKSk7CiAKICAgICBpZiAoIWhhc092ZXJmbG93Q2xpcCgpICYmICFo
YXNDb250cm9sQ2xpcCgpKSB7CiAgICAgICAgIGZvciAoUm9vdElubGluZUJveCogY3VyciA9IGZp
cnN0Um9vdEJveCgpOyBjdXJyOyBjdXJyID0gY3Vyci0+bmV4dFJvb3RCb3goKSkgewpAQCAtNDk3
NSwxMSArNDg0Nyw2IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmFkZEZvY3VzUmluZ1JlY3RzKEdyYXAK
ICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLQotICAgIGlmIChpbmxpbmVDb250aW51
YXRpb24oKSkKLSAgICAgICAgaW5saW5lQ29udGludWF0aW9uKCktPmFkZEZvY3VzUmluZ1JlY3Rz
KGdyYXBoaWNzQ29udGV4dCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB0eCAtIHgoKSArIGlubGluZUNvbnRpbnVhdGlvbigpLT5jb250YWluaW5nQmxv
Y2soKS0+eCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgdHkgLSB5KCkgKyBpbmxpbmVDb250aW51YXRpb24oKS0+Y29udGFpbmluZ0Jsb2NrKCktPnko
KSk7CiB9CiAKIFJlbmRlckJsb2NrKiBSZW5kZXJCbG9jazo6Y3JlYXRlQW5vbnltb3VzQmxvY2so
Ym9vbCBpc0ZsZXhpYmxlQm94KSBjb25zdApAQCAtNTAxMSw2ICs0ODc4LDggQEAgY29uc3QgY2hh
ciogUmVuZGVyQmxvY2s6OnJlbmRlck5hbWUoKSBjbwogICAgICAgICByZXR1cm4gIlJlbmRlckJs
b2NrIChwb3NpdGlvbmVkKSI7CiAgICAgaWYgKGlzQW5vbnltb3VzQmxvY2soKSkKICAgICAgICAg
cmV0dXJuICJSZW5kZXJCbG9jayAoYW5vbnltb3VzKSI7CisgICAgZWxzZSBpZiAoaXNBbm9ueW1v
dXNJbmxpbmVCbG9jaygpKQorICAgICAgICByZXR1cm4gIlJlbmRlckJsb2NrIChhbm9ueW1vdXMg
aW5saW5lLWJsb2NrKSI7CiAgICAgZWxzZSBpZiAoaXNBbm9ueW1vdXMoKSkKICAgICAgICAgcmV0
dXJuICJSZW5kZXJCbG9jayAoZ2VuZXJhdGVkKSI7CiAgICAgaWYgKGlzUmVsUG9zaXRpb25lZCgp
KQpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5oCShyZXZpc2lvbiA0NzY3OCkKKysrIFdlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmgJKHdvcmtpbmcgY29weSkKQEAgLTEzMCwxNSArMTMw
LDE1IEBAIHB1YmxpYzoKIAogICAgIHZvaWQgYWRqdXN0UmVjdEZvckNvbHVtbnMoSW50UmVjdCYp
IGNvbnN0OwogCi0gICAgdm9pZCBhZGRDb250aW51YXRpb25XaXRoT3V0bGluZShSZW5kZXJJbmxp
bmUqKTsKLQotICAgIFJlbmRlcklubGluZSogaW5saW5lQ29udGludWF0aW9uKCkgY29uc3QgeyBy
ZXR1cm4gbV9pbmxpbmVDb250aW51YXRpb247IH0KLSAgICB2b2lkIHNldElubGluZUNvbnRpbnVh
dGlvbihSZW5kZXJJbmxpbmUqIGMpIHsgbV9pbmxpbmVDb250aW51YXRpb24gPSBjOyB9Ci0KICAg
ICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGEgY29udmVuaWVuY2UgaGVscGVyIGZvciBjcmVhdGluZyBh
biBhbm9ueW1vdXMgYmxvY2sgdGhhdCBpbmhlcml0cyBpdHMKICAgICAvLyBzdHlsZSBmcm9tIHRo
aXMgUmVuZGVyQmxvY2suCiAgICAgUmVuZGVyQmxvY2sqIGNyZWF0ZUFub255bW91c0Jsb2NrKGJv
b2wgaXNGbGV4aWJsZUJveCA9IGZhbHNlKSBjb25zdDsKIAorICAgIHZpcnR1YWwgdm9pZCBwYWlu
dChQYWludEluZm8mLCBpbnQgdHgsIGludCB0eSk7CisgICAgdmlydHVhbCB2b2lkIHBhaW50T2Jq
ZWN0KFBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5KTsKKworICAgIGJvb2wgaW5Sb290QmxvY2tD
b250ZXh0KCkgY29uc3Q7CisKIHByb3RlY3RlZDoKICAgICBpbnQgbWF4VG9wUG9zTWFyZ2luKCkg
Y29uc3QgeyByZXR1cm4gbV9tYXhNYXJnaW4gPyBtX21heE1hcmdpbi0+bV90b3BQb3MgOiBNYXhN
YXJnaW46OnRvcFBvc0RlZmF1bHQodGhpcyk7IH0KICAgICBpbnQgbWF4VG9wTmVnTWFyZ2luKCkg
Y29uc3QgeyByZXR1cm4gbV9tYXhNYXJnaW4gPyBtX21heE1hcmdpbi0+bV90b3BOZWcgOiBNYXhN
YXJnaW46OnRvcE5lZ0RlZmF1bHQodGhpcyk7IH0KQEAgLTE2MSw5ICsxNjEsNiBAQCBwcm90ZWN0
ZWQ6CiAKICAgICB2b2lkIGxheW91dFBvc2l0aW9uZWRPYmplY3RzKGJvb2wgcmVsYXlvdXRDaGls
ZHJlbik7CiAKLSAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoUGFpbnRJbmZvJiwgaW50IHR4LCBpbnQg
dHkpOwotICAgIHZpcnR1YWwgdm9pZCBwYWludE9iamVjdChQYWludEluZm8mLCBpbnQgdHgsIGlu
dCB0eSk7Ci0KICAgICBpbnQgcmlnaHRSZWxPZmZzZXQoaW50IHksIGludCBmaXhlZE9mZnNldCwg
Ym9vbCBhcHBseVRleHRJbmRlbnQgPSB0cnVlLCBpbnQqIGhlaWdodFJlbWFpbmluZyA9IDApIGNv
bnN0OwogICAgIGludCBsZWZ0UmVsT2Zmc2V0KGludCB5LCBpbnQgZml4ZWRPZmZzZXQsIGJvb2wg
YXBwbHlUZXh0SW5kZW50ID0gdHJ1ZSwgaW50KiBoZWlnaHRSZW1haW5pbmcgPSAwKSBjb25zdDsK
IApAQCAtMTc2LDggKzE3Myw2IEBAIHByb3RlY3RlZDoKIAogICAgIHZpcnR1YWwgdm9pZCB1cGRh
dGVGaXJzdExldHRlcigpOwogCi0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZUhpdFRlc3RSZXN1bHQo
SGl0VGVzdFJlc3VsdCYsIGNvbnN0IEludFBvaW50Jik7Ci0KICAgICAvLyBEZWxheSB1cGRhdGUg
c2Nyb2xsYmFyIHVudGlsIGZpbmlzaERlbGF5UmVwYWludCgpIHdpbGwgYmUKICAgICAvLyBjYWxs
ZWQuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB3aGVuIGEgZmxleGJveCBpcyBsYXlpbmcgb3V0IGl0
cwogICAgIC8vIGRlc2NlbmRhbnQuIElmIG11bHRpcGxlIGNhbGxzIGFyZSBtYWRlIHRvIHN0YXJ0
RGVsYXlSZXBhaW50KCksCkBAIC0yNDEsNyArMjM2LDkgQEAgcHJpdmF0ZToKICAgICAgICAgYm9v
bCBldmVySGFkTGF5b3V0OwogICAgIH07CiAKLSAgICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9u
cycgaW1wbGVtZW50YXRpb25zIGFyZSBpbiBSZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwLgorICAg
IGNsYXNzIE1hcmdpbkluZm87CisKKyAgICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucycgaW1w
bGVtZW50YXRpb25zIGFyZSBpbiBSZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwLiAgICAKICAgICB2
b2lkIGJpZGlSZW9yZGVyTGluZShJbmxpbmVCaWRpUmVzb2x2ZXImLCBjb25zdCBJbmxpbmVJdGVy
YXRvciYgZW5kLCBib29sIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSk7CiAgICAgUm9vdElubGlu
ZUJveCogZGV0ZXJtaW5lU3RhcnRQb3NpdGlvbihib29sJiBmaXJzdExpbmUsIGJvb2wmIGZ1bGxM
YXlvdXQsIGJvb2wmIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSwKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIElubGluZUJpZGlSZXNvbHZlciYsIFZlY3RvcjxGbG9h
dFdpdGhSZWN0PiYgZmxvYXRzLCB1bnNpZ25lZCYgbnVtQ2xlYW5GbG9hdHMpOwpAQCAtMjU0LDcg
KzI1MSw3IEBAIHByaXZhdGU6CiAgICAgdm9pZCBza2lwVHJhaWxpbmdXaGl0ZXNwYWNlKElubGlu
ZUl0ZXJhdG9yJiwgYm9vbCBpc0xpbmVFbXB0eSwgYm9vbCBwcmV2aW91c0xpbmVCcm9rZUNsZWFu
bHkpOwogICAgIGludCBza2lwTGVhZGluZ1doaXRlc3BhY2UoSW5saW5lQmlkaVJlc29sdmVyJiwg
Ym9vbCBmaXJzdExpbmUsIGJvb2wgaXNMaW5lRW1wdHksIGJvb2wgcHJldmlvdXNMaW5lQnJva2VD
bGVhbmx5KTsKICAgICB2b2lkIGZpdEJlbG93RmxvYXRzKGludCB3aWR0aFRvRml0LCBib29sIGZp
cnN0TGluZSwgaW50JiBhdmFpbGFibGVXaWR0aCk7Ci0gICAgSW5saW5lSXRlcmF0b3IgZmluZE5l
eHRMaW5lQnJlYWsoSW5saW5lQmlkaVJlc29sdmVyJiwgYm9vbCBmaXJzdExpbmUsIGJvb2wmIGlz
TGluZUVtcHR5LCBib29sJiBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHksIEVDbGVhciogY2xlYXIg
PSAwKTsKKyAgICBJbmxpbmVJdGVyYXRvciBmaW5kTmV4dExpbmVCcmVhayhJbmxpbmVCaWRpUmVz
b2x2ZXImLCBib29sIGZpcnN0TGluZSwgYm9vbCYgaXNMaW5lRW1wdHksIGJvb2wmIHByZXZpb3Vz
TGluZUJyb2tlQ2xlYW5seSwgTWFyZ2luSW5mbyYsIEVDbGVhciogY2xlYXIgPSAwKTsKICAgICBS
b290SW5saW5lQm94KiBjb25zdHJ1Y3RMaW5lKHVuc2lnbmVkIHJ1bkNvdW50LCBCaWRpUnVuKiBm
aXJzdFJ1biwgQmlkaVJ1biogbGFzdFJ1biwgYm9vbCBmaXJzdExpbmUsIGJvb2wgbGFzdExpbmUs
IFJlbmRlck9iamVjdCogZW5kT2JqZWN0KTsKICAgICBJbmxpbmVGbG93Qm94KiBjcmVhdGVMaW5l
Qm94ZXMoUmVuZGVyT2JqZWN0KiwgYm9vbCBmaXJzdExpbmUpOwogICAgIHZvaWQgY29tcHV0ZUhv
cml6b250YWxQb3NpdGlvbnNGb3JMaW5lKFJvb3RJbmxpbmVCb3gqLCBib29sIGZpcnN0TGluZSwg
QmlkaVJ1biogZmlyc3RSdW4sIEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4sIGJvb2wgcmVhY2hl
ZEVuZCk7CkBAIC0zMDksMTMgKzMwNiw3IEBAIHByaXZhdGU6CiAgICAgLy8gT2J0YWlucyB0aGUg
bmVhcmVzdCBlbmNsb3NpbmcgYmxvY2sgKGluY2x1ZGluZyB0aGlzIGJsb2NrKSB0aGF0IGNvbnRy
aWJ1dGVzIGEgZmlyc3QtbGluZSBzdHlsZSB0byBvdXIgaW5saW5lCiAgICAgLy8gY2hpbGRyZW4u
CiAgICAgdmlydHVhbCBSZW5kZXJCbG9jayogZmlyc3RMaW5lQmxvY2soKSBjb25zdDsKLSAgICBi
b29sIGluUm9vdEJsb2NrQ29udGV4dCgpIGNvbnN0OwotCi0gICAgdmlydHVhbCBJbnRSZWN0IHJl
Y3RXaXRoT3V0bGluZUZvclJlcGFpbnQoUmVuZGVyQm94TW9kZWxPYmplY3QqIHJlcGFpbnRDb250
YWluZXIsIGludCBvdXRsaW5lV2lkdGgpOwotICAgIHZpcnR1YWwgUmVuZGVyU3R5bGUqIG91dGxp
bmVTdHlsZUZvclJlcGFpbnQoKSBjb25zdDsKICAgICAKLSAgICB2aXJ0dWFsIFJlbmRlck9iamVj
dCogaG92ZXJBbmNlc3RvcigpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVEcmFnU3Rh
dGUoYm9vbCBkcmFnT24pOwogICAgIHZpcnR1YWwgdm9pZCBjaGlsZEJlY2FtZU5vbklubGluZShS
ZW5kZXJPYmplY3QqIGNoaWxkKTsKIAogICAgIHZpcnR1YWwgSW50UmVjdCBzZWxlY3Rpb25SZWN0
Rm9yUmVwYWludChSZW5kZXJCb3hNb2RlbE9iamVjdCogcmVwYWludENvbnRhaW5lciwgYm9vbCAv
KmNsaXBUb1Zpc2libGVDb250ZW50Ki8pCkBAIC0zMzUsMTYgKzMyNiwxMSBAQCBwcml2YXRlOgog
ICAgIGludCBsZWZ0U2VsZWN0aW9uT2Zmc2V0KFJlbmRlckJsb2NrKiByb290QmxvY2ssIGludCB5
KTsKICAgICBpbnQgcmlnaHRTZWxlY3Rpb25PZmZzZXQoUmVuZGVyQmxvY2sqIHJvb3RCbG9jaywg
aW50IHkpOwogCi0gICAgdmlydHVhbCB2b2lkIGFic29sdXRlUmVjdHMoVmVjdG9yPEludFJlY3Q+
JiwgaW50IHR4LCBpbnQgdHkpOwotICAgIHZpcnR1YWwgdm9pZCBhYnNvbHV0ZVF1YWRzKFZlY3Rv
cjxGbG9hdFF1YWQ+Jik7Ci0KICAgICBpbnQgZGVzaXJlZENvbHVtbldpZHRoKCkgY29uc3Q7CiAg
ICAgdW5zaWduZWQgZGVzaXJlZENvbHVtbkNvdW50KCkgY29uc3Q7CiAgICAgVmVjdG9yPEludFJl
Y3Q+KiBjb2x1bW5SZWN0cygpIGNvbnN0OwogICAgIHZvaWQgc2V0RGVzaXJlZENvbHVtbkNvdW50
QW5kV2lkdGgoaW50IGNvdW50LCBpbnQgd2lkdGgpOwogICAgIGludCBjb2x1bW5HYXAoKSBjb25z
dDsKLSAgICAKLSAgICB2b2lkIHBhaW50Q29udGludWF0aW9uT3V0bGluZXMoUGFpbnRJbmZvJiwg
aW50IHR4LCBpbnQgdHkpOwogCiAgICAgdmlydHVhbCBJbnRSZWN0IGxvY2FsQ2FyZXRSZWN0KElu
bGluZUJveCosIGludCBjYXJldE9mZnNldCwgaW50KiBleHRyYVdpZHRoVG9FbmRPZkxpbmUgPSAw
KTsKIApAQCAtNDgwLDEyICs0NjYsNiBAQCBwcml2YXRlOgogICAgIERlcHJlY2F0ZWRQdHJMaXN0
PEZsb2F0aW5nT2JqZWN0PiogbV9mbG9hdGluZ09iamVjdHM7CiAgICAgTGlzdEhhc2hTZXQ8UmVu
ZGVyQm94Kj4qIG1fcG9zaXRpb25lZE9iamVjdHM7CiAKLSAgICAvLyBBbiBpbmxpbmUgY2FuIGJl
IHNwbGl0IHdpdGggYmxvY2tzIG9jY3VycmluZyBpbiBiZXR3ZWVuIHRoZSBpbmxpbmUgY29udGVu
dC4KLSAgICAvLyBXaGVuIHRoaXMgb2NjdXJzIHdlIG5lZWQgYSBwb2ludGVyIHRvIG91ciBuZXh0
IG9iamVjdC4gIFdlIGNhbiBiYXNpY2FsbHkgYmUKLSAgICAvLyBzcGxpdCBpbnRvIGEgc2VxdWVu
Y2Ugb2YgaW5saW5lcyBhbmQgYmxvY2tzLiAgVGhlIGNvbnRpbnVhdGlvbiB3aWxsIGVpdGhlciBi
ZQotICAgIC8vIGFuIGFub255bW91cyBibG9jayAodGhhdCBob3VzZXMgb3RoZXIgYmxvY2tzKSBv
ciBpdCB3aWxsIGJlIGFuIGlubGluZSBmbG93LgotICAgIFJlbmRlcklubGluZSogbV9pbmxpbmVD
b250aW51YXRpb247Ci0KICAgICAvLyBBbGxvY2F0ZWQgb25seSB3aGVuIHNvbWUgb2YgdGhlc2Ug
ZmllbGRzIGhhdmUgbm9uLWRlZmF1bHQgdmFsdWVzCiAgICAgc3RydWN0IE1heE1hcmdpbiB7CiAg
ICAgICAgIE1heE1hcmdpbihjb25zdCBSZW5kZXJCbG9jayogbykgCkluZGV4OiBXZWJDb3JlL3Jl
bmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUv
cmVuZGVyaW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5jcHAJKHJldmlzaW9uIDQ3NTkxKQorKysg
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcAkod29ya2luZyBjb3B5
KQpAQCAtNTcwLDEyICs1NzAsMTYgQEAgUm9vdElubGluZUJveCogUmVuZGVyQmxvY2s6OmNvbnN0
cnVjdExpbgogICAgICAgICBpZiAoIWJveCkKICAgICAgICAgICAgIGNvbnRpbnVlOwogCisgICAg
ICAgIC8vIEFub255bW91cyBpbmxpbmUgYmxvY2tzICh1c2VkIHRvIGhvbGQgYmxvY2tzIGluc2lk
ZSBpbmxpbmVzKSBkb24ndCBuZWVkIHRvIHdhc3RlIHRpbWUgd3JhcHBpbmcKKyAgICAgICAgLy8g
dGhlbXNlbHZlcyBpbiB0aG9zZSBpbmxpbmVzIChzaW5jZSB3ZSB3YW50IHRvIHByZXRlbmQgbGlr
ZSB0aGV5IGRvbid0IGV4aXN0IG9uIHRoaXMgZmFrZSBsaW5lKS4KKyAgICAgICAgUmVuZGVyT2Jq
ZWN0KiBhbmNlc3RvclJlbmRlcmVyID0gci0+bV9vYmplY3QtPmlzQW5vbnltb3VzSW5saW5lQmxv
Y2soKSA/IHRoaXMgOiByLT5tX29iamVjdC0+cGFyZW50KCk7CisgCiAgICAgICAgIC8vIElmIHdl
IGhhdmUgbm8gcGFyZW50IGJveCB5ZXQsIG9yIGlmIHRoZSBydW4gaXMgbm90IHNpbXBseSBhIHNp
YmxpbmcsCiAgICAgICAgIC8vIHRoZW4gd2UgbmVlZCB0byBjb25zdHJ1Y3QgaW5saW5lIGJveGVz
IGFzIG5lY2Vzc2FyeSB0byBwcm9wZXJseSBlbmNsb3NlIHRoZQogICAgICAgICAvLyBydW4ncyBp
bmxpbmUgYm94LgotICAgICAgICBpZiAoIXBhcmVudEJveCB8fCBwYXJlbnRCb3gtPnJlbmRlcmVy
KCkgIT0gci0+bV9vYmplY3QtPnBhcmVudCgpKQorICAgICAgICBpZiAoIXBhcmVudEJveCB8fCBw
YXJlbnRCb3gtPnJlbmRlcmVyKCkgIT0gYW5jZXN0b3JSZW5kZXJlcikKICAgICAgICAgICAgIC8v
IENyZWF0ZSBuZXcgaW5saW5lIGJveGVzIGFsbCB0aGUgd2F5IGJhY2sgdG8gdGhlIGFwcHJvcHJp
YXRlIGluc2VydGlvbiBwb2ludC4KLSAgICAgICAgICAgIHBhcmVudEJveCA9IGNyZWF0ZUxpbmVC
b3hlcyhyLT5tX29iamVjdC0+cGFyZW50KCksIGZpcnN0TGluZSk7CisgICAgICAgICAgICBwYXJl
bnRCb3ggPSBjcmVhdGVMaW5lQm94ZXMoYW5jZXN0b3JSZW5kZXJlciwgZmlyc3RMaW5lKTsKIAog
ICAgICAgICAvLyBBcHBlbmQgdGhlIGlubGluZSBib3ggdG8gdGhpcyBsaW5lLgogICAgICAgICBw
YXJlbnRCb3gtPmFkZFRvTGluZShib3gpOwpAQCAtNjE3LDYgKzYyMSw4IEBAIHZvaWQgUmVuZGVy
QmxvY2s6OmNvbXB1dGVIb3Jpem9udGFsUG9zaXQKICAgICB1bnNpZ25lZCBudW1TcGFjZXMgPSAw
OwogICAgIEVUZXh0QWxpZ24gdGV4dEFsaWduID0gc3R5bGUoKS0+dGV4dEFsaWduKCk7CiAKKyAg
ICBpbnQgeCA9IGxlZnRPZmZzZXQoaGVpZ2h0KCksIGZpcnN0TGluZSk7CisKICAgICBmb3IgKEJp
ZGlSdW4qIHIgPSBmaXJzdFJ1bjsgcjsgciA9IHItPm5leHQoKSkgewogICAgICAgICBpZiAoIXIt
Pm1fYm94IHx8IHItPm1fb2JqZWN0LT5pc1Bvc2l0aW9uZWQoKSB8fCByLT5tX2JveC0+aXNMaW5l
QnJlYWsoKSkKICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBQb3NpdGlvbmVkIG9iamVjdHMgYXJl
IG9ubHkgcGFydGljaXBhdGluZyB0byBmaWd1cmUgb3V0IHRoZWlyCkBAIC02NTQsNiArNjYwLDEy
IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmNvbXB1dGVIb3Jpem9udGFsUG9zaXQKICAgICAgICAgICAg
IHJlbmRlckJveC0+Y2FsY1dpZHRoKCk7CiAgICAgICAgICAgICByLT5tX2JveC0+c2V0V2lkdGgo
cmVuZGVyQm94LT53aWR0aCgpKTsKICAgICAgICAgICAgIHRvdFdpZHRoICs9IHJlbmRlckJveC0+
bWFyZ2luTGVmdCgpICsgcmVuZGVyQm94LT5tYXJnaW5SaWdodCgpOworICAgICAgICAgICAgCisg
ICAgICAgICAgICBpZiAoci0+bV9vYmplY3QtPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkgewor
ICAgICAgICAgICAgICAgIC8vIEFsbG93IHRoZSBmdWxsIGF2YWlsYWJsZSB3aWR0aCB0byBiZSB1
c2VkLCBzaW5jZSBmbG9hdHMgd2lsbCBpbnRydWRlIGludG8gb3VyIHNwYWNlLgorICAgICAgICAg
ICAgICAgIGF2YWlsYWJsZVdpZHRoID0gcmlnaHRPZmZzZXQoKSAtIGxlZnRPZmZzZXQoKTsKKyAg
ICAgICAgICAgICAgICB4ID0gbGVmdE9mZnNldCgpOworICAgICAgICAgICAgfQogICAgICAgICB9
CiAKICAgICAgICAgdG90V2lkdGggKz0gci0+bV9ib3gtPndpZHRoKCk7CkBAIC02NjMsNyArNjc1
LDYgQEAgdm9pZCBSZW5kZXJCbG9jazo6Y29tcHV0ZUhvcml6b250YWxQb3NpdAogICAgIC8vIHdl
IG5vdyBleGFtaW5lIG91ciB0ZXh0LWFsaWduIHByb3BlcnR5IGluIG9yZGVyIHRvIGRldGVybWlu
ZSB3aGVyZSB0byBwb3NpdGlvbiB0aGUKICAgICAvLyBvYmplY3RzIGhvcml6b250YWxseS4gIFRo
ZSB0b3RhbCB3aWR0aCBvZiB0aGUgbGluZSBjYW4gYmUgaW5jcmVhc2VkIGlmIHdlIGVuZCB1cAog
ICAgIC8vIGp1c3RpZnlpbmcgdGV4dC4KLSAgICBpbnQgeCA9IGxlZnRPZmZzZXQoaGVpZ2h0KCks
IGZpcnN0TGluZSk7CiAgICAgc3dpdGNoICh0ZXh0QWxpZ24pIHsKICAgICAgICAgY2FzZSBMRUZU
OgogICAgICAgICBjYXNlIFdFQktJVF9MRUZUOgpAQCAtODE3LDkgKzgyOCwxNSBAQCB2b2lkIFJl
bmRlckJsb2NrOjpsYXlvdXRJbmxpbmVDaGlsZHJlbihiCiAgICAgYm9vbCB1c2VSZXBhaW50Qm91
bmRzID0gZmFsc2U7CiAgICAgCiAgICAgbV9vdmVyZmxvdy5jbGVhcigpOwotICAgICAgICAKLSAg
ICBzZXRIZWlnaHQoYm9yZGVyVG9wKCkgKyBwYWRkaW5nVG9wKCkpOwotICAgIGludCB0b0FkZCA9
IGJvcmRlckJvdHRvbSgpICsgcGFkZGluZ0JvdHRvbSgpICsgaG9yaXpvbnRhbFNjcm9sbGJhckhl
aWdodCgpOworICAgIAorICAgIGludCB0b3AgPSBib3JkZXJUb3AoKSArIHBhZGRpbmdUb3AoKTsK
KyAgICBpbnQgYm90dG9tID0gYm9yZGVyQm90dG9tKCkgKyBwYWRkaW5nQm90dG9tKCkgKyBob3Jp
em9udGFsU2Nyb2xsYmFySGVpZ2h0KCk7CisKKyAgICBzZXRIZWlnaHQodG9wKTsKKworICAgIC8v
IFRoZSBtYXJnaW4gc3RydWN0IGNhY2hlcyBhbGwgb3VyIGN1cnJlbnQgbWFyZ2luIGNvbGxhcHNp
bmcgc3RhdGUuIFdlIHJ1biBtYXJnaW4gY29sbGFwc2luZyB3aGVuIHdlIGVuY291bnRlciBhbm9u
eW1vdXMgaW5saW5lIGJsb2NrcyB0aGF0IGFyZSBiZWluZyB1c2VkCisgICAgLy8gZm9yIHRoZSBi
bG9ja3MtaW5zaWRlLWlubGluZXMgY2FzZSAoYW5kIHRoZSBpbmxpbmVzIGFyZSBlbXB0eSksIGUu
ZywgPHNwYW4+PGRpdj5PbmU8L2Rpdj48L3NwYW4+LgorICAgIE1hcmdpbkluZm8gbWFyZ2luSW5m
byh0aGlzLCB0b3AsIGJvdHRvbSk7CiAKICAgICAvLyBGaWd1cmUgb3V0IGlmIHdlIHNob3VsZCBj
bGVhciBvdXQgb3VyIGxpbmUgYm94ZXMuCiAgICAgLy8gRklYTUU6IEhhbmRsZSByZXNpemUgZXZl
bnR1YWxseSEKQEAgLTg0NywxMiArODY0LDE1IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmxheW91dElu
bGluZUNoaWxkcmVuKGIKICAgICAgICAgICAgIGlmIChvLT5pc1JlcGxhY2VkKCkgfHwgby0+aXNG
bG9hdGluZygpIHx8IG8tPmlzUG9zaXRpb25lZCgpKSB7CiAgICAgICAgICAgICAgICAgUmVuZGVy
Qm94KiBib3ggPSB0b1JlbmRlckJveChvKTsKICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAg
ICAgICBpZiAocmVsYXlvdXRDaGlsZHJlbiB8fCBvLT5zdHlsZSgpLT53aWR0aCgpLmlzUGVyY2Vu
dCgpIHx8IG8tPnN0eWxlKCktPmhlaWdodCgpLmlzUGVyY2VudCgpKQotICAgICAgICAgICAgICAg
ICAgICBvLT5zZXRDaGlsZE5lZWRzTGF5b3V0KHRydWUsIGZhbHNlKTsKLSAgICAgICAgICAgICAg
ICAgICAgCisgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGxheW91dCBjaGlsZHJlbiBp
ZiB0aGV5IG5lZWQgaXQuCisgICAgICAgICAgICAgICAgLy8gRklYTUU6IFRlY2huaWNhbGx5IHBl
cmNlbnRhZ2UgaGVpZ2h0IG9iamVjdHMgb25seSBuZWVkIGEgcmVsYXlvdXQgaWYgdGhlaXIgcGVy
Y2VudGFnZSBpc24ndCBnb2luZyB0byBiZSB0dXJuZWQgaW50bworICAgICAgICAgICAgICAgIC8v
IGFuIGF1dG8gdmFsdWUuICBBZGQgYSBtZXRob2QgdG8gZGV0ZXJtaW5lIHRoaXMsIHNvIHRoYXQg
d2UgY2FuIGF2b2lkIHRoZSByZWxheW91dC4KKyAgICAgICAgICAgICAgICBpZiAocmVsYXlvdXRD
aGlsZHJlbiB8fCAoKGJveC0+c3R5bGUoKS0+aGVpZ2h0KCkuaXNQZXJjZW50KCkgfHwgYm94LT5z
dHlsZSgpLT5taW5IZWlnaHQoKS5pc1BlcmNlbnQoKSB8fCBib3gtPnN0eWxlKCktPm1heEhlaWdo
dCgpLmlzUGVyY2VudCgpKSkpCisgICAgICAgICAgICAgICAgICAgIGJveC0+c2V0Q2hpbGROZWVk
c0xheW91dCh0cnVlLCBmYWxzZSk7CisKICAgICAgICAgICAgICAgICAvLyBJZiByZWxheW91dENo
aWxkcmVuIGlzIHNldCBhbmQgd2UgaGF2ZSBwZXJjZW50YWdlIHBhZGRpbmcsIHdlIGFsc28gbmVl
ZCB0byBpbnZhbGlkYXRlIHRoZSBjaGlsZCdzIHByZWYgd2lkdGhzLgotICAgICAgICAgICAgICAg
IGlmIChyZWxheW91dENoaWxkcmVuICYmIChvLT5zdHlsZSgpLT5wYWRkaW5nTGVmdCgpLmlzUGVy
Y2VudCgpIHx8IG8tPnN0eWxlKCktPnBhZGRpbmdSaWdodCgpLmlzUGVyY2VudCgpKSkKLSAgICAg
ICAgICAgICAgICAgICAgby0+c2V0UHJlZldpZHRoc0RpcnR5KHRydWUsIGZhbHNlKTsKKyAgICAg
ICAgICAgICAgICBpZiAocmVsYXlvdXRDaGlsZHJlbiAmJiAoYm94LT5zdHlsZSgpLT5wYWRkaW5n
TGVmdCgpLmlzUGVyY2VudCgpIHx8IGJveC0+c3R5bGUoKS0+cGFkZGluZ1JpZ2h0KCkuaXNQZXJj
ZW50KCkpKQorICAgICAgICAgICAgICAgICAgICBib3gtPnNldFByZWZXaWR0aHNEaXJ0eSh0cnVl
LCBmYWxzZSk7CiAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICBpZiAoby0+aXNQb3NpdGlv
bmVkKCkpCiAgICAgICAgICAgICAgICAgICAgIG8tPmNvbnRhaW5pbmdCbG9jaygpLT5pbnNlcnRQ
b3NpdGlvbmVkT2JqZWN0KGJveCk7CkBAIC04NjIsNyArODgyLDggQEAgdm9pZCBSZW5kZXJCbG9j
azo6bGF5b3V0SW5saW5lQ2hpbGRyZW4oYgogICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChm
dWxsTGF5b3V0IHx8IG8tPm5lZWRzTGF5b3V0KCkpIC8vIFJlcGxhY2VkIGVsZW1lbnRzCiAgICAg
ICAgICAgICAgICAgICAgICAgICB0b1JlbmRlckJveChvKS0+ZGlydHlMaW5lQm94ZXMoZnVsbExh
eW91dCk7CiAKLSAgICAgICAgICAgICAgICAgICAgby0+bGF5b3V0SWZOZWVkZWQoKTsKKyAgICAg
ICAgICAgICAgICAgICAgaWYgKCFvLT5pc1JlcGxhY2VkKCkgfHwgIW8tPmlzQW5vbnltb3VzSW5s
aW5lQmxvY2soKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG8tPmxheW91dElmTmVlZGVkKCk7
CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmIChvLT5pc1RleHQoKSB8
fCAoby0+aXNSZW5kZXJJbmxpbmUoKSAmJiAhZW5kT2ZJbmxpbmUpKSB7CiAgICAgICAgICAgICAg
ICAgaWYgKGZ1bGxMYXlvdXQgfHwgby0+c2VsZk5lZWRzTGF5b3V0KCkpCkBAIC05NTYsNyArOTc3
LDcgQEAgdm9pZCBSZW5kZXJCbG9jazo6bGF5b3V0SW5saW5lQ2hpbGRyZW4oYgogICAgICAgICAg
ICAgaXNMaW5lRW1wdHkgPSB0cnVlOwogICAgICAgICAgICAgCiAgICAgICAgICAgICBFQ2xlYXIg
Y2xlYXIgPSBDTk9ORTsKLSAgICAgICAgICAgIGVuZCA9IGZpbmROZXh0TGluZUJyZWFrKHJlc29s
dmVyLCBmaXJzdExpbmUsIGlzTGluZUVtcHR5LCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHksICZj
bGVhcik7CisgICAgICAgICAgICBlbmQgPSBmaW5kTmV4dExpbmVCcmVhayhyZXNvbHZlciwgZmly
c3RMaW5lLCBpc0xpbmVFbXB0eSwgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5LCBtYXJnaW5JbmZv
LCAmY2xlYXIpOwogICAgICAgICAgICAgaWYgKHJlc29sdmVyLnBvc2l0aW9uKCkuYXRFbmQoKSkg
ewogICAgICAgICAgICAgICAgIHJlc29sdmVyLmRlbGV0ZVJ1bnMoKTsKICAgICAgICAgICAgICAg
ICBjaGVja0ZvckZsb2F0c0Zyb21MYXN0TGluZSA9IHRydWU7CkBAIC0xMDI2LDYgKzEwNDcsMTQg
QEAgdm9pZCBSZW5kZXJCbG9jazo6bGF5b3V0SW5saW5lQ2hpbGRyZW4oYgogICAgICAgICAgICAg
ICAgICAgICBpZiAobGluZUJveCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbGluZUJveC0+
c2V0RW5kc1dpdGhCcmVhayhwcmV2aW91c0xpbmVCcm9rZUNsZWFubHkpOwogCisgICAgICAgICAg
ICAgICAgICAgICAgICAvLyBJZiBvdXIgcHJldmlvdXMgbGluZSB3YXMgYW4gYW5vbnltb3VzIGJs
b2NrIGFuZCB3ZSBhcmUgbm90IGFuIGFub255bW91cyBibG9jaywgc2ltdWxhdGUgYSBtYXJnaW4g
Y29sbGFwc2Ugbm93IHNvIHRoYXQgd2UgZ2V0IHRoZSBwcm9wZXIKKyAgICAgICAgICAgICAgICAg
ICAgICAgIC8vIGluY3JlYXNlZCBoZWlnaHQuICBXZSBhbHNvIGhhdmUgdG8gc2ltdWxhdGUgYSBt
YXJnaW4gY29sbGFwc2UgdG8gcHJvcGFnYXRlIG1hcmdpbnMgdGhyb3VnaCB0byB0aGUgdG9wIG9m
IG91ciBibG9jay4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbGluZUJveC0+YW5vbnlt
b3VzSW5saW5lQmxvY2soKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbGlu
ZUJveC0+cHJldlJvb3RCb3goKSB8fCBsaW5lQm94LT5wcmV2Um9vdEJveCgpLT5hbm9ueW1vdXNJ
bmxpbmVCbG9jaygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZU1h
cmdpbnMoMCwgbWFyZ2luSW5mbyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2lu
SW5mby5zZXRBdFRvcE9mQmxvY2soZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgfQor
CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3cgd2UgcG9zaXRpb24gYWxsIG9mIG91ciB0
ZXh0IHJ1bnMgaG9yaXpvbnRhbGx5LgogICAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZUhv
cml6b250YWxQb3NpdGlvbnNGb3JMaW5lKGxpbmVCb3gsIGZpcnN0TGluZSwgcmVzb2x2ZXIuZmly
c3RSdW4oKSwgdHJhaWxpbmdTcGFjZVJ1biwgZW5kLmF0RW5kKCkpOwogCkBAIC0xMTQ3LDggKzEx
NzYsOSBAQCB2b2lkIFJlbmRlckJsb2NrOjpsYXlvdXRJbmxpbmVDaGlsZHJlbihiCiAgICAgICAg
IH0KICAgICB9CiAKLSAgICAvLyBOb3cgYWRkIGluIHRoZSBib3R0b20gYm9yZGVyL3BhZGRpbmcu
Ci0gICAgc2V0SGVpZ2h0KGhlaWdodCgpICsgdG9BZGQpOworICAgIC8vIE5vdyBkbyB0aGUgaGFu
ZGxpbmcgb2YgdGhlIGJvdHRvbSBvZiB0aGUgYmxvY2ssIGFkZGluZyBpbiBvdXIgYm90dG9tIGJv
cmRlci9wYWRkaW5nIGFuZAorICAgIC8vIGRldGVybWluaW5nIHRoZSBjb3JyZWN0IGNvbGxhcHNl
ZCBib3R0b20gbWFyZ2luIGluZm9ybWF0aW9uLgorICAgIGhhbmRsZUJvdHRvbU9mQmxvY2sodG9w
LCBib3R0b20sIG1hcmdpbkluZm8pOwogCiAgICAgaWYgKCFmaXJzdExpbmVCb3goKSAmJiBoYXNM
aW5lSWZFbXB0eSgpKQogICAgICAgICBzZXRIZWlnaHQoaGVpZ2h0KCkgKyBsaW5lSGVpZ2h0KHRy
dWUsIHRydWUpKTsKQEAgLTExNjksNiArMTE5OSwxMiBAQCBSb290SW5saW5lQm94KiBSZW5kZXJC
bG9jazo6ZGV0ZXJtaW5lU3RhCiAgICAgaWYgKCFmdWxsTGF5b3V0KSB7CiAgICAgICAgIHNpemVf
dCBmbG9hdEluZGV4ID0gMDsKICAgICAgICAgZm9yIChjdXJyID0gZmlyc3RSb290Qm94KCk7IGN1
cnIgJiYgIWN1cnItPmlzRGlydHkoKTsgY3VyciA9IGN1cnItPm5leHRSb290Qm94KCkpIHsKKyAg
ICAgICAgICAgIGlmIChjdXJyLT5hbm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CisgICAgICAgICAg
ICAgICAgLy8gRklYTUU6IFdlIGhhdmUgdG8gZG8gYmV0dGVyIHRoYW4gdGhpcyBvciB3ZSB3aWxs
IHJlcGFpbnQgdG9vIG11Y2ggYXMgY29udGVudCBpbnNpZGUgYW4KKyAgICAgICAgICAgICAgICAv
LyBhbm9ueW1vdXMgaW5saW5lIGJsb2NrIGNvbWVzIGluLgorICAgICAgICAgICAgICAgIGZ1bGxM
YXlvdXQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogICAg
ICAgICAgICAgaWYgKFZlY3RvcjxSZW5kZXJCb3gqPiogY2xlYW5MaW5lRmxvYXRzID0gY3Vyci0+
ZmxvYXRzUHRyKCkpIHsKICAgICAgICAgICAgICAgICBWZWN0b3I8UmVuZGVyQm94Kj46Oml0ZXJh
dG9yIGVuZCA9IGNsZWFuTGluZUZsb2F0cy0+ZW5kKCk7CiAgICAgICAgICAgICAgICAgZm9yIChW
ZWN0b3I8UmVuZGVyQm94Kj46Oml0ZXJhdG9yIG8gPSBjbGVhbkxpbmVGbG9hdHMtPmJlZ2luKCk7
IG8gIT0gZW5kOyArK28pIHsKQEAgLTE1ODMsNyArMTYxOSw3IEBAIHN0YXRpYyBpbmxpbmUgdW5z
aWduZWQgdGV4dFdpZHRoKFJlbmRlclQKIH0KIAogSW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6
OmZpbmROZXh0TGluZUJyZWFrKElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIsIGJvb2wgZmly
c3RMaW5lLCAgYm9vbCYgaXNMaW5lRW1wdHksIGJvb2wmIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5s
eSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUNsZWFy
KiBjbGVhcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBN
YXJnaW5JbmZvJiBtYXJnaW5JbmZvLCBFQ2xlYXIqIGNsZWFyKQogewogICAgIEFTU0VSVChyZXNv
bHZlci5wb3NpdGlvbigpLmJsb2NrID09IHRoaXMpOwogCkBAIC0xNjI0LDYgKzE2NjAsMTEgQEAg
SW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6OmZpbmROZXh0TGluZQogICAgIGJvb2wgYXV0b1dy
YXBXYXNFdmVyVHJ1ZU9uTGluZSA9IGZhbHNlOwogICAgIGJvb2wgZmxvYXRzRml0T25MaW5lID0g
dHJ1ZTsKICAgICAKKyAgICBib29sIGlzQmxvY2tJbnNpZGVJbmxpbmUgPSBmYWxzZTsKKyAgICAK
KyAgICBpbnQgcHJldmlvdXNCbG9ja0Zsb2F0Qm90dG9tID0gMDsKKyAgICBpbnQgbWF4QmxvY2tG
bG9hdEJvdHRvbSA9IDA7CisKICAgICAvLyBGaXJlZm94IGFuZCBPcGVyYSB3aWxsIGFsbG93IGEg
dGFibGUgY2VsbCB0byBncm93IHRvIGZpdCBhbiBpbWFnZSBpbnNpZGUgaXQgdW5kZXIKICAgICAv
LyB2ZXJ5IHNwZWNpZmljIGNpcmN1bXN0YW5jZXMgKGluIG9yZGVyIHRvIG1hdGNoIGNvbW1vbiBX
aW5JRSByZW5kZXJpbmdzKS4gCiAgICAgLy8gTm90IHN1cHBvcnRpbmcgdGhlIHF1aXJrIGhhcyBj
YXVzZWQgdXMgdG8gbWlzLXJlbmRlciBzb21lIHJlYWwgc2l0ZXMuIChTZWUgQnVnemlsbGEgMTA1
MTcuKSAKQEAgLTE2MzQsNyArMTY3NSw4IEBAIElubGluZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpm
aW5kTmV4dExpbmUKICAgICB3aGlsZSAobykgewogICAgICAgICBjdXJyV1MgPSBvLT5pc1JlcGxh
Y2VkKCkgPyBvLT5wYXJlbnQoKS0+c3R5bGUoKS0+d2hpdGVTcGFjZSgpIDogby0+c3R5bGUoKS0+
d2hpdGVTcGFjZSgpOwogICAgICAgICBsYXN0V1MgPSBsYXN0LT5pc1JlcGxhY2VkKCkgPyBsYXN0
LT5wYXJlbnQoKS0+c3R5bGUoKS0+d2hpdGVTcGFjZSgpIDogbGFzdC0+c3R5bGUoKS0+d2hpdGVT
cGFjZSgpOwotICAgICAgICAKKyAgICAgICAgaXNCbG9ja0luc2lkZUlubGluZSA9IG8tPmlzQW5v
bnltb3VzSW5saW5lQmxvY2soKTsKKwogICAgICAgICBib29sIGF1dG9XcmFwID0gUmVuZGVyU3R5
bGU6OmF1dG9XcmFwKGN1cnJXUyk7CiAgICAgICAgIGF1dG9XcmFwV2FzRXZlclRydWVPbkxpbmUg
PSBhdXRvV3JhcFdhc0V2ZXJUcnVlT25MaW5lIHx8IGF1dG9XcmFwOwogCkBAIC0xNjQ1LDcgKzE2
ODcsNyBAQCBJbmxpbmVJdGVyYXRvciBSZW5kZXJCbG9jazo6ZmluZE5leHRMaW5lCiAjZW5kaWYK
IAogICAgICAgICBib29sIGNvbGxhcHNlV2hpdGVTcGFjZSA9IFJlbmRlclN0eWxlOjpjb2xsYXBz
ZVdoaXRlU3BhY2UoY3VycldTKTsKLSAgICAgICAgICAgIAorCiAgICAgICAgIGlmIChvLT5pc0JS
KCkpIHsKICAgICAgICAgICAgIGlmICh3ICsgdG1wVyA8PSB3aWR0aCkgewogICAgICAgICAgICAg
ICAgIGxCcmVhay5vYmogPSBvOwpAQCAtMTc1Miw4ICsxNzk0LDkgQEAgSW5saW5lSXRlcmF0b3Ig
UmVuZGVyQmxvY2s6OmZpbmROZXh0TGluZQogICAgICAgICB9IGVsc2UgaWYgKG8tPmlzUmVwbGFj
ZWQoKSkgewogICAgICAgICAgICAgUmVuZGVyQm94KiByZXBsYWNlZEJveCA9IHRvUmVuZGVyQm94
KG8pOwogCi0gICAgICAgICAgICAvLyBCcmVhayBvbiByZXBsYWNlZCBlbGVtZW50cyBpZiBlaXRo
ZXIgaGFzIG5vcm1hbCB3aGl0ZS1zcGFjZS4KLSAgICAgICAgICAgIGlmICgoYXV0b1dyYXAgfHwg
UmVuZGVyU3R5bGU6OmF1dG9XcmFwKGxhc3RXUykpICYmICghby0+aXNJbWFnZSgpIHx8IGFsbG93
SW1hZ2VzVG9CcmVhaykpIHsKKyAgICAgICAgICAgIC8vIEJyZWFrIG9uIHJlcGxhY2VkIGVsZW1l
bnRzIGlmIGVpdGhlciBoYXMgbm9ybWFsIHdoaXRlLXNwYWNlLiAgV2UgYWxzbyBhbHdheXMgYnJl
YWsgaWYgd2UKKyAgICAgICAgICAgIC8vIGVuY291bnRlciBhIHNwZWNpYWwgYW5vbnltb3VzIGlu
bGluZSBibG9jayAodXNlZCB0byBob2xkIGJsb2NrcyBpbnNpZGUgaW5saW5lcykuCisgICAgICAg
ICAgICBpZiAoKGF1dG9XcmFwIHx8IFJlbmRlclN0eWxlOjphdXRvV3JhcChsYXN0V1MpIHx8IGlz
QmxvY2tJbnNpZGVJbmxpbmUpICAmJiAoIW8tPmlzSW1hZ2UoKSB8fCBhbGxvd0ltYWdlc1RvQnJl
YWspKSB7CiAgICAgICAgICAgICAgICAgdyArPSB0bXBXOwogICAgICAgICAgICAgICAgIHRtcFcg
PSAwOwogICAgICAgICAgICAgICAgIGxCcmVhay5vYmogPSBvOwpAQCAtMTc2MSw2ICsxODA0LDE5
IEBAIElubGluZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpmaW5kTmV4dExpbmUKICAgICAgICAgICAg
ICAgICBsQnJlYWsubmV4dEJyZWFrYWJsZVBvc2l0aW9uID0gLTE7CiAgICAgICAgICAgICB9CiAK
KyAgICAgICAgICAgIGlmIChpc0Jsb2NrSW5zaWRlSW5saW5lKSB7CisgICAgICAgICAgICAgICAg
aWYgKCFpc0xpbmVFbXB0eSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBlbmQ7CisKKyAgICAg
ICAgICAgICAgICAvLyBSZXNldCB0aGUgd2lkdGggdG8gaWdub3JlIGZsb2F0cywgc2luY2Ugd2Un
cmUgZ29pbmcgdG8gYWxsb3cgdGhlbSB0byBpbnRydWRlIGludG8gb3VyIHNwYWNlLgorICAgICAg
ICAgICAgICAgIHdpZHRoID0gcmlnaHRPZmZzZXQoKSAtIGxlZnRPZmZzZXQoKTsKKworICAgICAg
ICAgICAgICAgIC8vIEZJWE1FOiBUaGlzIGNhbGwgd2lsbCB1cGRhdGUgdGhlIGhlaWdodCBvZiBv
dXIgYmxvY2suICBJdCdzIG5vdCBjbGVhciBpZiB0aGF0J3MgZ29pbmcgdG8gYmUgb2sgb3Igbm90
IHlldC4KKyAgICAgICAgICAgICAgICBsYXlvdXRCbG9ja0NoaWxkKHJlcGxhY2VkQm94LCBtYXJn
aW5JbmZvLCBwcmV2aW91c0Jsb2NrRmxvYXRCb3R0b20sIG1heEJsb2NrRmxvYXRCb3R0b20pOwor
CisgICAgICAgICAgICAgICAgbGluZU1pZHBvaW50U3RhdGUuYmV0d2Vlbk1pZHBvaW50cyA9IGZh
bHNlOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoaWdub3JpbmdTcGFjZXMpCiAg
ICAgICAgICAgICAgICAgYWRkTWlkcG9pbnQobGluZU1pZHBvaW50U3RhdGUsIElubGluZUl0ZXJh
dG9yKDAsIG8sIDApKTsKIApAQCAtMTc4Miw2ICsxODM4LDE1IEBAIElubGluZUl0ZXJhdG9yIFJl
bmRlckJsb2NrOjpmaW5kTmV4dExpbmUKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9
IGVsc2UKICAgICAgICAgICAgICAgICB0bXBXICs9IHJlcGxhY2VkQm94LT53aWR0aCgpICsgcmVw
bGFjZWRCb3gtPm1hcmdpbkxlZnQoKSArIHJlcGxhY2VkQm94LT5tYXJnaW5SaWdodCgpICsgaW5s
aW5lV2lkdGgobyk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoaXNCbG9ja0lu
c2lkZUlubGluZSkgeworICAgICAgICAgICAgICAgIHcgKz0gdG1wVzsKKyAgICAgICAgICAgICAg
ICB0bXBXID0gMDsKKyAgICAgICAgICAgICAgICBsQnJlYWsub2JqID0gbzsKKyAgICAgICAgICAg
ICAgICBsQnJlYWsucG9zID0gMDsKKyAgICAgICAgICAgICAgICBsQnJlYWsubmV4dEJyZWFrYWJs
ZVBvc2l0aW9uID0gLTE7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICB9
CiAgICAgICAgIH0gZWxzZSBpZiAoby0+aXNUZXh0KCkpIHsKICAgICAgICAgICAgIGlmICghcG9z
KQogICAgICAgICAgICAgICAgIGFwcGxpZWRTdGFydFdpZHRoID0gZmFsc2U7CkBAIC0yMTY3LDcg
KzIyMzIsNyBAQCBJbmxpbmVJdGVyYXRvciBSZW5kZXJCbG9jazo6ZmluZE5leHRMaW5lCiAgICAg
ICAgIH0KICAgICAgICAgLy9lbHNlIGlmIChsQnJlYWsucG9zID4gMCkKICAgICAgICAgLy8gICAg
bEJyZWFrLnBvcy0tOwotICAgICAgICBlbHNlIGlmIChsQnJlYWsub2JqID09IDAgJiYgdHJhaWxp
bmdTcGFjZU9iamVjdC0+aXNUZXh0KCkpIHsKKyAgICAgICAgZWxzZSBpZiAoKCFsQnJlYWsub2Jq
IHx8IGxCcmVhay5vYmotPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkgJiYgdHJhaWxpbmdTcGFj
ZU9iamVjdC0+aXNUZXh0KCkpIHsKICAgICAgICAgICAgIC8vIEFkZCBhIG5ldyBlbmQgbWlkcG9p
bnQgdGhhdCBzdG9wcyByaWdodCBhdCB0aGUgdmVyeSBlbmQuCiAgICAgICAgICAgICBSZW5kZXJU
ZXh0KiB0ZXh0ID0gdG9SZW5kZXJUZXh0KHRyYWlsaW5nU3BhY2VPYmplY3QpOwogICAgICAgICAg
ICAgdW5zaWduZWQgbGVuZ3RoID0gdGV4dC0+dGV4dExlbmd0aCgpOwpJbmRleDogV2ViQ29yZS9y
ZW5kZXJpbmcvUmVuZGVyQm94LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9S
ZW5kZXJCb3guY3BwCShyZXZpc2lvbiA0NzU5MSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRl
ckJveC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEyODQsNyArMTI4NCw3IEBAIHZvaWQgUmVuZGVy
Qm94OjpjYWxjV2lkdGgoKQogICAgIH0KIAogICAgIGlmIChjb250YWluZXJXaWR0aCAmJiBjb250
YWluZXJXaWR0aCAhPSAod2lkdGgoKSArIG1fbWFyZ2luTGVmdCArIG1fbWFyZ2luUmlnaHQpCi0g
ICAgICAgICAgICAmJiAhaXNGbG9hdGluZygpICYmICFpc0lubGluZSgpICYmICFjYi0+aXNGbGV4
aWJsZUJveCgpKSB7CisgICAgICAgICAgICAmJiAhaXNGbG9hdGluZygpICYmICghaXNJbmxpbmUo
KSB8fCBpc0Fub255bW91c0lubGluZUJsb2NrKCkpICYmICFjYi0+aXNGbGV4aWJsZUJveCgpKSB7
CiAgICAgICAgIGlmIChjYi0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkgPT0gTFRSKQogICAgICAgICAg
ICAgbV9tYXJnaW5SaWdodCA9IGNvbnRhaW5lcldpZHRoIC0gd2lkdGgoKSAtIG1fbWFyZ2luTGVm
dDsKICAgICAgICAgZWxzZQpAQCAtMTMyMyw3ICsxMzIzLDcgQEAgYm9vbCBSZW5kZXJCb3g6OnNp
emVzVG9JbnRyaW5zaWNXaWR0aChXaQogewogICAgIC8vIE1hcnF1ZWVzIGluIFdpbklFIGFyZSBs
aWtlIGEgbWl4dHVyZSBvZiBibG9ja3MgYW5kIGlubGluZS1ibG9ja3MuICBUaGV5IHNpemUgYXMg
dGhvdWdoIHRoZXkncmUgYmxvY2tzLAogICAgIC8vIGJ1dCB0aGV5IGFsbG93IHRleHQgdG8gc2l0
IG9uIHRoZSBzYW1lIGxpbmUgYXMgdGhlIG1hcnF1ZWUuCi0gICAgaWYgKGlzRmxvYXRpbmcoKSB8
fCAoaXNJbmxpbmVCbG9ja09ySW5saW5lVGFibGUoKSAmJiAhaXNIVE1MTWFycXVlZSgpKSkKKyAg
ICBpZiAoaXNGbG9hdGluZygpIHx8IChpc0lubGluZUJsb2NrT3JJbmxpbmVUYWJsZSgpICYmICFp
c0hUTUxNYXJxdWVlKCkgJiYgIWlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkpCiAgICAgICAgIHJl
dHVybiB0cnVlOwogCiAgICAgLy8gVGhpcyBjb2RlIG1heSBsb29rIGEgYml0IHN0cmFuZ2UuICBC
YXNpY2FsbHkgd2lkdGg6aW50cmluc2ljIHNob3VsZCBjbGFtcCB0aGUgc2l6ZSB3aGVuIHRlc3Rp
bmcgYm90aApAQCAtMjc2OSw3ICsyNzY5LDcgQEAgYm9vbCBSZW5kZXJCb3g6OnNocmlua1RvQXZv
aWRGbG9hdHMoKSBjbwogCiBib29sIFJlbmRlckJveDo6YXZvaWRzRmxvYXRzKCkgY29uc3QKIHsK
LSAgICByZXR1cm4gaXNSZXBsYWNlZCgpIHx8IGhhc092ZXJmbG93Q2xpcCgpIHx8IGlzSFIoKTsK
KyAgICByZXR1cm4gIWlzQW5vbnltb3VzSW5saW5lQmxvY2soKSAmJiAoaXNSZXBsYWNlZCgpIHx8
IGhhc092ZXJmbG93Q2xpcCgpIHx8IGlzSFIoKSk7CiB9CiAKIHZvaWQgUmVuZGVyQm94OjphZGRT
aGFkb3dPdmVyZmxvdygpCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJJbmxpbmUuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlcklubGluZS5jcHAJKHJldmlz
aW9uIDQ3NjQzKQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVySW5saW5lLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtNDIsNyArNDIsNiBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIFJlbmRlcklu
bGluZTo6UmVuZGVySW5saW5lKE5vZGUqIG5vZGUpCiAgICAgOiBSZW5kZXJCb3hNb2RlbE9iamVj
dChub2RlKQotICAgICwgbV9jb250aW51YXRpb24oMCkKICAgICAsIG1fbGluZUhlaWdodCgtMSkK
ICAgICAsIG1fdmVydGljYWxQb3NpdGlvbihQb3NpdGlvblVuZGVmaW5lZCkKIHsKQEAgLTUxLDEx
ICs1MCw2IEBAIFJlbmRlcklubGluZTo6UmVuZGVySW5saW5lKE5vZGUqIG5vZGUpCiAKIHZvaWQg
UmVuZGVySW5saW5lOjpkZXN0cm95KCkKIHsKLSAgICAvLyBEZXRhY2ggb3VyIGNvbnRpbnVhdGlv
biBmaXJzdC4KLSAgICBpZiAobV9jb250aW51YXRpb24pCi0gICAgICAgIG1fY29udGludWF0aW9u
LT5kZXN0cm95KCk7Ci0gICAgbV9jb250aW51YXRpb24gPSAwOwotICAgIAogICAgIC8vIE1ha2Ug
c3VyZSB0byBkZXN0cm95IGFub255bW91cyBjaGlsZHJlbiBmaXJzdCB3aGlsZSB0aGV5IGFyZSBz
dGlsbCBjb25uZWN0ZWQgdG8gdGhlIHJlc3Qgb2YgdGhlIHRyZWUsIHNvIHRoYXQgdGhleSB3aWxs
CiAgICAgLy8gcHJvcGVybHkgZGlydHkgbGluZSBib3hlcyB0aGF0IHRoZXkgYXJlIHJlbW92ZWQg
ZnJvbS4gIEVmZmVjdHMgdGhhdCBkbyA6YmVmb3JlLzphZnRlciBvbmx5IG9uIGhvdmVyIGNvdWxk
IGNyYXNoIG90aGVyd2lzZS4KICAgICBjaGlsZHJlbigpLT5kZXN0cm95TGVmdG92ZXJDaGlsZHJl
bigpOwpAQCAtODcsMTMgKzgxLDYgQEAgdm9pZCBSZW5kZXJJbmxpbmU6OmRlc3Ryb3koKQogICAg
IFJlbmRlckJveE1vZGVsT2JqZWN0OjpkZXN0cm95KCk7CiB9CiAKLVJlbmRlcklubGluZSogUmVu
ZGVySW5saW5lOjppbmxpbmVDb250aW51YXRpb24oKSBjb25zdAotewotICAgIGlmICghbV9jb250
aW51YXRpb24gfHwgbV9jb250aW51YXRpb24tPmlzSW5saW5lKCkpCi0gICAgICAgIHJldHVybiB0
b1JlbmRlcklubGluZShtX2NvbnRpbnVhdGlvbik7Ci0gICAgcmV0dXJuIHRvUmVuZGVyQmxvY2so
bV9jb250aW51YXRpb24pLT5pbmxpbmVDb250aW51YXRpb24oKTsKLX0KLQogdm9pZCBSZW5kZXJJ
bmxpbmU6OnVwZGF0ZUJveE1vZGVsSW5mb0Zyb21TdHlsZSgpCiB7CiAgICAgUmVuZGVyQm94TW9k
ZWxPYmplY3Q6OnVwZGF0ZUJveE1vZGVsSW5mb0Zyb21TdHlsZSgpOwpAQCAtMTA5LDE5ICs5Niw2
IEBAIHZvaWQgUmVuZGVySW5saW5lOjpzdHlsZURpZENoYW5nZShTdHlsZUQKIHsKICAgICBSZW5k
ZXJCb3hNb2RlbE9iamVjdDo6c3R5bGVEaWRDaGFuZ2UoZGlmZiwgb2xkU3R5bGUpOwogCi0gICAg
Ly8gRW5zdXJlIHRoYXQgYWxsIG9mIHRoZSBzcGxpdCBpbmxpbmVzIHBpY2sgdXAgdGhlIG5ldyBz
dHlsZS4gV2UKLSAgICAvLyBvbmx5IGRvIHRoaXMgaWYgd2UncmUgYW4gaW5saW5lLCBzaW5jZSB3
ZSBkb24ndCB3YW50IHRvIHByb3BhZ2F0ZQotICAgIC8vIGEgYmxvY2sncyBzdHlsZSB0byB0aGUg
b3RoZXIgaW5saW5lcy4KLSAgICAvLyBlLmcuLCA8Zm9udD5mb28gPGg0PmdvbzwvaDQ+IG1vbzwv
Zm9udD4uICBUaGUgPGZvbnQ+IGlubGluZXMgYmVmb3JlCi0gICAgLy8gYW5kIGFmdGVyIHRoZSBi
bG9jayBzaGFyZSB0aGUgc2FtZSBzdHlsZSwgYnV0IHRoZSBibG9jayBkb2Vzbid0Ci0gICAgLy8g
bmVlZCB0byBwYXNzIGl0cyBzdHlsZSBvbiB0byBhbnlvbmUgZWxzZS4KLSAgICBmb3IgKFJlbmRl
cklubGluZSogY3VyckNvbnQgPSBpbmxpbmVDb250aW51YXRpb24oKTsgY3VyckNvbnQ7IGN1cnJD
b250ID0gY3VyckNvbnQtPmlubGluZUNvbnRpbnVhdGlvbigpKSB7Ci0gICAgICAgIFJlbmRlckJv
eE1vZGVsT2JqZWN0KiBuZXh0Q29udCA9IGN1cnJDb250LT5jb250aW51YXRpb24oKTsKLSAgICAg
ICAgY3VyckNvbnQtPnNldENvbnRpbnVhdGlvbigwKTsKLSAgICAgICAgY3VyckNvbnQtPnNldFN0
eWxlKHN0eWxlKCkpOwotICAgICAgICBjdXJyQ29udC0+c2V0Q29udGludWF0aW9uKG5leHRDb250
KTsKLSAgICB9Ci0KICAgICBtX2xpbmVIZWlnaHQgPSAtMTsKIAogICAgIC8vIFVwZGF0ZSBwc2V1
ZG9zIGZvciA6YmVmb3JlIGFuZCA6YWZ0ZXIgbm93LgpAQCAtMTMzLDc3ICsxMDcsNTIgQEAgdm9p
ZCBSZW5kZXJJbmxpbmU6OnN0eWxlRGlkQ2hhbmdlKFN0eWxlRAogCiB2b2lkIFJlbmRlcklubGlu
ZTo6YWRkQ2hpbGQoUmVuZGVyT2JqZWN0KiBuZXdDaGlsZCwgUmVuZGVyT2JqZWN0KiBiZWZvcmVD
aGlsZCkKIHsKLSAgICBpZiAoY29udGludWF0aW9uKCkpCi0gICAgICAgIHJldHVybiBhZGRDaGls
ZFRvQ29udGludWF0aW9uKG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7Ci0gICAgcmV0dXJuIGFkZENo
aWxkSWdub3JpbmdDb250aW51YXRpb24obmV3Q2hpbGQsIGJlZm9yZUNoaWxkKTsKLX0KLQotc3Rh
dGljIFJlbmRlckJveE1vZGVsT2JqZWN0KiBuZXh0Q29udGludWF0aW9uKFJlbmRlck9iamVjdCog
cmVuZGVyZXIpCi17Ci0gICAgaWYgKHJlbmRlcmVyLT5pc0lubGluZSgpICYmICFyZW5kZXJlci0+
aXNSZXBsYWNlZCgpKQotICAgICAgICByZXR1cm4gdG9SZW5kZXJJbmxpbmUocmVuZGVyZXIpLT5j
b250aW51YXRpb24oKTsKLSAgICByZXR1cm4gdG9SZW5kZXJCbG9jayhyZW5kZXJlciktPmlubGlu
ZUNvbnRpbnVhdGlvbigpOwotfQotCi1SZW5kZXJCb3hNb2RlbE9iamVjdCogUmVuZGVySW5saW5l
Ojpjb250aW51YXRpb25CZWZvcmUoUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCkKLXsKLSAgICBp
ZiAoYmVmb3JlQ2hpbGQgJiYgYmVmb3JlQ2hpbGQtPnBhcmVudCgpID09IHRoaXMpCi0gICAgICAg
IHJldHVybiB0aGlzOwotCi0gICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGN1cnIgPSBuZXh0Q29u
dGludWF0aW9uKHRoaXMpOwotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBuZXh0VG9MYXN0ID0g
dGhpczsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogbGFzdCA9IHRoaXM7Ci0gICAgd2hpbGUg
KGN1cnIpIHsKLSAgICAgICAgaWYgKGJlZm9yZUNoaWxkICYmIGJlZm9yZUNoaWxkLT5wYXJlbnQo
KSA9PSBjdXJyKSB7Ci0gICAgICAgICAgICBpZiAoY3Vyci0+Zmlyc3RDaGlsZCgpID09IGJlZm9y
ZUNoaWxkKQotICAgICAgICAgICAgICAgIHJldHVybiBsYXN0OwotICAgICAgICAgICAgcmV0dXJu
IGN1cnI7Ci0gICAgICAgIH0KLQotICAgICAgICBuZXh0VG9MYXN0ID0gbGFzdDsKLSAgICAgICAg
bGFzdCA9IGN1cnI7Ci0gICAgICAgIGN1cnIgPSBuZXh0Q29udGludWF0aW9uKGN1cnIpOwotICAg
IH0KLQotICAgIGlmICghYmVmb3JlQ2hpbGQgJiYgIWxhc3QtPmZpcnN0Q2hpbGQoKSkKLSAgICAg
ICAgcmV0dXJuIG5leHRUb0xhc3Q7Ci0gICAgcmV0dXJuIGxhc3Q7Ci19Ci0KLXZvaWQgUmVuZGVy
SW5saW5lOjphZGRDaGlsZElnbm9yaW5nQ29udGludWF0aW9uKFJlbmRlck9iamVjdCogbmV3Q2hp
bGQsIFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQpCi17CiAgICAgLy8gTWFrZSBzdXJlIHdlIGRv
bid0IGFwcGVuZCB0aGluZ3MgYWZ0ZXIgOmFmdGVyLWdlbmVyYXRlZCBjb250ZW50IGlmIHdlIGhh
dmUgaXQuCiAgICAgaWYgKCFiZWZvcmVDaGlsZCAmJiBpc0FmdGVyQ29udGVudChsYXN0Q2hpbGQo
KSkpCiAgICAgICAgIGJlZm9yZUNoaWxkID0gbGFzdENoaWxkKCk7CiAKLSAgICBpZiAoIW5ld0No
aWxkLT5pc0lubGluZSgpICYmICFuZXdDaGlsZC0+aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpKSB7
Ci0gICAgICAgIC8vIFdlIGFyZSBwbGFjaW5nIGEgYmxvY2sgaW5zaWRlIGFuIGlubGluZS4gV2Ug
aGF2ZSB0byBwZXJmb3JtIGEgc3BsaXQgb2YgdGhpcwotICAgICAgICAvLyBpbmxpbmUgaW50byBj
b250aW51YXRpb25zLiAgVGhpcyBpbnZvbHZlcyBjcmVhdGluZyBhbiBhbm9ueW1vdXMgYmxvY2sg
Ym94IHRvIGhvbGQKLSAgICAgICAgLy8gfG5ld0NoaWxkfC4gIFdlIHRoZW4gbWFrZSB0aGF0IGJs
b2NrIGJveCBhIGNvbnRpbnVhdGlvbiBvZiB0aGlzIGlubGluZS4gIFdlIHRha2UgYWxsIG9mCi0g
ICAgICAgIC8vIHRoZSBjaGlsZHJlbiBhZnRlciB8YmVmb3JlQ2hpbGR8IGFuZCBwdXQgdGhlbSBp
biBhIGNsb25lIG9mIHRoaXMgb2JqZWN0LgotICAgICAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IG5l
d1N0eWxlID0gUmVuZGVyU3R5bGU6OmNyZWF0ZSgpOwotICAgICAgICBuZXdTdHlsZS0+aW5oZXJp
dEZyb20oc3R5bGUoKSk7Ci0gICAgICAgIG5ld1N0eWxlLT5zZXREaXNwbGF5KEJMT0NLKTsKLQot
ICAgICAgICBSZW5kZXJCbG9jayogbmV3Qm94ID0gbmV3IChyZW5kZXJBcmVuYSgpKSBSZW5kZXJC
bG9jayhkb2N1bWVudCgpIC8qIGFub255bW91cyBib3ggKi8pOwotICAgICAgICBuZXdCb3gtPnNl
dFN0eWxlKG5ld1N0eWxlLnJlbGVhc2UoKSk7Ci0gICAgICAgIFJlbmRlckJveE1vZGVsT2JqZWN0
KiBvbGRDb250aW51YXRpb24gPSBjb250aW51YXRpb24oKTsKLSAgICAgICAgc2V0Q29udGludWF0
aW9uKG5ld0JveCk7Ci0KLSAgICAgICAgLy8gU29tZW9uZSBtYXkgaGF2ZSBwdXQgYSA8cD4gaW5z
aWRlIGEgPHE+LCBjYXVzaW5nIGEgc3BsaXQuICBXaGVuIHRoaXMgaGFwcGVucywgdGhlIDphZnRl
ciBjb250ZW50Ci0gICAgICAgIC8vIGhhcyB0byBtb3ZlIGludG8gdGhlIGlubGluZSBjb250aW51
YXRpb24uICBDYWxsIHVwZGF0ZUJlZm9yZUFmdGVyQ29udGVudCB0byBlbnN1cmUgdGhhdCBvdXIg
OmFmdGVyCi0gICAgICAgIC8vIGNvbnRlbnQgZ2V0cyBwcm9wZXJseSBkZXN0cm95ZWQuCi0gICAg
ICAgIGJvb2wgaXNMYXN0Q2hpbGQgPSAoYmVmb3JlQ2hpbGQgPT0gbGFzdENoaWxkKCkpOwotICAg
ICAgICBpZiAoZG9jdW1lbnQoKS0+dXNlc0JlZm9yZUFmdGVyUnVsZXMoKSkKLSAgICAgICAgICAg
IGNoaWxkcmVuKCktPnVwZGF0ZUJlZm9yZUFmdGVyQ29udGVudCh0aGlzLCBBRlRFUik7Ci0gICAg
ICAgIGlmIChpc0xhc3RDaGlsZCAmJiBiZWZvcmVDaGlsZCAhPSBsYXN0Q2hpbGQoKSkKLSAgICAg
ICAgICAgIGJlZm9yZUNoaWxkID0gMDsgLy8gV2UgZGVzdHJveWVkIHRoZSBsYXN0IGNoaWxkLCBz
byBub3cgd2UgbmVlZCB0byB1cGRhdGUgb3VyIGluc2VydGlvbgotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAvLyBwb2ludCB0byBiZSAwLiAgSXQncyBqdXN0IGEgc3RyYWlnaHQgYXBwZW5k
IG5vdy4KLQotICAgICAgICBzcGxpdEZsb3coYmVmb3JlQ2hpbGQsIG5ld0JveCwgbmV3Q2hpbGQs
IG9sZENvbnRpbnVhdGlvbik7CisgICAgLy8gSWYgdGhlIHJlcXVlc3RlZCBiZWZvcmVDaGlsZCBp
cyBub3Qgb25lIG9mIG91ciBjaGlsZHJlbiwgdGhlbiB0aGlzIGlzIG1vc3QgbGlrZWx5IGJlY2F1
c2UKKyAgICAvLyB0aGVyZSBpcyBhbiBhbm9ueW1vdXMgaW5saW5lLWJsb2NrIGJveCB3aXRoaW4g
dGhpcyBvYmplY3QgdGhhdCBjb250YWlucyB0aGUgYmVmb3JlQ2hpbGQuIFNvCisgICAgLy8ganVz
dCBpbnNlcnQgdGhlIGNoaWxkIGludG8gdGhlIGFub255bW91cyBpbmxpbmUtYmxvY2sgYm94IGlu
c3RlYWQgb2YgaGVyZS4KKyAgICBpZiAoYmVmb3JlQ2hpbGQgJiYgYmVmb3JlQ2hpbGQtPnBhcmVu
dCgpICE9IHRoaXMpIHsKKyAgICAgICAgQVNTRVJUKGJlZm9yZUNoaWxkLT5wYXJlbnQoKSk7Cisg
ICAgICAgIEFTU0VSVChiZWZvcmVDaGlsZC0+cGFyZW50KCktPmlzQW5vbnltb3VzSW5saW5lQmxv
Y2soKSk7CisgICAgICAgIGlmICghbmV3Q2hpbGQtPmlzSW5saW5lKCkgfHwgKG5ld0NoaWxkLT5p
c0lubGluZSgpICYmIGJlZm9yZUNoaWxkLT5wYXJlbnQoKS0+Zmlyc3RDaGlsZCgpICE9IGJlZm9y
ZUNoaWxkKSkKKyAgICAgICAgICAgIGJlZm9yZUNoaWxkLT5wYXJlbnQoKS0+YWRkQ2hpbGQobmV3
Q2hpbGQsIGJlZm9yZUNoaWxkKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYWRkQ2hpbGQo
bmV3Q2hpbGQsIGJlZm9yZUNoaWxkLT5wYXJlbnQoKSk7CiAgICAgICAgIHJldHVybjsKICAgICB9
CiAKKyAgICBpZiAoIW5ld0NoaWxkLT5pc0lubGluZSgpKSB7CisgICAgICAgIC8vIFdlIGFyZSBw
bGFjaW5nIGEgYmxvY2sgaW5zaWRlIGFuIGlubGluZS4gV2UgaGF2ZSB0byBwbGFjZSB0aGUgYmxv
Y2sgaW5zaWRlIGFuIGFub255bW91cyBpbmxpbmUtYmxvY2suCisgICAgICAgIC8vIFRoaXMgaW5s
aW5lLWJsb2NrIGNhbiBob3VzZSBhIHNlcXVlbmNlIG9mIGNvbnRpZ3VvdXMgYmxvY2stbGV2ZWwg
Y2hpbGRyZW4sIGFuZCB0aGV5IHdpbGwgYWxsIHNpdCBvbiB0aGUKKyAgICAgICAgLy8gc2FtZSBs
aW5lIHRvZ2V0aGVyLiAgV2UgdHJ5IHRvIHJldXNlIG9uZSBmaXJzdCBpZiBwb3NzaWJsZS4KKyAg
ICAgICAgaWYgKGJlZm9yZUNoaWxkKSB7CisgICAgICAgICAgICBpZiAoYmVmb3JlQ2hpbGQtPnBy
ZXZpb3VzU2libGluZygpICYmIGJlZm9yZUNoaWxkLT5wcmV2aW91c1NpYmxpbmcoKS0+aXNBbm9u
eW1vdXNJbmxpbmVCbG9jaygpKSB7CisgICAgICAgICAgICAgICAgYmVmb3JlQ2hpbGQtPnByZXZp
b3VzU2libGluZygpLT5hZGRDaGlsZChuZXdDaGlsZCk7CisgICAgICAgICAgICAgICAgcmV0dXJu
OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGxhc3RD
aGlsZCgpICYmIGxhc3RDaGlsZCgpLT5pc0Fub255bW91c0lubGluZUJsb2NrKCkpIHsKKyAgICAg
ICAgICAgICAgICBsYXN0Q2hpbGQoKS0+YWRkQ2hpbGQobmV3Q2hpbGQpOworICAgICAgICAgICAg
ICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorIAorICAgICAgICBpZiAoIW5l
d0NoaWxkLT5pc0Zsb2F0aW5nT3JQb3NpdGlvbmVkKCkpIHsKKyAgICAgICAgICAgIC8vIFRoZXJl
IHdhcyBubyBzdWl0YWJsZSBleGlzdGluZyBhbm9ueW1vdXMgYm94LiAgQ3JlYXRlIGEgbmV3IG9u
ZS4KKyAgICAgICAgICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gbmV3U3R5bGUgPSBSZW5kZXJTdHls
ZTo6Y3JlYXRlKCk7CisgICAgICAgICAgICBuZXdTdHlsZS0+aW5oZXJpdEZyb20oc3R5bGUoKSk7
CisgICAgICAgICAgICBuZXdTdHlsZS0+c2V0RGlzcGxheShJTkxJTkVfQkxPQ0spOworICAgICAg
ICAgICAgUmVuZGVyQmxvY2sqIG5ld0JveCA9IG5ldyAocmVuZGVyQXJlbmEoKSkgUmVuZGVyQmxv
Y2soZG9jdW1lbnQoKSk7CisgICAgICAgICAgICBuZXdCb3gtPnNldFN0eWxlKG5ld1N0eWxlKTsK
KyAgICAgICAgICAgIFJlbmRlckJveE1vZGVsT2JqZWN0OjphZGRDaGlsZChuZXdCb3gsIGJlZm9y
ZUNoaWxkKTsKKyAgICAgICAgICAgIG5ld0JveC0+YWRkQ2hpbGQobmV3Q2hpbGQpOworICAgICAg
ICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCiAgICAgUmVuZGVyQm94TW9kZWxPYmpl
Y3Q6OmFkZENoaWxkKG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7CiAKICAgICBuZXdDaGlsZC0+c2V0
TmVlZHNMYXlvdXRBbmRQcmVmV2lkdGhzUmVjYWxjKCk7CkBAIC0yMTYsMTg4ICsxNjUsNiBAQCBS
ZW5kZXJJbmxpbmUqIFJlbmRlcklubGluZTo6Y2xvbmVJbmxpbmUoCiAgICAgcmV0dXJuIG87CiB9
CiAKLXZvaWQgUmVuZGVySW5saW5lOjpzcGxpdElubGluZXMoUmVuZGVyQmxvY2sqIGZyb21CbG9j
aywgUmVuZGVyQmxvY2sqIHRvQmxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IFJlbmRlckJsb2NrKiBtaWRkbGVCbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCwgUmVuZGVyQm94TW9kZWxPYmplY3QqIG9sZENv
bnQpCi17Ci0gICAgLy8gQ3JlYXRlIGEgY2xvbmUgb2YgdGhpcyBpbmxpbmUuCi0gICAgUmVuZGVy
SW5saW5lKiBjbG9uZSA9IGNsb25lSW5saW5lKHRoaXMpOwotICAgIGNsb25lLT5zZXRDb250aW51
YXRpb24ob2xkQ29udCk7Ci0KLSAgICAvLyBOb3cgdGFrZSBhbGwgb2YgdGhlIGNoaWxkcmVuIGZy
b20gYmVmb3JlQ2hpbGQgdG8gdGhlIGVuZCBhbmQgcmVtb3ZlCi0gICAgLy8gdGhlbSBmcm9tIHx0
aGlzfCBhbmQgcGxhY2UgdGhlbSBpbiB0aGUgY2xvbmUuCi0gICAgUmVuZGVyT2JqZWN0KiBvID0g
YmVmb3JlQ2hpbGQ7Ci0gICAgd2hpbGUgKG8pIHsKLSAgICAgICAgUmVuZGVyT2JqZWN0KiB0bXAg
PSBvOwotICAgICAgICBvID0gdG1wLT5uZXh0U2libGluZygpOwotICAgICAgICBjbG9uZS0+YWRk
Q2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihjaGlsZHJlbigpLT5yZW1vdmVDaGlsZE5vZGUodGhp
cywgdG1wKSwgMCk7Ci0gICAgICAgIHRtcC0+c2V0TmVlZHNMYXlvdXRBbmRQcmVmV2lkdGhzUmVj
YWxjKCk7Ci0gICAgfQotCi0gICAgLy8gSG9vayB8Y2xvbmV8IHVwIGFzIHRoZSBjb250aW51YXRp
b24gb2YgdGhlIG1pZGRsZSBibG9jay4KLSAgICBtaWRkbGVCbG9jay0+c2V0SW5saW5lQ29udGlu
dWF0aW9uKGNsb25lKTsKLQotICAgIC8vIFdlIGhhdmUgYmVlbiByZXBhcmVudGVkIGFuZCBhcmUg
bm93IHVuZGVyIHRoZSBmcm9tQmxvY2suICBXZSBuZWVkCi0gICAgLy8gdG8gd2FsayB1cCBvdXIg
aW5saW5lIHBhcmVudCBjaGFpbiB1bnRpbCB3ZSBoaXQgdGhlIGNvbnRhaW5pbmcgYmxvY2suCi0g
ICAgLy8gT25jZSB3ZSBoaXQgdGhlIGNvbnRhaW5pbmcgYmxvY2sgd2UncmUgZG9uZS4KLSAgICBS
ZW5kZXJCb3hNb2RlbE9iamVjdCogY3VyciA9IHRvUmVuZGVyQm94TW9kZWxPYmplY3QocGFyZW50
KCkpOwotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBjdXJyQ2hpbGQgPSB0aGlzOwotICAgIAot
ICAgIC8vIEZJWE1FOiBCZWNhdXNlIHNwbGl0dGluZyBpcyBPKG5eMikgYXMgdGFncyBuZXN0IHBh
dGhvbG9naWNhbGx5LCB3ZSBjYXAgdGhlIGRlcHRoIGF0IHdoaWNoIHdlJ3JlIHdpbGxpbmcgdG8g
Y2xvbmUuCi0gICAgLy8gVGhlcmUgd2lsbCBldmVudHVhbGx5IGJlIGEgYmV0dGVyIGFwcHJvYWNo
IHRvIHRoaXMgcHJvYmxlbSB0aGF0IHdpbGwgbGV0IHVzIG5lc3QgdG8gYSBtdWNoCi0gICAgLy8g
Z3JlYXRlciBkZXB0aCAoc2VlIGJ1Z3ppbGxhIGJ1ZyAxMzQzMCkgYnV0IGZvciBub3cgd2UgaGF2
ZSBhIGxpbWl0LiAgVGhpcyAqd2lsbCogcmVzdWx0IGluCi0gICAgLy8gaW5jb3JyZWN0IHJlbmRl
cmluZywgYnV0IHRoZSBhbHRlcm5hdGl2ZSBpcyB0byBoYW5nIGZvcmV2ZXIuCi0gICAgdW5zaWdu
ZWQgc3BsaXREZXB0aCA9IDE7Ci0gICAgY29uc3QgdW5zaWduZWQgY01heFNwbGl0RGVwdGggPSAy
MDA7IAotICAgIHdoaWxlIChjdXJyICYmIGN1cnIgIT0gZnJvbUJsb2NrKSB7Ci0gICAgICAgIEFT
U0VSVChjdXJyLT5pc1JlbmRlcklubGluZSgpKTsKLSAgICAgICAgaWYgKHNwbGl0RGVwdGggPCBj
TWF4U3BsaXREZXB0aCkgewotICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGNsb25lLgotICAg
ICAgICAgICAgUmVuZGVySW5saW5lKiBjbG9uZUNoaWxkID0gY2xvbmU7Ci0gICAgICAgICAgICBj
bG9uZSA9IGNsb25lSW5saW5lKHRvUmVuZGVySW5saW5lKGN1cnIpKTsKLQotICAgICAgICAgICAg
Ly8gSW5zZXJ0IG91ciBjaGlsZCBjbG9uZSBhcyB0aGUgZmlyc3QgY2hpbGQuCi0gICAgICAgICAg
ICBjbG9uZS0+YWRkQ2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihjbG9uZUNoaWxkLCAwKTsKLQot
ICAgICAgICAgICAgLy8gSG9vayB0aGUgY2xvbmUgdXAgYXMgYSBjb250aW51YXRpb24gb2YgfGN1
cnJ8LgotICAgICAgICAgICAgUmVuZGVySW5saW5lKiBpbmxpbmVDdXJyID0gdG9SZW5kZXJJbmxp
bmUoY3Vycik7Ci0gICAgICAgICAgICBvbGRDb250ID0gaW5saW5lQ3Vyci0+Y29udGludWF0aW9u
KCk7Ci0gICAgICAgICAgICBpbmxpbmVDdXJyLT5zZXRDb250aW51YXRpb24oY2xvbmUpOwotICAg
ICAgICAgICAgY2xvbmUtPnNldENvbnRpbnVhdGlvbihvbGRDb250KTsKLQotICAgICAgICAgICAg
Ly8gU29tZW9uZSBtYXkgaGF2ZSBpbmRpcmVjdGx5IGNhdXNlZCBhIDxxPiB0byBzcGxpdC4gIFdo
ZW4gdGhpcyBoYXBwZW5zLCB0aGUgOmFmdGVyIGNvbnRlbnQKLSAgICAgICAgICAgIC8vIGhhcyB0
byBtb3ZlIGludG8gdGhlIGlubGluZSBjb250aW51YXRpb24uICBDYWxsIHVwZGF0ZUJlZm9yZUFm
dGVyQ29udGVudCB0byBlbnN1cmUgdGhhdCB0aGUgaW5saW5lJ3MgOmFmdGVyCi0gICAgICAgICAg
ICAvLyBjb250ZW50IGdldHMgcHJvcGVybHkgZGVzdHJveWVkLgotICAgICAgICAgICAgaWYgKGRv
Y3VtZW50KCktPnVzZXNCZWZvcmVBZnRlclJ1bGVzKCkpCi0gICAgICAgICAgICAgICAgaW5saW5l
Q3Vyci0+Y2hpbGRyZW4oKS0+dXBkYXRlQmVmb3JlQWZ0ZXJDb250ZW50KHRoaXMsIEFGVEVSKTsK
LQotICAgICAgICAgICAgLy8gTm93IHdlIG5lZWQgdG8gdGFrZSBhbGwgb2YgdGhlIGNoaWxkcmVu
IHN0YXJ0aW5nIGZyb20gdGhlIGZpcnN0IGNoaWxkCi0gICAgICAgICAgICAvLyAqYWZ0ZXIqIGN1
cnJDaGlsZCBhbmQgYXBwZW5kIHRoZW0gYWxsIHRvIHRoZSBjbG9uZS4KLSAgICAgICAgICAgIG8g
PSBjdXJyQ2hpbGQtPm5leHRTaWJsaW5nKCk7Ci0gICAgICAgICAgICB3aGlsZSAobykgewotICAg
ICAgICAgICAgICAgIFJlbmRlck9iamVjdCogdG1wID0gbzsKLSAgICAgICAgICAgICAgICBvID0g
dG1wLT5uZXh0U2libGluZygpOwotICAgICAgICAgICAgICAgIGNsb25lLT5hZGRDaGlsZElnbm9y
aW5nQ29udGludWF0aW9uKGlubGluZUN1cnItPmNoaWxkcmVuKCktPnJlbW92ZUNoaWxkTm9kZShj
dXJyLCB0bXApLCAwKTsKLSAgICAgICAgICAgICAgICB0bXAtPnNldE5lZWRzTGF5b3V0QW5kUHJl
ZldpZHRoc1JlY2FsYygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAg
ICAgICAvLyBLZWVwIHdhbGtpbmcgdXAgdGhlIGNoYWluLgotICAgICAgICBjdXJyQ2hpbGQgPSBj
dXJyOwotICAgICAgICBjdXJyID0gdG9SZW5kZXJCb3hNb2RlbE9iamVjdChjdXJyLT5wYXJlbnQo
KSk7Ci0gICAgICAgIHNwbGl0RGVwdGgrKzsKLSAgICB9Ci0KLSAgICAvLyBOb3cgd2UgYXJlIGF0
IHRoZSBibG9jayBsZXZlbC4gV2UgbmVlZCB0byBwdXQgdGhlIGNsb25lIGludG8gdGhlIHRvQmxv
Y2suCi0gICAgdG9CbG9jay0+Y2hpbGRyZW4oKS0+YXBwZW5kQ2hpbGROb2RlKHRvQmxvY2ssIGNs
b25lKTsKLQotICAgIC8vIE5vdyB0YWtlIGFsbCB0aGUgY2hpbGRyZW4gYWZ0ZXIgY3VyckNoaWxk
IGFuZCByZW1vdmUgdGhlbSBmcm9tIHRoZSBmcm9tQmxvY2sKLSAgICAvLyBhbmQgcHV0IHRoZW0g
aW4gdGhlIHRvQmxvY2suCi0gICAgbyA9IGN1cnJDaGlsZC0+bmV4dFNpYmxpbmcoKTsKLSAgICB3
aGlsZSAobykgewotICAgICAgICBSZW5kZXJPYmplY3QqIHRtcCA9IG87Ci0gICAgICAgIG8gPSB0
bXAtPm5leHRTaWJsaW5nKCk7Ci0gICAgICAgIHRvQmxvY2stPmNoaWxkcmVuKCktPmFwcGVuZENo
aWxkTm9kZSh0b0Jsb2NrLCBmcm9tQmxvY2stPmNoaWxkcmVuKCktPnJlbW92ZUNoaWxkTm9kZShm
cm9tQmxvY2ssIHRtcCkpOwotICAgIH0KLX0KLQotdm9pZCBSZW5kZXJJbmxpbmU6OnNwbGl0Rmxv
dyhSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkLCBSZW5kZXJCbG9jayogbmV3QmxvY2tCb3gsCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbmRlck9iamVjdCogbmV3Q2hpbGQsIFJlbmRl
ckJveE1vZGVsT2JqZWN0KiBvbGRDb250KQotewotICAgIFJlbmRlckJsb2NrKiBwcmUgPSAwOwot
ICAgIFJlbmRlckJsb2NrKiBibG9jayA9IGNvbnRhaW5pbmdCbG9jaygpOwotICAgIAotICAgIC8v
IERlbGV0ZSBvdXIgbGluZSBib3hlcyBiZWZvcmUgd2UgZG8gdGhlIGlubGluZSBzcGxpdCBpbnRv
IGNvbnRpbnVhdGlvbnMuCi0gICAgYmxvY2stPmRlbGV0ZUxpbmVCb3hUcmVlKCk7Ci0gICAgCi0g
ICAgYm9vbCBtYWRlTmV3QmVmb3JlQmxvY2sgPSBmYWxzZTsKLSAgICBpZiAoYmxvY2stPmlzQW5v
bnltb3VzQmxvY2soKSAmJiAoIWJsb2NrLT5wYXJlbnQoKSB8fCAhYmxvY2stPnBhcmVudCgpLT5j
cmVhdGVzQW5vbnltb3VzV3JhcHBlcigpKSkgewotICAgICAgICAvLyBXZSBjYW4gcmV1c2UgdGhp
cyBibG9jayBhbmQgbWFrZSBpdCB0aGUgcHJlQmxvY2sgb2YgdGhlIG5leHQgY29udGludWF0aW9u
LgotICAgICAgICBwcmUgPSBibG9jazsKLSAgICAgICAgcHJlLT5yZW1vdmVQb3NpdGlvbmVkT2Jq
ZWN0cygwKTsKLSAgICAgICAgYmxvY2sgPSBibG9jay0+Y29udGFpbmluZ0Jsb2NrKCk7Ci0gICAg
fSBlbHNlIHsKLSAgICAgICAgLy8gTm8gYW5vbnltb3VzIGJsb2NrIGF2YWlsYWJsZSBmb3IgdXNl
LiAgTWFrZSBvbmUuCi0gICAgICAgIHByZSA9IGJsb2NrLT5jcmVhdGVBbm9ueW1vdXNCbG9jaygp
OwotICAgICAgICBtYWRlTmV3QmVmb3JlQmxvY2sgPSB0cnVlOwotICAgIH0KLQotICAgIFJlbmRl
ckJsb2NrKiBwb3N0ID0gYmxvY2stPmNyZWF0ZUFub255bW91c0Jsb2NrKCk7Ci0KLSAgICBSZW5k
ZXJPYmplY3QqIGJveEZpcnN0ID0gbWFkZU5ld0JlZm9yZUJsb2NrID8gYmxvY2stPmZpcnN0Q2hp
bGQoKSA6IHByZS0+bmV4dFNpYmxpbmcoKTsKLSAgICBpZiAobWFkZU5ld0JlZm9yZUJsb2NrKQot
ICAgICAgICBibG9jay0+Y2hpbGRyZW4oKS0+aW5zZXJ0Q2hpbGROb2RlKGJsb2NrLCBwcmUsIGJv
eEZpcnN0KTsKLSAgICBibG9jay0+Y2hpbGRyZW4oKS0+aW5zZXJ0Q2hpbGROb2RlKGJsb2NrLCBu
ZXdCbG9ja0JveCwgYm94Rmlyc3QpOwotICAgIGJsb2NrLT5jaGlsZHJlbigpLT5pbnNlcnRDaGls
ZE5vZGUoYmxvY2ssIHBvc3QsIGJveEZpcnN0KTsKLSAgICBibG9jay0+c2V0Q2hpbGRyZW5Jbmxp
bmUoZmFsc2UpOwotICAgIAotICAgIGlmIChtYWRlTmV3QmVmb3JlQmxvY2spIHsKLSAgICAgICAg
UmVuZGVyT2JqZWN0KiBvID0gYm94Rmlyc3Q7Ci0gICAgICAgIHdoaWxlIChvKSB7Ci0gICAgICAg
ICAgICBSZW5kZXJPYmplY3QqIG5vID0gbzsKLSAgICAgICAgICAgIG8gPSBuby0+bmV4dFNpYmxp
bmcoKTsKLSAgICAgICAgICAgIHByZS0+Y2hpbGRyZW4oKS0+YXBwZW5kQ2hpbGROb2RlKHByZSwg
YmxvY2stPmNoaWxkcmVuKCktPnJlbW92ZUNoaWxkTm9kZShibG9jaywgbm8pKTsKLSAgICAgICAg
ICAgIG5vLT5zZXROZWVkc0xheW91dEFuZFByZWZXaWR0aHNSZWNhbGMoKTsKLSAgICAgICAgfQot
ICAgIH0KLQotICAgIHNwbGl0SW5saW5lcyhwcmUsIHBvc3QsIG5ld0Jsb2NrQm94LCBiZWZvcmVD
aGlsZCwgb2xkQ29udCk7Ci0KLSAgICAvLyBXZSBhbHJlYWR5IGtub3cgdGhlIG5ld0Jsb2NrQm94
IGlzbid0IGdvaW5nIHRvIGNvbnRhaW4gaW5saW5lIGtpZHMsIHNvIGF2b2lkIHdhc3RpbmcKLSAg
ICAvLyB0aW1lIGluIG1ha2VDaGlsZHJlbk5vbklubGluZSBieSBqdXN0IHNldHRpbmcgdGhpcyBl
eHBsaWNpdGx5IHVwIGZyb250LgotICAgIG5ld0Jsb2NrQm94LT5zZXRDaGlsZHJlbklubGluZShm
YWxzZSk7Ci0KLSAgICAvLyBXZSBkZWxheWVkIGFkZGluZyB0aGUgbmV3Q2hpbGQgdW50aWwgbm93
IHNvIHRoYXQgdGhlIHxuZXdCbG9ja0JveHwgd291bGQgYmUgZnVsbHkKLSAgICAvLyBjb25uZWN0
ZWQsIHRodXMgYWxsb3dpbmcgbmV3Q2hpbGQgYWNjZXNzIHRvIGEgcmVuZGVyQXJlbmEgc2hvdWxk
IGl0IG5lZWQKLSAgICAvLyB0byB3cmFwIGl0c2VsZiBpbiBhZGRpdGlvbmFsIGJveGVzIChlLmcu
LCB0YWJsZSBjb25zdHJ1Y3Rpb24pLgotICAgIG5ld0Jsb2NrQm94LT5hZGRDaGlsZChuZXdDaGls
ZCk7Ci0KLSAgICAvLyBBbHdheXMganVzdCBkbyBhIGZ1bGwgbGF5b3V0IGluIG9yZGVyIHRvIGVu
c3VyZSB0aGF0IGxpbmUgYm94ZXMgKGVzcGVjaWFsbHkgd3JhcHBlcnMgZm9yIGltYWdlcykKLSAg
ICAvLyBnZXQgZGVsZXRlZCBwcm9wZXJseS4gIEJlY2F1c2Ugb2JqZWN0cyBtb3ZlcyBmcm9tIHRo
ZSBwcmUgYmxvY2sgaW50byB0aGUgcG9zdCBibG9jaywgd2Ugd2FudCB0bwotICAgIC8vIG1ha2Ug
bmV3IGxpbmUgYm94ZXMgaW5zdGVhZCBvZiBsZWF2aW5nIHRoZSBvbGQgbGluZSBib3hlcyBhcm91
bmQuCi0gICAgcHJlLT5zZXROZWVkc0xheW91dEFuZFByZWZXaWR0aHNSZWNhbGMoKTsKLSAgICBi
bG9jay0+c2V0TmVlZHNMYXlvdXRBbmRQcmVmV2lkdGhzUmVjYWxjKCk7Ci0gICAgcG9zdC0+c2V0
TmVlZHNMYXlvdXRBbmRQcmVmV2lkdGhzUmVjYWxjKCk7Ci19Ci0KLXZvaWQgUmVuZGVySW5saW5l
OjphZGRDaGlsZFRvQ29udGludWF0aW9uKFJlbmRlck9iamVjdCogbmV3Q2hpbGQsIFJlbmRlck9i
amVjdCogYmVmb3JlQ2hpbGQpCi17Ci0gICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGZsb3cgPSBj
b250aW51YXRpb25CZWZvcmUoYmVmb3JlQ2hpbGQpOwotICAgIEFTU0VSVCghYmVmb3JlQ2hpbGQg
fHwgYmVmb3JlQ2hpbGQtPnBhcmVudCgpLT5pc1JlbmRlckJsb2NrKCkgfHwgYmVmb3JlQ2hpbGQt
PnBhcmVudCgpLT5pc1JlbmRlcklubGluZSgpKTsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCog
YmVmb3JlQ2hpbGRQYXJlbnQgPSAwOwotICAgIGlmIChiZWZvcmVDaGlsZCkKLSAgICAgICAgYmVm
b3JlQ2hpbGRQYXJlbnQgPSB0b1JlbmRlckJveE1vZGVsT2JqZWN0KGJlZm9yZUNoaWxkLT5wYXJl
bnQoKSk7Ci0gICAgZWxzZSB7Ci0gICAgICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBjb250ID0g
bmV4dENvbnRpbnVhdGlvbihmbG93KTsKLSAgICAgICAgaWYgKGNvbnQpCi0gICAgICAgICAgICBi
ZWZvcmVDaGlsZFBhcmVudCA9IGNvbnQ7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGJlZm9y
ZUNoaWxkUGFyZW50ID0gZmxvdzsKLSAgICB9Ci0KLSAgICBpZiAobmV3Q2hpbGQtPmlzRmxvYXRp
bmdPclBvc2l0aW9uZWQoKSkKLSAgICAgICAgcmV0dXJuIGJlZm9yZUNoaWxkUGFyZW50LT5hZGRD
aGlsZElnbm9yaW5nQ29udGludWF0aW9uKG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7Ci0KLSAgICAv
LyBBIGNvbnRpbnVhdGlvbiBhbHdheXMgY29uc2lzdHMgb2YgdHdvIHBvdGVudGlhbCBjYW5kaWRh
dGVzOiBhbiBpbmxpbmUgb3IgYW4gYW5vbnltb3VzCi0gICAgLy8gYmxvY2sgYm94IGhvbGRpbmcg
YmxvY2sgY2hpbGRyZW4uCi0gICAgYm9vbCBjaGlsZElubGluZSA9IG5ld0NoaWxkLT5pc0lubGlu
ZSgpOwotICAgIGJvb2wgYmNwSW5saW5lID0gYmVmb3JlQ2hpbGRQYXJlbnQtPmlzSW5saW5lKCk7
Ci0gICAgYm9vbCBmbG93SW5saW5lID0gZmxvdy0+aXNJbmxpbmUoKTsKLQotICAgIGlmIChmbG93
ID09IGJlZm9yZUNoaWxkUGFyZW50KQotICAgICAgICByZXR1cm4gZmxvdy0+YWRkQ2hpbGRJZ25v
cmluZ0NvbnRpbnVhdGlvbihuZXdDaGlsZCwgYmVmb3JlQ2hpbGQpOwotICAgIGVsc2UgewotICAg
ICAgICAvLyBUaGUgZ29hbCBoZXJlIGlzIHRvIG1hdGNoIHVwIGlmIHdlIGNhbiwgc28gdGhhdCB3
ZSBjYW4gY29hbGVzY2UgYW5kIGNyZWF0ZSB0aGUKLSAgICAgICAgLy8gbWluaW1hbCAjIG9mIGNv
bnRpbnVhdGlvbnMgbmVlZGVkIGZvciB0aGUgaW5saW5lLgotICAgICAgICBpZiAoY2hpbGRJbmxp
bmUgPT0gYmNwSW5saW5lKQotICAgICAgICAgICAgcmV0dXJuIGJlZm9yZUNoaWxkUGFyZW50LT5h
ZGRDaGlsZElnbm9yaW5nQ29udGludWF0aW9uKG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7Ci0gICAg
ICAgIGVsc2UgaWYgKGZsb3dJbmxpbmUgPT0gY2hpbGRJbmxpbmUpCi0gICAgICAgICAgICByZXR1
cm4gZmxvdy0+YWRkQ2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihuZXdDaGlsZCwgMCk7IC8vIEp1
c3QgdHJlYXQgbGlrZSBhbiBhcHBlbmQuCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVy
biBiZWZvcmVDaGlsZFBhcmVudC0+YWRkQ2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihuZXdDaGls
ZCwgYmVmb3JlQ2hpbGQpOwotICAgIH0KLX0KLQogdm9pZCBSZW5kZXJJbmxpbmU6OnBhaW50KFBh
aW50SW5mbyYgcGFpbnRJbmZvLCBpbnQgdHgsIGludCB0eSkKIHsKICAgICBtX2xpbmVCb3hlcy5w
YWludCh0aGlzLCBwYWludEluZm8sIHR4LCB0eSk7CkBAIC00MTAsMTYgKzE3Nyw2IEBAIHZvaWQg
UmVuZGVySW5saW5lOjphYnNvbHV0ZVJlY3RzKFZlY3RvcjwKICAgICAgICAgICAgIHJlY3RzLmFw
cGVuZChJbnRSZWN0KHR4ICsgY3Vyci0+eCgpLCB0eSArIGN1cnItPnkoKSwgY3Vyci0+d2lkdGgo
KSwgY3Vyci0+aGVpZ2h0KCkpKTsKICAgICB9IGVsc2UKICAgICAgICAgcmVjdHMuYXBwZW5kKElu
dFJlY3QodHgsIHR5LCAwLCAwKSk7Ci0KLSAgICBpZiAoY29udGludWF0aW9uKCkpIHsKLSAgICAg
ICAgaWYgKGNvbnRpbnVhdGlvbigpLT5pc0JveCgpKSB7Ci0gICAgICAgICAgICBSZW5kZXJCb3gq
IGJveCA9IHRvUmVuZGVyQm94KGNvbnRpbnVhdGlvbigpKTsKLSAgICAgICAgICAgIGNvbnRpbnVh
dGlvbigpLT5hYnNvbHV0ZVJlY3RzKHJlY3RzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHR4IC0gY29udGFpbmluZ0Jsb2NrKCktPngoKSArIGJveC0+eCgpLAot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHkgLSBjb250YWluaW5n
QmxvY2soKS0+eSgpICsgYm94LT55KCkpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIGNv
bnRpbnVhdGlvbigpLT5hYnNvbHV0ZVJlY3RzKHJlY3RzLCB0eCAtIGNvbnRhaW5pbmdCbG9jaygp
LT54KCksIHR5IC0gY29udGFpbmluZ0Jsb2NrKCktPnkoKSk7Ci0gICAgfQogfQogCiB2b2lkIFJl
bmRlcklubGluZTo6YWJzb2x1dGVRdWFkcyhWZWN0b3I8RmxvYXRRdWFkPiYgcXVhZHMpCkBAIC00
MzEsOSArMTg4LDYgQEAgdm9pZCBSZW5kZXJJbmxpbmU6OmFic29sdXRlUXVhZHMoVmVjdG9yPAog
ICAgICAgICB9CiAgICAgfSBlbHNlCiAgICAgICAgIHF1YWRzLmFwcGVuZChsb2NhbFRvQWJzb2x1
dGVRdWFkKEZsb2F0UmVjdCgpKSk7Ci0KLSAgICBpZiAoY29udGludWF0aW9uKCkpCi0gICAgICAg
IGNvbnRpbnVhdGlvbigpLT5hYnNvbHV0ZVF1YWRzKHF1YWRzKTsKIH0KIAogaW50IFJlbmRlcklu
bGluZTo6b2Zmc2V0TGVmdCgpIGNvbnN0CkBAIC01MDIsMTggKzI1Niw2IEBAIFZpc2libGVQb3Np
dGlvbiBSZW5kZXJJbmxpbmU6OnBvc2l0aW9uRm8KICAgICAgICAgLy8gc2hvdWxkIHRyeSB0byBm
aW5kIGEgcmVzdWx0IGJ5IGFza2luZyBvdXIgY29udGFpbmluZyBibG9jay4KICAgICAgICAgcmV0
dXJuIGNiLT5wb3NpdGlvbkZvclBvaW50KHBvaW50KTsKICAgICB9Ci0KLSAgICAvLyBUcmFuc2xh
dGUgdGhlIGNvb3JkcyBmcm9tIHRoZSBwcmUtYW5vbnltb3VzIGJsb2NrIHRvIHRoZSBwb3N0LWFu
b255bW91cyBibG9jay4KLSAgICBpbnQgcGFyZW50QmxvY2tYID0gY2ItPngoKSArIHBvaW50Lngo
KTsKLSAgICBpbnQgcGFyZW50QmxvY2tZID0gY2ItPnkoKSArIHBvaW50LnkoKTsKLSAgICBSZW5k
ZXJCb3hNb2RlbE9iamVjdCogYyA9IGNvbnRpbnVhdGlvbigpOwotICAgIHdoaWxlIChjKSB7Ci0g
ICAgICAgIFJlbmRlckJveCogY29udEJsb2NrID0gYy0+aXNJbmxpbmUoKSA/IGMtPmNvbnRhaW5p
bmdCbG9jaygpIDogdG9SZW5kZXJCbG9jayhjKTsKLSAgICAgICAgaWYgKGMtPmlzSW5saW5lKCkg
fHwgYy0+Zmlyc3RDaGlsZCgpKQotICAgICAgICAgICAgcmV0dXJuIGMtPnBvc2l0aW9uRm9yQ29v
cmRpbmF0ZXMocGFyZW50QmxvY2tYIC0gY29udEJsb2NrLT54KCksIHBhcmVudEJsb2NrWSAtIGNv
bnRCbG9jay0+eSgpKTsKLSAgICAgICAgYyA9IHRvUmVuZGVyQmxvY2soYyktPmlubGluZUNvbnRp
bnVhdGlvbigpOwotICAgIH0KLSAgICAKICAgICByZXR1cm4gUmVuZGVyQm94TW9kZWxPYmplY3Q6
OnBvc2l0aW9uRm9yUG9pbnQocG9pbnQpOwogfQogCkBAIC01NDksNyArMjkxLDcgQEAgSW50UmVj
dCBSZW5kZXJJbmxpbmU6OmNsaXBwZWRPdmVyZmxvd1JlYwogICAgIC8vIE9ubHkgcnVuLWlucyBh
cmUgYWxsb3dlZCBpbiBoZXJlIGR1cmluZyBsYXlvdXQuCiAgICAgQVNTRVJUKCF2aWV3KCkgfHwg
IXZpZXcoKS0+bGF5b3V0U3RhdGVFbmFibGVkKCkgfHwgaXNSdW5JbigpKTsKIAotICAgIGlmICgh
Zmlyc3RMaW5lQm94KCkgJiYgIWNvbnRpbnVhdGlvbigpKQorICAgIGlmICghZmlyc3RMaW5lQm94
KCkpCiAgICAgICAgIHJldHVybiBJbnRSZWN0KCk7CiAKICAgICAvLyBGaW5kIG91ciBsZWZ0bW9z
dCBwb3NpdGlvbi4KQEAgLTU5NywxMSArMzM5LDYgQEAgSW50UmVjdCBSZW5kZXJJbmxpbmU6OmNs
aXBwZWRPdmVyZmxvd1JlYwogICAgICAgICAgICAgICAgIHIudW5pdGUoY2hpbGRSZWN0KTsKICAg
ICAgICAgICAgIH0KICAgICAgICAgfQotCi0gICAgICAgIGlmIChjb250aW51YXRpb24oKSAmJiAh
Y29udGludWF0aW9uKCktPmlzSW5saW5lKCkpIHsKLSAgICAgICAgICAgIEludFJlY3QgY29udFJl
Y3QgPSBjb250aW51YXRpb24oKS0+cmVjdFdpdGhPdXRsaW5lRm9yUmVwYWludChyZXBhaW50Q29u
dGFpbmVyLCBvdyk7Ci0gICAgICAgICAgICByLnVuaXRlKGNvbnRSZWN0KTsKLSAgICAgICAgfQog
ICAgIH0KIAogICAgIHJldHVybiByOwpAQCAtNjgwLDQ5ICs0MTcsNiBAQCB2b2lkIFJlbmRlcklu
bGluZTo6Y29tcHV0ZVJlY3RGb3JSZXBhaW50CiAgICAgby0+Y29tcHV0ZVJlY3RGb3JSZXBhaW50
KHJlcGFpbnRDb250YWluZXIsIHJlY3QsIGZpeGVkKTsKIH0KIAotdm9pZCBSZW5kZXJJbmxpbmU6
OnVwZGF0ZURyYWdTdGF0ZShib29sIGRyYWdPbikKLXsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVj
dDo6dXBkYXRlRHJhZ1N0YXRlKGRyYWdPbik7Ci0gICAgaWYgKGNvbnRpbnVhdGlvbigpKQotICAg
ICAgICBjb250aW51YXRpb24oKS0+dXBkYXRlRHJhZ1N0YXRlKGRyYWdPbik7Ci19Ci0KLXZvaWQg
UmVuZGVySW5saW5lOjpjaGlsZEJlY2FtZU5vbklubGluZShSZW5kZXJPYmplY3QqIGNoaWxkKQot
ewotICAgIC8vIFdlIGhhdmUgdG8gc3BsaXQgdGhlIHBhcmVudCBmbG93LgotICAgIFJlbmRlckJs
b2NrKiBuZXdCb3ggPSBjb250YWluaW5nQmxvY2soKS0+Y3JlYXRlQW5vbnltb3VzQmxvY2soKTsK
LSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogb2xkQ29udGludWF0aW9uID0gY29udGludWF0aW9u
KCk7Ci0gICAgc2V0Q29udGludWF0aW9uKG5ld0JveCk7Ci0gICAgUmVuZGVyT2JqZWN0KiBiZWZv
cmVDaGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygpOwotICAgIGNoaWxkcmVuKCktPnJlbW92ZUNo
aWxkTm9kZSh0aGlzLCBjaGlsZCk7Ci0gICAgc3BsaXRGbG93KGJlZm9yZUNoaWxkLCBuZXdCb3gs
IGNoaWxkLCBvbGRDb250aW51YXRpb24pOwotfQotCi12b2lkIFJlbmRlcklubGluZTo6dXBkYXRl
SGl0VGVzdFJlc3VsdChIaXRUZXN0UmVzdWx0JiByZXN1bHQsIGNvbnN0IEludFBvaW50JiBwb2lu
dCkKLXsKLSAgICBpZiAocmVzdWx0LmlubmVyTm9kZSgpKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICBOb2RlKiBuID0gbm9kZSgpOwotICAgIEludFBvaW50IGxvY2FsUG9pbnQocG9pbnQpOwotICAg
IGlmIChuKSB7Ci0gICAgICAgIGlmIChpc0lubGluZUNvbnRpbnVhdGlvbigpKSB7Ci0gICAgICAg
ICAgICAvLyBXZSdyZSBpbiB0aGUgY29udGludWF0aW9uIG9mIGEgc3BsaXQgaW5saW5lLiAgQWRq
dXN0IG91ciBsb2NhbCBwb2ludCB0byBiZSBpbiB0aGUgY29vcmRpbmF0ZSBzcGFjZQotICAgICAg
ICAgICAgLy8gb2YgdGhlIHByaW5jaXBhbCByZW5kZXJlcidzIGNvbnRhaW5pbmcgYmxvY2suICBU
aGlzIHdpbGwgZW5kIHVwIGJlaW5nIHRoZSBpbm5lck5vblNoYXJlZE5vZGUuCi0gICAgICAgICAg
ICBSZW5kZXJCbG9jayogZmlyc3RCbG9jayA9IG4tPnJlbmRlcmVyKCktPmNvbnRhaW5pbmdCbG9j
aygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBHZXQgb3VyIGNvbnRhaW5pbmcgYmxv
Y2suCi0gICAgICAgICAgICBSZW5kZXJCb3gqIGJsb2NrID0gY29udGFpbmluZ0Jsb2NrKCk7Ci0g
ICAgICAgICAgICBsb2NhbFBvaW50Lm1vdmUoYmxvY2stPngoKSAtIGZpcnN0QmxvY2stPngoKSwg
YmxvY2stPnkoKSAtIGZpcnN0QmxvY2stPnkoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1
bHQuc2V0SW5uZXJOb2RlKG4pOwotICAgICAgICBpZiAoIXJlc3VsdC5pbm5lck5vblNoYXJlZE5v
ZGUoKSkKLSAgICAgICAgICAgIHJlc3VsdC5zZXRJbm5lck5vblNoYXJlZE5vZGUobik7Ci0gICAg
ICAgIHJlc3VsdC5zZXRMb2NhbFBvaW50KGxvY2FsUG9pbnQpOwotICAgIH0KLX0KLQogdm9pZCBS
ZW5kZXJJbmxpbmU6OmRpcnR5TGluZUJveGVzKGJvb2wgZnVsbExheW91dCkKIHsKICAgICBpZiAo
ZnVsbExheW91dCkKQEAgLTgzNiwxNyArNTMwLDYgQEAgdm9pZCBSZW5kZXJJbmxpbmU6OmFkZEZv
Y3VzUmluZ1JlY3RzKEdyYQogICAgICAgICAgICBjdXJyLT5hZGRGb2N1c1JpbmdSZWN0cyhncmFw
aGljc0NvbnRleHQsIHBvcy54KCksIHBvcy55KCkpOwogICAgICAgICB9CiAgICAgfQotCi0gICAg
aWYgKGNvbnRpbnVhdGlvbigpKSB7Ci0gICAgICAgIGlmIChjb250aW51YXRpb24oKS0+aXNJbmxp
bmUoKSkKLSAgICAgICAgICAgIGNvbnRpbnVhdGlvbigpLT5hZGRGb2N1c1JpbmdSZWN0cyhncmFw
aGljc0NvbnRleHQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHR4IC0gY29udGFpbmluZ0Jsb2NrKCktPngoKSArIGNvbnRpbnVhdGlvbigpLT5jb250YWlu
aW5nQmxvY2soKS0+eCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHR5IC0gY29udGFpbmluZ0Jsb2NrKCktPnkoKSArIGNvbnRpbnVhdGlvbigpLT5jb250
YWluaW5nQmxvY2soKS0+eSgpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgY29udGludWF0
aW9uKCktPmFkZEZvY3VzUmluZ1JlY3RzKGdyYXBoaWNzQ29udGV4dCwgCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHggLSBjb250YWluaW5nQmxvY2soKS0+
eCgpICsgdG9SZW5kZXJCb3goY29udGludWF0aW9uKCkpLT54KCksCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHkgLSBjb250YWluaW5nQmxvY2soKS0+eSgp
ICsgdG9SZW5kZXJCb3goY29udGludWF0aW9uKCkpLT55KCkpOwotICAgIH0KIH0KIAogdm9pZCBS
ZW5kZXJJbmxpbmU6OnBhaW50T3V0bGluZShHcmFwaGljc0NvbnRleHQqIGdyYXBoaWNzQ29udGV4
dCwgaW50IHR4LCBpbnQgdHkpCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJJbmxpbmUu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJJbmxpbmUuaAkocmV2aXNp
b24gNDc1OTEpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJJbmxpbmUuaAkod29ya2luZyBj
b3B5KQpAQCAtNTUsMTAgKzU1LDYgQEAgcHVibGljOgogCiAgICAgSW5saW5lRmxvd0JveCogZmly
c3RMaW5lQm94KCkgY29uc3QgeyByZXR1cm4gbV9saW5lQm94ZXMuZmlyc3RMaW5lQm94KCk7IH0K
ICAgICBJbmxpbmVGbG93Qm94KiBsYXN0TGluZUJveCgpIGNvbnN0IHsgcmV0dXJuIG1fbGluZUJv
eGVzLmxhc3RMaW5lQm94KCk7IH0KLQotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBjb250aW51
YXRpb24oKSBjb25zdCB7IHJldHVybiBtX2NvbnRpbnVhdGlvbjsgfQotCi0gICAgdmlydHVhbCB2
b2lkIHVwZGF0ZURyYWdTdGF0ZShib29sIGRyYWdPbik7CiAgICAgCiAgICAgSW50U2l6ZSByZWxh
dGl2ZVBvc2l0aW9uZWRJbmxpbmVPZmZzZXQoY29uc3QgUmVuZGVyQm94KiBjaGlsZCkgY29uc3Q7
CiAKQEAgLTc4LDkgKzc0LDYgQEAgcHJpdmF0ZToKIAogICAgIHZpcnR1YWwgYm9vbCBpc1JlbmRl
cklubGluZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KIAotICAgIHZvaWQgYWRkQ2hpbGRUb0Nv
bnRpbnVhdGlvbihSZW5kZXJPYmplY3QqIG5ld0NoaWxkLCBSZW5kZXJPYmplY3QqIGJlZm9yZUNo
aWxkKTsKLSAgICB2aXJ0dWFsIHZvaWQgYWRkQ2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihSZW5k
ZXJPYmplY3QqIG5ld0NoaWxkLCBSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkID0gMCk7Ci0KICAg
ICB2b2lkIHNwbGl0SW5saW5lcyhSZW5kZXJCbG9jayogZnJvbUJsb2NrLCBSZW5kZXJCbG9jayog
dG9CbG9jaywgUmVuZGVyQmxvY2sqIG1pZGRsZUJsb2NrLAogICAgICAgICAgICAgICAgICAgICAg
IFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQsIFJlbmRlckJveE1vZGVsT2JqZWN0KiBvbGRDb250
KTsKICAgICB2b2lkIHNwbGl0RmxvdyhSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkLCBSZW5kZXJC
bG9jayogbmV3QmxvY2tCb3gsCkBAIC0xMjAsMTMgKzExMyw2IEBAIHByaXZhdGU6CiAKICAgICB2
aXJ0dWFsIGludCBsaW5lSGVpZ2h0KGJvb2wgZmlyc3RMaW5lLCBib29sIGlzUm9vdExpbmVCb3gg
PSBmYWxzZSkgY29uc3Q7CiAKLSAgICBSZW5kZXJJbmxpbmUqIGlubGluZUNvbnRpbnVhdGlvbigp
IGNvbnN0OwotICAgIHZvaWQgc2V0Q29udGludWF0aW9uKFJlbmRlckJveE1vZGVsT2JqZWN0KiBj
KSB7IG1fY29udGludWF0aW9uID0gYzsgfQotICAgIAotICAgIHZpcnR1YWwgdm9pZCBjaGlsZEJl
Y2FtZU5vbklubGluZShSZW5kZXJPYmplY3QqIGNoaWxkKTsKLQotICAgIHZpcnR1YWwgdm9pZCB1
cGRhdGVIaXRUZXN0UmVzdWx0KEhpdFRlc3RSZXN1bHQmLCBjb25zdCBJbnRQb2ludCYpOwotCiAg
ICAgdmlydHVhbCB2b2lkIGltYWdlQ2hhbmdlZChXcmFwcGVkSW1hZ2VQdHIsIGNvbnN0IEludFJl
Y3QqID0gMCk7CiAKICNpZiBFTkFCTEUoREFTSEJPQVJEX1NVUFBPUlQpCkBAIC0xMzksMTMgKzEy
NSwxMCBAQCBwcml2YXRlOgogICAgIHN0YXRpYyBSZW5kZXJJbmxpbmUqIGNsb25lSW5saW5lKFJl
bmRlcklubGluZSogc3JjKTsKIAogICAgIHZvaWQgcGFpbnRPdXRsaW5lRm9yTGluZShHcmFwaGlj
c0NvbnRleHQqLCBpbnQgdHgsIGludCB0eSwgY29uc3QgSW50UmVjdCYgcHJldkxpbmUsIGNvbnN0
IEludFJlY3QmIHRoaXNMaW5lLCBjb25zdCBJbnRSZWN0JiBuZXh0TGluZSk7Ci0gICAgUmVuZGVy
Qm94TW9kZWxPYmplY3QqIGNvbnRpbnVhdGlvbkJlZm9yZShSZW5kZXJPYmplY3QqIGJlZm9yZUNo
aWxkKTsKIAogICAgIFJlbmRlck9iamVjdENoaWxkTGlzdCBtX2NoaWxkcmVuOwogICAgIFJlbmRl
ckxpbmVCb3hMaXN0IG1fbGluZUJveGVzOyAgIC8vIEFsbCBvZiB0aGUgbGluZSBib3hlcyBjcmVh
dGVkIGZvciB0aGlzIGlubGluZSBmbG93LiAgRm9yIGV4YW1wbGUsIDxpPkhlbGxvPGJyPndvcmxk
LjwvaT4gd2lsbCBoYXZlIHR3byA8aT4gbGluZSBib3hlcy4KIAotICAgIFJlbmRlckJveE1vZGVs
T2JqZWN0KiBtX2NvbnRpbnVhdGlvbjsgLy8gQ2FuIGJlIGVpdGhlciBhIGJsb2NrIG9yIGFuIGlu
bGluZS4gPGI+PGk+PHA+SGVsbG88L3A+PC9pPjwvYj4uIEluIHRoaXMgZXhhbXBsZSB0aGUgPGk+
IHdpbGwgaGF2ZSBhIGJsb2NrIGFzIGl0cyBjb250aW51YXRpb24gYnV0IHRoZQotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPGI+IHdpbGwganVzdCBoYXZlIGFu
IGlubGluZSBhcyBpdHMgY29udGludWF0aW9uLgogICAgIG11dGFibGUgaW50IG1fbGluZUhlaWdo
dDsKICAgICBtdXRhYmxlIGludCBtX3ZlcnRpY2FsUG9zaXRpb247CiB9OwpJbmRleDogV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVyTGluZUJveExpc3QuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUv
cmVuZGVyaW5nL1JlbmRlckxpbmVCb3hMaXN0LmNwcAkocmV2aXNpb24gNDc1OTEpCisrKyBXZWJD
b3JlL3JlbmRlcmluZy9SZW5kZXJMaW5lQm94TGlzdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE0
NiwxMiArMTQ2LDYgQEAgdm9pZCBSZW5kZXJMaW5lQm94TGlzdDo6ZGlydHlMaW5lQm94ZXMoKQog
CiB2b2lkIFJlbmRlckxpbmVCb3hMaXN0OjpwYWludChSZW5kZXJCb3hNb2RlbE9iamVjdCogcmVu
ZGVyZXIsIFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGludCB0eCwgaW50IHR5
KSBjb25zdAogewotICAgIC8vIE9ubHkgcGFpbnQgZHVyaW5nIHRoZSBmb3JlZ3JvdW5kL3NlbGVj
dGlvbiBwaGFzZXMuCi0gICAgaWYgKHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlRm9yZWdy
b3VuZCAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZVNlbGVjdGlvbiAmJiBwYWludElu
Zm8ucGhhc2UgIT0gUGFpbnRQaGFzZU91dGxpbmUgCi0gICAgICAgICYmIHBhaW50SW5mby5waGFz
ZSAhPSBQYWludFBoYXNlU2VsZk91dGxpbmUgJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhh
c2VDaGlsZE91dGxpbmVzICYmIHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlVGV4dENsaXAK
LSAgICAgICAgJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VNYXNrKQotICAgICAgICBy
ZXR1cm47Ci0KICAgICBBU1NFUlQocmVuZGVyZXItPmlzUmVuZGVyQmxvY2soKSB8fCAocmVuZGVy
ZXItPmlzUmVuZGVySW5saW5lKCkgJiYgcmVuZGVyZXItPmhhc0xheWVyKCkpKTsgLy8gVGhlIG9u
bHkgd2F5IGFuIGlubGluZSBjb3VsZCBwYWludCBsaWtlIHRoaXMgaXMgaWYgaXQgaGFzIGEgbGF5
ZXIuCiAKICAgICAvLyBJZiB3ZSBoYXZlIG5vIGxpbmVzIHRoZW4gd2UgaGF2ZSBubyB3b3JrIHRv
IGRvLgpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3QuY3BwCShyZXZpc2lvbiA0NzU5MSkK
KysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdC5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTIxMTIsOCArMjExMiw2IEBAIHZvaWQgUmVuZGVyT2JqZWN0OjpnZXRUZXh0RGVjb3JhdGlvbkNv
bG8KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBjdXJyID0gY3Vyci0+cGFyZW50
KCk7Ci0gICAgICAgIGlmIChjdXJyICYmIGN1cnItPmlzUmVuZGVyQmxvY2soKSAmJiB0b1JlbmRl
ckJsb2NrKGN1cnIpLT5pbmxpbmVDb250aW51YXRpb24oKSkKLSAgICAgICAgICAgIGN1cnIgPSB0
b1JlbmRlckJsb2NrKGN1cnIpLT5pbmxpbmVDb250aW51YXRpb24oKTsKICAgICB9IHdoaWxlIChj
dXJyICYmIGRlY29yYXRpb25zICYmICghcXVpcmtzTW9kZSB8fCAhY3Vyci0+bm9kZSgpIHx8CiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFjdXJyLT5ub2RlKCktPmhhc1Rh
Z05hbWUoYVRhZykgJiYgIWN1cnItPm5vZGUoKS0+aGFzVGFnTmFtZShmb250VGFnKSkpKTsKIApJ
bmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmgJKHJldmlzaW9uIDQ3NTkxKQorKysgV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmgJKHdvcmtpbmcgY29weSkKQEAgLTM0Myw2ICszNDMs
MTAgQEAgcHVibGljOgogICAgIHsKICAgICAgICAgcmV0dXJuIG1faXNBbm9ueW1vdXMgJiYgc3R5
bGUoKS0+ZGlzcGxheSgpID09IEJMT0NLICYmIHN0eWxlKCktPnN0eWxlVHlwZSgpID09IE5PUFNF
VURPICYmICFpc0xpc3RNYXJrZXIoKTsKICAgICB9CisgICAgYm9vbCBpc0Fub255bW91c0lubGlu
ZUJsb2NrKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX2lzQW5vbnltb3VzICYmIHN0
eWxlKCktPmRpc3BsYXkoKSA9PSBJTkxJTkVfQkxPQ0sgJiYgc3R5bGUoKS0+c3R5bGVUeXBlKCkg
PT0gTk9QU0VVRE87CisgICAgfQogICAgIGJvb2wgaXNJbmxpbmVDb250aW51YXRpb24oKSBjb25z
dCB7IHJldHVybiAobm9kZSgpID8gbm9kZSgpLT5yZW5kZXJlcigpICE9IHRoaXMgOiBmYWxzZSkg
JiYgaXNSZW5kZXJJbmxpbmUoKTsgfQogICAgIGJvb2wgaXNGbG9hdGluZygpIGNvbnN0IHsgcmV0
dXJuIG1fZmxvYXRpbmc7IH0KICAgICBib29sIGlzUG9zaXRpb25lZCgpIGNvbnN0IHsgcmV0dXJu
IG1fcG9zaXRpb25lZDsgfSAvLyBhYnNvbHV0ZSBvciBmaXhlZCBwb3NpdGlvbmluZwpJbmRleDog
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0Q2hpbGRMaXN0LmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3RDaGlsZExpc3QuY3BwCShyZXZpc2lvbiA0
NzU5MSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdENoaWxkTGlzdC5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTMxMSwxNiArMzExLDYgQEAgdm9pZCBSZW5kZXJPYmplY3RDaGlsZExp
c3Q6OnVwZGF0ZUJlZm9yZQogCiAgICAgLy8gV2hldGhlciBvciBub3Qgd2Ugbm93IHdhbnQgZ2Vu
ZXJhdGVkIGNvbnRlbnQuICAKICAgICBib29sIG5ld0NvbnRlbnRXYW50ZWQgPSBwc2V1ZG9FbGVt
ZW50U3R5bGUgJiYgcHNldWRvRWxlbWVudFN0eWxlLT5kaXNwbGF5KCkgIT0gTk9ORTsKLQotICAg
IC8vIEZvciA8cT48cC8+PC9xPiwgaWYgdGhpcyBvYmplY3QgaXMgdGhlIGlubGluZSBjb250aW51
YXRpb24gb2YgdGhlIDxxPiwgd2Ugb25seSB3YW50IHRvIGdlbmVyYXRlCi0gICAgLy8gOmFmdGVy
IGNvbnRlbnQgYW5kIG5vdCA6YmVmb3JlIGNvbnRlbnQuCi0gICAgaWYgKG5ld0NvbnRlbnRXYW50
ZWQgJiYgdHlwZSA9PSBCRUZPUkUgJiYgb3duZXItPmlzUmVuZGVySW5saW5lKCkgJiYgdG9SZW5k
ZXJJbmxpbmUob3duZXIpLT5pc0lubGluZUNvbnRpbnVhdGlvbigpKQotICAgICAgICBuZXdDb250
ZW50V2FudGVkID0gZmFsc2U7Ci0KLSAgICAvLyBTaW1pbGFybHksIGlmIHdlJ3JlIHRoZSBiZWdp
bm5pbmcgb2YgYSA8cT4sIGFuZCB0aGVyZSdzIGFuIGlubGluZSBjb250aW51YXRpb24gZm9yIG91
ciBvYmplY3QsCi0gICAgLy8gdGhlbiB3ZSBkb24ndCBnZW5lcmF0ZSB0aGUgOmFmdGVyIGNvbnRl
bnQuCi0gICAgaWYgKG5ld0NvbnRlbnRXYW50ZWQgJiYgdHlwZSA9PSBBRlRFUiAmJiBvd25lci0+
aXNSZW5kZXJJbmxpbmUoKSAmJiB0b1JlbmRlcklubGluZShvd25lciktPmNvbnRpbnVhdGlvbigp
KQotICAgICAgICBuZXdDb250ZW50V2FudGVkID0gZmFsc2U7CiAgICAgCiAgICAgLy8gSWYgd2Ug
ZG9uJ3Qgd2FudCBnZW5lcmF0ZWQgY29udGVudCBhbnkgbG9uZ2VyLCBvciBpZiB3ZSBoYXZlIGdl
bmVyYXRlZCBjb250ZW50LCBidXQgaXQncyBubyBsb25nZXIKICAgICAvLyBpZGVudGljYWwgdG8g
dGhlIG5ldyBjb250ZW50IGRhdGEgd2Ugd2FudCB0byBidWlsZCByZW5kZXIgb2JqZWN0cyBmb3Is
IHRoZW4gd2UgbnVrZSBhbGwKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1Jvb3RJbmxpbmVCb3gu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1Jvb3RJbmxpbmVCb3guY3BwCShy
ZXZpc2lvbiA0NzU5MSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1Jvb3RJbmxpbmVCb3guY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSAiUGFnZS5oIgogI2luY2x1
ZGUgIlJlbmRlckFyZW5hLmgiCiAjaW5jbHVkZSAiUmVuZGVyQmxvY2suaCIKKyNpbmNsdWRlICJS
ZW5kZXJWaWV3LmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKQEAgLTE2Miw2ICsxNjMsNDYg
QEAgdm9pZCBSb290SW5saW5lQm94OjpwYWludEN1c3RvbUhpZ2hsaWdodAogCiB2b2lkIFJvb3RJ
bmxpbmVCb3g6OnBhaW50KFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGludCB0
eCwgaW50IHR5KQogeworICAgIFJlbmRlckJsb2NrKiBjaGlsZCA9IGFub255bW91c0lubGluZUJs
b2NrKCk7CisgICAgaWYgKGNoaWxkKSB7CisgICAgICAgIC8vIFRyZWF0IHBhaW50aW5nIG9mIGEg
c3BlY2lhbCBpbmxpbmUtYmxvY2sgbGluZSBsaWtlIHRoZSBwYWludGluZyBvZiBhIG5vcm1hbCBi
bG9jayBhbmQgZ28gdGhyb3VnaCBhbGwgcGhhc2VzLgorICAgICAgICBQYWludFBoYXNlIG5ld1Bo
YXNlID0gKHBhaW50SW5mby5waGFzZSA9PSBQYWludFBoYXNlQ2hpbGRPdXRsaW5lcykgPyBQYWlu
dFBoYXNlT3V0bGluZSA6IHBhaW50SW5mby5waGFzZTsKKyAgICAgICAgbmV3UGhhc2UgPSAobmV3
UGhhc2UgPT0gUGFpbnRQaGFzZUNoaWxkQmxvY2tCYWNrZ3JvdW5kcykgPyBQYWludFBoYXNlQ2hp
bGRCbG9ja0JhY2tncm91bmQgOiBuZXdQaGFzZTsKKyAgICAKKyAgICAgICAgLy8gV2UgZG9uJ3Qg
cGFpbnQgb3VyIG93biBiYWNrZ3JvdW5kLCBidXQgd2UgZG8gbGV0IHRoZSBjaGlsZCBwYWludCBp
dHMgYmFja2dyb3VuZC4KKyAgICAgICAgUmVuZGVyT2JqZWN0OjpQYWludEluZm8gaW5mbyhwYWlu
dEluZm8pOworICAgICAgICBpbmZvLnBoYXNlID0gbmV3UGhhc2U7CisgICAgICAgIGluZm8ucGFp
bnRpbmdSb290ID0gcmVuZGVyZXIoKS0+cGFpbnRpbmdSb290Rm9yQ2hpbGRyZW4ocGFpbnRJbmZv
KTsKKyAgICAgICAgYm9vbCBpc1ByaW50aW5nID0gcmVuZGVyZXIoKS0+ZG9jdW1lbnQoKS0+cHJp
bnRpbmcoKTsKKyAgICAgICAgCisgICAgICAgIC8vIENoZWNrIGZvciBwYWdlLWJyZWFrLWJlZm9y
ZTogYWx3YXlzLCBhbmQgaWYgaXQncyBzZXQsIGJyZWFrIGFuZCBiYWlsLgorICAgICAgICBpZiAo
aXNQcmludGluZyAmJiBjaGlsZC0+c3R5bGUoKS0+cGFnZUJyZWFrQmVmb3JlKCkgPT0gUEJBTFdB
WVMgJiYKKyAgICAgICAgICAgIGJsb2NrKCktPmluUm9vdEJsb2NrQ29udGV4dCgpICYmICh0eSAr
IGNoaWxkLT55KCkpID4gcGFpbnRJbmZvLnJlY3QueSgpICYmIAorICAgICAgICAgICAgKHR5ICsg
Y2hpbGQtPnkoKSkgPCBwYWludEluZm8ucmVjdC5ib3R0b20oKSkgeworICAgICAgICAgICAgcmVu
ZGVyZXIoKS0+dmlldygpLT5zZXRCZXN0VHJ1bmNhdGVkQXQodHkgKyBjaGlsZC0+eSgpLCBibG9j
aygpLCB0cnVlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlm
ICghY2hpbGQtPmhhc1NlbGZQYWludGluZ0xheWVyKCkpCisgICAgICAgICAgICBjaGlsZC0+cGFp
bnQoaW5mbywgdHgsIHR5KTsKKworICAgICAgICAvLyBDaGVjayBmb3IgcGFnZS1icmVhay1hZnRl
cjogYWx3YXlzLCBhbmQgaWYgaXQncyBzZXQsIGJyZWFrIGFuZCBiYWlsLgorICAgICAgICBpZiAo
aXNQcmludGluZyAmJiBjaGlsZC0+c3R5bGUoKS0+cGFnZUJyZWFrQWZ0ZXIoKSA9PSBQQkFMV0FZ
UyAmJiAKKyAgICAgICAgICAgIGJsb2NrKCktPmluUm9vdEJsb2NrQ29udGV4dCgpICYmICh0eSAr
IGNoaWxkLT55KCkgKyBjaGlsZC0+aGVpZ2h0KCkpID4gcGFpbnRJbmZvLnJlY3QueSgpICYmIAor
ICAgICAgICAgICAgKHR5ICsgY2hpbGQtPnkoKSArIGNoaWxkLT5oZWlnaHQoKSkgPCBwYWludElu
Zm8ucmVjdC5ib3R0b20oKSkgeworICAgICAgICAgICAgcmVuZGVyZXIoKS0+dmlldygpLT5zZXRC
ZXN0VHJ1bmNhdGVkQXQodHkgKyBjaGlsZC0+eSgpICsgY2hpbGQtPmhlaWdodCgpICsgbWF4KDAs
IGNoaWxkLT5jb2xsYXBzZWRNYXJnaW5Cb3R0b20oKSksIGJsb2NrKCksIHRydWUpOworICAgICAg
ICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm47CisgICAg
fQorCisgICAgLy8gT25seSBwYWludCBkdXJpbmcgdGhlIGZvcmVncm91bmQvc2VsZWN0aW9uIHBo
YXNlcyBpZiB3ZSBkb24ndCBoYXZlIGEgc3BlY2lhbCBhbm9ueW1vdXMgaW5saW5lIGJsb2NrLgor
ICAgIGlmIChwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZUZvcmVncm91bmQgJiYgcGFpbnRJ
bmZvLnBoYXNlICE9IFBhaW50UGhhc2VTZWxlY3Rpb24gJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBh
aW50UGhhc2VPdXRsaW5lIAorICAgICAgICAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFz
ZVNlbGZPdXRsaW5lICYmIHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlQ2hpbGRPdXRsaW5l
cyAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZVRleHRDbGlwCisgICAgICAgICYmIHBh
aW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlTWFzaykKKyAgICAgICAgcmV0dXJuOworCiAgICAg
SW5saW5lRmxvd0JveDo6cGFpbnQocGFpbnRJbmZvLCB0eCwgdHkpOwogICAgIHBhaW50RWxsaXBz
aXNCb3gocGFpbnRJbmZvLCB0eCwgdHkpOwogI2lmIFBMQVRGT1JNKE1BQykKQEAgLTIwMyw2ICsy
NDQsMTcgQEAgdm9pZCBSb290SW5saW5lQm94OjpjaGlsZFJlbW92ZWQoSW5saW5lQgogCiBpbnQg
Um9vdElubGluZUJveDo6dmVydGljYWxseUFsaWduQm94ZXMoaW50IGhlaWdodE9mQmxvY2spCiB7
CisgICAgUmVuZGVyQmxvY2sqIGlubGluZUJsb2NrID0gYW5vbnltb3VzSW5saW5lQmxvY2soKTsK
KyAgICBpZiAoaW5saW5lQmxvY2spIHsKKyAgICAgICAgaW50IGxpbmVUb3AgPSBpbmxpbmVCbG9j
ay0+eSgpOworICAgICAgICBpbnQgbGluZUJvdHRvbSA9IGlubGluZUJsb2NrLT55KCkgKyBpbmxp
bmVCbG9jay0+aGVpZ2h0KCk7CisgICAgICAgIGZpcnN0Q2hpbGQoKS0+c2V0WShsaW5lVG9wKTsK
KyAgICAgICAgc2V0WShsaW5lVG9wKTsKKyAgICAgICAgY29tcHV0ZVZlcnRpY2FsT3ZlcmZsb3co
bGluZVRvcCwgbGluZUJvdHRvbSwgdHJ1ZSk7CisgICAgICAgIHNldExpbmVUb3BCb3R0b21Qb3Np
dGlvbnMobGluZVRvcCwgbGluZUJvdHRvbSk7CisgICAgICAgIHJldHVybiBoZWlnaHRPZkJsb2Nr
OworICAgIH0KKyAgICAKICAgICBpbnQgbWF4UG9zaXRpb25Ub3AgPSAwOwogICAgIGludCBtYXhQ
b3NpdGlvbkJvdHRvbSA9IDA7CiAgICAgaW50IG1heEFzY2VudCA9IDA7CkBAIC0yMTYsNyArMjY4
LDYgQEAgaW50IFJvb3RJbmxpbmVCb3g6OnZlcnRpY2FsbHlBbGlnbkJveGVzKAogICAgIGJvb2wg
c3RyaWN0TW9kZSA9IChjdXJyICYmIGN1cnItPmRvY3VtZW50KCktPmluU3RyaWN0TW9kZSgpKTsK
IAogICAgIGNvbXB1dGVMb2dpY2FsQm94SGVpZ2h0cyhtYXhQb3NpdGlvblRvcCwgbWF4UG9zaXRp
b25Cb3R0b20sIG1heEFzY2VudCwgbWF4RGVzY2VudCwgc3RyaWN0TW9kZSk7Ci0KICAgICBpZiAo
bWF4QXNjZW50ICsgbWF4RGVzY2VudCA8IG1heChtYXhQb3NpdGlvblRvcCwgbWF4UG9zaXRpb25C
b3R0b20pKQogICAgICAgICBhZGp1c3RNYXhBc2NlbnRBbmREZXNjZW50KG1heEFzY2VudCwgbWF4
RGVzY2VudCwgbWF4UG9zaXRpb25Ub3AsIG1heFBvc2l0aW9uQm90dG9tKTsKIApAQCAtNDI5LDQg
KzQ4MCw5IEBAIHZvaWQgUm9vdElubGluZUJveDo6YXR0YWNoTGluZUJveFRvUmVuZGUKICAgICBi
bG9jaygpLT5saW5lQm94ZXMoKS0+YXR0YWNoTGluZUJveCh0aGlzKTsKIH0KIAorUmVuZGVyQmxv
Y2sqIFJvb3RJbmxpbmVCb3g6OmFub255bW91c0lubGluZUJsb2NrKCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gZmlyc3RDaGlsZCgpICYmIGZpcnN0Q2hpbGQoKSA9PSBsYXN0Q2hpbGQoKSAmJiAhZmly
c3RDaGlsZCgpLT5pc1RleHQoKSAmJiBmaXJzdENoaWxkKCktPnJlbmRlcmVyKCktPmlzQW5vbnlt
b3VzSW5saW5lQmxvY2soKSA/IHRvUmVuZGVyQmxvY2soZmlyc3RDaGlsZCgpLT5yZW5kZXJlcigp
KSA6IDA7Cit9CisKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcmVuZGVy
aW5nL1Jvb3RJbmxpbmVCb3guaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9Sb290
SW5saW5lQm94LmgJKHJldmlzaW9uIDQ3NTkxKQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUm9vdElu
bGluZUJveC5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMzQsNiArMTM0LDggQEAgcHVibGljOgogICAg
IHZpcnR1YWwgdm9pZCBhdHRhY2hMaW5lQm94VG9SZW5kZXJPYmplY3QoKTsKICAgICB2aXJ0dWFs
IHZvaWQgcmVtb3ZlTGluZUJveEZyb21SZW5kZXJPYmplY3QoKTsKIAorICAgIFJlbmRlckJsb2Nr
KiBhbm9ueW1vdXNJbmxpbmVCbG9jaygpIGNvbnN0OworCiBwcm90ZWN0ZWQ6CiAgICAgLy8gV2hl
cmUgdGhpcyBsaW5lIGVuZGVkLiAgVGhlIGV4YWN0IG9iamVjdCBhbmQgdGhlIHBvc2l0aW9uIHdp
dGhpbiB0aGF0IG9iamVjdCBhcmUgc3RvcmVkIHNvIHRoYXQKICAgICAvLyB3ZSBjYW4gY3JlYXRl
IGFuIElubGluZUl0ZXJhdG9yIGJlZ2lubmluZyBqdXN0IGFmdGVyIHRoZSBlbmQgb2YgdGhpcyBs
aW5lLgo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>38448</attachid>
            <date>2009-08-23 01:06:39 -0700</date>
            <delta_ts>2010-02-08 12:27:48 -0800</delta_ts>
            <desc>Clean up some layout test failures.  No progress on margin-collapsing test suite, but fixed some errors and crashes in other layout tests.</desc>
            <filename>patch.txt</filename>
            <type>text/plain</type>
            <size>82643</size>
            <attacher name="Dave Hyatt">hyatt</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0LmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eVJlbmRl
ck9iamVjdC5jcHAJKHJldmlzaW9uIDQ3NTkxKQorKysgV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0Fj
Y2Vzc2liaWxpdHlSZW5kZXJPYmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01MjMsMTIgKzUy
Myw4IEBAIEVsZW1lbnQqIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmFuY2gKICAgICBSZW5k
ZXJPYmplY3QqIGN1cnJSZW5kZXJlcjsKICAgICAKICAgICAvLyBTZWFyY2ggdXAgdGhlIHJlbmRl
ciB0cmVlIGZvciBhIFJlbmRlck9iamVjdCB3aXRoIGEgRE9NIG5vZGUuICBEZWZlciB0byBhbiBl
YXJsaWVyIGNvbnRpbnVhdGlvbiwgdGhvdWdoLgotICAgIGZvciAoY3VyclJlbmRlcmVyID0gbV9y
ZW5kZXJlcjsgY3VyclJlbmRlcmVyICYmICFjdXJyUmVuZGVyZXItPm5vZGUoKTsgY3VyclJlbmRl
cmVyID0gY3VyclJlbmRlcmVyLT5wYXJlbnQoKSkgewotICAgICAgICBpZiAoY3VyclJlbmRlcmVy
LT5pc1JlbmRlckJsb2NrKCkpIHsKLSAgICAgICAgICAgIFJlbmRlcklubGluZSogY29udGludWF0
aW9uID0gdG9SZW5kZXJCbG9jayhjdXJyUmVuZGVyZXIpLT5pbmxpbmVDb250aW51YXRpb24oKTsK
LSAgICAgICAgICAgIGlmIChjb250aW51YXRpb24pCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNh
Y2hlLT5nZXRPckNyZWF0ZShjb250aW51YXRpb24pLT5hbmNob3JFbGVtZW50KCk7Ci0gICAgICAg
IH0KKyAgICBmb3IgKGN1cnJSZW5kZXJlciA9IG1fcmVuZGVyZXI7IGN1cnJSZW5kZXJlciAmJiAh
Y3VyclJlbmRlcmVyLT5ub2RlKCk7IGN1cnJSZW5kZXJlciA9IGN1cnJSZW5kZXJlci0+cGFyZW50
KCkpCisgICAgewogICAgIH0KICAgICAKICAgICAvLyBiYWlsIGlmIG5vbmUgZm91bmQKSW5kZXg6
IFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUZsb3dCb3guY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvcmVuZGVyaW5nL0lubGluZUZsb3dCb3guY3BwCShyZXZpc2lvbiA0NzU5MSkKKysrIFdlYkNv
cmUvcmVuZGVyaW5nL0lubGluZUZsb3dCb3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMjcsMTQg
KzIyNywxMyBAQCB2b2lkIElubGluZUZsb3dCb3g6OmRldGVybWluZVNwYWNpbmdGb3JGCiAgICAg
ICAgIC8vICgzKSBUaGUgbGluZSBtYXkgZW5kIG9uIHRoZSBpbmxpbmUuICBJZiB3ZSBhcmUgdGhl
IGxhc3QgY2hpbGQgKGNsaW1iaW5nIHVwCiAgICAgICAgIC8vIHRoZSBlbmQgb2JqZWN0J3MgY2hh
aW4pLCB0aGVuIHdlIGp1c3QgY2xvc2VkIGFzIHdlbGwuCiAgICAgICAgIGlmICghbGluZUJveExp
c3QtPmxhc3RMaW5lQm94KCktPmlzQ29uc3RydWN0ZWQoKSkgewotICAgICAgICAgICAgUmVuZGVy
SW5saW5lKiBpbmxpbmVGbG93ID0gdG9SZW5kZXJJbmxpbmUocmVuZGVyZXIoKSk7CiAgICAgICAg
ICAgICBpZiAobHRyKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFuZXh0TGluZUJveCgpICYmCi0g
ICAgICAgICAgICAgICAgICAgICgobGFzdExpbmUgJiYgIWlubGluZUZsb3ctPmNvbnRpbnVhdGlv
bigpKSB8fCBuZXh0T25MaW5lRXhpc3RzKCkgfHwgb25FbmRDaGFpbihlbmRPYmplY3QpKSkKKyAg
ICAgICAgICAgICAgICAgICAgKGxhc3RMaW5lIHx8IG5leHRPbkxpbmVFeGlzdHMoKSB8fCBvbkVu
ZENoYWluKGVuZE9iamVjdCkpKQogICAgICAgICAgICAgICAgICAgICBpbmNsdWRlUmlnaHRFZGdl
ID0gdHJ1ZTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKCghcHJl
dkxpbmVCb3goKSB8fCBwcmV2TGluZUJveCgpLT5pc0NvbnN0cnVjdGVkKCkpICYmCi0gICAgICAg
ICAgICAgICAgICAgICgobGFzdExpbmUgJiYgIWlubGluZUZsb3ctPmNvbnRpbnVhdGlvbigpKSB8
fCBwcmV2T25MaW5lRXhpc3RzKCkgfHwgb25FbmRDaGFpbihlbmRPYmplY3QpKSkKKyAgICAgICAg
ICAgICAgICAgICAgKGxhc3RMaW5lIHx8IHByZXZPbkxpbmVFeGlzdHMoKSB8fCBvbkVuZENoYWlu
KGVuZE9iamVjdCkpKQogICAgICAgICAgICAgICAgICAgICBpbmNsdWRlTGVmdEVkZ2UgPSB0cnVl
OwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC01MDQsNyArNTAzLDcgQEAgdm9pZCBJbmxp
bmVGbG93Qm94OjpwbGFjZUJveGVzVmVydGljYWxseQogICAgICAgICAgICAgICAgIG5ld1kgLT0g
Y3Vyci0+Ym94TW9kZWxPYmplY3QoKS0+Ym9yZGVyVG9wKCkgKyBjdXJyLT5ib3hNb2RlbE9iamVj
dCgpLT5wYWRkaW5nVG9wKCk7CiAgICAgICAgIH0gZWxzZSBpZiAoIWN1cnItPnJlbmRlcmVyKCkt
PmlzQlIoKSkgewogICAgICAgICAgICAgUmVuZGVyQm94KiBib3ggPSB0b1JlbmRlckJveChjdXJy
LT5yZW5kZXJlcigpKTsKLSAgICAgICAgICAgIG5ld1kgKz0gYm94LT5tYXJnaW5Ub3AoKTsKKyAg
ICAgICAgICAgIG5ld1kgKz0gY3Vyci0+cmVuZGVyZXIoKS0+aXNBbm9ueW1vdXNJbmxpbmVCbG9j
aygpID8gMCA6IGJveC0+bWFyZ2luVG9wKCk7CiAgICAgICAgIH0KIAogICAgICAgICBjdXJyLT5z
ZXRZKG5ld1kpOwpAQCAtNjQzLDEzICs2NDIsNyBAQCB2b2lkIElubGluZUZsb3dCb3g6OnBhaW50
KFJlbmRlck9iamVjdDo6CiAgICAgICAgICAgICAvLyBvdXRsaW5lcy4KICAgICAgICAgICAgIGlm
IChyZW5kZXJlcigpLT5zdHlsZSgpLT52aXNpYmlsaXR5KCkgPT0gVklTSUJMRSAmJiByZW5kZXJl
cigpLT5oYXNPdXRsaW5lKCkgJiYgIWlzUm9vdElubGluZUJveCgpKSB7CiAgICAgICAgICAgICAg
ICAgUmVuZGVySW5saW5lKiBpbmxpbmVGbG93ID0gdG9SZW5kZXJJbmxpbmUocmVuZGVyZXIoKSk7
Ci0gICAgICAgICAgICAgICAgaWYgKChpbmxpbmVGbG93LT5jb250aW51YXRpb24oKSB8fCBpbmxp
bmVGbG93LT5pc0lubGluZUNvbnRpbnVhdGlvbigpKSAmJiAhYm94TW9kZWxPYmplY3QoKS0+aGFz
U2VsZlBhaW50aW5nTGF5ZXIoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBBZGQgb3Vyc2Vs
dmVzIHRvIHRoZSBjb250YWluaW5nIGJsb2NrIG9mIHRoZSBlbnRpcmUgY29udGludWF0aW9uIHNv
IHRoYXQgaXQgY2FuCi0gICAgICAgICAgICAgICAgICAgIC8vIHBhaW50IHVzIGF0b21pY2FsbHku
Ci0gICAgICAgICAgICAgICAgICAgIFJlbmRlckJsb2NrKiBibG9jayA9IHJlbmRlcmVyKCktPmNv
bnRhaW5pbmdCbG9jaygpLT5jb250YWluaW5nQmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAg
YmxvY2stPmFkZENvbnRpbnVhdGlvbldpdGhPdXRsaW5lKHRvUmVuZGVySW5saW5lKHJlbmRlcmVy
KCktPm5vZGUoKS0+cmVuZGVyZXIoKSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlu
bGluZUZsb3ctPmlzSW5saW5lQ29udGludWF0aW9uKCkpCi0gICAgICAgICAgICAgICAgICAgIHBh
aW50SW5mby5vdXRsaW5lT2JqZWN0cy0+YWRkKGlubGluZUZsb3cpOworICAgICAgICAgICAgICAg
IHBhaW50SW5mby5vdXRsaW5lT2JqZWN0cy0+YWRkKGlubGluZUZsb3cpOwogICAgICAgICAgICAg
fQogICAgICAgICB9IGVsc2UgaWYgKHBhaW50SW5mby5waGFzZSA9PSBQYWludFBoYXNlTWFzaykg
ewogICAgICAgICAgICAgcGFpbnRNYXNrKHBhaW50SW5mbywgdHgsIHR5KTsKSW5kZXg6IFdlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRl
cmluZy9SZW5kZXJCbG9jay5jcHAJKHJldmlzaW9uIDQ3Njc4KQorKysgV2ViQ29yZS9yZW5kZXJp
bmcvUmVuZGVyQmxvY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC04Miw4ICs4Miw2IEBAIHN0YXRp
YyBQZXJjZW50SGVpZ2h0RGVzY2VuZGFudHNNYXAqIGdQZXIKIAogdHlwZWRlZiBXVEY6Okhhc2hN
YXA8Y29uc3QgUmVuZGVyQm94KiwgSGFzaFNldDxSZW5kZXJCbG9jayo+Kj4gUGVyY2VudEhlaWdo
dENvbnRhaW5lck1hcDsKIHN0YXRpYyBQZXJjZW50SGVpZ2h0Q29udGFpbmVyTWFwKiBnUGVyY2Vu
dEhlaWdodENvbnRhaW5lck1hcCA9IDA7Ci0gICAgCi10eXBlZGVmIFdURjo6SGFzaE1hcDxSZW5k
ZXJCbG9jayosIExpc3RIYXNoU2V0PFJlbmRlcklubGluZSo+Kj4gQ29udGludWF0aW9uT3V0bGlu
ZVRhYmxlTWFwOwogCiB0eXBlZGVmIFdURjo6SGFzaFNldDxSZW5kZXJCbG9jayo+IERlbGF5ZWRV
cGRhdGVTY3JvbGxJbmZvU2V0Owogc3RhdGljIGludCBnRGVsYXlVcGRhdGVTY3JvbGxJbmZvID0g
MDsKQEAgLTk2LDcgKzk0LDcgQEAgUmVuZGVyQmxvY2s6Ok1hcmdpbkluZm86Ok1hcmdpbkluZm8o
UmVuZAogICAgIC8vIGlmIHdlIGhhZCBhbnkgYm9yZGVyL3BhZGRpbmcgKG9idmlvdXNseSksIGlm
IHdlJ3JlIHRoZSByb290IG9yIEhUTUwgZWxlbWVudHMsIG9yIGlmCiAgICAgLy8gd2UncmUgcG9z
aXRpb25lZCwgZmxvYXRpbmcsIGEgdGFibGUgY2VsbC4KICAgICBtX2NhbkNvbGxhcHNlV2l0aENo
aWxkcmVuID0gIWJsb2NrLT5pc1JlbmRlclZpZXcoKSAmJiAhYmxvY2stPmlzUm9vdCgpICYmICFi
bG9jay0+aXNQb3NpdGlvbmVkKCkgJiYKLSAgICAgICAgIWJsb2NrLT5pc0Zsb2F0aW5nKCkgJiYg
IWJsb2NrLT5pc1RhYmxlQ2VsbCgpICYmICFibG9jay0+aGFzT3ZlcmZsb3dDbGlwKCkgJiYgIWJs
b2NrLT5pc0lubGluZUJsb2NrT3JJbmxpbmVUYWJsZSgpOworICAgICAgICAhYmxvY2stPmlzRmxv
YXRpbmcoKSAmJiAhYmxvY2stPmlzVGFibGVDZWxsKCkgJiYgIWJsb2NrLT5oYXNPdmVyZmxvd0Ns
aXAoKSAmJiAoIWJsb2NrLT5pc0lubGluZUJsb2NrT3JJbmxpbmVUYWJsZSgpIHx8IGJsb2NrLT5p
c0Fub255bW91c0lubGluZUJsb2NrKCkpOwogCiAgICAgbV9jYW5Db2xsYXBzZVRvcFdpdGhDaGls
ZHJlbiA9IG1fY2FuQ29sbGFwc2VXaXRoQ2hpbGRyZW4gJiYgKHRvcCA9PSAwKSAmJiBibG9jay0+
c3R5bGUoKS0+bWFyZ2luVG9wQ29sbGFwc2UoKSAhPSBNU0VQQVJBVEU7CiAKQEAgLTEyNSw3ICsx
MjMsNiBAQCBSZW5kZXJCbG9jazo6UmVuZGVyQmxvY2soTm9kZSogbm9kZSkKICAgICAgIDogUmVu
ZGVyQm94KG5vZGUpCiAgICAgICAsIG1fZmxvYXRpbmdPYmplY3RzKDApCiAgICAgICAsIG1fcG9z
aXRpb25lZE9iamVjdHMoMCkKLSAgICAgICwgbV9pbmxpbmVDb250aW51YXRpb24oMCkKICAgICAg
ICwgbV9tYXhNYXJnaW4oMCkKICAgICAgICwgbV9saW5lSGVpZ2h0KC0xKQogewpAQCAtMTYzLDEx
ICsxNjAsNiBAQCBSZW5kZXJCbG9jazo6flJlbmRlckJsb2NrKCkKIAogdm9pZCBSZW5kZXJCbG9j
azo6ZGVzdHJveSgpCiB7Ci0gICAgLy8gRGV0YWNoIG91ciBjb250aW51YXRpb24gZmlyc3QuCi0g
ICAgaWYgKG1faW5saW5lQ29udGludWF0aW9uKQotICAgICAgICBtX2lubGluZUNvbnRpbnVhdGlv
bi0+ZGVzdHJveSgpOwotICAgIG1faW5saW5lQ29udGludWF0aW9uID0gMDsKLSAgICAKICAgICAv
LyBNYWtlIHN1cmUgdG8gZGVzdHJveSBhbm9ueW1vdXMgY2hpbGRyZW4gZmlyc3Qgd2hpbGUgdGhl
eSBhcmUgc3RpbGwgY29ubmVjdGVkIHRvIHRoZSByZXN0IG9mIHRoZSB0cmVlLCBzbyB0aGF0IHRo
ZXkgd2lsbAogICAgIC8vIHByb3Blcmx5IGRpcnR5IGxpbmUgYm94ZXMgdGhhdCB0aGV5IGFyZSBy
ZW1vdmVkIGZyb20uICBFZmZlY3RzIHRoYXQgZG8gOmJlZm9yZS86YWZ0ZXIgb25seSBvbiBob3Zl
ciBjb3VsZCBjcmFzaCBvdGhlcndpc2UuCiAgICAgY2hpbGRyZW4oKS0+ZGVzdHJveUxlZnRvdmVy
Q2hpbGRyZW4oKTsKQEAgLTMxOCw3ICszMTAsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjphZGRDaGls
ZChSZW5kZXJPYmplY3QqCiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFjaGlsZHJlbklubGlu
ZSgpICYmIChuZXdDaGlsZC0+aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpIHx8IG5ld0NoaWxkLT5p
c0lubGluZSgpKSkgewogICAgICAgICAvLyBJZiB3ZSdyZSBpbnNlcnRpbmcgYW4gaW5saW5lIGNo
aWxkIGJ1dCBhbGwgb2Ygb3VyIGNoaWxkcmVuIGFyZSBibG9ja3MsIHRoZW4gd2UgaGF2ZSB0byBt
YWtlIHN1cmUKLSAgICAgICAgLy8gaXQgaXMgcHV0IGludG8gYW4gYW5vbXlvdXMgYmxvY2sgYm94
LiBXZSB0cnkgdG8gdXNlIGFuIGV4aXN0aW5nIGFub255bW91cyBib3ggaWYgcG9zc2libGUsIG90
aGVyd2lzZQorICAgICAgICAvLyBpdCBpcyBwdXQgaW50byBhbiBhbm9ueW1vdXMgYmxvY2sgYm94
LiBXZSB0cnkgdG8gdXNlIGFuIGV4aXN0aW5nIGFub255bW91cyBib3ggaWYgcG9zc2libGUsIG90
aGVyd2lzZQogICAgICAgICAvLyBhIG5ldyBvbmUgaXMgY3JlYXRlZCBhbmQgaW5zZXJ0ZWQgaW50
byBvdXIgbGlzdCBvZiBjaGlsZHJlbiBpbiB0aGUgYXBwcm9wcmlhdGUgcG9zaXRpb24uCiAgICAg
ICAgIFJlbmRlck9iamVjdCogYWZ0ZXJDaGlsZCA9IGJlZm9yZUNoaWxkID8gYmVmb3JlQ2hpbGQt
PnByZXZpb3VzU2libGluZygpIDogbGFzdENoaWxkKCk7CiAKQEAgLTQ1NCw5ICs0NDYsNiBAQCB2
b2lkIFJlbmRlckJsb2NrOjpyZW1vdmVMZWZ0b3ZlckFub255bW91CiAgICAgQVNTRVJUKGNoaWxk
LT5pc0Fub255bW91c0Jsb2NrKCkpOwogICAgIEFTU0VSVCghY2hpbGQtPmNoaWxkcmVuSW5saW5l
KCkpOwogICAgIAotICAgIGlmIChjaGlsZC0+aW5saW5lQ29udGludWF0aW9uKCkpIAotICAgICAg
ICByZXR1cm47Ci0gICAgCiAgICAgUmVuZGVyT2JqZWN0KiBmaXJzdEFuQ2hpbGQgPSBjaGlsZC0+
bV9jaGlsZHJlbi5maXJzdENoaWxkKCk7CiAgICAgUmVuZGVyT2JqZWN0KiBsYXN0QW5DaGlsZCA9
IGNoaWxkLT5tX2NoaWxkcmVuLmxhc3RDaGlsZCgpOwogICAgIGlmIChmaXJzdEFuQ2hpbGQpIHsK
QEAgLTQ5OSw3ICs0ODgsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjpyZW1vdmVDaGlsZChSZW5kZXJP
YmplCiAgICAgUmVuZGVyT2JqZWN0KiBwcmV2ID0gb2xkQ2hpbGQtPnByZXZpb3VzU2libGluZygp
OwogICAgIFJlbmRlck9iamVjdCogbmV4dCA9IG9sZENoaWxkLT5uZXh0U2libGluZygpOwogICAg
IGJvb2wgY2FuRGVsZXRlQW5vbnltb3VzQmxvY2tzID0gIWRvY3VtZW50QmVpbmdEZXN0cm95ZWQo
KSAmJiAhaXNJbmxpbmUoKSAmJiAhb2xkQ2hpbGQtPmlzSW5saW5lKCkgJiYgCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAoIW9sZENoaWxkLT5pc1JlbmRlckJsb2NrKCkgfHwg
IXRvUmVuZGVyQmxvY2sob2xkQ2hpbGQpLT5pbmxpbmVDb250aW51YXRpb24oKSkgJiYgCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhb2xkQ2hpbGQtPmlzUmVuZGVyQmxvY2so
KSAmJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghcHJldiB8fCAocHJl
di0+aXNBbm9ueW1vdXNCbG9jaygpICYmIHByZXYtPmNoaWxkcmVuSW5saW5lKCkpKSAmJgogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFuZXh0IHx8IChuZXh0LT5pc0Fub255
bW91c0Jsb2NrKCkgJiYgbmV4dC0+Y2hpbGRyZW5JbmxpbmUoKSkpOwogICAgIGlmIChjYW5EZWxl
dGVBbm9ueW1vdXNCbG9ja3MgJiYgcHJldiAmJiBuZXh0KSB7CkBAIC01NzIsOSArNTYxLDE1IEBA
IGJvb2wgUmVuZGVyQmxvY2s6OmlzU2VsZkNvbGxhcHNpbmdCbG9jaygKICAgICAvLyBvbiB3aGV0
aGVyIHdlIGhhdmUgY29udGVudCB0aGF0IGlzIGFsbCBzZWxmLWNvbGxhcHNpbmcgb3Igbm90Lgog
ICAgIGlmIChoYXNBdXRvSGVpZ2h0IHx8ICgoc3R5bGUoKS0+aGVpZ2h0KCkuaXNGaXhlZCgpIHx8
IHN0eWxlKCktPmhlaWdodCgpLmlzUGVyY2VudCgpKSAmJiBzdHlsZSgpLT5oZWlnaHQoKS5pc1pl
cm8oKSkpIHsKICAgICAgICAgLy8gSWYgdGhlIGJsb2NrIGhhcyBpbmxpbmUgY2hpbGRyZW4sIHNl
ZSBpZiB3ZSBnZW5lcmF0ZWQgYW55IGxpbmUgYm94ZXMuICBJZiB3ZSBoYXZlIGFueQotICAgICAg
ICAvLyBsaW5lIGJveGVzLCB0aGVuIHdlIGNhbid0IGJlIHNlbGYtY29sbGFwc2luZywgc2luY2Ug
d2UgaGF2ZSBjb250ZW50LgotICAgICAgICBpZiAoY2hpbGRyZW5JbmxpbmUoKSkKLSAgICAgICAg
ICAgIHJldHVybiAhZmlyc3RMaW5lQm94KCk7CisgICAgICAgIC8vIGxpbmUgYm94ZXMsIHRoZW4g
d2UgY2FuIG9ubHkgYmUgc2VsZi1jb2xsYXBzaW5nIGlmIHdlIGhhdmUgbm90aGluZyBidXQgYW5v
bnltb3VzIGlubGluZSBibG9ja3MKKyAgICAgICAgLy8gdGhhdCBhcmUgYWxzbyBzZWxmLWNvbGxh
cHNpbmcgaW5zaWRlIHVzLgorICAgICAgICBpZiAoY2hpbGRyZW5JbmxpbmUoKSkgeworICAgICAg
ICAgICAgZm9yIChSb290SW5saW5lQm94KiBjaGlsZCA9IGZpcnN0Um9vdEJveCgpOyBjaGlsZDsg
Y2hpbGQgPSBjaGlsZC0+bmV4dFJvb3RCb3goKSkgeworICAgICAgICAgICAgICAgIGlmICghY2hp
bGQtPmFub255bW91c0lubGluZUJsb2NrKCkgfHwgIWNoaWxkLT5hbm9ueW1vdXNJbmxpbmVCbG9j
aygpLT5pc1NlbGZDb2xsYXBzaW5nQmxvY2soKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIFdlIGhh
dmUgbm8gbGluZSBib3hlcywgc28gd2UgbXVzdCBiZSBzZWxmLWNvbGxhcHNpbmcuCisgICAgICAg
IH0KICAgICAgICAgCiAgICAgICAgIC8vIFdoZXRoZXIgb3Igbm90IHdlIGNvbGxhcHNlIGlzIGRl
cGVuZGVudCBvbiB3aGV0aGVyIGFsbCBvdXIgbm9ybWFsIGZsb3cgY2hpbGRyZW4KICAgICAgICAg
Ly8gYXJlIGFsc28gc2VsZi1jb2xsYXBzaW5nLgpAQCAtODI3LDcgKzgyMiw4IEBAIHZvaWQgUmVu
ZGVyQmxvY2s6OmFkZE92ZXJmbG93RnJvbUZsb2F0cygKIAogYm9vbCBSZW5kZXJCbG9jazo6ZXhw
YW5kc1RvRW5jbG9zZU92ZXJoYW5naW5nRmxvYXRzKCkgY29uc3QKIHsKLSAgICByZXR1cm4gaXNJ
bmxpbmVCbG9ja09ySW5saW5lVGFibGUoKSB8fCBpc0Zsb2F0aW5nT3JQb3NpdGlvbmVkKCkgfHwg
aGFzT3ZlcmZsb3dDbGlwKCkgfHwgKHBhcmVudCgpICYmIHBhcmVudCgpLT5pc0ZsZXhpYmxlQm94
KCkpIHx8IGhhc0NvbHVtbnMoKSB8fCBpc1RhYmxlQ2VsbCgpIHx8IGlzRmllbGRzZXQoKTsKKyAg
ICByZXR1cm4gaXNGbG9hdGluZ09yUG9zaXRpb25lZCgpIHx8IGhhc092ZXJmbG93Q2xpcCgpIHx8
IChwYXJlbnQoKSAmJiBwYXJlbnQoKS0+aXNGbGV4aWJsZUJveCgpKSB8fCBoYXNDb2x1bW5zKCkg
fHwgaXNUYWJsZUNlbGwoKSB8fCBpc0ZpZWxkc2V0KCkgfHwKKyAgICAgICAgICAgKGlzSW5saW5l
QmxvY2tPcklubGluZVRhYmxlKCkgJiYgIWlzQW5vbnltb3VzSW5saW5lQmxvY2soKSk7CiB9CiAK
IHZvaWQgUmVuZGVyQmxvY2s6OmFkanVzdFBvc2l0aW9uZWRCbG9jayhSZW5kZXJCb3gqIGNoaWxk
LCBjb25zdCBNYXJnaW5JbmZvJiBtYXJnaW5JbmZvKQpAQCAtOTY5LDE5ICs5NjUsMTkgQEAgYm9v
bCBSZW5kZXJCbG9jazo6aGFuZGxlUnVuSW5DaGlsZChSZW5kZQogaW50IFJlbmRlckJsb2NrOjpj
b2xsYXBzZU1hcmdpbnMoUmVuZGVyQm94KiBjaGlsZCwgTWFyZ2luSW5mbyYgbWFyZ2luSW5mbykK
IHsKICAgICAvLyBHZXQgb3VyIG1heCBwb3MgYW5kIG5lZyB0b3AgbWFyZ2lucy4KLSAgICBpbnQg
cG9zVG9wID0gY2hpbGQtPm1heFRvcE1hcmdpbih0cnVlKTsKLSAgICBpbnQgbmVnVG9wID0gY2hp
bGQtPm1heFRvcE1hcmdpbihmYWxzZSk7CisgICAgaW50IHBvc1RvcCA9IGNoaWxkID8gY2hpbGQt
Pm1heFRvcE1hcmdpbih0cnVlKSA6IDA7CisgICAgaW50IG5lZ1RvcCA9IGNoaWxkID8gY2hpbGQt
Pm1heFRvcE1hcmdpbihmYWxzZSkgOiAwOwogCiAgICAgLy8gRm9yIHNlbGYtY29sbGFwc2luZyBi
bG9ja3MsIGNvbGxhcHNlIG91ciBib3R0b20gbWFyZ2lucyBpbnRvIG91cgogICAgIC8vIHRvcCB0
byBnZXQgbmV3IHBvc1RvcCBhbmQgbmVnVG9wIHZhbHVlcy4KLSAgICBpZiAoY2hpbGQtPmlzU2Vs
ZkNvbGxhcHNpbmdCbG9jaygpKSB7CisgICAgaWYgKGNoaWxkICYmIGNoaWxkLT5pc1NlbGZDb2xs
YXBzaW5nQmxvY2soKSkgewogICAgICAgICBwb3NUb3AgPSBtYXgocG9zVG9wLCBjaGlsZC0+bWF4
Qm90dG9tTWFyZ2luKHRydWUpKTsKICAgICAgICAgbmVnVG9wID0gbWF4KG5lZ1RvcCwgY2hpbGQt
Pm1heEJvdHRvbU1hcmdpbihmYWxzZSkpOwogICAgIH0KICAgICAKICAgICAvLyBTZWUgaWYgdGhl
IHRvcCBtYXJnaW4gaXMgcXVpcmt5LiBXZSBvbmx5IGNhcmUgaWYgdGhpcyBjaGlsZCBoYXMKICAg
ICAvLyBtYXJnaW5zIHRoYXQgd2lsbCBjb2xsYXBzZSB3aXRoIHVzLgotICAgIGJvb2wgdG9wUXVp
cmsgPSBjaGlsZC0+aXNUb3BNYXJnaW5RdWlyaygpIHx8IHN0eWxlKCktPm1hcmdpblRvcENvbGxh
cHNlKCkgPT0gTURJU0NBUkQ7CisgICAgYm9vbCB0b3BRdWlyayA9IChjaGlsZCAmJiBjaGlsZC0+
aXNUb3BNYXJnaW5RdWlyaygpKSB8fCBzdHlsZSgpLT5tYXJnaW5Ub3BDb2xsYXBzZSgpID09IE1E
SVNDQVJEOwogCiAgICAgaWYgKG1hcmdpbkluZm8uY2FuQ29sbGFwc2VXaXRoVG9wKCkpIHsKICAg
ICAgICAgLy8gVGhpcyBjaGlsZCBpcyBjb2xsYXBzaW5nIHdpdGggdGhlIHRvcCBvZiB0aGUKQEAg
LTk5NCw3ICs5OTAsNyBAQCBpbnQgUmVuZGVyQmxvY2s6OmNvbGxhcHNlTWFyZ2lucyhSZW5kZXJC
CiAgICAgICAgIC8vIGNvbGxhcHNlIGl0IGF3YXksIGV2ZW4gaWYgdGhlIG1hcmdpbiBpcyBzbWFs
bGVyICh3d3cud2VicmVmZXJlbmNlLmNvbQogICAgICAgICAvLyBoYXMgYW4gZXhhbXBsZSBvZiB0
aGlzLCBhIDxkdD4gd2l0aCAwLjhlbSBhdXRob3Itc3BlY2lmaWVkIGluc2lkZQogICAgICAgICAv
LyBhIDxkbD4gaW5zaWRlIGEgPHRkPi4KLSAgICAgICAgaWYgKCFtYXJnaW5JbmZvLmRldGVybWlu
ZWRUb3BRdWlyaygpICYmICF0b3BRdWlyayAmJiAocG9zVG9wLW5lZ1RvcCkpIHsKKyAgICAgICAg
aWYgKCFtYXJnaW5JbmZvLmRldGVybWluZWRUb3BRdWlyaygpICYmICF0b3BRdWlyayAmJiAocG9z
VG9wIC0gbmVnVG9wKSkgewogICAgICAgICAgICAgc2V0VG9wTWFyZ2luUXVpcmsoZmFsc2UpOwog
ICAgICAgICAgICAgbWFyZ2luSW5mby5zZXREZXRlcm1pbmVkVG9wUXVpcmsodHJ1ZSk7CiAgICAg
ICAgIH0KQEAgLTEwMTIsNyArMTAwOCw3IEBAIGludCBSZW5kZXJCbG9jazo6Y29sbGFwc2VNYXJn
aW5zKFJlbmRlckIKICAgICAgICAgbWFyZ2luSW5mby5zZXRUb3BRdWlyayh0b3BRdWlyayk7CiAK
ICAgICBpbnQgeXBvcyA9IGhlaWdodCgpOwotICAgIGlmIChjaGlsZC0+aXNTZWxmQ29sbGFwc2lu
Z0Jsb2NrKCkpIHsKKyAgICBpZiAoY2hpbGQgJiYgY2hpbGQtPmlzU2VsZkNvbGxhcHNpbmdCbG9j
aygpKSB7CiAgICAgICAgIC8vIFRoaXMgY2hpbGQgaGFzIG5vIGhlaWdodC4gIFdlIG5lZWQgdG8g
Y29tcHV0ZSBvdXIKICAgICAgICAgLy8gcG9zaXRpb24gYmVmb3JlIHdlIGNvbGxhcHNlIHRoZSBj
aGlsZCdzIG1hcmdpbnMgdG9nZXRoZXIsCiAgICAgICAgIC8vIHNvIHRoYXQgd2UgY2FuIGdldCBh
biBhY2N1cmF0ZSBwb3NpdGlvbiBmb3IgdGhlIHplcm8taGVpZ2h0IGJsb2NrLgpAQCAtMTAzMSwx
MyArMTAyNywxMSBAQCBpbnQgUmVuZGVyQmxvY2s6OmNvbGxhcHNlTWFyZ2lucyhSZW5kZXJCCiAg
ICAgICAgICAgICAvLyB0aGF0IG5lZWRzIHRvIGJlIHBvc2l0aW9uZWQgY29ycmVjdGx5IChlLmcu
LCBhIGJsb2NrIHRoYXQKICAgICAgICAgICAgIC8vIGhhZCBhIHNwZWNpZmllZCBoZWlnaHQgb2Yg
MCBidXQgdGhhdCBhY3R1YWxseSBoYWQgc3ViY29udGVudCkuCiAgICAgICAgICAgICB5cG9zID0g
aGVpZ2h0KCkgKyBjb2xsYXBzZWRUb3BQb3MgLSBjb2xsYXBzZWRUb3BOZWc7Ci0gICAgfQotICAg
IGVsc2UgewotICAgICAgICBpZiAoY2hpbGQtPnN0eWxlKCktPm1hcmdpblRvcENvbGxhcHNlKCkg
PT0gTVNFUEFSQVRFKSB7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGNoaWxkICYmIGNoaWxk
LT5zdHlsZSgpLT5tYXJnaW5Ub3BDb2xsYXBzZSgpID09IE1TRVBBUkFURSkgewogICAgICAgICAg
ICAgc2V0SGVpZ2h0KGhlaWdodCgpICsgbWFyZ2luSW5mby5tYXJnaW4oKSArIGNoaWxkLT5tYXJn
aW5Ub3AoKSk7CiAgICAgICAgICAgICB5cG9zID0gaGVpZ2h0KCk7Ci0gICAgICAgIH0KLSAgICAg
ICAgZWxzZSBpZiAoIW1hcmdpbkluZm8uYXRUb3BPZkJsb2NrKCkgfHwKKyAgICAgICAgfSBlbHNl
IGlmICghbWFyZ2luSW5mby5hdFRvcE9mQmxvY2soKSB8fAogICAgICAgICAgICAgKCFtYXJnaW5J
bmZvLmNhbkNvbGxhcHNlVG9wV2l0aENoaWxkcmVuKCkKICAgICAgICAgICAgICAmJiAoIXN0eWxl
KCktPmh0bWxIYWNrcygpIHx8ICFtYXJnaW5JbmZvLnF1aXJrQ29udGFpbmVyKCkgfHwgIW1hcmdp
bkluZm8udG9wUXVpcmsoKSkpKSB7CiAgICAgICAgICAgICAvLyBXZSdyZSBjb2xsYXBzaW5nIHdp
dGggYSBwcmV2aW91cyBzaWJsaW5nJ3MgbWFyZ2lucyBhbmQgbm90CkBAIC0xMDQ2LDExICsxMDQw
LDExIEBAIGludCBSZW5kZXJCbG9jazo6Y29sbGFwc2VNYXJnaW5zKFJlbmRlckIKICAgICAgICAg
ICAgIHlwb3MgPSBoZWlnaHQoKTsKICAgICAgICAgfQogCi0gICAgICAgIG1hcmdpbkluZm8uc2V0
UG9zTWFyZ2luKGNoaWxkLT5tYXhCb3R0b21NYXJnaW4odHJ1ZSkpOwotICAgICAgICBtYXJnaW5J
bmZvLnNldE5lZ01hcmdpbihjaGlsZC0+bWF4Qm90dG9tTWFyZ2luKGZhbHNlKSk7CisgICAgICAg
IG1hcmdpbkluZm8uc2V0UG9zTWFyZ2luKGNoaWxkID8gY2hpbGQtPm1heEJvdHRvbU1hcmdpbih0
cnVlKSA6IDApOworICAgICAgICBtYXJnaW5JbmZvLnNldE5lZ01hcmdpbihjaGlsZCA/IGNoaWxk
LT5tYXhCb3R0b21NYXJnaW4oZmFsc2UpIDogMCk7CiAKICAgICAgICAgaWYgKG1hcmdpbkluZm8u
bWFyZ2luKCkpCi0gICAgICAgICAgICBtYXJnaW5JbmZvLnNldEJvdHRvbVF1aXJrKGNoaWxkLT5p
c0JvdHRvbU1hcmdpblF1aXJrKCkgfHwgc3R5bGUoKS0+bWFyZ2luQm90dG9tQ29sbGFwc2UoKSA9
PSBNRElTQ0FSRCk7CisgICAgICAgICAgICBtYXJnaW5JbmZvLnNldEJvdHRvbVF1aXJrKChjaGls
ZCAmJiBjaGlsZC0+aXNCb3R0b21NYXJnaW5RdWlyaygpKSB8fCBzdHlsZSgpLT5tYXJnaW5Cb3R0
b21Db2xsYXBzZSgpID09IE1ESVNDQVJEKTsKICAgICB9CiAgICAgCiAgICAgcmV0dXJuIHlwb3M7
CkBAIC0xNzE3LDIwICsxNzExLDcgQEAgdm9pZCBSZW5kZXJCbG9jazo6cGFpbnRPYmplY3QoUGFp
bnRJbmZvJgogICAgIGlmICgocGFpbnRQaGFzZSA9PSBQYWludFBoYXNlT3V0bGluZSB8fCBwYWlu
dFBoYXNlID09IFBhaW50UGhhc2VTZWxmT3V0bGluZSkgJiYgaGFzT3V0bGluZSgpICYmIHN0eWxl
KCktPnZpc2liaWxpdHkoKSA9PSBWSVNJQkxFKQogICAgICAgICBwYWludE91dGxpbmUocGFpbnRJ
bmZvLmNvbnRleHQsIHR4LCB0eSwgd2lkdGgoKSwgaGVpZ2h0KCksIHN0eWxlKCkpOwogCi0gICAg
Ly8gNi4gcGFpbnQgY29udGludWF0aW9uIG91dGxpbmVzLgotICAgIGlmICgocGFpbnRQaGFzZSA9
PSBQYWludFBoYXNlT3V0bGluZSB8fCBwYWludFBoYXNlID09IFBhaW50UGhhc2VDaGlsZE91dGxp
bmVzKSkgewotICAgICAgICBpZiAoaW5saW5lQ29udGludWF0aW9uKCkgJiYgaW5saW5lQ29udGlu
dWF0aW9uKCktPmhhc091dGxpbmUoKSAmJiBpbmxpbmVDb250aW51YXRpb24oKS0+c3R5bGUoKS0+
dmlzaWJpbGl0eSgpID09IFZJU0lCTEUpIHsKLSAgICAgICAgICAgIFJlbmRlcklubGluZSogaW5s
aW5lUmVuZGVyZXIgPSB0b1JlbmRlcklubGluZShpbmxpbmVDb250aW51YXRpb24oKS0+bm9kZSgp
LT5yZW5kZXJlcigpKTsKLSAgICAgICAgICAgIGlmICghaW5saW5lUmVuZGVyZXItPmhhc1NlbGZQ
YWludGluZ0xheWVyKCkpCi0gICAgICAgICAgICAgICAgY29udGFpbmluZ0Jsb2NrKCktPmFkZENv
bnRpbnVhdGlvbldpdGhPdXRsaW5lKGlubGluZVJlbmRlcmVyKTsKLSAgICAgICAgICAgIGVsc2Ug
aWYgKCFpbmxpbmVSZW5kZXJlci0+Zmlyc3RMaW5lQm94KCkpCi0gICAgICAgICAgICAgICAgaW5s
aW5lUmVuZGVyZXItPnBhaW50T3V0bGluZShwYWludEluZm8uY29udGV4dCwgdHggLSB4KCkgKyBp
bmxpbmVSZW5kZXJlci0+Y29udGFpbmluZ0Jsb2NrKCktPngoKSwKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5IC0geSgpICsgaW5saW5lUmVuZGVyZXItPmNv
bnRhaW5pbmdCbG9jaygpLT55KCkpOwotICAgICAgICB9Ci0gICAgICAgIHBhaW50Q29udGludWF0
aW9uT3V0bGluZXMocGFpbnRJbmZvLCB0eCwgdHkpOwotICAgIH0KLQotICAgIC8vIDcuIHBhaW50
IGNhcmV0LgorICAgIC8vIDYuIHBhaW50IGNhcmV0LgogICAgIC8vIElmIHRoZSBjYXJldCdzIG5v
ZGUncyByZW5kZXIgb2JqZWN0J3MgY29udGFpbmluZyBibG9jayBpcyB0aGlzIGJsb2NrLCBhbmQg
dGhlIHBhaW50IGFjdGlvbiBpcyBQYWludFBoYXNlRm9yZWdyb3VuZCwKICAgICAvLyB0aGVuIHBh
aW50IHRoZSBjYXJldC4KICAgICBpZiAocGFpbnRQaGFzZSA9PSBQYWludFBoYXNlRm9yZWdyb3Vu
ZCkgeyAgICAgICAgCkBAIC0xNzkzLDU3ICsxNzc0LDYgQEAgdm9pZCBSZW5kZXJCbG9jazo6cGFp
bnRFbGxpcHNpc0JveGVzKFBhaQogICAgIH0KIH0KIAotc3RhdGljIENvbnRpbnVhdGlvbk91dGxp
bmVUYWJsZU1hcCogY29udGludWF0aW9uT3V0bGluZVRhYmxlKCkKLXsKLSAgICBERUZJTkVfU1RB
VElDX0xPQ0FMKENvbnRpbnVhdGlvbk91dGxpbmVUYWJsZU1hcCwgdGFibGUsICgpKTsKLSAgICBy
ZXR1cm4gJnRhYmxlOwotfQotCi12b2lkIFJlbmRlckJsb2NrOjphZGRDb250aW51YXRpb25XaXRo
T3V0bGluZShSZW5kZXJJbmxpbmUqIGZsb3cpCi17Ci0gICAgLy8gV2UgY2FuJ3QgbWFrZSB0aGlz
IHdvcmsgaWYgdGhlIGlubGluZSBpcyBpbiBhIGxheWVyLiAgV2UnbGwganVzdCByZWx5IG9uIHRo
ZSBicm9rZW4KLSAgICAvLyB3YXkgb2YgcGFpbnRpbmcuCi0gICAgQVNTRVJUKCFmbG93LT5sYXll
cigpICYmICFmbG93LT5pc0lubGluZUNvbnRpbnVhdGlvbigpKTsKLSAgICAKLSAgICBDb250aW51
YXRpb25PdXRsaW5lVGFibGVNYXAqIHRhYmxlID0gY29udGludWF0aW9uT3V0bGluZVRhYmxlKCk7
Ci0gICAgTGlzdEhhc2hTZXQ8UmVuZGVySW5saW5lKj4qIGNvbnRpbnVhdGlvbnMgPSB0YWJsZS0+
Z2V0KHRoaXMpOwotICAgIGlmICghY29udGludWF0aW9ucykgewotICAgICAgICBjb250aW51YXRp
b25zID0gbmV3IExpc3RIYXNoU2V0PFJlbmRlcklubGluZSo+OwotICAgICAgICB0YWJsZS0+c2V0
KHRoaXMsIGNvbnRpbnVhdGlvbnMpOwotICAgIH0KLSAgICAKLSAgICBjb250aW51YXRpb25zLT5h
ZGQoZmxvdyk7Ci19Ci0KLXZvaWQgUmVuZGVyQmxvY2s6OnBhaW50Q29udGludWF0aW9uT3V0bGlu
ZXMoUGFpbnRJbmZvJiBpbmZvLCBpbnQgdHgsIGludCB0eSkKLXsKLSAgICBDb250aW51YXRpb25P
dXRsaW5lVGFibGVNYXAqIHRhYmxlID0gY29udGludWF0aW9uT3V0bGluZVRhYmxlKCk7Ci0gICAg
aWYgKHRhYmxlLT5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgTGlz
dEhhc2hTZXQ8UmVuZGVySW5saW5lKj4qIGNvbnRpbnVhdGlvbnMgPSB0YWJsZS0+Z2V0KHRoaXMp
OwotICAgIGlmICghY29udGludWF0aW9ucykKLSAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAg
ICAvLyBQYWludCBlYWNoIGNvbnRpbnVhdGlvbiBvdXRsaW5lLgotICAgIExpc3RIYXNoU2V0PFJl
bmRlcklubGluZSo+OjppdGVyYXRvciBlbmQgPSBjb250aW51YXRpb25zLT5lbmQoKTsKLSAgICBm
b3IgKExpc3RIYXNoU2V0PFJlbmRlcklubGluZSo+OjppdGVyYXRvciBpdCA9IGNvbnRpbnVhdGlv
bnMtPmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICAvLyBOZWVkIHRvIGFkZCBp
biB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIGludGVydmVuaW5nIGJsb2Nrcy4KLSAgICAgICAgUmVu
ZGVySW5saW5lKiBmbG93ID0gKml0OwotICAgICAgICBSZW5kZXJCbG9jayogYmxvY2sgPSBmbG93
LT5jb250YWluaW5nQmxvY2soKTsKLSAgICAgICAgZm9yICggOyBibG9jayAmJiBibG9jayAhPSB0
aGlzOyBibG9jayA9IGJsb2NrLT5jb250YWluaW5nQmxvY2soKSkgewotICAgICAgICAgICAgdHgg
Kz0gYmxvY2stPngoKTsKLSAgICAgICAgICAgIHR5ICs9IGJsb2NrLT55KCk7Ci0gICAgICAgIH0K
LSAgICAgICAgQVNTRVJUKGJsb2NrKTsgICAKLSAgICAgICAgZmxvdy0+cGFpbnRPdXRsaW5lKGlu
Zm8uY29udGV4dCwgdHgsIHR5KTsKLSAgICB9Ci0gICAgCi0gICAgLy8gRGVsZXRlCi0gICAgZGVs
ZXRlIGNvbnRpbnVhdGlvbnM7Ci0gICAgdGFibGUtPnJlbW92ZSh0aGlzKTsKLX0KLQogdm9pZCBS
ZW5kZXJCbG9jazo6c2V0U2VsZWN0aW9uU3RhdGUoU2VsZWN0aW9uU3RhdGUgcykKIHsKICAgICBp
ZiAoc2VsZWN0aW9uU3RhdGUoKSA9PSBzKQpAQCAtMjkyOSwyNSArMjg1OSwzMSBAQCB2b2lkIFJl
bmRlckJsb2NrOjpjbGVhckZsb2F0cygpCiAgICAgLy8gb3V0IG9mIGZsb3cgKGxpa2UgZmxvYXRp
bmcvcG9zaXRpb25lZCBlbGVtZW50cyksIGFuZCB3ZSBhbHNvIHNraXAgb3ZlciBhbnkgb2JqZWN0
cyB0aGF0IG1heSBoYXZlIHNoaWZ0ZWQKICAgICAvLyB0byBhdm9pZCBmbG9hdHMuCiAgICAgYm9v
bCBwYXJlbnRIYXNGbG9hdHMgPSBmYWxzZTsKLSAgICBSZW5kZXJPYmplY3QqIHByZXYgPSBwcmV2
aW91c1NpYmxpbmcoKTsKLSAgICB3aGlsZSAocHJldiAmJiAocHJldi0+aXNGbG9hdGluZ09yUG9z
aXRpb25lZCgpIHx8ICFwcmV2LT5pc0JveCgpIHx8ICFwcmV2LT5pc1JlbmRlckJsb2NrKCkgfHwg
dG9SZW5kZXJCbG9jayhwcmV2KS0+YXZvaWRzRmxvYXRzKCkpKSB7Ci0gICAgICAgIGlmIChwcmV2
LT5pc0Zsb2F0aW5nKCkpCi0gICAgICAgICAgICBwYXJlbnRIYXNGbG9hdHMgPSB0cnVlOwotICAg
ICAgICAgcHJldiA9IHByZXYtPnByZXZpb3VzU2libGluZygpOworICAgIFJlbmRlck9iamVjdCog
cHJldiA9IDA7CisgICAgUmVuZGVyQmxvY2sqIHBhcmVudEJsb2NrID0gMDsKKyAgICBpZiAoaXNB
bm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CisgICAgICAgIHBhcmVudEJsb2NrID0gY29udGFpbmlu
Z0Jsb2NrKCk7CisgICAgICAgIHBhcmVudEhhc0Zsb2F0cyA9IHBhcmVudEJsb2NrLT5jb250YWlu
c0Zsb2F0cygpOworICAgIH0gZWxzZSB7ICAgIAorICAgICAgICB3aGlsZSAocHJldiAmJiAocHJl
di0+aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpIHx8ICFwcmV2LT5pc0JveCgpIHx8ICFwcmV2LT5p
c1JlbmRlckJsb2NrKCkgfHwgdG9SZW5kZXJCbG9jayhwcmV2KS0+YXZvaWRzRmxvYXRzKCkpKSB7
CisgICAgICAgICAgICBpZiAocHJldi0+aXNGbG9hdGluZygpKQorICAgICAgICAgICAgICAgIHBh
cmVudEhhc0Zsb2F0cyA9IHRydWU7CisgICAgICAgICAgICBwcmV2ID0gcHJldi0+cHJldmlvdXNT
aWJsaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHBhcmVudEJsb2NrID0gcGFy
ZW50KCktPmlzUmVuZGVyQmxvY2soKSA/IHRvUmVuZGVyQmxvY2socGFyZW50KCkpIDogMDsKICAg
ICB9CiAKICAgICAvLyBGaXJzdCBhZGQgaW4gZmxvYXRzIGZyb20gdGhlIHBhcmVudC4KICAgICBp
bnQgb2Zmc2V0ID0geSgpOwotICAgIGlmIChwYXJlbnRIYXNGbG9hdHMpIHsKLSAgICAgICAgUmVu
ZGVyQmxvY2sqIHBhcmVudEJsb2NrID0gdG9SZW5kZXJCbG9jayhwYXJlbnQoKSk7CisgICAgaWYg
KHBhcmVudEhhc0Zsb2F0cykKICAgICAgICAgYWRkSW50cnVkaW5nRmxvYXRzKHBhcmVudEJsb2Nr
LCBwYXJlbnRCbG9jay0+Ym9yZGVyTGVmdCgpICsgcGFyZW50QmxvY2stPnBhZGRpbmdMZWZ0KCks
IG9mZnNldCk7Ci0gICAgfQotICAgIAorCiAgICAgaW50IHhvZmZzZXQgPSAwOwogICAgIGlmIChw
cmV2KQogICAgICAgICBvZmZzZXQgLT0gdG9SZW5kZXJCb3gocHJldiktPnkoKTsKLSAgICBlbHNl
IGlmIChwYXJlbnQoKS0+aXNCb3goKSkgewotICAgICAgICBwcmV2ID0gcGFyZW50KCk7CisgICAg
ZWxzZSBpZiAocGFyZW50QmxvY2spIHsKKyAgICAgICAgcHJldiA9IHBhcmVudEJsb2NrOwogICAg
ICAgICB4b2Zmc2V0ICs9IHRvUmVuZGVyQm94KHByZXYpLT5ib3JkZXJMZWZ0KCkgKyB0b1JlbmRl
ckJveChwcmV2KS0+cGFkZGluZ0xlZnQoKTsKICAgICB9CiAKQEAgLTMwODIsNyArMzAxOCw3IEBA
IHZvaWQgUmVuZGVyQmxvY2s6OmFkZEludHJ1ZGluZ0Zsb2F0cyhSZW4KICAgICAgICAgICAgICAg
ICAvLyBhYm92ZS4gIHx4b2ZmfCB3aWxsIGVxdWFsIC1mbG93LT5tYXJnaW5MZWZ0KCkgaW4gdGhp
cyBjYXNlLCBzbyBpdCdzIGFscmVhZHkgYmVlbiB0YWtlbgogICAgICAgICAgICAgICAgIC8vIGlu
dG8gYWNjb3VudC4gIE9ubHkgYXBwbHkgdGhpcyBjb2RlIGlmIHxjaGlsZHwgaXMgZmFsc2UsIHNp
bmNlIG90aGVyd2lzZSB0aGUgbGVmdCBtYXJnaW4KICAgICAgICAgICAgICAgICAvLyB3aWxsIGdl
dCBhcHBsaWVkIHR3aWNlLgotICAgICAgICAgICAgICAgIGlmIChwcmV2ICE9IHBhcmVudCgpKQor
ICAgICAgICAgICAgICAgIGlmIChwcmV2ICE9IGNvbnRhaW5pbmdCbG9jaygpKQogICAgICAgICAg
ICAgICAgICAgICBmbG9hdGluZ09iai0+bV9sZWZ0ICs9IHByZXYtPm1hcmdpbkxlZnQoKTsKICAg
ICAgICAgICAgICAgICBmbG9hdGluZ09iai0+bV9sZWZ0IC09IG1hcmdpbkxlZnQoKTsKICAgICAg
ICAgICAgICAgICBmbG9hdGluZ09iai0+bV9zaG91bGRQYWludCA9IGZhbHNlOyAgLy8gV2UgYXJl
IG5vdCBpbiB0aGUgZGlyZWN0IGluaGVyaXRhbmNlIGNoYWluIGZvciB0aGlzIGZsb2F0LiBXZSB3
aWxsIG5ldmVyIHBhaW50IGl0LgpAQCAtMzEyNyw3ICszMDYzLDEzIEBAIHZvaWQgUmVuZGVyQmxv
Y2s6Om1hcmtBbGxEZXNjZW5kYW50c1dpdGgKICAgICAgICAgcmVtb3ZlRmxvYXRpbmdPYmplY3Qo
ZmxvYXRUb1JlbW92ZSk7CiAKICAgICAvLyBJdGVyYXRlIG92ZXIgb3VyIGNoaWxkcmVuIGFuZCBt
YXJrIHRoZW0gYXMgbmVlZGVkLgotICAgIGlmICghY2hpbGRyZW5JbmxpbmUoKSkgeworICAgIGlm
IChjaGlsZHJlbklubGluZSgpKSB7CisgICAgICAgIGZvciAoUm9vdElubGluZUJveCogYm94ID0g
Zmlyc3RSb290Qm94KCk7IGJveDsgYm94ID0gYm94LT5uZXh0Um9vdEJveCgpKSB7CisgICAgICAg
ICAgICBSZW5kZXJCbG9jayogY2hpbGRCbG9jayA9IGJveC0+YW5vbnltb3VzSW5saW5lQmxvY2so
KTsKKyAgICAgICAgICAgIGlmIChjaGlsZEJsb2NrICYmIChmbG9hdFRvUmVtb3ZlID8gY2hpbGRC
bG9jay0+Y29udGFpbnNGbG9hdChmbG9hdFRvUmVtb3ZlKSA6IGNoaWxkQmxvY2stPmNvbnRhaW5z
RmxvYXRzKCkpKQorICAgICAgICAgICAgICAgIGNoaWxkQmxvY2stPm1hcmtBbGxEZXNjZW5kYW50
c1dpdGhGbG9hdHNGb3JMYXlvdXQoZmxvYXRUb1JlbW92ZSwgaW5MYXlvdXQpOworICAgICAgICB9
CisgICAgfSBlbHNlIHsKICAgICAgICAgZm9yIChSZW5kZXJPYmplY3QqIGNoaWxkID0gZmlyc3RD
aGlsZCgpOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKSkgewogICAgICAgICAg
ICAgaWYgKCghZmxvYXRUb1JlbW92ZSAmJiBjaGlsZC0+aXNGbG9hdGluZ09yUG9zaXRpb25lZCgp
KSB8fCAhY2hpbGQtPmlzUmVuZGVyQmxvY2soKSkKICAgICAgICAgICAgICAgICBjb250aW51ZTsK
QEAgLTQwNDksMTQgKzM5OTEsMTUgQEAgdm9pZCBSZW5kZXJCbG9jazo6Y2FsY0lubGluZVByZWZX
aWR0aHMoKQogICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICBjbGVh
clByZXZpb3VzRmxvYXQgPSBmYWxzZTsKIAotICAgICAgICAgICAgICAgIGJvb2wgY2FuQnJlYWtS
ZXBsYWNlZEVsZW1lbnQgPSAhY2hpbGQtPmlzSW1hZ2UoKSB8fCBhbGxvd0ltYWdlc1RvQnJlYWs7
CisgICAgICAgICAgICAgICAgYm9vbCBjYW5CcmVha1JlcGxhY2VkRWxlbWVudCA9ICFjaGlsZC0+
aXNJbWFnZSgpIHx8IGFsbG93SW1hZ2VzVG9CcmVhayB8fCBjaGlsZC0+aXNBbm9ueW1vdXNJbmxp
bmVCbG9jaygpOwogICAgICAgICAgICAgICAgIGlmICgoY2FuQnJlYWtSZXBsYWNlZEVsZW1lbnQg
JiYgKGF1dG9XcmFwIHx8IG9sZEF1dG9XcmFwKSkgfHwgY2xlYXJQcmV2aW91c0Zsb2F0KSB7CiAg
ICAgICAgICAgICAgICAgICAgIG1fbWluUHJlZldpZHRoID0gbWF4KGlubGluZU1pbiwgbV9taW5Q
cmVmV2lkdGgpOwogICAgICAgICAgICAgICAgICAgICBpbmxpbmVNaW4gPSAwOwogICAgICAgICAg
ICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIElmIHdlJ3JlIHN1cHBvc2VkIHRvIGNsZWFy
IHRoZSBwcmV2aW91cyBmbG9hdCwgdGhlbiB0ZXJtaW5hdGUgbWF4d2lkdGggYXMgd2VsbC4KLSAg
ICAgICAgICAgICAgICBpZiAoY2xlYXJQcmV2aW91c0Zsb2F0KSB7CisgICAgICAgICAgICAgICAg
Ly8gQWxzbyBkbyB0aGlzIGZvciBhbm9ueW1vdXMgaW5saW5lIGJsb2Nrcy4KKyAgICAgICAgICAg
ICAgICBpZiAoY2xlYXJQcmV2aW91c0Zsb2F0IHx8IGNoaWxkLT5pc0Fub255bW91c0lubGluZUJs
b2NrKCkpIHsKICAgICAgICAgICAgICAgICAgICAgbV9tYXhQcmVmV2lkdGggPSBtYXgoaW5saW5l
TWF4LCBtX21heFByZWZXaWR0aCk7CiAgICAgICAgICAgICAgICAgICAgIGlubGluZU1heCA9IDA7
CiAgICAgICAgICAgICAgICAgfQpAQCAtNDA2NSwxNSArNDAwOCwxNyBAQCB2b2lkIFJlbmRlckJs
b2NrOjpjYWxjSW5saW5lUHJlZldpZHRocygpCiAgICAgICAgICAgICAgICAgaW50IHRpID0gMDsK
ICAgICAgICAgICAgICAgICBpZiAoIWFkZGVkVGV4dEluZGVudCkgewogICAgICAgICAgICAgICAg
ICAgICBhZGRlZFRleHRJbmRlbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB0aSA9IHN0
eWxlKCktPnRleHRJbmRlbnQoKS5jYWxjTWluVmFsdWUoY3cpOwotICAgICAgICAgICAgICAgICAg
ICBjaGlsZE1pbis9dGk7Ci0gICAgICAgICAgICAgICAgICAgIGNoaWxkTWF4Kz10aTsKKyAgICAg
ICAgICAgICAgICAgICAgaWYgKCFjaGlsZC0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7Cisg
ICAgICAgICAgICAgICAgICAgICAgICB0aSA9IHN0eWxlKCktPnRleHRJbmRlbnQoKS5jYWxjTWlu
VmFsdWUoY3cpOworICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRNaW4gKz0gdGk7CisgICAg
ICAgICAgICAgICAgICAgICAgICBjaGlsZE1heCArPSB0aTsKKyAgICAgICAgICAgICAgICAgICAg
fQogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIEFkZCBvdXIgd2lkdGgg
dG8gdGhlIG1heC4KICAgICAgICAgICAgICAgICBpbmxpbmVNYXggKz0gY2hpbGRNYXg7CiAKLSAg
ICAgICAgICAgICAgICBpZiAoIWF1dG9XcmFwIHx8ICFjYW5CcmVha1JlcGxhY2VkRWxlbWVudCkg
eworICAgICAgICAgICAgICAgIGlmICgoIWF1dG9XcmFwIHx8ICFjYW5CcmVha1JlcGxhY2VkRWxl
bWVudCkgJiYgIWNoaWxkLT5pc0Fub255bW91c0lubGluZUJsb2NrKCkpIHsKICAgICAgICAgICAg
ICAgICAgICAgaWYgKGNoaWxkLT5pc0Zsb2F0aW5nKCkpCiAgICAgICAgICAgICAgICAgICAgICAg
ICBtX21pblByZWZXaWR0aCA9IG1heChjaGlsZE1pbiwgbV9taW5QcmVmV2lkdGgpOwogICAgICAg
ICAgICAgICAgICAgICBlbHNlCkBAIC00MDg0LDYgKzQwMjksMTIgQEAgdm9pZCBSZW5kZXJCbG9j
azo6Y2FsY0lubGluZVByZWZXaWR0aHMoKQogCiAgICAgICAgICAgICAgICAgICAgIC8vIE5vdyBz
dGFydCBhIG5ldyBsaW5lLgogICAgICAgICAgICAgICAgICAgICBpbmxpbmVNaW4gPSAwOworICAg
ICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLT5pc0Fub255
bW91c0lubGluZUJsb2NrKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRlcm1pbmF0
ZSBtYXggd2lkdGggYXMgd2VsbC4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fbWF4UHJlZldp
ZHRoID0gbWF4KGNoaWxkTWF4LCBtX21heFByZWZXaWR0aCk7CisgICAgICAgICAgICAgICAgICAg
ICAgICBpbmxpbmVNYXggPSAwOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAg
ICAgfQogCiAgICAgICAgICAgICAgICAgLy8gV2UgYXJlIG5vIGxvbmdlciBzdHJpcHBpbmcgd2hp
dGVzcGFjZSBhdCB0aGUgc3RhcnQgb2YKQEAgLTQzMjAsOSArNDI3MSwxMiBAQCBpbnQgUmVuZGVy
QmxvY2s6OmxpbmVIZWlnaHQoYm9vbCBmaXJzdExpCiAgICAgLy8gdGhlIGJhc2UgY2xhc3MuICBJ
ZiB3ZSdyZSBiZWluZyBxdWVyaWVkIGFzIHRob3VnaCB3ZSdyZSB0aGUgcm9vdCBsaW5lCiAgICAg
Ly8gYm94LCB0aGVuIHRoZSBmYWN0IHRoYXQgd2UncmUgYW4gaW5saW5lLWJsb2NrIGlzIGlycmVs
ZXZhbnQsIGFuZCB3ZSBiZWhhdmUKICAgICAvLyBqdXN0IGxpa2UgYSBibG9jay4KLSAgICBpZiAo
aXNSZXBsYWNlZCgpICYmICFpc1Jvb3RMaW5lQm94KQorICAgIGlmIChpc1JlcGxhY2VkKCkgJiYg
IWlzUm9vdExpbmVCb3gpIHsKKyAgICAgICAgaWYgKGlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkK
KyAgICAgICAgICAgIHJldHVybiBoZWlnaHQoKTsKICAgICAgICAgcmV0dXJuIGhlaWdodCgpICsg
bWFyZ2luVG9wKCkgKyBtYXJnaW5Cb3R0b20oKTsKLSAgICAKKyAgICB9CisKICAgICBpZiAoZmly
c3RMaW5lICYmIGRvY3VtZW50KCktPnVzZXNGaXJzdExpbmVSdWxlcygpKSB7CiAgICAgICAgIFJl
bmRlclN0eWxlKiBzID0gc3R5bGUoZmlyc3RMaW5lKTsKICAgICAgICAgaWYgKHMgIT0gc3R5bGUo
KSkKQEAgLTQzNTQsNiArNDMwOCw4IEBAIGludCBSZW5kZXJCbG9jazo6YmFzZWxpbmVQb3NpdGlv
bihib29sIGIKICAgICAgICAgLy8gV2UgYWxzbyBnaXZlIHVwIG9uIGZpbmRpbmcgYSBiYXNlbGlu
ZSBpZiB3ZSBoYXZlIGEgdmVydGljYWwgc2Nyb2xsYmFyLCBvciBpZiB3ZSBhcmUgc2Nyb2xsZWQK
ICAgICAgICAgLy8gdmVydGljYWxseSAoZS5nLiwgYW4gb3ZlcmZsb3c6aGlkZGVuIGJsb2NrIHRo
YXQgaGFzIGhhZCBzY3JvbGxUb3AgbW92ZWQpIG9yIGlmIHRoZSBiYXNlbGluZSBpcyBvdXRzaWRl
CiAgICAgICAgIC8vIG9mIG91ciBjb250ZW50IGJveC4KKyAgICAgICAgaWYgKGlzQW5vbnltb3Vz
SW5saW5lQmxvY2soKSkKKyAgICAgICAgICAgIHJldHVybiBoZWlnaHQoKTsKICAgICAgICAgaW50
IGJhc2VsaW5lUG9zID0gKGxheWVyKCkgJiYgKGxheWVyKCktPm1hcnF1ZWUoKSB8fCBsYXllcigp
LT52ZXJ0aWNhbFNjcm9sbGJhcigpIHx8IGxheWVyKCktPnNjcm9sbFlPZmZzZXQoKSAhPSAwKSkg
PyAtMSA6IGxhc3RMaW5lQm94QmFzZWxpbmUoKTsKICAgICAgICAgaWYgKGJhc2VsaW5lUG9zICE9
IC0xICYmIGJhc2VsaW5lUG9zIDw9IGJvcmRlclRvcCgpICsgcGFkZGluZ1RvcCgpICsgY29udGVu
dEhlaWdodCgpKQogICAgICAgICAgICAgcmV0dXJuIG1hcmdpblRvcCgpICsgYmFzZWxpbmVQb3M7
CkBAIC00Nzc4LDYwICs0NzM0LDYgQEAgdm9pZCBSZW5kZXJCbG9jazo6c2V0TWF4Qm90dG9tTWFy
Z2lucyhpbgogICAgIG1fbWF4TWFyZ2luLT5tX2JvdHRvbU5lZyA9IG5lZzsKIH0KIAotdm9pZCBS
ZW5kZXJCbG9jazo6YWJzb2x1dGVSZWN0cyhWZWN0b3I8SW50UmVjdD4mIHJlY3RzLCBpbnQgdHgs
IGludCB0eSkKLXsKLSAgICAvLyBGb3IgYmxvY2tzIGluc2lkZSBpbmxpbmVzLCB3ZSBnbyBhaGVh
ZCBhbmQgaW5jbHVkZSBtYXJnaW5zIHNvIHRoYXQgd2UgcnVuIHJpZ2h0IHVwIHRvIHRoZQotICAg
IC8vIGlubGluZSBib3hlcyBhYm92ZSBhbmQgYmVsb3cgdXMgKHRodXMgZ2V0dGluZyBtZXJnZWQg
d2l0aCB0aGVtIHRvIGZvcm0gYSBzaW5nbGUgaXJyZWd1bGFyCi0gICAgLy8gc2hhcGUpLgotICAg
IGlmIChpbmxpbmVDb250aW51YXRpb24oKSkgewotICAgICAgICByZWN0cy5hcHBlbmQoSW50UmVj
dCh0eCwgdHkgLSBjb2xsYXBzZWRNYXJnaW5Ub3AoKSwKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgd2lkdGgoKSwgaGVpZ2h0KCkgKyBjb2xsYXBzZWRNYXJnaW5Ub3AoKSArIGNvbGxhcHNl
ZE1hcmdpbkJvdHRvbSgpKSk7Ci0gICAgICAgIGlubGluZUNvbnRpbnVhdGlvbigpLT5hYnNvbHV0
ZVJlY3RzKHJlY3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICB0eCAtIHgoKSArIGlubGluZUNvbnRpbnVhdGlvbigpLT5jb250YWluaW5nQmxvY2soKS0+eCgp
LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eSAtIHkoKSAr
IGlubGluZUNvbnRpbnVhdGlvbigpLT5jb250YWluaW5nQmxvY2soKS0+eSgpKTsKLSAgICB9IGVs
c2UKLSAgICAgICAgcmVjdHMuYXBwZW5kKEludFJlY3QodHgsIHR5LCB3aWR0aCgpLCBoZWlnaHQo
KSkpOwotfQotCi12b2lkIFJlbmRlckJsb2NrOjphYnNvbHV0ZVF1YWRzKFZlY3RvcjxGbG9hdFF1
YWQ+JiBxdWFkcykKLXsKLSAgICAvLyBGb3IgYmxvY2tzIGluc2lkZSBpbmxpbmVzLCB3ZSBnbyBh
aGVhZCBhbmQgaW5jbHVkZSBtYXJnaW5zIHNvIHRoYXQgd2UgcnVuIHJpZ2h0IHVwIHRvIHRoZQot
ICAgIC8vIGlubGluZSBib3hlcyBhYm92ZSBhbmQgYmVsb3cgdXMgKHRodXMgZ2V0dGluZyBtZXJn
ZWQgd2l0aCB0aGVtIHRvIGZvcm0gYSBzaW5nbGUgaXJyZWd1bGFyCi0gICAgLy8gc2hhcGUpLgot
ICAgIGlmIChpbmxpbmVDb250aW51YXRpb24oKSkgewotICAgICAgICBGbG9hdFJlY3QgbG9jYWxS
ZWN0KDAsIC1jb2xsYXBzZWRNYXJnaW5Ub3AoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICB3aWR0aCgpLCBoZWlnaHQoKSArIGNvbGxhcHNlZE1hcmdpblRvcCgpICsgY29sbGFwc2VkTWFy
Z2luQm90dG9tKCkpOwotICAgICAgICBxdWFkcy5hcHBlbmQobG9jYWxUb0Fic29sdXRlUXVhZChs
b2NhbFJlY3QpKTsKLSAgICAgICAgaW5saW5lQ29udGludWF0aW9uKCktPmFic29sdXRlUXVhZHMo
cXVhZHMpOwotICAgIH0gZWxzZQotICAgICAgICBxdWFkcy5hcHBlbmQoUmVuZGVyQm94Ojpsb2Nh
bFRvQWJzb2x1dGVRdWFkKEZsb2F0UmVjdCgwLCAwLCB3aWR0aCgpLCBoZWlnaHQoKSkpKTsKLX0K
LQotSW50UmVjdCBSZW5kZXJCbG9jazo6cmVjdFdpdGhPdXRsaW5lRm9yUmVwYWludChSZW5kZXJC
b3hNb2RlbE9iamVjdCogcmVwYWludENvbnRhaW5lciwgaW50IG91dGxpbmVXaWR0aCkKLXsKLSAg
ICBJbnRSZWN0IHIoUmVuZGVyQm94OjpyZWN0V2l0aE91dGxpbmVGb3JSZXBhaW50KHJlcGFpbnRD
b250YWluZXIsIG91dGxpbmVXaWR0aCkpOwotICAgIGlmIChpbmxpbmVDb250aW51YXRpb24oKSkK
LSAgICAgICAgci5pbmZsYXRlWShjb2xsYXBzZWRNYXJnaW5Ub3AoKSk7Ci0gICAgcmV0dXJuIHI7
Ci19Ci0KLVJlbmRlck9iamVjdCogUmVuZGVyQmxvY2s6OmhvdmVyQW5jZXN0b3IoKSBjb25zdAot
ewotICAgIHJldHVybiBpbmxpbmVDb250aW51YXRpb24oKSA/IGlubGluZUNvbnRpbnVhdGlvbigp
IDogUmVuZGVyQm94Ojpob3ZlckFuY2VzdG9yKCk7Ci19Ci0KLXZvaWQgUmVuZGVyQmxvY2s6OnVw
ZGF0ZURyYWdTdGF0ZShib29sIGRyYWdPbikKLXsKLSAgICBSZW5kZXJCb3g6OnVwZGF0ZURyYWdT
dGF0ZShkcmFnT24pOwotICAgIGlmIChpbmxpbmVDb250aW51YXRpb24oKSkKLSAgICAgICAgaW5s
aW5lQ29udGludWF0aW9uKCktPnVwZGF0ZURyYWdTdGF0ZShkcmFnT24pOwotfQotCi1SZW5kZXJT
dHlsZSogUmVuZGVyQmxvY2s6Om91dGxpbmVTdHlsZUZvclJlcGFpbnQoKSBjb25zdAotewotICAg
IHJldHVybiBpbmxpbmVDb250aW51YXRpb24oKSA/IGlubGluZUNvbnRpbnVhdGlvbigpLT5zdHls
ZSgpIDogc3R5bGUoKTsKLX0KLQogdm9pZCBSZW5kZXJCbG9jazo6Y2hpbGRCZWNhbWVOb25Jbmxp
bmUoUmVuZGVyT2JqZWN0KikKIHsKICAgICBtYWtlQ2hpbGRyZW5Ob25JbmxpbmUoKTsKQEAgLTQ4
NDAsMjYgKzQ3NDIsNiBAQCB2b2lkIFJlbmRlckJsb2NrOjpjaGlsZEJlY2FtZU5vbklubGluZShS
CiAgICAgLy8gfHRoaXN8IG1heSBiZSBkZWFkIGhlcmUKIH0KIAotdm9pZCBSZW5kZXJCbG9jazo6
dXBkYXRlSGl0VGVzdFJlc3VsdChIaXRUZXN0UmVzdWx0JiByZXN1bHQsIGNvbnN0IEludFBvaW50
JiBwb2ludCkKLXsKLSAgICBpZiAocmVzdWx0LmlubmVyTm9kZSgpKQotICAgICAgICByZXR1cm47
Ci0KLSAgICBOb2RlKiBuID0gbm9kZSgpOwotICAgIGlmIChpbmxpbmVDb250aW51YXRpb24oKSkK
LSAgICAgICAgLy8gV2UgYXJlIGluIHRoZSBtYXJnaW5zIG9mIGJsb2NrIGVsZW1lbnRzIHRoYXQg
YXJlIHBhcnQgb2YgYSBjb250aW51YXRpb24uICBJbgotICAgICAgICAvLyB0aGlzIGNhc2Ugd2Un
cmUgYWN0dWFsbHkgc3RpbGwgaW5zaWRlIHRoZSBlbmNsb3NpbmcgaW5saW5lIGVsZW1lbnQgdGhh
dCB3YXMKLSAgICAgICAgLy8gc3BsaXQuICBHbyBhaGVhZCBhbmQgc2V0IG91ciBpbm5lciBub2Rl
IGFjY29yZGluZ2x5LgotICAgICAgICBuID0gaW5saW5lQ29udGludWF0aW9uKCktPm5vZGUoKTsK
LQotICAgIGlmIChuKSB7Ci0gICAgICAgIHJlc3VsdC5zZXRJbm5lck5vZGUobik7Ci0gICAgICAg
IGlmICghcmVzdWx0LmlubmVyTm9uU2hhcmVkTm9kZSgpKQotICAgICAgICAgICAgcmVzdWx0LnNl
dElubmVyTm9uU2hhcmVkTm9kZShuKTsKLSAgICAgICAgcmVzdWx0LnNldExvY2FsUG9pbnQocG9p
bnQpOwotICAgIH0KLX0KLQogSW50UmVjdCBSZW5kZXJCbG9jazo6bG9jYWxDYXJldFJlY3QoSW5s
aW5lQm94KiBpbmxpbmVCb3gsIGludCBjYXJldE9mZnNldCwgaW50KiBleHRyYVdpZHRoVG9FbmRP
ZkxpbmUpCiB7CiAgICAgLy8gRG8gdGhlIG5vcm1hbCBjYWxjdWxhdGlvbiBpbiBtb3N0IGNhc2Vz
LgpAQCAtNDk0MywxNyArNDgyNSw3IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmFkZEZvY3VzUmluZ1Jl
Y3RzKEdyYXAKICAgICAvLyBGb3IgYmxvY2tzIGluc2lkZSBpbmxpbmVzLCB3ZSBnbyBhaGVhZCBh
bmQgaW5jbHVkZSBtYXJnaW5zIHNvIHRoYXQgd2UgcnVuIHJpZ2h0IHVwIHRvIHRoZQogICAgIC8v
IGlubGluZSBib3hlcyBhYm92ZSBhbmQgYmVsb3cgdXMgKHRodXMgZ2V0dGluZyBtZXJnZWQgd2l0
aCB0aGVtIHRvIGZvcm0gYSBzaW5nbGUgaXJyZWd1bGFyCiAgICAgLy8gc2hhcGUpLgotICAgIGlm
IChpbmxpbmVDb250aW51YXRpb24oKSkgewotICAgICAgICAvLyBGSVhNRTogVGhpcyBjaGVjayBy
ZWFsbHkgaXNuJ3QgYWNjdXJhdGUuIAotICAgICAgICBib29sIG5leHRJbmxpbmVIYXNMaW5lQm94
ID0gaW5saW5lQ29udGludWF0aW9uKCktPmZpcnN0TGluZUJveCgpOwotICAgICAgICAvLyBGSVhN
RTogVGhpcyBpcyB3cm9uZy4gVGhlIHByaW5jaXBhbCByZW5kZXJlciBtYXkgbm90IGJlIHRoZSBj
b250aW51YXRpb24gcHJlY2VkaW5nIHRoaXMgYmxvY2suCi0gICAgICAgIGJvb2wgcHJldklubGlu
ZUhhc0xpbmVCb3ggPSB0b1JlbmRlcklubGluZShpbmxpbmVDb250aW51YXRpb24oKS0+bm9kZSgp
LT5yZW5kZXJlcigpKS0+Zmlyc3RMaW5lQm94KCk7IAotICAgICAgICBpbnQgdG9wTWFyZ2luID0g
cHJldklubGluZUhhc0xpbmVCb3ggPyBjb2xsYXBzZWRNYXJnaW5Ub3AoKSA6IDA7Ci0gICAgICAg
IGludCBib3R0b21NYXJnaW4gPSBuZXh0SW5saW5lSGFzTGluZUJveCA/IGNvbGxhcHNlZE1hcmdp
bkJvdHRvbSgpIDogMDsKLSAgICAgICAgZ3JhcGhpY3NDb250ZXh0LT5hZGRGb2N1c1JpbmdSZWN0
KEludFJlY3QodHgsIHR5IC0gdG9wTWFyZ2luLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgoKSwgaGVpZ2h0KCkgKyB0b3BNYXJnaW4gKyBi
b3R0b21NYXJnaW4pKTsKLSAgICB9IGVsc2UKLSAgICAgICAgZ3JhcGhpY3NDb250ZXh0LT5hZGRG
b2N1c1JpbmdSZWN0KEludFJlY3QodHgsIHR5LCB3aWR0aCgpLCBoZWlnaHQoKSkpOworICAgIGdy
YXBoaWNzQ29udGV4dC0+YWRkRm9jdXNSaW5nUmVjdChJbnRSZWN0KHR4LCB0eSwgd2lkdGgoKSwg
aGVpZ2h0KCkpKTsKIAogICAgIGlmICghaGFzT3ZlcmZsb3dDbGlwKCkgJiYgIWhhc0NvbnRyb2xD
bGlwKCkpIHsKICAgICAgICAgZm9yIChSb290SW5saW5lQm94KiBjdXJyID0gZmlyc3RSb290Qm94
KCk7IGN1cnI7IGN1cnIgPSBjdXJyLT5uZXh0Um9vdEJveCgpKSB7CkBAIC00OTc1LDExICs0ODQ3
LDYgQEAgdm9pZCBSZW5kZXJCbG9jazo6YWRkRm9jdXNSaW5nUmVjdHMoR3JhcAogICAgICAgICAg
ICAgfQogICAgICAgICB9CiAgICAgfQotCi0gICAgaWYgKGlubGluZUNvbnRpbnVhdGlvbigpKQot
ICAgICAgICBpbmxpbmVDb250aW51YXRpb24oKS0+YWRkRm9jdXNSaW5nUmVjdHMoZ3JhcGhpY3ND
b250ZXh0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHR4IC0geCgpICsgaW5saW5lQ29udGludWF0aW9uKCktPmNvbnRhaW5pbmdCbG9jaygpLT54KCks
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eSAtIHko
KSArIGlubGluZUNvbnRpbnVhdGlvbigpLT5jb250YWluaW5nQmxvY2soKS0+eSgpKTsKIH0KIAog
UmVuZGVyQmxvY2sqIFJlbmRlckJsb2NrOjpjcmVhdGVBbm9ueW1vdXNCbG9jayhib29sIGlzRmxl
eGlibGVCb3gpIGNvbnN0CkBAIC01MDExLDYgKzQ4NzgsOCBAQCBjb25zdCBjaGFyKiBSZW5kZXJC
bG9jazo6cmVuZGVyTmFtZSgpIGNvCiAgICAgICAgIHJldHVybiAiUmVuZGVyQmxvY2sgKHBvc2l0
aW9uZWQpIjsKICAgICBpZiAoaXNBbm9ueW1vdXNCbG9jaygpKQogICAgICAgICByZXR1cm4gIlJl
bmRlckJsb2NrIChhbm9ueW1vdXMpIjsKKyAgICBlbHNlIGlmIChpc0Fub255bW91c0lubGluZUJs
b2NrKCkpCisgICAgICAgIHJldHVybiAiUmVuZGVyQmxvY2sgKGFub255bW91cyBpbmxpbmUtYmxv
Y2spIjsKICAgICBlbHNlIGlmIChpc0Fub255bW91cygpKQogICAgICAgICByZXR1cm4gIlJlbmRl
ckJsb2NrIChnZW5lcmF0ZWQpIjsKICAgICBpZiAoaXNSZWxQb3NpdGlvbmVkKCkpCkluZGV4OiBX
ZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlckJsb2NrLmgJKHJldmlzaW9uIDQ3Njc4KQorKysgV2ViQ29yZS9yZW5kZXJp
bmcvUmVuZGVyQmxvY2suaAkod29ya2luZyBjb3B5KQpAQCAtMTMwLDE1ICsxMzAsMTUgQEAgcHVi
bGljOgogCiAgICAgdm9pZCBhZGp1c3RSZWN0Rm9yQ29sdW1ucyhJbnRSZWN0JikgY29uc3Q7CiAK
LSAgICB2b2lkIGFkZENvbnRpbnVhdGlvbldpdGhPdXRsaW5lKFJlbmRlcklubGluZSopOwotCi0g
ICAgUmVuZGVySW5saW5lKiBpbmxpbmVDb250aW51YXRpb24oKSBjb25zdCB7IHJldHVybiBtX2lu
bGluZUNvbnRpbnVhdGlvbjsgfQotICAgIHZvaWQgc2V0SW5saW5lQ29udGludWF0aW9uKFJlbmRl
cklubGluZSogYykgeyBtX2lubGluZUNvbnRpbnVhdGlvbiA9IGM7IH0KLQogICAgIC8vIFRoaXMg
ZnVuY3Rpb24gaXMgYSBjb252ZW5pZW5jZSBoZWxwZXIgZm9yIGNyZWF0aW5nIGFuIGFub255bW91
cyBibG9jayB0aGF0IGluaGVyaXRzIGl0cwogICAgIC8vIHN0eWxlIGZyb20gdGhpcyBSZW5kZXJC
bG9jay4KICAgICBSZW5kZXJCbG9jayogY3JlYXRlQW5vbnltb3VzQmxvY2soYm9vbCBpc0ZsZXhp
YmxlQm94ID0gZmFsc2UpIGNvbnN0OwogCisgICAgdmlydHVhbCB2b2lkIHBhaW50KFBhaW50SW5m
byYsIGludCB0eCwgaW50IHR5KTsKKyAgICB2aXJ0dWFsIHZvaWQgcGFpbnRPYmplY3QoUGFpbnRJ
bmZvJiwgaW50IHR4LCBpbnQgdHkpOworCisgICAgYm9vbCBpblJvb3RCbG9ja0NvbnRleHQoKSBj
b25zdDsKKwogcHJvdGVjdGVkOgogICAgIGludCBtYXhUb3BQb3NNYXJnaW4oKSBjb25zdCB7IHJl
dHVybiBtX21heE1hcmdpbiA/IG1fbWF4TWFyZ2luLT5tX3RvcFBvcyA6IE1heE1hcmdpbjo6dG9w
UG9zRGVmYXVsdCh0aGlzKTsgfQogICAgIGludCBtYXhUb3BOZWdNYXJnaW4oKSBjb25zdCB7IHJl
dHVybiBtX21heE1hcmdpbiA/IG1fbWF4TWFyZ2luLT5tX3RvcE5lZyA6IE1heE1hcmdpbjo6dG9w
TmVnRGVmYXVsdCh0aGlzKTsgfQpAQCAtMTYxLDkgKzE2MSw2IEBAIHByb3RlY3RlZDoKIAogICAg
IHZvaWQgbGF5b3V0UG9zaXRpb25lZE9iamVjdHMoYm9vbCByZWxheW91dENoaWxkcmVuKTsKIAot
ICAgIHZpcnR1YWwgdm9pZCBwYWludChQYWludEluZm8mLCBpbnQgdHgsIGludCB0eSk7Ci0gICAg
dmlydHVhbCB2b2lkIHBhaW50T2JqZWN0KFBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5KTsKLQog
ICAgIGludCByaWdodFJlbE9mZnNldChpbnQgeSwgaW50IGZpeGVkT2Zmc2V0LCBib29sIGFwcGx5
VGV4dEluZGVudCA9IHRydWUsIGludCogaGVpZ2h0UmVtYWluaW5nID0gMCkgY29uc3Q7CiAgICAg
aW50IGxlZnRSZWxPZmZzZXQoaW50IHksIGludCBmaXhlZE9mZnNldCwgYm9vbCBhcHBseVRleHRJ
bmRlbnQgPSB0cnVlLCBpbnQqIGhlaWdodFJlbWFpbmluZyA9IDApIGNvbnN0OwogCkBAIC0xNzYs
OCArMTczLDYgQEAgcHJvdGVjdGVkOgogCiAgICAgdmlydHVhbCB2b2lkIHVwZGF0ZUZpcnN0TGV0
dGVyKCk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlSGl0VGVzdFJlc3VsdChIaXRUZXN0UmVz
dWx0JiwgY29uc3QgSW50UG9pbnQmKTsKLQogICAgIC8vIERlbGF5IHVwZGF0ZSBzY3JvbGxiYXIg
dW50aWwgZmluaXNoRGVsYXlSZXBhaW50KCkgd2lsbCBiZQogICAgIC8vIGNhbGxlZC4gVGhpcyBm
dW5jdGlvbiBpcyB1c2VkIHdoZW4gYSBmbGV4Ym94IGlzIGxheWluZyBvdXQgaXRzCiAgICAgLy8g
ZGVzY2VuZGFudC4gSWYgbXVsdGlwbGUgY2FsbHMgYXJlIG1hZGUgdG8gc3RhcnREZWxheVJlcGFp
bnQoKSwKQEAgLTI0MSw3ICsyMzYsOSBAQCBwcml2YXRlOgogICAgICAgICBib29sIGV2ZXJIYWRM
YXlvdXQ7CiAgICAgfTsKIAotICAgIC8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zJyBpbXBsZW1l
bnRhdGlvbnMgYXJlIGluIFJlbmRlckJsb2NrTGluZUxheW91dC5jcHAuCisgICAgY2xhc3MgTWFy
Z2luSW5mbzsKKworICAgIC8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zJyBpbXBsZW1lbnRhdGlv
bnMgYXJlIGluIFJlbmRlckJsb2NrTGluZUxheW91dC5jcHAuICAgIAogICAgIHZvaWQgYmlkaVJl
b3JkZXJMaW5lKElubGluZUJpZGlSZXNvbHZlciYsIGNvbnN0IElubGluZUl0ZXJhdG9yJiBlbmQs
IGJvb2wgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KTsKICAgICBSb290SW5saW5lQm94KiBkZXRl
cm1pbmVTdGFydFBvc2l0aW9uKGJvb2wmIGZpcnN0TGluZSwgYm9vbCYgZnVsbExheW91dCwgYm9v
bCYgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgSW5saW5lQmlkaVJlc29sdmVyJiwgVmVjdG9yPEZsb2F0V2l0aFJlY3Q+
JiBmbG9hdHMsIHVuc2lnbmVkJiBudW1DbGVhbkZsb2F0cyk7CkBAIC0yNTQsNyArMjUxLDcgQEAg
cHJpdmF0ZToKICAgICB2b2lkIHNraXBUcmFpbGluZ1doaXRlc3BhY2UoSW5saW5lSXRlcmF0b3Im
LCBib29sIGlzTGluZUVtcHR5LCBib29sIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSk7CiAgICAg
aW50IHNraXBMZWFkaW5nV2hpdGVzcGFjZShJbmxpbmVCaWRpUmVzb2x2ZXImLCBib29sIGZpcnN0
TGluZSwgYm9vbCBpc0xpbmVFbXB0eSwgYm9vbCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHkpOwog
ICAgIHZvaWQgZml0QmVsb3dGbG9hdHMoaW50IHdpZHRoVG9GaXQsIGJvb2wgZmlyc3RMaW5lLCBp
bnQmIGF2YWlsYWJsZVdpZHRoKTsKLSAgICBJbmxpbmVJdGVyYXRvciBmaW5kTmV4dExpbmVCcmVh
ayhJbmxpbmVCaWRpUmVzb2x2ZXImLCBib29sIGZpcnN0TGluZSwgYm9vbCYgaXNMaW5lRW1wdHks
IGJvb2wmIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSwgRUNsZWFyKiBjbGVhciA9IDApOworICAg
IElubGluZUl0ZXJhdG9yIGZpbmROZXh0TGluZUJyZWFrKElubGluZUJpZGlSZXNvbHZlciYsIGJv
b2wgZmlyc3RMaW5lLCBib29sJiBpc0xpbmVFbXB0eSwgYm9vbCYgcHJldmlvdXNMaW5lQnJva2VD
bGVhbmx5LCBNYXJnaW5JbmZvJiwgRUNsZWFyKiBjbGVhciA9IDApOwogICAgIFJvb3RJbmxpbmVC
b3gqIGNvbnN0cnVjdExpbmUodW5zaWduZWQgcnVuQ291bnQsIEJpZGlSdW4qIGZpcnN0UnVuLCBC
aWRpUnVuKiBsYXN0UnVuLCBib29sIGZpcnN0TGluZSwgYm9vbCBsYXN0TGluZSwgUmVuZGVyT2Jq
ZWN0KiBlbmRPYmplY3QpOwogICAgIElubGluZUZsb3dCb3gqIGNyZWF0ZUxpbmVCb3hlcyhSZW5k
ZXJPYmplY3QqLCBib29sIGZpcnN0TGluZSk7CiAgICAgdm9pZCBjb21wdXRlSG9yaXpvbnRhbFBv
c2l0aW9uc0ZvckxpbmUoUm9vdElubGluZUJveCosIGJvb2wgZmlyc3RMaW5lLCBCaWRpUnVuKiBm
aXJzdFJ1biwgQmlkaVJ1biogdHJhaWxpbmdTcGFjZVJ1biwgYm9vbCByZWFjaGVkRW5kKTsKQEAg
LTMwOSwxMyArMzA2LDcgQEAgcHJpdmF0ZToKICAgICAvLyBPYnRhaW5zIHRoZSBuZWFyZXN0IGVu
Y2xvc2luZyBibG9jayAoaW5jbHVkaW5nIHRoaXMgYmxvY2spIHRoYXQgY29udHJpYnV0ZXMgYSBm
aXJzdC1saW5lIHN0eWxlIHRvIG91ciBpbmxpbmUKICAgICAvLyBjaGlsZHJlbi4KICAgICB2aXJ0
dWFsIFJlbmRlckJsb2NrKiBmaXJzdExpbmVCbG9jaygpIGNvbnN0OwotICAgIGJvb2wgaW5Sb290
QmxvY2tDb250ZXh0KCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIEludFJlY3QgcmVjdFdpdGhPdXRs
aW5lRm9yUmVwYWludChSZW5kZXJCb3hNb2RlbE9iamVjdCogcmVwYWludENvbnRhaW5lciwgaW50
IG91dGxpbmVXaWR0aCk7Ci0gICAgdmlydHVhbCBSZW5kZXJTdHlsZSogb3V0bGluZVN0eWxlRm9y
UmVwYWludCgpIGNvbnN0OwogICAgIAotICAgIHZpcnR1YWwgUmVuZGVyT2JqZWN0KiBob3ZlckFu
Y2VzdG9yKCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZURyYWdTdGF0ZShib29sIGRy
YWdPbik7CiAgICAgdmlydHVhbCB2b2lkIGNoaWxkQmVjYW1lTm9uSW5saW5lKFJlbmRlck9iamVj
dCogY2hpbGQpOwogCiAgICAgdmlydHVhbCBJbnRSZWN0IHNlbGVjdGlvblJlY3RGb3JSZXBhaW50
KFJlbmRlckJveE1vZGVsT2JqZWN0KiByZXBhaW50Q29udGFpbmVyLCBib29sIC8qY2xpcFRvVmlz
aWJsZUNvbnRlbnQqLykKQEAgLTMzNSwxNiArMzI2LDExIEBAIHByaXZhdGU6CiAgICAgaW50IGxl
ZnRTZWxlY3Rpb25PZmZzZXQoUmVuZGVyQmxvY2sqIHJvb3RCbG9jaywgaW50IHkpOwogICAgIGlu
dCByaWdodFNlbGVjdGlvbk9mZnNldChSZW5kZXJCbG9jayogcm9vdEJsb2NrLCBpbnQgeSk7CiAK
LSAgICB2aXJ0dWFsIHZvaWQgYWJzb2x1dGVSZWN0cyhWZWN0b3I8SW50UmVjdD4mLCBpbnQgdHgs
IGludCB0eSk7Ci0gICAgdmlydHVhbCB2b2lkIGFic29sdXRlUXVhZHMoVmVjdG9yPEZsb2F0UXVh
ZD4mKTsKLQogICAgIGludCBkZXNpcmVkQ29sdW1uV2lkdGgoKSBjb25zdDsKICAgICB1bnNpZ25l
ZCBkZXNpcmVkQ29sdW1uQ291bnQoKSBjb25zdDsKICAgICBWZWN0b3I8SW50UmVjdD4qIGNvbHVt
blJlY3RzKCkgY29uc3Q7CiAgICAgdm9pZCBzZXREZXNpcmVkQ29sdW1uQ291bnRBbmRXaWR0aChp
bnQgY291bnQsIGludCB3aWR0aCk7CiAgICAgaW50IGNvbHVtbkdhcCgpIGNvbnN0OwotICAgIAot
ICAgIHZvaWQgcGFpbnRDb250aW51YXRpb25PdXRsaW5lcyhQYWludEluZm8mLCBpbnQgdHgsIGlu
dCB0eSk7CiAKICAgICB2aXJ0dWFsIEludFJlY3QgbG9jYWxDYXJldFJlY3QoSW5saW5lQm94Kiwg
aW50IGNhcmV0T2Zmc2V0LCBpbnQqIGV4dHJhV2lkdGhUb0VuZE9mTGluZSA9IDApOwogCkBAIC00
ODAsMTIgKzQ2Niw2IEBAIHByaXZhdGU6CiAgICAgRGVwcmVjYXRlZFB0ckxpc3Q8RmxvYXRpbmdP
YmplY3Q+KiBtX2Zsb2F0aW5nT2JqZWN0czsKICAgICBMaXN0SGFzaFNldDxSZW5kZXJCb3gqPiog
bV9wb3NpdGlvbmVkT2JqZWN0czsKIAotICAgIC8vIEFuIGlubGluZSBjYW4gYmUgc3BsaXQgd2l0
aCBibG9ja3Mgb2NjdXJyaW5nIGluIGJldHdlZW4gdGhlIGlubGluZSBjb250ZW50LgotICAgIC8v
IFdoZW4gdGhpcyBvY2N1cnMgd2UgbmVlZCBhIHBvaW50ZXIgdG8gb3VyIG5leHQgb2JqZWN0LiAg
V2UgY2FuIGJhc2ljYWxseSBiZQotICAgIC8vIHNwbGl0IGludG8gYSBzZXF1ZW5jZSBvZiBpbmxp
bmVzIGFuZCBibG9ja3MuICBUaGUgY29udGludWF0aW9uIHdpbGwgZWl0aGVyIGJlCi0gICAgLy8g
YW4gYW5vbnltb3VzIGJsb2NrICh0aGF0IGhvdXNlcyBvdGhlciBibG9ja3MpIG9yIGl0IHdpbGwg
YmUgYW4gaW5saW5lIGZsb3cuCi0gICAgUmVuZGVySW5saW5lKiBtX2lubGluZUNvbnRpbnVhdGlv
bjsKLQogICAgIC8vIEFsbG9jYXRlZCBvbmx5IHdoZW4gc29tZSBvZiB0aGVzZSBmaWVsZHMgaGF2
ZSBub24tZGVmYXVsdCB2YWx1ZXMKICAgICBzdHJ1Y3QgTWF4TWFyZ2luIHsKICAgICAgICAgTWF4
TWFyZ2luKGNvbnN0IFJlbmRlckJsb2NrKiBvKSAKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1Jl
bmRlckJsb2NrTGluZUxheW91dC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcv
UmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcAkocmV2aXNpb24gNDc1OTEpCisrKyBXZWJDb3JlL3Jl
bmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01NzAs
MTIgKzU3MCwxNiBAQCBSb290SW5saW5lQm94KiBSZW5kZXJCbG9jazo6Y29uc3RydWN0TGluCiAg
ICAgICAgIGlmICghYm94KQogICAgICAgICAgICAgY29udGludWU7CiAKKyAgICAgICAgLy8gQW5v
bnltb3VzIGlubGluZSBibG9ja3MgKHVzZWQgdG8gaG9sZCBibG9ja3MgaW5zaWRlIGlubGluZXMp
IGRvbid0IG5lZWQgdG8gd2FzdGUgdGltZSB3cmFwcGluZworICAgICAgICAvLyB0aGVtc2VsdmVz
IGluIHRob3NlIGlubGluZXMgKHNpbmNlIHdlIHdhbnQgdG8gcHJldGVuZCBsaWtlIHRoZXkgZG9u
J3QgZXhpc3Qgb24gdGhpcyBmYWtlIGxpbmUpLgorICAgICAgICBSZW5kZXJPYmplY3QqIGFuY2Vz
dG9yUmVuZGVyZXIgPSByLT5tX29iamVjdC0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpID8gdGhp
cyA6IHItPm1fb2JqZWN0LT5wYXJlbnQoKTsKKyAKICAgICAgICAgLy8gSWYgd2UgaGF2ZSBubyBw
YXJlbnQgYm94IHlldCwgb3IgaWYgdGhlIHJ1biBpcyBub3Qgc2ltcGx5IGEgc2libGluZywKICAg
ICAgICAgLy8gdGhlbiB3ZSBuZWVkIHRvIGNvbnN0cnVjdCBpbmxpbmUgYm94ZXMgYXMgbmVjZXNz
YXJ5IHRvIHByb3Blcmx5IGVuY2xvc2UgdGhlCiAgICAgICAgIC8vIHJ1bidzIGlubGluZSBib3gu
Ci0gICAgICAgIGlmICghcGFyZW50Qm94IHx8IHBhcmVudEJveC0+cmVuZGVyZXIoKSAhPSByLT5t
X29iamVjdC0+cGFyZW50KCkpCisgICAgICAgIGlmICghcGFyZW50Qm94IHx8IHBhcmVudEJveC0+
cmVuZGVyZXIoKSAhPSBhbmNlc3RvclJlbmRlcmVyKQogICAgICAgICAgICAgLy8gQ3JlYXRlIG5l
dyBpbmxpbmUgYm94ZXMgYWxsIHRoZSB3YXkgYmFjayB0byB0aGUgYXBwcm9wcmlhdGUgaW5zZXJ0
aW9uIHBvaW50LgotICAgICAgICAgICAgcGFyZW50Qm94ID0gY3JlYXRlTGluZUJveGVzKHItPm1f
b2JqZWN0LT5wYXJlbnQoKSwgZmlyc3RMaW5lKTsKKyAgICAgICAgICAgIHBhcmVudEJveCA9IGNy
ZWF0ZUxpbmVCb3hlcyhhbmNlc3RvclJlbmRlcmVyLCBmaXJzdExpbmUpOwogCiAgICAgICAgIC8v
IEFwcGVuZCB0aGUgaW5saW5lIGJveCB0byB0aGlzIGxpbmUuCiAgICAgICAgIHBhcmVudEJveC0+
YWRkVG9MaW5lKGJveCk7CkBAIC02MTcsNiArNjIxLDggQEAgdm9pZCBSZW5kZXJCbG9jazo6Y29t
cHV0ZUhvcml6b250YWxQb3NpdAogICAgIHVuc2lnbmVkIG51bVNwYWNlcyA9IDA7CiAgICAgRVRl
eHRBbGlnbiB0ZXh0QWxpZ24gPSBzdHlsZSgpLT50ZXh0QWxpZ24oKTsKIAorICAgIGludCB4ID0g
bGVmdE9mZnNldChoZWlnaHQoKSwgZmlyc3RMaW5lKTsKKwogICAgIGZvciAoQmlkaVJ1biogciA9
IGZpcnN0UnVuOyByOyByID0gci0+bmV4dCgpKSB7CiAgICAgICAgIGlmICghci0+bV9ib3ggfHwg
ci0+bV9vYmplY3QtPmlzUG9zaXRpb25lZCgpIHx8IHItPm1fYm94LT5pc0xpbmVCcmVhaygpKQog
ICAgICAgICAgICAgY29udGludWU7IC8vIFBvc2l0aW9uZWQgb2JqZWN0cyBhcmUgb25seSBwYXJ0
aWNpcGF0aW5nIHRvIGZpZ3VyZSBvdXQgdGhlaXIKQEAgLTY1NCw2ICs2NjAsMTIgQEAgdm9pZCBS
ZW5kZXJCbG9jazo6Y29tcHV0ZUhvcml6b250YWxQb3NpdAogICAgICAgICAgICAgcmVuZGVyQm94
LT5jYWxjV2lkdGgoKTsKICAgICAgICAgICAgIHItPm1fYm94LT5zZXRXaWR0aChyZW5kZXJCb3gt
PndpZHRoKCkpOwogICAgICAgICAgICAgdG90V2lkdGggKz0gcmVuZGVyQm94LT5tYXJnaW5MZWZ0
KCkgKyByZW5kZXJCb3gtPm1hcmdpblJpZ2h0KCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAg
IGlmIChyLT5tX29iamVjdC0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CisgICAgICAgICAg
ICAgICAgLy8gQWxsb3cgdGhlIGZ1bGwgYXZhaWxhYmxlIHdpZHRoIHRvIGJlIHVzZWQsIHNpbmNl
IGZsb2F0cyB3aWxsIGludHJ1ZGUgaW50byBvdXIgc3BhY2UuCisgICAgICAgICAgICAgICAgYXZh
aWxhYmxlV2lkdGggPSByaWdodE9mZnNldCgpIC0gbGVmdE9mZnNldCgpOworICAgICAgICAgICAg
ICAgIHggPSBsZWZ0T2Zmc2V0KCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAg
ICB0b3RXaWR0aCArPSByLT5tX2JveC0+d2lkdGgoKTsKQEAgLTY2Myw3ICs2NzUsNiBAQCB2b2lk
IFJlbmRlckJsb2NrOjpjb21wdXRlSG9yaXpvbnRhbFBvc2l0CiAgICAgLy8gd2Ugbm93IGV4YW1p
bmUgb3VyIHRleHQtYWxpZ24gcHJvcGVydHkgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIHdoZXJlIHRv
IHBvc2l0aW9uIHRoZQogICAgIC8vIG9iamVjdHMgaG9yaXpvbnRhbGx5LiAgVGhlIHRvdGFsIHdp
ZHRoIG9mIHRoZSBsaW5lIGNhbiBiZSBpbmNyZWFzZWQgaWYgd2UgZW5kIHVwCiAgICAgLy8ganVz
dGlmeWluZyB0ZXh0LgotICAgIGludCB4ID0gbGVmdE9mZnNldChoZWlnaHQoKSwgZmlyc3RMaW5l
KTsKICAgICBzd2l0Y2ggKHRleHRBbGlnbikgewogICAgICAgICBjYXNlIExFRlQ6CiAgICAgICAg
IGNhc2UgV0VCS0lUX0xFRlQ6CkBAIC04MTcsOSArODI4LDE1IEBAIHZvaWQgUmVuZGVyQmxvY2s6
OmxheW91dElubGluZUNoaWxkcmVuKGIKICAgICBib29sIHVzZVJlcGFpbnRCb3VuZHMgPSBmYWxz
ZTsKICAgICAKICAgICBtX292ZXJmbG93LmNsZWFyKCk7Ci0gICAgICAgIAotICAgIHNldEhlaWdo
dChib3JkZXJUb3AoKSArIHBhZGRpbmdUb3AoKSk7Ci0gICAgaW50IHRvQWRkID0gYm9yZGVyQm90
dG9tKCkgKyBwYWRkaW5nQm90dG9tKCkgKyBob3Jpem9udGFsU2Nyb2xsYmFySGVpZ2h0KCk7Cisg
ICAgCisgICAgaW50IHRvcCA9IGJvcmRlclRvcCgpICsgcGFkZGluZ1RvcCgpOworICAgIGludCBi
b3R0b20gPSBib3JkZXJCb3R0b20oKSArIHBhZGRpbmdCb3R0b20oKSArIGhvcml6b250YWxTY3Jv
bGxiYXJIZWlnaHQoKTsKKworICAgIHNldEhlaWdodCh0b3ApOworCisgICAgLy8gVGhlIG1hcmdp
biBzdHJ1Y3QgY2FjaGVzIGFsbCBvdXIgY3VycmVudCBtYXJnaW4gY29sbGFwc2luZyBzdGF0ZS4g
V2UgcnVuIG1hcmdpbiBjb2xsYXBzaW5nIHdoZW4gd2UgZW5jb3VudGVyIGFub255bW91cyBpbmxp
bmUgYmxvY2tzIHRoYXQgYXJlIGJlaW5nIHVzZWQKKyAgICAvLyBmb3IgdGhlIGJsb2Nrcy1pbnNp
ZGUtaW5saW5lcyBjYXNlIChhbmQgdGhlIGlubGluZXMgYXJlIGVtcHR5KSwgZS5nLCA8c3Bhbj48
ZGl2Pk9uZTwvZGl2Pjwvc3Bhbj4uCisgICAgTWFyZ2luSW5mbyBtYXJnaW5JbmZvKHRoaXMsIHRv
cCwgYm90dG9tKTsKIAogICAgIC8vIEZpZ3VyZSBvdXQgaWYgd2Ugc2hvdWxkIGNsZWFyIG91dCBv
dXIgbGluZSBib3hlcy4KICAgICAvLyBGSVhNRTogSGFuZGxlIHJlc2l6ZSBldmVudHVhbGx5IQpA
QCAtODQ3LDEyICs4NjQsMTUgQEAgdm9pZCBSZW5kZXJCbG9jazo6bGF5b3V0SW5saW5lQ2hpbGRy
ZW4oYgogICAgICAgICAgICAgaWYgKG8tPmlzUmVwbGFjZWQoKSB8fCBvLT5pc0Zsb2F0aW5nKCkg
fHwgby0+aXNQb3NpdGlvbmVkKCkpIHsKICAgICAgICAgICAgICAgICBSZW5kZXJCb3gqIGJveCA9
IHRvUmVuZGVyQm94KG8pOwogICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChy
ZWxheW91dENoaWxkcmVuIHx8IG8tPnN0eWxlKCktPndpZHRoKCkuaXNQZXJjZW50KCkgfHwgby0+
c3R5bGUoKS0+aGVpZ2h0KCkuaXNQZXJjZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIG8tPnNl
dENoaWxkTmVlZHNMYXlvdXQodHJ1ZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAKKyAg
ICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgbGF5b3V0IGNoaWxkcmVuIGlmIHRoZXkgbmVl
ZCBpdC4KKyAgICAgICAgICAgICAgICAvLyBGSVhNRTogVGVjaG5pY2FsbHkgcGVyY2VudGFnZSBo
ZWlnaHQgb2JqZWN0cyBvbmx5IG5lZWQgYSByZWxheW91dCBpZiB0aGVpciBwZXJjZW50YWdlIGlz
bid0IGdvaW5nIHRvIGJlIHR1cm5lZCBpbnRvCisgICAgICAgICAgICAgICAgLy8gYW4gYXV0byB2
YWx1ZS4gIEFkZCBhIG1ldGhvZCB0byBkZXRlcm1pbmUgdGhpcywgc28gdGhhdCB3ZSBjYW4gYXZv
aWQgdGhlIHJlbGF5b3V0LgorICAgICAgICAgICAgICAgIGlmIChyZWxheW91dENoaWxkcmVuIHx8
ICgoYm94LT5zdHlsZSgpLT5oZWlnaHQoKS5pc1BlcmNlbnQoKSB8fCBib3gtPnN0eWxlKCktPm1p
bkhlaWdodCgpLmlzUGVyY2VudCgpIHx8IGJveC0+c3R5bGUoKS0+bWF4SGVpZ2h0KCkuaXNQZXJj
ZW50KCkpKSkKKyAgICAgICAgICAgICAgICAgICAgYm94LT5zZXRDaGlsZE5lZWRzTGF5b3V0KHRy
dWUsIGZhbHNlKTsKKwogICAgICAgICAgICAgICAgIC8vIElmIHJlbGF5b3V0Q2hpbGRyZW4gaXMg
c2V0IGFuZCB3ZSBoYXZlIHBlcmNlbnRhZ2UgcGFkZGluZywgd2UgYWxzbyBuZWVkIHRvIGludmFs
aWRhdGUgdGhlIGNoaWxkJ3MgcHJlZiB3aWR0aHMuCi0gICAgICAgICAgICAgICAgaWYgKHJlbGF5
b3V0Q2hpbGRyZW4gJiYgKG8tPnN0eWxlKCktPnBhZGRpbmdMZWZ0KCkuaXNQZXJjZW50KCkgfHwg
by0+c3R5bGUoKS0+cGFkZGluZ1JpZ2h0KCkuaXNQZXJjZW50KCkpKQotICAgICAgICAgICAgICAg
ICAgICBvLT5zZXRQcmVmV2lkdGhzRGlydHkodHJ1ZSwgZmFsc2UpOworICAgICAgICAgICAgICAg
IGlmIChyZWxheW91dENoaWxkcmVuICYmIChib3gtPnN0eWxlKCktPnBhZGRpbmdMZWZ0KCkuaXNQ
ZXJjZW50KCkgfHwgYm94LT5zdHlsZSgpLT5wYWRkaW5nUmlnaHQoKS5pc1BlcmNlbnQoKSkpCisg
ICAgICAgICAgICAgICAgICAgIGJveC0+c2V0UHJlZldpZHRoc0RpcnR5KHRydWUsIGZhbHNlKTsK
ICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIGlmIChvLT5pc1Bvc2l0aW9uZWQoKSkKICAg
ICAgICAgICAgICAgICAgICAgby0+Y29udGFpbmluZ0Jsb2NrKCktPmluc2VydFBvc2l0aW9uZWRP
YmplY3QoYm94KTsKQEAgLTg2Miw3ICs4ODIsOCBAQCB2b2lkIFJlbmRlckJsb2NrOjpsYXlvdXRJ
bmxpbmVDaGlsZHJlbihiCiAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZ1bGxMYXlvdXQg
fHwgby0+bmVlZHNMYXlvdXQoKSkgLy8gUmVwbGFjZWQgZWxlbWVudHMKICAgICAgICAgICAgICAg
ICAgICAgICAgIHRvUmVuZGVyQm94KG8pLT5kaXJ0eUxpbmVCb3hlcyhmdWxsTGF5b3V0KTsKIAot
ICAgICAgICAgICAgICAgICAgICBvLT5sYXlvdXRJZk5lZWRlZCgpOworICAgICAgICAgICAgICAg
ICAgICBpZiAoIW8tPmlzUmVwbGFjZWQoKSB8fCAhby0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygp
KQorICAgICAgICAgICAgICAgICAgICAgICAgby0+bGF5b3V0SWZOZWVkZWQoKTsKICAgICAgICAg
ICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG8tPmlzVGV4dCgpIHx8IChvLT5pc1Jl
bmRlcklubGluZSgpICYmICFlbmRPZklubGluZSkpIHsKICAgICAgICAgICAgICAgICBpZiAoZnVs
bExheW91dCB8fCBvLT5zZWxmTmVlZHNMYXlvdXQoKSkKQEAgLTk1Niw3ICs5NzcsNyBAQCB2b2lk
IFJlbmRlckJsb2NrOjpsYXlvdXRJbmxpbmVDaGlsZHJlbihiCiAgICAgICAgICAgICBpc0xpbmVF
bXB0eSA9IHRydWU7CiAgICAgICAgICAgICAKICAgICAgICAgICAgIEVDbGVhciBjbGVhciA9IENO
T05FOwotICAgICAgICAgICAgZW5kID0gZmluZE5leHRMaW5lQnJlYWsocmVzb2x2ZXIsIGZpcnN0
TGluZSwgaXNMaW5lRW1wdHksIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSwgJmNsZWFyKTsKKyAg
ICAgICAgICAgIGVuZCA9IGZpbmROZXh0TGluZUJyZWFrKHJlc29sdmVyLCBmaXJzdExpbmUsIGlz
TGluZUVtcHR5LCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHksIG1hcmdpbkluZm8sICZjbGVhcik7
CiAgICAgICAgICAgICBpZiAocmVzb2x2ZXIucG9zaXRpb24oKS5hdEVuZCgpKSB7CiAgICAgICAg
ICAgICAgICAgcmVzb2x2ZXIuZGVsZXRlUnVucygpOwogICAgICAgICAgICAgICAgIGNoZWNrRm9y
RmxvYXRzRnJvbUxhc3RMaW5lID0gdHJ1ZTsKQEAgLTEwMjYsNiArMTA0NywxNCBAQCB2b2lkIFJl
bmRlckJsb2NrOjpsYXlvdXRJbmxpbmVDaGlsZHJlbihiCiAgICAgICAgICAgICAgICAgICAgIGlm
IChsaW5lQm94KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lQm94LT5zZXRFbmRzV2l0
aEJyZWFrKHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSk7CiAKKyAgICAgICAgICAgICAgICAgICAg
ICAgIC8vIElmIG91ciBwcmV2aW91cyBsaW5lIHdhcyBhbiBhbm9ueW1vdXMgYmxvY2sgYW5kIHdl
IGFyZSBub3QgYW4gYW5vbnltb3VzIGJsb2NrLCBzaW11bGF0ZSBhIG1hcmdpbiBjb2xsYXBzZSBu
b3cgc28gdGhhdCB3ZSBnZXQgdGhlIHByb3BlcgorICAgICAgICAgICAgICAgICAgICAgICAgLy8g
aW5jcmVhc2VkIGhlaWdodC4gIFdlIGFsc28gaGF2ZSB0byBzaW11bGF0ZSBhIG1hcmdpbiBjb2xs
YXBzZSB0byBwcm9wYWdhdGUgbWFyZ2lucyB0aHJvdWdoIHRvIHRoZSB0b3Agb2Ygb3VyIGJsb2Nr
LgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsaW5lQm94LT5hbm9ueW1vdXNJbmxpbmVC
bG9jaygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsaW5lQm94LT5wcmV2
Um9vdEJveCgpIHx8IGxpbmVCb3gtPnByZXZSb290Qm94KCktPmFub255bW91c0lubGluZUJsb2Nr
KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlTWFyZ2lucygwLCBt
YXJnaW5JbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW5JbmZvLnNldEF0
VG9wT2ZCbG9jayhmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAg
ICAgICAgICAgICAgICAgIC8vIE5vdyB3ZSBwb3NpdGlvbiBhbGwgb2Ygb3VyIHRleHQgcnVucyBo
b3Jpem9udGFsbHkuCiAgICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlSG9yaXpvbnRhbFBv
c2l0aW9uc0ZvckxpbmUobGluZUJveCwgZmlyc3RMaW5lLCByZXNvbHZlci5maXJzdFJ1bigpLCB0
cmFpbGluZ1NwYWNlUnVuLCBlbmQuYXRFbmQoKSk7CiAKQEAgLTExNDcsOCArMTE3NiwxNCBAQCB2
b2lkIFJlbmRlckJsb2NrOjpsYXlvdXRJbmxpbmVDaGlsZHJlbihiCiAgICAgICAgIH0KICAgICB9
CiAKLSAgICAvLyBOb3cgYWRkIGluIHRoZSBib3R0b20gYm9yZGVyL3BhZGRpbmcuCi0gICAgc2V0
SGVpZ2h0KGhlaWdodCgpICsgdG9BZGQpOworICAgIC8vIE5vdyBkbyB0aGUgaGFuZGxpbmcgb2Yg
dGhlIGJvdHRvbSBvZiB0aGUgYmxvY2ssIGFkZGluZyBpbiBvdXIgYm90dG9tIGJvcmRlci9wYWRk
aW5nIGFuZAorICAgIC8vIGRldGVybWluaW5nIHRoZSBjb3JyZWN0IGNvbGxhcHNlZCBib3R0b20g
bWFyZ2luIGluZm9ybWF0aW9uLiAgVGhpcyBjb2xsYXBzZSBpcyBvbmx5IG5lY2Vzc2FyeQorICAg
IC8vIGlmIG91ciBsYXN0IGNoaWxkIHdhcyBhbiBhbm9ueW1vdXMgaW5saW5lIGJsb2NrIHRoYXQg
bWlnaHQgbmVlZCB0byBwcm9wYWdhdGUgbWFyZ2luIGluZm9ybWF0aW9uIG91dCB0bworICAgIC8v
IHVzLgorICAgIGlmIChsYXN0Um9vdEJveCgpICYmIGxhc3RSb290Qm94KCktPmFub255bW91c0lu
bGluZUJsb2NrKCkpCisgICAgICAgIGhhbmRsZUJvdHRvbU9mQmxvY2sodG9wLCBib3R0b20sIG1h
cmdpbkluZm8pOworICAgIGVsc2UKKyAgICAgICAgc2V0SGVpZ2h0KGhlaWdodCgpICsgYm90dG9t
KTsKIAogICAgIGlmICghZmlyc3RMaW5lQm94KCkgJiYgaGFzTGluZUlmRW1wdHkoKSkKICAgICAg
ICAgc2V0SGVpZ2h0KGhlaWdodCgpICsgbGluZUhlaWdodCh0cnVlLCB0cnVlKSk7CkBAIC0xMTY5
LDYgKzEyMDQsMTIgQEAgUm9vdElubGluZUJveCogUmVuZGVyQmxvY2s6OmRldGVybWluZVN0YQog
ICAgIGlmICghZnVsbExheW91dCkgewogICAgICAgICBzaXplX3QgZmxvYXRJbmRleCA9IDA7CiAg
ICAgICAgIGZvciAoY3VyciA9IGZpcnN0Um9vdEJveCgpOyBjdXJyICYmICFjdXJyLT5pc0RpcnR5
KCk7IGN1cnIgPSBjdXJyLT5uZXh0Um9vdEJveCgpKSB7CisgICAgICAgICAgICBpZiAoY3Vyci0+
YW5vbnltb3VzSW5saW5lQmxvY2soKSkgeworICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBXZSBo
YXZlIHRvIGRvIGJldHRlciB0aGFuIHRoaXMgb3Igd2Ugd2lsbCByZXBhaW50IHRvbyBtdWNoIGFz
IGNvbnRlbnQgaW5zaWRlIGFuCisgICAgICAgICAgICAgICAgLy8gYW5vbnltb3VzIGlubGluZSBi
bG9jayBjb21lcyBpbi4KKyAgICAgICAgICAgICAgICBmdWxsTGF5b3V0ID0gdHJ1ZTsKKyAgICAg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChWZWN0b3I8
UmVuZGVyQm94Kj4qIGNsZWFuTGluZUZsb2F0cyA9IGN1cnItPmZsb2F0c1B0cigpKSB7CiAgICAg
ICAgICAgICAgICAgVmVjdG9yPFJlbmRlckJveCo+OjppdGVyYXRvciBlbmQgPSBjbGVhbkxpbmVG
bG9hdHMtPmVuZCgpOwogICAgICAgICAgICAgICAgIGZvciAoVmVjdG9yPFJlbmRlckJveCo+Ojpp
dGVyYXRvciBvID0gY2xlYW5MaW5lRmxvYXRzLT5iZWdpbigpOyBvICE9IGVuZDsgKytvKSB7CkBA
IC0xNTgzLDcgKzE2MjQsNyBAQCBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHRleHRXaWR0aChSZW5k
ZXJUCiB9CiAKIElubGluZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpmaW5kTmV4dExpbmVCcmVhayhJ
bmxpbmVCaWRpUmVzb2x2ZXImIHJlc29sdmVyLCBib29sIGZpcnN0TGluZSwgIGJvb2wmIGlzTGlu
ZUVtcHR5LCBib29sJiBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHksIAotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVDbGVhciogY2xlYXIpCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFyZ2luSW5mbyYgbWFyZ2luSW5m
bywgRUNsZWFyKiBjbGVhcikKIHsKICAgICBBU1NFUlQocmVzb2x2ZXIucG9zaXRpb24oKS5ibG9j
ayA9PSB0aGlzKTsKIApAQCAtMTYyNCw2ICsxNjY1LDExIEBAIElubGluZUl0ZXJhdG9yIFJlbmRl
ckJsb2NrOjpmaW5kTmV4dExpbmUKICAgICBib29sIGF1dG9XcmFwV2FzRXZlclRydWVPbkxpbmUg
PSBmYWxzZTsKICAgICBib29sIGZsb2F0c0ZpdE9uTGluZSA9IHRydWU7CiAgICAgCisgICAgYm9v
bCBpc0Jsb2NrSW5zaWRlSW5saW5lID0gZmFsc2U7CisgICAgCisgICAgaW50IHByZXZpb3VzQmxv
Y2tGbG9hdEJvdHRvbSA9IDA7CisgICAgaW50IG1heEJsb2NrRmxvYXRCb3R0b20gPSAwOworCiAg
ICAgLy8gRmlyZWZveCBhbmQgT3BlcmEgd2lsbCBhbGxvdyBhIHRhYmxlIGNlbGwgdG8gZ3JvdyB0
byBmaXQgYW4gaW1hZ2UgaW5zaWRlIGl0IHVuZGVyCiAgICAgLy8gdmVyeSBzcGVjaWZpYyBjaXJj
dW1zdGFuY2VzIChpbiBvcmRlciB0byBtYXRjaCBjb21tb24gV2luSUUgcmVuZGVyaW5ncykuIAog
ICAgIC8vIE5vdCBzdXBwb3J0aW5nIHRoZSBxdWlyayBoYXMgY2F1c2VkIHVzIHRvIG1pcy1yZW5k
ZXIgc29tZSByZWFsIHNpdGVzLiAoU2VlIEJ1Z3ppbGxhIDEwNTE3LikgCkBAIC0xNjM0LDcgKzE2
ODAsOCBAQCBJbmxpbmVJdGVyYXRvciBSZW5kZXJCbG9jazo6ZmluZE5leHRMaW5lCiAgICAgd2hp
bGUgKG8pIHsKICAgICAgICAgY3VycldTID0gby0+aXNSZXBsYWNlZCgpID8gby0+cGFyZW50KCkt
PnN0eWxlKCktPndoaXRlU3BhY2UoKSA6IG8tPnN0eWxlKCktPndoaXRlU3BhY2UoKTsKICAgICAg
ICAgbGFzdFdTID0gbGFzdC0+aXNSZXBsYWNlZCgpID8gbGFzdC0+cGFyZW50KCktPnN0eWxlKCkt
PndoaXRlU3BhY2UoKSA6IGxhc3QtPnN0eWxlKCktPndoaXRlU3BhY2UoKTsKLSAgICAgICAgCisg
ICAgICAgIGlzQmxvY2tJbnNpZGVJbmxpbmUgPSBvLT5pc0Fub255bW91c0lubGluZUJsb2NrKCk7
CisKICAgICAgICAgYm9vbCBhdXRvV3JhcCA9IFJlbmRlclN0eWxlOjphdXRvV3JhcChjdXJyV1Mp
OwogICAgICAgICBhdXRvV3JhcFdhc0V2ZXJUcnVlT25MaW5lID0gYXV0b1dyYXBXYXNFdmVyVHJ1
ZU9uTGluZSB8fCBhdXRvV3JhcDsKIApAQCAtMTY0NSw3ICsxNjkyLDcgQEAgSW5saW5lSXRlcmF0
b3IgUmVuZGVyQmxvY2s6OmZpbmROZXh0TGluZQogI2VuZGlmCiAKICAgICAgICAgYm9vbCBjb2xs
YXBzZVdoaXRlU3BhY2UgPSBSZW5kZXJTdHlsZTo6Y29sbGFwc2VXaGl0ZVNwYWNlKGN1cnJXUyk7
Ci0gICAgICAgICAgICAKKwogICAgICAgICBpZiAoby0+aXNCUigpKSB7CiAgICAgICAgICAgICBp
ZiAodyArIHRtcFcgPD0gd2lkdGgpIHsKICAgICAgICAgICAgICAgICBsQnJlYWsub2JqID0gbzsK
QEAgLTE3NTIsOCArMTc5OSw5IEBAIElubGluZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpmaW5kTmV4
dExpbmUKICAgICAgICAgfSBlbHNlIGlmIChvLT5pc1JlcGxhY2VkKCkpIHsKICAgICAgICAgICAg
IFJlbmRlckJveCogcmVwbGFjZWRCb3ggPSB0b1JlbmRlckJveChvKTsKIAotICAgICAgICAgICAg
Ly8gQnJlYWsgb24gcmVwbGFjZWQgZWxlbWVudHMgaWYgZWl0aGVyIGhhcyBub3JtYWwgd2hpdGUt
c3BhY2UuCi0gICAgICAgICAgICBpZiAoKGF1dG9XcmFwIHx8IFJlbmRlclN0eWxlOjphdXRvV3Jh
cChsYXN0V1MpKSAmJiAoIW8tPmlzSW1hZ2UoKSB8fCBhbGxvd0ltYWdlc1RvQnJlYWspKSB7Cisg
ICAgICAgICAgICAvLyBCcmVhayBvbiByZXBsYWNlZCBlbGVtZW50cyBpZiBlaXRoZXIgaGFzIG5v
cm1hbCB3aGl0ZS1zcGFjZS4gIFdlIGFsc28gYWx3YXlzIGJyZWFrIGlmIHdlCisgICAgICAgICAg
ICAvLyBlbmNvdW50ZXIgYSBzcGVjaWFsIGFub255bW91cyBpbmxpbmUgYmxvY2sgKHVzZWQgdG8g
aG9sZCBibG9ja3MgaW5zaWRlIGlubGluZXMpLgorICAgICAgICAgICAgaWYgKChhdXRvV3JhcCB8
fCBSZW5kZXJTdHlsZTo6YXV0b1dyYXAobGFzdFdTKSB8fCBpc0Jsb2NrSW5zaWRlSW5saW5lKSAg
JiYgKCFvLT5pc0ltYWdlKCkgfHwgYWxsb3dJbWFnZXNUb0JyZWFrKSkgewogICAgICAgICAgICAg
ICAgIHcgKz0gdG1wVzsKICAgICAgICAgICAgICAgICB0bXBXID0gMDsKICAgICAgICAgICAgICAg
ICBsQnJlYWsub2JqID0gbzsKQEAgLTE3NjEsNiArMTgwOSwxOSBAQCBJbmxpbmVJdGVyYXRvciBS
ZW5kZXJCbG9jazo6ZmluZE5leHRMaW5lCiAgICAgICAgICAgICAgICAgbEJyZWFrLm5leHRCcmVh
a2FibGVQb3NpdGlvbiA9IC0xOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAoaXNC
bG9ja0luc2lkZUlubGluZSkgeworICAgICAgICAgICAgICAgIGlmICghaXNMaW5lRW1wdHkpCisg
ICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOworCisgICAgICAgICAgICAgICAgLy8gUmVzZXQg
dGhlIHdpZHRoIHRvIGlnbm9yZSBmbG9hdHMsIHNpbmNlIHdlJ3JlIGdvaW5nIHRvIGFsbG93IHRo
ZW0gdG8gaW50cnVkZSBpbnRvIG91ciBzcGFjZS4KKyAgICAgICAgICAgICAgICB3aWR0aCA9IHJp
Z2h0T2Zmc2V0KCkgLSBsZWZ0T2Zmc2V0KCk7CisKKyAgICAgICAgICAgICAgICAvLyBGSVhNRTog
VGhpcyBjYWxsIHdpbGwgdXBkYXRlIHRoZSBoZWlnaHQgb2Ygb3VyIGJsb2NrLiAgSXQncyBub3Qg
Y2xlYXIgaWYgdGhhdCdzIGdvaW5nIHRvIGJlIG9rIG9yIG5vdCB5ZXQuCisgICAgICAgICAgICAg
ICAgbGF5b3V0QmxvY2tDaGlsZChyZXBsYWNlZEJveCwgbWFyZ2luSW5mbywgcHJldmlvdXNCbG9j
a0Zsb2F0Qm90dG9tLCBtYXhCbG9ja0Zsb2F0Qm90dG9tKTsKKworICAgICAgICAgICAgICAgIGxp
bmVNaWRwb2ludFN0YXRlLmJldHdlZW5NaWRwb2ludHMgPSBmYWxzZTsKKyAgICAgICAgICAgIH0K
KwogICAgICAgICAgICAgaWYgKGlnbm9yaW5nU3BhY2VzKQogICAgICAgICAgICAgICAgIGFkZE1p
ZHBvaW50KGxpbmVNaWRwb2ludFN0YXRlLCBJbmxpbmVJdGVyYXRvcigwLCBvLCAwKSk7CiAKQEAg
LTE3ODIsNiArMTg0MywxNSBAQCBJbmxpbmVJdGVyYXRvciBSZW5kZXJCbG9jazo6ZmluZE5leHRM
aW5lCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAg
ICAgdG1wVyArPSByZXBsYWNlZEJveC0+d2lkdGgoKSArIHJlcGxhY2VkQm94LT5tYXJnaW5MZWZ0
KCkgKyByZXBsYWNlZEJveC0+bWFyZ2luUmlnaHQoKSArIGlubGluZVdpZHRoKG8pOworICAgICAg
ICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGlzQmxvY2tJbnNpZGVJbmxpbmUpIHsKKyAgICAg
ICAgICAgICAgICB3ICs9IHRtcFc7CisgICAgICAgICAgICAgICAgdG1wVyA9IDA7CisgICAgICAg
ICAgICAgICAgbEJyZWFrLm9iaiA9IG87CisgICAgICAgICAgICAgICAgbEJyZWFrLnBvcyA9IDA7
CisgICAgICAgICAgICAgICAgbEJyZWFrLm5leHRCcmVha2FibGVQb3NpdGlvbiA9IC0xOworICAg
ICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYg
KG8tPmlzVGV4dCgpKSB7CiAgICAgICAgICAgICBpZiAoIXBvcykKICAgICAgICAgICAgICAgICBh
cHBsaWVkU3RhcnRXaWR0aCA9IGZhbHNlOwpAQCAtMjE2Nyw3ICsyMjM3LDcgQEAgSW5saW5lSXRl
cmF0b3IgUmVuZGVyQmxvY2s6OmZpbmROZXh0TGluZQogICAgICAgICB9CiAgICAgICAgIC8vZWxz
ZSBpZiAobEJyZWFrLnBvcyA+IDApCiAgICAgICAgIC8vICAgIGxCcmVhay5wb3MtLTsKLSAgICAg
ICAgZWxzZSBpZiAobEJyZWFrLm9iaiA9PSAwICYmIHRyYWlsaW5nU3BhY2VPYmplY3QtPmlzVGV4
dCgpKSB7CisgICAgICAgIGVsc2UgaWYgKCghbEJyZWFrLm9iaiB8fCBsQnJlYWsub2JqLT5pc0Fu
b255bW91c0lubGluZUJsb2NrKCkpICYmIHRyYWlsaW5nU3BhY2VPYmplY3QtPmlzVGV4dCgpKSB7
CiAgICAgICAgICAgICAvLyBBZGQgYSBuZXcgZW5kIG1pZHBvaW50IHRoYXQgc3RvcHMgcmlnaHQg
YXQgdGhlIHZlcnkgZW5kLgogICAgICAgICAgICAgUmVuZGVyVGV4dCogdGV4dCA9IHRvUmVuZGVy
VGV4dCh0cmFpbGluZ1NwYWNlT2JqZWN0KTsKICAgICAgICAgICAgIHVuc2lnbmVkIGxlbmd0aCA9
IHRleHQtPnRleHRMZW5ndGgoKTsKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJveC5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQm94LmNwcAkocmV2aXNp
b24gNDc1OTEpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCb3guY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0xMjg0LDcgKzEyODQsNyBAQCB2b2lkIFJlbmRlckJveDo6Y2FsY1dpZHRoKCkKICAg
ICB9CiAKICAgICBpZiAoY29udGFpbmVyV2lkdGggJiYgY29udGFpbmVyV2lkdGggIT0gKHdpZHRo
KCkgKyBtX21hcmdpbkxlZnQgKyBtX21hcmdpblJpZ2h0KQotICAgICAgICAgICAgJiYgIWlzRmxv
YXRpbmcoKSAmJiAhaXNJbmxpbmUoKSAmJiAhY2ItPmlzRmxleGlibGVCb3goKSkgeworICAgICAg
ICAgICAgJiYgIWlzRmxvYXRpbmcoKSAmJiAoIWlzSW5saW5lKCkgfHwgaXNBbm9ueW1vdXNJbmxp
bmVCbG9jaygpKSAmJiAhY2ItPmlzRmxleGlibGVCb3goKSkgewogICAgICAgICBpZiAoY2ItPnN0
eWxlKCktPmRpcmVjdGlvbigpID09IExUUikKICAgICAgICAgICAgIG1fbWFyZ2luUmlnaHQgPSBj
b250YWluZXJXaWR0aCAtIHdpZHRoKCkgLSBtX21hcmdpbkxlZnQ7CiAgICAgICAgIGVsc2UKQEAg
LTEzMjMsNyArMTMyMyw3IEBAIGJvb2wgUmVuZGVyQm94OjpzaXplc1RvSW50cmluc2ljV2lkdGgo
V2kKIHsKICAgICAvLyBNYXJxdWVlcyBpbiBXaW5JRSBhcmUgbGlrZSBhIG1peHR1cmUgb2YgYmxv
Y2tzIGFuZCBpbmxpbmUtYmxvY2tzLiAgVGhleSBzaXplIGFzIHRob3VnaCB0aGV5J3JlIGJsb2Nr
cywKICAgICAvLyBidXQgdGhleSBhbGxvdyB0ZXh0IHRvIHNpdCBvbiB0aGUgc2FtZSBsaW5lIGFz
IHRoZSBtYXJxdWVlLgotICAgIGlmIChpc0Zsb2F0aW5nKCkgfHwgKGlzSW5saW5lQmxvY2tPcklu
bGluZVRhYmxlKCkgJiYgIWlzSFRNTE1hcnF1ZWUoKSkpCisgICAgaWYgKGlzRmxvYXRpbmcoKSB8
fCAoaXNJbmxpbmVCbG9ja09ySW5saW5lVGFibGUoKSAmJiAhaXNIVE1MTWFycXVlZSgpICYmICFp
c0Fub255bW91c0lubGluZUJsb2NrKCkpKQogICAgICAgICByZXR1cm4gdHJ1ZTsKIAogICAgIC8v
IFRoaXMgY29kZSBtYXkgbG9vayBhIGJpdCBzdHJhbmdlLiAgQmFzaWNhbGx5IHdpZHRoOmludHJp
bnNpYyBzaG91bGQgY2xhbXAgdGhlIHNpemUgd2hlbiB0ZXN0aW5nIGJvdGgKQEAgLTI3NjksNyAr
Mjc2OSw3IEBAIGJvb2wgUmVuZGVyQm94OjpzaHJpbmtUb0F2b2lkRmxvYXRzKCkgY28KIAogYm9v
bCBSZW5kZXJCb3g6OmF2b2lkc0Zsb2F0cygpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIGlzUmVwbGFj
ZWQoKSB8fCBoYXNPdmVyZmxvd0NsaXAoKSB8fCBpc0hSKCk7CisgICAgcmV0dXJuICFpc0Fub255
bW91c0lubGluZUJsb2NrKCkgJiYgKGlzUmVwbGFjZWQoKSB8fCBoYXNPdmVyZmxvd0NsaXAoKSB8
fCBpc0hSKCkpOwogfQogCiB2b2lkIFJlbmRlckJveDo6YWRkU2hhZG93T3ZlcmZsb3coKQpJbmRl
eDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVySW5saW5lLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL3JlbmRlcmluZy9SZW5kZXJJbmxpbmUuY3BwCShyZXZpc2lvbiA0NzY0MykKKysrIFdlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlcklubGluZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQyLDcgKzQy
LDYgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogCiBSZW5kZXJJbmxpbmU6OlJlbmRlcklubGluZShO
b2RlKiBub2RlKQogICAgIDogUmVuZGVyQm94TW9kZWxPYmplY3Qobm9kZSkKLSAgICAsIG1fY29u
dGludWF0aW9uKDApCiAgICAgLCBtX2xpbmVIZWlnaHQoLTEpCiAgICAgLCBtX3ZlcnRpY2FsUG9z
aXRpb24oUG9zaXRpb25VbmRlZmluZWQpCiB7CkBAIC01MSwxMSArNTAsNiBAQCBSZW5kZXJJbmxp
bmU6OlJlbmRlcklubGluZShOb2RlKiBub2RlKQogCiB2b2lkIFJlbmRlcklubGluZTo6ZGVzdHJv
eSgpCiB7Ci0gICAgLy8gRGV0YWNoIG91ciBjb250aW51YXRpb24gZmlyc3QuCi0gICAgaWYgKG1f
Y29udGludWF0aW9uKQotICAgICAgICBtX2NvbnRpbnVhdGlvbi0+ZGVzdHJveSgpOwotICAgIG1f
Y29udGludWF0aW9uID0gMDsKLSAgICAKICAgICAvLyBNYWtlIHN1cmUgdG8gZGVzdHJveSBhbm9u
eW1vdXMgY2hpbGRyZW4gZmlyc3Qgd2hpbGUgdGhleSBhcmUgc3RpbGwgY29ubmVjdGVkIHRvIHRo
ZSByZXN0IG9mIHRoZSB0cmVlLCBzbyB0aGF0IHRoZXkgd2lsbAogICAgIC8vIHByb3Blcmx5IGRp
cnR5IGxpbmUgYm94ZXMgdGhhdCB0aGV5IGFyZSByZW1vdmVkIGZyb20uICBFZmZlY3RzIHRoYXQg
ZG8gOmJlZm9yZS86YWZ0ZXIgb25seSBvbiBob3ZlciBjb3VsZCBjcmFzaCBvdGhlcndpc2UuCiAg
ICAgY2hpbGRyZW4oKS0+ZGVzdHJveUxlZnRvdmVyQ2hpbGRyZW4oKTsKQEAgLTg3LDEzICs4MSw2
IEBAIHZvaWQgUmVuZGVySW5saW5lOjpkZXN0cm95KCkKICAgICBSZW5kZXJCb3hNb2RlbE9iamVj
dDo6ZGVzdHJveSgpOwogfQogCi1SZW5kZXJJbmxpbmUqIFJlbmRlcklubGluZTo6aW5saW5lQ29u
dGludWF0aW9uKCkgY29uc3QKLXsKLSAgICBpZiAoIW1fY29udGludWF0aW9uIHx8IG1fY29udGlu
dWF0aW9uLT5pc0lubGluZSgpKQotICAgICAgICByZXR1cm4gdG9SZW5kZXJJbmxpbmUobV9jb250
aW51YXRpb24pOwotICAgIHJldHVybiB0b1JlbmRlckJsb2NrKG1fY29udGludWF0aW9uKS0+aW5s
aW5lQ29udGludWF0aW9uKCk7Ci19Ci0KIHZvaWQgUmVuZGVySW5saW5lOjp1cGRhdGVCb3hNb2Rl
bEluZm9Gcm9tU3R5bGUoKQogewogICAgIFJlbmRlckJveE1vZGVsT2JqZWN0Ojp1cGRhdGVCb3hN
b2RlbEluZm9Gcm9tU3R5bGUoKTsKQEAgLTEwOSwxOSArOTYsNiBAQCB2b2lkIFJlbmRlcklubGlu
ZTo6c3R5bGVEaWRDaGFuZ2UoU3R5bGVECiB7CiAgICAgUmVuZGVyQm94TW9kZWxPYmplY3Q6OnN0
eWxlRGlkQ2hhbmdlKGRpZmYsIG9sZFN0eWxlKTsKIAotICAgIC8vIEVuc3VyZSB0aGF0IGFsbCBv
ZiB0aGUgc3BsaXQgaW5saW5lcyBwaWNrIHVwIHRoZSBuZXcgc3R5bGUuIFdlCi0gICAgLy8gb25s
eSBkbyB0aGlzIGlmIHdlJ3JlIGFuIGlubGluZSwgc2luY2Ugd2UgZG9uJ3Qgd2FudCB0byBwcm9w
YWdhdGUKLSAgICAvLyBhIGJsb2NrJ3Mgc3R5bGUgdG8gdGhlIG90aGVyIGlubGluZXMuCi0gICAg
Ly8gZS5nLiwgPGZvbnQ+Zm9vIDxoND5nb288L2g0PiBtb288L2ZvbnQ+LiAgVGhlIDxmb250PiBp
bmxpbmVzIGJlZm9yZQotICAgIC8vIGFuZCBhZnRlciB0aGUgYmxvY2sgc2hhcmUgdGhlIHNhbWUg
c3R5bGUsIGJ1dCB0aGUgYmxvY2sgZG9lc24ndAotICAgIC8vIG5lZWQgdG8gcGFzcyBpdHMgc3R5
bGUgb24gdG8gYW55b25lIGVsc2UuCi0gICAgZm9yIChSZW5kZXJJbmxpbmUqIGN1cnJDb250ID0g
aW5saW5lQ29udGludWF0aW9uKCk7IGN1cnJDb250OyBjdXJyQ29udCA9IGN1cnJDb250LT5pbmxp
bmVDb250aW51YXRpb24oKSkgewotICAgICAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogbmV4dENv
bnQgPSBjdXJyQ29udC0+Y29udGludWF0aW9uKCk7Ci0gICAgICAgIGN1cnJDb250LT5zZXRDb250
aW51YXRpb24oMCk7Ci0gICAgICAgIGN1cnJDb250LT5zZXRTdHlsZShzdHlsZSgpKTsKLSAgICAg
ICAgY3VyckNvbnQtPnNldENvbnRpbnVhdGlvbihuZXh0Q29udCk7Ci0gICAgfQotCiAgICAgbV9s
aW5lSGVpZ2h0ID0gLTE7CiAKICAgICAvLyBVcGRhdGUgcHNldWRvcyBmb3IgOmJlZm9yZSBhbmQg
OmFmdGVyIG5vdy4KQEAgLTEzMSw3OSArMTA1LDczIEBAIHZvaWQgUmVuZGVySW5saW5lOjpzdHls
ZURpZENoYW5nZShTdHlsZUQKICAgICB9CiB9CiAKLXZvaWQgUmVuZGVySW5saW5lOjphZGRDaGls
ZChSZW5kZXJPYmplY3QqIG5ld0NoaWxkLCBSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkKQotewot
ICAgIGlmIChjb250aW51YXRpb24oKSkKLSAgICAgICAgcmV0dXJuIGFkZENoaWxkVG9Db250aW51
YXRpb24obmV3Q2hpbGQsIGJlZm9yZUNoaWxkKTsKLSAgICByZXR1cm4gYWRkQ2hpbGRJZ25vcmlu
Z0NvbnRpbnVhdGlvbihuZXdDaGlsZCwgYmVmb3JlQ2hpbGQpOwotfQotCi1zdGF0aWMgUmVuZGVy
Qm94TW9kZWxPYmplY3QqIG5leHRDb250aW51YXRpb24oUmVuZGVyT2JqZWN0KiByZW5kZXJlcikK
LXsKLSAgICBpZiAocmVuZGVyZXItPmlzSW5saW5lKCkgJiYgIXJlbmRlcmVyLT5pc1JlcGxhY2Vk
KCkpCi0gICAgICAgIHJldHVybiB0b1JlbmRlcklubGluZShyZW5kZXJlciktPmNvbnRpbnVhdGlv
bigpOwotICAgIHJldHVybiB0b1JlbmRlckJsb2NrKHJlbmRlcmVyKS0+aW5saW5lQ29udGludWF0
aW9uKCk7Ci19Ci0KLVJlbmRlckJveE1vZGVsT2JqZWN0KiBSZW5kZXJJbmxpbmU6OmNvbnRpbnVh
dGlvbkJlZm9yZShSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkKQordm9pZCBSZW5kZXJJbmxpbmU6
OmNoaWxkQmVjYW1lTm9uSW5saW5lKFJlbmRlck9iamVjdCogY2hpbGQpCiB7Ci0gICAgaWYgKGJl
Zm9yZUNoaWxkICYmIGJlZm9yZUNoaWxkLT5wYXJlbnQoKSA9PSB0aGlzKQotICAgICAgICByZXR1
cm4gdGhpczsKLQotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBjdXJyID0gbmV4dENvbnRpbnVh
dGlvbih0aGlzKTsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogbmV4dFRvTGFzdCA9IHRoaXM7
Ci0gICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGxhc3QgPSB0aGlzOwotICAgIHdoaWxlIChjdXJy
KSB7Ci0gICAgICAgIGlmIChiZWZvcmVDaGlsZCAmJiBiZWZvcmVDaGlsZC0+cGFyZW50KCkgPT0g
Y3VycikgewotICAgICAgICAgICAgaWYgKGN1cnItPmZpcnN0Q2hpbGQoKSA9PSBiZWZvcmVDaGls
ZCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbGFzdDsKLSAgICAgICAgICAgIHJldHVybiBjdXJy
OwotICAgICAgICB9Ci0KLSAgICAgICAgbmV4dFRvTGFzdCA9IGxhc3Q7Ci0gICAgICAgIGxhc3Qg
PSBjdXJyOwotICAgICAgICBjdXJyID0gbmV4dENvbnRpbnVhdGlvbihjdXJyKTsKLSAgICB9Ci0K
LSAgICBpZiAoIWJlZm9yZUNoaWxkICYmICFsYXN0LT5maXJzdENoaWxkKCkpCi0gICAgICAgIHJl
dHVybiBuZXh0VG9MYXN0OwotICAgIHJldHVybiBsYXN0OworICAgIFJlbmRlck9iamVjdCogbmV4
dCA9IGNoaWxkLT5uZXh0U2libGluZygpOworICAgIHJlbW92ZUNoaWxkKGNoaWxkKTsKKyAgICBh
ZGRDaGlsZChjaGlsZCwgbmV4dCk7CiB9CiAKLXZvaWQgUmVuZGVySW5saW5lOjphZGRDaGlsZEln
bm9yaW5nQ29udGludWF0aW9uKFJlbmRlck9iamVjdCogbmV3Q2hpbGQsIFJlbmRlck9iamVjdCog
YmVmb3JlQ2hpbGQpCit2b2lkIFJlbmRlcklubGluZTo6YWRkQ2hpbGQoUmVuZGVyT2JqZWN0KiBu
ZXdDaGlsZCwgUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCkKIHsKICAgICAvLyBNYWtlIHN1cmUg
d2UgZG9uJ3QgYXBwZW5kIHRoaW5ncyBhZnRlciA6YWZ0ZXItZ2VuZXJhdGVkIGNvbnRlbnQgaWYg
d2UgaGF2ZSBpdC4KICAgICBpZiAoIWJlZm9yZUNoaWxkICYmIGlzQWZ0ZXJDb250ZW50KGxhc3RD
aGlsZCgpKSkKICAgICAgICAgYmVmb3JlQ2hpbGQgPSBsYXN0Q2hpbGQoKTsKIAotICAgIGlmICgh
bmV3Q2hpbGQtPmlzSW5saW5lKCkgJiYgIW5ld0NoaWxkLT5pc0Zsb2F0aW5nT3JQb3NpdGlvbmVk
KCkpIHsKLSAgICAgICAgLy8gV2UgYXJlIHBsYWNpbmcgYSBibG9jayBpbnNpZGUgYW4gaW5saW5l
LiBXZSBoYXZlIHRvIHBlcmZvcm0gYSBzcGxpdCBvZiB0aGlzCi0gICAgICAgIC8vIGlubGluZSBp
bnRvIGNvbnRpbnVhdGlvbnMuICBUaGlzIGludm9sdmVzIGNyZWF0aW5nIGFuIGFub255bW91cyBi
bG9jayBib3ggdG8gaG9sZAotICAgICAgICAvLyB8bmV3Q2hpbGR8LiAgV2UgdGhlbiBtYWtlIHRo
YXQgYmxvY2sgYm94IGEgY29udGludWF0aW9uIG9mIHRoaXMgaW5saW5lLiAgV2UgdGFrZSBhbGwg
b2YKLSAgICAgICAgLy8gdGhlIGNoaWxkcmVuIGFmdGVyIHxiZWZvcmVDaGlsZHwgYW5kIHB1dCB0
aGVtIGluIGEgY2xvbmUgb2YgdGhpcyBvYmplY3QuCi0gICAgICAgIFJlZlB0cjxSZW5kZXJTdHls
ZT4gbmV3U3R5bGUgPSBSZW5kZXJTdHlsZTo6Y3JlYXRlKCk7Ci0gICAgICAgIG5ld1N0eWxlLT5p
bmhlcml0RnJvbShzdHlsZSgpKTsKLSAgICAgICAgbmV3U3R5bGUtPnNldERpc3BsYXkoQkxPQ0sp
OwotCi0gICAgICAgIFJlbmRlckJsb2NrKiBuZXdCb3ggPSBuZXcgKHJlbmRlckFyZW5hKCkpIFJl
bmRlckJsb2NrKGRvY3VtZW50KCkgLyogYW5vbnltb3VzIGJveCAqLyk7Ci0gICAgICAgIG5ld0Jv
eC0+c2V0U3R5bGUobmV3U3R5bGUucmVsZWFzZSgpKTsKLSAgICAgICAgUmVuZGVyQm94TW9kZWxP
YmplY3QqIG9sZENvbnRpbnVhdGlvbiA9IGNvbnRpbnVhdGlvbigpOwotICAgICAgICBzZXRDb250
aW51YXRpb24obmV3Qm94KTsKLQotICAgICAgICAvLyBTb21lb25lIG1heSBoYXZlIHB1dCBhIDxw
PiBpbnNpZGUgYSA8cT4sIGNhdXNpbmcgYSBzcGxpdC4gIFdoZW4gdGhpcyBoYXBwZW5zLCB0aGUg
OmFmdGVyIGNvbnRlbnQKLSAgICAgICAgLy8gaGFzIHRvIG1vdmUgaW50byB0aGUgaW5saW5lIGNv
bnRpbnVhdGlvbi4gIENhbGwgdXBkYXRlQmVmb3JlQWZ0ZXJDb250ZW50IHRvIGVuc3VyZSB0aGF0
IG91ciA6YWZ0ZXIKLSAgICAgICAgLy8gY29udGVudCBnZXRzIHByb3Blcmx5IGRlc3Ryb3llZC4K
LSAgICAgICAgYm9vbCBpc0xhc3RDaGlsZCA9IChiZWZvcmVDaGlsZCA9PSBsYXN0Q2hpbGQoKSk7
Ci0gICAgICAgIGlmIChkb2N1bWVudCgpLT51c2VzQmVmb3JlQWZ0ZXJSdWxlcygpKQotICAgICAg
ICAgICAgY2hpbGRyZW4oKS0+dXBkYXRlQmVmb3JlQWZ0ZXJDb250ZW50KHRoaXMsIEFGVEVSKTsK
LSAgICAgICAgaWYgKGlzTGFzdENoaWxkICYmIGJlZm9yZUNoaWxkICE9IGxhc3RDaGlsZCgpKQot
ICAgICAgICAgICAgYmVmb3JlQ2hpbGQgPSAwOyAvLyBXZSBkZXN0cm95ZWQgdGhlIGxhc3QgY2hp
bGQsIHNvIG5vdyB3ZSBuZWVkIHRvIHVwZGF0ZSBvdXIgaW5zZXJ0aW9uCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIC8vIHBvaW50IHRvIGJlIDAuICBJdCdzIGp1c3QgYSBzdHJhaWdodCBh
cHBlbmQgbm93LgotCi0gICAgICAgIHNwbGl0RmxvdyhiZWZvcmVDaGlsZCwgbmV3Qm94LCBuZXdD
aGlsZCwgb2xkQ29udGludWF0aW9uKTsKKyAgICAvLyBJZiB0aGUgcmVxdWVzdGVkIGJlZm9yZUNo
aWxkIGlzIG5vdCBvbmUgb2Ygb3VyIGNoaWxkcmVuLCB0aGVuIHRoaXMgaXMgbW9zdCBsaWtlbHkg
YmVjYXVzZQorICAgIC8vIHRoZXJlIGlzIGFuIGFub255bW91cyBpbmxpbmUtYmxvY2sgYm94IHdp
dGhpbiB0aGlzIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBiZWZvcmVDaGlsZC4gU28KKyAgICAv
LyBqdXN0IGluc2VydCB0aGUgY2hpbGQgaW50byB0aGUgYW5vbnltb3VzIGlubGluZS1ibG9jayBi
b3ggaW5zdGVhZCBvZiBoZXJlLgorICAgIC8vIEEgc2Vjb25kIHBvc3NpYmlsaXR5IGlzIHRoYXQg
dGhlIGJlZm9yZUNoaWxkIGlzIGFuIGFub255bW91cyBibG9jayBpbnNpZGUgdGhlIGFub255bW91
cyBpbmxpbmUgYmxvY2suCisgICAgLy8gVGhpcyBjYW4gaGFwcGVuIGlmIGlubGluZXMgYXJlIGlu
c2VydGVkIGluIGJldHdlZW4gdHdvIG9mIHRoZSBhbm9ueW1vdXMgaW5saW5lIGJsb2NrJ3MgYmxv
Y2stbGV2ZWwKKyAgICAvLyBjaGlsZHJlbiBhZnRlciBpdCBoYXMgYmVlbiBjcmVhdGVkLgorICAg
IGlmIChiZWZvcmVDaGlsZCAmJiBiZWZvcmVDaGlsZC0+cGFyZW50KCkgIT0gdGhpcykgeworICAg
ICAgICBBU1NFUlQoYmVmb3JlQ2hpbGQtPnBhcmVudCgpKTsKKyAgICAgICAgQVNTRVJUKGJlZm9y
ZUNoaWxkLT5wYXJlbnQoKS0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpIHx8IGJlZm9yZUNoaWxk
LT5wYXJlbnQoKS0+aXNBbm9ueW1vdXNCbG9jaygpKTsKKyAgICAgICAgaWYgKGJlZm9yZUNoaWxk
LT5wYXJlbnQoKS0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CisgICAgICAgICAgICBpZiAo
IW5ld0NoaWxkLT5pc0lubGluZSgpIHx8IChuZXdDaGlsZC0+aXNJbmxpbmUoKSAmJiBiZWZvcmVD
aGlsZC0+cGFyZW50KCktPmZpcnN0Q2hpbGQoKSAhPSBiZWZvcmVDaGlsZCkpCisgICAgICAgICAg
ICAgICAgYmVmb3JlQ2hpbGQtPnBhcmVudCgpLT5hZGRDaGlsZChuZXdDaGlsZCwgYmVmb3JlQ2hp
bGQpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGFkZENoaWxkKG5ld0NoaWxk
LCBiZWZvcmVDaGlsZC0+cGFyZW50KCkpOworICAgICAgICB9IGVsc2UgaWYgKGJlZm9yZUNoaWxk
LT5wYXJlbnQoKS0+aXNBbm9ueW1vdXNCbG9jaygpKSB7CisgICAgICAgICAgICBBU1NFUlQoIWJl
Zm9yZUNoaWxkLT5wYXJlbnQoKS0+cGFyZW50KCkgfHwgYmVmb3JlQ2hpbGQtPnBhcmVudCgpLT5w
YXJlbnQoKS0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKTsKKyAgICAgICAgICAgIEFTU0VSVChi
ZWZvcmVDaGlsZC0+aXNJbmxpbmUoKSk7CisgICAgICAgICAgICBpZiAobmV3Q2hpbGQtPmlzSW5s
aW5lKCkgfHwgKCFuZXdDaGlsZC0+aXNJbmxpbmUoKSAmJiBiZWZvcmVDaGlsZC0+cGFyZW50KCkt
PmZpcnN0Q2hpbGQoKSAhPSBiZWZvcmVDaGlsZCkpCisgICAgICAgICAgICAgICAgYmVmb3JlQ2hp
bGQtPnBhcmVudCgpLT5hZGRDaGlsZChuZXdDaGlsZCwgYmVmb3JlQ2hpbGQpOworICAgICAgICAg
ICAgZWxzZQorICAgICAgICAgICAgICAgIGFkZENoaWxkKG5ld0NoaWxkLCBiZWZvcmVDaGlsZC0+
cGFyZW50KCkpOworICAgICAgICB9CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKKyAgICBpZiAo
IW5ld0NoaWxkLT5pc0lubGluZSgpKSB7CisgICAgICAgIC8vIFdlIGFyZSBwbGFjaW5nIGEgYmxv
Y2sgaW5zaWRlIGFuIGlubGluZS4gV2UgaGF2ZSB0byBwbGFjZSB0aGUgYmxvY2sgaW5zaWRlIGFu
IGFub255bW91cyBpbmxpbmUtYmxvY2suCisgICAgICAgIC8vIFRoaXMgaW5saW5lLWJsb2NrIGNh
biBob3VzZSBhIHNlcXVlbmNlIG9mIGNvbnRpZ3VvdXMgYmxvY2stbGV2ZWwgY2hpbGRyZW4sIGFu
ZCB0aGV5IHdpbGwgYWxsIHNpdCBvbiB0aGUKKyAgICAgICAgLy8gc2FtZSBsaW5lIHRvZ2V0aGVy
LiAgV2UgdHJ5IHRvIHJldXNlIG9uZSBmaXJzdCBpZiBwb3NzaWJsZS4KKyAgICAgICAgaWYgKGJl
Zm9yZUNoaWxkKSB7CisgICAgICAgICAgICBpZiAoYmVmb3JlQ2hpbGQtPnByZXZpb3VzU2libGlu
ZygpICYmIGJlZm9yZUNoaWxkLT5wcmV2aW91c1NpYmxpbmcoKS0+aXNBbm9ueW1vdXNJbmxpbmVC
bG9jaygpKSB7CisgICAgICAgICAgICAgICAgYmVmb3JlQ2hpbGQtPnByZXZpb3VzU2libGluZygp
LT5hZGRDaGlsZChuZXdDaGlsZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAg
ICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGxhc3RDaGlsZCgpICYmIGxh
c3RDaGlsZCgpLT5pc0Fub255bW91c0lubGluZUJsb2NrKCkpIHsKKyAgICAgICAgICAgICAgICBs
YXN0Q2hpbGQoKS0+YWRkQ2hpbGQobmV3Q2hpbGQpOworICAgICAgICAgICAgICAgIHJldHVybjsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgfQorIAorICAgICAgICBpZiAoIW5ld0NoaWxkLT5pc0Zs
b2F0aW5nT3JQb3NpdGlvbmVkKCkpIHsKKyAgICAgICAgICAgIC8vIFRoZXJlIHdhcyBubyBzdWl0
YWJsZSBleGlzdGluZyBhbm9ueW1vdXMgYm94LiAgQ3JlYXRlIGEgbmV3IG9uZS4KKyAgICAgICAg
ICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gbmV3U3R5bGUgPSBSZW5kZXJTdHlsZTo6Y3JlYXRlKCk7
CisgICAgICAgICAgICBuZXdTdHlsZS0+aW5oZXJpdEZyb20oc3R5bGUoKSk7CisgICAgICAgICAg
ICBuZXdTdHlsZS0+c2V0RGlzcGxheShJTkxJTkVfQkxPQ0spOworICAgICAgICAgICAgUmVuZGVy
QmxvY2sqIG5ld0JveCA9IG5ldyAocmVuZGVyQXJlbmEoKSkgUmVuZGVyQmxvY2soZG9jdW1lbnQo
KSk7CisgICAgICAgICAgICBuZXdCb3gtPnNldFN0eWxlKG5ld1N0eWxlKTsKKyAgICAgICAgICAg
IFJlbmRlckJveE1vZGVsT2JqZWN0OjphZGRDaGlsZChuZXdCb3gsIGJlZm9yZUNoaWxkKTsKKyAg
ICAgICAgICAgIG5ld0JveC0+YWRkQ2hpbGQobmV3Q2hpbGQpOworICAgICAgICAgICAgcmV0dXJu
OworICAgICAgICB9CisgICAgfQorCiAgICAgUmVuZGVyQm94TW9kZWxPYmplY3Q6OmFkZENoaWxk
KG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7CiAKICAgICBuZXdDaGlsZC0+c2V0TmVlZHNMYXlvdXRB
bmRQcmVmV2lkdGhzUmVjYWxjKCk7CkBAIC0yMTYsMTg4ICsxODQsNiBAQCBSZW5kZXJJbmxpbmUq
IFJlbmRlcklubGluZTo6Y2xvbmVJbmxpbmUoCiAgICAgcmV0dXJuIG87CiB9CiAKLXZvaWQgUmVu
ZGVySW5saW5lOjpzcGxpdElubGluZXMoUmVuZGVyQmxvY2sqIGZyb21CbG9jaywgUmVuZGVyQmxv
Y2sqIHRvQmxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbmRlckJsb2Nr
KiBtaWRkbGVCbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVuZGVyT2Jq
ZWN0KiBiZWZvcmVDaGlsZCwgUmVuZGVyQm94TW9kZWxPYmplY3QqIG9sZENvbnQpCi17Ci0gICAg
Ly8gQ3JlYXRlIGEgY2xvbmUgb2YgdGhpcyBpbmxpbmUuCi0gICAgUmVuZGVySW5saW5lKiBjbG9u
ZSA9IGNsb25lSW5saW5lKHRoaXMpOwotICAgIGNsb25lLT5zZXRDb250aW51YXRpb24ob2xkQ29u
dCk7Ci0KLSAgICAvLyBOb3cgdGFrZSBhbGwgb2YgdGhlIGNoaWxkcmVuIGZyb20gYmVmb3JlQ2hp
bGQgdG8gdGhlIGVuZCBhbmQgcmVtb3ZlCi0gICAgLy8gdGhlbSBmcm9tIHx0aGlzfCBhbmQgcGxh
Y2UgdGhlbSBpbiB0aGUgY2xvbmUuCi0gICAgUmVuZGVyT2JqZWN0KiBvID0gYmVmb3JlQ2hpbGQ7
Ci0gICAgd2hpbGUgKG8pIHsKLSAgICAgICAgUmVuZGVyT2JqZWN0KiB0bXAgPSBvOwotICAgICAg
ICBvID0gdG1wLT5uZXh0U2libGluZygpOwotICAgICAgICBjbG9uZS0+YWRkQ2hpbGRJZ25vcmlu
Z0NvbnRpbnVhdGlvbihjaGlsZHJlbigpLT5yZW1vdmVDaGlsZE5vZGUodGhpcywgdG1wKSwgMCk7
Ci0gICAgICAgIHRtcC0+c2V0TmVlZHNMYXlvdXRBbmRQcmVmV2lkdGhzUmVjYWxjKCk7Ci0gICAg
fQotCi0gICAgLy8gSG9vayB8Y2xvbmV8IHVwIGFzIHRoZSBjb250aW51YXRpb24gb2YgdGhlIG1p
ZGRsZSBibG9jay4KLSAgICBtaWRkbGVCbG9jay0+c2V0SW5saW5lQ29udGludWF0aW9uKGNsb25l
KTsKLQotICAgIC8vIFdlIGhhdmUgYmVlbiByZXBhcmVudGVkIGFuZCBhcmUgbm93IHVuZGVyIHRo
ZSBmcm9tQmxvY2suICBXZSBuZWVkCi0gICAgLy8gdG8gd2FsayB1cCBvdXIgaW5saW5lIHBhcmVu
dCBjaGFpbiB1bnRpbCB3ZSBoaXQgdGhlIGNvbnRhaW5pbmcgYmxvY2suCi0gICAgLy8gT25jZSB3
ZSBoaXQgdGhlIGNvbnRhaW5pbmcgYmxvY2sgd2UncmUgZG9uZS4KLSAgICBSZW5kZXJCb3hNb2Rl
bE9iamVjdCogY3VyciA9IHRvUmVuZGVyQm94TW9kZWxPYmplY3QocGFyZW50KCkpOwotICAgIFJl
bmRlckJveE1vZGVsT2JqZWN0KiBjdXJyQ2hpbGQgPSB0aGlzOwotICAgIAotICAgIC8vIEZJWE1F
OiBCZWNhdXNlIHNwbGl0dGluZyBpcyBPKG5eMikgYXMgdGFncyBuZXN0IHBhdGhvbG9naWNhbGx5
LCB3ZSBjYXAgdGhlIGRlcHRoIGF0IHdoaWNoIHdlJ3JlIHdpbGxpbmcgdG8gY2xvbmUuCi0gICAg
Ly8gVGhlcmUgd2lsbCBldmVudHVhbGx5IGJlIGEgYmV0dGVyIGFwcHJvYWNoIHRvIHRoaXMgcHJv
YmxlbSB0aGF0IHdpbGwgbGV0IHVzIG5lc3QgdG8gYSBtdWNoCi0gICAgLy8gZ3JlYXRlciBkZXB0
aCAoc2VlIGJ1Z3ppbGxhIGJ1ZyAxMzQzMCkgYnV0IGZvciBub3cgd2UgaGF2ZSBhIGxpbWl0LiAg
VGhpcyAqd2lsbCogcmVzdWx0IGluCi0gICAgLy8gaW5jb3JyZWN0IHJlbmRlcmluZywgYnV0IHRo
ZSBhbHRlcm5hdGl2ZSBpcyB0byBoYW5nIGZvcmV2ZXIuCi0gICAgdW5zaWduZWQgc3BsaXREZXB0
aCA9IDE7Ci0gICAgY29uc3QgdW5zaWduZWQgY01heFNwbGl0RGVwdGggPSAyMDA7IAotICAgIHdo
aWxlIChjdXJyICYmIGN1cnIgIT0gZnJvbUJsb2NrKSB7Ci0gICAgICAgIEFTU0VSVChjdXJyLT5p
c1JlbmRlcklubGluZSgpKTsKLSAgICAgICAgaWYgKHNwbGl0RGVwdGggPCBjTWF4U3BsaXREZXB0
aCkgewotICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGNsb25lLgotICAgICAgICAgICAgUmVu
ZGVySW5saW5lKiBjbG9uZUNoaWxkID0gY2xvbmU7Ci0gICAgICAgICAgICBjbG9uZSA9IGNsb25l
SW5saW5lKHRvUmVuZGVySW5saW5lKGN1cnIpKTsKLQotICAgICAgICAgICAgLy8gSW5zZXJ0IG91
ciBjaGlsZCBjbG9uZSBhcyB0aGUgZmlyc3QgY2hpbGQuCi0gICAgICAgICAgICBjbG9uZS0+YWRk
Q2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihjbG9uZUNoaWxkLCAwKTsKLQotICAgICAgICAgICAg
Ly8gSG9vayB0aGUgY2xvbmUgdXAgYXMgYSBjb250aW51YXRpb24gb2YgfGN1cnJ8LgotICAgICAg
ICAgICAgUmVuZGVySW5saW5lKiBpbmxpbmVDdXJyID0gdG9SZW5kZXJJbmxpbmUoY3Vycik7Ci0g
ICAgICAgICAgICBvbGRDb250ID0gaW5saW5lQ3Vyci0+Y29udGludWF0aW9uKCk7Ci0gICAgICAg
ICAgICBpbmxpbmVDdXJyLT5zZXRDb250aW51YXRpb24oY2xvbmUpOwotICAgICAgICAgICAgY2xv
bmUtPnNldENvbnRpbnVhdGlvbihvbGRDb250KTsKLQotICAgICAgICAgICAgLy8gU29tZW9uZSBt
YXkgaGF2ZSBpbmRpcmVjdGx5IGNhdXNlZCBhIDxxPiB0byBzcGxpdC4gIFdoZW4gdGhpcyBoYXBw
ZW5zLCB0aGUgOmFmdGVyIGNvbnRlbnQKLSAgICAgICAgICAgIC8vIGhhcyB0byBtb3ZlIGludG8g
dGhlIGlubGluZSBjb250aW51YXRpb24uICBDYWxsIHVwZGF0ZUJlZm9yZUFmdGVyQ29udGVudCB0
byBlbnN1cmUgdGhhdCB0aGUgaW5saW5lJ3MgOmFmdGVyCi0gICAgICAgICAgICAvLyBjb250ZW50
IGdldHMgcHJvcGVybHkgZGVzdHJveWVkLgotICAgICAgICAgICAgaWYgKGRvY3VtZW50KCktPnVz
ZXNCZWZvcmVBZnRlclJ1bGVzKCkpCi0gICAgICAgICAgICAgICAgaW5saW5lQ3Vyci0+Y2hpbGRy
ZW4oKS0+dXBkYXRlQmVmb3JlQWZ0ZXJDb250ZW50KHRoaXMsIEFGVEVSKTsKLQotICAgICAgICAg
ICAgLy8gTm93IHdlIG5lZWQgdG8gdGFrZSBhbGwgb2YgdGhlIGNoaWxkcmVuIHN0YXJ0aW5nIGZy
b20gdGhlIGZpcnN0IGNoaWxkCi0gICAgICAgICAgICAvLyAqYWZ0ZXIqIGN1cnJDaGlsZCBhbmQg
YXBwZW5kIHRoZW0gYWxsIHRvIHRoZSBjbG9uZS4KLSAgICAgICAgICAgIG8gPSBjdXJyQ2hpbGQt
Pm5leHRTaWJsaW5nKCk7Ci0gICAgICAgICAgICB3aGlsZSAobykgewotICAgICAgICAgICAgICAg
IFJlbmRlck9iamVjdCogdG1wID0gbzsKLSAgICAgICAgICAgICAgICBvID0gdG1wLT5uZXh0U2li
bGluZygpOwotICAgICAgICAgICAgICAgIGNsb25lLT5hZGRDaGlsZElnbm9yaW5nQ29udGludWF0
aW9uKGlubGluZUN1cnItPmNoaWxkcmVuKCktPnJlbW92ZUNoaWxkTm9kZShjdXJyLCB0bXApLCAw
KTsKLSAgICAgICAgICAgICAgICB0bXAtPnNldE5lZWRzTGF5b3V0QW5kUHJlZldpZHRoc1JlY2Fs
YygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBLZWVw
IHdhbGtpbmcgdXAgdGhlIGNoYWluLgotICAgICAgICBjdXJyQ2hpbGQgPSBjdXJyOwotICAgICAg
ICBjdXJyID0gdG9SZW5kZXJCb3hNb2RlbE9iamVjdChjdXJyLT5wYXJlbnQoKSk7Ci0gICAgICAg
IHNwbGl0RGVwdGgrKzsKLSAgICB9Ci0KLSAgICAvLyBOb3cgd2UgYXJlIGF0IHRoZSBibG9jayBs
ZXZlbC4gV2UgbmVlZCB0byBwdXQgdGhlIGNsb25lIGludG8gdGhlIHRvQmxvY2suCi0gICAgdG9C
bG9jay0+Y2hpbGRyZW4oKS0+YXBwZW5kQ2hpbGROb2RlKHRvQmxvY2ssIGNsb25lKTsKLQotICAg
IC8vIE5vdyB0YWtlIGFsbCB0aGUgY2hpbGRyZW4gYWZ0ZXIgY3VyckNoaWxkIGFuZCByZW1vdmUg
dGhlbSBmcm9tIHRoZSBmcm9tQmxvY2sKLSAgICAvLyBhbmQgcHV0IHRoZW0gaW4gdGhlIHRvQmxv
Y2suCi0gICAgbyA9IGN1cnJDaGlsZC0+bmV4dFNpYmxpbmcoKTsKLSAgICB3aGlsZSAobykgewot
ICAgICAgICBSZW5kZXJPYmplY3QqIHRtcCA9IG87Ci0gICAgICAgIG8gPSB0bXAtPm5leHRTaWJs
aW5nKCk7Ci0gICAgICAgIHRvQmxvY2stPmNoaWxkcmVuKCktPmFwcGVuZENoaWxkTm9kZSh0b0Js
b2NrLCBmcm9tQmxvY2stPmNoaWxkcmVuKCktPnJlbW92ZUNoaWxkTm9kZShmcm9tQmxvY2ssIHRt
cCkpOwotICAgIH0KLX0KLQotdm9pZCBSZW5kZXJJbmxpbmU6OnNwbGl0RmxvdyhSZW5kZXJPYmpl
Y3QqIGJlZm9yZUNoaWxkLCBSZW5kZXJCbG9jayogbmV3QmxvY2tCb3gsCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIFJlbmRlck9iamVjdCogbmV3Q2hpbGQsIFJlbmRlckJveE1vZGVsT2Jq
ZWN0KiBvbGRDb250KQotewotICAgIFJlbmRlckJsb2NrKiBwcmUgPSAwOwotICAgIFJlbmRlckJs
b2NrKiBibG9jayA9IGNvbnRhaW5pbmdCbG9jaygpOwotICAgIAotICAgIC8vIERlbGV0ZSBvdXIg
bGluZSBib3hlcyBiZWZvcmUgd2UgZG8gdGhlIGlubGluZSBzcGxpdCBpbnRvIGNvbnRpbnVhdGlv
bnMuCi0gICAgYmxvY2stPmRlbGV0ZUxpbmVCb3hUcmVlKCk7Ci0gICAgCi0gICAgYm9vbCBtYWRl
TmV3QmVmb3JlQmxvY2sgPSBmYWxzZTsKLSAgICBpZiAoYmxvY2stPmlzQW5vbnltb3VzQmxvY2so
KSAmJiAoIWJsb2NrLT5wYXJlbnQoKSB8fCAhYmxvY2stPnBhcmVudCgpLT5jcmVhdGVzQW5vbnlt
b3VzV3JhcHBlcigpKSkgewotICAgICAgICAvLyBXZSBjYW4gcmV1c2UgdGhpcyBibG9jayBhbmQg
bWFrZSBpdCB0aGUgcHJlQmxvY2sgb2YgdGhlIG5leHQgY29udGludWF0aW9uLgotICAgICAgICBw
cmUgPSBibG9jazsKLSAgICAgICAgcHJlLT5yZW1vdmVQb3NpdGlvbmVkT2JqZWN0cygwKTsKLSAg
ICAgICAgYmxvY2sgPSBibG9jay0+Y29udGFpbmluZ0Jsb2NrKCk7Ci0gICAgfSBlbHNlIHsKLSAg
ICAgICAgLy8gTm8gYW5vbnltb3VzIGJsb2NrIGF2YWlsYWJsZSBmb3IgdXNlLiAgTWFrZSBvbmUu
Ci0gICAgICAgIHByZSA9IGJsb2NrLT5jcmVhdGVBbm9ueW1vdXNCbG9jaygpOwotICAgICAgICBt
YWRlTmV3QmVmb3JlQmxvY2sgPSB0cnVlOwotICAgIH0KLQotICAgIFJlbmRlckJsb2NrKiBwb3N0
ID0gYmxvY2stPmNyZWF0ZUFub255bW91c0Jsb2NrKCk7Ci0KLSAgICBSZW5kZXJPYmplY3QqIGJv
eEZpcnN0ID0gbWFkZU5ld0JlZm9yZUJsb2NrID8gYmxvY2stPmZpcnN0Q2hpbGQoKSA6IHByZS0+
bmV4dFNpYmxpbmcoKTsKLSAgICBpZiAobWFkZU5ld0JlZm9yZUJsb2NrKQotICAgICAgICBibG9j
ay0+Y2hpbGRyZW4oKS0+aW5zZXJ0Q2hpbGROb2RlKGJsb2NrLCBwcmUsIGJveEZpcnN0KTsKLSAg
ICBibG9jay0+Y2hpbGRyZW4oKS0+aW5zZXJ0Q2hpbGROb2RlKGJsb2NrLCBuZXdCbG9ja0JveCwg
Ym94Rmlyc3QpOwotICAgIGJsb2NrLT5jaGlsZHJlbigpLT5pbnNlcnRDaGlsZE5vZGUoYmxvY2ss
IHBvc3QsIGJveEZpcnN0KTsKLSAgICBibG9jay0+c2V0Q2hpbGRyZW5JbmxpbmUoZmFsc2UpOwot
ICAgIAotICAgIGlmIChtYWRlTmV3QmVmb3JlQmxvY2spIHsKLSAgICAgICAgUmVuZGVyT2JqZWN0
KiBvID0gYm94Rmlyc3Q7Ci0gICAgICAgIHdoaWxlIChvKSB7Ci0gICAgICAgICAgICBSZW5kZXJP
YmplY3QqIG5vID0gbzsKLSAgICAgICAgICAgIG8gPSBuby0+bmV4dFNpYmxpbmcoKTsKLSAgICAg
ICAgICAgIHByZS0+Y2hpbGRyZW4oKS0+YXBwZW5kQ2hpbGROb2RlKHByZSwgYmxvY2stPmNoaWxk
cmVuKCktPnJlbW92ZUNoaWxkTm9kZShibG9jaywgbm8pKTsKLSAgICAgICAgICAgIG5vLT5zZXRO
ZWVkc0xheW91dEFuZFByZWZXaWR0aHNSZWNhbGMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAg
IHNwbGl0SW5saW5lcyhwcmUsIHBvc3QsIG5ld0Jsb2NrQm94LCBiZWZvcmVDaGlsZCwgb2xkQ29u
dCk7Ci0KLSAgICAvLyBXZSBhbHJlYWR5IGtub3cgdGhlIG5ld0Jsb2NrQm94IGlzbid0IGdvaW5n
IHRvIGNvbnRhaW4gaW5saW5lIGtpZHMsIHNvIGF2b2lkIHdhc3RpbmcKLSAgICAvLyB0aW1lIGlu
IG1ha2VDaGlsZHJlbk5vbklubGluZSBieSBqdXN0IHNldHRpbmcgdGhpcyBleHBsaWNpdGx5IHVw
IGZyb250LgotICAgIG5ld0Jsb2NrQm94LT5zZXRDaGlsZHJlbklubGluZShmYWxzZSk7Ci0KLSAg
ICAvLyBXZSBkZWxheWVkIGFkZGluZyB0aGUgbmV3Q2hpbGQgdW50aWwgbm93IHNvIHRoYXQgdGhl
IHxuZXdCbG9ja0JveHwgd291bGQgYmUgZnVsbHkKLSAgICAvLyBjb25uZWN0ZWQsIHRodXMgYWxs
b3dpbmcgbmV3Q2hpbGQgYWNjZXNzIHRvIGEgcmVuZGVyQXJlbmEgc2hvdWxkIGl0IG5lZWQKLSAg
ICAvLyB0byB3cmFwIGl0c2VsZiBpbiBhZGRpdGlvbmFsIGJveGVzIChlLmcuLCB0YWJsZSBjb25z
dHJ1Y3Rpb24pLgotICAgIG5ld0Jsb2NrQm94LT5hZGRDaGlsZChuZXdDaGlsZCk7Ci0KLSAgICAv
LyBBbHdheXMganVzdCBkbyBhIGZ1bGwgbGF5b3V0IGluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IGxp
bmUgYm94ZXMgKGVzcGVjaWFsbHkgd3JhcHBlcnMgZm9yIGltYWdlcykKLSAgICAvLyBnZXQgZGVs
ZXRlZCBwcm9wZXJseS4gIEJlY2F1c2Ugb2JqZWN0cyBtb3ZlcyBmcm9tIHRoZSBwcmUgYmxvY2sg
aW50byB0aGUgcG9zdCBibG9jaywgd2Ugd2FudCB0bwotICAgIC8vIG1ha2UgbmV3IGxpbmUgYm94
ZXMgaW5zdGVhZCBvZiBsZWF2aW5nIHRoZSBvbGQgbGluZSBib3hlcyBhcm91bmQuCi0gICAgcHJl
LT5zZXROZWVkc0xheW91dEFuZFByZWZXaWR0aHNSZWNhbGMoKTsKLSAgICBibG9jay0+c2V0TmVl
ZHNMYXlvdXRBbmRQcmVmV2lkdGhzUmVjYWxjKCk7Ci0gICAgcG9zdC0+c2V0TmVlZHNMYXlvdXRB
bmRQcmVmV2lkdGhzUmVjYWxjKCk7Ci19Ci0KLXZvaWQgUmVuZGVySW5saW5lOjphZGRDaGlsZFRv
Q29udGludWF0aW9uKFJlbmRlck9iamVjdCogbmV3Q2hpbGQsIFJlbmRlck9iamVjdCogYmVmb3Jl
Q2hpbGQpCi17Ci0gICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGZsb3cgPSBjb250aW51YXRpb25C
ZWZvcmUoYmVmb3JlQ2hpbGQpOwotICAgIEFTU0VSVCghYmVmb3JlQ2hpbGQgfHwgYmVmb3JlQ2hp
bGQtPnBhcmVudCgpLT5pc1JlbmRlckJsb2NrKCkgfHwgYmVmb3JlQ2hpbGQtPnBhcmVudCgpLT5p
c1JlbmRlcklubGluZSgpKTsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogYmVmb3JlQ2hpbGRQ
YXJlbnQgPSAwOwotICAgIGlmIChiZWZvcmVDaGlsZCkKLSAgICAgICAgYmVmb3JlQ2hpbGRQYXJl
bnQgPSB0b1JlbmRlckJveE1vZGVsT2JqZWN0KGJlZm9yZUNoaWxkLT5wYXJlbnQoKSk7Ci0gICAg
ZWxzZSB7Ci0gICAgICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBjb250ID0gbmV4dENvbnRpbnVh
dGlvbihmbG93KTsKLSAgICAgICAgaWYgKGNvbnQpCi0gICAgICAgICAgICBiZWZvcmVDaGlsZFBh
cmVudCA9IGNvbnQ7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGJlZm9yZUNoaWxkUGFyZW50
ID0gZmxvdzsKLSAgICB9Ci0KLSAgICBpZiAobmV3Q2hpbGQtPmlzRmxvYXRpbmdPclBvc2l0aW9u
ZWQoKSkKLSAgICAgICAgcmV0dXJuIGJlZm9yZUNoaWxkUGFyZW50LT5hZGRDaGlsZElnbm9yaW5n
Q29udGludWF0aW9uKG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7Ci0KLSAgICAvLyBBIGNvbnRpbnVh
dGlvbiBhbHdheXMgY29uc2lzdHMgb2YgdHdvIHBvdGVudGlhbCBjYW5kaWRhdGVzOiBhbiBpbmxp
bmUgb3IgYW4gYW5vbnltb3VzCi0gICAgLy8gYmxvY2sgYm94IGhvbGRpbmcgYmxvY2sgY2hpbGRy
ZW4uCi0gICAgYm9vbCBjaGlsZElubGluZSA9IG5ld0NoaWxkLT5pc0lubGluZSgpOwotICAgIGJv
b2wgYmNwSW5saW5lID0gYmVmb3JlQ2hpbGRQYXJlbnQtPmlzSW5saW5lKCk7Ci0gICAgYm9vbCBm
bG93SW5saW5lID0gZmxvdy0+aXNJbmxpbmUoKTsKLQotICAgIGlmIChmbG93ID09IGJlZm9yZUNo
aWxkUGFyZW50KQotICAgICAgICByZXR1cm4gZmxvdy0+YWRkQ2hpbGRJZ25vcmluZ0NvbnRpbnVh
dGlvbihuZXdDaGlsZCwgYmVmb3JlQ2hpbGQpOwotICAgIGVsc2UgewotICAgICAgICAvLyBUaGUg
Z29hbCBoZXJlIGlzIHRvIG1hdGNoIHVwIGlmIHdlIGNhbiwgc28gdGhhdCB3ZSBjYW4gY29hbGVz
Y2UgYW5kIGNyZWF0ZSB0aGUKLSAgICAgICAgLy8gbWluaW1hbCAjIG9mIGNvbnRpbnVhdGlvbnMg
bmVlZGVkIGZvciB0aGUgaW5saW5lLgotICAgICAgICBpZiAoY2hpbGRJbmxpbmUgPT0gYmNwSW5s
aW5lKQotICAgICAgICAgICAgcmV0dXJuIGJlZm9yZUNoaWxkUGFyZW50LT5hZGRDaGlsZElnbm9y
aW5nQ29udGludWF0aW9uKG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7Ci0gICAgICAgIGVsc2UgaWYg
KGZsb3dJbmxpbmUgPT0gY2hpbGRJbmxpbmUpCi0gICAgICAgICAgICByZXR1cm4gZmxvdy0+YWRk
Q2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihuZXdDaGlsZCwgMCk7IC8vIEp1c3QgdHJlYXQgbGlr
ZSBhbiBhcHBlbmQuCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBiZWZvcmVDaGls
ZFBhcmVudC0+YWRkQ2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihuZXdDaGlsZCwgYmVmb3JlQ2hp
bGQpOwotICAgIH0KLX0KLQogdm9pZCBSZW5kZXJJbmxpbmU6OnBhaW50KFBhaW50SW5mbyYgcGFp
bnRJbmZvLCBpbnQgdHgsIGludCB0eSkKIHsKICAgICBtX2xpbmVCb3hlcy5wYWludCh0aGlzLCBw
YWludEluZm8sIHR4LCB0eSk7CkBAIC00MTAsMTYgKzE5Niw2IEBAIHZvaWQgUmVuZGVySW5saW5l
OjphYnNvbHV0ZVJlY3RzKFZlY3RvcjwKICAgICAgICAgICAgIHJlY3RzLmFwcGVuZChJbnRSZWN0
KHR4ICsgY3Vyci0+eCgpLCB0eSArIGN1cnItPnkoKSwgY3Vyci0+d2lkdGgoKSwgY3Vyci0+aGVp
Z2h0KCkpKTsKICAgICB9IGVsc2UKICAgICAgICAgcmVjdHMuYXBwZW5kKEludFJlY3QodHgsIHR5
LCAwLCAwKSk7Ci0KLSAgICBpZiAoY29udGludWF0aW9uKCkpIHsKLSAgICAgICAgaWYgKGNvbnRp
bnVhdGlvbigpLT5pc0JveCgpKSB7Ci0gICAgICAgICAgICBSZW5kZXJCb3gqIGJveCA9IHRvUmVu
ZGVyQm94KGNvbnRpbnVhdGlvbigpKTsKLSAgICAgICAgICAgIGNvbnRpbnVhdGlvbigpLT5hYnNv
bHV0ZVJlY3RzKHJlY3RzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHR4IC0gY29udGFpbmluZ0Jsb2NrKCktPngoKSArIGJveC0+eCgpLAotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHkgLSBjb250YWluaW5nQmxvY2soKS0+eSgp
ICsgYm94LT55KCkpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIGNvbnRpbnVhdGlvbigp
LT5hYnNvbHV0ZVJlY3RzKHJlY3RzLCB0eCAtIGNvbnRhaW5pbmdCbG9jaygpLT54KCksIHR5IC0g
Y29udGFpbmluZ0Jsb2NrKCktPnkoKSk7Ci0gICAgfQogfQogCiB2b2lkIFJlbmRlcklubGluZTo6
YWJzb2x1dGVRdWFkcyhWZWN0b3I8RmxvYXRRdWFkPiYgcXVhZHMpCkBAIC00MzEsOSArMjA3LDYg
QEAgdm9pZCBSZW5kZXJJbmxpbmU6OmFic29sdXRlUXVhZHMoVmVjdG9yPAogICAgICAgICB9CiAg
ICAgfSBlbHNlCiAgICAgICAgIHF1YWRzLmFwcGVuZChsb2NhbFRvQWJzb2x1dGVRdWFkKEZsb2F0
UmVjdCgpKSk7Ci0KLSAgICBpZiAoY29udGludWF0aW9uKCkpCi0gICAgICAgIGNvbnRpbnVhdGlv
bigpLT5hYnNvbHV0ZVF1YWRzKHF1YWRzKTsKIH0KIAogaW50IFJlbmRlcklubGluZTo6b2Zmc2V0
TGVmdCgpIGNvbnN0CkBAIC01MDIsMTggKzI3NSw2IEBAIFZpc2libGVQb3NpdGlvbiBSZW5kZXJJ
bmxpbmU6OnBvc2l0aW9uRm8KICAgICAgICAgLy8gc2hvdWxkIHRyeSB0byBmaW5kIGEgcmVzdWx0
IGJ5IGFza2luZyBvdXIgY29udGFpbmluZyBibG9jay4KICAgICAgICAgcmV0dXJuIGNiLT5wb3Np
dGlvbkZvclBvaW50KHBvaW50KTsKICAgICB9Ci0KLSAgICAvLyBUcmFuc2xhdGUgdGhlIGNvb3Jk
cyBmcm9tIHRoZSBwcmUtYW5vbnltb3VzIGJsb2NrIHRvIHRoZSBwb3N0LWFub255bW91cyBibG9j
ay4KLSAgICBpbnQgcGFyZW50QmxvY2tYID0gY2ItPngoKSArIHBvaW50LngoKTsKLSAgICBpbnQg
cGFyZW50QmxvY2tZID0gY2ItPnkoKSArIHBvaW50LnkoKTsKLSAgICBSZW5kZXJCb3hNb2RlbE9i
amVjdCogYyA9IGNvbnRpbnVhdGlvbigpOwotICAgIHdoaWxlIChjKSB7Ci0gICAgICAgIFJlbmRl
ckJveCogY29udEJsb2NrID0gYy0+aXNJbmxpbmUoKSA/IGMtPmNvbnRhaW5pbmdCbG9jaygpIDog
dG9SZW5kZXJCbG9jayhjKTsKLSAgICAgICAgaWYgKGMtPmlzSW5saW5lKCkgfHwgYy0+Zmlyc3RD
aGlsZCgpKQotICAgICAgICAgICAgcmV0dXJuIGMtPnBvc2l0aW9uRm9yQ29vcmRpbmF0ZXMocGFy
ZW50QmxvY2tYIC0gY29udEJsb2NrLT54KCksIHBhcmVudEJsb2NrWSAtIGNvbnRCbG9jay0+eSgp
KTsKLSAgICAgICAgYyA9IHRvUmVuZGVyQmxvY2soYyktPmlubGluZUNvbnRpbnVhdGlvbigpOwot
ICAgIH0KLSAgICAKICAgICByZXR1cm4gUmVuZGVyQm94TW9kZWxPYmplY3Q6OnBvc2l0aW9uRm9y
UG9pbnQocG9pbnQpOwogfQogCkBAIC01NDksNyArMzEwLDcgQEAgSW50UmVjdCBSZW5kZXJJbmxp
bmU6OmNsaXBwZWRPdmVyZmxvd1JlYwogICAgIC8vIE9ubHkgcnVuLWlucyBhcmUgYWxsb3dlZCBp
biBoZXJlIGR1cmluZyBsYXlvdXQuCiAgICAgQVNTRVJUKCF2aWV3KCkgfHwgIXZpZXcoKS0+bGF5
b3V0U3RhdGVFbmFibGVkKCkgfHwgaXNSdW5JbigpKTsKIAotICAgIGlmICghZmlyc3RMaW5lQm94
KCkgJiYgIWNvbnRpbnVhdGlvbigpKQorICAgIGlmICghZmlyc3RMaW5lQm94KCkpCiAgICAgICAg
IHJldHVybiBJbnRSZWN0KCk7CiAKICAgICAvLyBGaW5kIG91ciBsZWZ0bW9zdCBwb3NpdGlvbi4K
QEAgLTU5NywxMSArMzU4LDYgQEAgSW50UmVjdCBSZW5kZXJJbmxpbmU6OmNsaXBwZWRPdmVyZmxv
d1JlYwogICAgICAgICAgICAgICAgIHIudW5pdGUoY2hpbGRSZWN0KTsKICAgICAgICAgICAgIH0K
ICAgICAgICAgfQotCi0gICAgICAgIGlmIChjb250aW51YXRpb24oKSAmJiAhY29udGludWF0aW9u
KCktPmlzSW5saW5lKCkpIHsKLSAgICAgICAgICAgIEludFJlY3QgY29udFJlY3QgPSBjb250aW51
YXRpb24oKS0+cmVjdFdpdGhPdXRsaW5lRm9yUmVwYWludChyZXBhaW50Q29udGFpbmVyLCBvdyk7
Ci0gICAgICAgICAgICByLnVuaXRlKGNvbnRSZWN0KTsKLSAgICAgICAgfQogICAgIH0KIAogICAg
IHJldHVybiByOwpAQCAtNjgwLDQ5ICs0MzYsNiBAQCB2b2lkIFJlbmRlcklubGluZTo6Y29tcHV0
ZVJlY3RGb3JSZXBhaW50CiAgICAgby0+Y29tcHV0ZVJlY3RGb3JSZXBhaW50KHJlcGFpbnRDb250
YWluZXIsIHJlY3QsIGZpeGVkKTsKIH0KIAotdm9pZCBSZW5kZXJJbmxpbmU6OnVwZGF0ZURyYWdT
dGF0ZShib29sIGRyYWdPbikKLXsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdDo6dXBkYXRlRHJh
Z1N0YXRlKGRyYWdPbik7Ci0gICAgaWYgKGNvbnRpbnVhdGlvbigpKQotICAgICAgICBjb250aW51
YXRpb24oKS0+dXBkYXRlRHJhZ1N0YXRlKGRyYWdPbik7Ci19Ci0KLXZvaWQgUmVuZGVySW5saW5l
OjpjaGlsZEJlY2FtZU5vbklubGluZShSZW5kZXJPYmplY3QqIGNoaWxkKQotewotICAgIC8vIFdl
IGhhdmUgdG8gc3BsaXQgdGhlIHBhcmVudCBmbG93LgotICAgIFJlbmRlckJsb2NrKiBuZXdCb3gg
PSBjb250YWluaW5nQmxvY2soKS0+Y3JlYXRlQW5vbnltb3VzQmxvY2soKTsKLSAgICBSZW5kZXJC
b3hNb2RlbE9iamVjdCogb2xkQ29udGludWF0aW9uID0gY29udGludWF0aW9uKCk7Ci0gICAgc2V0
Q29udGludWF0aW9uKG5ld0JveCk7Ci0gICAgUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCA9IGNo
aWxkLT5uZXh0U2libGluZygpOwotICAgIGNoaWxkcmVuKCktPnJlbW92ZUNoaWxkTm9kZSh0aGlz
LCBjaGlsZCk7Ci0gICAgc3BsaXRGbG93KGJlZm9yZUNoaWxkLCBuZXdCb3gsIGNoaWxkLCBvbGRD
b250aW51YXRpb24pOwotfQotCi12b2lkIFJlbmRlcklubGluZTo6dXBkYXRlSGl0VGVzdFJlc3Vs
dChIaXRUZXN0UmVzdWx0JiByZXN1bHQsIGNvbnN0IEludFBvaW50JiBwb2ludCkKLXsKLSAgICBp
ZiAocmVzdWx0LmlubmVyTm9kZSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBOb2RlKiBuID0g
bm9kZSgpOwotICAgIEludFBvaW50IGxvY2FsUG9pbnQocG9pbnQpOwotICAgIGlmIChuKSB7Ci0g
ICAgICAgIGlmIChpc0lubGluZUNvbnRpbnVhdGlvbigpKSB7Ci0gICAgICAgICAgICAvLyBXZSdy
ZSBpbiB0aGUgY29udGludWF0aW9uIG9mIGEgc3BsaXQgaW5saW5lLiAgQWRqdXN0IG91ciBsb2Nh
bCBwb2ludCB0byBiZSBpbiB0aGUgY29vcmRpbmF0ZSBzcGFjZQotICAgICAgICAgICAgLy8gb2Yg
dGhlIHByaW5jaXBhbCByZW5kZXJlcidzIGNvbnRhaW5pbmcgYmxvY2suICBUaGlzIHdpbGwgZW5k
IHVwIGJlaW5nIHRoZSBpbm5lck5vblNoYXJlZE5vZGUuCi0gICAgICAgICAgICBSZW5kZXJCbG9j
ayogZmlyc3RCbG9jayA9IG4tPnJlbmRlcmVyKCktPmNvbnRhaW5pbmdCbG9jaygpOwotICAgICAg
ICAgICAgCi0gICAgICAgICAgICAvLyBHZXQgb3VyIGNvbnRhaW5pbmcgYmxvY2suCi0gICAgICAg
ICAgICBSZW5kZXJCb3gqIGJsb2NrID0gY29udGFpbmluZ0Jsb2NrKCk7Ci0gICAgICAgICAgICBs
b2NhbFBvaW50Lm1vdmUoYmxvY2stPngoKSAtIGZpcnN0QmxvY2stPngoKSwgYmxvY2stPnkoKSAt
IGZpcnN0QmxvY2stPnkoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQuc2V0SW5uZXJO
b2RlKG4pOwotICAgICAgICBpZiAoIXJlc3VsdC5pbm5lck5vblNoYXJlZE5vZGUoKSkKLSAgICAg
ICAgICAgIHJlc3VsdC5zZXRJbm5lck5vblNoYXJlZE5vZGUobik7Ci0gICAgICAgIHJlc3VsdC5z
ZXRMb2NhbFBvaW50KGxvY2FsUG9pbnQpOwotICAgIH0KLX0KLQogdm9pZCBSZW5kZXJJbmxpbmU6
OmRpcnR5TGluZUJveGVzKGJvb2wgZnVsbExheW91dCkKIHsKICAgICBpZiAoZnVsbExheW91dCkK
QEAgLTgzNiwxNyArNTQ5LDYgQEAgdm9pZCBSZW5kZXJJbmxpbmU6OmFkZEZvY3VzUmluZ1JlY3Rz
KEdyYQogICAgICAgICAgICBjdXJyLT5hZGRGb2N1c1JpbmdSZWN0cyhncmFwaGljc0NvbnRleHQs
IHBvcy54KCksIHBvcy55KCkpOwogICAgICAgICB9CiAgICAgfQotCi0gICAgaWYgKGNvbnRpbnVh
dGlvbigpKSB7Ci0gICAgICAgIGlmIChjb250aW51YXRpb24oKS0+aXNJbmxpbmUoKSkKLSAgICAg
ICAgICAgIGNvbnRpbnVhdGlvbigpLT5hZGRGb2N1c1JpbmdSZWN0cyhncmFwaGljc0NvbnRleHQs
IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4IC0gY29u
dGFpbmluZ0Jsb2NrKCktPngoKSArIGNvbnRpbnVhdGlvbigpLT5jb250YWluaW5nQmxvY2soKS0+
eCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5IC0g
Y29udGFpbmluZ0Jsb2NrKCktPnkoKSArIGNvbnRpbnVhdGlvbigpLT5jb250YWluaW5nQmxvY2so
KS0+eSgpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgY29udGludWF0aW9uKCktPmFkZEZv
Y3VzUmluZ1JlY3RzKGdyYXBoaWNzQ29udGV4dCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgdHggLSBjb250YWluaW5nQmxvY2soKS0+eCgpICsgdG9SZW5k
ZXJCb3goY29udGludWF0aW9uKCkpLT54KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgdHkgLSBjb250YWluaW5nQmxvY2soKS0+eSgpICsgdG9SZW5kZXJC
b3goY29udGludWF0aW9uKCkpLT55KCkpOwotICAgIH0KIH0KIAogdm9pZCBSZW5kZXJJbmxpbmU6
OnBhaW50T3V0bGluZShHcmFwaGljc0NvbnRleHQqIGdyYXBoaWNzQ29udGV4dCwgaW50IHR4LCBp
bnQgdHkpCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJJbmxpbmUuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJJbmxpbmUuaAkocmV2aXNpb24gNDc1OTEpCisr
KyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJJbmxpbmUuaAkod29ya2luZyBjb3B5KQpAQCAtNTUs
MTAgKzU1LDYgQEAgcHVibGljOgogCiAgICAgSW5saW5lRmxvd0JveCogZmlyc3RMaW5lQm94KCkg
Y29uc3QgeyByZXR1cm4gbV9saW5lQm94ZXMuZmlyc3RMaW5lQm94KCk7IH0KICAgICBJbmxpbmVG
bG93Qm94KiBsYXN0TGluZUJveCgpIGNvbnN0IHsgcmV0dXJuIG1fbGluZUJveGVzLmxhc3RMaW5l
Qm94KCk7IH0KLQotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBjb250aW51YXRpb24oKSBjb25z
dCB7IHJldHVybiBtX2NvbnRpbnVhdGlvbjsgfQotCi0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZURy
YWdTdGF0ZShib29sIGRyYWdPbik7CiAgICAgCiAgICAgSW50U2l6ZSByZWxhdGl2ZVBvc2l0aW9u
ZWRJbmxpbmVPZmZzZXQoY29uc3QgUmVuZGVyQm94KiBjaGlsZCkgY29uc3Q7CiAKQEAgLTc4LDkg
Kzc0LDYgQEAgcHJpdmF0ZToKIAogICAgIHZpcnR1YWwgYm9vbCBpc1JlbmRlcklubGluZSgpIGNv
bnN0IHsgcmV0dXJuIHRydWU7IH0KIAotICAgIHZvaWQgYWRkQ2hpbGRUb0NvbnRpbnVhdGlvbihS
ZW5kZXJPYmplY3QqIG5ld0NoaWxkLCBSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkKTsKLSAgICB2
aXJ0dWFsIHZvaWQgYWRkQ2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihSZW5kZXJPYmplY3QqIG5l
d0NoaWxkLCBSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkID0gMCk7Ci0KICAgICB2b2lkIHNwbGl0
SW5saW5lcyhSZW5kZXJCbG9jayogZnJvbUJsb2NrLCBSZW5kZXJCbG9jayogdG9CbG9jaywgUmVu
ZGVyQmxvY2sqIG1pZGRsZUJsb2NrLAogICAgICAgICAgICAgICAgICAgICAgIFJlbmRlck9iamVj
dCogYmVmb3JlQ2hpbGQsIFJlbmRlckJveE1vZGVsT2JqZWN0KiBvbGRDb250KTsKICAgICB2b2lk
IHNwbGl0RmxvdyhSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkLCBSZW5kZXJCbG9jayogbmV3Qmxv
Y2tCb3gsCkBAIC0xMjAsMTMgKzExMyw4IEBAIHByaXZhdGU6CiAKICAgICB2aXJ0dWFsIGludCBs
aW5lSGVpZ2h0KGJvb2wgZmlyc3RMaW5lLCBib29sIGlzUm9vdExpbmVCb3ggPSBmYWxzZSkgY29u
c3Q7CiAKLSAgICBSZW5kZXJJbmxpbmUqIGlubGluZUNvbnRpbnVhdGlvbigpIGNvbnN0OwotICAg
IHZvaWQgc2V0Q29udGludWF0aW9uKFJlbmRlckJveE1vZGVsT2JqZWN0KiBjKSB7IG1fY29udGlu
dWF0aW9uID0gYzsgfQotICAgIAogICAgIHZpcnR1YWwgdm9pZCBjaGlsZEJlY2FtZU5vbklubGlu
ZShSZW5kZXJPYmplY3QqIGNoaWxkKTsKIAotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVIaXRUZXN0
UmVzdWx0KEhpdFRlc3RSZXN1bHQmLCBjb25zdCBJbnRQb2ludCYpOwotCiAgICAgdmlydHVhbCB2
b2lkIGltYWdlQ2hhbmdlZChXcmFwcGVkSW1hZ2VQdHIsIGNvbnN0IEludFJlY3QqID0gMCk7CiAK
ICNpZiBFTkFCTEUoREFTSEJPQVJEX1NVUFBPUlQpCkBAIC0xMzksMTMgKzEyNywxMCBAQCBwcml2
YXRlOgogICAgIHN0YXRpYyBSZW5kZXJJbmxpbmUqIGNsb25lSW5saW5lKFJlbmRlcklubGluZSog
c3JjKTsKIAogICAgIHZvaWQgcGFpbnRPdXRsaW5lRm9yTGluZShHcmFwaGljc0NvbnRleHQqLCBp
bnQgdHgsIGludCB0eSwgY29uc3QgSW50UmVjdCYgcHJldkxpbmUsIGNvbnN0IEludFJlY3QmIHRo
aXNMaW5lLCBjb25zdCBJbnRSZWN0JiBuZXh0TGluZSk7Ci0gICAgUmVuZGVyQm94TW9kZWxPYmpl
Y3QqIGNvbnRpbnVhdGlvbkJlZm9yZShSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkKTsKIAogICAg
IFJlbmRlck9iamVjdENoaWxkTGlzdCBtX2NoaWxkcmVuOwogICAgIFJlbmRlckxpbmVCb3hMaXN0
IG1fbGluZUJveGVzOyAgIC8vIEFsbCBvZiB0aGUgbGluZSBib3hlcyBjcmVhdGVkIGZvciB0aGlz
IGlubGluZSBmbG93LiAgRm9yIGV4YW1wbGUsIDxpPkhlbGxvPGJyPndvcmxkLjwvaT4gd2lsbCBo
YXZlIHR3byA8aT4gbGluZSBib3hlcy4KIAotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBtX2Nv
bnRpbnVhdGlvbjsgLy8gQ2FuIGJlIGVpdGhlciBhIGJsb2NrIG9yIGFuIGlubGluZS4gPGI+PGk+
PHA+SGVsbG88L3A+PC9pPjwvYj4uIEluIHRoaXMgZXhhbXBsZSB0aGUgPGk+IHdpbGwgaGF2ZSBh
IGJsb2NrIGFzIGl0cyBjb250aW51YXRpb24gYnV0IHRoZQotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgLy8gPGI+IHdpbGwganVzdCBoYXZlIGFuIGlubGluZSBhcyBp
dHMgY29udGludWF0aW9uLgogICAgIG11dGFibGUgaW50IG1fbGluZUhlaWdodDsKICAgICBtdXRh
YmxlIGludCBtX3ZlcnRpY2FsUG9zaXRpb247CiB9OwpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcv
UmVuZGVyTGluZUJveExpc3QuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1Jl
bmRlckxpbmVCb3hMaXN0LmNwcAkocmV2aXNpb24gNDc1OTEpCisrKyBXZWJDb3JlL3JlbmRlcmlu
Zy9SZW5kZXJMaW5lQm94TGlzdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE0NiwxMiArMTQ2LDYg
QEAgdm9pZCBSZW5kZXJMaW5lQm94TGlzdDo6ZGlydHlMaW5lQm94ZXMoKQogCiB2b2lkIFJlbmRl
ckxpbmVCb3hMaXN0OjpwYWludChSZW5kZXJCb3hNb2RlbE9iamVjdCogcmVuZGVyZXIsIFJlbmRl
ck9iamVjdDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGludCB0eCwgaW50IHR5KSBjb25zdAogewot
ICAgIC8vIE9ubHkgcGFpbnQgZHVyaW5nIHRoZSBmb3JlZ3JvdW5kL3NlbGVjdGlvbiBwaGFzZXMu
Ci0gICAgaWYgKHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlRm9yZWdyb3VuZCAmJiBwYWlu
dEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZVNlbGVjdGlvbiAmJiBwYWludEluZm8ucGhhc2UgIT0g
UGFpbnRQaGFzZU91dGxpbmUgCi0gICAgICAgICYmIHBhaW50SW5mby5waGFzZSAhPSBQYWludFBo
YXNlU2VsZk91dGxpbmUgJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VDaGlsZE91dGxp
bmVzICYmIHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlVGV4dENsaXAKLSAgICAgICAgJiYg
cGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VNYXNrKQotICAgICAgICByZXR1cm47Ci0KICAg
ICBBU1NFUlQocmVuZGVyZXItPmlzUmVuZGVyQmxvY2soKSB8fCAocmVuZGVyZXItPmlzUmVuZGVy
SW5saW5lKCkgJiYgcmVuZGVyZXItPmhhc0xheWVyKCkpKTsgLy8gVGhlIG9ubHkgd2F5IGFuIGlu
bGluZSBjb3VsZCBwYWludCBsaWtlIHRoaXMgaXMgaWYgaXQgaGFzIGEgbGF5ZXIuCiAKICAgICAv
LyBJZiB3ZSBoYXZlIG5vIGxpbmVzIHRoZW4gd2UgaGF2ZSBubyB3b3JrIHRvIGRvLgpJbmRleDog
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3JlbmRlcmluZy9SZW5kZXJPYmplY3QuY3BwCShyZXZpc2lvbiA0NzU5MSkKKysrIFdlYkNvcmUv
cmVuZGVyaW5nL1JlbmRlck9iamVjdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIxMTIsOCArMjEx
Miw2IEBAIHZvaWQgUmVuZGVyT2JqZWN0OjpnZXRUZXh0RGVjb3JhdGlvbkNvbG8KICAgICAgICAg
ICAgIH0KICAgICAgICAgfQogICAgICAgICBjdXJyID0gY3Vyci0+cGFyZW50KCk7Ci0gICAgICAg
IGlmIChjdXJyICYmIGN1cnItPmlzUmVuZGVyQmxvY2soKSAmJiB0b1JlbmRlckJsb2NrKGN1cnIp
LT5pbmxpbmVDb250aW51YXRpb24oKSkKLSAgICAgICAgICAgIGN1cnIgPSB0b1JlbmRlckJsb2Nr
KGN1cnIpLT5pbmxpbmVDb250aW51YXRpb24oKTsKICAgICB9IHdoaWxlIChjdXJyICYmIGRlY29y
YXRpb25zICYmICghcXVpcmtzTW9kZSB8fCAhY3Vyci0+bm9kZSgpIHx8CiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgKCFjdXJyLT5ub2RlKCktPmhhc1RhZ05hbWUoYVRhZykg
JiYgIWN1cnItPm5vZGUoKS0+aGFzVGFnTmFtZShmb250VGFnKSkpKTsKIApJbmRleDogV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJp
bmcvUmVuZGVyT2JqZWN0LmgJKHJldmlzaW9uIDQ3NTkxKQorKysgV2ViQ29yZS9yZW5kZXJpbmcv
UmVuZGVyT2JqZWN0LmgJKHdvcmtpbmcgY29weSkKQEAgLTM0Myw2ICszNDMsMTAgQEAgcHVibGlj
OgogICAgIHsKICAgICAgICAgcmV0dXJuIG1faXNBbm9ueW1vdXMgJiYgc3R5bGUoKS0+ZGlzcGxh
eSgpID09IEJMT0NLICYmIHN0eWxlKCktPnN0eWxlVHlwZSgpID09IE5PUFNFVURPICYmICFpc0xp
c3RNYXJrZXIoKTsKICAgICB9CisgICAgYm9vbCBpc0Fub255bW91c0lubGluZUJsb2NrKCkgY29u
c3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX2lzQW5vbnltb3VzICYmIHN0eWxlKCktPmRpc3Bs
YXkoKSA9PSBJTkxJTkVfQkxPQ0sgJiYgc3R5bGUoKS0+c3R5bGVUeXBlKCkgPT0gTk9QU0VVRE87
CisgICAgfQogICAgIGJvb2wgaXNJbmxpbmVDb250aW51YXRpb24oKSBjb25zdCB7IHJldHVybiAo
bm9kZSgpID8gbm9kZSgpLT5yZW5kZXJlcigpICE9IHRoaXMgOiBmYWxzZSkgJiYgaXNSZW5kZXJJ
bmxpbmUoKTsgfQogICAgIGJvb2wgaXNGbG9hdGluZygpIGNvbnN0IHsgcmV0dXJuIG1fZmxvYXRp
bmc7IH0KICAgICBib29sIGlzUG9zaXRpb25lZCgpIGNvbnN0IHsgcmV0dXJuIG1fcG9zaXRpb25l
ZDsgfSAvLyBhYnNvbHV0ZSBvciBmaXhlZCBwb3NpdGlvbmluZwpJbmRleDogV2ViQ29yZS9yZW5k
ZXJpbmcvUmVuZGVyT2JqZWN0Q2hpbGRMaXN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3Jl
bmRlcmluZy9SZW5kZXJPYmplY3RDaGlsZExpc3QuY3BwCShyZXZpc2lvbiA0NzU5MSkKKysrIFdl
YkNvcmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdENoaWxkTGlzdC5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTMxMSwxNiArMzExLDYgQEAgdm9pZCBSZW5kZXJPYmplY3RDaGlsZExpc3Q6OnVwZGF0ZUJl
Zm9yZQogCiAgICAgLy8gV2hldGhlciBvciBub3Qgd2Ugbm93IHdhbnQgZ2VuZXJhdGVkIGNvbnRl
bnQuICAKICAgICBib29sIG5ld0NvbnRlbnRXYW50ZWQgPSBwc2V1ZG9FbGVtZW50U3R5bGUgJiYg
cHNldWRvRWxlbWVudFN0eWxlLT5kaXNwbGF5KCkgIT0gTk9ORTsKLQotICAgIC8vIEZvciA8cT48
cC8+PC9xPiwgaWYgdGhpcyBvYmplY3QgaXMgdGhlIGlubGluZSBjb250aW51YXRpb24gb2YgdGhl
IDxxPiwgd2Ugb25seSB3YW50IHRvIGdlbmVyYXRlCi0gICAgLy8gOmFmdGVyIGNvbnRlbnQgYW5k
IG5vdCA6YmVmb3JlIGNvbnRlbnQuCi0gICAgaWYgKG5ld0NvbnRlbnRXYW50ZWQgJiYgdHlwZSA9
PSBCRUZPUkUgJiYgb3duZXItPmlzUmVuZGVySW5saW5lKCkgJiYgdG9SZW5kZXJJbmxpbmUob3du
ZXIpLT5pc0lubGluZUNvbnRpbnVhdGlvbigpKQotICAgICAgICBuZXdDb250ZW50V2FudGVkID0g
ZmFsc2U7Ci0KLSAgICAvLyBTaW1pbGFybHksIGlmIHdlJ3JlIHRoZSBiZWdpbm5pbmcgb2YgYSA8
cT4sIGFuZCB0aGVyZSdzIGFuIGlubGluZSBjb250aW51YXRpb24gZm9yIG91ciBvYmplY3QsCi0g
ICAgLy8gdGhlbiB3ZSBkb24ndCBnZW5lcmF0ZSB0aGUgOmFmdGVyIGNvbnRlbnQuCi0gICAgaWYg
KG5ld0NvbnRlbnRXYW50ZWQgJiYgdHlwZSA9PSBBRlRFUiAmJiBvd25lci0+aXNSZW5kZXJJbmxp
bmUoKSAmJiB0b1JlbmRlcklubGluZShvd25lciktPmNvbnRpbnVhdGlvbigpKQotICAgICAgICBu
ZXdDb250ZW50V2FudGVkID0gZmFsc2U7CiAgICAgCiAgICAgLy8gSWYgd2UgZG9uJ3Qgd2FudCBn
ZW5lcmF0ZWQgY29udGVudCBhbnkgbG9uZ2VyLCBvciBpZiB3ZSBoYXZlIGdlbmVyYXRlZCBjb250
ZW50LCBidXQgaXQncyBubyBsb25nZXIKICAgICAvLyBpZGVudGljYWwgdG8gdGhlIG5ldyBjb250
ZW50IGRhdGEgd2Ugd2FudCB0byBidWlsZCByZW5kZXIgb2JqZWN0cyBmb3IsIHRoZW4gd2UgbnVr
ZSBhbGwKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1Jvb3RJbmxpbmVCb3guY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1Jvb3RJbmxpbmVCb3guY3BwCShyZXZpc2lvbiA0NzU5
MSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1Jvb3RJbmxpbmVCb3guY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSAiUGFnZS5oIgogI2luY2x1ZGUgIlJlbmRlckFy
ZW5hLmgiCiAjaW5jbHVkZSAiUmVuZGVyQmxvY2suaCIKKyNpbmNsdWRlICJSZW5kZXJWaWV3Lmgi
CiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKQEAgLTE2Miw2ICsxNjMsNDYgQEAgdm9pZCBSb290
SW5saW5lQm94OjpwYWludEN1c3RvbUhpZ2hsaWdodAogCiB2b2lkIFJvb3RJbmxpbmVCb3g6OnBh
aW50KFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGludCB0eCwgaW50IHR5KQog
eworICAgIFJlbmRlckJsb2NrKiBjaGlsZCA9IGFub255bW91c0lubGluZUJsb2NrKCk7CisgICAg
aWYgKGNoaWxkKSB7CisgICAgICAgIC8vIFRyZWF0IHBhaW50aW5nIG9mIGEgc3BlY2lhbCBpbmxp
bmUtYmxvY2sgbGluZSBsaWtlIHRoZSBwYWludGluZyBvZiBhIG5vcm1hbCBibG9jayBhbmQgZ28g
dGhyb3VnaCBhbGwgcGhhc2VzLgorICAgICAgICBQYWludFBoYXNlIG5ld1BoYXNlID0gKHBhaW50
SW5mby5waGFzZSA9PSBQYWludFBoYXNlQ2hpbGRPdXRsaW5lcykgPyBQYWludFBoYXNlT3V0bGlu
ZSA6IHBhaW50SW5mby5waGFzZTsKKyAgICAgICAgbmV3UGhhc2UgPSAobmV3UGhhc2UgPT0gUGFp
bnRQaGFzZUNoaWxkQmxvY2tCYWNrZ3JvdW5kcykgPyBQYWludFBoYXNlQ2hpbGRCbG9ja0JhY2tn
cm91bmQgOiBuZXdQaGFzZTsKKyAgICAKKyAgICAgICAgLy8gV2UgZG9uJ3QgcGFpbnQgb3VyIG93
biBiYWNrZ3JvdW5kLCBidXQgd2UgZG8gbGV0IHRoZSBjaGlsZCBwYWludCBpdHMgYmFja2dyb3Vu
ZC4KKyAgICAgICAgUmVuZGVyT2JqZWN0OjpQYWludEluZm8gaW5mbyhwYWludEluZm8pOworICAg
ICAgICBpbmZvLnBoYXNlID0gbmV3UGhhc2U7CisgICAgICAgIGluZm8ucGFpbnRpbmdSb290ID0g
cmVuZGVyZXIoKS0+cGFpbnRpbmdSb290Rm9yQ2hpbGRyZW4ocGFpbnRJbmZvKTsKKyAgICAgICAg
Ym9vbCBpc1ByaW50aW5nID0gcmVuZGVyZXIoKS0+ZG9jdW1lbnQoKS0+cHJpbnRpbmcoKTsKKyAg
ICAgICAgCisgICAgICAgIC8vIENoZWNrIGZvciBwYWdlLWJyZWFrLWJlZm9yZTogYWx3YXlzLCBh
bmQgaWYgaXQncyBzZXQsIGJyZWFrIGFuZCBiYWlsLgorICAgICAgICBpZiAoaXNQcmludGluZyAm
JiBjaGlsZC0+c3R5bGUoKS0+cGFnZUJyZWFrQmVmb3JlKCkgPT0gUEJBTFdBWVMgJiYKKyAgICAg
ICAgICAgIGJsb2NrKCktPmluUm9vdEJsb2NrQ29udGV4dCgpICYmICh0eSArIGNoaWxkLT55KCkp
ID4gcGFpbnRJbmZvLnJlY3QueSgpICYmIAorICAgICAgICAgICAgKHR5ICsgY2hpbGQtPnkoKSkg
PCBwYWludEluZm8ucmVjdC5ib3R0b20oKSkgeworICAgICAgICAgICAgcmVuZGVyZXIoKS0+dmll
dygpLT5zZXRCZXN0VHJ1bmNhdGVkQXQodHkgKyBjaGlsZC0+eSgpLCBibG9jaygpLCB0cnVlKTsK
KyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghY2hpbGQtPmhh
c1NlbGZQYWludGluZ0xheWVyKCkpCisgICAgICAgICAgICBjaGlsZC0+cGFpbnQoaW5mbywgdHgs
IHR5KTsKKworICAgICAgICAvLyBDaGVjayBmb3IgcGFnZS1icmVhay1hZnRlcjogYWx3YXlzLCBh
bmQgaWYgaXQncyBzZXQsIGJyZWFrIGFuZCBiYWlsLgorICAgICAgICBpZiAoaXNQcmludGluZyAm
JiBjaGlsZC0+c3R5bGUoKS0+cGFnZUJyZWFrQWZ0ZXIoKSA9PSBQQkFMV0FZUyAmJiAKKyAgICAg
ICAgICAgIGJsb2NrKCktPmluUm9vdEJsb2NrQ29udGV4dCgpICYmICh0eSArIGNoaWxkLT55KCkg
KyBjaGlsZC0+aGVpZ2h0KCkpID4gcGFpbnRJbmZvLnJlY3QueSgpICYmIAorICAgICAgICAgICAg
KHR5ICsgY2hpbGQtPnkoKSArIGNoaWxkLT5oZWlnaHQoKSkgPCBwYWludEluZm8ucmVjdC5ib3R0
b20oKSkgeworICAgICAgICAgICAgcmVuZGVyZXIoKS0+dmlldygpLT5zZXRCZXN0VHJ1bmNhdGVk
QXQodHkgKyBjaGlsZC0+eSgpICsgY2hpbGQtPmhlaWdodCgpICsgbWF4KDAsIGNoaWxkLT5jb2xs
YXBzZWRNYXJnaW5Cb3R0b20oKSksIGJsb2NrKCksIHRydWUpOworICAgICAgICAgICAgcmV0dXJu
OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8g
T25seSBwYWludCBkdXJpbmcgdGhlIGZvcmVncm91bmQvc2VsZWN0aW9uIHBoYXNlcyBpZiB3ZSBk
b24ndCBoYXZlIGEgc3BlY2lhbCBhbm9ueW1vdXMgaW5saW5lIGJsb2NrLgorICAgIGlmIChwYWlu
dEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZUZvcmVncm91bmQgJiYgcGFpbnRJbmZvLnBoYXNlICE9
IFBhaW50UGhhc2VTZWxlY3Rpb24gJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VPdXRs
aW5lIAorICAgICAgICAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZVNlbGZPdXRsaW5l
ICYmIHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlQ2hpbGRPdXRsaW5lcyAmJiBwYWludElu
Zm8ucGhhc2UgIT0gUGFpbnRQaGFzZVRleHRDbGlwCisgICAgICAgICYmIHBhaW50SW5mby5waGFz
ZSAhPSBQYWludFBoYXNlTWFzaykKKyAgICAgICAgcmV0dXJuOworCiAgICAgSW5saW5lRmxvd0Jv
eDo6cGFpbnQocGFpbnRJbmZvLCB0eCwgdHkpOwogICAgIHBhaW50RWxsaXBzaXNCb3gocGFpbnRJ
bmZvLCB0eCwgdHkpOwogI2lmIFBMQVRGT1JNKE1BQykKQEAgLTIwMyw2ICsyNDQsMTcgQEAgdm9p
ZCBSb290SW5saW5lQm94OjpjaGlsZFJlbW92ZWQoSW5saW5lQgogCiBpbnQgUm9vdElubGluZUJv
eDo6dmVydGljYWxseUFsaWduQm94ZXMoaW50IGhlaWdodE9mQmxvY2spCiB7CisgICAgUmVuZGVy
QmxvY2sqIGlubGluZUJsb2NrID0gYW5vbnltb3VzSW5saW5lQmxvY2soKTsKKyAgICBpZiAoaW5s
aW5lQmxvY2spIHsKKyAgICAgICAgaW50IGxpbmVUb3AgPSBpbmxpbmVCbG9jay0+eSgpOworICAg
ICAgICBpbnQgbGluZUJvdHRvbSA9IGlubGluZUJsb2NrLT55KCkgKyBpbmxpbmVCbG9jay0+aGVp
Z2h0KCk7CisgICAgICAgIGZpcnN0Q2hpbGQoKS0+c2V0WShsaW5lVG9wKTsKKyAgICAgICAgc2V0
WShsaW5lVG9wKTsKKyAgICAgICAgY29tcHV0ZVZlcnRpY2FsT3ZlcmZsb3cobGluZVRvcCwgbGlu
ZUJvdHRvbSwgdHJ1ZSk7CisgICAgICAgIHNldExpbmVUb3BCb3R0b21Qb3NpdGlvbnMobGluZVRv
cCwgbGluZUJvdHRvbSk7CisgICAgICAgIHJldHVybiBoZWlnaHRPZkJsb2NrOworICAgIH0KKyAg
ICAKICAgICBpbnQgbWF4UG9zaXRpb25Ub3AgPSAwOwogICAgIGludCBtYXhQb3NpdGlvbkJvdHRv
bSA9IDA7CiAgICAgaW50IG1heEFzY2VudCA9IDA7CkBAIC0yMTYsNyArMjY4LDYgQEAgaW50IFJv
b3RJbmxpbmVCb3g6OnZlcnRpY2FsbHlBbGlnbkJveGVzKAogICAgIGJvb2wgc3RyaWN0TW9kZSA9
IChjdXJyICYmIGN1cnItPmRvY3VtZW50KCktPmluU3RyaWN0TW9kZSgpKTsKIAogICAgIGNvbXB1
dGVMb2dpY2FsQm94SGVpZ2h0cyhtYXhQb3NpdGlvblRvcCwgbWF4UG9zaXRpb25Cb3R0b20sIG1h
eEFzY2VudCwgbWF4RGVzY2VudCwgc3RyaWN0TW9kZSk7Ci0KICAgICBpZiAobWF4QXNjZW50ICsg
bWF4RGVzY2VudCA8IG1heChtYXhQb3NpdGlvblRvcCwgbWF4UG9zaXRpb25Cb3R0b20pKQogICAg
ICAgICBhZGp1c3RNYXhBc2NlbnRBbmREZXNjZW50KG1heEFzY2VudCwgbWF4RGVzY2VudCwgbWF4
UG9zaXRpb25Ub3AsIG1heFBvc2l0aW9uQm90dG9tKTsKIApAQCAtNDI5LDQgKzQ4MCw5IEBAIHZv
aWQgUm9vdElubGluZUJveDo6YXR0YWNoTGluZUJveFRvUmVuZGUKICAgICBibG9jaygpLT5saW5l
Qm94ZXMoKS0+YXR0YWNoTGluZUJveCh0aGlzKTsKIH0KIAorUmVuZGVyQmxvY2sqIFJvb3RJbmxp
bmVCb3g6OmFub255bW91c0lubGluZUJsb2NrKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZmlyc3RD
aGlsZCgpICYmIGZpcnN0Q2hpbGQoKSA9PSBsYXN0Q2hpbGQoKSAmJiAhZmlyc3RDaGlsZCgpLT5p
c1RleHQoKSAmJiBmaXJzdENoaWxkKCktPnJlbmRlcmVyKCktPmlzQW5vbnltb3VzSW5saW5lQmxv
Y2soKSA/IHRvUmVuZGVyQmxvY2soZmlyc3RDaGlsZCgpLT5yZW5kZXJlcigpKSA6IDA7Cit9CisK
IH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1Jvb3RJbmxp
bmVCb3guaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9Sb290SW5saW5lQm94LmgJ
KHJldmlzaW9uIDQ3NTkxKQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUm9vdElubGluZUJveC5oCSh3
b3JraW5nIGNvcHkpCkBAIC0xMzQsNiArMTM0LDggQEAgcHVibGljOgogICAgIHZpcnR1YWwgdm9p
ZCBhdHRhY2hMaW5lQm94VG9SZW5kZXJPYmplY3QoKTsKICAgICB2aXJ0dWFsIHZvaWQgcmVtb3Zl
TGluZUJveEZyb21SZW5kZXJPYmplY3QoKTsKIAorICAgIFJlbmRlckJsb2NrKiBhbm9ueW1vdXNJ
bmxpbmVCbG9jaygpIGNvbnN0OworCiBwcm90ZWN0ZWQ6CiAgICAgLy8gV2hlcmUgdGhpcyBsaW5l
IGVuZGVkLiAgVGhlIGV4YWN0IG9iamVjdCBhbmQgdGhlIHBvc2l0aW9uIHdpdGhpbiB0aGF0IG9i
amVjdCBhcmUgc3RvcmVkIHNvIHRoYXQKICAgICAvLyB3ZSBjYW4gY3JlYXRlIGFuIElubGluZUl0
ZXJhdG9yIGJlZ2lubmluZyBqdXN0IGFmdGVyIHRoZSBlbmQgb2YgdGhpcyBsaW5lLgo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="0"
              isprivate="0"
          >
            <attachid>48351</attachid>
            <date>2010-02-08 12:27:48 -0800</date>
            <delta_ts>2010-02-08 13:03:35 -0800</delta_ts>
            <desc>Patch updated to ToT (no logical changes, just keeping it merged)</desc>
            <filename>patch.txt</filename>
            <type>text/plain</type>
            <size>83255</size>
            <attacher name="Dave Hyatt">hyatt</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0LmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eVJlbmRl
ck9iamVjdC5jcHAJKHJldmlzaW9uIDU0NTAxKQorKysgV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0Fj
Y2Vzc2liaWxpdHlSZW5kZXJPYmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01NjcsMTIgKzU2
Nyw4IEBAIEVsZW1lbnQqIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmFuY2gKICAgICBSZW5k
ZXJPYmplY3QqIGN1cnJSZW5kZXJlcjsKICAgICAKICAgICAvLyBTZWFyY2ggdXAgdGhlIHJlbmRl
ciB0cmVlIGZvciBhIFJlbmRlck9iamVjdCB3aXRoIGEgRE9NIG5vZGUuICBEZWZlciB0byBhbiBl
YXJsaWVyIGNvbnRpbnVhdGlvbiwgdGhvdWdoLgotICAgIGZvciAoY3VyclJlbmRlcmVyID0gbV9y
ZW5kZXJlcjsgY3VyclJlbmRlcmVyICYmICFjdXJyUmVuZGVyZXItPm5vZGUoKTsgY3VyclJlbmRl
cmVyID0gY3VyclJlbmRlcmVyLT5wYXJlbnQoKSkgewotICAgICAgICBpZiAoY3VyclJlbmRlcmVy
LT5pc1JlbmRlckJsb2NrKCkpIHsKLSAgICAgICAgICAgIFJlbmRlcklubGluZSogY29udGludWF0
aW9uID0gdG9SZW5kZXJCbG9jayhjdXJyUmVuZGVyZXIpLT5pbmxpbmVDb250aW51YXRpb24oKTsK
LSAgICAgICAgICAgIGlmIChjb250aW51YXRpb24pCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNh
Y2hlLT5nZXRPckNyZWF0ZShjb250aW51YXRpb24pLT5hbmNob3JFbGVtZW50KCk7Ci0gICAgICAg
IH0KKyAgICBmb3IgKGN1cnJSZW5kZXJlciA9IG1fcmVuZGVyZXI7IGN1cnJSZW5kZXJlciAmJiAh
Y3VyclJlbmRlcmVyLT5ub2RlKCk7IGN1cnJSZW5kZXJlciA9IGN1cnJSZW5kZXJlci0+cGFyZW50
KCkpCisgICAgewogICAgIH0KICAgICAKICAgICAvLyBiYWlsIGlmIG5vbmUgZm91bmQKSW5kZXg6
IFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUZsb3dCb3guY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvcmVuZGVyaW5nL0lubGluZUZsb3dCb3guY3BwCShyZXZpc2lvbiA1NDUwMSkKKysrIFdlYkNv
cmUvcmVuZGVyaW5nL0lubGluZUZsb3dCb3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMjcsMTQg
KzIyNywxMyBAQCB2b2lkIElubGluZUZsb3dCb3g6OmRldGVybWluZVNwYWNpbmdGb3JGCiAgICAg
ICAgIC8vICgzKSBUaGUgbGluZSBtYXkgZW5kIG9uIHRoZSBpbmxpbmUuICBJZiB3ZSBhcmUgdGhl
IGxhc3QgY2hpbGQgKGNsaW1iaW5nIHVwCiAgICAgICAgIC8vIHRoZSBlbmQgb2JqZWN0J3MgY2hh
aW4pLCB0aGVuIHdlIGp1c3QgY2xvc2VkIGFzIHdlbGwuCiAgICAgICAgIGlmICghbGluZUJveExp
c3QtPmxhc3RMaW5lQm94KCktPmlzQ29uc3RydWN0ZWQoKSkgewotICAgICAgICAgICAgUmVuZGVy
SW5saW5lKiBpbmxpbmVGbG93ID0gdG9SZW5kZXJJbmxpbmUocmVuZGVyZXIoKSk7CiAgICAgICAg
ICAgICBpZiAobHRyKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFuZXh0TGluZUJveCgpICYmCi0g
ICAgICAgICAgICAgICAgICAgICgobGFzdExpbmUgJiYgIWlubGluZUZsb3ctPmNvbnRpbnVhdGlv
bigpKSB8fCBuZXh0T25MaW5lRXhpc3RzKCkgfHwgb25FbmRDaGFpbihlbmRPYmplY3QpKSkKKyAg
ICAgICAgICAgICAgICAgICAgKGxhc3RMaW5lIHx8IG5leHRPbkxpbmVFeGlzdHMoKSB8fCBvbkVu
ZENoYWluKGVuZE9iamVjdCkpKQogICAgICAgICAgICAgICAgICAgICBpbmNsdWRlUmlnaHRFZGdl
ID0gdHJ1ZTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKCghcHJl
dkxpbmVCb3goKSB8fCBwcmV2TGluZUJveCgpLT5pc0NvbnN0cnVjdGVkKCkpICYmCi0gICAgICAg
ICAgICAgICAgICAgICgobGFzdExpbmUgJiYgIWlubGluZUZsb3ctPmNvbnRpbnVhdGlvbigpKSB8
fCBwcmV2T25MaW5lRXhpc3RzKCkgfHwgb25FbmRDaGFpbihlbmRPYmplY3QpKSkKKyAgICAgICAg
ICAgICAgICAgICAgKGxhc3RMaW5lIHx8IHByZXZPbkxpbmVFeGlzdHMoKSB8fCBvbkVuZENoYWlu
KGVuZE9iamVjdCkpKQogICAgICAgICAgICAgICAgICAgICBpbmNsdWRlTGVmdEVkZ2UgPSB0cnVl
OwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC01MDQsNyArNTAzLDcgQEAgdm9pZCBJbmxp
bmVGbG93Qm94OjpwbGFjZUJveGVzVmVydGljYWxseQogICAgICAgICAgICAgICAgIG5ld1kgLT0g
Y3Vyci0+Ym94TW9kZWxPYmplY3QoKS0+Ym9yZGVyVG9wKCkgKyBjdXJyLT5ib3hNb2RlbE9iamVj
dCgpLT5wYWRkaW5nVG9wKCk7CiAgICAgICAgIH0gZWxzZSBpZiAoIWN1cnItPnJlbmRlcmVyKCkt
PmlzQlIoKSkgewogICAgICAgICAgICAgUmVuZGVyQm94KiBib3ggPSB0b1JlbmRlckJveChjdXJy
LT5yZW5kZXJlcigpKTsKLSAgICAgICAgICAgIG5ld1kgKz0gYm94LT5tYXJnaW5Ub3AoKTsKKyAg
ICAgICAgICAgIG5ld1kgKz0gY3Vyci0+cmVuZGVyZXIoKS0+aXNBbm9ueW1vdXNJbmxpbmVCbG9j
aygpID8gMCA6IGJveC0+bWFyZ2luVG9wKCk7CiAgICAgICAgIH0KIAogICAgICAgICBjdXJyLT5z
ZXRZKG5ld1kpOwpAQCAtNjM4LDEzICs2MzcsNyBAQCB2b2lkIElubGluZUZsb3dCb3g6OnBhaW50
KFJlbmRlck9iamVjdDo6CiAgICAgICAgICAgICAvLyBvdXRsaW5lcy4KICAgICAgICAgICAgIGlm
IChyZW5kZXJlcigpLT5zdHlsZSgpLT52aXNpYmlsaXR5KCkgPT0gVklTSUJMRSAmJiByZW5kZXJl
cigpLT5oYXNPdXRsaW5lKCkgJiYgIWlzUm9vdElubGluZUJveCgpKSB7CiAgICAgICAgICAgICAg
ICAgUmVuZGVySW5saW5lKiBpbmxpbmVGbG93ID0gdG9SZW5kZXJJbmxpbmUocmVuZGVyZXIoKSk7
Ci0gICAgICAgICAgICAgICAgaWYgKChpbmxpbmVGbG93LT5jb250aW51YXRpb24oKSB8fCBpbmxp
bmVGbG93LT5pc0lubGluZUNvbnRpbnVhdGlvbigpKSAmJiAhYm94TW9kZWxPYmplY3QoKS0+aGFz
U2VsZlBhaW50aW5nTGF5ZXIoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBBZGQgb3Vyc2Vs
dmVzIHRvIHRoZSBjb250YWluaW5nIGJsb2NrIG9mIHRoZSBlbnRpcmUgY29udGludWF0aW9uIHNv
IHRoYXQgaXQgY2FuCi0gICAgICAgICAgICAgICAgICAgIC8vIHBhaW50IHVzIGF0b21pY2FsbHku
Ci0gICAgICAgICAgICAgICAgICAgIFJlbmRlckJsb2NrKiBibG9jayA9IHJlbmRlcmVyKCktPmNv
bnRhaW5pbmdCbG9jaygpLT5jb250YWluaW5nQmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAg
YmxvY2stPmFkZENvbnRpbnVhdGlvbldpdGhPdXRsaW5lKHRvUmVuZGVySW5saW5lKHJlbmRlcmVy
KCktPm5vZGUoKS0+cmVuZGVyZXIoKSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlu
bGluZUZsb3ctPmlzSW5saW5lQ29udGludWF0aW9uKCkpCi0gICAgICAgICAgICAgICAgICAgIHBh
aW50SW5mby5vdXRsaW5lT2JqZWN0cy0+YWRkKGlubGluZUZsb3cpOworICAgICAgICAgICAgICAg
IHBhaW50SW5mby5vdXRsaW5lT2JqZWN0cy0+YWRkKGlubGluZUZsb3cpOwogICAgICAgICAgICAg
fQogICAgICAgICB9IGVsc2UgaWYgKHBhaW50SW5mby5waGFzZSA9PSBQYWludFBoYXNlTWFzaykg
ewogICAgICAgICAgICAgcGFpbnRNYXNrKHBhaW50SW5mbywgdHgsIHR5KTsKSW5kZXg6IFdlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRl
cmluZy9SZW5kZXJCbG9jay5jcHAJKHJldmlzaW9uIDU0NTAxKQorKysgV2ViQ29yZS9yZW5kZXJp
bmcvUmVuZGVyQmxvY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC03Nyw4ICs3Nyw2IEBAIHN0YXRp
YyBQZXJjZW50SGVpZ2h0RGVzY2VuZGFudHNNYXAqIGdQZXIKIAogdHlwZWRlZiBXVEY6Okhhc2hN
YXA8Y29uc3QgUmVuZGVyQm94KiwgSGFzaFNldDxSZW5kZXJCbG9jayo+Kj4gUGVyY2VudEhlaWdo
dENvbnRhaW5lck1hcDsKIHN0YXRpYyBQZXJjZW50SGVpZ2h0Q29udGFpbmVyTWFwKiBnUGVyY2Vu
dEhlaWdodENvbnRhaW5lck1hcCA9IDA7Ci0gICAgCi10eXBlZGVmIFdURjo6SGFzaE1hcDxSZW5k
ZXJCbG9jayosIExpc3RIYXNoU2V0PFJlbmRlcklubGluZSo+Kj4gQ29udGludWF0aW9uT3V0bGlu
ZVRhYmxlTWFwOwogCiB0eXBlZGVmIFdURjo6SGFzaFNldDxSZW5kZXJCbG9jayo+IERlbGF5ZWRV
cGRhdGVTY3JvbGxJbmZvU2V0Owogc3RhdGljIGludCBnRGVsYXlVcGRhdGVTY3JvbGxJbmZvID0g
MDsKQEAgLTkxLDcgKzg5LDcgQEAgUmVuZGVyQmxvY2s6Ok1hcmdpbkluZm86Ok1hcmdpbkluZm8o
UmVuZAogICAgIC8vIGlmIHdlIGhhZCBhbnkgYm9yZGVyL3BhZGRpbmcgKG9idmlvdXNseSksIGlm
IHdlJ3JlIHRoZSByb290IG9yIEhUTUwgZWxlbWVudHMsIG9yIGlmCiAgICAgLy8gd2UncmUgcG9z
aXRpb25lZCwgZmxvYXRpbmcsIGEgdGFibGUgY2VsbC4KICAgICBtX2NhbkNvbGxhcHNlV2l0aENo
aWxkcmVuID0gIWJsb2NrLT5pc1JlbmRlclZpZXcoKSAmJiAhYmxvY2stPmlzUm9vdCgpICYmICFi
bG9jay0+aXNQb3NpdGlvbmVkKCkgJiYKLSAgICAgICAgIWJsb2NrLT5pc0Zsb2F0aW5nKCkgJiYg
IWJsb2NrLT5pc1RhYmxlQ2VsbCgpICYmICFibG9jay0+aGFzT3ZlcmZsb3dDbGlwKCkgJiYgIWJs
b2NrLT5pc0lubGluZUJsb2NrT3JJbmxpbmVUYWJsZSgpOworICAgICAgICAhYmxvY2stPmlzRmxv
YXRpbmcoKSAmJiAhYmxvY2stPmlzVGFibGVDZWxsKCkgJiYgIWJsb2NrLT5oYXNPdmVyZmxvd0Ns
aXAoKSAmJiAoIWJsb2NrLT5pc0lubGluZUJsb2NrT3JJbmxpbmVUYWJsZSgpIHx8IGJsb2NrLT5p
c0Fub255bW91c0lubGluZUJsb2NrKCkpOwogCiAgICAgbV9jYW5Db2xsYXBzZVRvcFdpdGhDaGls
ZHJlbiA9IG1fY2FuQ29sbGFwc2VXaXRoQ2hpbGRyZW4gJiYgKHRvcCA9PSAwKSAmJiBibG9jay0+
c3R5bGUoKS0+bWFyZ2luVG9wQ29sbGFwc2UoKSAhPSBNU0VQQVJBVEU7CiAKQEAgLTEyMCw3ICsx
MTgsNiBAQCBSZW5kZXJCbG9jazo6UmVuZGVyQmxvY2soTm9kZSogbm9kZSkKICAgICAgIDogUmVu
ZGVyQm94KG5vZGUpCiAgICAgICAsIG1fZmxvYXRpbmdPYmplY3RzKDApCiAgICAgICAsIG1fcG9z
aXRpb25lZE9iamVjdHMoMCkKLSAgICAgICwgbV9pbmxpbmVDb250aW51YXRpb24oMCkKICAgICAg
ICwgbV9tYXhNYXJnaW4oMCkKICAgICAgICwgbV9saW5lSGVpZ2h0KC0xKQogewpAQCAtMTYxLDE0
ICsxNTgsNiBAQCB2b2lkIFJlbmRlckJsb2NrOjpkZXN0cm95KCkKICAgICAvLyBNYWtlIHN1cmUg
dG8gZGVzdHJveSBhbm9ueW1vdXMgY2hpbGRyZW4gZmlyc3Qgd2hpbGUgdGhleSBhcmUgc3RpbGwg
Y29ubmVjdGVkIHRvIHRoZSByZXN0IG9mIHRoZSB0cmVlLCBzbyB0aGF0IHRoZXkgd2lsbAogICAg
IC8vIHByb3Blcmx5IGRpcnR5IGxpbmUgYm94ZXMgdGhhdCB0aGV5IGFyZSByZW1vdmVkIGZyb20u
IEVmZmVjdHMgdGhhdCBkbyA6YmVmb3JlLzphZnRlciBvbmx5IG9uIGhvdmVyIGNvdWxkIGNyYXNo
IG90aGVyd2lzZS4KICAgICBjaGlsZHJlbigpLT5kZXN0cm95TGVmdG92ZXJDaGlsZHJlbigpOwot
Ci0gICAgLy8gRGVzdHJveSBvdXIgY29udGludWF0aW9uIGJlZm9yZSBhbnl0aGluZyBvdGhlciB0
aGFuIGFub255bW91cyBjaGlsZHJlbi4KLSAgICAvLyBUaGUgcmVhc29uIHdlIGRvbid0IGRlc3Ry
b3kgaXQgYmVmb3JlIGFub255bW91cyBjaGlsZHJlbiBpcyB0aGF0IHRoZXkgbWF5Ci0gICAgLy8g
aGF2ZSBjb250aW51YXRpb25zIG9mIHRoZWlyIG93biB0aGF0IGFyZSBhbm9ueW1vdXMgY2hpbGRy
ZW4gb2Ygb3VyIGNvbnRpbnVhdGlvbi4KLSAgICBpZiAobV9pbmxpbmVDb250aW51YXRpb24pIHsK
LSAgICAgICAgbV9pbmxpbmVDb250aW51YXRpb24tPmRlc3Ryb3koKTsKLSAgICAgICAgbV9pbmxp
bmVDb250aW51YXRpb24gPSAwOwotICAgIH0KICAgICAKICAgICBpZiAoIWRvY3VtZW50QmVpbmdE
ZXN0cm95ZWQoKSkgewogICAgICAgICBpZiAoZmlyc3RMaW5lQm94KCkpIHsKQEAgLTMxNiw3ICsz
MDUsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjphZGRDaGlsZChSZW5kZXJPYmplY3QqCiAgICAgICAg
IH0KICAgICB9IGVsc2UgaWYgKCFjaGlsZHJlbklubGluZSgpICYmIChuZXdDaGlsZC0+aXNGbG9h
dGluZ09yUG9zaXRpb25lZCgpIHx8IG5ld0NoaWxkLT5pc0lubGluZSgpKSkgewogICAgICAgICAv
LyBJZiB3ZSdyZSBpbnNlcnRpbmcgYW4gaW5saW5lIGNoaWxkIGJ1dCBhbGwgb2Ygb3VyIGNoaWxk
cmVuIGFyZSBibG9ja3MsIHRoZW4gd2UgaGF2ZSB0byBtYWtlIHN1cmUKLSAgICAgICAgLy8gaXQg
aXMgcHV0IGludG8gYW4gYW5vbXlvdXMgYmxvY2sgYm94LiBXZSB0cnkgdG8gdXNlIGFuIGV4aXN0
aW5nIGFub255bW91cyBib3ggaWYgcG9zc2libGUsIG90aGVyd2lzZQorICAgICAgICAvLyBpdCBp
cyBwdXQgaW50byBhbiBhbm9ueW1vdXMgYmxvY2sgYm94LiBXZSB0cnkgdG8gdXNlIGFuIGV4aXN0
aW5nIGFub255bW91cyBib3ggaWYgcG9zc2libGUsIG90aGVyd2lzZQogICAgICAgICAvLyBhIG5l
dyBvbmUgaXMgY3JlYXRlZCBhbmQgaW5zZXJ0ZWQgaW50byBvdXIgbGlzdCBvZiBjaGlsZHJlbiBp
biB0aGUgYXBwcm9wcmlhdGUgcG9zaXRpb24uCiAgICAgICAgIFJlbmRlck9iamVjdCogYWZ0ZXJD
aGlsZCA9IGJlZm9yZUNoaWxkID8gYmVmb3JlQ2hpbGQtPnByZXZpb3VzU2libGluZygpIDogbGFz
dENoaWxkKCk7CiAKQEAgLTQ5MCw5ICs0NzksNiBAQCB2b2lkIFJlbmRlckJsb2NrOjpyZW1vdmVM
ZWZ0b3ZlckFub255bW91CiAgICAgQVNTRVJUKGNoaWxkLT5pc0Fub255bW91c0Jsb2NrKCkpOwog
ICAgIEFTU0VSVCghY2hpbGQtPmNoaWxkcmVuSW5saW5lKCkpOwogICAgIAotICAgIGlmIChjaGls
ZC0+aW5saW5lQ29udGludWF0aW9uKCkpIAotICAgICAgICByZXR1cm47Ci0gICAgCiAgICAgUmVu
ZGVyT2JqZWN0KiBmaXJzdEFuQ2hpbGQgPSBjaGlsZC0+bV9jaGlsZHJlbi5maXJzdENoaWxkKCk7
CiAgICAgUmVuZGVyT2JqZWN0KiBsYXN0QW5DaGlsZCA9IGNoaWxkLT5tX2NoaWxkcmVuLmxhc3RD
aGlsZCgpOwogICAgIGlmIChmaXJzdEFuQ2hpbGQpIHsKQEAgLTUzNSw3ICs1MjEsNyBAQCB2b2lk
IFJlbmRlckJsb2NrOjpyZW1vdmVDaGlsZChSZW5kZXJPYmplCiAgICAgUmVuZGVyT2JqZWN0KiBw
cmV2ID0gb2xkQ2hpbGQtPnByZXZpb3VzU2libGluZygpOwogICAgIFJlbmRlck9iamVjdCogbmV4
dCA9IG9sZENoaWxkLT5uZXh0U2libGluZygpOwogICAgIGJvb2wgY2FuRGVsZXRlQW5vbnltb3Vz
QmxvY2tzID0gIWRvY3VtZW50QmVpbmdEZXN0cm95ZWQoKSAmJiAhaXNJbmxpbmUoKSAmJiAhb2xk
Q2hpbGQtPmlzSW5saW5lKCkgJiYgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAoIW9sZENoaWxkLT5pc1JlbmRlckJsb2NrKCkgfHwgIXRvUmVuZGVyQmxvY2sob2xkQ2hpbGQp
LT5pbmxpbmVDb250aW51YXRpb24oKSkgJiYgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAhb2xkQ2hpbGQtPmlzUmVuZGVyQmxvY2soKSAmJiAKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICghcHJldiB8fCAocHJldi0+aXNBbm9ueW1vdXNCbG9jaygpICYm
IHByZXYtPmNoaWxkcmVuSW5saW5lKCkpKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgKCFuZXh0IHx8IChuZXh0LT5pc0Fub255bW91c0Jsb2NrKCkgJiYgbmV4dC0+Y2hp
bGRyZW5JbmxpbmUoKSkpOwogICAgIGlmIChjYW5EZWxldGVBbm9ueW1vdXNCbG9ja3MgJiYgcHJl
diAmJiBuZXh0KSB7CkBAIC01OTgsOSArNTg0LDE1IEBAIGJvb2wgUmVuZGVyQmxvY2s6OmlzU2Vs
ZkNvbGxhcHNpbmdCbG9jaygKICAgICAvLyBvbiB3aGV0aGVyIHdlIGhhdmUgY29udGVudCB0aGF0
IGlzIGFsbCBzZWxmLWNvbGxhcHNpbmcgb3Igbm90LgogICAgIGlmIChoYXNBdXRvSGVpZ2h0IHx8
ICgoc3R5bGUoKS0+aGVpZ2h0KCkuaXNGaXhlZCgpIHx8IHN0eWxlKCktPmhlaWdodCgpLmlzUGVy
Y2VudCgpKSAmJiBzdHlsZSgpLT5oZWlnaHQoKS5pc1plcm8oKSkpIHsKICAgICAgICAgLy8gSWYg
dGhlIGJsb2NrIGhhcyBpbmxpbmUgY2hpbGRyZW4sIHNlZSBpZiB3ZSBnZW5lcmF0ZWQgYW55IGxp
bmUgYm94ZXMuICBJZiB3ZSBoYXZlIGFueQotICAgICAgICAvLyBsaW5lIGJveGVzLCB0aGVuIHdl
IGNhbid0IGJlIHNlbGYtY29sbGFwc2luZywgc2luY2Ugd2UgaGF2ZSBjb250ZW50LgotICAgICAg
ICBpZiAoY2hpbGRyZW5JbmxpbmUoKSkKLSAgICAgICAgICAgIHJldHVybiAhZmlyc3RMaW5lQm94
KCk7CisgICAgICAgIC8vIGxpbmUgYm94ZXMsIHRoZW4gd2UgY2FuIG9ubHkgYmUgc2VsZi1jb2xs
YXBzaW5nIGlmIHdlIGhhdmUgbm90aGluZyBidXQgYW5vbnltb3VzIGlubGluZSBibG9ja3MKKyAg
ICAgICAgLy8gdGhhdCBhcmUgYWxzbyBzZWxmLWNvbGxhcHNpbmcgaW5zaWRlIHVzLgorICAgICAg
ICBpZiAoY2hpbGRyZW5JbmxpbmUoKSkgeworICAgICAgICAgICAgZm9yIChSb290SW5saW5lQm94
KiBjaGlsZCA9IGZpcnN0Um9vdEJveCgpOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dFJvb3RC
b3goKSkgeworICAgICAgICAgICAgICAgIGlmICghY2hpbGQtPmFub255bW91c0lubGluZUJsb2Nr
KCkgfHwgIWNoaWxkLT5hbm9ueW1vdXNJbmxpbmVCbG9jaygpLT5pc1NlbGZDb2xsYXBzaW5nQmxv
Y2soKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQor
ICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIFdlIGhhdmUgbm8gbGluZSBib3hlcywgc28gd2Ug
bXVzdCBiZSBzZWxmLWNvbGxhcHNpbmcuCisgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIC8v
IFdoZXRoZXIgb3Igbm90IHdlIGNvbGxhcHNlIGlzIGRlcGVuZGVudCBvbiB3aGV0aGVyIGFsbCBv
dXIgbm9ybWFsIGZsb3cgY2hpbGRyZW4KICAgICAgICAgLy8gYXJlIGFsc28gc2VsZi1jb2xsYXBz
aW5nLgpAQCAtODU1LDcgKzg0Nyw4IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmFkZE92ZXJmbG93RnJv
bUZsb2F0cygKIAogYm9vbCBSZW5kZXJCbG9jazo6ZXhwYW5kc1RvRW5jbG9zZU92ZXJoYW5naW5n
RmxvYXRzKCkgY29uc3QKIHsKLSAgICByZXR1cm4gaXNJbmxpbmVCbG9ja09ySW5saW5lVGFibGUo
KSB8fCBpc0Zsb2F0aW5nT3JQb3NpdGlvbmVkKCkgfHwgaGFzT3ZlcmZsb3dDbGlwKCkgfHwgKHBh
cmVudCgpICYmIHBhcmVudCgpLT5pc0ZsZXhpYmxlQm94KCkpIHx8IGhhc0NvbHVtbnMoKSB8fCBp
c1RhYmxlQ2VsbCgpIHx8IGlzRmllbGRzZXQoKTsKKyAgICByZXR1cm4gaXNGbG9hdGluZ09yUG9z
aXRpb25lZCgpIHx8IGhhc092ZXJmbG93Q2xpcCgpIHx8IChwYXJlbnQoKSAmJiBwYXJlbnQoKS0+
aXNGbGV4aWJsZUJveCgpKSB8fCBoYXNDb2x1bW5zKCkgfHwgaXNUYWJsZUNlbGwoKSB8fCBpc0Zp
ZWxkc2V0KCkgfHwKKyAgICAgICAgICAgKGlzSW5saW5lQmxvY2tPcklubGluZVRhYmxlKCkgJiYg
IWlzQW5vbnltb3VzSW5saW5lQmxvY2soKSk7CiB9CiAKIHZvaWQgUmVuZGVyQmxvY2s6OmFkanVz
dFBvc2l0aW9uZWRCbG9jayhSZW5kZXJCb3gqIGNoaWxkLCBjb25zdCBNYXJnaW5JbmZvJiBtYXJn
aW5JbmZvKQpAQCAtMTAwMSwxOSArOTk0LDE5IEBAIGJvb2wgUmVuZGVyQmxvY2s6OmhhbmRsZVJ1
bkluQ2hpbGQoUmVuZGUKIGludCBSZW5kZXJCbG9jazo6Y29sbGFwc2VNYXJnaW5zKFJlbmRlckJv
eCogY2hpbGQsIE1hcmdpbkluZm8mIG1hcmdpbkluZm8pCiB7CiAgICAgLy8gR2V0IG91ciBtYXgg
cG9zIGFuZCBuZWcgdG9wIG1hcmdpbnMuCi0gICAgaW50IHBvc1RvcCA9IGNoaWxkLT5tYXhUb3BN
YXJnaW4odHJ1ZSk7Ci0gICAgaW50IG5lZ1RvcCA9IGNoaWxkLT5tYXhUb3BNYXJnaW4oZmFsc2Up
OworICAgIGludCBwb3NUb3AgPSBjaGlsZCA/IGNoaWxkLT5tYXhUb3BNYXJnaW4odHJ1ZSkgOiAw
OworICAgIGludCBuZWdUb3AgPSBjaGlsZCA/IGNoaWxkLT5tYXhUb3BNYXJnaW4oZmFsc2UpIDog
MDsKIAogICAgIC8vIEZvciBzZWxmLWNvbGxhcHNpbmcgYmxvY2tzLCBjb2xsYXBzZSBvdXIgYm90
dG9tIG1hcmdpbnMgaW50byBvdXIKICAgICAvLyB0b3AgdG8gZ2V0IG5ldyBwb3NUb3AgYW5kIG5l
Z1RvcCB2YWx1ZXMuCi0gICAgaWYgKGNoaWxkLT5pc1NlbGZDb2xsYXBzaW5nQmxvY2soKSkgewor
ICAgIGlmIChjaGlsZCAmJiBjaGlsZC0+aXNTZWxmQ29sbGFwc2luZ0Jsb2NrKCkpIHsKICAgICAg
ICAgcG9zVG9wID0gbWF4KHBvc1RvcCwgY2hpbGQtPm1heEJvdHRvbU1hcmdpbih0cnVlKSk7CiAg
ICAgICAgIG5lZ1RvcCA9IG1heChuZWdUb3AsIGNoaWxkLT5tYXhCb3R0b21NYXJnaW4oZmFsc2Up
KTsKICAgICB9CiAgICAgCiAgICAgLy8gU2VlIGlmIHRoZSB0b3AgbWFyZ2luIGlzIHF1aXJreS4g
V2Ugb25seSBjYXJlIGlmIHRoaXMgY2hpbGQgaGFzCiAgICAgLy8gbWFyZ2lucyB0aGF0IHdpbGwg
Y29sbGFwc2Ugd2l0aCB1cy4KLSAgICBib29sIHRvcFF1aXJrID0gY2hpbGQtPmlzVG9wTWFyZ2lu
UXVpcmsoKSB8fCBzdHlsZSgpLT5tYXJnaW5Ub3BDb2xsYXBzZSgpID09IE1ESVNDQVJEOworICAg
IGJvb2wgdG9wUXVpcmsgPSAoY2hpbGQgJiYgY2hpbGQtPmlzVG9wTWFyZ2luUXVpcmsoKSkgfHwg
c3R5bGUoKS0+bWFyZ2luVG9wQ29sbGFwc2UoKSA9PSBNRElTQ0FSRDsKIAogICAgIGlmIChtYXJn
aW5JbmZvLmNhbkNvbGxhcHNlV2l0aFRvcCgpKSB7CiAgICAgICAgIC8vIFRoaXMgY2hpbGQgaXMg
Y29sbGFwc2luZyB3aXRoIHRoZSB0b3Agb2YgdGhlCkBAIC0xMDI2LDcgKzEwMTksNyBAQCBpbnQg
UmVuZGVyQmxvY2s6OmNvbGxhcHNlTWFyZ2lucyhSZW5kZXJCCiAgICAgICAgIC8vIGNvbGxhcHNl
IGl0IGF3YXksIGV2ZW4gaWYgdGhlIG1hcmdpbiBpcyBzbWFsbGVyICh3d3cud2VicmVmZXJlbmNl
LmNvbQogICAgICAgICAvLyBoYXMgYW4gZXhhbXBsZSBvZiB0aGlzLCBhIDxkdD4gd2l0aCAwLjhl
bSBhdXRob3Itc3BlY2lmaWVkIGluc2lkZQogICAgICAgICAvLyBhIDxkbD4gaW5zaWRlIGEgPHRk
Pi4KLSAgICAgICAgaWYgKCFtYXJnaW5JbmZvLmRldGVybWluZWRUb3BRdWlyaygpICYmICF0b3BR
dWlyayAmJiAocG9zVG9wLW5lZ1RvcCkpIHsKKyAgICAgICAgaWYgKCFtYXJnaW5JbmZvLmRldGVy
bWluZWRUb3BRdWlyaygpICYmICF0b3BRdWlyayAmJiAocG9zVG9wIC0gbmVnVG9wKSkgewogICAg
ICAgICAgICAgc2V0VG9wTWFyZ2luUXVpcmsoZmFsc2UpOwogICAgICAgICAgICAgbWFyZ2luSW5m
by5zZXREZXRlcm1pbmVkVG9wUXVpcmsodHJ1ZSk7CiAgICAgICAgIH0KQEAgLTEwNDQsNyArMTAz
Nyw3IEBAIGludCBSZW5kZXJCbG9jazo6Y29sbGFwc2VNYXJnaW5zKFJlbmRlckIKICAgICAgICAg
bWFyZ2luSW5mby5zZXRUb3BRdWlyayh0b3BRdWlyayk7CiAKICAgICBpbnQgeXBvcyA9IGhlaWdo
dCgpOwotICAgIGlmIChjaGlsZC0+aXNTZWxmQ29sbGFwc2luZ0Jsb2NrKCkpIHsKKyAgICBpZiAo
Y2hpbGQgJiYgY2hpbGQtPmlzU2VsZkNvbGxhcHNpbmdCbG9jaygpKSB7CiAgICAgICAgIC8vIFRo
aXMgY2hpbGQgaGFzIG5vIGhlaWdodC4gIFdlIG5lZWQgdG8gY29tcHV0ZSBvdXIKICAgICAgICAg
Ly8gcG9zaXRpb24gYmVmb3JlIHdlIGNvbGxhcHNlIHRoZSBjaGlsZCdzIG1hcmdpbnMgdG9nZXRo
ZXIsCiAgICAgICAgIC8vIHNvIHRoYXQgd2UgY2FuIGdldCBhbiBhY2N1cmF0ZSBwb3NpdGlvbiBm
b3IgdGhlIHplcm8taGVpZ2h0IGJsb2NrLgpAQCAtMTA2MywxMyArMTA1NiwxMSBAQCBpbnQgUmVu
ZGVyQmxvY2s6OmNvbGxhcHNlTWFyZ2lucyhSZW5kZXJCCiAgICAgICAgICAgICAvLyB0aGF0IG5l
ZWRzIHRvIGJlIHBvc2l0aW9uZWQgY29ycmVjdGx5IChlLmcuLCBhIGJsb2NrIHRoYXQKICAgICAg
ICAgICAgIC8vIGhhZCBhIHNwZWNpZmllZCBoZWlnaHQgb2YgMCBidXQgdGhhdCBhY3R1YWxseSBo
YWQgc3ViY29udGVudCkuCiAgICAgICAgICAgICB5cG9zID0gaGVpZ2h0KCkgKyBjb2xsYXBzZWRU
b3BQb3MgLSBjb2xsYXBzZWRUb3BOZWc7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBpZiAo
Y2hpbGQtPnN0eWxlKCktPm1hcmdpblRvcENvbGxhcHNlKCkgPT0gTVNFUEFSQVRFKSB7CisgICAg
fSBlbHNlIHsKKyAgICAgICAgaWYgKGNoaWxkICYmIGNoaWxkLT5zdHlsZSgpLT5tYXJnaW5Ub3BD
b2xsYXBzZSgpID09IE1TRVBBUkFURSkgewogICAgICAgICAgICAgc2V0SGVpZ2h0KGhlaWdodCgp
ICsgbWFyZ2luSW5mby5tYXJnaW4oKSArIGNoaWxkLT5tYXJnaW5Ub3AoKSk7CiAgICAgICAgICAg
ICB5cG9zID0gaGVpZ2h0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIW1hcmdpbklu
Zm8uYXRUb3BPZkJsb2NrKCkgfHwKKyAgICAgICAgfSBlbHNlIGlmICghbWFyZ2luSW5mby5hdFRv
cE9mQmxvY2soKSB8fAogICAgICAgICAgICAgKCFtYXJnaW5JbmZvLmNhbkNvbGxhcHNlVG9wV2l0
aENoaWxkcmVuKCkKICAgICAgICAgICAgICAmJiAoIXN0eWxlKCktPmh0bWxIYWNrcygpIHx8ICFt
YXJnaW5JbmZvLnF1aXJrQ29udGFpbmVyKCkgfHwgIW1hcmdpbkluZm8udG9wUXVpcmsoKSkpKSB7
CiAgICAgICAgICAgICAvLyBXZSdyZSBjb2xsYXBzaW5nIHdpdGggYSBwcmV2aW91cyBzaWJsaW5n
J3MgbWFyZ2lucyBhbmQgbm90CkBAIC0xMDc4LDExICsxMDY5LDExIEBAIGludCBSZW5kZXJCbG9j
azo6Y29sbGFwc2VNYXJnaW5zKFJlbmRlckIKICAgICAgICAgICAgIHlwb3MgPSBoZWlnaHQoKTsK
ICAgICAgICAgfQogCi0gICAgICAgIG1hcmdpbkluZm8uc2V0UG9zTWFyZ2luKGNoaWxkLT5tYXhC
b3R0b21NYXJnaW4odHJ1ZSkpOwotICAgICAgICBtYXJnaW5JbmZvLnNldE5lZ01hcmdpbihjaGls
ZC0+bWF4Qm90dG9tTWFyZ2luKGZhbHNlKSk7CisgICAgICAgIG1hcmdpbkluZm8uc2V0UG9zTWFy
Z2luKGNoaWxkID8gY2hpbGQtPm1heEJvdHRvbU1hcmdpbih0cnVlKSA6IDApOworICAgICAgICBt
YXJnaW5JbmZvLnNldE5lZ01hcmdpbihjaGlsZCA/IGNoaWxkLT5tYXhCb3R0b21NYXJnaW4oZmFs
c2UpIDogMCk7CiAKICAgICAgICAgaWYgKG1hcmdpbkluZm8ubWFyZ2luKCkpCi0gICAgICAgICAg
ICBtYXJnaW5JbmZvLnNldEJvdHRvbVF1aXJrKGNoaWxkLT5pc0JvdHRvbU1hcmdpblF1aXJrKCkg
fHwgc3R5bGUoKS0+bWFyZ2luQm90dG9tQ29sbGFwc2UoKSA9PSBNRElTQ0FSRCk7CisgICAgICAg
ICAgICBtYXJnaW5JbmZvLnNldEJvdHRvbVF1aXJrKChjaGlsZCAmJiBjaGlsZC0+aXNCb3R0b21N
YXJnaW5RdWlyaygpKSB8fCBzdHlsZSgpLT5tYXJnaW5Cb3R0b21Db2xsYXBzZSgpID09IE1ESVND
QVJEKTsKICAgICB9CiAgICAgCiAgICAgcmV0dXJuIHlwb3M7CkBAIC0xNzQ5LDIwICsxNzQwLDcg
QEAgdm9pZCBSZW5kZXJCbG9jazo6cGFpbnRPYmplY3QoUGFpbnRJbmZvJgogICAgIGlmICgocGFp
bnRQaGFzZSA9PSBQYWludFBoYXNlT3V0bGluZSB8fCBwYWludFBoYXNlID09IFBhaW50UGhhc2VT
ZWxmT3V0bGluZSkgJiYgaGFzT3V0bGluZSgpICYmIHN0eWxlKCktPnZpc2liaWxpdHkoKSA9PSBW
SVNJQkxFKQogICAgICAgICBwYWludE91dGxpbmUocGFpbnRJbmZvLmNvbnRleHQsIHR4LCB0eSwg
d2lkdGgoKSwgaGVpZ2h0KCksIHN0eWxlKCkpOwogCi0gICAgLy8gNi4gcGFpbnQgY29udGludWF0
aW9uIG91dGxpbmVzLgotICAgIGlmICgocGFpbnRQaGFzZSA9PSBQYWludFBoYXNlT3V0bGluZSB8
fCBwYWludFBoYXNlID09IFBhaW50UGhhc2VDaGlsZE91dGxpbmVzKSkgewotICAgICAgICBpZiAo
aW5saW5lQ29udGludWF0aW9uKCkgJiYgaW5saW5lQ29udGludWF0aW9uKCktPmhhc091dGxpbmUo
KSAmJiBpbmxpbmVDb250aW51YXRpb24oKS0+c3R5bGUoKS0+dmlzaWJpbGl0eSgpID09IFZJU0lC
TEUpIHsKLSAgICAgICAgICAgIFJlbmRlcklubGluZSogaW5saW5lUmVuZGVyZXIgPSB0b1JlbmRl
cklubGluZShpbmxpbmVDb250aW51YXRpb24oKS0+bm9kZSgpLT5yZW5kZXJlcigpKTsKLSAgICAg
ICAgICAgIGlmICghaW5saW5lUmVuZGVyZXItPmhhc1NlbGZQYWludGluZ0xheWVyKCkpCi0gICAg
ICAgICAgICAgICAgY29udGFpbmluZ0Jsb2NrKCktPmFkZENvbnRpbnVhdGlvbldpdGhPdXRsaW5l
KGlubGluZVJlbmRlcmVyKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKCFpbmxpbmVSZW5kZXJlci0+
Zmlyc3RMaW5lQm94KCkpCi0gICAgICAgICAgICAgICAgaW5saW5lUmVuZGVyZXItPnBhaW50T3V0
bGluZShwYWludEluZm8uY29udGV4dCwgdHggLSB4KCkgKyBpbmxpbmVSZW5kZXJlci0+Y29udGFp
bmluZ0Jsb2NrKCktPngoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHR5IC0geSgpICsgaW5saW5lUmVuZGVyZXItPmNvbnRhaW5pbmdCbG9jaygpLT55KCkp
OwotICAgICAgICB9Ci0gICAgICAgIHBhaW50Q29udGludWF0aW9uT3V0bGluZXMocGFpbnRJbmZv
LCB0eCwgdHkpOwotICAgIH0KLQotICAgIC8vIDcuIHBhaW50IGNhcmV0LgorICAgIC8vIDYuIHBh
aW50IGNhcmV0LgogICAgIC8vIElmIHRoZSBjYXJldCdzIG5vZGUncyByZW5kZXIgb2JqZWN0J3Mg
Y29udGFpbmluZyBibG9jayBpcyB0aGlzIGJsb2NrLCBhbmQgdGhlIHBhaW50IGFjdGlvbiBpcyBQ
YWludFBoYXNlRm9yZWdyb3VuZCwKICAgICAvLyB0aGVuIHBhaW50IHRoZSBjYXJldC4KICAgICBp
ZiAocGFpbnRQaGFzZSA9PSBQYWludFBoYXNlRm9yZWdyb3VuZCkgeyAgICAgICAgCkBAIC0xODI1
LDU3ICsxODAzLDYgQEAgdm9pZCBSZW5kZXJCbG9jazo6cGFpbnRFbGxpcHNpc0JveGVzKFBhaQog
ICAgIH0KIH0KIAotc3RhdGljIENvbnRpbnVhdGlvbk91dGxpbmVUYWJsZU1hcCogY29udGludWF0
aW9uT3V0bGluZVRhYmxlKCkKLXsKLSAgICBERUZJTkVfU1RBVElDX0xPQ0FMKENvbnRpbnVhdGlv
bk91dGxpbmVUYWJsZU1hcCwgdGFibGUsICgpKTsKLSAgICByZXR1cm4gJnRhYmxlOwotfQotCi12
b2lkIFJlbmRlckJsb2NrOjphZGRDb250aW51YXRpb25XaXRoT3V0bGluZShSZW5kZXJJbmxpbmUq
IGZsb3cpCi17Ci0gICAgLy8gV2UgY2FuJ3QgbWFrZSB0aGlzIHdvcmsgaWYgdGhlIGlubGluZSBp
cyBpbiBhIGxheWVyLiAgV2UnbGwganVzdCByZWx5IG9uIHRoZSBicm9rZW4KLSAgICAvLyB3YXkg
b2YgcGFpbnRpbmcuCi0gICAgQVNTRVJUKCFmbG93LT5sYXllcigpICYmICFmbG93LT5pc0lubGlu
ZUNvbnRpbnVhdGlvbigpKTsKLSAgICAKLSAgICBDb250aW51YXRpb25PdXRsaW5lVGFibGVNYXAq
IHRhYmxlID0gY29udGludWF0aW9uT3V0bGluZVRhYmxlKCk7Ci0gICAgTGlzdEhhc2hTZXQ8UmVu
ZGVySW5saW5lKj4qIGNvbnRpbnVhdGlvbnMgPSB0YWJsZS0+Z2V0KHRoaXMpOwotICAgIGlmICgh
Y29udGludWF0aW9ucykgewotICAgICAgICBjb250aW51YXRpb25zID0gbmV3IExpc3RIYXNoU2V0
PFJlbmRlcklubGluZSo+OwotICAgICAgICB0YWJsZS0+c2V0KHRoaXMsIGNvbnRpbnVhdGlvbnMp
OwotICAgIH0KLSAgICAKLSAgICBjb250aW51YXRpb25zLT5hZGQoZmxvdyk7Ci19Ci0KLXZvaWQg
UmVuZGVyQmxvY2s6OnBhaW50Q29udGludWF0aW9uT3V0bGluZXMoUGFpbnRJbmZvJiBpbmZvLCBp
bnQgdHgsIGludCB0eSkKLXsKLSAgICBDb250aW51YXRpb25PdXRsaW5lVGFibGVNYXAqIHRhYmxl
ID0gY29udGludWF0aW9uT3V0bGluZVRhYmxlKCk7Ci0gICAgaWYgKHRhYmxlLT5pc0VtcHR5KCkp
Ci0gICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgTGlzdEhhc2hTZXQ8UmVuZGVySW5saW5l
Kj4qIGNvbnRpbnVhdGlvbnMgPSB0YWJsZS0+Z2V0KHRoaXMpOwotICAgIGlmICghY29udGludWF0
aW9ucykKLSAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAgICAvLyBQYWludCBlYWNoIGNvbnRp
bnVhdGlvbiBvdXRsaW5lLgotICAgIExpc3RIYXNoU2V0PFJlbmRlcklubGluZSo+OjppdGVyYXRv
ciBlbmQgPSBjb250aW51YXRpb25zLT5lbmQoKTsKLSAgICBmb3IgKExpc3RIYXNoU2V0PFJlbmRl
cklubGluZSo+OjppdGVyYXRvciBpdCA9IGNvbnRpbnVhdGlvbnMtPmJlZ2luKCk7IGl0ICE9IGVu
ZDsgKytpdCkgewotICAgICAgICAvLyBOZWVkIHRvIGFkZCBpbiB0aGUgY29vcmRpbmF0ZXMgb2Yg
dGhlIGludGVydmVuaW5nIGJsb2Nrcy4KLSAgICAgICAgUmVuZGVySW5saW5lKiBmbG93ID0gKml0
OwotICAgICAgICBSZW5kZXJCbG9jayogYmxvY2sgPSBmbG93LT5jb250YWluaW5nQmxvY2soKTsK
LSAgICAgICAgZm9yICggOyBibG9jayAmJiBibG9jayAhPSB0aGlzOyBibG9jayA9IGJsb2NrLT5j
b250YWluaW5nQmxvY2soKSkgewotICAgICAgICAgICAgdHggKz0gYmxvY2stPngoKTsKLSAgICAg
ICAgICAgIHR5ICs9IGJsb2NrLT55KCk7Ci0gICAgICAgIH0KLSAgICAgICAgQVNTRVJUKGJsb2Nr
KTsgICAKLSAgICAgICAgZmxvdy0+cGFpbnRPdXRsaW5lKGluZm8uY29udGV4dCwgdHgsIHR5KTsK
LSAgICB9Ci0gICAgCi0gICAgLy8gRGVsZXRlCi0gICAgZGVsZXRlIGNvbnRpbnVhdGlvbnM7Ci0g
ICAgdGFibGUtPnJlbW92ZSh0aGlzKTsKLX0KLQogdm9pZCBSZW5kZXJCbG9jazo6c2V0U2VsZWN0
aW9uU3RhdGUoU2VsZWN0aW9uU3RhdGUgcykKIHsKICAgICBpZiAoc2VsZWN0aW9uU3RhdGUoKSA9
PSBzKQpAQCAtMjk4NSwyNSArMjkxMiwzMSBAQCB2b2lkIFJlbmRlckJsb2NrOjpjbGVhckZsb2F0
cygpCiAgICAgLy8gb3V0IG9mIGZsb3cgKGxpa2UgZmxvYXRpbmcvcG9zaXRpb25lZCBlbGVtZW50
cyksIGFuZCB3ZSBhbHNvIHNraXAgb3ZlciBhbnkgb2JqZWN0cyB0aGF0IG1heSBoYXZlIHNoaWZ0
ZWQKICAgICAvLyB0byBhdm9pZCBmbG9hdHMuCiAgICAgYm9vbCBwYXJlbnRIYXNGbG9hdHMgPSBm
YWxzZTsKLSAgICBSZW5kZXJPYmplY3QqIHByZXYgPSBwcmV2aW91c1NpYmxpbmcoKTsKLSAgICB3
aGlsZSAocHJldiAmJiAocHJldi0+aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpIHx8ICFwcmV2LT5p
c0JveCgpIHx8ICFwcmV2LT5pc1JlbmRlckJsb2NrKCkgfHwgdG9SZW5kZXJCbG9jayhwcmV2KS0+
YXZvaWRzRmxvYXRzKCkpKSB7Ci0gICAgICAgIGlmIChwcmV2LT5pc0Zsb2F0aW5nKCkpCi0gICAg
ICAgICAgICBwYXJlbnRIYXNGbG9hdHMgPSB0cnVlOwotICAgICAgICAgcHJldiA9IHByZXYtPnBy
ZXZpb3VzU2libGluZygpOworICAgIFJlbmRlck9iamVjdCogcHJldiA9IDA7CisgICAgUmVuZGVy
QmxvY2sqIHBhcmVudEJsb2NrID0gMDsKKyAgICBpZiAoaXNBbm9ueW1vdXNJbmxpbmVCbG9jaygp
KSB7CisgICAgICAgIHBhcmVudEJsb2NrID0gY29udGFpbmluZ0Jsb2NrKCk7CisgICAgICAgIHBh
cmVudEhhc0Zsb2F0cyA9IHBhcmVudEJsb2NrLT5jb250YWluc0Zsb2F0cygpOworICAgIH0gZWxz
ZSB7ICAgIAorICAgICAgICB3aGlsZSAocHJldiAmJiAocHJldi0+aXNGbG9hdGluZ09yUG9zaXRp
b25lZCgpIHx8ICFwcmV2LT5pc0JveCgpIHx8ICFwcmV2LT5pc1JlbmRlckJsb2NrKCkgfHwgdG9S
ZW5kZXJCbG9jayhwcmV2KS0+YXZvaWRzRmxvYXRzKCkpKSB7CisgICAgICAgICAgICBpZiAocHJl
di0+aXNGbG9hdGluZygpKQorICAgICAgICAgICAgICAgIHBhcmVudEhhc0Zsb2F0cyA9IHRydWU7
CisgICAgICAgICAgICBwcmV2ID0gcHJldi0+cHJldmlvdXNTaWJsaW5nKCk7CisgICAgICAgIH0K
KyAgICAgICAgCisgICAgICAgIHBhcmVudEJsb2NrID0gcGFyZW50KCktPmlzUmVuZGVyQmxvY2so
KSA/IHRvUmVuZGVyQmxvY2socGFyZW50KCkpIDogMDsKICAgICB9CiAKICAgICAvLyBGaXJzdCBh
ZGQgaW4gZmxvYXRzIGZyb20gdGhlIHBhcmVudC4KICAgICBpbnQgb2Zmc2V0ID0geSgpOwotICAg
IGlmIChwYXJlbnRIYXNGbG9hdHMpIHsKLSAgICAgICAgUmVuZGVyQmxvY2sqIHBhcmVudEJsb2Nr
ID0gdG9SZW5kZXJCbG9jayhwYXJlbnQoKSk7CisgICAgaWYgKHBhcmVudEhhc0Zsb2F0cykKICAg
ICAgICAgYWRkSW50cnVkaW5nRmxvYXRzKHBhcmVudEJsb2NrLCBwYXJlbnRCbG9jay0+Ym9yZGVy
TGVmdCgpICsgcGFyZW50QmxvY2stPnBhZGRpbmdMZWZ0KCksIG9mZnNldCk7Ci0gICAgfQotICAg
IAorCiAgICAgaW50IHhvZmZzZXQgPSAwOwogICAgIGlmIChwcmV2KQogICAgICAgICBvZmZzZXQg
LT0gdG9SZW5kZXJCb3gocHJldiktPnkoKTsKLSAgICBlbHNlIGlmIChwYXJlbnQoKS0+aXNCb3go
KSkgewotICAgICAgICBwcmV2ID0gcGFyZW50KCk7CisgICAgZWxzZSBpZiAocGFyZW50QmxvY2sp
IHsKKyAgICAgICAgcHJldiA9IHBhcmVudEJsb2NrOwogICAgICAgICB4b2Zmc2V0ICs9IHRvUmVu
ZGVyQm94KHByZXYpLT5ib3JkZXJMZWZ0KCkgKyB0b1JlbmRlckJveChwcmV2KS0+cGFkZGluZ0xl
ZnQoKTsKICAgICB9CiAKQEAgLTMxMzgsNyArMzA3MSw3IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmFk
ZEludHJ1ZGluZ0Zsb2F0cyhSZW4KICAgICAgICAgICAgICAgICAvLyBhYm92ZS4gIHx4b2ZmfCB3
aWxsIGVxdWFsIC1mbG93LT5tYXJnaW5MZWZ0KCkgaW4gdGhpcyBjYXNlLCBzbyBpdCdzIGFscmVh
ZHkgYmVlbiB0YWtlbgogICAgICAgICAgICAgICAgIC8vIGludG8gYWNjb3VudC4gIE9ubHkgYXBw
bHkgdGhpcyBjb2RlIGlmIHxjaGlsZHwgaXMgZmFsc2UsIHNpbmNlIG90aGVyd2lzZSB0aGUgbGVm
dCBtYXJnaW4KICAgICAgICAgICAgICAgICAvLyB3aWxsIGdldCBhcHBsaWVkIHR3aWNlLgotICAg
ICAgICAgICAgICAgIGlmIChwcmV2ICE9IHBhcmVudCgpKQorICAgICAgICAgICAgICAgIGlmIChw
cmV2ICE9IGNvbnRhaW5pbmdCbG9jaygpKQogICAgICAgICAgICAgICAgICAgICBmbG9hdGluZ09i
ai0+bV9sZWZ0ICs9IHByZXYtPm1hcmdpbkxlZnQoKTsKICAgICAgICAgICAgICAgICBmbG9hdGlu
Z09iai0+bV9sZWZ0IC09IG1hcmdpbkxlZnQoKTsKICAgICAgICAgICAgICAgICBmbG9hdGluZ09i
ai0+bV9zaG91bGRQYWludCA9IGZhbHNlOyAgLy8gV2UgYXJlIG5vdCBpbiB0aGUgZGlyZWN0IGlu
aGVyaXRhbmNlIGNoYWluIGZvciB0aGlzIGZsb2F0LiBXZSB3aWxsIG5ldmVyIHBhaW50IGl0LgpA
QCAtMzE4Myw3ICszMTE2LDEzIEBAIHZvaWQgUmVuZGVyQmxvY2s6Om1hcmtBbGxEZXNjZW5kYW50
c1dpdGgKICAgICAgICAgcmVtb3ZlRmxvYXRpbmdPYmplY3QoZmxvYXRUb1JlbW92ZSk7CiAKICAg
ICAvLyBJdGVyYXRlIG92ZXIgb3VyIGNoaWxkcmVuIGFuZCBtYXJrIHRoZW0gYXMgbmVlZGVkLgot
ICAgIGlmICghY2hpbGRyZW5JbmxpbmUoKSkgeworICAgIGlmIChjaGlsZHJlbklubGluZSgpKSB7
CisgICAgICAgIGZvciAoUm9vdElubGluZUJveCogYm94ID0gZmlyc3RSb290Qm94KCk7IGJveDsg
Ym94ID0gYm94LT5uZXh0Um9vdEJveCgpKSB7CisgICAgICAgICAgICBSZW5kZXJCbG9jayogY2hp
bGRCbG9jayA9IGJveC0+YW5vbnltb3VzSW5saW5lQmxvY2soKTsKKyAgICAgICAgICAgIGlmIChj
aGlsZEJsb2NrICYmIChmbG9hdFRvUmVtb3ZlID8gY2hpbGRCbG9jay0+Y29udGFpbnNGbG9hdChm
bG9hdFRvUmVtb3ZlKSA6IGNoaWxkQmxvY2stPmNvbnRhaW5zRmxvYXRzKCkpKQorICAgICAgICAg
ICAgICAgIGNoaWxkQmxvY2stPm1hcmtBbGxEZXNjZW5kYW50c1dpdGhGbG9hdHNGb3JMYXlvdXQo
ZmxvYXRUb1JlbW92ZSwgaW5MYXlvdXQpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKICAgICAg
ICAgZm9yIChSZW5kZXJPYmplY3QqIGNoaWxkID0gZmlyc3RDaGlsZCgpOyBjaGlsZDsgY2hpbGQg
PSBjaGlsZC0+bmV4dFNpYmxpbmcoKSkgewogICAgICAgICAgICAgaWYgKCghZmxvYXRUb1JlbW92
ZSAmJiBjaGlsZC0+aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpKSB8fCAhY2hpbGQtPmlzUmVuZGVy
QmxvY2soKSkKICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTQxNDIsMTQgKzQwODEsMTUg
QEAgdm9pZCBSZW5kZXJCbG9jazo6Y2FsY0lubGluZVByZWZXaWR0aHMoKQogICAgICAgICAgICAg
ICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICBjbGVhclByZXZpb3VzRmxvYXQgPSBmYWxz
ZTsKIAotICAgICAgICAgICAgICAgIGJvb2wgY2FuQnJlYWtSZXBsYWNlZEVsZW1lbnQgPSAhY2hp
bGQtPmlzSW1hZ2UoKSB8fCBhbGxvd0ltYWdlc1RvQnJlYWs7CisgICAgICAgICAgICAgICAgYm9v
bCBjYW5CcmVha1JlcGxhY2VkRWxlbWVudCA9ICFjaGlsZC0+aXNJbWFnZSgpIHx8IGFsbG93SW1h
Z2VzVG9CcmVhayB8fCBjaGlsZC0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpOwogICAgICAgICAg
ICAgICAgIGlmICgoY2FuQnJlYWtSZXBsYWNlZEVsZW1lbnQgJiYgKGF1dG9XcmFwIHx8IG9sZEF1
dG9XcmFwKSkgfHwgY2xlYXJQcmV2aW91c0Zsb2F0KSB7CiAgICAgICAgICAgICAgICAgICAgIG1f
bWluUHJlZldpZHRoID0gbWF4KGlubGluZU1pbiwgbV9taW5QcmVmV2lkdGgpOwogICAgICAgICAg
ICAgICAgICAgICBpbmxpbmVNaW4gPSAwOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAg
ICAgICAgIC8vIElmIHdlJ3JlIHN1cHBvc2VkIHRvIGNsZWFyIHRoZSBwcmV2aW91cyBmbG9hdCwg
dGhlbiB0ZXJtaW5hdGUgbWF4d2lkdGggYXMgd2VsbC4KLSAgICAgICAgICAgICAgICBpZiAoY2xl
YXJQcmV2aW91c0Zsb2F0KSB7CisgICAgICAgICAgICAgICAgLy8gQWxzbyBkbyB0aGlzIGZvciBh
bm9ueW1vdXMgaW5saW5lIGJsb2Nrcy4KKyAgICAgICAgICAgICAgICBpZiAoY2xlYXJQcmV2aW91
c0Zsb2F0IHx8IGNoaWxkLT5pc0Fub255bW91c0lubGluZUJsb2NrKCkpIHsKICAgICAgICAgICAg
ICAgICAgICAgbV9tYXhQcmVmV2lkdGggPSBtYXgoaW5saW5lTWF4LCBtX21heFByZWZXaWR0aCk7
CiAgICAgICAgICAgICAgICAgICAgIGlubGluZU1heCA9IDA7CiAgICAgICAgICAgICAgICAgfQpA
QCAtNDE1OCwxNSArNDA5OCwxNyBAQCB2b2lkIFJlbmRlckJsb2NrOjpjYWxjSW5saW5lUHJlZldp
ZHRocygpCiAgICAgICAgICAgICAgICAgaW50IHRpID0gMDsKICAgICAgICAgICAgICAgICBpZiAo
IWFkZGVkVGV4dEluZGVudCkgewogICAgICAgICAgICAgICAgICAgICBhZGRlZFRleHRJbmRlbnQg
PSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB0aSA9IHN0eWxlKCktPnRleHRJbmRlbnQoKS5j
YWxjTWluVmFsdWUoY3cpOwotICAgICAgICAgICAgICAgICAgICBjaGlsZE1pbis9dGk7Ci0gICAg
ICAgICAgICAgICAgICAgIGNoaWxkTWF4Kz10aTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFj
aGlsZC0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CisgICAgICAgICAgICAgICAgICAgICAg
ICB0aSA9IHN0eWxlKCktPnRleHRJbmRlbnQoKS5jYWxjTWluVmFsdWUoY3cpOworICAgICAgICAg
ICAgICAgICAgICAgICAgY2hpbGRNaW4gKz0gdGk7CisgICAgICAgICAgICAgICAgICAgICAgICBj
aGlsZE1heCArPSB0aTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0K
IAogICAgICAgICAgICAgICAgIC8vIEFkZCBvdXIgd2lkdGggdG8gdGhlIG1heC4KICAgICAgICAg
ICAgICAgICBpbmxpbmVNYXggKz0gY2hpbGRNYXg7CiAKLSAgICAgICAgICAgICAgICBpZiAoIWF1
dG9XcmFwIHx8ICFjYW5CcmVha1JlcGxhY2VkRWxlbWVudCkgeworICAgICAgICAgICAgICAgIGlm
ICgoIWF1dG9XcmFwIHx8ICFjYW5CcmVha1JlcGxhY2VkRWxlbWVudCkgJiYgIWNoaWxkLT5pc0Fu
b255bW91c0lubGluZUJsb2NrKCkpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLT5p
c0Zsb2F0aW5nKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICBtX21pblByZWZXaWR0aCA9IG1h
eChjaGlsZE1pbiwgbV9taW5QcmVmV2lkdGgpOwogICAgICAgICAgICAgICAgICAgICBlbHNlCkBA
IC00MTc3LDYgKzQxMTksMTIgQEAgdm9pZCBSZW5kZXJCbG9jazo6Y2FsY0lubGluZVByZWZXaWR0
aHMoKQogCiAgICAgICAgICAgICAgICAgICAgIC8vIE5vdyBzdGFydCBhIG5ldyBsaW5lLgogICAg
ICAgICAgICAgICAgICAgICBpbmxpbmVNaW4gPSAwOworICAgICAgICAgICAgICAgICAgICAKKyAg
ICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLT5pc0Fub255bW91c0lubGluZUJsb2NrKCkpIHsK
KyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRlcm1pbmF0ZSBtYXggd2lkdGggYXMgd2VsbC4K
KyAgICAgICAgICAgICAgICAgICAgICAgIG1fbWF4UHJlZldpZHRoID0gbWF4KGNoaWxkTWF4LCBt
X21heFByZWZXaWR0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmVNYXggPSAwOwor
ICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAg
ICAgLy8gV2UgYXJlIG5vIGxvbmdlciBzdHJpcHBpbmcgd2hpdGVzcGFjZSBhdCB0aGUgc3RhcnQg
b2YKQEAgLTQ0MTcsOSArNDM2NSwxMiBAQCBpbnQgUmVuZGVyQmxvY2s6OmxpbmVIZWlnaHQoYm9v
bCBmaXJzdExpCiAgICAgLy8gdGhlIGJhc2UgY2xhc3MuICBJZiB3ZSdyZSBiZWluZyBxdWVyaWVk
IGFzIHRob3VnaCB3ZSdyZSB0aGUgcm9vdCBsaW5lCiAgICAgLy8gYm94LCB0aGVuIHRoZSBmYWN0
IHRoYXQgd2UncmUgYW4gaW5saW5lLWJsb2NrIGlzIGlycmVsZXZhbnQsIGFuZCB3ZSBiZWhhdmUK
ICAgICAvLyBqdXN0IGxpa2UgYSBibG9jay4KLSAgICBpZiAoaXNSZXBsYWNlZCgpICYmICFpc1Jv
b3RMaW5lQm94KQorICAgIGlmIChpc1JlcGxhY2VkKCkgJiYgIWlzUm9vdExpbmVCb3gpIHsKKyAg
ICAgICAgaWYgKGlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkKKyAgICAgICAgICAgIHJldHVybiBo
ZWlnaHQoKTsKICAgICAgICAgcmV0dXJuIGhlaWdodCgpICsgbWFyZ2luVG9wKCkgKyBtYXJnaW5C
b3R0b20oKTsKLSAgICAKKyAgICB9CisKICAgICBpZiAoZmlyc3RMaW5lICYmIGRvY3VtZW50KCkt
PnVzZXNGaXJzdExpbmVSdWxlcygpKSB7CiAgICAgICAgIFJlbmRlclN0eWxlKiBzID0gc3R5bGUo
Zmlyc3RMaW5lKTsKICAgICAgICAgaWYgKHMgIT0gc3R5bGUoKSkKQEAgLTQ0NTEsNiArNDQwMiw4
IEBAIGludCBSZW5kZXJCbG9jazo6YmFzZWxpbmVQb3NpdGlvbihib29sIGIKICAgICAgICAgLy8g
V2UgYWxzbyBnaXZlIHVwIG9uIGZpbmRpbmcgYSBiYXNlbGluZSBpZiB3ZSBoYXZlIGEgdmVydGlj
YWwgc2Nyb2xsYmFyLCBvciBpZiB3ZSBhcmUgc2Nyb2xsZWQKICAgICAgICAgLy8gdmVydGljYWxs
eSAoZS5nLiwgYW4gb3ZlcmZsb3c6aGlkZGVuIGJsb2NrIHRoYXQgaGFzIGhhZCBzY3JvbGxUb3Ag
bW92ZWQpIG9yIGlmIHRoZSBiYXNlbGluZSBpcyBvdXRzaWRlCiAgICAgICAgIC8vIG9mIG91ciBj
b250ZW50IGJveC4KKyAgICAgICAgaWYgKGlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkKKyAgICAg
ICAgICAgIHJldHVybiBoZWlnaHQoKTsKICAgICAgICAgaW50IGJhc2VsaW5lUG9zID0gKGxheWVy
KCkgJiYgKGxheWVyKCktPm1hcnF1ZWUoKSB8fCBsYXllcigpLT52ZXJ0aWNhbFNjcm9sbGJhcigp
IHx8IGxheWVyKCktPnNjcm9sbFlPZmZzZXQoKSAhPSAwKSkgPyAtMSA6IGxhc3RMaW5lQm94QmFz
ZWxpbmUoKTsKICAgICAgICAgaWYgKGJhc2VsaW5lUG9zICE9IC0xICYmIGJhc2VsaW5lUG9zIDw9
IGJvcmRlclRvcCgpICsgcGFkZGluZ1RvcCgpICsgY29udGVudEhlaWdodCgpKQogICAgICAgICAg
ICAgcmV0dXJuIG1hcmdpblRvcCgpICsgYmFzZWxpbmVQb3M7CkBAIC00ODc1LDYwICs0ODI4LDYg
QEAgdm9pZCBSZW5kZXJCbG9jazo6c2V0TWF4Qm90dG9tTWFyZ2lucyhpbgogICAgIG1fbWF4TWFy
Z2luLT5tX2JvdHRvbU5lZyA9IG5lZzsKIH0KIAotdm9pZCBSZW5kZXJCbG9jazo6YWJzb2x1dGVS
ZWN0cyhWZWN0b3I8SW50UmVjdD4mIHJlY3RzLCBpbnQgdHgsIGludCB0eSkKLXsKLSAgICAvLyBG
b3IgYmxvY2tzIGluc2lkZSBpbmxpbmVzLCB3ZSBnbyBhaGVhZCBhbmQgaW5jbHVkZSBtYXJnaW5z
IHNvIHRoYXQgd2UgcnVuIHJpZ2h0IHVwIHRvIHRoZQotICAgIC8vIGlubGluZSBib3hlcyBhYm92
ZSBhbmQgYmVsb3cgdXMgKHRodXMgZ2V0dGluZyBtZXJnZWQgd2l0aCB0aGVtIHRvIGZvcm0gYSBz
aW5nbGUgaXJyZWd1bGFyCi0gICAgLy8gc2hhcGUpLgotICAgIGlmIChpbmxpbmVDb250aW51YXRp
b24oKSkgewotICAgICAgICByZWN0cy5hcHBlbmQoSW50UmVjdCh0eCwgdHkgLSBjb2xsYXBzZWRN
YXJnaW5Ub3AoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgoKSwgaGVpZ2h0
KCkgKyBjb2xsYXBzZWRNYXJnaW5Ub3AoKSArIGNvbGxhcHNlZE1hcmdpbkJvdHRvbSgpKSk7Ci0g
ICAgICAgIGlubGluZUNvbnRpbnVhdGlvbigpLT5hYnNvbHV0ZVJlY3RzKHJlY3RzLAotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eCAtIHgoKSArIGlubGluZUNv
bnRpbnVhdGlvbigpLT5jb250YWluaW5nQmxvY2soKS0+eCgpLAotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB0eSAtIHkoKSArIGlubGluZUNvbnRpbnVhdGlvbigp
LT5jb250YWluaW5nQmxvY2soKS0+eSgpKTsKLSAgICB9IGVsc2UKLSAgICAgICAgcmVjdHMuYXBw
ZW5kKEludFJlY3QodHgsIHR5LCB3aWR0aCgpLCBoZWlnaHQoKSkpOwotfQotCi12b2lkIFJlbmRl
ckJsb2NrOjphYnNvbHV0ZVF1YWRzKFZlY3RvcjxGbG9hdFF1YWQ+JiBxdWFkcykKLXsKLSAgICAv
LyBGb3IgYmxvY2tzIGluc2lkZSBpbmxpbmVzLCB3ZSBnbyBhaGVhZCBhbmQgaW5jbHVkZSBtYXJn
aW5zIHNvIHRoYXQgd2UgcnVuIHJpZ2h0IHVwIHRvIHRoZQotICAgIC8vIGlubGluZSBib3hlcyBh
Ym92ZSBhbmQgYmVsb3cgdXMgKHRodXMgZ2V0dGluZyBtZXJnZWQgd2l0aCB0aGVtIHRvIGZvcm0g
YSBzaW5nbGUgaXJyZWd1bGFyCi0gICAgLy8gc2hhcGUpLgotICAgIGlmIChpbmxpbmVDb250aW51
YXRpb24oKSkgewotICAgICAgICBGbG9hdFJlY3QgbG9jYWxSZWN0KDAsIC1jb2xsYXBzZWRNYXJn
aW5Ub3AoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCgpLCBoZWlnaHQoKSAr
IGNvbGxhcHNlZE1hcmdpblRvcCgpICsgY29sbGFwc2VkTWFyZ2luQm90dG9tKCkpOwotICAgICAg
ICBxdWFkcy5hcHBlbmQobG9jYWxUb0Fic29sdXRlUXVhZChsb2NhbFJlY3QpKTsKLSAgICAgICAg
aW5saW5lQ29udGludWF0aW9uKCktPmFic29sdXRlUXVhZHMocXVhZHMpOwotICAgIH0gZWxzZQot
ICAgICAgICBxdWFkcy5hcHBlbmQoUmVuZGVyQm94Ojpsb2NhbFRvQWJzb2x1dGVRdWFkKEZsb2F0
UmVjdCgwLCAwLCB3aWR0aCgpLCBoZWlnaHQoKSkpKTsKLX0KLQotSW50UmVjdCBSZW5kZXJCbG9j
azo6cmVjdFdpdGhPdXRsaW5lRm9yUmVwYWludChSZW5kZXJCb3hNb2RlbE9iamVjdCogcmVwYWlu
dENvbnRhaW5lciwgaW50IG91dGxpbmVXaWR0aCkKLXsKLSAgICBJbnRSZWN0IHIoUmVuZGVyQm94
OjpyZWN0V2l0aE91dGxpbmVGb3JSZXBhaW50KHJlcGFpbnRDb250YWluZXIsIG91dGxpbmVXaWR0
aCkpOwotICAgIGlmIChpbmxpbmVDb250aW51YXRpb24oKSkKLSAgICAgICAgci5pbmZsYXRlWShj
b2xsYXBzZWRNYXJnaW5Ub3AoKSk7Ci0gICAgcmV0dXJuIHI7Ci19Ci0KLVJlbmRlck9iamVjdCog
UmVuZGVyQmxvY2s6OmhvdmVyQW5jZXN0b3IoKSBjb25zdAotewotICAgIHJldHVybiBpbmxpbmVD
b250aW51YXRpb24oKSA/IGlubGluZUNvbnRpbnVhdGlvbigpIDogUmVuZGVyQm94Ojpob3ZlckFu
Y2VzdG9yKCk7Ci19Ci0KLXZvaWQgUmVuZGVyQmxvY2s6OnVwZGF0ZURyYWdTdGF0ZShib29sIGRy
YWdPbikKLXsKLSAgICBSZW5kZXJCb3g6OnVwZGF0ZURyYWdTdGF0ZShkcmFnT24pOwotICAgIGlm
IChpbmxpbmVDb250aW51YXRpb24oKSkKLSAgICAgICAgaW5saW5lQ29udGludWF0aW9uKCktPnVw
ZGF0ZURyYWdTdGF0ZShkcmFnT24pOwotfQotCi1SZW5kZXJTdHlsZSogUmVuZGVyQmxvY2s6Om91
dGxpbmVTdHlsZUZvclJlcGFpbnQoKSBjb25zdAotewotICAgIHJldHVybiBpbmxpbmVDb250aW51
YXRpb24oKSA/IGlubGluZUNvbnRpbnVhdGlvbigpLT5zdHlsZSgpIDogc3R5bGUoKTsKLX0KLQog
dm9pZCBSZW5kZXJCbG9jazo6Y2hpbGRCZWNhbWVOb25JbmxpbmUoUmVuZGVyT2JqZWN0KikKIHsK
ICAgICBtYWtlQ2hpbGRyZW5Ob25JbmxpbmUoKTsKQEAgLTQ5MzcsMjYgKzQ4MzYsNiBAQCB2b2lk
IFJlbmRlckJsb2NrOjpjaGlsZEJlY2FtZU5vbklubGluZShSCiAgICAgLy8gfHRoaXN8IG1heSBi
ZSBkZWFkIGhlcmUKIH0KIAotdm9pZCBSZW5kZXJCbG9jazo6dXBkYXRlSGl0VGVzdFJlc3VsdChI
aXRUZXN0UmVzdWx0JiByZXN1bHQsIGNvbnN0IEludFBvaW50JiBwb2ludCkKLXsKLSAgICBpZiAo
cmVzdWx0LmlubmVyTm9kZSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBOb2RlKiBuID0gbm9k
ZSgpOwotICAgIGlmIChpbmxpbmVDb250aW51YXRpb24oKSkKLSAgICAgICAgLy8gV2UgYXJlIGlu
IHRoZSBtYXJnaW5zIG9mIGJsb2NrIGVsZW1lbnRzIHRoYXQgYXJlIHBhcnQgb2YgYSBjb250aW51
YXRpb24uICBJbgotICAgICAgICAvLyB0aGlzIGNhc2Ugd2UncmUgYWN0dWFsbHkgc3RpbGwgaW5z
aWRlIHRoZSBlbmNsb3NpbmcgaW5saW5lIGVsZW1lbnQgdGhhdCB3YXMKLSAgICAgICAgLy8gc3Bs
aXQuICBHbyBhaGVhZCBhbmQgc2V0IG91ciBpbm5lciBub2RlIGFjY29yZGluZ2x5LgotICAgICAg
ICBuID0gaW5saW5lQ29udGludWF0aW9uKCktPm5vZGUoKTsKLQotICAgIGlmIChuKSB7Ci0gICAg
ICAgIHJlc3VsdC5zZXRJbm5lck5vZGUobik7Ci0gICAgICAgIGlmICghcmVzdWx0LmlubmVyTm9u
U2hhcmVkTm9kZSgpKQotICAgICAgICAgICAgcmVzdWx0LnNldElubmVyTm9uU2hhcmVkTm9kZShu
KTsKLSAgICAgICAgcmVzdWx0LnNldExvY2FsUG9pbnQocG9pbnQpOwotICAgIH0KLX0KLQogSW50
UmVjdCBSZW5kZXJCbG9jazo6bG9jYWxDYXJldFJlY3QoSW5saW5lQm94KiBpbmxpbmVCb3gsIGlu
dCBjYXJldE9mZnNldCwgaW50KiBleHRyYVdpZHRoVG9FbmRPZkxpbmUpCiB7CiAgICAgLy8gRG8g
dGhlIG5vcm1hbCBjYWxjdWxhdGlvbiBpbiBtb3N0IGNhc2VzLgpAQCAtNTAzNywyMCArNDkxNiw3
IEBAIEludFJlY3QgUmVuZGVyQmxvY2s6OmxvY2FsQ2FyZXRSZWN0KElubGkKIAogdm9pZCBSZW5k
ZXJCbG9jazo6YWRkRm9jdXNSaW5nUmVjdHMoVmVjdG9yPEludFJlY3Q+JiByZWN0cywgaW50IHR4
LCBpbnQgdHkpCiB7Ci0gICAgLy8gRm9yIGJsb2NrcyBpbnNpZGUgaW5saW5lcywgd2UgZ28gYWhl
YWQgYW5kIGluY2x1ZGUgbWFyZ2lucyBzbyB0aGF0IHdlIHJ1biByaWdodCB1cCB0byB0aGUKLSAg
ICAvLyBpbmxpbmUgYm94ZXMgYWJvdmUgYW5kIGJlbG93IHVzICh0aHVzIGdldHRpbmcgbWVyZ2Vk
IHdpdGggdGhlbSB0byBmb3JtIGEgc2luZ2xlIGlycmVndWxhcgotICAgIC8vIHNoYXBlKS4KLSAg
ICBpZiAoaW5saW5lQ29udGludWF0aW9uKCkpIHsKLSAgICAgICAgLy8gRklYTUU6IFRoaXMgY2hl
Y2sgcmVhbGx5IGlzbid0IGFjY3VyYXRlLiAKLSAgICAgICAgYm9vbCBuZXh0SW5saW5lSGFzTGlu
ZUJveCA9IGlubGluZUNvbnRpbnVhdGlvbigpLT5maXJzdExpbmVCb3goKTsKLSAgICAgICAgLy8g
RklYTUU6IFRoaXMgaXMgd3JvbmcuIFRoZSBwcmluY2lwYWwgcmVuZGVyZXIgbWF5IG5vdCBiZSB0
aGUgY29udGludWF0aW9uIHByZWNlZGluZyB0aGlzIGJsb2NrLgotICAgICAgICBib29sIHByZXZJ
bmxpbmVIYXNMaW5lQm94ID0gdG9SZW5kZXJJbmxpbmUoaW5saW5lQ29udGludWF0aW9uKCktPm5v
ZGUoKS0+cmVuZGVyZXIoKSktPmZpcnN0TGluZUJveCgpOyAKLSAgICAgICAgaW50IHRvcE1hcmdp
biA9IHByZXZJbmxpbmVIYXNMaW5lQm94ID8gY29sbGFwc2VkTWFyZ2luVG9wKCkgOiAwOwotICAg
ICAgICBpbnQgYm90dG9tTWFyZ2luID0gbmV4dElubGluZUhhc0xpbmVCb3ggPyBjb2xsYXBzZWRN
YXJnaW5Cb3R0b20oKSA6IDA7Ci0gICAgICAgIEludFJlY3QgcmVjdCh0eCwgdHkgLSB0b3BNYXJn
aW4sIHdpZHRoKCksIGhlaWdodCgpICsgdG9wTWFyZ2luICsgYm90dG9tTWFyZ2luKTsKLSAgICAg
ICAgaWYgKCFyZWN0LmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJlY3RzLmFwcGVuZChyZWN0KTsK
LSAgICB9IGVsc2UgaWYgKHdpZHRoKCkgJiYgaGVpZ2h0KCkpCisgICAgaWYgKHdpZHRoKCkgfHwg
aGVpZ2h0KCkpCiAgICAgICAgIHJlY3RzLmFwcGVuZChJbnRSZWN0KHR4LCB0eSwgd2lkdGgoKSwg
aGVpZ2h0KCkpKTsKIAogICAgIGlmICghaGFzT3ZlcmZsb3dDbGlwKCkgJiYgIWhhc0NvbnRyb2xD
bGlwKCkpIHsKQEAgLTUwNzUsMTEgKzQ5NDEsNiBAQCB2b2lkIFJlbmRlckJsb2NrOjphZGRGb2N1
c1JpbmdSZWN0cyhWZWN0CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0KLSAgICBp
ZiAoaW5saW5lQ29udGludWF0aW9uKCkpCi0gICAgICAgIGlubGluZUNvbnRpbnVhdGlvbigpLT5h
ZGRGb2N1c1JpbmdSZWN0cyhyZWN0cywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICB0eCAtIHgoKSArIGlubGluZUNvbnRpbnVhdGlvbigpLT5jb250YWlu
aW5nQmxvY2soKS0+eCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgdHkgLSB5KCkgKyBpbmxpbmVDb250aW51YXRpb24oKS0+Y29udGFpbmluZ0Jsb2Nr
KCktPnkoKSk7CiB9CiAKIFJlbmRlckJsb2NrKiBSZW5kZXJCbG9jazo6Y3JlYXRlQW5vbnltb3Vz
QmxvY2soYm9vbCBpc0ZsZXhpYmxlQm94KSBjb25zdApAQCAtNTExMSw2ICs0OTcyLDggQEAgY29u
c3QgY2hhciogUmVuZGVyQmxvY2s6OnJlbmRlck5hbWUoKSBjbwogICAgICAgICByZXR1cm4gIlJl
bmRlckJsb2NrIChwb3NpdGlvbmVkKSI7CiAgICAgaWYgKGlzQW5vbnltb3VzQmxvY2soKSkKICAg
ICAgICAgcmV0dXJuICJSZW5kZXJCbG9jayAoYW5vbnltb3VzKSI7CisgICAgZWxzZSBpZiAoaXNB
bm9ueW1vdXNJbmxpbmVCbG9jaygpKQorICAgICAgICByZXR1cm4gIlJlbmRlckJsb2NrIChhbm9u
eW1vdXMgaW5saW5lLWJsb2NrKSI7CiAgICAgZWxzZSBpZiAoaXNBbm9ueW1vdXMoKSkKICAgICAg
ICAgcmV0dXJuICJSZW5kZXJCbG9jayAoZ2VuZXJhdGVkKSI7CiAgICAgaWYgKGlzUmVsUG9zaXRp
b25lZCgpKQpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5oCShyZXZpc2lvbiA1NDUwMSkKKysr
IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmgJKHdvcmtpbmcgY29weSkKQEAgLTEyOSwx
NSArMTI5LDE1IEBAIHB1YmxpYzoKIAogICAgIHZvaWQgYWRqdXN0UmVjdEZvckNvbHVtbnMoSW50
UmVjdCYpIGNvbnN0OwogCi0gICAgdm9pZCBhZGRDb250aW51YXRpb25XaXRoT3V0bGluZShSZW5k
ZXJJbmxpbmUqKTsKLQotICAgIFJlbmRlcklubGluZSogaW5saW5lQ29udGludWF0aW9uKCkgY29u
c3QgeyByZXR1cm4gbV9pbmxpbmVDb250aW51YXRpb247IH0KLSAgICB2b2lkIHNldElubGluZUNv
bnRpbnVhdGlvbihSZW5kZXJJbmxpbmUqIGMpIHsgbV9pbmxpbmVDb250aW51YXRpb24gPSBjOyB9
Ci0KICAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGEgY29udmVuaWVuY2UgaGVscGVyIGZvciBjcmVh
dGluZyBhbiBhbm9ueW1vdXMgYmxvY2sgdGhhdCBpbmhlcml0cyBpdHMKICAgICAvLyBzdHlsZSBm
cm9tIHRoaXMgUmVuZGVyQmxvY2suCiAgICAgUmVuZGVyQmxvY2sqIGNyZWF0ZUFub255bW91c0Js
b2NrKGJvb2wgaXNGbGV4aWJsZUJveCA9IGZhbHNlKSBjb25zdDsKIAorICAgIHZpcnR1YWwgdm9p
ZCBwYWludChQYWludEluZm8mLCBpbnQgdHgsIGludCB0eSk7CisgICAgdmlydHVhbCB2b2lkIHBh
aW50T2JqZWN0KFBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5KTsKKworICAgIGJvb2wgaW5Sb290
QmxvY2tDb250ZXh0KCkgY29uc3Q7CisKIHByb3RlY3RlZDoKICAgICB2b2lkIG1vdmVDaGlsZFRv
KFJlbmRlck9iamVjdCogdG8sIFJlbmRlck9iamVjdENoaWxkTGlzdCogdG9DaGlsZExpc3QsIFJl
bmRlck9iamVjdCogY2hpbGQpOwogICAgIHZvaWQgbW92ZUNoaWxkVG8oUmVuZGVyT2JqZWN0KiB0
bywgUmVuZGVyT2JqZWN0Q2hpbGRMaXN0KiB0b0NoaWxkTGlzdCwgUmVuZGVyT2JqZWN0KiBiZWZv
cmVDaGlsZCwgUmVuZGVyT2JqZWN0KiBjaGlsZCk7CkBAIC0xNjUsOSArMTY1LDYgQEAgcHJvdGVj
dGVkOgogCiAgICAgdm9pZCBsYXlvdXRQb3NpdGlvbmVkT2JqZWN0cyhib29sIHJlbGF5b3V0Q2hp
bGRyZW4pOwogCi0gICAgdmlydHVhbCB2b2lkIHBhaW50KFBhaW50SW5mbyYsIGludCB0eCwgaW50
IHR5KTsKLSAgICB2aXJ0dWFsIHZvaWQgcGFpbnRPYmplY3QoUGFpbnRJbmZvJiwgaW50IHR4LCBp
bnQgdHkpOwotCiAgICAgaW50IHJpZ2h0UmVsT2Zmc2V0KGludCB5LCBpbnQgZml4ZWRPZmZzZXQs
IGJvb2wgYXBwbHlUZXh0SW5kZW50ID0gdHJ1ZSwgaW50KiBoZWlnaHRSZW1haW5pbmcgPSAwKSBj
b25zdDsKICAgICBpbnQgbGVmdFJlbE9mZnNldChpbnQgeSwgaW50IGZpeGVkT2Zmc2V0LCBib29s
IGFwcGx5VGV4dEluZGVudCA9IHRydWUsIGludCogaGVpZ2h0UmVtYWluaW5nID0gMCkgY29uc3Q7
CiAKQEAgLTE4MCw4ICsxNzcsNiBAQCBwcm90ZWN0ZWQ6CiAKICAgICB2aXJ0dWFsIHZvaWQgdXBk
YXRlRmlyc3RMZXR0ZXIoKTsKIAotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVIaXRUZXN0UmVzdWx0
KEhpdFRlc3RSZXN1bHQmLCBjb25zdCBJbnRQb2ludCYpOwotCiAgICAgLy8gRGVsYXkgdXBkYXRl
IHNjcm9sbGJhciB1bnRpbCBmaW5pc2hEZWxheVJlcGFpbnQoKSB3aWxsIGJlCiAgICAgLy8gY2Fs
bGVkLiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2hlbiBhIGZsZXhib3ggaXMgbGF5aW5nIG91dCBp
dHMKICAgICAvLyBkZXNjZW5kYW50LiBJZiBtdWx0aXBsZSBjYWxscyBhcmUgbWFkZSB0byBzdGFy
dERlbGF5UmVwYWludCgpLApAQCAtMjQ1LDcgKzI0MCw5IEBAIHByaXZhdGU6CiAgICAgICAgIGJv
b2wgZXZlckhhZExheW91dDsKICAgICB9OwogCi0gICAgLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlv
bnMnIGltcGxlbWVudGF0aW9ucyBhcmUgaW4gUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcC4KKyAg
ICBjbGFzcyBNYXJnaW5JbmZvOworCisgICAgLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMnIGlt
cGxlbWVudGF0aW9ucyBhcmUgaW4gUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcC4gICAgCiAgICAg
dm9pZCBiaWRpUmVvcmRlckxpbmUoSW5saW5lQmlkaVJlc29sdmVyJiwgY29uc3QgSW5saW5lSXRl
cmF0b3ImIGVuZCwgYm9vbCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHkpOwogICAgIFJvb3RJbmxp
bmVCb3gqIGRldGVybWluZVN0YXJ0UG9zaXRpb24oYm9vbCYgZmlyc3RMaW5lLCBib29sJiBmdWxs
TGF5b3V0LCBib29sJiBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHksCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBJbmxpbmVCaWRpUmVzb2x2ZXImLCBWZWN0b3I8Rmxv
YXRXaXRoUmVjdD4mIGZsb2F0cywgdW5zaWduZWQmIG51bUNsZWFuRmxvYXRzKTsKQEAgLTI1OCw3
ICsyNTUsNyBAQCBwcml2YXRlOgogICAgIHZvaWQgc2tpcFRyYWlsaW5nV2hpdGVzcGFjZShJbmxp
bmVJdGVyYXRvciYsIGJvb2wgaXNMaW5lRW1wdHksIGJvb2wgcHJldmlvdXNMaW5lQnJva2VDbGVh
bmx5KTsKICAgICBpbnQgc2tpcExlYWRpbmdXaGl0ZXNwYWNlKElubGluZUJpZGlSZXNvbHZlciYs
IGJvb2wgZmlyc3RMaW5lLCBib29sIGlzTGluZUVtcHR5LCBib29sIHByZXZpb3VzTGluZUJyb2tl
Q2xlYW5seSk7CiAgICAgdm9pZCBmaXRCZWxvd0Zsb2F0cyhpbnQgd2lkdGhUb0ZpdCwgYm9vbCBm
aXJzdExpbmUsIGludCYgYXZhaWxhYmxlV2lkdGgpOwotICAgIElubGluZUl0ZXJhdG9yIGZpbmRO
ZXh0TGluZUJyZWFrKElubGluZUJpZGlSZXNvbHZlciYsIGJvb2wgZmlyc3RMaW5lLCBib29sJiBp
c0xpbmVFbXB0eSwgYm9vbCYgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5LCBFQ2xlYXIqIGNsZWFy
ID0gMCk7CisgICAgSW5saW5lSXRlcmF0b3IgZmluZE5leHRMaW5lQnJlYWsoSW5saW5lQmlkaVJl
c29sdmVyJiwgYm9vbCBmaXJzdExpbmUsIGJvb2wmIGlzTGluZUVtcHR5LCBib29sJiBwcmV2aW91
c0xpbmVCcm9rZUNsZWFubHksIE1hcmdpbkluZm8mLCBFQ2xlYXIqIGNsZWFyID0gMCk7CiAgICAg
Um9vdElubGluZUJveCogY29uc3RydWN0TGluZSh1bnNpZ25lZCBydW5Db3VudCwgQmlkaVJ1biog
Zmlyc3RSdW4sIEJpZGlSdW4qIGxhc3RSdW4sIGJvb2wgZmlyc3RMaW5lLCBib29sIGxhc3RMaW5l
LCBSZW5kZXJPYmplY3QqIGVuZE9iamVjdCk7CiAgICAgSW5saW5lRmxvd0JveCogY3JlYXRlTGlu
ZUJveGVzKFJlbmRlck9iamVjdCosIGJvb2wgZmlyc3RMaW5lKTsKICAgICB2b2lkIGNvbXB1dGVI
b3Jpem9udGFsUG9zaXRpb25zRm9yTGluZShSb290SW5saW5lQm94KiwgYm9vbCBmaXJzdExpbmUs
IEJpZGlSdW4qIGZpcnN0UnVuLCBCaWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVuLCBib29sIHJlYWNo
ZWRFbmQpOwpAQCAtMzEzLDEzICszMTAsNyBAQCBwcml2YXRlOgogICAgIC8vIE9idGFpbnMgdGhl
IG5lYXJlc3QgZW5jbG9zaW5nIGJsb2NrIChpbmNsdWRpbmcgdGhpcyBibG9jaykgdGhhdCBjb250
cmlidXRlcyBhIGZpcnN0LWxpbmUgc3R5bGUgdG8gb3VyIGlubGluZQogICAgIC8vIGNoaWxkcmVu
LgogICAgIHZpcnR1YWwgUmVuZGVyQmxvY2sqIGZpcnN0TGluZUJsb2NrKCkgY29uc3Q7Ci0gICAg
Ym9vbCBpblJvb3RCbG9ja0NvbnRleHQoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgSW50UmVjdCBy
ZWN0V2l0aE91dGxpbmVGb3JSZXBhaW50KFJlbmRlckJveE1vZGVsT2JqZWN0KiByZXBhaW50Q29u
dGFpbmVyLCBpbnQgb3V0bGluZVdpZHRoKTsKLSAgICB2aXJ0dWFsIFJlbmRlclN0eWxlKiBvdXRs
aW5lU3R5bGVGb3JSZXBhaW50KCkgY29uc3Q7CiAgICAgCi0gICAgdmlydHVhbCBSZW5kZXJPYmpl
Y3QqIGhvdmVyQW5jZXN0b3IoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlRHJhZ1N0
YXRlKGJvb2wgZHJhZ09uKTsKICAgICB2aXJ0dWFsIHZvaWQgY2hpbGRCZWNhbWVOb25JbmxpbmUo
UmVuZGVyT2JqZWN0KiBjaGlsZCk7CiAKICAgICB2aXJ0dWFsIEludFJlY3Qgc2VsZWN0aW9uUmVj
dEZvclJlcGFpbnQoUmVuZGVyQm94TW9kZWxPYmplY3QqIHJlcGFpbnRDb250YWluZXIsIGJvb2wg
LypjbGlwVG9WaXNpYmxlQ29udGVudCovKQpAQCAtMzM5LDE2ICszMzAsMTEgQEAgcHJpdmF0ZToK
ICAgICBpbnQgbGVmdFNlbGVjdGlvbk9mZnNldChSZW5kZXJCbG9jayogcm9vdEJsb2NrLCBpbnQg
eSk7CiAgICAgaW50IHJpZ2h0U2VsZWN0aW9uT2Zmc2V0KFJlbmRlckJsb2NrKiByb290QmxvY2ss
IGludCB5KTsKIAotICAgIHZpcnR1YWwgdm9pZCBhYnNvbHV0ZVJlY3RzKFZlY3RvcjxJbnRSZWN0
PiYsIGludCB0eCwgaW50IHR5KTsKLSAgICB2aXJ0dWFsIHZvaWQgYWJzb2x1dGVRdWFkcyhWZWN0
b3I8RmxvYXRRdWFkPiYpOwotCiAgICAgaW50IGRlc2lyZWRDb2x1bW5XaWR0aCgpIGNvbnN0Owog
ICAgIHVuc2lnbmVkIGRlc2lyZWRDb2x1bW5Db3VudCgpIGNvbnN0OwogICAgIFZlY3RvcjxJbnRS
ZWN0PiogY29sdW1uUmVjdHMoKSBjb25zdDsKICAgICB2b2lkIHNldERlc2lyZWRDb2x1bW5Db3Vu
dEFuZFdpZHRoKGludCBjb3VudCwgaW50IHdpZHRoKTsKICAgICBpbnQgY29sdW1uR2FwKCkgY29u
c3Q7Ci0gICAgCi0gICAgdm9pZCBwYWludENvbnRpbnVhdGlvbk91dGxpbmVzKFBhaW50SW5mbyYs
IGludCB0eCwgaW50IHR5KTsKIAogICAgIHZpcnR1YWwgSW50UmVjdCBsb2NhbENhcmV0UmVjdChJ
bmxpbmVCb3gqLCBpbnQgY2FyZXRPZmZzZXQsIGludCogZXh0cmFXaWR0aFRvRW5kT2ZMaW5lID0g
MCk7CiAKQEAgLTQ4NCwxMiArNDcwLDYgQEAgcHJpdmF0ZToKICAgICBEZXByZWNhdGVkUHRyTGlz
dDxGbG9hdGluZ09iamVjdD4qIG1fZmxvYXRpbmdPYmplY3RzOwogICAgIExpc3RIYXNoU2V0PFJl
bmRlckJveCo+KiBtX3Bvc2l0aW9uZWRPYmplY3RzOwogCi0gICAgLy8gQW4gaW5saW5lIGNhbiBi
ZSBzcGxpdCB3aXRoIGJsb2NrcyBvY2N1cnJpbmcgaW4gYmV0d2VlbiB0aGUgaW5saW5lIGNvbnRl
bnQuCi0gICAgLy8gV2hlbiB0aGlzIG9jY3VycyB3ZSBuZWVkIGEgcG9pbnRlciB0byBvdXIgbmV4
dCBvYmplY3QuICBXZSBjYW4gYmFzaWNhbGx5IGJlCi0gICAgLy8gc3BsaXQgaW50byBhIHNlcXVl
bmNlIG9mIGlubGluZXMgYW5kIGJsb2Nrcy4gIFRoZSBjb250aW51YXRpb24gd2lsbCBlaXRoZXIg
YmUKLSAgICAvLyBhbiBhbm9ueW1vdXMgYmxvY2sgKHRoYXQgaG91c2VzIG90aGVyIGJsb2Nrcykg
b3IgaXQgd2lsbCBiZSBhbiBpbmxpbmUgZmxvdy4KLSAgICBSZW5kZXJJbmxpbmUqIG1faW5saW5l
Q29udGludWF0aW9uOwotCiAgICAgLy8gQWxsb2NhdGVkIG9ubHkgd2hlbiBzb21lIG9mIHRoZXNl
IGZpZWxkcyBoYXZlIG5vbi1kZWZhdWx0IHZhbHVlcwogICAgIHN0cnVjdCBNYXhNYXJnaW4gOiBO
b25jb3B5YWJsZSB7CiAgICAgICAgIE1heE1hcmdpbihjb25zdCBSZW5kZXJCbG9jayogbykgCklu
ZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5jcHAJKHJldmlz
aW9uIDU0NTAxKQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNw
cAkod29ya2luZyBjb3B5KQpAQCAtNTcyLDEyICs1NzIsMTYgQEAgUm9vdElubGluZUJveCogUmVu
ZGVyQmxvY2s6OmNvbnN0cnVjdExpbgogICAgICAgICBpZiAoIWJveCkKICAgICAgICAgICAgIGNv
bnRpbnVlOwogCisgICAgICAgIC8vIEFub255bW91cyBpbmxpbmUgYmxvY2tzICh1c2VkIHRvIGhv
bGQgYmxvY2tzIGluc2lkZSBpbmxpbmVzKSBkb24ndCBuZWVkIHRvIHdhc3RlIHRpbWUgd3JhcHBp
bmcKKyAgICAgICAgLy8gdGhlbXNlbHZlcyBpbiB0aG9zZSBpbmxpbmVzIChzaW5jZSB3ZSB3YW50
IHRvIHByZXRlbmQgbGlrZSB0aGV5IGRvbid0IGV4aXN0IG9uIHRoaXMgZmFrZSBsaW5lKS4KKyAg
ICAgICAgUmVuZGVyT2JqZWN0KiBhbmNlc3RvclJlbmRlcmVyID0gci0+bV9vYmplY3QtPmlzQW5v
bnltb3VzSW5saW5lQmxvY2soKSA/IHRoaXMgOiByLT5tX29iamVjdC0+cGFyZW50KCk7CisgCiAg
ICAgICAgIC8vIElmIHdlIGhhdmUgbm8gcGFyZW50IGJveCB5ZXQsIG9yIGlmIHRoZSBydW4gaXMg
bm90IHNpbXBseSBhIHNpYmxpbmcsCiAgICAgICAgIC8vIHRoZW4gd2UgbmVlZCB0byBjb25zdHJ1
Y3QgaW5saW5lIGJveGVzIGFzIG5lY2Vzc2FyeSB0byBwcm9wZXJseSBlbmNsb3NlIHRoZQogICAg
ICAgICAvLyBydW4ncyBpbmxpbmUgYm94LgotICAgICAgICBpZiAoIXBhcmVudEJveCB8fCBwYXJl
bnRCb3gtPnJlbmRlcmVyKCkgIT0gci0+bV9vYmplY3QtPnBhcmVudCgpKQorICAgICAgICBpZiAo
IXBhcmVudEJveCB8fCBwYXJlbnRCb3gtPnJlbmRlcmVyKCkgIT0gYW5jZXN0b3JSZW5kZXJlcikK
ICAgICAgICAgICAgIC8vIENyZWF0ZSBuZXcgaW5saW5lIGJveGVzIGFsbCB0aGUgd2F5IGJhY2sg
dG8gdGhlIGFwcHJvcHJpYXRlIGluc2VydGlvbiBwb2ludC4KLSAgICAgICAgICAgIHBhcmVudEJv
eCA9IGNyZWF0ZUxpbmVCb3hlcyhyLT5tX29iamVjdC0+cGFyZW50KCksIGZpcnN0TGluZSk7Cisg
ICAgICAgICAgICBwYXJlbnRCb3ggPSBjcmVhdGVMaW5lQm94ZXMoYW5jZXN0b3JSZW5kZXJlciwg
Zmlyc3RMaW5lKTsKIAogICAgICAgICAvLyBBcHBlbmQgdGhlIGlubGluZSBib3ggdG8gdGhpcyBs
aW5lLgogICAgICAgICBwYXJlbnRCb3gtPmFkZFRvTGluZShib3gpOwpAQCAtNjE5LDYgKzYyMyw4
IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmNvbXB1dGVIb3Jpem9udGFsUG9zaXQKICAgICB1bnNpZ25l
ZCBudW1TcGFjZXMgPSAwOwogICAgIEVUZXh0QWxpZ24gdGV4dEFsaWduID0gc3R5bGUoKS0+dGV4
dEFsaWduKCk7CiAKKyAgICBpbnQgeCA9IGxlZnRPZmZzZXQoaGVpZ2h0KCksIGZpcnN0TGluZSk7
CisKICAgICBmb3IgKEJpZGlSdW4qIHIgPSBmaXJzdFJ1bjsgcjsgciA9IHItPm5leHQoKSkgewog
ICAgICAgICBpZiAoIXItPm1fYm94IHx8IHItPm1fb2JqZWN0LT5pc1Bvc2l0aW9uZWQoKSB8fCBy
LT5tX2JveC0+aXNMaW5lQnJlYWsoKSkKICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBQb3NpdGlv
bmVkIG9iamVjdHMgYXJlIG9ubHkgcGFydGljaXBhdGluZyB0byBmaWd1cmUgb3V0IHRoZWlyCkBA
IC02NTYsNiArNjYyLDEyIEBAIHZvaWQgUmVuZGVyQmxvY2s6OmNvbXB1dGVIb3Jpem9udGFsUG9z
aXQKICAgICAgICAgICAgIHJlbmRlckJveC0+Y2FsY1dpZHRoKCk7CiAgICAgICAgICAgICByLT5t
X2JveC0+c2V0V2lkdGgocmVuZGVyQm94LT53aWR0aCgpKTsKICAgICAgICAgICAgIHRvdFdpZHRo
ICs9IHJlbmRlckJveC0+bWFyZ2luTGVmdCgpICsgcmVuZGVyQm94LT5tYXJnaW5SaWdodCgpOwor
ICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoci0+bV9vYmplY3QtPmlzQW5vbnltb3VzSW5s
aW5lQmxvY2soKSkgeworICAgICAgICAgICAgICAgIC8vIEFsbG93IHRoZSBmdWxsIGF2YWlsYWJs
ZSB3aWR0aCB0byBiZSB1c2VkLCBzaW5jZSBmbG9hdHMgd2lsbCBpbnRydWRlIGludG8gb3VyIHNw
YWNlLgorICAgICAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoID0gcmlnaHRPZmZzZXQoKSAtIGxl
ZnRPZmZzZXQoKTsKKyAgICAgICAgICAgICAgICB4ID0gbGVmdE9mZnNldCgpOworICAgICAgICAg
ICAgfQogICAgICAgICB9CiAKICAgICAgICAgdG90V2lkdGggKz0gci0+bV9ib3gtPndpZHRoKCk7
CkBAIC02NjUsNyArNjc3LDYgQEAgdm9pZCBSZW5kZXJCbG9jazo6Y29tcHV0ZUhvcml6b250YWxQ
b3NpdAogICAgIC8vIHdlIG5vdyBleGFtaW5lIG91ciB0ZXh0LWFsaWduIHByb3BlcnR5IGluIG9y
ZGVyIHRvIGRldGVybWluZSB3aGVyZSB0byBwb3NpdGlvbiB0aGUKICAgICAvLyBvYmplY3RzIGhv
cml6b250YWxseS4gIFRoZSB0b3RhbCB3aWR0aCBvZiB0aGUgbGluZSBjYW4gYmUgaW5jcmVhc2Vk
IGlmIHdlIGVuZCB1cAogICAgIC8vIGp1c3RpZnlpbmcgdGV4dC4KLSAgICBpbnQgeCA9IGxlZnRP
ZmZzZXQoaGVpZ2h0KCksIGZpcnN0TGluZSk7CiAgICAgc3dpdGNoICh0ZXh0QWxpZ24pIHsKICAg
ICAgICAgY2FzZSBMRUZUOgogICAgICAgICBjYXNlIFdFQktJVF9MRUZUOgpAQCAtODE5LDkgKzgz
MCwxNSBAQCB2b2lkIFJlbmRlckJsb2NrOjpsYXlvdXRJbmxpbmVDaGlsZHJlbihiCiAgICAgYm9v
bCB1c2VSZXBhaW50Qm91bmRzID0gZmFsc2U7CiAgICAgCiAgICAgbV9vdmVyZmxvdy5jbGVhcigp
OwotICAgICAgICAKLSAgICBzZXRIZWlnaHQoYm9yZGVyVG9wKCkgKyBwYWRkaW5nVG9wKCkpOwot
ICAgIGludCB0b0FkZCA9IGJvcmRlckJvdHRvbSgpICsgcGFkZGluZ0JvdHRvbSgpICsgaG9yaXpv
bnRhbFNjcm9sbGJhckhlaWdodCgpOworICAgIAorICAgIGludCB0b3AgPSBib3JkZXJUb3AoKSAr
IHBhZGRpbmdUb3AoKTsKKyAgICBpbnQgYm90dG9tID0gYm9yZGVyQm90dG9tKCkgKyBwYWRkaW5n
Qm90dG9tKCkgKyBob3Jpem9udGFsU2Nyb2xsYmFySGVpZ2h0KCk7CisKKyAgICBzZXRIZWlnaHQo
dG9wKTsKKworICAgIC8vIFRoZSBtYXJnaW4gc3RydWN0IGNhY2hlcyBhbGwgb3VyIGN1cnJlbnQg
bWFyZ2luIGNvbGxhcHNpbmcgc3RhdGUuIFdlIHJ1biBtYXJnaW4gY29sbGFwc2luZyB3aGVuIHdl
IGVuY291bnRlciBhbm9ueW1vdXMgaW5saW5lIGJsb2NrcyB0aGF0IGFyZSBiZWluZyB1c2VkCisg
ICAgLy8gZm9yIHRoZSBibG9ja3MtaW5zaWRlLWlubGluZXMgY2FzZSAoYW5kIHRoZSBpbmxpbmVz
IGFyZSBlbXB0eSksIGUuZywgPHNwYW4+PGRpdj5PbmU8L2Rpdj48L3NwYW4+LgorICAgIE1hcmdp
bkluZm8gbWFyZ2luSW5mbyh0aGlzLCB0b3AsIGJvdHRvbSk7CiAKICAgICAvLyBGaWd1cmUgb3V0
IGlmIHdlIHNob3VsZCBjbGVhciBvdXQgb3VyIGxpbmUgYm94ZXMuCiAgICAgLy8gRklYTUU6IEhh
bmRsZSByZXNpemUgZXZlbnR1YWxseSEKQEAgLTg1MCwxMiArODY3LDE1IEBAIHZvaWQgUmVuZGVy
QmxvY2s6OmxheW91dElubGluZUNoaWxkcmVuKGIKICAgICAgICAgICAgIGlmIChvLT5pc1JlcGxh
Y2VkKCkgfHwgby0+aXNGbG9hdGluZygpIHx8IG8tPmlzUG9zaXRpb25lZCgpKSB7CiAgICAgICAg
ICAgICAgICAgUmVuZGVyQm94KiBib3ggPSB0b1JlbmRlckJveChvKTsKICAgICAgICAgICAgICAg
ICAKLSAgICAgICAgICAgICAgICBpZiAocmVsYXlvdXRDaGlsZHJlbiB8fCBvLT5zdHlsZSgpLT53
aWR0aCgpLmlzUGVyY2VudCgpIHx8IG8tPnN0eWxlKCktPmhlaWdodCgpLmlzUGVyY2VudCgpKQot
ICAgICAgICAgICAgICAgICAgICBvLT5zZXRDaGlsZE5lZWRzTGF5b3V0KHRydWUsIGZhbHNlKTsK
LSAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGxh
eW91dCBjaGlsZHJlbiBpZiB0aGV5IG5lZWQgaXQuCisgICAgICAgICAgICAgICAgLy8gRklYTUU6
IFRlY2huaWNhbGx5IHBlcmNlbnRhZ2UgaGVpZ2h0IG9iamVjdHMgb25seSBuZWVkIGEgcmVsYXlv
dXQgaWYgdGhlaXIgcGVyY2VudGFnZSBpc24ndCBnb2luZyB0byBiZSB0dXJuZWQgaW50bworICAg
ICAgICAgICAgICAgIC8vIGFuIGF1dG8gdmFsdWUuICBBZGQgYSBtZXRob2QgdG8gZGV0ZXJtaW5l
IHRoaXMsIHNvIHRoYXQgd2UgY2FuIGF2b2lkIHRoZSByZWxheW91dC4KKyAgICAgICAgICAgICAg
ICBpZiAocmVsYXlvdXRDaGlsZHJlbiB8fCAoKGJveC0+c3R5bGUoKS0+aGVpZ2h0KCkuaXNQZXJj
ZW50KCkgfHwgYm94LT5zdHlsZSgpLT5taW5IZWlnaHQoKS5pc1BlcmNlbnQoKSB8fCBib3gtPnN0
eWxlKCktPm1heEhlaWdodCgpLmlzUGVyY2VudCgpKSkpCisgICAgICAgICAgICAgICAgICAgIGJv
eC0+c2V0Q2hpbGROZWVkc0xheW91dCh0cnVlLCBmYWxzZSk7CisKICAgICAgICAgICAgICAgICAv
LyBJZiByZWxheW91dENoaWxkcmVuIGlzIHNldCBhbmQgd2UgaGF2ZSBwZXJjZW50YWdlIHBhZGRp
bmcsIHdlIGFsc28gbmVlZCB0byBpbnZhbGlkYXRlIHRoZSBjaGlsZCdzIHByZWYgd2lkdGhzLgot
ICAgICAgICAgICAgICAgIGlmIChyZWxheW91dENoaWxkcmVuICYmIChvLT5zdHlsZSgpLT5wYWRk
aW5nTGVmdCgpLmlzUGVyY2VudCgpIHx8IG8tPnN0eWxlKCktPnBhZGRpbmdSaWdodCgpLmlzUGVy
Y2VudCgpKSkKLSAgICAgICAgICAgICAgICAgICAgby0+c2V0UHJlZldpZHRoc0RpcnR5KHRydWUs
IGZhbHNlKTsKKyAgICAgICAgICAgICAgICBpZiAocmVsYXlvdXRDaGlsZHJlbiAmJiAoYm94LT5z
dHlsZSgpLT5wYWRkaW5nTGVmdCgpLmlzUGVyY2VudCgpIHx8IGJveC0+c3R5bGUoKS0+cGFkZGlu
Z1JpZ2h0KCkuaXNQZXJjZW50KCkpKQorICAgICAgICAgICAgICAgICAgICBib3gtPnNldFByZWZX
aWR0aHNEaXJ0eSh0cnVlLCBmYWxzZSk7CiAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICBp
ZiAoby0+aXNQb3NpdGlvbmVkKCkpCiAgICAgICAgICAgICAgICAgICAgIG8tPmNvbnRhaW5pbmdC
bG9jaygpLT5pbnNlcnRQb3NpdGlvbmVkT2JqZWN0KGJveCk7CkBAIC04NjUsNyArODg1LDggQEAg
dm9pZCBSZW5kZXJCbG9jazo6bGF5b3V0SW5saW5lQ2hpbGRyZW4oYgogICAgICAgICAgICAgICAg
ICAgICBlbHNlIGlmIChmdWxsTGF5b3V0IHx8IG8tPm5lZWRzTGF5b3V0KCkpIC8vIFJlcGxhY2Vk
IGVsZW1lbnRzCiAgICAgICAgICAgICAgICAgICAgICAgICB0b1JlbmRlckJveChvKS0+ZGlydHlM
aW5lQm94ZXMoZnVsbExheW91dCk7CiAKLSAgICAgICAgICAgICAgICAgICAgby0+bGF5b3V0SWZO
ZWVkZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFvLT5pc1JlcGxhY2VkKCkgfHwgIW8t
PmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG8tPmxh
eW91dElmTmVlZGVkKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlm
IChvLT5pc1RleHQoKSB8fCAoby0+aXNSZW5kZXJJbmxpbmUoKSAmJiAhZW5kT2ZJbmxpbmUpKSB7
CiAgICAgICAgICAgICAgICAgaGFzSW5saW5lQ2hpbGQgPSB0cnVlOwpAQCAtOTYwLDcgKzk4MSw3
IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmxheW91dElubGluZUNoaWxkcmVuKGIKICAgICAgICAgICAg
IGlzTGluZUVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgIAogICAgICAgICAgICAgRUNsZWFyIGNs
ZWFyID0gQ05PTkU7Ci0gICAgICAgICAgICBlbmQgPSBmaW5kTmV4dExpbmVCcmVhayhyZXNvbHZl
ciwgZmlyc3RMaW5lLCBpc0xpbmVFbXB0eSwgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5LCAmY2xl
YXIpOworICAgICAgICAgICAgZW5kID0gZmluZE5leHRMaW5lQnJlYWsocmVzb2x2ZXIsIGZpcnN0
TGluZSwgaXNMaW5lRW1wdHksIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSwgbWFyZ2luSW5mbywg
JmNsZWFyKTsKICAgICAgICAgICAgIGlmIChyZXNvbHZlci5wb3NpdGlvbigpLmF0RW5kKCkpIHsK
ICAgICAgICAgICAgICAgICByZXNvbHZlci5kZWxldGVSdW5zKCk7CiAgICAgICAgICAgICAgICAg
Y2hlY2tGb3JGbG9hdHNGcm9tTGFzdExpbmUgPSB0cnVlOwpAQCAtMTAzMCw2ICsxMDUxLDE0IEBA
IHZvaWQgUmVuZGVyQmxvY2s6OmxheW91dElubGluZUNoaWxkcmVuKGIKICAgICAgICAgICAgICAg
ICAgICAgaWYgKGxpbmVCb3gpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVCb3gtPnNl
dEVuZHNXaXRoQnJlYWsocHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KTsKIAorICAgICAgICAgICAg
ICAgICAgICAgICAgLy8gSWYgb3VyIHByZXZpb3VzIGxpbmUgd2FzIGFuIGFub255bW91cyBibG9j
ayBhbmQgd2UgYXJlIG5vdCBhbiBhbm9ueW1vdXMgYmxvY2ssIHNpbXVsYXRlIGEgbWFyZ2luIGNv
bGxhcHNlIG5vdyBzbyB0aGF0IHdlIGdldCB0aGUgcHJvcGVyCisgICAgICAgICAgICAgICAgICAg
ICAgICAvLyBpbmNyZWFzZWQgaGVpZ2h0LiAgV2UgYWxzbyBoYXZlIHRvIHNpbXVsYXRlIGEgbWFy
Z2luIGNvbGxhcHNlIHRvIHByb3BhZ2F0ZSBtYXJnaW5zIHRocm91Z2ggdG8gdGhlIHRvcCBvZiBv
dXIgYmxvY2suCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxpbmVCb3gtPmFub255bW91
c0lubGluZUJsb2NrKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxpbmVC
b3gtPnByZXZSb290Qm94KCkgfHwgbGluZUJveC0+cHJldlJvb3RCb3goKS0+YW5vbnltb3VzSW5s
aW5lQmxvY2soKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2VNYXJn
aW5zKDAsIG1hcmdpbkluZm8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbklu
Zm8uc2V0QXRUb3BPZkJsb2NrKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKwog
ICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm93IHdlIHBvc2l0aW9uIGFsbCBvZiBvdXIgdGV4
dCBydW5zIGhvcml6b250YWxseS4KICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVIb3Jp
em9udGFsUG9zaXRpb25zRm9yTGluZShsaW5lQm94LCBmaXJzdExpbmUsIHJlc29sdmVyLmZpcnN0
UnVuKCksIHRyYWlsaW5nU3BhY2VSdW4sIGVuZC5hdEVuZCgpKTsKIApAQCAtMTE2MSw4ICsxMTkw
LDE0IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmxheW91dElubGluZUNoaWxkcmVuKGIKICAgICAgICAg
fQogICAgIH0KIAotICAgIC8vIE5vdyBhZGQgaW4gdGhlIGJvdHRvbSBib3JkZXIvcGFkZGluZy4K
LSAgICBzZXRIZWlnaHQoaGVpZ2h0KCkgKyB0b0FkZCk7CisgICAgLy8gTm93IGRvIHRoZSBoYW5k
bGluZyBvZiB0aGUgYm90dG9tIG9mIHRoZSBibG9jaywgYWRkaW5nIGluIG91ciBib3R0b20gYm9y
ZGVyL3BhZGRpbmcgYW5kCisgICAgLy8gZGV0ZXJtaW5pbmcgdGhlIGNvcnJlY3QgY29sbGFwc2Vk
IGJvdHRvbSBtYXJnaW4gaW5mb3JtYXRpb24uICBUaGlzIGNvbGxhcHNlIGlzIG9ubHkgbmVjZXNz
YXJ5CisgICAgLy8gaWYgb3VyIGxhc3QgY2hpbGQgd2FzIGFuIGFub255bW91cyBpbmxpbmUgYmxv
Y2sgdGhhdCBtaWdodCBuZWVkIHRvIHByb3BhZ2F0ZSBtYXJnaW4gaW5mb3JtYXRpb24gb3V0IHRv
CisgICAgLy8gdXMuCisgICAgaWYgKGxhc3RSb290Qm94KCkgJiYgbGFzdFJvb3RCb3goKS0+YW5v
bnltb3VzSW5saW5lQmxvY2soKSkKKyAgICAgICAgaGFuZGxlQm90dG9tT2ZCbG9jayh0b3AsIGJv
dHRvbSwgbWFyZ2luSW5mbyk7CisgICAgZWxzZQorICAgICAgICBzZXRIZWlnaHQoaGVpZ2h0KCkg
KyBib3R0b20pOwogCiAgICAgaWYgKCFmaXJzdExpbmVCb3goKSAmJiBoYXNMaW5lSWZFbXB0eSgp
KQogICAgICAgICBzZXRIZWlnaHQoaGVpZ2h0KCkgKyBsaW5lSGVpZ2h0KHRydWUsIHRydWUpKTsK
QEAgLTExODMsNiArMTIxOCwxMiBAQCBSb290SW5saW5lQm94KiBSZW5kZXJCbG9jazo6ZGV0ZXJt
aW5lU3RhCiAgICAgaWYgKCFmdWxsTGF5b3V0KSB7CiAgICAgICAgIHNpemVfdCBmbG9hdEluZGV4
ID0gMDsKICAgICAgICAgZm9yIChjdXJyID0gZmlyc3RSb290Qm94KCk7IGN1cnIgJiYgIWN1cnIt
PmlzRGlydHkoKTsgY3VyciA9IGN1cnItPm5leHRSb290Qm94KCkpIHsKKyAgICAgICAgICAgIGlm
IChjdXJyLT5hbm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CisgICAgICAgICAgICAgICAgLy8gRklY
TUU6IFdlIGhhdmUgdG8gZG8gYmV0dGVyIHRoYW4gdGhpcyBvciB3ZSB3aWxsIHJlcGFpbnQgdG9v
IG11Y2ggYXMgY29udGVudCBpbnNpZGUgYW4KKyAgICAgICAgICAgICAgICAvLyBhbm9ueW1vdXMg
aW5saW5lIGJsb2NrIGNvbWVzIGluLgorICAgICAgICAgICAgICAgIGZ1bGxMYXlvdXQgPSB0cnVl
OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYg
KFZlY3RvcjxSZW5kZXJCb3gqPiogY2xlYW5MaW5lRmxvYXRzID0gY3Vyci0+ZmxvYXRzUHRyKCkp
IHsKICAgICAgICAgICAgICAgICBWZWN0b3I8UmVuZGVyQm94Kj46Oml0ZXJhdG9yIGVuZCA9IGNs
ZWFuTGluZUZsb2F0cy0+ZW5kKCk7CiAgICAgICAgICAgICAgICAgZm9yIChWZWN0b3I8UmVuZGVy
Qm94Kj46Oml0ZXJhdG9yIG8gPSBjbGVhbkxpbmVGbG9hdHMtPmJlZ2luKCk7IG8gIT0gZW5kOyAr
K28pIHsKQEAgLTE1OTcsNyArMTYzOCw3IEBAIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgdGV4dFdp
ZHRoKFJlbmRlclQKIH0KIAogSW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6OmZpbmROZXh0TGlu
ZUJyZWFrKElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIsIGJvb2wgZmlyc3RMaW5lLCAgYm9v
bCYgaXNMaW5lRW1wdHksIGJvb2wmIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSwgCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUNsZWFyKiBjbGVhcikKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXJnaW5JbmZvJiBt
YXJnaW5JbmZvLCBFQ2xlYXIqIGNsZWFyKQogewogICAgIEFTU0VSVChyZXNvbHZlci5wb3NpdGlv
bigpLmJsb2NrID09IHRoaXMpOwogCkBAIC0xNjM4LDYgKzE2NzksMTEgQEAgSW5saW5lSXRlcmF0
b3IgUmVuZGVyQmxvY2s6OmZpbmROZXh0TGluZQogICAgIGJvb2wgYXV0b1dyYXBXYXNFdmVyVHJ1
ZU9uTGluZSA9IGZhbHNlOwogICAgIGJvb2wgZmxvYXRzRml0T25MaW5lID0gdHJ1ZTsKICAgICAK
KyAgICBib29sIGlzQmxvY2tJbnNpZGVJbmxpbmUgPSBmYWxzZTsKKyAgICAKKyAgICBpbnQgcHJl
dmlvdXNCbG9ja0Zsb2F0Qm90dG9tID0gMDsKKyAgICBpbnQgbWF4QmxvY2tGbG9hdEJvdHRvbSA9
IDA7CisKICAgICAvLyBGaXJlZm94IGFuZCBPcGVyYSB3aWxsIGFsbG93IGEgdGFibGUgY2VsbCB0
byBncm93IHRvIGZpdCBhbiBpbWFnZSBpbnNpZGUgaXQgdW5kZXIKICAgICAvLyB2ZXJ5IHNwZWNp
ZmljIGNpcmN1bXN0YW5jZXMgKGluIG9yZGVyIHRvIG1hdGNoIGNvbW1vbiBXaW5JRSByZW5kZXJp
bmdzKS4gCiAgICAgLy8gTm90IHN1cHBvcnRpbmcgdGhlIHF1aXJrIGhhcyBjYXVzZWQgdXMgdG8g
bWlzLXJlbmRlciBzb21lIHJlYWwgc2l0ZXMuIChTZWUgQnVnemlsbGEgMTA1MTcuKSAKQEAgLTE2
NDgsNyArMTY5NCw4IEBAIElubGluZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpmaW5kTmV4dExpbmUK
ICAgICB3aGlsZSAobykgewogICAgICAgICBjdXJyV1MgPSBvLT5pc1JlcGxhY2VkKCkgPyBvLT5w
YXJlbnQoKS0+c3R5bGUoKS0+d2hpdGVTcGFjZSgpIDogby0+c3R5bGUoKS0+d2hpdGVTcGFjZSgp
OwogICAgICAgICBsYXN0V1MgPSBsYXN0LT5pc1JlcGxhY2VkKCkgPyBsYXN0LT5wYXJlbnQoKS0+
c3R5bGUoKS0+d2hpdGVTcGFjZSgpIDogbGFzdC0+c3R5bGUoKS0+d2hpdGVTcGFjZSgpOwotICAg
ICAgICAKKyAgICAgICAgaXNCbG9ja0luc2lkZUlubGluZSA9IG8tPmlzQW5vbnltb3VzSW5saW5l
QmxvY2soKTsKKwogICAgICAgICBib29sIGF1dG9XcmFwID0gUmVuZGVyU3R5bGU6OmF1dG9XcmFw
KGN1cnJXUyk7CiAgICAgICAgIGF1dG9XcmFwV2FzRXZlclRydWVPbkxpbmUgPSBhdXRvV3JhcFdh
c0V2ZXJUcnVlT25MaW5lIHx8IGF1dG9XcmFwOwogCkBAIC0xNjU5LDcgKzE3MDYsNyBAQCBJbmxp
bmVJdGVyYXRvciBSZW5kZXJCbG9jazo6ZmluZE5leHRMaW5lCiAjZW5kaWYKIAogICAgICAgICBi
b29sIGNvbGxhcHNlV2hpdGVTcGFjZSA9IFJlbmRlclN0eWxlOjpjb2xsYXBzZVdoaXRlU3BhY2Uo
Y3VycldTKTsKLSAgICAgICAgICAgIAorCiAgICAgICAgIGlmIChvLT5pc0JSKCkpIHsKICAgICAg
ICAgICAgIGlmICh3ICsgdG1wVyA8PSB3aWR0aCkgewogICAgICAgICAgICAgICAgIGxCcmVhay5v
YmogPSBvOwpAQCAtMTc2Niw4ICsxODEzLDkgQEAgSW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6
OmZpbmROZXh0TGluZQogICAgICAgICB9IGVsc2UgaWYgKG8tPmlzUmVwbGFjZWQoKSkgewogICAg
ICAgICAgICAgUmVuZGVyQm94KiByZXBsYWNlZEJveCA9IHRvUmVuZGVyQm94KG8pOwogCi0gICAg
ICAgICAgICAvLyBCcmVhayBvbiByZXBsYWNlZCBlbGVtZW50cyBpZiBlaXRoZXIgaGFzIG5vcm1h
bCB3aGl0ZS1zcGFjZS4KLSAgICAgICAgICAgIGlmICgoYXV0b1dyYXAgfHwgUmVuZGVyU3R5bGU6
OmF1dG9XcmFwKGxhc3RXUykpICYmICghby0+aXNJbWFnZSgpIHx8IGFsbG93SW1hZ2VzVG9CcmVh
aykpIHsKKyAgICAgICAgICAgIC8vIEJyZWFrIG9uIHJlcGxhY2VkIGVsZW1lbnRzIGlmIGVpdGhl
ciBoYXMgbm9ybWFsIHdoaXRlLXNwYWNlLiAgV2UgYWxzbyBhbHdheXMgYnJlYWsgaWYgd2UKKyAg
ICAgICAgICAgIC8vIGVuY291bnRlciBhIHNwZWNpYWwgYW5vbnltb3VzIGlubGluZSBibG9jayAo
dXNlZCB0byBob2xkIGJsb2NrcyBpbnNpZGUgaW5saW5lcykuCisgICAgICAgICAgICBpZiAoKGF1
dG9XcmFwIHx8IFJlbmRlclN0eWxlOjphdXRvV3JhcChsYXN0V1MpIHx8IGlzQmxvY2tJbnNpZGVJ
bmxpbmUpICAmJiAoIW8tPmlzSW1hZ2UoKSB8fCBhbGxvd0ltYWdlc1RvQnJlYWspKSB7CiAgICAg
ICAgICAgICAgICAgdyArPSB0bXBXOwogICAgICAgICAgICAgICAgIHRtcFcgPSAwOwogICAgICAg
ICAgICAgICAgIGxCcmVhay5vYmogPSBvOwpAQCAtMTc3NSw2ICsxODIzLDE5IEBAIElubGluZUl0
ZXJhdG9yIFJlbmRlckJsb2NrOjpmaW5kTmV4dExpbmUKICAgICAgICAgICAgICAgICBsQnJlYWsu
bmV4dEJyZWFrYWJsZVBvc2l0aW9uID0gLTE7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAg
IGlmIChpc0Jsb2NrSW5zaWRlSW5saW5lKSB7CisgICAgICAgICAgICAgICAgaWYgKCFpc0xpbmVF
bXB0eSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBlbmQ7CisKKyAgICAgICAgICAgICAgICAv
LyBSZXNldCB0aGUgd2lkdGggdG8gaWdub3JlIGZsb2F0cywgc2luY2Ugd2UncmUgZ29pbmcgdG8g
YWxsb3cgdGhlbSB0byBpbnRydWRlIGludG8gb3VyIHNwYWNlLgorICAgICAgICAgICAgICAgIHdp
ZHRoID0gcmlnaHRPZmZzZXQoKSAtIGxlZnRPZmZzZXQoKTsKKworICAgICAgICAgICAgICAgIC8v
IEZJWE1FOiBUaGlzIGNhbGwgd2lsbCB1cGRhdGUgdGhlIGhlaWdodCBvZiBvdXIgYmxvY2suICBJ
dCdzIG5vdCBjbGVhciBpZiB0aGF0J3MgZ29pbmcgdG8gYmUgb2sgb3Igbm90IHlldC4KKyAgICAg
ICAgICAgICAgICBsYXlvdXRCbG9ja0NoaWxkKHJlcGxhY2VkQm94LCBtYXJnaW5JbmZvLCBwcmV2
aW91c0Jsb2NrRmxvYXRCb3R0b20sIG1heEJsb2NrRmxvYXRCb3R0b20pOworCisgICAgICAgICAg
ICAgICAgbGluZU1pZHBvaW50U3RhdGUuYmV0d2Vlbk1pZHBvaW50cyA9IGZhbHNlOworICAgICAg
ICAgICAgfQorCiAgICAgICAgICAgICBpZiAoaWdub3JpbmdTcGFjZXMpCiAgICAgICAgICAgICAg
ICAgYWRkTWlkcG9pbnQobGluZU1pZHBvaW50U3RhdGUsIElubGluZUl0ZXJhdG9yKDAsIG8sIDAp
KTsKIApAQCAtMTc5OCw2ICsxODU5LDE1IEBAIElubGluZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpm
aW5kTmV4dExpbmUKICAgICAgICAgICAgICAgICAgICAgdG1wVyArPSByZXBsYWNlZEJveC0+d2lk
dGgoKSArIHJlcGxhY2VkQm94LT5tYXJnaW5MZWZ0KCkgKyByZXBsYWNlZEJveC0+bWFyZ2luUmln
aHQoKSArIGlubGluZVdpZHRoKG8pOwogICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAg
ICAgdG1wVyArPSByZXBsYWNlZEJveC0+d2lkdGgoKSArIHJlcGxhY2VkQm94LT5tYXJnaW5MZWZ0
KCkgKyByZXBsYWNlZEJveC0+bWFyZ2luUmlnaHQoKSArIGlubGluZVdpZHRoKG8pOworICAgICAg
ICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGlzQmxvY2tJbnNpZGVJbmxpbmUpIHsKKyAgICAg
ICAgICAgICAgICB3ICs9IHRtcFc7CisgICAgICAgICAgICAgICAgdG1wVyA9IDA7CisgICAgICAg
ICAgICAgICAgbEJyZWFrLm9iaiA9IG87CisgICAgICAgICAgICAgICAgbEJyZWFrLnBvcyA9IDA7
CisgICAgICAgICAgICAgICAgbEJyZWFrLm5leHRCcmVha2FibGVQb3NpdGlvbiA9IC0xOworICAg
ICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYg
KG8tPmlzVGV4dCgpKSB7CiAgICAgICAgICAgICBpZiAoIXBvcykKICAgICAgICAgICAgICAgICBh
cHBsaWVkU3RhcnRXaWR0aCA9IGZhbHNlOwpAQCAtMjE5MSw3ICsyMjYxLDcgQEAgSW5saW5lSXRl
cmF0b3IgUmVuZGVyQmxvY2s6OmZpbmROZXh0TGluZQogICAgICAgICB9CiAgICAgICAgIC8vZWxz
ZSBpZiAobEJyZWFrLnBvcyA+IDApCiAgICAgICAgIC8vICAgIGxCcmVhay5wb3MtLTsKLSAgICAg
ICAgZWxzZSBpZiAobEJyZWFrLm9iaiA9PSAwICYmIHRyYWlsaW5nU3BhY2VPYmplY3QtPmlzVGV4
dCgpKSB7CisgICAgICAgIGVsc2UgaWYgKCghbEJyZWFrLm9iaiB8fCBsQnJlYWsub2JqLT5pc0Fu
b255bW91c0lubGluZUJsb2NrKCkpICYmIHRyYWlsaW5nU3BhY2VPYmplY3QtPmlzVGV4dCgpKSB7
CiAgICAgICAgICAgICAvLyBBZGQgYSBuZXcgZW5kIG1pZHBvaW50IHRoYXQgc3RvcHMgcmlnaHQg
YXQgdGhlIHZlcnkgZW5kLgogICAgICAgICAgICAgUmVuZGVyVGV4dCogdGV4dCA9IHRvUmVuZGVy
VGV4dCh0cmFpbGluZ1NwYWNlT2JqZWN0KTsKICAgICAgICAgICAgIHVuc2lnbmVkIGxlbmd0aCA9
IHRleHQtPnRleHRMZW5ndGgoKTsKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJveC5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQm94LmNwcAkocmV2aXNp
b24gNTQ1MDEpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCb3guY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0xMzM0LDcgKzEzMzQsNyBAQCB2b2lkIFJlbmRlckJveDo6Y2FsY1dpZHRoKCkKICAg
ICB9CiAKICAgICBpZiAoY29udGFpbmVyV2lkdGggJiYgY29udGFpbmVyV2lkdGggIT0gKHdpZHRo
KCkgKyBtX21hcmdpbkxlZnQgKyBtX21hcmdpblJpZ2h0KQotICAgICAgICAgICAgJiYgIWlzRmxv
YXRpbmcoKSAmJiAhaXNJbmxpbmUoKSAmJiAhY2ItPmlzRmxleGlibGVCb3goKSkgeworICAgICAg
ICAgICAgJiYgIWlzRmxvYXRpbmcoKSAmJiAoIWlzSW5saW5lKCkgfHwgaXNBbm9ueW1vdXNJbmxp
bmVCbG9jaygpKSAmJiAhY2ItPmlzRmxleGlibGVCb3goKSkgewogICAgICAgICBpZiAoY2ItPnN0
eWxlKCktPmRpcmVjdGlvbigpID09IExUUikKICAgICAgICAgICAgIG1fbWFyZ2luUmlnaHQgPSBj
b250YWluZXJXaWR0aCAtIHdpZHRoKCkgLSBtX21hcmdpbkxlZnQ7CiAgICAgICAgIGVsc2UKQEAg
LTEzNzMsNyArMTM3Myw3IEBAIGJvb2wgUmVuZGVyQm94OjpzaXplc1RvSW50cmluc2ljV2lkdGgo
V2kKIHsKICAgICAvLyBNYXJxdWVlcyBpbiBXaW5JRSBhcmUgbGlrZSBhIG1peHR1cmUgb2YgYmxv
Y2tzIGFuZCBpbmxpbmUtYmxvY2tzLiAgVGhleSBzaXplIGFzIHRob3VnaCB0aGV5J3JlIGJsb2Nr
cywKICAgICAvLyBidXQgdGhleSBhbGxvdyB0ZXh0IHRvIHNpdCBvbiB0aGUgc2FtZSBsaW5lIGFz
IHRoZSBtYXJxdWVlLgotICAgIGlmIChpc0Zsb2F0aW5nKCkgfHwgKGlzSW5saW5lQmxvY2tPcklu
bGluZVRhYmxlKCkgJiYgIWlzSFRNTE1hcnF1ZWUoKSkpCisgICAgaWYgKGlzRmxvYXRpbmcoKSB8
fCAoaXNJbmxpbmVCbG9ja09ySW5saW5lVGFibGUoKSAmJiAhaXNIVE1MTWFycXVlZSgpICYmICFp
c0Fub255bW91c0lubGluZUJsb2NrKCkpKQogICAgICAgICByZXR1cm4gdHJ1ZTsKIAogICAgIC8v
IFRoaXMgY29kZSBtYXkgbG9vayBhIGJpdCBzdHJhbmdlLiAgQmFzaWNhbGx5IHdpZHRoOmludHJp
bnNpYyBzaG91bGQgY2xhbXAgdGhlIHNpemUgd2hlbiB0ZXN0aW5nIGJvdGgKQEAgLTI4MTksNyAr
MjgxOSw3IEBAIGJvb2wgUmVuZGVyQm94OjpzaHJpbmtUb0F2b2lkRmxvYXRzKCkgY28KIAogYm9v
bCBSZW5kZXJCb3g6OmF2b2lkc0Zsb2F0cygpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIGlzUmVwbGFj
ZWQoKSB8fCBoYXNPdmVyZmxvd0NsaXAoKSB8fCBpc0hSKCk7CisgICAgcmV0dXJuICFpc0Fub255
bW91c0lubGluZUJsb2NrKCkgJiYgKGlzUmVwbGFjZWQoKSB8fCBoYXNPdmVyZmxvd0NsaXAoKSB8
fCBpc0hSKCkpOwogfQogCiB2b2lkIFJlbmRlckJveDo6YWRkU2hhZG93T3ZlcmZsb3coKQpJbmRl
eDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVySW5saW5lLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL3JlbmRlcmluZy9SZW5kZXJJbmxpbmUuY3BwCShyZXZpc2lvbiA1NDUwMSkKKysrIFdlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlcklubGluZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ0LDcgKzQ0
LDYgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogCiBSZW5kZXJJbmxpbmU6OlJlbmRlcklubGluZShO
b2RlKiBub2RlKQogICAgIDogUmVuZGVyQm94TW9kZWxPYmplY3Qobm9kZSkKLSAgICAsIG1fY29u
dGludWF0aW9uKDApCiAgICAgLCBtX2xpbmVIZWlnaHQoLTEpCiAgICAgLCBtX3ZlcnRpY2FsUG9z
aXRpb24oUG9zaXRpb25VbmRlZmluZWQpCiB7CkBAIC01NiwxNCArNTUsNiBAQCB2b2lkIFJlbmRl
cklubGluZTo6ZGVzdHJveSgpCiAgICAgLy8gTWFrZSBzdXJlIHRvIGRlc3Ryb3kgYW5vbnltb3Vz
IGNoaWxkcmVuIGZpcnN0IHdoaWxlIHRoZXkgYXJlIHN0aWxsIGNvbm5lY3RlZCB0byB0aGUgcmVz
dCBvZiB0aGUgdHJlZSwgc28gdGhhdCB0aGV5IHdpbGwKICAgICAvLyBwcm9wZXJseSBkaXJ0eSBs
aW5lIGJveGVzIHRoYXQgdGhleSBhcmUgcmVtb3ZlZCBmcm9tLiAgRWZmZWN0cyB0aGF0IGRvIDpi
ZWZvcmUvOmFmdGVyIG9ubHkgb24gaG92ZXIgY291bGQgY3Jhc2ggb3RoZXJ3aXNlLgogICAgIGNo
aWxkcmVuKCktPmRlc3Ryb3lMZWZ0b3ZlckNoaWxkcmVuKCk7Ci0KLSAgICAvLyBEZXN0cm95IG91
ciBjb250aW51YXRpb24gYmVmb3JlIGFueXRoaW5nIG90aGVyIHRoYW4gYW5vbnltb3VzIGNoaWxk
cmVuLgotICAgIC8vIFRoZSByZWFzb24gd2UgZG9uJ3QgZGVzdHJveSBpdCBiZWZvcmUgYW5vbnlt
b3VzIGNoaWxkcmVuIGlzIHRoYXQgdGhleSBtYXkKLSAgICAvLyBoYXZlIGNvbnRpbnVhdGlvbnMg
b2YgdGhlaXIgb3duIHRoYXQgYXJlIGFub255bW91cyBjaGlsZHJlbiBvZiBvdXIgY29udGludWF0
aW9uLgotICAgIGlmIChtX2NvbnRpbnVhdGlvbikgewotICAgICAgICBtX2NvbnRpbnVhdGlvbi0+
ZGVzdHJveSgpOwotICAgICAgICBtX2NvbnRpbnVhdGlvbiA9IDA7Ci0gICAgfQogICAgIAogICAg
IGlmICghZG9jdW1lbnRCZWluZ0Rlc3Ryb3llZCgpKSB7CiAgICAgICAgIGlmIChmaXJzdExpbmVC
b3goKSkgewpAQCAtOTIsMTMgKzgzLDYgQEAgdm9pZCBSZW5kZXJJbmxpbmU6OmRlc3Ryb3koKQog
ICAgIFJlbmRlckJveE1vZGVsT2JqZWN0OjpkZXN0cm95KCk7CiB9CiAKLVJlbmRlcklubGluZSog
UmVuZGVySW5saW5lOjppbmxpbmVDb250aW51YXRpb24oKSBjb25zdAotewotICAgIGlmICghbV9j
b250aW51YXRpb24gfHwgbV9jb250aW51YXRpb24tPmlzSW5saW5lKCkpCi0gICAgICAgIHJldHVy
biB0b1JlbmRlcklubGluZShtX2NvbnRpbnVhdGlvbik7Ci0gICAgcmV0dXJuIHRvUmVuZGVyQmxv
Y2sobV9jb250aW51YXRpb24pLT5pbmxpbmVDb250aW51YXRpb24oKTsKLX0KLQogdm9pZCBSZW5k
ZXJJbmxpbmU6OnVwZGF0ZUJveE1vZGVsSW5mb0Zyb21TdHlsZSgpCiB7CiAgICAgUmVuZGVyQm94
TW9kZWxPYmplY3Q6OnVwZGF0ZUJveE1vZGVsSW5mb0Zyb21TdHlsZSgpOwpAQCAtMTE0LDE5ICs5
OCw2IEBAIHZvaWQgUmVuZGVySW5saW5lOjpzdHlsZURpZENoYW5nZShTdHlsZUQKIHsKICAgICBS
ZW5kZXJCb3hNb2RlbE9iamVjdDo6c3R5bGVEaWRDaGFuZ2UoZGlmZiwgb2xkU3R5bGUpOwogCi0g
ICAgLy8gRW5zdXJlIHRoYXQgYWxsIG9mIHRoZSBzcGxpdCBpbmxpbmVzIHBpY2sgdXAgdGhlIG5l
dyBzdHlsZS4gV2UKLSAgICAvLyBvbmx5IGRvIHRoaXMgaWYgd2UncmUgYW4gaW5saW5lLCBzaW5j
ZSB3ZSBkb24ndCB3YW50IHRvIHByb3BhZ2F0ZQotICAgIC8vIGEgYmxvY2sncyBzdHlsZSB0byB0
aGUgb3RoZXIgaW5saW5lcy4KLSAgICAvLyBlLmcuLCA8Zm9udD5mb28gPGg0PmdvbzwvaDQ+IG1v
bzwvZm9udD4uICBUaGUgPGZvbnQ+IGlubGluZXMgYmVmb3JlCi0gICAgLy8gYW5kIGFmdGVyIHRo
ZSBibG9jayBzaGFyZSB0aGUgc2FtZSBzdHlsZSwgYnV0IHRoZSBibG9jayBkb2Vzbid0Ci0gICAg
Ly8gbmVlZCB0byBwYXNzIGl0cyBzdHlsZSBvbiB0byBhbnlvbmUgZWxzZS4KLSAgICBmb3IgKFJl
bmRlcklubGluZSogY3VyckNvbnQgPSBpbmxpbmVDb250aW51YXRpb24oKTsgY3VyckNvbnQ7IGN1
cnJDb250ID0gY3VyckNvbnQtPmlubGluZUNvbnRpbnVhdGlvbigpKSB7Ci0gICAgICAgIFJlbmRl
ckJveE1vZGVsT2JqZWN0KiBuZXh0Q29udCA9IGN1cnJDb250LT5jb250aW51YXRpb24oKTsKLSAg
ICAgICAgY3VyckNvbnQtPnNldENvbnRpbnVhdGlvbigwKTsKLSAgICAgICAgY3VyckNvbnQtPnNl
dFN0eWxlKHN0eWxlKCkpOwotICAgICAgICBjdXJyQ29udC0+c2V0Q29udGludWF0aW9uKG5leHRD
b250KTsKLSAgICB9Ci0KICAgICBtX2xpbmVIZWlnaHQgPSAtMTsKIAogICAgIC8vIFVwZGF0ZSBw
c2V1ZG9zIGZvciA6YmVmb3JlIGFuZCA6YWZ0ZXIgbm93LgpAQCAtMTM2LDc5ICsxMDcsNzMgQEAg
dm9pZCBSZW5kZXJJbmxpbmU6OnN0eWxlRGlkQ2hhbmdlKFN0eWxlRAogICAgIH0KIH0KIAotdm9p
ZCBSZW5kZXJJbmxpbmU6OmFkZENoaWxkKFJlbmRlck9iamVjdCogbmV3Q2hpbGQsIFJlbmRlck9i
amVjdCogYmVmb3JlQ2hpbGQpCi17Ci0gICAgaWYgKGNvbnRpbnVhdGlvbigpKQotICAgICAgICBy
ZXR1cm4gYWRkQ2hpbGRUb0NvbnRpbnVhdGlvbihuZXdDaGlsZCwgYmVmb3JlQ2hpbGQpOwotICAg
IHJldHVybiBhZGRDaGlsZElnbm9yaW5nQ29udGludWF0aW9uKG5ld0NoaWxkLCBiZWZvcmVDaGls
ZCk7Ci19Ci0KLXN0YXRpYyBSZW5kZXJCb3hNb2RlbE9iamVjdCogbmV4dENvbnRpbnVhdGlvbihS
ZW5kZXJPYmplY3QqIHJlbmRlcmVyKQordm9pZCBSZW5kZXJJbmxpbmU6OmNoaWxkQmVjYW1lTm9u
SW5saW5lKFJlbmRlck9iamVjdCogY2hpbGQpCiB7Ci0gICAgaWYgKHJlbmRlcmVyLT5pc0lubGlu
ZSgpICYmICFyZW5kZXJlci0+aXNSZXBsYWNlZCgpKQotICAgICAgICByZXR1cm4gdG9SZW5kZXJJ
bmxpbmUocmVuZGVyZXIpLT5jb250aW51YXRpb24oKTsKLSAgICByZXR1cm4gdG9SZW5kZXJCbG9j
ayhyZW5kZXJlciktPmlubGluZUNvbnRpbnVhdGlvbigpOworICAgIFJlbmRlck9iamVjdCogbmV4
dCA9IGNoaWxkLT5uZXh0U2libGluZygpOworICAgIHJlbW92ZUNoaWxkKGNoaWxkKTsKKyAgICBh
ZGRDaGlsZChjaGlsZCwgbmV4dCk7CiB9CiAKLVJlbmRlckJveE1vZGVsT2JqZWN0KiBSZW5kZXJJ
bmxpbmU6OmNvbnRpbnVhdGlvbkJlZm9yZShSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkKQotewot
ICAgIGlmIChiZWZvcmVDaGlsZCAmJiBiZWZvcmVDaGlsZC0+cGFyZW50KCkgPT0gdGhpcykKLSAg
ICAgICAgcmV0dXJuIHRoaXM7Ci0KLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogY3VyciA9IG5l
eHRDb250aW51YXRpb24odGhpcyk7Ci0gICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIG5leHRUb0xh
c3QgPSB0aGlzOwotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBsYXN0ID0gdGhpczsKLSAgICB3
aGlsZSAoY3VycikgewotICAgICAgICBpZiAoYmVmb3JlQ2hpbGQgJiYgYmVmb3JlQ2hpbGQtPnBh
cmVudCgpID09IGN1cnIpIHsKLSAgICAgICAgICAgIGlmIChjdXJyLT5maXJzdENoaWxkKCkgPT0g
YmVmb3JlQ2hpbGQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGxhc3Q7Ci0gICAgICAgICAgICBy
ZXR1cm4gY3VycjsKLSAgICAgICAgfQotCi0gICAgICAgIG5leHRUb0xhc3QgPSBsYXN0OwotICAg
ICAgICBsYXN0ID0gY3VycjsKLSAgICAgICAgY3VyciA9IG5leHRDb250aW51YXRpb24oY3Vycik7
Ci0gICAgfQotCi0gICAgaWYgKCFiZWZvcmVDaGlsZCAmJiAhbGFzdC0+Zmlyc3RDaGlsZCgpKQot
ICAgICAgICByZXR1cm4gbmV4dFRvTGFzdDsKLSAgICByZXR1cm4gbGFzdDsKLX0KLQotdm9pZCBS
ZW5kZXJJbmxpbmU6OmFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24oUmVuZGVyT2JqZWN0KiBu
ZXdDaGlsZCwgUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCkKK3ZvaWQgUmVuZGVySW5saW5lOjph
ZGRDaGlsZChSZW5kZXJPYmplY3QqIG5ld0NoaWxkLCBSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxk
KQogewogICAgIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBhcHBlbmQgdGhpbmdzIGFmdGVyIDphZnRl
ci1nZW5lcmF0ZWQgY29udGVudCBpZiB3ZSBoYXZlIGl0LgogICAgIGlmICghYmVmb3JlQ2hpbGQg
JiYgaXNBZnRlckNvbnRlbnQobGFzdENoaWxkKCkpKQogICAgICAgICBiZWZvcmVDaGlsZCA9IGxh
c3RDaGlsZCgpOwogCi0gICAgaWYgKCFuZXdDaGlsZC0+aXNJbmxpbmUoKSAmJiAhbmV3Q2hpbGQt
PmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSkgewotICAgICAgICAvLyBXZSBhcmUgcGxhY2luZyBh
IGJsb2NrIGluc2lkZSBhbiBpbmxpbmUuIFdlIGhhdmUgdG8gcGVyZm9ybSBhIHNwbGl0IG9mIHRo
aXMKLSAgICAgICAgLy8gaW5saW5lIGludG8gY29udGludWF0aW9ucy4gIFRoaXMgaW52b2x2ZXMg
Y3JlYXRpbmcgYW4gYW5vbnltb3VzIGJsb2NrIGJveCB0byBob2xkCi0gICAgICAgIC8vIHxuZXdD
aGlsZHwuICBXZSB0aGVuIG1ha2UgdGhhdCBibG9jayBib3ggYSBjb250aW51YXRpb24gb2YgdGhp
cyBpbmxpbmUuICBXZSB0YWtlIGFsbCBvZgotICAgICAgICAvLyB0aGUgY2hpbGRyZW4gYWZ0ZXIg
fGJlZm9yZUNoaWxkfCBhbmQgcHV0IHRoZW0gaW4gYSBjbG9uZSBvZiB0aGlzIG9iamVjdC4KLSAg
ICAgICAgUmVmUHRyPFJlbmRlclN0eWxlPiBuZXdTdHlsZSA9IFJlbmRlclN0eWxlOjpjcmVhdGUo
KTsKLSAgICAgICAgbmV3U3R5bGUtPmluaGVyaXRGcm9tKHN0eWxlKCkpOwotICAgICAgICBuZXdT
dHlsZS0+c2V0RGlzcGxheShCTE9DSyk7Ci0KLSAgICAgICAgUmVuZGVyQmxvY2sqIG5ld0JveCA9
IG5ldyAocmVuZGVyQXJlbmEoKSkgUmVuZGVyQmxvY2soZG9jdW1lbnQoKSAvKiBhbm9ueW1vdXMg
Ym94ICovKTsKLSAgICAgICAgbmV3Qm94LT5zZXRTdHlsZShuZXdTdHlsZS5yZWxlYXNlKCkpOwot
ICAgICAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogb2xkQ29udGludWF0aW9uID0gY29udGludWF0
aW9uKCk7Ci0gICAgICAgIHNldENvbnRpbnVhdGlvbihuZXdCb3gpOwotCi0gICAgICAgIC8vIFNv
bWVvbmUgbWF5IGhhdmUgcHV0IGEgPHA+IGluc2lkZSBhIDxxPiwgY2F1c2luZyBhIHNwbGl0LiAg
V2hlbiB0aGlzIGhhcHBlbnMsIHRoZSA6YWZ0ZXIgY29udGVudAotICAgICAgICAvLyBoYXMgdG8g
bW92ZSBpbnRvIHRoZSBpbmxpbmUgY29udGludWF0aW9uLiAgQ2FsbCB1cGRhdGVCZWZvcmVBZnRl
ckNvbnRlbnQgdG8gZW5zdXJlIHRoYXQgb3VyIDphZnRlcgotICAgICAgICAvLyBjb250ZW50IGdl
dHMgcHJvcGVybHkgZGVzdHJveWVkLgotICAgICAgICBib29sIGlzTGFzdENoaWxkID0gKGJlZm9y
ZUNoaWxkID09IGxhc3RDaGlsZCgpKTsKLSAgICAgICAgaWYgKGRvY3VtZW50KCktPnVzZXNCZWZv
cmVBZnRlclJ1bGVzKCkpCi0gICAgICAgICAgICBjaGlsZHJlbigpLT51cGRhdGVCZWZvcmVBZnRl
ckNvbnRlbnQodGhpcywgQUZURVIpOwotICAgICAgICBpZiAoaXNMYXN0Q2hpbGQgJiYgYmVmb3Jl
Q2hpbGQgIT0gbGFzdENoaWxkKCkpCi0gICAgICAgICAgICBiZWZvcmVDaGlsZCA9IDA7IC8vIFdl
IGRlc3Ryb3llZCB0aGUgbGFzdCBjaGlsZCwgc28gbm93IHdlIG5lZWQgdG8gdXBkYXRlIG91ciBp
bnNlcnRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9pbnQgdG8gYmUgMC4g
IEl0J3MganVzdCBhIHN0cmFpZ2h0IGFwcGVuZCBub3cuCi0KLSAgICAgICAgc3BsaXRGbG93KGJl
Zm9yZUNoaWxkLCBuZXdCb3gsIG5ld0NoaWxkLCBvbGRDb250aW51YXRpb24pOworICAgIC8vIElm
IHRoZSByZXF1ZXN0ZWQgYmVmb3JlQ2hpbGQgaXMgbm90IG9uZSBvZiBvdXIgY2hpbGRyZW4sIHRo
ZW4gdGhpcyBpcyBtb3N0IGxpa2VseSBiZWNhdXNlCisgICAgLy8gdGhlcmUgaXMgYW4gYW5vbnlt
b3VzIGlubGluZS1ibG9jayBib3ggd2l0aGluIHRoaXMgb2JqZWN0IHRoYXQgY29udGFpbnMgdGhl
IGJlZm9yZUNoaWxkLiBTbworICAgIC8vIGp1c3QgaW5zZXJ0IHRoZSBjaGlsZCBpbnRvIHRoZSBh
bm9ueW1vdXMgaW5saW5lLWJsb2NrIGJveCBpbnN0ZWFkIG9mIGhlcmUuCisgICAgLy8gQSBzZWNv
bmQgcG9zc2liaWxpdHkgaXMgdGhhdCB0aGUgYmVmb3JlQ2hpbGQgaXMgYW4gYW5vbnltb3VzIGJs
b2NrIGluc2lkZSB0aGUgYW5vbnltb3VzIGlubGluZSBibG9jay4KKyAgICAvLyBUaGlzIGNhbiBo
YXBwZW4gaWYgaW5saW5lcyBhcmUgaW5zZXJ0ZWQgaW4gYmV0d2VlbiB0d28gb2YgdGhlIGFub255
bW91cyBpbmxpbmUgYmxvY2sncyBibG9jay1sZXZlbAorICAgIC8vIGNoaWxkcmVuIGFmdGVyIGl0
IGhhcyBiZWVuIGNyZWF0ZWQuCisgICAgaWYgKGJlZm9yZUNoaWxkICYmIGJlZm9yZUNoaWxkLT5w
YXJlbnQoKSAhPSB0aGlzKSB7CisgICAgICAgIEFTU0VSVChiZWZvcmVDaGlsZC0+cGFyZW50KCkp
OworICAgICAgICBBU1NFUlQoYmVmb3JlQ2hpbGQtPnBhcmVudCgpLT5pc0Fub255bW91c0lubGlu
ZUJsb2NrKCkgfHwgYmVmb3JlQ2hpbGQtPnBhcmVudCgpLT5pc0Fub255bW91c0Jsb2NrKCkpOwor
ICAgICAgICBpZiAoYmVmb3JlQ2hpbGQtPnBhcmVudCgpLT5pc0Fub255bW91c0lubGluZUJsb2Nr
KCkpIHsKKyAgICAgICAgICAgIGlmICghbmV3Q2hpbGQtPmlzSW5saW5lKCkgfHwgKG5ld0NoaWxk
LT5pc0lubGluZSgpICYmIGJlZm9yZUNoaWxkLT5wYXJlbnQoKS0+Zmlyc3RDaGlsZCgpICE9IGJl
Zm9yZUNoaWxkKSkKKyAgICAgICAgICAgICAgICBiZWZvcmVDaGlsZC0+cGFyZW50KCktPmFkZENo
aWxkKG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAg
ICAgICAgYWRkQ2hpbGQobmV3Q2hpbGQsIGJlZm9yZUNoaWxkLT5wYXJlbnQoKSk7CisgICAgICAg
IH0gZWxzZSBpZiAoYmVmb3JlQ2hpbGQtPnBhcmVudCgpLT5pc0Fub255bW91c0Jsb2NrKCkpIHsK
KyAgICAgICAgICAgIEFTU0VSVCghYmVmb3JlQ2hpbGQtPnBhcmVudCgpLT5wYXJlbnQoKSB8fCBi
ZWZvcmVDaGlsZC0+cGFyZW50KCktPnBhcmVudCgpLT5pc0Fub255bW91c0lubGluZUJsb2NrKCkp
OworICAgICAgICAgICAgQVNTRVJUKGJlZm9yZUNoaWxkLT5pc0lubGluZSgpKTsKKyAgICAgICAg
ICAgIGlmIChuZXdDaGlsZC0+aXNJbmxpbmUoKSB8fCAoIW5ld0NoaWxkLT5pc0lubGluZSgpICYm
IGJlZm9yZUNoaWxkLT5wYXJlbnQoKS0+Zmlyc3RDaGlsZCgpICE9IGJlZm9yZUNoaWxkKSkKKyAg
ICAgICAgICAgICAgICBiZWZvcmVDaGlsZC0+cGFyZW50KCktPmFkZENoaWxkKG5ld0NoaWxkLCBi
ZWZvcmVDaGlsZCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYWRkQ2hpbGQo
bmV3Q2hpbGQsIGJlZm9yZUNoaWxkLT5wYXJlbnQoKSk7CisgICAgICAgIH0KICAgICAgICAgcmV0
dXJuOwogICAgIH0KIAorICAgIGlmICghbmV3Q2hpbGQtPmlzSW5saW5lKCkpIHsKKyAgICAgICAg
Ly8gV2UgYXJlIHBsYWNpbmcgYSBibG9jayBpbnNpZGUgYW4gaW5saW5lLiBXZSBoYXZlIHRvIHBs
YWNlIHRoZSBibG9jayBpbnNpZGUgYW4gYW5vbnltb3VzIGlubGluZS1ibG9jay4KKyAgICAgICAg
Ly8gVGhpcyBpbmxpbmUtYmxvY2sgY2FuIGhvdXNlIGEgc2VxdWVuY2Ugb2YgY29udGlndW91cyBi
bG9jay1sZXZlbCBjaGlsZHJlbiwgYW5kIHRoZXkgd2lsbCBhbGwgc2l0IG9uIHRoZQorICAgICAg
ICAvLyBzYW1lIGxpbmUgdG9nZXRoZXIuICBXZSB0cnkgdG8gcmV1c2Ugb25lIGZpcnN0IGlmIHBv
c3NpYmxlLgorICAgICAgICBpZiAoYmVmb3JlQ2hpbGQpIHsKKyAgICAgICAgICAgIGlmIChiZWZv
cmVDaGlsZC0+cHJldmlvdXNTaWJsaW5nKCkgJiYgYmVmb3JlQ2hpbGQtPnByZXZpb3VzU2libGlu
ZygpLT5pc0Fub255bW91c0lubGluZUJsb2NrKCkpIHsKKyAgICAgICAgICAgICAgICBiZWZvcmVD
aGlsZC0+cHJldmlvdXNTaWJsaW5nKCktPmFkZENoaWxkKG5ld0NoaWxkKTsKKyAgICAgICAgICAg
ICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAg
ICBpZiAobGFzdENoaWxkKCkgJiYgbGFzdENoaWxkKCktPmlzQW5vbnltb3VzSW5saW5lQmxvY2so
KSkgeworICAgICAgICAgICAgICAgIGxhc3RDaGlsZCgpLT5hZGRDaGlsZChuZXdDaGlsZCk7Cisg
ICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgCisgICAg
ICAgIGlmICghbmV3Q2hpbGQtPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSkgeworICAgICAgICAg
ICAgLy8gVGhlcmUgd2FzIG5vIHN1aXRhYmxlIGV4aXN0aW5nIGFub255bW91cyBib3guICBDcmVh
dGUgYSBuZXcgb25lLgorICAgICAgICAgICAgUmVmUHRyPFJlbmRlclN0eWxlPiBuZXdTdHlsZSA9
IFJlbmRlclN0eWxlOjpjcmVhdGUoKTsKKyAgICAgICAgICAgIG5ld1N0eWxlLT5pbmhlcml0RnJv
bShzdHlsZSgpKTsKKyAgICAgICAgICAgIG5ld1N0eWxlLT5zZXREaXNwbGF5KElOTElORV9CTE9D
Syk7CisgICAgICAgICAgICBSZW5kZXJCbG9jayogbmV3Qm94ID0gbmV3IChyZW5kZXJBcmVuYSgp
KSBSZW5kZXJCbG9jayhkb2N1bWVudCgpKTsKKyAgICAgICAgICAgIG5ld0JveC0+c2V0U3R5bGUo
bmV3U3R5bGUpOworICAgICAgICAgICAgUmVuZGVyQm94TW9kZWxPYmplY3Q6OmFkZENoaWxkKG5l
d0JveCwgYmVmb3JlQ2hpbGQpOworICAgICAgICAgICAgbmV3Qm94LT5hZGRDaGlsZChuZXdDaGls
ZCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKICAgICBSZW5kZXJC
b3hNb2RlbE9iamVjdDo6YWRkQ2hpbGQobmV3Q2hpbGQsIGJlZm9yZUNoaWxkKTsKIAogICAgIG5l
d0NoaWxkLT5zZXROZWVkc0xheW91dEFuZFByZWZXaWR0aHNSZWNhbGMoKTsKQEAgLTIyMSwxODgg
KzE4Niw2IEBAIFJlbmRlcklubGluZSogUmVuZGVySW5saW5lOjpjbG9uZUlubGluZSgKICAgICBy
ZXR1cm4gbzsKIH0KIAotdm9pZCBSZW5kZXJJbmxpbmU6OnNwbGl0SW5saW5lcyhSZW5kZXJCbG9j
ayogZnJvbUJsb2NrLCBSZW5kZXJCbG9jayogdG9CbG9jaywKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgUmVuZGVyQmxvY2sqIG1pZGRsZUJsb2NrLAotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkLCBSZW5kZXJCb3hNb2RlbE9i
amVjdCogb2xkQ29udCkKLXsKLSAgICAvLyBDcmVhdGUgYSBjbG9uZSBvZiB0aGlzIGlubGluZS4K
LSAgICBSZW5kZXJJbmxpbmUqIGNsb25lID0gY2xvbmVJbmxpbmUodGhpcyk7Ci0gICAgY2xvbmUt
PnNldENvbnRpbnVhdGlvbihvbGRDb250KTsKLQotICAgIC8vIE5vdyB0YWtlIGFsbCBvZiB0aGUg
Y2hpbGRyZW4gZnJvbSBiZWZvcmVDaGlsZCB0byB0aGUgZW5kIGFuZCByZW1vdmUKLSAgICAvLyB0
aGVtIGZyb20gfHRoaXN8IGFuZCBwbGFjZSB0aGVtIGluIHRoZSBjbG9uZS4KLSAgICBSZW5kZXJP
YmplY3QqIG8gPSBiZWZvcmVDaGlsZDsKLSAgICB3aGlsZSAobykgewotICAgICAgICBSZW5kZXJP
YmplY3QqIHRtcCA9IG87Ci0gICAgICAgIG8gPSB0bXAtPm5leHRTaWJsaW5nKCk7Ci0gICAgICAg
IGNsb25lLT5hZGRDaGlsZElnbm9yaW5nQ29udGludWF0aW9uKGNoaWxkcmVuKCktPnJlbW92ZUNo
aWxkTm9kZSh0aGlzLCB0bXApLCAwKTsKLSAgICAgICAgdG1wLT5zZXROZWVkc0xheW91dEFuZFBy
ZWZXaWR0aHNSZWNhbGMoKTsKLSAgICB9Ci0KLSAgICAvLyBIb29rIHxjbG9uZXwgdXAgYXMgdGhl
IGNvbnRpbnVhdGlvbiBvZiB0aGUgbWlkZGxlIGJsb2NrLgotICAgIG1pZGRsZUJsb2NrLT5zZXRJ
bmxpbmVDb250aW51YXRpb24oY2xvbmUpOwotCi0gICAgLy8gV2UgaGF2ZSBiZWVuIHJlcGFyZW50
ZWQgYW5kIGFyZSBub3cgdW5kZXIgdGhlIGZyb21CbG9jay4gIFdlIG5lZWQKLSAgICAvLyB0byB3
YWxrIHVwIG91ciBpbmxpbmUgcGFyZW50IGNoYWluIHVudGlsIHdlIGhpdCB0aGUgY29udGFpbmlu
ZyBibG9jay4KLSAgICAvLyBPbmNlIHdlIGhpdCB0aGUgY29udGFpbmluZyBibG9jayB3ZSdyZSBk
b25lLgotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBjdXJyID0gdG9SZW5kZXJCb3hNb2RlbE9i
amVjdChwYXJlbnQoKSk7Ci0gICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGN1cnJDaGlsZCA9IHRo
aXM7Ci0gICAgCi0gICAgLy8gRklYTUU6IEJlY2F1c2Ugc3BsaXR0aW5nIGlzIE8obl4yKSBhcyB0
YWdzIG5lc3QgcGF0aG9sb2dpY2FsbHksIHdlIGNhcCB0aGUgZGVwdGggYXQgd2hpY2ggd2UncmUg
d2lsbGluZyB0byBjbG9uZS4KLSAgICAvLyBUaGVyZSB3aWxsIGV2ZW50dWFsbHkgYmUgYSBiZXR0
ZXIgYXBwcm9hY2ggdG8gdGhpcyBwcm9ibGVtIHRoYXQgd2lsbCBsZXQgdXMgbmVzdCB0byBhIG11
Y2gKLSAgICAvLyBncmVhdGVyIGRlcHRoIChzZWUgYnVnemlsbGEgYnVnIDEzNDMwKSBidXQgZm9y
IG5vdyB3ZSBoYXZlIGEgbGltaXQuICBUaGlzICp3aWxsKiByZXN1bHQgaW4KLSAgICAvLyBpbmNv
cnJlY3QgcmVuZGVyaW5nLCBidXQgdGhlIGFsdGVybmF0aXZlIGlzIHRvIGhhbmcgZm9yZXZlci4K
LSAgICB1bnNpZ25lZCBzcGxpdERlcHRoID0gMTsKLSAgICBjb25zdCB1bnNpZ25lZCBjTWF4U3Bs
aXREZXB0aCA9IDIwMDsgCi0gICAgd2hpbGUgKGN1cnIgJiYgY3VyciAhPSBmcm9tQmxvY2spIHsK
LSAgICAgICAgQVNTRVJUKGN1cnItPmlzUmVuZGVySW5saW5lKCkpOwotICAgICAgICBpZiAoc3Bs
aXREZXB0aCA8IGNNYXhTcGxpdERlcHRoKSB7Ci0gICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcg
Y2xvbmUuCi0gICAgICAgICAgICBSZW5kZXJJbmxpbmUqIGNsb25lQ2hpbGQgPSBjbG9uZTsKLSAg
ICAgICAgICAgIGNsb25lID0gY2xvbmVJbmxpbmUodG9SZW5kZXJJbmxpbmUoY3VycikpOwotCi0g
ICAgICAgICAgICAvLyBJbnNlcnQgb3VyIGNoaWxkIGNsb25lIGFzIHRoZSBmaXJzdCBjaGlsZC4K
LSAgICAgICAgICAgIGNsb25lLT5hZGRDaGlsZElnbm9yaW5nQ29udGludWF0aW9uKGNsb25lQ2hp
bGQsIDApOwotCi0gICAgICAgICAgICAvLyBIb29rIHRoZSBjbG9uZSB1cCBhcyBhIGNvbnRpbnVh
dGlvbiBvZiB8Y3VycnwuCi0gICAgICAgICAgICBSZW5kZXJJbmxpbmUqIGlubGluZUN1cnIgPSB0
b1JlbmRlcklubGluZShjdXJyKTsKLSAgICAgICAgICAgIG9sZENvbnQgPSBpbmxpbmVDdXJyLT5j
b250aW51YXRpb24oKTsKLSAgICAgICAgICAgIGlubGluZUN1cnItPnNldENvbnRpbnVhdGlvbihj
bG9uZSk7Ci0gICAgICAgICAgICBjbG9uZS0+c2V0Q29udGludWF0aW9uKG9sZENvbnQpOwotCi0g
ICAgICAgICAgICAvLyBTb21lb25lIG1heSBoYXZlIGluZGlyZWN0bHkgY2F1c2VkIGEgPHE+IHRv
IHNwbGl0LiAgV2hlbiB0aGlzIGhhcHBlbnMsIHRoZSA6YWZ0ZXIgY29udGVudAotICAgICAgICAg
ICAgLy8gaGFzIHRvIG1vdmUgaW50byB0aGUgaW5saW5lIGNvbnRpbnVhdGlvbi4gIENhbGwgdXBk
YXRlQmVmb3JlQWZ0ZXJDb250ZW50IHRvIGVuc3VyZSB0aGF0IHRoZSBpbmxpbmUncyA6YWZ0ZXIK
LSAgICAgICAgICAgIC8vIGNvbnRlbnQgZ2V0cyBwcm9wZXJseSBkZXN0cm95ZWQuCi0gICAgICAg
ICAgICBpZiAoZG9jdW1lbnQoKS0+dXNlc0JlZm9yZUFmdGVyUnVsZXMoKSkKLSAgICAgICAgICAg
ICAgICBpbmxpbmVDdXJyLT5jaGlsZHJlbigpLT51cGRhdGVCZWZvcmVBZnRlckNvbnRlbnQodGhp
cywgQUZURVIpOwotCi0gICAgICAgICAgICAvLyBOb3cgd2UgbmVlZCB0byB0YWtlIGFsbCBvZiB0
aGUgY2hpbGRyZW4gc3RhcnRpbmcgZnJvbSB0aGUgZmlyc3QgY2hpbGQKLSAgICAgICAgICAgIC8v
ICphZnRlciogY3VyckNoaWxkIGFuZCBhcHBlbmQgdGhlbSBhbGwgdG8gdGhlIGNsb25lLgotICAg
ICAgICAgICAgbyA9IGN1cnJDaGlsZC0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgICAgIHdoaWxl
IChvKSB7Ci0gICAgICAgICAgICAgICAgUmVuZGVyT2JqZWN0KiB0bXAgPSBvOwotICAgICAgICAg
ICAgICAgIG8gPSB0bXAtPm5leHRTaWJsaW5nKCk7Ci0gICAgICAgICAgICAgICAgY2xvbmUtPmFk
ZENoaWxkSWdub3JpbmdDb250aW51YXRpb24oaW5saW5lQ3Vyci0+Y2hpbGRyZW4oKS0+cmVtb3Zl
Q2hpbGROb2RlKGN1cnIsIHRtcCksIDApOwotICAgICAgICAgICAgICAgIHRtcC0+c2V0TmVlZHNM
YXlvdXRBbmRQcmVmV2lkdGhzUmVjYWxjKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAg
ICAgICAgCi0gICAgICAgIC8vIEtlZXAgd2Fsa2luZyB1cCB0aGUgY2hhaW4uCi0gICAgICAgIGN1
cnJDaGlsZCA9IGN1cnI7Ci0gICAgICAgIGN1cnIgPSB0b1JlbmRlckJveE1vZGVsT2JqZWN0KGN1
cnItPnBhcmVudCgpKTsKLSAgICAgICAgc3BsaXREZXB0aCsrOwotICAgIH0KLQotICAgIC8vIE5v
dyB3ZSBhcmUgYXQgdGhlIGJsb2NrIGxldmVsLiBXZSBuZWVkIHRvIHB1dCB0aGUgY2xvbmUgaW50
byB0aGUgdG9CbG9jay4KLSAgICB0b0Jsb2NrLT5jaGlsZHJlbigpLT5hcHBlbmRDaGlsZE5vZGUo
dG9CbG9jaywgY2xvbmUpOwotCi0gICAgLy8gTm93IHRha2UgYWxsIHRoZSBjaGlsZHJlbiBhZnRl
ciBjdXJyQ2hpbGQgYW5kIHJlbW92ZSB0aGVtIGZyb20gdGhlIGZyb21CbG9jawotICAgIC8vIGFu
ZCBwdXQgdGhlbSBpbiB0aGUgdG9CbG9jay4KLSAgICBvID0gY3VyckNoaWxkLT5uZXh0U2libGlu
ZygpOwotICAgIHdoaWxlIChvKSB7Ci0gICAgICAgIFJlbmRlck9iamVjdCogdG1wID0gbzsKLSAg
ICAgICAgbyA9IHRtcC0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgdG9CbG9jay0+Y2hpbGRyZW4o
KS0+YXBwZW5kQ2hpbGROb2RlKHRvQmxvY2ssIGZyb21CbG9jay0+Y2hpbGRyZW4oKS0+cmVtb3Zl
Q2hpbGROb2RlKGZyb21CbG9jaywgdG1wKSk7Ci0gICAgfQotfQotCi12b2lkIFJlbmRlcklubGlu
ZTo6c3BsaXRGbG93KFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQsIFJlbmRlckJsb2NrKiBuZXdC
bG9ja0JveCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVuZGVyT2JqZWN0KiBuZXdD
aGlsZCwgUmVuZGVyQm94TW9kZWxPYmplY3QqIG9sZENvbnQpCi17Ci0gICAgUmVuZGVyQmxvY2sq
IHByZSA9IDA7Ci0gICAgUmVuZGVyQmxvY2sqIGJsb2NrID0gY29udGFpbmluZ0Jsb2NrKCk7Ci0g
ICAgCi0gICAgLy8gRGVsZXRlIG91ciBsaW5lIGJveGVzIGJlZm9yZSB3ZSBkbyB0aGUgaW5saW5l
IHNwbGl0IGludG8gY29udGludWF0aW9ucy4KLSAgICBibG9jay0+ZGVsZXRlTGluZUJveFRyZWUo
KTsKLSAgICAKLSAgICBib29sIG1hZGVOZXdCZWZvcmVCbG9jayA9IGZhbHNlOwotICAgIGlmIChi
bG9jay0+aXNBbm9ueW1vdXNCbG9jaygpICYmICghYmxvY2stPnBhcmVudCgpIHx8ICFibG9jay0+
cGFyZW50KCktPmNyZWF0ZXNBbm9ueW1vdXNXcmFwcGVyKCkpKSB7Ci0gICAgICAgIC8vIFdlIGNh
biByZXVzZSB0aGlzIGJsb2NrIGFuZCBtYWtlIGl0IHRoZSBwcmVCbG9jayBvZiB0aGUgbmV4dCBj
b250aW51YXRpb24uCi0gICAgICAgIHByZSA9IGJsb2NrOwotICAgICAgICBwcmUtPnJlbW92ZVBv
c2l0aW9uZWRPYmplY3RzKDApOwotICAgICAgICBibG9jayA9IGJsb2NrLT5jb250YWluaW5nQmxv
Y2soKTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBObyBhbm9ueW1vdXMgYmxvY2sgYXZhaWxh
YmxlIGZvciB1c2UuICBNYWtlIG9uZS4KLSAgICAgICAgcHJlID0gYmxvY2stPmNyZWF0ZUFub255
bW91c0Jsb2NrKCk7Ci0gICAgICAgIG1hZGVOZXdCZWZvcmVCbG9jayA9IHRydWU7Ci0gICAgfQot
Ci0gICAgUmVuZGVyQmxvY2sqIHBvc3QgPSBibG9jay0+Y3JlYXRlQW5vbnltb3VzQmxvY2soKTsK
LQotICAgIFJlbmRlck9iamVjdCogYm94Rmlyc3QgPSBtYWRlTmV3QmVmb3JlQmxvY2sgPyBibG9j
ay0+Zmlyc3RDaGlsZCgpIDogcHJlLT5uZXh0U2libGluZygpOwotICAgIGlmIChtYWRlTmV3QmVm
b3JlQmxvY2spCi0gICAgICAgIGJsb2NrLT5jaGlsZHJlbigpLT5pbnNlcnRDaGlsZE5vZGUoYmxv
Y2ssIHByZSwgYm94Rmlyc3QpOwotICAgIGJsb2NrLT5jaGlsZHJlbigpLT5pbnNlcnRDaGlsZE5v
ZGUoYmxvY2ssIG5ld0Jsb2NrQm94LCBib3hGaXJzdCk7Ci0gICAgYmxvY2stPmNoaWxkcmVuKCkt
Pmluc2VydENoaWxkTm9kZShibG9jaywgcG9zdCwgYm94Rmlyc3QpOwotICAgIGJsb2NrLT5zZXRD
aGlsZHJlbklubGluZShmYWxzZSk7Ci0gICAgCi0gICAgaWYgKG1hZGVOZXdCZWZvcmVCbG9jaykg
ewotICAgICAgICBSZW5kZXJPYmplY3QqIG8gPSBib3hGaXJzdDsKLSAgICAgICAgd2hpbGUgKG8p
IHsKLSAgICAgICAgICAgIFJlbmRlck9iamVjdCogbm8gPSBvOwotICAgICAgICAgICAgbyA9IG5v
LT5uZXh0U2libGluZygpOwotICAgICAgICAgICAgcHJlLT5jaGlsZHJlbigpLT5hcHBlbmRDaGls
ZE5vZGUocHJlLCBibG9jay0+Y2hpbGRyZW4oKS0+cmVtb3ZlQ2hpbGROb2RlKGJsb2NrLCBubykp
OwotICAgICAgICAgICAgbm8tPnNldE5lZWRzTGF5b3V0QW5kUHJlZldpZHRoc1JlY2FsYygpOwot
ICAgICAgICB9Ci0gICAgfQotCi0gICAgc3BsaXRJbmxpbmVzKHByZSwgcG9zdCwgbmV3QmxvY2tC
b3gsIGJlZm9yZUNoaWxkLCBvbGRDb250KTsKLQotICAgIC8vIFdlIGFscmVhZHkga25vdyB0aGUg
bmV3QmxvY2tCb3ggaXNuJ3QgZ29pbmcgdG8gY29udGFpbiBpbmxpbmUga2lkcywgc28gYXZvaWQg
d2FzdGluZwotICAgIC8vIHRpbWUgaW4gbWFrZUNoaWxkcmVuTm9uSW5saW5lIGJ5IGp1c3Qgc2V0
dGluZyB0aGlzIGV4cGxpY2l0bHkgdXAgZnJvbnQuCi0gICAgbmV3QmxvY2tCb3gtPnNldENoaWxk
cmVuSW5saW5lKGZhbHNlKTsKLQotICAgIC8vIFdlIGRlbGF5ZWQgYWRkaW5nIHRoZSBuZXdDaGls
ZCB1bnRpbCBub3cgc28gdGhhdCB0aGUgfG5ld0Jsb2NrQm94fCB3b3VsZCBiZSBmdWxseQotICAg
IC8vIGNvbm5lY3RlZCwgdGh1cyBhbGxvd2luZyBuZXdDaGlsZCBhY2Nlc3MgdG8gYSByZW5kZXJB
cmVuYSBzaG91bGQgaXQgbmVlZAotICAgIC8vIHRvIHdyYXAgaXRzZWxmIGluIGFkZGl0aW9uYWwg
Ym94ZXMgKGUuZy4sIHRhYmxlIGNvbnN0cnVjdGlvbikuCi0gICAgbmV3QmxvY2tCb3gtPmFkZENo
aWxkKG5ld0NoaWxkKTsKLQotICAgIC8vIEFsd2F5cyBqdXN0IGRvIGEgZnVsbCBsYXlvdXQgaW4g
b3JkZXIgdG8gZW5zdXJlIHRoYXQgbGluZSBib3hlcyAoZXNwZWNpYWxseSB3cmFwcGVycyBmb3Ig
aW1hZ2VzKQotICAgIC8vIGdldCBkZWxldGVkIHByb3Blcmx5LiAgQmVjYXVzZSBvYmplY3RzIG1v
dmVzIGZyb20gdGhlIHByZSBibG9jayBpbnRvIHRoZSBwb3N0IGJsb2NrLCB3ZSB3YW50IHRvCi0g
ICAgLy8gbWFrZSBuZXcgbGluZSBib3hlcyBpbnN0ZWFkIG9mIGxlYXZpbmcgdGhlIG9sZCBsaW5l
IGJveGVzIGFyb3VuZC4KLSAgICBwcmUtPnNldE5lZWRzTGF5b3V0QW5kUHJlZldpZHRoc1JlY2Fs
YygpOwotICAgIGJsb2NrLT5zZXROZWVkc0xheW91dEFuZFByZWZXaWR0aHNSZWNhbGMoKTsKLSAg
ICBwb3N0LT5zZXROZWVkc0xheW91dEFuZFByZWZXaWR0aHNSZWNhbGMoKTsKLX0KLQotdm9pZCBS
ZW5kZXJJbmxpbmU6OmFkZENoaWxkVG9Db250aW51YXRpb24oUmVuZGVyT2JqZWN0KiBuZXdDaGls
ZCwgUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCkKLXsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVj
dCogZmxvdyA9IGNvbnRpbnVhdGlvbkJlZm9yZShiZWZvcmVDaGlsZCk7Ci0gICAgQVNTRVJUKCFi
ZWZvcmVDaGlsZCB8fCBiZWZvcmVDaGlsZC0+cGFyZW50KCktPmlzUmVuZGVyQmxvY2soKSB8fCBi
ZWZvcmVDaGlsZC0+cGFyZW50KCktPmlzUmVuZGVySW5saW5lKCkpOwotICAgIFJlbmRlckJveE1v
ZGVsT2JqZWN0KiBiZWZvcmVDaGlsZFBhcmVudCA9IDA7Ci0gICAgaWYgKGJlZm9yZUNoaWxkKQot
ICAgICAgICBiZWZvcmVDaGlsZFBhcmVudCA9IHRvUmVuZGVyQm94TW9kZWxPYmplY3QoYmVmb3Jl
Q2hpbGQtPnBhcmVudCgpKTsKLSAgICBlbHNlIHsKLSAgICAgICAgUmVuZGVyQm94TW9kZWxPYmpl
Y3QqIGNvbnQgPSBuZXh0Q29udGludWF0aW9uKGZsb3cpOwotICAgICAgICBpZiAoY29udCkKLSAg
ICAgICAgICAgIGJlZm9yZUNoaWxkUGFyZW50ID0gY29udDsKLSAgICAgICAgZWxzZQotICAgICAg
ICAgICAgYmVmb3JlQ2hpbGRQYXJlbnQgPSBmbG93OwotICAgIH0KLQotICAgIGlmIChuZXdDaGls
ZC0+aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpKQotICAgICAgICByZXR1cm4gYmVmb3JlQ2hpbGRQ
YXJlbnQtPmFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24obmV3Q2hpbGQsIGJlZm9yZUNoaWxk
KTsKLQotICAgIC8vIEEgY29udGludWF0aW9uIGFsd2F5cyBjb25zaXN0cyBvZiB0d28gcG90ZW50
aWFsIGNhbmRpZGF0ZXM6IGFuIGlubGluZSBvciBhbiBhbm9ueW1vdXMKLSAgICAvLyBibG9jayBi
b3ggaG9sZGluZyBibG9jayBjaGlsZHJlbi4KLSAgICBib29sIGNoaWxkSW5saW5lID0gbmV3Q2hp
bGQtPmlzSW5saW5lKCk7Ci0gICAgYm9vbCBiY3BJbmxpbmUgPSBiZWZvcmVDaGlsZFBhcmVudC0+
aXNJbmxpbmUoKTsKLSAgICBib29sIGZsb3dJbmxpbmUgPSBmbG93LT5pc0lubGluZSgpOwotCi0g
ICAgaWYgKGZsb3cgPT0gYmVmb3JlQ2hpbGRQYXJlbnQpCi0gICAgICAgIHJldHVybiBmbG93LT5h
ZGRDaGlsZElnbm9yaW5nQ29udGludWF0aW9uKG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7Ci0gICAg
ZWxzZSB7Ci0gICAgICAgIC8vIFRoZSBnb2FsIGhlcmUgaXMgdG8gbWF0Y2ggdXAgaWYgd2UgY2Fu
LCBzbyB0aGF0IHdlIGNhbiBjb2FsZXNjZSBhbmQgY3JlYXRlIHRoZQotICAgICAgICAvLyBtaW5p
bWFsICMgb2YgY29udGludWF0aW9ucyBuZWVkZWQgZm9yIHRoZSBpbmxpbmUuCi0gICAgICAgIGlm
IChjaGlsZElubGluZSA9PSBiY3BJbmxpbmUpCi0gICAgICAgICAgICByZXR1cm4gYmVmb3JlQ2hp
bGRQYXJlbnQtPmFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24obmV3Q2hpbGQsIGJlZm9yZUNo
aWxkKTsKLSAgICAgICAgZWxzZSBpZiAoZmxvd0lubGluZSA9PSBjaGlsZElubGluZSkKLSAgICAg
ICAgICAgIHJldHVybiBmbG93LT5hZGRDaGlsZElnbm9yaW5nQ29udGludWF0aW9uKG5ld0NoaWxk
LCAwKTsgLy8gSnVzdCB0cmVhdCBsaWtlIGFuIGFwcGVuZC4KLSAgICAgICAgZWxzZQotICAgICAg
ICAgICAgcmV0dXJuIGJlZm9yZUNoaWxkUGFyZW50LT5hZGRDaGlsZElnbm9yaW5nQ29udGludWF0
aW9uKG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7Ci0gICAgfQotfQotCiB2b2lkIFJlbmRlcklubGlu
ZTo6cGFpbnQoUGFpbnRJbmZvJiBwYWludEluZm8sIGludCB0eCwgaW50IHR5KQogewogICAgIG1f
bGluZUJveGVzLnBhaW50KHRoaXMsIHBhaW50SW5mbywgdHgsIHR5KTsKQEAgLTQxNSwxNiArMTk4
LDYgQEAgdm9pZCBSZW5kZXJJbmxpbmU6OmFic29sdXRlUmVjdHMoVmVjdG9yPAogICAgICAgICAg
ICAgcmVjdHMuYXBwZW5kKEludFJlY3QodHggKyBjdXJyLT54KCksIHR5ICsgY3Vyci0+eSgpLCBj
dXJyLT53aWR0aCgpLCBjdXJyLT5oZWlnaHQoKSkpOwogICAgIH0gZWxzZQogICAgICAgICByZWN0
cy5hcHBlbmQoSW50UmVjdCh0eCwgdHksIDAsIDApKTsKLQotICAgIGlmIChjb250aW51YXRpb24o
KSkgewotICAgICAgICBpZiAoY29udGludWF0aW9uKCktPmlzQm94KCkpIHsKLSAgICAgICAgICAg
IFJlbmRlckJveCogYm94ID0gdG9SZW5kZXJCb3goY29udGludWF0aW9uKCkpOwotICAgICAgICAg
ICAgY29udGludWF0aW9uKCktPmFic29sdXRlUmVjdHMocmVjdHMsIAotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgdHggLSBjb250YWluaW5nQmxvY2soKS0+eCgpICsg
Ym94LT54KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eSAt
IGNvbnRhaW5pbmdCbG9jaygpLT55KCkgKyBib3gtPnkoKSk7Ci0gICAgICAgIH0gZWxzZQotICAg
ICAgICAgICAgY29udGludWF0aW9uKCktPmFic29sdXRlUmVjdHMocmVjdHMsIHR4IC0gY29udGFp
bmluZ0Jsb2NrKCktPngoKSwgdHkgLSBjb250YWluaW5nQmxvY2soKS0+eSgpKTsKLSAgICB9CiB9
CiAKIHZvaWQgUmVuZGVySW5saW5lOjphYnNvbHV0ZVF1YWRzKFZlY3RvcjxGbG9hdFF1YWQ+JiBx
dWFkcykKQEAgLTQzNiw5ICsyMDksNiBAQCB2b2lkIFJlbmRlcklubGluZTo6YWJzb2x1dGVRdWFk
cyhWZWN0b3I8CiAgICAgICAgIH0KICAgICB9IGVsc2UKICAgICAgICAgcXVhZHMuYXBwZW5kKGxv
Y2FsVG9BYnNvbHV0ZVF1YWQoRmxvYXRSZWN0KCkpKTsKLQotICAgIGlmIChjb250aW51YXRpb24o
KSkKLSAgICAgICAgY29udGludWF0aW9uKCktPmFic29sdXRlUXVhZHMocXVhZHMpOwogfQogCiBp
bnQgUmVuZGVySW5saW5lOjpvZmZzZXRMZWZ0KCkgY29uc3QKQEAgLTUwNywxOCArMjc3LDYgQEAg
VmlzaWJsZVBvc2l0aW9uIFJlbmRlcklubGluZTo6cG9zaXRpb25GbwogICAgICAgICAvLyBzaG91
bGQgdHJ5IHRvIGZpbmQgYSByZXN1bHQgYnkgYXNraW5nIG91ciBjb250YWluaW5nIGJsb2NrLgog
ICAgICAgICByZXR1cm4gY2ItPnBvc2l0aW9uRm9yUG9pbnQocG9pbnQpOwogICAgIH0KLQotICAg
IC8vIFRyYW5zbGF0ZSB0aGUgY29vcmRzIGZyb20gdGhlIHByZS1hbm9ueW1vdXMgYmxvY2sgdG8g
dGhlIHBvc3QtYW5vbnltb3VzIGJsb2NrLgotICAgIGludCBwYXJlbnRCbG9ja1ggPSBjYi0+eCgp
ICsgcG9pbnQueCgpOwotICAgIGludCBwYXJlbnRCbG9ja1kgPSBjYi0+eSgpICsgcG9pbnQueSgp
OwotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBjID0gY29udGludWF0aW9uKCk7Ci0gICAgd2hp
bGUgKGMpIHsKLSAgICAgICAgUmVuZGVyQm94KiBjb250QmxvY2sgPSBjLT5pc0lubGluZSgpID8g
Yy0+Y29udGFpbmluZ0Jsb2NrKCkgOiB0b1JlbmRlckJsb2NrKGMpOwotICAgICAgICBpZiAoYy0+
aXNJbmxpbmUoKSB8fCBjLT5maXJzdENoaWxkKCkpCi0gICAgICAgICAgICByZXR1cm4gYy0+cG9z
aXRpb25Gb3JDb29yZGluYXRlcyhwYXJlbnRCbG9ja1ggLSBjb250QmxvY2stPngoKSwgcGFyZW50
QmxvY2tZIC0gY29udEJsb2NrLT55KCkpOwotICAgICAgICBjID0gdG9SZW5kZXJCbG9jayhjKS0+
aW5saW5lQ29udGludWF0aW9uKCk7Ci0gICAgfQotICAgIAogICAgIHJldHVybiBSZW5kZXJCb3hN
b2RlbE9iamVjdDo6cG9zaXRpb25Gb3JQb2ludChwb2ludCk7CiB9CiAKQEAgLTU3MSw3ICszMjks
NyBAQCBJbnRSZWN0IFJlbmRlcklubGluZTo6Y2xpcHBlZE92ZXJmbG93UmVjCiAgICAgLy8gT25s
eSBydW4taW5zIGFyZSBhbGxvd2VkIGluIGhlcmUgZHVyaW5nIGxheW91dC4KICAgICBBU1NFUlQo
IXZpZXcoKSB8fCAhdmlldygpLT5sYXlvdXRTdGF0ZUVuYWJsZWQoKSB8fCBpc1J1bkluKCkpOwog
Ci0gICAgaWYgKCFmaXJzdExpbmVCb3goKSAmJiAhY29udGludWF0aW9uKCkpCisgICAgaWYgKCFm
aXJzdExpbmVCb3goKSkKICAgICAgICAgcmV0dXJuIEludFJlY3QoKTsKIAogICAgIC8vIEZpbmQg
b3VyIGxlZnRtb3N0IHBvc2l0aW9uLgpAQCAtNjE5LDExICszNzcsNiBAQCBJbnRSZWN0IFJlbmRl
cklubGluZTo6Y2xpcHBlZE92ZXJmbG93UmVjCiAgICAgICAgICAgICAgICAgci51bml0ZShjaGls
ZFJlY3QpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbnRpbnVh
dGlvbigpICYmICFjb250aW51YXRpb24oKS0+aXNJbmxpbmUoKSkgewotICAgICAgICAgICAgSW50
UmVjdCBjb250UmVjdCA9IGNvbnRpbnVhdGlvbigpLT5yZWN0V2l0aE91dGxpbmVGb3JSZXBhaW50
KHJlcGFpbnRDb250YWluZXIsIG93KTsKLSAgICAgICAgICAgIHIudW5pdGUoY29udFJlY3QpOwot
ICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIHI7CkBAIC03OTYsNDkgKzU0OSw2IEBAIHZv
aWQgUmVuZGVySW5saW5lOjptYXBBYnNvbHV0ZVRvTG9jYWxQb2kKICAgICAgICAgdHJhbnNmb3Jt
U3RhdGUubW92ZSgtY29udGFpbmVyT2Zmc2V0LndpZHRoKCksIC1jb250YWluZXJPZmZzZXQuaGVp
Z2h0KCksIHByZXNlcnZlM0QgPyBUcmFuc2Zvcm1TdGF0ZTo6QWNjdW11bGF0ZVRyYW5zZm9ybSA6
IFRyYW5zZm9ybVN0YXRlOjpGbGF0dGVuVHJhbnNmb3JtKTsKIH0KIAotdm9pZCBSZW5kZXJJbmxp
bmU6OnVwZGF0ZURyYWdTdGF0ZShib29sIGRyYWdPbikKLXsKLSAgICBSZW5kZXJCb3hNb2RlbE9i
amVjdDo6dXBkYXRlRHJhZ1N0YXRlKGRyYWdPbik7Ci0gICAgaWYgKGNvbnRpbnVhdGlvbigpKQot
ICAgICAgICBjb250aW51YXRpb24oKS0+dXBkYXRlRHJhZ1N0YXRlKGRyYWdPbik7Ci19Ci0KLXZv
aWQgUmVuZGVySW5saW5lOjpjaGlsZEJlY2FtZU5vbklubGluZShSZW5kZXJPYmplY3QqIGNoaWxk
KQotewotICAgIC8vIFdlIGhhdmUgdG8gc3BsaXQgdGhlIHBhcmVudCBmbG93LgotICAgIFJlbmRl
ckJsb2NrKiBuZXdCb3ggPSBjb250YWluaW5nQmxvY2soKS0+Y3JlYXRlQW5vbnltb3VzQmxvY2so
KTsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogb2xkQ29udGludWF0aW9uID0gY29udGludWF0
aW9uKCk7Ci0gICAgc2V0Q29udGludWF0aW9uKG5ld0JveCk7Ci0gICAgUmVuZGVyT2JqZWN0KiBi
ZWZvcmVDaGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygpOwotICAgIGNoaWxkcmVuKCktPnJlbW92
ZUNoaWxkTm9kZSh0aGlzLCBjaGlsZCk7Ci0gICAgc3BsaXRGbG93KGJlZm9yZUNoaWxkLCBuZXdC
b3gsIGNoaWxkLCBvbGRDb250aW51YXRpb24pOwotfQotCi12b2lkIFJlbmRlcklubGluZTo6dXBk
YXRlSGl0VGVzdFJlc3VsdChIaXRUZXN0UmVzdWx0JiByZXN1bHQsIGNvbnN0IEludFBvaW50JiBw
b2ludCkKLXsKLSAgICBpZiAocmVzdWx0LmlubmVyTm9kZSgpKQotICAgICAgICByZXR1cm47Ci0K
LSAgICBOb2RlKiBuID0gbm9kZSgpOwotICAgIEludFBvaW50IGxvY2FsUG9pbnQocG9pbnQpOwot
ICAgIGlmIChuKSB7Ci0gICAgICAgIGlmIChpc0lubGluZUNvbnRpbnVhdGlvbigpKSB7Ci0gICAg
ICAgICAgICAvLyBXZSdyZSBpbiB0aGUgY29udGludWF0aW9uIG9mIGEgc3BsaXQgaW5saW5lLiAg
QWRqdXN0IG91ciBsb2NhbCBwb2ludCB0byBiZSBpbiB0aGUgY29vcmRpbmF0ZSBzcGFjZQotICAg
ICAgICAgICAgLy8gb2YgdGhlIHByaW5jaXBhbCByZW5kZXJlcidzIGNvbnRhaW5pbmcgYmxvY2su
ICBUaGlzIHdpbGwgZW5kIHVwIGJlaW5nIHRoZSBpbm5lck5vblNoYXJlZE5vZGUuCi0gICAgICAg
ICAgICBSZW5kZXJCbG9jayogZmlyc3RCbG9jayA9IG4tPnJlbmRlcmVyKCktPmNvbnRhaW5pbmdC
bG9jaygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBHZXQgb3VyIGNvbnRhaW5pbmcg
YmxvY2suCi0gICAgICAgICAgICBSZW5kZXJCb3gqIGJsb2NrID0gY29udGFpbmluZ0Jsb2NrKCk7
Ci0gICAgICAgICAgICBsb2NhbFBvaW50Lm1vdmUoYmxvY2stPngoKSAtIGZpcnN0QmxvY2stPngo
KSwgYmxvY2stPnkoKSAtIGZpcnN0QmxvY2stPnkoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBy
ZXN1bHQuc2V0SW5uZXJOb2RlKG4pOwotICAgICAgICBpZiAoIXJlc3VsdC5pbm5lck5vblNoYXJl
ZE5vZGUoKSkKLSAgICAgICAgICAgIHJlc3VsdC5zZXRJbm5lck5vblNoYXJlZE5vZGUobik7Ci0g
ICAgICAgIHJlc3VsdC5zZXRMb2NhbFBvaW50KGxvY2FsUG9pbnQpOwotICAgIH0KLX0KLQogdm9p
ZCBSZW5kZXJJbmxpbmU6OmRpcnR5TGluZUJveGVzKGJvb2wgZnVsbExheW91dCkKIHsKICAgICBp
ZiAoZnVsbExheW91dCkKQEAgLTk1NCwxNyArNjY0LDYgQEAgdm9pZCBSZW5kZXJJbmxpbmU6OmFk
ZEZvY3VzUmluZ1JlY3RzKFZlYwogICAgICAgICAgICBjdXJyLT5hZGRGb2N1c1JpbmdSZWN0cyhy
ZWN0cywgcG9zLngoKSwgcG9zLnkoKSk7CiAgICAgICAgIH0KICAgICB9Ci0KLSAgICBpZiAoY29u
dGludWF0aW9uKCkpIHsKLSAgICAgICAgaWYgKGNvbnRpbnVhdGlvbigpLT5pc0lubGluZSgpKQot
ICAgICAgICAgICAgY29udGludWF0aW9uKCktPmFkZEZvY3VzUmluZ1JlY3RzKHJlY3RzLCAKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eCAtIGNvbnRhaW5p
bmdCbG9jaygpLT54KCkgKyBjb250aW51YXRpb24oKS0+Y29udGFpbmluZ0Jsb2NrKCktPngoKSwK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eSAtIGNvbnRh
aW5pbmdCbG9jaygpLT55KCkgKyBjb250aW51YXRpb24oKS0+Y29udGFpbmluZ0Jsb2NrKCktPnko
KSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNvbnRpbnVhdGlvbigpLT5hZGRGb2N1c1Jp
bmdSZWN0cyhyZWN0cywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgdHggLSBjb250YWluaW5nQmxvY2soKS0+eCgpICsgdG9SZW5kZXJCb3goY29udGludWF0
aW9uKCkpLT54KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgdHkgLSBjb250YWluaW5nQmxvY2soKS0+eSgpICsgdG9SZW5kZXJCb3goY29udGludWF0aW9u
KCkpLT55KCkpOwotICAgIH0KIH0KIAogdm9pZCBSZW5kZXJJbmxpbmU6OnBhaW50T3V0bGluZShH
cmFwaGljc0NvbnRleHQqIGdyYXBoaWNzQ29udGV4dCwgaW50IHR4LCBpbnQgdHkpCkluZGV4OiBX
ZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJJbmxpbmUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3Jl
bmRlcmluZy9SZW5kZXJJbmxpbmUuaAkocmV2aXNpb24gNTQ1MDEpCisrKyBXZWJDb3JlL3JlbmRl
cmluZy9SZW5kZXJJbmxpbmUuaAkod29ya2luZyBjb3B5KQpAQCAtNTgsMTAgKzU4LDYgQEAgcHVi
bGljOgogCiAgICAgSW5saW5lRmxvd0JveCogZmlyc3RMaW5lQm94KCkgY29uc3QgeyByZXR1cm4g
bV9saW5lQm94ZXMuZmlyc3RMaW5lQm94KCk7IH0KICAgICBJbmxpbmVGbG93Qm94KiBsYXN0TGlu
ZUJveCgpIGNvbnN0IHsgcmV0dXJuIG1fbGluZUJveGVzLmxhc3RMaW5lQm94KCk7IH0KLQotICAg
IFJlbmRlckJveE1vZGVsT2JqZWN0KiBjb250aW51YXRpb24oKSBjb25zdCB7IHJldHVybiBtX2Nv
bnRpbnVhdGlvbjsgfQotCi0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZURyYWdTdGF0ZShib29sIGRy
YWdPbik7CiAgICAgCiAgICAgSW50U2l6ZSByZWxhdGl2ZVBvc2l0aW9uZWRJbmxpbmVPZmZzZXQo
Y29uc3QgUmVuZGVyQm94KiBjaGlsZCkgY29uc3Q7CiAKQEAgLTgxLDkgKzc3LDYgQEAgcHJpdmF0
ZToKIAogICAgIHZpcnR1YWwgYm9vbCBpc1JlbmRlcklubGluZSgpIGNvbnN0IHsgcmV0dXJuIHRy
dWU7IH0KIAotICAgIHZvaWQgYWRkQ2hpbGRUb0NvbnRpbnVhdGlvbihSZW5kZXJPYmplY3QqIG5l
d0NoaWxkLCBSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkKTsKLSAgICB2aXJ0dWFsIHZvaWQgYWRk
Q2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihSZW5kZXJPYmplY3QqIG5ld0NoaWxkLCBSZW5kZXJP
YmplY3QqIGJlZm9yZUNoaWxkID0gMCk7Ci0KICAgICB2b2lkIHNwbGl0SW5saW5lcyhSZW5kZXJC
bG9jayogZnJvbUJsb2NrLCBSZW5kZXJCbG9jayogdG9CbG9jaywgUmVuZGVyQmxvY2sqIG1pZGRs
ZUJsb2NrLAogICAgICAgICAgICAgICAgICAgICAgIFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQs
IFJlbmRlckJveE1vZGVsT2JqZWN0KiBvbGRDb250KTsKICAgICB2b2lkIHNwbGl0RmxvdyhSZW5k
ZXJPYmplY3QqIGJlZm9yZUNoaWxkLCBSZW5kZXJCbG9jayogbmV3QmxvY2tCb3gsCkBAIC0xMjYs
MTMgKzExOSw4IEBAIHByaXZhdGU6CiAKICAgICB2aXJ0dWFsIGludCBsaW5lSGVpZ2h0KGJvb2wg
Zmlyc3RMaW5lLCBib29sIGlzUm9vdExpbmVCb3ggPSBmYWxzZSkgY29uc3Q7CiAKLSAgICBSZW5k
ZXJJbmxpbmUqIGlubGluZUNvbnRpbnVhdGlvbigpIGNvbnN0OwotICAgIHZvaWQgc2V0Q29udGlu
dWF0aW9uKFJlbmRlckJveE1vZGVsT2JqZWN0KiBjKSB7IG1fY29udGludWF0aW9uID0gYzsgfQot
ICAgIAogICAgIHZpcnR1YWwgdm9pZCBjaGlsZEJlY2FtZU5vbklubGluZShSZW5kZXJPYmplY3Qq
IGNoaWxkKTsKIAotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVIaXRUZXN0UmVzdWx0KEhpdFRlc3RS
ZXN1bHQmLCBjb25zdCBJbnRQb2ludCYpOwotCiAgICAgdmlydHVhbCB2b2lkIGltYWdlQ2hhbmdl
ZChXcmFwcGVkSW1hZ2VQdHIsIGNvbnN0IEludFJlY3QqID0gMCk7CiAKICNpZiBFTkFCTEUoREFT
SEJPQVJEX1NVUFBPUlQpCkBAIC0xNDUsMTMgKzEzMywxMCBAQCBwcml2YXRlOgogICAgIHN0YXRp
YyBSZW5kZXJJbmxpbmUqIGNsb25lSW5saW5lKFJlbmRlcklubGluZSogc3JjKTsKIAogICAgIHZv
aWQgcGFpbnRPdXRsaW5lRm9yTGluZShHcmFwaGljc0NvbnRleHQqLCBpbnQgdHgsIGludCB0eSwg
Y29uc3QgSW50UmVjdCYgcHJldkxpbmUsIGNvbnN0IEludFJlY3QmIHRoaXNMaW5lLCBjb25zdCBJ
bnRSZWN0JiBuZXh0TGluZSk7Ci0gICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGNvbnRpbnVhdGlv
bkJlZm9yZShSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkKTsKIAogICAgIFJlbmRlck9iamVjdENo
aWxkTGlzdCBtX2NoaWxkcmVuOwogICAgIFJlbmRlckxpbmVCb3hMaXN0IG1fbGluZUJveGVzOyAg
IC8vIEFsbCBvZiB0aGUgbGluZSBib3hlcyBjcmVhdGVkIGZvciB0aGlzIGlubGluZSBmbG93LiAg
Rm9yIGV4YW1wbGUsIDxpPkhlbGxvPGJyPndvcmxkLjwvaT4gd2lsbCBoYXZlIHR3byA8aT4gbGlu
ZSBib3hlcy4KIAotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBtX2NvbnRpbnVhdGlvbjsgLy8g
Q2FuIGJlIGVpdGhlciBhIGJsb2NrIG9yIGFuIGlubGluZS4gPGI+PGk+PHA+SGVsbG88L3A+PC9p
PjwvYj4uIEluIHRoaXMgZXhhbXBsZSB0aGUgPGk+IHdpbGwgaGF2ZSBhIGJsb2NrIGFzIGl0cyBj
b250aW51YXRpb24gYnV0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgLy8gPGI+IHdpbGwganVzdCBoYXZlIGFuIGlubGluZSBhcyBpdHMgY29udGludWF0aW9u
LgogICAgIG11dGFibGUgaW50IG1fbGluZUhlaWdodDsKICAgICBtdXRhYmxlIGludCBtX3ZlcnRp
Y2FsUG9zaXRpb247CiB9OwpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGluZUJveExp
c3QuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckxpbmVCb3hMaXN0
LmNwcAkocmV2aXNpb24gNTQ1MDEpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMaW5lQm94
TGlzdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE0NiwxMiArMTQ2LDYgQEAgdm9pZCBSZW5kZXJM
aW5lQm94TGlzdDo6ZGlydHlMaW5lQm94ZXMoKQogCiB2b2lkIFJlbmRlckxpbmVCb3hMaXN0Ojpw
YWludChSZW5kZXJCb3hNb2RlbE9iamVjdCogcmVuZGVyZXIsIFJlbmRlck9iamVjdDo6UGFpbnRJ
bmZvJiBwYWludEluZm8sIGludCB0eCwgaW50IHR5KSBjb25zdAogewotICAgIC8vIE9ubHkgcGFp
bnQgZHVyaW5nIHRoZSBmb3JlZ3JvdW5kL3NlbGVjdGlvbiBwaGFzZXMuCi0gICAgaWYgKHBhaW50
SW5mby5waGFzZSAhPSBQYWludFBoYXNlRm9yZWdyb3VuZCAmJiBwYWludEluZm8ucGhhc2UgIT0g
UGFpbnRQaGFzZVNlbGVjdGlvbiAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZU91dGxp
bmUgCi0gICAgICAgICYmIHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlU2VsZk91dGxpbmUg
JiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VDaGlsZE91dGxpbmVzICYmIHBhaW50SW5m
by5waGFzZSAhPSBQYWludFBoYXNlVGV4dENsaXAKLSAgICAgICAgJiYgcGFpbnRJbmZvLnBoYXNl
ICE9IFBhaW50UGhhc2VNYXNrKQotICAgICAgICByZXR1cm47Ci0KICAgICBBU1NFUlQocmVuZGVy
ZXItPmlzUmVuZGVyQmxvY2soKSB8fCAocmVuZGVyZXItPmlzUmVuZGVySW5saW5lKCkgJiYgcmVu
ZGVyZXItPmhhc0xheWVyKCkpKTsgLy8gVGhlIG9ubHkgd2F5IGFuIGlubGluZSBjb3VsZCBwYWlu
dCBsaWtlIHRoaXMgaXMgaWYgaXQgaGFzIGEgbGF5ZXIuCiAKICAgICAvLyBJZiB3ZSBoYXZlIG5v
IGxpbmVzIHRoZW4gd2UgaGF2ZSBubyB3b3JrIHRvIGRvLgpJbmRleDogV2ViQ29yZS9yZW5kZXJp
bmcvUmVuZGVyT2JqZWN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5k
ZXJPYmplY3QuY3BwCShyZXZpc2lvbiA1NDUwMSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRl
ck9iamVjdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIyMjEsOCArMjIyMSw2IEBAIHZvaWQgUmVu
ZGVyT2JqZWN0OjpnZXRUZXh0RGVjb3JhdGlvbkNvbG8KICAgICAgICAgICAgIH0KICAgICAgICAg
fQogICAgICAgICBjdXJyID0gY3Vyci0+cGFyZW50KCk7Ci0gICAgICAgIGlmIChjdXJyICYmIGN1
cnItPmlzUmVuZGVyQmxvY2soKSAmJiB0b1JlbmRlckJsb2NrKGN1cnIpLT5pbmxpbmVDb250aW51
YXRpb24oKSkKLSAgICAgICAgICAgIGN1cnIgPSB0b1JlbmRlckJsb2NrKGN1cnIpLT5pbmxpbmVD
b250aW51YXRpb24oKTsKICAgICB9IHdoaWxlIChjdXJyICYmIGRlY29yYXRpb25zICYmICghcXVp
cmtzTW9kZSB8fCAhY3Vyci0+bm9kZSgpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgKCFjdXJyLT5ub2RlKCktPmhhc1RhZ05hbWUoYVRhZykgJiYgIWN1cnItPm5vZGUo
KS0+aGFzVGFnTmFtZShmb250VGFnKSkpKTsKIApJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVu
ZGVyT2JqZWN0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0
LmgJKHJldmlzaW9uIDU0NTAxKQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmgJ
KHdvcmtpbmcgY29weSkKQEAgLTM2NSw2ICszNjUsMTAgQEAgcHVibGljOgogICAgIHsKICAgICAg
ICAgcmV0dXJuIG1faXNBbm9ueW1vdXMgJiYgc3R5bGUoKS0+ZGlzcGxheSgpID09IEJMT0NLICYm
IHN0eWxlKCktPnN0eWxlVHlwZSgpID09IE5PUFNFVURPICYmICFpc0xpc3RNYXJrZXIoKTsKICAg
ICB9CisgICAgYm9vbCBpc0Fub255bW91c0lubGluZUJsb2NrKCkgY29uc3QKKyAgICB7CisgICAg
ICAgIHJldHVybiBtX2lzQW5vbnltb3VzICYmIHN0eWxlKCktPmRpc3BsYXkoKSA9PSBJTkxJTkVf
QkxPQ0sgJiYgc3R5bGUoKS0+c3R5bGVUeXBlKCkgPT0gTk9QU0VVRE87CisgICAgfQogICAgIGJv
b2wgaXNJbmxpbmVDb250aW51YXRpb24oKSBjb25zdCB7IHJldHVybiAobm9kZSgpID8gbm9kZSgp
LT5yZW5kZXJlcigpICE9IHRoaXMgOiBmYWxzZSkgJiYgaXNSZW5kZXJJbmxpbmUoKTsgfQogICAg
IGJvb2wgaXNGbG9hdGluZygpIGNvbnN0IHsgcmV0dXJuIG1fZmxvYXRpbmc7IH0KICAgICBib29s
IGlzUG9zaXRpb25lZCgpIGNvbnN0IHsgcmV0dXJuIG1fcG9zaXRpb25lZDsgfSAvLyBhYnNvbHV0
ZSBvciBmaXhlZCBwb3NpdGlvbmluZwpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2Jq
ZWN0Q2hpbGRMaXN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJP
YmplY3RDaGlsZExpc3QuY3BwCShyZXZpc2lvbiA1NDUwMSkKKysrIFdlYkNvcmUvcmVuZGVyaW5n
L1JlbmRlck9iamVjdENoaWxkTGlzdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMxNiwxNiArMzE2
LDYgQEAgdm9pZCBSZW5kZXJPYmplY3RDaGlsZExpc3Q6OnVwZGF0ZUJlZm9yZQogCiAgICAgLy8g
V2hldGhlciBvciBub3Qgd2Ugbm93IHdhbnQgZ2VuZXJhdGVkIGNvbnRlbnQuICAKICAgICBib29s
IG5ld0NvbnRlbnRXYW50ZWQgPSBwc2V1ZG9FbGVtZW50U3R5bGUgJiYgcHNldWRvRWxlbWVudFN0
eWxlLT5kaXNwbGF5KCkgIT0gTk9ORTsKLQotICAgIC8vIEZvciA8cT48cC8+PC9xPiwgaWYgdGhp
cyBvYmplY3QgaXMgdGhlIGlubGluZSBjb250aW51YXRpb24gb2YgdGhlIDxxPiwgd2Ugb25seSB3
YW50IHRvIGdlbmVyYXRlCi0gICAgLy8gOmFmdGVyIGNvbnRlbnQgYW5kIG5vdCA6YmVmb3JlIGNv
bnRlbnQuCi0gICAgaWYgKG5ld0NvbnRlbnRXYW50ZWQgJiYgdHlwZSA9PSBCRUZPUkUgJiYgb3du
ZXItPmlzUmVuZGVySW5saW5lKCkgJiYgdG9SZW5kZXJJbmxpbmUob3duZXIpLT5pc0lubGluZUNv
bnRpbnVhdGlvbigpKQotICAgICAgICBuZXdDb250ZW50V2FudGVkID0gZmFsc2U7Ci0KLSAgICAv
LyBTaW1pbGFybHksIGlmIHdlJ3JlIHRoZSBiZWdpbm5pbmcgb2YgYSA8cT4sIGFuZCB0aGVyZSdz
IGFuIGlubGluZSBjb250aW51YXRpb24gZm9yIG91ciBvYmplY3QsCi0gICAgLy8gdGhlbiB3ZSBk
b24ndCBnZW5lcmF0ZSB0aGUgOmFmdGVyIGNvbnRlbnQuCi0gICAgaWYgKG5ld0NvbnRlbnRXYW50
ZWQgJiYgdHlwZSA9PSBBRlRFUiAmJiBvd25lci0+aXNSZW5kZXJJbmxpbmUoKSAmJiB0b1JlbmRl
cklubGluZShvd25lciktPmNvbnRpbnVhdGlvbigpKQotICAgICAgICBuZXdDb250ZW50V2FudGVk
ID0gZmFsc2U7CiAgICAgCiAgICAgLy8gSWYgd2UgZG9uJ3Qgd2FudCBnZW5lcmF0ZWQgY29udGVu
dCBhbnkgbG9uZ2VyLCBvciBpZiB3ZSBoYXZlIGdlbmVyYXRlZCBjb250ZW50LCBidXQgaXQncyBu
byBsb25nZXIKICAgICAvLyBpZGVudGljYWwgdG8gdGhlIG5ldyBjb250ZW50IGRhdGEgd2Ugd2Fu
dCB0byBidWlsZCByZW5kZXIgb2JqZWN0cyBmb3IsIHRoZW4gd2UgbnVrZSBhbGwKSW5kZXg6IFdl
YkNvcmUvcmVuZGVyaW5nL1Jvb3RJbmxpbmVCb3guY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUv
cmVuZGVyaW5nL1Jvb3RJbmxpbmVCb3guY3BwCShyZXZpc2lvbiA1NDUwMSkKKysrIFdlYkNvcmUv
cmVuZGVyaW5nL1Jvb3RJbmxpbmVCb3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMSw2ICszMSw3
IEBACiAjaW5jbHVkZSAiUGFnZS5oIgogI2luY2x1ZGUgIlJlbmRlckFyZW5hLmgiCiAjaW5jbHVk
ZSAiUmVuZGVyQmxvY2suaCIKKyNpbmNsdWRlICJSZW5kZXJWaWV3LmgiCiAKIHVzaW5nIG5hbWVz
cGFjZSBzdGQ7CiAKQEAgLTE2Myw2ICsxNjQsNDYgQEAgdm9pZCBSb290SW5saW5lQm94OjpwYWlu
dEN1c3RvbUhpZ2hsaWdodAogCiB2b2lkIFJvb3RJbmxpbmVCb3g6OnBhaW50KFJlbmRlck9iamVj
dDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGludCB0eCwgaW50IHR5KQogeworICAgIFJlbmRlckJs
b2NrKiBjaGlsZCA9IGFub255bW91c0lubGluZUJsb2NrKCk7CisgICAgaWYgKGNoaWxkKSB7Cisg
ICAgICAgIC8vIFRyZWF0IHBhaW50aW5nIG9mIGEgc3BlY2lhbCBpbmxpbmUtYmxvY2sgbGluZSBs
aWtlIHRoZSBwYWludGluZyBvZiBhIG5vcm1hbCBibG9jayBhbmQgZ28gdGhyb3VnaCBhbGwgcGhh
c2VzLgorICAgICAgICBQYWludFBoYXNlIG5ld1BoYXNlID0gKHBhaW50SW5mby5waGFzZSA9PSBQ
YWludFBoYXNlQ2hpbGRPdXRsaW5lcykgPyBQYWludFBoYXNlT3V0bGluZSA6IHBhaW50SW5mby5w
aGFzZTsKKyAgICAgICAgbmV3UGhhc2UgPSAobmV3UGhhc2UgPT0gUGFpbnRQaGFzZUNoaWxkQmxv
Y2tCYWNrZ3JvdW5kcykgPyBQYWludFBoYXNlQ2hpbGRCbG9ja0JhY2tncm91bmQgOiBuZXdQaGFz
ZTsKKyAgICAKKyAgICAgICAgLy8gV2UgZG9uJ3QgcGFpbnQgb3VyIG93biBiYWNrZ3JvdW5kLCBi
dXQgd2UgZG8gbGV0IHRoZSBjaGlsZCBwYWludCBpdHMgYmFja2dyb3VuZC4KKyAgICAgICAgUmVu
ZGVyT2JqZWN0OjpQYWludEluZm8gaW5mbyhwYWludEluZm8pOworICAgICAgICBpbmZvLnBoYXNl
ID0gbmV3UGhhc2U7CisgICAgICAgIGluZm8ucGFpbnRpbmdSb290ID0gcmVuZGVyZXIoKS0+cGFp
bnRpbmdSb290Rm9yQ2hpbGRyZW4ocGFpbnRJbmZvKTsKKyAgICAgICAgYm9vbCBpc1ByaW50aW5n
ID0gcmVuZGVyZXIoKS0+ZG9jdW1lbnQoKS0+cHJpbnRpbmcoKTsKKyAgICAgICAgCisgICAgICAg
IC8vIENoZWNrIGZvciBwYWdlLWJyZWFrLWJlZm9yZTogYWx3YXlzLCBhbmQgaWYgaXQncyBzZXQs
IGJyZWFrIGFuZCBiYWlsLgorICAgICAgICBpZiAoaXNQcmludGluZyAmJiBjaGlsZC0+c3R5bGUo
KS0+cGFnZUJyZWFrQmVmb3JlKCkgPT0gUEJBTFdBWVMgJiYKKyAgICAgICAgICAgIGJsb2NrKCkt
PmluUm9vdEJsb2NrQ29udGV4dCgpICYmICh0eSArIGNoaWxkLT55KCkpID4gcGFpbnRJbmZvLnJl
Y3QueSgpICYmIAorICAgICAgICAgICAgKHR5ICsgY2hpbGQtPnkoKSkgPCBwYWludEluZm8ucmVj
dC5ib3R0b20oKSkgeworICAgICAgICAgICAgcmVuZGVyZXIoKS0+dmlldygpLT5zZXRCZXN0VHJ1
bmNhdGVkQXQodHkgKyBjaGlsZC0+eSgpLCBibG9jaygpLCB0cnVlKTsKKyAgICAgICAgICAgIHJl
dHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghY2hpbGQtPmhhc1NlbGZQYWludGluZ0xh
eWVyKCkpCisgICAgICAgICAgICBjaGlsZC0+cGFpbnQoaW5mbywgdHgsIHR5KTsKKworICAgICAg
ICAvLyBDaGVjayBmb3IgcGFnZS1icmVhay1hZnRlcjogYWx3YXlzLCBhbmQgaWYgaXQncyBzZXQs
IGJyZWFrIGFuZCBiYWlsLgorICAgICAgICBpZiAoaXNQcmludGluZyAmJiBjaGlsZC0+c3R5bGUo
KS0+cGFnZUJyZWFrQWZ0ZXIoKSA9PSBQQkFMV0FZUyAmJiAKKyAgICAgICAgICAgIGJsb2NrKCkt
PmluUm9vdEJsb2NrQ29udGV4dCgpICYmICh0eSArIGNoaWxkLT55KCkgKyBjaGlsZC0+aGVpZ2h0
KCkpID4gcGFpbnRJbmZvLnJlY3QueSgpICYmIAorICAgICAgICAgICAgKHR5ICsgY2hpbGQtPnko
KSArIGNoaWxkLT5oZWlnaHQoKSkgPCBwYWludEluZm8ucmVjdC5ib3R0b20oKSkgeworICAgICAg
ICAgICAgcmVuZGVyZXIoKS0+dmlldygpLT5zZXRCZXN0VHJ1bmNhdGVkQXQodHkgKyBjaGlsZC0+
eSgpICsgY2hpbGQtPmhlaWdodCgpICsgbWF4KDAsIGNoaWxkLT5jb2xsYXBzZWRNYXJnaW5Cb3R0
b20oKSksIGJsb2NrKCksIHRydWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9Cisg
ICAgICAgIAorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gT25seSBwYWludCBkdXJp
bmcgdGhlIGZvcmVncm91bmQvc2VsZWN0aW9uIHBoYXNlcyBpZiB3ZSBkb24ndCBoYXZlIGEgc3Bl
Y2lhbCBhbm9ueW1vdXMgaW5saW5lIGJsb2NrLgorICAgIGlmIChwYWludEluZm8ucGhhc2UgIT0g
UGFpbnRQaGFzZUZvcmVncm91bmQgJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VTZWxl
Y3Rpb24gJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VPdXRsaW5lIAorICAgICAgICAm
JiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZVNlbGZPdXRsaW5lICYmIHBhaW50SW5mby5w
aGFzZSAhPSBQYWludFBoYXNlQ2hpbGRPdXRsaW5lcyAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFp
bnRQaGFzZVRleHRDbGlwCisgICAgICAgICYmIHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNl
TWFzaykKKyAgICAgICAgcmV0dXJuOworCiAgICAgSW5saW5lRmxvd0JveDo6cGFpbnQocGFpbnRJ
bmZvLCB0eCwgdHkpOwogICAgIHBhaW50RWxsaXBzaXNCb3gocGFpbnRJbmZvLCB0eCwgdHkpOwog
I2lmIFBMQVRGT1JNKE1BQykKQEAgLTIwNCw2ICsyNDUsMTcgQEAgdm9pZCBSb290SW5saW5lQm94
OjpjaGlsZFJlbW92ZWQoSW5saW5lQgogCiBpbnQgUm9vdElubGluZUJveDo6dmVydGljYWxseUFs
aWduQm94ZXMoaW50IGhlaWdodE9mQmxvY2spCiB7CisgICAgUmVuZGVyQmxvY2sqIGlubGluZUJs
b2NrID0gYW5vbnltb3VzSW5saW5lQmxvY2soKTsKKyAgICBpZiAoaW5saW5lQmxvY2spIHsKKyAg
ICAgICAgaW50IGxpbmVUb3AgPSBpbmxpbmVCbG9jay0+eSgpOworICAgICAgICBpbnQgbGluZUJv
dHRvbSA9IGlubGluZUJsb2NrLT55KCkgKyBpbmxpbmVCbG9jay0+aGVpZ2h0KCk7CisgICAgICAg
IGZpcnN0Q2hpbGQoKS0+c2V0WShsaW5lVG9wKTsKKyAgICAgICAgc2V0WShsaW5lVG9wKTsKKyAg
ICAgICAgY29tcHV0ZVZlcnRpY2FsT3ZlcmZsb3cobGluZVRvcCwgbGluZUJvdHRvbSwgdHJ1ZSk7
CisgICAgICAgIHNldExpbmVUb3BCb3R0b21Qb3NpdGlvbnMobGluZVRvcCwgbGluZUJvdHRvbSk7
CisgICAgICAgIHJldHVybiBoZWlnaHRPZkJsb2NrOworICAgIH0KKyAgICAKICAgICBpbnQgbWF4
UG9zaXRpb25Ub3AgPSAwOwogICAgIGludCBtYXhQb3NpdGlvbkJvdHRvbSA9IDA7CiAgICAgaW50
IG1heEFzY2VudCA9IDA7CkBAIC0yMTcsNyArMjY5LDYgQEAgaW50IFJvb3RJbmxpbmVCb3g6OnZl
cnRpY2FsbHlBbGlnbkJveGVzKAogICAgIGJvb2wgc3RyaWN0TW9kZSA9IChjdXJyICYmIGN1cnIt
PmRvY3VtZW50KCktPmluU3RyaWN0TW9kZSgpKTsKIAogICAgIGNvbXB1dGVMb2dpY2FsQm94SGVp
Z2h0cyhtYXhQb3NpdGlvblRvcCwgbWF4UG9zaXRpb25Cb3R0b20sIG1heEFzY2VudCwgbWF4RGVz
Y2VudCwgc3RyaWN0TW9kZSk7Ci0KICAgICBpZiAobWF4QXNjZW50ICsgbWF4RGVzY2VudCA8IG1h
eChtYXhQb3NpdGlvblRvcCwgbWF4UG9zaXRpb25Cb3R0b20pKQogICAgICAgICBhZGp1c3RNYXhB
c2NlbnRBbmREZXNjZW50KG1heEFzY2VudCwgbWF4RGVzY2VudCwgbWF4UG9zaXRpb25Ub3AsIG1h
eFBvc2l0aW9uQm90dG9tKTsKIApAQCAtNDMwLDQgKzQ4MSw5IEBAIHZvaWQgUm9vdElubGluZUJv
eDo6YXR0YWNoTGluZUJveFRvUmVuZGUKICAgICBibG9jaygpLT5saW5lQm94ZXMoKS0+YXR0YWNo
TGluZUJveCh0aGlzKTsKIH0KIAorUmVuZGVyQmxvY2sqIFJvb3RJbmxpbmVCb3g6OmFub255bW91
c0lubGluZUJsb2NrKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZmlyc3RDaGlsZCgpICYmIGZpcnN0
Q2hpbGQoKSA9PSBsYXN0Q2hpbGQoKSAmJiAhZmlyc3RDaGlsZCgpLT5pc1RleHQoKSAmJiBmaXJz
dENoaWxkKCktPnJlbmRlcmVyKCktPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSA/IHRvUmVuZGVy
QmxvY2soZmlyc3RDaGlsZCgpLT5yZW5kZXJlcigpKSA6IDA7Cit9CisKIH0gLy8gbmFtZXNwYWNl
IFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1Jvb3RJbmxpbmVCb3guaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9Sb290SW5saW5lQm94LmgJKHJldmlzaW9uIDU0NTAx
KQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUm9vdElubGluZUJveC5oCSh3b3JraW5nIGNvcHkpCkBA
IC0xMzIsNiArMTMyLDggQEAgcHVibGljOgogICAgIHZpcnR1YWwgdm9pZCBhdHRhY2hMaW5lQm94
VG9SZW5kZXJPYmplY3QoKTsKICAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlTGluZUJveEZyb21SZW5k
ZXJPYmplY3QoKTsKIAorICAgIFJlbmRlckJsb2NrKiBhbm9ueW1vdXNJbmxpbmVCbG9jaygpIGNv
bnN0OworCiBwcm90ZWN0ZWQ6CiAgICAgLy8gV2hlcmUgdGhpcyBsaW5lIGVuZGVkLiAgVGhlIGV4
YWN0IG9iamVjdCBhbmQgdGhlIHBvc2l0aW9uIHdpdGhpbiB0aGF0IG9iamVjdCBhcmUgc3RvcmVk
IHNvIHRoYXQKICAgICAvLyB3ZSBjYW4gY3JlYXRlIGFuIElubGluZUl0ZXJhdG9yIGJlZ2lubmlu
ZyBqdXN0IGFmdGVyIHRoZSBlbmQgb2YgdGhpcyBsaW5lLgo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>48356</attachid>
            <date>2010-02-08 13:03:35 -0800</date>
            <delta_ts>2010-02-08 23:48:29 -0800</delta_ts>
            <desc>Fix failing ruby layout tests.</desc>
            <filename>patch.txt</filename>
            <type>text/plain</type>
            <size>83288</size>
            <attacher name="Dave Hyatt">hyatt</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0LmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eVJlbmRl
ck9iamVjdC5jcHAJKHJldmlzaW9uIDU0NTAxKQorKysgV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0Fj
Y2Vzc2liaWxpdHlSZW5kZXJPYmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01NjcsMTIgKzU2
Nyw4IEBAIEVsZW1lbnQqIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmFuY2gKICAgICBSZW5k
ZXJPYmplY3QqIGN1cnJSZW5kZXJlcjsKICAgICAKICAgICAvLyBTZWFyY2ggdXAgdGhlIHJlbmRl
ciB0cmVlIGZvciBhIFJlbmRlck9iamVjdCB3aXRoIGEgRE9NIG5vZGUuICBEZWZlciB0byBhbiBl
YXJsaWVyIGNvbnRpbnVhdGlvbiwgdGhvdWdoLgotICAgIGZvciAoY3VyclJlbmRlcmVyID0gbV9y
ZW5kZXJlcjsgY3VyclJlbmRlcmVyICYmICFjdXJyUmVuZGVyZXItPm5vZGUoKTsgY3VyclJlbmRl
cmVyID0gY3VyclJlbmRlcmVyLT5wYXJlbnQoKSkgewotICAgICAgICBpZiAoY3VyclJlbmRlcmVy
LT5pc1JlbmRlckJsb2NrKCkpIHsKLSAgICAgICAgICAgIFJlbmRlcklubGluZSogY29udGludWF0
aW9uID0gdG9SZW5kZXJCbG9jayhjdXJyUmVuZGVyZXIpLT5pbmxpbmVDb250aW51YXRpb24oKTsK
LSAgICAgICAgICAgIGlmIChjb250aW51YXRpb24pCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNh
Y2hlLT5nZXRPckNyZWF0ZShjb250aW51YXRpb24pLT5hbmNob3JFbGVtZW50KCk7Ci0gICAgICAg
IH0KKyAgICBmb3IgKGN1cnJSZW5kZXJlciA9IG1fcmVuZGVyZXI7IGN1cnJSZW5kZXJlciAmJiAh
Y3VyclJlbmRlcmVyLT5ub2RlKCk7IGN1cnJSZW5kZXJlciA9IGN1cnJSZW5kZXJlci0+cGFyZW50
KCkpCisgICAgewogICAgIH0KICAgICAKICAgICAvLyBiYWlsIGlmIG5vbmUgZm91bmQKSW5kZXg6
IFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUZsb3dCb3guY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvcmVuZGVyaW5nL0lubGluZUZsb3dCb3guY3BwCShyZXZpc2lvbiA1NDUwMSkKKysrIFdlYkNv
cmUvcmVuZGVyaW5nL0lubGluZUZsb3dCb3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMjcsMTQg
KzIyNywxMyBAQCB2b2lkIElubGluZUZsb3dCb3g6OmRldGVybWluZVNwYWNpbmdGb3JGCiAgICAg
ICAgIC8vICgzKSBUaGUgbGluZSBtYXkgZW5kIG9uIHRoZSBpbmxpbmUuICBJZiB3ZSBhcmUgdGhl
IGxhc3QgY2hpbGQgKGNsaW1iaW5nIHVwCiAgICAgICAgIC8vIHRoZSBlbmQgb2JqZWN0J3MgY2hh
aW4pLCB0aGVuIHdlIGp1c3QgY2xvc2VkIGFzIHdlbGwuCiAgICAgICAgIGlmICghbGluZUJveExp
c3QtPmxhc3RMaW5lQm94KCktPmlzQ29uc3RydWN0ZWQoKSkgewotICAgICAgICAgICAgUmVuZGVy
SW5saW5lKiBpbmxpbmVGbG93ID0gdG9SZW5kZXJJbmxpbmUocmVuZGVyZXIoKSk7CiAgICAgICAg
ICAgICBpZiAobHRyKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFuZXh0TGluZUJveCgpICYmCi0g
ICAgICAgICAgICAgICAgICAgICgobGFzdExpbmUgJiYgIWlubGluZUZsb3ctPmNvbnRpbnVhdGlv
bigpKSB8fCBuZXh0T25MaW5lRXhpc3RzKCkgfHwgb25FbmRDaGFpbihlbmRPYmplY3QpKSkKKyAg
ICAgICAgICAgICAgICAgICAgKGxhc3RMaW5lIHx8IG5leHRPbkxpbmVFeGlzdHMoKSB8fCBvbkVu
ZENoYWluKGVuZE9iamVjdCkpKQogICAgICAgICAgICAgICAgICAgICBpbmNsdWRlUmlnaHRFZGdl
ID0gdHJ1ZTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKCghcHJl
dkxpbmVCb3goKSB8fCBwcmV2TGluZUJveCgpLT5pc0NvbnN0cnVjdGVkKCkpICYmCi0gICAgICAg
ICAgICAgICAgICAgICgobGFzdExpbmUgJiYgIWlubGluZUZsb3ctPmNvbnRpbnVhdGlvbigpKSB8
fCBwcmV2T25MaW5lRXhpc3RzKCkgfHwgb25FbmRDaGFpbihlbmRPYmplY3QpKSkKKyAgICAgICAg
ICAgICAgICAgICAgKGxhc3RMaW5lIHx8IHByZXZPbkxpbmVFeGlzdHMoKSB8fCBvbkVuZENoYWlu
KGVuZE9iamVjdCkpKQogICAgICAgICAgICAgICAgICAgICBpbmNsdWRlTGVmdEVkZ2UgPSB0cnVl
OwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC01MDQsNyArNTAzLDcgQEAgdm9pZCBJbmxp
bmVGbG93Qm94OjpwbGFjZUJveGVzVmVydGljYWxseQogICAgICAgICAgICAgICAgIG5ld1kgLT0g
Y3Vyci0+Ym94TW9kZWxPYmplY3QoKS0+Ym9yZGVyVG9wKCkgKyBjdXJyLT5ib3hNb2RlbE9iamVj
dCgpLT5wYWRkaW5nVG9wKCk7CiAgICAgICAgIH0gZWxzZSBpZiAoIWN1cnItPnJlbmRlcmVyKCkt
PmlzQlIoKSkgewogICAgICAgICAgICAgUmVuZGVyQm94KiBib3ggPSB0b1JlbmRlckJveChjdXJy
LT5yZW5kZXJlcigpKTsKLSAgICAgICAgICAgIG5ld1kgKz0gYm94LT5tYXJnaW5Ub3AoKTsKKyAg
ICAgICAgICAgIG5ld1kgKz0gY3Vyci0+cmVuZGVyZXIoKS0+aXNBbm9ueW1vdXNJbmxpbmVCbG9j
aygpID8gMCA6IGJveC0+bWFyZ2luVG9wKCk7CiAgICAgICAgIH0KIAogICAgICAgICBjdXJyLT5z
ZXRZKG5ld1kpOwpAQCAtNjM4LDEzICs2MzcsNyBAQCB2b2lkIElubGluZUZsb3dCb3g6OnBhaW50
KFJlbmRlck9iamVjdDo6CiAgICAgICAgICAgICAvLyBvdXRsaW5lcy4KICAgICAgICAgICAgIGlm
IChyZW5kZXJlcigpLT5zdHlsZSgpLT52aXNpYmlsaXR5KCkgPT0gVklTSUJMRSAmJiByZW5kZXJl
cigpLT5oYXNPdXRsaW5lKCkgJiYgIWlzUm9vdElubGluZUJveCgpKSB7CiAgICAgICAgICAgICAg
ICAgUmVuZGVySW5saW5lKiBpbmxpbmVGbG93ID0gdG9SZW5kZXJJbmxpbmUocmVuZGVyZXIoKSk7
Ci0gICAgICAgICAgICAgICAgaWYgKChpbmxpbmVGbG93LT5jb250aW51YXRpb24oKSB8fCBpbmxp
bmVGbG93LT5pc0lubGluZUNvbnRpbnVhdGlvbigpKSAmJiAhYm94TW9kZWxPYmplY3QoKS0+aGFz
U2VsZlBhaW50aW5nTGF5ZXIoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBBZGQgb3Vyc2Vs
dmVzIHRvIHRoZSBjb250YWluaW5nIGJsb2NrIG9mIHRoZSBlbnRpcmUgY29udGludWF0aW9uIHNv
IHRoYXQgaXQgY2FuCi0gICAgICAgICAgICAgICAgICAgIC8vIHBhaW50IHVzIGF0b21pY2FsbHku
Ci0gICAgICAgICAgICAgICAgICAgIFJlbmRlckJsb2NrKiBibG9jayA9IHJlbmRlcmVyKCktPmNv
bnRhaW5pbmdCbG9jaygpLT5jb250YWluaW5nQmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAg
YmxvY2stPmFkZENvbnRpbnVhdGlvbldpdGhPdXRsaW5lKHRvUmVuZGVySW5saW5lKHJlbmRlcmVy
KCktPm5vZGUoKS0+cmVuZGVyZXIoKSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlu
bGluZUZsb3ctPmlzSW5saW5lQ29udGludWF0aW9uKCkpCi0gICAgICAgICAgICAgICAgICAgIHBh
aW50SW5mby5vdXRsaW5lT2JqZWN0cy0+YWRkKGlubGluZUZsb3cpOworICAgICAgICAgICAgICAg
IHBhaW50SW5mby5vdXRsaW5lT2JqZWN0cy0+YWRkKGlubGluZUZsb3cpOwogICAgICAgICAgICAg
fQogICAgICAgICB9IGVsc2UgaWYgKHBhaW50SW5mby5waGFzZSA9PSBQYWludFBoYXNlTWFzaykg
ewogICAgICAgICAgICAgcGFpbnRNYXNrKHBhaW50SW5mbywgdHgsIHR5KTsKSW5kZXg6IFdlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRl
cmluZy9SZW5kZXJCbG9jay5jcHAJKHJldmlzaW9uIDU0NTAxKQorKysgV2ViQ29yZS9yZW5kZXJp
bmcvUmVuZGVyQmxvY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC03Nyw4ICs3Nyw2IEBAIHN0YXRp
YyBQZXJjZW50SGVpZ2h0RGVzY2VuZGFudHNNYXAqIGdQZXIKIAogdHlwZWRlZiBXVEY6Okhhc2hN
YXA8Y29uc3QgUmVuZGVyQm94KiwgSGFzaFNldDxSZW5kZXJCbG9jayo+Kj4gUGVyY2VudEhlaWdo
dENvbnRhaW5lck1hcDsKIHN0YXRpYyBQZXJjZW50SGVpZ2h0Q29udGFpbmVyTWFwKiBnUGVyY2Vu
dEhlaWdodENvbnRhaW5lck1hcCA9IDA7Ci0gICAgCi10eXBlZGVmIFdURjo6SGFzaE1hcDxSZW5k
ZXJCbG9jayosIExpc3RIYXNoU2V0PFJlbmRlcklubGluZSo+Kj4gQ29udGludWF0aW9uT3V0bGlu
ZVRhYmxlTWFwOwogCiB0eXBlZGVmIFdURjo6SGFzaFNldDxSZW5kZXJCbG9jayo+IERlbGF5ZWRV
cGRhdGVTY3JvbGxJbmZvU2V0Owogc3RhdGljIGludCBnRGVsYXlVcGRhdGVTY3JvbGxJbmZvID0g
MDsKQEAgLTkxLDcgKzg5LDcgQEAgUmVuZGVyQmxvY2s6Ok1hcmdpbkluZm86Ok1hcmdpbkluZm8o
UmVuZAogICAgIC8vIGlmIHdlIGhhZCBhbnkgYm9yZGVyL3BhZGRpbmcgKG9idmlvdXNseSksIGlm
IHdlJ3JlIHRoZSByb290IG9yIEhUTUwgZWxlbWVudHMsIG9yIGlmCiAgICAgLy8gd2UncmUgcG9z
aXRpb25lZCwgZmxvYXRpbmcsIGEgdGFibGUgY2VsbC4KICAgICBtX2NhbkNvbGxhcHNlV2l0aENo
aWxkcmVuID0gIWJsb2NrLT5pc1JlbmRlclZpZXcoKSAmJiAhYmxvY2stPmlzUm9vdCgpICYmICFi
bG9jay0+aXNQb3NpdGlvbmVkKCkgJiYKLSAgICAgICAgIWJsb2NrLT5pc0Zsb2F0aW5nKCkgJiYg
IWJsb2NrLT5pc1RhYmxlQ2VsbCgpICYmICFibG9jay0+aGFzT3ZlcmZsb3dDbGlwKCkgJiYgIWJs
b2NrLT5pc0lubGluZUJsb2NrT3JJbmxpbmVUYWJsZSgpOworICAgICAgICAhYmxvY2stPmlzRmxv
YXRpbmcoKSAmJiAhYmxvY2stPmlzVGFibGVDZWxsKCkgJiYgIWJsb2NrLT5oYXNPdmVyZmxvd0Ns
aXAoKSAmJiAoIWJsb2NrLT5pc0lubGluZUJsb2NrT3JJbmxpbmVUYWJsZSgpIHx8IGJsb2NrLT5p
c0Fub255bW91c0lubGluZUJsb2NrKCkpOwogCiAgICAgbV9jYW5Db2xsYXBzZVRvcFdpdGhDaGls
ZHJlbiA9IG1fY2FuQ29sbGFwc2VXaXRoQ2hpbGRyZW4gJiYgKHRvcCA9PSAwKSAmJiBibG9jay0+
c3R5bGUoKS0+bWFyZ2luVG9wQ29sbGFwc2UoKSAhPSBNU0VQQVJBVEU7CiAKQEAgLTEyMCw3ICsx
MTgsNiBAQCBSZW5kZXJCbG9jazo6UmVuZGVyQmxvY2soTm9kZSogbm9kZSkKICAgICAgIDogUmVu
ZGVyQm94KG5vZGUpCiAgICAgICAsIG1fZmxvYXRpbmdPYmplY3RzKDApCiAgICAgICAsIG1fcG9z
aXRpb25lZE9iamVjdHMoMCkKLSAgICAgICwgbV9pbmxpbmVDb250aW51YXRpb24oMCkKICAgICAg
ICwgbV9tYXhNYXJnaW4oMCkKICAgICAgICwgbV9saW5lSGVpZ2h0KC0xKQogewpAQCAtMTYxLDE0
ICsxNTgsNiBAQCB2b2lkIFJlbmRlckJsb2NrOjpkZXN0cm95KCkKICAgICAvLyBNYWtlIHN1cmUg
dG8gZGVzdHJveSBhbm9ueW1vdXMgY2hpbGRyZW4gZmlyc3Qgd2hpbGUgdGhleSBhcmUgc3RpbGwg
Y29ubmVjdGVkIHRvIHRoZSByZXN0IG9mIHRoZSB0cmVlLCBzbyB0aGF0IHRoZXkgd2lsbAogICAg
IC8vIHByb3Blcmx5IGRpcnR5IGxpbmUgYm94ZXMgdGhhdCB0aGV5IGFyZSByZW1vdmVkIGZyb20u
IEVmZmVjdHMgdGhhdCBkbyA6YmVmb3JlLzphZnRlciBvbmx5IG9uIGhvdmVyIGNvdWxkIGNyYXNo
IG90aGVyd2lzZS4KICAgICBjaGlsZHJlbigpLT5kZXN0cm95TGVmdG92ZXJDaGlsZHJlbigpOwot
Ci0gICAgLy8gRGVzdHJveSBvdXIgY29udGludWF0aW9uIGJlZm9yZSBhbnl0aGluZyBvdGhlciB0
aGFuIGFub255bW91cyBjaGlsZHJlbi4KLSAgICAvLyBUaGUgcmVhc29uIHdlIGRvbid0IGRlc3Ry
b3kgaXQgYmVmb3JlIGFub255bW91cyBjaGlsZHJlbiBpcyB0aGF0IHRoZXkgbWF5Ci0gICAgLy8g
aGF2ZSBjb250aW51YXRpb25zIG9mIHRoZWlyIG93biB0aGF0IGFyZSBhbm9ueW1vdXMgY2hpbGRy
ZW4gb2Ygb3VyIGNvbnRpbnVhdGlvbi4KLSAgICBpZiAobV9pbmxpbmVDb250aW51YXRpb24pIHsK
LSAgICAgICAgbV9pbmxpbmVDb250aW51YXRpb24tPmRlc3Ryb3koKTsKLSAgICAgICAgbV9pbmxp
bmVDb250aW51YXRpb24gPSAwOwotICAgIH0KICAgICAKICAgICBpZiAoIWRvY3VtZW50QmVpbmdE
ZXN0cm95ZWQoKSkgewogICAgICAgICBpZiAoZmlyc3RMaW5lQm94KCkpIHsKQEAgLTMxNiw3ICsz
MDUsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjphZGRDaGlsZChSZW5kZXJPYmplY3QqCiAgICAgICAg
IH0KICAgICB9IGVsc2UgaWYgKCFjaGlsZHJlbklubGluZSgpICYmIChuZXdDaGlsZC0+aXNGbG9h
dGluZ09yUG9zaXRpb25lZCgpIHx8IG5ld0NoaWxkLT5pc0lubGluZSgpKSkgewogICAgICAgICAv
LyBJZiB3ZSdyZSBpbnNlcnRpbmcgYW4gaW5saW5lIGNoaWxkIGJ1dCBhbGwgb2Ygb3VyIGNoaWxk
cmVuIGFyZSBibG9ja3MsIHRoZW4gd2UgaGF2ZSB0byBtYWtlIHN1cmUKLSAgICAgICAgLy8gaXQg
aXMgcHV0IGludG8gYW4gYW5vbXlvdXMgYmxvY2sgYm94LiBXZSB0cnkgdG8gdXNlIGFuIGV4aXN0
aW5nIGFub255bW91cyBib3ggaWYgcG9zc2libGUsIG90aGVyd2lzZQorICAgICAgICAvLyBpdCBp
cyBwdXQgaW50byBhbiBhbm9ueW1vdXMgYmxvY2sgYm94LiBXZSB0cnkgdG8gdXNlIGFuIGV4aXN0
aW5nIGFub255bW91cyBib3ggaWYgcG9zc2libGUsIG90aGVyd2lzZQogICAgICAgICAvLyBhIG5l
dyBvbmUgaXMgY3JlYXRlZCBhbmQgaW5zZXJ0ZWQgaW50byBvdXIgbGlzdCBvZiBjaGlsZHJlbiBp
biB0aGUgYXBwcm9wcmlhdGUgcG9zaXRpb24uCiAgICAgICAgIFJlbmRlck9iamVjdCogYWZ0ZXJD
aGlsZCA9IGJlZm9yZUNoaWxkID8gYmVmb3JlQ2hpbGQtPnByZXZpb3VzU2libGluZygpIDogbGFz
dENoaWxkKCk7CiAKQEAgLTQ5MCw5ICs0NzksNiBAQCB2b2lkIFJlbmRlckJsb2NrOjpyZW1vdmVM
ZWZ0b3ZlckFub255bW91CiAgICAgQVNTRVJUKGNoaWxkLT5pc0Fub255bW91c0Jsb2NrKCkpOwog
ICAgIEFTU0VSVCghY2hpbGQtPmNoaWxkcmVuSW5saW5lKCkpOwogICAgIAotICAgIGlmIChjaGls
ZC0+aW5saW5lQ29udGludWF0aW9uKCkpIAotICAgICAgICByZXR1cm47Ci0gICAgCiAgICAgUmVu
ZGVyT2JqZWN0KiBmaXJzdEFuQ2hpbGQgPSBjaGlsZC0+bV9jaGlsZHJlbi5maXJzdENoaWxkKCk7
CiAgICAgUmVuZGVyT2JqZWN0KiBsYXN0QW5DaGlsZCA9IGNoaWxkLT5tX2NoaWxkcmVuLmxhc3RD
aGlsZCgpOwogICAgIGlmIChmaXJzdEFuQ2hpbGQpIHsKQEAgLTUzNSw3ICs1MjEsNyBAQCB2b2lk
IFJlbmRlckJsb2NrOjpyZW1vdmVDaGlsZChSZW5kZXJPYmplCiAgICAgUmVuZGVyT2JqZWN0KiBw
cmV2ID0gb2xkQ2hpbGQtPnByZXZpb3VzU2libGluZygpOwogICAgIFJlbmRlck9iamVjdCogbmV4
dCA9IG9sZENoaWxkLT5uZXh0U2libGluZygpOwogICAgIGJvb2wgY2FuRGVsZXRlQW5vbnltb3Vz
QmxvY2tzID0gIWRvY3VtZW50QmVpbmdEZXN0cm95ZWQoKSAmJiAhaXNJbmxpbmUoKSAmJiAhb2xk
Q2hpbGQtPmlzSW5saW5lKCkgJiYgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAoIW9sZENoaWxkLT5pc1JlbmRlckJsb2NrKCkgfHwgIXRvUmVuZGVyQmxvY2sob2xkQ2hpbGQp
LT5pbmxpbmVDb250aW51YXRpb24oKSkgJiYgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAhb2xkQ2hpbGQtPmlzUmVuZGVyQmxvY2soKSAmJiAKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICghcHJldiB8fCAocHJldi0+aXNBbm9ueW1vdXNCbG9jaygpICYm
IHByZXYtPmNoaWxkcmVuSW5saW5lKCkpKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgKCFuZXh0IHx8IChuZXh0LT5pc0Fub255bW91c0Jsb2NrKCkgJiYgbmV4dC0+Y2hp
bGRyZW5JbmxpbmUoKSkpOwogICAgIGlmIChjYW5EZWxldGVBbm9ueW1vdXNCbG9ja3MgJiYgcHJl
diAmJiBuZXh0KSB7CkBAIC01OTgsOSArNTg0LDE1IEBAIGJvb2wgUmVuZGVyQmxvY2s6OmlzU2Vs
ZkNvbGxhcHNpbmdCbG9jaygKICAgICAvLyBvbiB3aGV0aGVyIHdlIGhhdmUgY29udGVudCB0aGF0
IGlzIGFsbCBzZWxmLWNvbGxhcHNpbmcgb3Igbm90LgogICAgIGlmIChoYXNBdXRvSGVpZ2h0IHx8
ICgoc3R5bGUoKS0+aGVpZ2h0KCkuaXNGaXhlZCgpIHx8IHN0eWxlKCktPmhlaWdodCgpLmlzUGVy
Y2VudCgpKSAmJiBzdHlsZSgpLT5oZWlnaHQoKS5pc1plcm8oKSkpIHsKICAgICAgICAgLy8gSWYg
dGhlIGJsb2NrIGhhcyBpbmxpbmUgY2hpbGRyZW4sIHNlZSBpZiB3ZSBnZW5lcmF0ZWQgYW55IGxp
bmUgYm94ZXMuICBJZiB3ZSBoYXZlIGFueQotICAgICAgICAvLyBsaW5lIGJveGVzLCB0aGVuIHdl
IGNhbid0IGJlIHNlbGYtY29sbGFwc2luZywgc2luY2Ugd2UgaGF2ZSBjb250ZW50LgotICAgICAg
ICBpZiAoY2hpbGRyZW5JbmxpbmUoKSkKLSAgICAgICAgICAgIHJldHVybiAhZmlyc3RMaW5lQm94
KCk7CisgICAgICAgIC8vIGxpbmUgYm94ZXMsIHRoZW4gd2UgY2FuIG9ubHkgYmUgc2VsZi1jb2xs
YXBzaW5nIGlmIHdlIGhhdmUgbm90aGluZyBidXQgYW5vbnltb3VzIGlubGluZSBibG9ja3MKKyAg
ICAgICAgLy8gdGhhdCBhcmUgYWxzbyBzZWxmLWNvbGxhcHNpbmcgaW5zaWRlIHVzLgorICAgICAg
ICBpZiAoY2hpbGRyZW5JbmxpbmUoKSkgeworICAgICAgICAgICAgZm9yIChSb290SW5saW5lQm94
KiBjaGlsZCA9IGZpcnN0Um9vdEJveCgpOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dFJvb3RC
b3goKSkgeworICAgICAgICAgICAgICAgIGlmICghY2hpbGQtPmFub255bW91c0lubGluZUJsb2Nr
KCkgfHwgIWNoaWxkLT5hbm9ueW1vdXNJbmxpbmVCbG9jaygpLT5pc1NlbGZDb2xsYXBzaW5nQmxv
Y2soKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQor
ICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIFdlIGhhdmUgbm8gbGluZSBib3hlcywgc28gd2Ug
bXVzdCBiZSBzZWxmLWNvbGxhcHNpbmcuCisgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIC8v
IFdoZXRoZXIgb3Igbm90IHdlIGNvbGxhcHNlIGlzIGRlcGVuZGVudCBvbiB3aGV0aGVyIGFsbCBv
dXIgbm9ybWFsIGZsb3cgY2hpbGRyZW4KICAgICAgICAgLy8gYXJlIGFsc28gc2VsZi1jb2xsYXBz
aW5nLgpAQCAtODU1LDcgKzg0Nyw4IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmFkZE92ZXJmbG93RnJv
bUZsb2F0cygKIAogYm9vbCBSZW5kZXJCbG9jazo6ZXhwYW5kc1RvRW5jbG9zZU92ZXJoYW5naW5n
RmxvYXRzKCkgY29uc3QKIHsKLSAgICByZXR1cm4gaXNJbmxpbmVCbG9ja09ySW5saW5lVGFibGUo
KSB8fCBpc0Zsb2F0aW5nT3JQb3NpdGlvbmVkKCkgfHwgaGFzT3ZlcmZsb3dDbGlwKCkgfHwgKHBh
cmVudCgpICYmIHBhcmVudCgpLT5pc0ZsZXhpYmxlQm94KCkpIHx8IGhhc0NvbHVtbnMoKSB8fCBp
c1RhYmxlQ2VsbCgpIHx8IGlzRmllbGRzZXQoKTsKKyAgICByZXR1cm4gaXNGbG9hdGluZ09yUG9z
aXRpb25lZCgpIHx8IGhhc092ZXJmbG93Q2xpcCgpIHx8IChwYXJlbnQoKSAmJiBwYXJlbnQoKS0+
aXNGbGV4aWJsZUJveCgpKSB8fCBoYXNDb2x1bW5zKCkgfHwgaXNUYWJsZUNlbGwoKSB8fCBpc0Zp
ZWxkc2V0KCkgfHwKKyAgICAgICAgICAgKGlzSW5saW5lQmxvY2tPcklubGluZVRhYmxlKCkgJiYg
IWlzQW5vbnltb3VzSW5saW5lQmxvY2soKSk7CiB9CiAKIHZvaWQgUmVuZGVyQmxvY2s6OmFkanVz
dFBvc2l0aW9uZWRCbG9jayhSZW5kZXJCb3gqIGNoaWxkLCBjb25zdCBNYXJnaW5JbmZvJiBtYXJn
aW5JbmZvKQpAQCAtMTAwMSwxOSArOTk0LDE5IEBAIGJvb2wgUmVuZGVyQmxvY2s6OmhhbmRsZVJ1
bkluQ2hpbGQoUmVuZGUKIGludCBSZW5kZXJCbG9jazo6Y29sbGFwc2VNYXJnaW5zKFJlbmRlckJv
eCogY2hpbGQsIE1hcmdpbkluZm8mIG1hcmdpbkluZm8pCiB7CiAgICAgLy8gR2V0IG91ciBtYXgg
cG9zIGFuZCBuZWcgdG9wIG1hcmdpbnMuCi0gICAgaW50IHBvc1RvcCA9IGNoaWxkLT5tYXhUb3BN
YXJnaW4odHJ1ZSk7Ci0gICAgaW50IG5lZ1RvcCA9IGNoaWxkLT5tYXhUb3BNYXJnaW4oZmFsc2Up
OworICAgIGludCBwb3NUb3AgPSBjaGlsZCA/IGNoaWxkLT5tYXhUb3BNYXJnaW4odHJ1ZSkgOiAw
OworICAgIGludCBuZWdUb3AgPSBjaGlsZCA/IGNoaWxkLT5tYXhUb3BNYXJnaW4oZmFsc2UpIDog
MDsKIAogICAgIC8vIEZvciBzZWxmLWNvbGxhcHNpbmcgYmxvY2tzLCBjb2xsYXBzZSBvdXIgYm90
dG9tIG1hcmdpbnMgaW50byBvdXIKICAgICAvLyB0b3AgdG8gZ2V0IG5ldyBwb3NUb3AgYW5kIG5l
Z1RvcCB2YWx1ZXMuCi0gICAgaWYgKGNoaWxkLT5pc1NlbGZDb2xsYXBzaW5nQmxvY2soKSkgewor
ICAgIGlmIChjaGlsZCAmJiBjaGlsZC0+aXNTZWxmQ29sbGFwc2luZ0Jsb2NrKCkpIHsKICAgICAg
ICAgcG9zVG9wID0gbWF4KHBvc1RvcCwgY2hpbGQtPm1heEJvdHRvbU1hcmdpbih0cnVlKSk7CiAg
ICAgICAgIG5lZ1RvcCA9IG1heChuZWdUb3AsIGNoaWxkLT5tYXhCb3R0b21NYXJnaW4oZmFsc2Up
KTsKICAgICB9CiAgICAgCiAgICAgLy8gU2VlIGlmIHRoZSB0b3AgbWFyZ2luIGlzIHF1aXJreS4g
V2Ugb25seSBjYXJlIGlmIHRoaXMgY2hpbGQgaGFzCiAgICAgLy8gbWFyZ2lucyB0aGF0IHdpbGwg
Y29sbGFwc2Ugd2l0aCB1cy4KLSAgICBib29sIHRvcFF1aXJrID0gY2hpbGQtPmlzVG9wTWFyZ2lu
UXVpcmsoKSB8fCBzdHlsZSgpLT5tYXJnaW5Ub3BDb2xsYXBzZSgpID09IE1ESVNDQVJEOworICAg
IGJvb2wgdG9wUXVpcmsgPSAoY2hpbGQgJiYgY2hpbGQtPmlzVG9wTWFyZ2luUXVpcmsoKSkgfHwg
c3R5bGUoKS0+bWFyZ2luVG9wQ29sbGFwc2UoKSA9PSBNRElTQ0FSRDsKIAogICAgIGlmIChtYXJn
aW5JbmZvLmNhbkNvbGxhcHNlV2l0aFRvcCgpKSB7CiAgICAgICAgIC8vIFRoaXMgY2hpbGQgaXMg
Y29sbGFwc2luZyB3aXRoIHRoZSB0b3Agb2YgdGhlCkBAIC0xMDI2LDcgKzEwMTksNyBAQCBpbnQg
UmVuZGVyQmxvY2s6OmNvbGxhcHNlTWFyZ2lucyhSZW5kZXJCCiAgICAgICAgIC8vIGNvbGxhcHNl
IGl0IGF3YXksIGV2ZW4gaWYgdGhlIG1hcmdpbiBpcyBzbWFsbGVyICh3d3cud2VicmVmZXJlbmNl
LmNvbQogICAgICAgICAvLyBoYXMgYW4gZXhhbXBsZSBvZiB0aGlzLCBhIDxkdD4gd2l0aCAwLjhl
bSBhdXRob3Itc3BlY2lmaWVkIGluc2lkZQogICAgICAgICAvLyBhIDxkbD4gaW5zaWRlIGEgPHRk
Pi4KLSAgICAgICAgaWYgKCFtYXJnaW5JbmZvLmRldGVybWluZWRUb3BRdWlyaygpICYmICF0b3BR
dWlyayAmJiAocG9zVG9wLW5lZ1RvcCkpIHsKKyAgICAgICAgaWYgKCFtYXJnaW5JbmZvLmRldGVy
bWluZWRUb3BRdWlyaygpICYmICF0b3BRdWlyayAmJiAocG9zVG9wIC0gbmVnVG9wKSkgewogICAg
ICAgICAgICAgc2V0VG9wTWFyZ2luUXVpcmsoZmFsc2UpOwogICAgICAgICAgICAgbWFyZ2luSW5m
by5zZXREZXRlcm1pbmVkVG9wUXVpcmsodHJ1ZSk7CiAgICAgICAgIH0KQEAgLTEwNDQsNyArMTAz
Nyw3IEBAIGludCBSZW5kZXJCbG9jazo6Y29sbGFwc2VNYXJnaW5zKFJlbmRlckIKICAgICAgICAg
bWFyZ2luSW5mby5zZXRUb3BRdWlyayh0b3BRdWlyayk7CiAKICAgICBpbnQgeXBvcyA9IGhlaWdo
dCgpOwotICAgIGlmIChjaGlsZC0+aXNTZWxmQ29sbGFwc2luZ0Jsb2NrKCkpIHsKKyAgICBpZiAo
Y2hpbGQgJiYgY2hpbGQtPmlzU2VsZkNvbGxhcHNpbmdCbG9jaygpKSB7CiAgICAgICAgIC8vIFRo
aXMgY2hpbGQgaGFzIG5vIGhlaWdodC4gIFdlIG5lZWQgdG8gY29tcHV0ZSBvdXIKICAgICAgICAg
Ly8gcG9zaXRpb24gYmVmb3JlIHdlIGNvbGxhcHNlIHRoZSBjaGlsZCdzIG1hcmdpbnMgdG9nZXRo
ZXIsCiAgICAgICAgIC8vIHNvIHRoYXQgd2UgY2FuIGdldCBhbiBhY2N1cmF0ZSBwb3NpdGlvbiBm
b3IgdGhlIHplcm8taGVpZ2h0IGJsb2NrLgpAQCAtMTA2MywxMyArMTA1NiwxMSBAQCBpbnQgUmVu
ZGVyQmxvY2s6OmNvbGxhcHNlTWFyZ2lucyhSZW5kZXJCCiAgICAgICAgICAgICAvLyB0aGF0IG5l
ZWRzIHRvIGJlIHBvc2l0aW9uZWQgY29ycmVjdGx5IChlLmcuLCBhIGJsb2NrIHRoYXQKICAgICAg
ICAgICAgIC8vIGhhZCBhIHNwZWNpZmllZCBoZWlnaHQgb2YgMCBidXQgdGhhdCBhY3R1YWxseSBo
YWQgc3ViY29udGVudCkuCiAgICAgICAgICAgICB5cG9zID0gaGVpZ2h0KCkgKyBjb2xsYXBzZWRU
b3BQb3MgLSBjb2xsYXBzZWRUb3BOZWc7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBpZiAo
Y2hpbGQtPnN0eWxlKCktPm1hcmdpblRvcENvbGxhcHNlKCkgPT0gTVNFUEFSQVRFKSB7CisgICAg
fSBlbHNlIHsKKyAgICAgICAgaWYgKGNoaWxkICYmIGNoaWxkLT5zdHlsZSgpLT5tYXJnaW5Ub3BD
b2xsYXBzZSgpID09IE1TRVBBUkFURSkgewogICAgICAgICAgICAgc2V0SGVpZ2h0KGhlaWdodCgp
ICsgbWFyZ2luSW5mby5tYXJnaW4oKSArIGNoaWxkLT5tYXJnaW5Ub3AoKSk7CiAgICAgICAgICAg
ICB5cG9zID0gaGVpZ2h0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIW1hcmdpbklu
Zm8uYXRUb3BPZkJsb2NrKCkgfHwKKyAgICAgICAgfSBlbHNlIGlmICghbWFyZ2luSW5mby5hdFRv
cE9mQmxvY2soKSB8fAogICAgICAgICAgICAgKCFtYXJnaW5JbmZvLmNhbkNvbGxhcHNlVG9wV2l0
aENoaWxkcmVuKCkKICAgICAgICAgICAgICAmJiAoIXN0eWxlKCktPmh0bWxIYWNrcygpIHx8ICFt
YXJnaW5JbmZvLnF1aXJrQ29udGFpbmVyKCkgfHwgIW1hcmdpbkluZm8udG9wUXVpcmsoKSkpKSB7
CiAgICAgICAgICAgICAvLyBXZSdyZSBjb2xsYXBzaW5nIHdpdGggYSBwcmV2aW91cyBzaWJsaW5n
J3MgbWFyZ2lucyBhbmQgbm90CkBAIC0xMDc4LDExICsxMDY5LDExIEBAIGludCBSZW5kZXJCbG9j
azo6Y29sbGFwc2VNYXJnaW5zKFJlbmRlckIKICAgICAgICAgICAgIHlwb3MgPSBoZWlnaHQoKTsK
ICAgICAgICAgfQogCi0gICAgICAgIG1hcmdpbkluZm8uc2V0UG9zTWFyZ2luKGNoaWxkLT5tYXhC
b3R0b21NYXJnaW4odHJ1ZSkpOwotICAgICAgICBtYXJnaW5JbmZvLnNldE5lZ01hcmdpbihjaGls
ZC0+bWF4Qm90dG9tTWFyZ2luKGZhbHNlKSk7CisgICAgICAgIG1hcmdpbkluZm8uc2V0UG9zTWFy
Z2luKGNoaWxkID8gY2hpbGQtPm1heEJvdHRvbU1hcmdpbih0cnVlKSA6IDApOworICAgICAgICBt
YXJnaW5JbmZvLnNldE5lZ01hcmdpbihjaGlsZCA/IGNoaWxkLT5tYXhCb3R0b21NYXJnaW4oZmFs
c2UpIDogMCk7CiAKICAgICAgICAgaWYgKG1hcmdpbkluZm8ubWFyZ2luKCkpCi0gICAgICAgICAg
ICBtYXJnaW5JbmZvLnNldEJvdHRvbVF1aXJrKGNoaWxkLT5pc0JvdHRvbU1hcmdpblF1aXJrKCkg
fHwgc3R5bGUoKS0+bWFyZ2luQm90dG9tQ29sbGFwc2UoKSA9PSBNRElTQ0FSRCk7CisgICAgICAg
ICAgICBtYXJnaW5JbmZvLnNldEJvdHRvbVF1aXJrKChjaGlsZCAmJiBjaGlsZC0+aXNCb3R0b21N
YXJnaW5RdWlyaygpKSB8fCBzdHlsZSgpLT5tYXJnaW5Cb3R0b21Db2xsYXBzZSgpID09IE1ESVND
QVJEKTsKICAgICB9CiAgICAgCiAgICAgcmV0dXJuIHlwb3M7CkBAIC0xNzQ5LDIwICsxNzQwLDcg
QEAgdm9pZCBSZW5kZXJCbG9jazo6cGFpbnRPYmplY3QoUGFpbnRJbmZvJgogICAgIGlmICgocGFp
bnRQaGFzZSA9PSBQYWludFBoYXNlT3V0bGluZSB8fCBwYWludFBoYXNlID09IFBhaW50UGhhc2VT
ZWxmT3V0bGluZSkgJiYgaGFzT3V0bGluZSgpICYmIHN0eWxlKCktPnZpc2liaWxpdHkoKSA9PSBW
SVNJQkxFKQogICAgICAgICBwYWludE91dGxpbmUocGFpbnRJbmZvLmNvbnRleHQsIHR4LCB0eSwg
d2lkdGgoKSwgaGVpZ2h0KCksIHN0eWxlKCkpOwogCi0gICAgLy8gNi4gcGFpbnQgY29udGludWF0
aW9uIG91dGxpbmVzLgotICAgIGlmICgocGFpbnRQaGFzZSA9PSBQYWludFBoYXNlT3V0bGluZSB8
fCBwYWludFBoYXNlID09IFBhaW50UGhhc2VDaGlsZE91dGxpbmVzKSkgewotICAgICAgICBpZiAo
aW5saW5lQ29udGludWF0aW9uKCkgJiYgaW5saW5lQ29udGludWF0aW9uKCktPmhhc091dGxpbmUo
KSAmJiBpbmxpbmVDb250aW51YXRpb24oKS0+c3R5bGUoKS0+dmlzaWJpbGl0eSgpID09IFZJU0lC
TEUpIHsKLSAgICAgICAgICAgIFJlbmRlcklubGluZSogaW5saW5lUmVuZGVyZXIgPSB0b1JlbmRl
cklubGluZShpbmxpbmVDb250aW51YXRpb24oKS0+bm9kZSgpLT5yZW5kZXJlcigpKTsKLSAgICAg
ICAgICAgIGlmICghaW5saW5lUmVuZGVyZXItPmhhc1NlbGZQYWludGluZ0xheWVyKCkpCi0gICAg
ICAgICAgICAgICAgY29udGFpbmluZ0Jsb2NrKCktPmFkZENvbnRpbnVhdGlvbldpdGhPdXRsaW5l
KGlubGluZVJlbmRlcmVyKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKCFpbmxpbmVSZW5kZXJlci0+
Zmlyc3RMaW5lQm94KCkpCi0gICAgICAgICAgICAgICAgaW5saW5lUmVuZGVyZXItPnBhaW50T3V0
bGluZShwYWludEluZm8uY29udGV4dCwgdHggLSB4KCkgKyBpbmxpbmVSZW5kZXJlci0+Y29udGFp
bmluZ0Jsb2NrKCktPngoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHR5IC0geSgpICsgaW5saW5lUmVuZGVyZXItPmNvbnRhaW5pbmdCbG9jaygpLT55KCkp
OwotICAgICAgICB9Ci0gICAgICAgIHBhaW50Q29udGludWF0aW9uT3V0bGluZXMocGFpbnRJbmZv
LCB0eCwgdHkpOwotICAgIH0KLQotICAgIC8vIDcuIHBhaW50IGNhcmV0LgorICAgIC8vIDYuIHBh
aW50IGNhcmV0LgogICAgIC8vIElmIHRoZSBjYXJldCdzIG5vZGUncyByZW5kZXIgb2JqZWN0J3Mg
Y29udGFpbmluZyBibG9jayBpcyB0aGlzIGJsb2NrLCBhbmQgdGhlIHBhaW50IGFjdGlvbiBpcyBQ
YWludFBoYXNlRm9yZWdyb3VuZCwKICAgICAvLyB0aGVuIHBhaW50IHRoZSBjYXJldC4KICAgICBp
ZiAocGFpbnRQaGFzZSA9PSBQYWludFBoYXNlRm9yZWdyb3VuZCkgeyAgICAgICAgCkBAIC0xODI1
LDU3ICsxODAzLDYgQEAgdm9pZCBSZW5kZXJCbG9jazo6cGFpbnRFbGxpcHNpc0JveGVzKFBhaQog
ICAgIH0KIH0KIAotc3RhdGljIENvbnRpbnVhdGlvbk91dGxpbmVUYWJsZU1hcCogY29udGludWF0
aW9uT3V0bGluZVRhYmxlKCkKLXsKLSAgICBERUZJTkVfU1RBVElDX0xPQ0FMKENvbnRpbnVhdGlv
bk91dGxpbmVUYWJsZU1hcCwgdGFibGUsICgpKTsKLSAgICByZXR1cm4gJnRhYmxlOwotfQotCi12
b2lkIFJlbmRlckJsb2NrOjphZGRDb250aW51YXRpb25XaXRoT3V0bGluZShSZW5kZXJJbmxpbmUq
IGZsb3cpCi17Ci0gICAgLy8gV2UgY2FuJ3QgbWFrZSB0aGlzIHdvcmsgaWYgdGhlIGlubGluZSBp
cyBpbiBhIGxheWVyLiAgV2UnbGwganVzdCByZWx5IG9uIHRoZSBicm9rZW4KLSAgICAvLyB3YXkg
b2YgcGFpbnRpbmcuCi0gICAgQVNTRVJUKCFmbG93LT5sYXllcigpICYmICFmbG93LT5pc0lubGlu
ZUNvbnRpbnVhdGlvbigpKTsKLSAgICAKLSAgICBDb250aW51YXRpb25PdXRsaW5lVGFibGVNYXAq
IHRhYmxlID0gY29udGludWF0aW9uT3V0bGluZVRhYmxlKCk7Ci0gICAgTGlzdEhhc2hTZXQ8UmVu
ZGVySW5saW5lKj4qIGNvbnRpbnVhdGlvbnMgPSB0YWJsZS0+Z2V0KHRoaXMpOwotICAgIGlmICgh
Y29udGludWF0aW9ucykgewotICAgICAgICBjb250aW51YXRpb25zID0gbmV3IExpc3RIYXNoU2V0
PFJlbmRlcklubGluZSo+OwotICAgICAgICB0YWJsZS0+c2V0KHRoaXMsIGNvbnRpbnVhdGlvbnMp
OwotICAgIH0KLSAgICAKLSAgICBjb250aW51YXRpb25zLT5hZGQoZmxvdyk7Ci19Ci0KLXZvaWQg
UmVuZGVyQmxvY2s6OnBhaW50Q29udGludWF0aW9uT3V0bGluZXMoUGFpbnRJbmZvJiBpbmZvLCBp
bnQgdHgsIGludCB0eSkKLXsKLSAgICBDb250aW51YXRpb25PdXRsaW5lVGFibGVNYXAqIHRhYmxl
ID0gY29udGludWF0aW9uT3V0bGluZVRhYmxlKCk7Ci0gICAgaWYgKHRhYmxlLT5pc0VtcHR5KCkp
Ci0gICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgTGlzdEhhc2hTZXQ8UmVuZGVySW5saW5l
Kj4qIGNvbnRpbnVhdGlvbnMgPSB0YWJsZS0+Z2V0KHRoaXMpOwotICAgIGlmICghY29udGludWF0
aW9ucykKLSAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAgICAvLyBQYWludCBlYWNoIGNvbnRp
bnVhdGlvbiBvdXRsaW5lLgotICAgIExpc3RIYXNoU2V0PFJlbmRlcklubGluZSo+OjppdGVyYXRv
ciBlbmQgPSBjb250aW51YXRpb25zLT5lbmQoKTsKLSAgICBmb3IgKExpc3RIYXNoU2V0PFJlbmRl
cklubGluZSo+OjppdGVyYXRvciBpdCA9IGNvbnRpbnVhdGlvbnMtPmJlZ2luKCk7IGl0ICE9IGVu
ZDsgKytpdCkgewotICAgICAgICAvLyBOZWVkIHRvIGFkZCBpbiB0aGUgY29vcmRpbmF0ZXMgb2Yg
dGhlIGludGVydmVuaW5nIGJsb2Nrcy4KLSAgICAgICAgUmVuZGVySW5saW5lKiBmbG93ID0gKml0
OwotICAgICAgICBSZW5kZXJCbG9jayogYmxvY2sgPSBmbG93LT5jb250YWluaW5nQmxvY2soKTsK
LSAgICAgICAgZm9yICggOyBibG9jayAmJiBibG9jayAhPSB0aGlzOyBibG9jayA9IGJsb2NrLT5j
b250YWluaW5nQmxvY2soKSkgewotICAgICAgICAgICAgdHggKz0gYmxvY2stPngoKTsKLSAgICAg
ICAgICAgIHR5ICs9IGJsb2NrLT55KCk7Ci0gICAgICAgIH0KLSAgICAgICAgQVNTRVJUKGJsb2Nr
KTsgICAKLSAgICAgICAgZmxvdy0+cGFpbnRPdXRsaW5lKGluZm8uY29udGV4dCwgdHgsIHR5KTsK
LSAgICB9Ci0gICAgCi0gICAgLy8gRGVsZXRlCi0gICAgZGVsZXRlIGNvbnRpbnVhdGlvbnM7Ci0g
ICAgdGFibGUtPnJlbW92ZSh0aGlzKTsKLX0KLQogdm9pZCBSZW5kZXJCbG9jazo6c2V0U2VsZWN0
aW9uU3RhdGUoU2VsZWN0aW9uU3RhdGUgcykKIHsKICAgICBpZiAoc2VsZWN0aW9uU3RhdGUoKSA9
PSBzKQpAQCAtMjk4NSwyNSArMjkxMiwzMSBAQCB2b2lkIFJlbmRlckJsb2NrOjpjbGVhckZsb2F0
cygpCiAgICAgLy8gb3V0IG9mIGZsb3cgKGxpa2UgZmxvYXRpbmcvcG9zaXRpb25lZCBlbGVtZW50
cyksIGFuZCB3ZSBhbHNvIHNraXAgb3ZlciBhbnkgb2JqZWN0cyB0aGF0IG1heSBoYXZlIHNoaWZ0
ZWQKICAgICAvLyB0byBhdm9pZCBmbG9hdHMuCiAgICAgYm9vbCBwYXJlbnRIYXNGbG9hdHMgPSBm
YWxzZTsKLSAgICBSZW5kZXJPYmplY3QqIHByZXYgPSBwcmV2aW91c1NpYmxpbmcoKTsKLSAgICB3
aGlsZSAocHJldiAmJiAocHJldi0+aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpIHx8ICFwcmV2LT5p
c0JveCgpIHx8ICFwcmV2LT5pc1JlbmRlckJsb2NrKCkgfHwgdG9SZW5kZXJCbG9jayhwcmV2KS0+
YXZvaWRzRmxvYXRzKCkpKSB7Ci0gICAgICAgIGlmIChwcmV2LT5pc0Zsb2F0aW5nKCkpCi0gICAg
ICAgICAgICBwYXJlbnRIYXNGbG9hdHMgPSB0cnVlOwotICAgICAgICAgcHJldiA9IHByZXYtPnBy
ZXZpb3VzU2libGluZygpOworICAgIFJlbmRlck9iamVjdCogcHJldiA9IDA7CisgICAgUmVuZGVy
QmxvY2sqIHBhcmVudEJsb2NrID0gMDsKKyAgICBpZiAoaXNBbm9ueW1vdXNJbmxpbmVCbG9jaygp
KSB7CisgICAgICAgIHBhcmVudEJsb2NrID0gY29udGFpbmluZ0Jsb2NrKCk7CisgICAgICAgIHBh
cmVudEhhc0Zsb2F0cyA9IHBhcmVudEJsb2NrLT5jb250YWluc0Zsb2F0cygpOworICAgIH0gZWxz
ZSB7ICAgIAorICAgICAgICB3aGlsZSAocHJldiAmJiAocHJldi0+aXNGbG9hdGluZ09yUG9zaXRp
b25lZCgpIHx8ICFwcmV2LT5pc0JveCgpIHx8ICFwcmV2LT5pc1JlbmRlckJsb2NrKCkgfHwgdG9S
ZW5kZXJCbG9jayhwcmV2KS0+YXZvaWRzRmxvYXRzKCkpKSB7CisgICAgICAgICAgICBpZiAocHJl
di0+aXNGbG9hdGluZygpKQorICAgICAgICAgICAgICAgIHBhcmVudEhhc0Zsb2F0cyA9IHRydWU7
CisgICAgICAgICAgICBwcmV2ID0gcHJldi0+cHJldmlvdXNTaWJsaW5nKCk7CisgICAgICAgIH0K
KyAgICAgICAgCisgICAgICAgIHBhcmVudEJsb2NrID0gcGFyZW50KCktPmlzUmVuZGVyQmxvY2so
KSA/IHRvUmVuZGVyQmxvY2socGFyZW50KCkpIDogMDsKICAgICB9CiAKICAgICAvLyBGaXJzdCBh
ZGQgaW4gZmxvYXRzIGZyb20gdGhlIHBhcmVudC4KICAgICBpbnQgb2Zmc2V0ID0geSgpOwotICAg
IGlmIChwYXJlbnRIYXNGbG9hdHMpIHsKLSAgICAgICAgUmVuZGVyQmxvY2sqIHBhcmVudEJsb2Nr
ID0gdG9SZW5kZXJCbG9jayhwYXJlbnQoKSk7CisgICAgaWYgKHBhcmVudEhhc0Zsb2F0cykKICAg
ICAgICAgYWRkSW50cnVkaW5nRmxvYXRzKHBhcmVudEJsb2NrLCBwYXJlbnRCbG9jay0+Ym9yZGVy
TGVmdCgpICsgcGFyZW50QmxvY2stPnBhZGRpbmdMZWZ0KCksIG9mZnNldCk7Ci0gICAgfQotICAg
IAorCiAgICAgaW50IHhvZmZzZXQgPSAwOwogICAgIGlmIChwcmV2KQogICAgICAgICBvZmZzZXQg
LT0gdG9SZW5kZXJCb3gocHJldiktPnkoKTsKLSAgICBlbHNlIGlmIChwYXJlbnQoKS0+aXNCb3go
KSkgewotICAgICAgICBwcmV2ID0gcGFyZW50KCk7CisgICAgZWxzZSBpZiAocGFyZW50QmxvY2sp
IHsKKyAgICAgICAgcHJldiA9IHBhcmVudEJsb2NrOwogICAgICAgICB4b2Zmc2V0ICs9IHRvUmVu
ZGVyQm94KHByZXYpLT5ib3JkZXJMZWZ0KCkgKyB0b1JlbmRlckJveChwcmV2KS0+cGFkZGluZ0xl
ZnQoKTsKICAgICB9CiAKQEAgLTMxMzgsNyArMzA3MSw3IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmFk
ZEludHJ1ZGluZ0Zsb2F0cyhSZW4KICAgICAgICAgICAgICAgICAvLyBhYm92ZS4gIHx4b2ZmfCB3
aWxsIGVxdWFsIC1mbG93LT5tYXJnaW5MZWZ0KCkgaW4gdGhpcyBjYXNlLCBzbyBpdCdzIGFscmVh
ZHkgYmVlbiB0YWtlbgogICAgICAgICAgICAgICAgIC8vIGludG8gYWNjb3VudC4gIE9ubHkgYXBw
bHkgdGhpcyBjb2RlIGlmIHxjaGlsZHwgaXMgZmFsc2UsIHNpbmNlIG90aGVyd2lzZSB0aGUgbGVm
dCBtYXJnaW4KICAgICAgICAgICAgICAgICAvLyB3aWxsIGdldCBhcHBsaWVkIHR3aWNlLgotICAg
ICAgICAgICAgICAgIGlmIChwcmV2ICE9IHBhcmVudCgpKQorICAgICAgICAgICAgICAgIGlmIChw
cmV2ICE9IGNvbnRhaW5pbmdCbG9jaygpKQogICAgICAgICAgICAgICAgICAgICBmbG9hdGluZ09i
ai0+bV9sZWZ0ICs9IHByZXYtPm1hcmdpbkxlZnQoKTsKICAgICAgICAgICAgICAgICBmbG9hdGlu
Z09iai0+bV9sZWZ0IC09IG1hcmdpbkxlZnQoKTsKICAgICAgICAgICAgICAgICBmbG9hdGluZ09i
ai0+bV9zaG91bGRQYWludCA9IGZhbHNlOyAgLy8gV2UgYXJlIG5vdCBpbiB0aGUgZGlyZWN0IGlu
aGVyaXRhbmNlIGNoYWluIGZvciB0aGlzIGZsb2F0LiBXZSB3aWxsIG5ldmVyIHBhaW50IGl0LgpA
QCAtMzE4Myw3ICszMTE2LDEzIEBAIHZvaWQgUmVuZGVyQmxvY2s6Om1hcmtBbGxEZXNjZW5kYW50
c1dpdGgKICAgICAgICAgcmVtb3ZlRmxvYXRpbmdPYmplY3QoZmxvYXRUb1JlbW92ZSk7CiAKICAg
ICAvLyBJdGVyYXRlIG92ZXIgb3VyIGNoaWxkcmVuIGFuZCBtYXJrIHRoZW0gYXMgbmVlZGVkLgot
ICAgIGlmICghY2hpbGRyZW5JbmxpbmUoKSkgeworICAgIGlmIChjaGlsZHJlbklubGluZSgpKSB7
CisgICAgICAgIGZvciAoUm9vdElubGluZUJveCogYm94ID0gZmlyc3RSb290Qm94KCk7IGJveDsg
Ym94ID0gYm94LT5uZXh0Um9vdEJveCgpKSB7CisgICAgICAgICAgICBSZW5kZXJCbG9jayogY2hp
bGRCbG9jayA9IGJveC0+YW5vbnltb3VzSW5saW5lQmxvY2soKTsKKyAgICAgICAgICAgIGlmIChj
aGlsZEJsb2NrICYmIChmbG9hdFRvUmVtb3ZlID8gY2hpbGRCbG9jay0+Y29udGFpbnNGbG9hdChm
bG9hdFRvUmVtb3ZlKSA6IGNoaWxkQmxvY2stPmNvbnRhaW5zRmxvYXRzKCkpKQorICAgICAgICAg
ICAgICAgIGNoaWxkQmxvY2stPm1hcmtBbGxEZXNjZW5kYW50c1dpdGhGbG9hdHNGb3JMYXlvdXQo
ZmxvYXRUb1JlbW92ZSwgaW5MYXlvdXQpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKICAgICAg
ICAgZm9yIChSZW5kZXJPYmplY3QqIGNoaWxkID0gZmlyc3RDaGlsZCgpOyBjaGlsZDsgY2hpbGQg
PSBjaGlsZC0+bmV4dFNpYmxpbmcoKSkgewogICAgICAgICAgICAgaWYgKCghZmxvYXRUb1JlbW92
ZSAmJiBjaGlsZC0+aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpKSB8fCAhY2hpbGQtPmlzUmVuZGVy
QmxvY2soKSkKICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTQxNDIsMTQgKzQwODEsMTUg
QEAgdm9pZCBSZW5kZXJCbG9jazo6Y2FsY0lubGluZVByZWZXaWR0aHMoKQogICAgICAgICAgICAg
ICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICBjbGVhclByZXZpb3VzRmxvYXQgPSBmYWxz
ZTsKIAotICAgICAgICAgICAgICAgIGJvb2wgY2FuQnJlYWtSZXBsYWNlZEVsZW1lbnQgPSAhY2hp
bGQtPmlzSW1hZ2UoKSB8fCBhbGxvd0ltYWdlc1RvQnJlYWs7CisgICAgICAgICAgICAgICAgYm9v
bCBjYW5CcmVha1JlcGxhY2VkRWxlbWVudCA9ICFjaGlsZC0+aXNJbWFnZSgpIHx8IGFsbG93SW1h
Z2VzVG9CcmVhayB8fCBjaGlsZC0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpOwogICAgICAgICAg
ICAgICAgIGlmICgoY2FuQnJlYWtSZXBsYWNlZEVsZW1lbnQgJiYgKGF1dG9XcmFwIHx8IG9sZEF1
dG9XcmFwKSkgfHwgY2xlYXJQcmV2aW91c0Zsb2F0KSB7CiAgICAgICAgICAgICAgICAgICAgIG1f
bWluUHJlZldpZHRoID0gbWF4KGlubGluZU1pbiwgbV9taW5QcmVmV2lkdGgpOwogICAgICAgICAg
ICAgICAgICAgICBpbmxpbmVNaW4gPSAwOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAg
ICAgICAgIC8vIElmIHdlJ3JlIHN1cHBvc2VkIHRvIGNsZWFyIHRoZSBwcmV2aW91cyBmbG9hdCwg
dGhlbiB0ZXJtaW5hdGUgbWF4d2lkdGggYXMgd2VsbC4KLSAgICAgICAgICAgICAgICBpZiAoY2xl
YXJQcmV2aW91c0Zsb2F0KSB7CisgICAgICAgICAgICAgICAgLy8gQWxzbyBkbyB0aGlzIGZvciBh
bm9ueW1vdXMgaW5saW5lIGJsb2Nrcy4KKyAgICAgICAgICAgICAgICBpZiAoY2xlYXJQcmV2aW91
c0Zsb2F0IHx8IGNoaWxkLT5pc0Fub255bW91c0lubGluZUJsb2NrKCkpIHsKICAgICAgICAgICAg
ICAgICAgICAgbV9tYXhQcmVmV2lkdGggPSBtYXgoaW5saW5lTWF4LCBtX21heFByZWZXaWR0aCk7
CiAgICAgICAgICAgICAgICAgICAgIGlubGluZU1heCA9IDA7CiAgICAgICAgICAgICAgICAgfQpA
QCAtNDE1OCwxNSArNDA5OCwxNyBAQCB2b2lkIFJlbmRlckJsb2NrOjpjYWxjSW5saW5lUHJlZldp
ZHRocygpCiAgICAgICAgICAgICAgICAgaW50IHRpID0gMDsKICAgICAgICAgICAgICAgICBpZiAo
IWFkZGVkVGV4dEluZGVudCkgewogICAgICAgICAgICAgICAgICAgICBhZGRlZFRleHRJbmRlbnQg
PSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB0aSA9IHN0eWxlKCktPnRleHRJbmRlbnQoKS5j
YWxjTWluVmFsdWUoY3cpOwotICAgICAgICAgICAgICAgICAgICBjaGlsZE1pbis9dGk7Ci0gICAg
ICAgICAgICAgICAgICAgIGNoaWxkTWF4Kz10aTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFj
aGlsZC0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CisgICAgICAgICAgICAgICAgICAgICAg
ICB0aSA9IHN0eWxlKCktPnRleHRJbmRlbnQoKS5jYWxjTWluVmFsdWUoY3cpOworICAgICAgICAg
ICAgICAgICAgICAgICAgY2hpbGRNaW4gKz0gdGk7CisgICAgICAgICAgICAgICAgICAgICAgICBj
aGlsZE1heCArPSB0aTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0K
IAogICAgICAgICAgICAgICAgIC8vIEFkZCBvdXIgd2lkdGggdG8gdGhlIG1heC4KICAgICAgICAg
ICAgICAgICBpbmxpbmVNYXggKz0gY2hpbGRNYXg7CiAKLSAgICAgICAgICAgICAgICBpZiAoIWF1
dG9XcmFwIHx8ICFjYW5CcmVha1JlcGxhY2VkRWxlbWVudCkgeworICAgICAgICAgICAgICAgIGlm
ICgoIWF1dG9XcmFwIHx8ICFjYW5CcmVha1JlcGxhY2VkRWxlbWVudCkgJiYgIWNoaWxkLT5pc0Fu
b255bW91c0lubGluZUJsb2NrKCkpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLT5p
c0Zsb2F0aW5nKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICBtX21pblByZWZXaWR0aCA9IG1h
eChjaGlsZE1pbiwgbV9taW5QcmVmV2lkdGgpOwogICAgICAgICAgICAgICAgICAgICBlbHNlCkBA
IC00MTc3LDYgKzQxMTksMTIgQEAgdm9pZCBSZW5kZXJCbG9jazo6Y2FsY0lubGluZVByZWZXaWR0
aHMoKQogCiAgICAgICAgICAgICAgICAgICAgIC8vIE5vdyBzdGFydCBhIG5ldyBsaW5lLgogICAg
ICAgICAgICAgICAgICAgICBpbmxpbmVNaW4gPSAwOworICAgICAgICAgICAgICAgICAgICAKKyAg
ICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLT5pc0Fub255bW91c0lubGluZUJsb2NrKCkpIHsK
KyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRlcm1pbmF0ZSBtYXggd2lkdGggYXMgd2VsbC4K
KyAgICAgICAgICAgICAgICAgICAgICAgIG1fbWF4UHJlZldpZHRoID0gbWF4KGNoaWxkTWF4LCBt
X21heFByZWZXaWR0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmVNYXggPSAwOwor
ICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAg
ICAgLy8gV2UgYXJlIG5vIGxvbmdlciBzdHJpcHBpbmcgd2hpdGVzcGFjZSBhdCB0aGUgc3RhcnQg
b2YKQEAgLTQ0MTcsOSArNDM2NSwxMiBAQCBpbnQgUmVuZGVyQmxvY2s6OmxpbmVIZWlnaHQoYm9v
bCBmaXJzdExpCiAgICAgLy8gdGhlIGJhc2UgY2xhc3MuICBJZiB3ZSdyZSBiZWluZyBxdWVyaWVk
IGFzIHRob3VnaCB3ZSdyZSB0aGUgcm9vdCBsaW5lCiAgICAgLy8gYm94LCB0aGVuIHRoZSBmYWN0
IHRoYXQgd2UncmUgYW4gaW5saW5lLWJsb2NrIGlzIGlycmVsZXZhbnQsIGFuZCB3ZSBiZWhhdmUK
ICAgICAvLyBqdXN0IGxpa2UgYSBibG9jay4KLSAgICBpZiAoaXNSZXBsYWNlZCgpICYmICFpc1Jv
b3RMaW5lQm94KQorICAgIGlmIChpc1JlcGxhY2VkKCkgJiYgIWlzUm9vdExpbmVCb3gpIHsKKyAg
ICAgICAgaWYgKGlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkKKyAgICAgICAgICAgIHJldHVybiBo
ZWlnaHQoKTsKICAgICAgICAgcmV0dXJuIGhlaWdodCgpICsgbWFyZ2luVG9wKCkgKyBtYXJnaW5C
b3R0b20oKTsKLSAgICAKKyAgICB9CisKICAgICBpZiAoZmlyc3RMaW5lICYmIGRvY3VtZW50KCkt
PnVzZXNGaXJzdExpbmVSdWxlcygpKSB7CiAgICAgICAgIFJlbmRlclN0eWxlKiBzID0gc3R5bGUo
Zmlyc3RMaW5lKTsKICAgICAgICAgaWYgKHMgIT0gc3R5bGUoKSkKQEAgLTQ0NTEsNiArNDQwMiw4
IEBAIGludCBSZW5kZXJCbG9jazo6YmFzZWxpbmVQb3NpdGlvbihib29sIGIKICAgICAgICAgLy8g
V2UgYWxzbyBnaXZlIHVwIG9uIGZpbmRpbmcgYSBiYXNlbGluZSBpZiB3ZSBoYXZlIGEgdmVydGlj
YWwgc2Nyb2xsYmFyLCBvciBpZiB3ZSBhcmUgc2Nyb2xsZWQKICAgICAgICAgLy8gdmVydGljYWxs
eSAoZS5nLiwgYW4gb3ZlcmZsb3c6aGlkZGVuIGJsb2NrIHRoYXQgaGFzIGhhZCBzY3JvbGxUb3Ag
bW92ZWQpIG9yIGlmIHRoZSBiYXNlbGluZSBpcyBvdXRzaWRlCiAgICAgICAgIC8vIG9mIG91ciBj
b250ZW50IGJveC4KKyAgICAgICAgaWYgKGlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkKKyAgICAg
ICAgICAgIHJldHVybiBoZWlnaHQoKTsKICAgICAgICAgaW50IGJhc2VsaW5lUG9zID0gKGxheWVy
KCkgJiYgKGxheWVyKCktPm1hcnF1ZWUoKSB8fCBsYXllcigpLT52ZXJ0aWNhbFNjcm9sbGJhcigp
IHx8IGxheWVyKCktPnNjcm9sbFlPZmZzZXQoKSAhPSAwKSkgPyAtMSA6IGxhc3RMaW5lQm94QmFz
ZWxpbmUoKTsKICAgICAgICAgaWYgKGJhc2VsaW5lUG9zICE9IC0xICYmIGJhc2VsaW5lUG9zIDw9
IGJvcmRlclRvcCgpICsgcGFkZGluZ1RvcCgpICsgY29udGVudEhlaWdodCgpKQogICAgICAgICAg
ICAgcmV0dXJuIG1hcmdpblRvcCgpICsgYmFzZWxpbmVQb3M7CkBAIC00ODc1LDYwICs0ODI4LDYg
QEAgdm9pZCBSZW5kZXJCbG9jazo6c2V0TWF4Qm90dG9tTWFyZ2lucyhpbgogICAgIG1fbWF4TWFy
Z2luLT5tX2JvdHRvbU5lZyA9IG5lZzsKIH0KIAotdm9pZCBSZW5kZXJCbG9jazo6YWJzb2x1dGVS
ZWN0cyhWZWN0b3I8SW50UmVjdD4mIHJlY3RzLCBpbnQgdHgsIGludCB0eSkKLXsKLSAgICAvLyBG
b3IgYmxvY2tzIGluc2lkZSBpbmxpbmVzLCB3ZSBnbyBhaGVhZCBhbmQgaW5jbHVkZSBtYXJnaW5z
IHNvIHRoYXQgd2UgcnVuIHJpZ2h0IHVwIHRvIHRoZQotICAgIC8vIGlubGluZSBib3hlcyBhYm92
ZSBhbmQgYmVsb3cgdXMgKHRodXMgZ2V0dGluZyBtZXJnZWQgd2l0aCB0aGVtIHRvIGZvcm0gYSBz
aW5nbGUgaXJyZWd1bGFyCi0gICAgLy8gc2hhcGUpLgotICAgIGlmIChpbmxpbmVDb250aW51YXRp
b24oKSkgewotICAgICAgICByZWN0cy5hcHBlbmQoSW50UmVjdCh0eCwgdHkgLSBjb2xsYXBzZWRN
YXJnaW5Ub3AoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgoKSwgaGVpZ2h0
KCkgKyBjb2xsYXBzZWRNYXJnaW5Ub3AoKSArIGNvbGxhcHNlZE1hcmdpbkJvdHRvbSgpKSk7Ci0g
ICAgICAgIGlubGluZUNvbnRpbnVhdGlvbigpLT5hYnNvbHV0ZVJlY3RzKHJlY3RzLAotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eCAtIHgoKSArIGlubGluZUNv
bnRpbnVhdGlvbigpLT5jb250YWluaW5nQmxvY2soKS0+eCgpLAotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB0eSAtIHkoKSArIGlubGluZUNvbnRpbnVhdGlvbigp
LT5jb250YWluaW5nQmxvY2soKS0+eSgpKTsKLSAgICB9IGVsc2UKLSAgICAgICAgcmVjdHMuYXBw
ZW5kKEludFJlY3QodHgsIHR5LCB3aWR0aCgpLCBoZWlnaHQoKSkpOwotfQotCi12b2lkIFJlbmRl
ckJsb2NrOjphYnNvbHV0ZVF1YWRzKFZlY3RvcjxGbG9hdFF1YWQ+JiBxdWFkcykKLXsKLSAgICAv
LyBGb3IgYmxvY2tzIGluc2lkZSBpbmxpbmVzLCB3ZSBnbyBhaGVhZCBhbmQgaW5jbHVkZSBtYXJn
aW5zIHNvIHRoYXQgd2UgcnVuIHJpZ2h0IHVwIHRvIHRoZQotICAgIC8vIGlubGluZSBib3hlcyBh
Ym92ZSBhbmQgYmVsb3cgdXMgKHRodXMgZ2V0dGluZyBtZXJnZWQgd2l0aCB0aGVtIHRvIGZvcm0g
YSBzaW5nbGUgaXJyZWd1bGFyCi0gICAgLy8gc2hhcGUpLgotICAgIGlmIChpbmxpbmVDb250aW51
YXRpb24oKSkgewotICAgICAgICBGbG9hdFJlY3QgbG9jYWxSZWN0KDAsIC1jb2xsYXBzZWRNYXJn
aW5Ub3AoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCgpLCBoZWlnaHQoKSAr
IGNvbGxhcHNlZE1hcmdpblRvcCgpICsgY29sbGFwc2VkTWFyZ2luQm90dG9tKCkpOwotICAgICAg
ICBxdWFkcy5hcHBlbmQobG9jYWxUb0Fic29sdXRlUXVhZChsb2NhbFJlY3QpKTsKLSAgICAgICAg
aW5saW5lQ29udGludWF0aW9uKCktPmFic29sdXRlUXVhZHMocXVhZHMpOwotICAgIH0gZWxzZQot
ICAgICAgICBxdWFkcy5hcHBlbmQoUmVuZGVyQm94Ojpsb2NhbFRvQWJzb2x1dGVRdWFkKEZsb2F0
UmVjdCgwLCAwLCB3aWR0aCgpLCBoZWlnaHQoKSkpKTsKLX0KLQotSW50UmVjdCBSZW5kZXJCbG9j
azo6cmVjdFdpdGhPdXRsaW5lRm9yUmVwYWludChSZW5kZXJCb3hNb2RlbE9iamVjdCogcmVwYWlu
dENvbnRhaW5lciwgaW50IG91dGxpbmVXaWR0aCkKLXsKLSAgICBJbnRSZWN0IHIoUmVuZGVyQm94
OjpyZWN0V2l0aE91dGxpbmVGb3JSZXBhaW50KHJlcGFpbnRDb250YWluZXIsIG91dGxpbmVXaWR0
aCkpOwotICAgIGlmIChpbmxpbmVDb250aW51YXRpb24oKSkKLSAgICAgICAgci5pbmZsYXRlWShj
b2xsYXBzZWRNYXJnaW5Ub3AoKSk7Ci0gICAgcmV0dXJuIHI7Ci19Ci0KLVJlbmRlck9iamVjdCog
UmVuZGVyQmxvY2s6OmhvdmVyQW5jZXN0b3IoKSBjb25zdAotewotICAgIHJldHVybiBpbmxpbmVD
b250aW51YXRpb24oKSA/IGlubGluZUNvbnRpbnVhdGlvbigpIDogUmVuZGVyQm94Ojpob3ZlckFu
Y2VzdG9yKCk7Ci19Ci0KLXZvaWQgUmVuZGVyQmxvY2s6OnVwZGF0ZURyYWdTdGF0ZShib29sIGRy
YWdPbikKLXsKLSAgICBSZW5kZXJCb3g6OnVwZGF0ZURyYWdTdGF0ZShkcmFnT24pOwotICAgIGlm
IChpbmxpbmVDb250aW51YXRpb24oKSkKLSAgICAgICAgaW5saW5lQ29udGludWF0aW9uKCktPnVw
ZGF0ZURyYWdTdGF0ZShkcmFnT24pOwotfQotCi1SZW5kZXJTdHlsZSogUmVuZGVyQmxvY2s6Om91
dGxpbmVTdHlsZUZvclJlcGFpbnQoKSBjb25zdAotewotICAgIHJldHVybiBpbmxpbmVDb250aW51
YXRpb24oKSA/IGlubGluZUNvbnRpbnVhdGlvbigpLT5zdHlsZSgpIDogc3R5bGUoKTsKLX0KLQog
dm9pZCBSZW5kZXJCbG9jazo6Y2hpbGRCZWNhbWVOb25JbmxpbmUoUmVuZGVyT2JqZWN0KikKIHsK
ICAgICBtYWtlQ2hpbGRyZW5Ob25JbmxpbmUoKTsKQEAgLTQ5MzcsMjYgKzQ4MzYsNiBAQCB2b2lk
IFJlbmRlckJsb2NrOjpjaGlsZEJlY2FtZU5vbklubGluZShSCiAgICAgLy8gfHRoaXN8IG1heSBi
ZSBkZWFkIGhlcmUKIH0KIAotdm9pZCBSZW5kZXJCbG9jazo6dXBkYXRlSGl0VGVzdFJlc3VsdChI
aXRUZXN0UmVzdWx0JiByZXN1bHQsIGNvbnN0IEludFBvaW50JiBwb2ludCkKLXsKLSAgICBpZiAo
cmVzdWx0LmlubmVyTm9kZSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBOb2RlKiBuID0gbm9k
ZSgpOwotICAgIGlmIChpbmxpbmVDb250aW51YXRpb24oKSkKLSAgICAgICAgLy8gV2UgYXJlIGlu
IHRoZSBtYXJnaW5zIG9mIGJsb2NrIGVsZW1lbnRzIHRoYXQgYXJlIHBhcnQgb2YgYSBjb250aW51
YXRpb24uICBJbgotICAgICAgICAvLyB0aGlzIGNhc2Ugd2UncmUgYWN0dWFsbHkgc3RpbGwgaW5z
aWRlIHRoZSBlbmNsb3NpbmcgaW5saW5lIGVsZW1lbnQgdGhhdCB3YXMKLSAgICAgICAgLy8gc3Bs
aXQuICBHbyBhaGVhZCBhbmQgc2V0IG91ciBpbm5lciBub2RlIGFjY29yZGluZ2x5LgotICAgICAg
ICBuID0gaW5saW5lQ29udGludWF0aW9uKCktPm5vZGUoKTsKLQotICAgIGlmIChuKSB7Ci0gICAg
ICAgIHJlc3VsdC5zZXRJbm5lck5vZGUobik7Ci0gICAgICAgIGlmICghcmVzdWx0LmlubmVyTm9u
U2hhcmVkTm9kZSgpKQotICAgICAgICAgICAgcmVzdWx0LnNldElubmVyTm9uU2hhcmVkTm9kZShu
KTsKLSAgICAgICAgcmVzdWx0LnNldExvY2FsUG9pbnQocG9pbnQpOwotICAgIH0KLX0KLQogSW50
UmVjdCBSZW5kZXJCbG9jazo6bG9jYWxDYXJldFJlY3QoSW5saW5lQm94KiBpbmxpbmVCb3gsIGlu
dCBjYXJldE9mZnNldCwgaW50KiBleHRyYVdpZHRoVG9FbmRPZkxpbmUpCiB7CiAgICAgLy8gRG8g
dGhlIG5vcm1hbCBjYWxjdWxhdGlvbiBpbiBtb3N0IGNhc2VzLgpAQCAtNTAzNywyMCArNDkxNiw3
IEBAIEludFJlY3QgUmVuZGVyQmxvY2s6OmxvY2FsQ2FyZXRSZWN0KElubGkKIAogdm9pZCBSZW5k
ZXJCbG9jazo6YWRkRm9jdXNSaW5nUmVjdHMoVmVjdG9yPEludFJlY3Q+JiByZWN0cywgaW50IHR4
LCBpbnQgdHkpCiB7Ci0gICAgLy8gRm9yIGJsb2NrcyBpbnNpZGUgaW5saW5lcywgd2UgZ28gYWhl
YWQgYW5kIGluY2x1ZGUgbWFyZ2lucyBzbyB0aGF0IHdlIHJ1biByaWdodCB1cCB0byB0aGUKLSAg
ICAvLyBpbmxpbmUgYm94ZXMgYWJvdmUgYW5kIGJlbG93IHVzICh0aHVzIGdldHRpbmcgbWVyZ2Vk
IHdpdGggdGhlbSB0byBmb3JtIGEgc2luZ2xlIGlycmVndWxhcgotICAgIC8vIHNoYXBlKS4KLSAg
ICBpZiAoaW5saW5lQ29udGludWF0aW9uKCkpIHsKLSAgICAgICAgLy8gRklYTUU6IFRoaXMgY2hl
Y2sgcmVhbGx5IGlzbid0IGFjY3VyYXRlLiAKLSAgICAgICAgYm9vbCBuZXh0SW5saW5lSGFzTGlu
ZUJveCA9IGlubGluZUNvbnRpbnVhdGlvbigpLT5maXJzdExpbmVCb3goKTsKLSAgICAgICAgLy8g
RklYTUU6IFRoaXMgaXMgd3JvbmcuIFRoZSBwcmluY2lwYWwgcmVuZGVyZXIgbWF5IG5vdCBiZSB0
aGUgY29udGludWF0aW9uIHByZWNlZGluZyB0aGlzIGJsb2NrLgotICAgICAgICBib29sIHByZXZJ
bmxpbmVIYXNMaW5lQm94ID0gdG9SZW5kZXJJbmxpbmUoaW5saW5lQ29udGludWF0aW9uKCktPm5v
ZGUoKS0+cmVuZGVyZXIoKSktPmZpcnN0TGluZUJveCgpOyAKLSAgICAgICAgaW50IHRvcE1hcmdp
biA9IHByZXZJbmxpbmVIYXNMaW5lQm94ID8gY29sbGFwc2VkTWFyZ2luVG9wKCkgOiAwOwotICAg
ICAgICBpbnQgYm90dG9tTWFyZ2luID0gbmV4dElubGluZUhhc0xpbmVCb3ggPyBjb2xsYXBzZWRN
YXJnaW5Cb3R0b20oKSA6IDA7Ci0gICAgICAgIEludFJlY3QgcmVjdCh0eCwgdHkgLSB0b3BNYXJn
aW4sIHdpZHRoKCksIGhlaWdodCgpICsgdG9wTWFyZ2luICsgYm90dG9tTWFyZ2luKTsKLSAgICAg
ICAgaWYgKCFyZWN0LmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJlY3RzLmFwcGVuZChyZWN0KTsK
LSAgICB9IGVsc2UgaWYgKHdpZHRoKCkgJiYgaGVpZ2h0KCkpCisgICAgaWYgKHdpZHRoKCkgfHwg
aGVpZ2h0KCkpCiAgICAgICAgIHJlY3RzLmFwcGVuZChJbnRSZWN0KHR4LCB0eSwgd2lkdGgoKSwg
aGVpZ2h0KCkpKTsKIAogICAgIGlmICghaGFzT3ZlcmZsb3dDbGlwKCkgJiYgIWhhc0NvbnRyb2xD
bGlwKCkpIHsKQEAgLTUwNzUsMTEgKzQ5NDEsNiBAQCB2b2lkIFJlbmRlckJsb2NrOjphZGRGb2N1
c1JpbmdSZWN0cyhWZWN0CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0KLSAgICBp
ZiAoaW5saW5lQ29udGludWF0aW9uKCkpCi0gICAgICAgIGlubGluZUNvbnRpbnVhdGlvbigpLT5h
ZGRGb2N1c1JpbmdSZWN0cyhyZWN0cywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICB0eCAtIHgoKSArIGlubGluZUNvbnRpbnVhdGlvbigpLT5jb250YWlu
aW5nQmxvY2soKS0+eCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgdHkgLSB5KCkgKyBpbmxpbmVDb250aW51YXRpb24oKS0+Y29udGFpbmluZ0Jsb2Nr
KCktPnkoKSk7CiB9CiAKIFJlbmRlckJsb2NrKiBSZW5kZXJCbG9jazo6Y3JlYXRlQW5vbnltb3Vz
QmxvY2soYm9vbCBpc0ZsZXhpYmxlQm94KSBjb25zdApAQCAtNTExMSw2ICs0OTcyLDggQEAgY29u
c3QgY2hhciogUmVuZGVyQmxvY2s6OnJlbmRlck5hbWUoKSBjbwogICAgICAgICByZXR1cm4gIlJl
bmRlckJsb2NrIChwb3NpdGlvbmVkKSI7CiAgICAgaWYgKGlzQW5vbnltb3VzQmxvY2soKSkKICAg
ICAgICAgcmV0dXJuICJSZW5kZXJCbG9jayAoYW5vbnltb3VzKSI7CisgICAgZWxzZSBpZiAoaXNB
bm9ueW1vdXNJbmxpbmVCbG9jaygpKQorICAgICAgICByZXR1cm4gIlJlbmRlckJsb2NrIChhbm9u
eW1vdXMgaW5saW5lLWJsb2NrKSI7CiAgICAgZWxzZSBpZiAoaXNBbm9ueW1vdXMoKSkKICAgICAg
ICAgcmV0dXJuICJSZW5kZXJCbG9jayAoZ2VuZXJhdGVkKSI7CiAgICAgaWYgKGlzUmVsUG9zaXRp
b25lZCgpKQpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5oCShyZXZpc2lvbiA1NDUwMSkKKysr
IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmgJKHdvcmtpbmcgY29weSkKQEAgLTEyOSwx
NSArMTI5LDE1IEBAIHB1YmxpYzoKIAogICAgIHZvaWQgYWRqdXN0UmVjdEZvckNvbHVtbnMoSW50
UmVjdCYpIGNvbnN0OwogCi0gICAgdm9pZCBhZGRDb250aW51YXRpb25XaXRoT3V0bGluZShSZW5k
ZXJJbmxpbmUqKTsKLQotICAgIFJlbmRlcklubGluZSogaW5saW5lQ29udGludWF0aW9uKCkgY29u
c3QgeyByZXR1cm4gbV9pbmxpbmVDb250aW51YXRpb247IH0KLSAgICB2b2lkIHNldElubGluZUNv
bnRpbnVhdGlvbihSZW5kZXJJbmxpbmUqIGMpIHsgbV9pbmxpbmVDb250aW51YXRpb24gPSBjOyB9
Ci0KICAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGEgY29udmVuaWVuY2UgaGVscGVyIGZvciBjcmVh
dGluZyBhbiBhbm9ueW1vdXMgYmxvY2sgdGhhdCBpbmhlcml0cyBpdHMKICAgICAvLyBzdHlsZSBm
cm9tIHRoaXMgUmVuZGVyQmxvY2suCiAgICAgUmVuZGVyQmxvY2sqIGNyZWF0ZUFub255bW91c0Js
b2NrKGJvb2wgaXNGbGV4aWJsZUJveCA9IGZhbHNlKSBjb25zdDsKIAorICAgIHZpcnR1YWwgdm9p
ZCBwYWludChQYWludEluZm8mLCBpbnQgdHgsIGludCB0eSk7CisgICAgdmlydHVhbCB2b2lkIHBh
aW50T2JqZWN0KFBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5KTsKKworICAgIGJvb2wgaW5Sb290
QmxvY2tDb250ZXh0KCkgY29uc3Q7CisKIHByb3RlY3RlZDoKICAgICB2b2lkIG1vdmVDaGlsZFRv
KFJlbmRlck9iamVjdCogdG8sIFJlbmRlck9iamVjdENoaWxkTGlzdCogdG9DaGlsZExpc3QsIFJl
bmRlck9iamVjdCogY2hpbGQpOwogICAgIHZvaWQgbW92ZUNoaWxkVG8oUmVuZGVyT2JqZWN0KiB0
bywgUmVuZGVyT2JqZWN0Q2hpbGRMaXN0KiB0b0NoaWxkTGlzdCwgUmVuZGVyT2JqZWN0KiBiZWZv
cmVDaGlsZCwgUmVuZGVyT2JqZWN0KiBjaGlsZCk7CkBAIC0xNjUsOSArMTY1LDYgQEAgcHJvdGVj
dGVkOgogCiAgICAgdm9pZCBsYXlvdXRQb3NpdGlvbmVkT2JqZWN0cyhib29sIHJlbGF5b3V0Q2hp
bGRyZW4pOwogCi0gICAgdmlydHVhbCB2b2lkIHBhaW50KFBhaW50SW5mbyYsIGludCB0eCwgaW50
IHR5KTsKLSAgICB2aXJ0dWFsIHZvaWQgcGFpbnRPYmplY3QoUGFpbnRJbmZvJiwgaW50IHR4LCBp
bnQgdHkpOwotCiAgICAgaW50IHJpZ2h0UmVsT2Zmc2V0KGludCB5LCBpbnQgZml4ZWRPZmZzZXQs
IGJvb2wgYXBwbHlUZXh0SW5kZW50ID0gdHJ1ZSwgaW50KiBoZWlnaHRSZW1haW5pbmcgPSAwKSBj
b25zdDsKICAgICBpbnQgbGVmdFJlbE9mZnNldChpbnQgeSwgaW50IGZpeGVkT2Zmc2V0LCBib29s
IGFwcGx5VGV4dEluZGVudCA9IHRydWUsIGludCogaGVpZ2h0UmVtYWluaW5nID0gMCkgY29uc3Q7
CiAKQEAgLTE4MCw4ICsxNzcsNiBAQCBwcm90ZWN0ZWQ6CiAKICAgICB2aXJ0dWFsIHZvaWQgdXBk
YXRlRmlyc3RMZXR0ZXIoKTsKIAotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVIaXRUZXN0UmVzdWx0
KEhpdFRlc3RSZXN1bHQmLCBjb25zdCBJbnRQb2ludCYpOwotCiAgICAgLy8gRGVsYXkgdXBkYXRl
IHNjcm9sbGJhciB1bnRpbCBmaW5pc2hEZWxheVJlcGFpbnQoKSB3aWxsIGJlCiAgICAgLy8gY2Fs
bGVkLiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2hlbiBhIGZsZXhib3ggaXMgbGF5aW5nIG91dCBp
dHMKICAgICAvLyBkZXNjZW5kYW50LiBJZiBtdWx0aXBsZSBjYWxscyBhcmUgbWFkZSB0byBzdGFy
dERlbGF5UmVwYWludCgpLApAQCAtMjQ1LDcgKzI0MCw5IEBAIHByaXZhdGU6CiAgICAgICAgIGJv
b2wgZXZlckhhZExheW91dDsKICAgICB9OwogCi0gICAgLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlv
bnMnIGltcGxlbWVudGF0aW9ucyBhcmUgaW4gUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcC4KKyAg
ICBjbGFzcyBNYXJnaW5JbmZvOworCisgICAgLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMnIGlt
cGxlbWVudGF0aW9ucyBhcmUgaW4gUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcC4gICAgCiAgICAg
dm9pZCBiaWRpUmVvcmRlckxpbmUoSW5saW5lQmlkaVJlc29sdmVyJiwgY29uc3QgSW5saW5lSXRl
cmF0b3ImIGVuZCwgYm9vbCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHkpOwogICAgIFJvb3RJbmxp
bmVCb3gqIGRldGVybWluZVN0YXJ0UG9zaXRpb24oYm9vbCYgZmlyc3RMaW5lLCBib29sJiBmdWxs
TGF5b3V0LCBib29sJiBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHksCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBJbmxpbmVCaWRpUmVzb2x2ZXImLCBWZWN0b3I8Rmxv
YXRXaXRoUmVjdD4mIGZsb2F0cywgdW5zaWduZWQmIG51bUNsZWFuRmxvYXRzKTsKQEAgLTI1OCw3
ICsyNTUsNyBAQCBwcml2YXRlOgogICAgIHZvaWQgc2tpcFRyYWlsaW5nV2hpdGVzcGFjZShJbmxp
bmVJdGVyYXRvciYsIGJvb2wgaXNMaW5lRW1wdHksIGJvb2wgcHJldmlvdXNMaW5lQnJva2VDbGVh
bmx5KTsKICAgICBpbnQgc2tpcExlYWRpbmdXaGl0ZXNwYWNlKElubGluZUJpZGlSZXNvbHZlciYs
IGJvb2wgZmlyc3RMaW5lLCBib29sIGlzTGluZUVtcHR5LCBib29sIHByZXZpb3VzTGluZUJyb2tl
Q2xlYW5seSk7CiAgICAgdm9pZCBmaXRCZWxvd0Zsb2F0cyhpbnQgd2lkdGhUb0ZpdCwgYm9vbCBm
aXJzdExpbmUsIGludCYgYXZhaWxhYmxlV2lkdGgpOwotICAgIElubGluZUl0ZXJhdG9yIGZpbmRO
ZXh0TGluZUJyZWFrKElubGluZUJpZGlSZXNvbHZlciYsIGJvb2wgZmlyc3RMaW5lLCBib29sJiBp
c0xpbmVFbXB0eSwgYm9vbCYgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5LCBFQ2xlYXIqIGNsZWFy
ID0gMCk7CisgICAgSW5saW5lSXRlcmF0b3IgZmluZE5leHRMaW5lQnJlYWsoSW5saW5lQmlkaVJl
c29sdmVyJiwgYm9vbCBmaXJzdExpbmUsIGJvb2wmIGlzTGluZUVtcHR5LCBib29sJiBwcmV2aW91
c0xpbmVCcm9rZUNsZWFubHksIE1hcmdpbkluZm8mLCBFQ2xlYXIqIGNsZWFyID0gMCk7CiAgICAg
Um9vdElubGluZUJveCogY29uc3RydWN0TGluZSh1bnNpZ25lZCBydW5Db3VudCwgQmlkaVJ1biog
Zmlyc3RSdW4sIEJpZGlSdW4qIGxhc3RSdW4sIGJvb2wgZmlyc3RMaW5lLCBib29sIGxhc3RMaW5l
LCBSZW5kZXJPYmplY3QqIGVuZE9iamVjdCk7CiAgICAgSW5saW5lRmxvd0JveCogY3JlYXRlTGlu
ZUJveGVzKFJlbmRlck9iamVjdCosIGJvb2wgZmlyc3RMaW5lKTsKICAgICB2b2lkIGNvbXB1dGVI
b3Jpem9udGFsUG9zaXRpb25zRm9yTGluZShSb290SW5saW5lQm94KiwgYm9vbCBmaXJzdExpbmUs
IEJpZGlSdW4qIGZpcnN0UnVuLCBCaWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVuLCBib29sIHJlYWNo
ZWRFbmQpOwpAQCAtMzEzLDEzICszMTAsNyBAQCBwcml2YXRlOgogICAgIC8vIE9idGFpbnMgdGhl
IG5lYXJlc3QgZW5jbG9zaW5nIGJsb2NrIChpbmNsdWRpbmcgdGhpcyBibG9jaykgdGhhdCBjb250
cmlidXRlcyBhIGZpcnN0LWxpbmUgc3R5bGUgdG8gb3VyIGlubGluZQogICAgIC8vIGNoaWxkcmVu
LgogICAgIHZpcnR1YWwgUmVuZGVyQmxvY2sqIGZpcnN0TGluZUJsb2NrKCkgY29uc3Q7Ci0gICAg
Ym9vbCBpblJvb3RCbG9ja0NvbnRleHQoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgSW50UmVjdCBy
ZWN0V2l0aE91dGxpbmVGb3JSZXBhaW50KFJlbmRlckJveE1vZGVsT2JqZWN0KiByZXBhaW50Q29u
dGFpbmVyLCBpbnQgb3V0bGluZVdpZHRoKTsKLSAgICB2aXJ0dWFsIFJlbmRlclN0eWxlKiBvdXRs
aW5lU3R5bGVGb3JSZXBhaW50KCkgY29uc3Q7CiAgICAgCi0gICAgdmlydHVhbCBSZW5kZXJPYmpl
Y3QqIGhvdmVyQW5jZXN0b3IoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlRHJhZ1N0
YXRlKGJvb2wgZHJhZ09uKTsKICAgICB2aXJ0dWFsIHZvaWQgY2hpbGRCZWNhbWVOb25JbmxpbmUo
UmVuZGVyT2JqZWN0KiBjaGlsZCk7CiAKICAgICB2aXJ0dWFsIEludFJlY3Qgc2VsZWN0aW9uUmVj
dEZvclJlcGFpbnQoUmVuZGVyQm94TW9kZWxPYmplY3QqIHJlcGFpbnRDb250YWluZXIsIGJvb2wg
LypjbGlwVG9WaXNpYmxlQ29udGVudCovKQpAQCAtMzM5LDE2ICszMzAsMTEgQEAgcHJpdmF0ZToK
ICAgICBpbnQgbGVmdFNlbGVjdGlvbk9mZnNldChSZW5kZXJCbG9jayogcm9vdEJsb2NrLCBpbnQg
eSk7CiAgICAgaW50IHJpZ2h0U2VsZWN0aW9uT2Zmc2V0KFJlbmRlckJsb2NrKiByb290QmxvY2ss
IGludCB5KTsKIAotICAgIHZpcnR1YWwgdm9pZCBhYnNvbHV0ZVJlY3RzKFZlY3RvcjxJbnRSZWN0
PiYsIGludCB0eCwgaW50IHR5KTsKLSAgICB2aXJ0dWFsIHZvaWQgYWJzb2x1dGVRdWFkcyhWZWN0
b3I8RmxvYXRRdWFkPiYpOwotCiAgICAgaW50IGRlc2lyZWRDb2x1bW5XaWR0aCgpIGNvbnN0Owog
ICAgIHVuc2lnbmVkIGRlc2lyZWRDb2x1bW5Db3VudCgpIGNvbnN0OwogICAgIFZlY3RvcjxJbnRS
ZWN0PiogY29sdW1uUmVjdHMoKSBjb25zdDsKICAgICB2b2lkIHNldERlc2lyZWRDb2x1bW5Db3Vu
dEFuZFdpZHRoKGludCBjb3VudCwgaW50IHdpZHRoKTsKICAgICBpbnQgY29sdW1uR2FwKCkgY29u
c3Q7Ci0gICAgCi0gICAgdm9pZCBwYWludENvbnRpbnVhdGlvbk91dGxpbmVzKFBhaW50SW5mbyYs
IGludCB0eCwgaW50IHR5KTsKIAogICAgIHZpcnR1YWwgSW50UmVjdCBsb2NhbENhcmV0UmVjdChJ
bmxpbmVCb3gqLCBpbnQgY2FyZXRPZmZzZXQsIGludCogZXh0cmFXaWR0aFRvRW5kT2ZMaW5lID0g
MCk7CiAKQEAgLTQ4NCwxMiArNDcwLDYgQEAgcHJpdmF0ZToKICAgICBEZXByZWNhdGVkUHRyTGlz
dDxGbG9hdGluZ09iamVjdD4qIG1fZmxvYXRpbmdPYmplY3RzOwogICAgIExpc3RIYXNoU2V0PFJl
bmRlckJveCo+KiBtX3Bvc2l0aW9uZWRPYmplY3RzOwogCi0gICAgLy8gQW4gaW5saW5lIGNhbiBi
ZSBzcGxpdCB3aXRoIGJsb2NrcyBvY2N1cnJpbmcgaW4gYmV0d2VlbiB0aGUgaW5saW5lIGNvbnRl
bnQuCi0gICAgLy8gV2hlbiB0aGlzIG9jY3VycyB3ZSBuZWVkIGEgcG9pbnRlciB0byBvdXIgbmV4
dCBvYmplY3QuICBXZSBjYW4gYmFzaWNhbGx5IGJlCi0gICAgLy8gc3BsaXQgaW50byBhIHNlcXVl
bmNlIG9mIGlubGluZXMgYW5kIGJsb2Nrcy4gIFRoZSBjb250aW51YXRpb24gd2lsbCBlaXRoZXIg
YmUKLSAgICAvLyBhbiBhbm9ueW1vdXMgYmxvY2sgKHRoYXQgaG91c2VzIG90aGVyIGJsb2Nrcykg
b3IgaXQgd2lsbCBiZSBhbiBpbmxpbmUgZmxvdy4KLSAgICBSZW5kZXJJbmxpbmUqIG1faW5saW5l
Q29udGludWF0aW9uOwotCiAgICAgLy8gQWxsb2NhdGVkIG9ubHkgd2hlbiBzb21lIG9mIHRoZXNl
IGZpZWxkcyBoYXZlIG5vbi1kZWZhdWx0IHZhbHVlcwogICAgIHN0cnVjdCBNYXhNYXJnaW4gOiBO
b25jb3B5YWJsZSB7CiAgICAgICAgIE1heE1hcmdpbihjb25zdCBSZW5kZXJCbG9jayogbykgCklu
ZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5jcHAJKHJldmlz
aW9uIDU0NTAxKQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNw
cAkod29ya2luZyBjb3B5KQpAQCAtNTcyLDEyICs1NzIsMTYgQEAgUm9vdElubGluZUJveCogUmVu
ZGVyQmxvY2s6OmNvbnN0cnVjdExpbgogICAgICAgICBpZiAoIWJveCkKICAgICAgICAgICAgIGNv
bnRpbnVlOwogCisgICAgICAgIC8vIEFub255bW91cyBpbmxpbmUgYmxvY2tzICh1c2VkIHRvIGhv
bGQgYmxvY2tzIGluc2lkZSBpbmxpbmVzKSBkb24ndCBuZWVkIHRvIHdhc3RlIHRpbWUgd3JhcHBp
bmcKKyAgICAgICAgLy8gdGhlbXNlbHZlcyBpbiB0aG9zZSBpbmxpbmVzIChzaW5jZSB3ZSB3YW50
IHRvIHByZXRlbmQgbGlrZSB0aGV5IGRvbid0IGV4aXN0IG9uIHRoaXMgZmFrZSBsaW5lKS4KKyAg
ICAgICAgUmVuZGVyT2JqZWN0KiBhbmNlc3RvclJlbmRlcmVyID0gci0+bV9vYmplY3QtPmlzQW5v
bnltb3VzSW5saW5lQmxvY2soKSA/IHRoaXMgOiByLT5tX29iamVjdC0+cGFyZW50KCk7CisgCiAg
ICAgICAgIC8vIElmIHdlIGhhdmUgbm8gcGFyZW50IGJveCB5ZXQsIG9yIGlmIHRoZSBydW4gaXMg
bm90IHNpbXBseSBhIHNpYmxpbmcsCiAgICAgICAgIC8vIHRoZW4gd2UgbmVlZCB0byBjb25zdHJ1
Y3QgaW5saW5lIGJveGVzIGFzIG5lY2Vzc2FyeSB0byBwcm9wZXJseSBlbmNsb3NlIHRoZQogICAg
ICAgICAvLyBydW4ncyBpbmxpbmUgYm94LgotICAgICAgICBpZiAoIXBhcmVudEJveCB8fCBwYXJl
bnRCb3gtPnJlbmRlcmVyKCkgIT0gci0+bV9vYmplY3QtPnBhcmVudCgpKQorICAgICAgICBpZiAo
IXBhcmVudEJveCB8fCBwYXJlbnRCb3gtPnJlbmRlcmVyKCkgIT0gYW5jZXN0b3JSZW5kZXJlcikK
ICAgICAgICAgICAgIC8vIENyZWF0ZSBuZXcgaW5saW5lIGJveGVzIGFsbCB0aGUgd2F5IGJhY2sg
dG8gdGhlIGFwcHJvcHJpYXRlIGluc2VydGlvbiBwb2ludC4KLSAgICAgICAgICAgIHBhcmVudEJv
eCA9IGNyZWF0ZUxpbmVCb3hlcyhyLT5tX29iamVjdC0+cGFyZW50KCksIGZpcnN0TGluZSk7Cisg
ICAgICAgICAgICBwYXJlbnRCb3ggPSBjcmVhdGVMaW5lQm94ZXMoYW5jZXN0b3JSZW5kZXJlciwg
Zmlyc3RMaW5lKTsKIAogICAgICAgICAvLyBBcHBlbmQgdGhlIGlubGluZSBib3ggdG8gdGhpcyBs
aW5lLgogICAgICAgICBwYXJlbnRCb3gtPmFkZFRvTGluZShib3gpOwpAQCAtNjE5LDYgKzYyMyw4
IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmNvbXB1dGVIb3Jpem9udGFsUG9zaXQKICAgICB1bnNpZ25l
ZCBudW1TcGFjZXMgPSAwOwogICAgIEVUZXh0QWxpZ24gdGV4dEFsaWduID0gc3R5bGUoKS0+dGV4
dEFsaWduKCk7CiAKKyAgICBpbnQgeCA9IGxlZnRPZmZzZXQoaGVpZ2h0KCksIGZpcnN0TGluZSk7
CisKICAgICBmb3IgKEJpZGlSdW4qIHIgPSBmaXJzdFJ1bjsgcjsgciA9IHItPm5leHQoKSkgewog
ICAgICAgICBpZiAoIXItPm1fYm94IHx8IHItPm1fb2JqZWN0LT5pc1Bvc2l0aW9uZWQoKSB8fCBy
LT5tX2JveC0+aXNMaW5lQnJlYWsoKSkKICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBQb3NpdGlv
bmVkIG9iamVjdHMgYXJlIG9ubHkgcGFydGljaXBhdGluZyB0byBmaWd1cmUgb3V0IHRoZWlyCkBA
IC02NTYsNiArNjYyLDEyIEBAIHZvaWQgUmVuZGVyQmxvY2s6OmNvbXB1dGVIb3Jpem9udGFsUG9z
aXQKICAgICAgICAgICAgIHJlbmRlckJveC0+Y2FsY1dpZHRoKCk7CiAgICAgICAgICAgICByLT5t
X2JveC0+c2V0V2lkdGgocmVuZGVyQm94LT53aWR0aCgpKTsKICAgICAgICAgICAgIHRvdFdpZHRo
ICs9IHJlbmRlckJveC0+bWFyZ2luTGVmdCgpICsgcmVuZGVyQm94LT5tYXJnaW5SaWdodCgpOwor
ICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoci0+bV9vYmplY3QtPmlzQW5vbnltb3VzSW5s
aW5lQmxvY2soKSkgeworICAgICAgICAgICAgICAgIC8vIEFsbG93IHRoZSBmdWxsIGF2YWlsYWJs
ZSB3aWR0aCB0byBiZSB1c2VkLCBzaW5jZSBmbG9hdHMgd2lsbCBpbnRydWRlIGludG8gb3VyIHNw
YWNlLgorICAgICAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoID0gcmlnaHRPZmZzZXQoKSAtIGxl
ZnRPZmZzZXQoKTsKKyAgICAgICAgICAgICAgICB4ID0gbGVmdE9mZnNldCgpOworICAgICAgICAg
ICAgfQogICAgICAgICB9CiAKICAgICAgICAgdG90V2lkdGggKz0gci0+bV9ib3gtPndpZHRoKCk7
CkBAIC02NjUsNyArNjc3LDYgQEAgdm9pZCBSZW5kZXJCbG9jazo6Y29tcHV0ZUhvcml6b250YWxQ
b3NpdAogICAgIC8vIHdlIG5vdyBleGFtaW5lIG91ciB0ZXh0LWFsaWduIHByb3BlcnR5IGluIG9y
ZGVyIHRvIGRldGVybWluZSB3aGVyZSB0byBwb3NpdGlvbiB0aGUKICAgICAvLyBvYmplY3RzIGhv
cml6b250YWxseS4gIFRoZSB0b3RhbCB3aWR0aCBvZiB0aGUgbGluZSBjYW4gYmUgaW5jcmVhc2Vk
IGlmIHdlIGVuZCB1cAogICAgIC8vIGp1c3RpZnlpbmcgdGV4dC4KLSAgICBpbnQgeCA9IGxlZnRP
ZmZzZXQoaGVpZ2h0KCksIGZpcnN0TGluZSk7CiAgICAgc3dpdGNoICh0ZXh0QWxpZ24pIHsKICAg
ICAgICAgY2FzZSBMRUZUOgogICAgICAgICBjYXNlIFdFQktJVF9MRUZUOgpAQCAtODE5LDkgKzgz
MCwxNSBAQCB2b2lkIFJlbmRlckJsb2NrOjpsYXlvdXRJbmxpbmVDaGlsZHJlbihiCiAgICAgYm9v
bCB1c2VSZXBhaW50Qm91bmRzID0gZmFsc2U7CiAgICAgCiAgICAgbV9vdmVyZmxvdy5jbGVhcigp
OwotICAgICAgICAKLSAgICBzZXRIZWlnaHQoYm9yZGVyVG9wKCkgKyBwYWRkaW5nVG9wKCkpOwot
ICAgIGludCB0b0FkZCA9IGJvcmRlckJvdHRvbSgpICsgcGFkZGluZ0JvdHRvbSgpICsgaG9yaXpv
bnRhbFNjcm9sbGJhckhlaWdodCgpOworICAgIAorICAgIGludCB0b3AgPSBib3JkZXJUb3AoKSAr
IHBhZGRpbmdUb3AoKTsKKyAgICBpbnQgYm90dG9tID0gYm9yZGVyQm90dG9tKCkgKyBwYWRkaW5n
Qm90dG9tKCkgKyBob3Jpem9udGFsU2Nyb2xsYmFySGVpZ2h0KCk7CisKKyAgICBzZXRIZWlnaHQo
dG9wKTsKKworICAgIC8vIFRoZSBtYXJnaW4gc3RydWN0IGNhY2hlcyBhbGwgb3VyIGN1cnJlbnQg
bWFyZ2luIGNvbGxhcHNpbmcgc3RhdGUuIFdlIHJ1biBtYXJnaW4gY29sbGFwc2luZyB3aGVuIHdl
IGVuY291bnRlciBhbm9ueW1vdXMgaW5saW5lIGJsb2NrcyB0aGF0IGFyZSBiZWluZyB1c2VkCisg
ICAgLy8gZm9yIHRoZSBibG9ja3MtaW5zaWRlLWlubGluZXMgY2FzZSAoYW5kIHRoZSBpbmxpbmVz
IGFyZSBlbXB0eSksIGUuZywgPHNwYW4+PGRpdj5PbmU8L2Rpdj48L3NwYW4+LgorICAgIE1hcmdp
bkluZm8gbWFyZ2luSW5mbyh0aGlzLCB0b3AsIGJvdHRvbSk7CiAKICAgICAvLyBGaWd1cmUgb3V0
IGlmIHdlIHNob3VsZCBjbGVhciBvdXQgb3VyIGxpbmUgYm94ZXMuCiAgICAgLy8gRklYTUU6IEhh
bmRsZSByZXNpemUgZXZlbnR1YWxseSEKQEAgLTg1MCwxMiArODY3LDE1IEBAIHZvaWQgUmVuZGVy
QmxvY2s6OmxheW91dElubGluZUNoaWxkcmVuKGIKICAgICAgICAgICAgIGlmIChvLT5pc1JlcGxh
Y2VkKCkgfHwgby0+aXNGbG9hdGluZygpIHx8IG8tPmlzUG9zaXRpb25lZCgpKSB7CiAgICAgICAg
ICAgICAgICAgUmVuZGVyQm94KiBib3ggPSB0b1JlbmRlckJveChvKTsKICAgICAgICAgICAgICAg
ICAKLSAgICAgICAgICAgICAgICBpZiAocmVsYXlvdXRDaGlsZHJlbiB8fCBvLT5zdHlsZSgpLT53
aWR0aCgpLmlzUGVyY2VudCgpIHx8IG8tPnN0eWxlKCktPmhlaWdodCgpLmlzUGVyY2VudCgpKQot
ICAgICAgICAgICAgICAgICAgICBvLT5zZXRDaGlsZE5lZWRzTGF5b3V0KHRydWUsIGZhbHNlKTsK
LSAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGxh
eW91dCBjaGlsZHJlbiBpZiB0aGV5IG5lZWQgaXQuCisgICAgICAgICAgICAgICAgLy8gRklYTUU6
IFRlY2huaWNhbGx5IHBlcmNlbnRhZ2UgaGVpZ2h0IG9iamVjdHMgb25seSBuZWVkIGEgcmVsYXlv
dXQgaWYgdGhlaXIgcGVyY2VudGFnZSBpc24ndCBnb2luZyB0byBiZSB0dXJuZWQgaW50bworICAg
ICAgICAgICAgICAgIC8vIGFuIGF1dG8gdmFsdWUuICBBZGQgYSBtZXRob2QgdG8gZGV0ZXJtaW5l
IHRoaXMsIHNvIHRoYXQgd2UgY2FuIGF2b2lkIHRoZSByZWxheW91dC4KKyAgICAgICAgICAgICAg
ICBpZiAocmVsYXlvdXRDaGlsZHJlbiB8fCAoKGJveC0+c3R5bGUoKS0+aGVpZ2h0KCkuaXNQZXJj
ZW50KCkgfHwgYm94LT5zdHlsZSgpLT5taW5IZWlnaHQoKS5pc1BlcmNlbnQoKSB8fCBib3gtPnN0
eWxlKCktPm1heEhlaWdodCgpLmlzUGVyY2VudCgpKSkpCisgICAgICAgICAgICAgICAgICAgIGJv
eC0+c2V0Q2hpbGROZWVkc0xheW91dCh0cnVlLCBmYWxzZSk7CisKICAgICAgICAgICAgICAgICAv
LyBJZiByZWxheW91dENoaWxkcmVuIGlzIHNldCBhbmQgd2UgaGF2ZSBwZXJjZW50YWdlIHBhZGRp
bmcsIHdlIGFsc28gbmVlZCB0byBpbnZhbGlkYXRlIHRoZSBjaGlsZCdzIHByZWYgd2lkdGhzLgot
ICAgICAgICAgICAgICAgIGlmIChyZWxheW91dENoaWxkcmVuICYmIChvLT5zdHlsZSgpLT5wYWRk
aW5nTGVmdCgpLmlzUGVyY2VudCgpIHx8IG8tPnN0eWxlKCktPnBhZGRpbmdSaWdodCgpLmlzUGVy
Y2VudCgpKSkKLSAgICAgICAgICAgICAgICAgICAgby0+c2V0UHJlZldpZHRoc0RpcnR5KHRydWUs
IGZhbHNlKTsKKyAgICAgICAgICAgICAgICBpZiAocmVsYXlvdXRDaGlsZHJlbiAmJiAoYm94LT5z
dHlsZSgpLT5wYWRkaW5nTGVmdCgpLmlzUGVyY2VudCgpIHx8IGJveC0+c3R5bGUoKS0+cGFkZGlu
Z1JpZ2h0KCkuaXNQZXJjZW50KCkpKQorICAgICAgICAgICAgICAgICAgICBib3gtPnNldFByZWZX
aWR0aHNEaXJ0eSh0cnVlLCBmYWxzZSk7CiAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICBp
ZiAoby0+aXNQb3NpdGlvbmVkKCkpCiAgICAgICAgICAgICAgICAgICAgIG8tPmNvbnRhaW5pbmdC
bG9jaygpLT5pbnNlcnRQb3NpdGlvbmVkT2JqZWN0KGJveCk7CkBAIC04NjUsNyArODg1LDggQEAg
dm9pZCBSZW5kZXJCbG9jazo6bGF5b3V0SW5saW5lQ2hpbGRyZW4oYgogICAgICAgICAgICAgICAg
ICAgICBlbHNlIGlmIChmdWxsTGF5b3V0IHx8IG8tPm5lZWRzTGF5b3V0KCkpIC8vIFJlcGxhY2Vk
IGVsZW1lbnRzCiAgICAgICAgICAgICAgICAgICAgICAgICB0b1JlbmRlckJveChvKS0+ZGlydHlM
aW5lQm94ZXMoZnVsbExheW91dCk7CiAKLSAgICAgICAgICAgICAgICAgICAgby0+bGF5b3V0SWZO
ZWVkZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFvLT5pc1JlcGxhY2VkKCkgfHwgIW8t
PmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG8tPmxh
eW91dElmTmVlZGVkKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlm
IChvLT5pc1RleHQoKSB8fCAoby0+aXNSZW5kZXJJbmxpbmUoKSAmJiAhZW5kT2ZJbmxpbmUpKSB7
CiAgICAgICAgICAgICAgICAgaGFzSW5saW5lQ2hpbGQgPSB0cnVlOwpAQCAtOTYwLDcgKzk4MSw3
IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmxheW91dElubGluZUNoaWxkcmVuKGIKICAgICAgICAgICAg
IGlzTGluZUVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgIAogICAgICAgICAgICAgRUNsZWFyIGNs
ZWFyID0gQ05PTkU7Ci0gICAgICAgICAgICBlbmQgPSBmaW5kTmV4dExpbmVCcmVhayhyZXNvbHZl
ciwgZmlyc3RMaW5lLCBpc0xpbmVFbXB0eSwgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5LCAmY2xl
YXIpOworICAgICAgICAgICAgZW5kID0gZmluZE5leHRMaW5lQnJlYWsocmVzb2x2ZXIsIGZpcnN0
TGluZSwgaXNMaW5lRW1wdHksIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSwgbWFyZ2luSW5mbywg
JmNsZWFyKTsKICAgICAgICAgICAgIGlmIChyZXNvbHZlci5wb3NpdGlvbigpLmF0RW5kKCkpIHsK
ICAgICAgICAgICAgICAgICByZXNvbHZlci5kZWxldGVSdW5zKCk7CiAgICAgICAgICAgICAgICAg
Y2hlY2tGb3JGbG9hdHNGcm9tTGFzdExpbmUgPSB0cnVlOwpAQCAtMTAzMCw2ICsxMDUxLDE0IEBA
IHZvaWQgUmVuZGVyQmxvY2s6OmxheW91dElubGluZUNoaWxkcmVuKGIKICAgICAgICAgICAgICAg
ICAgICAgaWYgKGxpbmVCb3gpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVCb3gtPnNl
dEVuZHNXaXRoQnJlYWsocHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KTsKIAorICAgICAgICAgICAg
ICAgICAgICAgICAgLy8gSWYgb3VyIHByZXZpb3VzIGxpbmUgd2FzIGFuIGFub255bW91cyBibG9j
ayBhbmQgd2UgYXJlIG5vdCBhbiBhbm9ueW1vdXMgYmxvY2ssIHNpbXVsYXRlIGEgbWFyZ2luIGNv
bGxhcHNlIG5vdyBzbyB0aGF0IHdlIGdldCB0aGUgcHJvcGVyCisgICAgICAgICAgICAgICAgICAg
ICAgICAvLyBpbmNyZWFzZWQgaGVpZ2h0LiAgV2UgYWxzbyBoYXZlIHRvIHNpbXVsYXRlIGEgbWFy
Z2luIGNvbGxhcHNlIHRvIHByb3BhZ2F0ZSBtYXJnaW5zIHRocm91Z2ggdG8gdGhlIHRvcCBvZiBv
dXIgYmxvY2suCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxpbmVCb3gtPmFub255bW91
c0lubGluZUJsb2NrKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxpbmVC
b3gtPnByZXZSb290Qm94KCkgfHwgbGluZUJveC0+cHJldlJvb3RCb3goKS0+YW5vbnltb3VzSW5s
aW5lQmxvY2soKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2VNYXJn
aW5zKDAsIG1hcmdpbkluZm8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbklu
Zm8uc2V0QXRUb3BPZkJsb2NrKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKwog
ICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm93IHdlIHBvc2l0aW9uIGFsbCBvZiBvdXIgdGV4
dCBydW5zIGhvcml6b250YWxseS4KICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVIb3Jp
em9udGFsUG9zaXRpb25zRm9yTGluZShsaW5lQm94LCBmaXJzdExpbmUsIHJlc29sdmVyLmZpcnN0
UnVuKCksIHRyYWlsaW5nU3BhY2VSdW4sIGVuZC5hdEVuZCgpKTsKIApAQCAtMTE2MSw4ICsxMTkw
LDE0IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmxheW91dElubGluZUNoaWxkcmVuKGIKICAgICAgICAg
fQogICAgIH0KIAotICAgIC8vIE5vdyBhZGQgaW4gdGhlIGJvdHRvbSBib3JkZXIvcGFkZGluZy4K
LSAgICBzZXRIZWlnaHQoaGVpZ2h0KCkgKyB0b0FkZCk7CisgICAgLy8gTm93IGRvIHRoZSBoYW5k
bGluZyBvZiB0aGUgYm90dG9tIG9mIHRoZSBibG9jaywgYWRkaW5nIGluIG91ciBib3R0b20gYm9y
ZGVyL3BhZGRpbmcgYW5kCisgICAgLy8gZGV0ZXJtaW5pbmcgdGhlIGNvcnJlY3QgY29sbGFwc2Vk
IGJvdHRvbSBtYXJnaW4gaW5mb3JtYXRpb24uICBUaGlzIGNvbGxhcHNlIGlzIG9ubHkgbmVjZXNz
YXJ5CisgICAgLy8gaWYgb3VyIGxhc3QgY2hpbGQgd2FzIGFuIGFub255bW91cyBpbmxpbmUgYmxv
Y2sgdGhhdCBtaWdodCBuZWVkIHRvIHByb3BhZ2F0ZSBtYXJnaW4gaW5mb3JtYXRpb24gb3V0IHRv
CisgICAgLy8gdXMuCisgICAgaWYgKGxhc3RSb290Qm94KCkgJiYgbGFzdFJvb3RCb3goKS0+YW5v
bnltb3VzSW5saW5lQmxvY2soKSkKKyAgICAgICAgaGFuZGxlQm90dG9tT2ZCbG9jayh0b3AsIGJv
dHRvbSwgbWFyZ2luSW5mbyk7CisgICAgZWxzZQorICAgICAgICBzZXRIZWlnaHQoaGVpZ2h0KCkg
KyBib3R0b20pOwogCiAgICAgaWYgKCFmaXJzdExpbmVCb3goKSAmJiBoYXNMaW5lSWZFbXB0eSgp
KQogICAgICAgICBzZXRIZWlnaHQoaGVpZ2h0KCkgKyBsaW5lSGVpZ2h0KHRydWUsIHRydWUpKTsK
QEAgLTExODMsNiArMTIxOCwxMiBAQCBSb290SW5saW5lQm94KiBSZW5kZXJCbG9jazo6ZGV0ZXJt
aW5lU3RhCiAgICAgaWYgKCFmdWxsTGF5b3V0KSB7CiAgICAgICAgIHNpemVfdCBmbG9hdEluZGV4
ID0gMDsKICAgICAgICAgZm9yIChjdXJyID0gZmlyc3RSb290Qm94KCk7IGN1cnIgJiYgIWN1cnIt
PmlzRGlydHkoKTsgY3VyciA9IGN1cnItPm5leHRSb290Qm94KCkpIHsKKyAgICAgICAgICAgIGlm
IChjdXJyLT5hbm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CisgICAgICAgICAgICAgICAgLy8gRklY
TUU6IFdlIGhhdmUgdG8gZG8gYmV0dGVyIHRoYW4gdGhpcyBvciB3ZSB3aWxsIHJlcGFpbnQgdG9v
IG11Y2ggYXMgY29udGVudCBpbnNpZGUgYW4KKyAgICAgICAgICAgICAgICAvLyBhbm9ueW1vdXMg
aW5saW5lIGJsb2NrIGNvbWVzIGluLgorICAgICAgICAgICAgICAgIGZ1bGxMYXlvdXQgPSB0cnVl
OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYg
KFZlY3RvcjxSZW5kZXJCb3gqPiogY2xlYW5MaW5lRmxvYXRzID0gY3Vyci0+ZmxvYXRzUHRyKCkp
IHsKICAgICAgICAgICAgICAgICBWZWN0b3I8UmVuZGVyQm94Kj46Oml0ZXJhdG9yIGVuZCA9IGNs
ZWFuTGluZUZsb2F0cy0+ZW5kKCk7CiAgICAgICAgICAgICAgICAgZm9yIChWZWN0b3I8UmVuZGVy
Qm94Kj46Oml0ZXJhdG9yIG8gPSBjbGVhbkxpbmVGbG9hdHMtPmJlZ2luKCk7IG8gIT0gZW5kOyAr
K28pIHsKQEAgLTE1OTcsNyArMTYzOCw3IEBAIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgdGV4dFdp
ZHRoKFJlbmRlclQKIH0KIAogSW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6OmZpbmROZXh0TGlu
ZUJyZWFrKElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIsIGJvb2wgZmlyc3RMaW5lLCAgYm9v
bCYgaXNMaW5lRW1wdHksIGJvb2wmIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSwgCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUNsZWFyKiBjbGVhcikKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXJnaW5JbmZvJiBt
YXJnaW5JbmZvLCBFQ2xlYXIqIGNsZWFyKQogewogICAgIEFTU0VSVChyZXNvbHZlci5wb3NpdGlv
bigpLmJsb2NrID09IHRoaXMpOwogCkBAIC0xNjM4LDYgKzE2NzksMTEgQEAgSW5saW5lSXRlcmF0
b3IgUmVuZGVyQmxvY2s6OmZpbmROZXh0TGluZQogICAgIGJvb2wgYXV0b1dyYXBXYXNFdmVyVHJ1
ZU9uTGluZSA9IGZhbHNlOwogICAgIGJvb2wgZmxvYXRzRml0T25MaW5lID0gdHJ1ZTsKICAgICAK
KyAgICBib29sIGlzQmxvY2tJbnNpZGVJbmxpbmUgPSBmYWxzZTsKKyAgICAKKyAgICBpbnQgcHJl
dmlvdXNCbG9ja0Zsb2F0Qm90dG9tID0gMDsKKyAgICBpbnQgbWF4QmxvY2tGbG9hdEJvdHRvbSA9
IDA7CisKICAgICAvLyBGaXJlZm94IGFuZCBPcGVyYSB3aWxsIGFsbG93IGEgdGFibGUgY2VsbCB0
byBncm93IHRvIGZpdCBhbiBpbWFnZSBpbnNpZGUgaXQgdW5kZXIKICAgICAvLyB2ZXJ5IHNwZWNp
ZmljIGNpcmN1bXN0YW5jZXMgKGluIG9yZGVyIHRvIG1hdGNoIGNvbW1vbiBXaW5JRSByZW5kZXJp
bmdzKS4gCiAgICAgLy8gTm90IHN1cHBvcnRpbmcgdGhlIHF1aXJrIGhhcyBjYXVzZWQgdXMgdG8g
bWlzLXJlbmRlciBzb21lIHJlYWwgc2l0ZXMuIChTZWUgQnVnemlsbGEgMTA1MTcuKSAKQEAgLTE2
NDgsNyArMTY5NCw4IEBAIElubGluZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpmaW5kTmV4dExpbmUK
ICAgICB3aGlsZSAobykgewogICAgICAgICBjdXJyV1MgPSBvLT5pc1JlcGxhY2VkKCkgPyBvLT5w
YXJlbnQoKS0+c3R5bGUoKS0+d2hpdGVTcGFjZSgpIDogby0+c3R5bGUoKS0+d2hpdGVTcGFjZSgp
OwogICAgICAgICBsYXN0V1MgPSBsYXN0LT5pc1JlcGxhY2VkKCkgPyBsYXN0LT5wYXJlbnQoKS0+
c3R5bGUoKS0+d2hpdGVTcGFjZSgpIDogbGFzdC0+c3R5bGUoKS0+d2hpdGVTcGFjZSgpOwotICAg
ICAgICAKKyAgICAgICAgaXNCbG9ja0luc2lkZUlubGluZSA9IG8tPmlzQW5vbnltb3VzSW5saW5l
QmxvY2soKTsKKwogICAgICAgICBib29sIGF1dG9XcmFwID0gUmVuZGVyU3R5bGU6OmF1dG9XcmFw
KGN1cnJXUyk7CiAgICAgICAgIGF1dG9XcmFwV2FzRXZlclRydWVPbkxpbmUgPSBhdXRvV3JhcFdh
c0V2ZXJUcnVlT25MaW5lIHx8IGF1dG9XcmFwOwogCkBAIC0xNjU5LDcgKzE3MDYsNyBAQCBJbmxp
bmVJdGVyYXRvciBSZW5kZXJCbG9jazo6ZmluZE5leHRMaW5lCiAjZW5kaWYKIAogICAgICAgICBi
b29sIGNvbGxhcHNlV2hpdGVTcGFjZSA9IFJlbmRlclN0eWxlOjpjb2xsYXBzZVdoaXRlU3BhY2Uo
Y3VycldTKTsKLSAgICAgICAgICAgIAorCiAgICAgICAgIGlmIChvLT5pc0JSKCkpIHsKICAgICAg
ICAgICAgIGlmICh3ICsgdG1wVyA8PSB3aWR0aCkgewogICAgICAgICAgICAgICAgIGxCcmVhay5v
YmogPSBvOwpAQCAtMTc2Niw4ICsxODEzLDkgQEAgSW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6
OmZpbmROZXh0TGluZQogICAgICAgICB9IGVsc2UgaWYgKG8tPmlzUmVwbGFjZWQoKSkgewogICAg
ICAgICAgICAgUmVuZGVyQm94KiByZXBsYWNlZEJveCA9IHRvUmVuZGVyQm94KG8pOwogCi0gICAg
ICAgICAgICAvLyBCcmVhayBvbiByZXBsYWNlZCBlbGVtZW50cyBpZiBlaXRoZXIgaGFzIG5vcm1h
bCB3aGl0ZS1zcGFjZS4KLSAgICAgICAgICAgIGlmICgoYXV0b1dyYXAgfHwgUmVuZGVyU3R5bGU6
OmF1dG9XcmFwKGxhc3RXUykpICYmICghby0+aXNJbWFnZSgpIHx8IGFsbG93SW1hZ2VzVG9CcmVh
aykpIHsKKyAgICAgICAgICAgIC8vIEJyZWFrIG9uIHJlcGxhY2VkIGVsZW1lbnRzIGlmIGVpdGhl
ciBoYXMgbm9ybWFsIHdoaXRlLXNwYWNlLiAgV2UgYWxzbyBhbHdheXMgYnJlYWsgaWYgd2UKKyAg
ICAgICAgICAgIC8vIGVuY291bnRlciBhIHNwZWNpYWwgYW5vbnltb3VzIGlubGluZSBibG9jayAo
dXNlZCB0byBob2xkIGJsb2NrcyBpbnNpZGUgaW5saW5lcykuCisgICAgICAgICAgICBpZiAoKGF1
dG9XcmFwIHx8IFJlbmRlclN0eWxlOjphdXRvV3JhcChsYXN0V1MpIHx8IGlzQmxvY2tJbnNpZGVJ
bmxpbmUpICAmJiAoIW8tPmlzSW1hZ2UoKSB8fCBhbGxvd0ltYWdlc1RvQnJlYWspKSB7CiAgICAg
ICAgICAgICAgICAgdyArPSB0bXBXOwogICAgICAgICAgICAgICAgIHRtcFcgPSAwOwogICAgICAg
ICAgICAgICAgIGxCcmVhay5vYmogPSBvOwpAQCAtMTc3NSw2ICsxODIzLDE5IEBAIElubGluZUl0
ZXJhdG9yIFJlbmRlckJsb2NrOjpmaW5kTmV4dExpbmUKICAgICAgICAgICAgICAgICBsQnJlYWsu
bmV4dEJyZWFrYWJsZVBvc2l0aW9uID0gLTE7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAg
IGlmIChpc0Jsb2NrSW5zaWRlSW5saW5lKSB7CisgICAgICAgICAgICAgICAgaWYgKCFpc0xpbmVF
bXB0eSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBlbmQ7CisKKyAgICAgICAgICAgICAgICAv
LyBSZXNldCB0aGUgd2lkdGggdG8gaWdub3JlIGZsb2F0cywgc2luY2Ugd2UncmUgZ29pbmcgdG8g
YWxsb3cgdGhlbSB0byBpbnRydWRlIGludG8gb3VyIHNwYWNlLgorICAgICAgICAgICAgICAgIHdp
ZHRoID0gcmlnaHRPZmZzZXQoKSAtIGxlZnRPZmZzZXQoKTsKKworICAgICAgICAgICAgICAgIC8v
IEZJWE1FOiBUaGlzIGNhbGwgd2lsbCB1cGRhdGUgdGhlIGhlaWdodCBvZiBvdXIgYmxvY2suICBJ
dCdzIG5vdCBjbGVhciBpZiB0aGF0J3MgZ29pbmcgdG8gYmUgb2sgb3Igbm90IHlldC4KKyAgICAg
ICAgICAgICAgICBsYXlvdXRCbG9ja0NoaWxkKHJlcGxhY2VkQm94LCBtYXJnaW5JbmZvLCBwcmV2
aW91c0Jsb2NrRmxvYXRCb3R0b20sIG1heEJsb2NrRmxvYXRCb3R0b20pOworCisgICAgICAgICAg
ICAgICAgbGluZU1pZHBvaW50U3RhdGUuYmV0d2Vlbk1pZHBvaW50cyA9IGZhbHNlOworICAgICAg
ICAgICAgfQorCiAgICAgICAgICAgICBpZiAoaWdub3JpbmdTcGFjZXMpCiAgICAgICAgICAgICAg
ICAgYWRkTWlkcG9pbnQobGluZU1pZHBvaW50U3RhdGUsIElubGluZUl0ZXJhdG9yKDAsIG8sIDAp
KTsKIApAQCAtMTc5OCw2ICsxODU5LDE1IEBAIElubGluZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpm
aW5kTmV4dExpbmUKICAgICAgICAgICAgICAgICAgICAgdG1wVyArPSByZXBsYWNlZEJveC0+d2lk
dGgoKSArIHJlcGxhY2VkQm94LT5tYXJnaW5MZWZ0KCkgKyByZXBsYWNlZEJveC0+bWFyZ2luUmln
aHQoKSArIGlubGluZVdpZHRoKG8pOwogICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAg
ICAgdG1wVyArPSByZXBsYWNlZEJveC0+d2lkdGgoKSArIHJlcGxhY2VkQm94LT5tYXJnaW5MZWZ0
KCkgKyByZXBsYWNlZEJveC0+bWFyZ2luUmlnaHQoKSArIGlubGluZVdpZHRoKG8pOworICAgICAg
ICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGlzQmxvY2tJbnNpZGVJbmxpbmUpIHsKKyAgICAg
ICAgICAgICAgICB3ICs9IHRtcFc7CisgICAgICAgICAgICAgICAgdG1wVyA9IDA7CisgICAgICAg
ICAgICAgICAgbEJyZWFrLm9iaiA9IG87CisgICAgICAgICAgICAgICAgbEJyZWFrLnBvcyA9IDA7
CisgICAgICAgICAgICAgICAgbEJyZWFrLm5leHRCcmVha2FibGVQb3NpdGlvbiA9IC0xOworICAg
ICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYg
KG8tPmlzVGV4dCgpKSB7CiAgICAgICAgICAgICBpZiAoIXBvcykKICAgICAgICAgICAgICAgICBh
cHBsaWVkU3RhcnRXaWR0aCA9IGZhbHNlOwpAQCAtMjE5MSw3ICsyMjYxLDcgQEAgSW5saW5lSXRl
cmF0b3IgUmVuZGVyQmxvY2s6OmZpbmROZXh0TGluZQogICAgICAgICB9CiAgICAgICAgIC8vZWxz
ZSBpZiAobEJyZWFrLnBvcyA+IDApCiAgICAgICAgIC8vICAgIGxCcmVhay5wb3MtLTsKLSAgICAg
ICAgZWxzZSBpZiAobEJyZWFrLm9iaiA9PSAwICYmIHRyYWlsaW5nU3BhY2VPYmplY3QtPmlzVGV4
dCgpKSB7CisgICAgICAgIGVsc2UgaWYgKCghbEJyZWFrLm9iaiB8fCBsQnJlYWsub2JqLT5pc0Fu
b255bW91c0lubGluZUJsb2NrKCkpICYmIHRyYWlsaW5nU3BhY2VPYmplY3QtPmlzVGV4dCgpKSB7
CiAgICAgICAgICAgICAvLyBBZGQgYSBuZXcgZW5kIG1pZHBvaW50IHRoYXQgc3RvcHMgcmlnaHQg
YXQgdGhlIHZlcnkgZW5kLgogICAgICAgICAgICAgUmVuZGVyVGV4dCogdGV4dCA9IHRvUmVuZGVy
VGV4dCh0cmFpbGluZ1NwYWNlT2JqZWN0KTsKICAgICAgICAgICAgIHVuc2lnbmVkIGxlbmd0aCA9
IHRleHQtPnRleHRMZW5ndGgoKTsKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJveC5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQm94LmNwcAkocmV2aXNp
b24gNTQ1MDEpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCb3guY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0xMzM0LDcgKzEzMzQsNyBAQCB2b2lkIFJlbmRlckJveDo6Y2FsY1dpZHRoKCkKICAg
ICB9CiAKICAgICBpZiAoY29udGFpbmVyV2lkdGggJiYgY29udGFpbmVyV2lkdGggIT0gKHdpZHRo
KCkgKyBtX21hcmdpbkxlZnQgKyBtX21hcmdpblJpZ2h0KQotICAgICAgICAgICAgJiYgIWlzRmxv
YXRpbmcoKSAmJiAhaXNJbmxpbmUoKSAmJiAhY2ItPmlzRmxleGlibGVCb3goKSkgeworICAgICAg
ICAgICAgJiYgIWlzRmxvYXRpbmcoKSAmJiAoIWlzSW5saW5lKCkgfHwgaXNBbm9ueW1vdXNJbmxp
bmVCbG9jaygpKSAmJiAhY2ItPmlzRmxleGlibGVCb3goKSkgewogICAgICAgICBpZiAoY2ItPnN0
eWxlKCktPmRpcmVjdGlvbigpID09IExUUikKICAgICAgICAgICAgIG1fbWFyZ2luUmlnaHQgPSBj
b250YWluZXJXaWR0aCAtIHdpZHRoKCkgLSBtX21hcmdpbkxlZnQ7CiAgICAgICAgIGVsc2UKQEAg
LTEzNzMsNyArMTM3Myw3IEBAIGJvb2wgUmVuZGVyQm94OjpzaXplc1RvSW50cmluc2ljV2lkdGgo
V2kKIHsKICAgICAvLyBNYXJxdWVlcyBpbiBXaW5JRSBhcmUgbGlrZSBhIG1peHR1cmUgb2YgYmxv
Y2tzIGFuZCBpbmxpbmUtYmxvY2tzLiAgVGhleSBzaXplIGFzIHRob3VnaCB0aGV5J3JlIGJsb2Nr
cywKICAgICAvLyBidXQgdGhleSBhbGxvdyB0ZXh0IHRvIHNpdCBvbiB0aGUgc2FtZSBsaW5lIGFz
IHRoZSBtYXJxdWVlLgotICAgIGlmIChpc0Zsb2F0aW5nKCkgfHwgKGlzSW5saW5lQmxvY2tPcklu
bGluZVRhYmxlKCkgJiYgIWlzSFRNTE1hcnF1ZWUoKSkpCisgICAgaWYgKGlzRmxvYXRpbmcoKSB8
fCAoaXNJbmxpbmVCbG9ja09ySW5saW5lVGFibGUoKSAmJiAhaXNIVE1MTWFycXVlZSgpICYmICFp
c0Fub255bW91c0lubGluZUJsb2NrKCkpKQogICAgICAgICByZXR1cm4gdHJ1ZTsKIAogICAgIC8v
IFRoaXMgY29kZSBtYXkgbG9vayBhIGJpdCBzdHJhbmdlLiAgQmFzaWNhbGx5IHdpZHRoOmludHJp
bnNpYyBzaG91bGQgY2xhbXAgdGhlIHNpemUgd2hlbiB0ZXN0aW5nIGJvdGgKQEAgLTI4MTksNyAr
MjgxOSw3IEBAIGJvb2wgUmVuZGVyQm94OjpzaHJpbmtUb0F2b2lkRmxvYXRzKCkgY28KIAogYm9v
bCBSZW5kZXJCb3g6OmF2b2lkc0Zsb2F0cygpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIGlzUmVwbGFj
ZWQoKSB8fCBoYXNPdmVyZmxvd0NsaXAoKSB8fCBpc0hSKCk7CisgICAgcmV0dXJuICFpc0Fub255
bW91c0lubGluZUJsb2NrKCkgJiYgKGlzUmVwbGFjZWQoKSB8fCBoYXNPdmVyZmxvd0NsaXAoKSB8
fCBpc0hSKCkpOwogfQogCiB2b2lkIFJlbmRlckJveDo6YWRkU2hhZG93T3ZlcmZsb3coKQpJbmRl
eDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVySW5saW5lLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL3JlbmRlcmluZy9SZW5kZXJJbmxpbmUuY3BwCShyZXZpc2lvbiA1NDUwMSkKKysrIFdlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlcklubGluZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ0LDcgKzQ0
LDYgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogCiBSZW5kZXJJbmxpbmU6OlJlbmRlcklubGluZShO
b2RlKiBub2RlKQogICAgIDogUmVuZGVyQm94TW9kZWxPYmplY3Qobm9kZSkKLSAgICAsIG1fY29u
dGludWF0aW9uKDApCiAgICAgLCBtX2xpbmVIZWlnaHQoLTEpCiAgICAgLCBtX3ZlcnRpY2FsUG9z
aXRpb24oUG9zaXRpb25VbmRlZmluZWQpCiB7CkBAIC01NiwxNCArNTUsNiBAQCB2b2lkIFJlbmRl
cklubGluZTo6ZGVzdHJveSgpCiAgICAgLy8gTWFrZSBzdXJlIHRvIGRlc3Ryb3kgYW5vbnltb3Vz
IGNoaWxkcmVuIGZpcnN0IHdoaWxlIHRoZXkgYXJlIHN0aWxsIGNvbm5lY3RlZCB0byB0aGUgcmVz
dCBvZiB0aGUgdHJlZSwgc28gdGhhdCB0aGV5IHdpbGwKICAgICAvLyBwcm9wZXJseSBkaXJ0eSBs
aW5lIGJveGVzIHRoYXQgdGhleSBhcmUgcmVtb3ZlZCBmcm9tLiAgRWZmZWN0cyB0aGF0IGRvIDpi
ZWZvcmUvOmFmdGVyIG9ubHkgb24gaG92ZXIgY291bGQgY3Jhc2ggb3RoZXJ3aXNlLgogICAgIGNo
aWxkcmVuKCktPmRlc3Ryb3lMZWZ0b3ZlckNoaWxkcmVuKCk7Ci0KLSAgICAvLyBEZXN0cm95IG91
ciBjb250aW51YXRpb24gYmVmb3JlIGFueXRoaW5nIG90aGVyIHRoYW4gYW5vbnltb3VzIGNoaWxk
cmVuLgotICAgIC8vIFRoZSByZWFzb24gd2UgZG9uJ3QgZGVzdHJveSBpdCBiZWZvcmUgYW5vbnlt
b3VzIGNoaWxkcmVuIGlzIHRoYXQgdGhleSBtYXkKLSAgICAvLyBoYXZlIGNvbnRpbnVhdGlvbnMg
b2YgdGhlaXIgb3duIHRoYXQgYXJlIGFub255bW91cyBjaGlsZHJlbiBvZiBvdXIgY29udGludWF0
aW9uLgotICAgIGlmIChtX2NvbnRpbnVhdGlvbikgewotICAgICAgICBtX2NvbnRpbnVhdGlvbi0+
ZGVzdHJveSgpOwotICAgICAgICBtX2NvbnRpbnVhdGlvbiA9IDA7Ci0gICAgfQogICAgIAogICAg
IGlmICghZG9jdW1lbnRCZWluZ0Rlc3Ryb3llZCgpKSB7CiAgICAgICAgIGlmIChmaXJzdExpbmVC
b3goKSkgewpAQCAtOTIsMTMgKzgzLDYgQEAgdm9pZCBSZW5kZXJJbmxpbmU6OmRlc3Ryb3koKQog
ICAgIFJlbmRlckJveE1vZGVsT2JqZWN0OjpkZXN0cm95KCk7CiB9CiAKLVJlbmRlcklubGluZSog
UmVuZGVySW5saW5lOjppbmxpbmVDb250aW51YXRpb24oKSBjb25zdAotewotICAgIGlmICghbV9j
b250aW51YXRpb24gfHwgbV9jb250aW51YXRpb24tPmlzSW5saW5lKCkpCi0gICAgICAgIHJldHVy
biB0b1JlbmRlcklubGluZShtX2NvbnRpbnVhdGlvbik7Ci0gICAgcmV0dXJuIHRvUmVuZGVyQmxv
Y2sobV9jb250aW51YXRpb24pLT5pbmxpbmVDb250aW51YXRpb24oKTsKLX0KLQogdm9pZCBSZW5k
ZXJJbmxpbmU6OnVwZGF0ZUJveE1vZGVsSW5mb0Zyb21TdHlsZSgpCiB7CiAgICAgUmVuZGVyQm94
TW9kZWxPYmplY3Q6OnVwZGF0ZUJveE1vZGVsSW5mb0Zyb21TdHlsZSgpOwpAQCAtMTE0LDE5ICs5
OCw2IEBAIHZvaWQgUmVuZGVySW5saW5lOjpzdHlsZURpZENoYW5nZShTdHlsZUQKIHsKICAgICBS
ZW5kZXJCb3hNb2RlbE9iamVjdDo6c3R5bGVEaWRDaGFuZ2UoZGlmZiwgb2xkU3R5bGUpOwogCi0g
ICAgLy8gRW5zdXJlIHRoYXQgYWxsIG9mIHRoZSBzcGxpdCBpbmxpbmVzIHBpY2sgdXAgdGhlIG5l
dyBzdHlsZS4gV2UKLSAgICAvLyBvbmx5IGRvIHRoaXMgaWYgd2UncmUgYW4gaW5saW5lLCBzaW5j
ZSB3ZSBkb24ndCB3YW50IHRvIHByb3BhZ2F0ZQotICAgIC8vIGEgYmxvY2sncyBzdHlsZSB0byB0
aGUgb3RoZXIgaW5saW5lcy4KLSAgICAvLyBlLmcuLCA8Zm9udD5mb28gPGg0PmdvbzwvaDQ+IG1v
bzwvZm9udD4uICBUaGUgPGZvbnQ+IGlubGluZXMgYmVmb3JlCi0gICAgLy8gYW5kIGFmdGVyIHRo
ZSBibG9jayBzaGFyZSB0aGUgc2FtZSBzdHlsZSwgYnV0IHRoZSBibG9jayBkb2Vzbid0Ci0gICAg
Ly8gbmVlZCB0byBwYXNzIGl0cyBzdHlsZSBvbiB0byBhbnlvbmUgZWxzZS4KLSAgICBmb3IgKFJl
bmRlcklubGluZSogY3VyckNvbnQgPSBpbmxpbmVDb250aW51YXRpb24oKTsgY3VyckNvbnQ7IGN1
cnJDb250ID0gY3VyckNvbnQtPmlubGluZUNvbnRpbnVhdGlvbigpKSB7Ci0gICAgICAgIFJlbmRl
ckJveE1vZGVsT2JqZWN0KiBuZXh0Q29udCA9IGN1cnJDb250LT5jb250aW51YXRpb24oKTsKLSAg
ICAgICAgY3VyckNvbnQtPnNldENvbnRpbnVhdGlvbigwKTsKLSAgICAgICAgY3VyckNvbnQtPnNl
dFN0eWxlKHN0eWxlKCkpOwotICAgICAgICBjdXJyQ29udC0+c2V0Q29udGludWF0aW9uKG5leHRD
b250KTsKLSAgICB9Ci0KICAgICBtX2xpbmVIZWlnaHQgPSAtMTsKIAogICAgIC8vIFVwZGF0ZSBw
c2V1ZG9zIGZvciA6YmVmb3JlIGFuZCA6YWZ0ZXIgbm93LgpAQCAtMTM2LDc5ICsxMDcsNzMgQEAg
dm9pZCBSZW5kZXJJbmxpbmU6OnN0eWxlRGlkQ2hhbmdlKFN0eWxlRAogICAgIH0KIH0KIAotdm9p
ZCBSZW5kZXJJbmxpbmU6OmFkZENoaWxkKFJlbmRlck9iamVjdCogbmV3Q2hpbGQsIFJlbmRlck9i
amVjdCogYmVmb3JlQ2hpbGQpCi17Ci0gICAgaWYgKGNvbnRpbnVhdGlvbigpKQotICAgICAgICBy
ZXR1cm4gYWRkQ2hpbGRUb0NvbnRpbnVhdGlvbihuZXdDaGlsZCwgYmVmb3JlQ2hpbGQpOwotICAg
IHJldHVybiBhZGRDaGlsZElnbm9yaW5nQ29udGludWF0aW9uKG5ld0NoaWxkLCBiZWZvcmVDaGls
ZCk7Ci19Ci0KLXN0YXRpYyBSZW5kZXJCb3hNb2RlbE9iamVjdCogbmV4dENvbnRpbnVhdGlvbihS
ZW5kZXJPYmplY3QqIHJlbmRlcmVyKQordm9pZCBSZW5kZXJJbmxpbmU6OmNoaWxkQmVjYW1lTm9u
SW5saW5lKFJlbmRlck9iamVjdCogY2hpbGQpCiB7Ci0gICAgaWYgKHJlbmRlcmVyLT5pc0lubGlu
ZSgpICYmICFyZW5kZXJlci0+aXNSZXBsYWNlZCgpKQotICAgICAgICByZXR1cm4gdG9SZW5kZXJJ
bmxpbmUocmVuZGVyZXIpLT5jb250aW51YXRpb24oKTsKLSAgICByZXR1cm4gdG9SZW5kZXJCbG9j
ayhyZW5kZXJlciktPmlubGluZUNvbnRpbnVhdGlvbigpOworICAgIFJlbmRlck9iamVjdCogbmV4
dCA9IGNoaWxkLT5uZXh0U2libGluZygpOworICAgIHJlbW92ZUNoaWxkKGNoaWxkKTsKKyAgICBh
ZGRDaGlsZChjaGlsZCwgbmV4dCk7CiB9CiAKLVJlbmRlckJveE1vZGVsT2JqZWN0KiBSZW5kZXJJ
bmxpbmU6OmNvbnRpbnVhdGlvbkJlZm9yZShSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkKQotewot
ICAgIGlmIChiZWZvcmVDaGlsZCAmJiBiZWZvcmVDaGlsZC0+cGFyZW50KCkgPT0gdGhpcykKLSAg
ICAgICAgcmV0dXJuIHRoaXM7Ci0KLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogY3VyciA9IG5l
eHRDb250aW51YXRpb24odGhpcyk7Ci0gICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIG5leHRUb0xh
c3QgPSB0aGlzOwotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBsYXN0ID0gdGhpczsKLSAgICB3
aGlsZSAoY3VycikgewotICAgICAgICBpZiAoYmVmb3JlQ2hpbGQgJiYgYmVmb3JlQ2hpbGQtPnBh
cmVudCgpID09IGN1cnIpIHsKLSAgICAgICAgICAgIGlmIChjdXJyLT5maXJzdENoaWxkKCkgPT0g
YmVmb3JlQ2hpbGQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGxhc3Q7Ci0gICAgICAgICAgICBy
ZXR1cm4gY3VycjsKLSAgICAgICAgfQotCi0gICAgICAgIG5leHRUb0xhc3QgPSBsYXN0OwotICAg
ICAgICBsYXN0ID0gY3VycjsKLSAgICAgICAgY3VyciA9IG5leHRDb250aW51YXRpb24oY3Vycik7
Ci0gICAgfQotCi0gICAgaWYgKCFiZWZvcmVDaGlsZCAmJiAhbGFzdC0+Zmlyc3RDaGlsZCgpKQot
ICAgICAgICByZXR1cm4gbmV4dFRvTGFzdDsKLSAgICByZXR1cm4gbGFzdDsKLX0KLQotdm9pZCBS
ZW5kZXJJbmxpbmU6OmFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24oUmVuZGVyT2JqZWN0KiBu
ZXdDaGlsZCwgUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCkKK3ZvaWQgUmVuZGVySW5saW5lOjph
ZGRDaGlsZChSZW5kZXJPYmplY3QqIG5ld0NoaWxkLCBSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxk
KQogewogICAgIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBhcHBlbmQgdGhpbmdzIGFmdGVyIDphZnRl
ci1nZW5lcmF0ZWQgY29udGVudCBpZiB3ZSBoYXZlIGl0LgogICAgIGlmICghYmVmb3JlQ2hpbGQg
JiYgaXNBZnRlckNvbnRlbnQobGFzdENoaWxkKCkpKQogICAgICAgICBiZWZvcmVDaGlsZCA9IGxh
c3RDaGlsZCgpOwogCi0gICAgaWYgKCFuZXdDaGlsZC0+aXNJbmxpbmUoKSAmJiAhbmV3Q2hpbGQt
PmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSkgewotICAgICAgICAvLyBXZSBhcmUgcGxhY2luZyBh
IGJsb2NrIGluc2lkZSBhbiBpbmxpbmUuIFdlIGhhdmUgdG8gcGVyZm9ybSBhIHNwbGl0IG9mIHRo
aXMKLSAgICAgICAgLy8gaW5saW5lIGludG8gY29udGludWF0aW9ucy4gIFRoaXMgaW52b2x2ZXMg
Y3JlYXRpbmcgYW4gYW5vbnltb3VzIGJsb2NrIGJveCB0byBob2xkCi0gICAgICAgIC8vIHxuZXdD
aGlsZHwuICBXZSB0aGVuIG1ha2UgdGhhdCBibG9jayBib3ggYSBjb250aW51YXRpb24gb2YgdGhp
cyBpbmxpbmUuICBXZSB0YWtlIGFsbCBvZgotICAgICAgICAvLyB0aGUgY2hpbGRyZW4gYWZ0ZXIg
fGJlZm9yZUNoaWxkfCBhbmQgcHV0IHRoZW0gaW4gYSBjbG9uZSBvZiB0aGlzIG9iamVjdC4KLSAg
ICAgICAgUmVmUHRyPFJlbmRlclN0eWxlPiBuZXdTdHlsZSA9IFJlbmRlclN0eWxlOjpjcmVhdGUo
KTsKLSAgICAgICAgbmV3U3R5bGUtPmluaGVyaXRGcm9tKHN0eWxlKCkpOwotICAgICAgICBuZXdT
dHlsZS0+c2V0RGlzcGxheShCTE9DSyk7Ci0KLSAgICAgICAgUmVuZGVyQmxvY2sqIG5ld0JveCA9
IG5ldyAocmVuZGVyQXJlbmEoKSkgUmVuZGVyQmxvY2soZG9jdW1lbnQoKSAvKiBhbm9ueW1vdXMg
Ym94ICovKTsKLSAgICAgICAgbmV3Qm94LT5zZXRTdHlsZShuZXdTdHlsZS5yZWxlYXNlKCkpOwot
ICAgICAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogb2xkQ29udGludWF0aW9uID0gY29udGludWF0
aW9uKCk7Ci0gICAgICAgIHNldENvbnRpbnVhdGlvbihuZXdCb3gpOwotCi0gICAgICAgIC8vIFNv
bWVvbmUgbWF5IGhhdmUgcHV0IGEgPHA+IGluc2lkZSBhIDxxPiwgY2F1c2luZyBhIHNwbGl0LiAg
V2hlbiB0aGlzIGhhcHBlbnMsIHRoZSA6YWZ0ZXIgY29udGVudAotICAgICAgICAvLyBoYXMgdG8g
bW92ZSBpbnRvIHRoZSBpbmxpbmUgY29udGludWF0aW9uLiAgQ2FsbCB1cGRhdGVCZWZvcmVBZnRl
ckNvbnRlbnQgdG8gZW5zdXJlIHRoYXQgb3VyIDphZnRlcgotICAgICAgICAvLyBjb250ZW50IGdl
dHMgcHJvcGVybHkgZGVzdHJveWVkLgotICAgICAgICBib29sIGlzTGFzdENoaWxkID0gKGJlZm9y
ZUNoaWxkID09IGxhc3RDaGlsZCgpKTsKLSAgICAgICAgaWYgKGRvY3VtZW50KCktPnVzZXNCZWZv
cmVBZnRlclJ1bGVzKCkpCi0gICAgICAgICAgICBjaGlsZHJlbigpLT51cGRhdGVCZWZvcmVBZnRl
ckNvbnRlbnQodGhpcywgQUZURVIpOwotICAgICAgICBpZiAoaXNMYXN0Q2hpbGQgJiYgYmVmb3Jl
Q2hpbGQgIT0gbGFzdENoaWxkKCkpCi0gICAgICAgICAgICBiZWZvcmVDaGlsZCA9IDA7IC8vIFdl
IGRlc3Ryb3llZCB0aGUgbGFzdCBjaGlsZCwgc28gbm93IHdlIG5lZWQgdG8gdXBkYXRlIG91ciBp
bnNlcnRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9pbnQgdG8gYmUgMC4g
IEl0J3MganVzdCBhIHN0cmFpZ2h0IGFwcGVuZCBub3cuCi0KLSAgICAgICAgc3BsaXRGbG93KGJl
Zm9yZUNoaWxkLCBuZXdCb3gsIG5ld0NoaWxkLCBvbGRDb250aW51YXRpb24pOworICAgIC8vIElm
IHRoZSByZXF1ZXN0ZWQgYmVmb3JlQ2hpbGQgaXMgbm90IG9uZSBvZiBvdXIgY2hpbGRyZW4sIHRo
ZW4gdGhpcyBpcyBtb3N0IGxpa2VseSBiZWNhdXNlCisgICAgLy8gdGhlcmUgaXMgYW4gYW5vbnlt
b3VzIGlubGluZS1ibG9jayBib3ggd2l0aGluIHRoaXMgb2JqZWN0IHRoYXQgY29udGFpbnMgdGhl
IGJlZm9yZUNoaWxkLiBTbworICAgIC8vIGp1c3QgaW5zZXJ0IHRoZSBjaGlsZCBpbnRvIHRoZSBh
bm9ueW1vdXMgaW5saW5lLWJsb2NrIGJveCBpbnN0ZWFkIG9mIGhlcmUuCisgICAgLy8gQSBzZWNv
bmQgcG9zc2liaWxpdHkgaXMgdGhhdCB0aGUgYmVmb3JlQ2hpbGQgaXMgYW4gYW5vbnltb3VzIGJs
b2NrIGluc2lkZSB0aGUgYW5vbnltb3VzIGlubGluZSBibG9jay4KKyAgICAvLyBUaGlzIGNhbiBo
YXBwZW4gaWYgaW5saW5lcyBhcmUgaW5zZXJ0ZWQgaW4gYmV0d2VlbiB0d28gb2YgdGhlIGFub255
bW91cyBpbmxpbmUgYmxvY2sncyBibG9jay1sZXZlbAorICAgIC8vIGNoaWxkcmVuIGFmdGVyIGl0
IGhhcyBiZWVuIGNyZWF0ZWQuCisgICAgaWYgKGJlZm9yZUNoaWxkICYmIGJlZm9yZUNoaWxkLT5w
YXJlbnQoKSAhPSB0aGlzKSB7CisgICAgICAgIEFTU0VSVChiZWZvcmVDaGlsZC0+cGFyZW50KCkp
OworICAgICAgICBBU1NFUlQoYmVmb3JlQ2hpbGQtPnBhcmVudCgpLT5pc0Fub255bW91c0lubGlu
ZUJsb2NrKCkgfHwgYmVmb3JlQ2hpbGQtPnBhcmVudCgpLT5pc0Fub255bW91c0Jsb2NrKCkpOwor
ICAgICAgICBpZiAoYmVmb3JlQ2hpbGQtPnBhcmVudCgpLT5pc0Fub255bW91c0lubGluZUJsb2Nr
KCkpIHsKKyAgICAgICAgICAgIGlmICghbmV3Q2hpbGQtPmlzSW5saW5lKCkgfHwgKG5ld0NoaWxk
LT5pc0lubGluZSgpICYmIGJlZm9yZUNoaWxkLT5wYXJlbnQoKS0+Zmlyc3RDaGlsZCgpICE9IGJl
Zm9yZUNoaWxkKSkKKyAgICAgICAgICAgICAgICBiZWZvcmVDaGlsZC0+cGFyZW50KCktPmFkZENo
aWxkKG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAg
ICAgICAgYWRkQ2hpbGQobmV3Q2hpbGQsIGJlZm9yZUNoaWxkLT5wYXJlbnQoKSk7CisgICAgICAg
IH0gZWxzZSBpZiAoYmVmb3JlQ2hpbGQtPnBhcmVudCgpLT5pc0Fub255bW91c0Jsb2NrKCkpIHsK
KyAgICAgICAgICAgIEFTU0VSVCghYmVmb3JlQ2hpbGQtPnBhcmVudCgpLT5wYXJlbnQoKSB8fCBi
ZWZvcmVDaGlsZC0+cGFyZW50KCktPnBhcmVudCgpLT5pc0Fub255bW91c0lubGluZUJsb2NrKCkp
OworICAgICAgICAgICAgQVNTRVJUKGJlZm9yZUNoaWxkLT5pc0lubGluZSgpKTsKKyAgICAgICAg
ICAgIGlmIChuZXdDaGlsZC0+aXNJbmxpbmUoKSB8fCAoIW5ld0NoaWxkLT5pc0lubGluZSgpICYm
IGJlZm9yZUNoaWxkLT5wYXJlbnQoKS0+Zmlyc3RDaGlsZCgpICE9IGJlZm9yZUNoaWxkKSkKKyAg
ICAgICAgICAgICAgICBiZWZvcmVDaGlsZC0+cGFyZW50KCktPmFkZENoaWxkKG5ld0NoaWxkLCBi
ZWZvcmVDaGlsZCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYWRkQ2hpbGQo
bmV3Q2hpbGQsIGJlZm9yZUNoaWxkLT5wYXJlbnQoKSk7CisgICAgICAgIH0KICAgICAgICAgcmV0
dXJuOwogICAgIH0KIAorICAgIGlmICghbmV3Q2hpbGQtPmlzSW5saW5lKCkpIHsKKyAgICAgICAg
Ly8gV2UgYXJlIHBsYWNpbmcgYSBibG9jayBpbnNpZGUgYW4gaW5saW5lLiBXZSBoYXZlIHRvIHBs
YWNlIHRoZSBibG9jayBpbnNpZGUgYW4gYW5vbnltb3VzIGlubGluZS1ibG9jay4KKyAgICAgICAg
Ly8gVGhpcyBpbmxpbmUtYmxvY2sgY2FuIGhvdXNlIGEgc2VxdWVuY2Ugb2YgY29udGlndW91cyBi
bG9jay1sZXZlbCBjaGlsZHJlbiwgYW5kIHRoZXkgd2lsbCBhbGwgc2l0IG9uIHRoZQorICAgICAg
ICAvLyBzYW1lIGxpbmUgdG9nZXRoZXIuICBXZSB0cnkgdG8gcmV1c2Ugb25lIGZpcnN0IGlmIHBv
c3NpYmxlLgorICAgICAgICBpZiAoYmVmb3JlQ2hpbGQpIHsKKyAgICAgICAgICAgIGlmIChiZWZv
cmVDaGlsZC0+cHJldmlvdXNTaWJsaW5nKCkgJiYgYmVmb3JlQ2hpbGQtPnByZXZpb3VzU2libGlu
ZygpLT5pc0Fub255bW91c0lubGluZUJsb2NrKCkpIHsKKyAgICAgICAgICAgICAgICBiZWZvcmVD
aGlsZC0+cHJldmlvdXNTaWJsaW5nKCktPmFkZENoaWxkKG5ld0NoaWxkKTsKKyAgICAgICAgICAg
ICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAg
ICBpZiAobGFzdENoaWxkKCkgJiYgbGFzdENoaWxkKCktPmlzQW5vbnltb3VzSW5saW5lQmxvY2so
KSkgeworICAgICAgICAgICAgICAgIGxhc3RDaGlsZCgpLT5hZGRDaGlsZChuZXdDaGlsZCk7Cisg
ICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgCisgICAg
ICAgIGlmICghbmV3Q2hpbGQtPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSkgeworICAgICAgICAg
ICAgLy8gVGhlcmUgd2FzIG5vIHN1aXRhYmxlIGV4aXN0aW5nIGFub255bW91cyBib3guICBDcmVh
dGUgYSBuZXcgb25lLgorICAgICAgICAgICAgUmVmUHRyPFJlbmRlclN0eWxlPiBuZXdTdHlsZSA9
IFJlbmRlclN0eWxlOjpjcmVhdGUoKTsKKyAgICAgICAgICAgIG5ld1N0eWxlLT5pbmhlcml0RnJv
bShzdHlsZSgpKTsKKyAgICAgICAgICAgIG5ld1N0eWxlLT5zZXREaXNwbGF5KElOTElORV9CTE9D
Syk7CisgICAgICAgICAgICBSZW5kZXJCbG9jayogbmV3Qm94ID0gbmV3IChyZW5kZXJBcmVuYSgp
KSBSZW5kZXJCbG9jayhkb2N1bWVudCgpKTsKKyAgICAgICAgICAgIG5ld0JveC0+c2V0U3R5bGUo
bmV3U3R5bGUpOworICAgICAgICAgICAgUmVuZGVyQm94TW9kZWxPYmplY3Q6OmFkZENoaWxkKG5l
d0JveCwgYmVmb3JlQ2hpbGQpOworICAgICAgICAgICAgbmV3Qm94LT5hZGRDaGlsZChuZXdDaGls
ZCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKICAgICBSZW5kZXJC
b3hNb2RlbE9iamVjdDo6YWRkQ2hpbGQobmV3Q2hpbGQsIGJlZm9yZUNoaWxkKTsKIAogICAgIG5l
d0NoaWxkLT5zZXROZWVkc0xheW91dEFuZFByZWZXaWR0aHNSZWNhbGMoKTsKQEAgLTIyMSwxODgg
KzE4Niw2IEBAIFJlbmRlcklubGluZSogUmVuZGVySW5saW5lOjpjbG9uZUlubGluZSgKICAgICBy
ZXR1cm4gbzsKIH0KIAotdm9pZCBSZW5kZXJJbmxpbmU6OnNwbGl0SW5saW5lcyhSZW5kZXJCbG9j
ayogZnJvbUJsb2NrLCBSZW5kZXJCbG9jayogdG9CbG9jaywKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgUmVuZGVyQmxvY2sqIG1pZGRsZUJsb2NrLAotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkLCBSZW5kZXJCb3hNb2RlbE9i
amVjdCogb2xkQ29udCkKLXsKLSAgICAvLyBDcmVhdGUgYSBjbG9uZSBvZiB0aGlzIGlubGluZS4K
LSAgICBSZW5kZXJJbmxpbmUqIGNsb25lID0gY2xvbmVJbmxpbmUodGhpcyk7Ci0gICAgY2xvbmUt
PnNldENvbnRpbnVhdGlvbihvbGRDb250KTsKLQotICAgIC8vIE5vdyB0YWtlIGFsbCBvZiB0aGUg
Y2hpbGRyZW4gZnJvbSBiZWZvcmVDaGlsZCB0byB0aGUgZW5kIGFuZCByZW1vdmUKLSAgICAvLyB0
aGVtIGZyb20gfHRoaXN8IGFuZCBwbGFjZSB0aGVtIGluIHRoZSBjbG9uZS4KLSAgICBSZW5kZXJP
YmplY3QqIG8gPSBiZWZvcmVDaGlsZDsKLSAgICB3aGlsZSAobykgewotICAgICAgICBSZW5kZXJP
YmplY3QqIHRtcCA9IG87Ci0gICAgICAgIG8gPSB0bXAtPm5leHRTaWJsaW5nKCk7Ci0gICAgICAg
IGNsb25lLT5hZGRDaGlsZElnbm9yaW5nQ29udGludWF0aW9uKGNoaWxkcmVuKCktPnJlbW92ZUNo
aWxkTm9kZSh0aGlzLCB0bXApLCAwKTsKLSAgICAgICAgdG1wLT5zZXROZWVkc0xheW91dEFuZFBy
ZWZXaWR0aHNSZWNhbGMoKTsKLSAgICB9Ci0KLSAgICAvLyBIb29rIHxjbG9uZXwgdXAgYXMgdGhl
IGNvbnRpbnVhdGlvbiBvZiB0aGUgbWlkZGxlIGJsb2NrLgotICAgIG1pZGRsZUJsb2NrLT5zZXRJ
bmxpbmVDb250aW51YXRpb24oY2xvbmUpOwotCi0gICAgLy8gV2UgaGF2ZSBiZWVuIHJlcGFyZW50
ZWQgYW5kIGFyZSBub3cgdW5kZXIgdGhlIGZyb21CbG9jay4gIFdlIG5lZWQKLSAgICAvLyB0byB3
YWxrIHVwIG91ciBpbmxpbmUgcGFyZW50IGNoYWluIHVudGlsIHdlIGhpdCB0aGUgY29udGFpbmlu
ZyBibG9jay4KLSAgICAvLyBPbmNlIHdlIGhpdCB0aGUgY29udGFpbmluZyBibG9jayB3ZSdyZSBk
b25lLgotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBjdXJyID0gdG9SZW5kZXJCb3hNb2RlbE9i
amVjdChwYXJlbnQoKSk7Ci0gICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGN1cnJDaGlsZCA9IHRo
aXM7Ci0gICAgCi0gICAgLy8gRklYTUU6IEJlY2F1c2Ugc3BsaXR0aW5nIGlzIE8obl4yKSBhcyB0
YWdzIG5lc3QgcGF0aG9sb2dpY2FsbHksIHdlIGNhcCB0aGUgZGVwdGggYXQgd2hpY2ggd2UncmUg
d2lsbGluZyB0byBjbG9uZS4KLSAgICAvLyBUaGVyZSB3aWxsIGV2ZW50dWFsbHkgYmUgYSBiZXR0
ZXIgYXBwcm9hY2ggdG8gdGhpcyBwcm9ibGVtIHRoYXQgd2lsbCBsZXQgdXMgbmVzdCB0byBhIG11
Y2gKLSAgICAvLyBncmVhdGVyIGRlcHRoIChzZWUgYnVnemlsbGEgYnVnIDEzNDMwKSBidXQgZm9y
IG5vdyB3ZSBoYXZlIGEgbGltaXQuICBUaGlzICp3aWxsKiByZXN1bHQgaW4KLSAgICAvLyBpbmNv
cnJlY3QgcmVuZGVyaW5nLCBidXQgdGhlIGFsdGVybmF0aXZlIGlzIHRvIGhhbmcgZm9yZXZlci4K
LSAgICB1bnNpZ25lZCBzcGxpdERlcHRoID0gMTsKLSAgICBjb25zdCB1bnNpZ25lZCBjTWF4U3Bs
aXREZXB0aCA9IDIwMDsgCi0gICAgd2hpbGUgKGN1cnIgJiYgY3VyciAhPSBmcm9tQmxvY2spIHsK
LSAgICAgICAgQVNTRVJUKGN1cnItPmlzUmVuZGVySW5saW5lKCkpOwotICAgICAgICBpZiAoc3Bs
aXREZXB0aCA8IGNNYXhTcGxpdERlcHRoKSB7Ci0gICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcg
Y2xvbmUuCi0gICAgICAgICAgICBSZW5kZXJJbmxpbmUqIGNsb25lQ2hpbGQgPSBjbG9uZTsKLSAg
ICAgICAgICAgIGNsb25lID0gY2xvbmVJbmxpbmUodG9SZW5kZXJJbmxpbmUoY3VycikpOwotCi0g
ICAgICAgICAgICAvLyBJbnNlcnQgb3VyIGNoaWxkIGNsb25lIGFzIHRoZSBmaXJzdCBjaGlsZC4K
LSAgICAgICAgICAgIGNsb25lLT5hZGRDaGlsZElnbm9yaW5nQ29udGludWF0aW9uKGNsb25lQ2hp
bGQsIDApOwotCi0gICAgICAgICAgICAvLyBIb29rIHRoZSBjbG9uZSB1cCBhcyBhIGNvbnRpbnVh
dGlvbiBvZiB8Y3VycnwuCi0gICAgICAgICAgICBSZW5kZXJJbmxpbmUqIGlubGluZUN1cnIgPSB0
b1JlbmRlcklubGluZShjdXJyKTsKLSAgICAgICAgICAgIG9sZENvbnQgPSBpbmxpbmVDdXJyLT5j
b250aW51YXRpb24oKTsKLSAgICAgICAgICAgIGlubGluZUN1cnItPnNldENvbnRpbnVhdGlvbihj
bG9uZSk7Ci0gICAgICAgICAgICBjbG9uZS0+c2V0Q29udGludWF0aW9uKG9sZENvbnQpOwotCi0g
ICAgICAgICAgICAvLyBTb21lb25lIG1heSBoYXZlIGluZGlyZWN0bHkgY2F1c2VkIGEgPHE+IHRv
IHNwbGl0LiAgV2hlbiB0aGlzIGhhcHBlbnMsIHRoZSA6YWZ0ZXIgY29udGVudAotICAgICAgICAg
ICAgLy8gaGFzIHRvIG1vdmUgaW50byB0aGUgaW5saW5lIGNvbnRpbnVhdGlvbi4gIENhbGwgdXBk
YXRlQmVmb3JlQWZ0ZXJDb250ZW50IHRvIGVuc3VyZSB0aGF0IHRoZSBpbmxpbmUncyA6YWZ0ZXIK
LSAgICAgICAgICAgIC8vIGNvbnRlbnQgZ2V0cyBwcm9wZXJseSBkZXN0cm95ZWQuCi0gICAgICAg
ICAgICBpZiAoZG9jdW1lbnQoKS0+dXNlc0JlZm9yZUFmdGVyUnVsZXMoKSkKLSAgICAgICAgICAg
ICAgICBpbmxpbmVDdXJyLT5jaGlsZHJlbigpLT51cGRhdGVCZWZvcmVBZnRlckNvbnRlbnQodGhp
cywgQUZURVIpOwotCi0gICAgICAgICAgICAvLyBOb3cgd2UgbmVlZCB0byB0YWtlIGFsbCBvZiB0
aGUgY2hpbGRyZW4gc3RhcnRpbmcgZnJvbSB0aGUgZmlyc3QgY2hpbGQKLSAgICAgICAgICAgIC8v
ICphZnRlciogY3VyckNoaWxkIGFuZCBhcHBlbmQgdGhlbSBhbGwgdG8gdGhlIGNsb25lLgotICAg
ICAgICAgICAgbyA9IGN1cnJDaGlsZC0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgICAgIHdoaWxl
IChvKSB7Ci0gICAgICAgICAgICAgICAgUmVuZGVyT2JqZWN0KiB0bXAgPSBvOwotICAgICAgICAg
ICAgICAgIG8gPSB0bXAtPm5leHRTaWJsaW5nKCk7Ci0gICAgICAgICAgICAgICAgY2xvbmUtPmFk
ZENoaWxkSWdub3JpbmdDb250aW51YXRpb24oaW5saW5lQ3Vyci0+Y2hpbGRyZW4oKS0+cmVtb3Zl
Q2hpbGROb2RlKGN1cnIsIHRtcCksIDApOwotICAgICAgICAgICAgICAgIHRtcC0+c2V0TmVlZHNM
YXlvdXRBbmRQcmVmV2lkdGhzUmVjYWxjKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAg
ICAgICAgCi0gICAgICAgIC8vIEtlZXAgd2Fsa2luZyB1cCB0aGUgY2hhaW4uCi0gICAgICAgIGN1
cnJDaGlsZCA9IGN1cnI7Ci0gICAgICAgIGN1cnIgPSB0b1JlbmRlckJveE1vZGVsT2JqZWN0KGN1
cnItPnBhcmVudCgpKTsKLSAgICAgICAgc3BsaXREZXB0aCsrOwotICAgIH0KLQotICAgIC8vIE5v
dyB3ZSBhcmUgYXQgdGhlIGJsb2NrIGxldmVsLiBXZSBuZWVkIHRvIHB1dCB0aGUgY2xvbmUgaW50
byB0aGUgdG9CbG9jay4KLSAgICB0b0Jsb2NrLT5jaGlsZHJlbigpLT5hcHBlbmRDaGlsZE5vZGUo
dG9CbG9jaywgY2xvbmUpOwotCi0gICAgLy8gTm93IHRha2UgYWxsIHRoZSBjaGlsZHJlbiBhZnRl
ciBjdXJyQ2hpbGQgYW5kIHJlbW92ZSB0aGVtIGZyb20gdGhlIGZyb21CbG9jawotICAgIC8vIGFu
ZCBwdXQgdGhlbSBpbiB0aGUgdG9CbG9jay4KLSAgICBvID0gY3VyckNoaWxkLT5uZXh0U2libGlu
ZygpOwotICAgIHdoaWxlIChvKSB7Ci0gICAgICAgIFJlbmRlck9iamVjdCogdG1wID0gbzsKLSAg
ICAgICAgbyA9IHRtcC0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgdG9CbG9jay0+Y2hpbGRyZW4o
KS0+YXBwZW5kQ2hpbGROb2RlKHRvQmxvY2ssIGZyb21CbG9jay0+Y2hpbGRyZW4oKS0+cmVtb3Zl
Q2hpbGROb2RlKGZyb21CbG9jaywgdG1wKSk7Ci0gICAgfQotfQotCi12b2lkIFJlbmRlcklubGlu
ZTo6c3BsaXRGbG93KFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQsIFJlbmRlckJsb2NrKiBuZXdC
bG9ja0JveCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVuZGVyT2JqZWN0KiBuZXdD
aGlsZCwgUmVuZGVyQm94TW9kZWxPYmplY3QqIG9sZENvbnQpCi17Ci0gICAgUmVuZGVyQmxvY2sq
IHByZSA9IDA7Ci0gICAgUmVuZGVyQmxvY2sqIGJsb2NrID0gY29udGFpbmluZ0Jsb2NrKCk7Ci0g
ICAgCi0gICAgLy8gRGVsZXRlIG91ciBsaW5lIGJveGVzIGJlZm9yZSB3ZSBkbyB0aGUgaW5saW5l
IHNwbGl0IGludG8gY29udGludWF0aW9ucy4KLSAgICBibG9jay0+ZGVsZXRlTGluZUJveFRyZWUo
KTsKLSAgICAKLSAgICBib29sIG1hZGVOZXdCZWZvcmVCbG9jayA9IGZhbHNlOwotICAgIGlmIChi
bG9jay0+aXNBbm9ueW1vdXNCbG9jaygpICYmICghYmxvY2stPnBhcmVudCgpIHx8ICFibG9jay0+
cGFyZW50KCktPmNyZWF0ZXNBbm9ueW1vdXNXcmFwcGVyKCkpKSB7Ci0gICAgICAgIC8vIFdlIGNh
biByZXVzZSB0aGlzIGJsb2NrIGFuZCBtYWtlIGl0IHRoZSBwcmVCbG9jayBvZiB0aGUgbmV4dCBj
b250aW51YXRpb24uCi0gICAgICAgIHByZSA9IGJsb2NrOwotICAgICAgICBwcmUtPnJlbW92ZVBv
c2l0aW9uZWRPYmplY3RzKDApOwotICAgICAgICBibG9jayA9IGJsb2NrLT5jb250YWluaW5nQmxv
Y2soKTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBObyBhbm9ueW1vdXMgYmxvY2sgYXZhaWxh
YmxlIGZvciB1c2UuICBNYWtlIG9uZS4KLSAgICAgICAgcHJlID0gYmxvY2stPmNyZWF0ZUFub255
bW91c0Jsb2NrKCk7Ci0gICAgICAgIG1hZGVOZXdCZWZvcmVCbG9jayA9IHRydWU7Ci0gICAgfQot
Ci0gICAgUmVuZGVyQmxvY2sqIHBvc3QgPSBibG9jay0+Y3JlYXRlQW5vbnltb3VzQmxvY2soKTsK
LQotICAgIFJlbmRlck9iamVjdCogYm94Rmlyc3QgPSBtYWRlTmV3QmVmb3JlQmxvY2sgPyBibG9j
ay0+Zmlyc3RDaGlsZCgpIDogcHJlLT5uZXh0U2libGluZygpOwotICAgIGlmIChtYWRlTmV3QmVm
b3JlQmxvY2spCi0gICAgICAgIGJsb2NrLT5jaGlsZHJlbigpLT5pbnNlcnRDaGlsZE5vZGUoYmxv
Y2ssIHByZSwgYm94Rmlyc3QpOwotICAgIGJsb2NrLT5jaGlsZHJlbigpLT5pbnNlcnRDaGlsZE5v
ZGUoYmxvY2ssIG5ld0Jsb2NrQm94LCBib3hGaXJzdCk7Ci0gICAgYmxvY2stPmNoaWxkcmVuKCkt
Pmluc2VydENoaWxkTm9kZShibG9jaywgcG9zdCwgYm94Rmlyc3QpOwotICAgIGJsb2NrLT5zZXRD
aGlsZHJlbklubGluZShmYWxzZSk7Ci0gICAgCi0gICAgaWYgKG1hZGVOZXdCZWZvcmVCbG9jaykg
ewotICAgICAgICBSZW5kZXJPYmplY3QqIG8gPSBib3hGaXJzdDsKLSAgICAgICAgd2hpbGUgKG8p
IHsKLSAgICAgICAgICAgIFJlbmRlck9iamVjdCogbm8gPSBvOwotICAgICAgICAgICAgbyA9IG5v
LT5uZXh0U2libGluZygpOwotICAgICAgICAgICAgcHJlLT5jaGlsZHJlbigpLT5hcHBlbmRDaGls
ZE5vZGUocHJlLCBibG9jay0+Y2hpbGRyZW4oKS0+cmVtb3ZlQ2hpbGROb2RlKGJsb2NrLCBubykp
OwotICAgICAgICAgICAgbm8tPnNldE5lZWRzTGF5b3V0QW5kUHJlZldpZHRoc1JlY2FsYygpOwot
ICAgICAgICB9Ci0gICAgfQotCi0gICAgc3BsaXRJbmxpbmVzKHByZSwgcG9zdCwgbmV3QmxvY2tC
b3gsIGJlZm9yZUNoaWxkLCBvbGRDb250KTsKLQotICAgIC8vIFdlIGFscmVhZHkga25vdyB0aGUg
bmV3QmxvY2tCb3ggaXNuJ3QgZ29pbmcgdG8gY29udGFpbiBpbmxpbmUga2lkcywgc28gYXZvaWQg
d2FzdGluZwotICAgIC8vIHRpbWUgaW4gbWFrZUNoaWxkcmVuTm9uSW5saW5lIGJ5IGp1c3Qgc2V0
dGluZyB0aGlzIGV4cGxpY2l0bHkgdXAgZnJvbnQuCi0gICAgbmV3QmxvY2tCb3gtPnNldENoaWxk
cmVuSW5saW5lKGZhbHNlKTsKLQotICAgIC8vIFdlIGRlbGF5ZWQgYWRkaW5nIHRoZSBuZXdDaGls
ZCB1bnRpbCBub3cgc28gdGhhdCB0aGUgfG5ld0Jsb2NrQm94fCB3b3VsZCBiZSBmdWxseQotICAg
IC8vIGNvbm5lY3RlZCwgdGh1cyBhbGxvd2luZyBuZXdDaGlsZCBhY2Nlc3MgdG8gYSByZW5kZXJB
cmVuYSBzaG91bGQgaXQgbmVlZAotICAgIC8vIHRvIHdyYXAgaXRzZWxmIGluIGFkZGl0aW9uYWwg
Ym94ZXMgKGUuZy4sIHRhYmxlIGNvbnN0cnVjdGlvbikuCi0gICAgbmV3QmxvY2tCb3gtPmFkZENo
aWxkKG5ld0NoaWxkKTsKLQotICAgIC8vIEFsd2F5cyBqdXN0IGRvIGEgZnVsbCBsYXlvdXQgaW4g
b3JkZXIgdG8gZW5zdXJlIHRoYXQgbGluZSBib3hlcyAoZXNwZWNpYWxseSB3cmFwcGVycyBmb3Ig
aW1hZ2VzKQotICAgIC8vIGdldCBkZWxldGVkIHByb3Blcmx5LiAgQmVjYXVzZSBvYmplY3RzIG1v
dmVzIGZyb20gdGhlIHByZSBibG9jayBpbnRvIHRoZSBwb3N0IGJsb2NrLCB3ZSB3YW50IHRvCi0g
ICAgLy8gbWFrZSBuZXcgbGluZSBib3hlcyBpbnN0ZWFkIG9mIGxlYXZpbmcgdGhlIG9sZCBsaW5l
IGJveGVzIGFyb3VuZC4KLSAgICBwcmUtPnNldE5lZWRzTGF5b3V0QW5kUHJlZldpZHRoc1JlY2Fs
YygpOwotICAgIGJsb2NrLT5zZXROZWVkc0xheW91dEFuZFByZWZXaWR0aHNSZWNhbGMoKTsKLSAg
ICBwb3N0LT5zZXROZWVkc0xheW91dEFuZFByZWZXaWR0aHNSZWNhbGMoKTsKLX0KLQotdm9pZCBS
ZW5kZXJJbmxpbmU6OmFkZENoaWxkVG9Db250aW51YXRpb24oUmVuZGVyT2JqZWN0KiBuZXdDaGls
ZCwgUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCkKLXsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVj
dCogZmxvdyA9IGNvbnRpbnVhdGlvbkJlZm9yZShiZWZvcmVDaGlsZCk7Ci0gICAgQVNTRVJUKCFi
ZWZvcmVDaGlsZCB8fCBiZWZvcmVDaGlsZC0+cGFyZW50KCktPmlzUmVuZGVyQmxvY2soKSB8fCBi
ZWZvcmVDaGlsZC0+cGFyZW50KCktPmlzUmVuZGVySW5saW5lKCkpOwotICAgIFJlbmRlckJveE1v
ZGVsT2JqZWN0KiBiZWZvcmVDaGlsZFBhcmVudCA9IDA7Ci0gICAgaWYgKGJlZm9yZUNoaWxkKQot
ICAgICAgICBiZWZvcmVDaGlsZFBhcmVudCA9IHRvUmVuZGVyQm94TW9kZWxPYmplY3QoYmVmb3Jl
Q2hpbGQtPnBhcmVudCgpKTsKLSAgICBlbHNlIHsKLSAgICAgICAgUmVuZGVyQm94TW9kZWxPYmpl
Y3QqIGNvbnQgPSBuZXh0Q29udGludWF0aW9uKGZsb3cpOwotICAgICAgICBpZiAoY29udCkKLSAg
ICAgICAgICAgIGJlZm9yZUNoaWxkUGFyZW50ID0gY29udDsKLSAgICAgICAgZWxzZQotICAgICAg
ICAgICAgYmVmb3JlQ2hpbGRQYXJlbnQgPSBmbG93OwotICAgIH0KLQotICAgIGlmIChuZXdDaGls
ZC0+aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpKQotICAgICAgICByZXR1cm4gYmVmb3JlQ2hpbGRQ
YXJlbnQtPmFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24obmV3Q2hpbGQsIGJlZm9yZUNoaWxk
KTsKLQotICAgIC8vIEEgY29udGludWF0aW9uIGFsd2F5cyBjb25zaXN0cyBvZiB0d28gcG90ZW50
aWFsIGNhbmRpZGF0ZXM6IGFuIGlubGluZSBvciBhbiBhbm9ueW1vdXMKLSAgICAvLyBibG9jayBi
b3ggaG9sZGluZyBibG9jayBjaGlsZHJlbi4KLSAgICBib29sIGNoaWxkSW5saW5lID0gbmV3Q2hp
bGQtPmlzSW5saW5lKCk7Ci0gICAgYm9vbCBiY3BJbmxpbmUgPSBiZWZvcmVDaGlsZFBhcmVudC0+
aXNJbmxpbmUoKTsKLSAgICBib29sIGZsb3dJbmxpbmUgPSBmbG93LT5pc0lubGluZSgpOwotCi0g
ICAgaWYgKGZsb3cgPT0gYmVmb3JlQ2hpbGRQYXJlbnQpCi0gICAgICAgIHJldHVybiBmbG93LT5h
ZGRDaGlsZElnbm9yaW5nQ29udGludWF0aW9uKG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7Ci0gICAg
ZWxzZSB7Ci0gICAgICAgIC8vIFRoZSBnb2FsIGhlcmUgaXMgdG8gbWF0Y2ggdXAgaWYgd2UgY2Fu
LCBzbyB0aGF0IHdlIGNhbiBjb2FsZXNjZSBhbmQgY3JlYXRlIHRoZQotICAgICAgICAvLyBtaW5p
bWFsICMgb2YgY29udGludWF0aW9ucyBuZWVkZWQgZm9yIHRoZSBpbmxpbmUuCi0gICAgICAgIGlm
IChjaGlsZElubGluZSA9PSBiY3BJbmxpbmUpCi0gICAgICAgICAgICByZXR1cm4gYmVmb3JlQ2hp
bGRQYXJlbnQtPmFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24obmV3Q2hpbGQsIGJlZm9yZUNo
aWxkKTsKLSAgICAgICAgZWxzZSBpZiAoZmxvd0lubGluZSA9PSBjaGlsZElubGluZSkKLSAgICAg
ICAgICAgIHJldHVybiBmbG93LT5hZGRDaGlsZElnbm9yaW5nQ29udGludWF0aW9uKG5ld0NoaWxk
LCAwKTsgLy8gSnVzdCB0cmVhdCBsaWtlIGFuIGFwcGVuZC4KLSAgICAgICAgZWxzZQotICAgICAg
ICAgICAgcmV0dXJuIGJlZm9yZUNoaWxkUGFyZW50LT5hZGRDaGlsZElnbm9yaW5nQ29udGludWF0
aW9uKG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7Ci0gICAgfQotfQotCiB2b2lkIFJlbmRlcklubGlu
ZTo6cGFpbnQoUGFpbnRJbmZvJiBwYWludEluZm8sIGludCB0eCwgaW50IHR5KQogewogICAgIG1f
bGluZUJveGVzLnBhaW50KHRoaXMsIHBhaW50SW5mbywgdHgsIHR5KTsKQEAgLTQxNSwxNiArMTk4
LDYgQEAgdm9pZCBSZW5kZXJJbmxpbmU6OmFic29sdXRlUmVjdHMoVmVjdG9yPAogICAgICAgICAg
ICAgcmVjdHMuYXBwZW5kKEludFJlY3QodHggKyBjdXJyLT54KCksIHR5ICsgY3Vyci0+eSgpLCBj
dXJyLT53aWR0aCgpLCBjdXJyLT5oZWlnaHQoKSkpOwogICAgIH0gZWxzZQogICAgICAgICByZWN0
cy5hcHBlbmQoSW50UmVjdCh0eCwgdHksIDAsIDApKTsKLQotICAgIGlmIChjb250aW51YXRpb24o
KSkgewotICAgICAgICBpZiAoY29udGludWF0aW9uKCktPmlzQm94KCkpIHsKLSAgICAgICAgICAg
IFJlbmRlckJveCogYm94ID0gdG9SZW5kZXJCb3goY29udGludWF0aW9uKCkpOwotICAgICAgICAg
ICAgY29udGludWF0aW9uKCktPmFic29sdXRlUmVjdHMocmVjdHMsIAotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgdHggLSBjb250YWluaW5nQmxvY2soKS0+eCgpICsg
Ym94LT54KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eSAt
IGNvbnRhaW5pbmdCbG9jaygpLT55KCkgKyBib3gtPnkoKSk7Ci0gICAgICAgIH0gZWxzZQotICAg
ICAgICAgICAgY29udGludWF0aW9uKCktPmFic29sdXRlUmVjdHMocmVjdHMsIHR4IC0gY29udGFp
bmluZ0Jsb2NrKCktPngoKSwgdHkgLSBjb250YWluaW5nQmxvY2soKS0+eSgpKTsKLSAgICB9CiB9
CiAKIHZvaWQgUmVuZGVySW5saW5lOjphYnNvbHV0ZVF1YWRzKFZlY3RvcjxGbG9hdFF1YWQ+JiBx
dWFkcykKQEAgLTQzNiw5ICsyMDksNiBAQCB2b2lkIFJlbmRlcklubGluZTo6YWJzb2x1dGVRdWFk
cyhWZWN0b3I8CiAgICAgICAgIH0KICAgICB9IGVsc2UKICAgICAgICAgcXVhZHMuYXBwZW5kKGxv
Y2FsVG9BYnNvbHV0ZVF1YWQoRmxvYXRSZWN0KCkpKTsKLQotICAgIGlmIChjb250aW51YXRpb24o
KSkKLSAgICAgICAgY29udGludWF0aW9uKCktPmFic29sdXRlUXVhZHMocXVhZHMpOwogfQogCiBp
bnQgUmVuZGVySW5saW5lOjpvZmZzZXRMZWZ0KCkgY29uc3QKQEAgLTUwNywxOCArMjc3LDYgQEAg
VmlzaWJsZVBvc2l0aW9uIFJlbmRlcklubGluZTo6cG9zaXRpb25GbwogICAgICAgICAvLyBzaG91
bGQgdHJ5IHRvIGZpbmQgYSByZXN1bHQgYnkgYXNraW5nIG91ciBjb250YWluaW5nIGJsb2NrLgog
ICAgICAgICByZXR1cm4gY2ItPnBvc2l0aW9uRm9yUG9pbnQocG9pbnQpOwogICAgIH0KLQotICAg
IC8vIFRyYW5zbGF0ZSB0aGUgY29vcmRzIGZyb20gdGhlIHByZS1hbm9ueW1vdXMgYmxvY2sgdG8g
dGhlIHBvc3QtYW5vbnltb3VzIGJsb2NrLgotICAgIGludCBwYXJlbnRCbG9ja1ggPSBjYi0+eCgp
ICsgcG9pbnQueCgpOwotICAgIGludCBwYXJlbnRCbG9ja1kgPSBjYi0+eSgpICsgcG9pbnQueSgp
OwotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBjID0gY29udGludWF0aW9uKCk7Ci0gICAgd2hp
bGUgKGMpIHsKLSAgICAgICAgUmVuZGVyQm94KiBjb250QmxvY2sgPSBjLT5pc0lubGluZSgpID8g
Yy0+Y29udGFpbmluZ0Jsb2NrKCkgOiB0b1JlbmRlckJsb2NrKGMpOwotICAgICAgICBpZiAoYy0+
aXNJbmxpbmUoKSB8fCBjLT5maXJzdENoaWxkKCkpCi0gICAgICAgICAgICByZXR1cm4gYy0+cG9z
aXRpb25Gb3JDb29yZGluYXRlcyhwYXJlbnRCbG9ja1ggLSBjb250QmxvY2stPngoKSwgcGFyZW50
QmxvY2tZIC0gY29udEJsb2NrLT55KCkpOwotICAgICAgICBjID0gdG9SZW5kZXJCbG9jayhjKS0+
aW5saW5lQ29udGludWF0aW9uKCk7Ci0gICAgfQotICAgIAogICAgIHJldHVybiBSZW5kZXJCb3hN
b2RlbE9iamVjdDo6cG9zaXRpb25Gb3JQb2ludChwb2ludCk7CiB9CiAKQEAgLTU3MSw3ICszMjks
NyBAQCBJbnRSZWN0IFJlbmRlcklubGluZTo6Y2xpcHBlZE92ZXJmbG93UmVjCiAgICAgLy8gT25s
eSBydW4taW5zIGFyZSBhbGxvd2VkIGluIGhlcmUgZHVyaW5nIGxheW91dC4KICAgICBBU1NFUlQo
IXZpZXcoKSB8fCAhdmlldygpLT5sYXlvdXRTdGF0ZUVuYWJsZWQoKSB8fCBpc1J1bkluKCkpOwog
Ci0gICAgaWYgKCFmaXJzdExpbmVCb3goKSAmJiAhY29udGludWF0aW9uKCkpCisgICAgaWYgKCFm
aXJzdExpbmVCb3goKSkKICAgICAgICAgcmV0dXJuIEludFJlY3QoKTsKIAogICAgIC8vIEZpbmQg
b3VyIGxlZnRtb3N0IHBvc2l0aW9uLgpAQCAtNjE5LDExICszNzcsNiBAQCBJbnRSZWN0IFJlbmRl
cklubGluZTo6Y2xpcHBlZE92ZXJmbG93UmVjCiAgICAgICAgICAgICAgICAgci51bml0ZShjaGls
ZFJlY3QpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbnRpbnVh
dGlvbigpICYmICFjb250aW51YXRpb24oKS0+aXNJbmxpbmUoKSkgewotICAgICAgICAgICAgSW50
UmVjdCBjb250UmVjdCA9IGNvbnRpbnVhdGlvbigpLT5yZWN0V2l0aE91dGxpbmVGb3JSZXBhaW50
KHJlcGFpbnRDb250YWluZXIsIG93KTsKLSAgICAgICAgICAgIHIudW5pdGUoY29udFJlY3QpOwot
ICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIHI7CkBAIC03OTYsNDkgKzU0OSw2IEBAIHZv
aWQgUmVuZGVySW5saW5lOjptYXBBYnNvbHV0ZVRvTG9jYWxQb2kKICAgICAgICAgdHJhbnNmb3Jt
U3RhdGUubW92ZSgtY29udGFpbmVyT2Zmc2V0LndpZHRoKCksIC1jb250YWluZXJPZmZzZXQuaGVp
Z2h0KCksIHByZXNlcnZlM0QgPyBUcmFuc2Zvcm1TdGF0ZTo6QWNjdW11bGF0ZVRyYW5zZm9ybSA6
IFRyYW5zZm9ybVN0YXRlOjpGbGF0dGVuVHJhbnNmb3JtKTsKIH0KIAotdm9pZCBSZW5kZXJJbmxp
bmU6OnVwZGF0ZURyYWdTdGF0ZShib29sIGRyYWdPbikKLXsKLSAgICBSZW5kZXJCb3hNb2RlbE9i
amVjdDo6dXBkYXRlRHJhZ1N0YXRlKGRyYWdPbik7Ci0gICAgaWYgKGNvbnRpbnVhdGlvbigpKQot
ICAgICAgICBjb250aW51YXRpb24oKS0+dXBkYXRlRHJhZ1N0YXRlKGRyYWdPbik7Ci19Ci0KLXZv
aWQgUmVuZGVySW5saW5lOjpjaGlsZEJlY2FtZU5vbklubGluZShSZW5kZXJPYmplY3QqIGNoaWxk
KQotewotICAgIC8vIFdlIGhhdmUgdG8gc3BsaXQgdGhlIHBhcmVudCBmbG93LgotICAgIFJlbmRl
ckJsb2NrKiBuZXdCb3ggPSBjb250YWluaW5nQmxvY2soKS0+Y3JlYXRlQW5vbnltb3VzQmxvY2so
KTsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogb2xkQ29udGludWF0aW9uID0gY29udGludWF0
aW9uKCk7Ci0gICAgc2V0Q29udGludWF0aW9uKG5ld0JveCk7Ci0gICAgUmVuZGVyT2JqZWN0KiBi
ZWZvcmVDaGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygpOwotICAgIGNoaWxkcmVuKCktPnJlbW92
ZUNoaWxkTm9kZSh0aGlzLCBjaGlsZCk7Ci0gICAgc3BsaXRGbG93KGJlZm9yZUNoaWxkLCBuZXdC
b3gsIGNoaWxkLCBvbGRDb250aW51YXRpb24pOwotfQotCi12b2lkIFJlbmRlcklubGluZTo6dXBk
YXRlSGl0VGVzdFJlc3VsdChIaXRUZXN0UmVzdWx0JiByZXN1bHQsIGNvbnN0IEludFBvaW50JiBw
b2ludCkKLXsKLSAgICBpZiAocmVzdWx0LmlubmVyTm9kZSgpKQotICAgICAgICByZXR1cm47Ci0K
LSAgICBOb2RlKiBuID0gbm9kZSgpOwotICAgIEludFBvaW50IGxvY2FsUG9pbnQocG9pbnQpOwot
ICAgIGlmIChuKSB7Ci0gICAgICAgIGlmIChpc0lubGluZUNvbnRpbnVhdGlvbigpKSB7Ci0gICAg
ICAgICAgICAvLyBXZSdyZSBpbiB0aGUgY29udGludWF0aW9uIG9mIGEgc3BsaXQgaW5saW5lLiAg
QWRqdXN0IG91ciBsb2NhbCBwb2ludCB0byBiZSBpbiB0aGUgY29vcmRpbmF0ZSBzcGFjZQotICAg
ICAgICAgICAgLy8gb2YgdGhlIHByaW5jaXBhbCByZW5kZXJlcidzIGNvbnRhaW5pbmcgYmxvY2su
ICBUaGlzIHdpbGwgZW5kIHVwIGJlaW5nIHRoZSBpbm5lck5vblNoYXJlZE5vZGUuCi0gICAgICAg
ICAgICBSZW5kZXJCbG9jayogZmlyc3RCbG9jayA9IG4tPnJlbmRlcmVyKCktPmNvbnRhaW5pbmdC
bG9jaygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBHZXQgb3VyIGNvbnRhaW5pbmcg
YmxvY2suCi0gICAgICAgICAgICBSZW5kZXJCb3gqIGJsb2NrID0gY29udGFpbmluZ0Jsb2NrKCk7
Ci0gICAgICAgICAgICBsb2NhbFBvaW50Lm1vdmUoYmxvY2stPngoKSAtIGZpcnN0QmxvY2stPngo
KSwgYmxvY2stPnkoKSAtIGZpcnN0QmxvY2stPnkoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBy
ZXN1bHQuc2V0SW5uZXJOb2RlKG4pOwotICAgICAgICBpZiAoIXJlc3VsdC5pbm5lck5vblNoYXJl
ZE5vZGUoKSkKLSAgICAgICAgICAgIHJlc3VsdC5zZXRJbm5lck5vblNoYXJlZE5vZGUobik7Ci0g
ICAgICAgIHJlc3VsdC5zZXRMb2NhbFBvaW50KGxvY2FsUG9pbnQpOwotICAgIH0KLX0KLQogdm9p
ZCBSZW5kZXJJbmxpbmU6OmRpcnR5TGluZUJveGVzKGJvb2wgZnVsbExheW91dCkKIHsKICAgICBp
ZiAoZnVsbExheW91dCkKQEAgLTk1NCwxNyArNjY0LDYgQEAgdm9pZCBSZW5kZXJJbmxpbmU6OmFk
ZEZvY3VzUmluZ1JlY3RzKFZlYwogICAgICAgICAgICBjdXJyLT5hZGRGb2N1c1JpbmdSZWN0cyhy
ZWN0cywgcG9zLngoKSwgcG9zLnkoKSk7CiAgICAgICAgIH0KICAgICB9Ci0KLSAgICBpZiAoY29u
dGludWF0aW9uKCkpIHsKLSAgICAgICAgaWYgKGNvbnRpbnVhdGlvbigpLT5pc0lubGluZSgpKQot
ICAgICAgICAgICAgY29udGludWF0aW9uKCktPmFkZEZvY3VzUmluZ1JlY3RzKHJlY3RzLCAKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eCAtIGNvbnRhaW5p
bmdCbG9jaygpLT54KCkgKyBjb250aW51YXRpb24oKS0+Y29udGFpbmluZ0Jsb2NrKCktPngoKSwK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eSAtIGNvbnRh
aW5pbmdCbG9jaygpLT55KCkgKyBjb250aW51YXRpb24oKS0+Y29udGFpbmluZ0Jsb2NrKCktPnko
KSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNvbnRpbnVhdGlvbigpLT5hZGRGb2N1c1Jp
bmdSZWN0cyhyZWN0cywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgdHggLSBjb250YWluaW5nQmxvY2soKS0+eCgpICsgdG9SZW5kZXJCb3goY29udGludWF0
aW9uKCkpLT54KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgdHkgLSBjb250YWluaW5nQmxvY2soKS0+eSgpICsgdG9SZW5kZXJCb3goY29udGludWF0aW9u
KCkpLT55KCkpOwotICAgIH0KIH0KIAogdm9pZCBSZW5kZXJJbmxpbmU6OnBhaW50T3V0bGluZShH
cmFwaGljc0NvbnRleHQqIGdyYXBoaWNzQ29udGV4dCwgaW50IHR4LCBpbnQgdHkpCkluZGV4OiBX
ZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJJbmxpbmUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3Jl
bmRlcmluZy9SZW5kZXJJbmxpbmUuaAkocmV2aXNpb24gNTQ1MDEpCisrKyBXZWJDb3JlL3JlbmRl
cmluZy9SZW5kZXJJbmxpbmUuaAkod29ya2luZyBjb3B5KQpAQCAtNTgsMTAgKzU4LDYgQEAgcHVi
bGljOgogCiAgICAgSW5saW5lRmxvd0JveCogZmlyc3RMaW5lQm94KCkgY29uc3QgeyByZXR1cm4g
bV9saW5lQm94ZXMuZmlyc3RMaW5lQm94KCk7IH0KICAgICBJbmxpbmVGbG93Qm94KiBsYXN0TGlu
ZUJveCgpIGNvbnN0IHsgcmV0dXJuIG1fbGluZUJveGVzLmxhc3RMaW5lQm94KCk7IH0KLQotICAg
IFJlbmRlckJveE1vZGVsT2JqZWN0KiBjb250aW51YXRpb24oKSBjb25zdCB7IHJldHVybiBtX2Nv
bnRpbnVhdGlvbjsgfQotCi0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZURyYWdTdGF0ZShib29sIGRy
YWdPbik7CiAgICAgCiAgICAgSW50U2l6ZSByZWxhdGl2ZVBvc2l0aW9uZWRJbmxpbmVPZmZzZXQo
Y29uc3QgUmVuZGVyQm94KiBjaGlsZCkgY29uc3Q7CiAKQEAgLTgxLDkgKzc3LDYgQEAgcHJpdmF0
ZToKIAogICAgIHZpcnR1YWwgYm9vbCBpc1JlbmRlcklubGluZSgpIGNvbnN0IHsgcmV0dXJuIHRy
dWU7IH0KIAotICAgIHZvaWQgYWRkQ2hpbGRUb0NvbnRpbnVhdGlvbihSZW5kZXJPYmplY3QqIG5l
d0NoaWxkLCBSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkKTsKLSAgICB2aXJ0dWFsIHZvaWQgYWRk
Q2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihSZW5kZXJPYmplY3QqIG5ld0NoaWxkLCBSZW5kZXJP
YmplY3QqIGJlZm9yZUNoaWxkID0gMCk7Ci0KICAgICB2b2lkIHNwbGl0SW5saW5lcyhSZW5kZXJC
bG9jayogZnJvbUJsb2NrLCBSZW5kZXJCbG9jayogdG9CbG9jaywgUmVuZGVyQmxvY2sqIG1pZGRs
ZUJsb2NrLAogICAgICAgICAgICAgICAgICAgICAgIFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQs
IFJlbmRlckJveE1vZGVsT2JqZWN0KiBvbGRDb250KTsKICAgICB2b2lkIHNwbGl0RmxvdyhSZW5k
ZXJPYmplY3QqIGJlZm9yZUNoaWxkLCBSZW5kZXJCbG9jayogbmV3QmxvY2tCb3gsCkBAIC0xMjYs
MTMgKzExOSw4IEBAIHByaXZhdGU6CiAKICAgICB2aXJ0dWFsIGludCBsaW5lSGVpZ2h0KGJvb2wg
Zmlyc3RMaW5lLCBib29sIGlzUm9vdExpbmVCb3ggPSBmYWxzZSkgY29uc3Q7CiAKLSAgICBSZW5k
ZXJJbmxpbmUqIGlubGluZUNvbnRpbnVhdGlvbigpIGNvbnN0OwotICAgIHZvaWQgc2V0Q29udGlu
dWF0aW9uKFJlbmRlckJveE1vZGVsT2JqZWN0KiBjKSB7IG1fY29udGludWF0aW9uID0gYzsgfQot
ICAgIAogICAgIHZpcnR1YWwgdm9pZCBjaGlsZEJlY2FtZU5vbklubGluZShSZW5kZXJPYmplY3Qq
IGNoaWxkKTsKIAotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVIaXRUZXN0UmVzdWx0KEhpdFRlc3RS
ZXN1bHQmLCBjb25zdCBJbnRQb2ludCYpOwotCiAgICAgdmlydHVhbCB2b2lkIGltYWdlQ2hhbmdl
ZChXcmFwcGVkSW1hZ2VQdHIsIGNvbnN0IEludFJlY3QqID0gMCk7CiAKICNpZiBFTkFCTEUoREFT
SEJPQVJEX1NVUFBPUlQpCkBAIC0xNDUsMTMgKzEzMywxMCBAQCBwcml2YXRlOgogICAgIHN0YXRp
YyBSZW5kZXJJbmxpbmUqIGNsb25lSW5saW5lKFJlbmRlcklubGluZSogc3JjKTsKIAogICAgIHZv
aWQgcGFpbnRPdXRsaW5lRm9yTGluZShHcmFwaGljc0NvbnRleHQqLCBpbnQgdHgsIGludCB0eSwg
Y29uc3QgSW50UmVjdCYgcHJldkxpbmUsIGNvbnN0IEludFJlY3QmIHRoaXNMaW5lLCBjb25zdCBJ
bnRSZWN0JiBuZXh0TGluZSk7Ci0gICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGNvbnRpbnVhdGlv
bkJlZm9yZShSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkKTsKIAogICAgIFJlbmRlck9iamVjdENo
aWxkTGlzdCBtX2NoaWxkcmVuOwogICAgIFJlbmRlckxpbmVCb3hMaXN0IG1fbGluZUJveGVzOyAg
IC8vIEFsbCBvZiB0aGUgbGluZSBib3hlcyBjcmVhdGVkIGZvciB0aGlzIGlubGluZSBmbG93LiAg
Rm9yIGV4YW1wbGUsIDxpPkhlbGxvPGJyPndvcmxkLjwvaT4gd2lsbCBoYXZlIHR3byA8aT4gbGlu
ZSBib3hlcy4KIAotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBtX2NvbnRpbnVhdGlvbjsgLy8g
Q2FuIGJlIGVpdGhlciBhIGJsb2NrIG9yIGFuIGlubGluZS4gPGI+PGk+PHA+SGVsbG88L3A+PC9p
PjwvYj4uIEluIHRoaXMgZXhhbXBsZSB0aGUgPGk+IHdpbGwgaGF2ZSBhIGJsb2NrIGFzIGl0cyBj
b250aW51YXRpb24gYnV0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgLy8gPGI+IHdpbGwganVzdCBoYXZlIGFuIGlubGluZSBhcyBpdHMgY29udGludWF0aW9u
LgogICAgIG11dGFibGUgaW50IG1fbGluZUhlaWdodDsKICAgICBtdXRhYmxlIGludCBtX3ZlcnRp
Y2FsUG9zaXRpb247CiB9OwpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGluZUJveExp
c3QuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckxpbmVCb3hMaXN0
LmNwcAkocmV2aXNpb24gNTQ1MDEpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMaW5lQm94
TGlzdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE0NiwxMiArMTQ2LDYgQEAgdm9pZCBSZW5kZXJM
aW5lQm94TGlzdDo6ZGlydHlMaW5lQm94ZXMoKQogCiB2b2lkIFJlbmRlckxpbmVCb3hMaXN0Ojpw
YWludChSZW5kZXJCb3hNb2RlbE9iamVjdCogcmVuZGVyZXIsIFJlbmRlck9iamVjdDo6UGFpbnRJ
bmZvJiBwYWludEluZm8sIGludCB0eCwgaW50IHR5KSBjb25zdAogewotICAgIC8vIE9ubHkgcGFp
bnQgZHVyaW5nIHRoZSBmb3JlZ3JvdW5kL3NlbGVjdGlvbiBwaGFzZXMuCi0gICAgaWYgKHBhaW50
SW5mby5waGFzZSAhPSBQYWludFBoYXNlRm9yZWdyb3VuZCAmJiBwYWludEluZm8ucGhhc2UgIT0g
UGFpbnRQaGFzZVNlbGVjdGlvbiAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZU91dGxp
bmUgCi0gICAgICAgICYmIHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlU2VsZk91dGxpbmUg
JiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VDaGlsZE91dGxpbmVzICYmIHBhaW50SW5m
by5waGFzZSAhPSBQYWludFBoYXNlVGV4dENsaXAKLSAgICAgICAgJiYgcGFpbnRJbmZvLnBoYXNl
ICE9IFBhaW50UGhhc2VNYXNrKQotICAgICAgICByZXR1cm47Ci0KICAgICBBU1NFUlQocmVuZGVy
ZXItPmlzUmVuZGVyQmxvY2soKSB8fCAocmVuZGVyZXItPmlzUmVuZGVySW5saW5lKCkgJiYgcmVu
ZGVyZXItPmhhc0xheWVyKCkpKTsgLy8gVGhlIG9ubHkgd2F5IGFuIGlubGluZSBjb3VsZCBwYWlu
dCBsaWtlIHRoaXMgaXMgaWYgaXQgaGFzIGEgbGF5ZXIuCiAKICAgICAvLyBJZiB3ZSBoYXZlIG5v
IGxpbmVzIHRoZW4gd2UgaGF2ZSBubyB3b3JrIHRvIGRvLgpJbmRleDogV2ViQ29yZS9yZW5kZXJp
bmcvUmVuZGVyT2JqZWN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5k
ZXJPYmplY3QuY3BwCShyZXZpc2lvbiA1NDUwMSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRl
ck9iamVjdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIyMjEsOCArMjIyMSw2IEBAIHZvaWQgUmVu
ZGVyT2JqZWN0OjpnZXRUZXh0RGVjb3JhdGlvbkNvbG8KICAgICAgICAgICAgIH0KICAgICAgICAg
fQogICAgICAgICBjdXJyID0gY3Vyci0+cGFyZW50KCk7Ci0gICAgICAgIGlmIChjdXJyICYmIGN1
cnItPmlzUmVuZGVyQmxvY2soKSAmJiB0b1JlbmRlckJsb2NrKGN1cnIpLT5pbmxpbmVDb250aW51
YXRpb24oKSkKLSAgICAgICAgICAgIGN1cnIgPSB0b1JlbmRlckJsb2NrKGN1cnIpLT5pbmxpbmVD
b250aW51YXRpb24oKTsKICAgICB9IHdoaWxlIChjdXJyICYmIGRlY29yYXRpb25zICYmICghcXVp
cmtzTW9kZSB8fCAhY3Vyci0+bm9kZSgpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgKCFjdXJyLT5ub2RlKCktPmhhc1RhZ05hbWUoYVRhZykgJiYgIWN1cnItPm5vZGUo
KS0+aGFzVGFnTmFtZShmb250VGFnKSkpKTsKIApJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVu
ZGVyT2JqZWN0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0
LmgJKHJldmlzaW9uIDU0NTAxKQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmgJ
KHdvcmtpbmcgY29weSkKQEAgLTM2NSw2ICszNjUsMTAgQEAgcHVibGljOgogICAgIHsKICAgICAg
ICAgcmV0dXJuIG1faXNBbm9ueW1vdXMgJiYgc3R5bGUoKS0+ZGlzcGxheSgpID09IEJMT0NLICYm
IHN0eWxlKCktPnN0eWxlVHlwZSgpID09IE5PUFNFVURPICYmICFpc0xpc3RNYXJrZXIoKTsKICAg
ICB9CisgICAgYm9vbCBpc0Fub255bW91c0lubGluZUJsb2NrKCkgY29uc3QKKyAgICB7CisgICAg
ICAgIHJldHVybiBtX2lzQW5vbnltb3VzICYmIHN0eWxlKCktPmRpc3BsYXkoKSA9PSBJTkxJTkVf
QkxPQ0sgJiYgc3R5bGUoKS0+c3R5bGVUeXBlKCkgPT0gTk9QU0VVRE8gJiYgIWlzUnVieVJ1bigp
ICYmICFpc1J1YnlCYXNlKCk7CisgICAgfQogICAgIGJvb2wgaXNJbmxpbmVDb250aW51YXRpb24o
KSBjb25zdCB7IHJldHVybiAobm9kZSgpID8gbm9kZSgpLT5yZW5kZXJlcigpICE9IHRoaXMgOiBm
YWxzZSkgJiYgaXNSZW5kZXJJbmxpbmUoKTsgfQogICAgIGJvb2wgaXNGbG9hdGluZygpIGNvbnN0
IHsgcmV0dXJuIG1fZmxvYXRpbmc7IH0KICAgICBib29sIGlzUG9zaXRpb25lZCgpIGNvbnN0IHsg
cmV0dXJuIG1fcG9zaXRpb25lZDsgfSAvLyBhYnNvbHV0ZSBvciBmaXhlZCBwb3NpdGlvbmluZwpJ
bmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0Q2hpbGRMaXN0LmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3RDaGlsZExpc3QuY3BwCShyZXZp
c2lvbiA1NDUwMSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdENoaWxkTGlzdC5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTMxNiwxNiArMzE2LDYgQEAgdm9pZCBSZW5kZXJPYmplY3RD
aGlsZExpc3Q6OnVwZGF0ZUJlZm9yZQogCiAgICAgLy8gV2hldGhlciBvciBub3Qgd2Ugbm93IHdh
bnQgZ2VuZXJhdGVkIGNvbnRlbnQuICAKICAgICBib29sIG5ld0NvbnRlbnRXYW50ZWQgPSBwc2V1
ZG9FbGVtZW50U3R5bGUgJiYgcHNldWRvRWxlbWVudFN0eWxlLT5kaXNwbGF5KCkgIT0gTk9ORTsK
LQotICAgIC8vIEZvciA8cT48cC8+PC9xPiwgaWYgdGhpcyBvYmplY3QgaXMgdGhlIGlubGluZSBj
b250aW51YXRpb24gb2YgdGhlIDxxPiwgd2Ugb25seSB3YW50IHRvIGdlbmVyYXRlCi0gICAgLy8g
OmFmdGVyIGNvbnRlbnQgYW5kIG5vdCA6YmVmb3JlIGNvbnRlbnQuCi0gICAgaWYgKG5ld0NvbnRl
bnRXYW50ZWQgJiYgdHlwZSA9PSBCRUZPUkUgJiYgb3duZXItPmlzUmVuZGVySW5saW5lKCkgJiYg
dG9SZW5kZXJJbmxpbmUob3duZXIpLT5pc0lubGluZUNvbnRpbnVhdGlvbigpKQotICAgICAgICBu
ZXdDb250ZW50V2FudGVkID0gZmFsc2U7Ci0KLSAgICAvLyBTaW1pbGFybHksIGlmIHdlJ3JlIHRo
ZSBiZWdpbm5pbmcgb2YgYSA8cT4sIGFuZCB0aGVyZSdzIGFuIGlubGluZSBjb250aW51YXRpb24g
Zm9yIG91ciBvYmplY3QsCi0gICAgLy8gdGhlbiB3ZSBkb24ndCBnZW5lcmF0ZSB0aGUgOmFmdGVy
IGNvbnRlbnQuCi0gICAgaWYgKG5ld0NvbnRlbnRXYW50ZWQgJiYgdHlwZSA9PSBBRlRFUiAmJiBv
d25lci0+aXNSZW5kZXJJbmxpbmUoKSAmJiB0b1JlbmRlcklubGluZShvd25lciktPmNvbnRpbnVh
dGlvbigpKQotICAgICAgICBuZXdDb250ZW50V2FudGVkID0gZmFsc2U7CiAgICAgCiAgICAgLy8g
SWYgd2UgZG9uJ3Qgd2FudCBnZW5lcmF0ZWQgY29udGVudCBhbnkgbG9uZ2VyLCBvciBpZiB3ZSBo
YXZlIGdlbmVyYXRlZCBjb250ZW50LCBidXQgaXQncyBubyBsb25nZXIKICAgICAvLyBpZGVudGlj
YWwgdG8gdGhlIG5ldyBjb250ZW50IGRhdGEgd2Ugd2FudCB0byBidWlsZCByZW5kZXIgb2JqZWN0
cyBmb3IsIHRoZW4gd2UgbnVrZSBhbGwKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1Jvb3RJbmxp
bmVCb3guY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1Jvb3RJbmxpbmVCb3gu
Y3BwCShyZXZpc2lvbiA1NDUwMSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1Jvb3RJbmxpbmVCb3gu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSAiUGFnZS5oIgog
I2luY2x1ZGUgIlJlbmRlckFyZW5hLmgiCiAjaW5jbHVkZSAiUmVuZGVyQmxvY2suaCIKKyNpbmNs
dWRlICJSZW5kZXJWaWV3LmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKQEAgLTE2Myw2ICsx
NjQsNDYgQEAgdm9pZCBSb290SW5saW5lQm94OjpwYWludEN1c3RvbUhpZ2hsaWdodAogCiB2b2lk
IFJvb3RJbmxpbmVCb3g6OnBhaW50KFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBwYWludEluZm8s
IGludCB0eCwgaW50IHR5KQogeworICAgIFJlbmRlckJsb2NrKiBjaGlsZCA9IGFub255bW91c0lu
bGluZUJsb2NrKCk7CisgICAgaWYgKGNoaWxkKSB7CisgICAgICAgIC8vIFRyZWF0IHBhaW50aW5n
IG9mIGEgc3BlY2lhbCBpbmxpbmUtYmxvY2sgbGluZSBsaWtlIHRoZSBwYWludGluZyBvZiBhIG5v
cm1hbCBibG9jayBhbmQgZ28gdGhyb3VnaCBhbGwgcGhhc2VzLgorICAgICAgICBQYWludFBoYXNl
IG5ld1BoYXNlID0gKHBhaW50SW5mby5waGFzZSA9PSBQYWludFBoYXNlQ2hpbGRPdXRsaW5lcykg
PyBQYWludFBoYXNlT3V0bGluZSA6IHBhaW50SW5mby5waGFzZTsKKyAgICAgICAgbmV3UGhhc2Ug
PSAobmV3UGhhc2UgPT0gUGFpbnRQaGFzZUNoaWxkQmxvY2tCYWNrZ3JvdW5kcykgPyBQYWludFBo
YXNlQ2hpbGRCbG9ja0JhY2tncm91bmQgOiBuZXdQaGFzZTsKKyAgICAKKyAgICAgICAgLy8gV2Ug
ZG9uJ3QgcGFpbnQgb3VyIG93biBiYWNrZ3JvdW5kLCBidXQgd2UgZG8gbGV0IHRoZSBjaGlsZCBw
YWludCBpdHMgYmFja2dyb3VuZC4KKyAgICAgICAgUmVuZGVyT2JqZWN0OjpQYWludEluZm8gaW5m
byhwYWludEluZm8pOworICAgICAgICBpbmZvLnBoYXNlID0gbmV3UGhhc2U7CisgICAgICAgIGlu
Zm8ucGFpbnRpbmdSb290ID0gcmVuZGVyZXIoKS0+cGFpbnRpbmdSb290Rm9yQ2hpbGRyZW4ocGFp
bnRJbmZvKTsKKyAgICAgICAgYm9vbCBpc1ByaW50aW5nID0gcmVuZGVyZXIoKS0+ZG9jdW1lbnQo
KS0+cHJpbnRpbmcoKTsKKyAgICAgICAgCisgICAgICAgIC8vIENoZWNrIGZvciBwYWdlLWJyZWFr
LWJlZm9yZTogYWx3YXlzLCBhbmQgaWYgaXQncyBzZXQsIGJyZWFrIGFuZCBiYWlsLgorICAgICAg
ICBpZiAoaXNQcmludGluZyAmJiBjaGlsZC0+c3R5bGUoKS0+cGFnZUJyZWFrQmVmb3JlKCkgPT0g
UEJBTFdBWVMgJiYKKyAgICAgICAgICAgIGJsb2NrKCktPmluUm9vdEJsb2NrQ29udGV4dCgpICYm
ICh0eSArIGNoaWxkLT55KCkpID4gcGFpbnRJbmZvLnJlY3QueSgpICYmIAorICAgICAgICAgICAg
KHR5ICsgY2hpbGQtPnkoKSkgPCBwYWludEluZm8ucmVjdC5ib3R0b20oKSkgeworICAgICAgICAg
ICAgcmVuZGVyZXIoKS0+dmlldygpLT5zZXRCZXN0VHJ1bmNhdGVkQXQodHkgKyBjaGlsZC0+eSgp
LCBibG9jaygpLCB0cnVlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAg
ICAgIGlmICghY2hpbGQtPmhhc1NlbGZQYWludGluZ0xheWVyKCkpCisgICAgICAgICAgICBjaGls
ZC0+cGFpbnQoaW5mbywgdHgsIHR5KTsKKworICAgICAgICAvLyBDaGVjayBmb3IgcGFnZS1icmVh
ay1hZnRlcjogYWx3YXlzLCBhbmQgaWYgaXQncyBzZXQsIGJyZWFrIGFuZCBiYWlsLgorICAgICAg
ICBpZiAoaXNQcmludGluZyAmJiBjaGlsZC0+c3R5bGUoKS0+cGFnZUJyZWFrQWZ0ZXIoKSA9PSBQ
QkFMV0FZUyAmJiAKKyAgICAgICAgICAgIGJsb2NrKCktPmluUm9vdEJsb2NrQ29udGV4dCgpICYm
ICh0eSArIGNoaWxkLT55KCkgKyBjaGlsZC0+aGVpZ2h0KCkpID4gcGFpbnRJbmZvLnJlY3QueSgp
ICYmIAorICAgICAgICAgICAgKHR5ICsgY2hpbGQtPnkoKSArIGNoaWxkLT5oZWlnaHQoKSkgPCBw
YWludEluZm8ucmVjdC5ib3R0b20oKSkgeworICAgICAgICAgICAgcmVuZGVyZXIoKS0+dmlldygp
LT5zZXRCZXN0VHJ1bmNhdGVkQXQodHkgKyBjaGlsZC0+eSgpICsgY2hpbGQtPmhlaWdodCgpICsg
bWF4KDAsIGNoaWxkLT5jb2xsYXBzZWRNYXJnaW5Cb3R0b20oKSksIGJsb2NrKCksIHRydWUpOwor
ICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm47
CisgICAgfQorCisgICAgLy8gT25seSBwYWludCBkdXJpbmcgdGhlIGZvcmVncm91bmQvc2VsZWN0
aW9uIHBoYXNlcyBpZiB3ZSBkb24ndCBoYXZlIGEgc3BlY2lhbCBhbm9ueW1vdXMgaW5saW5lIGJs
b2NrLgorICAgIGlmIChwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZUZvcmVncm91bmQgJiYg
cGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VTZWxlY3Rpb24gJiYgcGFpbnRJbmZvLnBoYXNl
ICE9IFBhaW50UGhhc2VPdXRsaW5lIAorICAgICAgICAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFp
bnRQaGFzZVNlbGZPdXRsaW5lICYmIHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlQ2hpbGRP
dXRsaW5lcyAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZVRleHRDbGlwCisgICAgICAg
ICYmIHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlTWFzaykKKyAgICAgICAgcmV0dXJuOwor
CiAgICAgSW5saW5lRmxvd0JveDo6cGFpbnQocGFpbnRJbmZvLCB0eCwgdHkpOwogICAgIHBhaW50
RWxsaXBzaXNCb3gocGFpbnRJbmZvLCB0eCwgdHkpOwogI2lmIFBMQVRGT1JNKE1BQykKQEAgLTIw
NCw2ICsyNDUsMTcgQEAgdm9pZCBSb290SW5saW5lQm94OjpjaGlsZFJlbW92ZWQoSW5saW5lQgog
CiBpbnQgUm9vdElubGluZUJveDo6dmVydGljYWxseUFsaWduQm94ZXMoaW50IGhlaWdodE9mQmxv
Y2spCiB7CisgICAgUmVuZGVyQmxvY2sqIGlubGluZUJsb2NrID0gYW5vbnltb3VzSW5saW5lQmxv
Y2soKTsKKyAgICBpZiAoaW5saW5lQmxvY2spIHsKKyAgICAgICAgaW50IGxpbmVUb3AgPSBpbmxp
bmVCbG9jay0+eSgpOworICAgICAgICBpbnQgbGluZUJvdHRvbSA9IGlubGluZUJsb2NrLT55KCkg
KyBpbmxpbmVCbG9jay0+aGVpZ2h0KCk7CisgICAgICAgIGZpcnN0Q2hpbGQoKS0+c2V0WShsaW5l
VG9wKTsKKyAgICAgICAgc2V0WShsaW5lVG9wKTsKKyAgICAgICAgY29tcHV0ZVZlcnRpY2FsT3Zl
cmZsb3cobGluZVRvcCwgbGluZUJvdHRvbSwgdHJ1ZSk7CisgICAgICAgIHNldExpbmVUb3BCb3R0
b21Qb3NpdGlvbnMobGluZVRvcCwgbGluZUJvdHRvbSk7CisgICAgICAgIHJldHVybiBoZWlnaHRP
ZkJsb2NrOworICAgIH0KKyAgICAKICAgICBpbnQgbWF4UG9zaXRpb25Ub3AgPSAwOwogICAgIGlu
dCBtYXhQb3NpdGlvbkJvdHRvbSA9IDA7CiAgICAgaW50IG1heEFzY2VudCA9IDA7CkBAIC0yMTcs
NyArMjY5LDYgQEAgaW50IFJvb3RJbmxpbmVCb3g6OnZlcnRpY2FsbHlBbGlnbkJveGVzKAogICAg
IGJvb2wgc3RyaWN0TW9kZSA9IChjdXJyICYmIGN1cnItPmRvY3VtZW50KCktPmluU3RyaWN0TW9k
ZSgpKTsKIAogICAgIGNvbXB1dGVMb2dpY2FsQm94SGVpZ2h0cyhtYXhQb3NpdGlvblRvcCwgbWF4
UG9zaXRpb25Cb3R0b20sIG1heEFzY2VudCwgbWF4RGVzY2VudCwgc3RyaWN0TW9kZSk7Ci0KICAg
ICBpZiAobWF4QXNjZW50ICsgbWF4RGVzY2VudCA8IG1heChtYXhQb3NpdGlvblRvcCwgbWF4UG9z
aXRpb25Cb3R0b20pKQogICAgICAgICBhZGp1c3RNYXhBc2NlbnRBbmREZXNjZW50KG1heEFzY2Vu
dCwgbWF4RGVzY2VudCwgbWF4UG9zaXRpb25Ub3AsIG1heFBvc2l0aW9uQm90dG9tKTsKIApAQCAt
NDMwLDQgKzQ4MSw5IEBAIHZvaWQgUm9vdElubGluZUJveDo6YXR0YWNoTGluZUJveFRvUmVuZGUK
ICAgICBibG9jaygpLT5saW5lQm94ZXMoKS0+YXR0YWNoTGluZUJveCh0aGlzKTsKIH0KIAorUmVu
ZGVyQmxvY2sqIFJvb3RJbmxpbmVCb3g6OmFub255bW91c0lubGluZUJsb2NrKCkgY29uc3QKK3sK
KyAgICByZXR1cm4gZmlyc3RDaGlsZCgpICYmIGZpcnN0Q2hpbGQoKSA9PSBsYXN0Q2hpbGQoKSAm
JiAhZmlyc3RDaGlsZCgpLT5pc1RleHQoKSAmJiBmaXJzdENoaWxkKCktPnJlbmRlcmVyKCktPmlz
QW5vbnltb3VzSW5saW5lQmxvY2soKSA/IHRvUmVuZGVyQmxvY2soZmlyc3RDaGlsZCgpLT5yZW5k
ZXJlcigpKSA6IDA7Cit9CisKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUv
cmVuZGVyaW5nL1Jvb3RJbmxpbmVCb3guaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmlu
Zy9Sb290SW5saW5lQm94LmgJKHJldmlzaW9uIDU0NTAxKQorKysgV2ViQ29yZS9yZW5kZXJpbmcv
Um9vdElubGluZUJveC5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMzIsNiArMTMyLDggQEAgcHVibGlj
OgogICAgIHZpcnR1YWwgdm9pZCBhdHRhY2hMaW5lQm94VG9SZW5kZXJPYmplY3QoKTsKICAgICB2
aXJ0dWFsIHZvaWQgcmVtb3ZlTGluZUJveEZyb21SZW5kZXJPYmplY3QoKTsKIAorICAgIFJlbmRl
ckJsb2NrKiBhbm9ueW1vdXNJbmxpbmVCbG9jaygpIGNvbnN0OworCiBwcm90ZWN0ZWQ6CiAgICAg
Ly8gV2hlcmUgdGhpcyBsaW5lIGVuZGVkLiAgVGhlIGV4YWN0IG9iamVjdCBhbmQgdGhlIHBvc2l0
aW9uIHdpdGhpbiB0aGF0IG9iamVjdCBhcmUgc3RvcmVkIHNvIHRoYXQKICAgICAvLyB3ZSBjYW4g
Y3JlYXRlIGFuIElubGluZUl0ZXJhdG9yIGJlZ2lubmluZyBqdXN0IGFmdGVyIHRoZSBlbmQgb2Yg
dGhpcyBsaW5lLgo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>48394</attachid>
            <date>2010-02-08 23:48:29 -0800</date>
            <delta_ts>2010-02-09 11:40:50 -0800</delta_ts>
            <desc>Fix outside list markers.  Fix repainting bugs with relpositioned inlines.</desc>
            <filename>patch.txt</filename>
            <type>text/plain</type>
            <size>121105</size>
            <attacher name="Dave Hyatt">hyatt</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShyZXZpc2lv
biA1NDUwMSkKKysrIFdlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCSh3
b3JraW5nIGNvcHkpCkBAIC00NTQ4LDYgKzQ1NDgsOSBAQAogCQlCQ0U2NUJFQTBFQUNERjE2MDA3
RTQ1MzMgLyogTGVuZ3RoLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IEJDRTY1QkU4MEVBQ0RGMTYwMDdFNDUzMyAvKiBMZW5ndGguY3BwICovOyB9Owog
CQlCQ0U2NUJFQjBFQUNERjE2MDA3RTQ1MzMgLyogTGVuZ3RoLmggaW4gSGVhZGVycyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCQ0U2NUJFOTBFQUNERjE2MDA3RTQ1MzMgLyog
TGVuZ3RoLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsK
IAkJQkNFNjVEMzIwRUFEMTIxMTAwN0U0NTMzIC8qIFRoZW1lLmNwcCBpbiBTb3VyY2VzICovID0g
e2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJDRTY1RDMxMEVBRDEyMTEwMDdFNDUzMyAv
KiBUaGVtZS5jcHAgKi87IH07CisJCUJDRTc4OTE2MTEyMEQ2MDgwMDYwRUNFNSAvKiBJbmxpbmVJ
dGVyYXRvci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
QkNFNzg5MTUxMTIwRDYwODAwNjBFQ0U1IC8qIElubGluZUl0ZXJhdG9yLmggKi87IH07CisJCUJD
RTc4OTg2MTEyMEU3QTYwMDYwRUNFNSAvKiBCaWRpUnVuLmggaW4gSGVhZGVycyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCQ0U3ODk4NTExMjBFN0E2MDA2MEVDRTUgLyogQmlk
aVJ1bi5oICovOyB9OworCQlCQ0U3ODk4QjExMjBFODAyMDA2MEVDRTUgLyogQmlkaVJ1bi5jcHAg
aW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCQ0U3ODk4QTEx
MjBFODAyMDA2MEVDRTUgLyogQmlkaVJ1bi5jcHAgKi87IH07CiAJCUJDRTdCMTkzMEQ0RTg2OTYw
MDc1QTUzOSAvKiBKU0hpc3RvcnlDdXN0b20uY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gQkNFN0IxOTIwRDRFODY5NjAwNzVBNTM5IC8qIEpTSGlzdG9y
eUN1c3RvbS5jcHAgKi87IH07CiAJCUJDRTk5RUMzMERDQTYyNDEwMDE4MjY4MyAvKiBKU1hTTFRQ
cm9jZXNzb3JDb25zdHJ1Y3Rvci5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSBCQ0U5OUVDMTBEQ0E2MjQxMDAxODI2ODMgLyogSlNYU0xUUHJvY2Vzc29y
Q29uc3RydWN0b3IuY3BwICovOyB9OwogCQlCQ0U5OUVDNDBEQ0E2MjQxMDAxODI2ODMgLyogSlNY
U0xUUHJvY2Vzc29yQ29uc3RydWN0b3IuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IEJDRTk5RUMyMERDQTYyNDEwMDE4MjY4MyAvKiBKU1hTTFRQcm9jZXNz
b3JDb25zdHJ1Y3Rvci5oICovOyB9OwpAQCAtOTgxMCw2ICs5ODEzLDkgQEAKIAkJQkNFNjVCRTgw
RUFDREYxNjAwN0U0NTMzIC8qIExlbmd0aC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5j
cHA7IHBhdGggPSBMZW5ndGguY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlCQ0U2
NUJFOTBFQUNERjE2MDA3RTQ1MzMgLyogTGVuZ3RoLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMu
aDsgcGF0aCA9IExlbmd0aC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlCQ0U2NUQz
MTBFQUQxMjExMDA3RTQ1MzMgLyogVGhlbWUuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAu
Y3BwOyBwYXRoID0gVGhlbWUuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlCQ0U3
ODkxNTExMjBENjA4MDA2MEVDRTUgLyogSW5saW5lSXRlcmF0b3IuaCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuYy5oOyBwYXRoID0gSW5saW5lSXRlcmF0b3IuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+
IjsgfTsKKwkJQkNFNzg5ODUxMTIwRTdBNjAwNjBFQ0U1IC8qIEJpZGlSdW4uaCAqLyA9IHtpc2Eg
PSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9
IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQmlkaVJ1bi5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OworCQlCQ0U3ODk4QTExMjBFODAyMDA2MEVDRTUgLyogQmlkaVJ1bi5jcHAgKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUg
PSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBCaWRpUnVuLmNwcDsgc291cmNlVHJlZSA9ICI8
Z3JvdXA+IjsgfTsKIAkJQkNFN0IxOTIwRDRFODY5NjAwNzVBNTM5IC8qIEpTSGlzdG9yeUN1c3Rv
bS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFz
dEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBKU0hpc3RvcnlDdXN0
b20uY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlCQ0U5OUVDMTBEQ0E2MjQxMDAx
ODI2ODMgLyogSlNYU0xUUHJvY2Vzc29yQ29uc3RydWN0b3IuY3BwICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jcHAuY3BwOyBwYXRoID0gSlNYU0xUUHJvY2Vzc29yQ29uc3RydWN0b3IuY3BwOyBzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlCQ0U5OUVDMjBEQ0E2MjQxMDAxODI2ODMgLyogSlNY
U0xUUHJvY2Vzc29yQ29uc3RydWN0b3IuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBm
aWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRo
ID0gSlNYU0xUUHJvY2Vzc29yQ29uc3RydWN0b3IuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKQEAgLTE1NTU2LDYgKzE1NTYyLDggQEAKIAkJCQlCQzhDOEZBQTBERENEMkYyMDBCNTkyRjQg
Lyogc3R5bGUgKi8sCiAJCQkJQThDRkYwNEIwQTE1NEYwOTAwMEE0MjM0IC8qIEF1dG9UYWJsZUxh
eW91dC5jcHAgKi8sCiAJCQkJQThDRkYwNDkwQTE1NEYwOTAwMEE0MjM0IC8qIEF1dG9UYWJsZUxh
eW91dC5oICovLAorCQkJCUJDRTc4OThBMTEyMEU4MDIwMDYwRUNFNSAvKiBCaWRpUnVuLmNwcCAq
LywKKwkJCQlCQ0U3ODk4NTExMjBFN0E2MDA2MEVDRTUgLyogQmlkaVJ1bi5oICovLAogCQkJCUJD
RUE0ODE1MDk3RDkzMDIwMDk0QzlFNCAvKiBicmVha19saW5lcy5jcHAgKi8sCiAJCQkJQkNFQTQ4
MTYwOTdEOTMwMjAwOTRDOUU0IC8qIGJyZWFrX2xpbmVzLmggKi8sCiAJCQkJOTM5MkYxNEYwQUQx
ODYyMzAwNjkxQkQ0IC8qIENvdW50ZXJOb2RlLmNwcCAqLywKQEAgLTE1NTcyLDYgKzE1NTgwLDcg
QEAKIAkJCQlBOENGRjVERTBBMTU1QTA1MDAwQTQyMzQgLyogSW5saW5lQm94LmggKi8sCiAJCQkJ
QThDRkY1REQwQTE1NUEwNTAwMEE0MjM0IC8qIElubGluZUZsb3dCb3guY3BwICovLAogCQkJCUE4
Q0ZGNURDMEExNTVBMDUwMDBBNDIzNCAvKiBJbmxpbmVGbG93Qm94LmggKi8sCisJCQkJQkNFNzg5
MTUxMTIwRDYwODAwNjBFQ0U1IC8qIElubGluZUl0ZXJhdG9yLmggKi8sCiAJCQkJQThDRkY1REIw
QTE1NUEwNTAwMEE0MjM0IC8qIElubGluZVJ1bkJveC5oICovLAogCQkJCUJDRUE0ODFBMDk3RDkz
MDIwMDk0QzlFNCAvKiBJbmxpbmVUZXh0Qm94LmNwcCAqLywKIAkJCQlCQ0VBNDgxQjA5N0Q5MzAy
MDA5NEM5RTQgLyogSW5saW5lVGV4dEJveC5oICovLApAQCAtMTg1MDUsNiArMTg1MTQsOCBAQAog
CQkJCUI3MUZFNkRGMTEwOTFDQjMwMERBRUY3NyAvKiBQcmludENvbnRleHQuaCBpbiBIZWFkZXJz
ICovLAogCQkJCTlGNzIzMDRGMTExODRCNDEwMEFEMDEyNiAvKiBTY3JpcHRQcm9maWxlLmggaW4g
SGVhZGVycyAqLywKIAkJCQk5RjcyMzA1MTExMTg0QjQxMDBBRDAxMjYgLyogU2NyaXB0UHJvZmls
ZXIuaCBpbiBIZWFkZXJzICovLAorCQkJCUJDRTc4OTE2MTEyMEQ2MDgwMDYwRUNFNSAvKiBJbmxp
bmVJdGVyYXRvci5oIGluIEhlYWRlcnMgKi8sCisJCQkJQkNFNzg5ODYxMTIwRTdBNjAwNjBFQ0U1
IC8qIEJpZGlSdW4uaCBpbiBIZWFkZXJzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBsb3lt
ZW50UG9zdHByb2Nlc3NpbmcgPSAwOwogCQl9OwpAQCAtMjA2ODMsNiArMjA2OTQsNyBAQAogCQkJ
CTg0RDBDNDA0MTExNUYxRDQwMDE4QUEzNCAvKiBBZmZpbmVUcmFuc2Zvcm0uY3BwIGluIFNvdXJj
ZXMgKi8sCiAJCQkJQjc3NkQ0M0QxMTA0NTI3NTAwQkVCMEVDIC8qIFByaW50Q29udGV4dC5jcHAg
aW4gU291cmNlcyAqLywKIAkJCQk5RjcyMzA1MDExMTg0QjQxMDBBRDAxMjYgLyogU2NyaXB0UHJv
ZmlsZXIuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJQkNFNzg5OEIxMTIwRTgwMjAwNjBFQ0U1IC8q
IEJpZGlSdW4uY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkpOwogCQkJcnVuT25seUZvckRlcGxveW1l
bnRQb3N0cHJvY2Vzc2luZyA9IDA7CiAJCX07CkluZGV4OiBXZWJDb3JlL2FjY2Vzc2liaWxpdHkv
QWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9hY2Nl
c3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3QuY3BwCShyZXZpc2lvbiA1NDUwMSkK
KysrIFdlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0LmNwcAko
d29ya2luZyBjb3B5KQpAQCAtNTY3LDEyICs1NjcsOCBAQCBFbGVtZW50KiBBY2Nlc3NpYmlsaXR5
UmVuZGVyT2JqZWN0OjphbmNoCiAgICAgUmVuZGVyT2JqZWN0KiBjdXJyUmVuZGVyZXI7CiAgICAg
CiAgICAgLy8gU2VhcmNoIHVwIHRoZSByZW5kZXIgdHJlZSBmb3IgYSBSZW5kZXJPYmplY3Qgd2l0
aCBhIERPTSBub2RlLiAgRGVmZXIgdG8gYW4gZWFybGllciBjb250aW51YXRpb24sIHRob3VnaC4K
LSAgICBmb3IgKGN1cnJSZW5kZXJlciA9IG1fcmVuZGVyZXI7IGN1cnJSZW5kZXJlciAmJiAhY3Vy
clJlbmRlcmVyLT5ub2RlKCk7IGN1cnJSZW5kZXJlciA9IGN1cnJSZW5kZXJlci0+cGFyZW50KCkp
IHsKLSAgICAgICAgaWYgKGN1cnJSZW5kZXJlci0+aXNSZW5kZXJCbG9jaygpKSB7Ci0gICAgICAg
ICAgICBSZW5kZXJJbmxpbmUqIGNvbnRpbnVhdGlvbiA9IHRvUmVuZGVyQmxvY2soY3VyclJlbmRl
cmVyKS0+aW5saW5lQ29udGludWF0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoY29udGludWF0aW9u
KQotICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZS0+Z2V0T3JDcmVhdGUoY29udGludWF0aW9u
KS0+YW5jaG9yRWxlbWVudCgpOwotICAgICAgICB9CisgICAgZm9yIChjdXJyUmVuZGVyZXIgPSBt
X3JlbmRlcmVyOyBjdXJyUmVuZGVyZXIgJiYgIWN1cnJSZW5kZXJlci0+bm9kZSgpOyBjdXJyUmVu
ZGVyZXIgPSBjdXJyUmVuZGVyZXItPnBhcmVudCgpKQorICAgIHsKICAgICB9CiAgICAgCiAgICAg
Ly8gYmFpbCBpZiBub25lIGZvdW5kCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9CaWRpUnVuLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9CaWRpUnVuLmNwcAkocmV2aXNpb24g
MCkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL0JpZGlSdW4uY3BwCShyZXZpc2lvbiAwKQpAQCAtMCww
ICsxLDc0IEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMTk5OSBMYXJzIEtub2xsIChrbm9sbEBr
ZGUub3JnKQorICogICAgICAgICAgIChDKSAxOTk5IEFudHRpIEtvaXZpc3RvIChrb2l2aXN0b0Br
ZGUub3JnKQorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDEwIEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBBbmRy
ZXcgV2VsbGluZ3RvbiAocHJvdG9uQHdpcmV0YXBwZWQubmV0KQorICoKKyAqIFRoaXMgbGlicmFy
eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1v
ZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
CisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
OyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9u
KSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQg
aW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBX
QVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFO
VEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdO
VQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisg
KgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0
aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisg
KiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgIkJpZGlSdW4uaCIKKyNpbmNsdWRlICJJbmxpbmVCb3guaCIKKyNpbmNs
dWRlICJSZW5kZXJBcmVuYS5oIgorI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkTGVha0NvdW50ZXIu
aD4KKwordXNpbmcgbmFtZXNwYWNlIFdURjsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisjaWZu
ZGVmIE5ERUJVRworc3RhdGljIFJlZkNvdW50ZWRMZWFrQ291bnRlciBiaWRpUnVuQ291bnRlcigi
QmlkaVJ1biIpOworCitzdGF0aWMgYm9vbCBpbkJpZGlSdW5EZXN0cm95OworI2VuZGlmCisKK3Zv
aWQgQmlkaVJ1bjo6ZGVzdHJveSgpCit7CisjaWZuZGVmIE5ERUJVRworICAgIGluQmlkaVJ1bkRl
c3Ryb3kgPSB0cnVlOworI2VuZGlmCisgICAgUmVuZGVyQXJlbmEqIHJlbmRlckFyZW5hID0gbV9v
YmplY3QtPnJlbmRlckFyZW5hKCk7CisgICAgZGVsZXRlIHRoaXM7CisjaWZuZGVmIE5ERUJVRwor
ICAgIGluQmlkaVJ1bkRlc3Ryb3kgPSBmYWxzZTsKKyNlbmRpZgorCisgICAgLy8gUmVjb3ZlciB0
aGUgc2l6ZSBsZWZ0IHRoZXJlIGZvciB1cyBieSBvcGVyYXRvciBkZWxldGUgYW5kIGZyZWUgdGhl
IG1lbW9yeS4KKyAgICByZW5kZXJBcmVuYS0+ZnJlZSgqcmVpbnRlcnByZXRfY2FzdDxzaXplX3Qq
Pih0aGlzKSwgdGhpcyk7Cit9CisKK3ZvaWQqIEJpZGlSdW46Om9wZXJhdG9yIG5ldyhzaXplX3Qg
c3osIFJlbmRlckFyZW5hKiByZW5kZXJBcmVuYSkgdGhyb3coKQoreworI2lmbmRlZiBOREVCVUcK
KyAgICBiaWRpUnVuQ291bnRlci5pbmNyZW1lbnQoKTsKKyNlbmRpZgorICAgIHJldHVybiByZW5k
ZXJBcmVuYS0+YWxsb2NhdGUoc3opOworfQorCit2b2lkIEJpZGlSdW46Om9wZXJhdG9yIGRlbGV0
ZSh2b2lkKiBwdHIsIHNpemVfdCBzeikKK3sKKyNpZm5kZWYgTkRFQlVHCisgICAgYmlkaVJ1bkNv
dW50ZXIuZGVjcmVtZW50KCk7CisjZW5kaWYKKyAgICBBU1NFUlQoaW5CaWRpUnVuRGVzdHJveSk7
CisKKyAgICAvLyBTdGFzaCBzaXplIHdoZXJlIGRlc3Ryb3koKSBjYW4gZmluZCBpdC4KKyAgICAq
KHNpemVfdCopcHRyID0gc3o7Cit9CisKK30KSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL0JpZGlS
dW4uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9CaWRpUnVuLmgJKHJldmlzaW9u
IDApCisrKyBXZWJDb3JlL3JlbmRlcmluZy9CaWRpUnVuLmgJKHJldmlzaW9uIDApCkBAIC0wLDAg
KzEsNjYgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAxOTk5IExhcnMgS25vbGwgKGtub2xsQGtk
ZS5vcmcpCisgKiAgICAgICAgICAgKEMpIDE5OTkgQW50dGkgS29pdmlzdG8gKGtvaXZpc3RvQGtk
ZS5vcmcpCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMTAgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA2IEFuZHJl
dyBXZWxsaW5ndG9uIChwcm90b25Ad2lyZXRhcHBlZC5uZXQpCisgKgorICogVGhpcyBsaWJyYXJ5
IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9k
aWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMK
KyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247
IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24p
IGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBp
biB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdB
UlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5U
QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05V
CisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAq
CisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRo
ZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdh
cmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAq
IEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZuZGVmIEJpZGlSdW5f
aAorI2RlZmluZSBCaWRpUnVuX2gKKworI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KKyNp
bmNsdWRlICJCaWRpUmVzb2x2ZXIuaCIKKyNpbmNsdWRlICJSZW5kZXJUZXh0LmgiCisKK25hbWVz
cGFjZSBXZWJDb3JlIHsKKworY2xhc3MgQmlkaUNvbnRleHQ7CitjbGFzcyBJbmxpbmVCb3g7CisK
K3N0cnVjdCBCaWRpUnVuIDogQmlkaUNoYXJhY3RlclJ1biB7CisgICAgQmlkaVJ1bihpbnQgc3Rh
cnQsIGludCBzdG9wLCBSZW5kZXJPYmplY3QqIG9iamVjdCwgQmlkaUNvbnRleHQqIGNvbnRleHQs
IFdURjo6VW5pY29kZTo6RGlyZWN0aW9uIGRpcikKKyAgICAgICAgOiBCaWRpQ2hhcmFjdGVyUnVu
KHN0YXJ0LCBzdG9wLCBjb250ZXh0LCBkaXIpCisgICAgICAgICwgbV9vYmplY3Qob2JqZWN0KQor
ICAgICAgICAsIG1fYm94KDApCisgICAgeworICAgIH0KKworICAgIHZvaWQgZGVzdHJveSgpOwor
CisgICAgLy8gT3ZlcmxvYWRlZCBuZXcgb3BlcmF0b3IuCisgICAgdm9pZCogb3BlcmF0b3IgbmV3
KHNpemVfdCwgUmVuZGVyQXJlbmEqKSB0aHJvdygpOworCisgICAgLy8gT3ZlcnJpZGRlbiB0byBw
cmV2ZW50IHRoZSBub3JtYWwgZGVsZXRlIGZyb20gYmVpbmcgY2FsbGVkLgorICAgIHZvaWQgb3Bl
cmF0b3IgZGVsZXRlKHZvaWQqLCBzaXplX3QpOworCisgICAgQmlkaVJ1biogbmV4dCgpIHsgcmV0
dXJuIHN0YXRpY19jYXN0PEJpZGlSdW4qPihtX25leHQpOyB9CisKK3ByaXZhdGU6CisgICAgLy8g
VGhlIG5vcm1hbCBvcGVyYXRvciBuZXcgaXMgZGlzYWxsb3dlZC4KKyAgICB2b2lkKiBvcGVyYXRv
ciBuZXcoc2l6ZV90KSB0aHJvdygpOworCitwdWJsaWM6CisgICAgUmVuZGVyT2JqZWN0KiBtX29i
amVjdDsKKyAgICBJbmxpbmVCb3gqIG1fYm94OworfTsKKworfQorCisjZW5kaWYgLy8gQmlkaVJ1
bl9oCisKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUZsb3dCb3guY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUZsb3dCb3guY3BwCShyZXZpc2lvbiA1NDUw
MSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUZsb3dCb3guY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSAiUmVuZGVyTGF5ZXIuaCIKICNpbmNsdWRlICJS
ZW5kZXJMaXN0TWFya2VyLmgiCiAjaW5jbHVkZSAiUmVuZGVyVGFibGVDZWxsLmgiCisjaW5jbHVk
ZSAiUmVuZGVyVmlldy5oIgogI2luY2x1ZGUgIlJvb3RJbmxpbmVCb3guaCIKICNpbmNsdWRlICJU
ZXh0LmgiCiAKQEAgLTIyNywxNCArMjI4LDEzIEBAIHZvaWQgSW5saW5lRmxvd0JveDo6ZGV0ZXJt
aW5lU3BhY2luZ0ZvckYKICAgICAgICAgLy8gKDMpIFRoZSBsaW5lIG1heSBlbmQgb24gdGhlIGlu
bGluZS4gIElmIHdlIGFyZSB0aGUgbGFzdCBjaGlsZCAoY2xpbWJpbmcgdXAKICAgICAgICAgLy8g
dGhlIGVuZCBvYmplY3QncyBjaGFpbiksIHRoZW4gd2UganVzdCBjbG9zZWQgYXMgd2VsbC4KICAg
ICAgICAgaWYgKCFsaW5lQm94TGlzdC0+bGFzdExpbmVCb3goKS0+aXNDb25zdHJ1Y3RlZCgpKSB7
Ci0gICAgICAgICAgICBSZW5kZXJJbmxpbmUqIGlubGluZUZsb3cgPSB0b1JlbmRlcklubGluZShy
ZW5kZXJlcigpKTsKICAgICAgICAgICAgIGlmIChsdHIpIHsKICAgICAgICAgICAgICAgICBpZiAo
IW5leHRMaW5lQm94KCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKChsYXN0TGluZSAmJiAhaW5s
aW5lRmxvdy0+Y29udGludWF0aW9uKCkpIHx8IG5leHRPbkxpbmVFeGlzdHMoKSB8fCBvbkVuZENo
YWluKGVuZE9iamVjdCkpKQorICAgICAgICAgICAgICAgICAgICAobGFzdExpbmUgfHwgbmV4dE9u
TGluZUV4aXN0cygpIHx8IG9uRW5kQ2hhaW4oZW5kT2JqZWN0KSkpCiAgICAgICAgICAgICAgICAg
ICAgIGluY2x1ZGVSaWdodEVkZ2UgPSB0cnVlOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAg
ICAgICAgICAgICBpZiAoKCFwcmV2TGluZUJveCgpIHx8IHByZXZMaW5lQm94KCktPmlzQ29uc3Ry
dWN0ZWQoKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgKChsYXN0TGluZSAmJiAhaW5saW5lRmxv
dy0+Y29udGludWF0aW9uKCkpIHx8IHByZXZPbkxpbmVFeGlzdHMoKSB8fCBvbkVuZENoYWluKGVu
ZE9iamVjdCkpKQorICAgICAgICAgICAgICAgICAgICAobGFzdExpbmUgfHwgcHJldk9uTGluZUV4
aXN0cygpIHx8IG9uRW5kQ2hhaW4oZW5kT2JqZWN0KSkpCiAgICAgICAgICAgICAgICAgICAgIGlu
Y2x1ZGVMZWZ0RWRnZSA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTUwNCw3
ICs1MDQsNyBAQCB2b2lkIElubGluZUZsb3dCb3g6OnBsYWNlQm94ZXNWZXJ0aWNhbGx5CiAgICAg
ICAgICAgICAgICAgbmV3WSAtPSBjdXJyLT5ib3hNb2RlbE9iamVjdCgpLT5ib3JkZXJUb3AoKSAr
IGN1cnItPmJveE1vZGVsT2JqZWN0KCktPnBhZGRpbmdUb3AoKTsKICAgICAgICAgfSBlbHNlIGlm
ICghY3Vyci0+cmVuZGVyZXIoKS0+aXNCUigpKSB7CiAgICAgICAgICAgICBSZW5kZXJCb3gqIGJv
eCA9IHRvUmVuZGVyQm94KGN1cnItPnJlbmRlcmVyKCkpOwotICAgICAgICAgICAgbmV3WSArPSBi
b3gtPm1hcmdpblRvcCgpOworICAgICAgICAgICAgbmV3WSArPSBjdXJyLT5yZW5kZXJlcigpLT5p
c0Fub255bW91c0lubGluZUJsb2NrKCkgPyAwIDogYm94LT5tYXJnaW5Ub3AoKTsKICAgICAgICAg
fQogCiAgICAgICAgIGN1cnItPnNldFkobmV3WSk7CkBAIC02MzgsMTMgKzYzOCw3IEBAIHZvaWQg
SW5saW5lRmxvd0JveDo6cGFpbnQoUmVuZGVyT2JqZWN0OjoKICAgICAgICAgICAgIC8vIG91dGxp
bmVzLgogICAgICAgICAgICAgaWYgKHJlbmRlcmVyKCktPnN0eWxlKCktPnZpc2liaWxpdHkoKSA9
PSBWSVNJQkxFICYmIHJlbmRlcmVyKCktPmhhc091dGxpbmUoKSAmJiAhaXNSb290SW5saW5lQm94
KCkpIHsKICAgICAgICAgICAgICAgICBSZW5kZXJJbmxpbmUqIGlubGluZUZsb3cgPSB0b1JlbmRl
cklubGluZShyZW5kZXJlcigpKTsKLSAgICAgICAgICAgICAgICBpZiAoKGlubGluZUZsb3ctPmNv
bnRpbnVhdGlvbigpIHx8IGlubGluZUZsb3ctPmlzSW5saW5lQ29udGludWF0aW9uKCkpICYmICFi
b3hNb2RlbE9iamVjdCgpLT5oYXNTZWxmUGFpbnRpbmdMYXllcigpKSB7Ci0gICAgICAgICAgICAg
ICAgICAgIC8vIEFkZCBvdXJzZWx2ZXMgdG8gdGhlIGNvbnRhaW5pbmcgYmxvY2sgb2YgdGhlIGVu
dGlyZSBjb250aW51YXRpb24gc28gdGhhdCBpdCBjYW4KLSAgICAgICAgICAgICAgICAgICAgLy8g
cGFpbnQgdXMgYXRvbWljYWxseS4KLSAgICAgICAgICAgICAgICAgICAgUmVuZGVyQmxvY2sqIGJs
b2NrID0gcmVuZGVyZXIoKS0+Y29udGFpbmluZ0Jsb2NrKCktPmNvbnRhaW5pbmdCbG9jaygpOwot
ICAgICAgICAgICAgICAgICAgICBibG9jay0+YWRkQ29udGludWF0aW9uV2l0aE91dGxpbmUodG9S
ZW5kZXJJbmxpbmUocmVuZGVyZXIoKS0+bm9kZSgpLT5yZW5kZXJlcigpKSk7Ci0gICAgICAgICAg
ICAgICAgfSBlbHNlIGlmICghaW5saW5lRmxvdy0+aXNJbmxpbmVDb250aW51YXRpb24oKSkKLSAg
ICAgICAgICAgICAgICAgICAgcGFpbnRJbmZvLm91dGxpbmVPYmplY3RzLT5hZGQoaW5saW5lRmxv
dyk7CisgICAgICAgICAgICAgICAgcGFpbnRJbmZvLm91dGxpbmVPYmplY3RzLT5hZGQoaW5saW5l
Rmxvdyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAocGFpbnRJbmZvLnBoYXNl
ID09IFBhaW50UGhhc2VNYXNrKSB7CiAgICAgICAgICAgICBwYWludE1hc2socGFpbnRJbmZvLCB0
eCwgdHkpOwpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lSXRlcmF0b3IuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVJdGVyYXRvci5oCShyZXZpc2lvbiAwKQor
KysgV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lSXRlcmF0b3IuaAkocmV2aXNpb24gMCkKQEAgLTAs
MCArMSwyNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgTGFycyBLbm9sbCAoa25vbGxA
a2RlLm9yZykKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNiwgMjAwNywgMjAwOCwg
MjAwOSwgMjAxMCBBcHBsZSBJbmMuIEFsbCByaWdodCByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAo
QykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGli
cmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAq
IG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0
aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0
aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0
ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFO
WSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJD
SEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhl
IEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMu
CisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJh
cnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNl
ZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3Is
CisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBJbmxp
bmVJdGVyYXRvcl9oCisjZGVmaW5lIElubGluZUl0ZXJhdG9yX2gKKworI2luY2x1ZGUgIkJpZGlS
dW4uaCIKKyNpbmNsdWRlICJSZW5kZXJCbG9jay5oIgorI2luY2x1ZGUgIlJlbmRlclRleHQuaCIK
KyNpbmNsdWRlIDx3dGYvQWx3YXlzSW5saW5lLmg+CisjaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJh
cy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIElubGluZUl0ZXJhdG9yIHsKK3B1
YmxpYzoKKyAgICBJbmxpbmVJdGVyYXRvcigpCisgICAgICAgIDogYmxvY2soMCkKKyAgICAgICAg
LCBvYmooMCkKKyAgICAgICAgLCBwb3MoMCkKKyAgICAgICAgLCBuZXh0QnJlYWthYmxlUG9zaXRp
b24oLTEpCisgICAgeworICAgIH0KKworICAgIElubGluZUl0ZXJhdG9yKFJlbmRlckJsb2NrKiBi
LCBSZW5kZXJPYmplY3QqIG8sIHVuc2lnbmVkIHApCisgICAgICAgIDogYmxvY2soYikKKyAgICAg
ICAgLCBvYmoobykKKyAgICAgICAgLCBwb3MocCkKKyAgICAgICAgLCBuZXh0QnJlYWthYmxlUG9z
aXRpb24oLTEpCisgICAgeworICAgIH0KKworICAgIHZvaWQgaW5jcmVtZW50KElubGluZUJpZGlS
ZXNvbHZlciogcmVzb2x2ZXIgPSAwKTsKKyAgICBib29sIGF0RW5kKCkgY29uc3Q7CisKKyAgICBV
Q2hhciBjdXJyZW50KCkgY29uc3Q7CisgICAgV1RGOjpVbmljb2RlOjpEaXJlY3Rpb24gZGlyZWN0
aW9uKCkgY29uc3Q7CisKKyAgICBSZW5kZXJCbG9jayogYmxvY2s7CisgICAgUmVuZGVyT2JqZWN0
KiBvYmo7CisgICAgdW5zaWduZWQgcG9zOworICAgIGludCBuZXh0QnJlYWthYmxlUG9zaXRpb247
Cit9OworCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IElubGluZUl0ZXJhdG9yJiBpdDEs
IGNvbnN0IElubGluZUl0ZXJhdG9yJiBpdDIpCit7CisgICAgcmV0dXJuIGl0MS5wb3MgPT0gaXQy
LnBvcyAmJiBpdDEub2JqID09IGl0Mi5vYmo7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0o
Y29uc3QgSW5saW5lSXRlcmF0b3ImIGl0MSwgY29uc3QgSW5saW5lSXRlcmF0b3ImIGl0MikKK3sK
KyAgICByZXR1cm4gaXQxLnBvcyAhPSBpdDIucG9zIHx8IGl0MS5vYmogIT0gaXQyLm9iajsKK30K
Kworc3RhdGljIGlubGluZSBSZW5kZXJPYmplY3QqIGJpZGlOZXh0KFJlbmRlckJsb2NrKiBibG9j
aywgUmVuZGVyT2JqZWN0KiBjdXJyZW50LCBJbmxpbmVCaWRpUmVzb2x2ZXIqIHJlc29sdmVyID0g
MCwgYm9vbCBza2lwSW5saW5lcyA9IHRydWUsIGJvb2wqIGVuZE9mSW5saW5lUHRyID0gMCkKK3sK
KyAgICBSZW5kZXJPYmplY3QqIG5leHQgPSAwOworICAgIGJvb2wgb2xkRW5kT2ZJbmxpbmUgPSBl
bmRPZklubGluZVB0ciA/ICplbmRPZklubGluZVB0ciA6IGZhbHNlOworICAgIGJvb2wgZW5kT2ZJ
bmxpbmUgPSBmYWxzZTsKKworICAgIHdoaWxlIChjdXJyZW50KSB7CisgICAgICAgIG5leHQgPSAw
OworICAgICAgICBpZiAoIW9sZEVuZE9mSW5saW5lICYmICFjdXJyZW50LT5pc0Zsb2F0aW5nKCkg
JiYgIWN1cnJlbnQtPmlzUmVwbGFjZWQoKSAmJiAhY3VycmVudC0+aXNQb3NpdGlvbmVkKCkgJiYg
IWN1cnJlbnQtPmlzVGV4dCgpKSB7CisgICAgICAgICAgICBuZXh0ID0gY3VycmVudC0+Zmlyc3RD
aGlsZCgpOworICAgICAgICAgICAgaWYgKG5leHQgJiYgcmVzb2x2ZXIgJiYgbmV4dC0+aXNSZW5k
ZXJJbmxpbmUoKSkgeworICAgICAgICAgICAgICAgIEVVbmljb2RlQmlkaSB1YiA9IG5leHQtPnN0
eWxlKCktPnVuaWNvZGVCaWRpKCk7CisgICAgICAgICAgICAgICAgaWYgKHViICE9IFVCTm9ybWFs
KSB7CisgICAgICAgICAgICAgICAgICAgIFRleHREaXJlY3Rpb24gZGlyID0gbmV4dC0+c3R5bGUo
KS0+ZGlyZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIFdURjo6VW5pY29kZTo6RGlyZWN0
aW9uIGQgPSAodWIgPT0gRW1iZWQKKyAgICAgICAgICAgICAgICAgICAgICAgID8gKGRpciA9PSBS
VEwgPyBXVEY6OlVuaWNvZGU6OlJpZ2h0VG9MZWZ0RW1iZWRkaW5nIDogV1RGOjpVbmljb2RlOjpM
ZWZ0VG9SaWdodEVtYmVkZGluZykKKyAgICAgICAgICAgICAgICAgICAgICAgIDogKGRpciA9PSBS
VEwgPyBXVEY6OlVuaWNvZGU6OlJpZ2h0VG9MZWZ0T3ZlcnJpZGUgOiBXVEY6OlVuaWNvZGU6Okxl
ZnRUb1JpZ2h0T3ZlcnJpZGUpKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXItPmVtYmVk
KGQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAg
ICAgIGlmICghbmV4dCkgeworICAgICAgICAgICAgaWYgKCFza2lwSW5saW5lcyAmJiAhb2xkRW5k
T2ZJbmxpbmUgJiYgY3VycmVudC0+aXNSZW5kZXJJbmxpbmUoKSkgeworICAgICAgICAgICAgICAg
IG5leHQgPSBjdXJyZW50OworICAgICAgICAgICAgICAgIGVuZE9mSW5saW5lID0gdHJ1ZTsKKyAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd2hpbGUg
KGN1cnJlbnQgJiYgY3VycmVudCAhPSBibG9jaykgeworICAgICAgICAgICAgICAgIGlmIChyZXNv
bHZlciAmJiBjdXJyZW50LT5pc1JlbmRlcklubGluZSgpICYmIGN1cnJlbnQtPnN0eWxlKCktPnVu
aWNvZGVCaWRpKCkgIT0gVUJOb3JtYWwpCisgICAgICAgICAgICAgICAgICAgIHJlc29sdmVyLT5l
bWJlZChXVEY6OlVuaWNvZGU6OlBvcERpcmVjdGlvbmFsRm9ybWF0KTsKKworICAgICAgICAgICAg
ICAgIG5leHQgPSBjdXJyZW50LT5uZXh0U2libGluZygpOworICAgICAgICAgICAgICAgIGlmIChu
ZXh0KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlciAmJiBuZXh0LT5pc1JlbmRl
cklubGluZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFVW5pY29kZUJpZGkgdWIgPSBu
ZXh0LT5zdHlsZSgpLT51bmljb2RlQmlkaSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYg
KHViICE9IFVCTm9ybWFsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dERpcmVj
dGlvbiBkaXIgPSBuZXh0LT5zdHlsZSgpLT5kaXJlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBXVEY6OlVuaWNvZGU6OkRpcmVjdGlvbiBkID0gKHViID09IEVtYmVkCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKGRpciA9PSBSVEwgPyBXVEY6OlVuaWNvZGU6
OlJpZ2h0VG9MZWZ0RW1iZWRkaW5nOiBXVEY6OlVuaWNvZGU6OkxlZnRUb1JpZ2h0RW1iZWRkaW5n
KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChkaXIgPT0gUlRMID8gV1RGOjpV
bmljb2RlOjpSaWdodFRvTGVmdE92ZXJyaWRlIDogV1RGOjpVbmljb2RlOjpMZWZ0VG9SaWdodE92
ZXJyaWRlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXItPmVtYmVkKGQp
OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg
ICAKKyAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC0+cGFyZW50KCk7CisgICAgICAg
ICAgICAgICAgaWYgKCFza2lwSW5saW5lcyAmJiBjdXJyZW50ICYmIGN1cnJlbnQgIT0gYmxvY2sg
JiYgY3VycmVudC0+aXNSZW5kZXJJbmxpbmUoKSkgeworICAgICAgICAgICAgICAgICAgICBuZXh0
ID0gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgZW5kT2ZJbmxpbmUgPSB0cnVlOworICAg
ICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9
CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW5leHQpCisgICAgICAgICAgICBicmVhazsKKwor
ICAgICAgICBpZiAobmV4dC0+aXNUZXh0KCkgfHwgbmV4dC0+aXNGbG9hdGluZygpIHx8IG5leHQt
PmlzUmVwbGFjZWQoKSB8fCBuZXh0LT5pc1Bvc2l0aW9uZWQoKQorICAgICAgICAgICAgfHwgKCgh
c2tpcElubGluZXMgfHwgIW5leHQtPmZpcnN0Q2hpbGQoKSkgLy8gQWx3YXlzIHJldHVybiBFTVBU
WSBpbmxpbmVzLgorICAgICAgICAgICAgICAgICYmIG5leHQtPmlzUmVuZGVySW5saW5lKCkpKQor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGN1cnJlbnQgPSBuZXh0OworICAgIH0KKworICAg
IGlmIChlbmRPZklubGluZVB0cikKKyAgICAgICAgKmVuZE9mSW5saW5lUHRyID0gZW5kT2ZJbmxp
bmU7CisKKyAgICByZXR1cm4gbmV4dDsKK30KKworc3RhdGljIGlubGluZSBSZW5kZXJPYmplY3Qq
IGJpZGlGaXJzdChSZW5kZXJCbG9jayogYmxvY2ssIElubGluZUJpZGlSZXNvbHZlciogcmVzb2x2
ZXIsIGJvb2wgc2tpcElubGluZXMgPSB0cnVlKQoreworICAgIGlmICghYmxvY2stPmZpcnN0Q2hp
bGQoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgCisgICAgUmVuZGVyT2JqZWN0KiBvID0gYmxv
Y2stPmZpcnN0Q2hpbGQoKTsKKyAgICBpZiAoby0+aXNSZW5kZXJJbmxpbmUoKSkgeworICAgICAg
ICBpZiAocmVzb2x2ZXIpIHsKKyAgICAgICAgICAgIEVVbmljb2RlQmlkaSB1YiA9IG8tPnN0eWxl
KCktPnVuaWNvZGVCaWRpKCk7CisgICAgICAgICAgICBpZiAodWIgIT0gVUJOb3JtYWwpIHsKKyAg
ICAgICAgICAgICAgICBUZXh0RGlyZWN0aW9uIGRpciA9IG8tPnN0eWxlKCktPmRpcmVjdGlvbigp
OworICAgICAgICAgICAgICAgIFdURjo6VW5pY29kZTo6RGlyZWN0aW9uIGQgPSAodWIgPT0gRW1i
ZWQKKyAgICAgICAgICAgICAgICAgICAgPyAoZGlyID09IFJUTCA/IFdURjo6VW5pY29kZTo6Umln
aHRUb0xlZnRFbWJlZGRpbmcgOiBXVEY6OlVuaWNvZGU6OkxlZnRUb1JpZ2h0RW1iZWRkaW5nKQor
ICAgICAgICAgICAgICAgICAgICA6IChkaXIgPT0gUlRMID8gV1RGOjpVbmljb2RlOjpSaWdodFRv
TGVmdE92ZXJyaWRlIDogV1RGOjpVbmljb2RlOjpMZWZ0VG9SaWdodE92ZXJyaWRlKSk7CisgICAg
ICAgICAgICAgICAgcmVzb2x2ZXItPmVtYmVkKGQpOworICAgICAgICAgICAgfQorICAgICAgICB9
CisgICAgICAgIGlmIChza2lwSW5saW5lcyAmJiBvLT5maXJzdENoaWxkKCkpCisgICAgICAgICAg
ICBvID0gYmlkaU5leHQoYmxvY2ssIG8sIHJlc29sdmVyLCBza2lwSW5saW5lcyk7CisgICAgICAg
IGVsc2UgeworICAgICAgICAgICAgLy8gTmV2ZXIgc2tpcCBlbXB0eSBpbmxpbmVzLgorICAgICAg
ICAgICAgaWYgKHJlc29sdmVyKQorICAgICAgICAgICAgICAgIHJlc29sdmVyLT5jb21taXRFeHBs
aWNpdEVtYmVkZGluZygpOworICAgICAgICAgICAgcmV0dXJuIG87IAorICAgICAgICB9CisgICAg
fQorCisgICAgaWYgKG8gJiYgIW8tPmlzVGV4dCgpICYmICFvLT5pc1JlcGxhY2VkKCkgJiYgIW8t
PmlzRmxvYXRpbmcoKSAmJiAhby0+aXNQb3NpdGlvbmVkKCkpCisgICAgICAgIG8gPSBiaWRpTmV4
dChibG9jaywgbywgcmVzb2x2ZXIsIHNraXBJbmxpbmVzKTsKKworICAgIGlmIChyZXNvbHZlcikK
KyAgICAgICAgcmVzb2x2ZXItPmNvbW1pdEV4cGxpY2l0RW1iZWRkaW5nKCk7CisgICAgcmV0dXJu
IG87Cit9CisKK2lubGluZSB2b2lkIElubGluZUl0ZXJhdG9yOjppbmNyZW1lbnQoSW5saW5lQmlk
aVJlc29sdmVyKiByZXNvbHZlcikKK3sKKyAgICBpZiAoIW9iaikKKyAgICAgICAgcmV0dXJuOwor
ICAgIGlmIChvYmotPmlzVGV4dCgpKSB7CisgICAgICAgIHBvcysrOworICAgICAgICBpZiAocG9z
ID49IHRvUmVuZGVyVGV4dChvYmopLT50ZXh0TGVuZ3RoKCkpIHsKKyAgICAgICAgICAgIG9iaiA9
IGJpZGlOZXh0KGJsb2NrLCBvYmosIHJlc29sdmVyKTsKKyAgICAgICAgICAgIHBvcyA9IDA7Cisg
ICAgICAgICAgICBuZXh0QnJlYWthYmxlUG9zaXRpb24gPSAtMTsKKyAgICAgICAgfQorICAgIH0g
ZWxzZSB7CisgICAgICAgIG9iaiA9IGJpZGlOZXh0KGJsb2NrLCBvYmosIHJlc29sdmVyKTsKKyAg
ICAgICAgcG9zID0gMDsKKyAgICAgICAgbmV4dEJyZWFrYWJsZVBvc2l0aW9uID0gLTE7CisgICAg
fQorfQorCitpbmxpbmUgYm9vbCBJbmxpbmVJdGVyYXRvcjo6YXRFbmQoKSBjb25zdAoreworICAg
IHJldHVybiAhb2JqOworfQorCitpbmxpbmUgVUNoYXIgSW5saW5lSXRlcmF0b3I6OmN1cnJlbnQo
KSBjb25zdAoreworICAgIGlmICghb2JqIHx8ICFvYmotPmlzVGV4dCgpKQorICAgICAgICByZXR1
cm4gMDsKKworICAgIFJlbmRlclRleHQqIHRleHQgPSB0b1JlbmRlclRleHQob2JqKTsKKyAgICBp
ZiAocG9zID49IHRleHQtPnRleHRMZW5ndGgoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBy
ZXR1cm4gdGV4dC0+Y2hhcmFjdGVycygpW3Bvc107Cit9CisKK0FMV0FZU19JTkxJTkUgV1RGOjpV
bmljb2RlOjpEaXJlY3Rpb24gSW5saW5lSXRlcmF0b3I6OmRpcmVjdGlvbigpIGNvbnN0Cit7Cisg
ICAgaWYgKFVDaGFyIGMgPSBjdXJyZW50KCkpCisgICAgICAgIHJldHVybiBXVEY6OlVuaWNvZGU6
OmRpcmVjdGlvbihjKTsKKworICAgIGlmIChvYmogJiYgb2JqLT5pc0xpc3RNYXJrZXIoKSkKKyAg
ICAgICAgcmV0dXJuIG9iai0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkgPT0gTFRSID8gV1RGOjpVbmlj
b2RlOjpMZWZ0VG9SaWdodCA6IFdURjo6VW5pY29kZTo6UmlnaHRUb0xlZnQ7CisKKyAgICByZXR1
cm4gV1RGOjpVbmljb2RlOjpPdGhlck5ldXRyYWw7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSB2
b2lkIElubGluZUJpZGlSZXNvbHZlcjo6aW5jcmVtZW50KCkKK3sKKyAgICBjdXJyZW50LmluY3Jl
bWVudCh0aGlzKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSB2b2lkIElubGluZUJpZGlSZXNv
bHZlcjo6YXBwZW5kUnVuKCkKK3sKKyAgICBpZiAoIWVtcHR5UnVuICYmICFlb3IuYXRFbmQoKSkg
eworICAgICAgICBpbnQgc3RhcnQgPSBzb3IucG9zOworICAgICAgICBSZW5kZXJPYmplY3QgKm9i
aiA9IHNvci5vYmo7CisgICAgICAgIHdoaWxlIChvYmogJiYgb2JqICE9IGVvci5vYmogJiYgb2Jq
ICE9IGVuZE9mTGluZS5vYmopIHsKKyAgICAgICAgICAgIFJlbmRlckJsb2NrOjphcHBlbmRSdW5z
Rm9yT2JqZWN0KHN0YXJ0LCBvYmotPmxlbmd0aCgpLCBvYmosICp0aGlzKTsgICAgICAgIAorICAg
ICAgICAgICAgc3RhcnQgPSAwOworICAgICAgICAgICAgb2JqID0gYmlkaU5leHQoc29yLmJsb2Nr
LCBvYmopOworICAgICAgICB9CisgICAgICAgIGlmIChvYmopIHsKKyAgICAgICAgICAgIHVuc2ln
bmVkIHBvcyA9IG9iaiA9PSBlb3Iub2JqID8gZW9yLnBvcyA6IFVJTlRfTUFYOworICAgICAgICAg
ICAgaWYgKG9iaiA9PSBlbmRPZkxpbmUub2JqICYmIGVuZE9mTGluZS5wb3MgPD0gcG9zKSB7Cisg
ICAgICAgICAgICAgICAgcmVhY2hlZEVuZE9mTGluZSA9IHRydWU7CisgICAgICAgICAgICAgICAg
cG9zID0gZW5kT2ZMaW5lLnBvczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEl0J3Mg
T0sgdG8gYWRkIHJ1bnMgZm9yIHplcm8tbGVuZ3RoIFJlbmRlck9iamVjdHMsIGp1c3QgZG9uJ3Qg
bWFrZSB0aGUgcnVuIGxhcmdlciB0aGFuIGl0IHNob3VsZCBiZQorICAgICAgICAgICAgaW50IGVu
ZCA9IG9iai0+bGVuZ3RoKCkgPyBwb3MrMSA6IDA7CisgICAgICAgICAgICBSZW5kZXJCbG9jazo6
YXBwZW5kUnVuc0Zvck9iamVjdChzdGFydCwgZW5kLCBvYmosICp0aGlzKTsKKyAgICAgICAgfQor
ICAgICAgICAKKyAgICAgICAgZW9yLmluY3JlbWVudCgpOworICAgICAgICBzb3IgPSBlb3I7Cisg
ICAgfQorCisgICAgbV9kaXJlY3Rpb24gPSBXVEY6OlVuaWNvZGU6Ok90aGVyTmV1dHJhbDsKKyAg
ICBtX3N0YXR1cy5lb3IgPSBXVEY6OlVuaWNvZGU6Ok90aGVyTmV1dHJhbDsKK30KKworfQorCisj
ZW5kaWYgLy8gSW5saW5lSXRlcmF0b3JfaAorCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5k
ZXJCbG9jay5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2su
Y3BwCShyZXZpc2lvbiA1NDUwMSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtNzcsOCArNzcsNiBAQCBzdGF0aWMgUGVyY2VudEhlaWdodERl
c2NlbmRhbnRzTWFwKiBnUGVyCiAKIHR5cGVkZWYgV1RGOjpIYXNoTWFwPGNvbnN0IFJlbmRlckJv
eCosIEhhc2hTZXQ8UmVuZGVyQmxvY2sqPio+IFBlcmNlbnRIZWlnaHRDb250YWluZXJNYXA7CiBz
dGF0aWMgUGVyY2VudEhlaWdodENvbnRhaW5lck1hcCogZ1BlcmNlbnRIZWlnaHRDb250YWluZXJN
YXAgPSAwOwotICAgIAotdHlwZWRlZiBXVEY6Okhhc2hNYXA8UmVuZGVyQmxvY2sqLCBMaXN0SGFz
aFNldDxSZW5kZXJJbmxpbmUqPio+IENvbnRpbnVhdGlvbk91dGxpbmVUYWJsZU1hcDsKIAogdHlw
ZWRlZiBXVEY6Okhhc2hTZXQ8UmVuZGVyQmxvY2sqPiBEZWxheWVkVXBkYXRlU2Nyb2xsSW5mb1Nl
dDsKIHN0YXRpYyBpbnQgZ0RlbGF5VXBkYXRlU2Nyb2xsSW5mbyA9IDA7CkBAIC05MSw3ICs4OSw3
IEBAIFJlbmRlckJsb2NrOjpNYXJnaW5JbmZvOjpNYXJnaW5JbmZvKFJlbmQKICAgICAvLyBpZiB3
ZSBoYWQgYW55IGJvcmRlci9wYWRkaW5nIChvYnZpb3VzbHkpLCBpZiB3ZSdyZSB0aGUgcm9vdCBv
ciBIVE1MIGVsZW1lbnRzLCBvciBpZgogICAgIC8vIHdlJ3JlIHBvc2l0aW9uZWQsIGZsb2F0aW5n
LCBhIHRhYmxlIGNlbGwuCiAgICAgbV9jYW5Db2xsYXBzZVdpdGhDaGlsZHJlbiA9ICFibG9jay0+
aXNSZW5kZXJWaWV3KCkgJiYgIWJsb2NrLT5pc1Jvb3QoKSAmJiAhYmxvY2stPmlzUG9zaXRpb25l
ZCgpICYmCi0gICAgICAgICFibG9jay0+aXNGbG9hdGluZygpICYmICFibG9jay0+aXNUYWJsZUNl
bGwoKSAmJiAhYmxvY2stPmhhc092ZXJmbG93Q2xpcCgpICYmICFibG9jay0+aXNJbmxpbmVCbG9j
a09ySW5saW5lVGFibGUoKTsKKyAgICAgICAgIWJsb2NrLT5pc0Zsb2F0aW5nKCkgJiYgIWJsb2Nr
LT5pc1RhYmxlQ2VsbCgpICYmICFibG9jay0+aGFzT3ZlcmZsb3dDbGlwKCkgJiYgKCFibG9jay0+
aXNJbmxpbmVCbG9ja09ySW5saW5lVGFibGUoKSB8fCBibG9jay0+aXNBbm9ueW1vdXNJbmxpbmVC
bG9jaygpKTsKIAogICAgIG1fY2FuQ29sbGFwc2VUb3BXaXRoQ2hpbGRyZW4gPSBtX2NhbkNvbGxh
cHNlV2l0aENoaWxkcmVuICYmICh0b3AgPT0gMCkgJiYgYmxvY2stPnN0eWxlKCktPm1hcmdpblRv
cENvbGxhcHNlKCkgIT0gTVNFUEFSQVRFOwogCkBAIC0xMjAsNyArMTE4LDYgQEAgUmVuZGVyQmxv
Y2s6OlJlbmRlckJsb2NrKE5vZGUqIG5vZGUpCiAgICAgICA6IFJlbmRlckJveChub2RlKQogICAg
ICAgLCBtX2Zsb2F0aW5nT2JqZWN0cygwKQogICAgICAgLCBtX3Bvc2l0aW9uZWRPYmplY3RzKDAp
Ci0gICAgICAsIG1faW5saW5lQ29udGludWF0aW9uKDApCiAgICAgICAsIG1fbWF4TWFyZ2luKDAp
CiAgICAgICAsIG1fbGluZUhlaWdodCgtMSkKIHsKQEAgLTE2MSwxNCArMTU4LDYgQEAgdm9pZCBS
ZW5kZXJCbG9jazo6ZGVzdHJveSgpCiAgICAgLy8gTWFrZSBzdXJlIHRvIGRlc3Ryb3kgYW5vbnlt
b3VzIGNoaWxkcmVuIGZpcnN0IHdoaWxlIHRoZXkgYXJlIHN0aWxsIGNvbm5lY3RlZCB0byB0aGUg
cmVzdCBvZiB0aGUgdHJlZSwgc28gdGhhdCB0aGV5IHdpbGwKICAgICAvLyBwcm9wZXJseSBkaXJ0
eSBsaW5lIGJveGVzIHRoYXQgdGhleSBhcmUgcmVtb3ZlZCBmcm9tLiBFZmZlY3RzIHRoYXQgZG8g
OmJlZm9yZS86YWZ0ZXIgb25seSBvbiBob3ZlciBjb3VsZCBjcmFzaCBvdGhlcndpc2UuCiAgICAg
Y2hpbGRyZW4oKS0+ZGVzdHJveUxlZnRvdmVyQ2hpbGRyZW4oKTsKLQotICAgIC8vIERlc3Ryb3kg
b3VyIGNvbnRpbnVhdGlvbiBiZWZvcmUgYW55dGhpbmcgb3RoZXIgdGhhbiBhbm9ueW1vdXMgY2hp
bGRyZW4uCi0gICAgLy8gVGhlIHJlYXNvbiB3ZSBkb24ndCBkZXN0cm95IGl0IGJlZm9yZSBhbm9u
eW1vdXMgY2hpbGRyZW4gaXMgdGhhdCB0aGV5IG1heQotICAgIC8vIGhhdmUgY29udGludWF0aW9u
cyBvZiB0aGVpciBvd24gdGhhdCBhcmUgYW5vbnltb3VzIGNoaWxkcmVuIG9mIG91ciBjb250aW51
YXRpb24uCi0gICAgaWYgKG1faW5saW5lQ29udGludWF0aW9uKSB7Ci0gICAgICAgIG1faW5saW5l
Q29udGludWF0aW9uLT5kZXN0cm95KCk7Ci0gICAgICAgIG1faW5saW5lQ29udGludWF0aW9uID0g
MDsKLSAgICB9CiAgICAgCiAgICAgaWYgKCFkb2N1bWVudEJlaW5nRGVzdHJveWVkKCkpIHsKICAg
ICAgICAgaWYgKGZpcnN0TGluZUJveCgpKSB7CkBAIC0zMTYsNyArMzA1LDcgQEAgdm9pZCBSZW5k
ZXJCbG9jazo6YWRkQ2hpbGQoUmVuZGVyT2JqZWN0KgogICAgICAgICB9CiAgICAgfSBlbHNlIGlm
ICghY2hpbGRyZW5JbmxpbmUoKSAmJiAobmV3Q2hpbGQtPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQo
KSB8fCBuZXdDaGlsZC0+aXNJbmxpbmUoKSkpIHsKICAgICAgICAgLy8gSWYgd2UncmUgaW5zZXJ0
aW5nIGFuIGlubGluZSBjaGlsZCBidXQgYWxsIG9mIG91ciBjaGlsZHJlbiBhcmUgYmxvY2tzLCB0
aGVuIHdlIGhhdmUgdG8gbWFrZSBzdXJlCi0gICAgICAgIC8vIGl0IGlzIHB1dCBpbnRvIGFuIGFu
b215b3VzIGJsb2NrIGJveC4gV2UgdHJ5IHRvIHVzZSBhbiBleGlzdGluZyBhbm9ueW1vdXMgYm94
IGlmIHBvc3NpYmxlLCBvdGhlcndpc2UKKyAgICAgICAgLy8gaXQgaXMgcHV0IGludG8gYW4gYW5v
bnltb3VzIGJsb2NrIGJveC4gV2UgdHJ5IHRvIHVzZSBhbiBleGlzdGluZyBhbm9ueW1vdXMgYm94
IGlmIHBvc3NpYmxlLCBvdGhlcndpc2UKICAgICAgICAgLy8gYSBuZXcgb25lIGlzIGNyZWF0ZWQg
YW5kIGluc2VydGVkIGludG8gb3VyIGxpc3Qgb2YgY2hpbGRyZW4gaW4gdGhlIGFwcHJvcHJpYXRl
IHBvc2l0aW9uLgogICAgICAgICBSZW5kZXJPYmplY3QqIGFmdGVyQ2hpbGQgPSBiZWZvcmVDaGls
ZCA/IGJlZm9yZUNoaWxkLT5wcmV2aW91c1NpYmxpbmcoKSA6IGxhc3RDaGlsZCgpOwogCkBAIC00
OTAsOSArNDc5LDYgQEAgdm9pZCBSZW5kZXJCbG9jazo6cmVtb3ZlTGVmdG92ZXJBbm9ueW1vdQog
ICAgIEFTU0VSVChjaGlsZC0+aXNBbm9ueW1vdXNCbG9jaygpKTsKICAgICBBU1NFUlQoIWNoaWxk
LT5jaGlsZHJlbklubGluZSgpKTsKICAgICAKLSAgICBpZiAoY2hpbGQtPmlubGluZUNvbnRpbnVh
dGlvbigpKSAKLSAgICAgICAgcmV0dXJuOwotICAgIAogICAgIFJlbmRlck9iamVjdCogZmlyc3RB
bkNoaWxkID0gY2hpbGQtPm1fY2hpbGRyZW4uZmlyc3RDaGlsZCgpOwogICAgIFJlbmRlck9iamVj
dCogbGFzdEFuQ2hpbGQgPSBjaGlsZC0+bV9jaGlsZHJlbi5sYXN0Q2hpbGQoKTsKICAgICBpZiAo
Zmlyc3RBbkNoaWxkKSB7CkBAIC01MzUsNyArNTIxLDcgQEAgdm9pZCBSZW5kZXJCbG9jazo6cmVt
b3ZlQ2hpbGQoUmVuZGVyT2JqZQogICAgIFJlbmRlck9iamVjdCogcHJldiA9IG9sZENoaWxkLT5w
cmV2aW91c1NpYmxpbmcoKTsKICAgICBSZW5kZXJPYmplY3QqIG5leHQgPSBvbGRDaGlsZC0+bmV4
dFNpYmxpbmcoKTsKICAgICBib29sIGNhbkRlbGV0ZUFub255bW91c0Jsb2NrcyA9ICFkb2N1bWVu
dEJlaW5nRGVzdHJveWVkKCkgJiYgIWlzSW5saW5lKCkgJiYgIW9sZENoaWxkLT5pc0lubGluZSgp
ICYmIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFvbGRDaGlsZC0+aXNS
ZW5kZXJCbG9jaygpIHx8ICF0b1JlbmRlckJsb2NrKG9sZENoaWxkKS0+aW5saW5lQ29udGludWF0
aW9uKCkpICYmIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIW9sZENoaWxk
LT5pc1JlbmRlckJsb2NrKCkgJiYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAoIXByZXYgfHwgKHByZXYtPmlzQW5vbnltb3VzQmxvY2soKSAmJiBwcmV2LT5jaGlsZHJlbklu
bGluZSgpKSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghbmV4dCB8
fCAobmV4dC0+aXNBbm9ueW1vdXNCbG9jaygpICYmIG5leHQtPmNoaWxkcmVuSW5saW5lKCkpKTsK
ICAgICBpZiAoY2FuRGVsZXRlQW5vbnltb3VzQmxvY2tzICYmIHByZXYgJiYgbmV4dCkgewpAQCAt
NTk4LDkgKzU4NCwxNSBAQCBib29sIFJlbmRlckJsb2NrOjppc1NlbGZDb2xsYXBzaW5nQmxvY2so
CiAgICAgLy8gb24gd2hldGhlciB3ZSBoYXZlIGNvbnRlbnQgdGhhdCBpcyBhbGwgc2VsZi1jb2xs
YXBzaW5nIG9yIG5vdC4KICAgICBpZiAoaGFzQXV0b0hlaWdodCB8fCAoKHN0eWxlKCktPmhlaWdo
dCgpLmlzRml4ZWQoKSB8fCBzdHlsZSgpLT5oZWlnaHQoKS5pc1BlcmNlbnQoKSkgJiYgc3R5bGUo
KS0+aGVpZ2h0KCkuaXNaZXJvKCkpKSB7CiAgICAgICAgIC8vIElmIHRoZSBibG9jayBoYXMgaW5s
aW5lIGNoaWxkcmVuLCBzZWUgaWYgd2UgZ2VuZXJhdGVkIGFueSBsaW5lIGJveGVzLiAgSWYgd2Ug
aGF2ZSBhbnkKLSAgICAgICAgLy8gbGluZSBib3hlcywgdGhlbiB3ZSBjYW4ndCBiZSBzZWxmLWNv
bGxhcHNpbmcsIHNpbmNlIHdlIGhhdmUgY29udGVudC4KLSAgICAgICAgaWYgKGNoaWxkcmVuSW5s
aW5lKCkpCi0gICAgICAgICAgICByZXR1cm4gIWZpcnN0TGluZUJveCgpOworICAgICAgICAvLyBs
aW5lIGJveGVzLCB0aGVuIHdlIGNhbiBvbmx5IGJlIHNlbGYtY29sbGFwc2luZyBpZiB3ZSBoYXZl
IG5vdGhpbmcgYnV0IGFub255bW91cyBpbmxpbmUgYmxvY2tzCisgICAgICAgIC8vIHRoYXQgYXJl
IGFsc28gc2VsZi1jb2xsYXBzaW5nIGluc2lkZSB1cy4KKyAgICAgICAgaWYgKGNoaWxkcmVuSW5s
aW5lKCkpIHsKKyAgICAgICAgICAgIGZvciAoUm9vdElubGluZUJveCogY2hpbGQgPSBmaXJzdFJv
b3RCb3goKTsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHRSb290Qm94KCkpIHsKKyAgICAgICAg
ICAgICAgICBpZiAoIWNoaWxkLT5hbm9ueW1vdXNJbmxpbmVCbG9jaygpIHx8ICFjaGlsZC0+YW5v
bnltb3VzSW5saW5lQmxvY2soKS0+aXNTZWxmQ29sbGFwc2luZ0Jsb2NrKCkpCisgICAgICAgICAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVy
biB0cnVlOyAvLyBXZSBoYXZlIG5vIGxpbmUgYm94ZXMsIHNvIHdlIG11c3QgYmUgc2VsZi1jb2xs
YXBzaW5nLgorICAgICAgICB9CiAgICAgICAgIAogICAgICAgICAvLyBXaGV0aGVyIG9yIG5vdCB3
ZSBjb2xsYXBzZSBpcyBkZXBlbmRlbnQgb24gd2hldGhlciBhbGwgb3VyIG5vcm1hbCBmbG93IGNo
aWxkcmVuCiAgICAgICAgIC8vIGFyZSBhbHNvIHNlbGYtY29sbGFwc2luZy4KQEAgLTg1NSw3ICs4
NDcsOCBAQCB2b2lkIFJlbmRlckJsb2NrOjphZGRPdmVyZmxvd0Zyb21GbG9hdHMoCiAKIGJvb2wg
UmVuZGVyQmxvY2s6OmV4cGFuZHNUb0VuY2xvc2VPdmVyaGFuZ2luZ0Zsb2F0cygpIGNvbnN0CiB7
Ci0gICAgcmV0dXJuIGlzSW5saW5lQmxvY2tPcklubGluZVRhYmxlKCkgfHwgaXNGbG9hdGluZ09y
UG9zaXRpb25lZCgpIHx8IGhhc092ZXJmbG93Q2xpcCgpIHx8IChwYXJlbnQoKSAmJiBwYXJlbnQo
KS0+aXNGbGV4aWJsZUJveCgpKSB8fCBoYXNDb2x1bW5zKCkgfHwgaXNUYWJsZUNlbGwoKSB8fCBp
c0ZpZWxkc2V0KCk7CisgICAgcmV0dXJuIGlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSB8fCBoYXNP
dmVyZmxvd0NsaXAoKSB8fCAocGFyZW50KCkgJiYgcGFyZW50KCktPmlzRmxleGlibGVCb3goKSkg
fHwgaGFzQ29sdW1ucygpIHx8IGlzVGFibGVDZWxsKCkgfHwgaXNGaWVsZHNldCgpIHx8CisgICAg
ICAgICAgIChpc0lubGluZUJsb2NrT3JJbmxpbmVUYWJsZSgpICYmICFpc0Fub255bW91c0lubGlu
ZUJsb2NrKCkpOwogfQogCiB2b2lkIFJlbmRlckJsb2NrOjphZGp1c3RQb3NpdGlvbmVkQmxvY2so
UmVuZGVyQm94KiBjaGlsZCwgY29uc3QgTWFyZ2luSW5mbyYgbWFyZ2luSW5mbykKQEAgLTEwMDEs
MTkgKzk5NCwxOSBAQCBib29sIFJlbmRlckJsb2NrOjpoYW5kbGVSdW5JbkNoaWxkKFJlbmRlCiBp
bnQgUmVuZGVyQmxvY2s6OmNvbGxhcHNlTWFyZ2lucyhSZW5kZXJCb3gqIGNoaWxkLCBNYXJnaW5J
bmZvJiBtYXJnaW5JbmZvKQogewogICAgIC8vIEdldCBvdXIgbWF4IHBvcyBhbmQgbmVnIHRvcCBt
YXJnaW5zLgotICAgIGludCBwb3NUb3AgPSBjaGlsZC0+bWF4VG9wTWFyZ2luKHRydWUpOwotICAg
IGludCBuZWdUb3AgPSBjaGlsZC0+bWF4VG9wTWFyZ2luKGZhbHNlKTsKKyAgICBpbnQgcG9zVG9w
ID0gY2hpbGQgPyBjaGlsZC0+bWF4VG9wTWFyZ2luKHRydWUpIDogMDsKKyAgICBpbnQgbmVnVG9w
ID0gY2hpbGQgPyBjaGlsZC0+bWF4VG9wTWFyZ2luKGZhbHNlKSA6IDA7CiAKICAgICAvLyBGb3Ig
c2VsZi1jb2xsYXBzaW5nIGJsb2NrcywgY29sbGFwc2Ugb3VyIGJvdHRvbSBtYXJnaW5zIGludG8g
b3VyCiAgICAgLy8gdG9wIHRvIGdldCBuZXcgcG9zVG9wIGFuZCBuZWdUb3AgdmFsdWVzLgotICAg
IGlmIChjaGlsZC0+aXNTZWxmQ29sbGFwc2luZ0Jsb2NrKCkpIHsKKyAgICBpZiAoY2hpbGQgJiYg
Y2hpbGQtPmlzU2VsZkNvbGxhcHNpbmdCbG9jaygpKSB7CiAgICAgICAgIHBvc1RvcCA9IG1heChw
b3NUb3AsIGNoaWxkLT5tYXhCb3R0b21NYXJnaW4odHJ1ZSkpOwogICAgICAgICBuZWdUb3AgPSBt
YXgobmVnVG9wLCBjaGlsZC0+bWF4Qm90dG9tTWFyZ2luKGZhbHNlKSk7CiAgICAgfQogICAgIAog
ICAgIC8vIFNlZSBpZiB0aGUgdG9wIG1hcmdpbiBpcyBxdWlya3kuIFdlIG9ubHkgY2FyZSBpZiB0
aGlzIGNoaWxkIGhhcwogICAgIC8vIG1hcmdpbnMgdGhhdCB3aWxsIGNvbGxhcHNlIHdpdGggdXMu
Ci0gICAgYm9vbCB0b3BRdWlyayA9IGNoaWxkLT5pc1RvcE1hcmdpblF1aXJrKCkgfHwgc3R5bGUo
KS0+bWFyZ2luVG9wQ29sbGFwc2UoKSA9PSBNRElTQ0FSRDsKKyAgICBib29sIHRvcFF1aXJrID0g
KGNoaWxkICYmIGNoaWxkLT5pc1RvcE1hcmdpblF1aXJrKCkpIHx8IHN0eWxlKCktPm1hcmdpblRv
cENvbGxhcHNlKCkgPT0gTURJU0NBUkQ7CiAKICAgICBpZiAobWFyZ2luSW5mby5jYW5Db2xsYXBz
ZVdpdGhUb3AoKSkgewogICAgICAgICAvLyBUaGlzIGNoaWxkIGlzIGNvbGxhcHNpbmcgd2l0aCB0
aGUgdG9wIG9mIHRoZQpAQCAtMTAyNiw3ICsxMDE5LDcgQEAgaW50IFJlbmRlckJsb2NrOjpjb2xs
YXBzZU1hcmdpbnMoUmVuZGVyQgogICAgICAgICAvLyBjb2xsYXBzZSBpdCBhd2F5LCBldmVuIGlm
IHRoZSBtYXJnaW4gaXMgc21hbGxlciAod3d3LndlYnJlZmVyZW5jZS5jb20KICAgICAgICAgLy8g
aGFzIGFuIGV4YW1wbGUgb2YgdGhpcywgYSA8ZHQ+IHdpdGggMC44ZW0gYXV0aG9yLXNwZWNpZmll
ZCBpbnNpZGUKICAgICAgICAgLy8gYSA8ZGw+IGluc2lkZSBhIDx0ZD4uCi0gICAgICAgIGlmICgh
bWFyZ2luSW5mby5kZXRlcm1pbmVkVG9wUXVpcmsoKSAmJiAhdG9wUXVpcmsgJiYgKHBvc1RvcC1u
ZWdUb3ApKSB7CisgICAgICAgIGlmICghbWFyZ2luSW5mby5kZXRlcm1pbmVkVG9wUXVpcmsoKSAm
JiAhdG9wUXVpcmsgJiYgKHBvc1RvcCAtIG5lZ1RvcCkpIHsKICAgICAgICAgICAgIHNldFRvcE1h
cmdpblF1aXJrKGZhbHNlKTsKICAgICAgICAgICAgIG1hcmdpbkluZm8uc2V0RGV0ZXJtaW5lZFRv
cFF1aXJrKHRydWUpOwogICAgICAgICB9CkBAIC0xMDQ0LDcgKzEwMzcsNyBAQCBpbnQgUmVuZGVy
QmxvY2s6OmNvbGxhcHNlTWFyZ2lucyhSZW5kZXJCCiAgICAgICAgIG1hcmdpbkluZm8uc2V0VG9w
UXVpcmsodG9wUXVpcmspOwogCiAgICAgaW50IHlwb3MgPSBoZWlnaHQoKTsKLSAgICBpZiAoY2hp
bGQtPmlzU2VsZkNvbGxhcHNpbmdCbG9jaygpKSB7CisgICAgaWYgKGNoaWxkICYmIGNoaWxkLT5p
c1NlbGZDb2xsYXBzaW5nQmxvY2soKSkgewogICAgICAgICAvLyBUaGlzIGNoaWxkIGhhcyBubyBo
ZWlnaHQuICBXZSBuZWVkIHRvIGNvbXB1dGUgb3VyCiAgICAgICAgIC8vIHBvc2l0aW9uIGJlZm9y
ZSB3ZSBjb2xsYXBzZSB0aGUgY2hpbGQncyBtYXJnaW5zIHRvZ2V0aGVyLAogICAgICAgICAvLyBz
byB0aGF0IHdlIGNhbiBnZXQgYW4gYWNjdXJhdGUgcG9zaXRpb24gZm9yIHRoZSB6ZXJvLWhlaWdo
dCBibG9jay4KQEAgLTEwNjMsMTMgKzEwNTYsMTEgQEAgaW50IFJlbmRlckJsb2NrOjpjb2xsYXBz
ZU1hcmdpbnMoUmVuZGVyQgogICAgICAgICAgICAgLy8gdGhhdCBuZWVkcyB0byBiZSBwb3NpdGlv
bmVkIGNvcnJlY3RseSAoZS5nLiwgYSBibG9jayB0aGF0CiAgICAgICAgICAgICAvLyBoYWQgYSBz
cGVjaWZpZWQgaGVpZ2h0IG9mIDAgYnV0IHRoYXQgYWN0dWFsbHkgaGFkIHN1YmNvbnRlbnQpLgog
ICAgICAgICAgICAgeXBvcyA9IGhlaWdodCgpICsgY29sbGFwc2VkVG9wUG9zIC0gY29sbGFwc2Vk
VG9wTmVnOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgaWYgKGNoaWxkLT5zdHlsZSgpLT5t
YXJnaW5Ub3BDb2xsYXBzZSgpID09IE1TRVBBUkFURSkgeworICAgIH0gZWxzZSB7CisgICAgICAg
IGlmIChjaGlsZCAmJiBjaGlsZC0+c3R5bGUoKS0+bWFyZ2luVG9wQ29sbGFwc2UoKSA9PSBNU0VQ
QVJBVEUpIHsKICAgICAgICAgICAgIHNldEhlaWdodChoZWlnaHQoKSArIG1hcmdpbkluZm8ubWFy
Z2luKCkgKyBjaGlsZC0+bWFyZ2luVG9wKCkpOwogICAgICAgICAgICAgeXBvcyA9IGhlaWdodCgp
OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCFtYXJnaW5JbmZvLmF0VG9wT2ZCbG9jaygp
IHx8CisgICAgICAgIH0gZWxzZSBpZiAoIW1hcmdpbkluZm8uYXRUb3BPZkJsb2NrKCkgfHwKICAg
ICAgICAgICAgICghbWFyZ2luSW5mby5jYW5Db2xsYXBzZVRvcFdpdGhDaGlsZHJlbigpCiAgICAg
ICAgICAgICAgJiYgKCFzdHlsZSgpLT5odG1sSGFja3MoKSB8fCAhbWFyZ2luSW5mby5xdWlya0Nv
bnRhaW5lcigpIHx8ICFtYXJnaW5JbmZvLnRvcFF1aXJrKCkpKSkgewogICAgICAgICAgICAgLy8g
V2UncmUgY29sbGFwc2luZyB3aXRoIGEgcHJldmlvdXMgc2libGluZydzIG1hcmdpbnMgYW5kIG5v
dApAQCAtMTA3OCwxMSArMTA2OSwxMSBAQCBpbnQgUmVuZGVyQmxvY2s6OmNvbGxhcHNlTWFyZ2lu
cyhSZW5kZXJCCiAgICAgICAgICAgICB5cG9zID0gaGVpZ2h0KCk7CiAgICAgICAgIH0KIAotICAg
ICAgICBtYXJnaW5JbmZvLnNldFBvc01hcmdpbihjaGlsZC0+bWF4Qm90dG9tTWFyZ2luKHRydWUp
KTsKLSAgICAgICAgbWFyZ2luSW5mby5zZXROZWdNYXJnaW4oY2hpbGQtPm1heEJvdHRvbU1hcmdp
bihmYWxzZSkpOworICAgICAgICBtYXJnaW5JbmZvLnNldFBvc01hcmdpbihjaGlsZCA/IGNoaWxk
LT5tYXhCb3R0b21NYXJnaW4odHJ1ZSkgOiAwKTsKKyAgICAgICAgbWFyZ2luSW5mby5zZXROZWdN
YXJnaW4oY2hpbGQgPyBjaGlsZC0+bWF4Qm90dG9tTWFyZ2luKGZhbHNlKSA6IDApOwogCiAgICAg
ICAgIGlmIChtYXJnaW5JbmZvLm1hcmdpbigpKQotICAgICAgICAgICAgbWFyZ2luSW5mby5zZXRC
b3R0b21RdWlyayhjaGlsZC0+aXNCb3R0b21NYXJnaW5RdWlyaygpIHx8IHN0eWxlKCktPm1hcmdp
bkJvdHRvbUNvbGxhcHNlKCkgPT0gTURJU0NBUkQpOworICAgICAgICAgICAgbWFyZ2luSW5mby5z
ZXRCb3R0b21RdWlyaygoY2hpbGQgJiYgY2hpbGQtPmlzQm90dG9tTWFyZ2luUXVpcmsoKSkgfHwg
c3R5bGUoKS0+bWFyZ2luQm90dG9tQ29sbGFwc2UoKSA9PSBNRElTQ0FSRCk7CiAgICAgfQogICAg
IAogICAgIHJldHVybiB5cG9zOwpAQCAtMTc0OSwyMCArMTc0MCw3IEBAIHZvaWQgUmVuZGVyQmxv
Y2s6OnBhaW50T2JqZWN0KFBhaW50SW5mbyYKICAgICBpZiAoKHBhaW50UGhhc2UgPT0gUGFpbnRQ
aGFzZU91dGxpbmUgfHwgcGFpbnRQaGFzZSA9PSBQYWludFBoYXNlU2VsZk91dGxpbmUpICYmIGhh
c091dGxpbmUoKSAmJiBzdHlsZSgpLT52aXNpYmlsaXR5KCkgPT0gVklTSUJMRSkKICAgICAgICAg
cGFpbnRPdXRsaW5lKHBhaW50SW5mby5jb250ZXh0LCB0eCwgdHksIHdpZHRoKCksIGhlaWdodCgp
LCBzdHlsZSgpKTsKIAotICAgIC8vIDYuIHBhaW50IGNvbnRpbnVhdGlvbiBvdXRsaW5lcy4KLSAg
ICBpZiAoKHBhaW50UGhhc2UgPT0gUGFpbnRQaGFzZU91dGxpbmUgfHwgcGFpbnRQaGFzZSA9PSBQ
YWludFBoYXNlQ2hpbGRPdXRsaW5lcykpIHsKLSAgICAgICAgaWYgKGlubGluZUNvbnRpbnVhdGlv
bigpICYmIGlubGluZUNvbnRpbnVhdGlvbigpLT5oYXNPdXRsaW5lKCkgJiYgaW5saW5lQ29udGlu
dWF0aW9uKCktPnN0eWxlKCktPnZpc2liaWxpdHkoKSA9PSBWSVNJQkxFKSB7Ci0gICAgICAgICAg
ICBSZW5kZXJJbmxpbmUqIGlubGluZVJlbmRlcmVyID0gdG9SZW5kZXJJbmxpbmUoaW5saW5lQ29u
dGludWF0aW9uKCktPm5vZGUoKS0+cmVuZGVyZXIoKSk7Ci0gICAgICAgICAgICBpZiAoIWlubGlu
ZVJlbmRlcmVyLT5oYXNTZWxmUGFpbnRpbmdMYXllcigpKQotICAgICAgICAgICAgICAgIGNvbnRh
aW5pbmdCbG9jaygpLT5hZGRDb250aW51YXRpb25XaXRoT3V0bGluZShpbmxpbmVSZW5kZXJlcik7
Ci0gICAgICAgICAgICBlbHNlIGlmICghaW5saW5lUmVuZGVyZXItPmZpcnN0TGluZUJveCgpKQot
ICAgICAgICAgICAgICAgIGlubGluZVJlbmRlcmVyLT5wYWludE91dGxpbmUocGFpbnRJbmZvLmNv
bnRleHQsIHR4IC0geCgpICsgaW5saW5lUmVuZGVyZXItPmNvbnRhaW5pbmdCbG9jaygpLT54KCks
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eSAtIHkoKSAr
IGlubGluZVJlbmRlcmVyLT5jb250YWluaW5nQmxvY2soKS0+eSgpKTsKLSAgICAgICAgfQotICAg
ICAgICBwYWludENvbnRpbnVhdGlvbk91dGxpbmVzKHBhaW50SW5mbywgdHgsIHR5KTsKLSAgICB9
Ci0KLSAgICAvLyA3LiBwYWludCBjYXJldC4KKyAgICAvLyA2LiBwYWludCBjYXJldC4KICAgICAv
LyBJZiB0aGUgY2FyZXQncyBub2RlJ3MgcmVuZGVyIG9iamVjdCdzIGNvbnRhaW5pbmcgYmxvY2sg
aXMgdGhpcyBibG9jaywgYW5kIHRoZSBwYWludCBhY3Rpb24gaXMgUGFpbnRQaGFzZUZvcmVncm91
bmQsCiAgICAgLy8gdGhlbiBwYWludCB0aGUgY2FyZXQuCiAgICAgaWYgKHBhaW50UGhhc2UgPT0g
UGFpbnRQaGFzZUZvcmVncm91bmQpIHsgICAgICAgIApAQCAtMTgyNSw1NyArMTgwMyw2IEBAIHZv
aWQgUmVuZGVyQmxvY2s6OnBhaW50RWxsaXBzaXNCb3hlcyhQYWkKICAgICB9CiB9CiAKLXN0YXRp
YyBDb250aW51YXRpb25PdXRsaW5lVGFibGVNYXAqIGNvbnRpbnVhdGlvbk91dGxpbmVUYWJsZSgp
Ci17Ci0gICAgREVGSU5FX1NUQVRJQ19MT0NBTChDb250aW51YXRpb25PdXRsaW5lVGFibGVNYXAs
IHRhYmxlLCAoKSk7Ci0gICAgcmV0dXJuICZ0YWJsZTsKLX0KLQotdm9pZCBSZW5kZXJCbG9jazo6
YWRkQ29udGludWF0aW9uV2l0aE91dGxpbmUoUmVuZGVySW5saW5lKiBmbG93KQotewotICAgIC8v
IFdlIGNhbid0IG1ha2UgdGhpcyB3b3JrIGlmIHRoZSBpbmxpbmUgaXMgaW4gYSBsYXllci4gIFdl
J2xsIGp1c3QgcmVseSBvbiB0aGUgYnJva2VuCi0gICAgLy8gd2F5IG9mIHBhaW50aW5nLgotICAg
IEFTU0VSVCghZmxvdy0+bGF5ZXIoKSAmJiAhZmxvdy0+aXNJbmxpbmVDb250aW51YXRpb24oKSk7
Ci0gICAgCi0gICAgQ29udGludWF0aW9uT3V0bGluZVRhYmxlTWFwKiB0YWJsZSA9IGNvbnRpbnVh
dGlvbk91dGxpbmVUYWJsZSgpOwotICAgIExpc3RIYXNoU2V0PFJlbmRlcklubGluZSo+KiBjb250
aW51YXRpb25zID0gdGFibGUtPmdldCh0aGlzKTsKLSAgICBpZiAoIWNvbnRpbnVhdGlvbnMpIHsK
LSAgICAgICAgY29udGludWF0aW9ucyA9IG5ldyBMaXN0SGFzaFNldDxSZW5kZXJJbmxpbmUqPjsK
LSAgICAgICAgdGFibGUtPnNldCh0aGlzLCBjb250aW51YXRpb25zKTsKLSAgICB9Ci0gICAgCi0g
ICAgY29udGludWF0aW9ucy0+YWRkKGZsb3cpOwotfQotCi12b2lkIFJlbmRlckJsb2NrOjpwYWlu
dENvbnRpbnVhdGlvbk91dGxpbmVzKFBhaW50SW5mbyYgaW5mbywgaW50IHR4LCBpbnQgdHkpCi17
Ci0gICAgQ29udGludWF0aW9uT3V0bGluZVRhYmxlTWFwKiB0YWJsZSA9IGNvbnRpbnVhdGlvbk91
dGxpbmVUYWJsZSgpOwotICAgIGlmICh0YWJsZS0+aXNFbXB0eSgpKQotICAgICAgICByZXR1cm47
Ci0gICAgICAgIAotICAgIExpc3RIYXNoU2V0PFJlbmRlcklubGluZSo+KiBjb250aW51YXRpb25z
ID0gdGFibGUtPmdldCh0aGlzKTsKLSAgICBpZiAoIWNvbnRpbnVhdGlvbnMpCi0gICAgICAgIHJl
dHVybjsKLSAgICAgICAgCi0gICAgLy8gUGFpbnQgZWFjaCBjb250aW51YXRpb24gb3V0bGluZS4K
LSAgICBMaXN0SGFzaFNldDxSZW5kZXJJbmxpbmUqPjo6aXRlcmF0b3IgZW5kID0gY29udGludWF0
aW9ucy0+ZW5kKCk7Ci0gICAgZm9yIChMaXN0SGFzaFNldDxSZW5kZXJJbmxpbmUqPjo6aXRlcmF0
b3IgaXQgPSBjb250aW51YXRpb25zLT5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAg
ICAgLy8gTmVlZCB0byBhZGQgaW4gdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBpbnRlcnZlbmluZyBi
bG9ja3MuCi0gICAgICAgIFJlbmRlcklubGluZSogZmxvdyA9ICppdDsKLSAgICAgICAgUmVuZGVy
QmxvY2sqIGJsb2NrID0gZmxvdy0+Y29udGFpbmluZ0Jsb2NrKCk7Ci0gICAgICAgIGZvciAoIDsg
YmxvY2sgJiYgYmxvY2sgIT0gdGhpczsgYmxvY2sgPSBibG9jay0+Y29udGFpbmluZ0Jsb2NrKCkp
IHsKLSAgICAgICAgICAgIHR4ICs9IGJsb2NrLT54KCk7Ci0gICAgICAgICAgICB0eSArPSBibG9j
ay0+eSgpOwotICAgICAgICB9Ci0gICAgICAgIEFTU0VSVChibG9jayk7ICAgCi0gICAgICAgIGZs
b3ctPnBhaW50T3V0bGluZShpbmZvLmNvbnRleHQsIHR4LCB0eSk7Ci0gICAgfQotICAgIAotICAg
IC8vIERlbGV0ZQotICAgIGRlbGV0ZSBjb250aW51YXRpb25zOwotICAgIHRhYmxlLT5yZW1vdmUo
dGhpcyk7Ci19Ci0KIHZvaWQgUmVuZGVyQmxvY2s6OnNldFNlbGVjdGlvblN0YXRlKFNlbGVjdGlv
blN0YXRlIHMpCiB7CiAgICAgaWYgKHNlbGVjdGlvblN0YXRlKCkgPT0gcykKQEAgLTI5ODUsMjUg
KzI5MTIsMzEgQEAgdm9pZCBSZW5kZXJCbG9jazo6Y2xlYXJGbG9hdHMoKQogICAgIC8vIG91dCBv
ZiBmbG93IChsaWtlIGZsb2F0aW5nL3Bvc2l0aW9uZWQgZWxlbWVudHMpLCBhbmQgd2UgYWxzbyBz
a2lwIG92ZXIgYW55IG9iamVjdHMgdGhhdCBtYXkgaGF2ZSBzaGlmdGVkCiAgICAgLy8gdG8gYXZv
aWQgZmxvYXRzLgogICAgIGJvb2wgcGFyZW50SGFzRmxvYXRzID0gZmFsc2U7Ci0gICAgUmVuZGVy
T2JqZWN0KiBwcmV2ID0gcHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgd2hpbGUgKHByZXYgJiYgKHBy
ZXYtPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSB8fCAhcHJldi0+aXNCb3goKSB8fCAhcHJldi0+
aXNSZW5kZXJCbG9jaygpIHx8IHRvUmVuZGVyQmxvY2socHJldiktPmF2b2lkc0Zsb2F0cygpKSkg
ewotICAgICAgICBpZiAocHJldi0+aXNGbG9hdGluZygpKQotICAgICAgICAgICAgcGFyZW50SGFz
RmxvYXRzID0gdHJ1ZTsKLSAgICAgICAgIHByZXYgPSBwcmV2LT5wcmV2aW91c1NpYmxpbmcoKTsK
KyAgICBSZW5kZXJPYmplY3QqIHByZXYgPSAwOworICAgIFJlbmRlckJsb2NrKiBwYXJlbnRCbG9j
ayA9IDA7CisgICAgaWYgKGlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkgeworICAgICAgICBwYXJl
bnRCbG9jayA9IGNvbnRhaW5pbmdCbG9jaygpOworICAgICAgICBwYXJlbnRIYXNGbG9hdHMgPSBw
YXJlbnRCbG9jay0+Y29udGFpbnNGbG9hdHMoKTsKKyAgICB9IGVsc2UgeyAgICAKKyAgICAgICAg
d2hpbGUgKHByZXYgJiYgKHByZXYtPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSB8fCAhcHJldi0+
aXNCb3goKSB8fCAhcHJldi0+aXNSZW5kZXJCbG9jaygpIHx8IHRvUmVuZGVyQmxvY2socHJldikt
PmF2b2lkc0Zsb2F0cygpKSkgeworICAgICAgICAgICAgaWYgKHByZXYtPmlzRmxvYXRpbmcoKSkK
KyAgICAgICAgICAgICAgICBwYXJlbnRIYXNGbG9hdHMgPSB0cnVlOworICAgICAgICAgICAgcHJl
diA9IHByZXYtPnByZXZpb3VzU2libGluZygpOworICAgICAgICB9CisgICAgICAgIAorICAgICAg
ICBwYXJlbnRCbG9jayA9IHBhcmVudCgpLT5pc1JlbmRlckJsb2NrKCkgPyB0b1JlbmRlckJsb2Nr
KHBhcmVudCgpKSA6IDA7CiAgICAgfQogCiAgICAgLy8gRmlyc3QgYWRkIGluIGZsb2F0cyBmcm9t
IHRoZSBwYXJlbnQuCiAgICAgaW50IG9mZnNldCA9IHkoKTsKLSAgICBpZiAocGFyZW50SGFzRmxv
YXRzKSB7Ci0gICAgICAgIFJlbmRlckJsb2NrKiBwYXJlbnRCbG9jayA9IHRvUmVuZGVyQmxvY2so
cGFyZW50KCkpOworICAgIGlmIChwYXJlbnRIYXNGbG9hdHMpCiAgICAgICAgIGFkZEludHJ1ZGlu
Z0Zsb2F0cyhwYXJlbnRCbG9jaywgcGFyZW50QmxvY2stPmJvcmRlckxlZnQoKSArIHBhcmVudEJs
b2NrLT5wYWRkaW5nTGVmdCgpLCBvZmZzZXQpOwotICAgIH0KLSAgICAKKwogICAgIGludCB4b2Zm
c2V0ID0gMDsKICAgICBpZiAocHJldikKICAgICAgICAgb2Zmc2V0IC09IHRvUmVuZGVyQm94KHBy
ZXYpLT55KCk7Ci0gICAgZWxzZSBpZiAocGFyZW50KCktPmlzQm94KCkpIHsKLSAgICAgICAgcHJl
diA9IHBhcmVudCgpOworICAgIGVsc2UgaWYgKHBhcmVudEJsb2NrKSB7CisgICAgICAgIHByZXYg
PSBwYXJlbnRCbG9jazsKICAgICAgICAgeG9mZnNldCArPSB0b1JlbmRlckJveChwcmV2KS0+Ym9y
ZGVyTGVmdCgpICsgdG9SZW5kZXJCb3gocHJldiktPnBhZGRpbmdMZWZ0KCk7CiAgICAgfQogCkBA
IC0zMTM4LDcgKzMwNzEsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjphZGRJbnRydWRpbmdGbG9hdHMo
UmVuCiAgICAgICAgICAgICAgICAgLy8gYWJvdmUuICB8eG9mZnwgd2lsbCBlcXVhbCAtZmxvdy0+
bWFyZ2luTGVmdCgpIGluIHRoaXMgY2FzZSwgc28gaXQncyBhbHJlYWR5IGJlZW4gdGFrZW4KICAg
ICAgICAgICAgICAgICAvLyBpbnRvIGFjY291bnQuICBPbmx5IGFwcGx5IHRoaXMgY29kZSBpZiB8
Y2hpbGR8IGlzIGZhbHNlLCBzaW5jZSBvdGhlcndpc2UgdGhlIGxlZnQgbWFyZ2luCiAgICAgICAg
ICAgICAgICAgLy8gd2lsbCBnZXQgYXBwbGllZCB0d2ljZS4KLSAgICAgICAgICAgICAgICBpZiAo
cHJldiAhPSBwYXJlbnQoKSkKKyAgICAgICAgICAgICAgICBpZiAocHJldiAhPSBjb250YWluaW5n
QmxvY2soKSkKICAgICAgICAgICAgICAgICAgICAgZmxvYXRpbmdPYmotPm1fbGVmdCArPSBwcmV2
LT5tYXJnaW5MZWZ0KCk7CiAgICAgICAgICAgICAgICAgZmxvYXRpbmdPYmotPm1fbGVmdCAtPSBt
YXJnaW5MZWZ0KCk7CiAgICAgICAgICAgICAgICAgZmxvYXRpbmdPYmotPm1fc2hvdWxkUGFpbnQg
PSBmYWxzZTsgIC8vIFdlIGFyZSBub3QgaW4gdGhlIGRpcmVjdCBpbmhlcml0YW5jZSBjaGFpbiBm
b3IgdGhpcyBmbG9hdC4gV2Ugd2lsbCBuZXZlciBwYWludCBpdC4KQEAgLTMxODMsNyArMzExNiwx
MyBAQCB2b2lkIFJlbmRlckJsb2NrOjptYXJrQWxsRGVzY2VuZGFudHNXaXRoCiAgICAgICAgIHJl
bW92ZUZsb2F0aW5nT2JqZWN0KGZsb2F0VG9SZW1vdmUpOwogCiAgICAgLy8gSXRlcmF0ZSBvdmVy
IG91ciBjaGlsZHJlbiBhbmQgbWFyayB0aGVtIGFzIG5lZWRlZC4KLSAgICBpZiAoIWNoaWxkcmVu
SW5saW5lKCkpIHsKKyAgICBpZiAoY2hpbGRyZW5JbmxpbmUoKSkgeworICAgICAgICBmb3IgKFJv
b3RJbmxpbmVCb3gqIGJveCA9IGZpcnN0Um9vdEJveCgpOyBib3g7IGJveCA9IGJveC0+bmV4dFJv
b3RCb3goKSkgeworICAgICAgICAgICAgUmVuZGVyQmxvY2sqIGNoaWxkQmxvY2sgPSBib3gtPmFu
b255bW91c0lubGluZUJsb2NrKCk7CisgICAgICAgICAgICBpZiAoY2hpbGRCbG9jayAmJiAoZmxv
YXRUb1JlbW92ZSA/IGNoaWxkQmxvY2stPmNvbnRhaW5zRmxvYXQoZmxvYXRUb1JlbW92ZSkgOiBj
aGlsZEJsb2NrLT5jb250YWluc0Zsb2F0cygpKSkKKyAgICAgICAgICAgICAgICBjaGlsZEJsb2Nr
LT5tYXJrQWxsRGVzY2VuZGFudHNXaXRoRmxvYXRzRm9yTGF5b3V0KGZsb2F0VG9SZW1vdmUsIGlu
TGF5b3V0KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CiAgICAgICAgIGZvciAoUmVuZGVyT2Jq
ZWN0KiBjaGlsZCA9IGZpcnN0Q2hpbGQoKTsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHRTaWJs
aW5nKCkpIHsKICAgICAgICAgICAgIGlmICgoIWZsb2F0VG9SZW1vdmUgJiYgY2hpbGQtPmlzRmxv
YXRpbmdPclBvc2l0aW9uZWQoKSkgfHwgIWNoaWxkLT5pc1JlbmRlckJsb2NrKCkpCiAgICAgICAg
ICAgICAgICAgY29udGludWU7CkBAIC00MTQyLDE0ICs0MDgxLDE1IEBAIHZvaWQgUmVuZGVyQmxv
Y2s6OmNhbGNJbmxpbmVQcmVmV2lkdGhzKCkKICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAg
ICAgICAgICAgICAgICAgY2xlYXJQcmV2aW91c0Zsb2F0ID0gZmFsc2U7CiAKLSAgICAgICAgICAg
ICAgICBib29sIGNhbkJyZWFrUmVwbGFjZWRFbGVtZW50ID0gIWNoaWxkLT5pc0ltYWdlKCkgfHwg
YWxsb3dJbWFnZXNUb0JyZWFrOworICAgICAgICAgICAgICAgIGJvb2wgY2FuQnJlYWtSZXBsYWNl
ZEVsZW1lbnQgPSAhY2hpbGQtPmlzSW1hZ2UoKSB8fCBhbGxvd0ltYWdlc1RvQnJlYWsgfHwgY2hp
bGQtPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKTsKICAgICAgICAgICAgICAgICBpZiAoKGNhbkJy
ZWFrUmVwbGFjZWRFbGVtZW50ICYmIChhdXRvV3JhcCB8fCBvbGRBdXRvV3JhcCkpIHx8IGNsZWFy
UHJldmlvdXNGbG9hdCkgewogICAgICAgICAgICAgICAgICAgICBtX21pblByZWZXaWR0aCA9IG1h
eChpbmxpbmVNaW4sIG1fbWluUHJlZldpZHRoKTsKICAgICAgICAgICAgICAgICAgICAgaW5saW5l
TWluID0gMDsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAvLyBJZiB3ZSdy
ZSBzdXBwb3NlZCB0byBjbGVhciB0aGUgcHJldmlvdXMgZmxvYXQsIHRoZW4gdGVybWluYXRlIG1h
eHdpZHRoIGFzIHdlbGwuCi0gICAgICAgICAgICAgICAgaWYgKGNsZWFyUHJldmlvdXNGbG9hdCkg
eworICAgICAgICAgICAgICAgIC8vIEFsc28gZG8gdGhpcyBmb3IgYW5vbnltb3VzIGlubGluZSBi
bG9ja3MuCisgICAgICAgICAgICAgICAgaWYgKGNsZWFyUHJldmlvdXNGbG9hdCB8fCBjaGlsZC0+
aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CiAgICAgICAgICAgICAgICAgICAgIG1fbWF4UHJl
ZldpZHRoID0gbWF4KGlubGluZU1heCwgbV9tYXhQcmVmV2lkdGgpOwogICAgICAgICAgICAgICAg
ICAgICBpbmxpbmVNYXggPSAwOwogICAgICAgICAgICAgICAgIH0KQEAgLTQxNTgsMTUgKzQwOTgs
MTcgQEAgdm9pZCBSZW5kZXJCbG9jazo6Y2FsY0lubGluZVByZWZXaWR0aHMoKQogICAgICAgICAg
ICAgICAgIGludCB0aSA9IDA7CiAgICAgICAgICAgICAgICAgaWYgKCFhZGRlZFRleHRJbmRlbnQp
IHsKICAgICAgICAgICAgICAgICAgICAgYWRkZWRUZXh0SW5kZW50ID0gdHJ1ZTsKLSAgICAgICAg
ICAgICAgICAgICAgdGkgPSBzdHlsZSgpLT50ZXh0SW5kZW50KCkuY2FsY01pblZhbHVlKGN3KTsK
LSAgICAgICAgICAgICAgICAgICAgY2hpbGRNaW4rPXRpOwotICAgICAgICAgICAgICAgICAgICBj
aGlsZE1heCs9dGk7CisgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGQtPmlzQW5vbnltb3Vz
SW5saW5lQmxvY2soKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGkgPSBzdHlsZSgpLT50
ZXh0SW5kZW50KCkuY2FsY01pblZhbHVlKGN3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNo
aWxkTWluICs9IHRpOworICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRNYXggKz0gdGk7Cisg
ICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAg
ICAvLyBBZGQgb3VyIHdpZHRoIHRvIHRoZSBtYXguCiAgICAgICAgICAgICAgICAgaW5saW5lTWF4
ICs9IGNoaWxkTWF4OwogCi0gICAgICAgICAgICAgICAgaWYgKCFhdXRvV3JhcCB8fCAhY2FuQnJl
YWtSZXBsYWNlZEVsZW1lbnQpIHsKKyAgICAgICAgICAgICAgICBpZiAoKCFhdXRvV3JhcCB8fCAh
Y2FuQnJlYWtSZXBsYWNlZEVsZW1lbnQpICYmICFjaGlsZC0+aXNBbm9ueW1vdXNJbmxpbmVCbG9j
aygpKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC0+aXNGbG9hdGluZygpKQogICAg
ICAgICAgICAgICAgICAgICAgICAgbV9taW5QcmVmV2lkdGggPSBtYXgoY2hpbGRNaW4sIG1fbWlu
UHJlZldpZHRoKTsKICAgICAgICAgICAgICAgICAgICAgZWxzZQpAQCAtNDE3Nyw2ICs0MTE5LDEy
IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmNhbGNJbmxpbmVQcmVmV2lkdGhzKCkKIAogICAgICAgICAg
ICAgICAgICAgICAvLyBOb3cgc3RhcnQgYSBuZXcgbGluZS4KICAgICAgICAgICAgICAgICAgICAg
aW5saW5lTWluID0gMDsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAg
IGlmIChjaGlsZC0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CisgICAgICAgICAgICAgICAg
ICAgICAgICAvLyBUZXJtaW5hdGUgbWF4IHdpZHRoIGFzIHdlbGwuCisgICAgICAgICAgICAgICAg
ICAgICAgICBtX21heFByZWZXaWR0aCA9IG1heChjaGlsZE1heCwgbV9tYXhQcmVmV2lkdGgpOwor
ICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lTWF4ID0gMDsKKyAgICAgICAgICAgICAgICAg
ICAgfQogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBubyBs
b25nZXIgc3RyaXBwaW5nIHdoaXRlc3BhY2UgYXQgdGhlIHN0YXJ0IG9mCkBAIC00NDE3LDkgKzQz
NjUsMTIgQEAgaW50IFJlbmRlckJsb2NrOjpsaW5lSGVpZ2h0KGJvb2wgZmlyc3RMaQogICAgIC8v
IHRoZSBiYXNlIGNsYXNzLiAgSWYgd2UncmUgYmVpbmcgcXVlcmllZCBhcyB0aG91Z2ggd2UncmUg
dGhlIHJvb3QgbGluZQogICAgIC8vIGJveCwgdGhlbiB0aGUgZmFjdCB0aGF0IHdlJ3JlIGFuIGlu
bGluZS1ibG9jayBpcyBpcnJlbGV2YW50LCBhbmQgd2UgYmVoYXZlCiAgICAgLy8ganVzdCBsaWtl
IGEgYmxvY2suCi0gICAgaWYgKGlzUmVwbGFjZWQoKSAmJiAhaXNSb290TGluZUJveCkKKyAgICBp
ZiAoaXNSZXBsYWNlZCgpICYmICFpc1Jvb3RMaW5lQm94KSB7CisgICAgICAgIGlmIChpc0Fub255
bW91c0lubGluZUJsb2NrKCkpCisgICAgICAgICAgICByZXR1cm4gaGVpZ2h0KCk7CiAgICAgICAg
IHJldHVybiBoZWlnaHQoKSArIG1hcmdpblRvcCgpICsgbWFyZ2luQm90dG9tKCk7Ci0gICAgCisg
ICAgfQorCiAgICAgaWYgKGZpcnN0TGluZSAmJiBkb2N1bWVudCgpLT51c2VzRmlyc3RMaW5lUnVs
ZXMoKSkgewogICAgICAgICBSZW5kZXJTdHlsZSogcyA9IHN0eWxlKGZpcnN0TGluZSk7CiAgICAg
ICAgIGlmIChzICE9IHN0eWxlKCkpCkBAIC00NDUxLDYgKzQ0MDIsOCBAQCBpbnQgUmVuZGVyQmxv
Y2s6OmJhc2VsaW5lUG9zaXRpb24oYm9vbCBiCiAgICAgICAgIC8vIFdlIGFsc28gZ2l2ZSB1cCBv
biBmaW5kaW5nIGEgYmFzZWxpbmUgaWYgd2UgaGF2ZSBhIHZlcnRpY2FsIHNjcm9sbGJhciwgb3Ig
aWYgd2UgYXJlIHNjcm9sbGVkCiAgICAgICAgIC8vIHZlcnRpY2FsbHkgKGUuZy4sIGFuIG92ZXJm
bG93OmhpZGRlbiBibG9jayB0aGF0IGhhcyBoYWQgc2Nyb2xsVG9wIG1vdmVkKSBvciBpZiB0aGUg
YmFzZWxpbmUgaXMgb3V0c2lkZQogICAgICAgICAvLyBvZiBvdXIgY29udGVudCBib3guCisgICAg
ICAgIGlmIChpc0Fub255bW91c0lubGluZUJsb2NrKCkpCisgICAgICAgICAgICByZXR1cm4gaGVp
Z2h0KCk7CiAgICAgICAgIGludCBiYXNlbGluZVBvcyA9IChsYXllcigpICYmIChsYXllcigpLT5t
YXJxdWVlKCkgfHwgbGF5ZXIoKS0+dmVydGljYWxTY3JvbGxiYXIoKSB8fCBsYXllcigpLT5zY3Jv
bGxZT2Zmc2V0KCkgIT0gMCkpID8gLTEgOiBsYXN0TGluZUJveEJhc2VsaW5lKCk7CiAgICAgICAg
IGlmIChiYXNlbGluZVBvcyAhPSAtMSAmJiBiYXNlbGluZVBvcyA8PSBib3JkZXJUb3AoKSArIHBh
ZGRpbmdUb3AoKSArIGNvbnRlbnRIZWlnaHQoKSkKICAgICAgICAgICAgIHJldHVybiBtYXJnaW5U
b3AoKSArIGJhc2VsaW5lUG9zOwpAQCAtNDg3NSw2MCArNDgyOCw2IEBAIHZvaWQgUmVuZGVyQmxv
Y2s6OnNldE1heEJvdHRvbU1hcmdpbnMoaW4KICAgICBtX21heE1hcmdpbi0+bV9ib3R0b21OZWcg
PSBuZWc7CiB9CiAKLXZvaWQgUmVuZGVyQmxvY2s6OmFic29sdXRlUmVjdHMoVmVjdG9yPEludFJl
Y3Q+JiByZWN0cywgaW50IHR4LCBpbnQgdHkpCi17Ci0gICAgLy8gRm9yIGJsb2NrcyBpbnNpZGUg
aW5saW5lcywgd2UgZ28gYWhlYWQgYW5kIGluY2x1ZGUgbWFyZ2lucyBzbyB0aGF0IHdlIHJ1biBy
aWdodCB1cCB0byB0aGUKLSAgICAvLyBpbmxpbmUgYm94ZXMgYWJvdmUgYW5kIGJlbG93IHVzICh0
aHVzIGdldHRpbmcgbWVyZ2VkIHdpdGggdGhlbSB0byBmb3JtIGEgc2luZ2xlIGlycmVndWxhcgot
ICAgIC8vIHNoYXBlKS4KLSAgICBpZiAoaW5saW5lQ29udGludWF0aW9uKCkpIHsKLSAgICAgICAg
cmVjdHMuYXBwZW5kKEludFJlY3QodHgsIHR5IC0gY29sbGFwc2VkTWFyZ2luVG9wKCksCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoKCksIGhlaWdodCgpICsgY29sbGFwc2VkTWFy
Z2luVG9wKCkgKyBjb2xsYXBzZWRNYXJnaW5Cb3R0b20oKSkpOwotICAgICAgICBpbmxpbmVDb250
aW51YXRpb24oKS0+YWJzb2x1dGVSZWN0cyhyZWN0cywKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgdHggLSB4KCkgKyBpbmxpbmVDb250aW51YXRpb24oKS0+Y29u
dGFpbmluZ0Jsb2NrKCktPngoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgdHkgLSB5KCkgKyBpbmxpbmVDb250aW51YXRpb24oKS0+Y29udGFpbmluZ0Jsb2Nr
KCktPnkoKSk7Ci0gICAgfSBlbHNlCi0gICAgICAgIHJlY3RzLmFwcGVuZChJbnRSZWN0KHR4LCB0
eSwgd2lkdGgoKSwgaGVpZ2h0KCkpKTsKLX0KLQotdm9pZCBSZW5kZXJCbG9jazo6YWJzb2x1dGVR
dWFkcyhWZWN0b3I8RmxvYXRRdWFkPiYgcXVhZHMpCi17Ci0gICAgLy8gRm9yIGJsb2NrcyBpbnNp
ZGUgaW5saW5lcywgd2UgZ28gYWhlYWQgYW5kIGluY2x1ZGUgbWFyZ2lucyBzbyB0aGF0IHdlIHJ1
biByaWdodCB1cCB0byB0aGUKLSAgICAvLyBpbmxpbmUgYm94ZXMgYWJvdmUgYW5kIGJlbG93IHVz
ICh0aHVzIGdldHRpbmcgbWVyZ2VkIHdpdGggdGhlbSB0byBmb3JtIGEgc2luZ2xlIGlycmVndWxh
cgotICAgIC8vIHNoYXBlKS4KLSAgICBpZiAoaW5saW5lQ29udGludWF0aW9uKCkpIHsKLSAgICAg
ICAgRmxvYXRSZWN0IGxvY2FsUmVjdCgwLCAtY29sbGFwc2VkTWFyZ2luVG9wKCksCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgd2lkdGgoKSwgaGVpZ2h0KCkgKyBjb2xsYXBzZWRNYXJnaW5U
b3AoKSArIGNvbGxhcHNlZE1hcmdpbkJvdHRvbSgpKTsKLSAgICAgICAgcXVhZHMuYXBwZW5kKGxv
Y2FsVG9BYnNvbHV0ZVF1YWQobG9jYWxSZWN0KSk7Ci0gICAgICAgIGlubGluZUNvbnRpbnVhdGlv
bigpLT5hYnNvbHV0ZVF1YWRzKHF1YWRzKTsKLSAgICB9IGVsc2UKLSAgICAgICAgcXVhZHMuYXBw
ZW5kKFJlbmRlckJveDo6bG9jYWxUb0Fic29sdXRlUXVhZChGbG9hdFJlY3QoMCwgMCwgd2lkdGgo
KSwgaGVpZ2h0KCkpKSk7Ci19Ci0KLUludFJlY3QgUmVuZGVyQmxvY2s6OnJlY3RXaXRoT3V0bGlu
ZUZvclJlcGFpbnQoUmVuZGVyQm94TW9kZWxPYmplY3QqIHJlcGFpbnRDb250YWluZXIsIGludCBv
dXRsaW5lV2lkdGgpCi17Ci0gICAgSW50UmVjdCByKFJlbmRlckJveDo6cmVjdFdpdGhPdXRsaW5l
Rm9yUmVwYWludChyZXBhaW50Q29udGFpbmVyLCBvdXRsaW5lV2lkdGgpKTsKLSAgICBpZiAoaW5s
aW5lQ29udGludWF0aW9uKCkpCi0gICAgICAgIHIuaW5mbGF0ZVkoY29sbGFwc2VkTWFyZ2luVG9w
KCkpOwotICAgIHJldHVybiByOwotfQotCi1SZW5kZXJPYmplY3QqIFJlbmRlckJsb2NrOjpob3Zl
ckFuY2VzdG9yKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaW5saW5lQ29udGludWF0aW9uKCkgPyBp
bmxpbmVDb250aW51YXRpb24oKSA6IFJlbmRlckJveDo6aG92ZXJBbmNlc3RvcigpOwotfQotCi12
b2lkIFJlbmRlckJsb2NrOjp1cGRhdGVEcmFnU3RhdGUoYm9vbCBkcmFnT24pCi17Ci0gICAgUmVu
ZGVyQm94Ojp1cGRhdGVEcmFnU3RhdGUoZHJhZ09uKTsKLSAgICBpZiAoaW5saW5lQ29udGludWF0
aW9uKCkpCi0gICAgICAgIGlubGluZUNvbnRpbnVhdGlvbigpLT51cGRhdGVEcmFnU3RhdGUoZHJh
Z09uKTsKLX0KLQotUmVuZGVyU3R5bGUqIFJlbmRlckJsb2NrOjpvdXRsaW5lU3R5bGVGb3JSZXBh
aW50KCkgY29uc3QKLXsKLSAgICByZXR1cm4gaW5saW5lQ29udGludWF0aW9uKCkgPyBpbmxpbmVD
b250aW51YXRpb24oKS0+c3R5bGUoKSA6IHN0eWxlKCk7Ci19Ci0KIHZvaWQgUmVuZGVyQmxvY2s6
OmNoaWxkQmVjYW1lTm9uSW5saW5lKFJlbmRlck9iamVjdCopCiB7CiAgICAgbWFrZUNoaWxkcmVu
Tm9uSW5saW5lKCk7CkBAIC00OTM3LDI2ICs0ODM2LDYgQEAgdm9pZCBSZW5kZXJCbG9jazo6Y2hp
bGRCZWNhbWVOb25JbmxpbmUoUgogICAgIC8vIHx0aGlzfCBtYXkgYmUgZGVhZCBoZXJlCiB9CiAK
LXZvaWQgUmVuZGVyQmxvY2s6OnVwZGF0ZUhpdFRlc3RSZXN1bHQoSGl0VGVzdFJlc3VsdCYgcmVz
dWx0LCBjb25zdCBJbnRQb2ludCYgcG9pbnQpCi17Ci0gICAgaWYgKHJlc3VsdC5pbm5lck5vZGUo
KSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgTm9kZSogbiA9IG5vZGUoKTsKLSAgICBpZiAoaW5s
aW5lQ29udGludWF0aW9uKCkpCi0gICAgICAgIC8vIFdlIGFyZSBpbiB0aGUgbWFyZ2lucyBvZiBi
bG9jayBlbGVtZW50cyB0aGF0IGFyZSBwYXJ0IG9mIGEgY29udGludWF0aW9uLiAgSW4KLSAgICAg
ICAgLy8gdGhpcyBjYXNlIHdlJ3JlIGFjdHVhbGx5IHN0aWxsIGluc2lkZSB0aGUgZW5jbG9zaW5n
IGlubGluZSBlbGVtZW50IHRoYXQgd2FzCi0gICAgICAgIC8vIHNwbGl0LiAgR28gYWhlYWQgYW5k
IHNldCBvdXIgaW5uZXIgbm9kZSBhY2NvcmRpbmdseS4KLSAgICAgICAgbiA9IGlubGluZUNvbnRp
bnVhdGlvbigpLT5ub2RlKCk7Ci0KLSAgICBpZiAobikgewotICAgICAgICByZXN1bHQuc2V0SW5u
ZXJOb2RlKG4pOwotICAgICAgICBpZiAoIXJlc3VsdC5pbm5lck5vblNoYXJlZE5vZGUoKSkKLSAg
ICAgICAgICAgIHJlc3VsdC5zZXRJbm5lck5vblNoYXJlZE5vZGUobik7Ci0gICAgICAgIHJlc3Vs
dC5zZXRMb2NhbFBvaW50KHBvaW50KTsKLSAgICB9Ci19Ci0KIEludFJlY3QgUmVuZGVyQmxvY2s6
OmxvY2FsQ2FyZXRSZWN0KElubGluZUJveCogaW5saW5lQm94LCBpbnQgY2FyZXRPZmZzZXQsIGlu
dCogZXh0cmFXaWR0aFRvRW5kT2ZMaW5lKQogewogICAgIC8vIERvIHRoZSBub3JtYWwgY2FsY3Vs
YXRpb24gaW4gbW9zdCBjYXNlcy4KQEAgLTUwMzcsMjAgKzQ5MTYsNyBAQCBJbnRSZWN0IFJlbmRl
ckJsb2NrOjpsb2NhbENhcmV0UmVjdChJbmxpCiAKIHZvaWQgUmVuZGVyQmxvY2s6OmFkZEZvY3Vz
UmluZ1JlY3RzKFZlY3RvcjxJbnRSZWN0PiYgcmVjdHMsIGludCB0eCwgaW50IHR5KQogewotICAg
IC8vIEZvciBibG9ja3MgaW5zaWRlIGlubGluZXMsIHdlIGdvIGFoZWFkIGFuZCBpbmNsdWRlIG1h
cmdpbnMgc28gdGhhdCB3ZSBydW4gcmlnaHQgdXAgdG8gdGhlCi0gICAgLy8gaW5saW5lIGJveGVz
IGFib3ZlIGFuZCBiZWxvdyB1cyAodGh1cyBnZXR0aW5nIG1lcmdlZCB3aXRoIHRoZW0gdG8gZm9y
bSBhIHNpbmdsZSBpcnJlZ3VsYXIKLSAgICAvLyBzaGFwZSkuCi0gICAgaWYgKGlubGluZUNvbnRp
bnVhdGlvbigpKSB7Ci0gICAgICAgIC8vIEZJWE1FOiBUaGlzIGNoZWNrIHJlYWxseSBpc24ndCBh
Y2N1cmF0ZS4gCi0gICAgICAgIGJvb2wgbmV4dElubGluZUhhc0xpbmVCb3ggPSBpbmxpbmVDb250
aW51YXRpb24oKS0+Zmlyc3RMaW5lQm94KCk7Ci0gICAgICAgIC8vIEZJWE1FOiBUaGlzIGlzIHdy
b25nLiBUaGUgcHJpbmNpcGFsIHJlbmRlcmVyIG1heSBub3QgYmUgdGhlIGNvbnRpbnVhdGlvbiBw
cmVjZWRpbmcgdGhpcyBibG9jay4KLSAgICAgICAgYm9vbCBwcmV2SW5saW5lSGFzTGluZUJveCA9
IHRvUmVuZGVySW5saW5lKGlubGluZUNvbnRpbnVhdGlvbigpLT5ub2RlKCktPnJlbmRlcmVyKCkp
LT5maXJzdExpbmVCb3goKTsgCi0gICAgICAgIGludCB0b3BNYXJnaW4gPSBwcmV2SW5saW5lSGFz
TGluZUJveCA/IGNvbGxhcHNlZE1hcmdpblRvcCgpIDogMDsKLSAgICAgICAgaW50IGJvdHRvbU1h
cmdpbiA9IG5leHRJbmxpbmVIYXNMaW5lQm94ID8gY29sbGFwc2VkTWFyZ2luQm90dG9tKCkgOiAw
OwotICAgICAgICBJbnRSZWN0IHJlY3QodHgsIHR5IC0gdG9wTWFyZ2luLCB3aWR0aCgpLCBoZWln
aHQoKSArIHRvcE1hcmdpbiArIGJvdHRvbU1hcmdpbik7Ci0gICAgICAgIGlmICghcmVjdC5pc0Vt
cHR5KCkpCi0gICAgICAgICAgICByZWN0cy5hcHBlbmQocmVjdCk7Ci0gICAgfSBlbHNlIGlmICh3
aWR0aCgpICYmIGhlaWdodCgpKQorICAgIGlmICh3aWR0aCgpIHx8IGhlaWdodCgpKQogICAgICAg
ICByZWN0cy5hcHBlbmQoSW50UmVjdCh0eCwgdHksIHdpZHRoKCksIGhlaWdodCgpKSk7CiAKICAg
ICBpZiAoIWhhc092ZXJmbG93Q2xpcCgpICYmICFoYXNDb250cm9sQ2xpcCgpKSB7CkBAIC01MDc1
LDExICs0OTQxLDYgQEAgdm9pZCBSZW5kZXJCbG9jazo6YWRkRm9jdXNSaW5nUmVjdHMoVmVjdAog
ICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotCi0gICAgaWYgKGlubGluZUNvbnRpbnVh
dGlvbigpKQotICAgICAgICBpbmxpbmVDb250aW51YXRpb24oKS0+YWRkRm9jdXNSaW5nUmVjdHMo
cmVjdHMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
dHggLSB4KCkgKyBpbmxpbmVDb250aW51YXRpb24oKS0+Y29udGFpbmluZ0Jsb2NrKCktPngoKSwK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5IC0geSgp
ICsgaW5saW5lQ29udGludWF0aW9uKCktPmNvbnRhaW5pbmdCbG9jaygpLT55KCkpOwogfQogCiBS
ZW5kZXJCbG9jayogUmVuZGVyQmxvY2s6OmNyZWF0ZUFub255bW91c0Jsb2NrKGJvb2wgaXNGbGV4
aWJsZUJveCkgY29uc3QKQEAgLTUxMTEsNiArNDk3Miw4IEBAIGNvbnN0IGNoYXIqIFJlbmRlckJs
b2NrOjpyZW5kZXJOYW1lKCkgY28KICAgICAgICAgcmV0dXJuICJSZW5kZXJCbG9jayAocG9zaXRp
b25lZCkiOwogICAgIGlmIChpc0Fub255bW91c0Jsb2NrKCkpCiAgICAgICAgIHJldHVybiAiUmVu
ZGVyQmxvY2sgKGFub255bW91cykiOworICAgIGVsc2UgaWYgKGlzQW5vbnltb3VzSW5saW5lQmxv
Y2soKSkKKyAgICAgICAgcmV0dXJuICJSZW5kZXJCbG9jayAoYW5vbnltb3VzIGlubGluZS1ibG9j
aykiOwogICAgIGVsc2UgaWYgKGlzQW5vbnltb3VzKCkpCiAgICAgICAgIHJldHVybiAiUmVuZGVy
QmxvY2sgKGdlbmVyYXRlZCkiOwogICAgIGlmIChpc1JlbFBvc2l0aW9uZWQoKSkKSW5kZXg6IFdl
YkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5k
ZXJpbmcvUmVuZGVyQmxvY2suaAkocmV2aXNpb24gNTQ1MDEpCisrKyBXZWJDb3JlL3JlbmRlcmlu
Zy9SZW5kZXJCbG9jay5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMjksMTUgKzEyOSwxOCBAQCBwdWJs
aWM6CiAKICAgICB2b2lkIGFkanVzdFJlY3RGb3JDb2x1bW5zKEludFJlY3QmKSBjb25zdDsKIAot
ICAgIHZvaWQgYWRkQ29udGludWF0aW9uV2l0aE91dGxpbmUoUmVuZGVySW5saW5lKik7Ci0KLSAg
ICBSZW5kZXJJbmxpbmUqIGlubGluZUNvbnRpbnVhdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1faW5s
aW5lQ29udGludWF0aW9uOyB9Ci0gICAgdm9pZCBzZXRJbmxpbmVDb250aW51YXRpb24oUmVuZGVy
SW5saW5lKiBjKSB7IG1faW5saW5lQ29udGludWF0aW9uID0gYzsgfQotCiAgICAgLy8gVGhpcyBm
dW5jdGlvbiBpcyBhIGNvbnZlbmllbmNlIGhlbHBlciBmb3IgY3JlYXRpbmcgYW4gYW5vbnltb3Vz
IGJsb2NrIHRoYXQgaW5oZXJpdHMgaXRzCiAgICAgLy8gc3R5bGUgZnJvbSB0aGlzIFJlbmRlckJs
b2NrLgogICAgIFJlbmRlckJsb2NrKiBjcmVhdGVBbm9ueW1vdXNCbG9jayhib29sIGlzRmxleGli
bGVCb3ggPSBmYWxzZSkgY29uc3Q7CiAKKyAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoUGFpbnRJbmZv
JiwgaW50IHR4LCBpbnQgdHkpOworICAgIHZpcnR1YWwgdm9pZCBwYWludE9iamVjdChQYWludElu
Zm8mLCBpbnQgdHgsIGludCB0eSk7CisKKyAgICBib29sIGluUm9vdEJsb2NrQ29udGV4dCgpIGNv
bnN0OworCisgICAgc3RhdGljIHZvaWQgYXBwZW5kUnVuc0Zvck9iamVjdChpbnQgc3RhcnQsIGlu
dCBlbmQsIFJlbmRlck9iamVjdCosIElubGluZUJpZGlSZXNvbHZlciYpOyAgICAKKyAgICBzdGF0
aWMgYm9vbCByZXF1aXJlc0xpbmVCb3goY29uc3QgSW5saW5lSXRlcmF0b3ImLCBib29sIGlzTGlu
ZUVtcHR5ID0gdHJ1ZSwgYm9vbCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHkgPSB0cnVlKTsKKwog
cHJvdGVjdGVkOgogICAgIHZvaWQgbW92ZUNoaWxkVG8oUmVuZGVyT2JqZWN0KiB0bywgUmVuZGVy
T2JqZWN0Q2hpbGRMaXN0KiB0b0NoaWxkTGlzdCwgUmVuZGVyT2JqZWN0KiBjaGlsZCk7CiAgICAg
dm9pZCBtb3ZlQ2hpbGRUbyhSZW5kZXJPYmplY3QqIHRvLCBSZW5kZXJPYmplY3RDaGlsZExpc3Qq
IHRvQ2hpbGRMaXN0LCBSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkLCBSZW5kZXJPYmplY3QqIGNo
aWxkKTsKQEAgLTE2NSw5ICsxNjgsNiBAQCBwcm90ZWN0ZWQ6CiAKICAgICB2b2lkIGxheW91dFBv
c2l0aW9uZWRPYmplY3RzKGJvb2wgcmVsYXlvdXRDaGlsZHJlbik7CiAKLSAgICB2aXJ0dWFsIHZv
aWQgcGFpbnQoUGFpbnRJbmZvJiwgaW50IHR4LCBpbnQgdHkpOwotICAgIHZpcnR1YWwgdm9pZCBw
YWludE9iamVjdChQYWludEluZm8mLCBpbnQgdHgsIGludCB0eSk7Ci0KICAgICBpbnQgcmlnaHRS
ZWxPZmZzZXQoaW50IHksIGludCBmaXhlZE9mZnNldCwgYm9vbCBhcHBseVRleHRJbmRlbnQgPSB0
cnVlLCBpbnQqIGhlaWdodFJlbWFpbmluZyA9IDApIGNvbnN0OwogICAgIGludCBsZWZ0UmVsT2Zm
c2V0KGludCB5LCBpbnQgZml4ZWRPZmZzZXQsIGJvb2wgYXBwbHlUZXh0SW5kZW50ID0gdHJ1ZSwg
aW50KiBoZWlnaHRSZW1haW5pbmcgPSAwKSBjb25zdDsKIApAQCAtMTgwLDggKzE4MCw2IEBAIHBy
b3RlY3RlZDoKIAogICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVGaXJzdExldHRlcigpOwogCi0gICAg
dmlydHVhbCB2b2lkIHVwZGF0ZUhpdFRlc3RSZXN1bHQoSGl0VGVzdFJlc3VsdCYsIGNvbnN0IElu
dFBvaW50Jik7Ci0KICAgICAvLyBEZWxheSB1cGRhdGUgc2Nyb2xsYmFyIHVudGlsIGZpbmlzaERl
bGF5UmVwYWludCgpIHdpbGwgYmUKICAgICAvLyBjYWxsZWQuIFRoaXMgZnVuY3Rpb24gaXMgdXNl
ZCB3aGVuIGEgZmxleGJveCBpcyBsYXlpbmcgb3V0IGl0cwogICAgIC8vIGRlc2NlbmRhbnQuIElm
IG11bHRpcGxlIGNhbGxzIGFyZSBtYWRlIHRvIHN0YXJ0RGVsYXlSZXBhaW50KCksCkBAIC0yNDUs
NyArMjQzLDkgQEAgcHJpdmF0ZToKICAgICAgICAgYm9vbCBldmVySGFkTGF5b3V0OwogICAgIH07
CiAKLSAgICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucycgaW1wbGVtZW50YXRpb25zIGFyZSBp
biBSZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwLgorICAgIGNsYXNzIE1hcmdpbkluZm87CisKKyAg
ICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucycgaW1wbGVtZW50YXRpb25zIGFyZSBpbiBSZW5k
ZXJCbG9ja0xpbmVMYXlvdXQuY3BwLiAgICAKICAgICB2b2lkIGJpZGlSZW9yZGVyTGluZShJbmxp
bmVCaWRpUmVzb2x2ZXImLCBjb25zdCBJbmxpbmVJdGVyYXRvciYgZW5kLCBib29sIHByZXZpb3Vz
TGluZUJyb2tlQ2xlYW5seSk7CiAgICAgUm9vdElubGluZUJveCogZGV0ZXJtaW5lU3RhcnRQb3Np
dGlvbihib29sJiBmaXJzdExpbmUsIGJvb2wmIGZ1bGxMYXlvdXQsIGJvb2wmIHByZXZpb3VzTGlu
ZUJyb2tlQ2xlYW5seSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IElubGluZUJpZGlSZXNvbHZlciYsIFZlY3RvcjxGbG9hdFdpdGhSZWN0PiYgZmxvYXRzLCB1bnNp
Z25lZCYgbnVtQ2xlYW5GbG9hdHMpOwpAQCAtMjU4LDcgKzI1OCw3IEBAIHByaXZhdGU6CiAgICAg
dm9pZCBza2lwVHJhaWxpbmdXaGl0ZXNwYWNlKElubGluZUl0ZXJhdG9yJiwgYm9vbCBpc0xpbmVF
bXB0eSwgYm9vbCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHkpOwogICAgIGludCBza2lwTGVhZGlu
Z1doaXRlc3BhY2UoSW5saW5lQmlkaVJlc29sdmVyJiwgYm9vbCBmaXJzdExpbmUsIGJvb2wgaXNM
aW5lRW1wdHksIGJvb2wgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KTsKICAgICB2b2lkIGZpdEJl
bG93RmxvYXRzKGludCB3aWR0aFRvRml0LCBib29sIGZpcnN0TGluZSwgaW50JiBhdmFpbGFibGVX
aWR0aCk7Ci0gICAgSW5saW5lSXRlcmF0b3IgZmluZE5leHRMaW5lQnJlYWsoSW5saW5lQmlkaVJl
c29sdmVyJiwgYm9vbCBmaXJzdExpbmUsIGJvb2wmIGlzTGluZUVtcHR5LCBib29sJiBwcmV2aW91
c0xpbmVCcm9rZUNsZWFubHksIEVDbGVhciogY2xlYXIgPSAwKTsKKyAgICBJbmxpbmVJdGVyYXRv
ciBmaW5kTmV4dExpbmVCcmVhayhJbmxpbmVCaWRpUmVzb2x2ZXImLCBib29sIGZpcnN0TGluZSwg
Ym9vbCYgaXNMaW5lRW1wdHksIGJvb2wmIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSwgTWFyZ2lu
SW5mbyYsIEVDbGVhciogY2xlYXIgPSAwKTsKICAgICBSb290SW5saW5lQm94KiBjb25zdHJ1Y3RM
aW5lKHVuc2lnbmVkIHJ1bkNvdW50LCBCaWRpUnVuKiBmaXJzdFJ1biwgQmlkaVJ1biogbGFzdFJ1
biwgYm9vbCBmaXJzdExpbmUsIGJvb2wgbGFzdExpbmUsIFJlbmRlck9iamVjdCogZW5kT2JqZWN0
KTsKICAgICBJbmxpbmVGbG93Qm94KiBjcmVhdGVMaW5lQm94ZXMoUmVuZGVyT2JqZWN0KiwgYm9v
bCBmaXJzdExpbmUpOwogICAgIHZvaWQgY29tcHV0ZUhvcml6b250YWxQb3NpdGlvbnNGb3JMaW5l
KFJvb3RJbmxpbmVCb3gqLCBib29sIGZpcnN0TGluZSwgQmlkaVJ1biogZmlyc3RSdW4sIEJpZGlS
dW4qIHRyYWlsaW5nU3BhY2VSdW4sIGJvb2wgcmVhY2hlZEVuZCk7CkBAIC0zMTMsMTMgKzMxMyw3
IEBAIHByaXZhdGU6CiAgICAgLy8gT2J0YWlucyB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgYmxvY2sg
KGluY2x1ZGluZyB0aGlzIGJsb2NrKSB0aGF0IGNvbnRyaWJ1dGVzIGEgZmlyc3QtbGluZSBzdHls
ZSB0byBvdXIgaW5saW5lCiAgICAgLy8gY2hpbGRyZW4uCiAgICAgdmlydHVhbCBSZW5kZXJCbG9j
ayogZmlyc3RMaW5lQmxvY2soKSBjb25zdDsKLSAgICBib29sIGluUm9vdEJsb2NrQ29udGV4dCgp
IGNvbnN0OwotCi0gICAgdmlydHVhbCBJbnRSZWN0IHJlY3RXaXRoT3V0bGluZUZvclJlcGFpbnQo
UmVuZGVyQm94TW9kZWxPYmplY3QqIHJlcGFpbnRDb250YWluZXIsIGludCBvdXRsaW5lV2lkdGgp
OwotICAgIHZpcnR1YWwgUmVuZGVyU3R5bGUqIG91dGxpbmVTdHlsZUZvclJlcGFpbnQoKSBjb25z
dDsKICAgICAKLSAgICB2aXJ0dWFsIFJlbmRlck9iamVjdCogaG92ZXJBbmNlc3RvcigpIGNvbnN0
OwotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVEcmFnU3RhdGUoYm9vbCBkcmFnT24pOwogICAgIHZp
cnR1YWwgdm9pZCBjaGlsZEJlY2FtZU5vbklubGluZShSZW5kZXJPYmplY3QqIGNoaWxkKTsKIAog
ICAgIHZpcnR1YWwgSW50UmVjdCBzZWxlY3Rpb25SZWN0Rm9yUmVwYWludChSZW5kZXJCb3hNb2Rl
bE9iamVjdCogcmVwYWludENvbnRhaW5lciwgYm9vbCAvKmNsaXBUb1Zpc2libGVDb250ZW50Ki8p
CkBAIC0zMzksMTYgKzMzMywxMSBAQCBwcml2YXRlOgogICAgIGludCBsZWZ0U2VsZWN0aW9uT2Zm
c2V0KFJlbmRlckJsb2NrKiByb290QmxvY2ssIGludCB5KTsKICAgICBpbnQgcmlnaHRTZWxlY3Rp
b25PZmZzZXQoUmVuZGVyQmxvY2sqIHJvb3RCbG9jaywgaW50IHkpOwogCi0gICAgdmlydHVhbCB2
b2lkIGFic29sdXRlUmVjdHMoVmVjdG9yPEludFJlY3Q+JiwgaW50IHR4LCBpbnQgdHkpOwotICAg
IHZpcnR1YWwgdm9pZCBhYnNvbHV0ZVF1YWRzKFZlY3RvcjxGbG9hdFF1YWQ+Jik7Ci0KICAgICBp
bnQgZGVzaXJlZENvbHVtbldpZHRoKCkgY29uc3Q7CiAgICAgdW5zaWduZWQgZGVzaXJlZENvbHVt
bkNvdW50KCkgY29uc3Q7CiAgICAgVmVjdG9yPEludFJlY3Q+KiBjb2x1bW5SZWN0cygpIGNvbnN0
OwogICAgIHZvaWQgc2V0RGVzaXJlZENvbHVtbkNvdW50QW5kV2lkdGgoaW50IGNvdW50LCBpbnQg
d2lkdGgpOwogICAgIGludCBjb2x1bW5HYXAoKSBjb25zdDsKLSAgICAKLSAgICB2b2lkIHBhaW50
Q29udGludWF0aW9uT3V0bGluZXMoUGFpbnRJbmZvJiwgaW50IHR4LCBpbnQgdHkpOwogCiAgICAg
dmlydHVhbCBJbnRSZWN0IGxvY2FsQ2FyZXRSZWN0KElubGluZUJveCosIGludCBjYXJldE9mZnNl
dCwgaW50KiBleHRyYVdpZHRoVG9FbmRPZkxpbmUgPSAwKTsKIApAQCAtNDg0LDEyICs0NzMsNiBA
QCBwcml2YXRlOgogICAgIERlcHJlY2F0ZWRQdHJMaXN0PEZsb2F0aW5nT2JqZWN0PiogbV9mbG9h
dGluZ09iamVjdHM7CiAgICAgTGlzdEhhc2hTZXQ8UmVuZGVyQm94Kj4qIG1fcG9zaXRpb25lZE9i
amVjdHM7CiAKLSAgICAvLyBBbiBpbmxpbmUgY2FuIGJlIHNwbGl0IHdpdGggYmxvY2tzIG9jY3Vy
cmluZyBpbiBiZXR3ZWVuIHRoZSBpbmxpbmUgY29udGVudC4KLSAgICAvLyBXaGVuIHRoaXMgb2Nj
dXJzIHdlIG5lZWQgYSBwb2ludGVyIHRvIG91ciBuZXh0IG9iamVjdC4gIFdlIGNhbiBiYXNpY2Fs
bHkgYmUKLSAgICAvLyBzcGxpdCBpbnRvIGEgc2VxdWVuY2Ugb2YgaW5saW5lcyBhbmQgYmxvY2tz
LiAgVGhlIGNvbnRpbnVhdGlvbiB3aWxsIGVpdGhlciBiZQotICAgIC8vIGFuIGFub255bW91cyBi
bG9jayAodGhhdCBob3VzZXMgb3RoZXIgYmxvY2tzKSBvciBpdCB3aWxsIGJlIGFuIGlubGluZSBm
bG93LgotICAgIFJlbmRlcklubGluZSogbV9pbmxpbmVDb250aW51YXRpb247Ci0KICAgICAvLyBB
bGxvY2F0ZWQgb25seSB3aGVuIHNvbWUgb2YgdGhlc2UgZmllbGRzIGhhdmUgbm9uLWRlZmF1bHQg
dmFsdWVzCiAgICAgc3RydWN0IE1heE1hcmdpbiA6IE5vbmNvcHlhYmxlIHsKICAgICAgICAgTWF4
TWFyZ2luKGNvbnN0IFJlbmRlckJsb2NrKiBvKSAKQEAgLTUxNyw3ICs1MDAsNyBAQCBwcml2YXRl
OgogICAgIFJlbmRlckxpbmVCb3hMaXN0IG1fbGluZUJveGVzOyAgIC8vIEFsbCBvZiB0aGUgcm9v
dCBsaW5lIGJveGVzIGNyZWF0ZWQgZm9yIHRoaXMgYmxvY2sgZmxvdy4gIEZvciBleGFtcGxlLCA8
ZGl2PkhlbGxvPGJyPndvcmxkLjwvZGl2PiB3aWxsIGhhdmUgdHdvIHRvdGFsIGxpbmVzIGZvciB0
aGUgPGRpdj4uCiAKICAgICBtdXRhYmxlIGludCBtX2xpbmVIZWlnaHQ7Ci0gICAgCisKICAgICAv
LyBSZW5kZXJSdWJ5QmFzZSBvYmplY3RzIG5lZWQgdG8gYmUgYWJsZSB0byBzcGxpdCBhbmQgbWVy
Z2UsIG1vdmluZyB0aGVpciBjaGlsZHJlbiBhcm91bmQKICAgICAvLyAoY2FsbGluZyBtb3ZlQ2hp
bGRUbywgbW92ZUFsbENoaWxkcmVuVG8sIGFuZCBtYWtlQ2hpbGRyZW5Ob25JbmxpbmUpLgogICAg
IGZyaWVuZCBjbGFzcyBSZW5kZXJSdWJ5QmFzZTsKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1Jl
bmRlckJsb2NrTGluZUxheW91dC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcv
UmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcAkocmV2aXNpb24gNTQ1MDEpCisrKyBXZWJDb3JlL3Jl
bmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNCw2
ICsyNCw3IEBACiAKICNpbmNsdWRlICJCaWRpUmVzb2x2ZXIuaCIKICNpbmNsdWRlICJDaGFyYWN0
ZXJOYW1lcy5oIgorI2luY2x1ZGUgIklubGluZUl0ZXJhdG9yLmgiCiAjaW5jbHVkZSAiSW5saW5l
VGV4dEJveC5oIgogI2luY2x1ZGUgIkxvZ2dpbmcuaCIKICNpbmNsdWRlICJSZW5kZXJBcmVuYS5o
IgpAQCAtNDYsMzYgKzQ3LDYgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogLy8gV2UgZG9uJ3QgbGV0
IG91ciBsaW5lIGJveCB0cmVlIGZvciBhIHNpbmdsZSBsaW5lIGdldCBhbnkgZGVlcGVyIHRoYW4g
dGhpcy4KIGNvbnN0IHVuc2lnbmVkIGNNYXhMaW5lRGVwdGggPSAyMDA7CiAKLWNsYXNzIElubGlu
ZUl0ZXJhdG9yIHsKLXB1YmxpYzoKLSAgICBJbmxpbmVJdGVyYXRvcigpCi0gICAgICAgIDogYmxv
Y2soMCkKLSAgICAgICAgLCBvYmooMCkKLSAgICAgICAgLCBwb3MoMCkKLSAgICAgICAgLCBuZXh0
QnJlYWthYmxlUG9zaXRpb24oLTEpCi0gICAgewotICAgIH0KLQotICAgIElubGluZUl0ZXJhdG9y
KFJlbmRlckJsb2NrKiBiLCBSZW5kZXJPYmplY3QqIG8sIHVuc2lnbmVkIHApCi0gICAgICAgIDog
YmxvY2soYikKLSAgICAgICAgLCBvYmoobykKLSAgICAgICAgLCBwb3MocCkKLSAgICAgICAgLCBu
ZXh0QnJlYWthYmxlUG9zaXRpb24oLTEpCi0gICAgewotICAgIH0KLQotICAgIHZvaWQgaW5jcmVt
ZW50KElubGluZUJpZGlSZXNvbHZlciogcmVzb2x2ZXIgPSAwKTsKLSAgICBib29sIGF0RW5kKCkg
Y29uc3Q7Ci0KLSAgICBVQ2hhciBjdXJyZW50KCkgY29uc3Q7Ci0gICAgRGlyZWN0aW9uIGRpcmVj
dGlvbigpIGNvbnN0OwotCi0gICAgUmVuZGVyQmxvY2sqIGJsb2NrOwotICAgIFJlbmRlck9iamVj
dCogb2JqOwotICAgIHVuc2lnbmVkIHBvczsKLSAgICBpbnQgbmV4dEJyZWFrYWJsZVBvc2l0aW9u
OwotfTsKLQogc3RhdGljIGludCBnZXRCb3JkZXJQYWRkaW5nTWFyZ2luKFJlbmRlckJveE1vZGVs
T2JqZWN0KiBjaGlsZCwgYm9vbCBlbmRPZklubGluZSkKIHsKICAgICBib29sIGxlZnRTaWRlID0g
KGNoaWxkLT5zdHlsZSgpLT5kaXJlY3Rpb24oKSA9PSBMVFIpID8gIWVuZE9mSW5saW5lIDogZW5k
T2ZJbmxpbmU7CkBAIC0xMDAsMjQ3ICs3MSw2IEBAIHN0YXRpYyBpbnQgaW5saW5lV2lkdGgoUmVu
ZGVyT2JqZWN0KiBjaGkKICAgICByZXR1cm4gZXh0cmFXaWR0aDsKIH0KIAotc3RydWN0IEJpZGlS
dW4gOiBCaWRpQ2hhcmFjdGVyUnVuIHsKLSAgICBCaWRpUnVuKGludCBzdGFydCwgaW50IHN0b3As
IFJlbmRlck9iamVjdCogb2JqZWN0LCBCaWRpQ29udGV4dCogY29udGV4dCwgRGlyZWN0aW9uIGRp
cikKLSAgICAgICAgOiBCaWRpQ2hhcmFjdGVyUnVuKHN0YXJ0LCBzdG9wLCBjb250ZXh0LCBkaXIp
Ci0gICAgICAgICwgbV9vYmplY3Qob2JqZWN0KQotICAgICAgICAsIG1fYm94KDApCi0gICAgewot
ICAgIH0KLQotICAgIHZvaWQgZGVzdHJveSgpOwotCi0gICAgLy8gT3ZlcmxvYWRlZCBuZXcgb3Bl
cmF0b3IuCi0gICAgdm9pZCogb3BlcmF0b3IgbmV3KHNpemVfdCwgUmVuZGVyQXJlbmEqKSB0aHJv
dygpOwotCi0gICAgLy8gT3ZlcnJpZGRlbiB0byBwcmV2ZW50IHRoZSBub3JtYWwgZGVsZXRlIGZy
b20gYmVpbmcgY2FsbGVkLgotICAgIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQqLCBzaXplX3Qp
OwotCi0gICAgQmlkaVJ1biogbmV4dCgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PEJpZGlSdW4qPiht
X25leHQpOyB9Ci0KLXByaXZhdGU6Ci0gICAgLy8gVGhlIG5vcm1hbCBvcGVyYXRvciBuZXcgaXMg
ZGlzYWxsb3dlZC4KLSAgICB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90KSB0aHJvdygpOwotCi1w
dWJsaWM6Ci0gICAgUmVuZGVyT2JqZWN0KiBtX29iamVjdDsKLSAgICBJbmxpbmVCb3gqIG1fYm94
OwotfTsKLQotI2lmbmRlZiBOREVCVUcKLXN0YXRpYyBSZWZDb3VudGVkTGVha0NvdW50ZXIgYmlk
aVJ1bkNvdW50ZXIoIkJpZGlSdW4iKTsKLQotc3RhdGljIGJvb2wgaW5CaWRpUnVuRGVzdHJveTsK
LSNlbmRpZgotCi12b2lkIEJpZGlSdW46OmRlc3Ryb3koKQotewotI2lmbmRlZiBOREVCVUcKLSAg
ICBpbkJpZGlSdW5EZXN0cm95ID0gdHJ1ZTsKLSNlbmRpZgotICAgIFJlbmRlckFyZW5hKiByZW5k
ZXJBcmVuYSA9IG1fb2JqZWN0LT5yZW5kZXJBcmVuYSgpOwotICAgIGRlbGV0ZSB0aGlzOwotI2lm
bmRlZiBOREVCVUcKLSAgICBpbkJpZGlSdW5EZXN0cm95ID0gZmFsc2U7Ci0jZW5kaWYKLQotICAg
IC8vIFJlY292ZXIgdGhlIHNpemUgbGVmdCB0aGVyZSBmb3IgdXMgYnkgb3BlcmF0b3IgZGVsZXRl
IGFuZCBmcmVlIHRoZSBtZW1vcnkuCi0gICAgcmVuZGVyQXJlbmEtPmZyZWUoKnJlaW50ZXJwcmV0
X2Nhc3Q8c2l6ZV90Kj4odGhpcyksIHRoaXMpOwotfQotCi12b2lkKiBCaWRpUnVuOjpvcGVyYXRv
ciBuZXcoc2l6ZV90IHN6LCBSZW5kZXJBcmVuYSogcmVuZGVyQXJlbmEpIHRocm93KCkKLXsKLSNp
Zm5kZWYgTkRFQlVHCi0gICAgYmlkaVJ1bkNvdW50ZXIuaW5jcmVtZW50KCk7Ci0jZW5kaWYKLSAg
ICByZXR1cm4gcmVuZGVyQXJlbmEtPmFsbG9jYXRlKHN6KTsKLX0KLQotdm9pZCBCaWRpUnVuOjpv
cGVyYXRvciBkZWxldGUodm9pZCogcHRyLCBzaXplX3Qgc3opCi17Ci0jaWZuZGVmIE5ERUJVRwot
ICAgIGJpZGlSdW5Db3VudGVyLmRlY3JlbWVudCgpOwotI2VuZGlmCi0gICAgQVNTRVJUKGluQmlk
aVJ1bkRlc3Ryb3kpOwotCi0gICAgLy8gU3Rhc2ggc2l6ZSB3aGVyZSBkZXN0cm95KCkgY2FuIGZp
bmQgaXQuCi0gICAgKihzaXplX3QqKXB0ciA9IHN6OwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQot
aW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJbmxpbmVJdGVyYXRvciYgaXQxLCBjb25zdCBJ
bmxpbmVJdGVyYXRvciYgaXQyKQotewotICAgIHJldHVybiBpdDEucG9zID09IGl0Mi5wb3MgJiYg
aXQxLm9iaiA9PSBpdDIub2JqOwotfQotCi1pbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IElu
bGluZUl0ZXJhdG9yJiBpdDEsIGNvbnN0IElubGluZUl0ZXJhdG9yJiBpdDIpCi17Ci0gICAgcmV0
dXJuIGl0MS5wb3MgIT0gaXQyLnBvcyB8fCBpdDEub2JqICE9IGl0Mi5vYmo7Ci19Ci0KLXN0YXRp
YyBpbmxpbmUgUmVuZGVyT2JqZWN0KiBiaWRpTmV4dChSZW5kZXJCbG9jayogYmxvY2ssIFJlbmRl
ck9iamVjdCogY3VycmVudCwgSW5saW5lQmlkaVJlc29sdmVyKiByZXNvbHZlciA9IDAsIGJvb2wg
c2tpcElubGluZXMgPSB0cnVlLCBib29sKiBlbmRPZklubGluZVB0ciA9IDApCi17Ci0gICAgUmVu
ZGVyT2JqZWN0KiBuZXh0ID0gMDsKLSAgICBib29sIG9sZEVuZE9mSW5saW5lID0gZW5kT2ZJbmxp
bmVQdHIgPyAqZW5kT2ZJbmxpbmVQdHIgOiBmYWxzZTsKLSAgICBib29sIGVuZE9mSW5saW5lID0g
ZmFsc2U7Ci0KLSAgICB3aGlsZSAoY3VycmVudCkgewotICAgICAgICBuZXh0ID0gMDsKLSAgICAg
ICAgaWYgKCFvbGRFbmRPZklubGluZSAmJiAhY3VycmVudC0+aXNGbG9hdGluZygpICYmICFjdXJy
ZW50LT5pc1JlcGxhY2VkKCkgJiYgIWN1cnJlbnQtPmlzUG9zaXRpb25lZCgpICYmICFjdXJyZW50
LT5pc1RleHQoKSkgewotICAgICAgICAgICAgbmV4dCA9IGN1cnJlbnQtPmZpcnN0Q2hpbGQoKTsK
LSAgICAgICAgICAgIGlmIChuZXh0ICYmIHJlc29sdmVyICYmIG5leHQtPmlzUmVuZGVySW5saW5l
KCkpIHsKLSAgICAgICAgICAgICAgICBFVW5pY29kZUJpZGkgdWIgPSBuZXh0LT5zdHlsZSgpLT51
bmljb2RlQmlkaSgpOwotICAgICAgICAgICAgICAgIGlmICh1YiAhPSBVQk5vcm1hbCkgewotICAg
ICAgICAgICAgICAgICAgICBUZXh0RGlyZWN0aW9uIGRpciA9IG5leHQtPnN0eWxlKCktPmRpcmVj
dGlvbigpOwotICAgICAgICAgICAgICAgICAgICBEaXJlY3Rpb24gZCA9ICh1YiA9PSBFbWJlZAot
ICAgICAgICAgICAgICAgICAgICAgICAgPyAoZGlyID09IFJUTCA/IFJpZ2h0VG9MZWZ0RW1iZWRk
aW5nIDogTGVmdFRvUmlnaHRFbWJlZGRpbmcpCi0gICAgICAgICAgICAgICAgICAgICAgICA6IChk
aXIgPT0gUlRMID8gUmlnaHRUb0xlZnRPdmVycmlkZSA6IExlZnRUb1JpZ2h0T3ZlcnJpZGUpKTsK
LSAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXItPmVtYmVkKGQpOwotICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbmV4dCkgewotICAg
ICAgICAgICAgaWYgKCFza2lwSW5saW5lcyAmJiAhb2xkRW5kT2ZJbmxpbmUgJiYgY3VycmVudC0+
aXNSZW5kZXJJbmxpbmUoKSkgewotICAgICAgICAgICAgICAgIG5leHQgPSBjdXJyZW50OwotICAg
ICAgICAgICAgICAgIGVuZE9mSW5saW5lID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsK
LSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudCAh
PSBibG9jaykgewotICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlciAmJiBjdXJyZW50LT5pc1Jl
bmRlcklubGluZSgpICYmIGN1cnJlbnQtPnN0eWxlKCktPnVuaWNvZGVCaWRpKCkgIT0gVUJOb3Jt
YWwpCi0gICAgICAgICAgICAgICAgICAgIHJlc29sdmVyLT5lbWJlZChQb3BEaXJlY3Rpb25hbEZv
cm1hdCk7Ci0KLSAgICAgICAgICAgICAgICBuZXh0ID0gY3VycmVudC0+bmV4dFNpYmxpbmcoKTsK
LSAgICAgICAgICAgICAgICBpZiAobmV4dCkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVz
b2x2ZXIgJiYgbmV4dC0+aXNSZW5kZXJJbmxpbmUoKSkgewotICAgICAgICAgICAgICAgICAgICAg
ICAgRVVuaWNvZGVCaWRpIHViID0gbmV4dC0+c3R5bGUoKS0+dW5pY29kZUJpZGkoKTsKLSAgICAg
ICAgICAgICAgICAgICAgICAgIGlmICh1YiAhPSBVQk5vcm1hbCkgewotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFRleHREaXJlY3Rpb24gZGlyID0gbmV4dC0+c3R5bGUoKS0+ZGlyZWN0aW9u
KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0aW9uIGQgPSAodWIgPT0gRW1i
ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoZGlyID09IFJUTCA/IFJpZ2h0
VG9MZWZ0RW1iZWRkaW5nOiBMZWZ0VG9SaWdodEVtYmVkZGluZykKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgOiAoZGlyID09IFJUTCA/IFJpZ2h0VG9MZWZ0T3ZlcnJpZGUgOiBMZWZ0
VG9SaWdodE92ZXJyaWRlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXIt
PmVtYmVkKGQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAg
ICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC0+cGFyZW50KCk7
Ci0gICAgICAgICAgICAgICAgaWYgKCFza2lwSW5saW5lcyAmJiBjdXJyZW50ICYmIGN1cnJlbnQg
IT0gYmxvY2sgJiYgY3VycmVudC0+aXNSZW5kZXJJbmxpbmUoKSkgewotICAgICAgICAgICAgICAg
ICAgICBuZXh0ID0gY3VycmVudDsKLSAgICAgICAgICAgICAgICAgICAgZW5kT2ZJbmxpbmUgPSB0
cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIW5leHQpCi0gICAgICAgICAgICBi
cmVhazsKLQotICAgICAgICBpZiAobmV4dC0+aXNUZXh0KCkgfHwgbmV4dC0+aXNGbG9hdGluZygp
IHx8IG5leHQtPmlzUmVwbGFjZWQoKSB8fCBuZXh0LT5pc1Bvc2l0aW9uZWQoKQotICAgICAgICAg
ICAgfHwgKCghc2tpcElubGluZXMgfHwgIW5leHQtPmZpcnN0Q2hpbGQoKSkgLy8gQWx3YXlzIHJl
dHVybiBFTVBUWSBpbmxpbmVzLgotICAgICAgICAgICAgICAgICYmIG5leHQtPmlzUmVuZGVySW5s
aW5lKCkpKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGN1cnJlbnQgPSBuZXh0OwotICAg
IH0KLQotICAgIGlmIChlbmRPZklubGluZVB0cikKLSAgICAgICAgKmVuZE9mSW5saW5lUHRyID0g
ZW5kT2ZJbmxpbmU7Ci0KLSAgICByZXR1cm4gbmV4dDsKLX0KLQotc3RhdGljIFJlbmRlck9iamVj
dCogYmlkaUZpcnN0KFJlbmRlckJsb2NrKiBibG9jaywgSW5saW5lQmlkaVJlc29sdmVyKiByZXNv
bHZlciwgYm9vbCBza2lwSW5saW5lcyA9IHRydWUpCi17Ci0gICAgaWYgKCFibG9jay0+Zmlyc3RD
aGlsZCgpKQotICAgICAgICByZXR1cm4gMDsKLSAgICAKLSAgICBSZW5kZXJPYmplY3QqIG8gPSBi
bG9jay0+Zmlyc3RDaGlsZCgpOwotICAgIGlmIChvLT5pc1JlbmRlcklubGluZSgpKSB7Ci0gICAg
ICAgIGlmIChyZXNvbHZlcikgewotICAgICAgICAgICAgRVVuaWNvZGVCaWRpIHViID0gby0+c3R5
bGUoKS0+dW5pY29kZUJpZGkoKTsKLSAgICAgICAgICAgIGlmICh1YiAhPSBVQk5vcm1hbCkgewot
ICAgICAgICAgICAgICAgIFRleHREaXJlY3Rpb24gZGlyID0gby0+c3R5bGUoKS0+ZGlyZWN0aW9u
KCk7Ci0gICAgICAgICAgICAgICAgRGlyZWN0aW9uIGQgPSAodWIgPT0gRW1iZWQKLSAgICAgICAg
ICAgICAgICAgICAgPyAoZGlyID09IFJUTCA/IFJpZ2h0VG9MZWZ0RW1iZWRkaW5nIDogTGVmdFRv
UmlnaHRFbWJlZGRpbmcpCi0gICAgICAgICAgICAgICAgICAgIDogKGRpciA9PSBSVEwgPyBSaWdo
dFRvTGVmdE92ZXJyaWRlIDogTGVmdFRvUmlnaHRPdmVycmlkZSkpOwotICAgICAgICAgICAgICAg
IHJlc29sdmVyLT5lbWJlZChkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBp
ZiAoc2tpcElubGluZXMgJiYgby0+Zmlyc3RDaGlsZCgpKQotICAgICAgICAgICAgbyA9IGJpZGlO
ZXh0KGJsb2NrLCBvLCByZXNvbHZlciwgc2tpcElubGluZXMpOwotICAgICAgICBlbHNlIHsKLSAg
ICAgICAgICAgIC8vIE5ldmVyIHNraXAgZW1wdHkgaW5saW5lcy4KLSAgICAgICAgICAgIGlmIChy
ZXNvbHZlcikKLSAgICAgICAgICAgICAgICByZXNvbHZlci0+Y29tbWl0RXhwbGljaXRFbWJlZGRp
bmcoKTsKLSAgICAgICAgICAgIHJldHVybiBvOyAKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlm
IChvICYmICFvLT5pc1RleHQoKSAmJiAhby0+aXNSZXBsYWNlZCgpICYmICFvLT5pc0Zsb2F0aW5n
KCkgJiYgIW8tPmlzUG9zaXRpb25lZCgpKQotICAgICAgICBvID0gYmlkaU5leHQoYmxvY2ssIG8s
IHJlc29sdmVyLCBza2lwSW5saW5lcyk7Ci0KLSAgICBpZiAocmVzb2x2ZXIpCi0gICAgICAgIHJl
c29sdmVyLT5jb21taXRFeHBsaWNpdEVtYmVkZGluZygpOwotICAgIHJldHVybiBvOwotfQotCi1p
bmxpbmUgdm9pZCBJbmxpbmVJdGVyYXRvcjo6aW5jcmVtZW50KElubGluZUJpZGlSZXNvbHZlciog
cmVzb2x2ZXIpCi17Ci0gICAgaWYgKCFvYmopCi0gICAgICAgIHJldHVybjsKLSAgICBpZiAob2Jq
LT5pc1RleHQoKSkgewotICAgICAgICBwb3MrKzsKLSAgICAgICAgaWYgKHBvcyA+PSB0b1JlbmRl
clRleHQob2JqKS0+dGV4dExlbmd0aCgpKSB7Ci0gICAgICAgICAgICBvYmogPSBiaWRpTmV4dChi
bG9jaywgb2JqLCByZXNvbHZlcik7Ci0gICAgICAgICAgICBwb3MgPSAwOwotICAgICAgICAgICAg
bmV4dEJyZWFrYWJsZVBvc2l0aW9uID0gLTE7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAg
ICAgICBvYmogPSBiaWRpTmV4dChibG9jaywgb2JqLCByZXNvbHZlcik7Ci0gICAgICAgIHBvcyA9
IDA7Ci0gICAgICAgIG5leHRCcmVha2FibGVQb3NpdGlvbiA9IC0xOwotICAgIH0KLX0KLQotdGVt
cGxhdGU8PgotaW5saW5lIHZvaWQgSW5saW5lQmlkaVJlc29sdmVyOjppbmNyZW1lbnQoKQotewot
ICAgIGN1cnJlbnQuaW5jcmVtZW50KHRoaXMpOwotfQotCi1pbmxpbmUgYm9vbCBJbmxpbmVJdGVy
YXRvcjo6YXRFbmQoKSBjb25zdAotewotICAgIHJldHVybiAhb2JqOwotfQotCi1pbmxpbmUgVUNo
YXIgSW5saW5lSXRlcmF0b3I6OmN1cnJlbnQoKSBjb25zdAotewotICAgIGlmICghb2JqIHx8ICFv
YmotPmlzVGV4dCgpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIFJlbmRlclRleHQqIHRleHQg
PSB0b1JlbmRlclRleHQob2JqKTsKLSAgICBpZiAocG9zID49IHRleHQtPnRleHRMZW5ndGgoKSkK
LSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICByZXR1cm4gdGV4dC0+Y2hhcmFjdGVycygpW3Bvc107
Ci19Ci0KLUFMV0FZU19JTkxJTkUgRGlyZWN0aW9uIElubGluZUl0ZXJhdG9yOjpkaXJlY3Rpb24o
KSBjb25zdAotewotICAgIGlmIChVQ2hhciBjID0gY3VycmVudCgpKQotICAgICAgICByZXR1cm4g
VW5pY29kZTo6ZGlyZWN0aW9uKGMpOwotCi0gICAgaWYgKG9iaiAmJiBvYmotPmlzTGlzdE1hcmtl
cigpKQotICAgICAgICByZXR1cm4gb2JqLT5zdHlsZSgpLT5kaXJlY3Rpb24oKSA9PSBMVFIgPyBM
ZWZ0VG9SaWdodCA6IFJpZ2h0VG9MZWZ0OwotCi0gICAgcmV0dXJuIE90aGVyTmV1dHJhbDsKLX0K
LQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCiBzdGF0aWMg
dm9pZCBjaG9wTWlkcG9pbnRzQXQoTGluZU1pZHBvaW50U3RhdGUmIGxpbmVNaWRwb2ludFN0YXRl
LCBSZW5kZXJPYmplY3QqIG9iaiwgdW5zaWduZWQgcG9zKQogewogICAgIGlmICghbGluZU1pZHBv
aW50U3RhdGUubnVtTWlkcG9pbnRzKQpAQCAtMzk4LDcgKzEyOCw3IEBAIHN0YXRpYyB2b2lkIGFk
ZE1pZHBvaW50KExpbmVNaWRwb2ludFN0YXQKICAgICBtaWRwb2ludHNbbGluZU1pZHBvaW50U3Rh
dGUubnVtTWlkcG9pbnRzKytdID0gbWlkcG9pbnQ7CiB9CiAKLXN0YXRpYyB2b2lkIGFwcGVuZFJ1
bnNGb3JPYmplY3QoaW50IHN0YXJ0LCBpbnQgZW5kLCBSZW5kZXJPYmplY3QqIG9iaiwgSW5saW5l
QmlkaVJlc29sdmVyJiByZXNvbHZlcikKK3ZvaWQgUmVuZGVyQmxvY2s6OmFwcGVuZFJ1bnNGb3JP
YmplY3QoaW50IHN0YXJ0LCBpbnQgZW5kLCBSZW5kZXJPYmplY3QqIG9iaiwgSW5saW5lQmlkaVJl
c29sdmVyJiByZXNvbHZlcikKIHsKICAgICBpZiAoc3RhcnQgPiBlbmQgfHwgb2JqLT5pc0Zsb2F0
aW5nKCkgfHwKICAgICAgICAgKG9iai0+aXNQb3NpdGlvbmVkKCkgJiYgIW9iai0+c3R5bGUoKS0+
aGFzU3RhdGljWCgpICYmICFvYmotPnN0eWxlKCktPmhhc1N0YXRpY1koKSAmJiAhb2JqLT5jb250
YWluZXIoKS0+aXNSZW5kZXJJbmxpbmUoKSkpCkBAIC00NDEsMzYgKzE3MSw2IEBAIHN0YXRpYyB2
b2lkIGFwcGVuZFJ1bnNGb3JPYmplY3QoaW50IHN0YXIKICAgICB9CiB9CiAKLXRlbXBsYXRlIDw+
Ci12b2lkIElubGluZUJpZGlSZXNvbHZlcjo6YXBwZW5kUnVuKCkKLXsKLSAgICBpZiAoIWVtcHR5
UnVuICYmICFlb3IuYXRFbmQoKSkgewotICAgICAgICBpbnQgc3RhcnQgPSBzb3IucG9zOwotICAg
ICAgICBSZW5kZXJPYmplY3QgKm9iaiA9IHNvci5vYmo7Ci0gICAgICAgIHdoaWxlIChvYmogJiYg
b2JqICE9IGVvci5vYmogJiYgb2JqICE9IGVuZE9mTGluZS5vYmopIHsKLSAgICAgICAgICAgIGFw
cGVuZFJ1bnNGb3JPYmplY3Qoc3RhcnQsIG9iai0+bGVuZ3RoKCksIG9iaiwgKnRoaXMpOyAgICAg
ICAgCi0gICAgICAgICAgICBzdGFydCA9IDA7Ci0gICAgICAgICAgICBvYmogPSBiaWRpTmV4dChz
b3IuYmxvY2ssIG9iaik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9iaikgewotICAgICAgICAg
ICAgdW5zaWduZWQgcG9zID0gb2JqID09IGVvci5vYmogPyBlb3IucG9zIDogVUlOVF9NQVg7Ci0g
ICAgICAgICAgICBpZiAob2JqID09IGVuZE9mTGluZS5vYmogJiYgZW5kT2ZMaW5lLnBvcyA8PSBw
b3MpIHsKLSAgICAgICAgICAgICAgICByZWFjaGVkRW5kT2ZMaW5lID0gdHJ1ZTsKLSAgICAgICAg
ICAgICAgICBwb3MgPSBlbmRPZkxpbmUucG9zOwotICAgICAgICAgICAgfQotICAgICAgICAgICAg
Ly8gSXQncyBPSyB0byBhZGQgcnVucyBmb3IgemVyby1sZW5ndGggUmVuZGVyT2JqZWN0cywganVz
dCBkb24ndCBtYWtlIHRoZSBydW4gbGFyZ2VyIHRoYW4gaXQgc2hvdWxkIGJlCi0gICAgICAgICAg
ICBpbnQgZW5kID0gb2JqLT5sZW5ndGgoKSA/IHBvcysxIDogMDsKLSAgICAgICAgICAgIGFwcGVu
ZFJ1bnNGb3JPYmplY3Qoc3RhcnQsIGVuZCwgb2JqLCAqdGhpcyk7Ci0gICAgICAgIH0KLSAgICAg
ICAgCi0gICAgICAgIGVvci5pbmNyZW1lbnQoKTsKLSAgICAgICAgc29yID0gZW9yOwotICAgIH0K
LQotICAgIG1fZGlyZWN0aW9uID0gT3RoZXJOZXV0cmFsOwotICAgIG1fc3RhdHVzLmVvciA9IE90
aGVyTmV1dHJhbDsKLX0KLQogc3RhdGljIGlubGluZSBJbmxpbmVCb3gqIGNyZWF0ZUlubGluZUJv
eEZvclJlbmRlcmVyKFJlbmRlck9iamVjdCogb2JqLCBib29sIGlzUm9vdExpbmVCb3gsIGJvb2wg
aXNPbmx5UnVuID0gZmFsc2UpCiB7CiAgICAgaWYgKGlzUm9vdExpbmVCb3gpCkBAIC01NzIsMTIg
KzI3MiwxNiBAQCBSb290SW5saW5lQm94KiBSZW5kZXJCbG9jazo6Y29uc3RydWN0TGluCiAgICAg
ICAgIGlmICghYm94KQogICAgICAgICAgICAgY29udGludWU7CiAKKyAgICAgICAgLy8gQW5vbnlt
b3VzIGlubGluZSBibG9ja3MgKHVzZWQgdG8gaG9sZCBibG9ja3MgaW5zaWRlIGlubGluZXMpIGRv
bid0IG5lZWQgdG8gd2FzdGUgdGltZSB3cmFwcGluZworICAgICAgICAvLyB0aGVtc2VsdmVzIGlu
IHRob3NlIGlubGluZXMgKHNpbmNlIHdlIHdhbnQgdG8gcHJldGVuZCBsaWtlIHRoZXkgZG9uJ3Qg
ZXhpc3Qgb24gdGhpcyBmYWtlIGxpbmUpLgorICAgICAgICBSZW5kZXJPYmplY3QqIGFuY2VzdG9y
UmVuZGVyZXIgPSByLT5tX29iamVjdC0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpID8gdGhpcyA6
IHItPm1fb2JqZWN0LT5wYXJlbnQoKTsKKyAKICAgICAgICAgLy8gSWYgd2UgaGF2ZSBubyBwYXJl
bnQgYm94IHlldCwgb3IgaWYgdGhlIHJ1biBpcyBub3Qgc2ltcGx5IGEgc2libGluZywKICAgICAg
ICAgLy8gdGhlbiB3ZSBuZWVkIHRvIGNvbnN0cnVjdCBpbmxpbmUgYm94ZXMgYXMgbmVjZXNzYXJ5
IHRvIHByb3Blcmx5IGVuY2xvc2UgdGhlCiAgICAgICAgIC8vIHJ1bidzIGlubGluZSBib3guCi0g
ICAgICAgIGlmICghcGFyZW50Qm94IHx8IHBhcmVudEJveC0+cmVuZGVyZXIoKSAhPSByLT5tX29i
amVjdC0+cGFyZW50KCkpCisgICAgICAgIGlmICghcGFyZW50Qm94IHx8IHBhcmVudEJveC0+cmVu
ZGVyZXIoKSAhPSBhbmNlc3RvclJlbmRlcmVyKQogICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyBp
bmxpbmUgYm94ZXMgYWxsIHRoZSB3YXkgYmFjayB0byB0aGUgYXBwcm9wcmlhdGUgaW5zZXJ0aW9u
IHBvaW50LgotICAgICAgICAgICAgcGFyZW50Qm94ID0gY3JlYXRlTGluZUJveGVzKHItPm1fb2Jq
ZWN0LT5wYXJlbnQoKSwgZmlyc3RMaW5lKTsKKyAgICAgICAgICAgIHBhcmVudEJveCA9IGNyZWF0
ZUxpbmVCb3hlcyhhbmNlc3RvclJlbmRlcmVyLCBmaXJzdExpbmUpOwogCiAgICAgICAgIC8vIEFw
cGVuZCB0aGUgaW5saW5lIGJveCB0byB0aGlzIGxpbmUuCiAgICAgICAgIHBhcmVudEJveC0+YWRk
VG9MaW5lKGJveCk7CkBAIC02MTksNiArMzIzLDggQEAgdm9pZCBSZW5kZXJCbG9jazo6Y29tcHV0
ZUhvcml6b250YWxQb3NpdAogICAgIHVuc2lnbmVkIG51bVNwYWNlcyA9IDA7CiAgICAgRVRleHRB
bGlnbiB0ZXh0QWxpZ24gPSBzdHlsZSgpLT50ZXh0QWxpZ24oKTsKIAorICAgIGludCB4ID0gbGVm
dE9mZnNldChoZWlnaHQoKSwgZmlyc3RMaW5lKTsKKwogICAgIGZvciAoQmlkaVJ1biogciA9IGZp
cnN0UnVuOyByOyByID0gci0+bmV4dCgpKSB7CiAgICAgICAgIGlmICghci0+bV9ib3ggfHwgci0+
bV9vYmplY3QtPmlzUG9zaXRpb25lZCgpIHx8IHItPm1fYm94LT5pc0xpbmVCcmVhaygpKQogICAg
ICAgICAgICAgY29udGludWU7IC8vIFBvc2l0aW9uZWQgb2JqZWN0cyBhcmUgb25seSBwYXJ0aWNp
cGF0aW5nIHRvIGZpZ3VyZSBvdXQgdGhlaXIKQEAgLTY1Niw2ICszNjIsMTIgQEAgdm9pZCBSZW5k
ZXJCbG9jazo6Y29tcHV0ZUhvcml6b250YWxQb3NpdAogICAgICAgICAgICAgcmVuZGVyQm94LT5j
YWxjV2lkdGgoKTsKICAgICAgICAgICAgIHItPm1fYm94LT5zZXRXaWR0aChyZW5kZXJCb3gtPndp
ZHRoKCkpOwogICAgICAgICAgICAgdG90V2lkdGggKz0gcmVuZGVyQm94LT5tYXJnaW5MZWZ0KCkg
KyByZW5kZXJCb3gtPm1hcmdpblJpZ2h0KCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlm
IChyLT5tX29iamVjdC0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CisgICAgICAgICAgICAg
ICAgLy8gQWxsb3cgdGhlIGZ1bGwgYXZhaWxhYmxlIHdpZHRoIHRvIGJlIHVzZWQsIHNpbmNlIGZs
b2F0cyB3aWxsIGludHJ1ZGUgaW50byBvdXIgc3BhY2UuCisgICAgICAgICAgICAgICAgYXZhaWxh
YmxlV2lkdGggPSByaWdodE9mZnNldCgpIC0gbGVmdE9mZnNldCgpOworICAgICAgICAgICAgICAg
IHggPSBsZWZ0T2Zmc2V0KCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICB0
b3RXaWR0aCArPSByLT5tX2JveC0+d2lkdGgoKTsKQEAgLTY2NSw3ICszNzcsNiBAQCB2b2lkIFJl
bmRlckJsb2NrOjpjb21wdXRlSG9yaXpvbnRhbFBvc2l0CiAgICAgLy8gd2Ugbm93IGV4YW1pbmUg
b3VyIHRleHQtYWxpZ24gcHJvcGVydHkgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIHdoZXJlIHRvIHBv
c2l0aW9uIHRoZQogICAgIC8vIG9iamVjdHMgaG9yaXpvbnRhbGx5LiAgVGhlIHRvdGFsIHdpZHRo
IG9mIHRoZSBsaW5lIGNhbiBiZSBpbmNyZWFzZWQgaWYgd2UgZW5kIHVwCiAgICAgLy8ganVzdGlm
eWluZyB0ZXh0LgotICAgIGludCB4ID0gbGVmdE9mZnNldChoZWlnaHQoKSwgZmlyc3RMaW5lKTsK
ICAgICBzd2l0Y2ggKHRleHRBbGlnbikgewogICAgICAgICBjYXNlIExFRlQ6CiAgICAgICAgIGNh
c2UgV0VCS0lUX0xFRlQ6CkBAIC04MTksOSArNTMwLDE1IEBAIHZvaWQgUmVuZGVyQmxvY2s6Omxh
eW91dElubGluZUNoaWxkcmVuKGIKICAgICBib29sIHVzZVJlcGFpbnRCb3VuZHMgPSBmYWxzZTsK
ICAgICAKICAgICBtX292ZXJmbG93LmNsZWFyKCk7Ci0gICAgICAgIAotICAgIHNldEhlaWdodChi
b3JkZXJUb3AoKSArIHBhZGRpbmdUb3AoKSk7Ci0gICAgaW50IHRvQWRkID0gYm9yZGVyQm90dG9t
KCkgKyBwYWRkaW5nQm90dG9tKCkgKyBob3Jpem9udGFsU2Nyb2xsYmFySGVpZ2h0KCk7CisgICAg
CisgICAgaW50IHRvcCA9IGJvcmRlclRvcCgpICsgcGFkZGluZ1RvcCgpOworICAgIGludCBib3R0
b20gPSBib3JkZXJCb3R0b20oKSArIHBhZGRpbmdCb3R0b20oKSArIGhvcml6b250YWxTY3JvbGxi
YXJIZWlnaHQoKTsKKworICAgIHNldEhlaWdodCh0b3ApOworCisgICAgLy8gVGhlIG1hcmdpbiBz
dHJ1Y3QgY2FjaGVzIGFsbCBvdXIgY3VycmVudCBtYXJnaW4gY29sbGFwc2luZyBzdGF0ZS4gV2Ug
cnVuIG1hcmdpbiBjb2xsYXBzaW5nIHdoZW4gd2UgZW5jb3VudGVyIGFub255bW91cyBpbmxpbmUg
YmxvY2tzIHRoYXQgYXJlIGJlaW5nIHVzZWQKKyAgICAvLyBmb3IgdGhlIGJsb2Nrcy1pbnNpZGUt
aW5saW5lcyBjYXNlIChhbmQgdGhlIGlubGluZXMgYXJlIGVtcHR5KSwgZS5nLCA8c3Bhbj48ZGl2
Pk9uZTwvZGl2Pjwvc3Bhbj4uCisgICAgTWFyZ2luSW5mbyBtYXJnaW5JbmZvKHRoaXMsIHRvcCwg
Ym90dG9tKTsKIAogICAgIC8vIEZpZ3VyZSBvdXQgaWYgd2Ugc2hvdWxkIGNsZWFyIG91dCBvdXIg
bGluZSBib3hlcy4KICAgICAvLyBGSVhNRTogSGFuZGxlIHJlc2l6ZSBldmVudHVhbGx5IQpAQCAt
ODUwLDEyICs1NjcsMTUgQEAgdm9pZCBSZW5kZXJCbG9jazo6bGF5b3V0SW5saW5lQ2hpbGRyZW4o
YgogICAgICAgICAgICAgaWYgKG8tPmlzUmVwbGFjZWQoKSB8fCBvLT5pc0Zsb2F0aW5nKCkgfHwg
by0+aXNQb3NpdGlvbmVkKCkpIHsKICAgICAgICAgICAgICAgICBSZW5kZXJCb3gqIGJveCA9IHRv
UmVuZGVyQm94KG8pOwogICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWxh
eW91dENoaWxkcmVuIHx8IG8tPnN0eWxlKCktPndpZHRoKCkuaXNQZXJjZW50KCkgfHwgby0+c3R5
bGUoKS0+aGVpZ2h0KCkuaXNQZXJjZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIG8tPnNldENo
aWxkTmVlZHNMYXlvdXQodHJ1ZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAKKyAgICAg
ICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgbGF5b3V0IGNoaWxkcmVuIGlmIHRoZXkgbmVlZCBp
dC4KKyAgICAgICAgICAgICAgICAvLyBGSVhNRTogVGVjaG5pY2FsbHkgcGVyY2VudGFnZSBoZWln
aHQgb2JqZWN0cyBvbmx5IG5lZWQgYSByZWxheW91dCBpZiB0aGVpciBwZXJjZW50YWdlIGlzbid0
IGdvaW5nIHRvIGJlIHR1cm5lZCBpbnRvCisgICAgICAgICAgICAgICAgLy8gYW4gYXV0byB2YWx1
ZS4gIEFkZCBhIG1ldGhvZCB0byBkZXRlcm1pbmUgdGhpcywgc28gdGhhdCB3ZSBjYW4gYXZvaWQg
dGhlIHJlbGF5b3V0LgorICAgICAgICAgICAgICAgIGlmIChyZWxheW91dENoaWxkcmVuIHx8ICgo
Ym94LT5zdHlsZSgpLT5oZWlnaHQoKS5pc1BlcmNlbnQoKSB8fCBib3gtPnN0eWxlKCktPm1pbkhl
aWdodCgpLmlzUGVyY2VudCgpIHx8IGJveC0+c3R5bGUoKS0+bWF4SGVpZ2h0KCkuaXNQZXJjZW50
KCkpKSkKKyAgICAgICAgICAgICAgICAgICAgYm94LT5zZXRDaGlsZE5lZWRzTGF5b3V0KHRydWUs
IGZhbHNlKTsKKwogICAgICAgICAgICAgICAgIC8vIElmIHJlbGF5b3V0Q2hpbGRyZW4gaXMgc2V0
IGFuZCB3ZSBoYXZlIHBlcmNlbnRhZ2UgcGFkZGluZywgd2UgYWxzbyBuZWVkIHRvIGludmFsaWRh
dGUgdGhlIGNoaWxkJ3MgcHJlZiB3aWR0aHMuCi0gICAgICAgICAgICAgICAgaWYgKHJlbGF5b3V0
Q2hpbGRyZW4gJiYgKG8tPnN0eWxlKCktPnBhZGRpbmdMZWZ0KCkuaXNQZXJjZW50KCkgfHwgby0+
c3R5bGUoKS0+cGFkZGluZ1JpZ2h0KCkuaXNQZXJjZW50KCkpKQotICAgICAgICAgICAgICAgICAg
ICBvLT5zZXRQcmVmV2lkdGhzRGlydHkodHJ1ZSwgZmFsc2UpOworICAgICAgICAgICAgICAgIGlm
IChyZWxheW91dENoaWxkcmVuICYmIChib3gtPnN0eWxlKCktPnBhZGRpbmdMZWZ0KCkuaXNQZXJj
ZW50KCkgfHwgYm94LT5zdHlsZSgpLT5wYWRkaW5nUmlnaHQoKS5pc1BlcmNlbnQoKSkpCisgICAg
ICAgICAgICAgICAgICAgIGJveC0+c2V0UHJlZldpZHRoc0RpcnR5KHRydWUsIGZhbHNlKTsKICAg
ICAgICAgICAgIAogICAgICAgICAgICAgICAgIGlmIChvLT5pc1Bvc2l0aW9uZWQoKSkKICAgICAg
ICAgICAgICAgICAgICAgby0+Y29udGFpbmluZ0Jsb2NrKCktPmluc2VydFBvc2l0aW9uZWRPYmpl
Y3QoYm94KTsKQEAgLTg2NSw3ICs1ODUsOCBAQCB2b2lkIFJlbmRlckJsb2NrOjpsYXlvdXRJbmxp
bmVDaGlsZHJlbihiCiAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZ1bGxMYXlvdXQgfHwg
by0+bmVlZHNMYXlvdXQoKSkgLy8gUmVwbGFjZWQgZWxlbWVudHMKICAgICAgICAgICAgICAgICAg
ICAgICAgIHRvUmVuZGVyQm94KG8pLT5kaXJ0eUxpbmVCb3hlcyhmdWxsTGF5b3V0KTsKIAotICAg
ICAgICAgICAgICAgICAgICBvLT5sYXlvdXRJZk5lZWRlZCgpOworICAgICAgICAgICAgICAgICAg
ICBpZiAoIW8tPmlzUmVwbGFjZWQoKSB8fCAhby0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKQor
ICAgICAgICAgICAgICAgICAgICAgICAgby0+bGF5b3V0SWZOZWVkZWQoKTsKICAgICAgICAgICAg
ICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG8tPmlzVGV4dCgpIHx8IChvLT5pc1JlbmRl
cklubGluZSgpICYmICFlbmRPZklubGluZSkpIHsKICAgICAgICAgICAgICAgICBoYXNJbmxpbmVD
aGlsZCA9IHRydWU7CkBAIC05NjAsNyArNjgxLDcgQEAgdm9pZCBSZW5kZXJCbG9jazo6bGF5b3V0
SW5saW5lQ2hpbGRyZW4oYgogICAgICAgICAgICAgaXNMaW5lRW1wdHkgPSB0cnVlOwogICAgICAg
ICAgICAgCiAgICAgICAgICAgICBFQ2xlYXIgY2xlYXIgPSBDTk9ORTsKLSAgICAgICAgICAgIGVu
ZCA9IGZpbmROZXh0TGluZUJyZWFrKHJlc29sdmVyLCBmaXJzdExpbmUsIGlzTGluZUVtcHR5LCBw
cmV2aW91c0xpbmVCcm9rZUNsZWFubHksICZjbGVhcik7CisgICAgICAgICAgICBlbmQgPSBmaW5k
TmV4dExpbmVCcmVhayhyZXNvbHZlciwgZmlyc3RMaW5lLCBpc0xpbmVFbXB0eSwgcHJldmlvdXNM
aW5lQnJva2VDbGVhbmx5LCBtYXJnaW5JbmZvLCAmY2xlYXIpOwogICAgICAgICAgICAgaWYgKHJl
c29sdmVyLnBvc2l0aW9uKCkuYXRFbmQoKSkgewogICAgICAgICAgICAgICAgIHJlc29sdmVyLmRl
bGV0ZVJ1bnMoKTsKICAgICAgICAgICAgICAgICBjaGVja0ZvckZsb2F0c0Zyb21MYXN0TGluZSA9
IHRydWU7CkBAIC0xMDMwLDYgKzc1MSwxNCBAQCB2b2lkIFJlbmRlckJsb2NrOjpsYXlvdXRJbmxp
bmVDaGlsZHJlbihiCiAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lQm94KSB7CiAgICAgICAg
ICAgICAgICAgICAgICAgICBsaW5lQm94LT5zZXRFbmRzV2l0aEJyZWFrKHByZXZpb3VzTGluZUJy
b2tlQ2xlYW5seSk7CiAKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIG91ciBwcmV2aW91
cyBsaW5lIHdhcyBhbiBhbm9ueW1vdXMgYmxvY2sgYW5kIHdlIGFyZSBub3QgYW4gYW5vbnltb3Vz
IGJsb2NrLCBzaW11bGF0ZSBhIG1hcmdpbiBjb2xsYXBzZSBub3cgc28gdGhhdCB3ZSBnZXQgdGhl
IHByb3BlcgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5jcmVhc2VkIGhlaWdodC4gIFdl
IGFsc28gaGF2ZSB0byBzaW11bGF0ZSBhIG1hcmdpbiBjb2xsYXBzZSB0byBwcm9wYWdhdGUgbWFy
Z2lucyB0aHJvdWdoIHRvIHRoZSB0b3Agb2Ygb3VyIGJsb2NrLgorICAgICAgICAgICAgICAgICAg
ICAgICAgaWYgKCFsaW5lQm94LT5hbm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgaWYgKCFsaW5lQm94LT5wcmV2Um9vdEJveCgpIHx8IGxpbmVCb3gt
PnByZXZSb290Qm94KCktPmFub255bW91c0lubGluZUJsb2NrKCkpCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGNvbGxhcHNlTWFyZ2lucygwLCBtYXJnaW5JbmZvKTsKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBtYXJnaW5JbmZvLnNldEF0VG9wT2ZCbG9jayhmYWxzZSk7Cisg
ICAgICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5v
dyB3ZSBwb3NpdGlvbiBhbGwgb2Ygb3VyIHRleHQgcnVucyBob3Jpem9udGFsbHkuCiAgICAgICAg
ICAgICAgICAgICAgICAgICBjb21wdXRlSG9yaXpvbnRhbFBvc2l0aW9uc0ZvckxpbmUobGluZUJv
eCwgZmlyc3RMaW5lLCByZXNvbHZlci5maXJzdFJ1bigpLCB0cmFpbGluZ1NwYWNlUnVuLCBlbmQu
YXRFbmQoKSk7CiAKQEAgLTExNjEsOCArODkwLDE0IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmxheW91
dElubGluZUNoaWxkcmVuKGIKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIE5vdyBhZGQgaW4g
dGhlIGJvdHRvbSBib3JkZXIvcGFkZGluZy4KLSAgICBzZXRIZWlnaHQoaGVpZ2h0KCkgKyB0b0Fk
ZCk7CisgICAgLy8gTm93IGRvIHRoZSBoYW5kbGluZyBvZiB0aGUgYm90dG9tIG9mIHRoZSBibG9j
aywgYWRkaW5nIGluIG91ciBib3R0b20gYm9yZGVyL3BhZGRpbmcgYW5kCisgICAgLy8gZGV0ZXJt
aW5pbmcgdGhlIGNvcnJlY3QgY29sbGFwc2VkIGJvdHRvbSBtYXJnaW4gaW5mb3JtYXRpb24uICBU
aGlzIGNvbGxhcHNlIGlzIG9ubHkgbmVjZXNzYXJ5CisgICAgLy8gaWYgb3VyIGxhc3QgY2hpbGQg
d2FzIGFuIGFub255bW91cyBpbmxpbmUgYmxvY2sgdGhhdCBtaWdodCBuZWVkIHRvIHByb3BhZ2F0
ZSBtYXJnaW4gaW5mb3JtYXRpb24gb3V0IHRvCisgICAgLy8gdXMuCisgICAgaWYgKGxhc3RSb290
Qm94KCkgJiYgbGFzdFJvb3RCb3goKS0+YW5vbnltb3VzSW5saW5lQmxvY2soKSkKKyAgICAgICAg
aGFuZGxlQm90dG9tT2ZCbG9jayh0b3AsIGJvdHRvbSwgbWFyZ2luSW5mbyk7CisgICAgZWxzZQor
ICAgICAgICBzZXRIZWlnaHQoaGVpZ2h0KCkgKyBib3R0b20pOwogCiAgICAgaWYgKCFmaXJzdExp
bmVCb3goKSAmJiBoYXNMaW5lSWZFbXB0eSgpKQogICAgICAgICBzZXRIZWlnaHQoaGVpZ2h0KCkg
KyBsaW5lSGVpZ2h0KHRydWUsIHRydWUpKTsKQEAgLTExODMsNiArOTE4LDEyIEBAIFJvb3RJbmxp
bmVCb3gqIFJlbmRlckJsb2NrOjpkZXRlcm1pbmVTdGEKICAgICBpZiAoIWZ1bGxMYXlvdXQpIHsK
ICAgICAgICAgc2l6ZV90IGZsb2F0SW5kZXggPSAwOwogICAgICAgICBmb3IgKGN1cnIgPSBmaXJz
dFJvb3RCb3goKTsgY3VyciAmJiAhY3Vyci0+aXNEaXJ0eSgpOyBjdXJyID0gY3Vyci0+bmV4dFJv
b3RCb3goKSkgeworICAgICAgICAgICAgaWYgKGN1cnItPmFub255bW91c0lubGluZUJsb2NrKCkp
IHsKKyAgICAgICAgICAgICAgICAvLyBGSVhNRTogV2UgaGF2ZSB0byBkbyBiZXR0ZXIgdGhhbiB0
aGlzIG9yIHdlIHdpbGwgcmVwYWludCB0b28gbXVjaCBhcyBjb250ZW50IGluc2lkZSBhbgorICAg
ICAgICAgICAgICAgIC8vIGFub255bW91cyBpbmxpbmUgYmxvY2sgY29tZXMgaW4uCisgICAgICAg
ICAgICAgICAgZnVsbExheW91dCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgICAgICB9CiAgICAgICAgICAgICBpZiAoVmVjdG9yPFJlbmRlckJveCo+KiBjbGVhbkxpbmVG
bG9hdHMgPSBjdXJyLT5mbG9hdHNQdHIoKSkgewogICAgICAgICAgICAgICAgIFZlY3RvcjxSZW5k
ZXJCb3gqPjo6aXRlcmF0b3IgZW5kID0gY2xlYW5MaW5lRmxvYXRzLT5lbmQoKTsKICAgICAgICAg
ICAgICAgICBmb3IgKFZlY3RvcjxSZW5kZXJCb3gqPjo6aXRlcmF0b3IgbyA9IGNsZWFuTGluZUZs
b2F0cy0+YmVnaW4oKTsgbyAhPSBlbmQ7ICsrbykgewpAQCAtMTQ0NCw3ICsxMTg1LDcgQEAgc3Rh
dGljIGJvb2wgaW5saW5lRmxvd1JlcXVpcmVzTGluZUJveChSZQogICAgIHJldHVybiAhZmxvdy0+
Zmlyc3RDaGlsZCgpICYmIGZsb3ctPmhhc0hvcml6b250YWxCb3JkZXJzUGFkZGluZ09yTWFyZ2lu
KCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgYm9vbCByZXF1aXJlc0xpbmVCb3goY29uc3QgSW5saW5l
SXRlcmF0b3ImIGl0LCBib29sIGlzTGluZUVtcHR5LCBib29sIHByZXZpb3VzTGluZUJyb2tlQ2xl
YW5seSkKK2Jvb2wgUmVuZGVyQmxvY2s6OnJlcXVpcmVzTGluZUJveChjb25zdCBJbmxpbmVJdGVy
YXRvciYgaXQsIGJvb2wgaXNMaW5lRW1wdHksIGJvb2wgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5
KQogewogICAgIGlmIChpdC5vYmotPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSkKICAgICAgICAg
cmV0dXJuIGZhbHNlOwpAQCAtMTU5Nyw3ICsxMzM4LDcgQEAgc3RhdGljIGlubGluZSB1bnNpZ25l
ZCB0ZXh0V2lkdGgoUmVuZGVyVAogfQogCiBJbmxpbmVJdGVyYXRvciBSZW5kZXJCbG9jazo6Zmlu
ZE5leHRMaW5lQnJlYWsoSW5saW5lQmlkaVJlc29sdmVyJiByZXNvbHZlciwgYm9vbCBmaXJzdExp
bmUsICBib29sJiBpc0xpbmVFbXB0eSwgYm9vbCYgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5LCAK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFQ2xlYXIqIGNs
ZWFyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcmdp
bkluZm8mIG1hcmdpbkluZm8sIEVDbGVhciogY2xlYXIpCiB7CiAgICAgQVNTRVJUKHJlc29sdmVy
LnBvc2l0aW9uKCkuYmxvY2sgPT0gdGhpcyk7CiAKQEAgLTE2MzgsNiArMTM3OSwxMSBAQCBJbmxp
bmVJdGVyYXRvciBSZW5kZXJCbG9jazo6ZmluZE5leHRMaW5lCiAgICAgYm9vbCBhdXRvV3JhcFdh
c0V2ZXJUcnVlT25MaW5lID0gZmFsc2U7CiAgICAgYm9vbCBmbG9hdHNGaXRPbkxpbmUgPSB0cnVl
OwogICAgIAorICAgIGJvb2wgaXNCbG9ja0luc2lkZUlubGluZSA9IGZhbHNlOworICAgIAorICAg
IGludCBwcmV2aW91c0Jsb2NrRmxvYXRCb3R0b20gPSAwOworICAgIGludCBtYXhCbG9ja0Zsb2F0
Qm90dG9tID0gMDsKKwogICAgIC8vIEZpcmVmb3ggYW5kIE9wZXJhIHdpbGwgYWxsb3cgYSB0YWJs
ZSBjZWxsIHRvIGdyb3cgdG8gZml0IGFuIGltYWdlIGluc2lkZSBpdCB1bmRlcgogICAgIC8vIHZl
cnkgc3BlY2lmaWMgY2lyY3Vtc3RhbmNlcyAoaW4gb3JkZXIgdG8gbWF0Y2ggY29tbW9uIFdpbklF
IHJlbmRlcmluZ3MpLiAKICAgICAvLyBOb3Qgc3VwcG9ydGluZyB0aGUgcXVpcmsgaGFzIGNhdXNl
ZCB1cyB0byBtaXMtcmVuZGVyIHNvbWUgcmVhbCBzaXRlcy4gKFNlZSBCdWd6aWxsYSAxMDUxNy4p
IApAQCAtMTY0OCw3ICsxMzk0LDggQEAgSW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6OmZpbmRO
ZXh0TGluZQogICAgIHdoaWxlIChvKSB7CiAgICAgICAgIGN1cnJXUyA9IG8tPmlzUmVwbGFjZWQo
KSA/IG8tPnBhcmVudCgpLT5zdHlsZSgpLT53aGl0ZVNwYWNlKCkgOiBvLT5zdHlsZSgpLT53aGl0
ZVNwYWNlKCk7CiAgICAgICAgIGxhc3RXUyA9IGxhc3QtPmlzUmVwbGFjZWQoKSA/IGxhc3QtPnBh
cmVudCgpLT5zdHlsZSgpLT53aGl0ZVNwYWNlKCkgOiBsYXN0LT5zdHlsZSgpLT53aGl0ZVNwYWNl
KCk7Ci0gICAgICAgIAorICAgICAgICBpc0Jsb2NrSW5zaWRlSW5saW5lID0gby0+aXNBbm9ueW1v
dXNJbmxpbmVCbG9jaygpOworCiAgICAgICAgIGJvb2wgYXV0b1dyYXAgPSBSZW5kZXJTdHlsZTo6
YXV0b1dyYXAoY3VycldTKTsKICAgICAgICAgYXV0b1dyYXBXYXNFdmVyVHJ1ZU9uTGluZSA9IGF1
dG9XcmFwV2FzRXZlclRydWVPbkxpbmUgfHwgYXV0b1dyYXA7CiAKQEAgLTE2NTksNyArMTQwNiw3
IEBAIElubGluZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpmaW5kTmV4dExpbmUKICNlbmRpZgogCiAg
ICAgICAgIGJvb2wgY29sbGFwc2VXaGl0ZVNwYWNlID0gUmVuZGVyU3R5bGU6OmNvbGxhcHNlV2hp
dGVTcGFjZShjdXJyV1MpOwotICAgICAgICAgICAgCisKICAgICAgICAgaWYgKG8tPmlzQlIoKSkg
ewogICAgICAgICAgICAgaWYgKHcgKyB0bXBXIDw9IHdpZHRoKSB7CiAgICAgICAgICAgICAgICAg
bEJyZWFrLm9iaiA9IG87CkBAIC0xNzY2LDggKzE1MTMsOSBAQCBJbmxpbmVJdGVyYXRvciBSZW5k
ZXJCbG9jazo6ZmluZE5leHRMaW5lCiAgICAgICAgIH0gZWxzZSBpZiAoby0+aXNSZXBsYWNlZCgp
KSB7CiAgICAgICAgICAgICBSZW5kZXJCb3gqIHJlcGxhY2VkQm94ID0gdG9SZW5kZXJCb3gobyk7
CiAKLSAgICAgICAgICAgIC8vIEJyZWFrIG9uIHJlcGxhY2VkIGVsZW1lbnRzIGlmIGVpdGhlciBo
YXMgbm9ybWFsIHdoaXRlLXNwYWNlLgotICAgICAgICAgICAgaWYgKChhdXRvV3JhcCB8fCBSZW5k
ZXJTdHlsZTo6YXV0b1dyYXAobGFzdFdTKSkgJiYgKCFvLT5pc0ltYWdlKCkgfHwgYWxsb3dJbWFn
ZXNUb0JyZWFrKSkgeworICAgICAgICAgICAgLy8gQnJlYWsgb24gcmVwbGFjZWQgZWxlbWVudHMg
aWYgZWl0aGVyIGhhcyBub3JtYWwgd2hpdGUtc3BhY2UuICBXZSBhbHNvIGFsd2F5cyBicmVhayBp
ZiB3ZQorICAgICAgICAgICAgLy8gZW5jb3VudGVyIGEgc3BlY2lhbCBhbm9ueW1vdXMgaW5saW5l
IGJsb2NrICh1c2VkIHRvIGhvbGQgYmxvY2tzIGluc2lkZSBpbmxpbmVzKS4KKyAgICAgICAgICAg
IGlmICgoYXV0b1dyYXAgfHwgUmVuZGVyU3R5bGU6OmF1dG9XcmFwKGxhc3RXUykgfHwgaXNCbG9j
a0luc2lkZUlubGluZSkgICYmICghby0+aXNJbWFnZSgpIHx8IGFsbG93SW1hZ2VzVG9CcmVhaykp
IHsKICAgICAgICAgICAgICAgICB3ICs9IHRtcFc7CiAgICAgICAgICAgICAgICAgdG1wVyA9IDA7
CiAgICAgICAgICAgICAgICAgbEJyZWFrLm9iaiA9IG87CkBAIC0xNzc1LDYgKzE1MjMsMTkgQEAg
SW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6OmZpbmROZXh0TGluZQogICAgICAgICAgICAgICAg
IGxCcmVhay5uZXh0QnJlYWthYmxlUG9zaXRpb24gPSAtMTsKICAgICAgICAgICAgIH0KIAorICAg
ICAgICAgICAgaWYgKGlzQmxvY2tJbnNpZGVJbmxpbmUpIHsKKyAgICAgICAgICAgICAgICBpZiAo
IWlzTGluZUVtcHR5KQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKworICAgICAgICAg
ICAgICAgIC8vIFJlc2V0IHRoZSB3aWR0aCB0byBpZ25vcmUgZmxvYXRzLCBzaW5jZSB3ZSdyZSBn
b2luZyB0byBhbGxvdyB0aGVtIHRvIGludHJ1ZGUgaW50byBvdXIgc3BhY2UuCisgICAgICAgICAg
ICAgICAgd2lkdGggPSByaWdodE9mZnNldCgpIC0gbGVmdE9mZnNldCgpOworCisgICAgICAgICAg
ICAgICAgLy8gRklYTUU6IFRoaXMgY2FsbCB3aWxsIHVwZGF0ZSB0aGUgaGVpZ2h0IG9mIG91ciBi
bG9jay4gIEl0J3Mgbm90IGNsZWFyIGlmIHRoYXQncyBnb2luZyB0byBiZSBvayBvciBub3QgeWV0
LgorICAgICAgICAgICAgICAgIGxheW91dEJsb2NrQ2hpbGQocmVwbGFjZWRCb3gsIG1hcmdpbklu
Zm8sIHByZXZpb3VzQmxvY2tGbG9hdEJvdHRvbSwgbWF4QmxvY2tGbG9hdEJvdHRvbSk7CisKKyAg
ICAgICAgICAgICAgICBsaW5lTWlkcG9pbnRTdGF0ZS5iZXR3ZWVuTWlkcG9pbnRzID0gZmFsc2U7
CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChpZ25vcmluZ1NwYWNlcykKICAgICAg
ICAgICAgICAgICBhZGRNaWRwb2ludChsaW5lTWlkcG9pbnRTdGF0ZSwgSW5saW5lSXRlcmF0b3Io
MCwgbywgMCkpOwogCkBAIC0xNzk4LDYgKzE1NTksMTUgQEAgSW5saW5lSXRlcmF0b3IgUmVuZGVy
QmxvY2s6OmZpbmROZXh0TGluZQogICAgICAgICAgICAgICAgICAgICB0bXBXICs9IHJlcGxhY2Vk
Qm94LT53aWR0aCgpICsgcmVwbGFjZWRCb3gtPm1hcmdpbkxlZnQoKSArIHJlcGxhY2VkQm94LT5t
YXJnaW5SaWdodCgpICsgaW5saW5lV2lkdGgobyk7CiAgICAgICAgICAgICB9IGVsc2UKICAgICAg
ICAgICAgICAgICB0bXBXICs9IHJlcGxhY2VkQm94LT53aWR0aCgpICsgcmVwbGFjZWRCb3gtPm1h
cmdpbkxlZnQoKSArIHJlcGxhY2VkQm94LT5tYXJnaW5SaWdodCgpICsgaW5saW5lV2lkdGgobyk7
CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoaXNCbG9ja0luc2lkZUlubGluZSkg
eworICAgICAgICAgICAgICAgIHcgKz0gdG1wVzsKKyAgICAgICAgICAgICAgICB0bXBXID0gMDsK
KyAgICAgICAgICAgICAgICBsQnJlYWsub2JqID0gbzsKKyAgICAgICAgICAgICAgICBsQnJlYWsu
cG9zID0gMDsKKyAgICAgICAgICAgICAgICBsQnJlYWsubmV4dEJyZWFrYWJsZVBvc2l0aW9uID0g
LTE7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICB9CiAgICAgICAgIH0g
ZWxzZSBpZiAoby0+aXNUZXh0KCkpIHsKICAgICAgICAgICAgIGlmICghcG9zKQogICAgICAgICAg
ICAgICAgIGFwcGxpZWRTdGFydFdpZHRoID0gZmFsc2U7CkBAIC0yMTkxLDcgKzE5NjEsNyBAQCBJ
bmxpbmVJdGVyYXRvciBSZW5kZXJCbG9jazo6ZmluZE5leHRMaW5lCiAgICAgICAgIH0KICAgICAg
ICAgLy9lbHNlIGlmIChsQnJlYWsucG9zID4gMCkKICAgICAgICAgLy8gICAgbEJyZWFrLnBvcy0t
OwotICAgICAgICBlbHNlIGlmIChsQnJlYWsub2JqID09IDAgJiYgdHJhaWxpbmdTcGFjZU9iamVj
dC0+aXNUZXh0KCkpIHsKKyAgICAgICAgZWxzZSBpZiAoKCFsQnJlYWsub2JqIHx8IGxCcmVhay5v
YmotPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkgJiYgdHJhaWxpbmdTcGFjZU9iamVjdC0+aXNU
ZXh0KCkpIHsKICAgICAgICAgICAgIC8vIEFkZCBhIG5ldyBlbmQgbWlkcG9pbnQgdGhhdCBzdG9w
cyByaWdodCBhdCB0aGUgdmVyeSBlbmQuCiAgICAgICAgICAgICBSZW5kZXJUZXh0KiB0ZXh0ID0g
dG9SZW5kZXJUZXh0KHRyYWlsaW5nU3BhY2VPYmplY3QpOwogICAgICAgICAgICAgdW5zaWduZWQg
bGVuZ3RoID0gdGV4dC0+dGV4dExlbmd0aCgpOwpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVu
ZGVyQm94LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCb3guY3Bw
CShyZXZpc2lvbiA1NDUwMSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJveC5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTEzMzQsNyArMTMzNCw3IEBAIHZvaWQgUmVuZGVyQm94OjpjYWxjV2lk
dGgoKQogICAgIH0KIAogICAgIGlmIChjb250YWluZXJXaWR0aCAmJiBjb250YWluZXJXaWR0aCAh
PSAod2lkdGgoKSArIG1fbWFyZ2luTGVmdCArIG1fbWFyZ2luUmlnaHQpCi0gICAgICAgICAgICAm
JiAhaXNGbG9hdGluZygpICYmICFpc0lubGluZSgpICYmICFjYi0+aXNGbGV4aWJsZUJveCgpKSB7
CisgICAgICAgICAgICAmJiAhaXNGbG9hdGluZygpICYmICghaXNJbmxpbmUoKSB8fCBpc0Fub255
bW91c0lubGluZUJsb2NrKCkpICYmICFjYi0+aXNGbGV4aWJsZUJveCgpKSB7CiAgICAgICAgIGlm
IChjYi0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkgPT0gTFRSKQogICAgICAgICAgICAgbV9tYXJnaW5S
aWdodCA9IGNvbnRhaW5lcldpZHRoIC0gd2lkdGgoKSAtIG1fbWFyZ2luTGVmdDsKICAgICAgICAg
ZWxzZQpAQCAtMTM3Myw3ICsxMzczLDcgQEAgYm9vbCBSZW5kZXJCb3g6OnNpemVzVG9JbnRyaW5z
aWNXaWR0aChXaQogewogICAgIC8vIE1hcnF1ZWVzIGluIFdpbklFIGFyZSBsaWtlIGEgbWl4dHVy
ZSBvZiBibG9ja3MgYW5kIGlubGluZS1ibG9ja3MuICBUaGV5IHNpemUgYXMgdGhvdWdoIHRoZXkn
cmUgYmxvY2tzLAogICAgIC8vIGJ1dCB0aGV5IGFsbG93IHRleHQgdG8gc2l0IG9uIHRoZSBzYW1l
IGxpbmUgYXMgdGhlIG1hcnF1ZWUuCi0gICAgaWYgKGlzRmxvYXRpbmcoKSB8fCAoaXNJbmxpbmVC
bG9ja09ySW5saW5lVGFibGUoKSAmJiAhaXNIVE1MTWFycXVlZSgpKSkKKyAgICBpZiAoaXNGbG9h
dGluZygpIHx8IChpc0lubGluZUJsb2NrT3JJbmxpbmVUYWJsZSgpICYmICFpc0hUTUxNYXJxdWVl
KCkgJiYgIWlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkpCiAgICAgICAgIHJldHVybiB0cnVlOwog
CiAgICAgLy8gVGhpcyBjb2RlIG1heSBsb29rIGEgYml0IHN0cmFuZ2UuICBCYXNpY2FsbHkgd2lk
dGg6aW50cmluc2ljIHNob3VsZCBjbGFtcCB0aGUgc2l6ZSB3aGVuIHRlc3RpbmcgYm90aApAQCAt
MjgxOSw3ICsyODE5LDcgQEAgYm9vbCBSZW5kZXJCb3g6OnNocmlua1RvQXZvaWRGbG9hdHMoKSBj
bwogCiBib29sIFJlbmRlckJveDo6YXZvaWRzRmxvYXRzKCkgY29uc3QKIHsKLSAgICByZXR1cm4g
aXNSZXBsYWNlZCgpIHx8IGhhc092ZXJmbG93Q2xpcCgpIHx8IGlzSFIoKTsKKyAgICByZXR1cm4g
IWlzQW5vbnltb3VzSW5saW5lQmxvY2soKSAmJiAoaXNSZXBsYWNlZCgpIHx8IGhhc092ZXJmbG93
Q2xpcCgpIHx8IGlzSFIoKSk7CiB9CiAKIHZvaWQgUmVuZGVyQm94OjphZGRTaGFkb3dPdmVyZmxv
dygpCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJJbmxpbmUuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlcklubGluZS5jcHAJKHJldmlzaW9uIDU0NTAxKQor
KysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVySW5saW5lLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
NDQsNyArNDQsNiBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIFJlbmRlcklubGluZTo6UmVuZGVy
SW5saW5lKE5vZGUqIG5vZGUpCiAgICAgOiBSZW5kZXJCb3hNb2RlbE9iamVjdChub2RlKQotICAg
ICwgbV9jb250aW51YXRpb24oMCkKICAgICAsIG1fbGluZUhlaWdodCgtMSkKICAgICAsIG1fdmVy
dGljYWxQb3NpdGlvbihQb3NpdGlvblVuZGVmaW5lZCkKIHsKQEAgLTU2LDE0ICs1NSw2IEBAIHZv
aWQgUmVuZGVySW5saW5lOjpkZXN0cm95KCkKICAgICAvLyBNYWtlIHN1cmUgdG8gZGVzdHJveSBh
bm9ueW1vdXMgY2hpbGRyZW4gZmlyc3Qgd2hpbGUgdGhleSBhcmUgc3RpbGwgY29ubmVjdGVkIHRv
IHRoZSByZXN0IG9mIHRoZSB0cmVlLCBzbyB0aGF0IHRoZXkgd2lsbAogICAgIC8vIHByb3Blcmx5
IGRpcnR5IGxpbmUgYm94ZXMgdGhhdCB0aGV5IGFyZSByZW1vdmVkIGZyb20uICBFZmZlY3RzIHRo
YXQgZG8gOmJlZm9yZS86YWZ0ZXIgb25seSBvbiBob3ZlciBjb3VsZCBjcmFzaCBvdGhlcndpc2Uu
CiAgICAgY2hpbGRyZW4oKS0+ZGVzdHJveUxlZnRvdmVyQ2hpbGRyZW4oKTsKLQotICAgIC8vIERl
c3Ryb3kgb3VyIGNvbnRpbnVhdGlvbiBiZWZvcmUgYW55dGhpbmcgb3RoZXIgdGhhbiBhbm9ueW1v
dXMgY2hpbGRyZW4uCi0gICAgLy8gVGhlIHJlYXNvbiB3ZSBkb24ndCBkZXN0cm95IGl0IGJlZm9y
ZSBhbm9ueW1vdXMgY2hpbGRyZW4gaXMgdGhhdCB0aGV5IG1heQotICAgIC8vIGhhdmUgY29udGlu
dWF0aW9ucyBvZiB0aGVpciBvd24gdGhhdCBhcmUgYW5vbnltb3VzIGNoaWxkcmVuIG9mIG91ciBj
b250aW51YXRpb24uCi0gICAgaWYgKG1fY29udGludWF0aW9uKSB7Ci0gICAgICAgIG1fY29udGlu
dWF0aW9uLT5kZXN0cm95KCk7Ci0gICAgICAgIG1fY29udGludWF0aW9uID0gMDsKLSAgICB9CiAg
ICAgCiAgICAgaWYgKCFkb2N1bWVudEJlaW5nRGVzdHJveWVkKCkpIHsKICAgICAgICAgaWYgKGZp
cnN0TGluZUJveCgpKSB7CkBAIC05MiwxMyArODMsNiBAQCB2b2lkIFJlbmRlcklubGluZTo6ZGVz
dHJveSgpCiAgICAgUmVuZGVyQm94TW9kZWxPYmplY3Q6OmRlc3Ryb3koKTsKIH0KIAotUmVuZGVy
SW5saW5lKiBSZW5kZXJJbmxpbmU6OmlubGluZUNvbnRpbnVhdGlvbigpIGNvbnN0Ci17Ci0gICAg
aWYgKCFtX2NvbnRpbnVhdGlvbiB8fCBtX2NvbnRpbnVhdGlvbi0+aXNJbmxpbmUoKSkKLSAgICAg
ICAgcmV0dXJuIHRvUmVuZGVySW5saW5lKG1fY29udGludWF0aW9uKTsKLSAgICByZXR1cm4gdG9S
ZW5kZXJCbG9jayhtX2NvbnRpbnVhdGlvbiktPmlubGluZUNvbnRpbnVhdGlvbigpOwotfQotCiB2
b2lkIFJlbmRlcklubGluZTo6dXBkYXRlQm94TW9kZWxJbmZvRnJvbVN0eWxlKCkKIHsKICAgICBS
ZW5kZXJCb3hNb2RlbE9iamVjdDo6dXBkYXRlQm94TW9kZWxJbmZvRnJvbVN0eWxlKCk7CkBAIC0x
MTQsMTkgKzk4LDYgQEAgdm9pZCBSZW5kZXJJbmxpbmU6OnN0eWxlRGlkQ2hhbmdlKFN0eWxlRAog
ewogICAgIFJlbmRlckJveE1vZGVsT2JqZWN0OjpzdHlsZURpZENoYW5nZShkaWZmLCBvbGRTdHls
ZSk7CiAKLSAgICAvLyBFbnN1cmUgdGhhdCBhbGwgb2YgdGhlIHNwbGl0IGlubGluZXMgcGljayB1
cCB0aGUgbmV3IHN0eWxlLiBXZQotICAgIC8vIG9ubHkgZG8gdGhpcyBpZiB3ZSdyZSBhbiBpbmxp
bmUsIHNpbmNlIHdlIGRvbid0IHdhbnQgdG8gcHJvcGFnYXRlCi0gICAgLy8gYSBibG9jaydzIHN0
eWxlIHRvIHRoZSBvdGhlciBpbmxpbmVzLgotICAgIC8vIGUuZy4sIDxmb250PmZvbyA8aDQ+Z29v
PC9oND4gbW9vPC9mb250Pi4gIFRoZSA8Zm9udD4gaW5saW5lcyBiZWZvcmUKLSAgICAvLyBhbmQg
YWZ0ZXIgdGhlIGJsb2NrIHNoYXJlIHRoZSBzYW1lIHN0eWxlLCBidXQgdGhlIGJsb2NrIGRvZXNu
J3QKLSAgICAvLyBuZWVkIHRvIHBhc3MgaXRzIHN0eWxlIG9uIHRvIGFueW9uZSBlbHNlLgotICAg
IGZvciAoUmVuZGVySW5saW5lKiBjdXJyQ29udCA9IGlubGluZUNvbnRpbnVhdGlvbigpOyBjdXJy
Q29udDsgY3VyckNvbnQgPSBjdXJyQ29udC0+aW5saW5lQ29udGludWF0aW9uKCkpIHsKLSAgICAg
ICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIG5leHRDb250ID0gY3VyckNvbnQtPmNvbnRpbnVhdGlv
bigpOwotICAgICAgICBjdXJyQ29udC0+c2V0Q29udGludWF0aW9uKDApOwotICAgICAgICBjdXJy
Q29udC0+c2V0U3R5bGUoc3R5bGUoKSk7Ci0gICAgICAgIGN1cnJDb250LT5zZXRDb250aW51YXRp
b24obmV4dENvbnQpOwotICAgIH0KLQogICAgIG1fbGluZUhlaWdodCA9IC0xOwogCiAgICAgLy8g
VXBkYXRlIHBzZXVkb3MgZm9yIDpiZWZvcmUgYW5kIDphZnRlciBub3cuCkBAIC0xMzYsNzkgKzEw
Nyw3MyBAQCB2b2lkIFJlbmRlcklubGluZTo6c3R5bGVEaWRDaGFuZ2UoU3R5bGVECiAgICAgfQog
fQogCi12b2lkIFJlbmRlcklubGluZTo6YWRkQ2hpbGQoUmVuZGVyT2JqZWN0KiBuZXdDaGlsZCwg
UmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCkKLXsKLSAgICBpZiAoY29udGludWF0aW9uKCkpCi0g
ICAgICAgIHJldHVybiBhZGRDaGlsZFRvQ29udGludWF0aW9uKG5ld0NoaWxkLCBiZWZvcmVDaGls
ZCk7Ci0gICAgcmV0dXJuIGFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24obmV3Q2hpbGQsIGJl
Zm9yZUNoaWxkKTsKLX0KLQotc3RhdGljIFJlbmRlckJveE1vZGVsT2JqZWN0KiBuZXh0Q29udGlu
dWF0aW9uKFJlbmRlck9iamVjdCogcmVuZGVyZXIpCit2b2lkIFJlbmRlcklubGluZTo6Y2hpbGRC
ZWNhbWVOb25JbmxpbmUoUmVuZGVyT2JqZWN0KiBjaGlsZCkKIHsKLSAgICBpZiAocmVuZGVyZXIt
PmlzSW5saW5lKCkgJiYgIXJlbmRlcmVyLT5pc1JlcGxhY2VkKCkpCi0gICAgICAgIHJldHVybiB0
b1JlbmRlcklubGluZShyZW5kZXJlciktPmNvbnRpbnVhdGlvbigpOwotICAgIHJldHVybiB0b1Jl
bmRlckJsb2NrKHJlbmRlcmVyKS0+aW5saW5lQ29udGludWF0aW9uKCk7CisgICAgUmVuZGVyT2Jq
ZWN0KiBuZXh0ID0gY2hpbGQtPm5leHRTaWJsaW5nKCk7CisgICAgcmVtb3ZlQ2hpbGQoY2hpbGQp
OworICAgIGFkZENoaWxkKGNoaWxkLCBuZXh0KTsKIH0KIAotUmVuZGVyQm94TW9kZWxPYmplY3Qq
IFJlbmRlcklubGluZTo6Y29udGludWF0aW9uQmVmb3JlKFJlbmRlck9iamVjdCogYmVmb3JlQ2hp
bGQpCi17Ci0gICAgaWYgKGJlZm9yZUNoaWxkICYmIGJlZm9yZUNoaWxkLT5wYXJlbnQoKSA9PSB0
aGlzKQotICAgICAgICByZXR1cm4gdGhpczsKLQotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBj
dXJyID0gbmV4dENvbnRpbnVhdGlvbih0aGlzKTsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCog
bmV4dFRvTGFzdCA9IHRoaXM7Ci0gICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGxhc3QgPSB0aGlz
OwotICAgIHdoaWxlIChjdXJyKSB7Ci0gICAgICAgIGlmIChiZWZvcmVDaGlsZCAmJiBiZWZvcmVD
aGlsZC0+cGFyZW50KCkgPT0gY3VycikgewotICAgICAgICAgICAgaWYgKGN1cnItPmZpcnN0Q2hp
bGQoKSA9PSBiZWZvcmVDaGlsZCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbGFzdDsKLSAgICAg
ICAgICAgIHJldHVybiBjdXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgbmV4dFRvTGFzdCA9IGxh
c3Q7Ci0gICAgICAgIGxhc3QgPSBjdXJyOwotICAgICAgICBjdXJyID0gbmV4dENvbnRpbnVhdGlv
bihjdXJyKTsKLSAgICB9Ci0KLSAgICBpZiAoIWJlZm9yZUNoaWxkICYmICFsYXN0LT5maXJzdENo
aWxkKCkpCi0gICAgICAgIHJldHVybiBuZXh0VG9MYXN0OwotICAgIHJldHVybiBsYXN0OwotfQot
Ci12b2lkIFJlbmRlcklubGluZTo6YWRkQ2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihSZW5kZXJP
YmplY3QqIG5ld0NoaWxkLCBSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkKQordm9pZCBSZW5kZXJJ
bmxpbmU6OmFkZENoaWxkKFJlbmRlck9iamVjdCogbmV3Q2hpbGQsIFJlbmRlck9iamVjdCogYmVm
b3JlQ2hpbGQpCiB7CiAgICAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IGFwcGVuZCB0aGluZ3MgYWZ0
ZXIgOmFmdGVyLWdlbmVyYXRlZCBjb250ZW50IGlmIHdlIGhhdmUgaXQuCiAgICAgaWYgKCFiZWZv
cmVDaGlsZCAmJiBpc0FmdGVyQ29udGVudChsYXN0Q2hpbGQoKSkpCiAgICAgICAgIGJlZm9yZUNo
aWxkID0gbGFzdENoaWxkKCk7CiAKLSAgICBpZiAoIW5ld0NoaWxkLT5pc0lubGluZSgpICYmICFu
ZXdDaGlsZC0+aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpKSB7Ci0gICAgICAgIC8vIFdlIGFyZSBw
bGFjaW5nIGEgYmxvY2sgaW5zaWRlIGFuIGlubGluZS4gV2UgaGF2ZSB0byBwZXJmb3JtIGEgc3Bs
aXQgb2YgdGhpcwotICAgICAgICAvLyBpbmxpbmUgaW50byBjb250aW51YXRpb25zLiAgVGhpcyBp
bnZvbHZlcyBjcmVhdGluZyBhbiBhbm9ueW1vdXMgYmxvY2sgYm94IHRvIGhvbGQKLSAgICAgICAg
Ly8gfG5ld0NoaWxkfC4gIFdlIHRoZW4gbWFrZSB0aGF0IGJsb2NrIGJveCBhIGNvbnRpbnVhdGlv
biBvZiB0aGlzIGlubGluZS4gIFdlIHRha2UgYWxsIG9mCi0gICAgICAgIC8vIHRoZSBjaGlsZHJl
biBhZnRlciB8YmVmb3JlQ2hpbGR8IGFuZCBwdXQgdGhlbSBpbiBhIGNsb25lIG9mIHRoaXMgb2Jq
ZWN0LgotICAgICAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IG5ld1N0eWxlID0gUmVuZGVyU3R5bGU6
OmNyZWF0ZSgpOwotICAgICAgICBuZXdTdHlsZS0+aW5oZXJpdEZyb20oc3R5bGUoKSk7Ci0gICAg
ICAgIG5ld1N0eWxlLT5zZXREaXNwbGF5KEJMT0NLKTsKLQotICAgICAgICBSZW5kZXJCbG9jayog
bmV3Qm94ID0gbmV3IChyZW5kZXJBcmVuYSgpKSBSZW5kZXJCbG9jayhkb2N1bWVudCgpIC8qIGFu
b255bW91cyBib3ggKi8pOwotICAgICAgICBuZXdCb3gtPnNldFN0eWxlKG5ld1N0eWxlLnJlbGVh
c2UoKSk7Ci0gICAgICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBvbGRDb250aW51YXRpb24gPSBj
b250aW51YXRpb24oKTsKLSAgICAgICAgc2V0Q29udGludWF0aW9uKG5ld0JveCk7Ci0KLSAgICAg
ICAgLy8gU29tZW9uZSBtYXkgaGF2ZSBwdXQgYSA8cD4gaW5zaWRlIGEgPHE+LCBjYXVzaW5nIGEg
c3BsaXQuICBXaGVuIHRoaXMgaGFwcGVucywgdGhlIDphZnRlciBjb250ZW50Ci0gICAgICAgIC8v
IGhhcyB0byBtb3ZlIGludG8gdGhlIGlubGluZSBjb250aW51YXRpb24uICBDYWxsIHVwZGF0ZUJl
Zm9yZUFmdGVyQ29udGVudCB0byBlbnN1cmUgdGhhdCBvdXIgOmFmdGVyCi0gICAgICAgIC8vIGNv
bnRlbnQgZ2V0cyBwcm9wZXJseSBkZXN0cm95ZWQuCi0gICAgICAgIGJvb2wgaXNMYXN0Q2hpbGQg
PSAoYmVmb3JlQ2hpbGQgPT0gbGFzdENoaWxkKCkpOwotICAgICAgICBpZiAoZG9jdW1lbnQoKS0+
dXNlc0JlZm9yZUFmdGVyUnVsZXMoKSkKLSAgICAgICAgICAgIGNoaWxkcmVuKCktPnVwZGF0ZUJl
Zm9yZUFmdGVyQ29udGVudCh0aGlzLCBBRlRFUik7Ci0gICAgICAgIGlmIChpc0xhc3RDaGlsZCAm
JiBiZWZvcmVDaGlsZCAhPSBsYXN0Q2hpbGQoKSkKLSAgICAgICAgICAgIGJlZm9yZUNoaWxkID0g
MDsgLy8gV2UgZGVzdHJveWVkIHRoZSBsYXN0IGNoaWxkLCBzbyBub3cgd2UgbmVlZCB0byB1cGRh
dGUgb3VyIGluc2VydGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb2ludCB0
byBiZSAwLiAgSXQncyBqdXN0IGEgc3RyYWlnaHQgYXBwZW5kIG5vdy4KLQotICAgICAgICBzcGxp
dEZsb3coYmVmb3JlQ2hpbGQsIG5ld0JveCwgbmV3Q2hpbGQsIG9sZENvbnRpbnVhdGlvbik7Cisg
ICAgLy8gSWYgdGhlIHJlcXVlc3RlZCBiZWZvcmVDaGlsZCBpcyBub3Qgb25lIG9mIG91ciBjaGls
ZHJlbiwgdGhlbiB0aGlzIGlzIG1vc3QgbGlrZWx5IGJlY2F1c2UKKyAgICAvLyB0aGVyZSBpcyBh
biBhbm9ueW1vdXMgaW5saW5lLWJsb2NrIGJveCB3aXRoaW4gdGhpcyBvYmplY3QgdGhhdCBjb250
YWlucyB0aGUgYmVmb3JlQ2hpbGQuIFNvCisgICAgLy8ganVzdCBpbnNlcnQgdGhlIGNoaWxkIGlu
dG8gdGhlIGFub255bW91cyBpbmxpbmUtYmxvY2sgYm94IGluc3RlYWQgb2YgaGVyZS4KKyAgICAv
LyBBIHNlY29uZCBwb3NzaWJpbGl0eSBpcyB0aGF0IHRoZSBiZWZvcmVDaGlsZCBpcyBhbiBhbm9u
eW1vdXMgYmxvY2sgaW5zaWRlIHRoZSBhbm9ueW1vdXMgaW5saW5lIGJsb2NrLgorICAgIC8vIFRo
aXMgY2FuIGhhcHBlbiBpZiBpbmxpbmVzIGFyZSBpbnNlcnRlZCBpbiBiZXR3ZWVuIHR3byBvZiB0
aGUgYW5vbnltb3VzIGlubGluZSBibG9jaydzIGJsb2NrLWxldmVsCisgICAgLy8gY2hpbGRyZW4g
YWZ0ZXIgaXQgaGFzIGJlZW4gY3JlYXRlZC4KKyAgICBpZiAoYmVmb3JlQ2hpbGQgJiYgYmVmb3Jl
Q2hpbGQtPnBhcmVudCgpICE9IHRoaXMpIHsKKyAgICAgICAgQVNTRVJUKGJlZm9yZUNoaWxkLT5w
YXJlbnQoKSk7CisgICAgICAgIEFTU0VSVChiZWZvcmVDaGlsZC0+cGFyZW50KCktPmlzQW5vbnlt
b3VzSW5saW5lQmxvY2soKSB8fCBiZWZvcmVDaGlsZC0+cGFyZW50KCktPmlzQW5vbnltb3VzQmxv
Y2soKSk7CisgICAgICAgIGlmIChiZWZvcmVDaGlsZC0+cGFyZW50KCktPmlzQW5vbnltb3VzSW5s
aW5lQmxvY2soKSkgeworICAgICAgICAgICAgaWYgKCFuZXdDaGlsZC0+aXNJbmxpbmUoKSB8fCAo
bmV3Q2hpbGQtPmlzSW5saW5lKCkgJiYgYmVmb3JlQ2hpbGQtPnBhcmVudCgpLT5maXJzdENoaWxk
KCkgIT0gYmVmb3JlQ2hpbGQpKQorICAgICAgICAgICAgICAgIGJlZm9yZUNoaWxkLT5wYXJlbnQo
KS0+YWRkQ2hpbGQobmV3Q2hpbGQsIGJlZm9yZUNoaWxkKTsKKyAgICAgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgICAgICBhZGRDaGlsZChuZXdDaGlsZCwgYmVmb3JlQ2hpbGQtPnBhcmVudCgpKTsK
KyAgICAgICAgfSBlbHNlIGlmIChiZWZvcmVDaGlsZC0+cGFyZW50KCktPmlzQW5vbnltb3VzQmxv
Y2soKSkgeworICAgICAgICAgICAgQVNTRVJUKCFiZWZvcmVDaGlsZC0+cGFyZW50KCktPnBhcmVu
dCgpIHx8IGJlZm9yZUNoaWxkLT5wYXJlbnQoKS0+cGFyZW50KCktPmlzQW5vbnltb3VzSW5saW5l
QmxvY2soKSk7CisgICAgICAgICAgICBBU1NFUlQoYmVmb3JlQ2hpbGQtPmlzSW5saW5lKCkpOwor
ICAgICAgICAgICAgaWYgKG5ld0NoaWxkLT5pc0lubGluZSgpIHx8ICghbmV3Q2hpbGQtPmlzSW5s
aW5lKCkgJiYgYmVmb3JlQ2hpbGQtPnBhcmVudCgpLT5maXJzdENoaWxkKCkgIT0gYmVmb3JlQ2hp
bGQpKQorICAgICAgICAgICAgICAgIGJlZm9yZUNoaWxkLT5wYXJlbnQoKS0+YWRkQ2hpbGQobmV3
Q2hpbGQsIGJlZm9yZUNoaWxkKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBh
ZGRDaGlsZChuZXdDaGlsZCwgYmVmb3JlQ2hpbGQtPnBhcmVudCgpKTsKKyAgICAgICAgfQogICAg
ICAgICByZXR1cm47CiAgICAgfQogCisgICAgaWYgKCFuZXdDaGlsZC0+aXNJbmxpbmUoKSkgewor
ICAgICAgICAvLyBXZSBhcmUgcGxhY2luZyBhIGJsb2NrIGluc2lkZSBhbiBpbmxpbmUuIFdlIGhh
dmUgdG8gcGxhY2UgdGhlIGJsb2NrIGluc2lkZSBhbiBhbm9ueW1vdXMgaW5saW5lLWJsb2NrLgor
ICAgICAgICAvLyBUaGlzIGlubGluZS1ibG9jayBjYW4gaG91c2UgYSBzZXF1ZW5jZSBvZiBjb250
aWd1b3VzIGJsb2NrLWxldmVsIGNoaWxkcmVuLCBhbmQgdGhleSB3aWxsIGFsbCBzaXQgb24gdGhl
CisgICAgICAgIC8vIHNhbWUgbGluZSB0b2dldGhlci4gIFdlIHRyeSB0byByZXVzZSBvbmUgZmly
c3QgaWYgcG9zc2libGUuCisgICAgICAgIGlmIChiZWZvcmVDaGlsZCkgeworICAgICAgICAgICAg
aWYgKGJlZm9yZUNoaWxkLT5wcmV2aW91c1NpYmxpbmcoKSAmJiBiZWZvcmVDaGlsZC0+cHJldmlv
dXNTaWJsaW5nKCktPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkgeworICAgICAgICAgICAgICAg
IGJlZm9yZUNoaWxkLT5wcmV2aW91c1NpYmxpbmcoKS0+YWRkQ2hpbGQobmV3Q2hpbGQpOworICAg
ICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgICAgIGlmIChsYXN0Q2hpbGQoKSAmJiBsYXN0Q2hpbGQoKS0+aXNBbm9ueW1vdXNJbmxp
bmVCbG9jaygpKSB7CisgICAgICAgICAgICAgICAgbGFzdENoaWxkKCktPmFkZENoaWxkKG5ld0No
aWxkKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0K
KyAKKyAgICAgICAgaWYgKCFuZXdDaGlsZC0+aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpKSB7Cisg
ICAgICAgICAgICAvLyBUaGVyZSB3YXMgbm8gc3VpdGFibGUgZXhpc3RpbmcgYW5vbnltb3VzIGJv
eC4gIENyZWF0ZSBhIG5ldyBvbmUuCisgICAgICAgICAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IG5l
d1N0eWxlID0gUmVuZGVyU3R5bGU6OmNyZWF0ZSgpOworICAgICAgICAgICAgbmV3U3R5bGUtPmlu
aGVyaXRGcm9tKHN0eWxlKCkpOworICAgICAgICAgICAgbmV3U3R5bGUtPnNldERpc3BsYXkoSU5M
SU5FX0JMT0NLKTsKKyAgICAgICAgICAgIFJlbmRlckJsb2NrKiBuZXdCb3ggPSBuZXcgKHJlbmRl
ckFyZW5hKCkpIFJlbmRlckJsb2NrKGRvY3VtZW50KCkpOworICAgICAgICAgICAgbmV3Qm94LT5z
ZXRTdHlsZShuZXdTdHlsZSk7CisgICAgICAgICAgICBSZW5kZXJCb3hNb2RlbE9iamVjdDo6YWRk
Q2hpbGQobmV3Qm94LCBiZWZvcmVDaGlsZCk7CisgICAgICAgICAgICBuZXdCb3gtPmFkZENoaWxk
KG5ld0NoaWxkKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKwogICAg
IFJlbmRlckJveE1vZGVsT2JqZWN0OjphZGRDaGlsZChuZXdDaGlsZCwgYmVmb3JlQ2hpbGQpOwog
CiAgICAgbmV3Q2hpbGQtPnNldE5lZWRzTGF5b3V0QW5kUHJlZldpZHRoc1JlY2FsYygpOwpAQCAt
MjIxLDE4OCArMTg2LDYgQEAgUmVuZGVySW5saW5lKiBSZW5kZXJJbmxpbmU6OmNsb25lSW5saW5l
KAogICAgIHJldHVybiBvOwogfQogCi12b2lkIFJlbmRlcklubGluZTo6c3BsaXRJbmxpbmVzKFJl
bmRlckJsb2NrKiBmcm9tQmxvY2ssIFJlbmRlckJsb2NrKiB0b0Jsb2NrLAotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBSZW5kZXJCbG9jayogbWlkZGxlQmxvY2ssCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQsIFJlbmRlckJv
eE1vZGVsT2JqZWN0KiBvbGRDb250KQotewotICAgIC8vIENyZWF0ZSBhIGNsb25lIG9mIHRoaXMg
aW5saW5lLgotICAgIFJlbmRlcklubGluZSogY2xvbmUgPSBjbG9uZUlubGluZSh0aGlzKTsKLSAg
ICBjbG9uZS0+c2V0Q29udGludWF0aW9uKG9sZENvbnQpOwotCi0gICAgLy8gTm93IHRha2UgYWxs
IG9mIHRoZSBjaGlsZHJlbiBmcm9tIGJlZm9yZUNoaWxkIHRvIHRoZSBlbmQgYW5kIHJlbW92ZQot
ICAgIC8vIHRoZW0gZnJvbSB8dGhpc3wgYW5kIHBsYWNlIHRoZW0gaW4gdGhlIGNsb25lLgotICAg
IFJlbmRlck9iamVjdCogbyA9IGJlZm9yZUNoaWxkOwotICAgIHdoaWxlIChvKSB7Ci0gICAgICAg
IFJlbmRlck9iamVjdCogdG1wID0gbzsKLSAgICAgICAgbyA9IHRtcC0+bmV4dFNpYmxpbmcoKTsK
LSAgICAgICAgY2xvbmUtPmFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24oY2hpbGRyZW4oKS0+
cmVtb3ZlQ2hpbGROb2RlKHRoaXMsIHRtcCksIDApOwotICAgICAgICB0bXAtPnNldE5lZWRzTGF5
b3V0QW5kUHJlZldpZHRoc1JlY2FsYygpOwotICAgIH0KLQotICAgIC8vIEhvb2sgfGNsb25lfCB1
cCBhcyB0aGUgY29udGludWF0aW9uIG9mIHRoZSBtaWRkbGUgYmxvY2suCi0gICAgbWlkZGxlQmxv
Y2stPnNldElubGluZUNvbnRpbnVhdGlvbihjbG9uZSk7Ci0KLSAgICAvLyBXZSBoYXZlIGJlZW4g
cmVwYXJlbnRlZCBhbmQgYXJlIG5vdyB1bmRlciB0aGUgZnJvbUJsb2NrLiAgV2UgbmVlZAotICAg
IC8vIHRvIHdhbGsgdXAgb3VyIGlubGluZSBwYXJlbnQgY2hhaW4gdW50aWwgd2UgaGl0IHRoZSBj
b250YWluaW5nIGJsb2NrLgotICAgIC8vIE9uY2Ugd2UgaGl0IHRoZSBjb250YWluaW5nIGJsb2Nr
IHdlJ3JlIGRvbmUuCi0gICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGN1cnIgPSB0b1JlbmRlckJv
eE1vZGVsT2JqZWN0KHBhcmVudCgpKTsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogY3VyckNo
aWxkID0gdGhpczsKLSAgICAKLSAgICAvLyBGSVhNRTogQmVjYXVzZSBzcGxpdHRpbmcgaXMgTyhu
XjIpIGFzIHRhZ3MgbmVzdCBwYXRob2xvZ2ljYWxseSwgd2UgY2FwIHRoZSBkZXB0aCBhdCB3aGlj
aCB3ZSdyZSB3aWxsaW5nIHRvIGNsb25lLgotICAgIC8vIFRoZXJlIHdpbGwgZXZlbnR1YWxseSBi
ZSBhIGJldHRlciBhcHByb2FjaCB0byB0aGlzIHByb2JsZW0gdGhhdCB3aWxsIGxldCB1cyBuZXN0
IHRvIGEgbXVjaAotICAgIC8vIGdyZWF0ZXIgZGVwdGggKHNlZSBidWd6aWxsYSBidWcgMTM0MzAp
IGJ1dCBmb3Igbm93IHdlIGhhdmUgYSBsaW1pdC4gIFRoaXMgKndpbGwqIHJlc3VsdCBpbgotICAg
IC8vIGluY29ycmVjdCByZW5kZXJpbmcsIGJ1dCB0aGUgYWx0ZXJuYXRpdmUgaXMgdG8gaGFuZyBm
b3JldmVyLgotICAgIHVuc2lnbmVkIHNwbGl0RGVwdGggPSAxOwotICAgIGNvbnN0IHVuc2lnbmVk
IGNNYXhTcGxpdERlcHRoID0gMjAwOyAKLSAgICB3aGlsZSAoY3VyciAmJiBjdXJyICE9IGZyb21C
bG9jaykgewotICAgICAgICBBU1NFUlQoY3Vyci0+aXNSZW5kZXJJbmxpbmUoKSk7Ci0gICAgICAg
IGlmIChzcGxpdERlcHRoIDwgY01heFNwbGl0RGVwdGgpIHsKLSAgICAgICAgICAgIC8vIENyZWF0
ZSBhIG5ldyBjbG9uZS4KLSAgICAgICAgICAgIFJlbmRlcklubGluZSogY2xvbmVDaGlsZCA9IGNs
b25lOwotICAgICAgICAgICAgY2xvbmUgPSBjbG9uZUlubGluZSh0b1JlbmRlcklubGluZShjdXJy
KSk7Ci0KLSAgICAgICAgICAgIC8vIEluc2VydCBvdXIgY2hpbGQgY2xvbmUgYXMgdGhlIGZpcnN0
IGNoaWxkLgotICAgICAgICAgICAgY2xvbmUtPmFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24o
Y2xvbmVDaGlsZCwgMCk7Ci0KLSAgICAgICAgICAgIC8vIEhvb2sgdGhlIGNsb25lIHVwIGFzIGEg
Y29udGludWF0aW9uIG9mIHxjdXJyfC4KLSAgICAgICAgICAgIFJlbmRlcklubGluZSogaW5saW5l
Q3VyciA9IHRvUmVuZGVySW5saW5lKGN1cnIpOwotICAgICAgICAgICAgb2xkQ29udCA9IGlubGlu
ZUN1cnItPmNvbnRpbnVhdGlvbigpOwotICAgICAgICAgICAgaW5saW5lQ3Vyci0+c2V0Q29udGlu
dWF0aW9uKGNsb25lKTsKLSAgICAgICAgICAgIGNsb25lLT5zZXRDb250aW51YXRpb24ob2xkQ29u
dCk7Ci0KLSAgICAgICAgICAgIC8vIFNvbWVvbmUgbWF5IGhhdmUgaW5kaXJlY3RseSBjYXVzZWQg
YSA8cT4gdG8gc3BsaXQuICBXaGVuIHRoaXMgaGFwcGVucywgdGhlIDphZnRlciBjb250ZW50Ci0g
ICAgICAgICAgICAvLyBoYXMgdG8gbW92ZSBpbnRvIHRoZSBpbmxpbmUgY29udGludWF0aW9uLiAg
Q2FsbCB1cGRhdGVCZWZvcmVBZnRlckNvbnRlbnQgdG8gZW5zdXJlIHRoYXQgdGhlIGlubGluZSdz
IDphZnRlcgotICAgICAgICAgICAgLy8gY29udGVudCBnZXRzIHByb3Blcmx5IGRlc3Ryb3llZC4K
LSAgICAgICAgICAgIGlmIChkb2N1bWVudCgpLT51c2VzQmVmb3JlQWZ0ZXJSdWxlcygpKQotICAg
ICAgICAgICAgICAgIGlubGluZUN1cnItPmNoaWxkcmVuKCktPnVwZGF0ZUJlZm9yZUFmdGVyQ29u
dGVudCh0aGlzLCBBRlRFUik7Ci0KLSAgICAgICAgICAgIC8vIE5vdyB3ZSBuZWVkIHRvIHRha2Ug
YWxsIG9mIHRoZSBjaGlsZHJlbiBzdGFydGluZyBmcm9tIHRoZSBmaXJzdCBjaGlsZAotICAgICAg
ICAgICAgLy8gKmFmdGVyKiBjdXJyQ2hpbGQgYW5kIGFwcGVuZCB0aGVtIGFsbCB0byB0aGUgY2xv
bmUuCi0gICAgICAgICAgICBvID0gY3VyckNoaWxkLT5uZXh0U2libGluZygpOwotICAgICAgICAg
ICAgd2hpbGUgKG8pIHsKLSAgICAgICAgICAgICAgICBSZW5kZXJPYmplY3QqIHRtcCA9IG87Ci0g
ICAgICAgICAgICAgICAgbyA9IHRtcC0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgICAgICAgICBj
bG9uZS0+YWRkQ2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihpbmxpbmVDdXJyLT5jaGlsZHJlbigp
LT5yZW1vdmVDaGlsZE5vZGUoY3VyciwgdG1wKSwgMCk7Ci0gICAgICAgICAgICAgICAgdG1wLT5z
ZXROZWVkc0xheW91dEFuZFByZWZXaWR0aHNSZWNhbGMoKTsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgfQotICAgICAgICAKLSAgICAgICAgLy8gS2VlcCB3YWxraW5nIHVwIHRoZSBjaGFpbi4KLSAg
ICAgICAgY3VyckNoaWxkID0gY3VycjsKLSAgICAgICAgY3VyciA9IHRvUmVuZGVyQm94TW9kZWxP
YmplY3QoY3Vyci0+cGFyZW50KCkpOwotICAgICAgICBzcGxpdERlcHRoKys7Ci0gICAgfQotCi0g
ICAgLy8gTm93IHdlIGFyZSBhdCB0aGUgYmxvY2sgbGV2ZWwuIFdlIG5lZWQgdG8gcHV0IHRoZSBj
bG9uZSBpbnRvIHRoZSB0b0Jsb2NrLgotICAgIHRvQmxvY2stPmNoaWxkcmVuKCktPmFwcGVuZENo
aWxkTm9kZSh0b0Jsb2NrLCBjbG9uZSk7Ci0KLSAgICAvLyBOb3cgdGFrZSBhbGwgdGhlIGNoaWxk
cmVuIGFmdGVyIGN1cnJDaGlsZCBhbmQgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgZnJvbUJsb2NrCi0g
ICAgLy8gYW5kIHB1dCB0aGVtIGluIHRoZSB0b0Jsb2NrLgotICAgIG8gPSBjdXJyQ2hpbGQtPm5l
eHRTaWJsaW5nKCk7Ci0gICAgd2hpbGUgKG8pIHsKLSAgICAgICAgUmVuZGVyT2JqZWN0KiB0bXAg
PSBvOwotICAgICAgICBvID0gdG1wLT5uZXh0U2libGluZygpOwotICAgICAgICB0b0Jsb2NrLT5j
aGlsZHJlbigpLT5hcHBlbmRDaGlsZE5vZGUodG9CbG9jaywgZnJvbUJsb2NrLT5jaGlsZHJlbigp
LT5yZW1vdmVDaGlsZE5vZGUoZnJvbUJsb2NrLCB0bXApKTsKLSAgICB9Ci19Ci0KLXZvaWQgUmVu
ZGVySW5saW5lOjpzcGxpdEZsb3coUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCwgUmVuZGVyQmxv
Y2sqIG5ld0Jsb2NrQm94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXJPYmpl
Y3QqIG5ld0NoaWxkLCBSZW5kZXJCb3hNb2RlbE9iamVjdCogb2xkQ29udCkKLXsKLSAgICBSZW5k
ZXJCbG9jayogcHJlID0gMDsKLSAgICBSZW5kZXJCbG9jayogYmxvY2sgPSBjb250YWluaW5nQmxv
Y2soKTsKLSAgICAKLSAgICAvLyBEZWxldGUgb3VyIGxpbmUgYm94ZXMgYmVmb3JlIHdlIGRvIHRo
ZSBpbmxpbmUgc3BsaXQgaW50byBjb250aW51YXRpb25zLgotICAgIGJsb2NrLT5kZWxldGVMaW5l
Qm94VHJlZSgpOwotICAgIAotICAgIGJvb2wgbWFkZU5ld0JlZm9yZUJsb2NrID0gZmFsc2U7Ci0g
ICAgaWYgKGJsb2NrLT5pc0Fub255bW91c0Jsb2NrKCkgJiYgKCFibG9jay0+cGFyZW50KCkgfHwg
IWJsb2NrLT5wYXJlbnQoKS0+Y3JlYXRlc0Fub255bW91c1dyYXBwZXIoKSkpIHsKLSAgICAgICAg
Ly8gV2UgY2FuIHJldXNlIHRoaXMgYmxvY2sgYW5kIG1ha2UgaXQgdGhlIHByZUJsb2NrIG9mIHRo
ZSBuZXh0IGNvbnRpbnVhdGlvbi4KLSAgICAgICAgcHJlID0gYmxvY2s7Ci0gICAgICAgIHByZS0+
cmVtb3ZlUG9zaXRpb25lZE9iamVjdHMoMCk7Ci0gICAgICAgIGJsb2NrID0gYmxvY2stPmNvbnRh
aW5pbmdCbG9jaygpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIE5vIGFub255bW91cyBibG9j
ayBhdmFpbGFibGUgZm9yIHVzZS4gIE1ha2Ugb25lLgotICAgICAgICBwcmUgPSBibG9jay0+Y3Jl
YXRlQW5vbnltb3VzQmxvY2soKTsKLSAgICAgICAgbWFkZU5ld0JlZm9yZUJsb2NrID0gdHJ1ZTsK
LSAgICB9Ci0KLSAgICBSZW5kZXJCbG9jayogcG9zdCA9IGJsb2NrLT5jcmVhdGVBbm9ueW1vdXNC
bG9jaygpOwotCi0gICAgUmVuZGVyT2JqZWN0KiBib3hGaXJzdCA9IG1hZGVOZXdCZWZvcmVCbG9j
ayA/IGJsb2NrLT5maXJzdENoaWxkKCkgOiBwcmUtPm5leHRTaWJsaW5nKCk7Ci0gICAgaWYgKG1h
ZGVOZXdCZWZvcmVCbG9jaykKLSAgICAgICAgYmxvY2stPmNoaWxkcmVuKCktPmluc2VydENoaWxk
Tm9kZShibG9jaywgcHJlLCBib3hGaXJzdCk7Ci0gICAgYmxvY2stPmNoaWxkcmVuKCktPmluc2Vy
dENoaWxkTm9kZShibG9jaywgbmV3QmxvY2tCb3gsIGJveEZpcnN0KTsKLSAgICBibG9jay0+Y2hp
bGRyZW4oKS0+aW5zZXJ0Q2hpbGROb2RlKGJsb2NrLCBwb3N0LCBib3hGaXJzdCk7Ci0gICAgYmxv
Y2stPnNldENoaWxkcmVuSW5saW5lKGZhbHNlKTsKLSAgICAKLSAgICBpZiAobWFkZU5ld0JlZm9y
ZUJsb2NrKSB7Ci0gICAgICAgIFJlbmRlck9iamVjdCogbyA9IGJveEZpcnN0OwotICAgICAgICB3
aGlsZSAobykgewotICAgICAgICAgICAgUmVuZGVyT2JqZWN0KiBubyA9IG87Ci0gICAgICAgICAg
ICBvID0gbm8tPm5leHRTaWJsaW5nKCk7Ci0gICAgICAgICAgICBwcmUtPmNoaWxkcmVuKCktPmFw
cGVuZENoaWxkTm9kZShwcmUsIGJsb2NrLT5jaGlsZHJlbigpLT5yZW1vdmVDaGlsZE5vZGUoYmxv
Y2ssIG5vKSk7Ci0gICAgICAgICAgICBuby0+c2V0TmVlZHNMYXlvdXRBbmRQcmVmV2lkdGhzUmVj
YWxjKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzcGxpdElubGluZXMocHJlLCBwb3N0LCBu
ZXdCbG9ja0JveCwgYmVmb3JlQ2hpbGQsIG9sZENvbnQpOwotCi0gICAgLy8gV2UgYWxyZWFkeSBr
bm93IHRoZSBuZXdCbG9ja0JveCBpc24ndCBnb2luZyB0byBjb250YWluIGlubGluZSBraWRzLCBz
byBhdm9pZCB3YXN0aW5nCi0gICAgLy8gdGltZSBpbiBtYWtlQ2hpbGRyZW5Ob25JbmxpbmUgYnkg
anVzdCBzZXR0aW5nIHRoaXMgZXhwbGljaXRseSB1cCBmcm9udC4KLSAgICBuZXdCbG9ja0JveC0+
c2V0Q2hpbGRyZW5JbmxpbmUoZmFsc2UpOwotCi0gICAgLy8gV2UgZGVsYXllZCBhZGRpbmcgdGhl
IG5ld0NoaWxkIHVudGlsIG5vdyBzbyB0aGF0IHRoZSB8bmV3QmxvY2tCb3h8IHdvdWxkIGJlIGZ1
bGx5Ci0gICAgLy8gY29ubmVjdGVkLCB0aHVzIGFsbG93aW5nIG5ld0NoaWxkIGFjY2VzcyB0byBh
IHJlbmRlckFyZW5hIHNob3VsZCBpdCBuZWVkCi0gICAgLy8gdG8gd3JhcCBpdHNlbGYgaW4gYWRk
aXRpb25hbCBib3hlcyAoZS5nLiwgdGFibGUgY29uc3RydWN0aW9uKS4KLSAgICBuZXdCbG9ja0Jv
eC0+YWRkQ2hpbGQobmV3Q2hpbGQpOwotCi0gICAgLy8gQWx3YXlzIGp1c3QgZG8gYSBmdWxsIGxh
eW91dCBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCBsaW5lIGJveGVzIChlc3BlY2lhbGx5IHdyYXBw
ZXJzIGZvciBpbWFnZXMpCi0gICAgLy8gZ2V0IGRlbGV0ZWQgcHJvcGVybHkuICBCZWNhdXNlIG9i
amVjdHMgbW92ZXMgZnJvbSB0aGUgcHJlIGJsb2NrIGludG8gdGhlIHBvc3QgYmxvY2ssIHdlIHdh
bnQgdG8KLSAgICAvLyBtYWtlIG5ldyBsaW5lIGJveGVzIGluc3RlYWQgb2YgbGVhdmluZyB0aGUg
b2xkIGxpbmUgYm94ZXMgYXJvdW5kLgotICAgIHByZS0+c2V0TmVlZHNMYXlvdXRBbmRQcmVmV2lk
dGhzUmVjYWxjKCk7Ci0gICAgYmxvY2stPnNldE5lZWRzTGF5b3V0QW5kUHJlZldpZHRoc1JlY2Fs
YygpOwotICAgIHBvc3QtPnNldE5lZWRzTGF5b3V0QW5kUHJlZldpZHRoc1JlY2FsYygpOwotfQot
Ci12b2lkIFJlbmRlcklubGluZTo6YWRkQ2hpbGRUb0NvbnRpbnVhdGlvbihSZW5kZXJPYmplY3Qq
IG5ld0NoaWxkLCBSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkKQotewotICAgIFJlbmRlckJveE1v
ZGVsT2JqZWN0KiBmbG93ID0gY29udGludWF0aW9uQmVmb3JlKGJlZm9yZUNoaWxkKTsKLSAgICBB
U1NFUlQoIWJlZm9yZUNoaWxkIHx8IGJlZm9yZUNoaWxkLT5wYXJlbnQoKS0+aXNSZW5kZXJCbG9j
aygpIHx8IGJlZm9yZUNoaWxkLT5wYXJlbnQoKS0+aXNSZW5kZXJJbmxpbmUoKSk7Ci0gICAgUmVu
ZGVyQm94TW9kZWxPYmplY3QqIGJlZm9yZUNoaWxkUGFyZW50ID0gMDsKLSAgICBpZiAoYmVmb3Jl
Q2hpbGQpCi0gICAgICAgIGJlZm9yZUNoaWxkUGFyZW50ID0gdG9SZW5kZXJCb3hNb2RlbE9iamVj
dChiZWZvcmVDaGlsZC0+cGFyZW50KCkpOwotICAgIGVsc2UgewotICAgICAgICBSZW5kZXJCb3hN
b2RlbE9iamVjdCogY29udCA9IG5leHRDb250aW51YXRpb24oZmxvdyk7Ci0gICAgICAgIGlmIChj
b250KQotICAgICAgICAgICAgYmVmb3JlQ2hpbGRQYXJlbnQgPSBjb250OwotICAgICAgICBlbHNl
Ci0gICAgICAgICAgICBiZWZvcmVDaGlsZFBhcmVudCA9IGZsb3c7Ci0gICAgfQotCi0gICAgaWYg
KG5ld0NoaWxkLT5pc0Zsb2F0aW5nT3JQb3NpdGlvbmVkKCkpCi0gICAgICAgIHJldHVybiBiZWZv
cmVDaGlsZFBhcmVudC0+YWRkQ2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihuZXdDaGlsZCwgYmVm
b3JlQ2hpbGQpOwotCi0gICAgLy8gQSBjb250aW51YXRpb24gYWx3YXlzIGNvbnNpc3RzIG9mIHR3
byBwb3RlbnRpYWwgY2FuZGlkYXRlczogYW4gaW5saW5lIG9yIGFuIGFub255bW91cwotICAgIC8v
IGJsb2NrIGJveCBob2xkaW5nIGJsb2NrIGNoaWxkcmVuLgotICAgIGJvb2wgY2hpbGRJbmxpbmUg
PSBuZXdDaGlsZC0+aXNJbmxpbmUoKTsKLSAgICBib29sIGJjcElubGluZSA9IGJlZm9yZUNoaWxk
UGFyZW50LT5pc0lubGluZSgpOwotICAgIGJvb2wgZmxvd0lubGluZSA9IGZsb3ctPmlzSW5saW5l
KCk7Ci0KLSAgICBpZiAoZmxvdyA9PSBiZWZvcmVDaGlsZFBhcmVudCkKLSAgICAgICAgcmV0dXJu
IGZsb3ctPmFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24obmV3Q2hpbGQsIGJlZm9yZUNoaWxk
KTsKLSAgICBlbHNlIHsKLSAgICAgICAgLy8gVGhlIGdvYWwgaGVyZSBpcyB0byBtYXRjaCB1cCBp
ZiB3ZSBjYW4sIHNvIHRoYXQgd2UgY2FuIGNvYWxlc2NlIGFuZCBjcmVhdGUgdGhlCi0gICAgICAg
IC8vIG1pbmltYWwgIyBvZiBjb250aW51YXRpb25zIG5lZWRlZCBmb3IgdGhlIGlubGluZS4KLSAg
ICAgICAgaWYgKGNoaWxkSW5saW5lID09IGJjcElubGluZSkKLSAgICAgICAgICAgIHJldHVybiBi
ZWZvcmVDaGlsZFBhcmVudC0+YWRkQ2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihuZXdDaGlsZCwg
YmVmb3JlQ2hpbGQpOwotICAgICAgICBlbHNlIGlmIChmbG93SW5saW5lID09IGNoaWxkSW5saW5l
KQotICAgICAgICAgICAgcmV0dXJuIGZsb3ctPmFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24o
bmV3Q2hpbGQsIDApOyAvLyBKdXN0IHRyZWF0IGxpa2UgYW4gYXBwZW5kLgotICAgICAgICBlbHNl
Ci0gICAgICAgICAgICByZXR1cm4gYmVmb3JlQ2hpbGRQYXJlbnQtPmFkZENoaWxkSWdub3JpbmdD
b250aW51YXRpb24obmV3Q2hpbGQsIGJlZm9yZUNoaWxkKTsKLSAgICB9Ci19Ci0KIHZvaWQgUmVu
ZGVySW5saW5lOjpwYWludChQYWludEluZm8mIHBhaW50SW5mbywgaW50IHR4LCBpbnQgdHkpCiB7
CiAgICAgbV9saW5lQm94ZXMucGFpbnQodGhpcywgcGFpbnRJbmZvLCB0eCwgdHkpOwpAQCAtNDE1
LDE2ICsxOTgsNiBAQCB2b2lkIFJlbmRlcklubGluZTo6YWJzb2x1dGVSZWN0cyhWZWN0b3I8CiAg
ICAgICAgICAgICByZWN0cy5hcHBlbmQoSW50UmVjdCh0eCArIGN1cnItPngoKSwgdHkgKyBjdXJy
LT55KCksIGN1cnItPndpZHRoKCksIGN1cnItPmhlaWdodCgpKSk7CiAgICAgfSBlbHNlCiAgICAg
ICAgIHJlY3RzLmFwcGVuZChJbnRSZWN0KHR4LCB0eSwgMCwgMCkpOwotCi0gICAgaWYgKGNvbnRp
bnVhdGlvbigpKSB7Ci0gICAgICAgIGlmIChjb250aW51YXRpb24oKS0+aXNCb3goKSkgewotICAg
ICAgICAgICAgUmVuZGVyQm94KiBib3ggPSB0b1JlbmRlckJveChjb250aW51YXRpb24oKSk7Ci0g
ICAgICAgICAgICBjb250aW51YXRpb24oKS0+YWJzb2x1dGVSZWN0cyhyZWN0cywgCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eCAtIGNvbnRhaW5pbmdCbG9jaygp
LT54KCkgKyBib3gtPngoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHR5IC0gY29udGFpbmluZ0Jsb2NrKCktPnkoKSArIGJveC0+eSgpKTsKLSAgICAgICAgfSBl
bHNlCi0gICAgICAgICAgICBjb250aW51YXRpb24oKS0+YWJzb2x1dGVSZWN0cyhyZWN0cywgdHgg
LSBjb250YWluaW5nQmxvY2soKS0+eCgpLCB0eSAtIGNvbnRhaW5pbmdCbG9jaygpLT55KCkpOwot
ICAgIH0KIH0KIAogdm9pZCBSZW5kZXJJbmxpbmU6OmFic29sdXRlUXVhZHMoVmVjdG9yPEZsb2F0
UXVhZD4mIHF1YWRzKQpAQCAtNDM2LDkgKzIwOSw2IEBAIHZvaWQgUmVuZGVySW5saW5lOjphYnNv
bHV0ZVF1YWRzKFZlY3RvcjwKICAgICAgICAgfQogICAgIH0gZWxzZQogICAgICAgICBxdWFkcy5h
cHBlbmQobG9jYWxUb0Fic29sdXRlUXVhZChGbG9hdFJlY3QoKSkpOwotCi0gICAgaWYgKGNvbnRp
bnVhdGlvbigpKQotICAgICAgICBjb250aW51YXRpb24oKS0+YWJzb2x1dGVRdWFkcyhxdWFkcyk7
CiB9CiAKIGludCBSZW5kZXJJbmxpbmU6Om9mZnNldExlZnQoKSBjb25zdApAQCAtNTA3LDE4ICsy
NzcsNiBAQCBWaXNpYmxlUG9zaXRpb24gUmVuZGVySW5saW5lOjpwb3NpdGlvbkZvCiAgICAgICAg
IC8vIHNob3VsZCB0cnkgdG8gZmluZCBhIHJlc3VsdCBieSBhc2tpbmcgb3VyIGNvbnRhaW5pbmcg
YmxvY2suCiAgICAgICAgIHJldHVybiBjYi0+cG9zaXRpb25Gb3JQb2ludChwb2ludCk7CiAgICAg
fQotCi0gICAgLy8gVHJhbnNsYXRlIHRoZSBjb29yZHMgZnJvbSB0aGUgcHJlLWFub255bW91cyBi
bG9jayB0byB0aGUgcG9zdC1hbm9ueW1vdXMgYmxvY2suCi0gICAgaW50IHBhcmVudEJsb2NrWCA9
IGNiLT54KCkgKyBwb2ludC54KCk7Ci0gICAgaW50IHBhcmVudEJsb2NrWSA9IGNiLT55KCkgKyBw
b2ludC55KCk7Ci0gICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGMgPSBjb250aW51YXRpb24oKTsK
LSAgICB3aGlsZSAoYykgewotICAgICAgICBSZW5kZXJCb3gqIGNvbnRCbG9jayA9IGMtPmlzSW5s
aW5lKCkgPyBjLT5jb250YWluaW5nQmxvY2soKSA6IHRvUmVuZGVyQmxvY2soYyk7Ci0gICAgICAg
IGlmIChjLT5pc0lubGluZSgpIHx8IGMtPmZpcnN0Q2hpbGQoKSkKLSAgICAgICAgICAgIHJldHVy
biBjLT5wb3NpdGlvbkZvckNvb3JkaW5hdGVzKHBhcmVudEJsb2NrWCAtIGNvbnRCbG9jay0+eCgp
LCBwYXJlbnRCbG9ja1kgLSBjb250QmxvY2stPnkoKSk7Ci0gICAgICAgIGMgPSB0b1JlbmRlckJs
b2NrKGMpLT5pbmxpbmVDb250aW51YXRpb24oKTsKLSAgICB9Ci0gICAgCiAgICAgcmV0dXJuIFJl
bmRlckJveE1vZGVsT2JqZWN0Ojpwb3NpdGlvbkZvclBvaW50KHBvaW50KTsKIH0KIApAQCAtNTcx
LDcgKzMyOSw3IEBAIEludFJlY3QgUmVuZGVySW5saW5lOjpjbGlwcGVkT3ZlcmZsb3dSZWMKICAg
ICAvLyBPbmx5IHJ1bi1pbnMgYXJlIGFsbG93ZWQgaW4gaGVyZSBkdXJpbmcgbGF5b3V0LgogICAg
IEFTU0VSVCghdmlldygpIHx8ICF2aWV3KCktPmxheW91dFN0YXRlRW5hYmxlZCgpIHx8IGlzUnVu
SW4oKSk7CiAKLSAgICBpZiAoIWZpcnN0TGluZUJveCgpICYmICFjb250aW51YXRpb24oKSkKKyAg
ICBpZiAoIWZpcnN0TGluZUJveCgpKQogICAgICAgICByZXR1cm4gSW50UmVjdCgpOwogCiAgICAg
Ly8gRmluZCBvdXIgbGVmdG1vc3QgcG9zaXRpb24uCkBAIC02MTksMTEgKzM3Nyw2IEBAIEludFJl
Y3QgUmVuZGVySW5saW5lOjpjbGlwcGVkT3ZlcmZsb3dSZWMKICAgICAgICAgICAgICAgICByLnVu
aXRlKGNoaWxkUmVjdCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQotICAgICAgICBpZiAo
Y29udGludWF0aW9uKCkgJiYgIWNvbnRpbnVhdGlvbigpLT5pc0lubGluZSgpKSB7Ci0gICAgICAg
ICAgICBJbnRSZWN0IGNvbnRSZWN0ID0gY29udGludWF0aW9uKCktPnJlY3RXaXRoT3V0bGluZUZv
clJlcGFpbnQocmVwYWludENvbnRhaW5lciwgb3cpOwotICAgICAgICAgICAgci51bml0ZShjb250
UmVjdCk7Ci0gICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gcjsKQEAgLTc5Niw0OSArNTQ5
LDYgQEAgdm9pZCBSZW5kZXJJbmxpbmU6Om1hcEFic29sdXRlVG9Mb2NhbFBvaQogICAgICAgICB0
cmFuc2Zvcm1TdGF0ZS5tb3ZlKC1jb250YWluZXJPZmZzZXQud2lkdGgoKSwgLWNvbnRhaW5lck9m
ZnNldC5oZWlnaHQoKSwgcHJlc2VydmUzRCA/IFRyYW5zZm9ybVN0YXRlOjpBY2N1bXVsYXRlVHJh
bnNmb3JtIDogVHJhbnNmb3JtU3RhdGU6OkZsYXR0ZW5UcmFuc2Zvcm0pOwogfQogCi12b2lkIFJl
bmRlcklubGluZTo6dXBkYXRlRHJhZ1N0YXRlKGJvb2wgZHJhZ09uKQotewotICAgIFJlbmRlckJv
eE1vZGVsT2JqZWN0Ojp1cGRhdGVEcmFnU3RhdGUoZHJhZ09uKTsKLSAgICBpZiAoY29udGludWF0
aW9uKCkpCi0gICAgICAgIGNvbnRpbnVhdGlvbigpLT51cGRhdGVEcmFnU3RhdGUoZHJhZ09uKTsK
LX0KLQotdm9pZCBSZW5kZXJJbmxpbmU6OmNoaWxkQmVjYW1lTm9uSW5saW5lKFJlbmRlck9iamVj
dCogY2hpbGQpCi17Ci0gICAgLy8gV2UgaGF2ZSB0byBzcGxpdCB0aGUgcGFyZW50IGZsb3cuCi0g
ICAgUmVuZGVyQmxvY2sqIG5ld0JveCA9IGNvbnRhaW5pbmdCbG9jaygpLT5jcmVhdGVBbm9ueW1v
dXNCbG9jaygpOwotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBvbGRDb250aW51YXRpb24gPSBj
b250aW51YXRpb24oKTsKLSAgICBzZXRDb250aW51YXRpb24obmV3Qm94KTsKLSAgICBSZW5kZXJP
YmplY3QqIGJlZm9yZUNoaWxkID0gY2hpbGQtPm5leHRTaWJsaW5nKCk7Ci0gICAgY2hpbGRyZW4o
KS0+cmVtb3ZlQ2hpbGROb2RlKHRoaXMsIGNoaWxkKTsKLSAgICBzcGxpdEZsb3coYmVmb3JlQ2hp
bGQsIG5ld0JveCwgY2hpbGQsIG9sZENvbnRpbnVhdGlvbik7Ci19Ci0KLXZvaWQgUmVuZGVySW5s
aW5lOjp1cGRhdGVIaXRUZXN0UmVzdWx0KEhpdFRlc3RSZXN1bHQmIHJlc3VsdCwgY29uc3QgSW50
UG9pbnQmIHBvaW50KQotewotICAgIGlmIChyZXN1bHQuaW5uZXJOb2RlKCkpCi0gICAgICAgIHJl
dHVybjsKLQotICAgIE5vZGUqIG4gPSBub2RlKCk7Ci0gICAgSW50UG9pbnQgbG9jYWxQb2ludChw
b2ludCk7Ci0gICAgaWYgKG4pIHsKLSAgICAgICAgaWYgKGlzSW5saW5lQ29udGludWF0aW9uKCkp
IHsKLSAgICAgICAgICAgIC8vIFdlJ3JlIGluIHRoZSBjb250aW51YXRpb24gb2YgYSBzcGxpdCBp
bmxpbmUuICBBZGp1c3Qgb3VyIGxvY2FsIHBvaW50IHRvIGJlIGluIHRoZSBjb29yZGluYXRlIHNw
YWNlCi0gICAgICAgICAgICAvLyBvZiB0aGUgcHJpbmNpcGFsIHJlbmRlcmVyJ3MgY29udGFpbmlu
ZyBibG9jay4gIFRoaXMgd2lsbCBlbmQgdXAgYmVpbmcgdGhlIGlubmVyTm9uU2hhcmVkTm9kZS4K
LSAgICAgICAgICAgIFJlbmRlckJsb2NrKiBmaXJzdEJsb2NrID0gbi0+cmVuZGVyZXIoKS0+Y29u
dGFpbmluZ0Jsb2NrKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEdldCBvdXIgY29u
dGFpbmluZyBibG9jay4KLSAgICAgICAgICAgIFJlbmRlckJveCogYmxvY2sgPSBjb250YWluaW5n
QmxvY2soKTsKLSAgICAgICAgICAgIGxvY2FsUG9pbnQubW92ZShibG9jay0+eCgpIC0gZmlyc3RC
bG9jay0+eCgpLCBibG9jay0+eSgpIC0gZmlyc3RCbG9jay0+eSgpKTsKLSAgICAgICAgfQotCi0g
ICAgICAgIHJlc3VsdC5zZXRJbm5lck5vZGUobik7Ci0gICAgICAgIGlmICghcmVzdWx0LmlubmVy
Tm9uU2hhcmVkTm9kZSgpKQotICAgICAgICAgICAgcmVzdWx0LnNldElubmVyTm9uU2hhcmVkTm9k
ZShuKTsKLSAgICAgICAgcmVzdWx0LnNldExvY2FsUG9pbnQobG9jYWxQb2ludCk7Ci0gICAgfQot
fQotCiB2b2lkIFJlbmRlcklubGluZTo6ZGlydHlMaW5lQm94ZXMoYm9vbCBmdWxsTGF5b3V0KQog
ewogICAgIGlmIChmdWxsTGF5b3V0KQpAQCAtOTU0LDE3ICs2NjQsNiBAQCB2b2lkIFJlbmRlcklu
bGluZTo6YWRkRm9jdXNSaW5nUmVjdHMoVmVjCiAgICAgICAgICAgIGN1cnItPmFkZEZvY3VzUmlu
Z1JlY3RzKHJlY3RzLCBwb3MueCgpLCBwb3MueSgpKTsKICAgICAgICAgfQogICAgIH0KLQotICAg
IGlmIChjb250aW51YXRpb24oKSkgewotICAgICAgICBpZiAoY29udGludWF0aW9uKCktPmlzSW5s
aW5lKCkpCi0gICAgICAgICAgICBjb250aW51YXRpb24oKS0+YWRkRm9jdXNSaW5nUmVjdHMocmVj
dHMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4IC0g
Y29udGFpbmluZ0Jsb2NrKCktPngoKSArIGNvbnRpbnVhdGlvbigpLT5jb250YWluaW5nQmxvY2so
KS0+eCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5
IC0gY29udGFpbmluZ0Jsb2NrKCktPnkoKSArIGNvbnRpbnVhdGlvbigpLT5jb250YWluaW5nQmxv
Y2soKS0+eSgpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgY29udGludWF0aW9uKCktPmFk
ZEZvY3VzUmluZ1JlY3RzKHJlY3RzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICB0eCAtIGNvbnRhaW5pbmdCbG9jaygpLT54KCkgKyB0b1JlbmRlckJveChj
b250aW51YXRpb24oKSktPngoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB0eSAtIGNvbnRhaW5pbmdCbG9jaygpLT55KCkgKyB0b1JlbmRlckJveChjb250
aW51YXRpb24oKSktPnkoKSk7Ci0gICAgfQogfQogCiB2b2lkIFJlbmRlcklubGluZTo6cGFpbnRP
dXRsaW5lKEdyYXBoaWNzQ29udGV4dCogZ3JhcGhpY3NDb250ZXh0LCBpbnQgdHgsIGludCB0eSkK
SW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlcklubGluZS5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvcmVuZGVyaW5nL1JlbmRlcklubGluZS5oCShyZXZpc2lvbiA1NDUwMSkKKysrIFdlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlcklubGluZS5oCSh3b3JraW5nIGNvcHkpCkBAIC01OCwxMCArNTgs
NiBAQCBwdWJsaWM6CiAKICAgICBJbmxpbmVGbG93Qm94KiBmaXJzdExpbmVCb3goKSBjb25zdCB7
IHJldHVybiBtX2xpbmVCb3hlcy5maXJzdExpbmVCb3goKTsgfQogICAgIElubGluZUZsb3dCb3gq
IGxhc3RMaW5lQm94KCkgY29uc3QgeyByZXR1cm4gbV9saW5lQm94ZXMubGFzdExpbmVCb3goKTsg
fQotCi0gICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGNvbnRpbnVhdGlvbigpIGNvbnN0IHsgcmV0
dXJuIG1fY29udGludWF0aW9uOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlRHJhZ1N0YXRl
KGJvb2wgZHJhZ09uKTsKICAgICAKICAgICBJbnRTaXplIHJlbGF0aXZlUG9zaXRpb25lZElubGlu
ZU9mZnNldChjb25zdCBSZW5kZXJCb3gqIGNoaWxkKSBjb25zdDsKIApAQCAtODEsOSArNzcsNiBA
QCBwcml2YXRlOgogCiAgICAgdmlydHVhbCBib29sIGlzUmVuZGVySW5saW5lKCkgY29uc3QgeyBy
ZXR1cm4gdHJ1ZTsgfQogCi0gICAgdm9pZCBhZGRDaGlsZFRvQ29udGludWF0aW9uKFJlbmRlck9i
amVjdCogbmV3Q2hpbGQsIFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQpOwotICAgIHZpcnR1YWwg
dm9pZCBhZGRDaGlsZElnbm9yaW5nQ29udGludWF0aW9uKFJlbmRlck9iamVjdCogbmV3Q2hpbGQs
IFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQgPSAwKTsKLQogICAgIHZvaWQgc3BsaXRJbmxpbmVz
KFJlbmRlckJsb2NrKiBmcm9tQmxvY2ssIFJlbmRlckJsb2NrKiB0b0Jsb2NrLCBSZW5kZXJCbG9j
ayogbWlkZGxlQmxvY2ssCiAgICAgICAgICAgICAgICAgICAgICAgUmVuZGVyT2JqZWN0KiBiZWZv
cmVDaGlsZCwgUmVuZGVyQm94TW9kZWxPYmplY3QqIG9sZENvbnQpOwogICAgIHZvaWQgc3BsaXRG
bG93KFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQsIFJlbmRlckJsb2NrKiBuZXdCbG9ja0JveCwK
QEAgLTEyNiwxMyArMTE5LDggQEAgcHJpdmF0ZToKIAogICAgIHZpcnR1YWwgaW50IGxpbmVIZWln
aHQoYm9vbCBmaXJzdExpbmUsIGJvb2wgaXNSb290TGluZUJveCA9IGZhbHNlKSBjb25zdDsKIAot
ICAgIFJlbmRlcklubGluZSogaW5saW5lQ29udGludWF0aW9uKCkgY29uc3Q7Ci0gICAgdm9pZCBz
ZXRDb250aW51YXRpb24oUmVuZGVyQm94TW9kZWxPYmplY3QqIGMpIHsgbV9jb250aW51YXRpb24g
PSBjOyB9Ci0gICAgCiAgICAgdmlydHVhbCB2b2lkIGNoaWxkQmVjYW1lTm9uSW5saW5lKFJlbmRl
ck9iamVjdCogY2hpbGQpOwogCi0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZUhpdFRlc3RSZXN1bHQo
SGl0VGVzdFJlc3VsdCYsIGNvbnN0IEludFBvaW50Jik7Ci0KICAgICB2aXJ0dWFsIHZvaWQgaW1h
Z2VDaGFuZ2VkKFdyYXBwZWRJbWFnZVB0ciwgY29uc3QgSW50UmVjdCogPSAwKTsKIAogI2lmIEVO
QUJMRShEQVNIQk9BUkRfU1VQUE9SVCkKQEAgLTE0NSwxMyArMTMzLDEwIEBAIHByaXZhdGU6CiAg
ICAgc3RhdGljIFJlbmRlcklubGluZSogY2xvbmVJbmxpbmUoUmVuZGVySW5saW5lKiBzcmMpOwog
CiAgICAgdm9pZCBwYWludE91dGxpbmVGb3JMaW5lKEdyYXBoaWNzQ29udGV4dCosIGludCB0eCwg
aW50IHR5LCBjb25zdCBJbnRSZWN0JiBwcmV2TGluZSwgY29uc3QgSW50UmVjdCYgdGhpc0xpbmUs
IGNvbnN0IEludFJlY3QmIG5leHRMaW5lKTsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogY29u
dGludWF0aW9uQmVmb3JlKFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQpOwogCiAgICAgUmVuZGVy
T2JqZWN0Q2hpbGRMaXN0IG1fY2hpbGRyZW47CiAgICAgUmVuZGVyTGluZUJveExpc3QgbV9saW5l
Qm94ZXM7ICAgLy8gQWxsIG9mIHRoZSBsaW5lIGJveGVzIGNyZWF0ZWQgZm9yIHRoaXMgaW5saW5l
IGZsb3cuICBGb3IgZXhhbXBsZSwgPGk+SGVsbG88YnI+d29ybGQuPC9pPiB3aWxsIGhhdmUgdHdv
IDxpPiBsaW5lIGJveGVzLgogCi0gICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIG1fY29udGludWF0
aW9uOyAvLyBDYW4gYmUgZWl0aGVyIGEgYmxvY2sgb3IgYW4gaW5saW5lLiA8Yj48aT48cD5IZWxs
bzwvcD48L2k+PC9iPi4gSW4gdGhpcyBleGFtcGxlIHRoZSA8aT4gd2lsbCBoYXZlIGEgYmxvY2sg
YXMgaXRzIGNvbnRpbnVhdGlvbiBidXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAvLyA8Yj4gd2lsbCBqdXN0IGhhdmUgYW4gaW5saW5lIGFzIGl0cyBjb250
aW51YXRpb24uCiAgICAgbXV0YWJsZSBpbnQgbV9saW5lSGVpZ2h0OwogICAgIG11dGFibGUgaW50
IG1fdmVydGljYWxQb3NpdGlvbjsKIH07CkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJM
aW5lQm94TGlzdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGlu
ZUJveExpc3QuY3BwCShyZXZpc2lvbiA1NDUwMSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRl
ckxpbmVCb3hMaXN0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTQ2LDE4ICsxNDYsMTggQEAgdm9p
ZCBSZW5kZXJMaW5lQm94TGlzdDo6ZGlydHlMaW5lQm94ZXMoKQogCiB2b2lkIFJlbmRlckxpbmVC
b3hMaXN0OjpwYWludChSZW5kZXJCb3hNb2RlbE9iamVjdCogcmVuZGVyZXIsIFJlbmRlck9iamVj
dDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGludCB0eCwgaW50IHR5KSBjb25zdAogewotICAgIC8v
IE9ubHkgcGFpbnQgZHVyaW5nIHRoZSBmb3JlZ3JvdW5kL3NlbGVjdGlvbiBwaGFzZXMuCi0gICAg
aWYgKHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlRm9yZWdyb3VuZCAmJiBwYWludEluZm8u
cGhhc2UgIT0gUGFpbnRQaGFzZVNlbGVjdGlvbiAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQ
aGFzZU91dGxpbmUgCi0gICAgICAgICYmIHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlU2Vs
Zk91dGxpbmUgJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VDaGlsZE91dGxpbmVzICYm
IHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlVGV4dENsaXAKLSAgICAgICAgJiYgcGFpbnRJ
bmZvLnBoYXNlICE9IFBhaW50UGhhc2VNYXNrKQotICAgICAgICByZXR1cm47Ci0KICAgICBBU1NF
UlQocmVuZGVyZXItPmlzUmVuZGVyQmxvY2soKSB8fCAocmVuZGVyZXItPmlzUmVuZGVySW5saW5l
KCkgJiYgcmVuZGVyZXItPmhhc0xheWVyKCkpKTsgLy8gVGhlIG9ubHkgd2F5IGFuIGlubGluZSBj
b3VsZCBwYWludCBsaWtlIHRoaXMgaXMgaWYgaXQgaGFzIGEgbGF5ZXIuCiAKICAgICAvLyBJZiB3
ZSBoYXZlIG5vIGxpbmVzIHRoZW4gd2UgaGF2ZSBubyB3b3JrIHRvIGRvLgogICAgIGlmICghZmly
c3RMaW5lQm94KCkpCiAgICAgICAgIHJldHVybjsKIAorICAgIC8vIE9ubHkgcGFpbnQgZHVyaW5n
IHRoZSBmb3JlZ3JvdW5kL3NlbGVjdGlvbiBwaGFzZXMgaWYgd2UgaGF2ZSBhIGxheWVyLiAgT3Ro
ZXJ3aXNlIHdlIG1pZ2h0IGhhdmUgYW4gYW5vbnltb3VzIGlubGluZSBibG9jaywgc28gd2UgY2Fu
J3Qgc2hvcnQgY2lyY3VpdC4KKyAgICBpZiAoZmlyc3RMaW5lQm94KCktPnBhcmVudCgpICYmIChw
YWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZUZvcmVncm91bmQgJiYgcGFpbnRJbmZvLnBoYXNl
ICE9IFBhaW50UGhhc2VTZWxlY3Rpb24gJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VP
dXRsaW5lIAorICAgICAgICAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZVNlbGZPdXRs
aW5lICYmIHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlQ2hpbGRPdXRsaW5lcyAmJiBwYWlu
dEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZVRleHRDbGlwCisgICAgICAgICYmIHBhaW50SW5mby5w
aGFzZSAhPSBQYWludFBoYXNlTWFzaykpCisgICAgICAgIHJldHVybjsKKwogICAgIC8vIFdlIGNh
biBjaGVjayB0aGUgZmlyc3QgYm94IGFuZCBsYXN0IGJveCBhbmQgYXZvaWQgcGFpbnRpbmcgaWYg
d2UgZG9uJ3QKICAgICAvLyBpbnRlcnNlY3QuICBUaGlzIGlzIGEgcXVpY2sgc2hvcnQtY2lyY3Vp
dCB0aGF0IHdlIGNhbiB0YWtlIHRvIGF2b2lkIHdhbGtpbmcgYW55IGxpbmVzLgogICAgIC8vIEZJ
WE1FOiBUaGlzIGNoZWNrIGlzIGZsYXdlZCBpbiB0aGUgZm9sbG93aW5nIGV4dHJlbWVseSBvYnNj
dXJlIHdheToKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckxpc3RJdGVtLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMaXN0SXRlbS5jcHAJKHJldmlzaW9u
IDU0NTAxKQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGlzdEl0ZW0uY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0yNyw2ICsyNyw4IEBACiAjaW5jbHVkZSAiQ2FjaGVkSW1hZ2UuaCIKICNpbmNs
dWRlICJIVE1MTmFtZXMuaCIKICNpbmNsdWRlICJIVE1MT0xpc3RFbGVtZW50LmgiCisjaW5jbHVk
ZSAiSW5saW5lSXRlcmF0b3IuaCIKKwogI2luY2x1ZGUgIlJlbmRlckxpc3RNYXJrZXIuaCIKICNp
bmNsdWRlICJSZW5kZXJWaWV3LmgiCiAjaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgpAQCAt
MTUzLDE4ICsxNTUsNDQgQEAgYm9vbCBSZW5kZXJMaXN0SXRlbTo6aXNFbXB0eSgpIGNvbnN0CiAg
ICAgcmV0dXJuIGxhc3RDaGlsZCgpID09IG1fbWFya2VyOwogfQogCi1zdGF0aWMgUmVuZGVyT2Jq
ZWN0KiBnZXRQYXJlbnRPZkZpcnN0TGluZUJveChSZW5kZXJCbG9jayogY3VyciwgUmVuZGVyT2Jq
ZWN0KiBtYXJrZXIpCit2b2lkIFJlbmRlckxpc3RJdGVtOjp1cGRhdGVWYWx1ZSgpCiB7Ci0gICAg
UmVuZGVyT2JqZWN0KiBmaXJzdENoaWxkID0gY3Vyci0+Zmlyc3RDaGlsZCgpOwotICAgIGlmICgh
Zmlyc3RDaGlsZCkKLSAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCFtX2hhc0V4cGxpY2l0VmFs
dWUpIHsKKyAgICAgICAgbV9pc1ZhbHVlVXBUb0RhdGUgPSBmYWxzZTsKKyAgICAgICAgaWYgKG1f
bWFya2VyKQorICAgICAgICAgICAgbV9tYXJrZXItPnNldE5lZWRzTGF5b3V0QW5kUHJlZldpZHRo
c1JlY2FsYygpOworICAgIH0KK30KIAotICAgIGZvciAoUmVuZGVyT2JqZWN0KiBjdXJyQ2hpbGQg
PSBmaXJzdENoaWxkOyBjdXJyQ2hpbGQ7IGN1cnJDaGlsZCA9IGN1cnJDaGlsZC0+bmV4dFNpYmxp
bmcoKSkgeworc3RhdGljIFJlbmRlck9iamVjdCogZmlyc3ROb25NYXJrZXJDaGlsZChSZW5kZXJP
YmplY3QqIHBhcmVudCkKK3sKKyAgICBSZW5kZXJPYmplY3QqIHJlc3VsdCA9IHBhcmVudC0+Zmly
c3RDaGlsZCgpOworICAgIHdoaWxlIChyZXN1bHQgJiYgcmVzdWx0LT5pc0xpc3RNYXJrZXIoKSkK
KyAgICAgICAgcmVzdWx0ID0gcmVzdWx0LT5uZXh0U2libGluZygpOworICAgIHJldHVybiByZXN1
bHQ7Cit9CisKKworc3RhdGljIFJlbmRlckJsb2NrKiBsaXN0TWFya2VyTG9jYXRpb24oUmVuZGVy
QmxvY2sqIGJsb2NrLCBSZW5kZXJMaXN0TWFya2VyKiBtYXJrZXIpCit7CisgICAgZm9yIChSZW5k
ZXJPYmplY3QqIGN1cnJDaGlsZCA9IGJsb2NrLT5maXJzdENoaWxkKCk7IGN1cnJDaGlsZDsgY3Vy
ckNoaWxkID0gY3VyckNoaWxkLT5uZXh0U2libGluZygpKSB7CiAgICAgICAgIGlmIChjdXJyQ2hp
bGQgPT0gbWFya2VyKQogICAgICAgICAgICAgY29udGludWU7CiAKLSAgICAgICAgaWYgKGN1cnJD
aGlsZC0+aXNJbmxpbmUoKSAmJiAoIWN1cnJDaGlsZC0+aXNSZW5kZXJJbmxpbmUoKSB8fCBjdXJy
LT5nZW5lcmF0ZXNMaW5lQm94ZXNGb3JJbmxpbmVDaGlsZChjdXJyQ2hpbGQpKSkKLSAgICAgICAg
ICAgIHJldHVybiBjdXJyOworICAgICAgICBpZiAoY3VyckNoaWxkLT5pc0lubGluZSgpKSB7Cisg
ICAgICAgICAgICBpZiAoIWN1cnJDaGlsZC0+aXNSZW5kZXJJbmxpbmUoKSkKKyAgICAgICAgICAg
ICAgICByZXR1cm4gYmxvY2s7CisgICAgICAgICAgICBJbmxpbmVJdGVyYXRvciBpdChibG9jaywg
Y3VyckNoaWxkLCAwKTsKKyAgICAgICAgICAgIHdoaWxlICghaXQuYXRFbmQoKSkgeworICAgICAg
ICAgICAgICAgIGlmIChpdC5vYmotPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkgeworICAgICAg
ICAgICAgICAgICAgICBSZW5kZXJCbG9jayogbGluZUJveFBhcmVudCA9IGxpc3RNYXJrZXJMb2Nh
dGlvbih0b1JlbmRlckJsb2NrKGl0Lm9iaiksIG1hcmtlcik7CisgICAgICAgICAgICAgICAgICAg
IGlmIChsaW5lQm94UGFyZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmVC
b3hQYXJlbnQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChSZW5kZXJCbG9jazo6cmVxdWly
ZXNMaW5lQm94KGl0KSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJsb2NrOworICAgICAg
ICAgICAgICAgIGl0LmluY3JlbWVudCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKICAg
ICAgICAgaWYgKGN1cnJDaGlsZC0+aXNGbG9hdGluZygpIHx8IGN1cnJDaGlsZC0+aXNQb3NpdGlv
bmVkKCkpCiAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTE3Miw0MSArMjAwLDI0IEBAIHN0YXRp
YyBSZW5kZXJPYmplY3QqIGdldFBhcmVudE9mRmlyc3RMaW4KICAgICAgICAgaWYgKGN1cnJDaGls
ZC0+aXNUYWJsZSgpIHx8ICFjdXJyQ2hpbGQtPmlzUmVuZGVyQmxvY2soKSkKICAgICAgICAgICAg
IGJyZWFrOwogCi0gICAgICAgIGlmIChjdXJyLT5pc0xpc3RJdGVtKCkgJiYgY3VyckNoaWxkLT5z
dHlsZSgpLT5odG1sSGFja3MoKSAmJiBjdXJyQ2hpbGQtPm5vZGUoKSAmJgotICAgICAgICAgICAg
KGN1cnJDaGlsZC0+bm9kZSgpLT5oYXNUYWdOYW1lKHVsVGFnKXx8IGN1cnJDaGlsZC0+bm9kZSgp
LT5oYXNUYWdOYW1lKG9sVGFnKSkpCisgICAgICAgIGlmIChibG9jay0+aXNMaXN0SXRlbSgpICYm
IGN1cnJDaGlsZC0+c3R5bGUoKS0+aHRtbEhhY2tzKCkgJiYgY3VyckNoaWxkLT5ub2RlKCkgJiYK
KyAgICAgICAgICAgIChjdXJyQ2hpbGQtPm5vZGUoKS0+aGFzVGFnTmFtZSh1bFRhZykgfHwgY3Vy
ckNoaWxkLT5ub2RlKCktPmhhc1RhZ05hbWUob2xUYWcpKSkKICAgICAgICAgICAgIGJyZWFrOwog
Ci0gICAgICAgIFJlbmRlck9iamVjdCogbGluZUJveCA9IGdldFBhcmVudE9mRmlyc3RMaW5lQm94
KHRvUmVuZGVyQmxvY2soY3VyckNoaWxkKSwgbWFya2VyKTsKLSAgICAgICAgaWYgKGxpbmVCb3gp
Ci0gICAgICAgICAgICByZXR1cm4gbGluZUJveDsKKyAgICAgICAgUmVuZGVyQmxvY2sqIGxpbmVC
b3hQYXJlbnQgPSBsaXN0TWFya2VyTG9jYXRpb24odG9SZW5kZXJCbG9jayhjdXJyQ2hpbGQpLCBt
YXJrZXIpOworICAgICAgICBpZiAobGluZUJveFBhcmVudCkKKyAgICAgICAgICAgIHJldHVybiBs
aW5lQm94UGFyZW50OwogICAgIH0KIAogICAgIHJldHVybiAwOwogfQogCi12b2lkIFJlbmRlckxp
c3RJdGVtOjp1cGRhdGVWYWx1ZSgpCi17Ci0gICAgaWYgKCFtX2hhc0V4cGxpY2l0VmFsdWUpIHsK
LSAgICAgICAgbV9pc1ZhbHVlVXBUb0RhdGUgPSBmYWxzZTsKLSAgICAgICAgaWYgKG1fbWFya2Vy
KQotICAgICAgICAgICAgbV9tYXJrZXItPnNldE5lZWRzTGF5b3V0QW5kUHJlZldpZHRoc1JlY2Fs
YygpOwotICAgIH0KLX0KLQotc3RhdGljIFJlbmRlck9iamVjdCogZmlyc3ROb25NYXJrZXJDaGls
ZChSZW5kZXJPYmplY3QqIHBhcmVudCkKLXsKLSAgICBSZW5kZXJPYmplY3QqIHJlc3VsdCA9IHBh
cmVudC0+Zmlyc3RDaGlsZCgpOwotICAgIHdoaWxlIChyZXN1bHQgJiYgcmVzdWx0LT5pc0xpc3RN
YXJrZXIoKSkKLSAgICAgICAgcmVzdWx0ID0gcmVzdWx0LT5uZXh0U2libGluZygpOwotICAgIHJl
dHVybiByZXN1bHQ7Ci19Ci0KIHZvaWQgUmVuZGVyTGlzdEl0ZW06OnVwZGF0ZU1hcmtlckxvY2F0
aW9uKCkKIHsKICAgICAvLyBTYW5pdHkgY2hlY2sgdGhlIGxvY2F0aW9uIG9mIG91ciBtYXJrZXIu
CiAgICAgaWYgKG1fbWFya2VyKSB7CiAgICAgICAgIFJlbmRlck9iamVjdCogbWFya2VyUGFyID0g
bV9tYXJrZXItPnBhcmVudCgpOwotICAgICAgICBSZW5kZXJPYmplY3QqIGxpbmVCb3hQYXJlbnQg
PSBnZXRQYXJlbnRPZkZpcnN0TGluZUJveCh0aGlzLCBtX21hcmtlcik7CisgICAgICAgIFJlbmRl
ck9iamVjdCogbGluZUJveFBhcmVudCA9IGxpc3RNYXJrZXJMb2NhdGlvbih0aGlzLCBtX21hcmtl
cik7CiAgICAgICAgIGlmICghbGluZUJveFBhcmVudCkgewogICAgICAgICAgICAgLy8gSWYgdGhl
IG1hcmtlciBpcyBjdXJyZW50bHkgY29udGFpbmVkIGluc2lkZSBhbiBhbm9ueW1vdXMgYm94LAog
ICAgICAgICAgICAgLy8gdGhlbiB3ZSBhcmUgdGhlIG9ubHkgaXRlbSBpbiB0aGF0IGFub255bW91
cyBib3ggKHNpbmNlIG5vIGxpbmUgYm94CkBAIC0yNTcsOSArMjY4LDExIEBAIHZvaWQgUmVuZGVy
TGlzdEl0ZW06OnBvc2l0aW9uTGlzdE1hcmtlcigKICAgICAgICAgaW50IG1hcmtlck9sZFggPSBt
X21hcmtlci0+eCgpOwogICAgICAgICBpbnQgeU9mZnNldCA9IDA7CiAgICAgICAgIGludCB4T2Zm
c2V0ID0gMDsKLSAgICAgICAgZm9yIChSZW5kZXJCb3gqIG8gPSBtX21hcmtlci0+cGFyZW50Qm94
KCk7IG8gIT0gdGhpczsgbyA9IG8tPnBhcmVudEJveCgpKSB7Ci0gICAgICAgICAgICB5T2Zmc2V0
ICs9IG8tPnkoKTsKLSAgICAgICAgICAgIHhPZmZzZXQgKz0gby0+eCgpOworICAgICAgICBmb3Ig
KFJlbmRlck9iamVjdCogbyA9IG1fbWFya2VyLT5wYXJlbnQoKTsgbyAhPSB0aGlzOyBvID0gby0+
cGFyZW50KCkpIHsKKyAgICAgICAgICAgIGlmIChvLT5pc0JveCgpKSB7CisgICAgICAgICAgICAg
ICAgeU9mZnNldCArPSB0b1JlbmRlckJveChvKS0+eSgpOworICAgICAgICAgICAgICAgIHhPZmZz
ZXQgKz0gdG9SZW5kZXJCb3gobyktPngoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAg
ICAgICAgIGJvb2wgYWRqdXN0T3ZlcmZsb3cgPSBmYWxzZTsKQEAgLTI5NSwxMyArMzA4LDE0IEBA
IHZvaWQgUmVuZGVyTGlzdEl0ZW06OnBvc2l0aW9uTGlzdE1hcmtlcigKIAogICAgICAgICBpZiAo
YWRqdXN0T3ZlcmZsb3cpIHsKICAgICAgICAgICAgIEludFJlY3QgbWFya2VyUmVjdChtYXJrZXJY
UG9zICsgeE9mZnNldCwgeU9mZnNldCwgbV9tYXJrZXItPndpZHRoKCksIG1fbWFya2VyLT5oZWln
aHQoKSk7Ci0gICAgICAgICAgICBSZW5kZXJCb3gqIG8gPSBtX21hcmtlcjsKKyAgICAgICAgICAg
IFJlbmRlck9iamVjdCogbyA9IG1fbWFya2VyOwogICAgICAgICAgICAgZG8gewotICAgICAgICAg
ICAgICAgIG8gPSBvLT5wYXJlbnRCb3goKTsKKyAgICAgICAgICAgICAgICBvID0gby0+cGFyZW50
KCk7CiAgICAgICAgICAgICAgICAgaWYgKG8tPmlzUmVuZGVyQmxvY2soKSkKICAgICAgICAgICAg
ICAgICAgICAgdG9SZW5kZXJCbG9jayhvKS0+YWRkTGF5b3V0T3ZlcmZsb3cobWFya2VyUmVjdCk7
Ci0gICAgICAgICAgICAgICAgbWFya2VyUmVjdC5tb3ZlKC1vLT54KCksIC1vLT55KCkpOwotICAg
ICAgICAgICAgfSB3aGlsZSAobyAhPSB0aGlzICYmICFvLT5oYXNTZWxmUGFpbnRpbmdMYXllcigp
KTsKKyAgICAgICAgICAgICAgICBpZiAoby0+aXNCb3goKSkKKyAgICAgICAgICAgICAgICAgICAg
bWFya2VyUmVjdC5tb3ZlKC10b1JlbmRlckJveChvKS0+eCgpLCAtdG9SZW5kZXJCb3gobyktPnko
KSk7CisgICAgICAgICAgICB9IHdoaWxlIChvICE9IHRoaXMgJiYgKCFvLT5pc0JveCgpIHx8ICF0
b1JlbmRlckJveChvKS0+aGFzU2VsZlBhaW50aW5nTGF5ZXIoKSkpOyAvLyBGSVhNRTogSW52ZXN0
aWdhdGUgPGxpPjxzcGFuIHN0eWxlPSJwb3NpdGlvbjpyZWxhdGl2ZTtsZWZ0Oi0xMDBweCI+PGRp
dj50ZXh0PC9kaXY+PC9zcGFuPjwvbGk+CiAgICAgICAgIH0KICAgICB9CiB9CkluZGV4OiBXZWJD
b3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3QuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlck9iamVjdC5jcHAJKHJldmlzaW9uIDU0NTAxKQorKysgV2ViQ29yZS9yZW5k
ZXJpbmcvUmVuZGVyT2JqZWN0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjIyMSw4ICsyMjIxLDYg
QEAgdm9pZCBSZW5kZXJPYmplY3Q6OmdldFRleHREZWNvcmF0aW9uQ29sbwogICAgICAgICAgICAg
fQogICAgICAgICB9CiAgICAgICAgIGN1cnIgPSBjdXJyLT5wYXJlbnQoKTsKLSAgICAgICAgaWYg
KGN1cnIgJiYgY3Vyci0+aXNSZW5kZXJCbG9jaygpICYmIHRvUmVuZGVyQmxvY2soY3VyciktPmlu
bGluZUNvbnRpbnVhdGlvbigpKQotICAgICAgICAgICAgY3VyciA9IHRvUmVuZGVyQmxvY2soY3Vy
ciktPmlubGluZUNvbnRpbnVhdGlvbigpOwogICAgIH0gd2hpbGUgKGN1cnIgJiYgZGVjb3JhdGlv
bnMgJiYgKCFxdWlya3NNb2RlIHx8ICFjdXJyLT5ub2RlKCkgfHwKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAoIWN1cnItPm5vZGUoKS0+aGFzVGFnTmFtZShhVGFnKSAmJiAh
Y3Vyci0+bm9kZSgpLT5oYXNUYWdOYW1lKGZvbnRUYWcpKSkpOwogCkluZGV4OiBXZWJDb3JlL3Jl
bmRlcmluZy9SZW5kZXJPYmplY3QuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9S
ZW5kZXJPYmplY3QuaAkocmV2aXNpb24gNTQ1MDEpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5k
ZXJPYmplY3QuaAkod29ya2luZyBjb3B5KQpAQCAtMzY1LDYgKzM2NSwxMCBAQCBwdWJsaWM6CiAg
ICAgewogICAgICAgICByZXR1cm4gbV9pc0Fub255bW91cyAmJiBzdHlsZSgpLT5kaXNwbGF5KCkg
PT0gQkxPQ0sgJiYgc3R5bGUoKS0+c3R5bGVUeXBlKCkgPT0gTk9QU0VVRE8gJiYgIWlzTGlzdE1h
cmtlcigpOwogICAgIH0KKyAgICBib29sIGlzQW5vbnltb3VzSW5saW5lQmxvY2soKSBjb25zdAor
ICAgIHsKKyAgICAgICAgcmV0dXJuIG1faXNBbm9ueW1vdXMgJiYgc3R5bGUoKS0+ZGlzcGxheSgp
ID09IElOTElORV9CTE9DSyAmJiBzdHlsZSgpLT5zdHlsZVR5cGUoKSA9PSBOT1BTRVVETyAmJiAh
aXNSdWJ5UnVuKCkgJiYgIWlzUnVieUJhc2UoKTsKKyAgICB9CiAgICAgYm9vbCBpc0lubGluZUNv
bnRpbnVhdGlvbigpIGNvbnN0IHsgcmV0dXJuIChub2RlKCkgPyBub2RlKCktPnJlbmRlcmVyKCkg
IT0gdGhpcyA6IGZhbHNlKSAmJiBpc1JlbmRlcklubGluZSgpOyB9CiAgICAgYm9vbCBpc0Zsb2F0
aW5nKCkgY29uc3QgeyByZXR1cm4gbV9mbG9hdGluZzsgfQogICAgIGJvb2wgaXNQb3NpdGlvbmVk
KCkgY29uc3QgeyByZXR1cm4gbV9wb3NpdGlvbmVkOyB9IC8vIGFic29sdXRlIG9yIGZpeGVkIHBv
c2l0aW9uaW5nCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3RDaGlsZExpc3Qu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdENoaWxkTGlz
dC5jcHAJKHJldmlzaW9uIDU0NTAxKQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0
Q2hpbGRMaXN0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzE2LDE2ICszMTYsNiBAQCB2b2lkIFJl
bmRlck9iamVjdENoaWxkTGlzdDo6dXBkYXRlQmVmb3JlCiAKICAgICAvLyBXaGV0aGVyIG9yIG5v
dCB3ZSBub3cgd2FudCBnZW5lcmF0ZWQgY29udGVudC4gIAogICAgIGJvb2wgbmV3Q29udGVudFdh
bnRlZCA9IHBzZXVkb0VsZW1lbnRTdHlsZSAmJiBwc2V1ZG9FbGVtZW50U3R5bGUtPmRpc3BsYXko
KSAhPSBOT05FOwotCi0gICAgLy8gRm9yIDxxPjxwLz48L3E+LCBpZiB0aGlzIG9iamVjdCBpcyB0
aGUgaW5saW5lIGNvbnRpbnVhdGlvbiBvZiB0aGUgPHE+LCB3ZSBvbmx5IHdhbnQgdG8gZ2VuZXJh
dGUKLSAgICAvLyA6YWZ0ZXIgY29udGVudCBhbmQgbm90IDpiZWZvcmUgY29udGVudC4KLSAgICBp
ZiAobmV3Q29udGVudFdhbnRlZCAmJiB0eXBlID09IEJFRk9SRSAmJiBvd25lci0+aXNSZW5kZXJJ
bmxpbmUoKSAmJiB0b1JlbmRlcklubGluZShvd25lciktPmlzSW5saW5lQ29udGludWF0aW9uKCkp
Ci0gICAgICAgIG5ld0NvbnRlbnRXYW50ZWQgPSBmYWxzZTsKLQotICAgIC8vIFNpbWlsYXJseSwg
aWYgd2UncmUgdGhlIGJlZ2lubmluZyBvZiBhIDxxPiwgYW5kIHRoZXJlJ3MgYW4gaW5saW5lIGNv
bnRpbnVhdGlvbiBmb3Igb3VyIG9iamVjdCwKLSAgICAvLyB0aGVuIHdlIGRvbid0IGdlbmVyYXRl
IHRoZSA6YWZ0ZXIgY29udGVudC4KLSAgICBpZiAobmV3Q29udGVudFdhbnRlZCAmJiB0eXBlID09
IEFGVEVSICYmIG93bmVyLT5pc1JlbmRlcklubGluZSgpICYmIHRvUmVuZGVySW5saW5lKG93bmVy
KS0+Y29udGludWF0aW9uKCkpCi0gICAgICAgIG5ld0NvbnRlbnRXYW50ZWQgPSBmYWxzZTsKICAg
ICAKICAgICAvLyBJZiB3ZSBkb24ndCB3YW50IGdlbmVyYXRlZCBjb250ZW50IGFueSBsb25nZXIs
IG9yIGlmIHdlIGhhdmUgZ2VuZXJhdGVkIGNvbnRlbnQsIGJ1dCBpdCdzIG5vIGxvbmdlcgogICAg
IC8vIGlkZW50aWNhbCB0byB0aGUgbmV3IGNvbnRlbnQgZGF0YSB3ZSB3YW50IHRvIGJ1aWxkIHJl
bmRlciBvYmplY3RzIGZvciwgdGhlbiB3ZSBudWtlIGFsbApJbmRleDogV2ViQ29yZS9yZW5kZXJp
bmcvUmVuZGVyUnVieUJhc2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1Jl
bmRlclJ1YnlCYXNlLmNwcAkocmV2aXNpb24gNTQ1MDEpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9S
ZW5kZXJSdWJ5QmFzZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTExNiw3ICsxMTYsNiBAQCB2b2lk
IFJlbmRlclJ1YnlCYXNlOjptb3ZlQmxvY2tDaGlsZHJlbihSCiAgICAgICAgICAgICAgICAgaWYg
KGNoaWxkLT5pc0Fub255bW91c0Jsb2NrKCkpIHsKICAgICAgICAgICAgICAgICAgICAgUmVuZGVy
QmxvY2sqIGFub25CbG9jayA9IHRvUmVuZGVyQmxvY2soY2hpbGQpOwogICAgICAgICAgICAgICAg
ICAgICBBU1NFUlQoYW5vbkJsb2NrLT5jaGlsZHJlbklubGluZSgpKTsKLSAgICAgICAgICAgICAg
ICAgICAgQVNTRVJUKCFhbm9uQmxvY2stPmlubGluZUNvbnRpbnVhdGlvbigpKTsKICAgICAgICAg
ICAgICAgICAgICAgYW5vbkJsb2NrLT5tb3ZlQWxsQ2hpbGRyZW5Ubyh0b0Jhc2UsIHRvQmFzZS0+
Y2hpbGRyZW4oKSk7CiAgICAgICAgICAgICAgICAgICAgIGFub25CbG9jay0+ZGVsZXRlTGluZUJv
eFRyZWUoKTsKICAgICAgICAgICAgICAgICAgICAgYW5vbkJsb2NrLT5kZXN0cm95KCk7CkBAIC0x
NDMsNyArMTQyLDYgQEAgdm9pZCBSZW5kZXJSdWJ5QmFzZTo6bW92ZUJsb2NrQ2hpbGRyZW4oUgog
CiAgICAgICAgICAgICAgICAgICAgIFJlbmRlckJsb2NrKiBhbm9uQmxvY2sgPSB0b1JlbmRlckJs
b2NrKGNoaWxkKTsKICAgICAgICAgICAgICAgICAgICAgQVNTRVJUKGFub25CbG9jay0+Y2hpbGRy
ZW5JbmxpbmUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIEFTU0VSVCghYW5vbkJsb2NrLT5pbmxp
bmVDb250aW51YXRpb24oKSk7CiAgICAgICAgICAgICAgICAgICAgIC8vIE1vdmUgaW5saW5lIGNo
aWxkcmVuIG91dCBvZiBhbm9ueW1vdXMgYmxvY2suCiAgICAgICAgICAgICAgICAgICAgIGFub25C
bG9jay0+bW92ZUFsbENoaWxkcmVuVG8odGhpcywgY2hpbGRyZW4oKSwgYW5vbkJsb2NrKTsKICAg
ICAgICAgICAgICAgICAgICAgYW5vbkJsb2NrLT5kZWxldGVMaW5lQm94VHJlZSgpOwpJbmRleDog
V2ViQ29yZS9yZW5kZXJpbmcvUm9vdElubGluZUJveC5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29y
ZS9yZW5kZXJpbmcvUm9vdElubGluZUJveC5jcHAJKHJldmlzaW9uIDU0NTAxKQorKysgV2ViQ29y
ZS9yZW5kZXJpbmcvUm9vdElubGluZUJveC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMxLDYgKzMx
LDcgQEAKICNpbmNsdWRlICJQYWdlLmgiCiAjaW5jbHVkZSAiUmVuZGVyQXJlbmEuaCIKICNpbmNs
dWRlICJSZW5kZXJCbG9jay5oIgorI2luY2x1ZGUgIlJlbmRlclZpZXcuaCIKIAogdXNpbmcgbmFt
ZXNwYWNlIHN0ZDsKIApAQCAtMTYzLDYgKzE2NCw0NiBAQCB2b2lkIFJvb3RJbmxpbmVCb3g6OnBh
aW50Q3VzdG9tSGlnaGxpZ2h0CiAKIHZvaWQgUm9vdElubGluZUJveDo6cGFpbnQoUmVuZGVyT2Jq
ZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgaW50IHR4LCBpbnQgdHkpCiB7CisgICAgUmVuZGVy
QmxvY2sqIGNoaWxkID0gYW5vbnltb3VzSW5saW5lQmxvY2soKTsKKyAgICBpZiAoY2hpbGQpIHsK
KyAgICAgICAgLy8gVHJlYXQgcGFpbnRpbmcgb2YgYSBzcGVjaWFsIGlubGluZS1ibG9jayBsaW5l
IGxpa2UgdGhlIHBhaW50aW5nIG9mIGEgbm9ybWFsIGJsb2NrIGFuZCBnbyB0aHJvdWdoIGFsbCBw
aGFzZXMuCisgICAgICAgIFBhaW50UGhhc2UgbmV3UGhhc2UgPSAocGFpbnRJbmZvLnBoYXNlID09
IFBhaW50UGhhc2VDaGlsZE91dGxpbmVzKSA/IFBhaW50UGhhc2VPdXRsaW5lIDogcGFpbnRJbmZv
LnBoYXNlOworICAgICAgICBuZXdQaGFzZSA9IChuZXdQaGFzZSA9PSBQYWludFBoYXNlQ2hpbGRC
bG9ja0JhY2tncm91bmRzKSA/IFBhaW50UGhhc2VDaGlsZEJsb2NrQmFja2dyb3VuZCA6IG5ld1Bo
YXNlOworICAgIAorICAgICAgICAvLyBXZSBkb24ndCBwYWludCBvdXIgb3duIGJhY2tncm91bmQs
IGJ1dCB3ZSBkbyBsZXQgdGhlIGNoaWxkIHBhaW50IGl0cyBiYWNrZ3JvdW5kLgorICAgICAgICBS
ZW5kZXJPYmplY3Q6OlBhaW50SW5mbyBpbmZvKHBhaW50SW5mbyk7CisgICAgICAgIGluZm8ucGhh
c2UgPSBuZXdQaGFzZTsKKyAgICAgICAgaW5mby5wYWludGluZ1Jvb3QgPSByZW5kZXJlcigpLT5w
YWludGluZ1Jvb3RGb3JDaGlsZHJlbihwYWludEluZm8pOworICAgICAgICBib29sIGlzUHJpbnRp
bmcgPSByZW5kZXJlcigpLT5kb2N1bWVudCgpLT5wcmludGluZygpOworICAgICAgICAKKyAgICAg
ICAgLy8gQ2hlY2sgZm9yIHBhZ2UtYnJlYWstYmVmb3JlOiBhbHdheXMsIGFuZCBpZiBpdCdzIHNl
dCwgYnJlYWsgYW5kIGJhaWwuCisgICAgICAgIGlmIChpc1ByaW50aW5nICYmIGNoaWxkLT5zdHls
ZSgpLT5wYWdlQnJlYWtCZWZvcmUoKSA9PSBQQkFMV0FZUyAmJgorICAgICAgICAgICAgYmxvY2so
KS0+aW5Sb290QmxvY2tDb250ZXh0KCkgJiYgKHR5ICsgY2hpbGQtPnkoKSkgPiBwYWludEluZm8u
cmVjdC55KCkgJiYgCisgICAgICAgICAgICAodHkgKyBjaGlsZC0+eSgpKSA8IHBhaW50SW5mby5y
ZWN0LmJvdHRvbSgpKSB7CisgICAgICAgICAgICByZW5kZXJlcigpLT52aWV3KCktPnNldEJlc3RU
cnVuY2F0ZWRBdCh0eSArIGNoaWxkLT55KCksIGJsb2NrKCksIHRydWUpOworICAgICAgICAgICAg
cmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFjaGlsZC0+aGFzU2VsZlBhaW50aW5n
TGF5ZXIoKSkKKyAgICAgICAgICAgIGNoaWxkLT5wYWludChpbmZvLCB0eCwgdHkpOworCisgICAg
ICAgIC8vIENoZWNrIGZvciBwYWdlLWJyZWFrLWFmdGVyOiBhbHdheXMsIGFuZCBpZiBpdCdzIHNl
dCwgYnJlYWsgYW5kIGJhaWwuCisgICAgICAgIGlmIChpc1ByaW50aW5nICYmIGNoaWxkLT5zdHls
ZSgpLT5wYWdlQnJlYWtBZnRlcigpID09IFBCQUxXQVlTICYmIAorICAgICAgICAgICAgYmxvY2so
KS0+aW5Sb290QmxvY2tDb250ZXh0KCkgJiYgKHR5ICsgY2hpbGQtPnkoKSArIGNoaWxkLT5oZWln
aHQoKSkgPiBwYWludEluZm8ucmVjdC55KCkgJiYgCisgICAgICAgICAgICAodHkgKyBjaGlsZC0+
eSgpICsgY2hpbGQtPmhlaWdodCgpKSA8IHBhaW50SW5mby5yZWN0LmJvdHRvbSgpKSB7CisgICAg
ICAgICAgICByZW5kZXJlcigpLT52aWV3KCktPnNldEJlc3RUcnVuY2F0ZWRBdCh0eSArIGNoaWxk
LT55KCkgKyBjaGlsZC0+aGVpZ2h0KCkgKyBtYXgoMCwgY2hpbGQtPmNvbGxhcHNlZE1hcmdpbkJv
dHRvbSgpKSwgYmxvY2soKSwgdHJ1ZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0K
KyAgICAgICAgCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBPbmx5IHBhaW50IGR1
cmluZyB0aGUgZm9yZWdyb3VuZC9zZWxlY3Rpb24gcGhhc2VzIGlmIHdlIGRvbid0IGhhdmUgYSBz
cGVjaWFsIGFub255bW91cyBpbmxpbmUgYmxvY2suCisgICAgaWYgKHBhaW50SW5mby5waGFzZSAh
PSBQYWludFBoYXNlRm9yZWdyb3VuZCAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZVNl
bGVjdGlvbiAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZU91dGxpbmUgCisgICAgICAg
ICYmIHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlU2VsZk91dGxpbmUgJiYgcGFpbnRJbmZv
LnBoYXNlICE9IFBhaW50UGhhc2VDaGlsZE91dGxpbmVzICYmIHBhaW50SW5mby5waGFzZSAhPSBQ
YWludFBoYXNlVGV4dENsaXAKKyAgICAgICAgJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhh
c2VNYXNrKQorICAgICAgICByZXR1cm47CisKICAgICBJbmxpbmVGbG93Qm94OjpwYWludChwYWlu
dEluZm8sIHR4LCB0eSk7CiAgICAgcGFpbnRFbGxpcHNpc0JveChwYWludEluZm8sIHR4LCB0eSk7
CiAjaWYgUExBVEZPUk0oTUFDKQpAQCAtMjA0LDYgKzI0NSwxNyBAQCB2b2lkIFJvb3RJbmxpbmVC
b3g6OmNoaWxkUmVtb3ZlZChJbmxpbmVCCiAKIGludCBSb290SW5saW5lQm94Ojp2ZXJ0aWNhbGx5
QWxpZ25Cb3hlcyhpbnQgaGVpZ2h0T2ZCbG9jaykKIHsKKyAgICBSZW5kZXJCbG9jayogaW5saW5l
QmxvY2sgPSBhbm9ueW1vdXNJbmxpbmVCbG9jaygpOworICAgIGlmIChpbmxpbmVCbG9jaykgewor
ICAgICAgICBpbnQgbGluZVRvcCA9IGlubGluZUJsb2NrLT55KCk7CisgICAgICAgIGludCBsaW5l
Qm90dG9tID0gaW5saW5lQmxvY2stPnkoKSArIGlubGluZUJsb2NrLT5oZWlnaHQoKTsKKyAgICAg
ICAgZmlyc3RDaGlsZCgpLT5zZXRZKGxpbmVUb3ApOworICAgICAgICBzZXRZKGxpbmVUb3ApOwor
ICAgICAgICBjb21wdXRlVmVydGljYWxPdmVyZmxvdyhsaW5lVG9wLCBsaW5lQm90dG9tLCB0cnVl
KTsKKyAgICAgICAgc2V0TGluZVRvcEJvdHRvbVBvc2l0aW9ucyhsaW5lVG9wLCBsaW5lQm90dG9t
KTsKKyAgICAgICAgcmV0dXJuIGhlaWdodE9mQmxvY2s7CisgICAgfQorICAgIAogICAgIGludCBt
YXhQb3NpdGlvblRvcCA9IDA7CiAgICAgaW50IG1heFBvc2l0aW9uQm90dG9tID0gMDsKICAgICBp
bnQgbWF4QXNjZW50ID0gMDsKQEAgLTIxNyw3ICsyNjksNiBAQCBpbnQgUm9vdElubGluZUJveDo6
dmVydGljYWxseUFsaWduQm94ZXMoCiAgICAgYm9vbCBzdHJpY3RNb2RlID0gKGN1cnIgJiYgY3Vy
ci0+ZG9jdW1lbnQoKS0+aW5TdHJpY3RNb2RlKCkpOwogCiAgICAgY29tcHV0ZUxvZ2ljYWxCb3hI
ZWlnaHRzKG1heFBvc2l0aW9uVG9wLCBtYXhQb3NpdGlvbkJvdHRvbSwgbWF4QXNjZW50LCBtYXhE
ZXNjZW50LCBzdHJpY3RNb2RlKTsKLQogICAgIGlmIChtYXhBc2NlbnQgKyBtYXhEZXNjZW50IDwg
bWF4KG1heFBvc2l0aW9uVG9wLCBtYXhQb3NpdGlvbkJvdHRvbSkpCiAgICAgICAgIGFkanVzdE1h
eEFzY2VudEFuZERlc2NlbnQobWF4QXNjZW50LCBtYXhEZXNjZW50LCBtYXhQb3NpdGlvblRvcCwg
bWF4UG9zaXRpb25Cb3R0b20pOwogCkBAIC00MzAsNCArNDgxLDkgQEAgdm9pZCBSb290SW5saW5l
Qm94OjphdHRhY2hMaW5lQm94VG9SZW5kZQogICAgIGJsb2NrKCktPmxpbmVCb3hlcygpLT5hdHRh
Y2hMaW5lQm94KHRoaXMpOwogfQogCitSZW5kZXJCbG9jayogUm9vdElubGluZUJveDo6YW5vbnlt
b3VzSW5saW5lQmxvY2soKSBjb25zdAoreworICAgIHJldHVybiBmaXJzdENoaWxkKCkgJiYgZmly
c3RDaGlsZCgpID09IGxhc3RDaGlsZCgpICYmICFmaXJzdENoaWxkKCktPmlzVGV4dCgpICYmIGZp
cnN0Q2hpbGQoKS0+cmVuZGVyZXIoKS0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpID8gdG9SZW5k
ZXJCbG9jayhmaXJzdENoaWxkKCktPnJlbmRlcmVyKCkpIDogMDsKK30KKwogfSAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUm9vdElubGluZUJveC5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1Jvb3RJbmxpbmVCb3guaAkocmV2aXNpb24gNTQ1
MDEpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9Sb290SW5saW5lQm94LmgJKHdvcmtpbmcgY29weSkK
QEAgLTEzMiw2ICsxMzIsOCBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCB2b2lkIGF0dGFjaExpbmVC
b3hUb1JlbmRlck9iamVjdCgpOwogICAgIHZpcnR1YWwgdm9pZCByZW1vdmVMaW5lQm94RnJvbVJl
bmRlck9iamVjdCgpOwogCisgICAgUmVuZGVyQmxvY2sqIGFub255bW91c0lubGluZUJsb2NrKCkg
Y29uc3Q7CisKIHByb3RlY3RlZDoKICAgICAvLyBXaGVyZSB0aGlzIGxpbmUgZW5kZWQuICBUaGUg
ZXhhY3Qgb2JqZWN0IGFuZCB0aGUgcG9zaXRpb24gd2l0aGluIHRoYXQgb2JqZWN0IGFyZSBzdG9y
ZWQgc28gdGhhdAogICAgIC8vIHdlIGNhbiBjcmVhdGUgYW4gSW5saW5lSXRlcmF0b3IgYmVnaW5u
aW5nIGp1c3QgYWZ0ZXIgdGhlIGVuZCBvZiB0aGlzIGxpbmUuCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>48431</attachid>
            <date>2010-02-09 11:40:50 -0800</date>
            <delta_ts>2010-02-09 15:44:12 -0800</delta_ts>
            <desc>This patch fixes selection painting.</desc>
            <filename>patch.txt</filename>
            <type>text/plain</type>
            <size>126149</size>
            <attacher name="Dave Hyatt">hyatt</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShyZXZpc2lv
biA1NDUwMSkKKysrIFdlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCSh3
b3JraW5nIGNvcHkpCkBAIC00NTQ4LDYgKzQ1NDgsOSBAQAogCQlCQ0U2NUJFQTBFQUNERjE2MDA3
RTQ1MzMgLyogTGVuZ3RoLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IEJDRTY1QkU4MEVBQ0RGMTYwMDdFNDUzMyAvKiBMZW5ndGguY3BwICovOyB9Owog
CQlCQ0U2NUJFQjBFQUNERjE2MDA3RTQ1MzMgLyogTGVuZ3RoLmggaW4gSGVhZGVycyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCQ0U2NUJFOTBFQUNERjE2MDA3RTQ1MzMgLyog
TGVuZ3RoLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsK
IAkJQkNFNjVEMzIwRUFEMTIxMTAwN0U0NTMzIC8qIFRoZW1lLmNwcCBpbiBTb3VyY2VzICovID0g
e2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJDRTY1RDMxMEVBRDEyMTEwMDdFNDUzMyAv
KiBUaGVtZS5jcHAgKi87IH07CisJCUJDRTc4OTE2MTEyMEQ2MDgwMDYwRUNFNSAvKiBJbmxpbmVJ
dGVyYXRvci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
QkNFNzg5MTUxMTIwRDYwODAwNjBFQ0U1IC8qIElubGluZUl0ZXJhdG9yLmggKi87IH07CisJCUJD
RTc4OTg2MTEyMEU3QTYwMDYwRUNFNSAvKiBCaWRpUnVuLmggaW4gSGVhZGVycyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCQ0U3ODk4NTExMjBFN0E2MDA2MEVDRTUgLyogQmlk
aVJ1bi5oICovOyB9OworCQlCQ0U3ODk4QjExMjBFODAyMDA2MEVDRTUgLyogQmlkaVJ1bi5jcHAg
aW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCQ0U3ODk4QTEx
MjBFODAyMDA2MEVDRTUgLyogQmlkaVJ1bi5jcHAgKi87IH07CiAJCUJDRTdCMTkzMEQ0RTg2OTYw
MDc1QTUzOSAvKiBKU0hpc3RvcnlDdXN0b20uY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gQkNFN0IxOTIwRDRFODY5NjAwNzVBNTM5IC8qIEpTSGlzdG9y
eUN1c3RvbS5jcHAgKi87IH07CiAJCUJDRTk5RUMzMERDQTYyNDEwMDE4MjY4MyAvKiBKU1hTTFRQ
cm9jZXNzb3JDb25zdHJ1Y3Rvci5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSBCQ0U5OUVDMTBEQ0E2MjQxMDAxODI2ODMgLyogSlNYU0xUUHJvY2Vzc29y
Q29uc3RydWN0b3IuY3BwICovOyB9OwogCQlCQ0U5OUVDNDBEQ0E2MjQxMDAxODI2ODMgLyogSlNY
U0xUUHJvY2Vzc29yQ29uc3RydWN0b3IuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IEJDRTk5RUMyMERDQTYyNDEwMDE4MjY4MyAvKiBKU1hTTFRQcm9jZXNz
b3JDb25zdHJ1Y3Rvci5oICovOyB9OwpAQCAtOTgxMCw2ICs5ODEzLDkgQEAKIAkJQkNFNjVCRTgw
RUFDREYxNjAwN0U0NTMzIC8qIExlbmd0aC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5j
cHA7IHBhdGggPSBMZW5ndGguY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlCQ0U2
NUJFOTBFQUNERjE2MDA3RTQ1MzMgLyogTGVuZ3RoLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMu
aDsgcGF0aCA9IExlbmd0aC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlCQ0U2NUQz
MTBFQUQxMjExMDA3RTQ1MzMgLyogVGhlbWUuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAu
Y3BwOyBwYXRoID0gVGhlbWUuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlCQ0U3
ODkxNTExMjBENjA4MDA2MEVDRTUgLyogSW5saW5lSXRlcmF0b3IuaCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuYy5oOyBwYXRoID0gSW5saW5lSXRlcmF0b3IuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+
IjsgfTsKKwkJQkNFNzg5ODUxMTIwRTdBNjAwNjBFQ0U1IC8qIEJpZGlSdW4uaCAqLyA9IHtpc2Eg
PSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9
IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQmlkaVJ1bi5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OworCQlCQ0U3ODk4QTExMjBFODAyMDA2MEVDRTUgLyogQmlkaVJ1bi5jcHAgKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUg
PSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBCaWRpUnVuLmNwcDsgc291cmNlVHJlZSA9ICI8
Z3JvdXA+IjsgfTsKIAkJQkNFN0IxOTIwRDRFODY5NjAwNzVBNTM5IC8qIEpTSGlzdG9yeUN1c3Rv
bS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFz
dEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBKU0hpc3RvcnlDdXN0
b20uY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlCQ0U5OUVDMTBEQ0E2MjQxMDAx
ODI2ODMgLyogSlNYU0xUUHJvY2Vzc29yQ29uc3RydWN0b3IuY3BwICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jcHAuY3BwOyBwYXRoID0gSlNYU0xUUHJvY2Vzc29yQ29uc3RydWN0b3IuY3BwOyBzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlCQ0U5OUVDMjBEQ0E2MjQxMDAxODI2ODMgLyogSlNY
U0xUUHJvY2Vzc29yQ29uc3RydWN0b3IuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBm
aWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRo
ID0gSlNYU0xUUHJvY2Vzc29yQ29uc3RydWN0b3IuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKQEAgLTE1NTU2LDYgKzE1NTYyLDggQEAKIAkJCQlCQzhDOEZBQTBERENEMkYyMDBCNTkyRjQg
Lyogc3R5bGUgKi8sCiAJCQkJQThDRkYwNEIwQTE1NEYwOTAwMEE0MjM0IC8qIEF1dG9UYWJsZUxh
eW91dC5jcHAgKi8sCiAJCQkJQThDRkYwNDkwQTE1NEYwOTAwMEE0MjM0IC8qIEF1dG9UYWJsZUxh
eW91dC5oICovLAorCQkJCUJDRTc4OThBMTEyMEU4MDIwMDYwRUNFNSAvKiBCaWRpUnVuLmNwcCAq
LywKKwkJCQlCQ0U3ODk4NTExMjBFN0E2MDA2MEVDRTUgLyogQmlkaVJ1bi5oICovLAogCQkJCUJD
RUE0ODE1MDk3RDkzMDIwMDk0QzlFNCAvKiBicmVha19saW5lcy5jcHAgKi8sCiAJCQkJQkNFQTQ4
MTYwOTdEOTMwMjAwOTRDOUU0IC8qIGJyZWFrX2xpbmVzLmggKi8sCiAJCQkJOTM5MkYxNEYwQUQx
ODYyMzAwNjkxQkQ0IC8qIENvdW50ZXJOb2RlLmNwcCAqLywKQEAgLTE1NTcyLDYgKzE1NTgwLDcg
QEAKIAkJCQlBOENGRjVERTBBMTU1QTA1MDAwQTQyMzQgLyogSW5saW5lQm94LmggKi8sCiAJCQkJ
QThDRkY1REQwQTE1NUEwNTAwMEE0MjM0IC8qIElubGluZUZsb3dCb3guY3BwICovLAogCQkJCUE4
Q0ZGNURDMEExNTVBMDUwMDBBNDIzNCAvKiBJbmxpbmVGbG93Qm94LmggKi8sCisJCQkJQkNFNzg5
MTUxMTIwRDYwODAwNjBFQ0U1IC8qIElubGluZUl0ZXJhdG9yLmggKi8sCiAJCQkJQThDRkY1REIw
QTE1NUEwNTAwMEE0MjM0IC8qIElubGluZVJ1bkJveC5oICovLAogCQkJCUJDRUE0ODFBMDk3RDkz
MDIwMDk0QzlFNCAvKiBJbmxpbmVUZXh0Qm94LmNwcCAqLywKIAkJCQlCQ0VBNDgxQjA5N0Q5MzAy
MDA5NEM5RTQgLyogSW5saW5lVGV4dEJveC5oICovLApAQCAtMTg1MDUsNiArMTg1MTQsOCBAQAog
CQkJCUI3MUZFNkRGMTEwOTFDQjMwMERBRUY3NyAvKiBQcmludENvbnRleHQuaCBpbiBIZWFkZXJz
ICovLAogCQkJCTlGNzIzMDRGMTExODRCNDEwMEFEMDEyNiAvKiBTY3JpcHRQcm9maWxlLmggaW4g
SGVhZGVycyAqLywKIAkJCQk5RjcyMzA1MTExMTg0QjQxMDBBRDAxMjYgLyogU2NyaXB0UHJvZmls
ZXIuaCBpbiBIZWFkZXJzICovLAorCQkJCUJDRTc4OTE2MTEyMEQ2MDgwMDYwRUNFNSAvKiBJbmxp
bmVJdGVyYXRvci5oIGluIEhlYWRlcnMgKi8sCisJCQkJQkNFNzg5ODYxMTIwRTdBNjAwNjBFQ0U1
IC8qIEJpZGlSdW4uaCBpbiBIZWFkZXJzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBsb3lt
ZW50UG9zdHByb2Nlc3NpbmcgPSAwOwogCQl9OwpAQCAtMjA2ODMsNiArMjA2OTQsNyBAQAogCQkJ
CTg0RDBDNDA0MTExNUYxRDQwMDE4QUEzNCAvKiBBZmZpbmVUcmFuc2Zvcm0uY3BwIGluIFNvdXJj
ZXMgKi8sCiAJCQkJQjc3NkQ0M0QxMTA0NTI3NTAwQkVCMEVDIC8qIFByaW50Q29udGV4dC5jcHAg
aW4gU291cmNlcyAqLywKIAkJCQk5RjcyMzA1MDExMTg0QjQxMDBBRDAxMjYgLyogU2NyaXB0UHJv
ZmlsZXIuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJQkNFNzg5OEIxMTIwRTgwMjAwNjBFQ0U1IC8q
IEJpZGlSdW4uY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkpOwogCQkJcnVuT25seUZvckRlcGxveW1l
bnRQb3N0cHJvY2Vzc2luZyA9IDA7CiAJCX07CkluZGV4OiBXZWJDb3JlL2FjY2Vzc2liaWxpdHkv
QWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9hY2Nl
c3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3QuY3BwCShyZXZpc2lvbiA1NDUwMSkK
KysrIFdlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0LmNwcAko
d29ya2luZyBjb3B5KQpAQCAtNTY3LDEyICs1NjcsOCBAQCBFbGVtZW50KiBBY2Nlc3NpYmlsaXR5
UmVuZGVyT2JqZWN0OjphbmNoCiAgICAgUmVuZGVyT2JqZWN0KiBjdXJyUmVuZGVyZXI7CiAgICAg
CiAgICAgLy8gU2VhcmNoIHVwIHRoZSByZW5kZXIgdHJlZSBmb3IgYSBSZW5kZXJPYmplY3Qgd2l0
aCBhIERPTSBub2RlLiAgRGVmZXIgdG8gYW4gZWFybGllciBjb250aW51YXRpb24sIHRob3VnaC4K
LSAgICBmb3IgKGN1cnJSZW5kZXJlciA9IG1fcmVuZGVyZXI7IGN1cnJSZW5kZXJlciAmJiAhY3Vy
clJlbmRlcmVyLT5ub2RlKCk7IGN1cnJSZW5kZXJlciA9IGN1cnJSZW5kZXJlci0+cGFyZW50KCkp
IHsKLSAgICAgICAgaWYgKGN1cnJSZW5kZXJlci0+aXNSZW5kZXJCbG9jaygpKSB7Ci0gICAgICAg
ICAgICBSZW5kZXJJbmxpbmUqIGNvbnRpbnVhdGlvbiA9IHRvUmVuZGVyQmxvY2soY3VyclJlbmRl
cmVyKS0+aW5saW5lQ29udGludWF0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoY29udGludWF0aW9u
KQotICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZS0+Z2V0T3JDcmVhdGUoY29udGludWF0aW9u
KS0+YW5jaG9yRWxlbWVudCgpOwotICAgICAgICB9CisgICAgZm9yIChjdXJyUmVuZGVyZXIgPSBt
X3JlbmRlcmVyOyBjdXJyUmVuZGVyZXIgJiYgIWN1cnJSZW5kZXJlci0+bm9kZSgpOyBjdXJyUmVu
ZGVyZXIgPSBjdXJyUmVuZGVyZXItPnBhcmVudCgpKQorICAgIHsKICAgICB9CiAgICAgCiAgICAg
Ly8gYmFpbCBpZiBub25lIGZvdW5kCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9CaWRpUnVuLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9CaWRpUnVuLmNwcAkocmV2aXNpb24g
MCkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL0JpZGlSdW4uY3BwCShyZXZpc2lvbiAwKQpAQCAtMCww
ICsxLDc0IEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMTk5OSBMYXJzIEtub2xsIChrbm9sbEBr
ZGUub3JnKQorICogICAgICAgICAgIChDKSAxOTk5IEFudHRpIEtvaXZpc3RvIChrb2l2aXN0b0Br
ZGUub3JnKQorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDEwIEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBBbmRy
ZXcgV2VsbGluZ3RvbiAocHJvdG9uQHdpcmV0YXBwZWQubmV0KQorICoKKyAqIFRoaXMgbGlicmFy
eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1v
ZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
CisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
OyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9u
KSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQg
aW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBX
QVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFO
VEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdO
VQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisg
KgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0
aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisg
KiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgIkJpZGlSdW4uaCIKKyNpbmNsdWRlICJJbmxpbmVCb3guaCIKKyNpbmNs
dWRlICJSZW5kZXJBcmVuYS5oIgorI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkTGVha0NvdW50ZXIu
aD4KKwordXNpbmcgbmFtZXNwYWNlIFdURjsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisjaWZu
ZGVmIE5ERUJVRworc3RhdGljIFJlZkNvdW50ZWRMZWFrQ291bnRlciBiaWRpUnVuQ291bnRlcigi
QmlkaVJ1biIpOworCitzdGF0aWMgYm9vbCBpbkJpZGlSdW5EZXN0cm95OworI2VuZGlmCisKK3Zv
aWQgQmlkaVJ1bjo6ZGVzdHJveSgpCit7CisjaWZuZGVmIE5ERUJVRworICAgIGluQmlkaVJ1bkRl
c3Ryb3kgPSB0cnVlOworI2VuZGlmCisgICAgUmVuZGVyQXJlbmEqIHJlbmRlckFyZW5hID0gbV9v
YmplY3QtPnJlbmRlckFyZW5hKCk7CisgICAgZGVsZXRlIHRoaXM7CisjaWZuZGVmIE5ERUJVRwor
ICAgIGluQmlkaVJ1bkRlc3Ryb3kgPSBmYWxzZTsKKyNlbmRpZgorCisgICAgLy8gUmVjb3ZlciB0
aGUgc2l6ZSBsZWZ0IHRoZXJlIGZvciB1cyBieSBvcGVyYXRvciBkZWxldGUgYW5kIGZyZWUgdGhl
IG1lbW9yeS4KKyAgICByZW5kZXJBcmVuYS0+ZnJlZSgqcmVpbnRlcnByZXRfY2FzdDxzaXplX3Qq
Pih0aGlzKSwgdGhpcyk7Cit9CisKK3ZvaWQqIEJpZGlSdW46Om9wZXJhdG9yIG5ldyhzaXplX3Qg
c3osIFJlbmRlckFyZW5hKiByZW5kZXJBcmVuYSkgdGhyb3coKQoreworI2lmbmRlZiBOREVCVUcK
KyAgICBiaWRpUnVuQ291bnRlci5pbmNyZW1lbnQoKTsKKyNlbmRpZgorICAgIHJldHVybiByZW5k
ZXJBcmVuYS0+YWxsb2NhdGUoc3opOworfQorCit2b2lkIEJpZGlSdW46Om9wZXJhdG9yIGRlbGV0
ZSh2b2lkKiBwdHIsIHNpemVfdCBzeikKK3sKKyNpZm5kZWYgTkRFQlVHCisgICAgYmlkaVJ1bkNv
dW50ZXIuZGVjcmVtZW50KCk7CisjZW5kaWYKKyAgICBBU1NFUlQoaW5CaWRpUnVuRGVzdHJveSk7
CisKKyAgICAvLyBTdGFzaCBzaXplIHdoZXJlIGRlc3Ryb3koKSBjYW4gZmluZCBpdC4KKyAgICAq
KHNpemVfdCopcHRyID0gc3o7Cit9CisKK30KSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL0JpZGlS
dW4uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9CaWRpUnVuLmgJKHJldmlzaW9u
IDApCisrKyBXZWJDb3JlL3JlbmRlcmluZy9CaWRpUnVuLmgJKHJldmlzaW9uIDApCkBAIC0wLDAg
KzEsNjYgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAxOTk5IExhcnMgS25vbGwgKGtub2xsQGtk
ZS5vcmcpCisgKiAgICAgICAgICAgKEMpIDE5OTkgQW50dGkgS29pdmlzdG8gKGtvaXZpc3RvQGtk
ZS5vcmcpCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMTAgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA2IEFuZHJl
dyBXZWxsaW5ndG9uIChwcm90b25Ad2lyZXRhcHBlZC5uZXQpCisgKgorICogVGhpcyBsaWJyYXJ5
IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9k
aWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMK
KyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247
IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24p
IGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBp
biB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdB
UlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5U
QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05V
CisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAq
CisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRo
ZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdh
cmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAq
IEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZuZGVmIEJpZGlSdW5f
aAorI2RlZmluZSBCaWRpUnVuX2gKKworI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KKyNp
bmNsdWRlICJCaWRpUmVzb2x2ZXIuaCIKKyNpbmNsdWRlICJSZW5kZXJUZXh0LmgiCisKK25hbWVz
cGFjZSBXZWJDb3JlIHsKKworY2xhc3MgQmlkaUNvbnRleHQ7CitjbGFzcyBJbmxpbmVCb3g7CisK
K3N0cnVjdCBCaWRpUnVuIDogQmlkaUNoYXJhY3RlclJ1biB7CisgICAgQmlkaVJ1bihpbnQgc3Rh
cnQsIGludCBzdG9wLCBSZW5kZXJPYmplY3QqIG9iamVjdCwgQmlkaUNvbnRleHQqIGNvbnRleHQs
IFdURjo6VW5pY29kZTo6RGlyZWN0aW9uIGRpcikKKyAgICAgICAgOiBCaWRpQ2hhcmFjdGVyUnVu
KHN0YXJ0LCBzdG9wLCBjb250ZXh0LCBkaXIpCisgICAgICAgICwgbV9vYmplY3Qob2JqZWN0KQor
ICAgICAgICAsIG1fYm94KDApCisgICAgeworICAgIH0KKworICAgIHZvaWQgZGVzdHJveSgpOwor
CisgICAgLy8gT3ZlcmxvYWRlZCBuZXcgb3BlcmF0b3IuCisgICAgdm9pZCogb3BlcmF0b3IgbmV3
KHNpemVfdCwgUmVuZGVyQXJlbmEqKSB0aHJvdygpOworCisgICAgLy8gT3ZlcnJpZGRlbiB0byBw
cmV2ZW50IHRoZSBub3JtYWwgZGVsZXRlIGZyb20gYmVpbmcgY2FsbGVkLgorICAgIHZvaWQgb3Bl
cmF0b3IgZGVsZXRlKHZvaWQqLCBzaXplX3QpOworCisgICAgQmlkaVJ1biogbmV4dCgpIHsgcmV0
dXJuIHN0YXRpY19jYXN0PEJpZGlSdW4qPihtX25leHQpOyB9CisKK3ByaXZhdGU6CisgICAgLy8g
VGhlIG5vcm1hbCBvcGVyYXRvciBuZXcgaXMgZGlzYWxsb3dlZC4KKyAgICB2b2lkKiBvcGVyYXRv
ciBuZXcoc2l6ZV90KSB0aHJvdygpOworCitwdWJsaWM6CisgICAgUmVuZGVyT2JqZWN0KiBtX29i
amVjdDsKKyAgICBJbmxpbmVCb3gqIG1fYm94OworfTsKKworfQorCisjZW5kaWYgLy8gQmlkaVJ1
bl9oCisKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUZsb3dCb3guY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUZsb3dCb3guY3BwCShyZXZpc2lvbiA1NDUw
MSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUZsb3dCb3guY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSAiUmVuZGVyTGF5ZXIuaCIKICNpbmNsdWRlICJS
ZW5kZXJMaXN0TWFya2VyLmgiCiAjaW5jbHVkZSAiUmVuZGVyVGFibGVDZWxsLmgiCisjaW5jbHVk
ZSAiUmVuZGVyVmlldy5oIgogI2luY2x1ZGUgIlJvb3RJbmxpbmVCb3guaCIKICNpbmNsdWRlICJU
ZXh0LmgiCiAKQEAgLTIyNywxNCArMjI4LDEzIEBAIHZvaWQgSW5saW5lRmxvd0JveDo6ZGV0ZXJt
aW5lU3BhY2luZ0ZvckYKICAgICAgICAgLy8gKDMpIFRoZSBsaW5lIG1heSBlbmQgb24gdGhlIGlu
bGluZS4gIElmIHdlIGFyZSB0aGUgbGFzdCBjaGlsZCAoY2xpbWJpbmcgdXAKICAgICAgICAgLy8g
dGhlIGVuZCBvYmplY3QncyBjaGFpbiksIHRoZW4gd2UganVzdCBjbG9zZWQgYXMgd2VsbC4KICAg
ICAgICAgaWYgKCFsaW5lQm94TGlzdC0+bGFzdExpbmVCb3goKS0+aXNDb25zdHJ1Y3RlZCgpKSB7
Ci0gICAgICAgICAgICBSZW5kZXJJbmxpbmUqIGlubGluZUZsb3cgPSB0b1JlbmRlcklubGluZShy
ZW5kZXJlcigpKTsKICAgICAgICAgICAgIGlmIChsdHIpIHsKICAgICAgICAgICAgICAgICBpZiAo
IW5leHRMaW5lQm94KCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKChsYXN0TGluZSAmJiAhaW5s
aW5lRmxvdy0+Y29udGludWF0aW9uKCkpIHx8IG5leHRPbkxpbmVFeGlzdHMoKSB8fCBvbkVuZENo
YWluKGVuZE9iamVjdCkpKQorICAgICAgICAgICAgICAgICAgICAobGFzdExpbmUgfHwgbmV4dE9u
TGluZUV4aXN0cygpIHx8IG9uRW5kQ2hhaW4oZW5kT2JqZWN0KSkpCiAgICAgICAgICAgICAgICAg
ICAgIGluY2x1ZGVSaWdodEVkZ2UgPSB0cnVlOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAg
ICAgICAgICAgICBpZiAoKCFwcmV2TGluZUJveCgpIHx8IHByZXZMaW5lQm94KCktPmlzQ29uc3Ry
dWN0ZWQoKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgKChsYXN0TGluZSAmJiAhaW5saW5lRmxv
dy0+Y29udGludWF0aW9uKCkpIHx8IHByZXZPbkxpbmVFeGlzdHMoKSB8fCBvbkVuZENoYWluKGVu
ZE9iamVjdCkpKQorICAgICAgICAgICAgICAgICAgICAobGFzdExpbmUgfHwgcHJldk9uTGluZUV4
aXN0cygpIHx8IG9uRW5kQ2hhaW4oZW5kT2JqZWN0KSkpCiAgICAgICAgICAgICAgICAgICAgIGlu
Y2x1ZGVMZWZ0RWRnZSA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTUwNCw3
ICs1MDQsNyBAQCB2b2lkIElubGluZUZsb3dCb3g6OnBsYWNlQm94ZXNWZXJ0aWNhbGx5CiAgICAg
ICAgICAgICAgICAgbmV3WSAtPSBjdXJyLT5ib3hNb2RlbE9iamVjdCgpLT5ib3JkZXJUb3AoKSAr
IGN1cnItPmJveE1vZGVsT2JqZWN0KCktPnBhZGRpbmdUb3AoKTsKICAgICAgICAgfSBlbHNlIGlm
ICghY3Vyci0+cmVuZGVyZXIoKS0+aXNCUigpKSB7CiAgICAgICAgICAgICBSZW5kZXJCb3gqIGJv
eCA9IHRvUmVuZGVyQm94KGN1cnItPnJlbmRlcmVyKCkpOwotICAgICAgICAgICAgbmV3WSArPSBi
b3gtPm1hcmdpblRvcCgpOworICAgICAgICAgICAgbmV3WSArPSBjdXJyLT5yZW5kZXJlcigpLT5p
c0Fub255bW91c0lubGluZUJsb2NrKCkgPyAwIDogYm94LT5tYXJnaW5Ub3AoKTsKICAgICAgICAg
fQogCiAgICAgICAgIGN1cnItPnNldFkobmV3WSk7CkBAIC02MzgsMTMgKzYzOCw3IEBAIHZvaWQg
SW5saW5lRmxvd0JveDo6cGFpbnQoUmVuZGVyT2JqZWN0OjoKICAgICAgICAgICAgIC8vIG91dGxp
bmVzLgogICAgICAgICAgICAgaWYgKHJlbmRlcmVyKCktPnN0eWxlKCktPnZpc2liaWxpdHkoKSA9
PSBWSVNJQkxFICYmIHJlbmRlcmVyKCktPmhhc091dGxpbmUoKSAmJiAhaXNSb290SW5saW5lQm94
KCkpIHsKICAgICAgICAgICAgICAgICBSZW5kZXJJbmxpbmUqIGlubGluZUZsb3cgPSB0b1JlbmRl
cklubGluZShyZW5kZXJlcigpKTsKLSAgICAgICAgICAgICAgICBpZiAoKGlubGluZUZsb3ctPmNv
bnRpbnVhdGlvbigpIHx8IGlubGluZUZsb3ctPmlzSW5saW5lQ29udGludWF0aW9uKCkpICYmICFi
b3hNb2RlbE9iamVjdCgpLT5oYXNTZWxmUGFpbnRpbmdMYXllcigpKSB7Ci0gICAgICAgICAgICAg
ICAgICAgIC8vIEFkZCBvdXJzZWx2ZXMgdG8gdGhlIGNvbnRhaW5pbmcgYmxvY2sgb2YgdGhlIGVu
dGlyZSBjb250aW51YXRpb24gc28gdGhhdCBpdCBjYW4KLSAgICAgICAgICAgICAgICAgICAgLy8g
cGFpbnQgdXMgYXRvbWljYWxseS4KLSAgICAgICAgICAgICAgICAgICAgUmVuZGVyQmxvY2sqIGJs
b2NrID0gcmVuZGVyZXIoKS0+Y29udGFpbmluZ0Jsb2NrKCktPmNvbnRhaW5pbmdCbG9jaygpOwot
ICAgICAgICAgICAgICAgICAgICBibG9jay0+YWRkQ29udGludWF0aW9uV2l0aE91dGxpbmUodG9S
ZW5kZXJJbmxpbmUocmVuZGVyZXIoKS0+bm9kZSgpLT5yZW5kZXJlcigpKSk7Ci0gICAgICAgICAg
ICAgICAgfSBlbHNlIGlmICghaW5saW5lRmxvdy0+aXNJbmxpbmVDb250aW51YXRpb24oKSkKLSAg
ICAgICAgICAgICAgICAgICAgcGFpbnRJbmZvLm91dGxpbmVPYmplY3RzLT5hZGQoaW5saW5lRmxv
dyk7CisgICAgICAgICAgICAgICAgcGFpbnRJbmZvLm91dGxpbmVPYmplY3RzLT5hZGQoaW5saW5l
Rmxvdyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAocGFpbnRJbmZvLnBoYXNl
ID09IFBhaW50UGhhc2VNYXNrKSB7CiAgICAgICAgICAgICBwYWludE1hc2socGFpbnRJbmZvLCB0
eCwgdHkpOwpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lSXRlcmF0b3IuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVJdGVyYXRvci5oCShyZXZpc2lvbiAwKQor
KysgV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lSXRlcmF0b3IuaAkocmV2aXNpb24gMCkKQEAgLTAs
MCArMSwyNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgTGFycyBLbm9sbCAoa25vbGxA
a2RlLm9yZykKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNiwgMjAwNywgMjAwOCwg
MjAwOSwgMjAxMCBBcHBsZSBJbmMuIEFsbCByaWdodCByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAo
QykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGli
cmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAq
IG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0
aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0
aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0
ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFO
WSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJD
SEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhl
IEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMu
CisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJh
cnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNl
ZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3Is
CisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBJbmxp
bmVJdGVyYXRvcl9oCisjZGVmaW5lIElubGluZUl0ZXJhdG9yX2gKKworI2luY2x1ZGUgIkJpZGlS
dW4uaCIKKyNpbmNsdWRlICJSZW5kZXJCbG9jay5oIgorI2luY2x1ZGUgIlJlbmRlclRleHQuaCIK
KyNpbmNsdWRlIDx3dGYvQWx3YXlzSW5saW5lLmg+CisjaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJh
cy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIElubGluZUl0ZXJhdG9yIHsKK3B1
YmxpYzoKKyAgICBJbmxpbmVJdGVyYXRvcigpCisgICAgICAgIDogYmxvY2soMCkKKyAgICAgICAg
LCBvYmooMCkKKyAgICAgICAgLCBwb3MoMCkKKyAgICAgICAgLCBuZXh0QnJlYWthYmxlUG9zaXRp
b24oLTEpCisgICAgeworICAgIH0KKworICAgIElubGluZUl0ZXJhdG9yKFJlbmRlckJsb2NrKiBi
LCBSZW5kZXJPYmplY3QqIG8sIHVuc2lnbmVkIHApCisgICAgICAgIDogYmxvY2soYikKKyAgICAg
ICAgLCBvYmoobykKKyAgICAgICAgLCBwb3MocCkKKyAgICAgICAgLCBuZXh0QnJlYWthYmxlUG9z
aXRpb24oLTEpCisgICAgeworICAgIH0KKworICAgIHZvaWQgaW5jcmVtZW50KElubGluZUJpZGlS
ZXNvbHZlciogcmVzb2x2ZXIgPSAwKTsKKyAgICBib29sIGF0RW5kKCkgY29uc3Q7CisKKyAgICBV
Q2hhciBjdXJyZW50KCkgY29uc3Q7CisgICAgV1RGOjpVbmljb2RlOjpEaXJlY3Rpb24gZGlyZWN0
aW9uKCkgY29uc3Q7CisKKyAgICBSZW5kZXJCbG9jayogYmxvY2s7CisgICAgUmVuZGVyT2JqZWN0
KiBvYmo7CisgICAgdW5zaWduZWQgcG9zOworICAgIGludCBuZXh0QnJlYWthYmxlUG9zaXRpb247
Cit9OworCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IElubGluZUl0ZXJhdG9yJiBpdDEs
IGNvbnN0IElubGluZUl0ZXJhdG9yJiBpdDIpCit7CisgICAgcmV0dXJuIGl0MS5wb3MgPT0gaXQy
LnBvcyAmJiBpdDEub2JqID09IGl0Mi5vYmo7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0o
Y29uc3QgSW5saW5lSXRlcmF0b3ImIGl0MSwgY29uc3QgSW5saW5lSXRlcmF0b3ImIGl0MikKK3sK
KyAgICByZXR1cm4gaXQxLnBvcyAhPSBpdDIucG9zIHx8IGl0MS5vYmogIT0gaXQyLm9iajsKK30K
Kworc3RhdGljIGlubGluZSBSZW5kZXJPYmplY3QqIGJpZGlOZXh0KFJlbmRlckJsb2NrKiBibG9j
aywgUmVuZGVyT2JqZWN0KiBjdXJyZW50LCBJbmxpbmVCaWRpUmVzb2x2ZXIqIHJlc29sdmVyID0g
MCwgYm9vbCBza2lwSW5saW5lcyA9IHRydWUsIGJvb2wqIGVuZE9mSW5saW5lUHRyID0gMCkKK3sK
KyAgICBSZW5kZXJPYmplY3QqIG5leHQgPSAwOworICAgIGJvb2wgb2xkRW5kT2ZJbmxpbmUgPSBl
bmRPZklubGluZVB0ciA/ICplbmRPZklubGluZVB0ciA6IGZhbHNlOworICAgIGJvb2wgZW5kT2ZJ
bmxpbmUgPSBmYWxzZTsKKworICAgIHdoaWxlIChjdXJyZW50KSB7CisgICAgICAgIG5leHQgPSAw
OworICAgICAgICBpZiAoIW9sZEVuZE9mSW5saW5lICYmICFjdXJyZW50LT5pc0Zsb2F0aW5nKCkg
JiYgIWN1cnJlbnQtPmlzUmVwbGFjZWQoKSAmJiAhY3VycmVudC0+aXNQb3NpdGlvbmVkKCkgJiYg
IWN1cnJlbnQtPmlzVGV4dCgpKSB7CisgICAgICAgICAgICBuZXh0ID0gY3VycmVudC0+Zmlyc3RD
aGlsZCgpOworICAgICAgICAgICAgaWYgKG5leHQgJiYgcmVzb2x2ZXIgJiYgbmV4dC0+aXNSZW5k
ZXJJbmxpbmUoKSkgeworICAgICAgICAgICAgICAgIEVVbmljb2RlQmlkaSB1YiA9IG5leHQtPnN0
eWxlKCktPnVuaWNvZGVCaWRpKCk7CisgICAgICAgICAgICAgICAgaWYgKHViICE9IFVCTm9ybWFs
KSB7CisgICAgICAgICAgICAgICAgICAgIFRleHREaXJlY3Rpb24gZGlyID0gbmV4dC0+c3R5bGUo
KS0+ZGlyZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIFdURjo6VW5pY29kZTo6RGlyZWN0
aW9uIGQgPSAodWIgPT0gRW1iZWQKKyAgICAgICAgICAgICAgICAgICAgICAgID8gKGRpciA9PSBS
VEwgPyBXVEY6OlVuaWNvZGU6OlJpZ2h0VG9MZWZ0RW1iZWRkaW5nIDogV1RGOjpVbmljb2RlOjpM
ZWZ0VG9SaWdodEVtYmVkZGluZykKKyAgICAgICAgICAgICAgICAgICAgICAgIDogKGRpciA9PSBS
VEwgPyBXVEY6OlVuaWNvZGU6OlJpZ2h0VG9MZWZ0T3ZlcnJpZGUgOiBXVEY6OlVuaWNvZGU6Okxl
ZnRUb1JpZ2h0T3ZlcnJpZGUpKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXItPmVtYmVk
KGQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAg
ICAgIGlmICghbmV4dCkgeworICAgICAgICAgICAgaWYgKCFza2lwSW5saW5lcyAmJiAhb2xkRW5k
T2ZJbmxpbmUgJiYgY3VycmVudC0+aXNSZW5kZXJJbmxpbmUoKSkgeworICAgICAgICAgICAgICAg
IG5leHQgPSBjdXJyZW50OworICAgICAgICAgICAgICAgIGVuZE9mSW5saW5lID0gdHJ1ZTsKKyAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd2hpbGUg
KGN1cnJlbnQgJiYgY3VycmVudCAhPSBibG9jaykgeworICAgICAgICAgICAgICAgIGlmIChyZXNv
bHZlciAmJiBjdXJyZW50LT5pc1JlbmRlcklubGluZSgpICYmIGN1cnJlbnQtPnN0eWxlKCktPnVu
aWNvZGVCaWRpKCkgIT0gVUJOb3JtYWwpCisgICAgICAgICAgICAgICAgICAgIHJlc29sdmVyLT5l
bWJlZChXVEY6OlVuaWNvZGU6OlBvcERpcmVjdGlvbmFsRm9ybWF0KTsKKworICAgICAgICAgICAg
ICAgIG5leHQgPSBjdXJyZW50LT5uZXh0U2libGluZygpOworICAgICAgICAgICAgICAgIGlmIChu
ZXh0KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlciAmJiBuZXh0LT5pc1JlbmRl
cklubGluZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFVW5pY29kZUJpZGkgdWIgPSBu
ZXh0LT5zdHlsZSgpLT51bmljb2RlQmlkaSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYg
KHViICE9IFVCTm9ybWFsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dERpcmVj
dGlvbiBkaXIgPSBuZXh0LT5zdHlsZSgpLT5kaXJlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBXVEY6OlVuaWNvZGU6OkRpcmVjdGlvbiBkID0gKHViID09IEVtYmVkCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKGRpciA9PSBSVEwgPyBXVEY6OlVuaWNvZGU6
OlJpZ2h0VG9MZWZ0RW1iZWRkaW5nOiBXVEY6OlVuaWNvZGU6OkxlZnRUb1JpZ2h0RW1iZWRkaW5n
KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChkaXIgPT0gUlRMID8gV1RGOjpV
bmljb2RlOjpSaWdodFRvTGVmdE92ZXJyaWRlIDogV1RGOjpVbmljb2RlOjpMZWZ0VG9SaWdodE92
ZXJyaWRlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXItPmVtYmVkKGQp
OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg
ICAKKyAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC0+cGFyZW50KCk7CisgICAgICAg
ICAgICAgICAgaWYgKCFza2lwSW5saW5lcyAmJiBjdXJyZW50ICYmIGN1cnJlbnQgIT0gYmxvY2sg
JiYgY3VycmVudC0+aXNSZW5kZXJJbmxpbmUoKSkgeworICAgICAgICAgICAgICAgICAgICBuZXh0
ID0gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgZW5kT2ZJbmxpbmUgPSB0cnVlOworICAg
ICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9
CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW5leHQpCisgICAgICAgICAgICBicmVhazsKKwor
ICAgICAgICBpZiAobmV4dC0+aXNUZXh0KCkgfHwgbmV4dC0+aXNGbG9hdGluZygpIHx8IG5leHQt
PmlzUmVwbGFjZWQoKSB8fCBuZXh0LT5pc1Bvc2l0aW9uZWQoKQorICAgICAgICAgICAgfHwgKCgh
c2tpcElubGluZXMgfHwgIW5leHQtPmZpcnN0Q2hpbGQoKSkgLy8gQWx3YXlzIHJldHVybiBFTVBU
WSBpbmxpbmVzLgorICAgICAgICAgICAgICAgICYmIG5leHQtPmlzUmVuZGVySW5saW5lKCkpKQor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGN1cnJlbnQgPSBuZXh0OworICAgIH0KKworICAg
IGlmIChlbmRPZklubGluZVB0cikKKyAgICAgICAgKmVuZE9mSW5saW5lUHRyID0gZW5kT2ZJbmxp
bmU7CisKKyAgICByZXR1cm4gbmV4dDsKK30KKworc3RhdGljIGlubGluZSBSZW5kZXJPYmplY3Qq
IGJpZGlGaXJzdChSZW5kZXJCbG9jayogYmxvY2ssIElubGluZUJpZGlSZXNvbHZlciogcmVzb2x2
ZXIsIGJvb2wgc2tpcElubGluZXMgPSB0cnVlKQoreworICAgIGlmICghYmxvY2stPmZpcnN0Q2hp
bGQoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgCisgICAgUmVuZGVyT2JqZWN0KiBvID0gYmxv
Y2stPmZpcnN0Q2hpbGQoKTsKKyAgICBpZiAoby0+aXNSZW5kZXJJbmxpbmUoKSkgeworICAgICAg
ICBpZiAocmVzb2x2ZXIpIHsKKyAgICAgICAgICAgIEVVbmljb2RlQmlkaSB1YiA9IG8tPnN0eWxl
KCktPnVuaWNvZGVCaWRpKCk7CisgICAgICAgICAgICBpZiAodWIgIT0gVUJOb3JtYWwpIHsKKyAg
ICAgICAgICAgICAgICBUZXh0RGlyZWN0aW9uIGRpciA9IG8tPnN0eWxlKCktPmRpcmVjdGlvbigp
OworICAgICAgICAgICAgICAgIFdURjo6VW5pY29kZTo6RGlyZWN0aW9uIGQgPSAodWIgPT0gRW1i
ZWQKKyAgICAgICAgICAgICAgICAgICAgPyAoZGlyID09IFJUTCA/IFdURjo6VW5pY29kZTo6Umln
aHRUb0xlZnRFbWJlZGRpbmcgOiBXVEY6OlVuaWNvZGU6OkxlZnRUb1JpZ2h0RW1iZWRkaW5nKQor
ICAgICAgICAgICAgICAgICAgICA6IChkaXIgPT0gUlRMID8gV1RGOjpVbmljb2RlOjpSaWdodFRv
TGVmdE92ZXJyaWRlIDogV1RGOjpVbmljb2RlOjpMZWZ0VG9SaWdodE92ZXJyaWRlKSk7CisgICAg
ICAgICAgICAgICAgcmVzb2x2ZXItPmVtYmVkKGQpOworICAgICAgICAgICAgfQorICAgICAgICB9
CisgICAgICAgIGlmIChza2lwSW5saW5lcyAmJiBvLT5maXJzdENoaWxkKCkpCisgICAgICAgICAg
ICBvID0gYmlkaU5leHQoYmxvY2ssIG8sIHJlc29sdmVyLCBza2lwSW5saW5lcyk7CisgICAgICAg
IGVsc2UgeworICAgICAgICAgICAgLy8gTmV2ZXIgc2tpcCBlbXB0eSBpbmxpbmVzLgorICAgICAg
ICAgICAgaWYgKHJlc29sdmVyKQorICAgICAgICAgICAgICAgIHJlc29sdmVyLT5jb21taXRFeHBs
aWNpdEVtYmVkZGluZygpOworICAgICAgICAgICAgcmV0dXJuIG87IAorICAgICAgICB9CisgICAg
fQorCisgICAgaWYgKG8gJiYgIW8tPmlzVGV4dCgpICYmICFvLT5pc1JlcGxhY2VkKCkgJiYgIW8t
PmlzRmxvYXRpbmcoKSAmJiAhby0+aXNQb3NpdGlvbmVkKCkpCisgICAgICAgIG8gPSBiaWRpTmV4
dChibG9jaywgbywgcmVzb2x2ZXIsIHNraXBJbmxpbmVzKTsKKworICAgIGlmIChyZXNvbHZlcikK
KyAgICAgICAgcmVzb2x2ZXItPmNvbW1pdEV4cGxpY2l0RW1iZWRkaW5nKCk7CisgICAgcmV0dXJu
IG87Cit9CisKK2lubGluZSB2b2lkIElubGluZUl0ZXJhdG9yOjppbmNyZW1lbnQoSW5saW5lQmlk
aVJlc29sdmVyKiByZXNvbHZlcikKK3sKKyAgICBpZiAoIW9iaikKKyAgICAgICAgcmV0dXJuOwor
ICAgIGlmIChvYmotPmlzVGV4dCgpKSB7CisgICAgICAgIHBvcysrOworICAgICAgICBpZiAocG9z
ID49IHRvUmVuZGVyVGV4dChvYmopLT50ZXh0TGVuZ3RoKCkpIHsKKyAgICAgICAgICAgIG9iaiA9
IGJpZGlOZXh0KGJsb2NrLCBvYmosIHJlc29sdmVyKTsKKyAgICAgICAgICAgIHBvcyA9IDA7Cisg
ICAgICAgICAgICBuZXh0QnJlYWthYmxlUG9zaXRpb24gPSAtMTsKKyAgICAgICAgfQorICAgIH0g
ZWxzZSB7CisgICAgICAgIG9iaiA9IGJpZGlOZXh0KGJsb2NrLCBvYmosIHJlc29sdmVyKTsKKyAg
ICAgICAgcG9zID0gMDsKKyAgICAgICAgbmV4dEJyZWFrYWJsZVBvc2l0aW9uID0gLTE7CisgICAg
fQorfQorCitpbmxpbmUgYm9vbCBJbmxpbmVJdGVyYXRvcjo6YXRFbmQoKSBjb25zdAoreworICAg
IHJldHVybiAhb2JqOworfQorCitpbmxpbmUgVUNoYXIgSW5saW5lSXRlcmF0b3I6OmN1cnJlbnQo
KSBjb25zdAoreworICAgIGlmICghb2JqIHx8ICFvYmotPmlzVGV4dCgpKQorICAgICAgICByZXR1
cm4gMDsKKworICAgIFJlbmRlclRleHQqIHRleHQgPSB0b1JlbmRlclRleHQob2JqKTsKKyAgICBp
ZiAocG9zID49IHRleHQtPnRleHRMZW5ndGgoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBy
ZXR1cm4gdGV4dC0+Y2hhcmFjdGVycygpW3Bvc107Cit9CisKK0FMV0FZU19JTkxJTkUgV1RGOjpV
bmljb2RlOjpEaXJlY3Rpb24gSW5saW5lSXRlcmF0b3I6OmRpcmVjdGlvbigpIGNvbnN0Cit7Cisg
ICAgaWYgKFVDaGFyIGMgPSBjdXJyZW50KCkpCisgICAgICAgIHJldHVybiBXVEY6OlVuaWNvZGU6
OmRpcmVjdGlvbihjKTsKKworICAgIGlmIChvYmogJiYgb2JqLT5pc0xpc3RNYXJrZXIoKSkKKyAg
ICAgICAgcmV0dXJuIG9iai0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkgPT0gTFRSID8gV1RGOjpVbmlj
b2RlOjpMZWZ0VG9SaWdodCA6IFdURjo6VW5pY29kZTo6UmlnaHRUb0xlZnQ7CisKKyAgICByZXR1
cm4gV1RGOjpVbmljb2RlOjpPdGhlck5ldXRyYWw7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSB2
b2lkIElubGluZUJpZGlSZXNvbHZlcjo6aW5jcmVtZW50KCkKK3sKKyAgICBjdXJyZW50LmluY3Jl
bWVudCh0aGlzKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSB2b2lkIElubGluZUJpZGlSZXNv
bHZlcjo6YXBwZW5kUnVuKCkKK3sKKyAgICBpZiAoIWVtcHR5UnVuICYmICFlb3IuYXRFbmQoKSkg
eworICAgICAgICBpbnQgc3RhcnQgPSBzb3IucG9zOworICAgICAgICBSZW5kZXJPYmplY3QgKm9i
aiA9IHNvci5vYmo7CisgICAgICAgIHdoaWxlIChvYmogJiYgb2JqICE9IGVvci5vYmogJiYgb2Jq
ICE9IGVuZE9mTGluZS5vYmopIHsKKyAgICAgICAgICAgIFJlbmRlckJsb2NrOjphcHBlbmRSdW5z
Rm9yT2JqZWN0KHN0YXJ0LCBvYmotPmxlbmd0aCgpLCBvYmosICp0aGlzKTsgICAgICAgIAorICAg
ICAgICAgICAgc3RhcnQgPSAwOworICAgICAgICAgICAgb2JqID0gYmlkaU5leHQoc29yLmJsb2Nr
LCBvYmopOworICAgICAgICB9CisgICAgICAgIGlmIChvYmopIHsKKyAgICAgICAgICAgIHVuc2ln
bmVkIHBvcyA9IG9iaiA9PSBlb3Iub2JqID8gZW9yLnBvcyA6IFVJTlRfTUFYOworICAgICAgICAg
ICAgaWYgKG9iaiA9PSBlbmRPZkxpbmUub2JqICYmIGVuZE9mTGluZS5wb3MgPD0gcG9zKSB7Cisg
ICAgICAgICAgICAgICAgcmVhY2hlZEVuZE9mTGluZSA9IHRydWU7CisgICAgICAgICAgICAgICAg
cG9zID0gZW5kT2ZMaW5lLnBvczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEl0J3Mg
T0sgdG8gYWRkIHJ1bnMgZm9yIHplcm8tbGVuZ3RoIFJlbmRlck9iamVjdHMsIGp1c3QgZG9uJ3Qg
bWFrZSB0aGUgcnVuIGxhcmdlciB0aGFuIGl0IHNob3VsZCBiZQorICAgICAgICAgICAgaW50IGVu
ZCA9IG9iai0+bGVuZ3RoKCkgPyBwb3MrMSA6IDA7CisgICAgICAgICAgICBSZW5kZXJCbG9jazo6
YXBwZW5kUnVuc0Zvck9iamVjdChzdGFydCwgZW5kLCBvYmosICp0aGlzKTsKKyAgICAgICAgfQor
ICAgICAgICAKKyAgICAgICAgZW9yLmluY3JlbWVudCgpOworICAgICAgICBzb3IgPSBlb3I7Cisg
ICAgfQorCisgICAgbV9kaXJlY3Rpb24gPSBXVEY6OlVuaWNvZGU6Ok90aGVyTmV1dHJhbDsKKyAg
ICBtX3N0YXR1cy5lb3IgPSBXVEY6OlVuaWNvZGU6Ok90aGVyTmV1dHJhbDsKK30KKworfQorCisj
ZW5kaWYgLy8gSW5saW5lSXRlcmF0b3JfaAorCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5k
ZXJCbG9jay5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2su
Y3BwCShyZXZpc2lvbiA1NDUwMSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtNzcsOCArNzcsNiBAQCBzdGF0aWMgUGVyY2VudEhlaWdodERl
c2NlbmRhbnRzTWFwKiBnUGVyCiAKIHR5cGVkZWYgV1RGOjpIYXNoTWFwPGNvbnN0IFJlbmRlckJv
eCosIEhhc2hTZXQ8UmVuZGVyQmxvY2sqPio+IFBlcmNlbnRIZWlnaHRDb250YWluZXJNYXA7CiBz
dGF0aWMgUGVyY2VudEhlaWdodENvbnRhaW5lck1hcCogZ1BlcmNlbnRIZWlnaHRDb250YWluZXJN
YXAgPSAwOwotICAgIAotdHlwZWRlZiBXVEY6Okhhc2hNYXA8UmVuZGVyQmxvY2sqLCBMaXN0SGFz
aFNldDxSZW5kZXJJbmxpbmUqPio+IENvbnRpbnVhdGlvbk91dGxpbmVUYWJsZU1hcDsKIAogdHlw
ZWRlZiBXVEY6Okhhc2hTZXQ8UmVuZGVyQmxvY2sqPiBEZWxheWVkVXBkYXRlU2Nyb2xsSW5mb1Nl
dDsKIHN0YXRpYyBpbnQgZ0RlbGF5VXBkYXRlU2Nyb2xsSW5mbyA9IDA7CkBAIC05MSw3ICs4OSw3
IEBAIFJlbmRlckJsb2NrOjpNYXJnaW5JbmZvOjpNYXJnaW5JbmZvKFJlbmQKICAgICAvLyBpZiB3
ZSBoYWQgYW55IGJvcmRlci9wYWRkaW5nIChvYnZpb3VzbHkpLCBpZiB3ZSdyZSB0aGUgcm9vdCBv
ciBIVE1MIGVsZW1lbnRzLCBvciBpZgogICAgIC8vIHdlJ3JlIHBvc2l0aW9uZWQsIGZsb2F0aW5n
LCBhIHRhYmxlIGNlbGwuCiAgICAgbV9jYW5Db2xsYXBzZVdpdGhDaGlsZHJlbiA9ICFibG9jay0+
aXNSZW5kZXJWaWV3KCkgJiYgIWJsb2NrLT5pc1Jvb3QoKSAmJiAhYmxvY2stPmlzUG9zaXRpb25l
ZCgpICYmCi0gICAgICAgICFibG9jay0+aXNGbG9hdGluZygpICYmICFibG9jay0+aXNUYWJsZUNl
bGwoKSAmJiAhYmxvY2stPmhhc092ZXJmbG93Q2xpcCgpICYmICFibG9jay0+aXNJbmxpbmVCbG9j
a09ySW5saW5lVGFibGUoKTsKKyAgICAgICAgIWJsb2NrLT5pc0Zsb2F0aW5nKCkgJiYgIWJsb2Nr
LT5pc1RhYmxlQ2VsbCgpICYmICFibG9jay0+aGFzT3ZlcmZsb3dDbGlwKCkgJiYgKCFibG9jay0+
aXNJbmxpbmVCbG9ja09ySW5saW5lVGFibGUoKSB8fCBibG9jay0+aXNBbm9ueW1vdXNJbmxpbmVC
bG9jaygpKTsKIAogICAgIG1fY2FuQ29sbGFwc2VUb3BXaXRoQ2hpbGRyZW4gPSBtX2NhbkNvbGxh
cHNlV2l0aENoaWxkcmVuICYmICh0b3AgPT0gMCkgJiYgYmxvY2stPnN0eWxlKCktPm1hcmdpblRv
cENvbGxhcHNlKCkgIT0gTVNFUEFSQVRFOwogCkBAIC0xMjAsNyArMTE4LDYgQEAgUmVuZGVyQmxv
Y2s6OlJlbmRlckJsb2NrKE5vZGUqIG5vZGUpCiAgICAgICA6IFJlbmRlckJveChub2RlKQogICAg
ICAgLCBtX2Zsb2F0aW5nT2JqZWN0cygwKQogICAgICAgLCBtX3Bvc2l0aW9uZWRPYmplY3RzKDAp
Ci0gICAgICAsIG1faW5saW5lQ29udGludWF0aW9uKDApCiAgICAgICAsIG1fbWF4TWFyZ2luKDAp
CiAgICAgICAsIG1fbGluZUhlaWdodCgtMSkKIHsKQEAgLTE2MSwxNCArMTU4LDYgQEAgdm9pZCBS
ZW5kZXJCbG9jazo6ZGVzdHJveSgpCiAgICAgLy8gTWFrZSBzdXJlIHRvIGRlc3Ryb3kgYW5vbnlt
b3VzIGNoaWxkcmVuIGZpcnN0IHdoaWxlIHRoZXkgYXJlIHN0aWxsIGNvbm5lY3RlZCB0byB0aGUg
cmVzdCBvZiB0aGUgdHJlZSwgc28gdGhhdCB0aGV5IHdpbGwKICAgICAvLyBwcm9wZXJseSBkaXJ0
eSBsaW5lIGJveGVzIHRoYXQgdGhleSBhcmUgcmVtb3ZlZCBmcm9tLiBFZmZlY3RzIHRoYXQgZG8g
OmJlZm9yZS86YWZ0ZXIgb25seSBvbiBob3ZlciBjb3VsZCBjcmFzaCBvdGhlcndpc2UuCiAgICAg
Y2hpbGRyZW4oKS0+ZGVzdHJveUxlZnRvdmVyQ2hpbGRyZW4oKTsKLQotICAgIC8vIERlc3Ryb3kg
b3VyIGNvbnRpbnVhdGlvbiBiZWZvcmUgYW55dGhpbmcgb3RoZXIgdGhhbiBhbm9ueW1vdXMgY2hp
bGRyZW4uCi0gICAgLy8gVGhlIHJlYXNvbiB3ZSBkb24ndCBkZXN0cm95IGl0IGJlZm9yZSBhbm9u
eW1vdXMgY2hpbGRyZW4gaXMgdGhhdCB0aGV5IG1heQotICAgIC8vIGhhdmUgY29udGludWF0aW9u
cyBvZiB0aGVpciBvd24gdGhhdCBhcmUgYW5vbnltb3VzIGNoaWxkcmVuIG9mIG91ciBjb250aW51
YXRpb24uCi0gICAgaWYgKG1faW5saW5lQ29udGludWF0aW9uKSB7Ci0gICAgICAgIG1faW5saW5l
Q29udGludWF0aW9uLT5kZXN0cm95KCk7Ci0gICAgICAgIG1faW5saW5lQ29udGludWF0aW9uID0g
MDsKLSAgICB9CiAgICAgCiAgICAgaWYgKCFkb2N1bWVudEJlaW5nRGVzdHJveWVkKCkpIHsKICAg
ICAgICAgaWYgKGZpcnN0TGluZUJveCgpKSB7CkBAIC0zMTYsNyArMzA1LDcgQEAgdm9pZCBSZW5k
ZXJCbG9jazo6YWRkQ2hpbGQoUmVuZGVyT2JqZWN0KgogICAgICAgICB9CiAgICAgfSBlbHNlIGlm
ICghY2hpbGRyZW5JbmxpbmUoKSAmJiAobmV3Q2hpbGQtPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQo
KSB8fCBuZXdDaGlsZC0+aXNJbmxpbmUoKSkpIHsKICAgICAgICAgLy8gSWYgd2UncmUgaW5zZXJ0
aW5nIGFuIGlubGluZSBjaGlsZCBidXQgYWxsIG9mIG91ciBjaGlsZHJlbiBhcmUgYmxvY2tzLCB0
aGVuIHdlIGhhdmUgdG8gbWFrZSBzdXJlCi0gICAgICAgIC8vIGl0IGlzIHB1dCBpbnRvIGFuIGFu
b215b3VzIGJsb2NrIGJveC4gV2UgdHJ5IHRvIHVzZSBhbiBleGlzdGluZyBhbm9ueW1vdXMgYm94
IGlmIHBvc3NpYmxlLCBvdGhlcndpc2UKKyAgICAgICAgLy8gaXQgaXMgcHV0IGludG8gYW4gYW5v
bnltb3VzIGJsb2NrIGJveC4gV2UgdHJ5IHRvIHVzZSBhbiBleGlzdGluZyBhbm9ueW1vdXMgYm94
IGlmIHBvc3NpYmxlLCBvdGhlcndpc2UKICAgICAgICAgLy8gYSBuZXcgb25lIGlzIGNyZWF0ZWQg
YW5kIGluc2VydGVkIGludG8gb3VyIGxpc3Qgb2YgY2hpbGRyZW4gaW4gdGhlIGFwcHJvcHJpYXRl
IHBvc2l0aW9uLgogICAgICAgICBSZW5kZXJPYmplY3QqIGFmdGVyQ2hpbGQgPSBiZWZvcmVDaGls
ZCA/IGJlZm9yZUNoaWxkLT5wcmV2aW91c1NpYmxpbmcoKSA6IGxhc3RDaGlsZCgpOwogCkBAIC00
OTAsOSArNDc5LDYgQEAgdm9pZCBSZW5kZXJCbG9jazo6cmVtb3ZlTGVmdG92ZXJBbm9ueW1vdQog
ICAgIEFTU0VSVChjaGlsZC0+aXNBbm9ueW1vdXNCbG9jaygpKTsKICAgICBBU1NFUlQoIWNoaWxk
LT5jaGlsZHJlbklubGluZSgpKTsKICAgICAKLSAgICBpZiAoY2hpbGQtPmlubGluZUNvbnRpbnVh
dGlvbigpKSAKLSAgICAgICAgcmV0dXJuOwotICAgIAogICAgIFJlbmRlck9iamVjdCogZmlyc3RB
bkNoaWxkID0gY2hpbGQtPm1fY2hpbGRyZW4uZmlyc3RDaGlsZCgpOwogICAgIFJlbmRlck9iamVj
dCogbGFzdEFuQ2hpbGQgPSBjaGlsZC0+bV9jaGlsZHJlbi5sYXN0Q2hpbGQoKTsKICAgICBpZiAo
Zmlyc3RBbkNoaWxkKSB7CkBAIC01MzUsNyArNTIxLDcgQEAgdm9pZCBSZW5kZXJCbG9jazo6cmVt
b3ZlQ2hpbGQoUmVuZGVyT2JqZQogICAgIFJlbmRlck9iamVjdCogcHJldiA9IG9sZENoaWxkLT5w
cmV2aW91c1NpYmxpbmcoKTsKICAgICBSZW5kZXJPYmplY3QqIG5leHQgPSBvbGRDaGlsZC0+bmV4
dFNpYmxpbmcoKTsKICAgICBib29sIGNhbkRlbGV0ZUFub255bW91c0Jsb2NrcyA9ICFkb2N1bWVu
dEJlaW5nRGVzdHJveWVkKCkgJiYgIWlzSW5saW5lKCkgJiYgIW9sZENoaWxkLT5pc0lubGluZSgp
ICYmIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFvbGRDaGlsZC0+aXNS
ZW5kZXJCbG9jaygpIHx8ICF0b1JlbmRlckJsb2NrKG9sZENoaWxkKS0+aW5saW5lQ29udGludWF0
aW9uKCkpICYmIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIW9sZENoaWxk
LT5pc1JlbmRlckJsb2NrKCkgJiYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAoIXByZXYgfHwgKHByZXYtPmlzQW5vbnltb3VzQmxvY2soKSAmJiBwcmV2LT5jaGlsZHJlbklu
bGluZSgpKSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghbmV4dCB8
fCAobmV4dC0+aXNBbm9ueW1vdXNCbG9jaygpICYmIG5leHQtPmNoaWxkcmVuSW5saW5lKCkpKTsK
ICAgICBpZiAoY2FuRGVsZXRlQW5vbnltb3VzQmxvY2tzICYmIHByZXYgJiYgbmV4dCkgewpAQCAt
NTk4LDkgKzU4NCwxNSBAQCBib29sIFJlbmRlckJsb2NrOjppc1NlbGZDb2xsYXBzaW5nQmxvY2so
CiAgICAgLy8gb24gd2hldGhlciB3ZSBoYXZlIGNvbnRlbnQgdGhhdCBpcyBhbGwgc2VsZi1jb2xs
YXBzaW5nIG9yIG5vdC4KICAgICBpZiAoaGFzQXV0b0hlaWdodCB8fCAoKHN0eWxlKCktPmhlaWdo
dCgpLmlzRml4ZWQoKSB8fCBzdHlsZSgpLT5oZWlnaHQoKS5pc1BlcmNlbnQoKSkgJiYgc3R5bGUo
KS0+aGVpZ2h0KCkuaXNaZXJvKCkpKSB7CiAgICAgICAgIC8vIElmIHRoZSBibG9jayBoYXMgaW5s
aW5lIGNoaWxkcmVuLCBzZWUgaWYgd2UgZ2VuZXJhdGVkIGFueSBsaW5lIGJveGVzLiAgSWYgd2Ug
aGF2ZSBhbnkKLSAgICAgICAgLy8gbGluZSBib3hlcywgdGhlbiB3ZSBjYW4ndCBiZSBzZWxmLWNv
bGxhcHNpbmcsIHNpbmNlIHdlIGhhdmUgY29udGVudC4KLSAgICAgICAgaWYgKGNoaWxkcmVuSW5s
aW5lKCkpCi0gICAgICAgICAgICByZXR1cm4gIWZpcnN0TGluZUJveCgpOworICAgICAgICAvLyBs
aW5lIGJveGVzLCB0aGVuIHdlIGNhbiBvbmx5IGJlIHNlbGYtY29sbGFwc2luZyBpZiB3ZSBoYXZl
IG5vdGhpbmcgYnV0IGFub255bW91cyBpbmxpbmUgYmxvY2tzCisgICAgICAgIC8vIHRoYXQgYXJl
IGFsc28gc2VsZi1jb2xsYXBzaW5nIGluc2lkZSB1cy4KKyAgICAgICAgaWYgKGNoaWxkcmVuSW5s
aW5lKCkpIHsKKyAgICAgICAgICAgIGZvciAoUm9vdElubGluZUJveCogY2hpbGQgPSBmaXJzdFJv
b3RCb3goKTsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHRSb290Qm94KCkpIHsKKyAgICAgICAg
ICAgICAgICBpZiAoIWNoaWxkLT5hbm9ueW1vdXNJbmxpbmVCbG9jaygpIHx8ICFjaGlsZC0+YW5v
bnltb3VzSW5saW5lQmxvY2soKS0+aXNTZWxmQ29sbGFwc2luZ0Jsb2NrKCkpCisgICAgICAgICAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVy
biB0cnVlOyAvLyBXZSBoYXZlIG5vIGxpbmUgYm94ZXMsIHNvIHdlIG11c3QgYmUgc2VsZi1jb2xs
YXBzaW5nLgorICAgICAgICB9CiAgICAgICAgIAogICAgICAgICAvLyBXaGV0aGVyIG9yIG5vdCB3
ZSBjb2xsYXBzZSBpcyBkZXBlbmRlbnQgb24gd2hldGhlciBhbGwgb3VyIG5vcm1hbCBmbG93IGNo
aWxkcmVuCiAgICAgICAgIC8vIGFyZSBhbHNvIHNlbGYtY29sbGFwc2luZy4KQEAgLTg1NSw3ICs4
NDcsOCBAQCB2b2lkIFJlbmRlckJsb2NrOjphZGRPdmVyZmxvd0Zyb21GbG9hdHMoCiAKIGJvb2wg
UmVuZGVyQmxvY2s6OmV4cGFuZHNUb0VuY2xvc2VPdmVyaGFuZ2luZ0Zsb2F0cygpIGNvbnN0CiB7
Ci0gICAgcmV0dXJuIGlzSW5saW5lQmxvY2tPcklubGluZVRhYmxlKCkgfHwgaXNGbG9hdGluZ09y
UG9zaXRpb25lZCgpIHx8IGhhc092ZXJmbG93Q2xpcCgpIHx8IChwYXJlbnQoKSAmJiBwYXJlbnQo
KS0+aXNGbGV4aWJsZUJveCgpKSB8fCBoYXNDb2x1bW5zKCkgfHwgaXNUYWJsZUNlbGwoKSB8fCBp
c0ZpZWxkc2V0KCk7CisgICAgcmV0dXJuIGlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSB8fCBoYXNP
dmVyZmxvd0NsaXAoKSB8fCAocGFyZW50KCkgJiYgcGFyZW50KCktPmlzRmxleGlibGVCb3goKSkg
fHwgaGFzQ29sdW1ucygpIHx8IGlzVGFibGVDZWxsKCkgfHwgaXNGaWVsZHNldCgpIHx8CisgICAg
ICAgICAgIChpc0lubGluZUJsb2NrT3JJbmxpbmVUYWJsZSgpICYmICFpc0Fub255bW91c0lubGlu
ZUJsb2NrKCkpOwogfQogCiB2b2lkIFJlbmRlckJsb2NrOjphZGp1c3RQb3NpdGlvbmVkQmxvY2so
UmVuZGVyQm94KiBjaGlsZCwgY29uc3QgTWFyZ2luSW5mbyYgbWFyZ2luSW5mbykKQEAgLTEwMDEs
MTkgKzk5NCwxOSBAQCBib29sIFJlbmRlckJsb2NrOjpoYW5kbGVSdW5JbkNoaWxkKFJlbmRlCiBp
bnQgUmVuZGVyQmxvY2s6OmNvbGxhcHNlTWFyZ2lucyhSZW5kZXJCb3gqIGNoaWxkLCBNYXJnaW5J
bmZvJiBtYXJnaW5JbmZvKQogewogICAgIC8vIEdldCBvdXIgbWF4IHBvcyBhbmQgbmVnIHRvcCBt
YXJnaW5zLgotICAgIGludCBwb3NUb3AgPSBjaGlsZC0+bWF4VG9wTWFyZ2luKHRydWUpOwotICAg
IGludCBuZWdUb3AgPSBjaGlsZC0+bWF4VG9wTWFyZ2luKGZhbHNlKTsKKyAgICBpbnQgcG9zVG9w
ID0gY2hpbGQgPyBjaGlsZC0+bWF4VG9wTWFyZ2luKHRydWUpIDogMDsKKyAgICBpbnQgbmVnVG9w
ID0gY2hpbGQgPyBjaGlsZC0+bWF4VG9wTWFyZ2luKGZhbHNlKSA6IDA7CiAKICAgICAvLyBGb3Ig
c2VsZi1jb2xsYXBzaW5nIGJsb2NrcywgY29sbGFwc2Ugb3VyIGJvdHRvbSBtYXJnaW5zIGludG8g
b3VyCiAgICAgLy8gdG9wIHRvIGdldCBuZXcgcG9zVG9wIGFuZCBuZWdUb3AgdmFsdWVzLgotICAg
IGlmIChjaGlsZC0+aXNTZWxmQ29sbGFwc2luZ0Jsb2NrKCkpIHsKKyAgICBpZiAoY2hpbGQgJiYg
Y2hpbGQtPmlzU2VsZkNvbGxhcHNpbmdCbG9jaygpKSB7CiAgICAgICAgIHBvc1RvcCA9IG1heChw
b3NUb3AsIGNoaWxkLT5tYXhCb3R0b21NYXJnaW4odHJ1ZSkpOwogICAgICAgICBuZWdUb3AgPSBt
YXgobmVnVG9wLCBjaGlsZC0+bWF4Qm90dG9tTWFyZ2luKGZhbHNlKSk7CiAgICAgfQogICAgIAog
ICAgIC8vIFNlZSBpZiB0aGUgdG9wIG1hcmdpbiBpcyBxdWlya3kuIFdlIG9ubHkgY2FyZSBpZiB0
aGlzIGNoaWxkIGhhcwogICAgIC8vIG1hcmdpbnMgdGhhdCB3aWxsIGNvbGxhcHNlIHdpdGggdXMu
Ci0gICAgYm9vbCB0b3BRdWlyayA9IGNoaWxkLT5pc1RvcE1hcmdpblF1aXJrKCkgfHwgc3R5bGUo
KS0+bWFyZ2luVG9wQ29sbGFwc2UoKSA9PSBNRElTQ0FSRDsKKyAgICBib29sIHRvcFF1aXJrID0g
KGNoaWxkICYmIGNoaWxkLT5pc1RvcE1hcmdpblF1aXJrKCkpIHx8IHN0eWxlKCktPm1hcmdpblRv
cENvbGxhcHNlKCkgPT0gTURJU0NBUkQ7CiAKICAgICBpZiAobWFyZ2luSW5mby5jYW5Db2xsYXBz
ZVdpdGhUb3AoKSkgewogICAgICAgICAvLyBUaGlzIGNoaWxkIGlzIGNvbGxhcHNpbmcgd2l0aCB0
aGUgdG9wIG9mIHRoZQpAQCAtMTAyNiw3ICsxMDE5LDcgQEAgaW50IFJlbmRlckJsb2NrOjpjb2xs
YXBzZU1hcmdpbnMoUmVuZGVyQgogICAgICAgICAvLyBjb2xsYXBzZSBpdCBhd2F5LCBldmVuIGlm
IHRoZSBtYXJnaW4gaXMgc21hbGxlciAod3d3LndlYnJlZmVyZW5jZS5jb20KICAgICAgICAgLy8g
aGFzIGFuIGV4YW1wbGUgb2YgdGhpcywgYSA8ZHQ+IHdpdGggMC44ZW0gYXV0aG9yLXNwZWNpZmll
ZCBpbnNpZGUKICAgICAgICAgLy8gYSA8ZGw+IGluc2lkZSBhIDx0ZD4uCi0gICAgICAgIGlmICgh
bWFyZ2luSW5mby5kZXRlcm1pbmVkVG9wUXVpcmsoKSAmJiAhdG9wUXVpcmsgJiYgKHBvc1RvcC1u
ZWdUb3ApKSB7CisgICAgICAgIGlmICghbWFyZ2luSW5mby5kZXRlcm1pbmVkVG9wUXVpcmsoKSAm
JiAhdG9wUXVpcmsgJiYgKHBvc1RvcCAtIG5lZ1RvcCkpIHsKICAgICAgICAgICAgIHNldFRvcE1h
cmdpblF1aXJrKGZhbHNlKTsKICAgICAgICAgICAgIG1hcmdpbkluZm8uc2V0RGV0ZXJtaW5lZFRv
cFF1aXJrKHRydWUpOwogICAgICAgICB9CkBAIC0xMDQ0LDcgKzEwMzcsNyBAQCBpbnQgUmVuZGVy
QmxvY2s6OmNvbGxhcHNlTWFyZ2lucyhSZW5kZXJCCiAgICAgICAgIG1hcmdpbkluZm8uc2V0VG9w
UXVpcmsodG9wUXVpcmspOwogCiAgICAgaW50IHlwb3MgPSBoZWlnaHQoKTsKLSAgICBpZiAoY2hp
bGQtPmlzU2VsZkNvbGxhcHNpbmdCbG9jaygpKSB7CisgICAgaWYgKGNoaWxkICYmIGNoaWxkLT5p
c1NlbGZDb2xsYXBzaW5nQmxvY2soKSkgewogICAgICAgICAvLyBUaGlzIGNoaWxkIGhhcyBubyBo
ZWlnaHQuICBXZSBuZWVkIHRvIGNvbXB1dGUgb3VyCiAgICAgICAgIC8vIHBvc2l0aW9uIGJlZm9y
ZSB3ZSBjb2xsYXBzZSB0aGUgY2hpbGQncyBtYXJnaW5zIHRvZ2V0aGVyLAogICAgICAgICAvLyBz
byB0aGF0IHdlIGNhbiBnZXQgYW4gYWNjdXJhdGUgcG9zaXRpb24gZm9yIHRoZSB6ZXJvLWhlaWdo
dCBibG9jay4KQEAgLTEwNjMsMTMgKzEwNTYsMTEgQEAgaW50IFJlbmRlckJsb2NrOjpjb2xsYXBz
ZU1hcmdpbnMoUmVuZGVyQgogICAgICAgICAgICAgLy8gdGhhdCBuZWVkcyB0byBiZSBwb3NpdGlv
bmVkIGNvcnJlY3RseSAoZS5nLiwgYSBibG9jayB0aGF0CiAgICAgICAgICAgICAvLyBoYWQgYSBz
cGVjaWZpZWQgaGVpZ2h0IG9mIDAgYnV0IHRoYXQgYWN0dWFsbHkgaGFkIHN1YmNvbnRlbnQpLgog
ICAgICAgICAgICAgeXBvcyA9IGhlaWdodCgpICsgY29sbGFwc2VkVG9wUG9zIC0gY29sbGFwc2Vk
VG9wTmVnOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgaWYgKGNoaWxkLT5zdHlsZSgpLT5t
YXJnaW5Ub3BDb2xsYXBzZSgpID09IE1TRVBBUkFURSkgeworICAgIH0gZWxzZSB7CisgICAgICAg
IGlmIChjaGlsZCAmJiBjaGlsZC0+c3R5bGUoKS0+bWFyZ2luVG9wQ29sbGFwc2UoKSA9PSBNU0VQ
QVJBVEUpIHsKICAgICAgICAgICAgIHNldEhlaWdodChoZWlnaHQoKSArIG1hcmdpbkluZm8ubWFy
Z2luKCkgKyBjaGlsZC0+bWFyZ2luVG9wKCkpOwogICAgICAgICAgICAgeXBvcyA9IGhlaWdodCgp
OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCFtYXJnaW5JbmZvLmF0VG9wT2ZCbG9jaygp
IHx8CisgICAgICAgIH0gZWxzZSBpZiAoIW1hcmdpbkluZm8uYXRUb3BPZkJsb2NrKCkgfHwKICAg
ICAgICAgICAgICghbWFyZ2luSW5mby5jYW5Db2xsYXBzZVRvcFdpdGhDaGlsZHJlbigpCiAgICAg
ICAgICAgICAgJiYgKCFzdHlsZSgpLT5odG1sSGFja3MoKSB8fCAhbWFyZ2luSW5mby5xdWlya0Nv
bnRhaW5lcigpIHx8ICFtYXJnaW5JbmZvLnRvcFF1aXJrKCkpKSkgewogICAgICAgICAgICAgLy8g
V2UncmUgY29sbGFwc2luZyB3aXRoIGEgcHJldmlvdXMgc2libGluZydzIG1hcmdpbnMgYW5kIG5v
dApAQCAtMTA3OCwxMSArMTA2OSwxMSBAQCBpbnQgUmVuZGVyQmxvY2s6OmNvbGxhcHNlTWFyZ2lu
cyhSZW5kZXJCCiAgICAgICAgICAgICB5cG9zID0gaGVpZ2h0KCk7CiAgICAgICAgIH0KIAotICAg
ICAgICBtYXJnaW5JbmZvLnNldFBvc01hcmdpbihjaGlsZC0+bWF4Qm90dG9tTWFyZ2luKHRydWUp
KTsKLSAgICAgICAgbWFyZ2luSW5mby5zZXROZWdNYXJnaW4oY2hpbGQtPm1heEJvdHRvbU1hcmdp
bihmYWxzZSkpOworICAgICAgICBtYXJnaW5JbmZvLnNldFBvc01hcmdpbihjaGlsZCA/IGNoaWxk
LT5tYXhCb3R0b21NYXJnaW4odHJ1ZSkgOiAwKTsKKyAgICAgICAgbWFyZ2luSW5mby5zZXROZWdN
YXJnaW4oY2hpbGQgPyBjaGlsZC0+bWF4Qm90dG9tTWFyZ2luKGZhbHNlKSA6IDApOwogCiAgICAg
ICAgIGlmIChtYXJnaW5JbmZvLm1hcmdpbigpKQotICAgICAgICAgICAgbWFyZ2luSW5mby5zZXRC
b3R0b21RdWlyayhjaGlsZC0+aXNCb3R0b21NYXJnaW5RdWlyaygpIHx8IHN0eWxlKCktPm1hcmdp
bkJvdHRvbUNvbGxhcHNlKCkgPT0gTURJU0NBUkQpOworICAgICAgICAgICAgbWFyZ2luSW5mby5z
ZXRCb3R0b21RdWlyaygoY2hpbGQgJiYgY2hpbGQtPmlzQm90dG9tTWFyZ2luUXVpcmsoKSkgfHwg
c3R5bGUoKS0+bWFyZ2luQm90dG9tQ29sbGFwc2UoKSA9PSBNRElTQ0FSRCk7CiAgICAgfQogICAg
IAogICAgIHJldHVybiB5cG9zOwpAQCAtMTc0OSwyMCArMTc0MCw3IEBAIHZvaWQgUmVuZGVyQmxv
Y2s6OnBhaW50T2JqZWN0KFBhaW50SW5mbyYKICAgICBpZiAoKHBhaW50UGhhc2UgPT0gUGFpbnRQ
aGFzZU91dGxpbmUgfHwgcGFpbnRQaGFzZSA9PSBQYWludFBoYXNlU2VsZk91dGxpbmUpICYmIGhh
c091dGxpbmUoKSAmJiBzdHlsZSgpLT52aXNpYmlsaXR5KCkgPT0gVklTSUJMRSkKICAgICAgICAg
cGFpbnRPdXRsaW5lKHBhaW50SW5mby5jb250ZXh0LCB0eCwgdHksIHdpZHRoKCksIGhlaWdodCgp
LCBzdHlsZSgpKTsKIAotICAgIC8vIDYuIHBhaW50IGNvbnRpbnVhdGlvbiBvdXRsaW5lcy4KLSAg
ICBpZiAoKHBhaW50UGhhc2UgPT0gUGFpbnRQaGFzZU91dGxpbmUgfHwgcGFpbnRQaGFzZSA9PSBQ
YWludFBoYXNlQ2hpbGRPdXRsaW5lcykpIHsKLSAgICAgICAgaWYgKGlubGluZUNvbnRpbnVhdGlv
bigpICYmIGlubGluZUNvbnRpbnVhdGlvbigpLT5oYXNPdXRsaW5lKCkgJiYgaW5saW5lQ29udGlu
dWF0aW9uKCktPnN0eWxlKCktPnZpc2liaWxpdHkoKSA9PSBWSVNJQkxFKSB7Ci0gICAgICAgICAg
ICBSZW5kZXJJbmxpbmUqIGlubGluZVJlbmRlcmVyID0gdG9SZW5kZXJJbmxpbmUoaW5saW5lQ29u
dGludWF0aW9uKCktPm5vZGUoKS0+cmVuZGVyZXIoKSk7Ci0gICAgICAgICAgICBpZiAoIWlubGlu
ZVJlbmRlcmVyLT5oYXNTZWxmUGFpbnRpbmdMYXllcigpKQotICAgICAgICAgICAgICAgIGNvbnRh
aW5pbmdCbG9jaygpLT5hZGRDb250aW51YXRpb25XaXRoT3V0bGluZShpbmxpbmVSZW5kZXJlcik7
Ci0gICAgICAgICAgICBlbHNlIGlmICghaW5saW5lUmVuZGVyZXItPmZpcnN0TGluZUJveCgpKQot
ICAgICAgICAgICAgICAgIGlubGluZVJlbmRlcmVyLT5wYWludE91dGxpbmUocGFpbnRJbmZvLmNv
bnRleHQsIHR4IC0geCgpICsgaW5saW5lUmVuZGVyZXItPmNvbnRhaW5pbmdCbG9jaygpLT54KCks
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eSAtIHkoKSAr
IGlubGluZVJlbmRlcmVyLT5jb250YWluaW5nQmxvY2soKS0+eSgpKTsKLSAgICAgICAgfQotICAg
ICAgICBwYWludENvbnRpbnVhdGlvbk91dGxpbmVzKHBhaW50SW5mbywgdHgsIHR5KTsKLSAgICB9
Ci0KLSAgICAvLyA3LiBwYWludCBjYXJldC4KKyAgICAvLyA2LiBwYWludCBjYXJldC4KICAgICAv
LyBJZiB0aGUgY2FyZXQncyBub2RlJ3MgcmVuZGVyIG9iamVjdCdzIGNvbnRhaW5pbmcgYmxvY2sg
aXMgdGhpcyBibG9jaywgYW5kIHRoZSBwYWludCBhY3Rpb24gaXMgUGFpbnRQaGFzZUZvcmVncm91
bmQsCiAgICAgLy8gdGhlbiBwYWludCB0aGUgY2FyZXQuCiAgICAgaWYgKHBhaW50UGhhc2UgPT0g
UGFpbnRQaGFzZUZvcmVncm91bmQpIHsgICAgICAgIApAQCAtMTgyNSw1NyArMTgwMyw2IEBAIHZv
aWQgUmVuZGVyQmxvY2s6OnBhaW50RWxsaXBzaXNCb3hlcyhQYWkKICAgICB9CiB9CiAKLXN0YXRp
YyBDb250aW51YXRpb25PdXRsaW5lVGFibGVNYXAqIGNvbnRpbnVhdGlvbk91dGxpbmVUYWJsZSgp
Ci17Ci0gICAgREVGSU5FX1NUQVRJQ19MT0NBTChDb250aW51YXRpb25PdXRsaW5lVGFibGVNYXAs
IHRhYmxlLCAoKSk7Ci0gICAgcmV0dXJuICZ0YWJsZTsKLX0KLQotdm9pZCBSZW5kZXJCbG9jazo6
YWRkQ29udGludWF0aW9uV2l0aE91dGxpbmUoUmVuZGVySW5saW5lKiBmbG93KQotewotICAgIC8v
IFdlIGNhbid0IG1ha2UgdGhpcyB3b3JrIGlmIHRoZSBpbmxpbmUgaXMgaW4gYSBsYXllci4gIFdl
J2xsIGp1c3QgcmVseSBvbiB0aGUgYnJva2VuCi0gICAgLy8gd2F5IG9mIHBhaW50aW5nLgotICAg
IEFTU0VSVCghZmxvdy0+bGF5ZXIoKSAmJiAhZmxvdy0+aXNJbmxpbmVDb250aW51YXRpb24oKSk7
Ci0gICAgCi0gICAgQ29udGludWF0aW9uT3V0bGluZVRhYmxlTWFwKiB0YWJsZSA9IGNvbnRpbnVh
dGlvbk91dGxpbmVUYWJsZSgpOwotICAgIExpc3RIYXNoU2V0PFJlbmRlcklubGluZSo+KiBjb250
aW51YXRpb25zID0gdGFibGUtPmdldCh0aGlzKTsKLSAgICBpZiAoIWNvbnRpbnVhdGlvbnMpIHsK
LSAgICAgICAgY29udGludWF0aW9ucyA9IG5ldyBMaXN0SGFzaFNldDxSZW5kZXJJbmxpbmUqPjsK
LSAgICAgICAgdGFibGUtPnNldCh0aGlzLCBjb250aW51YXRpb25zKTsKLSAgICB9Ci0gICAgCi0g
ICAgY29udGludWF0aW9ucy0+YWRkKGZsb3cpOwotfQotCi12b2lkIFJlbmRlckJsb2NrOjpwYWlu
dENvbnRpbnVhdGlvbk91dGxpbmVzKFBhaW50SW5mbyYgaW5mbywgaW50IHR4LCBpbnQgdHkpCi17
Ci0gICAgQ29udGludWF0aW9uT3V0bGluZVRhYmxlTWFwKiB0YWJsZSA9IGNvbnRpbnVhdGlvbk91
dGxpbmVUYWJsZSgpOwotICAgIGlmICh0YWJsZS0+aXNFbXB0eSgpKQotICAgICAgICByZXR1cm47
Ci0gICAgICAgIAotICAgIExpc3RIYXNoU2V0PFJlbmRlcklubGluZSo+KiBjb250aW51YXRpb25z
ID0gdGFibGUtPmdldCh0aGlzKTsKLSAgICBpZiAoIWNvbnRpbnVhdGlvbnMpCi0gICAgICAgIHJl
dHVybjsKLSAgICAgICAgCi0gICAgLy8gUGFpbnQgZWFjaCBjb250aW51YXRpb24gb3V0bGluZS4K
LSAgICBMaXN0SGFzaFNldDxSZW5kZXJJbmxpbmUqPjo6aXRlcmF0b3IgZW5kID0gY29udGludWF0
aW9ucy0+ZW5kKCk7Ci0gICAgZm9yIChMaXN0SGFzaFNldDxSZW5kZXJJbmxpbmUqPjo6aXRlcmF0
b3IgaXQgPSBjb250aW51YXRpb25zLT5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAg
ICAgLy8gTmVlZCB0byBhZGQgaW4gdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBpbnRlcnZlbmluZyBi
bG9ja3MuCi0gICAgICAgIFJlbmRlcklubGluZSogZmxvdyA9ICppdDsKLSAgICAgICAgUmVuZGVy
QmxvY2sqIGJsb2NrID0gZmxvdy0+Y29udGFpbmluZ0Jsb2NrKCk7Ci0gICAgICAgIGZvciAoIDsg
YmxvY2sgJiYgYmxvY2sgIT0gdGhpczsgYmxvY2sgPSBibG9jay0+Y29udGFpbmluZ0Jsb2NrKCkp
IHsKLSAgICAgICAgICAgIHR4ICs9IGJsb2NrLT54KCk7Ci0gICAgICAgICAgICB0eSArPSBibG9j
ay0+eSgpOwotICAgICAgICB9Ci0gICAgICAgIEFTU0VSVChibG9jayk7ICAgCi0gICAgICAgIGZs
b3ctPnBhaW50T3V0bGluZShpbmZvLmNvbnRleHQsIHR4LCB0eSk7Ci0gICAgfQotICAgIAotICAg
IC8vIERlbGV0ZQotICAgIGRlbGV0ZSBjb250aW51YXRpb25zOwotICAgIHRhYmxlLT5yZW1vdmUo
dGhpcyk7Ci19Ci0KIHZvaWQgUmVuZGVyQmxvY2s6OnNldFNlbGVjdGlvblN0YXRlKFNlbGVjdGlv
blN0YXRlIHMpCiB7CiAgICAgaWYgKHNlbGVjdGlvblN0YXRlKCkgPT0gcykKQEAgLTE4OTAsNiAr
MTgxNywxMiBAQCB2b2lkIFJlbmRlckJsb2NrOjpzZXRTZWxlY3Rpb25TdGF0ZShTZWxlCiAgICAg
ZWxzZQogICAgICAgICBSZW5kZXJCb3g6OnNldFNlbGVjdGlvblN0YXRlKHMpOwogICAgIAorICAg
IGlmIChpc1JlcGxhY2VkKCkgJiYgbV9pbmxpbmVCb3hXcmFwcGVyKSB7CisgICAgICAgIFJvb3RJ
bmxpbmVCb3gqIGxpbmUgPSBtX2lubGluZUJveFdyYXBwZXItPnJvb3QoKTsKKyAgICAgICAgaWYg
KGxpbmUpCisgICAgICAgICAgICBsaW5lLT5zZXRIYXNTZWxlY3RlZENoaWxkcmVuKHMgIT0gU2Vs
ZWN0aW9uTm9uZSk7CisgICAgfQorCiAgICAgUmVuZGVyQmxvY2sqIGNiID0gY29udGFpbmluZ0Js
b2NrKCk7CiAgICAgaWYgKGNiICYmICFjYi0+aXNSZW5kZXJWaWV3KCkpCiAgICAgICAgIGNiLT5z
ZXRTZWxlY3Rpb25TdGF0ZShzKTsKQEAgLTE5MDgsOSArMTg0MSw5IEBAIGJvb2wgUmVuZGVyQmxv
Y2s6OmlzU2VsZWN0aW9uUm9vdCgpIGNvbnMKICAgICAvLyBGSVhNRTogRXZlbnR1YWxseSB0YWJs
ZXMgc2hvdWxkIGhhdmUgdG8gbGVhcm4gaG93IHRvIGZpbGwgZ2FwcyBiZXR3ZWVuIGNlbGxzLCBh
dCBsZWFzdCBpbiBzaW1wbGUgbm9uLXNwYW5uaW5nIGNhc2VzLgogICAgIGlmIChpc1RhYmxlKCkp
CiAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgCisKICAgICBpZiAoaXNCb2R5KCkgfHwg
aXNSb290KCkgfHwgaGFzT3ZlcmZsb3dDbGlwKCkgfHwgaXNSZWxQb3NpdGlvbmVkKCkgfHwKLSAg
ICAgICAgaXNGbG9hdGluZ09yUG9zaXRpb25lZCgpIHx8IGlzVGFibGVDZWxsKCkgfHwgaXNJbmxp
bmVCbG9ja09ySW5saW5lVGFibGUoKSB8fCBoYXNUcmFuc2Zvcm0oKSB8fAorICAgICAgICBpc0Zs
b2F0aW5nT3JQb3NpdGlvbmVkKCkgfHwgaXNUYWJsZUNlbGwoKSB8fCAoaXNJbmxpbmVCbG9ja09y
SW5saW5lVGFibGUoKSAmJiAhaXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKSB8fCBoYXNUcmFuc2Zv
cm0oKSB8fAogICAgICAgICBoYXNSZWZsZWN0aW9uKCkgfHwgaGFzTWFzaygpKQogICAgICAgICBy
ZXR1cm4gdHJ1ZTsKICAgICAKQEAgLTIwNTUsMTggKzE5ODgsMzAgQEAgR2FwUmVjdHMgUmVuZGVy
QmxvY2s6OmZpbGxJbmxpbmVTZWxlY3RpbwogICAgIGZvciAoY3VyciA9IGZpcnN0Um9vdEJveCgp
OyBjdXJyICYmICFjdXJyLT5oYXNTZWxlY3RlZENoaWxkcmVuKCk7IGN1cnIgPSBjdXJyLT5uZXh0
Um9vdEJveCgpKSB7IH0KIAogICAgIC8vIE5vdyBwYWludCB0aGUgZ2FwcyBmb3IgdGhlIGxpbmVz
LgotICAgIGZvciAoOyBjdXJyICYmIGN1cnItPmhhc1NlbGVjdGVkQ2hpbGRyZW4oKTsgY3VyciA9
IGN1cnItPm5leHRSb290Qm94KCkpIHsKKyAgICBmb3IgKDsgY3VyciAmJiAoY3Vyci0+aGFzU2Vs
ZWN0ZWRDaGlsZHJlbigpIHx8IGN1cnItPmFub255bW91c0lubGluZUJsb2NrKCkpOyBjdXJyID0g
Y3Vyci0+bmV4dFJvb3RCb3goKSkgeworICAgICAgICBpZiAoIWN1cnItPmhhc1NlbGVjdGVkQ2hp
bGRyZW4oKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCiAgICAgICAgIGludCBzZWxUb3AgPSAg
Y3Vyci0+c2VsZWN0aW9uVG9wKCk7CiAgICAgICAgIGludCBzZWxIZWlnaHQgPSBjdXJyLT5zZWxl
Y3Rpb25IZWlnaHQoKTsKIAotICAgICAgICBpZiAoIWNvbnRhaW5zU3RhcnQgJiYgIWxhc3RTZWxl
Y3RlZExpbmUgJiYKLSAgICAgICAgICAgIHNlbGVjdGlvblN0YXRlKCkgIT0gU2VsZWN0aW9uU3Rh
cnQgJiYgc2VsZWN0aW9uU3RhdGUoKSAhPSBTZWxlY3Rpb25Cb3RoKQotICAgICAgICAgICAgcmVz
dWx0LnVuaXRlQ2VudGVyKGZpbGxWZXJ0aWNhbFNlbGVjdGlvbkdhcChsYXN0VG9wLCBsYXN0TGVm
dCwgbGFzdFJpZ2h0LCB0eSArIHNlbFRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdEJsb2NrLCBibG9ja1gsIGJsb2NrWSwgcGFp
bnRJbmZvKSk7Ci0KLSAgICAgICAgaWYgKCFwYWludEluZm8gfHwgKHR5ICsgc2VsVG9wIDwgcGFp
bnRJbmZvLT5yZWN0LmJvdHRvbSgpICYmIHR5ICsgc2VsVG9wICsgc2VsSGVpZ2h0ID4gcGFpbnRJ
bmZvLT5yZWN0LnkoKSkpCi0gICAgICAgICAgICByZXN1bHQudW5pdGUoY3Vyci0+ZmlsbExpbmVT
ZWxlY3Rpb25HYXAoc2VsVG9wLCBzZWxIZWlnaHQsIHJvb3RCbG9jaywgYmxvY2tYLCBibG9ja1ks
IHR4LCB0eSwgcGFpbnRJbmZvKSk7CisgICAgICAgIGlmIChjdXJyLT5hbm9ueW1vdXNJbmxpbmVC
bG9jaygpKSB7CisgICAgICAgICAgICBpZiAobGFzdFNlbGVjdGVkTGluZSkgeworICAgICAgICAg
ICAgICAgIGxhc3RUb3AgPSAodHkgLSBibG9ja1kpICsgbGFzdFNlbGVjdGVkTGluZS0+c2VsZWN0
aW9uQm90dG9tKCk7CisgICAgICAgICAgICAgICAgbGFzdExlZnQgPSBsZWZ0U2VsZWN0aW9uT2Zm
c2V0KHJvb3RCbG9jaywgbGFzdFNlbGVjdGVkTGluZS0+c2VsZWN0aW9uQm90dG9tKCkpOworICAg
ICAgICAgICAgICAgIGxhc3RSaWdodCA9IHJpZ2h0U2VsZWN0aW9uT2Zmc2V0KHJvb3RCbG9jaywg
bGFzdFNlbGVjdGVkTGluZS0+c2VsZWN0aW9uQm90dG9tKCkpOworICAgICAgICAgICAgfQorICAg
ICAgICAgICAgcmVzdWx0LnVuaXRlKGN1cnItPmFub255bW91c0lubGluZUJsb2NrKCktPmZpbGxT
ZWxlY3Rpb25HYXBzKHJvb3RCbG9jaywgYmxvY2tYLCBibG9ja1ksIHR4ICsgY3Vyci0+eCgpLCB0
eSArIGN1cnItPnkoKSwgbGFzdFRvcCwgbGFzdExlZnQsIGxhc3RSaWdodCwgcGFpbnRJbmZvKSk7
CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIWNvbnRhaW5zU3RhcnQgJiYgIWxh
c3RTZWxlY3RlZExpbmUgJiYKKyAgICAgICAgICAgICAgICBzZWxlY3Rpb25TdGF0ZSgpICE9IFNl
bGVjdGlvblN0YXJ0ICYmIHNlbGVjdGlvblN0YXRlKCkgIT0gU2VsZWN0aW9uQm90aCkKKyAgICAg
ICAgICAgICAgICByZXN1bHQudW5pdGVDZW50ZXIoZmlsbFZlcnRpY2FsU2VsZWN0aW9uR2FwKGxh
c3RUb3AsIGxhc3RMZWZ0LCBsYXN0UmlnaHQsIHR5ICsgc2VsVG9wLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdEJsb2NrLCBi
bG9ja1gsIGJsb2NrWSwgcGFpbnRJbmZvKSk7CiAKKyAgICAgICAgICAgIGlmICghcGFpbnRJbmZv
IHx8ICh0eSArIHNlbFRvcCA8IHBhaW50SW5mby0+cmVjdC5ib3R0b20oKSAmJiB0eSArIHNlbFRv
cCArIHNlbEhlaWdodCA+IHBhaW50SW5mby0+cmVjdC55KCkpKQorICAgICAgICAgICAgICAgIHJl
c3VsdC51bml0ZShjdXJyLT5maWxsTGluZVNlbGVjdGlvbkdhcChzZWxUb3AsIHNlbEhlaWdodCwg
cm9vdEJsb2NrLCBibG9ja1gsIGJsb2NrWSwgdHgsIHR5LCBwYWludEluZm8pKTsKKyAgICAgICAg
fQorICAgICAgICAKICAgICAgICAgbGFzdFNlbGVjdGVkTGluZSA9IGN1cnI7CiAgICAgfQogCkBA
IC0yMDc0LDggKzIwMTksOCBAQCBHYXBSZWN0cyBSZW5kZXJCbG9jazo6ZmlsbElubGluZVNlbGVj
dGlvCiAgICAgICAgIC8vIFZpc2libGVTZWxlY3Rpb24gbXVzdCBzdGFydCBqdXN0IGFmdGVyIG91
ciBsYXN0IGxpbmUuCiAgICAgICAgIGxhc3RTZWxlY3RlZExpbmUgPSBsYXN0Um9vdEJveCgpOwog
Ci0gICAgaWYgKGxhc3RTZWxlY3RlZExpbmUgJiYgc2VsZWN0aW9uU3RhdGUoKSAhPSBTZWxlY3Rp
b25FbmQgJiYgc2VsZWN0aW9uU3RhdGUoKSAhPSBTZWxlY3Rpb25Cb3RoKSB7Ci0gICAgICAgIC8v
IEdvIGFoZWFkIGFuZCB1cGRhdGUgb3VyIGxhc3RZIHRvIGJlIHRoZSBib3R0b20gb2YgdGhlIGxh
c3Qgc2VsZWN0ZWQgbGluZS4KKyAgICBpZiAobGFzdFNlbGVjdGVkTGluZSAmJiAhbGFzdFNlbGVj
dGVkTGluZS0+YW5vbnltb3VzSW5saW5lQmxvY2soKSAmJiBzZWxlY3Rpb25TdGF0ZSgpICE9IFNl
bGVjdGlvbkVuZCAmJiBzZWxlY3Rpb25TdGF0ZSgpICE9IFNlbGVjdGlvbkJvdGgpIHsKKyAgICAg
ICAgLy8gR28gYWhlYWQgYW5kIHVwZGF0ZSBvdXIgbGFzdFRvcCB0byBiZSB0aGUgYm90dG9tIG9m
IHRoZSBsYXN0IHNlbGVjdGVkIGxpbmUuCiAgICAgICAgIGxhc3RUb3AgPSAodHkgLSBibG9ja1kp
ICsgbGFzdFNlbGVjdGVkTGluZS0+c2VsZWN0aW9uQm90dG9tKCk7CiAgICAgICAgIGxhc3RMZWZ0
ID0gbGVmdFNlbGVjdGlvbk9mZnNldChyb290QmxvY2ssIGxhc3RTZWxlY3RlZExpbmUtPnNlbGVj
dGlvbkJvdHRvbSgpKTsKICAgICAgICAgbGFzdFJpZ2h0ID0gcmlnaHRTZWxlY3Rpb25PZmZzZXQo
cm9vdEJsb2NrLCBsYXN0U2VsZWN0ZWRMaW5lLT5zZWxlY3Rpb25Cb3R0b20oKSk7CkBAIC0yOTg1
LDI1ICsyOTMwLDMxIEBAIHZvaWQgUmVuZGVyQmxvY2s6OmNsZWFyRmxvYXRzKCkKICAgICAvLyBv
dXQgb2YgZmxvdyAobGlrZSBmbG9hdGluZy9wb3NpdGlvbmVkIGVsZW1lbnRzKSwgYW5kIHdlIGFs
c28gc2tpcCBvdmVyIGFueSBvYmplY3RzIHRoYXQgbWF5IGhhdmUgc2hpZnRlZAogICAgIC8vIHRv
IGF2b2lkIGZsb2F0cy4KICAgICBib29sIHBhcmVudEhhc0Zsb2F0cyA9IGZhbHNlOwotICAgIFJl
bmRlck9iamVjdCogcHJldiA9IHByZXZpb3VzU2libGluZygpOwotICAgIHdoaWxlIChwcmV2ICYm
IChwcmV2LT5pc0Zsb2F0aW5nT3JQb3NpdGlvbmVkKCkgfHwgIXByZXYtPmlzQm94KCkgfHwgIXBy
ZXYtPmlzUmVuZGVyQmxvY2soKSB8fCB0b1JlbmRlckJsb2NrKHByZXYpLT5hdm9pZHNGbG9hdHMo
KSkpIHsKLSAgICAgICAgaWYgKHByZXYtPmlzRmxvYXRpbmcoKSkKLSAgICAgICAgICAgIHBhcmVu
dEhhc0Zsb2F0cyA9IHRydWU7Ci0gICAgICAgICBwcmV2ID0gcHJldi0+cHJldmlvdXNTaWJsaW5n
KCk7CisgICAgUmVuZGVyT2JqZWN0KiBwcmV2ID0gMDsKKyAgICBSZW5kZXJCbG9jayogcGFyZW50
QmxvY2sgPSAwOworICAgIGlmIChpc0Fub255bW91c0lubGluZUJsb2NrKCkpIHsKKyAgICAgICAg
cGFyZW50QmxvY2sgPSBjb250YWluaW5nQmxvY2soKTsKKyAgICAgICAgcGFyZW50SGFzRmxvYXRz
ID0gcGFyZW50QmxvY2stPmNvbnRhaW5zRmxvYXRzKCk7CisgICAgfSBlbHNlIHsgICAgCisgICAg
ICAgIHdoaWxlIChwcmV2ICYmIChwcmV2LT5pc0Zsb2F0aW5nT3JQb3NpdGlvbmVkKCkgfHwgIXBy
ZXYtPmlzQm94KCkgfHwgIXByZXYtPmlzUmVuZGVyQmxvY2soKSB8fCB0b1JlbmRlckJsb2NrKHBy
ZXYpLT5hdm9pZHNGbG9hdHMoKSkpIHsKKyAgICAgICAgICAgIGlmIChwcmV2LT5pc0Zsb2F0aW5n
KCkpCisgICAgICAgICAgICAgICAgcGFyZW50SGFzRmxvYXRzID0gdHJ1ZTsKKyAgICAgICAgICAg
IHByZXYgPSBwcmV2LT5wcmV2aW91c1NpYmxpbmcoKTsKKyAgICAgICAgfQorICAgICAgICAKKyAg
ICAgICAgcGFyZW50QmxvY2sgPSBwYXJlbnQoKS0+aXNSZW5kZXJCbG9jaygpID8gdG9SZW5kZXJC
bG9jayhwYXJlbnQoKSkgOiAwOwogICAgIH0KIAogICAgIC8vIEZpcnN0IGFkZCBpbiBmbG9hdHMg
ZnJvbSB0aGUgcGFyZW50LgogICAgIGludCBvZmZzZXQgPSB5KCk7Ci0gICAgaWYgKHBhcmVudEhh
c0Zsb2F0cykgewotICAgICAgICBSZW5kZXJCbG9jayogcGFyZW50QmxvY2sgPSB0b1JlbmRlckJs
b2NrKHBhcmVudCgpKTsKKyAgICBpZiAocGFyZW50SGFzRmxvYXRzKQogICAgICAgICBhZGRJbnRy
dWRpbmdGbG9hdHMocGFyZW50QmxvY2ssIHBhcmVudEJsb2NrLT5ib3JkZXJMZWZ0KCkgKyBwYXJl
bnRCbG9jay0+cGFkZGluZ0xlZnQoKSwgb2Zmc2V0KTsKLSAgICB9Ci0gICAgCisKICAgICBpbnQg
eG9mZnNldCA9IDA7CiAgICAgaWYgKHByZXYpCiAgICAgICAgIG9mZnNldCAtPSB0b1JlbmRlckJv
eChwcmV2KS0+eSgpOwotICAgIGVsc2UgaWYgKHBhcmVudCgpLT5pc0JveCgpKSB7Ci0gICAgICAg
IHByZXYgPSBwYXJlbnQoKTsKKyAgICBlbHNlIGlmIChwYXJlbnRCbG9jaykgeworICAgICAgICBw
cmV2ID0gcGFyZW50QmxvY2s7CiAgICAgICAgIHhvZmZzZXQgKz0gdG9SZW5kZXJCb3gocHJldikt
PmJvcmRlckxlZnQoKSArIHRvUmVuZGVyQm94KHByZXYpLT5wYWRkaW5nTGVmdCgpOwogICAgIH0K
IApAQCAtMzEzOCw3ICszMDg5LDcgQEAgdm9pZCBSZW5kZXJCbG9jazo6YWRkSW50cnVkaW5nRmxv
YXRzKFJlbgogICAgICAgICAgICAgICAgIC8vIGFib3ZlLiAgfHhvZmZ8IHdpbGwgZXF1YWwgLWZs
b3ctPm1hcmdpbkxlZnQoKSBpbiB0aGlzIGNhc2UsIHNvIGl0J3MgYWxyZWFkeSBiZWVuIHRha2Vu
CiAgICAgICAgICAgICAgICAgLy8gaW50byBhY2NvdW50LiAgT25seSBhcHBseSB0aGlzIGNvZGUg
aWYgfGNoaWxkfCBpcyBmYWxzZSwgc2luY2Ugb3RoZXJ3aXNlIHRoZSBsZWZ0IG1hcmdpbgogICAg
ICAgICAgICAgICAgIC8vIHdpbGwgZ2V0IGFwcGxpZWQgdHdpY2UuCi0gICAgICAgICAgICAgICAg
aWYgKHByZXYgIT0gcGFyZW50KCkpCisgICAgICAgICAgICAgICAgaWYgKHByZXYgIT0gY29udGFp
bmluZ0Jsb2NrKCkpCiAgICAgICAgICAgICAgICAgICAgIGZsb2F0aW5nT2JqLT5tX2xlZnQgKz0g
cHJldi0+bWFyZ2luTGVmdCgpOwogICAgICAgICAgICAgICAgIGZsb2F0aW5nT2JqLT5tX2xlZnQg
LT0gbWFyZ2luTGVmdCgpOwogICAgICAgICAgICAgICAgIGZsb2F0aW5nT2JqLT5tX3Nob3VsZFBh
aW50ID0gZmFsc2U7ICAvLyBXZSBhcmUgbm90IGluIHRoZSBkaXJlY3QgaW5oZXJpdGFuY2UgY2hh
aW4gZm9yIHRoaXMgZmxvYXQuIFdlIHdpbGwgbmV2ZXIgcGFpbnQgaXQuCkBAIC0zMTgzLDcgKzMx
MzQsMTMgQEAgdm9pZCBSZW5kZXJCbG9jazo6bWFya0FsbERlc2NlbmRhbnRzV2l0aAogICAgICAg
ICByZW1vdmVGbG9hdGluZ09iamVjdChmbG9hdFRvUmVtb3ZlKTsKIAogICAgIC8vIEl0ZXJhdGUg
b3ZlciBvdXIgY2hpbGRyZW4gYW5kIG1hcmsgdGhlbSBhcyBuZWVkZWQuCi0gICAgaWYgKCFjaGls
ZHJlbklubGluZSgpKSB7CisgICAgaWYgKGNoaWxkcmVuSW5saW5lKCkpIHsKKyAgICAgICAgZm9y
IChSb290SW5saW5lQm94KiBib3ggPSBmaXJzdFJvb3RCb3goKTsgYm94OyBib3ggPSBib3gtPm5l
eHRSb290Qm94KCkpIHsKKyAgICAgICAgICAgIFJlbmRlckJsb2NrKiBjaGlsZEJsb2NrID0gYm94
LT5hbm9ueW1vdXNJbmxpbmVCbG9jaygpOworICAgICAgICAgICAgaWYgKGNoaWxkQmxvY2sgJiYg
KGZsb2F0VG9SZW1vdmUgPyBjaGlsZEJsb2NrLT5jb250YWluc0Zsb2F0KGZsb2F0VG9SZW1vdmUp
IDogY2hpbGRCbG9jay0+Y29udGFpbnNGbG9hdHMoKSkpCisgICAgICAgICAgICAgICAgY2hpbGRC
bG9jay0+bWFya0FsbERlc2NlbmRhbnRzV2l0aEZsb2F0c0ZvckxheW91dChmbG9hdFRvUmVtb3Zl
LCBpbkxheW91dCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgewogICAgICAgICBmb3IgKFJlbmRl
ck9iamVjdCogY2hpbGQgPSBmaXJzdENoaWxkKCk7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0
U2libGluZygpKSB7CiAgICAgICAgICAgICBpZiAoKCFmbG9hdFRvUmVtb3ZlICYmIGNoaWxkLT5p
c0Zsb2F0aW5nT3JQb3NpdGlvbmVkKCkpIHx8ICFjaGlsZC0+aXNSZW5kZXJCbG9jaygpKQogICAg
ICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtNDE0MiwxNCArNDA5OSwxNSBAQCB2b2lkIFJlbmRl
ckJsb2NrOjpjYWxjSW5saW5lUHJlZldpZHRocygpCiAgICAgICAgICAgICAgICAgfSBlbHNlCiAg
ICAgICAgICAgICAgICAgICAgIGNsZWFyUHJldmlvdXNGbG9hdCA9IGZhbHNlOwogCi0gICAgICAg
ICAgICAgICAgYm9vbCBjYW5CcmVha1JlcGxhY2VkRWxlbWVudCA9ICFjaGlsZC0+aXNJbWFnZSgp
IHx8IGFsbG93SW1hZ2VzVG9CcmVhazsKKyAgICAgICAgICAgICAgICBib29sIGNhbkJyZWFrUmVw
bGFjZWRFbGVtZW50ID0gIWNoaWxkLT5pc0ltYWdlKCkgfHwgYWxsb3dJbWFnZXNUb0JyZWFrIHx8
IGNoaWxkLT5pc0Fub255bW91c0lubGluZUJsb2NrKCk7CiAgICAgICAgICAgICAgICAgaWYgKChj
YW5CcmVha1JlcGxhY2VkRWxlbWVudCAmJiAoYXV0b1dyYXAgfHwgb2xkQXV0b1dyYXApKSB8fCBj
bGVhclByZXZpb3VzRmxvYXQpIHsKICAgICAgICAgICAgICAgICAgICAgbV9taW5QcmVmV2lkdGgg
PSBtYXgoaW5saW5lTWluLCBtX21pblByZWZXaWR0aCk7CiAgICAgICAgICAgICAgICAgICAgIGlu
bGluZU1pbiA9IDA7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgLy8gSWYg
d2UncmUgc3VwcG9zZWQgdG8gY2xlYXIgdGhlIHByZXZpb3VzIGZsb2F0LCB0aGVuIHRlcm1pbmF0
ZSBtYXh3aWR0aCBhcyB3ZWxsLgotICAgICAgICAgICAgICAgIGlmIChjbGVhclByZXZpb3VzRmxv
YXQpIHsKKyAgICAgICAgICAgICAgICAvLyBBbHNvIGRvIHRoaXMgZm9yIGFub255bW91cyBpbmxp
bmUgYmxvY2tzLgorICAgICAgICAgICAgICAgIGlmIChjbGVhclByZXZpb3VzRmxvYXQgfHwgY2hp
bGQtPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkgewogICAgICAgICAgICAgICAgICAgICBtX21h
eFByZWZXaWR0aCA9IG1heChpbmxpbmVNYXgsIG1fbWF4UHJlZldpZHRoKTsKICAgICAgICAgICAg
ICAgICAgICAgaW5saW5lTWF4ID0gMDsKICAgICAgICAgICAgICAgICB9CkBAIC00MTU4LDE1ICs0
MTE2LDE3IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmNhbGNJbmxpbmVQcmVmV2lkdGhzKCkKICAgICAg
ICAgICAgICAgICBpbnQgdGkgPSAwOwogICAgICAgICAgICAgICAgIGlmICghYWRkZWRUZXh0SW5k
ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgIGFkZGVkVGV4dEluZGVudCA9IHRydWU7Ci0gICAg
ICAgICAgICAgICAgICAgIHRpID0gc3R5bGUoKS0+dGV4dEluZGVudCgpLmNhbGNNaW5WYWx1ZShj
dyk7Ci0gICAgICAgICAgICAgICAgICAgIGNoaWxkTWluKz10aTsKLSAgICAgICAgICAgICAgICAg
ICAgY2hpbGRNYXgrPXRpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkLT5pc0Fub255
bW91c0lubGluZUJsb2NrKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpID0gc3R5bGUo
KS0+dGV4dEluZGVudCgpLmNhbGNNaW5WYWx1ZShjdyk7CisgICAgICAgICAgICAgICAgICAgICAg
ICBjaGlsZE1pbiArPSB0aTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkTWF4ICs9IHRp
OworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAg
ICAgICAgLy8gQWRkIG91ciB3aWR0aCB0byB0aGUgbWF4LgogICAgICAgICAgICAgICAgIGlubGlu
ZU1heCArPSBjaGlsZE1heDsKIAotICAgICAgICAgICAgICAgIGlmICghYXV0b1dyYXAgfHwgIWNh
bkJyZWFrUmVwbGFjZWRFbGVtZW50KSB7CisgICAgICAgICAgICAgICAgaWYgKCghYXV0b1dyYXAg
fHwgIWNhbkJyZWFrUmVwbGFjZWRFbGVtZW50KSAmJiAhY2hpbGQtPmlzQW5vbnltb3VzSW5saW5l
QmxvY2soKSkgewogICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQtPmlzRmxvYXRpbmcoKSkK
ICAgICAgICAgICAgICAgICAgICAgICAgIG1fbWluUHJlZldpZHRoID0gbWF4KGNoaWxkTWluLCBt
X21pblByZWZXaWR0aCk7CiAgICAgICAgICAgICAgICAgICAgIGVsc2UKQEAgLTQxNzcsNiArNDEz
NywxMiBAQCB2b2lkIFJlbmRlckJsb2NrOjpjYWxjSW5saW5lUHJlZldpZHRocygpCiAKICAgICAg
ICAgICAgICAgICAgICAgLy8gTm93IHN0YXJ0IGEgbmV3IGxpbmUuCiAgICAgICAgICAgICAgICAg
ICAgIGlubGluZU1pbiA9IDA7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAg
ICAgICBpZiAoY2hpbGQtPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkgeworICAgICAgICAgICAg
ICAgICAgICAgICAgLy8gVGVybWluYXRlIG1heCB3aWR0aCBhcyB3ZWxsLgorICAgICAgICAgICAg
ICAgICAgICAgICAgbV9tYXhQcmVmV2lkdGggPSBtYXgoY2hpbGRNYXgsIG1fbWF4UHJlZldpZHRo
KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZU1heCA9IDA7CisgICAgICAgICAgICAg
ICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAvLyBXZSBhcmUg
bm8gbG9uZ2VyIHN0cmlwcGluZyB3aGl0ZXNwYWNlIGF0IHRoZSBzdGFydCBvZgpAQCAtNDQxNyw5
ICs0MzgzLDEyIEBAIGludCBSZW5kZXJCbG9jazo6bGluZUhlaWdodChib29sIGZpcnN0TGkKICAg
ICAvLyB0aGUgYmFzZSBjbGFzcy4gIElmIHdlJ3JlIGJlaW5nIHF1ZXJpZWQgYXMgdGhvdWdoIHdl
J3JlIHRoZSByb290IGxpbmUKICAgICAvLyBib3gsIHRoZW4gdGhlIGZhY3QgdGhhdCB3ZSdyZSBh
biBpbmxpbmUtYmxvY2sgaXMgaXJyZWxldmFudCwgYW5kIHdlIGJlaGF2ZQogICAgIC8vIGp1c3Qg
bGlrZSBhIGJsb2NrLgotICAgIGlmIChpc1JlcGxhY2VkKCkgJiYgIWlzUm9vdExpbmVCb3gpCisg
ICAgaWYgKGlzUmVwbGFjZWQoKSAmJiAhaXNSb290TGluZUJveCkgeworICAgICAgICBpZiAoaXNB
bm9ueW1vdXNJbmxpbmVCbG9jaygpKQorICAgICAgICAgICAgcmV0dXJuIGhlaWdodCgpOwogICAg
ICAgICByZXR1cm4gaGVpZ2h0KCkgKyBtYXJnaW5Ub3AoKSArIG1hcmdpbkJvdHRvbSgpOwotICAg
IAorICAgIH0KKwogICAgIGlmIChmaXJzdExpbmUgJiYgZG9jdW1lbnQoKS0+dXNlc0ZpcnN0TGlu
ZVJ1bGVzKCkpIHsKICAgICAgICAgUmVuZGVyU3R5bGUqIHMgPSBzdHlsZShmaXJzdExpbmUpOwog
ICAgICAgICBpZiAocyAhPSBzdHlsZSgpKQpAQCAtNDQ1MSw2ICs0NDIwLDggQEAgaW50IFJlbmRl
ckJsb2NrOjpiYXNlbGluZVBvc2l0aW9uKGJvb2wgYgogICAgICAgICAvLyBXZSBhbHNvIGdpdmUg
dXAgb24gZmluZGluZyBhIGJhc2VsaW5lIGlmIHdlIGhhdmUgYSB2ZXJ0aWNhbCBzY3JvbGxiYXIs
IG9yIGlmIHdlIGFyZSBzY3JvbGxlZAogICAgICAgICAvLyB2ZXJ0aWNhbGx5IChlLmcuLCBhbiBv
dmVyZmxvdzpoaWRkZW4gYmxvY2sgdGhhdCBoYXMgaGFkIHNjcm9sbFRvcCBtb3ZlZCkgb3IgaWYg
dGhlIGJhc2VsaW5lIGlzIG91dHNpZGUKICAgICAgICAgLy8gb2Ygb3VyIGNvbnRlbnQgYm94Lgor
ICAgICAgICBpZiAoaXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKQorICAgICAgICAgICAgcmV0dXJu
IGhlaWdodCgpOwogICAgICAgICBpbnQgYmFzZWxpbmVQb3MgPSAobGF5ZXIoKSAmJiAobGF5ZXIo
KS0+bWFycXVlZSgpIHx8IGxheWVyKCktPnZlcnRpY2FsU2Nyb2xsYmFyKCkgfHwgbGF5ZXIoKS0+
c2Nyb2xsWU9mZnNldCgpICE9IDApKSA/IC0xIDogbGFzdExpbmVCb3hCYXNlbGluZSgpOwogICAg
ICAgICBpZiAoYmFzZWxpbmVQb3MgIT0gLTEgJiYgYmFzZWxpbmVQb3MgPD0gYm9yZGVyVG9wKCkg
KyBwYWRkaW5nVG9wKCkgKyBjb250ZW50SGVpZ2h0KCkpCiAgICAgICAgICAgICByZXR1cm4gbWFy
Z2luVG9wKCkgKyBiYXNlbGluZVBvczsKQEAgLTQ4NzUsNjAgKzQ4NDYsNiBAQCB2b2lkIFJlbmRl
ckJsb2NrOjpzZXRNYXhCb3R0b21NYXJnaW5zKGluCiAgICAgbV9tYXhNYXJnaW4tPm1fYm90dG9t
TmVnID0gbmVnOwogfQogCi12b2lkIFJlbmRlckJsb2NrOjphYnNvbHV0ZVJlY3RzKFZlY3RvcjxJ
bnRSZWN0PiYgcmVjdHMsIGludCB0eCwgaW50IHR5KQotewotICAgIC8vIEZvciBibG9ja3MgaW5z
aWRlIGlubGluZXMsIHdlIGdvIGFoZWFkIGFuZCBpbmNsdWRlIG1hcmdpbnMgc28gdGhhdCB3ZSBy
dW4gcmlnaHQgdXAgdG8gdGhlCi0gICAgLy8gaW5saW5lIGJveGVzIGFib3ZlIGFuZCBiZWxvdyB1
cyAodGh1cyBnZXR0aW5nIG1lcmdlZCB3aXRoIHRoZW0gdG8gZm9ybSBhIHNpbmdsZSBpcnJlZ3Vs
YXIKLSAgICAvLyBzaGFwZSkuCi0gICAgaWYgKGlubGluZUNvbnRpbnVhdGlvbigpKSB7Ci0gICAg
ICAgIHJlY3RzLmFwcGVuZChJbnRSZWN0KHR4LCB0eSAtIGNvbGxhcHNlZE1hcmdpblRvcCgpLAot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCgpLCBoZWlnaHQoKSArIGNvbGxhcHNl
ZE1hcmdpblRvcCgpICsgY29sbGFwc2VkTWFyZ2luQm90dG9tKCkpKTsKLSAgICAgICAgaW5saW5l
Q29udGludWF0aW9uKCktPmFic29sdXRlUmVjdHMocmVjdHMsCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHR4IC0geCgpICsgaW5saW5lQ29udGludWF0aW9uKCkt
PmNvbnRhaW5pbmdCbG9jaygpLT54KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHR5IC0geSgpICsgaW5saW5lQ29udGludWF0aW9uKCktPmNvbnRhaW5pbmdC
bG9jaygpLT55KCkpOwotICAgIH0gZWxzZQotICAgICAgICByZWN0cy5hcHBlbmQoSW50UmVjdCh0
eCwgdHksIHdpZHRoKCksIGhlaWdodCgpKSk7Ci19Ci0KLXZvaWQgUmVuZGVyQmxvY2s6OmFic29s
dXRlUXVhZHMoVmVjdG9yPEZsb2F0UXVhZD4mIHF1YWRzKQotewotICAgIC8vIEZvciBibG9ja3Mg
aW5zaWRlIGlubGluZXMsIHdlIGdvIGFoZWFkIGFuZCBpbmNsdWRlIG1hcmdpbnMgc28gdGhhdCB3
ZSBydW4gcmlnaHQgdXAgdG8gdGhlCi0gICAgLy8gaW5saW5lIGJveGVzIGFib3ZlIGFuZCBiZWxv
dyB1cyAodGh1cyBnZXR0aW5nIG1lcmdlZCB3aXRoIHRoZW0gdG8gZm9ybSBhIHNpbmdsZSBpcnJl
Z3VsYXIKLSAgICAvLyBzaGFwZSkuCi0gICAgaWYgKGlubGluZUNvbnRpbnVhdGlvbigpKSB7Ci0g
ICAgICAgIEZsb2F0UmVjdCBsb2NhbFJlY3QoMCwgLWNvbGxhcHNlZE1hcmdpblRvcCgpLAotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoKCksIGhlaWdodCgpICsgY29sbGFwc2VkTWFy
Z2luVG9wKCkgKyBjb2xsYXBzZWRNYXJnaW5Cb3R0b20oKSk7Ci0gICAgICAgIHF1YWRzLmFwcGVu
ZChsb2NhbFRvQWJzb2x1dGVRdWFkKGxvY2FsUmVjdCkpOwotICAgICAgICBpbmxpbmVDb250aW51
YXRpb24oKS0+YWJzb2x1dGVRdWFkcyhxdWFkcyk7Ci0gICAgfSBlbHNlCi0gICAgICAgIHF1YWRz
LmFwcGVuZChSZW5kZXJCb3g6OmxvY2FsVG9BYnNvbHV0ZVF1YWQoRmxvYXRSZWN0KDAsIDAsIHdp
ZHRoKCksIGhlaWdodCgpKSkpOwotfQotCi1JbnRSZWN0IFJlbmRlckJsb2NrOjpyZWN0V2l0aE91
dGxpbmVGb3JSZXBhaW50KFJlbmRlckJveE1vZGVsT2JqZWN0KiByZXBhaW50Q29udGFpbmVyLCBp
bnQgb3V0bGluZVdpZHRoKQotewotICAgIEludFJlY3QgcihSZW5kZXJCb3g6OnJlY3RXaXRoT3V0
bGluZUZvclJlcGFpbnQocmVwYWludENvbnRhaW5lciwgb3V0bGluZVdpZHRoKSk7Ci0gICAgaWYg
KGlubGluZUNvbnRpbnVhdGlvbigpKQotICAgICAgICByLmluZmxhdGVZKGNvbGxhcHNlZE1hcmdp
blRvcCgpKTsKLSAgICByZXR1cm4gcjsKLX0KLQotUmVuZGVyT2JqZWN0KiBSZW5kZXJCbG9jazo6
aG92ZXJBbmNlc3RvcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGlubGluZUNvbnRpbnVhdGlvbigp
ID8gaW5saW5lQ29udGludWF0aW9uKCkgOiBSZW5kZXJCb3g6OmhvdmVyQW5jZXN0b3IoKTsKLX0K
LQotdm9pZCBSZW5kZXJCbG9jazo6dXBkYXRlRHJhZ1N0YXRlKGJvb2wgZHJhZ09uKQotewotICAg
IFJlbmRlckJveDo6dXBkYXRlRHJhZ1N0YXRlKGRyYWdPbik7Ci0gICAgaWYgKGlubGluZUNvbnRp
bnVhdGlvbigpKQotICAgICAgICBpbmxpbmVDb250aW51YXRpb24oKS0+dXBkYXRlRHJhZ1N0YXRl
KGRyYWdPbik7Ci19Ci0KLVJlbmRlclN0eWxlKiBSZW5kZXJCbG9jazo6b3V0bGluZVN0eWxlRm9y
UmVwYWludCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGlubGluZUNvbnRpbnVhdGlvbigpID8gaW5s
aW5lQ29udGludWF0aW9uKCktPnN0eWxlKCkgOiBzdHlsZSgpOwotfQotCiB2b2lkIFJlbmRlckJs
b2NrOjpjaGlsZEJlY2FtZU5vbklubGluZShSZW5kZXJPYmplY3QqKQogewogICAgIG1ha2VDaGls
ZHJlbk5vbklubGluZSgpOwpAQCAtNDkzNywyNiArNDg1NCw2IEBAIHZvaWQgUmVuZGVyQmxvY2s6
OmNoaWxkQmVjYW1lTm9uSW5saW5lKFIKICAgICAvLyB8dGhpc3wgbWF5IGJlIGRlYWQgaGVyZQog
fQogCi12b2lkIFJlbmRlckJsb2NrOjp1cGRhdGVIaXRUZXN0UmVzdWx0KEhpdFRlc3RSZXN1bHQm
IHJlc3VsdCwgY29uc3QgSW50UG9pbnQmIHBvaW50KQotewotICAgIGlmIChyZXN1bHQuaW5uZXJO
b2RlKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIE5vZGUqIG4gPSBub2RlKCk7Ci0gICAgaWYg
KGlubGluZUNvbnRpbnVhdGlvbigpKQotICAgICAgICAvLyBXZSBhcmUgaW4gdGhlIG1hcmdpbnMg
b2YgYmxvY2sgZWxlbWVudHMgdGhhdCBhcmUgcGFydCBvZiBhIGNvbnRpbnVhdGlvbi4gIEluCi0g
ICAgICAgIC8vIHRoaXMgY2FzZSB3ZSdyZSBhY3R1YWxseSBzdGlsbCBpbnNpZGUgdGhlIGVuY2xv
c2luZyBpbmxpbmUgZWxlbWVudCB0aGF0IHdhcwotICAgICAgICAvLyBzcGxpdC4gIEdvIGFoZWFk
IGFuZCBzZXQgb3VyIGlubmVyIG5vZGUgYWNjb3JkaW5nbHkuCi0gICAgICAgIG4gPSBpbmxpbmVD
b250aW51YXRpb24oKS0+bm9kZSgpOwotCi0gICAgaWYgKG4pIHsKLSAgICAgICAgcmVzdWx0LnNl
dElubmVyTm9kZShuKTsKLSAgICAgICAgaWYgKCFyZXN1bHQuaW5uZXJOb25TaGFyZWROb2RlKCkp
Ci0gICAgICAgICAgICByZXN1bHQuc2V0SW5uZXJOb25TaGFyZWROb2RlKG4pOwotICAgICAgICBy
ZXN1bHQuc2V0TG9jYWxQb2ludChwb2ludCk7Ci0gICAgfQotfQotCiBJbnRSZWN0IFJlbmRlckJs
b2NrOjpsb2NhbENhcmV0UmVjdChJbmxpbmVCb3gqIGlubGluZUJveCwgaW50IGNhcmV0T2Zmc2V0
LCBpbnQqIGV4dHJhV2lkdGhUb0VuZE9mTGluZSkKIHsKICAgICAvLyBEbyB0aGUgbm9ybWFsIGNh
bGN1bGF0aW9uIGluIG1vc3QgY2FzZXMuCkBAIC01MDM3LDIxICs0OTM0LDE1IEBAIEludFJlY3Qg
UmVuZGVyQmxvY2s6OmxvY2FsQ2FyZXRSZWN0KElubGkKIAogdm9pZCBSZW5kZXJCbG9jazo6YWRk
Rm9jdXNSaW5nUmVjdHMoVmVjdG9yPEludFJlY3Q+JiByZWN0cywgaW50IHR4LCBpbnQgdHkpCiB7
Ci0gICAgLy8gRm9yIGJsb2NrcyBpbnNpZGUgaW5saW5lcywgd2UgZ28gYWhlYWQgYW5kIGluY2x1
ZGUgbWFyZ2lucyBzbyB0aGF0IHdlIHJ1biByaWdodCB1cCB0byB0aGUKLSAgICAvLyBpbmxpbmUg
Ym94ZXMgYWJvdmUgYW5kIGJlbG93IHVzICh0aHVzIGdldHRpbmcgbWVyZ2VkIHdpdGggdGhlbSB0
byBmb3JtIGEgc2luZ2xlIGlycmVndWxhcgotICAgIC8vIHNoYXBlKS4KLSAgICBpZiAoaW5saW5l
Q29udGludWF0aW9uKCkpIHsKLSAgICAgICAgLy8gRklYTUU6IFRoaXMgY2hlY2sgcmVhbGx5IGlz
bid0IGFjY3VyYXRlLiAKLSAgICAgICAgYm9vbCBuZXh0SW5saW5lSGFzTGluZUJveCA9IGlubGlu
ZUNvbnRpbnVhdGlvbigpLT5maXJzdExpbmVCb3goKTsKLSAgICAgICAgLy8gRklYTUU6IFRoaXMg
aXMgd3JvbmcuIFRoZSBwcmluY2lwYWwgcmVuZGVyZXIgbWF5IG5vdCBiZSB0aGUgY29udGludWF0
aW9uIHByZWNlZGluZyB0aGlzIGJsb2NrLgotICAgICAgICBib29sIHByZXZJbmxpbmVIYXNMaW5l
Qm94ID0gdG9SZW5kZXJJbmxpbmUoaW5saW5lQ29udGludWF0aW9uKCktPm5vZGUoKS0+cmVuZGVy
ZXIoKSktPmZpcnN0TGluZUJveCgpOyAKLSAgICAgICAgaW50IHRvcE1hcmdpbiA9IHByZXZJbmxp
bmVIYXNMaW5lQm94ID8gY29sbGFwc2VkTWFyZ2luVG9wKCkgOiAwOwotICAgICAgICBpbnQgYm90
dG9tTWFyZ2luID0gbmV4dElubGluZUhhc0xpbmVCb3ggPyBjb2xsYXBzZWRNYXJnaW5Cb3R0b20o
KSA6IDA7Ci0gICAgICAgIEludFJlY3QgcmVjdCh0eCwgdHkgLSB0b3BNYXJnaW4sIHdpZHRoKCks
IGhlaWdodCgpICsgdG9wTWFyZ2luICsgYm90dG9tTWFyZ2luKTsKLSAgICAgICAgaWYgKCFyZWN0
LmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJlY3RzLmFwcGVuZChyZWN0KTsKLSAgICB9IGVsc2Ug
aWYgKHdpZHRoKCkgJiYgaGVpZ2h0KCkpCi0gICAgICAgIHJlY3RzLmFwcGVuZChJbnRSZWN0KHR4
LCB0eSwgd2lkdGgoKSwgaGVpZ2h0KCkpKTsKKyAgICBpbnQgdG9wID0gdHk7CisgICAgaW50IGJv
dHRvbSA9IHRvcCArIGhlaWdodCgpOworICAgIGlmIChpc0Fub255bW91c0lubGluZUJsb2NrKCkp
IHsKKyAgICAgICAgdG9wID0gbWluKHRvcCwgdG9wIC0gY29sbGFwc2VkTWFyZ2luVG9wKCkpOwor
ICAgICAgICBib3R0b20gPSBtYXgoYm90dG9tLCBib3R0b20gKyBjb2xsYXBzZWRNYXJnaW5Cb3R0
b20oKSk7CisgICAgfQorICAgIEludFJlY3QgcmVzdWx0KHR4LCB0b3AsIHdpZHRoKCksIGJvdHRv
bSAtIHRvcCk7CisgICAgaWYgKCFyZXN1bHQuaXNFbXB0eSgpKQorICAgICAgICByZWN0cy5hcHBl
bmQocmVzdWx0KTsKIAogICAgIGlmICghaGFzT3ZlcmZsb3dDbGlwKCkgJiYgIWhhc0NvbnRyb2xD
bGlwKCkpIHsKICAgICAgICAgZm9yIChSb290SW5saW5lQm94KiBjdXJyID0gZmlyc3RSb290Qm94
KCk7IGN1cnI7IGN1cnIgPSBjdXJyLT5uZXh0Um9vdEJveCgpKSB7CkBAIC01MDc1LDExICs0OTY2
LDYgQEAgdm9pZCBSZW5kZXJCbG9jazo6YWRkRm9jdXNSaW5nUmVjdHMoVmVjdAogICAgICAgICAg
ICAgfQogICAgICAgICB9CiAgICAgfQotCi0gICAgaWYgKGlubGluZUNvbnRpbnVhdGlvbigpKQot
ICAgICAgICBpbmxpbmVDb250aW51YXRpb24oKS0+YWRkRm9jdXNSaW5nUmVjdHMocmVjdHMsIAot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHggLSB4KCkg
KyBpbmxpbmVDb250aW51YXRpb24oKS0+Y29udGFpbmluZ0Jsb2NrKCktPngoKSwKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5IC0geSgpICsgaW5saW5l
Q29udGludWF0aW9uKCktPmNvbnRhaW5pbmdCbG9jaygpLT55KCkpOwogfQogCiBSZW5kZXJCbG9j
ayogUmVuZGVyQmxvY2s6OmNyZWF0ZUFub255bW91c0Jsb2NrKGJvb2wgaXNGbGV4aWJsZUJveCkg
Y29uc3QKQEAgLTUxMTEsNiArNDk5Nyw4IEBAIGNvbnN0IGNoYXIqIFJlbmRlckJsb2NrOjpyZW5k
ZXJOYW1lKCkgY28KICAgICAgICAgcmV0dXJuICJSZW5kZXJCbG9jayAocG9zaXRpb25lZCkiOwog
ICAgIGlmIChpc0Fub255bW91c0Jsb2NrKCkpCiAgICAgICAgIHJldHVybiAiUmVuZGVyQmxvY2sg
KGFub255bW91cykiOworICAgIGVsc2UgaWYgKGlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkKKyAg
ICAgICAgcmV0dXJuICJSZW5kZXJCbG9jayAoYW5vbnltb3VzIGlubGluZS1ibG9jaykiOwogICAg
IGVsc2UgaWYgKGlzQW5vbnltb3VzKCkpCiAgICAgICAgIHJldHVybiAiUmVuZGVyQmxvY2sgKGdl
bmVyYXRlZCkiOwogICAgIGlmIChpc1JlbFBvc2l0aW9uZWQoKSkKSW5kZXg6IFdlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlckJsb2NrLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVu
ZGVyQmxvY2suaAkocmV2aXNpb24gNTQ1MDEpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJC
bG9jay5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMjksMTUgKzEyOSwxOCBAQCBwdWJsaWM6CiAKICAg
ICB2b2lkIGFkanVzdFJlY3RGb3JDb2x1bW5zKEludFJlY3QmKSBjb25zdDsKIAotICAgIHZvaWQg
YWRkQ29udGludWF0aW9uV2l0aE91dGxpbmUoUmVuZGVySW5saW5lKik7Ci0KLSAgICBSZW5kZXJJ
bmxpbmUqIGlubGluZUNvbnRpbnVhdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1faW5saW5lQ29udGlu
dWF0aW9uOyB9Ci0gICAgdm9pZCBzZXRJbmxpbmVDb250aW51YXRpb24oUmVuZGVySW5saW5lKiBj
KSB7IG1faW5saW5lQ29udGludWF0aW9uID0gYzsgfQotCiAgICAgLy8gVGhpcyBmdW5jdGlvbiBp
cyBhIGNvbnZlbmllbmNlIGhlbHBlciBmb3IgY3JlYXRpbmcgYW4gYW5vbnltb3VzIGJsb2NrIHRo
YXQgaW5oZXJpdHMgaXRzCiAgICAgLy8gc3R5bGUgZnJvbSB0aGlzIFJlbmRlckJsb2NrLgogICAg
IFJlbmRlckJsb2NrKiBjcmVhdGVBbm9ueW1vdXNCbG9jayhib29sIGlzRmxleGlibGVCb3ggPSBm
YWxzZSkgY29uc3Q7CiAKKyAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoUGFpbnRJbmZvJiwgaW50IHR4
LCBpbnQgdHkpOworICAgIHZpcnR1YWwgdm9pZCBwYWludE9iamVjdChQYWludEluZm8mLCBpbnQg
dHgsIGludCB0eSk7CisKKyAgICBib29sIGluUm9vdEJsb2NrQ29udGV4dCgpIGNvbnN0OworCisg
ICAgc3RhdGljIHZvaWQgYXBwZW5kUnVuc0Zvck9iamVjdChpbnQgc3RhcnQsIGludCBlbmQsIFJl
bmRlck9iamVjdCosIElubGluZUJpZGlSZXNvbHZlciYpOyAgICAKKyAgICBzdGF0aWMgYm9vbCBy
ZXF1aXJlc0xpbmVCb3goY29uc3QgSW5saW5lSXRlcmF0b3ImLCBib29sIGlzTGluZUVtcHR5ID0g
dHJ1ZSwgYm9vbCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHkgPSB0cnVlKTsKKwogcHJvdGVjdGVk
OgogICAgIHZvaWQgbW92ZUNoaWxkVG8oUmVuZGVyT2JqZWN0KiB0bywgUmVuZGVyT2JqZWN0Q2hp
bGRMaXN0KiB0b0NoaWxkTGlzdCwgUmVuZGVyT2JqZWN0KiBjaGlsZCk7CiAgICAgdm9pZCBtb3Zl
Q2hpbGRUbyhSZW5kZXJPYmplY3QqIHRvLCBSZW5kZXJPYmplY3RDaGlsZExpc3QqIHRvQ2hpbGRM
aXN0LCBSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkLCBSZW5kZXJPYmplY3QqIGNoaWxkKTsKQEAg
LTE2NSw5ICsxNjgsNiBAQCBwcm90ZWN0ZWQ6CiAKICAgICB2b2lkIGxheW91dFBvc2l0aW9uZWRP
YmplY3RzKGJvb2wgcmVsYXlvdXRDaGlsZHJlbik7CiAKLSAgICB2aXJ0dWFsIHZvaWQgcGFpbnQo
UGFpbnRJbmZvJiwgaW50IHR4LCBpbnQgdHkpOwotICAgIHZpcnR1YWwgdm9pZCBwYWludE9iamVj
dChQYWludEluZm8mLCBpbnQgdHgsIGludCB0eSk7Ci0KICAgICBpbnQgcmlnaHRSZWxPZmZzZXQo
aW50IHksIGludCBmaXhlZE9mZnNldCwgYm9vbCBhcHBseVRleHRJbmRlbnQgPSB0cnVlLCBpbnQq
IGhlaWdodFJlbWFpbmluZyA9IDApIGNvbnN0OwogICAgIGludCBsZWZ0UmVsT2Zmc2V0KGludCB5
LCBpbnQgZml4ZWRPZmZzZXQsIGJvb2wgYXBwbHlUZXh0SW5kZW50ID0gdHJ1ZSwgaW50KiBoZWln
aHRSZW1haW5pbmcgPSAwKSBjb25zdDsKIApAQCAtMTgwLDggKzE4MCw2IEBAIHByb3RlY3RlZDoK
IAogICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVGaXJzdExldHRlcigpOwogCi0gICAgdmlydHVhbCB2
b2lkIHVwZGF0ZUhpdFRlc3RSZXN1bHQoSGl0VGVzdFJlc3VsdCYsIGNvbnN0IEludFBvaW50Jik7
Ci0KICAgICAvLyBEZWxheSB1cGRhdGUgc2Nyb2xsYmFyIHVudGlsIGZpbmlzaERlbGF5UmVwYWlu
dCgpIHdpbGwgYmUKICAgICAvLyBjYWxsZWQuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB3aGVuIGEg
ZmxleGJveCBpcyBsYXlpbmcgb3V0IGl0cwogICAgIC8vIGRlc2NlbmRhbnQuIElmIG11bHRpcGxl
IGNhbGxzIGFyZSBtYWRlIHRvIHN0YXJ0RGVsYXlSZXBhaW50KCksCkBAIC0yNDUsNyArMjQzLDkg
QEAgcHJpdmF0ZToKICAgICAgICAgYm9vbCBldmVySGFkTGF5b3V0OwogICAgIH07CiAKLSAgICAv
LyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucycgaW1wbGVtZW50YXRpb25zIGFyZSBpbiBSZW5kZXJC
bG9ja0xpbmVMYXlvdXQuY3BwLgorICAgIGNsYXNzIE1hcmdpbkluZm87CisKKyAgICAvLyBUaGUg
Zm9sbG93aW5nIGZ1bmN0aW9ucycgaW1wbGVtZW50YXRpb25zIGFyZSBpbiBSZW5kZXJCbG9ja0xp
bmVMYXlvdXQuY3BwLiAgICAKICAgICB2b2lkIGJpZGlSZW9yZGVyTGluZShJbmxpbmVCaWRpUmVz
b2x2ZXImLCBjb25zdCBJbmxpbmVJdGVyYXRvciYgZW5kLCBib29sIHByZXZpb3VzTGluZUJyb2tl
Q2xlYW5seSk7CiAgICAgUm9vdElubGluZUJveCogZGV0ZXJtaW5lU3RhcnRQb3NpdGlvbihib29s
JiBmaXJzdExpbmUsIGJvb2wmIGZ1bGxMYXlvdXQsIGJvb2wmIHByZXZpb3VzTGluZUJyb2tlQ2xl
YW5seSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElubGluZUJp
ZGlSZXNvbHZlciYsIFZlY3RvcjxGbG9hdFdpdGhSZWN0PiYgZmxvYXRzLCB1bnNpZ25lZCYgbnVt
Q2xlYW5GbG9hdHMpOwpAQCAtMjU4LDcgKzI1OCw3IEBAIHByaXZhdGU6CiAgICAgdm9pZCBza2lw
VHJhaWxpbmdXaGl0ZXNwYWNlKElubGluZUl0ZXJhdG9yJiwgYm9vbCBpc0xpbmVFbXB0eSwgYm9v
bCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHkpOwogICAgIGludCBza2lwTGVhZGluZ1doaXRlc3Bh
Y2UoSW5saW5lQmlkaVJlc29sdmVyJiwgYm9vbCBmaXJzdExpbmUsIGJvb2wgaXNMaW5lRW1wdHks
IGJvb2wgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KTsKICAgICB2b2lkIGZpdEJlbG93RmxvYXRz
KGludCB3aWR0aFRvRml0LCBib29sIGZpcnN0TGluZSwgaW50JiBhdmFpbGFibGVXaWR0aCk7Ci0g
ICAgSW5saW5lSXRlcmF0b3IgZmluZE5leHRMaW5lQnJlYWsoSW5saW5lQmlkaVJlc29sdmVyJiwg
Ym9vbCBmaXJzdExpbmUsIGJvb2wmIGlzTGluZUVtcHR5LCBib29sJiBwcmV2aW91c0xpbmVCcm9r
ZUNsZWFubHksIEVDbGVhciogY2xlYXIgPSAwKTsKKyAgICBJbmxpbmVJdGVyYXRvciBmaW5kTmV4
dExpbmVCcmVhayhJbmxpbmVCaWRpUmVzb2x2ZXImLCBib29sIGZpcnN0TGluZSwgYm9vbCYgaXNM
aW5lRW1wdHksIGJvb2wmIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSwgTWFyZ2luSW5mbyYsIEVD
bGVhciogY2xlYXIgPSAwKTsKICAgICBSb290SW5saW5lQm94KiBjb25zdHJ1Y3RMaW5lKHVuc2ln
bmVkIHJ1bkNvdW50LCBCaWRpUnVuKiBmaXJzdFJ1biwgQmlkaVJ1biogbGFzdFJ1biwgYm9vbCBm
aXJzdExpbmUsIGJvb2wgbGFzdExpbmUsIFJlbmRlck9iamVjdCogZW5kT2JqZWN0KTsKICAgICBJ
bmxpbmVGbG93Qm94KiBjcmVhdGVMaW5lQm94ZXMoUmVuZGVyT2JqZWN0KiwgYm9vbCBmaXJzdExp
bmUpOwogICAgIHZvaWQgY29tcHV0ZUhvcml6b250YWxQb3NpdGlvbnNGb3JMaW5lKFJvb3RJbmxp
bmVCb3gqLCBib29sIGZpcnN0TGluZSwgQmlkaVJ1biogZmlyc3RSdW4sIEJpZGlSdW4qIHRyYWls
aW5nU3BhY2VSdW4sIGJvb2wgcmVhY2hlZEVuZCk7CkBAIC0zMTMsMTMgKzMxMyw3IEBAIHByaXZh
dGU6CiAgICAgLy8gT2J0YWlucyB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgYmxvY2sgKGluY2x1ZGlu
ZyB0aGlzIGJsb2NrKSB0aGF0IGNvbnRyaWJ1dGVzIGEgZmlyc3QtbGluZSBzdHlsZSB0byBvdXIg
aW5saW5lCiAgICAgLy8gY2hpbGRyZW4uCiAgICAgdmlydHVhbCBSZW5kZXJCbG9jayogZmlyc3RM
aW5lQmxvY2soKSBjb25zdDsKLSAgICBib29sIGluUm9vdEJsb2NrQ29udGV4dCgpIGNvbnN0Owot
Ci0gICAgdmlydHVhbCBJbnRSZWN0IHJlY3RXaXRoT3V0bGluZUZvclJlcGFpbnQoUmVuZGVyQm94
TW9kZWxPYmplY3QqIHJlcGFpbnRDb250YWluZXIsIGludCBvdXRsaW5lV2lkdGgpOwotICAgIHZp
cnR1YWwgUmVuZGVyU3R5bGUqIG91dGxpbmVTdHlsZUZvclJlcGFpbnQoKSBjb25zdDsKICAgICAK
LSAgICB2aXJ0dWFsIFJlbmRlck9iamVjdCogaG92ZXJBbmNlc3RvcigpIGNvbnN0OwotICAgIHZp
cnR1YWwgdm9pZCB1cGRhdGVEcmFnU3RhdGUoYm9vbCBkcmFnT24pOwogICAgIHZpcnR1YWwgdm9p
ZCBjaGlsZEJlY2FtZU5vbklubGluZShSZW5kZXJPYmplY3QqIGNoaWxkKTsKIAogICAgIHZpcnR1
YWwgSW50UmVjdCBzZWxlY3Rpb25SZWN0Rm9yUmVwYWludChSZW5kZXJCb3hNb2RlbE9iamVjdCog
cmVwYWludENvbnRhaW5lciwgYm9vbCAvKmNsaXBUb1Zpc2libGVDb250ZW50Ki8pCkBAIC0zMzks
MTYgKzMzMywxMSBAQCBwcml2YXRlOgogICAgIGludCBsZWZ0U2VsZWN0aW9uT2Zmc2V0KFJlbmRl
ckJsb2NrKiByb290QmxvY2ssIGludCB5KTsKICAgICBpbnQgcmlnaHRTZWxlY3Rpb25PZmZzZXQo
UmVuZGVyQmxvY2sqIHJvb3RCbG9jaywgaW50IHkpOwogCi0gICAgdmlydHVhbCB2b2lkIGFic29s
dXRlUmVjdHMoVmVjdG9yPEludFJlY3Q+JiwgaW50IHR4LCBpbnQgdHkpOwotICAgIHZpcnR1YWwg
dm9pZCBhYnNvbHV0ZVF1YWRzKFZlY3RvcjxGbG9hdFF1YWQ+Jik7Ci0KICAgICBpbnQgZGVzaXJl
ZENvbHVtbldpZHRoKCkgY29uc3Q7CiAgICAgdW5zaWduZWQgZGVzaXJlZENvbHVtbkNvdW50KCkg
Y29uc3Q7CiAgICAgVmVjdG9yPEludFJlY3Q+KiBjb2x1bW5SZWN0cygpIGNvbnN0OwogICAgIHZv
aWQgc2V0RGVzaXJlZENvbHVtbkNvdW50QW5kV2lkdGgoaW50IGNvdW50LCBpbnQgd2lkdGgpOwog
ICAgIGludCBjb2x1bW5HYXAoKSBjb25zdDsKLSAgICAKLSAgICB2b2lkIHBhaW50Q29udGludWF0
aW9uT3V0bGluZXMoUGFpbnRJbmZvJiwgaW50IHR4LCBpbnQgdHkpOwogCiAgICAgdmlydHVhbCBJ
bnRSZWN0IGxvY2FsQ2FyZXRSZWN0KElubGluZUJveCosIGludCBjYXJldE9mZnNldCwgaW50KiBl
eHRyYVdpZHRoVG9FbmRPZkxpbmUgPSAwKTsKIApAQCAtNDg0LDEyICs0NzMsNiBAQCBwcml2YXRl
OgogICAgIERlcHJlY2F0ZWRQdHJMaXN0PEZsb2F0aW5nT2JqZWN0PiogbV9mbG9hdGluZ09iamVj
dHM7CiAgICAgTGlzdEhhc2hTZXQ8UmVuZGVyQm94Kj4qIG1fcG9zaXRpb25lZE9iamVjdHM7CiAK
LSAgICAvLyBBbiBpbmxpbmUgY2FuIGJlIHNwbGl0IHdpdGggYmxvY2tzIG9jY3VycmluZyBpbiBi
ZXR3ZWVuIHRoZSBpbmxpbmUgY29udGVudC4KLSAgICAvLyBXaGVuIHRoaXMgb2NjdXJzIHdlIG5l
ZWQgYSBwb2ludGVyIHRvIG91ciBuZXh0IG9iamVjdC4gIFdlIGNhbiBiYXNpY2FsbHkgYmUKLSAg
ICAvLyBzcGxpdCBpbnRvIGEgc2VxdWVuY2Ugb2YgaW5saW5lcyBhbmQgYmxvY2tzLiAgVGhlIGNv
bnRpbnVhdGlvbiB3aWxsIGVpdGhlciBiZQotICAgIC8vIGFuIGFub255bW91cyBibG9jayAodGhh
dCBob3VzZXMgb3RoZXIgYmxvY2tzKSBvciBpdCB3aWxsIGJlIGFuIGlubGluZSBmbG93LgotICAg
IFJlbmRlcklubGluZSogbV9pbmxpbmVDb250aW51YXRpb247Ci0KICAgICAvLyBBbGxvY2F0ZWQg
b25seSB3aGVuIHNvbWUgb2YgdGhlc2UgZmllbGRzIGhhdmUgbm9uLWRlZmF1bHQgdmFsdWVzCiAg
ICAgc3RydWN0IE1heE1hcmdpbiA6IE5vbmNvcHlhYmxlIHsKICAgICAgICAgTWF4TWFyZ2luKGNv
bnN0IFJlbmRlckJsb2NrKiBvKSAKQEAgLTUxNyw3ICs1MDAsNyBAQCBwcml2YXRlOgogICAgIFJl
bmRlckxpbmVCb3hMaXN0IG1fbGluZUJveGVzOyAgIC8vIEFsbCBvZiB0aGUgcm9vdCBsaW5lIGJv
eGVzIGNyZWF0ZWQgZm9yIHRoaXMgYmxvY2sgZmxvdy4gIEZvciBleGFtcGxlLCA8ZGl2PkhlbGxv
PGJyPndvcmxkLjwvZGl2PiB3aWxsIGhhdmUgdHdvIHRvdGFsIGxpbmVzIGZvciB0aGUgPGRpdj4u
CiAKICAgICBtdXRhYmxlIGludCBtX2xpbmVIZWlnaHQ7Ci0gICAgCisKICAgICAvLyBSZW5kZXJS
dWJ5QmFzZSBvYmplY3RzIG5lZWQgdG8gYmUgYWJsZSB0byBzcGxpdCBhbmQgbWVyZ2UsIG1vdmlu
ZyB0aGVpciBjaGlsZHJlbiBhcm91bmQKICAgICAvLyAoY2FsbGluZyBtb3ZlQ2hpbGRUbywgbW92
ZUFsbENoaWxkcmVuVG8sIGFuZCBtYWtlQ2hpbGRyZW5Ob25JbmxpbmUpLgogICAgIGZyaWVuZCBj
bGFzcyBSZW5kZXJSdWJ5QmFzZTsKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2Nr
TGluZUxheW91dC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxv
Y2tMaW5lTGF5b3V0LmNwcAkocmV2aXNpb24gNTQ1MDEpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9S
ZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNCw2ICsyNCw3IEBA
CiAKICNpbmNsdWRlICJCaWRpUmVzb2x2ZXIuaCIKICNpbmNsdWRlICJDaGFyYWN0ZXJOYW1lcy5o
IgorI2luY2x1ZGUgIklubGluZUl0ZXJhdG9yLmgiCiAjaW5jbHVkZSAiSW5saW5lVGV4dEJveC5o
IgogI2luY2x1ZGUgIkxvZ2dpbmcuaCIKICNpbmNsdWRlICJSZW5kZXJBcmVuYS5oIgpAQCAtNDYs
MzYgKzQ3LDYgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogLy8gV2UgZG9uJ3QgbGV0IG91ciBsaW5l
IGJveCB0cmVlIGZvciBhIHNpbmdsZSBsaW5lIGdldCBhbnkgZGVlcGVyIHRoYW4gdGhpcy4KIGNv
bnN0IHVuc2lnbmVkIGNNYXhMaW5lRGVwdGggPSAyMDA7CiAKLWNsYXNzIElubGluZUl0ZXJhdG9y
IHsKLXB1YmxpYzoKLSAgICBJbmxpbmVJdGVyYXRvcigpCi0gICAgICAgIDogYmxvY2soMCkKLSAg
ICAgICAgLCBvYmooMCkKLSAgICAgICAgLCBwb3MoMCkKLSAgICAgICAgLCBuZXh0QnJlYWthYmxl
UG9zaXRpb24oLTEpCi0gICAgewotICAgIH0KLQotICAgIElubGluZUl0ZXJhdG9yKFJlbmRlckJs
b2NrKiBiLCBSZW5kZXJPYmplY3QqIG8sIHVuc2lnbmVkIHApCi0gICAgICAgIDogYmxvY2soYikK
LSAgICAgICAgLCBvYmoobykKLSAgICAgICAgLCBwb3MocCkKLSAgICAgICAgLCBuZXh0QnJlYWth
YmxlUG9zaXRpb24oLTEpCi0gICAgewotICAgIH0KLQotICAgIHZvaWQgaW5jcmVtZW50KElubGlu
ZUJpZGlSZXNvbHZlciogcmVzb2x2ZXIgPSAwKTsKLSAgICBib29sIGF0RW5kKCkgY29uc3Q7Ci0K
LSAgICBVQ2hhciBjdXJyZW50KCkgY29uc3Q7Ci0gICAgRGlyZWN0aW9uIGRpcmVjdGlvbigpIGNv
bnN0OwotCi0gICAgUmVuZGVyQmxvY2sqIGJsb2NrOwotICAgIFJlbmRlck9iamVjdCogb2JqOwot
ICAgIHVuc2lnbmVkIHBvczsKLSAgICBpbnQgbmV4dEJyZWFrYWJsZVBvc2l0aW9uOwotfTsKLQog
c3RhdGljIGludCBnZXRCb3JkZXJQYWRkaW5nTWFyZ2luKFJlbmRlckJveE1vZGVsT2JqZWN0KiBj
aGlsZCwgYm9vbCBlbmRPZklubGluZSkKIHsKICAgICBib29sIGxlZnRTaWRlID0gKGNoaWxkLT5z
dHlsZSgpLT5kaXJlY3Rpb24oKSA9PSBMVFIpID8gIWVuZE9mSW5saW5lIDogZW5kT2ZJbmxpbmU7
CkBAIC0xMDAsMjQ3ICs3MSw2IEBAIHN0YXRpYyBpbnQgaW5saW5lV2lkdGgoUmVuZGVyT2JqZWN0
KiBjaGkKICAgICByZXR1cm4gZXh0cmFXaWR0aDsKIH0KIAotc3RydWN0IEJpZGlSdW4gOiBCaWRp
Q2hhcmFjdGVyUnVuIHsKLSAgICBCaWRpUnVuKGludCBzdGFydCwgaW50IHN0b3AsIFJlbmRlck9i
amVjdCogb2JqZWN0LCBCaWRpQ29udGV4dCogY29udGV4dCwgRGlyZWN0aW9uIGRpcikKLSAgICAg
ICAgOiBCaWRpQ2hhcmFjdGVyUnVuKHN0YXJ0LCBzdG9wLCBjb250ZXh0LCBkaXIpCi0gICAgICAg
ICwgbV9vYmplY3Qob2JqZWN0KQotICAgICAgICAsIG1fYm94KDApCi0gICAgewotICAgIH0KLQot
ICAgIHZvaWQgZGVzdHJveSgpOwotCi0gICAgLy8gT3ZlcmxvYWRlZCBuZXcgb3BlcmF0b3IuCi0g
ICAgdm9pZCogb3BlcmF0b3IgbmV3KHNpemVfdCwgUmVuZGVyQXJlbmEqKSB0aHJvdygpOwotCi0g
ICAgLy8gT3ZlcnJpZGRlbiB0byBwcmV2ZW50IHRoZSBub3JtYWwgZGVsZXRlIGZyb20gYmVpbmcg
Y2FsbGVkLgotICAgIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQqLCBzaXplX3QpOwotCi0gICAg
QmlkaVJ1biogbmV4dCgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PEJpZGlSdW4qPihtX25leHQpOyB9
Ci0KLXByaXZhdGU6Ci0gICAgLy8gVGhlIG5vcm1hbCBvcGVyYXRvciBuZXcgaXMgZGlzYWxsb3dl
ZC4KLSAgICB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90KSB0aHJvdygpOwotCi1wdWJsaWM6Ci0g
ICAgUmVuZGVyT2JqZWN0KiBtX29iamVjdDsKLSAgICBJbmxpbmVCb3gqIG1fYm94OwotfTsKLQot
I2lmbmRlZiBOREVCVUcKLXN0YXRpYyBSZWZDb3VudGVkTGVha0NvdW50ZXIgYmlkaVJ1bkNvdW50
ZXIoIkJpZGlSdW4iKTsKLQotc3RhdGljIGJvb2wgaW5CaWRpUnVuRGVzdHJveTsKLSNlbmRpZgot
Ci12b2lkIEJpZGlSdW46OmRlc3Ryb3koKQotewotI2lmbmRlZiBOREVCVUcKLSAgICBpbkJpZGlS
dW5EZXN0cm95ID0gdHJ1ZTsKLSNlbmRpZgotICAgIFJlbmRlckFyZW5hKiByZW5kZXJBcmVuYSA9
IG1fb2JqZWN0LT5yZW5kZXJBcmVuYSgpOwotICAgIGRlbGV0ZSB0aGlzOwotI2lmbmRlZiBOREVC
VUcKLSAgICBpbkJpZGlSdW5EZXN0cm95ID0gZmFsc2U7Ci0jZW5kaWYKLQotICAgIC8vIFJlY292
ZXIgdGhlIHNpemUgbGVmdCB0aGVyZSBmb3IgdXMgYnkgb3BlcmF0b3IgZGVsZXRlIGFuZCBmcmVl
IHRoZSBtZW1vcnkuCi0gICAgcmVuZGVyQXJlbmEtPmZyZWUoKnJlaW50ZXJwcmV0X2Nhc3Q8c2l6
ZV90Kj4odGhpcyksIHRoaXMpOwotfQotCi12b2lkKiBCaWRpUnVuOjpvcGVyYXRvciBuZXcoc2l6
ZV90IHN6LCBSZW5kZXJBcmVuYSogcmVuZGVyQXJlbmEpIHRocm93KCkKLXsKLSNpZm5kZWYgTkRF
QlVHCi0gICAgYmlkaVJ1bkNvdW50ZXIuaW5jcmVtZW50KCk7Ci0jZW5kaWYKLSAgICByZXR1cm4g
cmVuZGVyQXJlbmEtPmFsbG9jYXRlKHN6KTsKLX0KLQotdm9pZCBCaWRpUnVuOjpvcGVyYXRvciBk
ZWxldGUodm9pZCogcHRyLCBzaXplX3Qgc3opCi17Ci0jaWZuZGVmIE5ERUJVRwotICAgIGJpZGlS
dW5Db3VudGVyLmRlY3JlbWVudCgpOwotI2VuZGlmCi0gICAgQVNTRVJUKGluQmlkaVJ1bkRlc3Ry
b3kpOwotCi0gICAgLy8gU3Rhc2ggc2l6ZSB3aGVyZSBkZXN0cm95KCkgY2FuIGZpbmQgaXQuCi0g
ICAgKihzaXplX3QqKXB0ciA9IHN6OwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaW5saW5lIGJv
b2wgb3BlcmF0b3I9PShjb25zdCBJbmxpbmVJdGVyYXRvciYgaXQxLCBjb25zdCBJbmxpbmVJdGVy
YXRvciYgaXQyKQotewotICAgIHJldHVybiBpdDEucG9zID09IGl0Mi5wb3MgJiYgaXQxLm9iaiA9
PSBpdDIub2JqOwotfQotCi1pbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IElubGluZUl0ZXJh
dG9yJiBpdDEsIGNvbnN0IElubGluZUl0ZXJhdG9yJiBpdDIpCi17Ci0gICAgcmV0dXJuIGl0MS5w
b3MgIT0gaXQyLnBvcyB8fCBpdDEub2JqICE9IGl0Mi5vYmo7Ci19Ci0KLXN0YXRpYyBpbmxpbmUg
UmVuZGVyT2JqZWN0KiBiaWRpTmV4dChSZW5kZXJCbG9jayogYmxvY2ssIFJlbmRlck9iamVjdCog
Y3VycmVudCwgSW5saW5lQmlkaVJlc29sdmVyKiByZXNvbHZlciA9IDAsIGJvb2wgc2tpcElubGlu
ZXMgPSB0cnVlLCBib29sKiBlbmRPZklubGluZVB0ciA9IDApCi17Ci0gICAgUmVuZGVyT2JqZWN0
KiBuZXh0ID0gMDsKLSAgICBib29sIG9sZEVuZE9mSW5saW5lID0gZW5kT2ZJbmxpbmVQdHIgPyAq
ZW5kT2ZJbmxpbmVQdHIgOiBmYWxzZTsKLSAgICBib29sIGVuZE9mSW5saW5lID0gZmFsc2U7Ci0K
LSAgICB3aGlsZSAoY3VycmVudCkgewotICAgICAgICBuZXh0ID0gMDsKLSAgICAgICAgaWYgKCFv
bGRFbmRPZklubGluZSAmJiAhY3VycmVudC0+aXNGbG9hdGluZygpICYmICFjdXJyZW50LT5pc1Jl
cGxhY2VkKCkgJiYgIWN1cnJlbnQtPmlzUG9zaXRpb25lZCgpICYmICFjdXJyZW50LT5pc1RleHQo
KSkgewotICAgICAgICAgICAgbmV4dCA9IGN1cnJlbnQtPmZpcnN0Q2hpbGQoKTsKLSAgICAgICAg
ICAgIGlmIChuZXh0ICYmIHJlc29sdmVyICYmIG5leHQtPmlzUmVuZGVySW5saW5lKCkpIHsKLSAg
ICAgICAgICAgICAgICBFVW5pY29kZUJpZGkgdWIgPSBuZXh0LT5zdHlsZSgpLT51bmljb2RlQmlk
aSgpOwotICAgICAgICAgICAgICAgIGlmICh1YiAhPSBVQk5vcm1hbCkgewotICAgICAgICAgICAg
ICAgICAgICBUZXh0RGlyZWN0aW9uIGRpciA9IG5leHQtPnN0eWxlKCktPmRpcmVjdGlvbigpOwot
ICAgICAgICAgICAgICAgICAgICBEaXJlY3Rpb24gZCA9ICh1YiA9PSBFbWJlZAotICAgICAgICAg
ICAgICAgICAgICAgICAgPyAoZGlyID09IFJUTCA/IFJpZ2h0VG9MZWZ0RW1iZWRkaW5nIDogTGVm
dFRvUmlnaHRFbWJlZGRpbmcpCi0gICAgICAgICAgICAgICAgICAgICAgICA6IChkaXIgPT0gUlRM
ID8gUmlnaHRUb0xlZnRPdmVycmlkZSA6IExlZnRUb1JpZ2h0T3ZlcnJpZGUpKTsKLSAgICAgICAg
ICAgICAgICAgICAgcmVzb2x2ZXItPmVtYmVkKGQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbmV4dCkgewotICAgICAgICAgICAg
aWYgKCFza2lwSW5saW5lcyAmJiAhb2xkRW5kT2ZJbmxpbmUgJiYgY3VycmVudC0+aXNSZW5kZXJJ
bmxpbmUoKSkgewotICAgICAgICAgICAgICAgIG5leHQgPSBjdXJyZW50OwotICAgICAgICAgICAg
ICAgIGVuZE9mSW5saW5lID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAg
ICAgIH0KLQotICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudCAhPSBibG9jaykg
ewotICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlciAmJiBjdXJyZW50LT5pc1JlbmRlcklubGlu
ZSgpICYmIGN1cnJlbnQtPnN0eWxlKCktPnVuaWNvZGVCaWRpKCkgIT0gVUJOb3JtYWwpCi0gICAg
ICAgICAgICAgICAgICAgIHJlc29sdmVyLT5lbWJlZChQb3BEaXJlY3Rpb25hbEZvcm1hdCk7Ci0K
LSAgICAgICAgICAgICAgICBuZXh0ID0gY3VycmVudC0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAg
ICAgICAgICBpZiAobmV4dCkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZXIgJiYg
bmV4dC0+aXNSZW5kZXJJbmxpbmUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgRVVuaWNv
ZGVCaWRpIHViID0gbmV4dC0+c3R5bGUoKS0+dW5pY29kZUJpZGkoKTsKLSAgICAgICAgICAgICAg
ICAgICAgICAgIGlmICh1YiAhPSBVQk5vcm1hbCkgewotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIFRleHREaXJlY3Rpb24gZGlyID0gbmV4dC0+c3R5bGUoKS0+ZGlyZWN0aW9uKCk7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0aW9uIGQgPSAodWIgPT0gRW1iZWQKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoZGlyID09IFJUTCA/IFJpZ2h0VG9MZWZ0RW1i
ZWRkaW5nOiBMZWZ0VG9SaWdodEVtYmVkZGluZykKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgOiAoZGlyID09IFJUTCA/IFJpZ2h0VG9MZWZ0T3ZlcnJpZGUgOiBMZWZ0VG9SaWdodE92
ZXJyaWRlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXItPmVtYmVkKGQp
OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAg
ICAKLSAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC0+cGFyZW50KCk7Ci0gICAgICAg
ICAgICAgICAgaWYgKCFza2lwSW5saW5lcyAmJiBjdXJyZW50ICYmIGN1cnJlbnQgIT0gYmxvY2sg
JiYgY3VycmVudC0+aXNSZW5kZXJJbmxpbmUoKSkgewotICAgICAgICAgICAgICAgICAgICBuZXh0
ID0gY3VycmVudDsKLSAgICAgICAgICAgICAgICAgICAgZW5kT2ZJbmxpbmUgPSB0cnVlOwotICAg
ICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIW5leHQpCi0gICAgICAgICAgICBicmVhazsKLQot
ICAgICAgICBpZiAobmV4dC0+aXNUZXh0KCkgfHwgbmV4dC0+aXNGbG9hdGluZygpIHx8IG5leHQt
PmlzUmVwbGFjZWQoKSB8fCBuZXh0LT5pc1Bvc2l0aW9uZWQoKQotICAgICAgICAgICAgfHwgKCgh
c2tpcElubGluZXMgfHwgIW5leHQtPmZpcnN0Q2hpbGQoKSkgLy8gQWx3YXlzIHJldHVybiBFTVBU
WSBpbmxpbmVzLgotICAgICAgICAgICAgICAgICYmIG5leHQtPmlzUmVuZGVySW5saW5lKCkpKQot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGN1cnJlbnQgPSBuZXh0OwotICAgIH0KLQotICAg
IGlmIChlbmRPZklubGluZVB0cikKLSAgICAgICAgKmVuZE9mSW5saW5lUHRyID0gZW5kT2ZJbmxp
bmU7Ci0KLSAgICByZXR1cm4gbmV4dDsKLX0KLQotc3RhdGljIFJlbmRlck9iamVjdCogYmlkaUZp
cnN0KFJlbmRlckJsb2NrKiBibG9jaywgSW5saW5lQmlkaVJlc29sdmVyKiByZXNvbHZlciwgYm9v
bCBza2lwSW5saW5lcyA9IHRydWUpCi17Ci0gICAgaWYgKCFibG9jay0+Zmlyc3RDaGlsZCgpKQot
ICAgICAgICByZXR1cm4gMDsKLSAgICAKLSAgICBSZW5kZXJPYmplY3QqIG8gPSBibG9jay0+Zmly
c3RDaGlsZCgpOwotICAgIGlmIChvLT5pc1JlbmRlcklubGluZSgpKSB7Ci0gICAgICAgIGlmIChy
ZXNvbHZlcikgewotICAgICAgICAgICAgRVVuaWNvZGVCaWRpIHViID0gby0+c3R5bGUoKS0+dW5p
Y29kZUJpZGkoKTsKLSAgICAgICAgICAgIGlmICh1YiAhPSBVQk5vcm1hbCkgewotICAgICAgICAg
ICAgICAgIFRleHREaXJlY3Rpb24gZGlyID0gby0+c3R5bGUoKS0+ZGlyZWN0aW9uKCk7Ci0gICAg
ICAgICAgICAgICAgRGlyZWN0aW9uIGQgPSAodWIgPT0gRW1iZWQKLSAgICAgICAgICAgICAgICAg
ICAgPyAoZGlyID09IFJUTCA/IFJpZ2h0VG9MZWZ0RW1iZWRkaW5nIDogTGVmdFRvUmlnaHRFbWJl
ZGRpbmcpCi0gICAgICAgICAgICAgICAgICAgIDogKGRpciA9PSBSVEwgPyBSaWdodFRvTGVmdE92
ZXJyaWRlIDogTGVmdFRvUmlnaHRPdmVycmlkZSkpOwotICAgICAgICAgICAgICAgIHJlc29sdmVy
LT5lbWJlZChkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoc2tpcElu
bGluZXMgJiYgby0+Zmlyc3RDaGlsZCgpKQotICAgICAgICAgICAgbyA9IGJpZGlOZXh0KGJsb2Nr
LCBvLCByZXNvbHZlciwgc2tpcElubGluZXMpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAg
IC8vIE5ldmVyIHNraXAgZW1wdHkgaW5saW5lcy4KLSAgICAgICAgICAgIGlmIChyZXNvbHZlcikK
LSAgICAgICAgICAgICAgICByZXNvbHZlci0+Y29tbWl0RXhwbGljaXRFbWJlZGRpbmcoKTsKLSAg
ICAgICAgICAgIHJldHVybiBvOyAKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChvICYmICFv
LT5pc1RleHQoKSAmJiAhby0+aXNSZXBsYWNlZCgpICYmICFvLT5pc0Zsb2F0aW5nKCkgJiYgIW8t
PmlzUG9zaXRpb25lZCgpKQotICAgICAgICBvID0gYmlkaU5leHQoYmxvY2ssIG8sIHJlc29sdmVy
LCBza2lwSW5saW5lcyk7Ci0KLSAgICBpZiAocmVzb2x2ZXIpCi0gICAgICAgIHJlc29sdmVyLT5j
b21taXRFeHBsaWNpdEVtYmVkZGluZygpOwotICAgIHJldHVybiBvOwotfQotCi1pbmxpbmUgdm9p
ZCBJbmxpbmVJdGVyYXRvcjo6aW5jcmVtZW50KElubGluZUJpZGlSZXNvbHZlciogcmVzb2x2ZXIp
Ci17Ci0gICAgaWYgKCFvYmopCi0gICAgICAgIHJldHVybjsKLSAgICBpZiAob2JqLT5pc1RleHQo
KSkgewotICAgICAgICBwb3MrKzsKLSAgICAgICAgaWYgKHBvcyA+PSB0b1JlbmRlclRleHQob2Jq
KS0+dGV4dExlbmd0aCgpKSB7Ci0gICAgICAgICAgICBvYmogPSBiaWRpTmV4dChibG9jaywgb2Jq
LCByZXNvbHZlcik7Ci0gICAgICAgICAgICBwb3MgPSAwOwotICAgICAgICAgICAgbmV4dEJyZWFr
YWJsZVBvc2l0aW9uID0gLTE7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBvYmog
PSBiaWRpTmV4dChibG9jaywgb2JqLCByZXNvbHZlcik7Ci0gICAgICAgIHBvcyA9IDA7Ci0gICAg
ICAgIG5leHRCcmVha2FibGVQb3NpdGlvbiA9IC0xOwotICAgIH0KLX0KLQotdGVtcGxhdGU8Pgot
aW5saW5lIHZvaWQgSW5saW5lQmlkaVJlc29sdmVyOjppbmNyZW1lbnQoKQotewotICAgIGN1cnJl
bnQuaW5jcmVtZW50KHRoaXMpOwotfQotCi1pbmxpbmUgYm9vbCBJbmxpbmVJdGVyYXRvcjo6YXRF
bmQoKSBjb25zdAotewotICAgIHJldHVybiAhb2JqOwotfQotCi1pbmxpbmUgVUNoYXIgSW5saW5l
SXRlcmF0b3I6OmN1cnJlbnQoKSBjb25zdAotewotICAgIGlmICghb2JqIHx8ICFvYmotPmlzVGV4
dCgpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIFJlbmRlclRleHQqIHRleHQgPSB0b1JlbmRl
clRleHQob2JqKTsKLSAgICBpZiAocG9zID49IHRleHQtPnRleHRMZW5ndGgoKSkKLSAgICAgICAg
cmV0dXJuIDA7Ci0KLSAgICByZXR1cm4gdGV4dC0+Y2hhcmFjdGVycygpW3Bvc107Ci19Ci0KLUFM
V0FZU19JTkxJTkUgRGlyZWN0aW9uIElubGluZUl0ZXJhdG9yOjpkaXJlY3Rpb24oKSBjb25zdAot
ewotICAgIGlmIChVQ2hhciBjID0gY3VycmVudCgpKQotICAgICAgICByZXR1cm4gVW5pY29kZTo6
ZGlyZWN0aW9uKGMpOwotCi0gICAgaWYgKG9iaiAmJiBvYmotPmlzTGlzdE1hcmtlcigpKQotICAg
ICAgICByZXR1cm4gb2JqLT5zdHlsZSgpLT5kaXJlY3Rpb24oKSA9PSBMVFIgPyBMZWZ0VG9SaWdo
dCA6IFJpZ2h0VG9MZWZ0OwotCi0gICAgcmV0dXJuIE90aGVyTmV1dHJhbDsKLX0KLQotLy8gLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCiBzdGF0aWMgdm9pZCBjaG9w
TWlkcG9pbnRzQXQoTGluZU1pZHBvaW50U3RhdGUmIGxpbmVNaWRwb2ludFN0YXRlLCBSZW5kZXJP
YmplY3QqIG9iaiwgdW5zaWduZWQgcG9zKQogewogICAgIGlmICghbGluZU1pZHBvaW50U3RhdGUu
bnVtTWlkcG9pbnRzKQpAQCAtMzk4LDcgKzEyOCw3IEBAIHN0YXRpYyB2b2lkIGFkZE1pZHBvaW50
KExpbmVNaWRwb2ludFN0YXQKICAgICBtaWRwb2ludHNbbGluZU1pZHBvaW50U3RhdGUubnVtTWlk
cG9pbnRzKytdID0gbWlkcG9pbnQ7CiB9CiAKLXN0YXRpYyB2b2lkIGFwcGVuZFJ1bnNGb3JPYmpl
Y3QoaW50IHN0YXJ0LCBpbnQgZW5kLCBSZW5kZXJPYmplY3QqIG9iaiwgSW5saW5lQmlkaVJlc29s
dmVyJiByZXNvbHZlcikKK3ZvaWQgUmVuZGVyQmxvY2s6OmFwcGVuZFJ1bnNGb3JPYmplY3QoaW50
IHN0YXJ0LCBpbnQgZW5kLCBSZW5kZXJPYmplY3QqIG9iaiwgSW5saW5lQmlkaVJlc29sdmVyJiBy
ZXNvbHZlcikKIHsKICAgICBpZiAoc3RhcnQgPiBlbmQgfHwgb2JqLT5pc0Zsb2F0aW5nKCkgfHwK
ICAgICAgICAgKG9iai0+aXNQb3NpdGlvbmVkKCkgJiYgIW9iai0+c3R5bGUoKS0+aGFzU3RhdGlj
WCgpICYmICFvYmotPnN0eWxlKCktPmhhc1N0YXRpY1koKSAmJiAhb2JqLT5jb250YWluZXIoKS0+
aXNSZW5kZXJJbmxpbmUoKSkpCkBAIC00NDEsMzYgKzE3MSw2IEBAIHN0YXRpYyB2b2lkIGFwcGVu
ZFJ1bnNGb3JPYmplY3QoaW50IHN0YXIKICAgICB9CiB9CiAKLXRlbXBsYXRlIDw+Ci12b2lkIElu
bGluZUJpZGlSZXNvbHZlcjo6YXBwZW5kUnVuKCkKLXsKLSAgICBpZiAoIWVtcHR5UnVuICYmICFl
b3IuYXRFbmQoKSkgewotICAgICAgICBpbnQgc3RhcnQgPSBzb3IucG9zOwotICAgICAgICBSZW5k
ZXJPYmplY3QgKm9iaiA9IHNvci5vYmo7Ci0gICAgICAgIHdoaWxlIChvYmogJiYgb2JqICE9IGVv
ci5vYmogJiYgb2JqICE9IGVuZE9mTGluZS5vYmopIHsKLSAgICAgICAgICAgIGFwcGVuZFJ1bnNG
b3JPYmplY3Qoc3RhcnQsIG9iai0+bGVuZ3RoKCksIG9iaiwgKnRoaXMpOyAgICAgICAgCi0gICAg
ICAgICAgICBzdGFydCA9IDA7Ci0gICAgICAgICAgICBvYmogPSBiaWRpTmV4dChzb3IuYmxvY2ss
IG9iaik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9iaikgewotICAgICAgICAgICAgdW5zaWdu
ZWQgcG9zID0gb2JqID09IGVvci5vYmogPyBlb3IucG9zIDogVUlOVF9NQVg7Ci0gICAgICAgICAg
ICBpZiAob2JqID09IGVuZE9mTGluZS5vYmogJiYgZW5kT2ZMaW5lLnBvcyA8PSBwb3MpIHsKLSAg
ICAgICAgICAgICAgICByZWFjaGVkRW5kT2ZMaW5lID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBw
b3MgPSBlbmRPZkxpbmUucG9zOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSXQncyBP
SyB0byBhZGQgcnVucyBmb3IgemVyby1sZW5ndGggUmVuZGVyT2JqZWN0cywganVzdCBkb24ndCBt
YWtlIHRoZSBydW4gbGFyZ2VyIHRoYW4gaXQgc2hvdWxkIGJlCi0gICAgICAgICAgICBpbnQgZW5k
ID0gb2JqLT5sZW5ndGgoKSA/IHBvcysxIDogMDsKLSAgICAgICAgICAgIGFwcGVuZFJ1bnNGb3JP
YmplY3Qoc3RhcnQsIGVuZCwgb2JqLCAqdGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAg
ICAgIGVvci5pbmNyZW1lbnQoKTsKLSAgICAgICAgc29yID0gZW9yOwotICAgIH0KLQotICAgIG1f
ZGlyZWN0aW9uID0gT3RoZXJOZXV0cmFsOwotICAgIG1fc3RhdHVzLmVvciA9IE90aGVyTmV1dHJh
bDsKLX0KLQogc3RhdGljIGlubGluZSBJbmxpbmVCb3gqIGNyZWF0ZUlubGluZUJveEZvclJlbmRl
cmVyKFJlbmRlck9iamVjdCogb2JqLCBib29sIGlzUm9vdExpbmVCb3gsIGJvb2wgaXNPbmx5UnVu
ID0gZmFsc2UpCiB7CiAgICAgaWYgKGlzUm9vdExpbmVCb3gpCkBAIC01NzIsMTIgKzI3MiwxNiBA
QCBSb290SW5saW5lQm94KiBSZW5kZXJCbG9jazo6Y29uc3RydWN0TGluCiAgICAgICAgIGlmICgh
Ym94KQogICAgICAgICAgICAgY29udGludWU7CiAKKyAgICAgICAgLy8gQW5vbnltb3VzIGlubGlu
ZSBibG9ja3MgKHVzZWQgdG8gaG9sZCBibG9ja3MgaW5zaWRlIGlubGluZXMpIGRvbid0IG5lZWQg
dG8gd2FzdGUgdGltZSB3cmFwcGluZworICAgICAgICAvLyB0aGVtc2VsdmVzIGluIHRob3NlIGlu
bGluZXMgKHNpbmNlIHdlIHdhbnQgdG8gcHJldGVuZCBsaWtlIHRoZXkgZG9uJ3QgZXhpc3Qgb24g
dGhpcyBmYWtlIGxpbmUpLgorICAgICAgICBSZW5kZXJPYmplY3QqIGFuY2VzdG9yUmVuZGVyZXIg
PSByLT5tX29iamVjdC0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpID8gdGhpcyA6IHItPm1fb2Jq
ZWN0LT5wYXJlbnQoKTsKKyAKICAgICAgICAgLy8gSWYgd2UgaGF2ZSBubyBwYXJlbnQgYm94IHll
dCwgb3IgaWYgdGhlIHJ1biBpcyBub3Qgc2ltcGx5IGEgc2libGluZywKICAgICAgICAgLy8gdGhl
biB3ZSBuZWVkIHRvIGNvbnN0cnVjdCBpbmxpbmUgYm94ZXMgYXMgbmVjZXNzYXJ5IHRvIHByb3Bl
cmx5IGVuY2xvc2UgdGhlCiAgICAgICAgIC8vIHJ1bidzIGlubGluZSBib3guCi0gICAgICAgIGlm
ICghcGFyZW50Qm94IHx8IHBhcmVudEJveC0+cmVuZGVyZXIoKSAhPSByLT5tX29iamVjdC0+cGFy
ZW50KCkpCisgICAgICAgIGlmICghcGFyZW50Qm94IHx8IHBhcmVudEJveC0+cmVuZGVyZXIoKSAh
PSBhbmNlc3RvclJlbmRlcmVyKQogICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyBpbmxpbmUgYm94
ZXMgYWxsIHRoZSB3YXkgYmFjayB0byB0aGUgYXBwcm9wcmlhdGUgaW5zZXJ0aW9uIHBvaW50Lgot
ICAgICAgICAgICAgcGFyZW50Qm94ID0gY3JlYXRlTGluZUJveGVzKHItPm1fb2JqZWN0LT5wYXJl
bnQoKSwgZmlyc3RMaW5lKTsKKyAgICAgICAgICAgIHBhcmVudEJveCA9IGNyZWF0ZUxpbmVCb3hl
cyhhbmNlc3RvclJlbmRlcmVyLCBmaXJzdExpbmUpOwogCiAgICAgICAgIC8vIEFwcGVuZCB0aGUg
aW5saW5lIGJveCB0byB0aGlzIGxpbmUuCiAgICAgICAgIHBhcmVudEJveC0+YWRkVG9MaW5lKGJv
eCk7CkBAIC02MTksNiArMzIzLDggQEAgdm9pZCBSZW5kZXJCbG9jazo6Y29tcHV0ZUhvcml6b250
YWxQb3NpdAogICAgIHVuc2lnbmVkIG51bVNwYWNlcyA9IDA7CiAgICAgRVRleHRBbGlnbiB0ZXh0
QWxpZ24gPSBzdHlsZSgpLT50ZXh0QWxpZ24oKTsKIAorICAgIGludCB4ID0gbGVmdE9mZnNldCho
ZWlnaHQoKSwgZmlyc3RMaW5lKTsKKwogICAgIGZvciAoQmlkaVJ1biogciA9IGZpcnN0UnVuOyBy
OyByID0gci0+bmV4dCgpKSB7CiAgICAgICAgIGlmICghci0+bV9ib3ggfHwgci0+bV9vYmplY3Qt
PmlzUG9zaXRpb25lZCgpIHx8IHItPm1fYm94LT5pc0xpbmVCcmVhaygpKQogICAgICAgICAgICAg
Y29udGludWU7IC8vIFBvc2l0aW9uZWQgb2JqZWN0cyBhcmUgb25seSBwYXJ0aWNpcGF0aW5nIHRv
IGZpZ3VyZSBvdXQgdGhlaXIKQEAgLTY1Niw2ICszNjIsMTIgQEAgdm9pZCBSZW5kZXJCbG9jazo6
Y29tcHV0ZUhvcml6b250YWxQb3NpdAogICAgICAgICAgICAgcmVuZGVyQm94LT5jYWxjV2lkdGgo
KTsKICAgICAgICAgICAgIHItPm1fYm94LT5zZXRXaWR0aChyZW5kZXJCb3gtPndpZHRoKCkpOwog
ICAgICAgICAgICAgdG90V2lkdGggKz0gcmVuZGVyQm94LT5tYXJnaW5MZWZ0KCkgKyByZW5kZXJC
b3gtPm1hcmdpblJpZ2h0KCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChyLT5tX29i
amVjdC0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CisgICAgICAgICAgICAgICAgLy8gQWxs
b3cgdGhlIGZ1bGwgYXZhaWxhYmxlIHdpZHRoIHRvIGJlIHVzZWQsIHNpbmNlIGZsb2F0cyB3aWxs
IGludHJ1ZGUgaW50byBvdXIgc3BhY2UuCisgICAgICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGgg
PSByaWdodE9mZnNldCgpIC0gbGVmdE9mZnNldCgpOworICAgICAgICAgICAgICAgIHggPSBsZWZ0
T2Zmc2V0KCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICB0b3RXaWR0aCAr
PSByLT5tX2JveC0+d2lkdGgoKTsKQEAgLTY2NSw3ICszNzcsNiBAQCB2b2lkIFJlbmRlckJsb2Nr
Ojpjb21wdXRlSG9yaXpvbnRhbFBvc2l0CiAgICAgLy8gd2Ugbm93IGV4YW1pbmUgb3VyIHRleHQt
YWxpZ24gcHJvcGVydHkgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIHdoZXJlIHRvIHBvc2l0aW9uIHRo
ZQogICAgIC8vIG9iamVjdHMgaG9yaXpvbnRhbGx5LiAgVGhlIHRvdGFsIHdpZHRoIG9mIHRoZSBs
aW5lIGNhbiBiZSBpbmNyZWFzZWQgaWYgd2UgZW5kIHVwCiAgICAgLy8ganVzdGlmeWluZyB0ZXh0
LgotICAgIGludCB4ID0gbGVmdE9mZnNldChoZWlnaHQoKSwgZmlyc3RMaW5lKTsKICAgICBzd2l0
Y2ggKHRleHRBbGlnbikgewogICAgICAgICBjYXNlIExFRlQ6CiAgICAgICAgIGNhc2UgV0VCS0lU
X0xFRlQ6CkBAIC04MTksOSArNTMwLDE1IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmxheW91dElubGlu
ZUNoaWxkcmVuKGIKICAgICBib29sIHVzZVJlcGFpbnRCb3VuZHMgPSBmYWxzZTsKICAgICAKICAg
ICBtX292ZXJmbG93LmNsZWFyKCk7Ci0gICAgICAgIAotICAgIHNldEhlaWdodChib3JkZXJUb3Ao
KSArIHBhZGRpbmdUb3AoKSk7Ci0gICAgaW50IHRvQWRkID0gYm9yZGVyQm90dG9tKCkgKyBwYWRk
aW5nQm90dG9tKCkgKyBob3Jpem9udGFsU2Nyb2xsYmFySGVpZ2h0KCk7CisgICAgCisgICAgaW50
IHRvcCA9IGJvcmRlclRvcCgpICsgcGFkZGluZ1RvcCgpOworICAgIGludCBib3R0b20gPSBib3Jk
ZXJCb3R0b20oKSArIHBhZGRpbmdCb3R0b20oKSArIGhvcml6b250YWxTY3JvbGxiYXJIZWlnaHQo
KTsKKworICAgIHNldEhlaWdodCh0b3ApOworCisgICAgLy8gVGhlIG1hcmdpbiBzdHJ1Y3QgY2Fj
aGVzIGFsbCBvdXIgY3VycmVudCBtYXJnaW4gY29sbGFwc2luZyBzdGF0ZS4gV2UgcnVuIG1hcmdp
biBjb2xsYXBzaW5nIHdoZW4gd2UgZW5jb3VudGVyIGFub255bW91cyBpbmxpbmUgYmxvY2tzIHRo
YXQgYXJlIGJlaW5nIHVzZWQKKyAgICAvLyBmb3IgdGhlIGJsb2Nrcy1pbnNpZGUtaW5saW5lcyBj
YXNlIChhbmQgdGhlIGlubGluZXMgYXJlIGVtcHR5KSwgZS5nLCA8c3Bhbj48ZGl2Pk9uZTwvZGl2
Pjwvc3Bhbj4uCisgICAgTWFyZ2luSW5mbyBtYXJnaW5JbmZvKHRoaXMsIHRvcCwgYm90dG9tKTsK
IAogICAgIC8vIEZpZ3VyZSBvdXQgaWYgd2Ugc2hvdWxkIGNsZWFyIG91dCBvdXIgbGluZSBib3hl
cy4KICAgICAvLyBGSVhNRTogSGFuZGxlIHJlc2l6ZSBldmVudHVhbGx5IQpAQCAtODUwLDEyICs1
NjcsMTUgQEAgdm9pZCBSZW5kZXJCbG9jazo6bGF5b3V0SW5saW5lQ2hpbGRyZW4oYgogICAgICAg
ICAgICAgaWYgKG8tPmlzUmVwbGFjZWQoKSB8fCBvLT5pc0Zsb2F0aW5nKCkgfHwgby0+aXNQb3Np
dGlvbmVkKCkpIHsKICAgICAgICAgICAgICAgICBSZW5kZXJCb3gqIGJveCA9IHRvUmVuZGVyQm94
KG8pOwogICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWxheW91dENoaWxk
cmVuIHx8IG8tPnN0eWxlKCktPndpZHRoKCkuaXNQZXJjZW50KCkgfHwgby0+c3R5bGUoKS0+aGVp
Z2h0KCkuaXNQZXJjZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIG8tPnNldENoaWxkTmVlZHNM
YXlvdXQodHJ1ZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAg
ICAvLyBNYWtlIHN1cmUgd2UgbGF5b3V0IGNoaWxkcmVuIGlmIHRoZXkgbmVlZCBpdC4KKyAgICAg
ICAgICAgICAgICAvLyBGSVhNRTogVGVjaG5pY2FsbHkgcGVyY2VudGFnZSBoZWlnaHQgb2JqZWN0
cyBvbmx5IG5lZWQgYSByZWxheW91dCBpZiB0aGVpciBwZXJjZW50YWdlIGlzbid0IGdvaW5nIHRv
IGJlIHR1cm5lZCBpbnRvCisgICAgICAgICAgICAgICAgLy8gYW4gYXV0byB2YWx1ZS4gIEFkZCBh
IG1ldGhvZCB0byBkZXRlcm1pbmUgdGhpcywgc28gdGhhdCB3ZSBjYW4gYXZvaWQgdGhlIHJlbGF5
b3V0LgorICAgICAgICAgICAgICAgIGlmIChyZWxheW91dENoaWxkcmVuIHx8ICgoYm94LT5zdHls
ZSgpLT5oZWlnaHQoKS5pc1BlcmNlbnQoKSB8fCBib3gtPnN0eWxlKCktPm1pbkhlaWdodCgpLmlz
UGVyY2VudCgpIHx8IGJveC0+c3R5bGUoKS0+bWF4SGVpZ2h0KCkuaXNQZXJjZW50KCkpKSkKKyAg
ICAgICAgICAgICAgICAgICAgYm94LT5zZXRDaGlsZE5lZWRzTGF5b3V0KHRydWUsIGZhbHNlKTsK
KwogICAgICAgICAgICAgICAgIC8vIElmIHJlbGF5b3V0Q2hpbGRyZW4gaXMgc2V0IGFuZCB3ZSBo
YXZlIHBlcmNlbnRhZ2UgcGFkZGluZywgd2UgYWxzbyBuZWVkIHRvIGludmFsaWRhdGUgdGhlIGNo
aWxkJ3MgcHJlZiB3aWR0aHMuCi0gICAgICAgICAgICAgICAgaWYgKHJlbGF5b3V0Q2hpbGRyZW4g
JiYgKG8tPnN0eWxlKCktPnBhZGRpbmdMZWZ0KCkuaXNQZXJjZW50KCkgfHwgby0+c3R5bGUoKS0+
cGFkZGluZ1JpZ2h0KCkuaXNQZXJjZW50KCkpKQotICAgICAgICAgICAgICAgICAgICBvLT5zZXRQ
cmVmV2lkdGhzRGlydHkodHJ1ZSwgZmFsc2UpOworICAgICAgICAgICAgICAgIGlmIChyZWxheW91
dENoaWxkcmVuICYmIChib3gtPnN0eWxlKCktPnBhZGRpbmdMZWZ0KCkuaXNQZXJjZW50KCkgfHwg
Ym94LT5zdHlsZSgpLT5wYWRkaW5nUmlnaHQoKS5pc1BlcmNlbnQoKSkpCisgICAgICAgICAgICAg
ICAgICAgIGJveC0+c2V0UHJlZldpZHRoc0RpcnR5KHRydWUsIGZhbHNlKTsKICAgICAgICAgICAg
IAogICAgICAgICAgICAgICAgIGlmIChvLT5pc1Bvc2l0aW9uZWQoKSkKICAgICAgICAgICAgICAg
ICAgICAgby0+Y29udGFpbmluZ0Jsb2NrKCktPmluc2VydFBvc2l0aW9uZWRPYmplY3QoYm94KTsK
QEAgLTg2NSw3ICs1ODUsOCBAQCB2b2lkIFJlbmRlckJsb2NrOjpsYXlvdXRJbmxpbmVDaGlsZHJl
bihiCiAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZ1bGxMYXlvdXQgfHwgby0+bmVlZHNM
YXlvdXQoKSkgLy8gUmVwbGFjZWQgZWxlbWVudHMKICAgICAgICAgICAgICAgICAgICAgICAgIHRv
UmVuZGVyQm94KG8pLT5kaXJ0eUxpbmVCb3hlcyhmdWxsTGF5b3V0KTsKIAotICAgICAgICAgICAg
ICAgICAgICBvLT5sYXlvdXRJZk5lZWRlZCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoIW8t
PmlzUmVwbGFjZWQoKSB8fCAhby0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKQorICAgICAgICAg
ICAgICAgICAgICAgICAgby0+bGF5b3V0SWZOZWVkZWQoKTsKICAgICAgICAgICAgICAgICB9CiAg
ICAgICAgICAgICB9IGVsc2UgaWYgKG8tPmlzVGV4dCgpIHx8IChvLT5pc1JlbmRlcklubGluZSgp
ICYmICFlbmRPZklubGluZSkpIHsKICAgICAgICAgICAgICAgICBoYXNJbmxpbmVDaGlsZCA9IHRy
dWU7CkBAIC05NjAsNyArNjgxLDcgQEAgdm9pZCBSZW5kZXJCbG9jazo6bGF5b3V0SW5saW5lQ2hp
bGRyZW4oYgogICAgICAgICAgICAgaXNMaW5lRW1wdHkgPSB0cnVlOwogICAgICAgICAgICAgCiAg
ICAgICAgICAgICBFQ2xlYXIgY2xlYXIgPSBDTk9ORTsKLSAgICAgICAgICAgIGVuZCA9IGZpbmRO
ZXh0TGluZUJyZWFrKHJlc29sdmVyLCBmaXJzdExpbmUsIGlzTGluZUVtcHR5LCBwcmV2aW91c0xp
bmVCcm9rZUNsZWFubHksICZjbGVhcik7CisgICAgICAgICAgICBlbmQgPSBmaW5kTmV4dExpbmVC
cmVhayhyZXNvbHZlciwgZmlyc3RMaW5lLCBpc0xpbmVFbXB0eSwgcHJldmlvdXNMaW5lQnJva2VD
bGVhbmx5LCBtYXJnaW5JbmZvLCAmY2xlYXIpOwogICAgICAgICAgICAgaWYgKHJlc29sdmVyLnBv
c2l0aW9uKCkuYXRFbmQoKSkgewogICAgICAgICAgICAgICAgIHJlc29sdmVyLmRlbGV0ZVJ1bnMo
KTsKICAgICAgICAgICAgICAgICBjaGVja0ZvckZsb2F0c0Zyb21MYXN0TGluZSA9IHRydWU7CkBA
IC0xMDMwLDYgKzc1MSwxNCBAQCB2b2lkIFJlbmRlckJsb2NrOjpsYXlvdXRJbmxpbmVDaGlsZHJl
bihiCiAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lQm94KSB7CiAgICAgICAgICAgICAgICAg
ICAgICAgICBsaW5lQm94LT5zZXRFbmRzV2l0aEJyZWFrKHByZXZpb3VzTGluZUJyb2tlQ2xlYW5s
eSk7CiAKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIG91ciBwcmV2aW91cyBsaW5lIHdh
cyBhbiBhbm9ueW1vdXMgYmxvY2sgYW5kIHdlIGFyZSBub3QgYW4gYW5vbnltb3VzIGJsb2NrLCBz
aW11bGF0ZSBhIG1hcmdpbiBjb2xsYXBzZSBub3cgc28gdGhhdCB3ZSBnZXQgdGhlIHByb3Blcgor
ICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5jcmVhc2VkIGhlaWdodC4gIFdlIGFsc28gaGF2
ZSB0byBzaW11bGF0ZSBhIG1hcmdpbiBjb2xsYXBzZSB0byBwcm9wYWdhdGUgbWFyZ2lucyB0aHJv
dWdoIHRvIHRoZSB0b3Agb2Ygb3VyIGJsb2NrLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYg
KCFsaW5lQm94LT5hbm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgaWYgKCFsaW5lQm94LT5wcmV2Um9vdEJveCgpIHx8IGxpbmVCb3gtPnByZXZSb290
Qm94KCktPmFub255bW91c0lubGluZUJsb2NrKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGNvbGxhcHNlTWFyZ2lucygwLCBtYXJnaW5JbmZvKTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBtYXJnaW5JbmZvLnNldEF0VG9wT2ZCbG9jayhmYWxzZSk7CisgICAgICAgICAg
ICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdyB3ZSBwb3Np
dGlvbiBhbGwgb2Ygb3VyIHRleHQgcnVucyBob3Jpem9udGFsbHkuCiAgICAgICAgICAgICAgICAg
ICAgICAgICBjb21wdXRlSG9yaXpvbnRhbFBvc2l0aW9uc0ZvckxpbmUobGluZUJveCwgZmlyc3RM
aW5lLCByZXNvbHZlci5maXJzdFJ1bigpLCB0cmFpbGluZ1NwYWNlUnVuLCBlbmQuYXRFbmQoKSk7
CiAKQEAgLTExNjEsOCArODkwLDE0IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmxheW91dElubGluZUNo
aWxkcmVuKGIKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIE5vdyBhZGQgaW4gdGhlIGJvdHRv
bSBib3JkZXIvcGFkZGluZy4KLSAgICBzZXRIZWlnaHQoaGVpZ2h0KCkgKyB0b0FkZCk7CisgICAg
Ly8gTm93IGRvIHRoZSBoYW5kbGluZyBvZiB0aGUgYm90dG9tIG9mIHRoZSBibG9jaywgYWRkaW5n
IGluIG91ciBib3R0b20gYm9yZGVyL3BhZGRpbmcgYW5kCisgICAgLy8gZGV0ZXJtaW5pbmcgdGhl
IGNvcnJlY3QgY29sbGFwc2VkIGJvdHRvbSBtYXJnaW4gaW5mb3JtYXRpb24uICBUaGlzIGNvbGxh
cHNlIGlzIG9ubHkgbmVjZXNzYXJ5CisgICAgLy8gaWYgb3VyIGxhc3QgY2hpbGQgd2FzIGFuIGFu
b255bW91cyBpbmxpbmUgYmxvY2sgdGhhdCBtaWdodCBuZWVkIHRvIHByb3BhZ2F0ZSBtYXJnaW4g
aW5mb3JtYXRpb24gb3V0IHRvCisgICAgLy8gdXMuCisgICAgaWYgKGxhc3RSb290Qm94KCkgJiYg
bGFzdFJvb3RCb3goKS0+YW5vbnltb3VzSW5saW5lQmxvY2soKSkKKyAgICAgICAgaGFuZGxlQm90
dG9tT2ZCbG9jayh0b3AsIGJvdHRvbSwgbWFyZ2luSW5mbyk7CisgICAgZWxzZQorICAgICAgICBz
ZXRIZWlnaHQoaGVpZ2h0KCkgKyBib3R0b20pOwogCiAgICAgaWYgKCFmaXJzdExpbmVCb3goKSAm
JiBoYXNMaW5lSWZFbXB0eSgpKQogICAgICAgICBzZXRIZWlnaHQoaGVpZ2h0KCkgKyBsaW5lSGVp
Z2h0KHRydWUsIHRydWUpKTsKQEAgLTExODMsNiArOTE4LDEyIEBAIFJvb3RJbmxpbmVCb3gqIFJl
bmRlckJsb2NrOjpkZXRlcm1pbmVTdGEKICAgICBpZiAoIWZ1bGxMYXlvdXQpIHsKICAgICAgICAg
c2l6ZV90IGZsb2F0SW5kZXggPSAwOwogICAgICAgICBmb3IgKGN1cnIgPSBmaXJzdFJvb3RCb3go
KTsgY3VyciAmJiAhY3Vyci0+aXNEaXJ0eSgpOyBjdXJyID0gY3Vyci0+bmV4dFJvb3RCb3goKSkg
eworICAgICAgICAgICAgaWYgKGN1cnItPmFub255bW91c0lubGluZUJsb2NrKCkpIHsKKyAgICAg
ICAgICAgICAgICAvLyBGSVhNRTogV2UgaGF2ZSB0byBkbyBiZXR0ZXIgdGhhbiB0aGlzIG9yIHdl
IHdpbGwgcmVwYWludCB0b28gbXVjaCBhcyBjb250ZW50IGluc2lkZSBhbgorICAgICAgICAgICAg
ICAgIC8vIGFub255bW91cyBpbmxpbmUgYmxvY2sgY29tZXMgaW4uCisgICAgICAgICAgICAgICAg
ZnVsbExheW91dCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9
CiAgICAgICAgICAgICBpZiAoVmVjdG9yPFJlbmRlckJveCo+KiBjbGVhbkxpbmVGbG9hdHMgPSBj
dXJyLT5mbG9hdHNQdHIoKSkgewogICAgICAgICAgICAgICAgIFZlY3RvcjxSZW5kZXJCb3gqPjo6
aXRlcmF0b3IgZW5kID0gY2xlYW5MaW5lRmxvYXRzLT5lbmQoKTsKICAgICAgICAgICAgICAgICBm
b3IgKFZlY3RvcjxSZW5kZXJCb3gqPjo6aXRlcmF0b3IgbyA9IGNsZWFuTGluZUZsb2F0cy0+YmVn
aW4oKTsgbyAhPSBlbmQ7ICsrbykgewpAQCAtMTQ0NCw3ICsxMTg1LDcgQEAgc3RhdGljIGJvb2wg
aW5saW5lRmxvd1JlcXVpcmVzTGluZUJveChSZQogICAgIHJldHVybiAhZmxvdy0+Zmlyc3RDaGls
ZCgpICYmIGZsb3ctPmhhc0hvcml6b250YWxCb3JkZXJzUGFkZGluZ09yTWFyZ2luKCk7CiB9CiAK
LXN0YXRpYyBpbmxpbmUgYm9vbCByZXF1aXJlc0xpbmVCb3goY29uc3QgSW5saW5lSXRlcmF0b3Im
IGl0LCBib29sIGlzTGluZUVtcHR5LCBib29sIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSkKK2Jv
b2wgUmVuZGVyQmxvY2s6OnJlcXVpcmVzTGluZUJveChjb25zdCBJbmxpbmVJdGVyYXRvciYgaXQs
IGJvb2wgaXNMaW5lRW1wdHksIGJvb2wgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KQogewogICAg
IGlmIChpdC5vYmotPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSkKICAgICAgICAgcmV0dXJuIGZh
bHNlOwpAQCAtMTU5Nyw3ICsxMzM4LDcgQEAgc3RhdGljIGlubGluZSB1bnNpZ25lZCB0ZXh0V2lk
dGgoUmVuZGVyVAogfQogCiBJbmxpbmVJdGVyYXRvciBSZW5kZXJCbG9jazo6ZmluZE5leHRMaW5l
QnJlYWsoSW5saW5lQmlkaVJlc29sdmVyJiByZXNvbHZlciwgYm9vbCBmaXJzdExpbmUsICBib29s
JiBpc0xpbmVFbXB0eSwgYm9vbCYgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5LCAKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFQ2xlYXIqIGNsZWFyKQorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcmdpbkluZm8mIG1h
cmdpbkluZm8sIEVDbGVhciogY2xlYXIpCiB7CiAgICAgQVNTRVJUKHJlc29sdmVyLnBvc2l0aW9u
KCkuYmxvY2sgPT0gdGhpcyk7CiAKQEAgLTE2MzgsNiArMTM3OSwxMSBAQCBJbmxpbmVJdGVyYXRv
ciBSZW5kZXJCbG9jazo6ZmluZE5leHRMaW5lCiAgICAgYm9vbCBhdXRvV3JhcFdhc0V2ZXJUcnVl
T25MaW5lID0gZmFsc2U7CiAgICAgYm9vbCBmbG9hdHNGaXRPbkxpbmUgPSB0cnVlOwogICAgIAor
ICAgIGJvb2wgaXNCbG9ja0luc2lkZUlubGluZSA9IGZhbHNlOworICAgIAorICAgIGludCBwcmV2
aW91c0Jsb2NrRmxvYXRCb3R0b20gPSAwOworICAgIGludCBtYXhCbG9ja0Zsb2F0Qm90dG9tID0g
MDsKKwogICAgIC8vIEZpcmVmb3ggYW5kIE9wZXJhIHdpbGwgYWxsb3cgYSB0YWJsZSBjZWxsIHRv
IGdyb3cgdG8gZml0IGFuIGltYWdlIGluc2lkZSBpdCB1bmRlcgogICAgIC8vIHZlcnkgc3BlY2lm
aWMgY2lyY3Vtc3RhbmNlcyAoaW4gb3JkZXIgdG8gbWF0Y2ggY29tbW9uIFdpbklFIHJlbmRlcmlu
Z3MpLiAKICAgICAvLyBOb3Qgc3VwcG9ydGluZyB0aGUgcXVpcmsgaGFzIGNhdXNlZCB1cyB0byBt
aXMtcmVuZGVyIHNvbWUgcmVhbCBzaXRlcy4gKFNlZSBCdWd6aWxsYSAxMDUxNy4pIApAQCAtMTY0
OCw3ICsxMzk0LDggQEAgSW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6OmZpbmROZXh0TGluZQog
ICAgIHdoaWxlIChvKSB7CiAgICAgICAgIGN1cnJXUyA9IG8tPmlzUmVwbGFjZWQoKSA/IG8tPnBh
cmVudCgpLT5zdHlsZSgpLT53aGl0ZVNwYWNlKCkgOiBvLT5zdHlsZSgpLT53aGl0ZVNwYWNlKCk7
CiAgICAgICAgIGxhc3RXUyA9IGxhc3QtPmlzUmVwbGFjZWQoKSA/IGxhc3QtPnBhcmVudCgpLT5z
dHlsZSgpLT53aGl0ZVNwYWNlKCkgOiBsYXN0LT5zdHlsZSgpLT53aGl0ZVNwYWNlKCk7Ci0gICAg
ICAgIAorICAgICAgICBpc0Jsb2NrSW5zaWRlSW5saW5lID0gby0+aXNBbm9ueW1vdXNJbmxpbmVC
bG9jaygpOworCiAgICAgICAgIGJvb2wgYXV0b1dyYXAgPSBSZW5kZXJTdHlsZTo6YXV0b1dyYXAo
Y3VycldTKTsKICAgICAgICAgYXV0b1dyYXBXYXNFdmVyVHJ1ZU9uTGluZSA9IGF1dG9XcmFwV2Fz
RXZlclRydWVPbkxpbmUgfHwgYXV0b1dyYXA7CiAKQEAgLTE2NTksNyArMTQwNiw3IEBAIElubGlu
ZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpmaW5kTmV4dExpbmUKICNlbmRpZgogCiAgICAgICAgIGJv
b2wgY29sbGFwc2VXaGl0ZVNwYWNlID0gUmVuZGVyU3R5bGU6OmNvbGxhcHNlV2hpdGVTcGFjZShj
dXJyV1MpOwotICAgICAgICAgICAgCisKICAgICAgICAgaWYgKG8tPmlzQlIoKSkgewogICAgICAg
ICAgICAgaWYgKHcgKyB0bXBXIDw9IHdpZHRoKSB7CiAgICAgICAgICAgICAgICAgbEJyZWFrLm9i
aiA9IG87CkBAIC0xNzY2LDggKzE1MTMsOSBAQCBJbmxpbmVJdGVyYXRvciBSZW5kZXJCbG9jazo6
ZmluZE5leHRMaW5lCiAgICAgICAgIH0gZWxzZSBpZiAoby0+aXNSZXBsYWNlZCgpKSB7CiAgICAg
ICAgICAgICBSZW5kZXJCb3gqIHJlcGxhY2VkQm94ID0gdG9SZW5kZXJCb3gobyk7CiAKLSAgICAg
ICAgICAgIC8vIEJyZWFrIG9uIHJlcGxhY2VkIGVsZW1lbnRzIGlmIGVpdGhlciBoYXMgbm9ybWFs
IHdoaXRlLXNwYWNlLgotICAgICAgICAgICAgaWYgKChhdXRvV3JhcCB8fCBSZW5kZXJTdHlsZTo6
YXV0b1dyYXAobGFzdFdTKSkgJiYgKCFvLT5pc0ltYWdlKCkgfHwgYWxsb3dJbWFnZXNUb0JyZWFr
KSkgeworICAgICAgICAgICAgLy8gQnJlYWsgb24gcmVwbGFjZWQgZWxlbWVudHMgaWYgZWl0aGVy
IGhhcyBub3JtYWwgd2hpdGUtc3BhY2UuICBXZSBhbHNvIGFsd2F5cyBicmVhayBpZiB3ZQorICAg
ICAgICAgICAgLy8gZW5jb3VudGVyIGEgc3BlY2lhbCBhbm9ueW1vdXMgaW5saW5lIGJsb2NrICh1
c2VkIHRvIGhvbGQgYmxvY2tzIGluc2lkZSBpbmxpbmVzKS4KKyAgICAgICAgICAgIGlmICgoYXV0
b1dyYXAgfHwgUmVuZGVyU3R5bGU6OmF1dG9XcmFwKGxhc3RXUykgfHwgaXNCbG9ja0luc2lkZUlu
bGluZSkgICYmICghby0+aXNJbWFnZSgpIHx8IGFsbG93SW1hZ2VzVG9CcmVhaykpIHsKICAgICAg
ICAgICAgICAgICB3ICs9IHRtcFc7CiAgICAgICAgICAgICAgICAgdG1wVyA9IDA7CiAgICAgICAg
ICAgICAgICAgbEJyZWFrLm9iaiA9IG87CkBAIC0xNzc1LDYgKzE1MjMsMTkgQEAgSW5saW5lSXRl
cmF0b3IgUmVuZGVyQmxvY2s6OmZpbmROZXh0TGluZQogICAgICAgICAgICAgICAgIGxCcmVhay5u
ZXh0QnJlYWthYmxlUG9zaXRpb24gPSAtMTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAg
aWYgKGlzQmxvY2tJbnNpZGVJbmxpbmUpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWlzTGluZUVt
cHR5KQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKworICAgICAgICAgICAgICAgIC8v
IFJlc2V0IHRoZSB3aWR0aCB0byBpZ25vcmUgZmxvYXRzLCBzaW5jZSB3ZSdyZSBnb2luZyB0byBh
bGxvdyB0aGVtIHRvIGludHJ1ZGUgaW50byBvdXIgc3BhY2UuCisgICAgICAgICAgICAgICAgd2lk
dGggPSByaWdodE9mZnNldCgpIC0gbGVmdE9mZnNldCgpOworCisgICAgICAgICAgICAgICAgLy8g
RklYTUU6IFRoaXMgY2FsbCB3aWxsIHVwZGF0ZSB0aGUgaGVpZ2h0IG9mIG91ciBibG9jay4gIEl0
J3Mgbm90IGNsZWFyIGlmIHRoYXQncyBnb2luZyB0byBiZSBvayBvciBub3QgeWV0LgorICAgICAg
ICAgICAgICAgIGxheW91dEJsb2NrQ2hpbGQocmVwbGFjZWRCb3gsIG1hcmdpbkluZm8sIHByZXZp
b3VzQmxvY2tGbG9hdEJvdHRvbSwgbWF4QmxvY2tGbG9hdEJvdHRvbSk7CisKKyAgICAgICAgICAg
ICAgICBsaW5lTWlkcG9pbnRTdGF0ZS5iZXR3ZWVuTWlkcG9pbnRzID0gZmFsc2U7CisgICAgICAg
ICAgICB9CisKICAgICAgICAgICAgIGlmIChpZ25vcmluZ1NwYWNlcykKICAgICAgICAgICAgICAg
ICBhZGRNaWRwb2ludChsaW5lTWlkcG9pbnRTdGF0ZSwgSW5saW5lSXRlcmF0b3IoMCwgbywgMCkp
OwogCkBAIC0xNzk4LDYgKzE1NTksMTUgQEAgSW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6OmZp
bmROZXh0TGluZQogICAgICAgICAgICAgICAgICAgICB0bXBXICs9IHJlcGxhY2VkQm94LT53aWR0
aCgpICsgcmVwbGFjZWRCb3gtPm1hcmdpbkxlZnQoKSArIHJlcGxhY2VkQm94LT5tYXJnaW5SaWdo
dCgpICsgaW5saW5lV2lkdGgobyk7CiAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAg
ICB0bXBXICs9IHJlcGxhY2VkQm94LT53aWR0aCgpICsgcmVwbGFjZWRCb3gtPm1hcmdpbkxlZnQo
KSArIHJlcGxhY2VkQm94LT5tYXJnaW5SaWdodCgpICsgaW5saW5lV2lkdGgobyk7CisgICAgICAg
ICAgICAgICAgCisgICAgICAgICAgICBpZiAoaXNCbG9ja0luc2lkZUlubGluZSkgeworICAgICAg
ICAgICAgICAgIHcgKz0gdG1wVzsKKyAgICAgICAgICAgICAgICB0bXBXID0gMDsKKyAgICAgICAg
ICAgICAgICBsQnJlYWsub2JqID0gbzsKKyAgICAgICAgICAgICAgICBsQnJlYWsucG9zID0gMDsK
KyAgICAgICAgICAgICAgICBsQnJlYWsubmV4dEJyZWFrYWJsZVBvc2l0aW9uID0gLTE7CisgICAg
ICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAo
by0+aXNUZXh0KCkpIHsKICAgICAgICAgICAgIGlmICghcG9zKQogICAgICAgICAgICAgICAgIGFw
cGxpZWRTdGFydFdpZHRoID0gZmFsc2U7CkBAIC0yMTkxLDcgKzE5NjEsNyBAQCBJbmxpbmVJdGVy
YXRvciBSZW5kZXJCbG9jazo6ZmluZE5leHRMaW5lCiAgICAgICAgIH0KICAgICAgICAgLy9lbHNl
IGlmIChsQnJlYWsucG9zID4gMCkKICAgICAgICAgLy8gICAgbEJyZWFrLnBvcy0tOwotICAgICAg
ICBlbHNlIGlmIChsQnJlYWsub2JqID09IDAgJiYgdHJhaWxpbmdTcGFjZU9iamVjdC0+aXNUZXh0
KCkpIHsKKyAgICAgICAgZWxzZSBpZiAoKCFsQnJlYWsub2JqIHx8IGxCcmVhay5vYmotPmlzQW5v
bnltb3VzSW5saW5lQmxvY2soKSkgJiYgdHJhaWxpbmdTcGFjZU9iamVjdC0+aXNUZXh0KCkpIHsK
ICAgICAgICAgICAgIC8vIEFkZCBhIG5ldyBlbmQgbWlkcG9pbnQgdGhhdCBzdG9wcyByaWdodCBh
dCB0aGUgdmVyeSBlbmQuCiAgICAgICAgICAgICBSZW5kZXJUZXh0KiB0ZXh0ID0gdG9SZW5kZXJU
ZXh0KHRyYWlsaW5nU3BhY2VPYmplY3QpOwogICAgICAgICAgICAgdW5zaWduZWQgbGVuZ3RoID0g
dGV4dC0+dGV4dExlbmd0aCgpOwpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQm94LmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCb3guY3BwCShyZXZpc2lv
biA1NDUwMSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJveC5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTEzMzQsNyArMTMzNCw3IEBAIHZvaWQgUmVuZGVyQm94OjpjYWxjV2lkdGgoKQogICAg
IH0KIAogICAgIGlmIChjb250YWluZXJXaWR0aCAmJiBjb250YWluZXJXaWR0aCAhPSAod2lkdGgo
KSArIG1fbWFyZ2luTGVmdCArIG1fbWFyZ2luUmlnaHQpCi0gICAgICAgICAgICAmJiAhaXNGbG9h
dGluZygpICYmICFpc0lubGluZSgpICYmICFjYi0+aXNGbGV4aWJsZUJveCgpKSB7CisgICAgICAg
ICAgICAmJiAhaXNGbG9hdGluZygpICYmICghaXNJbmxpbmUoKSB8fCBpc0Fub255bW91c0lubGlu
ZUJsb2NrKCkpICYmICFjYi0+aXNGbGV4aWJsZUJveCgpKSB7CiAgICAgICAgIGlmIChjYi0+c3R5
bGUoKS0+ZGlyZWN0aW9uKCkgPT0gTFRSKQogICAgICAgICAgICAgbV9tYXJnaW5SaWdodCA9IGNv
bnRhaW5lcldpZHRoIC0gd2lkdGgoKSAtIG1fbWFyZ2luTGVmdDsKICAgICAgICAgZWxzZQpAQCAt
MTM3Myw3ICsxMzczLDcgQEAgYm9vbCBSZW5kZXJCb3g6OnNpemVzVG9JbnRyaW5zaWNXaWR0aChX
aQogewogICAgIC8vIE1hcnF1ZWVzIGluIFdpbklFIGFyZSBsaWtlIGEgbWl4dHVyZSBvZiBibG9j
a3MgYW5kIGlubGluZS1ibG9ja3MuICBUaGV5IHNpemUgYXMgdGhvdWdoIHRoZXkncmUgYmxvY2tz
LAogICAgIC8vIGJ1dCB0aGV5IGFsbG93IHRleHQgdG8gc2l0IG9uIHRoZSBzYW1lIGxpbmUgYXMg
dGhlIG1hcnF1ZWUuCi0gICAgaWYgKGlzRmxvYXRpbmcoKSB8fCAoaXNJbmxpbmVCbG9ja09ySW5s
aW5lVGFibGUoKSAmJiAhaXNIVE1MTWFycXVlZSgpKSkKKyAgICBpZiAoaXNGbG9hdGluZygpIHx8
IChpc0lubGluZUJsb2NrT3JJbmxpbmVUYWJsZSgpICYmICFpc0hUTUxNYXJxdWVlKCkgJiYgIWlz
QW5vbnltb3VzSW5saW5lQmxvY2soKSkpCiAgICAgICAgIHJldHVybiB0cnVlOwogCiAgICAgLy8g
VGhpcyBjb2RlIG1heSBsb29rIGEgYml0IHN0cmFuZ2UuICBCYXNpY2FsbHkgd2lkdGg6aW50cmlu
c2ljIHNob3VsZCBjbGFtcCB0aGUgc2l6ZSB3aGVuIHRlc3RpbmcgYm90aApAQCAtMjgxOSw3ICsy
ODE5LDcgQEAgYm9vbCBSZW5kZXJCb3g6OnNocmlua1RvQXZvaWRGbG9hdHMoKSBjbwogCiBib29s
IFJlbmRlckJveDo6YXZvaWRzRmxvYXRzKCkgY29uc3QKIHsKLSAgICByZXR1cm4gaXNSZXBsYWNl
ZCgpIHx8IGhhc092ZXJmbG93Q2xpcCgpIHx8IGlzSFIoKTsKKyAgICByZXR1cm4gIWlzQW5vbnlt
b3VzSW5saW5lQmxvY2soKSAmJiAoaXNSZXBsYWNlZCgpIHx8IGhhc092ZXJmbG93Q2xpcCgpIHx8
IGlzSFIoKSk7CiB9CiAKIHZvaWQgUmVuZGVyQm94OjphZGRTaGFkb3dPdmVyZmxvdygpCkluZGV4
OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJJbmxpbmUuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlcklubGluZS5jcHAJKHJldmlzaW9uIDU0NTAxKQorKysgV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVySW5saW5lLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDQsNyArNDQs
NiBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIFJlbmRlcklubGluZTo6UmVuZGVySW5saW5lKE5v
ZGUqIG5vZGUpCiAgICAgOiBSZW5kZXJCb3hNb2RlbE9iamVjdChub2RlKQotICAgICwgbV9jb250
aW51YXRpb24oMCkKICAgICAsIG1fbGluZUhlaWdodCgtMSkKICAgICAsIG1fdmVydGljYWxQb3Np
dGlvbihQb3NpdGlvblVuZGVmaW5lZCkKIHsKQEAgLTU2LDE0ICs1NSw2IEBAIHZvaWQgUmVuZGVy
SW5saW5lOjpkZXN0cm95KCkKICAgICAvLyBNYWtlIHN1cmUgdG8gZGVzdHJveSBhbm9ueW1vdXMg
Y2hpbGRyZW4gZmlyc3Qgd2hpbGUgdGhleSBhcmUgc3RpbGwgY29ubmVjdGVkIHRvIHRoZSByZXN0
IG9mIHRoZSB0cmVlLCBzbyB0aGF0IHRoZXkgd2lsbAogICAgIC8vIHByb3Blcmx5IGRpcnR5IGxp
bmUgYm94ZXMgdGhhdCB0aGV5IGFyZSByZW1vdmVkIGZyb20uICBFZmZlY3RzIHRoYXQgZG8gOmJl
Zm9yZS86YWZ0ZXIgb25seSBvbiBob3ZlciBjb3VsZCBjcmFzaCBvdGhlcndpc2UuCiAgICAgY2hp
bGRyZW4oKS0+ZGVzdHJveUxlZnRvdmVyQ2hpbGRyZW4oKTsKLQotICAgIC8vIERlc3Ryb3kgb3Vy
IGNvbnRpbnVhdGlvbiBiZWZvcmUgYW55dGhpbmcgb3RoZXIgdGhhbiBhbm9ueW1vdXMgY2hpbGRy
ZW4uCi0gICAgLy8gVGhlIHJlYXNvbiB3ZSBkb24ndCBkZXN0cm95IGl0IGJlZm9yZSBhbm9ueW1v
dXMgY2hpbGRyZW4gaXMgdGhhdCB0aGV5IG1heQotICAgIC8vIGhhdmUgY29udGludWF0aW9ucyBv
ZiB0aGVpciBvd24gdGhhdCBhcmUgYW5vbnltb3VzIGNoaWxkcmVuIG9mIG91ciBjb250aW51YXRp
b24uCi0gICAgaWYgKG1fY29udGludWF0aW9uKSB7Ci0gICAgICAgIG1fY29udGludWF0aW9uLT5k
ZXN0cm95KCk7Ci0gICAgICAgIG1fY29udGludWF0aW9uID0gMDsKLSAgICB9CiAgICAgCiAgICAg
aWYgKCFkb2N1bWVudEJlaW5nRGVzdHJveWVkKCkpIHsKICAgICAgICAgaWYgKGZpcnN0TGluZUJv
eCgpKSB7CkBAIC05MiwxMyArODMsNiBAQCB2b2lkIFJlbmRlcklubGluZTo6ZGVzdHJveSgpCiAg
ICAgUmVuZGVyQm94TW9kZWxPYmplY3Q6OmRlc3Ryb3koKTsKIH0KIAotUmVuZGVySW5saW5lKiBS
ZW5kZXJJbmxpbmU6OmlubGluZUNvbnRpbnVhdGlvbigpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX2Nv
bnRpbnVhdGlvbiB8fCBtX2NvbnRpbnVhdGlvbi0+aXNJbmxpbmUoKSkKLSAgICAgICAgcmV0dXJu
IHRvUmVuZGVySW5saW5lKG1fY29udGludWF0aW9uKTsKLSAgICByZXR1cm4gdG9SZW5kZXJCbG9j
ayhtX2NvbnRpbnVhdGlvbiktPmlubGluZUNvbnRpbnVhdGlvbigpOwotfQotCiB2b2lkIFJlbmRl
cklubGluZTo6dXBkYXRlQm94TW9kZWxJbmZvRnJvbVN0eWxlKCkKIHsKICAgICBSZW5kZXJCb3hN
b2RlbE9iamVjdDo6dXBkYXRlQm94TW9kZWxJbmZvRnJvbVN0eWxlKCk7CkBAIC0xMTQsMTkgKzk4
LDYgQEAgdm9pZCBSZW5kZXJJbmxpbmU6OnN0eWxlRGlkQ2hhbmdlKFN0eWxlRAogewogICAgIFJl
bmRlckJveE1vZGVsT2JqZWN0OjpzdHlsZURpZENoYW5nZShkaWZmLCBvbGRTdHlsZSk7CiAKLSAg
ICAvLyBFbnN1cmUgdGhhdCBhbGwgb2YgdGhlIHNwbGl0IGlubGluZXMgcGljayB1cCB0aGUgbmV3
IHN0eWxlLiBXZQotICAgIC8vIG9ubHkgZG8gdGhpcyBpZiB3ZSdyZSBhbiBpbmxpbmUsIHNpbmNl
IHdlIGRvbid0IHdhbnQgdG8gcHJvcGFnYXRlCi0gICAgLy8gYSBibG9jaydzIHN0eWxlIHRvIHRo
ZSBvdGhlciBpbmxpbmVzLgotICAgIC8vIGUuZy4sIDxmb250PmZvbyA8aDQ+Z29vPC9oND4gbW9v
PC9mb250Pi4gIFRoZSA8Zm9udD4gaW5saW5lcyBiZWZvcmUKLSAgICAvLyBhbmQgYWZ0ZXIgdGhl
IGJsb2NrIHNoYXJlIHRoZSBzYW1lIHN0eWxlLCBidXQgdGhlIGJsb2NrIGRvZXNuJ3QKLSAgICAv
LyBuZWVkIHRvIHBhc3MgaXRzIHN0eWxlIG9uIHRvIGFueW9uZSBlbHNlLgotICAgIGZvciAoUmVu
ZGVySW5saW5lKiBjdXJyQ29udCA9IGlubGluZUNvbnRpbnVhdGlvbigpOyBjdXJyQ29udDsgY3Vy
ckNvbnQgPSBjdXJyQ29udC0+aW5saW5lQ29udGludWF0aW9uKCkpIHsKLSAgICAgICAgUmVuZGVy
Qm94TW9kZWxPYmplY3QqIG5leHRDb250ID0gY3VyckNvbnQtPmNvbnRpbnVhdGlvbigpOwotICAg
ICAgICBjdXJyQ29udC0+c2V0Q29udGludWF0aW9uKDApOwotICAgICAgICBjdXJyQ29udC0+c2V0
U3R5bGUoc3R5bGUoKSk7Ci0gICAgICAgIGN1cnJDb250LT5zZXRDb250aW51YXRpb24obmV4dENv
bnQpOwotICAgIH0KLQogICAgIG1fbGluZUhlaWdodCA9IC0xOwogCiAgICAgLy8gVXBkYXRlIHBz
ZXVkb3MgZm9yIDpiZWZvcmUgYW5kIDphZnRlciBub3cuCkBAIC0xMzYsNzkgKzEwNyw3MyBAQCB2
b2lkIFJlbmRlcklubGluZTo6c3R5bGVEaWRDaGFuZ2UoU3R5bGVECiAgICAgfQogfQogCi12b2lk
IFJlbmRlcklubGluZTo6YWRkQ2hpbGQoUmVuZGVyT2JqZWN0KiBuZXdDaGlsZCwgUmVuZGVyT2Jq
ZWN0KiBiZWZvcmVDaGlsZCkKLXsKLSAgICBpZiAoY29udGludWF0aW9uKCkpCi0gICAgICAgIHJl
dHVybiBhZGRDaGlsZFRvQ29udGludWF0aW9uKG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7Ci0gICAg
cmV0dXJuIGFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24obmV3Q2hpbGQsIGJlZm9yZUNoaWxk
KTsKLX0KLQotc3RhdGljIFJlbmRlckJveE1vZGVsT2JqZWN0KiBuZXh0Q29udGludWF0aW9uKFJl
bmRlck9iamVjdCogcmVuZGVyZXIpCit2b2lkIFJlbmRlcklubGluZTo6Y2hpbGRCZWNhbWVOb25J
bmxpbmUoUmVuZGVyT2JqZWN0KiBjaGlsZCkKIHsKLSAgICBpZiAocmVuZGVyZXItPmlzSW5saW5l
KCkgJiYgIXJlbmRlcmVyLT5pc1JlcGxhY2VkKCkpCi0gICAgICAgIHJldHVybiB0b1JlbmRlcklu
bGluZShyZW5kZXJlciktPmNvbnRpbnVhdGlvbigpOwotICAgIHJldHVybiB0b1JlbmRlckJsb2Nr
KHJlbmRlcmVyKS0+aW5saW5lQ29udGludWF0aW9uKCk7CisgICAgUmVuZGVyT2JqZWN0KiBuZXh0
ID0gY2hpbGQtPm5leHRTaWJsaW5nKCk7CisgICAgcmVtb3ZlQ2hpbGQoY2hpbGQpOworICAgIGFk
ZENoaWxkKGNoaWxkLCBuZXh0KTsKIH0KIAotUmVuZGVyQm94TW9kZWxPYmplY3QqIFJlbmRlcklu
bGluZTo6Y29udGludWF0aW9uQmVmb3JlKFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQpCi17Ci0g
ICAgaWYgKGJlZm9yZUNoaWxkICYmIGJlZm9yZUNoaWxkLT5wYXJlbnQoKSA9PSB0aGlzKQotICAg
ICAgICByZXR1cm4gdGhpczsKLQotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBjdXJyID0gbmV4
dENvbnRpbnVhdGlvbih0aGlzKTsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogbmV4dFRvTGFz
dCA9IHRoaXM7Ci0gICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGxhc3QgPSB0aGlzOwotICAgIHdo
aWxlIChjdXJyKSB7Ci0gICAgICAgIGlmIChiZWZvcmVDaGlsZCAmJiBiZWZvcmVDaGlsZC0+cGFy
ZW50KCkgPT0gY3VycikgewotICAgICAgICAgICAgaWYgKGN1cnItPmZpcnN0Q2hpbGQoKSA9PSBi
ZWZvcmVDaGlsZCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbGFzdDsKLSAgICAgICAgICAgIHJl
dHVybiBjdXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgbmV4dFRvTGFzdCA9IGxhc3Q7Ci0gICAg
ICAgIGxhc3QgPSBjdXJyOwotICAgICAgICBjdXJyID0gbmV4dENvbnRpbnVhdGlvbihjdXJyKTsK
LSAgICB9Ci0KLSAgICBpZiAoIWJlZm9yZUNoaWxkICYmICFsYXN0LT5maXJzdENoaWxkKCkpCi0g
ICAgICAgIHJldHVybiBuZXh0VG9MYXN0OwotICAgIHJldHVybiBsYXN0OwotfQotCi12b2lkIFJl
bmRlcklubGluZTo6YWRkQ2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihSZW5kZXJPYmplY3QqIG5l
d0NoaWxkLCBSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkKQordm9pZCBSZW5kZXJJbmxpbmU6OmFk
ZENoaWxkKFJlbmRlck9iamVjdCogbmV3Q2hpbGQsIFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQp
CiB7CiAgICAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IGFwcGVuZCB0aGluZ3MgYWZ0ZXIgOmFmdGVy
LWdlbmVyYXRlZCBjb250ZW50IGlmIHdlIGhhdmUgaXQuCiAgICAgaWYgKCFiZWZvcmVDaGlsZCAm
JiBpc0FmdGVyQ29udGVudChsYXN0Q2hpbGQoKSkpCiAgICAgICAgIGJlZm9yZUNoaWxkID0gbGFz
dENoaWxkKCk7CiAKLSAgICBpZiAoIW5ld0NoaWxkLT5pc0lubGluZSgpICYmICFuZXdDaGlsZC0+
aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpKSB7Ci0gICAgICAgIC8vIFdlIGFyZSBwbGFjaW5nIGEg
YmxvY2sgaW5zaWRlIGFuIGlubGluZS4gV2UgaGF2ZSB0byBwZXJmb3JtIGEgc3BsaXQgb2YgdGhp
cwotICAgICAgICAvLyBpbmxpbmUgaW50byBjb250aW51YXRpb25zLiAgVGhpcyBpbnZvbHZlcyBj
cmVhdGluZyBhbiBhbm9ueW1vdXMgYmxvY2sgYm94IHRvIGhvbGQKLSAgICAgICAgLy8gfG5ld0No
aWxkfC4gIFdlIHRoZW4gbWFrZSB0aGF0IGJsb2NrIGJveCBhIGNvbnRpbnVhdGlvbiBvZiB0aGlz
IGlubGluZS4gIFdlIHRha2UgYWxsIG9mCi0gICAgICAgIC8vIHRoZSBjaGlsZHJlbiBhZnRlciB8
YmVmb3JlQ2hpbGR8IGFuZCBwdXQgdGhlbSBpbiBhIGNsb25lIG9mIHRoaXMgb2JqZWN0LgotICAg
ICAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IG5ld1N0eWxlID0gUmVuZGVyU3R5bGU6OmNyZWF0ZSgp
OwotICAgICAgICBuZXdTdHlsZS0+aW5oZXJpdEZyb20oc3R5bGUoKSk7Ci0gICAgICAgIG5ld1N0
eWxlLT5zZXREaXNwbGF5KEJMT0NLKTsKLQotICAgICAgICBSZW5kZXJCbG9jayogbmV3Qm94ID0g
bmV3IChyZW5kZXJBcmVuYSgpKSBSZW5kZXJCbG9jayhkb2N1bWVudCgpIC8qIGFub255bW91cyBi
b3ggKi8pOwotICAgICAgICBuZXdCb3gtPnNldFN0eWxlKG5ld1N0eWxlLnJlbGVhc2UoKSk7Ci0g
ICAgICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBvbGRDb250aW51YXRpb24gPSBjb250aW51YXRp
b24oKTsKLSAgICAgICAgc2V0Q29udGludWF0aW9uKG5ld0JveCk7Ci0KLSAgICAgICAgLy8gU29t
ZW9uZSBtYXkgaGF2ZSBwdXQgYSA8cD4gaW5zaWRlIGEgPHE+LCBjYXVzaW5nIGEgc3BsaXQuICBX
aGVuIHRoaXMgaGFwcGVucywgdGhlIDphZnRlciBjb250ZW50Ci0gICAgICAgIC8vIGhhcyB0byBt
b3ZlIGludG8gdGhlIGlubGluZSBjb250aW51YXRpb24uICBDYWxsIHVwZGF0ZUJlZm9yZUFmdGVy
Q29udGVudCB0byBlbnN1cmUgdGhhdCBvdXIgOmFmdGVyCi0gICAgICAgIC8vIGNvbnRlbnQgZ2V0
cyBwcm9wZXJseSBkZXN0cm95ZWQuCi0gICAgICAgIGJvb2wgaXNMYXN0Q2hpbGQgPSAoYmVmb3Jl
Q2hpbGQgPT0gbGFzdENoaWxkKCkpOwotICAgICAgICBpZiAoZG9jdW1lbnQoKS0+dXNlc0JlZm9y
ZUFmdGVyUnVsZXMoKSkKLSAgICAgICAgICAgIGNoaWxkcmVuKCktPnVwZGF0ZUJlZm9yZUFmdGVy
Q29udGVudCh0aGlzLCBBRlRFUik7Ci0gICAgICAgIGlmIChpc0xhc3RDaGlsZCAmJiBiZWZvcmVD
aGlsZCAhPSBsYXN0Q2hpbGQoKSkKLSAgICAgICAgICAgIGJlZm9yZUNoaWxkID0gMDsgLy8gV2Ug
ZGVzdHJveWVkIHRoZSBsYXN0IGNoaWxkLCBzbyBub3cgd2UgbmVlZCB0byB1cGRhdGUgb3VyIGlu
c2VydGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb2ludCB0byBiZSAwLiAg
SXQncyBqdXN0IGEgc3RyYWlnaHQgYXBwZW5kIG5vdy4KLQotICAgICAgICBzcGxpdEZsb3coYmVm
b3JlQ2hpbGQsIG5ld0JveCwgbmV3Q2hpbGQsIG9sZENvbnRpbnVhdGlvbik7CisgICAgLy8gSWYg
dGhlIHJlcXVlc3RlZCBiZWZvcmVDaGlsZCBpcyBub3Qgb25lIG9mIG91ciBjaGlsZHJlbiwgdGhl
biB0aGlzIGlzIG1vc3QgbGlrZWx5IGJlY2F1c2UKKyAgICAvLyB0aGVyZSBpcyBhbiBhbm9ueW1v
dXMgaW5saW5lLWJsb2NrIGJveCB3aXRoaW4gdGhpcyBvYmplY3QgdGhhdCBjb250YWlucyB0aGUg
YmVmb3JlQ2hpbGQuIFNvCisgICAgLy8ganVzdCBpbnNlcnQgdGhlIGNoaWxkIGludG8gdGhlIGFu
b255bW91cyBpbmxpbmUtYmxvY2sgYm94IGluc3RlYWQgb2YgaGVyZS4KKyAgICAvLyBBIHNlY29u
ZCBwb3NzaWJpbGl0eSBpcyB0aGF0IHRoZSBiZWZvcmVDaGlsZCBpcyBhbiBhbm9ueW1vdXMgYmxv
Y2sgaW5zaWRlIHRoZSBhbm9ueW1vdXMgaW5saW5lIGJsb2NrLgorICAgIC8vIFRoaXMgY2FuIGhh
cHBlbiBpZiBpbmxpbmVzIGFyZSBpbnNlcnRlZCBpbiBiZXR3ZWVuIHR3byBvZiB0aGUgYW5vbnlt
b3VzIGlubGluZSBibG9jaydzIGJsb2NrLWxldmVsCisgICAgLy8gY2hpbGRyZW4gYWZ0ZXIgaXQg
aGFzIGJlZW4gY3JlYXRlZC4KKyAgICBpZiAoYmVmb3JlQ2hpbGQgJiYgYmVmb3JlQ2hpbGQtPnBh
cmVudCgpICE9IHRoaXMpIHsKKyAgICAgICAgQVNTRVJUKGJlZm9yZUNoaWxkLT5wYXJlbnQoKSk7
CisgICAgICAgIEFTU0VSVChiZWZvcmVDaGlsZC0+cGFyZW50KCktPmlzQW5vbnltb3VzSW5saW5l
QmxvY2soKSB8fCBiZWZvcmVDaGlsZC0+cGFyZW50KCktPmlzQW5vbnltb3VzQmxvY2soKSk7Cisg
ICAgICAgIGlmIChiZWZvcmVDaGlsZC0+cGFyZW50KCktPmlzQW5vbnltb3VzSW5saW5lQmxvY2so
KSkgeworICAgICAgICAgICAgaWYgKCFuZXdDaGlsZC0+aXNJbmxpbmUoKSB8fCAobmV3Q2hpbGQt
PmlzSW5saW5lKCkgJiYgYmVmb3JlQ2hpbGQtPnBhcmVudCgpLT5maXJzdENoaWxkKCkgIT0gYmVm
b3JlQ2hpbGQpKQorICAgICAgICAgICAgICAgIGJlZm9yZUNoaWxkLT5wYXJlbnQoKS0+YWRkQ2hp
bGQobmV3Q2hpbGQsIGJlZm9yZUNoaWxkKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAg
ICAgICBhZGRDaGlsZChuZXdDaGlsZCwgYmVmb3JlQ2hpbGQtPnBhcmVudCgpKTsKKyAgICAgICAg
fSBlbHNlIGlmIChiZWZvcmVDaGlsZC0+cGFyZW50KCktPmlzQW5vbnltb3VzQmxvY2soKSkgewor
ICAgICAgICAgICAgQVNTRVJUKCFiZWZvcmVDaGlsZC0+cGFyZW50KCktPnBhcmVudCgpIHx8IGJl
Zm9yZUNoaWxkLT5wYXJlbnQoKS0+cGFyZW50KCktPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSk7
CisgICAgICAgICAgICBBU1NFUlQoYmVmb3JlQ2hpbGQtPmlzSW5saW5lKCkpOworICAgICAgICAg
ICAgaWYgKG5ld0NoaWxkLT5pc0lubGluZSgpIHx8ICghbmV3Q2hpbGQtPmlzSW5saW5lKCkgJiYg
YmVmb3JlQ2hpbGQtPnBhcmVudCgpLT5maXJzdENoaWxkKCkgIT0gYmVmb3JlQ2hpbGQpKQorICAg
ICAgICAgICAgICAgIGJlZm9yZUNoaWxkLT5wYXJlbnQoKS0+YWRkQ2hpbGQobmV3Q2hpbGQsIGJl
Zm9yZUNoaWxkKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBhZGRDaGlsZChu
ZXdDaGlsZCwgYmVmb3JlQ2hpbGQtPnBhcmVudCgpKTsKKyAgICAgICAgfQogICAgICAgICByZXR1
cm47CiAgICAgfQogCisgICAgaWYgKCFuZXdDaGlsZC0+aXNJbmxpbmUoKSkgeworICAgICAgICAv
LyBXZSBhcmUgcGxhY2luZyBhIGJsb2NrIGluc2lkZSBhbiBpbmxpbmUuIFdlIGhhdmUgdG8gcGxh
Y2UgdGhlIGJsb2NrIGluc2lkZSBhbiBhbm9ueW1vdXMgaW5saW5lLWJsb2NrLgorICAgICAgICAv
LyBUaGlzIGlubGluZS1ibG9jayBjYW4gaG91c2UgYSBzZXF1ZW5jZSBvZiBjb250aWd1b3VzIGJs
b2NrLWxldmVsIGNoaWxkcmVuLCBhbmQgdGhleSB3aWxsIGFsbCBzaXQgb24gdGhlCisgICAgICAg
IC8vIHNhbWUgbGluZSB0b2dldGhlci4gIFdlIHRyeSB0byByZXVzZSBvbmUgZmlyc3QgaWYgcG9z
c2libGUuCisgICAgICAgIGlmIChiZWZvcmVDaGlsZCkgeworICAgICAgICAgICAgaWYgKGJlZm9y
ZUNoaWxkLT5wcmV2aW91c1NpYmxpbmcoKSAmJiBiZWZvcmVDaGlsZC0+cHJldmlvdXNTaWJsaW5n
KCktPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkgeworICAgICAgICAgICAgICAgIGJlZm9yZUNo
aWxkLT5wcmV2aW91c1NpYmxpbmcoKS0+YWRkQ2hpbGQobmV3Q2hpbGQpOworICAgICAgICAgICAg
ICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg
IGlmIChsYXN0Q2hpbGQoKSAmJiBsYXN0Q2hpbGQoKS0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygp
KSB7CisgICAgICAgICAgICAgICAgbGFzdENoaWxkKCktPmFkZENoaWxkKG5ld0NoaWxkKTsKKyAg
ICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAKKyAgICAg
ICAgaWYgKCFuZXdDaGlsZC0+aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpKSB7CisgICAgICAgICAg
ICAvLyBUaGVyZSB3YXMgbm8gc3VpdGFibGUgZXhpc3RpbmcgYW5vbnltb3VzIGJveC4gIENyZWF0
ZSBhIG5ldyBvbmUuCisgICAgICAgICAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IG5ld1N0eWxlID0g
UmVuZGVyU3R5bGU6OmNyZWF0ZSgpOworICAgICAgICAgICAgbmV3U3R5bGUtPmluaGVyaXRGcm9t
KHN0eWxlKCkpOworICAgICAgICAgICAgbmV3U3R5bGUtPnNldERpc3BsYXkoSU5MSU5FX0JMT0NL
KTsKKyAgICAgICAgICAgIFJlbmRlckJsb2NrKiBuZXdCb3ggPSBuZXcgKHJlbmRlckFyZW5hKCkp
IFJlbmRlckJsb2NrKGRvY3VtZW50KCkpOworICAgICAgICAgICAgbmV3Qm94LT5zZXRTdHlsZShu
ZXdTdHlsZSk7CisgICAgICAgICAgICBSZW5kZXJCb3hNb2RlbE9iamVjdDo6YWRkQ2hpbGQobmV3
Qm94LCBiZWZvcmVDaGlsZCk7CisgICAgICAgICAgICBuZXdCb3gtPmFkZENoaWxkKG5ld0NoaWxk
KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKwogICAgIFJlbmRlckJv
eE1vZGVsT2JqZWN0OjphZGRDaGlsZChuZXdDaGlsZCwgYmVmb3JlQ2hpbGQpOwogCiAgICAgbmV3
Q2hpbGQtPnNldE5lZWRzTGF5b3V0QW5kUHJlZldpZHRoc1JlY2FsYygpOwpAQCAtMjIxLDE4OCAr
MTg2LDYgQEAgUmVuZGVySW5saW5lKiBSZW5kZXJJbmxpbmU6OmNsb25lSW5saW5lKAogICAgIHJl
dHVybiBvOwogfQogCi12b2lkIFJlbmRlcklubGluZTo6c3BsaXRJbmxpbmVzKFJlbmRlckJsb2Nr
KiBmcm9tQmxvY2ssIFJlbmRlckJsb2NrKiB0b0Jsb2NrLAotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBSZW5kZXJCbG9jayogbWlkZGxlQmxvY2ssCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQsIFJlbmRlckJveE1vZGVsT2Jq
ZWN0KiBvbGRDb250KQotewotICAgIC8vIENyZWF0ZSBhIGNsb25lIG9mIHRoaXMgaW5saW5lLgot
ICAgIFJlbmRlcklubGluZSogY2xvbmUgPSBjbG9uZUlubGluZSh0aGlzKTsKLSAgICBjbG9uZS0+
c2V0Q29udGludWF0aW9uKG9sZENvbnQpOwotCi0gICAgLy8gTm93IHRha2UgYWxsIG9mIHRoZSBj
aGlsZHJlbiBmcm9tIGJlZm9yZUNoaWxkIHRvIHRoZSBlbmQgYW5kIHJlbW92ZQotICAgIC8vIHRo
ZW0gZnJvbSB8dGhpc3wgYW5kIHBsYWNlIHRoZW0gaW4gdGhlIGNsb25lLgotICAgIFJlbmRlck9i
amVjdCogbyA9IGJlZm9yZUNoaWxkOwotICAgIHdoaWxlIChvKSB7Ci0gICAgICAgIFJlbmRlck9i
amVjdCogdG1wID0gbzsKLSAgICAgICAgbyA9IHRtcC0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAg
Y2xvbmUtPmFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24oY2hpbGRyZW4oKS0+cmVtb3ZlQ2hp
bGROb2RlKHRoaXMsIHRtcCksIDApOwotICAgICAgICB0bXAtPnNldE5lZWRzTGF5b3V0QW5kUHJl
ZldpZHRoc1JlY2FsYygpOwotICAgIH0KLQotICAgIC8vIEhvb2sgfGNsb25lfCB1cCBhcyB0aGUg
Y29udGludWF0aW9uIG9mIHRoZSBtaWRkbGUgYmxvY2suCi0gICAgbWlkZGxlQmxvY2stPnNldElu
bGluZUNvbnRpbnVhdGlvbihjbG9uZSk7Ci0KLSAgICAvLyBXZSBoYXZlIGJlZW4gcmVwYXJlbnRl
ZCBhbmQgYXJlIG5vdyB1bmRlciB0aGUgZnJvbUJsb2NrLiAgV2UgbmVlZAotICAgIC8vIHRvIHdh
bGsgdXAgb3VyIGlubGluZSBwYXJlbnQgY2hhaW4gdW50aWwgd2UgaGl0IHRoZSBjb250YWluaW5n
IGJsb2NrLgotICAgIC8vIE9uY2Ugd2UgaGl0IHRoZSBjb250YWluaW5nIGJsb2NrIHdlJ3JlIGRv
bmUuCi0gICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGN1cnIgPSB0b1JlbmRlckJveE1vZGVsT2Jq
ZWN0KHBhcmVudCgpKTsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogY3VyckNoaWxkID0gdGhp
czsKLSAgICAKLSAgICAvLyBGSVhNRTogQmVjYXVzZSBzcGxpdHRpbmcgaXMgTyhuXjIpIGFzIHRh
Z3MgbmVzdCBwYXRob2xvZ2ljYWxseSwgd2UgY2FwIHRoZSBkZXB0aCBhdCB3aGljaCB3ZSdyZSB3
aWxsaW5nIHRvIGNsb25lLgotICAgIC8vIFRoZXJlIHdpbGwgZXZlbnR1YWxseSBiZSBhIGJldHRl
ciBhcHByb2FjaCB0byB0aGlzIHByb2JsZW0gdGhhdCB3aWxsIGxldCB1cyBuZXN0IHRvIGEgbXVj
aAotICAgIC8vIGdyZWF0ZXIgZGVwdGggKHNlZSBidWd6aWxsYSBidWcgMTM0MzApIGJ1dCBmb3Ig
bm93IHdlIGhhdmUgYSBsaW1pdC4gIFRoaXMgKndpbGwqIHJlc3VsdCBpbgotICAgIC8vIGluY29y
cmVjdCByZW5kZXJpbmcsIGJ1dCB0aGUgYWx0ZXJuYXRpdmUgaXMgdG8gaGFuZyBmb3JldmVyLgot
ICAgIHVuc2lnbmVkIHNwbGl0RGVwdGggPSAxOwotICAgIGNvbnN0IHVuc2lnbmVkIGNNYXhTcGxp
dERlcHRoID0gMjAwOyAKLSAgICB3aGlsZSAoY3VyciAmJiBjdXJyICE9IGZyb21CbG9jaykgewot
ICAgICAgICBBU1NFUlQoY3Vyci0+aXNSZW5kZXJJbmxpbmUoKSk7Ci0gICAgICAgIGlmIChzcGxp
dERlcHRoIDwgY01heFNwbGl0RGVwdGgpIHsKLSAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBj
bG9uZS4KLSAgICAgICAgICAgIFJlbmRlcklubGluZSogY2xvbmVDaGlsZCA9IGNsb25lOwotICAg
ICAgICAgICAgY2xvbmUgPSBjbG9uZUlubGluZSh0b1JlbmRlcklubGluZShjdXJyKSk7Ci0KLSAg
ICAgICAgICAgIC8vIEluc2VydCBvdXIgY2hpbGQgY2xvbmUgYXMgdGhlIGZpcnN0IGNoaWxkLgot
ICAgICAgICAgICAgY2xvbmUtPmFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24oY2xvbmVDaGls
ZCwgMCk7Ci0KLSAgICAgICAgICAgIC8vIEhvb2sgdGhlIGNsb25lIHVwIGFzIGEgY29udGludWF0
aW9uIG9mIHxjdXJyfC4KLSAgICAgICAgICAgIFJlbmRlcklubGluZSogaW5saW5lQ3VyciA9IHRv
UmVuZGVySW5saW5lKGN1cnIpOwotICAgICAgICAgICAgb2xkQ29udCA9IGlubGluZUN1cnItPmNv
bnRpbnVhdGlvbigpOwotICAgICAgICAgICAgaW5saW5lQ3Vyci0+c2V0Q29udGludWF0aW9uKGNs
b25lKTsKLSAgICAgICAgICAgIGNsb25lLT5zZXRDb250aW51YXRpb24ob2xkQ29udCk7Ci0KLSAg
ICAgICAgICAgIC8vIFNvbWVvbmUgbWF5IGhhdmUgaW5kaXJlY3RseSBjYXVzZWQgYSA8cT4gdG8g
c3BsaXQuICBXaGVuIHRoaXMgaGFwcGVucywgdGhlIDphZnRlciBjb250ZW50Ci0gICAgICAgICAg
ICAvLyBoYXMgdG8gbW92ZSBpbnRvIHRoZSBpbmxpbmUgY29udGludWF0aW9uLiAgQ2FsbCB1cGRh
dGVCZWZvcmVBZnRlckNvbnRlbnQgdG8gZW5zdXJlIHRoYXQgdGhlIGlubGluZSdzIDphZnRlcgot
ICAgICAgICAgICAgLy8gY29udGVudCBnZXRzIHByb3Blcmx5IGRlc3Ryb3llZC4KLSAgICAgICAg
ICAgIGlmIChkb2N1bWVudCgpLT51c2VzQmVmb3JlQWZ0ZXJSdWxlcygpKQotICAgICAgICAgICAg
ICAgIGlubGluZUN1cnItPmNoaWxkcmVuKCktPnVwZGF0ZUJlZm9yZUFmdGVyQ29udGVudCh0aGlz
LCBBRlRFUik7Ci0KLSAgICAgICAgICAgIC8vIE5vdyB3ZSBuZWVkIHRvIHRha2UgYWxsIG9mIHRo
ZSBjaGlsZHJlbiBzdGFydGluZyBmcm9tIHRoZSBmaXJzdCBjaGlsZAotICAgICAgICAgICAgLy8g
KmFmdGVyKiBjdXJyQ2hpbGQgYW5kIGFwcGVuZCB0aGVtIGFsbCB0byB0aGUgY2xvbmUuCi0gICAg
ICAgICAgICBvID0gY3VyckNoaWxkLT5uZXh0U2libGluZygpOwotICAgICAgICAgICAgd2hpbGUg
KG8pIHsKLSAgICAgICAgICAgICAgICBSZW5kZXJPYmplY3QqIHRtcCA9IG87Ci0gICAgICAgICAg
ICAgICAgbyA9IHRtcC0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgICAgICAgICBjbG9uZS0+YWRk
Q2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihpbmxpbmVDdXJyLT5jaGlsZHJlbigpLT5yZW1vdmVD
aGlsZE5vZGUoY3VyciwgdG1wKSwgMCk7Ci0gICAgICAgICAgICAgICAgdG1wLT5zZXROZWVkc0xh
eW91dEFuZFByZWZXaWR0aHNSZWNhbGMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAg
ICAgICAKLSAgICAgICAgLy8gS2VlcCB3YWxraW5nIHVwIHRoZSBjaGFpbi4KLSAgICAgICAgY3Vy
ckNoaWxkID0gY3VycjsKLSAgICAgICAgY3VyciA9IHRvUmVuZGVyQm94TW9kZWxPYmplY3QoY3Vy
ci0+cGFyZW50KCkpOwotICAgICAgICBzcGxpdERlcHRoKys7Ci0gICAgfQotCi0gICAgLy8gTm93
IHdlIGFyZSBhdCB0aGUgYmxvY2sgbGV2ZWwuIFdlIG5lZWQgdG8gcHV0IHRoZSBjbG9uZSBpbnRv
IHRoZSB0b0Jsb2NrLgotICAgIHRvQmxvY2stPmNoaWxkcmVuKCktPmFwcGVuZENoaWxkTm9kZSh0
b0Jsb2NrLCBjbG9uZSk7Ci0KLSAgICAvLyBOb3cgdGFrZSBhbGwgdGhlIGNoaWxkcmVuIGFmdGVy
IGN1cnJDaGlsZCBhbmQgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgZnJvbUJsb2NrCi0gICAgLy8gYW5k
IHB1dCB0aGVtIGluIHRoZSB0b0Jsb2NrLgotICAgIG8gPSBjdXJyQ2hpbGQtPm5leHRTaWJsaW5n
KCk7Ci0gICAgd2hpbGUgKG8pIHsKLSAgICAgICAgUmVuZGVyT2JqZWN0KiB0bXAgPSBvOwotICAg
ICAgICBvID0gdG1wLT5uZXh0U2libGluZygpOwotICAgICAgICB0b0Jsb2NrLT5jaGlsZHJlbigp
LT5hcHBlbmRDaGlsZE5vZGUodG9CbG9jaywgZnJvbUJsb2NrLT5jaGlsZHJlbigpLT5yZW1vdmVD
aGlsZE5vZGUoZnJvbUJsb2NrLCB0bXApKTsKLSAgICB9Ci19Ci0KLXZvaWQgUmVuZGVySW5saW5l
OjpzcGxpdEZsb3coUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCwgUmVuZGVyQmxvY2sqIG5ld0Js
b2NrQm94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXJPYmplY3QqIG5ld0No
aWxkLCBSZW5kZXJCb3hNb2RlbE9iamVjdCogb2xkQ29udCkKLXsKLSAgICBSZW5kZXJCbG9jayog
cHJlID0gMDsKLSAgICBSZW5kZXJCbG9jayogYmxvY2sgPSBjb250YWluaW5nQmxvY2soKTsKLSAg
ICAKLSAgICAvLyBEZWxldGUgb3VyIGxpbmUgYm94ZXMgYmVmb3JlIHdlIGRvIHRoZSBpbmxpbmUg
c3BsaXQgaW50byBjb250aW51YXRpb25zLgotICAgIGJsb2NrLT5kZWxldGVMaW5lQm94VHJlZSgp
OwotICAgIAotICAgIGJvb2wgbWFkZU5ld0JlZm9yZUJsb2NrID0gZmFsc2U7Ci0gICAgaWYgKGJs
b2NrLT5pc0Fub255bW91c0Jsb2NrKCkgJiYgKCFibG9jay0+cGFyZW50KCkgfHwgIWJsb2NrLT5w
YXJlbnQoKS0+Y3JlYXRlc0Fub255bW91c1dyYXBwZXIoKSkpIHsKLSAgICAgICAgLy8gV2UgY2Fu
IHJldXNlIHRoaXMgYmxvY2sgYW5kIG1ha2UgaXQgdGhlIHByZUJsb2NrIG9mIHRoZSBuZXh0IGNv
bnRpbnVhdGlvbi4KLSAgICAgICAgcHJlID0gYmxvY2s7Ci0gICAgICAgIHByZS0+cmVtb3ZlUG9z
aXRpb25lZE9iamVjdHMoMCk7Ci0gICAgICAgIGJsb2NrID0gYmxvY2stPmNvbnRhaW5pbmdCbG9j
aygpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIE5vIGFub255bW91cyBibG9jayBhdmFpbGFi
bGUgZm9yIHVzZS4gIE1ha2Ugb25lLgotICAgICAgICBwcmUgPSBibG9jay0+Y3JlYXRlQW5vbnlt
b3VzQmxvY2soKTsKLSAgICAgICAgbWFkZU5ld0JlZm9yZUJsb2NrID0gdHJ1ZTsKLSAgICB9Ci0K
LSAgICBSZW5kZXJCbG9jayogcG9zdCA9IGJsb2NrLT5jcmVhdGVBbm9ueW1vdXNCbG9jaygpOwot
Ci0gICAgUmVuZGVyT2JqZWN0KiBib3hGaXJzdCA9IG1hZGVOZXdCZWZvcmVCbG9jayA/IGJsb2Nr
LT5maXJzdENoaWxkKCkgOiBwcmUtPm5leHRTaWJsaW5nKCk7Ci0gICAgaWYgKG1hZGVOZXdCZWZv
cmVCbG9jaykKLSAgICAgICAgYmxvY2stPmNoaWxkcmVuKCktPmluc2VydENoaWxkTm9kZShibG9j
aywgcHJlLCBib3hGaXJzdCk7Ci0gICAgYmxvY2stPmNoaWxkcmVuKCktPmluc2VydENoaWxkTm9k
ZShibG9jaywgbmV3QmxvY2tCb3gsIGJveEZpcnN0KTsKLSAgICBibG9jay0+Y2hpbGRyZW4oKS0+
aW5zZXJ0Q2hpbGROb2RlKGJsb2NrLCBwb3N0LCBib3hGaXJzdCk7Ci0gICAgYmxvY2stPnNldENo
aWxkcmVuSW5saW5lKGZhbHNlKTsKLSAgICAKLSAgICBpZiAobWFkZU5ld0JlZm9yZUJsb2NrKSB7
Ci0gICAgICAgIFJlbmRlck9iamVjdCogbyA9IGJveEZpcnN0OwotICAgICAgICB3aGlsZSAobykg
ewotICAgICAgICAgICAgUmVuZGVyT2JqZWN0KiBubyA9IG87Ci0gICAgICAgICAgICBvID0gbm8t
Pm5leHRTaWJsaW5nKCk7Ci0gICAgICAgICAgICBwcmUtPmNoaWxkcmVuKCktPmFwcGVuZENoaWxk
Tm9kZShwcmUsIGJsb2NrLT5jaGlsZHJlbigpLT5yZW1vdmVDaGlsZE5vZGUoYmxvY2ssIG5vKSk7
Ci0gICAgICAgICAgICBuby0+c2V0TmVlZHNMYXlvdXRBbmRQcmVmV2lkdGhzUmVjYWxjKCk7Ci0g
ICAgICAgIH0KLSAgICB9Ci0KLSAgICBzcGxpdElubGluZXMocHJlLCBwb3N0LCBuZXdCbG9ja0Jv
eCwgYmVmb3JlQ2hpbGQsIG9sZENvbnQpOwotCi0gICAgLy8gV2UgYWxyZWFkeSBrbm93IHRoZSBu
ZXdCbG9ja0JveCBpc24ndCBnb2luZyB0byBjb250YWluIGlubGluZSBraWRzLCBzbyBhdm9pZCB3
YXN0aW5nCi0gICAgLy8gdGltZSBpbiBtYWtlQ2hpbGRyZW5Ob25JbmxpbmUgYnkganVzdCBzZXR0
aW5nIHRoaXMgZXhwbGljaXRseSB1cCBmcm9udC4KLSAgICBuZXdCbG9ja0JveC0+c2V0Q2hpbGRy
ZW5JbmxpbmUoZmFsc2UpOwotCi0gICAgLy8gV2UgZGVsYXllZCBhZGRpbmcgdGhlIG5ld0NoaWxk
IHVudGlsIG5vdyBzbyB0aGF0IHRoZSB8bmV3QmxvY2tCb3h8IHdvdWxkIGJlIGZ1bGx5Ci0gICAg
Ly8gY29ubmVjdGVkLCB0aHVzIGFsbG93aW5nIG5ld0NoaWxkIGFjY2VzcyB0byBhIHJlbmRlckFy
ZW5hIHNob3VsZCBpdCBuZWVkCi0gICAgLy8gdG8gd3JhcCBpdHNlbGYgaW4gYWRkaXRpb25hbCBi
b3hlcyAoZS5nLiwgdGFibGUgY29uc3RydWN0aW9uKS4KLSAgICBuZXdCbG9ja0JveC0+YWRkQ2hp
bGQobmV3Q2hpbGQpOwotCi0gICAgLy8gQWx3YXlzIGp1c3QgZG8gYSBmdWxsIGxheW91dCBpbiBv
cmRlciB0byBlbnN1cmUgdGhhdCBsaW5lIGJveGVzIChlc3BlY2lhbGx5IHdyYXBwZXJzIGZvciBp
bWFnZXMpCi0gICAgLy8gZ2V0IGRlbGV0ZWQgcHJvcGVybHkuICBCZWNhdXNlIG9iamVjdHMgbW92
ZXMgZnJvbSB0aGUgcHJlIGJsb2NrIGludG8gdGhlIHBvc3QgYmxvY2ssIHdlIHdhbnQgdG8KLSAg
ICAvLyBtYWtlIG5ldyBsaW5lIGJveGVzIGluc3RlYWQgb2YgbGVhdmluZyB0aGUgb2xkIGxpbmUg
Ym94ZXMgYXJvdW5kLgotICAgIHByZS0+c2V0TmVlZHNMYXlvdXRBbmRQcmVmV2lkdGhzUmVjYWxj
KCk7Ci0gICAgYmxvY2stPnNldE5lZWRzTGF5b3V0QW5kUHJlZldpZHRoc1JlY2FsYygpOwotICAg
IHBvc3QtPnNldE5lZWRzTGF5b3V0QW5kUHJlZldpZHRoc1JlY2FsYygpOwotfQotCi12b2lkIFJl
bmRlcklubGluZTo6YWRkQ2hpbGRUb0NvbnRpbnVhdGlvbihSZW5kZXJPYmplY3QqIG5ld0NoaWxk
LCBSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkKQotewotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0
KiBmbG93ID0gY29udGludWF0aW9uQmVmb3JlKGJlZm9yZUNoaWxkKTsKLSAgICBBU1NFUlQoIWJl
Zm9yZUNoaWxkIHx8IGJlZm9yZUNoaWxkLT5wYXJlbnQoKS0+aXNSZW5kZXJCbG9jaygpIHx8IGJl
Zm9yZUNoaWxkLT5wYXJlbnQoKS0+aXNSZW5kZXJJbmxpbmUoKSk7Ci0gICAgUmVuZGVyQm94TW9k
ZWxPYmplY3QqIGJlZm9yZUNoaWxkUGFyZW50ID0gMDsKLSAgICBpZiAoYmVmb3JlQ2hpbGQpCi0g
ICAgICAgIGJlZm9yZUNoaWxkUGFyZW50ID0gdG9SZW5kZXJCb3hNb2RlbE9iamVjdChiZWZvcmVD
aGlsZC0+cGFyZW50KCkpOwotICAgIGVsc2UgewotICAgICAgICBSZW5kZXJCb3hNb2RlbE9iamVj
dCogY29udCA9IG5leHRDb250aW51YXRpb24oZmxvdyk7Ci0gICAgICAgIGlmIChjb250KQotICAg
ICAgICAgICAgYmVmb3JlQ2hpbGRQYXJlbnQgPSBjb250OwotICAgICAgICBlbHNlCi0gICAgICAg
ICAgICBiZWZvcmVDaGlsZFBhcmVudCA9IGZsb3c7Ci0gICAgfQotCi0gICAgaWYgKG5ld0NoaWxk
LT5pc0Zsb2F0aW5nT3JQb3NpdGlvbmVkKCkpCi0gICAgICAgIHJldHVybiBiZWZvcmVDaGlsZFBh
cmVudC0+YWRkQ2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihuZXdDaGlsZCwgYmVmb3JlQ2hpbGQp
OwotCi0gICAgLy8gQSBjb250aW51YXRpb24gYWx3YXlzIGNvbnNpc3RzIG9mIHR3byBwb3RlbnRp
YWwgY2FuZGlkYXRlczogYW4gaW5saW5lIG9yIGFuIGFub255bW91cwotICAgIC8vIGJsb2NrIGJv
eCBob2xkaW5nIGJsb2NrIGNoaWxkcmVuLgotICAgIGJvb2wgY2hpbGRJbmxpbmUgPSBuZXdDaGls
ZC0+aXNJbmxpbmUoKTsKLSAgICBib29sIGJjcElubGluZSA9IGJlZm9yZUNoaWxkUGFyZW50LT5p
c0lubGluZSgpOwotICAgIGJvb2wgZmxvd0lubGluZSA9IGZsb3ctPmlzSW5saW5lKCk7Ci0KLSAg
ICBpZiAoZmxvdyA9PSBiZWZvcmVDaGlsZFBhcmVudCkKLSAgICAgICAgcmV0dXJuIGZsb3ctPmFk
ZENoaWxkSWdub3JpbmdDb250aW51YXRpb24obmV3Q2hpbGQsIGJlZm9yZUNoaWxkKTsKLSAgICBl
bHNlIHsKLSAgICAgICAgLy8gVGhlIGdvYWwgaGVyZSBpcyB0byBtYXRjaCB1cCBpZiB3ZSBjYW4s
IHNvIHRoYXQgd2UgY2FuIGNvYWxlc2NlIGFuZCBjcmVhdGUgdGhlCi0gICAgICAgIC8vIG1pbmlt
YWwgIyBvZiBjb250aW51YXRpb25zIG5lZWRlZCBmb3IgdGhlIGlubGluZS4KLSAgICAgICAgaWYg
KGNoaWxkSW5saW5lID09IGJjcElubGluZSkKLSAgICAgICAgICAgIHJldHVybiBiZWZvcmVDaGls
ZFBhcmVudC0+YWRkQ2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihuZXdDaGlsZCwgYmVmb3JlQ2hp
bGQpOwotICAgICAgICBlbHNlIGlmIChmbG93SW5saW5lID09IGNoaWxkSW5saW5lKQotICAgICAg
ICAgICAgcmV0dXJuIGZsb3ctPmFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24obmV3Q2hpbGQs
IDApOyAvLyBKdXN0IHRyZWF0IGxpa2UgYW4gYXBwZW5kLgotICAgICAgICBlbHNlCi0gICAgICAg
ICAgICByZXR1cm4gYmVmb3JlQ2hpbGRQYXJlbnQtPmFkZENoaWxkSWdub3JpbmdDb250aW51YXRp
b24obmV3Q2hpbGQsIGJlZm9yZUNoaWxkKTsKLSAgICB9Ci19Ci0KIHZvaWQgUmVuZGVySW5saW5l
OjpwYWludChQYWludEluZm8mIHBhaW50SW5mbywgaW50IHR4LCBpbnQgdHkpCiB7CiAgICAgbV9s
aW5lQm94ZXMucGFpbnQodGhpcywgcGFpbnRJbmZvLCB0eCwgdHkpOwpAQCAtNDE1LDE2ICsxOTgs
NiBAQCB2b2lkIFJlbmRlcklubGluZTo6YWJzb2x1dGVSZWN0cyhWZWN0b3I8CiAgICAgICAgICAg
ICByZWN0cy5hcHBlbmQoSW50UmVjdCh0eCArIGN1cnItPngoKSwgdHkgKyBjdXJyLT55KCksIGN1
cnItPndpZHRoKCksIGN1cnItPmhlaWdodCgpKSk7CiAgICAgfSBlbHNlCiAgICAgICAgIHJlY3Rz
LmFwcGVuZChJbnRSZWN0KHR4LCB0eSwgMCwgMCkpOwotCi0gICAgaWYgKGNvbnRpbnVhdGlvbigp
KSB7Ci0gICAgICAgIGlmIChjb250aW51YXRpb24oKS0+aXNCb3goKSkgewotICAgICAgICAgICAg
UmVuZGVyQm94KiBib3ggPSB0b1JlbmRlckJveChjb250aW51YXRpb24oKSk7Ci0gICAgICAgICAg
ICBjb250aW51YXRpb24oKS0+YWJzb2x1dGVSZWN0cyhyZWN0cywgCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB0eCAtIGNvbnRhaW5pbmdCbG9jaygpLT54KCkgKyBi
b3gtPngoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5IC0g
Y29udGFpbmluZ0Jsb2NrKCktPnkoKSArIGJveC0+eSgpKTsKLSAgICAgICAgfSBlbHNlCi0gICAg
ICAgICAgICBjb250aW51YXRpb24oKS0+YWJzb2x1dGVSZWN0cyhyZWN0cywgdHggLSBjb250YWlu
aW5nQmxvY2soKS0+eCgpLCB0eSAtIGNvbnRhaW5pbmdCbG9jaygpLT55KCkpOwotICAgIH0KIH0K
IAogdm9pZCBSZW5kZXJJbmxpbmU6OmFic29sdXRlUXVhZHMoVmVjdG9yPEZsb2F0UXVhZD4mIHF1
YWRzKQpAQCAtNDM2LDkgKzIwOSw2IEBAIHZvaWQgUmVuZGVySW5saW5lOjphYnNvbHV0ZVF1YWRz
KFZlY3RvcjwKICAgICAgICAgfQogICAgIH0gZWxzZQogICAgICAgICBxdWFkcy5hcHBlbmQobG9j
YWxUb0Fic29sdXRlUXVhZChGbG9hdFJlY3QoKSkpOwotCi0gICAgaWYgKGNvbnRpbnVhdGlvbigp
KQotICAgICAgICBjb250aW51YXRpb24oKS0+YWJzb2x1dGVRdWFkcyhxdWFkcyk7CiB9CiAKIGlu
dCBSZW5kZXJJbmxpbmU6Om9mZnNldExlZnQoKSBjb25zdApAQCAtNTA3LDE4ICsyNzcsNiBAQCBW
aXNpYmxlUG9zaXRpb24gUmVuZGVySW5saW5lOjpwb3NpdGlvbkZvCiAgICAgICAgIC8vIHNob3Vs
ZCB0cnkgdG8gZmluZCBhIHJlc3VsdCBieSBhc2tpbmcgb3VyIGNvbnRhaW5pbmcgYmxvY2suCiAg
ICAgICAgIHJldHVybiBjYi0+cG9zaXRpb25Gb3JQb2ludChwb2ludCk7CiAgICAgfQotCi0gICAg
Ly8gVHJhbnNsYXRlIHRoZSBjb29yZHMgZnJvbSB0aGUgcHJlLWFub255bW91cyBibG9jayB0byB0
aGUgcG9zdC1hbm9ueW1vdXMgYmxvY2suCi0gICAgaW50IHBhcmVudEJsb2NrWCA9IGNiLT54KCkg
KyBwb2ludC54KCk7Ci0gICAgaW50IHBhcmVudEJsb2NrWSA9IGNiLT55KCkgKyBwb2ludC55KCk7
Ci0gICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGMgPSBjb250aW51YXRpb24oKTsKLSAgICB3aGls
ZSAoYykgewotICAgICAgICBSZW5kZXJCb3gqIGNvbnRCbG9jayA9IGMtPmlzSW5saW5lKCkgPyBj
LT5jb250YWluaW5nQmxvY2soKSA6IHRvUmVuZGVyQmxvY2soYyk7Ci0gICAgICAgIGlmIChjLT5p
c0lubGluZSgpIHx8IGMtPmZpcnN0Q2hpbGQoKSkKLSAgICAgICAgICAgIHJldHVybiBjLT5wb3Np
dGlvbkZvckNvb3JkaW5hdGVzKHBhcmVudEJsb2NrWCAtIGNvbnRCbG9jay0+eCgpLCBwYXJlbnRC
bG9ja1kgLSBjb250QmxvY2stPnkoKSk7Ci0gICAgICAgIGMgPSB0b1JlbmRlckJsb2NrKGMpLT5p
bmxpbmVDb250aW51YXRpb24oKTsKLSAgICB9Ci0gICAgCiAgICAgcmV0dXJuIFJlbmRlckJveE1v
ZGVsT2JqZWN0Ojpwb3NpdGlvbkZvclBvaW50KHBvaW50KTsKIH0KIApAQCAtNTcxLDcgKzMyOSw3
IEBAIEludFJlY3QgUmVuZGVySW5saW5lOjpjbGlwcGVkT3ZlcmZsb3dSZWMKICAgICAvLyBPbmx5
IHJ1bi1pbnMgYXJlIGFsbG93ZWQgaW4gaGVyZSBkdXJpbmcgbGF5b3V0LgogICAgIEFTU0VSVCgh
dmlldygpIHx8ICF2aWV3KCktPmxheW91dFN0YXRlRW5hYmxlZCgpIHx8IGlzUnVuSW4oKSk7CiAK
LSAgICBpZiAoIWZpcnN0TGluZUJveCgpICYmICFjb250aW51YXRpb24oKSkKKyAgICBpZiAoIWZp
cnN0TGluZUJveCgpKQogICAgICAgICByZXR1cm4gSW50UmVjdCgpOwogCiAgICAgLy8gRmluZCBv
dXIgbGVmdG1vc3QgcG9zaXRpb24uCkBAIC02MTksMTEgKzM3Nyw2IEBAIEludFJlY3QgUmVuZGVy
SW5saW5lOjpjbGlwcGVkT3ZlcmZsb3dSZWMKICAgICAgICAgICAgICAgICByLnVuaXRlKGNoaWxk
UmVjdCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQotICAgICAgICBpZiAoY29udGludWF0
aW9uKCkgJiYgIWNvbnRpbnVhdGlvbigpLT5pc0lubGluZSgpKSB7Ci0gICAgICAgICAgICBJbnRS
ZWN0IGNvbnRSZWN0ID0gY29udGludWF0aW9uKCktPnJlY3RXaXRoT3V0bGluZUZvclJlcGFpbnQo
cmVwYWludENvbnRhaW5lciwgb3cpOwotICAgICAgICAgICAgci51bml0ZShjb250UmVjdCk7Ci0g
ICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gcjsKQEAgLTc5Niw0OSArNTQ5LDYgQEAgdm9p
ZCBSZW5kZXJJbmxpbmU6Om1hcEFic29sdXRlVG9Mb2NhbFBvaQogICAgICAgICB0cmFuc2Zvcm1T
dGF0ZS5tb3ZlKC1jb250YWluZXJPZmZzZXQud2lkdGgoKSwgLWNvbnRhaW5lck9mZnNldC5oZWln
aHQoKSwgcHJlc2VydmUzRCA/IFRyYW5zZm9ybVN0YXRlOjpBY2N1bXVsYXRlVHJhbnNmb3JtIDog
VHJhbnNmb3JtU3RhdGU6OkZsYXR0ZW5UcmFuc2Zvcm0pOwogfQogCi12b2lkIFJlbmRlcklubGlu
ZTo6dXBkYXRlRHJhZ1N0YXRlKGJvb2wgZHJhZ09uKQotewotICAgIFJlbmRlckJveE1vZGVsT2Jq
ZWN0Ojp1cGRhdGVEcmFnU3RhdGUoZHJhZ09uKTsKLSAgICBpZiAoY29udGludWF0aW9uKCkpCi0g
ICAgICAgIGNvbnRpbnVhdGlvbigpLT51cGRhdGVEcmFnU3RhdGUoZHJhZ09uKTsKLX0KLQotdm9p
ZCBSZW5kZXJJbmxpbmU6OmNoaWxkQmVjYW1lTm9uSW5saW5lKFJlbmRlck9iamVjdCogY2hpbGQp
Ci17Ci0gICAgLy8gV2UgaGF2ZSB0byBzcGxpdCB0aGUgcGFyZW50IGZsb3cuCi0gICAgUmVuZGVy
QmxvY2sqIG5ld0JveCA9IGNvbnRhaW5pbmdCbG9jaygpLT5jcmVhdGVBbm9ueW1vdXNCbG9jaygp
OwotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBvbGRDb250aW51YXRpb24gPSBjb250aW51YXRp
b24oKTsKLSAgICBzZXRDb250aW51YXRpb24obmV3Qm94KTsKLSAgICBSZW5kZXJPYmplY3QqIGJl
Zm9yZUNoaWxkID0gY2hpbGQtPm5leHRTaWJsaW5nKCk7Ci0gICAgY2hpbGRyZW4oKS0+cmVtb3Zl
Q2hpbGROb2RlKHRoaXMsIGNoaWxkKTsKLSAgICBzcGxpdEZsb3coYmVmb3JlQ2hpbGQsIG5ld0Jv
eCwgY2hpbGQsIG9sZENvbnRpbnVhdGlvbik7Ci19Ci0KLXZvaWQgUmVuZGVySW5saW5lOjp1cGRh
dGVIaXRUZXN0UmVzdWx0KEhpdFRlc3RSZXN1bHQmIHJlc3VsdCwgY29uc3QgSW50UG9pbnQmIHBv
aW50KQotewotICAgIGlmIChyZXN1bHQuaW5uZXJOb2RlKCkpCi0gICAgICAgIHJldHVybjsKLQot
ICAgIE5vZGUqIG4gPSBub2RlKCk7Ci0gICAgSW50UG9pbnQgbG9jYWxQb2ludChwb2ludCk7Ci0g
ICAgaWYgKG4pIHsKLSAgICAgICAgaWYgKGlzSW5saW5lQ29udGludWF0aW9uKCkpIHsKLSAgICAg
ICAgICAgIC8vIFdlJ3JlIGluIHRoZSBjb250aW51YXRpb24gb2YgYSBzcGxpdCBpbmxpbmUuICBB
ZGp1c3Qgb3VyIGxvY2FsIHBvaW50IHRvIGJlIGluIHRoZSBjb29yZGluYXRlIHNwYWNlCi0gICAg
ICAgICAgICAvLyBvZiB0aGUgcHJpbmNpcGFsIHJlbmRlcmVyJ3MgY29udGFpbmluZyBibG9jay4g
IFRoaXMgd2lsbCBlbmQgdXAgYmVpbmcgdGhlIGlubmVyTm9uU2hhcmVkTm9kZS4KLSAgICAgICAg
ICAgIFJlbmRlckJsb2NrKiBmaXJzdEJsb2NrID0gbi0+cmVuZGVyZXIoKS0+Y29udGFpbmluZ0Js
b2NrKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEdldCBvdXIgY29udGFpbmluZyBi
bG9jay4KLSAgICAgICAgICAgIFJlbmRlckJveCogYmxvY2sgPSBjb250YWluaW5nQmxvY2soKTsK
LSAgICAgICAgICAgIGxvY2FsUG9pbnQubW92ZShibG9jay0+eCgpIC0gZmlyc3RCbG9jay0+eCgp
LCBibG9jay0+eSgpIC0gZmlyc3RCbG9jay0+eSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJl
c3VsdC5zZXRJbm5lck5vZGUobik7Ci0gICAgICAgIGlmICghcmVzdWx0LmlubmVyTm9uU2hhcmVk
Tm9kZSgpKQotICAgICAgICAgICAgcmVzdWx0LnNldElubmVyTm9uU2hhcmVkTm9kZShuKTsKLSAg
ICAgICAgcmVzdWx0LnNldExvY2FsUG9pbnQobG9jYWxQb2ludCk7Ci0gICAgfQotfQotCiB2b2lk
IFJlbmRlcklubGluZTo6ZGlydHlMaW5lQm94ZXMoYm9vbCBmdWxsTGF5b3V0KQogewogICAgIGlm
IChmdWxsTGF5b3V0KQpAQCAtOTU0LDE3ICs2NjQsNiBAQCB2b2lkIFJlbmRlcklubGluZTo6YWRk
Rm9jdXNSaW5nUmVjdHMoVmVjCiAgICAgICAgICAgIGN1cnItPmFkZEZvY3VzUmluZ1JlY3RzKHJl
Y3RzLCBwb3MueCgpLCBwb3MueSgpKTsKICAgICAgICAgfQogICAgIH0KLQotICAgIGlmIChjb250
aW51YXRpb24oKSkgewotICAgICAgICBpZiAoY29udGludWF0aW9uKCktPmlzSW5saW5lKCkpCi0g
ICAgICAgICAgICBjb250aW51YXRpb24oKS0+YWRkRm9jdXNSaW5nUmVjdHMocmVjdHMsIAotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4IC0gY29udGFpbmlu
Z0Jsb2NrKCktPngoKSArIGNvbnRpbnVhdGlvbigpLT5jb250YWluaW5nQmxvY2soKS0+eCgpLAot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5IC0gY29udGFp
bmluZ0Jsb2NrKCktPnkoKSArIGNvbnRpbnVhdGlvbigpLT5jb250YWluaW5nQmxvY2soKS0+eSgp
KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgY29udGludWF0aW9uKCktPmFkZEZvY3VzUmlu
Z1JlY3RzKHJlY3RzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB0eCAtIGNvbnRhaW5pbmdCbG9jaygpLT54KCkgKyB0b1JlbmRlckJveChjb250aW51YXRp
b24oKSktPngoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICB0eSAtIGNvbnRhaW5pbmdCbG9jaygpLT55KCkgKyB0b1JlbmRlckJveChjb250aW51YXRpb24o
KSktPnkoKSk7Ci0gICAgfQogfQogCiB2b2lkIFJlbmRlcklubGluZTo6cGFpbnRPdXRsaW5lKEdy
YXBoaWNzQ29udGV4dCogZ3JhcGhpY3NDb250ZXh0LCBpbnQgdHgsIGludCB0eSkKSW5kZXg6IFdl
YkNvcmUvcmVuZGVyaW5nL1JlbmRlcklubGluZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlcklubGluZS5oCShyZXZpc2lvbiA1NDUwMSkKKysrIFdlYkNvcmUvcmVuZGVy
aW5nL1JlbmRlcklubGluZS5oCSh3b3JraW5nIGNvcHkpCkBAIC01OCwxMCArNTgsNiBAQCBwdWJs
aWM6CiAKICAgICBJbmxpbmVGbG93Qm94KiBmaXJzdExpbmVCb3goKSBjb25zdCB7IHJldHVybiBt
X2xpbmVCb3hlcy5maXJzdExpbmVCb3goKTsgfQogICAgIElubGluZUZsb3dCb3gqIGxhc3RMaW5l
Qm94KCkgY29uc3QgeyByZXR1cm4gbV9saW5lQm94ZXMubGFzdExpbmVCb3goKTsgfQotCi0gICAg
UmVuZGVyQm94TW9kZWxPYmplY3QqIGNvbnRpbnVhdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1fY29u
dGludWF0aW9uOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlRHJhZ1N0YXRlKGJvb2wgZHJh
Z09uKTsKICAgICAKICAgICBJbnRTaXplIHJlbGF0aXZlUG9zaXRpb25lZElubGluZU9mZnNldChj
b25zdCBSZW5kZXJCb3gqIGNoaWxkKSBjb25zdDsKIApAQCAtODEsOSArNzcsNiBAQCBwcml2YXRl
OgogCiAgICAgdmlydHVhbCBib29sIGlzUmVuZGVySW5saW5lKCkgY29uc3QgeyByZXR1cm4gdHJ1
ZTsgfQogCi0gICAgdm9pZCBhZGRDaGlsZFRvQ29udGludWF0aW9uKFJlbmRlck9iamVjdCogbmV3
Q2hpbGQsIFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQpOwotICAgIHZpcnR1YWwgdm9pZCBhZGRD
aGlsZElnbm9yaW5nQ29udGludWF0aW9uKFJlbmRlck9iamVjdCogbmV3Q2hpbGQsIFJlbmRlck9i
amVjdCogYmVmb3JlQ2hpbGQgPSAwKTsKLQogICAgIHZvaWQgc3BsaXRJbmxpbmVzKFJlbmRlckJs
b2NrKiBmcm9tQmxvY2ssIFJlbmRlckJsb2NrKiB0b0Jsb2NrLCBSZW5kZXJCbG9jayogbWlkZGxl
QmxvY2ssCiAgICAgICAgICAgICAgICAgICAgICAgUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCwg
UmVuZGVyQm94TW9kZWxPYmplY3QqIG9sZENvbnQpOwogICAgIHZvaWQgc3BsaXRGbG93KFJlbmRl
ck9iamVjdCogYmVmb3JlQ2hpbGQsIFJlbmRlckJsb2NrKiBuZXdCbG9ja0JveCwKQEAgLTEyNiwx
MyArMTE5LDggQEAgcHJpdmF0ZToKIAogICAgIHZpcnR1YWwgaW50IGxpbmVIZWlnaHQoYm9vbCBm
aXJzdExpbmUsIGJvb2wgaXNSb290TGluZUJveCA9IGZhbHNlKSBjb25zdDsKIAotICAgIFJlbmRl
cklubGluZSogaW5saW5lQ29udGludWF0aW9uKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRDb250aW51
YXRpb24oUmVuZGVyQm94TW9kZWxPYmplY3QqIGMpIHsgbV9jb250aW51YXRpb24gPSBjOyB9Ci0g
ICAgCiAgICAgdmlydHVhbCB2b2lkIGNoaWxkQmVjYW1lTm9uSW5saW5lKFJlbmRlck9iamVjdCog
Y2hpbGQpOwogCi0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZUhpdFRlc3RSZXN1bHQoSGl0VGVzdFJl
c3VsdCYsIGNvbnN0IEludFBvaW50Jik7Ci0KICAgICB2aXJ0dWFsIHZvaWQgaW1hZ2VDaGFuZ2Vk
KFdyYXBwZWRJbWFnZVB0ciwgY29uc3QgSW50UmVjdCogPSAwKTsKIAogI2lmIEVOQUJMRShEQVNI
Qk9BUkRfU1VQUE9SVCkKQEAgLTE0NSwxMyArMTMzLDEwIEBAIHByaXZhdGU6CiAgICAgc3RhdGlj
IFJlbmRlcklubGluZSogY2xvbmVJbmxpbmUoUmVuZGVySW5saW5lKiBzcmMpOwogCiAgICAgdm9p
ZCBwYWludE91dGxpbmVGb3JMaW5lKEdyYXBoaWNzQ29udGV4dCosIGludCB0eCwgaW50IHR5LCBj
b25zdCBJbnRSZWN0JiBwcmV2TGluZSwgY29uc3QgSW50UmVjdCYgdGhpc0xpbmUsIGNvbnN0IElu
dFJlY3QmIG5leHRMaW5lKTsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogY29udGludWF0aW9u
QmVmb3JlKFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQpOwogCiAgICAgUmVuZGVyT2JqZWN0Q2hp
bGRMaXN0IG1fY2hpbGRyZW47CiAgICAgUmVuZGVyTGluZUJveExpc3QgbV9saW5lQm94ZXM7ICAg
Ly8gQWxsIG9mIHRoZSBsaW5lIGJveGVzIGNyZWF0ZWQgZm9yIHRoaXMgaW5saW5lIGZsb3cuICBG
b3IgZXhhbXBsZSwgPGk+SGVsbG88YnI+d29ybGQuPC9pPiB3aWxsIGhhdmUgdHdvIDxpPiBsaW5l
IGJveGVzLgogCi0gICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIG1fY29udGludWF0aW9uOyAvLyBD
YW4gYmUgZWl0aGVyIGEgYmxvY2sgb3IgYW4gaW5saW5lLiA8Yj48aT48cD5IZWxsbzwvcD48L2k+
PC9iPi4gSW4gdGhpcyBleGFtcGxlIHRoZSA8aT4gd2lsbCBoYXZlIGEgYmxvY2sgYXMgaXRzIGNv
bnRpbnVhdGlvbiBidXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAvLyA8Yj4gd2lsbCBqdXN0IGhhdmUgYW4gaW5saW5lIGFzIGl0cyBjb250aW51YXRpb24u
CiAgICAgbXV0YWJsZSBpbnQgbV9saW5lSGVpZ2h0OwogICAgIG11dGFibGUgaW50IG1fdmVydGlj
YWxQb3NpdGlvbjsKIH07CkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMaW5lQm94TGlz
dC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGluZUJveExpc3Qu
Y3BwCShyZXZpc2lvbiA1NDUwMSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckxpbmVCb3hM
aXN0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTQ2LDE4ICsxNDYsMTggQEAgdm9pZCBSZW5kZXJM
aW5lQm94TGlzdDo6ZGlydHlMaW5lQm94ZXMoKQogCiB2b2lkIFJlbmRlckxpbmVCb3hMaXN0Ojpw
YWludChSZW5kZXJCb3hNb2RlbE9iamVjdCogcmVuZGVyZXIsIFJlbmRlck9iamVjdDo6UGFpbnRJ
bmZvJiBwYWludEluZm8sIGludCB0eCwgaW50IHR5KSBjb25zdAogewotICAgIC8vIE9ubHkgcGFp
bnQgZHVyaW5nIHRoZSBmb3JlZ3JvdW5kL3NlbGVjdGlvbiBwaGFzZXMuCi0gICAgaWYgKHBhaW50
SW5mby5waGFzZSAhPSBQYWludFBoYXNlRm9yZWdyb3VuZCAmJiBwYWludEluZm8ucGhhc2UgIT0g
UGFpbnRQaGFzZVNlbGVjdGlvbiAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZU91dGxp
bmUgCi0gICAgICAgICYmIHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlU2VsZk91dGxpbmUg
JiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VDaGlsZE91dGxpbmVzICYmIHBhaW50SW5m
by5waGFzZSAhPSBQYWludFBoYXNlVGV4dENsaXAKLSAgICAgICAgJiYgcGFpbnRJbmZvLnBoYXNl
ICE9IFBhaW50UGhhc2VNYXNrKQotICAgICAgICByZXR1cm47Ci0KICAgICBBU1NFUlQocmVuZGVy
ZXItPmlzUmVuZGVyQmxvY2soKSB8fCAocmVuZGVyZXItPmlzUmVuZGVySW5saW5lKCkgJiYgcmVu
ZGVyZXItPmhhc0xheWVyKCkpKTsgLy8gVGhlIG9ubHkgd2F5IGFuIGlubGluZSBjb3VsZCBwYWlu
dCBsaWtlIHRoaXMgaXMgaWYgaXQgaGFzIGEgbGF5ZXIuCiAKICAgICAvLyBJZiB3ZSBoYXZlIG5v
IGxpbmVzIHRoZW4gd2UgaGF2ZSBubyB3b3JrIHRvIGRvLgogICAgIGlmICghZmlyc3RMaW5lQm94
KCkpCiAgICAgICAgIHJldHVybjsKIAorICAgIC8vIE9ubHkgcGFpbnQgZHVyaW5nIHRoZSBmb3Jl
Z3JvdW5kL3NlbGVjdGlvbiBwaGFzZXMgaWYgd2UgaGF2ZSBhIGxheWVyLiAgT3RoZXJ3aXNlIHdl
IG1pZ2h0IGhhdmUgYW4gYW5vbnltb3VzIGlubGluZSBibG9jaywgc28gd2UgY2FuJ3Qgc2hvcnQg
Y2lyY3VpdC4KKyAgICBpZiAoZmlyc3RMaW5lQm94KCktPnBhcmVudCgpICYmIChwYWludEluZm8u
cGhhc2UgIT0gUGFpbnRQaGFzZUZvcmVncm91bmQgJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50
UGhhc2VTZWxlY3Rpb24gJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VPdXRsaW5lIAor
ICAgICAgICAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZVNlbGZPdXRsaW5lICYmIHBh
aW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlQ2hpbGRPdXRsaW5lcyAmJiBwYWludEluZm8ucGhh
c2UgIT0gUGFpbnRQaGFzZVRleHRDbGlwCisgICAgICAgICYmIHBhaW50SW5mby5waGFzZSAhPSBQ
YWludFBoYXNlTWFzaykpCisgICAgICAgIHJldHVybjsKKwogICAgIC8vIFdlIGNhbiBjaGVjayB0
aGUgZmlyc3QgYm94IGFuZCBsYXN0IGJveCBhbmQgYXZvaWQgcGFpbnRpbmcgaWYgd2UgZG9uJ3QK
ICAgICAvLyBpbnRlcnNlY3QuICBUaGlzIGlzIGEgcXVpY2sgc2hvcnQtY2lyY3VpdCB0aGF0IHdl
IGNhbiB0YWtlIHRvIGF2b2lkIHdhbGtpbmcgYW55IGxpbmVzLgogICAgIC8vIEZJWE1FOiBUaGlz
IGNoZWNrIGlzIGZsYXdlZCBpbiB0aGUgZm9sbG93aW5nIGV4dHJlbWVseSBvYnNjdXJlIHdheToK
QEAgLTIyNiw2ICsyMjYsNyBAQCBib29sIFJlbmRlckxpbmVCb3hMaXN0OjpoaXRUZXN0KFJlbmRl
ckJvCiAgICAgaWYgKCFmaXJzdExpbmVCb3goKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwogCisg
ICAgCiAgICAgLy8gV2UgY2FuIGNoZWNrIHRoZSBmaXJzdCBib3ggYW5kIGxhc3QgYm94IGFuZCBh
dm9pZCBoaXQgdGVzdGluZyBpZiB3ZSBkb24ndAogICAgIC8vIGNvbnRhaW4gdGhlIHBvaW50LiAg
VGhpcyBpcyBhIHF1aWNrIHNob3J0LWNpcmN1aXQgdGhhdCB3ZSBjYW4gdGFrZSB0byBhdm9pZCB3
YWxraW5nIGFueSBsaW5lcy4KICAgICAvLyBGSVhNRTogVGhpcyBjaGVjayBpcyBmbGF3ZWQgaW4g
dGhlIGZvbGxvd2luZyBleHRyZW1lbHkgb2JzY3VyZSB3YXk6CkluZGV4OiBXZWJDb3JlL3JlbmRl
cmluZy9SZW5kZXJMaXN0SXRlbS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcv
UmVuZGVyTGlzdEl0ZW0uY3BwCShyZXZpc2lvbiA1NDUwMSkKKysrIFdlYkNvcmUvcmVuZGVyaW5n
L1JlbmRlckxpc3RJdGVtLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjcsNiArMjcsOCBAQAogI2lu
Y2x1ZGUgIkNhY2hlZEltYWdlLmgiCiAjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCiAjaW5jbHVkZSAi
SFRNTE9MaXN0RWxlbWVudC5oIgorI2luY2x1ZGUgIklubGluZUl0ZXJhdG9yLmgiCisKICNpbmNs
dWRlICJSZW5kZXJMaXN0TWFya2VyLmgiCiAjaW5jbHVkZSAiUmVuZGVyVmlldy5oIgogI2luY2x1
ZGUgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KQEAgLTE1MywxOCArMTU1LDQ0IEBAIGJvb2wgUmVuZGVy
TGlzdEl0ZW06OmlzRW1wdHkoKSBjb25zdAogICAgIHJldHVybiBsYXN0Q2hpbGQoKSA9PSBtX21h
cmtlcjsKIH0KIAotc3RhdGljIFJlbmRlck9iamVjdCogZ2V0UGFyZW50T2ZGaXJzdExpbmVCb3go
UmVuZGVyQmxvY2sqIGN1cnIsIFJlbmRlck9iamVjdCogbWFya2VyKQordm9pZCBSZW5kZXJMaXN0
SXRlbTo6dXBkYXRlVmFsdWUoKQogewotICAgIFJlbmRlck9iamVjdCogZmlyc3RDaGlsZCA9IGN1
cnItPmZpcnN0Q2hpbGQoKTsKLSAgICBpZiAoIWZpcnN0Q2hpbGQpCi0gICAgICAgIHJldHVybiAw
OworICAgIGlmICghbV9oYXNFeHBsaWNpdFZhbHVlKSB7CisgICAgICAgIG1faXNWYWx1ZVVwVG9E
YXRlID0gZmFsc2U7CisgICAgICAgIGlmIChtX21hcmtlcikKKyAgICAgICAgICAgIG1fbWFya2Vy
LT5zZXROZWVkc0xheW91dEFuZFByZWZXaWR0aHNSZWNhbGMoKTsKKyAgICB9Cit9CiAKLSAgICBm
b3IgKFJlbmRlck9iamVjdCogY3VyckNoaWxkID0gZmlyc3RDaGlsZDsgY3VyckNoaWxkOyBjdXJy
Q2hpbGQgPSBjdXJyQ2hpbGQtPm5leHRTaWJsaW5nKCkpIHsKK3N0YXRpYyBSZW5kZXJPYmplY3Qq
IGZpcnN0Tm9uTWFya2VyQ2hpbGQoUmVuZGVyT2JqZWN0KiBwYXJlbnQpCit7CisgICAgUmVuZGVy
T2JqZWN0KiByZXN1bHQgPSBwYXJlbnQtPmZpcnN0Q2hpbGQoKTsKKyAgICB3aGlsZSAocmVzdWx0
ICYmIHJlc3VsdC0+aXNMaXN0TWFya2VyKCkpCisgICAgICAgIHJlc3VsdCA9IHJlc3VsdC0+bmV4
dFNpYmxpbmcoKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyBSZW5kZXJCbG9j
ayogbGlzdE1hcmtlckxvY2F0aW9uKFJlbmRlckJsb2NrKiBibG9jaywgUmVuZGVyTGlzdE1hcmtl
ciogbWFya2VyKQoreworICAgIGZvciAoUmVuZGVyT2JqZWN0KiBjdXJyQ2hpbGQgPSBibG9jay0+
Zmlyc3RDaGlsZCgpOyBjdXJyQ2hpbGQ7IGN1cnJDaGlsZCA9IGN1cnJDaGlsZC0+bmV4dFNpYmxp
bmcoKSkgewogICAgICAgICBpZiAoY3VyckNoaWxkID09IG1hcmtlcikKICAgICAgICAgICAgIGNv
bnRpbnVlOwogCi0gICAgICAgIGlmIChjdXJyQ2hpbGQtPmlzSW5saW5lKCkgJiYgKCFjdXJyQ2hp
bGQtPmlzUmVuZGVySW5saW5lKCkgfHwgY3Vyci0+Z2VuZXJhdGVzTGluZUJveGVzRm9ySW5saW5l
Q2hpbGQoY3VyckNoaWxkKSkpCi0gICAgICAgICAgICByZXR1cm4gY3VycjsKKyAgICAgICAgaWYg
KGN1cnJDaGlsZC0+aXNJbmxpbmUoKSkgeworICAgICAgICAgICAgaWYgKCFjdXJyQ2hpbGQtPmlz
UmVuZGVySW5saW5lKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGJsb2NrOworICAgICAgICAg
ICAgSW5saW5lSXRlcmF0b3IgaXQoYmxvY2ssIGN1cnJDaGlsZCwgMCk7CisgICAgICAgICAgICB3
aGlsZSAoIWl0LmF0RW5kKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXQub2JqLT5pc0Fub255
bW91c0lubGluZUJsb2NrKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgUmVuZGVyQmxvY2sqIGxp
bmVCb3hQYXJlbnQgPSBsaXN0TWFya2VyTG9jYXRpb24odG9SZW5kZXJCbG9jayhpdC5vYmopLCBt
YXJrZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAobGluZUJveFBhcmVudCkKKyAgICAgICAg
ICAgICAgICAgICAgICAgIHJldHVybiBsaW5lQm94UGFyZW50OworICAgICAgICAgICAgICAgIH0g
ZWxzZSBpZiAoUmVuZGVyQmxvY2s6OnJlcXVpcmVzTGluZUJveChpdCkpCisgICAgICAgICAgICAg
ICAgICAgIHJldHVybiBibG9jazsKKyAgICAgICAgICAgICAgICBpdC5pbmNyZW1lbnQoKTsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgfQogCiAgICAgICAgIGlmIChjdXJyQ2hpbGQtPmlzRmxvYXRp
bmcoKSB8fCBjdXJyQ2hpbGQtPmlzUG9zaXRpb25lZCgpKQogICAgICAgICAgICAgY29udGludWU7
CkBAIC0xNzIsNDEgKzIwMCwyNCBAQCBzdGF0aWMgUmVuZGVyT2JqZWN0KiBnZXRQYXJlbnRPZkZp
cnN0TGluCiAgICAgICAgIGlmIChjdXJyQ2hpbGQtPmlzVGFibGUoKSB8fCAhY3VyckNoaWxkLT5p
c1JlbmRlckJsb2NrKCkpCiAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBpZiAoY3Vyci0+
aXNMaXN0SXRlbSgpICYmIGN1cnJDaGlsZC0+c3R5bGUoKS0+aHRtbEhhY2tzKCkgJiYgY3VyckNo
aWxkLT5ub2RlKCkgJiYKLSAgICAgICAgICAgIChjdXJyQ2hpbGQtPm5vZGUoKS0+aGFzVGFnTmFt
ZSh1bFRhZyl8fCBjdXJyQ2hpbGQtPm5vZGUoKS0+aGFzVGFnTmFtZShvbFRhZykpKQorICAgICAg
ICBpZiAoYmxvY2stPmlzTGlzdEl0ZW0oKSAmJiBjdXJyQ2hpbGQtPnN0eWxlKCktPmh0bWxIYWNr
cygpICYmIGN1cnJDaGlsZC0+bm9kZSgpICYmCisgICAgICAgICAgICAoY3VyckNoaWxkLT5ub2Rl
KCktPmhhc1RhZ05hbWUodWxUYWcpIHx8IGN1cnJDaGlsZC0+bm9kZSgpLT5oYXNUYWdOYW1lKG9s
VGFnKSkpCiAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBSZW5kZXJPYmplY3QqIGxpbmVC
b3ggPSBnZXRQYXJlbnRPZkZpcnN0TGluZUJveCh0b1JlbmRlckJsb2NrKGN1cnJDaGlsZCksIG1h
cmtlcik7Ci0gICAgICAgIGlmIChsaW5lQm94KQotICAgICAgICAgICAgcmV0dXJuIGxpbmVCb3g7
CisgICAgICAgIFJlbmRlckJsb2NrKiBsaW5lQm94UGFyZW50ID0gbGlzdE1hcmtlckxvY2F0aW9u
KHRvUmVuZGVyQmxvY2soY3VyckNoaWxkKSwgbWFya2VyKTsKKyAgICAgICAgaWYgKGxpbmVCb3hQ
YXJlbnQpCisgICAgICAgICAgICByZXR1cm4gbGluZUJveFBhcmVudDsKICAgICB9CiAKICAgICBy
ZXR1cm4gMDsKIH0KIAotdm9pZCBSZW5kZXJMaXN0SXRlbTo6dXBkYXRlVmFsdWUoKQotewotICAg
IGlmICghbV9oYXNFeHBsaWNpdFZhbHVlKSB7Ci0gICAgICAgIG1faXNWYWx1ZVVwVG9EYXRlID0g
ZmFsc2U7Ci0gICAgICAgIGlmIChtX21hcmtlcikKLSAgICAgICAgICAgIG1fbWFya2VyLT5zZXRO
ZWVkc0xheW91dEFuZFByZWZXaWR0aHNSZWNhbGMoKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBSZW5k
ZXJPYmplY3QqIGZpcnN0Tm9uTWFya2VyQ2hpbGQoUmVuZGVyT2JqZWN0KiBwYXJlbnQpCi17Ci0g
ICAgUmVuZGVyT2JqZWN0KiByZXN1bHQgPSBwYXJlbnQtPmZpcnN0Q2hpbGQoKTsKLSAgICB3aGls
ZSAocmVzdWx0ICYmIHJlc3VsdC0+aXNMaXN0TWFya2VyKCkpCi0gICAgICAgIHJlc3VsdCA9IHJl
c3VsdC0+bmV4dFNpYmxpbmcoKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCiB2b2lkIFJlbmRl
ckxpc3RJdGVtOjp1cGRhdGVNYXJrZXJMb2NhdGlvbigpCiB7CiAgICAgLy8gU2FuaXR5IGNoZWNr
IHRoZSBsb2NhdGlvbiBvZiBvdXIgbWFya2VyLgogICAgIGlmIChtX21hcmtlcikgewogICAgICAg
ICBSZW5kZXJPYmplY3QqIG1hcmtlclBhciA9IG1fbWFya2VyLT5wYXJlbnQoKTsKLSAgICAgICAg
UmVuZGVyT2JqZWN0KiBsaW5lQm94UGFyZW50ID0gZ2V0UGFyZW50T2ZGaXJzdExpbmVCb3godGhp
cywgbV9tYXJrZXIpOworICAgICAgICBSZW5kZXJPYmplY3QqIGxpbmVCb3hQYXJlbnQgPSBsaXN0
TWFya2VyTG9jYXRpb24odGhpcywgbV9tYXJrZXIpOwogICAgICAgICBpZiAoIWxpbmVCb3hQYXJl
bnQpIHsKICAgICAgICAgICAgIC8vIElmIHRoZSBtYXJrZXIgaXMgY3VycmVudGx5IGNvbnRhaW5l
ZCBpbnNpZGUgYW4gYW5vbnltb3VzIGJveCwKICAgICAgICAgICAgIC8vIHRoZW4gd2UgYXJlIHRo
ZSBvbmx5IGl0ZW0gaW4gdGhhdCBhbm9ueW1vdXMgYm94IChzaW5jZSBubyBsaW5lIGJveApAQCAt
MjU3LDkgKzI2OCwxMSBAQCB2b2lkIFJlbmRlckxpc3RJdGVtOjpwb3NpdGlvbkxpc3RNYXJrZXIo
CiAgICAgICAgIGludCBtYXJrZXJPbGRYID0gbV9tYXJrZXItPngoKTsKICAgICAgICAgaW50IHlP
ZmZzZXQgPSAwOwogICAgICAgICBpbnQgeE9mZnNldCA9IDA7Ci0gICAgICAgIGZvciAoUmVuZGVy
Qm94KiBvID0gbV9tYXJrZXItPnBhcmVudEJveCgpOyBvICE9IHRoaXM7IG8gPSBvLT5wYXJlbnRC
b3goKSkgewotICAgICAgICAgICAgeU9mZnNldCArPSBvLT55KCk7Ci0gICAgICAgICAgICB4T2Zm
c2V0ICs9IG8tPngoKTsKKyAgICAgICAgZm9yIChSZW5kZXJPYmplY3QqIG8gPSBtX21hcmtlci0+
cGFyZW50KCk7IG8gIT0gdGhpczsgbyA9IG8tPnBhcmVudCgpKSB7CisgICAgICAgICAgICBpZiAo
by0+aXNCb3goKSkgeworICAgICAgICAgICAgICAgIHlPZmZzZXQgKz0gdG9SZW5kZXJCb3gobykt
PnkoKTsKKyAgICAgICAgICAgICAgICB4T2Zmc2V0ICs9IHRvUmVuZGVyQm94KG8pLT54KCk7Cisg
ICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBib29sIGFkanVzdE92ZXJmbG93ID0g
ZmFsc2U7CkBAIC0yOTUsMTMgKzMwOCwxNCBAQCB2b2lkIFJlbmRlckxpc3RJdGVtOjpwb3NpdGlv
bkxpc3RNYXJrZXIoCiAKICAgICAgICAgaWYgKGFkanVzdE92ZXJmbG93KSB7CiAgICAgICAgICAg
ICBJbnRSZWN0IG1hcmtlclJlY3QobWFya2VyWFBvcyArIHhPZmZzZXQsIHlPZmZzZXQsIG1fbWFy
a2VyLT53aWR0aCgpLCBtX21hcmtlci0+aGVpZ2h0KCkpOwotICAgICAgICAgICAgUmVuZGVyQm94
KiBvID0gbV9tYXJrZXI7CisgICAgICAgICAgICBSZW5kZXJPYmplY3QqIG8gPSBtX21hcmtlcjsK
ICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBvID0gby0+cGFyZW50Qm94KCk7Cisg
ICAgICAgICAgICAgICAgbyA9IG8tPnBhcmVudCgpOwogICAgICAgICAgICAgICAgIGlmIChvLT5p
c1JlbmRlckJsb2NrKCkpCiAgICAgICAgICAgICAgICAgICAgIHRvUmVuZGVyQmxvY2sobyktPmFk
ZExheW91dE92ZXJmbG93KG1hcmtlclJlY3QpOwotICAgICAgICAgICAgICAgIG1hcmtlclJlY3Qu
bW92ZSgtby0+eCgpLCAtby0+eSgpKTsKLSAgICAgICAgICAgIH0gd2hpbGUgKG8gIT0gdGhpcyAm
JiAhby0+aGFzU2VsZlBhaW50aW5nTGF5ZXIoKSk7CisgICAgICAgICAgICAgICAgaWYgKG8tPmlz
Qm94KCkpCisgICAgICAgICAgICAgICAgICAgIG1hcmtlclJlY3QubW92ZSgtdG9SZW5kZXJCb3go
byktPngoKSwgLXRvUmVuZGVyQm94KG8pLT55KCkpOworICAgICAgICAgICAgfSB3aGlsZSAobyAh
PSB0aGlzICYmICghby0+aXNCb3goKSB8fCAhdG9SZW5kZXJCb3gobyktPmhhc1NlbGZQYWludGlu
Z0xheWVyKCkpKTsgLy8gRklYTUU6IEludmVzdGlnYXRlIDxsaT48c3BhbiBzdHlsZT0icG9zaXRp
b246cmVsYXRpdmU7bGVmdDotMTAwcHgiPjxkaXY+dGV4dDwvZGl2Pjwvc3Bhbj48L2xpPgogICAg
ICAgICB9CiAgICAgfQogfQpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3QuY3BwCShyZXZp
c2lvbiA1NDUwMSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdC5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTIyMjEsOCArMjIyMSw2IEBAIHZvaWQgUmVuZGVyT2JqZWN0OjpnZXRUZXh0
RGVjb3JhdGlvbkNvbG8KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBjdXJyID0g
Y3Vyci0+cGFyZW50KCk7Ci0gICAgICAgIGlmIChjdXJyICYmIGN1cnItPmlzUmVuZGVyQmxvY2so
KSAmJiB0b1JlbmRlckJsb2NrKGN1cnIpLT5pbmxpbmVDb250aW51YXRpb24oKSkKLSAgICAgICAg
ICAgIGN1cnIgPSB0b1JlbmRlckJsb2NrKGN1cnIpLT5pbmxpbmVDb250aW51YXRpb24oKTsKICAg
ICB9IHdoaWxlIChjdXJyICYmIGRlY29yYXRpb25zICYmICghcXVpcmtzTW9kZSB8fCAhY3Vyci0+
bm9kZSgpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFjdXJyLT5u
b2RlKCktPmhhc1RhZ05hbWUoYVRhZykgJiYgIWN1cnItPm5vZGUoKS0+aGFzVGFnTmFtZShmb250
VGFnKSkpKTsKIApJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmgJKHJldmlzaW9uIDU0NTAx
KQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmgJKHdvcmtpbmcgY29weSkKQEAg
LTM2NSw2ICszNjUsMTAgQEAgcHVibGljOgogICAgIHsKICAgICAgICAgcmV0dXJuIG1faXNBbm9u
eW1vdXMgJiYgc3R5bGUoKS0+ZGlzcGxheSgpID09IEJMT0NLICYmIHN0eWxlKCktPnN0eWxlVHlw
ZSgpID09IE5PUFNFVURPICYmICFpc0xpc3RNYXJrZXIoKTsKICAgICB9CisgICAgYm9vbCBpc0Fu
b255bW91c0lubGluZUJsb2NrKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX2lzQW5v
bnltb3VzICYmIHN0eWxlKCktPmRpc3BsYXkoKSA9PSBJTkxJTkVfQkxPQ0sgJiYgc3R5bGUoKS0+
c3R5bGVUeXBlKCkgPT0gTk9QU0VVRE8gJiYgIWlzUnVieVJ1bigpICYmICFpc1J1YnlCYXNlKCk7
CisgICAgfQogICAgIGJvb2wgaXNJbmxpbmVDb250aW51YXRpb24oKSBjb25zdCB7IHJldHVybiAo
bm9kZSgpID8gbm9kZSgpLT5yZW5kZXJlcigpICE9IHRoaXMgOiBmYWxzZSkgJiYgaXNSZW5kZXJJ
bmxpbmUoKTsgfQogICAgIGJvb2wgaXNGbG9hdGluZygpIGNvbnN0IHsgcmV0dXJuIG1fZmxvYXRp
bmc7IH0KICAgICBib29sIGlzUG9zaXRpb25lZCgpIGNvbnN0IHsgcmV0dXJuIG1fcG9zaXRpb25l
ZDsgfSAvLyBhYnNvbHV0ZSBvciBmaXhlZCBwb3NpdGlvbmluZwpJbmRleDogV2ViQ29yZS9yZW5k
ZXJpbmcvUmVuZGVyT2JqZWN0Q2hpbGRMaXN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3Jl
bmRlcmluZy9SZW5kZXJPYmplY3RDaGlsZExpc3QuY3BwCShyZXZpc2lvbiA1NDUwMSkKKysrIFdl
YkNvcmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdENoaWxkTGlzdC5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTMxNiwxNiArMzE2LDYgQEAgdm9pZCBSZW5kZXJPYmplY3RDaGlsZExpc3Q6OnVwZGF0ZUJl
Zm9yZQogCiAgICAgLy8gV2hldGhlciBvciBub3Qgd2Ugbm93IHdhbnQgZ2VuZXJhdGVkIGNvbnRl
bnQuICAKICAgICBib29sIG5ld0NvbnRlbnRXYW50ZWQgPSBwc2V1ZG9FbGVtZW50U3R5bGUgJiYg
cHNldWRvRWxlbWVudFN0eWxlLT5kaXNwbGF5KCkgIT0gTk9ORTsKLQotICAgIC8vIEZvciA8cT48
cC8+PC9xPiwgaWYgdGhpcyBvYmplY3QgaXMgdGhlIGlubGluZSBjb250aW51YXRpb24gb2YgdGhl
IDxxPiwgd2Ugb25seSB3YW50IHRvIGdlbmVyYXRlCi0gICAgLy8gOmFmdGVyIGNvbnRlbnQgYW5k
IG5vdCA6YmVmb3JlIGNvbnRlbnQuCi0gICAgaWYgKG5ld0NvbnRlbnRXYW50ZWQgJiYgdHlwZSA9
PSBCRUZPUkUgJiYgb3duZXItPmlzUmVuZGVySW5saW5lKCkgJiYgdG9SZW5kZXJJbmxpbmUob3du
ZXIpLT5pc0lubGluZUNvbnRpbnVhdGlvbigpKQotICAgICAgICBuZXdDb250ZW50V2FudGVkID0g
ZmFsc2U7Ci0KLSAgICAvLyBTaW1pbGFybHksIGlmIHdlJ3JlIHRoZSBiZWdpbm5pbmcgb2YgYSA8
cT4sIGFuZCB0aGVyZSdzIGFuIGlubGluZSBjb250aW51YXRpb24gZm9yIG91ciBvYmplY3QsCi0g
ICAgLy8gdGhlbiB3ZSBkb24ndCBnZW5lcmF0ZSB0aGUgOmFmdGVyIGNvbnRlbnQuCi0gICAgaWYg
KG5ld0NvbnRlbnRXYW50ZWQgJiYgdHlwZSA9PSBBRlRFUiAmJiBvd25lci0+aXNSZW5kZXJJbmxp
bmUoKSAmJiB0b1JlbmRlcklubGluZShvd25lciktPmNvbnRpbnVhdGlvbigpKQotICAgICAgICBu
ZXdDb250ZW50V2FudGVkID0gZmFsc2U7CiAgICAgCiAgICAgLy8gSWYgd2UgZG9uJ3Qgd2FudCBn
ZW5lcmF0ZWQgY29udGVudCBhbnkgbG9uZ2VyLCBvciBpZiB3ZSBoYXZlIGdlbmVyYXRlZCBjb250
ZW50LCBidXQgaXQncyBubyBsb25nZXIKICAgICAvLyBpZGVudGljYWwgdG8gdGhlIG5ldyBjb250
ZW50IGRhdGEgd2Ugd2FudCB0byBidWlsZCByZW5kZXIgb2JqZWN0cyBmb3IsIHRoZW4gd2UgbnVr
ZSBhbGwKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclJ1YnlCYXNlLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJSdWJ5QmFzZS5jcHAJKHJldmlzaW9uIDU0
NTAxKQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyUnVieUJhc2UuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0xMTYsNyArMTE2LDYgQEAgdm9pZCBSZW5kZXJSdWJ5QmFzZTo6bW92ZUJsb2NrQ2hp
bGRyZW4oUgogICAgICAgICAgICAgICAgIGlmIChjaGlsZC0+aXNBbm9ueW1vdXNCbG9jaygpKSB7
CiAgICAgICAgICAgICAgICAgICAgIFJlbmRlckJsb2NrKiBhbm9uQmxvY2sgPSB0b1JlbmRlckJs
b2NrKGNoaWxkKTsKICAgICAgICAgICAgICAgICAgICAgQVNTRVJUKGFub25CbG9jay0+Y2hpbGRy
ZW5JbmxpbmUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIEFTU0VSVCghYW5vbkJsb2NrLT5pbmxp
bmVDb250aW51YXRpb24oKSk7CiAgICAgICAgICAgICAgICAgICAgIGFub25CbG9jay0+bW92ZUFs
bENoaWxkcmVuVG8odG9CYXNlLCB0b0Jhc2UtPmNoaWxkcmVuKCkpOwogICAgICAgICAgICAgICAg
ICAgICBhbm9uQmxvY2stPmRlbGV0ZUxpbmVCb3hUcmVlKCk7CiAgICAgICAgICAgICAgICAgICAg
IGFub25CbG9jay0+ZGVzdHJveSgpOwpAQCAtMTQzLDcgKzE0Miw2IEBAIHZvaWQgUmVuZGVyUnVi
eUJhc2U6Om1vdmVCbG9ja0NoaWxkcmVuKFIKIAogICAgICAgICAgICAgICAgICAgICBSZW5kZXJC
bG9jayogYW5vbkJsb2NrID0gdG9SZW5kZXJCbG9jayhjaGlsZCk7CiAgICAgICAgICAgICAgICAg
ICAgIEFTU0VSVChhbm9uQmxvY2stPmNoaWxkcmVuSW5saW5lKCkpOwotICAgICAgICAgICAgICAg
ICAgICBBU1NFUlQoIWFub25CbG9jay0+aW5saW5lQ29udGludWF0aW9uKCkpOwogICAgICAgICAg
ICAgICAgICAgICAvLyBNb3ZlIGlubGluZSBjaGlsZHJlbiBvdXQgb2YgYW5vbnltb3VzIGJsb2Nr
LgogICAgICAgICAgICAgICAgICAgICBhbm9uQmxvY2stPm1vdmVBbGxDaGlsZHJlblRvKHRoaXMs
IGNoaWxkcmVuKCksIGFub25CbG9jayk7CiAgICAgICAgICAgICAgICAgICAgIGFub25CbG9jay0+
ZGVsZXRlTGluZUJveFRyZWUoKTsKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1Jvb3RJbmxpbmVC
b3guY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1Jvb3RJbmxpbmVCb3guY3Bw
CShyZXZpc2lvbiA1NDUwMSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1Jvb3RJbmxpbmVCb3guY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSAiUGFnZS5oIgogI2lu
Y2x1ZGUgIlJlbmRlckFyZW5hLmgiCiAjaW5jbHVkZSAiUmVuZGVyQmxvY2suaCIKKyNpbmNsdWRl
ICJSZW5kZXJWaWV3LmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKQEAgLTE2Myw2ICsxNjQs
NDYgQEAgdm9pZCBSb290SW5saW5lQm94OjpwYWludEN1c3RvbUhpZ2hsaWdodAogCiB2b2lkIFJv
b3RJbmxpbmVCb3g6OnBhaW50KFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGlu
dCB0eCwgaW50IHR5KQogeworICAgIFJlbmRlckJsb2NrKiBjaGlsZCA9IGFub255bW91c0lubGlu
ZUJsb2NrKCk7CisgICAgaWYgKGNoaWxkKSB7CisgICAgICAgIC8vIFRyZWF0IHBhaW50aW5nIG9m
IGEgc3BlY2lhbCBpbmxpbmUtYmxvY2sgbGluZSBsaWtlIHRoZSBwYWludGluZyBvZiBhIG5vcm1h
bCBibG9jayBhbmQgZ28gdGhyb3VnaCBhbGwgcGhhc2VzLgorICAgICAgICBQYWludFBoYXNlIG5l
d1BoYXNlID0gKHBhaW50SW5mby5waGFzZSA9PSBQYWludFBoYXNlQ2hpbGRPdXRsaW5lcykgPyBQ
YWludFBoYXNlT3V0bGluZSA6IHBhaW50SW5mby5waGFzZTsKKyAgICAgICAgbmV3UGhhc2UgPSAo
bmV3UGhhc2UgPT0gUGFpbnRQaGFzZUNoaWxkQmxvY2tCYWNrZ3JvdW5kcykgPyBQYWludFBoYXNl
Q2hpbGRCbG9ja0JhY2tncm91bmQgOiBuZXdQaGFzZTsKKyAgICAKKyAgICAgICAgLy8gV2UgZG9u
J3QgcGFpbnQgb3VyIG93biBiYWNrZ3JvdW5kLCBidXQgd2UgZG8gbGV0IHRoZSBjaGlsZCBwYWlu
dCBpdHMgYmFja2dyb3VuZC4KKyAgICAgICAgUmVuZGVyT2JqZWN0OjpQYWludEluZm8gaW5mbyhw
YWludEluZm8pOworICAgICAgICBpbmZvLnBoYXNlID0gbmV3UGhhc2U7CisgICAgICAgIGluZm8u
cGFpbnRpbmdSb290ID0gcmVuZGVyZXIoKS0+cGFpbnRpbmdSb290Rm9yQ2hpbGRyZW4ocGFpbnRJ
bmZvKTsKKyAgICAgICAgYm9vbCBpc1ByaW50aW5nID0gcmVuZGVyZXIoKS0+ZG9jdW1lbnQoKS0+
cHJpbnRpbmcoKTsKKyAgICAgICAgCisgICAgICAgIC8vIENoZWNrIGZvciBwYWdlLWJyZWFrLWJl
Zm9yZTogYWx3YXlzLCBhbmQgaWYgaXQncyBzZXQsIGJyZWFrIGFuZCBiYWlsLgorICAgICAgICBp
ZiAoaXNQcmludGluZyAmJiBjaGlsZC0+c3R5bGUoKS0+cGFnZUJyZWFrQmVmb3JlKCkgPT0gUEJB
TFdBWVMgJiYKKyAgICAgICAgICAgIGJsb2NrKCktPmluUm9vdEJsb2NrQ29udGV4dCgpICYmICh0
eSArIGNoaWxkLT55KCkpID4gcGFpbnRJbmZvLnJlY3QueSgpICYmIAorICAgICAgICAgICAgKHR5
ICsgY2hpbGQtPnkoKSkgPCBwYWludEluZm8ucmVjdC5ib3R0b20oKSkgeworICAgICAgICAgICAg
cmVuZGVyZXIoKS0+dmlldygpLT5zZXRCZXN0VHJ1bmNhdGVkQXQodHkgKyBjaGlsZC0+eSgpLCBi
bG9jaygpLCB0cnVlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAg
IGlmICghY2hpbGQtPmhhc1NlbGZQYWludGluZ0xheWVyKCkpCisgICAgICAgICAgICBjaGlsZC0+
cGFpbnQoaW5mbywgdHgsIHR5KTsKKworICAgICAgICAvLyBDaGVjayBmb3IgcGFnZS1icmVhay1h
ZnRlcjogYWx3YXlzLCBhbmQgaWYgaXQncyBzZXQsIGJyZWFrIGFuZCBiYWlsLgorICAgICAgICBp
ZiAoaXNQcmludGluZyAmJiBjaGlsZC0+c3R5bGUoKS0+cGFnZUJyZWFrQWZ0ZXIoKSA9PSBQQkFM
V0FZUyAmJiAKKyAgICAgICAgICAgIGJsb2NrKCktPmluUm9vdEJsb2NrQ29udGV4dCgpICYmICh0
eSArIGNoaWxkLT55KCkgKyBjaGlsZC0+aGVpZ2h0KCkpID4gcGFpbnRJbmZvLnJlY3QueSgpICYm
IAorICAgICAgICAgICAgKHR5ICsgY2hpbGQtPnkoKSArIGNoaWxkLT5oZWlnaHQoKSkgPCBwYWlu
dEluZm8ucmVjdC5ib3R0b20oKSkgeworICAgICAgICAgICAgcmVuZGVyZXIoKS0+dmlldygpLT5z
ZXRCZXN0VHJ1bmNhdGVkQXQodHkgKyBjaGlsZC0+eSgpICsgY2hpbGQtPmhlaWdodCgpICsgbWF4
KDAsIGNoaWxkLT5jb2xsYXBzZWRNYXJnaW5Cb3R0b20oKSksIGJsb2NrKCksIHRydWUpOworICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm47Cisg
ICAgfQorCisgICAgLy8gT25seSBwYWludCBkdXJpbmcgdGhlIGZvcmVncm91bmQvc2VsZWN0aW9u
IHBoYXNlcyBpZiB3ZSBkb24ndCBoYXZlIGEgc3BlY2lhbCBhbm9ueW1vdXMgaW5saW5lIGJsb2Nr
LgorICAgIGlmIChwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZUZvcmVncm91bmQgJiYgcGFp
bnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VTZWxlY3Rpb24gJiYgcGFpbnRJbmZvLnBoYXNlICE9
IFBhaW50UGhhc2VPdXRsaW5lIAorICAgICAgICAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQ
aGFzZVNlbGZPdXRsaW5lICYmIHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlQ2hpbGRPdXRs
aW5lcyAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZVRleHRDbGlwCisgICAgICAgICYm
IHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlTWFzaykKKyAgICAgICAgcmV0dXJuOworCiAg
ICAgSW5saW5lRmxvd0JveDo6cGFpbnQocGFpbnRJbmZvLCB0eCwgdHkpOwogICAgIHBhaW50RWxs
aXBzaXNCb3gocGFpbnRJbmZvLCB0eCwgdHkpOwogI2lmIFBMQVRGT1JNKE1BQykKQEAgLTIwNCw2
ICsyNDUsMTcgQEAgdm9pZCBSb290SW5saW5lQm94OjpjaGlsZFJlbW92ZWQoSW5saW5lQgogCiBp
bnQgUm9vdElubGluZUJveDo6dmVydGljYWxseUFsaWduQm94ZXMoaW50IGhlaWdodE9mQmxvY2sp
CiB7CisgICAgUmVuZGVyQmxvY2sqIGlubGluZUJsb2NrID0gYW5vbnltb3VzSW5saW5lQmxvY2so
KTsKKyAgICBpZiAoaW5saW5lQmxvY2spIHsKKyAgICAgICAgaW50IGxpbmVUb3AgPSBpbmxpbmVC
bG9jay0+eSgpOworICAgICAgICBpbnQgbGluZUJvdHRvbSA9IGlubGluZUJsb2NrLT55KCkgKyBp
bmxpbmVCbG9jay0+aGVpZ2h0KCk7CisgICAgICAgIGZpcnN0Q2hpbGQoKS0+c2V0WShsaW5lVG9w
KTsKKyAgICAgICAgc2V0WShsaW5lVG9wKTsKKyAgICAgICAgY29tcHV0ZVZlcnRpY2FsT3ZlcmZs
b3cobGluZVRvcCwgbGluZUJvdHRvbSwgdHJ1ZSk7CisgICAgICAgIHNldExpbmVUb3BCb3R0b21Q
b3NpdGlvbnMobGluZVRvcCwgbGluZUJvdHRvbSk7CisgICAgICAgIHJldHVybiBoZWlnaHRPZkJs
b2NrOworICAgIH0KKyAgICAKICAgICBpbnQgbWF4UG9zaXRpb25Ub3AgPSAwOwogICAgIGludCBt
YXhQb3NpdGlvbkJvdHRvbSA9IDA7CiAgICAgaW50IG1heEFzY2VudCA9IDA7CkBAIC0yMTcsNyAr
MjY5LDYgQEAgaW50IFJvb3RJbmxpbmVCb3g6OnZlcnRpY2FsbHlBbGlnbkJveGVzKAogICAgIGJv
b2wgc3RyaWN0TW9kZSA9IChjdXJyICYmIGN1cnItPmRvY3VtZW50KCktPmluU3RyaWN0TW9kZSgp
KTsKIAogICAgIGNvbXB1dGVMb2dpY2FsQm94SGVpZ2h0cyhtYXhQb3NpdGlvblRvcCwgbWF4UG9z
aXRpb25Cb3R0b20sIG1heEFzY2VudCwgbWF4RGVzY2VudCwgc3RyaWN0TW9kZSk7Ci0KICAgICBp
ZiAobWF4QXNjZW50ICsgbWF4RGVzY2VudCA8IG1heChtYXhQb3NpdGlvblRvcCwgbWF4UG9zaXRp
b25Cb3R0b20pKQogICAgICAgICBhZGp1c3RNYXhBc2NlbnRBbmREZXNjZW50KG1heEFzY2VudCwg
bWF4RGVzY2VudCwgbWF4UG9zaXRpb25Ub3AsIG1heFBvc2l0aW9uQm90dG9tKTsKIApAQCAtNDMw
LDQgKzQ4MSw5IEBAIHZvaWQgUm9vdElubGluZUJveDo6YXR0YWNoTGluZUJveFRvUmVuZGUKICAg
ICBibG9jaygpLT5saW5lQm94ZXMoKS0+YXR0YWNoTGluZUJveCh0aGlzKTsKIH0KIAorUmVuZGVy
QmxvY2sqIFJvb3RJbmxpbmVCb3g6OmFub255bW91c0lubGluZUJsb2NrKCkgY29uc3QKK3sKKyAg
ICByZXR1cm4gZmlyc3RDaGlsZCgpICYmIGZpcnN0Q2hpbGQoKSA9PSBsYXN0Q2hpbGQoKSAmJiAh
Zmlyc3RDaGlsZCgpLT5pc1RleHQoKSAmJiBmaXJzdENoaWxkKCktPnJlbmRlcmVyKCktPmlzQW5v
bnltb3VzSW5saW5lQmxvY2soKSA/IHRvUmVuZGVyQmxvY2soZmlyc3RDaGlsZCgpLT5yZW5kZXJl
cigpKSA6IDA7Cit9CisKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcmVu
ZGVyaW5nL1Jvb3RJbmxpbmVCb3guaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9S
b290SW5saW5lQm94LmgJKHJldmlzaW9uIDU0NTAxKQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUm9v
dElubGluZUJveC5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMzIsNiArMTMyLDggQEAgcHVibGljOgog
ICAgIHZpcnR1YWwgdm9pZCBhdHRhY2hMaW5lQm94VG9SZW5kZXJPYmplY3QoKTsKICAgICB2aXJ0
dWFsIHZvaWQgcmVtb3ZlTGluZUJveEZyb21SZW5kZXJPYmplY3QoKTsKIAorICAgIFJlbmRlckJs
b2NrKiBhbm9ueW1vdXNJbmxpbmVCbG9jaygpIGNvbnN0OworCiBwcm90ZWN0ZWQ6CiAgICAgLy8g
V2hlcmUgdGhpcyBsaW5lIGVuZGVkLiAgVGhlIGV4YWN0IG9iamVjdCBhbmQgdGhlIHBvc2l0aW9u
IHdpdGhpbiB0aGF0IG9iamVjdCBhcmUgc3RvcmVkIHNvIHRoYXQKICAgICAvLyB3ZSBjYW4gY3Jl
YXRlIGFuIElubGluZUl0ZXJhdG9yIGJlZ2lubmluZyBqdXN0IGFmdGVyIHRoZSBlbmQgb2YgdGhp
cyBsaW5lLgo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>48449</attachid>
            <date>2010-02-09 15:44:12 -0800</date>
            <delta_ts>2010-02-10 13:10:34 -0800</delta_ts>
            <desc>Fixes to hit testing and selection painting.</desc>
            <filename>patch.txt</filename>
            <type>text/plain</type>
            <size>140422</size>
            <attacher name="Dave Hyatt">hyatt</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShyZXZpc2lv
biA1NDU2MSkKKysrIFdlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCSh3
b3JraW5nIGNvcHkpCkBAIC00NTQ4LDYgKzQ1NDgsOSBAQAogCQlCQ0U2NUJFQTBFQUNERjE2MDA3
RTQ1MzMgLyogTGVuZ3RoLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IEJDRTY1QkU4MEVBQ0RGMTYwMDdFNDUzMyAvKiBMZW5ndGguY3BwICovOyB9Owog
CQlCQ0U2NUJFQjBFQUNERjE2MDA3RTQ1MzMgLyogTGVuZ3RoLmggaW4gSGVhZGVycyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCQ0U2NUJFOTBFQUNERjE2MDA3RTQ1MzMgLyog
TGVuZ3RoLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsK
IAkJQkNFNjVEMzIwRUFEMTIxMTAwN0U0NTMzIC8qIFRoZW1lLmNwcCBpbiBTb3VyY2VzICovID0g
e2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJDRTY1RDMxMEVBRDEyMTEwMDdFNDUzMyAv
KiBUaGVtZS5jcHAgKi87IH07CisJCUJDRTc4OTE2MTEyMEQ2MDgwMDYwRUNFNSAvKiBJbmxpbmVJ
dGVyYXRvci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
QkNFNzg5MTUxMTIwRDYwODAwNjBFQ0U1IC8qIElubGluZUl0ZXJhdG9yLmggKi87IH07CisJCUJD
RTc4OTg2MTEyMEU3QTYwMDYwRUNFNSAvKiBCaWRpUnVuLmggaW4gSGVhZGVycyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCQ0U3ODk4NTExMjBFN0E2MDA2MEVDRTUgLyogQmlk
aVJ1bi5oICovOyB9OworCQlCQ0U3ODk4QjExMjBFODAyMDA2MEVDRTUgLyogQmlkaVJ1bi5jcHAg
aW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCQ0U3ODk4QTEx
MjBFODAyMDA2MEVDRTUgLyogQmlkaVJ1bi5jcHAgKi87IH07CiAJCUJDRTdCMTkzMEQ0RTg2OTYw
MDc1QTUzOSAvKiBKU0hpc3RvcnlDdXN0b20uY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gQkNFN0IxOTIwRDRFODY5NjAwNzVBNTM5IC8qIEpTSGlzdG9y
eUN1c3RvbS5jcHAgKi87IH07CiAJCUJDRTk5RUMzMERDQTYyNDEwMDE4MjY4MyAvKiBKU1hTTFRQ
cm9jZXNzb3JDb25zdHJ1Y3Rvci5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSBCQ0U5OUVDMTBEQ0E2MjQxMDAxODI2ODMgLyogSlNYU0xUUHJvY2Vzc29y
Q29uc3RydWN0b3IuY3BwICovOyB9OwogCQlCQ0U5OUVDNDBEQ0E2MjQxMDAxODI2ODMgLyogSlNY
U0xUUHJvY2Vzc29yQ29uc3RydWN0b3IuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IEJDRTk5RUMyMERDQTYyNDEwMDE4MjY4MyAvKiBKU1hTTFRQcm9jZXNz
b3JDb25zdHJ1Y3Rvci5oICovOyB9OwpAQCAtOTgxMCw2ICs5ODEzLDkgQEAKIAkJQkNFNjVCRTgw
RUFDREYxNjAwN0U0NTMzIC8qIExlbmd0aC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5j
cHA7IHBhdGggPSBMZW5ndGguY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlCQ0U2
NUJFOTBFQUNERjE2MDA3RTQ1MzMgLyogTGVuZ3RoLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMu
aDsgcGF0aCA9IExlbmd0aC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlCQ0U2NUQz
MTBFQUQxMjExMDA3RTQ1MzMgLyogVGhlbWUuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAu
Y3BwOyBwYXRoID0gVGhlbWUuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlCQ0U3
ODkxNTExMjBENjA4MDA2MEVDRTUgLyogSW5saW5lSXRlcmF0b3IuaCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuYy5oOyBwYXRoID0gSW5saW5lSXRlcmF0b3IuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+
IjsgfTsKKwkJQkNFNzg5ODUxMTIwRTdBNjAwNjBFQ0U1IC8qIEJpZGlSdW4uaCAqLyA9IHtpc2Eg
PSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9
IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQmlkaVJ1bi5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OworCQlCQ0U3ODk4QTExMjBFODAyMDA2MEVDRTUgLyogQmlkaVJ1bi5jcHAgKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUg
PSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBCaWRpUnVuLmNwcDsgc291cmNlVHJlZSA9ICI8
Z3JvdXA+IjsgfTsKIAkJQkNFN0IxOTIwRDRFODY5NjAwNzVBNTM5IC8qIEpTSGlzdG9yeUN1c3Rv
bS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFz
dEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBKU0hpc3RvcnlDdXN0
b20uY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlCQ0U5OUVDMTBEQ0E2MjQxMDAx
ODI2ODMgLyogSlNYU0xUUHJvY2Vzc29yQ29uc3RydWN0b3IuY3BwICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jcHAuY3BwOyBwYXRoID0gSlNYU0xUUHJvY2Vzc29yQ29uc3RydWN0b3IuY3BwOyBzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlCQ0U5OUVDMjBEQ0E2MjQxMDAxODI2ODMgLyogSlNY
U0xUUHJvY2Vzc29yQ29uc3RydWN0b3IuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBm
aWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRo
ID0gSlNYU0xUUHJvY2Vzc29yQ29uc3RydWN0b3IuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKQEAgLTE1NTU2LDYgKzE1NTYyLDggQEAKIAkJCQlCQzhDOEZBQTBERENEMkYyMDBCNTkyRjQg
Lyogc3R5bGUgKi8sCiAJCQkJQThDRkYwNEIwQTE1NEYwOTAwMEE0MjM0IC8qIEF1dG9UYWJsZUxh
eW91dC5jcHAgKi8sCiAJCQkJQThDRkYwNDkwQTE1NEYwOTAwMEE0MjM0IC8qIEF1dG9UYWJsZUxh
eW91dC5oICovLAorCQkJCUJDRTc4OThBMTEyMEU4MDIwMDYwRUNFNSAvKiBCaWRpUnVuLmNwcCAq
LywKKwkJCQlCQ0U3ODk4NTExMjBFN0E2MDA2MEVDRTUgLyogQmlkaVJ1bi5oICovLAogCQkJCUJD
RUE0ODE1MDk3RDkzMDIwMDk0QzlFNCAvKiBicmVha19saW5lcy5jcHAgKi8sCiAJCQkJQkNFQTQ4
MTYwOTdEOTMwMjAwOTRDOUU0IC8qIGJyZWFrX2xpbmVzLmggKi8sCiAJCQkJOTM5MkYxNEYwQUQx
ODYyMzAwNjkxQkQ0IC8qIENvdW50ZXJOb2RlLmNwcCAqLywKQEAgLTE1NTcyLDYgKzE1NTgwLDcg
QEAKIAkJCQlBOENGRjVERTBBMTU1QTA1MDAwQTQyMzQgLyogSW5saW5lQm94LmggKi8sCiAJCQkJ
QThDRkY1REQwQTE1NUEwNTAwMEE0MjM0IC8qIElubGluZUZsb3dCb3guY3BwICovLAogCQkJCUE4
Q0ZGNURDMEExNTVBMDUwMDBBNDIzNCAvKiBJbmxpbmVGbG93Qm94LmggKi8sCisJCQkJQkNFNzg5
MTUxMTIwRDYwODAwNjBFQ0U1IC8qIElubGluZUl0ZXJhdG9yLmggKi8sCiAJCQkJQThDRkY1REIw
QTE1NUEwNTAwMEE0MjM0IC8qIElubGluZVJ1bkJveC5oICovLAogCQkJCUJDRUE0ODFBMDk3RDkz
MDIwMDk0QzlFNCAvKiBJbmxpbmVUZXh0Qm94LmNwcCAqLywKIAkJCQlCQ0VBNDgxQjA5N0Q5MzAy
MDA5NEM5RTQgLyogSW5saW5lVGV4dEJveC5oICovLApAQCAtMTg1MDUsNiArMTg1MTQsOCBAQAog
CQkJCUI3MUZFNkRGMTEwOTFDQjMwMERBRUY3NyAvKiBQcmludENvbnRleHQuaCBpbiBIZWFkZXJz
ICovLAogCQkJCTlGNzIzMDRGMTExODRCNDEwMEFEMDEyNiAvKiBTY3JpcHRQcm9maWxlLmggaW4g
SGVhZGVycyAqLywKIAkJCQk5RjcyMzA1MTExMTg0QjQxMDBBRDAxMjYgLyogU2NyaXB0UHJvZmls
ZXIuaCBpbiBIZWFkZXJzICovLAorCQkJCUJDRTc4OTE2MTEyMEQ2MDgwMDYwRUNFNSAvKiBJbmxp
bmVJdGVyYXRvci5oIGluIEhlYWRlcnMgKi8sCisJCQkJQkNFNzg5ODYxMTIwRTdBNjAwNjBFQ0U1
IC8qIEJpZGlSdW4uaCBpbiBIZWFkZXJzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBsb3lt
ZW50UG9zdHByb2Nlc3NpbmcgPSAwOwogCQl9OwpAQCAtMjA2ODMsNiArMjA2OTQsNyBAQAogCQkJ
CTg0RDBDNDA0MTExNUYxRDQwMDE4QUEzNCAvKiBBZmZpbmVUcmFuc2Zvcm0uY3BwIGluIFNvdXJj
ZXMgKi8sCiAJCQkJQjc3NkQ0M0QxMTA0NTI3NTAwQkVCMEVDIC8qIFByaW50Q29udGV4dC5jcHAg
aW4gU291cmNlcyAqLywKIAkJCQk5RjcyMzA1MDExMTg0QjQxMDBBRDAxMjYgLyogU2NyaXB0UHJv
ZmlsZXIuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJQkNFNzg5OEIxMTIwRTgwMjAwNjBFQ0U1IC8q
IEJpZGlSdW4uY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkpOwogCQkJcnVuT25seUZvckRlcGxveW1l
bnRQb3N0cHJvY2Vzc2luZyA9IDA7CiAJCX07CkluZGV4OiBXZWJDb3JlL2FjY2Vzc2liaWxpdHkv
QWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9hY2Nl
c3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3QuY3BwCShyZXZpc2lvbiA1NDU2MSkK
KysrIFdlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0LmNwcAko
d29ya2luZyBjb3B5KQpAQCAtNTY3LDEyICs1NjcsOCBAQCBFbGVtZW50KiBBY2Nlc3NpYmlsaXR5
UmVuZGVyT2JqZWN0OjphbmNoCiAgICAgUmVuZGVyT2JqZWN0KiBjdXJyUmVuZGVyZXI7CiAgICAg
CiAgICAgLy8gU2VhcmNoIHVwIHRoZSByZW5kZXIgdHJlZSBmb3IgYSBSZW5kZXJPYmplY3Qgd2l0
aCBhIERPTSBub2RlLiAgRGVmZXIgdG8gYW4gZWFybGllciBjb250aW51YXRpb24sIHRob3VnaC4K
LSAgICBmb3IgKGN1cnJSZW5kZXJlciA9IG1fcmVuZGVyZXI7IGN1cnJSZW5kZXJlciAmJiAhY3Vy
clJlbmRlcmVyLT5ub2RlKCk7IGN1cnJSZW5kZXJlciA9IGN1cnJSZW5kZXJlci0+cGFyZW50KCkp
IHsKLSAgICAgICAgaWYgKGN1cnJSZW5kZXJlci0+aXNSZW5kZXJCbG9jaygpKSB7Ci0gICAgICAg
ICAgICBSZW5kZXJJbmxpbmUqIGNvbnRpbnVhdGlvbiA9IHRvUmVuZGVyQmxvY2soY3VyclJlbmRl
cmVyKS0+aW5saW5lQ29udGludWF0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoY29udGludWF0aW9u
KQotICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZS0+Z2V0T3JDcmVhdGUoY29udGludWF0aW9u
KS0+YW5jaG9yRWxlbWVudCgpOwotICAgICAgICB9CisgICAgZm9yIChjdXJyUmVuZGVyZXIgPSBt
X3JlbmRlcmVyOyBjdXJyUmVuZGVyZXIgJiYgIWN1cnJSZW5kZXJlci0+bm9kZSgpOyBjdXJyUmVu
ZGVyZXIgPSBjdXJyUmVuZGVyZXItPnBhcmVudCgpKQorICAgIHsKICAgICB9CiAgICAgCiAgICAg
Ly8gYmFpbCBpZiBub25lIGZvdW5kCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9CaWRpUnVuLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9CaWRpUnVuLmNwcAkocmV2aXNpb24g
MCkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL0JpZGlSdW4uY3BwCShyZXZpc2lvbiAwKQpAQCAtMCww
ICsxLDc0IEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMTk5OSBMYXJzIEtub2xsIChrbm9sbEBr
ZGUub3JnKQorICogICAgICAgICAgIChDKSAxOTk5IEFudHRpIEtvaXZpc3RvIChrb2l2aXN0b0Br
ZGUub3JnKQorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDEwIEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBBbmRy
ZXcgV2VsbGluZ3RvbiAocHJvdG9uQHdpcmV0YXBwZWQubmV0KQorICoKKyAqIFRoaXMgbGlicmFy
eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1v
ZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
CisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
OyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9u
KSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQg
aW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBX
QVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFO
VEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdO
VQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisg
KgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0
aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisg
KiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgIkJpZGlSdW4uaCIKKyNpbmNsdWRlICJJbmxpbmVCb3guaCIKKyNpbmNs
dWRlICJSZW5kZXJBcmVuYS5oIgorI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkTGVha0NvdW50ZXIu
aD4KKwordXNpbmcgbmFtZXNwYWNlIFdURjsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisjaWZu
ZGVmIE5ERUJVRworc3RhdGljIFJlZkNvdW50ZWRMZWFrQ291bnRlciBiaWRpUnVuQ291bnRlcigi
QmlkaVJ1biIpOworCitzdGF0aWMgYm9vbCBpbkJpZGlSdW5EZXN0cm95OworI2VuZGlmCisKK3Zv
aWQgQmlkaVJ1bjo6ZGVzdHJveSgpCit7CisjaWZuZGVmIE5ERUJVRworICAgIGluQmlkaVJ1bkRl
c3Ryb3kgPSB0cnVlOworI2VuZGlmCisgICAgUmVuZGVyQXJlbmEqIHJlbmRlckFyZW5hID0gbV9v
YmplY3QtPnJlbmRlckFyZW5hKCk7CisgICAgZGVsZXRlIHRoaXM7CisjaWZuZGVmIE5ERUJVRwor
ICAgIGluQmlkaVJ1bkRlc3Ryb3kgPSBmYWxzZTsKKyNlbmRpZgorCisgICAgLy8gUmVjb3ZlciB0
aGUgc2l6ZSBsZWZ0IHRoZXJlIGZvciB1cyBieSBvcGVyYXRvciBkZWxldGUgYW5kIGZyZWUgdGhl
IG1lbW9yeS4KKyAgICByZW5kZXJBcmVuYS0+ZnJlZSgqcmVpbnRlcnByZXRfY2FzdDxzaXplX3Qq
Pih0aGlzKSwgdGhpcyk7Cit9CisKK3ZvaWQqIEJpZGlSdW46Om9wZXJhdG9yIG5ldyhzaXplX3Qg
c3osIFJlbmRlckFyZW5hKiByZW5kZXJBcmVuYSkgdGhyb3coKQoreworI2lmbmRlZiBOREVCVUcK
KyAgICBiaWRpUnVuQ291bnRlci5pbmNyZW1lbnQoKTsKKyNlbmRpZgorICAgIHJldHVybiByZW5k
ZXJBcmVuYS0+YWxsb2NhdGUoc3opOworfQorCit2b2lkIEJpZGlSdW46Om9wZXJhdG9yIGRlbGV0
ZSh2b2lkKiBwdHIsIHNpemVfdCBzeikKK3sKKyNpZm5kZWYgTkRFQlVHCisgICAgYmlkaVJ1bkNv
dW50ZXIuZGVjcmVtZW50KCk7CisjZW5kaWYKKyAgICBBU1NFUlQoaW5CaWRpUnVuRGVzdHJveSk7
CisKKyAgICAvLyBTdGFzaCBzaXplIHdoZXJlIGRlc3Ryb3koKSBjYW4gZmluZCBpdC4KKyAgICAq
KHNpemVfdCopcHRyID0gc3o7Cit9CisKK30KSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL0JpZGlS
dW4uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9CaWRpUnVuLmgJKHJldmlzaW9u
IDApCisrKyBXZWJDb3JlL3JlbmRlcmluZy9CaWRpUnVuLmgJKHJldmlzaW9uIDApCkBAIC0wLDAg
KzEsNjYgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAxOTk5IExhcnMgS25vbGwgKGtub2xsQGtk
ZS5vcmcpCisgKiAgICAgICAgICAgKEMpIDE5OTkgQW50dGkgS29pdmlzdG8gKGtvaXZpc3RvQGtk
ZS5vcmcpCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMTAgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA2IEFuZHJl
dyBXZWxsaW5ndG9uIChwcm90b25Ad2lyZXRhcHBlZC5uZXQpCisgKgorICogVGhpcyBsaWJyYXJ5
IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9k
aWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMK
KyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247
IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24p
IGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBp
biB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdB
UlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5U
QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05V
CisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAq
CisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRo
ZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdh
cmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAq
IEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZuZGVmIEJpZGlSdW5f
aAorI2RlZmluZSBCaWRpUnVuX2gKKworI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KKyNp
bmNsdWRlICJCaWRpUmVzb2x2ZXIuaCIKKyNpbmNsdWRlICJSZW5kZXJUZXh0LmgiCisKK25hbWVz
cGFjZSBXZWJDb3JlIHsKKworY2xhc3MgQmlkaUNvbnRleHQ7CitjbGFzcyBJbmxpbmVCb3g7CisK
K3N0cnVjdCBCaWRpUnVuIDogQmlkaUNoYXJhY3RlclJ1biB7CisgICAgQmlkaVJ1bihpbnQgc3Rh
cnQsIGludCBzdG9wLCBSZW5kZXJPYmplY3QqIG9iamVjdCwgQmlkaUNvbnRleHQqIGNvbnRleHQs
IFdURjo6VW5pY29kZTo6RGlyZWN0aW9uIGRpcikKKyAgICAgICAgOiBCaWRpQ2hhcmFjdGVyUnVu
KHN0YXJ0LCBzdG9wLCBjb250ZXh0LCBkaXIpCisgICAgICAgICwgbV9vYmplY3Qob2JqZWN0KQor
ICAgICAgICAsIG1fYm94KDApCisgICAgeworICAgIH0KKworICAgIHZvaWQgZGVzdHJveSgpOwor
CisgICAgLy8gT3ZlcmxvYWRlZCBuZXcgb3BlcmF0b3IuCisgICAgdm9pZCogb3BlcmF0b3IgbmV3
KHNpemVfdCwgUmVuZGVyQXJlbmEqKSB0aHJvdygpOworCisgICAgLy8gT3ZlcnJpZGRlbiB0byBw
cmV2ZW50IHRoZSBub3JtYWwgZGVsZXRlIGZyb20gYmVpbmcgY2FsbGVkLgorICAgIHZvaWQgb3Bl
cmF0b3IgZGVsZXRlKHZvaWQqLCBzaXplX3QpOworCisgICAgQmlkaVJ1biogbmV4dCgpIHsgcmV0
dXJuIHN0YXRpY19jYXN0PEJpZGlSdW4qPihtX25leHQpOyB9CisKK3ByaXZhdGU6CisgICAgLy8g
VGhlIG5vcm1hbCBvcGVyYXRvciBuZXcgaXMgZGlzYWxsb3dlZC4KKyAgICB2b2lkKiBvcGVyYXRv
ciBuZXcoc2l6ZV90KSB0aHJvdygpOworCitwdWJsaWM6CisgICAgUmVuZGVyT2JqZWN0KiBtX29i
amVjdDsKKyAgICBJbmxpbmVCb3gqIG1fYm94OworfTsKKworfQorCisjZW5kaWYgLy8gQmlkaVJ1
bl9oCisKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL0VsbGlwc2lzQm94LmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9FbGxpcHNpc0JveC5jcHAJKHJldmlzaW9uIDU0NTYxKQor
KysgV2ViQ29yZS9yZW5kZXJpbmcvRWxsaXBzaXNCb3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC05
Nyw3ICs5Nyw3IEBAIHZvaWQgRWxsaXBzaXNCb3g6OnBhaW50U2VsZWN0aW9uKEdyYXBoaWMKICAg
ICBjb250ZXh0LT5yZXN0b3JlKCk7CiB9CiAKLWJvb2wgRWxsaXBzaXNCb3g6Om5vZGVBdFBvaW50
KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiByZXF1ZXN0LCBIaXRUZXN0UmVzdWx0JiByZXN1bHQsIGlu
dCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHkpCitib29sIEVsbGlwc2lzQm94Ojpub2RlQXRQb2lu
dChjb25zdCBIaXRUZXN0UmVxdWVzdCYgcmVxdWVzdCwgSGl0VGVzdFJlc3VsdCYgcmVzdWx0LCBp
bnQgeCwgaW50IHksIGludCB0eCwgaW50IHR5LCBIaXRUZXN0QWN0aW9uIGhpdFRlc3RBY3Rpb24p
CiB7CiAgICAgdHggKz0gbV94OwogICAgIHR5ICs9IG1feTsKQEAgLTEwNyw3ICsxMDcsNyBAQCBi
b29sIEVsbGlwc2lzQm94Ojpub2RlQXRQb2ludChjb25zdCBIaXRUCiAgICAgICAgIFJlbmRlclN0
eWxlKiBzdHlsZSA9IG1fcmVuZGVyZXItPnN0eWxlKG1fZmlyc3RMaW5lKTsKICAgICAgICAgaW50
IG10eCA9IHR4ICsgbV93aWR0aCAtIG1fbWFya3VwQm94LT54KCk7CiAgICAgICAgIGludCBtdHkg
PSB0eSArIHN0eWxlLT5mb250KCkuYXNjZW50KCkgLSAobV9tYXJrdXBCb3gtPnkoKSArIG1fbWFy
a3VwQm94LT5yZW5kZXJlcigpLT5zdHlsZShtX2ZpcnN0TGluZSktPmZvbnQoKS5hc2NlbnQoKSk7
Ci0gICAgICAgIGlmIChtX21hcmt1cEJveC0+bm9kZUF0UG9pbnQocmVxdWVzdCwgcmVzdWx0LCB4
LCB5LCBtdHgsIG10eSkpIHsKKyAgICAgICAgaWYgKG1fbWFya3VwQm94LT5ub2RlQXRQb2ludChy
ZXF1ZXN0LCByZXN1bHQsIHgsIHksIG10eCwgbXR5LCBoaXRUZXN0QWN0aW9uKSkgewogICAgICAg
ICAgICAgcmVuZGVyZXIoKS0+dXBkYXRlSGl0VGVzdFJlc3VsdChyZXN1bHQsIEludFBvaW50KHgg
LSBtdHgsIHkgLSBtdHkpKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9Cklu
ZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9FbGxpcHNpc0JveC5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvcmVuZGVyaW5nL0VsbGlwc2lzQm94LmgJKHJldmlzaW9uIDU0NTYxKQorKysgV2ViQ29yZS9y
ZW5kZXJpbmcvRWxsaXBzaXNCb3guaAkod29ya2luZyBjb3B5KQpAQCAtNDAsNyArNDAsNyBAQCBw
dWJsaWM6CiAgICAgfQogCiAgICAgdmlydHVhbCB2b2lkIHBhaW50KFJlbmRlck9iamVjdDo6UGFp
bnRJbmZvJiwgaW50IHR4LCBpbnQgdHkpOwotICAgIHZpcnR1YWwgYm9vbCBub2RlQXRQb2ludChj
b25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBpbnQgeCwgaW50IHksIGludCB0
eCwgaW50IHR5KTsKKyAgICB2aXJ0dWFsIGJvb2wgbm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJl
cXVlc3QmLCBIaXRUZXN0UmVzdWx0JiwgaW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSwgSGl0
VGVzdEFjdGlvbik7CiAgICAgdm9pZCBzZXRTZWxlY3Rpb25TdGF0ZShSZW5kZXJPYmplY3Q6OlNl
bGVjdGlvblN0YXRlIHMpIHsgbV9zZWxlY3Rpb25TdGF0ZSA9IHM7IH0KICAgICBJbnRSZWN0IHNl
bGVjdGlvblJlY3QoaW50IHR4LCBpbnQgdHkpOwogCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9J
bmxpbmVCb3guY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUJveC5j
cHAJKHJldmlzaW9uIDU0NTYxKQorKysgV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lQm94LmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMTgzLDcgKzE4Myw3IEBAIHZvaWQgSW5saW5lQm94OjpwYWludChS
ZW5kZXJPYmplY3Q6OlBhaW4KICAgICB9CiB9CiAKLWJvb2wgSW5saW5lQm94Ojpub2RlQXRQb2lu
dChjb25zdCBIaXRUZXN0UmVxdWVzdCYgcmVxdWVzdCwgSGl0VGVzdFJlc3VsdCYgcmVzdWx0LCBp
bnQgeCwgaW50IHksIGludCB0eCwgaW50IHR5KQorYm9vbCBJbmxpbmVCb3g6Om5vZGVBdFBvaW50
KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiByZXF1ZXN0LCBIaXRUZXN0UmVzdWx0JiByZXN1bHQsIGlu
dCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHksIEhpdFRlc3RBY3Rpb24pCiB7CiAgICAgLy8gSGl0
IHRlc3QgYWxsIHBoYXNlcyBvZiByZXBsYWNlZCBlbGVtZW50cyBhdG9taWNhbGx5LCBhcyB0aG91
Z2ggdGhlIHJlcGxhY2VkIGVsZW1lbnQgZXN0YWJsaXNoZWQgaXRzCiAgICAgLy8gb3duIHN0YWNr
aW5nIGNvbnRleHQuICAoU2VlIEFwcGVuZGl4IEUuMiwgc2VjdGlvbiA2LjQgb24gaW5saW5lIGJs
b2NrL3RhYmxlIGVsZW1lbnRzIGluIHRoZSBDU1MyLjEKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5n
L0lubGluZUJveC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUJveC5o
CShyZXZpc2lvbiA1NDU2MSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUJveC5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xMTMsNyArMTEzLDcgQEAgcHVibGljOgogICAgIHZpcnR1YWwgdm9pZCBh
ZGp1c3RQb3NpdGlvbihpbnQgZHgsIGludCBkeSk7CiAKICAgICB2aXJ0dWFsIHZvaWQgcGFpbnQo
UmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBpbnQgdHgsIGludCB0eSk7Ci0gICAgdmlydHVhbCBi
b29sIG5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiwgSGl0VGVzdFJlc3VsdCYsIGlu
dCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHkpOworICAgIHZpcnR1YWwgYm9vbCBub2RlQXRQb2lu
dChjb25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBpbnQgeCwgaW50IHksIGlu
dCB0eCwgaW50IHR5LCBIaXRUZXN0QWN0aW9uKTsKIAogICAgIC8vIE92ZXJsb2FkZWQgbmV3IG9w
ZXJhdG9yLgogICAgIHZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3QsIFJlbmRlckFyZW5hKikgdGhy
b3coKTsKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUZsb3dCb3guY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUZsb3dCb3guY3BwCShyZXZpc2lvbiA1NDU2
MSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUZsb3dCb3guY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSAiUmVuZGVyTGF5ZXIuaCIKICNpbmNsdWRlICJS
ZW5kZXJMaXN0TWFya2VyLmgiCiAjaW5jbHVkZSAiUmVuZGVyVGFibGVDZWxsLmgiCisjaW5jbHVk
ZSAiUmVuZGVyVmlldy5oIgogI2luY2x1ZGUgIlJvb3RJbmxpbmVCb3guaCIKICNpbmNsdWRlICJU
ZXh0LmgiCiAKQEAgLTIyNywxNCArMjI4LDEzIEBAIHZvaWQgSW5saW5lRmxvd0JveDo6ZGV0ZXJt
aW5lU3BhY2luZ0ZvckYKICAgICAgICAgLy8gKDMpIFRoZSBsaW5lIG1heSBlbmQgb24gdGhlIGlu
bGluZS4gIElmIHdlIGFyZSB0aGUgbGFzdCBjaGlsZCAoY2xpbWJpbmcgdXAKICAgICAgICAgLy8g
dGhlIGVuZCBvYmplY3QncyBjaGFpbiksIHRoZW4gd2UganVzdCBjbG9zZWQgYXMgd2VsbC4KICAg
ICAgICAgaWYgKCFsaW5lQm94TGlzdC0+bGFzdExpbmVCb3goKS0+aXNDb25zdHJ1Y3RlZCgpKSB7
Ci0gICAgICAgICAgICBSZW5kZXJJbmxpbmUqIGlubGluZUZsb3cgPSB0b1JlbmRlcklubGluZShy
ZW5kZXJlcigpKTsKICAgICAgICAgICAgIGlmIChsdHIpIHsKICAgICAgICAgICAgICAgICBpZiAo
IW5leHRMaW5lQm94KCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKChsYXN0TGluZSAmJiAhaW5s
aW5lRmxvdy0+Y29udGludWF0aW9uKCkpIHx8IG5leHRPbkxpbmVFeGlzdHMoKSB8fCBvbkVuZENo
YWluKGVuZE9iamVjdCkpKQorICAgICAgICAgICAgICAgICAgICAobGFzdExpbmUgfHwgbmV4dE9u
TGluZUV4aXN0cygpIHx8IG9uRW5kQ2hhaW4oZW5kT2JqZWN0KSkpCiAgICAgICAgICAgICAgICAg
ICAgIGluY2x1ZGVSaWdodEVkZ2UgPSB0cnVlOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAg
ICAgICAgICAgICBpZiAoKCFwcmV2TGluZUJveCgpIHx8IHByZXZMaW5lQm94KCktPmlzQ29uc3Ry
dWN0ZWQoKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgKChsYXN0TGluZSAmJiAhaW5saW5lRmxv
dy0+Y29udGludWF0aW9uKCkpIHx8IHByZXZPbkxpbmVFeGlzdHMoKSB8fCBvbkVuZENoYWluKGVu
ZE9iamVjdCkpKQorICAgICAgICAgICAgICAgICAgICAobGFzdExpbmUgfHwgcHJldk9uTGluZUV4
aXN0cygpIHx8IG9uRW5kQ2hhaW4oZW5kT2JqZWN0KSkpCiAgICAgICAgICAgICAgICAgICAgIGlu
Y2x1ZGVMZWZ0RWRnZSA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTUwNCw3
ICs1MDQsNyBAQCB2b2lkIElubGluZUZsb3dCb3g6OnBsYWNlQm94ZXNWZXJ0aWNhbGx5CiAgICAg
ICAgICAgICAgICAgbmV3WSAtPSBjdXJyLT5ib3hNb2RlbE9iamVjdCgpLT5ib3JkZXJUb3AoKSAr
IGN1cnItPmJveE1vZGVsT2JqZWN0KCktPnBhZGRpbmdUb3AoKTsKICAgICAgICAgfSBlbHNlIGlm
ICghY3Vyci0+cmVuZGVyZXIoKS0+aXNCUigpKSB7CiAgICAgICAgICAgICBSZW5kZXJCb3gqIGJv
eCA9IHRvUmVuZGVyQm94KGN1cnItPnJlbmRlcmVyKCkpOwotICAgICAgICAgICAgbmV3WSArPSBi
b3gtPm1hcmdpblRvcCgpOworICAgICAgICAgICAgbmV3WSArPSBjdXJyLT5yZW5kZXJlcigpLT5p
c0Fub255bW91c0lubGluZUJsb2NrKCkgPyAwIDogYm94LT5tYXJnaW5Ub3AoKTsKICAgICAgICAg
fQogCiAgICAgICAgIGN1cnItPnNldFkobmV3WSk7CkBAIC01OTgsNyArNTk4LDcgQEAgdm9pZCBJ
bmxpbmVGbG93Qm94Ojpjb21wdXRlVmVydGljYWxPdmVyZgogICAgIHNldFZlcnRpY2FsT3ZlcmZs
b3dQb3NpdGlvbnModG9wTGF5b3V0T3ZlcmZsb3csIGJvdHRvbUxheW91dE92ZXJmbG93LCB0b3BW
aXN1YWxPdmVyZmxvdywgYm90dG9tVmlzdWFsT3ZlcmZsb3csIGJveEhlaWdodCk7CiB9CiAKLWJv
b2wgSW5saW5lRmxvd0JveDo6bm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmIHJlcXVl
c3QsIEhpdFRlc3RSZXN1bHQmIHJlc3VsdCwgaW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSkK
K2Jvb2wgSW5saW5lRmxvd0JveDo6bm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmIHJl
cXVlc3QsIEhpdFRlc3RSZXN1bHQmIHJlc3VsdCwgaW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0
eSwgSGl0VGVzdEFjdGlvbiBoaXRUZXN0QWN0aW9uKQogewogICAgIEludFJlY3Qgb3ZlcmZsb3dS
ZWN0KHZpc2libGVPdmVyZmxvd1JlY3QoKSk7CiAgICAgb3ZlcmZsb3dSZWN0Lm1vdmUodHgsIHR5
KTsKQEAgLTYwNyw3ICs2MDcsNyBAQCBib29sIElubGluZUZsb3dCb3g6Om5vZGVBdFBvaW50KGNv
bnN0IEhpCiAKICAgICAvLyBDaGVjayBjaGlsZHJlbiBmaXJzdC4KICAgICBmb3IgKElubGluZUJv
eCogY3VyciA9IGxhc3RDaGlsZCgpOyBjdXJyOyBjdXJyID0gY3Vyci0+cHJldk9uTGluZSgpKSB7
Ci0gICAgICAgIGlmICgoY3Vyci0+cmVuZGVyZXIoKS0+aXNUZXh0KCkgfHwgIWN1cnItPmJveE1v
ZGVsT2JqZWN0KCktPmhhc1NlbGZQYWludGluZ0xheWVyKCkpICYmIGN1cnItPm5vZGVBdFBvaW50
KHJlcXVlc3QsIHJlc3VsdCwgeCwgeSwgdHgsIHR5KSkgeworICAgICAgICBpZiAoKGN1cnItPnJl
bmRlcmVyKCktPmlzVGV4dCgpIHx8ICFjdXJyLT5ib3hNb2RlbE9iamVjdCgpLT5oYXNTZWxmUGFp
bnRpbmdMYXllcigpKSAmJiBjdXJyLT5ub2RlQXRQb2ludChyZXF1ZXN0LCByZXN1bHQsIHgsIHks
IHR4LCB0eSwgaGl0VGVzdEFjdGlvbikpIHsKICAgICAgICAgICAgIHJlbmRlcmVyKCktPnVwZGF0
ZUhpdFRlc3RSZXN1bHQocmVzdWx0LCBJbnRQb2ludCh4IC0gdHgsIHkgLSB0eSkpOwogICAgICAg
ICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KQEAgLTYzOCwxMyArNjM4LDcgQEAgdm9pZCBJ
bmxpbmVGbG93Qm94OjpwYWludChSZW5kZXJPYmplY3Q6OgogICAgICAgICAgICAgLy8gb3V0bGlu
ZXMuCiAgICAgICAgICAgICBpZiAocmVuZGVyZXIoKS0+c3R5bGUoKS0+dmlzaWJpbGl0eSgpID09
IFZJU0lCTEUgJiYgcmVuZGVyZXIoKS0+aGFzT3V0bGluZSgpICYmICFpc1Jvb3RJbmxpbmVCb3go
KSkgewogICAgICAgICAgICAgICAgIFJlbmRlcklubGluZSogaW5saW5lRmxvdyA9IHRvUmVuZGVy
SW5saW5lKHJlbmRlcmVyKCkpOwotICAgICAgICAgICAgICAgIGlmICgoaW5saW5lRmxvdy0+Y29u
dGludWF0aW9uKCkgfHwgaW5saW5lRmxvdy0+aXNJbmxpbmVDb250aW51YXRpb24oKSkgJiYgIWJv
eE1vZGVsT2JqZWN0KCktPmhhc1NlbGZQYWludGluZ0xheWVyKCkpIHsKLSAgICAgICAgICAgICAg
ICAgICAgLy8gQWRkIG91cnNlbHZlcyB0byB0aGUgY29udGFpbmluZyBibG9jayBvZiB0aGUgZW50
aXJlIGNvbnRpbnVhdGlvbiBzbyB0aGF0IGl0IGNhbgotICAgICAgICAgICAgICAgICAgICAvLyBw
YWludCB1cyBhdG9taWNhbGx5LgotICAgICAgICAgICAgICAgICAgICBSZW5kZXJCbG9jayogYmxv
Y2sgPSByZW5kZXJlcigpLT5jb250YWluaW5nQmxvY2soKS0+Y29udGFpbmluZ0Jsb2NrKCk7Ci0g
ICAgICAgICAgICAgICAgICAgIGJsb2NrLT5hZGRDb250aW51YXRpb25XaXRoT3V0bGluZSh0b1Jl
bmRlcklubGluZShyZW5kZXJlcigpLT5ub2RlKCktPnJlbmRlcmVyKCkpKTsKLSAgICAgICAgICAg
ICAgICB9IGVsc2UgaWYgKCFpbmxpbmVGbG93LT5pc0lubGluZUNvbnRpbnVhdGlvbigpKQotICAg
ICAgICAgICAgICAgICAgICBwYWludEluZm8ub3V0bGluZU9iamVjdHMtPmFkZChpbmxpbmVGbG93
KTsKKyAgICAgICAgICAgICAgICBwYWludEluZm8ub3V0bGluZU9iamVjdHMtPmFkZChpbmxpbmVG
bG93KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChwYWludEluZm8ucGhhc2Ug
PT0gUGFpbnRQaGFzZU1hc2spIHsKICAgICAgICAgICAgIHBhaW50TWFzayhwYWludEluZm8sIHR4
LCB0eSk7CkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVGbG93Qm94LmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lRmxvd0JveC5oCShyZXZpc2lvbiA1NDU2MSkK
KysrIFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUZsb3dCb3guaAkod29ya2luZyBjb3B5KQpAQCAt
OTEsNyArOTEsNyBAQCBwdWJsaWM6CiAgICAgdm9pZCBwYWludEJveFNoYWRvdyhHcmFwaGljc0Nv
bnRleHQqLCBSZW5kZXJTdHlsZSosIFNoYWRvd1N0eWxlLCBpbnQgdHgsIGludCB0eSwgaW50IHcs
IGludCBoKTsKICAgICB2aXJ0dWFsIHZvaWQgcGFpbnRUZXh0RGVjb3JhdGlvbnMoUmVuZGVyT2Jq
ZWN0OjpQYWludEluZm8mLCBpbnQgdHgsIGludCB0eSwgYm9vbCBwYWludGVkQ2hpbGRyZW4gPSBm
YWxzZSk7CiAgICAgdmlydHVhbCB2b2lkIHBhaW50KFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiwg
aW50IHR4LCBpbnQgdHkpOwotICAgIHZpcnR1YWwgYm9vbCBub2RlQXRQb2ludChjb25zdCBIaXRU
ZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBpbnQgeCwgaW50IHksIGludCB0eCwgaW50IHR5
KTsKKyAgICB2aXJ0dWFsIGJvb2wgbm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmLCBI
aXRUZXN0UmVzdWx0JiwgaW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSwgSGl0VGVzdEFjdGlv
bik7CiAKICAgICB2aXJ0dWFsIFJlbmRlckxpbmVCb3hMaXN0KiByZW5kZXJlckxpbmVCb3hlcygp
IGNvbnN0OwogCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVJdGVyYXRvci5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUl0ZXJhdG9yLmgJKHJldmlzaW9uIDAp
CisrKyBXZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVJdGVyYXRvci5oCShyZXZpc2lvbiAwKQpAQCAt
MCwwICsxLDI2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBMYXJzIEtub2xsIChrbm9s
bEBrZGUub3JnKQorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA2LCAyMDA3LCAyMDA4
LCAyMDA5LCAyMDEwIEFwcGxlIEluYy4gQWxsIHJpZ2h0IHJlc2VydmVkLgorICogQ29weXJpZ2h0
IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBs
aWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgor
ICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k
YXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBv
cHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmli
dXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQg
QU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1F
UkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0
aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWls
cy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGli
cmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsg
c2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUg
U29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9v
ciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZuZGVmIElu
bGluZUl0ZXJhdG9yX2gKKyNkZWZpbmUgSW5saW5lSXRlcmF0b3JfaAorCisjaW5jbHVkZSAiQmlk
aVJ1bi5oIgorI2luY2x1ZGUgIlJlbmRlckJsb2NrLmgiCisjaW5jbHVkZSAiUmVuZGVyVGV4dC5o
IgorI2luY2x1ZGUgPHd0Zi9BbHdheXNJbmxpbmUuaD4KKyNpbmNsdWRlIDx3dGYvU3RkTGliRXh0
cmFzLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgSW5saW5lSXRlcmF0b3Igewor
cHVibGljOgorICAgIElubGluZUl0ZXJhdG9yKCkKKyAgICAgICAgOiBibG9jaygwKQorICAgICAg
ICAsIG9iaigwKQorICAgICAgICAsIHBvcygwKQorICAgICAgICAsIG5leHRCcmVha2FibGVQb3Np
dGlvbigtMSkKKyAgICB7CisgICAgfQorCisgICAgSW5saW5lSXRlcmF0b3IoUmVuZGVyQmxvY2sq
IGIsIFJlbmRlck9iamVjdCogbywgdW5zaWduZWQgcCkKKyAgICAgICAgOiBibG9jayhiKQorICAg
ICAgICAsIG9iaihvKQorICAgICAgICAsIHBvcyhwKQorICAgICAgICAsIG5leHRCcmVha2FibGVQ
b3NpdGlvbigtMSkKKyAgICB7CisgICAgfQorCisgICAgdm9pZCBpbmNyZW1lbnQoSW5saW5lQmlk
aVJlc29sdmVyKiByZXNvbHZlciA9IDApOworICAgIGJvb2wgYXRFbmQoKSBjb25zdDsKKworICAg
IFVDaGFyIGN1cnJlbnQoKSBjb25zdDsKKyAgICBXVEY6OlVuaWNvZGU6OkRpcmVjdGlvbiBkaXJl
Y3Rpb24oKSBjb25zdDsKKworICAgIFJlbmRlckJsb2NrKiBibG9jazsKKyAgICBSZW5kZXJPYmpl
Y3QqIG9iajsKKyAgICB1bnNpZ25lZCBwb3M7CisgICAgaW50IG5leHRCcmVha2FibGVQb3NpdGlv
bjsKK307CisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgSW5saW5lSXRlcmF0b3ImIGl0
MSwgY29uc3QgSW5saW5lSXRlcmF0b3ImIGl0MikKK3sKKyAgICByZXR1cm4gaXQxLnBvcyA9PSBp
dDIucG9zICYmIGl0MS5vYmogPT0gaXQyLm9iajsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3Ih
PShjb25zdCBJbmxpbmVJdGVyYXRvciYgaXQxLCBjb25zdCBJbmxpbmVJdGVyYXRvciYgaXQyKQor
eworICAgIHJldHVybiBpdDEucG9zICE9IGl0Mi5wb3MgfHwgaXQxLm9iaiAhPSBpdDIub2JqOwor
fQorCitzdGF0aWMgaW5saW5lIFJlbmRlck9iamVjdCogYmlkaU5leHQoUmVuZGVyQmxvY2sqIGJs
b2NrLCBSZW5kZXJPYmplY3QqIGN1cnJlbnQsIElubGluZUJpZGlSZXNvbHZlciogcmVzb2x2ZXIg
PSAwLCBib29sIHNraXBJbmxpbmVzID0gdHJ1ZSwgYm9vbCogZW5kT2ZJbmxpbmVQdHIgPSAwKQor
eworICAgIFJlbmRlck9iamVjdCogbmV4dCA9IDA7CisgICAgYm9vbCBvbGRFbmRPZklubGluZSA9
IGVuZE9mSW5saW5lUHRyID8gKmVuZE9mSW5saW5lUHRyIDogZmFsc2U7CisgICAgYm9vbCBlbmRP
ZklubGluZSA9IGZhbHNlOworCisgICAgd2hpbGUgKGN1cnJlbnQpIHsKKyAgICAgICAgbmV4dCA9
IDA7CisgICAgICAgIGlmICghb2xkRW5kT2ZJbmxpbmUgJiYgIWN1cnJlbnQtPmlzRmxvYXRpbmco
KSAmJiAhY3VycmVudC0+aXNSZXBsYWNlZCgpICYmICFjdXJyZW50LT5pc1Bvc2l0aW9uZWQoKSAm
JiAhY3VycmVudC0+aXNUZXh0KCkpIHsKKyAgICAgICAgICAgIG5leHQgPSBjdXJyZW50LT5maXJz
dENoaWxkKCk7CisgICAgICAgICAgICBpZiAobmV4dCAmJiByZXNvbHZlciAmJiBuZXh0LT5pc1Jl
bmRlcklubGluZSgpKSB7CisgICAgICAgICAgICAgICAgRVVuaWNvZGVCaWRpIHViID0gbmV4dC0+
c3R5bGUoKS0+dW5pY29kZUJpZGkoKTsKKyAgICAgICAgICAgICAgICBpZiAodWIgIT0gVUJOb3Jt
YWwpIHsKKyAgICAgICAgICAgICAgICAgICAgVGV4dERpcmVjdGlvbiBkaXIgPSBuZXh0LT5zdHls
ZSgpLT5kaXJlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgV1RGOjpVbmljb2RlOjpEaXJl
Y3Rpb24gZCA9ICh1YiA9PSBFbWJlZAorICAgICAgICAgICAgICAgICAgICAgICAgPyAoZGlyID09
IFJUTCA/IFdURjo6VW5pY29kZTo6UmlnaHRUb0xlZnRFbWJlZGRpbmcgOiBXVEY6OlVuaWNvZGU6
OkxlZnRUb1JpZ2h0RW1iZWRkaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgOiAoZGlyID09
IFJUTCA/IFdURjo6VW5pY29kZTo6UmlnaHRUb0xlZnRPdmVycmlkZSA6IFdURjo6VW5pY29kZTo6
TGVmdFRvUmlnaHRPdmVycmlkZSkpOworICAgICAgICAgICAgICAgICAgICByZXNvbHZlci0+ZW1i
ZWQoZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAg
ICAgICAgaWYgKCFuZXh0KSB7CisgICAgICAgICAgICBpZiAoIXNraXBJbmxpbmVzICYmICFvbGRF
bmRPZklubGluZSAmJiBjdXJyZW50LT5pc1JlbmRlcklubGluZSgpKSB7CisgICAgICAgICAgICAg
ICAgbmV4dCA9IGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgZW5kT2ZJbmxpbmUgPSB0cnVlOwor
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3aGls
ZSAoY3VycmVudCAmJiBjdXJyZW50ICE9IGJsb2NrKSB7CisgICAgICAgICAgICAgICAgaWYgKHJl
c29sdmVyICYmIGN1cnJlbnQtPmlzUmVuZGVySW5saW5lKCkgJiYgY3VycmVudC0+c3R5bGUoKS0+
dW5pY29kZUJpZGkoKSAhPSBVQk5vcm1hbCkKKyAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXIt
PmVtYmVkKFdURjo6VW5pY29kZTo6UG9wRGlyZWN0aW9uYWxGb3JtYXQpOworCisgICAgICAgICAg
ICAgICAgbmV4dCA9IGN1cnJlbnQtPm5leHRTaWJsaW5nKCk7CisgICAgICAgICAgICAgICAgaWYg
KG5leHQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVyICYmIG5leHQtPmlzUmVu
ZGVySW5saW5lKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVVbmljb2RlQmlkaSB1YiA9
IG5leHQtPnN0eWxlKCktPnVuaWNvZGVCaWRpKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBp
ZiAodWIgIT0gVUJOb3JtYWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0RGly
ZWN0aW9uIGRpciA9IG5leHQtPnN0eWxlKCktPmRpcmVjdGlvbigpOworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFdURjo6VW5pY29kZTo6RGlyZWN0aW9uIGQgPSAodWIgPT0gRW1iZWQKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoZGlyID09IFJUTCA/IFdURjo6VW5pY29k
ZTo6UmlnaHRUb0xlZnRFbWJlZGRpbmc6IFdURjo6VW5pY29kZTo6TGVmdFRvUmlnaHRFbWJlZGRp
bmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGRpciA9PSBSVEwgPyBXVEY6
OlVuaWNvZGU6OlJpZ2h0VG9MZWZ0T3ZlcnJpZGUgOiBXVEY6OlVuaWNvZGU6OkxlZnRUb1JpZ2h0
T3ZlcnJpZGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlci0+ZW1iZWQo
ZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
ICAgIAorICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5wYXJlbnQoKTsKKyAgICAg
ICAgICAgICAgICBpZiAoIXNraXBJbmxpbmVzICYmIGN1cnJlbnQgJiYgY3VycmVudCAhPSBibG9j
ayAmJiBjdXJyZW50LT5pc1JlbmRlcklubGluZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG5l
eHQgPSBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBlbmRPZklubGluZSA9IHRydWU7Cisg
ICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghbmV4dCkKKyAgICAgICAgICAgIGJyZWFrOwor
CisgICAgICAgIGlmIChuZXh0LT5pc1RleHQoKSB8fCBuZXh0LT5pc0Zsb2F0aW5nKCkgfHwgbmV4
dC0+aXNSZXBsYWNlZCgpIHx8IG5leHQtPmlzUG9zaXRpb25lZCgpCisgICAgICAgICAgICB8fCAo
KCFza2lwSW5saW5lcyB8fCAhbmV4dC0+Zmlyc3RDaGlsZCgpKSAvLyBBbHdheXMgcmV0dXJuIEVN
UFRZIGlubGluZXMuCisgICAgICAgICAgICAgICAgJiYgbmV4dC0+aXNSZW5kZXJJbmxpbmUoKSkp
CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY3VycmVudCA9IG5leHQ7CisgICAgfQorCisg
ICAgaWYgKGVuZE9mSW5saW5lUHRyKQorICAgICAgICAqZW5kT2ZJbmxpbmVQdHIgPSBlbmRPZklu
bGluZTsKKworICAgIHJldHVybiBuZXh0OworfQorCitzdGF0aWMgaW5saW5lIFJlbmRlck9iamVj
dCogYmlkaUZpcnN0KFJlbmRlckJsb2NrKiBibG9jaywgSW5saW5lQmlkaVJlc29sdmVyKiByZXNv
bHZlciwgYm9vbCBza2lwSW5saW5lcyA9IHRydWUpCit7CisgICAgaWYgKCFibG9jay0+Zmlyc3RD
aGlsZCgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICAKKyAgICBSZW5kZXJPYmplY3QqIG8gPSBi
bG9jay0+Zmlyc3RDaGlsZCgpOworICAgIGlmIChvLT5pc1JlbmRlcklubGluZSgpKSB7CisgICAg
ICAgIGlmIChyZXNvbHZlcikgeworICAgICAgICAgICAgRVVuaWNvZGVCaWRpIHViID0gby0+c3R5
bGUoKS0+dW5pY29kZUJpZGkoKTsKKyAgICAgICAgICAgIGlmICh1YiAhPSBVQk5vcm1hbCkgewor
ICAgICAgICAgICAgICAgIFRleHREaXJlY3Rpb24gZGlyID0gby0+c3R5bGUoKS0+ZGlyZWN0aW9u
KCk7CisgICAgICAgICAgICAgICAgV1RGOjpVbmljb2RlOjpEaXJlY3Rpb24gZCA9ICh1YiA9PSBF
bWJlZAorICAgICAgICAgICAgICAgICAgICA/IChkaXIgPT0gUlRMID8gV1RGOjpVbmljb2RlOjpS
aWdodFRvTGVmdEVtYmVkZGluZyA6IFdURjo6VW5pY29kZTo6TGVmdFRvUmlnaHRFbWJlZGRpbmcp
CisgICAgICAgICAgICAgICAgICAgIDogKGRpciA9PSBSVEwgPyBXVEY6OlVuaWNvZGU6OlJpZ2h0
VG9MZWZ0T3ZlcnJpZGUgOiBXVEY6OlVuaWNvZGU6OkxlZnRUb1JpZ2h0T3ZlcnJpZGUpKTsKKyAg
ICAgICAgICAgICAgICByZXNvbHZlci0+ZW1iZWQoZCk7CisgICAgICAgICAgICB9CisgICAgICAg
IH0KKyAgICAgICAgaWYgKHNraXBJbmxpbmVzICYmIG8tPmZpcnN0Q2hpbGQoKSkKKyAgICAgICAg
ICAgIG8gPSBiaWRpTmV4dChibG9jaywgbywgcmVzb2x2ZXIsIHNraXBJbmxpbmVzKTsKKyAgICAg
ICAgZWxzZSB7CisgICAgICAgICAgICAvLyBOZXZlciBza2lwIGVtcHR5IGlubGluZXMuCisgICAg
ICAgICAgICBpZiAocmVzb2x2ZXIpCisgICAgICAgICAgICAgICAgcmVzb2x2ZXItPmNvbW1pdEV4
cGxpY2l0RW1iZWRkaW5nKCk7CisgICAgICAgICAgICByZXR1cm4gbzsgCisgICAgICAgIH0KKyAg
ICB9CisKKyAgICBpZiAobyAmJiAhby0+aXNUZXh0KCkgJiYgIW8tPmlzUmVwbGFjZWQoKSAmJiAh
by0+aXNGbG9hdGluZygpICYmICFvLT5pc1Bvc2l0aW9uZWQoKSkKKyAgICAgICAgbyA9IGJpZGlO
ZXh0KGJsb2NrLCBvLCByZXNvbHZlciwgc2tpcElubGluZXMpOworCisgICAgaWYgKHJlc29sdmVy
KQorICAgICAgICByZXNvbHZlci0+Y29tbWl0RXhwbGljaXRFbWJlZGRpbmcoKTsKKyAgICByZXR1
cm4gbzsKK30KKworaW5saW5lIHZvaWQgSW5saW5lSXRlcmF0b3I6OmluY3JlbWVudChJbmxpbmVC
aWRpUmVzb2x2ZXIqIHJlc29sdmVyKQoreworICAgIGlmICghb2JqKQorICAgICAgICByZXR1cm47
CisgICAgaWYgKG9iai0+aXNUZXh0KCkpIHsKKyAgICAgICAgcG9zKys7CisgICAgICAgIGlmIChw
b3MgPj0gdG9SZW5kZXJUZXh0KG9iaiktPnRleHRMZW5ndGgoKSkgeworICAgICAgICAgICAgb2Jq
ID0gYmlkaU5leHQoYmxvY2ssIG9iaiwgcmVzb2x2ZXIpOworICAgICAgICAgICAgcG9zID0gMDsK
KyAgICAgICAgICAgIG5leHRCcmVha2FibGVQb3NpdGlvbiA9IC0xOworICAgICAgICB9CisgICAg
fSBlbHNlIHsKKyAgICAgICAgb2JqID0gYmlkaU5leHQoYmxvY2ssIG9iaiwgcmVzb2x2ZXIpOwor
ICAgICAgICBwb3MgPSAwOworICAgICAgICBuZXh0QnJlYWthYmxlUG9zaXRpb24gPSAtMTsKKyAg
ICB9Cit9CisKK2lubGluZSBib29sIElubGluZUl0ZXJhdG9yOjphdEVuZCgpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuICFvYmo7Cit9CisKK2lubGluZSBVQ2hhciBJbmxpbmVJdGVyYXRvcjo6Y3VycmVu
dCgpIGNvbnN0Cit7CisgICAgaWYgKCFvYmogfHwgIW9iai0+aXNUZXh0KCkpCisgICAgICAgIHJl
dHVybiAwOworCisgICAgUmVuZGVyVGV4dCogdGV4dCA9IHRvUmVuZGVyVGV4dChvYmopOworICAg
IGlmIChwb3MgPj0gdGV4dC0+dGV4dExlbmd0aCgpKQorICAgICAgICByZXR1cm4gMDsKKworICAg
IHJldHVybiB0ZXh0LT5jaGFyYWN0ZXJzKClbcG9zXTsKK30KKworQUxXQVlTX0lOTElORSBXVEY6
OlVuaWNvZGU6OkRpcmVjdGlvbiBJbmxpbmVJdGVyYXRvcjo6ZGlyZWN0aW9uKCkgY29uc3QKK3sK
KyAgICBpZiAoVUNoYXIgYyA9IGN1cnJlbnQoKSkKKyAgICAgICAgcmV0dXJuIFdURjo6VW5pY29k
ZTo6ZGlyZWN0aW9uKGMpOworCisgICAgaWYgKG9iaiAmJiBvYmotPmlzTGlzdE1hcmtlcigpKQor
ICAgICAgICByZXR1cm4gb2JqLT5zdHlsZSgpLT5kaXJlY3Rpb24oKSA9PSBMVFIgPyBXVEY6OlVu
aWNvZGU6OkxlZnRUb1JpZ2h0IDogV1RGOjpVbmljb2RlOjpSaWdodFRvTGVmdDsKKworICAgIHJl
dHVybiBXVEY6OlVuaWNvZGU6Ok90aGVyTmV1dHJhbDsKK30KKwordGVtcGxhdGU8PgoraW5saW5l
IHZvaWQgSW5saW5lQmlkaVJlc29sdmVyOjppbmNyZW1lbnQoKQoreworICAgIGN1cnJlbnQuaW5j
cmVtZW50KHRoaXMpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIHZvaWQgSW5saW5lQmlkaVJl
c29sdmVyOjphcHBlbmRSdW4oKQoreworICAgIGlmICghZW1wdHlSdW4gJiYgIWVvci5hdEVuZCgp
KSB7CisgICAgICAgIGludCBzdGFydCA9IHNvci5wb3M7CisgICAgICAgIFJlbmRlck9iamVjdCAq
b2JqID0gc29yLm9iajsKKyAgICAgICAgd2hpbGUgKG9iaiAmJiBvYmogIT0gZW9yLm9iaiAmJiBv
YmogIT0gZW5kT2ZMaW5lLm9iaikgeworICAgICAgICAgICAgUmVuZGVyQmxvY2s6OmFwcGVuZFJ1
bnNGb3JPYmplY3Qoc3RhcnQsIG9iai0+bGVuZ3RoKCksIG9iaiwgKnRoaXMpOyAgICAgICAgCisg
ICAgICAgICAgICBzdGFydCA9IDA7CisgICAgICAgICAgICBvYmogPSBiaWRpTmV4dChzb3IuYmxv
Y2ssIG9iaik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9iaikgeworICAgICAgICAgICAgdW5z
aWduZWQgcG9zID0gb2JqID09IGVvci5vYmogPyBlb3IucG9zIDogVUlOVF9NQVg7CisgICAgICAg
ICAgICBpZiAob2JqID09IGVuZE9mTGluZS5vYmogJiYgZW5kT2ZMaW5lLnBvcyA8PSBwb3MpIHsK
KyAgICAgICAgICAgICAgICByZWFjaGVkRW5kT2ZMaW5lID0gdHJ1ZTsKKyAgICAgICAgICAgICAg
ICBwb3MgPSBlbmRPZkxpbmUucG9zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSXQn
cyBPSyB0byBhZGQgcnVucyBmb3IgemVyby1sZW5ndGggUmVuZGVyT2JqZWN0cywganVzdCBkb24n
dCBtYWtlIHRoZSBydW4gbGFyZ2VyIHRoYW4gaXQgc2hvdWxkIGJlCisgICAgICAgICAgICBpbnQg
ZW5kID0gb2JqLT5sZW5ndGgoKSA/IHBvcysxIDogMDsKKyAgICAgICAgICAgIFJlbmRlckJsb2Nr
OjphcHBlbmRSdW5zRm9yT2JqZWN0KHN0YXJ0LCBlbmQsIG9iaiwgKnRoaXMpOworICAgICAgICB9
CisgICAgICAgIAorICAgICAgICBlb3IuaW5jcmVtZW50KCk7CisgICAgICAgIHNvciA9IGVvcjsK
KyAgICB9CisKKyAgICBtX2RpcmVjdGlvbiA9IFdURjo6VW5pY29kZTo6T3RoZXJOZXV0cmFsOwor
ICAgIG1fc3RhdHVzLmVvciA9IFdURjo6VW5pY29kZTo6T3RoZXJOZXV0cmFsOworfQorCit9CisK
KyNlbmRpZiAvLyBJbmxpbmVJdGVyYXRvcl9oCisKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL0lu
bGluZVRleHRCb3guY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZVRl
eHRCb3guY3BwCShyZXZpc2lvbiA1NDU2MSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZVRl
eHRCb3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNjAsNyArMjYwLDcgQEAgYm9vbCBJbmxpbmVU
ZXh0Qm94Ojppc0xpbmVCcmVhaygpIGNvbnN0CiAgICAgcmV0dXJuIHJlbmRlcmVyKCktPmlzQlIo
KSB8fCAocmVuZGVyZXIoKS0+c3R5bGUoKS0+cHJlc2VydmVOZXdsaW5lKCkgJiYgbGVuKCkgPT0g
MSAmJiAoKnRleHRSZW5kZXJlcigpLT50ZXh0KCkpW3N0YXJ0KCldID09ICdcbicpOwogfQogCi1i
b29sIElubGluZVRleHRCb3g6Om5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiwgSGl0
VGVzdFJlc3VsdCYgcmVzdWx0LCBpbnQgeCwgaW50IHksIGludCB0eCwgaW50IHR5KQorYm9vbCBJ
bmxpbmVUZXh0Qm94Ojpub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RS
ZXN1bHQmIHJlc3VsdCwgaW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSwgSGl0VGVzdEFjdGlv
bikKIHsKICAgICBpZiAoaXNMaW5lQnJlYWsoKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwpJbmRl
eDogV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lVGV4dEJveC5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvcmVuZGVyaW5nL0lubGluZVRleHRCb3guaAkocmV2aXNpb24gNTQ1NjEpCisrKyBXZWJDb3Jl
L3JlbmRlcmluZy9JbmxpbmVUZXh0Qm94LmgJKHdvcmtpbmcgY29weSkKQEAgLTc1LDcgKzc1LDcg
QEAgcHVibGljOgogCiBwcml2YXRlOgogICAgIHZpcnR1YWwgdm9pZCBwYWludChSZW5kZXJPYmpl
Y3Q6OlBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5KTsKLSAgICB2aXJ0dWFsIGJvb2wgbm9kZUF0
UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVzdWx0JiwgaW50IHgsIGludCB5
LCBpbnQgdHgsIGludCB0eSk7CisgICAgdmlydHVhbCBib29sIG5vZGVBdFBvaW50KGNvbnN0IEhp
dFRlc3RSZXF1ZXN0JiwgSGl0VGVzdFJlc3VsdCYsIGludCB4LCBpbnQgeSwgaW50IHR4LCBpbnQg
dHksIEhpdFRlc3RBY3Rpb24pOwogCiBwdWJsaWM6CiAgICAgUmVuZGVyVGV4dCogdGV4dFJlbmRl
cmVyKCkgY29uc3Q7CkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suY3BwCShyZXZpc2lvbiA1
NDU2MSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtNzcsOCArNzcsNiBAQCBzdGF0aWMgUGVyY2VudEhlaWdodERlc2NlbmRhbnRzTWFwKiBn
UGVyCiAKIHR5cGVkZWYgV1RGOjpIYXNoTWFwPGNvbnN0IFJlbmRlckJveCosIEhhc2hTZXQ8UmVu
ZGVyQmxvY2sqPio+IFBlcmNlbnRIZWlnaHRDb250YWluZXJNYXA7CiBzdGF0aWMgUGVyY2VudEhl
aWdodENvbnRhaW5lck1hcCogZ1BlcmNlbnRIZWlnaHRDb250YWluZXJNYXAgPSAwOwotICAgIAot
dHlwZWRlZiBXVEY6Okhhc2hNYXA8UmVuZGVyQmxvY2sqLCBMaXN0SGFzaFNldDxSZW5kZXJJbmxp
bmUqPio+IENvbnRpbnVhdGlvbk91dGxpbmVUYWJsZU1hcDsKIAogdHlwZWRlZiBXVEY6Okhhc2hT
ZXQ8UmVuZGVyQmxvY2sqPiBEZWxheWVkVXBkYXRlU2Nyb2xsSW5mb1NldDsKIHN0YXRpYyBpbnQg
Z0RlbGF5VXBkYXRlU2Nyb2xsSW5mbyA9IDA7CkBAIC05MSw3ICs4OSw3IEBAIFJlbmRlckJsb2Nr
OjpNYXJnaW5JbmZvOjpNYXJnaW5JbmZvKFJlbmQKICAgICAvLyBpZiB3ZSBoYWQgYW55IGJvcmRl
ci9wYWRkaW5nIChvYnZpb3VzbHkpLCBpZiB3ZSdyZSB0aGUgcm9vdCBvciBIVE1MIGVsZW1lbnRz
LCBvciBpZgogICAgIC8vIHdlJ3JlIHBvc2l0aW9uZWQsIGZsb2F0aW5nLCBhIHRhYmxlIGNlbGwu
CiAgICAgbV9jYW5Db2xsYXBzZVdpdGhDaGlsZHJlbiA9ICFibG9jay0+aXNSZW5kZXJWaWV3KCkg
JiYgIWJsb2NrLT5pc1Jvb3QoKSAmJiAhYmxvY2stPmlzUG9zaXRpb25lZCgpICYmCi0gICAgICAg
ICFibG9jay0+aXNGbG9hdGluZygpICYmICFibG9jay0+aXNUYWJsZUNlbGwoKSAmJiAhYmxvY2st
Pmhhc092ZXJmbG93Q2xpcCgpICYmICFibG9jay0+aXNJbmxpbmVCbG9ja09ySW5saW5lVGFibGUo
KTsKKyAgICAgICAgIWJsb2NrLT5pc0Zsb2F0aW5nKCkgJiYgIWJsb2NrLT5pc1RhYmxlQ2VsbCgp
ICYmICFibG9jay0+aGFzT3ZlcmZsb3dDbGlwKCkgJiYgKCFibG9jay0+aXNJbmxpbmVCbG9ja09y
SW5saW5lVGFibGUoKSB8fCBibG9jay0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKTsKIAogICAg
IG1fY2FuQ29sbGFwc2VUb3BXaXRoQ2hpbGRyZW4gPSBtX2NhbkNvbGxhcHNlV2l0aENoaWxkcmVu
ICYmICh0b3AgPT0gMCkgJiYgYmxvY2stPnN0eWxlKCktPm1hcmdpblRvcENvbGxhcHNlKCkgIT0g
TVNFUEFSQVRFOwogCkBAIC0xMjAsNyArMTE4LDYgQEAgUmVuZGVyQmxvY2s6OlJlbmRlckJsb2Nr
KE5vZGUqIG5vZGUpCiAgICAgICA6IFJlbmRlckJveChub2RlKQogICAgICAgLCBtX2Zsb2F0aW5n
T2JqZWN0cygwKQogICAgICAgLCBtX3Bvc2l0aW9uZWRPYmplY3RzKDApCi0gICAgICAsIG1faW5s
aW5lQ29udGludWF0aW9uKDApCiAgICAgICAsIG1fbWF4TWFyZ2luKDApCiAgICAgICAsIG1fbGlu
ZUhlaWdodCgtMSkKIHsKQEAgLTE2MSwxNCArMTU4LDYgQEAgdm9pZCBSZW5kZXJCbG9jazo6ZGVz
dHJveSgpCiAgICAgLy8gTWFrZSBzdXJlIHRvIGRlc3Ryb3kgYW5vbnltb3VzIGNoaWxkcmVuIGZp
cnN0IHdoaWxlIHRoZXkgYXJlIHN0aWxsIGNvbm5lY3RlZCB0byB0aGUgcmVzdCBvZiB0aGUgdHJl
ZSwgc28gdGhhdCB0aGV5IHdpbGwKICAgICAvLyBwcm9wZXJseSBkaXJ0eSBsaW5lIGJveGVzIHRo
YXQgdGhleSBhcmUgcmVtb3ZlZCBmcm9tLiBFZmZlY3RzIHRoYXQgZG8gOmJlZm9yZS86YWZ0ZXIg
b25seSBvbiBob3ZlciBjb3VsZCBjcmFzaCBvdGhlcndpc2UuCiAgICAgY2hpbGRyZW4oKS0+ZGVz
dHJveUxlZnRvdmVyQ2hpbGRyZW4oKTsKLQotICAgIC8vIERlc3Ryb3kgb3VyIGNvbnRpbnVhdGlv
biBiZWZvcmUgYW55dGhpbmcgb3RoZXIgdGhhbiBhbm9ueW1vdXMgY2hpbGRyZW4uCi0gICAgLy8g
VGhlIHJlYXNvbiB3ZSBkb24ndCBkZXN0cm95IGl0IGJlZm9yZSBhbm9ueW1vdXMgY2hpbGRyZW4g
aXMgdGhhdCB0aGV5IG1heQotICAgIC8vIGhhdmUgY29udGludWF0aW9ucyBvZiB0aGVpciBvd24g
dGhhdCBhcmUgYW5vbnltb3VzIGNoaWxkcmVuIG9mIG91ciBjb250aW51YXRpb24uCi0gICAgaWYg
KG1faW5saW5lQ29udGludWF0aW9uKSB7Ci0gICAgICAgIG1faW5saW5lQ29udGludWF0aW9uLT5k
ZXN0cm95KCk7Ci0gICAgICAgIG1faW5saW5lQ29udGludWF0aW9uID0gMDsKLSAgICB9CiAgICAg
CiAgICAgaWYgKCFkb2N1bWVudEJlaW5nRGVzdHJveWVkKCkpIHsKICAgICAgICAgaWYgKGZpcnN0
TGluZUJveCgpKSB7CkBAIC0zMTYsNyArMzA1LDcgQEAgdm9pZCBSZW5kZXJCbG9jazo6YWRkQ2hp
bGQoUmVuZGVyT2JqZWN0KgogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICghY2hpbGRyZW5Jbmxp
bmUoKSAmJiAobmV3Q2hpbGQtPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSB8fCBuZXdDaGlsZC0+
aXNJbmxpbmUoKSkpIHsKICAgICAgICAgLy8gSWYgd2UncmUgaW5zZXJ0aW5nIGFuIGlubGluZSBj
aGlsZCBidXQgYWxsIG9mIG91ciBjaGlsZHJlbiBhcmUgYmxvY2tzLCB0aGVuIHdlIGhhdmUgdG8g
bWFrZSBzdXJlCi0gICAgICAgIC8vIGl0IGlzIHB1dCBpbnRvIGFuIGFub215b3VzIGJsb2NrIGJv
eC4gV2UgdHJ5IHRvIHVzZSBhbiBleGlzdGluZyBhbm9ueW1vdXMgYm94IGlmIHBvc3NpYmxlLCBv
dGhlcndpc2UKKyAgICAgICAgLy8gaXQgaXMgcHV0IGludG8gYW4gYW5vbnltb3VzIGJsb2NrIGJv
eC4gV2UgdHJ5IHRvIHVzZSBhbiBleGlzdGluZyBhbm9ueW1vdXMgYm94IGlmIHBvc3NpYmxlLCBv
dGhlcndpc2UKICAgICAgICAgLy8gYSBuZXcgb25lIGlzIGNyZWF0ZWQgYW5kIGluc2VydGVkIGlu
dG8gb3VyIGxpc3Qgb2YgY2hpbGRyZW4gaW4gdGhlIGFwcHJvcHJpYXRlIHBvc2l0aW9uLgogICAg
ICAgICBSZW5kZXJPYmplY3QqIGFmdGVyQ2hpbGQgPSBiZWZvcmVDaGlsZCA/IGJlZm9yZUNoaWxk
LT5wcmV2aW91c1NpYmxpbmcoKSA6IGxhc3RDaGlsZCgpOwogCkBAIC00OTAsOSArNDc5LDYgQEAg
dm9pZCBSZW5kZXJCbG9jazo6cmVtb3ZlTGVmdG92ZXJBbm9ueW1vdQogICAgIEFTU0VSVChjaGls
ZC0+aXNBbm9ueW1vdXNCbG9jaygpKTsKICAgICBBU1NFUlQoIWNoaWxkLT5jaGlsZHJlbklubGlu
ZSgpKTsKICAgICAKLSAgICBpZiAoY2hpbGQtPmlubGluZUNvbnRpbnVhdGlvbigpKSAKLSAgICAg
ICAgcmV0dXJuOwotICAgIAogICAgIFJlbmRlck9iamVjdCogZmlyc3RBbkNoaWxkID0gY2hpbGQt
Pm1fY2hpbGRyZW4uZmlyc3RDaGlsZCgpOwogICAgIFJlbmRlck9iamVjdCogbGFzdEFuQ2hpbGQg
PSBjaGlsZC0+bV9jaGlsZHJlbi5sYXN0Q2hpbGQoKTsKICAgICBpZiAoZmlyc3RBbkNoaWxkKSB7
CkBAIC01MzUsNyArNTIxLDcgQEAgdm9pZCBSZW5kZXJCbG9jazo6cmVtb3ZlQ2hpbGQoUmVuZGVy
T2JqZQogICAgIFJlbmRlck9iamVjdCogcHJldiA9IG9sZENoaWxkLT5wcmV2aW91c1NpYmxpbmco
KTsKICAgICBSZW5kZXJPYmplY3QqIG5leHQgPSBvbGRDaGlsZC0+bmV4dFNpYmxpbmcoKTsKICAg
ICBib29sIGNhbkRlbGV0ZUFub255bW91c0Jsb2NrcyA9ICFkb2N1bWVudEJlaW5nRGVzdHJveWVk
KCkgJiYgIWlzSW5saW5lKCkgJiYgIW9sZENoaWxkLT5pc0lubGluZSgpICYmIAotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFvbGRDaGlsZC0+aXNSZW5kZXJCbG9jaygpIHx8
ICF0b1JlbmRlckJsb2NrKG9sZENoaWxkKS0+aW5saW5lQ29udGludWF0aW9uKCkpICYmIAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIW9sZENoaWxkLT5pc1JlbmRlckJsb2Nr
KCkgJiYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIXByZXYgfHwgKHBy
ZXYtPmlzQW5vbnltb3VzQmxvY2soKSAmJiBwcmV2LT5jaGlsZHJlbklubGluZSgpKSkgJiYKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghbmV4dCB8fCAobmV4dC0+aXNBbm9u
eW1vdXNCbG9jaygpICYmIG5leHQtPmNoaWxkcmVuSW5saW5lKCkpKTsKICAgICBpZiAoY2FuRGVs
ZXRlQW5vbnltb3VzQmxvY2tzICYmIHByZXYgJiYgbmV4dCkgewpAQCAtNTk4LDkgKzU4NCwxNSBA
QCBib29sIFJlbmRlckJsb2NrOjppc1NlbGZDb2xsYXBzaW5nQmxvY2soCiAgICAgLy8gb24gd2hl
dGhlciB3ZSBoYXZlIGNvbnRlbnQgdGhhdCBpcyBhbGwgc2VsZi1jb2xsYXBzaW5nIG9yIG5vdC4K
ICAgICBpZiAoaGFzQXV0b0hlaWdodCB8fCAoKHN0eWxlKCktPmhlaWdodCgpLmlzRml4ZWQoKSB8
fCBzdHlsZSgpLT5oZWlnaHQoKS5pc1BlcmNlbnQoKSkgJiYgc3R5bGUoKS0+aGVpZ2h0KCkuaXNa
ZXJvKCkpKSB7CiAgICAgICAgIC8vIElmIHRoZSBibG9jayBoYXMgaW5saW5lIGNoaWxkcmVuLCBz
ZWUgaWYgd2UgZ2VuZXJhdGVkIGFueSBsaW5lIGJveGVzLiAgSWYgd2UgaGF2ZSBhbnkKLSAgICAg
ICAgLy8gbGluZSBib3hlcywgdGhlbiB3ZSBjYW4ndCBiZSBzZWxmLWNvbGxhcHNpbmcsIHNpbmNl
IHdlIGhhdmUgY29udGVudC4KLSAgICAgICAgaWYgKGNoaWxkcmVuSW5saW5lKCkpCi0gICAgICAg
ICAgICByZXR1cm4gIWZpcnN0TGluZUJveCgpOworICAgICAgICAvLyBsaW5lIGJveGVzLCB0aGVu
IHdlIGNhbiBvbmx5IGJlIHNlbGYtY29sbGFwc2luZyBpZiB3ZSBoYXZlIG5vdGhpbmcgYnV0IGFu
b255bW91cyBpbmxpbmUgYmxvY2tzCisgICAgICAgIC8vIHRoYXQgYXJlIGFsc28gc2VsZi1jb2xs
YXBzaW5nIGluc2lkZSB1cy4KKyAgICAgICAgaWYgKGNoaWxkcmVuSW5saW5lKCkpIHsKKyAgICAg
ICAgICAgIGZvciAoUm9vdElubGluZUJveCogY2hpbGQgPSBmaXJzdFJvb3RCb3goKTsgY2hpbGQ7
IGNoaWxkID0gY2hpbGQtPm5leHRSb290Qm94KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWNo
aWxkLT5hbm9ueW1vdXNJbmxpbmVCbG9jaygpIHx8ICFjaGlsZC0+YW5vbnltb3VzSW5saW5lQmxv
Y2soKS0+aXNTZWxmQ29sbGFwc2luZ0Jsb2NrKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBXZSBo
YXZlIG5vIGxpbmUgYm94ZXMsIHNvIHdlIG11c3QgYmUgc2VsZi1jb2xsYXBzaW5nLgorICAgICAg
ICB9CiAgICAgICAgIAogICAgICAgICAvLyBXaGV0aGVyIG9yIG5vdCB3ZSBjb2xsYXBzZSBpcyBk
ZXBlbmRlbnQgb24gd2hldGhlciBhbGwgb3VyIG5vcm1hbCBmbG93IGNoaWxkcmVuCiAgICAgICAg
IC8vIGFyZSBhbHNvIHNlbGYtY29sbGFwc2luZy4KQEAgLTg1NSw3ICs4NDcsOCBAQCB2b2lkIFJl
bmRlckJsb2NrOjphZGRPdmVyZmxvd0Zyb21GbG9hdHMoCiAKIGJvb2wgUmVuZGVyQmxvY2s6OmV4
cGFuZHNUb0VuY2xvc2VPdmVyaGFuZ2luZ0Zsb2F0cygpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIGlz
SW5saW5lQmxvY2tPcklubGluZVRhYmxlKCkgfHwgaXNGbG9hdGluZ09yUG9zaXRpb25lZCgpIHx8
IGhhc092ZXJmbG93Q2xpcCgpIHx8IChwYXJlbnQoKSAmJiBwYXJlbnQoKS0+aXNGbGV4aWJsZUJv
eCgpKSB8fCBoYXNDb2x1bW5zKCkgfHwgaXNUYWJsZUNlbGwoKSB8fCBpc0ZpZWxkc2V0KCk7Cisg
ICAgcmV0dXJuIGlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSB8fCBoYXNPdmVyZmxvd0NsaXAoKSB8
fCAocGFyZW50KCkgJiYgcGFyZW50KCktPmlzRmxleGlibGVCb3goKSkgfHwgaGFzQ29sdW1ucygp
IHx8IGlzVGFibGVDZWxsKCkgfHwgaXNGaWVsZHNldCgpIHx8CisgICAgICAgICAgIChpc0lubGlu
ZUJsb2NrT3JJbmxpbmVUYWJsZSgpICYmICFpc0Fub255bW91c0lubGluZUJsb2NrKCkpOwogfQog
CiB2b2lkIFJlbmRlckJsb2NrOjphZGp1c3RQb3NpdGlvbmVkQmxvY2soUmVuZGVyQm94KiBjaGls
ZCwgY29uc3QgTWFyZ2luSW5mbyYgbWFyZ2luSW5mbykKQEAgLTEwMDEsMTkgKzk5NCwxOSBAQCBi
b29sIFJlbmRlckJsb2NrOjpoYW5kbGVSdW5JbkNoaWxkKFJlbmRlCiBpbnQgUmVuZGVyQmxvY2s6
OmNvbGxhcHNlTWFyZ2lucyhSZW5kZXJCb3gqIGNoaWxkLCBNYXJnaW5JbmZvJiBtYXJnaW5JbmZv
KQogewogICAgIC8vIEdldCBvdXIgbWF4IHBvcyBhbmQgbmVnIHRvcCBtYXJnaW5zLgotICAgIGlu
dCBwb3NUb3AgPSBjaGlsZC0+bWF4VG9wTWFyZ2luKHRydWUpOwotICAgIGludCBuZWdUb3AgPSBj
aGlsZC0+bWF4VG9wTWFyZ2luKGZhbHNlKTsKKyAgICBpbnQgcG9zVG9wID0gY2hpbGQgPyBjaGls
ZC0+bWF4VG9wTWFyZ2luKHRydWUpIDogMDsKKyAgICBpbnQgbmVnVG9wID0gY2hpbGQgPyBjaGls
ZC0+bWF4VG9wTWFyZ2luKGZhbHNlKSA6IDA7CiAKICAgICAvLyBGb3Igc2VsZi1jb2xsYXBzaW5n
IGJsb2NrcywgY29sbGFwc2Ugb3VyIGJvdHRvbSBtYXJnaW5zIGludG8gb3VyCiAgICAgLy8gdG9w
IHRvIGdldCBuZXcgcG9zVG9wIGFuZCBuZWdUb3AgdmFsdWVzLgotICAgIGlmIChjaGlsZC0+aXNT
ZWxmQ29sbGFwc2luZ0Jsb2NrKCkpIHsKKyAgICBpZiAoY2hpbGQgJiYgY2hpbGQtPmlzU2VsZkNv
bGxhcHNpbmdCbG9jaygpKSB7CiAgICAgICAgIHBvc1RvcCA9IG1heChwb3NUb3AsIGNoaWxkLT5t
YXhCb3R0b21NYXJnaW4odHJ1ZSkpOwogICAgICAgICBuZWdUb3AgPSBtYXgobmVnVG9wLCBjaGls
ZC0+bWF4Qm90dG9tTWFyZ2luKGZhbHNlKSk7CiAgICAgfQogICAgIAogICAgIC8vIFNlZSBpZiB0
aGUgdG9wIG1hcmdpbiBpcyBxdWlya3kuIFdlIG9ubHkgY2FyZSBpZiB0aGlzIGNoaWxkIGhhcwog
ICAgIC8vIG1hcmdpbnMgdGhhdCB3aWxsIGNvbGxhcHNlIHdpdGggdXMuCi0gICAgYm9vbCB0b3BR
dWlyayA9IGNoaWxkLT5pc1RvcE1hcmdpblF1aXJrKCkgfHwgc3R5bGUoKS0+bWFyZ2luVG9wQ29s
bGFwc2UoKSA9PSBNRElTQ0FSRDsKKyAgICBib29sIHRvcFF1aXJrID0gKGNoaWxkICYmIGNoaWxk
LT5pc1RvcE1hcmdpblF1aXJrKCkpIHx8IHN0eWxlKCktPm1hcmdpblRvcENvbGxhcHNlKCkgPT0g
TURJU0NBUkQ7CiAKICAgICBpZiAobWFyZ2luSW5mby5jYW5Db2xsYXBzZVdpdGhUb3AoKSkgewog
ICAgICAgICAvLyBUaGlzIGNoaWxkIGlzIGNvbGxhcHNpbmcgd2l0aCB0aGUgdG9wIG9mIHRoZQpA
QCAtMTAyNiw3ICsxMDE5LDcgQEAgaW50IFJlbmRlckJsb2NrOjpjb2xsYXBzZU1hcmdpbnMoUmVu
ZGVyQgogICAgICAgICAvLyBjb2xsYXBzZSBpdCBhd2F5LCBldmVuIGlmIHRoZSBtYXJnaW4gaXMg
c21hbGxlciAod3d3LndlYnJlZmVyZW5jZS5jb20KICAgICAgICAgLy8gaGFzIGFuIGV4YW1wbGUg
b2YgdGhpcywgYSA8ZHQ+IHdpdGggMC44ZW0gYXV0aG9yLXNwZWNpZmllZCBpbnNpZGUKICAgICAg
ICAgLy8gYSA8ZGw+IGluc2lkZSBhIDx0ZD4uCi0gICAgICAgIGlmICghbWFyZ2luSW5mby5kZXRl
cm1pbmVkVG9wUXVpcmsoKSAmJiAhdG9wUXVpcmsgJiYgKHBvc1RvcC1uZWdUb3ApKSB7CisgICAg
ICAgIGlmICghbWFyZ2luSW5mby5kZXRlcm1pbmVkVG9wUXVpcmsoKSAmJiAhdG9wUXVpcmsgJiYg
KHBvc1RvcCAtIG5lZ1RvcCkpIHsKICAgICAgICAgICAgIHNldFRvcE1hcmdpblF1aXJrKGZhbHNl
KTsKICAgICAgICAgICAgIG1hcmdpbkluZm8uc2V0RGV0ZXJtaW5lZFRvcFF1aXJrKHRydWUpOwog
ICAgICAgICB9CkBAIC0xMDQ0LDcgKzEwMzcsNyBAQCBpbnQgUmVuZGVyQmxvY2s6OmNvbGxhcHNl
TWFyZ2lucyhSZW5kZXJCCiAgICAgICAgIG1hcmdpbkluZm8uc2V0VG9wUXVpcmsodG9wUXVpcmsp
OwogCiAgICAgaW50IHlwb3MgPSBoZWlnaHQoKTsKLSAgICBpZiAoY2hpbGQtPmlzU2VsZkNvbGxh
cHNpbmdCbG9jaygpKSB7CisgICAgaWYgKGNoaWxkICYmIGNoaWxkLT5pc1NlbGZDb2xsYXBzaW5n
QmxvY2soKSkgewogICAgICAgICAvLyBUaGlzIGNoaWxkIGhhcyBubyBoZWlnaHQuICBXZSBuZWVk
IHRvIGNvbXB1dGUgb3VyCiAgICAgICAgIC8vIHBvc2l0aW9uIGJlZm9yZSB3ZSBjb2xsYXBzZSB0
aGUgY2hpbGQncyBtYXJnaW5zIHRvZ2V0aGVyLAogICAgICAgICAvLyBzbyB0aGF0IHdlIGNhbiBn
ZXQgYW4gYWNjdXJhdGUgcG9zaXRpb24gZm9yIHRoZSB6ZXJvLWhlaWdodCBibG9jay4KQEAgLTEw
NjMsMTMgKzEwNTYsMTEgQEAgaW50IFJlbmRlckJsb2NrOjpjb2xsYXBzZU1hcmdpbnMoUmVuZGVy
QgogICAgICAgICAgICAgLy8gdGhhdCBuZWVkcyB0byBiZSBwb3NpdGlvbmVkIGNvcnJlY3RseSAo
ZS5nLiwgYSBibG9jayB0aGF0CiAgICAgICAgICAgICAvLyBoYWQgYSBzcGVjaWZpZWQgaGVpZ2h0
IG9mIDAgYnV0IHRoYXQgYWN0dWFsbHkgaGFkIHN1YmNvbnRlbnQpLgogICAgICAgICAgICAgeXBv
cyA9IGhlaWdodCgpICsgY29sbGFwc2VkVG9wUG9zIC0gY29sbGFwc2VkVG9wTmVnOwotICAgIH0K
LSAgICBlbHNlIHsKLSAgICAgICAgaWYgKGNoaWxkLT5zdHlsZSgpLT5tYXJnaW5Ub3BDb2xsYXBz
ZSgpID09IE1TRVBBUkFURSkgeworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChjaGlsZCAmJiBj
aGlsZC0+c3R5bGUoKS0+bWFyZ2luVG9wQ29sbGFwc2UoKSA9PSBNU0VQQVJBVEUpIHsKICAgICAg
ICAgICAgIHNldEhlaWdodChoZWlnaHQoKSArIG1hcmdpbkluZm8ubWFyZ2luKCkgKyBjaGlsZC0+
bWFyZ2luVG9wKCkpOwogICAgICAgICAgICAgeXBvcyA9IGhlaWdodCgpOwotICAgICAgICB9Ci0g
ICAgICAgIGVsc2UgaWYgKCFtYXJnaW5JbmZvLmF0VG9wT2ZCbG9jaygpIHx8CisgICAgICAgIH0g
ZWxzZSBpZiAoIW1hcmdpbkluZm8uYXRUb3BPZkJsb2NrKCkgfHwKICAgICAgICAgICAgICghbWFy
Z2luSW5mby5jYW5Db2xsYXBzZVRvcFdpdGhDaGlsZHJlbigpCiAgICAgICAgICAgICAgJiYgKCFz
dHlsZSgpLT5odG1sSGFja3MoKSB8fCAhbWFyZ2luSW5mby5xdWlya0NvbnRhaW5lcigpIHx8ICFt
YXJnaW5JbmZvLnRvcFF1aXJrKCkpKSkgewogICAgICAgICAgICAgLy8gV2UncmUgY29sbGFwc2lu
ZyB3aXRoIGEgcHJldmlvdXMgc2libGluZydzIG1hcmdpbnMgYW5kIG5vdApAQCAtMTA3OCwxMSAr
MTA2OSwxMSBAQCBpbnQgUmVuZGVyQmxvY2s6OmNvbGxhcHNlTWFyZ2lucyhSZW5kZXJCCiAgICAg
ICAgICAgICB5cG9zID0gaGVpZ2h0KCk7CiAgICAgICAgIH0KIAotICAgICAgICBtYXJnaW5JbmZv
LnNldFBvc01hcmdpbihjaGlsZC0+bWF4Qm90dG9tTWFyZ2luKHRydWUpKTsKLSAgICAgICAgbWFy
Z2luSW5mby5zZXROZWdNYXJnaW4oY2hpbGQtPm1heEJvdHRvbU1hcmdpbihmYWxzZSkpOworICAg
ICAgICBtYXJnaW5JbmZvLnNldFBvc01hcmdpbihjaGlsZCA/IGNoaWxkLT5tYXhCb3R0b21NYXJn
aW4odHJ1ZSkgOiAwKTsKKyAgICAgICAgbWFyZ2luSW5mby5zZXROZWdNYXJnaW4oY2hpbGQgPyBj
aGlsZC0+bWF4Qm90dG9tTWFyZ2luKGZhbHNlKSA6IDApOwogCiAgICAgICAgIGlmIChtYXJnaW5J
bmZvLm1hcmdpbigpKQotICAgICAgICAgICAgbWFyZ2luSW5mby5zZXRCb3R0b21RdWlyayhjaGls
ZC0+aXNCb3R0b21NYXJnaW5RdWlyaygpIHx8IHN0eWxlKCktPm1hcmdpbkJvdHRvbUNvbGxhcHNl
KCkgPT0gTURJU0NBUkQpOworICAgICAgICAgICAgbWFyZ2luSW5mby5zZXRCb3R0b21RdWlyaygo
Y2hpbGQgJiYgY2hpbGQtPmlzQm90dG9tTWFyZ2luUXVpcmsoKSkgfHwgc3R5bGUoKS0+bWFyZ2lu
Qm90dG9tQ29sbGFwc2UoKSA9PSBNRElTQ0FSRCk7CiAgICAgfQogICAgIAogICAgIHJldHVybiB5
cG9zOwpAQCAtMTc0OSwyMCArMTc0MCw3IEBAIHZvaWQgUmVuZGVyQmxvY2s6OnBhaW50T2JqZWN0
KFBhaW50SW5mbyYKICAgICBpZiAoKHBhaW50UGhhc2UgPT0gUGFpbnRQaGFzZU91dGxpbmUgfHwg
cGFpbnRQaGFzZSA9PSBQYWludFBoYXNlU2VsZk91dGxpbmUpICYmIGhhc091dGxpbmUoKSAmJiBz
dHlsZSgpLT52aXNpYmlsaXR5KCkgPT0gVklTSUJMRSkKICAgICAgICAgcGFpbnRPdXRsaW5lKHBh
aW50SW5mby5jb250ZXh0LCB0eCwgdHksIHdpZHRoKCksIGhlaWdodCgpLCBzdHlsZSgpKTsKIAot
ICAgIC8vIDYuIHBhaW50IGNvbnRpbnVhdGlvbiBvdXRsaW5lcy4KLSAgICBpZiAoKHBhaW50UGhh
c2UgPT0gUGFpbnRQaGFzZU91dGxpbmUgfHwgcGFpbnRQaGFzZSA9PSBQYWludFBoYXNlQ2hpbGRP
dXRsaW5lcykpIHsKLSAgICAgICAgaWYgKGlubGluZUNvbnRpbnVhdGlvbigpICYmIGlubGluZUNv
bnRpbnVhdGlvbigpLT5oYXNPdXRsaW5lKCkgJiYgaW5saW5lQ29udGludWF0aW9uKCktPnN0eWxl
KCktPnZpc2liaWxpdHkoKSA9PSBWSVNJQkxFKSB7Ci0gICAgICAgICAgICBSZW5kZXJJbmxpbmUq
IGlubGluZVJlbmRlcmVyID0gdG9SZW5kZXJJbmxpbmUoaW5saW5lQ29udGludWF0aW9uKCktPm5v
ZGUoKS0+cmVuZGVyZXIoKSk7Ci0gICAgICAgICAgICBpZiAoIWlubGluZVJlbmRlcmVyLT5oYXNT
ZWxmUGFpbnRpbmdMYXllcigpKQotICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdCbG9jaygpLT5h
ZGRDb250aW51YXRpb25XaXRoT3V0bGluZShpbmxpbmVSZW5kZXJlcik7Ci0gICAgICAgICAgICBl
bHNlIGlmICghaW5saW5lUmVuZGVyZXItPmZpcnN0TGluZUJveCgpKQotICAgICAgICAgICAgICAg
IGlubGluZVJlbmRlcmVyLT5wYWludE91dGxpbmUocGFpbnRJbmZvLmNvbnRleHQsIHR4IC0geCgp
ICsgaW5saW5lUmVuZGVyZXItPmNvbnRhaW5pbmdCbG9jaygpLT54KCksCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eSAtIHkoKSArIGlubGluZVJlbmRlcmVy
LT5jb250YWluaW5nQmxvY2soKS0+eSgpKTsKLSAgICAgICAgfQotICAgICAgICBwYWludENvbnRp
bnVhdGlvbk91dGxpbmVzKHBhaW50SW5mbywgdHgsIHR5KTsKLSAgICB9Ci0KLSAgICAvLyA3LiBw
YWludCBjYXJldC4KKyAgICAvLyA2LiBwYWludCBjYXJldC4KICAgICAvLyBJZiB0aGUgY2FyZXQn
cyBub2RlJ3MgcmVuZGVyIG9iamVjdCdzIGNvbnRhaW5pbmcgYmxvY2sgaXMgdGhpcyBibG9jaywg
YW5kIHRoZSBwYWludCBhY3Rpb24gaXMgUGFpbnRQaGFzZUZvcmVncm91bmQsCiAgICAgLy8gdGhl
biBwYWludCB0aGUgY2FyZXQuCiAgICAgaWYgKHBhaW50UGhhc2UgPT0gUGFpbnRQaGFzZUZvcmVn
cm91bmQpIHsgICAgICAgIApAQCAtMTgyNSw1NyArMTgwMyw2IEBAIHZvaWQgUmVuZGVyQmxvY2s6
OnBhaW50RWxsaXBzaXNCb3hlcyhQYWkKICAgICB9CiB9CiAKLXN0YXRpYyBDb250aW51YXRpb25P
dXRsaW5lVGFibGVNYXAqIGNvbnRpbnVhdGlvbk91dGxpbmVUYWJsZSgpCi17Ci0gICAgREVGSU5F
X1NUQVRJQ19MT0NBTChDb250aW51YXRpb25PdXRsaW5lVGFibGVNYXAsIHRhYmxlLCAoKSk7Ci0g
ICAgcmV0dXJuICZ0YWJsZTsKLX0KLQotdm9pZCBSZW5kZXJCbG9jazo6YWRkQ29udGludWF0aW9u
V2l0aE91dGxpbmUoUmVuZGVySW5saW5lKiBmbG93KQotewotICAgIC8vIFdlIGNhbid0IG1ha2Ug
dGhpcyB3b3JrIGlmIHRoZSBpbmxpbmUgaXMgaW4gYSBsYXllci4gIFdlJ2xsIGp1c3QgcmVseSBv
biB0aGUgYnJva2VuCi0gICAgLy8gd2F5IG9mIHBhaW50aW5nLgotICAgIEFTU0VSVCghZmxvdy0+
bGF5ZXIoKSAmJiAhZmxvdy0+aXNJbmxpbmVDb250aW51YXRpb24oKSk7Ci0gICAgCi0gICAgQ29u
dGludWF0aW9uT3V0bGluZVRhYmxlTWFwKiB0YWJsZSA9IGNvbnRpbnVhdGlvbk91dGxpbmVUYWJs
ZSgpOwotICAgIExpc3RIYXNoU2V0PFJlbmRlcklubGluZSo+KiBjb250aW51YXRpb25zID0gdGFi
bGUtPmdldCh0aGlzKTsKLSAgICBpZiAoIWNvbnRpbnVhdGlvbnMpIHsKLSAgICAgICAgY29udGlu
dWF0aW9ucyA9IG5ldyBMaXN0SGFzaFNldDxSZW5kZXJJbmxpbmUqPjsKLSAgICAgICAgdGFibGUt
PnNldCh0aGlzLCBjb250aW51YXRpb25zKTsKLSAgICB9Ci0gICAgCi0gICAgY29udGludWF0aW9u
cy0+YWRkKGZsb3cpOwotfQotCi12b2lkIFJlbmRlckJsb2NrOjpwYWludENvbnRpbnVhdGlvbk91
dGxpbmVzKFBhaW50SW5mbyYgaW5mbywgaW50IHR4LCBpbnQgdHkpCi17Ci0gICAgQ29udGludWF0
aW9uT3V0bGluZVRhYmxlTWFwKiB0YWJsZSA9IGNvbnRpbnVhdGlvbk91dGxpbmVUYWJsZSgpOwot
ICAgIGlmICh0YWJsZS0+aXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAg
IExpc3RIYXNoU2V0PFJlbmRlcklubGluZSo+KiBjb250aW51YXRpb25zID0gdGFibGUtPmdldCh0
aGlzKTsKLSAgICBpZiAoIWNvbnRpbnVhdGlvbnMpCi0gICAgICAgIHJldHVybjsKLSAgICAgICAg
Ci0gICAgLy8gUGFpbnQgZWFjaCBjb250aW51YXRpb24gb3V0bGluZS4KLSAgICBMaXN0SGFzaFNl
dDxSZW5kZXJJbmxpbmUqPjo6aXRlcmF0b3IgZW5kID0gY29udGludWF0aW9ucy0+ZW5kKCk7Ci0g
ICAgZm9yIChMaXN0SGFzaFNldDxSZW5kZXJJbmxpbmUqPjo6aXRlcmF0b3IgaXQgPSBjb250aW51
YXRpb25zLT5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgLy8gTmVlZCB0byBh
ZGQgaW4gdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBpbnRlcnZlbmluZyBibG9ja3MuCi0gICAgICAg
IFJlbmRlcklubGluZSogZmxvdyA9ICppdDsKLSAgICAgICAgUmVuZGVyQmxvY2sqIGJsb2NrID0g
Zmxvdy0+Y29udGFpbmluZ0Jsb2NrKCk7Ci0gICAgICAgIGZvciAoIDsgYmxvY2sgJiYgYmxvY2sg
IT0gdGhpczsgYmxvY2sgPSBibG9jay0+Y29udGFpbmluZ0Jsb2NrKCkpIHsKLSAgICAgICAgICAg
IHR4ICs9IGJsb2NrLT54KCk7Ci0gICAgICAgICAgICB0eSArPSBibG9jay0+eSgpOwotICAgICAg
ICB9Ci0gICAgICAgIEFTU0VSVChibG9jayk7ICAgCi0gICAgICAgIGZsb3ctPnBhaW50T3V0bGlu
ZShpbmZvLmNvbnRleHQsIHR4LCB0eSk7Ci0gICAgfQotICAgIAotICAgIC8vIERlbGV0ZQotICAg
IGRlbGV0ZSBjb250aW51YXRpb25zOwotICAgIHRhYmxlLT5yZW1vdmUodGhpcyk7Ci19Ci0KIHZv
aWQgUmVuZGVyQmxvY2s6OnNldFNlbGVjdGlvblN0YXRlKFNlbGVjdGlvblN0YXRlIHMpCiB7CiAg
ICAgaWYgKHNlbGVjdGlvblN0YXRlKCkgPT0gcykKQEAgLTE4OTAsNiArMTgxNywxMiBAQCB2b2lk
IFJlbmRlckJsb2NrOjpzZXRTZWxlY3Rpb25TdGF0ZShTZWxlCiAgICAgZWxzZQogICAgICAgICBS
ZW5kZXJCb3g6OnNldFNlbGVjdGlvblN0YXRlKHMpOwogICAgIAorICAgIGlmIChpc1JlcGxhY2Vk
KCkgJiYgbV9pbmxpbmVCb3hXcmFwcGVyKSB7CisgICAgICAgIFJvb3RJbmxpbmVCb3gqIGxpbmUg
PSBtX2lubGluZUJveFdyYXBwZXItPnJvb3QoKTsKKyAgICAgICAgaWYgKGxpbmUpCisgICAgICAg
ICAgICBsaW5lLT5zZXRIYXNTZWxlY3RlZENoaWxkcmVuKHMgIT0gU2VsZWN0aW9uTm9uZSk7Cisg
ICAgfQorCiAgICAgUmVuZGVyQmxvY2sqIGNiID0gY29udGFpbmluZ0Jsb2NrKCk7CiAgICAgaWYg
KGNiICYmICFjYi0+aXNSZW5kZXJWaWV3KCkpCiAgICAgICAgIGNiLT5zZXRTZWxlY3Rpb25TdGF0
ZShzKTsKQEAgLTE5MDgsOSArMTg0MSw5IEBAIGJvb2wgUmVuZGVyQmxvY2s6OmlzU2VsZWN0aW9u
Um9vdCgpIGNvbnMKICAgICAvLyBGSVhNRTogRXZlbnR1YWxseSB0YWJsZXMgc2hvdWxkIGhhdmUg
dG8gbGVhcm4gaG93IHRvIGZpbGwgZ2FwcyBiZXR3ZWVuIGNlbGxzLCBhdCBsZWFzdCBpbiBzaW1w
bGUgbm9uLXNwYW5uaW5nIGNhc2VzLgogICAgIGlmIChpc1RhYmxlKCkpCiAgICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICAgICAgCisKICAgICBpZiAoaXNCb2R5KCkgfHwgaXNSb290KCkgfHwgaGFz
T3ZlcmZsb3dDbGlwKCkgfHwgaXNSZWxQb3NpdGlvbmVkKCkgfHwKLSAgICAgICAgaXNGbG9hdGlu
Z09yUG9zaXRpb25lZCgpIHx8IGlzVGFibGVDZWxsKCkgfHwgaXNJbmxpbmVCbG9ja09ySW5saW5l
VGFibGUoKSB8fCBoYXNUcmFuc2Zvcm0oKSB8fAorICAgICAgICBpc0Zsb2F0aW5nT3JQb3NpdGlv
bmVkKCkgfHwgaXNUYWJsZUNlbGwoKSB8fCAoaXNJbmxpbmVCbG9ja09ySW5saW5lVGFibGUoKSAm
JiAhaXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKSB8fCBoYXNUcmFuc2Zvcm0oKSB8fAogICAgICAg
ICBoYXNSZWZsZWN0aW9uKCkgfHwgaGFzTWFzaygpKQogICAgICAgICByZXR1cm4gdHJ1ZTsKICAg
ICAKQEAgLTIwNTUsMTggKzE5ODgsMzAgQEAgR2FwUmVjdHMgUmVuZGVyQmxvY2s6OmZpbGxJbmxp
bmVTZWxlY3RpbwogICAgIGZvciAoY3VyciA9IGZpcnN0Um9vdEJveCgpOyBjdXJyICYmICFjdXJy
LT5oYXNTZWxlY3RlZENoaWxkcmVuKCk7IGN1cnIgPSBjdXJyLT5uZXh0Um9vdEJveCgpKSB7IH0K
IAogICAgIC8vIE5vdyBwYWludCB0aGUgZ2FwcyBmb3IgdGhlIGxpbmVzLgotICAgIGZvciAoOyBj
dXJyICYmIGN1cnItPmhhc1NlbGVjdGVkQ2hpbGRyZW4oKTsgY3VyciA9IGN1cnItPm5leHRSb290
Qm94KCkpIHsKKyAgICBmb3IgKDsgY3VyciAmJiAoY3Vyci0+aGFzU2VsZWN0ZWRDaGlsZHJlbigp
IHx8IGN1cnItPmFub255bW91c0lubGluZUJsb2NrKCkpOyBjdXJyID0gY3Vyci0+bmV4dFJvb3RC
b3goKSkgeworICAgICAgICBpZiAoIWN1cnItPmhhc1NlbGVjdGVkQ2hpbGRyZW4oKSkKKyAgICAg
ICAgICAgIGNvbnRpbnVlOworCiAgICAgICAgIGludCBzZWxUb3AgPSAgY3Vyci0+c2VsZWN0aW9u
VG9wKCk7CiAgICAgICAgIGludCBzZWxIZWlnaHQgPSBjdXJyLT5zZWxlY3Rpb25IZWlnaHQoKTsK
IAotICAgICAgICBpZiAoIWNvbnRhaW5zU3RhcnQgJiYgIWxhc3RTZWxlY3RlZExpbmUgJiYKLSAg
ICAgICAgICAgIHNlbGVjdGlvblN0YXRlKCkgIT0gU2VsZWN0aW9uU3RhcnQgJiYgc2VsZWN0aW9u
U3RhdGUoKSAhPSBTZWxlY3Rpb25Cb3RoKQotICAgICAgICAgICAgcmVzdWx0LnVuaXRlQ2VudGVy
KGZpbGxWZXJ0aWNhbFNlbGVjdGlvbkdhcChsYXN0VG9wLCBsYXN0TGVmdCwgbGFzdFJpZ2h0LCB0
eSArIHNlbFRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgcm9vdEJsb2NrLCBibG9ja1gsIGJsb2NrWSwgcGFpbnRJbmZvKSk7Ci0KLSAg
ICAgICAgaWYgKCFwYWludEluZm8gfHwgKHR5ICsgc2VsVG9wIDwgcGFpbnRJbmZvLT5yZWN0LmJv
dHRvbSgpICYmIHR5ICsgc2VsVG9wICsgc2VsSGVpZ2h0ID4gcGFpbnRJbmZvLT5yZWN0LnkoKSkp
Ci0gICAgICAgICAgICByZXN1bHQudW5pdGUoY3Vyci0+ZmlsbExpbmVTZWxlY3Rpb25HYXAoc2Vs
VG9wLCBzZWxIZWlnaHQsIHJvb3RCbG9jaywgYmxvY2tYLCBibG9ja1ksIHR4LCB0eSwgcGFpbnRJ
bmZvKSk7CisgICAgICAgIGlmIChjdXJyLT5hbm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CisgICAg
ICAgICAgICBpZiAobGFzdFNlbGVjdGVkTGluZSkgeworICAgICAgICAgICAgICAgIGxhc3RUb3Ag
PSAodHkgLSBibG9ja1kpICsgbGFzdFNlbGVjdGVkTGluZS0+c2VsZWN0aW9uQm90dG9tKCk7Cisg
ICAgICAgICAgICAgICAgbGFzdExlZnQgPSBsZWZ0U2VsZWN0aW9uT2Zmc2V0KHJvb3RCbG9jaywg
bGFzdFNlbGVjdGVkTGluZS0+c2VsZWN0aW9uQm90dG9tKCkpOworICAgICAgICAgICAgICAgIGxh
c3RSaWdodCA9IHJpZ2h0U2VsZWN0aW9uT2Zmc2V0KHJvb3RCbG9jaywgbGFzdFNlbGVjdGVkTGlu
ZS0+c2VsZWN0aW9uQm90dG9tKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGFp
bnNTdGFydCA9IGZhbHNlOworICAgICAgICAgICAgcmVzdWx0LnVuaXRlKGN1cnItPmFub255bW91
c0lubGluZUJsb2NrKCktPmZpbGxTZWxlY3Rpb25HYXBzKHJvb3RCbG9jaywgYmxvY2tYLCBibG9j
a1ksIHR4ICsgY3Vyci0+eCgpLCB0eSArIGN1cnItPnkoKSwgbGFzdFRvcCwgbGFzdExlZnQsIGxh
c3RSaWdodCwgcGFpbnRJbmZvKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAo
IWNvbnRhaW5zU3RhcnQgJiYgKCFsYXN0U2VsZWN0ZWRMaW5lIHx8IGxhc3RTZWxlY3RlZExpbmUt
PmFub255bW91c0lubGluZUJsb2NrKCkpKQorICAgICAgICAgICAgICAgIHJlc3VsdC51bml0ZUNl
bnRlcihmaWxsVmVydGljYWxTZWxlY3Rpb25HYXAobGFzdFRvcCwgbGFzdExlZnQsIGxhc3RSaWdo
dCwgdHkgKyBzZWxUb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICByb290QmxvY2ssIGJsb2NrWCwgYmxvY2tZLCBwYWludEluZm8p
KTsKIAorICAgICAgICAgICAgaWYgKCFwYWludEluZm8gfHwgKHR5ICsgc2VsVG9wIDwgcGFpbnRJ
bmZvLT5yZWN0LmJvdHRvbSgpICYmIHR5ICsgc2VsVG9wICsgc2VsSGVpZ2h0ID4gcGFpbnRJbmZv
LT5yZWN0LnkoKSkpCisgICAgICAgICAgICAgICAgcmVzdWx0LnVuaXRlKGN1cnItPmZpbGxMaW5l
U2VsZWN0aW9uR2FwKHNlbFRvcCwgc2VsSGVpZ2h0LCByb290QmxvY2ssIGJsb2NrWCwgYmxvY2tZ
LCB0eCwgdHksIHBhaW50SW5mbykpOworICAgICAgICB9CisgICAgICAgIAogICAgICAgICBsYXN0
U2VsZWN0ZWRMaW5lID0gY3VycjsKICAgICB9CiAKQEAgLTIwNzQsOCArMjAxOSw4IEBAIEdhcFJl
Y3RzIFJlbmRlckJsb2NrOjpmaWxsSW5saW5lU2VsZWN0aW8KICAgICAgICAgLy8gVmlzaWJsZVNl
bGVjdGlvbiBtdXN0IHN0YXJ0IGp1c3QgYWZ0ZXIgb3VyIGxhc3QgbGluZS4KICAgICAgICAgbGFz
dFNlbGVjdGVkTGluZSA9IGxhc3RSb290Qm94KCk7CiAKLSAgICBpZiAobGFzdFNlbGVjdGVkTGlu
ZSAmJiBzZWxlY3Rpb25TdGF0ZSgpICE9IFNlbGVjdGlvbkVuZCAmJiBzZWxlY3Rpb25TdGF0ZSgp
ICE9IFNlbGVjdGlvbkJvdGgpIHsKLSAgICAgICAgLy8gR28gYWhlYWQgYW5kIHVwZGF0ZSBvdXIg
bGFzdFkgdG8gYmUgdGhlIGJvdHRvbSBvZiB0aGUgbGFzdCBzZWxlY3RlZCBsaW5lLgorICAgIGlm
IChsYXN0U2VsZWN0ZWRMaW5lICYmICFsYXN0U2VsZWN0ZWRMaW5lLT5hbm9ueW1vdXNJbmxpbmVC
bG9jaygpICYmIHNlbGVjdGlvblN0YXRlKCkgIT0gU2VsZWN0aW9uRW5kICYmIHNlbGVjdGlvblN0
YXRlKCkgIT0gU2VsZWN0aW9uQm90aCkgeworICAgICAgICAvLyBHbyBhaGVhZCBhbmQgdXBkYXRl
IG91ciBsYXN0VG9wIHRvIGJlIHRoZSBib3R0b20gb2YgdGhlIGxhc3Qgc2VsZWN0ZWQgbGluZS4K
ICAgICAgICAgbGFzdFRvcCA9ICh0eSAtIGJsb2NrWSkgKyBsYXN0U2VsZWN0ZWRMaW5lLT5zZWxl
Y3Rpb25Cb3R0b20oKTsKICAgICAgICAgbGFzdExlZnQgPSBsZWZ0U2VsZWN0aW9uT2Zmc2V0KHJv
b3RCbG9jaywgbGFzdFNlbGVjdGVkTGluZS0+c2VsZWN0aW9uQm90dG9tKCkpOwogICAgICAgICBs
YXN0UmlnaHQgPSByaWdodFNlbGVjdGlvbk9mZnNldChyb290QmxvY2ssIGxhc3RTZWxlY3RlZExp
bmUtPnNlbGVjdGlvbkJvdHRvbSgpKTsKQEAgLTI5ODUsMjUgKzI5MzAsMzEgQEAgdm9pZCBSZW5k
ZXJCbG9jazo6Y2xlYXJGbG9hdHMoKQogICAgIC8vIG91dCBvZiBmbG93IChsaWtlIGZsb2F0aW5n
L3Bvc2l0aW9uZWQgZWxlbWVudHMpLCBhbmQgd2UgYWxzbyBza2lwIG92ZXIgYW55IG9iamVjdHMg
dGhhdCBtYXkgaGF2ZSBzaGlmdGVkCiAgICAgLy8gdG8gYXZvaWQgZmxvYXRzLgogICAgIGJvb2wg
cGFyZW50SGFzRmxvYXRzID0gZmFsc2U7Ci0gICAgUmVuZGVyT2JqZWN0KiBwcmV2ID0gcHJldmlv
dXNTaWJsaW5nKCk7Ci0gICAgd2hpbGUgKHByZXYgJiYgKHByZXYtPmlzRmxvYXRpbmdPclBvc2l0
aW9uZWQoKSB8fCAhcHJldi0+aXNCb3goKSB8fCAhcHJldi0+aXNSZW5kZXJCbG9jaygpIHx8IHRv
UmVuZGVyQmxvY2socHJldiktPmF2b2lkc0Zsb2F0cygpKSkgewotICAgICAgICBpZiAocHJldi0+
aXNGbG9hdGluZygpKQotICAgICAgICAgICAgcGFyZW50SGFzRmxvYXRzID0gdHJ1ZTsKLSAgICAg
ICAgIHByZXYgPSBwcmV2LT5wcmV2aW91c1NpYmxpbmcoKTsKKyAgICBSZW5kZXJPYmplY3QqIHBy
ZXYgPSAwOworICAgIFJlbmRlckJsb2NrKiBwYXJlbnRCbG9jayA9IDA7CisgICAgaWYgKGlzQW5v
bnltb3VzSW5saW5lQmxvY2soKSkgeworICAgICAgICBwYXJlbnRCbG9jayA9IGNvbnRhaW5pbmdC
bG9jaygpOworICAgICAgICBwYXJlbnRIYXNGbG9hdHMgPSBwYXJlbnRCbG9jay0+Y29udGFpbnNG
bG9hdHMoKTsKKyAgICB9IGVsc2UgeyAgICAKKyAgICAgICAgd2hpbGUgKHByZXYgJiYgKHByZXYt
PmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSB8fCAhcHJldi0+aXNCb3goKSB8fCAhcHJldi0+aXNS
ZW5kZXJCbG9jaygpIHx8IHRvUmVuZGVyQmxvY2socHJldiktPmF2b2lkc0Zsb2F0cygpKSkgewor
ICAgICAgICAgICAgaWYgKHByZXYtPmlzRmxvYXRpbmcoKSkKKyAgICAgICAgICAgICAgICBwYXJl
bnRIYXNGbG9hdHMgPSB0cnVlOworICAgICAgICAgICAgcHJldiA9IHByZXYtPnByZXZpb3VzU2li
bGluZygpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwYXJlbnRCbG9jayA9IHBhcmVu
dCgpLT5pc1JlbmRlckJsb2NrKCkgPyB0b1JlbmRlckJsb2NrKHBhcmVudCgpKSA6IDA7CiAgICAg
fQogCiAgICAgLy8gRmlyc3QgYWRkIGluIGZsb2F0cyBmcm9tIHRoZSBwYXJlbnQuCiAgICAgaW50
IG9mZnNldCA9IHkoKTsKLSAgICBpZiAocGFyZW50SGFzRmxvYXRzKSB7Ci0gICAgICAgIFJlbmRl
ckJsb2NrKiBwYXJlbnRCbG9jayA9IHRvUmVuZGVyQmxvY2socGFyZW50KCkpOworICAgIGlmIChw
YXJlbnRIYXNGbG9hdHMpCiAgICAgICAgIGFkZEludHJ1ZGluZ0Zsb2F0cyhwYXJlbnRCbG9jaywg
cGFyZW50QmxvY2stPmJvcmRlckxlZnQoKSArIHBhcmVudEJsb2NrLT5wYWRkaW5nTGVmdCgpLCBv
ZmZzZXQpOwotICAgIH0KLSAgICAKKwogICAgIGludCB4b2Zmc2V0ID0gMDsKICAgICBpZiAocHJl
dikKICAgICAgICAgb2Zmc2V0IC09IHRvUmVuZGVyQm94KHByZXYpLT55KCk7Ci0gICAgZWxzZSBp
ZiAocGFyZW50KCktPmlzQm94KCkpIHsKLSAgICAgICAgcHJldiA9IHBhcmVudCgpOworICAgIGVs
c2UgaWYgKHBhcmVudEJsb2NrKSB7CisgICAgICAgIHByZXYgPSBwYXJlbnRCbG9jazsKICAgICAg
ICAgeG9mZnNldCArPSB0b1JlbmRlckJveChwcmV2KS0+Ym9yZGVyTGVmdCgpICsgdG9SZW5kZXJC
b3gocHJldiktPnBhZGRpbmdMZWZ0KCk7CiAgICAgfQogCkBAIC0zMTM4LDcgKzMwODksNyBAQCB2
b2lkIFJlbmRlckJsb2NrOjphZGRJbnRydWRpbmdGbG9hdHMoUmVuCiAgICAgICAgICAgICAgICAg
Ly8gYWJvdmUuICB8eG9mZnwgd2lsbCBlcXVhbCAtZmxvdy0+bWFyZ2luTGVmdCgpIGluIHRoaXMg
Y2FzZSwgc28gaXQncyBhbHJlYWR5IGJlZW4gdGFrZW4KICAgICAgICAgICAgICAgICAvLyBpbnRv
IGFjY291bnQuICBPbmx5IGFwcGx5IHRoaXMgY29kZSBpZiB8Y2hpbGR8IGlzIGZhbHNlLCBzaW5j
ZSBvdGhlcndpc2UgdGhlIGxlZnQgbWFyZ2luCiAgICAgICAgICAgICAgICAgLy8gd2lsbCBnZXQg
YXBwbGllZCB0d2ljZS4KLSAgICAgICAgICAgICAgICBpZiAocHJldiAhPSBwYXJlbnQoKSkKKyAg
ICAgICAgICAgICAgICBpZiAocHJldiAhPSBjb250YWluaW5nQmxvY2soKSkKICAgICAgICAgICAg
ICAgICAgICAgZmxvYXRpbmdPYmotPm1fbGVmdCArPSBwcmV2LT5tYXJnaW5MZWZ0KCk7CiAgICAg
ICAgICAgICAgICAgZmxvYXRpbmdPYmotPm1fbGVmdCAtPSBtYXJnaW5MZWZ0KCk7CiAgICAgICAg
ICAgICAgICAgZmxvYXRpbmdPYmotPm1fc2hvdWxkUGFpbnQgPSBmYWxzZTsgIC8vIFdlIGFyZSBu
b3QgaW4gdGhlIGRpcmVjdCBpbmhlcml0YW5jZSBjaGFpbiBmb3IgdGhpcyBmbG9hdC4gV2Ugd2ls
bCBuZXZlciBwYWludCBpdC4KQEAgLTMxODMsNyArMzEzNCwxMyBAQCB2b2lkIFJlbmRlckJsb2Nr
OjptYXJrQWxsRGVzY2VuZGFudHNXaXRoCiAgICAgICAgIHJlbW92ZUZsb2F0aW5nT2JqZWN0KGZs
b2F0VG9SZW1vdmUpOwogCiAgICAgLy8gSXRlcmF0ZSBvdmVyIG91ciBjaGlsZHJlbiBhbmQgbWFy
ayB0aGVtIGFzIG5lZWRlZC4KLSAgICBpZiAoIWNoaWxkcmVuSW5saW5lKCkpIHsKKyAgICBpZiAo
Y2hpbGRyZW5JbmxpbmUoKSkgeworICAgICAgICBmb3IgKFJvb3RJbmxpbmVCb3gqIGJveCA9IGZp
cnN0Um9vdEJveCgpOyBib3g7IGJveCA9IGJveC0+bmV4dFJvb3RCb3goKSkgeworICAgICAgICAg
ICAgUmVuZGVyQmxvY2sqIGNoaWxkQmxvY2sgPSBib3gtPmFub255bW91c0lubGluZUJsb2NrKCk7
CisgICAgICAgICAgICBpZiAoY2hpbGRCbG9jayAmJiAoZmxvYXRUb1JlbW92ZSA/IGNoaWxkQmxv
Y2stPmNvbnRhaW5zRmxvYXQoZmxvYXRUb1JlbW92ZSkgOiBjaGlsZEJsb2NrLT5jb250YWluc0Zs
b2F0cygpKSkKKyAgICAgICAgICAgICAgICBjaGlsZEJsb2NrLT5tYXJrQWxsRGVzY2VuZGFudHNX
aXRoRmxvYXRzRm9yTGF5b3V0KGZsb2F0VG9SZW1vdmUsIGluTGF5b3V0KTsKKyAgICAgICAgfQor
ICAgIH0gZWxzZSB7CiAgICAgICAgIGZvciAoUmVuZGVyT2JqZWN0KiBjaGlsZCA9IGZpcnN0Q2hp
bGQoKTsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHRTaWJsaW5nKCkpIHsKICAgICAgICAgICAg
IGlmICgoIWZsb2F0VG9SZW1vdmUgJiYgY2hpbGQtPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSkg
fHwgIWNoaWxkLT5pc1JlbmRlckJsb2NrKCkpCiAgICAgICAgICAgICAgICAgY29udGludWU7CkBA
IC0zNDUxLDYgKzM0MDgsMTEgQEAgc3RhdGljIFZpc2libGVQb3NpdGlvbiBwb3NpdGlvbkZvclBv
aW50UgogICAgIHJldHVybiBhbmNlc3Rvci0+Y3JlYXRlVmlzaWJsZVBvc2l0aW9uKGNoaWxkTm9k
ZS0+bm9kZUluZGV4KCkgKyAxLCBVUFNUUkVBTSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBp
c0NoaWxkSGl0VGVzdENhbmRpZGF0ZShSZW5kZXJCb3gqIGJveCkKK3sKKyAgICByZXR1cm4gYm94
LT5oZWlnaHQoKSAmJiBib3gtPnN0eWxlKCktPnZpc2liaWxpdHkoKSA9PSBWSVNJQkxFICYmICFi
b3gtPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKTsKK30KKwogVmlzaWJsZVBvc2l0aW9uIFJlbmRl
ckJsb2NrOjpwb3NpdGlvbkZvclBvaW50V2l0aElubGluZUNoaWxkcmVuKGNvbnN0IEludFBvaW50
JiBwb2ludEluQ29udGVudHMpCiB7CiAgICAgQVNTRVJUKGNoaWxkcmVuSW5saW5lKCkpOwpAQCAt
MzQ2Myw4ICszNDI1LDE4IEBAIFZpc2libGVQb3NpdGlvbiBSZW5kZXJCbG9jazo6cG9zaXRpb25G
b3IKICAgICBSb290SW5saW5lQm94KiBmaXJzdFJvb3RCb3hXaXRoQ2hpbGRyZW4gPSAwOwogICAg
IFJvb3RJbmxpbmVCb3gqIGxhc3RSb290Qm94V2l0aENoaWxkcmVuID0gMDsKICAgICBmb3IgKFJv
b3RJbmxpbmVCb3gqIHJvb3QgPSBmaXJzdFJvb3RCb3goKTsgcm9vdDsgcm9vdCA9IHJvb3QtPm5l
eHRSb290Qm94KCkpIHsKKyAgICAgICAgUmVuZGVyQmxvY2sqIGNoaWxkQmxvY2sgPSByb290LT5h
bm9ueW1vdXNJbmxpbmVCbG9jaygpOworICAgICAgICBpZiAoY2hpbGRCbG9jaykgeworICAgICAg
ICAgICAgZmlyc3RSb290Qm94V2l0aENoaWxkcmVuID0gMDsKKyAgICAgICAgICAgIGxhc3RSb290
Qm94V2l0aENoaWxkcmVuID0gMDsKKyAgICAgICAgICAgIGlmIChpc0NoaWxkSGl0VGVzdENhbmRp
ZGF0ZShjaGlsZEJsb2NrKSAmJiBwb2ludEluQ29udGVudHMueSgpIDwgY2hpbGRCbG9jay0+ZnJh
bWVSZWN0KCkuYm90dG9tKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uRm9yUG9p
bnRSZXNwZWN0aW5nRWRpdGluZ0JvdW5kYXJpZXModGhpcywgY2hpbGRCbG9jaywgcG9pbnRJbkNv
bnRlbnRzKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKICAgICAgICAgaWYg
KCFyb290LT5maXJzdExlYWZDaGlsZCgpKQogICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
IAogICAgICAgICBpZiAoIWZpcnN0Um9vdEJveFdpdGhDaGlsZHJlbikKICAgICAgICAgICAgIGZp
cnN0Um9vdEJveFdpdGhDaGlsZHJlbiA9IHJvb3Q7CiAgICAgICAgIGxhc3RSb290Qm94V2l0aENo
aWxkcmVuID0gcm9vdDsKQEAgLTM0NzIsNyArMzQ0NCw3IEBAIFZpc2libGVQb3NpdGlvbiBSZW5k
ZXJCbG9jazo6cG9zaXRpb25Gb3IKICAgICAgICAgLy8gc2V0IHRoZSBib3R0b20gYmFzZWQgb24g
d2hldGhlciB0aGVyZSBpcyBhIG5leHQgcm9vdCBib3gKICAgICAgICAgLy8gRklYTUU6IFRoaXMg
d2lsbCBjb25zaWRlciBuZXh0Um9vdEJveCBldmVuIGlmIGl0IGhhcyBubyBjaGlsZHJlbiwgYW5k
IG1heWJlIGl0IHNob3VsZG4ndC4KICAgICAgICAgaW50IGJvdHRvbTsKLSAgICAgICAgaWYgKHJv
b3QtPm5leHRSb290Qm94KCkpIHsKKyAgICAgICAgaWYgKHJvb3QtPm5leHRSb290Qm94KCkgJiYg
IXJvb3QtPm5leHRSb290Qm94KCktPmFub255bW91c0lubGluZUJsb2NrKCkpIHsKICAgICAgICAg
ICAgIC8vIEZJWE1FOiBXZSB3b3VsZCBwcmVmZXIgdG8gbWFrZSB0aGUgYnJlYWsgcG9pbnQgaGFs
ZndheSBiZXR3ZWVuIHRoZSBib3R0b20KICAgICAgICAgICAgIC8vIG9mIHRoZSBwcmV2aW91cyBy
b290IGJveCBhbmQgdGhlIHRvcCBvZiB0aGUgbmV4dCByb290IGJveC4KICAgICAgICAgICAgIGJv
dHRvbSA9IHJvb3QtPm5leHRSb290Qm94KCktPmxpbmVUb3AoKTsKQEAgLTM1MTcsMTcgKzM0ODks
MTIgQEAgVmlzaWJsZVBvc2l0aW9uIFJlbmRlckJsb2NrOjpwb3NpdGlvbkZvcgogICAgIHJldHVy
biBjcmVhdGVWaXNpYmxlUG9zaXRpb24oMCwgRE9XTlNUUkVBTSk7CiB9CiAKLXN0YXRpYyBpbmxp
bmUgYm9vbCBpc0NoaWxkSGl0VGVzdENhbmRpZGF0ZShSZW5kZXJCb3gqIGJveCkKLXsKLSAgICBy
ZXR1cm4gYm94LT5oZWlnaHQoKSAmJiBib3gtPnN0eWxlKCktPnZpc2liaWxpdHkoKSA9PSBWSVNJ
QkxFICYmICFib3gtPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKTsKLX0KLQogVmlzaWJsZVBvc2l0
aW9uIFJlbmRlckJsb2NrOjpwb3NpdGlvbkZvclBvaW50KGNvbnN0IEludFBvaW50JiBwb2ludCkK
IHsKICAgICBpZiAoaXNUYWJsZSgpKQogICAgICAgICByZXR1cm4gUmVuZGVyQm94Ojpwb3NpdGlv
bkZvclBvaW50KHBvaW50KTsKIAotICAgIGlmIChpc1JlcGxhY2VkKCkpIHsKKyAgICBpZiAoaXNS
ZXBsYWNlZCgpICYmICFpc0Fub255bW91c0lubGluZUJsb2NrKCkpIHsKICAgICAgICAgaWYgKHBv
aW50LnkoKSA8IDAgfHwgKHBvaW50LnkoKSA8IGhlaWdodCgpICYmIHBvaW50LngoKSA8IDApKQog
ICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVZpc2libGVQb3NpdGlvbihjYXJldE1pbk9mZnNldCgp
LCBET1dOU1RSRUFNKTsKICAgICAgICAgaWYgKHBvaW50LnkoKSA+PSBoZWlnaHQoKSB8fCAocG9p
bnQueSgpID49IDAgJiYgcG9pbnQueCgpID49IHdpZHRoKCkpKQpAQCAtNDE0MiwxNCArNDEwOSwx
NSBAQCB2b2lkIFJlbmRlckJsb2NrOjpjYWxjSW5saW5lUHJlZldpZHRocygpCiAgICAgICAgICAg
ICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgIGNsZWFyUHJldmlvdXNGbG9hdCA9IGZh
bHNlOwogCi0gICAgICAgICAgICAgICAgYm9vbCBjYW5CcmVha1JlcGxhY2VkRWxlbWVudCA9ICFj
aGlsZC0+aXNJbWFnZSgpIHx8IGFsbG93SW1hZ2VzVG9CcmVhazsKKyAgICAgICAgICAgICAgICBi
b29sIGNhbkJyZWFrUmVwbGFjZWRFbGVtZW50ID0gIWNoaWxkLT5pc0ltYWdlKCkgfHwgYWxsb3dJ
bWFnZXNUb0JyZWFrIHx8IGNoaWxkLT5pc0Fub255bW91c0lubGluZUJsb2NrKCk7CiAgICAgICAg
ICAgICAgICAgaWYgKChjYW5CcmVha1JlcGxhY2VkRWxlbWVudCAmJiAoYXV0b1dyYXAgfHwgb2xk
QXV0b1dyYXApKSB8fCBjbGVhclByZXZpb3VzRmxvYXQpIHsKICAgICAgICAgICAgICAgICAgICAg
bV9taW5QcmVmV2lkdGggPSBtYXgoaW5saW5lTWluLCBtX21pblByZWZXaWR0aCk7CiAgICAgICAg
ICAgICAgICAgICAgIGlubGluZU1pbiA9IDA7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAg
ICAgICAgICAgLy8gSWYgd2UncmUgc3VwcG9zZWQgdG8gY2xlYXIgdGhlIHByZXZpb3VzIGZsb2F0
LCB0aGVuIHRlcm1pbmF0ZSBtYXh3aWR0aCBhcyB3ZWxsLgotICAgICAgICAgICAgICAgIGlmIChj
bGVhclByZXZpb3VzRmxvYXQpIHsKKyAgICAgICAgICAgICAgICAvLyBBbHNvIGRvIHRoaXMgZm9y
IGFub255bW91cyBpbmxpbmUgYmxvY2tzLgorICAgICAgICAgICAgICAgIGlmIChjbGVhclByZXZp
b3VzRmxvYXQgfHwgY2hpbGQtPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkgewogICAgICAgICAg
ICAgICAgICAgICBtX21heFByZWZXaWR0aCA9IG1heChpbmxpbmVNYXgsIG1fbWF4UHJlZldpZHRo
KTsKICAgICAgICAgICAgICAgICAgICAgaW5saW5lTWF4ID0gMDsKICAgICAgICAgICAgICAgICB9
CkBAIC00MTU4LDE1ICs0MTI2LDE3IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmNhbGNJbmxpbmVQcmVm
V2lkdGhzKCkKICAgICAgICAgICAgICAgICBpbnQgdGkgPSAwOwogICAgICAgICAgICAgICAgIGlm
ICghYWRkZWRUZXh0SW5kZW50KSB7CiAgICAgICAgICAgICAgICAgICAgIGFkZGVkVGV4dEluZGVu
dCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIHRpID0gc3R5bGUoKS0+dGV4dEluZGVudCgp
LmNhbGNNaW5WYWx1ZShjdyk7Ci0gICAgICAgICAgICAgICAgICAgIGNoaWxkTWluKz10aTsKLSAg
ICAgICAgICAgICAgICAgICAgY2hpbGRNYXgrPXRpOworICAgICAgICAgICAgICAgICAgICBpZiAo
IWNoaWxkLT5pc0Fub255bW91c0lubGluZUJsb2NrKCkpIHsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIHRpID0gc3R5bGUoKS0+dGV4dEluZGVudCgpLmNhbGNNaW5WYWx1ZShjdyk7CisgICAgICAg
ICAgICAgICAgICAgICAgICBjaGlsZE1pbiArPSB0aTsKKyAgICAgICAgICAgICAgICAgICAgICAg
IGNoaWxkTWF4ICs9IHRpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAg
fQogCiAgICAgICAgICAgICAgICAgLy8gQWRkIG91ciB3aWR0aCB0byB0aGUgbWF4LgogICAgICAg
ICAgICAgICAgIGlubGluZU1heCArPSBjaGlsZE1heDsKIAotICAgICAgICAgICAgICAgIGlmICgh
YXV0b1dyYXAgfHwgIWNhbkJyZWFrUmVwbGFjZWRFbGVtZW50KSB7CisgICAgICAgICAgICAgICAg
aWYgKCghYXV0b1dyYXAgfHwgIWNhbkJyZWFrUmVwbGFjZWRFbGVtZW50KSAmJiAhY2hpbGQtPmlz
QW5vbnltb3VzSW5saW5lQmxvY2soKSkgewogICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQt
PmlzRmxvYXRpbmcoKSkKICAgICAgICAgICAgICAgICAgICAgICAgIG1fbWluUHJlZldpZHRoID0g
bWF4KGNoaWxkTWluLCBtX21pblByZWZXaWR0aCk7CiAgICAgICAgICAgICAgICAgICAgIGVsc2UK
QEAgLTQxNzcsNiArNDE0NywxMiBAQCB2b2lkIFJlbmRlckJsb2NrOjpjYWxjSW5saW5lUHJlZldp
ZHRocygpCiAKICAgICAgICAgICAgICAgICAgICAgLy8gTm93IHN0YXJ0IGEgbmV3IGxpbmUuCiAg
ICAgICAgICAgICAgICAgICAgIGlubGluZU1pbiA9IDA7CisgICAgICAgICAgICAgICAgICAgIAor
ICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQtPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkg
eworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGVybWluYXRlIG1heCB3aWR0aCBhcyB3ZWxs
LgorICAgICAgICAgICAgICAgICAgICAgICAgbV9tYXhQcmVmV2lkdGggPSBtYXgoY2hpbGRNYXgs
IG1fbWF4UHJlZldpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZU1heCA9IDA7
CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAg
ICAgICAvLyBXZSBhcmUgbm8gbG9uZ2VyIHN0cmlwcGluZyB3aGl0ZXNwYWNlIGF0IHRoZSBzdGFy
dCBvZgpAQCAtNDQxNyw5ICs0MzkzLDEyIEBAIGludCBSZW5kZXJCbG9jazo6bGluZUhlaWdodChi
b29sIGZpcnN0TGkKICAgICAvLyB0aGUgYmFzZSBjbGFzcy4gIElmIHdlJ3JlIGJlaW5nIHF1ZXJp
ZWQgYXMgdGhvdWdoIHdlJ3JlIHRoZSByb290IGxpbmUKICAgICAvLyBib3gsIHRoZW4gdGhlIGZh
Y3QgdGhhdCB3ZSdyZSBhbiBpbmxpbmUtYmxvY2sgaXMgaXJyZWxldmFudCwgYW5kIHdlIGJlaGF2
ZQogICAgIC8vIGp1c3QgbGlrZSBhIGJsb2NrLgotICAgIGlmIChpc1JlcGxhY2VkKCkgJiYgIWlz
Um9vdExpbmVCb3gpCisgICAgaWYgKGlzUmVwbGFjZWQoKSAmJiAhaXNSb290TGluZUJveCkgewor
ICAgICAgICBpZiAoaXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKQorICAgICAgICAgICAgcmV0dXJu
IGhlaWdodCgpOwogICAgICAgICByZXR1cm4gaGVpZ2h0KCkgKyBtYXJnaW5Ub3AoKSArIG1hcmdp
bkJvdHRvbSgpOwotICAgIAorICAgIH0KKwogICAgIGlmIChmaXJzdExpbmUgJiYgZG9jdW1lbnQo
KS0+dXNlc0ZpcnN0TGluZVJ1bGVzKCkpIHsKICAgICAgICAgUmVuZGVyU3R5bGUqIHMgPSBzdHls
ZShmaXJzdExpbmUpOwogICAgICAgICBpZiAocyAhPSBzdHlsZSgpKQpAQCAtNDQ1MSw2ICs0NDMw
LDggQEAgaW50IFJlbmRlckJsb2NrOjpiYXNlbGluZVBvc2l0aW9uKGJvb2wgYgogICAgICAgICAv
LyBXZSBhbHNvIGdpdmUgdXAgb24gZmluZGluZyBhIGJhc2VsaW5lIGlmIHdlIGhhdmUgYSB2ZXJ0
aWNhbCBzY3JvbGxiYXIsIG9yIGlmIHdlIGFyZSBzY3JvbGxlZAogICAgICAgICAvLyB2ZXJ0aWNh
bGx5IChlLmcuLCBhbiBvdmVyZmxvdzpoaWRkZW4gYmxvY2sgdGhhdCBoYXMgaGFkIHNjcm9sbFRv
cCBtb3ZlZCkgb3IgaWYgdGhlIGJhc2VsaW5lIGlzIG91dHNpZGUKICAgICAgICAgLy8gb2Ygb3Vy
IGNvbnRlbnQgYm94LgorICAgICAgICBpZiAoaXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKQorICAg
ICAgICAgICAgcmV0dXJuIGhlaWdodCgpOwogICAgICAgICBpbnQgYmFzZWxpbmVQb3MgPSAobGF5
ZXIoKSAmJiAobGF5ZXIoKS0+bWFycXVlZSgpIHx8IGxheWVyKCktPnZlcnRpY2FsU2Nyb2xsYmFy
KCkgfHwgbGF5ZXIoKS0+c2Nyb2xsWU9mZnNldCgpICE9IDApKSA/IC0xIDogbGFzdExpbmVCb3hC
YXNlbGluZSgpOwogICAgICAgICBpZiAoYmFzZWxpbmVQb3MgIT0gLTEgJiYgYmFzZWxpbmVQb3Mg
PD0gYm9yZGVyVG9wKCkgKyBwYWRkaW5nVG9wKCkgKyBjb250ZW50SGVpZ2h0KCkpCiAgICAgICAg
ICAgICByZXR1cm4gbWFyZ2luVG9wKCkgKyBiYXNlbGluZVBvczsKQEAgLTQ4NzUsNjAgKzQ4NTYs
NiBAQCB2b2lkIFJlbmRlckJsb2NrOjpzZXRNYXhCb3R0b21NYXJnaW5zKGluCiAgICAgbV9tYXhN
YXJnaW4tPm1fYm90dG9tTmVnID0gbmVnOwogfQogCi12b2lkIFJlbmRlckJsb2NrOjphYnNvbHV0
ZVJlY3RzKFZlY3RvcjxJbnRSZWN0PiYgcmVjdHMsIGludCB0eCwgaW50IHR5KQotewotICAgIC8v
IEZvciBibG9ja3MgaW5zaWRlIGlubGluZXMsIHdlIGdvIGFoZWFkIGFuZCBpbmNsdWRlIG1hcmdp
bnMgc28gdGhhdCB3ZSBydW4gcmlnaHQgdXAgdG8gdGhlCi0gICAgLy8gaW5saW5lIGJveGVzIGFi
b3ZlIGFuZCBiZWxvdyB1cyAodGh1cyBnZXR0aW5nIG1lcmdlZCB3aXRoIHRoZW0gdG8gZm9ybSBh
IHNpbmdsZSBpcnJlZ3VsYXIKLSAgICAvLyBzaGFwZSkuCi0gICAgaWYgKGlubGluZUNvbnRpbnVh
dGlvbigpKSB7Ci0gICAgICAgIHJlY3RzLmFwcGVuZChJbnRSZWN0KHR4LCB0eSAtIGNvbGxhcHNl
ZE1hcmdpblRvcCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCgpLCBoZWln
aHQoKSArIGNvbGxhcHNlZE1hcmdpblRvcCgpICsgY29sbGFwc2VkTWFyZ2luQm90dG9tKCkpKTsK
LSAgICAgICAgaW5saW5lQ29udGludWF0aW9uKCktPmFic29sdXRlUmVjdHMocmVjdHMsCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4IC0geCgpICsgaW5saW5l
Q29udGludWF0aW9uKCktPmNvbnRhaW5pbmdCbG9jaygpLT54KCksCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5IC0geSgpICsgaW5saW5lQ29udGludWF0aW9u
KCktPmNvbnRhaW5pbmdCbG9jaygpLT55KCkpOwotICAgIH0gZWxzZQotICAgICAgICByZWN0cy5h
cHBlbmQoSW50UmVjdCh0eCwgdHksIHdpZHRoKCksIGhlaWdodCgpKSk7Ci19Ci0KLXZvaWQgUmVu
ZGVyQmxvY2s6OmFic29sdXRlUXVhZHMoVmVjdG9yPEZsb2F0UXVhZD4mIHF1YWRzKQotewotICAg
IC8vIEZvciBibG9ja3MgaW5zaWRlIGlubGluZXMsIHdlIGdvIGFoZWFkIGFuZCBpbmNsdWRlIG1h
cmdpbnMgc28gdGhhdCB3ZSBydW4gcmlnaHQgdXAgdG8gdGhlCi0gICAgLy8gaW5saW5lIGJveGVz
IGFib3ZlIGFuZCBiZWxvdyB1cyAodGh1cyBnZXR0aW5nIG1lcmdlZCB3aXRoIHRoZW0gdG8gZm9y
bSBhIHNpbmdsZSBpcnJlZ3VsYXIKLSAgICAvLyBzaGFwZSkuCi0gICAgaWYgKGlubGluZUNvbnRp
bnVhdGlvbigpKSB7Ci0gICAgICAgIEZsb2F0UmVjdCBsb2NhbFJlY3QoMCwgLWNvbGxhcHNlZE1h
cmdpblRvcCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoKCksIGhlaWdodCgp
ICsgY29sbGFwc2VkTWFyZ2luVG9wKCkgKyBjb2xsYXBzZWRNYXJnaW5Cb3R0b20oKSk7Ci0gICAg
ICAgIHF1YWRzLmFwcGVuZChsb2NhbFRvQWJzb2x1dGVRdWFkKGxvY2FsUmVjdCkpOwotICAgICAg
ICBpbmxpbmVDb250aW51YXRpb24oKS0+YWJzb2x1dGVRdWFkcyhxdWFkcyk7Ci0gICAgfSBlbHNl
Ci0gICAgICAgIHF1YWRzLmFwcGVuZChSZW5kZXJCb3g6OmxvY2FsVG9BYnNvbHV0ZVF1YWQoRmxv
YXRSZWN0KDAsIDAsIHdpZHRoKCksIGhlaWdodCgpKSkpOwotfQotCi1JbnRSZWN0IFJlbmRlckJs
b2NrOjpyZWN0V2l0aE91dGxpbmVGb3JSZXBhaW50KFJlbmRlckJveE1vZGVsT2JqZWN0KiByZXBh
aW50Q29udGFpbmVyLCBpbnQgb3V0bGluZVdpZHRoKQotewotICAgIEludFJlY3QgcihSZW5kZXJC
b3g6OnJlY3RXaXRoT3V0bGluZUZvclJlcGFpbnQocmVwYWludENvbnRhaW5lciwgb3V0bGluZVdp
ZHRoKSk7Ci0gICAgaWYgKGlubGluZUNvbnRpbnVhdGlvbigpKQotICAgICAgICByLmluZmxhdGVZ
KGNvbGxhcHNlZE1hcmdpblRvcCgpKTsKLSAgICByZXR1cm4gcjsKLX0KLQotUmVuZGVyT2JqZWN0
KiBSZW5kZXJCbG9jazo6aG92ZXJBbmNlc3RvcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGlubGlu
ZUNvbnRpbnVhdGlvbigpID8gaW5saW5lQ29udGludWF0aW9uKCkgOiBSZW5kZXJCb3g6OmhvdmVy
QW5jZXN0b3IoKTsKLX0KLQotdm9pZCBSZW5kZXJCbG9jazo6dXBkYXRlRHJhZ1N0YXRlKGJvb2wg
ZHJhZ09uKQotewotICAgIFJlbmRlckJveDo6dXBkYXRlRHJhZ1N0YXRlKGRyYWdPbik7Ci0gICAg
aWYgKGlubGluZUNvbnRpbnVhdGlvbigpKQotICAgICAgICBpbmxpbmVDb250aW51YXRpb24oKS0+
dXBkYXRlRHJhZ1N0YXRlKGRyYWdPbik7Ci19Ci0KLVJlbmRlclN0eWxlKiBSZW5kZXJCbG9jazo6
b3V0bGluZVN0eWxlRm9yUmVwYWludCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGlubGluZUNvbnRp
bnVhdGlvbigpID8gaW5saW5lQ29udGludWF0aW9uKCktPnN0eWxlKCkgOiBzdHlsZSgpOwotfQot
CiB2b2lkIFJlbmRlckJsb2NrOjpjaGlsZEJlY2FtZU5vbklubGluZShSZW5kZXJPYmplY3QqKQog
ewogICAgIG1ha2VDaGlsZHJlbk5vbklubGluZSgpOwpAQCAtNDkzNywyNiArNDg2NCw2IEBAIHZv
aWQgUmVuZGVyQmxvY2s6OmNoaWxkQmVjYW1lTm9uSW5saW5lKFIKICAgICAvLyB8dGhpc3wgbWF5
IGJlIGRlYWQgaGVyZQogfQogCi12b2lkIFJlbmRlckJsb2NrOjp1cGRhdGVIaXRUZXN0UmVzdWx0
KEhpdFRlc3RSZXN1bHQmIHJlc3VsdCwgY29uc3QgSW50UG9pbnQmIHBvaW50KQotewotICAgIGlm
IChyZXN1bHQuaW5uZXJOb2RlKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIE5vZGUqIG4gPSBu
b2RlKCk7Ci0gICAgaWYgKGlubGluZUNvbnRpbnVhdGlvbigpKQotICAgICAgICAvLyBXZSBhcmUg
aW4gdGhlIG1hcmdpbnMgb2YgYmxvY2sgZWxlbWVudHMgdGhhdCBhcmUgcGFydCBvZiBhIGNvbnRp
bnVhdGlvbi4gIEluCi0gICAgICAgIC8vIHRoaXMgY2FzZSB3ZSdyZSBhY3R1YWxseSBzdGlsbCBp
bnNpZGUgdGhlIGVuY2xvc2luZyBpbmxpbmUgZWxlbWVudCB0aGF0IHdhcwotICAgICAgICAvLyBz
cGxpdC4gIEdvIGFoZWFkIGFuZCBzZXQgb3VyIGlubmVyIG5vZGUgYWNjb3JkaW5nbHkuCi0gICAg
ICAgIG4gPSBpbmxpbmVDb250aW51YXRpb24oKS0+bm9kZSgpOwotCi0gICAgaWYgKG4pIHsKLSAg
ICAgICAgcmVzdWx0LnNldElubmVyTm9kZShuKTsKLSAgICAgICAgaWYgKCFyZXN1bHQuaW5uZXJO
b25TaGFyZWROb2RlKCkpCi0gICAgICAgICAgICByZXN1bHQuc2V0SW5uZXJOb25TaGFyZWROb2Rl
KG4pOwotICAgICAgICByZXN1bHQuc2V0TG9jYWxQb2ludChwb2ludCk7Ci0gICAgfQotfQotCiBJ
bnRSZWN0IFJlbmRlckJsb2NrOjpsb2NhbENhcmV0UmVjdChJbmxpbmVCb3gqIGlubGluZUJveCwg
aW50IGNhcmV0T2Zmc2V0LCBpbnQqIGV4dHJhV2lkdGhUb0VuZE9mTGluZSkKIHsKICAgICAvLyBE
byB0aGUgbm9ybWFsIGNhbGN1bGF0aW9uIGluIG1vc3QgY2FzZXMuCkBAIC01MDM3LDIxICs0OTQ0
LDE1IEBAIEludFJlY3QgUmVuZGVyQmxvY2s6OmxvY2FsQ2FyZXRSZWN0KElubGkKIAogdm9pZCBS
ZW5kZXJCbG9jazo6YWRkRm9jdXNSaW5nUmVjdHMoVmVjdG9yPEludFJlY3Q+JiByZWN0cywgaW50
IHR4LCBpbnQgdHkpCiB7Ci0gICAgLy8gRm9yIGJsb2NrcyBpbnNpZGUgaW5saW5lcywgd2UgZ28g
YWhlYWQgYW5kIGluY2x1ZGUgbWFyZ2lucyBzbyB0aGF0IHdlIHJ1biByaWdodCB1cCB0byB0aGUK
LSAgICAvLyBpbmxpbmUgYm94ZXMgYWJvdmUgYW5kIGJlbG93IHVzICh0aHVzIGdldHRpbmcgbWVy
Z2VkIHdpdGggdGhlbSB0byBmb3JtIGEgc2luZ2xlIGlycmVndWxhcgotICAgIC8vIHNoYXBlKS4K
LSAgICBpZiAoaW5saW5lQ29udGludWF0aW9uKCkpIHsKLSAgICAgICAgLy8gRklYTUU6IFRoaXMg
Y2hlY2sgcmVhbGx5IGlzbid0IGFjY3VyYXRlLiAKLSAgICAgICAgYm9vbCBuZXh0SW5saW5lSGFz
TGluZUJveCA9IGlubGluZUNvbnRpbnVhdGlvbigpLT5maXJzdExpbmVCb3goKTsKLSAgICAgICAg
Ly8gRklYTUU6IFRoaXMgaXMgd3JvbmcuIFRoZSBwcmluY2lwYWwgcmVuZGVyZXIgbWF5IG5vdCBi
ZSB0aGUgY29udGludWF0aW9uIHByZWNlZGluZyB0aGlzIGJsb2NrLgotICAgICAgICBib29sIHBy
ZXZJbmxpbmVIYXNMaW5lQm94ID0gdG9SZW5kZXJJbmxpbmUoaW5saW5lQ29udGludWF0aW9uKCkt
Pm5vZGUoKS0+cmVuZGVyZXIoKSktPmZpcnN0TGluZUJveCgpOyAKLSAgICAgICAgaW50IHRvcE1h
cmdpbiA9IHByZXZJbmxpbmVIYXNMaW5lQm94ID8gY29sbGFwc2VkTWFyZ2luVG9wKCkgOiAwOwot
ICAgICAgICBpbnQgYm90dG9tTWFyZ2luID0gbmV4dElubGluZUhhc0xpbmVCb3ggPyBjb2xsYXBz
ZWRNYXJnaW5Cb3R0b20oKSA6IDA7Ci0gICAgICAgIEludFJlY3QgcmVjdCh0eCwgdHkgLSB0b3BN
YXJnaW4sIHdpZHRoKCksIGhlaWdodCgpICsgdG9wTWFyZ2luICsgYm90dG9tTWFyZ2luKTsKLSAg
ICAgICAgaWYgKCFyZWN0LmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJlY3RzLmFwcGVuZChyZWN0
KTsKLSAgICB9IGVsc2UgaWYgKHdpZHRoKCkgJiYgaGVpZ2h0KCkpCi0gICAgICAgIHJlY3RzLmFw
cGVuZChJbnRSZWN0KHR4LCB0eSwgd2lkdGgoKSwgaGVpZ2h0KCkpKTsKKyAgICBpbnQgdG9wID0g
dHk7CisgICAgaW50IGJvdHRvbSA9IHRvcCArIGhlaWdodCgpOworICAgIGlmIChpc0Fub255bW91
c0lubGluZUJsb2NrKCkpIHsKKyAgICAgICAgdG9wID0gbWluKHRvcCwgdG9wIC0gY29sbGFwc2Vk
TWFyZ2luVG9wKCkpOworICAgICAgICBib3R0b20gPSBtYXgoYm90dG9tLCBib3R0b20gKyBjb2xs
YXBzZWRNYXJnaW5Cb3R0b20oKSk7CisgICAgfQorICAgIEludFJlY3QgcmVzdWx0KHR4LCB0b3As
IHdpZHRoKCksIGJvdHRvbSAtIHRvcCk7CisgICAgaWYgKCFyZXN1bHQuaXNFbXB0eSgpKQorICAg
ICAgICByZWN0cy5hcHBlbmQocmVzdWx0KTsKIAogICAgIGlmICghaGFzT3ZlcmZsb3dDbGlwKCkg
JiYgIWhhc0NvbnRyb2xDbGlwKCkpIHsKICAgICAgICAgZm9yIChSb290SW5saW5lQm94KiBjdXJy
ID0gZmlyc3RSb290Qm94KCk7IGN1cnI7IGN1cnIgPSBjdXJyLT5uZXh0Um9vdEJveCgpKSB7CkBA
IC01MDc1LDExICs0OTc2LDYgQEAgdm9pZCBSZW5kZXJCbG9jazo6YWRkRm9jdXNSaW5nUmVjdHMo
VmVjdAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotCi0gICAgaWYgKGlubGluZUNv
bnRpbnVhdGlvbigpKQotICAgICAgICBpbmxpbmVDb250aW51YXRpb24oKS0+YWRkRm9jdXNSaW5n
UmVjdHMocmVjdHMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgdHggLSB4KCkgKyBpbmxpbmVDb250aW51YXRpb24oKS0+Y29udGFpbmluZ0Jsb2NrKCkt
PngoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5
IC0geSgpICsgaW5saW5lQ29udGludWF0aW9uKCktPmNvbnRhaW5pbmdCbG9jaygpLT55KCkpOwog
fQogCiBSZW5kZXJCbG9jayogUmVuZGVyQmxvY2s6OmNyZWF0ZUFub255bW91c0Jsb2NrKGJvb2wg
aXNGbGV4aWJsZUJveCkgY29uc3QKQEAgLTUxMTEsNiArNTAwNyw4IEBAIGNvbnN0IGNoYXIqIFJl
bmRlckJsb2NrOjpyZW5kZXJOYW1lKCkgY28KICAgICAgICAgcmV0dXJuICJSZW5kZXJCbG9jayAo
cG9zaXRpb25lZCkiOwogICAgIGlmIChpc0Fub255bW91c0Jsb2NrKCkpCiAgICAgICAgIHJldHVy
biAiUmVuZGVyQmxvY2sgKGFub255bW91cykiOworICAgIGVsc2UgaWYgKGlzQW5vbnltb3VzSW5s
aW5lQmxvY2soKSkKKyAgICAgICAgcmV0dXJuICJSZW5kZXJCbG9jayAoYW5vbnltb3VzIGlubGlu
ZS1ibG9jaykiOwogICAgIGVsc2UgaWYgKGlzQW5vbnltb3VzKCkpCiAgICAgICAgIHJldHVybiAi
UmVuZGVyQmxvY2sgKGdlbmVyYXRlZCkiOwogICAgIGlmIChpc1JlbFBvc2l0aW9uZWQoKSkKSW5k
ZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suaAkocmV2aXNpb24gNTQ1NjEpCisrKyBXZWJDb3JlL3Jl
bmRlcmluZy9SZW5kZXJCbG9jay5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMjksMTUgKzEyOSwxOCBA
QCBwdWJsaWM6CiAKICAgICB2b2lkIGFkanVzdFJlY3RGb3JDb2x1bW5zKEludFJlY3QmKSBjb25z
dDsKIAotICAgIHZvaWQgYWRkQ29udGludWF0aW9uV2l0aE91dGxpbmUoUmVuZGVySW5saW5lKik7
Ci0KLSAgICBSZW5kZXJJbmxpbmUqIGlubGluZUNvbnRpbnVhdGlvbigpIGNvbnN0IHsgcmV0dXJu
IG1faW5saW5lQ29udGludWF0aW9uOyB9Ci0gICAgdm9pZCBzZXRJbmxpbmVDb250aW51YXRpb24o
UmVuZGVySW5saW5lKiBjKSB7IG1faW5saW5lQ29udGludWF0aW9uID0gYzsgfQotCiAgICAgLy8g
VGhpcyBmdW5jdGlvbiBpcyBhIGNvbnZlbmllbmNlIGhlbHBlciBmb3IgY3JlYXRpbmcgYW4gYW5v
bnltb3VzIGJsb2NrIHRoYXQgaW5oZXJpdHMgaXRzCiAgICAgLy8gc3R5bGUgZnJvbSB0aGlzIFJl
bmRlckJsb2NrLgogICAgIFJlbmRlckJsb2NrKiBjcmVhdGVBbm9ueW1vdXNCbG9jayhib29sIGlz
RmxleGlibGVCb3ggPSBmYWxzZSkgY29uc3Q7CiAKKyAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoUGFp
bnRJbmZvJiwgaW50IHR4LCBpbnQgdHkpOworICAgIHZpcnR1YWwgdm9pZCBwYWludE9iamVjdChQ
YWludEluZm8mLCBpbnQgdHgsIGludCB0eSk7CisKKyAgICBib29sIGluUm9vdEJsb2NrQ29udGV4
dCgpIGNvbnN0OworCisgICAgc3RhdGljIHZvaWQgYXBwZW5kUnVuc0Zvck9iamVjdChpbnQgc3Rh
cnQsIGludCBlbmQsIFJlbmRlck9iamVjdCosIElubGluZUJpZGlSZXNvbHZlciYpOyAgICAKKyAg
ICBzdGF0aWMgYm9vbCByZXF1aXJlc0xpbmVCb3goY29uc3QgSW5saW5lSXRlcmF0b3ImLCBib29s
IGlzTGluZUVtcHR5ID0gdHJ1ZSwgYm9vbCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHkgPSB0cnVl
KTsKKwogcHJvdGVjdGVkOgogICAgIHZvaWQgbW92ZUNoaWxkVG8oUmVuZGVyT2JqZWN0KiB0bywg
UmVuZGVyT2JqZWN0Q2hpbGRMaXN0KiB0b0NoaWxkTGlzdCwgUmVuZGVyT2JqZWN0KiBjaGlsZCk7
CiAgICAgdm9pZCBtb3ZlQ2hpbGRUbyhSZW5kZXJPYmplY3QqIHRvLCBSZW5kZXJPYmplY3RDaGls
ZExpc3QqIHRvQ2hpbGRMaXN0LCBSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkLCBSZW5kZXJPYmpl
Y3QqIGNoaWxkKTsKQEAgLTE2NSw5ICsxNjgsNiBAQCBwcm90ZWN0ZWQ6CiAKICAgICB2b2lkIGxh
eW91dFBvc2l0aW9uZWRPYmplY3RzKGJvb2wgcmVsYXlvdXRDaGlsZHJlbik7CiAKLSAgICB2aXJ0
dWFsIHZvaWQgcGFpbnQoUGFpbnRJbmZvJiwgaW50IHR4LCBpbnQgdHkpOwotICAgIHZpcnR1YWwg
dm9pZCBwYWludE9iamVjdChQYWludEluZm8mLCBpbnQgdHgsIGludCB0eSk7Ci0KICAgICBpbnQg
cmlnaHRSZWxPZmZzZXQoaW50IHksIGludCBmaXhlZE9mZnNldCwgYm9vbCBhcHBseVRleHRJbmRl
bnQgPSB0cnVlLCBpbnQqIGhlaWdodFJlbWFpbmluZyA9IDApIGNvbnN0OwogICAgIGludCBsZWZ0
UmVsT2Zmc2V0KGludCB5LCBpbnQgZml4ZWRPZmZzZXQsIGJvb2wgYXBwbHlUZXh0SW5kZW50ID0g
dHJ1ZSwgaW50KiBoZWlnaHRSZW1haW5pbmcgPSAwKSBjb25zdDsKIApAQCAtMTgwLDggKzE4MCw2
IEBAIHByb3RlY3RlZDoKIAogICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVGaXJzdExldHRlcigpOwog
Ci0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZUhpdFRlc3RSZXN1bHQoSGl0VGVzdFJlc3VsdCYsIGNv
bnN0IEludFBvaW50Jik7Ci0KICAgICAvLyBEZWxheSB1cGRhdGUgc2Nyb2xsYmFyIHVudGlsIGZp
bmlzaERlbGF5UmVwYWludCgpIHdpbGwgYmUKICAgICAvLyBjYWxsZWQuIFRoaXMgZnVuY3Rpb24g
aXMgdXNlZCB3aGVuIGEgZmxleGJveCBpcyBsYXlpbmcgb3V0IGl0cwogICAgIC8vIGRlc2NlbmRh
bnQuIElmIG11bHRpcGxlIGNhbGxzIGFyZSBtYWRlIHRvIHN0YXJ0RGVsYXlSZXBhaW50KCksCkBA
IC0yNDUsNyArMjQzLDkgQEAgcHJpdmF0ZToKICAgICAgICAgYm9vbCBldmVySGFkTGF5b3V0Owog
ICAgIH07CiAKLSAgICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucycgaW1wbGVtZW50YXRpb25z
IGFyZSBpbiBSZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwLgorICAgIGNsYXNzIE1hcmdpbkluZm87
CisKKyAgICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucycgaW1wbGVtZW50YXRpb25zIGFyZSBp
biBSZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwLiAgICAKICAgICB2b2lkIGJpZGlSZW9yZGVyTGlu
ZShJbmxpbmVCaWRpUmVzb2x2ZXImLCBjb25zdCBJbmxpbmVJdGVyYXRvciYgZW5kLCBib29sIHBy
ZXZpb3VzTGluZUJyb2tlQ2xlYW5seSk7CiAgICAgUm9vdElubGluZUJveCogZGV0ZXJtaW5lU3Rh
cnRQb3NpdGlvbihib29sJiBmaXJzdExpbmUsIGJvb2wmIGZ1bGxMYXlvdXQsIGJvb2wmIHByZXZp
b3VzTGluZUJyb2tlQ2xlYW5seSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIElubGluZUJpZGlSZXNvbHZlciYsIFZlY3RvcjxGbG9hdFdpdGhSZWN0PiYgZmxvYXRz
LCB1bnNpZ25lZCYgbnVtQ2xlYW5GbG9hdHMpOwpAQCAtMjU4LDcgKzI1OCw3IEBAIHByaXZhdGU6
CiAgICAgdm9pZCBza2lwVHJhaWxpbmdXaGl0ZXNwYWNlKElubGluZUl0ZXJhdG9yJiwgYm9vbCBp
c0xpbmVFbXB0eSwgYm9vbCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHkpOwogICAgIGludCBza2lw
TGVhZGluZ1doaXRlc3BhY2UoSW5saW5lQmlkaVJlc29sdmVyJiwgYm9vbCBmaXJzdExpbmUsIGJv
b2wgaXNMaW5lRW1wdHksIGJvb2wgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KTsKICAgICB2b2lk
IGZpdEJlbG93RmxvYXRzKGludCB3aWR0aFRvRml0LCBib29sIGZpcnN0TGluZSwgaW50JiBhdmFp
bGFibGVXaWR0aCk7Ci0gICAgSW5saW5lSXRlcmF0b3IgZmluZE5leHRMaW5lQnJlYWsoSW5saW5l
QmlkaVJlc29sdmVyJiwgYm9vbCBmaXJzdExpbmUsIGJvb2wmIGlzTGluZUVtcHR5LCBib29sJiBw
cmV2aW91c0xpbmVCcm9rZUNsZWFubHksIEVDbGVhciogY2xlYXIgPSAwKTsKKyAgICBJbmxpbmVJ
dGVyYXRvciBmaW5kTmV4dExpbmVCcmVhayhJbmxpbmVCaWRpUmVzb2x2ZXImLCBib29sIGZpcnN0
TGluZSwgYm9vbCYgaXNMaW5lRW1wdHksIGJvb2wmIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSwg
TWFyZ2luSW5mbyYsIEVDbGVhciogY2xlYXIgPSAwKTsKICAgICBSb290SW5saW5lQm94KiBjb25z
dHJ1Y3RMaW5lKHVuc2lnbmVkIHJ1bkNvdW50LCBCaWRpUnVuKiBmaXJzdFJ1biwgQmlkaVJ1biog
bGFzdFJ1biwgYm9vbCBmaXJzdExpbmUsIGJvb2wgbGFzdExpbmUsIFJlbmRlck9iamVjdCogZW5k
T2JqZWN0KTsKICAgICBJbmxpbmVGbG93Qm94KiBjcmVhdGVMaW5lQm94ZXMoUmVuZGVyT2JqZWN0
KiwgYm9vbCBmaXJzdExpbmUpOwogICAgIHZvaWQgY29tcHV0ZUhvcml6b250YWxQb3NpdGlvbnNG
b3JMaW5lKFJvb3RJbmxpbmVCb3gqLCBib29sIGZpcnN0TGluZSwgQmlkaVJ1biogZmlyc3RSdW4s
IEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4sIGJvb2wgcmVhY2hlZEVuZCk7CkBAIC0zMTMsMTMg
KzMxMyw3IEBAIHByaXZhdGU6CiAgICAgLy8gT2J0YWlucyB0aGUgbmVhcmVzdCBlbmNsb3Npbmcg
YmxvY2sgKGluY2x1ZGluZyB0aGlzIGJsb2NrKSB0aGF0IGNvbnRyaWJ1dGVzIGEgZmlyc3QtbGlu
ZSBzdHlsZSB0byBvdXIgaW5saW5lCiAgICAgLy8gY2hpbGRyZW4uCiAgICAgdmlydHVhbCBSZW5k
ZXJCbG9jayogZmlyc3RMaW5lQmxvY2soKSBjb25zdDsKLSAgICBib29sIGluUm9vdEJsb2NrQ29u
dGV4dCgpIGNvbnN0OwotCi0gICAgdmlydHVhbCBJbnRSZWN0IHJlY3RXaXRoT3V0bGluZUZvclJl
cGFpbnQoUmVuZGVyQm94TW9kZWxPYmplY3QqIHJlcGFpbnRDb250YWluZXIsIGludCBvdXRsaW5l
V2lkdGgpOwotICAgIHZpcnR1YWwgUmVuZGVyU3R5bGUqIG91dGxpbmVTdHlsZUZvclJlcGFpbnQo
KSBjb25zdDsKICAgICAKLSAgICB2aXJ0dWFsIFJlbmRlck9iamVjdCogaG92ZXJBbmNlc3Rvcigp
IGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVEcmFnU3RhdGUoYm9vbCBkcmFnT24pOwog
ICAgIHZpcnR1YWwgdm9pZCBjaGlsZEJlY2FtZU5vbklubGluZShSZW5kZXJPYmplY3QqIGNoaWxk
KTsKIAogICAgIHZpcnR1YWwgSW50UmVjdCBzZWxlY3Rpb25SZWN0Rm9yUmVwYWludChSZW5kZXJC
b3hNb2RlbE9iamVjdCogcmVwYWludENvbnRhaW5lciwgYm9vbCAvKmNsaXBUb1Zpc2libGVDb250
ZW50Ki8pCkBAIC0zMzksMTYgKzMzMywxMSBAQCBwcml2YXRlOgogICAgIGludCBsZWZ0U2VsZWN0
aW9uT2Zmc2V0KFJlbmRlckJsb2NrKiByb290QmxvY2ssIGludCB5KTsKICAgICBpbnQgcmlnaHRT
ZWxlY3Rpb25PZmZzZXQoUmVuZGVyQmxvY2sqIHJvb3RCbG9jaywgaW50IHkpOwogCi0gICAgdmly
dHVhbCB2b2lkIGFic29sdXRlUmVjdHMoVmVjdG9yPEludFJlY3Q+JiwgaW50IHR4LCBpbnQgdHkp
OwotICAgIHZpcnR1YWwgdm9pZCBhYnNvbHV0ZVF1YWRzKFZlY3RvcjxGbG9hdFF1YWQ+Jik7Ci0K
ICAgICBpbnQgZGVzaXJlZENvbHVtbldpZHRoKCkgY29uc3Q7CiAgICAgdW5zaWduZWQgZGVzaXJl
ZENvbHVtbkNvdW50KCkgY29uc3Q7CiAgICAgVmVjdG9yPEludFJlY3Q+KiBjb2x1bW5SZWN0cygp
IGNvbnN0OwogICAgIHZvaWQgc2V0RGVzaXJlZENvbHVtbkNvdW50QW5kV2lkdGgoaW50IGNvdW50
LCBpbnQgd2lkdGgpOwogICAgIGludCBjb2x1bW5HYXAoKSBjb25zdDsKLSAgICAKLSAgICB2b2lk
IHBhaW50Q29udGludWF0aW9uT3V0bGluZXMoUGFpbnRJbmZvJiwgaW50IHR4LCBpbnQgdHkpOwog
CiAgICAgdmlydHVhbCBJbnRSZWN0IGxvY2FsQ2FyZXRSZWN0KElubGluZUJveCosIGludCBjYXJl
dE9mZnNldCwgaW50KiBleHRyYVdpZHRoVG9FbmRPZkxpbmUgPSAwKTsKIApAQCAtNDg0LDEyICs0
NzMsNiBAQCBwcml2YXRlOgogICAgIERlcHJlY2F0ZWRQdHJMaXN0PEZsb2F0aW5nT2JqZWN0Piog
bV9mbG9hdGluZ09iamVjdHM7CiAgICAgTGlzdEhhc2hTZXQ8UmVuZGVyQm94Kj4qIG1fcG9zaXRp
b25lZE9iamVjdHM7CiAKLSAgICAvLyBBbiBpbmxpbmUgY2FuIGJlIHNwbGl0IHdpdGggYmxvY2tz
IG9jY3VycmluZyBpbiBiZXR3ZWVuIHRoZSBpbmxpbmUgY29udGVudC4KLSAgICAvLyBXaGVuIHRo
aXMgb2NjdXJzIHdlIG5lZWQgYSBwb2ludGVyIHRvIG91ciBuZXh0IG9iamVjdC4gIFdlIGNhbiBi
YXNpY2FsbHkgYmUKLSAgICAvLyBzcGxpdCBpbnRvIGEgc2VxdWVuY2Ugb2YgaW5saW5lcyBhbmQg
YmxvY2tzLiAgVGhlIGNvbnRpbnVhdGlvbiB3aWxsIGVpdGhlciBiZQotICAgIC8vIGFuIGFub255
bW91cyBibG9jayAodGhhdCBob3VzZXMgb3RoZXIgYmxvY2tzKSBvciBpdCB3aWxsIGJlIGFuIGlu
bGluZSBmbG93LgotICAgIFJlbmRlcklubGluZSogbV9pbmxpbmVDb250aW51YXRpb247Ci0KICAg
ICAvLyBBbGxvY2F0ZWQgb25seSB3aGVuIHNvbWUgb2YgdGhlc2UgZmllbGRzIGhhdmUgbm9uLWRl
ZmF1bHQgdmFsdWVzCiAgICAgc3RydWN0IE1heE1hcmdpbiA6IE5vbmNvcHlhYmxlIHsKICAgICAg
ICAgTWF4TWFyZ2luKGNvbnN0IFJlbmRlckJsb2NrKiBvKSAKQEAgLTUxNywxMCArNTAwLDEyIEBA
IHByaXZhdGU6CiAgICAgUmVuZGVyTGluZUJveExpc3QgbV9saW5lQm94ZXM7ICAgLy8gQWxsIG9m
IHRoZSByb290IGxpbmUgYm94ZXMgY3JlYXRlZCBmb3IgdGhpcyBibG9jayBmbG93LiAgRm9yIGV4
YW1wbGUsIDxkaXY+SGVsbG88YnI+d29ybGQuPC9kaXY+IHdpbGwgaGF2ZSB0d28gdG90YWwgbGlu
ZXMgZm9yIHRoZSA8ZGl2Pi4KIAogICAgIG11dGFibGUgaW50IG1fbGluZUhlaWdodDsKLSAgICAK
KwogICAgIC8vIFJlbmRlclJ1YnlCYXNlIG9iamVjdHMgbmVlZCB0byBiZSBhYmxlIHRvIHNwbGl0
IGFuZCBtZXJnZSwgbW92aW5nIHRoZWlyIGNoaWxkcmVuIGFyb3VuZAogICAgIC8vIChjYWxsaW5n
IG1vdmVDaGlsZFRvLCBtb3ZlQWxsQ2hpbGRyZW5UbywgYW5kIG1ha2VDaGlsZHJlbk5vbklubGlu
ZSkuCiAgICAgZnJpZW5kIGNsYXNzIFJlbmRlclJ1YnlCYXNlOworICAgIAorICAgIGZyaWVuZCBj
bGFzcyBSb290SW5saW5lQm94OwogfTsKIAogaW5saW5lIFJlbmRlckJsb2NrKiB0b1JlbmRlckJs
b2NrKFJlbmRlck9iamVjdCogb2JqZWN0KQpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVy
QmxvY2tMaW5lTGF5b3V0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5k
ZXJCbG9ja0xpbmVMYXlvdXQuY3BwCShyZXZpc2lvbiA1NDU2MSkKKysrIFdlYkNvcmUvcmVuZGVy
aW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI0LDYgKzI0
LDcgQEAKIAogI2luY2x1ZGUgIkJpZGlSZXNvbHZlci5oIgogI2luY2x1ZGUgIkNoYXJhY3Rlck5h
bWVzLmgiCisjaW5jbHVkZSAiSW5saW5lSXRlcmF0b3IuaCIKICNpbmNsdWRlICJJbmxpbmVUZXh0
Qm94LmgiCiAjaW5jbHVkZSAiTG9nZ2luZy5oIgogI2luY2x1ZGUgIlJlbmRlckFyZW5hLmgiCkBA
IC00NiwzNiArNDcsNiBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAvLyBXZSBkb24ndCBsZXQgb3Vy
IGxpbmUgYm94IHRyZWUgZm9yIGEgc2luZ2xlIGxpbmUgZ2V0IGFueSBkZWVwZXIgdGhhbiB0aGlz
LgogY29uc3QgdW5zaWduZWQgY01heExpbmVEZXB0aCA9IDIwMDsKIAotY2xhc3MgSW5saW5lSXRl
cmF0b3IgewotcHVibGljOgotICAgIElubGluZUl0ZXJhdG9yKCkKLSAgICAgICAgOiBibG9jaygw
KQotICAgICAgICAsIG9iaigwKQotICAgICAgICAsIHBvcygwKQotICAgICAgICAsIG5leHRCcmVh
a2FibGVQb3NpdGlvbigtMSkKLSAgICB7Ci0gICAgfQotCi0gICAgSW5saW5lSXRlcmF0b3IoUmVu
ZGVyQmxvY2sqIGIsIFJlbmRlck9iamVjdCogbywgdW5zaWduZWQgcCkKLSAgICAgICAgOiBibG9j
ayhiKQotICAgICAgICAsIG9iaihvKQotICAgICAgICAsIHBvcyhwKQotICAgICAgICAsIG5leHRC
cmVha2FibGVQb3NpdGlvbigtMSkKLSAgICB7Ci0gICAgfQotCi0gICAgdm9pZCBpbmNyZW1lbnQo
SW5saW5lQmlkaVJlc29sdmVyKiByZXNvbHZlciA9IDApOwotICAgIGJvb2wgYXRFbmQoKSBjb25z
dDsKLQotICAgIFVDaGFyIGN1cnJlbnQoKSBjb25zdDsKLSAgICBEaXJlY3Rpb24gZGlyZWN0aW9u
KCkgY29uc3Q7Ci0KLSAgICBSZW5kZXJCbG9jayogYmxvY2s7Ci0gICAgUmVuZGVyT2JqZWN0KiBv
Ymo7Ci0gICAgdW5zaWduZWQgcG9zOwotICAgIGludCBuZXh0QnJlYWthYmxlUG9zaXRpb247Ci19
OwotCiBzdGF0aWMgaW50IGdldEJvcmRlclBhZGRpbmdNYXJnaW4oUmVuZGVyQm94TW9kZWxPYmpl
Y3QqIGNoaWxkLCBib29sIGVuZE9mSW5saW5lKQogewogICAgIGJvb2wgbGVmdFNpZGUgPSAoY2hp
bGQtPnN0eWxlKCktPmRpcmVjdGlvbigpID09IExUUikgPyAhZW5kT2ZJbmxpbmUgOiBlbmRPZklu
bGluZTsKQEAgLTEwMCwyNDcgKzcxLDYgQEAgc3RhdGljIGludCBpbmxpbmVXaWR0aChSZW5kZXJP
YmplY3QqIGNoaQogICAgIHJldHVybiBleHRyYVdpZHRoOwogfQogCi1zdHJ1Y3QgQmlkaVJ1biA6
IEJpZGlDaGFyYWN0ZXJSdW4gewotICAgIEJpZGlSdW4oaW50IHN0YXJ0LCBpbnQgc3RvcCwgUmVu
ZGVyT2JqZWN0KiBvYmplY3QsIEJpZGlDb250ZXh0KiBjb250ZXh0LCBEaXJlY3Rpb24gZGlyKQot
ICAgICAgICA6IEJpZGlDaGFyYWN0ZXJSdW4oc3RhcnQsIHN0b3AsIGNvbnRleHQsIGRpcikKLSAg
ICAgICAgLCBtX29iamVjdChvYmplY3QpCi0gICAgICAgICwgbV9ib3goMCkKLSAgICB7Ci0gICAg
fQotCi0gICAgdm9pZCBkZXN0cm95KCk7Ci0KLSAgICAvLyBPdmVybG9hZGVkIG5ldyBvcGVyYXRv
ci4KLSAgICB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90LCBSZW5kZXJBcmVuYSopIHRocm93KCk7
Ci0KLSAgICAvLyBPdmVycmlkZGVuIHRvIHByZXZlbnQgdGhlIG5vcm1hbCBkZWxldGUgZnJvbSBi
ZWluZyBjYWxsZWQuCi0gICAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCosIHNpemVfdCk7Ci0K
LSAgICBCaWRpUnVuKiBuZXh0KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8QmlkaVJ1bio+KG1fbmV4
dCk7IH0KLQotcHJpdmF0ZToKLSAgICAvLyBUaGUgbm9ybWFsIG9wZXJhdG9yIG5ldyBpcyBkaXNh
bGxvd2VkLgotICAgIHZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3QpIHRocm93KCk7Ci0KLXB1Ymxp
YzoKLSAgICBSZW5kZXJPYmplY3QqIG1fb2JqZWN0OwotICAgIElubGluZUJveCogbV9ib3g7Ci19
OwotCi0jaWZuZGVmIE5ERUJVRwotc3RhdGljIFJlZkNvdW50ZWRMZWFrQ291bnRlciBiaWRpUnVu
Q291bnRlcigiQmlkaVJ1biIpOwotCi1zdGF0aWMgYm9vbCBpbkJpZGlSdW5EZXN0cm95OwotI2Vu
ZGlmCi0KLXZvaWQgQmlkaVJ1bjo6ZGVzdHJveSgpCi17Ci0jaWZuZGVmIE5ERUJVRwotICAgIGlu
QmlkaVJ1bkRlc3Ryb3kgPSB0cnVlOwotI2VuZGlmCi0gICAgUmVuZGVyQXJlbmEqIHJlbmRlckFy
ZW5hID0gbV9vYmplY3QtPnJlbmRlckFyZW5hKCk7Ci0gICAgZGVsZXRlIHRoaXM7Ci0jaWZuZGVm
IE5ERUJVRwotICAgIGluQmlkaVJ1bkRlc3Ryb3kgPSBmYWxzZTsKLSNlbmRpZgotCi0gICAgLy8g
UmVjb3ZlciB0aGUgc2l6ZSBsZWZ0IHRoZXJlIGZvciB1cyBieSBvcGVyYXRvciBkZWxldGUgYW5k
IGZyZWUgdGhlIG1lbW9yeS4KLSAgICByZW5kZXJBcmVuYS0+ZnJlZSgqcmVpbnRlcnByZXRfY2Fz
dDxzaXplX3QqPih0aGlzKSwgdGhpcyk7Ci19Ci0KLXZvaWQqIEJpZGlSdW46Om9wZXJhdG9yIG5l
dyhzaXplX3Qgc3osIFJlbmRlckFyZW5hKiByZW5kZXJBcmVuYSkgdGhyb3coKQotewotI2lmbmRl
ZiBOREVCVUcKLSAgICBiaWRpUnVuQ291bnRlci5pbmNyZW1lbnQoKTsKLSNlbmRpZgotICAgIHJl
dHVybiByZW5kZXJBcmVuYS0+YWxsb2NhdGUoc3opOwotfQotCi12b2lkIEJpZGlSdW46Om9wZXJh
dG9yIGRlbGV0ZSh2b2lkKiBwdHIsIHNpemVfdCBzeikKLXsKLSNpZm5kZWYgTkRFQlVHCi0gICAg
YmlkaVJ1bkNvdW50ZXIuZGVjcmVtZW50KCk7Ci0jZW5kaWYKLSAgICBBU1NFUlQoaW5CaWRpUnVu
RGVzdHJveSk7Ci0KLSAgICAvLyBTdGFzaCBzaXplIHdoZXJlIGRlc3Ryb3koKSBjYW4gZmluZCBp
dC4KLSAgICAqKHNpemVfdCopcHRyID0gc3o7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1pbmxp
bmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IElubGluZUl0ZXJhdG9yJiBpdDEsIGNvbnN0IElubGlu
ZUl0ZXJhdG9yJiBpdDIpCi17Ci0gICAgcmV0dXJuIGl0MS5wb3MgPT0gaXQyLnBvcyAmJiBpdDEu
b2JqID09IGl0Mi5vYmo7Ci19Ci0KLWlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgSW5saW5l
SXRlcmF0b3ImIGl0MSwgY29uc3QgSW5saW5lSXRlcmF0b3ImIGl0MikKLXsKLSAgICByZXR1cm4g
aXQxLnBvcyAhPSBpdDIucG9zIHx8IGl0MS5vYmogIT0gaXQyLm9iajsKLX0KLQotc3RhdGljIGlu
bGluZSBSZW5kZXJPYmplY3QqIGJpZGlOZXh0KFJlbmRlckJsb2NrKiBibG9jaywgUmVuZGVyT2Jq
ZWN0KiBjdXJyZW50LCBJbmxpbmVCaWRpUmVzb2x2ZXIqIHJlc29sdmVyID0gMCwgYm9vbCBza2lw
SW5saW5lcyA9IHRydWUsIGJvb2wqIGVuZE9mSW5saW5lUHRyID0gMCkKLXsKLSAgICBSZW5kZXJP
YmplY3QqIG5leHQgPSAwOwotICAgIGJvb2wgb2xkRW5kT2ZJbmxpbmUgPSBlbmRPZklubGluZVB0
ciA/ICplbmRPZklubGluZVB0ciA6IGZhbHNlOwotICAgIGJvb2wgZW5kT2ZJbmxpbmUgPSBmYWxz
ZTsKLQotICAgIHdoaWxlIChjdXJyZW50KSB7Ci0gICAgICAgIG5leHQgPSAwOwotICAgICAgICBp
ZiAoIW9sZEVuZE9mSW5saW5lICYmICFjdXJyZW50LT5pc0Zsb2F0aW5nKCkgJiYgIWN1cnJlbnQt
PmlzUmVwbGFjZWQoKSAmJiAhY3VycmVudC0+aXNQb3NpdGlvbmVkKCkgJiYgIWN1cnJlbnQtPmlz
VGV4dCgpKSB7Ci0gICAgICAgICAgICBuZXh0ID0gY3VycmVudC0+Zmlyc3RDaGlsZCgpOwotICAg
ICAgICAgICAgaWYgKG5leHQgJiYgcmVzb2x2ZXIgJiYgbmV4dC0+aXNSZW5kZXJJbmxpbmUoKSkg
ewotICAgICAgICAgICAgICAgIEVVbmljb2RlQmlkaSB1YiA9IG5leHQtPnN0eWxlKCktPnVuaWNv
ZGVCaWRpKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHViICE9IFVCTm9ybWFsKSB7Ci0gICAgICAg
ICAgICAgICAgICAgIFRleHREaXJlY3Rpb24gZGlyID0gbmV4dC0+c3R5bGUoKS0+ZGlyZWN0aW9u
KCk7Ci0gICAgICAgICAgICAgICAgICAgIERpcmVjdGlvbiBkID0gKHViID09IEVtYmVkCi0gICAg
ICAgICAgICAgICAgICAgICAgICA/IChkaXIgPT0gUlRMID8gUmlnaHRUb0xlZnRFbWJlZGRpbmcg
OiBMZWZ0VG9SaWdodEVtYmVkZGluZykKLSAgICAgICAgICAgICAgICAgICAgICAgIDogKGRpciA9
PSBSVEwgPyBSaWdodFRvTGVmdE92ZXJyaWRlIDogTGVmdFRvUmlnaHRPdmVycmlkZSkpOwotICAg
ICAgICAgICAgICAgICAgICByZXNvbHZlci0+ZW1iZWQoZCk7Ci0gICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFuZXh0KSB7Ci0gICAgICAg
ICAgICBpZiAoIXNraXBJbmxpbmVzICYmICFvbGRFbmRPZklubGluZSAmJiBjdXJyZW50LT5pc1Jl
bmRlcklubGluZSgpKSB7Ci0gICAgICAgICAgICAgICAgbmV4dCA9IGN1cnJlbnQ7Ci0gICAgICAg
ICAgICAgICAgZW5kT2ZJbmxpbmUgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICAgICAgfQotCi0gICAgICAgICAgICB3aGlsZSAoY3VycmVudCAmJiBjdXJyZW50ICE9IGJs
b2NrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc29sdmVyICYmIGN1cnJlbnQtPmlzUmVuZGVy
SW5saW5lKCkgJiYgY3VycmVudC0+c3R5bGUoKS0+dW5pY29kZUJpZGkoKSAhPSBVQk5vcm1hbCkK
LSAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXItPmVtYmVkKFBvcERpcmVjdGlvbmFsRm9ybWF0
KTsKLQotICAgICAgICAgICAgICAgIG5leHQgPSBjdXJyZW50LT5uZXh0U2libGluZygpOwotICAg
ICAgICAgICAgICAgIGlmIChuZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZl
ciAmJiBuZXh0LT5pc1JlbmRlcklubGluZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBF
VW5pY29kZUJpZGkgdWIgPSBuZXh0LT5zdHlsZSgpLT51bmljb2RlQmlkaSgpOwotICAgICAgICAg
ICAgICAgICAgICAgICAgaWYgKHViICE9IFVCTm9ybWFsKSB7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgVGV4dERpcmVjdGlvbiBkaXIgPSBuZXh0LT5zdHlsZSgpLT5kaXJlY3Rpb24oKTsK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXJlY3Rpb24gZCA9ICh1YiA9PSBFbWJlZAot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChkaXIgPT0gUlRMID8gUmlnaHRUb0xl
ZnRFbWJlZGRpbmc6IExlZnRUb1JpZ2h0RW1iZWRkaW5nKQotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICA6IChkaXIgPT0gUlRMID8gUmlnaHRUb0xlZnRPdmVycmlkZSA6IExlZnRUb1Jp
Z2h0T3ZlcnJpZGUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlci0+ZW1i
ZWQoZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0K
LSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAg
ICAgICAgIAotICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5wYXJlbnQoKTsKLSAg
ICAgICAgICAgICAgICBpZiAoIXNraXBJbmxpbmVzICYmIGN1cnJlbnQgJiYgY3VycmVudCAhPSBi
bG9jayAmJiBjdXJyZW50LT5pc1JlbmRlcklubGluZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAg
IG5leHQgPSBjdXJyZW50OwotICAgICAgICAgICAgICAgICAgICBlbmRPZklubGluZSA9IHRydWU7
Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbmV4dCkKLSAgICAgICAgICAgIGJyZWFr
OwotCi0gICAgICAgIGlmIChuZXh0LT5pc1RleHQoKSB8fCBuZXh0LT5pc0Zsb2F0aW5nKCkgfHwg
bmV4dC0+aXNSZXBsYWNlZCgpIHx8IG5leHQtPmlzUG9zaXRpb25lZCgpCi0gICAgICAgICAgICB8
fCAoKCFza2lwSW5saW5lcyB8fCAhbmV4dC0+Zmlyc3RDaGlsZCgpKSAvLyBBbHdheXMgcmV0dXJu
IEVNUFRZIGlubGluZXMuCi0gICAgICAgICAgICAgICAgJiYgbmV4dC0+aXNSZW5kZXJJbmxpbmUo
KSkpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY3VycmVudCA9IG5leHQ7Ci0gICAgfQot
Ci0gICAgaWYgKGVuZE9mSW5saW5lUHRyKQotICAgICAgICAqZW5kT2ZJbmxpbmVQdHIgPSBlbmRP
ZklubGluZTsKLQotICAgIHJldHVybiBuZXh0OwotfQotCi1zdGF0aWMgUmVuZGVyT2JqZWN0KiBi
aWRpRmlyc3QoUmVuZGVyQmxvY2sqIGJsb2NrLCBJbmxpbmVCaWRpUmVzb2x2ZXIqIHJlc29sdmVy
LCBib29sIHNraXBJbmxpbmVzID0gdHJ1ZSkKLXsKLSAgICBpZiAoIWJsb2NrLT5maXJzdENoaWxk
KCkpCi0gICAgICAgIHJldHVybiAwOwotICAgIAotICAgIFJlbmRlck9iamVjdCogbyA9IGJsb2Nr
LT5maXJzdENoaWxkKCk7Ci0gICAgaWYgKG8tPmlzUmVuZGVySW5saW5lKCkpIHsKLSAgICAgICAg
aWYgKHJlc29sdmVyKSB7Ci0gICAgICAgICAgICBFVW5pY29kZUJpZGkgdWIgPSBvLT5zdHlsZSgp
LT51bmljb2RlQmlkaSgpOwotICAgICAgICAgICAgaWYgKHViICE9IFVCTm9ybWFsKSB7Ci0gICAg
ICAgICAgICAgICAgVGV4dERpcmVjdGlvbiBkaXIgPSBvLT5zdHlsZSgpLT5kaXJlY3Rpb24oKTsK
LSAgICAgICAgICAgICAgICBEaXJlY3Rpb24gZCA9ICh1YiA9PSBFbWJlZAotICAgICAgICAgICAg
ICAgICAgICA/IChkaXIgPT0gUlRMID8gUmlnaHRUb0xlZnRFbWJlZGRpbmcgOiBMZWZ0VG9SaWdo
dEVtYmVkZGluZykKLSAgICAgICAgICAgICAgICAgICAgOiAoZGlyID09IFJUTCA/IFJpZ2h0VG9M
ZWZ0T3ZlcnJpZGUgOiBMZWZ0VG9SaWdodE92ZXJyaWRlKSk7Ci0gICAgICAgICAgICAgICAgcmVz
b2x2ZXItPmVtYmVkKGQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChz
a2lwSW5saW5lcyAmJiBvLT5maXJzdENoaWxkKCkpCi0gICAgICAgICAgICBvID0gYmlkaU5leHQo
YmxvY2ssIG8sIHJlc29sdmVyLCBza2lwSW5saW5lcyk7Ci0gICAgICAgIGVsc2UgewotICAgICAg
ICAgICAgLy8gTmV2ZXIgc2tpcCBlbXB0eSBpbmxpbmVzLgotICAgICAgICAgICAgaWYgKHJlc29s
dmVyKQotICAgICAgICAgICAgICAgIHJlc29sdmVyLT5jb21taXRFeHBsaWNpdEVtYmVkZGluZygp
OwotICAgICAgICAgICAgcmV0dXJuIG87IAotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG8g
JiYgIW8tPmlzVGV4dCgpICYmICFvLT5pc1JlcGxhY2VkKCkgJiYgIW8tPmlzRmxvYXRpbmcoKSAm
JiAhby0+aXNQb3NpdGlvbmVkKCkpCi0gICAgICAgIG8gPSBiaWRpTmV4dChibG9jaywgbywgcmVz
b2x2ZXIsIHNraXBJbmxpbmVzKTsKLQotICAgIGlmIChyZXNvbHZlcikKLSAgICAgICAgcmVzb2x2
ZXItPmNvbW1pdEV4cGxpY2l0RW1iZWRkaW5nKCk7Ci0gICAgcmV0dXJuIG87Ci19Ci0KLWlubGlu
ZSB2b2lkIElubGluZUl0ZXJhdG9yOjppbmNyZW1lbnQoSW5saW5lQmlkaVJlc29sdmVyKiByZXNv
bHZlcikKLXsKLSAgICBpZiAoIW9iaikKLSAgICAgICAgcmV0dXJuOwotICAgIGlmIChvYmotPmlz
VGV4dCgpKSB7Ci0gICAgICAgIHBvcysrOwotICAgICAgICBpZiAocG9zID49IHRvUmVuZGVyVGV4
dChvYmopLT50ZXh0TGVuZ3RoKCkpIHsKLSAgICAgICAgICAgIG9iaiA9IGJpZGlOZXh0KGJsb2Nr
LCBvYmosIHJlc29sdmVyKTsKLSAgICAgICAgICAgIHBvcyA9IDA7Ci0gICAgICAgICAgICBuZXh0
QnJlYWthYmxlUG9zaXRpb24gPSAtMTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAg
IG9iaiA9IGJpZGlOZXh0KGJsb2NrLCBvYmosIHJlc29sdmVyKTsKLSAgICAgICAgcG9zID0gMDsK
LSAgICAgICAgbmV4dEJyZWFrYWJsZVBvc2l0aW9uID0gLTE7Ci0gICAgfQotfQotCi10ZW1wbGF0
ZTw+Ci1pbmxpbmUgdm9pZCBJbmxpbmVCaWRpUmVzb2x2ZXI6OmluY3JlbWVudCgpCi17Ci0gICAg
Y3VycmVudC5pbmNyZW1lbnQodGhpcyk7Ci19Ci0KLWlubGluZSBib29sIElubGluZUl0ZXJhdG9y
OjphdEVuZCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICFvYmo7Ci19Ci0KLWlubGluZSBVQ2hhciBJ
bmxpbmVJdGVyYXRvcjo6Y3VycmVudCgpIGNvbnN0Ci17Ci0gICAgaWYgKCFvYmogfHwgIW9iai0+
aXNUZXh0KCkpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgUmVuZGVyVGV4dCogdGV4dCA9IHRv
UmVuZGVyVGV4dChvYmopOwotICAgIGlmIChwb3MgPj0gdGV4dC0+dGV4dExlbmd0aCgpKQotICAg
ICAgICByZXR1cm4gMDsKLQotICAgIHJldHVybiB0ZXh0LT5jaGFyYWN0ZXJzKClbcG9zXTsKLX0K
LQotQUxXQVlTX0lOTElORSBEaXJlY3Rpb24gSW5saW5lSXRlcmF0b3I6OmRpcmVjdGlvbigpIGNv
bnN0Ci17Ci0gICAgaWYgKFVDaGFyIGMgPSBjdXJyZW50KCkpCi0gICAgICAgIHJldHVybiBVbmlj
b2RlOjpkaXJlY3Rpb24oYyk7Ci0KLSAgICBpZiAob2JqICYmIG9iai0+aXNMaXN0TWFya2VyKCkp
Ci0gICAgICAgIHJldHVybiBvYmotPnN0eWxlKCktPmRpcmVjdGlvbigpID09IExUUiA/IExlZnRU
b1JpZ2h0IDogUmlnaHRUb0xlZnQ7Ci0KLSAgICByZXR1cm4gT3RoZXJOZXV0cmFsOwotfQotCi0v
LyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KIHN0YXRpYyB2b2lk
IGNob3BNaWRwb2ludHNBdChMaW5lTWlkcG9pbnRTdGF0ZSYgbGluZU1pZHBvaW50U3RhdGUsIFJl
bmRlck9iamVjdCogb2JqLCB1bnNpZ25lZCBwb3MpCiB7CiAgICAgaWYgKCFsaW5lTWlkcG9pbnRT
dGF0ZS5udW1NaWRwb2ludHMpCkBAIC0zOTgsNyArMTI4LDcgQEAgc3RhdGljIHZvaWQgYWRkTWlk
cG9pbnQoTGluZU1pZHBvaW50U3RhdAogICAgIG1pZHBvaW50c1tsaW5lTWlkcG9pbnRTdGF0ZS5u
dW1NaWRwb2ludHMrK10gPSBtaWRwb2ludDsKIH0KIAotc3RhdGljIHZvaWQgYXBwZW5kUnVuc0Zv
ck9iamVjdChpbnQgc3RhcnQsIGludCBlbmQsIFJlbmRlck9iamVjdCogb2JqLCBJbmxpbmVCaWRp
UmVzb2x2ZXImIHJlc29sdmVyKQordm9pZCBSZW5kZXJCbG9jazo6YXBwZW5kUnVuc0Zvck9iamVj
dChpbnQgc3RhcnQsIGludCBlbmQsIFJlbmRlck9iamVjdCogb2JqLCBJbmxpbmVCaWRpUmVzb2x2
ZXImIHJlc29sdmVyKQogewogICAgIGlmIChzdGFydCA+IGVuZCB8fCBvYmotPmlzRmxvYXRpbmco
KSB8fAogICAgICAgICAob2JqLT5pc1Bvc2l0aW9uZWQoKSAmJiAhb2JqLT5zdHlsZSgpLT5oYXNT
dGF0aWNYKCkgJiYgIW9iai0+c3R5bGUoKS0+aGFzU3RhdGljWSgpICYmICFvYmotPmNvbnRhaW5l
cigpLT5pc1JlbmRlcklubGluZSgpKSkKQEAgLTQ0MSwzNiArMTcxLDYgQEAgc3RhdGljIHZvaWQg
YXBwZW5kUnVuc0Zvck9iamVjdChpbnQgc3RhcgogICAgIH0KIH0KIAotdGVtcGxhdGUgPD4KLXZv
aWQgSW5saW5lQmlkaVJlc29sdmVyOjphcHBlbmRSdW4oKQotewotICAgIGlmICghZW1wdHlSdW4g
JiYgIWVvci5hdEVuZCgpKSB7Ci0gICAgICAgIGludCBzdGFydCA9IHNvci5wb3M7Ci0gICAgICAg
IFJlbmRlck9iamVjdCAqb2JqID0gc29yLm9iajsKLSAgICAgICAgd2hpbGUgKG9iaiAmJiBvYmog
IT0gZW9yLm9iaiAmJiBvYmogIT0gZW5kT2ZMaW5lLm9iaikgewotICAgICAgICAgICAgYXBwZW5k
UnVuc0Zvck9iamVjdChzdGFydCwgb2JqLT5sZW5ndGgoKSwgb2JqLCAqdGhpcyk7ICAgICAgICAK
LSAgICAgICAgICAgIHN0YXJ0ID0gMDsKLSAgICAgICAgICAgIG9iaiA9IGJpZGlOZXh0KHNvci5i
bG9jaywgb2JqKTsKLSAgICAgICAgfQotICAgICAgICBpZiAob2JqKSB7Ci0gICAgICAgICAgICB1
bnNpZ25lZCBwb3MgPSBvYmogPT0gZW9yLm9iaiA/IGVvci5wb3MgOiBVSU5UX01BWDsKLSAgICAg
ICAgICAgIGlmIChvYmogPT0gZW5kT2ZMaW5lLm9iaiAmJiBlbmRPZkxpbmUucG9zIDw9IHBvcykg
ewotICAgICAgICAgICAgICAgIHJlYWNoZWRFbmRPZkxpbmUgPSB0cnVlOwotICAgICAgICAgICAg
ICAgIHBvcyA9IGVuZE9mTGluZS5wb3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJ
dCdzIE9LIHRvIGFkZCBydW5zIGZvciB6ZXJvLWxlbmd0aCBSZW5kZXJPYmplY3RzLCBqdXN0IGRv
bid0IG1ha2UgdGhlIHJ1biBsYXJnZXIgdGhhbiBpdCBzaG91bGQgYmUKLSAgICAgICAgICAgIGlu
dCBlbmQgPSBvYmotPmxlbmd0aCgpID8gcG9zKzEgOiAwOwotICAgICAgICAgICAgYXBwZW5kUnVu
c0Zvck9iamVjdChzdGFydCwgZW5kLCBvYmosICp0aGlzKTsKLSAgICAgICAgfQotICAgICAgICAK
LSAgICAgICAgZW9yLmluY3JlbWVudCgpOwotICAgICAgICBzb3IgPSBlb3I7Ci0gICAgfQotCi0g
ICAgbV9kaXJlY3Rpb24gPSBPdGhlck5ldXRyYWw7Ci0gICAgbV9zdGF0dXMuZW9yID0gT3RoZXJO
ZXV0cmFsOwotfQotCiBzdGF0aWMgaW5saW5lIElubGluZUJveCogY3JlYXRlSW5saW5lQm94Rm9y
UmVuZGVyZXIoUmVuZGVyT2JqZWN0KiBvYmosIGJvb2wgaXNSb290TGluZUJveCwgYm9vbCBpc09u
bHlSdW4gPSBmYWxzZSkKIHsKICAgICBpZiAoaXNSb290TGluZUJveCkKQEAgLTU3MiwxMiArMjcy
LDE2IEBAIFJvb3RJbmxpbmVCb3gqIFJlbmRlckJsb2NrOjpjb25zdHJ1Y3RMaW4KICAgICAgICAg
aWYgKCFib3gpCiAgICAgICAgICAgICBjb250aW51ZTsKIAorICAgICAgICAvLyBBbm9ueW1vdXMg
aW5saW5lIGJsb2NrcyAodXNlZCB0byBob2xkIGJsb2NrcyBpbnNpZGUgaW5saW5lcykgZG9uJ3Qg
bmVlZCB0byB3YXN0ZSB0aW1lIHdyYXBwaW5nCisgICAgICAgIC8vIHRoZW1zZWx2ZXMgaW4gdGhv
c2UgaW5saW5lcyAoc2luY2Ugd2Ugd2FudCB0byBwcmV0ZW5kIGxpa2UgdGhleSBkb24ndCBleGlz
dCBvbiB0aGlzIGZha2UgbGluZSkuCisgICAgICAgIFJlbmRlck9iamVjdCogYW5jZXN0b3JSZW5k
ZXJlciA9IHItPm1fb2JqZWN0LT5pc0Fub255bW91c0lubGluZUJsb2NrKCkgPyB0aGlzIDogci0+
bV9vYmplY3QtPnBhcmVudCgpOworIAogICAgICAgICAvLyBJZiB3ZSBoYXZlIG5vIHBhcmVudCBi
b3ggeWV0LCBvciBpZiB0aGUgcnVuIGlzIG5vdCBzaW1wbHkgYSBzaWJsaW5nLAogICAgICAgICAv
LyB0aGVuIHdlIG5lZWQgdG8gY29uc3RydWN0IGlubGluZSBib3hlcyBhcyBuZWNlc3NhcnkgdG8g
cHJvcGVybHkgZW5jbG9zZSB0aGUKICAgICAgICAgLy8gcnVuJ3MgaW5saW5lIGJveC4KLSAgICAg
ICAgaWYgKCFwYXJlbnRCb3ggfHwgcGFyZW50Qm94LT5yZW5kZXJlcigpICE9IHItPm1fb2JqZWN0
LT5wYXJlbnQoKSkKKyAgICAgICAgaWYgKCFwYXJlbnRCb3ggfHwgcGFyZW50Qm94LT5yZW5kZXJl
cigpICE9IGFuY2VzdG9yUmVuZGVyZXIpCiAgICAgICAgICAgICAvLyBDcmVhdGUgbmV3IGlubGlu
ZSBib3hlcyBhbGwgdGhlIHdheSBiYWNrIHRvIHRoZSBhcHByb3ByaWF0ZSBpbnNlcnRpb24gcG9p
bnQuCi0gICAgICAgICAgICBwYXJlbnRCb3ggPSBjcmVhdGVMaW5lQm94ZXMoci0+bV9vYmplY3Qt
PnBhcmVudCgpLCBmaXJzdExpbmUpOworICAgICAgICAgICAgcGFyZW50Qm94ID0gY3JlYXRlTGlu
ZUJveGVzKGFuY2VzdG9yUmVuZGVyZXIsIGZpcnN0TGluZSk7CiAKICAgICAgICAgLy8gQXBwZW5k
IHRoZSBpbmxpbmUgYm94IHRvIHRoaXMgbGluZS4KICAgICAgICAgcGFyZW50Qm94LT5hZGRUb0xp
bmUoYm94KTsKQEAgLTYxOSw2ICszMjMsOCBAQCB2b2lkIFJlbmRlckJsb2NrOjpjb21wdXRlSG9y
aXpvbnRhbFBvc2l0CiAgICAgdW5zaWduZWQgbnVtU3BhY2VzID0gMDsKICAgICBFVGV4dEFsaWdu
IHRleHRBbGlnbiA9IHN0eWxlKCktPnRleHRBbGlnbigpOwogCisgICAgaW50IHggPSBsZWZ0T2Zm
c2V0KGhlaWdodCgpLCBmaXJzdExpbmUpOworCiAgICAgZm9yIChCaWRpUnVuKiByID0gZmlyc3RS
dW47IHI7IHIgPSByLT5uZXh0KCkpIHsKICAgICAgICAgaWYgKCFyLT5tX2JveCB8fCByLT5tX29i
amVjdC0+aXNQb3NpdGlvbmVkKCkgfHwgci0+bV9ib3gtPmlzTGluZUJyZWFrKCkpCiAgICAgICAg
ICAgICBjb250aW51ZTsgLy8gUG9zaXRpb25lZCBvYmplY3RzIGFyZSBvbmx5IHBhcnRpY2lwYXRp
bmcgdG8gZmlndXJlIG91dCB0aGVpcgpAQCAtNjU2LDYgKzM2MiwxMiBAQCB2b2lkIFJlbmRlckJs
b2NrOjpjb21wdXRlSG9yaXpvbnRhbFBvc2l0CiAgICAgICAgICAgICByZW5kZXJCb3gtPmNhbGNX
aWR0aCgpOwogICAgICAgICAgICAgci0+bV9ib3gtPnNldFdpZHRoKHJlbmRlckJveC0+d2lkdGgo
KSk7CiAgICAgICAgICAgICB0b3RXaWR0aCArPSByZW5kZXJCb3gtPm1hcmdpbkxlZnQoKSArIHJl
bmRlckJveC0+bWFyZ2luUmlnaHQoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHIt
Pm1fb2JqZWN0LT5pc0Fub255bW91c0lubGluZUJsb2NrKCkpIHsKKyAgICAgICAgICAgICAgICAv
LyBBbGxvdyB0aGUgZnVsbCBhdmFpbGFibGUgd2lkdGggdG8gYmUgdXNlZCwgc2luY2UgZmxvYXRz
IHdpbGwgaW50cnVkZSBpbnRvIG91ciBzcGFjZS4KKyAgICAgICAgICAgICAgICBhdmFpbGFibGVX
aWR0aCA9IHJpZ2h0T2Zmc2V0KCkgLSBsZWZ0T2Zmc2V0KCk7CisgICAgICAgICAgICAgICAgeCA9
IGxlZnRPZmZzZXQoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHRvdFdp
ZHRoICs9IHItPm1fYm94LT53aWR0aCgpOwpAQCAtNjY1LDcgKzM3Nyw2IEBAIHZvaWQgUmVuZGVy
QmxvY2s6OmNvbXB1dGVIb3Jpem9udGFsUG9zaXQKICAgICAvLyB3ZSBub3cgZXhhbWluZSBvdXIg
dGV4dC1hbGlnbiBwcm9wZXJ0eSBpbiBvcmRlciB0byBkZXRlcm1pbmUgd2hlcmUgdG8gcG9zaXRp
b24gdGhlCiAgICAgLy8gb2JqZWN0cyBob3Jpem9udGFsbHkuICBUaGUgdG90YWwgd2lkdGggb2Yg
dGhlIGxpbmUgY2FuIGJlIGluY3JlYXNlZCBpZiB3ZSBlbmQgdXAKICAgICAvLyBqdXN0aWZ5aW5n
IHRleHQuCi0gICAgaW50IHggPSBsZWZ0T2Zmc2V0KGhlaWdodCgpLCBmaXJzdExpbmUpOwogICAg
IHN3aXRjaCAodGV4dEFsaWduKSB7CiAgICAgICAgIGNhc2UgTEVGVDoKICAgICAgICAgY2FzZSBX
RUJLSVRfTEVGVDoKQEAgLTgxOSw5ICs1MzAsMTUgQEAgdm9pZCBSZW5kZXJCbG9jazo6bGF5b3V0
SW5saW5lQ2hpbGRyZW4oYgogICAgIGJvb2wgdXNlUmVwYWludEJvdW5kcyA9IGZhbHNlOwogICAg
IAogICAgIG1fb3ZlcmZsb3cuY2xlYXIoKTsKLSAgICAgICAgCi0gICAgc2V0SGVpZ2h0KGJvcmRl
clRvcCgpICsgcGFkZGluZ1RvcCgpKTsKLSAgICBpbnQgdG9BZGQgPSBib3JkZXJCb3R0b20oKSAr
IHBhZGRpbmdCb3R0b20oKSArIGhvcml6b250YWxTY3JvbGxiYXJIZWlnaHQoKTsKKyAgICAKKyAg
ICBpbnQgdG9wID0gYm9yZGVyVG9wKCkgKyBwYWRkaW5nVG9wKCk7CisgICAgaW50IGJvdHRvbSA9
IGJvcmRlckJvdHRvbSgpICsgcGFkZGluZ0JvdHRvbSgpICsgaG9yaXpvbnRhbFNjcm9sbGJhckhl
aWdodCgpOworCisgICAgc2V0SGVpZ2h0KHRvcCk7CisKKyAgICAvLyBUaGUgbWFyZ2luIHN0cnVj
dCBjYWNoZXMgYWxsIG91ciBjdXJyZW50IG1hcmdpbiBjb2xsYXBzaW5nIHN0YXRlLiBXZSBydW4g
bWFyZ2luIGNvbGxhcHNpbmcgd2hlbiB3ZSBlbmNvdW50ZXIgYW5vbnltb3VzIGlubGluZSBibG9j
a3MgdGhhdCBhcmUgYmVpbmcgdXNlZAorICAgIC8vIGZvciB0aGUgYmxvY2tzLWluc2lkZS1pbmxp
bmVzIGNhc2UgKGFuZCB0aGUgaW5saW5lcyBhcmUgZW1wdHkpLCBlLmcsIDxzcGFuPjxkaXY+T25l
PC9kaXY+PC9zcGFuPi4KKyAgICBNYXJnaW5JbmZvIG1hcmdpbkluZm8odGhpcywgdG9wLCBib3R0
b20pOwogCiAgICAgLy8gRmlndXJlIG91dCBpZiB3ZSBzaG91bGQgY2xlYXIgb3V0IG91ciBsaW5l
IGJveGVzLgogICAgIC8vIEZJWE1FOiBIYW5kbGUgcmVzaXplIGV2ZW50dWFsbHkhCkBAIC04NTAs
MTIgKzU2NywxNSBAQCB2b2lkIFJlbmRlckJsb2NrOjpsYXlvdXRJbmxpbmVDaGlsZHJlbihiCiAg
ICAgICAgICAgICBpZiAoby0+aXNSZXBsYWNlZCgpIHx8IG8tPmlzRmxvYXRpbmcoKSB8fCBvLT5p
c1Bvc2l0aW9uZWQoKSkgewogICAgICAgICAgICAgICAgIFJlbmRlckJveCogYm94ID0gdG9SZW5k
ZXJCb3gobyk7CiAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlbGF5b3V0
Q2hpbGRyZW4gfHwgby0+c3R5bGUoKS0+d2lkdGgoKS5pc1BlcmNlbnQoKSB8fCBvLT5zdHlsZSgp
LT5oZWlnaHQoKS5pc1BlcmNlbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgby0+c2V0Q2hpbGRO
ZWVkc0xheW91dCh0cnVlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIAorICAgICAgICAg
ICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBsYXlvdXQgY2hpbGRyZW4gaWYgdGhleSBuZWVkIGl0Lgor
ICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBUZWNobmljYWxseSBwZXJjZW50YWdlIGhlaWdodCBv
YmplY3RzIG9ubHkgbmVlZCBhIHJlbGF5b3V0IGlmIHRoZWlyIHBlcmNlbnRhZ2UgaXNuJ3QgZ29p
bmcgdG8gYmUgdHVybmVkIGludG8KKyAgICAgICAgICAgICAgICAvLyBhbiBhdXRvIHZhbHVlLiAg
QWRkIGEgbWV0aG9kIHRvIGRldGVybWluZSB0aGlzLCBzbyB0aGF0IHdlIGNhbiBhdm9pZCB0aGUg
cmVsYXlvdXQuCisgICAgICAgICAgICAgICAgaWYgKHJlbGF5b3V0Q2hpbGRyZW4gfHwgKChib3gt
PnN0eWxlKCktPmhlaWdodCgpLmlzUGVyY2VudCgpIHx8IGJveC0+c3R5bGUoKS0+bWluSGVpZ2h0
KCkuaXNQZXJjZW50KCkgfHwgYm94LT5zdHlsZSgpLT5tYXhIZWlnaHQoKS5pc1BlcmNlbnQoKSkp
KQorICAgICAgICAgICAgICAgICAgICBib3gtPnNldENoaWxkTmVlZHNMYXlvdXQodHJ1ZSwgZmFs
c2UpOworCiAgICAgICAgICAgICAgICAgLy8gSWYgcmVsYXlvdXRDaGlsZHJlbiBpcyBzZXQgYW5k
IHdlIGhhdmUgcGVyY2VudGFnZSBwYWRkaW5nLCB3ZSBhbHNvIG5lZWQgdG8gaW52YWxpZGF0ZSB0
aGUgY2hpbGQncyBwcmVmIHdpZHRocy4KLSAgICAgICAgICAgICAgICBpZiAocmVsYXlvdXRDaGls
ZHJlbiAmJiAoby0+c3R5bGUoKS0+cGFkZGluZ0xlZnQoKS5pc1BlcmNlbnQoKSB8fCBvLT5zdHls
ZSgpLT5wYWRkaW5nUmlnaHQoKS5pc1BlcmNlbnQoKSkpCi0gICAgICAgICAgICAgICAgICAgIG8t
PnNldFByZWZXaWR0aHNEaXJ0eSh0cnVlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgaWYgKHJl
bGF5b3V0Q2hpbGRyZW4gJiYgKGJveC0+c3R5bGUoKS0+cGFkZGluZ0xlZnQoKS5pc1BlcmNlbnQo
KSB8fCBib3gtPnN0eWxlKCktPnBhZGRpbmdSaWdodCgpLmlzUGVyY2VudCgpKSkKKyAgICAgICAg
ICAgICAgICAgICAgYm94LT5zZXRQcmVmV2lkdGhzRGlydHkodHJ1ZSwgZmFsc2UpOwogICAgICAg
ICAgICAgCiAgICAgICAgICAgICAgICAgaWYgKG8tPmlzUG9zaXRpb25lZCgpKQogICAgICAgICAg
ICAgICAgICAgICBvLT5jb250YWluaW5nQmxvY2soKS0+aW5zZXJ0UG9zaXRpb25lZE9iamVjdChi
b3gpOwpAQCAtODY1LDcgKzU4NSw4IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmxheW91dElubGluZUNo
aWxkcmVuKGIKICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZnVsbExheW91dCB8fCBvLT5u
ZWVkc0xheW91dCgpKSAvLyBSZXBsYWNlZCBlbGVtZW50cwogICAgICAgICAgICAgICAgICAgICAg
ICAgdG9SZW5kZXJCb3gobyktPmRpcnR5TGluZUJveGVzKGZ1bGxMYXlvdXQpOwogCi0gICAgICAg
ICAgICAgICAgICAgIG8tPmxheW91dElmTmVlZGVkKCk7CisgICAgICAgICAgICAgICAgICAgIGlm
ICghby0+aXNSZXBsYWNlZCgpIHx8ICFvLT5pc0Fub255bW91c0lubGluZUJsb2NrKCkpCisgICAg
ICAgICAgICAgICAgICAgICAgICBvLT5sYXlvdXRJZk5lZWRlZCgpOwogICAgICAgICAgICAgICAg
IH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAoby0+aXNUZXh0KCkgfHwgKG8tPmlzUmVuZGVySW5s
aW5lKCkgJiYgIWVuZE9mSW5saW5lKSkgewogICAgICAgICAgICAgICAgIGhhc0lubGluZUNoaWxk
ID0gdHJ1ZTsKQEAgLTk2MCw3ICs2ODEsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjpsYXlvdXRJbmxp
bmVDaGlsZHJlbihiCiAgICAgICAgICAgICBpc0xpbmVFbXB0eSA9IHRydWU7CiAgICAgICAgICAg
ICAKICAgICAgICAgICAgIEVDbGVhciBjbGVhciA9IENOT05FOwotICAgICAgICAgICAgZW5kID0g
ZmluZE5leHRMaW5lQnJlYWsocmVzb2x2ZXIsIGZpcnN0TGluZSwgaXNMaW5lRW1wdHksIHByZXZp
b3VzTGluZUJyb2tlQ2xlYW5seSwgJmNsZWFyKTsKKyAgICAgICAgICAgIGVuZCA9IGZpbmROZXh0
TGluZUJyZWFrKHJlc29sdmVyLCBmaXJzdExpbmUsIGlzTGluZUVtcHR5LCBwcmV2aW91c0xpbmVC
cm9rZUNsZWFubHksIG1hcmdpbkluZm8sICZjbGVhcik7CiAgICAgICAgICAgICBpZiAocmVzb2x2
ZXIucG9zaXRpb24oKS5hdEVuZCgpKSB7CiAgICAgICAgICAgICAgICAgcmVzb2x2ZXIuZGVsZXRl
UnVucygpOwogICAgICAgICAgICAgICAgIGNoZWNrRm9yRmxvYXRzRnJvbUxhc3RMaW5lID0gdHJ1
ZTsKQEAgLTEwMzAsNiArNzUxLDE0IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmxheW91dElubGluZUNo
aWxkcmVuKGIKICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVCb3gpIHsKICAgICAgICAgICAg
ICAgICAgICAgICAgIGxpbmVCb3gtPnNldEVuZHNXaXRoQnJlYWsocHJldmlvdXNMaW5lQnJva2VD
bGVhbmx5KTsKIAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgb3VyIHByZXZpb3VzIGxp
bmUgd2FzIGFuIGFub255bW91cyBibG9jayBhbmQgd2UgYXJlIG5vdCBhbiBhbm9ueW1vdXMgYmxv
Y2ssIHNpbXVsYXRlIGEgbWFyZ2luIGNvbGxhcHNlIG5vdyBzbyB0aGF0IHdlIGdldCB0aGUgcHJv
cGVyCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNyZWFzZWQgaGVpZ2h0LiAgV2UgYWxz
byBoYXZlIHRvIHNpbXVsYXRlIGEgbWFyZ2luIGNvbGxhcHNlIHRvIHByb3BhZ2F0ZSBtYXJnaW5z
IHRocm91Z2ggdG8gdGhlIHRvcCBvZiBvdXIgYmxvY2suCisgICAgICAgICAgICAgICAgICAgICAg
ICBpZiAoIWxpbmVCb3gtPmFub255bW91c0lubGluZUJsb2NrKCkpIHsKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBpZiAoIWxpbmVCb3gtPnByZXZSb290Qm94KCkgfHwgbGluZUJveC0+cHJl
dlJvb3RCb3goKS0+YW5vbnltb3VzSW5saW5lQmxvY2soKSkKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgY29sbGFwc2VNYXJnaW5zKDAsIG1hcmdpbkluZm8pOworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIG1hcmdpbkluZm8uc2V0QXRUb3BPZkJsb2NrKGZhbHNlKTsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm93IHdl
IHBvc2l0aW9uIGFsbCBvZiBvdXIgdGV4dCBydW5zIGhvcml6b250YWxseS4KICAgICAgICAgICAg
ICAgICAgICAgICAgIGNvbXB1dGVIb3Jpem9udGFsUG9zaXRpb25zRm9yTGluZShsaW5lQm94LCBm
aXJzdExpbmUsIHJlc29sdmVyLmZpcnN0UnVuKCksIHRyYWlsaW5nU3BhY2VSdW4sIGVuZC5hdEVu
ZCgpKTsKIApAQCAtMTE2MSw4ICs4OTAsMTQgQEAgdm9pZCBSZW5kZXJCbG9jazo6bGF5b3V0SW5s
aW5lQ2hpbGRyZW4oYgogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gTm93IGFkZCBpbiB0aGUg
Ym90dG9tIGJvcmRlci9wYWRkaW5nLgotICAgIHNldEhlaWdodChoZWlnaHQoKSArIHRvQWRkKTsK
KyAgICAvLyBOb3cgZG8gdGhlIGhhbmRsaW5nIG9mIHRoZSBib3R0b20gb2YgdGhlIGJsb2NrLCBh
ZGRpbmcgaW4gb3VyIGJvdHRvbSBib3JkZXIvcGFkZGluZyBhbmQKKyAgICAvLyBkZXRlcm1pbmlu
ZyB0aGUgY29ycmVjdCBjb2xsYXBzZWQgYm90dG9tIG1hcmdpbiBpbmZvcm1hdGlvbi4gIFRoaXMg
Y29sbGFwc2UgaXMgb25seSBuZWNlc3NhcnkKKyAgICAvLyBpZiBvdXIgbGFzdCBjaGlsZCB3YXMg
YW4gYW5vbnltb3VzIGlubGluZSBibG9jayB0aGF0IG1pZ2h0IG5lZWQgdG8gcHJvcGFnYXRlIG1h
cmdpbiBpbmZvcm1hdGlvbiBvdXQgdG8KKyAgICAvLyB1cy4KKyAgICBpZiAobGFzdFJvb3RCb3go
KSAmJiBsYXN0Um9vdEJveCgpLT5hbm9ueW1vdXNJbmxpbmVCbG9jaygpKQorICAgICAgICBoYW5k
bGVCb3R0b21PZkJsb2NrKHRvcCwgYm90dG9tLCBtYXJnaW5JbmZvKTsKKyAgICBlbHNlCisgICAg
ICAgIHNldEhlaWdodChoZWlnaHQoKSArIGJvdHRvbSk7CiAKICAgICBpZiAoIWZpcnN0TGluZUJv
eCgpICYmIGhhc0xpbmVJZkVtcHR5KCkpCiAgICAgICAgIHNldEhlaWdodChoZWlnaHQoKSArIGxp
bmVIZWlnaHQodHJ1ZSwgdHJ1ZSkpOwpAQCAtMTE4Myw2ICs5MTgsMTIgQEAgUm9vdElubGluZUJv
eCogUmVuZGVyQmxvY2s6OmRldGVybWluZVN0YQogICAgIGlmICghZnVsbExheW91dCkgewogICAg
ICAgICBzaXplX3QgZmxvYXRJbmRleCA9IDA7CiAgICAgICAgIGZvciAoY3VyciA9IGZpcnN0Um9v
dEJveCgpOyBjdXJyICYmICFjdXJyLT5pc0RpcnR5KCk7IGN1cnIgPSBjdXJyLT5uZXh0Um9vdEJv
eCgpKSB7CisgICAgICAgICAgICBpZiAoY3Vyci0+YW5vbnltb3VzSW5saW5lQmxvY2soKSkgewor
ICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBXZSBoYXZlIHRvIGRvIGJldHRlciB0aGFuIHRoaXMg
b3Igd2Ugd2lsbCByZXBhaW50IHRvbyBtdWNoIGFzIGNvbnRlbnQgaW5zaWRlIGFuCisgICAgICAg
ICAgICAgICAgLy8gYW5vbnltb3VzIGlubGluZSBibG9jayBjb21lcyBpbi4KKyAgICAgICAgICAg
ICAgICBmdWxsTGF5b3V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
ICAgIH0KICAgICAgICAgICAgIGlmIChWZWN0b3I8UmVuZGVyQm94Kj4qIGNsZWFuTGluZUZsb2F0
cyA9IGN1cnItPmZsb2F0c1B0cigpKSB7CiAgICAgICAgICAgICAgICAgVmVjdG9yPFJlbmRlckJv
eCo+OjppdGVyYXRvciBlbmQgPSBjbGVhbkxpbmVGbG9hdHMtPmVuZCgpOwogICAgICAgICAgICAg
ICAgIGZvciAoVmVjdG9yPFJlbmRlckJveCo+OjppdGVyYXRvciBvID0gY2xlYW5MaW5lRmxvYXRz
LT5iZWdpbigpOyBvICE9IGVuZDsgKytvKSB7CkBAIC0xNDQ0LDcgKzExODUsNyBAQCBzdGF0aWMg
Ym9vbCBpbmxpbmVGbG93UmVxdWlyZXNMaW5lQm94KFJlCiAgICAgcmV0dXJuICFmbG93LT5maXJz
dENoaWxkKCkgJiYgZmxvdy0+aGFzSG9yaXpvbnRhbEJvcmRlcnNQYWRkaW5nT3JNYXJnaW4oKTsK
IH0KIAotc3RhdGljIGlubGluZSBib29sIHJlcXVpcmVzTGluZUJveChjb25zdCBJbmxpbmVJdGVy
YXRvciYgaXQsIGJvb2wgaXNMaW5lRW1wdHksIGJvb2wgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5
KQorYm9vbCBSZW5kZXJCbG9jazo6cmVxdWlyZXNMaW5lQm94KGNvbnN0IElubGluZUl0ZXJhdG9y
JiBpdCwgYm9vbCBpc0xpbmVFbXB0eSwgYm9vbCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHkpCiB7
CiAgICAgaWYgKGl0Lm9iai0+aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpKQogICAgICAgICByZXR1
cm4gZmFsc2U7CkBAIC0xNTk3LDcgKzEzMzgsNyBAQCBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHRl
eHRXaWR0aChSZW5kZXJUCiB9CiAKIElubGluZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpmaW5kTmV4
dExpbmVCcmVhayhJbmxpbmVCaWRpUmVzb2x2ZXImIHJlc29sdmVyLCBib29sIGZpcnN0TGluZSwg
IGJvb2wmIGlzTGluZUVtcHR5LCBib29sJiBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHksIAotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVDbGVhciogY2xlYXIp
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFyZ2luSW5m
byYgbWFyZ2luSW5mbywgRUNsZWFyKiBjbGVhcikKIHsKICAgICBBU1NFUlQocmVzb2x2ZXIucG9z
aXRpb24oKS5ibG9jayA9PSB0aGlzKTsKIApAQCAtMTYzOCw2ICsxMzc5LDExIEBAIElubGluZUl0
ZXJhdG9yIFJlbmRlckJsb2NrOjpmaW5kTmV4dExpbmUKICAgICBib29sIGF1dG9XcmFwV2FzRXZl
clRydWVPbkxpbmUgPSBmYWxzZTsKICAgICBib29sIGZsb2F0c0ZpdE9uTGluZSA9IHRydWU7CiAg
ICAgCisgICAgYm9vbCBpc0Jsb2NrSW5zaWRlSW5saW5lID0gZmFsc2U7CisgICAgCisgICAgaW50
IHByZXZpb3VzQmxvY2tGbG9hdEJvdHRvbSA9IDA7CisgICAgaW50IG1heEJsb2NrRmxvYXRCb3R0
b20gPSAwOworCiAgICAgLy8gRmlyZWZveCBhbmQgT3BlcmEgd2lsbCBhbGxvdyBhIHRhYmxlIGNl
bGwgdG8gZ3JvdyB0byBmaXQgYW4gaW1hZ2UgaW5zaWRlIGl0IHVuZGVyCiAgICAgLy8gdmVyeSBz
cGVjaWZpYyBjaXJjdW1zdGFuY2VzIChpbiBvcmRlciB0byBtYXRjaCBjb21tb24gV2luSUUgcmVu
ZGVyaW5ncykuIAogICAgIC8vIE5vdCBzdXBwb3J0aW5nIHRoZSBxdWlyayBoYXMgY2F1c2VkIHVz
IHRvIG1pcy1yZW5kZXIgc29tZSByZWFsIHNpdGVzLiAoU2VlIEJ1Z3ppbGxhIDEwNTE3LikgCkBA
IC0xNjQ4LDcgKzEzOTQsOCBAQCBJbmxpbmVJdGVyYXRvciBSZW5kZXJCbG9jazo6ZmluZE5leHRM
aW5lCiAgICAgd2hpbGUgKG8pIHsKICAgICAgICAgY3VycldTID0gby0+aXNSZXBsYWNlZCgpID8g
by0+cGFyZW50KCktPnN0eWxlKCktPndoaXRlU3BhY2UoKSA6IG8tPnN0eWxlKCktPndoaXRlU3Bh
Y2UoKTsKICAgICAgICAgbGFzdFdTID0gbGFzdC0+aXNSZXBsYWNlZCgpID8gbGFzdC0+cGFyZW50
KCktPnN0eWxlKCktPndoaXRlU3BhY2UoKSA6IGxhc3QtPnN0eWxlKCktPndoaXRlU3BhY2UoKTsK
LSAgICAgICAgCisgICAgICAgIGlzQmxvY2tJbnNpZGVJbmxpbmUgPSBvLT5pc0Fub255bW91c0lu
bGluZUJsb2NrKCk7CisKICAgICAgICAgYm9vbCBhdXRvV3JhcCA9IFJlbmRlclN0eWxlOjphdXRv
V3JhcChjdXJyV1MpOwogICAgICAgICBhdXRvV3JhcFdhc0V2ZXJUcnVlT25MaW5lID0gYXV0b1dy
YXBXYXNFdmVyVHJ1ZU9uTGluZSB8fCBhdXRvV3JhcDsKIApAQCAtMTY1OSw3ICsxNDA2LDcgQEAg
SW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6OmZpbmROZXh0TGluZQogI2VuZGlmCiAKICAgICAg
ICAgYm9vbCBjb2xsYXBzZVdoaXRlU3BhY2UgPSBSZW5kZXJTdHlsZTo6Y29sbGFwc2VXaGl0ZVNw
YWNlKGN1cnJXUyk7Ci0gICAgICAgICAgICAKKwogICAgICAgICBpZiAoby0+aXNCUigpKSB7CiAg
ICAgICAgICAgICBpZiAodyArIHRtcFcgPD0gd2lkdGgpIHsKICAgICAgICAgICAgICAgICBsQnJl
YWsub2JqID0gbzsKQEAgLTE3NjYsOCArMTUxMyw5IEBAIElubGluZUl0ZXJhdG9yIFJlbmRlckJs
b2NrOjpmaW5kTmV4dExpbmUKICAgICAgICAgfSBlbHNlIGlmIChvLT5pc1JlcGxhY2VkKCkpIHsK
ICAgICAgICAgICAgIFJlbmRlckJveCogcmVwbGFjZWRCb3ggPSB0b1JlbmRlckJveChvKTsKIAot
ICAgICAgICAgICAgLy8gQnJlYWsgb24gcmVwbGFjZWQgZWxlbWVudHMgaWYgZWl0aGVyIGhhcyBu
b3JtYWwgd2hpdGUtc3BhY2UuCi0gICAgICAgICAgICBpZiAoKGF1dG9XcmFwIHx8IFJlbmRlclN0
eWxlOjphdXRvV3JhcChsYXN0V1MpKSAmJiAoIW8tPmlzSW1hZ2UoKSB8fCBhbGxvd0ltYWdlc1Rv
QnJlYWspKSB7CisgICAgICAgICAgICAvLyBCcmVhayBvbiByZXBsYWNlZCBlbGVtZW50cyBpZiBl
aXRoZXIgaGFzIG5vcm1hbCB3aGl0ZS1zcGFjZS4gIFdlIGFsc28gYWx3YXlzIGJyZWFrIGlmIHdl
CisgICAgICAgICAgICAvLyBlbmNvdW50ZXIgYSBzcGVjaWFsIGFub255bW91cyBpbmxpbmUgYmxv
Y2sgKHVzZWQgdG8gaG9sZCBibG9ja3MgaW5zaWRlIGlubGluZXMpLgorICAgICAgICAgICAgaWYg
KChhdXRvV3JhcCB8fCBSZW5kZXJTdHlsZTo6YXV0b1dyYXAobGFzdFdTKSB8fCBpc0Jsb2NrSW5z
aWRlSW5saW5lKSAgJiYgKCFvLT5pc0ltYWdlKCkgfHwgYWxsb3dJbWFnZXNUb0JyZWFrKSkgewog
ICAgICAgICAgICAgICAgIHcgKz0gdG1wVzsKICAgICAgICAgICAgICAgICB0bXBXID0gMDsKICAg
ICAgICAgICAgICAgICBsQnJlYWsub2JqID0gbzsKQEAgLTE3NzUsNiArMTUyMywxOSBAQCBJbmxp
bmVJdGVyYXRvciBSZW5kZXJCbG9jazo6ZmluZE5leHRMaW5lCiAgICAgICAgICAgICAgICAgbEJy
ZWFrLm5leHRCcmVha2FibGVQb3NpdGlvbiA9IC0xOwogICAgICAgICAgICAgfQogCisgICAgICAg
ICAgICBpZiAoaXNCbG9ja0luc2lkZUlubGluZSkgeworICAgICAgICAgICAgICAgIGlmICghaXNM
aW5lRW1wdHkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOworCisgICAgICAgICAgICAg
ICAgLy8gUmVzZXQgdGhlIHdpZHRoIHRvIGlnbm9yZSBmbG9hdHMsIHNpbmNlIHdlJ3JlIGdvaW5n
IHRvIGFsbG93IHRoZW0gdG8gaW50cnVkZSBpbnRvIG91ciBzcGFjZS4KKyAgICAgICAgICAgICAg
ICB3aWR0aCA9IHJpZ2h0T2Zmc2V0KCkgLSBsZWZ0T2Zmc2V0KCk7CisKKyAgICAgICAgICAgICAg
ICAvLyBGSVhNRTogVGhpcyBjYWxsIHdpbGwgdXBkYXRlIHRoZSBoZWlnaHQgb2Ygb3VyIGJsb2Nr
LiAgSXQncyBub3QgY2xlYXIgaWYgdGhhdCdzIGdvaW5nIHRvIGJlIG9rIG9yIG5vdCB5ZXQuCisg
ICAgICAgICAgICAgICAgbGF5b3V0QmxvY2tDaGlsZChyZXBsYWNlZEJveCwgbWFyZ2luSW5mbywg
cHJldmlvdXNCbG9ja0Zsb2F0Qm90dG9tLCBtYXhCbG9ja0Zsb2F0Qm90dG9tKTsKKworICAgICAg
ICAgICAgICAgIGxpbmVNaWRwb2ludFN0YXRlLmJldHdlZW5NaWRwb2ludHMgPSBmYWxzZTsKKyAg
ICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKGlnbm9yaW5nU3BhY2VzKQogICAgICAgICAg
ICAgICAgIGFkZE1pZHBvaW50KGxpbmVNaWRwb2ludFN0YXRlLCBJbmxpbmVJdGVyYXRvcigwLCBv
LCAwKSk7CiAKQEAgLTE3OTgsNiArMTU1OSwxNSBAQCBJbmxpbmVJdGVyYXRvciBSZW5kZXJCbG9j
azo6ZmluZE5leHRMaW5lCiAgICAgICAgICAgICAgICAgICAgIHRtcFcgKz0gcmVwbGFjZWRCb3gt
PndpZHRoKCkgKyByZXBsYWNlZEJveC0+bWFyZ2luTGVmdCgpICsgcmVwbGFjZWRCb3gtPm1hcmdp
blJpZ2h0KCkgKyBpbmxpbmVXaWR0aChvKTsKICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAg
ICAgICAgIHRtcFcgKz0gcmVwbGFjZWRCb3gtPndpZHRoKCkgKyByZXBsYWNlZEJveC0+bWFyZ2lu
TGVmdCgpICsgcmVwbGFjZWRCb3gtPm1hcmdpblJpZ2h0KCkgKyBpbmxpbmVXaWR0aChvKTsKKyAg
ICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChpc0Jsb2NrSW5zaWRlSW5saW5lKSB7Cisg
ICAgICAgICAgICAgICAgdyArPSB0bXBXOworICAgICAgICAgICAgICAgIHRtcFcgPSAwOworICAg
ICAgICAgICAgICAgIGxCcmVhay5vYmogPSBvOworICAgICAgICAgICAgICAgIGxCcmVhay5wb3Mg
PSAwOworICAgICAgICAgICAgICAgIGxCcmVhay5uZXh0QnJlYWthYmxlUG9zaXRpb24gPSAtMTsK
KyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNl
IGlmIChvLT5pc1RleHQoKSkgewogICAgICAgICAgICAgaWYgKCFwb3MpCiAgICAgICAgICAgICAg
ICAgYXBwbGllZFN0YXJ0V2lkdGggPSBmYWxzZTsKQEAgLTIxODQsNyArMTk1NCw3IEBAIElubGlu
ZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpmaW5kTmV4dExpbmUKICAgICAgICAgfQogICAgICAgICAv
L2Vsc2UgaWYgKGxCcmVhay5wb3MgPiAwKQogICAgICAgICAvLyAgICBsQnJlYWsucG9zLS07Ci0g
ICAgICAgIGVsc2UgaWYgKGxCcmVhay5vYmogPT0gMCAmJiB0cmFpbGluZ1NwYWNlT2JqZWN0LT5p
c1RleHQoKSkgeworICAgICAgICBlbHNlIGlmICgoIWxCcmVhay5vYmogfHwgbEJyZWFrLm9iai0+
aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKSAmJiB0cmFpbGluZ1NwYWNlT2JqZWN0LT5pc1RleHQo
KSkgewogICAgICAgICAgICAgLy8gQWRkIGEgbmV3IGVuZCBtaWRwb2ludCB0aGF0IHN0b3BzIHJp
Z2h0IGF0IHRoZSB2ZXJ5IGVuZC4KICAgICAgICAgICAgIFJlbmRlclRleHQqIHRleHQgPSB0b1Jl
bmRlclRleHQodHJhaWxpbmdTcGFjZU9iamVjdCk7CiAgICAgICAgICAgICB1bnNpZ25lZCBsZW5n
dGggPSB0ZXh0LT50ZXh0TGVuZ3RoKCk7CkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJC
b3guY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJveC5jcHAJKHJl
dmlzaW9uIDU0NTYxKQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQm94LmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMTMzNCw3ICsxMzM0LDcgQEAgdm9pZCBSZW5kZXJCb3g6OmNhbGNXaWR0aCgp
CiAgICAgfQogCiAgICAgaWYgKGNvbnRhaW5lcldpZHRoICYmIGNvbnRhaW5lcldpZHRoICE9ICh3
aWR0aCgpICsgbV9tYXJnaW5MZWZ0ICsgbV9tYXJnaW5SaWdodCkKLSAgICAgICAgICAgICYmICFp
c0Zsb2F0aW5nKCkgJiYgIWlzSW5saW5lKCkgJiYgIWNiLT5pc0ZsZXhpYmxlQm94KCkpIHsKKyAg
ICAgICAgICAgICYmICFpc0Zsb2F0aW5nKCkgJiYgKCFpc0lubGluZSgpIHx8IGlzQW5vbnltb3Vz
SW5saW5lQmxvY2soKSkgJiYgIWNiLT5pc0ZsZXhpYmxlQm94KCkpIHsKICAgICAgICAgaWYgKGNi
LT5zdHlsZSgpLT5kaXJlY3Rpb24oKSA9PSBMVFIpCiAgICAgICAgICAgICBtX21hcmdpblJpZ2h0
ID0gY29udGFpbmVyV2lkdGggLSB3aWR0aCgpIC0gbV9tYXJnaW5MZWZ0OwogICAgICAgICBlbHNl
CkBAIC0xMzczLDcgKzEzNzMsNyBAQCBib29sIFJlbmRlckJveDo6c2l6ZXNUb0ludHJpbnNpY1dp
ZHRoKFdpCiB7CiAgICAgLy8gTWFycXVlZXMgaW4gV2luSUUgYXJlIGxpa2UgYSBtaXh0dXJlIG9m
IGJsb2NrcyBhbmQgaW5saW5lLWJsb2Nrcy4gIFRoZXkgc2l6ZSBhcyB0aG91Z2ggdGhleSdyZSBi
bG9ja3MsCiAgICAgLy8gYnV0IHRoZXkgYWxsb3cgdGV4dCB0byBzaXQgb24gdGhlIHNhbWUgbGlu
ZSBhcyB0aGUgbWFycXVlZS4KLSAgICBpZiAoaXNGbG9hdGluZygpIHx8IChpc0lubGluZUJsb2Nr
T3JJbmxpbmVUYWJsZSgpICYmICFpc0hUTUxNYXJxdWVlKCkpKQorICAgIGlmIChpc0Zsb2F0aW5n
KCkgfHwgKGlzSW5saW5lQmxvY2tPcklubGluZVRhYmxlKCkgJiYgIWlzSFRNTE1hcnF1ZWUoKSAm
JiAhaXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKSkKICAgICAgICAgcmV0dXJuIHRydWU7CiAKICAg
ICAvLyBUaGlzIGNvZGUgbWF5IGxvb2sgYSBiaXQgc3RyYW5nZS4gIEJhc2ljYWxseSB3aWR0aDpp
bnRyaW5zaWMgc2hvdWxkIGNsYW1wIHRoZSBzaXplIHdoZW4gdGVzdGluZyBib3RoCkBAIC0yODE5
LDcgKzI4MTksNyBAQCBib29sIFJlbmRlckJveDo6c2hyaW5rVG9Bdm9pZEZsb2F0cygpIGNvCiAK
IGJvb2wgUmVuZGVyQm94Ojphdm9pZHNGbG9hdHMoKSBjb25zdAogewotICAgIHJldHVybiBpc1Jl
cGxhY2VkKCkgfHwgaGFzT3ZlcmZsb3dDbGlwKCkgfHwgaXNIUigpOworICAgIHJldHVybiAhaXNB
bm9ueW1vdXNJbmxpbmVCbG9jaygpICYmIChpc1JlcGxhY2VkKCkgfHwgaGFzT3ZlcmZsb3dDbGlw
KCkgfHwgaXNIUigpKTsKIH0KIAogdm9pZCBSZW5kZXJCb3g6OmFkZFNoYWRvd092ZXJmbG93KCkK
SW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlcklubGluZS5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVySW5saW5lLmNwcAkocmV2aXNpb24gNTQ1NjEpCisrKyBX
ZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJJbmxpbmUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00NCw3
ICs0NCw2IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogUmVuZGVySW5saW5lOjpSZW5kZXJJbmxp
bmUoTm9kZSogbm9kZSkKICAgICA6IFJlbmRlckJveE1vZGVsT2JqZWN0KG5vZGUpCi0gICAgLCBt
X2NvbnRpbnVhdGlvbigwKQogICAgICwgbV9saW5lSGVpZ2h0KC0xKQogICAgICwgbV92ZXJ0aWNh
bFBvc2l0aW9uKFBvc2l0aW9uVW5kZWZpbmVkKQogewpAQCAtNTYsMTQgKzU1LDYgQEAgdm9pZCBS
ZW5kZXJJbmxpbmU6OmRlc3Ryb3koKQogICAgIC8vIE1ha2Ugc3VyZSB0byBkZXN0cm95IGFub255
bW91cyBjaGlsZHJlbiBmaXJzdCB3aGlsZSB0aGV5IGFyZSBzdGlsbCBjb25uZWN0ZWQgdG8gdGhl
IHJlc3Qgb2YgdGhlIHRyZWUsIHNvIHRoYXQgdGhleSB3aWxsCiAgICAgLy8gcHJvcGVybHkgZGly
dHkgbGluZSBib3hlcyB0aGF0IHRoZXkgYXJlIHJlbW92ZWQgZnJvbS4gIEVmZmVjdHMgdGhhdCBk
byA6YmVmb3JlLzphZnRlciBvbmx5IG9uIGhvdmVyIGNvdWxkIGNyYXNoIG90aGVyd2lzZS4KICAg
ICBjaGlsZHJlbigpLT5kZXN0cm95TGVmdG92ZXJDaGlsZHJlbigpOwotCi0gICAgLy8gRGVzdHJv
eSBvdXIgY29udGludWF0aW9uIGJlZm9yZSBhbnl0aGluZyBvdGhlciB0aGFuIGFub255bW91cyBj
aGlsZHJlbi4KLSAgICAvLyBUaGUgcmVhc29uIHdlIGRvbid0IGRlc3Ryb3kgaXQgYmVmb3JlIGFu
b255bW91cyBjaGlsZHJlbiBpcyB0aGF0IHRoZXkgbWF5Ci0gICAgLy8gaGF2ZSBjb250aW51YXRp
b25zIG9mIHRoZWlyIG93biB0aGF0IGFyZSBhbm9ueW1vdXMgY2hpbGRyZW4gb2Ygb3VyIGNvbnRp
bnVhdGlvbi4KLSAgICBpZiAobV9jb250aW51YXRpb24pIHsKLSAgICAgICAgbV9jb250aW51YXRp
b24tPmRlc3Ryb3koKTsKLSAgICAgICAgbV9jb250aW51YXRpb24gPSAwOwotICAgIH0KICAgICAK
ICAgICBpZiAoIWRvY3VtZW50QmVpbmdEZXN0cm95ZWQoKSkgewogICAgICAgICBpZiAoZmlyc3RM
aW5lQm94KCkpIHsKQEAgLTkyLDEzICs4Myw2IEBAIHZvaWQgUmVuZGVySW5saW5lOjpkZXN0cm95
KCkKICAgICBSZW5kZXJCb3hNb2RlbE9iamVjdDo6ZGVzdHJveSgpOwogfQogCi1SZW5kZXJJbmxp
bmUqIFJlbmRlcklubGluZTo6aW5saW5lQ29udGludWF0aW9uKCkgY29uc3QKLXsKLSAgICBpZiAo
IW1fY29udGludWF0aW9uIHx8IG1fY29udGludWF0aW9uLT5pc0lubGluZSgpKQotICAgICAgICBy
ZXR1cm4gdG9SZW5kZXJJbmxpbmUobV9jb250aW51YXRpb24pOwotICAgIHJldHVybiB0b1JlbmRl
ckJsb2NrKG1fY29udGludWF0aW9uKS0+aW5saW5lQ29udGludWF0aW9uKCk7Ci19Ci0KIHZvaWQg
UmVuZGVySW5saW5lOjp1cGRhdGVCb3hNb2RlbEluZm9Gcm9tU3R5bGUoKQogewogICAgIFJlbmRl
ckJveE1vZGVsT2JqZWN0Ojp1cGRhdGVCb3hNb2RlbEluZm9Gcm9tU3R5bGUoKTsKQEAgLTExNCwx
OSArOTgsNiBAQCB2b2lkIFJlbmRlcklubGluZTo6c3R5bGVEaWRDaGFuZ2UoU3R5bGVECiB7CiAg
ICAgUmVuZGVyQm94TW9kZWxPYmplY3Q6OnN0eWxlRGlkQ2hhbmdlKGRpZmYsIG9sZFN0eWxlKTsK
IAotICAgIC8vIEVuc3VyZSB0aGF0IGFsbCBvZiB0aGUgc3BsaXQgaW5saW5lcyBwaWNrIHVwIHRo
ZSBuZXcgc3R5bGUuIFdlCi0gICAgLy8gb25seSBkbyB0aGlzIGlmIHdlJ3JlIGFuIGlubGluZSwg
c2luY2Ugd2UgZG9uJ3Qgd2FudCB0byBwcm9wYWdhdGUKLSAgICAvLyBhIGJsb2NrJ3Mgc3R5bGUg
dG8gdGhlIG90aGVyIGlubGluZXMuCi0gICAgLy8gZS5nLiwgPGZvbnQ+Zm9vIDxoND5nb288L2g0
PiBtb288L2ZvbnQ+LiAgVGhlIDxmb250PiBpbmxpbmVzIGJlZm9yZQotICAgIC8vIGFuZCBhZnRl
ciB0aGUgYmxvY2sgc2hhcmUgdGhlIHNhbWUgc3R5bGUsIGJ1dCB0aGUgYmxvY2sgZG9lc24ndAot
ICAgIC8vIG5lZWQgdG8gcGFzcyBpdHMgc3R5bGUgb24gdG8gYW55b25lIGVsc2UuCi0gICAgZm9y
IChSZW5kZXJJbmxpbmUqIGN1cnJDb250ID0gaW5saW5lQ29udGludWF0aW9uKCk7IGN1cnJDb250
OyBjdXJyQ29udCA9IGN1cnJDb250LT5pbmxpbmVDb250aW51YXRpb24oKSkgewotICAgICAgICBS
ZW5kZXJCb3hNb2RlbE9iamVjdCogbmV4dENvbnQgPSBjdXJyQ29udC0+Y29udGludWF0aW9uKCk7
Ci0gICAgICAgIGN1cnJDb250LT5zZXRDb250aW51YXRpb24oMCk7Ci0gICAgICAgIGN1cnJDb250
LT5zZXRTdHlsZShzdHlsZSgpKTsKLSAgICAgICAgY3VyckNvbnQtPnNldENvbnRpbnVhdGlvbihu
ZXh0Q29udCk7Ci0gICAgfQotCiAgICAgbV9saW5lSGVpZ2h0ID0gLTE7CiAKICAgICAvLyBVcGRh
dGUgcHNldWRvcyBmb3IgOmJlZm9yZSBhbmQgOmFmdGVyIG5vdy4KQEAgLTEzNiw3OSArMTA3LDcz
IEBAIHZvaWQgUmVuZGVySW5saW5lOjpzdHlsZURpZENoYW5nZShTdHlsZUQKICAgICB9CiB9CiAK
LXZvaWQgUmVuZGVySW5saW5lOjphZGRDaGlsZChSZW5kZXJPYmplY3QqIG5ld0NoaWxkLCBSZW5k
ZXJPYmplY3QqIGJlZm9yZUNoaWxkKQotewotICAgIGlmIChjb250aW51YXRpb24oKSkKLSAgICAg
ICAgcmV0dXJuIGFkZENoaWxkVG9Db250aW51YXRpb24obmV3Q2hpbGQsIGJlZm9yZUNoaWxkKTsK
LSAgICByZXR1cm4gYWRkQ2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihuZXdDaGlsZCwgYmVmb3Jl
Q2hpbGQpOwotfQotCi1zdGF0aWMgUmVuZGVyQm94TW9kZWxPYmplY3QqIG5leHRDb250aW51YXRp
b24oUmVuZGVyT2JqZWN0KiByZW5kZXJlcikKK3ZvaWQgUmVuZGVySW5saW5lOjpjaGlsZEJlY2Ft
ZU5vbklubGluZShSZW5kZXJPYmplY3QqIGNoaWxkKQogewotICAgIGlmIChyZW5kZXJlci0+aXNJ
bmxpbmUoKSAmJiAhcmVuZGVyZXItPmlzUmVwbGFjZWQoKSkKLSAgICAgICAgcmV0dXJuIHRvUmVu
ZGVySW5saW5lKHJlbmRlcmVyKS0+Y29udGludWF0aW9uKCk7Ci0gICAgcmV0dXJuIHRvUmVuZGVy
QmxvY2socmVuZGVyZXIpLT5pbmxpbmVDb250aW51YXRpb24oKTsKKyAgICBSZW5kZXJPYmplY3Qq
IG5leHQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKTsKKyAgICByZW1vdmVDaGlsZChjaGlsZCk7Cisg
ICAgYWRkQ2hpbGQoY2hpbGQsIG5leHQpOwogfQogCi1SZW5kZXJCb3hNb2RlbE9iamVjdCogUmVu
ZGVySW5saW5lOjpjb250aW51YXRpb25CZWZvcmUoUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCkK
LXsKLSAgICBpZiAoYmVmb3JlQ2hpbGQgJiYgYmVmb3JlQ2hpbGQtPnBhcmVudCgpID09IHRoaXMp
Ci0gICAgICAgIHJldHVybiB0aGlzOwotCi0gICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGN1cnIg
PSBuZXh0Q29udGludWF0aW9uKHRoaXMpOwotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBuZXh0
VG9MYXN0ID0gdGhpczsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogbGFzdCA9IHRoaXM7Ci0g
ICAgd2hpbGUgKGN1cnIpIHsKLSAgICAgICAgaWYgKGJlZm9yZUNoaWxkICYmIGJlZm9yZUNoaWxk
LT5wYXJlbnQoKSA9PSBjdXJyKSB7Ci0gICAgICAgICAgICBpZiAoY3Vyci0+Zmlyc3RDaGlsZCgp
ID09IGJlZm9yZUNoaWxkKQotICAgICAgICAgICAgICAgIHJldHVybiBsYXN0OwotICAgICAgICAg
ICAgcmV0dXJuIGN1cnI7Ci0gICAgICAgIH0KLQotICAgICAgICBuZXh0VG9MYXN0ID0gbGFzdDsK
LSAgICAgICAgbGFzdCA9IGN1cnI7Ci0gICAgICAgIGN1cnIgPSBuZXh0Q29udGludWF0aW9uKGN1
cnIpOwotICAgIH0KLQotICAgIGlmICghYmVmb3JlQ2hpbGQgJiYgIWxhc3QtPmZpcnN0Q2hpbGQo
KSkKLSAgICAgICAgcmV0dXJuIG5leHRUb0xhc3Q7Ci0gICAgcmV0dXJuIGxhc3Q7Ci19Ci0KLXZv
aWQgUmVuZGVySW5saW5lOjphZGRDaGlsZElnbm9yaW5nQ29udGludWF0aW9uKFJlbmRlck9iamVj
dCogbmV3Q2hpbGQsIFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQpCit2b2lkIFJlbmRlcklubGlu
ZTo6YWRkQ2hpbGQoUmVuZGVyT2JqZWN0KiBuZXdDaGlsZCwgUmVuZGVyT2JqZWN0KiBiZWZvcmVD
aGlsZCkKIHsKICAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3QgYXBwZW5kIHRoaW5ncyBhZnRlciA6
YWZ0ZXItZ2VuZXJhdGVkIGNvbnRlbnQgaWYgd2UgaGF2ZSBpdC4KICAgICBpZiAoIWJlZm9yZUNo
aWxkICYmIGlzQWZ0ZXJDb250ZW50KGxhc3RDaGlsZCgpKSkKICAgICAgICAgYmVmb3JlQ2hpbGQg
PSBsYXN0Q2hpbGQoKTsKIAotICAgIGlmICghbmV3Q2hpbGQtPmlzSW5saW5lKCkgJiYgIW5ld0No
aWxkLT5pc0Zsb2F0aW5nT3JQb3NpdGlvbmVkKCkpIHsKLSAgICAgICAgLy8gV2UgYXJlIHBsYWNp
bmcgYSBibG9jayBpbnNpZGUgYW4gaW5saW5lLiBXZSBoYXZlIHRvIHBlcmZvcm0gYSBzcGxpdCBv
ZiB0aGlzCi0gICAgICAgIC8vIGlubGluZSBpbnRvIGNvbnRpbnVhdGlvbnMuICBUaGlzIGludm9s
dmVzIGNyZWF0aW5nIGFuIGFub255bW91cyBibG9jayBib3ggdG8gaG9sZAotICAgICAgICAvLyB8
bmV3Q2hpbGR8LiAgV2UgdGhlbiBtYWtlIHRoYXQgYmxvY2sgYm94IGEgY29udGludWF0aW9uIG9m
IHRoaXMgaW5saW5lLiAgV2UgdGFrZSBhbGwgb2YKLSAgICAgICAgLy8gdGhlIGNoaWxkcmVuIGFm
dGVyIHxiZWZvcmVDaGlsZHwgYW5kIHB1dCB0aGVtIGluIGEgY2xvbmUgb2YgdGhpcyBvYmplY3Qu
Ci0gICAgICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gbmV3U3R5bGUgPSBSZW5kZXJTdHlsZTo6Y3Jl
YXRlKCk7Ci0gICAgICAgIG5ld1N0eWxlLT5pbmhlcml0RnJvbShzdHlsZSgpKTsKLSAgICAgICAg
bmV3U3R5bGUtPnNldERpc3BsYXkoQkxPQ0spOwotCi0gICAgICAgIFJlbmRlckJsb2NrKiBuZXdC
b3ggPSBuZXcgKHJlbmRlckFyZW5hKCkpIFJlbmRlckJsb2NrKGRvY3VtZW50KCkgLyogYW5vbnlt
b3VzIGJveCAqLyk7Ci0gICAgICAgIG5ld0JveC0+c2V0U3R5bGUobmV3U3R5bGUucmVsZWFzZSgp
KTsKLSAgICAgICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIG9sZENvbnRpbnVhdGlvbiA9IGNvbnRp
bnVhdGlvbigpOwotICAgICAgICBzZXRDb250aW51YXRpb24obmV3Qm94KTsKLQotICAgICAgICAv
LyBTb21lb25lIG1heSBoYXZlIHB1dCBhIDxwPiBpbnNpZGUgYSA8cT4sIGNhdXNpbmcgYSBzcGxp
dC4gIFdoZW4gdGhpcyBoYXBwZW5zLCB0aGUgOmFmdGVyIGNvbnRlbnQKLSAgICAgICAgLy8gaGFz
IHRvIG1vdmUgaW50byB0aGUgaW5saW5lIGNvbnRpbnVhdGlvbi4gIENhbGwgdXBkYXRlQmVmb3Jl
QWZ0ZXJDb250ZW50IHRvIGVuc3VyZSB0aGF0IG91ciA6YWZ0ZXIKLSAgICAgICAgLy8gY29udGVu
dCBnZXRzIHByb3Blcmx5IGRlc3Ryb3llZC4KLSAgICAgICAgYm9vbCBpc0xhc3RDaGlsZCA9IChi
ZWZvcmVDaGlsZCA9PSBsYXN0Q2hpbGQoKSk7Ci0gICAgICAgIGlmIChkb2N1bWVudCgpLT51c2Vz
QmVmb3JlQWZ0ZXJSdWxlcygpKQotICAgICAgICAgICAgY2hpbGRyZW4oKS0+dXBkYXRlQmVmb3Jl
QWZ0ZXJDb250ZW50KHRoaXMsIEFGVEVSKTsKLSAgICAgICAgaWYgKGlzTGFzdENoaWxkICYmIGJl
Zm9yZUNoaWxkICE9IGxhc3RDaGlsZCgpKQotICAgICAgICAgICAgYmVmb3JlQ2hpbGQgPSAwOyAv
LyBXZSBkZXN0cm95ZWQgdGhlIGxhc3QgY2hpbGQsIHNvIG5vdyB3ZSBuZWVkIHRvIHVwZGF0ZSBv
dXIgaW5zZXJ0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvaW50IHRvIGJl
IDAuICBJdCdzIGp1c3QgYSBzdHJhaWdodCBhcHBlbmQgbm93LgotCi0gICAgICAgIHNwbGl0Rmxv
dyhiZWZvcmVDaGlsZCwgbmV3Qm94LCBuZXdDaGlsZCwgb2xkQ29udGludWF0aW9uKTsKKyAgICAv
LyBJZiB0aGUgcmVxdWVzdGVkIGJlZm9yZUNoaWxkIGlzIG5vdCBvbmUgb2Ygb3VyIGNoaWxkcmVu
LCB0aGVuIHRoaXMgaXMgbW9zdCBsaWtlbHkgYmVjYXVzZQorICAgIC8vIHRoZXJlIGlzIGFuIGFu
b255bW91cyBpbmxpbmUtYmxvY2sgYm94IHdpdGhpbiB0aGlzIG9iamVjdCB0aGF0IGNvbnRhaW5z
IHRoZSBiZWZvcmVDaGlsZC4gU28KKyAgICAvLyBqdXN0IGluc2VydCB0aGUgY2hpbGQgaW50byB0
aGUgYW5vbnltb3VzIGlubGluZS1ibG9jayBib3ggaW5zdGVhZCBvZiBoZXJlLgorICAgIC8vIEEg
c2Vjb25kIHBvc3NpYmlsaXR5IGlzIHRoYXQgdGhlIGJlZm9yZUNoaWxkIGlzIGFuIGFub255bW91
cyBibG9jayBpbnNpZGUgdGhlIGFub255bW91cyBpbmxpbmUgYmxvY2suCisgICAgLy8gVGhpcyBj
YW4gaGFwcGVuIGlmIGlubGluZXMgYXJlIGluc2VydGVkIGluIGJldHdlZW4gdHdvIG9mIHRoZSBh
bm9ueW1vdXMgaW5saW5lIGJsb2NrJ3MgYmxvY2stbGV2ZWwKKyAgICAvLyBjaGlsZHJlbiBhZnRl
ciBpdCBoYXMgYmVlbiBjcmVhdGVkLgorICAgIGlmIChiZWZvcmVDaGlsZCAmJiBiZWZvcmVDaGls
ZC0+cGFyZW50KCkgIT0gdGhpcykgeworICAgICAgICBBU1NFUlQoYmVmb3JlQ2hpbGQtPnBhcmVu
dCgpKTsKKyAgICAgICAgQVNTRVJUKGJlZm9yZUNoaWxkLT5wYXJlbnQoKS0+aXNBbm9ueW1vdXNJ
bmxpbmVCbG9jaygpIHx8IGJlZm9yZUNoaWxkLT5wYXJlbnQoKS0+aXNBbm9ueW1vdXNCbG9jaygp
KTsKKyAgICAgICAgaWYgKGJlZm9yZUNoaWxkLT5wYXJlbnQoKS0+aXNBbm9ueW1vdXNJbmxpbmVC
bG9jaygpKSB7CisgICAgICAgICAgICBpZiAoIW5ld0NoaWxkLT5pc0lubGluZSgpIHx8IChuZXdD
aGlsZC0+aXNJbmxpbmUoKSAmJiBiZWZvcmVDaGlsZC0+cGFyZW50KCktPmZpcnN0Q2hpbGQoKSAh
PSBiZWZvcmVDaGlsZCkpCisgICAgICAgICAgICAgICAgYmVmb3JlQ2hpbGQtPnBhcmVudCgpLT5h
ZGRDaGlsZChuZXdDaGlsZCwgYmVmb3JlQ2hpbGQpOworICAgICAgICAgICAgZWxzZQorICAgICAg
ICAgICAgICAgIGFkZENoaWxkKG5ld0NoaWxkLCBiZWZvcmVDaGlsZC0+cGFyZW50KCkpOworICAg
ICAgICB9IGVsc2UgaWYgKGJlZm9yZUNoaWxkLT5wYXJlbnQoKS0+aXNBbm9ueW1vdXNCbG9jaygp
KSB7CisgICAgICAgICAgICBBU1NFUlQoIWJlZm9yZUNoaWxkLT5wYXJlbnQoKS0+cGFyZW50KCkg
fHwgYmVmb3JlQ2hpbGQtPnBhcmVudCgpLT5wYXJlbnQoKS0+aXNBbm9ueW1vdXNJbmxpbmVCbG9j
aygpKTsKKyAgICAgICAgICAgIEFTU0VSVChiZWZvcmVDaGlsZC0+aXNJbmxpbmUoKSk7CisgICAg
ICAgICAgICBpZiAobmV3Q2hpbGQtPmlzSW5saW5lKCkgfHwgKCFuZXdDaGlsZC0+aXNJbmxpbmUo
KSAmJiBiZWZvcmVDaGlsZC0+cGFyZW50KCktPmZpcnN0Q2hpbGQoKSAhPSBiZWZvcmVDaGlsZCkp
CisgICAgICAgICAgICAgICAgYmVmb3JlQ2hpbGQtPnBhcmVudCgpLT5hZGRDaGlsZChuZXdDaGls
ZCwgYmVmb3JlQ2hpbGQpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGFkZENo
aWxkKG5ld0NoaWxkLCBiZWZvcmVDaGlsZC0+cGFyZW50KCkpOworICAgICAgICB9CiAgICAgICAg
IHJldHVybjsKICAgICB9CiAKKyAgICBpZiAoIW5ld0NoaWxkLT5pc0lubGluZSgpKSB7CisgICAg
ICAgIC8vIFdlIGFyZSBwbGFjaW5nIGEgYmxvY2sgaW5zaWRlIGFuIGlubGluZS4gV2UgaGF2ZSB0
byBwbGFjZSB0aGUgYmxvY2sgaW5zaWRlIGFuIGFub255bW91cyBpbmxpbmUtYmxvY2suCisgICAg
ICAgIC8vIFRoaXMgaW5saW5lLWJsb2NrIGNhbiBob3VzZSBhIHNlcXVlbmNlIG9mIGNvbnRpZ3Vv
dXMgYmxvY2stbGV2ZWwgY2hpbGRyZW4sIGFuZCB0aGV5IHdpbGwgYWxsIHNpdCBvbiB0aGUKKyAg
ICAgICAgLy8gc2FtZSBsaW5lIHRvZ2V0aGVyLiAgV2UgdHJ5IHRvIHJldXNlIG9uZSBmaXJzdCBp
ZiBwb3NzaWJsZS4KKyAgICAgICAgaWYgKGJlZm9yZUNoaWxkKSB7CisgICAgICAgICAgICBpZiAo
YmVmb3JlQ2hpbGQtPnByZXZpb3VzU2libGluZygpICYmIGJlZm9yZUNoaWxkLT5wcmV2aW91c1Np
YmxpbmcoKS0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CisgICAgICAgICAgICAgICAgYmVm
b3JlQ2hpbGQtPnByZXZpb3VzU2libGluZygpLT5hZGRDaGlsZChuZXdDaGlsZCk7CisgICAgICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgICAgaWYgKGxhc3RDaGlsZCgpICYmIGxhc3RDaGlsZCgpLT5pc0Fub255bW91c0lubGluZUJs
b2NrKCkpIHsKKyAgICAgICAgICAgICAgICBsYXN0Q2hpbGQoKS0+YWRkQ2hpbGQobmV3Q2hpbGQp
OworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorIAor
ICAgICAgICBpZiAoIW5ld0NoaWxkLT5pc0Zsb2F0aW5nT3JQb3NpdGlvbmVkKCkpIHsKKyAgICAg
ICAgICAgIC8vIFRoZXJlIHdhcyBubyBzdWl0YWJsZSBleGlzdGluZyBhbm9ueW1vdXMgYm94LiAg
Q3JlYXRlIGEgbmV3IG9uZS4KKyAgICAgICAgICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gbmV3U3R5
bGUgPSBSZW5kZXJTdHlsZTo6Y3JlYXRlKCk7CisgICAgICAgICAgICBuZXdTdHlsZS0+aW5oZXJp
dEZyb20oc3R5bGUoKSk7CisgICAgICAgICAgICBuZXdTdHlsZS0+c2V0RGlzcGxheShJTkxJTkVf
QkxPQ0spOworICAgICAgICAgICAgUmVuZGVyQmxvY2sqIG5ld0JveCA9IG5ldyAocmVuZGVyQXJl
bmEoKSkgUmVuZGVyQmxvY2soZG9jdW1lbnQoKSk7CisgICAgICAgICAgICBuZXdCb3gtPnNldFN0
eWxlKG5ld1N0eWxlKTsKKyAgICAgICAgICAgIFJlbmRlckJveE1vZGVsT2JqZWN0OjphZGRDaGls
ZChuZXdCb3gsIGJlZm9yZUNoaWxkKTsKKyAgICAgICAgICAgIG5ld0JveC0+YWRkQ2hpbGQobmV3
Q2hpbGQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCiAgICAgUmVu
ZGVyQm94TW9kZWxPYmplY3Q6OmFkZENoaWxkKG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7CiAKICAg
ICBuZXdDaGlsZC0+c2V0TmVlZHNMYXlvdXRBbmRQcmVmV2lkdGhzUmVjYWxjKCk7CkBAIC0yMjEs
MTg4ICsxODYsNiBAQCBSZW5kZXJJbmxpbmUqIFJlbmRlcklubGluZTo6Y2xvbmVJbmxpbmUoCiAg
ICAgcmV0dXJuIG87CiB9CiAKLXZvaWQgUmVuZGVySW5saW5lOjpzcGxpdElubGluZXMoUmVuZGVy
QmxvY2sqIGZyb21CbG9jaywgUmVuZGVyQmxvY2sqIHRvQmxvY2ssCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIFJlbmRlckJsb2NrKiBtaWRkbGVCbG9jaywKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCwgUmVuZGVyQm94TW9k
ZWxPYmplY3QqIG9sZENvbnQpCi17Ci0gICAgLy8gQ3JlYXRlIGEgY2xvbmUgb2YgdGhpcyBpbmxp
bmUuCi0gICAgUmVuZGVySW5saW5lKiBjbG9uZSA9IGNsb25lSW5saW5lKHRoaXMpOwotICAgIGNs
b25lLT5zZXRDb250aW51YXRpb24ob2xkQ29udCk7Ci0KLSAgICAvLyBOb3cgdGFrZSBhbGwgb2Yg
dGhlIGNoaWxkcmVuIGZyb20gYmVmb3JlQ2hpbGQgdG8gdGhlIGVuZCBhbmQgcmVtb3ZlCi0gICAg
Ly8gdGhlbSBmcm9tIHx0aGlzfCBhbmQgcGxhY2UgdGhlbSBpbiB0aGUgY2xvbmUuCi0gICAgUmVu
ZGVyT2JqZWN0KiBvID0gYmVmb3JlQ2hpbGQ7Ci0gICAgd2hpbGUgKG8pIHsKLSAgICAgICAgUmVu
ZGVyT2JqZWN0KiB0bXAgPSBvOwotICAgICAgICBvID0gdG1wLT5uZXh0U2libGluZygpOwotICAg
ICAgICBjbG9uZS0+YWRkQ2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihjaGlsZHJlbigpLT5yZW1v
dmVDaGlsZE5vZGUodGhpcywgdG1wKSwgMCk7Ci0gICAgICAgIHRtcC0+c2V0TmVlZHNMYXlvdXRB
bmRQcmVmV2lkdGhzUmVjYWxjKCk7Ci0gICAgfQotCi0gICAgLy8gSG9vayB8Y2xvbmV8IHVwIGFz
IHRoZSBjb250aW51YXRpb24gb2YgdGhlIG1pZGRsZSBibG9jay4KLSAgICBtaWRkbGVCbG9jay0+
c2V0SW5saW5lQ29udGludWF0aW9uKGNsb25lKTsKLQotICAgIC8vIFdlIGhhdmUgYmVlbiByZXBh
cmVudGVkIGFuZCBhcmUgbm93IHVuZGVyIHRoZSBmcm9tQmxvY2suICBXZSBuZWVkCi0gICAgLy8g
dG8gd2FsayB1cCBvdXIgaW5saW5lIHBhcmVudCBjaGFpbiB1bnRpbCB3ZSBoaXQgdGhlIGNvbnRh
aW5pbmcgYmxvY2suCi0gICAgLy8gT25jZSB3ZSBoaXQgdGhlIGNvbnRhaW5pbmcgYmxvY2sgd2Un
cmUgZG9uZS4KLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogY3VyciA9IHRvUmVuZGVyQm94TW9k
ZWxPYmplY3QocGFyZW50KCkpOwotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBjdXJyQ2hpbGQg
PSB0aGlzOwotICAgIAotICAgIC8vIEZJWE1FOiBCZWNhdXNlIHNwbGl0dGluZyBpcyBPKG5eMikg
YXMgdGFncyBuZXN0IHBhdGhvbG9naWNhbGx5LCB3ZSBjYXAgdGhlIGRlcHRoIGF0IHdoaWNoIHdl
J3JlIHdpbGxpbmcgdG8gY2xvbmUuCi0gICAgLy8gVGhlcmUgd2lsbCBldmVudHVhbGx5IGJlIGEg
YmV0dGVyIGFwcHJvYWNoIHRvIHRoaXMgcHJvYmxlbSB0aGF0IHdpbGwgbGV0IHVzIG5lc3QgdG8g
YSBtdWNoCi0gICAgLy8gZ3JlYXRlciBkZXB0aCAoc2VlIGJ1Z3ppbGxhIGJ1ZyAxMzQzMCkgYnV0
IGZvciBub3cgd2UgaGF2ZSBhIGxpbWl0LiAgVGhpcyAqd2lsbCogcmVzdWx0IGluCi0gICAgLy8g
aW5jb3JyZWN0IHJlbmRlcmluZywgYnV0IHRoZSBhbHRlcm5hdGl2ZSBpcyB0byBoYW5nIGZvcmV2
ZXIuCi0gICAgdW5zaWduZWQgc3BsaXREZXB0aCA9IDE7Ci0gICAgY29uc3QgdW5zaWduZWQgY01h
eFNwbGl0RGVwdGggPSAyMDA7IAotICAgIHdoaWxlIChjdXJyICYmIGN1cnIgIT0gZnJvbUJsb2Nr
KSB7Ci0gICAgICAgIEFTU0VSVChjdXJyLT5pc1JlbmRlcklubGluZSgpKTsKLSAgICAgICAgaWYg
KHNwbGl0RGVwdGggPCBjTWF4U3BsaXREZXB0aCkgewotICAgICAgICAgICAgLy8gQ3JlYXRlIGEg
bmV3IGNsb25lLgotICAgICAgICAgICAgUmVuZGVySW5saW5lKiBjbG9uZUNoaWxkID0gY2xvbmU7
Ci0gICAgICAgICAgICBjbG9uZSA9IGNsb25lSW5saW5lKHRvUmVuZGVySW5saW5lKGN1cnIpKTsK
LQotICAgICAgICAgICAgLy8gSW5zZXJ0IG91ciBjaGlsZCBjbG9uZSBhcyB0aGUgZmlyc3QgY2hp
bGQuCi0gICAgICAgICAgICBjbG9uZS0+YWRkQ2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihjbG9u
ZUNoaWxkLCAwKTsKLQotICAgICAgICAgICAgLy8gSG9vayB0aGUgY2xvbmUgdXAgYXMgYSBjb250
aW51YXRpb24gb2YgfGN1cnJ8LgotICAgICAgICAgICAgUmVuZGVySW5saW5lKiBpbmxpbmVDdXJy
ID0gdG9SZW5kZXJJbmxpbmUoY3Vycik7Ci0gICAgICAgICAgICBvbGRDb250ID0gaW5saW5lQ3Vy
ci0+Y29udGludWF0aW9uKCk7Ci0gICAgICAgICAgICBpbmxpbmVDdXJyLT5zZXRDb250aW51YXRp
b24oY2xvbmUpOwotICAgICAgICAgICAgY2xvbmUtPnNldENvbnRpbnVhdGlvbihvbGRDb250KTsK
LQotICAgICAgICAgICAgLy8gU29tZW9uZSBtYXkgaGF2ZSBpbmRpcmVjdGx5IGNhdXNlZCBhIDxx
PiB0byBzcGxpdC4gIFdoZW4gdGhpcyBoYXBwZW5zLCB0aGUgOmFmdGVyIGNvbnRlbnQKLSAgICAg
ICAgICAgIC8vIGhhcyB0byBtb3ZlIGludG8gdGhlIGlubGluZSBjb250aW51YXRpb24uICBDYWxs
IHVwZGF0ZUJlZm9yZUFmdGVyQ29udGVudCB0byBlbnN1cmUgdGhhdCB0aGUgaW5saW5lJ3MgOmFm
dGVyCi0gICAgICAgICAgICAvLyBjb250ZW50IGdldHMgcHJvcGVybHkgZGVzdHJveWVkLgotICAg
ICAgICAgICAgaWYgKGRvY3VtZW50KCktPnVzZXNCZWZvcmVBZnRlclJ1bGVzKCkpCi0gICAgICAg
ICAgICAgICAgaW5saW5lQ3Vyci0+Y2hpbGRyZW4oKS0+dXBkYXRlQmVmb3JlQWZ0ZXJDb250ZW50
KHRoaXMsIEFGVEVSKTsKLQotICAgICAgICAgICAgLy8gTm93IHdlIG5lZWQgdG8gdGFrZSBhbGwg
b2YgdGhlIGNoaWxkcmVuIHN0YXJ0aW5nIGZyb20gdGhlIGZpcnN0IGNoaWxkCi0gICAgICAgICAg
ICAvLyAqYWZ0ZXIqIGN1cnJDaGlsZCBhbmQgYXBwZW5kIHRoZW0gYWxsIHRvIHRoZSBjbG9uZS4K
LSAgICAgICAgICAgIG8gPSBjdXJyQ2hpbGQtPm5leHRTaWJsaW5nKCk7Ci0gICAgICAgICAgICB3
aGlsZSAobykgewotICAgICAgICAgICAgICAgIFJlbmRlck9iamVjdCogdG1wID0gbzsKLSAgICAg
ICAgICAgICAgICBvID0gdG1wLT5uZXh0U2libGluZygpOwotICAgICAgICAgICAgICAgIGNsb25l
LT5hZGRDaGlsZElnbm9yaW5nQ29udGludWF0aW9uKGlubGluZUN1cnItPmNoaWxkcmVuKCktPnJl
bW92ZUNoaWxkTm9kZShjdXJyLCB0bXApLCAwKTsKLSAgICAgICAgICAgICAgICB0bXAtPnNldE5l
ZWRzTGF5b3V0QW5kUHJlZldpZHRoc1JlY2FsYygpOwotICAgICAgICAgICAgfQotICAgICAgICB9
Ci0gICAgICAgIAotICAgICAgICAvLyBLZWVwIHdhbGtpbmcgdXAgdGhlIGNoYWluLgotICAgICAg
ICBjdXJyQ2hpbGQgPSBjdXJyOwotICAgICAgICBjdXJyID0gdG9SZW5kZXJCb3hNb2RlbE9iamVj
dChjdXJyLT5wYXJlbnQoKSk7Ci0gICAgICAgIHNwbGl0RGVwdGgrKzsKLSAgICB9Ci0KLSAgICAv
LyBOb3cgd2UgYXJlIGF0IHRoZSBibG9jayBsZXZlbC4gV2UgbmVlZCB0byBwdXQgdGhlIGNsb25l
IGludG8gdGhlIHRvQmxvY2suCi0gICAgdG9CbG9jay0+Y2hpbGRyZW4oKS0+YXBwZW5kQ2hpbGRO
b2RlKHRvQmxvY2ssIGNsb25lKTsKLQotICAgIC8vIE5vdyB0YWtlIGFsbCB0aGUgY2hpbGRyZW4g
YWZ0ZXIgY3VyckNoaWxkIGFuZCByZW1vdmUgdGhlbSBmcm9tIHRoZSBmcm9tQmxvY2sKLSAgICAv
LyBhbmQgcHV0IHRoZW0gaW4gdGhlIHRvQmxvY2suCi0gICAgbyA9IGN1cnJDaGlsZC0+bmV4dFNp
YmxpbmcoKTsKLSAgICB3aGlsZSAobykgewotICAgICAgICBSZW5kZXJPYmplY3QqIHRtcCA9IG87
Ci0gICAgICAgIG8gPSB0bXAtPm5leHRTaWJsaW5nKCk7Ci0gICAgICAgIHRvQmxvY2stPmNoaWxk
cmVuKCktPmFwcGVuZENoaWxkTm9kZSh0b0Jsb2NrLCBmcm9tQmxvY2stPmNoaWxkcmVuKCktPnJl
bW92ZUNoaWxkTm9kZShmcm9tQmxvY2ssIHRtcCkpOwotICAgIH0KLX0KLQotdm9pZCBSZW5kZXJJ
bmxpbmU6OnNwbGl0RmxvdyhSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkLCBSZW5kZXJCbG9jayog
bmV3QmxvY2tCb3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbmRlck9iamVjdCog
bmV3Q2hpbGQsIFJlbmRlckJveE1vZGVsT2JqZWN0KiBvbGRDb250KQotewotICAgIFJlbmRlckJs
b2NrKiBwcmUgPSAwOwotICAgIFJlbmRlckJsb2NrKiBibG9jayA9IGNvbnRhaW5pbmdCbG9jaygp
OwotICAgIAotICAgIC8vIERlbGV0ZSBvdXIgbGluZSBib3hlcyBiZWZvcmUgd2UgZG8gdGhlIGlu
bGluZSBzcGxpdCBpbnRvIGNvbnRpbnVhdGlvbnMuCi0gICAgYmxvY2stPmRlbGV0ZUxpbmVCb3hU
cmVlKCk7Ci0gICAgCi0gICAgYm9vbCBtYWRlTmV3QmVmb3JlQmxvY2sgPSBmYWxzZTsKLSAgICBp
ZiAoYmxvY2stPmlzQW5vbnltb3VzQmxvY2soKSAmJiAoIWJsb2NrLT5wYXJlbnQoKSB8fCAhYmxv
Y2stPnBhcmVudCgpLT5jcmVhdGVzQW5vbnltb3VzV3JhcHBlcigpKSkgewotICAgICAgICAvLyBX
ZSBjYW4gcmV1c2UgdGhpcyBibG9jayBhbmQgbWFrZSBpdCB0aGUgcHJlQmxvY2sgb2YgdGhlIG5l
eHQgY29udGludWF0aW9uLgotICAgICAgICBwcmUgPSBibG9jazsKLSAgICAgICAgcHJlLT5yZW1v
dmVQb3NpdGlvbmVkT2JqZWN0cygwKTsKLSAgICAgICAgYmxvY2sgPSBibG9jay0+Y29udGFpbmlu
Z0Jsb2NrKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gTm8gYW5vbnltb3VzIGJsb2NrIGF2
YWlsYWJsZSBmb3IgdXNlLiAgTWFrZSBvbmUuCi0gICAgICAgIHByZSA9IGJsb2NrLT5jcmVhdGVB
bm9ueW1vdXNCbG9jaygpOwotICAgICAgICBtYWRlTmV3QmVmb3JlQmxvY2sgPSB0cnVlOwotICAg
IH0KLQotICAgIFJlbmRlckJsb2NrKiBwb3N0ID0gYmxvY2stPmNyZWF0ZUFub255bW91c0Jsb2Nr
KCk7Ci0KLSAgICBSZW5kZXJPYmplY3QqIGJveEZpcnN0ID0gbWFkZU5ld0JlZm9yZUJsb2NrID8g
YmxvY2stPmZpcnN0Q2hpbGQoKSA6IHByZS0+bmV4dFNpYmxpbmcoKTsKLSAgICBpZiAobWFkZU5l
d0JlZm9yZUJsb2NrKQotICAgICAgICBibG9jay0+Y2hpbGRyZW4oKS0+aW5zZXJ0Q2hpbGROb2Rl
KGJsb2NrLCBwcmUsIGJveEZpcnN0KTsKLSAgICBibG9jay0+Y2hpbGRyZW4oKS0+aW5zZXJ0Q2hp
bGROb2RlKGJsb2NrLCBuZXdCbG9ja0JveCwgYm94Rmlyc3QpOwotICAgIGJsb2NrLT5jaGlsZHJl
bigpLT5pbnNlcnRDaGlsZE5vZGUoYmxvY2ssIHBvc3QsIGJveEZpcnN0KTsKLSAgICBibG9jay0+
c2V0Q2hpbGRyZW5JbmxpbmUoZmFsc2UpOwotICAgIAotICAgIGlmIChtYWRlTmV3QmVmb3JlQmxv
Y2spIHsKLSAgICAgICAgUmVuZGVyT2JqZWN0KiBvID0gYm94Rmlyc3Q7Ci0gICAgICAgIHdoaWxl
IChvKSB7Ci0gICAgICAgICAgICBSZW5kZXJPYmplY3QqIG5vID0gbzsKLSAgICAgICAgICAgIG8g
PSBuby0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgICAgIHByZS0+Y2hpbGRyZW4oKS0+YXBwZW5k
Q2hpbGROb2RlKHByZSwgYmxvY2stPmNoaWxkcmVuKCktPnJlbW92ZUNoaWxkTm9kZShibG9jaywg
bm8pKTsKLSAgICAgICAgICAgIG5vLT5zZXROZWVkc0xheW91dEFuZFByZWZXaWR0aHNSZWNhbGMo
KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHNwbGl0SW5saW5lcyhwcmUsIHBvc3QsIG5ld0Js
b2NrQm94LCBiZWZvcmVDaGlsZCwgb2xkQ29udCk7Ci0KLSAgICAvLyBXZSBhbHJlYWR5IGtub3cg
dGhlIG5ld0Jsb2NrQm94IGlzbid0IGdvaW5nIHRvIGNvbnRhaW4gaW5saW5lIGtpZHMsIHNvIGF2
b2lkIHdhc3RpbmcKLSAgICAvLyB0aW1lIGluIG1ha2VDaGlsZHJlbk5vbklubGluZSBieSBqdXN0
IHNldHRpbmcgdGhpcyBleHBsaWNpdGx5IHVwIGZyb250LgotICAgIG5ld0Jsb2NrQm94LT5zZXRD
aGlsZHJlbklubGluZShmYWxzZSk7Ci0KLSAgICAvLyBXZSBkZWxheWVkIGFkZGluZyB0aGUgbmV3
Q2hpbGQgdW50aWwgbm93IHNvIHRoYXQgdGhlIHxuZXdCbG9ja0JveHwgd291bGQgYmUgZnVsbHkK
LSAgICAvLyBjb25uZWN0ZWQsIHRodXMgYWxsb3dpbmcgbmV3Q2hpbGQgYWNjZXNzIHRvIGEgcmVu
ZGVyQXJlbmEgc2hvdWxkIGl0IG5lZWQKLSAgICAvLyB0byB3cmFwIGl0c2VsZiBpbiBhZGRpdGlv
bmFsIGJveGVzIChlLmcuLCB0YWJsZSBjb25zdHJ1Y3Rpb24pLgotICAgIG5ld0Jsb2NrQm94LT5h
ZGRDaGlsZChuZXdDaGlsZCk7Ci0KLSAgICAvLyBBbHdheXMganVzdCBkbyBhIGZ1bGwgbGF5b3V0
IGluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IGxpbmUgYm94ZXMgKGVzcGVjaWFsbHkgd3JhcHBlcnMg
Zm9yIGltYWdlcykKLSAgICAvLyBnZXQgZGVsZXRlZCBwcm9wZXJseS4gIEJlY2F1c2Ugb2JqZWN0
cyBtb3ZlcyBmcm9tIHRoZSBwcmUgYmxvY2sgaW50byB0aGUgcG9zdCBibG9jaywgd2Ugd2FudCB0
bwotICAgIC8vIG1ha2UgbmV3IGxpbmUgYm94ZXMgaW5zdGVhZCBvZiBsZWF2aW5nIHRoZSBvbGQg
bGluZSBib3hlcyBhcm91bmQuCi0gICAgcHJlLT5zZXROZWVkc0xheW91dEFuZFByZWZXaWR0aHNS
ZWNhbGMoKTsKLSAgICBibG9jay0+c2V0TmVlZHNMYXlvdXRBbmRQcmVmV2lkdGhzUmVjYWxjKCk7
Ci0gICAgcG9zdC0+c2V0TmVlZHNMYXlvdXRBbmRQcmVmV2lkdGhzUmVjYWxjKCk7Ci19Ci0KLXZv
aWQgUmVuZGVySW5saW5lOjphZGRDaGlsZFRvQ29udGludWF0aW9uKFJlbmRlck9iamVjdCogbmV3
Q2hpbGQsIFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQpCi17Ci0gICAgUmVuZGVyQm94TW9kZWxP
YmplY3QqIGZsb3cgPSBjb250aW51YXRpb25CZWZvcmUoYmVmb3JlQ2hpbGQpOwotICAgIEFTU0VS
VCghYmVmb3JlQ2hpbGQgfHwgYmVmb3JlQ2hpbGQtPnBhcmVudCgpLT5pc1JlbmRlckJsb2NrKCkg
fHwgYmVmb3JlQ2hpbGQtPnBhcmVudCgpLT5pc1JlbmRlcklubGluZSgpKTsKLSAgICBSZW5kZXJC
b3hNb2RlbE9iamVjdCogYmVmb3JlQ2hpbGRQYXJlbnQgPSAwOwotICAgIGlmIChiZWZvcmVDaGls
ZCkKLSAgICAgICAgYmVmb3JlQ2hpbGRQYXJlbnQgPSB0b1JlbmRlckJveE1vZGVsT2JqZWN0KGJl
Zm9yZUNoaWxkLT5wYXJlbnQoKSk7Ci0gICAgZWxzZSB7Ci0gICAgICAgIFJlbmRlckJveE1vZGVs
T2JqZWN0KiBjb250ID0gbmV4dENvbnRpbnVhdGlvbihmbG93KTsKLSAgICAgICAgaWYgKGNvbnQp
Ci0gICAgICAgICAgICBiZWZvcmVDaGlsZFBhcmVudCA9IGNvbnQ7Ci0gICAgICAgIGVsc2UKLSAg
ICAgICAgICAgIGJlZm9yZUNoaWxkUGFyZW50ID0gZmxvdzsKLSAgICB9Ci0KLSAgICBpZiAobmV3
Q2hpbGQtPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSkKLSAgICAgICAgcmV0dXJuIGJlZm9yZUNo
aWxkUGFyZW50LT5hZGRDaGlsZElnbm9yaW5nQ29udGludWF0aW9uKG5ld0NoaWxkLCBiZWZvcmVD
aGlsZCk7Ci0KLSAgICAvLyBBIGNvbnRpbnVhdGlvbiBhbHdheXMgY29uc2lzdHMgb2YgdHdvIHBv
dGVudGlhbCBjYW5kaWRhdGVzOiBhbiBpbmxpbmUgb3IgYW4gYW5vbnltb3VzCi0gICAgLy8gYmxv
Y2sgYm94IGhvbGRpbmcgYmxvY2sgY2hpbGRyZW4uCi0gICAgYm9vbCBjaGlsZElubGluZSA9IG5l
d0NoaWxkLT5pc0lubGluZSgpOwotICAgIGJvb2wgYmNwSW5saW5lID0gYmVmb3JlQ2hpbGRQYXJl
bnQtPmlzSW5saW5lKCk7Ci0gICAgYm9vbCBmbG93SW5saW5lID0gZmxvdy0+aXNJbmxpbmUoKTsK
LQotICAgIGlmIChmbG93ID09IGJlZm9yZUNoaWxkUGFyZW50KQotICAgICAgICByZXR1cm4gZmxv
dy0+YWRkQ2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihuZXdDaGlsZCwgYmVmb3JlQ2hpbGQpOwot
ICAgIGVsc2UgewotICAgICAgICAvLyBUaGUgZ29hbCBoZXJlIGlzIHRvIG1hdGNoIHVwIGlmIHdl
IGNhbiwgc28gdGhhdCB3ZSBjYW4gY29hbGVzY2UgYW5kIGNyZWF0ZSB0aGUKLSAgICAgICAgLy8g
bWluaW1hbCAjIG9mIGNvbnRpbnVhdGlvbnMgbmVlZGVkIGZvciB0aGUgaW5saW5lLgotICAgICAg
ICBpZiAoY2hpbGRJbmxpbmUgPT0gYmNwSW5saW5lKQotICAgICAgICAgICAgcmV0dXJuIGJlZm9y
ZUNoaWxkUGFyZW50LT5hZGRDaGlsZElnbm9yaW5nQ29udGludWF0aW9uKG5ld0NoaWxkLCBiZWZv
cmVDaGlsZCk7Ci0gICAgICAgIGVsc2UgaWYgKGZsb3dJbmxpbmUgPT0gY2hpbGRJbmxpbmUpCi0g
ICAgICAgICAgICByZXR1cm4gZmxvdy0+YWRkQ2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihuZXdD
aGlsZCwgMCk7IC8vIEp1c3QgdHJlYXQgbGlrZSBhbiBhcHBlbmQuCi0gICAgICAgIGVsc2UKLSAg
ICAgICAgICAgIHJldHVybiBiZWZvcmVDaGlsZFBhcmVudC0+YWRkQ2hpbGRJZ25vcmluZ0NvbnRp
bnVhdGlvbihuZXdDaGlsZCwgYmVmb3JlQ2hpbGQpOwotICAgIH0KLX0KLQogdm9pZCBSZW5kZXJJ
bmxpbmU6OnBhaW50KFBhaW50SW5mbyYgcGFpbnRJbmZvLCBpbnQgdHgsIGludCB0eSkKIHsKICAg
ICBtX2xpbmVCb3hlcy5wYWludCh0aGlzLCBwYWludEluZm8sIHR4LCB0eSk7CkBAIC00MTUsMTYg
KzE5OCw2IEBAIHZvaWQgUmVuZGVySW5saW5lOjphYnNvbHV0ZVJlY3RzKFZlY3RvcjwKICAgICAg
ICAgICAgIHJlY3RzLmFwcGVuZChJbnRSZWN0KHR4ICsgY3Vyci0+eCgpLCB0eSArIGN1cnItPnko
KSwgY3Vyci0+d2lkdGgoKSwgY3Vyci0+aGVpZ2h0KCkpKTsKICAgICB9IGVsc2UKICAgICAgICAg
cmVjdHMuYXBwZW5kKEludFJlY3QodHgsIHR5LCAwLCAwKSk7Ci0KLSAgICBpZiAoY29udGludWF0
aW9uKCkpIHsKLSAgICAgICAgaWYgKGNvbnRpbnVhdGlvbigpLT5pc0JveCgpKSB7Ci0gICAgICAg
ICAgICBSZW5kZXJCb3gqIGJveCA9IHRvUmVuZGVyQm94KGNvbnRpbnVhdGlvbigpKTsKLSAgICAg
ICAgICAgIGNvbnRpbnVhdGlvbigpLT5hYnNvbHV0ZVJlY3RzKHJlY3RzLCAKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4IC0gY29udGFpbmluZ0Jsb2NrKCktPngo
KSArIGJveC0+eCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
dHkgLSBjb250YWluaW5nQmxvY2soKS0+eSgpICsgYm94LT55KCkpOwotICAgICAgICB9IGVsc2UK
LSAgICAgICAgICAgIGNvbnRpbnVhdGlvbigpLT5hYnNvbHV0ZVJlY3RzKHJlY3RzLCB0eCAtIGNv
bnRhaW5pbmdCbG9jaygpLT54KCksIHR5IC0gY29udGFpbmluZ0Jsb2NrKCktPnkoKSk7Ci0gICAg
fQogfQogCiB2b2lkIFJlbmRlcklubGluZTo6YWJzb2x1dGVRdWFkcyhWZWN0b3I8RmxvYXRRdWFk
PiYgcXVhZHMpCkBAIC00MzYsOSArMjA5LDYgQEAgdm9pZCBSZW5kZXJJbmxpbmU6OmFic29sdXRl
UXVhZHMoVmVjdG9yPAogICAgICAgICB9CiAgICAgfSBlbHNlCiAgICAgICAgIHF1YWRzLmFwcGVu
ZChsb2NhbFRvQWJzb2x1dGVRdWFkKEZsb2F0UmVjdCgpKSk7Ci0KLSAgICBpZiAoY29udGludWF0
aW9uKCkpCi0gICAgICAgIGNvbnRpbnVhdGlvbigpLT5hYnNvbHV0ZVF1YWRzKHF1YWRzKTsKIH0K
IAogaW50IFJlbmRlcklubGluZTo6b2Zmc2V0TGVmdCgpIGNvbnN0CkBAIC01MDcsMTggKzI3Nyw2
IEBAIFZpc2libGVQb3NpdGlvbiBSZW5kZXJJbmxpbmU6OnBvc2l0aW9uRm8KICAgICAgICAgLy8g
c2hvdWxkIHRyeSB0byBmaW5kIGEgcmVzdWx0IGJ5IGFza2luZyBvdXIgY29udGFpbmluZyBibG9j
ay4KICAgICAgICAgcmV0dXJuIGNiLT5wb3NpdGlvbkZvclBvaW50KHBvaW50KTsKICAgICB9Ci0K
LSAgICAvLyBUcmFuc2xhdGUgdGhlIGNvb3JkcyBmcm9tIHRoZSBwcmUtYW5vbnltb3VzIGJsb2Nr
IHRvIHRoZSBwb3N0LWFub255bW91cyBibG9jay4KLSAgICBpbnQgcGFyZW50QmxvY2tYID0gY2It
PngoKSArIHBvaW50LngoKTsKLSAgICBpbnQgcGFyZW50QmxvY2tZID0gY2ItPnkoKSArIHBvaW50
LnkoKTsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogYyA9IGNvbnRpbnVhdGlvbigpOwotICAg
IHdoaWxlIChjKSB7Ci0gICAgICAgIFJlbmRlckJveCogY29udEJsb2NrID0gYy0+aXNJbmxpbmUo
KSA/IGMtPmNvbnRhaW5pbmdCbG9jaygpIDogdG9SZW5kZXJCbG9jayhjKTsKLSAgICAgICAgaWYg
KGMtPmlzSW5saW5lKCkgfHwgYy0+Zmlyc3RDaGlsZCgpKQotICAgICAgICAgICAgcmV0dXJuIGMt
PnBvc2l0aW9uRm9yQ29vcmRpbmF0ZXMocGFyZW50QmxvY2tYIC0gY29udEJsb2NrLT54KCksIHBh
cmVudEJsb2NrWSAtIGNvbnRCbG9jay0+eSgpKTsKLSAgICAgICAgYyA9IHRvUmVuZGVyQmxvY2so
YyktPmlubGluZUNvbnRpbnVhdGlvbigpOwotICAgIH0KLSAgICAKICAgICByZXR1cm4gUmVuZGVy
Qm94TW9kZWxPYmplY3Q6OnBvc2l0aW9uRm9yUG9pbnQocG9pbnQpOwogfQogCkBAIC01NzEsNyAr
MzI5LDcgQEAgSW50UmVjdCBSZW5kZXJJbmxpbmU6OmNsaXBwZWRPdmVyZmxvd1JlYwogICAgIC8v
IE9ubHkgcnVuLWlucyBhcmUgYWxsb3dlZCBpbiBoZXJlIGR1cmluZyBsYXlvdXQuCiAgICAgQVNT
RVJUKCF2aWV3KCkgfHwgIXZpZXcoKS0+bGF5b3V0U3RhdGVFbmFibGVkKCkgfHwgaXNSdW5Jbigp
KTsKIAotICAgIGlmICghZmlyc3RMaW5lQm94KCkgJiYgIWNvbnRpbnVhdGlvbigpKQorICAgIGlm
ICghZmlyc3RMaW5lQm94KCkpCiAgICAgICAgIHJldHVybiBJbnRSZWN0KCk7CiAKICAgICAvLyBG
aW5kIG91ciBsZWZ0bW9zdCBwb3NpdGlvbi4KQEAgLTYxOSwxMSArMzc3LDYgQEAgSW50UmVjdCBS
ZW5kZXJJbmxpbmU6OmNsaXBwZWRPdmVyZmxvd1JlYwogICAgICAgICAgICAgICAgIHIudW5pdGUo
Y2hpbGRSZWN0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotCi0gICAgICAgIGlmIChjb250
aW51YXRpb24oKSAmJiAhY29udGludWF0aW9uKCktPmlzSW5saW5lKCkpIHsKLSAgICAgICAgICAg
IEludFJlY3QgY29udFJlY3QgPSBjb250aW51YXRpb24oKS0+cmVjdFdpdGhPdXRsaW5lRm9yUmVw
YWludChyZXBhaW50Q29udGFpbmVyLCBvdyk7Ci0gICAgICAgICAgICByLnVuaXRlKGNvbnRSZWN0
KTsKLSAgICAgICAgfQogICAgIH0KIAogICAgIHJldHVybiByOwpAQCAtNzk2LDQ5ICs1NDksNiBA
QCB2b2lkIFJlbmRlcklubGluZTo6bWFwQWJzb2x1dGVUb0xvY2FsUG9pCiAgICAgICAgIHRyYW5z
Zm9ybVN0YXRlLm1vdmUoLWNvbnRhaW5lck9mZnNldC53aWR0aCgpLCAtY29udGFpbmVyT2Zmc2V0
LmhlaWdodCgpLCBwcmVzZXJ2ZTNEID8gVHJhbnNmb3JtU3RhdGU6OkFjY3VtdWxhdGVUcmFuc2Zv
cm0gOiBUcmFuc2Zvcm1TdGF0ZTo6RmxhdHRlblRyYW5zZm9ybSk7CiB9CiAKLXZvaWQgUmVuZGVy
SW5saW5lOjp1cGRhdGVEcmFnU3RhdGUoYm9vbCBkcmFnT24pCi17Ci0gICAgUmVuZGVyQm94TW9k
ZWxPYmplY3Q6OnVwZGF0ZURyYWdTdGF0ZShkcmFnT24pOwotICAgIGlmIChjb250aW51YXRpb24o
KSkKLSAgICAgICAgY29udGludWF0aW9uKCktPnVwZGF0ZURyYWdTdGF0ZShkcmFnT24pOwotfQot
Ci12b2lkIFJlbmRlcklubGluZTo6Y2hpbGRCZWNhbWVOb25JbmxpbmUoUmVuZGVyT2JqZWN0KiBj
aGlsZCkKLXsKLSAgICAvLyBXZSBoYXZlIHRvIHNwbGl0IHRoZSBwYXJlbnQgZmxvdy4KLSAgICBS
ZW5kZXJCbG9jayogbmV3Qm94ID0gY29udGFpbmluZ0Jsb2NrKCktPmNyZWF0ZUFub255bW91c0Js
b2NrKCk7Ci0gICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIG9sZENvbnRpbnVhdGlvbiA9IGNvbnRp
bnVhdGlvbigpOwotICAgIHNldENvbnRpbnVhdGlvbihuZXdCb3gpOwotICAgIFJlbmRlck9iamVj
dCogYmVmb3JlQ2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKTsKLSAgICBjaGlsZHJlbigpLT5y
ZW1vdmVDaGlsZE5vZGUodGhpcywgY2hpbGQpOwotICAgIHNwbGl0RmxvdyhiZWZvcmVDaGlsZCwg
bmV3Qm94LCBjaGlsZCwgb2xkQ29udGludWF0aW9uKTsKLX0KLQotdm9pZCBSZW5kZXJJbmxpbmU6
OnVwZGF0ZUhpdFRlc3RSZXN1bHQoSGl0VGVzdFJlc3VsdCYgcmVzdWx0LCBjb25zdCBJbnRQb2lu
dCYgcG9pbnQpCi17Ci0gICAgaWYgKHJlc3VsdC5pbm5lck5vZGUoKSkKLSAgICAgICAgcmV0dXJu
OwotCi0gICAgTm9kZSogbiA9IG5vZGUoKTsKLSAgICBJbnRQb2ludCBsb2NhbFBvaW50KHBvaW50
KTsKLSAgICBpZiAobikgewotICAgICAgICBpZiAoaXNJbmxpbmVDb250aW51YXRpb24oKSkgewot
ICAgICAgICAgICAgLy8gV2UncmUgaW4gdGhlIGNvbnRpbnVhdGlvbiBvZiBhIHNwbGl0IGlubGlu
ZS4gIEFkanVzdCBvdXIgbG9jYWwgcG9pbnQgdG8gYmUgaW4gdGhlIGNvb3JkaW5hdGUgc3BhY2UK
LSAgICAgICAgICAgIC8vIG9mIHRoZSBwcmluY2lwYWwgcmVuZGVyZXIncyBjb250YWluaW5nIGJs
b2NrLiAgVGhpcyB3aWxsIGVuZCB1cCBiZWluZyB0aGUgaW5uZXJOb25TaGFyZWROb2RlLgotICAg
ICAgICAgICAgUmVuZGVyQmxvY2sqIGZpcnN0QmxvY2sgPSBuLT5yZW5kZXJlcigpLT5jb250YWlu
aW5nQmxvY2soKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gR2V0IG91ciBjb250YWlu
aW5nIGJsb2NrLgotICAgICAgICAgICAgUmVuZGVyQm94KiBibG9jayA9IGNvbnRhaW5pbmdCbG9j
aygpOwotICAgICAgICAgICAgbG9jYWxQb2ludC5tb3ZlKGJsb2NrLT54KCkgLSBmaXJzdEJsb2Nr
LT54KCksIGJsb2NrLT55KCkgLSBmaXJzdEJsb2NrLT55KCkpOwotICAgICAgICB9Ci0KLSAgICAg
ICAgcmVzdWx0LnNldElubmVyTm9kZShuKTsKLSAgICAgICAgaWYgKCFyZXN1bHQuaW5uZXJOb25T
aGFyZWROb2RlKCkpCi0gICAgICAgICAgICByZXN1bHQuc2V0SW5uZXJOb25TaGFyZWROb2RlKG4p
OwotICAgICAgICByZXN1bHQuc2V0TG9jYWxQb2ludChsb2NhbFBvaW50KTsKLSAgICB9Ci19Ci0K
IHZvaWQgUmVuZGVySW5saW5lOjpkaXJ0eUxpbmVCb3hlcyhib29sIGZ1bGxMYXlvdXQpCiB7CiAg
ICAgaWYgKGZ1bGxMYXlvdXQpCkBAIC05NTQsMTcgKzY2NCw2IEBAIHZvaWQgUmVuZGVySW5saW5l
OjphZGRGb2N1c1JpbmdSZWN0cyhWZWMKICAgICAgICAgICAgY3Vyci0+YWRkRm9jdXNSaW5nUmVj
dHMocmVjdHMsIHBvcy54KCksIHBvcy55KCkpOwogICAgICAgICB9CiAgICAgfQotCi0gICAgaWYg
KGNvbnRpbnVhdGlvbigpKSB7Ci0gICAgICAgIGlmIChjb250aW51YXRpb24oKS0+aXNJbmxpbmUo
KSkKLSAgICAgICAgICAgIGNvbnRpbnVhdGlvbigpLT5hZGRGb2N1c1JpbmdSZWN0cyhyZWN0cywg
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHggLSBjb250
YWluaW5nQmxvY2soKS0+eCgpICsgY29udGludWF0aW9uKCktPmNvbnRhaW5pbmdCbG9jaygpLT54
KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHkgLSBj
b250YWluaW5nQmxvY2soKS0+eSgpICsgY29udGludWF0aW9uKCktPmNvbnRhaW5pbmdCbG9jaygp
LT55KCkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBjb250aW51YXRpb24oKS0+YWRkRm9j
dXNSaW5nUmVjdHMocmVjdHMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHR4IC0gY29udGFpbmluZ0Jsb2NrKCktPngoKSArIHRvUmVuZGVyQm94KGNvbnRp
bnVhdGlvbigpKS0+eCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHR5IC0gY29udGFpbmluZ0Jsb2NrKCktPnkoKSArIHRvUmVuZGVyQm94KGNvbnRpbnVh
dGlvbigpKS0+eSgpKTsKLSAgICB9CiB9CiAKIHZvaWQgUmVuZGVySW5saW5lOjpwYWludE91dGxp
bmUoR3JhcGhpY3NDb250ZXh0KiBncmFwaGljc0NvbnRleHQsIGludCB0eCwgaW50IHR5KQpJbmRl
eDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVySW5saW5lLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVySW5saW5lLmgJKHJldmlzaW9uIDU0NTYxKQorKysgV2ViQ29yZS9y
ZW5kZXJpbmcvUmVuZGVySW5saW5lLmgJKHdvcmtpbmcgY29weSkKQEAgLTU4LDEwICs1OCw2IEBA
IHB1YmxpYzoKIAogICAgIElubGluZUZsb3dCb3gqIGZpcnN0TGluZUJveCgpIGNvbnN0IHsgcmV0
dXJuIG1fbGluZUJveGVzLmZpcnN0TGluZUJveCgpOyB9CiAgICAgSW5saW5lRmxvd0JveCogbGFz
dExpbmVCb3goKSBjb25zdCB7IHJldHVybiBtX2xpbmVCb3hlcy5sYXN0TGluZUJveCgpOyB9Ci0K
LSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogY29udGludWF0aW9uKCkgY29uc3QgeyByZXR1cm4g
bV9jb250aW51YXRpb247IH0KLQotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVEcmFnU3RhdGUoYm9v
bCBkcmFnT24pOwogICAgIAogICAgIEludFNpemUgcmVsYXRpdmVQb3NpdGlvbmVkSW5saW5lT2Zm
c2V0KGNvbnN0IFJlbmRlckJveCogY2hpbGQpIGNvbnN0OwogCkBAIC04MSw5ICs3Nyw2IEBAIHBy
aXZhdGU6CiAKICAgICB2aXJ0dWFsIGJvb2wgaXNSZW5kZXJJbmxpbmUoKSBjb25zdCB7IHJldHVy
biB0cnVlOyB9CiAKLSAgICB2b2lkIGFkZENoaWxkVG9Db250aW51YXRpb24oUmVuZGVyT2JqZWN0
KiBuZXdDaGlsZCwgUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCk7Ci0gICAgdmlydHVhbCB2b2lk
IGFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24oUmVuZGVyT2JqZWN0KiBuZXdDaGlsZCwgUmVu
ZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCA9IDApOwotCiAgICAgdm9pZCBzcGxpdElubGluZXMoUmVu
ZGVyQmxvY2sqIGZyb21CbG9jaywgUmVuZGVyQmxvY2sqIHRvQmxvY2ssIFJlbmRlckJsb2NrKiBt
aWRkbGVCbG9jaywKICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXJPYmplY3QqIGJlZm9yZUNo
aWxkLCBSZW5kZXJCb3hNb2RlbE9iamVjdCogb2xkQ29udCk7CiAgICAgdm9pZCBzcGxpdEZsb3co
UmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCwgUmVuZGVyQmxvY2sqIG5ld0Jsb2NrQm94LApAQCAt
MTI2LDEzICsxMTksOCBAQCBwcml2YXRlOgogCiAgICAgdmlydHVhbCBpbnQgbGluZUhlaWdodChi
b29sIGZpcnN0TGluZSwgYm9vbCBpc1Jvb3RMaW5lQm94ID0gZmFsc2UpIGNvbnN0OwogCi0gICAg
UmVuZGVySW5saW5lKiBpbmxpbmVDb250aW51YXRpb24oKSBjb25zdDsKLSAgICB2b2lkIHNldENv
bnRpbnVhdGlvbihSZW5kZXJCb3hNb2RlbE9iamVjdCogYykgeyBtX2NvbnRpbnVhdGlvbiA9IGM7
IH0KLSAgICAKICAgICB2aXJ0dWFsIHZvaWQgY2hpbGRCZWNhbWVOb25JbmxpbmUoUmVuZGVyT2Jq
ZWN0KiBjaGlsZCk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlSGl0VGVzdFJlc3VsdChIaXRU
ZXN0UmVzdWx0JiwgY29uc3QgSW50UG9pbnQmKTsKLQogICAgIHZpcnR1YWwgdm9pZCBpbWFnZUNo
YW5nZWQoV3JhcHBlZEltYWdlUHRyLCBjb25zdCBJbnRSZWN0KiA9IDApOwogCiAjaWYgRU5BQkxF
KERBU0hCT0FSRF9TVVBQT1JUKQpAQCAtMTQ1LDEzICsxMzMsMTAgQEAgcHJpdmF0ZToKICAgICBz
dGF0aWMgUmVuZGVySW5saW5lKiBjbG9uZUlubGluZShSZW5kZXJJbmxpbmUqIHNyYyk7CiAKICAg
ICB2b2lkIHBhaW50T3V0bGluZUZvckxpbmUoR3JhcGhpY3NDb250ZXh0KiwgaW50IHR4LCBpbnQg
dHksIGNvbnN0IEludFJlY3QmIHByZXZMaW5lLCBjb25zdCBJbnRSZWN0JiB0aGlzTGluZSwgY29u
c3QgSW50UmVjdCYgbmV4dExpbmUpOwotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBjb250aW51
YXRpb25CZWZvcmUoUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCk7CiAKICAgICBSZW5kZXJPYmpl
Y3RDaGlsZExpc3QgbV9jaGlsZHJlbjsKICAgICBSZW5kZXJMaW5lQm94TGlzdCBtX2xpbmVCb3hl
czsgICAvLyBBbGwgb2YgdGhlIGxpbmUgYm94ZXMgY3JlYXRlZCBmb3IgdGhpcyBpbmxpbmUgZmxv
dy4gIEZvciBleGFtcGxlLCA8aT5IZWxsbzxicj53b3JsZC48L2k+IHdpbGwgaGF2ZSB0d28gPGk+
IGxpbmUgYm94ZXMuCiAKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogbV9jb250aW51YXRpb247
IC8vIENhbiBiZSBlaXRoZXIgYSBibG9jayBvciBhbiBpbmxpbmUuIDxiPjxpPjxwPkhlbGxvPC9w
PjwvaT48L2I+LiBJbiB0aGlzIGV4YW1wbGUgdGhlIDxpPiB3aWxsIGhhdmUgYSBibG9jayBhcyBp
dHMgY29udGludWF0aW9uIGJ1dCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIC8vIDxiPiB3aWxsIGp1c3QgaGF2ZSBhbiBpbmxpbmUgYXMgaXRzIGNvbnRpbnVh
dGlvbi4KICAgICBtdXRhYmxlIGludCBtX2xpbmVIZWlnaHQ7CiAgICAgbXV0YWJsZSBpbnQgbV92
ZXJ0aWNhbFBvc2l0aW9uOwogfTsKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckxpbmVC
b3hMaXN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMaW5lQm94
TGlzdC5jcHAJKHJldmlzaW9uIDU0NTYxKQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGlu
ZUJveExpc3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNDYsMTggKzE0NiwxOCBAQCB2b2lkIFJl
bmRlckxpbmVCb3hMaXN0OjpkaXJ0eUxpbmVCb3hlcygpCiAKIHZvaWQgUmVuZGVyTGluZUJveExp
c3Q6OnBhaW50KFJlbmRlckJveE1vZGVsT2JqZWN0KiByZW5kZXJlciwgUmVuZGVyT2JqZWN0OjpQ
YWludEluZm8mIHBhaW50SW5mbywgaW50IHR4LCBpbnQgdHkpIGNvbnN0CiB7Ci0gICAgLy8gT25s
eSBwYWludCBkdXJpbmcgdGhlIGZvcmVncm91bmQvc2VsZWN0aW9uIHBoYXNlcy4KLSAgICBpZiAo
cGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VGb3JlZ3JvdW5kICYmIHBhaW50SW5mby5waGFz
ZSAhPSBQYWludFBoYXNlU2VsZWN0aW9uICYmIHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNl
T3V0bGluZSAKLSAgICAgICAgJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VTZWxmT3V0
bGluZSAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZUNoaWxkT3V0bGluZXMgJiYgcGFp
bnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VUZXh0Q2xpcAotICAgICAgICAmJiBwYWludEluZm8u
cGhhc2UgIT0gUGFpbnRQaGFzZU1hc2spCi0gICAgICAgIHJldHVybjsKLQogICAgIEFTU0VSVChy
ZW5kZXJlci0+aXNSZW5kZXJCbG9jaygpIHx8IChyZW5kZXJlci0+aXNSZW5kZXJJbmxpbmUoKSAm
JiByZW5kZXJlci0+aGFzTGF5ZXIoKSkpOyAvLyBUaGUgb25seSB3YXkgYW4gaW5saW5lIGNvdWxk
IHBhaW50IGxpa2UgdGhpcyBpcyBpZiBpdCBoYXMgYSBsYXllci4KIAogICAgIC8vIElmIHdlIGhh
dmUgbm8gbGluZXMgdGhlbiB3ZSBoYXZlIG5vIHdvcmsgdG8gZG8uCiAgICAgaWYgKCFmaXJzdExp
bmVCb3goKSkKICAgICAgICAgcmV0dXJuOwogCisgICAgLy8gT25seSBwYWludCBkdXJpbmcgdGhl
IGZvcmVncm91bmQvc2VsZWN0aW9uIHBoYXNlcyBpZiB3ZSBoYXZlIGEgbGF5ZXIuICBPdGhlcndp
c2Ugd2UgbWlnaHQgaGF2ZSBhbiBhbm9ueW1vdXMgaW5saW5lIGJsb2NrLCBzbyB3ZSBjYW4ndCBz
aG9ydCBjaXJjdWl0LgorICAgIGlmIChmaXJzdExpbmVCb3goKS0+cGFyZW50KCkgJiYgKHBhaW50
SW5mby5waGFzZSAhPSBQYWludFBoYXNlRm9yZWdyb3VuZCAmJiBwYWludEluZm8ucGhhc2UgIT0g
UGFpbnRQaGFzZVNlbGVjdGlvbiAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZU91dGxp
bmUgCisgICAgICAgICYmIHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlU2VsZk91dGxpbmUg
JiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VDaGlsZE91dGxpbmVzICYmIHBhaW50SW5m
by5waGFzZSAhPSBQYWludFBoYXNlVGV4dENsaXAKKyAgICAgICAgJiYgcGFpbnRJbmZvLnBoYXNl
ICE9IFBhaW50UGhhc2VNYXNrKSkKKyAgICAgICAgcmV0dXJuOworCiAgICAgLy8gV2UgY2FuIGNo
ZWNrIHRoZSBmaXJzdCBib3ggYW5kIGxhc3QgYm94IGFuZCBhdm9pZCBwYWludGluZyBpZiB3ZSBk
b24ndAogICAgIC8vIGludGVyc2VjdC4gIFRoaXMgaXMgYSBxdWljayBzaG9ydC1jaXJjdWl0IHRo
YXQgd2UgY2FuIHRha2UgdG8gYXZvaWQgd2Fsa2luZyBhbnkgbGluZXMuCiAgICAgLy8gRklYTUU6
IFRoaXMgY2hlY2sgaXMgZmxhd2VkIGluIHRoZSBmb2xsb3dpbmcgZXh0cmVtZWx5IG9ic2N1cmUg
d2F5OgpAQCAtMjE3LDM1ICsyMTcsNDcgQEAgdm9pZCBSZW5kZXJMaW5lQm94TGlzdDo6cGFpbnQo
UmVuZGVyQm94TQogCiBib29sIFJlbmRlckxpbmVCb3hMaXN0OjpoaXRUZXN0KFJlbmRlckJveE1v
ZGVsT2JqZWN0KiByZW5kZXJlciwgY29uc3QgSGl0VGVzdFJlcXVlc3QmIHJlcXVlc3QsIEhpdFRl
c3RSZXN1bHQmIHJlc3VsdCwgaW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSwgSGl0VGVzdEFj
dGlvbiBoaXRUZXN0QWN0aW9uKSBjb25zdAogewotICAgIGlmIChoaXRUZXN0QWN0aW9uICE9IEhp
dFRlc3RGb3JlZ3JvdW5kKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KICAgICBBU1NFUlQocmVu
ZGVyZXItPmlzUmVuZGVyQmxvY2soKSB8fCAocmVuZGVyZXItPmlzUmVuZGVySW5saW5lKCkgJiYg
cmVuZGVyZXItPmhhc0xheWVyKCkpKTsgLy8gVGhlIG9ubHkgd2F5IGFuIGlubGluZSBjb3VsZCBo
aXQgdGVzdCBsaWtlIHRoaXMgaXMgaWYgaXQgaGFzIGEgbGF5ZXIuCiAKICAgICAvLyBJZiB3ZSBo
YXZlIG5vIGxpbmVzIHRoZW4gd2UgaGF2ZSBubyB3b3JrIHRvIGRvLgogICAgIGlmICghZmlyc3RM
aW5lQm94KCkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKIAorICAgIC8vIE9ubHkgaGl0IHRlc3Qg
ZHVyaW5nIHRoZSBmb3JlZ3JvdW5kIHBoYXNlIGlmIHdlIGhhdmUgYSBsYXllci4gIE90aGVyd2lz
ZSB3ZSBtaWdodCBoYXZlIGFuIGFub255bW91cyBpbmxpbmUgYmxvY2ssIHNvIHdlIGNhbid0IHNo
b3J0IGNpcmN1aXQuCisgICAgaWYgKGZpcnN0TGluZUJveCgpLT5wYXJlbnQoKSAmJiBoaXRUZXN0
QWN0aW9uICE9IEhpdFRlc3RGb3JlZ3JvdW5kKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKICAg
ICAvLyBXZSBjYW4gY2hlY2sgdGhlIGZpcnN0IGJveCBhbmQgbGFzdCBib3ggYW5kIGF2b2lkIGhp
dCB0ZXN0aW5nIGlmIHdlIGRvbid0CiAgICAgLy8gY29udGFpbiB0aGUgcG9pbnQuICBUaGlzIGlz
IGEgcXVpY2sgc2hvcnQtY2lyY3VpdCB0aGF0IHdlIGNhbiB0YWtlIHRvIGF2b2lkIHdhbGtpbmcg
YW55IGxpbmVzLgogICAgIC8vIEZJWE1FOiBUaGlzIGNoZWNrIGlzIGZsYXdlZCBpbiB0aGUgZm9s
bG93aW5nIGV4dHJlbWVseSBvYnNjdXJlIHdheToKICAgICAvLyBpZiBzb21lIGxpbmUgaW4gdGhl
IG1pZGRsZSBoYXMgYSBodWdlIG92ZXJmbG93LCBpdCBtaWdodCBhY3R1YWxseSBleHRlbmQgYmVs
b3cgdGhlIGxhc3QgbGluZS4KLSAgICBpZiAoKHkgPj0gdHkgKyBsYXN0TGluZUJveCgpLT5yb290
KCktPmJvdHRvbVZpc2libGVPdmVyZmxvdygpKSB8fCAoeSA8IHR5ICsgZmlyc3RMaW5lQm94KCkt
PnJvb3QoKS0+dG9wVmlzaWJsZU92ZXJmbG93KCkpKQorICAgIFJvb3RJbmxpbmVCb3gqIGZpcnN0
Um9vdCA9IGZpcnN0TGluZUJveCgpLT5yb290KCk7CisgICAgUm9vdElubGluZUJveCogbGFzdFJv
b3QgPSBsYXN0TGluZUJveCgpLT5yb290KCk7CisgICAgaW50IHRvcCA9IGZpcnN0Um9vdC0+dG9w
VmlzaWJsZU92ZXJmbG93KCk7CisgICAgaW50IGJvdHRvbSA9IGxhc3RSb290LT5ib3R0b21WaXNp
YmxlT3ZlcmZsb3coKTsKKyAgICBpZiAobGFzdFJvb3QtPmFub255bW91c0lubGluZUJsb2NrKCkp
CisgICAgICAgIGJvdHRvbSA9IG1heChib3R0b20sIGJvdHRvbSArIGxhc3RSb290LT5hbm9ueW1v
dXNJbmxpbmVCbG9jaygpLT5jb2xsYXBzZWRNYXJnaW5Cb3R0b20oKSk7CisgICAgaWYgKGZpcnN0
Um9vdC0+YW5vbnltb3VzSW5saW5lQmxvY2soKSkKKyAgICAgICAgdG9wID0gbWluKHRvcCwgdG9w
ICsgZmlyc3RSb290LT5hbm9ueW1vdXNJbmxpbmVCbG9jaygpLT5jb2xsYXBzZWRNYXJnaW5Ub3Ao
KSk7CisgICAgaWYgKCh5ID49IHR5ICsgYm90dG9tKSB8fCAoeSA8IHR5ICsgdG9wKSkKICAgICAg
ICAgcmV0dXJuIGZhbHNlOwogCiAgICAgLy8gU2VlIGlmIG91ciByb290IGxpbmVzIGNvbnRhaW4g
dGhlIHBvaW50LiAgSWYgc28sIHRoZW4gd2UgaGl0IHRlc3QKICAgICAvLyB0aGVtIGZ1cnRoZXIu
ICBOb3RlIHRoYXQgYm94ZXMgY2FuIGVhc2lseSBvdmVybGFwLCBzbyB3ZSBjYW4ndCBtYWtlIGFu
eSBhc3N1bXB0aW9ucwogICAgIC8vIGJhc2VkIG9mZiBwb3NpdGlvbnMgb2Ygb3VyIGZpcnN0IGxp
bmUgYm94IG9yIG91ciBsYXN0IGxpbmUgYm94LgogICAgIGZvciAoSW5saW5lRmxvd0JveCogY3Vy
ciA9IGxhc3RMaW5lQm94KCk7IGN1cnI7IGN1cnIgPSBjdXJyLT5wcmV2Rmxvd0JveCgpKSB7Ci0g
ICAgICAgIGlmICh5ID49IHR5ICsgY3Vyci0+cm9vdCgpLT50b3BWaXNpYmxlT3ZlcmZsb3coKSAm
JiB5IDwgdHkgKyBjdXJyLT5yb290KCktPmJvdHRvbVZpc2libGVPdmVyZmxvdygpKSB7Ci0gICAg
ICAgICAgICBib29sIGluc2lkZSA9IGN1cnItPm5vZGVBdFBvaW50KHJlcXVlc3QsIHJlc3VsdCwg
eCwgeSwgdHgsIHR5KTsKKyAgICAgICAgUm9vdElubGluZUJveCogY3VyclJvb3QgPSBjdXJyLT5y
b290KCk7CisgICAgICAgIGludCB0b3AgPSBjdXJyUm9vdC0+dG9wVmlzaWJsZU92ZXJmbG93KCk7
CisgICAgICAgIGludCBib3R0b20gPSBjdXJyUm9vdC0+Ym90dG9tVmlzaWJsZU92ZXJmbG93KCk7
CisgICAgICAgIGlmICh5ID49IHR5ICsgdG9wICYmIHkgPCB0eSArIGJvdHRvbSkgeworICAgICAg
ICAgICAgYm9vbCBpbnNpZGUgPSBjdXJyLT5ub2RlQXRQb2ludChyZXF1ZXN0LCByZXN1bHQsIHgs
IHksIHR4LCB0eSwgaGl0VGVzdEFjdGlvbik7CiAgICAgICAgICAgICBpZiAoaW5zaWRlKSB7CiAg
ICAgICAgICAgICAgICAgcmVuZGVyZXItPnVwZGF0ZUhpdFRlc3RSZXN1bHQocmVzdWx0LCBJbnRQ
b2ludCh4IC0gdHgsIHkgLSB0eSkpOwogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAg
ICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcmV0dXJuIGZhbHNlOwog
fQogCkBAIC0yOTcsNiArMzA5LDEwIEBAIHZvaWQgUmVuZGVyTGluZUJveExpc3Q6OmRpcnR5TGlu
ZXNGcm9tQ2gKICAgICAgICAgUm9vdElubGluZUJveCogYWRqYWNlbnRCb3g7CiAgICAgICAgIGJv
eC0+bWFya0RpcnR5KCk7CiAKKyAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byBkaXJ0eSBhbnkg
b3RoZXIgbGluZXMuCisgICAgICAgIGlmIChib3gtPmFub255bW91c0lubGluZUJsb2NrKCkpCisg
ICAgICAgICAgICByZXR1cm47CisKICAgICAgICAgLy8gZGlydHkgdGhlIGFkamFjZW50IGxpbmVz
IHRoYXQgbWlnaHQgYmUgYWZmZWN0ZWQKICAgICAgICAgLy8gTk9URTogd2UgZGlydHkgdGhlIHBy
ZXZpb3VzIGxpbmUgYmVjYXVzZSBSb290SW5saW5lQm94IG9iamVjdHMgY2FjaGUKICAgICAgICAg
Ly8gdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IG9iamVjdCBvbiB0aGUgbmV4dCBsaW5lIGFmdGVy
IGEgQlIsIHdoaWNoIHdlIG1heSBiZQpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGlz
dEl0ZW0uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckxpc3RJdGVt
LmNwcAkocmV2aXNpb24gNTQ1NjEpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMaXN0SXRl
bS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI3LDYgKzI3LDggQEAKICNpbmNsdWRlICJDYWNoZWRJ
bWFnZS5oIgogI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgogI2luY2x1ZGUgIkhUTUxPTGlzdEVsZW1l
bnQuaCIKKyNpbmNsdWRlICJJbmxpbmVJdGVyYXRvci5oIgorCiAjaW5jbHVkZSAiUmVuZGVyTGlz
dE1hcmtlci5oIgogI2luY2x1ZGUgIlJlbmRlclZpZXcuaCIKICNpbmNsdWRlIDx3dGYvU3RkTGli
RXh0cmFzLmg+CkBAIC0xNTMsMTggKzE1NSw0NCBAQCBib29sIFJlbmRlckxpc3RJdGVtOjppc0Vt
cHR5KCkgY29uc3QKICAgICByZXR1cm4gbGFzdENoaWxkKCkgPT0gbV9tYXJrZXI7CiB9CiAKLXN0
YXRpYyBSZW5kZXJPYmplY3QqIGdldFBhcmVudE9mRmlyc3RMaW5lQm94KFJlbmRlckJsb2NrKiBj
dXJyLCBSZW5kZXJPYmplY3QqIG1hcmtlcikKK3ZvaWQgUmVuZGVyTGlzdEl0ZW06OnVwZGF0ZVZh
bHVlKCkKIHsKLSAgICBSZW5kZXJPYmplY3QqIGZpcnN0Q2hpbGQgPSBjdXJyLT5maXJzdENoaWxk
KCk7Ci0gICAgaWYgKCFmaXJzdENoaWxkKQotICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIW1f
aGFzRXhwbGljaXRWYWx1ZSkgeworICAgICAgICBtX2lzVmFsdWVVcFRvRGF0ZSA9IGZhbHNlOwor
ICAgICAgICBpZiAobV9tYXJrZXIpCisgICAgICAgICAgICBtX21hcmtlci0+c2V0TmVlZHNMYXlv
dXRBbmRQcmVmV2lkdGhzUmVjYWxjKCk7CisgICAgfQorfQogCi0gICAgZm9yIChSZW5kZXJPYmpl
Y3QqIGN1cnJDaGlsZCA9IGZpcnN0Q2hpbGQ7IGN1cnJDaGlsZDsgY3VyckNoaWxkID0gY3VyckNo
aWxkLT5uZXh0U2libGluZygpKSB7CitzdGF0aWMgUmVuZGVyT2JqZWN0KiBmaXJzdE5vbk1hcmtl
ckNoaWxkKFJlbmRlck9iamVjdCogcGFyZW50KQoreworICAgIFJlbmRlck9iamVjdCogcmVzdWx0
ID0gcGFyZW50LT5maXJzdENoaWxkKCk7CisgICAgd2hpbGUgKHJlc3VsdCAmJiByZXN1bHQtPmlz
TGlzdE1hcmtlcigpKQorICAgICAgICByZXN1bHQgPSByZXN1bHQtPm5leHRTaWJsaW5nKCk7Cisg
ICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMgUmVuZGVyQmxvY2sqIGxpc3RNYXJrZXJM
b2NhdGlvbihSZW5kZXJCbG9jayogYmxvY2ssIFJlbmRlckxpc3RNYXJrZXIqIG1hcmtlcikKK3sK
KyAgICBmb3IgKFJlbmRlck9iamVjdCogY3VyckNoaWxkID0gYmxvY2stPmZpcnN0Q2hpbGQoKTsg
Y3VyckNoaWxkOyBjdXJyQ2hpbGQgPSBjdXJyQ2hpbGQtPm5leHRTaWJsaW5nKCkpIHsKICAgICAg
ICAgaWYgKGN1cnJDaGlsZCA9PSBtYXJrZXIpCiAgICAgICAgICAgICBjb250aW51ZTsKIAotICAg
ICAgICBpZiAoY3VyckNoaWxkLT5pc0lubGluZSgpICYmICghY3VyckNoaWxkLT5pc1JlbmRlcklu
bGluZSgpIHx8IGN1cnItPmdlbmVyYXRlc0xpbmVCb3hlc0ZvcklubGluZUNoaWxkKGN1cnJDaGls
ZCkpKQotICAgICAgICAgICAgcmV0dXJuIGN1cnI7CisgICAgICAgIGlmIChjdXJyQ2hpbGQtPmlz
SW5saW5lKCkpIHsKKyAgICAgICAgICAgIGlmICghY3VyckNoaWxkLT5pc1JlbmRlcklubGluZSgp
KQorICAgICAgICAgICAgICAgIHJldHVybiBibG9jazsKKyAgICAgICAgICAgIElubGluZUl0ZXJh
dG9yIGl0KGJsb2NrLCBjdXJyQ2hpbGQsIDApOworICAgICAgICAgICAgd2hpbGUgKCFpdC5hdEVu
ZCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGl0Lm9iai0+aXNBbm9ueW1vdXNJbmxpbmVCbG9j
aygpKSB7CisgICAgICAgICAgICAgICAgICAgIFJlbmRlckJsb2NrKiBsaW5lQm94UGFyZW50ID0g
bGlzdE1hcmtlckxvY2F0aW9uKHRvUmVuZGVyQmxvY2soaXQub2JqKSwgbWFya2VyKTsKKyAgICAg
ICAgICAgICAgICAgICAgaWYgKGxpbmVCb3hQYXJlbnQpCisgICAgICAgICAgICAgICAgICAgICAg
ICByZXR1cm4gbGluZUJveFBhcmVudDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFJlbmRl
ckJsb2NrOjpyZXF1aXJlc0xpbmVCb3goaXQpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4g
YmxvY2s7CisgICAgICAgICAgICAgICAgaXQuaW5jcmVtZW50KCk7CisgICAgICAgICAgICB9Cisg
ICAgICAgIH0KIAogICAgICAgICBpZiAoY3VyckNoaWxkLT5pc0Zsb2F0aW5nKCkgfHwgY3VyckNo
aWxkLT5pc1Bvc2l0aW9uZWQoKSkKICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtMTcyLDQxICsy
MDAsMjQgQEAgc3RhdGljIFJlbmRlck9iamVjdCogZ2V0UGFyZW50T2ZGaXJzdExpbgogICAgICAg
ICBpZiAoY3VyckNoaWxkLT5pc1RhYmxlKCkgfHwgIWN1cnJDaGlsZC0+aXNSZW5kZXJCbG9jaygp
KQogICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgaWYgKGN1cnItPmlzTGlzdEl0ZW0oKSAm
JiBjdXJyQ2hpbGQtPnN0eWxlKCktPmh0bWxIYWNrcygpICYmIGN1cnJDaGlsZC0+bm9kZSgpICYm
Ci0gICAgICAgICAgICAoY3VyckNoaWxkLT5ub2RlKCktPmhhc1RhZ05hbWUodWxUYWcpfHwgY3Vy
ckNoaWxkLT5ub2RlKCktPmhhc1RhZ05hbWUob2xUYWcpKSkKKyAgICAgICAgaWYgKGJsb2NrLT5p
c0xpc3RJdGVtKCkgJiYgY3VyckNoaWxkLT5zdHlsZSgpLT5odG1sSGFja3MoKSAmJiBjdXJyQ2hp
bGQtPm5vZGUoKSAmJgorICAgICAgICAgICAgKGN1cnJDaGlsZC0+bm9kZSgpLT5oYXNUYWdOYW1l
KHVsVGFnKSB8fCBjdXJyQ2hpbGQtPm5vZGUoKS0+aGFzVGFnTmFtZShvbFRhZykpKQogICAgICAg
ICAgICAgYnJlYWs7CiAKLSAgICAgICAgUmVuZGVyT2JqZWN0KiBsaW5lQm94ID0gZ2V0UGFyZW50
T2ZGaXJzdExpbmVCb3godG9SZW5kZXJCbG9jayhjdXJyQ2hpbGQpLCBtYXJrZXIpOwotICAgICAg
ICBpZiAobGluZUJveCkKLSAgICAgICAgICAgIHJldHVybiBsaW5lQm94OworICAgICAgICBSZW5k
ZXJCbG9jayogbGluZUJveFBhcmVudCA9IGxpc3RNYXJrZXJMb2NhdGlvbih0b1JlbmRlckJsb2Nr
KGN1cnJDaGlsZCksIG1hcmtlcik7CisgICAgICAgIGlmIChsaW5lQm94UGFyZW50KQorICAgICAg
ICAgICAgcmV0dXJuIGxpbmVCb3hQYXJlbnQ7CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CiB9CiAK
LXZvaWQgUmVuZGVyTGlzdEl0ZW06OnVwZGF0ZVZhbHVlKCkKLXsKLSAgICBpZiAoIW1faGFzRXhw
bGljaXRWYWx1ZSkgewotICAgICAgICBtX2lzVmFsdWVVcFRvRGF0ZSA9IGZhbHNlOwotICAgICAg
ICBpZiAobV9tYXJrZXIpCi0gICAgICAgICAgICBtX21hcmtlci0+c2V0TmVlZHNMYXlvdXRBbmRQ
cmVmV2lkdGhzUmVjYWxjKCk7Ci0gICAgfQotfQotCi1zdGF0aWMgUmVuZGVyT2JqZWN0KiBmaXJz
dE5vbk1hcmtlckNoaWxkKFJlbmRlck9iamVjdCogcGFyZW50KQotewotICAgIFJlbmRlck9iamVj
dCogcmVzdWx0ID0gcGFyZW50LT5maXJzdENoaWxkKCk7Ci0gICAgd2hpbGUgKHJlc3VsdCAmJiBy
ZXN1bHQtPmlzTGlzdE1hcmtlcigpKQotICAgICAgICByZXN1bHQgPSByZXN1bHQtPm5leHRTaWJs
aW5nKCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQogdm9pZCBSZW5kZXJMaXN0SXRlbTo6dXBk
YXRlTWFya2VyTG9jYXRpb24oKQogewogICAgIC8vIFNhbml0eSBjaGVjayB0aGUgbG9jYXRpb24g
b2Ygb3VyIG1hcmtlci4KICAgICBpZiAobV9tYXJrZXIpIHsKICAgICAgICAgUmVuZGVyT2JqZWN0
KiBtYXJrZXJQYXIgPSBtX21hcmtlci0+cGFyZW50KCk7Ci0gICAgICAgIFJlbmRlck9iamVjdCog
bGluZUJveFBhcmVudCA9IGdldFBhcmVudE9mRmlyc3RMaW5lQm94KHRoaXMsIG1fbWFya2VyKTsK
KyAgICAgICAgUmVuZGVyT2JqZWN0KiBsaW5lQm94UGFyZW50ID0gbGlzdE1hcmtlckxvY2F0aW9u
KHRoaXMsIG1fbWFya2VyKTsKICAgICAgICAgaWYgKCFsaW5lQm94UGFyZW50KSB7CiAgICAgICAg
ICAgICAvLyBJZiB0aGUgbWFya2VyIGlzIGN1cnJlbnRseSBjb250YWluZWQgaW5zaWRlIGFuIGFu
b255bW91cyBib3gsCiAgICAgICAgICAgICAvLyB0aGVuIHdlIGFyZSB0aGUgb25seSBpdGVtIGlu
IHRoYXQgYW5vbnltb3VzIGJveCAoc2luY2Ugbm8gbGluZSBib3gKQEAgLTI1Nyw5ICsyNjgsMTEg
QEAgdm9pZCBSZW5kZXJMaXN0SXRlbTo6cG9zaXRpb25MaXN0TWFya2VyKAogICAgICAgICBpbnQg
bWFya2VyT2xkWCA9IG1fbWFya2VyLT54KCk7CiAgICAgICAgIGludCB5T2Zmc2V0ID0gMDsKICAg
ICAgICAgaW50IHhPZmZzZXQgPSAwOwotICAgICAgICBmb3IgKFJlbmRlckJveCogbyA9IG1fbWFy
a2VyLT5wYXJlbnRCb3goKTsgbyAhPSB0aGlzOyBvID0gby0+cGFyZW50Qm94KCkpIHsKLSAgICAg
ICAgICAgIHlPZmZzZXQgKz0gby0+eSgpOwotICAgICAgICAgICAgeE9mZnNldCArPSBvLT54KCk7
CisgICAgICAgIGZvciAoUmVuZGVyT2JqZWN0KiBvID0gbV9tYXJrZXItPnBhcmVudCgpOyBvICE9
IHRoaXM7IG8gPSBvLT5wYXJlbnQoKSkgeworICAgICAgICAgICAgaWYgKG8tPmlzQm94KCkpIHsK
KyAgICAgICAgICAgICAgICB5T2Zmc2V0ICs9IHRvUmVuZGVyQm94KG8pLT55KCk7CisgICAgICAg
ICAgICAgICAgeE9mZnNldCArPSB0b1JlbmRlckJveChvKS0+eCgpOworICAgICAgICAgICAgfQog
ICAgICAgICB9CiAKICAgICAgICAgYm9vbCBhZGp1c3RPdmVyZmxvdyA9IGZhbHNlOwpAQCAtMjk1
LDEzICszMDgsMTQgQEAgdm9pZCBSZW5kZXJMaXN0SXRlbTo6cG9zaXRpb25MaXN0TWFya2VyKAog
CiAgICAgICAgIGlmIChhZGp1c3RPdmVyZmxvdykgewogICAgICAgICAgICAgSW50UmVjdCBtYXJr
ZXJSZWN0KG1hcmtlclhQb3MgKyB4T2Zmc2V0LCB5T2Zmc2V0LCBtX21hcmtlci0+d2lkdGgoKSwg
bV9tYXJrZXItPmhlaWdodCgpKTsKLSAgICAgICAgICAgIFJlbmRlckJveCogbyA9IG1fbWFya2Vy
OworICAgICAgICAgICAgUmVuZGVyT2JqZWN0KiBvID0gbV9tYXJrZXI7CiAgICAgICAgICAgICBk
byB7Ci0gICAgICAgICAgICAgICAgbyA9IG8tPnBhcmVudEJveCgpOworICAgICAgICAgICAgICAg
IG8gPSBvLT5wYXJlbnQoKTsKICAgICAgICAgICAgICAgICBpZiAoby0+aXNSZW5kZXJCbG9jaygp
KQogICAgICAgICAgICAgICAgICAgICB0b1JlbmRlckJsb2NrKG8pLT5hZGRMYXlvdXRPdmVyZmxv
dyhtYXJrZXJSZWN0KTsKLSAgICAgICAgICAgICAgICBtYXJrZXJSZWN0Lm1vdmUoLW8tPngoKSwg
LW8tPnkoKSk7Ci0gICAgICAgICAgICB9IHdoaWxlIChvICE9IHRoaXMgJiYgIW8tPmhhc1NlbGZQ
YWludGluZ0xheWVyKCkpOworICAgICAgICAgICAgICAgIGlmIChvLT5pc0JveCgpKQorICAgICAg
ICAgICAgICAgICAgICBtYXJrZXJSZWN0Lm1vdmUoLXRvUmVuZGVyQm94KG8pLT54KCksIC10b1Jl
bmRlckJveChvKS0+eSgpKTsKKyAgICAgICAgICAgIH0gd2hpbGUgKG8gIT0gdGhpcyAmJiAoIW8t
PmlzQm94KCkgfHwgIXRvUmVuZGVyQm94KG8pLT5oYXNTZWxmUGFpbnRpbmdMYXllcigpKSk7IC8v
IEZJWE1FOiBJbnZlc3RpZ2F0ZSA8bGk+PHNwYW4gc3R5bGU9InBvc2l0aW9uOnJlbGF0aXZlO2xl
ZnQ6LTEwMHB4Ij48ZGl2PnRleHQ8L2Rpdj48L3NwYW4+PC9saT4KICAgICAgICAgfQogICAgIH0K
IH0KSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdC5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmNwcAkocmV2aXNpb24gNTQ1NjEpCisr
KyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0y
MjMwLDggKzIyMzAsNiBAQCB2b2lkIFJlbmRlck9iamVjdDo6Z2V0VGV4dERlY29yYXRpb25Db2xv
CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgY3VyciA9IGN1cnItPnBhcmVudCgp
OwotICAgICAgICBpZiAoY3VyciAmJiBjdXJyLT5pc1JlbmRlckJsb2NrKCkgJiYgdG9SZW5kZXJC
bG9jayhjdXJyKS0+aW5saW5lQ29udGludWF0aW9uKCkpCi0gICAgICAgICAgICBjdXJyID0gdG9S
ZW5kZXJCbG9jayhjdXJyKS0+aW5saW5lQ29udGludWF0aW9uKCk7CiAgICAgfSB3aGlsZSAoY3Vy
ciAmJiBkZWNvcmF0aW9ucyAmJiAoIXF1aXJrc01vZGUgfHwgIWN1cnItPm5vZGUoKSB8fAogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghY3Vyci0+bm9kZSgpLT5oYXNUYWdO
YW1lKGFUYWcpICYmICFjdXJyLT5ub2RlKCktPmhhc1RhZ05hbWUoZm9udFRhZykpKSk7CiAKSW5k
ZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdC5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdC5oCShyZXZpc2lvbiA1NDU2MSkKKysrIFdlYkNvcmUv
cmVuZGVyaW5nL1JlbmRlck9iamVjdC5oCSh3b3JraW5nIGNvcHkpCkBAIC0zNjYsNiArMzY2LDEw
IEBAIHB1YmxpYzoKICAgICB7CiAgICAgICAgIHJldHVybiBtX2lzQW5vbnltb3VzICYmIHN0eWxl
KCktPmRpc3BsYXkoKSA9PSBCTE9DSyAmJiBzdHlsZSgpLT5zdHlsZVR5cGUoKSA9PSBOT1BTRVVE
TyAmJiAhaXNMaXN0TWFya2VyKCk7CiAgICAgfQorICAgIGJvb2wgaXNBbm9ueW1vdXNJbmxpbmVC
bG9jaygpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV9pc0Fub255bW91cyAmJiBzdHls
ZSgpLT5kaXNwbGF5KCkgPT0gSU5MSU5FX0JMT0NLICYmIHN0eWxlKCktPnN0eWxlVHlwZSgpID09
IE5PUFNFVURPICYmICFpc1J1YnlSdW4oKSAmJiAhaXNSdWJ5QmFzZSgpOworICAgIH0KICAgICBi
b29sIGlzSW5saW5lQ29udGludWF0aW9uKCkgY29uc3QgeyByZXR1cm4gKG5vZGUoKSA/IG5vZGUo
KS0+cmVuZGVyZXIoKSAhPSB0aGlzIDogZmFsc2UpICYmIGlzUmVuZGVySW5saW5lKCk7IH0KICAg
ICBib29sIGlzRmxvYXRpbmcoKSBjb25zdCB7IHJldHVybiBtX2Zsb2F0aW5nOyB9CiAgICAgYm9v
bCBpc1Bvc2l0aW9uZWQoKSBjb25zdCB7IHJldHVybiBtX3Bvc2l0aW9uZWQ7IH0gLy8gYWJzb2x1
dGUgb3IgZml4ZWQgcG9zaXRpb25pbmcKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlck9i
amVjdENoaWxkTGlzdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVy
T2JqZWN0Q2hpbGRMaXN0LmNwcAkocmV2aXNpb24gNTQ1NjEpCisrKyBXZWJDb3JlL3JlbmRlcmlu
Zy9SZW5kZXJPYmplY3RDaGlsZExpc3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMTYsMTYgKzMx
Niw2IEBAIHZvaWQgUmVuZGVyT2JqZWN0Q2hpbGRMaXN0Ojp1cGRhdGVCZWZvcmUKIAogICAgIC8v
IFdoZXRoZXIgb3Igbm90IHdlIG5vdyB3YW50IGdlbmVyYXRlZCBjb250ZW50LiAgCiAgICAgYm9v
bCBuZXdDb250ZW50V2FudGVkID0gcHNldWRvRWxlbWVudFN0eWxlICYmIHBzZXVkb0VsZW1lbnRT
dHlsZS0+ZGlzcGxheSgpICE9IE5PTkU7Ci0KLSAgICAvLyBGb3IgPHE+PHAvPjwvcT4sIGlmIHRo
aXMgb2JqZWN0IGlzIHRoZSBpbmxpbmUgY29udGludWF0aW9uIG9mIHRoZSA8cT4sIHdlIG9ubHkg
d2FudCB0byBnZW5lcmF0ZQotICAgIC8vIDphZnRlciBjb250ZW50IGFuZCBub3QgOmJlZm9yZSBj
b250ZW50LgotICAgIGlmIChuZXdDb250ZW50V2FudGVkICYmIHR5cGUgPT0gQkVGT1JFICYmIG93
bmVyLT5pc1JlbmRlcklubGluZSgpICYmIHRvUmVuZGVySW5saW5lKG93bmVyKS0+aXNJbmxpbmVD
b250aW51YXRpb24oKSkKLSAgICAgICAgbmV3Q29udGVudFdhbnRlZCA9IGZhbHNlOwotCi0gICAg
Ly8gU2ltaWxhcmx5LCBpZiB3ZSdyZSB0aGUgYmVnaW5uaW5nIG9mIGEgPHE+LCBhbmQgdGhlcmUn
cyBhbiBpbmxpbmUgY29udGludWF0aW9uIGZvciBvdXIgb2JqZWN0LAotICAgIC8vIHRoZW4gd2Ug
ZG9uJ3QgZ2VuZXJhdGUgdGhlIDphZnRlciBjb250ZW50LgotICAgIGlmIChuZXdDb250ZW50V2Fu
dGVkICYmIHR5cGUgPT0gQUZURVIgJiYgb3duZXItPmlzUmVuZGVySW5saW5lKCkgJiYgdG9SZW5k
ZXJJbmxpbmUob3duZXIpLT5jb250aW51YXRpb24oKSkKLSAgICAgICAgbmV3Q29udGVudFdhbnRl
ZCA9IGZhbHNlOwogICAgIAogICAgIC8vIElmIHdlIGRvbid0IHdhbnQgZ2VuZXJhdGVkIGNvbnRl
bnQgYW55IGxvbmdlciwgb3IgaWYgd2UgaGF2ZSBnZW5lcmF0ZWQgY29udGVudCwgYnV0IGl0J3Mg
bm8gbG9uZ2VyCiAgICAgLy8gaWRlbnRpY2FsIHRvIHRoZSBuZXcgY29udGVudCBkYXRhIHdlIHdh
bnQgdG8gYnVpbGQgcmVuZGVyIG9iamVjdHMgZm9yLCB0aGVuIHdlIG51a2UgYWxsCkluZGV4OiBX
ZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJSdWJ5QmFzZS5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVyUnVieUJhc2UuY3BwCShyZXZpc2lvbiA1NDU2MSkKKysrIFdlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlclJ1YnlCYXNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTE2LDcg
KzExNiw2IEBAIHZvaWQgUmVuZGVyUnVieUJhc2U6Om1vdmVCbG9ja0NoaWxkcmVuKFIKICAgICAg
ICAgICAgICAgICBpZiAoY2hpbGQtPmlzQW5vbnltb3VzQmxvY2soKSkgewogICAgICAgICAgICAg
ICAgICAgICBSZW5kZXJCbG9jayogYW5vbkJsb2NrID0gdG9SZW5kZXJCbG9jayhjaGlsZCk7CiAg
ICAgICAgICAgICAgICAgICAgIEFTU0VSVChhbm9uQmxvY2stPmNoaWxkcmVuSW5saW5lKCkpOwot
ICAgICAgICAgICAgICAgICAgICBBU1NFUlQoIWFub25CbG9jay0+aW5saW5lQ29udGludWF0aW9u
KCkpOwogICAgICAgICAgICAgICAgICAgICBhbm9uQmxvY2stPm1vdmVBbGxDaGlsZHJlblRvKHRv
QmFzZSwgdG9CYXNlLT5jaGlsZHJlbigpKTsKICAgICAgICAgICAgICAgICAgICAgYW5vbkJsb2Nr
LT5kZWxldGVMaW5lQm94VHJlZSgpOwogICAgICAgICAgICAgICAgICAgICBhbm9uQmxvY2stPmRl
c3Ryb3koKTsKQEAgLTE0Myw3ICsxNDIsNiBAQCB2b2lkIFJlbmRlclJ1YnlCYXNlOjptb3ZlQmxv
Y2tDaGlsZHJlbihSCiAKICAgICAgICAgICAgICAgICAgICAgUmVuZGVyQmxvY2sqIGFub25CbG9j
ayA9IHRvUmVuZGVyQmxvY2soY2hpbGQpOwogICAgICAgICAgICAgICAgICAgICBBU1NFUlQoYW5v
bkJsb2NrLT5jaGlsZHJlbklubGluZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgQVNTRVJUKCFh
bm9uQmxvY2stPmlubGluZUNvbnRpbnVhdGlvbigpKTsKICAgICAgICAgICAgICAgICAgICAgLy8g
TW92ZSBpbmxpbmUgY2hpbGRyZW4gb3V0IG9mIGFub255bW91cyBibG9jay4KICAgICAgICAgICAg
ICAgICAgICAgYW5vbkJsb2NrLT5tb3ZlQWxsQ2hpbGRyZW5Ubyh0aGlzLCBjaGlsZHJlbigpLCBh
bm9uQmxvY2spOwogICAgICAgICAgICAgICAgICAgICBhbm9uQmxvY2stPmRlbGV0ZUxpbmVCb3hU
cmVlKCk7CkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9Sb290SW5saW5lQm94LmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9Sb290SW5saW5lQm94LmNwcAkocmV2aXNpb24gNTQ1
NjEpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9Sb290SW5saW5lQm94LmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgIlBhZ2UuaCIKICNpbmNsdWRlICJSZW5kZXJB
cmVuYS5oIgogI2luY2x1ZGUgIlJlbmRlckJsb2NrLmgiCisjaW5jbHVkZSAiUmVuZGVyVmlldy5o
IgogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCkBAIC0xNjMsNiArMTY0LDQ2IEBAIHZvaWQgUm9v
dElubGluZUJveDo6cGFpbnRDdXN0b21IaWdobGlnaHQKIAogdm9pZCBSb290SW5saW5lQm94Ojpw
YWludChSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJbmZvLCBpbnQgdHgsIGludCB0eSkK
IHsKKyAgICBSZW5kZXJCbG9jayogY2hpbGQgPSBhbm9ueW1vdXNJbmxpbmVCbG9jaygpOworICAg
IGlmIChjaGlsZCkgeworICAgICAgICAvLyBUcmVhdCBwYWludGluZyBvZiBhIHNwZWNpYWwgaW5s
aW5lLWJsb2NrIGxpbmUgbGlrZSB0aGUgcGFpbnRpbmcgb2YgYSBub3JtYWwgYmxvY2sgYW5kIGdv
IHRocm91Z2ggYWxsIHBoYXNlcy4KKyAgICAgICAgUGFpbnRQaGFzZSBuZXdQaGFzZSA9IChwYWlu
dEluZm8ucGhhc2UgPT0gUGFpbnRQaGFzZUNoaWxkT3V0bGluZXMpID8gUGFpbnRQaGFzZU91dGxp
bmUgOiBwYWludEluZm8ucGhhc2U7CisgICAgICAgIG5ld1BoYXNlID0gKG5ld1BoYXNlID09IFBh
aW50UGhhc2VDaGlsZEJsb2NrQmFja2dyb3VuZHMpID8gUGFpbnRQaGFzZUNoaWxkQmxvY2tCYWNr
Z3JvdW5kIDogbmV3UGhhc2U7CisgICAgCisgICAgICAgIC8vIFdlIGRvbid0IHBhaW50IG91ciBv
d24gYmFja2dyb3VuZCwgYnV0IHdlIGRvIGxldCB0aGUgY2hpbGQgcGFpbnQgaXRzIGJhY2tncm91
bmQuCisgICAgICAgIFJlbmRlck9iamVjdDo6UGFpbnRJbmZvIGluZm8ocGFpbnRJbmZvKTsKKyAg
ICAgICAgaW5mby5waGFzZSA9IG5ld1BoYXNlOworICAgICAgICBpbmZvLnBhaW50aW5nUm9vdCA9
IHJlbmRlcmVyKCktPnBhaW50aW5nUm9vdEZvckNoaWxkcmVuKHBhaW50SW5mbyk7CisgICAgICAg
IGJvb2wgaXNQcmludGluZyA9IHJlbmRlcmVyKCktPmRvY3VtZW50KCktPnByaW50aW5nKCk7Cisg
ICAgICAgIAorICAgICAgICAvLyBDaGVjayBmb3IgcGFnZS1icmVhay1iZWZvcmU6IGFsd2F5cywg
YW5kIGlmIGl0J3Mgc2V0LCBicmVhayBhbmQgYmFpbC4KKyAgICAgICAgaWYgKGlzUHJpbnRpbmcg
JiYgY2hpbGQtPnN0eWxlKCktPnBhZ2VCcmVha0JlZm9yZSgpID09IFBCQUxXQVlTICYmCisgICAg
ICAgICAgICBibG9jaygpLT5pblJvb3RCbG9ja0NvbnRleHQoKSAmJiAodHkgKyBjaGlsZC0+eSgp
KSA+IHBhaW50SW5mby5yZWN0LnkoKSAmJiAKKyAgICAgICAgICAgICh0eSArIGNoaWxkLT55KCkp
IDwgcGFpbnRJbmZvLnJlY3QuYm90dG9tKCkpIHsKKyAgICAgICAgICAgIHJlbmRlcmVyKCktPnZp
ZXcoKS0+c2V0QmVzdFRydW5jYXRlZEF0KHR5ICsgY2hpbGQtPnkoKSwgYmxvY2soKSwgdHJ1ZSk7
CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWNoaWxkLT5o
YXNTZWxmUGFpbnRpbmdMYXllcigpKQorICAgICAgICAgICAgY2hpbGQtPnBhaW50KGluZm8sIHR4
LCB0eSk7CisKKyAgICAgICAgLy8gQ2hlY2sgZm9yIHBhZ2UtYnJlYWstYWZ0ZXI6IGFsd2F5cywg
YW5kIGlmIGl0J3Mgc2V0LCBicmVhayBhbmQgYmFpbC4KKyAgICAgICAgaWYgKGlzUHJpbnRpbmcg
JiYgY2hpbGQtPnN0eWxlKCktPnBhZ2VCcmVha0FmdGVyKCkgPT0gUEJBTFdBWVMgJiYgCisgICAg
ICAgICAgICBibG9jaygpLT5pblJvb3RCbG9ja0NvbnRleHQoKSAmJiAodHkgKyBjaGlsZC0+eSgp
ICsgY2hpbGQtPmhlaWdodCgpKSA+IHBhaW50SW5mby5yZWN0LnkoKSAmJiAKKyAgICAgICAgICAg
ICh0eSArIGNoaWxkLT55KCkgKyBjaGlsZC0+aGVpZ2h0KCkpIDwgcGFpbnRJbmZvLnJlY3QuYm90
dG9tKCkpIHsKKyAgICAgICAgICAgIHJlbmRlcmVyKCktPnZpZXcoKS0+c2V0QmVzdFRydW5jYXRl
ZEF0KHR5ICsgY2hpbGQtPnkoKSArIGNoaWxkLT5oZWlnaHQoKSArIG1heCgwLCBjaGlsZC0+Y29s
bGFwc2VkTWFyZ2luQm90dG9tKCkpLCBibG9jaygpLCB0cnVlKTsKKyAgICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8v
IE9ubHkgcGFpbnQgZHVyaW5nIHRoZSBmb3JlZ3JvdW5kL3NlbGVjdGlvbiBwaGFzZXMgaWYgd2Ug
ZG9uJ3QgaGF2ZSBhIHNwZWNpYWwgYW5vbnltb3VzIGlubGluZSBibG9jay4KKyAgICBpZiAocGFp
bnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VGb3JlZ3JvdW5kICYmIHBhaW50SW5mby5waGFzZSAh
PSBQYWludFBoYXNlU2VsZWN0aW9uICYmIHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlT3V0
bGluZSAKKyAgICAgICAgJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VTZWxmT3V0bGlu
ZSAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZUNoaWxkT3V0bGluZXMgJiYgcGFpbnRJ
bmZvLnBoYXNlICE9IFBhaW50UGhhc2VUZXh0Q2xpcAorICAgICAgICAmJiBwYWludEluZm8ucGhh
c2UgIT0gUGFpbnRQaGFzZU1hc2spCisgICAgICAgIHJldHVybjsKKwogICAgIElubGluZUZsb3dC
b3g6OnBhaW50KHBhaW50SW5mbywgdHgsIHR5KTsKICAgICBwYWludEVsbGlwc2lzQm94KHBhaW50
SW5mbywgdHgsIHR5KTsKICNpZiBQTEFURk9STShNQUMpCkBAIC0xNzIsMTUgKzIxMywyNiBAQCB2
b2lkIFJvb3RJbmxpbmVCb3g6OnBhaW50KFJlbmRlck9iamVjdDo6CiAjZW5kaWYKIH0KIAotYm9v
bCBSb290SW5saW5lQm94Ojpub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYgcmVxdWVz
dCwgSGl0VGVzdFJlc3VsdCYgcmVzdWx0LCBpbnQgeCwgaW50IHksIGludCB0eCwgaW50IHR5KQor
Ym9vbCBSb290SW5saW5lQm94Ojpub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYgcmVx
dWVzdCwgSGl0VGVzdFJlc3VsdCYgcmVzdWx0LCBpbnQgeCwgaW50IHksIGludCB0eCwgaW50IHR5
LCBIaXRUZXN0QWN0aW9uIGhpdFRlc3RBY3Rpb24pCiB7CisgICAgUmVuZGVyQmxvY2sqIGNoaWxk
ID0gYW5vbnltb3VzSW5saW5lQmxvY2soKTsKKyAgICBpZiAoY2hpbGQpIHsKKyAgICAgICAgSGl0
VGVzdEFjdGlvbiBjaGlsZEhpdFRlc3QgPSBoaXRUZXN0QWN0aW9uOworICAgICAgICBpZiAoaGl0
VGVzdEFjdGlvbiA9PSBIaXRUZXN0Q2hpbGRCbG9ja0JhY2tncm91bmRzKQorICAgICAgICAgICAg
Y2hpbGRIaXRUZXN0ID0gSGl0VGVzdENoaWxkQmxvY2tCYWNrZ3JvdW5kOworICAgICAgICByZXR1
cm4gY2hpbGQtPm5vZGVBdFBvaW50KHJlcXVlc3QsIHJlc3VsdCwgeCwgeSwgdHgsIHR5LCBjaGls
ZEhpdFRlc3QpOworICAgIH0KKworICAgIGlmIChoaXRUZXN0QWN0aW9uICE9IEhpdFRlc3RGb3Jl
Z3JvdW5kKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKICAgICBpZiAobV9oYXNFbGxpcHNpc0Jv
eCAmJiB2aXNpYmxlVG9IaXRUZXN0aW5nKCkpIHsKLSAgICAgICAgaWYgKGVsbGlwc2lzQm94KCkt
Pm5vZGVBdFBvaW50KHJlcXVlc3QsIHJlc3VsdCwgeCwgeSwgdHgsIHR5KSkgeworICAgICAgICBp
ZiAoZWxsaXBzaXNCb3goKS0+bm9kZUF0UG9pbnQocmVxdWVzdCwgcmVzdWx0LCB4LCB5LCB0eCwg
dHksIGhpdFRlc3RBY3Rpb24pKSB7CiAgICAgICAgICAgICByZW5kZXJlcigpLT51cGRhdGVIaXRU
ZXN0UmVzdWx0KHJlc3VsdCwgSW50UG9pbnQoeCAtIHR4LCB5IC0gdHkpKTsKICAgICAgICAgICAg
IHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBJbmxpbmVGbG93Qm94
Ojpub2RlQXRQb2ludChyZXF1ZXN0LCByZXN1bHQsIHgsIHksIHR4LCB0eSk7CisgICAgcmV0dXJu
IElubGluZUZsb3dCb3g6Om5vZGVBdFBvaW50KHJlcXVlc3QsIHJlc3VsdCwgeCwgeSwgdHgsIHR5
LCBIaXRUZXN0Rm9yZWdyb3VuZCk7CiB9CiAKIHZvaWQgUm9vdElubGluZUJveDo6YWRqdXN0UG9z
aXRpb24oaW50IGR4LCBpbnQgZHkpCkBAIC0yMDQsNiArMjU2LDE3IEBAIHZvaWQgUm9vdElubGlu
ZUJveDo6Y2hpbGRSZW1vdmVkKElubGluZUIKIAogaW50IFJvb3RJbmxpbmVCb3g6OnZlcnRpY2Fs
bHlBbGlnbkJveGVzKGludCBoZWlnaHRPZkJsb2NrKQogeworICAgIFJlbmRlckJsb2NrKiBpbmxp
bmVCbG9jayA9IGFub255bW91c0lubGluZUJsb2NrKCk7CisgICAgaWYgKGlubGluZUJsb2NrKSB7
CisgICAgICAgIGludCBsaW5lVG9wID0gaW5saW5lQmxvY2stPnkoKTsKKyAgICAgICAgaW50IGxp
bmVCb3R0b20gPSBpbmxpbmVCbG9jay0+eSgpICsgaW5saW5lQmxvY2stPmhlaWdodCgpOworICAg
ICAgICBmaXJzdENoaWxkKCktPnNldFkobGluZVRvcCk7CisgICAgICAgIHNldFkobGluZVRvcCk7
CisgICAgICAgIGNvbXB1dGVWZXJ0aWNhbE92ZXJmbG93KGxpbmVUb3AsIGxpbmVCb3R0b20sIHRy
dWUpOworICAgICAgICBzZXRMaW5lVG9wQm90dG9tUG9zaXRpb25zKGxpbmVUb3AsIGxpbmVCb3R0
b20pOworICAgICAgICByZXR1cm4gaGVpZ2h0T2ZCbG9jazsKKyAgICB9CisgICAgCiAgICAgaW50
IG1heFBvc2l0aW9uVG9wID0gMDsKICAgICBpbnQgbWF4UG9zaXRpb25Cb3R0b20gPSAwOwogICAg
IGludCBtYXhBc2NlbnQgPSAwOwpAQCAtMjE3LDcgKzI4MCw2IEBAIGludCBSb290SW5saW5lQm94
Ojp2ZXJ0aWNhbGx5QWxpZ25Cb3hlcygKICAgICBib29sIHN0cmljdE1vZGUgPSAoY3VyciAmJiBj
dXJyLT5kb2N1bWVudCgpLT5pblN0cmljdE1vZGUoKSk7CiAKICAgICBjb21wdXRlTG9naWNhbEJv
eEhlaWdodHMobWF4UG9zaXRpb25Ub3AsIG1heFBvc2l0aW9uQm90dG9tLCBtYXhBc2NlbnQsIG1h
eERlc2NlbnQsIHN0cmljdE1vZGUpOwotCiAgICAgaWYgKG1heEFzY2VudCArIG1heERlc2NlbnQg
PCBtYXgobWF4UG9zaXRpb25Ub3AsIG1heFBvc2l0aW9uQm90dG9tKSkKICAgICAgICAgYWRqdXN0
TWF4QXNjZW50QW5kRGVzY2VudChtYXhBc2NlbnQsIG1heERlc2NlbnQsIG1heFBvc2l0aW9uVG9w
LCBtYXhQb3NpdGlvbkJvdHRvbSk7CiAKQEAgLTMzMiw3ICszOTQsNyBAQCBJbmxpbmVCb3gqIFJv
b3RJbmxpbmVCb3g6Omxhc3RTZWxlY3RlZEJvCiBpbnQgUm9vdElubGluZUJveDo6c2VsZWN0aW9u
VG9wKCkgY29uc3QKIHsKICAgICBpbnQgc2VsZWN0aW9uVG9wID0gbV9saW5lVG9wOwotICAgIGlm
ICghcHJldlJvb3RCb3goKSkKKyAgICBpZiAoIXByZXZSb290Qm94KCkgfHwgcHJldlJvb3RCb3go
KS0+YW5vbnltb3VzSW5saW5lQmxvY2soKSkKICAgICAgICAgcmV0dXJuIHNlbGVjdGlvblRvcDsK
IAogICAgIGludCBwcmV2Qm90dG9tID0gcHJldlJvb3RCb3goKS0+c2VsZWN0aW9uQm90dG9tKCk7
CkBAIC00MzAsNCArNDkyLDkgQEAgdm9pZCBSb290SW5saW5lQm94OjphdHRhY2hMaW5lQm94VG9S
ZW5kZQogICAgIGJsb2NrKCktPmxpbmVCb3hlcygpLT5hdHRhY2hMaW5lQm94KHRoaXMpOwogfQog
CitSZW5kZXJCbG9jayogUm9vdElubGluZUJveDo6YW5vbnltb3VzSW5saW5lQmxvY2soKSBjb25z
dAoreworICAgIHJldHVybiBmaXJzdENoaWxkKCkgJiYgZmlyc3RDaGlsZCgpID09IGxhc3RDaGls
ZCgpICYmICFmaXJzdENoaWxkKCktPmlzVGV4dCgpICYmIGZpcnN0Q2hpbGQoKS0+cmVuZGVyZXIo
KS0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpID8gdG9SZW5kZXJCbG9jayhmaXJzdENoaWxkKCkt
PnJlbmRlcmVyKCkpIDogMDsKK30KKwogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2Vi
Q29yZS9yZW5kZXJpbmcvUm9vdElubGluZUJveC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVu
ZGVyaW5nL1Jvb3RJbmxpbmVCb3guaAkocmV2aXNpb24gNTQ1NjEpCisrKyBXZWJDb3JlL3JlbmRl
cmluZy9Sb290SW5saW5lQm94LmgJKHdvcmtpbmcgY29weSkKQEAgLTEwMiw3ICsxMDIsNyBAQCBw
dWJsaWM6CiAjZW5kaWYKIAogICAgIHZpcnR1YWwgdm9pZCBwYWludChSZW5kZXJPYmplY3Q6OlBh
aW50SW5mbyYsIGludCB0eCwgaW50IHR5KTsKLSAgICB2aXJ0dWFsIGJvb2wgbm9kZUF0UG9pbnQo
Y29uc3QgSGl0VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVzdWx0JiwgaW50LCBpbnQsIGludCwgaW50
KTsKKyAgICB2aXJ0dWFsIGJvb2wgbm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmLCBI
aXRUZXN0UmVzdWx0JiwgaW50LCBpbnQsIGludCwgaW50LCBIaXRUZXN0QWN0aW9uKTsKIAogICAg
IGJvb2wgaGFzU2VsZWN0ZWRDaGlsZHJlbigpIGNvbnN0IHsgcmV0dXJuIG1faGFzU2VsZWN0ZWRD
aGlsZHJlbjsgfQogICAgIHZvaWQgc2V0SGFzU2VsZWN0ZWRDaGlsZHJlbihib29sKTsKQEAgLTEz
Miw2ICsxMzIsOCBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCB2b2lkIGF0dGFjaExpbmVCb3hUb1Jl
bmRlck9iamVjdCgpOwogICAgIHZpcnR1YWwgdm9pZCByZW1vdmVMaW5lQm94RnJvbVJlbmRlck9i
amVjdCgpOwogCisgICAgUmVuZGVyQmxvY2sqIGFub255bW91c0lubGluZUJsb2NrKCkgY29uc3Q7
CisKIHByb3RlY3RlZDoKICAgICAvLyBXaGVyZSB0aGlzIGxpbmUgZW5kZWQuICBUaGUgZXhhY3Qg
b2JqZWN0IGFuZCB0aGUgcG9zaXRpb24gd2l0aGluIHRoYXQgb2JqZWN0IGFyZSBzdG9yZWQgc28g
dGhhdAogICAgIC8vIHdlIGNhbiBjcmVhdGUgYW4gSW5saW5lSXRlcmF0b3IgYmVnaW5uaW5nIGp1
c3QgYWZ0ZXIgdGhlIGVuZCBvZiB0aGlzIGxpbmUuCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>48514</attachid>
            <date>2010-02-10 13:10:34 -0800</date>
            <delta_ts>2010-02-10 14:33:56 -0800</delta_ts>
            <desc>Patch that makes blocks work inside inlines with layers</desc>
            <filename>patch.txt</filename>
            <type>text/plain</type>
            <size>153058</size>
            <attacher name="Dave Hyatt">hyatt</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShyZXZpc2lv
biA1NDU2MSkKKysrIFdlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCSh3
b3JraW5nIGNvcHkpCkBAIC00NTQ4LDYgKzQ1NDgsOSBAQAogCQlCQ0U2NUJFQTBFQUNERjE2MDA3
RTQ1MzMgLyogTGVuZ3RoLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IEJDRTY1QkU4MEVBQ0RGMTYwMDdFNDUzMyAvKiBMZW5ndGguY3BwICovOyB9Owog
CQlCQ0U2NUJFQjBFQUNERjE2MDA3RTQ1MzMgLyogTGVuZ3RoLmggaW4gSGVhZGVycyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCQ0U2NUJFOTBFQUNERjE2MDA3RTQ1MzMgLyog
TGVuZ3RoLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsK
IAkJQkNFNjVEMzIwRUFEMTIxMTAwN0U0NTMzIC8qIFRoZW1lLmNwcCBpbiBTb3VyY2VzICovID0g
e2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJDRTY1RDMxMEVBRDEyMTEwMDdFNDUzMyAv
KiBUaGVtZS5jcHAgKi87IH07CisJCUJDRTc4OTE2MTEyMEQ2MDgwMDYwRUNFNSAvKiBJbmxpbmVJ
dGVyYXRvci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
QkNFNzg5MTUxMTIwRDYwODAwNjBFQ0U1IC8qIElubGluZUl0ZXJhdG9yLmggKi87IH07CisJCUJD
RTc4OTg2MTEyMEU3QTYwMDYwRUNFNSAvKiBCaWRpUnVuLmggaW4gSGVhZGVycyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCQ0U3ODk4NTExMjBFN0E2MDA2MEVDRTUgLyogQmlk
aVJ1bi5oICovOyB9OworCQlCQ0U3ODk4QjExMjBFODAyMDA2MEVDRTUgLyogQmlkaVJ1bi5jcHAg
aW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCQ0U3ODk4QTEx
MjBFODAyMDA2MEVDRTUgLyogQmlkaVJ1bi5jcHAgKi87IH07CiAJCUJDRTdCMTkzMEQ0RTg2OTYw
MDc1QTUzOSAvKiBKU0hpc3RvcnlDdXN0b20uY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gQkNFN0IxOTIwRDRFODY5NjAwNzVBNTM5IC8qIEpTSGlzdG9y
eUN1c3RvbS5jcHAgKi87IH07CiAJCUJDRTk5RUMzMERDQTYyNDEwMDE4MjY4MyAvKiBKU1hTTFRQ
cm9jZXNzb3JDb25zdHJ1Y3Rvci5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSBCQ0U5OUVDMTBEQ0E2MjQxMDAxODI2ODMgLyogSlNYU0xUUHJvY2Vzc29y
Q29uc3RydWN0b3IuY3BwICovOyB9OwogCQlCQ0U5OUVDNDBEQ0E2MjQxMDAxODI2ODMgLyogSlNY
U0xUUHJvY2Vzc29yQ29uc3RydWN0b3IuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IEJDRTk5RUMyMERDQTYyNDEwMDE4MjY4MyAvKiBKU1hTTFRQcm9jZXNz
b3JDb25zdHJ1Y3Rvci5oICovOyB9OwpAQCAtOTgxMCw2ICs5ODEzLDkgQEAKIAkJQkNFNjVCRTgw
RUFDREYxNjAwN0U0NTMzIC8qIExlbmd0aC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5j
cHA7IHBhdGggPSBMZW5ndGguY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlCQ0U2
NUJFOTBFQUNERjE2MDA3RTQ1MzMgLyogTGVuZ3RoLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMu
aDsgcGF0aCA9IExlbmd0aC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlCQ0U2NUQz
MTBFQUQxMjExMDA3RTQ1MzMgLyogVGhlbWUuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAu
Y3BwOyBwYXRoID0gVGhlbWUuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlCQ0U3
ODkxNTExMjBENjA4MDA2MEVDRTUgLyogSW5saW5lSXRlcmF0b3IuaCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuYy5oOyBwYXRoID0gSW5saW5lSXRlcmF0b3IuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+
IjsgfTsKKwkJQkNFNzg5ODUxMTIwRTdBNjAwNjBFQ0U1IC8qIEJpZGlSdW4uaCAqLyA9IHtpc2Eg
PSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9
IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQmlkaVJ1bi5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OworCQlCQ0U3ODk4QTExMjBFODAyMDA2MEVDRTUgLyogQmlkaVJ1bi5jcHAgKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUg
PSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBCaWRpUnVuLmNwcDsgc291cmNlVHJlZSA9ICI8
Z3JvdXA+IjsgfTsKIAkJQkNFN0IxOTIwRDRFODY5NjAwNzVBNTM5IC8qIEpTSGlzdG9yeUN1c3Rv
bS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFz
dEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBKU0hpc3RvcnlDdXN0
b20uY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlCQ0U5OUVDMTBEQ0E2MjQxMDAx
ODI2ODMgLyogSlNYU0xUUHJvY2Vzc29yQ29uc3RydWN0b3IuY3BwICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jcHAuY3BwOyBwYXRoID0gSlNYU0xUUHJvY2Vzc29yQ29uc3RydWN0b3IuY3BwOyBzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlCQ0U5OUVDMjBEQ0E2MjQxMDAxODI2ODMgLyogSlNY
U0xUUHJvY2Vzc29yQ29uc3RydWN0b3IuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBm
aWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRo
ID0gSlNYU0xUUHJvY2Vzc29yQ29uc3RydWN0b3IuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKQEAgLTE1NTU2LDYgKzE1NTYyLDggQEAKIAkJCQlCQzhDOEZBQTBERENEMkYyMDBCNTkyRjQg
Lyogc3R5bGUgKi8sCiAJCQkJQThDRkYwNEIwQTE1NEYwOTAwMEE0MjM0IC8qIEF1dG9UYWJsZUxh
eW91dC5jcHAgKi8sCiAJCQkJQThDRkYwNDkwQTE1NEYwOTAwMEE0MjM0IC8qIEF1dG9UYWJsZUxh
eW91dC5oICovLAorCQkJCUJDRTc4OThBMTEyMEU4MDIwMDYwRUNFNSAvKiBCaWRpUnVuLmNwcCAq
LywKKwkJCQlCQ0U3ODk4NTExMjBFN0E2MDA2MEVDRTUgLyogQmlkaVJ1bi5oICovLAogCQkJCUJD
RUE0ODE1MDk3RDkzMDIwMDk0QzlFNCAvKiBicmVha19saW5lcy5jcHAgKi8sCiAJCQkJQkNFQTQ4
MTYwOTdEOTMwMjAwOTRDOUU0IC8qIGJyZWFrX2xpbmVzLmggKi8sCiAJCQkJOTM5MkYxNEYwQUQx
ODYyMzAwNjkxQkQ0IC8qIENvdW50ZXJOb2RlLmNwcCAqLywKQEAgLTE1NTcyLDYgKzE1NTgwLDcg
QEAKIAkJCQlBOENGRjVERTBBMTU1QTA1MDAwQTQyMzQgLyogSW5saW5lQm94LmggKi8sCiAJCQkJ
QThDRkY1REQwQTE1NUEwNTAwMEE0MjM0IC8qIElubGluZUZsb3dCb3guY3BwICovLAogCQkJCUE4
Q0ZGNURDMEExNTVBMDUwMDBBNDIzNCAvKiBJbmxpbmVGbG93Qm94LmggKi8sCisJCQkJQkNFNzg5
MTUxMTIwRDYwODAwNjBFQ0U1IC8qIElubGluZUl0ZXJhdG9yLmggKi8sCiAJCQkJQThDRkY1REIw
QTE1NUEwNTAwMEE0MjM0IC8qIElubGluZVJ1bkJveC5oICovLAogCQkJCUJDRUE0ODFBMDk3RDkz
MDIwMDk0QzlFNCAvKiBJbmxpbmVUZXh0Qm94LmNwcCAqLywKIAkJCQlCQ0VBNDgxQjA5N0Q5MzAy
MDA5NEM5RTQgLyogSW5saW5lVGV4dEJveC5oICovLApAQCAtMTg1MDUsNiArMTg1MTQsOCBAQAog
CQkJCUI3MUZFNkRGMTEwOTFDQjMwMERBRUY3NyAvKiBQcmludENvbnRleHQuaCBpbiBIZWFkZXJz
ICovLAogCQkJCTlGNzIzMDRGMTExODRCNDEwMEFEMDEyNiAvKiBTY3JpcHRQcm9maWxlLmggaW4g
SGVhZGVycyAqLywKIAkJCQk5RjcyMzA1MTExMTg0QjQxMDBBRDAxMjYgLyogU2NyaXB0UHJvZmls
ZXIuaCBpbiBIZWFkZXJzICovLAorCQkJCUJDRTc4OTE2MTEyMEQ2MDgwMDYwRUNFNSAvKiBJbmxp
bmVJdGVyYXRvci5oIGluIEhlYWRlcnMgKi8sCisJCQkJQkNFNzg5ODYxMTIwRTdBNjAwNjBFQ0U1
IC8qIEJpZGlSdW4uaCBpbiBIZWFkZXJzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBsb3lt
ZW50UG9zdHByb2Nlc3NpbmcgPSAwOwogCQl9OwpAQCAtMjA2ODMsNiArMjA2OTQsNyBAQAogCQkJ
CTg0RDBDNDA0MTExNUYxRDQwMDE4QUEzNCAvKiBBZmZpbmVUcmFuc2Zvcm0uY3BwIGluIFNvdXJj
ZXMgKi8sCiAJCQkJQjc3NkQ0M0QxMTA0NTI3NTAwQkVCMEVDIC8qIFByaW50Q29udGV4dC5jcHAg
aW4gU291cmNlcyAqLywKIAkJCQk5RjcyMzA1MDExMTg0QjQxMDBBRDAxMjYgLyogU2NyaXB0UHJv
ZmlsZXIuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJQkNFNzg5OEIxMTIwRTgwMjAwNjBFQ0U1IC8q
IEJpZGlSdW4uY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkpOwogCQkJcnVuT25seUZvckRlcGxveW1l
bnRQb3N0cHJvY2Vzc2luZyA9IDA7CiAJCX07CkluZGV4OiBXZWJDb3JlL2FjY2Vzc2liaWxpdHkv
QWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9hY2Nl
c3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3QuY3BwCShyZXZpc2lvbiA1NDU2MSkK
KysrIFdlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0LmNwcAko
d29ya2luZyBjb3B5KQpAQCAtNTY3LDEyICs1NjcsOCBAQCBFbGVtZW50KiBBY2Nlc3NpYmlsaXR5
UmVuZGVyT2JqZWN0OjphbmNoCiAgICAgUmVuZGVyT2JqZWN0KiBjdXJyUmVuZGVyZXI7CiAgICAg
CiAgICAgLy8gU2VhcmNoIHVwIHRoZSByZW5kZXIgdHJlZSBmb3IgYSBSZW5kZXJPYmplY3Qgd2l0
aCBhIERPTSBub2RlLiAgRGVmZXIgdG8gYW4gZWFybGllciBjb250aW51YXRpb24sIHRob3VnaC4K
LSAgICBmb3IgKGN1cnJSZW5kZXJlciA9IG1fcmVuZGVyZXI7IGN1cnJSZW5kZXJlciAmJiAhY3Vy
clJlbmRlcmVyLT5ub2RlKCk7IGN1cnJSZW5kZXJlciA9IGN1cnJSZW5kZXJlci0+cGFyZW50KCkp
IHsKLSAgICAgICAgaWYgKGN1cnJSZW5kZXJlci0+aXNSZW5kZXJCbG9jaygpKSB7Ci0gICAgICAg
ICAgICBSZW5kZXJJbmxpbmUqIGNvbnRpbnVhdGlvbiA9IHRvUmVuZGVyQmxvY2soY3VyclJlbmRl
cmVyKS0+aW5saW5lQ29udGludWF0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoY29udGludWF0aW9u
KQotICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZS0+Z2V0T3JDcmVhdGUoY29udGludWF0aW9u
KS0+YW5jaG9yRWxlbWVudCgpOwotICAgICAgICB9CisgICAgZm9yIChjdXJyUmVuZGVyZXIgPSBt
X3JlbmRlcmVyOyBjdXJyUmVuZGVyZXIgJiYgIWN1cnJSZW5kZXJlci0+bm9kZSgpOyBjdXJyUmVu
ZGVyZXIgPSBjdXJyUmVuZGVyZXItPnBhcmVudCgpKQorICAgIHsKICAgICB9CiAgICAgCiAgICAg
Ly8gYmFpbCBpZiBub25lIGZvdW5kCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9CaWRpUnVuLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9CaWRpUnVuLmNwcAkocmV2aXNpb24g
MCkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL0JpZGlSdW4uY3BwCShyZXZpc2lvbiAwKQpAQCAtMCww
ICsxLDc0IEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMTk5OSBMYXJzIEtub2xsIChrbm9sbEBr
ZGUub3JnKQorICogICAgICAgICAgIChDKSAxOTk5IEFudHRpIEtvaXZpc3RvIChrb2l2aXN0b0Br
ZGUub3JnKQorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDEwIEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBBbmRy
ZXcgV2VsbGluZ3RvbiAocHJvdG9uQHdpcmV0YXBwZWQubmV0KQorICoKKyAqIFRoaXMgbGlicmFy
eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1v
ZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
CisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
OyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9u
KSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQg
aW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBX
QVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFO
VEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdO
VQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisg
KgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0
aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisg
KiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgIkJpZGlSdW4uaCIKKyNpbmNsdWRlICJJbmxpbmVCb3guaCIKKyNpbmNs
dWRlICJSZW5kZXJBcmVuYS5oIgorI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkTGVha0NvdW50ZXIu
aD4KKwordXNpbmcgbmFtZXNwYWNlIFdURjsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisjaWZu
ZGVmIE5ERUJVRworc3RhdGljIFJlZkNvdW50ZWRMZWFrQ291bnRlciBiaWRpUnVuQ291bnRlcigi
QmlkaVJ1biIpOworCitzdGF0aWMgYm9vbCBpbkJpZGlSdW5EZXN0cm95OworI2VuZGlmCisKK3Zv
aWQgQmlkaVJ1bjo6ZGVzdHJveSgpCit7CisjaWZuZGVmIE5ERUJVRworICAgIGluQmlkaVJ1bkRl
c3Ryb3kgPSB0cnVlOworI2VuZGlmCisgICAgUmVuZGVyQXJlbmEqIHJlbmRlckFyZW5hID0gbV9v
YmplY3QtPnJlbmRlckFyZW5hKCk7CisgICAgZGVsZXRlIHRoaXM7CisjaWZuZGVmIE5ERUJVRwor
ICAgIGluQmlkaVJ1bkRlc3Ryb3kgPSBmYWxzZTsKKyNlbmRpZgorCisgICAgLy8gUmVjb3ZlciB0
aGUgc2l6ZSBsZWZ0IHRoZXJlIGZvciB1cyBieSBvcGVyYXRvciBkZWxldGUgYW5kIGZyZWUgdGhl
IG1lbW9yeS4KKyAgICByZW5kZXJBcmVuYS0+ZnJlZSgqcmVpbnRlcnByZXRfY2FzdDxzaXplX3Qq
Pih0aGlzKSwgdGhpcyk7Cit9CisKK3ZvaWQqIEJpZGlSdW46Om9wZXJhdG9yIG5ldyhzaXplX3Qg
c3osIFJlbmRlckFyZW5hKiByZW5kZXJBcmVuYSkgdGhyb3coKQoreworI2lmbmRlZiBOREVCVUcK
KyAgICBiaWRpUnVuQ291bnRlci5pbmNyZW1lbnQoKTsKKyNlbmRpZgorICAgIHJldHVybiByZW5k
ZXJBcmVuYS0+YWxsb2NhdGUoc3opOworfQorCit2b2lkIEJpZGlSdW46Om9wZXJhdG9yIGRlbGV0
ZSh2b2lkKiBwdHIsIHNpemVfdCBzeikKK3sKKyNpZm5kZWYgTkRFQlVHCisgICAgYmlkaVJ1bkNv
dW50ZXIuZGVjcmVtZW50KCk7CisjZW5kaWYKKyAgICBBU1NFUlQoaW5CaWRpUnVuRGVzdHJveSk7
CisKKyAgICAvLyBTdGFzaCBzaXplIHdoZXJlIGRlc3Ryb3koKSBjYW4gZmluZCBpdC4KKyAgICAq
KHNpemVfdCopcHRyID0gc3o7Cit9CisKK30KSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL0JpZGlS
dW4uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9CaWRpUnVuLmgJKHJldmlzaW9u
IDApCisrKyBXZWJDb3JlL3JlbmRlcmluZy9CaWRpUnVuLmgJKHJldmlzaW9uIDApCkBAIC0wLDAg
KzEsNjYgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAxOTk5IExhcnMgS25vbGwgKGtub2xsQGtk
ZS5vcmcpCisgKiAgICAgICAgICAgKEMpIDE5OTkgQW50dGkgS29pdmlzdG8gKGtvaXZpc3RvQGtk
ZS5vcmcpCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMTAgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA2IEFuZHJl
dyBXZWxsaW5ndG9uIChwcm90b25Ad2lyZXRhcHBlZC5uZXQpCisgKgorICogVGhpcyBsaWJyYXJ5
IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9k
aWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMK
KyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247
IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24p
IGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBp
biB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdB
UlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5U
QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05V
CisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAq
CisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRo
ZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdh
cmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAq
IEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZuZGVmIEJpZGlSdW5f
aAorI2RlZmluZSBCaWRpUnVuX2gKKworI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KKyNp
bmNsdWRlICJCaWRpUmVzb2x2ZXIuaCIKKyNpbmNsdWRlICJSZW5kZXJUZXh0LmgiCisKK25hbWVz
cGFjZSBXZWJDb3JlIHsKKworY2xhc3MgQmlkaUNvbnRleHQ7CitjbGFzcyBJbmxpbmVCb3g7CisK
K3N0cnVjdCBCaWRpUnVuIDogQmlkaUNoYXJhY3RlclJ1biB7CisgICAgQmlkaVJ1bihpbnQgc3Rh
cnQsIGludCBzdG9wLCBSZW5kZXJPYmplY3QqIG9iamVjdCwgQmlkaUNvbnRleHQqIGNvbnRleHQs
IFdURjo6VW5pY29kZTo6RGlyZWN0aW9uIGRpcikKKyAgICAgICAgOiBCaWRpQ2hhcmFjdGVyUnVu
KHN0YXJ0LCBzdG9wLCBjb250ZXh0LCBkaXIpCisgICAgICAgICwgbV9vYmplY3Qob2JqZWN0KQor
ICAgICAgICAsIG1fYm94KDApCisgICAgeworICAgIH0KKworICAgIHZvaWQgZGVzdHJveSgpOwor
CisgICAgLy8gT3ZlcmxvYWRlZCBuZXcgb3BlcmF0b3IuCisgICAgdm9pZCogb3BlcmF0b3IgbmV3
KHNpemVfdCwgUmVuZGVyQXJlbmEqKSB0aHJvdygpOworCisgICAgLy8gT3ZlcnJpZGRlbiB0byBw
cmV2ZW50IHRoZSBub3JtYWwgZGVsZXRlIGZyb20gYmVpbmcgY2FsbGVkLgorICAgIHZvaWQgb3Bl
cmF0b3IgZGVsZXRlKHZvaWQqLCBzaXplX3QpOworCisgICAgQmlkaVJ1biogbmV4dCgpIHsgcmV0
dXJuIHN0YXRpY19jYXN0PEJpZGlSdW4qPihtX25leHQpOyB9CisKK3ByaXZhdGU6CisgICAgLy8g
VGhlIG5vcm1hbCBvcGVyYXRvciBuZXcgaXMgZGlzYWxsb3dlZC4KKyAgICB2b2lkKiBvcGVyYXRv
ciBuZXcoc2l6ZV90KSB0aHJvdygpOworCitwdWJsaWM6CisgICAgUmVuZGVyT2JqZWN0KiBtX29i
amVjdDsKKyAgICBJbmxpbmVCb3gqIG1fYm94OworfTsKKworfQorCisjZW5kaWYgLy8gQmlkaVJ1
bl9oCisKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL0VsbGlwc2lzQm94LmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9FbGxpcHNpc0JveC5jcHAJKHJldmlzaW9uIDU0NTYxKQor
KysgV2ViQ29yZS9yZW5kZXJpbmcvRWxsaXBzaXNCb3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC05
Nyw3ICs5Nyw3IEBAIHZvaWQgRWxsaXBzaXNCb3g6OnBhaW50U2VsZWN0aW9uKEdyYXBoaWMKICAg
ICBjb250ZXh0LT5yZXN0b3JlKCk7CiB9CiAKLWJvb2wgRWxsaXBzaXNCb3g6Om5vZGVBdFBvaW50
KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiByZXF1ZXN0LCBIaXRUZXN0UmVzdWx0JiByZXN1bHQsIGlu
dCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHkpCitib29sIEVsbGlwc2lzQm94Ojpub2RlQXRQb2lu
dChjb25zdCBIaXRUZXN0UmVxdWVzdCYgcmVxdWVzdCwgSGl0VGVzdFJlc3VsdCYgcmVzdWx0LCBp
bnQgeCwgaW50IHksIGludCB0eCwgaW50IHR5LCBIaXRUZXN0QWN0aW9uIGhpdFRlc3RBY3Rpb24p
CiB7CiAgICAgdHggKz0gbV94OwogICAgIHR5ICs9IG1feTsKQEAgLTEwNyw3ICsxMDcsNyBAQCBi
b29sIEVsbGlwc2lzQm94Ojpub2RlQXRQb2ludChjb25zdCBIaXRUCiAgICAgICAgIFJlbmRlclN0
eWxlKiBzdHlsZSA9IG1fcmVuZGVyZXItPnN0eWxlKG1fZmlyc3RMaW5lKTsKICAgICAgICAgaW50
IG10eCA9IHR4ICsgbV93aWR0aCAtIG1fbWFya3VwQm94LT54KCk7CiAgICAgICAgIGludCBtdHkg
PSB0eSArIHN0eWxlLT5mb250KCkuYXNjZW50KCkgLSAobV9tYXJrdXBCb3gtPnkoKSArIG1fbWFy
a3VwQm94LT5yZW5kZXJlcigpLT5zdHlsZShtX2ZpcnN0TGluZSktPmZvbnQoKS5hc2NlbnQoKSk7
Ci0gICAgICAgIGlmIChtX21hcmt1cEJveC0+bm9kZUF0UG9pbnQocmVxdWVzdCwgcmVzdWx0LCB4
LCB5LCBtdHgsIG10eSkpIHsKKyAgICAgICAgaWYgKG1fbWFya3VwQm94LT5ub2RlQXRQb2ludChy
ZXF1ZXN0LCByZXN1bHQsIHgsIHksIG10eCwgbXR5LCBoaXRUZXN0QWN0aW9uKSkgewogICAgICAg
ICAgICAgcmVuZGVyZXIoKS0+dXBkYXRlSGl0VGVzdFJlc3VsdChyZXN1bHQsIEludFBvaW50KHgg
LSBtdHgsIHkgLSBtdHkpKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9Cklu
ZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9FbGxpcHNpc0JveC5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvcmVuZGVyaW5nL0VsbGlwc2lzQm94LmgJKHJldmlzaW9uIDU0NTYxKQorKysgV2ViQ29yZS9y
ZW5kZXJpbmcvRWxsaXBzaXNCb3guaAkod29ya2luZyBjb3B5KQpAQCAtNDAsNyArNDAsNyBAQCBw
dWJsaWM6CiAgICAgfQogCiAgICAgdmlydHVhbCB2b2lkIHBhaW50KFJlbmRlck9iamVjdDo6UGFp
bnRJbmZvJiwgaW50IHR4LCBpbnQgdHkpOwotICAgIHZpcnR1YWwgYm9vbCBub2RlQXRQb2ludChj
b25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBpbnQgeCwgaW50IHksIGludCB0
eCwgaW50IHR5KTsKKyAgICB2aXJ0dWFsIGJvb2wgbm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJl
cXVlc3QmLCBIaXRUZXN0UmVzdWx0JiwgaW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSwgSGl0
VGVzdEFjdGlvbik7CiAgICAgdm9pZCBzZXRTZWxlY3Rpb25TdGF0ZShSZW5kZXJPYmplY3Q6OlNl
bGVjdGlvblN0YXRlIHMpIHsgbV9zZWxlY3Rpb25TdGF0ZSA9IHM7IH0KICAgICBJbnRSZWN0IHNl
bGVjdGlvblJlY3QoaW50IHR4LCBpbnQgdHkpOwogCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9J
bmxpbmVCb3guY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUJveC5j
cHAJKHJldmlzaW9uIDU0NTYxKQorKysgV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lQm94LmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgIkhpdFRlc3RSZXN1bHQu
aCIKICNpbmNsdWRlICJJbmxpbmVGbG93Qm94LmgiCiAjaW5jbHVkZSAiUmVuZGVyQXJlbmEuaCIK
LSNpbmNsdWRlICJSZW5kZXJCb3guaCIKKyNpbmNsdWRlICJSZW5kZXJWaWV3LmgiCiAjaW5jbHVk
ZSAiUm9vdElubGluZUJveC5oIgogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwpAQCAtMTYxLDcgKzE2
MSw0NCBAQCB2b2lkIElubGluZUJveDo6YWRqdXN0UG9zaXRpb24oaW50IGR4LCBpCiAKIHZvaWQg
SW5saW5lQm94OjpwYWludChSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJbmZvLCBpbnQg
dHgsIGludCB0eSkKIHsKLSAgICBpZiAoIXJlbmRlcmVyKCktPnNob3VsZFBhaW50V2l0aGluUm9v
dChwYWludEluZm8pIHx8IChwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZUZvcmVncm91bmQg
JiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VTZWxlY3Rpb24pKQorICAgIGlmICghcmVu
ZGVyZXIoKS0+c2hvdWxkUGFpbnRXaXRoaW5Sb290KHBhaW50SW5mbykpCisgICAgICAgIHJldHVy
bjsKKyAgICAKKyAgICBSZW5kZXJCbG9jayogY2hpbGQgPSBwYWludEluZm8uYW5vbnltb3VzSW5s
aW5lQmxvY2s7CisgICAgaWYgKGNoaWxkID09IHJlbmRlcmVyKCkpIHsKKyAgICAgICAgLy8gVHJl
YXQgcGFpbnRpbmcgb2YgYSBzcGVjaWFsIGlubGluZS1ibG9jayBsaW5lIGxpa2UgdGhlIHBhaW50
aW5nIG9mIGEgbm9ybWFsIGJsb2NrIGFuZCBnbyB0aHJvdWdoIGFsbCBwaGFzZXMuCisgICAgICAg
IFBhaW50UGhhc2UgbmV3UGhhc2UgPSAocGFpbnRJbmZvLnBoYXNlID09IFBhaW50UGhhc2VDaGls
ZE91dGxpbmVzKSA/IFBhaW50UGhhc2VPdXRsaW5lIDogcGFpbnRJbmZvLnBoYXNlOworICAgICAg
ICBuZXdQaGFzZSA9IChuZXdQaGFzZSA9PSBQYWludFBoYXNlQ2hpbGRCbG9ja0JhY2tncm91bmRz
KSA/IFBhaW50UGhhc2VDaGlsZEJsb2NrQmFja2dyb3VuZCA6IG5ld1BoYXNlOworICAgIAorICAg
ICAgICAvLyBXZSBkb24ndCBwYWludCBvdXIgb3duIGJhY2tncm91bmQsIGJ1dCB3ZSBkbyBsZXQg
dGhlIGNoaWxkIHBhaW50IGl0cyBiYWNrZ3JvdW5kLgorICAgICAgICBSZW5kZXJPYmplY3Q6OlBh
aW50SW5mbyBpbmZvKHBhaW50SW5mbyk7CisgICAgICAgIGluZm8ucGhhc2UgPSBuZXdQaGFzZTsK
KyAgICAgICAgaW5mby5wYWludGluZ1Jvb3QgPSByZW5kZXJlcigpLT5wYWludGluZ1Jvb3RGb3JD
aGlsZHJlbihwYWludEluZm8pOworICAgICAgICBib29sIGlzUHJpbnRpbmcgPSByZW5kZXJlcigp
LT5kb2N1bWVudCgpLT5wcmludGluZygpOworICAgICAgICAKKyAgICAgICAgLy8gQ2hlY2sgZm9y
IHBhZ2UtYnJlYWstYmVmb3JlOiBhbHdheXMsIGFuZCBpZiBpdCdzIHNldCwgYnJlYWsgYW5kIGJh
aWwuCisgICAgICAgIGlmIChpc1ByaW50aW5nICYmIGNoaWxkLT5zdHlsZSgpLT5wYWdlQnJlYWtC
ZWZvcmUoKSA9PSBQQkFMV0FZUyAmJgorICAgICAgICAgICAgcm9vdCgpLT5ibG9jaygpLT5pblJv
b3RCbG9ja0NvbnRleHQoKSAmJiAodHkgKyBjaGlsZC0+eSgpKSA+IHBhaW50SW5mby5yZWN0Lnko
KSAmJiAKKyAgICAgICAgICAgICh0eSArIGNoaWxkLT55KCkpIDwgcGFpbnRJbmZvLnJlY3QuYm90
dG9tKCkpIHsKKyAgICAgICAgICAgIHJlbmRlcmVyKCktPnZpZXcoKS0+c2V0QmVzdFRydW5jYXRl
ZEF0KHR5ICsgY2hpbGQtPnkoKSwgcm9vdCgpLT5ibG9jaygpLCB0cnVlKTsKKyAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghY2hpbGQtPmhhc1NlbGZQYWludGlu
Z0xheWVyKCkpCisgICAgICAgICAgICBjaGlsZC0+cGFpbnQoaW5mbywgdHgsIHR5KTsKKworICAg
ICAgICAvLyBDaGVjayBmb3IgcGFnZS1icmVhay1hZnRlcjogYWx3YXlzLCBhbmQgaWYgaXQncyBz
ZXQsIGJyZWFrIGFuZCBiYWlsLgorICAgICAgICBpZiAoaXNQcmludGluZyAmJiBjaGlsZC0+c3R5
bGUoKS0+cGFnZUJyZWFrQWZ0ZXIoKSA9PSBQQkFMV0FZUyAmJiAKKyAgICAgICAgICAgIHJvb3Qo
KS0+YmxvY2soKS0+aW5Sb290QmxvY2tDb250ZXh0KCkgJiYgKHR5ICsgY2hpbGQtPnkoKSArIGNo
aWxkLT5oZWlnaHQoKSkgPiBwYWludEluZm8ucmVjdC55KCkgJiYgCisgICAgICAgICAgICAodHkg
KyBjaGlsZC0+eSgpICsgY2hpbGQtPmhlaWdodCgpKSA8IHBhaW50SW5mby5yZWN0LmJvdHRvbSgp
KSB7CisgICAgICAgICAgICByZW5kZXJlcigpLT52aWV3KCktPnNldEJlc3RUcnVuY2F0ZWRBdCh0
eSArIGNoaWxkLT55KCkgKyBjaGlsZC0+aGVpZ2h0KCkgKyBtYXgoMCwgY2hpbGQtPmNvbGxhcHNl
ZE1hcmdpbkJvdHRvbSgpKSwgcm9vdCgpLT5ibG9jaygpLCB0cnVlKTsKKyAgICAgICAgICAgIHJl
dHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAg
IGlmIChwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZUZvcmVncm91bmQgJiYgcGFpbnRJbmZv
LnBoYXNlICE9IFBhaW50UGhhc2VTZWxlY3Rpb24pCiAgICAgICAgIHJldHVybjsKIAogICAgIC8v
IFBhaW50IGFsbCBwaGFzZXMgb2YgcmVwbGFjZWQgZWxlbWVudHMgYXRvbWljYWxseSwgYXMgdGhv
dWdoIHRoZSByZXBsYWNlZCBlbGVtZW50IGVzdGFibGlzaGVkIGl0cwpAQCAtMTgzLDcgKzIyMCw3
IEBAIHZvaWQgSW5saW5lQm94OjpwYWludChSZW5kZXJPYmplY3Q6OlBhaW4KICAgICB9CiB9CiAK
LWJvb2wgSW5saW5lQm94Ojpub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYgcmVxdWVz
dCwgSGl0VGVzdFJlc3VsdCYgcmVzdWx0LCBpbnQgeCwgaW50IHksIGludCB0eCwgaW50IHR5KQor
Ym9vbCBJbmxpbmVCb3g6Om5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiByZXF1ZXN0
LCBIaXRUZXN0UmVzdWx0JiByZXN1bHQsIGludCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHksIEhp
dFRlc3RBY3Rpb24pCiB7CiAgICAgLy8gSGl0IHRlc3QgYWxsIHBoYXNlcyBvZiByZXBsYWNlZCBl
bGVtZW50cyBhdG9taWNhbGx5LCBhcyB0aG91Z2ggdGhlIHJlcGxhY2VkIGVsZW1lbnQgZXN0YWJs
aXNoZWQgaXRzCiAgICAgLy8gb3duIHN0YWNraW5nIGNvbnRleHQuICAoU2VlIEFwcGVuZGl4IEUu
Miwgc2VjdGlvbiA2LjQgb24gaW5saW5lIGJsb2NrL3RhYmxlIGVsZW1lbnRzIGluIHRoZSBDU1My
LjEKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUJveC5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvcmVuZGVyaW5nL0lubGluZUJveC5oCShyZXZpc2lvbiA1NDU2MSkKKysrIFdlYkNvcmUv
cmVuZGVyaW5nL0lubGluZUJveC5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMTMsNyArMTEzLDcgQEAg
cHVibGljOgogICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RQb3NpdGlvbihpbnQgZHgsIGludCBkeSk7
CiAKICAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBpbnQg
dHgsIGludCB0eSk7Ci0gICAgdmlydHVhbCBib29sIG5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RS
ZXF1ZXN0JiwgSGl0VGVzdFJlc3VsdCYsIGludCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHkpOwor
ICAgIHZpcnR1YWwgYm9vbCBub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRl
c3RSZXN1bHQmLCBpbnQgeCwgaW50IHksIGludCB0eCwgaW50IHR5LCBIaXRUZXN0QWN0aW9uKTsK
IAogICAgIC8vIE92ZXJsb2FkZWQgbmV3IG9wZXJhdG9yLgogICAgIHZvaWQqIG9wZXJhdG9yIG5l
dyhzaXplX3QsIFJlbmRlckFyZW5hKikgdGhyb3coKTsKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5n
L0lubGluZUZsb3dCb3guY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL0lubGlu
ZUZsb3dCb3guY3BwCShyZXZpc2lvbiA1NDU2MSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL0lubGlu
ZUZsb3dCb3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSAi
UmVuZGVyTGF5ZXIuaCIKICNpbmNsdWRlICJSZW5kZXJMaXN0TWFya2VyLmgiCiAjaW5jbHVkZSAi
UmVuZGVyVGFibGVDZWxsLmgiCisjaW5jbHVkZSAiUmVuZGVyVmlldy5oIgogI2luY2x1ZGUgIlJv
b3RJbmxpbmVCb3guaCIKICNpbmNsdWRlICJUZXh0LmgiCiAKQEAgLTIyNywxNCArMjI4LDEzIEBA
IHZvaWQgSW5saW5lRmxvd0JveDo6ZGV0ZXJtaW5lU3BhY2luZ0ZvckYKICAgICAgICAgLy8gKDMp
IFRoZSBsaW5lIG1heSBlbmQgb24gdGhlIGlubGluZS4gIElmIHdlIGFyZSB0aGUgbGFzdCBjaGls
ZCAoY2xpbWJpbmcgdXAKICAgICAgICAgLy8gdGhlIGVuZCBvYmplY3QncyBjaGFpbiksIHRoZW4g
d2UganVzdCBjbG9zZWQgYXMgd2VsbC4KICAgICAgICAgaWYgKCFsaW5lQm94TGlzdC0+bGFzdExp
bmVCb3goKS0+aXNDb25zdHJ1Y3RlZCgpKSB7Ci0gICAgICAgICAgICBSZW5kZXJJbmxpbmUqIGlu
bGluZUZsb3cgPSB0b1JlbmRlcklubGluZShyZW5kZXJlcigpKTsKICAgICAgICAgICAgIGlmIChs
dHIpIHsKICAgICAgICAgICAgICAgICBpZiAoIW5leHRMaW5lQm94KCkgJiYKLSAgICAgICAgICAg
ICAgICAgICAgKChsYXN0TGluZSAmJiAhaW5saW5lRmxvdy0+Y29udGludWF0aW9uKCkpIHx8IG5l
eHRPbkxpbmVFeGlzdHMoKSB8fCBvbkVuZENoYWluKGVuZE9iamVjdCkpKQorICAgICAgICAgICAg
ICAgICAgICAobGFzdExpbmUgfHwgbmV4dE9uTGluZUV4aXN0cygpIHx8IG9uRW5kQ2hhaW4oZW5k
T2JqZWN0KSkpCiAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVSaWdodEVkZ2UgPSB0cnVlOwog
ICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoKCFwcmV2TGluZUJveCgp
IHx8IHByZXZMaW5lQm94KCktPmlzQ29uc3RydWN0ZWQoKSkgJiYKLSAgICAgICAgICAgICAgICAg
ICAgKChsYXN0TGluZSAmJiAhaW5saW5lRmxvdy0+Y29udGludWF0aW9uKCkpIHx8IHByZXZPbkxp
bmVFeGlzdHMoKSB8fCBvbkVuZENoYWluKGVuZE9iamVjdCkpKQorICAgICAgICAgICAgICAgICAg
ICAobGFzdExpbmUgfHwgcHJldk9uTGluZUV4aXN0cygpIHx8IG9uRW5kQ2hhaW4oZW5kT2JqZWN0
KSkpCiAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVMZWZ0RWRnZSA9IHRydWU7CiAgICAgICAg
ICAgICB9CiAgICAgICAgIH0KQEAgLTUwNCw3ICs1MDQsNyBAQCB2b2lkIElubGluZUZsb3dCb3g6
OnBsYWNlQm94ZXNWZXJ0aWNhbGx5CiAgICAgICAgICAgICAgICAgbmV3WSAtPSBjdXJyLT5ib3hN
b2RlbE9iamVjdCgpLT5ib3JkZXJUb3AoKSArIGN1cnItPmJveE1vZGVsT2JqZWN0KCktPnBhZGRp
bmdUb3AoKTsKICAgICAgICAgfSBlbHNlIGlmICghY3Vyci0+cmVuZGVyZXIoKS0+aXNCUigpKSB7
CiAgICAgICAgICAgICBSZW5kZXJCb3gqIGJveCA9IHRvUmVuZGVyQm94KGN1cnItPnJlbmRlcmVy
KCkpOwotICAgICAgICAgICAgbmV3WSArPSBib3gtPm1hcmdpblRvcCgpOworICAgICAgICAgICAg
bmV3WSArPSBjdXJyLT5yZW5kZXJlcigpLT5pc0Fub255bW91c0lubGluZUJsb2NrKCkgPyAwIDog
Ym94LT5tYXJnaW5Ub3AoKTsKICAgICAgICAgfQogCiAgICAgICAgIGN1cnItPnNldFkobmV3WSk7
CkBAIC01OTgsNyArNTk4LDcgQEAgdm9pZCBJbmxpbmVGbG93Qm94Ojpjb21wdXRlVmVydGljYWxP
dmVyZgogICAgIHNldFZlcnRpY2FsT3ZlcmZsb3dQb3NpdGlvbnModG9wTGF5b3V0T3ZlcmZsb3cs
IGJvdHRvbUxheW91dE92ZXJmbG93LCB0b3BWaXN1YWxPdmVyZmxvdywgYm90dG9tVmlzdWFsT3Zl
cmZsb3csIGJveEhlaWdodCk7CiB9CiAKLWJvb2wgSW5saW5lRmxvd0JveDo6bm9kZUF0UG9pbnQo
Y29uc3QgSGl0VGVzdFJlcXVlc3QmIHJlcXVlc3QsIEhpdFRlc3RSZXN1bHQmIHJlc3VsdCwgaW50
IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSkKK2Jvb2wgSW5saW5lRmxvd0JveDo6bm9kZUF0UG9p
bnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmIHJlcXVlc3QsIEhpdFRlc3RSZXN1bHQmIHJlc3VsdCwg
aW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSwgSGl0VGVzdEFjdGlvbiBoaXRUZXN0QWN0aW9u
KQogewogICAgIEludFJlY3Qgb3ZlcmZsb3dSZWN0KHZpc2libGVPdmVyZmxvd1JlY3QoKSk7CiAg
ICAgb3ZlcmZsb3dSZWN0Lm1vdmUodHgsIHR5KTsKQEAgLTYwNyw3ICs2MDcsNyBAQCBib29sIElu
bGluZUZsb3dCb3g6Om5vZGVBdFBvaW50KGNvbnN0IEhpCiAKICAgICAvLyBDaGVjayBjaGlsZHJl
biBmaXJzdC4KICAgICBmb3IgKElubGluZUJveCogY3VyciA9IGxhc3RDaGlsZCgpOyBjdXJyOyBj
dXJyID0gY3Vyci0+cHJldk9uTGluZSgpKSB7Ci0gICAgICAgIGlmICgoY3Vyci0+cmVuZGVyZXIo
KS0+aXNUZXh0KCkgfHwgIWN1cnItPmJveE1vZGVsT2JqZWN0KCktPmhhc1NlbGZQYWludGluZ0xh
eWVyKCkpICYmIGN1cnItPm5vZGVBdFBvaW50KHJlcXVlc3QsIHJlc3VsdCwgeCwgeSwgdHgsIHR5
KSkgeworICAgICAgICBpZiAoKGN1cnItPnJlbmRlcmVyKCktPmlzVGV4dCgpIHx8ICFjdXJyLT5i
b3hNb2RlbE9iamVjdCgpLT5oYXNTZWxmUGFpbnRpbmdMYXllcigpKSAmJiBjdXJyLT5ub2RlQXRQ
b2ludChyZXF1ZXN0LCByZXN1bHQsIHgsIHksIHR4LCB0eSwgaGl0VGVzdEFjdGlvbikpIHsKICAg
ICAgICAgICAgIHJlbmRlcmVyKCktPnVwZGF0ZUhpdFRlc3RSZXN1bHQocmVzdWx0LCBJbnRQb2lu
dCh4IC0gdHgsIHkgLSB0eSkpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0K
QEAgLTYyNSw2ICs2MjUsMTIgQEAgYm9vbCBJbmxpbmVGbG93Qm94Ojpub2RlQXRQb2ludChjb25z
dCBIaQogCiB2b2lkIElubGluZUZsb3dCb3g6OnBhaW50KFJlbmRlck9iamVjdDo6UGFpbnRJbmZv
JiBwYWludEluZm8sIGludCB0eCwgaW50IHR5KQogeworICAgIC8vIEFzIGxvbmcgYXMgd2UgZG9u
J3QgaGF2ZSBhbiBhbm9ueW1vdXMgaW5saW5lIGJsb2NrIG9uIG91ciBsaW5lLCB3ZSByZXN0cmlj
dCBvdXIgcGFpbnRpbmcgb25seSB0byBhIGZldyBwaGFzZXMuCisgICAgaWYgKCFwYWludEluZm8u
YW5vbnltb3VzSW5saW5lQmxvY2sgJiYgKHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlRm9y
ZWdyb3VuZCAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZVNlbGVjdGlvbiAmJiBwYWlu
dEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZU91dGxpbmUgCisgICAgICAgICYmIHBhaW50SW5mby5w
aGFzZSAhPSBQYWludFBoYXNlU2VsZk91dGxpbmUgJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50
UGhhc2VDaGlsZE91dGxpbmVzICYmIHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlVGV4dENs
aXAKKyAgICAgICAgJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VNYXNrKSkKKyAgICAg
ICAgcmV0dXJuOworICAgIAogICAgIEludFJlY3Qgb3ZlcmZsb3dSZWN0KHZpc2libGVPdmVyZmxv
d1JlY3QoKSk7CiAgICAgb3ZlcmZsb3dSZWN0LmluZmxhdGUocmVuZGVyZXIoKS0+bWF4aW1hbE91
dGxpbmVTaXplKHBhaW50SW5mby5waGFzZSkpOwogICAgIG92ZXJmbG93UmVjdC5tb3ZlKHR4LCB0
eSk7CkBAIC02MzgsMTMgKzY0NCw3IEBAIHZvaWQgSW5saW5lRmxvd0JveDo6cGFpbnQoUmVuZGVy
T2JqZWN0OjoKICAgICAgICAgICAgIC8vIG91dGxpbmVzLgogICAgICAgICAgICAgaWYgKHJlbmRl
cmVyKCktPnN0eWxlKCktPnZpc2liaWxpdHkoKSA9PSBWSVNJQkxFICYmIHJlbmRlcmVyKCktPmhh
c091dGxpbmUoKSAmJiAhaXNSb290SW5saW5lQm94KCkpIHsKICAgICAgICAgICAgICAgICBSZW5k
ZXJJbmxpbmUqIGlubGluZUZsb3cgPSB0b1JlbmRlcklubGluZShyZW5kZXJlcigpKTsKLSAgICAg
ICAgICAgICAgICBpZiAoKGlubGluZUZsb3ctPmNvbnRpbnVhdGlvbigpIHx8IGlubGluZUZsb3ct
PmlzSW5saW5lQ29udGludWF0aW9uKCkpICYmICFib3hNb2RlbE9iamVjdCgpLT5oYXNTZWxmUGFp
bnRpbmdMYXllcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFkZCBvdXJzZWx2ZXMgdG8g
dGhlIGNvbnRhaW5pbmcgYmxvY2sgb2YgdGhlIGVudGlyZSBjb250aW51YXRpb24gc28gdGhhdCBp
dCBjYW4KLSAgICAgICAgICAgICAgICAgICAgLy8gcGFpbnQgdXMgYXRvbWljYWxseS4KLSAgICAg
ICAgICAgICAgICAgICAgUmVuZGVyQmxvY2sqIGJsb2NrID0gcmVuZGVyZXIoKS0+Y29udGFpbmlu
Z0Jsb2NrKCktPmNvbnRhaW5pbmdCbG9jaygpOwotICAgICAgICAgICAgICAgICAgICBibG9jay0+
YWRkQ29udGludWF0aW9uV2l0aE91dGxpbmUodG9SZW5kZXJJbmxpbmUocmVuZGVyZXIoKS0+bm9k
ZSgpLT5yZW5kZXJlcigpKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghaW5saW5lRmxv
dy0+aXNJbmxpbmVDb250aW51YXRpb24oKSkKLSAgICAgICAgICAgICAgICAgICAgcGFpbnRJbmZv
Lm91dGxpbmVPYmplY3RzLT5hZGQoaW5saW5lRmxvdyk7CisgICAgICAgICAgICAgICAgcGFpbnRJ
bmZvLm91dGxpbmVPYmplY3RzLT5hZGQoaW5saW5lRmxvdyk7CiAgICAgICAgICAgICB9CiAgICAg
ICAgIH0gZWxzZSBpZiAocGFpbnRJbmZvLnBoYXNlID09IFBhaW50UGhhc2VNYXNrKSB7CiAgICAg
ICAgICAgICBwYWludE1hc2socGFpbnRJbmZvLCB0eCwgdHkpOwpAQCAtNzI5LDcgKzcyOSw3IEBA
IHZvaWQgSW5saW5lRmxvd0JveDo6cGFpbnRCb3hTaGFkb3coR3JhcGgKIAogdm9pZCBJbmxpbmVG
bG93Qm94OjpwYWludEJveERlY29yYXRpb25zKFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBwYWlu
dEluZm8sIGludCB0eCwgaW50IHR5KQogewotICAgIGlmICghcmVuZGVyZXIoKS0+c2hvdWxkUGFp
bnRXaXRoaW5Sb290KHBhaW50SW5mbykgfHwgcmVuZGVyZXIoKS0+c3R5bGUoKS0+dmlzaWJpbGl0
eSgpICE9IFZJU0lCTEUgfHwgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VGb3JlZ3JvdW5k
KQorICAgIGlmICghcmVuZGVyZXIoKS0+c2hvdWxkUGFpbnRXaXRoaW5Sb290KHBhaW50SW5mbykg
fHwgcmVuZGVyZXIoKS0+c3R5bGUoKS0+dmlzaWJpbGl0eSgpICE9IFZJU0lCTEUgfHwgcGFpbnRJ
bmZvLnBoYXNlICE9IFBhaW50UGhhc2VGb3JlZ3JvdW5kIHx8IHBhaW50SW5mby5hbm9ueW1vdXNJ
bmxpbmVCbG9jaykKICAgICAgICAgcmV0dXJuOwogCiAgICAgaW50IHggPSBtX3g7CkBAIC04MDUs
NyArODA1LDcgQEAgdm9pZCBJbmxpbmVGbG93Qm94OjpwYWludEJveERlY29yYXRpb25zKAogCiB2
b2lkIElubGluZUZsb3dCb3g6OnBhaW50TWFzayhSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFp
bnRJbmZvLCBpbnQgdHgsIGludCB0eSkKIHsKLSAgICBpZiAoIXJlbmRlcmVyKCktPnNob3VsZFBh
aW50V2l0aGluUm9vdChwYWludEluZm8pIHx8IHJlbmRlcmVyKCktPnN0eWxlKCktPnZpc2liaWxp
dHkoKSAhPSBWSVNJQkxFIHx8IHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlTWFzaykKKyAg
ICBpZiAoIXJlbmRlcmVyKCktPnNob3VsZFBhaW50V2l0aGluUm9vdChwYWludEluZm8pIHx8IHJl
bmRlcmVyKCktPnN0eWxlKCktPnZpc2liaWxpdHkoKSAhPSBWSVNJQkxFIHx8IHBhaW50SW5mby5w
aGFzZSAhPSBQYWludFBoYXNlTWFzayB8fCBwYWludEluZm8uYW5vbnltb3VzSW5saW5lQmxvY2sp
CiAgICAgICAgIHJldHVybjsKIAogICAgIGludCB4ID0gbV94OwpAQCAtOTAwLDcgKzkwMCw3IEBA
IHZvaWQgSW5saW5lRmxvd0JveDo6cGFpbnRUZXh0RGVjb3JhdGlvbnMKICAgICAvLyBQYWludCB0
ZXh0IGRlY29yYXRpb25zIGxpa2UgdW5kZXJsaW5lcy9vdmVybGluZXMuIFdlIG9ubHkgZG8gdGhp
cyBpZiB3ZSBhcmVuJ3QgaW4gcXVpcmtzIG1vZGUgKGkuZS4sIGluCiAgICAgLy8gYWxtb3N0LXN0
cmljdCBtb2RlIG9yIHN0cmljdCBtb2RlKS4KICAgICBpZiAocmVuZGVyZXIoKS0+c3R5bGUoKS0+
aHRtbEhhY2tzKCkgfHwgIXJlbmRlcmVyKCktPnNob3VsZFBhaW50V2l0aGluUm9vdChwYWludElu
Zm8pIHx8Ci0gICAgICAgIHJlbmRlcmVyKCktPnN0eWxlKCktPnZpc2liaWxpdHkoKSAhPSBWSVNJ
QkxFKQorICAgICAgICByZW5kZXJlcigpLT5zdHlsZSgpLT52aXNpYmlsaXR5KCkgIT0gVklTSUJM
RSB8fCBwYWludEluZm8uYW5vbnltb3VzSW5saW5lQmxvY2spCiAgICAgICAgIHJldHVybjsKICAg
ICAKICAgICAvLyBXZSBkb24ndCB3YW50IHVuZGVybGluZXMgb3Igb3RoZXIgZGVjb3JhdGlvbnMg
d2hlbiB3ZSdyZSB0cnlpbmcgdG8gZHJhdyBub3RoaW5nIGJ1dCB0aGUgc2VsZWN0aW9uIGFzIHdo
aXRlIHRleHQuCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVGbG93Qm94LmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lRmxvd0JveC5oCShyZXZpc2lvbiA1NDU2
MSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUZsb3dCb3guaAkod29ya2luZyBjb3B5KQpA
QCAtOTEsNyArOTEsNyBAQCBwdWJsaWM6CiAgICAgdm9pZCBwYWludEJveFNoYWRvdyhHcmFwaGlj
c0NvbnRleHQqLCBSZW5kZXJTdHlsZSosIFNoYWRvd1N0eWxlLCBpbnQgdHgsIGludCB0eSwgaW50
IHcsIGludCBoKTsKICAgICB2aXJ0dWFsIHZvaWQgcGFpbnRUZXh0RGVjb3JhdGlvbnMoUmVuZGVy
T2JqZWN0OjpQYWludEluZm8mLCBpbnQgdHgsIGludCB0eSwgYm9vbCBwYWludGVkQ2hpbGRyZW4g
PSBmYWxzZSk7CiAgICAgdmlydHVhbCB2b2lkIHBhaW50KFJlbmRlck9iamVjdDo6UGFpbnRJbmZv
JiwgaW50IHR4LCBpbnQgdHkpOwotICAgIHZpcnR1YWwgYm9vbCBub2RlQXRQb2ludChjb25zdCBI
aXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBpbnQgeCwgaW50IHksIGludCB0eCwgaW50
IHR5KTsKKyAgICB2aXJ0dWFsIGJvb2wgbm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3Qm
LCBIaXRUZXN0UmVzdWx0JiwgaW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSwgSGl0VGVzdEFj
dGlvbik7CiAKICAgICB2aXJ0dWFsIFJlbmRlckxpbmVCb3hMaXN0KiByZW5kZXJlckxpbmVCb3hl
cygpIGNvbnN0OwogCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVJdGVyYXRvci5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUl0ZXJhdG9yLmgJKHJldmlzaW9u
IDApCisrKyBXZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVJdGVyYXRvci5oCShyZXZpc2lvbiAwKQpA
QCAtMCwwICsxLDI2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBMYXJzIEtub2xsIChr
bm9sbEBrZGUub3JnKQorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA2LCAyMDA3LCAy
MDA4LCAyMDA5LCAyMDEwIEFwcGxlIEluYy4gQWxsIHJpZ2h0IHJlc2VydmVkLgorICogQ29weXJp
Z2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhp
cyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9v
cgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZv
dW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91
ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0
cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhP
VVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAq
IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNl
ZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0
YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUg
TGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFy
eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBG
bG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZuZGVm
IElubGluZUl0ZXJhdG9yX2gKKyNkZWZpbmUgSW5saW5lSXRlcmF0b3JfaAorCisjaW5jbHVkZSAi
QmlkaVJ1bi5oIgorI2luY2x1ZGUgIlJlbmRlckJsb2NrLmgiCisjaW5jbHVkZSAiUmVuZGVyVGV4
dC5oIgorI2luY2x1ZGUgPHd0Zi9BbHdheXNJbmxpbmUuaD4KKyNpbmNsdWRlIDx3dGYvU3RkTGli
RXh0cmFzLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgSW5saW5lSXRlcmF0b3Ig
eworcHVibGljOgorICAgIElubGluZUl0ZXJhdG9yKCkKKyAgICAgICAgOiBibG9jaygwKQorICAg
ICAgICAsIG9iaigwKQorICAgICAgICAsIHBvcygwKQorICAgICAgICAsIG5leHRCcmVha2FibGVQ
b3NpdGlvbigtMSkKKyAgICB7CisgICAgfQorCisgICAgSW5saW5lSXRlcmF0b3IoUmVuZGVyQmxv
Y2sqIGIsIFJlbmRlck9iamVjdCogbywgdW5zaWduZWQgcCkKKyAgICAgICAgOiBibG9jayhiKQor
ICAgICAgICAsIG9iaihvKQorICAgICAgICAsIHBvcyhwKQorICAgICAgICAsIG5leHRCcmVha2Fi
bGVQb3NpdGlvbigtMSkKKyAgICB7CisgICAgfQorCisgICAgdm9pZCBpbmNyZW1lbnQoSW5saW5l
QmlkaVJlc29sdmVyKiByZXNvbHZlciA9IDApOworICAgIGJvb2wgYXRFbmQoKSBjb25zdDsKKwor
ICAgIFVDaGFyIGN1cnJlbnQoKSBjb25zdDsKKyAgICBXVEY6OlVuaWNvZGU6OkRpcmVjdGlvbiBk
aXJlY3Rpb24oKSBjb25zdDsKKworICAgIFJlbmRlckJsb2NrKiBibG9jazsKKyAgICBSZW5kZXJP
YmplY3QqIG9iajsKKyAgICB1bnNpZ25lZCBwb3M7CisgICAgaW50IG5leHRCcmVha2FibGVQb3Np
dGlvbjsKK307CisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgSW5saW5lSXRlcmF0b3Im
IGl0MSwgY29uc3QgSW5saW5lSXRlcmF0b3ImIGl0MikKK3sKKyAgICByZXR1cm4gaXQxLnBvcyA9
PSBpdDIucG9zICYmIGl0MS5vYmogPT0gaXQyLm9iajsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0
b3IhPShjb25zdCBJbmxpbmVJdGVyYXRvciYgaXQxLCBjb25zdCBJbmxpbmVJdGVyYXRvciYgaXQy
KQoreworICAgIHJldHVybiBpdDEucG9zICE9IGl0Mi5wb3MgfHwgaXQxLm9iaiAhPSBpdDIub2Jq
OworfQorCitzdGF0aWMgaW5saW5lIFJlbmRlck9iamVjdCogYmlkaU5leHQoUmVuZGVyQmxvY2sq
IGJsb2NrLCBSZW5kZXJPYmplY3QqIGN1cnJlbnQsIElubGluZUJpZGlSZXNvbHZlciogcmVzb2x2
ZXIgPSAwLCBib29sIHNraXBJbmxpbmVzID0gdHJ1ZSwgYm9vbCogZW5kT2ZJbmxpbmVQdHIgPSAw
KQoreworICAgIFJlbmRlck9iamVjdCogbmV4dCA9IDA7CisgICAgYm9vbCBvbGRFbmRPZklubGlu
ZSA9IGVuZE9mSW5saW5lUHRyID8gKmVuZE9mSW5saW5lUHRyIDogZmFsc2U7CisgICAgYm9vbCBl
bmRPZklubGluZSA9IGZhbHNlOworCisgICAgd2hpbGUgKGN1cnJlbnQpIHsKKyAgICAgICAgbmV4
dCA9IDA7CisgICAgICAgIGlmICghb2xkRW5kT2ZJbmxpbmUgJiYgIWN1cnJlbnQtPmlzRmxvYXRp
bmcoKSAmJiAhY3VycmVudC0+aXNSZXBsYWNlZCgpICYmICFjdXJyZW50LT5pc1Bvc2l0aW9uZWQo
KSAmJiAhY3VycmVudC0+aXNUZXh0KCkpIHsKKyAgICAgICAgICAgIG5leHQgPSBjdXJyZW50LT5m
aXJzdENoaWxkKCk7CisgICAgICAgICAgICBpZiAobmV4dCAmJiByZXNvbHZlciAmJiBuZXh0LT5p
c1JlbmRlcklubGluZSgpKSB7CisgICAgICAgICAgICAgICAgRVVuaWNvZGVCaWRpIHViID0gbmV4
dC0+c3R5bGUoKS0+dW5pY29kZUJpZGkoKTsKKyAgICAgICAgICAgICAgICBpZiAodWIgIT0gVUJO
b3JtYWwpIHsKKyAgICAgICAgICAgICAgICAgICAgVGV4dERpcmVjdGlvbiBkaXIgPSBuZXh0LT5z
dHlsZSgpLT5kaXJlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgV1RGOjpVbmljb2RlOjpE
aXJlY3Rpb24gZCA9ICh1YiA9PSBFbWJlZAorICAgICAgICAgICAgICAgICAgICAgICAgPyAoZGly
ID09IFJUTCA/IFdURjo6VW5pY29kZTo6UmlnaHRUb0xlZnRFbWJlZGRpbmcgOiBXVEY6OlVuaWNv
ZGU6OkxlZnRUb1JpZ2h0RW1iZWRkaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgOiAoZGly
ID09IFJUTCA/IFdURjo6VW5pY29kZTo6UmlnaHRUb0xlZnRPdmVycmlkZSA6IFdURjo6VW5pY29k
ZTo6TGVmdFRvUmlnaHRPdmVycmlkZSkpOworICAgICAgICAgICAgICAgICAgICByZXNvbHZlci0+
ZW1iZWQoZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisK
KyAgICAgICAgaWYgKCFuZXh0KSB7CisgICAgICAgICAgICBpZiAoIXNraXBJbmxpbmVzICYmICFv
bGRFbmRPZklubGluZSAmJiBjdXJyZW50LT5pc1JlbmRlcklubGluZSgpKSB7CisgICAgICAgICAg
ICAgICAgbmV4dCA9IGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgZW5kT2ZJbmxpbmUgPSB0cnVl
OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3
aGlsZSAoY3VycmVudCAmJiBjdXJyZW50ICE9IGJsb2NrKSB7CisgICAgICAgICAgICAgICAgaWYg
KHJlc29sdmVyICYmIGN1cnJlbnQtPmlzUmVuZGVySW5saW5lKCkgJiYgY3VycmVudC0+c3R5bGUo
KS0+dW5pY29kZUJpZGkoKSAhPSBVQk5vcm1hbCkKKyAgICAgICAgICAgICAgICAgICAgcmVzb2x2
ZXItPmVtYmVkKFdURjo6VW5pY29kZTo6UG9wRGlyZWN0aW9uYWxGb3JtYXQpOworCisgICAgICAg
ICAgICAgICAgbmV4dCA9IGN1cnJlbnQtPm5leHRTaWJsaW5nKCk7CisgICAgICAgICAgICAgICAg
aWYgKG5leHQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVyICYmIG5leHQtPmlz
UmVuZGVySW5saW5lKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVVbmljb2RlQmlkaSB1
YiA9IG5leHQtPnN0eWxlKCktPnVuaWNvZGVCaWRpKCk7CisgICAgICAgICAgICAgICAgICAgICAg
ICBpZiAodWIgIT0gVUJOb3JtYWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0
RGlyZWN0aW9uIGRpciA9IG5leHQtPnN0eWxlKCktPmRpcmVjdGlvbigpOworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIFdURjo6VW5pY29kZTo6RGlyZWN0aW9uIGQgPSAodWIgPT0gRW1iZWQK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoZGlyID09IFJUTCA/IFdURjo6VW5p
Y29kZTo6UmlnaHRUb0xlZnRFbWJlZGRpbmc6IFdURjo6VW5pY29kZTo6TGVmdFRvUmlnaHRFbWJl
ZGRpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGRpciA9PSBSVEwgPyBX
VEY6OlVuaWNvZGU6OlJpZ2h0VG9MZWZ0T3ZlcnJpZGUgOiBXVEY6OlVuaWNvZGU6OkxlZnRUb1Jp
Z2h0T3ZlcnJpZGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlci0+ZW1i
ZWQoZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgICAgIAorICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5wYXJlbnQoKTsKKyAg
ICAgICAgICAgICAgICBpZiAoIXNraXBJbmxpbmVzICYmIGN1cnJlbnQgJiYgY3VycmVudCAhPSBi
bG9jayAmJiBjdXJyZW50LT5pc1JlbmRlcklubGluZSgpKSB7CisgICAgICAgICAgICAgICAgICAg
IG5leHQgPSBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBlbmRPZklubGluZSA9IHRydWU7
CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghbmV4dCkKKyAgICAgICAgICAgIGJyZWFr
OworCisgICAgICAgIGlmIChuZXh0LT5pc1RleHQoKSB8fCBuZXh0LT5pc0Zsb2F0aW5nKCkgfHwg
bmV4dC0+aXNSZXBsYWNlZCgpIHx8IG5leHQtPmlzUG9zaXRpb25lZCgpCisgICAgICAgICAgICB8
fCAoKCFza2lwSW5saW5lcyB8fCAhbmV4dC0+Zmlyc3RDaGlsZCgpKSAvLyBBbHdheXMgcmV0dXJu
IEVNUFRZIGlubGluZXMuCisgICAgICAgICAgICAgICAgJiYgbmV4dC0+aXNSZW5kZXJJbmxpbmUo
KSkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY3VycmVudCA9IG5leHQ7CisgICAgfQor
CisgICAgaWYgKGVuZE9mSW5saW5lUHRyKQorICAgICAgICAqZW5kT2ZJbmxpbmVQdHIgPSBlbmRP
ZklubGluZTsKKworICAgIHJldHVybiBuZXh0OworfQorCitzdGF0aWMgaW5saW5lIFJlbmRlck9i
amVjdCogYmlkaUZpcnN0KFJlbmRlckJsb2NrKiBibG9jaywgSW5saW5lQmlkaVJlc29sdmVyKiBy
ZXNvbHZlciwgYm9vbCBza2lwSW5saW5lcyA9IHRydWUpCit7CisgICAgaWYgKCFibG9jay0+Zmly
c3RDaGlsZCgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICAKKyAgICBSZW5kZXJPYmplY3QqIG8g
PSBibG9jay0+Zmlyc3RDaGlsZCgpOworICAgIGlmIChvLT5pc1JlbmRlcklubGluZSgpKSB7Cisg
ICAgICAgIGlmIChyZXNvbHZlcikgeworICAgICAgICAgICAgRVVuaWNvZGVCaWRpIHViID0gby0+
c3R5bGUoKS0+dW5pY29kZUJpZGkoKTsKKyAgICAgICAgICAgIGlmICh1YiAhPSBVQk5vcm1hbCkg
eworICAgICAgICAgICAgICAgIFRleHREaXJlY3Rpb24gZGlyID0gby0+c3R5bGUoKS0+ZGlyZWN0
aW9uKCk7CisgICAgICAgICAgICAgICAgV1RGOjpVbmljb2RlOjpEaXJlY3Rpb24gZCA9ICh1YiA9
PSBFbWJlZAorICAgICAgICAgICAgICAgICAgICA/IChkaXIgPT0gUlRMID8gV1RGOjpVbmljb2Rl
OjpSaWdodFRvTGVmdEVtYmVkZGluZyA6IFdURjo6VW5pY29kZTo6TGVmdFRvUmlnaHRFbWJlZGRp
bmcpCisgICAgICAgICAgICAgICAgICAgIDogKGRpciA9PSBSVEwgPyBXVEY6OlVuaWNvZGU6OlJp
Z2h0VG9MZWZ0T3ZlcnJpZGUgOiBXVEY6OlVuaWNvZGU6OkxlZnRUb1JpZ2h0T3ZlcnJpZGUpKTsK
KyAgICAgICAgICAgICAgICByZXNvbHZlci0+ZW1iZWQoZCk7CisgICAgICAgICAgICB9CisgICAg
ICAgIH0KKyAgICAgICAgaWYgKHNraXBJbmxpbmVzICYmIG8tPmZpcnN0Q2hpbGQoKSkKKyAgICAg
ICAgICAgIG8gPSBiaWRpTmV4dChibG9jaywgbywgcmVzb2x2ZXIsIHNraXBJbmxpbmVzKTsKKyAg
ICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyBOZXZlciBza2lwIGVtcHR5IGlubGluZXMuCisg
ICAgICAgICAgICBpZiAocmVzb2x2ZXIpCisgICAgICAgICAgICAgICAgcmVzb2x2ZXItPmNvbW1p
dEV4cGxpY2l0RW1iZWRkaW5nKCk7CisgICAgICAgICAgICByZXR1cm4gbzsgCisgICAgICAgIH0K
KyAgICB9CisKKyAgICBpZiAobyAmJiAhby0+aXNUZXh0KCkgJiYgIW8tPmlzUmVwbGFjZWQoKSAm
JiAhby0+aXNGbG9hdGluZygpICYmICFvLT5pc1Bvc2l0aW9uZWQoKSkKKyAgICAgICAgbyA9IGJp
ZGlOZXh0KGJsb2NrLCBvLCByZXNvbHZlciwgc2tpcElubGluZXMpOworCisgICAgaWYgKHJlc29s
dmVyKQorICAgICAgICByZXNvbHZlci0+Y29tbWl0RXhwbGljaXRFbWJlZGRpbmcoKTsKKyAgICBy
ZXR1cm4gbzsKK30KKworaW5saW5lIHZvaWQgSW5saW5lSXRlcmF0b3I6OmluY3JlbWVudChJbmxp
bmVCaWRpUmVzb2x2ZXIqIHJlc29sdmVyKQoreworICAgIGlmICghb2JqKQorICAgICAgICByZXR1
cm47CisgICAgaWYgKG9iai0+aXNUZXh0KCkpIHsKKyAgICAgICAgcG9zKys7CisgICAgICAgIGlm
IChwb3MgPj0gdG9SZW5kZXJUZXh0KG9iaiktPnRleHRMZW5ndGgoKSkgeworICAgICAgICAgICAg
b2JqID0gYmlkaU5leHQoYmxvY2ssIG9iaiwgcmVzb2x2ZXIpOworICAgICAgICAgICAgcG9zID0g
MDsKKyAgICAgICAgICAgIG5leHRCcmVha2FibGVQb3NpdGlvbiA9IC0xOworICAgICAgICB9Cisg
ICAgfSBlbHNlIHsKKyAgICAgICAgb2JqID0gYmlkaU5leHQoYmxvY2ssIG9iaiwgcmVzb2x2ZXIp
OworICAgICAgICBwb3MgPSAwOworICAgICAgICBuZXh0QnJlYWthYmxlUG9zaXRpb24gPSAtMTsK
KyAgICB9Cit9CisKK2lubGluZSBib29sIElubGluZUl0ZXJhdG9yOjphdEVuZCgpIGNvbnN0Cit7
CisgICAgcmV0dXJuICFvYmo7Cit9CisKK2lubGluZSBVQ2hhciBJbmxpbmVJdGVyYXRvcjo6Y3Vy
cmVudCgpIGNvbnN0Cit7CisgICAgaWYgKCFvYmogfHwgIW9iai0+aXNUZXh0KCkpCisgICAgICAg
IHJldHVybiAwOworCisgICAgUmVuZGVyVGV4dCogdGV4dCA9IHRvUmVuZGVyVGV4dChvYmopOwor
ICAgIGlmIChwb3MgPj0gdGV4dC0+dGV4dExlbmd0aCgpKQorICAgICAgICByZXR1cm4gMDsKKwor
ICAgIHJldHVybiB0ZXh0LT5jaGFyYWN0ZXJzKClbcG9zXTsKK30KKworQUxXQVlTX0lOTElORSBX
VEY6OlVuaWNvZGU6OkRpcmVjdGlvbiBJbmxpbmVJdGVyYXRvcjo6ZGlyZWN0aW9uKCkgY29uc3QK
K3sKKyAgICBpZiAoVUNoYXIgYyA9IGN1cnJlbnQoKSkKKyAgICAgICAgcmV0dXJuIFdURjo6VW5p
Y29kZTo6ZGlyZWN0aW9uKGMpOworCisgICAgaWYgKG9iaiAmJiBvYmotPmlzTGlzdE1hcmtlcigp
KQorICAgICAgICByZXR1cm4gb2JqLT5zdHlsZSgpLT5kaXJlY3Rpb24oKSA9PSBMVFIgPyBXVEY6
OlVuaWNvZGU6OkxlZnRUb1JpZ2h0IDogV1RGOjpVbmljb2RlOjpSaWdodFRvTGVmdDsKKworICAg
IHJldHVybiBXVEY6OlVuaWNvZGU6Ok90aGVyTmV1dHJhbDsKK30KKwordGVtcGxhdGU8PgoraW5s
aW5lIHZvaWQgSW5saW5lQmlkaVJlc29sdmVyOjppbmNyZW1lbnQoKQoreworICAgIGN1cnJlbnQu
aW5jcmVtZW50KHRoaXMpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIHZvaWQgSW5saW5lQmlk
aVJlc29sdmVyOjphcHBlbmRSdW4oKQoreworICAgIGlmICghZW1wdHlSdW4gJiYgIWVvci5hdEVu
ZCgpKSB7CisgICAgICAgIGludCBzdGFydCA9IHNvci5wb3M7CisgICAgICAgIFJlbmRlck9iamVj
dCAqb2JqID0gc29yLm9iajsKKyAgICAgICAgd2hpbGUgKG9iaiAmJiBvYmogIT0gZW9yLm9iaiAm
JiBvYmogIT0gZW5kT2ZMaW5lLm9iaikgeworICAgICAgICAgICAgUmVuZGVyQmxvY2s6OmFwcGVu
ZFJ1bnNGb3JPYmplY3Qoc3RhcnQsIG9iai0+bGVuZ3RoKCksIG9iaiwgKnRoaXMpOyAgICAgICAg
CisgICAgICAgICAgICBzdGFydCA9IDA7CisgICAgICAgICAgICBvYmogPSBiaWRpTmV4dChzb3Iu
YmxvY2ssIG9iaik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9iaikgeworICAgICAgICAgICAg
dW5zaWduZWQgcG9zID0gb2JqID09IGVvci5vYmogPyBlb3IucG9zIDogVUlOVF9NQVg7CisgICAg
ICAgICAgICBpZiAob2JqID09IGVuZE9mTGluZS5vYmogJiYgZW5kT2ZMaW5lLnBvcyA8PSBwb3Mp
IHsKKyAgICAgICAgICAgICAgICByZWFjaGVkRW5kT2ZMaW5lID0gdHJ1ZTsKKyAgICAgICAgICAg
ICAgICBwb3MgPSBlbmRPZkxpbmUucG9zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8g
SXQncyBPSyB0byBhZGQgcnVucyBmb3IgemVyby1sZW5ndGggUmVuZGVyT2JqZWN0cywganVzdCBk
b24ndCBtYWtlIHRoZSBydW4gbGFyZ2VyIHRoYW4gaXQgc2hvdWxkIGJlCisgICAgICAgICAgICBp
bnQgZW5kID0gb2JqLT5sZW5ndGgoKSA/IHBvcysxIDogMDsKKyAgICAgICAgICAgIFJlbmRlckJs
b2NrOjphcHBlbmRSdW5zRm9yT2JqZWN0KHN0YXJ0LCBlbmQsIG9iaiwgKnRoaXMpOworICAgICAg
ICB9CisgICAgICAgIAorICAgICAgICBlb3IuaW5jcmVtZW50KCk7CisgICAgICAgIHNvciA9IGVv
cjsKKyAgICB9CisKKyAgICBtX2RpcmVjdGlvbiA9IFdURjo6VW5pY29kZTo6T3RoZXJOZXV0cmFs
OworICAgIG1fc3RhdHVzLmVvciA9IFdURjo6VW5pY29kZTo6T3RoZXJOZXV0cmFsOworfQorCit9
CisKKyNlbmRpZiAvLyBJbmxpbmVJdGVyYXRvcl9oCisKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5n
L0lubGluZVRleHRCb3guY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL0lubGlu
ZVRleHRCb3guY3BwCShyZXZpc2lvbiA1NDU2MSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL0lubGlu
ZVRleHRCb3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNjAsNyArMjYwLDcgQEAgYm9vbCBJbmxp
bmVUZXh0Qm94Ojppc0xpbmVCcmVhaygpIGNvbnN0CiAgICAgcmV0dXJuIHJlbmRlcmVyKCktPmlz
QlIoKSB8fCAocmVuZGVyZXIoKS0+c3R5bGUoKS0+cHJlc2VydmVOZXdsaW5lKCkgJiYgbGVuKCkg
PT0gMSAmJiAoKnRleHRSZW5kZXJlcigpLT50ZXh0KCkpW3N0YXJ0KCldID09ICdcbicpOwogfQog
Ci1ib29sIElubGluZVRleHRCb3g6Om5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0Jiwg
SGl0VGVzdFJlc3VsdCYgcmVzdWx0LCBpbnQgeCwgaW50IHksIGludCB0eCwgaW50IHR5KQorYm9v
bCBJbmxpbmVUZXh0Qm94Ojpub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRl
c3RSZXN1bHQmIHJlc3VsdCwgaW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSwgSGl0VGVzdEFj
dGlvbikKIHsKICAgICBpZiAoaXNMaW5lQnJlYWsoKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwpJ
bmRleDogV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lVGV4dEJveC5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvcmVuZGVyaW5nL0lubGluZVRleHRCb3guaAkocmV2aXNpb24gNTQ1NjEpCisrKyBXZWJD
b3JlL3JlbmRlcmluZy9JbmxpbmVUZXh0Qm94LmgJKHdvcmtpbmcgY29weSkKQEAgLTc1LDcgKzc1
LDcgQEAgcHVibGljOgogCiBwcml2YXRlOgogICAgIHZpcnR1YWwgdm9pZCBwYWludChSZW5kZXJP
YmplY3Q6OlBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5KTsKLSAgICB2aXJ0dWFsIGJvb2wgbm9k
ZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVzdWx0JiwgaW50IHgsIGlu
dCB5LCBpbnQgdHgsIGludCB0eSk7CisgICAgdmlydHVhbCBib29sIG5vZGVBdFBvaW50KGNvbnN0
IEhpdFRlc3RSZXF1ZXN0JiwgSGl0VGVzdFJlc3VsdCYsIGludCB4LCBpbnQgeSwgaW50IHR4LCBp
bnQgdHksIEhpdFRlc3RBY3Rpb24pOwogCiBwdWJsaWM6CiAgICAgUmVuZGVyVGV4dCogdGV4dFJl
bmRlcmVyKCkgY29uc3Q7CkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suY3BwCShyZXZpc2lv
biA1NDU2MSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtNzcsOCArNzcsNiBAQCBzdGF0aWMgUGVyY2VudEhlaWdodERlc2NlbmRhbnRzTWFw
KiBnUGVyCiAKIHR5cGVkZWYgV1RGOjpIYXNoTWFwPGNvbnN0IFJlbmRlckJveCosIEhhc2hTZXQ8
UmVuZGVyQmxvY2sqPio+IFBlcmNlbnRIZWlnaHRDb250YWluZXJNYXA7CiBzdGF0aWMgUGVyY2Vu
dEhlaWdodENvbnRhaW5lck1hcCogZ1BlcmNlbnRIZWlnaHRDb250YWluZXJNYXAgPSAwOwotICAg
IAotdHlwZWRlZiBXVEY6Okhhc2hNYXA8UmVuZGVyQmxvY2sqLCBMaXN0SGFzaFNldDxSZW5kZXJJ
bmxpbmUqPio+IENvbnRpbnVhdGlvbk91dGxpbmVUYWJsZU1hcDsKIAogdHlwZWRlZiBXVEY6Okhh
c2hTZXQ8UmVuZGVyQmxvY2sqPiBEZWxheWVkVXBkYXRlU2Nyb2xsSW5mb1NldDsKIHN0YXRpYyBp
bnQgZ0RlbGF5VXBkYXRlU2Nyb2xsSW5mbyA9IDA7CkBAIC05MSw3ICs4OSw3IEBAIFJlbmRlckJs
b2NrOjpNYXJnaW5JbmZvOjpNYXJnaW5JbmZvKFJlbmQKICAgICAvLyBpZiB3ZSBoYWQgYW55IGJv
cmRlci9wYWRkaW5nIChvYnZpb3VzbHkpLCBpZiB3ZSdyZSB0aGUgcm9vdCBvciBIVE1MIGVsZW1l
bnRzLCBvciBpZgogICAgIC8vIHdlJ3JlIHBvc2l0aW9uZWQsIGZsb2F0aW5nLCBhIHRhYmxlIGNl
bGwuCiAgICAgbV9jYW5Db2xsYXBzZVdpdGhDaGlsZHJlbiA9ICFibG9jay0+aXNSZW5kZXJWaWV3
KCkgJiYgIWJsb2NrLT5pc1Jvb3QoKSAmJiAhYmxvY2stPmlzUG9zaXRpb25lZCgpICYmCi0gICAg
ICAgICFibG9jay0+aXNGbG9hdGluZygpICYmICFibG9jay0+aXNUYWJsZUNlbGwoKSAmJiAhYmxv
Y2stPmhhc092ZXJmbG93Q2xpcCgpICYmICFibG9jay0+aXNJbmxpbmVCbG9ja09ySW5saW5lVGFi
bGUoKTsKKyAgICAgICAgIWJsb2NrLT5pc0Zsb2F0aW5nKCkgJiYgIWJsb2NrLT5pc1RhYmxlQ2Vs
bCgpICYmICFibG9jay0+aGFzT3ZlcmZsb3dDbGlwKCkgJiYgKCFibG9jay0+aXNJbmxpbmVCbG9j
a09ySW5saW5lVGFibGUoKSB8fCBibG9jay0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKTsKIAog
ICAgIG1fY2FuQ29sbGFwc2VUb3BXaXRoQ2hpbGRyZW4gPSBtX2NhbkNvbGxhcHNlV2l0aENoaWxk
cmVuICYmICh0b3AgPT0gMCkgJiYgYmxvY2stPnN0eWxlKCktPm1hcmdpblRvcENvbGxhcHNlKCkg
IT0gTVNFUEFSQVRFOwogCkBAIC0xMjAsNyArMTE4LDYgQEAgUmVuZGVyQmxvY2s6OlJlbmRlckJs
b2NrKE5vZGUqIG5vZGUpCiAgICAgICA6IFJlbmRlckJveChub2RlKQogICAgICAgLCBtX2Zsb2F0
aW5nT2JqZWN0cygwKQogICAgICAgLCBtX3Bvc2l0aW9uZWRPYmplY3RzKDApCi0gICAgICAsIG1f
aW5saW5lQ29udGludWF0aW9uKDApCiAgICAgICAsIG1fbWF4TWFyZ2luKDApCiAgICAgICAsIG1f
bGluZUhlaWdodCgtMSkKIHsKQEAgLTE2MSwxNCArMTU4LDYgQEAgdm9pZCBSZW5kZXJCbG9jazo6
ZGVzdHJveSgpCiAgICAgLy8gTWFrZSBzdXJlIHRvIGRlc3Ryb3kgYW5vbnltb3VzIGNoaWxkcmVu
IGZpcnN0IHdoaWxlIHRoZXkgYXJlIHN0aWxsIGNvbm5lY3RlZCB0byB0aGUgcmVzdCBvZiB0aGUg
dHJlZSwgc28gdGhhdCB0aGV5IHdpbGwKICAgICAvLyBwcm9wZXJseSBkaXJ0eSBsaW5lIGJveGVz
IHRoYXQgdGhleSBhcmUgcmVtb3ZlZCBmcm9tLiBFZmZlY3RzIHRoYXQgZG8gOmJlZm9yZS86YWZ0
ZXIgb25seSBvbiBob3ZlciBjb3VsZCBjcmFzaCBvdGhlcndpc2UuCiAgICAgY2hpbGRyZW4oKS0+
ZGVzdHJveUxlZnRvdmVyQ2hpbGRyZW4oKTsKLQotICAgIC8vIERlc3Ryb3kgb3VyIGNvbnRpbnVh
dGlvbiBiZWZvcmUgYW55dGhpbmcgb3RoZXIgdGhhbiBhbm9ueW1vdXMgY2hpbGRyZW4uCi0gICAg
Ly8gVGhlIHJlYXNvbiB3ZSBkb24ndCBkZXN0cm95IGl0IGJlZm9yZSBhbm9ueW1vdXMgY2hpbGRy
ZW4gaXMgdGhhdCB0aGV5IG1heQotICAgIC8vIGhhdmUgY29udGludWF0aW9ucyBvZiB0aGVpciBv
d24gdGhhdCBhcmUgYW5vbnltb3VzIGNoaWxkcmVuIG9mIG91ciBjb250aW51YXRpb24uCi0gICAg
aWYgKG1faW5saW5lQ29udGludWF0aW9uKSB7Ci0gICAgICAgIG1faW5saW5lQ29udGludWF0aW9u
LT5kZXN0cm95KCk7Ci0gICAgICAgIG1faW5saW5lQ29udGludWF0aW9uID0gMDsKLSAgICB9CiAg
ICAgCiAgICAgaWYgKCFkb2N1bWVudEJlaW5nRGVzdHJveWVkKCkpIHsKICAgICAgICAgaWYgKGZp
cnN0TGluZUJveCgpKSB7CkBAIC0zMTYsNyArMzA1LDcgQEAgdm9pZCBSZW5kZXJCbG9jazo6YWRk
Q2hpbGQoUmVuZGVyT2JqZWN0KgogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICghY2hpbGRyZW5J
bmxpbmUoKSAmJiAobmV3Q2hpbGQtPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSB8fCBuZXdDaGls
ZC0+aXNJbmxpbmUoKSkpIHsKICAgICAgICAgLy8gSWYgd2UncmUgaW5zZXJ0aW5nIGFuIGlubGlu
ZSBjaGlsZCBidXQgYWxsIG9mIG91ciBjaGlsZHJlbiBhcmUgYmxvY2tzLCB0aGVuIHdlIGhhdmUg
dG8gbWFrZSBzdXJlCi0gICAgICAgIC8vIGl0IGlzIHB1dCBpbnRvIGFuIGFub215b3VzIGJsb2Nr
IGJveC4gV2UgdHJ5IHRvIHVzZSBhbiBleGlzdGluZyBhbm9ueW1vdXMgYm94IGlmIHBvc3NpYmxl
LCBvdGhlcndpc2UKKyAgICAgICAgLy8gaXQgaXMgcHV0IGludG8gYW4gYW5vbnltb3VzIGJsb2Nr
IGJveC4gV2UgdHJ5IHRvIHVzZSBhbiBleGlzdGluZyBhbm9ueW1vdXMgYm94IGlmIHBvc3NpYmxl
LCBvdGhlcndpc2UKICAgICAgICAgLy8gYSBuZXcgb25lIGlzIGNyZWF0ZWQgYW5kIGluc2VydGVk
IGludG8gb3VyIGxpc3Qgb2YgY2hpbGRyZW4gaW4gdGhlIGFwcHJvcHJpYXRlIHBvc2l0aW9uLgog
ICAgICAgICBSZW5kZXJPYmplY3QqIGFmdGVyQ2hpbGQgPSBiZWZvcmVDaGlsZCA/IGJlZm9yZUNo
aWxkLT5wcmV2aW91c1NpYmxpbmcoKSA6IGxhc3RDaGlsZCgpOwogCkBAIC0zOTEsOSArMzgwLDkg
QEAgUm9vdElubGluZUJveCogUmVuZGVyQmxvY2s6OmNyZWF0ZVJvb3RJbgogICAgIHJldHVybiBu
ZXcgKHJlbmRlckFyZW5hKCkpIFJvb3RJbmxpbmVCb3godGhpcyk7CiB9CiAKLVJvb3RJbmxpbmVC
b3gqIFJlbmRlckJsb2NrOjpjcmVhdGVBbmRBcHBlbmRSb290SW5saW5lQm94KCkKLXsKLSAgICBS
b290SW5saW5lQm94KiByb290Qm94ID0gY3JlYXRlUm9vdElubGluZUJveCgpOworUm9vdElubGlu
ZUJveCogUmVuZGVyQmxvY2s6OmNyZWF0ZUFuZEFwcGVuZFJvb3RJbmxpbmVCb3goUmVuZGVyQmxv
Y2sqIGFub255bW91c0lubGluZUJsb2NrKQoreyAKKyAgICBSb290SW5saW5lQm94KiByb290Qm94
ID0gYW5vbnltb3VzSW5saW5lQmxvY2sgPyBuZXcgKHJlbmRlckFyZW5hKCkpIFJvb3RBbm9ueW1v
dXNJbmxpbmVCbG9ja0JveCh0aGlzLCBhbm9ueW1vdXNJbmxpbmVCbG9jaykgOiBjcmVhdGVSb290
SW5saW5lQm94KCk7CiAgICAgbV9saW5lQm94ZXMuYXBwZW5kTGluZUJveChyb290Qm94KTsKICAg
ICByZXR1cm4gcm9vdEJveDsKIH0KQEAgLTQ5MCw5ICs0NzksNiBAQCB2b2lkIFJlbmRlckJsb2Nr
OjpyZW1vdmVMZWZ0b3ZlckFub255bW91CiAgICAgQVNTRVJUKGNoaWxkLT5pc0Fub255bW91c0Js
b2NrKCkpOwogICAgIEFTU0VSVCghY2hpbGQtPmNoaWxkcmVuSW5saW5lKCkpOwogICAgIAotICAg
IGlmIChjaGlsZC0+aW5saW5lQ29udGludWF0aW9uKCkpIAotICAgICAgICByZXR1cm47Ci0gICAg
CiAgICAgUmVuZGVyT2JqZWN0KiBmaXJzdEFuQ2hpbGQgPSBjaGlsZC0+bV9jaGlsZHJlbi5maXJz
dENoaWxkKCk7CiAgICAgUmVuZGVyT2JqZWN0KiBsYXN0QW5DaGlsZCA9IGNoaWxkLT5tX2NoaWxk
cmVuLmxhc3RDaGlsZCgpOwogICAgIGlmIChmaXJzdEFuQ2hpbGQpIHsKQEAgLTUzNSw3ICs1MjEs
NyBAQCB2b2lkIFJlbmRlckJsb2NrOjpyZW1vdmVDaGlsZChSZW5kZXJPYmplCiAgICAgUmVuZGVy
T2JqZWN0KiBwcmV2ID0gb2xkQ2hpbGQtPnByZXZpb3VzU2libGluZygpOwogICAgIFJlbmRlck9i
amVjdCogbmV4dCA9IG9sZENoaWxkLT5uZXh0U2libGluZygpOwogICAgIGJvb2wgY2FuRGVsZXRl
QW5vbnltb3VzQmxvY2tzID0gIWRvY3VtZW50QmVpbmdEZXN0cm95ZWQoKSAmJiAhaXNJbmxpbmUo
KSAmJiAhb2xkQ2hpbGQtPmlzSW5saW5lKCkgJiYgCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAoIW9sZENoaWxkLT5pc1JlbmRlckJsb2NrKCkgfHwgIXRvUmVuZGVyQmxvY2so
b2xkQ2hpbGQpLT5pbmxpbmVDb250aW51YXRpb24oKSkgJiYgCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAhb2xkQ2hpbGQtPmlzUmVuZGVyQmxvY2soKSAmJiAKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICghcHJldiB8fCAocHJldi0+aXNBbm9ueW1vdXNC
bG9jaygpICYmIHByZXYtPmNoaWxkcmVuSW5saW5lKCkpKSAmJgogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgKCFuZXh0IHx8IChuZXh0LT5pc0Fub255bW91c0Jsb2NrKCkgJiYg
bmV4dC0+Y2hpbGRyZW5JbmxpbmUoKSkpOwogICAgIGlmIChjYW5EZWxldGVBbm9ueW1vdXNCbG9j
a3MgJiYgcHJldiAmJiBuZXh0KSB7CkBAIC01OTgsOSArNTg0LDE1IEBAIGJvb2wgUmVuZGVyQmxv
Y2s6OmlzU2VsZkNvbGxhcHNpbmdCbG9jaygKICAgICAvLyBvbiB3aGV0aGVyIHdlIGhhdmUgY29u
dGVudCB0aGF0IGlzIGFsbCBzZWxmLWNvbGxhcHNpbmcgb3Igbm90LgogICAgIGlmIChoYXNBdXRv
SGVpZ2h0IHx8ICgoc3R5bGUoKS0+aGVpZ2h0KCkuaXNGaXhlZCgpIHx8IHN0eWxlKCktPmhlaWdo
dCgpLmlzUGVyY2VudCgpKSAmJiBzdHlsZSgpLT5oZWlnaHQoKS5pc1plcm8oKSkpIHsKICAgICAg
ICAgLy8gSWYgdGhlIGJsb2NrIGhhcyBpbmxpbmUgY2hpbGRyZW4sIHNlZSBpZiB3ZSBnZW5lcmF0
ZWQgYW55IGxpbmUgYm94ZXMuICBJZiB3ZSBoYXZlIGFueQotICAgICAgICAvLyBsaW5lIGJveGVz
LCB0aGVuIHdlIGNhbid0IGJlIHNlbGYtY29sbGFwc2luZywgc2luY2Ugd2UgaGF2ZSBjb250ZW50
LgotICAgICAgICBpZiAoY2hpbGRyZW5JbmxpbmUoKSkKLSAgICAgICAgICAgIHJldHVybiAhZmly
c3RMaW5lQm94KCk7CisgICAgICAgIC8vIGxpbmUgYm94ZXMsIHRoZW4gd2UgY2FuIG9ubHkgYmUg
c2VsZi1jb2xsYXBzaW5nIGlmIHdlIGhhdmUgbm90aGluZyBidXQgYW5vbnltb3VzIGlubGluZSBi
bG9ja3MKKyAgICAgICAgLy8gdGhhdCBhcmUgYWxzbyBzZWxmLWNvbGxhcHNpbmcgaW5zaWRlIHVz
LgorICAgICAgICBpZiAoY2hpbGRyZW5JbmxpbmUoKSkgeworICAgICAgICAgICAgZm9yIChSb290
SW5saW5lQm94KiBjaGlsZCA9IGZpcnN0Um9vdEJveCgpOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+
bmV4dFJvb3RCb3goKSkgeworICAgICAgICAgICAgICAgIGlmICghY2hpbGQtPmhhc0Fub255bW91
c0lubGluZUJsb2NrKCkgfHwgIWNoaWxkLT5hbm9ueW1vdXNJbmxpbmVCbG9jaygpLT5pc1NlbGZD
b2xsYXBzaW5nQmxvY2soKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIFdlIGhhdmUgbm8gbGluZSBi
b3hlcywgc28gd2UgbXVzdCBiZSBzZWxmLWNvbGxhcHNpbmcuCisgICAgICAgIH0KICAgICAgICAg
CiAgICAgICAgIC8vIFdoZXRoZXIgb3Igbm90IHdlIGNvbGxhcHNlIGlzIGRlcGVuZGVudCBvbiB3
aGV0aGVyIGFsbCBvdXIgbm9ybWFsIGZsb3cgY2hpbGRyZW4KICAgICAgICAgLy8gYXJlIGFsc28g
c2VsZi1jb2xsYXBzaW5nLgpAQCAtODU1LDcgKzg0Nyw4IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmFk
ZE92ZXJmbG93RnJvbUZsb2F0cygKIAogYm9vbCBSZW5kZXJCbG9jazo6ZXhwYW5kc1RvRW5jbG9z
ZU92ZXJoYW5naW5nRmxvYXRzKCkgY29uc3QKIHsKLSAgICByZXR1cm4gaXNJbmxpbmVCbG9ja09y
SW5saW5lVGFibGUoKSB8fCBpc0Zsb2F0aW5nT3JQb3NpdGlvbmVkKCkgfHwgaGFzT3ZlcmZsb3dD
bGlwKCkgfHwgKHBhcmVudCgpICYmIHBhcmVudCgpLT5pc0ZsZXhpYmxlQm94KCkpIHx8IGhhc0Nv
bHVtbnMoKSB8fCBpc1RhYmxlQ2VsbCgpIHx8IGlzRmllbGRzZXQoKTsKKyAgICByZXR1cm4gaXNG
bG9hdGluZ09yUG9zaXRpb25lZCgpIHx8IGhhc092ZXJmbG93Q2xpcCgpIHx8IChwYXJlbnQoKSAm
JiBwYXJlbnQoKS0+aXNGbGV4aWJsZUJveCgpKSB8fCBoYXNDb2x1bW5zKCkgfHwgaXNUYWJsZUNl
bGwoKSB8fCBpc0ZpZWxkc2V0KCkgfHwKKyAgICAgICAgICAgKGlzSW5saW5lQmxvY2tPcklubGlu
ZVRhYmxlKCkgJiYgIWlzQW5vbnltb3VzSW5saW5lQmxvY2soKSk7CiB9CiAKIHZvaWQgUmVuZGVy
QmxvY2s6OmFkanVzdFBvc2l0aW9uZWRCbG9jayhSZW5kZXJCb3gqIGNoaWxkLCBjb25zdCBNYXJn
aW5JbmZvJiBtYXJnaW5JbmZvKQpAQCAtMTAwMSwxOSArOTk0LDE5IEBAIGJvb2wgUmVuZGVyQmxv
Y2s6OmhhbmRsZVJ1bkluQ2hpbGQoUmVuZGUKIGludCBSZW5kZXJCbG9jazo6Y29sbGFwc2VNYXJn
aW5zKFJlbmRlckJveCogY2hpbGQsIE1hcmdpbkluZm8mIG1hcmdpbkluZm8pCiB7CiAgICAgLy8g
R2V0IG91ciBtYXggcG9zIGFuZCBuZWcgdG9wIG1hcmdpbnMuCi0gICAgaW50IHBvc1RvcCA9IGNo
aWxkLT5tYXhUb3BNYXJnaW4odHJ1ZSk7Ci0gICAgaW50IG5lZ1RvcCA9IGNoaWxkLT5tYXhUb3BN
YXJnaW4oZmFsc2UpOworICAgIGludCBwb3NUb3AgPSBjaGlsZCA/IGNoaWxkLT5tYXhUb3BNYXJn
aW4odHJ1ZSkgOiAwOworICAgIGludCBuZWdUb3AgPSBjaGlsZCA/IGNoaWxkLT5tYXhUb3BNYXJn
aW4oZmFsc2UpIDogMDsKIAogICAgIC8vIEZvciBzZWxmLWNvbGxhcHNpbmcgYmxvY2tzLCBjb2xs
YXBzZSBvdXIgYm90dG9tIG1hcmdpbnMgaW50byBvdXIKICAgICAvLyB0b3AgdG8gZ2V0IG5ldyBw
b3NUb3AgYW5kIG5lZ1RvcCB2YWx1ZXMuCi0gICAgaWYgKGNoaWxkLT5pc1NlbGZDb2xsYXBzaW5n
QmxvY2soKSkgeworICAgIGlmIChjaGlsZCAmJiBjaGlsZC0+aXNTZWxmQ29sbGFwc2luZ0Jsb2Nr
KCkpIHsKICAgICAgICAgcG9zVG9wID0gbWF4KHBvc1RvcCwgY2hpbGQtPm1heEJvdHRvbU1hcmdp
bih0cnVlKSk7CiAgICAgICAgIG5lZ1RvcCA9IG1heChuZWdUb3AsIGNoaWxkLT5tYXhCb3R0b21N
YXJnaW4oZmFsc2UpKTsKICAgICB9CiAgICAgCiAgICAgLy8gU2VlIGlmIHRoZSB0b3AgbWFyZ2lu
IGlzIHF1aXJreS4gV2Ugb25seSBjYXJlIGlmIHRoaXMgY2hpbGQgaGFzCiAgICAgLy8gbWFyZ2lu
cyB0aGF0IHdpbGwgY29sbGFwc2Ugd2l0aCB1cy4KLSAgICBib29sIHRvcFF1aXJrID0gY2hpbGQt
PmlzVG9wTWFyZ2luUXVpcmsoKSB8fCBzdHlsZSgpLT5tYXJnaW5Ub3BDb2xsYXBzZSgpID09IE1E
SVNDQVJEOworICAgIGJvb2wgdG9wUXVpcmsgPSAoY2hpbGQgJiYgY2hpbGQtPmlzVG9wTWFyZ2lu
UXVpcmsoKSkgfHwgc3R5bGUoKS0+bWFyZ2luVG9wQ29sbGFwc2UoKSA9PSBNRElTQ0FSRDsKIAog
ICAgIGlmIChtYXJnaW5JbmZvLmNhbkNvbGxhcHNlV2l0aFRvcCgpKSB7CiAgICAgICAgIC8vIFRo
aXMgY2hpbGQgaXMgY29sbGFwc2luZyB3aXRoIHRoZSB0b3Agb2YgdGhlCkBAIC0xMDI2LDcgKzEw
MTksNyBAQCBpbnQgUmVuZGVyQmxvY2s6OmNvbGxhcHNlTWFyZ2lucyhSZW5kZXJCCiAgICAgICAg
IC8vIGNvbGxhcHNlIGl0IGF3YXksIGV2ZW4gaWYgdGhlIG1hcmdpbiBpcyBzbWFsbGVyICh3d3cu
d2VicmVmZXJlbmNlLmNvbQogICAgICAgICAvLyBoYXMgYW4gZXhhbXBsZSBvZiB0aGlzLCBhIDxk
dD4gd2l0aCAwLjhlbSBhdXRob3Itc3BlY2lmaWVkIGluc2lkZQogICAgICAgICAvLyBhIDxkbD4g
aW5zaWRlIGEgPHRkPi4KLSAgICAgICAgaWYgKCFtYXJnaW5JbmZvLmRldGVybWluZWRUb3BRdWly
aygpICYmICF0b3BRdWlyayAmJiAocG9zVG9wLW5lZ1RvcCkpIHsKKyAgICAgICAgaWYgKCFtYXJn
aW5JbmZvLmRldGVybWluZWRUb3BRdWlyaygpICYmICF0b3BRdWlyayAmJiAocG9zVG9wIC0gbmVn
VG9wKSkgewogICAgICAgICAgICAgc2V0VG9wTWFyZ2luUXVpcmsoZmFsc2UpOwogICAgICAgICAg
ICAgbWFyZ2luSW5mby5zZXREZXRlcm1pbmVkVG9wUXVpcmsodHJ1ZSk7CiAgICAgICAgIH0KQEAg
LTEwNDQsNyArMTAzNyw3IEBAIGludCBSZW5kZXJCbG9jazo6Y29sbGFwc2VNYXJnaW5zKFJlbmRl
ckIKICAgICAgICAgbWFyZ2luSW5mby5zZXRUb3BRdWlyayh0b3BRdWlyayk7CiAKICAgICBpbnQg
eXBvcyA9IGhlaWdodCgpOwotICAgIGlmIChjaGlsZC0+aXNTZWxmQ29sbGFwc2luZ0Jsb2NrKCkp
IHsKKyAgICBpZiAoY2hpbGQgJiYgY2hpbGQtPmlzU2VsZkNvbGxhcHNpbmdCbG9jaygpKSB7CiAg
ICAgICAgIC8vIFRoaXMgY2hpbGQgaGFzIG5vIGhlaWdodC4gIFdlIG5lZWQgdG8gY29tcHV0ZSBv
dXIKICAgICAgICAgLy8gcG9zaXRpb24gYmVmb3JlIHdlIGNvbGxhcHNlIHRoZSBjaGlsZCdzIG1h
cmdpbnMgdG9nZXRoZXIsCiAgICAgICAgIC8vIHNvIHRoYXQgd2UgY2FuIGdldCBhbiBhY2N1cmF0
ZSBwb3NpdGlvbiBmb3IgdGhlIHplcm8taGVpZ2h0IGJsb2NrLgpAQCAtMTA2MywxMyArMTA1Niwx
MSBAQCBpbnQgUmVuZGVyQmxvY2s6OmNvbGxhcHNlTWFyZ2lucyhSZW5kZXJCCiAgICAgICAgICAg
ICAvLyB0aGF0IG5lZWRzIHRvIGJlIHBvc2l0aW9uZWQgY29ycmVjdGx5IChlLmcuLCBhIGJsb2Nr
IHRoYXQKICAgICAgICAgICAgIC8vIGhhZCBhIHNwZWNpZmllZCBoZWlnaHQgb2YgMCBidXQgdGhh
dCBhY3R1YWxseSBoYWQgc3ViY29udGVudCkuCiAgICAgICAgICAgICB5cG9zID0gaGVpZ2h0KCkg
KyBjb2xsYXBzZWRUb3BQb3MgLSBjb2xsYXBzZWRUb3BOZWc7Ci0gICAgfQotICAgIGVsc2Ugewot
ICAgICAgICBpZiAoY2hpbGQtPnN0eWxlKCktPm1hcmdpblRvcENvbGxhcHNlKCkgPT0gTVNFUEFS
QVRFKSB7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGNoaWxkICYmIGNoaWxkLT5zdHlsZSgp
LT5tYXJnaW5Ub3BDb2xsYXBzZSgpID09IE1TRVBBUkFURSkgewogICAgICAgICAgICAgc2V0SGVp
Z2h0KGhlaWdodCgpICsgbWFyZ2luSW5mby5tYXJnaW4oKSArIGNoaWxkLT5tYXJnaW5Ub3AoKSk7
CiAgICAgICAgICAgICB5cG9zID0gaGVpZ2h0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBp
ZiAoIW1hcmdpbkluZm8uYXRUb3BPZkJsb2NrKCkgfHwKKyAgICAgICAgfSBlbHNlIGlmICghbWFy
Z2luSW5mby5hdFRvcE9mQmxvY2soKSB8fAogICAgICAgICAgICAgKCFtYXJnaW5JbmZvLmNhbkNv
bGxhcHNlVG9wV2l0aENoaWxkcmVuKCkKICAgICAgICAgICAgICAmJiAoIXN0eWxlKCktPmh0bWxI
YWNrcygpIHx8ICFtYXJnaW5JbmZvLnF1aXJrQ29udGFpbmVyKCkgfHwgIW1hcmdpbkluZm8udG9w
UXVpcmsoKSkpKSB7CiAgICAgICAgICAgICAvLyBXZSdyZSBjb2xsYXBzaW5nIHdpdGggYSBwcmV2
aW91cyBzaWJsaW5nJ3MgbWFyZ2lucyBhbmQgbm90CkBAIC0xMDc4LDExICsxMDY5LDExIEBAIGlu
dCBSZW5kZXJCbG9jazo6Y29sbGFwc2VNYXJnaW5zKFJlbmRlckIKICAgICAgICAgICAgIHlwb3Mg
PSBoZWlnaHQoKTsKICAgICAgICAgfQogCi0gICAgICAgIG1hcmdpbkluZm8uc2V0UG9zTWFyZ2lu
KGNoaWxkLT5tYXhCb3R0b21NYXJnaW4odHJ1ZSkpOwotICAgICAgICBtYXJnaW5JbmZvLnNldE5l
Z01hcmdpbihjaGlsZC0+bWF4Qm90dG9tTWFyZ2luKGZhbHNlKSk7CisgICAgICAgIG1hcmdpbklu
Zm8uc2V0UG9zTWFyZ2luKGNoaWxkID8gY2hpbGQtPm1heEJvdHRvbU1hcmdpbih0cnVlKSA6IDAp
OworICAgICAgICBtYXJnaW5JbmZvLnNldE5lZ01hcmdpbihjaGlsZCA/IGNoaWxkLT5tYXhCb3R0
b21NYXJnaW4oZmFsc2UpIDogMCk7CiAKICAgICAgICAgaWYgKG1hcmdpbkluZm8ubWFyZ2luKCkp
Ci0gICAgICAgICAgICBtYXJnaW5JbmZvLnNldEJvdHRvbVF1aXJrKGNoaWxkLT5pc0JvdHRvbU1h
cmdpblF1aXJrKCkgfHwgc3R5bGUoKS0+bWFyZ2luQm90dG9tQ29sbGFwc2UoKSA9PSBNRElTQ0FS
RCk7CisgICAgICAgICAgICBtYXJnaW5JbmZvLnNldEJvdHRvbVF1aXJrKChjaGlsZCAmJiBjaGls
ZC0+aXNCb3R0b21NYXJnaW5RdWlyaygpKSB8fCBzdHlsZSgpLT5tYXJnaW5Cb3R0b21Db2xsYXBz
ZSgpID09IE1ESVNDQVJEKTsKICAgICB9CiAgICAgCiAgICAgcmV0dXJuIHlwb3M7CkBAIC0xNzQ5
LDIwICsxNzQwLDcgQEAgdm9pZCBSZW5kZXJCbG9jazo6cGFpbnRPYmplY3QoUGFpbnRJbmZvJgog
ICAgIGlmICgocGFpbnRQaGFzZSA9PSBQYWludFBoYXNlT3V0bGluZSB8fCBwYWludFBoYXNlID09
IFBhaW50UGhhc2VTZWxmT3V0bGluZSkgJiYgaGFzT3V0bGluZSgpICYmIHN0eWxlKCktPnZpc2li
aWxpdHkoKSA9PSBWSVNJQkxFKQogICAgICAgICBwYWludE91dGxpbmUocGFpbnRJbmZvLmNvbnRl
eHQsIHR4LCB0eSwgd2lkdGgoKSwgaGVpZ2h0KCksIHN0eWxlKCkpOwogCi0gICAgLy8gNi4gcGFp
bnQgY29udGludWF0aW9uIG91dGxpbmVzLgotICAgIGlmICgocGFpbnRQaGFzZSA9PSBQYWludFBo
YXNlT3V0bGluZSB8fCBwYWludFBoYXNlID09IFBhaW50UGhhc2VDaGlsZE91dGxpbmVzKSkgewot
ICAgICAgICBpZiAoaW5saW5lQ29udGludWF0aW9uKCkgJiYgaW5saW5lQ29udGludWF0aW9uKCkt
Pmhhc091dGxpbmUoKSAmJiBpbmxpbmVDb250aW51YXRpb24oKS0+c3R5bGUoKS0+dmlzaWJpbGl0
eSgpID09IFZJU0lCTEUpIHsKLSAgICAgICAgICAgIFJlbmRlcklubGluZSogaW5saW5lUmVuZGVy
ZXIgPSB0b1JlbmRlcklubGluZShpbmxpbmVDb250aW51YXRpb24oKS0+bm9kZSgpLT5yZW5kZXJl
cigpKTsKLSAgICAgICAgICAgIGlmICghaW5saW5lUmVuZGVyZXItPmhhc1NlbGZQYWludGluZ0xh
eWVyKCkpCi0gICAgICAgICAgICAgICAgY29udGFpbmluZ0Jsb2NrKCktPmFkZENvbnRpbnVhdGlv
bldpdGhPdXRsaW5lKGlubGluZVJlbmRlcmVyKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKCFpbmxp
bmVSZW5kZXJlci0+Zmlyc3RMaW5lQm94KCkpCi0gICAgICAgICAgICAgICAgaW5saW5lUmVuZGVy
ZXItPnBhaW50T3V0bGluZShwYWludEluZm8uY29udGV4dCwgdHggLSB4KCkgKyBpbmxpbmVSZW5k
ZXJlci0+Y29udGFpbmluZ0Jsb2NrKCktPngoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHR5IC0geSgpICsgaW5saW5lUmVuZGVyZXItPmNvbnRhaW5pbmdC
bG9jaygpLT55KCkpOwotICAgICAgICB9Ci0gICAgICAgIHBhaW50Q29udGludWF0aW9uT3V0bGlu
ZXMocGFpbnRJbmZvLCB0eCwgdHkpOwotICAgIH0KLQotICAgIC8vIDcuIHBhaW50IGNhcmV0Lgor
ICAgIC8vIDYuIHBhaW50IGNhcmV0LgogICAgIC8vIElmIHRoZSBjYXJldCdzIG5vZGUncyByZW5k
ZXIgb2JqZWN0J3MgY29udGFpbmluZyBibG9jayBpcyB0aGlzIGJsb2NrLCBhbmQgdGhlIHBhaW50
IGFjdGlvbiBpcyBQYWludFBoYXNlRm9yZWdyb3VuZCwKICAgICAvLyB0aGVuIHBhaW50IHRoZSBj
YXJldC4KICAgICBpZiAocGFpbnRQaGFzZSA9PSBQYWludFBoYXNlRm9yZWdyb3VuZCkgeyAgICAg
ICAgCkBAIC0xODI1LDU3ICsxODAzLDYgQEAgdm9pZCBSZW5kZXJCbG9jazo6cGFpbnRFbGxpcHNp
c0JveGVzKFBhaQogICAgIH0KIH0KIAotc3RhdGljIENvbnRpbnVhdGlvbk91dGxpbmVUYWJsZU1h
cCogY29udGludWF0aW9uT3V0bGluZVRhYmxlKCkKLXsKLSAgICBERUZJTkVfU1RBVElDX0xPQ0FM
KENvbnRpbnVhdGlvbk91dGxpbmVUYWJsZU1hcCwgdGFibGUsICgpKTsKLSAgICByZXR1cm4gJnRh
YmxlOwotfQotCi12b2lkIFJlbmRlckJsb2NrOjphZGRDb250aW51YXRpb25XaXRoT3V0bGluZShS
ZW5kZXJJbmxpbmUqIGZsb3cpCi17Ci0gICAgLy8gV2UgY2FuJ3QgbWFrZSB0aGlzIHdvcmsgaWYg
dGhlIGlubGluZSBpcyBpbiBhIGxheWVyLiAgV2UnbGwganVzdCByZWx5IG9uIHRoZSBicm9rZW4K
LSAgICAvLyB3YXkgb2YgcGFpbnRpbmcuCi0gICAgQVNTRVJUKCFmbG93LT5sYXllcigpICYmICFm
bG93LT5pc0lubGluZUNvbnRpbnVhdGlvbigpKTsKLSAgICAKLSAgICBDb250aW51YXRpb25PdXRs
aW5lVGFibGVNYXAqIHRhYmxlID0gY29udGludWF0aW9uT3V0bGluZVRhYmxlKCk7Ci0gICAgTGlz
dEhhc2hTZXQ8UmVuZGVySW5saW5lKj4qIGNvbnRpbnVhdGlvbnMgPSB0YWJsZS0+Z2V0KHRoaXMp
OwotICAgIGlmICghY29udGludWF0aW9ucykgewotICAgICAgICBjb250aW51YXRpb25zID0gbmV3
IExpc3RIYXNoU2V0PFJlbmRlcklubGluZSo+OwotICAgICAgICB0YWJsZS0+c2V0KHRoaXMsIGNv
bnRpbnVhdGlvbnMpOwotICAgIH0KLSAgICAKLSAgICBjb250aW51YXRpb25zLT5hZGQoZmxvdyk7
Ci19Ci0KLXZvaWQgUmVuZGVyQmxvY2s6OnBhaW50Q29udGludWF0aW9uT3V0bGluZXMoUGFpbnRJ
bmZvJiBpbmZvLCBpbnQgdHgsIGludCB0eSkKLXsKLSAgICBDb250aW51YXRpb25PdXRsaW5lVGFi
bGVNYXAqIHRhYmxlID0gY29udGludWF0aW9uT3V0bGluZVRhYmxlKCk7Ci0gICAgaWYgKHRhYmxl
LT5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgTGlzdEhhc2hTZXQ8
UmVuZGVySW5saW5lKj4qIGNvbnRpbnVhdGlvbnMgPSB0YWJsZS0+Z2V0KHRoaXMpOwotICAgIGlm
ICghY29udGludWF0aW9ucykKLSAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAgICAvLyBQYWlu
dCBlYWNoIGNvbnRpbnVhdGlvbiBvdXRsaW5lLgotICAgIExpc3RIYXNoU2V0PFJlbmRlcklubGlu
ZSo+OjppdGVyYXRvciBlbmQgPSBjb250aW51YXRpb25zLT5lbmQoKTsKLSAgICBmb3IgKExpc3RI
YXNoU2V0PFJlbmRlcklubGluZSo+OjppdGVyYXRvciBpdCA9IGNvbnRpbnVhdGlvbnMtPmJlZ2lu
KCk7IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICAvLyBOZWVkIHRvIGFkZCBpbiB0aGUgY29v
cmRpbmF0ZXMgb2YgdGhlIGludGVydmVuaW5nIGJsb2Nrcy4KLSAgICAgICAgUmVuZGVySW5saW5l
KiBmbG93ID0gKml0OwotICAgICAgICBSZW5kZXJCbG9jayogYmxvY2sgPSBmbG93LT5jb250YWlu
aW5nQmxvY2soKTsKLSAgICAgICAgZm9yICggOyBibG9jayAmJiBibG9jayAhPSB0aGlzOyBibG9j
ayA9IGJsb2NrLT5jb250YWluaW5nQmxvY2soKSkgewotICAgICAgICAgICAgdHggKz0gYmxvY2st
PngoKTsKLSAgICAgICAgICAgIHR5ICs9IGJsb2NrLT55KCk7Ci0gICAgICAgIH0KLSAgICAgICAg
QVNTRVJUKGJsb2NrKTsgICAKLSAgICAgICAgZmxvdy0+cGFpbnRPdXRsaW5lKGluZm8uY29udGV4
dCwgdHgsIHR5KTsKLSAgICB9Ci0gICAgCi0gICAgLy8gRGVsZXRlCi0gICAgZGVsZXRlIGNvbnRp
bnVhdGlvbnM7Ci0gICAgdGFibGUtPnJlbW92ZSh0aGlzKTsKLX0KLQogdm9pZCBSZW5kZXJCbG9j
azo6c2V0U2VsZWN0aW9uU3RhdGUoU2VsZWN0aW9uU3RhdGUgcykKIHsKICAgICBpZiAoc2VsZWN0
aW9uU3RhdGUoKSA9PSBzKQpAQCAtMTg5MCw2ICsxODE3LDEyIEBAIHZvaWQgUmVuZGVyQmxvY2s6
OnNldFNlbGVjdGlvblN0YXRlKFNlbGUKICAgICBlbHNlCiAgICAgICAgIFJlbmRlckJveDo6c2V0
U2VsZWN0aW9uU3RhdGUocyk7CiAgICAgCisgICAgaWYgKGlzUmVwbGFjZWQoKSAmJiBtX2lubGlu
ZUJveFdyYXBwZXIpIHsKKyAgICAgICAgUm9vdElubGluZUJveCogbGluZSA9IG1faW5saW5lQm94
V3JhcHBlci0+cm9vdCgpOworICAgICAgICBpZiAobGluZSkKKyAgICAgICAgICAgIGxpbmUtPnNl
dEhhc1NlbGVjdGVkQ2hpbGRyZW4ocyAhPSBTZWxlY3Rpb25Ob25lKTsKKyAgICB9CisKICAgICBS
ZW5kZXJCbG9jayogY2IgPSBjb250YWluaW5nQmxvY2soKTsKICAgICBpZiAoY2IgJiYgIWNiLT5p
c1JlbmRlclZpZXcoKSkKICAgICAgICAgY2ItPnNldFNlbGVjdGlvblN0YXRlKHMpOwpAQCAtMTkw
OCw5ICsxODQxLDkgQEAgYm9vbCBSZW5kZXJCbG9jazo6aXNTZWxlY3Rpb25Sb290KCkgY29ucwog
ICAgIC8vIEZJWE1FOiBFdmVudHVhbGx5IHRhYmxlcyBzaG91bGQgaGF2ZSB0byBsZWFybiBob3cg
dG8gZmlsbCBnYXBzIGJldHdlZW4gY2VsbHMsIGF0IGxlYXN0IGluIHNpbXBsZSBub24tc3Bhbm5p
bmcgY2FzZXMuCiAgICAgaWYgKGlzVGFibGUoKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
ICAgICAKKwogICAgIGlmIChpc0JvZHkoKSB8fCBpc1Jvb3QoKSB8fCBoYXNPdmVyZmxvd0NsaXAo
KSB8fCBpc1JlbFBvc2l0aW9uZWQoKSB8fAotICAgICAgICBpc0Zsb2F0aW5nT3JQb3NpdGlvbmVk
KCkgfHwgaXNUYWJsZUNlbGwoKSB8fCBpc0lubGluZUJsb2NrT3JJbmxpbmVUYWJsZSgpIHx8IGhh
c1RyYW5zZm9ybSgpIHx8CisgICAgICAgIGlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSB8fCBpc1Rh
YmxlQ2VsbCgpIHx8IChpc0lubGluZUJsb2NrT3JJbmxpbmVUYWJsZSgpICYmICFpc0Fub255bW91
c0lubGluZUJsb2NrKCkpIHx8IGhhc1RyYW5zZm9ybSgpIHx8CiAgICAgICAgIGhhc1JlZmxlY3Rp
b24oKSB8fCBoYXNNYXNrKCkpCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIApAQCAtMjA1NSwx
OCArMTk4OCwzMCBAQCBHYXBSZWN0cyBSZW5kZXJCbG9jazo6ZmlsbElubGluZVNlbGVjdGlvCiAg
ICAgZm9yIChjdXJyID0gZmlyc3RSb290Qm94KCk7IGN1cnIgJiYgIWN1cnItPmhhc1NlbGVjdGVk
Q2hpbGRyZW4oKTsgY3VyciA9IGN1cnItPm5leHRSb290Qm94KCkpIHsgfQogCiAgICAgLy8gTm93
IHBhaW50IHRoZSBnYXBzIGZvciB0aGUgbGluZXMuCi0gICAgZm9yICg7IGN1cnIgJiYgY3Vyci0+
aGFzU2VsZWN0ZWRDaGlsZHJlbigpOyBjdXJyID0gY3Vyci0+bmV4dFJvb3RCb3goKSkgeworICAg
IGZvciAoOyBjdXJyICYmIChjdXJyLT5oYXNTZWxlY3RlZENoaWxkcmVuKCkgfHwgY3Vyci0+aGFz
QW5vbnltb3VzSW5saW5lQmxvY2soKSk7IGN1cnIgPSBjdXJyLT5uZXh0Um9vdEJveCgpKSB7Cisg
ICAgICAgIGlmICghY3Vyci0+aGFzU2VsZWN0ZWRDaGlsZHJlbigpKQorICAgICAgICAgICAgY29u
dGludWU7CisKICAgICAgICAgaW50IHNlbFRvcCA9ICBjdXJyLT5zZWxlY3Rpb25Ub3AoKTsKICAg
ICAgICAgaW50IHNlbEhlaWdodCA9IGN1cnItPnNlbGVjdGlvbkhlaWdodCgpOwogCi0gICAgICAg
IGlmICghY29udGFpbnNTdGFydCAmJiAhbGFzdFNlbGVjdGVkTGluZSAmJgotICAgICAgICAgICAg
c2VsZWN0aW9uU3RhdGUoKSAhPSBTZWxlY3Rpb25TdGFydCAmJiBzZWxlY3Rpb25TdGF0ZSgpICE9
IFNlbGVjdGlvbkJvdGgpCi0gICAgICAgICAgICByZXN1bHQudW5pdGVDZW50ZXIoZmlsbFZlcnRp
Y2FsU2VsZWN0aW9uR2FwKGxhc3RUb3AsIGxhc3RMZWZ0LCBsYXN0UmlnaHQsIHR5ICsgc2VsVG9w
LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICByb290QmxvY2ssIGJsb2NrWCwgYmxvY2tZLCBwYWludEluZm8pKTsKLQotICAgICAgICBpZiAo
IXBhaW50SW5mbyB8fCAodHkgKyBzZWxUb3AgPCBwYWludEluZm8tPnJlY3QuYm90dG9tKCkgJiYg
dHkgKyBzZWxUb3AgKyBzZWxIZWlnaHQgPiBwYWludEluZm8tPnJlY3QueSgpKSkKLSAgICAgICAg
ICAgIHJlc3VsdC51bml0ZShjdXJyLT5maWxsTGluZVNlbGVjdGlvbkdhcChzZWxUb3AsIHNlbEhl
aWdodCwgcm9vdEJsb2NrLCBibG9ja1gsIGJsb2NrWSwgdHgsIHR5LCBwYWludEluZm8pKTsKKyAg
ICAgICAgaWYgKGN1cnItPmhhc0Fub255bW91c0lubGluZUJsb2NrKCkpIHsKKyAgICAgICAgICAg
IGlmIChsYXN0U2VsZWN0ZWRMaW5lKSB7CisgICAgICAgICAgICAgICAgbGFzdFRvcCA9ICh0eSAt
IGJsb2NrWSkgKyBsYXN0U2VsZWN0ZWRMaW5lLT5zZWxlY3Rpb25Cb3R0b20oKTsKKyAgICAgICAg
ICAgICAgICBsYXN0TGVmdCA9IGxlZnRTZWxlY3Rpb25PZmZzZXQocm9vdEJsb2NrLCBsYXN0U2Vs
ZWN0ZWRMaW5lLT5zZWxlY3Rpb25Cb3R0b20oKSk7CisgICAgICAgICAgICAgICAgbGFzdFJpZ2h0
ID0gcmlnaHRTZWxlY3Rpb25PZmZzZXQocm9vdEJsb2NrLCBsYXN0U2VsZWN0ZWRMaW5lLT5zZWxl
Y3Rpb25Cb3R0b20oKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250YWluc1N0YXJ0
ID0gZmFsc2U7CisgICAgICAgICAgICByZXN1bHQudW5pdGUoY3Vyci0+YW5vbnltb3VzSW5saW5l
QmxvY2soKS0+ZmlsbFNlbGVjdGlvbkdhcHMocm9vdEJsb2NrLCBibG9ja1gsIGJsb2NrWSwgdHgg
KyBjdXJyLT54KCksIHR5ICsgY3Vyci0+eSgpLCBsYXN0VG9wLCBsYXN0TGVmdCwgbGFzdFJpZ2h0
LCBwYWludEluZm8pKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghY29udGFp
bnNTdGFydCAmJiAoIWxhc3RTZWxlY3RlZExpbmUgfHwgbGFzdFNlbGVjdGVkTGluZS0+YW5vbnlt
b3VzSW5saW5lQmxvY2soKSkpCisgICAgICAgICAgICAgICAgcmVzdWx0LnVuaXRlQ2VudGVyKGZp
bGxWZXJ0aWNhbFNlbGVjdGlvbkdhcChsYXN0VG9wLCBsYXN0TGVmdCwgbGFzdFJpZ2h0LCB0eSAr
IHNlbFRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHJvb3RCbG9jaywgYmxvY2tYLCBibG9ja1ksIHBhaW50SW5mbykpOwogCisg
ICAgICAgICAgICBpZiAoIXBhaW50SW5mbyB8fCAodHkgKyBzZWxUb3AgPCBwYWludEluZm8tPnJl
Y3QuYm90dG9tKCkgJiYgdHkgKyBzZWxUb3AgKyBzZWxIZWlnaHQgPiBwYWludEluZm8tPnJlY3Qu
eSgpKSkKKyAgICAgICAgICAgICAgICByZXN1bHQudW5pdGUoY3Vyci0+ZmlsbExpbmVTZWxlY3Rp
b25HYXAoc2VsVG9wLCBzZWxIZWlnaHQsIHJvb3RCbG9jaywgYmxvY2tYLCBibG9ja1ksIHR4LCB0
eSwgcGFpbnRJbmZvKSk7CisgICAgICAgIH0KKyAgICAgICAgCiAgICAgICAgIGxhc3RTZWxlY3Rl
ZExpbmUgPSBjdXJyOwogICAgIH0KIApAQCAtMjA3NCw4ICsyMDE5LDggQEAgR2FwUmVjdHMgUmVu
ZGVyQmxvY2s6OmZpbGxJbmxpbmVTZWxlY3RpbwogICAgICAgICAvLyBWaXNpYmxlU2VsZWN0aW9u
IG11c3Qgc3RhcnQganVzdCBhZnRlciBvdXIgbGFzdCBsaW5lLgogICAgICAgICBsYXN0U2VsZWN0
ZWRMaW5lID0gbGFzdFJvb3RCb3goKTsKIAotICAgIGlmIChsYXN0U2VsZWN0ZWRMaW5lICYmIHNl
bGVjdGlvblN0YXRlKCkgIT0gU2VsZWN0aW9uRW5kICYmIHNlbGVjdGlvblN0YXRlKCkgIT0gU2Vs
ZWN0aW9uQm90aCkgewotICAgICAgICAvLyBHbyBhaGVhZCBhbmQgdXBkYXRlIG91ciBsYXN0WSB0
byBiZSB0aGUgYm90dG9tIG9mIHRoZSBsYXN0IHNlbGVjdGVkIGxpbmUuCisgICAgaWYgKGxhc3RT
ZWxlY3RlZExpbmUgJiYgIWxhc3RTZWxlY3RlZExpbmUtPmhhc0Fub255bW91c0lubGluZUJsb2Nr
KCkgJiYgc2VsZWN0aW9uU3RhdGUoKSAhPSBTZWxlY3Rpb25FbmQgJiYgc2VsZWN0aW9uU3RhdGUo
KSAhPSBTZWxlY3Rpb25Cb3RoKSB7CisgICAgICAgIC8vIEdvIGFoZWFkIGFuZCB1cGRhdGUgb3Vy
IGxhc3RUb3AgdG8gYmUgdGhlIGJvdHRvbSBvZiB0aGUgbGFzdCBzZWxlY3RlZCBsaW5lLgogICAg
ICAgICBsYXN0VG9wID0gKHR5IC0gYmxvY2tZKSArIGxhc3RTZWxlY3RlZExpbmUtPnNlbGVjdGlv
bkJvdHRvbSgpOwogICAgICAgICBsYXN0TGVmdCA9IGxlZnRTZWxlY3Rpb25PZmZzZXQocm9vdEJs
b2NrLCBsYXN0U2VsZWN0ZWRMaW5lLT5zZWxlY3Rpb25Cb3R0b20oKSk7CiAgICAgICAgIGxhc3RS
aWdodCA9IHJpZ2h0U2VsZWN0aW9uT2Zmc2V0KHJvb3RCbG9jaywgbGFzdFNlbGVjdGVkTGluZS0+
c2VsZWN0aW9uQm90dG9tKCkpOwpAQCAtMjk4NSwyNSArMjkzMCwzMSBAQCB2b2lkIFJlbmRlckJs
b2NrOjpjbGVhckZsb2F0cygpCiAgICAgLy8gb3V0IG9mIGZsb3cgKGxpa2UgZmxvYXRpbmcvcG9z
aXRpb25lZCBlbGVtZW50cyksIGFuZCB3ZSBhbHNvIHNraXAgb3ZlciBhbnkgb2JqZWN0cyB0aGF0
IG1heSBoYXZlIHNoaWZ0ZWQKICAgICAvLyB0byBhdm9pZCBmbG9hdHMuCiAgICAgYm9vbCBwYXJl
bnRIYXNGbG9hdHMgPSBmYWxzZTsKLSAgICBSZW5kZXJPYmplY3QqIHByZXYgPSBwcmV2aW91c1Np
YmxpbmcoKTsKLSAgICB3aGlsZSAocHJldiAmJiAocHJldi0+aXNGbG9hdGluZ09yUG9zaXRpb25l
ZCgpIHx8ICFwcmV2LT5pc0JveCgpIHx8ICFwcmV2LT5pc1JlbmRlckJsb2NrKCkgfHwgdG9SZW5k
ZXJCbG9jayhwcmV2KS0+YXZvaWRzRmxvYXRzKCkpKSB7Ci0gICAgICAgIGlmIChwcmV2LT5pc0Zs
b2F0aW5nKCkpCi0gICAgICAgICAgICBwYXJlbnRIYXNGbG9hdHMgPSB0cnVlOwotICAgICAgICAg
cHJldiA9IHByZXYtPnByZXZpb3VzU2libGluZygpOworICAgIFJlbmRlck9iamVjdCogcHJldiA9
IDA7CisgICAgUmVuZGVyQmxvY2sqIHBhcmVudEJsb2NrID0gMDsKKyAgICBpZiAoaXNBbm9ueW1v
dXNJbmxpbmVCbG9jaygpKSB7CisgICAgICAgIHBhcmVudEJsb2NrID0gY29udGFpbmluZ0Jsb2Nr
KCk7CisgICAgICAgIHBhcmVudEhhc0Zsb2F0cyA9IHBhcmVudEJsb2NrLT5jb250YWluc0Zsb2F0
cygpOworICAgIH0gZWxzZSB7ICAgIAorICAgICAgICB3aGlsZSAocHJldiAmJiAocHJldi0+aXNG
bG9hdGluZ09yUG9zaXRpb25lZCgpIHx8ICFwcmV2LT5pc0JveCgpIHx8ICFwcmV2LT5pc1JlbmRl
ckJsb2NrKCkgfHwgdG9SZW5kZXJCbG9jayhwcmV2KS0+YXZvaWRzRmxvYXRzKCkpKSB7CisgICAg
ICAgICAgICBpZiAocHJldi0+aXNGbG9hdGluZygpKQorICAgICAgICAgICAgICAgIHBhcmVudEhh
c0Zsb2F0cyA9IHRydWU7CisgICAgICAgICAgICBwcmV2ID0gcHJldi0+cHJldmlvdXNTaWJsaW5n
KCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHBhcmVudEJsb2NrID0gcGFyZW50KCkt
PmlzUmVuZGVyQmxvY2soKSA/IHRvUmVuZGVyQmxvY2socGFyZW50KCkpIDogMDsKICAgICB9CiAK
ICAgICAvLyBGaXJzdCBhZGQgaW4gZmxvYXRzIGZyb20gdGhlIHBhcmVudC4KICAgICBpbnQgb2Zm
c2V0ID0geSgpOwotICAgIGlmIChwYXJlbnRIYXNGbG9hdHMpIHsKLSAgICAgICAgUmVuZGVyQmxv
Y2sqIHBhcmVudEJsb2NrID0gdG9SZW5kZXJCbG9jayhwYXJlbnQoKSk7CisgICAgaWYgKHBhcmVu
dEhhc0Zsb2F0cykKICAgICAgICAgYWRkSW50cnVkaW5nRmxvYXRzKHBhcmVudEJsb2NrLCBwYXJl
bnRCbG9jay0+Ym9yZGVyTGVmdCgpICsgcGFyZW50QmxvY2stPnBhZGRpbmdMZWZ0KCksIG9mZnNl
dCk7Ci0gICAgfQotICAgIAorCiAgICAgaW50IHhvZmZzZXQgPSAwOwogICAgIGlmIChwcmV2KQog
ICAgICAgICBvZmZzZXQgLT0gdG9SZW5kZXJCb3gocHJldiktPnkoKTsKLSAgICBlbHNlIGlmIChw
YXJlbnQoKS0+aXNCb3goKSkgewotICAgICAgICBwcmV2ID0gcGFyZW50KCk7CisgICAgZWxzZSBp
ZiAocGFyZW50QmxvY2spIHsKKyAgICAgICAgcHJldiA9IHBhcmVudEJsb2NrOwogICAgICAgICB4
b2Zmc2V0ICs9IHRvUmVuZGVyQm94KHByZXYpLT5ib3JkZXJMZWZ0KCkgKyB0b1JlbmRlckJveChw
cmV2KS0+cGFkZGluZ0xlZnQoKTsKICAgICB9CiAKQEAgLTMxMzgsNyArMzA4OSw3IEBAIHZvaWQg
UmVuZGVyQmxvY2s6OmFkZEludHJ1ZGluZ0Zsb2F0cyhSZW4KICAgICAgICAgICAgICAgICAvLyBh
Ym92ZS4gIHx4b2ZmfCB3aWxsIGVxdWFsIC1mbG93LT5tYXJnaW5MZWZ0KCkgaW4gdGhpcyBjYXNl
LCBzbyBpdCdzIGFscmVhZHkgYmVlbiB0YWtlbgogICAgICAgICAgICAgICAgIC8vIGludG8gYWNj
b3VudC4gIE9ubHkgYXBwbHkgdGhpcyBjb2RlIGlmIHxjaGlsZHwgaXMgZmFsc2UsIHNpbmNlIG90
aGVyd2lzZSB0aGUgbGVmdCBtYXJnaW4KICAgICAgICAgICAgICAgICAvLyB3aWxsIGdldCBhcHBs
aWVkIHR3aWNlLgotICAgICAgICAgICAgICAgIGlmIChwcmV2ICE9IHBhcmVudCgpKQorICAgICAg
ICAgICAgICAgIGlmIChwcmV2ICE9IGNvbnRhaW5pbmdCbG9jaygpKQogICAgICAgICAgICAgICAg
ICAgICBmbG9hdGluZ09iai0+bV9sZWZ0ICs9IHByZXYtPm1hcmdpbkxlZnQoKTsKICAgICAgICAg
ICAgICAgICBmbG9hdGluZ09iai0+bV9sZWZ0IC09IG1hcmdpbkxlZnQoKTsKICAgICAgICAgICAg
ICAgICBmbG9hdGluZ09iai0+bV9zaG91bGRQYWludCA9IGZhbHNlOyAgLy8gV2UgYXJlIG5vdCBp
biB0aGUgZGlyZWN0IGluaGVyaXRhbmNlIGNoYWluIGZvciB0aGlzIGZsb2F0LiBXZSB3aWxsIG5l
dmVyIHBhaW50IGl0LgpAQCAtMzE4Myw3ICszMTM0LDEzIEBAIHZvaWQgUmVuZGVyQmxvY2s6Om1h
cmtBbGxEZXNjZW5kYW50c1dpdGgKICAgICAgICAgcmVtb3ZlRmxvYXRpbmdPYmplY3QoZmxvYXRU
b1JlbW92ZSk7CiAKICAgICAvLyBJdGVyYXRlIG92ZXIgb3VyIGNoaWxkcmVuIGFuZCBtYXJrIHRo
ZW0gYXMgbmVlZGVkLgotICAgIGlmICghY2hpbGRyZW5JbmxpbmUoKSkgeworICAgIGlmIChjaGls
ZHJlbklubGluZSgpKSB7CisgICAgICAgIGZvciAoUm9vdElubGluZUJveCogYm94ID0gZmlyc3RS
b290Qm94KCk7IGJveDsgYm94ID0gYm94LT5uZXh0Um9vdEJveCgpKSB7CisgICAgICAgICAgICBS
ZW5kZXJCbG9jayogY2hpbGRCbG9jayA9IGJveC0+YW5vbnltb3VzSW5saW5lQmxvY2soKTsKKyAg
ICAgICAgICAgIGlmIChjaGlsZEJsb2NrICYmIChmbG9hdFRvUmVtb3ZlID8gY2hpbGRCbG9jay0+
Y29udGFpbnNGbG9hdChmbG9hdFRvUmVtb3ZlKSA6IGNoaWxkQmxvY2stPmNvbnRhaW5zRmxvYXRz
KCkpKQorICAgICAgICAgICAgICAgIGNoaWxkQmxvY2stPm1hcmtBbGxEZXNjZW5kYW50c1dpdGhG
bG9hdHNGb3JMYXlvdXQoZmxvYXRUb1JlbW92ZSwgaW5MYXlvdXQpOworICAgICAgICB9CisgICAg
fSBlbHNlIHsKICAgICAgICAgZm9yIChSZW5kZXJPYmplY3QqIGNoaWxkID0gZmlyc3RDaGlsZCgp
OyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKSkgewogICAgICAgICAgICAgaWYg
KCghZmxvYXRUb1JlbW92ZSAmJiBjaGlsZC0+aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpKSB8fCAh
Y2hpbGQtPmlzUmVuZGVyQmxvY2soKSkKICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTM0
NTEsNiArMzQwOCwxMSBAQCBzdGF0aWMgVmlzaWJsZVBvc2l0aW9uIHBvc2l0aW9uRm9yUG9pbnRS
CiAgICAgcmV0dXJuIGFuY2VzdG9yLT5jcmVhdGVWaXNpYmxlUG9zaXRpb24oY2hpbGROb2RlLT5u
b2RlSW5kZXgoKSArIDEsIFVQU1RSRUFNKTsKIH0KIAorc3RhdGljIGlubGluZSBib29sIGlzQ2hp
bGRIaXRUZXN0Q2FuZGlkYXRlKFJlbmRlckJveCogYm94KQoreworICAgIHJldHVybiBib3gtPmhl
aWdodCgpICYmIGJveC0+c3R5bGUoKS0+dmlzaWJpbGl0eSgpID09IFZJU0lCTEUgJiYgIWJveC0+
aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpOworfQorCiBWaXNpYmxlUG9zaXRpb24gUmVuZGVyQmxv
Y2s6OnBvc2l0aW9uRm9yUG9pbnRXaXRoSW5saW5lQ2hpbGRyZW4oY29uc3QgSW50UG9pbnQmIHBv
aW50SW5Db250ZW50cykKIHsKICAgICBBU1NFUlQoY2hpbGRyZW5JbmxpbmUoKSk7CkBAIC0zNDYz
LDggKzM0MjUsMTggQEAgVmlzaWJsZVBvc2l0aW9uIFJlbmRlckJsb2NrOjpwb3NpdGlvbkZvcgog
ICAgIFJvb3RJbmxpbmVCb3gqIGZpcnN0Um9vdEJveFdpdGhDaGlsZHJlbiA9IDA7CiAgICAgUm9v
dElubGluZUJveCogbGFzdFJvb3RCb3hXaXRoQ2hpbGRyZW4gPSAwOwogICAgIGZvciAoUm9vdElu
bGluZUJveCogcm9vdCA9IGZpcnN0Um9vdEJveCgpOyByb290OyByb290ID0gcm9vdC0+bmV4dFJv
b3RCb3goKSkgeworICAgICAgICBSZW5kZXJCbG9jayogY2hpbGRCbG9jayA9IHJvb3QtPmFub255
bW91c0lubGluZUJsb2NrKCk7CisgICAgICAgIGlmIChjaGlsZEJsb2NrKSB7CisgICAgICAgICAg
ICBmaXJzdFJvb3RCb3hXaXRoQ2hpbGRyZW4gPSAwOworICAgICAgICAgICAgbGFzdFJvb3RCb3hX
aXRoQ2hpbGRyZW4gPSAwOworICAgICAgICAgICAgaWYgKGlzQ2hpbGRIaXRUZXN0Q2FuZGlkYXRl
KGNoaWxkQmxvY2spICYmIHBvaW50SW5Db250ZW50cy55KCkgPCBjaGlsZEJsb2NrLT5mcmFtZVJl
Y3QoKS5ib3R0b20oKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gcG9zaXRpb25Gb3JQb2ludFJl
c3BlY3RpbmdFZGl0aW5nQm91bmRhcmllcyh0aGlzLCBjaGlsZEJsb2NrLCBwb2ludEluQ29udGVu
dHMpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKwogICAgICAgICBpZiAoIXJv
b3QtPmZpcnN0TGVhZkNoaWxkKCkpCiAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgCiAg
ICAgICAgIGlmICghZmlyc3RSb290Qm94V2l0aENoaWxkcmVuKQogICAgICAgICAgICAgZmlyc3RS
b290Qm94V2l0aENoaWxkcmVuID0gcm9vdDsKICAgICAgICAgbGFzdFJvb3RCb3hXaXRoQ2hpbGRy
ZW4gPSByb290OwpAQCAtMzQ3Miw3ICszNDQ0LDcgQEAgVmlzaWJsZVBvc2l0aW9uIFJlbmRlckJs
b2NrOjpwb3NpdGlvbkZvcgogICAgICAgICAvLyBzZXQgdGhlIGJvdHRvbSBiYXNlZCBvbiB3aGV0
aGVyIHRoZXJlIGlzIGEgbmV4dCByb290IGJveAogICAgICAgICAvLyBGSVhNRTogVGhpcyB3aWxs
IGNvbnNpZGVyIG5leHRSb290Qm94IGV2ZW4gaWYgaXQgaGFzIG5vIGNoaWxkcmVuLCBhbmQgbWF5
YmUgaXQgc2hvdWxkbid0LgogICAgICAgICBpbnQgYm90dG9tOwotICAgICAgICBpZiAocm9vdC0+
bmV4dFJvb3RCb3goKSkgeworICAgICAgICBpZiAocm9vdC0+bmV4dFJvb3RCb3goKSAmJiAhcm9v
dC0+bmV4dFJvb3RCb3goKS0+aGFzQW5vbnltb3VzSW5saW5lQmxvY2soKSkgewogICAgICAgICAg
ICAgLy8gRklYTUU6IFdlIHdvdWxkIHByZWZlciB0byBtYWtlIHRoZSBicmVhayBwb2ludCBoYWxm
d2F5IGJldHdlZW4gdGhlIGJvdHRvbQogICAgICAgICAgICAgLy8gb2YgdGhlIHByZXZpb3VzIHJv
b3QgYm94IGFuZCB0aGUgdG9wIG9mIHRoZSBuZXh0IHJvb3QgYm94LgogICAgICAgICAgICAgYm90
dG9tID0gcm9vdC0+bmV4dFJvb3RCb3goKS0+bGluZVRvcCgpOwpAQCAtMzUxNywxNyArMzQ4OSwx
MiBAQCBWaXNpYmxlUG9zaXRpb24gUmVuZGVyQmxvY2s6OnBvc2l0aW9uRm9yCiAgICAgcmV0dXJu
IGNyZWF0ZVZpc2libGVQb3NpdGlvbigwLCBET1dOU1RSRUFNKTsKIH0KIAotc3RhdGljIGlubGlu
ZSBib29sIGlzQ2hpbGRIaXRUZXN0Q2FuZGlkYXRlKFJlbmRlckJveCogYm94KQotewotICAgIHJl
dHVybiBib3gtPmhlaWdodCgpICYmIGJveC0+c3R5bGUoKS0+dmlzaWJpbGl0eSgpID09IFZJU0lC
TEUgJiYgIWJveC0+aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpOwotfQotCiBWaXNpYmxlUG9zaXRp
b24gUmVuZGVyQmxvY2s6OnBvc2l0aW9uRm9yUG9pbnQoY29uc3QgSW50UG9pbnQmIHBvaW50KQog
ewogICAgIGlmIChpc1RhYmxlKCkpCiAgICAgICAgIHJldHVybiBSZW5kZXJCb3g6OnBvc2l0aW9u
Rm9yUG9pbnQocG9pbnQpOwogCi0gICAgaWYgKGlzUmVwbGFjZWQoKSkgeworICAgIGlmIChpc1Jl
cGxhY2VkKCkgJiYgIWlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkgewogICAgICAgICBpZiAocG9p
bnQueSgpIDwgMCB8fCAocG9pbnQueSgpIDwgaGVpZ2h0KCkgJiYgcG9pbnQueCgpIDwgMCkpCiAg
ICAgICAgICAgICByZXR1cm4gY3JlYXRlVmlzaWJsZVBvc2l0aW9uKGNhcmV0TWluT2Zmc2V0KCks
IERPV05TVFJFQU0pOwogICAgICAgICBpZiAocG9pbnQueSgpID49IGhlaWdodCgpIHx8IChwb2lu
dC55KCkgPj0gMCAmJiBwb2ludC54KCkgPj0gd2lkdGgoKSkpCkBAIC00MTQyLDE0ICs0MTA5LDE1
IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmNhbGNJbmxpbmVQcmVmV2lkdGhzKCkKICAgICAgICAgICAg
ICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgY2xlYXJQcmV2aW91c0Zsb2F0ID0gZmFs
c2U7CiAKLSAgICAgICAgICAgICAgICBib29sIGNhbkJyZWFrUmVwbGFjZWRFbGVtZW50ID0gIWNo
aWxkLT5pc0ltYWdlKCkgfHwgYWxsb3dJbWFnZXNUb0JyZWFrOworICAgICAgICAgICAgICAgIGJv
b2wgY2FuQnJlYWtSZXBsYWNlZEVsZW1lbnQgPSAhY2hpbGQtPmlzSW1hZ2UoKSB8fCBhbGxvd0lt
YWdlc1RvQnJlYWsgfHwgY2hpbGQtPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKTsKICAgICAgICAg
ICAgICAgICBpZiAoKGNhbkJyZWFrUmVwbGFjZWRFbGVtZW50ICYmIChhdXRvV3JhcCB8fCBvbGRB
dXRvV3JhcCkpIHx8IGNsZWFyUHJldmlvdXNGbG9hdCkgewogICAgICAgICAgICAgICAgICAgICBt
X21pblByZWZXaWR0aCA9IG1heChpbmxpbmVNaW4sIG1fbWluUHJlZldpZHRoKTsKICAgICAgICAg
ICAgICAgICAgICAgaW5saW5lTWluID0gMDsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAg
ICAgICAgICAvLyBJZiB3ZSdyZSBzdXBwb3NlZCB0byBjbGVhciB0aGUgcHJldmlvdXMgZmxvYXQs
IHRoZW4gdGVybWluYXRlIG1heHdpZHRoIGFzIHdlbGwuCi0gICAgICAgICAgICAgICAgaWYgKGNs
ZWFyUHJldmlvdXNGbG9hdCkgeworICAgICAgICAgICAgICAgIC8vIEFsc28gZG8gdGhpcyBmb3Ig
YW5vbnltb3VzIGlubGluZSBibG9ja3MuCisgICAgICAgICAgICAgICAgaWYgKGNsZWFyUHJldmlv
dXNGbG9hdCB8fCBjaGlsZC0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CiAgICAgICAgICAg
ICAgICAgICAgIG1fbWF4UHJlZldpZHRoID0gbWF4KGlubGluZU1heCwgbV9tYXhQcmVmV2lkdGgp
OwogICAgICAgICAgICAgICAgICAgICBpbmxpbmVNYXggPSAwOwogICAgICAgICAgICAgICAgIH0K
QEAgLTQxNTgsMTUgKzQxMjYsMTcgQEAgdm9pZCBSZW5kZXJCbG9jazo6Y2FsY0lubGluZVByZWZX
aWR0aHMoKQogICAgICAgICAgICAgICAgIGludCB0aSA9IDA7CiAgICAgICAgICAgICAgICAgaWYg
KCFhZGRlZFRleHRJbmRlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgYWRkZWRUZXh0SW5kZW50
ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgdGkgPSBzdHlsZSgpLT50ZXh0SW5kZW50KCku
Y2FsY01pblZhbHVlKGN3KTsKLSAgICAgICAgICAgICAgICAgICAgY2hpbGRNaW4rPXRpOwotICAg
ICAgICAgICAgICAgICAgICBjaGlsZE1heCs9dGk7CisgICAgICAgICAgICAgICAgICAgIGlmICgh
Y2hpbGQtPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkgeworICAgICAgICAgICAgICAgICAgICAg
ICAgdGkgPSBzdHlsZSgpLT50ZXh0SW5kZW50KCkuY2FsY01pblZhbHVlKGN3KTsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGNoaWxkTWluICs9IHRpOworICAgICAgICAgICAgICAgICAgICAgICAg
Y2hpbGRNYXggKz0gdGk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9
CiAKICAgICAgICAgICAgICAgICAvLyBBZGQgb3VyIHdpZHRoIHRvIHRoZSBtYXguCiAgICAgICAg
ICAgICAgICAgaW5saW5lTWF4ICs9IGNoaWxkTWF4OwogCi0gICAgICAgICAgICAgICAgaWYgKCFh
dXRvV3JhcCB8fCAhY2FuQnJlYWtSZXBsYWNlZEVsZW1lbnQpIHsKKyAgICAgICAgICAgICAgICBp
ZiAoKCFhdXRvV3JhcCB8fCAhY2FuQnJlYWtSZXBsYWNlZEVsZW1lbnQpICYmICFjaGlsZC0+aXNB
bm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC0+
aXNGbG9hdGluZygpKQogICAgICAgICAgICAgICAgICAgICAgICAgbV9taW5QcmVmV2lkdGggPSBt
YXgoY2hpbGRNaW4sIG1fbWluUHJlZldpZHRoKTsKICAgICAgICAgICAgICAgICAgICAgZWxzZQpA
QCAtNDE3Nyw2ICs0MTQ3LDEyIEBAIHZvaWQgUmVuZGVyQmxvY2s6OmNhbGNJbmxpbmVQcmVmV2lk
dGhzKCkKIAogICAgICAgICAgICAgICAgICAgICAvLyBOb3cgc3RhcnQgYSBuZXcgbGluZS4KICAg
ICAgICAgICAgICAgICAgICAgaW5saW5lTWluID0gMDsKKyAgICAgICAgICAgICAgICAgICAgCisg
ICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7
CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUZXJtaW5hdGUgbWF4IHdpZHRoIGFzIHdlbGwu
CisgICAgICAgICAgICAgICAgICAgICAgICBtX21heFByZWZXaWR0aCA9IG1heChjaGlsZE1heCwg
bV9tYXhQcmVmV2lkdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lTWF4ID0gMDsK
KyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAg
ICAgIC8vIFdlIGFyZSBubyBsb25nZXIgc3RyaXBwaW5nIHdoaXRlc3BhY2UgYXQgdGhlIHN0YXJ0
IG9mCkBAIC00NDE3LDkgKzQzOTMsMTIgQEAgaW50IFJlbmRlckJsb2NrOjpsaW5lSGVpZ2h0KGJv
b2wgZmlyc3RMaQogICAgIC8vIHRoZSBiYXNlIGNsYXNzLiAgSWYgd2UncmUgYmVpbmcgcXVlcmll
ZCBhcyB0aG91Z2ggd2UncmUgdGhlIHJvb3QgbGluZQogICAgIC8vIGJveCwgdGhlbiB0aGUgZmFj
dCB0aGF0IHdlJ3JlIGFuIGlubGluZS1ibG9jayBpcyBpcnJlbGV2YW50LCBhbmQgd2UgYmVoYXZl
CiAgICAgLy8ganVzdCBsaWtlIGEgYmxvY2suCi0gICAgaWYgKGlzUmVwbGFjZWQoKSAmJiAhaXNS
b290TGluZUJveCkKKyAgICBpZiAoaXNSZXBsYWNlZCgpICYmICFpc1Jvb3RMaW5lQm94KSB7Cisg
ICAgICAgIGlmIChpc0Fub255bW91c0lubGluZUJsb2NrKCkpCisgICAgICAgICAgICByZXR1cm4g
aGVpZ2h0KCk7CiAgICAgICAgIHJldHVybiBoZWlnaHQoKSArIG1hcmdpblRvcCgpICsgbWFyZ2lu
Qm90dG9tKCk7Ci0gICAgCisgICAgfQorCiAgICAgaWYgKGZpcnN0TGluZSAmJiBkb2N1bWVudCgp
LT51c2VzRmlyc3RMaW5lUnVsZXMoKSkgewogICAgICAgICBSZW5kZXJTdHlsZSogcyA9IHN0eWxl
KGZpcnN0TGluZSk7CiAgICAgICAgIGlmIChzICE9IHN0eWxlKCkpCkBAIC00NDUxLDYgKzQ0MzAs
OCBAQCBpbnQgUmVuZGVyQmxvY2s6OmJhc2VsaW5lUG9zaXRpb24oYm9vbCBiCiAgICAgICAgIC8v
IFdlIGFsc28gZ2l2ZSB1cCBvbiBmaW5kaW5nIGEgYmFzZWxpbmUgaWYgd2UgaGF2ZSBhIHZlcnRp
Y2FsIHNjcm9sbGJhciwgb3IgaWYgd2UgYXJlIHNjcm9sbGVkCiAgICAgICAgIC8vIHZlcnRpY2Fs
bHkgKGUuZy4sIGFuIG92ZXJmbG93OmhpZGRlbiBibG9jayB0aGF0IGhhcyBoYWQgc2Nyb2xsVG9w
IG1vdmVkKSBvciBpZiB0aGUgYmFzZWxpbmUgaXMgb3V0c2lkZQogICAgICAgICAvLyBvZiBvdXIg
Y29udGVudCBib3guCisgICAgICAgIGlmIChpc0Fub255bW91c0lubGluZUJsb2NrKCkpCisgICAg
ICAgICAgICByZXR1cm4gaGVpZ2h0KCk7CiAgICAgICAgIGludCBiYXNlbGluZVBvcyA9IChsYXll
cigpICYmIChsYXllcigpLT5tYXJxdWVlKCkgfHwgbGF5ZXIoKS0+dmVydGljYWxTY3JvbGxiYXIo
KSB8fCBsYXllcigpLT5zY3JvbGxZT2Zmc2V0KCkgIT0gMCkpID8gLTEgOiBsYXN0TGluZUJveEJh
c2VsaW5lKCk7CiAgICAgICAgIGlmIChiYXNlbGluZVBvcyAhPSAtMSAmJiBiYXNlbGluZVBvcyA8
PSBib3JkZXJUb3AoKSArIHBhZGRpbmdUb3AoKSArIGNvbnRlbnRIZWlnaHQoKSkKICAgICAgICAg
ICAgIHJldHVybiBtYXJnaW5Ub3AoKSArIGJhc2VsaW5lUG9zOwpAQCAtNDg3NSw2MCArNDg1Niw2
IEBAIHZvaWQgUmVuZGVyQmxvY2s6OnNldE1heEJvdHRvbU1hcmdpbnMoaW4KICAgICBtX21heE1h
cmdpbi0+bV9ib3R0b21OZWcgPSBuZWc7CiB9CiAKLXZvaWQgUmVuZGVyQmxvY2s6OmFic29sdXRl
UmVjdHMoVmVjdG9yPEludFJlY3Q+JiByZWN0cywgaW50IHR4LCBpbnQgdHkpCi17Ci0gICAgLy8g
Rm9yIGJsb2NrcyBpbnNpZGUgaW5saW5lcywgd2UgZ28gYWhlYWQgYW5kIGluY2x1ZGUgbWFyZ2lu
cyBzbyB0aGF0IHdlIHJ1biByaWdodCB1cCB0byB0aGUKLSAgICAvLyBpbmxpbmUgYm94ZXMgYWJv
dmUgYW5kIGJlbG93IHVzICh0aHVzIGdldHRpbmcgbWVyZ2VkIHdpdGggdGhlbSB0byBmb3JtIGEg
c2luZ2xlIGlycmVndWxhcgotICAgIC8vIHNoYXBlKS4KLSAgICBpZiAoaW5saW5lQ29udGludWF0
aW9uKCkpIHsKLSAgICAgICAgcmVjdHMuYXBwZW5kKEludFJlY3QodHgsIHR5IC0gY29sbGFwc2Vk
TWFyZ2luVG9wKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoKCksIGhlaWdo
dCgpICsgY29sbGFwc2VkTWFyZ2luVG9wKCkgKyBjb2xsYXBzZWRNYXJnaW5Cb3R0b20oKSkpOwot
ICAgICAgICBpbmxpbmVDb250aW51YXRpb24oKS0+YWJzb2x1dGVSZWN0cyhyZWN0cywKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHggLSB4KCkgKyBpbmxpbmVD
b250aW51YXRpb24oKS0+Y29udGFpbmluZ0Jsb2NrKCktPngoKSwKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgdHkgLSB5KCkgKyBpbmxpbmVDb250aW51YXRpb24o
KS0+Y29udGFpbmluZ0Jsb2NrKCktPnkoKSk7Ci0gICAgfSBlbHNlCi0gICAgICAgIHJlY3RzLmFw
cGVuZChJbnRSZWN0KHR4LCB0eSwgd2lkdGgoKSwgaGVpZ2h0KCkpKTsKLX0KLQotdm9pZCBSZW5k
ZXJCbG9jazo6YWJzb2x1dGVRdWFkcyhWZWN0b3I8RmxvYXRRdWFkPiYgcXVhZHMpCi17Ci0gICAg
Ly8gRm9yIGJsb2NrcyBpbnNpZGUgaW5saW5lcywgd2UgZ28gYWhlYWQgYW5kIGluY2x1ZGUgbWFy
Z2lucyBzbyB0aGF0IHdlIHJ1biByaWdodCB1cCB0byB0aGUKLSAgICAvLyBpbmxpbmUgYm94ZXMg
YWJvdmUgYW5kIGJlbG93IHVzICh0aHVzIGdldHRpbmcgbWVyZ2VkIHdpdGggdGhlbSB0byBmb3Jt
IGEgc2luZ2xlIGlycmVndWxhcgotICAgIC8vIHNoYXBlKS4KLSAgICBpZiAoaW5saW5lQ29udGlu
dWF0aW9uKCkpIHsKLSAgICAgICAgRmxvYXRSZWN0IGxvY2FsUmVjdCgwLCAtY29sbGFwc2VkTWFy
Z2luVG9wKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgoKSwgaGVpZ2h0KCkg
KyBjb2xsYXBzZWRNYXJnaW5Ub3AoKSArIGNvbGxhcHNlZE1hcmdpbkJvdHRvbSgpKTsKLSAgICAg
ICAgcXVhZHMuYXBwZW5kKGxvY2FsVG9BYnNvbHV0ZVF1YWQobG9jYWxSZWN0KSk7Ci0gICAgICAg
IGlubGluZUNvbnRpbnVhdGlvbigpLT5hYnNvbHV0ZVF1YWRzKHF1YWRzKTsKLSAgICB9IGVsc2UK
LSAgICAgICAgcXVhZHMuYXBwZW5kKFJlbmRlckJveDo6bG9jYWxUb0Fic29sdXRlUXVhZChGbG9h
dFJlY3QoMCwgMCwgd2lkdGgoKSwgaGVpZ2h0KCkpKSk7Ci19Ci0KLUludFJlY3QgUmVuZGVyQmxv
Y2s6OnJlY3RXaXRoT3V0bGluZUZvclJlcGFpbnQoUmVuZGVyQm94TW9kZWxPYmplY3QqIHJlcGFp
bnRDb250YWluZXIsIGludCBvdXRsaW5lV2lkdGgpCi17Ci0gICAgSW50UmVjdCByKFJlbmRlckJv
eDo6cmVjdFdpdGhPdXRsaW5lRm9yUmVwYWludChyZXBhaW50Q29udGFpbmVyLCBvdXRsaW5lV2lk
dGgpKTsKLSAgICBpZiAoaW5saW5lQ29udGludWF0aW9uKCkpCi0gICAgICAgIHIuaW5mbGF0ZVko
Y29sbGFwc2VkTWFyZ2luVG9wKCkpOwotICAgIHJldHVybiByOwotfQotCi1SZW5kZXJPYmplY3Qq
IFJlbmRlckJsb2NrOjpob3ZlckFuY2VzdG9yKCkgY29uc3QKLXsKLSAgICByZXR1cm4gaW5saW5l
Q29udGludWF0aW9uKCkgPyBpbmxpbmVDb250aW51YXRpb24oKSA6IFJlbmRlckJveDo6aG92ZXJB
bmNlc3RvcigpOwotfQotCi12b2lkIFJlbmRlckJsb2NrOjp1cGRhdGVEcmFnU3RhdGUoYm9vbCBk
cmFnT24pCi17Ci0gICAgUmVuZGVyQm94Ojp1cGRhdGVEcmFnU3RhdGUoZHJhZ09uKTsKLSAgICBp
ZiAoaW5saW5lQ29udGludWF0aW9uKCkpCi0gICAgICAgIGlubGluZUNvbnRpbnVhdGlvbigpLT51
cGRhdGVEcmFnU3RhdGUoZHJhZ09uKTsKLX0KLQotUmVuZGVyU3R5bGUqIFJlbmRlckJsb2NrOjpv
dXRsaW5lU3R5bGVGb3JSZXBhaW50KCkgY29uc3QKLXsKLSAgICByZXR1cm4gaW5saW5lQ29udGlu
dWF0aW9uKCkgPyBpbmxpbmVDb250aW51YXRpb24oKS0+c3R5bGUoKSA6IHN0eWxlKCk7Ci19Ci0K
IHZvaWQgUmVuZGVyQmxvY2s6OmNoaWxkQmVjYW1lTm9uSW5saW5lKFJlbmRlck9iamVjdCopCiB7
CiAgICAgbWFrZUNoaWxkcmVuTm9uSW5saW5lKCk7CkBAIC00OTM3LDI2ICs0ODY0LDYgQEAgdm9p
ZCBSZW5kZXJCbG9jazo6Y2hpbGRCZWNhbWVOb25JbmxpbmUoUgogICAgIC8vIHx0aGlzfCBtYXkg
YmUgZGVhZCBoZXJlCiB9CiAKLXZvaWQgUmVuZGVyQmxvY2s6OnVwZGF0ZUhpdFRlc3RSZXN1bHQo
SGl0VGVzdFJlc3VsdCYgcmVzdWx0LCBjb25zdCBJbnRQb2ludCYgcG9pbnQpCi17Ci0gICAgaWYg
KHJlc3VsdC5pbm5lck5vZGUoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgTm9kZSogbiA9IG5v
ZGUoKTsKLSAgICBpZiAoaW5saW5lQ29udGludWF0aW9uKCkpCi0gICAgICAgIC8vIFdlIGFyZSBp
biB0aGUgbWFyZ2lucyBvZiBibG9jayBlbGVtZW50cyB0aGF0IGFyZSBwYXJ0IG9mIGEgY29udGlu
dWF0aW9uLiAgSW4KLSAgICAgICAgLy8gdGhpcyBjYXNlIHdlJ3JlIGFjdHVhbGx5IHN0aWxsIGlu
c2lkZSB0aGUgZW5jbG9zaW5nIGlubGluZSBlbGVtZW50IHRoYXQgd2FzCi0gICAgICAgIC8vIHNw
bGl0LiAgR28gYWhlYWQgYW5kIHNldCBvdXIgaW5uZXIgbm9kZSBhY2NvcmRpbmdseS4KLSAgICAg
ICAgbiA9IGlubGluZUNvbnRpbnVhdGlvbigpLT5ub2RlKCk7Ci0KLSAgICBpZiAobikgewotICAg
ICAgICByZXN1bHQuc2V0SW5uZXJOb2RlKG4pOwotICAgICAgICBpZiAoIXJlc3VsdC5pbm5lck5v
blNoYXJlZE5vZGUoKSkKLSAgICAgICAgICAgIHJlc3VsdC5zZXRJbm5lck5vblNoYXJlZE5vZGUo
bik7Ci0gICAgICAgIHJlc3VsdC5zZXRMb2NhbFBvaW50KHBvaW50KTsKLSAgICB9Ci19Ci0KIElu
dFJlY3QgUmVuZGVyQmxvY2s6OmxvY2FsQ2FyZXRSZWN0KElubGluZUJveCogaW5saW5lQm94LCBp
bnQgY2FyZXRPZmZzZXQsIGludCogZXh0cmFXaWR0aFRvRW5kT2ZMaW5lKQogewogICAgIC8vIERv
IHRoZSBub3JtYWwgY2FsY3VsYXRpb24gaW4gbW9zdCBjYXNlcy4KQEAgLTUwMzcsMjEgKzQ5NDQs
MTcgQEAgSW50UmVjdCBSZW5kZXJCbG9jazo6bG9jYWxDYXJldFJlY3QoSW5saQogCiB2b2lkIFJl
bmRlckJsb2NrOjphZGRGb2N1c1JpbmdSZWN0cyhWZWN0b3I8SW50UmVjdD4mIHJlY3RzLCBpbnQg
dHgsIGludCB0eSkKIHsKLSAgICAvLyBGb3IgYmxvY2tzIGluc2lkZSBpbmxpbmVzLCB3ZSBnbyBh
aGVhZCBhbmQgaW5jbHVkZSBtYXJnaW5zIHNvIHRoYXQgd2UgcnVuIHJpZ2h0IHVwIHRvIHRoZQot
ICAgIC8vIGlubGluZSBib3hlcyBhYm92ZSBhbmQgYmVsb3cgdXMgKHRodXMgZ2V0dGluZyBtZXJn
ZWQgd2l0aCB0aGVtIHRvIGZvcm0gYSBzaW5nbGUgaXJyZWd1bGFyCi0gICAgLy8gc2hhcGUpLgot
ICAgIGlmIChpbmxpbmVDb250aW51YXRpb24oKSkgewotICAgICAgICAvLyBGSVhNRTogVGhpcyBj
aGVjayByZWFsbHkgaXNuJ3QgYWNjdXJhdGUuIAotICAgICAgICBib29sIG5leHRJbmxpbmVIYXNM
aW5lQm94ID0gaW5saW5lQ29udGludWF0aW9uKCktPmZpcnN0TGluZUJveCgpOwotICAgICAgICAv
LyBGSVhNRTogVGhpcyBpcyB3cm9uZy4gVGhlIHByaW5jaXBhbCByZW5kZXJlciBtYXkgbm90IGJl
IHRoZSBjb250aW51YXRpb24gcHJlY2VkaW5nIHRoaXMgYmxvY2suCi0gICAgICAgIGJvb2wgcHJl
dklubGluZUhhc0xpbmVCb3ggPSB0b1JlbmRlcklubGluZShpbmxpbmVDb250aW51YXRpb24oKS0+
bm9kZSgpLT5yZW5kZXJlcigpKS0+Zmlyc3RMaW5lQm94KCk7IAotICAgICAgICBpbnQgdG9wTWFy
Z2luID0gcHJldklubGluZUhhc0xpbmVCb3ggPyBjb2xsYXBzZWRNYXJnaW5Ub3AoKSA6IDA7Ci0g
ICAgICAgIGludCBib3R0b21NYXJnaW4gPSBuZXh0SW5saW5lSGFzTGluZUJveCA/IGNvbGxhcHNl
ZE1hcmdpbkJvdHRvbSgpIDogMDsKLSAgICAgICAgSW50UmVjdCByZWN0KHR4LCB0eSAtIHRvcE1h
cmdpbiwgd2lkdGgoKSwgaGVpZ2h0KCkgKyB0b3BNYXJnaW4gKyBib3R0b21NYXJnaW4pOwotICAg
ICAgICBpZiAoIXJlY3QuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmVjdHMuYXBwZW5kKHJlY3Qp
OwotICAgIH0gZWxzZSBpZiAod2lkdGgoKSAmJiBoZWlnaHQoKSkKLSAgICAgICAgcmVjdHMuYXBw
ZW5kKEludFJlY3QodHgsIHR5LCB3aWR0aCgpLCBoZWlnaHQoKSkpOworICAgIGludCB0b3AgPSB0
eTsKKyAgICBpbnQgYm90dG9tID0gdG9wICsgaGVpZ2h0KCk7CisgICAgaWYgKGlzQW5vbnltb3Vz
SW5saW5lQmxvY2soKSAmJiBoZWlnaHQoKSkgeworICAgICAgICBpZiAobV9pbmxpbmVCb3hXcmFw
cGVyICYmIG1faW5saW5lQm94V3JhcHBlci0+cm9vdCgpLT5wcmV2Um9vdEJveCgpKQorICAgICAg
ICAgICAgdG9wID0gbWluKHRvcCwgdG9wIC0gY29sbGFwc2VkTWFyZ2luVG9wKCkpOworICAgICAg
ICBpZiAobV9pbmxpbmVCb3hXcmFwcGVyICYmIG1faW5saW5lQm94V3JhcHBlci0+cm9vdCgpLT5u
ZXh0Um9vdEJveCgpKQorICAgICAgICAgICAgYm90dG9tID0gbWF4KGJvdHRvbSwgYm90dG9tICsg
Y29sbGFwc2VkTWFyZ2luQm90dG9tKCkpOworICAgIH0KKyAgICBJbnRSZWN0IHJlc3VsdCh0eCwg
dG9wLCB3aWR0aCgpLCBib3R0b20gLSB0b3ApOworICAgIGlmICghcmVzdWx0LmlzRW1wdHkoKSkK
KyAgICAgICAgcmVjdHMuYXBwZW5kKHJlc3VsdCk7CiAKICAgICBpZiAoIWhhc092ZXJmbG93Q2xp
cCgpICYmICFoYXNDb250cm9sQ2xpcCgpKSB7CiAgICAgICAgIGZvciAoUm9vdElubGluZUJveCog
Y3VyciA9IGZpcnN0Um9vdEJveCgpOyBjdXJyOyBjdXJyID0gY3Vyci0+bmV4dFJvb3RCb3goKSkg
ewpAQCAtNTA3NSwxMSArNDk3OCw2IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmFkZEZvY3VzUmluZ1Jl
Y3RzKFZlY3QKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLQotICAgIGlmIChpbmxp
bmVDb250aW51YXRpb24oKSkKLSAgICAgICAgaW5saW5lQ29udGludWF0aW9uKCktPmFkZEZvY3Vz
UmluZ1JlY3RzKHJlY3RzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHR4IC0geCgpICsgaW5saW5lQ29udGludWF0aW9uKCktPmNvbnRhaW5pbmdCbG9j
aygpLT54KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICB0eSAtIHkoKSArIGlubGluZUNvbnRpbnVhdGlvbigpLT5jb250YWluaW5nQmxvY2soKS0+eSgp
KTsKIH0KIAogUmVuZGVyQmxvY2sqIFJlbmRlckJsb2NrOjpjcmVhdGVBbm9ueW1vdXNCbG9jayhi
b29sIGlzRmxleGlibGVCb3gpIGNvbnN0CkBAIC01MTExLDYgKzUwMDksOCBAQCBjb25zdCBjaGFy
KiBSZW5kZXJCbG9jazo6cmVuZGVyTmFtZSgpIGNvCiAgICAgICAgIHJldHVybiAiUmVuZGVyQmxv
Y2sgKHBvc2l0aW9uZWQpIjsKICAgICBpZiAoaXNBbm9ueW1vdXNCbG9jaygpKQogICAgICAgICBy
ZXR1cm4gIlJlbmRlckJsb2NrIChhbm9ueW1vdXMpIjsKKyAgICBlbHNlIGlmIChpc0Fub255bW91
c0lubGluZUJsb2NrKCkpCisgICAgICAgIHJldHVybiAiUmVuZGVyQmxvY2sgKGFub255bW91cyBp
bmxpbmUtYmxvY2spIjsKICAgICBlbHNlIGlmIChpc0Fub255bW91cygpKQogICAgICAgICByZXR1
cm4gIlJlbmRlckJsb2NrIChnZW5lcmF0ZWQpIjsKICAgICBpZiAoaXNSZWxQb3NpdGlvbmVkKCkp
CkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmgJKHJldmlzaW9uIDU0NTYxKQorKysgV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suaAkod29ya2luZyBjb3B5KQpAQCAtNzksNyArNzksNyBA
QCBwdWJsaWM6CiAgICAgc3RhdGljIHZvaWQgcmVtb3ZlUGVyY2VudEhlaWdodERlc2NlbmRhbnQo
UmVuZGVyQm94Kik7CiAgICAgSGFzaFNldDxSZW5kZXJCb3gqPiogcGVyY2VudEhlaWdodERlc2Nl
bmRhbnRzKCkgY29uc3Q7CiAKLSAgICBSb290SW5saW5lQm94KiBjcmVhdGVBbmRBcHBlbmRSb290
SW5saW5lQm94KCk7CisgICAgUm9vdElubGluZUJveCogY3JlYXRlQW5kQXBwZW5kUm9vdElubGlu
ZUJveChSZW5kZXJCbG9jayogYW5vbnltb3VzSW5saW5lQmxvY2spOwogCiAgICAgYm9vbCBnZW5l
cmF0ZXNMaW5lQm94ZXNGb3JJbmxpbmVDaGlsZChSZW5kZXJPYmplY3QqLCBib29sIGlzTGluZUVt
cHR5ID0gdHJ1ZSwgYm9vbCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHkgPSB0cnVlKTsKIApAQCAt
MTI5LDE1ICsxMjksMTggQEAgcHVibGljOgogCiAgICAgdm9pZCBhZGp1c3RSZWN0Rm9yQ29sdW1u
cyhJbnRSZWN0JikgY29uc3Q7CiAKLSAgICB2b2lkIGFkZENvbnRpbnVhdGlvbldpdGhPdXRsaW5l
KFJlbmRlcklubGluZSopOwotCi0gICAgUmVuZGVySW5saW5lKiBpbmxpbmVDb250aW51YXRpb24o
KSBjb25zdCB7IHJldHVybiBtX2lubGluZUNvbnRpbnVhdGlvbjsgfQotICAgIHZvaWQgc2V0SW5s
aW5lQ29udGludWF0aW9uKFJlbmRlcklubGluZSogYykgeyBtX2lubGluZUNvbnRpbnVhdGlvbiA9
IGM7IH0KLQogICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgYSBjb252ZW5pZW5jZSBoZWxwZXIgZm9y
IGNyZWF0aW5nIGFuIGFub255bW91cyBibG9jayB0aGF0IGluaGVyaXRzIGl0cwogICAgIC8vIHN0
eWxlIGZyb20gdGhpcyBSZW5kZXJCbG9jay4KICAgICBSZW5kZXJCbG9jayogY3JlYXRlQW5vbnlt
b3VzQmxvY2soYm9vbCBpc0ZsZXhpYmxlQm94ID0gZmFsc2UpIGNvbnN0OwogCisgICAgdmlydHVh
bCB2b2lkIHBhaW50KFBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5KTsKKyAgICB2aXJ0dWFsIHZv
aWQgcGFpbnRPYmplY3QoUGFpbnRJbmZvJiwgaW50IHR4LCBpbnQgdHkpOworCisgICAgYm9vbCBp
blJvb3RCbG9ja0NvbnRleHQoKSBjb25zdDsKKworICAgIHN0YXRpYyB2b2lkIGFwcGVuZFJ1bnNG
b3JPYmplY3QoaW50IHN0YXJ0LCBpbnQgZW5kLCBSZW5kZXJPYmplY3QqLCBJbmxpbmVCaWRpUmVz
b2x2ZXImKTsgICAgCisgICAgc3RhdGljIGJvb2wgcmVxdWlyZXNMaW5lQm94KGNvbnN0IElubGlu
ZUl0ZXJhdG9yJiwgYm9vbCBpc0xpbmVFbXB0eSA9IHRydWUsIGJvb2wgcHJldmlvdXNMaW5lQnJv
a2VDbGVhbmx5ID0gdHJ1ZSk7CisKIHByb3RlY3RlZDoKICAgICB2b2lkIG1vdmVDaGlsZFRvKFJl
bmRlck9iamVjdCogdG8sIFJlbmRlck9iamVjdENoaWxkTGlzdCogdG9DaGlsZExpc3QsIFJlbmRl
ck9iamVjdCogY2hpbGQpOwogICAgIHZvaWQgbW92ZUNoaWxkVG8oUmVuZGVyT2JqZWN0KiB0bywg
UmVuZGVyT2JqZWN0Q2hpbGRMaXN0KiB0b0NoaWxkTGlzdCwgUmVuZGVyT2JqZWN0KiBiZWZvcmVD
aGlsZCwgUmVuZGVyT2JqZWN0KiBjaGlsZCk7CkBAIC0xNjUsOSArMTY4LDYgQEAgcHJvdGVjdGVk
OgogCiAgICAgdm9pZCBsYXlvdXRQb3NpdGlvbmVkT2JqZWN0cyhib29sIHJlbGF5b3V0Q2hpbGRy
ZW4pOwogCi0gICAgdmlydHVhbCB2b2lkIHBhaW50KFBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5
KTsKLSAgICB2aXJ0dWFsIHZvaWQgcGFpbnRPYmplY3QoUGFpbnRJbmZvJiwgaW50IHR4LCBpbnQg
dHkpOwotCiAgICAgaW50IHJpZ2h0UmVsT2Zmc2V0KGludCB5LCBpbnQgZml4ZWRPZmZzZXQsIGJv
b2wgYXBwbHlUZXh0SW5kZW50ID0gdHJ1ZSwgaW50KiBoZWlnaHRSZW1haW5pbmcgPSAwKSBjb25z
dDsKICAgICBpbnQgbGVmdFJlbE9mZnNldChpbnQgeSwgaW50IGZpeGVkT2Zmc2V0LCBib29sIGFw
cGx5VGV4dEluZGVudCA9IHRydWUsIGludCogaGVpZ2h0UmVtYWluaW5nID0gMCkgY29uc3Q7CiAK
QEAgLTE4MCw4ICsxODAsNiBAQCBwcm90ZWN0ZWQ6CiAKICAgICB2aXJ0dWFsIHZvaWQgdXBkYXRl
Rmlyc3RMZXR0ZXIoKTsKIAotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVIaXRUZXN0UmVzdWx0KEhp
dFRlc3RSZXN1bHQmLCBjb25zdCBJbnRQb2ludCYpOwotCiAgICAgLy8gRGVsYXkgdXBkYXRlIHNj
cm9sbGJhciB1bnRpbCBmaW5pc2hEZWxheVJlcGFpbnQoKSB3aWxsIGJlCiAgICAgLy8gY2FsbGVk
LiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2hlbiBhIGZsZXhib3ggaXMgbGF5aW5nIG91dCBpdHMK
ICAgICAvLyBkZXNjZW5kYW50LiBJZiBtdWx0aXBsZSBjYWxscyBhcmUgbWFkZSB0byBzdGFydERl
bGF5UmVwYWludCgpLApAQCAtMjQ1LDcgKzI0Myw5IEBAIHByaXZhdGU6CiAgICAgICAgIGJvb2wg
ZXZlckhhZExheW91dDsKICAgICB9OwogCi0gICAgLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMn
IGltcGxlbWVudGF0aW9ucyBhcmUgaW4gUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcC4KKyAgICBj
bGFzcyBNYXJnaW5JbmZvOworCisgICAgLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMnIGltcGxl
bWVudGF0aW9ucyBhcmUgaW4gUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcC4gICAgCiAgICAgdm9p
ZCBiaWRpUmVvcmRlckxpbmUoSW5saW5lQmlkaVJlc29sdmVyJiwgY29uc3QgSW5saW5lSXRlcmF0
b3ImIGVuZCwgYm9vbCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHkpOwogICAgIFJvb3RJbmxpbmVC
b3gqIGRldGVybWluZVN0YXJ0UG9zaXRpb24oYm9vbCYgZmlyc3RMaW5lLCBib29sJiBmdWxsTGF5
b3V0LCBib29sJiBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHksCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBJbmxpbmVCaWRpUmVzb2x2ZXImLCBWZWN0b3I8RmxvYXRX
aXRoUmVjdD4mIGZsb2F0cywgdW5zaWduZWQmIG51bUNsZWFuRmxvYXRzKTsKQEAgLTI1OCw5ICsy
NTgsOSBAQCBwcml2YXRlOgogICAgIHZvaWQgc2tpcFRyYWlsaW5nV2hpdGVzcGFjZShJbmxpbmVJ
dGVyYXRvciYsIGJvb2wgaXNMaW5lRW1wdHksIGJvb2wgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5
KTsKICAgICBpbnQgc2tpcExlYWRpbmdXaGl0ZXNwYWNlKElubGluZUJpZGlSZXNvbHZlciYsIGJv
b2wgZmlyc3RMaW5lLCBib29sIGlzTGluZUVtcHR5LCBib29sIHByZXZpb3VzTGluZUJyb2tlQ2xl
YW5seSk7CiAgICAgdm9pZCBmaXRCZWxvd0Zsb2F0cyhpbnQgd2lkdGhUb0ZpdCwgYm9vbCBmaXJz
dExpbmUsIGludCYgYXZhaWxhYmxlV2lkdGgpOwotICAgIElubGluZUl0ZXJhdG9yIGZpbmROZXh0
TGluZUJyZWFrKElubGluZUJpZGlSZXNvbHZlciYsIGJvb2wgZmlyc3RMaW5lLCBib29sJiBpc0xp
bmVFbXB0eSwgYm9vbCYgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5LCBFQ2xlYXIqIGNsZWFyID0g
MCk7CisgICAgSW5saW5lSXRlcmF0b3IgZmluZE5leHRMaW5lQnJlYWsoSW5saW5lQmlkaVJlc29s
dmVyJiwgYm9vbCBmaXJzdExpbmUsIGJvb2wmIGlzTGluZUVtcHR5LCBib29sJiBwcmV2aW91c0xp
bmVCcm9rZUNsZWFubHksIE1hcmdpbkluZm8mLCBFQ2xlYXIqIGNsZWFyID0gMCk7CiAgICAgUm9v
dElubGluZUJveCogY29uc3RydWN0TGluZSh1bnNpZ25lZCBydW5Db3VudCwgQmlkaVJ1biogZmly
c3RSdW4sIEJpZGlSdW4qIGxhc3RSdW4sIGJvb2wgZmlyc3RMaW5lLCBib29sIGxhc3RMaW5lLCBS
ZW5kZXJPYmplY3QqIGVuZE9iamVjdCk7Ci0gICAgSW5saW5lRmxvd0JveCogY3JlYXRlTGluZUJv
eGVzKFJlbmRlck9iamVjdCosIGJvb2wgZmlyc3RMaW5lKTsKKyAgICBJbmxpbmVGbG93Qm94KiBj
cmVhdGVMaW5lQm94ZXMoUmVuZGVyT2JqZWN0KiwgYm9vbCBmaXJzdExpbmUsIFJlbmRlckJsb2Nr
KiBhbm9ueW1vdXNJbmxpbmVCbG9jayk7CiAgICAgdm9pZCBjb21wdXRlSG9yaXpvbnRhbFBvc2l0
aW9uc0ZvckxpbmUoUm9vdElubGluZUJveCosIGJvb2wgZmlyc3RMaW5lLCBCaWRpUnVuKiBmaXJz
dFJ1biwgQmlkaVJ1biogdHJhaWxpbmdTcGFjZVJ1biwgYm9vbCByZWFjaGVkRW5kKTsKICAgICB2
b2lkIGNvbXB1dGVWZXJ0aWNhbFBvc2l0aW9uc0ZvckxpbmUoUm9vdElubGluZUJveCosIEJpZGlS
dW4qKTsKICAgICB2b2lkIGRlbGV0ZUVsbGlwc2lzTGluZUJveGVzKCk7CkBAIC0zMTMsMTMgKzMx
Myw3IEBAIHByaXZhdGU6CiAgICAgLy8gT2J0YWlucyB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgYmxv
Y2sgKGluY2x1ZGluZyB0aGlzIGJsb2NrKSB0aGF0IGNvbnRyaWJ1dGVzIGEgZmlyc3QtbGluZSBz
dHlsZSB0byBvdXIgaW5saW5lCiAgICAgLy8gY2hpbGRyZW4uCiAgICAgdmlydHVhbCBSZW5kZXJC
bG9jayogZmlyc3RMaW5lQmxvY2soKSBjb25zdDsKLSAgICBib29sIGluUm9vdEJsb2NrQ29udGV4
dCgpIGNvbnN0OwotCi0gICAgdmlydHVhbCBJbnRSZWN0IHJlY3RXaXRoT3V0bGluZUZvclJlcGFp
bnQoUmVuZGVyQm94TW9kZWxPYmplY3QqIHJlcGFpbnRDb250YWluZXIsIGludCBvdXRsaW5lV2lk
dGgpOwotICAgIHZpcnR1YWwgUmVuZGVyU3R5bGUqIG91dGxpbmVTdHlsZUZvclJlcGFpbnQoKSBj
b25zdDsKICAgICAKLSAgICB2aXJ0dWFsIFJlbmRlck9iamVjdCogaG92ZXJBbmNlc3RvcigpIGNv
bnN0OwotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVEcmFnU3RhdGUoYm9vbCBkcmFnT24pOwogICAg
IHZpcnR1YWwgdm9pZCBjaGlsZEJlY2FtZU5vbklubGluZShSZW5kZXJPYmplY3QqIGNoaWxkKTsK
IAogICAgIHZpcnR1YWwgSW50UmVjdCBzZWxlY3Rpb25SZWN0Rm9yUmVwYWludChSZW5kZXJCb3hN
b2RlbE9iamVjdCogcmVwYWludENvbnRhaW5lciwgYm9vbCAvKmNsaXBUb1Zpc2libGVDb250ZW50
Ki8pCkBAIC0zMzksMTYgKzMzMywxMSBAQCBwcml2YXRlOgogICAgIGludCBsZWZ0U2VsZWN0aW9u
T2Zmc2V0KFJlbmRlckJsb2NrKiByb290QmxvY2ssIGludCB5KTsKICAgICBpbnQgcmlnaHRTZWxl
Y3Rpb25PZmZzZXQoUmVuZGVyQmxvY2sqIHJvb3RCbG9jaywgaW50IHkpOwogCi0gICAgdmlydHVh
bCB2b2lkIGFic29sdXRlUmVjdHMoVmVjdG9yPEludFJlY3Q+JiwgaW50IHR4LCBpbnQgdHkpOwot
ICAgIHZpcnR1YWwgdm9pZCBhYnNvbHV0ZVF1YWRzKFZlY3RvcjxGbG9hdFF1YWQ+Jik7Ci0KICAg
ICBpbnQgZGVzaXJlZENvbHVtbldpZHRoKCkgY29uc3Q7CiAgICAgdW5zaWduZWQgZGVzaXJlZENv
bHVtbkNvdW50KCkgY29uc3Q7CiAgICAgVmVjdG9yPEludFJlY3Q+KiBjb2x1bW5SZWN0cygpIGNv
bnN0OwogICAgIHZvaWQgc2V0RGVzaXJlZENvbHVtbkNvdW50QW5kV2lkdGgoaW50IGNvdW50LCBp
bnQgd2lkdGgpOwogICAgIGludCBjb2x1bW5HYXAoKSBjb25zdDsKLSAgICAKLSAgICB2b2lkIHBh
aW50Q29udGludWF0aW9uT3V0bGluZXMoUGFpbnRJbmZvJiwgaW50IHR4LCBpbnQgdHkpOwogCiAg
ICAgdmlydHVhbCBJbnRSZWN0IGxvY2FsQ2FyZXRSZWN0KElubGluZUJveCosIGludCBjYXJldE9m
ZnNldCwgaW50KiBleHRyYVdpZHRoVG9FbmRPZkxpbmUgPSAwKTsKIApAQCAtNDg0LDEyICs0NzMs
NiBAQCBwcml2YXRlOgogICAgIERlcHJlY2F0ZWRQdHJMaXN0PEZsb2F0aW5nT2JqZWN0PiogbV9m
bG9hdGluZ09iamVjdHM7CiAgICAgTGlzdEhhc2hTZXQ8UmVuZGVyQm94Kj4qIG1fcG9zaXRpb25l
ZE9iamVjdHM7CiAKLSAgICAvLyBBbiBpbmxpbmUgY2FuIGJlIHNwbGl0IHdpdGggYmxvY2tzIG9j
Y3VycmluZyBpbiBiZXR3ZWVuIHRoZSBpbmxpbmUgY29udGVudC4KLSAgICAvLyBXaGVuIHRoaXMg
b2NjdXJzIHdlIG5lZWQgYSBwb2ludGVyIHRvIG91ciBuZXh0IG9iamVjdC4gIFdlIGNhbiBiYXNp
Y2FsbHkgYmUKLSAgICAvLyBzcGxpdCBpbnRvIGEgc2VxdWVuY2Ugb2YgaW5saW5lcyBhbmQgYmxv
Y2tzLiAgVGhlIGNvbnRpbnVhdGlvbiB3aWxsIGVpdGhlciBiZQotICAgIC8vIGFuIGFub255bW91
cyBibG9jayAodGhhdCBob3VzZXMgb3RoZXIgYmxvY2tzKSBvciBpdCB3aWxsIGJlIGFuIGlubGlu
ZSBmbG93LgotICAgIFJlbmRlcklubGluZSogbV9pbmxpbmVDb250aW51YXRpb247Ci0KICAgICAv
LyBBbGxvY2F0ZWQgb25seSB3aGVuIHNvbWUgb2YgdGhlc2UgZmllbGRzIGhhdmUgbm9uLWRlZmF1
bHQgdmFsdWVzCiAgICAgc3RydWN0IE1heE1hcmdpbiA6IE5vbmNvcHlhYmxlIHsKICAgICAgICAg
TWF4TWFyZ2luKGNvbnN0IFJlbmRlckJsb2NrKiBvKSAKQEAgLTUxNywxMCArNTAwLDEyIEBAIHBy
aXZhdGU6CiAgICAgUmVuZGVyTGluZUJveExpc3QgbV9saW5lQm94ZXM7ICAgLy8gQWxsIG9mIHRo
ZSByb290IGxpbmUgYm94ZXMgY3JlYXRlZCBmb3IgdGhpcyBibG9jayBmbG93LiAgRm9yIGV4YW1w
bGUsIDxkaXY+SGVsbG88YnI+d29ybGQuPC9kaXY+IHdpbGwgaGF2ZSB0d28gdG90YWwgbGluZXMg
Zm9yIHRoZSA8ZGl2Pi4KIAogICAgIG11dGFibGUgaW50IG1fbGluZUhlaWdodDsKLSAgICAKKwog
ICAgIC8vIFJlbmRlclJ1YnlCYXNlIG9iamVjdHMgbmVlZCB0byBiZSBhYmxlIHRvIHNwbGl0IGFu
ZCBtZXJnZSwgbW92aW5nIHRoZWlyIGNoaWxkcmVuIGFyb3VuZAogICAgIC8vIChjYWxsaW5nIG1v
dmVDaGlsZFRvLCBtb3ZlQWxsQ2hpbGRyZW5UbywgYW5kIG1ha2VDaGlsZHJlbk5vbklubGluZSku
CiAgICAgZnJpZW5kIGNsYXNzIFJlbmRlclJ1YnlCYXNlOworICAgIAorICAgIGZyaWVuZCBjbGFz
cyBSb290SW5saW5lQm94OwogfTsKIAogaW5saW5lIFJlbmRlckJsb2NrKiB0b1JlbmRlckJsb2Nr
KFJlbmRlck9iamVjdCogb2JqZWN0KQpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxv
Y2tMaW5lTGF5b3V0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJC
bG9ja0xpbmVMYXlvdXQuY3BwCShyZXZpc2lvbiA1NDU2MSkKKysrIFdlYkNvcmUvcmVuZGVyaW5n
L1JlbmRlckJsb2NrTGluZUxheW91dC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI0LDYgKzI0LDcg
QEAKIAogI2luY2x1ZGUgIkJpZGlSZXNvbHZlci5oIgogI2luY2x1ZGUgIkNoYXJhY3Rlck5hbWVz
LmgiCisjaW5jbHVkZSAiSW5saW5lSXRlcmF0b3IuaCIKICNpbmNsdWRlICJJbmxpbmVUZXh0Qm94
LmgiCiAjaW5jbHVkZSAiTG9nZ2luZy5oIgogI2luY2x1ZGUgIlJlbmRlckFyZW5hLmgiCkBAIC00
NiwzNiArNDcsNiBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAvLyBXZSBkb24ndCBsZXQgb3VyIGxp
bmUgYm94IHRyZWUgZm9yIGEgc2luZ2xlIGxpbmUgZ2V0IGFueSBkZWVwZXIgdGhhbiB0aGlzLgog
Y29uc3QgdW5zaWduZWQgY01heExpbmVEZXB0aCA9IDIwMDsKIAotY2xhc3MgSW5saW5lSXRlcmF0
b3IgewotcHVibGljOgotICAgIElubGluZUl0ZXJhdG9yKCkKLSAgICAgICAgOiBibG9jaygwKQot
ICAgICAgICAsIG9iaigwKQotICAgICAgICAsIHBvcygwKQotICAgICAgICAsIG5leHRCcmVha2Fi
bGVQb3NpdGlvbigtMSkKLSAgICB7Ci0gICAgfQotCi0gICAgSW5saW5lSXRlcmF0b3IoUmVuZGVy
QmxvY2sqIGIsIFJlbmRlck9iamVjdCogbywgdW5zaWduZWQgcCkKLSAgICAgICAgOiBibG9jayhi
KQotICAgICAgICAsIG9iaihvKQotICAgICAgICAsIHBvcyhwKQotICAgICAgICAsIG5leHRCcmVh
a2FibGVQb3NpdGlvbigtMSkKLSAgICB7Ci0gICAgfQotCi0gICAgdm9pZCBpbmNyZW1lbnQoSW5s
aW5lQmlkaVJlc29sdmVyKiByZXNvbHZlciA9IDApOwotICAgIGJvb2wgYXRFbmQoKSBjb25zdDsK
LQotICAgIFVDaGFyIGN1cnJlbnQoKSBjb25zdDsKLSAgICBEaXJlY3Rpb24gZGlyZWN0aW9uKCkg
Y29uc3Q7Ci0KLSAgICBSZW5kZXJCbG9jayogYmxvY2s7Ci0gICAgUmVuZGVyT2JqZWN0KiBvYmo7
Ci0gICAgdW5zaWduZWQgcG9zOwotICAgIGludCBuZXh0QnJlYWthYmxlUG9zaXRpb247Ci19Owot
CiBzdGF0aWMgaW50IGdldEJvcmRlclBhZGRpbmdNYXJnaW4oUmVuZGVyQm94TW9kZWxPYmplY3Qq
IGNoaWxkLCBib29sIGVuZE9mSW5saW5lKQogewogICAgIGJvb2wgbGVmdFNpZGUgPSAoY2hpbGQt
PnN0eWxlKCktPmRpcmVjdGlvbigpID09IExUUikgPyAhZW5kT2ZJbmxpbmUgOiBlbmRPZklubGlu
ZTsKQEAgLTEwMCwyNDcgKzcxLDYgQEAgc3RhdGljIGludCBpbmxpbmVXaWR0aChSZW5kZXJPYmpl
Y3QqIGNoaQogICAgIHJldHVybiBleHRyYVdpZHRoOwogfQogCi1zdHJ1Y3QgQmlkaVJ1biA6IEJp
ZGlDaGFyYWN0ZXJSdW4gewotICAgIEJpZGlSdW4oaW50IHN0YXJ0LCBpbnQgc3RvcCwgUmVuZGVy
T2JqZWN0KiBvYmplY3QsIEJpZGlDb250ZXh0KiBjb250ZXh0LCBEaXJlY3Rpb24gZGlyKQotICAg
ICAgICA6IEJpZGlDaGFyYWN0ZXJSdW4oc3RhcnQsIHN0b3AsIGNvbnRleHQsIGRpcikKLSAgICAg
ICAgLCBtX29iamVjdChvYmplY3QpCi0gICAgICAgICwgbV9ib3goMCkKLSAgICB7Ci0gICAgfQot
Ci0gICAgdm9pZCBkZXN0cm95KCk7Ci0KLSAgICAvLyBPdmVybG9hZGVkIG5ldyBvcGVyYXRvci4K
LSAgICB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90LCBSZW5kZXJBcmVuYSopIHRocm93KCk7Ci0K
LSAgICAvLyBPdmVycmlkZGVuIHRvIHByZXZlbnQgdGhlIG5vcm1hbCBkZWxldGUgZnJvbSBiZWlu
ZyBjYWxsZWQuCi0gICAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCosIHNpemVfdCk7Ci0KLSAg
ICBCaWRpUnVuKiBuZXh0KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8QmlkaVJ1bio+KG1fbmV4dCk7
IH0KLQotcHJpdmF0ZToKLSAgICAvLyBUaGUgbm9ybWFsIG9wZXJhdG9yIG5ldyBpcyBkaXNhbGxv
d2VkLgotICAgIHZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3QpIHRocm93KCk7Ci0KLXB1YmxpYzoK
LSAgICBSZW5kZXJPYmplY3QqIG1fb2JqZWN0OwotICAgIElubGluZUJveCogbV9ib3g7Ci19Owot
Ci0jaWZuZGVmIE5ERUJVRwotc3RhdGljIFJlZkNvdW50ZWRMZWFrQ291bnRlciBiaWRpUnVuQ291
bnRlcigiQmlkaVJ1biIpOwotCi1zdGF0aWMgYm9vbCBpbkJpZGlSdW5EZXN0cm95OwotI2VuZGlm
Ci0KLXZvaWQgQmlkaVJ1bjo6ZGVzdHJveSgpCi17Ci0jaWZuZGVmIE5ERUJVRwotICAgIGluQmlk
aVJ1bkRlc3Ryb3kgPSB0cnVlOwotI2VuZGlmCi0gICAgUmVuZGVyQXJlbmEqIHJlbmRlckFyZW5h
ID0gbV9vYmplY3QtPnJlbmRlckFyZW5hKCk7Ci0gICAgZGVsZXRlIHRoaXM7Ci0jaWZuZGVmIE5E
RUJVRwotICAgIGluQmlkaVJ1bkRlc3Ryb3kgPSBmYWxzZTsKLSNlbmRpZgotCi0gICAgLy8gUmVj
b3ZlciB0aGUgc2l6ZSBsZWZ0IHRoZXJlIGZvciB1cyBieSBvcGVyYXRvciBkZWxldGUgYW5kIGZy
ZWUgdGhlIG1lbW9yeS4KLSAgICByZW5kZXJBcmVuYS0+ZnJlZSgqcmVpbnRlcnByZXRfY2FzdDxz
aXplX3QqPih0aGlzKSwgdGhpcyk7Ci19Ci0KLXZvaWQqIEJpZGlSdW46Om9wZXJhdG9yIG5ldyhz
aXplX3Qgc3osIFJlbmRlckFyZW5hKiByZW5kZXJBcmVuYSkgdGhyb3coKQotewotI2lmbmRlZiBO
REVCVUcKLSAgICBiaWRpUnVuQ291bnRlci5pbmNyZW1lbnQoKTsKLSNlbmRpZgotICAgIHJldHVy
biByZW5kZXJBcmVuYS0+YWxsb2NhdGUoc3opOwotfQotCi12b2lkIEJpZGlSdW46Om9wZXJhdG9y
IGRlbGV0ZSh2b2lkKiBwdHIsIHNpemVfdCBzeikKLXsKLSNpZm5kZWYgTkRFQlVHCi0gICAgYmlk
aVJ1bkNvdW50ZXIuZGVjcmVtZW50KCk7Ci0jZW5kaWYKLSAgICBBU1NFUlQoaW5CaWRpUnVuRGVz
dHJveSk7Ci0KLSAgICAvLyBTdGFzaCBzaXplIHdoZXJlIGRlc3Ryb3koKSBjYW4gZmluZCBpdC4K
LSAgICAqKHNpemVfdCopcHRyID0gc3o7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1pbmxpbmUg
Ym9vbCBvcGVyYXRvcj09KGNvbnN0IElubGluZUl0ZXJhdG9yJiBpdDEsIGNvbnN0IElubGluZUl0
ZXJhdG9yJiBpdDIpCi17Ci0gICAgcmV0dXJuIGl0MS5wb3MgPT0gaXQyLnBvcyAmJiBpdDEub2Jq
ID09IGl0Mi5vYmo7Ci19Ci0KLWlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgSW5saW5lSXRl
cmF0b3ImIGl0MSwgY29uc3QgSW5saW5lSXRlcmF0b3ImIGl0MikKLXsKLSAgICByZXR1cm4gaXQx
LnBvcyAhPSBpdDIucG9zIHx8IGl0MS5vYmogIT0gaXQyLm9iajsKLX0KLQotc3RhdGljIGlubGlu
ZSBSZW5kZXJPYmplY3QqIGJpZGlOZXh0KFJlbmRlckJsb2NrKiBibG9jaywgUmVuZGVyT2JqZWN0
KiBjdXJyZW50LCBJbmxpbmVCaWRpUmVzb2x2ZXIqIHJlc29sdmVyID0gMCwgYm9vbCBza2lwSW5s
aW5lcyA9IHRydWUsIGJvb2wqIGVuZE9mSW5saW5lUHRyID0gMCkKLXsKLSAgICBSZW5kZXJPYmpl
Y3QqIG5leHQgPSAwOwotICAgIGJvb2wgb2xkRW5kT2ZJbmxpbmUgPSBlbmRPZklubGluZVB0ciA/
ICplbmRPZklubGluZVB0ciA6IGZhbHNlOwotICAgIGJvb2wgZW5kT2ZJbmxpbmUgPSBmYWxzZTsK
LQotICAgIHdoaWxlIChjdXJyZW50KSB7Ci0gICAgICAgIG5leHQgPSAwOwotICAgICAgICBpZiAo
IW9sZEVuZE9mSW5saW5lICYmICFjdXJyZW50LT5pc0Zsb2F0aW5nKCkgJiYgIWN1cnJlbnQtPmlz
UmVwbGFjZWQoKSAmJiAhY3VycmVudC0+aXNQb3NpdGlvbmVkKCkgJiYgIWN1cnJlbnQtPmlzVGV4
dCgpKSB7Ci0gICAgICAgICAgICBuZXh0ID0gY3VycmVudC0+Zmlyc3RDaGlsZCgpOwotICAgICAg
ICAgICAgaWYgKG5leHQgJiYgcmVzb2x2ZXIgJiYgbmV4dC0+aXNSZW5kZXJJbmxpbmUoKSkgewot
ICAgICAgICAgICAgICAgIEVVbmljb2RlQmlkaSB1YiA9IG5leHQtPnN0eWxlKCktPnVuaWNvZGVC
aWRpKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHViICE9IFVCTm9ybWFsKSB7Ci0gICAgICAgICAg
ICAgICAgICAgIFRleHREaXJlY3Rpb24gZGlyID0gbmV4dC0+c3R5bGUoKS0+ZGlyZWN0aW9uKCk7
Ci0gICAgICAgICAgICAgICAgICAgIERpcmVjdGlvbiBkID0gKHViID09IEVtYmVkCi0gICAgICAg
ICAgICAgICAgICAgICAgICA/IChkaXIgPT0gUlRMID8gUmlnaHRUb0xlZnRFbWJlZGRpbmcgOiBM
ZWZ0VG9SaWdodEVtYmVkZGluZykKLSAgICAgICAgICAgICAgICAgICAgICAgIDogKGRpciA9PSBS
VEwgPyBSaWdodFRvTGVmdE92ZXJyaWRlIDogTGVmdFRvUmlnaHRPdmVycmlkZSkpOwotICAgICAg
ICAgICAgICAgICAgICByZXNvbHZlci0+ZW1iZWQoZCk7Ci0gICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFuZXh0KSB7Ci0gICAgICAgICAg
ICBpZiAoIXNraXBJbmxpbmVzICYmICFvbGRFbmRPZklubGluZSAmJiBjdXJyZW50LT5pc1JlbmRl
cklubGluZSgpKSB7Ci0gICAgICAgICAgICAgICAgbmV4dCA9IGN1cnJlbnQ7Ci0gICAgICAgICAg
ICAgICAgZW5kT2ZJbmxpbmUgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICAgICAgfQotCi0gICAgICAgICAgICB3aGlsZSAoY3VycmVudCAmJiBjdXJyZW50ICE9IGJsb2Nr
KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc29sdmVyICYmIGN1cnJlbnQtPmlzUmVuZGVySW5s
aW5lKCkgJiYgY3VycmVudC0+c3R5bGUoKS0+dW5pY29kZUJpZGkoKSAhPSBVQk5vcm1hbCkKLSAg
ICAgICAgICAgICAgICAgICAgcmVzb2x2ZXItPmVtYmVkKFBvcERpcmVjdGlvbmFsRm9ybWF0KTsK
LQotICAgICAgICAgICAgICAgIG5leHQgPSBjdXJyZW50LT5uZXh0U2libGluZygpOwotICAgICAg
ICAgICAgICAgIGlmIChuZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlciAm
JiBuZXh0LT5pc1JlbmRlcklubGluZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFVW5p
Y29kZUJpZGkgdWIgPSBuZXh0LT5zdHlsZSgpLT51bmljb2RlQmlkaSgpOwotICAgICAgICAgICAg
ICAgICAgICAgICAgaWYgKHViICE9IFVCTm9ybWFsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgVGV4dERpcmVjdGlvbiBkaXIgPSBuZXh0LT5zdHlsZSgpLT5kaXJlY3Rpb24oKTsKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBEaXJlY3Rpb24gZCA9ICh1YiA9PSBFbWJlZAotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChkaXIgPT0gUlRMID8gUmlnaHRUb0xlZnRF
bWJlZGRpbmc6IExlZnRUb1JpZ2h0RW1iZWRkaW5nKQotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICA6IChkaXIgPT0gUlRMID8gUmlnaHRUb0xlZnRPdmVycmlkZSA6IExlZnRUb1JpZ2h0
T3ZlcnJpZGUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlci0+ZW1iZWQo
ZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
ICAgIAotICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5wYXJlbnQoKTsKLSAgICAg
ICAgICAgICAgICBpZiAoIXNraXBJbmxpbmVzICYmIGN1cnJlbnQgJiYgY3VycmVudCAhPSBibG9j
ayAmJiBjdXJyZW50LT5pc1JlbmRlcklubGluZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5l
eHQgPSBjdXJyZW50OwotICAgICAgICAgICAgICAgICAgICBlbmRPZklubGluZSA9IHRydWU7Ci0g
ICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAg
IH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbmV4dCkKLSAgICAgICAgICAgIGJyZWFrOwot
Ci0gICAgICAgIGlmIChuZXh0LT5pc1RleHQoKSB8fCBuZXh0LT5pc0Zsb2F0aW5nKCkgfHwgbmV4
dC0+aXNSZXBsYWNlZCgpIHx8IG5leHQtPmlzUG9zaXRpb25lZCgpCi0gICAgICAgICAgICB8fCAo
KCFza2lwSW5saW5lcyB8fCAhbmV4dC0+Zmlyc3RDaGlsZCgpKSAvLyBBbHdheXMgcmV0dXJuIEVN
UFRZIGlubGluZXMuCi0gICAgICAgICAgICAgICAgJiYgbmV4dC0+aXNSZW5kZXJJbmxpbmUoKSkp
Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY3VycmVudCA9IG5leHQ7Ci0gICAgfQotCi0g
ICAgaWYgKGVuZE9mSW5saW5lUHRyKQotICAgICAgICAqZW5kT2ZJbmxpbmVQdHIgPSBlbmRPZklu
bGluZTsKLQotICAgIHJldHVybiBuZXh0OwotfQotCi1zdGF0aWMgUmVuZGVyT2JqZWN0KiBiaWRp
Rmlyc3QoUmVuZGVyQmxvY2sqIGJsb2NrLCBJbmxpbmVCaWRpUmVzb2x2ZXIqIHJlc29sdmVyLCBi
b29sIHNraXBJbmxpbmVzID0gdHJ1ZSkKLXsKLSAgICBpZiAoIWJsb2NrLT5maXJzdENoaWxkKCkp
Ci0gICAgICAgIHJldHVybiAwOwotICAgIAotICAgIFJlbmRlck9iamVjdCogbyA9IGJsb2NrLT5m
aXJzdENoaWxkKCk7Ci0gICAgaWYgKG8tPmlzUmVuZGVySW5saW5lKCkpIHsKLSAgICAgICAgaWYg
KHJlc29sdmVyKSB7Ci0gICAgICAgICAgICBFVW5pY29kZUJpZGkgdWIgPSBvLT5zdHlsZSgpLT51
bmljb2RlQmlkaSgpOwotICAgICAgICAgICAgaWYgKHViICE9IFVCTm9ybWFsKSB7Ci0gICAgICAg
ICAgICAgICAgVGV4dERpcmVjdGlvbiBkaXIgPSBvLT5zdHlsZSgpLT5kaXJlY3Rpb24oKTsKLSAg
ICAgICAgICAgICAgICBEaXJlY3Rpb24gZCA9ICh1YiA9PSBFbWJlZAotICAgICAgICAgICAgICAg
ICAgICA/IChkaXIgPT0gUlRMID8gUmlnaHRUb0xlZnRFbWJlZGRpbmcgOiBMZWZ0VG9SaWdodEVt
YmVkZGluZykKLSAgICAgICAgICAgICAgICAgICAgOiAoZGlyID09IFJUTCA/IFJpZ2h0VG9MZWZ0
T3ZlcnJpZGUgOiBMZWZ0VG9SaWdodE92ZXJyaWRlKSk7Ci0gICAgICAgICAgICAgICAgcmVzb2x2
ZXItPmVtYmVkKGQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChza2lw
SW5saW5lcyAmJiBvLT5maXJzdENoaWxkKCkpCi0gICAgICAgICAgICBvID0gYmlkaU5leHQoYmxv
Y2ssIG8sIHJlc29sdmVyLCBza2lwSW5saW5lcyk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAg
ICAgLy8gTmV2ZXIgc2tpcCBlbXB0eSBpbmxpbmVzLgotICAgICAgICAgICAgaWYgKHJlc29sdmVy
KQotICAgICAgICAgICAgICAgIHJlc29sdmVyLT5jb21taXRFeHBsaWNpdEVtYmVkZGluZygpOwot
ICAgICAgICAgICAgcmV0dXJuIG87IAotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG8gJiYg
IW8tPmlzVGV4dCgpICYmICFvLT5pc1JlcGxhY2VkKCkgJiYgIW8tPmlzRmxvYXRpbmcoKSAmJiAh
by0+aXNQb3NpdGlvbmVkKCkpCi0gICAgICAgIG8gPSBiaWRpTmV4dChibG9jaywgbywgcmVzb2x2
ZXIsIHNraXBJbmxpbmVzKTsKLQotICAgIGlmIChyZXNvbHZlcikKLSAgICAgICAgcmVzb2x2ZXIt
PmNvbW1pdEV4cGxpY2l0RW1iZWRkaW5nKCk7Ci0gICAgcmV0dXJuIG87Ci19Ci0KLWlubGluZSB2
b2lkIElubGluZUl0ZXJhdG9yOjppbmNyZW1lbnQoSW5saW5lQmlkaVJlc29sdmVyKiByZXNvbHZl
cikKLXsKLSAgICBpZiAoIW9iaikKLSAgICAgICAgcmV0dXJuOwotICAgIGlmIChvYmotPmlzVGV4
dCgpKSB7Ci0gICAgICAgIHBvcysrOwotICAgICAgICBpZiAocG9zID49IHRvUmVuZGVyVGV4dChv
YmopLT50ZXh0TGVuZ3RoKCkpIHsKLSAgICAgICAgICAgIG9iaiA9IGJpZGlOZXh0KGJsb2NrLCBv
YmosIHJlc29sdmVyKTsKLSAgICAgICAgICAgIHBvcyA9IDA7Ci0gICAgICAgICAgICBuZXh0QnJl
YWthYmxlUG9zaXRpb24gPSAtMTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIG9i
aiA9IGJpZGlOZXh0KGJsb2NrLCBvYmosIHJlc29sdmVyKTsKLSAgICAgICAgcG9zID0gMDsKLSAg
ICAgICAgbmV4dEJyZWFrYWJsZVBvc2l0aW9uID0gLTE7Ci0gICAgfQotfQotCi10ZW1wbGF0ZTw+
Ci1pbmxpbmUgdm9pZCBJbmxpbmVCaWRpUmVzb2x2ZXI6OmluY3JlbWVudCgpCi17Ci0gICAgY3Vy
cmVudC5pbmNyZW1lbnQodGhpcyk7Ci19Ci0KLWlubGluZSBib29sIElubGluZUl0ZXJhdG9yOjph
dEVuZCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICFvYmo7Ci19Ci0KLWlubGluZSBVQ2hhciBJbmxp
bmVJdGVyYXRvcjo6Y3VycmVudCgpIGNvbnN0Ci17Ci0gICAgaWYgKCFvYmogfHwgIW9iai0+aXNU
ZXh0KCkpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgUmVuZGVyVGV4dCogdGV4dCA9IHRvUmVu
ZGVyVGV4dChvYmopOwotICAgIGlmIChwb3MgPj0gdGV4dC0+dGV4dExlbmd0aCgpKQotICAgICAg
ICByZXR1cm4gMDsKLQotICAgIHJldHVybiB0ZXh0LT5jaGFyYWN0ZXJzKClbcG9zXTsKLX0KLQot
QUxXQVlTX0lOTElORSBEaXJlY3Rpb24gSW5saW5lSXRlcmF0b3I6OmRpcmVjdGlvbigpIGNvbnN0
Ci17Ci0gICAgaWYgKFVDaGFyIGMgPSBjdXJyZW50KCkpCi0gICAgICAgIHJldHVybiBVbmljb2Rl
OjpkaXJlY3Rpb24oYyk7Ci0KLSAgICBpZiAob2JqICYmIG9iai0+aXNMaXN0TWFya2VyKCkpCi0g
ICAgICAgIHJldHVybiBvYmotPnN0eWxlKCktPmRpcmVjdGlvbigpID09IExUUiA/IExlZnRUb1Jp
Z2h0IDogUmlnaHRUb0xlZnQ7Ci0KLSAgICByZXR1cm4gT3RoZXJOZXV0cmFsOwotfQotCi0vLyAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KIHN0YXRpYyB2b2lkIGNo
b3BNaWRwb2ludHNBdChMaW5lTWlkcG9pbnRTdGF0ZSYgbGluZU1pZHBvaW50U3RhdGUsIFJlbmRl
ck9iamVjdCogb2JqLCB1bnNpZ25lZCBwb3MpCiB7CiAgICAgaWYgKCFsaW5lTWlkcG9pbnRTdGF0
ZS5udW1NaWRwb2ludHMpCkBAIC0zOTgsNyArMTI4LDcgQEAgc3RhdGljIHZvaWQgYWRkTWlkcG9p
bnQoTGluZU1pZHBvaW50U3RhdAogICAgIG1pZHBvaW50c1tsaW5lTWlkcG9pbnRTdGF0ZS5udW1N
aWRwb2ludHMrK10gPSBtaWRwb2ludDsKIH0KIAotc3RhdGljIHZvaWQgYXBwZW5kUnVuc0Zvck9i
amVjdChpbnQgc3RhcnQsIGludCBlbmQsIFJlbmRlck9iamVjdCogb2JqLCBJbmxpbmVCaWRpUmVz
b2x2ZXImIHJlc29sdmVyKQordm9pZCBSZW5kZXJCbG9jazo6YXBwZW5kUnVuc0Zvck9iamVjdChp
bnQgc3RhcnQsIGludCBlbmQsIFJlbmRlck9iamVjdCogb2JqLCBJbmxpbmVCaWRpUmVzb2x2ZXIm
IHJlc29sdmVyKQogewogICAgIGlmIChzdGFydCA+IGVuZCB8fCBvYmotPmlzRmxvYXRpbmcoKSB8
fAogICAgICAgICAob2JqLT5pc1Bvc2l0aW9uZWQoKSAmJiAhb2JqLT5zdHlsZSgpLT5oYXNTdGF0
aWNYKCkgJiYgIW9iai0+c3R5bGUoKS0+aGFzU3RhdGljWSgpICYmICFvYmotPmNvbnRhaW5lcigp
LT5pc1JlbmRlcklubGluZSgpKSkKQEAgLTQ0MSw0MCArMTcxLDEwIEBAIHN0YXRpYyB2b2lkIGFw
cGVuZFJ1bnNGb3JPYmplY3QoaW50IHN0YXIKICAgICB9CiB9CiAKLXRlbXBsYXRlIDw+Ci12b2lk
IElubGluZUJpZGlSZXNvbHZlcjo6YXBwZW5kUnVuKCkKLXsKLSAgICBpZiAoIWVtcHR5UnVuICYm
ICFlb3IuYXRFbmQoKSkgewotICAgICAgICBpbnQgc3RhcnQgPSBzb3IucG9zOwotICAgICAgICBS
ZW5kZXJPYmplY3QgKm9iaiA9IHNvci5vYmo7Ci0gICAgICAgIHdoaWxlIChvYmogJiYgb2JqICE9
IGVvci5vYmogJiYgb2JqICE9IGVuZE9mTGluZS5vYmopIHsKLSAgICAgICAgICAgIGFwcGVuZFJ1
bnNGb3JPYmplY3Qoc3RhcnQsIG9iai0+bGVuZ3RoKCksIG9iaiwgKnRoaXMpOyAgICAgICAgCi0g
ICAgICAgICAgICBzdGFydCA9IDA7Ci0gICAgICAgICAgICBvYmogPSBiaWRpTmV4dChzb3IuYmxv
Y2ssIG9iaik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9iaikgewotICAgICAgICAgICAgdW5z
aWduZWQgcG9zID0gb2JqID09IGVvci5vYmogPyBlb3IucG9zIDogVUlOVF9NQVg7Ci0gICAgICAg
ICAgICBpZiAob2JqID09IGVuZE9mTGluZS5vYmogJiYgZW5kT2ZMaW5lLnBvcyA8PSBwb3MpIHsK
LSAgICAgICAgICAgICAgICByZWFjaGVkRW5kT2ZMaW5lID0gdHJ1ZTsKLSAgICAgICAgICAgICAg
ICBwb3MgPSBlbmRPZkxpbmUucG9zOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSXQn
cyBPSyB0byBhZGQgcnVucyBmb3IgemVyby1sZW5ndGggUmVuZGVyT2JqZWN0cywganVzdCBkb24n
dCBtYWtlIHRoZSBydW4gbGFyZ2VyIHRoYW4gaXQgc2hvdWxkIGJlCi0gICAgICAgICAgICBpbnQg
ZW5kID0gb2JqLT5sZW5ndGgoKSA/IHBvcysxIDogMDsKLSAgICAgICAgICAgIGFwcGVuZFJ1bnNG
b3JPYmplY3Qoc3RhcnQsIGVuZCwgb2JqLCAqdGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0g
ICAgICAgIGVvci5pbmNyZW1lbnQoKTsKLSAgICAgICAgc29yID0gZW9yOwotICAgIH0KLQotICAg
IG1fZGlyZWN0aW9uID0gT3RoZXJOZXV0cmFsOwotICAgIG1fc3RhdHVzLmVvciA9IE90aGVyTmV1
dHJhbDsKLX0KLQotc3RhdGljIGlubGluZSBJbmxpbmVCb3gqIGNyZWF0ZUlubGluZUJveEZvclJl
bmRlcmVyKFJlbmRlck9iamVjdCogb2JqLCBib29sIGlzUm9vdExpbmVCb3gsIGJvb2wgaXNPbmx5
UnVuID0gZmFsc2UpCitzdGF0aWMgaW5saW5lIElubGluZUJveCogY3JlYXRlSW5saW5lQm94Rm9y
UmVuZGVyZXIoUmVuZGVyT2JqZWN0KiBvYmosIGJvb2wgaXNSb290TGluZUJveCwgYm9vbCBpc09u
bHlSdW4sIFJlbmRlckJsb2NrKiBhbm9ueW1vdXNJbmxpbmVCbG9jaykKIHsKICAgICBpZiAoaXNS
b290TGluZUJveCkKLSAgICAgICAgcmV0dXJuIHRvUmVuZGVyQmxvY2sob2JqKS0+Y3JlYXRlQW5k
QXBwZW5kUm9vdElubGluZUJveCgpOworICAgICAgICByZXR1cm4gdG9SZW5kZXJCbG9jayhvYmop
LT5jcmVhdGVBbmRBcHBlbmRSb290SW5saW5lQm94KGFub255bW91c0lubGluZUJsb2NrKTsKICAg
ICAKICAgICBpZiAob2JqLT5pc1RleHQoKSkgewogICAgICAgICBJbmxpbmVUZXh0Qm94KiB0ZXh0
Qm94ID0gdG9SZW5kZXJUZXh0KG9iaiktPmNyZWF0ZUlubGluZVRleHRCb3goKTsKQEAgLTUwMSw3
ICsyMDEsMTggQEAgc3RhdGljIGlubGluZSB2b2lkIGRpcnR5TGluZUJveGVzRm9yUmVuZAogICAg
ICAgICB0b1JlbmRlcklubGluZShvKS0+ZGlydHlMaW5lQm94ZXMoZnVsbExheW91dCk7CiB9CiAK
LUlubGluZUZsb3dCb3gqIFJlbmRlckJsb2NrOjpjcmVhdGVMaW5lQm94ZXMoUmVuZGVyT2JqZWN0
KiBvYmosIGJvb2wgZmlyc3RMaW5lKQorc3RhdGljIGlubGluZSBib29sIG5lZWRzTGluZUJveChS
ZW5kZXJJbmxpbmUqIGlubGluZUZsb3csIGJvb2wgaXNBbm9ueW1vdXNJbmxpbmVCbG9jaykKK3sK
KyAgICAvLyBGSVhNRTogSW1wbGVtZW50IGxpbmUgYm94IGN1bGxpbmcgYW5kIGN1dCBvdXQgYSBi
dW5jaCBvZiBpbnRlcm1lZGlhdGUgbGluZSBib3hlcyBieSBjb21wYXJpbmcgc3R5bGUgaW5mb3Jt
YXRpb24KKyAgICAvLyB3aXRoIHBhcmVudHMsIGV0Yy4gdG8gbWFrZSBzdXJlIGl0J3MgcG9zc2li
bGUgdG8gb21pdCB0aGUgYm94IGZvciB0aGUgbGluZS4gCisgICAgaWYgKCFpc0Fub255bW91c0lu
bGluZUJsb2NrIHx8ICFpbmxpbmVGbG93KQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAKKyAg
ICAvLyBJZiB3ZSBoYXZlIGFuIG91dGxpbmUgb3IgYSBzZWxmLXBhaW50aW5nIGxheWVyLCB0aGVu
IHdlIG5lZWQgdG8gY3JlYXRlIHRoZSBpbnRlcm1lZGlhdGUgbGluZSBib3guCisgICAgcmV0dXJu
IGlubGluZUZsb3ctPmhhc091dGxpbmUoKSB8fCBpbmxpbmVGbG93LT5oYXNTZWxmUGFpbnRpbmdM
YXllcigpOworfQorCitJbmxpbmVGbG93Qm94KiBSZW5kZXJCbG9jazo6Y3JlYXRlTGluZUJveGVz
KFJlbmRlck9iamVjdCogb2JqLCBib29sIGZpcnN0TGluZSwgUmVuZGVyQmxvY2sqIGFub255bW91
c0lubGluZUJsb2NrKQogewogICAgIC8vIFNlZSBpZiB3ZSBoYXZlIGFuIHVuY29uc3RydWN0ZWQg
bGluZSBib3ggZm9yIHRoaXMgb2JqZWN0IHRoYXQgaXMgYWxzbwogICAgIC8vIHRoZSBsYXN0IGl0
ZW0gb24gdGhlIGxpbmUuCkBAIC01MTIsNiArMjIzLDggQEAgSW5saW5lRmxvd0JveCogUmVuZGVy
QmxvY2s6OmNyZWF0ZUxpbmVCbwogICAgIGRvIHsKICAgICAgICAgQVNTRVJUKG9iai0+aXNSZW5k
ZXJJbmxpbmUoKSB8fCBvYmogPT0gdGhpcyk7CiAgICAgICAgIAorICAgICAgICBSZW5kZXJJbmxp
bmUqIGlubGluZU9iaiA9IChvYmogIT0gdGhpcykgPyB0b1JlbmRlcklubGluZShvYmopIDogMDsK
KwogICAgICAgICAvLyBHZXQgdGhlIGxhc3QgYm94IHdlIG1hZGUgZm9yIHRoaXMgcmVuZGVyIG9i
amVjdC4KICAgICAgICAgcGFyZW50Qm94ID0gb2JqLT5pc1JlbmRlcklubGluZSgpID8gdG9SZW5k
ZXJJbmxpbmUob2JqKS0+bGFzdExpbmVCb3goKSA6IHRvUmVuZGVyQmxvY2sob2JqKS0+bGFzdExp
bmVCb3goKTsKIApAQCAtNTIwLDMwICsyMzMsMzQgQEAgSW5saW5lRmxvd0JveCogUmVuZGVyQmxv
Y2s6OmNyZWF0ZUxpbmVCbwogICAgICAgICAvLyBzb21ldGhpbmcgZm9sbG93aW5nIGl0IG9uIHRo
ZSBsaW5lLCB0aGVuIHdlIGtub3cgd2UgaGF2ZSB0byBtYWtlIGEgbmV3IGJveAogICAgICAgICAv
LyBhcyB3ZWxsLiAgSW4gdGhpcyBzaXR1YXRpb24gb3VyIGlubGluZSBoYXMgYWN0dWFsbHkgYmVl
biBzcGxpdCBpbiB0d28gb24KICAgICAgICAgLy8gdGhlIHNhbWUgbGluZSAodGhpcyBjYW4gaGFw
cGVuIHdpdGggdmVyeSBmYW5jeSBsYW5ndWFnZSBtaXh0dXJlcykuCisgICAgICAgIGJvb2wgYWxs
b3dlZFRvQ29uc3RydWN0TmV3Qm94ID0gbmVlZHNMaW5lQm94KGlubGluZU9iaiwgYW5vbnltb3Vz
SW5saW5lQmxvY2spOworICAgICAgICBib29sIGNhblVzZUV4aXN0aW5nUGFyZW50Qm94ID0gcGFy
ZW50Qm94ICYmICFwYXJlbnRCb3gtPmlzQ29uc3RydWN0ZWQoKSAmJiAhcGFyZW50Qm94LT5uZXh0
T25MaW5lKCk7CiAgICAgICAgIGJvb2wgY29uc3RydWN0ZWROZXdCb3ggPSBmYWxzZTsKLSAgICAg
ICAgaWYgKCFwYXJlbnRCb3ggfHwgcGFyZW50Qm94LT5pc0NvbnN0cnVjdGVkKCkgfHwgcGFyZW50
Qm94LT5uZXh0T25MaW5lKCkpIHsKKyAgICAgICAgaWYgKGFsbG93ZWRUb0NvbnN0cnVjdE5ld0Jv
eCAmJiAhY2FuVXNlRXhpc3RpbmdQYXJlbnRCb3gpIHsKICAgICAgICAgICAgIC8vIFdlIG5lZWQg
dG8gbWFrZSBhIG5ldyBib3ggZm9yIHRoaXMgcmVuZGVyIG9iamVjdC4gIE9uY2UKICAgICAgICAg
ICAgIC8vIG1hZGUsIHdlIG5lZWQgdG8gcGxhY2UgaXQgYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVu
dCBsaW5lLgotICAgICAgICAgICAgSW5saW5lQm94KiBuZXdCb3ggPSBjcmVhdGVJbmxpbmVCb3hG
b3JSZW5kZXJlcihvYmosIG9iaiA9PSB0aGlzKTsKKyAgICAgICAgICAgIElubGluZUJveCogbmV3
Qm94ID0gY3JlYXRlSW5saW5lQm94Rm9yUmVuZGVyZXIob2JqLCBvYmogPT0gdGhpcywgZmFsc2Us
IGFub255bW91c0lubGluZUJsb2NrKTsKICAgICAgICAgICAgIEFTU0VSVChuZXdCb3gtPmlzSW5s
aW5lRmxvd0JveCgpKTsKICAgICAgICAgICAgIHBhcmVudEJveCA9IHN0YXRpY19jYXN0PElubGlu
ZUZsb3dCb3gqPihuZXdCb3gpOwogICAgICAgICAgICAgcGFyZW50Qm94LT5zZXRGaXJzdExpbmVT
dHlsZUJpdChmaXJzdExpbmUpOwogICAgICAgICAgICAgY29uc3RydWN0ZWROZXdCb3ggPSB0cnVl
OwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCFyZXN1bHQpCi0gICAgICAgICAgICByZXN1bHQg
PSBwYXJlbnRCb3g7Ci0KLSAgICAgICAgLy8gSWYgd2UgaGF2ZSBoaXQgdGhlIGJsb2NrIGl0c2Vs
ZiwgdGhlbiB8Ym94fCByZXByZXNlbnRzIHRoZSByb290Ci0gICAgICAgIC8vIGlubGluZSBib3gg
Zm9yIHRoZSBsaW5lLCBhbmQgaXQgZG9lc24ndCBoYXZlIHRvIGJlIGFwcGVuZGVkIHRvIGFueSBw
YXJlbnQKLSAgICAgICAgLy8gaW5saW5lLgotICAgICAgICBpZiAoY2hpbGRCb3gpCi0gICAgICAg
ICAgICBwYXJlbnRCb3gtPmFkZFRvTGluZShjaGlsZEJveCk7Ci0KLSAgICAgICAgaWYgKCFjb25z
dHJ1Y3RlZE5ld0JveCB8fCBvYmogPT0gdGhpcykKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAg
ICAgIGNoaWxkQm94ID0gcGFyZW50Qm94OyAgICAgICAgCisgICAgICAgIGlmIChjb25zdHJ1Y3Rl
ZE5ld0JveCB8fCBjYW5Vc2VFeGlzdGluZ1BhcmVudEJveCkgeworICAgICAgICAgICAgaWYgKCFy
ZXN1bHQpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gcGFyZW50Qm94OyAKKyAgICAgICAgICAg
ICAgICAKKyAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgaGl0IHRoZSBibG9jayBpdHNlbGYsIHRo
ZW4gfGJveHwgcmVwcmVzZW50cyB0aGUgcm9vdAorICAgICAgICAgICAgLy8gaW5saW5lIGJveCBm
b3IgdGhlIGxpbmUsIGFuZCBpdCBkb2Vzbid0IGhhdmUgdG8gYmUgYXBwZW5kZWQgdG8gYW55IHBh
cmVudAorICAgICAgICAgICAgLy8gaW5saW5lLgorICAgICAgICAgICAgaWYgKGNoaWxkQm94KQor
ICAgICAgICAgICAgICAgIHBhcmVudEJveC0+YWRkVG9MaW5lKGNoaWxkQm94KTsKKyAgICAgICAg
ICAgICAgICAKKyAgICAgICAgICAgIGlmICghY29uc3RydWN0ZWROZXdCb3ggfHwgb2JqID09IHRo
aXMpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgCisgICAgICAgICAgICBjaGlsZEJveCA9
IHBhcmVudEJveDsKKyAgICAgICAgfQogCiAgICAgICAgIC8vIElmIHdlJ3ZlIGV4Y2VlZGVkIG91
ciBsaW5lIGRlcHRoLCB0aGVuIGp1bXAgc3RyYWlnaHQgdG8gdGhlIHJvb3QgYW5kIHNraXAgYWxs
IHRoZSByZW1haW5pbmcKICAgICAgICAgLy8gaW50ZXJtZWRpYXRlIGlubGluZSBmbG93cy4KQEAg
LTU2NSwxOSArMjgyLDIzIEBAIFJvb3RJbmxpbmVCb3gqIFJlbmRlckJsb2NrOjpjb25zdHJ1Y3RM
aW4KICAgICAgICAgaWYgKHJ1bkNvdW50ID09IDIgJiYgIXItPm1fb2JqZWN0LT5pc0xpc3RNYXJr
ZXIoKSkKICAgICAgICAgICAgIGlzT25seVJ1biA9ICgoc3R5bGUoKS0+ZGlyZWN0aW9uKCkgPT0g
UlRMKSA/IGxhc3RSdW4gOiBmaXJzdFJ1biktPm1fb2JqZWN0LT5pc0xpc3RNYXJrZXIoKTsKIAot
ICAgICAgICBJbmxpbmVCb3gqIGJveCA9IGNyZWF0ZUlubGluZUJveEZvclJlbmRlcmVyKHItPm1f
b2JqZWN0LCBmYWxzZSwgaXNPbmx5UnVuKTsKKyAgICAgICAgUmVuZGVyQmxvY2sqIGFub255bW91
c0lubGluZUJsb2NrID0gci0+bV9vYmplY3QtPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSA/IHRv
UmVuZGVyQmxvY2soci0+bV9vYmplY3QpIDogMDsKKworICAgICAgICBJbmxpbmVCb3gqIGJveCA9
IGNyZWF0ZUlubGluZUJveEZvclJlbmRlcmVyKHItPm1fb2JqZWN0LCBmYWxzZSwgaXNPbmx5UnVu
LCBhbm9ueW1vdXNJbmxpbmVCbG9jayk7CiAgICAgICAgIHItPm1fYm94ID0gYm94OwogCiAgICAg
ICAgIEFTU0VSVChib3gpOwogICAgICAgICBpZiAoIWJveCkKICAgICAgICAgICAgIGNvbnRpbnVl
OwogCisgICAgICAgIFJlbmRlck9iamVjdCogYW5jZXN0b3JSZW5kZXJlciA9IHItPm1fb2JqZWN0
LT5wYXJlbnQoKTsKKyAKICAgICAgICAgLy8gSWYgd2UgaGF2ZSBubyBwYXJlbnQgYm94IHlldCwg
b3IgaWYgdGhlIHJ1biBpcyBub3Qgc2ltcGx5IGEgc2libGluZywKICAgICAgICAgLy8gdGhlbiB3
ZSBuZWVkIHRvIGNvbnN0cnVjdCBpbmxpbmUgYm94ZXMgYXMgbmVjZXNzYXJ5IHRvIHByb3Blcmx5
IGVuY2xvc2UgdGhlCiAgICAgICAgIC8vIHJ1bidzIGlubGluZSBib3guCi0gICAgICAgIGlmICgh
cGFyZW50Qm94IHx8IHBhcmVudEJveC0+cmVuZGVyZXIoKSAhPSByLT5tX29iamVjdC0+cGFyZW50
KCkpCisgICAgICAgIGlmICghcGFyZW50Qm94IHx8IHBhcmVudEJveC0+cmVuZGVyZXIoKSAhPSBh
bmNlc3RvclJlbmRlcmVyKQogICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyBpbmxpbmUgYm94ZXMg
YWxsIHRoZSB3YXkgYmFjayB0byB0aGUgYXBwcm9wcmlhdGUgaW5zZXJ0aW9uIHBvaW50LgotICAg
ICAgICAgICAgcGFyZW50Qm94ID0gY3JlYXRlTGluZUJveGVzKHItPm1fb2JqZWN0LT5wYXJlbnQo
KSwgZmlyc3RMaW5lKTsKKyAgICAgICAgICAgIHBhcmVudEJveCA9IGNyZWF0ZUxpbmVCb3hlcyhh
bmNlc3RvclJlbmRlcmVyLCBmaXJzdExpbmUsIGFub255bW91c0lubGluZUJsb2NrKTsKIAogICAg
ICAgICAvLyBBcHBlbmQgdGhlIGlubGluZSBib3ggdG8gdGhpcyBsaW5lLgogICAgICAgICBwYXJl
bnRCb3gtPmFkZFRvTGluZShib3gpOwpAQCAtNjE5LDYgKzM0MCw4IEBAIHZvaWQgUmVuZGVyQmxv
Y2s6OmNvbXB1dGVIb3Jpem9udGFsUG9zaXQKICAgICB1bnNpZ25lZCBudW1TcGFjZXMgPSAwOwog
ICAgIEVUZXh0QWxpZ24gdGV4dEFsaWduID0gc3R5bGUoKS0+dGV4dEFsaWduKCk7CiAKKyAgICBp
bnQgeCA9IGxlZnRPZmZzZXQoaGVpZ2h0KCksIGZpcnN0TGluZSk7CisKICAgICBmb3IgKEJpZGlS
dW4qIHIgPSBmaXJzdFJ1bjsgcjsgciA9IHItPm5leHQoKSkgewogICAgICAgICBpZiAoIXItPm1f
Ym94IHx8IHItPm1fb2JqZWN0LT5pc1Bvc2l0aW9uZWQoKSB8fCByLT5tX2JveC0+aXNMaW5lQnJl
YWsoKSkKICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBQb3NpdGlvbmVkIG9iamVjdHMgYXJlIG9u
bHkgcGFydGljaXBhdGluZyB0byBmaWd1cmUgb3V0IHRoZWlyCkBAIC02NTYsNiArMzc5LDEyIEBA
IHZvaWQgUmVuZGVyQmxvY2s6OmNvbXB1dGVIb3Jpem9udGFsUG9zaXQKICAgICAgICAgICAgIHJl
bmRlckJveC0+Y2FsY1dpZHRoKCk7CiAgICAgICAgICAgICByLT5tX2JveC0+c2V0V2lkdGgocmVu
ZGVyQm94LT53aWR0aCgpKTsKICAgICAgICAgICAgIHRvdFdpZHRoICs9IHJlbmRlckJveC0+bWFy
Z2luTGVmdCgpICsgcmVuZGVyQm94LT5tYXJnaW5SaWdodCgpOworICAgICAgICAgICAgCisgICAg
ICAgICAgICBpZiAoci0+bV9vYmplY3QtPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkgeworICAg
ICAgICAgICAgICAgIC8vIEFsbG93IHRoZSBmdWxsIGF2YWlsYWJsZSB3aWR0aCB0byBiZSB1c2Vk
LCBzaW5jZSBmbG9hdHMgd2lsbCBpbnRydWRlIGludG8gb3VyIHNwYWNlLgorICAgICAgICAgICAg
ICAgIGF2YWlsYWJsZVdpZHRoID0gcmlnaHRPZmZzZXQoKSAtIGxlZnRPZmZzZXQoKTsKKyAgICAg
ICAgICAgICAgICB4ID0gbGVmdE9mZnNldCgpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAK
ICAgICAgICAgdG90V2lkdGggKz0gci0+bV9ib3gtPndpZHRoKCk7CkBAIC02NjUsNyArMzk0LDYg
QEAgdm9pZCBSZW5kZXJCbG9jazo6Y29tcHV0ZUhvcml6b250YWxQb3NpdAogICAgIC8vIHdlIG5v
dyBleGFtaW5lIG91ciB0ZXh0LWFsaWduIHByb3BlcnR5IGluIG9yZGVyIHRvIGRldGVybWluZSB3
aGVyZSB0byBwb3NpdGlvbiB0aGUKICAgICAvLyBvYmplY3RzIGhvcml6b250YWxseS4gIFRoZSB0
b3RhbCB3aWR0aCBvZiB0aGUgbGluZSBjYW4gYmUgaW5jcmVhc2VkIGlmIHdlIGVuZCB1cAogICAg
IC8vIGp1c3RpZnlpbmcgdGV4dC4KLSAgICBpbnQgeCA9IGxlZnRPZmZzZXQoaGVpZ2h0KCksIGZp
cnN0TGluZSk7CiAgICAgc3dpdGNoICh0ZXh0QWxpZ24pIHsKICAgICAgICAgY2FzZSBMRUZUOgog
ICAgICAgICBjYXNlIFdFQktJVF9MRUZUOgpAQCAtODE5LDkgKzU0NywxNSBAQCB2b2lkIFJlbmRl
ckJsb2NrOjpsYXlvdXRJbmxpbmVDaGlsZHJlbihiCiAgICAgYm9vbCB1c2VSZXBhaW50Qm91bmRz
ID0gZmFsc2U7CiAgICAgCiAgICAgbV9vdmVyZmxvdy5jbGVhcigpOwotICAgICAgICAKLSAgICBz
ZXRIZWlnaHQoYm9yZGVyVG9wKCkgKyBwYWRkaW5nVG9wKCkpOwotICAgIGludCB0b0FkZCA9IGJv
cmRlckJvdHRvbSgpICsgcGFkZGluZ0JvdHRvbSgpICsgaG9yaXpvbnRhbFNjcm9sbGJhckhlaWdo
dCgpOworICAgIAorICAgIGludCB0b3AgPSBib3JkZXJUb3AoKSArIHBhZGRpbmdUb3AoKTsKKyAg
ICBpbnQgYm90dG9tID0gYm9yZGVyQm90dG9tKCkgKyBwYWRkaW5nQm90dG9tKCkgKyBob3Jpem9u
dGFsU2Nyb2xsYmFySGVpZ2h0KCk7CisKKyAgICBzZXRIZWlnaHQodG9wKTsKKworICAgIC8vIFRo
ZSBtYXJnaW4gc3RydWN0IGNhY2hlcyBhbGwgb3VyIGN1cnJlbnQgbWFyZ2luIGNvbGxhcHNpbmcg
c3RhdGUuIFdlIHJ1biBtYXJnaW4gY29sbGFwc2luZyB3aGVuIHdlIGVuY291bnRlciBhbm9ueW1v
dXMgaW5saW5lIGJsb2NrcyB0aGF0IGFyZSBiZWluZyB1c2VkCisgICAgLy8gZm9yIHRoZSBibG9j
a3MtaW5zaWRlLWlubGluZXMgY2FzZSAoYW5kIHRoZSBpbmxpbmVzIGFyZSBlbXB0eSksIGUuZywg
PHNwYW4+PGRpdj5PbmU8L2Rpdj48L3NwYW4+LgorICAgIE1hcmdpbkluZm8gbWFyZ2luSW5mbyh0
aGlzLCB0b3AsIGJvdHRvbSk7CiAKICAgICAvLyBGaWd1cmUgb3V0IGlmIHdlIHNob3VsZCBjbGVh
ciBvdXQgb3VyIGxpbmUgYm94ZXMuCiAgICAgLy8gRklYTUU6IEhhbmRsZSByZXNpemUgZXZlbnR1
YWxseSEKQEAgLTg1MCwxMiArNTg0LDE1IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmxheW91dElubGlu
ZUNoaWxkcmVuKGIKICAgICAgICAgICAgIGlmIChvLT5pc1JlcGxhY2VkKCkgfHwgby0+aXNGbG9h
dGluZygpIHx8IG8tPmlzUG9zaXRpb25lZCgpKSB7CiAgICAgICAgICAgICAgICAgUmVuZGVyQm94
KiBib3ggPSB0b1JlbmRlckJveChvKTsKICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAg
ICBpZiAocmVsYXlvdXRDaGlsZHJlbiB8fCBvLT5zdHlsZSgpLT53aWR0aCgpLmlzUGVyY2VudCgp
IHx8IG8tPnN0eWxlKCktPmhlaWdodCgpLmlzUGVyY2VudCgpKQotICAgICAgICAgICAgICAgICAg
ICBvLT5zZXRDaGlsZE5lZWRzTGF5b3V0KHRydWUsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAg
ICAgCisgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGxheW91dCBjaGlsZHJlbiBpZiB0
aGV5IG5lZWQgaXQuCisgICAgICAgICAgICAgICAgLy8gRklYTUU6IFRlY2huaWNhbGx5IHBlcmNl
bnRhZ2UgaGVpZ2h0IG9iamVjdHMgb25seSBuZWVkIGEgcmVsYXlvdXQgaWYgdGhlaXIgcGVyY2Vu
dGFnZSBpc24ndCBnb2luZyB0byBiZSB0dXJuZWQgaW50bworICAgICAgICAgICAgICAgIC8vIGFu
IGF1dG8gdmFsdWUuICBBZGQgYSBtZXRob2QgdG8gZGV0ZXJtaW5lIHRoaXMsIHNvIHRoYXQgd2Ug
Y2FuIGF2b2lkIHRoZSByZWxheW91dC4KKyAgICAgICAgICAgICAgICBpZiAocmVsYXlvdXRDaGls
ZHJlbiB8fCAoKGJveC0+c3R5bGUoKS0+aGVpZ2h0KCkuaXNQZXJjZW50KCkgfHwgYm94LT5zdHls
ZSgpLT5taW5IZWlnaHQoKS5pc1BlcmNlbnQoKSB8fCBib3gtPnN0eWxlKCktPm1heEhlaWdodCgp
LmlzUGVyY2VudCgpKSkpCisgICAgICAgICAgICAgICAgICAgIGJveC0+c2V0Q2hpbGROZWVkc0xh
eW91dCh0cnVlLCBmYWxzZSk7CisKICAgICAgICAgICAgICAgICAvLyBJZiByZWxheW91dENoaWxk
cmVuIGlzIHNldCBhbmQgd2UgaGF2ZSBwZXJjZW50YWdlIHBhZGRpbmcsIHdlIGFsc28gbmVlZCB0
byBpbnZhbGlkYXRlIHRoZSBjaGlsZCdzIHByZWYgd2lkdGhzLgotICAgICAgICAgICAgICAgIGlm
IChyZWxheW91dENoaWxkcmVuICYmIChvLT5zdHlsZSgpLT5wYWRkaW5nTGVmdCgpLmlzUGVyY2Vu
dCgpIHx8IG8tPnN0eWxlKCktPnBhZGRpbmdSaWdodCgpLmlzUGVyY2VudCgpKSkKLSAgICAgICAg
ICAgICAgICAgICAgby0+c2V0UHJlZldpZHRoc0RpcnR5KHRydWUsIGZhbHNlKTsKKyAgICAgICAg
ICAgICAgICBpZiAocmVsYXlvdXRDaGlsZHJlbiAmJiAoYm94LT5zdHlsZSgpLT5wYWRkaW5nTGVm
dCgpLmlzUGVyY2VudCgpIHx8IGJveC0+c3R5bGUoKS0+cGFkZGluZ1JpZ2h0KCkuaXNQZXJjZW50
KCkpKQorICAgICAgICAgICAgICAgICAgICBib3gtPnNldFByZWZXaWR0aHNEaXJ0eSh0cnVlLCBm
YWxzZSk7CiAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICBpZiAoby0+aXNQb3NpdGlvbmVk
KCkpCiAgICAgICAgICAgICAgICAgICAgIG8tPmNvbnRhaW5pbmdCbG9jaygpLT5pbnNlcnRQb3Np
dGlvbmVkT2JqZWN0KGJveCk7CkBAIC04NjUsNyArNjAyLDggQEAgdm9pZCBSZW5kZXJCbG9jazo6
bGF5b3V0SW5saW5lQ2hpbGRyZW4oYgogICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmdWxs
TGF5b3V0IHx8IG8tPm5lZWRzTGF5b3V0KCkpIC8vIFJlcGxhY2VkIGVsZW1lbnRzCiAgICAgICAg
ICAgICAgICAgICAgICAgICB0b1JlbmRlckJveChvKS0+ZGlydHlMaW5lQm94ZXMoZnVsbExheW91
dCk7CiAKLSAgICAgICAgICAgICAgICAgICAgby0+bGF5b3V0SWZOZWVkZWQoKTsKKyAgICAgICAg
ICAgICAgICAgICAgaWYgKCFvLT5pc1JlcGxhY2VkKCkgfHwgIW8tPmlzQW5vbnltb3VzSW5saW5l
QmxvY2soKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG8tPmxheW91dElmTmVlZGVkKCk7CiAg
ICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmIChvLT5pc1RleHQoKSB8fCAo
by0+aXNSZW5kZXJJbmxpbmUoKSAmJiAhZW5kT2ZJbmxpbmUpKSB7CiAgICAgICAgICAgICAgICAg
aGFzSW5saW5lQ2hpbGQgPSB0cnVlOwpAQCAtOTYwLDcgKzY5OCw3IEBAIHZvaWQgUmVuZGVyQmxv
Y2s6OmxheW91dElubGluZUNoaWxkcmVuKGIKICAgICAgICAgICAgIGlzTGluZUVtcHR5ID0gdHJ1
ZTsKICAgICAgICAgICAgIAogICAgICAgICAgICAgRUNsZWFyIGNsZWFyID0gQ05PTkU7Ci0gICAg
ICAgICAgICBlbmQgPSBmaW5kTmV4dExpbmVCcmVhayhyZXNvbHZlciwgZmlyc3RMaW5lLCBpc0xp
bmVFbXB0eSwgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5LCAmY2xlYXIpOworICAgICAgICAgICAg
ZW5kID0gZmluZE5leHRMaW5lQnJlYWsocmVzb2x2ZXIsIGZpcnN0TGluZSwgaXNMaW5lRW1wdHks
IHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSwgbWFyZ2luSW5mbywgJmNsZWFyKTsKICAgICAgICAg
ICAgIGlmIChyZXNvbHZlci5wb3NpdGlvbigpLmF0RW5kKCkpIHsKICAgICAgICAgICAgICAgICBy
ZXNvbHZlci5kZWxldGVSdW5zKCk7CiAgICAgICAgICAgICAgICAgY2hlY2tGb3JGbG9hdHNGcm9t
TGFzdExpbmUgPSB0cnVlOwpAQCAtMTAzMCw2ICs3NjgsMTQgQEAgdm9pZCBSZW5kZXJCbG9jazo6
bGF5b3V0SW5saW5lQ2hpbGRyZW4oYgogICAgICAgICAgICAgICAgICAgICBpZiAobGluZUJveCkg
ewogICAgICAgICAgICAgICAgICAgICAgICAgbGluZUJveC0+c2V0RW5kc1dpdGhCcmVhayhwcmV2
aW91c0xpbmVCcm9rZUNsZWFubHkpOwogCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBv
dXIgcHJldmlvdXMgbGluZSB3YXMgYW4gYW5vbnltb3VzIGJsb2NrIGFuZCB3ZSBhcmUgbm90IGFu
IGFub255bW91cyBibG9jaywgc2ltdWxhdGUgYSBtYXJnaW4gY29sbGFwc2Ugbm93IHNvIHRoYXQg
d2UgZ2V0IHRoZSBwcm9wZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluY3JlYXNlZCBo
ZWlnaHQuICBXZSBhbHNvIGhhdmUgdG8gc2ltdWxhdGUgYSBtYXJnaW4gY29sbGFwc2UgdG8gcHJv
cGFnYXRlIG1hcmdpbnMgdGhyb3VnaCB0byB0aGUgdG9wIG9mIG91ciBibG9jay4KKyAgICAgICAg
ICAgICAgICAgICAgICAgIGlmICghbGluZUJveC0+aGFzQW5vbnltb3VzSW5saW5lQmxvY2soKSkg
eworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbGluZUJveC0+cHJldlJvb3RCb3go
KSB8fCBsaW5lQm94LT5wcmV2Um9vdEJveCgpLT5oYXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKQor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZU1hcmdpbnMoMCwgbWFyZ2lu
SW5mbyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luSW5mby5zZXRBdFRvcE9m
QmxvY2soZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAg
ICAgICAgICAgICAvLyBOb3cgd2UgcG9zaXRpb24gYWxsIG9mIG91ciB0ZXh0IHJ1bnMgaG9yaXpv
bnRhbGx5LgogICAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZUhvcml6b250YWxQb3NpdGlv
bnNGb3JMaW5lKGxpbmVCb3gsIGZpcnN0TGluZSwgcmVzb2x2ZXIuZmlyc3RSdW4oKSwgdHJhaWxp
bmdTcGFjZVJ1biwgZW5kLmF0RW5kKCkpOwogCkBAIC0xMTYxLDggKzkwNywxNCBAQCB2b2lkIFJl
bmRlckJsb2NrOjpsYXlvdXRJbmxpbmVDaGlsZHJlbihiCiAgICAgICAgIH0KICAgICB9CiAKLSAg
ICAvLyBOb3cgYWRkIGluIHRoZSBib3R0b20gYm9yZGVyL3BhZGRpbmcuCi0gICAgc2V0SGVpZ2h0
KGhlaWdodCgpICsgdG9BZGQpOworICAgIC8vIE5vdyBkbyB0aGUgaGFuZGxpbmcgb2YgdGhlIGJv
dHRvbSBvZiB0aGUgYmxvY2ssIGFkZGluZyBpbiBvdXIgYm90dG9tIGJvcmRlci9wYWRkaW5nIGFu
ZAorICAgIC8vIGRldGVybWluaW5nIHRoZSBjb3JyZWN0IGNvbGxhcHNlZCBib3R0b20gbWFyZ2lu
IGluZm9ybWF0aW9uLiAgVGhpcyBjb2xsYXBzZSBpcyBvbmx5IG5lY2Vzc2FyeQorICAgIC8vIGlm
IG91ciBsYXN0IGNoaWxkIHdhcyBhbiBhbm9ueW1vdXMgaW5saW5lIGJsb2NrIHRoYXQgbWlnaHQg
bmVlZCB0byBwcm9wYWdhdGUgbWFyZ2luIGluZm9ybWF0aW9uIG91dCB0bworICAgIC8vIHVzLgor
ICAgIGlmIChsYXN0Um9vdEJveCgpICYmIGxhc3RSb290Qm94KCktPmhhc0Fub255bW91c0lubGlu
ZUJsb2NrKCkpCisgICAgICAgIGhhbmRsZUJvdHRvbU9mQmxvY2sodG9wLCBib3R0b20sIG1hcmdp
bkluZm8pOworICAgIGVsc2UKKyAgICAgICAgc2V0SGVpZ2h0KGhlaWdodCgpICsgYm90dG9tKTsK
IAogICAgIGlmICghZmlyc3RMaW5lQm94KCkgJiYgaGFzTGluZUlmRW1wdHkoKSkKICAgICAgICAg
c2V0SGVpZ2h0KGhlaWdodCgpICsgbGluZUhlaWdodCh0cnVlLCB0cnVlKSk7CkBAIC0xMTgzLDYg
KzkzNSwxMiBAQCBSb290SW5saW5lQm94KiBSZW5kZXJCbG9jazo6ZGV0ZXJtaW5lU3RhCiAgICAg
aWYgKCFmdWxsTGF5b3V0KSB7CiAgICAgICAgIHNpemVfdCBmbG9hdEluZGV4ID0gMDsKICAgICAg
ICAgZm9yIChjdXJyID0gZmlyc3RSb290Qm94KCk7IGN1cnIgJiYgIWN1cnItPmlzRGlydHkoKTsg
Y3VyciA9IGN1cnItPm5leHRSb290Qm94KCkpIHsKKyAgICAgICAgICAgIGlmIChjdXJyLT5oYXNB
bm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CisgICAgICAgICAgICAgICAgLy8gRklYTUU6IFdlIGhh
dmUgdG8gZG8gYmV0dGVyIHRoYW4gdGhpcyBvciB3ZSB3aWxsIHJlcGFpbnQgdG9vIG11Y2ggYXMg
Y29udGVudCBpbnNpZGUgYW4KKyAgICAgICAgICAgICAgICAvLyBhbm9ueW1vdXMgaW5saW5lIGJs
b2NrIGNvbWVzIGluLgorICAgICAgICAgICAgICAgIGZ1bGxMYXlvdXQgPSB0cnVlOworICAgICAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKFZlY3RvcjxS
ZW5kZXJCb3gqPiogY2xlYW5MaW5lRmxvYXRzID0gY3Vyci0+ZmxvYXRzUHRyKCkpIHsKICAgICAg
ICAgICAgICAgICBWZWN0b3I8UmVuZGVyQm94Kj46Oml0ZXJhdG9yIGVuZCA9IGNsZWFuTGluZUZs
b2F0cy0+ZW5kKCk7CiAgICAgICAgICAgICAgICAgZm9yIChWZWN0b3I8UmVuZGVyQm94Kj46Oml0
ZXJhdG9yIG8gPSBjbGVhbkxpbmVGbG9hdHMtPmJlZ2luKCk7IG8gIT0gZW5kOyArK28pIHsKQEAg
LTE0NDQsNyArMTIwMiw3IEBAIHN0YXRpYyBib29sIGlubGluZUZsb3dSZXF1aXJlc0xpbmVCb3go
UmUKICAgICByZXR1cm4gIWZsb3ctPmZpcnN0Q2hpbGQoKSAmJiBmbG93LT5oYXNIb3Jpem9udGFs
Qm9yZGVyc1BhZGRpbmdPck1hcmdpbigpOwogfQogCi1zdGF0aWMgaW5saW5lIGJvb2wgcmVxdWly
ZXNMaW5lQm94KGNvbnN0IElubGluZUl0ZXJhdG9yJiBpdCwgYm9vbCBpc0xpbmVFbXB0eSwgYm9v
bCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHkpCitib29sIFJlbmRlckJsb2NrOjpyZXF1aXJlc0xp
bmVCb3goY29uc3QgSW5saW5lSXRlcmF0b3ImIGl0LCBib29sIGlzTGluZUVtcHR5LCBib29sIHBy
ZXZpb3VzTGluZUJyb2tlQ2xlYW5seSkKIHsKICAgICBpZiAoaXQub2JqLT5pc0Zsb2F0aW5nT3JQ
b3NpdGlvbmVkKCkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTE1OTcsNyArMTM1NSw3IEBA
IHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgdGV4dFdpZHRoKFJlbmRlclQKIH0KIAogSW5saW5lSXRl
cmF0b3IgUmVuZGVyQmxvY2s6OmZpbmROZXh0TGluZUJyZWFrKElubGluZUJpZGlSZXNvbHZlciYg
cmVzb2x2ZXIsIGJvb2wgZmlyc3RMaW5lLCAgYm9vbCYgaXNMaW5lRW1wdHksIGJvb2wmIHByZXZp
b3VzTGluZUJyb2tlQ2xlYW5seSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgRUNsZWFyKiBjbGVhcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBNYXJnaW5JbmZvJiBtYXJnaW5JbmZvLCBFQ2xlYXIqIGNsZWFyKQog
ewogICAgIEFTU0VSVChyZXNvbHZlci5wb3NpdGlvbigpLmJsb2NrID09IHRoaXMpOwogCkBAIC0x
NjM4LDYgKzEzOTYsMTEgQEAgSW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6OmZpbmROZXh0TGlu
ZQogICAgIGJvb2wgYXV0b1dyYXBXYXNFdmVyVHJ1ZU9uTGluZSA9IGZhbHNlOwogICAgIGJvb2wg
ZmxvYXRzRml0T25MaW5lID0gdHJ1ZTsKICAgICAKKyAgICBib29sIGlzQmxvY2tJbnNpZGVJbmxp
bmUgPSBmYWxzZTsKKyAgICAKKyAgICBpbnQgcHJldmlvdXNCbG9ja0Zsb2F0Qm90dG9tID0gMDsK
KyAgICBpbnQgbWF4QmxvY2tGbG9hdEJvdHRvbSA9IDA7CisKICAgICAvLyBGaXJlZm94IGFuZCBP
cGVyYSB3aWxsIGFsbG93IGEgdGFibGUgY2VsbCB0byBncm93IHRvIGZpdCBhbiBpbWFnZSBpbnNp
ZGUgaXQgdW5kZXIKICAgICAvLyB2ZXJ5IHNwZWNpZmljIGNpcmN1bXN0YW5jZXMgKGluIG9yZGVy
IHRvIG1hdGNoIGNvbW1vbiBXaW5JRSByZW5kZXJpbmdzKS4gCiAgICAgLy8gTm90IHN1cHBvcnRp
bmcgdGhlIHF1aXJrIGhhcyBjYXVzZWQgdXMgdG8gbWlzLXJlbmRlciBzb21lIHJlYWwgc2l0ZXMu
IChTZWUgQnVnemlsbGEgMTA1MTcuKSAKQEAgLTE2NDgsNyArMTQxMSw4IEBAIElubGluZUl0ZXJh
dG9yIFJlbmRlckJsb2NrOjpmaW5kTmV4dExpbmUKICAgICB3aGlsZSAobykgewogICAgICAgICBj
dXJyV1MgPSBvLT5pc1JlcGxhY2VkKCkgPyBvLT5wYXJlbnQoKS0+c3R5bGUoKS0+d2hpdGVTcGFj
ZSgpIDogby0+c3R5bGUoKS0+d2hpdGVTcGFjZSgpOwogICAgICAgICBsYXN0V1MgPSBsYXN0LT5p
c1JlcGxhY2VkKCkgPyBsYXN0LT5wYXJlbnQoKS0+c3R5bGUoKS0+d2hpdGVTcGFjZSgpIDogbGFz
dC0+c3R5bGUoKS0+d2hpdGVTcGFjZSgpOwotICAgICAgICAKKyAgICAgICAgaXNCbG9ja0luc2lk
ZUlubGluZSA9IG8tPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKTsKKwogICAgICAgICBib29sIGF1
dG9XcmFwID0gUmVuZGVyU3R5bGU6OmF1dG9XcmFwKGN1cnJXUyk7CiAgICAgICAgIGF1dG9XcmFw
V2FzRXZlclRydWVPbkxpbmUgPSBhdXRvV3JhcFdhc0V2ZXJUcnVlT25MaW5lIHx8IGF1dG9XcmFw
OwogCkBAIC0xNjU5LDcgKzE0MjMsNyBAQCBJbmxpbmVJdGVyYXRvciBSZW5kZXJCbG9jazo6Zmlu
ZE5leHRMaW5lCiAjZW5kaWYKIAogICAgICAgICBib29sIGNvbGxhcHNlV2hpdGVTcGFjZSA9IFJl
bmRlclN0eWxlOjpjb2xsYXBzZVdoaXRlU3BhY2UoY3VycldTKTsKLSAgICAgICAgICAgIAorCiAg
ICAgICAgIGlmIChvLT5pc0JSKCkpIHsKICAgICAgICAgICAgIGlmICh3ICsgdG1wVyA8PSB3aWR0
aCkgewogICAgICAgICAgICAgICAgIGxCcmVhay5vYmogPSBvOwpAQCAtMTc2Niw4ICsxNTMwLDkg
QEAgSW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6OmZpbmROZXh0TGluZQogICAgICAgICB9IGVs
c2UgaWYgKG8tPmlzUmVwbGFjZWQoKSkgewogICAgICAgICAgICAgUmVuZGVyQm94KiByZXBsYWNl
ZEJveCA9IHRvUmVuZGVyQm94KG8pOwogCi0gICAgICAgICAgICAvLyBCcmVhayBvbiByZXBsYWNl
ZCBlbGVtZW50cyBpZiBlaXRoZXIgaGFzIG5vcm1hbCB3aGl0ZS1zcGFjZS4KLSAgICAgICAgICAg
IGlmICgoYXV0b1dyYXAgfHwgUmVuZGVyU3R5bGU6OmF1dG9XcmFwKGxhc3RXUykpICYmICghby0+
aXNJbWFnZSgpIHx8IGFsbG93SW1hZ2VzVG9CcmVhaykpIHsKKyAgICAgICAgICAgIC8vIEJyZWFr
IG9uIHJlcGxhY2VkIGVsZW1lbnRzIGlmIGVpdGhlciBoYXMgbm9ybWFsIHdoaXRlLXNwYWNlLiAg
V2UgYWxzbyBhbHdheXMgYnJlYWsgaWYgd2UKKyAgICAgICAgICAgIC8vIGVuY291bnRlciBhIHNw
ZWNpYWwgYW5vbnltb3VzIGlubGluZSBibG9jayAodXNlZCB0byBob2xkIGJsb2NrcyBpbnNpZGUg
aW5saW5lcykuCisgICAgICAgICAgICBpZiAoKGF1dG9XcmFwIHx8IFJlbmRlclN0eWxlOjphdXRv
V3JhcChsYXN0V1MpIHx8IGlzQmxvY2tJbnNpZGVJbmxpbmUpICAmJiAoIW8tPmlzSW1hZ2UoKSB8
fCBhbGxvd0ltYWdlc1RvQnJlYWspKSB7CiAgICAgICAgICAgICAgICAgdyArPSB0bXBXOwogICAg
ICAgICAgICAgICAgIHRtcFcgPSAwOwogICAgICAgICAgICAgICAgIGxCcmVhay5vYmogPSBvOwpA
QCAtMTc3NSw2ICsxNTQwLDE5IEBAIElubGluZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpmaW5kTmV4
dExpbmUKICAgICAgICAgICAgICAgICBsQnJlYWsubmV4dEJyZWFrYWJsZVBvc2l0aW9uID0gLTE7
CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGlmIChpc0Jsb2NrSW5zaWRlSW5saW5lKSB7
CisgICAgICAgICAgICAgICAgaWYgKCFpc0xpbmVFbXB0eSkKKyAgICAgICAgICAgICAgICAgICAg
Z290byBlbmQ7CisKKyAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgd2lkdGggdG8gaWdub3Jl
IGZsb2F0cywgc2luY2Ugd2UncmUgZ29pbmcgdG8gYWxsb3cgdGhlbSB0byBpbnRydWRlIGludG8g
b3VyIHNwYWNlLgorICAgICAgICAgICAgICAgIHdpZHRoID0gcmlnaHRPZmZzZXQoKSAtIGxlZnRP
ZmZzZXQoKTsKKworICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBUaGlzIGNhbGwgd2lsbCB1cGRh
dGUgdGhlIGhlaWdodCBvZiBvdXIgYmxvY2suICBJdCdzIG5vdCBjbGVhciBpZiB0aGF0J3MgZ29p
bmcgdG8gYmUgb2sgb3Igbm90IHlldC4KKyAgICAgICAgICAgICAgICBsYXlvdXRCbG9ja0NoaWxk
KHJlcGxhY2VkQm94LCBtYXJnaW5JbmZvLCBwcmV2aW91c0Jsb2NrRmxvYXRCb3R0b20sIG1heEJs
b2NrRmxvYXRCb3R0b20pOworCisgICAgICAgICAgICAgICAgbGluZU1pZHBvaW50U3RhdGUuYmV0
d2Vlbk1pZHBvaW50cyA9IGZhbHNlOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAo
aWdub3JpbmdTcGFjZXMpCiAgICAgICAgICAgICAgICAgYWRkTWlkcG9pbnQobGluZU1pZHBvaW50
U3RhdGUsIElubGluZUl0ZXJhdG9yKDAsIG8sIDApKTsKIApAQCAtMTc5OCw2ICsxNTc2LDE1IEBA
IElubGluZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpmaW5kTmV4dExpbmUKICAgICAgICAgICAgICAg
ICAgICAgdG1wVyArPSByZXBsYWNlZEJveC0+d2lkdGgoKSArIHJlcGxhY2VkQm94LT5tYXJnaW5M
ZWZ0KCkgKyByZXBsYWNlZEJveC0+bWFyZ2luUmlnaHQoKSArIGlubGluZVdpZHRoKG8pOwogICAg
ICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgdG1wVyArPSByZXBsYWNlZEJveC0+d2lk
dGgoKSArIHJlcGxhY2VkQm94LT5tYXJnaW5MZWZ0KCkgKyByZXBsYWNlZEJveC0+bWFyZ2luUmln
aHQoKSArIGlubGluZVdpZHRoKG8pOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgaWYg
KGlzQmxvY2tJbnNpZGVJbmxpbmUpIHsKKyAgICAgICAgICAgICAgICB3ICs9IHRtcFc7CisgICAg
ICAgICAgICAgICAgdG1wVyA9IDA7CisgICAgICAgICAgICAgICAgbEJyZWFrLm9iaiA9IG87Cisg
ICAgICAgICAgICAgICAgbEJyZWFrLnBvcyA9IDA7CisgICAgICAgICAgICAgICAgbEJyZWFrLm5l
eHRCcmVha2FibGVQb3NpdGlvbiA9IC0xOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAg
ICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKG8tPmlzVGV4dCgpKSB7CiAgICAgICAgICAg
ICBpZiAoIXBvcykKICAgICAgICAgICAgICAgICBhcHBsaWVkU3RhcnRXaWR0aCA9IGZhbHNlOwpA
QCAtMjE4NCw3ICsxOTcxLDcgQEAgSW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6OmZpbmROZXh0
TGluZQogICAgICAgICB9CiAgICAgICAgIC8vZWxzZSBpZiAobEJyZWFrLnBvcyA+IDApCiAgICAg
ICAgIC8vICAgIGxCcmVhay5wb3MtLTsKLSAgICAgICAgZWxzZSBpZiAobEJyZWFrLm9iaiA9PSAw
ICYmIHRyYWlsaW5nU3BhY2VPYmplY3QtPmlzVGV4dCgpKSB7CisgICAgICAgIGVsc2UgaWYgKCgh
bEJyZWFrLm9iaiB8fCBsQnJlYWsub2JqLT5pc0Fub255bW91c0lubGluZUJsb2NrKCkpICYmIHRy
YWlsaW5nU3BhY2VPYmplY3QtPmlzVGV4dCgpKSB7CiAgICAgICAgICAgICAvLyBBZGQgYSBuZXcg
ZW5kIG1pZHBvaW50IHRoYXQgc3RvcHMgcmlnaHQgYXQgdGhlIHZlcnkgZW5kLgogICAgICAgICAg
ICAgUmVuZGVyVGV4dCogdGV4dCA9IHRvUmVuZGVyVGV4dCh0cmFpbGluZ1NwYWNlT2JqZWN0KTsK
ICAgICAgICAgICAgIHVuc2lnbmVkIGxlbmd0aCA9IHRleHQtPnRleHRMZW5ndGgoKTsKSW5kZXg6
IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJveC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9y
ZW5kZXJpbmcvUmVuZGVyQm94LmNwcAkocmV2aXNpb24gNTQ1NjEpCisrKyBXZWJDb3JlL3JlbmRl
cmluZy9SZW5kZXJCb3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMzM0LDcgKzEzMzQsNyBAQCB2
b2lkIFJlbmRlckJveDo6Y2FsY1dpZHRoKCkKICAgICB9CiAKICAgICBpZiAoY29udGFpbmVyV2lk
dGggJiYgY29udGFpbmVyV2lkdGggIT0gKHdpZHRoKCkgKyBtX21hcmdpbkxlZnQgKyBtX21hcmdp
blJpZ2h0KQotICAgICAgICAgICAgJiYgIWlzRmxvYXRpbmcoKSAmJiAhaXNJbmxpbmUoKSAmJiAh
Y2ItPmlzRmxleGlibGVCb3goKSkgeworICAgICAgICAgICAgJiYgIWlzRmxvYXRpbmcoKSAmJiAo
IWlzSW5saW5lKCkgfHwgaXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKSAmJiAhY2ItPmlzRmxleGli
bGVCb3goKSkgewogICAgICAgICBpZiAoY2ItPnN0eWxlKCktPmRpcmVjdGlvbigpID09IExUUikK
ICAgICAgICAgICAgIG1fbWFyZ2luUmlnaHQgPSBjb250YWluZXJXaWR0aCAtIHdpZHRoKCkgLSBt
X21hcmdpbkxlZnQ7CiAgICAgICAgIGVsc2UKQEAgLTEzNzMsNyArMTM3Myw3IEBAIGJvb2wgUmVu
ZGVyQm94OjpzaXplc1RvSW50cmluc2ljV2lkdGgoV2kKIHsKICAgICAvLyBNYXJxdWVlcyBpbiBX
aW5JRSBhcmUgbGlrZSBhIG1peHR1cmUgb2YgYmxvY2tzIGFuZCBpbmxpbmUtYmxvY2tzLiAgVGhl
eSBzaXplIGFzIHRob3VnaCB0aGV5J3JlIGJsb2NrcywKICAgICAvLyBidXQgdGhleSBhbGxvdyB0
ZXh0IHRvIHNpdCBvbiB0aGUgc2FtZSBsaW5lIGFzIHRoZSBtYXJxdWVlLgotICAgIGlmIChpc0Zs
b2F0aW5nKCkgfHwgKGlzSW5saW5lQmxvY2tPcklubGluZVRhYmxlKCkgJiYgIWlzSFRNTE1hcnF1
ZWUoKSkpCisgICAgaWYgKGlzRmxvYXRpbmcoKSB8fCAoaXNJbmxpbmVCbG9ja09ySW5saW5lVGFi
bGUoKSAmJiAhaXNIVE1MTWFycXVlZSgpICYmICFpc0Fub255bW91c0lubGluZUJsb2NrKCkpKQog
ICAgICAgICByZXR1cm4gdHJ1ZTsKIAogICAgIC8vIFRoaXMgY29kZSBtYXkgbG9vayBhIGJpdCBz
dHJhbmdlLiAgQmFzaWNhbGx5IHdpZHRoOmludHJpbnNpYyBzaG91bGQgY2xhbXAgdGhlIHNpemUg
d2hlbiB0ZXN0aW5nIGJvdGgKQEAgLTI4MTksNyArMjgxOSw3IEBAIGJvb2wgUmVuZGVyQm94Ojpz
aHJpbmtUb0F2b2lkRmxvYXRzKCkgY28KIAogYm9vbCBSZW5kZXJCb3g6OmF2b2lkc0Zsb2F0cygp
IGNvbnN0CiB7Ci0gICAgcmV0dXJuIGlzUmVwbGFjZWQoKSB8fCBoYXNPdmVyZmxvd0NsaXAoKSB8
fCBpc0hSKCk7CisgICAgcmV0dXJuICFpc0Fub255bW91c0lubGluZUJsb2NrKCkgJiYgKGlzUmVw
bGFjZWQoKSB8fCBoYXNPdmVyZmxvd0NsaXAoKSB8fCBpc0hSKCkpOwogfQogCiB2b2lkIFJlbmRl
ckJveDo6YWRkU2hhZG93T3ZlcmZsb3coKQpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVy
SW5saW5lLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJJbmxpbmUu
Y3BwCShyZXZpc2lvbiA1NDU2MSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlcklubGluZS5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTQ0LDcgKzQ0LDYgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewog
CiBSZW5kZXJJbmxpbmU6OlJlbmRlcklubGluZShOb2RlKiBub2RlKQogICAgIDogUmVuZGVyQm94
TW9kZWxPYmplY3Qobm9kZSkKLSAgICAsIG1fY29udGludWF0aW9uKDApCiAgICAgLCBtX2xpbmVI
ZWlnaHQoLTEpCiAgICAgLCBtX3ZlcnRpY2FsUG9zaXRpb24oUG9zaXRpb25VbmRlZmluZWQpCiB7
CkBAIC01NiwxNCArNTUsNiBAQCB2b2lkIFJlbmRlcklubGluZTo6ZGVzdHJveSgpCiAgICAgLy8g
TWFrZSBzdXJlIHRvIGRlc3Ryb3kgYW5vbnltb3VzIGNoaWxkcmVuIGZpcnN0IHdoaWxlIHRoZXkg
YXJlIHN0aWxsIGNvbm5lY3RlZCB0byB0aGUgcmVzdCBvZiB0aGUgdHJlZSwgc28gdGhhdCB0aGV5
IHdpbGwKICAgICAvLyBwcm9wZXJseSBkaXJ0eSBsaW5lIGJveGVzIHRoYXQgdGhleSBhcmUgcmVt
b3ZlZCBmcm9tLiAgRWZmZWN0cyB0aGF0IGRvIDpiZWZvcmUvOmFmdGVyIG9ubHkgb24gaG92ZXIg
Y291bGQgY3Jhc2ggb3RoZXJ3aXNlLgogICAgIGNoaWxkcmVuKCktPmRlc3Ryb3lMZWZ0b3ZlckNo
aWxkcmVuKCk7Ci0KLSAgICAvLyBEZXN0cm95IG91ciBjb250aW51YXRpb24gYmVmb3JlIGFueXRo
aW5nIG90aGVyIHRoYW4gYW5vbnltb3VzIGNoaWxkcmVuLgotICAgIC8vIFRoZSByZWFzb24gd2Ug
ZG9uJ3QgZGVzdHJveSBpdCBiZWZvcmUgYW5vbnltb3VzIGNoaWxkcmVuIGlzIHRoYXQgdGhleSBt
YXkKLSAgICAvLyBoYXZlIGNvbnRpbnVhdGlvbnMgb2YgdGhlaXIgb3duIHRoYXQgYXJlIGFub255
bW91cyBjaGlsZHJlbiBvZiBvdXIgY29udGludWF0aW9uLgotICAgIGlmIChtX2NvbnRpbnVhdGlv
bikgewotICAgICAgICBtX2NvbnRpbnVhdGlvbi0+ZGVzdHJveSgpOwotICAgICAgICBtX2NvbnRp
bnVhdGlvbiA9IDA7Ci0gICAgfQogICAgIAogICAgIGlmICghZG9jdW1lbnRCZWluZ0Rlc3Ryb3ll
ZCgpKSB7CiAgICAgICAgIGlmIChmaXJzdExpbmVCb3goKSkgewpAQCAtOTIsMTMgKzgzLDYgQEAg
dm9pZCBSZW5kZXJJbmxpbmU6OmRlc3Ryb3koKQogICAgIFJlbmRlckJveE1vZGVsT2JqZWN0Ojpk
ZXN0cm95KCk7CiB9CiAKLVJlbmRlcklubGluZSogUmVuZGVySW5saW5lOjppbmxpbmVDb250aW51
YXRpb24oKSBjb25zdAotewotICAgIGlmICghbV9jb250aW51YXRpb24gfHwgbV9jb250aW51YXRp
b24tPmlzSW5saW5lKCkpCi0gICAgICAgIHJldHVybiB0b1JlbmRlcklubGluZShtX2NvbnRpbnVh
dGlvbik7Ci0gICAgcmV0dXJuIHRvUmVuZGVyQmxvY2sobV9jb250aW51YXRpb24pLT5pbmxpbmVD
b250aW51YXRpb24oKTsKLX0KLQogdm9pZCBSZW5kZXJJbmxpbmU6OnVwZGF0ZUJveE1vZGVsSW5m
b0Zyb21TdHlsZSgpCiB7CiAgICAgUmVuZGVyQm94TW9kZWxPYmplY3Q6OnVwZGF0ZUJveE1vZGVs
SW5mb0Zyb21TdHlsZSgpOwpAQCAtMTE0LDE5ICs5OCw2IEBAIHZvaWQgUmVuZGVySW5saW5lOjpz
dHlsZURpZENoYW5nZShTdHlsZUQKIHsKICAgICBSZW5kZXJCb3hNb2RlbE9iamVjdDo6c3R5bGVE
aWRDaGFuZ2UoZGlmZiwgb2xkU3R5bGUpOwogCi0gICAgLy8gRW5zdXJlIHRoYXQgYWxsIG9mIHRo
ZSBzcGxpdCBpbmxpbmVzIHBpY2sgdXAgdGhlIG5ldyBzdHlsZS4gV2UKLSAgICAvLyBvbmx5IGRv
IHRoaXMgaWYgd2UncmUgYW4gaW5saW5lLCBzaW5jZSB3ZSBkb24ndCB3YW50IHRvIHByb3BhZ2F0
ZQotICAgIC8vIGEgYmxvY2sncyBzdHlsZSB0byB0aGUgb3RoZXIgaW5saW5lcy4KLSAgICAvLyBl
LmcuLCA8Zm9udD5mb28gPGg0PmdvbzwvaDQ+IG1vbzwvZm9udD4uICBUaGUgPGZvbnQ+IGlubGlu
ZXMgYmVmb3JlCi0gICAgLy8gYW5kIGFmdGVyIHRoZSBibG9jayBzaGFyZSB0aGUgc2FtZSBzdHls
ZSwgYnV0IHRoZSBibG9jayBkb2Vzbid0Ci0gICAgLy8gbmVlZCB0byBwYXNzIGl0cyBzdHlsZSBv
biB0byBhbnlvbmUgZWxzZS4KLSAgICBmb3IgKFJlbmRlcklubGluZSogY3VyckNvbnQgPSBpbmxp
bmVDb250aW51YXRpb24oKTsgY3VyckNvbnQ7IGN1cnJDb250ID0gY3VyckNvbnQtPmlubGluZUNv
bnRpbnVhdGlvbigpKSB7Ci0gICAgICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBuZXh0Q29udCA9
IGN1cnJDb250LT5jb250aW51YXRpb24oKTsKLSAgICAgICAgY3VyckNvbnQtPnNldENvbnRpbnVh
dGlvbigwKTsKLSAgICAgICAgY3VyckNvbnQtPnNldFN0eWxlKHN0eWxlKCkpOwotICAgICAgICBj
dXJyQ29udC0+c2V0Q29udGludWF0aW9uKG5leHRDb250KTsKLSAgICB9Ci0KICAgICBtX2xpbmVI
ZWlnaHQgPSAtMTsKIAogICAgIC8vIFVwZGF0ZSBwc2V1ZG9zIGZvciA6YmVmb3JlIGFuZCA6YWZ0
ZXIgbm93LgpAQCAtMTM2LDc5ICsxMDcsNzMgQEAgdm9pZCBSZW5kZXJJbmxpbmU6OnN0eWxlRGlk
Q2hhbmdlKFN0eWxlRAogICAgIH0KIH0KIAotdm9pZCBSZW5kZXJJbmxpbmU6OmFkZENoaWxkKFJl
bmRlck9iamVjdCogbmV3Q2hpbGQsIFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQpCi17Ci0gICAg
aWYgKGNvbnRpbnVhdGlvbigpKQotICAgICAgICByZXR1cm4gYWRkQ2hpbGRUb0NvbnRpbnVhdGlv
bihuZXdDaGlsZCwgYmVmb3JlQ2hpbGQpOwotICAgIHJldHVybiBhZGRDaGlsZElnbm9yaW5nQ29u
dGludWF0aW9uKG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7Ci19Ci0KLXN0YXRpYyBSZW5kZXJCb3hN
b2RlbE9iamVjdCogbmV4dENvbnRpbnVhdGlvbihSZW5kZXJPYmplY3QqIHJlbmRlcmVyKQordm9p
ZCBSZW5kZXJJbmxpbmU6OmNoaWxkQmVjYW1lTm9uSW5saW5lKFJlbmRlck9iamVjdCogY2hpbGQp
CiB7Ci0gICAgaWYgKHJlbmRlcmVyLT5pc0lubGluZSgpICYmICFyZW5kZXJlci0+aXNSZXBsYWNl
ZCgpKQotICAgICAgICByZXR1cm4gdG9SZW5kZXJJbmxpbmUocmVuZGVyZXIpLT5jb250aW51YXRp
b24oKTsKLSAgICByZXR1cm4gdG9SZW5kZXJCbG9jayhyZW5kZXJlciktPmlubGluZUNvbnRpbnVh
dGlvbigpOworICAgIFJlbmRlck9iamVjdCogbmV4dCA9IGNoaWxkLT5uZXh0U2libGluZygpOwor
ICAgIHJlbW92ZUNoaWxkKGNoaWxkKTsKKyAgICBhZGRDaGlsZChjaGlsZCwgbmV4dCk7CiB9CiAK
LVJlbmRlckJveE1vZGVsT2JqZWN0KiBSZW5kZXJJbmxpbmU6OmNvbnRpbnVhdGlvbkJlZm9yZShS
ZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkKQotewotICAgIGlmIChiZWZvcmVDaGlsZCAmJiBiZWZv
cmVDaGlsZC0+cGFyZW50KCkgPT0gdGhpcykKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0KLSAgICBS
ZW5kZXJCb3hNb2RlbE9iamVjdCogY3VyciA9IG5leHRDb250aW51YXRpb24odGhpcyk7Ci0gICAg
UmVuZGVyQm94TW9kZWxPYmplY3QqIG5leHRUb0xhc3QgPSB0aGlzOwotICAgIFJlbmRlckJveE1v
ZGVsT2JqZWN0KiBsYXN0ID0gdGhpczsKLSAgICB3aGlsZSAoY3VycikgewotICAgICAgICBpZiAo
YmVmb3JlQ2hpbGQgJiYgYmVmb3JlQ2hpbGQtPnBhcmVudCgpID09IGN1cnIpIHsKLSAgICAgICAg
ICAgIGlmIChjdXJyLT5maXJzdENoaWxkKCkgPT0gYmVmb3JlQ2hpbGQpCi0gICAgICAgICAgICAg
ICAgcmV0dXJuIGxhc3Q7Ci0gICAgICAgICAgICByZXR1cm4gY3VycjsKLSAgICAgICAgfQotCi0g
ICAgICAgIG5leHRUb0xhc3QgPSBsYXN0OwotICAgICAgICBsYXN0ID0gY3VycjsKLSAgICAgICAg
Y3VyciA9IG5leHRDb250aW51YXRpb24oY3Vycik7Ci0gICAgfQotCi0gICAgaWYgKCFiZWZvcmVD
aGlsZCAmJiAhbGFzdC0+Zmlyc3RDaGlsZCgpKQotICAgICAgICByZXR1cm4gbmV4dFRvTGFzdDsK
LSAgICByZXR1cm4gbGFzdDsKLX0KLQotdm9pZCBSZW5kZXJJbmxpbmU6OmFkZENoaWxkSWdub3Jp
bmdDb250aW51YXRpb24oUmVuZGVyT2JqZWN0KiBuZXdDaGlsZCwgUmVuZGVyT2JqZWN0KiBiZWZv
cmVDaGlsZCkKK3ZvaWQgUmVuZGVySW5saW5lOjphZGRDaGlsZChSZW5kZXJPYmplY3QqIG5ld0No
aWxkLCBSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkKQogewogICAgIC8vIE1ha2Ugc3VyZSB3ZSBk
b24ndCBhcHBlbmQgdGhpbmdzIGFmdGVyIDphZnRlci1nZW5lcmF0ZWQgY29udGVudCBpZiB3ZSBo
YXZlIGl0LgogICAgIGlmICghYmVmb3JlQ2hpbGQgJiYgaXNBZnRlckNvbnRlbnQobGFzdENoaWxk
KCkpKQogICAgICAgICBiZWZvcmVDaGlsZCA9IGxhc3RDaGlsZCgpOwogCi0gICAgaWYgKCFuZXdD
aGlsZC0+aXNJbmxpbmUoKSAmJiAhbmV3Q2hpbGQtPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSkg
ewotICAgICAgICAvLyBXZSBhcmUgcGxhY2luZyBhIGJsb2NrIGluc2lkZSBhbiBpbmxpbmUuIFdl
IGhhdmUgdG8gcGVyZm9ybSBhIHNwbGl0IG9mIHRoaXMKLSAgICAgICAgLy8gaW5saW5lIGludG8g
Y29udGludWF0aW9ucy4gIFRoaXMgaW52b2x2ZXMgY3JlYXRpbmcgYW4gYW5vbnltb3VzIGJsb2Nr
IGJveCB0byBob2xkCi0gICAgICAgIC8vIHxuZXdDaGlsZHwuICBXZSB0aGVuIG1ha2UgdGhhdCBi
bG9jayBib3ggYSBjb250aW51YXRpb24gb2YgdGhpcyBpbmxpbmUuICBXZSB0YWtlIGFsbCBvZgot
ICAgICAgICAvLyB0aGUgY2hpbGRyZW4gYWZ0ZXIgfGJlZm9yZUNoaWxkfCBhbmQgcHV0IHRoZW0g
aW4gYSBjbG9uZSBvZiB0aGlzIG9iamVjdC4KLSAgICAgICAgUmVmUHRyPFJlbmRlclN0eWxlPiBu
ZXdTdHlsZSA9IFJlbmRlclN0eWxlOjpjcmVhdGUoKTsKLSAgICAgICAgbmV3U3R5bGUtPmluaGVy
aXRGcm9tKHN0eWxlKCkpOwotICAgICAgICBuZXdTdHlsZS0+c2V0RGlzcGxheShCTE9DSyk7Ci0K
LSAgICAgICAgUmVuZGVyQmxvY2sqIG5ld0JveCA9IG5ldyAocmVuZGVyQXJlbmEoKSkgUmVuZGVy
QmxvY2soZG9jdW1lbnQoKSAvKiBhbm9ueW1vdXMgYm94ICovKTsKLSAgICAgICAgbmV3Qm94LT5z
ZXRTdHlsZShuZXdTdHlsZS5yZWxlYXNlKCkpOwotICAgICAgICBSZW5kZXJCb3hNb2RlbE9iamVj
dCogb2xkQ29udGludWF0aW9uID0gY29udGludWF0aW9uKCk7Ci0gICAgICAgIHNldENvbnRpbnVh
dGlvbihuZXdCb3gpOwotCi0gICAgICAgIC8vIFNvbWVvbmUgbWF5IGhhdmUgcHV0IGEgPHA+IGlu
c2lkZSBhIDxxPiwgY2F1c2luZyBhIHNwbGl0LiAgV2hlbiB0aGlzIGhhcHBlbnMsIHRoZSA6YWZ0
ZXIgY29udGVudAotICAgICAgICAvLyBoYXMgdG8gbW92ZSBpbnRvIHRoZSBpbmxpbmUgY29udGlu
dWF0aW9uLiAgQ2FsbCB1cGRhdGVCZWZvcmVBZnRlckNvbnRlbnQgdG8gZW5zdXJlIHRoYXQgb3Vy
IDphZnRlcgotICAgICAgICAvLyBjb250ZW50IGdldHMgcHJvcGVybHkgZGVzdHJveWVkLgotICAg
ICAgICBib29sIGlzTGFzdENoaWxkID0gKGJlZm9yZUNoaWxkID09IGxhc3RDaGlsZCgpKTsKLSAg
ICAgICAgaWYgKGRvY3VtZW50KCktPnVzZXNCZWZvcmVBZnRlclJ1bGVzKCkpCi0gICAgICAgICAg
ICBjaGlsZHJlbigpLT51cGRhdGVCZWZvcmVBZnRlckNvbnRlbnQodGhpcywgQUZURVIpOwotICAg
ICAgICBpZiAoaXNMYXN0Q2hpbGQgJiYgYmVmb3JlQ2hpbGQgIT0gbGFzdENoaWxkKCkpCi0gICAg
ICAgICAgICBiZWZvcmVDaGlsZCA9IDA7IC8vIFdlIGRlc3Ryb3llZCB0aGUgbGFzdCBjaGlsZCwg
c28gbm93IHdlIG5lZWQgdG8gdXBkYXRlIG91ciBpbnNlcnRpb24KLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgLy8gcG9pbnQgdG8gYmUgMC4gIEl0J3MganVzdCBhIHN0cmFpZ2h0IGFwcGVu
ZCBub3cuCi0KLSAgICAgICAgc3BsaXRGbG93KGJlZm9yZUNoaWxkLCBuZXdCb3gsIG5ld0NoaWxk
LCBvbGRDb250aW51YXRpb24pOworICAgIC8vIElmIHRoZSByZXF1ZXN0ZWQgYmVmb3JlQ2hpbGQg
aXMgbm90IG9uZSBvZiBvdXIgY2hpbGRyZW4sIHRoZW4gdGhpcyBpcyBtb3N0IGxpa2VseSBiZWNh
dXNlCisgICAgLy8gdGhlcmUgaXMgYW4gYW5vbnltb3VzIGlubGluZS1ibG9jayBib3ggd2l0aGlu
IHRoaXMgb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIGJlZm9yZUNoaWxkLiBTbworICAgIC8vIGp1
c3QgaW5zZXJ0IHRoZSBjaGlsZCBpbnRvIHRoZSBhbm9ueW1vdXMgaW5saW5lLWJsb2NrIGJveCBp
bnN0ZWFkIG9mIGhlcmUuCisgICAgLy8gQSBzZWNvbmQgcG9zc2liaWxpdHkgaXMgdGhhdCB0aGUg
YmVmb3JlQ2hpbGQgaXMgYW4gYW5vbnltb3VzIGJsb2NrIGluc2lkZSB0aGUgYW5vbnltb3VzIGlu
bGluZSBibG9jay4KKyAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgaW5saW5lcyBhcmUgaW5zZXJ0
ZWQgaW4gYmV0d2VlbiB0d28gb2YgdGhlIGFub255bW91cyBpbmxpbmUgYmxvY2sncyBibG9jay1s
ZXZlbAorICAgIC8vIGNoaWxkcmVuIGFmdGVyIGl0IGhhcyBiZWVuIGNyZWF0ZWQuCisgICAgaWYg
KGJlZm9yZUNoaWxkICYmIGJlZm9yZUNoaWxkLT5wYXJlbnQoKSAhPSB0aGlzKSB7CisgICAgICAg
IEFTU0VSVChiZWZvcmVDaGlsZC0+cGFyZW50KCkpOworICAgICAgICBBU1NFUlQoYmVmb3JlQ2hp
bGQtPnBhcmVudCgpLT5pc0Fub255bW91c0lubGluZUJsb2NrKCkgfHwgYmVmb3JlQ2hpbGQtPnBh
cmVudCgpLT5pc0Fub255bW91c0Jsb2NrKCkpOworICAgICAgICBpZiAoYmVmb3JlQ2hpbGQtPnBh
cmVudCgpLT5pc0Fub255bW91c0lubGluZUJsb2NrKCkpIHsKKyAgICAgICAgICAgIGlmICghbmV3
Q2hpbGQtPmlzSW5saW5lKCkgfHwgKG5ld0NoaWxkLT5pc0lubGluZSgpICYmIGJlZm9yZUNoaWxk
LT5wYXJlbnQoKS0+Zmlyc3RDaGlsZCgpICE9IGJlZm9yZUNoaWxkKSkKKyAgICAgICAgICAgICAg
ICBiZWZvcmVDaGlsZC0+cGFyZW50KCktPmFkZENoaWxkKG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7
CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYWRkQ2hpbGQobmV3Q2hpbGQsIGJl
Zm9yZUNoaWxkLT5wYXJlbnQoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoYmVmb3JlQ2hpbGQtPnBh
cmVudCgpLT5pc0Fub255bW91c0Jsb2NrKCkpIHsKKyAgICAgICAgICAgIEFTU0VSVCghYmVmb3Jl
Q2hpbGQtPnBhcmVudCgpLT5wYXJlbnQoKSB8fCBiZWZvcmVDaGlsZC0+cGFyZW50KCktPnBhcmVu
dCgpLT5pc0Fub255bW91c0lubGluZUJsb2NrKCkpOworICAgICAgICAgICAgQVNTRVJUKGJlZm9y
ZUNoaWxkLT5pc0lubGluZSgpKTsKKyAgICAgICAgICAgIGlmIChuZXdDaGlsZC0+aXNJbmxpbmUo
KSB8fCAoIW5ld0NoaWxkLT5pc0lubGluZSgpICYmIGJlZm9yZUNoaWxkLT5wYXJlbnQoKS0+Zmly
c3RDaGlsZCgpICE9IGJlZm9yZUNoaWxkKSkKKyAgICAgICAgICAgICAgICBiZWZvcmVDaGlsZC0+
cGFyZW50KCktPmFkZENoaWxkKG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7CisgICAgICAgICAgICBl
bHNlCisgICAgICAgICAgICAgICAgYWRkQ2hpbGQobmV3Q2hpbGQsIGJlZm9yZUNoaWxkLT5wYXJl
bnQoKSk7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIGlmICghbmV3
Q2hpbGQtPmlzSW5saW5lKCkpIHsKKyAgICAgICAgLy8gV2UgYXJlIHBsYWNpbmcgYSBibG9jayBp
bnNpZGUgYW4gaW5saW5lLiBXZSBoYXZlIHRvIHBsYWNlIHRoZSBibG9jayBpbnNpZGUgYW4gYW5v
bnltb3VzIGlubGluZS1ibG9jay4KKyAgICAgICAgLy8gVGhpcyBpbmxpbmUtYmxvY2sgY2FuIGhv
dXNlIGEgc2VxdWVuY2Ugb2YgY29udGlndW91cyBibG9jay1sZXZlbCBjaGlsZHJlbiwgYW5kIHRo
ZXkgd2lsbCBhbGwgc2l0IG9uIHRoZQorICAgICAgICAvLyBzYW1lIGxpbmUgdG9nZXRoZXIuICBX
ZSB0cnkgdG8gcmV1c2Ugb25lIGZpcnN0IGlmIHBvc3NpYmxlLgorICAgICAgICBpZiAoYmVmb3Jl
Q2hpbGQpIHsKKyAgICAgICAgICAgIGlmIChiZWZvcmVDaGlsZC0+cHJldmlvdXNTaWJsaW5nKCkg
JiYgYmVmb3JlQ2hpbGQtPnByZXZpb3VzU2libGluZygpLT5pc0Fub255bW91c0lubGluZUJsb2Nr
KCkpIHsKKyAgICAgICAgICAgICAgICBiZWZvcmVDaGlsZC0+cHJldmlvdXNTaWJsaW5nKCktPmFk
ZENoaWxkKG5ld0NoaWxkKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9
CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobGFzdENoaWxkKCkgJiYgbGFzdENo
aWxkKCktPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkgeworICAgICAgICAgICAgICAgIGxhc3RD
aGlsZCgpLT5hZGRDaGlsZChuZXdDaGlsZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAg
ICAgICAgICAgfQorICAgICAgICB9CisgCisgICAgICAgIGlmICghbmV3Q2hpbGQtPmlzRmxvYXRp
bmdPclBvc2l0aW9uZWQoKSkgeworICAgICAgICAgICAgLy8gVGhlcmUgd2FzIG5vIHN1aXRhYmxl
IGV4aXN0aW5nIGFub255bW91cyBib3guICBDcmVhdGUgYSBuZXcgb25lLgorICAgICAgICAgICAg
UmVmUHRyPFJlbmRlclN0eWxlPiBuZXdTdHlsZSA9IFJlbmRlclN0eWxlOjpjcmVhdGUoKTsKKyAg
ICAgICAgICAgIG5ld1N0eWxlLT5pbmhlcml0RnJvbShzdHlsZSgpKTsKKyAgICAgICAgICAgIG5l
d1N0eWxlLT5zZXREaXNwbGF5KElOTElORV9CTE9DSyk7CisgICAgICAgICAgICBSZW5kZXJCbG9j
ayogbmV3Qm94ID0gbmV3IChyZW5kZXJBcmVuYSgpKSBSZW5kZXJCbG9jayhkb2N1bWVudCgpKTsK
KyAgICAgICAgICAgIG5ld0JveC0+c2V0U3R5bGUobmV3U3R5bGUpOworICAgICAgICAgICAgUmVu
ZGVyQm94TW9kZWxPYmplY3Q6OmFkZENoaWxkKG5ld0JveCwgYmVmb3JlQ2hpbGQpOworICAgICAg
ICAgICAgbmV3Qm94LT5hZGRDaGlsZChuZXdDaGlsZCk7CisgICAgICAgICAgICByZXR1cm47Cisg
ICAgICAgIH0KKyAgICB9CisKICAgICBSZW5kZXJCb3hNb2RlbE9iamVjdDo6YWRkQ2hpbGQobmV3
Q2hpbGQsIGJlZm9yZUNoaWxkKTsKIAogICAgIG5ld0NoaWxkLT5zZXROZWVkc0xheW91dEFuZFBy
ZWZXaWR0aHNSZWNhbGMoKTsKQEAgLTIyMSwxODggKzE4Niw2IEBAIFJlbmRlcklubGluZSogUmVu
ZGVySW5saW5lOjpjbG9uZUlubGluZSgKICAgICByZXR1cm4gbzsKIH0KIAotdm9pZCBSZW5kZXJJ
bmxpbmU6OnNwbGl0SW5saW5lcyhSZW5kZXJCbG9jayogZnJvbUJsb2NrLCBSZW5kZXJCbG9jayog
dG9CbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVuZGVyQmxvY2sqIG1p
ZGRsZUJsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXJPYmplY3Qq
IGJlZm9yZUNoaWxkLCBSZW5kZXJCb3hNb2RlbE9iamVjdCogb2xkQ29udCkKLXsKLSAgICAvLyBD
cmVhdGUgYSBjbG9uZSBvZiB0aGlzIGlubGluZS4KLSAgICBSZW5kZXJJbmxpbmUqIGNsb25lID0g
Y2xvbmVJbmxpbmUodGhpcyk7Ci0gICAgY2xvbmUtPnNldENvbnRpbnVhdGlvbihvbGRDb250KTsK
LQotICAgIC8vIE5vdyB0YWtlIGFsbCBvZiB0aGUgY2hpbGRyZW4gZnJvbSBiZWZvcmVDaGlsZCB0
byB0aGUgZW5kIGFuZCByZW1vdmUKLSAgICAvLyB0aGVtIGZyb20gfHRoaXN8IGFuZCBwbGFjZSB0
aGVtIGluIHRoZSBjbG9uZS4KLSAgICBSZW5kZXJPYmplY3QqIG8gPSBiZWZvcmVDaGlsZDsKLSAg
ICB3aGlsZSAobykgewotICAgICAgICBSZW5kZXJPYmplY3QqIHRtcCA9IG87Ci0gICAgICAgIG8g
PSB0bXAtPm5leHRTaWJsaW5nKCk7Ci0gICAgICAgIGNsb25lLT5hZGRDaGlsZElnbm9yaW5nQ29u
dGludWF0aW9uKGNoaWxkcmVuKCktPnJlbW92ZUNoaWxkTm9kZSh0aGlzLCB0bXApLCAwKTsKLSAg
ICAgICAgdG1wLT5zZXROZWVkc0xheW91dEFuZFByZWZXaWR0aHNSZWNhbGMoKTsKLSAgICB9Ci0K
LSAgICAvLyBIb29rIHxjbG9uZXwgdXAgYXMgdGhlIGNvbnRpbnVhdGlvbiBvZiB0aGUgbWlkZGxl
IGJsb2NrLgotICAgIG1pZGRsZUJsb2NrLT5zZXRJbmxpbmVDb250aW51YXRpb24oY2xvbmUpOwot
Ci0gICAgLy8gV2UgaGF2ZSBiZWVuIHJlcGFyZW50ZWQgYW5kIGFyZSBub3cgdW5kZXIgdGhlIGZy
b21CbG9jay4gIFdlIG5lZWQKLSAgICAvLyB0byB3YWxrIHVwIG91ciBpbmxpbmUgcGFyZW50IGNo
YWluIHVudGlsIHdlIGhpdCB0aGUgY29udGFpbmluZyBibG9jay4KLSAgICAvLyBPbmNlIHdlIGhp
dCB0aGUgY29udGFpbmluZyBibG9jayB3ZSdyZSBkb25lLgotICAgIFJlbmRlckJveE1vZGVsT2Jq
ZWN0KiBjdXJyID0gdG9SZW5kZXJCb3hNb2RlbE9iamVjdChwYXJlbnQoKSk7Ci0gICAgUmVuZGVy
Qm94TW9kZWxPYmplY3QqIGN1cnJDaGlsZCA9IHRoaXM7Ci0gICAgCi0gICAgLy8gRklYTUU6IEJl
Y2F1c2Ugc3BsaXR0aW5nIGlzIE8obl4yKSBhcyB0YWdzIG5lc3QgcGF0aG9sb2dpY2FsbHksIHdl
IGNhcCB0aGUgZGVwdGggYXQgd2hpY2ggd2UncmUgd2lsbGluZyB0byBjbG9uZS4KLSAgICAvLyBU
aGVyZSB3aWxsIGV2ZW50dWFsbHkgYmUgYSBiZXR0ZXIgYXBwcm9hY2ggdG8gdGhpcyBwcm9ibGVt
IHRoYXQgd2lsbCBsZXQgdXMgbmVzdCB0byBhIG11Y2gKLSAgICAvLyBncmVhdGVyIGRlcHRoIChz
ZWUgYnVnemlsbGEgYnVnIDEzNDMwKSBidXQgZm9yIG5vdyB3ZSBoYXZlIGEgbGltaXQuICBUaGlz
ICp3aWxsKiByZXN1bHQgaW4KLSAgICAvLyBpbmNvcnJlY3QgcmVuZGVyaW5nLCBidXQgdGhlIGFs
dGVybmF0aXZlIGlzIHRvIGhhbmcgZm9yZXZlci4KLSAgICB1bnNpZ25lZCBzcGxpdERlcHRoID0g
MTsKLSAgICBjb25zdCB1bnNpZ25lZCBjTWF4U3BsaXREZXB0aCA9IDIwMDsgCi0gICAgd2hpbGUg
KGN1cnIgJiYgY3VyciAhPSBmcm9tQmxvY2spIHsKLSAgICAgICAgQVNTRVJUKGN1cnItPmlzUmVu
ZGVySW5saW5lKCkpOwotICAgICAgICBpZiAoc3BsaXREZXB0aCA8IGNNYXhTcGxpdERlcHRoKSB7
Ci0gICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgY2xvbmUuCi0gICAgICAgICAgICBSZW5kZXJJ
bmxpbmUqIGNsb25lQ2hpbGQgPSBjbG9uZTsKLSAgICAgICAgICAgIGNsb25lID0gY2xvbmVJbmxp
bmUodG9SZW5kZXJJbmxpbmUoY3VycikpOwotCi0gICAgICAgICAgICAvLyBJbnNlcnQgb3VyIGNo
aWxkIGNsb25lIGFzIHRoZSBmaXJzdCBjaGlsZC4KLSAgICAgICAgICAgIGNsb25lLT5hZGRDaGls
ZElnbm9yaW5nQ29udGludWF0aW9uKGNsb25lQ2hpbGQsIDApOwotCi0gICAgICAgICAgICAvLyBI
b29rIHRoZSBjbG9uZSB1cCBhcyBhIGNvbnRpbnVhdGlvbiBvZiB8Y3VycnwuCi0gICAgICAgICAg
ICBSZW5kZXJJbmxpbmUqIGlubGluZUN1cnIgPSB0b1JlbmRlcklubGluZShjdXJyKTsKLSAgICAg
ICAgICAgIG9sZENvbnQgPSBpbmxpbmVDdXJyLT5jb250aW51YXRpb24oKTsKLSAgICAgICAgICAg
IGlubGluZUN1cnItPnNldENvbnRpbnVhdGlvbihjbG9uZSk7Ci0gICAgICAgICAgICBjbG9uZS0+
c2V0Q29udGludWF0aW9uKG9sZENvbnQpOwotCi0gICAgICAgICAgICAvLyBTb21lb25lIG1heSBo
YXZlIGluZGlyZWN0bHkgY2F1c2VkIGEgPHE+IHRvIHNwbGl0LiAgV2hlbiB0aGlzIGhhcHBlbnMs
IHRoZSA6YWZ0ZXIgY29udGVudAotICAgICAgICAgICAgLy8gaGFzIHRvIG1vdmUgaW50byB0aGUg
aW5saW5lIGNvbnRpbnVhdGlvbi4gIENhbGwgdXBkYXRlQmVmb3JlQWZ0ZXJDb250ZW50IHRvIGVu
c3VyZSB0aGF0IHRoZSBpbmxpbmUncyA6YWZ0ZXIKLSAgICAgICAgICAgIC8vIGNvbnRlbnQgZ2V0
cyBwcm9wZXJseSBkZXN0cm95ZWQuCi0gICAgICAgICAgICBpZiAoZG9jdW1lbnQoKS0+dXNlc0Jl
Zm9yZUFmdGVyUnVsZXMoKSkKLSAgICAgICAgICAgICAgICBpbmxpbmVDdXJyLT5jaGlsZHJlbigp
LT51cGRhdGVCZWZvcmVBZnRlckNvbnRlbnQodGhpcywgQUZURVIpOwotCi0gICAgICAgICAgICAv
LyBOb3cgd2UgbmVlZCB0byB0YWtlIGFsbCBvZiB0aGUgY2hpbGRyZW4gc3RhcnRpbmcgZnJvbSB0
aGUgZmlyc3QgY2hpbGQKLSAgICAgICAgICAgIC8vICphZnRlciogY3VyckNoaWxkIGFuZCBhcHBl
bmQgdGhlbSBhbGwgdG8gdGhlIGNsb25lLgotICAgICAgICAgICAgbyA9IGN1cnJDaGlsZC0+bmV4
dFNpYmxpbmcoKTsKLSAgICAgICAgICAgIHdoaWxlIChvKSB7Ci0gICAgICAgICAgICAgICAgUmVu
ZGVyT2JqZWN0KiB0bXAgPSBvOwotICAgICAgICAgICAgICAgIG8gPSB0bXAtPm5leHRTaWJsaW5n
KCk7Ci0gICAgICAgICAgICAgICAgY2xvbmUtPmFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24o
aW5saW5lQ3Vyci0+Y2hpbGRyZW4oKS0+cmVtb3ZlQ2hpbGROb2RlKGN1cnIsIHRtcCksIDApOwot
ICAgICAgICAgICAgICAgIHRtcC0+c2V0TmVlZHNMYXlvdXRBbmRQcmVmV2lkdGhzUmVjYWxjKCk7
Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIEtlZXAgd2Fs
a2luZyB1cCB0aGUgY2hhaW4uCi0gICAgICAgIGN1cnJDaGlsZCA9IGN1cnI7Ci0gICAgICAgIGN1
cnIgPSB0b1JlbmRlckJveE1vZGVsT2JqZWN0KGN1cnItPnBhcmVudCgpKTsKLSAgICAgICAgc3Bs
aXREZXB0aCsrOwotICAgIH0KLQotICAgIC8vIE5vdyB3ZSBhcmUgYXQgdGhlIGJsb2NrIGxldmVs
LiBXZSBuZWVkIHRvIHB1dCB0aGUgY2xvbmUgaW50byB0aGUgdG9CbG9jay4KLSAgICB0b0Jsb2Nr
LT5jaGlsZHJlbigpLT5hcHBlbmRDaGlsZE5vZGUodG9CbG9jaywgY2xvbmUpOwotCi0gICAgLy8g
Tm93IHRha2UgYWxsIHRoZSBjaGlsZHJlbiBhZnRlciBjdXJyQ2hpbGQgYW5kIHJlbW92ZSB0aGVt
IGZyb20gdGhlIGZyb21CbG9jawotICAgIC8vIGFuZCBwdXQgdGhlbSBpbiB0aGUgdG9CbG9jay4K
LSAgICBvID0gY3VyckNoaWxkLT5uZXh0U2libGluZygpOwotICAgIHdoaWxlIChvKSB7Ci0gICAg
ICAgIFJlbmRlck9iamVjdCogdG1wID0gbzsKLSAgICAgICAgbyA9IHRtcC0+bmV4dFNpYmxpbmco
KTsKLSAgICAgICAgdG9CbG9jay0+Y2hpbGRyZW4oKS0+YXBwZW5kQ2hpbGROb2RlKHRvQmxvY2ss
IGZyb21CbG9jay0+Y2hpbGRyZW4oKS0+cmVtb3ZlQ2hpbGROb2RlKGZyb21CbG9jaywgdG1wKSk7
Ci0gICAgfQotfQotCi12b2lkIFJlbmRlcklubGluZTo6c3BsaXRGbG93KFJlbmRlck9iamVjdCog
YmVmb3JlQ2hpbGQsIFJlbmRlckJsb2NrKiBuZXdCbG9ja0JveCwKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgUmVuZGVyT2JqZWN0KiBuZXdDaGlsZCwgUmVuZGVyQm94TW9kZWxPYmplY3Qq
IG9sZENvbnQpCi17Ci0gICAgUmVuZGVyQmxvY2sqIHByZSA9IDA7Ci0gICAgUmVuZGVyQmxvY2sq
IGJsb2NrID0gY29udGFpbmluZ0Jsb2NrKCk7Ci0gICAgCi0gICAgLy8gRGVsZXRlIG91ciBsaW5l
IGJveGVzIGJlZm9yZSB3ZSBkbyB0aGUgaW5saW5lIHNwbGl0IGludG8gY29udGludWF0aW9ucy4K
LSAgICBibG9jay0+ZGVsZXRlTGluZUJveFRyZWUoKTsKLSAgICAKLSAgICBib29sIG1hZGVOZXdC
ZWZvcmVCbG9jayA9IGZhbHNlOwotICAgIGlmIChibG9jay0+aXNBbm9ueW1vdXNCbG9jaygpICYm
ICghYmxvY2stPnBhcmVudCgpIHx8ICFibG9jay0+cGFyZW50KCktPmNyZWF0ZXNBbm9ueW1vdXNX
cmFwcGVyKCkpKSB7Ci0gICAgICAgIC8vIFdlIGNhbiByZXVzZSB0aGlzIGJsb2NrIGFuZCBtYWtl
IGl0IHRoZSBwcmVCbG9jayBvZiB0aGUgbmV4dCBjb250aW51YXRpb24uCi0gICAgICAgIHByZSA9
IGJsb2NrOwotICAgICAgICBwcmUtPnJlbW92ZVBvc2l0aW9uZWRPYmplY3RzKDApOwotICAgICAg
ICBibG9jayA9IGJsb2NrLT5jb250YWluaW5nQmxvY2soKTsKLSAgICB9IGVsc2UgewotICAgICAg
ICAvLyBObyBhbm9ueW1vdXMgYmxvY2sgYXZhaWxhYmxlIGZvciB1c2UuICBNYWtlIG9uZS4KLSAg
ICAgICAgcHJlID0gYmxvY2stPmNyZWF0ZUFub255bW91c0Jsb2NrKCk7Ci0gICAgICAgIG1hZGVO
ZXdCZWZvcmVCbG9jayA9IHRydWU7Ci0gICAgfQotCi0gICAgUmVuZGVyQmxvY2sqIHBvc3QgPSBi
bG9jay0+Y3JlYXRlQW5vbnltb3VzQmxvY2soKTsKLQotICAgIFJlbmRlck9iamVjdCogYm94Rmly
c3QgPSBtYWRlTmV3QmVmb3JlQmxvY2sgPyBibG9jay0+Zmlyc3RDaGlsZCgpIDogcHJlLT5uZXh0
U2libGluZygpOwotICAgIGlmIChtYWRlTmV3QmVmb3JlQmxvY2spCi0gICAgICAgIGJsb2NrLT5j
aGlsZHJlbigpLT5pbnNlcnRDaGlsZE5vZGUoYmxvY2ssIHByZSwgYm94Rmlyc3QpOwotICAgIGJs
b2NrLT5jaGlsZHJlbigpLT5pbnNlcnRDaGlsZE5vZGUoYmxvY2ssIG5ld0Jsb2NrQm94LCBib3hG
aXJzdCk7Ci0gICAgYmxvY2stPmNoaWxkcmVuKCktPmluc2VydENoaWxkTm9kZShibG9jaywgcG9z
dCwgYm94Rmlyc3QpOwotICAgIGJsb2NrLT5zZXRDaGlsZHJlbklubGluZShmYWxzZSk7Ci0gICAg
Ci0gICAgaWYgKG1hZGVOZXdCZWZvcmVCbG9jaykgewotICAgICAgICBSZW5kZXJPYmplY3QqIG8g
PSBib3hGaXJzdDsKLSAgICAgICAgd2hpbGUgKG8pIHsKLSAgICAgICAgICAgIFJlbmRlck9iamVj
dCogbm8gPSBvOwotICAgICAgICAgICAgbyA9IG5vLT5uZXh0U2libGluZygpOwotICAgICAgICAg
ICAgcHJlLT5jaGlsZHJlbigpLT5hcHBlbmRDaGlsZE5vZGUocHJlLCBibG9jay0+Y2hpbGRyZW4o
KS0+cmVtb3ZlQ2hpbGROb2RlKGJsb2NrLCBubykpOwotICAgICAgICAgICAgbm8tPnNldE5lZWRz
TGF5b3V0QW5kUHJlZldpZHRoc1JlY2FsYygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3Bs
aXRJbmxpbmVzKHByZSwgcG9zdCwgbmV3QmxvY2tCb3gsIGJlZm9yZUNoaWxkLCBvbGRDb250KTsK
LQotICAgIC8vIFdlIGFscmVhZHkga25vdyB0aGUgbmV3QmxvY2tCb3ggaXNuJ3QgZ29pbmcgdG8g
Y29udGFpbiBpbmxpbmUga2lkcywgc28gYXZvaWQgd2FzdGluZwotICAgIC8vIHRpbWUgaW4gbWFr
ZUNoaWxkcmVuTm9uSW5saW5lIGJ5IGp1c3Qgc2V0dGluZyB0aGlzIGV4cGxpY2l0bHkgdXAgZnJv
bnQuCi0gICAgbmV3QmxvY2tCb3gtPnNldENoaWxkcmVuSW5saW5lKGZhbHNlKTsKLQotICAgIC8v
IFdlIGRlbGF5ZWQgYWRkaW5nIHRoZSBuZXdDaGlsZCB1bnRpbCBub3cgc28gdGhhdCB0aGUgfG5l
d0Jsb2NrQm94fCB3b3VsZCBiZSBmdWxseQotICAgIC8vIGNvbm5lY3RlZCwgdGh1cyBhbGxvd2lu
ZyBuZXdDaGlsZCBhY2Nlc3MgdG8gYSByZW5kZXJBcmVuYSBzaG91bGQgaXQgbmVlZAotICAgIC8v
IHRvIHdyYXAgaXRzZWxmIGluIGFkZGl0aW9uYWwgYm94ZXMgKGUuZy4sIHRhYmxlIGNvbnN0cnVj
dGlvbikuCi0gICAgbmV3QmxvY2tCb3gtPmFkZENoaWxkKG5ld0NoaWxkKTsKLQotICAgIC8vIEFs
d2F5cyBqdXN0IGRvIGEgZnVsbCBsYXlvdXQgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgbGluZSBi
b3hlcyAoZXNwZWNpYWxseSB3cmFwcGVycyBmb3IgaW1hZ2VzKQotICAgIC8vIGdldCBkZWxldGVk
IHByb3Blcmx5LiAgQmVjYXVzZSBvYmplY3RzIG1vdmVzIGZyb20gdGhlIHByZSBibG9jayBpbnRv
IHRoZSBwb3N0IGJsb2NrLCB3ZSB3YW50IHRvCi0gICAgLy8gbWFrZSBuZXcgbGluZSBib3hlcyBp
bnN0ZWFkIG9mIGxlYXZpbmcgdGhlIG9sZCBsaW5lIGJveGVzIGFyb3VuZC4KLSAgICBwcmUtPnNl
dE5lZWRzTGF5b3V0QW5kUHJlZldpZHRoc1JlY2FsYygpOwotICAgIGJsb2NrLT5zZXROZWVkc0xh
eW91dEFuZFByZWZXaWR0aHNSZWNhbGMoKTsKLSAgICBwb3N0LT5zZXROZWVkc0xheW91dEFuZFBy
ZWZXaWR0aHNSZWNhbGMoKTsKLX0KLQotdm9pZCBSZW5kZXJJbmxpbmU6OmFkZENoaWxkVG9Db250
aW51YXRpb24oUmVuZGVyT2JqZWN0KiBuZXdDaGlsZCwgUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGls
ZCkKLXsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogZmxvdyA9IGNvbnRpbnVhdGlvbkJlZm9y
ZShiZWZvcmVDaGlsZCk7Ci0gICAgQVNTRVJUKCFiZWZvcmVDaGlsZCB8fCBiZWZvcmVDaGlsZC0+
cGFyZW50KCktPmlzUmVuZGVyQmxvY2soKSB8fCBiZWZvcmVDaGlsZC0+cGFyZW50KCktPmlzUmVu
ZGVySW5saW5lKCkpOwotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBiZWZvcmVDaGlsZFBhcmVu
dCA9IDA7Ci0gICAgaWYgKGJlZm9yZUNoaWxkKQotICAgICAgICBiZWZvcmVDaGlsZFBhcmVudCA9
IHRvUmVuZGVyQm94TW9kZWxPYmplY3QoYmVmb3JlQ2hpbGQtPnBhcmVudCgpKTsKLSAgICBlbHNl
IHsKLSAgICAgICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGNvbnQgPSBuZXh0Q29udGludWF0aW9u
KGZsb3cpOwotICAgICAgICBpZiAoY29udCkKLSAgICAgICAgICAgIGJlZm9yZUNoaWxkUGFyZW50
ID0gY29udDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYmVmb3JlQ2hpbGRQYXJlbnQgPSBm
bG93OwotICAgIH0KLQotICAgIGlmIChuZXdDaGlsZC0+aXNGbG9hdGluZ09yUG9zaXRpb25lZCgp
KQotICAgICAgICByZXR1cm4gYmVmb3JlQ2hpbGRQYXJlbnQtPmFkZENoaWxkSWdub3JpbmdDb250
aW51YXRpb24obmV3Q2hpbGQsIGJlZm9yZUNoaWxkKTsKLQotICAgIC8vIEEgY29udGludWF0aW9u
IGFsd2F5cyBjb25zaXN0cyBvZiB0d28gcG90ZW50aWFsIGNhbmRpZGF0ZXM6IGFuIGlubGluZSBv
ciBhbiBhbm9ueW1vdXMKLSAgICAvLyBibG9jayBib3ggaG9sZGluZyBibG9jayBjaGlsZHJlbi4K
LSAgICBib29sIGNoaWxkSW5saW5lID0gbmV3Q2hpbGQtPmlzSW5saW5lKCk7Ci0gICAgYm9vbCBi
Y3BJbmxpbmUgPSBiZWZvcmVDaGlsZFBhcmVudC0+aXNJbmxpbmUoKTsKLSAgICBib29sIGZsb3dJ
bmxpbmUgPSBmbG93LT5pc0lubGluZSgpOwotCi0gICAgaWYgKGZsb3cgPT0gYmVmb3JlQ2hpbGRQ
YXJlbnQpCi0gICAgICAgIHJldHVybiBmbG93LT5hZGRDaGlsZElnbm9yaW5nQ29udGludWF0aW9u
KG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8vIFRoZSBnb2Fs
IGhlcmUgaXMgdG8gbWF0Y2ggdXAgaWYgd2UgY2FuLCBzbyB0aGF0IHdlIGNhbiBjb2FsZXNjZSBh
bmQgY3JlYXRlIHRoZQotICAgICAgICAvLyBtaW5pbWFsICMgb2YgY29udGludWF0aW9ucyBuZWVk
ZWQgZm9yIHRoZSBpbmxpbmUuCi0gICAgICAgIGlmIChjaGlsZElubGluZSA9PSBiY3BJbmxpbmUp
Ci0gICAgICAgICAgICByZXR1cm4gYmVmb3JlQ2hpbGRQYXJlbnQtPmFkZENoaWxkSWdub3JpbmdD
b250aW51YXRpb24obmV3Q2hpbGQsIGJlZm9yZUNoaWxkKTsKLSAgICAgICAgZWxzZSBpZiAoZmxv
d0lubGluZSA9PSBjaGlsZElubGluZSkKLSAgICAgICAgICAgIHJldHVybiBmbG93LT5hZGRDaGls
ZElnbm9yaW5nQ29udGludWF0aW9uKG5ld0NoaWxkLCAwKTsgLy8gSnVzdCB0cmVhdCBsaWtlIGFu
IGFwcGVuZC4KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIGJlZm9yZUNoaWxkUGFy
ZW50LT5hZGRDaGlsZElnbm9yaW5nQ29udGludWF0aW9uKG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7
Ci0gICAgfQotfQotCiB2b2lkIFJlbmRlcklubGluZTo6cGFpbnQoUGFpbnRJbmZvJiBwYWludElu
Zm8sIGludCB0eCwgaW50IHR5KQogewogICAgIG1fbGluZUJveGVzLnBhaW50KHRoaXMsIHBhaW50
SW5mbywgdHgsIHR5KTsKQEAgLTQxNSwxNiArMTk4LDYgQEAgdm9pZCBSZW5kZXJJbmxpbmU6OmFi
c29sdXRlUmVjdHMoVmVjdG9yPAogICAgICAgICAgICAgcmVjdHMuYXBwZW5kKEludFJlY3QodHgg
KyBjdXJyLT54KCksIHR5ICsgY3Vyci0+eSgpLCBjdXJyLT53aWR0aCgpLCBjdXJyLT5oZWlnaHQo
KSkpOwogICAgIH0gZWxzZQogICAgICAgICByZWN0cy5hcHBlbmQoSW50UmVjdCh0eCwgdHksIDAs
IDApKTsKLQotICAgIGlmIChjb250aW51YXRpb24oKSkgewotICAgICAgICBpZiAoY29udGludWF0
aW9uKCktPmlzQm94KCkpIHsKLSAgICAgICAgICAgIFJlbmRlckJveCogYm94ID0gdG9SZW5kZXJC
b3goY29udGludWF0aW9uKCkpOwotICAgICAgICAgICAgY29udGludWF0aW9uKCktPmFic29sdXRl
UmVjdHMocmVjdHMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
dHggLSBjb250YWluaW5nQmxvY2soKS0+eCgpICsgYm94LT54KCksCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB0eSAtIGNvbnRhaW5pbmdCbG9jaygpLT55KCkgKyBi
b3gtPnkoKSk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgY29udGludWF0aW9uKCktPmFi
c29sdXRlUmVjdHMocmVjdHMsIHR4IC0gY29udGFpbmluZ0Jsb2NrKCktPngoKSwgdHkgLSBjb250
YWluaW5nQmxvY2soKS0+eSgpKTsKLSAgICB9CiB9CiAKIHZvaWQgUmVuZGVySW5saW5lOjphYnNv
bHV0ZVF1YWRzKFZlY3RvcjxGbG9hdFF1YWQ+JiBxdWFkcykKQEAgLTQzNiw5ICsyMDksNiBAQCB2
b2lkIFJlbmRlcklubGluZTo6YWJzb2x1dGVRdWFkcyhWZWN0b3I8CiAgICAgICAgIH0KICAgICB9
IGVsc2UKICAgICAgICAgcXVhZHMuYXBwZW5kKGxvY2FsVG9BYnNvbHV0ZVF1YWQoRmxvYXRSZWN0
KCkpKTsKLQotICAgIGlmIChjb250aW51YXRpb24oKSkKLSAgICAgICAgY29udGludWF0aW9uKCkt
PmFic29sdXRlUXVhZHMocXVhZHMpOwogfQogCiBpbnQgUmVuZGVySW5saW5lOjpvZmZzZXRMZWZ0
KCkgY29uc3QKQEAgLTUwNywxOCArMjc3LDYgQEAgVmlzaWJsZVBvc2l0aW9uIFJlbmRlcklubGlu
ZTo6cG9zaXRpb25GbwogICAgICAgICAvLyBzaG91bGQgdHJ5IHRvIGZpbmQgYSByZXN1bHQgYnkg
YXNraW5nIG91ciBjb250YWluaW5nIGJsb2NrLgogICAgICAgICByZXR1cm4gY2ItPnBvc2l0aW9u
Rm9yUG9pbnQocG9pbnQpOwogICAgIH0KLQotICAgIC8vIFRyYW5zbGF0ZSB0aGUgY29vcmRzIGZy
b20gdGhlIHByZS1hbm9ueW1vdXMgYmxvY2sgdG8gdGhlIHBvc3QtYW5vbnltb3VzIGJsb2NrLgot
ICAgIGludCBwYXJlbnRCbG9ja1ggPSBjYi0+eCgpICsgcG9pbnQueCgpOwotICAgIGludCBwYXJl
bnRCbG9ja1kgPSBjYi0+eSgpICsgcG9pbnQueSgpOwotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0
KiBjID0gY29udGludWF0aW9uKCk7Ci0gICAgd2hpbGUgKGMpIHsKLSAgICAgICAgUmVuZGVyQm94
KiBjb250QmxvY2sgPSBjLT5pc0lubGluZSgpID8gYy0+Y29udGFpbmluZ0Jsb2NrKCkgOiB0b1Jl
bmRlckJsb2NrKGMpOwotICAgICAgICBpZiAoYy0+aXNJbmxpbmUoKSB8fCBjLT5maXJzdENoaWxk
KCkpCi0gICAgICAgICAgICByZXR1cm4gYy0+cG9zaXRpb25Gb3JDb29yZGluYXRlcyhwYXJlbnRC
bG9ja1ggLSBjb250QmxvY2stPngoKSwgcGFyZW50QmxvY2tZIC0gY29udEJsb2NrLT55KCkpOwot
ICAgICAgICBjID0gdG9SZW5kZXJCbG9jayhjKS0+aW5saW5lQ29udGludWF0aW9uKCk7Ci0gICAg
fQotICAgIAogICAgIHJldHVybiBSZW5kZXJCb3hNb2RlbE9iamVjdDo6cG9zaXRpb25Gb3JQb2lu
dChwb2ludCk7CiB9CiAKQEAgLTU3MSw3ICszMjksNyBAQCBJbnRSZWN0IFJlbmRlcklubGluZTo6
Y2xpcHBlZE92ZXJmbG93UmVjCiAgICAgLy8gT25seSBydW4taW5zIGFyZSBhbGxvd2VkIGluIGhl
cmUgZHVyaW5nIGxheW91dC4KICAgICBBU1NFUlQoIXZpZXcoKSB8fCAhdmlldygpLT5sYXlvdXRT
dGF0ZUVuYWJsZWQoKSB8fCBpc1J1bkluKCkpOwogCi0gICAgaWYgKCFmaXJzdExpbmVCb3goKSAm
JiAhY29udGludWF0aW9uKCkpCisgICAgaWYgKCFmaXJzdExpbmVCb3goKSkKICAgICAgICAgcmV0
dXJuIEludFJlY3QoKTsKIAogICAgIC8vIEZpbmQgb3VyIGxlZnRtb3N0IHBvc2l0aW9uLgpAQCAt
NjE5LDExICszNzcsNiBAQCBJbnRSZWN0IFJlbmRlcklubGluZTo6Y2xpcHBlZE92ZXJmbG93UmVj
CiAgICAgICAgICAgICAgICAgci51bml0ZShjaGlsZFJlY3QpOwogICAgICAgICAgICAgfQogICAg
ICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbnRpbnVhdGlvbigpICYmICFjb250aW51YXRpb24oKS0+
aXNJbmxpbmUoKSkgewotICAgICAgICAgICAgSW50UmVjdCBjb250UmVjdCA9IGNvbnRpbnVhdGlv
bigpLT5yZWN0V2l0aE91dGxpbmVGb3JSZXBhaW50KHJlcGFpbnRDb250YWluZXIsIG93KTsKLSAg
ICAgICAgICAgIHIudW5pdGUoY29udFJlY3QpOwotICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0
dXJuIHI7CkBAIC03OTYsNDkgKzU0OSw2IEBAIHZvaWQgUmVuZGVySW5saW5lOjptYXBBYnNvbHV0
ZVRvTG9jYWxQb2kKICAgICAgICAgdHJhbnNmb3JtU3RhdGUubW92ZSgtY29udGFpbmVyT2Zmc2V0
LndpZHRoKCksIC1jb250YWluZXJPZmZzZXQuaGVpZ2h0KCksIHByZXNlcnZlM0QgPyBUcmFuc2Zv
cm1TdGF0ZTo6QWNjdW11bGF0ZVRyYW5zZm9ybSA6IFRyYW5zZm9ybVN0YXRlOjpGbGF0dGVuVHJh
bnNmb3JtKTsKIH0KIAotdm9pZCBSZW5kZXJJbmxpbmU6OnVwZGF0ZURyYWdTdGF0ZShib29sIGRy
YWdPbikKLXsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdDo6dXBkYXRlRHJhZ1N0YXRlKGRyYWdP
bik7Ci0gICAgaWYgKGNvbnRpbnVhdGlvbigpKQotICAgICAgICBjb250aW51YXRpb24oKS0+dXBk
YXRlRHJhZ1N0YXRlKGRyYWdPbik7Ci19Ci0KLXZvaWQgUmVuZGVySW5saW5lOjpjaGlsZEJlY2Ft
ZU5vbklubGluZShSZW5kZXJPYmplY3QqIGNoaWxkKQotewotICAgIC8vIFdlIGhhdmUgdG8gc3Bs
aXQgdGhlIHBhcmVudCBmbG93LgotICAgIFJlbmRlckJsb2NrKiBuZXdCb3ggPSBjb250YWluaW5n
QmxvY2soKS0+Y3JlYXRlQW5vbnltb3VzQmxvY2soKTsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVj
dCogb2xkQ29udGludWF0aW9uID0gY29udGludWF0aW9uKCk7Ci0gICAgc2V0Q29udGludWF0aW9u
KG5ld0JveCk7Ci0gICAgUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCA9IGNoaWxkLT5uZXh0U2li
bGluZygpOwotICAgIGNoaWxkcmVuKCktPnJlbW92ZUNoaWxkTm9kZSh0aGlzLCBjaGlsZCk7Ci0g
ICAgc3BsaXRGbG93KGJlZm9yZUNoaWxkLCBuZXdCb3gsIGNoaWxkLCBvbGRDb250aW51YXRpb24p
OwotfQotCi12b2lkIFJlbmRlcklubGluZTo6dXBkYXRlSGl0VGVzdFJlc3VsdChIaXRUZXN0UmVz
dWx0JiByZXN1bHQsIGNvbnN0IEludFBvaW50JiBwb2ludCkKLXsKLSAgICBpZiAocmVzdWx0Lmlu
bmVyTm9kZSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBOb2RlKiBuID0gbm9kZSgpOwotICAg
IEludFBvaW50IGxvY2FsUG9pbnQocG9pbnQpOwotICAgIGlmIChuKSB7Ci0gICAgICAgIGlmIChp
c0lubGluZUNvbnRpbnVhdGlvbigpKSB7Ci0gICAgICAgICAgICAvLyBXZSdyZSBpbiB0aGUgY29u
dGludWF0aW9uIG9mIGEgc3BsaXQgaW5saW5lLiAgQWRqdXN0IG91ciBsb2NhbCBwb2ludCB0byBi
ZSBpbiB0aGUgY29vcmRpbmF0ZSBzcGFjZQotICAgICAgICAgICAgLy8gb2YgdGhlIHByaW5jaXBh
bCByZW5kZXJlcidzIGNvbnRhaW5pbmcgYmxvY2suICBUaGlzIHdpbGwgZW5kIHVwIGJlaW5nIHRo
ZSBpbm5lck5vblNoYXJlZE5vZGUuCi0gICAgICAgICAgICBSZW5kZXJCbG9jayogZmlyc3RCbG9j
ayA9IG4tPnJlbmRlcmVyKCktPmNvbnRhaW5pbmdCbG9jaygpOwotICAgICAgICAgICAgCi0gICAg
ICAgICAgICAvLyBHZXQgb3VyIGNvbnRhaW5pbmcgYmxvY2suCi0gICAgICAgICAgICBSZW5kZXJC
b3gqIGJsb2NrID0gY29udGFpbmluZ0Jsb2NrKCk7Ci0gICAgICAgICAgICBsb2NhbFBvaW50Lm1v
dmUoYmxvY2stPngoKSAtIGZpcnN0QmxvY2stPngoKSwgYmxvY2stPnkoKSAtIGZpcnN0QmxvY2st
PnkoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQuc2V0SW5uZXJOb2RlKG4pOwotICAg
ICAgICBpZiAoIXJlc3VsdC5pbm5lck5vblNoYXJlZE5vZGUoKSkKLSAgICAgICAgICAgIHJlc3Vs
dC5zZXRJbm5lck5vblNoYXJlZE5vZGUobik7Ci0gICAgICAgIHJlc3VsdC5zZXRMb2NhbFBvaW50
KGxvY2FsUG9pbnQpOwotICAgIH0KLX0KLQogdm9pZCBSZW5kZXJJbmxpbmU6OmRpcnR5TGluZUJv
eGVzKGJvb2wgZnVsbExheW91dCkKIHsKICAgICBpZiAoZnVsbExheW91dCkKQEAgLTk1MSwyMCAr
NjYxLDkgQEAgdm9pZCBSZW5kZXJJbmxpbmU6OmFkZEZvY3VzUmluZ1JlY3RzKFZlYwogICAgICAg
ICAgICAgICAgIHBvcyA9IGN1cnItPmxvY2FsVG9BYnNvbHV0ZSgpOwogICAgICAgICAgICAgZWxz
ZSBpZiAoY3Vyci0+aXNCb3goKSkKICAgICAgICAgICAgICAgICBwb3MubW92ZSh0b1JlbmRlckJv
eChjdXJyKS0+eCgpLCB0b1JlbmRlckJveChjdXJyKS0+eSgpKTsKLSAgICAgICAgICAgY3Vyci0+
YWRkRm9jdXNSaW5nUmVjdHMocmVjdHMsIHBvcy54KCksIHBvcy55KCkpOworICAgICAgICAgICAg
Y3Vyci0+YWRkRm9jdXNSaW5nUmVjdHMocmVjdHMsIHBvcy54KCksIHBvcy55KCkpOwogICAgICAg
ICB9CiAgICAgfQotCi0gICAgaWYgKGNvbnRpbnVhdGlvbigpKSB7Ci0gICAgICAgIGlmIChjb250
aW51YXRpb24oKS0+aXNJbmxpbmUoKSkKLSAgICAgICAgICAgIGNvbnRpbnVhdGlvbigpLT5hZGRG
b2N1c1JpbmdSZWN0cyhyZWN0cywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgdHggLSBjb250YWluaW5nQmxvY2soKS0+eCgpICsgY29udGludWF0aW9uKCkt
PmNvbnRhaW5pbmdCbG9jaygpLT54KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgdHkgLSBjb250YWluaW5nQmxvY2soKS0+eSgpICsgY29udGludWF0aW9u
KCktPmNvbnRhaW5pbmdCbG9jaygpLT55KCkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBj
b250aW51YXRpb24oKS0+YWRkRm9jdXNSaW5nUmVjdHMocmVjdHMsIAotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4IC0gY29udGFpbmluZ0Jsb2NrKCktPngo
KSArIHRvUmVuZGVyQm94KGNvbnRpbnVhdGlvbigpKS0+eCgpLAotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5IC0gY29udGFpbmluZ0Jsb2NrKCktPnkoKSAr
IHRvUmVuZGVyQm94KGNvbnRpbnVhdGlvbigpKS0+eSgpKTsKLSAgICB9CiB9CiAKIHZvaWQgUmVu
ZGVySW5saW5lOjpwYWludE91dGxpbmUoR3JhcGhpY3NDb250ZXh0KiBncmFwaGljc0NvbnRleHQs
IGludCB0eCwgaW50IHR5KQpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVySW5saW5lLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVySW5saW5lLmgJKHJldmlzaW9u
IDU0NTYxKQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVySW5saW5lLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTU4LDEwICs1OCw2IEBAIHB1YmxpYzoKIAogICAgIElubGluZUZsb3dCb3gqIGZpcnN0
TGluZUJveCgpIGNvbnN0IHsgcmV0dXJuIG1fbGluZUJveGVzLmZpcnN0TGluZUJveCgpOyB9CiAg
ICAgSW5saW5lRmxvd0JveCogbGFzdExpbmVCb3goKSBjb25zdCB7IHJldHVybiBtX2xpbmVCb3hl
cy5sYXN0TGluZUJveCgpOyB9Ci0KLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogY29udGludWF0
aW9uKCkgY29uc3QgeyByZXR1cm4gbV9jb250aW51YXRpb247IH0KLQotICAgIHZpcnR1YWwgdm9p
ZCB1cGRhdGVEcmFnU3RhdGUoYm9vbCBkcmFnT24pOwogICAgIAogICAgIEludFNpemUgcmVsYXRp
dmVQb3NpdGlvbmVkSW5saW5lT2Zmc2V0KGNvbnN0IFJlbmRlckJveCogY2hpbGQpIGNvbnN0Owog
CkBAIC04MSw5ICs3Nyw2IEBAIHByaXZhdGU6CiAKICAgICB2aXJ0dWFsIGJvb2wgaXNSZW5kZXJJ
bmxpbmUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CiAKLSAgICB2b2lkIGFkZENoaWxkVG9Db250
aW51YXRpb24oUmVuZGVyT2JqZWN0KiBuZXdDaGlsZCwgUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGls
ZCk7Ci0gICAgdmlydHVhbCB2b2lkIGFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24oUmVuZGVy
T2JqZWN0KiBuZXdDaGlsZCwgUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCA9IDApOwotCiAgICAg
dm9pZCBzcGxpdElubGluZXMoUmVuZGVyQmxvY2sqIGZyb21CbG9jaywgUmVuZGVyQmxvY2sqIHRv
QmxvY2ssIFJlbmRlckJsb2NrKiBtaWRkbGVCbG9jaywKICAgICAgICAgICAgICAgICAgICAgICBS
ZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkLCBSZW5kZXJCb3hNb2RlbE9iamVjdCogb2xkQ29udCk7
CiAgICAgdm9pZCBzcGxpdEZsb3coUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCwgUmVuZGVyQmxv
Y2sqIG5ld0Jsb2NrQm94LApAQCAtMTI2LDEzICsxMTksOCBAQCBwcml2YXRlOgogCiAgICAgdmly
dHVhbCBpbnQgbGluZUhlaWdodChib29sIGZpcnN0TGluZSwgYm9vbCBpc1Jvb3RMaW5lQm94ID0g
ZmFsc2UpIGNvbnN0OwogCi0gICAgUmVuZGVySW5saW5lKiBpbmxpbmVDb250aW51YXRpb24oKSBj
b25zdDsKLSAgICB2b2lkIHNldENvbnRpbnVhdGlvbihSZW5kZXJCb3hNb2RlbE9iamVjdCogYykg
eyBtX2NvbnRpbnVhdGlvbiA9IGM7IH0KLSAgICAKICAgICB2aXJ0dWFsIHZvaWQgY2hpbGRCZWNh
bWVOb25JbmxpbmUoUmVuZGVyT2JqZWN0KiBjaGlsZCk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgdXBk
YXRlSGl0VGVzdFJlc3VsdChIaXRUZXN0UmVzdWx0JiwgY29uc3QgSW50UG9pbnQmKTsKLQogICAg
IHZpcnR1YWwgdm9pZCBpbWFnZUNoYW5nZWQoV3JhcHBlZEltYWdlUHRyLCBjb25zdCBJbnRSZWN0
KiA9IDApOwogCiAjaWYgRU5BQkxFKERBU0hCT0FSRF9TVVBQT1JUKQpAQCAtMTQ1LDEzICsxMzMs
MTAgQEAgcHJpdmF0ZToKICAgICBzdGF0aWMgUmVuZGVySW5saW5lKiBjbG9uZUlubGluZShSZW5k
ZXJJbmxpbmUqIHNyYyk7CiAKICAgICB2b2lkIHBhaW50T3V0bGluZUZvckxpbmUoR3JhcGhpY3ND
b250ZXh0KiwgaW50IHR4LCBpbnQgdHksIGNvbnN0IEludFJlY3QmIHByZXZMaW5lLCBjb25zdCBJ
bnRSZWN0JiB0aGlzTGluZSwgY29uc3QgSW50UmVjdCYgbmV4dExpbmUpOwotICAgIFJlbmRlckJv
eE1vZGVsT2JqZWN0KiBjb250aW51YXRpb25CZWZvcmUoUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGls
ZCk7CiAKICAgICBSZW5kZXJPYmplY3RDaGlsZExpc3QgbV9jaGlsZHJlbjsKICAgICBSZW5kZXJM
aW5lQm94TGlzdCBtX2xpbmVCb3hlczsgICAvLyBBbGwgb2YgdGhlIGxpbmUgYm94ZXMgY3JlYXRl
ZCBmb3IgdGhpcyBpbmxpbmUgZmxvdy4gIEZvciBleGFtcGxlLCA8aT5IZWxsbzxicj53b3JsZC48
L2k+IHdpbGwgaGF2ZSB0d28gPGk+IGxpbmUgYm94ZXMuCiAKLSAgICBSZW5kZXJCb3hNb2RlbE9i
amVjdCogbV9jb250aW51YXRpb247IC8vIENhbiBiZSBlaXRoZXIgYSBibG9jayBvciBhbiBpbmxp
bmUuIDxiPjxpPjxwPkhlbGxvPC9wPjwvaT48L2I+LiBJbiB0aGlzIGV4YW1wbGUgdGhlIDxpPiB3
aWxsIGhhdmUgYSBibG9jayBhcyBpdHMgY29udGludWF0aW9uIGJ1dCB0aGUKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDxiPiB3aWxsIGp1c3QgaGF2ZSBhbiBp
bmxpbmUgYXMgaXRzIGNvbnRpbnVhdGlvbi4KICAgICBtdXRhYmxlIGludCBtX2xpbmVIZWlnaHQ7
CiAgICAgbXV0YWJsZSBpbnQgbV92ZXJ0aWNhbFBvc2l0aW9uOwogfTsKSW5kZXg6IFdlYkNvcmUv
cmVuZGVyaW5nL1JlbmRlckxpbmVCb3hMaXN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3Jl
bmRlcmluZy9SZW5kZXJMaW5lQm94TGlzdC5jcHAJKHJldmlzaW9uIDU0NTYxKQorKysgV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVyTGluZUJveExpc3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNDYs
MTggKzE0NiwxOCBAQCB2b2lkIFJlbmRlckxpbmVCb3hMaXN0OjpkaXJ0eUxpbmVCb3hlcygpCiAK
IHZvaWQgUmVuZGVyTGluZUJveExpc3Q6OnBhaW50KFJlbmRlckJveE1vZGVsT2JqZWN0KiByZW5k
ZXJlciwgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgaW50IHR4LCBpbnQgdHkp
IGNvbnN0CiB7Ci0gICAgLy8gT25seSBwYWludCBkdXJpbmcgdGhlIGZvcmVncm91bmQvc2VsZWN0
aW9uIHBoYXNlcy4KLSAgICBpZiAocGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VGb3JlZ3Jv
dW5kICYmIHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlU2VsZWN0aW9uICYmIHBhaW50SW5m
by5waGFzZSAhPSBQYWludFBoYXNlT3V0bGluZSAKLSAgICAgICAgJiYgcGFpbnRJbmZvLnBoYXNl
ICE9IFBhaW50UGhhc2VTZWxmT3V0bGluZSAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFz
ZUNoaWxkT3V0bGluZXMgJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VUZXh0Q2xpcAot
ICAgICAgICAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZU1hc2spCi0gICAgICAgIHJl
dHVybjsKLQogICAgIEFTU0VSVChyZW5kZXJlci0+aXNSZW5kZXJCbG9jaygpIHx8IChyZW5kZXJl
ci0+aXNSZW5kZXJJbmxpbmUoKSAmJiByZW5kZXJlci0+aGFzTGF5ZXIoKSkpOyAvLyBUaGUgb25s
eSB3YXkgYW4gaW5saW5lIGNvdWxkIHBhaW50IGxpa2UgdGhpcyBpcyBpZiBpdCBoYXMgYSBsYXll
ci4KIAogICAgIC8vIElmIHdlIGhhdmUgbm8gbGluZXMgdGhlbiB3ZSBoYXZlIG5vIHdvcmsgdG8g
ZG8uCiAgICAgaWYgKCFmaXJzdExpbmVCb3goKSkKICAgICAgICAgcmV0dXJuOwogCisgICAgLy8g
T25seSBwYWludCBkdXJpbmcgdGhlIGZvcmVncm91bmQvc2VsZWN0aW9uIHBoYXNlcyBpZiB3ZSBo
YXZlIGEgbGF5ZXIuICBPdGhlcndpc2Ugd2UgbWlnaHQgaGF2ZSBhbiBhbm9ueW1vdXMgaW5saW5l
IGJsb2NrLCBzbyB3ZSBjYW4ndCBzaG9ydCBjaXJjdWl0LgorICAgIGlmIChmaXJzdExpbmVCb3go
KS0+cGFyZW50KCkgJiYgKHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlRm9yZWdyb3VuZCAm
JiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZVNlbGVjdGlvbiAmJiBwYWludEluZm8ucGhh
c2UgIT0gUGFpbnRQaGFzZU91dGxpbmUgCisgICAgICAgICYmIHBhaW50SW5mby5waGFzZSAhPSBQ
YWludFBoYXNlU2VsZk91dGxpbmUgJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VDaGls
ZE91dGxpbmVzICYmIHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlVGV4dENsaXAKKyAgICAg
ICAgJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VNYXNrKSkKKyAgICAgICAgcmV0dXJu
OworCiAgICAgLy8gV2UgY2FuIGNoZWNrIHRoZSBmaXJzdCBib3ggYW5kIGxhc3QgYm94IGFuZCBh
dm9pZCBwYWludGluZyBpZiB3ZSBkb24ndAogICAgIC8vIGludGVyc2VjdC4gIFRoaXMgaXMgYSBx
dWljayBzaG9ydC1jaXJjdWl0IHRoYXQgd2UgY2FuIHRha2UgdG8gYXZvaWQgd2Fsa2luZyBhbnkg
bGluZXMuCiAgICAgLy8gRklYTUU6IFRoaXMgY2hlY2sgaXMgZmxhd2VkIGluIHRoZSBmb2xsb3dp
bmcgZXh0cmVtZWx5IG9ic2N1cmUgd2F5OgpAQCAtMjE3LDM1ICsyMTcsNDcgQEAgdm9pZCBSZW5k
ZXJMaW5lQm94TGlzdDo6cGFpbnQoUmVuZGVyQm94TQogCiBib29sIFJlbmRlckxpbmVCb3hMaXN0
OjpoaXRUZXN0KFJlbmRlckJveE1vZGVsT2JqZWN0KiByZW5kZXJlciwgY29uc3QgSGl0VGVzdFJl
cXVlc3QmIHJlcXVlc3QsIEhpdFRlc3RSZXN1bHQmIHJlc3VsdCwgaW50IHgsIGludCB5LCBpbnQg
dHgsIGludCB0eSwgSGl0VGVzdEFjdGlvbiBoaXRUZXN0QWN0aW9uKSBjb25zdAogewotICAgIGlm
IChoaXRUZXN0QWN0aW9uICE9IEhpdFRlc3RGb3JlZ3JvdW5kKQotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0KICAgICBBU1NFUlQocmVuZGVyZXItPmlzUmVuZGVyQmxvY2soKSB8fCAocmVuZGVyZXIt
PmlzUmVuZGVySW5saW5lKCkgJiYgcmVuZGVyZXItPmhhc0xheWVyKCkpKTsgLy8gVGhlIG9ubHkg
d2F5IGFuIGlubGluZSBjb3VsZCBoaXQgdGVzdCBsaWtlIHRoaXMgaXMgaWYgaXQgaGFzIGEgbGF5
ZXIuCiAKICAgICAvLyBJZiB3ZSBoYXZlIG5vIGxpbmVzIHRoZW4gd2UgaGF2ZSBubyB3b3JrIHRv
IGRvLgogICAgIGlmICghZmlyc3RMaW5lQm94KCkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKIAor
ICAgIC8vIE9ubHkgaGl0IHRlc3QgZHVyaW5nIHRoZSBmb3JlZ3JvdW5kIHBoYXNlIGlmIHdlIGhh
dmUgYSBsYXllci4gIE90aGVyd2lzZSB3ZSBtaWdodCBoYXZlIGFuIGFub255bW91cyBpbmxpbmUg
YmxvY2ssIHNvIHdlIGNhbid0IHNob3J0IGNpcmN1aXQuCisgICAgaWYgKGZpcnN0TGluZUJveCgp
LT5wYXJlbnQoKSAmJiBoaXRUZXN0QWN0aW9uICE9IEhpdFRlc3RGb3JlZ3JvdW5kKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisKICAgICAvLyBXZSBjYW4gY2hlY2sgdGhlIGZpcnN0IGJveCBhbmQg
bGFzdCBib3ggYW5kIGF2b2lkIGhpdCB0ZXN0aW5nIGlmIHdlIGRvbid0CiAgICAgLy8gY29udGFp
biB0aGUgcG9pbnQuICBUaGlzIGlzIGEgcXVpY2sgc2hvcnQtY2lyY3VpdCB0aGF0IHdlIGNhbiB0
YWtlIHRvIGF2b2lkIHdhbGtpbmcgYW55IGxpbmVzLgogICAgIC8vIEZJWE1FOiBUaGlzIGNoZWNr
IGlzIGZsYXdlZCBpbiB0aGUgZm9sbG93aW5nIGV4dHJlbWVseSBvYnNjdXJlIHdheToKICAgICAv
LyBpZiBzb21lIGxpbmUgaW4gdGhlIG1pZGRsZSBoYXMgYSBodWdlIG92ZXJmbG93LCBpdCBtaWdo
dCBhY3R1YWxseSBleHRlbmQgYmVsb3cgdGhlIGxhc3QgbGluZS4KLSAgICBpZiAoKHkgPj0gdHkg
KyBsYXN0TGluZUJveCgpLT5yb290KCktPmJvdHRvbVZpc2libGVPdmVyZmxvdygpKSB8fCAoeSA8
IHR5ICsgZmlyc3RMaW5lQm94KCktPnJvb3QoKS0+dG9wVmlzaWJsZU92ZXJmbG93KCkpKQorICAg
IFJvb3RJbmxpbmVCb3gqIGZpcnN0Um9vdCA9IGZpcnN0TGluZUJveCgpLT5yb290KCk7CisgICAg
Um9vdElubGluZUJveCogbGFzdFJvb3QgPSBsYXN0TGluZUJveCgpLT5yb290KCk7CisgICAgaW50
IHRvcCA9IGZpcnN0Um9vdC0+dG9wVmlzaWJsZU92ZXJmbG93KCk7CisgICAgaW50IGJvdHRvbSA9
IGxhc3RSb290LT5ib3R0b21WaXNpYmxlT3ZlcmZsb3coKTsKKyAgICBpZiAobGFzdFJvb3QtPmhh
c0Fub255bW91c0lubGluZUJsb2NrKCkpCisgICAgICAgIGJvdHRvbSA9IG1heChib3R0b20sIGJv
dHRvbSArIGxhc3RSb290LT5hbm9ueW1vdXNJbmxpbmVCbG9jaygpLT5jb2xsYXBzZWRNYXJnaW5C
b3R0b20oKSk7CisgICAgaWYgKGZpcnN0Um9vdC0+aGFzQW5vbnltb3VzSW5saW5lQmxvY2soKSkK
KyAgICAgICAgdG9wID0gbWluKHRvcCwgdG9wICsgZmlyc3RSb290LT5hbm9ueW1vdXNJbmxpbmVC
bG9jaygpLT5jb2xsYXBzZWRNYXJnaW5Ub3AoKSk7CisgICAgaWYgKCh5ID49IHR5ICsgYm90dG9t
KSB8fCAoeSA8IHR5ICsgdG9wKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgLy8gU2Vl
IGlmIG91ciByb290IGxpbmVzIGNvbnRhaW4gdGhlIHBvaW50LiAgSWYgc28sIHRoZW4gd2UgaGl0
IHRlc3QKICAgICAvLyB0aGVtIGZ1cnRoZXIuICBOb3RlIHRoYXQgYm94ZXMgY2FuIGVhc2lseSBv
dmVybGFwLCBzbyB3ZSBjYW4ndCBtYWtlIGFueSBhc3N1bXB0aW9ucwogICAgIC8vIGJhc2VkIG9m
ZiBwb3NpdGlvbnMgb2Ygb3VyIGZpcnN0IGxpbmUgYm94IG9yIG91ciBsYXN0IGxpbmUgYm94Lgog
ICAgIGZvciAoSW5saW5lRmxvd0JveCogY3VyciA9IGxhc3RMaW5lQm94KCk7IGN1cnI7IGN1cnIg
PSBjdXJyLT5wcmV2Rmxvd0JveCgpKSB7Ci0gICAgICAgIGlmICh5ID49IHR5ICsgY3Vyci0+cm9v
dCgpLT50b3BWaXNpYmxlT3ZlcmZsb3coKSAmJiB5IDwgdHkgKyBjdXJyLT5yb290KCktPmJvdHRv
bVZpc2libGVPdmVyZmxvdygpKSB7Ci0gICAgICAgICAgICBib29sIGluc2lkZSA9IGN1cnItPm5v
ZGVBdFBvaW50KHJlcXVlc3QsIHJlc3VsdCwgeCwgeSwgdHgsIHR5KTsKKyAgICAgICAgUm9vdElu
bGluZUJveCogY3VyclJvb3QgPSBjdXJyLT5yb290KCk7CisgICAgICAgIGludCB0b3AgPSBjdXJy
Um9vdC0+dG9wVmlzaWJsZU92ZXJmbG93KCk7CisgICAgICAgIGludCBib3R0b20gPSBjdXJyUm9v
dC0+Ym90dG9tVmlzaWJsZU92ZXJmbG93KCk7CisgICAgICAgIGlmICh5ID49IHR5ICsgdG9wICYm
IHkgPCB0eSArIGJvdHRvbSkgeworICAgICAgICAgICAgYm9vbCBpbnNpZGUgPSBjdXJyLT5ub2Rl
QXRQb2ludChyZXF1ZXN0LCByZXN1bHQsIHgsIHksIHR4LCB0eSwgaGl0VGVzdEFjdGlvbik7CiAg
ICAgICAgICAgICBpZiAoaW5zaWRlKSB7CiAgICAgICAgICAgICAgICAgcmVuZGVyZXItPnVwZGF0
ZUhpdFRlc3RSZXN1bHQocmVzdWx0LCBJbnRQb2ludCh4IC0gdHgsIHkgLSB0eSkpOwogICAgICAg
ICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQot
ICAgIAorCiAgICAgcmV0dXJuIGZhbHNlOwogfQogCkBAIC0yOTcsNiArMzA5LDEwIEBAIHZvaWQg
UmVuZGVyTGluZUJveExpc3Q6OmRpcnR5TGluZXNGcm9tQ2gKICAgICAgICAgUm9vdElubGluZUJv
eCogYWRqYWNlbnRCb3g7CiAgICAgICAgIGJveC0+bWFya0RpcnR5KCk7CiAKKyAgICAgICAgLy8g
V2UgZG9uJ3QgbmVlZCB0byBkaXJ0eSBhbnkgb3RoZXIgbGluZXMuCisgICAgICAgIGlmIChib3gt
Pmhhc0Fub255bW91c0lubGluZUJsb2NrKCkpCisgICAgICAgICAgICByZXR1cm47CisKICAgICAg
ICAgLy8gZGlydHkgdGhlIGFkamFjZW50IGxpbmVzIHRoYXQgbWlnaHQgYmUgYWZmZWN0ZWQKICAg
ICAgICAgLy8gTk9URTogd2UgZGlydHkgdGhlIHByZXZpb3VzIGxpbmUgYmVjYXVzZSBSb290SW5s
aW5lQm94IG9iamVjdHMgY2FjaGUKICAgICAgICAgLy8gdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0
IG9iamVjdCBvbiB0aGUgbmV4dCBsaW5lIGFmdGVyIGEgQlIsIHdoaWNoIHdlIG1heSBiZQpJbmRl
eDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGlzdEl0ZW0uY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvcmVuZGVyaW5nL1JlbmRlckxpc3RJdGVtLmNwcAkocmV2aXNpb24gNTQ1NjEpCisrKyBX
ZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMaXN0SXRlbS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI3
LDYgKzI3LDggQEAKICNpbmNsdWRlICJDYWNoZWRJbWFnZS5oIgogI2luY2x1ZGUgIkhUTUxOYW1l
cy5oIgogI2luY2x1ZGUgIkhUTUxPTGlzdEVsZW1lbnQuaCIKKyNpbmNsdWRlICJJbmxpbmVJdGVy
YXRvci5oIgorCiAjaW5jbHVkZSAiUmVuZGVyTGlzdE1hcmtlci5oIgogI2luY2x1ZGUgIlJlbmRl
clZpZXcuaCIKICNpbmNsdWRlIDx3dGYvU3RkTGliRXh0cmFzLmg+CkBAIC0xNTMsMTggKzE1NSw0
NCBAQCBib29sIFJlbmRlckxpc3RJdGVtOjppc0VtcHR5KCkgY29uc3QKICAgICByZXR1cm4gbGFz
dENoaWxkKCkgPT0gbV9tYXJrZXI7CiB9CiAKLXN0YXRpYyBSZW5kZXJPYmplY3QqIGdldFBhcmVu
dE9mRmlyc3RMaW5lQm94KFJlbmRlckJsb2NrKiBjdXJyLCBSZW5kZXJPYmplY3QqIG1hcmtlcikK
K3ZvaWQgUmVuZGVyTGlzdEl0ZW06OnVwZGF0ZVZhbHVlKCkKIHsKLSAgICBSZW5kZXJPYmplY3Qq
IGZpcnN0Q2hpbGQgPSBjdXJyLT5maXJzdENoaWxkKCk7Ci0gICAgaWYgKCFmaXJzdENoaWxkKQot
ICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIW1faGFzRXhwbGljaXRWYWx1ZSkgeworICAgICAg
ICBtX2lzVmFsdWVVcFRvRGF0ZSA9IGZhbHNlOworICAgICAgICBpZiAobV9tYXJrZXIpCisgICAg
ICAgICAgICBtX21hcmtlci0+c2V0TmVlZHNMYXlvdXRBbmRQcmVmV2lkdGhzUmVjYWxjKCk7Cisg
ICAgfQorfQogCi0gICAgZm9yIChSZW5kZXJPYmplY3QqIGN1cnJDaGlsZCA9IGZpcnN0Q2hpbGQ7
IGN1cnJDaGlsZDsgY3VyckNoaWxkID0gY3VyckNoaWxkLT5uZXh0U2libGluZygpKSB7CitzdGF0
aWMgUmVuZGVyT2JqZWN0KiBmaXJzdE5vbk1hcmtlckNoaWxkKFJlbmRlck9iamVjdCogcGFyZW50
KQoreworICAgIFJlbmRlck9iamVjdCogcmVzdWx0ID0gcGFyZW50LT5maXJzdENoaWxkKCk7Cisg
ICAgd2hpbGUgKHJlc3VsdCAmJiByZXN1bHQtPmlzTGlzdE1hcmtlcigpKQorICAgICAgICByZXN1
bHQgPSByZXN1bHQtPm5leHRTaWJsaW5nKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitz
dGF0aWMgUmVuZGVyQmxvY2sqIGxpc3RNYXJrZXJMb2NhdGlvbihSZW5kZXJCbG9jayogYmxvY2ss
IFJlbmRlckxpc3RNYXJrZXIqIG1hcmtlcikKK3sKKyAgICBmb3IgKFJlbmRlck9iamVjdCogY3Vy
ckNoaWxkID0gYmxvY2stPmZpcnN0Q2hpbGQoKTsgY3VyckNoaWxkOyBjdXJyQ2hpbGQgPSBjdXJy
Q2hpbGQtPm5leHRTaWJsaW5nKCkpIHsKICAgICAgICAgaWYgKGN1cnJDaGlsZCA9PSBtYXJrZXIp
CiAgICAgICAgICAgICBjb250aW51ZTsKIAotICAgICAgICBpZiAoY3VyckNoaWxkLT5pc0lubGlu
ZSgpICYmICghY3VyckNoaWxkLT5pc1JlbmRlcklubGluZSgpIHx8IGN1cnItPmdlbmVyYXRlc0xp
bmVCb3hlc0ZvcklubGluZUNoaWxkKGN1cnJDaGlsZCkpKQotICAgICAgICAgICAgcmV0dXJuIGN1
cnI7CisgICAgICAgIGlmIChjdXJyQ2hpbGQtPmlzSW5saW5lKCkpIHsKKyAgICAgICAgICAgIGlm
ICghY3VyckNoaWxkLT5pc1JlbmRlcklubGluZSgpKQorICAgICAgICAgICAgICAgIHJldHVybiBi
bG9jazsKKyAgICAgICAgICAgIElubGluZUl0ZXJhdG9yIGl0KGJsb2NrLCBjdXJyQ2hpbGQsIDAp
OworICAgICAgICAgICAgd2hpbGUgKCFpdC5hdEVuZCgpKSB7CisgICAgICAgICAgICAgICAgaWYg
KGl0Lm9iai0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CisgICAgICAgICAgICAgICAgICAg
IFJlbmRlckJsb2NrKiBsaW5lQm94UGFyZW50ID0gbGlzdE1hcmtlckxvY2F0aW9uKHRvUmVuZGVy
QmxvY2soaXQub2JqKSwgbWFya2VyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVCb3hQ
YXJlbnQpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGluZUJveFBhcmVudDsKKyAg
ICAgICAgICAgICAgICB9IGVsc2UgaWYgKFJlbmRlckJsb2NrOjpyZXF1aXJlc0xpbmVCb3goaXQp
KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmxvY2s7CisgICAgICAgICAgICAgICAgaXQu
aW5jcmVtZW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAogICAgICAgICBpZiAoY3Vy
ckNoaWxkLT5pc0Zsb2F0aW5nKCkgfHwgY3VyckNoaWxkLT5pc1Bvc2l0aW9uZWQoKSkKICAgICAg
ICAgICAgIGNvbnRpbnVlOwpAQCAtMTcyLDQxICsyMDAsMjQgQEAgc3RhdGljIFJlbmRlck9iamVj
dCogZ2V0UGFyZW50T2ZGaXJzdExpbgogICAgICAgICBpZiAoY3VyckNoaWxkLT5pc1RhYmxlKCkg
fHwgIWN1cnJDaGlsZC0+aXNSZW5kZXJCbG9jaygpKQogICAgICAgICAgICAgYnJlYWs7CiAKLSAg
ICAgICAgaWYgKGN1cnItPmlzTGlzdEl0ZW0oKSAmJiBjdXJyQ2hpbGQtPnN0eWxlKCktPmh0bWxI
YWNrcygpICYmIGN1cnJDaGlsZC0+bm9kZSgpICYmCi0gICAgICAgICAgICAoY3VyckNoaWxkLT5u
b2RlKCktPmhhc1RhZ05hbWUodWxUYWcpfHwgY3VyckNoaWxkLT5ub2RlKCktPmhhc1RhZ05hbWUo
b2xUYWcpKSkKKyAgICAgICAgaWYgKGJsb2NrLT5pc0xpc3RJdGVtKCkgJiYgY3VyckNoaWxkLT5z
dHlsZSgpLT5odG1sSGFja3MoKSAmJiBjdXJyQ2hpbGQtPm5vZGUoKSAmJgorICAgICAgICAgICAg
KGN1cnJDaGlsZC0+bm9kZSgpLT5oYXNUYWdOYW1lKHVsVGFnKSB8fCBjdXJyQ2hpbGQtPm5vZGUo
KS0+aGFzVGFnTmFtZShvbFRhZykpKQogICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgUmVu
ZGVyT2JqZWN0KiBsaW5lQm94ID0gZ2V0UGFyZW50T2ZGaXJzdExpbmVCb3godG9SZW5kZXJCbG9j
ayhjdXJyQ2hpbGQpLCBtYXJrZXIpOwotICAgICAgICBpZiAobGluZUJveCkKLSAgICAgICAgICAg
IHJldHVybiBsaW5lQm94OworICAgICAgICBSZW5kZXJCbG9jayogbGluZUJveFBhcmVudCA9IGxp
c3RNYXJrZXJMb2NhdGlvbih0b1JlbmRlckJsb2NrKGN1cnJDaGlsZCksIG1hcmtlcik7CisgICAg
ICAgIGlmIChsaW5lQm94UGFyZW50KQorICAgICAgICAgICAgcmV0dXJuIGxpbmVCb3hQYXJlbnQ7
CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CiB9CiAKLXZvaWQgUmVuZGVyTGlzdEl0ZW06OnVwZGF0
ZVZhbHVlKCkKLXsKLSAgICBpZiAoIW1faGFzRXhwbGljaXRWYWx1ZSkgewotICAgICAgICBtX2lz
VmFsdWVVcFRvRGF0ZSA9IGZhbHNlOwotICAgICAgICBpZiAobV9tYXJrZXIpCi0gICAgICAgICAg
ICBtX21hcmtlci0+c2V0TmVlZHNMYXlvdXRBbmRQcmVmV2lkdGhzUmVjYWxjKCk7Ci0gICAgfQot
fQotCi1zdGF0aWMgUmVuZGVyT2JqZWN0KiBmaXJzdE5vbk1hcmtlckNoaWxkKFJlbmRlck9iamVj
dCogcGFyZW50KQotewotICAgIFJlbmRlck9iamVjdCogcmVzdWx0ID0gcGFyZW50LT5maXJzdENo
aWxkKCk7Ci0gICAgd2hpbGUgKHJlc3VsdCAmJiByZXN1bHQtPmlzTGlzdE1hcmtlcigpKQotICAg
ICAgICByZXN1bHQgPSByZXN1bHQtPm5leHRTaWJsaW5nKCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsK
LX0KLQogdm9pZCBSZW5kZXJMaXN0SXRlbTo6dXBkYXRlTWFya2VyTG9jYXRpb24oKQogewogICAg
IC8vIFNhbml0eSBjaGVjayB0aGUgbG9jYXRpb24gb2Ygb3VyIG1hcmtlci4KICAgICBpZiAobV9t
YXJrZXIpIHsKICAgICAgICAgUmVuZGVyT2JqZWN0KiBtYXJrZXJQYXIgPSBtX21hcmtlci0+cGFy
ZW50KCk7Ci0gICAgICAgIFJlbmRlck9iamVjdCogbGluZUJveFBhcmVudCA9IGdldFBhcmVudE9m
Rmlyc3RMaW5lQm94KHRoaXMsIG1fbWFya2VyKTsKKyAgICAgICAgUmVuZGVyT2JqZWN0KiBsaW5l
Qm94UGFyZW50ID0gbGlzdE1hcmtlckxvY2F0aW9uKHRoaXMsIG1fbWFya2VyKTsKICAgICAgICAg
aWYgKCFsaW5lQm94UGFyZW50KSB7CiAgICAgICAgICAgICAvLyBJZiB0aGUgbWFya2VyIGlzIGN1
cnJlbnRseSBjb250YWluZWQgaW5zaWRlIGFuIGFub255bW91cyBib3gsCiAgICAgICAgICAgICAv
LyB0aGVuIHdlIGFyZSB0aGUgb25seSBpdGVtIGluIHRoYXQgYW5vbnltb3VzIGJveCAoc2luY2Ug
bm8gbGluZSBib3gKQEAgLTI1Nyw5ICsyNjgsMTEgQEAgdm9pZCBSZW5kZXJMaXN0SXRlbTo6cG9z
aXRpb25MaXN0TWFya2VyKAogICAgICAgICBpbnQgbWFya2VyT2xkWCA9IG1fbWFya2VyLT54KCk7
CiAgICAgICAgIGludCB5T2Zmc2V0ID0gMDsKICAgICAgICAgaW50IHhPZmZzZXQgPSAwOwotICAg
ICAgICBmb3IgKFJlbmRlckJveCogbyA9IG1fbWFya2VyLT5wYXJlbnRCb3goKTsgbyAhPSB0aGlz
OyBvID0gby0+cGFyZW50Qm94KCkpIHsKLSAgICAgICAgICAgIHlPZmZzZXQgKz0gby0+eSgpOwot
ICAgICAgICAgICAgeE9mZnNldCArPSBvLT54KCk7CisgICAgICAgIGZvciAoUmVuZGVyT2JqZWN0
KiBvID0gbV9tYXJrZXItPnBhcmVudCgpOyBvICE9IHRoaXM7IG8gPSBvLT5wYXJlbnQoKSkgewor
ICAgICAgICAgICAgaWYgKG8tPmlzQm94KCkpIHsKKyAgICAgICAgICAgICAgICB5T2Zmc2V0ICs9
IHRvUmVuZGVyQm94KG8pLT55KCk7CisgICAgICAgICAgICAgICAgeE9mZnNldCArPSB0b1JlbmRl
ckJveChvKS0+eCgpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgYm9vbCBh
ZGp1c3RPdmVyZmxvdyA9IGZhbHNlOwpAQCAtMjk1LDEzICszMDgsMTQgQEAgdm9pZCBSZW5kZXJM
aXN0SXRlbTo6cG9zaXRpb25MaXN0TWFya2VyKAogCiAgICAgICAgIGlmIChhZGp1c3RPdmVyZmxv
dykgewogICAgICAgICAgICAgSW50UmVjdCBtYXJrZXJSZWN0KG1hcmtlclhQb3MgKyB4T2Zmc2V0
LCB5T2Zmc2V0LCBtX21hcmtlci0+d2lkdGgoKSwgbV9tYXJrZXItPmhlaWdodCgpKTsKLSAgICAg
ICAgICAgIFJlbmRlckJveCogbyA9IG1fbWFya2VyOworICAgICAgICAgICAgUmVuZGVyT2JqZWN0
KiBvID0gbV9tYXJrZXI7CiAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgbyA9IG8t
PnBhcmVudEJveCgpOworICAgICAgICAgICAgICAgIG8gPSBvLT5wYXJlbnQoKTsKICAgICAgICAg
ICAgICAgICBpZiAoby0+aXNSZW5kZXJCbG9jaygpKQogICAgICAgICAgICAgICAgICAgICB0b1Jl
bmRlckJsb2NrKG8pLT5hZGRMYXlvdXRPdmVyZmxvdyhtYXJrZXJSZWN0KTsKLSAgICAgICAgICAg
ICAgICBtYXJrZXJSZWN0Lm1vdmUoLW8tPngoKSwgLW8tPnkoKSk7Ci0gICAgICAgICAgICB9IHdo
aWxlIChvICE9IHRoaXMgJiYgIW8tPmhhc1NlbGZQYWludGluZ0xheWVyKCkpOworICAgICAgICAg
ICAgICAgIGlmIChvLT5pc0JveCgpKQorICAgICAgICAgICAgICAgICAgICBtYXJrZXJSZWN0Lm1v
dmUoLXRvUmVuZGVyQm94KG8pLT54KCksIC10b1JlbmRlckJveChvKS0+eSgpKTsKKyAgICAgICAg
ICAgIH0gd2hpbGUgKG8gIT0gdGhpcyAmJiAoIW8tPmlzQm94KCkgfHwgIXRvUmVuZGVyQm94KG8p
LT5oYXNTZWxmUGFpbnRpbmdMYXllcigpKSk7IC8vIEZJWE1FOiBJbnZlc3RpZ2F0ZSA8bGk+PHNw
YW4gc3R5bGU9InBvc2l0aW9uOnJlbGF0aXZlO2xlZnQ6LTEwMHB4Ij48ZGl2PnRleHQ8L2Rpdj48
L3NwYW4+PC9saT4KICAgICAgICAgfQogICAgIH0KIH0KSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5n
L1JlbmRlck9iamVjdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVy
T2JqZWN0LmNwcAkocmV2aXNpb24gNTQ1NjEpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJP
YmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMjMwLDggKzIyMzAsNiBAQCB2b2lkIFJlbmRl
ck9iamVjdDo6Z2V0VGV4dERlY29yYXRpb25Db2xvCiAgICAgICAgICAgICB9CiAgICAgICAgIH0K
ICAgICAgICAgY3VyciA9IGN1cnItPnBhcmVudCgpOwotICAgICAgICBpZiAoY3VyciAmJiBjdXJy
LT5pc1JlbmRlckJsb2NrKCkgJiYgdG9SZW5kZXJCbG9jayhjdXJyKS0+aW5saW5lQ29udGludWF0
aW9uKCkpCi0gICAgICAgICAgICBjdXJyID0gdG9SZW5kZXJCbG9jayhjdXJyKS0+aW5saW5lQ29u
dGludWF0aW9uKCk7CiAgICAgfSB3aGlsZSAoY3VyciAmJiBkZWNvcmF0aW9ucyAmJiAoIXF1aXJr
c01vZGUgfHwgIWN1cnItPm5vZGUoKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICghY3Vyci0+bm9kZSgpLT5oYXNUYWdOYW1lKGFUYWcpICYmICFjdXJyLT5ub2RlKCkt
Pmhhc1RhZ05hbWUoZm9udFRhZykpKSk7CiAKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRl
ck9iamVjdC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdC5o
CShyZXZpc2lvbiA1NDU2MSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdC5oCSh3
b3JraW5nIGNvcHkpCkBAIC0zNjQsNyArMzY0LDExIEBAIHB1YmxpYzoKICAgICB2b2lkIHNldElz
QW5vbnltb3VzKGJvb2wgYikgeyBtX2lzQW5vbnltb3VzID0gYjsgfQogICAgIGJvb2wgaXNBbm9u
eW1vdXNCbG9jaygpIGNvbnN0CiAgICAgewotICAgICAgICByZXR1cm4gbV9pc0Fub255bW91cyAm
JiBzdHlsZSgpLT5kaXNwbGF5KCkgPT0gQkxPQ0sgJiYgc3R5bGUoKS0+c3R5bGVUeXBlKCkgPT0g
Tk9QU0VVRE8gJiYgIWlzTGlzdE1hcmtlcigpOworICAgICAgICByZXR1cm4gbV9pc0Fub255bW91
cyAmJiBzdHlsZSgpLT5kaXNwbGF5KCkgPT0gQkxPQ0sgJiYgc3R5bGUoKS0+c3R5bGVUeXBlKCkg
PT0gTk9QU0VVRE8gJiYgIWlzVGV4dCgpICYmICFpc0xpc3RNYXJrZXIoKTsKKyAgICB9CisgICAg
Ym9vbCBpc0Fub255bW91c0lubGluZUJsb2NrKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVy
biBtX2lzQW5vbnltb3VzICYmIHN0eWxlKCktPmRpc3BsYXkoKSA9PSBJTkxJTkVfQkxPQ0sgJiYg
c3R5bGUoKS0+c3R5bGVUeXBlKCkgPT0gTk9QU0VVRE8gJiYgIWlzVGV4dCgpICYmICFpc1J1YnlS
dW4oKSAmJiAhaXNSdWJ5QmFzZSgpOwogICAgIH0KICAgICBib29sIGlzSW5saW5lQ29udGludWF0
aW9uKCkgY29uc3QgeyByZXR1cm4gKG5vZGUoKSA/IG5vZGUoKS0+cmVuZGVyZXIoKSAhPSB0aGlz
IDogZmFsc2UpICYmIGlzUmVuZGVySW5saW5lKCk7IH0KICAgICBib29sIGlzRmxvYXRpbmcoKSBj
b25zdCB7IHJldHVybiBtX2Zsb2F0aW5nOyB9CkBAIC00ODAsNyArNDg0LDcgQEAgcHVibGljOgog
ICAgIHN0cnVjdCBQYWludEluZm8gewogICAgICAgICBQYWludEluZm8oR3JhcGhpY3NDb250ZXh0
KiBuZXdDb250ZXh0LCBjb25zdCBJbnRSZWN0JiBuZXdSZWN0LCBQYWludFBoYXNlIG5ld1BoYXNl
LCBib29sIG5ld0ZvcmNlQmxhY2tUZXh0LAogICAgICAgICAgICAgICAgICAgUmVuZGVyT2JqZWN0
KiBuZXdQYWludGluZ1Jvb3QsIExpc3RIYXNoU2V0PFJlbmRlcklubGluZSo+KiBuZXdPdXRsaW5l
T2JqZWN0cywKLSAgICAgICAgICAgICAgICAgIE92ZXJsYXBUZXN0UmVxdWVzdE1hcCogb3Zlcmxh
cFRlc3RSZXF1ZXN0cyA9IDApCisgICAgICAgICAgICAgICAgICBPdmVybGFwVGVzdFJlcXVlc3RN
YXAqIG92ZXJsYXBUZXN0UmVxdWVzdHMgPSAwLCBSZW5kZXJCbG9jayogaW5saW5lQmxvY2sgPSAw
KQogICAgICAgICAgICAgOiBjb250ZXh0KG5ld0NvbnRleHQpCiAgICAgICAgICAgICAsIHJlY3Qo
bmV3UmVjdCkKICAgICAgICAgICAgICwgcGhhc2UobmV3UGhhc2UpCkBAIC00ODgsNiArNDkyLDcg
QEAgcHVibGljOgogICAgICAgICAgICAgLCBwYWludGluZ1Jvb3QobmV3UGFpbnRpbmdSb290KQog
ICAgICAgICAgICAgLCBvdXRsaW5lT2JqZWN0cyhuZXdPdXRsaW5lT2JqZWN0cykKICAgICAgICAg
ICAgICwgb3ZlcmxhcFRlc3RSZXF1ZXN0cyhvdmVybGFwVGVzdFJlcXVlc3RzKQorICAgICAgICAg
ICAgLCBhbm9ueW1vdXNJbmxpbmVCbG9jayhpbmxpbmVCbG9jaykKICAgICAgICAgewogICAgICAg
ICB9CiAKQEAgLTQ5OCw2ICs1MDMsNyBAQCBwdWJsaWM6CiAgICAgICAgIFJlbmRlck9iamVjdCog
cGFpbnRpbmdSb290OyAvLyB1c2VkIHRvIGRyYXcganVzdCBvbmUgZWxlbWVudCBhbmQgaXRzIHZp
c3VhbCBraWRzCiAgICAgICAgIExpc3RIYXNoU2V0PFJlbmRlcklubGluZSo+KiBvdXRsaW5lT2Jq
ZWN0czsgLy8gdXNlZCB0byBsaXN0IG91dGxpbmVzIHRoYXQgc2hvdWxkIGJlIHBhaW50ZWQgYnkg
YSBibG9jayB3aXRoIGlubGluZSBjaGlsZHJlbgogICAgICAgICBPdmVybGFwVGVzdFJlcXVlc3RN
YXAqIG92ZXJsYXBUZXN0UmVxdWVzdHM7CisgICAgICAgIFJlbmRlckJsb2NrKiBhbm9ueW1vdXNJ
bmxpbmVCbG9jazsKICAgICB9OwogCiAgICAgdmlydHVhbCB2b2lkIHBhaW50KFBhaW50SW5mbyYs
IGludCB0eCwgaW50IHR5KTsKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdENo
aWxkTGlzdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0
Q2hpbGRMaXN0LmNwcAkocmV2aXNpb24gNTQ1NjEpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5k
ZXJPYmplY3RDaGlsZExpc3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMTYsMTYgKzMxNiw2IEBA
IHZvaWQgUmVuZGVyT2JqZWN0Q2hpbGRMaXN0Ojp1cGRhdGVCZWZvcmUKIAogICAgIC8vIFdoZXRo
ZXIgb3Igbm90IHdlIG5vdyB3YW50IGdlbmVyYXRlZCBjb250ZW50LiAgCiAgICAgYm9vbCBuZXdD
b250ZW50V2FudGVkID0gcHNldWRvRWxlbWVudFN0eWxlICYmIHBzZXVkb0VsZW1lbnRTdHlsZS0+
ZGlzcGxheSgpICE9IE5PTkU7Ci0KLSAgICAvLyBGb3IgPHE+PHAvPjwvcT4sIGlmIHRoaXMgb2Jq
ZWN0IGlzIHRoZSBpbmxpbmUgY29udGludWF0aW9uIG9mIHRoZSA8cT4sIHdlIG9ubHkgd2FudCB0
byBnZW5lcmF0ZQotICAgIC8vIDphZnRlciBjb250ZW50IGFuZCBub3QgOmJlZm9yZSBjb250ZW50
LgotICAgIGlmIChuZXdDb250ZW50V2FudGVkICYmIHR5cGUgPT0gQkVGT1JFICYmIG93bmVyLT5p
c1JlbmRlcklubGluZSgpICYmIHRvUmVuZGVySW5saW5lKG93bmVyKS0+aXNJbmxpbmVDb250aW51
YXRpb24oKSkKLSAgICAgICAgbmV3Q29udGVudFdhbnRlZCA9IGZhbHNlOwotCi0gICAgLy8gU2lt
aWxhcmx5LCBpZiB3ZSdyZSB0aGUgYmVnaW5uaW5nIG9mIGEgPHE+LCBhbmQgdGhlcmUncyBhbiBp
bmxpbmUgY29udGludWF0aW9uIGZvciBvdXIgb2JqZWN0LAotICAgIC8vIHRoZW4gd2UgZG9uJ3Qg
Z2VuZXJhdGUgdGhlIDphZnRlciBjb250ZW50LgotICAgIGlmIChuZXdDb250ZW50V2FudGVkICYm
IHR5cGUgPT0gQUZURVIgJiYgb3duZXItPmlzUmVuZGVySW5saW5lKCkgJiYgdG9SZW5kZXJJbmxp
bmUob3duZXIpLT5jb250aW51YXRpb24oKSkKLSAgICAgICAgbmV3Q29udGVudFdhbnRlZCA9IGZh
bHNlOwogICAgIAogICAgIC8vIElmIHdlIGRvbid0IHdhbnQgZ2VuZXJhdGVkIGNvbnRlbnQgYW55
IGxvbmdlciwgb3IgaWYgd2UgaGF2ZSBnZW5lcmF0ZWQgY29udGVudCwgYnV0IGl0J3Mgbm8gbG9u
Z2VyCiAgICAgLy8gaWRlbnRpY2FsIHRvIHRoZSBuZXcgY29udGVudCBkYXRhIHdlIHdhbnQgdG8g
YnVpbGQgcmVuZGVyIG9iamVjdHMgZm9yLCB0aGVuIHdlIG51a2UgYWxsCkluZGV4OiBXZWJDb3Jl
L3JlbmRlcmluZy9SZW5kZXJSdWJ5QmFzZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5k
ZXJpbmcvUmVuZGVyUnVieUJhc2UuY3BwCShyZXZpc2lvbiA1NDU2MSkKKysrIFdlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlclJ1YnlCYXNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTE2LDcgKzExNiw2
IEBAIHZvaWQgUmVuZGVyUnVieUJhc2U6Om1vdmVCbG9ja0NoaWxkcmVuKFIKICAgICAgICAgICAg
ICAgICBpZiAoY2hpbGQtPmlzQW5vbnltb3VzQmxvY2soKSkgewogICAgICAgICAgICAgICAgICAg
ICBSZW5kZXJCbG9jayogYW5vbkJsb2NrID0gdG9SZW5kZXJCbG9jayhjaGlsZCk7CiAgICAgICAg
ICAgICAgICAgICAgIEFTU0VSVChhbm9uQmxvY2stPmNoaWxkcmVuSW5saW5lKCkpOwotICAgICAg
ICAgICAgICAgICAgICBBU1NFUlQoIWFub25CbG9jay0+aW5saW5lQ29udGludWF0aW9uKCkpOwog
ICAgICAgICAgICAgICAgICAgICBhbm9uQmxvY2stPm1vdmVBbGxDaGlsZHJlblRvKHRvQmFzZSwg
dG9CYXNlLT5jaGlsZHJlbigpKTsKICAgICAgICAgICAgICAgICAgICAgYW5vbkJsb2NrLT5kZWxl
dGVMaW5lQm94VHJlZSgpOwogICAgICAgICAgICAgICAgICAgICBhbm9uQmxvY2stPmRlc3Ryb3ko
KTsKQEAgLTE0Myw3ICsxNDIsNiBAQCB2b2lkIFJlbmRlclJ1YnlCYXNlOjptb3ZlQmxvY2tDaGls
ZHJlbihSCiAKICAgICAgICAgICAgICAgICAgICAgUmVuZGVyQmxvY2sqIGFub25CbG9jayA9IHRv
UmVuZGVyQmxvY2soY2hpbGQpOwogICAgICAgICAgICAgICAgICAgICBBU1NFUlQoYW5vbkJsb2Nr
LT5jaGlsZHJlbklubGluZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgQVNTRVJUKCFhbm9uQmxv
Y2stPmlubGluZUNvbnRpbnVhdGlvbigpKTsKICAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSBp
bmxpbmUgY2hpbGRyZW4gb3V0IG9mIGFub255bW91cyBibG9jay4KICAgICAgICAgICAgICAgICAg
ICAgYW5vbkJsb2NrLT5tb3ZlQWxsQ2hpbGRyZW5Ubyh0aGlzLCBjaGlsZHJlbigpLCBhbm9uQmxv
Y2spOwogICAgICAgICAgICAgICAgICAgICBhbm9uQmxvY2stPmRlbGV0ZUxpbmVCb3hUcmVlKCk7
CkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9Sb290SW5saW5lQm94LmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL3JlbmRlcmluZy9Sb290SW5saW5lQm94LmNwcAkocmV2aXNpb24gNTQ1NjEpCisr
KyBXZWJDb3JlL3JlbmRlcmluZy9Sb290SW5saW5lQm94LmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MzEsNiArMzEsNyBAQAogI2luY2x1ZGUgIlBhZ2UuaCIKICNpbmNsdWRlICJSZW5kZXJBcmVuYS5o
IgogI2luY2x1ZGUgIlJlbmRlckJsb2NrLmgiCisjaW5jbHVkZSAiUmVuZGVyVmlldy5oIgogCiB1
c2luZyBuYW1lc3BhY2Ugc3RkOwogCkBAIC0xNjMsNiArMTY0LDEyIEBAIHZvaWQgUm9vdElubGlu
ZUJveDo6cGFpbnRDdXN0b21IaWdobGlnaHQKIAogdm9pZCBSb290SW5saW5lQm94OjpwYWludChS
ZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJbmZvLCBpbnQgdHgsIGludCB0eSkKIHsKKyAg
ICAvLyBPbmx5IHBhaW50IGR1cmluZyB0aGUgZm9yZWdyb3VuZC9zZWxlY3Rpb24gcGhhc2VzLgor
ICAgIGlmIChwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZUZvcmVncm91bmQgJiYgcGFpbnRJ
bmZvLnBoYXNlICE9IFBhaW50UGhhc2VTZWxlY3Rpb24gJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBh
aW50UGhhc2VPdXRsaW5lIAorICAgICAgICAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFz
ZVNlbGZPdXRsaW5lICYmIHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlQ2hpbGRPdXRsaW5l
cyAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZVRleHRDbGlwCisgICAgICAgICYmIHBh
aW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlTWFzaykKKyAgICAgICAgcmV0dXJuOworCiAgICAg
SW5saW5lRmxvd0JveDo6cGFpbnQocGFpbnRJbmZvLCB0eCwgdHkpOwogICAgIHBhaW50RWxsaXBz
aXNCb3gocGFpbnRJbmZvLCB0eCwgdHkpOwogI2lmIFBMQVRGT1JNKE1BQykKQEAgLTE3MiwxNSAr
MTc5LDI2IEBAIHZvaWQgUm9vdElubGluZUJveDo6cGFpbnQoUmVuZGVyT2JqZWN0OjoKICNlbmRp
ZgogfQogCi1ib29sIFJvb3RJbmxpbmVCb3g6Om5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1
ZXN0JiByZXF1ZXN0LCBIaXRUZXN0UmVzdWx0JiByZXN1bHQsIGludCB4LCBpbnQgeSwgaW50IHR4
LCBpbnQgdHkpCitib29sIFJvb3RJbmxpbmVCb3g6Om5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RS
ZXF1ZXN0JiByZXF1ZXN0LCBIaXRUZXN0UmVzdWx0JiByZXN1bHQsIGludCB4LCBpbnQgeSwgaW50
IHR4LCBpbnQgdHksIEhpdFRlc3RBY3Rpb24gaGl0VGVzdEFjdGlvbikKIHsKKyAgICBSZW5kZXJC
bG9jayogY2hpbGQgPSBhbm9ueW1vdXNJbmxpbmVCbG9jaygpOworICAgIGlmIChjaGlsZCkgewor
ICAgICAgICBIaXRUZXN0QWN0aW9uIGNoaWxkSGl0VGVzdCA9IGhpdFRlc3RBY3Rpb247CisgICAg
ICAgIGlmIChoaXRUZXN0QWN0aW9uID09IEhpdFRlc3RDaGlsZEJsb2NrQmFja2dyb3VuZHMpCisg
ICAgICAgICAgICBjaGlsZEhpdFRlc3QgPSBIaXRUZXN0Q2hpbGRCbG9ja0JhY2tncm91bmQ7Cisg
ICAgICAgIHJldHVybiBjaGlsZC0+bm9kZUF0UG9pbnQocmVxdWVzdCwgcmVzdWx0LCB4LCB5LCB0
eCwgdHksIGNoaWxkSGl0VGVzdCk7CisgICAgfQorCisgICAgaWYgKGhpdFRlc3RBY3Rpb24gIT0g
SGl0VGVzdEZvcmVncm91bmQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKwogICAgIGlmIChtX2hh
c0VsbGlwc2lzQm94ICYmIHZpc2libGVUb0hpdFRlc3RpbmcoKSkgewotICAgICAgICBpZiAoZWxs
aXBzaXNCb3goKS0+bm9kZUF0UG9pbnQocmVxdWVzdCwgcmVzdWx0LCB4LCB5LCB0eCwgdHkpKSB7
CisgICAgICAgIGlmIChlbGxpcHNpc0JveCgpLT5ub2RlQXRQb2ludChyZXF1ZXN0LCByZXN1bHQs
IHgsIHksIHR4LCB0eSwgaGl0VGVzdEFjdGlvbikpIHsKICAgICAgICAgICAgIHJlbmRlcmVyKCkt
PnVwZGF0ZUhpdFRlc3RSZXN1bHQocmVzdWx0LCBJbnRQb2ludCh4IC0gdHgsIHkgLSB0eSkpOwog
ICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIElu
bGluZUZsb3dCb3g6Om5vZGVBdFBvaW50KHJlcXVlc3QsIHJlc3VsdCwgeCwgeSwgdHgsIHR5KTsK
KyAgICByZXR1cm4gSW5saW5lRmxvd0JveDo6bm9kZUF0UG9pbnQocmVxdWVzdCwgcmVzdWx0LCB4
LCB5LCB0eCwgdHksIEhpdFRlc3RGb3JlZ3JvdW5kKTsKIH0KIAogdm9pZCBSb290SW5saW5lQm94
OjphZGp1c3RQb3NpdGlvbihpbnQgZHgsIGludCBkeSkKQEAgLTIwNCw2ICsyMjIsMjMgQEAgdm9p
ZCBSb290SW5saW5lQm94OjpjaGlsZFJlbW92ZWQoSW5saW5lQgogCiBpbnQgUm9vdElubGluZUJv
eDo6dmVydGljYWxseUFsaWduQm94ZXMoaW50IGhlaWdodE9mQmxvY2spCiB7CisgICAgUmVuZGVy
QmxvY2sqIGlubGluZUJsb2NrID0gYW5vbnltb3VzSW5saW5lQmxvY2soKTsKKyAgICBpZiAoaW5s
aW5lQmxvY2spIHsKKyAgICAgICAgaW50IGxpbmVUb3AgPSBpbmxpbmVCbG9jay0+eSgpOworICAg
ICAgICBpbnQgbGluZUJvdHRvbSA9IGlubGluZUJsb2NrLT55KCkgKyBpbmxpbmVCbG9jay0+aGVp
Z2h0KCk7CisgICAgICAgIGZvciAoSW5saW5lQm94KiBjdXJyID0gZmlyc3RDaGlsZCgpOyBjdXJy
OyBjdXJyID0gc3RhdGljX2Nhc3Q8SW5saW5lRmxvd0JveCo+KGN1cnIpLT5maXJzdENoaWxkKCkp
IHsKKyAgICAgICAgICAgIGN1cnItPnNldFgoaW5saW5lQmxvY2stPngoKSk7CisgICAgICAgICAg
ICBjdXJyLT5zZXRZKGxpbmVUb3ApOworICAgICAgICAgICAgY3Vyci0+c2V0V2lkdGgoaW5saW5l
QmxvY2stPndpZHRoKCkpOworICAgICAgICAgICAgaWYgKGN1cnItPnJlbmRlcmVyKCkgPT0gaW5s
aW5lQmxvY2spCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc2V0
WShsaW5lVG9wKTsKKyAgICAgICAgY29tcHV0ZVZlcnRpY2FsT3ZlcmZsb3cobGluZVRvcCwgbGlu
ZUJvdHRvbSwgdHJ1ZSk7CisgICAgICAgIHNldExpbmVUb3BCb3R0b21Qb3NpdGlvbnMobGluZVRv
cCwgbGluZUJvdHRvbSk7CisgICAgICAgIHJldHVybiBoZWlnaHRPZkJsb2NrOworICAgIH0KKyAg
ICAKICAgICBpbnQgbWF4UG9zaXRpb25Ub3AgPSAwOwogICAgIGludCBtYXhQb3NpdGlvbkJvdHRv
bSA9IDA7CiAgICAgaW50IG1heEFzY2VudCA9IDA7CkBAIC0yMTcsNyArMjUyLDYgQEAgaW50IFJv
b3RJbmxpbmVCb3g6OnZlcnRpY2FsbHlBbGlnbkJveGVzKAogICAgIGJvb2wgc3RyaWN0TW9kZSA9
IChjdXJyICYmIGN1cnItPmRvY3VtZW50KCktPmluU3RyaWN0TW9kZSgpKTsKIAogICAgIGNvbXB1
dGVMb2dpY2FsQm94SGVpZ2h0cyhtYXhQb3NpdGlvblRvcCwgbWF4UG9zaXRpb25Cb3R0b20sIG1h
eEFzY2VudCwgbWF4RGVzY2VudCwgc3RyaWN0TW9kZSk7Ci0KICAgICBpZiAobWF4QXNjZW50ICsg
bWF4RGVzY2VudCA8IG1heChtYXhQb3NpdGlvblRvcCwgbWF4UG9zaXRpb25Cb3R0b20pKQogICAg
ICAgICBhZGp1c3RNYXhBc2NlbnRBbmREZXNjZW50KG1heEFzY2VudCwgbWF4RGVzY2VudCwgbWF4
UG9zaXRpb25Ub3AsIG1heFBvc2l0aW9uQm90dG9tKTsKIApAQCAtMzMyLDcgKzM2Niw3IEBAIElu
bGluZUJveCogUm9vdElubGluZUJveDo6bGFzdFNlbGVjdGVkQm8KIGludCBSb290SW5saW5lQm94
OjpzZWxlY3Rpb25Ub3AoKSBjb25zdAogewogICAgIGludCBzZWxlY3Rpb25Ub3AgPSBtX2xpbmVU
b3A7Ci0gICAgaWYgKCFwcmV2Um9vdEJveCgpKQorICAgIGlmICghcHJldlJvb3RCb3goKSB8fCBw
cmV2Um9vdEJveCgpLT5oYXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKQogICAgICAgICByZXR1cm4g
c2VsZWN0aW9uVG9wOwogCiAgICAgaW50IHByZXZCb3R0b20gPSBwcmV2Um9vdEJveCgpLT5zZWxl
Y3Rpb25Cb3R0b20oKTsKQEAgLTQzMCw0ICs0NjQsMjAgQEAgdm9pZCBSb290SW5saW5lQm94Ojph
dHRhY2hMaW5lQm94VG9SZW5kZQogICAgIGJsb2NrKCktPmxpbmVCb3hlcygpLT5hdHRhY2hMaW5l
Qm94KHRoaXMpOwogfQogCitSZW5kZXJCbG9jayogUm9vdElubGluZUJveDo6YW5vbnltb3VzSW5s
aW5lQmxvY2soKSBjb25zdAoreworICAgIGlmIChoYXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKQor
ICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgUm9vdEFub255bW91c0lubGluZUJsb2Nr
Qm94Kj4odGhpcyktPmlubGluZUJsb2NrKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgUm9v
dEFub255bW91c0lubGluZUJsb2NrQm94OjpwYWludChSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYg
cGFpbnRJbmZvLCBpbnQgdHgsIGludCB0eSkKK3sKKyAgICAvLyBTa2lwIHRoZSBleHRyYSB3b3Jr
IGRvbmUgYnkgUm9vdElubGluZUJveDo6cGFpbnQuIENhY2hlIG91ciBhbm9ueW1vdXMgYmxvY2sg
aW4gdGhlIHBhaW50IGluZm8gZm9yIGVhc3kKKyAgICAvLyBhY2Nlc3MgYXMgd2UgcmVjdXIgaW50
byB0aGUgbGluZS4KKyAgICBwYWludEluZm8uYW5vbnltb3VzSW5saW5lQmxvY2sgPSBtX2Fub255
bW91c0lubGluZUJsb2NrOworICAgIElubGluZUZsb3dCb3g6OnBhaW50KHBhaW50SW5mbywgdHgs
IHR5KTsKKyAgICBwYWludEluZm8uYW5vbnltb3VzSW5saW5lQmxvY2sgPSAwOworfQorCiB9IC8v
IG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9Sb290SW5saW5lQm94
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUm9vdElubGluZUJveC5oCShyZXZp
c2lvbiA1NDU2MSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1Jvb3RJbmxpbmVCb3guaAkod29ya2lu
ZyBjb3B5KQpAQCAtNDAsNiArNDAsNyBAQCBwdWJsaWM6CiAgICAgICAgICwgbV9saW5lQnJlYWtQ
b3MoMCkKICAgICAgICAgLCBtX2xpbmVUb3AoMCkKICAgICAgICAgLCBtX2xpbmVCb3R0b20oMCkK
KyAgICAgICAgLCBtX2hhc0Fub255bW91c0lubGluZUJsb2NrKGZhbHNlKQogICAgIHsKICAgICB9
CiAKQEAgLTEwMiw3ICsxMDMsNyBAQCBwdWJsaWM6CiAjZW5kaWYKIAogICAgIHZpcnR1YWwgdm9p
ZCBwYWludChSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5KTsKLSAgICB2
aXJ0dWFsIGJvb2wgbm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVz
dWx0JiwgaW50LCBpbnQsIGludCwgaW50KTsKKyAgICB2aXJ0dWFsIGJvb2wgbm9kZUF0UG9pbnQo
Y29uc3QgSGl0VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVzdWx0JiwgaW50LCBpbnQsIGludCwgaW50
LCBIaXRUZXN0QWN0aW9uKTsKIAogICAgIGJvb2wgaGFzU2VsZWN0ZWRDaGlsZHJlbigpIGNvbnN0
IHsgcmV0dXJuIG1faGFzU2VsZWN0ZWRDaGlsZHJlbjsgfQogICAgIHZvaWQgc2V0SGFzU2VsZWN0
ZWRDaGlsZHJlbihib29sKTsKQEAgLTEzMiw2ICsxMzMsMTEgQEAgcHVibGljOgogICAgIHZpcnR1
YWwgdm9pZCBhdHRhY2hMaW5lQm94VG9SZW5kZXJPYmplY3QoKTsKICAgICB2aXJ0dWFsIHZvaWQg
cmVtb3ZlTGluZUJveEZyb21SZW5kZXJPYmplY3QoKTsKIAorICAgIGJvb2wgaGFzQW5vbnltb3Vz
SW5saW5lQmxvY2soKSBjb25zdCB7IHJldHVybiBtX2hhc0Fub255bW91c0lubGluZUJsb2NrOyB9
CisgICAgdm9pZCBzZXRIYXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpIHsgbV9oYXNBbm9ueW1vdXNJ
bmxpbmVCbG9jayA9IHRydWU7IH0KKworICAgIFJlbmRlckJsb2NrKiBhbm9ueW1vdXNJbmxpbmVC
bG9jaygpIGNvbnN0OworCiBwcm90ZWN0ZWQ6CiAgICAgLy8gV2hlcmUgdGhpcyBsaW5lIGVuZGVk
LiAgVGhlIGV4YWN0IG9iamVjdCBhbmQgdGhlIHBvc2l0aW9uIHdpdGhpbiB0aGF0IG9iamVjdCBh
cmUgc3RvcmVkIHNvIHRoYXQKICAgICAvLyB3ZSBjYW4gY3JlYXRlIGFuIElubGluZUl0ZXJhdG9y
IGJlZ2lubmluZyBqdXN0IGFmdGVyIHRoZSBlbmQgb2YgdGhpcyBsaW5lLgpAQCAtMTUyLDYgKzE1
OCw4IEBAIHByb3RlY3RlZDoKICAgICBXVEY6OlVuaWNvZGU6OkRpcmVjdGlvbiBtX2xpbmVCcmVh
a0JpZGlTdGF0dXNFb3IgOiA1OwogICAgIFdURjo6VW5pY29kZTo6RGlyZWN0aW9uIG1fbGluZUJy
ZWFrQmlkaVN0YXR1c0xhc3RTdHJvbmcgOiA1OwogICAgIFdURjo6VW5pY29kZTo6RGlyZWN0aW9u
IG1fbGluZUJyZWFrQmlkaVN0YXR1c0xhc3QgOiA1OworICAgIAorICAgIGJvb2wgbV9oYXNBbm9u
eW1vdXNJbmxpbmVCbG9jayA6IDE7CiB9OwogCiBpbmxpbmUgdm9pZCBSb290SW5saW5lQm94Ojpz
ZXRMaW5lVG9wQm90dG9tUG9zaXRpb25zKGludCB0b3AsIGludCBib3R0b20pIApAQCAtMTYwLDYg
KzE2OCwyNSBAQCBpbmxpbmUgdm9pZCBSb290SW5saW5lQm94OjpzZXRMaW5lVG9wQm90CiAgICAg
bV9saW5lQm90dG9tID0gYm90dG9tOyAKIH0KIAorLy8gRm9yIGFub255bW91cyBpbmxpbmUgYmxv
Y2sgb2JqZWN0cy4KK2NsYXNzIFJvb3RBbm9ueW1vdXNJbmxpbmVCbG9ja0JveCA6IHB1YmxpYyBS
b290SW5saW5lQm94Cit7CitwdWJsaWM6CisgICAgUm9vdEFub255bW91c0lubGluZUJsb2NrQm94
KFJlbmRlck9iamVjdCogcm9vdEJsb2NrLCBSZW5kZXJCbG9jayogYW5vbnltb3VzQmxvY2spCisg
ICAgICAgIDogUm9vdElubGluZUJveChyb290QmxvY2spCisgICAgICAgICwgbV9hbm9ueW1vdXNJ
bmxpbmVCbG9jayhhbm9ueW1vdXNCbG9jaykKKyAgICB7CisgICAgICAgIHNldEhhc0Fub255bW91
c0lubGluZUJsb2NrKCk7CisgICAgfQorICAgIAorICAgIFJlbmRlckJsb2NrKiBpbmxpbmVCbG9j
aygpIGNvbnN0IHsgcmV0dXJuIG1fYW5vbnltb3VzSW5saW5lQmxvY2s7IH0KKyAgICAKKyAgICB2
aXJ0dWFsIHZvaWQgcGFpbnQoUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgaW50
IHR4LCBpbnQgdHkpOworCitwcml2YXRlOgorICAgIFJlbmRlckJsb2NrKiBtX2Fub255bW91c0lu
bGluZUJsb2NrOworfTsKKwogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQogCiAjZW5kaWYgLy8gUm9v
dElubGluZUJveF9oCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>48515</attachid>
            <date>2010-02-10 14:33:56 -0800</date>
            <delta_ts>2010-02-11 13:22:22 -0800</delta_ts>
            <desc>Make hit testing work inside layers.  Refine painting and hit testing to fix some glitches.</desc>
            <filename>patch.txt</filename>
            <type>text/plain</type>
            <size>160881</size>
            <attacher name="Dave Hyatt">hyatt</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShyZXZpc2lv
biA1NDU2MSkKKysrIFdlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCSh3
b3JraW5nIGNvcHkpCkBAIC00NTQ4LDYgKzQ1NDgsOSBAQAogCQlCQ0U2NUJFQTBFQUNERjE2MDA3
RTQ1MzMgLyogTGVuZ3RoLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IEJDRTY1QkU4MEVBQ0RGMTYwMDdFNDUzMyAvKiBMZW5ndGguY3BwICovOyB9Owog
CQlCQ0U2NUJFQjBFQUNERjE2MDA3RTQ1MzMgLyogTGVuZ3RoLmggaW4gSGVhZGVycyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCQ0U2NUJFOTBFQUNERjE2MDA3RTQ1MzMgLyog
TGVuZ3RoLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsK
IAkJQkNFNjVEMzIwRUFEMTIxMTAwN0U0NTMzIC8qIFRoZW1lLmNwcCBpbiBTb3VyY2VzICovID0g
e2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJDRTY1RDMxMEVBRDEyMTEwMDdFNDUzMyAv
KiBUaGVtZS5jcHAgKi87IH07CisJCUJDRTc4OTE2MTEyMEQ2MDgwMDYwRUNFNSAvKiBJbmxpbmVJ
dGVyYXRvci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
QkNFNzg5MTUxMTIwRDYwODAwNjBFQ0U1IC8qIElubGluZUl0ZXJhdG9yLmggKi87IH07CisJCUJD
RTc4OTg2MTEyMEU3QTYwMDYwRUNFNSAvKiBCaWRpUnVuLmggaW4gSGVhZGVycyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCQ0U3ODk4NTExMjBFN0E2MDA2MEVDRTUgLyogQmlk
aVJ1bi5oICovOyB9OworCQlCQ0U3ODk4QjExMjBFODAyMDA2MEVDRTUgLyogQmlkaVJ1bi5jcHAg
aW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCQ0U3ODk4QTEx
MjBFODAyMDA2MEVDRTUgLyogQmlkaVJ1bi5jcHAgKi87IH07CiAJCUJDRTdCMTkzMEQ0RTg2OTYw
MDc1QTUzOSAvKiBKU0hpc3RvcnlDdXN0b20uY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gQkNFN0IxOTIwRDRFODY5NjAwNzVBNTM5IC8qIEpTSGlzdG9y
eUN1c3RvbS5jcHAgKi87IH07CiAJCUJDRTk5RUMzMERDQTYyNDEwMDE4MjY4MyAvKiBKU1hTTFRQ
cm9jZXNzb3JDb25zdHJ1Y3Rvci5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSBCQ0U5OUVDMTBEQ0E2MjQxMDAxODI2ODMgLyogSlNYU0xUUHJvY2Vzc29y
Q29uc3RydWN0b3IuY3BwICovOyB9OwogCQlCQ0U5OUVDNDBEQ0E2MjQxMDAxODI2ODMgLyogSlNY
U0xUUHJvY2Vzc29yQ29uc3RydWN0b3IuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IEJDRTk5RUMyMERDQTYyNDEwMDE4MjY4MyAvKiBKU1hTTFRQcm9jZXNz
b3JDb25zdHJ1Y3Rvci5oICovOyB9OwpAQCAtOTgxMCw2ICs5ODEzLDkgQEAKIAkJQkNFNjVCRTgw
RUFDREYxNjAwN0U0NTMzIC8qIExlbmd0aC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5j
cHA7IHBhdGggPSBMZW5ndGguY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlCQ0U2
NUJFOTBFQUNERjE2MDA3RTQ1MzMgLyogTGVuZ3RoLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMu
aDsgcGF0aCA9IExlbmd0aC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlCQ0U2NUQz
MTBFQUQxMjExMDA3RTQ1MzMgLyogVGhlbWUuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAu
Y3BwOyBwYXRoID0gVGhlbWUuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlCQ0U3
ODkxNTExMjBENjA4MDA2MEVDRTUgLyogSW5saW5lSXRlcmF0b3IuaCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuYy5oOyBwYXRoID0gSW5saW5lSXRlcmF0b3IuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+
IjsgfTsKKwkJQkNFNzg5ODUxMTIwRTdBNjAwNjBFQ0U1IC8qIEJpZGlSdW4uaCAqLyA9IHtpc2Eg
PSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9
IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQmlkaVJ1bi5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OworCQlCQ0U3ODk4QTExMjBFODAyMDA2MEVDRTUgLyogQmlkaVJ1bi5jcHAgKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUg
PSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBCaWRpUnVuLmNwcDsgc291cmNlVHJlZSA9ICI8
Z3JvdXA+IjsgfTsKIAkJQkNFN0IxOTIwRDRFODY5NjAwNzVBNTM5IC8qIEpTSGlzdG9yeUN1c3Rv
bS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFz
dEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBKU0hpc3RvcnlDdXN0
b20uY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlCQ0U5OUVDMTBEQ0E2MjQxMDAx
ODI2ODMgLyogSlNYU0xUUHJvY2Vzc29yQ29uc3RydWN0b3IuY3BwICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jcHAuY3BwOyBwYXRoID0gSlNYU0xUUHJvY2Vzc29yQ29uc3RydWN0b3IuY3BwOyBzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlCQ0U5OUVDMjBEQ0E2MjQxMDAxODI2ODMgLyogSlNY
U0xUUHJvY2Vzc29yQ29uc3RydWN0b3IuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBm
aWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRo
ID0gSlNYU0xUUHJvY2Vzc29yQ29uc3RydWN0b3IuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKQEAgLTE1NTU2LDYgKzE1NTYyLDggQEAKIAkJCQlCQzhDOEZBQTBERENEMkYyMDBCNTkyRjQg
Lyogc3R5bGUgKi8sCiAJCQkJQThDRkYwNEIwQTE1NEYwOTAwMEE0MjM0IC8qIEF1dG9UYWJsZUxh
eW91dC5jcHAgKi8sCiAJCQkJQThDRkYwNDkwQTE1NEYwOTAwMEE0MjM0IC8qIEF1dG9UYWJsZUxh
eW91dC5oICovLAorCQkJCUJDRTc4OThBMTEyMEU4MDIwMDYwRUNFNSAvKiBCaWRpUnVuLmNwcCAq
LywKKwkJCQlCQ0U3ODk4NTExMjBFN0E2MDA2MEVDRTUgLyogQmlkaVJ1bi5oICovLAogCQkJCUJD
RUE0ODE1MDk3RDkzMDIwMDk0QzlFNCAvKiBicmVha19saW5lcy5jcHAgKi8sCiAJCQkJQkNFQTQ4
MTYwOTdEOTMwMjAwOTRDOUU0IC8qIGJyZWFrX2xpbmVzLmggKi8sCiAJCQkJOTM5MkYxNEYwQUQx
ODYyMzAwNjkxQkQ0IC8qIENvdW50ZXJOb2RlLmNwcCAqLywKQEAgLTE1NTcyLDYgKzE1NTgwLDcg
QEAKIAkJCQlBOENGRjVERTBBMTU1QTA1MDAwQTQyMzQgLyogSW5saW5lQm94LmggKi8sCiAJCQkJ
QThDRkY1REQwQTE1NUEwNTAwMEE0MjM0IC8qIElubGluZUZsb3dCb3guY3BwICovLAogCQkJCUE4
Q0ZGNURDMEExNTVBMDUwMDBBNDIzNCAvKiBJbmxpbmVGbG93Qm94LmggKi8sCisJCQkJQkNFNzg5
MTUxMTIwRDYwODAwNjBFQ0U1IC8qIElubGluZUl0ZXJhdG9yLmggKi8sCiAJCQkJQThDRkY1REIw
QTE1NUEwNTAwMEE0MjM0IC8qIElubGluZVJ1bkJveC5oICovLAogCQkJCUJDRUE0ODFBMDk3RDkz
MDIwMDk0QzlFNCAvKiBJbmxpbmVUZXh0Qm94LmNwcCAqLywKIAkJCQlCQ0VBNDgxQjA5N0Q5MzAy
MDA5NEM5RTQgLyogSW5saW5lVGV4dEJveC5oICovLApAQCAtMTg1MDUsNiArMTg1MTQsOCBAQAog
CQkJCUI3MUZFNkRGMTEwOTFDQjMwMERBRUY3NyAvKiBQcmludENvbnRleHQuaCBpbiBIZWFkZXJz
ICovLAogCQkJCTlGNzIzMDRGMTExODRCNDEwMEFEMDEyNiAvKiBTY3JpcHRQcm9maWxlLmggaW4g
SGVhZGVycyAqLywKIAkJCQk5RjcyMzA1MTExMTg0QjQxMDBBRDAxMjYgLyogU2NyaXB0UHJvZmls
ZXIuaCBpbiBIZWFkZXJzICovLAorCQkJCUJDRTc4OTE2MTEyMEQ2MDgwMDYwRUNFNSAvKiBJbmxp
bmVJdGVyYXRvci5oIGluIEhlYWRlcnMgKi8sCisJCQkJQkNFNzg5ODYxMTIwRTdBNjAwNjBFQ0U1
IC8qIEJpZGlSdW4uaCBpbiBIZWFkZXJzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBsb3lt
ZW50UG9zdHByb2Nlc3NpbmcgPSAwOwogCQl9OwpAQCAtMjA2ODMsNiArMjA2OTQsNyBAQAogCQkJ
CTg0RDBDNDA0MTExNUYxRDQwMDE4QUEzNCAvKiBBZmZpbmVUcmFuc2Zvcm0uY3BwIGluIFNvdXJj
ZXMgKi8sCiAJCQkJQjc3NkQ0M0QxMTA0NTI3NTAwQkVCMEVDIC8qIFByaW50Q29udGV4dC5jcHAg
aW4gU291cmNlcyAqLywKIAkJCQk5RjcyMzA1MDExMTg0QjQxMDBBRDAxMjYgLyogU2NyaXB0UHJv
ZmlsZXIuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJQkNFNzg5OEIxMTIwRTgwMjAwNjBFQ0U1IC8q
IEJpZGlSdW4uY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkpOwogCQkJcnVuT25seUZvckRlcGxveW1l
bnRQb3N0cHJvY2Vzc2luZyA9IDA7CiAJCX07CkluZGV4OiBXZWJDb3JlL2FjY2Vzc2liaWxpdHkv
QWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9hY2Nl
c3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3QuY3BwCShyZXZpc2lvbiA1NDU2MSkK
KysrIFdlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0LmNwcAko
d29ya2luZyBjb3B5KQpAQCAtNTY3LDEyICs1NjcsOCBAQCBFbGVtZW50KiBBY2Nlc3NpYmlsaXR5
UmVuZGVyT2JqZWN0OjphbmNoCiAgICAgUmVuZGVyT2JqZWN0KiBjdXJyUmVuZGVyZXI7CiAgICAg
CiAgICAgLy8gU2VhcmNoIHVwIHRoZSByZW5kZXIgdHJlZSBmb3IgYSBSZW5kZXJPYmplY3Qgd2l0
aCBhIERPTSBub2RlLiAgRGVmZXIgdG8gYW4gZWFybGllciBjb250aW51YXRpb24sIHRob3VnaC4K
LSAgICBmb3IgKGN1cnJSZW5kZXJlciA9IG1fcmVuZGVyZXI7IGN1cnJSZW5kZXJlciAmJiAhY3Vy
clJlbmRlcmVyLT5ub2RlKCk7IGN1cnJSZW5kZXJlciA9IGN1cnJSZW5kZXJlci0+cGFyZW50KCkp
IHsKLSAgICAgICAgaWYgKGN1cnJSZW5kZXJlci0+aXNSZW5kZXJCbG9jaygpKSB7Ci0gICAgICAg
ICAgICBSZW5kZXJJbmxpbmUqIGNvbnRpbnVhdGlvbiA9IHRvUmVuZGVyQmxvY2soY3VyclJlbmRl
cmVyKS0+aW5saW5lQ29udGludWF0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoY29udGludWF0aW9u
KQotICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZS0+Z2V0T3JDcmVhdGUoY29udGludWF0aW9u
KS0+YW5jaG9yRWxlbWVudCgpOwotICAgICAgICB9CisgICAgZm9yIChjdXJyUmVuZGVyZXIgPSBt
X3JlbmRlcmVyOyBjdXJyUmVuZGVyZXIgJiYgIWN1cnJSZW5kZXJlci0+bm9kZSgpOyBjdXJyUmVu
ZGVyZXIgPSBjdXJyUmVuZGVyZXItPnBhcmVudCgpKQorICAgIHsKICAgICB9CiAgICAgCiAgICAg
Ly8gYmFpbCBpZiBub25lIGZvdW5kCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9CaWRpUnVuLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9CaWRpUnVuLmNwcAkocmV2aXNpb24g
MCkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL0JpZGlSdW4uY3BwCShyZXZpc2lvbiAwKQpAQCAtMCww
ICsxLDc0IEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMTk5OSBMYXJzIEtub2xsIChrbm9sbEBr
ZGUub3JnKQorICogICAgICAgICAgIChDKSAxOTk5IEFudHRpIEtvaXZpc3RvIChrb2l2aXN0b0Br
ZGUub3JnKQorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDEwIEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBBbmRy
ZXcgV2VsbGluZ3RvbiAocHJvdG9uQHdpcmV0YXBwZWQubmV0KQorICoKKyAqIFRoaXMgbGlicmFy
eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1v
ZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
CisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
OyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9u
KSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQg
aW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBX
QVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFO
VEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdO
VQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisg
KgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0
aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisg
KiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgIkJpZGlSdW4uaCIKKyNpbmNsdWRlICJJbmxpbmVCb3guaCIKKyNpbmNs
dWRlICJSZW5kZXJBcmVuYS5oIgorI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkTGVha0NvdW50ZXIu
aD4KKwordXNpbmcgbmFtZXNwYWNlIFdURjsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisjaWZu
ZGVmIE5ERUJVRworc3RhdGljIFJlZkNvdW50ZWRMZWFrQ291bnRlciBiaWRpUnVuQ291bnRlcigi
QmlkaVJ1biIpOworCitzdGF0aWMgYm9vbCBpbkJpZGlSdW5EZXN0cm95OworI2VuZGlmCisKK3Zv
aWQgQmlkaVJ1bjo6ZGVzdHJveSgpCit7CisjaWZuZGVmIE5ERUJVRworICAgIGluQmlkaVJ1bkRl
c3Ryb3kgPSB0cnVlOworI2VuZGlmCisgICAgUmVuZGVyQXJlbmEqIHJlbmRlckFyZW5hID0gbV9v
YmplY3QtPnJlbmRlckFyZW5hKCk7CisgICAgZGVsZXRlIHRoaXM7CisjaWZuZGVmIE5ERUJVRwor
ICAgIGluQmlkaVJ1bkRlc3Ryb3kgPSBmYWxzZTsKKyNlbmRpZgorCisgICAgLy8gUmVjb3ZlciB0
aGUgc2l6ZSBsZWZ0IHRoZXJlIGZvciB1cyBieSBvcGVyYXRvciBkZWxldGUgYW5kIGZyZWUgdGhl
IG1lbW9yeS4KKyAgICByZW5kZXJBcmVuYS0+ZnJlZSgqcmVpbnRlcnByZXRfY2FzdDxzaXplX3Qq
Pih0aGlzKSwgdGhpcyk7Cit9CisKK3ZvaWQqIEJpZGlSdW46Om9wZXJhdG9yIG5ldyhzaXplX3Qg
c3osIFJlbmRlckFyZW5hKiByZW5kZXJBcmVuYSkgdGhyb3coKQoreworI2lmbmRlZiBOREVCVUcK
KyAgICBiaWRpUnVuQ291bnRlci5pbmNyZW1lbnQoKTsKKyNlbmRpZgorICAgIHJldHVybiByZW5k
ZXJBcmVuYS0+YWxsb2NhdGUoc3opOworfQorCit2b2lkIEJpZGlSdW46Om9wZXJhdG9yIGRlbGV0
ZSh2b2lkKiBwdHIsIHNpemVfdCBzeikKK3sKKyNpZm5kZWYgTkRFQlVHCisgICAgYmlkaVJ1bkNv
dW50ZXIuZGVjcmVtZW50KCk7CisjZW5kaWYKKyAgICBBU1NFUlQoaW5CaWRpUnVuRGVzdHJveSk7
CisKKyAgICAvLyBTdGFzaCBzaXplIHdoZXJlIGRlc3Ryb3koKSBjYW4gZmluZCBpdC4KKyAgICAq
KHNpemVfdCopcHRyID0gc3o7Cit9CisKK30KSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL0JpZGlS
dW4uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9CaWRpUnVuLmgJKHJldmlzaW9u
IDApCisrKyBXZWJDb3JlL3JlbmRlcmluZy9CaWRpUnVuLmgJKHJldmlzaW9uIDApCkBAIC0wLDAg
KzEsNjYgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAxOTk5IExhcnMgS25vbGwgKGtub2xsQGtk
ZS5vcmcpCisgKiAgICAgICAgICAgKEMpIDE5OTkgQW50dGkgS29pdmlzdG8gKGtvaXZpc3RvQGtk
ZS5vcmcpCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMTAgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA2IEFuZHJl
dyBXZWxsaW5ndG9uIChwcm90b25Ad2lyZXRhcHBlZC5uZXQpCisgKgorICogVGhpcyBsaWJyYXJ5
IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9k
aWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMK
KyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247
IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24p
IGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBp
biB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdB
UlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5U
QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05V
CisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAq
CisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRo
ZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdh
cmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAq
IEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZuZGVmIEJpZGlSdW5f
aAorI2RlZmluZSBCaWRpUnVuX2gKKworI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KKyNp
bmNsdWRlICJCaWRpUmVzb2x2ZXIuaCIKKyNpbmNsdWRlICJSZW5kZXJUZXh0LmgiCisKK25hbWVz
cGFjZSBXZWJDb3JlIHsKKworY2xhc3MgQmlkaUNvbnRleHQ7CitjbGFzcyBJbmxpbmVCb3g7CisK
K3N0cnVjdCBCaWRpUnVuIDogQmlkaUNoYXJhY3RlclJ1biB7CisgICAgQmlkaVJ1bihpbnQgc3Rh
cnQsIGludCBzdG9wLCBSZW5kZXJPYmplY3QqIG9iamVjdCwgQmlkaUNvbnRleHQqIGNvbnRleHQs
IFdURjo6VW5pY29kZTo6RGlyZWN0aW9uIGRpcikKKyAgICAgICAgOiBCaWRpQ2hhcmFjdGVyUnVu
KHN0YXJ0LCBzdG9wLCBjb250ZXh0LCBkaXIpCisgICAgICAgICwgbV9vYmplY3Qob2JqZWN0KQor
ICAgICAgICAsIG1fYm94KDApCisgICAgeworICAgIH0KKworICAgIHZvaWQgZGVzdHJveSgpOwor
CisgICAgLy8gT3ZlcmxvYWRlZCBuZXcgb3BlcmF0b3IuCisgICAgdm9pZCogb3BlcmF0b3IgbmV3
KHNpemVfdCwgUmVuZGVyQXJlbmEqKSB0aHJvdygpOworCisgICAgLy8gT3ZlcnJpZGRlbiB0byBw
cmV2ZW50IHRoZSBub3JtYWwgZGVsZXRlIGZyb20gYmVpbmcgY2FsbGVkLgorICAgIHZvaWQgb3Bl
cmF0b3IgZGVsZXRlKHZvaWQqLCBzaXplX3QpOworCisgICAgQmlkaVJ1biogbmV4dCgpIHsgcmV0
dXJuIHN0YXRpY19jYXN0PEJpZGlSdW4qPihtX25leHQpOyB9CisKK3ByaXZhdGU6CisgICAgLy8g
VGhlIG5vcm1hbCBvcGVyYXRvciBuZXcgaXMgZGlzYWxsb3dlZC4KKyAgICB2b2lkKiBvcGVyYXRv
ciBuZXcoc2l6ZV90KSB0aHJvdygpOworCitwdWJsaWM6CisgICAgUmVuZGVyT2JqZWN0KiBtX29i
amVjdDsKKyAgICBJbmxpbmVCb3gqIG1fYm94OworfTsKKworfQorCisjZW5kaWYgLy8gQmlkaVJ1
bl9oCisKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL0VsbGlwc2lzQm94LmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9FbGxpcHNpc0JveC5jcHAJKHJldmlzaW9uIDU0NTYxKQor
KysgV2ViQ29yZS9yZW5kZXJpbmcvRWxsaXBzaXNCb3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC02
NCw3ICs2NCw4IEBAIHZvaWQgRWxsaXBzaXNCb3g6OnBhaW50KFJlbmRlck9iamVjdDo6UGEKICAg
ICAgICAgLy8gUGFpbnQgdGhlIG1hcmt1cCBib3gKICAgICAgICAgdHggKz0gbV94ICsgbV93aWR0
aCAtIG1fbWFya3VwQm94LT54KCk7CiAgICAgICAgIHR5ICs9IG1feSArIHN0eWxlLT5mb250KCku
YXNjZW50KCkgLSAobV9tYXJrdXBCb3gtPnkoKSArIG1fbWFya3VwQm94LT5yZW5kZXJlcigpLT5z
dHlsZShtX2ZpcnN0TGluZSktPmZvbnQoKS5hc2NlbnQoKSk7Ci0gICAgICAgIG1fbWFya3VwQm94
LT5wYWludChwYWludEluZm8sIHR4LCB0eSk7CisgICAgICAgIExpbmVCb3hQYWludEluZm8gbGlu
ZUJveFBhaW50SW5mbzsKKyAgICAgICAgbV9tYXJrdXBCb3gtPnBhaW50KHBhaW50SW5mbywgdHgs
IHR5LCBsaW5lQm94UGFpbnRJbmZvKTsKICAgICB9CiB9CiAKQEAgLTk3LDcgKzk4LDcgQEAgdm9p
ZCBFbGxpcHNpc0JveDo6cGFpbnRTZWxlY3Rpb24oR3JhcGhpYwogICAgIGNvbnRleHQtPnJlc3Rv
cmUoKTsKIH0KIAotYm9vbCBFbGxpcHNpc0JveDo6bm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJl
cXVlc3QmIHJlcXVlc3QsIEhpdFRlc3RSZXN1bHQmIHJlc3VsdCwgaW50IHgsIGludCB5LCBpbnQg
dHgsIGludCB0eSkKK2Jvb2wgRWxsaXBzaXNCb3g6Om5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RS
ZXF1ZXN0JiByZXF1ZXN0LCBIaXRUZXN0UmVzdWx0JiByZXN1bHQsIGludCB4LCBpbnQgeSwgaW50
IHR4LCBpbnQgdHksIEhpdFRlc3RBY3Rpb24gaGl0VGVzdEFjdGlvbiwgTGluZUJveEhpdFRlc3RJ
bmZvJiBoaXRUZXN0SW5mbykKIHsKICAgICB0eCArPSBtX3g7CiAgICAgdHkgKz0gbV95OwpAQCAt
MTA3LDcgKzEwOCw3IEBAIGJvb2wgRWxsaXBzaXNCb3g6Om5vZGVBdFBvaW50KGNvbnN0IEhpdFQK
ICAgICAgICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gbV9yZW5kZXJlci0+c3R5bGUobV9maXJzdExp
bmUpOwogICAgICAgICBpbnQgbXR4ID0gdHggKyBtX3dpZHRoIC0gbV9tYXJrdXBCb3gtPngoKTsK
ICAgICAgICAgaW50IG10eSA9IHR5ICsgc3R5bGUtPmZvbnQoKS5hc2NlbnQoKSAtIChtX21hcmt1
cEJveC0+eSgpICsgbV9tYXJrdXBCb3gtPnJlbmRlcmVyKCktPnN0eWxlKG1fZmlyc3RMaW5lKS0+
Zm9udCgpLmFzY2VudCgpKTsKLSAgICAgICAgaWYgKG1fbWFya3VwQm94LT5ub2RlQXRQb2ludChy
ZXF1ZXN0LCByZXN1bHQsIHgsIHksIG10eCwgbXR5KSkgeworICAgICAgICBpZiAobV9tYXJrdXBC
b3gtPm5vZGVBdFBvaW50KHJlcXVlc3QsIHJlc3VsdCwgeCwgeSwgbXR4LCBtdHksIGhpdFRlc3RB
Y3Rpb24sIGhpdFRlc3RJbmZvKSkgewogICAgICAgICAgICAgcmVuZGVyZXIoKS0+dXBkYXRlSGl0
VGVzdFJlc3VsdChyZXN1bHQsIEludFBvaW50KHggLSBtdHgsIHkgLSBtdHkpKTsKICAgICAgICAg
ICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9FbGxp
cHNpc0JveC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL0VsbGlwc2lzQm94LmgJ
KHJldmlzaW9uIDU0NTYxKQorKysgV2ViQ29yZS9yZW5kZXJpbmcvRWxsaXBzaXNCb3guaAkod29y
a2luZyBjb3B5KQpAQCAtMzksOCArMzksOCBAQCBwdWJsaWM6CiAgICAgewogICAgIH0KIAotICAg
IHZpcnR1YWwgdm9pZCBwYWludChSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGludCB0eCwgaW50
IHR5KTsKLSAgICB2aXJ0dWFsIGJvb2wgbm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3Qm
LCBIaXRUZXN0UmVzdWx0JiwgaW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSk7CisgICAgdm9p
ZCBwYWludChSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5KTsKKyAgICB2
aXJ0dWFsIGJvb2wgbm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVz
dWx0JiwgaW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSwgSGl0VGVzdEFjdGlvbiwgTGluZUJv
eEhpdFRlc3RJbmZvJik7CiAgICAgdm9pZCBzZXRTZWxlY3Rpb25TdGF0ZShSZW5kZXJPYmplY3Q6
OlNlbGVjdGlvblN0YXRlIHMpIHsgbV9zZWxlY3Rpb25TdGF0ZSA9IHM7IH0KICAgICBJbnRSZWN0
IHNlbGVjdGlvblJlY3QoaW50IHR4LCBpbnQgdHkpOwogCkluZGV4OiBXZWJDb3JlL3JlbmRlcmlu
Zy9JbmxpbmVCb3guY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUJv
eC5jcHAJKHJldmlzaW9uIDU0NTYxKQorKysgV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lQm94LmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgIkhpdFRlc3RSZXN1
bHQuaCIKICNpbmNsdWRlICJJbmxpbmVGbG93Qm94LmgiCiAjaW5jbHVkZSAiUmVuZGVyQXJlbmEu
aCIKLSNpbmNsdWRlICJSZW5kZXJCb3guaCIKKyNpbmNsdWRlICJSZW5kZXJWaWV3LmgiCiAjaW5j
bHVkZSAiUm9vdElubGluZUJveC5oIgogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwpAQCAtMTU5LDkg
KzE1OSwyNyBAQCB2b2lkIElubGluZUJveDo6YWRqdXN0UG9zaXRpb24oaW50IGR4LCBpCiAgICAg
fQogfQogCi12b2lkIElubGluZUJveDo6cGFpbnQoUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIHBh
aW50SW5mbywgaW50IHR4LCBpbnQgdHkpCit2b2lkIElubGluZUJveDo6cGFpbnQoUmVuZGVyT2Jq
ZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgaW50IHR4LCBpbnQgdHksIExpbmVCb3hQYWludElu
Zm8mIGxpbmVCb3hQYWludEluZm8pCiB7Ci0gICAgaWYgKCFyZW5kZXJlcigpLT5zaG91bGRQYWlu
dFdpdGhpblJvb3QocGFpbnRJbmZvKSB8fCAocGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VG
b3JlZ3JvdW5kICYmIHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlU2VsZWN0aW9uKSkKKyAg
ICBpZiAoIXJlbmRlcmVyKCktPnNob3VsZFBhaW50V2l0aGluUm9vdChwYWludEluZm8pKQorICAg
ICAgICByZXR1cm47CisgICAgCisgICAgUmVuZGVyQmxvY2sqIGFub255bW91c0lubGluZUJsb2Nr
ID0gbGluZUJveFBhaW50SW5mby5hbm9ueW1vdXNJbmxpbmVCbG9jazsKKyAgICBpZiAoYW5vbnlt
b3VzSW5saW5lQmxvY2sgPT0gcmVuZGVyZXIoKSkgeworICAgICAgICAvLyBUcmVhdCBwYWludGlu
ZyBvZiBhIHNwZWNpYWwgaW5saW5lLWJsb2NrIGxpbmUgbGlrZSB0aGUgcGFpbnRpbmcgb2YgYSBu
b3JtYWwgYmxvY2sgYW5kIGdvIHRocm91Z2ggYWxsIHBoYXNlcy4KKyAgICAgICAgUGFpbnRQaGFz
ZSBuZXdQaGFzZSA9IChwYWludEluZm8ucGhhc2UgPT0gUGFpbnRQaGFzZUNoaWxkT3V0bGluZXMp
ID8gUGFpbnRQaGFzZU91dGxpbmUgOiBwYWludEluZm8ucGhhc2U7CisgICAgICAgIG5ld1BoYXNl
ID0gKG5ld1BoYXNlID09IFBhaW50UGhhc2VDaGlsZEJsb2NrQmFja2dyb3VuZHMpID8gUGFpbnRQ
aGFzZUNoaWxkQmxvY2tCYWNrZ3JvdW5kIDogbmV3UGhhc2U7CisgICAgCisgICAgICAgIC8vIFdl
IGRvbid0IHBhaW50IG91ciBvd24gYmFja2dyb3VuZCwgYnV0IHdlIGRvIGxldCB0aGUgY2hpbGQg
cGFpbnQgaXRzIGJhY2tncm91bmQuCisgICAgICAgIFJlbmRlck9iamVjdDo6UGFpbnRJbmZvIGlu
Zm8ocGFpbnRJbmZvKTsKKyAgICAgICAgaW5mby5waGFzZSA9IG5ld1BoYXNlOworICAgICAgICBp
bmZvLnBhaW50aW5nUm9vdCA9IHJlbmRlcmVyKCktPnBhaW50aW5nUm9vdEZvckNoaWxkcmVuKHBh
aW50SW5mbyk7CisgICAgICAgIGlmICghYW5vbnltb3VzSW5saW5lQmxvY2stPmhhc1NlbGZQYWlu
dGluZ0xheWVyKCkpCisgICAgICAgICAgICBhbm9ueW1vdXNJbmxpbmVCbG9jay0+cGFpbnQoaW5m
bywgdHgsIHR5KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChwYWludEluZm8u
cGhhc2UgIT0gUGFpbnRQaGFzZUZvcmVncm91bmQgJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50
UGhhc2VTZWxlY3Rpb24pCiAgICAgICAgIHJldHVybjsKIAogICAgIC8vIFBhaW50IGFsbCBwaGFz
ZXMgb2YgcmVwbGFjZWQgZWxlbWVudHMgYXRvbWljYWxseSwgYXMgdGhvdWdoIHRoZSByZXBsYWNl
ZCBlbGVtZW50IGVzdGFibGlzaGVkIGl0cwpAQCAtMTgzLDkgKzIwMSwxNyBAQCB2b2lkIElubGlu
ZUJveDo6cGFpbnQoUmVuZGVyT2JqZWN0OjpQYWluCiAgICAgfQogfQogCi1ib29sIElubGluZUJv
eDo6bm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmIHJlcXVlc3QsIEhpdFRlc3RSZXN1
bHQmIHJlc3VsdCwgaW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSkKK2Jvb2wgSW5saW5lQm94
Ojpub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYgcmVxdWVzdCwgSGl0VGVzdFJlc3Vs
dCYgcmVzdWx0LCBpbnQgeCwgaW50IHksIGludCB0eCwgaW50IHR5LCBIaXRUZXN0QWN0aW9uIGhp
dFRlc3RBY3Rpb24sIExpbmVCb3hIaXRUZXN0SW5mbyYgaGl0VGVzdEluZm8pCiB7Ci0gICAgLy8g
SGl0IHRlc3QgYWxsIHBoYXNlcyBvZiByZXBsYWNlZCBlbGVtZW50cyBhdG9taWNhbGx5LCBhcyB0
aG91Z2ggdGhlIHJlcGxhY2VkIGVsZW1lbnQgZXN0YWJsaXNoZWQgaXRzCisgICAgLy8gSWYgd2Ug
YXJlIGFuIGFub255bW91cyBpbmxpbmUgYmxvY2ssIGhvbm9yIGhpdCB0ZXN0IHBoYXNlcy4KKyAg
ICBpZiAoaGl0VGVzdEluZm8uYW5vbnltb3VzSW5saW5lQmxvY2sgPT0gcmVuZGVyZXIoKSkgewor
ICAgICAgICBIaXRUZXN0QWN0aW9uIGNoaWxkSGl0VGVzdCA9IGhpdFRlc3RBY3Rpb247CisgICAg
ICAgIGlmIChoaXRUZXN0QWN0aW9uID09IEhpdFRlc3RDaGlsZEJsb2NrQmFja2dyb3VuZHMpCisg
ICAgICAgICAgICBjaGlsZEhpdFRlc3QgPSBIaXRUZXN0Q2hpbGRCbG9ja0JhY2tncm91bmQ7Cisg
ICAgICAgIHJldHVybiBoaXRUZXN0SW5mby5hbm9ueW1vdXNJbmxpbmVCbG9jay0+bm9kZUF0UG9p
bnQocmVxdWVzdCwgcmVzdWx0LCB4LCB5LCB0eCwgdHksIGNoaWxkSGl0VGVzdCk7CisgICAgfQor
CisgICAgLy8gT3RoZXJ3aXNlIGhpdCB0ZXN0IGFsbCBwaGFzZXMgb2YgcmVwbGFjZWQgZWxlbWVu
dHMgYXRvbWljYWxseSwgYXMgdGhvdWdoIHRoZSByZXBsYWNlZCBlbGVtZW50IGVzdGFibGlzaGVk
IGl0cwogICAgIC8vIG93biBzdGFja2luZyBjb250ZXh0LiAgKFNlZSBBcHBlbmRpeCBFLjIsIHNl
Y3Rpb24gNi40IG9uIGlubGluZSBibG9jay90YWJsZSBlbGVtZW50cyBpbiB0aGUgQ1NTMi4xCiAg
ICAgLy8gc3BlY2lmaWNhdGlvbi4pCiAgICAgcmV0dXJuIHJlbmRlcmVyKCktPmhpdFRlc3QocmVx
dWVzdCwgcmVzdWx0LCBJbnRQb2ludCh4LCB5KSwgdHgsIHR5KTsKSW5kZXg6IFdlYkNvcmUvcmVu
ZGVyaW5nL0lubGluZUJveC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL0lubGlu
ZUJveC5oCShyZXZpc2lvbiA1NDU2MSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUJveC5o
CSh3b3JraW5nIGNvcHkpCkBAIC0zMCw2ICszMCwyMyBAQCBjbGFzcyBIaXRUZXN0UmVxdWVzdDsK
IGNsYXNzIEhpdFRlc3RSZXN1bHQ7CiBjbGFzcyBSb290SW5saW5lQm94OwogCitzdHJ1Y3QgTGlu
ZUJveFBhaW50SW5mbworeworICAgIExpbmVCb3hQYWludEluZm8oKQorICAgICAgICA6IGFub255
bW91c0lubGluZUJsb2NrKDApCisgICAgeyB9CisgICAgCisgICAgUmVuZGVyQmxvY2sqIGFub255
bW91c0lubGluZUJsb2NrOworfTsKKworc3RydWN0IExpbmVCb3hIaXRUZXN0SW5mbworeworICAg
IExpbmVCb3hIaXRUZXN0SW5mbygpCisgICAgICAgIDogYW5vbnltb3VzSW5saW5lQmxvY2soMCkK
KyAgICB7IH0KKyAgICAKKyAgICBSZW5kZXJCbG9jayogYW5vbnltb3VzSW5saW5lQmxvY2s7Cit9
OwogCiAvLyBJbmxpbmVCb3ggcmVwcmVzZW50cyBhIHJlY3RhbmdsZSB0aGF0IG9jY3VycyBvbiBh
IGxpbmUuICBJdCBjb3JyZXNwb25kcyB0bwogLy8gc29tZSBSZW5kZXJPYmplY3QgKGkuZS4sIGl0
IHJlcHJlc2VudHMgYSBwb3J0aW9uIG9mIHRoYXQgUmVuZGVyT2JqZWN0KS4KQEAgLTExMiw4ICsx
MjksOCBAQCBwdWJsaWM6CiAKICAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0UG9zaXRpb24oaW50IGR4
LCBpbnQgZHkpOwogCi0gICAgdmlydHVhbCB2b2lkIHBhaW50KFJlbmRlck9iamVjdDo6UGFpbnRJ
bmZvJiwgaW50IHR4LCBpbnQgdHkpOwotICAgIHZpcnR1YWwgYm9vbCBub2RlQXRQb2ludChjb25z
dCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBpbnQgeCwgaW50IHksIGludCB0eCwg
aW50IHR5KTsKKyAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoUmVuZGVyT2JqZWN0OjpQYWludEluZm8m
LCBpbnQgdHgsIGludCB0eSwgTGluZUJveFBhaW50SW5mbyYpOworICAgIHZpcnR1YWwgYm9vbCBu
b2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBpbnQgeCwg
aW50IHksIGludCB0eCwgaW50IHR5LCBIaXRUZXN0QWN0aW9uLCBMaW5lQm94SGl0VGVzdEluZm8m
KTsKIAogICAgIC8vIE92ZXJsb2FkZWQgbmV3IG9wZXJhdG9yLgogICAgIHZvaWQqIG9wZXJhdG9y
IG5ldyhzaXplX3QsIFJlbmRlckFyZW5hKikgdGhyb3coKTsKSW5kZXg6IFdlYkNvcmUvcmVuZGVy
aW5nL0lubGluZUZsb3dCb3guY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL0lu
bGluZUZsb3dCb3guY3BwCShyZXZpc2lvbiA1NDU2MSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL0lu
bGluZUZsb3dCb3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVk
ZSAiUmVuZGVyTGF5ZXIuaCIKICNpbmNsdWRlICJSZW5kZXJMaXN0TWFya2VyLmgiCiAjaW5jbHVk
ZSAiUmVuZGVyVGFibGVDZWxsLmgiCisjaW5jbHVkZSAiUmVuZGVyVmlldy5oIgogI2luY2x1ZGUg
IlJvb3RJbmxpbmVCb3guaCIKICNpbmNsdWRlICJUZXh0LmgiCiAKQEAgLTIyNywxNCArMjI4LDEz
IEBAIHZvaWQgSW5saW5lRmxvd0JveDo6ZGV0ZXJtaW5lU3BhY2luZ0ZvckYKICAgICAgICAgLy8g
KDMpIFRoZSBsaW5lIG1heSBlbmQgb24gdGhlIGlubGluZS4gIElmIHdlIGFyZSB0aGUgbGFzdCBj
aGlsZCAoY2xpbWJpbmcgdXAKICAgICAgICAgLy8gdGhlIGVuZCBvYmplY3QncyBjaGFpbiksIHRo
ZW4gd2UganVzdCBjbG9zZWQgYXMgd2VsbC4KICAgICAgICAgaWYgKCFsaW5lQm94TGlzdC0+bGFz
dExpbmVCb3goKS0+aXNDb25zdHJ1Y3RlZCgpKSB7Ci0gICAgICAgICAgICBSZW5kZXJJbmxpbmUq
IGlubGluZUZsb3cgPSB0b1JlbmRlcklubGluZShyZW5kZXJlcigpKTsKICAgICAgICAgICAgIGlm
IChsdHIpIHsKICAgICAgICAgICAgICAgICBpZiAoIW5leHRMaW5lQm94KCkgJiYKLSAgICAgICAg
ICAgICAgICAgICAgKChsYXN0TGluZSAmJiAhaW5saW5lRmxvdy0+Y29udGludWF0aW9uKCkpIHx8
IG5leHRPbkxpbmVFeGlzdHMoKSB8fCBvbkVuZENoYWluKGVuZE9iamVjdCkpKQorICAgICAgICAg
ICAgICAgICAgICAobGFzdExpbmUgfHwgbmV4dE9uTGluZUV4aXN0cygpIHx8IG9uRW5kQ2hhaW4o
ZW5kT2JqZWN0KSkpCiAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVSaWdodEVkZ2UgPSB0cnVl
OwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoKCFwcmV2TGluZUJv
eCgpIHx8IHByZXZMaW5lQm94KCktPmlzQ29uc3RydWN0ZWQoKSkgJiYKLSAgICAgICAgICAgICAg
ICAgICAgKChsYXN0TGluZSAmJiAhaW5saW5lRmxvdy0+Y29udGludWF0aW9uKCkpIHx8IHByZXZP
bkxpbmVFeGlzdHMoKSB8fCBvbkVuZENoYWluKGVuZE9iamVjdCkpKQorICAgICAgICAgICAgICAg
ICAgICAobGFzdExpbmUgfHwgcHJldk9uTGluZUV4aXN0cygpIHx8IG9uRW5kQ2hhaW4oZW5kT2Jq
ZWN0KSkpCiAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVMZWZ0RWRnZSA9IHRydWU7CiAgICAg
ICAgICAgICB9CiAgICAgICAgIH0KQEAgLTUwNCw3ICs1MDQsNyBAQCB2b2lkIElubGluZUZsb3dC
b3g6OnBsYWNlQm94ZXNWZXJ0aWNhbGx5CiAgICAgICAgICAgICAgICAgbmV3WSAtPSBjdXJyLT5i
b3hNb2RlbE9iamVjdCgpLT5ib3JkZXJUb3AoKSArIGN1cnItPmJveE1vZGVsT2JqZWN0KCktPnBh
ZGRpbmdUb3AoKTsKICAgICAgICAgfSBlbHNlIGlmICghY3Vyci0+cmVuZGVyZXIoKS0+aXNCUigp
KSB7CiAgICAgICAgICAgICBSZW5kZXJCb3gqIGJveCA9IHRvUmVuZGVyQm94KGN1cnItPnJlbmRl
cmVyKCkpOwotICAgICAgICAgICAgbmV3WSArPSBib3gtPm1hcmdpblRvcCgpOworICAgICAgICAg
ICAgbmV3WSArPSBjdXJyLT5yZW5kZXJlcigpLT5pc0Fub255bW91c0lubGluZUJsb2NrKCkgPyAw
IDogYm94LT5tYXJnaW5Ub3AoKTsKICAgICAgICAgfQogCiAgICAgICAgIGN1cnItPnNldFkobmV3
WSk7CkBAIC01OTgsOCArNTk4LDEyIEBAIHZvaWQgSW5saW5lRmxvd0JveDo6Y29tcHV0ZVZlcnRp
Y2FsT3ZlcmYKICAgICBzZXRWZXJ0aWNhbE92ZXJmbG93UG9zaXRpb25zKHRvcExheW91dE92ZXJm
bG93LCBib3R0b21MYXlvdXRPdmVyZmxvdywgdG9wVmlzdWFsT3ZlcmZsb3csIGJvdHRvbVZpc3Vh
bE92ZXJmbG93LCBib3hIZWlnaHQpOwogfQogCi1ib29sIElubGluZUZsb3dCb3g6Om5vZGVBdFBv
aW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiByZXF1ZXN0LCBIaXRUZXN0UmVzdWx0JiByZXN1bHQs
IGludCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHkpCitib29sIElubGluZUZsb3dCb3g6Om5vZGVB
dFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiByZXF1ZXN0LCBIaXRUZXN0UmVzdWx0JiByZXN1
bHQsIGludCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHksIEhpdFRlc3RBY3Rpb24gaGl0VGVzdEFj
dGlvbiwgTGluZUJveEhpdFRlc3RJbmZvJiBoaXRUZXN0SW5mbykKIHsKKyAgICAvLyBBcyBsb25n
IGFzIHdlIGRvbid0IGhhdmUgYW4gYW5vbnltb3VzIGlubGluZSBibG9jayBvbiBvdXIgbGluZSwg
d2UgcmVzdHJpY3Qgb3VyIGhpdCB0ZXN0aW5nIG9ubHkgdG8gdGhlIGZvcmVncm91bmQgcGhhc2Uu
CisgICAgaWYgKCFoaXRUZXN0SW5mby5hbm9ueW1vdXNJbmxpbmVCbG9jayAmJiBoaXRUZXN0QWN0
aW9uICE9IEhpdFRlc3RGb3JlZ3JvdW5kKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKICAgICBJ
bnRSZWN0IG92ZXJmbG93UmVjdCh2aXNpYmxlT3ZlcmZsb3dSZWN0KCkpOwogICAgIG92ZXJmbG93
UmVjdC5tb3ZlKHR4LCB0eSk7CiAgICAgaWYgKCFvdmVyZmxvd1JlY3QuY29udGFpbnMoeCwgeSkp
CkBAIC02MDcsNyArNjExLDcgQEAgYm9vbCBJbmxpbmVGbG93Qm94Ojpub2RlQXRQb2ludChjb25z
dCBIaQogCiAgICAgLy8gQ2hlY2sgY2hpbGRyZW4gZmlyc3QuCiAgICAgZm9yIChJbmxpbmVCb3gq
IGN1cnIgPSBsYXN0Q2hpbGQoKTsgY3VycjsgY3VyciA9IGN1cnItPnByZXZPbkxpbmUoKSkgewot
ICAgICAgICBpZiAoKGN1cnItPnJlbmRlcmVyKCktPmlzVGV4dCgpIHx8ICFjdXJyLT5ib3hNb2Rl
bE9iamVjdCgpLT5oYXNTZWxmUGFpbnRpbmdMYXllcigpKSAmJiBjdXJyLT5ub2RlQXRQb2ludChy
ZXF1ZXN0LCByZXN1bHQsIHgsIHksIHR4LCB0eSkpIHsKKyAgICAgICAgaWYgKChjdXJyLT5yZW5k
ZXJlcigpLT5pc1RleHQoKSB8fCAhY3Vyci0+Ym94TW9kZWxPYmplY3QoKS0+aGFzU2VsZlBhaW50
aW5nTGF5ZXIoKSkgJiYgY3Vyci0+bm9kZUF0UG9pbnQocmVxdWVzdCwgcmVzdWx0LCB4LCB5LCB0
eCwgdHksIGhpdFRlc3RBY3Rpb24sIGhpdFRlc3RJbmZvKSkgewogICAgICAgICAgICAgcmVuZGVy
ZXIoKS0+dXBkYXRlSGl0VGVzdFJlc3VsdChyZXN1bHQsIEludFBvaW50KHggLSB0eCwgeSAtIHR5
KSk7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQpAQCAtNjIzLDggKzYyNywx
NCBAQCBib29sIElubGluZUZsb3dCb3g6Om5vZGVBdFBvaW50KGNvbnN0IEhpCiAgICAgcmV0dXJu
IGZhbHNlOwogfQogCi12b2lkIElubGluZUZsb3dCb3g6OnBhaW50KFJlbmRlck9iamVjdDo6UGFp
bnRJbmZvJiBwYWludEluZm8sIGludCB0eCwgaW50IHR5KQordm9pZCBJbmxpbmVGbG93Qm94Ojpw
YWludChSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJbmZvLCBpbnQgdHgsIGludCB0eSwg
TGluZUJveFBhaW50SW5mbyYgbGluZUJveFBhaW50SW5mbykKIHsKKyAgICAvLyBBcyBsb25nIGFz
IHdlIGRvbid0IGhhdmUgYW4gYW5vbnltb3VzIGlubGluZSBibG9jayBvbiBvdXIgbGluZSwgd2Ug
cmVzdHJpY3Qgb3VyIHBhaW50aW5nIG9ubHkgdG8gYSBmZXcgcGhhc2VzLgorICAgIGlmICghbGlu
ZUJveFBhaW50SW5mby5hbm9ueW1vdXNJbmxpbmVCbG9jayAmJiAocGFpbnRJbmZvLnBoYXNlICE9
IFBhaW50UGhhc2VGb3JlZ3JvdW5kICYmIHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlU2Vs
ZWN0aW9uICYmIHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlT3V0bGluZSAKKyAgICAgICAg
JiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VTZWxmT3V0bGluZSAmJiBwYWludEluZm8u
cGhhc2UgIT0gUGFpbnRQaGFzZUNoaWxkT3V0bGluZXMgJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBh
aW50UGhhc2VUZXh0Q2xpcAorICAgICAgICAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFz
ZU1hc2spKQorICAgICAgICByZXR1cm47CisgICAgCiAgICAgSW50UmVjdCBvdmVyZmxvd1JlY3Qo
dmlzaWJsZU92ZXJmbG93UmVjdCgpKTsKICAgICBvdmVyZmxvd1JlY3QuaW5mbGF0ZShyZW5kZXJl
cigpLT5tYXhpbWFsT3V0bGluZVNpemUocGFpbnRJbmZvLnBoYXNlKSk7CiAgICAgb3ZlcmZsb3dS
ZWN0Lm1vdmUodHgsIHR5KTsKQEAgLTYzOCwyMyArNjQ4LDE3IEBAIHZvaWQgSW5saW5lRmxvd0Jv
eDo6cGFpbnQoUmVuZGVyT2JqZWN0OjoKICAgICAgICAgICAgIC8vIG91dGxpbmVzLgogICAgICAg
ICAgICAgaWYgKHJlbmRlcmVyKCktPnN0eWxlKCktPnZpc2liaWxpdHkoKSA9PSBWSVNJQkxFICYm
IHJlbmRlcmVyKCktPmhhc091dGxpbmUoKSAmJiAhaXNSb290SW5saW5lQm94KCkpIHsKICAgICAg
ICAgICAgICAgICBSZW5kZXJJbmxpbmUqIGlubGluZUZsb3cgPSB0b1JlbmRlcklubGluZShyZW5k
ZXJlcigpKTsKLSAgICAgICAgICAgICAgICBpZiAoKGlubGluZUZsb3ctPmNvbnRpbnVhdGlvbigp
IHx8IGlubGluZUZsb3ctPmlzSW5saW5lQ29udGludWF0aW9uKCkpICYmICFib3hNb2RlbE9iamVj
dCgpLT5oYXNTZWxmUGFpbnRpbmdMYXllcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFk
ZCBvdXJzZWx2ZXMgdG8gdGhlIGNvbnRhaW5pbmcgYmxvY2sgb2YgdGhlIGVudGlyZSBjb250aW51
YXRpb24gc28gdGhhdCBpdCBjYW4KLSAgICAgICAgICAgICAgICAgICAgLy8gcGFpbnQgdXMgYXRv
bWljYWxseS4KLSAgICAgICAgICAgICAgICAgICAgUmVuZGVyQmxvY2sqIGJsb2NrID0gcmVuZGVy
ZXIoKS0+Y29udGFpbmluZ0Jsb2NrKCktPmNvbnRhaW5pbmdCbG9jaygpOwotICAgICAgICAgICAg
ICAgICAgICBibG9jay0+YWRkQ29udGludWF0aW9uV2l0aE91dGxpbmUodG9SZW5kZXJJbmxpbmUo
cmVuZGVyZXIoKS0+bm9kZSgpLT5yZW5kZXJlcigpKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNl
IGlmICghaW5saW5lRmxvdy0+aXNJbmxpbmVDb250aW51YXRpb24oKSkKLSAgICAgICAgICAgICAg
ICAgICAgcGFpbnRJbmZvLm91dGxpbmVPYmplY3RzLT5hZGQoaW5saW5lRmxvdyk7CisgICAgICAg
ICAgICAgICAgcGFpbnRJbmZvLm91dGxpbmVPYmplY3RzLT5hZGQoaW5saW5lRmxvdyk7CiAgICAg
ICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAocGFpbnRJbmZvLnBoYXNlID09IFBhaW50UGhh
c2VNYXNrKSB7Ci0gICAgICAgICAgICBwYWludE1hc2socGFpbnRJbmZvLCB0eCwgdHkpOworICAg
ICAgICAgICAgcGFpbnRNYXNrKHBhaW50SW5mbywgdHgsIHR5LCBsaW5lQm94UGFpbnRJbmZvKTsK
ICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIDEu
IFBhaW50IG91ciBiYWNrZ3JvdW5kLCBib3JkZXIgYW5kIGJveC1zaGFkb3cuCi0gICAgICAgICAg
ICBwYWludEJveERlY29yYXRpb25zKHBhaW50SW5mbywgdHgsIHR5KTsKKyAgICAgICAgICAgIHBh
aW50Qm94RGVjb3JhdGlvbnMocGFpbnRJbmZvLCB0eCwgdHksIGxpbmVCb3hQYWludEluZm8pOwog
CiAgICAgICAgICAgICAvLyAyLiBQYWludCBvdXIgdW5kZXJsaW5lIGFuZCBvdmVybGluZS4KLSAg
ICAgICAgICAgIHBhaW50VGV4dERlY29yYXRpb25zKHBhaW50SW5mbywgdHgsIHR5LCBmYWxzZSk7
CisgICAgICAgICAgICBwYWludFRleHREZWNvcmF0aW9ucyhwYWludEluZm8sIHR4LCB0eSwgZmFs
c2UsIGxpbmVCb3hQYWludEluZm8pOwogICAgICAgICB9CiAgICAgfQogCkBAIC02NzAsMTMgKzY3
NCwxMyBAQCB2b2lkIElubGluZUZsb3dCb3g6OnBhaW50KFJlbmRlck9iamVjdDo6CiAgICAgaWYg
KHBhaW50UGhhc2UgIT0gUGFpbnRQaGFzZVNlbGZPdXRsaW5lKSB7CiAgICAgICAgIGZvciAoSW5s
aW5lQm94KiBjdXJyID0gZmlyc3RDaGlsZCgpOyBjdXJyOyBjdXJyID0gY3Vyci0+bmV4dE9uTGlu
ZSgpKSB7CiAgICAgICAgICAgICBpZiAoY3Vyci0+cmVuZGVyZXIoKS0+aXNUZXh0KCkgfHwgIWN1
cnItPmJveE1vZGVsT2JqZWN0KCktPmhhc1NlbGZQYWludGluZ0xheWVyKCkpCi0gICAgICAgICAg
ICAgICAgY3Vyci0+cGFpbnQoY2hpbGRJbmZvLCB0eCwgdHkpOworICAgICAgICAgICAgICAgIGN1
cnItPnBhaW50KGNoaWxkSW5mbywgdHgsIHR5LCBsaW5lQm94UGFpbnRJbmZvKTsKICAgICAgICAg
fQogICAgIH0KIAogICAgIC8vIDQuIFBhaW50IG91ciBzdHJpa2UtdGhyb3VnaAogICAgIGlmIChw
YWludEluZm8ucGhhc2UgPT0gUGFpbnRQaGFzZUZvcmVncm91bmQgfHwgcGFpbnRJbmZvLnBoYXNl
ID09IFBhaW50UGhhc2VTZWxlY3Rpb24pCi0gICAgICAgIHBhaW50VGV4dERlY29yYXRpb25zKHBh
aW50SW5mbywgdHgsIHR5LCB0cnVlKTsKKyAgICAgICAgcGFpbnRUZXh0RGVjb3JhdGlvbnMocGFp
bnRJbmZvLCB0eCwgdHksIHRydWUsIGxpbmVCb3hQYWludEluZm8pOwogfQogCiB2b2lkIElubGlu
ZUZsb3dCb3g6OnBhaW50RmlsbExheWVycyhjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYg
cGFpbnRJbmZvLCBjb25zdCBDb2xvciYgYywgY29uc3QgRmlsbExheWVyKiBmaWxsTGF5ZXIsIGlu
dCBfdHgsIGludCBfdHksIGludCB3LCBpbnQgaCwgQ29tcG9zaXRlT3BlcmF0b3Igb3ApCkBAIC03
MjcsOSArNzMxLDkgQEAgdm9pZCBJbmxpbmVGbG93Qm94OjpwYWludEJveFNoYWRvdyhHcmFwaAog
ICAgIH0KIH0KIAotdm9pZCBJbmxpbmVGbG93Qm94OjpwYWludEJveERlY29yYXRpb25zKFJlbmRl
ck9iamVjdDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGludCB0eCwgaW50IHR5KQordm9pZCBJbmxp
bmVGbG93Qm94OjpwYWludEJveERlY29yYXRpb25zKFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBw
YWludEluZm8sIGludCB0eCwgaW50IHR5LCBMaW5lQm94UGFpbnRJbmZvJiBsaW5lQm94UGFpbnRJ
bmZvKQogewotICAgIGlmICghcmVuZGVyZXIoKS0+c2hvdWxkUGFpbnRXaXRoaW5Sb290KHBhaW50
SW5mbykgfHwgcmVuZGVyZXIoKS0+c3R5bGUoKS0+dmlzaWJpbGl0eSgpICE9IFZJU0lCTEUgfHwg
cGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VGb3JlZ3JvdW5kKQorICAgIGlmICghcmVuZGVy
ZXIoKS0+c2hvdWxkUGFpbnRXaXRoaW5Sb290KHBhaW50SW5mbykgfHwgcmVuZGVyZXIoKS0+c3R5
bGUoKS0+dmlzaWJpbGl0eSgpICE9IFZJU0lCTEUgfHwgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50
UGhhc2VGb3JlZ3JvdW5kIHx8IGxpbmVCb3hQYWludEluZm8uYW5vbnltb3VzSW5saW5lQmxvY2sp
CiAgICAgICAgIHJldHVybjsKIAogICAgIGludCB4ID0gbV94OwpAQCAtODAzLDkgKzgwNyw5IEBA
IHZvaWQgSW5saW5lRmxvd0JveDo6cGFpbnRCb3hEZWNvcmF0aW9ucygKICAgICB9CiB9CiAKLXZv
aWQgSW5saW5lRmxvd0JveDo6cGFpbnRNYXNrKFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBwYWlu
dEluZm8sIGludCB0eCwgaW50IHR5KQordm9pZCBJbmxpbmVGbG93Qm94OjpwYWludE1hc2soUmVu
ZGVyT2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgaW50IHR4LCBpbnQgdHksIExpbmVCb3hQ
YWludEluZm8mIGxpbmVCb3hQYWludEluZm8pCiB7Ci0gICAgaWYgKCFyZW5kZXJlcigpLT5zaG91
bGRQYWludFdpdGhpblJvb3QocGFpbnRJbmZvKSB8fCByZW5kZXJlcigpLT5zdHlsZSgpLT52aXNp
YmlsaXR5KCkgIT0gVklTSUJMRSB8fCBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZU1hc2sp
CisgICAgaWYgKCFyZW5kZXJlcigpLT5zaG91bGRQYWludFdpdGhpblJvb3QocGFpbnRJbmZvKSB8
fCByZW5kZXJlcigpLT5zdHlsZSgpLT52aXNpYmlsaXR5KCkgIT0gVklTSUJMRSB8fCBwYWludElu
Zm8ucGhhc2UgIT0gUGFpbnRQaGFzZU1hc2sgfHwgbGluZUJveFBhaW50SW5mby5hbm9ueW1vdXNJ
bmxpbmVCbG9jaykKICAgICAgICAgcmV0dXJuOwogCiAgICAgaW50IHggPSBtX3g7CkBAIC04OTUs
MTIgKzg5OSwxMiBAQCBzdGF0aWMgYm9vbCBzaG91bGREcmF3VGV4dERlY29yYXRpb24oUmVuCiAg
ICAgcmV0dXJuIGZhbHNlOwogfQogCi12b2lkIElubGluZUZsb3dCb3g6OnBhaW50VGV4dERlY29y
YXRpb25zKFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGludCB0eCwgaW50IHR5
LCBib29sIHBhaW50ZWRDaGlsZHJlbikKK3ZvaWQgSW5saW5lRmxvd0JveDo6cGFpbnRUZXh0RGVj
b3JhdGlvbnMoUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgaW50IHR4LCBpbnQg
dHksIGJvb2wgcGFpbnRlZENoaWxkcmVuLCBMaW5lQm94UGFpbnRJbmZvJiBsaW5lQm94UGFpbnRJ
bmZvKQogewogICAgIC8vIFBhaW50IHRleHQgZGVjb3JhdGlvbnMgbGlrZSB1bmRlcmxpbmVzL292
ZXJsaW5lcy4gV2Ugb25seSBkbyB0aGlzIGlmIHdlIGFyZW4ndCBpbiBxdWlya3MgbW9kZSAoaS5l
LiwgaW4KICAgICAvLyBhbG1vc3Qtc3RyaWN0IG1vZGUgb3Igc3RyaWN0IG1vZGUpLgogICAgIGlm
IChyZW5kZXJlcigpLT5zdHlsZSgpLT5odG1sSGFja3MoKSB8fCAhcmVuZGVyZXIoKS0+c2hvdWxk
UGFpbnRXaXRoaW5Sb290KHBhaW50SW5mbykgfHwKLSAgICAgICAgcmVuZGVyZXIoKS0+c3R5bGUo
KS0+dmlzaWJpbGl0eSgpICE9IFZJU0lCTEUpCisgICAgICAgIHJlbmRlcmVyKCktPnN0eWxlKCkt
PnZpc2liaWxpdHkoKSAhPSBWSVNJQkxFIHx8IGxpbmVCb3hQYWludEluZm8uYW5vbnltb3VzSW5s
aW5lQmxvY2spCiAgICAgICAgIHJldHVybjsKICAgICAKICAgICAvLyBXZSBkb24ndCB3YW50IHVu
ZGVybGluZXMgb3Igb3RoZXIgZGVjb3JhdGlvbnMgd2hlbiB3ZSdyZSB0cnlpbmcgdG8gZHJhdyBu
b3RoaW5nIGJ1dCB0aGUgc2VsZWN0aW9uIGFzIHdoaXRlIHRleHQuCkluZGV4OiBXZWJDb3JlL3Jl
bmRlcmluZy9JbmxpbmVGbG93Qm94LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcv
SW5saW5lRmxvd0JveC5oCShyZXZpc2lvbiA1NDU2MSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL0lu
bGluZUZsb3dCb3guaAkod29ya2luZyBjb3B5KQpAQCAtODQsMTQgKzg0LDE0IEBAIHB1YmxpYzoK
IAogICAgIHZpcnR1YWwgdm9pZCBjbGVhclRydW5jYXRpb24oKTsKIAotICAgIHZpcnR1YWwgdm9p
ZCBwYWludEJveERlY29yYXRpb25zKFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiwgaW50IHR4LCBp
bnQgdHkpOwotICAgIHZpcnR1YWwgdm9pZCBwYWludE1hc2soUmVuZGVyT2JqZWN0OjpQYWludElu
Zm8mLCBpbnQgdHgsIGludCB0eSk7CisgICAgdm9pZCBwYWludEJveERlY29yYXRpb25zKFJlbmRl
ck9iamVjdDo6UGFpbnRJbmZvJiwgaW50IHR4LCBpbnQgdHksIExpbmVCb3hQYWludEluZm8mKTsK
KyAgICB2b2lkIHBhaW50TWFzayhSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGludCB0eCwgaW50
IHR5LCBMaW5lQm94UGFpbnRJbmZvJik7CiAgICAgdm9pZCBwYWludEZpbGxMYXllcnMoY29uc3Qg
UmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBjb25zdCBDb2xvciYsIGNvbnN0IEZpbGxMYXllcios
IGludCB0eCwgaW50IHR5LCBpbnQgdywgaW50IGgsIENvbXBvc2l0ZU9wZXJhdG9yID0gQ29tcG9z
aXRlU291cmNlT3Zlcik7CiAgICAgdm9pZCBwYWludEZpbGxMYXllcihjb25zdCBSZW5kZXJPYmpl
Y3Q6OlBhaW50SW5mbyYsIGNvbnN0IENvbG9yJiwgY29uc3QgRmlsbExheWVyKiwgaW50IHR4LCBp
bnQgdHksIGludCB3LCBpbnQgaCwgQ29tcG9zaXRlT3BlcmF0b3IgPSBDb21wb3NpdGVTb3VyY2VP
dmVyKTsKICAgICB2b2lkIHBhaW50Qm94U2hhZG93KEdyYXBoaWNzQ29udGV4dCosIFJlbmRlclN0
eWxlKiwgU2hhZG93U3R5bGUsIGludCB0eCwgaW50IHR5LCBpbnQgdywgaW50IGgpOwotICAgIHZp
cnR1YWwgdm9pZCBwYWludFRleHREZWNvcmF0aW9ucyhSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYs
IGludCB0eCwgaW50IHR5LCBib29sIHBhaW50ZWRDaGlsZHJlbiA9IGZhbHNlKTsKLSAgICB2aXJ0
dWFsIHZvaWQgcGFpbnQoUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBpbnQgdHgsIGludCB0eSk7
Ci0gICAgdmlydHVhbCBib29sIG5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiwgSGl0
VGVzdFJlc3VsdCYsIGludCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHkpOworICAgIHZvaWQgcGFp
bnRUZXh0RGVjb3JhdGlvbnMoUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBpbnQgdHgsIGludCB0
eSwgYm9vbCBwYWludGVkQ2hpbGRyZW4sIExpbmVCb3hQYWludEluZm8mKTsKKyAgICB2aXJ0dWFs
IHZvaWQgcGFpbnQoUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBpbnQgdHgsIGludCB0eSwgTGlu
ZUJveFBhaW50SW5mbyYpOworICAgIHZpcnR1YWwgYm9vbCBub2RlQXRQb2ludChjb25zdCBIaXRU
ZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBpbnQgeCwgaW50IHksIGludCB0eCwgaW50IHR5
LCBIaXRUZXN0QWN0aW9uLCBMaW5lQm94SGl0VGVzdEluZm8mKTsKIAogICAgIHZpcnR1YWwgUmVu
ZGVyTGluZUJveExpc3QqIHJlbmRlcmVyTGluZUJveGVzKCkgY29uc3Q7CiAKSW5kZXg6IFdlYkNv
cmUvcmVuZGVyaW5nL0lubGluZUl0ZXJhdG9yLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5k
ZXJpbmcvSW5saW5lSXRlcmF0b3IuaAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcmVuZGVyaW5n
L0lubGluZUl0ZXJhdG9yLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMjY3IEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDAwIExhcnMgS25vbGwgKGtub2xsQGtkZS5vcmcpCisgKiBDb3B5cmln
aHQgKEMpIDIwMDMsIDIwMDQsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAgQXBwbGUgSW5j
LiBBbGwgcmlnaHQgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2Fy
ZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhl
IHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBw
dWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJz
aW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNp
b24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQg
aXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQg
ZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2Vu
ZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQg
aGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5M
SUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJ
bmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjEx
MC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpZm5kZWYgSW5saW5lSXRlcmF0b3JfaAorI2RlZmlu
ZSBJbmxpbmVJdGVyYXRvcl9oCisKKyNpbmNsdWRlICJCaWRpUnVuLmgiCisjaW5jbHVkZSAiUmVu
ZGVyQmxvY2suaCIKKyNpbmNsdWRlICJSZW5kZXJUZXh0LmgiCisjaW5jbHVkZSA8d3RmL0Fsd2F5
c0lubGluZS5oPgorI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KKworbmFtZXNwYWNlIFdl
YkNvcmUgeworCitjbGFzcyBJbmxpbmVJdGVyYXRvciB7CitwdWJsaWM6CisgICAgSW5saW5lSXRl
cmF0b3IoKQorICAgICAgICA6IGJsb2NrKDApCisgICAgICAgICwgb2JqKDApCisgICAgICAgICwg
cG9zKDApCisgICAgICAgICwgbmV4dEJyZWFrYWJsZVBvc2l0aW9uKC0xKQorICAgIHsKKyAgICB9
CisKKyAgICBJbmxpbmVJdGVyYXRvcihSZW5kZXJCbG9jayogYiwgUmVuZGVyT2JqZWN0KiBvLCB1
bnNpZ25lZCBwKQorICAgICAgICA6IGJsb2NrKGIpCisgICAgICAgICwgb2JqKG8pCisgICAgICAg
ICwgcG9zKHApCisgICAgICAgICwgbmV4dEJyZWFrYWJsZVBvc2l0aW9uKC0xKQorICAgIHsKKyAg
ICB9CisKKyAgICB2b2lkIGluY3JlbWVudChJbmxpbmVCaWRpUmVzb2x2ZXIqIHJlc29sdmVyID0g
MCk7CisgICAgYm9vbCBhdEVuZCgpIGNvbnN0OworCisgICAgVUNoYXIgY3VycmVudCgpIGNvbnN0
OworICAgIFdURjo6VW5pY29kZTo6RGlyZWN0aW9uIGRpcmVjdGlvbigpIGNvbnN0OworCisgICAg
UmVuZGVyQmxvY2sqIGJsb2NrOworICAgIFJlbmRlck9iamVjdCogb2JqOworICAgIHVuc2lnbmVk
IHBvczsKKyAgICBpbnQgbmV4dEJyZWFrYWJsZVBvc2l0aW9uOworfTsKKworaW5saW5lIGJvb2wg
b3BlcmF0b3I9PShjb25zdCBJbmxpbmVJdGVyYXRvciYgaXQxLCBjb25zdCBJbmxpbmVJdGVyYXRv
ciYgaXQyKQoreworICAgIHJldHVybiBpdDEucG9zID09IGl0Mi5wb3MgJiYgaXQxLm9iaiA9PSBp
dDIub2JqOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IElubGluZUl0ZXJhdG9y
JiBpdDEsIGNvbnN0IElubGluZUl0ZXJhdG9yJiBpdDIpCit7CisgICAgcmV0dXJuIGl0MS5wb3Mg
IT0gaXQyLnBvcyB8fCBpdDEub2JqICE9IGl0Mi5vYmo7Cit9CisKK3N0YXRpYyBpbmxpbmUgUmVu
ZGVyT2JqZWN0KiBiaWRpTmV4dChSZW5kZXJCbG9jayogYmxvY2ssIFJlbmRlck9iamVjdCogY3Vy
cmVudCwgSW5saW5lQmlkaVJlc29sdmVyKiByZXNvbHZlciA9IDAsIGJvb2wgc2tpcElubGluZXMg
PSB0cnVlLCBib29sKiBlbmRPZklubGluZVB0ciA9IDApCit7CisgICAgUmVuZGVyT2JqZWN0KiBu
ZXh0ID0gMDsKKyAgICBib29sIG9sZEVuZE9mSW5saW5lID0gZW5kT2ZJbmxpbmVQdHIgPyAqZW5k
T2ZJbmxpbmVQdHIgOiBmYWxzZTsKKyAgICBib29sIGVuZE9mSW5saW5lID0gZmFsc2U7CisKKyAg
ICB3aGlsZSAoY3VycmVudCkgeworICAgICAgICBuZXh0ID0gMDsKKyAgICAgICAgaWYgKCFvbGRF
bmRPZklubGluZSAmJiAhY3VycmVudC0+aXNGbG9hdGluZygpICYmICFjdXJyZW50LT5pc1JlcGxh
Y2VkKCkgJiYgIWN1cnJlbnQtPmlzUG9zaXRpb25lZCgpICYmICFjdXJyZW50LT5pc1RleHQoKSkg
eworICAgICAgICAgICAgbmV4dCA9IGN1cnJlbnQtPmZpcnN0Q2hpbGQoKTsKKyAgICAgICAgICAg
IGlmIChuZXh0ICYmIHJlc29sdmVyICYmIG5leHQtPmlzUmVuZGVySW5saW5lKCkpIHsKKyAgICAg
ICAgICAgICAgICBFVW5pY29kZUJpZGkgdWIgPSBuZXh0LT5zdHlsZSgpLT51bmljb2RlQmlkaSgp
OworICAgICAgICAgICAgICAgIGlmICh1YiAhPSBVQk5vcm1hbCkgeworICAgICAgICAgICAgICAg
ICAgICBUZXh0RGlyZWN0aW9uIGRpciA9IG5leHQtPnN0eWxlKCktPmRpcmVjdGlvbigpOworICAg
ICAgICAgICAgICAgICAgICBXVEY6OlVuaWNvZGU6OkRpcmVjdGlvbiBkID0gKHViID09IEVtYmVk
CisgICAgICAgICAgICAgICAgICAgICAgICA/IChkaXIgPT0gUlRMID8gV1RGOjpVbmljb2RlOjpS
aWdodFRvTGVmdEVtYmVkZGluZyA6IFdURjo6VW5pY29kZTo6TGVmdFRvUmlnaHRFbWJlZGRpbmcp
CisgICAgICAgICAgICAgICAgICAgICAgICA6IChkaXIgPT0gUlRMID8gV1RGOjpVbmljb2RlOjpS
aWdodFRvTGVmdE92ZXJyaWRlIDogV1RGOjpVbmljb2RlOjpMZWZ0VG9SaWdodE92ZXJyaWRlKSk7
CisgICAgICAgICAgICAgICAgICAgIHJlc29sdmVyLT5lbWJlZChkKTsKKyAgICAgICAgICAgICAg
ICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW5leHQpIHsKKyAg
ICAgICAgICAgIGlmICghc2tpcElubGluZXMgJiYgIW9sZEVuZE9mSW5saW5lICYmIGN1cnJlbnQt
PmlzUmVuZGVySW5saW5lKCkpIHsKKyAgICAgICAgICAgICAgICBuZXh0ID0gY3VycmVudDsKKyAg
ICAgICAgICAgICAgICBlbmRPZklubGluZSA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQg
IT0gYmxvY2spIHsKKyAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZXIgJiYgY3VycmVudC0+aXNS
ZW5kZXJJbmxpbmUoKSAmJiBjdXJyZW50LT5zdHlsZSgpLT51bmljb2RlQmlkaSgpICE9IFVCTm9y
bWFsKQorICAgICAgICAgICAgICAgICAgICByZXNvbHZlci0+ZW1iZWQoV1RGOjpVbmljb2RlOjpQ
b3BEaXJlY3Rpb25hbEZvcm1hdCk7CisKKyAgICAgICAgICAgICAgICBuZXh0ID0gY3VycmVudC0+
bmV4dFNpYmxpbmcoKTsKKyAgICAgICAgICAgICAgICBpZiAobmV4dCkgeworICAgICAgICAgICAg
ICAgICAgICBpZiAocmVzb2x2ZXIgJiYgbmV4dC0+aXNSZW5kZXJJbmxpbmUoKSkgeworICAgICAg
ICAgICAgICAgICAgICAgICAgRVVuaWNvZGVCaWRpIHViID0gbmV4dC0+c3R5bGUoKS0+dW5pY29k
ZUJpZGkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1YiAhPSBVQk5vcm1hbCkgewor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHREaXJlY3Rpb24gZGlyID0gbmV4dC0+c3R5
bGUoKS0+ZGlyZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1RGOjpVbmlj
b2RlOjpEaXJlY3Rpb24gZCA9ICh1YiA9PSBFbWJlZAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICA/IChkaXIgPT0gUlRMID8gV1RGOjpVbmljb2RlOjpSaWdodFRvTGVmdEVtYmVkZGlu
ZzogV1RGOjpVbmljb2RlOjpMZWZ0VG9SaWdodEVtYmVkZGluZykKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgOiAoZGlyID09IFJUTCA/IFdURjo6VW5pY29kZTo6UmlnaHRUb0xlZnRP
dmVycmlkZSA6IFdURjo6VW5pY29kZTo6TGVmdFRvUmlnaHRPdmVycmlkZSkpOworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHJlc29sdmVyLT5lbWJlZChkKTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAg
Y3VycmVudCA9IGN1cnJlbnQtPnBhcmVudCgpOworICAgICAgICAgICAgICAgIGlmICghc2tpcElu
bGluZXMgJiYgY3VycmVudCAmJiBjdXJyZW50ICE9IGJsb2NrICYmIGN1cnJlbnQtPmlzUmVuZGVy
SW5saW5lKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCA9IGN1cnJlbnQ7CisgICAgICAg
ICAgICAgICAgICAgIGVuZE9mSW5saW5lID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAg
ICAgaWYgKCFuZXh0KQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKG5leHQtPmlz
VGV4dCgpIHx8IG5leHQtPmlzRmxvYXRpbmcoKSB8fCBuZXh0LT5pc1JlcGxhY2VkKCkgfHwgbmV4
dC0+aXNQb3NpdGlvbmVkKCkKKyAgICAgICAgICAgIHx8ICgoIXNraXBJbmxpbmVzIHx8ICFuZXh0
LT5maXJzdENoaWxkKCkpIC8vIEFsd2F5cyByZXR1cm4gRU1QVFkgaW5saW5lcy4KKyAgICAgICAg
ICAgICAgICAmJiBuZXh0LT5pc1JlbmRlcklubGluZSgpKSkKKyAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICBjdXJyZW50ID0gbmV4dDsKKyAgICB9CisKKyAgICBpZiAoZW5kT2ZJbmxpbmVQdHIp
CisgICAgICAgICplbmRPZklubGluZVB0ciA9IGVuZE9mSW5saW5lOworCisgICAgcmV0dXJuIG5l
eHQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgUmVuZGVyT2JqZWN0KiBiaWRpRmlyc3QoUmVuZGVyQmxv
Y2sqIGJsb2NrLCBJbmxpbmVCaWRpUmVzb2x2ZXIqIHJlc29sdmVyLCBib29sIHNraXBJbmxpbmVz
ID0gdHJ1ZSkKK3sKKyAgICBpZiAoIWJsb2NrLT5maXJzdENoaWxkKCkpCisgICAgICAgIHJldHVy
biAwOworICAgIAorICAgIFJlbmRlck9iamVjdCogbyA9IGJsb2NrLT5maXJzdENoaWxkKCk7Cisg
ICAgaWYgKG8tPmlzUmVuZGVySW5saW5lKCkpIHsKKyAgICAgICAgaWYgKHJlc29sdmVyKSB7Cisg
ICAgICAgICAgICBFVW5pY29kZUJpZGkgdWIgPSBvLT5zdHlsZSgpLT51bmljb2RlQmlkaSgpOwor
ICAgICAgICAgICAgaWYgKHViICE9IFVCTm9ybWFsKSB7CisgICAgICAgICAgICAgICAgVGV4dERp
cmVjdGlvbiBkaXIgPSBvLT5zdHlsZSgpLT5kaXJlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICBX
VEY6OlVuaWNvZGU6OkRpcmVjdGlvbiBkID0gKHViID09IEVtYmVkCisgICAgICAgICAgICAgICAg
ICAgID8gKGRpciA9PSBSVEwgPyBXVEY6OlVuaWNvZGU6OlJpZ2h0VG9MZWZ0RW1iZWRkaW5nIDog
V1RGOjpVbmljb2RlOjpMZWZ0VG9SaWdodEVtYmVkZGluZykKKyAgICAgICAgICAgICAgICAgICAg
OiAoZGlyID09IFJUTCA/IFdURjo6VW5pY29kZTo6UmlnaHRUb0xlZnRPdmVycmlkZSA6IFdURjo6
VW5pY29kZTo6TGVmdFRvUmlnaHRPdmVycmlkZSkpOworICAgICAgICAgICAgICAgIHJlc29sdmVy
LT5lbWJlZChkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc2tpcElu
bGluZXMgJiYgby0+Zmlyc3RDaGlsZCgpKQorICAgICAgICAgICAgbyA9IGJpZGlOZXh0KGJsb2Nr
LCBvLCByZXNvbHZlciwgc2tpcElubGluZXMpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAg
IC8vIE5ldmVyIHNraXAgZW1wdHkgaW5saW5lcy4KKyAgICAgICAgICAgIGlmIChyZXNvbHZlcikK
KyAgICAgICAgICAgICAgICByZXNvbHZlci0+Y29tbWl0RXhwbGljaXRFbWJlZGRpbmcoKTsKKyAg
ICAgICAgICAgIHJldHVybiBvOyAKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvICYmICFv
LT5pc1RleHQoKSAmJiAhby0+aXNSZXBsYWNlZCgpICYmICFvLT5pc0Zsb2F0aW5nKCkgJiYgIW8t
PmlzUG9zaXRpb25lZCgpKQorICAgICAgICBvID0gYmlkaU5leHQoYmxvY2ssIG8sIHJlc29sdmVy
LCBza2lwSW5saW5lcyk7CisKKyAgICBpZiAocmVzb2x2ZXIpCisgICAgICAgIHJlc29sdmVyLT5j
b21taXRFeHBsaWNpdEVtYmVkZGluZygpOworICAgIHJldHVybiBvOworfQorCitpbmxpbmUgdm9p
ZCBJbmxpbmVJdGVyYXRvcjo6aW5jcmVtZW50KElubGluZUJpZGlSZXNvbHZlciogcmVzb2x2ZXIp
Cit7CisgICAgaWYgKCFvYmopCisgICAgICAgIHJldHVybjsKKyAgICBpZiAob2JqLT5pc1RleHQo
KSkgeworICAgICAgICBwb3MrKzsKKyAgICAgICAgaWYgKHBvcyA+PSB0b1JlbmRlclRleHQob2Jq
KS0+dGV4dExlbmd0aCgpKSB7CisgICAgICAgICAgICBvYmogPSBiaWRpTmV4dChibG9jaywgb2Jq
LCByZXNvbHZlcik7CisgICAgICAgICAgICBwb3MgPSAwOworICAgICAgICAgICAgbmV4dEJyZWFr
YWJsZVBvc2l0aW9uID0gLTE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBvYmog
PSBiaWRpTmV4dChibG9jaywgb2JqLCByZXNvbHZlcik7CisgICAgICAgIHBvcyA9IDA7CisgICAg
ICAgIG5leHRCcmVha2FibGVQb3NpdGlvbiA9IC0xOworICAgIH0KK30KKworaW5saW5lIGJvb2wg
SW5saW5lSXRlcmF0b3I6OmF0RW5kKCkgY29uc3QKK3sKKyAgICByZXR1cm4gIW9iajsKK30KKwor
aW5saW5lIFVDaGFyIElubGluZUl0ZXJhdG9yOjpjdXJyZW50KCkgY29uc3QKK3sKKyAgICBpZiAo
IW9iaiB8fCAhb2JqLT5pc1RleHQoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBSZW5kZXJU
ZXh0KiB0ZXh0ID0gdG9SZW5kZXJUZXh0KG9iaik7CisgICAgaWYgKHBvcyA+PSB0ZXh0LT50ZXh0
TGVuZ3RoKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIHRleHQtPmNoYXJhY3Rl
cnMoKVtwb3NdOworfQorCitBTFdBWVNfSU5MSU5FIFdURjo6VW5pY29kZTo6RGlyZWN0aW9uIElu
bGluZUl0ZXJhdG9yOjpkaXJlY3Rpb24oKSBjb25zdAoreworICAgIGlmIChVQ2hhciBjID0gY3Vy
cmVudCgpKQorICAgICAgICByZXR1cm4gV1RGOjpVbmljb2RlOjpkaXJlY3Rpb24oYyk7CisKKyAg
ICBpZiAob2JqICYmIG9iai0+aXNMaXN0TWFya2VyKCkpCisgICAgICAgIHJldHVybiBvYmotPnN0
eWxlKCktPmRpcmVjdGlvbigpID09IExUUiA/IFdURjo6VW5pY29kZTo6TGVmdFRvUmlnaHQgOiBX
VEY6OlVuaWNvZGU6OlJpZ2h0VG9MZWZ0OworCisgICAgcmV0dXJuIFdURjo6VW5pY29kZTo6T3Ro
ZXJOZXV0cmFsOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgdm9pZCBJbmxpbmVCaWRpUmVzb2x2
ZXI6OmluY3JlbWVudCgpCit7CisgICAgY3VycmVudC5pbmNyZW1lbnQodGhpcyk7Cit9CisKK3Rl
bXBsYXRlIDw+CitpbmxpbmUgdm9pZCBJbmxpbmVCaWRpUmVzb2x2ZXI6OmFwcGVuZFJ1bigpCit7
CisgICAgaWYgKCFlbXB0eVJ1biAmJiAhZW9yLmF0RW5kKCkpIHsKKyAgICAgICAgaW50IHN0YXJ0
ID0gc29yLnBvczsKKyAgICAgICAgUmVuZGVyT2JqZWN0ICpvYmogPSBzb3Iub2JqOworICAgICAg
ICB3aGlsZSAob2JqICYmIG9iaiAhPSBlb3Iub2JqICYmIG9iaiAhPSBlbmRPZkxpbmUub2JqKSB7
CisgICAgICAgICAgICBSZW5kZXJCbG9jazo6YXBwZW5kUnVuc0Zvck9iamVjdChzdGFydCwgb2Jq
LT5sZW5ndGgoKSwgb2JqLCAqdGhpcyk7ICAgICAgICAKKyAgICAgICAgICAgIHN0YXJ0ID0gMDsK
KyAgICAgICAgICAgIG9iaiA9IGJpZGlOZXh0KHNvci5ibG9jaywgb2JqKTsKKyAgICAgICAgfQor
ICAgICAgICBpZiAob2JqKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBwb3MgPSBvYmogPT0gZW9y
Lm9iaiA/IGVvci5wb3MgOiBVSU5UX01BWDsKKyAgICAgICAgICAgIGlmIChvYmogPT0gZW5kT2ZM
aW5lLm9iaiAmJiBlbmRPZkxpbmUucG9zIDw9IHBvcykgeworICAgICAgICAgICAgICAgIHJlYWNo
ZWRFbmRPZkxpbmUgPSB0cnVlOworICAgICAgICAgICAgICAgIHBvcyA9IGVuZE9mTGluZS5wb3M7
CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJdCdzIE9LIHRvIGFkZCBydW5zIGZvciB6
ZXJvLWxlbmd0aCBSZW5kZXJPYmplY3RzLCBqdXN0IGRvbid0IG1ha2UgdGhlIHJ1biBsYXJnZXIg
dGhhbiBpdCBzaG91bGQgYmUKKyAgICAgICAgICAgIGludCBlbmQgPSBvYmotPmxlbmd0aCgpID8g
cG9zKzEgOiAwOworICAgICAgICAgICAgUmVuZGVyQmxvY2s6OmFwcGVuZFJ1bnNGb3JPYmplY3Qo
c3RhcnQsIGVuZCwgb2JqLCAqdGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGVv
ci5pbmNyZW1lbnQoKTsKKyAgICAgICAgc29yID0gZW9yOworICAgIH0KKworICAgIG1fZGlyZWN0
aW9uID0gV1RGOjpVbmljb2RlOjpPdGhlck5ldXRyYWw7CisgICAgbV9zdGF0dXMuZW9yID0gV1RG
OjpVbmljb2RlOjpPdGhlck5ldXRyYWw7Cit9CisKK30KKworI2VuZGlmIC8vIElubGluZUl0ZXJh
dG9yX2gKKwpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lUnVuQm94LmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lUnVuQm94LmgJKHJldmlzaW9uIDU0NTYxKQor
KysgV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lUnVuQm94LmgJKHdvcmtpbmcgY29weSkKQEAgLTM4
LDEwICszOCw3IEBAIHB1YmxpYzoKICAgICBJbmxpbmVSdW5Cb3gqIG5leHRMaW5lQm94KCkgY29u
c3QgeyByZXR1cm4gbV9uZXh0TGluZTsgfQogICAgIHZvaWQgc2V0TmV4dExpbmVCb3goSW5saW5l
UnVuQm94KiBuKSB7IG1fbmV4dExpbmUgPSBuOyB9CiAgICAgdm9pZCBzZXRQcmV2aW91c0xpbmVC
b3goSW5saW5lUnVuQm94KiBwKSB7IG1fcHJldkxpbmUgPSBwOyB9Ci0KLSAgICB2aXJ0dWFsIHZv
aWQgcGFpbnRCb3hEZWNvcmF0aW9ucyhSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGludCAvKnR4
Ki8sIGludCAvKnR5Ki8pIHsgfQotICAgIHZpcnR1YWwgdm9pZCBwYWludFRleHREZWNvcmF0aW9u
cyhSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGludCAvKnR4Ki8sIGludCAvKnR5Ki8sIGJvb2wg
LypwYWludGVkQ2hpbGRyZW4qLyA9IGZhbHNlKSB7IH0KLSAgICAKKyAKIHByb3RlY3RlZDoKICAg
ICBJbmxpbmVSdW5Cb3gqIG1fcHJldkxpbmU7ICAvLyBUaGUgcHJldmlvdXMgYm94IHRoYXQgYWxz
byB1c2VzIG91ciBSZW5kZXJPYmplY3QKICAgICBJbmxpbmVSdW5Cb3gqIG1fbmV4dExpbmU7ICAv
LyBUaGUgbmV4dCBib3ggdGhhdCBhbHNvIHVzZXMgb3VyIFJlbmRlck9iamVjdApJbmRleDogV2Vi
Q29yZS9yZW5kZXJpbmcvSW5saW5lVGV4dEJveC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9y
ZW5kZXJpbmcvSW5saW5lVGV4dEJveC5jcHAJKHJldmlzaW9uIDU0NTYxKQorKysgV2ViQ29yZS9y
ZW5kZXJpbmcvSW5saW5lVGV4dEJveC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI2MCw3ICsyNjAs
NyBAQCBib29sIElubGluZVRleHRCb3g6OmlzTGluZUJyZWFrKCkgY29uc3QKICAgICByZXR1cm4g
cmVuZGVyZXIoKS0+aXNCUigpIHx8IChyZW5kZXJlcigpLT5zdHlsZSgpLT5wcmVzZXJ2ZU5ld2xp
bmUoKSAmJiBsZW4oKSA9PSAxICYmICgqdGV4dFJlbmRlcmVyKCktPnRleHQoKSlbc3RhcnQoKV0g
PT0gJ1xuJyk7CiB9CiAKLWJvb2wgSW5saW5lVGV4dEJveDo6bm9kZUF0UG9pbnQoY29uc3QgSGl0
VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVzdWx0JiByZXN1bHQsIGludCB4LCBpbnQgeSwgaW50IHR4
LCBpbnQgdHkpCitib29sIElubGluZVRleHRCb3g6Om5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RS
ZXF1ZXN0JiwgSGl0VGVzdFJlc3VsdCYgcmVzdWx0LCBpbnQgeCwgaW50IHksIGludCB0eCwgaW50
IHR5LCBIaXRUZXN0QWN0aW9uLCBMaW5lQm94SGl0VGVzdEluZm8mKQogewogICAgIGlmIChpc0xp
bmVCcmVhaygpKQogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0zMjQsNyArMzI0LDcgQEAgc3Rh
dGljIHZvaWQgcGFpbnRUZXh0V2l0aFNoYWRvd3MoR3JhcGhpYwogICAgIH0gd2hpbGUgKHNoYWRv
dyB8fCBzdHJva2VkIHx8ICFvcGFxdWUpOwogfQogCi12b2lkIElubGluZVRleHRCb3g6OnBhaW50
KFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGludCB0eCwgaW50IHR5KQordm9p
ZCBJbmxpbmVUZXh0Qm94OjpwYWludChSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJbmZv
LCBpbnQgdHgsIGludCB0eSwgTGluZUJveFBhaW50SW5mbyYpCiB7CiAgICAgaWYgKGlzTGluZUJy
ZWFrKCkgfHwgIXJlbmRlcmVyKCktPnNob3VsZFBhaW50V2l0aGluUm9vdChwYWludEluZm8pIHx8
IHJlbmRlcmVyKCktPnN0eWxlKCktPnZpc2liaWxpdHkoKSAhPSBWSVNJQkxFIHx8CiAgICAgICAg
IG1fdHJ1bmNhdGlvbiA9PSBjRnVsbFRydW5jYXRpb24gfHwgcGFpbnRJbmZvLnBoYXNlID09IFBh
aW50UGhhc2VPdXRsaW5lKQpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lVGV4dEJveC5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZVRleHRCb3guaAkocmV2aXNp
b24gNTQ1NjEpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVUZXh0Qm94LmgJKHdvcmtpbmcg
Y29weSkKQEAgLTc0LDggKzc0LDggQEAgcHVibGljOgogICAgIHZvaWQgc2VsZWN0aW9uU3RhcnRF
bmQoaW50JiBzUG9zLCBpbnQmIGVQb3MpOwogCiBwcml2YXRlOgotICAgIHZpcnR1YWwgdm9pZCBw
YWludChSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5KTsKLSAgICB2aXJ0
dWFsIGJvb2wgbm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVzdWx0
JiwgaW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSk7CisgICAgdmlydHVhbCB2b2lkIHBhaW50
KFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiwgaW50IHR4LCBpbnQgdHksIExpbmVCb3hQYWludElu
Zm8mKTsKKyAgICB2aXJ0dWFsIGJvb2wgbm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3Qm
LCBIaXRUZXN0UmVzdWx0JiwgaW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSwgSGl0VGVzdEFj
dGlvbiwgTGluZUJveEhpdFRlc3RJbmZvJik7CiAKIHB1YmxpYzoKICAgICBSZW5kZXJUZXh0KiB0
ZXh0UmVuZGVyZXIoKSBjb25zdDsKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2Nr
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5jcHAJKHJl
dmlzaW9uIDU0NTYxKQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC03Nyw4ICs3Nyw2IEBAIHN0YXRpYyBQZXJjZW50SGVpZ2h0RGVzY2VuZGFu
dHNNYXAqIGdQZXIKIAogdHlwZWRlZiBXVEY6Okhhc2hNYXA8Y29uc3QgUmVuZGVyQm94KiwgSGFz
aFNldDxSZW5kZXJCbG9jayo+Kj4gUGVyY2VudEhlaWdodENvbnRhaW5lck1hcDsKIHN0YXRpYyBQ
ZXJjZW50SGVpZ2h0Q29udGFpbmVyTWFwKiBnUGVyY2VudEhlaWdodENvbnRhaW5lck1hcCA9IDA7
Ci0gICAgCi10eXBlZGVmIFdURjo6SGFzaE1hcDxSZW5kZXJCbG9jayosIExpc3RIYXNoU2V0PFJl
bmRlcklubGluZSo+Kj4gQ29udGludWF0aW9uT3V0bGluZVRhYmxlTWFwOwogCiB0eXBlZGVmIFdU
Rjo6SGFzaFNldDxSZW5kZXJCbG9jayo+IERlbGF5ZWRVcGRhdGVTY3JvbGxJbmZvU2V0Owogc3Rh
dGljIGludCBnRGVsYXlVcGRhdGVTY3JvbGxJbmZvID0gMDsKQEAgLTkxLDcgKzg5LDcgQEAgUmVu
ZGVyQmxvY2s6Ok1hcmdpbkluZm86Ok1hcmdpbkluZm8oUmVuZAogICAgIC8vIGlmIHdlIGhhZCBh
bnkgYm9yZGVyL3BhZGRpbmcgKG9idmlvdXNseSksIGlmIHdlJ3JlIHRoZSByb290IG9yIEhUTUwg
ZWxlbWVudHMsIG9yIGlmCiAgICAgLy8gd2UncmUgcG9zaXRpb25lZCwgZmxvYXRpbmcsIGEgdGFi
bGUgY2VsbC4KICAgICBtX2NhbkNvbGxhcHNlV2l0aENoaWxkcmVuID0gIWJsb2NrLT5pc1JlbmRl
clZpZXcoKSAmJiAhYmxvY2stPmlzUm9vdCgpICYmICFibG9jay0+aXNQb3NpdGlvbmVkKCkgJiYK
LSAgICAgICAgIWJsb2NrLT5pc0Zsb2F0aW5nKCkgJiYgIWJsb2NrLT5pc1RhYmxlQ2VsbCgpICYm
ICFibG9jay0+aGFzT3ZlcmZsb3dDbGlwKCkgJiYgIWJsb2NrLT5pc0lubGluZUJsb2NrT3JJbmxp
bmVUYWJsZSgpOworICAgICAgICAhYmxvY2stPmlzRmxvYXRpbmcoKSAmJiAhYmxvY2stPmlzVGFi
bGVDZWxsKCkgJiYgIWJsb2NrLT5oYXNPdmVyZmxvd0NsaXAoKSAmJiAoIWJsb2NrLT5pc0lubGlu
ZUJsb2NrT3JJbmxpbmVUYWJsZSgpIHx8IGJsb2NrLT5pc0Fub255bW91c0lubGluZUJsb2NrKCkp
OwogCiAgICAgbV9jYW5Db2xsYXBzZVRvcFdpdGhDaGlsZHJlbiA9IG1fY2FuQ29sbGFwc2VXaXRo
Q2hpbGRyZW4gJiYgKHRvcCA9PSAwKSAmJiBibG9jay0+c3R5bGUoKS0+bWFyZ2luVG9wQ29sbGFw
c2UoKSAhPSBNU0VQQVJBVEU7CiAKQEAgLTEyMCw3ICsxMTgsNiBAQCBSZW5kZXJCbG9jazo6UmVu
ZGVyQmxvY2soTm9kZSogbm9kZSkKICAgICAgIDogUmVuZGVyQm94KG5vZGUpCiAgICAgICAsIG1f
ZmxvYXRpbmdPYmplY3RzKDApCiAgICAgICAsIG1fcG9zaXRpb25lZE9iamVjdHMoMCkKLSAgICAg
ICwgbV9pbmxpbmVDb250aW51YXRpb24oMCkKICAgICAgICwgbV9tYXhNYXJnaW4oMCkKICAgICAg
ICwgbV9saW5lSGVpZ2h0KC0xKQogewpAQCAtMTYxLDE0ICsxNTgsNiBAQCB2b2lkIFJlbmRlckJs
b2NrOjpkZXN0cm95KCkKICAgICAvLyBNYWtlIHN1cmUgdG8gZGVzdHJveSBhbm9ueW1vdXMgY2hp
bGRyZW4gZmlyc3Qgd2hpbGUgdGhleSBhcmUgc3RpbGwgY29ubmVjdGVkIHRvIHRoZSByZXN0IG9m
IHRoZSB0cmVlLCBzbyB0aGF0IHRoZXkgd2lsbAogICAgIC8vIHByb3Blcmx5IGRpcnR5IGxpbmUg
Ym94ZXMgdGhhdCB0aGV5IGFyZSByZW1vdmVkIGZyb20uIEVmZmVjdHMgdGhhdCBkbyA6YmVmb3Jl
LzphZnRlciBvbmx5IG9uIGhvdmVyIGNvdWxkIGNyYXNoIG90aGVyd2lzZS4KICAgICBjaGlsZHJl
bigpLT5kZXN0cm95TGVmdG92ZXJDaGlsZHJlbigpOwotCi0gICAgLy8gRGVzdHJveSBvdXIgY29u
dGludWF0aW9uIGJlZm9yZSBhbnl0aGluZyBvdGhlciB0aGFuIGFub255bW91cyBjaGlsZHJlbi4K
LSAgICAvLyBUaGUgcmVhc29uIHdlIGRvbid0IGRlc3Ryb3kgaXQgYmVmb3JlIGFub255bW91cyBj
aGlsZHJlbiBpcyB0aGF0IHRoZXkgbWF5Ci0gICAgLy8gaGF2ZSBjb250aW51YXRpb25zIG9mIHRo
ZWlyIG93biB0aGF0IGFyZSBhbm9ueW1vdXMgY2hpbGRyZW4gb2Ygb3VyIGNvbnRpbnVhdGlvbi4K
LSAgICBpZiAobV9pbmxpbmVDb250aW51YXRpb24pIHsKLSAgICAgICAgbV9pbmxpbmVDb250aW51
YXRpb24tPmRlc3Ryb3koKTsKLSAgICAgICAgbV9pbmxpbmVDb250aW51YXRpb24gPSAwOwotICAg
IH0KICAgICAKICAgICBpZiAoIWRvY3VtZW50QmVpbmdEZXN0cm95ZWQoKSkgewogICAgICAgICBp
ZiAoZmlyc3RMaW5lQm94KCkpIHsKQEAgLTMxNiw3ICszMDUsNyBAQCB2b2lkIFJlbmRlckJsb2Nr
OjphZGRDaGlsZChSZW5kZXJPYmplY3QqCiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFjaGls
ZHJlbklubGluZSgpICYmIChuZXdDaGlsZC0+aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpIHx8IG5l
d0NoaWxkLT5pc0lubGluZSgpKSkgewogICAgICAgICAvLyBJZiB3ZSdyZSBpbnNlcnRpbmcgYW4g
aW5saW5lIGNoaWxkIGJ1dCBhbGwgb2Ygb3VyIGNoaWxkcmVuIGFyZSBibG9ja3MsIHRoZW4gd2Ug
aGF2ZSB0byBtYWtlIHN1cmUKLSAgICAgICAgLy8gaXQgaXMgcHV0IGludG8gYW4gYW5vbXlvdXMg
YmxvY2sgYm94LiBXZSB0cnkgdG8gdXNlIGFuIGV4aXN0aW5nIGFub255bW91cyBib3ggaWYgcG9z
c2libGUsIG90aGVyd2lzZQorICAgICAgICAvLyBpdCBpcyBwdXQgaW50byBhbiBhbm9ueW1vdXMg
YmxvY2sgYm94LiBXZSB0cnkgdG8gdXNlIGFuIGV4aXN0aW5nIGFub255bW91cyBib3ggaWYgcG9z
c2libGUsIG90aGVyd2lzZQogICAgICAgICAvLyBhIG5ldyBvbmUgaXMgY3JlYXRlZCBhbmQgaW5z
ZXJ0ZWQgaW50byBvdXIgbGlzdCBvZiBjaGlsZHJlbiBpbiB0aGUgYXBwcm9wcmlhdGUgcG9zaXRp
b24uCiAgICAgICAgIFJlbmRlck9iamVjdCogYWZ0ZXJDaGlsZCA9IGJlZm9yZUNoaWxkID8gYmVm
b3JlQ2hpbGQtPnByZXZpb3VzU2libGluZygpIDogbGFzdENoaWxkKCk7CiAKQEAgLTM5MSw5ICsz
ODAsOSBAQCBSb290SW5saW5lQm94KiBSZW5kZXJCbG9jazo6Y3JlYXRlUm9vdEluCiAgICAgcmV0
dXJuIG5ldyAocmVuZGVyQXJlbmEoKSkgUm9vdElubGluZUJveCh0aGlzKTsKIH0KIAotUm9vdElu
bGluZUJveCogUmVuZGVyQmxvY2s6OmNyZWF0ZUFuZEFwcGVuZFJvb3RJbmxpbmVCb3goKQotewot
ICAgIFJvb3RJbmxpbmVCb3gqIHJvb3RCb3ggPSBjcmVhdGVSb290SW5saW5lQm94KCk7CitSb290
SW5saW5lQm94KiBSZW5kZXJCbG9jazo6Y3JlYXRlQW5kQXBwZW5kUm9vdElubGluZUJveChSZW5k
ZXJCbG9jayogYW5vbnltb3VzSW5saW5lQmxvY2spCit7IAorICAgIFJvb3RJbmxpbmVCb3gqIHJv
b3RCb3ggPSBhbm9ueW1vdXNJbmxpbmVCbG9jayA/IG5ldyAocmVuZGVyQXJlbmEoKSkgUm9vdEFu
b255bW91c0lubGluZUJsb2NrQm94KHRoaXMsIGFub255bW91c0lubGluZUJsb2NrKSA6IGNyZWF0
ZVJvb3RJbmxpbmVCb3goKTsKICAgICBtX2xpbmVCb3hlcy5hcHBlbmRMaW5lQm94KHJvb3RCb3gp
OwogICAgIHJldHVybiByb290Qm94OwogfQpAQCAtNDkwLDkgKzQ3OSw2IEBAIHZvaWQgUmVuZGVy
QmxvY2s6OnJlbW92ZUxlZnRvdmVyQW5vbnltb3UKICAgICBBU1NFUlQoY2hpbGQtPmlzQW5vbnlt
b3VzQmxvY2soKSk7CiAgICAgQVNTRVJUKCFjaGlsZC0+Y2hpbGRyZW5JbmxpbmUoKSk7CiAgICAg
Ci0gICAgaWYgKGNoaWxkLT5pbmxpbmVDb250aW51YXRpb24oKSkgCi0gICAgICAgIHJldHVybjsK
LSAgICAKICAgICBSZW5kZXJPYmplY3QqIGZpcnN0QW5DaGlsZCA9IGNoaWxkLT5tX2NoaWxkcmVu
LmZpcnN0Q2hpbGQoKTsKICAgICBSZW5kZXJPYmplY3QqIGxhc3RBbkNoaWxkID0gY2hpbGQtPm1f
Y2hpbGRyZW4ubGFzdENoaWxkKCk7CiAgICAgaWYgKGZpcnN0QW5DaGlsZCkgewpAQCAtNTM1LDcg
KzUyMSw3IEBAIHZvaWQgUmVuZGVyQmxvY2s6OnJlbW92ZUNoaWxkKFJlbmRlck9iamUKICAgICBS
ZW5kZXJPYmplY3QqIHByZXYgPSBvbGRDaGlsZC0+cHJldmlvdXNTaWJsaW5nKCk7CiAgICAgUmVu
ZGVyT2JqZWN0KiBuZXh0ID0gb2xkQ2hpbGQtPm5leHRTaWJsaW5nKCk7CiAgICAgYm9vbCBjYW5E
ZWxldGVBbm9ueW1vdXNCbG9ja3MgPSAhZG9jdW1lbnRCZWluZ0Rlc3Ryb3llZCgpICYmICFpc0lu
bGluZSgpICYmICFvbGRDaGlsZC0+aXNJbmxpbmUoKSAmJiAKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICghb2xkQ2hpbGQtPmlzUmVuZGVyQmxvY2soKSB8fCAhdG9SZW5kZXJC
bG9jayhvbGRDaGlsZCktPmlubGluZUNvbnRpbnVhdGlvbigpKSAmJiAKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICFvbGRDaGlsZC0+aXNSZW5kZXJCbG9jaygpICYmIAogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFwcmV2IHx8IChwcmV2LT5pc0Fub255
bW91c0Jsb2NrKCkgJiYgcHJldi0+Y2hpbGRyZW5JbmxpbmUoKSkpICYmCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAoIW5leHQgfHwgKG5leHQtPmlzQW5vbnltb3VzQmxvY2so
KSAmJiBuZXh0LT5jaGlsZHJlbklubGluZSgpKSk7CiAgICAgaWYgKGNhbkRlbGV0ZUFub255bW91
c0Jsb2NrcyAmJiBwcmV2ICYmIG5leHQpIHsKQEAgLTU5OCw5ICs1ODQsMTUgQEAgYm9vbCBSZW5k
ZXJCbG9jazo6aXNTZWxmQ29sbGFwc2luZ0Jsb2NrKAogICAgIC8vIG9uIHdoZXRoZXIgd2UgaGF2
ZSBjb250ZW50IHRoYXQgaXMgYWxsIHNlbGYtY29sbGFwc2luZyBvciBub3QuCiAgICAgaWYgKGhh
c0F1dG9IZWlnaHQgfHwgKChzdHlsZSgpLT5oZWlnaHQoKS5pc0ZpeGVkKCkgfHwgc3R5bGUoKS0+
aGVpZ2h0KCkuaXNQZXJjZW50KCkpICYmIHN0eWxlKCktPmhlaWdodCgpLmlzWmVybygpKSkgewog
ICAgICAgICAvLyBJZiB0aGUgYmxvY2sgaGFzIGlubGluZSBjaGlsZHJlbiwgc2VlIGlmIHdlIGdl
bmVyYXRlZCBhbnkgbGluZSBib3hlcy4gIElmIHdlIGhhdmUgYW55Ci0gICAgICAgIC8vIGxpbmUg
Ym94ZXMsIHRoZW4gd2UgY2FuJ3QgYmUgc2VsZi1jb2xsYXBzaW5nLCBzaW5jZSB3ZSBoYXZlIGNv
bnRlbnQuCi0gICAgICAgIGlmIChjaGlsZHJlbklubGluZSgpKQotICAgICAgICAgICAgcmV0dXJu
ICFmaXJzdExpbmVCb3goKTsKKyAgICAgICAgLy8gbGluZSBib3hlcywgdGhlbiB3ZSBjYW4gb25s
eSBiZSBzZWxmLWNvbGxhcHNpbmcgaWYgd2UgaGF2ZSBub3RoaW5nIGJ1dCBhbm9ueW1vdXMgaW5s
aW5lIGJsb2NrcworICAgICAgICAvLyB0aGF0IGFyZSBhbHNvIHNlbGYtY29sbGFwc2luZyBpbnNp
ZGUgdXMuCisgICAgICAgIGlmIChjaGlsZHJlbklubGluZSgpKSB7CisgICAgICAgICAgICBmb3Ig
KFJvb3RJbmxpbmVCb3gqIGNoaWxkID0gZmlyc3RSb290Qm94KCk7IGNoaWxkOyBjaGlsZCA9IGNo
aWxkLT5uZXh0Um9vdEJveCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFjaGlsZC0+aGFzQW5v
bnltb3VzSW5saW5lQmxvY2soKSB8fCAhY2hpbGQtPmFub255bW91c0lubGluZUJsb2NrKCktPmlz
U2VsZkNvbGxhcHNpbmdCbG9jaygpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gV2UgaGF2ZSBubyBs
aW5lIGJveGVzLCBzbyB3ZSBtdXN0IGJlIHNlbGYtY29sbGFwc2luZy4KKyAgICAgICAgfQogICAg
ICAgICAKICAgICAgICAgLy8gV2hldGhlciBvciBub3Qgd2UgY29sbGFwc2UgaXMgZGVwZW5kZW50
IG9uIHdoZXRoZXIgYWxsIG91ciBub3JtYWwgZmxvdyBjaGlsZHJlbgogICAgICAgICAvLyBhcmUg
YWxzbyBzZWxmLWNvbGxhcHNpbmcuCkBAIC04NTUsNyArODQ3LDggQEAgdm9pZCBSZW5kZXJCbG9j
azo6YWRkT3ZlcmZsb3dGcm9tRmxvYXRzKAogCiBib29sIFJlbmRlckJsb2NrOjpleHBhbmRzVG9F
bmNsb3NlT3ZlcmhhbmdpbmdGbG9hdHMoKSBjb25zdAogewotICAgIHJldHVybiBpc0lubGluZUJs
b2NrT3JJbmxpbmVUYWJsZSgpIHx8IGlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSB8fCBoYXNPdmVy
Zmxvd0NsaXAoKSB8fCAocGFyZW50KCkgJiYgcGFyZW50KCktPmlzRmxleGlibGVCb3goKSkgfHwg
aGFzQ29sdW1ucygpIHx8IGlzVGFibGVDZWxsKCkgfHwgaXNGaWVsZHNldCgpOworICAgIHJldHVy
biBpc0Zsb2F0aW5nT3JQb3NpdGlvbmVkKCkgfHwgaGFzT3ZlcmZsb3dDbGlwKCkgfHwgKHBhcmVu
dCgpICYmIHBhcmVudCgpLT5pc0ZsZXhpYmxlQm94KCkpIHx8IGhhc0NvbHVtbnMoKSB8fCBpc1Rh
YmxlQ2VsbCgpIHx8IGlzRmllbGRzZXQoKSB8fAorICAgICAgICAgICAoaXNJbmxpbmVCbG9ja09y
SW5saW5lVGFibGUoKSAmJiAhaXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKTsKIH0KIAogdm9pZCBS
ZW5kZXJCbG9jazo6YWRqdXN0UG9zaXRpb25lZEJsb2NrKFJlbmRlckJveCogY2hpbGQsIGNvbnN0
IE1hcmdpbkluZm8mIG1hcmdpbkluZm8pCkBAIC0xMDAxLDE5ICs5OTQsMTkgQEAgYm9vbCBSZW5k
ZXJCbG9jazo6aGFuZGxlUnVuSW5DaGlsZChSZW5kZQogaW50IFJlbmRlckJsb2NrOjpjb2xsYXBz
ZU1hcmdpbnMoUmVuZGVyQm94KiBjaGlsZCwgTWFyZ2luSW5mbyYgbWFyZ2luSW5mbykKIHsKICAg
ICAvLyBHZXQgb3VyIG1heCBwb3MgYW5kIG5lZyB0b3AgbWFyZ2lucy4KLSAgICBpbnQgcG9zVG9w
ID0gY2hpbGQtPm1heFRvcE1hcmdpbih0cnVlKTsKLSAgICBpbnQgbmVnVG9wID0gY2hpbGQtPm1h
eFRvcE1hcmdpbihmYWxzZSk7CisgICAgaW50IHBvc1RvcCA9IGNoaWxkID8gY2hpbGQtPm1heFRv
cE1hcmdpbih0cnVlKSA6IDA7CisgICAgaW50IG5lZ1RvcCA9IGNoaWxkID8gY2hpbGQtPm1heFRv
cE1hcmdpbihmYWxzZSkgOiAwOwogCiAgICAgLy8gRm9yIHNlbGYtY29sbGFwc2luZyBibG9ja3Ms
IGNvbGxhcHNlIG91ciBib3R0b20gbWFyZ2lucyBpbnRvIG91cgogICAgIC8vIHRvcCB0byBnZXQg
bmV3IHBvc1RvcCBhbmQgbmVnVG9wIHZhbHVlcy4KLSAgICBpZiAoY2hpbGQtPmlzU2VsZkNvbGxh
cHNpbmdCbG9jaygpKSB7CisgICAgaWYgKGNoaWxkICYmIGNoaWxkLT5pc1NlbGZDb2xsYXBzaW5n
QmxvY2soKSkgewogICAgICAgICBwb3NUb3AgPSBtYXgocG9zVG9wLCBjaGlsZC0+bWF4Qm90dG9t
TWFyZ2luKHRydWUpKTsKICAgICAgICAgbmVnVG9wID0gbWF4KG5lZ1RvcCwgY2hpbGQtPm1heEJv
dHRvbU1hcmdpbihmYWxzZSkpOwogICAgIH0KICAgICAKICAgICAvLyBTZWUgaWYgdGhlIHRvcCBt
YXJnaW4gaXMgcXVpcmt5LiBXZSBvbmx5IGNhcmUgaWYgdGhpcyBjaGlsZCBoYXMKICAgICAvLyBt
YXJnaW5zIHRoYXQgd2lsbCBjb2xsYXBzZSB3aXRoIHVzLgotICAgIGJvb2wgdG9wUXVpcmsgPSBj
aGlsZC0+aXNUb3BNYXJnaW5RdWlyaygpIHx8IHN0eWxlKCktPm1hcmdpblRvcENvbGxhcHNlKCkg
PT0gTURJU0NBUkQ7CisgICAgYm9vbCB0b3BRdWlyayA9IChjaGlsZCAmJiBjaGlsZC0+aXNUb3BN
YXJnaW5RdWlyaygpKSB8fCBzdHlsZSgpLT5tYXJnaW5Ub3BDb2xsYXBzZSgpID09IE1ESVNDQVJE
OwogCiAgICAgaWYgKG1hcmdpbkluZm8uY2FuQ29sbGFwc2VXaXRoVG9wKCkpIHsKICAgICAgICAg
Ly8gVGhpcyBjaGlsZCBpcyBjb2xsYXBzaW5nIHdpdGggdGhlIHRvcCBvZiB0aGUKQEAgLTEwMjYs
NyArMTAxOSw3IEBAIGludCBSZW5kZXJCbG9jazo6Y29sbGFwc2VNYXJnaW5zKFJlbmRlckIKICAg
ICAgICAgLy8gY29sbGFwc2UgaXQgYXdheSwgZXZlbiBpZiB0aGUgbWFyZ2luIGlzIHNtYWxsZXIg
KHd3dy53ZWJyZWZlcmVuY2UuY29tCiAgICAgICAgIC8vIGhhcyBhbiBleGFtcGxlIG9mIHRoaXMs
IGEgPGR0PiB3aXRoIDAuOGVtIGF1dGhvci1zcGVjaWZpZWQgaW5zaWRlCiAgICAgICAgIC8vIGEg
PGRsPiBpbnNpZGUgYSA8dGQ+LgotICAgICAgICBpZiAoIW1hcmdpbkluZm8uZGV0ZXJtaW5lZFRv
cFF1aXJrKCkgJiYgIXRvcFF1aXJrICYmIChwb3NUb3AtbmVnVG9wKSkgeworICAgICAgICBpZiAo
IW1hcmdpbkluZm8uZGV0ZXJtaW5lZFRvcFF1aXJrKCkgJiYgIXRvcFF1aXJrICYmIChwb3NUb3Ag
LSBuZWdUb3ApKSB7CiAgICAgICAgICAgICBzZXRUb3BNYXJnaW5RdWlyayhmYWxzZSk7CiAgICAg
ICAgICAgICBtYXJnaW5JbmZvLnNldERldGVybWluZWRUb3BRdWlyayh0cnVlKTsKICAgICAgICAg
fQpAQCAtMTA0NCw3ICsxMDM3LDcgQEAgaW50IFJlbmRlckJsb2NrOjpjb2xsYXBzZU1hcmdpbnMo
UmVuZGVyQgogICAgICAgICBtYXJnaW5JbmZvLnNldFRvcFF1aXJrKHRvcFF1aXJrKTsKIAogICAg
IGludCB5cG9zID0gaGVpZ2h0KCk7Ci0gICAgaWYgKGNoaWxkLT5pc1NlbGZDb2xsYXBzaW5nQmxv
Y2soKSkgeworICAgIGlmIChjaGlsZCAmJiBjaGlsZC0+aXNTZWxmQ29sbGFwc2luZ0Jsb2NrKCkp
IHsKICAgICAgICAgLy8gVGhpcyBjaGlsZCBoYXMgbm8gaGVpZ2h0LiAgV2UgbmVlZCB0byBjb21w
dXRlIG91cgogICAgICAgICAvLyBwb3NpdGlvbiBiZWZvcmUgd2UgY29sbGFwc2UgdGhlIGNoaWxk
J3MgbWFyZ2lucyB0b2dldGhlciwKICAgICAgICAgLy8gc28gdGhhdCB3ZSBjYW4gZ2V0IGFuIGFj
Y3VyYXRlIHBvc2l0aW9uIGZvciB0aGUgemVyby1oZWlnaHQgYmxvY2suCkBAIC0xMDYzLDEzICsx
MDU2LDExIEBAIGludCBSZW5kZXJCbG9jazo6Y29sbGFwc2VNYXJnaW5zKFJlbmRlckIKICAgICAg
ICAgICAgIC8vIHRoYXQgbmVlZHMgdG8gYmUgcG9zaXRpb25lZCBjb3JyZWN0bHkgKGUuZy4sIGEg
YmxvY2sgdGhhdAogICAgICAgICAgICAgLy8gaGFkIGEgc3BlY2lmaWVkIGhlaWdodCBvZiAwIGJ1
dCB0aGF0IGFjdHVhbGx5IGhhZCBzdWJjb250ZW50KS4KICAgICAgICAgICAgIHlwb3MgPSBoZWln
aHQoKSArIGNvbGxhcHNlZFRvcFBvcyAtIGNvbGxhcHNlZFRvcE5lZzsKLSAgICB9Ci0gICAgZWxz
ZSB7Ci0gICAgICAgIGlmIChjaGlsZC0+c3R5bGUoKS0+bWFyZ2luVG9wQ29sbGFwc2UoKSA9PSBN
U0VQQVJBVEUpIHsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoY2hpbGQgJiYgY2hpbGQtPnN0
eWxlKCktPm1hcmdpblRvcENvbGxhcHNlKCkgPT0gTVNFUEFSQVRFKSB7CiAgICAgICAgICAgICBz
ZXRIZWlnaHQoaGVpZ2h0KCkgKyBtYXJnaW5JbmZvLm1hcmdpbigpICsgY2hpbGQtPm1hcmdpblRv
cCgpKTsKICAgICAgICAgICAgIHlwb3MgPSBoZWlnaHQoKTsKLSAgICAgICAgfQotICAgICAgICBl
bHNlIGlmICghbWFyZ2luSW5mby5hdFRvcE9mQmxvY2soKSB8fAorICAgICAgICB9IGVsc2UgaWYg
KCFtYXJnaW5JbmZvLmF0VG9wT2ZCbG9jaygpIHx8CiAgICAgICAgICAgICAoIW1hcmdpbkluZm8u
Y2FuQ29sbGFwc2VUb3BXaXRoQ2hpbGRyZW4oKQogICAgICAgICAgICAgICYmICghc3R5bGUoKS0+
aHRtbEhhY2tzKCkgfHwgIW1hcmdpbkluZm8ucXVpcmtDb250YWluZXIoKSB8fCAhbWFyZ2luSW5m
by50b3BRdWlyaygpKSkpIHsKICAgICAgICAgICAgIC8vIFdlJ3JlIGNvbGxhcHNpbmcgd2l0aCBh
IHByZXZpb3VzIHNpYmxpbmcncyBtYXJnaW5zIGFuZCBub3QKQEAgLTEwNzgsMTEgKzEwNjksMTEg
QEAgaW50IFJlbmRlckJsb2NrOjpjb2xsYXBzZU1hcmdpbnMoUmVuZGVyQgogICAgICAgICAgICAg
eXBvcyA9IGhlaWdodCgpOwogICAgICAgICB9CiAKLSAgICAgICAgbWFyZ2luSW5mby5zZXRQb3NN
YXJnaW4oY2hpbGQtPm1heEJvdHRvbU1hcmdpbih0cnVlKSk7Ci0gICAgICAgIG1hcmdpbkluZm8u
c2V0TmVnTWFyZ2luKGNoaWxkLT5tYXhCb3R0b21NYXJnaW4oZmFsc2UpKTsKKyAgICAgICAgbWFy
Z2luSW5mby5zZXRQb3NNYXJnaW4oY2hpbGQgPyBjaGlsZC0+bWF4Qm90dG9tTWFyZ2luKHRydWUp
IDogMCk7CisgICAgICAgIG1hcmdpbkluZm8uc2V0TmVnTWFyZ2luKGNoaWxkID8gY2hpbGQtPm1h
eEJvdHRvbU1hcmdpbihmYWxzZSkgOiAwKTsKIAogICAgICAgICBpZiAobWFyZ2luSW5mby5tYXJn
aW4oKSkKLSAgICAgICAgICAgIG1hcmdpbkluZm8uc2V0Qm90dG9tUXVpcmsoY2hpbGQtPmlzQm90
dG9tTWFyZ2luUXVpcmsoKSB8fCBzdHlsZSgpLT5tYXJnaW5Cb3R0b21Db2xsYXBzZSgpID09IE1E
SVNDQVJEKTsKKyAgICAgICAgICAgIG1hcmdpbkluZm8uc2V0Qm90dG9tUXVpcmsoKGNoaWxkICYm
IGNoaWxkLT5pc0JvdHRvbU1hcmdpblF1aXJrKCkpIHx8IHN0eWxlKCktPm1hcmdpbkJvdHRvbUNv
bGxhcHNlKCkgPT0gTURJU0NBUkQpOwogICAgIH0KICAgICAKICAgICByZXR1cm4geXBvczsKQEAg
LTE3NDksMjAgKzE3NDAsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjpwYWludE9iamVjdChQYWludElu
Zm8mCiAgICAgaWYgKChwYWludFBoYXNlID09IFBhaW50UGhhc2VPdXRsaW5lIHx8IHBhaW50UGhh
c2UgPT0gUGFpbnRQaGFzZVNlbGZPdXRsaW5lKSAmJiBoYXNPdXRsaW5lKCkgJiYgc3R5bGUoKS0+
dmlzaWJpbGl0eSgpID09IFZJU0lCTEUpCiAgICAgICAgIHBhaW50T3V0bGluZShwYWludEluZm8u
Y29udGV4dCwgdHgsIHR5LCB3aWR0aCgpLCBoZWlnaHQoKSwgc3R5bGUoKSk7CiAKLSAgICAvLyA2
LiBwYWludCBjb250aW51YXRpb24gb3V0bGluZXMuCi0gICAgaWYgKChwYWludFBoYXNlID09IFBh
aW50UGhhc2VPdXRsaW5lIHx8IHBhaW50UGhhc2UgPT0gUGFpbnRQaGFzZUNoaWxkT3V0bGluZXMp
KSB7Ci0gICAgICAgIGlmIChpbmxpbmVDb250aW51YXRpb24oKSAmJiBpbmxpbmVDb250aW51YXRp
b24oKS0+aGFzT3V0bGluZSgpICYmIGlubGluZUNvbnRpbnVhdGlvbigpLT5zdHlsZSgpLT52aXNp
YmlsaXR5KCkgPT0gVklTSUJMRSkgewotICAgICAgICAgICAgUmVuZGVySW5saW5lKiBpbmxpbmVS
ZW5kZXJlciA9IHRvUmVuZGVySW5saW5lKGlubGluZUNvbnRpbnVhdGlvbigpLT5ub2RlKCktPnJl
bmRlcmVyKCkpOwotICAgICAgICAgICAgaWYgKCFpbmxpbmVSZW5kZXJlci0+aGFzU2VsZlBhaW50
aW5nTGF5ZXIoKSkKLSAgICAgICAgICAgICAgICBjb250YWluaW5nQmxvY2soKS0+YWRkQ29udGlu
dWF0aW9uV2l0aE91dGxpbmUoaW5saW5lUmVuZGVyZXIpOwotICAgICAgICAgICAgZWxzZSBpZiAo
IWlubGluZVJlbmRlcmVyLT5maXJzdExpbmVCb3goKSkKLSAgICAgICAgICAgICAgICBpbmxpbmVS
ZW5kZXJlci0+cGFpbnRPdXRsaW5lKHBhaW50SW5mby5jb250ZXh0LCB0eCAtIHgoKSArIGlubGlu
ZVJlbmRlcmVyLT5jb250YWluaW5nQmxvY2soKS0+eCgpLAotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgdHkgLSB5KCkgKyBpbmxpbmVSZW5kZXJlci0+Y29udGFp
bmluZ0Jsb2NrKCktPnkoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcGFpbnRDb250aW51YXRpb25P
dXRsaW5lcyhwYWludEluZm8sIHR4LCB0eSk7Ci0gICAgfQotCi0gICAgLy8gNy4gcGFpbnQgY2Fy
ZXQuCisgICAgLy8gNi4gcGFpbnQgY2FyZXQuCiAgICAgLy8gSWYgdGhlIGNhcmV0J3Mgbm9kZSdz
IHJlbmRlciBvYmplY3QncyBjb250YWluaW5nIGJsb2NrIGlzIHRoaXMgYmxvY2ssIGFuZCB0aGUg
cGFpbnQgYWN0aW9uIGlzIFBhaW50UGhhc2VGb3JlZ3JvdW5kLAogICAgIC8vIHRoZW4gcGFpbnQg
dGhlIGNhcmV0LgogICAgIGlmIChwYWludFBoYXNlID09IFBhaW50UGhhc2VGb3JlZ3JvdW5kKSB7
ICAgICAgICAKQEAgLTE4MjUsNTcgKzE4MDMsNiBAQCB2b2lkIFJlbmRlckJsb2NrOjpwYWludEVs
bGlwc2lzQm94ZXMoUGFpCiAgICAgfQogfQogCi1zdGF0aWMgQ29udGludWF0aW9uT3V0bGluZVRh
YmxlTWFwKiBjb250aW51YXRpb25PdXRsaW5lVGFibGUoKQotewotICAgIERFRklORV9TVEFUSUNf
TE9DQUwoQ29udGludWF0aW9uT3V0bGluZVRhYmxlTWFwLCB0YWJsZSwgKCkpOwotICAgIHJldHVy
biAmdGFibGU7Ci19Ci0KLXZvaWQgUmVuZGVyQmxvY2s6OmFkZENvbnRpbnVhdGlvbldpdGhPdXRs
aW5lKFJlbmRlcklubGluZSogZmxvdykKLXsKLSAgICAvLyBXZSBjYW4ndCBtYWtlIHRoaXMgd29y
ayBpZiB0aGUgaW5saW5lIGlzIGluIGEgbGF5ZXIuICBXZSdsbCBqdXN0IHJlbHkgb24gdGhlIGJy
b2tlbgotICAgIC8vIHdheSBvZiBwYWludGluZy4KLSAgICBBU1NFUlQoIWZsb3ctPmxheWVyKCkg
JiYgIWZsb3ctPmlzSW5saW5lQ29udGludWF0aW9uKCkpOwotICAgIAotICAgIENvbnRpbnVhdGlv
bk91dGxpbmVUYWJsZU1hcCogdGFibGUgPSBjb250aW51YXRpb25PdXRsaW5lVGFibGUoKTsKLSAg
ICBMaXN0SGFzaFNldDxSZW5kZXJJbmxpbmUqPiogY29udGludWF0aW9ucyA9IHRhYmxlLT5nZXQo
dGhpcyk7Ci0gICAgaWYgKCFjb250aW51YXRpb25zKSB7Ci0gICAgICAgIGNvbnRpbnVhdGlvbnMg
PSBuZXcgTGlzdEhhc2hTZXQ8UmVuZGVySW5saW5lKj47Ci0gICAgICAgIHRhYmxlLT5zZXQodGhp
cywgY29udGludWF0aW9ucyk7Ci0gICAgfQotICAgIAotICAgIGNvbnRpbnVhdGlvbnMtPmFkZChm
bG93KTsKLX0KLQotdm9pZCBSZW5kZXJCbG9jazo6cGFpbnRDb250aW51YXRpb25PdXRsaW5lcyhQ
YWludEluZm8mIGluZm8sIGludCB0eCwgaW50IHR5KQotewotICAgIENvbnRpbnVhdGlvbk91dGxp
bmVUYWJsZU1hcCogdGFibGUgPSBjb250aW51YXRpb25PdXRsaW5lVGFibGUoKTsKLSAgICBpZiAo
dGFibGUtPmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAgICBMaXN0SGFz
aFNldDxSZW5kZXJJbmxpbmUqPiogY29udGludWF0aW9ucyA9IHRhYmxlLT5nZXQodGhpcyk7Ci0g
ICAgaWYgKCFjb250aW51YXRpb25zKQotICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgIC8v
IFBhaW50IGVhY2ggY29udGludWF0aW9uIG91dGxpbmUuCi0gICAgTGlzdEhhc2hTZXQ8UmVuZGVy
SW5saW5lKj46Oml0ZXJhdG9yIGVuZCA9IGNvbnRpbnVhdGlvbnMtPmVuZCgpOwotICAgIGZvciAo
TGlzdEhhc2hTZXQ8UmVuZGVySW5saW5lKj46Oml0ZXJhdG9yIGl0ID0gY29udGludWF0aW9ucy0+
YmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgIC8vIE5lZWQgdG8gYWRkIGluIHRo
ZSBjb29yZGluYXRlcyBvZiB0aGUgaW50ZXJ2ZW5pbmcgYmxvY2tzLgotICAgICAgICBSZW5kZXJJ
bmxpbmUqIGZsb3cgPSAqaXQ7Ci0gICAgICAgIFJlbmRlckJsb2NrKiBibG9jayA9IGZsb3ctPmNv
bnRhaW5pbmdCbG9jaygpOwotICAgICAgICBmb3IgKCA7IGJsb2NrICYmIGJsb2NrICE9IHRoaXM7
IGJsb2NrID0gYmxvY2stPmNvbnRhaW5pbmdCbG9jaygpKSB7Ci0gICAgICAgICAgICB0eCArPSBi
bG9jay0+eCgpOwotICAgICAgICAgICAgdHkgKz0gYmxvY2stPnkoKTsKLSAgICAgICAgfQotICAg
ICAgICBBU1NFUlQoYmxvY2spOyAgIAotICAgICAgICBmbG93LT5wYWludE91dGxpbmUoaW5mby5j
b250ZXh0LCB0eCwgdHkpOwotICAgIH0KLSAgICAKLSAgICAvLyBEZWxldGUKLSAgICBkZWxldGUg
Y29udGludWF0aW9uczsKLSAgICB0YWJsZS0+cmVtb3ZlKHRoaXMpOwotfQotCiB2b2lkIFJlbmRl
ckJsb2NrOjpzZXRTZWxlY3Rpb25TdGF0ZShTZWxlY3Rpb25TdGF0ZSBzKQogewogICAgIGlmIChz
ZWxlY3Rpb25TdGF0ZSgpID09IHMpCkBAIC0xODkwLDYgKzE4MTcsMTIgQEAgdm9pZCBSZW5kZXJC
bG9jazo6c2V0U2VsZWN0aW9uU3RhdGUoU2VsZQogICAgIGVsc2UKICAgICAgICAgUmVuZGVyQm94
OjpzZXRTZWxlY3Rpb25TdGF0ZShzKTsKICAgICAKKyAgICBpZiAoaXNSZXBsYWNlZCgpICYmIG1f
aW5saW5lQm94V3JhcHBlcikgeworICAgICAgICBSb290SW5saW5lQm94KiBsaW5lID0gbV9pbmxp
bmVCb3hXcmFwcGVyLT5yb290KCk7CisgICAgICAgIGlmIChsaW5lKQorICAgICAgICAgICAgbGlu
ZS0+c2V0SGFzU2VsZWN0ZWRDaGlsZHJlbihzICE9IFNlbGVjdGlvbk5vbmUpOworICAgIH0KKwog
ICAgIFJlbmRlckJsb2NrKiBjYiA9IGNvbnRhaW5pbmdCbG9jaygpOwogICAgIGlmIChjYiAmJiAh
Y2ItPmlzUmVuZGVyVmlldygpKQogICAgICAgICBjYi0+c2V0U2VsZWN0aW9uU3RhdGUocyk7CkBA
IC0xOTA4LDkgKzE4NDEsOSBAQCBib29sIFJlbmRlckJsb2NrOjppc1NlbGVjdGlvblJvb3QoKSBj
b25zCiAgICAgLy8gRklYTUU6IEV2ZW50dWFsbHkgdGFibGVzIHNob3VsZCBoYXZlIHRvIGxlYXJu
IGhvdyB0byBmaWxsIGdhcHMgYmV0d2VlbiBjZWxscywgYXQgbGVhc3QgaW4gc2ltcGxlIG5vbi1z
cGFubmluZyBjYXNlcy4KICAgICBpZiAoaXNUYWJsZSgpKQogICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgICAgIAorCiAgICAgaWYgKGlzQm9keSgpIHx8IGlzUm9vdCgpIHx8IGhhc092ZXJmbG93
Q2xpcCgpIHx8IGlzUmVsUG9zaXRpb25lZCgpIHx8Ci0gICAgICAgIGlzRmxvYXRpbmdPclBvc2l0
aW9uZWQoKSB8fCBpc1RhYmxlQ2VsbCgpIHx8IGlzSW5saW5lQmxvY2tPcklubGluZVRhYmxlKCkg
fHwgaGFzVHJhbnNmb3JtKCkgfHwKKyAgICAgICAgaXNGbG9hdGluZ09yUG9zaXRpb25lZCgpIHx8
IGlzVGFibGVDZWxsKCkgfHwgKGlzSW5saW5lQmxvY2tPcklubGluZVRhYmxlKCkgJiYgIWlzQW5v
bnltb3VzSW5saW5lQmxvY2soKSkgfHwgaGFzVHJhbnNmb3JtKCkgfHwKICAgICAgICAgaGFzUmVm
bGVjdGlvbigpIHx8IGhhc01hc2soKSkKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgCkBAIC0y
MDU1LDE4ICsxOTg4LDMwIEBAIEdhcFJlY3RzIFJlbmRlckJsb2NrOjpmaWxsSW5saW5lU2VsZWN0
aW8KICAgICBmb3IgKGN1cnIgPSBmaXJzdFJvb3RCb3goKTsgY3VyciAmJiAhY3Vyci0+aGFzU2Vs
ZWN0ZWRDaGlsZHJlbigpOyBjdXJyID0gY3Vyci0+bmV4dFJvb3RCb3goKSkgeyB9CiAKICAgICAv
LyBOb3cgcGFpbnQgdGhlIGdhcHMgZm9yIHRoZSBsaW5lcy4KLSAgICBmb3IgKDsgY3VyciAmJiBj
dXJyLT5oYXNTZWxlY3RlZENoaWxkcmVuKCk7IGN1cnIgPSBjdXJyLT5uZXh0Um9vdEJveCgpKSB7
CisgICAgZm9yICg7IGN1cnIgJiYgKGN1cnItPmhhc1NlbGVjdGVkQ2hpbGRyZW4oKSB8fCBjdXJy
LT5oYXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKTsgY3VyciA9IGN1cnItPm5leHRSb290Qm94KCkp
IHsKKyAgICAgICAgaWYgKCFjdXJyLT5oYXNTZWxlY3RlZENoaWxkcmVuKCkpCisgICAgICAgICAg
ICBjb250aW51ZTsKKwogICAgICAgICBpbnQgc2VsVG9wID0gIGN1cnItPnNlbGVjdGlvblRvcCgp
OwogICAgICAgICBpbnQgc2VsSGVpZ2h0ID0gY3Vyci0+c2VsZWN0aW9uSGVpZ2h0KCk7CiAKLSAg
ICAgICAgaWYgKCFjb250YWluc1N0YXJ0ICYmICFsYXN0U2VsZWN0ZWRMaW5lICYmCi0gICAgICAg
ICAgICBzZWxlY3Rpb25TdGF0ZSgpICE9IFNlbGVjdGlvblN0YXJ0ICYmIHNlbGVjdGlvblN0YXRl
KCkgIT0gU2VsZWN0aW9uQm90aCkKLSAgICAgICAgICAgIHJlc3VsdC51bml0ZUNlbnRlcihmaWxs
VmVydGljYWxTZWxlY3Rpb25HYXAobGFzdFRvcCwgbGFzdExlZnQsIGxhc3RSaWdodCwgdHkgKyBz
ZWxUb3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHJvb3RCbG9jaywgYmxvY2tYLCBibG9ja1ksIHBhaW50SW5mbykpOwotCi0gICAgICAg
IGlmICghcGFpbnRJbmZvIHx8ICh0eSArIHNlbFRvcCA8IHBhaW50SW5mby0+cmVjdC5ib3R0b20o
KSAmJiB0eSArIHNlbFRvcCArIHNlbEhlaWdodCA+IHBhaW50SW5mby0+cmVjdC55KCkpKQotICAg
ICAgICAgICAgcmVzdWx0LnVuaXRlKGN1cnItPmZpbGxMaW5lU2VsZWN0aW9uR2FwKHNlbFRvcCwg
c2VsSGVpZ2h0LCByb290QmxvY2ssIGJsb2NrWCwgYmxvY2tZLCB0eCwgdHksIHBhaW50SW5mbykp
OworICAgICAgICBpZiAoY3Vyci0+aGFzQW5vbnltb3VzSW5saW5lQmxvY2soKSkgeworICAgICAg
ICAgICAgaWYgKGxhc3RTZWxlY3RlZExpbmUpIHsKKyAgICAgICAgICAgICAgICBsYXN0VG9wID0g
KHR5IC0gYmxvY2tZKSArIGxhc3RTZWxlY3RlZExpbmUtPnNlbGVjdGlvbkJvdHRvbSgpOworICAg
ICAgICAgICAgICAgIGxhc3RMZWZ0ID0gbGVmdFNlbGVjdGlvbk9mZnNldChyb290QmxvY2ssIGxh
c3RTZWxlY3RlZExpbmUtPnNlbGVjdGlvbkJvdHRvbSgpKTsKKyAgICAgICAgICAgICAgICBsYXN0
UmlnaHQgPSByaWdodFNlbGVjdGlvbk9mZnNldChyb290QmxvY2ssIGxhc3RTZWxlY3RlZExpbmUt
PnNlbGVjdGlvbkJvdHRvbSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRhaW5z
U3RhcnQgPSBmYWxzZTsKKyAgICAgICAgICAgIHJlc3VsdC51bml0ZShjdXJyLT5hbm9ueW1vdXNJ
bmxpbmVCbG9jaygpLT5maWxsU2VsZWN0aW9uR2Fwcyhyb290QmxvY2ssIGJsb2NrWCwgYmxvY2tZ
LCB0eCArIGN1cnItPngoKSwgdHkgKyBjdXJyLT55KCksIGxhc3RUb3AsIGxhc3RMZWZ0LCBsYXN0
UmlnaHQsIHBhaW50SW5mbykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFj
b250YWluc1N0YXJ0ICYmICghbGFzdFNlbGVjdGVkTGluZSB8fCBsYXN0U2VsZWN0ZWRMaW5lLT5h
bm9ueW1vdXNJbmxpbmVCbG9jaygpKSkKKyAgICAgICAgICAgICAgICByZXN1bHQudW5pdGVDZW50
ZXIoZmlsbFZlcnRpY2FsU2VsZWN0aW9uR2FwKGxhc3RUb3AsIGxhc3RMZWZ0LCBsYXN0UmlnaHQs
IHR5ICsgc2VsVG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgcm9vdEJsb2NrLCBibG9ja1gsIGJsb2NrWSwgcGFpbnRJbmZvKSk7
CiAKKyAgICAgICAgICAgIGlmICghcGFpbnRJbmZvIHx8ICh0eSArIHNlbFRvcCA8IHBhaW50SW5m
by0+cmVjdC5ib3R0b20oKSAmJiB0eSArIHNlbFRvcCArIHNlbEhlaWdodCA+IHBhaW50SW5mby0+
cmVjdC55KCkpKQorICAgICAgICAgICAgICAgIHJlc3VsdC51bml0ZShjdXJyLT5maWxsTGluZVNl
bGVjdGlvbkdhcChzZWxUb3AsIHNlbEhlaWdodCwgcm9vdEJsb2NrLCBibG9ja1gsIGJsb2NrWSwg
dHgsIHR5LCBwYWludEluZm8pKTsKKyAgICAgICAgfQorICAgICAgICAKICAgICAgICAgbGFzdFNl
bGVjdGVkTGluZSA9IGN1cnI7CiAgICAgfQogCkBAIC0yMDc0LDggKzIwMTksOCBAQCBHYXBSZWN0
cyBSZW5kZXJCbG9jazo6ZmlsbElubGluZVNlbGVjdGlvCiAgICAgICAgIC8vIFZpc2libGVTZWxl
Y3Rpb24gbXVzdCBzdGFydCBqdXN0IGFmdGVyIG91ciBsYXN0IGxpbmUuCiAgICAgICAgIGxhc3RT
ZWxlY3RlZExpbmUgPSBsYXN0Um9vdEJveCgpOwogCi0gICAgaWYgKGxhc3RTZWxlY3RlZExpbmUg
JiYgc2VsZWN0aW9uU3RhdGUoKSAhPSBTZWxlY3Rpb25FbmQgJiYgc2VsZWN0aW9uU3RhdGUoKSAh
PSBTZWxlY3Rpb25Cb3RoKSB7Ci0gICAgICAgIC8vIEdvIGFoZWFkIGFuZCB1cGRhdGUgb3VyIGxh
c3RZIHRvIGJlIHRoZSBib3R0b20gb2YgdGhlIGxhc3Qgc2VsZWN0ZWQgbGluZS4KKyAgICBpZiAo
bGFzdFNlbGVjdGVkTGluZSAmJiAhbGFzdFNlbGVjdGVkTGluZS0+aGFzQW5vbnltb3VzSW5saW5l
QmxvY2soKSAmJiBzZWxlY3Rpb25TdGF0ZSgpICE9IFNlbGVjdGlvbkVuZCAmJiBzZWxlY3Rpb25T
dGF0ZSgpICE9IFNlbGVjdGlvbkJvdGgpIHsKKyAgICAgICAgLy8gR28gYWhlYWQgYW5kIHVwZGF0
ZSBvdXIgbGFzdFRvcCB0byBiZSB0aGUgYm90dG9tIG9mIHRoZSBsYXN0IHNlbGVjdGVkIGxpbmUu
CiAgICAgICAgIGxhc3RUb3AgPSAodHkgLSBibG9ja1kpICsgbGFzdFNlbGVjdGVkTGluZS0+c2Vs
ZWN0aW9uQm90dG9tKCk7CiAgICAgICAgIGxhc3RMZWZ0ID0gbGVmdFNlbGVjdGlvbk9mZnNldChy
b290QmxvY2ssIGxhc3RTZWxlY3RlZExpbmUtPnNlbGVjdGlvbkJvdHRvbSgpKTsKICAgICAgICAg
bGFzdFJpZ2h0ID0gcmlnaHRTZWxlY3Rpb25PZmZzZXQocm9vdEJsb2NrLCBsYXN0U2VsZWN0ZWRM
aW5lLT5zZWxlY3Rpb25Cb3R0b20oKSk7CkBAIC0yOTg1LDI1ICsyOTMwLDMxIEBAIHZvaWQgUmVu
ZGVyQmxvY2s6OmNsZWFyRmxvYXRzKCkKICAgICAvLyBvdXQgb2YgZmxvdyAobGlrZSBmbG9hdGlu
Zy9wb3NpdGlvbmVkIGVsZW1lbnRzKSwgYW5kIHdlIGFsc28gc2tpcCBvdmVyIGFueSBvYmplY3Rz
IHRoYXQgbWF5IGhhdmUgc2hpZnRlZAogICAgIC8vIHRvIGF2b2lkIGZsb2F0cy4KICAgICBib29s
IHBhcmVudEhhc0Zsb2F0cyA9IGZhbHNlOwotICAgIFJlbmRlck9iamVjdCogcHJldiA9IHByZXZp
b3VzU2libGluZygpOwotICAgIHdoaWxlIChwcmV2ICYmIChwcmV2LT5pc0Zsb2F0aW5nT3JQb3Np
dGlvbmVkKCkgfHwgIXByZXYtPmlzQm94KCkgfHwgIXByZXYtPmlzUmVuZGVyQmxvY2soKSB8fCB0
b1JlbmRlckJsb2NrKHByZXYpLT5hdm9pZHNGbG9hdHMoKSkpIHsKLSAgICAgICAgaWYgKHByZXYt
PmlzRmxvYXRpbmcoKSkKLSAgICAgICAgICAgIHBhcmVudEhhc0Zsb2F0cyA9IHRydWU7Ci0gICAg
ICAgICBwcmV2ID0gcHJldi0+cHJldmlvdXNTaWJsaW5nKCk7CisgICAgUmVuZGVyT2JqZWN0KiBw
cmV2ID0gMDsKKyAgICBSZW5kZXJCbG9jayogcGFyZW50QmxvY2sgPSAwOworICAgIGlmIChpc0Fu
b255bW91c0lubGluZUJsb2NrKCkpIHsKKyAgICAgICAgcGFyZW50QmxvY2sgPSBjb250YWluaW5n
QmxvY2soKTsKKyAgICAgICAgcGFyZW50SGFzRmxvYXRzID0gcGFyZW50QmxvY2stPmNvbnRhaW5z
RmxvYXRzKCk7CisgICAgfSBlbHNlIHsgICAgCisgICAgICAgIHdoaWxlIChwcmV2ICYmIChwcmV2
LT5pc0Zsb2F0aW5nT3JQb3NpdGlvbmVkKCkgfHwgIXByZXYtPmlzQm94KCkgfHwgIXByZXYtPmlz
UmVuZGVyQmxvY2soKSB8fCB0b1JlbmRlckJsb2NrKHByZXYpLT5hdm9pZHNGbG9hdHMoKSkpIHsK
KyAgICAgICAgICAgIGlmIChwcmV2LT5pc0Zsb2F0aW5nKCkpCisgICAgICAgICAgICAgICAgcGFy
ZW50SGFzRmxvYXRzID0gdHJ1ZTsKKyAgICAgICAgICAgIHByZXYgPSBwcmV2LT5wcmV2aW91c1Np
YmxpbmcoKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcGFyZW50QmxvY2sgPSBwYXJl
bnQoKS0+aXNSZW5kZXJCbG9jaygpID8gdG9SZW5kZXJCbG9jayhwYXJlbnQoKSkgOiAwOwogICAg
IH0KIAogICAgIC8vIEZpcnN0IGFkZCBpbiBmbG9hdHMgZnJvbSB0aGUgcGFyZW50LgogICAgIGlu
dCBvZmZzZXQgPSB5KCk7Ci0gICAgaWYgKHBhcmVudEhhc0Zsb2F0cykgewotICAgICAgICBSZW5k
ZXJCbG9jayogcGFyZW50QmxvY2sgPSB0b1JlbmRlckJsb2NrKHBhcmVudCgpKTsKKyAgICBpZiAo
cGFyZW50SGFzRmxvYXRzKQogICAgICAgICBhZGRJbnRydWRpbmdGbG9hdHMocGFyZW50QmxvY2ss
IHBhcmVudEJsb2NrLT5ib3JkZXJMZWZ0KCkgKyBwYXJlbnRCbG9jay0+cGFkZGluZ0xlZnQoKSwg
b2Zmc2V0KTsKLSAgICB9Ci0gICAgCisKICAgICBpbnQgeG9mZnNldCA9IDA7CiAgICAgaWYgKHBy
ZXYpCiAgICAgICAgIG9mZnNldCAtPSB0b1JlbmRlckJveChwcmV2KS0+eSgpOwotICAgIGVsc2Ug
aWYgKHBhcmVudCgpLT5pc0JveCgpKSB7Ci0gICAgICAgIHByZXYgPSBwYXJlbnQoKTsKKyAgICBl
bHNlIGlmIChwYXJlbnRCbG9jaykgeworICAgICAgICBwcmV2ID0gcGFyZW50QmxvY2s7CiAgICAg
ICAgIHhvZmZzZXQgKz0gdG9SZW5kZXJCb3gocHJldiktPmJvcmRlckxlZnQoKSArIHRvUmVuZGVy
Qm94KHByZXYpLT5wYWRkaW5nTGVmdCgpOwogICAgIH0KIApAQCAtMzEzOCw3ICszMDg5LDcgQEAg
dm9pZCBSZW5kZXJCbG9jazo6YWRkSW50cnVkaW5nRmxvYXRzKFJlbgogICAgICAgICAgICAgICAg
IC8vIGFib3ZlLiAgfHhvZmZ8IHdpbGwgZXF1YWwgLWZsb3ctPm1hcmdpbkxlZnQoKSBpbiB0aGlz
IGNhc2UsIHNvIGl0J3MgYWxyZWFkeSBiZWVuIHRha2VuCiAgICAgICAgICAgICAgICAgLy8gaW50
byBhY2NvdW50LiAgT25seSBhcHBseSB0aGlzIGNvZGUgaWYgfGNoaWxkfCBpcyBmYWxzZSwgc2lu
Y2Ugb3RoZXJ3aXNlIHRoZSBsZWZ0IG1hcmdpbgogICAgICAgICAgICAgICAgIC8vIHdpbGwgZ2V0
IGFwcGxpZWQgdHdpY2UuCi0gICAgICAgICAgICAgICAgaWYgKHByZXYgIT0gcGFyZW50KCkpCisg
ICAgICAgICAgICAgICAgaWYgKHByZXYgIT0gY29udGFpbmluZ0Jsb2NrKCkpCiAgICAgICAgICAg
ICAgICAgICAgIGZsb2F0aW5nT2JqLT5tX2xlZnQgKz0gcHJldi0+bWFyZ2luTGVmdCgpOwogICAg
ICAgICAgICAgICAgIGZsb2F0aW5nT2JqLT5tX2xlZnQgLT0gbWFyZ2luTGVmdCgpOwogICAgICAg
ICAgICAgICAgIGZsb2F0aW5nT2JqLT5tX3Nob3VsZFBhaW50ID0gZmFsc2U7ICAvLyBXZSBhcmUg
bm90IGluIHRoZSBkaXJlY3QgaW5oZXJpdGFuY2UgY2hhaW4gZm9yIHRoaXMgZmxvYXQuIFdlIHdp
bGwgbmV2ZXIgcGFpbnQgaXQuCkBAIC0zMTgzLDcgKzMxMzQsMTMgQEAgdm9pZCBSZW5kZXJCbG9j
azo6bWFya0FsbERlc2NlbmRhbnRzV2l0aAogICAgICAgICByZW1vdmVGbG9hdGluZ09iamVjdChm
bG9hdFRvUmVtb3ZlKTsKIAogICAgIC8vIEl0ZXJhdGUgb3ZlciBvdXIgY2hpbGRyZW4gYW5kIG1h
cmsgdGhlbSBhcyBuZWVkZWQuCi0gICAgaWYgKCFjaGlsZHJlbklubGluZSgpKSB7CisgICAgaWYg
KGNoaWxkcmVuSW5saW5lKCkpIHsKKyAgICAgICAgZm9yIChSb290SW5saW5lQm94KiBib3ggPSBm
aXJzdFJvb3RCb3goKTsgYm94OyBib3ggPSBib3gtPm5leHRSb290Qm94KCkpIHsKKyAgICAgICAg
ICAgIFJlbmRlckJsb2NrKiBjaGlsZEJsb2NrID0gYm94LT5hbm9ueW1vdXNJbmxpbmVCbG9jaygp
OworICAgICAgICAgICAgaWYgKGNoaWxkQmxvY2sgJiYgKGZsb2F0VG9SZW1vdmUgPyBjaGlsZEJs
b2NrLT5jb250YWluc0Zsb2F0KGZsb2F0VG9SZW1vdmUpIDogY2hpbGRCbG9jay0+Y29udGFpbnNG
bG9hdHMoKSkpCisgICAgICAgICAgICAgICAgY2hpbGRCbG9jay0+bWFya0FsbERlc2NlbmRhbnRz
V2l0aEZsb2F0c0ZvckxheW91dChmbG9hdFRvUmVtb3ZlLCBpbkxheW91dCk7CisgICAgICAgIH0K
KyAgICB9IGVsc2UgewogICAgICAgICBmb3IgKFJlbmRlck9iamVjdCogY2hpbGQgPSBmaXJzdENo
aWxkKCk7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygpKSB7CiAgICAgICAgICAg
ICBpZiAoKCFmbG9hdFRvUmVtb3ZlICYmIGNoaWxkLT5pc0Zsb2F0aW5nT3JQb3NpdGlvbmVkKCkp
IHx8ICFjaGlsZC0+aXNSZW5kZXJCbG9jaygpKQogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpA
QCAtMzQ1MSw2ICszNDA4LDExIEBAIHN0YXRpYyBWaXNpYmxlUG9zaXRpb24gcG9zaXRpb25Gb3JQ
b2ludFIKICAgICByZXR1cm4gYW5jZXN0b3ItPmNyZWF0ZVZpc2libGVQb3NpdGlvbihjaGlsZE5v
ZGUtPm5vZGVJbmRleCgpICsgMSwgVVBTVFJFQU0pOwogfQogCitzdGF0aWMgaW5saW5lIGJvb2wg
aXNDaGlsZEhpdFRlc3RDYW5kaWRhdGUoUmVuZGVyQm94KiBib3gpCit7CisgICAgcmV0dXJuIGJv
eC0+aGVpZ2h0KCkgJiYgYm94LT5zdHlsZSgpLT52aXNpYmlsaXR5KCkgPT0gVklTSUJMRSAmJiAh
Ym94LT5pc0Zsb2F0aW5nT3JQb3NpdGlvbmVkKCk7Cit9CisKIFZpc2libGVQb3NpdGlvbiBSZW5k
ZXJCbG9jazo6cG9zaXRpb25Gb3JQb2ludFdpdGhJbmxpbmVDaGlsZHJlbihjb25zdCBJbnRQb2lu
dCYgcG9pbnRJbkNvbnRlbnRzKQogewogICAgIEFTU0VSVChjaGlsZHJlbklubGluZSgpKTsKQEAg
LTM0NjMsOCArMzQyNSwxOCBAQCBWaXNpYmxlUG9zaXRpb24gUmVuZGVyQmxvY2s6OnBvc2l0aW9u
Rm9yCiAgICAgUm9vdElubGluZUJveCogZmlyc3RSb290Qm94V2l0aENoaWxkcmVuID0gMDsKICAg
ICBSb290SW5saW5lQm94KiBsYXN0Um9vdEJveFdpdGhDaGlsZHJlbiA9IDA7CiAgICAgZm9yIChS
b290SW5saW5lQm94KiByb290ID0gZmlyc3RSb290Qm94KCk7IHJvb3Q7IHJvb3QgPSByb290LT5u
ZXh0Um9vdEJveCgpKSB7CisgICAgICAgIFJlbmRlckJsb2NrKiBjaGlsZEJsb2NrID0gcm9vdC0+
YW5vbnltb3VzSW5saW5lQmxvY2soKTsKKyAgICAgICAgaWYgKGNoaWxkQmxvY2spIHsKKyAgICAg
ICAgICAgIGZpcnN0Um9vdEJveFdpdGhDaGlsZHJlbiA9IDA7CisgICAgICAgICAgICBsYXN0Um9v
dEJveFdpdGhDaGlsZHJlbiA9IDA7CisgICAgICAgICAgICBpZiAoaXNDaGlsZEhpdFRlc3RDYW5k
aWRhdGUoY2hpbGRCbG9jaykgJiYgcG9pbnRJbkNvbnRlbnRzLnkoKSA8IGNoaWxkQmxvY2stPmZy
YW1lUmVjdCgpLmJvdHRvbSgpKQorICAgICAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbkZvclBv
aW50UmVzcGVjdGluZ0VkaXRpbmdCb3VuZGFyaWVzKHRoaXMsIGNoaWxkQmxvY2ssIHBvaW50SW5D
b250ZW50cyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCiAgICAgICAgIGlm
ICghcm9vdC0+Zmlyc3RMZWFmQ2hpbGQoKSkKICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAg
ICAKICAgICAgICAgaWYgKCFmaXJzdFJvb3RCb3hXaXRoQ2hpbGRyZW4pCiAgICAgICAgICAgICBm
aXJzdFJvb3RCb3hXaXRoQ2hpbGRyZW4gPSByb290OwogICAgICAgICBsYXN0Um9vdEJveFdpdGhD
aGlsZHJlbiA9IHJvb3Q7CkBAIC0zNDcyLDcgKzM0NDQsNyBAQCBWaXNpYmxlUG9zaXRpb24gUmVu
ZGVyQmxvY2s6OnBvc2l0aW9uRm9yCiAgICAgICAgIC8vIHNldCB0aGUgYm90dG9tIGJhc2VkIG9u
IHdoZXRoZXIgdGhlcmUgaXMgYSBuZXh0IHJvb3QgYm94CiAgICAgICAgIC8vIEZJWE1FOiBUaGlz
IHdpbGwgY29uc2lkZXIgbmV4dFJvb3RCb3ggZXZlbiBpZiBpdCBoYXMgbm8gY2hpbGRyZW4sIGFu
ZCBtYXliZSBpdCBzaG91bGRuJ3QuCiAgICAgICAgIGludCBib3R0b207Ci0gICAgICAgIGlmIChy
b290LT5uZXh0Um9vdEJveCgpKSB7CisgICAgICAgIGlmIChyb290LT5uZXh0Um9vdEJveCgpICYm
ICFyb290LT5uZXh0Um9vdEJveCgpLT5oYXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CiAgICAg
ICAgICAgICAvLyBGSVhNRTogV2Ugd291bGQgcHJlZmVyIHRvIG1ha2UgdGhlIGJyZWFrIHBvaW50
IGhhbGZ3YXkgYmV0d2VlbiB0aGUgYm90dG9tCiAgICAgICAgICAgICAvLyBvZiB0aGUgcHJldmlv
dXMgcm9vdCBib3ggYW5kIHRoZSB0b3Agb2YgdGhlIG5leHQgcm9vdCBib3guCiAgICAgICAgICAg
ICBib3R0b20gPSByb290LT5uZXh0Um9vdEJveCgpLT5saW5lVG9wKCk7CkBAIC0zNTE3LDE3ICsz
NDg5LDEyIEBAIFZpc2libGVQb3NpdGlvbiBSZW5kZXJCbG9jazo6cG9zaXRpb25Gb3IKICAgICBy
ZXR1cm4gY3JlYXRlVmlzaWJsZVBvc2l0aW9uKDAsIERPV05TVFJFQU0pOwogfQogCi1zdGF0aWMg
aW5saW5lIGJvb2wgaXNDaGlsZEhpdFRlc3RDYW5kaWRhdGUoUmVuZGVyQm94KiBib3gpCi17Ci0g
ICAgcmV0dXJuIGJveC0+aGVpZ2h0KCkgJiYgYm94LT5zdHlsZSgpLT52aXNpYmlsaXR5KCkgPT0g
VklTSUJMRSAmJiAhYm94LT5pc0Zsb2F0aW5nT3JQb3NpdGlvbmVkKCk7Ci19Ci0KIFZpc2libGVQ
b3NpdGlvbiBSZW5kZXJCbG9jazo6cG9zaXRpb25Gb3JQb2ludChjb25zdCBJbnRQb2ludCYgcG9p
bnQpCiB7CiAgICAgaWYgKGlzVGFibGUoKSkKICAgICAgICAgcmV0dXJuIFJlbmRlckJveDo6cG9z
aXRpb25Gb3JQb2ludChwb2ludCk7CiAKLSAgICBpZiAoaXNSZXBsYWNlZCgpKSB7CisgICAgaWYg
KGlzUmVwbGFjZWQoKSAmJiAhaXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CiAgICAgICAgIGlm
IChwb2ludC55KCkgPCAwIHx8IChwb2ludC55KCkgPCBoZWlnaHQoKSAmJiBwb2ludC54KCkgPCAw
KSkKICAgICAgICAgICAgIHJldHVybiBjcmVhdGVWaXNpYmxlUG9zaXRpb24oY2FyZXRNaW5PZmZz
ZXQoKSwgRE9XTlNUUkVBTSk7CiAgICAgICAgIGlmIChwb2ludC55KCkgPj0gaGVpZ2h0KCkgfHwg
KHBvaW50LnkoKSA+PSAwICYmIHBvaW50LngoKSA+PSB3aWR0aCgpKSkKQEAgLTQxNDIsMTQgKzQx
MDksMTUgQEAgdm9pZCBSZW5kZXJCbG9jazo6Y2FsY0lubGluZVByZWZXaWR0aHMoKQogICAgICAg
ICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICBjbGVhclByZXZpb3VzRmxvYXQg
PSBmYWxzZTsKIAotICAgICAgICAgICAgICAgIGJvb2wgY2FuQnJlYWtSZXBsYWNlZEVsZW1lbnQg
PSAhY2hpbGQtPmlzSW1hZ2UoKSB8fCBhbGxvd0ltYWdlc1RvQnJlYWs7CisgICAgICAgICAgICAg
ICAgYm9vbCBjYW5CcmVha1JlcGxhY2VkRWxlbWVudCA9ICFjaGlsZC0+aXNJbWFnZSgpIHx8IGFs
bG93SW1hZ2VzVG9CcmVhayB8fCBjaGlsZC0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpOwogICAg
ICAgICAgICAgICAgIGlmICgoY2FuQnJlYWtSZXBsYWNlZEVsZW1lbnQgJiYgKGF1dG9XcmFwIHx8
IG9sZEF1dG9XcmFwKSkgfHwgY2xlYXJQcmV2aW91c0Zsb2F0KSB7CiAgICAgICAgICAgICAgICAg
ICAgIG1fbWluUHJlZldpZHRoID0gbWF4KGlubGluZU1pbiwgbV9taW5QcmVmV2lkdGgpOwogICAg
ICAgICAgICAgICAgICAgICBpbmxpbmVNaW4gPSAwOwogICAgICAgICAgICAgICAgIH0KIAogICAg
ICAgICAgICAgICAgIC8vIElmIHdlJ3JlIHN1cHBvc2VkIHRvIGNsZWFyIHRoZSBwcmV2aW91cyBm
bG9hdCwgdGhlbiB0ZXJtaW5hdGUgbWF4d2lkdGggYXMgd2VsbC4KLSAgICAgICAgICAgICAgICBp
ZiAoY2xlYXJQcmV2aW91c0Zsb2F0KSB7CisgICAgICAgICAgICAgICAgLy8gQWxzbyBkbyB0aGlz
IGZvciBhbm9ueW1vdXMgaW5saW5lIGJsb2Nrcy4KKyAgICAgICAgICAgICAgICBpZiAoY2xlYXJQ
cmV2aW91c0Zsb2F0IHx8IGNoaWxkLT5pc0Fub255bW91c0lubGluZUJsb2NrKCkpIHsKICAgICAg
ICAgICAgICAgICAgICAgbV9tYXhQcmVmV2lkdGggPSBtYXgoaW5saW5lTWF4LCBtX21heFByZWZX
aWR0aCk7CiAgICAgICAgICAgICAgICAgICAgIGlubGluZU1heCA9IDA7CiAgICAgICAgICAgICAg
ICAgfQpAQCAtNDE1OCwxNSArNDEyNiwxNyBAQCB2b2lkIFJlbmRlckJsb2NrOjpjYWxjSW5saW5l
UHJlZldpZHRocygpCiAgICAgICAgICAgICAgICAgaW50IHRpID0gMDsKICAgICAgICAgICAgICAg
ICBpZiAoIWFkZGVkVGV4dEluZGVudCkgewogICAgICAgICAgICAgICAgICAgICBhZGRlZFRleHRJ
bmRlbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB0aSA9IHN0eWxlKCktPnRleHRJbmRl
bnQoKS5jYWxjTWluVmFsdWUoY3cpOwotICAgICAgICAgICAgICAgICAgICBjaGlsZE1pbis9dGk7
Ci0gICAgICAgICAgICAgICAgICAgIGNoaWxkTWF4Kz10aTsKKyAgICAgICAgICAgICAgICAgICAg
aWYgKCFjaGlsZC0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CisgICAgICAgICAgICAgICAg
ICAgICAgICB0aSA9IHN0eWxlKCktPnRleHRJbmRlbnQoKS5jYWxjTWluVmFsdWUoY3cpOworICAg
ICAgICAgICAgICAgICAgICAgICAgY2hpbGRNaW4gKz0gdGk7CisgICAgICAgICAgICAgICAgICAg
ICAgICBjaGlsZE1heCArPSB0aTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAg
ICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIEFkZCBvdXIgd2lkdGggdG8gdGhlIG1heC4KICAg
ICAgICAgICAgICAgICBpbmxpbmVNYXggKz0gY2hpbGRNYXg7CiAKLSAgICAgICAgICAgICAgICBp
ZiAoIWF1dG9XcmFwIHx8ICFjYW5CcmVha1JlcGxhY2VkRWxlbWVudCkgeworICAgICAgICAgICAg
ICAgIGlmICgoIWF1dG9XcmFwIHx8ICFjYW5CcmVha1JlcGxhY2VkRWxlbWVudCkgJiYgIWNoaWxk
LT5pc0Fub255bW91c0lubGluZUJsb2NrKCkpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNo
aWxkLT5pc0Zsb2F0aW5nKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICBtX21pblByZWZXaWR0
aCA9IG1heChjaGlsZE1pbiwgbV9taW5QcmVmV2lkdGgpOwogICAgICAgICAgICAgICAgICAgICBl
bHNlCkBAIC00MTc3LDYgKzQxNDcsMTIgQEAgdm9pZCBSZW5kZXJCbG9jazo6Y2FsY0lubGluZVBy
ZWZXaWR0aHMoKQogCiAgICAgICAgICAgICAgICAgICAgIC8vIE5vdyBzdGFydCBhIG5ldyBsaW5l
LgogICAgICAgICAgICAgICAgICAgICBpbmxpbmVNaW4gPSAwOworICAgICAgICAgICAgICAgICAg
ICAKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLT5pc0Fub255bW91c0lubGluZUJsb2Nr
KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRlcm1pbmF0ZSBtYXggd2lkdGggYXMg
d2VsbC4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fbWF4UHJlZldpZHRoID0gbWF4KGNoaWxk
TWF4LCBtX21heFByZWZXaWR0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmVNYXgg
PSAwOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAg
ICAgICAgICAgLy8gV2UgYXJlIG5vIGxvbmdlciBzdHJpcHBpbmcgd2hpdGVzcGFjZSBhdCB0aGUg
c3RhcnQgb2YKQEAgLTQ0MTcsOSArNDM5MywxMiBAQCBpbnQgUmVuZGVyQmxvY2s6OmxpbmVIZWln
aHQoYm9vbCBmaXJzdExpCiAgICAgLy8gdGhlIGJhc2UgY2xhc3MuICBJZiB3ZSdyZSBiZWluZyBx
dWVyaWVkIGFzIHRob3VnaCB3ZSdyZSB0aGUgcm9vdCBsaW5lCiAgICAgLy8gYm94LCB0aGVuIHRo
ZSBmYWN0IHRoYXQgd2UncmUgYW4gaW5saW5lLWJsb2NrIGlzIGlycmVsZXZhbnQsIGFuZCB3ZSBi
ZWhhdmUKICAgICAvLyBqdXN0IGxpa2UgYSBibG9jay4KLSAgICBpZiAoaXNSZXBsYWNlZCgpICYm
ICFpc1Jvb3RMaW5lQm94KQorICAgIGlmIChpc1JlcGxhY2VkKCkgJiYgIWlzUm9vdExpbmVCb3gp
IHsKKyAgICAgICAgaWYgKGlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkKKyAgICAgICAgICAgIHJl
dHVybiBoZWlnaHQoKTsKICAgICAgICAgcmV0dXJuIGhlaWdodCgpICsgbWFyZ2luVG9wKCkgKyBt
YXJnaW5Cb3R0b20oKTsKLSAgICAKKyAgICB9CisKICAgICBpZiAoZmlyc3RMaW5lICYmIGRvY3Vt
ZW50KCktPnVzZXNGaXJzdExpbmVSdWxlcygpKSB7CiAgICAgICAgIFJlbmRlclN0eWxlKiBzID0g
c3R5bGUoZmlyc3RMaW5lKTsKICAgICAgICAgaWYgKHMgIT0gc3R5bGUoKSkKQEAgLTQ0NTEsNiAr
NDQzMCw4IEBAIGludCBSZW5kZXJCbG9jazo6YmFzZWxpbmVQb3NpdGlvbihib29sIGIKICAgICAg
ICAgLy8gV2UgYWxzbyBnaXZlIHVwIG9uIGZpbmRpbmcgYSBiYXNlbGluZSBpZiB3ZSBoYXZlIGEg
dmVydGljYWwgc2Nyb2xsYmFyLCBvciBpZiB3ZSBhcmUgc2Nyb2xsZWQKICAgICAgICAgLy8gdmVy
dGljYWxseSAoZS5nLiwgYW4gb3ZlcmZsb3c6aGlkZGVuIGJsb2NrIHRoYXQgaGFzIGhhZCBzY3Jv
bGxUb3AgbW92ZWQpIG9yIGlmIHRoZSBiYXNlbGluZSBpcyBvdXRzaWRlCiAgICAgICAgIC8vIG9m
IG91ciBjb250ZW50IGJveC4KKyAgICAgICAgaWYgKGlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkK
KyAgICAgICAgICAgIHJldHVybiBoZWlnaHQoKTsKICAgICAgICAgaW50IGJhc2VsaW5lUG9zID0g
KGxheWVyKCkgJiYgKGxheWVyKCktPm1hcnF1ZWUoKSB8fCBsYXllcigpLT52ZXJ0aWNhbFNjcm9s
bGJhcigpIHx8IGxheWVyKCktPnNjcm9sbFlPZmZzZXQoKSAhPSAwKSkgPyAtMSA6IGxhc3RMaW5l
Qm94QmFzZWxpbmUoKTsKICAgICAgICAgaWYgKGJhc2VsaW5lUG9zICE9IC0xICYmIGJhc2VsaW5l
UG9zIDw9IGJvcmRlclRvcCgpICsgcGFkZGluZ1RvcCgpICsgY29udGVudEhlaWdodCgpKQogICAg
ICAgICAgICAgcmV0dXJuIG1hcmdpblRvcCgpICsgYmFzZWxpbmVQb3M7CkBAIC00ODc1LDYwICs0
ODU2LDYgQEAgdm9pZCBSZW5kZXJCbG9jazo6c2V0TWF4Qm90dG9tTWFyZ2lucyhpbgogICAgIG1f
bWF4TWFyZ2luLT5tX2JvdHRvbU5lZyA9IG5lZzsKIH0KIAotdm9pZCBSZW5kZXJCbG9jazo6YWJz
b2x1dGVSZWN0cyhWZWN0b3I8SW50UmVjdD4mIHJlY3RzLCBpbnQgdHgsIGludCB0eSkKLXsKLSAg
ICAvLyBGb3IgYmxvY2tzIGluc2lkZSBpbmxpbmVzLCB3ZSBnbyBhaGVhZCBhbmQgaW5jbHVkZSBt
YXJnaW5zIHNvIHRoYXQgd2UgcnVuIHJpZ2h0IHVwIHRvIHRoZQotICAgIC8vIGlubGluZSBib3hl
cyBhYm92ZSBhbmQgYmVsb3cgdXMgKHRodXMgZ2V0dGluZyBtZXJnZWQgd2l0aCB0aGVtIHRvIGZv
cm0gYSBzaW5nbGUgaXJyZWd1bGFyCi0gICAgLy8gc2hhcGUpLgotICAgIGlmIChpbmxpbmVDb250
aW51YXRpb24oKSkgewotICAgICAgICByZWN0cy5hcHBlbmQoSW50UmVjdCh0eCwgdHkgLSBjb2xs
YXBzZWRNYXJnaW5Ub3AoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgoKSwg
aGVpZ2h0KCkgKyBjb2xsYXBzZWRNYXJnaW5Ub3AoKSArIGNvbGxhcHNlZE1hcmdpbkJvdHRvbSgp
KSk7Ci0gICAgICAgIGlubGluZUNvbnRpbnVhdGlvbigpLT5hYnNvbHV0ZVJlY3RzKHJlY3RzLAot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eCAtIHgoKSArIGlu
bGluZUNvbnRpbnVhdGlvbigpLT5jb250YWluaW5nQmxvY2soKS0+eCgpLAotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eSAtIHkoKSArIGlubGluZUNvbnRpbnVh
dGlvbigpLT5jb250YWluaW5nQmxvY2soKS0+eSgpKTsKLSAgICB9IGVsc2UKLSAgICAgICAgcmVj
dHMuYXBwZW5kKEludFJlY3QodHgsIHR5LCB3aWR0aCgpLCBoZWlnaHQoKSkpOwotfQotCi12b2lk
IFJlbmRlckJsb2NrOjphYnNvbHV0ZVF1YWRzKFZlY3RvcjxGbG9hdFF1YWQ+JiBxdWFkcykKLXsK
LSAgICAvLyBGb3IgYmxvY2tzIGluc2lkZSBpbmxpbmVzLCB3ZSBnbyBhaGVhZCBhbmQgaW5jbHVk
ZSBtYXJnaW5zIHNvIHRoYXQgd2UgcnVuIHJpZ2h0IHVwIHRvIHRoZQotICAgIC8vIGlubGluZSBi
b3hlcyBhYm92ZSBhbmQgYmVsb3cgdXMgKHRodXMgZ2V0dGluZyBtZXJnZWQgd2l0aCB0aGVtIHRv
IGZvcm0gYSBzaW5nbGUgaXJyZWd1bGFyCi0gICAgLy8gc2hhcGUpLgotICAgIGlmIChpbmxpbmVD
b250aW51YXRpb24oKSkgewotICAgICAgICBGbG9hdFJlY3QgbG9jYWxSZWN0KDAsIC1jb2xsYXBz
ZWRNYXJnaW5Ub3AoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCgpLCBoZWln
aHQoKSArIGNvbGxhcHNlZE1hcmdpblRvcCgpICsgY29sbGFwc2VkTWFyZ2luQm90dG9tKCkpOwot
ICAgICAgICBxdWFkcy5hcHBlbmQobG9jYWxUb0Fic29sdXRlUXVhZChsb2NhbFJlY3QpKTsKLSAg
ICAgICAgaW5saW5lQ29udGludWF0aW9uKCktPmFic29sdXRlUXVhZHMocXVhZHMpOwotICAgIH0g
ZWxzZQotICAgICAgICBxdWFkcy5hcHBlbmQoUmVuZGVyQm94Ojpsb2NhbFRvQWJzb2x1dGVRdWFk
KEZsb2F0UmVjdCgwLCAwLCB3aWR0aCgpLCBoZWlnaHQoKSkpKTsKLX0KLQotSW50UmVjdCBSZW5k
ZXJCbG9jazo6cmVjdFdpdGhPdXRsaW5lRm9yUmVwYWludChSZW5kZXJCb3hNb2RlbE9iamVjdCog
cmVwYWludENvbnRhaW5lciwgaW50IG91dGxpbmVXaWR0aCkKLXsKLSAgICBJbnRSZWN0IHIoUmVu
ZGVyQm94OjpyZWN0V2l0aE91dGxpbmVGb3JSZXBhaW50KHJlcGFpbnRDb250YWluZXIsIG91dGxp
bmVXaWR0aCkpOwotICAgIGlmIChpbmxpbmVDb250aW51YXRpb24oKSkKLSAgICAgICAgci5pbmZs
YXRlWShjb2xsYXBzZWRNYXJnaW5Ub3AoKSk7Ci0gICAgcmV0dXJuIHI7Ci19Ci0KLVJlbmRlck9i
amVjdCogUmVuZGVyQmxvY2s6OmhvdmVyQW5jZXN0b3IoKSBjb25zdAotewotICAgIHJldHVybiBp
bmxpbmVDb250aW51YXRpb24oKSA/IGlubGluZUNvbnRpbnVhdGlvbigpIDogUmVuZGVyQm94Ojpo
b3ZlckFuY2VzdG9yKCk7Ci19Ci0KLXZvaWQgUmVuZGVyQmxvY2s6OnVwZGF0ZURyYWdTdGF0ZShi
b29sIGRyYWdPbikKLXsKLSAgICBSZW5kZXJCb3g6OnVwZGF0ZURyYWdTdGF0ZShkcmFnT24pOwot
ICAgIGlmIChpbmxpbmVDb250aW51YXRpb24oKSkKLSAgICAgICAgaW5saW5lQ29udGludWF0aW9u
KCktPnVwZGF0ZURyYWdTdGF0ZShkcmFnT24pOwotfQotCi1SZW5kZXJTdHlsZSogUmVuZGVyQmxv
Y2s6Om91dGxpbmVTdHlsZUZvclJlcGFpbnQoKSBjb25zdAotewotICAgIHJldHVybiBpbmxpbmVD
b250aW51YXRpb24oKSA/IGlubGluZUNvbnRpbnVhdGlvbigpLT5zdHlsZSgpIDogc3R5bGUoKTsK
LX0KLQogdm9pZCBSZW5kZXJCbG9jazo6Y2hpbGRCZWNhbWVOb25JbmxpbmUoUmVuZGVyT2JqZWN0
KikKIHsKICAgICBtYWtlQ2hpbGRyZW5Ob25JbmxpbmUoKTsKQEAgLTQ5MzcsMjYgKzQ4NjQsNiBA
QCB2b2lkIFJlbmRlckJsb2NrOjpjaGlsZEJlY2FtZU5vbklubGluZShSCiAgICAgLy8gfHRoaXN8
IG1heSBiZSBkZWFkIGhlcmUKIH0KIAotdm9pZCBSZW5kZXJCbG9jazo6dXBkYXRlSGl0VGVzdFJl
c3VsdChIaXRUZXN0UmVzdWx0JiByZXN1bHQsIGNvbnN0IEludFBvaW50JiBwb2ludCkKLXsKLSAg
ICBpZiAocmVzdWx0LmlubmVyTm9kZSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBOb2RlKiBu
ID0gbm9kZSgpOwotICAgIGlmIChpbmxpbmVDb250aW51YXRpb24oKSkKLSAgICAgICAgLy8gV2Ug
YXJlIGluIHRoZSBtYXJnaW5zIG9mIGJsb2NrIGVsZW1lbnRzIHRoYXQgYXJlIHBhcnQgb2YgYSBj
b250aW51YXRpb24uICBJbgotICAgICAgICAvLyB0aGlzIGNhc2Ugd2UncmUgYWN0dWFsbHkgc3Rp
bGwgaW5zaWRlIHRoZSBlbmNsb3NpbmcgaW5saW5lIGVsZW1lbnQgdGhhdCB3YXMKLSAgICAgICAg
Ly8gc3BsaXQuICBHbyBhaGVhZCBhbmQgc2V0IG91ciBpbm5lciBub2RlIGFjY29yZGluZ2x5Lgot
ICAgICAgICBuID0gaW5saW5lQ29udGludWF0aW9uKCktPm5vZGUoKTsKLQotICAgIGlmIChuKSB7
Ci0gICAgICAgIHJlc3VsdC5zZXRJbm5lck5vZGUobik7Ci0gICAgICAgIGlmICghcmVzdWx0Lmlu
bmVyTm9uU2hhcmVkTm9kZSgpKQotICAgICAgICAgICAgcmVzdWx0LnNldElubmVyTm9uU2hhcmVk
Tm9kZShuKTsKLSAgICAgICAgcmVzdWx0LnNldExvY2FsUG9pbnQocG9pbnQpOwotICAgIH0KLX0K
LQogSW50UmVjdCBSZW5kZXJCbG9jazo6bG9jYWxDYXJldFJlY3QoSW5saW5lQm94KiBpbmxpbmVC
b3gsIGludCBjYXJldE9mZnNldCwgaW50KiBleHRyYVdpZHRoVG9FbmRPZkxpbmUpCiB7CiAgICAg
Ly8gRG8gdGhlIG5vcm1hbCBjYWxjdWxhdGlvbiBpbiBtb3N0IGNhc2VzLgpAQCAtNTAzNywyMSAr
NDk0NCwxNyBAQCBJbnRSZWN0IFJlbmRlckJsb2NrOjpsb2NhbENhcmV0UmVjdChJbmxpCiAKIHZv
aWQgUmVuZGVyQmxvY2s6OmFkZEZvY3VzUmluZ1JlY3RzKFZlY3RvcjxJbnRSZWN0PiYgcmVjdHMs
IGludCB0eCwgaW50IHR5KQogewotICAgIC8vIEZvciBibG9ja3MgaW5zaWRlIGlubGluZXMsIHdl
IGdvIGFoZWFkIGFuZCBpbmNsdWRlIG1hcmdpbnMgc28gdGhhdCB3ZSBydW4gcmlnaHQgdXAgdG8g
dGhlCi0gICAgLy8gaW5saW5lIGJveGVzIGFib3ZlIGFuZCBiZWxvdyB1cyAodGh1cyBnZXR0aW5n
IG1lcmdlZCB3aXRoIHRoZW0gdG8gZm9ybSBhIHNpbmdsZSBpcnJlZ3VsYXIKLSAgICAvLyBzaGFw
ZSkuCi0gICAgaWYgKGlubGluZUNvbnRpbnVhdGlvbigpKSB7Ci0gICAgICAgIC8vIEZJWE1FOiBU
aGlzIGNoZWNrIHJlYWxseSBpc24ndCBhY2N1cmF0ZS4gCi0gICAgICAgIGJvb2wgbmV4dElubGlu
ZUhhc0xpbmVCb3ggPSBpbmxpbmVDb250aW51YXRpb24oKS0+Zmlyc3RMaW5lQm94KCk7Ci0gICAg
ICAgIC8vIEZJWE1FOiBUaGlzIGlzIHdyb25nLiBUaGUgcHJpbmNpcGFsIHJlbmRlcmVyIG1heSBu
b3QgYmUgdGhlIGNvbnRpbnVhdGlvbiBwcmVjZWRpbmcgdGhpcyBibG9jay4KLSAgICAgICAgYm9v
bCBwcmV2SW5saW5lSGFzTGluZUJveCA9IHRvUmVuZGVySW5saW5lKGlubGluZUNvbnRpbnVhdGlv
bigpLT5ub2RlKCktPnJlbmRlcmVyKCkpLT5maXJzdExpbmVCb3goKTsgCi0gICAgICAgIGludCB0
b3BNYXJnaW4gPSBwcmV2SW5saW5lSGFzTGluZUJveCA/IGNvbGxhcHNlZE1hcmdpblRvcCgpIDog
MDsKLSAgICAgICAgaW50IGJvdHRvbU1hcmdpbiA9IG5leHRJbmxpbmVIYXNMaW5lQm94ID8gY29s
bGFwc2VkTWFyZ2luQm90dG9tKCkgOiAwOwotICAgICAgICBJbnRSZWN0IHJlY3QodHgsIHR5IC0g
dG9wTWFyZ2luLCB3aWR0aCgpLCBoZWlnaHQoKSArIHRvcE1hcmdpbiArIGJvdHRvbU1hcmdpbik7
Ci0gICAgICAgIGlmICghcmVjdC5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZWN0cy5hcHBlbmQo
cmVjdCk7Ci0gICAgfSBlbHNlIGlmICh3aWR0aCgpICYmIGhlaWdodCgpKQotICAgICAgICByZWN0
cy5hcHBlbmQoSW50UmVjdCh0eCwgdHksIHdpZHRoKCksIGhlaWdodCgpKSk7CisgICAgaW50IHRv
cCA9IHR5OworICAgIGludCBib3R0b20gPSB0b3AgKyBoZWlnaHQoKTsKKyAgICBpZiAoaXNBbm9u
eW1vdXNJbmxpbmVCbG9jaygpICYmIGhlaWdodCgpKSB7CisgICAgICAgIGlmIChtX2lubGluZUJv
eFdyYXBwZXIgJiYgbV9pbmxpbmVCb3hXcmFwcGVyLT5yb290KCktPnByZXZSb290Qm94KCkpCisg
ICAgICAgICAgICB0b3AgPSBtaW4odG9wLCB0b3AgLSBjb2xsYXBzZWRNYXJnaW5Ub3AoKSk7Cisg
ICAgICAgIGlmIChtX2lubGluZUJveFdyYXBwZXIgJiYgbV9pbmxpbmVCb3hXcmFwcGVyLT5yb290
KCktPm5leHRSb290Qm94KCkpCisgICAgICAgICAgICBib3R0b20gPSBtYXgoYm90dG9tLCBib3R0
b20gKyBjb2xsYXBzZWRNYXJnaW5Cb3R0b20oKSk7CisgICAgfQorICAgIEludFJlY3QgcmVzdWx0
KHR4LCB0b3AsIHdpZHRoKCksIGJvdHRvbSAtIHRvcCk7CisgICAgaWYgKCFyZXN1bHQuaXNFbXB0
eSgpKQorICAgICAgICByZWN0cy5hcHBlbmQocmVzdWx0KTsKIAogICAgIGlmICghaGFzT3ZlcmZs
b3dDbGlwKCkgJiYgIWhhc0NvbnRyb2xDbGlwKCkpIHsKICAgICAgICAgZm9yIChSb290SW5saW5l
Qm94KiBjdXJyID0gZmlyc3RSb290Qm94KCk7IGN1cnI7IGN1cnIgPSBjdXJyLT5uZXh0Um9vdEJv
eCgpKSB7CkBAIC01MDc1LDExICs0OTc4LDYgQEAgdm9pZCBSZW5kZXJCbG9jazo6YWRkRm9jdXNS
aW5nUmVjdHMoVmVjdAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotCi0gICAgaWYg
KGlubGluZUNvbnRpbnVhdGlvbigpKQotICAgICAgICBpbmxpbmVDb250aW51YXRpb24oKS0+YWRk
Rm9jdXNSaW5nUmVjdHMocmVjdHMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgdHggLSB4KCkgKyBpbmxpbmVDb250aW51YXRpb24oKS0+Y29udGFpbmlu
Z0Jsb2NrKCktPngoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHR5IC0geSgpICsgaW5saW5lQ29udGludWF0aW9uKCktPmNvbnRhaW5pbmdCbG9jaygp
LT55KCkpOwogfQogCiBSZW5kZXJCbG9jayogUmVuZGVyQmxvY2s6OmNyZWF0ZUFub255bW91c0Js
b2NrKGJvb2wgaXNGbGV4aWJsZUJveCkgY29uc3QKQEAgLTUxMTEsNiArNTAwOSw4IEBAIGNvbnN0
IGNoYXIqIFJlbmRlckJsb2NrOjpyZW5kZXJOYW1lKCkgY28KICAgICAgICAgcmV0dXJuICJSZW5k
ZXJCbG9jayAocG9zaXRpb25lZCkiOwogICAgIGlmIChpc0Fub255bW91c0Jsb2NrKCkpCiAgICAg
ICAgIHJldHVybiAiUmVuZGVyQmxvY2sgKGFub255bW91cykiOworICAgIGVsc2UgaWYgKGlzQW5v
bnltb3VzSW5saW5lQmxvY2soKSkKKyAgICAgICAgcmV0dXJuICJSZW5kZXJCbG9jayAoYW5vbnlt
b3VzIGlubGluZS1ibG9jaykiOwogICAgIGVsc2UgaWYgKGlzQW5vbnltb3VzKCkpCiAgICAgICAg
IHJldHVybiAiUmVuZGVyQmxvY2sgKGdlbmVyYXRlZCkiOwogICAgIGlmIChpc1JlbFBvc2l0aW9u
ZWQoKSkKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suaAkocmV2aXNpb24gNTQ1NjEpCisrKyBX
ZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5oCSh3b3JraW5nIGNvcHkpCkBAIC03OSw3ICs3
OSw3IEBAIHB1YmxpYzoKICAgICBzdGF0aWMgdm9pZCByZW1vdmVQZXJjZW50SGVpZ2h0RGVzY2Vu
ZGFudChSZW5kZXJCb3gqKTsKICAgICBIYXNoU2V0PFJlbmRlckJveCo+KiBwZXJjZW50SGVpZ2h0
RGVzY2VuZGFudHMoKSBjb25zdDsKIAotICAgIFJvb3RJbmxpbmVCb3gqIGNyZWF0ZUFuZEFwcGVu
ZFJvb3RJbmxpbmVCb3goKTsKKyAgICBSb290SW5saW5lQm94KiBjcmVhdGVBbmRBcHBlbmRSb290
SW5saW5lQm94KFJlbmRlckJsb2NrKiBhbm9ueW1vdXNJbmxpbmVCbG9jayk7CiAKICAgICBib29s
IGdlbmVyYXRlc0xpbmVCb3hlc0ZvcklubGluZUNoaWxkKFJlbmRlck9iamVjdCosIGJvb2wgaXNM
aW5lRW1wdHkgPSB0cnVlLCBib29sIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSA9IHRydWUpOwog
CkBAIC0xMjksMTUgKzEyOSwxOCBAQCBwdWJsaWM6CiAKICAgICB2b2lkIGFkanVzdFJlY3RGb3JD
b2x1bW5zKEludFJlY3QmKSBjb25zdDsKIAotICAgIHZvaWQgYWRkQ29udGludWF0aW9uV2l0aE91
dGxpbmUoUmVuZGVySW5saW5lKik7Ci0KLSAgICBSZW5kZXJJbmxpbmUqIGlubGluZUNvbnRpbnVh
dGlvbigpIGNvbnN0IHsgcmV0dXJuIG1faW5saW5lQ29udGludWF0aW9uOyB9Ci0gICAgdm9pZCBz
ZXRJbmxpbmVDb250aW51YXRpb24oUmVuZGVySW5saW5lKiBjKSB7IG1faW5saW5lQ29udGludWF0
aW9uID0gYzsgfQotCiAgICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBhIGNvbnZlbmllbmNlIGhlbHBl
ciBmb3IgY3JlYXRpbmcgYW4gYW5vbnltb3VzIGJsb2NrIHRoYXQgaW5oZXJpdHMgaXRzCiAgICAg
Ly8gc3R5bGUgZnJvbSB0aGlzIFJlbmRlckJsb2NrLgogICAgIFJlbmRlckJsb2NrKiBjcmVhdGVB
bm9ueW1vdXNCbG9jayhib29sIGlzRmxleGlibGVCb3ggPSBmYWxzZSkgY29uc3Q7CiAKKyAgICB2
aXJ0dWFsIHZvaWQgcGFpbnQoUGFpbnRJbmZvJiwgaW50IHR4LCBpbnQgdHkpOworICAgIHZpcnR1
YWwgdm9pZCBwYWludE9iamVjdChQYWludEluZm8mLCBpbnQgdHgsIGludCB0eSk7CisKKyAgICBi
b29sIGluUm9vdEJsb2NrQ29udGV4dCgpIGNvbnN0OworCisgICAgc3RhdGljIHZvaWQgYXBwZW5k
UnVuc0Zvck9iamVjdChpbnQgc3RhcnQsIGludCBlbmQsIFJlbmRlck9iamVjdCosIElubGluZUJp
ZGlSZXNvbHZlciYpOyAgICAKKyAgICBzdGF0aWMgYm9vbCByZXF1aXJlc0xpbmVCb3goY29uc3Qg
SW5saW5lSXRlcmF0b3ImLCBib29sIGlzTGluZUVtcHR5ID0gdHJ1ZSwgYm9vbCBwcmV2aW91c0xp
bmVCcm9rZUNsZWFubHkgPSB0cnVlKTsKKwogcHJvdGVjdGVkOgogICAgIHZvaWQgbW92ZUNoaWxk
VG8oUmVuZGVyT2JqZWN0KiB0bywgUmVuZGVyT2JqZWN0Q2hpbGRMaXN0KiB0b0NoaWxkTGlzdCwg
UmVuZGVyT2JqZWN0KiBjaGlsZCk7CiAgICAgdm9pZCBtb3ZlQ2hpbGRUbyhSZW5kZXJPYmplY3Qq
IHRvLCBSZW5kZXJPYmplY3RDaGlsZExpc3QqIHRvQ2hpbGRMaXN0LCBSZW5kZXJPYmplY3QqIGJl
Zm9yZUNoaWxkLCBSZW5kZXJPYmplY3QqIGNoaWxkKTsKQEAgLTE2NSw5ICsxNjgsNiBAQCBwcm90
ZWN0ZWQ6CiAKICAgICB2b2lkIGxheW91dFBvc2l0aW9uZWRPYmplY3RzKGJvb2wgcmVsYXlvdXRD
aGlsZHJlbik7CiAKLSAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoUGFpbnRJbmZvJiwgaW50IHR4LCBp
bnQgdHkpOwotICAgIHZpcnR1YWwgdm9pZCBwYWludE9iamVjdChQYWludEluZm8mLCBpbnQgdHgs
IGludCB0eSk7Ci0KICAgICBpbnQgcmlnaHRSZWxPZmZzZXQoaW50IHksIGludCBmaXhlZE9mZnNl
dCwgYm9vbCBhcHBseVRleHRJbmRlbnQgPSB0cnVlLCBpbnQqIGhlaWdodFJlbWFpbmluZyA9IDAp
IGNvbnN0OwogICAgIGludCBsZWZ0UmVsT2Zmc2V0KGludCB5LCBpbnQgZml4ZWRPZmZzZXQsIGJv
b2wgYXBwbHlUZXh0SW5kZW50ID0gdHJ1ZSwgaW50KiBoZWlnaHRSZW1haW5pbmcgPSAwKSBjb25z
dDsKIApAQCAtMTgwLDggKzE4MCw2IEBAIHByb3RlY3RlZDoKIAogICAgIHZpcnR1YWwgdm9pZCB1
cGRhdGVGaXJzdExldHRlcigpOwogCi0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZUhpdFRlc3RSZXN1
bHQoSGl0VGVzdFJlc3VsdCYsIGNvbnN0IEludFBvaW50Jik7Ci0KICAgICAvLyBEZWxheSB1cGRh
dGUgc2Nyb2xsYmFyIHVudGlsIGZpbmlzaERlbGF5UmVwYWludCgpIHdpbGwgYmUKICAgICAvLyBj
YWxsZWQuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB3aGVuIGEgZmxleGJveCBpcyBsYXlpbmcgb3V0
IGl0cwogICAgIC8vIGRlc2NlbmRhbnQuIElmIG11bHRpcGxlIGNhbGxzIGFyZSBtYWRlIHRvIHN0
YXJ0RGVsYXlSZXBhaW50KCksCkBAIC0yNDUsNyArMjQzLDkgQEAgcHJpdmF0ZToKICAgICAgICAg
Ym9vbCBldmVySGFkTGF5b3V0OwogICAgIH07CiAKLSAgICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0
aW9ucycgaW1wbGVtZW50YXRpb25zIGFyZSBpbiBSZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwLgor
ICAgIGNsYXNzIE1hcmdpbkluZm87CisKKyAgICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucycg
aW1wbGVtZW50YXRpb25zIGFyZSBpbiBSZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwLiAgICAKICAg
ICB2b2lkIGJpZGlSZW9yZGVyTGluZShJbmxpbmVCaWRpUmVzb2x2ZXImLCBjb25zdCBJbmxpbmVJ
dGVyYXRvciYgZW5kLCBib29sIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSk7CiAgICAgUm9vdElu
bGluZUJveCogZGV0ZXJtaW5lU3RhcnRQb3NpdGlvbihib29sJiBmaXJzdExpbmUsIGJvb2wmIGZ1
bGxMYXlvdXQsIGJvb2wmIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSwKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIElubGluZUJpZGlSZXNvbHZlciYsIFZlY3RvcjxG
bG9hdFdpdGhSZWN0PiYgZmxvYXRzLCB1bnNpZ25lZCYgbnVtQ2xlYW5GbG9hdHMpOwpAQCAtMjU4
LDkgKzI1OCw5IEBAIHByaXZhdGU6CiAgICAgdm9pZCBza2lwVHJhaWxpbmdXaGl0ZXNwYWNlKElu
bGluZUl0ZXJhdG9yJiwgYm9vbCBpc0xpbmVFbXB0eSwgYm9vbCBwcmV2aW91c0xpbmVCcm9rZUNs
ZWFubHkpOwogICAgIGludCBza2lwTGVhZGluZ1doaXRlc3BhY2UoSW5saW5lQmlkaVJlc29sdmVy
JiwgYm9vbCBmaXJzdExpbmUsIGJvb2wgaXNMaW5lRW1wdHksIGJvb2wgcHJldmlvdXNMaW5lQnJv
a2VDbGVhbmx5KTsKICAgICB2b2lkIGZpdEJlbG93RmxvYXRzKGludCB3aWR0aFRvRml0LCBib29s
IGZpcnN0TGluZSwgaW50JiBhdmFpbGFibGVXaWR0aCk7Ci0gICAgSW5saW5lSXRlcmF0b3IgZmlu
ZE5leHRMaW5lQnJlYWsoSW5saW5lQmlkaVJlc29sdmVyJiwgYm9vbCBmaXJzdExpbmUsIGJvb2wm
IGlzTGluZUVtcHR5LCBib29sJiBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHksIEVDbGVhciogY2xl
YXIgPSAwKTsKKyAgICBJbmxpbmVJdGVyYXRvciBmaW5kTmV4dExpbmVCcmVhayhJbmxpbmVCaWRp
UmVzb2x2ZXImLCBib29sIGZpcnN0TGluZSwgYm9vbCYgaXNMaW5lRW1wdHksIGJvb2wmIHByZXZp
b3VzTGluZUJyb2tlQ2xlYW5seSwgTWFyZ2luSW5mbyYsIEVDbGVhciogY2xlYXIgPSAwKTsKICAg
ICBSb290SW5saW5lQm94KiBjb25zdHJ1Y3RMaW5lKHVuc2lnbmVkIHJ1bkNvdW50LCBCaWRpUnVu
KiBmaXJzdFJ1biwgQmlkaVJ1biogbGFzdFJ1biwgYm9vbCBmaXJzdExpbmUsIGJvb2wgbGFzdExp
bmUsIFJlbmRlck9iamVjdCogZW5kT2JqZWN0KTsKLSAgICBJbmxpbmVGbG93Qm94KiBjcmVhdGVM
aW5lQm94ZXMoUmVuZGVyT2JqZWN0KiwgYm9vbCBmaXJzdExpbmUpOworICAgIElubGluZUZsb3dC
b3gqIGNyZWF0ZUxpbmVCb3hlcyhSZW5kZXJPYmplY3QqLCBib29sIGZpcnN0TGluZSwgUmVuZGVy
QmxvY2sqIGFub255bW91c0lubGluZUJsb2NrKTsKICAgICB2b2lkIGNvbXB1dGVIb3Jpem9udGFs
UG9zaXRpb25zRm9yTGluZShSb290SW5saW5lQm94KiwgYm9vbCBmaXJzdExpbmUsIEJpZGlSdW4q
IGZpcnN0UnVuLCBCaWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVuLCBib29sIHJlYWNoZWRFbmQpOwog
ICAgIHZvaWQgY29tcHV0ZVZlcnRpY2FsUG9zaXRpb25zRm9yTGluZShSb290SW5saW5lQm94Kiwg
QmlkaVJ1biopOwogICAgIHZvaWQgZGVsZXRlRWxsaXBzaXNMaW5lQm94ZXMoKTsKQEAgLTMxMywx
MyArMzEzLDcgQEAgcHJpdmF0ZToKICAgICAvLyBPYnRhaW5zIHRoZSBuZWFyZXN0IGVuY2xvc2lu
ZyBibG9jayAoaW5jbHVkaW5nIHRoaXMgYmxvY2spIHRoYXQgY29udHJpYnV0ZXMgYSBmaXJzdC1s
aW5lIHN0eWxlIHRvIG91ciBpbmxpbmUKICAgICAvLyBjaGlsZHJlbi4KICAgICB2aXJ0dWFsIFJl
bmRlckJsb2NrKiBmaXJzdExpbmVCbG9jaygpIGNvbnN0OwotICAgIGJvb2wgaW5Sb290QmxvY2tD
b250ZXh0KCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIEludFJlY3QgcmVjdFdpdGhPdXRsaW5lRm9y
UmVwYWludChSZW5kZXJCb3hNb2RlbE9iamVjdCogcmVwYWludENvbnRhaW5lciwgaW50IG91dGxp
bmVXaWR0aCk7Ci0gICAgdmlydHVhbCBSZW5kZXJTdHlsZSogb3V0bGluZVN0eWxlRm9yUmVwYWlu
dCgpIGNvbnN0OwogICAgIAotICAgIHZpcnR1YWwgUmVuZGVyT2JqZWN0KiBob3ZlckFuY2VzdG9y
KCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZURyYWdTdGF0ZShib29sIGRyYWdPbik7
CiAgICAgdmlydHVhbCB2b2lkIGNoaWxkQmVjYW1lTm9uSW5saW5lKFJlbmRlck9iamVjdCogY2hp
bGQpOwogCiAgICAgdmlydHVhbCBJbnRSZWN0IHNlbGVjdGlvblJlY3RGb3JSZXBhaW50KFJlbmRl
ckJveE1vZGVsT2JqZWN0KiByZXBhaW50Q29udGFpbmVyLCBib29sIC8qY2xpcFRvVmlzaWJsZUNv
bnRlbnQqLykKQEAgLTMzOSwxNiArMzMzLDExIEBAIHByaXZhdGU6CiAgICAgaW50IGxlZnRTZWxl
Y3Rpb25PZmZzZXQoUmVuZGVyQmxvY2sqIHJvb3RCbG9jaywgaW50IHkpOwogICAgIGludCByaWdo
dFNlbGVjdGlvbk9mZnNldChSZW5kZXJCbG9jayogcm9vdEJsb2NrLCBpbnQgeSk7CiAKLSAgICB2
aXJ0dWFsIHZvaWQgYWJzb2x1dGVSZWN0cyhWZWN0b3I8SW50UmVjdD4mLCBpbnQgdHgsIGludCB0
eSk7Ci0gICAgdmlydHVhbCB2b2lkIGFic29sdXRlUXVhZHMoVmVjdG9yPEZsb2F0UXVhZD4mKTsK
LQogICAgIGludCBkZXNpcmVkQ29sdW1uV2lkdGgoKSBjb25zdDsKICAgICB1bnNpZ25lZCBkZXNp
cmVkQ29sdW1uQ291bnQoKSBjb25zdDsKICAgICBWZWN0b3I8SW50UmVjdD4qIGNvbHVtblJlY3Rz
KCkgY29uc3Q7CiAgICAgdm9pZCBzZXREZXNpcmVkQ29sdW1uQ291bnRBbmRXaWR0aChpbnQgY291
bnQsIGludCB3aWR0aCk7CiAgICAgaW50IGNvbHVtbkdhcCgpIGNvbnN0OwotICAgIAotICAgIHZv
aWQgcGFpbnRDb250aW51YXRpb25PdXRsaW5lcyhQYWludEluZm8mLCBpbnQgdHgsIGludCB0eSk7
CiAKICAgICB2aXJ0dWFsIEludFJlY3QgbG9jYWxDYXJldFJlY3QoSW5saW5lQm94KiwgaW50IGNh
cmV0T2Zmc2V0LCBpbnQqIGV4dHJhV2lkdGhUb0VuZE9mTGluZSA9IDApOwogCkBAIC00ODQsMTIg
KzQ3Myw2IEBAIHByaXZhdGU6CiAgICAgRGVwcmVjYXRlZFB0ckxpc3Q8RmxvYXRpbmdPYmplY3Q+
KiBtX2Zsb2F0aW5nT2JqZWN0czsKICAgICBMaXN0SGFzaFNldDxSZW5kZXJCb3gqPiogbV9wb3Np
dGlvbmVkT2JqZWN0czsKIAotICAgIC8vIEFuIGlubGluZSBjYW4gYmUgc3BsaXQgd2l0aCBibG9j
a3Mgb2NjdXJyaW5nIGluIGJldHdlZW4gdGhlIGlubGluZSBjb250ZW50LgotICAgIC8vIFdoZW4g
dGhpcyBvY2N1cnMgd2UgbmVlZCBhIHBvaW50ZXIgdG8gb3VyIG5leHQgb2JqZWN0LiAgV2UgY2Fu
IGJhc2ljYWxseSBiZQotICAgIC8vIHNwbGl0IGludG8gYSBzZXF1ZW5jZSBvZiBpbmxpbmVzIGFu
ZCBibG9ja3MuICBUaGUgY29udGludWF0aW9uIHdpbGwgZWl0aGVyIGJlCi0gICAgLy8gYW4gYW5v
bnltb3VzIGJsb2NrICh0aGF0IGhvdXNlcyBvdGhlciBibG9ja3MpIG9yIGl0IHdpbGwgYmUgYW4g
aW5saW5lIGZsb3cuCi0gICAgUmVuZGVySW5saW5lKiBtX2lubGluZUNvbnRpbnVhdGlvbjsKLQog
ICAgIC8vIEFsbG9jYXRlZCBvbmx5IHdoZW4gc29tZSBvZiB0aGVzZSBmaWVsZHMgaGF2ZSBub24t
ZGVmYXVsdCB2YWx1ZXMKICAgICBzdHJ1Y3QgTWF4TWFyZ2luIDogTm9uY29weWFibGUgewogICAg
ICAgICBNYXhNYXJnaW4oY29uc3QgUmVuZGVyQmxvY2sqIG8pIApAQCAtNTE3LDEwICs1MDAsMTIg
QEAgcHJpdmF0ZToKICAgICBSZW5kZXJMaW5lQm94TGlzdCBtX2xpbmVCb3hlczsgICAvLyBBbGwg
b2YgdGhlIHJvb3QgbGluZSBib3hlcyBjcmVhdGVkIGZvciB0aGlzIGJsb2NrIGZsb3cuICBGb3Ig
ZXhhbXBsZSwgPGRpdj5IZWxsbzxicj53b3JsZC48L2Rpdj4gd2lsbCBoYXZlIHR3byB0b3RhbCBs
aW5lcyBmb3IgdGhlIDxkaXY+LgogCiAgICAgbXV0YWJsZSBpbnQgbV9saW5lSGVpZ2h0OwotICAg
IAorCiAgICAgLy8gUmVuZGVyUnVieUJhc2Ugb2JqZWN0cyBuZWVkIHRvIGJlIGFibGUgdG8gc3Bs
aXQgYW5kIG1lcmdlLCBtb3ZpbmcgdGhlaXIgY2hpbGRyZW4gYXJvdW5kCiAgICAgLy8gKGNhbGxp
bmcgbW92ZUNoaWxkVG8sIG1vdmVBbGxDaGlsZHJlblRvLCBhbmQgbWFrZUNoaWxkcmVuTm9uSW5s
aW5lKS4KICAgICBmcmllbmQgY2xhc3MgUmVuZGVyUnVieUJhc2U7CisgICAgCisgICAgZnJpZW5k
IGNsYXNzIElubGluZUJveDsKIH07CiAKIGlubGluZSBSZW5kZXJCbG9jayogdG9SZW5kZXJCbG9j
ayhSZW5kZXJPYmplY3QqIG9iamVjdCkKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJs
b2NrTGluZUxheW91dC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVy
QmxvY2tMaW5lTGF5b3V0LmNwcAkocmV2aXNpb24gNTQ1NjEpCisrKyBXZWJDb3JlL3JlbmRlcmlu
Zy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNCw2ICsyNCw3
IEBACiAKICNpbmNsdWRlICJCaWRpUmVzb2x2ZXIuaCIKICNpbmNsdWRlICJDaGFyYWN0ZXJOYW1l
cy5oIgorI2luY2x1ZGUgIklubGluZUl0ZXJhdG9yLmgiCiAjaW5jbHVkZSAiSW5saW5lVGV4dEJv
eC5oIgogI2luY2x1ZGUgIkxvZ2dpbmcuaCIKICNpbmNsdWRlICJSZW5kZXJBcmVuYS5oIgpAQCAt
NDYsMzYgKzQ3LDYgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogLy8gV2UgZG9uJ3QgbGV0IG91ciBs
aW5lIGJveCB0cmVlIGZvciBhIHNpbmdsZSBsaW5lIGdldCBhbnkgZGVlcGVyIHRoYW4gdGhpcy4K
IGNvbnN0IHVuc2lnbmVkIGNNYXhMaW5lRGVwdGggPSAyMDA7CiAKLWNsYXNzIElubGluZUl0ZXJh
dG9yIHsKLXB1YmxpYzoKLSAgICBJbmxpbmVJdGVyYXRvcigpCi0gICAgICAgIDogYmxvY2soMCkK
LSAgICAgICAgLCBvYmooMCkKLSAgICAgICAgLCBwb3MoMCkKLSAgICAgICAgLCBuZXh0QnJlYWth
YmxlUG9zaXRpb24oLTEpCi0gICAgewotICAgIH0KLQotICAgIElubGluZUl0ZXJhdG9yKFJlbmRl
ckJsb2NrKiBiLCBSZW5kZXJPYmplY3QqIG8sIHVuc2lnbmVkIHApCi0gICAgICAgIDogYmxvY2so
YikKLSAgICAgICAgLCBvYmoobykKLSAgICAgICAgLCBwb3MocCkKLSAgICAgICAgLCBuZXh0QnJl
YWthYmxlUG9zaXRpb24oLTEpCi0gICAgewotICAgIH0KLQotICAgIHZvaWQgaW5jcmVtZW50KElu
bGluZUJpZGlSZXNvbHZlciogcmVzb2x2ZXIgPSAwKTsKLSAgICBib29sIGF0RW5kKCkgY29uc3Q7
Ci0KLSAgICBVQ2hhciBjdXJyZW50KCkgY29uc3Q7Ci0gICAgRGlyZWN0aW9uIGRpcmVjdGlvbigp
IGNvbnN0OwotCi0gICAgUmVuZGVyQmxvY2sqIGJsb2NrOwotICAgIFJlbmRlck9iamVjdCogb2Jq
OwotICAgIHVuc2lnbmVkIHBvczsKLSAgICBpbnQgbmV4dEJyZWFrYWJsZVBvc2l0aW9uOwotfTsK
LQogc3RhdGljIGludCBnZXRCb3JkZXJQYWRkaW5nTWFyZ2luKFJlbmRlckJveE1vZGVsT2JqZWN0
KiBjaGlsZCwgYm9vbCBlbmRPZklubGluZSkKIHsKICAgICBib29sIGxlZnRTaWRlID0gKGNoaWxk
LT5zdHlsZSgpLT5kaXJlY3Rpb24oKSA9PSBMVFIpID8gIWVuZE9mSW5saW5lIDogZW5kT2ZJbmxp
bmU7CkBAIC0xMDAsMjQ3ICs3MSw2IEBAIHN0YXRpYyBpbnQgaW5saW5lV2lkdGgoUmVuZGVyT2Jq
ZWN0KiBjaGkKICAgICByZXR1cm4gZXh0cmFXaWR0aDsKIH0KIAotc3RydWN0IEJpZGlSdW4gOiBC
aWRpQ2hhcmFjdGVyUnVuIHsKLSAgICBCaWRpUnVuKGludCBzdGFydCwgaW50IHN0b3AsIFJlbmRl
ck9iamVjdCogb2JqZWN0LCBCaWRpQ29udGV4dCogY29udGV4dCwgRGlyZWN0aW9uIGRpcikKLSAg
ICAgICAgOiBCaWRpQ2hhcmFjdGVyUnVuKHN0YXJ0LCBzdG9wLCBjb250ZXh0LCBkaXIpCi0gICAg
ICAgICwgbV9vYmplY3Qob2JqZWN0KQotICAgICAgICAsIG1fYm94KDApCi0gICAgewotICAgIH0K
LQotICAgIHZvaWQgZGVzdHJveSgpOwotCi0gICAgLy8gT3ZlcmxvYWRlZCBuZXcgb3BlcmF0b3Iu
Ci0gICAgdm9pZCogb3BlcmF0b3IgbmV3KHNpemVfdCwgUmVuZGVyQXJlbmEqKSB0aHJvdygpOwot
Ci0gICAgLy8gT3ZlcnJpZGRlbiB0byBwcmV2ZW50IHRoZSBub3JtYWwgZGVsZXRlIGZyb20gYmVp
bmcgY2FsbGVkLgotICAgIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQqLCBzaXplX3QpOwotCi0g
ICAgQmlkaVJ1biogbmV4dCgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PEJpZGlSdW4qPihtX25leHQp
OyB9Ci0KLXByaXZhdGU6Ci0gICAgLy8gVGhlIG5vcm1hbCBvcGVyYXRvciBuZXcgaXMgZGlzYWxs
b3dlZC4KLSAgICB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90KSB0aHJvdygpOwotCi1wdWJsaWM6
Ci0gICAgUmVuZGVyT2JqZWN0KiBtX29iamVjdDsKLSAgICBJbmxpbmVCb3gqIG1fYm94OwotfTsK
LQotI2lmbmRlZiBOREVCVUcKLXN0YXRpYyBSZWZDb3VudGVkTGVha0NvdW50ZXIgYmlkaVJ1bkNv
dW50ZXIoIkJpZGlSdW4iKTsKLQotc3RhdGljIGJvb2wgaW5CaWRpUnVuRGVzdHJveTsKLSNlbmRp
ZgotCi12b2lkIEJpZGlSdW46OmRlc3Ryb3koKQotewotI2lmbmRlZiBOREVCVUcKLSAgICBpbkJp
ZGlSdW5EZXN0cm95ID0gdHJ1ZTsKLSNlbmRpZgotICAgIFJlbmRlckFyZW5hKiByZW5kZXJBcmVu
YSA9IG1fb2JqZWN0LT5yZW5kZXJBcmVuYSgpOwotICAgIGRlbGV0ZSB0aGlzOwotI2lmbmRlZiBO
REVCVUcKLSAgICBpbkJpZGlSdW5EZXN0cm95ID0gZmFsc2U7Ci0jZW5kaWYKLQotICAgIC8vIFJl
Y292ZXIgdGhlIHNpemUgbGVmdCB0aGVyZSBmb3IgdXMgYnkgb3BlcmF0b3IgZGVsZXRlIGFuZCBm
cmVlIHRoZSBtZW1vcnkuCi0gICAgcmVuZGVyQXJlbmEtPmZyZWUoKnJlaW50ZXJwcmV0X2Nhc3Q8
c2l6ZV90Kj4odGhpcyksIHRoaXMpOwotfQotCi12b2lkKiBCaWRpUnVuOjpvcGVyYXRvciBuZXco
c2l6ZV90IHN6LCBSZW5kZXJBcmVuYSogcmVuZGVyQXJlbmEpIHRocm93KCkKLXsKLSNpZm5kZWYg
TkRFQlVHCi0gICAgYmlkaVJ1bkNvdW50ZXIuaW5jcmVtZW50KCk7Ci0jZW5kaWYKLSAgICByZXR1
cm4gcmVuZGVyQXJlbmEtPmFsbG9jYXRlKHN6KTsKLX0KLQotdm9pZCBCaWRpUnVuOjpvcGVyYXRv
ciBkZWxldGUodm9pZCogcHRyLCBzaXplX3Qgc3opCi17Ci0jaWZuZGVmIE5ERUJVRwotICAgIGJp
ZGlSdW5Db3VudGVyLmRlY3JlbWVudCgpOwotI2VuZGlmCi0gICAgQVNTRVJUKGluQmlkaVJ1bkRl
c3Ryb3kpOwotCi0gICAgLy8gU3Rhc2ggc2l6ZSB3aGVyZSBkZXN0cm95KCkgY2FuIGZpbmQgaXQu
Ci0gICAgKihzaXplX3QqKXB0ciA9IHN6OwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaW5saW5l
IGJvb2wgb3BlcmF0b3I9PShjb25zdCBJbmxpbmVJdGVyYXRvciYgaXQxLCBjb25zdCBJbmxpbmVJ
dGVyYXRvciYgaXQyKQotewotICAgIHJldHVybiBpdDEucG9zID09IGl0Mi5wb3MgJiYgaXQxLm9i
aiA9PSBpdDIub2JqOwotfQotCi1pbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IElubGluZUl0
ZXJhdG9yJiBpdDEsIGNvbnN0IElubGluZUl0ZXJhdG9yJiBpdDIpCi17Ci0gICAgcmV0dXJuIGl0
MS5wb3MgIT0gaXQyLnBvcyB8fCBpdDEub2JqICE9IGl0Mi5vYmo7Ci19Ci0KLXN0YXRpYyBpbmxp
bmUgUmVuZGVyT2JqZWN0KiBiaWRpTmV4dChSZW5kZXJCbG9jayogYmxvY2ssIFJlbmRlck9iamVj
dCogY3VycmVudCwgSW5saW5lQmlkaVJlc29sdmVyKiByZXNvbHZlciA9IDAsIGJvb2wgc2tpcElu
bGluZXMgPSB0cnVlLCBib29sKiBlbmRPZklubGluZVB0ciA9IDApCi17Ci0gICAgUmVuZGVyT2Jq
ZWN0KiBuZXh0ID0gMDsKLSAgICBib29sIG9sZEVuZE9mSW5saW5lID0gZW5kT2ZJbmxpbmVQdHIg
PyAqZW5kT2ZJbmxpbmVQdHIgOiBmYWxzZTsKLSAgICBib29sIGVuZE9mSW5saW5lID0gZmFsc2U7
Ci0KLSAgICB3aGlsZSAoY3VycmVudCkgewotICAgICAgICBuZXh0ID0gMDsKLSAgICAgICAgaWYg
KCFvbGRFbmRPZklubGluZSAmJiAhY3VycmVudC0+aXNGbG9hdGluZygpICYmICFjdXJyZW50LT5p
c1JlcGxhY2VkKCkgJiYgIWN1cnJlbnQtPmlzUG9zaXRpb25lZCgpICYmICFjdXJyZW50LT5pc1Rl
eHQoKSkgewotICAgICAgICAgICAgbmV4dCA9IGN1cnJlbnQtPmZpcnN0Q2hpbGQoKTsKLSAgICAg
ICAgICAgIGlmIChuZXh0ICYmIHJlc29sdmVyICYmIG5leHQtPmlzUmVuZGVySW5saW5lKCkpIHsK
LSAgICAgICAgICAgICAgICBFVW5pY29kZUJpZGkgdWIgPSBuZXh0LT5zdHlsZSgpLT51bmljb2Rl
QmlkaSgpOwotICAgICAgICAgICAgICAgIGlmICh1YiAhPSBVQk5vcm1hbCkgewotICAgICAgICAg
ICAgICAgICAgICBUZXh0RGlyZWN0aW9uIGRpciA9IG5leHQtPnN0eWxlKCktPmRpcmVjdGlvbigp
OwotICAgICAgICAgICAgICAgICAgICBEaXJlY3Rpb24gZCA9ICh1YiA9PSBFbWJlZAotICAgICAg
ICAgICAgICAgICAgICAgICAgPyAoZGlyID09IFJUTCA/IFJpZ2h0VG9MZWZ0RW1iZWRkaW5nIDog
TGVmdFRvUmlnaHRFbWJlZGRpbmcpCi0gICAgICAgICAgICAgICAgICAgICAgICA6IChkaXIgPT0g
UlRMID8gUmlnaHRUb0xlZnRPdmVycmlkZSA6IExlZnRUb1JpZ2h0T3ZlcnJpZGUpKTsKLSAgICAg
ICAgICAgICAgICAgICAgcmVzb2x2ZXItPmVtYmVkKGQpOwotICAgICAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbmV4dCkgewotICAgICAgICAg
ICAgaWYgKCFza2lwSW5saW5lcyAmJiAhb2xkRW5kT2ZJbmxpbmUgJiYgY3VycmVudC0+aXNSZW5k
ZXJJbmxpbmUoKSkgewotICAgICAgICAgICAgICAgIG5leHQgPSBjdXJyZW50OwotICAgICAgICAg
ICAgICAgIGVuZE9mSW5saW5lID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAg
ICAgICAgIH0KLQotICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudCAhPSBibG9j
aykgewotICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlciAmJiBjdXJyZW50LT5pc1JlbmRlcklu
bGluZSgpICYmIGN1cnJlbnQtPnN0eWxlKCktPnVuaWNvZGVCaWRpKCkgIT0gVUJOb3JtYWwpCi0g
ICAgICAgICAgICAgICAgICAgIHJlc29sdmVyLT5lbWJlZChQb3BEaXJlY3Rpb25hbEZvcm1hdCk7
Ci0KLSAgICAgICAgICAgICAgICBuZXh0ID0gY3VycmVudC0+bmV4dFNpYmxpbmcoKTsKLSAgICAg
ICAgICAgICAgICBpZiAobmV4dCkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZXIg
JiYgbmV4dC0+aXNSZW5kZXJJbmxpbmUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgRVVu
aWNvZGVCaWRpIHViID0gbmV4dC0+c3R5bGUoKS0+dW5pY29kZUJpZGkoKTsKLSAgICAgICAgICAg
ICAgICAgICAgICAgIGlmICh1YiAhPSBVQk5vcm1hbCkgewotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIFRleHREaXJlY3Rpb24gZGlyID0gbmV4dC0+c3R5bGUoKS0+ZGlyZWN0aW9uKCk7Ci0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0aW9uIGQgPSAodWIgPT0gRW1iZWQKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoZGlyID09IFJUTCA/IFJpZ2h0VG9MZWZ0
RW1iZWRkaW5nOiBMZWZ0VG9SaWdodEVtYmVkZGluZykKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgOiAoZGlyID09IFJUTCA/IFJpZ2h0VG9MZWZ0T3ZlcnJpZGUgOiBMZWZ0VG9SaWdo
dE92ZXJyaWRlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXItPmVtYmVk
KGQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAg
ICAgICAKLSAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC0+cGFyZW50KCk7Ci0gICAg
ICAgICAgICAgICAgaWYgKCFza2lwSW5saW5lcyAmJiBjdXJyZW50ICYmIGN1cnJlbnQgIT0gYmxv
Y2sgJiYgY3VycmVudC0+aXNSZW5kZXJJbmxpbmUoKSkgewotICAgICAgICAgICAgICAgICAgICBu
ZXh0ID0gY3VycmVudDsKLSAgICAgICAgICAgICAgICAgICAgZW5kT2ZJbmxpbmUgPSB0cnVlOwot
ICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIW5leHQpCi0gICAgICAgICAgICBicmVhazsK
LQotICAgICAgICBpZiAobmV4dC0+aXNUZXh0KCkgfHwgbmV4dC0+aXNGbG9hdGluZygpIHx8IG5l
eHQtPmlzUmVwbGFjZWQoKSB8fCBuZXh0LT5pc1Bvc2l0aW9uZWQoKQotICAgICAgICAgICAgfHwg
KCghc2tpcElubGluZXMgfHwgIW5leHQtPmZpcnN0Q2hpbGQoKSkgLy8gQWx3YXlzIHJldHVybiBF
TVBUWSBpbmxpbmVzLgotICAgICAgICAgICAgICAgICYmIG5leHQtPmlzUmVuZGVySW5saW5lKCkp
KQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGN1cnJlbnQgPSBuZXh0OwotICAgIH0KLQot
ICAgIGlmIChlbmRPZklubGluZVB0cikKLSAgICAgICAgKmVuZE9mSW5saW5lUHRyID0gZW5kT2ZJ
bmxpbmU7Ci0KLSAgICByZXR1cm4gbmV4dDsKLX0KLQotc3RhdGljIFJlbmRlck9iamVjdCogYmlk
aUZpcnN0KFJlbmRlckJsb2NrKiBibG9jaywgSW5saW5lQmlkaVJlc29sdmVyKiByZXNvbHZlciwg
Ym9vbCBza2lwSW5saW5lcyA9IHRydWUpCi17Ci0gICAgaWYgKCFibG9jay0+Zmlyc3RDaGlsZCgp
KQotICAgICAgICByZXR1cm4gMDsKLSAgICAKLSAgICBSZW5kZXJPYmplY3QqIG8gPSBibG9jay0+
Zmlyc3RDaGlsZCgpOwotICAgIGlmIChvLT5pc1JlbmRlcklubGluZSgpKSB7Ci0gICAgICAgIGlm
IChyZXNvbHZlcikgewotICAgICAgICAgICAgRVVuaWNvZGVCaWRpIHViID0gby0+c3R5bGUoKS0+
dW5pY29kZUJpZGkoKTsKLSAgICAgICAgICAgIGlmICh1YiAhPSBVQk5vcm1hbCkgewotICAgICAg
ICAgICAgICAgIFRleHREaXJlY3Rpb24gZGlyID0gby0+c3R5bGUoKS0+ZGlyZWN0aW9uKCk7Ci0g
ICAgICAgICAgICAgICAgRGlyZWN0aW9uIGQgPSAodWIgPT0gRW1iZWQKLSAgICAgICAgICAgICAg
ICAgICAgPyAoZGlyID09IFJUTCA/IFJpZ2h0VG9MZWZ0RW1iZWRkaW5nIDogTGVmdFRvUmlnaHRF
bWJlZGRpbmcpCi0gICAgICAgICAgICAgICAgICAgIDogKGRpciA9PSBSVEwgPyBSaWdodFRvTGVm
dE92ZXJyaWRlIDogTGVmdFRvUmlnaHRPdmVycmlkZSkpOwotICAgICAgICAgICAgICAgIHJlc29s
dmVyLT5lbWJlZChkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoc2tp
cElubGluZXMgJiYgby0+Zmlyc3RDaGlsZCgpKQotICAgICAgICAgICAgbyA9IGJpZGlOZXh0KGJs
b2NrLCBvLCByZXNvbHZlciwgc2tpcElubGluZXMpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAg
ICAgIC8vIE5ldmVyIHNraXAgZW1wdHkgaW5saW5lcy4KLSAgICAgICAgICAgIGlmIChyZXNvbHZl
cikKLSAgICAgICAgICAgICAgICByZXNvbHZlci0+Y29tbWl0RXhwbGljaXRFbWJlZGRpbmcoKTsK
LSAgICAgICAgICAgIHJldHVybiBvOyAKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChvICYm
ICFvLT5pc1RleHQoKSAmJiAhby0+aXNSZXBsYWNlZCgpICYmICFvLT5pc0Zsb2F0aW5nKCkgJiYg
IW8tPmlzUG9zaXRpb25lZCgpKQotICAgICAgICBvID0gYmlkaU5leHQoYmxvY2ssIG8sIHJlc29s
dmVyLCBza2lwSW5saW5lcyk7Ci0KLSAgICBpZiAocmVzb2x2ZXIpCi0gICAgICAgIHJlc29sdmVy
LT5jb21taXRFeHBsaWNpdEVtYmVkZGluZygpOwotICAgIHJldHVybiBvOwotfQotCi1pbmxpbmUg
dm9pZCBJbmxpbmVJdGVyYXRvcjo6aW5jcmVtZW50KElubGluZUJpZGlSZXNvbHZlciogcmVzb2x2
ZXIpCi17Ci0gICAgaWYgKCFvYmopCi0gICAgICAgIHJldHVybjsKLSAgICBpZiAob2JqLT5pc1Rl
eHQoKSkgewotICAgICAgICBwb3MrKzsKLSAgICAgICAgaWYgKHBvcyA+PSB0b1JlbmRlclRleHQo
b2JqKS0+dGV4dExlbmd0aCgpKSB7Ci0gICAgICAgICAgICBvYmogPSBiaWRpTmV4dChibG9jaywg
b2JqLCByZXNvbHZlcik7Ci0gICAgICAgICAgICBwb3MgPSAwOwotICAgICAgICAgICAgbmV4dEJy
ZWFrYWJsZVBvc2l0aW9uID0gLTE7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBv
YmogPSBiaWRpTmV4dChibG9jaywgb2JqLCByZXNvbHZlcik7Ci0gICAgICAgIHBvcyA9IDA7Ci0g
ICAgICAgIG5leHRCcmVha2FibGVQb3NpdGlvbiA9IC0xOwotICAgIH0KLX0KLQotdGVtcGxhdGU8
PgotaW5saW5lIHZvaWQgSW5saW5lQmlkaVJlc29sdmVyOjppbmNyZW1lbnQoKQotewotICAgIGN1
cnJlbnQuaW5jcmVtZW50KHRoaXMpOwotfQotCi1pbmxpbmUgYm9vbCBJbmxpbmVJdGVyYXRvcjo6
YXRFbmQoKSBjb25zdAotewotICAgIHJldHVybiAhb2JqOwotfQotCi1pbmxpbmUgVUNoYXIgSW5s
aW5lSXRlcmF0b3I6OmN1cnJlbnQoKSBjb25zdAotewotICAgIGlmICghb2JqIHx8ICFvYmotPmlz
VGV4dCgpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIFJlbmRlclRleHQqIHRleHQgPSB0b1Jl
bmRlclRleHQob2JqKTsKLSAgICBpZiAocG9zID49IHRleHQtPnRleHRMZW5ndGgoKSkKLSAgICAg
ICAgcmV0dXJuIDA7Ci0KLSAgICByZXR1cm4gdGV4dC0+Y2hhcmFjdGVycygpW3Bvc107Ci19Ci0K
LUFMV0FZU19JTkxJTkUgRGlyZWN0aW9uIElubGluZUl0ZXJhdG9yOjpkaXJlY3Rpb24oKSBjb25z
dAotewotICAgIGlmIChVQ2hhciBjID0gY3VycmVudCgpKQotICAgICAgICByZXR1cm4gVW5pY29k
ZTo6ZGlyZWN0aW9uKGMpOwotCi0gICAgaWYgKG9iaiAmJiBvYmotPmlzTGlzdE1hcmtlcigpKQot
ICAgICAgICByZXR1cm4gb2JqLT5zdHlsZSgpLT5kaXJlY3Rpb24oKSA9PSBMVFIgPyBMZWZ0VG9S
aWdodCA6IFJpZ2h0VG9MZWZ0OwotCi0gICAgcmV0dXJuIE90aGVyTmV1dHJhbDsKLX0KLQotLy8g
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCiBzdGF0aWMgdm9pZCBj
aG9wTWlkcG9pbnRzQXQoTGluZU1pZHBvaW50U3RhdGUmIGxpbmVNaWRwb2ludFN0YXRlLCBSZW5k
ZXJPYmplY3QqIG9iaiwgdW5zaWduZWQgcG9zKQogewogICAgIGlmICghbGluZU1pZHBvaW50U3Rh
dGUubnVtTWlkcG9pbnRzKQpAQCAtMzk4LDcgKzEyOCw3IEBAIHN0YXRpYyB2b2lkIGFkZE1pZHBv
aW50KExpbmVNaWRwb2ludFN0YXQKICAgICBtaWRwb2ludHNbbGluZU1pZHBvaW50U3RhdGUubnVt
TWlkcG9pbnRzKytdID0gbWlkcG9pbnQ7CiB9CiAKLXN0YXRpYyB2b2lkIGFwcGVuZFJ1bnNGb3JP
YmplY3QoaW50IHN0YXJ0LCBpbnQgZW5kLCBSZW5kZXJPYmplY3QqIG9iaiwgSW5saW5lQmlkaVJl
c29sdmVyJiByZXNvbHZlcikKK3ZvaWQgUmVuZGVyQmxvY2s6OmFwcGVuZFJ1bnNGb3JPYmplY3Qo
aW50IHN0YXJ0LCBpbnQgZW5kLCBSZW5kZXJPYmplY3QqIG9iaiwgSW5saW5lQmlkaVJlc29sdmVy
JiByZXNvbHZlcikKIHsKICAgICBpZiAoc3RhcnQgPiBlbmQgfHwgb2JqLT5pc0Zsb2F0aW5nKCkg
fHwKICAgICAgICAgKG9iai0+aXNQb3NpdGlvbmVkKCkgJiYgIW9iai0+c3R5bGUoKS0+aGFzU3Rh
dGljWCgpICYmICFvYmotPnN0eWxlKCktPmhhc1N0YXRpY1koKSAmJiAhb2JqLT5jb250YWluZXIo
KS0+aXNSZW5kZXJJbmxpbmUoKSkpCkBAIC00NDEsNDAgKzE3MSwxMCBAQCBzdGF0aWMgdm9pZCBh
cHBlbmRSdW5zRm9yT2JqZWN0KGludCBzdGFyCiAgICAgfQogfQogCi10ZW1wbGF0ZSA8Pgotdm9p
ZCBJbmxpbmVCaWRpUmVzb2x2ZXI6OmFwcGVuZFJ1bigpCi17Ci0gICAgaWYgKCFlbXB0eVJ1biAm
JiAhZW9yLmF0RW5kKCkpIHsKLSAgICAgICAgaW50IHN0YXJ0ID0gc29yLnBvczsKLSAgICAgICAg
UmVuZGVyT2JqZWN0ICpvYmogPSBzb3Iub2JqOwotICAgICAgICB3aGlsZSAob2JqICYmIG9iaiAh
PSBlb3Iub2JqICYmIG9iaiAhPSBlbmRPZkxpbmUub2JqKSB7Ci0gICAgICAgICAgICBhcHBlbmRS
dW5zRm9yT2JqZWN0KHN0YXJ0LCBvYmotPmxlbmd0aCgpLCBvYmosICp0aGlzKTsgICAgICAgIAot
ICAgICAgICAgICAgc3RhcnQgPSAwOwotICAgICAgICAgICAgb2JqID0gYmlkaU5leHQoc29yLmJs
b2NrLCBvYmopOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvYmopIHsKLSAgICAgICAgICAgIHVu
c2lnbmVkIHBvcyA9IG9iaiA9PSBlb3Iub2JqID8gZW9yLnBvcyA6IFVJTlRfTUFYOwotICAgICAg
ICAgICAgaWYgKG9iaiA9PSBlbmRPZkxpbmUub2JqICYmIGVuZE9mTGluZS5wb3MgPD0gcG9zKSB7
Ci0gICAgICAgICAgICAgICAgcmVhY2hlZEVuZE9mTGluZSA9IHRydWU7Ci0gICAgICAgICAgICAg
ICAgcG9zID0gZW5kT2ZMaW5lLnBvczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEl0
J3MgT0sgdG8gYWRkIHJ1bnMgZm9yIHplcm8tbGVuZ3RoIFJlbmRlck9iamVjdHMsIGp1c3QgZG9u
J3QgbWFrZSB0aGUgcnVuIGxhcmdlciB0aGFuIGl0IHNob3VsZCBiZQotICAgICAgICAgICAgaW50
IGVuZCA9IG9iai0+bGVuZ3RoKCkgPyBwb3MrMSA6IDA7Ci0gICAgICAgICAgICBhcHBlbmRSdW5z
Rm9yT2JqZWN0KHN0YXJ0LCBlbmQsIG9iaiwgKnRoaXMpOwotICAgICAgICB9Ci0gICAgICAgIAot
ICAgICAgICBlb3IuaW5jcmVtZW50KCk7Ci0gICAgICAgIHNvciA9IGVvcjsKLSAgICB9Ci0KLSAg
ICBtX2RpcmVjdGlvbiA9IE90aGVyTmV1dHJhbDsKLSAgICBtX3N0YXR1cy5lb3IgPSBPdGhlck5l
dXRyYWw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgSW5saW5lQm94KiBjcmVhdGVJbmxpbmVCb3hGb3JS
ZW5kZXJlcihSZW5kZXJPYmplY3QqIG9iaiwgYm9vbCBpc1Jvb3RMaW5lQm94LCBib29sIGlzT25s
eVJ1biA9IGZhbHNlKQorc3RhdGljIGlubGluZSBJbmxpbmVCb3gqIGNyZWF0ZUlubGluZUJveEZv
clJlbmRlcmVyKFJlbmRlck9iamVjdCogb2JqLCBib29sIGlzUm9vdExpbmVCb3gsIGJvb2wgaXNP
bmx5UnVuLCBSZW5kZXJCbG9jayogYW5vbnltb3VzSW5saW5lQmxvY2spCiB7CiAgICAgaWYgKGlz
Um9vdExpbmVCb3gpCi0gICAgICAgIHJldHVybiB0b1JlbmRlckJsb2NrKG9iaiktPmNyZWF0ZUFu
ZEFwcGVuZFJvb3RJbmxpbmVCb3goKTsKKyAgICAgICAgcmV0dXJuIHRvUmVuZGVyQmxvY2sob2Jq
KS0+Y3JlYXRlQW5kQXBwZW5kUm9vdElubGluZUJveChhbm9ueW1vdXNJbmxpbmVCbG9jayk7CiAg
ICAgCiAgICAgaWYgKG9iai0+aXNUZXh0KCkpIHsKICAgICAgICAgSW5saW5lVGV4dEJveCogdGV4
dEJveCA9IHRvUmVuZGVyVGV4dChvYmopLT5jcmVhdGVJbmxpbmVUZXh0Qm94KCk7CkBAIC01MDEs
NyArMjAxLDE4IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBkaXJ0eUxpbmVCb3hlc0ZvclJlbmQKICAg
ICAgICAgdG9SZW5kZXJJbmxpbmUobyktPmRpcnR5TGluZUJveGVzKGZ1bGxMYXlvdXQpOwogfQog
Ci1JbmxpbmVGbG93Qm94KiBSZW5kZXJCbG9jazo6Y3JlYXRlTGluZUJveGVzKFJlbmRlck9iamVj
dCogb2JqLCBib29sIGZpcnN0TGluZSkKK3N0YXRpYyBpbmxpbmUgYm9vbCBuZWVkc0xpbmVCb3go
UmVuZGVySW5saW5lKiBpbmxpbmVGbG93LCBib29sIGlzQW5vbnltb3VzSW5saW5lQmxvY2spCit7
CisgICAgLy8gRklYTUU6IEltcGxlbWVudCBsaW5lIGJveCBjdWxsaW5nIGFuZCBjdXQgb3V0IGEg
YnVuY2ggb2YgaW50ZXJtZWRpYXRlIGxpbmUgYm94ZXMgYnkgY29tcGFyaW5nIHN0eWxlIGluZm9y
bWF0aW9uCisgICAgLy8gd2l0aCBwYXJlbnRzLCBldGMuIHRvIG1ha2Ugc3VyZSBpdCdzIHBvc3Np
YmxlIHRvIG9taXQgdGhlIGJveCBmb3IgdGhlIGxpbmUuIAorICAgIGlmICghaXNBbm9ueW1vdXNJ
bmxpbmVCbG9jayB8fCAhaW5saW5lRmxvdykKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgCisg
ICAgLy8gSWYgd2UgaGF2ZSBhbiBvdXRsaW5lIG9yIGEgc2VsZi1wYWludGluZyBsYXllciwgdGhl
biB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGUgaW50ZXJtZWRpYXRlIGxpbmUgYm94LgorICAgIHJldHVy
biBpbmxpbmVGbG93LT5oYXNPdXRsaW5lKCkgfHwgaW5saW5lRmxvdy0+aGFzU2VsZlBhaW50aW5n
TGF5ZXIoKTsKK30KKworSW5saW5lRmxvd0JveCogUmVuZGVyQmxvY2s6OmNyZWF0ZUxpbmVCb3hl
cyhSZW5kZXJPYmplY3QqIG9iaiwgYm9vbCBmaXJzdExpbmUsIFJlbmRlckJsb2NrKiBhbm9ueW1v
dXNJbmxpbmVCbG9jaykKIHsKICAgICAvLyBTZWUgaWYgd2UgaGF2ZSBhbiB1bmNvbnN0cnVjdGVk
IGxpbmUgYm94IGZvciB0aGlzIG9iamVjdCB0aGF0IGlzIGFsc28KICAgICAvLyB0aGUgbGFzdCBp
dGVtIG9uIHRoZSBsaW5lLgpAQCAtNTEyLDYgKzIyMyw4IEBAIElubGluZUZsb3dCb3gqIFJlbmRl
ckJsb2NrOjpjcmVhdGVMaW5lQm8KICAgICBkbyB7CiAgICAgICAgIEFTU0VSVChvYmotPmlzUmVu
ZGVySW5saW5lKCkgfHwgb2JqID09IHRoaXMpOwogICAgICAgICAKKyAgICAgICAgUmVuZGVySW5s
aW5lKiBpbmxpbmVPYmogPSAob2JqICE9IHRoaXMpID8gdG9SZW5kZXJJbmxpbmUob2JqKSA6IDA7
CisKICAgICAgICAgLy8gR2V0IHRoZSBsYXN0IGJveCB3ZSBtYWRlIGZvciB0aGlzIHJlbmRlciBv
YmplY3QuCiAgICAgICAgIHBhcmVudEJveCA9IG9iai0+aXNSZW5kZXJJbmxpbmUoKSA/IHRvUmVu
ZGVySW5saW5lKG9iaiktPmxhc3RMaW5lQm94KCkgOiB0b1JlbmRlckJsb2NrKG9iaiktPmxhc3RM
aW5lQm94KCk7CiAKQEAgLTUyMCwzMCArMjMzLDM0IEBAIElubGluZUZsb3dCb3gqIFJlbmRlckJs
b2NrOjpjcmVhdGVMaW5lQm8KICAgICAgICAgLy8gc29tZXRoaW5nIGZvbGxvd2luZyBpdCBvbiB0
aGUgbGluZSwgdGhlbiB3ZSBrbm93IHdlIGhhdmUgdG8gbWFrZSBhIG5ldyBib3gKICAgICAgICAg
Ly8gYXMgd2VsbC4gIEluIHRoaXMgc2l0dWF0aW9uIG91ciBpbmxpbmUgaGFzIGFjdHVhbGx5IGJl
ZW4gc3BsaXQgaW4gdHdvIG9uCiAgICAgICAgIC8vIHRoZSBzYW1lIGxpbmUgKHRoaXMgY2FuIGhh
cHBlbiB3aXRoIHZlcnkgZmFuY3kgbGFuZ3VhZ2UgbWl4dHVyZXMpLgorICAgICAgICBib29sIGFs
bG93ZWRUb0NvbnN0cnVjdE5ld0JveCA9IG5lZWRzTGluZUJveChpbmxpbmVPYmosIGFub255bW91
c0lubGluZUJsb2NrKTsKKyAgICAgICAgYm9vbCBjYW5Vc2VFeGlzdGluZ1BhcmVudEJveCA9IHBh
cmVudEJveCAmJiAhcGFyZW50Qm94LT5pc0NvbnN0cnVjdGVkKCkgJiYgIXBhcmVudEJveC0+bmV4
dE9uTGluZSgpOwogICAgICAgICBib29sIGNvbnN0cnVjdGVkTmV3Qm94ID0gZmFsc2U7Ci0gICAg
ICAgIGlmICghcGFyZW50Qm94IHx8IHBhcmVudEJveC0+aXNDb25zdHJ1Y3RlZCgpIHx8IHBhcmVu
dEJveC0+bmV4dE9uTGluZSgpKSB7CisgICAgICAgIGlmIChhbGxvd2VkVG9Db25zdHJ1Y3ROZXdC
b3ggJiYgIWNhblVzZUV4aXN0aW5nUGFyZW50Qm94KSB7CiAgICAgICAgICAgICAvLyBXZSBuZWVk
IHRvIG1ha2UgYSBuZXcgYm94IGZvciB0aGlzIHJlbmRlciBvYmplY3QuICBPbmNlCiAgICAgICAg
ICAgICAvLyBtYWRlLCB3ZSBuZWVkIHRvIHBsYWNlIGl0IGF0IHRoZSBlbmQgb2YgdGhlIGN1cnJl
bnQgbGluZS4KLSAgICAgICAgICAgIElubGluZUJveCogbmV3Qm94ID0gY3JlYXRlSW5saW5lQm94
Rm9yUmVuZGVyZXIob2JqLCBvYmogPT0gdGhpcyk7CisgICAgICAgICAgICBJbmxpbmVCb3gqIG5l
d0JveCA9IGNyZWF0ZUlubGluZUJveEZvclJlbmRlcmVyKG9iaiwgb2JqID09IHRoaXMsIGZhbHNl
LCBhbm9ueW1vdXNJbmxpbmVCbG9jayk7CiAgICAgICAgICAgICBBU1NFUlQobmV3Qm94LT5pc0lu
bGluZUZsb3dCb3goKSk7CiAgICAgICAgICAgICBwYXJlbnRCb3ggPSBzdGF0aWNfY2FzdDxJbmxp
bmVGbG93Qm94Kj4obmV3Qm94KTsKICAgICAgICAgICAgIHBhcmVudEJveC0+c2V0Rmlyc3RMaW5l
U3R5bGVCaXQoZmlyc3RMaW5lKTsKICAgICAgICAgICAgIGNvbnN0cnVjdGVkTmV3Qm94ID0gdHJ1
ZTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghcmVzdWx0KQotICAgICAgICAgICAgcmVzdWx0
ID0gcGFyZW50Qm94OwotCi0gICAgICAgIC8vIElmIHdlIGhhdmUgaGl0IHRoZSBibG9jayBpdHNl
bGYsIHRoZW4gfGJveHwgcmVwcmVzZW50cyB0aGUgcm9vdAotICAgICAgICAvLyBpbmxpbmUgYm94
IGZvciB0aGUgbGluZSwgYW5kIGl0IGRvZXNuJ3QgaGF2ZSB0byBiZSBhcHBlbmRlZCB0byBhbnkg
cGFyZW50Ci0gICAgICAgIC8vIGlubGluZS4KLSAgICAgICAgaWYgKGNoaWxkQm94KQotICAgICAg
ICAgICAgcGFyZW50Qm94LT5hZGRUb0xpbmUoY2hpbGRCb3gpOwotCi0gICAgICAgIGlmICghY29u
c3RydWN0ZWROZXdCb3ggfHwgb2JqID09IHRoaXMpCi0gICAgICAgICAgICBicmVhazsKLQotICAg
ICAgICBjaGlsZEJveCA9IHBhcmVudEJveDsgICAgICAgIAorICAgICAgICBpZiAoY29uc3RydWN0
ZWROZXdCb3ggfHwgY2FuVXNlRXhpc3RpbmdQYXJlbnRCb3gpIHsKKyAgICAgICAgICAgIGlmICgh
cmVzdWx0KQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHBhcmVudEJveDsgCisgICAgICAgICAg
ICAgICAgCisgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGhpdCB0aGUgYmxvY2sgaXRzZWxmLCB0
aGVuIHxib3h8IHJlcHJlc2VudHMgdGhlIHJvb3QKKyAgICAgICAgICAgIC8vIGlubGluZSBib3gg
Zm9yIHRoZSBsaW5lLCBhbmQgaXQgZG9lc24ndCBoYXZlIHRvIGJlIGFwcGVuZGVkIHRvIGFueSBw
YXJlbnQKKyAgICAgICAgICAgIC8vIGlubGluZS4KKyAgICAgICAgICAgIGlmIChjaGlsZEJveCkK
KyAgICAgICAgICAgICAgICBwYXJlbnRCb3gtPmFkZFRvTGluZShjaGlsZEJveCk7CisgICAgICAg
ICAgICAgICAgCisgICAgICAgICAgICBpZiAoIWNvbnN0cnVjdGVkTmV3Qm94IHx8IG9iaiA9PSB0
aGlzKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgIAorICAgICAgICAgICAgY2hpbGRCb3gg
PSBwYXJlbnRCb3g7CisgICAgICAgIH0KIAogICAgICAgICAvLyBJZiB3ZSd2ZSBleGNlZWRlZCBv
dXIgbGluZSBkZXB0aCwgdGhlbiBqdW1wIHN0cmFpZ2h0IHRvIHRoZSByb290IGFuZCBza2lwIGFs
bCB0aGUgcmVtYWluaW5nCiAgICAgICAgIC8vIGludGVybWVkaWF0ZSBpbmxpbmUgZmxvd3MuCkBA
IC01NjUsMTkgKzI4MiwyMyBAQCBSb290SW5saW5lQm94KiBSZW5kZXJCbG9jazo6Y29uc3RydWN0
TGluCiAgICAgICAgIGlmIChydW5Db3VudCA9PSAyICYmICFyLT5tX29iamVjdC0+aXNMaXN0TWFy
a2VyKCkpCiAgICAgICAgICAgICBpc09ubHlSdW4gPSAoKHN0eWxlKCktPmRpcmVjdGlvbigpID09
IFJUTCkgPyBsYXN0UnVuIDogZmlyc3RSdW4pLT5tX29iamVjdC0+aXNMaXN0TWFya2VyKCk7CiAK
LSAgICAgICAgSW5saW5lQm94KiBib3ggPSBjcmVhdGVJbmxpbmVCb3hGb3JSZW5kZXJlcihyLT5t
X29iamVjdCwgZmFsc2UsIGlzT25seVJ1bik7CisgICAgICAgIFJlbmRlckJsb2NrKiBhbm9ueW1v
dXNJbmxpbmVCbG9jayA9IHItPm1fb2JqZWN0LT5pc0Fub255bW91c0lubGluZUJsb2NrKCkgPyB0
b1JlbmRlckJsb2NrKHItPm1fb2JqZWN0KSA6IDA7CisKKyAgICAgICAgSW5saW5lQm94KiBib3gg
PSBjcmVhdGVJbmxpbmVCb3hGb3JSZW5kZXJlcihyLT5tX29iamVjdCwgZmFsc2UsIGlzT25seVJ1
biwgYW5vbnltb3VzSW5saW5lQmxvY2spOwogICAgICAgICByLT5tX2JveCA9IGJveDsKIAogICAg
ICAgICBBU1NFUlQoYm94KTsKICAgICAgICAgaWYgKCFib3gpCiAgICAgICAgICAgICBjb250aW51
ZTsKIAorICAgICAgICBSZW5kZXJPYmplY3QqIGFuY2VzdG9yUmVuZGVyZXIgPSByLT5tX29iamVj
dC0+cGFyZW50KCk7CisgCiAgICAgICAgIC8vIElmIHdlIGhhdmUgbm8gcGFyZW50IGJveCB5ZXQs
IG9yIGlmIHRoZSBydW4gaXMgbm90IHNpbXBseSBhIHNpYmxpbmcsCiAgICAgICAgIC8vIHRoZW4g
d2UgbmVlZCB0byBjb25zdHJ1Y3QgaW5saW5lIGJveGVzIGFzIG5lY2Vzc2FyeSB0byBwcm9wZXJs
eSBlbmNsb3NlIHRoZQogICAgICAgICAvLyBydW4ncyBpbmxpbmUgYm94LgotICAgICAgICBpZiAo
IXBhcmVudEJveCB8fCBwYXJlbnRCb3gtPnJlbmRlcmVyKCkgIT0gci0+bV9vYmplY3QtPnBhcmVu
dCgpKQorICAgICAgICBpZiAoIXBhcmVudEJveCB8fCBwYXJlbnRCb3gtPnJlbmRlcmVyKCkgIT0g
YW5jZXN0b3JSZW5kZXJlcikKICAgICAgICAgICAgIC8vIENyZWF0ZSBuZXcgaW5saW5lIGJveGVz
IGFsbCB0aGUgd2F5IGJhY2sgdG8gdGhlIGFwcHJvcHJpYXRlIGluc2VydGlvbiBwb2ludC4KLSAg
ICAgICAgICAgIHBhcmVudEJveCA9IGNyZWF0ZUxpbmVCb3hlcyhyLT5tX29iamVjdC0+cGFyZW50
KCksIGZpcnN0TGluZSk7CisgICAgICAgICAgICBwYXJlbnRCb3ggPSBjcmVhdGVMaW5lQm94ZXMo
YW5jZXN0b3JSZW5kZXJlciwgZmlyc3RMaW5lLCBhbm9ueW1vdXNJbmxpbmVCbG9jayk7CiAKICAg
ICAgICAgLy8gQXBwZW5kIHRoZSBpbmxpbmUgYm94IHRvIHRoaXMgbGluZS4KICAgICAgICAgcGFy
ZW50Qm94LT5hZGRUb0xpbmUoYm94KTsKQEAgLTYxOSw2ICszNDAsOCBAQCB2b2lkIFJlbmRlckJs
b2NrOjpjb21wdXRlSG9yaXpvbnRhbFBvc2l0CiAgICAgdW5zaWduZWQgbnVtU3BhY2VzID0gMDsK
ICAgICBFVGV4dEFsaWduIHRleHRBbGlnbiA9IHN0eWxlKCktPnRleHRBbGlnbigpOwogCisgICAg
aW50IHggPSBsZWZ0T2Zmc2V0KGhlaWdodCgpLCBmaXJzdExpbmUpOworCiAgICAgZm9yIChCaWRp
UnVuKiByID0gZmlyc3RSdW47IHI7IHIgPSByLT5uZXh0KCkpIHsKICAgICAgICAgaWYgKCFyLT5t
X2JveCB8fCByLT5tX29iamVjdC0+aXNQb3NpdGlvbmVkKCkgfHwgci0+bV9ib3gtPmlzTGluZUJy
ZWFrKCkpCiAgICAgICAgICAgICBjb250aW51ZTsgLy8gUG9zaXRpb25lZCBvYmplY3RzIGFyZSBv
bmx5IHBhcnRpY2lwYXRpbmcgdG8gZmlndXJlIG91dCB0aGVpcgpAQCAtNjU2LDYgKzM3OSwxMiBA
QCB2b2lkIFJlbmRlckJsb2NrOjpjb21wdXRlSG9yaXpvbnRhbFBvc2l0CiAgICAgICAgICAgICBy
ZW5kZXJCb3gtPmNhbGNXaWR0aCgpOwogICAgICAgICAgICAgci0+bV9ib3gtPnNldFdpZHRoKHJl
bmRlckJveC0+d2lkdGgoKSk7CiAgICAgICAgICAgICB0b3RXaWR0aCArPSByZW5kZXJCb3gtPm1h
cmdpbkxlZnQoKSArIHJlbmRlckJveC0+bWFyZ2luUmlnaHQoKTsKKyAgICAgICAgICAgIAorICAg
ICAgICAgICAgaWYgKHItPm1fb2JqZWN0LT5pc0Fub255bW91c0lubGluZUJsb2NrKCkpIHsKKyAg
ICAgICAgICAgICAgICAvLyBBbGxvdyB0aGUgZnVsbCBhdmFpbGFibGUgd2lkdGggdG8gYmUgdXNl
ZCwgc2luY2UgZmxvYXRzIHdpbGwgaW50cnVkZSBpbnRvIG91ciBzcGFjZS4KKyAgICAgICAgICAg
ICAgICBhdmFpbGFibGVXaWR0aCA9IHJpZ2h0T2Zmc2V0KCkgLSBsZWZ0T2Zmc2V0KCk7CisgICAg
ICAgICAgICAgICAgeCA9IGxlZnRPZmZzZXQoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQog
CiAgICAgICAgIHRvdFdpZHRoICs9IHItPm1fYm94LT53aWR0aCgpOwpAQCAtNjY1LDcgKzM5NCw2
IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmNvbXB1dGVIb3Jpem9udGFsUG9zaXQKICAgICAvLyB3ZSBu
b3cgZXhhbWluZSBvdXIgdGV4dC1hbGlnbiBwcm9wZXJ0eSBpbiBvcmRlciB0byBkZXRlcm1pbmUg
d2hlcmUgdG8gcG9zaXRpb24gdGhlCiAgICAgLy8gb2JqZWN0cyBob3Jpem9udGFsbHkuICBUaGUg
dG90YWwgd2lkdGggb2YgdGhlIGxpbmUgY2FuIGJlIGluY3JlYXNlZCBpZiB3ZSBlbmQgdXAKICAg
ICAvLyBqdXN0aWZ5aW5nIHRleHQuCi0gICAgaW50IHggPSBsZWZ0T2Zmc2V0KGhlaWdodCgpLCBm
aXJzdExpbmUpOwogICAgIHN3aXRjaCAodGV4dEFsaWduKSB7CiAgICAgICAgIGNhc2UgTEVGVDoK
ICAgICAgICAgY2FzZSBXRUJLSVRfTEVGVDoKQEAgLTgxOSw5ICs1NDcsMTUgQEAgdm9pZCBSZW5k
ZXJCbG9jazo6bGF5b3V0SW5saW5lQ2hpbGRyZW4oYgogICAgIGJvb2wgdXNlUmVwYWludEJvdW5k
cyA9IGZhbHNlOwogICAgIAogICAgIG1fb3ZlcmZsb3cuY2xlYXIoKTsKLSAgICAgICAgCi0gICAg
c2V0SGVpZ2h0KGJvcmRlclRvcCgpICsgcGFkZGluZ1RvcCgpKTsKLSAgICBpbnQgdG9BZGQgPSBi
b3JkZXJCb3R0b20oKSArIHBhZGRpbmdCb3R0b20oKSArIGhvcml6b250YWxTY3JvbGxiYXJIZWln
aHQoKTsKKyAgICAKKyAgICBpbnQgdG9wID0gYm9yZGVyVG9wKCkgKyBwYWRkaW5nVG9wKCk7Cisg
ICAgaW50IGJvdHRvbSA9IGJvcmRlckJvdHRvbSgpICsgcGFkZGluZ0JvdHRvbSgpICsgaG9yaXpv
bnRhbFNjcm9sbGJhckhlaWdodCgpOworCisgICAgc2V0SGVpZ2h0KHRvcCk7CisKKyAgICAvLyBU
aGUgbWFyZ2luIHN0cnVjdCBjYWNoZXMgYWxsIG91ciBjdXJyZW50IG1hcmdpbiBjb2xsYXBzaW5n
IHN0YXRlLiBXZSBydW4gbWFyZ2luIGNvbGxhcHNpbmcgd2hlbiB3ZSBlbmNvdW50ZXIgYW5vbnlt
b3VzIGlubGluZSBibG9ja3MgdGhhdCBhcmUgYmVpbmcgdXNlZAorICAgIC8vIGZvciB0aGUgYmxv
Y2tzLWluc2lkZS1pbmxpbmVzIGNhc2UgKGFuZCB0aGUgaW5saW5lcyBhcmUgZW1wdHkpLCBlLmcs
IDxzcGFuPjxkaXY+T25lPC9kaXY+PC9zcGFuPi4KKyAgICBNYXJnaW5JbmZvIG1hcmdpbkluZm8o
dGhpcywgdG9wLCBib3R0b20pOwogCiAgICAgLy8gRmlndXJlIG91dCBpZiB3ZSBzaG91bGQgY2xl
YXIgb3V0IG91ciBsaW5lIGJveGVzLgogICAgIC8vIEZJWE1FOiBIYW5kbGUgcmVzaXplIGV2ZW50
dWFsbHkhCkBAIC04NTAsMTIgKzU4NCwxNSBAQCB2b2lkIFJlbmRlckJsb2NrOjpsYXlvdXRJbmxp
bmVDaGlsZHJlbihiCiAgICAgICAgICAgICBpZiAoby0+aXNSZXBsYWNlZCgpIHx8IG8tPmlzRmxv
YXRpbmcoKSB8fCBvLT5pc1Bvc2l0aW9uZWQoKSkgewogICAgICAgICAgICAgICAgIFJlbmRlckJv
eCogYm94ID0gdG9SZW5kZXJCb3gobyk7CiAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAg
ICAgaWYgKHJlbGF5b3V0Q2hpbGRyZW4gfHwgby0+c3R5bGUoKS0+d2lkdGgoKS5pc1BlcmNlbnQo
KSB8fCBvLT5zdHlsZSgpLT5oZWlnaHQoKS5pc1BlcmNlbnQoKSkKLSAgICAgICAgICAgICAgICAg
ICAgby0+c2V0Q2hpbGROZWVkc0xheW91dCh0cnVlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAg
ICAgIAorICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBsYXlvdXQgY2hpbGRyZW4gaWYg
dGhleSBuZWVkIGl0LgorICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBUZWNobmljYWxseSBwZXJj
ZW50YWdlIGhlaWdodCBvYmplY3RzIG9ubHkgbmVlZCBhIHJlbGF5b3V0IGlmIHRoZWlyIHBlcmNl
bnRhZ2UgaXNuJ3QgZ29pbmcgdG8gYmUgdHVybmVkIGludG8KKyAgICAgICAgICAgICAgICAvLyBh
biBhdXRvIHZhbHVlLiAgQWRkIGEgbWV0aG9kIHRvIGRldGVybWluZSB0aGlzLCBzbyB0aGF0IHdl
IGNhbiBhdm9pZCB0aGUgcmVsYXlvdXQuCisgICAgICAgICAgICAgICAgaWYgKHJlbGF5b3V0Q2hp
bGRyZW4gfHwgKChib3gtPnN0eWxlKCktPmhlaWdodCgpLmlzUGVyY2VudCgpIHx8IGJveC0+c3R5
bGUoKS0+bWluSGVpZ2h0KCkuaXNQZXJjZW50KCkgfHwgYm94LT5zdHlsZSgpLT5tYXhIZWlnaHQo
KS5pc1BlcmNlbnQoKSkpKQorICAgICAgICAgICAgICAgICAgICBib3gtPnNldENoaWxkTmVlZHNM
YXlvdXQodHJ1ZSwgZmFsc2UpOworCiAgICAgICAgICAgICAgICAgLy8gSWYgcmVsYXlvdXRDaGls
ZHJlbiBpcyBzZXQgYW5kIHdlIGhhdmUgcGVyY2VudGFnZSBwYWRkaW5nLCB3ZSBhbHNvIG5lZWQg
dG8gaW52YWxpZGF0ZSB0aGUgY2hpbGQncyBwcmVmIHdpZHRocy4KLSAgICAgICAgICAgICAgICBp
ZiAocmVsYXlvdXRDaGlsZHJlbiAmJiAoby0+c3R5bGUoKS0+cGFkZGluZ0xlZnQoKS5pc1BlcmNl
bnQoKSB8fCBvLT5zdHlsZSgpLT5wYWRkaW5nUmlnaHQoKS5pc1BlcmNlbnQoKSkpCi0gICAgICAg
ICAgICAgICAgICAgIG8tPnNldFByZWZXaWR0aHNEaXJ0eSh0cnVlLCBmYWxzZSk7CisgICAgICAg
ICAgICAgICAgaWYgKHJlbGF5b3V0Q2hpbGRyZW4gJiYgKGJveC0+c3R5bGUoKS0+cGFkZGluZ0xl
ZnQoKS5pc1BlcmNlbnQoKSB8fCBib3gtPnN0eWxlKCktPnBhZGRpbmdSaWdodCgpLmlzUGVyY2Vu
dCgpKSkKKyAgICAgICAgICAgICAgICAgICAgYm94LT5zZXRQcmVmV2lkdGhzRGlydHkodHJ1ZSwg
ZmFsc2UpOwogICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgaWYgKG8tPmlzUG9zaXRpb25l
ZCgpKQogICAgICAgICAgICAgICAgICAgICBvLT5jb250YWluaW5nQmxvY2soKS0+aW5zZXJ0UG9z
aXRpb25lZE9iamVjdChib3gpOwpAQCAtODY1LDcgKzYwMiw4IEBAIHZvaWQgUmVuZGVyQmxvY2s6
OmxheW91dElubGluZUNoaWxkcmVuKGIKICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZnVs
bExheW91dCB8fCBvLT5uZWVkc0xheW91dCgpKSAvLyBSZXBsYWNlZCBlbGVtZW50cwogICAgICAg
ICAgICAgICAgICAgICAgICAgdG9SZW5kZXJCb3gobyktPmRpcnR5TGluZUJveGVzKGZ1bGxMYXlv
dXQpOwogCi0gICAgICAgICAgICAgICAgICAgIG8tPmxheW91dElmTmVlZGVkKCk7CisgICAgICAg
ICAgICAgICAgICAgIGlmICghby0+aXNSZXBsYWNlZCgpIHx8ICFvLT5pc0Fub255bW91c0lubGlu
ZUJsb2NrKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBvLT5sYXlvdXRJZk5lZWRlZCgpOwog
ICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAoby0+aXNUZXh0KCkgfHwg
KG8tPmlzUmVuZGVySW5saW5lKCkgJiYgIWVuZE9mSW5saW5lKSkgewogICAgICAgICAgICAgICAg
IGhhc0lubGluZUNoaWxkID0gdHJ1ZTsKQEAgLTk2MCw3ICs2OTgsNyBAQCB2b2lkIFJlbmRlckJs
b2NrOjpsYXlvdXRJbmxpbmVDaGlsZHJlbihiCiAgICAgICAgICAgICBpc0xpbmVFbXB0eSA9IHRy
dWU7CiAgICAgICAgICAgICAKICAgICAgICAgICAgIEVDbGVhciBjbGVhciA9IENOT05FOwotICAg
ICAgICAgICAgZW5kID0gZmluZE5leHRMaW5lQnJlYWsocmVzb2x2ZXIsIGZpcnN0TGluZSwgaXNM
aW5lRW1wdHksIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSwgJmNsZWFyKTsKKyAgICAgICAgICAg
IGVuZCA9IGZpbmROZXh0TGluZUJyZWFrKHJlc29sdmVyLCBmaXJzdExpbmUsIGlzTGluZUVtcHR5
LCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHksIG1hcmdpbkluZm8sICZjbGVhcik7CiAgICAgICAg
ICAgICBpZiAocmVzb2x2ZXIucG9zaXRpb24oKS5hdEVuZCgpKSB7CiAgICAgICAgICAgICAgICAg
cmVzb2x2ZXIuZGVsZXRlUnVucygpOwogICAgICAgICAgICAgICAgIGNoZWNrRm9yRmxvYXRzRnJv
bUxhc3RMaW5lID0gdHJ1ZTsKQEAgLTEwMzAsNiArNzY4LDE0IEBAIHZvaWQgUmVuZGVyQmxvY2s6
OmxheW91dElubGluZUNoaWxkcmVuKGIKICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVCb3gp
IHsKICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVCb3gtPnNldEVuZHNXaXRoQnJlYWsocHJl
dmlvdXNMaW5lQnJva2VDbGVhbmx5KTsKIAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYg
b3VyIHByZXZpb3VzIGxpbmUgd2FzIGFuIGFub255bW91cyBibG9jayBhbmQgd2UgYXJlIG5vdCBh
biBhbm9ueW1vdXMgYmxvY2ssIHNpbXVsYXRlIGEgbWFyZ2luIGNvbGxhcHNlIG5vdyBzbyB0aGF0
IHdlIGdldCB0aGUgcHJvcGVyCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNyZWFzZWQg
aGVpZ2h0LiAgV2UgYWxzbyBoYXZlIHRvIHNpbXVsYXRlIGEgbWFyZ2luIGNvbGxhcHNlIHRvIHBy
b3BhZ2F0ZSBtYXJnaW5zIHRocm91Z2ggdG8gdGhlIHRvcCBvZiBvdXIgYmxvY2suCisgICAgICAg
ICAgICAgICAgICAgICAgICBpZiAoIWxpbmVCb3gtPmhhc0Fub255bW91c0lubGluZUJsb2NrKCkp
IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxpbmVCb3gtPnByZXZSb290Qm94
KCkgfHwgbGluZUJveC0+cHJldlJvb3RCb3goKS0+aGFzQW5vbnltb3VzSW5saW5lQmxvY2soKSkK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2VNYXJnaW5zKDAsIG1hcmdp
bkluZm8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbkluZm8uc2V0QXRUb3BP
ZkJsb2NrKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAg
ICAgICAgICAgICAgLy8gTm93IHdlIHBvc2l0aW9uIGFsbCBvZiBvdXIgdGV4dCBydW5zIGhvcml6
b250YWxseS4KICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVIb3Jpem9udGFsUG9zaXRp
b25zRm9yTGluZShsaW5lQm94LCBmaXJzdExpbmUsIHJlc29sdmVyLmZpcnN0UnVuKCksIHRyYWls
aW5nU3BhY2VSdW4sIGVuZC5hdEVuZCgpKTsKIApAQCAtMTE2MSw4ICs5MDcsMTQgQEAgdm9pZCBS
ZW5kZXJCbG9jazo6bGF5b3V0SW5saW5lQ2hpbGRyZW4oYgogICAgICAgICB9CiAgICAgfQogCi0g
ICAgLy8gTm93IGFkZCBpbiB0aGUgYm90dG9tIGJvcmRlci9wYWRkaW5nLgotICAgIHNldEhlaWdo
dChoZWlnaHQoKSArIHRvQWRkKTsKKyAgICAvLyBOb3cgZG8gdGhlIGhhbmRsaW5nIG9mIHRoZSBi
b3R0b20gb2YgdGhlIGJsb2NrLCBhZGRpbmcgaW4gb3VyIGJvdHRvbSBib3JkZXIvcGFkZGluZyBh
bmQKKyAgICAvLyBkZXRlcm1pbmluZyB0aGUgY29ycmVjdCBjb2xsYXBzZWQgYm90dG9tIG1hcmdp
biBpbmZvcm1hdGlvbi4gIFRoaXMgY29sbGFwc2UgaXMgb25seSBuZWNlc3NhcnkKKyAgICAvLyBp
ZiBvdXIgbGFzdCBjaGlsZCB3YXMgYW4gYW5vbnltb3VzIGlubGluZSBibG9jayB0aGF0IG1pZ2h0
IG5lZWQgdG8gcHJvcGFnYXRlIG1hcmdpbiBpbmZvcm1hdGlvbiBvdXQgdG8KKyAgICAvLyB1cy4K
KyAgICBpZiAobGFzdFJvb3RCb3goKSAmJiBsYXN0Um9vdEJveCgpLT5oYXNBbm9ueW1vdXNJbmxp
bmVCbG9jaygpKQorICAgICAgICBoYW5kbGVCb3R0b21PZkJsb2NrKHRvcCwgYm90dG9tLCBtYXJn
aW5JbmZvKTsKKyAgICBlbHNlCisgICAgICAgIHNldEhlaWdodChoZWlnaHQoKSArIGJvdHRvbSk7
CiAKICAgICBpZiAoIWZpcnN0TGluZUJveCgpICYmIGhhc0xpbmVJZkVtcHR5KCkpCiAgICAgICAg
IHNldEhlaWdodChoZWlnaHQoKSArIGxpbmVIZWlnaHQodHJ1ZSwgdHJ1ZSkpOwpAQCAtMTE4Myw2
ICs5MzUsMTIgQEAgUm9vdElubGluZUJveCogUmVuZGVyQmxvY2s6OmRldGVybWluZVN0YQogICAg
IGlmICghZnVsbExheW91dCkgewogICAgICAgICBzaXplX3QgZmxvYXRJbmRleCA9IDA7CiAgICAg
ICAgIGZvciAoY3VyciA9IGZpcnN0Um9vdEJveCgpOyBjdXJyICYmICFjdXJyLT5pc0RpcnR5KCk7
IGN1cnIgPSBjdXJyLT5uZXh0Um9vdEJveCgpKSB7CisgICAgICAgICAgICBpZiAoY3Vyci0+aGFz
QW5vbnltb3VzSW5saW5lQmxvY2soKSkgeworICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBXZSBo
YXZlIHRvIGRvIGJldHRlciB0aGFuIHRoaXMgb3Igd2Ugd2lsbCByZXBhaW50IHRvbyBtdWNoIGFz
IGNvbnRlbnQgaW5zaWRlIGFuCisgICAgICAgICAgICAgICAgLy8gYW5vbnltb3VzIGlubGluZSBi
bG9jayBjb21lcyBpbi4KKyAgICAgICAgICAgICAgICBmdWxsTGF5b3V0ID0gdHJ1ZTsKKyAgICAg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChWZWN0b3I8
UmVuZGVyQm94Kj4qIGNsZWFuTGluZUZsb2F0cyA9IGN1cnItPmZsb2F0c1B0cigpKSB7CiAgICAg
ICAgICAgICAgICAgVmVjdG9yPFJlbmRlckJveCo+OjppdGVyYXRvciBlbmQgPSBjbGVhbkxpbmVG
bG9hdHMtPmVuZCgpOwogICAgICAgICAgICAgICAgIGZvciAoVmVjdG9yPFJlbmRlckJveCo+Ojpp
dGVyYXRvciBvID0gY2xlYW5MaW5lRmxvYXRzLT5iZWdpbigpOyBvICE9IGVuZDsgKytvKSB7CkBA
IC0xNDQ0LDcgKzEyMDIsNyBAQCBzdGF0aWMgYm9vbCBpbmxpbmVGbG93UmVxdWlyZXNMaW5lQm94
KFJlCiAgICAgcmV0dXJuICFmbG93LT5maXJzdENoaWxkKCkgJiYgZmxvdy0+aGFzSG9yaXpvbnRh
bEJvcmRlcnNQYWRkaW5nT3JNYXJnaW4oKTsKIH0KIAotc3RhdGljIGlubGluZSBib29sIHJlcXVp
cmVzTGluZUJveChjb25zdCBJbmxpbmVJdGVyYXRvciYgaXQsIGJvb2wgaXNMaW5lRW1wdHksIGJv
b2wgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KQorYm9vbCBSZW5kZXJCbG9jazo6cmVxdWlyZXNM
aW5lQm94KGNvbnN0IElubGluZUl0ZXJhdG9yJiBpdCwgYm9vbCBpc0xpbmVFbXB0eSwgYm9vbCBw
cmV2aW91c0xpbmVCcm9rZUNsZWFubHkpCiB7CiAgICAgaWYgKGl0Lm9iai0+aXNGbG9hdGluZ09y
UG9zaXRpb25lZCgpKQogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xNTk3LDcgKzEzNTUsNyBA
QCBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHRleHRXaWR0aChSZW5kZXJUCiB9CiAKIElubGluZUl0
ZXJhdG9yIFJlbmRlckJsb2NrOjpmaW5kTmV4dExpbmVCcmVhayhJbmxpbmVCaWRpUmVzb2x2ZXIm
IHJlc29sdmVyLCBib29sIGZpcnN0TGluZSwgIGJvb2wmIGlzTGluZUVtcHR5LCBib29sJiBwcmV2
aW91c0xpbmVCcm9rZUNsZWFubHksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIEVDbGVhciogY2xlYXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgTWFyZ2luSW5mbyYgbWFyZ2luSW5mbywgRUNsZWFyKiBjbGVhcikK
IHsKICAgICBBU1NFUlQocmVzb2x2ZXIucG9zaXRpb24oKS5ibG9jayA9PSB0aGlzKTsKIApAQCAt
MTYzOCw2ICsxMzk2LDExIEBAIElubGluZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpmaW5kTmV4dExp
bmUKICAgICBib29sIGF1dG9XcmFwV2FzRXZlclRydWVPbkxpbmUgPSBmYWxzZTsKICAgICBib29s
IGZsb2F0c0ZpdE9uTGluZSA9IHRydWU7CiAgICAgCisgICAgYm9vbCBpc0Jsb2NrSW5zaWRlSW5s
aW5lID0gZmFsc2U7CisgICAgCisgICAgaW50IHByZXZpb3VzQmxvY2tGbG9hdEJvdHRvbSA9IDA7
CisgICAgaW50IG1heEJsb2NrRmxvYXRCb3R0b20gPSAwOworCiAgICAgLy8gRmlyZWZveCBhbmQg
T3BlcmEgd2lsbCBhbGxvdyBhIHRhYmxlIGNlbGwgdG8gZ3JvdyB0byBmaXQgYW4gaW1hZ2UgaW5z
aWRlIGl0IHVuZGVyCiAgICAgLy8gdmVyeSBzcGVjaWZpYyBjaXJjdW1zdGFuY2VzIChpbiBvcmRl
ciB0byBtYXRjaCBjb21tb24gV2luSUUgcmVuZGVyaW5ncykuIAogICAgIC8vIE5vdCBzdXBwb3J0
aW5nIHRoZSBxdWlyayBoYXMgY2F1c2VkIHVzIHRvIG1pcy1yZW5kZXIgc29tZSByZWFsIHNpdGVz
LiAoU2VlIEJ1Z3ppbGxhIDEwNTE3LikgCkBAIC0xNjQ4LDcgKzE0MTEsOCBAQCBJbmxpbmVJdGVy
YXRvciBSZW5kZXJCbG9jazo6ZmluZE5leHRMaW5lCiAgICAgd2hpbGUgKG8pIHsKICAgICAgICAg
Y3VycldTID0gby0+aXNSZXBsYWNlZCgpID8gby0+cGFyZW50KCktPnN0eWxlKCktPndoaXRlU3Bh
Y2UoKSA6IG8tPnN0eWxlKCktPndoaXRlU3BhY2UoKTsKICAgICAgICAgbGFzdFdTID0gbGFzdC0+
aXNSZXBsYWNlZCgpID8gbGFzdC0+cGFyZW50KCktPnN0eWxlKCktPndoaXRlU3BhY2UoKSA6IGxh
c3QtPnN0eWxlKCktPndoaXRlU3BhY2UoKTsKLSAgICAgICAgCisgICAgICAgIGlzQmxvY2tJbnNp
ZGVJbmxpbmUgPSBvLT5pc0Fub255bW91c0lubGluZUJsb2NrKCk7CisKICAgICAgICAgYm9vbCBh
dXRvV3JhcCA9IFJlbmRlclN0eWxlOjphdXRvV3JhcChjdXJyV1MpOwogICAgICAgICBhdXRvV3Jh
cFdhc0V2ZXJUcnVlT25MaW5lID0gYXV0b1dyYXBXYXNFdmVyVHJ1ZU9uTGluZSB8fCBhdXRvV3Jh
cDsKIApAQCAtMTY1OSw3ICsxNDIzLDcgQEAgSW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6OmZp
bmROZXh0TGluZQogI2VuZGlmCiAKICAgICAgICAgYm9vbCBjb2xsYXBzZVdoaXRlU3BhY2UgPSBS
ZW5kZXJTdHlsZTo6Y29sbGFwc2VXaGl0ZVNwYWNlKGN1cnJXUyk7Ci0gICAgICAgICAgICAKKwog
ICAgICAgICBpZiAoby0+aXNCUigpKSB7CiAgICAgICAgICAgICBpZiAodyArIHRtcFcgPD0gd2lk
dGgpIHsKICAgICAgICAgICAgICAgICBsQnJlYWsub2JqID0gbzsKQEAgLTE3NjYsOCArMTUzMCw5
IEBAIElubGluZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpmaW5kTmV4dExpbmUKICAgICAgICAgfSBl
bHNlIGlmIChvLT5pc1JlcGxhY2VkKCkpIHsKICAgICAgICAgICAgIFJlbmRlckJveCogcmVwbGFj
ZWRCb3ggPSB0b1JlbmRlckJveChvKTsKIAotICAgICAgICAgICAgLy8gQnJlYWsgb24gcmVwbGFj
ZWQgZWxlbWVudHMgaWYgZWl0aGVyIGhhcyBub3JtYWwgd2hpdGUtc3BhY2UuCi0gICAgICAgICAg
ICBpZiAoKGF1dG9XcmFwIHx8IFJlbmRlclN0eWxlOjphdXRvV3JhcChsYXN0V1MpKSAmJiAoIW8t
PmlzSW1hZ2UoKSB8fCBhbGxvd0ltYWdlc1RvQnJlYWspKSB7CisgICAgICAgICAgICAvLyBCcmVh
ayBvbiByZXBsYWNlZCBlbGVtZW50cyBpZiBlaXRoZXIgaGFzIG5vcm1hbCB3aGl0ZS1zcGFjZS4g
IFdlIGFsc28gYWx3YXlzIGJyZWFrIGlmIHdlCisgICAgICAgICAgICAvLyBlbmNvdW50ZXIgYSBz
cGVjaWFsIGFub255bW91cyBpbmxpbmUgYmxvY2sgKHVzZWQgdG8gaG9sZCBibG9ja3MgaW5zaWRl
IGlubGluZXMpLgorICAgICAgICAgICAgaWYgKChhdXRvV3JhcCB8fCBSZW5kZXJTdHlsZTo6YXV0
b1dyYXAobGFzdFdTKSB8fCBpc0Jsb2NrSW5zaWRlSW5saW5lKSAgJiYgKCFvLT5pc0ltYWdlKCkg
fHwgYWxsb3dJbWFnZXNUb0JyZWFrKSkgewogICAgICAgICAgICAgICAgIHcgKz0gdG1wVzsKICAg
ICAgICAgICAgICAgICB0bXBXID0gMDsKICAgICAgICAgICAgICAgICBsQnJlYWsub2JqID0gbzsK
QEAgLTE3NzUsNiArMTU0MCwxOSBAQCBJbmxpbmVJdGVyYXRvciBSZW5kZXJCbG9jazo6ZmluZE5l
eHRMaW5lCiAgICAgICAgICAgICAgICAgbEJyZWFrLm5leHRCcmVha2FibGVQb3NpdGlvbiA9IC0x
OwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAoaXNCbG9ja0luc2lkZUlubGluZSkg
eworICAgICAgICAgICAgICAgIGlmICghaXNMaW5lRW1wdHkpCisgICAgICAgICAgICAgICAgICAg
IGdvdG8gZW5kOworCisgICAgICAgICAgICAgICAgLy8gUmVzZXQgdGhlIHdpZHRoIHRvIGlnbm9y
ZSBmbG9hdHMsIHNpbmNlIHdlJ3JlIGdvaW5nIHRvIGFsbG93IHRoZW0gdG8gaW50cnVkZSBpbnRv
IG91ciBzcGFjZS4KKyAgICAgICAgICAgICAgICB3aWR0aCA9IHJpZ2h0T2Zmc2V0KCkgLSBsZWZ0
T2Zmc2V0KCk7CisKKyAgICAgICAgICAgICAgICAvLyBGSVhNRTogVGhpcyBjYWxsIHdpbGwgdXBk
YXRlIHRoZSBoZWlnaHQgb2Ygb3VyIGJsb2NrLiAgSXQncyBub3QgY2xlYXIgaWYgdGhhdCdzIGdv
aW5nIHRvIGJlIG9rIG9yIG5vdCB5ZXQuCisgICAgICAgICAgICAgICAgbGF5b3V0QmxvY2tDaGls
ZChyZXBsYWNlZEJveCwgbWFyZ2luSW5mbywgcHJldmlvdXNCbG9ja0Zsb2F0Qm90dG9tLCBtYXhC
bG9ja0Zsb2F0Qm90dG9tKTsKKworICAgICAgICAgICAgICAgIGxpbmVNaWRwb2ludFN0YXRlLmJl
dHdlZW5NaWRwb2ludHMgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYg
KGlnbm9yaW5nU3BhY2VzKQogICAgICAgICAgICAgICAgIGFkZE1pZHBvaW50KGxpbmVNaWRwb2lu
dFN0YXRlLCBJbmxpbmVJdGVyYXRvcigwLCBvLCAwKSk7CiAKQEAgLTE3OTgsNiArMTU3NiwxNSBA
QCBJbmxpbmVJdGVyYXRvciBSZW5kZXJCbG9jazo6ZmluZE5leHRMaW5lCiAgICAgICAgICAgICAg
ICAgICAgIHRtcFcgKz0gcmVwbGFjZWRCb3gtPndpZHRoKCkgKyByZXBsYWNlZEJveC0+bWFyZ2lu
TGVmdCgpICsgcmVwbGFjZWRCb3gtPm1hcmdpblJpZ2h0KCkgKyBpbmxpbmVXaWR0aChvKTsKICAg
ICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgIHRtcFcgKz0gcmVwbGFjZWRCb3gtPndp
ZHRoKCkgKyByZXBsYWNlZEJveC0+bWFyZ2luTGVmdCgpICsgcmVwbGFjZWRCb3gtPm1hcmdpblJp
Z2h0KCkgKyBpbmxpbmVXaWR0aChvKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGlm
IChpc0Jsb2NrSW5zaWRlSW5saW5lKSB7CisgICAgICAgICAgICAgICAgdyArPSB0bXBXOworICAg
ICAgICAgICAgICAgIHRtcFcgPSAwOworICAgICAgICAgICAgICAgIGxCcmVhay5vYmogPSBvOwor
ICAgICAgICAgICAgICAgIGxCcmVhay5wb3MgPSAwOworICAgICAgICAgICAgICAgIGxCcmVhay5u
ZXh0QnJlYWthYmxlUG9zaXRpb24gPSAtMTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAg
ICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChvLT5pc1RleHQoKSkgewogICAgICAgICAg
ICAgaWYgKCFwb3MpCiAgICAgICAgICAgICAgICAgYXBwbGllZFN0YXJ0V2lkdGggPSBmYWxzZTsK
QEAgLTIxODQsNyArMTk3MSw3IEBAIElubGluZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpmaW5kTmV4
dExpbmUKICAgICAgICAgfQogICAgICAgICAvL2Vsc2UgaWYgKGxCcmVhay5wb3MgPiAwKQogICAg
ICAgICAvLyAgICBsQnJlYWsucG9zLS07Ci0gICAgICAgIGVsc2UgaWYgKGxCcmVhay5vYmogPT0g
MCAmJiB0cmFpbGluZ1NwYWNlT2JqZWN0LT5pc1RleHQoKSkgeworICAgICAgICBlbHNlIGlmICgo
IWxCcmVhay5vYmogfHwgbEJyZWFrLm9iai0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKSAmJiB0
cmFpbGluZ1NwYWNlT2JqZWN0LT5pc1RleHQoKSkgewogICAgICAgICAgICAgLy8gQWRkIGEgbmV3
IGVuZCBtaWRwb2ludCB0aGF0IHN0b3BzIHJpZ2h0IGF0IHRoZSB2ZXJ5IGVuZC4KICAgICAgICAg
ICAgIFJlbmRlclRleHQqIHRleHQgPSB0b1JlbmRlclRleHQodHJhaWxpbmdTcGFjZU9iamVjdCk7
CiAgICAgICAgICAgICB1bnNpZ25lZCBsZW5ndGggPSB0ZXh0LT50ZXh0TGVuZ3RoKCk7CkluZGV4
OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCb3guY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUv
cmVuZGVyaW5nL1JlbmRlckJveC5jcHAJKHJldmlzaW9uIDU0NTYxKQorKysgV2ViQ29yZS9yZW5k
ZXJpbmcvUmVuZGVyQm94LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTMzNCw3ICsxMzM0LDcgQEAg
dm9pZCBSZW5kZXJCb3g6OmNhbGNXaWR0aCgpCiAgICAgfQogCiAgICAgaWYgKGNvbnRhaW5lcldp
ZHRoICYmIGNvbnRhaW5lcldpZHRoICE9ICh3aWR0aCgpICsgbV9tYXJnaW5MZWZ0ICsgbV9tYXJn
aW5SaWdodCkKLSAgICAgICAgICAgICYmICFpc0Zsb2F0aW5nKCkgJiYgIWlzSW5saW5lKCkgJiYg
IWNiLT5pc0ZsZXhpYmxlQm94KCkpIHsKKyAgICAgICAgICAgICYmICFpc0Zsb2F0aW5nKCkgJiYg
KCFpc0lubGluZSgpIHx8IGlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkgJiYgIWNiLT5pc0ZsZXhp
YmxlQm94KCkpIHsKICAgICAgICAgaWYgKGNiLT5zdHlsZSgpLT5kaXJlY3Rpb24oKSA9PSBMVFIp
CiAgICAgICAgICAgICBtX21hcmdpblJpZ2h0ID0gY29udGFpbmVyV2lkdGggLSB3aWR0aCgpIC0g
bV9tYXJnaW5MZWZ0OwogICAgICAgICBlbHNlCkBAIC0xMzczLDcgKzEzNzMsNyBAQCBib29sIFJl
bmRlckJveDo6c2l6ZXNUb0ludHJpbnNpY1dpZHRoKFdpCiB7CiAgICAgLy8gTWFycXVlZXMgaW4g
V2luSUUgYXJlIGxpa2UgYSBtaXh0dXJlIG9mIGJsb2NrcyBhbmQgaW5saW5lLWJsb2Nrcy4gIFRo
ZXkgc2l6ZSBhcyB0aG91Z2ggdGhleSdyZSBibG9ja3MsCiAgICAgLy8gYnV0IHRoZXkgYWxsb3cg
dGV4dCB0byBzaXQgb24gdGhlIHNhbWUgbGluZSBhcyB0aGUgbWFycXVlZS4KLSAgICBpZiAoaXNG
bG9hdGluZygpIHx8IChpc0lubGluZUJsb2NrT3JJbmxpbmVUYWJsZSgpICYmICFpc0hUTUxNYXJx
dWVlKCkpKQorICAgIGlmIChpc0Zsb2F0aW5nKCkgfHwgKGlzSW5saW5lQmxvY2tPcklubGluZVRh
YmxlKCkgJiYgIWlzSFRNTE1hcnF1ZWUoKSAmJiAhaXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKSkK
ICAgICAgICAgcmV0dXJuIHRydWU7CiAKICAgICAvLyBUaGlzIGNvZGUgbWF5IGxvb2sgYSBiaXQg
c3RyYW5nZS4gIEJhc2ljYWxseSB3aWR0aDppbnRyaW5zaWMgc2hvdWxkIGNsYW1wIHRoZSBzaXpl
IHdoZW4gdGVzdGluZyBib3RoCkBAIC0yODE5LDcgKzI4MTksNyBAQCBib29sIFJlbmRlckJveDo6
c2hyaW5rVG9Bdm9pZEZsb2F0cygpIGNvCiAKIGJvb2wgUmVuZGVyQm94Ojphdm9pZHNGbG9hdHMo
KSBjb25zdAogewotICAgIHJldHVybiBpc1JlcGxhY2VkKCkgfHwgaGFzT3ZlcmZsb3dDbGlwKCkg
fHwgaXNIUigpOworICAgIHJldHVybiAhaXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpICYmIChpc1Jl
cGxhY2VkKCkgfHwgaGFzT3ZlcmZsb3dDbGlwKCkgfHwgaXNIUigpKTsKIH0KIAogdm9pZCBSZW5k
ZXJCb3g6OmFkZFNoYWRvd092ZXJmbG93KCkKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRl
ckJveE1vZGVsT2JqZWN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5k
ZXJCb3hNb2RlbE9iamVjdC5jcHAJKHJldmlzaW9uIDU0NTYxKQorKysgV2ViQ29yZS9yZW5kZXJp
bmcvUmVuZGVyQm94TW9kZWxPYmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01MTEsOCArNTEx
LDkgQEAgdm9pZCBSZW5kZXJCb3hNb2RlbE9iamVjdDo6cGFpbnRGaWxsTGF5ZQogICAgICAgICAv
LyBOb3cgYWRkIHRoZSB0ZXh0IHRvIHRoZSBjbGlwLiAgV2UgZG8gdGhpcyBieSBwYWludGluZyB1
c2luZyBhIHNwZWNpYWwgcGFpbnQgcGhhc2UgdGhhdCBzaWduYWxzIHRvCiAgICAgICAgIC8vIElu
bGluZVRleHRCb3hlcyB0aGF0IHRoZXkgc2hvdWxkIGp1c3QgYWRkIHRoZWlyIGNvbnRlbnRzIHRv
IHRoZSBjbGlwLgogICAgICAgICBQYWludEluZm8gaW5mbyhtYXNrSW1hZ2VDb250ZXh0LCBtYXNr
UmVjdCwgUGFpbnRQaGFzZVRleHRDbGlwLCB0cnVlLCAwLCAwKTsKKyAgICAgICAgTGluZUJveFBh
aW50SW5mbyBsaW5lQm94SW5mbzsKICAgICAgICAgaWYgKGJveCkKLSAgICAgICAgICAgIGJveC0+
cGFpbnQoaW5mbywgdHggLSBib3gtPngoKSwgdHkgLSBib3gtPnkoKSk7CisgICAgICAgICAgICBi
b3gtPnBhaW50KGluZm8sIHR4IC0gYm94LT54KCksIHR5IC0gYm94LT55KCksIGxpbmVCb3hJbmZv
KTsKICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICBpbnQgeCA9IGlzQm94KCkgPyB0b1JlbmRl
ckJveCh0aGlzKS0+eCgpIDogMDsKICAgICAgICAgICAgIGludCB5ID0gaXNCb3goKSA/IHRvUmVu
ZGVyQm94KHRoaXMpLT55KCkgOiAwOwpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVySW5s
aW5lLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJJbmxpbmUuY3Bw
CShyZXZpc2lvbiA1NDU2MSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlcklubGluZS5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTQ0LDcgKzQ0LDYgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogCiBS
ZW5kZXJJbmxpbmU6OlJlbmRlcklubGluZShOb2RlKiBub2RlKQogICAgIDogUmVuZGVyQm94TW9k
ZWxPYmplY3Qobm9kZSkKLSAgICAsIG1fY29udGludWF0aW9uKDApCiAgICAgLCBtX2xpbmVIZWln
aHQoLTEpCiAgICAgLCBtX3ZlcnRpY2FsUG9zaXRpb24oUG9zaXRpb25VbmRlZmluZWQpCiB7CkBA
IC01NiwxNCArNTUsNiBAQCB2b2lkIFJlbmRlcklubGluZTo6ZGVzdHJveSgpCiAgICAgLy8gTWFr
ZSBzdXJlIHRvIGRlc3Ryb3kgYW5vbnltb3VzIGNoaWxkcmVuIGZpcnN0IHdoaWxlIHRoZXkgYXJl
IHN0aWxsIGNvbm5lY3RlZCB0byB0aGUgcmVzdCBvZiB0aGUgdHJlZSwgc28gdGhhdCB0aGV5IHdp
bGwKICAgICAvLyBwcm9wZXJseSBkaXJ0eSBsaW5lIGJveGVzIHRoYXQgdGhleSBhcmUgcmVtb3Zl
ZCBmcm9tLiAgRWZmZWN0cyB0aGF0IGRvIDpiZWZvcmUvOmFmdGVyIG9ubHkgb24gaG92ZXIgY291
bGQgY3Jhc2ggb3RoZXJ3aXNlLgogICAgIGNoaWxkcmVuKCktPmRlc3Ryb3lMZWZ0b3ZlckNoaWxk
cmVuKCk7Ci0KLSAgICAvLyBEZXN0cm95IG91ciBjb250aW51YXRpb24gYmVmb3JlIGFueXRoaW5n
IG90aGVyIHRoYW4gYW5vbnltb3VzIGNoaWxkcmVuLgotICAgIC8vIFRoZSByZWFzb24gd2UgZG9u
J3QgZGVzdHJveSBpdCBiZWZvcmUgYW5vbnltb3VzIGNoaWxkcmVuIGlzIHRoYXQgdGhleSBtYXkK
LSAgICAvLyBoYXZlIGNvbnRpbnVhdGlvbnMgb2YgdGhlaXIgb3duIHRoYXQgYXJlIGFub255bW91
cyBjaGlsZHJlbiBvZiBvdXIgY29udGludWF0aW9uLgotICAgIGlmIChtX2NvbnRpbnVhdGlvbikg
ewotICAgICAgICBtX2NvbnRpbnVhdGlvbi0+ZGVzdHJveSgpOwotICAgICAgICBtX2NvbnRpbnVh
dGlvbiA9IDA7Ci0gICAgfQogICAgIAogICAgIGlmICghZG9jdW1lbnRCZWluZ0Rlc3Ryb3llZCgp
KSB7CiAgICAgICAgIGlmIChmaXJzdExpbmVCb3goKSkgewpAQCAtOTIsMTMgKzgzLDYgQEAgdm9p
ZCBSZW5kZXJJbmxpbmU6OmRlc3Ryb3koKQogICAgIFJlbmRlckJveE1vZGVsT2JqZWN0OjpkZXN0
cm95KCk7CiB9CiAKLVJlbmRlcklubGluZSogUmVuZGVySW5saW5lOjppbmxpbmVDb250aW51YXRp
b24oKSBjb25zdAotewotICAgIGlmICghbV9jb250aW51YXRpb24gfHwgbV9jb250aW51YXRpb24t
PmlzSW5saW5lKCkpCi0gICAgICAgIHJldHVybiB0b1JlbmRlcklubGluZShtX2NvbnRpbnVhdGlv
bik7Ci0gICAgcmV0dXJuIHRvUmVuZGVyQmxvY2sobV9jb250aW51YXRpb24pLT5pbmxpbmVDb250
aW51YXRpb24oKTsKLX0KLQogdm9pZCBSZW5kZXJJbmxpbmU6OnVwZGF0ZUJveE1vZGVsSW5mb0Zy
b21TdHlsZSgpCiB7CiAgICAgUmVuZGVyQm94TW9kZWxPYmplY3Q6OnVwZGF0ZUJveE1vZGVsSW5m
b0Zyb21TdHlsZSgpOwpAQCAtMTE0LDE5ICs5OCw2IEBAIHZvaWQgUmVuZGVySW5saW5lOjpzdHls
ZURpZENoYW5nZShTdHlsZUQKIHsKICAgICBSZW5kZXJCb3hNb2RlbE9iamVjdDo6c3R5bGVEaWRD
aGFuZ2UoZGlmZiwgb2xkU3R5bGUpOwogCi0gICAgLy8gRW5zdXJlIHRoYXQgYWxsIG9mIHRoZSBz
cGxpdCBpbmxpbmVzIHBpY2sgdXAgdGhlIG5ldyBzdHlsZS4gV2UKLSAgICAvLyBvbmx5IGRvIHRo
aXMgaWYgd2UncmUgYW4gaW5saW5lLCBzaW5jZSB3ZSBkb24ndCB3YW50IHRvIHByb3BhZ2F0ZQot
ICAgIC8vIGEgYmxvY2sncyBzdHlsZSB0byB0aGUgb3RoZXIgaW5saW5lcy4KLSAgICAvLyBlLmcu
LCA8Zm9udD5mb28gPGg0PmdvbzwvaDQ+IG1vbzwvZm9udD4uICBUaGUgPGZvbnQ+IGlubGluZXMg
YmVmb3JlCi0gICAgLy8gYW5kIGFmdGVyIHRoZSBibG9jayBzaGFyZSB0aGUgc2FtZSBzdHlsZSwg
YnV0IHRoZSBibG9jayBkb2Vzbid0Ci0gICAgLy8gbmVlZCB0byBwYXNzIGl0cyBzdHlsZSBvbiB0
byBhbnlvbmUgZWxzZS4KLSAgICBmb3IgKFJlbmRlcklubGluZSogY3VyckNvbnQgPSBpbmxpbmVD
b250aW51YXRpb24oKTsgY3VyckNvbnQ7IGN1cnJDb250ID0gY3VyckNvbnQtPmlubGluZUNvbnRp
bnVhdGlvbigpKSB7Ci0gICAgICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBuZXh0Q29udCA9IGN1
cnJDb250LT5jb250aW51YXRpb24oKTsKLSAgICAgICAgY3VyckNvbnQtPnNldENvbnRpbnVhdGlv
bigwKTsKLSAgICAgICAgY3VyckNvbnQtPnNldFN0eWxlKHN0eWxlKCkpOwotICAgICAgICBjdXJy
Q29udC0+c2V0Q29udGludWF0aW9uKG5leHRDb250KTsKLSAgICB9Ci0KICAgICBtX2xpbmVIZWln
aHQgPSAtMTsKIAogICAgIC8vIFVwZGF0ZSBwc2V1ZG9zIGZvciA6YmVmb3JlIGFuZCA6YWZ0ZXIg
bm93LgpAQCAtMTM2LDc5ICsxMDcsNzMgQEAgdm9pZCBSZW5kZXJJbmxpbmU6OnN0eWxlRGlkQ2hh
bmdlKFN0eWxlRAogICAgIH0KIH0KIAotdm9pZCBSZW5kZXJJbmxpbmU6OmFkZENoaWxkKFJlbmRl
ck9iamVjdCogbmV3Q2hpbGQsIFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQpCi17Ci0gICAgaWYg
KGNvbnRpbnVhdGlvbigpKQotICAgICAgICByZXR1cm4gYWRkQ2hpbGRUb0NvbnRpbnVhdGlvbihu
ZXdDaGlsZCwgYmVmb3JlQ2hpbGQpOwotICAgIHJldHVybiBhZGRDaGlsZElnbm9yaW5nQ29udGlu
dWF0aW9uKG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7Ci19Ci0KLXN0YXRpYyBSZW5kZXJCb3hNb2Rl
bE9iamVjdCogbmV4dENvbnRpbnVhdGlvbihSZW5kZXJPYmplY3QqIHJlbmRlcmVyKQordm9pZCBS
ZW5kZXJJbmxpbmU6OmNoaWxkQmVjYW1lTm9uSW5saW5lKFJlbmRlck9iamVjdCogY2hpbGQpCiB7
Ci0gICAgaWYgKHJlbmRlcmVyLT5pc0lubGluZSgpICYmICFyZW5kZXJlci0+aXNSZXBsYWNlZCgp
KQotICAgICAgICByZXR1cm4gdG9SZW5kZXJJbmxpbmUocmVuZGVyZXIpLT5jb250aW51YXRpb24o
KTsKLSAgICByZXR1cm4gdG9SZW5kZXJCbG9jayhyZW5kZXJlciktPmlubGluZUNvbnRpbnVhdGlv
bigpOworICAgIFJlbmRlck9iamVjdCogbmV4dCA9IGNoaWxkLT5uZXh0U2libGluZygpOworICAg
IHJlbW92ZUNoaWxkKGNoaWxkKTsKKyAgICBhZGRDaGlsZChjaGlsZCwgbmV4dCk7CiB9CiAKLVJl
bmRlckJveE1vZGVsT2JqZWN0KiBSZW5kZXJJbmxpbmU6OmNvbnRpbnVhdGlvbkJlZm9yZShSZW5k
ZXJPYmplY3QqIGJlZm9yZUNoaWxkKQotewotICAgIGlmIChiZWZvcmVDaGlsZCAmJiBiZWZvcmVD
aGlsZC0+cGFyZW50KCkgPT0gdGhpcykKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0KLSAgICBSZW5k
ZXJCb3hNb2RlbE9iamVjdCogY3VyciA9IG5leHRDb250aW51YXRpb24odGhpcyk7Ci0gICAgUmVu
ZGVyQm94TW9kZWxPYmplY3QqIG5leHRUb0xhc3QgPSB0aGlzOwotICAgIFJlbmRlckJveE1vZGVs
T2JqZWN0KiBsYXN0ID0gdGhpczsKLSAgICB3aGlsZSAoY3VycikgewotICAgICAgICBpZiAoYmVm
b3JlQ2hpbGQgJiYgYmVmb3JlQ2hpbGQtPnBhcmVudCgpID09IGN1cnIpIHsKLSAgICAgICAgICAg
IGlmIChjdXJyLT5maXJzdENoaWxkKCkgPT0gYmVmb3JlQ2hpbGQpCi0gICAgICAgICAgICAgICAg
cmV0dXJuIGxhc3Q7Ci0gICAgICAgICAgICByZXR1cm4gY3VycjsKLSAgICAgICAgfQotCi0gICAg
ICAgIG5leHRUb0xhc3QgPSBsYXN0OwotICAgICAgICBsYXN0ID0gY3VycjsKLSAgICAgICAgY3Vy
ciA9IG5leHRDb250aW51YXRpb24oY3Vycik7Ci0gICAgfQotCi0gICAgaWYgKCFiZWZvcmVDaGls
ZCAmJiAhbGFzdC0+Zmlyc3RDaGlsZCgpKQotICAgICAgICByZXR1cm4gbmV4dFRvTGFzdDsKLSAg
ICByZXR1cm4gbGFzdDsKLX0KLQotdm9pZCBSZW5kZXJJbmxpbmU6OmFkZENoaWxkSWdub3JpbmdD
b250aW51YXRpb24oUmVuZGVyT2JqZWN0KiBuZXdDaGlsZCwgUmVuZGVyT2JqZWN0KiBiZWZvcmVD
aGlsZCkKK3ZvaWQgUmVuZGVySW5saW5lOjphZGRDaGlsZChSZW5kZXJPYmplY3QqIG5ld0NoaWxk
LCBSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkKQogewogICAgIC8vIE1ha2Ugc3VyZSB3ZSBkb24n
dCBhcHBlbmQgdGhpbmdzIGFmdGVyIDphZnRlci1nZW5lcmF0ZWQgY29udGVudCBpZiB3ZSBoYXZl
IGl0LgogICAgIGlmICghYmVmb3JlQ2hpbGQgJiYgaXNBZnRlckNvbnRlbnQobGFzdENoaWxkKCkp
KQogICAgICAgICBiZWZvcmVDaGlsZCA9IGxhc3RDaGlsZCgpOwogCi0gICAgaWYgKCFuZXdDaGls
ZC0+aXNJbmxpbmUoKSAmJiAhbmV3Q2hpbGQtPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSkgewot
ICAgICAgICAvLyBXZSBhcmUgcGxhY2luZyBhIGJsb2NrIGluc2lkZSBhbiBpbmxpbmUuIFdlIGhh
dmUgdG8gcGVyZm9ybSBhIHNwbGl0IG9mIHRoaXMKLSAgICAgICAgLy8gaW5saW5lIGludG8gY29u
dGludWF0aW9ucy4gIFRoaXMgaW52b2x2ZXMgY3JlYXRpbmcgYW4gYW5vbnltb3VzIGJsb2NrIGJv
eCB0byBob2xkCi0gICAgICAgIC8vIHxuZXdDaGlsZHwuICBXZSB0aGVuIG1ha2UgdGhhdCBibG9j
ayBib3ggYSBjb250aW51YXRpb24gb2YgdGhpcyBpbmxpbmUuICBXZSB0YWtlIGFsbCBvZgotICAg
ICAgICAvLyB0aGUgY2hpbGRyZW4gYWZ0ZXIgfGJlZm9yZUNoaWxkfCBhbmQgcHV0IHRoZW0gaW4g
YSBjbG9uZSBvZiB0aGlzIG9iamVjdC4KLSAgICAgICAgUmVmUHRyPFJlbmRlclN0eWxlPiBuZXdT
dHlsZSA9IFJlbmRlclN0eWxlOjpjcmVhdGUoKTsKLSAgICAgICAgbmV3U3R5bGUtPmluaGVyaXRG
cm9tKHN0eWxlKCkpOwotICAgICAgICBuZXdTdHlsZS0+c2V0RGlzcGxheShCTE9DSyk7Ci0KLSAg
ICAgICAgUmVuZGVyQmxvY2sqIG5ld0JveCA9IG5ldyAocmVuZGVyQXJlbmEoKSkgUmVuZGVyQmxv
Y2soZG9jdW1lbnQoKSAvKiBhbm9ueW1vdXMgYm94ICovKTsKLSAgICAgICAgbmV3Qm94LT5zZXRT
dHlsZShuZXdTdHlsZS5yZWxlYXNlKCkpOwotICAgICAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCog
b2xkQ29udGludWF0aW9uID0gY29udGludWF0aW9uKCk7Ci0gICAgICAgIHNldENvbnRpbnVhdGlv
bihuZXdCb3gpOwotCi0gICAgICAgIC8vIFNvbWVvbmUgbWF5IGhhdmUgcHV0IGEgPHA+IGluc2lk
ZSBhIDxxPiwgY2F1c2luZyBhIHNwbGl0LiAgV2hlbiB0aGlzIGhhcHBlbnMsIHRoZSA6YWZ0ZXIg
Y29udGVudAotICAgICAgICAvLyBoYXMgdG8gbW92ZSBpbnRvIHRoZSBpbmxpbmUgY29udGludWF0
aW9uLiAgQ2FsbCB1cGRhdGVCZWZvcmVBZnRlckNvbnRlbnQgdG8gZW5zdXJlIHRoYXQgb3VyIDph
ZnRlcgotICAgICAgICAvLyBjb250ZW50IGdldHMgcHJvcGVybHkgZGVzdHJveWVkLgotICAgICAg
ICBib29sIGlzTGFzdENoaWxkID0gKGJlZm9yZUNoaWxkID09IGxhc3RDaGlsZCgpKTsKLSAgICAg
ICAgaWYgKGRvY3VtZW50KCktPnVzZXNCZWZvcmVBZnRlclJ1bGVzKCkpCi0gICAgICAgICAgICBj
aGlsZHJlbigpLT51cGRhdGVCZWZvcmVBZnRlckNvbnRlbnQodGhpcywgQUZURVIpOwotICAgICAg
ICBpZiAoaXNMYXN0Q2hpbGQgJiYgYmVmb3JlQ2hpbGQgIT0gbGFzdENoaWxkKCkpCi0gICAgICAg
ICAgICBiZWZvcmVDaGlsZCA9IDA7IC8vIFdlIGRlc3Ryb3llZCB0aGUgbGFzdCBjaGlsZCwgc28g
bm93IHdlIG5lZWQgdG8gdXBkYXRlIG91ciBpbnNlcnRpb24KLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgLy8gcG9pbnQgdG8gYmUgMC4gIEl0J3MganVzdCBhIHN0cmFpZ2h0IGFwcGVuZCBu
b3cuCi0KLSAgICAgICAgc3BsaXRGbG93KGJlZm9yZUNoaWxkLCBuZXdCb3gsIG5ld0NoaWxkLCBv
bGRDb250aW51YXRpb24pOworICAgIC8vIElmIHRoZSByZXF1ZXN0ZWQgYmVmb3JlQ2hpbGQgaXMg
bm90IG9uZSBvZiBvdXIgY2hpbGRyZW4sIHRoZW4gdGhpcyBpcyBtb3N0IGxpa2VseSBiZWNhdXNl
CisgICAgLy8gdGhlcmUgaXMgYW4gYW5vbnltb3VzIGlubGluZS1ibG9jayBib3ggd2l0aGluIHRo
aXMgb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIGJlZm9yZUNoaWxkLiBTbworICAgIC8vIGp1c3Qg
aW5zZXJ0IHRoZSBjaGlsZCBpbnRvIHRoZSBhbm9ueW1vdXMgaW5saW5lLWJsb2NrIGJveCBpbnN0
ZWFkIG9mIGhlcmUuCisgICAgLy8gQSBzZWNvbmQgcG9zc2liaWxpdHkgaXMgdGhhdCB0aGUgYmVm
b3JlQ2hpbGQgaXMgYW4gYW5vbnltb3VzIGJsb2NrIGluc2lkZSB0aGUgYW5vbnltb3VzIGlubGlu
ZSBibG9jay4KKyAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgaW5saW5lcyBhcmUgaW5zZXJ0ZWQg
aW4gYmV0d2VlbiB0d28gb2YgdGhlIGFub255bW91cyBpbmxpbmUgYmxvY2sncyBibG9jay1sZXZl
bAorICAgIC8vIGNoaWxkcmVuIGFmdGVyIGl0IGhhcyBiZWVuIGNyZWF0ZWQuCisgICAgaWYgKGJl
Zm9yZUNoaWxkICYmIGJlZm9yZUNoaWxkLT5wYXJlbnQoKSAhPSB0aGlzKSB7CisgICAgICAgIEFT
U0VSVChiZWZvcmVDaGlsZC0+cGFyZW50KCkpOworICAgICAgICBBU1NFUlQoYmVmb3JlQ2hpbGQt
PnBhcmVudCgpLT5pc0Fub255bW91c0lubGluZUJsb2NrKCkgfHwgYmVmb3JlQ2hpbGQtPnBhcmVu
dCgpLT5pc0Fub255bW91c0Jsb2NrKCkpOworICAgICAgICBpZiAoYmVmb3JlQ2hpbGQtPnBhcmVu
dCgpLT5pc0Fub255bW91c0lubGluZUJsb2NrKCkpIHsKKyAgICAgICAgICAgIGlmICghbmV3Q2hp
bGQtPmlzSW5saW5lKCkgfHwgKG5ld0NoaWxkLT5pc0lubGluZSgpICYmIGJlZm9yZUNoaWxkLT5w
YXJlbnQoKS0+Zmlyc3RDaGlsZCgpICE9IGJlZm9yZUNoaWxkKSkKKyAgICAgICAgICAgICAgICBi
ZWZvcmVDaGlsZC0+cGFyZW50KCktPmFkZENoaWxkKG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7Cisg
ICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYWRkQ2hpbGQobmV3Q2hpbGQsIGJlZm9y
ZUNoaWxkLT5wYXJlbnQoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoYmVmb3JlQ2hpbGQtPnBhcmVu
dCgpLT5pc0Fub255bW91c0Jsb2NrKCkpIHsKKyAgICAgICAgICAgIEFTU0VSVCghYmVmb3JlQ2hp
bGQtPnBhcmVudCgpLT5wYXJlbnQoKSB8fCBiZWZvcmVDaGlsZC0+cGFyZW50KCktPnBhcmVudCgp
LT5pc0Fub255bW91c0lubGluZUJsb2NrKCkpOworICAgICAgICAgICAgQVNTRVJUKGJlZm9yZUNo
aWxkLT5pc0lubGluZSgpKTsKKyAgICAgICAgICAgIGlmIChuZXdDaGlsZC0+aXNJbmxpbmUoKSB8
fCAoIW5ld0NoaWxkLT5pc0lubGluZSgpICYmIGJlZm9yZUNoaWxkLT5wYXJlbnQoKS0+Zmlyc3RD
aGlsZCgpICE9IGJlZm9yZUNoaWxkKSkKKyAgICAgICAgICAgICAgICBiZWZvcmVDaGlsZC0+cGFy
ZW50KCktPmFkZENoaWxkKG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7CisgICAgICAgICAgICBlbHNl
CisgICAgICAgICAgICAgICAgYWRkQ2hpbGQobmV3Q2hpbGQsIGJlZm9yZUNoaWxkLT5wYXJlbnQo
KSk7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIGlmICghbmV3Q2hp
bGQtPmlzSW5saW5lKCkpIHsKKyAgICAgICAgLy8gV2UgYXJlIHBsYWNpbmcgYSBibG9jayBpbnNp
ZGUgYW4gaW5saW5lLiBXZSBoYXZlIHRvIHBsYWNlIHRoZSBibG9jayBpbnNpZGUgYW4gYW5vbnlt
b3VzIGlubGluZS1ibG9jay4KKyAgICAgICAgLy8gVGhpcyBpbmxpbmUtYmxvY2sgY2FuIGhvdXNl
IGEgc2VxdWVuY2Ugb2YgY29udGlndW91cyBibG9jay1sZXZlbCBjaGlsZHJlbiwgYW5kIHRoZXkg
d2lsbCBhbGwgc2l0IG9uIHRoZQorICAgICAgICAvLyBzYW1lIGxpbmUgdG9nZXRoZXIuICBXZSB0
cnkgdG8gcmV1c2Ugb25lIGZpcnN0IGlmIHBvc3NpYmxlLgorICAgICAgICBpZiAoYmVmb3JlQ2hp
bGQpIHsKKyAgICAgICAgICAgIGlmIChiZWZvcmVDaGlsZC0+cHJldmlvdXNTaWJsaW5nKCkgJiYg
YmVmb3JlQ2hpbGQtPnByZXZpb3VzU2libGluZygpLT5pc0Fub255bW91c0lubGluZUJsb2NrKCkp
IHsKKyAgICAgICAgICAgICAgICBiZWZvcmVDaGlsZC0+cHJldmlvdXNTaWJsaW5nKCktPmFkZENo
aWxkKG5ld0NoaWxkKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9Cisg
ICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobGFzdENoaWxkKCkgJiYgbGFzdENoaWxk
KCktPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkgeworICAgICAgICAgICAgICAgIGxhc3RDaGls
ZCgpLT5hZGRDaGlsZChuZXdDaGlsZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAg
ICAgICAgfQorICAgICAgICB9CisgCisgICAgICAgIGlmICghbmV3Q2hpbGQtPmlzRmxvYXRpbmdP
clBvc2l0aW9uZWQoKSkgeworICAgICAgICAgICAgLy8gVGhlcmUgd2FzIG5vIHN1aXRhYmxlIGV4
aXN0aW5nIGFub255bW91cyBib3guICBDcmVhdGUgYSBuZXcgb25lLgorICAgICAgICAgICAgUmVm
UHRyPFJlbmRlclN0eWxlPiBuZXdTdHlsZSA9IFJlbmRlclN0eWxlOjpjcmVhdGUoKTsKKyAgICAg
ICAgICAgIG5ld1N0eWxlLT5pbmhlcml0RnJvbShzdHlsZSgpKTsKKyAgICAgICAgICAgIG5ld1N0
eWxlLT5zZXREaXNwbGF5KElOTElORV9CTE9DSyk7CisgICAgICAgICAgICBSZW5kZXJCbG9jayog
bmV3Qm94ID0gbmV3IChyZW5kZXJBcmVuYSgpKSBSZW5kZXJCbG9jayhkb2N1bWVudCgpKTsKKyAg
ICAgICAgICAgIG5ld0JveC0+c2V0U3R5bGUobmV3U3R5bGUpOworICAgICAgICAgICAgUmVuZGVy
Qm94TW9kZWxPYmplY3Q6OmFkZENoaWxkKG5ld0JveCwgYmVmb3JlQ2hpbGQpOworICAgICAgICAg
ICAgbmV3Qm94LT5hZGRDaGlsZChuZXdDaGlsZCk7CisgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgIH0KKyAgICB9CisKICAgICBSZW5kZXJCb3hNb2RlbE9iamVjdDo6YWRkQ2hpbGQobmV3Q2hp
bGQsIGJlZm9yZUNoaWxkKTsKIAogICAgIG5ld0NoaWxkLT5zZXROZWVkc0xheW91dEFuZFByZWZX
aWR0aHNSZWNhbGMoKTsKQEAgLTIyMSwxODggKzE4Niw2IEBAIFJlbmRlcklubGluZSogUmVuZGVy
SW5saW5lOjpjbG9uZUlubGluZSgKICAgICByZXR1cm4gbzsKIH0KIAotdm9pZCBSZW5kZXJJbmxp
bmU6OnNwbGl0SW5saW5lcyhSZW5kZXJCbG9jayogZnJvbUJsb2NrLCBSZW5kZXJCbG9jayogdG9C
bG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVuZGVyQmxvY2sqIG1pZGRs
ZUJsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXJPYmplY3QqIGJl
Zm9yZUNoaWxkLCBSZW5kZXJCb3hNb2RlbE9iamVjdCogb2xkQ29udCkKLXsKLSAgICAvLyBDcmVh
dGUgYSBjbG9uZSBvZiB0aGlzIGlubGluZS4KLSAgICBSZW5kZXJJbmxpbmUqIGNsb25lID0gY2xv
bmVJbmxpbmUodGhpcyk7Ci0gICAgY2xvbmUtPnNldENvbnRpbnVhdGlvbihvbGRDb250KTsKLQot
ICAgIC8vIE5vdyB0YWtlIGFsbCBvZiB0aGUgY2hpbGRyZW4gZnJvbSBiZWZvcmVDaGlsZCB0byB0
aGUgZW5kIGFuZCByZW1vdmUKLSAgICAvLyB0aGVtIGZyb20gfHRoaXN8IGFuZCBwbGFjZSB0aGVt
IGluIHRoZSBjbG9uZS4KLSAgICBSZW5kZXJPYmplY3QqIG8gPSBiZWZvcmVDaGlsZDsKLSAgICB3
aGlsZSAobykgewotICAgICAgICBSZW5kZXJPYmplY3QqIHRtcCA9IG87Ci0gICAgICAgIG8gPSB0
bXAtPm5leHRTaWJsaW5nKCk7Ci0gICAgICAgIGNsb25lLT5hZGRDaGlsZElnbm9yaW5nQ29udGlu
dWF0aW9uKGNoaWxkcmVuKCktPnJlbW92ZUNoaWxkTm9kZSh0aGlzLCB0bXApLCAwKTsKLSAgICAg
ICAgdG1wLT5zZXROZWVkc0xheW91dEFuZFByZWZXaWR0aHNSZWNhbGMoKTsKLSAgICB9Ci0KLSAg
ICAvLyBIb29rIHxjbG9uZXwgdXAgYXMgdGhlIGNvbnRpbnVhdGlvbiBvZiB0aGUgbWlkZGxlIGJs
b2NrLgotICAgIG1pZGRsZUJsb2NrLT5zZXRJbmxpbmVDb250aW51YXRpb24oY2xvbmUpOwotCi0g
ICAgLy8gV2UgaGF2ZSBiZWVuIHJlcGFyZW50ZWQgYW5kIGFyZSBub3cgdW5kZXIgdGhlIGZyb21C
bG9jay4gIFdlIG5lZWQKLSAgICAvLyB0byB3YWxrIHVwIG91ciBpbmxpbmUgcGFyZW50IGNoYWlu
IHVudGlsIHdlIGhpdCB0aGUgY29udGFpbmluZyBibG9jay4KLSAgICAvLyBPbmNlIHdlIGhpdCB0
aGUgY29udGFpbmluZyBibG9jayB3ZSdyZSBkb25lLgotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0
KiBjdXJyID0gdG9SZW5kZXJCb3hNb2RlbE9iamVjdChwYXJlbnQoKSk7Ci0gICAgUmVuZGVyQm94
TW9kZWxPYmplY3QqIGN1cnJDaGlsZCA9IHRoaXM7Ci0gICAgCi0gICAgLy8gRklYTUU6IEJlY2F1
c2Ugc3BsaXR0aW5nIGlzIE8obl4yKSBhcyB0YWdzIG5lc3QgcGF0aG9sb2dpY2FsbHksIHdlIGNh
cCB0aGUgZGVwdGggYXQgd2hpY2ggd2UncmUgd2lsbGluZyB0byBjbG9uZS4KLSAgICAvLyBUaGVy
ZSB3aWxsIGV2ZW50dWFsbHkgYmUgYSBiZXR0ZXIgYXBwcm9hY2ggdG8gdGhpcyBwcm9ibGVtIHRo
YXQgd2lsbCBsZXQgdXMgbmVzdCB0byBhIG11Y2gKLSAgICAvLyBncmVhdGVyIGRlcHRoIChzZWUg
YnVnemlsbGEgYnVnIDEzNDMwKSBidXQgZm9yIG5vdyB3ZSBoYXZlIGEgbGltaXQuICBUaGlzICp3
aWxsKiByZXN1bHQgaW4KLSAgICAvLyBpbmNvcnJlY3QgcmVuZGVyaW5nLCBidXQgdGhlIGFsdGVy
bmF0aXZlIGlzIHRvIGhhbmcgZm9yZXZlci4KLSAgICB1bnNpZ25lZCBzcGxpdERlcHRoID0gMTsK
LSAgICBjb25zdCB1bnNpZ25lZCBjTWF4U3BsaXREZXB0aCA9IDIwMDsgCi0gICAgd2hpbGUgKGN1
cnIgJiYgY3VyciAhPSBmcm9tQmxvY2spIHsKLSAgICAgICAgQVNTRVJUKGN1cnItPmlzUmVuZGVy
SW5saW5lKCkpOwotICAgICAgICBpZiAoc3BsaXREZXB0aCA8IGNNYXhTcGxpdERlcHRoKSB7Ci0g
ICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgY2xvbmUuCi0gICAgICAgICAgICBSZW5kZXJJbmxp
bmUqIGNsb25lQ2hpbGQgPSBjbG9uZTsKLSAgICAgICAgICAgIGNsb25lID0gY2xvbmVJbmxpbmUo
dG9SZW5kZXJJbmxpbmUoY3VycikpOwotCi0gICAgICAgICAgICAvLyBJbnNlcnQgb3VyIGNoaWxk
IGNsb25lIGFzIHRoZSBmaXJzdCBjaGlsZC4KLSAgICAgICAgICAgIGNsb25lLT5hZGRDaGlsZEln
bm9yaW5nQ29udGludWF0aW9uKGNsb25lQ2hpbGQsIDApOwotCi0gICAgICAgICAgICAvLyBIb29r
IHRoZSBjbG9uZSB1cCBhcyBhIGNvbnRpbnVhdGlvbiBvZiB8Y3VycnwuCi0gICAgICAgICAgICBS
ZW5kZXJJbmxpbmUqIGlubGluZUN1cnIgPSB0b1JlbmRlcklubGluZShjdXJyKTsKLSAgICAgICAg
ICAgIG9sZENvbnQgPSBpbmxpbmVDdXJyLT5jb250aW51YXRpb24oKTsKLSAgICAgICAgICAgIGlu
bGluZUN1cnItPnNldENvbnRpbnVhdGlvbihjbG9uZSk7Ci0gICAgICAgICAgICBjbG9uZS0+c2V0
Q29udGludWF0aW9uKG9sZENvbnQpOwotCi0gICAgICAgICAgICAvLyBTb21lb25lIG1heSBoYXZl
IGluZGlyZWN0bHkgY2F1c2VkIGEgPHE+IHRvIHNwbGl0LiAgV2hlbiB0aGlzIGhhcHBlbnMsIHRo
ZSA6YWZ0ZXIgY29udGVudAotICAgICAgICAgICAgLy8gaGFzIHRvIG1vdmUgaW50byB0aGUgaW5s
aW5lIGNvbnRpbnVhdGlvbi4gIENhbGwgdXBkYXRlQmVmb3JlQWZ0ZXJDb250ZW50IHRvIGVuc3Vy
ZSB0aGF0IHRoZSBpbmxpbmUncyA6YWZ0ZXIKLSAgICAgICAgICAgIC8vIGNvbnRlbnQgZ2V0cyBw
cm9wZXJseSBkZXN0cm95ZWQuCi0gICAgICAgICAgICBpZiAoZG9jdW1lbnQoKS0+dXNlc0JlZm9y
ZUFmdGVyUnVsZXMoKSkKLSAgICAgICAgICAgICAgICBpbmxpbmVDdXJyLT5jaGlsZHJlbigpLT51
cGRhdGVCZWZvcmVBZnRlckNvbnRlbnQodGhpcywgQUZURVIpOwotCi0gICAgICAgICAgICAvLyBO
b3cgd2UgbmVlZCB0byB0YWtlIGFsbCBvZiB0aGUgY2hpbGRyZW4gc3RhcnRpbmcgZnJvbSB0aGUg
Zmlyc3QgY2hpbGQKLSAgICAgICAgICAgIC8vICphZnRlciogY3VyckNoaWxkIGFuZCBhcHBlbmQg
dGhlbSBhbGwgdG8gdGhlIGNsb25lLgotICAgICAgICAgICAgbyA9IGN1cnJDaGlsZC0+bmV4dFNp
YmxpbmcoKTsKLSAgICAgICAgICAgIHdoaWxlIChvKSB7Ci0gICAgICAgICAgICAgICAgUmVuZGVy
T2JqZWN0KiB0bXAgPSBvOwotICAgICAgICAgICAgICAgIG8gPSB0bXAtPm5leHRTaWJsaW5nKCk7
Ci0gICAgICAgICAgICAgICAgY2xvbmUtPmFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24oaW5s
aW5lQ3Vyci0+Y2hpbGRyZW4oKS0+cmVtb3ZlQ2hpbGROb2RlKGN1cnIsIHRtcCksIDApOwotICAg
ICAgICAgICAgICAgIHRtcC0+c2V0TmVlZHNMYXlvdXRBbmRQcmVmV2lkdGhzUmVjYWxjKCk7Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIEtlZXAgd2Fsa2lu
ZyB1cCB0aGUgY2hhaW4uCi0gICAgICAgIGN1cnJDaGlsZCA9IGN1cnI7Ci0gICAgICAgIGN1cnIg
PSB0b1JlbmRlckJveE1vZGVsT2JqZWN0KGN1cnItPnBhcmVudCgpKTsKLSAgICAgICAgc3BsaXRE
ZXB0aCsrOwotICAgIH0KLQotICAgIC8vIE5vdyB3ZSBhcmUgYXQgdGhlIGJsb2NrIGxldmVsLiBX
ZSBuZWVkIHRvIHB1dCB0aGUgY2xvbmUgaW50byB0aGUgdG9CbG9jay4KLSAgICB0b0Jsb2NrLT5j
aGlsZHJlbigpLT5hcHBlbmRDaGlsZE5vZGUodG9CbG9jaywgY2xvbmUpOwotCi0gICAgLy8gTm93
IHRha2UgYWxsIHRoZSBjaGlsZHJlbiBhZnRlciBjdXJyQ2hpbGQgYW5kIHJlbW92ZSB0aGVtIGZy
b20gdGhlIGZyb21CbG9jawotICAgIC8vIGFuZCBwdXQgdGhlbSBpbiB0aGUgdG9CbG9jay4KLSAg
ICBvID0gY3VyckNoaWxkLT5uZXh0U2libGluZygpOwotICAgIHdoaWxlIChvKSB7Ci0gICAgICAg
IFJlbmRlck9iamVjdCogdG1wID0gbzsKLSAgICAgICAgbyA9IHRtcC0+bmV4dFNpYmxpbmcoKTsK
LSAgICAgICAgdG9CbG9jay0+Y2hpbGRyZW4oKS0+YXBwZW5kQ2hpbGROb2RlKHRvQmxvY2ssIGZy
b21CbG9jay0+Y2hpbGRyZW4oKS0+cmVtb3ZlQ2hpbGROb2RlKGZyb21CbG9jaywgdG1wKSk7Ci0g
ICAgfQotfQotCi12b2lkIFJlbmRlcklubGluZTo6c3BsaXRGbG93KFJlbmRlck9iamVjdCogYmVm
b3JlQ2hpbGQsIFJlbmRlckJsb2NrKiBuZXdCbG9ja0JveCwKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgUmVuZGVyT2JqZWN0KiBuZXdDaGlsZCwgUmVuZGVyQm94TW9kZWxPYmplY3QqIG9s
ZENvbnQpCi17Ci0gICAgUmVuZGVyQmxvY2sqIHByZSA9IDA7Ci0gICAgUmVuZGVyQmxvY2sqIGJs
b2NrID0gY29udGFpbmluZ0Jsb2NrKCk7Ci0gICAgCi0gICAgLy8gRGVsZXRlIG91ciBsaW5lIGJv
eGVzIGJlZm9yZSB3ZSBkbyB0aGUgaW5saW5lIHNwbGl0IGludG8gY29udGludWF0aW9ucy4KLSAg
ICBibG9jay0+ZGVsZXRlTGluZUJveFRyZWUoKTsKLSAgICAKLSAgICBib29sIG1hZGVOZXdCZWZv
cmVCbG9jayA9IGZhbHNlOwotICAgIGlmIChibG9jay0+aXNBbm9ueW1vdXNCbG9jaygpICYmICgh
YmxvY2stPnBhcmVudCgpIHx8ICFibG9jay0+cGFyZW50KCktPmNyZWF0ZXNBbm9ueW1vdXNXcmFw
cGVyKCkpKSB7Ci0gICAgICAgIC8vIFdlIGNhbiByZXVzZSB0aGlzIGJsb2NrIGFuZCBtYWtlIGl0
IHRoZSBwcmVCbG9jayBvZiB0aGUgbmV4dCBjb250aW51YXRpb24uCi0gICAgICAgIHByZSA9IGJs
b2NrOwotICAgICAgICBwcmUtPnJlbW92ZVBvc2l0aW9uZWRPYmplY3RzKDApOwotICAgICAgICBi
bG9jayA9IGJsb2NrLT5jb250YWluaW5nQmxvY2soKTsKLSAgICB9IGVsc2UgewotICAgICAgICAv
LyBObyBhbm9ueW1vdXMgYmxvY2sgYXZhaWxhYmxlIGZvciB1c2UuICBNYWtlIG9uZS4KLSAgICAg
ICAgcHJlID0gYmxvY2stPmNyZWF0ZUFub255bW91c0Jsb2NrKCk7Ci0gICAgICAgIG1hZGVOZXdC
ZWZvcmVCbG9jayA9IHRydWU7Ci0gICAgfQotCi0gICAgUmVuZGVyQmxvY2sqIHBvc3QgPSBibG9j
ay0+Y3JlYXRlQW5vbnltb3VzQmxvY2soKTsKLQotICAgIFJlbmRlck9iamVjdCogYm94Rmlyc3Qg
PSBtYWRlTmV3QmVmb3JlQmxvY2sgPyBibG9jay0+Zmlyc3RDaGlsZCgpIDogcHJlLT5uZXh0U2li
bGluZygpOwotICAgIGlmIChtYWRlTmV3QmVmb3JlQmxvY2spCi0gICAgICAgIGJsb2NrLT5jaGls
ZHJlbigpLT5pbnNlcnRDaGlsZE5vZGUoYmxvY2ssIHByZSwgYm94Rmlyc3QpOwotICAgIGJsb2Nr
LT5jaGlsZHJlbigpLT5pbnNlcnRDaGlsZE5vZGUoYmxvY2ssIG5ld0Jsb2NrQm94LCBib3hGaXJz
dCk7Ci0gICAgYmxvY2stPmNoaWxkcmVuKCktPmluc2VydENoaWxkTm9kZShibG9jaywgcG9zdCwg
Ym94Rmlyc3QpOwotICAgIGJsb2NrLT5zZXRDaGlsZHJlbklubGluZShmYWxzZSk7Ci0gICAgCi0g
ICAgaWYgKG1hZGVOZXdCZWZvcmVCbG9jaykgewotICAgICAgICBSZW5kZXJPYmplY3QqIG8gPSBi
b3hGaXJzdDsKLSAgICAgICAgd2hpbGUgKG8pIHsKLSAgICAgICAgICAgIFJlbmRlck9iamVjdCog
bm8gPSBvOwotICAgICAgICAgICAgbyA9IG5vLT5uZXh0U2libGluZygpOwotICAgICAgICAgICAg
cHJlLT5jaGlsZHJlbigpLT5hcHBlbmRDaGlsZE5vZGUocHJlLCBibG9jay0+Y2hpbGRyZW4oKS0+
cmVtb3ZlQ2hpbGROb2RlKGJsb2NrLCBubykpOwotICAgICAgICAgICAgbm8tPnNldE5lZWRzTGF5
b3V0QW5kUHJlZldpZHRoc1JlY2FsYygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3BsaXRJ
bmxpbmVzKHByZSwgcG9zdCwgbmV3QmxvY2tCb3gsIGJlZm9yZUNoaWxkLCBvbGRDb250KTsKLQot
ICAgIC8vIFdlIGFscmVhZHkga25vdyB0aGUgbmV3QmxvY2tCb3ggaXNuJ3QgZ29pbmcgdG8gY29u
dGFpbiBpbmxpbmUga2lkcywgc28gYXZvaWQgd2FzdGluZwotICAgIC8vIHRpbWUgaW4gbWFrZUNo
aWxkcmVuTm9uSW5saW5lIGJ5IGp1c3Qgc2V0dGluZyB0aGlzIGV4cGxpY2l0bHkgdXAgZnJvbnQu
Ci0gICAgbmV3QmxvY2tCb3gtPnNldENoaWxkcmVuSW5saW5lKGZhbHNlKTsKLQotICAgIC8vIFdl
IGRlbGF5ZWQgYWRkaW5nIHRoZSBuZXdDaGlsZCB1bnRpbCBub3cgc28gdGhhdCB0aGUgfG5ld0Js
b2NrQm94fCB3b3VsZCBiZSBmdWxseQotICAgIC8vIGNvbm5lY3RlZCwgdGh1cyBhbGxvd2luZyBu
ZXdDaGlsZCBhY2Nlc3MgdG8gYSByZW5kZXJBcmVuYSBzaG91bGQgaXQgbmVlZAotICAgIC8vIHRv
IHdyYXAgaXRzZWxmIGluIGFkZGl0aW9uYWwgYm94ZXMgKGUuZy4sIHRhYmxlIGNvbnN0cnVjdGlv
bikuCi0gICAgbmV3QmxvY2tCb3gtPmFkZENoaWxkKG5ld0NoaWxkKTsKLQotICAgIC8vIEFsd2F5
cyBqdXN0IGRvIGEgZnVsbCBsYXlvdXQgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgbGluZSBib3hl
cyAoZXNwZWNpYWxseSB3cmFwcGVycyBmb3IgaW1hZ2VzKQotICAgIC8vIGdldCBkZWxldGVkIHBy
b3Blcmx5LiAgQmVjYXVzZSBvYmplY3RzIG1vdmVzIGZyb20gdGhlIHByZSBibG9jayBpbnRvIHRo
ZSBwb3N0IGJsb2NrLCB3ZSB3YW50IHRvCi0gICAgLy8gbWFrZSBuZXcgbGluZSBib3hlcyBpbnN0
ZWFkIG9mIGxlYXZpbmcgdGhlIG9sZCBsaW5lIGJveGVzIGFyb3VuZC4KLSAgICBwcmUtPnNldE5l
ZWRzTGF5b3V0QW5kUHJlZldpZHRoc1JlY2FsYygpOwotICAgIGJsb2NrLT5zZXROZWVkc0xheW91
dEFuZFByZWZXaWR0aHNSZWNhbGMoKTsKLSAgICBwb3N0LT5zZXROZWVkc0xheW91dEFuZFByZWZX
aWR0aHNSZWNhbGMoKTsKLX0KLQotdm9pZCBSZW5kZXJJbmxpbmU6OmFkZENoaWxkVG9Db250aW51
YXRpb24oUmVuZGVyT2JqZWN0KiBuZXdDaGlsZCwgUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCkK
LXsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogZmxvdyA9IGNvbnRpbnVhdGlvbkJlZm9yZShi
ZWZvcmVDaGlsZCk7Ci0gICAgQVNTRVJUKCFiZWZvcmVDaGlsZCB8fCBiZWZvcmVDaGlsZC0+cGFy
ZW50KCktPmlzUmVuZGVyQmxvY2soKSB8fCBiZWZvcmVDaGlsZC0+cGFyZW50KCktPmlzUmVuZGVy
SW5saW5lKCkpOwotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBiZWZvcmVDaGlsZFBhcmVudCA9
IDA7Ci0gICAgaWYgKGJlZm9yZUNoaWxkKQotICAgICAgICBiZWZvcmVDaGlsZFBhcmVudCA9IHRv
UmVuZGVyQm94TW9kZWxPYmplY3QoYmVmb3JlQ2hpbGQtPnBhcmVudCgpKTsKLSAgICBlbHNlIHsK
LSAgICAgICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGNvbnQgPSBuZXh0Q29udGludWF0aW9uKGZs
b3cpOwotICAgICAgICBpZiAoY29udCkKLSAgICAgICAgICAgIGJlZm9yZUNoaWxkUGFyZW50ID0g
Y29udDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYmVmb3JlQ2hpbGRQYXJlbnQgPSBmbG93
OwotICAgIH0KLQotICAgIGlmIChuZXdDaGlsZC0+aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpKQot
ICAgICAgICByZXR1cm4gYmVmb3JlQ2hpbGRQYXJlbnQtPmFkZENoaWxkSWdub3JpbmdDb250aW51
YXRpb24obmV3Q2hpbGQsIGJlZm9yZUNoaWxkKTsKLQotICAgIC8vIEEgY29udGludWF0aW9uIGFs
d2F5cyBjb25zaXN0cyBvZiB0d28gcG90ZW50aWFsIGNhbmRpZGF0ZXM6IGFuIGlubGluZSBvciBh
biBhbm9ueW1vdXMKLSAgICAvLyBibG9jayBib3ggaG9sZGluZyBibG9jayBjaGlsZHJlbi4KLSAg
ICBib29sIGNoaWxkSW5saW5lID0gbmV3Q2hpbGQtPmlzSW5saW5lKCk7Ci0gICAgYm9vbCBiY3BJ
bmxpbmUgPSBiZWZvcmVDaGlsZFBhcmVudC0+aXNJbmxpbmUoKTsKLSAgICBib29sIGZsb3dJbmxp
bmUgPSBmbG93LT5pc0lubGluZSgpOwotCi0gICAgaWYgKGZsb3cgPT0gYmVmb3JlQ2hpbGRQYXJl
bnQpCi0gICAgICAgIHJldHVybiBmbG93LT5hZGRDaGlsZElnbm9yaW5nQ29udGludWF0aW9uKG5l
d0NoaWxkLCBiZWZvcmVDaGlsZCk7Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8vIFRoZSBnb2FsIGhl
cmUgaXMgdG8gbWF0Y2ggdXAgaWYgd2UgY2FuLCBzbyB0aGF0IHdlIGNhbiBjb2FsZXNjZSBhbmQg
Y3JlYXRlIHRoZQotICAgICAgICAvLyBtaW5pbWFsICMgb2YgY29udGludWF0aW9ucyBuZWVkZWQg
Zm9yIHRoZSBpbmxpbmUuCi0gICAgICAgIGlmIChjaGlsZElubGluZSA9PSBiY3BJbmxpbmUpCi0g
ICAgICAgICAgICByZXR1cm4gYmVmb3JlQ2hpbGRQYXJlbnQtPmFkZENoaWxkSWdub3JpbmdDb250
aW51YXRpb24obmV3Q2hpbGQsIGJlZm9yZUNoaWxkKTsKLSAgICAgICAgZWxzZSBpZiAoZmxvd0lu
bGluZSA9PSBjaGlsZElubGluZSkKLSAgICAgICAgICAgIHJldHVybiBmbG93LT5hZGRDaGlsZEln
bm9yaW5nQ29udGludWF0aW9uKG5ld0NoaWxkLCAwKTsgLy8gSnVzdCB0cmVhdCBsaWtlIGFuIGFw
cGVuZC4KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIGJlZm9yZUNoaWxkUGFyZW50
LT5hZGRDaGlsZElnbm9yaW5nQ29udGludWF0aW9uKG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7Ci0g
ICAgfQotfQotCiB2b2lkIFJlbmRlcklubGluZTo6cGFpbnQoUGFpbnRJbmZvJiBwYWludEluZm8s
IGludCB0eCwgaW50IHR5KQogewogICAgIG1fbGluZUJveGVzLnBhaW50KHRoaXMsIHBhaW50SW5m
bywgdHgsIHR5KTsKQEAgLTQxNSwxNiArMTk4LDYgQEAgdm9pZCBSZW5kZXJJbmxpbmU6OmFic29s
dXRlUmVjdHMoVmVjdG9yPAogICAgICAgICAgICAgcmVjdHMuYXBwZW5kKEludFJlY3QodHggKyBj
dXJyLT54KCksIHR5ICsgY3Vyci0+eSgpLCBjdXJyLT53aWR0aCgpLCBjdXJyLT5oZWlnaHQoKSkp
OwogICAgIH0gZWxzZQogICAgICAgICByZWN0cy5hcHBlbmQoSW50UmVjdCh0eCwgdHksIDAsIDAp
KTsKLQotICAgIGlmIChjb250aW51YXRpb24oKSkgewotICAgICAgICBpZiAoY29udGludWF0aW9u
KCktPmlzQm94KCkpIHsKLSAgICAgICAgICAgIFJlbmRlckJveCogYm94ID0gdG9SZW5kZXJCb3go
Y29udGludWF0aW9uKCkpOwotICAgICAgICAgICAgY29udGludWF0aW9uKCktPmFic29sdXRlUmVj
dHMocmVjdHMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHgg
LSBjb250YWluaW5nQmxvY2soKS0+eCgpICsgYm94LT54KCksCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICB0eSAtIGNvbnRhaW5pbmdCbG9jaygpLT55KCkgKyBib3gt
PnkoKSk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgY29udGludWF0aW9uKCktPmFic29s
dXRlUmVjdHMocmVjdHMsIHR4IC0gY29udGFpbmluZ0Jsb2NrKCktPngoKSwgdHkgLSBjb250YWlu
aW5nQmxvY2soKS0+eSgpKTsKLSAgICB9CiB9CiAKIHZvaWQgUmVuZGVySW5saW5lOjphYnNvbHV0
ZVF1YWRzKFZlY3RvcjxGbG9hdFF1YWQ+JiBxdWFkcykKQEAgLTQzNiw5ICsyMDksNiBAQCB2b2lk
IFJlbmRlcklubGluZTo6YWJzb2x1dGVRdWFkcyhWZWN0b3I8CiAgICAgICAgIH0KICAgICB9IGVs
c2UKICAgICAgICAgcXVhZHMuYXBwZW5kKGxvY2FsVG9BYnNvbHV0ZVF1YWQoRmxvYXRSZWN0KCkp
KTsKLQotICAgIGlmIChjb250aW51YXRpb24oKSkKLSAgICAgICAgY29udGludWF0aW9uKCktPmFi
c29sdXRlUXVhZHMocXVhZHMpOwogfQogCiBpbnQgUmVuZGVySW5saW5lOjpvZmZzZXRMZWZ0KCkg
Y29uc3QKQEAgLTUwNywxOCArMjc3LDYgQEAgVmlzaWJsZVBvc2l0aW9uIFJlbmRlcklubGluZTo6
cG9zaXRpb25GbwogICAgICAgICAvLyBzaG91bGQgdHJ5IHRvIGZpbmQgYSByZXN1bHQgYnkgYXNr
aW5nIG91ciBjb250YWluaW5nIGJsb2NrLgogICAgICAgICByZXR1cm4gY2ItPnBvc2l0aW9uRm9y
UG9pbnQocG9pbnQpOwogICAgIH0KLQotICAgIC8vIFRyYW5zbGF0ZSB0aGUgY29vcmRzIGZyb20g
dGhlIHByZS1hbm9ueW1vdXMgYmxvY2sgdG8gdGhlIHBvc3QtYW5vbnltb3VzIGJsb2NrLgotICAg
IGludCBwYXJlbnRCbG9ja1ggPSBjYi0+eCgpICsgcG9pbnQueCgpOwotICAgIGludCBwYXJlbnRC
bG9ja1kgPSBjYi0+eSgpICsgcG9pbnQueSgpOwotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBj
ID0gY29udGludWF0aW9uKCk7Ci0gICAgd2hpbGUgKGMpIHsKLSAgICAgICAgUmVuZGVyQm94KiBj
b250QmxvY2sgPSBjLT5pc0lubGluZSgpID8gYy0+Y29udGFpbmluZ0Jsb2NrKCkgOiB0b1JlbmRl
ckJsb2NrKGMpOwotICAgICAgICBpZiAoYy0+aXNJbmxpbmUoKSB8fCBjLT5maXJzdENoaWxkKCkp
Ci0gICAgICAgICAgICByZXR1cm4gYy0+cG9zaXRpb25Gb3JDb29yZGluYXRlcyhwYXJlbnRCbG9j
a1ggLSBjb250QmxvY2stPngoKSwgcGFyZW50QmxvY2tZIC0gY29udEJsb2NrLT55KCkpOwotICAg
ICAgICBjID0gdG9SZW5kZXJCbG9jayhjKS0+aW5saW5lQ29udGludWF0aW9uKCk7Ci0gICAgfQot
ICAgIAogICAgIHJldHVybiBSZW5kZXJCb3hNb2RlbE9iamVjdDo6cG9zaXRpb25Gb3JQb2ludChw
b2ludCk7CiB9CiAKQEAgLTU3MSw3ICszMjksNyBAQCBJbnRSZWN0IFJlbmRlcklubGluZTo6Y2xp
cHBlZE92ZXJmbG93UmVjCiAgICAgLy8gT25seSBydW4taW5zIGFyZSBhbGxvd2VkIGluIGhlcmUg
ZHVyaW5nIGxheW91dC4KICAgICBBU1NFUlQoIXZpZXcoKSB8fCAhdmlldygpLT5sYXlvdXRTdGF0
ZUVuYWJsZWQoKSB8fCBpc1J1bkluKCkpOwogCi0gICAgaWYgKCFmaXJzdExpbmVCb3goKSAmJiAh
Y29udGludWF0aW9uKCkpCisgICAgaWYgKCFmaXJzdExpbmVCb3goKSkKICAgICAgICAgcmV0dXJu
IEludFJlY3QoKTsKIAogICAgIC8vIEZpbmQgb3VyIGxlZnRtb3N0IHBvc2l0aW9uLgpAQCAtNjE5
LDExICszNzcsNiBAQCBJbnRSZWN0IFJlbmRlcklubGluZTo6Y2xpcHBlZE92ZXJmbG93UmVjCiAg
ICAgICAgICAgICAgICAgci51bml0ZShjaGlsZFJlY3QpOwogICAgICAgICAgICAgfQogICAgICAg
ICB9Ci0KLSAgICAgICAgaWYgKGNvbnRpbnVhdGlvbigpICYmICFjb250aW51YXRpb24oKS0+aXNJ
bmxpbmUoKSkgewotICAgICAgICAgICAgSW50UmVjdCBjb250UmVjdCA9IGNvbnRpbnVhdGlvbigp
LT5yZWN0V2l0aE91dGxpbmVGb3JSZXBhaW50KHJlcGFpbnRDb250YWluZXIsIG93KTsKLSAgICAg
ICAgICAgIHIudW5pdGUoY29udFJlY3QpOwotICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJu
IHI7CkBAIC03OTYsNDkgKzU0OSw2IEBAIHZvaWQgUmVuZGVySW5saW5lOjptYXBBYnNvbHV0ZVRv
TG9jYWxQb2kKICAgICAgICAgdHJhbnNmb3JtU3RhdGUubW92ZSgtY29udGFpbmVyT2Zmc2V0Lndp
ZHRoKCksIC1jb250YWluZXJPZmZzZXQuaGVpZ2h0KCksIHByZXNlcnZlM0QgPyBUcmFuc2Zvcm1T
dGF0ZTo6QWNjdW11bGF0ZVRyYW5zZm9ybSA6IFRyYW5zZm9ybVN0YXRlOjpGbGF0dGVuVHJhbnNm
b3JtKTsKIH0KIAotdm9pZCBSZW5kZXJJbmxpbmU6OnVwZGF0ZURyYWdTdGF0ZShib29sIGRyYWdP
bikKLXsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdDo6dXBkYXRlRHJhZ1N0YXRlKGRyYWdPbik7
Ci0gICAgaWYgKGNvbnRpbnVhdGlvbigpKQotICAgICAgICBjb250aW51YXRpb24oKS0+dXBkYXRl
RHJhZ1N0YXRlKGRyYWdPbik7Ci19Ci0KLXZvaWQgUmVuZGVySW5saW5lOjpjaGlsZEJlY2FtZU5v
bklubGluZShSZW5kZXJPYmplY3QqIGNoaWxkKQotewotICAgIC8vIFdlIGhhdmUgdG8gc3BsaXQg
dGhlIHBhcmVudCBmbG93LgotICAgIFJlbmRlckJsb2NrKiBuZXdCb3ggPSBjb250YWluaW5nQmxv
Y2soKS0+Y3JlYXRlQW5vbnltb3VzQmxvY2soKTsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCog
b2xkQ29udGludWF0aW9uID0gY29udGludWF0aW9uKCk7Ci0gICAgc2V0Q29udGludWF0aW9uKG5l
d0JveCk7Ci0gICAgUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCA9IGNoaWxkLT5uZXh0U2libGlu
ZygpOwotICAgIGNoaWxkcmVuKCktPnJlbW92ZUNoaWxkTm9kZSh0aGlzLCBjaGlsZCk7Ci0gICAg
c3BsaXRGbG93KGJlZm9yZUNoaWxkLCBuZXdCb3gsIGNoaWxkLCBvbGRDb250aW51YXRpb24pOwot
fQotCi12b2lkIFJlbmRlcklubGluZTo6dXBkYXRlSGl0VGVzdFJlc3VsdChIaXRUZXN0UmVzdWx0
JiByZXN1bHQsIGNvbnN0IEludFBvaW50JiBwb2ludCkKLXsKLSAgICBpZiAocmVzdWx0LmlubmVy
Tm9kZSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBOb2RlKiBuID0gbm9kZSgpOwotICAgIElu
dFBvaW50IGxvY2FsUG9pbnQocG9pbnQpOwotICAgIGlmIChuKSB7Ci0gICAgICAgIGlmIChpc0lu
bGluZUNvbnRpbnVhdGlvbigpKSB7Ci0gICAgICAgICAgICAvLyBXZSdyZSBpbiB0aGUgY29udGlu
dWF0aW9uIG9mIGEgc3BsaXQgaW5saW5lLiAgQWRqdXN0IG91ciBsb2NhbCBwb2ludCB0byBiZSBp
biB0aGUgY29vcmRpbmF0ZSBzcGFjZQotICAgICAgICAgICAgLy8gb2YgdGhlIHByaW5jaXBhbCBy
ZW5kZXJlcidzIGNvbnRhaW5pbmcgYmxvY2suICBUaGlzIHdpbGwgZW5kIHVwIGJlaW5nIHRoZSBp
bm5lck5vblNoYXJlZE5vZGUuCi0gICAgICAgICAgICBSZW5kZXJCbG9jayogZmlyc3RCbG9jayA9
IG4tPnJlbmRlcmVyKCktPmNvbnRhaW5pbmdCbG9jaygpOwotICAgICAgICAgICAgCi0gICAgICAg
ICAgICAvLyBHZXQgb3VyIGNvbnRhaW5pbmcgYmxvY2suCi0gICAgICAgICAgICBSZW5kZXJCb3gq
IGJsb2NrID0gY29udGFpbmluZ0Jsb2NrKCk7Ci0gICAgICAgICAgICBsb2NhbFBvaW50Lm1vdmUo
YmxvY2stPngoKSAtIGZpcnN0QmxvY2stPngoKSwgYmxvY2stPnkoKSAtIGZpcnN0QmxvY2stPnko
KSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQuc2V0SW5uZXJOb2RlKG4pOwotICAgICAg
ICBpZiAoIXJlc3VsdC5pbm5lck5vblNoYXJlZE5vZGUoKSkKLSAgICAgICAgICAgIHJlc3VsdC5z
ZXRJbm5lck5vblNoYXJlZE5vZGUobik7Ci0gICAgICAgIHJlc3VsdC5zZXRMb2NhbFBvaW50KGxv
Y2FsUG9pbnQpOwotICAgIH0KLX0KLQogdm9pZCBSZW5kZXJJbmxpbmU6OmRpcnR5TGluZUJveGVz
KGJvb2wgZnVsbExheW91dCkKIHsKICAgICBpZiAoZnVsbExheW91dCkKQEAgLTk1MSwyMCArNjYx
LDkgQEAgdm9pZCBSZW5kZXJJbmxpbmU6OmFkZEZvY3VzUmluZ1JlY3RzKFZlYwogICAgICAgICAg
ICAgICAgIHBvcyA9IGN1cnItPmxvY2FsVG9BYnNvbHV0ZSgpOwogICAgICAgICAgICAgZWxzZSBp
ZiAoY3Vyci0+aXNCb3goKSkKICAgICAgICAgICAgICAgICBwb3MubW92ZSh0b1JlbmRlckJveChj
dXJyKS0+eCgpLCB0b1JlbmRlckJveChjdXJyKS0+eSgpKTsKLSAgICAgICAgICAgY3Vyci0+YWRk
Rm9jdXNSaW5nUmVjdHMocmVjdHMsIHBvcy54KCksIHBvcy55KCkpOworICAgICAgICAgICAgY3Vy
ci0+YWRkRm9jdXNSaW5nUmVjdHMocmVjdHMsIHBvcy54KCksIHBvcy55KCkpOwogICAgICAgICB9
CiAgICAgfQotCi0gICAgaWYgKGNvbnRpbnVhdGlvbigpKSB7Ci0gICAgICAgIGlmIChjb250aW51
YXRpb24oKS0+aXNJbmxpbmUoKSkKLSAgICAgICAgICAgIGNvbnRpbnVhdGlvbigpLT5hZGRGb2N1
c1JpbmdSZWN0cyhyZWN0cywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgdHggLSBjb250YWluaW5nQmxvY2soKS0+eCgpICsgY29udGludWF0aW9uKCktPmNv
bnRhaW5pbmdCbG9jaygpLT54KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgdHkgLSBjb250YWluaW5nQmxvY2soKS0+eSgpICsgY29udGludWF0aW9uKCkt
PmNvbnRhaW5pbmdCbG9jaygpLT55KCkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBjb250
aW51YXRpb24oKS0+YWRkRm9jdXNSaW5nUmVjdHMocmVjdHMsIAotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4IC0gY29udGFpbmluZ0Jsb2NrKCktPngoKSAr
IHRvUmVuZGVyQm94KGNvbnRpbnVhdGlvbigpKS0+eCgpLAotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHR5IC0gY29udGFpbmluZ0Jsb2NrKCktPnkoKSArIHRv
UmVuZGVyQm94KGNvbnRpbnVhdGlvbigpKS0+eSgpKTsKLSAgICB9CiB9CiAKIHZvaWQgUmVuZGVy
SW5saW5lOjpwYWludE91dGxpbmUoR3JhcGhpY3NDb250ZXh0KiBncmFwaGljc0NvbnRleHQsIGlu
dCB0eCwgaW50IHR5KQpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVySW5saW5lLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVySW5saW5lLmgJKHJldmlzaW9uIDU0
NTYxKQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVySW5saW5lLmgJKHdvcmtpbmcgY29weSkK
QEAgLTU4LDEwICs1OCw2IEBAIHB1YmxpYzoKIAogICAgIElubGluZUZsb3dCb3gqIGZpcnN0TGlu
ZUJveCgpIGNvbnN0IHsgcmV0dXJuIG1fbGluZUJveGVzLmZpcnN0TGluZUJveCgpOyB9CiAgICAg
SW5saW5lRmxvd0JveCogbGFzdExpbmVCb3goKSBjb25zdCB7IHJldHVybiBtX2xpbmVCb3hlcy5s
YXN0TGluZUJveCgpOyB9Ci0KLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogY29udGludWF0aW9u
KCkgY29uc3QgeyByZXR1cm4gbV9jb250aW51YXRpb247IH0KLQotICAgIHZpcnR1YWwgdm9pZCB1
cGRhdGVEcmFnU3RhdGUoYm9vbCBkcmFnT24pOwogICAgIAogICAgIEludFNpemUgcmVsYXRpdmVQ
b3NpdGlvbmVkSW5saW5lT2Zmc2V0KGNvbnN0IFJlbmRlckJveCogY2hpbGQpIGNvbnN0OwogCkBA
IC04MSw5ICs3Nyw2IEBAIHByaXZhdGU6CiAKICAgICB2aXJ0dWFsIGJvb2wgaXNSZW5kZXJJbmxp
bmUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CiAKLSAgICB2b2lkIGFkZENoaWxkVG9Db250aW51
YXRpb24oUmVuZGVyT2JqZWN0KiBuZXdDaGlsZCwgUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCk7
Ci0gICAgdmlydHVhbCB2b2lkIGFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24oUmVuZGVyT2Jq
ZWN0KiBuZXdDaGlsZCwgUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCA9IDApOwotCiAgICAgdm9p
ZCBzcGxpdElubGluZXMoUmVuZGVyQmxvY2sqIGZyb21CbG9jaywgUmVuZGVyQmxvY2sqIHRvQmxv
Y2ssIFJlbmRlckJsb2NrKiBtaWRkbGVCbG9jaywKICAgICAgICAgICAgICAgICAgICAgICBSZW5k
ZXJPYmplY3QqIGJlZm9yZUNoaWxkLCBSZW5kZXJCb3hNb2RlbE9iamVjdCogb2xkQ29udCk7CiAg
ICAgdm9pZCBzcGxpdEZsb3coUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCwgUmVuZGVyQmxvY2sq
IG5ld0Jsb2NrQm94LApAQCAtMTI2LDEzICsxMTksOCBAQCBwcml2YXRlOgogCiAgICAgdmlydHVh
bCBpbnQgbGluZUhlaWdodChib29sIGZpcnN0TGluZSwgYm9vbCBpc1Jvb3RMaW5lQm94ID0gZmFs
c2UpIGNvbnN0OwogCi0gICAgUmVuZGVySW5saW5lKiBpbmxpbmVDb250aW51YXRpb24oKSBjb25z
dDsKLSAgICB2b2lkIHNldENvbnRpbnVhdGlvbihSZW5kZXJCb3hNb2RlbE9iamVjdCogYykgeyBt
X2NvbnRpbnVhdGlvbiA9IGM7IH0KLSAgICAKICAgICB2aXJ0dWFsIHZvaWQgY2hpbGRCZWNhbWVO
b25JbmxpbmUoUmVuZGVyT2JqZWN0KiBjaGlsZCk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRl
SGl0VGVzdFJlc3VsdChIaXRUZXN0UmVzdWx0JiwgY29uc3QgSW50UG9pbnQmKTsKLQogICAgIHZp
cnR1YWwgdm9pZCBpbWFnZUNoYW5nZWQoV3JhcHBlZEltYWdlUHRyLCBjb25zdCBJbnRSZWN0KiA9
IDApOwogCiAjaWYgRU5BQkxFKERBU0hCT0FSRF9TVVBQT1JUKQpAQCAtMTQ1LDEzICsxMzMsMTAg
QEAgcHJpdmF0ZToKICAgICBzdGF0aWMgUmVuZGVySW5saW5lKiBjbG9uZUlubGluZShSZW5kZXJJ
bmxpbmUqIHNyYyk7CiAKICAgICB2b2lkIHBhaW50T3V0bGluZUZvckxpbmUoR3JhcGhpY3NDb250
ZXh0KiwgaW50IHR4LCBpbnQgdHksIGNvbnN0IEludFJlY3QmIHByZXZMaW5lLCBjb25zdCBJbnRS
ZWN0JiB0aGlzTGluZSwgY29uc3QgSW50UmVjdCYgbmV4dExpbmUpOwotICAgIFJlbmRlckJveE1v
ZGVsT2JqZWN0KiBjb250aW51YXRpb25CZWZvcmUoUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCk7
CiAKICAgICBSZW5kZXJPYmplY3RDaGlsZExpc3QgbV9jaGlsZHJlbjsKICAgICBSZW5kZXJMaW5l
Qm94TGlzdCBtX2xpbmVCb3hlczsgICAvLyBBbGwgb2YgdGhlIGxpbmUgYm94ZXMgY3JlYXRlZCBm
b3IgdGhpcyBpbmxpbmUgZmxvdy4gIEZvciBleGFtcGxlLCA8aT5IZWxsbzxicj53b3JsZC48L2k+
IHdpbGwgaGF2ZSB0d28gPGk+IGxpbmUgYm94ZXMuCiAKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVj
dCogbV9jb250aW51YXRpb247IC8vIENhbiBiZSBlaXRoZXIgYSBibG9jayBvciBhbiBpbmxpbmUu
IDxiPjxpPjxwPkhlbGxvPC9wPjwvaT48L2I+LiBJbiB0aGlzIGV4YW1wbGUgdGhlIDxpPiB3aWxs
IGhhdmUgYSBibG9jayBhcyBpdHMgY29udGludWF0aW9uIGJ1dCB0aGUKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDxiPiB3aWxsIGp1c3QgaGF2ZSBhbiBpbmxp
bmUgYXMgaXRzIGNvbnRpbnVhdGlvbi4KICAgICBtdXRhYmxlIGludCBtX2xpbmVIZWlnaHQ7CiAg
ICAgbXV0YWJsZSBpbnQgbV92ZXJ0aWNhbFBvc2l0aW9uOwogfTsKSW5kZXg6IFdlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlckxpbmVCb3hMaXN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRl
cmluZy9SZW5kZXJMaW5lQm94TGlzdC5jcHAJKHJldmlzaW9uIDU0NTYxKQorKysgV2ViQ29yZS9y
ZW5kZXJpbmcvUmVuZGVyTGluZUJveExpc3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNDYsMTIg
KzE0Niw2IEBAIHZvaWQgUmVuZGVyTGluZUJveExpc3Q6OmRpcnR5TGluZUJveGVzKCkKIAogdm9p
ZCBSZW5kZXJMaW5lQm94TGlzdDo6cGFpbnQoUmVuZGVyQm94TW9kZWxPYmplY3QqIHJlbmRlcmVy
LCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJbmZvLCBpbnQgdHgsIGludCB0eSkgY29u
c3QKIHsKLSAgICAvLyBPbmx5IHBhaW50IGR1cmluZyB0aGUgZm9yZWdyb3VuZC9zZWxlY3Rpb24g
cGhhc2VzLgotICAgIGlmIChwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZUZvcmVncm91bmQg
JiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VTZWxlY3Rpb24gJiYgcGFpbnRJbmZvLnBo
YXNlICE9IFBhaW50UGhhc2VPdXRsaW5lIAotICAgICAgICAmJiBwYWludEluZm8ucGhhc2UgIT0g
UGFpbnRQaGFzZVNlbGZPdXRsaW5lICYmIHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlQ2hp
bGRPdXRsaW5lcyAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZVRleHRDbGlwCi0gICAg
ICAgICYmIHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlTWFzaykKLSAgICAgICAgcmV0dXJu
OwotCiAgICAgQVNTRVJUKHJlbmRlcmVyLT5pc1JlbmRlckJsb2NrKCkgfHwgKHJlbmRlcmVyLT5p
c1JlbmRlcklubGluZSgpICYmIHJlbmRlcmVyLT5oYXNMYXllcigpKSk7IC8vIFRoZSBvbmx5IHdh
eSBhbiBpbmxpbmUgY291bGQgcGFpbnQgbGlrZSB0aGlzIGlzIGlmIGl0IGhhcyBhIGxheWVyLgog
CiAgICAgLy8gSWYgd2UgaGF2ZSBubyBsaW5lcyB0aGVuIHdlIGhhdmUgbm8gd29yayB0byBkby4K
QEAgLTE5NSwxMyArMTg5LDE3IEBAIHZvaWQgUmVuZGVyTGluZUJveExpc3Q6OnBhaW50KFJlbmRl
ckJveE0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGludCB0b3AgPSBtaW4o
Y3Vyci0+dG9wVmlzaWJsZU92ZXJmbG93KCksIGN1cnItPnJvb3QoKS0+c2VsZWN0aW9uVG9wKCkp
IC0gcmVuZGVyZXItPm1heGltYWxPdXRsaW5lU2l6ZShpbmZvLnBoYXNlKTsKKyAgICAgICAgUm9v
dElubGluZUJveCogcm9vdEJveCA9IGN1cnItPnJvb3QoKTsKKyAgICAgICAgaW50IHRvcCA9IG1p
bihjdXJyLT50b3BWaXNpYmxlT3ZlcmZsb3coKSwgcm9vdEJveC0+c2VsZWN0aW9uVG9wKCkpIC0g
cmVuZGVyZXItPm1heGltYWxPdXRsaW5lU2l6ZShpbmZvLnBoYXNlKTsKICAgICAgICAgaW50IGJv
dHRvbSA9IGN1cnItPmJvdHRvbVZpc2libGVPdmVyZmxvdygpICsgcmVuZGVyZXItPm1heGltYWxP
dXRsaW5lU2l6ZShpbmZvLnBoYXNlKTsKICAgICAgICAgaCA9IGJvdHRvbSAtIHRvcDsKICAgICAg
ICAgeVBvcyA9IHR5ICsgdG9wOwogICAgICAgICB2LT5zZXRNaW5pbXVtQ29sdW1uSGVpZ2h0KGgp
OwotICAgICAgICBpZiAoeVBvcyA8IGluZm8ucmVjdC5ib3R0b20oKSAmJiB5UG9zICsgaCA+IGlu
Zm8ucmVjdC55KCkpCi0gICAgICAgICAgICBjdXJyLT5wYWludChpbmZvLCB0eCwgdHkpOworICAg
ICAgICBpZiAoeVBvcyA8IGluZm8ucmVjdC5ib3R0b20oKSAmJiB5UG9zICsgaCA+IGluZm8ucmVj
dC55KCkpIHsKKyAgICAgICAgICAgIExpbmVCb3hQYWludEluZm8gbGluZUJveFBhaW50SW5mbzsK
KyAgICAgICAgICAgIGxpbmVCb3hQYWludEluZm8uYW5vbnltb3VzSW5saW5lQmxvY2sgPSByb290
Qm94LT5hbm9ueW1vdXNJbmxpbmVCbG9jaygpOworICAgICAgICAgICAgY3Vyci0+cGFpbnQoaW5m
bywgdHgsIHR5LCBsaW5lQm94UGFpbnRJbmZvKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGlm
IChpbmZvLnBoYXNlID09IFBhaW50UGhhc2VPdXRsaW5lIHx8IGluZm8ucGhhc2UgPT0gUGFpbnRQ
aGFzZVNlbGZPdXRsaW5lIHx8IGluZm8ucGhhc2UgPT0gUGFpbnRQaGFzZUNoaWxkT3V0bGluZXMp
IHsKQEAgLTIxNyw5ICsyMTUsNiBAQCB2b2lkIFJlbmRlckxpbmVCb3hMaXN0OjpwYWludChSZW5k
ZXJCb3hNCiAKIGJvb2wgUmVuZGVyTGluZUJveExpc3Q6OmhpdFRlc3QoUmVuZGVyQm94TW9kZWxP
YmplY3QqIHJlbmRlcmVyLCBjb25zdCBIaXRUZXN0UmVxdWVzdCYgcmVxdWVzdCwgSGl0VGVzdFJl
c3VsdCYgcmVzdWx0LCBpbnQgeCwgaW50IHksIGludCB0eCwgaW50IHR5LCBIaXRUZXN0QWN0aW9u
IGhpdFRlc3RBY3Rpb24pIGNvbnN0CiB7Ci0gICAgaWYgKGhpdFRlc3RBY3Rpb24gIT0gSGl0VGVz
dEZvcmVncm91bmQpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQogICAgIEFTU0VSVChyZW5kZXJl
ci0+aXNSZW5kZXJCbG9jaygpIHx8IChyZW5kZXJlci0+aXNSZW5kZXJJbmxpbmUoKSAmJiByZW5k
ZXJlci0+aGFzTGF5ZXIoKSkpOyAvLyBUaGUgb25seSB3YXkgYW4gaW5saW5lIGNvdWxkIGhpdCB0
ZXN0IGxpa2UgdGhpcyBpcyBpZiBpdCBoYXMgYSBsYXllci4KIAogICAgIC8vIElmIHdlIGhhdmUg
bm8gbGluZXMgdGhlbiB3ZSBoYXZlIG5vIHdvcmsgdG8gZG8uCkBAIC0yMzAsMjIgKzIyNSwzNSBA
QCBib29sIFJlbmRlckxpbmVCb3hMaXN0OjpoaXRUZXN0KFJlbmRlckJvCiAgICAgLy8gY29udGFp
biB0aGUgcG9pbnQuICBUaGlzIGlzIGEgcXVpY2sgc2hvcnQtY2lyY3VpdCB0aGF0IHdlIGNhbiB0
YWtlIHRvIGF2b2lkIHdhbGtpbmcgYW55IGxpbmVzLgogICAgIC8vIEZJWE1FOiBUaGlzIGNoZWNr
IGlzIGZsYXdlZCBpbiB0aGUgZm9sbG93aW5nIGV4dHJlbWVseSBvYnNjdXJlIHdheToKICAgICAv
LyBpZiBzb21lIGxpbmUgaW4gdGhlIG1pZGRsZSBoYXMgYSBodWdlIG92ZXJmbG93LCBpdCBtaWdo
dCBhY3R1YWxseSBleHRlbmQgYmVsb3cgdGhlIGxhc3QgbGluZS4KLSAgICBpZiAoKHkgPj0gdHkg
KyBsYXN0TGluZUJveCgpLT5yb290KCktPmJvdHRvbVZpc2libGVPdmVyZmxvdygpKSB8fCAoeSA8
IHR5ICsgZmlyc3RMaW5lQm94KCktPnJvb3QoKS0+dG9wVmlzaWJsZU92ZXJmbG93KCkpKQorICAg
IFJvb3RJbmxpbmVCb3gqIGZpcnN0Um9vdCA9IGZpcnN0TGluZUJveCgpLT5yb290KCk7CisgICAg
Um9vdElubGluZUJveCogbGFzdFJvb3QgPSBsYXN0TGluZUJveCgpLT5yb290KCk7CisgICAgaW50
IHRvcCA9IGZpcnN0Um9vdC0+dG9wVmlzaWJsZU92ZXJmbG93KCk7CisgICAgaW50IGJvdHRvbSA9
IGxhc3RSb290LT5ib3R0b21WaXNpYmxlT3ZlcmZsb3coKTsKKyAgICBpZiAobGFzdFJvb3QtPmhh
c0Fub255bW91c0lubGluZUJsb2NrKCkpCisgICAgICAgIGJvdHRvbSA9IG1heChib3R0b20sIGJv
dHRvbSArIGxhc3RSb290LT5hbm9ueW1vdXNJbmxpbmVCbG9jaygpLT5jb2xsYXBzZWRNYXJnaW5C
b3R0b20oKSk7CisgICAgaWYgKGZpcnN0Um9vdC0+aGFzQW5vbnltb3VzSW5saW5lQmxvY2soKSkK
KyAgICAgICAgdG9wID0gbWluKHRvcCwgdG9wICsgZmlyc3RSb290LT5hbm9ueW1vdXNJbmxpbmVC
bG9jaygpLT5jb2xsYXBzZWRNYXJnaW5Ub3AoKSk7CisgICAgaWYgKCh5ID49IHR5ICsgYm90dG9t
KSB8fCAoeSA8IHR5ICsgdG9wKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgLy8gU2Vl
IGlmIG91ciByb290IGxpbmVzIGNvbnRhaW4gdGhlIHBvaW50LiAgSWYgc28sIHRoZW4gd2UgaGl0
IHRlc3QKICAgICAvLyB0aGVtIGZ1cnRoZXIuICBOb3RlIHRoYXQgYm94ZXMgY2FuIGVhc2lseSBv
dmVybGFwLCBzbyB3ZSBjYW4ndCBtYWtlIGFueSBhc3N1bXB0aW9ucwogICAgIC8vIGJhc2VkIG9m
ZiBwb3NpdGlvbnMgb2Ygb3VyIGZpcnN0IGxpbmUgYm94IG9yIG91ciBsYXN0IGxpbmUgYm94Lgog
ICAgIGZvciAoSW5saW5lRmxvd0JveCogY3VyciA9IGxhc3RMaW5lQm94KCk7IGN1cnI7IGN1cnIg
PSBjdXJyLT5wcmV2Rmxvd0JveCgpKSB7Ci0gICAgICAgIGlmICh5ID49IHR5ICsgY3Vyci0+cm9v
dCgpLT50b3BWaXNpYmxlT3ZlcmZsb3coKSAmJiB5IDwgdHkgKyBjdXJyLT5yb290KCktPmJvdHRv
bVZpc2libGVPdmVyZmxvdygpKSB7Ci0gICAgICAgICAgICBib29sIGluc2lkZSA9IGN1cnItPm5v
ZGVBdFBvaW50KHJlcXVlc3QsIHJlc3VsdCwgeCwgeSwgdHgsIHR5KTsKKyAgICAgICAgUm9vdElu
bGluZUJveCogY3VyclJvb3QgPSBjdXJyLT5yb290KCk7CisgICAgICAgIGludCB0b3AgPSBjdXJy
Um9vdC0+dG9wVmlzaWJsZU92ZXJmbG93KCk7CisgICAgICAgIGludCBib3R0b20gPSBjdXJyUm9v
dC0+Ym90dG9tVmlzaWJsZU92ZXJmbG93KCk7CisgICAgICAgIGlmICh5ID49IHR5ICsgdG9wICYm
IHkgPCB0eSArIGJvdHRvbSkgeworICAgICAgICAgICAgTGluZUJveEhpdFRlc3RJbmZvIGhpdFRl
c3RJbmZvOworICAgICAgICAgICAgaGl0VGVzdEluZm8uYW5vbnltb3VzSW5saW5lQmxvY2sgPSBj
dXJyUm9vdC0+YW5vbnltb3VzSW5saW5lQmxvY2soKTsKKyAgICAgICAgICAgIGJvb2wgaW5zaWRl
ID0gY3Vyci0+bm9kZUF0UG9pbnQocmVxdWVzdCwgcmVzdWx0LCB4LCB5LCB0eCwgdHksIGhpdFRl
c3RBY3Rpb24sIGhpdFRlc3RJbmZvKTsKICAgICAgICAgICAgIGlmIChpbnNpZGUpIHsKICAgICAg
ICAgICAgICAgICByZW5kZXJlci0+dXBkYXRlSGl0VGVzdFJlc3VsdChyZXN1bHQsIEludFBvaW50
KHggLSB0eCwgeSAtIHR5KSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAg
ICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICByZXR1cm4gZmFsc2U7CiB9CiAK
QEAgLTI5Nyw2ICszMDUsMTAgQEAgdm9pZCBSZW5kZXJMaW5lQm94TGlzdDo6ZGlydHlMaW5lc0Zy
b21DaAogICAgICAgICBSb290SW5saW5lQm94KiBhZGphY2VudEJveDsKICAgICAgICAgYm94LT5t
YXJrRGlydHkoKTsKIAorICAgICAgICAvLyBXZSBkb24ndCBuZWVkIHRvIGRpcnR5IGFueSBvdGhl
ciBsaW5lcy4KKyAgICAgICAgaWYgKGJveC0+aGFzQW5vbnltb3VzSW5saW5lQmxvY2soKSkKKyAg
ICAgICAgICAgIHJldHVybjsKKwogICAgICAgICAvLyBkaXJ0eSB0aGUgYWRqYWNlbnQgbGluZXMg
dGhhdCBtaWdodCBiZSBhZmZlY3RlZAogICAgICAgICAvLyBOT1RFOiB3ZSBkaXJ0eSB0aGUgcHJl
dmlvdXMgbGluZSBiZWNhdXNlIFJvb3RJbmxpbmVCb3ggb2JqZWN0cyBjYWNoZQogICAgICAgICAv
LyB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3Qgb2JqZWN0IG9uIHRoZSBuZXh0IGxpbmUgYWZ0ZXIg
YSBCUiwgd2hpY2ggd2UgbWF5IGJlCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMaXN0
SXRlbS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGlzdEl0ZW0u
Y3BwCShyZXZpc2lvbiA1NDU2MSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckxpc3RJdGVt
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjcsNiArMjcsOCBAQAogI2luY2x1ZGUgIkNhY2hlZElt
YWdlLmgiCiAjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCiAjaW5jbHVkZSAiSFRNTE9MaXN0RWxlbWVu
dC5oIgorI2luY2x1ZGUgIklubGluZUl0ZXJhdG9yLmgiCisKICNpbmNsdWRlICJSZW5kZXJMaXN0
TWFya2VyLmgiCiAjaW5jbHVkZSAiUmVuZGVyVmlldy5oIgogI2luY2x1ZGUgPHd0Zi9TdGRMaWJF
eHRyYXMuaD4KQEAgLTE1MywxOCArMTU1LDQ0IEBAIGJvb2wgUmVuZGVyTGlzdEl0ZW06OmlzRW1w
dHkoKSBjb25zdAogICAgIHJldHVybiBsYXN0Q2hpbGQoKSA9PSBtX21hcmtlcjsKIH0KIAotc3Rh
dGljIFJlbmRlck9iamVjdCogZ2V0UGFyZW50T2ZGaXJzdExpbmVCb3goUmVuZGVyQmxvY2sqIGN1
cnIsIFJlbmRlck9iamVjdCogbWFya2VyKQordm9pZCBSZW5kZXJMaXN0SXRlbTo6dXBkYXRlVmFs
dWUoKQogewotICAgIFJlbmRlck9iamVjdCogZmlyc3RDaGlsZCA9IGN1cnItPmZpcnN0Q2hpbGQo
KTsKLSAgICBpZiAoIWZpcnN0Q2hpbGQpCi0gICAgICAgIHJldHVybiAwOworICAgIGlmICghbV9o
YXNFeHBsaWNpdFZhbHVlKSB7CisgICAgICAgIG1faXNWYWx1ZVVwVG9EYXRlID0gZmFsc2U7Cisg
ICAgICAgIGlmIChtX21hcmtlcikKKyAgICAgICAgICAgIG1fbWFya2VyLT5zZXROZWVkc0xheW91
dEFuZFByZWZXaWR0aHNSZWNhbGMoKTsKKyAgICB9Cit9CiAKLSAgICBmb3IgKFJlbmRlck9iamVj
dCogY3VyckNoaWxkID0gZmlyc3RDaGlsZDsgY3VyckNoaWxkOyBjdXJyQ2hpbGQgPSBjdXJyQ2hp
bGQtPm5leHRTaWJsaW5nKCkpIHsKK3N0YXRpYyBSZW5kZXJPYmplY3QqIGZpcnN0Tm9uTWFya2Vy
Q2hpbGQoUmVuZGVyT2JqZWN0KiBwYXJlbnQpCit7CisgICAgUmVuZGVyT2JqZWN0KiByZXN1bHQg
PSBwYXJlbnQtPmZpcnN0Q2hpbGQoKTsKKyAgICB3aGlsZSAocmVzdWx0ICYmIHJlc3VsdC0+aXNM
aXN0TWFya2VyKCkpCisgICAgICAgIHJlc3VsdCA9IHJlc3VsdC0+bmV4dFNpYmxpbmcoKTsKKyAg
ICByZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyBSZW5kZXJCbG9jayogbGlzdE1hcmtlckxv
Y2F0aW9uKFJlbmRlckJsb2NrKiBibG9jaywgUmVuZGVyTGlzdE1hcmtlciogbWFya2VyKQorewor
ICAgIGZvciAoUmVuZGVyT2JqZWN0KiBjdXJyQ2hpbGQgPSBibG9jay0+Zmlyc3RDaGlsZCgpOyBj
dXJyQ2hpbGQ7IGN1cnJDaGlsZCA9IGN1cnJDaGlsZC0+bmV4dFNpYmxpbmcoKSkgewogICAgICAg
ICBpZiAoY3VyckNoaWxkID09IG1hcmtlcikKICAgICAgICAgICAgIGNvbnRpbnVlOwogCi0gICAg
ICAgIGlmIChjdXJyQ2hpbGQtPmlzSW5saW5lKCkgJiYgKCFjdXJyQ2hpbGQtPmlzUmVuZGVySW5s
aW5lKCkgfHwgY3Vyci0+Z2VuZXJhdGVzTGluZUJveGVzRm9ySW5saW5lQ2hpbGQoY3VyckNoaWxk
KSkpCi0gICAgICAgICAgICByZXR1cm4gY3VycjsKKyAgICAgICAgaWYgKGN1cnJDaGlsZC0+aXNJ
bmxpbmUoKSkgeworICAgICAgICAgICAgaWYgKCFjdXJyQ2hpbGQtPmlzUmVuZGVySW5saW5lKCkp
CisgICAgICAgICAgICAgICAgcmV0dXJuIGJsb2NrOworICAgICAgICAgICAgSW5saW5lSXRlcmF0
b3IgaXQoYmxvY2ssIGN1cnJDaGlsZCwgMCk7CisgICAgICAgICAgICB3aGlsZSAoIWl0LmF0RW5k
KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXQub2JqLT5pc0Fub255bW91c0lubGluZUJsb2Nr
KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgUmVuZGVyQmxvY2sqIGxpbmVCb3hQYXJlbnQgPSBs
aXN0TWFya2VyTG9jYXRpb24odG9SZW5kZXJCbG9jayhpdC5vYmopLCBtYXJrZXIpOworICAgICAg
ICAgICAgICAgICAgICBpZiAobGluZUJveFBhcmVudCkKKyAgICAgICAgICAgICAgICAgICAgICAg
IHJldHVybiBsaW5lQm94UGFyZW50OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoUmVuZGVy
QmxvY2s6OnJlcXVpcmVzTGluZUJveChpdCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBi
bG9jazsKKyAgICAgICAgICAgICAgICBpdC5pbmNyZW1lbnQoKTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgfQogCiAgICAgICAgIGlmIChjdXJyQ2hpbGQtPmlzRmxvYXRpbmcoKSB8fCBjdXJyQ2hp
bGQtPmlzUG9zaXRpb25lZCgpKQogICAgICAgICAgICAgY29udGludWU7CkBAIC0xNzIsNDEgKzIw
MCwyNCBAQCBzdGF0aWMgUmVuZGVyT2JqZWN0KiBnZXRQYXJlbnRPZkZpcnN0TGluCiAgICAgICAg
IGlmIChjdXJyQ2hpbGQtPmlzVGFibGUoKSB8fCAhY3VyckNoaWxkLT5pc1JlbmRlckJsb2NrKCkp
CiAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBpZiAoY3Vyci0+aXNMaXN0SXRlbSgpICYm
IGN1cnJDaGlsZC0+c3R5bGUoKS0+aHRtbEhhY2tzKCkgJiYgY3VyckNoaWxkLT5ub2RlKCkgJiYK
LSAgICAgICAgICAgIChjdXJyQ2hpbGQtPm5vZGUoKS0+aGFzVGFnTmFtZSh1bFRhZyl8fCBjdXJy
Q2hpbGQtPm5vZGUoKS0+aGFzVGFnTmFtZShvbFRhZykpKQorICAgICAgICBpZiAoYmxvY2stPmlz
TGlzdEl0ZW0oKSAmJiBjdXJyQ2hpbGQtPnN0eWxlKCktPmh0bWxIYWNrcygpICYmIGN1cnJDaGls
ZC0+bm9kZSgpICYmCisgICAgICAgICAgICAoY3VyckNoaWxkLT5ub2RlKCktPmhhc1RhZ05hbWUo
dWxUYWcpIHx8IGN1cnJDaGlsZC0+bm9kZSgpLT5oYXNUYWdOYW1lKG9sVGFnKSkpCiAgICAgICAg
ICAgICBicmVhazsKIAotICAgICAgICBSZW5kZXJPYmplY3QqIGxpbmVCb3ggPSBnZXRQYXJlbnRP
ZkZpcnN0TGluZUJveCh0b1JlbmRlckJsb2NrKGN1cnJDaGlsZCksIG1hcmtlcik7Ci0gICAgICAg
IGlmIChsaW5lQm94KQotICAgICAgICAgICAgcmV0dXJuIGxpbmVCb3g7CisgICAgICAgIFJlbmRl
ckJsb2NrKiBsaW5lQm94UGFyZW50ID0gbGlzdE1hcmtlckxvY2F0aW9uKHRvUmVuZGVyQmxvY2so
Y3VyckNoaWxkKSwgbWFya2VyKTsKKyAgICAgICAgaWYgKGxpbmVCb3hQYXJlbnQpCisgICAgICAg
ICAgICByZXR1cm4gbGluZUJveFBhcmVudDsKICAgICB9CiAKICAgICByZXR1cm4gMDsKIH0KIAot
dm9pZCBSZW5kZXJMaXN0SXRlbTo6dXBkYXRlVmFsdWUoKQotewotICAgIGlmICghbV9oYXNFeHBs
aWNpdFZhbHVlKSB7Ci0gICAgICAgIG1faXNWYWx1ZVVwVG9EYXRlID0gZmFsc2U7Ci0gICAgICAg
IGlmIChtX21hcmtlcikKLSAgICAgICAgICAgIG1fbWFya2VyLT5zZXROZWVkc0xheW91dEFuZFBy
ZWZXaWR0aHNSZWNhbGMoKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBSZW5kZXJPYmplY3QqIGZpcnN0
Tm9uTWFya2VyQ2hpbGQoUmVuZGVyT2JqZWN0KiBwYXJlbnQpCi17Ci0gICAgUmVuZGVyT2JqZWN0
KiByZXN1bHQgPSBwYXJlbnQtPmZpcnN0Q2hpbGQoKTsKLSAgICB3aGlsZSAocmVzdWx0ICYmIHJl
c3VsdC0+aXNMaXN0TWFya2VyKCkpCi0gICAgICAgIHJlc3VsdCA9IHJlc3VsdC0+bmV4dFNpYmxp
bmcoKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCiB2b2lkIFJlbmRlckxpc3RJdGVtOjp1cGRh
dGVNYXJrZXJMb2NhdGlvbigpCiB7CiAgICAgLy8gU2FuaXR5IGNoZWNrIHRoZSBsb2NhdGlvbiBv
ZiBvdXIgbWFya2VyLgogICAgIGlmIChtX21hcmtlcikgewogICAgICAgICBSZW5kZXJPYmplY3Qq
IG1hcmtlclBhciA9IG1fbWFya2VyLT5wYXJlbnQoKTsKLSAgICAgICAgUmVuZGVyT2JqZWN0KiBs
aW5lQm94UGFyZW50ID0gZ2V0UGFyZW50T2ZGaXJzdExpbmVCb3godGhpcywgbV9tYXJrZXIpOwor
ICAgICAgICBSZW5kZXJPYmplY3QqIGxpbmVCb3hQYXJlbnQgPSBsaXN0TWFya2VyTG9jYXRpb24o
dGhpcywgbV9tYXJrZXIpOwogICAgICAgICBpZiAoIWxpbmVCb3hQYXJlbnQpIHsKICAgICAgICAg
ICAgIC8vIElmIHRoZSBtYXJrZXIgaXMgY3VycmVudGx5IGNvbnRhaW5lZCBpbnNpZGUgYW4gYW5v
bnltb3VzIGJveCwKICAgICAgICAgICAgIC8vIHRoZW4gd2UgYXJlIHRoZSBvbmx5IGl0ZW0gaW4g
dGhhdCBhbm9ueW1vdXMgYm94IChzaW5jZSBubyBsaW5lIGJveApAQCAtMjU3LDkgKzI2OCwxMSBA
QCB2b2lkIFJlbmRlckxpc3RJdGVtOjpwb3NpdGlvbkxpc3RNYXJrZXIoCiAgICAgICAgIGludCBt
YXJrZXJPbGRYID0gbV9tYXJrZXItPngoKTsKICAgICAgICAgaW50IHlPZmZzZXQgPSAwOwogICAg
ICAgICBpbnQgeE9mZnNldCA9IDA7Ci0gICAgICAgIGZvciAoUmVuZGVyQm94KiBvID0gbV9tYXJr
ZXItPnBhcmVudEJveCgpOyBvICE9IHRoaXM7IG8gPSBvLT5wYXJlbnRCb3goKSkgewotICAgICAg
ICAgICAgeU9mZnNldCArPSBvLT55KCk7Ci0gICAgICAgICAgICB4T2Zmc2V0ICs9IG8tPngoKTsK
KyAgICAgICAgZm9yIChSZW5kZXJPYmplY3QqIG8gPSBtX21hcmtlci0+cGFyZW50KCk7IG8gIT0g
dGhpczsgbyA9IG8tPnBhcmVudCgpKSB7CisgICAgICAgICAgICBpZiAoby0+aXNCb3goKSkgewor
ICAgICAgICAgICAgICAgIHlPZmZzZXQgKz0gdG9SZW5kZXJCb3gobyktPnkoKTsKKyAgICAgICAg
ICAgICAgICB4T2Zmc2V0ICs9IHRvUmVuZGVyQm94KG8pLT54KCk7CisgICAgICAgICAgICB9CiAg
ICAgICAgIH0KIAogICAgICAgICBib29sIGFkanVzdE92ZXJmbG93ID0gZmFsc2U7CkBAIC0yOTUs
MTMgKzMwOCwxNCBAQCB2b2lkIFJlbmRlckxpc3RJdGVtOjpwb3NpdGlvbkxpc3RNYXJrZXIoCiAK
ICAgICAgICAgaWYgKGFkanVzdE92ZXJmbG93KSB7CiAgICAgICAgICAgICBJbnRSZWN0IG1hcmtl
clJlY3QobWFya2VyWFBvcyArIHhPZmZzZXQsIHlPZmZzZXQsIG1fbWFya2VyLT53aWR0aCgpLCBt
X21hcmtlci0+aGVpZ2h0KCkpOwotICAgICAgICAgICAgUmVuZGVyQm94KiBvID0gbV9tYXJrZXI7
CisgICAgICAgICAgICBSZW5kZXJPYmplY3QqIG8gPSBtX21hcmtlcjsKICAgICAgICAgICAgIGRv
IHsKLSAgICAgICAgICAgICAgICBvID0gby0+cGFyZW50Qm94KCk7CisgICAgICAgICAgICAgICAg
byA9IG8tPnBhcmVudCgpOwogICAgICAgICAgICAgICAgIGlmIChvLT5pc1JlbmRlckJsb2NrKCkp
CiAgICAgICAgICAgICAgICAgICAgIHRvUmVuZGVyQmxvY2sobyktPmFkZExheW91dE92ZXJmbG93
KG1hcmtlclJlY3QpOwotICAgICAgICAgICAgICAgIG1hcmtlclJlY3QubW92ZSgtby0+eCgpLCAt
by0+eSgpKTsKLSAgICAgICAgICAgIH0gd2hpbGUgKG8gIT0gdGhpcyAmJiAhby0+aGFzU2VsZlBh
aW50aW5nTGF5ZXIoKSk7CisgICAgICAgICAgICAgICAgaWYgKG8tPmlzQm94KCkpCisgICAgICAg
ICAgICAgICAgICAgIG1hcmtlclJlY3QubW92ZSgtdG9SZW5kZXJCb3gobyktPngoKSwgLXRvUmVu
ZGVyQm94KG8pLT55KCkpOworICAgICAgICAgICAgfSB3aGlsZSAobyAhPSB0aGlzICYmICghby0+
aXNCb3goKSB8fCAhdG9SZW5kZXJCb3gobyktPmhhc1NlbGZQYWludGluZ0xheWVyKCkpKTsgLy8g
RklYTUU6IEludmVzdGlnYXRlIDxsaT48c3BhbiBzdHlsZT0icG9zaXRpb246cmVsYXRpdmU7bGVm
dDotMTAwcHgiPjxkaXY+dGV4dDwvZGl2Pjwvc3Bhbj48L2xpPgogICAgICAgICB9CiAgICAgfQog
fQpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3QuY3BwCShyZXZpc2lvbiA1NDU2MSkKKysr
IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIy
MzAsOCArMjIzMCw2IEBAIHZvaWQgUmVuZGVyT2JqZWN0OjpnZXRUZXh0RGVjb3JhdGlvbkNvbG8K
ICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBjdXJyID0gY3Vyci0+cGFyZW50KCk7
Ci0gICAgICAgIGlmIChjdXJyICYmIGN1cnItPmlzUmVuZGVyQmxvY2soKSAmJiB0b1JlbmRlckJs
b2NrKGN1cnIpLT5pbmxpbmVDb250aW51YXRpb24oKSkKLSAgICAgICAgICAgIGN1cnIgPSB0b1Jl
bmRlckJsb2NrKGN1cnIpLT5pbmxpbmVDb250aW51YXRpb24oKTsKICAgICB9IHdoaWxlIChjdXJy
ICYmIGRlY29yYXRpb25zICYmICghcXVpcmtzTW9kZSB8fCAhY3Vyci0+bm9kZSgpIHx8CiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFjdXJyLT5ub2RlKCktPmhhc1RhZ05h
bWUoYVRhZykgJiYgIWN1cnItPm5vZGUoKS0+aGFzVGFnTmFtZShmb250VGFnKSkpKTsKIApJbmRl
eDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmgJKHJldmlzaW9uIDU0NTYxKQorKysgV2ViQ29yZS9y
ZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmgJKHdvcmtpbmcgY29weSkKQEAgLTM2NCw3ICszNjQsMTEg
QEAgcHVibGljOgogICAgIHZvaWQgc2V0SXNBbm9ueW1vdXMoYm9vbCBiKSB7IG1faXNBbm9ueW1v
dXMgPSBiOyB9CiAgICAgYm9vbCBpc0Fub255bW91c0Jsb2NrKCkgY29uc3QKICAgICB7Ci0gICAg
ICAgIHJldHVybiBtX2lzQW5vbnltb3VzICYmIHN0eWxlKCktPmRpc3BsYXkoKSA9PSBCTE9DSyAm
JiBzdHlsZSgpLT5zdHlsZVR5cGUoKSA9PSBOT1BTRVVETyAmJiAhaXNMaXN0TWFya2VyKCk7Cisg
ICAgICAgIHJldHVybiBtX2lzQW5vbnltb3VzICYmIHN0eWxlKCktPmRpc3BsYXkoKSA9PSBCTE9D
SyAmJiBzdHlsZSgpLT5zdHlsZVR5cGUoKSA9PSBOT1BTRVVETyAmJiAhaXNUZXh0KCkgJiYgIWlz
TGlzdE1hcmtlcigpOworICAgIH0KKyAgICBib29sIGlzQW5vbnltb3VzSW5saW5lQmxvY2soKSBj
b25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1faXNBbm9ueW1vdXMgJiYgc3R5bGUoKS0+ZGlz
cGxheSgpID09IElOTElORV9CTE9DSyAmJiBzdHlsZSgpLT5zdHlsZVR5cGUoKSA9PSBOT1BTRVVE
TyAmJiAhaXNUZXh0KCkgJiYgIWlzUnVieVJ1bigpICYmICFpc1J1YnlCYXNlKCk7CiAgICAgfQog
ICAgIGJvb2wgaXNJbmxpbmVDb250aW51YXRpb24oKSBjb25zdCB7IHJldHVybiAobm9kZSgpID8g
bm9kZSgpLT5yZW5kZXJlcigpICE9IHRoaXMgOiBmYWxzZSkgJiYgaXNSZW5kZXJJbmxpbmUoKTsg
fQogICAgIGJvb2wgaXNGbG9hdGluZygpIGNvbnN0IHsgcmV0dXJuIG1fZmxvYXRpbmc7IH0KSW5k
ZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdENoaWxkTGlzdC5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0Q2hpbGRMaXN0LmNwcAkocmV2aXNp
b24gNTQ1NjEpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3RDaGlsZExpc3QuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0zMTYsMTYgKzMxNiw2IEBAIHZvaWQgUmVuZGVyT2JqZWN0Q2hp
bGRMaXN0Ojp1cGRhdGVCZWZvcmUKIAogICAgIC8vIFdoZXRoZXIgb3Igbm90IHdlIG5vdyB3YW50
IGdlbmVyYXRlZCBjb250ZW50LiAgCiAgICAgYm9vbCBuZXdDb250ZW50V2FudGVkID0gcHNldWRv
RWxlbWVudFN0eWxlICYmIHBzZXVkb0VsZW1lbnRTdHlsZS0+ZGlzcGxheSgpICE9IE5PTkU7Ci0K
LSAgICAvLyBGb3IgPHE+PHAvPjwvcT4sIGlmIHRoaXMgb2JqZWN0IGlzIHRoZSBpbmxpbmUgY29u
dGludWF0aW9uIG9mIHRoZSA8cT4sIHdlIG9ubHkgd2FudCB0byBnZW5lcmF0ZQotICAgIC8vIDph
ZnRlciBjb250ZW50IGFuZCBub3QgOmJlZm9yZSBjb250ZW50LgotICAgIGlmIChuZXdDb250ZW50
V2FudGVkICYmIHR5cGUgPT0gQkVGT1JFICYmIG93bmVyLT5pc1JlbmRlcklubGluZSgpICYmIHRv
UmVuZGVySW5saW5lKG93bmVyKS0+aXNJbmxpbmVDb250aW51YXRpb24oKSkKLSAgICAgICAgbmV3
Q29udGVudFdhbnRlZCA9IGZhbHNlOwotCi0gICAgLy8gU2ltaWxhcmx5LCBpZiB3ZSdyZSB0aGUg
YmVnaW5uaW5nIG9mIGEgPHE+LCBhbmQgdGhlcmUncyBhbiBpbmxpbmUgY29udGludWF0aW9uIGZv
ciBvdXIgb2JqZWN0LAotICAgIC8vIHRoZW4gd2UgZG9uJ3QgZ2VuZXJhdGUgdGhlIDphZnRlciBj
b250ZW50LgotICAgIGlmIChuZXdDb250ZW50V2FudGVkICYmIHR5cGUgPT0gQUZURVIgJiYgb3du
ZXItPmlzUmVuZGVySW5saW5lKCkgJiYgdG9SZW5kZXJJbmxpbmUob3duZXIpLT5jb250aW51YXRp
b24oKSkKLSAgICAgICAgbmV3Q29udGVudFdhbnRlZCA9IGZhbHNlOwogICAgIAogICAgIC8vIElm
IHdlIGRvbid0IHdhbnQgZ2VuZXJhdGVkIGNvbnRlbnQgYW55IGxvbmdlciwgb3IgaWYgd2UgaGF2
ZSBnZW5lcmF0ZWQgY29udGVudCwgYnV0IGl0J3Mgbm8gbG9uZ2VyCiAgICAgLy8gaWRlbnRpY2Fs
IHRvIHRoZSBuZXcgY29udGVudCBkYXRhIHdlIHdhbnQgdG8gYnVpbGQgcmVuZGVyIG9iamVjdHMg
Zm9yLCB0aGVuIHdlIG51a2UgYWxsCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJSdWJ5
QmFzZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyUnVieUJhc2Uu
Y3BwCShyZXZpc2lvbiA1NDU2MSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclJ1YnlCYXNl
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTE2LDcgKzExNiw2IEBAIHZvaWQgUmVuZGVyUnVieUJh
c2U6Om1vdmVCbG9ja0NoaWxkcmVuKFIKICAgICAgICAgICAgICAgICBpZiAoY2hpbGQtPmlzQW5v
bnltb3VzQmxvY2soKSkgewogICAgICAgICAgICAgICAgICAgICBSZW5kZXJCbG9jayogYW5vbkJs
b2NrID0gdG9SZW5kZXJCbG9jayhjaGlsZCk7CiAgICAgICAgICAgICAgICAgICAgIEFTU0VSVChh
bm9uQmxvY2stPmNoaWxkcmVuSW5saW5lKCkpOwotICAgICAgICAgICAgICAgICAgICBBU1NFUlQo
IWFub25CbG9jay0+aW5saW5lQ29udGludWF0aW9uKCkpOwogICAgICAgICAgICAgICAgICAgICBh
bm9uQmxvY2stPm1vdmVBbGxDaGlsZHJlblRvKHRvQmFzZSwgdG9CYXNlLT5jaGlsZHJlbigpKTsK
ICAgICAgICAgICAgICAgICAgICAgYW5vbkJsb2NrLT5kZWxldGVMaW5lQm94VHJlZSgpOwogICAg
ICAgICAgICAgICAgICAgICBhbm9uQmxvY2stPmRlc3Ryb3koKTsKQEAgLTE0Myw3ICsxNDIsNiBA
QCB2b2lkIFJlbmRlclJ1YnlCYXNlOjptb3ZlQmxvY2tDaGlsZHJlbihSCiAKICAgICAgICAgICAg
ICAgICAgICAgUmVuZGVyQmxvY2sqIGFub25CbG9jayA9IHRvUmVuZGVyQmxvY2soY2hpbGQpOwog
ICAgICAgICAgICAgICAgICAgICBBU1NFUlQoYW5vbkJsb2NrLT5jaGlsZHJlbklubGluZSgpKTsK
LSAgICAgICAgICAgICAgICAgICAgQVNTRVJUKCFhbm9uQmxvY2stPmlubGluZUNvbnRpbnVhdGlv
bigpKTsKICAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSBpbmxpbmUgY2hpbGRyZW4gb3V0IG9m
IGFub255bW91cyBibG9jay4KICAgICAgICAgICAgICAgICAgICAgYW5vbkJsb2NrLT5tb3ZlQWxs
Q2hpbGRyZW5Ubyh0aGlzLCBjaGlsZHJlbigpLCBhbm9uQmxvY2spOwogICAgICAgICAgICAgICAg
ICAgICBhbm9uQmxvY2stPmRlbGV0ZUxpbmVCb3hUcmVlKCk7CkluZGV4OiBXZWJDb3JlL3JlbmRl
cmluZy9Sb290SW5saW5lQm94LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9S
b290SW5saW5lQm94LmNwcAkocmV2aXNpb24gNTQ1NjEpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9S
b290SW5saW5lQm94LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1
ZGUgIlBhZ2UuaCIKICNpbmNsdWRlICJSZW5kZXJBcmVuYS5oIgogI2luY2x1ZGUgIlJlbmRlckJs
b2NrLmgiCisjaW5jbHVkZSAiUmVuZGVyVmlldy5oIgogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwog
CkBAIC0xNjEsOSArMTYyLDE1IEBAIHZvaWQgUm9vdElubGluZUJveDo6cGFpbnRDdXN0b21IaWdo
bGlnaHQKIAogI2VuZGlmCiAKLXZvaWQgUm9vdElubGluZUJveDo6cGFpbnQoUmVuZGVyT2JqZWN0
OjpQYWludEluZm8mIHBhaW50SW5mbywgaW50IHR4LCBpbnQgdHkpCit2b2lkIFJvb3RJbmxpbmVC
b3g6OnBhaW50KFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGludCB0eCwgaW50
IHR5LCBMaW5lQm94UGFpbnRJbmZvJiBsaW5lQm94UGFpbnRJbmZvKQogewotICAgIElubGluZUZs
b3dCb3g6OnBhaW50KHBhaW50SW5mbywgdHgsIHR5KTsKKyAgICAvLyBPbmx5IHBhaW50IGR1cmlu
ZyB0aGUgZm9yZWdyb3VuZC9zZWxlY3Rpb24gcGhhc2VzLgorICAgIGlmIChwYWludEluZm8ucGhh
c2UgIT0gUGFpbnRQaGFzZUZvcmVncm91bmQgJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhh
c2VTZWxlY3Rpb24gJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VPdXRsaW5lIAorICAg
ICAgICAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZVNlbGZPdXRsaW5lICYmIHBhaW50
SW5mby5waGFzZSAhPSBQYWludFBoYXNlQ2hpbGRPdXRsaW5lcyAmJiBwYWludEluZm8ucGhhc2Ug
IT0gUGFpbnRQaGFzZVRleHRDbGlwCisgICAgICAgICYmIHBhaW50SW5mby5waGFzZSAhPSBQYWlu
dFBoYXNlTWFzaykKKyAgICAgICAgcmV0dXJuOworCisgICAgSW5saW5lRmxvd0JveDo6cGFpbnQo
cGFpbnRJbmZvLCB0eCwgdHksIGxpbmVCb3hQYWludEluZm8pOwogICAgIHBhaW50RWxsaXBzaXNC
b3gocGFpbnRJbmZvLCB0eCwgdHkpOwogI2lmIFBMQVRGT1JNKE1BQykKICAgICBSZW5kZXJTdHls
ZSogc3R5bGVUb1VzZSA9IHJlbmRlcmVyKCktPnN0eWxlKG1fZmlyc3RMaW5lKTsKQEAgLTE3Miwx
NSArMTc5LDE4IEBAIHZvaWQgUm9vdElubGluZUJveDo6cGFpbnQoUmVuZGVyT2JqZWN0OjoKICNl
bmRpZgogfQogCi1ib29sIFJvb3RJbmxpbmVCb3g6Om5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RS
ZXF1ZXN0JiByZXF1ZXN0LCBIaXRUZXN0UmVzdWx0JiByZXN1bHQsIGludCB4LCBpbnQgeSwgaW50
IHR4LCBpbnQgdHkpCitib29sIFJvb3RJbmxpbmVCb3g6Om5vZGVBdFBvaW50KGNvbnN0IEhpdFRl
c3RSZXF1ZXN0JiByZXF1ZXN0LCBIaXRUZXN0UmVzdWx0JiByZXN1bHQsIGludCB4LCBpbnQgeSwg
aW50IHR4LCBpbnQgdHksIEhpdFRlc3RBY3Rpb24gaGl0VGVzdEFjdGlvbiwgTGluZUJveEhpdFRl
c3RJbmZvJiBoaXRUZXN0SW5mbykKIHsKKyAgICBpZiAoaGl0VGVzdEFjdGlvbiAhPSBIaXRUZXN0
Rm9yZWdyb3VuZCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCiAgICAgaWYgKG1faGFzRWxsaXBz
aXNCb3ggJiYgdmlzaWJsZVRvSGl0VGVzdGluZygpKSB7Ci0gICAgICAgIGlmIChlbGxpcHNpc0Jv
eCgpLT5ub2RlQXRQb2ludChyZXF1ZXN0LCByZXN1bHQsIHgsIHksIHR4LCB0eSkpIHsKKyAgICAg
ICAgaWYgKGVsbGlwc2lzQm94KCktPm5vZGVBdFBvaW50KHJlcXVlc3QsIHJlc3VsdCwgeCwgeSwg
dHgsIHR5LCBoaXRUZXN0QWN0aW9uLCBoaXRUZXN0SW5mbykpIHsKICAgICAgICAgICAgIHJlbmRl
cmVyKCktPnVwZGF0ZUhpdFRlc3RSZXN1bHQocmVzdWx0LCBJbnRQb2ludCh4IC0gdHgsIHkgLSB0
eSkpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0
dXJuIElubGluZUZsb3dCb3g6Om5vZGVBdFBvaW50KHJlcXVlc3QsIHJlc3VsdCwgeCwgeSwgdHgs
IHR5KTsKKyAgICByZXR1cm4gSW5saW5lRmxvd0JveDo6bm9kZUF0UG9pbnQocmVxdWVzdCwgcmVz
dWx0LCB4LCB5LCB0eCwgdHksIEhpdFRlc3RGb3JlZ3JvdW5kLCBoaXRUZXN0SW5mbyk7CiB9CiAK
IHZvaWQgUm9vdElubGluZUJveDo6YWRqdXN0UG9zaXRpb24oaW50IGR4LCBpbnQgZHkpCkBAIC0y
MDQsNiArMjE0LDIzIEBAIHZvaWQgUm9vdElubGluZUJveDo6Y2hpbGRSZW1vdmVkKElubGluZUIK
IAogaW50IFJvb3RJbmxpbmVCb3g6OnZlcnRpY2FsbHlBbGlnbkJveGVzKGludCBoZWlnaHRPZkJs
b2NrKQogeworICAgIFJlbmRlckJsb2NrKiBpbmxpbmVCbG9jayA9IGFub255bW91c0lubGluZUJs
b2NrKCk7CisgICAgaWYgKGlubGluZUJsb2NrKSB7CisgICAgICAgIGludCBsaW5lVG9wID0gaW5s
aW5lQmxvY2stPnkoKTsKKyAgICAgICAgaW50IGxpbmVCb3R0b20gPSBpbmxpbmVCbG9jay0+eSgp
ICsgaW5saW5lQmxvY2stPmhlaWdodCgpOworICAgICAgICBmb3IgKElubGluZUJveCogY3VyciA9
IGZpcnN0Q2hpbGQoKTsgY3VycjsgY3VyciA9IHN0YXRpY19jYXN0PElubGluZUZsb3dCb3gqPihj
dXJyKS0+Zmlyc3RDaGlsZCgpKSB7CisgICAgICAgICAgICBjdXJyLT5zZXRYKGlubGluZUJsb2Nr
LT54KCkpOworICAgICAgICAgICAgY3Vyci0+c2V0WShsaW5lVG9wKTsKKyAgICAgICAgICAgIGN1
cnItPnNldFdpZHRoKGlubGluZUJsb2NrLT53aWR0aCgpKTsKKyAgICAgICAgICAgIGlmIChjdXJy
LT5yZW5kZXJlcigpID09IGlubGluZUJsb2NrKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICB9CisgICAgICAgIHNldFkobGluZVRvcCk7CisgICAgICAgIGNvbXB1dGVWZXJ0aWNhbE92
ZXJmbG93KGxpbmVUb3AsIGxpbmVCb3R0b20sIHRydWUpOworICAgICAgICBzZXRMaW5lVG9wQm90
dG9tUG9zaXRpb25zKGxpbmVUb3AsIGxpbmVCb3R0b20pOworICAgICAgICByZXR1cm4gaGVpZ2h0
T2ZCbG9jazsKKyAgICB9CisgICAgCiAgICAgaW50IG1heFBvc2l0aW9uVG9wID0gMDsKICAgICBp
bnQgbWF4UG9zaXRpb25Cb3R0b20gPSAwOwogICAgIGludCBtYXhBc2NlbnQgPSAwOwpAQCAtMjE3
LDcgKzI0NCw2IEBAIGludCBSb290SW5saW5lQm94Ojp2ZXJ0aWNhbGx5QWxpZ25Cb3hlcygKICAg
ICBib29sIHN0cmljdE1vZGUgPSAoY3VyciAmJiBjdXJyLT5kb2N1bWVudCgpLT5pblN0cmljdE1v
ZGUoKSk7CiAKICAgICBjb21wdXRlTG9naWNhbEJveEhlaWdodHMobWF4UG9zaXRpb25Ub3AsIG1h
eFBvc2l0aW9uQm90dG9tLCBtYXhBc2NlbnQsIG1heERlc2NlbnQsIHN0cmljdE1vZGUpOwotCiAg
ICAgaWYgKG1heEFzY2VudCArIG1heERlc2NlbnQgPCBtYXgobWF4UG9zaXRpb25Ub3AsIG1heFBv
c2l0aW9uQm90dG9tKSkKICAgICAgICAgYWRqdXN0TWF4QXNjZW50QW5kRGVzY2VudChtYXhBc2Nl
bnQsIG1heERlc2NlbnQsIG1heFBvc2l0aW9uVG9wLCBtYXhQb3NpdGlvbkJvdHRvbSk7CiAKQEAg
LTMzMiw3ICszNTgsNyBAQCBJbmxpbmVCb3gqIFJvb3RJbmxpbmVCb3g6Omxhc3RTZWxlY3RlZEJv
CiBpbnQgUm9vdElubGluZUJveDo6c2VsZWN0aW9uVG9wKCkgY29uc3QKIHsKICAgICBpbnQgc2Vs
ZWN0aW9uVG9wID0gbV9saW5lVG9wOwotICAgIGlmICghcHJldlJvb3RCb3goKSkKKyAgICBpZiAo
IXByZXZSb290Qm94KCkgfHwgcHJldlJvb3RCb3goKS0+aGFzQW5vbnltb3VzSW5saW5lQmxvY2so
KSkKICAgICAgICAgcmV0dXJuIHNlbGVjdGlvblRvcDsKIAogICAgIGludCBwcmV2Qm90dG9tID0g
cHJldlJvb3RCb3goKS0+c2VsZWN0aW9uQm90dG9tKCk7CkBAIC00MzAsNCArNDU2LDI1IEBAIHZv
aWQgUm9vdElubGluZUJveDo6YXR0YWNoTGluZUJveFRvUmVuZGUKICAgICBibG9jaygpLT5saW5l
Qm94ZXMoKS0+YXR0YWNoTGluZUJveCh0aGlzKTsKIH0KIAorUmVuZGVyQmxvY2sqIFJvb3RJbmxp
bmVCb3g6OmFub255bW91c0lubGluZUJsb2NrKCkgY29uc3QKK3sKKyAgICBpZiAoaGFzQW5vbnlt
b3VzSW5saW5lQmxvY2soKSkKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IFJvb3RB
bm9ueW1vdXNJbmxpbmVCbG9ja0JveCo+KHRoaXMpLT5pbmxpbmVCbG9jaygpOworICAgIHJldHVy
biAwOworfQorCit2b2lkIFJvb3RBbm9ueW1vdXNJbmxpbmVCbG9ja0JveDo6cGFpbnQoUmVuZGVy
T2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgaW50IHR4LCBpbnQgdHksIExpbmVCb3hQYWlu
dEluZm8mIGxpbmVCb3hQYWludEluZm8pCit7CisgICAgLy8gU2tpcCB0aGUgZXh0cmEgd29yayBk
b25lIGJ5IFJvb3RJbmxpbmVCb3g6OnBhaW50LiBDYWNoZSBvdXIgYW5vbnltb3VzIGJsb2NrIGlu
IHRoZSBwYWludCBpbmZvIGZvciBlYXN5CisgICAgLy8gYWNjZXNzIGFzIHdlIHJlY3VyIGludG8g
dGhlIGxpbmUuCisgICAgbGluZUJveFBhaW50SW5mby5hbm9ueW1vdXNJbmxpbmVCbG9jayA9IG1f
YW5vbnltb3VzSW5saW5lQmxvY2s7CisgICAgSW5saW5lRmxvd0JveDo6cGFpbnQocGFpbnRJbmZv
LCB0eCwgdHksIGxpbmVCb3hQYWludEluZm8pOworfQorCitib29sIFJvb3RBbm9ueW1vdXNJbmxp
bmVCbG9ja0JveDo6bm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmIHJlcXVlc3QsIEhp
dFRlc3RSZXN1bHQmIHJlc3VsdCwgaW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSwgSGl0VGVz
dEFjdGlvbiBoaXRUZXN0QWN0aW9uLCBMaW5lQm94SGl0VGVzdEluZm8mIGhpdFRlc3RJbmZvKQor
eworICAgIC8vIFNraXAgdGhlIGV4dHJhIHdvcmsgZG9uZSBieSBSb290SW5saW5lQm94Ojpub2Rl
QXRQb2ludC4KKyAgICByZXR1cm4gSW5saW5lRmxvd0JveDo6bm9kZUF0UG9pbnQocmVxdWVzdCwg
cmVzdWx0LCB4LCB5LCB0eCwgdHksIGhpdFRlc3RBY3Rpb24sIGhpdFRlc3RJbmZvKTsKK30KKwog
fSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUm9vdElubGlu
ZUJveC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1Jvb3RJbmxpbmVCb3guaAko
cmV2aXNpb24gNTQ1NjEpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9Sb290SW5saW5lQm94LmgJKHdv
cmtpbmcgY29weSkKQEAgLTQwLDYgKzQwLDcgQEAgcHVibGljOgogICAgICAgICAsIG1fbGluZUJy
ZWFrUG9zKDApCiAgICAgICAgICwgbV9saW5lVG9wKDApCiAgICAgICAgICwgbV9saW5lQm90dG9t
KDApCisgICAgICAgICwgbV9oYXNBbm9ueW1vdXNJbmxpbmVCbG9jayhmYWxzZSkKICAgICB7CiAg
ICAgfQogCkBAIC0xMDEsOCArMTAyLDggQEAgcHVibGljOgogICAgIHZvaWQgcGFpbnRDdXN0b21I
aWdobGlnaHQoUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBpbnQgdHgsIGludCB0eSwgY29uc3Qg
QXRvbWljU3RyaW5nJiBoaWdobGlnaHRUeXBlKTsKICNlbmRpZgogCi0gICAgdmlydHVhbCB2b2lk
IHBhaW50KFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiwgaW50IHR4LCBpbnQgdHkpOwotICAgIHZp
cnR1YWwgYm9vbCBub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1
bHQmLCBpbnQsIGludCwgaW50LCBpbnQpOworICAgIHZpcnR1YWwgdm9pZCBwYWludChSZW5kZXJP
YmplY3Q6OlBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5LCBMaW5lQm94UGFpbnRJbmZvJik7Cisg
ICAgdmlydHVhbCBib29sIG5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiwgSGl0VGVz
dFJlc3VsdCYsIGludCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHksIEhpdFRlc3RBY3Rpb24sIExp
bmVCb3hIaXRUZXN0SW5mbyYpOwogCiAgICAgYm9vbCBoYXNTZWxlY3RlZENoaWxkcmVuKCkgY29u
c3QgeyByZXR1cm4gbV9oYXNTZWxlY3RlZENoaWxkcmVuOyB9CiAgICAgdm9pZCBzZXRIYXNTZWxl
Y3RlZENoaWxkcmVuKGJvb2wpOwpAQCAtMTMyLDYgKzEzMywxMSBAQCBwdWJsaWM6CiAgICAgdmly
dHVhbCB2b2lkIGF0dGFjaExpbmVCb3hUb1JlbmRlck9iamVjdCgpOwogICAgIHZpcnR1YWwgdm9p
ZCByZW1vdmVMaW5lQm94RnJvbVJlbmRlck9iamVjdCgpOwogCisgICAgYm9vbCBoYXNBbm9ueW1v
dXNJbmxpbmVCbG9jaygpIGNvbnN0IHsgcmV0dXJuIG1faGFzQW5vbnltb3VzSW5saW5lQmxvY2s7
IH0KKyAgICB2b2lkIHNldEhhc0Fub255bW91c0lubGluZUJsb2NrKCkgeyBtX2hhc0Fub255bW91
c0lubGluZUJsb2NrID0gdHJ1ZTsgfQorCisgICAgUmVuZGVyQmxvY2sqIGFub255bW91c0lubGlu
ZUJsb2NrKCkgY29uc3Q7CisKIHByb3RlY3RlZDoKICAgICAvLyBXaGVyZSB0aGlzIGxpbmUgZW5k
ZWQuICBUaGUgZXhhY3Qgb2JqZWN0IGFuZCB0aGUgcG9zaXRpb24gd2l0aGluIHRoYXQgb2JqZWN0
IGFyZSBzdG9yZWQgc28gdGhhdAogICAgIC8vIHdlIGNhbiBjcmVhdGUgYW4gSW5saW5lSXRlcmF0
b3IgYmVnaW5uaW5nIGp1c3QgYWZ0ZXIgdGhlIGVuZCBvZiB0aGlzIGxpbmUuCkBAIC0xNTIsNiAr
MTU4LDggQEAgcHJvdGVjdGVkOgogICAgIFdURjo6VW5pY29kZTo6RGlyZWN0aW9uIG1fbGluZUJy
ZWFrQmlkaVN0YXR1c0VvciA6IDU7CiAgICAgV1RGOjpVbmljb2RlOjpEaXJlY3Rpb24gbV9saW5l
QnJlYWtCaWRpU3RhdHVzTGFzdFN0cm9uZyA6IDU7CiAgICAgV1RGOjpVbmljb2RlOjpEaXJlY3Rp
b24gbV9saW5lQnJlYWtCaWRpU3RhdHVzTGFzdCA6IDU7CisgICAgCisgICAgYm9vbCBtX2hhc0Fu
b255bW91c0lubGluZUJsb2NrIDogMTsKIH07CiAKIGlubGluZSB2b2lkIFJvb3RJbmxpbmVCb3g6
OnNldExpbmVUb3BCb3R0b21Qb3NpdGlvbnMoaW50IHRvcCwgaW50IGJvdHRvbSkgCkBAIC0xNjAs
NiArMTY4LDI2IEBAIGlubGluZSB2b2lkIFJvb3RJbmxpbmVCb3g6OnNldExpbmVUb3BCb3QKICAg
ICBtX2xpbmVCb3R0b20gPSBib3R0b207IAogfQogCisvLyBGb3IgYW5vbnltb3VzIGlubGluZSBi
bG9jayBvYmplY3RzLgorY2xhc3MgUm9vdEFub255bW91c0lubGluZUJsb2NrQm94IDogcHVibGlj
IFJvb3RJbmxpbmVCb3gKK3sKK3B1YmxpYzoKKyAgICBSb290QW5vbnltb3VzSW5saW5lQmxvY2tC
b3goUmVuZGVyT2JqZWN0KiByb290QmxvY2ssIFJlbmRlckJsb2NrKiBhbm9ueW1vdXNCbG9jaykK
KyAgICAgICAgOiBSb290SW5saW5lQm94KHJvb3RCbG9jaykKKyAgICAgICAgLCBtX2Fub255bW91
c0lubGluZUJsb2NrKGFub255bW91c0Jsb2NrKQorICAgIHsKKyAgICAgICAgc2V0SGFzQW5vbnlt
b3VzSW5saW5lQmxvY2soKTsKKyAgICB9CisgICAgCisgICAgUmVuZGVyQmxvY2sqIGlubGluZUJs
b2NrKCkgY29uc3QgeyByZXR1cm4gbV9hbm9ueW1vdXNJbmxpbmVCbG9jazsgfQorICAgIAorICAg
IHZpcnR1YWwgdm9pZCBwYWludChSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJbmZvLCBp
bnQgdHgsIGludCB0eSwgTGluZUJveFBhaW50SW5mbyYpOworICAgIHZpcnR1YWwgYm9vbCBub2Rl
QXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBpbnQgeCwgaW50
IHksIGludCB0eCwgaW50IHR5LCBIaXRUZXN0QWN0aW9uLCBMaW5lQm94SGl0VGVzdEluZm8mKTsK
KyAgICAKK3ByaXZhdGU6CisgICAgUmVuZGVyQmxvY2sqIG1fYW5vbnltb3VzSW5saW5lQmxvY2s7
Cit9OworCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCiAKICNlbmRpZiAvLyBSb290SW5saW5lQm94
X2gKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1NWR0lubGluZVRleHRCb3guY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1NWR0lubGluZVRleHRCb3guY3BwCShyZXZpc2lvbiA1
NDU2MSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1NWR0lubGluZVRleHRCb3guY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0yOTEsNyArMjkxLDcgQEAgaW50IFNWR0lubGluZVRleHRCb3g6OnBvc2l0aW9u
Rm9yT2Zmc2V0KAogICAgIHJldHVybiAwOwogfQogCi1ib29sIFNWR0lubGluZVRleHRCb3g6Om5v
ZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiwgSGl0VGVzdFJlc3VsdCYgcmVzdWx0LCBp
bnQgeCwgaW50IHksIGludCB0eCwgaW50IHR5KQorYm9vbCBTVkdJbmxpbmVUZXh0Qm94Ojpub2Rl
QXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmIHJlc3VsdCwgaW50
IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSwgSGl0VGVzdEFjdGlvbiwgTGluZUJveEhpdFRlc3RJ
bmZvJikKIHsKICAgICBBU1NFUlQoIWlzTGluZUJyZWFrKCkpOwogCkluZGV4OiBXZWJDb3JlL3Jl
bmRlcmluZy9TVkdJbmxpbmVUZXh0Qm94LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJp
bmcvU1ZHSW5saW5lVGV4dEJveC5oCShyZXZpc2lvbiA1NDU2MSkKKysrIFdlYkNvcmUvcmVuZGVy
aW5nL1NWR0lubGluZVRleHRCb3guaAkod29ya2luZyBjb3B5KQpAQCAtNjEsNyArNjEsNyBAQCBu
YW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgICAgIHZpcnR1YWwgaW50IG9mZnNldEZvclBvc2l0aW9u
KGludCB4LCBib29sIGluY2x1ZGVQYXJ0aWFsR2x5cGhzID0gdHJ1ZSkgY29uc3Q7CiAgICAgICAg
IHZpcnR1YWwgaW50IHBvc2l0aW9uRm9yT2Zmc2V0KGludCBvZmZzZXQpIGNvbnN0OwogCi0gICAg
ICAgIHZpcnR1YWwgYm9vbCBub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRl
c3RSZXN1bHQmLCBpbnQgeCwgaW50IHksIGludCB0eCwgaW50IHR5KTsKKyAgICAgICAgdmlydHVh
bCBib29sIG5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiwgSGl0VGVzdFJlc3VsdCYs
IGludCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHksIEhpdFRlc3RBY3Rpb24sIExpbmVCb3hIaXRU
ZXN0SW5mbyYpOwogICAgICAgICB2aXJ0dWFsIEludFJlY3Qgc2VsZWN0aW9uUmVjdChpbnQgYWJz
eCwgaW50IGFic3ksIGludCBzdGFydFBvcywgaW50IGVuZFBvcyk7CiAKICAgICAgICAgLy8gU1ZH
cyBjdXN0b20gcGFpbnQgdGV4dCBtZXRob2QK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>48589</attachid>
            <date>2010-02-11 13:22:22 -0800</date>
            <delta_ts>2010-02-11 17:00:05 -0800</delta_ts>
            <desc>Smaller patch now that I landed the InlineIterator/BidiRun breakout.</desc>
            <filename>patch.txt</filename>
            <type>text/plain</type>
            <size>132474</size>
            <attacher name="Dave Hyatt">hyatt</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0LmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eVJlbmRl
ck9iamVjdC5jcHAJKHJldmlzaW9uIDU0NjY0KQorKysgV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0Fj
Y2Vzc2liaWxpdHlSZW5kZXJPYmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01NjcsMTIgKzU2
Nyw4IEBAIEVsZW1lbnQqIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmFuY2gKICAgICBSZW5k
ZXJPYmplY3QqIGN1cnJSZW5kZXJlcjsKICAgICAKICAgICAvLyBTZWFyY2ggdXAgdGhlIHJlbmRl
ciB0cmVlIGZvciBhIFJlbmRlck9iamVjdCB3aXRoIGEgRE9NIG5vZGUuICBEZWZlciB0byBhbiBl
YXJsaWVyIGNvbnRpbnVhdGlvbiwgdGhvdWdoLgotICAgIGZvciAoY3VyclJlbmRlcmVyID0gbV9y
ZW5kZXJlcjsgY3VyclJlbmRlcmVyICYmICFjdXJyUmVuZGVyZXItPm5vZGUoKTsgY3VyclJlbmRl
cmVyID0gY3VyclJlbmRlcmVyLT5wYXJlbnQoKSkgewotICAgICAgICBpZiAoY3VyclJlbmRlcmVy
LT5pc1JlbmRlckJsb2NrKCkpIHsKLSAgICAgICAgICAgIFJlbmRlcklubGluZSogY29udGludWF0
aW9uID0gdG9SZW5kZXJCbG9jayhjdXJyUmVuZGVyZXIpLT5pbmxpbmVDb250aW51YXRpb24oKTsK
LSAgICAgICAgICAgIGlmIChjb250aW51YXRpb24pCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNh
Y2hlLT5nZXRPckNyZWF0ZShjb250aW51YXRpb24pLT5hbmNob3JFbGVtZW50KCk7Ci0gICAgICAg
IH0KKyAgICBmb3IgKGN1cnJSZW5kZXJlciA9IG1fcmVuZGVyZXI7IGN1cnJSZW5kZXJlciAmJiAh
Y3VyclJlbmRlcmVyLT5ub2RlKCk7IGN1cnJSZW5kZXJlciA9IGN1cnJSZW5kZXJlci0+cGFyZW50
KCkpCisgICAgewogICAgIH0KICAgICAKICAgICAvLyBiYWlsIGlmIG5vbmUgZm91bmQKSW5kZXg6
IFdlYkNvcmUvcmVuZGVyaW5nL0VsbGlwc2lzQm94LmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3JlbmRlcmluZy9FbGxpcHNpc0JveC5jcHAJKHJldmlzaW9uIDU0NjY0KQorKysgV2ViQ29yZS9y
ZW5kZXJpbmcvRWxsaXBzaXNCb3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC02NCw3ICs2NCw4IEBA
IHZvaWQgRWxsaXBzaXNCb3g6OnBhaW50KFJlbmRlck9iamVjdDo6UGEKICAgICAgICAgLy8gUGFp
bnQgdGhlIG1hcmt1cCBib3gKICAgICAgICAgdHggKz0gbV94ICsgbV93aWR0aCAtIG1fbWFya3Vw
Qm94LT54KCk7CiAgICAgICAgIHR5ICs9IG1feSArIHN0eWxlLT5mb250KCkuYXNjZW50KCkgLSAo
bV9tYXJrdXBCb3gtPnkoKSArIG1fbWFya3VwQm94LT5yZW5kZXJlcigpLT5zdHlsZShtX2ZpcnN0
TGluZSktPmZvbnQoKS5hc2NlbnQoKSk7Ci0gICAgICAgIG1fbWFya3VwQm94LT5wYWludChwYWlu
dEluZm8sIHR4LCB0eSk7CisgICAgICAgIExpbmVCb3hQYWludEluZm8gbGluZUJveFBhaW50SW5m
bzsKKyAgICAgICAgbV9tYXJrdXBCb3gtPnBhaW50KHBhaW50SW5mbywgdHgsIHR5LCBsaW5lQm94
UGFpbnRJbmZvKTsKICAgICB9CiB9CiAKQEAgLTk3LDcgKzk4LDcgQEAgdm9pZCBFbGxpcHNpc0Jv
eDo6cGFpbnRTZWxlY3Rpb24oR3JhcGhpYwogICAgIGNvbnRleHQtPnJlc3RvcmUoKTsKIH0KIAot
Ym9vbCBFbGxpcHNpc0JveDo6bm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmIHJlcXVl
c3QsIEhpdFRlc3RSZXN1bHQmIHJlc3VsdCwgaW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSkK
K2Jvb2wgRWxsaXBzaXNCb3g6Om5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiByZXF1
ZXN0LCBIaXRUZXN0UmVzdWx0JiByZXN1bHQsIGludCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHks
IEhpdFRlc3RBY3Rpb24gaGl0VGVzdEFjdGlvbiwgTGluZUJveEhpdFRlc3RJbmZvJiBoaXRUZXN0
SW5mbykKIHsKICAgICB0eCArPSBtX3g7CiAgICAgdHkgKz0gbV95OwpAQCAtMTA3LDcgKzEwOCw3
IEBAIGJvb2wgRWxsaXBzaXNCb3g6Om5vZGVBdFBvaW50KGNvbnN0IEhpdFQKICAgICAgICAgUmVu
ZGVyU3R5bGUqIHN0eWxlID0gbV9yZW5kZXJlci0+c3R5bGUobV9maXJzdExpbmUpOwogICAgICAg
ICBpbnQgbXR4ID0gdHggKyBtX3dpZHRoIC0gbV9tYXJrdXBCb3gtPngoKTsKICAgICAgICAgaW50
IG10eSA9IHR5ICsgc3R5bGUtPmZvbnQoKS5hc2NlbnQoKSAtIChtX21hcmt1cEJveC0+eSgpICsg
bV9tYXJrdXBCb3gtPnJlbmRlcmVyKCktPnN0eWxlKG1fZmlyc3RMaW5lKS0+Zm9udCgpLmFzY2Vu
dCgpKTsKLSAgICAgICAgaWYgKG1fbWFya3VwQm94LT5ub2RlQXRQb2ludChyZXF1ZXN0LCByZXN1
bHQsIHgsIHksIG10eCwgbXR5KSkgeworICAgICAgICBpZiAobV9tYXJrdXBCb3gtPm5vZGVBdFBv
aW50KHJlcXVlc3QsIHJlc3VsdCwgeCwgeSwgbXR4LCBtdHksIGhpdFRlc3RBY3Rpb24sIGhpdFRl
c3RJbmZvKSkgewogICAgICAgICAgICAgcmVuZGVyZXIoKS0+dXBkYXRlSGl0VGVzdFJlc3VsdChy
ZXN1bHQsIEludFBvaW50KHggLSBtdHgsIHkgLSBtdHkpKTsKICAgICAgICAgICAgIHJldHVybiB0
cnVlOwogICAgICAgICB9CkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9FbGxpcHNpc0JveC5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL0VsbGlwc2lzQm94LmgJKHJldmlzaW9uIDU0
NjY0KQorKysgV2ViQ29yZS9yZW5kZXJpbmcvRWxsaXBzaXNCb3guaAkod29ya2luZyBjb3B5KQpA
QCAtMzksOCArMzksOCBAQCBwdWJsaWM6CiAgICAgewogICAgIH0KIAotICAgIHZpcnR1YWwgdm9p
ZCBwYWludChSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5KTsKLSAgICB2
aXJ0dWFsIGJvb2wgbm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVz
dWx0JiwgaW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSk7CisgICAgdm9pZCBwYWludChSZW5k
ZXJPYmplY3Q6OlBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5KTsKKyAgICB2aXJ0dWFsIGJvb2wg
bm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVzdWx0JiwgaW50IHgs
IGludCB5LCBpbnQgdHgsIGludCB0eSwgSGl0VGVzdEFjdGlvbiwgTGluZUJveEhpdFRlc3RJbmZv
Jik7CiAgICAgdm9pZCBzZXRTZWxlY3Rpb25TdGF0ZShSZW5kZXJPYmplY3Q6OlNlbGVjdGlvblN0
YXRlIHMpIHsgbV9zZWxlY3Rpb25TdGF0ZSA9IHM7IH0KICAgICBJbnRSZWN0IHNlbGVjdGlvblJl
Y3QoaW50IHR4LCBpbnQgdHkpOwogCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVCb3gu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUJveC5jcHAJKHJldmlz
aW9uIDU0NjY0KQorKysgV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lQm94LmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgIkhpdFRlc3RSZXN1bHQuaCIKICNpbmNs
dWRlICJJbmxpbmVGbG93Qm94LmgiCiAjaW5jbHVkZSAiUmVuZGVyQXJlbmEuaCIKLSNpbmNsdWRl
ICJSZW5kZXJCb3guaCIKKyNpbmNsdWRlICJSZW5kZXJWaWV3LmgiCiAjaW5jbHVkZSAiUm9vdElu
bGluZUJveC5oIgogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwpAQCAtMTU5LDkgKzE1OSwyNyBAQCB2
b2lkIElubGluZUJveDo6YWRqdXN0UG9zaXRpb24oaW50IGR4LCBpCiAgICAgfQogfQogCi12b2lk
IElubGluZUJveDo6cGFpbnQoUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgaW50
IHR4LCBpbnQgdHkpCit2b2lkIElubGluZUJveDo6cGFpbnQoUmVuZGVyT2JqZWN0OjpQYWludElu
Zm8mIHBhaW50SW5mbywgaW50IHR4LCBpbnQgdHksIExpbmVCb3hQYWludEluZm8mIGxpbmVCb3hQ
YWludEluZm8pCiB7Ci0gICAgaWYgKCFyZW5kZXJlcigpLT5zaG91bGRQYWludFdpdGhpblJvb3Qo
cGFpbnRJbmZvKSB8fCAocGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VGb3JlZ3JvdW5kICYm
IHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlU2VsZWN0aW9uKSkKKyAgICBpZiAoIXJlbmRl
cmVyKCktPnNob3VsZFBhaW50V2l0aGluUm9vdChwYWludEluZm8pKQorICAgICAgICByZXR1cm47
CisgICAgCisgICAgUmVuZGVyQmxvY2sqIGFub255bW91c0lubGluZUJsb2NrID0gbGluZUJveFBh
aW50SW5mby5hbm9ueW1vdXNJbmxpbmVCbG9jazsKKyAgICBpZiAoYW5vbnltb3VzSW5saW5lQmxv
Y2sgPT0gcmVuZGVyZXIoKSkgeworICAgICAgICAvLyBUcmVhdCBwYWludGluZyBvZiBhIHNwZWNp
YWwgaW5saW5lLWJsb2NrIGxpbmUgbGlrZSB0aGUgcGFpbnRpbmcgb2YgYSBub3JtYWwgYmxvY2sg
YW5kIGdvIHRocm91Z2ggYWxsIHBoYXNlcy4KKyAgICAgICAgUGFpbnRQaGFzZSBuZXdQaGFzZSA9
IChwYWludEluZm8ucGhhc2UgPT0gUGFpbnRQaGFzZUNoaWxkT3V0bGluZXMpID8gUGFpbnRQaGFz
ZU91dGxpbmUgOiBwYWludEluZm8ucGhhc2U7CisgICAgICAgIG5ld1BoYXNlID0gKG5ld1BoYXNl
ID09IFBhaW50UGhhc2VDaGlsZEJsb2NrQmFja2dyb3VuZHMpID8gUGFpbnRQaGFzZUNoaWxkQmxv
Y2tCYWNrZ3JvdW5kIDogbmV3UGhhc2U7CisgICAgCisgICAgICAgIC8vIFdlIGRvbid0IHBhaW50
IG91ciBvd24gYmFja2dyb3VuZCwgYnV0IHdlIGRvIGxldCB0aGUgY2hpbGQgcGFpbnQgaXRzIGJh
Y2tncm91bmQuCisgICAgICAgIFJlbmRlck9iamVjdDo6UGFpbnRJbmZvIGluZm8ocGFpbnRJbmZv
KTsKKyAgICAgICAgaW5mby5waGFzZSA9IG5ld1BoYXNlOworICAgICAgICBpbmZvLnBhaW50aW5n
Um9vdCA9IHJlbmRlcmVyKCktPnBhaW50aW5nUm9vdEZvckNoaWxkcmVuKHBhaW50SW5mbyk7Cisg
ICAgICAgIGlmICghYW5vbnltb3VzSW5saW5lQmxvY2stPmhhc1NlbGZQYWludGluZ0xheWVyKCkp
CisgICAgICAgICAgICBhbm9ueW1vdXNJbmxpbmVCbG9jay0+cGFpbnQoaW5mbywgdHgsIHR5KTsK
KyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChwYWludEluZm8ucGhhc2UgIT0gUGFp
bnRQaGFzZUZvcmVncm91bmQgJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VTZWxlY3Rp
b24pCiAgICAgICAgIHJldHVybjsKIAogICAgIC8vIFBhaW50IGFsbCBwaGFzZXMgb2YgcmVwbGFj
ZWQgZWxlbWVudHMgYXRvbWljYWxseSwgYXMgdGhvdWdoIHRoZSByZXBsYWNlZCBlbGVtZW50IGVz
dGFibGlzaGVkIGl0cwpAQCAtMTgzLDkgKzIwMSwxNyBAQCB2b2lkIElubGluZUJveDo6cGFpbnQo
UmVuZGVyT2JqZWN0OjpQYWluCiAgICAgfQogfQogCi1ib29sIElubGluZUJveDo6bm9kZUF0UG9p
bnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmIHJlcXVlc3QsIEhpdFRlc3RSZXN1bHQmIHJlc3VsdCwg
aW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSkKK2Jvb2wgSW5saW5lQm94Ojpub2RlQXRQb2lu
dChjb25zdCBIaXRUZXN0UmVxdWVzdCYgcmVxdWVzdCwgSGl0VGVzdFJlc3VsdCYgcmVzdWx0LCBp
bnQgeCwgaW50IHksIGludCB0eCwgaW50IHR5LCBIaXRUZXN0QWN0aW9uIGhpdFRlc3RBY3Rpb24s
IExpbmVCb3hIaXRUZXN0SW5mbyYgaGl0VGVzdEluZm8pCiB7Ci0gICAgLy8gSGl0IHRlc3QgYWxs
IHBoYXNlcyBvZiByZXBsYWNlZCBlbGVtZW50cyBhdG9taWNhbGx5LCBhcyB0aG91Z2ggdGhlIHJl
cGxhY2VkIGVsZW1lbnQgZXN0YWJsaXNoZWQgaXRzCisgICAgLy8gSWYgd2UgYXJlIGFuIGFub255
bW91cyBpbmxpbmUgYmxvY2ssIGhvbm9yIGhpdCB0ZXN0IHBoYXNlcy4KKyAgICBpZiAoaGl0VGVz
dEluZm8uYW5vbnltb3VzSW5saW5lQmxvY2sgPT0gcmVuZGVyZXIoKSkgeworICAgICAgICBIaXRU
ZXN0QWN0aW9uIGNoaWxkSGl0VGVzdCA9IGhpdFRlc3RBY3Rpb247CisgICAgICAgIGlmIChoaXRU
ZXN0QWN0aW9uID09IEhpdFRlc3RDaGlsZEJsb2NrQmFja2dyb3VuZHMpCisgICAgICAgICAgICBj
aGlsZEhpdFRlc3QgPSBIaXRUZXN0Q2hpbGRCbG9ja0JhY2tncm91bmQ7CisgICAgICAgIHJldHVy
biBoaXRUZXN0SW5mby5hbm9ueW1vdXNJbmxpbmVCbG9jay0+bm9kZUF0UG9pbnQocmVxdWVzdCwg
cmVzdWx0LCB4LCB5LCB0eCwgdHksIGNoaWxkSGl0VGVzdCk7CisgICAgfQorCisgICAgLy8gT3Ro
ZXJ3aXNlIGhpdCB0ZXN0IGFsbCBwaGFzZXMgb2YgcmVwbGFjZWQgZWxlbWVudHMgYXRvbWljYWxs
eSwgYXMgdGhvdWdoIHRoZSByZXBsYWNlZCBlbGVtZW50IGVzdGFibGlzaGVkIGl0cwogICAgIC8v
IG93biBzdGFja2luZyBjb250ZXh0LiAgKFNlZSBBcHBlbmRpeCBFLjIsIHNlY3Rpb24gNi40IG9u
IGlubGluZSBibG9jay90YWJsZSBlbGVtZW50cyBpbiB0aGUgQ1NTMi4xCiAgICAgLy8gc3BlY2lm
aWNhdGlvbi4pCiAgICAgcmV0dXJuIHJlbmRlcmVyKCktPmhpdFRlc3QocmVxdWVzdCwgcmVzdWx0
LCBJbnRQb2ludCh4LCB5KSwgdHgsIHR5KTsKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL0lubGlu
ZUJveC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUJveC5oCShyZXZp
c2lvbiA1NDY2NCkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUJveC5oCSh3b3JraW5nIGNv
cHkpCkBAIC0zMCw2ICszMCwyMyBAQCBjbGFzcyBIaXRUZXN0UmVxdWVzdDsKIGNsYXNzIEhpdFRl
c3RSZXN1bHQ7CiBjbGFzcyBSb290SW5saW5lQm94OwogCitzdHJ1Y3QgTGluZUJveFBhaW50SW5m
bworeworICAgIExpbmVCb3hQYWludEluZm8oKQorICAgICAgICA6IGFub255bW91c0lubGluZUJs
b2NrKDApCisgICAgeyB9CisgICAgCisgICAgUmVuZGVyQmxvY2sqIGFub255bW91c0lubGluZUJs
b2NrOworfTsKKworc3RydWN0IExpbmVCb3hIaXRUZXN0SW5mbworeworICAgIExpbmVCb3hIaXRU
ZXN0SW5mbygpCisgICAgICAgIDogYW5vbnltb3VzSW5saW5lQmxvY2soMCkKKyAgICB7IH0KKyAg
ICAKKyAgICBSZW5kZXJCbG9jayogYW5vbnltb3VzSW5saW5lQmxvY2s7Cit9OwogCiAvLyBJbmxp
bmVCb3ggcmVwcmVzZW50cyBhIHJlY3RhbmdsZSB0aGF0IG9jY3VycyBvbiBhIGxpbmUuICBJdCBj
b3JyZXNwb25kcyB0bwogLy8gc29tZSBSZW5kZXJPYmplY3QgKGkuZS4sIGl0IHJlcHJlc2VudHMg
YSBwb3J0aW9uIG9mIHRoYXQgUmVuZGVyT2JqZWN0KS4KQEAgLTExMiw4ICsxMjksOCBAQCBwdWJs
aWM6CiAKICAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0UG9zaXRpb24oaW50IGR4LCBpbnQgZHkpOwog
Ci0gICAgdmlydHVhbCB2b2lkIHBhaW50KFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiwgaW50IHR4
LCBpbnQgdHkpOwotICAgIHZpcnR1YWwgYm9vbCBub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVx
dWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBpbnQgeCwgaW50IHksIGludCB0eCwgaW50IHR5KTsKKyAg
ICB2aXJ0dWFsIHZvaWQgcGFpbnQoUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBpbnQgdHgsIGlu
dCB0eSwgTGluZUJveFBhaW50SW5mbyYpOworICAgIHZpcnR1YWwgYm9vbCBub2RlQXRQb2ludChj
b25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBpbnQgeCwgaW50IHksIGludCB0
eCwgaW50IHR5LCBIaXRUZXN0QWN0aW9uLCBMaW5lQm94SGl0VGVzdEluZm8mKTsKIAogICAgIC8v
IE92ZXJsb2FkZWQgbmV3IG9wZXJhdG9yLgogICAgIHZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3Qs
IFJlbmRlckFyZW5hKikgdGhyb3coKTsKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUZs
b3dCb3guY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUZsb3dCb3gu
Y3BwCShyZXZpc2lvbiA1NDY2NCkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUZsb3dCb3gu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSAiUmVuZGVyTGF5
ZXIuaCIKICNpbmNsdWRlICJSZW5kZXJMaXN0TWFya2VyLmgiCiAjaW5jbHVkZSAiUmVuZGVyVGFi
bGVDZWxsLmgiCisjaW5jbHVkZSAiUmVuZGVyVmlldy5oIgogI2luY2x1ZGUgIlJvb3RJbmxpbmVC
b3guaCIKICNpbmNsdWRlICJUZXh0LmgiCiAKQEAgLTIyNywxNCArMjI4LDEzIEBAIHZvaWQgSW5s
aW5lRmxvd0JveDo6ZGV0ZXJtaW5lU3BhY2luZ0ZvckYKICAgICAgICAgLy8gKDMpIFRoZSBsaW5l
IG1heSBlbmQgb24gdGhlIGlubGluZS4gIElmIHdlIGFyZSB0aGUgbGFzdCBjaGlsZCAoY2xpbWJp
bmcgdXAKICAgICAgICAgLy8gdGhlIGVuZCBvYmplY3QncyBjaGFpbiksIHRoZW4gd2UganVzdCBj
bG9zZWQgYXMgd2VsbC4KICAgICAgICAgaWYgKCFsaW5lQm94TGlzdC0+bGFzdExpbmVCb3goKS0+
aXNDb25zdHJ1Y3RlZCgpKSB7Ci0gICAgICAgICAgICBSZW5kZXJJbmxpbmUqIGlubGluZUZsb3cg
PSB0b1JlbmRlcklubGluZShyZW5kZXJlcigpKTsKICAgICAgICAgICAgIGlmIChsdHIpIHsKICAg
ICAgICAgICAgICAgICBpZiAoIW5leHRMaW5lQm94KCkgJiYKLSAgICAgICAgICAgICAgICAgICAg
KChsYXN0TGluZSAmJiAhaW5saW5lRmxvdy0+Y29udGludWF0aW9uKCkpIHx8IG5leHRPbkxpbmVF
eGlzdHMoKSB8fCBvbkVuZENoYWluKGVuZE9iamVjdCkpKQorICAgICAgICAgICAgICAgICAgICAo
bGFzdExpbmUgfHwgbmV4dE9uTGluZUV4aXN0cygpIHx8IG9uRW5kQ2hhaW4oZW5kT2JqZWN0KSkp
CiAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVSaWdodEVkZ2UgPSB0cnVlOwogICAgICAgICAg
ICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoKCFwcmV2TGluZUJveCgpIHx8IHByZXZM
aW5lQm94KCktPmlzQ29uc3RydWN0ZWQoKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgKChsYXN0
TGluZSAmJiAhaW5saW5lRmxvdy0+Y29udGludWF0aW9uKCkpIHx8IHByZXZPbkxpbmVFeGlzdHMo
KSB8fCBvbkVuZENoYWluKGVuZE9iamVjdCkpKQorICAgICAgICAgICAgICAgICAgICAobGFzdExp
bmUgfHwgcHJldk9uTGluZUV4aXN0cygpIHx8IG9uRW5kQ2hhaW4oZW5kT2JqZWN0KSkpCiAgICAg
ICAgICAgICAgICAgICAgIGluY2x1ZGVMZWZ0RWRnZSA9IHRydWU7CiAgICAgICAgICAgICB9CiAg
ICAgICAgIH0KQEAgLTUwNCw3ICs1MDQsNyBAQCB2b2lkIElubGluZUZsb3dCb3g6OnBsYWNlQm94
ZXNWZXJ0aWNhbGx5CiAgICAgICAgICAgICAgICAgbmV3WSAtPSBjdXJyLT5ib3hNb2RlbE9iamVj
dCgpLT5ib3JkZXJUb3AoKSArIGN1cnItPmJveE1vZGVsT2JqZWN0KCktPnBhZGRpbmdUb3AoKTsK
ICAgICAgICAgfSBlbHNlIGlmICghY3Vyci0+cmVuZGVyZXIoKS0+aXNCUigpKSB7CiAgICAgICAg
ICAgICBSZW5kZXJCb3gqIGJveCA9IHRvUmVuZGVyQm94KGN1cnItPnJlbmRlcmVyKCkpOwotICAg
ICAgICAgICAgbmV3WSArPSBib3gtPm1hcmdpblRvcCgpOworICAgICAgICAgICAgbmV3WSArPSBj
dXJyLT5yZW5kZXJlcigpLT5pc0Fub255bW91c0lubGluZUJsb2NrKCkgPyAwIDogYm94LT5tYXJn
aW5Ub3AoKTsKICAgICAgICAgfQogCiAgICAgICAgIGN1cnItPnNldFkobmV3WSk7CkBAIC01OTgs
OCArNTk4LDEyIEBAIHZvaWQgSW5saW5lRmxvd0JveDo6Y29tcHV0ZVZlcnRpY2FsT3ZlcmYKICAg
ICBzZXRWZXJ0aWNhbE92ZXJmbG93UG9zaXRpb25zKHRvcExheW91dE92ZXJmbG93LCBib3R0b21M
YXlvdXRPdmVyZmxvdywgdG9wVmlzdWFsT3ZlcmZsb3csIGJvdHRvbVZpc3VhbE92ZXJmbG93LCBi
b3hIZWlnaHQpOwogfQogCi1ib29sIElubGluZUZsb3dCb3g6Om5vZGVBdFBvaW50KGNvbnN0IEhp
dFRlc3RSZXF1ZXN0JiByZXF1ZXN0LCBIaXRUZXN0UmVzdWx0JiByZXN1bHQsIGludCB4LCBpbnQg
eSwgaW50IHR4LCBpbnQgdHkpCitib29sIElubGluZUZsb3dCb3g6Om5vZGVBdFBvaW50KGNvbnN0
IEhpdFRlc3RSZXF1ZXN0JiByZXF1ZXN0LCBIaXRUZXN0UmVzdWx0JiByZXN1bHQsIGludCB4LCBp
bnQgeSwgaW50IHR4LCBpbnQgdHksIEhpdFRlc3RBY3Rpb24gaGl0VGVzdEFjdGlvbiwgTGluZUJv
eEhpdFRlc3RJbmZvJiBoaXRUZXN0SW5mbykKIHsKKyAgICAvLyBBcyBsb25nIGFzIHdlIGRvbid0
IGhhdmUgYW4gYW5vbnltb3VzIGlubGluZSBibG9jayBvbiBvdXIgbGluZSwgd2UgcmVzdHJpY3Qg
b3VyIGhpdCB0ZXN0aW5nIG9ubHkgdG8gdGhlIGZvcmVncm91bmQgcGhhc2UuCisgICAgaWYgKCFo
aXRUZXN0SW5mby5hbm9ueW1vdXNJbmxpbmVCbG9jayAmJiBoaXRUZXN0QWN0aW9uICE9IEhpdFRl
c3RGb3JlZ3JvdW5kKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKICAgICBJbnRSZWN0IG92ZXJm
bG93UmVjdCh2aXNpYmxlT3ZlcmZsb3dSZWN0KCkpOwogICAgIG92ZXJmbG93UmVjdC5tb3ZlKHR4
LCB0eSk7CiAgICAgaWYgKCFvdmVyZmxvd1JlY3QuY29udGFpbnMoeCwgeSkpCkBAIC02MDcsNyAr
NjExLDcgQEAgYm9vbCBJbmxpbmVGbG93Qm94Ojpub2RlQXRQb2ludChjb25zdCBIaQogCiAgICAg
Ly8gQ2hlY2sgY2hpbGRyZW4gZmlyc3QuCiAgICAgZm9yIChJbmxpbmVCb3gqIGN1cnIgPSBsYXN0
Q2hpbGQoKTsgY3VycjsgY3VyciA9IGN1cnItPnByZXZPbkxpbmUoKSkgewotICAgICAgICBpZiAo
KGN1cnItPnJlbmRlcmVyKCktPmlzVGV4dCgpIHx8ICFjdXJyLT5ib3hNb2RlbE9iamVjdCgpLT5o
YXNTZWxmUGFpbnRpbmdMYXllcigpKSAmJiBjdXJyLT5ub2RlQXRQb2ludChyZXF1ZXN0LCByZXN1
bHQsIHgsIHksIHR4LCB0eSkpIHsKKyAgICAgICAgaWYgKChjdXJyLT5yZW5kZXJlcigpLT5pc1Rl
eHQoKSB8fCAhY3Vyci0+Ym94TW9kZWxPYmplY3QoKS0+aGFzU2VsZlBhaW50aW5nTGF5ZXIoKSkg
JiYgY3Vyci0+bm9kZUF0UG9pbnQocmVxdWVzdCwgcmVzdWx0LCB4LCB5LCB0eCwgdHksIGhpdFRl
c3RBY3Rpb24sIGhpdFRlc3RJbmZvKSkgewogICAgICAgICAgICAgcmVuZGVyZXIoKS0+dXBkYXRl
SGl0VGVzdFJlc3VsdChyZXN1bHQsIEludFBvaW50KHggLSB0eCwgeSAtIHR5KSk7CiAgICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQpAQCAtNjIzLDggKzYyNywxNCBAQCBib29sIElu
bGluZUZsb3dCb3g6Om5vZGVBdFBvaW50KGNvbnN0IEhpCiAgICAgcmV0dXJuIGZhbHNlOwogfQog
Ci12b2lkIElubGluZUZsb3dCb3g6OnBhaW50KFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBwYWlu
dEluZm8sIGludCB0eCwgaW50IHR5KQordm9pZCBJbmxpbmVGbG93Qm94OjpwYWludChSZW5kZXJP
YmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJbmZvLCBpbnQgdHgsIGludCB0eSwgTGluZUJveFBhaW50
SW5mbyYgbGluZUJveFBhaW50SW5mbykKIHsKKyAgICAvLyBBcyBsb25nIGFzIHdlIGRvbid0IGhh
dmUgYW4gYW5vbnltb3VzIGlubGluZSBibG9jayBvbiBvdXIgbGluZSwgd2UgcmVzdHJpY3Qgb3Vy
IHBhaW50aW5nIG9ubHkgdG8gYSBmZXcgcGhhc2VzLgorICAgIGlmICghbGluZUJveFBhaW50SW5m
by5hbm9ueW1vdXNJbmxpbmVCbG9jayAmJiAocGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VG
b3JlZ3JvdW5kICYmIHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlU2VsZWN0aW9uICYmIHBh
aW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlT3V0bGluZSAKKyAgICAgICAgJiYgcGFpbnRJbmZv
LnBoYXNlICE9IFBhaW50UGhhc2VTZWxmT3V0bGluZSAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFp
bnRQaGFzZUNoaWxkT3V0bGluZXMgJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VUZXh0
Q2xpcAorICAgICAgICAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZU1hc2spKQorICAg
ICAgICByZXR1cm47CisgICAgCiAgICAgSW50UmVjdCBvdmVyZmxvd1JlY3QodmlzaWJsZU92ZXJm
bG93UmVjdCgpKTsKICAgICBvdmVyZmxvd1JlY3QuaW5mbGF0ZShyZW5kZXJlcigpLT5tYXhpbWFs
T3V0bGluZVNpemUocGFpbnRJbmZvLnBoYXNlKSk7CiAgICAgb3ZlcmZsb3dSZWN0Lm1vdmUodHgs
IHR5KTsKQEAgLTYzOCwyMyArNjQ4LDE3IEBAIHZvaWQgSW5saW5lRmxvd0JveDo6cGFpbnQoUmVu
ZGVyT2JqZWN0OjoKICAgICAgICAgICAgIC8vIG91dGxpbmVzLgogICAgICAgICAgICAgaWYgKHJl
bmRlcmVyKCktPnN0eWxlKCktPnZpc2liaWxpdHkoKSA9PSBWSVNJQkxFICYmIHJlbmRlcmVyKCkt
Pmhhc091dGxpbmUoKSAmJiAhaXNSb290SW5saW5lQm94KCkpIHsKICAgICAgICAgICAgICAgICBS
ZW5kZXJJbmxpbmUqIGlubGluZUZsb3cgPSB0b1JlbmRlcklubGluZShyZW5kZXJlcigpKTsKLSAg
ICAgICAgICAgICAgICBpZiAoKGlubGluZUZsb3ctPmNvbnRpbnVhdGlvbigpIHx8IGlubGluZUZs
b3ctPmlzSW5saW5lQ29udGludWF0aW9uKCkpICYmICFib3hNb2RlbE9iamVjdCgpLT5oYXNTZWxm
UGFpbnRpbmdMYXllcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFkZCBvdXJzZWx2ZXMg
dG8gdGhlIGNvbnRhaW5pbmcgYmxvY2sgb2YgdGhlIGVudGlyZSBjb250aW51YXRpb24gc28gdGhh
dCBpdCBjYW4KLSAgICAgICAgICAgICAgICAgICAgLy8gcGFpbnQgdXMgYXRvbWljYWxseS4KLSAg
ICAgICAgICAgICAgICAgICAgUmVuZGVyQmxvY2sqIGJsb2NrID0gcmVuZGVyZXIoKS0+Y29udGFp
bmluZ0Jsb2NrKCktPmNvbnRhaW5pbmdCbG9jaygpOwotICAgICAgICAgICAgICAgICAgICBibG9j
ay0+YWRkQ29udGludWF0aW9uV2l0aE91dGxpbmUodG9SZW5kZXJJbmxpbmUocmVuZGVyZXIoKS0+
bm9kZSgpLT5yZW5kZXJlcigpKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghaW5saW5l
Rmxvdy0+aXNJbmxpbmVDb250aW51YXRpb24oKSkKLSAgICAgICAgICAgICAgICAgICAgcGFpbnRJ
bmZvLm91dGxpbmVPYmplY3RzLT5hZGQoaW5saW5lRmxvdyk7CisgICAgICAgICAgICAgICAgcGFp
bnRJbmZvLm91dGxpbmVPYmplY3RzLT5hZGQoaW5saW5lRmxvdyk7CiAgICAgICAgICAgICB9CiAg
ICAgICAgIH0gZWxzZSBpZiAocGFpbnRJbmZvLnBoYXNlID09IFBhaW50UGhhc2VNYXNrKSB7Ci0g
ICAgICAgICAgICBwYWludE1hc2socGFpbnRJbmZvLCB0eCwgdHkpOworICAgICAgICAgICAgcGFp
bnRNYXNrKHBhaW50SW5mbywgdHgsIHR5LCBsaW5lQm94UGFpbnRJbmZvKTsKICAgICAgICAgICAg
IHJldHVybjsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIDEuIFBhaW50IG91ciBi
YWNrZ3JvdW5kLCBib3JkZXIgYW5kIGJveC1zaGFkb3cuCi0gICAgICAgICAgICBwYWludEJveERl
Y29yYXRpb25zKHBhaW50SW5mbywgdHgsIHR5KTsKKyAgICAgICAgICAgIHBhaW50Qm94RGVjb3Jh
dGlvbnMocGFpbnRJbmZvLCB0eCwgdHksIGxpbmVCb3hQYWludEluZm8pOwogCiAgICAgICAgICAg
ICAvLyAyLiBQYWludCBvdXIgdW5kZXJsaW5lIGFuZCBvdmVybGluZS4KLSAgICAgICAgICAgIHBh
aW50VGV4dERlY29yYXRpb25zKHBhaW50SW5mbywgdHgsIHR5LCBmYWxzZSk7CisgICAgICAgICAg
ICBwYWludFRleHREZWNvcmF0aW9ucyhwYWludEluZm8sIHR4LCB0eSwgZmFsc2UsIGxpbmVCb3hQ
YWludEluZm8pOwogICAgICAgICB9CiAgICAgfQogCkBAIC02NzAsMTMgKzY3NCwxMyBAQCB2b2lk
IElubGluZUZsb3dCb3g6OnBhaW50KFJlbmRlck9iamVjdDo6CiAgICAgaWYgKHBhaW50UGhhc2Ug
IT0gUGFpbnRQaGFzZVNlbGZPdXRsaW5lKSB7CiAgICAgICAgIGZvciAoSW5saW5lQm94KiBjdXJy
ID0gZmlyc3RDaGlsZCgpOyBjdXJyOyBjdXJyID0gY3Vyci0+bmV4dE9uTGluZSgpKSB7CiAgICAg
ICAgICAgICBpZiAoY3Vyci0+cmVuZGVyZXIoKS0+aXNUZXh0KCkgfHwgIWN1cnItPmJveE1vZGVs
T2JqZWN0KCktPmhhc1NlbGZQYWludGluZ0xheWVyKCkpCi0gICAgICAgICAgICAgICAgY3Vyci0+
cGFpbnQoY2hpbGRJbmZvLCB0eCwgdHkpOworICAgICAgICAgICAgICAgIGN1cnItPnBhaW50KGNo
aWxkSW5mbywgdHgsIHR5LCBsaW5lQm94UGFpbnRJbmZvKTsKICAgICAgICAgfQogICAgIH0KIAog
ICAgIC8vIDQuIFBhaW50IG91ciBzdHJpa2UtdGhyb3VnaAogICAgIGlmIChwYWludEluZm8ucGhh
c2UgPT0gUGFpbnRQaGFzZUZvcmVncm91bmQgfHwgcGFpbnRJbmZvLnBoYXNlID09IFBhaW50UGhh
c2VTZWxlY3Rpb24pCi0gICAgICAgIHBhaW50VGV4dERlY29yYXRpb25zKHBhaW50SW5mbywgdHgs
IHR5LCB0cnVlKTsKKyAgICAgICAgcGFpbnRUZXh0RGVjb3JhdGlvbnMocGFpbnRJbmZvLCB0eCwg
dHksIHRydWUsIGxpbmVCb3hQYWludEluZm8pOwogfQogCiB2b2lkIElubGluZUZsb3dCb3g6OnBh
aW50RmlsbExheWVycyhjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJbmZvLCBj
b25zdCBDb2xvciYgYywgY29uc3QgRmlsbExheWVyKiBmaWxsTGF5ZXIsIGludCBfdHgsIGludCBf
dHksIGludCB3LCBpbnQgaCwgQ29tcG9zaXRlT3BlcmF0b3Igb3ApCkBAIC03MjcsOSArNzMxLDkg
QEAgdm9pZCBJbmxpbmVGbG93Qm94OjpwYWludEJveFNoYWRvdyhHcmFwaAogICAgIH0KIH0KIAot
dm9pZCBJbmxpbmVGbG93Qm94OjpwYWludEJveERlY29yYXRpb25zKFJlbmRlck9iamVjdDo6UGFp
bnRJbmZvJiBwYWludEluZm8sIGludCB0eCwgaW50IHR5KQordm9pZCBJbmxpbmVGbG93Qm94Ojpw
YWludEJveERlY29yYXRpb25zKFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGlu
dCB0eCwgaW50IHR5LCBMaW5lQm94UGFpbnRJbmZvJiBsaW5lQm94UGFpbnRJbmZvKQogewotICAg
IGlmICghcmVuZGVyZXIoKS0+c2hvdWxkUGFpbnRXaXRoaW5Sb290KHBhaW50SW5mbykgfHwgcmVu
ZGVyZXIoKS0+c3R5bGUoKS0+dmlzaWJpbGl0eSgpICE9IFZJU0lCTEUgfHwgcGFpbnRJbmZvLnBo
YXNlICE9IFBhaW50UGhhc2VGb3JlZ3JvdW5kKQorICAgIGlmICghcmVuZGVyZXIoKS0+c2hvdWxk
UGFpbnRXaXRoaW5Sb290KHBhaW50SW5mbykgfHwgcmVuZGVyZXIoKS0+c3R5bGUoKS0+dmlzaWJp
bGl0eSgpICE9IFZJU0lCTEUgfHwgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VGb3JlZ3Jv
dW5kIHx8IGxpbmVCb3hQYWludEluZm8uYW5vbnltb3VzSW5saW5lQmxvY2spCiAgICAgICAgIHJl
dHVybjsKIAogICAgIGludCB4ID0gbV94OwpAQCAtODAzLDkgKzgwNyw5IEBAIHZvaWQgSW5saW5l
Rmxvd0JveDo6cGFpbnRCb3hEZWNvcmF0aW9ucygKICAgICB9CiB9CiAKLXZvaWQgSW5saW5lRmxv
d0JveDo6cGFpbnRNYXNrKFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGludCB0
eCwgaW50IHR5KQordm9pZCBJbmxpbmVGbG93Qm94OjpwYWludE1hc2soUmVuZGVyT2JqZWN0OjpQ
YWludEluZm8mIHBhaW50SW5mbywgaW50IHR4LCBpbnQgdHksIExpbmVCb3hQYWludEluZm8mIGxp
bmVCb3hQYWludEluZm8pCiB7Ci0gICAgaWYgKCFyZW5kZXJlcigpLT5zaG91bGRQYWludFdpdGhp
blJvb3QocGFpbnRJbmZvKSB8fCByZW5kZXJlcigpLT5zdHlsZSgpLT52aXNpYmlsaXR5KCkgIT0g
VklTSUJMRSB8fCBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZU1hc2spCisgICAgaWYgKCFy
ZW5kZXJlcigpLT5zaG91bGRQYWludFdpdGhpblJvb3QocGFpbnRJbmZvKSB8fCByZW5kZXJlcigp
LT5zdHlsZSgpLT52aXNpYmlsaXR5KCkgIT0gVklTSUJMRSB8fCBwYWludEluZm8ucGhhc2UgIT0g
UGFpbnRQaGFzZU1hc2sgfHwgbGluZUJveFBhaW50SW5mby5hbm9ueW1vdXNJbmxpbmVCbG9jaykK
ICAgICAgICAgcmV0dXJuOwogCiAgICAgaW50IHggPSBtX3g7CkBAIC04OTUsMTIgKzg5OSwxMiBA
QCBzdGF0aWMgYm9vbCBzaG91bGREcmF3VGV4dERlY29yYXRpb24oUmVuCiAgICAgcmV0dXJuIGZh
bHNlOwogfQogCi12b2lkIElubGluZUZsb3dCb3g6OnBhaW50VGV4dERlY29yYXRpb25zKFJlbmRl
ck9iamVjdDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGludCB0eCwgaW50IHR5LCBib29sIHBhaW50
ZWRDaGlsZHJlbikKK3ZvaWQgSW5saW5lRmxvd0JveDo6cGFpbnRUZXh0RGVjb3JhdGlvbnMoUmVu
ZGVyT2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgaW50IHR4LCBpbnQgdHksIGJvb2wgcGFp
bnRlZENoaWxkcmVuLCBMaW5lQm94UGFpbnRJbmZvJiBsaW5lQm94UGFpbnRJbmZvKQogewogICAg
IC8vIFBhaW50IHRleHQgZGVjb3JhdGlvbnMgbGlrZSB1bmRlcmxpbmVzL292ZXJsaW5lcy4gV2Ug
b25seSBkbyB0aGlzIGlmIHdlIGFyZW4ndCBpbiBxdWlya3MgbW9kZSAoaS5lLiwgaW4KICAgICAv
LyBhbG1vc3Qtc3RyaWN0IG1vZGUgb3Igc3RyaWN0IG1vZGUpLgogICAgIGlmIChyZW5kZXJlcigp
LT5zdHlsZSgpLT5odG1sSGFja3MoKSB8fCAhcmVuZGVyZXIoKS0+c2hvdWxkUGFpbnRXaXRoaW5S
b290KHBhaW50SW5mbykgfHwKLSAgICAgICAgcmVuZGVyZXIoKS0+c3R5bGUoKS0+dmlzaWJpbGl0
eSgpICE9IFZJU0lCTEUpCisgICAgICAgIHJlbmRlcmVyKCktPnN0eWxlKCktPnZpc2liaWxpdHko
KSAhPSBWSVNJQkxFIHx8IGxpbmVCb3hQYWludEluZm8uYW5vbnltb3VzSW5saW5lQmxvY2spCiAg
ICAgICAgIHJldHVybjsKICAgICAKICAgICAvLyBXZSBkb24ndCB3YW50IHVuZGVybGluZXMgb3Ig
b3RoZXIgZGVjb3JhdGlvbnMgd2hlbiB3ZSdyZSB0cnlpbmcgdG8gZHJhdyBub3RoaW5nIGJ1dCB0
aGUgc2VsZWN0aW9uIGFzIHdoaXRlIHRleHQuCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9Jbmxp
bmVGbG93Qm94LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lRmxvd0Jv
eC5oCShyZXZpc2lvbiA1NDY2NCkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUZsb3dCb3gu
aAkod29ya2luZyBjb3B5KQpAQCAtODQsMTQgKzg0LDE0IEBAIHB1YmxpYzoKIAogICAgIHZpcnR1
YWwgdm9pZCBjbGVhclRydW5jYXRpb24oKTsKIAotICAgIHZpcnR1YWwgdm9pZCBwYWludEJveERl
Y29yYXRpb25zKFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiwgaW50IHR4LCBpbnQgdHkpOwotICAg
IHZpcnR1YWwgdm9pZCBwYWludE1hc2soUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBpbnQgdHgs
IGludCB0eSk7CisgICAgdm9pZCBwYWludEJveERlY29yYXRpb25zKFJlbmRlck9iamVjdDo6UGFp
bnRJbmZvJiwgaW50IHR4LCBpbnQgdHksIExpbmVCb3hQYWludEluZm8mKTsKKyAgICB2b2lkIHBh
aW50TWFzayhSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5LCBMaW5lQm94
UGFpbnRJbmZvJik7CiAgICAgdm9pZCBwYWludEZpbGxMYXllcnMoY29uc3QgUmVuZGVyT2JqZWN0
OjpQYWludEluZm8mLCBjb25zdCBDb2xvciYsIGNvbnN0IEZpbGxMYXllciosIGludCB0eCwgaW50
IHR5LCBpbnQgdywgaW50IGgsIENvbXBvc2l0ZU9wZXJhdG9yID0gQ29tcG9zaXRlU291cmNlT3Zl
cik7CiAgICAgdm9pZCBwYWludEZpbGxMYXllcihjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5m
byYsIGNvbnN0IENvbG9yJiwgY29uc3QgRmlsbExheWVyKiwgaW50IHR4LCBpbnQgdHksIGludCB3
LCBpbnQgaCwgQ29tcG9zaXRlT3BlcmF0b3IgPSBDb21wb3NpdGVTb3VyY2VPdmVyKTsKICAgICB2
b2lkIHBhaW50Qm94U2hhZG93KEdyYXBoaWNzQ29udGV4dCosIFJlbmRlclN0eWxlKiwgU2hhZG93
U3R5bGUsIGludCB0eCwgaW50IHR5LCBpbnQgdywgaW50IGgpOwotICAgIHZpcnR1YWwgdm9pZCBw
YWludFRleHREZWNvcmF0aW9ucyhSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGludCB0eCwgaW50
IHR5LCBib29sIHBhaW50ZWRDaGlsZHJlbiA9IGZhbHNlKTsKLSAgICB2aXJ0dWFsIHZvaWQgcGFp
bnQoUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBpbnQgdHgsIGludCB0eSk7Ci0gICAgdmlydHVh
bCBib29sIG5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiwgSGl0VGVzdFJlc3VsdCYs
IGludCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHkpOworICAgIHZvaWQgcGFpbnRUZXh0RGVjb3Jh
dGlvbnMoUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBpbnQgdHgsIGludCB0eSwgYm9vbCBwYWlu
dGVkQ2hpbGRyZW4sIExpbmVCb3hQYWludEluZm8mKTsKKyAgICB2aXJ0dWFsIHZvaWQgcGFpbnQo
UmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBpbnQgdHgsIGludCB0eSwgTGluZUJveFBhaW50SW5m
byYpOworICAgIHZpcnR1YWwgYm9vbCBub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYs
IEhpdFRlc3RSZXN1bHQmLCBpbnQgeCwgaW50IHksIGludCB0eCwgaW50IHR5LCBIaXRUZXN0QWN0
aW9uLCBMaW5lQm94SGl0VGVzdEluZm8mKTsKIAogICAgIHZpcnR1YWwgUmVuZGVyTGluZUJveExp
c3QqIHJlbmRlcmVyTGluZUJveGVzKCkgY29uc3Q7CiAKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5n
L0lubGluZVJ1bkJveC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZVJ1
bkJveC5oCShyZXZpc2lvbiA1NDY2NCkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZVJ1bkJv
eC5oCSh3b3JraW5nIGNvcHkpCkBAIC0zOCwxMCArMzgsNyBAQCBwdWJsaWM6CiAgICAgSW5saW5l
UnVuQm94KiBuZXh0TGluZUJveCgpIGNvbnN0IHsgcmV0dXJuIG1fbmV4dExpbmU7IH0KICAgICB2
b2lkIHNldE5leHRMaW5lQm94KElubGluZVJ1bkJveCogbikgeyBtX25leHRMaW5lID0gbjsgfQog
ICAgIHZvaWQgc2V0UHJldmlvdXNMaW5lQm94KElubGluZVJ1bkJveCogcCkgeyBtX3ByZXZMaW5l
ID0gcDsgfQotCi0gICAgdmlydHVhbCB2b2lkIHBhaW50Qm94RGVjb3JhdGlvbnMoUmVuZGVyT2Jq
ZWN0OjpQYWludEluZm8mLCBpbnQgLyp0eCovLCBpbnQgLyp0eSovKSB7IH0KLSAgICB2aXJ0dWFs
IHZvaWQgcGFpbnRUZXh0RGVjb3JhdGlvbnMoUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBpbnQg
Lyp0eCovLCBpbnQgLyp0eSovLCBib29sIC8qcGFpbnRlZENoaWxkcmVuKi8gPSBmYWxzZSkgeyB9
Ci0gICAgCisgCiBwcm90ZWN0ZWQ6CiAgICAgSW5saW5lUnVuQm94KiBtX3ByZXZMaW5lOyAgLy8g
VGhlIHByZXZpb3VzIGJveCB0aGF0IGFsc28gdXNlcyBvdXIgUmVuZGVyT2JqZWN0CiAgICAgSW5s
aW5lUnVuQm94KiBtX25leHRMaW5lOyAgLy8gVGhlIG5leHQgYm94IHRoYXQgYWxzbyB1c2VzIG91
ciBSZW5kZXJPYmplY3QKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZVRleHRCb3guY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZVRleHRCb3guY3BwCShyZXZp
c2lvbiA1NDY2NCkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZVRleHRCb3guY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0yNjAsNyArMjYwLDcgQEAgYm9vbCBJbmxpbmVUZXh0Qm94Ojppc0xpbmVC
cmVhaygpIGNvbnN0CiAgICAgcmV0dXJuIHJlbmRlcmVyKCktPmlzQlIoKSB8fCAocmVuZGVyZXIo
KS0+c3R5bGUoKS0+cHJlc2VydmVOZXdsaW5lKCkgJiYgbGVuKCkgPT0gMSAmJiAoKnRleHRSZW5k
ZXJlcigpLT50ZXh0KCkpW3N0YXJ0KCldID09ICdcbicpOwogfQogCi1ib29sIElubGluZVRleHRC
b3g6Om5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiwgSGl0VGVzdFJlc3VsdCYgcmVz
dWx0LCBpbnQgeCwgaW50IHksIGludCB0eCwgaW50IHR5KQorYm9vbCBJbmxpbmVUZXh0Qm94Ojpu
b2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmIHJlc3VsdCwg
aW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSwgSGl0VGVzdEFjdGlvbiwgTGluZUJveEhpdFRl
c3RJbmZvJikKIHsKICAgICBpZiAoaXNMaW5lQnJlYWsoKSkKICAgICAgICAgcmV0dXJuIGZhbHNl
OwpAQCAtMzI0LDcgKzMyNCw3IEBAIHN0YXRpYyB2b2lkIHBhaW50VGV4dFdpdGhTaGFkb3dzKEdy
YXBoaWMKICAgICB9IHdoaWxlIChzaGFkb3cgfHwgc3Ryb2tlZCB8fCAhb3BhcXVlKTsKIH0KIAot
dm9pZCBJbmxpbmVUZXh0Qm94OjpwYWludChSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJ
bmZvLCBpbnQgdHgsIGludCB0eSkKK3ZvaWQgSW5saW5lVGV4dEJveDo6cGFpbnQoUmVuZGVyT2Jq
ZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgaW50IHR4LCBpbnQgdHksIExpbmVCb3hQYWludElu
Zm8mKQogewogICAgIGlmIChpc0xpbmVCcmVhaygpIHx8ICFyZW5kZXJlcigpLT5zaG91bGRQYWlu
dFdpdGhpblJvb3QocGFpbnRJbmZvKSB8fCByZW5kZXJlcigpLT5zdHlsZSgpLT52aXNpYmlsaXR5
KCkgIT0gVklTSUJMRSB8fAogICAgICAgICBtX3RydW5jYXRpb24gPT0gY0Z1bGxUcnVuY2F0aW9u
IHx8IHBhaW50SW5mby5waGFzZSA9PSBQYWludFBoYXNlT3V0bGluZSkKSW5kZXg6IFdlYkNvcmUv
cmVuZGVyaW5nL0lubGluZVRleHRCb3guaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmlu
Zy9JbmxpbmVUZXh0Qm94LmgJKHJldmlzaW9uIDU0NjY0KQorKysgV2ViQ29yZS9yZW5kZXJpbmcv
SW5saW5lVGV4dEJveC5oCSh3b3JraW5nIGNvcHkpCkBAIC03NCw4ICs3NCw4IEBAIHB1YmxpYzoK
ICAgICB2b2lkIHNlbGVjdGlvblN0YXJ0RW5kKGludCYgc1BvcywgaW50JiBlUG9zKTsKIAogcHJp
dmF0ZToKLSAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBp
bnQgdHgsIGludCB0eSk7Ci0gICAgdmlydHVhbCBib29sIG5vZGVBdFBvaW50KGNvbnN0IEhpdFRl
c3RSZXF1ZXN0JiwgSGl0VGVzdFJlc3VsdCYsIGludCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHkp
OworICAgIHZpcnR1YWwgdm9pZCBwYWludChSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGludCB0
eCwgaW50IHR5LCBMaW5lQm94UGFpbnRJbmZvJik7CisgICAgdmlydHVhbCBib29sIG5vZGVBdFBv
aW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiwgSGl0VGVzdFJlc3VsdCYsIGludCB4LCBpbnQgeSwg
aW50IHR4LCBpbnQgdHksIEhpdFRlc3RBY3Rpb24sIExpbmVCb3hIaXRUZXN0SW5mbyYpOwogCiBw
dWJsaWM6CiAgICAgUmVuZGVyVGV4dCogdGV4dFJlbmRlcmVyKCkgY29uc3Q7CkluZGV4OiBXZWJD
b3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5k
ZXJpbmcvUmVuZGVyQmxvY2suY3BwCShyZXZpc2lvbiA1NDY2NCkKKysrIFdlYkNvcmUvcmVuZGVy
aW5nL1JlbmRlckJsb2NrLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNzcsOCArNzcsNiBAQCBzdGF0
aWMgUGVyY2VudEhlaWdodERlc2NlbmRhbnRzTWFwKiBnUGVyCiAKIHR5cGVkZWYgV1RGOjpIYXNo
TWFwPGNvbnN0IFJlbmRlckJveCosIEhhc2hTZXQ8UmVuZGVyQmxvY2sqPio+IFBlcmNlbnRIZWln
aHRDb250YWluZXJNYXA7CiBzdGF0aWMgUGVyY2VudEhlaWdodENvbnRhaW5lck1hcCogZ1BlcmNl
bnRIZWlnaHRDb250YWluZXJNYXAgPSAwOwotICAgIAotdHlwZWRlZiBXVEY6Okhhc2hNYXA8UmVu
ZGVyQmxvY2sqLCBMaXN0SGFzaFNldDxSZW5kZXJJbmxpbmUqPio+IENvbnRpbnVhdGlvbk91dGxp
bmVUYWJsZU1hcDsKIAogdHlwZWRlZiBXVEY6Okhhc2hTZXQ8UmVuZGVyQmxvY2sqPiBEZWxheWVk
VXBkYXRlU2Nyb2xsSW5mb1NldDsKIHN0YXRpYyBpbnQgZ0RlbGF5VXBkYXRlU2Nyb2xsSW5mbyA9
IDA7CkBAIC05MSw3ICs4OSw3IEBAIFJlbmRlckJsb2NrOjpNYXJnaW5JbmZvOjpNYXJnaW5JbmZv
KFJlbmQKICAgICAvLyBpZiB3ZSBoYWQgYW55IGJvcmRlci9wYWRkaW5nIChvYnZpb3VzbHkpLCBp
ZiB3ZSdyZSB0aGUgcm9vdCBvciBIVE1MIGVsZW1lbnRzLCBvciBpZgogICAgIC8vIHdlJ3JlIHBv
c2l0aW9uZWQsIGZsb2F0aW5nLCBhIHRhYmxlIGNlbGwuCiAgICAgbV9jYW5Db2xsYXBzZVdpdGhD
aGlsZHJlbiA9ICFibG9jay0+aXNSZW5kZXJWaWV3KCkgJiYgIWJsb2NrLT5pc1Jvb3QoKSAmJiAh
YmxvY2stPmlzUG9zaXRpb25lZCgpICYmCi0gICAgICAgICFibG9jay0+aXNGbG9hdGluZygpICYm
ICFibG9jay0+aXNUYWJsZUNlbGwoKSAmJiAhYmxvY2stPmhhc092ZXJmbG93Q2xpcCgpICYmICFi
bG9jay0+aXNJbmxpbmVCbG9ja09ySW5saW5lVGFibGUoKTsKKyAgICAgICAgIWJsb2NrLT5pc0Zs
b2F0aW5nKCkgJiYgIWJsb2NrLT5pc1RhYmxlQ2VsbCgpICYmICFibG9jay0+aGFzT3ZlcmZsb3dD
bGlwKCkgJiYgKCFibG9jay0+aXNJbmxpbmVCbG9ja09ySW5saW5lVGFibGUoKSB8fCBibG9jay0+
aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKTsKIAogICAgIG1fY2FuQ29sbGFwc2VUb3BXaXRoQ2hp
bGRyZW4gPSBtX2NhbkNvbGxhcHNlV2l0aENoaWxkcmVuICYmICh0b3AgPT0gMCkgJiYgYmxvY2st
PnN0eWxlKCktPm1hcmdpblRvcENvbGxhcHNlKCkgIT0gTVNFUEFSQVRFOwogCkBAIC0xMjAsNyAr
MTE4LDYgQEAgUmVuZGVyQmxvY2s6OlJlbmRlckJsb2NrKE5vZGUqIG5vZGUpCiAgICAgICA6IFJl
bmRlckJveChub2RlKQogICAgICAgLCBtX2Zsb2F0aW5nT2JqZWN0cygwKQogICAgICAgLCBtX3Bv
c2l0aW9uZWRPYmplY3RzKDApCi0gICAgICAsIG1faW5saW5lQ29udGludWF0aW9uKDApCiAgICAg
ICAsIG1fbWF4TWFyZ2luKDApCiAgICAgICAsIG1fbGluZUhlaWdodCgtMSkKIHsKQEAgLTE2MSwx
NCArMTU4LDYgQEAgdm9pZCBSZW5kZXJCbG9jazo6ZGVzdHJveSgpCiAgICAgLy8gTWFrZSBzdXJl
IHRvIGRlc3Ryb3kgYW5vbnltb3VzIGNoaWxkcmVuIGZpcnN0IHdoaWxlIHRoZXkgYXJlIHN0aWxs
IGNvbm5lY3RlZCB0byB0aGUgcmVzdCBvZiB0aGUgdHJlZSwgc28gdGhhdCB0aGV5IHdpbGwKICAg
ICAvLyBwcm9wZXJseSBkaXJ0eSBsaW5lIGJveGVzIHRoYXQgdGhleSBhcmUgcmVtb3ZlZCBmcm9t
LiBFZmZlY3RzIHRoYXQgZG8gOmJlZm9yZS86YWZ0ZXIgb25seSBvbiBob3ZlciBjb3VsZCBjcmFz
aCBvdGhlcndpc2UuCiAgICAgY2hpbGRyZW4oKS0+ZGVzdHJveUxlZnRvdmVyQ2hpbGRyZW4oKTsK
LQotICAgIC8vIERlc3Ryb3kgb3VyIGNvbnRpbnVhdGlvbiBiZWZvcmUgYW55dGhpbmcgb3RoZXIg
dGhhbiBhbm9ueW1vdXMgY2hpbGRyZW4uCi0gICAgLy8gVGhlIHJlYXNvbiB3ZSBkb24ndCBkZXN0
cm95IGl0IGJlZm9yZSBhbm9ueW1vdXMgY2hpbGRyZW4gaXMgdGhhdCB0aGV5IG1heQotICAgIC8v
IGhhdmUgY29udGludWF0aW9ucyBvZiB0aGVpciBvd24gdGhhdCBhcmUgYW5vbnltb3VzIGNoaWxk
cmVuIG9mIG91ciBjb250aW51YXRpb24uCi0gICAgaWYgKG1faW5saW5lQ29udGludWF0aW9uKSB7
Ci0gICAgICAgIG1faW5saW5lQ29udGludWF0aW9uLT5kZXN0cm95KCk7Ci0gICAgICAgIG1faW5s
aW5lQ29udGludWF0aW9uID0gMDsKLSAgICB9CiAgICAgCiAgICAgaWYgKCFkb2N1bWVudEJlaW5n
RGVzdHJveWVkKCkpIHsKICAgICAgICAgaWYgKGZpcnN0TGluZUJveCgpKSB7CkBAIC0zMTYsNyAr
MzA1LDcgQEAgdm9pZCBSZW5kZXJCbG9jazo6YWRkQ2hpbGQoUmVuZGVyT2JqZWN0KgogICAgICAg
ICB9CiAgICAgfSBlbHNlIGlmICghY2hpbGRyZW5JbmxpbmUoKSAmJiAobmV3Q2hpbGQtPmlzRmxv
YXRpbmdPclBvc2l0aW9uZWQoKSB8fCBuZXdDaGlsZC0+aXNJbmxpbmUoKSkpIHsKICAgICAgICAg
Ly8gSWYgd2UncmUgaW5zZXJ0aW5nIGFuIGlubGluZSBjaGlsZCBidXQgYWxsIG9mIG91ciBjaGls
ZHJlbiBhcmUgYmxvY2tzLCB0aGVuIHdlIGhhdmUgdG8gbWFrZSBzdXJlCi0gICAgICAgIC8vIGl0
IGlzIHB1dCBpbnRvIGFuIGFub215b3VzIGJsb2NrIGJveC4gV2UgdHJ5IHRvIHVzZSBhbiBleGlz
dGluZyBhbm9ueW1vdXMgYm94IGlmIHBvc3NpYmxlLCBvdGhlcndpc2UKKyAgICAgICAgLy8gaXQg
aXMgcHV0IGludG8gYW4gYW5vbnltb3VzIGJsb2NrIGJveC4gV2UgdHJ5IHRvIHVzZSBhbiBleGlz
dGluZyBhbm9ueW1vdXMgYm94IGlmIHBvc3NpYmxlLCBvdGhlcndpc2UKICAgICAgICAgLy8gYSBu
ZXcgb25lIGlzIGNyZWF0ZWQgYW5kIGluc2VydGVkIGludG8gb3VyIGxpc3Qgb2YgY2hpbGRyZW4g
aW4gdGhlIGFwcHJvcHJpYXRlIHBvc2l0aW9uLgogICAgICAgICBSZW5kZXJPYmplY3QqIGFmdGVy
Q2hpbGQgPSBiZWZvcmVDaGlsZCA/IGJlZm9yZUNoaWxkLT5wcmV2aW91c1NpYmxpbmcoKSA6IGxh
c3RDaGlsZCgpOwogCkBAIC0zOTEsOSArMzgwLDkgQEAgUm9vdElubGluZUJveCogUmVuZGVyQmxv
Y2s6OmNyZWF0ZVJvb3RJbgogICAgIHJldHVybiBuZXcgKHJlbmRlckFyZW5hKCkpIFJvb3RJbmxp
bmVCb3godGhpcyk7CiB9CiAKLVJvb3RJbmxpbmVCb3gqIFJlbmRlckJsb2NrOjpjcmVhdGVBbmRB
cHBlbmRSb290SW5saW5lQm94KCkKLXsKLSAgICBSb290SW5saW5lQm94KiByb290Qm94ID0gY3Jl
YXRlUm9vdElubGluZUJveCgpOworUm9vdElubGluZUJveCogUmVuZGVyQmxvY2s6OmNyZWF0ZUFu
ZEFwcGVuZFJvb3RJbmxpbmVCb3goUmVuZGVyQmxvY2sqIGFub255bW91c0lubGluZUJsb2NrKQor
eyAKKyAgICBSb290SW5saW5lQm94KiByb290Qm94ID0gYW5vbnltb3VzSW5saW5lQmxvY2sgPyBu
ZXcgKHJlbmRlckFyZW5hKCkpIFJvb3RBbm9ueW1vdXNJbmxpbmVCbG9ja0JveCh0aGlzLCBhbm9u
eW1vdXNJbmxpbmVCbG9jaykgOiBjcmVhdGVSb290SW5saW5lQm94KCk7CiAgICAgbV9saW5lQm94
ZXMuYXBwZW5kTGluZUJveChyb290Qm94KTsKICAgICByZXR1cm4gcm9vdEJveDsKIH0KQEAgLTQ5
MCw5ICs0NzksNiBAQCB2b2lkIFJlbmRlckJsb2NrOjpyZW1vdmVMZWZ0b3ZlckFub255bW91CiAg
ICAgQVNTRVJUKGNoaWxkLT5pc0Fub255bW91c0Jsb2NrKCkpOwogICAgIEFTU0VSVCghY2hpbGQt
PmNoaWxkcmVuSW5saW5lKCkpOwogICAgIAotICAgIGlmIChjaGlsZC0+aW5saW5lQ29udGludWF0
aW9uKCkpIAotICAgICAgICByZXR1cm47Ci0gICAgCiAgICAgUmVuZGVyT2JqZWN0KiBmaXJzdEFu
Q2hpbGQgPSBjaGlsZC0+bV9jaGlsZHJlbi5maXJzdENoaWxkKCk7CiAgICAgUmVuZGVyT2JqZWN0
KiBsYXN0QW5DaGlsZCA9IGNoaWxkLT5tX2NoaWxkcmVuLmxhc3RDaGlsZCgpOwogICAgIGlmIChm
aXJzdEFuQ2hpbGQpIHsKQEAgLTUzNSw3ICs1MjEsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjpyZW1v
dmVDaGlsZChSZW5kZXJPYmplCiAgICAgUmVuZGVyT2JqZWN0KiBwcmV2ID0gb2xkQ2hpbGQtPnBy
ZXZpb3VzU2libGluZygpOwogICAgIFJlbmRlck9iamVjdCogbmV4dCA9IG9sZENoaWxkLT5uZXh0
U2libGluZygpOwogICAgIGJvb2wgY2FuRGVsZXRlQW5vbnltb3VzQmxvY2tzID0gIWRvY3VtZW50
QmVpbmdEZXN0cm95ZWQoKSAmJiAhaXNJbmxpbmUoKSAmJiAhb2xkQ2hpbGQtPmlzSW5saW5lKCkg
JiYgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIW9sZENoaWxkLT5pc1Jl
bmRlckJsb2NrKCkgfHwgIXRvUmVuZGVyQmxvY2sob2xkQ2hpbGQpLT5pbmxpbmVDb250aW51YXRp
b24oKSkgJiYgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhb2xkQ2hpbGQt
PmlzUmVuZGVyQmxvY2soKSAmJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICghcHJldiB8fCAocHJldi0+aXNBbm9ueW1vdXNCbG9jaygpICYmIHByZXYtPmNoaWxkcmVuSW5s
aW5lKCkpKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFuZXh0IHx8
IChuZXh0LT5pc0Fub255bW91c0Jsb2NrKCkgJiYgbmV4dC0+Y2hpbGRyZW5JbmxpbmUoKSkpOwog
ICAgIGlmIChjYW5EZWxldGVBbm9ueW1vdXNCbG9ja3MgJiYgcHJldiAmJiBuZXh0KSB7CkBAIC01
OTgsOSArNTg0LDE1IEBAIGJvb2wgUmVuZGVyQmxvY2s6OmlzU2VsZkNvbGxhcHNpbmdCbG9jaygK
ICAgICAvLyBvbiB3aGV0aGVyIHdlIGhhdmUgY29udGVudCB0aGF0IGlzIGFsbCBzZWxmLWNvbGxh
cHNpbmcgb3Igbm90LgogICAgIGlmIChoYXNBdXRvSGVpZ2h0IHx8ICgoc3R5bGUoKS0+aGVpZ2h0
KCkuaXNGaXhlZCgpIHx8IHN0eWxlKCktPmhlaWdodCgpLmlzUGVyY2VudCgpKSAmJiBzdHlsZSgp
LT5oZWlnaHQoKS5pc1plcm8oKSkpIHsKICAgICAgICAgLy8gSWYgdGhlIGJsb2NrIGhhcyBpbmxp
bmUgY2hpbGRyZW4sIHNlZSBpZiB3ZSBnZW5lcmF0ZWQgYW55IGxpbmUgYm94ZXMuICBJZiB3ZSBo
YXZlIGFueQotICAgICAgICAvLyBsaW5lIGJveGVzLCB0aGVuIHdlIGNhbid0IGJlIHNlbGYtY29s
bGFwc2luZywgc2luY2Ugd2UgaGF2ZSBjb250ZW50LgotICAgICAgICBpZiAoY2hpbGRyZW5Jbmxp
bmUoKSkKLSAgICAgICAgICAgIHJldHVybiAhZmlyc3RMaW5lQm94KCk7CisgICAgICAgIC8vIGxp
bmUgYm94ZXMsIHRoZW4gd2UgY2FuIG9ubHkgYmUgc2VsZi1jb2xsYXBzaW5nIGlmIHdlIGhhdmUg
bm90aGluZyBidXQgYW5vbnltb3VzIGlubGluZSBibG9ja3MKKyAgICAgICAgLy8gdGhhdCBhcmUg
YWxzbyBzZWxmLWNvbGxhcHNpbmcgaW5zaWRlIHVzLgorICAgICAgICBpZiAoY2hpbGRyZW5Jbmxp
bmUoKSkgeworICAgICAgICAgICAgZm9yIChSb290SW5saW5lQm94KiBjaGlsZCA9IGZpcnN0Um9v
dEJveCgpOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dFJvb3RCb3goKSkgeworICAgICAgICAg
ICAgICAgIGlmICghY2hpbGQtPmhhc0Fub255bW91c0lubGluZUJsb2NrKCkgfHwgIWNoaWxkLT5h
bm9ueW1vdXNJbmxpbmVCbG9jaygpLT5pc1NlbGZDb2xsYXBzaW5nQmxvY2soKSkKKyAgICAgICAg
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0
dXJuIHRydWU7IC8vIFdlIGhhdmUgbm8gbGluZSBib3hlcywgc28gd2UgbXVzdCBiZSBzZWxmLWNv
bGxhcHNpbmcuCisgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIC8vIFdoZXRoZXIgb3Igbm90
IHdlIGNvbGxhcHNlIGlzIGRlcGVuZGVudCBvbiB3aGV0aGVyIGFsbCBvdXIgbm9ybWFsIGZsb3cg
Y2hpbGRyZW4KICAgICAgICAgLy8gYXJlIGFsc28gc2VsZi1jb2xsYXBzaW5nLgpAQCAtODU1LDcg
Kzg0Nyw4IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmFkZE92ZXJmbG93RnJvbUZsb2F0cygKIAogYm9v
bCBSZW5kZXJCbG9jazo6ZXhwYW5kc1RvRW5jbG9zZU92ZXJoYW5naW5nRmxvYXRzKCkgY29uc3QK
IHsKLSAgICByZXR1cm4gaXNJbmxpbmVCbG9ja09ySW5saW5lVGFibGUoKSB8fCBpc0Zsb2F0aW5n
T3JQb3NpdGlvbmVkKCkgfHwgaGFzT3ZlcmZsb3dDbGlwKCkgfHwgKHBhcmVudCgpICYmIHBhcmVu
dCgpLT5pc0ZsZXhpYmxlQm94KCkpIHx8IGhhc0NvbHVtbnMoKSB8fCBpc1RhYmxlQ2VsbCgpIHx8
IGlzRmllbGRzZXQoKTsKKyAgICByZXR1cm4gaXNGbG9hdGluZ09yUG9zaXRpb25lZCgpIHx8IGhh
c092ZXJmbG93Q2xpcCgpIHx8IChwYXJlbnQoKSAmJiBwYXJlbnQoKS0+aXNGbGV4aWJsZUJveCgp
KSB8fCBoYXNDb2x1bW5zKCkgfHwgaXNUYWJsZUNlbGwoKSB8fCBpc0ZpZWxkc2V0KCkgfHwKKyAg
ICAgICAgICAgKGlzSW5saW5lQmxvY2tPcklubGluZVRhYmxlKCkgJiYgIWlzQW5vbnltb3VzSW5s
aW5lQmxvY2soKSk7CiB9CiAKIHZvaWQgUmVuZGVyQmxvY2s6OmFkanVzdFBvc2l0aW9uZWRCbG9j
ayhSZW5kZXJCb3gqIGNoaWxkLCBjb25zdCBNYXJnaW5JbmZvJiBtYXJnaW5JbmZvKQpAQCAtMTAw
MSwxOSArOTk0LDE5IEBAIGJvb2wgUmVuZGVyQmxvY2s6OmhhbmRsZVJ1bkluQ2hpbGQoUmVuZGUK
IGludCBSZW5kZXJCbG9jazo6Y29sbGFwc2VNYXJnaW5zKFJlbmRlckJveCogY2hpbGQsIE1hcmdp
bkluZm8mIG1hcmdpbkluZm8pCiB7CiAgICAgLy8gR2V0IG91ciBtYXggcG9zIGFuZCBuZWcgdG9w
IG1hcmdpbnMuCi0gICAgaW50IHBvc1RvcCA9IGNoaWxkLT5tYXhUb3BNYXJnaW4odHJ1ZSk7Ci0g
ICAgaW50IG5lZ1RvcCA9IGNoaWxkLT5tYXhUb3BNYXJnaW4oZmFsc2UpOworICAgIGludCBwb3NU
b3AgPSBjaGlsZCA/IGNoaWxkLT5tYXhUb3BNYXJnaW4odHJ1ZSkgOiAwOworICAgIGludCBuZWdU
b3AgPSBjaGlsZCA/IGNoaWxkLT5tYXhUb3BNYXJnaW4oZmFsc2UpIDogMDsKIAogICAgIC8vIEZv
ciBzZWxmLWNvbGxhcHNpbmcgYmxvY2tzLCBjb2xsYXBzZSBvdXIgYm90dG9tIG1hcmdpbnMgaW50
byBvdXIKICAgICAvLyB0b3AgdG8gZ2V0IG5ldyBwb3NUb3AgYW5kIG5lZ1RvcCB2YWx1ZXMuCi0g
ICAgaWYgKGNoaWxkLT5pc1NlbGZDb2xsYXBzaW5nQmxvY2soKSkgeworICAgIGlmIChjaGlsZCAm
JiBjaGlsZC0+aXNTZWxmQ29sbGFwc2luZ0Jsb2NrKCkpIHsKICAgICAgICAgcG9zVG9wID0gbWF4
KHBvc1RvcCwgY2hpbGQtPm1heEJvdHRvbU1hcmdpbih0cnVlKSk7CiAgICAgICAgIG5lZ1RvcCA9
IG1heChuZWdUb3AsIGNoaWxkLT5tYXhCb3R0b21NYXJnaW4oZmFsc2UpKTsKICAgICB9CiAgICAg
CiAgICAgLy8gU2VlIGlmIHRoZSB0b3AgbWFyZ2luIGlzIHF1aXJreS4gV2Ugb25seSBjYXJlIGlm
IHRoaXMgY2hpbGQgaGFzCiAgICAgLy8gbWFyZ2lucyB0aGF0IHdpbGwgY29sbGFwc2Ugd2l0aCB1
cy4KLSAgICBib29sIHRvcFF1aXJrID0gY2hpbGQtPmlzVG9wTWFyZ2luUXVpcmsoKSB8fCBzdHls
ZSgpLT5tYXJnaW5Ub3BDb2xsYXBzZSgpID09IE1ESVNDQVJEOworICAgIGJvb2wgdG9wUXVpcmsg
PSAoY2hpbGQgJiYgY2hpbGQtPmlzVG9wTWFyZ2luUXVpcmsoKSkgfHwgc3R5bGUoKS0+bWFyZ2lu
VG9wQ29sbGFwc2UoKSA9PSBNRElTQ0FSRDsKIAogICAgIGlmIChtYXJnaW5JbmZvLmNhbkNvbGxh
cHNlV2l0aFRvcCgpKSB7CiAgICAgICAgIC8vIFRoaXMgY2hpbGQgaXMgY29sbGFwc2luZyB3aXRo
IHRoZSB0b3Agb2YgdGhlCkBAIC0xMDI2LDcgKzEwMTksNyBAQCBpbnQgUmVuZGVyQmxvY2s6OmNv
bGxhcHNlTWFyZ2lucyhSZW5kZXJCCiAgICAgICAgIC8vIGNvbGxhcHNlIGl0IGF3YXksIGV2ZW4g
aWYgdGhlIG1hcmdpbiBpcyBzbWFsbGVyICh3d3cud2VicmVmZXJlbmNlLmNvbQogICAgICAgICAv
LyBoYXMgYW4gZXhhbXBsZSBvZiB0aGlzLCBhIDxkdD4gd2l0aCAwLjhlbSBhdXRob3Itc3BlY2lm
aWVkIGluc2lkZQogICAgICAgICAvLyBhIDxkbD4gaW5zaWRlIGEgPHRkPi4KLSAgICAgICAgaWYg
KCFtYXJnaW5JbmZvLmRldGVybWluZWRUb3BRdWlyaygpICYmICF0b3BRdWlyayAmJiAocG9zVG9w
LW5lZ1RvcCkpIHsKKyAgICAgICAgaWYgKCFtYXJnaW5JbmZvLmRldGVybWluZWRUb3BRdWlyaygp
ICYmICF0b3BRdWlyayAmJiAocG9zVG9wIC0gbmVnVG9wKSkgewogICAgICAgICAgICAgc2V0VG9w
TWFyZ2luUXVpcmsoZmFsc2UpOwogICAgICAgICAgICAgbWFyZ2luSW5mby5zZXREZXRlcm1pbmVk
VG9wUXVpcmsodHJ1ZSk7CiAgICAgICAgIH0KQEAgLTEwNDQsNyArMTAzNyw3IEBAIGludCBSZW5k
ZXJCbG9jazo6Y29sbGFwc2VNYXJnaW5zKFJlbmRlckIKICAgICAgICAgbWFyZ2luSW5mby5zZXRU
b3BRdWlyayh0b3BRdWlyayk7CiAKICAgICBpbnQgeXBvcyA9IGhlaWdodCgpOwotICAgIGlmIChj
aGlsZC0+aXNTZWxmQ29sbGFwc2luZ0Jsb2NrKCkpIHsKKyAgICBpZiAoY2hpbGQgJiYgY2hpbGQt
PmlzU2VsZkNvbGxhcHNpbmdCbG9jaygpKSB7CiAgICAgICAgIC8vIFRoaXMgY2hpbGQgaGFzIG5v
IGhlaWdodC4gIFdlIG5lZWQgdG8gY29tcHV0ZSBvdXIKICAgICAgICAgLy8gcG9zaXRpb24gYmVm
b3JlIHdlIGNvbGxhcHNlIHRoZSBjaGlsZCdzIG1hcmdpbnMgdG9nZXRoZXIsCiAgICAgICAgIC8v
IHNvIHRoYXQgd2UgY2FuIGdldCBhbiBhY2N1cmF0ZSBwb3NpdGlvbiBmb3IgdGhlIHplcm8taGVp
Z2h0IGJsb2NrLgpAQCAtMTA2MywxMyArMTA1NiwxMSBAQCBpbnQgUmVuZGVyQmxvY2s6OmNvbGxh
cHNlTWFyZ2lucyhSZW5kZXJCCiAgICAgICAgICAgICAvLyB0aGF0IG5lZWRzIHRvIGJlIHBvc2l0
aW9uZWQgY29ycmVjdGx5IChlLmcuLCBhIGJsb2NrIHRoYXQKICAgICAgICAgICAgIC8vIGhhZCBh
IHNwZWNpZmllZCBoZWlnaHQgb2YgMCBidXQgdGhhdCBhY3R1YWxseSBoYWQgc3ViY29udGVudCku
CiAgICAgICAgICAgICB5cG9zID0gaGVpZ2h0KCkgKyBjb2xsYXBzZWRUb3BQb3MgLSBjb2xsYXBz
ZWRUb3BOZWc7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBpZiAoY2hpbGQtPnN0eWxlKCkt
Pm1hcmdpblRvcENvbGxhcHNlKCkgPT0gTVNFUEFSQVRFKSB7CisgICAgfSBlbHNlIHsKKyAgICAg
ICAgaWYgKGNoaWxkICYmIGNoaWxkLT5zdHlsZSgpLT5tYXJnaW5Ub3BDb2xsYXBzZSgpID09IE1T
RVBBUkFURSkgewogICAgICAgICAgICAgc2V0SGVpZ2h0KGhlaWdodCgpICsgbWFyZ2luSW5mby5t
YXJnaW4oKSArIGNoaWxkLT5tYXJnaW5Ub3AoKSk7CiAgICAgICAgICAgICB5cG9zID0gaGVpZ2h0
KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIW1hcmdpbkluZm8uYXRUb3BPZkJsb2Nr
KCkgfHwKKyAgICAgICAgfSBlbHNlIGlmICghbWFyZ2luSW5mby5hdFRvcE9mQmxvY2soKSB8fAog
ICAgICAgICAgICAgKCFtYXJnaW5JbmZvLmNhbkNvbGxhcHNlVG9wV2l0aENoaWxkcmVuKCkKICAg
ICAgICAgICAgICAmJiAoIXN0eWxlKCktPmh0bWxIYWNrcygpIHx8ICFtYXJnaW5JbmZvLnF1aXJr
Q29udGFpbmVyKCkgfHwgIW1hcmdpbkluZm8udG9wUXVpcmsoKSkpKSB7CiAgICAgICAgICAgICAv
LyBXZSdyZSBjb2xsYXBzaW5nIHdpdGggYSBwcmV2aW91cyBzaWJsaW5nJ3MgbWFyZ2lucyBhbmQg
bm90CkBAIC0xMDc4LDExICsxMDY5LDExIEBAIGludCBSZW5kZXJCbG9jazo6Y29sbGFwc2VNYXJn
aW5zKFJlbmRlckIKICAgICAgICAgICAgIHlwb3MgPSBoZWlnaHQoKTsKICAgICAgICAgfQogCi0g
ICAgICAgIG1hcmdpbkluZm8uc2V0UG9zTWFyZ2luKGNoaWxkLT5tYXhCb3R0b21NYXJnaW4odHJ1
ZSkpOwotICAgICAgICBtYXJnaW5JbmZvLnNldE5lZ01hcmdpbihjaGlsZC0+bWF4Qm90dG9tTWFy
Z2luKGZhbHNlKSk7CisgICAgICAgIG1hcmdpbkluZm8uc2V0UG9zTWFyZ2luKGNoaWxkID8gY2hp
bGQtPm1heEJvdHRvbU1hcmdpbih0cnVlKSA6IDApOworICAgICAgICBtYXJnaW5JbmZvLnNldE5l
Z01hcmdpbihjaGlsZCA/IGNoaWxkLT5tYXhCb3R0b21NYXJnaW4oZmFsc2UpIDogMCk7CiAKICAg
ICAgICAgaWYgKG1hcmdpbkluZm8ubWFyZ2luKCkpCi0gICAgICAgICAgICBtYXJnaW5JbmZvLnNl
dEJvdHRvbVF1aXJrKGNoaWxkLT5pc0JvdHRvbU1hcmdpblF1aXJrKCkgfHwgc3R5bGUoKS0+bWFy
Z2luQm90dG9tQ29sbGFwc2UoKSA9PSBNRElTQ0FSRCk7CisgICAgICAgICAgICBtYXJnaW5JbmZv
LnNldEJvdHRvbVF1aXJrKChjaGlsZCAmJiBjaGlsZC0+aXNCb3R0b21NYXJnaW5RdWlyaygpKSB8
fCBzdHlsZSgpLT5tYXJnaW5Cb3R0b21Db2xsYXBzZSgpID09IE1ESVNDQVJEKTsKICAgICB9CiAg
ICAgCiAgICAgcmV0dXJuIHlwb3M7CkBAIC0xNzQ5LDIwICsxNzQwLDcgQEAgdm9pZCBSZW5kZXJC
bG9jazo6cGFpbnRPYmplY3QoUGFpbnRJbmZvJgogICAgIGlmICgocGFpbnRQaGFzZSA9PSBQYWlu
dFBoYXNlT3V0bGluZSB8fCBwYWludFBoYXNlID09IFBhaW50UGhhc2VTZWxmT3V0bGluZSkgJiYg
aGFzT3V0bGluZSgpICYmIHN0eWxlKCktPnZpc2liaWxpdHkoKSA9PSBWSVNJQkxFKQogICAgICAg
ICBwYWludE91dGxpbmUocGFpbnRJbmZvLmNvbnRleHQsIHR4LCB0eSwgd2lkdGgoKSwgaGVpZ2h0
KCksIHN0eWxlKCkpOwogCi0gICAgLy8gNi4gcGFpbnQgY29udGludWF0aW9uIG91dGxpbmVzLgot
ICAgIGlmICgocGFpbnRQaGFzZSA9PSBQYWludFBoYXNlT3V0bGluZSB8fCBwYWludFBoYXNlID09
IFBhaW50UGhhc2VDaGlsZE91dGxpbmVzKSkgewotICAgICAgICBpZiAoaW5saW5lQ29udGludWF0
aW9uKCkgJiYgaW5saW5lQ29udGludWF0aW9uKCktPmhhc091dGxpbmUoKSAmJiBpbmxpbmVDb250
aW51YXRpb24oKS0+c3R5bGUoKS0+dmlzaWJpbGl0eSgpID09IFZJU0lCTEUpIHsKLSAgICAgICAg
ICAgIFJlbmRlcklubGluZSogaW5saW5lUmVuZGVyZXIgPSB0b1JlbmRlcklubGluZShpbmxpbmVD
b250aW51YXRpb24oKS0+bm9kZSgpLT5yZW5kZXJlcigpKTsKLSAgICAgICAgICAgIGlmICghaW5s
aW5lUmVuZGVyZXItPmhhc1NlbGZQYWludGluZ0xheWVyKCkpCi0gICAgICAgICAgICAgICAgY29u
dGFpbmluZ0Jsb2NrKCktPmFkZENvbnRpbnVhdGlvbldpdGhPdXRsaW5lKGlubGluZVJlbmRlcmVy
KTsKLSAgICAgICAgICAgIGVsc2UgaWYgKCFpbmxpbmVSZW5kZXJlci0+Zmlyc3RMaW5lQm94KCkp
Ci0gICAgICAgICAgICAgICAgaW5saW5lUmVuZGVyZXItPnBhaW50T3V0bGluZShwYWludEluZm8u
Y29udGV4dCwgdHggLSB4KCkgKyBpbmxpbmVSZW5kZXJlci0+Y29udGFpbmluZ0Jsb2NrKCktPngo
KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5IC0geSgp
ICsgaW5saW5lUmVuZGVyZXItPmNvbnRhaW5pbmdCbG9jaygpLT55KCkpOwotICAgICAgICB9Ci0g
ICAgICAgIHBhaW50Q29udGludWF0aW9uT3V0bGluZXMocGFpbnRJbmZvLCB0eCwgdHkpOwotICAg
IH0KLQotICAgIC8vIDcuIHBhaW50IGNhcmV0LgorICAgIC8vIDYuIHBhaW50IGNhcmV0LgogICAg
IC8vIElmIHRoZSBjYXJldCdzIG5vZGUncyByZW5kZXIgb2JqZWN0J3MgY29udGFpbmluZyBibG9j
ayBpcyB0aGlzIGJsb2NrLCBhbmQgdGhlIHBhaW50IGFjdGlvbiBpcyBQYWludFBoYXNlRm9yZWdy
b3VuZCwKICAgICAvLyB0aGVuIHBhaW50IHRoZSBjYXJldC4KICAgICBpZiAocGFpbnRQaGFzZSA9
PSBQYWludFBoYXNlRm9yZWdyb3VuZCkgeyAgICAgICAgCkBAIC0xODI1LDU3ICsxODAzLDYgQEAg
dm9pZCBSZW5kZXJCbG9jazo6cGFpbnRFbGxpcHNpc0JveGVzKFBhaQogICAgIH0KIH0KIAotc3Rh
dGljIENvbnRpbnVhdGlvbk91dGxpbmVUYWJsZU1hcCogY29udGludWF0aW9uT3V0bGluZVRhYmxl
KCkKLXsKLSAgICBERUZJTkVfU1RBVElDX0xPQ0FMKENvbnRpbnVhdGlvbk91dGxpbmVUYWJsZU1h
cCwgdGFibGUsICgpKTsKLSAgICByZXR1cm4gJnRhYmxlOwotfQotCi12b2lkIFJlbmRlckJsb2Nr
OjphZGRDb250aW51YXRpb25XaXRoT3V0bGluZShSZW5kZXJJbmxpbmUqIGZsb3cpCi17Ci0gICAg
Ly8gV2UgY2FuJ3QgbWFrZSB0aGlzIHdvcmsgaWYgdGhlIGlubGluZSBpcyBpbiBhIGxheWVyLiAg
V2UnbGwganVzdCByZWx5IG9uIHRoZSBicm9rZW4KLSAgICAvLyB3YXkgb2YgcGFpbnRpbmcuCi0g
ICAgQVNTRVJUKCFmbG93LT5sYXllcigpICYmICFmbG93LT5pc0lubGluZUNvbnRpbnVhdGlvbigp
KTsKLSAgICAKLSAgICBDb250aW51YXRpb25PdXRsaW5lVGFibGVNYXAqIHRhYmxlID0gY29udGlu
dWF0aW9uT3V0bGluZVRhYmxlKCk7Ci0gICAgTGlzdEhhc2hTZXQ8UmVuZGVySW5saW5lKj4qIGNv
bnRpbnVhdGlvbnMgPSB0YWJsZS0+Z2V0KHRoaXMpOwotICAgIGlmICghY29udGludWF0aW9ucykg
ewotICAgICAgICBjb250aW51YXRpb25zID0gbmV3IExpc3RIYXNoU2V0PFJlbmRlcklubGluZSo+
OwotICAgICAgICB0YWJsZS0+c2V0KHRoaXMsIGNvbnRpbnVhdGlvbnMpOwotICAgIH0KLSAgICAK
LSAgICBjb250aW51YXRpb25zLT5hZGQoZmxvdyk7Ci19Ci0KLXZvaWQgUmVuZGVyQmxvY2s6OnBh
aW50Q29udGludWF0aW9uT3V0bGluZXMoUGFpbnRJbmZvJiBpbmZvLCBpbnQgdHgsIGludCB0eSkK
LXsKLSAgICBDb250aW51YXRpb25PdXRsaW5lVGFibGVNYXAqIHRhYmxlID0gY29udGludWF0aW9u
T3V0bGluZVRhYmxlKCk7Ci0gICAgaWYgKHRhYmxlLT5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVy
bjsKLSAgICAgICAgCi0gICAgTGlzdEhhc2hTZXQ8UmVuZGVySW5saW5lKj4qIGNvbnRpbnVhdGlv
bnMgPSB0YWJsZS0+Z2V0KHRoaXMpOwotICAgIGlmICghY29udGludWF0aW9ucykKLSAgICAgICAg
cmV0dXJuOwotICAgICAgICAKLSAgICAvLyBQYWludCBlYWNoIGNvbnRpbnVhdGlvbiBvdXRsaW5l
LgotICAgIExpc3RIYXNoU2V0PFJlbmRlcklubGluZSo+OjppdGVyYXRvciBlbmQgPSBjb250aW51
YXRpb25zLT5lbmQoKTsKLSAgICBmb3IgKExpc3RIYXNoU2V0PFJlbmRlcklubGluZSo+OjppdGVy
YXRvciBpdCA9IGNvbnRpbnVhdGlvbnMtPmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgewotICAg
ICAgICAvLyBOZWVkIHRvIGFkZCBpbiB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIGludGVydmVuaW5n
IGJsb2Nrcy4KLSAgICAgICAgUmVuZGVySW5saW5lKiBmbG93ID0gKml0OwotICAgICAgICBSZW5k
ZXJCbG9jayogYmxvY2sgPSBmbG93LT5jb250YWluaW5nQmxvY2soKTsKLSAgICAgICAgZm9yICgg
OyBibG9jayAmJiBibG9jayAhPSB0aGlzOyBibG9jayA9IGJsb2NrLT5jb250YWluaW5nQmxvY2so
KSkgewotICAgICAgICAgICAgdHggKz0gYmxvY2stPngoKTsKLSAgICAgICAgICAgIHR5ICs9IGJs
b2NrLT55KCk7Ci0gICAgICAgIH0KLSAgICAgICAgQVNTRVJUKGJsb2NrKTsgICAKLSAgICAgICAg
Zmxvdy0+cGFpbnRPdXRsaW5lKGluZm8uY29udGV4dCwgdHgsIHR5KTsKLSAgICB9Ci0gICAgCi0g
ICAgLy8gRGVsZXRlCi0gICAgZGVsZXRlIGNvbnRpbnVhdGlvbnM7Ci0gICAgdGFibGUtPnJlbW92
ZSh0aGlzKTsKLX0KLQogdm9pZCBSZW5kZXJCbG9jazo6c2V0U2VsZWN0aW9uU3RhdGUoU2VsZWN0
aW9uU3RhdGUgcykKIHsKICAgICBpZiAoc2VsZWN0aW9uU3RhdGUoKSA9PSBzKQpAQCAtMTg5MCw2
ICsxODE3LDEyIEBAIHZvaWQgUmVuZGVyQmxvY2s6OnNldFNlbGVjdGlvblN0YXRlKFNlbGUKICAg
ICBlbHNlCiAgICAgICAgIFJlbmRlckJveDo6c2V0U2VsZWN0aW9uU3RhdGUocyk7CiAgICAgCisg
ICAgaWYgKGlzUmVwbGFjZWQoKSAmJiBtX2lubGluZUJveFdyYXBwZXIpIHsKKyAgICAgICAgUm9v
dElubGluZUJveCogbGluZSA9IG1faW5saW5lQm94V3JhcHBlci0+cm9vdCgpOworICAgICAgICBp
ZiAobGluZSkKKyAgICAgICAgICAgIGxpbmUtPnNldEhhc1NlbGVjdGVkQ2hpbGRyZW4ocyAhPSBT
ZWxlY3Rpb25Ob25lKTsKKyAgICB9CisKICAgICBSZW5kZXJCbG9jayogY2IgPSBjb250YWluaW5n
QmxvY2soKTsKICAgICBpZiAoY2IgJiYgIWNiLT5pc1JlbmRlclZpZXcoKSkKICAgICAgICAgY2It
PnNldFNlbGVjdGlvblN0YXRlKHMpOwpAQCAtMTkwOCw5ICsxODQxLDkgQEAgYm9vbCBSZW5kZXJC
bG9jazo6aXNTZWxlY3Rpb25Sb290KCkgY29ucwogICAgIC8vIEZJWE1FOiBFdmVudHVhbGx5IHRh
YmxlcyBzaG91bGQgaGF2ZSB0byBsZWFybiBob3cgdG8gZmlsbCBnYXBzIGJldHdlZW4gY2VsbHMs
IGF0IGxlYXN0IGluIHNpbXBsZSBub24tc3Bhbm5pbmcgY2FzZXMuCiAgICAgaWYgKGlzVGFibGUo
KSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAKKwogICAgIGlmIChpc0JvZHkoKSB8
fCBpc1Jvb3QoKSB8fCBoYXNPdmVyZmxvd0NsaXAoKSB8fCBpc1JlbFBvc2l0aW9uZWQoKSB8fAot
ICAgICAgICBpc0Zsb2F0aW5nT3JQb3NpdGlvbmVkKCkgfHwgaXNUYWJsZUNlbGwoKSB8fCBpc0lu
bGluZUJsb2NrT3JJbmxpbmVUYWJsZSgpIHx8IGhhc1RyYW5zZm9ybSgpIHx8CisgICAgICAgIGlz
RmxvYXRpbmdPclBvc2l0aW9uZWQoKSB8fCBpc1RhYmxlQ2VsbCgpIHx8IChpc0lubGluZUJsb2Nr
T3JJbmxpbmVUYWJsZSgpICYmICFpc0Fub255bW91c0lubGluZUJsb2NrKCkpIHx8IGhhc1RyYW5z
Zm9ybSgpIHx8CiAgICAgICAgIGhhc1JlZmxlY3Rpb24oKSB8fCBoYXNNYXNrKCkpCiAgICAgICAg
IHJldHVybiB0cnVlOwogICAgIApAQCAtMjA1NSwxOCArMTk4OCwzMCBAQCBHYXBSZWN0cyBSZW5k
ZXJCbG9jazo6ZmlsbElubGluZVNlbGVjdGlvCiAgICAgZm9yIChjdXJyID0gZmlyc3RSb290Qm94
KCk7IGN1cnIgJiYgIWN1cnItPmhhc1NlbGVjdGVkQ2hpbGRyZW4oKTsgY3VyciA9IGN1cnItPm5l
eHRSb290Qm94KCkpIHsgfQogCiAgICAgLy8gTm93IHBhaW50IHRoZSBnYXBzIGZvciB0aGUgbGlu
ZXMuCi0gICAgZm9yICg7IGN1cnIgJiYgY3Vyci0+aGFzU2VsZWN0ZWRDaGlsZHJlbigpOyBjdXJy
ID0gY3Vyci0+bmV4dFJvb3RCb3goKSkgeworICAgIGZvciAoOyBjdXJyICYmIChjdXJyLT5oYXNT
ZWxlY3RlZENoaWxkcmVuKCkgfHwgY3Vyci0+aGFzQW5vbnltb3VzSW5saW5lQmxvY2soKSk7IGN1
cnIgPSBjdXJyLT5uZXh0Um9vdEJveCgpKSB7CisgICAgICAgIGlmICghY3Vyci0+aGFzU2VsZWN0
ZWRDaGlsZHJlbigpKQorICAgICAgICAgICAgY29udGludWU7CisKICAgICAgICAgaW50IHNlbFRv
cCA9ICBjdXJyLT5zZWxlY3Rpb25Ub3AoKTsKICAgICAgICAgaW50IHNlbEhlaWdodCA9IGN1cnIt
PnNlbGVjdGlvbkhlaWdodCgpOwogCi0gICAgICAgIGlmICghY29udGFpbnNTdGFydCAmJiAhbGFz
dFNlbGVjdGVkTGluZSAmJgotICAgICAgICAgICAgc2VsZWN0aW9uU3RhdGUoKSAhPSBTZWxlY3Rp
b25TdGFydCAmJiBzZWxlY3Rpb25TdGF0ZSgpICE9IFNlbGVjdGlvbkJvdGgpCi0gICAgICAgICAg
ICByZXN1bHQudW5pdGVDZW50ZXIoZmlsbFZlcnRpY2FsU2VsZWN0aW9uR2FwKGxhc3RUb3AsIGxh
c3RMZWZ0LCBsYXN0UmlnaHQsIHR5ICsgc2VsVG9wLAotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290QmxvY2ssIGJsb2NrWCwgYmxvY2tZ
LCBwYWludEluZm8pKTsKLQotICAgICAgICBpZiAoIXBhaW50SW5mbyB8fCAodHkgKyBzZWxUb3Ag
PCBwYWludEluZm8tPnJlY3QuYm90dG9tKCkgJiYgdHkgKyBzZWxUb3AgKyBzZWxIZWlnaHQgPiBw
YWludEluZm8tPnJlY3QueSgpKSkKLSAgICAgICAgICAgIHJlc3VsdC51bml0ZShjdXJyLT5maWxs
TGluZVNlbGVjdGlvbkdhcChzZWxUb3AsIHNlbEhlaWdodCwgcm9vdEJsb2NrLCBibG9ja1gsIGJs
b2NrWSwgdHgsIHR5LCBwYWludEluZm8pKTsKKyAgICAgICAgaWYgKGN1cnItPmhhc0Fub255bW91
c0lubGluZUJsb2NrKCkpIHsKKyAgICAgICAgICAgIGlmIChsYXN0U2VsZWN0ZWRMaW5lKSB7Cisg
ICAgICAgICAgICAgICAgbGFzdFRvcCA9ICh0eSAtIGJsb2NrWSkgKyBsYXN0U2VsZWN0ZWRMaW5l
LT5zZWxlY3Rpb25Cb3R0b20oKTsKKyAgICAgICAgICAgICAgICBsYXN0TGVmdCA9IGxlZnRTZWxl
Y3Rpb25PZmZzZXQocm9vdEJsb2NrLCBsYXN0U2VsZWN0ZWRMaW5lLT5zZWxlY3Rpb25Cb3R0b20o
KSk7CisgICAgICAgICAgICAgICAgbGFzdFJpZ2h0ID0gcmlnaHRTZWxlY3Rpb25PZmZzZXQocm9v
dEJsb2NrLCBsYXN0U2VsZWN0ZWRMaW5lLT5zZWxlY3Rpb25Cb3R0b20oKSk7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBjb250YWluc1N0YXJ0ID0gZmFsc2U7CisgICAgICAgICAgICByZXN1
bHQudW5pdGUoY3Vyci0+YW5vbnltb3VzSW5saW5lQmxvY2soKS0+ZmlsbFNlbGVjdGlvbkdhcHMo
cm9vdEJsb2NrLCBibG9ja1gsIGJsb2NrWSwgdHggKyBjdXJyLT54KCksIHR5ICsgY3Vyci0+eSgp
LCBsYXN0VG9wLCBsYXN0TGVmdCwgbGFzdFJpZ2h0LCBwYWludEluZm8pKTsKKyAgICAgICAgfSBl
bHNlIHsKKyAgICAgICAgICAgIGlmICghY29udGFpbnNTdGFydCAmJiAoIWxhc3RTZWxlY3RlZExp
bmUgfHwgbGFzdFNlbGVjdGVkTGluZS0+YW5vbnltb3VzSW5saW5lQmxvY2soKSkpCisgICAgICAg
ICAgICAgICAgcmVzdWx0LnVuaXRlQ2VudGVyKGZpbGxWZXJ0aWNhbFNlbGVjdGlvbkdhcChsYXN0
VG9wLCBsYXN0TGVmdCwgbGFzdFJpZ2h0LCB0eSArIHNlbFRvcCwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RCbG9jaywgYmxv
Y2tYLCBibG9ja1ksIHBhaW50SW5mbykpOwogCisgICAgICAgICAgICBpZiAoIXBhaW50SW5mbyB8
fCAodHkgKyBzZWxUb3AgPCBwYWludEluZm8tPnJlY3QuYm90dG9tKCkgJiYgdHkgKyBzZWxUb3Ag
KyBzZWxIZWlnaHQgPiBwYWludEluZm8tPnJlY3QueSgpKSkKKyAgICAgICAgICAgICAgICByZXN1
bHQudW5pdGUoY3Vyci0+ZmlsbExpbmVTZWxlY3Rpb25HYXAoc2VsVG9wLCBzZWxIZWlnaHQsIHJv
b3RCbG9jaywgYmxvY2tYLCBibG9ja1ksIHR4LCB0eSwgcGFpbnRJbmZvKSk7CisgICAgICAgIH0K
KyAgICAgICAgCiAgICAgICAgIGxhc3RTZWxlY3RlZExpbmUgPSBjdXJyOwogICAgIH0KIApAQCAt
MjA3NCw4ICsyMDE5LDggQEAgR2FwUmVjdHMgUmVuZGVyQmxvY2s6OmZpbGxJbmxpbmVTZWxlY3Rp
bwogICAgICAgICAvLyBWaXNpYmxlU2VsZWN0aW9uIG11c3Qgc3RhcnQganVzdCBhZnRlciBvdXIg
bGFzdCBsaW5lLgogICAgICAgICBsYXN0U2VsZWN0ZWRMaW5lID0gbGFzdFJvb3RCb3goKTsKIAot
ICAgIGlmIChsYXN0U2VsZWN0ZWRMaW5lICYmIHNlbGVjdGlvblN0YXRlKCkgIT0gU2VsZWN0aW9u
RW5kICYmIHNlbGVjdGlvblN0YXRlKCkgIT0gU2VsZWN0aW9uQm90aCkgewotICAgICAgICAvLyBH
byBhaGVhZCBhbmQgdXBkYXRlIG91ciBsYXN0WSB0byBiZSB0aGUgYm90dG9tIG9mIHRoZSBsYXN0
IHNlbGVjdGVkIGxpbmUuCisgICAgaWYgKGxhc3RTZWxlY3RlZExpbmUgJiYgIWxhc3RTZWxlY3Rl
ZExpbmUtPmhhc0Fub255bW91c0lubGluZUJsb2NrKCkgJiYgc2VsZWN0aW9uU3RhdGUoKSAhPSBT
ZWxlY3Rpb25FbmQgJiYgc2VsZWN0aW9uU3RhdGUoKSAhPSBTZWxlY3Rpb25Cb3RoKSB7CisgICAg
ICAgIC8vIEdvIGFoZWFkIGFuZCB1cGRhdGUgb3VyIGxhc3RUb3AgdG8gYmUgdGhlIGJvdHRvbSBv
ZiB0aGUgbGFzdCBzZWxlY3RlZCBsaW5lLgogICAgICAgICBsYXN0VG9wID0gKHR5IC0gYmxvY2tZ
KSArIGxhc3RTZWxlY3RlZExpbmUtPnNlbGVjdGlvbkJvdHRvbSgpOwogICAgICAgICBsYXN0TGVm
dCA9IGxlZnRTZWxlY3Rpb25PZmZzZXQocm9vdEJsb2NrLCBsYXN0U2VsZWN0ZWRMaW5lLT5zZWxl
Y3Rpb25Cb3R0b20oKSk7CiAgICAgICAgIGxhc3RSaWdodCA9IHJpZ2h0U2VsZWN0aW9uT2Zmc2V0
KHJvb3RCbG9jaywgbGFzdFNlbGVjdGVkTGluZS0+c2VsZWN0aW9uQm90dG9tKCkpOwpAQCAtMjk4
NSwyNSArMjkzMCwzMSBAQCB2b2lkIFJlbmRlckJsb2NrOjpjbGVhckZsb2F0cygpCiAgICAgLy8g
b3V0IG9mIGZsb3cgKGxpa2UgZmxvYXRpbmcvcG9zaXRpb25lZCBlbGVtZW50cyksIGFuZCB3ZSBh
bHNvIHNraXAgb3ZlciBhbnkgb2JqZWN0cyB0aGF0IG1heSBoYXZlIHNoaWZ0ZWQKICAgICAvLyB0
byBhdm9pZCBmbG9hdHMuCiAgICAgYm9vbCBwYXJlbnRIYXNGbG9hdHMgPSBmYWxzZTsKLSAgICBS
ZW5kZXJPYmplY3QqIHByZXYgPSBwcmV2aW91c1NpYmxpbmcoKTsKLSAgICB3aGlsZSAocHJldiAm
JiAocHJldi0+aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpIHx8ICFwcmV2LT5pc0JveCgpIHx8ICFw
cmV2LT5pc1JlbmRlckJsb2NrKCkgfHwgdG9SZW5kZXJCbG9jayhwcmV2KS0+YXZvaWRzRmxvYXRz
KCkpKSB7Ci0gICAgICAgIGlmIChwcmV2LT5pc0Zsb2F0aW5nKCkpCi0gICAgICAgICAgICBwYXJl
bnRIYXNGbG9hdHMgPSB0cnVlOwotICAgICAgICAgcHJldiA9IHByZXYtPnByZXZpb3VzU2libGlu
ZygpOworICAgIFJlbmRlck9iamVjdCogcHJldiA9IDA7CisgICAgUmVuZGVyQmxvY2sqIHBhcmVu
dEJsb2NrID0gMDsKKyAgICBpZiAoaXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CisgICAgICAg
IHBhcmVudEJsb2NrID0gY29udGFpbmluZ0Jsb2NrKCk7CisgICAgICAgIHBhcmVudEhhc0Zsb2F0
cyA9IHBhcmVudEJsb2NrLT5jb250YWluc0Zsb2F0cygpOworICAgIH0gZWxzZSB7ICAgIAorICAg
ICAgICB3aGlsZSAocHJldiAmJiAocHJldi0+aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpIHx8ICFw
cmV2LT5pc0JveCgpIHx8ICFwcmV2LT5pc1JlbmRlckJsb2NrKCkgfHwgdG9SZW5kZXJCbG9jayhw
cmV2KS0+YXZvaWRzRmxvYXRzKCkpKSB7CisgICAgICAgICAgICBpZiAocHJldi0+aXNGbG9hdGlu
ZygpKQorICAgICAgICAgICAgICAgIHBhcmVudEhhc0Zsb2F0cyA9IHRydWU7CisgICAgICAgICAg
ICBwcmV2ID0gcHJldi0+cHJldmlvdXNTaWJsaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgCisg
ICAgICAgIHBhcmVudEJsb2NrID0gcGFyZW50KCktPmlzUmVuZGVyQmxvY2soKSA/IHRvUmVuZGVy
QmxvY2socGFyZW50KCkpIDogMDsKICAgICB9CiAKICAgICAvLyBGaXJzdCBhZGQgaW4gZmxvYXRz
IGZyb20gdGhlIHBhcmVudC4KICAgICBpbnQgb2Zmc2V0ID0geSgpOwotICAgIGlmIChwYXJlbnRI
YXNGbG9hdHMpIHsKLSAgICAgICAgUmVuZGVyQmxvY2sqIHBhcmVudEJsb2NrID0gdG9SZW5kZXJC
bG9jayhwYXJlbnQoKSk7CisgICAgaWYgKHBhcmVudEhhc0Zsb2F0cykKICAgICAgICAgYWRkSW50
cnVkaW5nRmxvYXRzKHBhcmVudEJsb2NrLCBwYXJlbnRCbG9jay0+Ym9yZGVyTGVmdCgpICsgcGFy
ZW50QmxvY2stPnBhZGRpbmdMZWZ0KCksIG9mZnNldCk7Ci0gICAgfQotICAgIAorCiAgICAgaW50
IHhvZmZzZXQgPSAwOwogICAgIGlmIChwcmV2KQogICAgICAgICBvZmZzZXQgLT0gdG9SZW5kZXJC
b3gocHJldiktPnkoKTsKLSAgICBlbHNlIGlmIChwYXJlbnQoKS0+aXNCb3goKSkgewotICAgICAg
ICBwcmV2ID0gcGFyZW50KCk7CisgICAgZWxzZSBpZiAocGFyZW50QmxvY2spIHsKKyAgICAgICAg
cHJldiA9IHBhcmVudEJsb2NrOwogICAgICAgICB4b2Zmc2V0ICs9IHRvUmVuZGVyQm94KHByZXYp
LT5ib3JkZXJMZWZ0KCkgKyB0b1JlbmRlckJveChwcmV2KS0+cGFkZGluZ0xlZnQoKTsKICAgICB9
CiAKQEAgLTMxMzgsNyArMzA4OSw3IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmFkZEludHJ1ZGluZ0Zs
b2F0cyhSZW4KICAgICAgICAgICAgICAgICAvLyBhYm92ZS4gIHx4b2ZmfCB3aWxsIGVxdWFsIC1m
bG93LT5tYXJnaW5MZWZ0KCkgaW4gdGhpcyBjYXNlLCBzbyBpdCdzIGFscmVhZHkgYmVlbiB0YWtl
bgogICAgICAgICAgICAgICAgIC8vIGludG8gYWNjb3VudC4gIE9ubHkgYXBwbHkgdGhpcyBjb2Rl
IGlmIHxjaGlsZHwgaXMgZmFsc2UsIHNpbmNlIG90aGVyd2lzZSB0aGUgbGVmdCBtYXJnaW4KICAg
ICAgICAgICAgICAgICAvLyB3aWxsIGdldCBhcHBsaWVkIHR3aWNlLgotICAgICAgICAgICAgICAg
IGlmIChwcmV2ICE9IHBhcmVudCgpKQorICAgICAgICAgICAgICAgIGlmIChwcmV2ICE9IGNvbnRh
aW5pbmdCbG9jaygpKQogICAgICAgICAgICAgICAgICAgICBmbG9hdGluZ09iai0+bV9sZWZ0ICs9
IHByZXYtPm1hcmdpbkxlZnQoKTsKICAgICAgICAgICAgICAgICBmbG9hdGluZ09iai0+bV9sZWZ0
IC09IG1hcmdpbkxlZnQoKTsKICAgICAgICAgICAgICAgICBmbG9hdGluZ09iai0+bV9zaG91bGRQ
YWludCA9IGZhbHNlOyAgLy8gV2UgYXJlIG5vdCBpbiB0aGUgZGlyZWN0IGluaGVyaXRhbmNlIGNo
YWluIGZvciB0aGlzIGZsb2F0LiBXZSB3aWxsIG5ldmVyIHBhaW50IGl0LgpAQCAtMzE4Myw3ICsz
MTM0LDEzIEBAIHZvaWQgUmVuZGVyQmxvY2s6Om1hcmtBbGxEZXNjZW5kYW50c1dpdGgKICAgICAg
ICAgcmVtb3ZlRmxvYXRpbmdPYmplY3QoZmxvYXRUb1JlbW92ZSk7CiAKICAgICAvLyBJdGVyYXRl
IG92ZXIgb3VyIGNoaWxkcmVuIGFuZCBtYXJrIHRoZW0gYXMgbmVlZGVkLgotICAgIGlmICghY2hp
bGRyZW5JbmxpbmUoKSkgeworICAgIGlmIChjaGlsZHJlbklubGluZSgpKSB7CisgICAgICAgIGZv
ciAoUm9vdElubGluZUJveCogYm94ID0gZmlyc3RSb290Qm94KCk7IGJveDsgYm94ID0gYm94LT5u
ZXh0Um9vdEJveCgpKSB7CisgICAgICAgICAgICBSZW5kZXJCbG9jayogY2hpbGRCbG9jayA9IGJv
eC0+YW5vbnltb3VzSW5saW5lQmxvY2soKTsKKyAgICAgICAgICAgIGlmIChjaGlsZEJsb2NrICYm
IChmbG9hdFRvUmVtb3ZlID8gY2hpbGRCbG9jay0+Y29udGFpbnNGbG9hdChmbG9hdFRvUmVtb3Zl
KSA6IGNoaWxkQmxvY2stPmNvbnRhaW5zRmxvYXRzKCkpKQorICAgICAgICAgICAgICAgIGNoaWxk
QmxvY2stPm1hcmtBbGxEZXNjZW5kYW50c1dpdGhGbG9hdHNGb3JMYXlvdXQoZmxvYXRUb1JlbW92
ZSwgaW5MYXlvdXQpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKICAgICAgICAgZm9yIChSZW5k
ZXJPYmplY3QqIGNoaWxkID0gZmlyc3RDaGlsZCgpOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4
dFNpYmxpbmcoKSkgewogICAgICAgICAgICAgaWYgKCghZmxvYXRUb1JlbW92ZSAmJiBjaGlsZC0+
aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpKSB8fCAhY2hpbGQtPmlzUmVuZGVyQmxvY2soKSkKICAg
ICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTM0NTEsNiArMzQwOCwxMSBAQCBzdGF0aWMgVmlz
aWJsZVBvc2l0aW9uIHBvc2l0aW9uRm9yUG9pbnRSCiAgICAgcmV0dXJuIGFuY2VzdG9yLT5jcmVh
dGVWaXNpYmxlUG9zaXRpb24oY2hpbGROb2RlLT5ub2RlSW5kZXgoKSArIDEsIFVQU1RSRUFNKTsK
IH0KIAorc3RhdGljIGlubGluZSBib29sIGlzQ2hpbGRIaXRUZXN0Q2FuZGlkYXRlKFJlbmRlckJv
eCogYm94KQoreworICAgIHJldHVybiBib3gtPmhlaWdodCgpICYmIGJveC0+c3R5bGUoKS0+dmlz
aWJpbGl0eSgpID09IFZJU0lCTEUgJiYgIWJveC0+aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpOwor
fQorCiBWaXNpYmxlUG9zaXRpb24gUmVuZGVyQmxvY2s6OnBvc2l0aW9uRm9yUG9pbnRXaXRoSW5s
aW5lQ2hpbGRyZW4oY29uc3QgSW50UG9pbnQmIHBvaW50SW5Db250ZW50cykKIHsKICAgICBBU1NF
UlQoY2hpbGRyZW5JbmxpbmUoKSk7CkBAIC0zNDYzLDggKzM0MjUsMTggQEAgVmlzaWJsZVBvc2l0
aW9uIFJlbmRlckJsb2NrOjpwb3NpdGlvbkZvcgogICAgIFJvb3RJbmxpbmVCb3gqIGZpcnN0Um9v
dEJveFdpdGhDaGlsZHJlbiA9IDA7CiAgICAgUm9vdElubGluZUJveCogbGFzdFJvb3RCb3hXaXRo
Q2hpbGRyZW4gPSAwOwogICAgIGZvciAoUm9vdElubGluZUJveCogcm9vdCA9IGZpcnN0Um9vdEJv
eCgpOyByb290OyByb290ID0gcm9vdC0+bmV4dFJvb3RCb3goKSkgeworICAgICAgICBSZW5kZXJC
bG9jayogY2hpbGRCbG9jayA9IHJvb3QtPmFub255bW91c0lubGluZUJsb2NrKCk7CisgICAgICAg
IGlmIChjaGlsZEJsb2NrKSB7CisgICAgICAgICAgICBmaXJzdFJvb3RCb3hXaXRoQ2hpbGRyZW4g
PSAwOworICAgICAgICAgICAgbGFzdFJvb3RCb3hXaXRoQ2hpbGRyZW4gPSAwOworICAgICAgICAg
ICAgaWYgKGlzQ2hpbGRIaXRUZXN0Q2FuZGlkYXRlKGNoaWxkQmxvY2spICYmIHBvaW50SW5Db250
ZW50cy55KCkgPCBjaGlsZEJsb2NrLT5mcmFtZVJlY3QoKS5ib3R0b20oKSkKKyAgICAgICAgICAg
ICAgICByZXR1cm4gcG9zaXRpb25Gb3JQb2ludFJlc3BlY3RpbmdFZGl0aW5nQm91bmRhcmllcyh0
aGlzLCBjaGlsZEJsb2NrLCBwb2ludEluQ29udGVudHMpOworICAgICAgICAgICAgY29udGludWU7
CisgICAgICAgIH0KKwogICAgICAgICBpZiAoIXJvb3QtPmZpcnN0TGVhZkNoaWxkKCkpCiAgICAg
ICAgICAgICBjb250aW51ZTsKKyAgICAgICAgCiAgICAgICAgIGlmICghZmlyc3RSb290Qm94V2l0
aENoaWxkcmVuKQogICAgICAgICAgICAgZmlyc3RSb290Qm94V2l0aENoaWxkcmVuID0gcm9vdDsK
ICAgICAgICAgbGFzdFJvb3RCb3hXaXRoQ2hpbGRyZW4gPSByb290OwpAQCAtMzQ3Miw3ICszNDQ0
LDcgQEAgVmlzaWJsZVBvc2l0aW9uIFJlbmRlckJsb2NrOjpwb3NpdGlvbkZvcgogICAgICAgICAv
LyBzZXQgdGhlIGJvdHRvbSBiYXNlZCBvbiB3aGV0aGVyIHRoZXJlIGlzIGEgbmV4dCByb290IGJv
eAogICAgICAgICAvLyBGSVhNRTogVGhpcyB3aWxsIGNvbnNpZGVyIG5leHRSb290Qm94IGV2ZW4g
aWYgaXQgaGFzIG5vIGNoaWxkcmVuLCBhbmQgbWF5YmUgaXQgc2hvdWxkbid0LgogICAgICAgICBp
bnQgYm90dG9tOwotICAgICAgICBpZiAocm9vdC0+bmV4dFJvb3RCb3goKSkgeworICAgICAgICBp
ZiAocm9vdC0+bmV4dFJvb3RCb3goKSAmJiAhcm9vdC0+bmV4dFJvb3RCb3goKS0+aGFzQW5vbnlt
b3VzSW5saW5lQmxvY2soKSkgewogICAgICAgICAgICAgLy8gRklYTUU6IFdlIHdvdWxkIHByZWZl
ciB0byBtYWtlIHRoZSBicmVhayBwb2ludCBoYWxmd2F5IGJldHdlZW4gdGhlIGJvdHRvbQogICAg
ICAgICAgICAgLy8gb2YgdGhlIHByZXZpb3VzIHJvb3QgYm94IGFuZCB0aGUgdG9wIG9mIHRoZSBu
ZXh0IHJvb3QgYm94LgogICAgICAgICAgICAgYm90dG9tID0gcm9vdC0+bmV4dFJvb3RCb3goKS0+
bGluZVRvcCgpOwpAQCAtMzUxNywxNyArMzQ4OSwxMiBAQCBWaXNpYmxlUG9zaXRpb24gUmVuZGVy
QmxvY2s6OnBvc2l0aW9uRm9yCiAgICAgcmV0dXJuIGNyZWF0ZVZpc2libGVQb3NpdGlvbigwLCBE
T1dOU1RSRUFNKTsKIH0KIAotc3RhdGljIGlubGluZSBib29sIGlzQ2hpbGRIaXRUZXN0Q2FuZGlk
YXRlKFJlbmRlckJveCogYm94KQotewotICAgIHJldHVybiBib3gtPmhlaWdodCgpICYmIGJveC0+
c3R5bGUoKS0+dmlzaWJpbGl0eSgpID09IFZJU0lCTEUgJiYgIWJveC0+aXNGbG9hdGluZ09yUG9z
aXRpb25lZCgpOwotfQotCiBWaXNpYmxlUG9zaXRpb24gUmVuZGVyQmxvY2s6OnBvc2l0aW9uRm9y
UG9pbnQoY29uc3QgSW50UG9pbnQmIHBvaW50KQogewogICAgIGlmIChpc1RhYmxlKCkpCiAgICAg
ICAgIHJldHVybiBSZW5kZXJCb3g6OnBvc2l0aW9uRm9yUG9pbnQocG9pbnQpOwogCi0gICAgaWYg
KGlzUmVwbGFjZWQoKSkgeworICAgIGlmIChpc1JlcGxhY2VkKCkgJiYgIWlzQW5vbnltb3VzSW5s
aW5lQmxvY2soKSkgewogICAgICAgICBpZiAocG9pbnQueSgpIDwgMCB8fCAocG9pbnQueSgpIDwg
aGVpZ2h0KCkgJiYgcG9pbnQueCgpIDwgMCkpCiAgICAgICAgICAgICByZXR1cm4gY3JlYXRlVmlz
aWJsZVBvc2l0aW9uKGNhcmV0TWluT2Zmc2V0KCksIERPV05TVFJFQU0pOwogICAgICAgICBpZiAo
cG9pbnQueSgpID49IGhlaWdodCgpIHx8IChwb2ludC55KCkgPj0gMCAmJiBwb2ludC54KCkgPj0g
d2lkdGgoKSkpCkBAIC00MTQyLDE0ICs0MTA5LDE1IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmNhbGNJ
bmxpbmVQcmVmV2lkdGhzKCkKICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAg
ICAgICAgY2xlYXJQcmV2aW91c0Zsb2F0ID0gZmFsc2U7CiAKLSAgICAgICAgICAgICAgICBib29s
IGNhbkJyZWFrUmVwbGFjZWRFbGVtZW50ID0gIWNoaWxkLT5pc0ltYWdlKCkgfHwgYWxsb3dJbWFn
ZXNUb0JyZWFrOworICAgICAgICAgICAgICAgIGJvb2wgY2FuQnJlYWtSZXBsYWNlZEVsZW1lbnQg
PSAhY2hpbGQtPmlzSW1hZ2UoKSB8fCBhbGxvd0ltYWdlc1RvQnJlYWsgfHwgY2hpbGQtPmlzQW5v
bnltb3VzSW5saW5lQmxvY2soKTsKICAgICAgICAgICAgICAgICBpZiAoKGNhbkJyZWFrUmVwbGFj
ZWRFbGVtZW50ICYmIChhdXRvV3JhcCB8fCBvbGRBdXRvV3JhcCkpIHx8IGNsZWFyUHJldmlvdXNG
bG9hdCkgewogICAgICAgICAgICAgICAgICAgICBtX21pblByZWZXaWR0aCA9IG1heChpbmxpbmVN
aW4sIG1fbWluUHJlZldpZHRoKTsKICAgICAgICAgICAgICAgICAgICAgaW5saW5lTWluID0gMDsK
ICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAvLyBJZiB3ZSdyZSBzdXBwb3Nl
ZCB0byBjbGVhciB0aGUgcHJldmlvdXMgZmxvYXQsIHRoZW4gdGVybWluYXRlIG1heHdpZHRoIGFz
IHdlbGwuCi0gICAgICAgICAgICAgICAgaWYgKGNsZWFyUHJldmlvdXNGbG9hdCkgeworICAgICAg
ICAgICAgICAgIC8vIEFsc28gZG8gdGhpcyBmb3IgYW5vbnltb3VzIGlubGluZSBibG9ja3MuCisg
ICAgICAgICAgICAgICAgaWYgKGNsZWFyUHJldmlvdXNGbG9hdCB8fCBjaGlsZC0+aXNBbm9ueW1v
dXNJbmxpbmVCbG9jaygpKSB7CiAgICAgICAgICAgICAgICAgICAgIG1fbWF4UHJlZldpZHRoID0g
bWF4KGlubGluZU1heCwgbV9tYXhQcmVmV2lkdGgpOwogICAgICAgICAgICAgICAgICAgICBpbmxp
bmVNYXggPSAwOwogICAgICAgICAgICAgICAgIH0KQEAgLTQxNTgsMTUgKzQxMjYsMTcgQEAgdm9p
ZCBSZW5kZXJCbG9jazo6Y2FsY0lubGluZVByZWZXaWR0aHMoKQogICAgICAgICAgICAgICAgIGlu
dCB0aSA9IDA7CiAgICAgICAgICAgICAgICAgaWYgKCFhZGRlZFRleHRJbmRlbnQpIHsKICAgICAg
ICAgICAgICAgICAgICAgYWRkZWRUZXh0SW5kZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAg
ICAgdGkgPSBzdHlsZSgpLT50ZXh0SW5kZW50KCkuY2FsY01pblZhbHVlKGN3KTsKLSAgICAgICAg
ICAgICAgICAgICAgY2hpbGRNaW4rPXRpOwotICAgICAgICAgICAgICAgICAgICBjaGlsZE1heCs9
dGk7CisgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGQtPmlzQW5vbnltb3VzSW5saW5lQmxv
Y2soKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGkgPSBzdHlsZSgpLT50ZXh0SW5kZW50
KCkuY2FsY01pblZhbHVlKGN3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkTWluICs9
IHRpOworICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRNYXggKz0gdGk7CisgICAgICAgICAg
ICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAvLyBBZGQg
b3VyIHdpZHRoIHRvIHRoZSBtYXguCiAgICAgICAgICAgICAgICAgaW5saW5lTWF4ICs9IGNoaWxk
TWF4OwogCi0gICAgICAgICAgICAgICAgaWYgKCFhdXRvV3JhcCB8fCAhY2FuQnJlYWtSZXBsYWNl
ZEVsZW1lbnQpIHsKKyAgICAgICAgICAgICAgICBpZiAoKCFhdXRvV3JhcCB8fCAhY2FuQnJlYWtS
ZXBsYWNlZEVsZW1lbnQpICYmICFjaGlsZC0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CiAg
ICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC0+aXNGbG9hdGluZygpKQogICAgICAgICAgICAg
ICAgICAgICAgICAgbV9taW5QcmVmV2lkdGggPSBtYXgoY2hpbGRNaW4sIG1fbWluUHJlZldpZHRo
KTsKICAgICAgICAgICAgICAgICAgICAgZWxzZQpAQCAtNDE3Nyw2ICs0MTQ3LDEyIEBAIHZvaWQg
UmVuZGVyQmxvY2s6OmNhbGNJbmxpbmVQcmVmV2lkdGhzKCkKIAogICAgICAgICAgICAgICAgICAg
ICAvLyBOb3cgc3RhcnQgYSBuZXcgbGluZS4KICAgICAgICAgICAgICAgICAgICAgaW5saW5lTWlu
ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGlmIChjaGls
ZC0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAv
LyBUZXJtaW5hdGUgbWF4IHdpZHRoIGFzIHdlbGwuCisgICAgICAgICAgICAgICAgICAgICAgICBt
X21heFByZWZXaWR0aCA9IG1heChjaGlsZE1heCwgbV9tYXhQcmVmV2lkdGgpOworICAgICAgICAg
ICAgICAgICAgICAgICAgaW5saW5lTWF4ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQogICAg
ICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBubyBsb25nZXIgc3Ry
aXBwaW5nIHdoaXRlc3BhY2UgYXQgdGhlIHN0YXJ0IG9mCkBAIC00NDE3LDkgKzQzOTMsMTIgQEAg
aW50IFJlbmRlckJsb2NrOjpsaW5lSGVpZ2h0KGJvb2wgZmlyc3RMaQogICAgIC8vIHRoZSBiYXNl
IGNsYXNzLiAgSWYgd2UncmUgYmVpbmcgcXVlcmllZCBhcyB0aG91Z2ggd2UncmUgdGhlIHJvb3Qg
bGluZQogICAgIC8vIGJveCwgdGhlbiB0aGUgZmFjdCB0aGF0IHdlJ3JlIGFuIGlubGluZS1ibG9j
ayBpcyBpcnJlbGV2YW50LCBhbmQgd2UgYmVoYXZlCiAgICAgLy8ganVzdCBsaWtlIGEgYmxvY2su
Ci0gICAgaWYgKGlzUmVwbGFjZWQoKSAmJiAhaXNSb290TGluZUJveCkKKyAgICBpZiAoaXNSZXBs
YWNlZCgpICYmICFpc1Jvb3RMaW5lQm94KSB7CisgICAgICAgIGlmIChpc0Fub255bW91c0lubGlu
ZUJsb2NrKCkpCisgICAgICAgICAgICByZXR1cm4gaGVpZ2h0KCk7CiAgICAgICAgIHJldHVybiBo
ZWlnaHQoKSArIG1hcmdpblRvcCgpICsgbWFyZ2luQm90dG9tKCk7Ci0gICAgCisgICAgfQorCiAg
ICAgaWYgKGZpcnN0TGluZSAmJiBkb2N1bWVudCgpLT51c2VzRmlyc3RMaW5lUnVsZXMoKSkgewog
ICAgICAgICBSZW5kZXJTdHlsZSogcyA9IHN0eWxlKGZpcnN0TGluZSk7CiAgICAgICAgIGlmIChz
ICE9IHN0eWxlKCkpCkBAIC00NDUxLDYgKzQ0MzAsOCBAQCBpbnQgUmVuZGVyQmxvY2s6OmJhc2Vs
aW5lUG9zaXRpb24oYm9vbCBiCiAgICAgICAgIC8vIFdlIGFsc28gZ2l2ZSB1cCBvbiBmaW5kaW5n
IGEgYmFzZWxpbmUgaWYgd2UgaGF2ZSBhIHZlcnRpY2FsIHNjcm9sbGJhciwgb3IgaWYgd2UgYXJl
IHNjcm9sbGVkCiAgICAgICAgIC8vIHZlcnRpY2FsbHkgKGUuZy4sIGFuIG92ZXJmbG93OmhpZGRl
biBibG9jayB0aGF0IGhhcyBoYWQgc2Nyb2xsVG9wIG1vdmVkKSBvciBpZiB0aGUgYmFzZWxpbmUg
aXMgb3V0c2lkZQogICAgICAgICAvLyBvZiBvdXIgY29udGVudCBib3guCisgICAgICAgIGlmIChp
c0Fub255bW91c0lubGluZUJsb2NrKCkpCisgICAgICAgICAgICByZXR1cm4gaGVpZ2h0KCk7CiAg
ICAgICAgIGludCBiYXNlbGluZVBvcyA9IChsYXllcigpICYmIChsYXllcigpLT5tYXJxdWVlKCkg
fHwgbGF5ZXIoKS0+dmVydGljYWxTY3JvbGxiYXIoKSB8fCBsYXllcigpLT5zY3JvbGxZT2Zmc2V0
KCkgIT0gMCkpID8gLTEgOiBsYXN0TGluZUJveEJhc2VsaW5lKCk7CiAgICAgICAgIGlmIChiYXNl
bGluZVBvcyAhPSAtMSAmJiBiYXNlbGluZVBvcyA8PSBib3JkZXJUb3AoKSArIHBhZGRpbmdUb3Ao
KSArIGNvbnRlbnRIZWlnaHQoKSkKICAgICAgICAgICAgIHJldHVybiBtYXJnaW5Ub3AoKSArIGJh
c2VsaW5lUG9zOwpAQCAtNDg3NSw2MCArNDg1Niw2IEBAIHZvaWQgUmVuZGVyQmxvY2s6OnNldE1h
eEJvdHRvbU1hcmdpbnMoaW4KICAgICBtX21heE1hcmdpbi0+bV9ib3R0b21OZWcgPSBuZWc7CiB9
CiAKLXZvaWQgUmVuZGVyQmxvY2s6OmFic29sdXRlUmVjdHMoVmVjdG9yPEludFJlY3Q+JiByZWN0
cywgaW50IHR4LCBpbnQgdHkpCi17Ci0gICAgLy8gRm9yIGJsb2NrcyBpbnNpZGUgaW5saW5lcywg
d2UgZ28gYWhlYWQgYW5kIGluY2x1ZGUgbWFyZ2lucyBzbyB0aGF0IHdlIHJ1biByaWdodCB1cCB0
byB0aGUKLSAgICAvLyBpbmxpbmUgYm94ZXMgYWJvdmUgYW5kIGJlbG93IHVzICh0aHVzIGdldHRp
bmcgbWVyZ2VkIHdpdGggdGhlbSB0byBmb3JtIGEgc2luZ2xlIGlycmVndWxhcgotICAgIC8vIHNo
YXBlKS4KLSAgICBpZiAoaW5saW5lQ29udGludWF0aW9uKCkpIHsKLSAgICAgICAgcmVjdHMuYXBw
ZW5kKEludFJlY3QodHgsIHR5IC0gY29sbGFwc2VkTWFyZ2luVG9wKCksCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHdpZHRoKCksIGhlaWdodCgpICsgY29sbGFwc2VkTWFyZ2luVG9wKCkg
KyBjb2xsYXBzZWRNYXJnaW5Cb3R0b20oKSkpOwotICAgICAgICBpbmxpbmVDb250aW51YXRpb24o
KS0+YWJzb2x1dGVSZWN0cyhyZWN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgdHggLSB4KCkgKyBpbmxpbmVDb250aW51YXRpb24oKS0+Y29udGFpbmluZ0Js
b2NrKCktPngoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
dHkgLSB5KCkgKyBpbmxpbmVDb250aW51YXRpb24oKS0+Y29udGFpbmluZ0Jsb2NrKCktPnkoKSk7
Ci0gICAgfSBlbHNlCi0gICAgICAgIHJlY3RzLmFwcGVuZChJbnRSZWN0KHR4LCB0eSwgd2lkdGgo
KSwgaGVpZ2h0KCkpKTsKLX0KLQotdm9pZCBSZW5kZXJCbG9jazo6YWJzb2x1dGVRdWFkcyhWZWN0
b3I8RmxvYXRRdWFkPiYgcXVhZHMpCi17Ci0gICAgLy8gRm9yIGJsb2NrcyBpbnNpZGUgaW5saW5l
cywgd2UgZ28gYWhlYWQgYW5kIGluY2x1ZGUgbWFyZ2lucyBzbyB0aGF0IHdlIHJ1biByaWdodCB1
cCB0byB0aGUKLSAgICAvLyBpbmxpbmUgYm94ZXMgYWJvdmUgYW5kIGJlbG93IHVzICh0aHVzIGdl
dHRpbmcgbWVyZ2VkIHdpdGggdGhlbSB0byBmb3JtIGEgc2luZ2xlIGlycmVndWxhcgotICAgIC8v
IHNoYXBlKS4KLSAgICBpZiAoaW5saW5lQ29udGludWF0aW9uKCkpIHsKLSAgICAgICAgRmxvYXRS
ZWN0IGxvY2FsUmVjdCgwLCAtY29sbGFwc2VkTWFyZ2luVG9wKCksCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgd2lkdGgoKSwgaGVpZ2h0KCkgKyBjb2xsYXBzZWRNYXJnaW5Ub3AoKSArIGNv
bGxhcHNlZE1hcmdpbkJvdHRvbSgpKTsKLSAgICAgICAgcXVhZHMuYXBwZW5kKGxvY2FsVG9BYnNv
bHV0ZVF1YWQobG9jYWxSZWN0KSk7Ci0gICAgICAgIGlubGluZUNvbnRpbnVhdGlvbigpLT5hYnNv
bHV0ZVF1YWRzKHF1YWRzKTsKLSAgICB9IGVsc2UKLSAgICAgICAgcXVhZHMuYXBwZW5kKFJlbmRl
ckJveDo6bG9jYWxUb0Fic29sdXRlUXVhZChGbG9hdFJlY3QoMCwgMCwgd2lkdGgoKSwgaGVpZ2h0
KCkpKSk7Ci19Ci0KLUludFJlY3QgUmVuZGVyQmxvY2s6OnJlY3RXaXRoT3V0bGluZUZvclJlcGFp
bnQoUmVuZGVyQm94TW9kZWxPYmplY3QqIHJlcGFpbnRDb250YWluZXIsIGludCBvdXRsaW5lV2lk
dGgpCi17Ci0gICAgSW50UmVjdCByKFJlbmRlckJveDo6cmVjdFdpdGhPdXRsaW5lRm9yUmVwYWlu
dChyZXBhaW50Q29udGFpbmVyLCBvdXRsaW5lV2lkdGgpKTsKLSAgICBpZiAoaW5saW5lQ29udGlu
dWF0aW9uKCkpCi0gICAgICAgIHIuaW5mbGF0ZVkoY29sbGFwc2VkTWFyZ2luVG9wKCkpOwotICAg
IHJldHVybiByOwotfQotCi1SZW5kZXJPYmplY3QqIFJlbmRlckJsb2NrOjpob3ZlckFuY2VzdG9y
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gaW5saW5lQ29udGludWF0aW9uKCkgPyBpbmxpbmVDb250
aW51YXRpb24oKSA6IFJlbmRlckJveDo6aG92ZXJBbmNlc3RvcigpOwotfQotCi12b2lkIFJlbmRl
ckJsb2NrOjp1cGRhdGVEcmFnU3RhdGUoYm9vbCBkcmFnT24pCi17Ci0gICAgUmVuZGVyQm94Ojp1
cGRhdGVEcmFnU3RhdGUoZHJhZ09uKTsKLSAgICBpZiAoaW5saW5lQ29udGludWF0aW9uKCkpCi0g
ICAgICAgIGlubGluZUNvbnRpbnVhdGlvbigpLT51cGRhdGVEcmFnU3RhdGUoZHJhZ09uKTsKLX0K
LQotUmVuZGVyU3R5bGUqIFJlbmRlckJsb2NrOjpvdXRsaW5lU3R5bGVGb3JSZXBhaW50KCkgY29u
c3QKLXsKLSAgICByZXR1cm4gaW5saW5lQ29udGludWF0aW9uKCkgPyBpbmxpbmVDb250aW51YXRp
b24oKS0+c3R5bGUoKSA6IHN0eWxlKCk7Ci19Ci0KIHZvaWQgUmVuZGVyQmxvY2s6OmNoaWxkQmVj
YW1lTm9uSW5saW5lKFJlbmRlck9iamVjdCopCiB7CiAgICAgbWFrZUNoaWxkcmVuTm9uSW5saW5l
KCk7CkBAIC00OTM3LDI2ICs0ODY0LDYgQEAgdm9pZCBSZW5kZXJCbG9jazo6Y2hpbGRCZWNhbWVO
b25JbmxpbmUoUgogICAgIC8vIHx0aGlzfCBtYXkgYmUgZGVhZCBoZXJlCiB9CiAKLXZvaWQgUmVu
ZGVyQmxvY2s6OnVwZGF0ZUhpdFRlc3RSZXN1bHQoSGl0VGVzdFJlc3VsdCYgcmVzdWx0LCBjb25z
dCBJbnRQb2ludCYgcG9pbnQpCi17Ci0gICAgaWYgKHJlc3VsdC5pbm5lck5vZGUoKSkKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgTm9kZSogbiA9IG5vZGUoKTsKLSAgICBpZiAoaW5saW5lQ29udGlu
dWF0aW9uKCkpCi0gICAgICAgIC8vIFdlIGFyZSBpbiB0aGUgbWFyZ2lucyBvZiBibG9jayBlbGVt
ZW50cyB0aGF0IGFyZSBwYXJ0IG9mIGEgY29udGludWF0aW9uLiAgSW4KLSAgICAgICAgLy8gdGhp
cyBjYXNlIHdlJ3JlIGFjdHVhbGx5IHN0aWxsIGluc2lkZSB0aGUgZW5jbG9zaW5nIGlubGluZSBl
bGVtZW50IHRoYXQgd2FzCi0gICAgICAgIC8vIHNwbGl0LiAgR28gYWhlYWQgYW5kIHNldCBvdXIg
aW5uZXIgbm9kZSBhY2NvcmRpbmdseS4KLSAgICAgICAgbiA9IGlubGluZUNvbnRpbnVhdGlvbigp
LT5ub2RlKCk7Ci0KLSAgICBpZiAobikgewotICAgICAgICByZXN1bHQuc2V0SW5uZXJOb2RlKG4p
OwotICAgICAgICBpZiAoIXJlc3VsdC5pbm5lck5vblNoYXJlZE5vZGUoKSkKLSAgICAgICAgICAg
IHJlc3VsdC5zZXRJbm5lck5vblNoYXJlZE5vZGUobik7Ci0gICAgICAgIHJlc3VsdC5zZXRMb2Nh
bFBvaW50KHBvaW50KTsKLSAgICB9Ci19Ci0KIEludFJlY3QgUmVuZGVyQmxvY2s6OmxvY2FsQ2Fy
ZXRSZWN0KElubGluZUJveCogaW5saW5lQm94LCBpbnQgY2FyZXRPZmZzZXQsIGludCogZXh0cmFX
aWR0aFRvRW5kT2ZMaW5lKQogewogICAgIC8vIERvIHRoZSBub3JtYWwgY2FsY3VsYXRpb24gaW4g
bW9zdCBjYXNlcy4KQEAgLTUwMzcsMjEgKzQ5NDQsMTcgQEAgSW50UmVjdCBSZW5kZXJCbG9jazo6
bG9jYWxDYXJldFJlY3QoSW5saQogCiB2b2lkIFJlbmRlckJsb2NrOjphZGRGb2N1c1JpbmdSZWN0
cyhWZWN0b3I8SW50UmVjdD4mIHJlY3RzLCBpbnQgdHgsIGludCB0eSkKIHsKLSAgICAvLyBGb3Ig
YmxvY2tzIGluc2lkZSBpbmxpbmVzLCB3ZSBnbyBhaGVhZCBhbmQgaW5jbHVkZSBtYXJnaW5zIHNv
IHRoYXQgd2UgcnVuIHJpZ2h0IHVwIHRvIHRoZQotICAgIC8vIGlubGluZSBib3hlcyBhYm92ZSBh
bmQgYmVsb3cgdXMgKHRodXMgZ2V0dGluZyBtZXJnZWQgd2l0aCB0aGVtIHRvIGZvcm0gYSBzaW5n
bGUgaXJyZWd1bGFyCi0gICAgLy8gc2hhcGUpLgotICAgIGlmIChpbmxpbmVDb250aW51YXRpb24o
KSkgewotICAgICAgICAvLyBGSVhNRTogVGhpcyBjaGVjayByZWFsbHkgaXNuJ3QgYWNjdXJhdGUu
IAotICAgICAgICBib29sIG5leHRJbmxpbmVIYXNMaW5lQm94ID0gaW5saW5lQ29udGludWF0aW9u
KCktPmZpcnN0TGluZUJveCgpOwotICAgICAgICAvLyBGSVhNRTogVGhpcyBpcyB3cm9uZy4gVGhl
IHByaW5jaXBhbCByZW5kZXJlciBtYXkgbm90IGJlIHRoZSBjb250aW51YXRpb24gcHJlY2VkaW5n
IHRoaXMgYmxvY2suCi0gICAgICAgIGJvb2wgcHJldklubGluZUhhc0xpbmVCb3ggPSB0b1JlbmRl
cklubGluZShpbmxpbmVDb250aW51YXRpb24oKS0+bm9kZSgpLT5yZW5kZXJlcigpKS0+Zmlyc3RM
aW5lQm94KCk7IAotICAgICAgICBpbnQgdG9wTWFyZ2luID0gcHJldklubGluZUhhc0xpbmVCb3gg
PyBjb2xsYXBzZWRNYXJnaW5Ub3AoKSA6IDA7Ci0gICAgICAgIGludCBib3R0b21NYXJnaW4gPSBu
ZXh0SW5saW5lSGFzTGluZUJveCA/IGNvbGxhcHNlZE1hcmdpbkJvdHRvbSgpIDogMDsKLSAgICAg
ICAgSW50UmVjdCByZWN0KHR4LCB0eSAtIHRvcE1hcmdpbiwgd2lkdGgoKSwgaGVpZ2h0KCkgKyB0
b3BNYXJnaW4gKyBib3R0b21NYXJnaW4pOwotICAgICAgICBpZiAoIXJlY3QuaXNFbXB0eSgpKQot
ICAgICAgICAgICAgcmVjdHMuYXBwZW5kKHJlY3QpOwotICAgIH0gZWxzZSBpZiAod2lkdGgoKSAm
JiBoZWlnaHQoKSkKLSAgICAgICAgcmVjdHMuYXBwZW5kKEludFJlY3QodHgsIHR5LCB3aWR0aCgp
LCBoZWlnaHQoKSkpOworICAgIGludCB0b3AgPSB0eTsKKyAgICBpbnQgYm90dG9tID0gdG9wICsg
aGVpZ2h0KCk7CisgICAgaWYgKGlzQW5vbnltb3VzSW5saW5lQmxvY2soKSAmJiBoZWlnaHQoKSkg
eworICAgICAgICBpZiAobV9pbmxpbmVCb3hXcmFwcGVyICYmIG1faW5saW5lQm94V3JhcHBlci0+
cm9vdCgpLT5wcmV2Um9vdEJveCgpKQorICAgICAgICAgICAgdG9wID0gbWluKHRvcCwgdG9wIC0g
Y29sbGFwc2VkTWFyZ2luVG9wKCkpOworICAgICAgICBpZiAobV9pbmxpbmVCb3hXcmFwcGVyICYm
IG1faW5saW5lQm94V3JhcHBlci0+cm9vdCgpLT5uZXh0Um9vdEJveCgpKQorICAgICAgICAgICAg
Ym90dG9tID0gbWF4KGJvdHRvbSwgYm90dG9tICsgY29sbGFwc2VkTWFyZ2luQm90dG9tKCkpOwor
ICAgIH0KKyAgICBJbnRSZWN0IHJlc3VsdCh0eCwgdG9wLCB3aWR0aCgpLCBib3R0b20gLSB0b3Ap
OworICAgIGlmICghcmVzdWx0LmlzRW1wdHkoKSkKKyAgICAgICAgcmVjdHMuYXBwZW5kKHJlc3Vs
dCk7CiAKICAgICBpZiAoIWhhc092ZXJmbG93Q2xpcCgpICYmICFoYXNDb250cm9sQ2xpcCgpKSB7
CiAgICAgICAgIGZvciAoUm9vdElubGluZUJveCogY3VyciA9IGZpcnN0Um9vdEJveCgpOyBjdXJy
OyBjdXJyID0gY3Vyci0+bmV4dFJvb3RCb3goKSkgewpAQCAtNTA3NSwxMSArNDk3OCw2IEBAIHZv
aWQgUmVuZGVyQmxvY2s6OmFkZEZvY3VzUmluZ1JlY3RzKFZlY3QKICAgICAgICAgICAgIH0KICAg
ICAgICAgfQogICAgIH0KLQotICAgIGlmIChpbmxpbmVDb250aW51YXRpb24oKSkKLSAgICAgICAg
aW5saW5lQ29udGludWF0aW9uKCktPmFkZEZvY3VzUmluZ1JlY3RzKHJlY3RzLCAKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4IC0geCgpICsgaW5saW5l
Q29udGludWF0aW9uKCktPmNvbnRhaW5pbmdCbG9jaygpLT54KCksCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eSAtIHkoKSArIGlubGluZUNvbnRpbnVh
dGlvbigpLT5jb250YWluaW5nQmxvY2soKS0+eSgpKTsKIH0KIAogUmVuZGVyQmxvY2sqIFJlbmRl
ckJsb2NrOjpjcmVhdGVBbm9ueW1vdXNCbG9jayhib29sIGlzRmxleGlibGVCb3gpIGNvbnN0CkBA
IC01MTExLDYgKzUwMDksOCBAQCBjb25zdCBjaGFyKiBSZW5kZXJCbG9jazo6cmVuZGVyTmFtZSgp
IGNvCiAgICAgICAgIHJldHVybiAiUmVuZGVyQmxvY2sgKHBvc2l0aW9uZWQpIjsKICAgICBpZiAo
aXNBbm9ueW1vdXNCbG9jaygpKQogICAgICAgICByZXR1cm4gIlJlbmRlckJsb2NrIChhbm9ueW1v
dXMpIjsKKyAgICBlbHNlIGlmIChpc0Fub255bW91c0lubGluZUJsb2NrKCkpCisgICAgICAgIHJl
dHVybiAiUmVuZGVyQmxvY2sgKGFub255bW91cyBpbmxpbmUtYmxvY2spIjsKICAgICBlbHNlIGlm
IChpc0Fub255bW91cygpKQogICAgICAgICByZXR1cm4gIlJlbmRlckJsb2NrIChnZW5lcmF0ZWQp
IjsKICAgICBpZiAoaXNSZWxQb3NpdGlvbmVkKCkpCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9S
ZW5kZXJCbG9jay5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2Nr
LmgJKHJldmlzaW9uIDU0NjY1KQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suaAko
d29ya2luZyBjb3B5KQpAQCAtNzksNyArNzksNyBAQCBwdWJsaWM6CiAgICAgc3RhdGljIHZvaWQg
cmVtb3ZlUGVyY2VudEhlaWdodERlc2NlbmRhbnQoUmVuZGVyQm94Kik7CiAgICAgSGFzaFNldDxS
ZW5kZXJCb3gqPiogcGVyY2VudEhlaWdodERlc2NlbmRhbnRzKCkgY29uc3Q7CiAKLSAgICBSb290
SW5saW5lQm94KiBjcmVhdGVBbmRBcHBlbmRSb290SW5saW5lQm94KCk7CisgICAgUm9vdElubGlu
ZUJveCogY3JlYXRlQW5kQXBwZW5kUm9vdElubGluZUJveChSZW5kZXJCbG9jayogYW5vbnltb3Vz
SW5saW5lQmxvY2spOwogCiAgICAgYm9vbCBnZW5lcmF0ZXNMaW5lQm94ZXNGb3JJbmxpbmVDaGls
ZChSZW5kZXJPYmplY3QqLCBib29sIGlzTGluZUVtcHR5ID0gdHJ1ZSwgYm9vbCBwcmV2aW91c0xp
bmVCcm9rZUNsZWFubHkgPSB0cnVlKTsKIApAQCAtMTI5LDE1ICsxMjksMTUgQEAgcHVibGljOgog
CiAgICAgdm9pZCBhZGp1c3RSZWN0Rm9yQ29sdW1ucyhJbnRSZWN0JikgY29uc3Q7CiAKLSAgICB2
b2lkIGFkZENvbnRpbnVhdGlvbldpdGhPdXRsaW5lKFJlbmRlcklubGluZSopOwotCi0gICAgUmVu
ZGVySW5saW5lKiBpbmxpbmVDb250aW51YXRpb24oKSBjb25zdCB7IHJldHVybiBtX2lubGluZUNv
bnRpbnVhdGlvbjsgfQotICAgIHZvaWQgc2V0SW5saW5lQ29udGludWF0aW9uKFJlbmRlcklubGlu
ZSogYykgeyBtX2lubGluZUNvbnRpbnVhdGlvbiA9IGM7IH0KLQogICAgIC8vIFRoaXMgZnVuY3Rp
b24gaXMgYSBjb252ZW5pZW5jZSBoZWxwZXIgZm9yIGNyZWF0aW5nIGFuIGFub255bW91cyBibG9j
ayB0aGF0IGluaGVyaXRzIGl0cwogICAgIC8vIHN0eWxlIGZyb20gdGhpcyBSZW5kZXJCbG9jay4K
ICAgICBSZW5kZXJCbG9jayogY3JlYXRlQW5vbnltb3VzQmxvY2soYm9vbCBpc0ZsZXhpYmxlQm94
ID0gZmFsc2UpIGNvbnN0OwogCisgICAgdmlydHVhbCB2b2lkIHBhaW50KFBhaW50SW5mbyYsIGlu
dCB0eCwgaW50IHR5KTsKKyAgICB2aXJ0dWFsIHZvaWQgcGFpbnRPYmplY3QoUGFpbnRJbmZvJiwg
aW50IHR4LCBpbnQgdHkpOworCisgICAgYm9vbCBpblJvb3RCbG9ja0NvbnRleHQoKSBjb25zdDsK
KwogICAgIHN0YXRpYyB2b2lkIGFwcGVuZFJ1bnNGb3JPYmplY3QoaW50IHN0YXJ0LCBpbnQgZW5k
LCBSZW5kZXJPYmplY3QqLCBJbmxpbmVCaWRpUmVzb2x2ZXImKTsgICAgCiAgICAgc3RhdGljIGJv
b2wgcmVxdWlyZXNMaW5lQm94KGNvbnN0IElubGluZUl0ZXJhdG9yJiwgYm9vbCBpc0xpbmVFbXB0
eSA9IHRydWUsIGJvb2wgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5ID0gdHJ1ZSk7CiAKQEAgLTE2
OCw5ICsxNjgsNiBAQCBwcm90ZWN0ZWQ6CiAKICAgICB2b2lkIGxheW91dFBvc2l0aW9uZWRPYmpl
Y3RzKGJvb2wgcmVsYXlvdXRDaGlsZHJlbik7CiAKLSAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoUGFp
bnRJbmZvJiwgaW50IHR4LCBpbnQgdHkpOwotICAgIHZpcnR1YWwgdm9pZCBwYWludE9iamVjdChQ
YWludEluZm8mLCBpbnQgdHgsIGludCB0eSk7Ci0KICAgICBpbnQgcmlnaHRSZWxPZmZzZXQoaW50
IHksIGludCBmaXhlZE9mZnNldCwgYm9vbCBhcHBseVRleHRJbmRlbnQgPSB0cnVlLCBpbnQqIGhl
aWdodFJlbWFpbmluZyA9IDApIGNvbnN0OwogICAgIGludCBsZWZ0UmVsT2Zmc2V0KGludCB5LCBp
bnQgZml4ZWRPZmZzZXQsIGJvb2wgYXBwbHlUZXh0SW5kZW50ID0gdHJ1ZSwgaW50KiBoZWlnaHRS
ZW1haW5pbmcgPSAwKSBjb25zdDsKIApAQCAtMTgzLDggKzE4MCw2IEBAIHByb3RlY3RlZDoKIAog
ICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVGaXJzdExldHRlcigpOwogCi0gICAgdmlydHVhbCB2b2lk
IHVwZGF0ZUhpdFRlc3RSZXN1bHQoSGl0VGVzdFJlc3VsdCYsIGNvbnN0IEludFBvaW50Jik7Ci0K
ICAgICAvLyBEZWxheSB1cGRhdGUgc2Nyb2xsYmFyIHVudGlsIGZpbmlzaERlbGF5UmVwYWludCgp
IHdpbGwgYmUKICAgICAvLyBjYWxsZWQuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB3aGVuIGEgZmxl
eGJveCBpcyBsYXlpbmcgb3V0IGl0cwogICAgIC8vIGRlc2NlbmRhbnQuIElmIG11bHRpcGxlIGNh
bGxzIGFyZSBtYWRlIHRvIHN0YXJ0RGVsYXlSZXBhaW50KCksCkBAIC0yNDgsNyArMjQzLDkgQEAg
cHJpdmF0ZToKICAgICAgICAgYm9vbCBldmVySGFkTGF5b3V0OwogICAgIH07CiAKLSAgICAvLyBU
aGUgZm9sbG93aW5nIGZ1bmN0aW9ucycgaW1wbGVtZW50YXRpb25zIGFyZSBpbiBSZW5kZXJCbG9j
a0xpbmVMYXlvdXQuY3BwLgorICAgIGNsYXNzIE1hcmdpbkluZm87CisKKyAgICAvLyBUaGUgZm9s
bG93aW5nIGZ1bmN0aW9ucycgaW1wbGVtZW50YXRpb25zIGFyZSBpbiBSZW5kZXJCbG9ja0xpbmVM
YXlvdXQuY3BwLiAgICAKICAgICB2b2lkIGJpZGlSZW9yZGVyTGluZShJbmxpbmVCaWRpUmVzb2x2
ZXImLCBjb25zdCBJbmxpbmVJdGVyYXRvciYgZW5kLCBib29sIHByZXZpb3VzTGluZUJyb2tlQ2xl
YW5seSk7CiAgICAgUm9vdElubGluZUJveCogZGV0ZXJtaW5lU3RhcnRQb3NpdGlvbihib29sJiBm
aXJzdExpbmUsIGJvb2wmIGZ1bGxMYXlvdXQsIGJvb2wmIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5s
eSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElubGluZUJpZGlS
ZXNvbHZlciYsIFZlY3RvcjxGbG9hdFdpdGhSZWN0PiYgZmxvYXRzLCB1bnNpZ25lZCYgbnVtQ2xl
YW5GbG9hdHMpOwpAQCAtMjYxLDkgKzI1OCw5IEBAIHByaXZhdGU6CiAgICAgdm9pZCBza2lwVHJh
aWxpbmdXaGl0ZXNwYWNlKElubGluZUl0ZXJhdG9yJiwgYm9vbCBpc0xpbmVFbXB0eSwgYm9vbCBw
cmV2aW91c0xpbmVCcm9rZUNsZWFubHkpOwogICAgIGludCBza2lwTGVhZGluZ1doaXRlc3BhY2Uo
SW5saW5lQmlkaVJlc29sdmVyJiwgYm9vbCBmaXJzdExpbmUsIGJvb2wgaXNMaW5lRW1wdHksIGJv
b2wgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KTsKICAgICB2b2lkIGZpdEJlbG93RmxvYXRzKGlu
dCB3aWR0aFRvRml0LCBib29sIGZpcnN0TGluZSwgaW50JiBhdmFpbGFibGVXaWR0aCk7Ci0gICAg
SW5saW5lSXRlcmF0b3IgZmluZE5leHRMaW5lQnJlYWsoSW5saW5lQmlkaVJlc29sdmVyJiwgYm9v
bCBmaXJzdExpbmUsIGJvb2wmIGlzTGluZUVtcHR5LCBib29sJiBwcmV2aW91c0xpbmVCcm9rZUNs
ZWFubHksIEVDbGVhciogY2xlYXIgPSAwKTsKKyAgICBJbmxpbmVJdGVyYXRvciBmaW5kTmV4dExp
bmVCcmVhayhJbmxpbmVCaWRpUmVzb2x2ZXImLCBib29sIGZpcnN0TGluZSwgYm9vbCYgaXNMaW5l
RW1wdHksIGJvb2wmIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSwgTWFyZ2luSW5mbyYsIEVDbGVh
ciogY2xlYXIgPSAwKTsKICAgICBSb290SW5saW5lQm94KiBjb25zdHJ1Y3RMaW5lKHVuc2lnbmVk
IHJ1bkNvdW50LCBCaWRpUnVuKiBmaXJzdFJ1biwgQmlkaVJ1biogbGFzdFJ1biwgYm9vbCBmaXJz
dExpbmUsIGJvb2wgbGFzdExpbmUsIFJlbmRlck9iamVjdCogZW5kT2JqZWN0KTsKLSAgICBJbmxp
bmVGbG93Qm94KiBjcmVhdGVMaW5lQm94ZXMoUmVuZGVyT2JqZWN0KiwgYm9vbCBmaXJzdExpbmUp
OworICAgIElubGluZUZsb3dCb3gqIGNyZWF0ZUxpbmVCb3hlcyhSZW5kZXJPYmplY3QqLCBib29s
IGZpcnN0TGluZSwgUmVuZGVyQmxvY2sqIGFub255bW91c0lubGluZUJsb2NrKTsKICAgICB2b2lk
IGNvbXB1dGVIb3Jpem9udGFsUG9zaXRpb25zRm9yTGluZShSb290SW5saW5lQm94KiwgYm9vbCBm
aXJzdExpbmUsIEJpZGlSdW4qIGZpcnN0UnVuLCBCaWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVuLCBi
b29sIHJlYWNoZWRFbmQpOwogICAgIHZvaWQgY29tcHV0ZVZlcnRpY2FsUG9zaXRpb25zRm9yTGlu
ZShSb290SW5saW5lQm94KiwgQmlkaVJ1biopOwogICAgIHZvaWQgZGVsZXRlRWxsaXBzaXNMaW5l
Qm94ZXMoKTsKQEAgLTMxNiwxMyArMzEzLDcgQEAgcHJpdmF0ZToKICAgICAvLyBPYnRhaW5zIHRo
ZSBuZWFyZXN0IGVuY2xvc2luZyBibG9jayAoaW5jbHVkaW5nIHRoaXMgYmxvY2spIHRoYXQgY29u
dHJpYnV0ZXMgYSBmaXJzdC1saW5lIHN0eWxlIHRvIG91ciBpbmxpbmUKICAgICAvLyBjaGlsZHJl
bi4KICAgICB2aXJ0dWFsIFJlbmRlckJsb2NrKiBmaXJzdExpbmVCbG9jaygpIGNvbnN0OwotICAg
IGJvb2wgaW5Sb290QmxvY2tDb250ZXh0KCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIEludFJlY3Qg
cmVjdFdpdGhPdXRsaW5lRm9yUmVwYWludChSZW5kZXJCb3hNb2RlbE9iamVjdCogcmVwYWludENv
bnRhaW5lciwgaW50IG91dGxpbmVXaWR0aCk7Ci0gICAgdmlydHVhbCBSZW5kZXJTdHlsZSogb3V0
bGluZVN0eWxlRm9yUmVwYWludCgpIGNvbnN0OwogICAgIAotICAgIHZpcnR1YWwgUmVuZGVyT2Jq
ZWN0KiBob3ZlckFuY2VzdG9yKCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZURyYWdT
dGF0ZShib29sIGRyYWdPbik7CiAgICAgdmlydHVhbCB2b2lkIGNoaWxkQmVjYW1lTm9uSW5saW5l
KFJlbmRlck9iamVjdCogY2hpbGQpOwogCiAgICAgdmlydHVhbCBJbnRSZWN0IHNlbGVjdGlvblJl
Y3RGb3JSZXBhaW50KFJlbmRlckJveE1vZGVsT2JqZWN0KiByZXBhaW50Q29udGFpbmVyLCBib29s
IC8qY2xpcFRvVmlzaWJsZUNvbnRlbnQqLykKQEAgLTM0MiwxNiArMzMzLDExIEBAIHByaXZhdGU6
CiAgICAgaW50IGxlZnRTZWxlY3Rpb25PZmZzZXQoUmVuZGVyQmxvY2sqIHJvb3RCbG9jaywgaW50
IHkpOwogICAgIGludCByaWdodFNlbGVjdGlvbk9mZnNldChSZW5kZXJCbG9jayogcm9vdEJsb2Nr
LCBpbnQgeSk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgYWJzb2x1dGVSZWN0cyhWZWN0b3I8SW50UmVj
dD4mLCBpbnQgdHgsIGludCB0eSk7Ci0gICAgdmlydHVhbCB2b2lkIGFic29sdXRlUXVhZHMoVmVj
dG9yPEZsb2F0UXVhZD4mKTsKLQogICAgIGludCBkZXNpcmVkQ29sdW1uV2lkdGgoKSBjb25zdDsK
ICAgICB1bnNpZ25lZCBkZXNpcmVkQ29sdW1uQ291bnQoKSBjb25zdDsKICAgICBWZWN0b3I8SW50
UmVjdD4qIGNvbHVtblJlY3RzKCkgY29uc3Q7CiAgICAgdm9pZCBzZXREZXNpcmVkQ29sdW1uQ291
bnRBbmRXaWR0aChpbnQgY291bnQsIGludCB3aWR0aCk7CiAgICAgaW50IGNvbHVtbkdhcCgpIGNv
bnN0OwotICAgIAotICAgIHZvaWQgcGFpbnRDb250aW51YXRpb25PdXRsaW5lcyhQYWludEluZm8m
LCBpbnQgdHgsIGludCB0eSk7CiAKICAgICB2aXJ0dWFsIEludFJlY3QgbG9jYWxDYXJldFJlY3Qo
SW5saW5lQm94KiwgaW50IGNhcmV0T2Zmc2V0LCBpbnQqIGV4dHJhV2lkdGhUb0VuZE9mTGluZSA9
IDApOwogCkBAIC00ODcsMTIgKzQ3Myw2IEBAIHByaXZhdGU6CiAgICAgRGVwcmVjYXRlZFB0ckxp
c3Q8RmxvYXRpbmdPYmplY3Q+KiBtX2Zsb2F0aW5nT2JqZWN0czsKICAgICBMaXN0SGFzaFNldDxS
ZW5kZXJCb3gqPiogbV9wb3NpdGlvbmVkT2JqZWN0czsKIAotICAgIC8vIEFuIGlubGluZSBjYW4g
YmUgc3BsaXQgd2l0aCBibG9ja3Mgb2NjdXJyaW5nIGluIGJldHdlZW4gdGhlIGlubGluZSBjb250
ZW50LgotICAgIC8vIFdoZW4gdGhpcyBvY2N1cnMgd2UgbmVlZCBhIHBvaW50ZXIgdG8gb3VyIG5l
eHQgb2JqZWN0LiAgV2UgY2FuIGJhc2ljYWxseSBiZQotICAgIC8vIHNwbGl0IGludG8gYSBzZXF1
ZW5jZSBvZiBpbmxpbmVzIGFuZCBibG9ja3MuICBUaGUgY29udGludWF0aW9uIHdpbGwgZWl0aGVy
IGJlCi0gICAgLy8gYW4gYW5vbnltb3VzIGJsb2NrICh0aGF0IGhvdXNlcyBvdGhlciBibG9ja3Mp
IG9yIGl0IHdpbGwgYmUgYW4gaW5saW5lIGZsb3cuCi0gICAgUmVuZGVySW5saW5lKiBtX2lubGlu
ZUNvbnRpbnVhdGlvbjsKLQogICAgIC8vIEFsbG9jYXRlZCBvbmx5IHdoZW4gc29tZSBvZiB0aGVz
ZSBmaWVsZHMgaGF2ZSBub24tZGVmYXVsdCB2YWx1ZXMKICAgICBzdHJ1Y3QgTWF4TWFyZ2luIDog
Tm9uY29weWFibGUgewogICAgICAgICBNYXhNYXJnaW4oY29uc3QgUmVuZGVyQmxvY2sqIG8pIApA
QCAtNTIwLDEwICs1MDAsMTIgQEAgcHJpdmF0ZToKICAgICBSZW5kZXJMaW5lQm94TGlzdCBtX2xp
bmVCb3hlczsgICAvLyBBbGwgb2YgdGhlIHJvb3QgbGluZSBib3hlcyBjcmVhdGVkIGZvciB0aGlz
IGJsb2NrIGZsb3cuICBGb3IgZXhhbXBsZSwgPGRpdj5IZWxsbzxicj53b3JsZC48L2Rpdj4gd2ls
bCBoYXZlIHR3byB0b3RhbCBsaW5lcyBmb3IgdGhlIDxkaXY+LgogCiAgICAgbXV0YWJsZSBpbnQg
bV9saW5lSGVpZ2h0OwotICAgIAorCiAgICAgLy8gUmVuZGVyUnVieUJhc2Ugb2JqZWN0cyBuZWVk
IHRvIGJlIGFibGUgdG8gc3BsaXQgYW5kIG1lcmdlLCBtb3ZpbmcgdGhlaXIgY2hpbGRyZW4gYXJv
dW5kCiAgICAgLy8gKGNhbGxpbmcgbW92ZUNoaWxkVG8sIG1vdmVBbGxDaGlsZHJlblRvLCBhbmQg
bWFrZUNoaWxkcmVuTm9uSW5saW5lKS4KICAgICBmcmllbmQgY2xhc3MgUmVuZGVyUnVieUJhc2U7
CisgICAgCisgICAgZnJpZW5kIGNsYXNzIElubGluZUJveDsKIH07CiAKIGlubGluZSBSZW5kZXJC
bG9jayogdG9SZW5kZXJCbG9jayhSZW5kZXJPYmplY3QqIG9iamVjdCkKSW5kZXg6IFdlYkNvcmUv
cmVuZGVyaW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcAkocmV2aXNpb24gNTQ2NjUpCisr
KyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0xNzEsMTAgKzE3MSwxMCBAQCB2b2lkIFJlbmRlckJsb2NrOjphcHBlbmRSdW5zRm9y
T2JqZWN0KGluCiAgICAgfQogfQogCi1zdGF0aWMgaW5saW5lIElubGluZUJveCogY3JlYXRlSW5s
aW5lQm94Rm9yUmVuZGVyZXIoUmVuZGVyT2JqZWN0KiBvYmosIGJvb2wgaXNSb290TGluZUJveCwg
Ym9vbCBpc09ubHlSdW4gPSBmYWxzZSkKK3N0YXRpYyBpbmxpbmUgSW5saW5lQm94KiBjcmVhdGVJ
bmxpbmVCb3hGb3JSZW5kZXJlcihSZW5kZXJPYmplY3QqIG9iaiwgYm9vbCBpc1Jvb3RMaW5lQm94
LCBib29sIGlzT25seVJ1biwgUmVuZGVyQmxvY2sqIGFub255bW91c0lubGluZUJsb2NrKQogewog
ICAgIGlmIChpc1Jvb3RMaW5lQm94KQotICAgICAgICByZXR1cm4gdG9SZW5kZXJCbG9jayhvYmop
LT5jcmVhdGVBbmRBcHBlbmRSb290SW5saW5lQm94KCk7CisgICAgICAgIHJldHVybiB0b1JlbmRl
ckJsb2NrKG9iaiktPmNyZWF0ZUFuZEFwcGVuZFJvb3RJbmxpbmVCb3goYW5vbnltb3VzSW5saW5l
QmxvY2spOwogICAgIAogICAgIGlmIChvYmotPmlzVGV4dCgpKSB7CiAgICAgICAgIElubGluZVRl
eHRCb3gqIHRleHRCb3ggPSB0b1JlbmRlclRleHQob2JqKS0+Y3JlYXRlSW5saW5lVGV4dEJveCgp
OwpAQCAtMjAxLDcgKzIwMSwxOCBAQCBzdGF0aWMgaW5saW5lIHZvaWQgZGlydHlMaW5lQm94ZXNG
b3JSZW5kCiAgICAgICAgIHRvUmVuZGVySW5saW5lKG8pLT5kaXJ0eUxpbmVCb3hlcyhmdWxsTGF5
b3V0KTsKIH0KIAotSW5saW5lRmxvd0JveCogUmVuZGVyQmxvY2s6OmNyZWF0ZUxpbmVCb3hlcyhS
ZW5kZXJPYmplY3QqIG9iaiwgYm9vbCBmaXJzdExpbmUpCitzdGF0aWMgaW5saW5lIGJvb2wgbmVl
ZHNMaW5lQm94KFJlbmRlcklubGluZSogaW5saW5lRmxvdywgYm9vbCBpc0Fub255bW91c0lubGlu
ZUJsb2NrKQoreworICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQgbGluZSBib3ggY3VsbGluZyBhbmQg
Y3V0IG91dCBhIGJ1bmNoIG9mIGludGVybWVkaWF0ZSBsaW5lIGJveGVzIGJ5IGNvbXBhcmluZyBz
dHlsZSBpbmZvcm1hdGlvbgorICAgIC8vIHdpdGggcGFyZW50cywgZXRjLiB0byBtYWtlIHN1cmUg
aXQncyBwb3NzaWJsZSB0byBvbWl0IHRoZSBib3ggZm9yIHRoZSBsaW5lLiAKKyAgICBpZiAoIWlz
QW5vbnltb3VzSW5saW5lQmxvY2sgfHwgIWlubGluZUZsb3cpCisgICAgICAgIHJldHVybiB0cnVl
OworICAgIAorICAgIC8vIElmIHdlIGhhdmUgYW4gb3V0bGluZSBvciBhIHNlbGYtcGFpbnRpbmcg
bGF5ZXIsIHRoZW4gd2UgbmVlZCB0byBjcmVhdGUgdGhlIGludGVybWVkaWF0ZSBsaW5lIGJveC4K
KyAgICByZXR1cm4gaW5saW5lRmxvdy0+aGFzT3V0bGluZSgpIHx8IGlubGluZUZsb3ctPmhhc1Nl
bGZQYWludGluZ0xheWVyKCk7Cit9CisKK0lubGluZUZsb3dCb3gqIFJlbmRlckJsb2NrOjpjcmVh
dGVMaW5lQm94ZXMoUmVuZGVyT2JqZWN0KiBvYmosIGJvb2wgZmlyc3RMaW5lLCBSZW5kZXJCbG9j
ayogYW5vbnltb3VzSW5saW5lQmxvY2spCiB7CiAgICAgLy8gU2VlIGlmIHdlIGhhdmUgYW4gdW5j
b25zdHJ1Y3RlZCBsaW5lIGJveCBmb3IgdGhpcyBvYmplY3QgdGhhdCBpcyBhbHNvCiAgICAgLy8g
dGhlIGxhc3QgaXRlbSBvbiB0aGUgbGluZS4KQEAgLTIxMiw2ICsyMjMsOCBAQCBJbmxpbmVGbG93
Qm94KiBSZW5kZXJCbG9jazo6Y3JlYXRlTGluZUJvCiAgICAgZG8gewogICAgICAgICBBU1NFUlQo
b2JqLT5pc1JlbmRlcklubGluZSgpIHx8IG9iaiA9PSB0aGlzKTsKICAgICAgICAgCisgICAgICAg
IFJlbmRlcklubGluZSogaW5saW5lT2JqID0gKG9iaiAhPSB0aGlzKSA/IHRvUmVuZGVySW5saW5l
KG9iaikgOiAwOworCiAgICAgICAgIC8vIEdldCB0aGUgbGFzdCBib3ggd2UgbWFkZSBmb3IgdGhp
cyByZW5kZXIgb2JqZWN0LgogICAgICAgICBwYXJlbnRCb3ggPSBvYmotPmlzUmVuZGVySW5saW5l
KCkgPyB0b1JlbmRlcklubGluZShvYmopLT5sYXN0TGluZUJveCgpIDogdG9SZW5kZXJCbG9jayhv
YmopLT5sYXN0TGluZUJveCgpOwogCkBAIC0yMjAsMzAgKzIzMywzNCBAQCBJbmxpbmVGbG93Qm94
KiBSZW5kZXJCbG9jazo6Y3JlYXRlTGluZUJvCiAgICAgICAgIC8vIHNvbWV0aGluZyBmb2xsb3dp
bmcgaXQgb24gdGhlIGxpbmUsIHRoZW4gd2Uga25vdyB3ZSBoYXZlIHRvIG1ha2UgYSBuZXcgYm94
CiAgICAgICAgIC8vIGFzIHdlbGwuICBJbiB0aGlzIHNpdHVhdGlvbiBvdXIgaW5saW5lIGhhcyBh
Y3R1YWxseSBiZWVuIHNwbGl0IGluIHR3byBvbgogICAgICAgICAvLyB0aGUgc2FtZSBsaW5lICh0
aGlzIGNhbiBoYXBwZW4gd2l0aCB2ZXJ5IGZhbmN5IGxhbmd1YWdlIG1peHR1cmVzKS4KKyAgICAg
ICAgYm9vbCBhbGxvd2VkVG9Db25zdHJ1Y3ROZXdCb3ggPSBuZWVkc0xpbmVCb3goaW5saW5lT2Jq
LCBhbm9ueW1vdXNJbmxpbmVCbG9jayk7CisgICAgICAgIGJvb2wgY2FuVXNlRXhpc3RpbmdQYXJl
bnRCb3ggPSBwYXJlbnRCb3ggJiYgIXBhcmVudEJveC0+aXNDb25zdHJ1Y3RlZCgpICYmICFwYXJl
bnRCb3gtPm5leHRPbkxpbmUoKTsKICAgICAgICAgYm9vbCBjb25zdHJ1Y3RlZE5ld0JveCA9IGZh
bHNlOwotICAgICAgICBpZiAoIXBhcmVudEJveCB8fCBwYXJlbnRCb3gtPmlzQ29uc3RydWN0ZWQo
KSB8fCBwYXJlbnRCb3gtPm5leHRPbkxpbmUoKSkgeworICAgICAgICBpZiAoYWxsb3dlZFRvQ29u
c3RydWN0TmV3Qm94ICYmICFjYW5Vc2VFeGlzdGluZ1BhcmVudEJveCkgewogICAgICAgICAgICAg
Ly8gV2UgbmVlZCB0byBtYWtlIGEgbmV3IGJveCBmb3IgdGhpcyByZW5kZXIgb2JqZWN0LiAgT25j
ZQogICAgICAgICAgICAgLy8gbWFkZSwgd2UgbmVlZCB0byBwbGFjZSBpdCBhdCB0aGUgZW5kIG9m
IHRoZSBjdXJyZW50IGxpbmUuCi0gICAgICAgICAgICBJbmxpbmVCb3gqIG5ld0JveCA9IGNyZWF0
ZUlubGluZUJveEZvclJlbmRlcmVyKG9iaiwgb2JqID09IHRoaXMpOworICAgICAgICAgICAgSW5s
aW5lQm94KiBuZXdCb3ggPSBjcmVhdGVJbmxpbmVCb3hGb3JSZW5kZXJlcihvYmosIG9iaiA9PSB0
aGlzLCBmYWxzZSwgYW5vbnltb3VzSW5saW5lQmxvY2spOwogICAgICAgICAgICAgQVNTRVJUKG5l
d0JveC0+aXNJbmxpbmVGbG93Qm94KCkpOwogICAgICAgICAgICAgcGFyZW50Qm94ID0gc3RhdGlj
X2Nhc3Q8SW5saW5lRmxvd0JveCo+KG5ld0JveCk7CiAgICAgICAgICAgICBwYXJlbnRCb3gtPnNl
dEZpcnN0TGluZVN0eWxlQml0KGZpcnN0TGluZSk7CiAgICAgICAgICAgICBjb25zdHJ1Y3RlZE5l
d0JveCA9IHRydWU7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIXJlc3VsdCkKLSAgICAgICAg
ICAgIHJlc3VsdCA9IHBhcmVudEJveDsKLQotICAgICAgICAvLyBJZiB3ZSBoYXZlIGhpdCB0aGUg
YmxvY2sgaXRzZWxmLCB0aGVuIHxib3h8IHJlcHJlc2VudHMgdGhlIHJvb3QKLSAgICAgICAgLy8g
aW5saW5lIGJveCBmb3IgdGhlIGxpbmUsIGFuZCBpdCBkb2Vzbid0IGhhdmUgdG8gYmUgYXBwZW5k
ZWQgdG8gYW55IHBhcmVudAotICAgICAgICAvLyBpbmxpbmUuCi0gICAgICAgIGlmIChjaGlsZEJv
eCkKLSAgICAgICAgICAgIHBhcmVudEJveC0+YWRkVG9MaW5lKGNoaWxkQm94KTsKLQotICAgICAg
ICBpZiAoIWNvbnN0cnVjdGVkTmV3Qm94IHx8IG9iaiA9PSB0aGlzKQotICAgICAgICAgICAgYnJl
YWs7Ci0KLSAgICAgICAgY2hpbGRCb3ggPSBwYXJlbnRCb3g7ICAgICAgICAKKyAgICAgICAgaWYg
KGNvbnN0cnVjdGVkTmV3Qm94IHx8IGNhblVzZUV4aXN0aW5nUGFyZW50Qm94KSB7CisgICAgICAg
ICAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBwYXJlbnRCb3g7IAor
ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBoaXQgdGhlIGJsb2Nr
IGl0c2VsZiwgdGhlbiB8Ym94fCByZXByZXNlbnRzIHRoZSByb290CisgICAgICAgICAgICAvLyBp
bmxpbmUgYm94IGZvciB0aGUgbGluZSwgYW5kIGl0IGRvZXNuJ3QgaGF2ZSB0byBiZSBhcHBlbmRl
ZCB0byBhbnkgcGFyZW50CisgICAgICAgICAgICAvLyBpbmxpbmUuCisgICAgICAgICAgICBpZiAo
Y2hpbGRCb3gpCisgICAgICAgICAgICAgICAgcGFyZW50Qm94LT5hZGRUb0xpbmUoY2hpbGRCb3gp
OworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCFjb25zdHJ1Y3RlZE5ld0JveCB8
fCBvYmogPT0gdGhpcykKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAKKyAgICAgICAgICAg
IGNoaWxkQm94ID0gcGFyZW50Qm94OworICAgICAgICB9CiAKICAgICAgICAgLy8gSWYgd2UndmUg
ZXhjZWVkZWQgb3VyIGxpbmUgZGVwdGgsIHRoZW4ganVtcCBzdHJhaWdodCB0byB0aGUgcm9vdCBh
bmQgc2tpcCBhbGwgdGhlIHJlbWFpbmluZwogICAgICAgICAvLyBpbnRlcm1lZGlhdGUgaW5saW5l
IGZsb3dzLgpAQCAtMjY1LDE5ICsyODIsMjMgQEAgUm9vdElubGluZUJveCogUmVuZGVyQmxvY2s6
OmNvbnN0cnVjdExpbgogICAgICAgICBpZiAocnVuQ291bnQgPT0gMiAmJiAhci0+bV9vYmplY3Qt
PmlzTGlzdE1hcmtlcigpKQogICAgICAgICAgICAgaXNPbmx5UnVuID0gKChzdHlsZSgpLT5kaXJl
Y3Rpb24oKSA9PSBSVEwpID8gbGFzdFJ1biA6IGZpcnN0UnVuKS0+bV9vYmplY3QtPmlzTGlzdE1h
cmtlcigpOwogCi0gICAgICAgIElubGluZUJveCogYm94ID0gY3JlYXRlSW5saW5lQm94Rm9yUmVu
ZGVyZXIoci0+bV9vYmplY3QsIGZhbHNlLCBpc09ubHlSdW4pOworICAgICAgICBSZW5kZXJCbG9j
ayogYW5vbnltb3VzSW5saW5lQmxvY2sgPSByLT5tX29iamVjdC0+aXNBbm9ueW1vdXNJbmxpbmVC
bG9jaygpID8gdG9SZW5kZXJCbG9jayhyLT5tX29iamVjdCkgOiAwOworCisgICAgICAgIElubGlu
ZUJveCogYm94ID0gY3JlYXRlSW5saW5lQm94Rm9yUmVuZGVyZXIoci0+bV9vYmplY3QsIGZhbHNl
LCBpc09ubHlSdW4sIGFub255bW91c0lubGluZUJsb2NrKTsKICAgICAgICAgci0+bV9ib3ggPSBi
b3g7CiAKICAgICAgICAgQVNTRVJUKGJveCk7CiAgICAgICAgIGlmICghYm94KQogICAgICAgICAg
ICAgY29udGludWU7CiAKKyAgICAgICAgUmVuZGVyT2JqZWN0KiBhbmNlc3RvclJlbmRlcmVyID0g
ci0+bV9vYmplY3QtPnBhcmVudCgpOworIAogICAgICAgICAvLyBJZiB3ZSBoYXZlIG5vIHBhcmVu
dCBib3ggeWV0LCBvciBpZiB0aGUgcnVuIGlzIG5vdCBzaW1wbHkgYSBzaWJsaW5nLAogICAgICAg
ICAvLyB0aGVuIHdlIG5lZWQgdG8gY29uc3RydWN0IGlubGluZSBib3hlcyBhcyBuZWNlc3Nhcnkg
dG8gcHJvcGVybHkgZW5jbG9zZSB0aGUKICAgICAgICAgLy8gcnVuJ3MgaW5saW5lIGJveC4KLSAg
ICAgICAgaWYgKCFwYXJlbnRCb3ggfHwgcGFyZW50Qm94LT5yZW5kZXJlcigpICE9IHItPm1fb2Jq
ZWN0LT5wYXJlbnQoKSkKKyAgICAgICAgaWYgKCFwYXJlbnRCb3ggfHwgcGFyZW50Qm94LT5yZW5k
ZXJlcigpICE9IGFuY2VzdG9yUmVuZGVyZXIpCiAgICAgICAgICAgICAvLyBDcmVhdGUgbmV3IGlu
bGluZSBib3hlcyBhbGwgdGhlIHdheSBiYWNrIHRvIHRoZSBhcHByb3ByaWF0ZSBpbnNlcnRpb24g
cG9pbnQuCi0gICAgICAgICAgICBwYXJlbnRCb3ggPSBjcmVhdGVMaW5lQm94ZXMoci0+bV9vYmpl
Y3QtPnBhcmVudCgpLCBmaXJzdExpbmUpOworICAgICAgICAgICAgcGFyZW50Qm94ID0gY3JlYXRl
TGluZUJveGVzKGFuY2VzdG9yUmVuZGVyZXIsIGZpcnN0TGluZSwgYW5vbnltb3VzSW5saW5lQmxv
Y2spOwogCiAgICAgICAgIC8vIEFwcGVuZCB0aGUgaW5saW5lIGJveCB0byB0aGlzIGxpbmUuCiAg
ICAgICAgIHBhcmVudEJveC0+YWRkVG9MaW5lKGJveCk7CkBAIC0zMTksNiArMzQwLDggQEAgdm9p
ZCBSZW5kZXJCbG9jazo6Y29tcHV0ZUhvcml6b250YWxQb3NpdAogICAgIHVuc2lnbmVkIG51bVNw
YWNlcyA9IDA7CiAgICAgRVRleHRBbGlnbiB0ZXh0QWxpZ24gPSBzdHlsZSgpLT50ZXh0QWxpZ24o
KTsKIAorICAgIGludCB4ID0gbGVmdE9mZnNldChoZWlnaHQoKSwgZmlyc3RMaW5lKTsKKwogICAg
IGZvciAoQmlkaVJ1biogciA9IGZpcnN0UnVuOyByOyByID0gci0+bmV4dCgpKSB7CiAgICAgICAg
IGlmICghci0+bV9ib3ggfHwgci0+bV9vYmplY3QtPmlzUG9zaXRpb25lZCgpIHx8IHItPm1fYm94
LT5pc0xpbmVCcmVhaygpKQogICAgICAgICAgICAgY29udGludWU7IC8vIFBvc2l0aW9uZWQgb2Jq
ZWN0cyBhcmUgb25seSBwYXJ0aWNpcGF0aW5nIHRvIGZpZ3VyZSBvdXQgdGhlaXIKQEAgLTM1Niw2
ICszNzksMTIgQEAgdm9pZCBSZW5kZXJCbG9jazo6Y29tcHV0ZUhvcml6b250YWxQb3NpdAogICAg
ICAgICAgICAgcmVuZGVyQm94LT5jYWxjV2lkdGgoKTsKICAgICAgICAgICAgIHItPm1fYm94LT5z
ZXRXaWR0aChyZW5kZXJCb3gtPndpZHRoKCkpOwogICAgICAgICAgICAgdG90V2lkdGggKz0gcmVu
ZGVyQm94LT5tYXJnaW5MZWZ0KCkgKyByZW5kZXJCb3gtPm1hcmdpblJpZ2h0KCk7CisgICAgICAg
ICAgICAKKyAgICAgICAgICAgIGlmIChyLT5tX29iamVjdC0+aXNBbm9ueW1vdXNJbmxpbmVCbG9j
aygpKSB7CisgICAgICAgICAgICAgICAgLy8gQWxsb3cgdGhlIGZ1bGwgYXZhaWxhYmxlIHdpZHRo
IHRvIGJlIHVzZWQsIHNpbmNlIGZsb2F0cyB3aWxsIGludHJ1ZGUgaW50byBvdXIgc3BhY2UuCisg
ICAgICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGggPSByaWdodE9mZnNldCgpIC0gbGVmdE9mZnNl
dCgpOworICAgICAgICAgICAgICAgIHggPSBsZWZ0T2Zmc2V0KCk7CisgICAgICAgICAgICB9CiAg
ICAgICAgIH0KIAogICAgICAgICB0b3RXaWR0aCArPSByLT5tX2JveC0+d2lkdGgoKTsKQEAgLTM2
NSw3ICszOTQsNiBAQCB2b2lkIFJlbmRlckJsb2NrOjpjb21wdXRlSG9yaXpvbnRhbFBvc2l0CiAg
ICAgLy8gd2Ugbm93IGV4YW1pbmUgb3VyIHRleHQtYWxpZ24gcHJvcGVydHkgaW4gb3JkZXIgdG8g
ZGV0ZXJtaW5lIHdoZXJlIHRvIHBvc2l0aW9uIHRoZQogICAgIC8vIG9iamVjdHMgaG9yaXpvbnRh
bGx5LiAgVGhlIHRvdGFsIHdpZHRoIG9mIHRoZSBsaW5lIGNhbiBiZSBpbmNyZWFzZWQgaWYgd2Ug
ZW5kIHVwCiAgICAgLy8ganVzdGlmeWluZyB0ZXh0LgotICAgIGludCB4ID0gbGVmdE9mZnNldCho
ZWlnaHQoKSwgZmlyc3RMaW5lKTsKICAgICBzd2l0Y2ggKHRleHRBbGlnbikgewogICAgICAgICBj
YXNlIExFRlQ6CiAgICAgICAgIGNhc2UgV0VCS0lUX0xFRlQ6CkBAIC01MTksOSArNTQ3LDE1IEBA
IHZvaWQgUmVuZGVyQmxvY2s6OmxheW91dElubGluZUNoaWxkcmVuKGIKICAgICBib29sIHVzZVJl
cGFpbnRCb3VuZHMgPSBmYWxzZTsKICAgICAKICAgICBtX292ZXJmbG93LmNsZWFyKCk7Ci0gICAg
ICAgIAotICAgIHNldEhlaWdodChib3JkZXJUb3AoKSArIHBhZGRpbmdUb3AoKSk7Ci0gICAgaW50
IHRvQWRkID0gYm9yZGVyQm90dG9tKCkgKyBwYWRkaW5nQm90dG9tKCkgKyBob3Jpem9udGFsU2Ny
b2xsYmFySGVpZ2h0KCk7CisgICAgCisgICAgaW50IHRvcCA9IGJvcmRlclRvcCgpICsgcGFkZGlu
Z1RvcCgpOworICAgIGludCBib3R0b20gPSBib3JkZXJCb3R0b20oKSArIHBhZGRpbmdCb3R0b20o
KSArIGhvcml6b250YWxTY3JvbGxiYXJIZWlnaHQoKTsKKworICAgIHNldEhlaWdodCh0b3ApOwor
CisgICAgLy8gVGhlIG1hcmdpbiBzdHJ1Y3QgY2FjaGVzIGFsbCBvdXIgY3VycmVudCBtYXJnaW4g
Y29sbGFwc2luZyBzdGF0ZS4gV2UgcnVuIG1hcmdpbiBjb2xsYXBzaW5nIHdoZW4gd2UgZW5jb3Vu
dGVyIGFub255bW91cyBpbmxpbmUgYmxvY2tzIHRoYXQgYXJlIGJlaW5nIHVzZWQKKyAgICAvLyBm
b3IgdGhlIGJsb2Nrcy1pbnNpZGUtaW5saW5lcyBjYXNlIChhbmQgdGhlIGlubGluZXMgYXJlIGVt
cHR5KSwgZS5nLCA8c3Bhbj48ZGl2Pk9uZTwvZGl2Pjwvc3Bhbj4uCisgICAgTWFyZ2luSW5mbyBt
YXJnaW5JbmZvKHRoaXMsIHRvcCwgYm90dG9tKTsKIAogICAgIC8vIEZpZ3VyZSBvdXQgaWYgd2Ug
c2hvdWxkIGNsZWFyIG91dCBvdXIgbGluZSBib3hlcy4KICAgICAvLyBGSVhNRTogSGFuZGxlIHJl
c2l6ZSBldmVudHVhbGx5IQpAQCAtNTUwLDEyICs1ODQsMTUgQEAgdm9pZCBSZW5kZXJCbG9jazo6
bGF5b3V0SW5saW5lQ2hpbGRyZW4oYgogICAgICAgICAgICAgaWYgKG8tPmlzUmVwbGFjZWQoKSB8
fCBvLT5pc0Zsb2F0aW5nKCkgfHwgby0+aXNQb3NpdGlvbmVkKCkpIHsKICAgICAgICAgICAgICAg
ICBSZW5kZXJCb3gqIGJveCA9IHRvUmVuZGVyQm94KG8pOwogICAgICAgICAgICAgICAgIAotICAg
ICAgICAgICAgICAgIGlmIChyZWxheW91dENoaWxkcmVuIHx8IG8tPnN0eWxlKCktPndpZHRoKCku
aXNQZXJjZW50KCkgfHwgby0+c3R5bGUoKS0+aGVpZ2h0KCkuaXNQZXJjZW50KCkpCi0gICAgICAg
ICAgICAgICAgICAgIG8tPnNldENoaWxkTmVlZHNMYXlvdXQodHJ1ZSwgZmFsc2UpOwotICAgICAg
ICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgbGF5b3V0IGNo
aWxkcmVuIGlmIHRoZXkgbmVlZCBpdC4KKyAgICAgICAgICAgICAgICAvLyBGSVhNRTogVGVjaG5p
Y2FsbHkgcGVyY2VudGFnZSBoZWlnaHQgb2JqZWN0cyBvbmx5IG5lZWQgYSByZWxheW91dCBpZiB0
aGVpciBwZXJjZW50YWdlIGlzbid0IGdvaW5nIHRvIGJlIHR1cm5lZCBpbnRvCisgICAgICAgICAg
ICAgICAgLy8gYW4gYXV0byB2YWx1ZS4gIEFkZCBhIG1ldGhvZCB0byBkZXRlcm1pbmUgdGhpcywg
c28gdGhhdCB3ZSBjYW4gYXZvaWQgdGhlIHJlbGF5b3V0LgorICAgICAgICAgICAgICAgIGlmIChy
ZWxheW91dENoaWxkcmVuIHx8ICgoYm94LT5zdHlsZSgpLT5oZWlnaHQoKS5pc1BlcmNlbnQoKSB8
fCBib3gtPnN0eWxlKCktPm1pbkhlaWdodCgpLmlzUGVyY2VudCgpIHx8IGJveC0+c3R5bGUoKS0+
bWF4SGVpZ2h0KCkuaXNQZXJjZW50KCkpKSkKKyAgICAgICAgICAgICAgICAgICAgYm94LT5zZXRD
aGlsZE5lZWRzTGF5b3V0KHRydWUsIGZhbHNlKTsKKwogICAgICAgICAgICAgICAgIC8vIElmIHJl
bGF5b3V0Q2hpbGRyZW4gaXMgc2V0IGFuZCB3ZSBoYXZlIHBlcmNlbnRhZ2UgcGFkZGluZywgd2Ug
YWxzbyBuZWVkIHRvIGludmFsaWRhdGUgdGhlIGNoaWxkJ3MgcHJlZiB3aWR0aHMuCi0gICAgICAg
ICAgICAgICAgaWYgKHJlbGF5b3V0Q2hpbGRyZW4gJiYgKG8tPnN0eWxlKCktPnBhZGRpbmdMZWZ0
KCkuaXNQZXJjZW50KCkgfHwgby0+c3R5bGUoKS0+cGFkZGluZ1JpZ2h0KCkuaXNQZXJjZW50KCkp
KQotICAgICAgICAgICAgICAgICAgICBvLT5zZXRQcmVmV2lkdGhzRGlydHkodHJ1ZSwgZmFsc2Up
OworICAgICAgICAgICAgICAgIGlmIChyZWxheW91dENoaWxkcmVuICYmIChib3gtPnN0eWxlKCkt
PnBhZGRpbmdMZWZ0KCkuaXNQZXJjZW50KCkgfHwgYm94LT5zdHlsZSgpLT5wYWRkaW5nUmlnaHQo
KS5pc1BlcmNlbnQoKSkpCisgICAgICAgICAgICAgICAgICAgIGJveC0+c2V0UHJlZldpZHRoc0Rp
cnR5KHRydWUsIGZhbHNlKTsKICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIGlmIChvLT5p
c1Bvc2l0aW9uZWQoKSkKICAgICAgICAgICAgICAgICAgICAgby0+Y29udGFpbmluZ0Jsb2NrKCkt
Pmluc2VydFBvc2l0aW9uZWRPYmplY3QoYm94KTsKQEAgLTU2NSw3ICs2MDIsOCBAQCB2b2lkIFJl
bmRlckJsb2NrOjpsYXlvdXRJbmxpbmVDaGlsZHJlbihiCiAgICAgICAgICAgICAgICAgICAgIGVs
c2UgaWYgKGZ1bGxMYXlvdXQgfHwgby0+bmVlZHNMYXlvdXQoKSkgLy8gUmVwbGFjZWQgZWxlbWVu
dHMKICAgICAgICAgICAgICAgICAgICAgICAgIHRvUmVuZGVyQm94KG8pLT5kaXJ0eUxpbmVCb3hl
cyhmdWxsTGF5b3V0KTsKIAotICAgICAgICAgICAgICAgICAgICBvLT5sYXlvdXRJZk5lZWRlZCgp
OworICAgICAgICAgICAgICAgICAgICBpZiAoIW8tPmlzUmVwbGFjZWQoKSB8fCAhby0+aXNBbm9u
eW1vdXNJbmxpbmVCbG9jaygpKQorICAgICAgICAgICAgICAgICAgICAgICAgby0+bGF5b3V0SWZO
ZWVkZWQoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG8tPmlz
VGV4dCgpIHx8IChvLT5pc1JlbmRlcklubGluZSgpICYmICFlbmRPZklubGluZSkpIHsKICAgICAg
ICAgICAgICAgICBoYXNJbmxpbmVDaGlsZCA9IHRydWU7CkBAIC02NjAsNyArNjk4LDcgQEAgdm9p
ZCBSZW5kZXJCbG9jazo6bGF5b3V0SW5saW5lQ2hpbGRyZW4oYgogICAgICAgICAgICAgaXNMaW5l
RW1wdHkgPSB0cnVlOwogICAgICAgICAgICAgCiAgICAgICAgICAgICBFQ2xlYXIgY2xlYXIgPSBD
Tk9ORTsKLSAgICAgICAgICAgIGVuZCA9IGZpbmROZXh0TGluZUJyZWFrKHJlc29sdmVyLCBmaXJz
dExpbmUsIGlzTGluZUVtcHR5LCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHksICZjbGVhcik7Cisg
ICAgICAgICAgICBlbmQgPSBmaW5kTmV4dExpbmVCcmVhayhyZXNvbHZlciwgZmlyc3RMaW5lLCBp
c0xpbmVFbXB0eSwgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5LCBtYXJnaW5JbmZvLCAmY2xlYXIp
OwogICAgICAgICAgICAgaWYgKHJlc29sdmVyLnBvc2l0aW9uKCkuYXRFbmQoKSkgewogICAgICAg
ICAgICAgICAgIHJlc29sdmVyLmRlbGV0ZVJ1bnMoKTsKICAgICAgICAgICAgICAgICBjaGVja0Zv
ckZsb2F0c0Zyb21MYXN0TGluZSA9IHRydWU7CkBAIC03MzAsNiArNzY4LDE0IEBAIHZvaWQgUmVu
ZGVyQmxvY2s6OmxheW91dElubGluZUNoaWxkcmVuKGIKICAgICAgICAgICAgICAgICAgICAgaWYg
KGxpbmVCb3gpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVCb3gtPnNldEVuZHNXaXRo
QnJlYWsocHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KTsKIAorICAgICAgICAgICAgICAgICAgICAg
ICAgLy8gSWYgb3VyIHByZXZpb3VzIGxpbmUgd2FzIGFuIGFub255bW91cyBibG9jayBhbmQgd2Ug
YXJlIG5vdCBhbiBhbm9ueW1vdXMgYmxvY2ssIHNpbXVsYXRlIGEgbWFyZ2luIGNvbGxhcHNlIG5v
dyBzbyB0aGF0IHdlIGdldCB0aGUgcHJvcGVyCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBp
bmNyZWFzZWQgaGVpZ2h0LiAgV2UgYWxzbyBoYXZlIHRvIHNpbXVsYXRlIGEgbWFyZ2luIGNvbGxh
cHNlIHRvIHByb3BhZ2F0ZSBtYXJnaW5zIHRocm91Z2ggdG8gdGhlIHRvcCBvZiBvdXIgYmxvY2su
CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxpbmVCb3gtPmhhc0Fub255bW91c0lubGlu
ZUJsb2NrKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxpbmVCb3gtPnBy
ZXZSb290Qm94KCkgfHwgbGluZUJveC0+cHJldlJvb3RCb3goKS0+aGFzQW5vbnltb3VzSW5saW5l
QmxvY2soKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2VNYXJnaW5z
KDAsIG1hcmdpbkluZm8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbkluZm8u
c2V0QXRUb3BPZkJsb2NrKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKwogICAg
ICAgICAgICAgICAgICAgICAgICAgLy8gTm93IHdlIHBvc2l0aW9uIGFsbCBvZiBvdXIgdGV4dCBy
dW5zIGhvcml6b250YWxseS4KICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVIb3Jpem9u
dGFsUG9zaXRpb25zRm9yTGluZShsaW5lQm94LCBmaXJzdExpbmUsIHJlc29sdmVyLmZpcnN0UnVu
KCksIHRyYWlsaW5nU3BhY2VSdW4sIGVuZC5hdEVuZCgpKTsKIApAQCAtODYxLDggKzkwNywxNCBA
QCB2b2lkIFJlbmRlckJsb2NrOjpsYXlvdXRJbmxpbmVDaGlsZHJlbihiCiAgICAgICAgIH0KICAg
ICB9CiAKLSAgICAvLyBOb3cgYWRkIGluIHRoZSBib3R0b20gYm9yZGVyL3BhZGRpbmcuCi0gICAg
c2V0SGVpZ2h0KGhlaWdodCgpICsgdG9BZGQpOworICAgIC8vIE5vdyBkbyB0aGUgaGFuZGxpbmcg
b2YgdGhlIGJvdHRvbSBvZiB0aGUgYmxvY2ssIGFkZGluZyBpbiBvdXIgYm90dG9tIGJvcmRlci9w
YWRkaW5nIGFuZAorICAgIC8vIGRldGVybWluaW5nIHRoZSBjb3JyZWN0IGNvbGxhcHNlZCBib3R0
b20gbWFyZ2luIGluZm9ybWF0aW9uLiAgVGhpcyBjb2xsYXBzZSBpcyBvbmx5IG5lY2Vzc2FyeQor
ICAgIC8vIGlmIG91ciBsYXN0IGNoaWxkIHdhcyBhbiBhbm9ueW1vdXMgaW5saW5lIGJsb2NrIHRo
YXQgbWlnaHQgbmVlZCB0byBwcm9wYWdhdGUgbWFyZ2luIGluZm9ybWF0aW9uIG91dCB0bworICAg
IC8vIHVzLgorICAgIGlmIChsYXN0Um9vdEJveCgpICYmIGxhc3RSb290Qm94KCktPmhhc0Fub255
bW91c0lubGluZUJsb2NrKCkpCisgICAgICAgIGhhbmRsZUJvdHRvbU9mQmxvY2sodG9wLCBib3R0
b20sIG1hcmdpbkluZm8pOworICAgIGVsc2UKKyAgICAgICAgc2V0SGVpZ2h0KGhlaWdodCgpICsg
Ym90dG9tKTsKIAogICAgIGlmICghZmlyc3RMaW5lQm94KCkgJiYgaGFzTGluZUlmRW1wdHkoKSkK
ICAgICAgICAgc2V0SGVpZ2h0KGhlaWdodCgpICsgbGluZUhlaWdodCh0cnVlLCB0cnVlKSk7CkBA
IC04ODMsNiArOTM1LDEyIEBAIFJvb3RJbmxpbmVCb3gqIFJlbmRlckJsb2NrOjpkZXRlcm1pbmVT
dGEKICAgICBpZiAoIWZ1bGxMYXlvdXQpIHsKICAgICAgICAgc2l6ZV90IGZsb2F0SW5kZXggPSAw
OwogICAgICAgICBmb3IgKGN1cnIgPSBmaXJzdFJvb3RCb3goKTsgY3VyciAmJiAhY3Vyci0+aXNE
aXJ0eSgpOyBjdXJyID0gY3Vyci0+bmV4dFJvb3RCb3goKSkgeworICAgICAgICAgICAgaWYgKGN1
cnItPmhhc0Fub255bW91c0lubGluZUJsb2NrKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBGSVhN
RTogV2UgaGF2ZSB0byBkbyBiZXR0ZXIgdGhhbiB0aGlzIG9yIHdlIHdpbGwgcmVwYWludCB0b28g
bXVjaCBhcyBjb250ZW50IGluc2lkZSBhbgorICAgICAgICAgICAgICAgIC8vIGFub255bW91cyBp
bmxpbmUgYmxvY2sgY29tZXMgaW4uCisgICAgICAgICAgICAgICAgZnVsbExheW91dCA9IHRydWU7
CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAo
VmVjdG9yPFJlbmRlckJveCo+KiBjbGVhbkxpbmVGbG9hdHMgPSBjdXJyLT5mbG9hdHNQdHIoKSkg
ewogICAgICAgICAgICAgICAgIFZlY3RvcjxSZW5kZXJCb3gqPjo6aXRlcmF0b3IgZW5kID0gY2xl
YW5MaW5lRmxvYXRzLT5lbmQoKTsKICAgICAgICAgICAgICAgICBmb3IgKFZlY3RvcjxSZW5kZXJC
b3gqPjo6aXRlcmF0b3IgbyA9IGNsZWFuTGluZUZsb2F0cy0+YmVnaW4oKTsgbyAhPSBlbmQ7ICsr
bykgewpAQCAtMTE0MCw3ICsxMTk4LDcgQEAgc3RhdGljIGJvb2wgaW5saW5lRmxvd1JlcXVpcmVz
TGluZUJveChSZQogewogICAgIC8vIEZJWE1FOiBSaWdodCBub3csIHdlIG9ubHkgYWxsb3cgbGlu
ZSBib3hlcyBmb3IgaW5saW5lcyB0aGF0IGFyZSB0cnVseSBlbXB0eS4KICAgICAvLyBXZSBuZWVk
IHRvIGZpeCB0aGlzLCB0aG91Z2gsIGJlY2F1c2UgYXQgdGhlIHZlcnkgbGVhc3QsIGlubGluZXMg
Y29udGFpbmluZyBvbmx5Ci0gICAgLy8gaWdub3JhYmxlIHdoaXRlc3BhY2Ugc2hvdWxkIHNob3Vs
ZCBhbHNvIGhhdmUgbGluZSBib3hlcy4gCisgICAgLy8gaWdub3JhYmxlIHdoaXRlc3BhY2Ugc2hv
dWxkIGFsc28gaGF2ZSBsaW5lIGJveGVzLiAKICAgICByZXR1cm4gIWZsb3ctPmZpcnN0Q2hpbGQo
KSAmJiBmbG93LT5oYXNIb3Jpem9udGFsQm9yZGVyc1BhZGRpbmdPck1hcmdpbigpOwogfQogCkBA
IC0xMjk3LDcgKzEzNTUsNyBAQCBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHRleHRXaWR0aChSZW5k
ZXJUCiB9CiAKIElubGluZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpmaW5kTmV4dExpbmVCcmVhayhJ
bmxpbmVCaWRpUmVzb2x2ZXImIHJlc29sdmVyLCBib29sIGZpcnN0TGluZSwgIGJvb2wmIGlzTGlu
ZUVtcHR5LCBib29sJiBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHksIAotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVDbGVhciogY2xlYXIpCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFyZ2luSW5mbyYgbWFyZ2luSW5m
bywgRUNsZWFyKiBjbGVhcikKIHsKICAgICBBU1NFUlQocmVzb2x2ZXIucG9zaXRpb24oKS5ibG9j
ayA9PSB0aGlzKTsKIApAQCAtMTMzOCw2ICsxMzk2LDExIEBAIElubGluZUl0ZXJhdG9yIFJlbmRl
ckJsb2NrOjpmaW5kTmV4dExpbmUKICAgICBib29sIGF1dG9XcmFwV2FzRXZlclRydWVPbkxpbmUg
PSBmYWxzZTsKICAgICBib29sIGZsb2F0c0ZpdE9uTGluZSA9IHRydWU7CiAgICAgCisgICAgYm9v
bCBpc0Jsb2NrSW5zaWRlSW5saW5lID0gZmFsc2U7CisgICAgCisgICAgaW50IHByZXZpb3VzQmxv
Y2tGbG9hdEJvdHRvbSA9IDA7CisgICAgaW50IG1heEJsb2NrRmxvYXRCb3R0b20gPSAwOworCiAg
ICAgLy8gRmlyZWZveCBhbmQgT3BlcmEgd2lsbCBhbGxvdyBhIHRhYmxlIGNlbGwgdG8gZ3JvdyB0
byBmaXQgYW4gaW1hZ2UgaW5zaWRlIGl0IHVuZGVyCiAgICAgLy8gdmVyeSBzcGVjaWZpYyBjaXJj
dW1zdGFuY2VzIChpbiBvcmRlciB0byBtYXRjaCBjb21tb24gV2luSUUgcmVuZGVyaW5ncykuIAog
ICAgIC8vIE5vdCBzdXBwb3J0aW5nIHRoZSBxdWlyayBoYXMgY2F1c2VkIHVzIHRvIG1pcy1yZW5k
ZXIgc29tZSByZWFsIHNpdGVzLiAoU2VlIEJ1Z3ppbGxhIDEwNTE3LikgCkBAIC0xMzQ4LDcgKzE0
MTEsOCBAQCBJbmxpbmVJdGVyYXRvciBSZW5kZXJCbG9jazo6ZmluZE5leHRMaW5lCiAgICAgd2hp
bGUgKG8pIHsKICAgICAgICAgY3VycldTID0gby0+aXNSZXBsYWNlZCgpID8gby0+cGFyZW50KCkt
PnN0eWxlKCktPndoaXRlU3BhY2UoKSA6IG8tPnN0eWxlKCktPndoaXRlU3BhY2UoKTsKICAgICAg
ICAgbGFzdFdTID0gbGFzdC0+aXNSZXBsYWNlZCgpID8gbGFzdC0+cGFyZW50KCktPnN0eWxlKCkt
PndoaXRlU3BhY2UoKSA6IGxhc3QtPnN0eWxlKCktPndoaXRlU3BhY2UoKTsKLSAgICAgICAgCisg
ICAgICAgIGlzQmxvY2tJbnNpZGVJbmxpbmUgPSBvLT5pc0Fub255bW91c0lubGluZUJsb2NrKCk7
CisKICAgICAgICAgYm9vbCBhdXRvV3JhcCA9IFJlbmRlclN0eWxlOjphdXRvV3JhcChjdXJyV1Mp
OwogICAgICAgICBhdXRvV3JhcFdhc0V2ZXJUcnVlT25MaW5lID0gYXV0b1dyYXBXYXNFdmVyVHJ1
ZU9uTGluZSB8fCBhdXRvV3JhcDsKIApAQCAtMTM1OSw3ICsxNDIzLDcgQEAgSW5saW5lSXRlcmF0
b3IgUmVuZGVyQmxvY2s6OmZpbmROZXh0TGluZQogI2VuZGlmCiAKICAgICAgICAgYm9vbCBjb2xs
YXBzZVdoaXRlU3BhY2UgPSBSZW5kZXJTdHlsZTo6Y29sbGFwc2VXaGl0ZVNwYWNlKGN1cnJXUyk7
Ci0gICAgICAgICAgICAKKwogICAgICAgICBpZiAoby0+aXNCUigpKSB7CiAgICAgICAgICAgICBp
ZiAodyArIHRtcFcgPD0gd2lkdGgpIHsKICAgICAgICAgICAgICAgICBsQnJlYWsub2JqID0gbzsK
QEAgLTE0NjYsOCArMTUzMCw5IEBAIElubGluZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpmaW5kTmV4
dExpbmUKICAgICAgICAgfSBlbHNlIGlmIChvLT5pc1JlcGxhY2VkKCkpIHsKICAgICAgICAgICAg
IFJlbmRlckJveCogcmVwbGFjZWRCb3ggPSB0b1JlbmRlckJveChvKTsKIAotICAgICAgICAgICAg
Ly8gQnJlYWsgb24gcmVwbGFjZWQgZWxlbWVudHMgaWYgZWl0aGVyIGhhcyBub3JtYWwgd2hpdGUt
c3BhY2UuCi0gICAgICAgICAgICBpZiAoKGF1dG9XcmFwIHx8IFJlbmRlclN0eWxlOjphdXRvV3Jh
cChsYXN0V1MpKSAmJiAoIW8tPmlzSW1hZ2UoKSB8fCBhbGxvd0ltYWdlc1RvQnJlYWspKSB7Cisg
ICAgICAgICAgICAvLyBCcmVhayBvbiByZXBsYWNlZCBlbGVtZW50cyBpZiBlaXRoZXIgaGFzIG5v
cm1hbCB3aGl0ZS1zcGFjZS4gIFdlIGFsc28gYWx3YXlzIGJyZWFrIGlmIHdlCisgICAgICAgICAg
ICAvLyBlbmNvdW50ZXIgYSBzcGVjaWFsIGFub255bW91cyBpbmxpbmUgYmxvY2sgKHVzZWQgdG8g
aG9sZCBibG9ja3MgaW5zaWRlIGlubGluZXMpLgorICAgICAgICAgICAgaWYgKChhdXRvV3JhcCB8
fCBSZW5kZXJTdHlsZTo6YXV0b1dyYXAobGFzdFdTKSB8fCBpc0Jsb2NrSW5zaWRlSW5saW5lKSAg
JiYgKCFvLT5pc0ltYWdlKCkgfHwgYWxsb3dJbWFnZXNUb0JyZWFrKSkgewogICAgICAgICAgICAg
ICAgIHcgKz0gdG1wVzsKICAgICAgICAgICAgICAgICB0bXBXID0gMDsKICAgICAgICAgICAgICAg
ICBsQnJlYWsub2JqID0gbzsKQEAgLTE0NzUsNiArMTU0MCwxOSBAQCBJbmxpbmVJdGVyYXRvciBS
ZW5kZXJCbG9jazo6ZmluZE5leHRMaW5lCiAgICAgICAgICAgICAgICAgbEJyZWFrLm5leHRCcmVh
a2FibGVQb3NpdGlvbiA9IC0xOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAoaXNC
bG9ja0luc2lkZUlubGluZSkgeworICAgICAgICAgICAgICAgIGlmICghaXNMaW5lRW1wdHkpCisg
ICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOworCisgICAgICAgICAgICAgICAgLy8gUmVzZXQg
dGhlIHdpZHRoIHRvIGlnbm9yZSBmbG9hdHMsIHNpbmNlIHdlJ3JlIGdvaW5nIHRvIGFsbG93IHRo
ZW0gdG8gaW50cnVkZSBpbnRvIG91ciBzcGFjZS4KKyAgICAgICAgICAgICAgICB3aWR0aCA9IHJp
Z2h0T2Zmc2V0KCkgLSBsZWZ0T2Zmc2V0KCk7CisKKyAgICAgICAgICAgICAgICAvLyBGSVhNRTog
VGhpcyBjYWxsIHdpbGwgdXBkYXRlIHRoZSBoZWlnaHQgb2Ygb3VyIGJsb2NrLiAgSXQncyBub3Qg
Y2xlYXIgaWYgdGhhdCdzIGdvaW5nIHRvIGJlIG9rIG9yIG5vdCB5ZXQuCisgICAgICAgICAgICAg
ICAgbGF5b3V0QmxvY2tDaGlsZChyZXBsYWNlZEJveCwgbWFyZ2luSW5mbywgcHJldmlvdXNCbG9j
a0Zsb2F0Qm90dG9tLCBtYXhCbG9ja0Zsb2F0Qm90dG9tKTsKKworICAgICAgICAgICAgICAgIGxp
bmVNaWRwb2ludFN0YXRlLmJldHdlZW5NaWRwb2ludHMgPSBmYWxzZTsKKyAgICAgICAgICAgIH0K
KwogICAgICAgICAgICAgaWYgKGlnbm9yaW5nU3BhY2VzKQogICAgICAgICAgICAgICAgIGFkZE1p
ZHBvaW50KGxpbmVNaWRwb2ludFN0YXRlLCBJbmxpbmVJdGVyYXRvcigwLCBvLCAwKSk7CiAKQEAg
LTE0OTgsNiArMTU3NiwxNSBAQCBJbmxpbmVJdGVyYXRvciBSZW5kZXJCbG9jazo6ZmluZE5leHRM
aW5lCiAgICAgICAgICAgICAgICAgICAgIHRtcFcgKz0gcmVwbGFjZWRCb3gtPndpZHRoKCkgKyBy
ZXBsYWNlZEJveC0+bWFyZ2luTGVmdCgpICsgcmVwbGFjZWRCb3gtPm1hcmdpblJpZ2h0KCkgKyBp
bmxpbmVXaWR0aChvKTsKICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgIHRtcFcg
Kz0gcmVwbGFjZWRCb3gtPndpZHRoKCkgKyByZXBsYWNlZEJveC0+bWFyZ2luTGVmdCgpICsgcmVw
bGFjZWRCb3gtPm1hcmdpblJpZ2h0KCkgKyBpbmxpbmVXaWR0aChvKTsKKyAgICAgICAgICAgICAg
ICAKKyAgICAgICAgICAgIGlmIChpc0Jsb2NrSW5zaWRlSW5saW5lKSB7CisgICAgICAgICAgICAg
ICAgdyArPSB0bXBXOworICAgICAgICAgICAgICAgIHRtcFcgPSAwOworICAgICAgICAgICAgICAg
IGxCcmVhay5vYmogPSBvOworICAgICAgICAgICAgICAgIGxCcmVhay5wb3MgPSAwOworICAgICAg
ICAgICAgICAgIGxCcmVhay5uZXh0QnJlYWthYmxlUG9zaXRpb24gPSAtMTsKKyAgICAgICAgICAg
ICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChvLT5pc1Rl
eHQoKSkgewogICAgICAgICAgICAgaWYgKCFwb3MpCiAgICAgICAgICAgICAgICAgYXBwbGllZFN0
YXJ0V2lkdGggPSBmYWxzZTsKQEAgLTE4ODQsNyArMTk3MSw3IEBAIElubGluZUl0ZXJhdG9yIFJl
bmRlckJsb2NrOjpmaW5kTmV4dExpbmUKICAgICAgICAgfQogICAgICAgICAvL2Vsc2UgaWYgKGxC
cmVhay5wb3MgPiAwKQogICAgICAgICAvLyAgICBsQnJlYWsucG9zLS07Ci0gICAgICAgIGVsc2Ug
aWYgKGxCcmVhay5vYmogPT0gMCAmJiB0cmFpbGluZ1NwYWNlT2JqZWN0LT5pc1RleHQoKSkgewor
ICAgICAgICBlbHNlIGlmICgoIWxCcmVhay5vYmogfHwgbEJyZWFrLm9iai0+aXNBbm9ueW1vdXNJ
bmxpbmVCbG9jaygpKSAmJiB0cmFpbGluZ1NwYWNlT2JqZWN0LT5pc1RleHQoKSkgewogICAgICAg
ICAgICAgLy8gQWRkIGEgbmV3IGVuZCBtaWRwb2ludCB0aGF0IHN0b3BzIHJpZ2h0IGF0IHRoZSB2
ZXJ5IGVuZC4KICAgICAgICAgICAgIFJlbmRlclRleHQqIHRleHQgPSB0b1JlbmRlclRleHQodHJh
aWxpbmdTcGFjZU9iamVjdCk7CiAgICAgICAgICAgICB1bnNpZ25lZCBsZW5ndGggPSB0ZXh0LT50
ZXh0TGVuZ3RoKCk7CkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCb3guY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJveC5jcHAJKHJldmlzaW9uIDU0NjY0
KQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQm94LmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MTMzNCw3ICsxMzM0LDcgQEAgdm9pZCBSZW5kZXJCb3g6OmNhbGNXaWR0aCgpCiAgICAgfQogCiAg
ICAgaWYgKGNvbnRhaW5lcldpZHRoICYmIGNvbnRhaW5lcldpZHRoICE9ICh3aWR0aCgpICsgbV9t
YXJnaW5MZWZ0ICsgbV9tYXJnaW5SaWdodCkKLSAgICAgICAgICAgICYmICFpc0Zsb2F0aW5nKCkg
JiYgIWlzSW5saW5lKCkgJiYgIWNiLT5pc0ZsZXhpYmxlQm94KCkpIHsKKyAgICAgICAgICAgICYm
ICFpc0Zsb2F0aW5nKCkgJiYgKCFpc0lubGluZSgpIHx8IGlzQW5vbnltb3VzSW5saW5lQmxvY2so
KSkgJiYgIWNiLT5pc0ZsZXhpYmxlQm94KCkpIHsKICAgICAgICAgaWYgKGNiLT5zdHlsZSgpLT5k
aXJlY3Rpb24oKSA9PSBMVFIpCiAgICAgICAgICAgICBtX21hcmdpblJpZ2h0ID0gY29udGFpbmVy
V2lkdGggLSB3aWR0aCgpIC0gbV9tYXJnaW5MZWZ0OwogICAgICAgICBlbHNlCkBAIC0xMzczLDcg
KzEzNzMsNyBAQCBib29sIFJlbmRlckJveDo6c2l6ZXNUb0ludHJpbnNpY1dpZHRoKFdpCiB7CiAg
ICAgLy8gTWFycXVlZXMgaW4gV2luSUUgYXJlIGxpa2UgYSBtaXh0dXJlIG9mIGJsb2NrcyBhbmQg
aW5saW5lLWJsb2Nrcy4gIFRoZXkgc2l6ZSBhcyB0aG91Z2ggdGhleSdyZSBibG9ja3MsCiAgICAg
Ly8gYnV0IHRoZXkgYWxsb3cgdGV4dCB0byBzaXQgb24gdGhlIHNhbWUgbGluZSBhcyB0aGUgbWFy
cXVlZS4KLSAgICBpZiAoaXNGbG9hdGluZygpIHx8IChpc0lubGluZUJsb2NrT3JJbmxpbmVUYWJs
ZSgpICYmICFpc0hUTUxNYXJxdWVlKCkpKQorICAgIGlmIChpc0Zsb2F0aW5nKCkgfHwgKGlzSW5s
aW5lQmxvY2tPcklubGluZVRhYmxlKCkgJiYgIWlzSFRNTE1hcnF1ZWUoKSAmJiAhaXNBbm9ueW1v
dXNJbmxpbmVCbG9jaygpKSkKICAgICAgICAgcmV0dXJuIHRydWU7CiAKICAgICAvLyBUaGlzIGNv
ZGUgbWF5IGxvb2sgYSBiaXQgc3RyYW5nZS4gIEJhc2ljYWxseSB3aWR0aDppbnRyaW5zaWMgc2hv
dWxkIGNsYW1wIHRoZSBzaXplIHdoZW4gdGVzdGluZyBib3RoCkBAIC0yODE5LDcgKzI4MTksNyBA
QCBib29sIFJlbmRlckJveDo6c2hyaW5rVG9Bdm9pZEZsb2F0cygpIGNvCiAKIGJvb2wgUmVuZGVy
Qm94Ojphdm9pZHNGbG9hdHMoKSBjb25zdAogewotICAgIHJldHVybiBpc1JlcGxhY2VkKCkgfHwg
aGFzT3ZlcmZsb3dDbGlwKCkgfHwgaXNIUigpOworICAgIHJldHVybiAhaXNBbm9ueW1vdXNJbmxp
bmVCbG9jaygpICYmIChpc1JlcGxhY2VkKCkgfHwgaGFzT3ZlcmZsb3dDbGlwKCkgfHwgaXNIUigp
KTsKIH0KIAogdm9pZCBSZW5kZXJCb3g6OmFkZFNoYWRvd092ZXJmbG93KCkKSW5kZXg6IFdlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlckJveE1vZGVsT2JqZWN0LmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL3JlbmRlcmluZy9SZW5kZXJCb3hNb2RlbE9iamVjdC5jcHAJKHJldmlzaW9uIDU0NjY0KQor
KysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQm94TW9kZWxPYmplY3QuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC01MTEsOCArNTExLDkgQEAgdm9pZCBSZW5kZXJCb3hNb2RlbE9iamVjdDo6cGFpbnRG
aWxsTGF5ZQogICAgICAgICAvLyBOb3cgYWRkIHRoZSB0ZXh0IHRvIHRoZSBjbGlwLiAgV2UgZG8g
dGhpcyBieSBwYWludGluZyB1c2luZyBhIHNwZWNpYWwgcGFpbnQgcGhhc2UgdGhhdCBzaWduYWxz
IHRvCiAgICAgICAgIC8vIElubGluZVRleHRCb3hlcyB0aGF0IHRoZXkgc2hvdWxkIGp1c3QgYWRk
IHRoZWlyIGNvbnRlbnRzIHRvIHRoZSBjbGlwLgogICAgICAgICBQYWludEluZm8gaW5mbyhtYXNr
SW1hZ2VDb250ZXh0LCBtYXNrUmVjdCwgUGFpbnRQaGFzZVRleHRDbGlwLCB0cnVlLCAwLCAwKTsK
KyAgICAgICAgTGluZUJveFBhaW50SW5mbyBsaW5lQm94SW5mbzsKICAgICAgICAgaWYgKGJveCkK
LSAgICAgICAgICAgIGJveC0+cGFpbnQoaW5mbywgdHggLSBib3gtPngoKSwgdHkgLSBib3gtPnko
KSk7CisgICAgICAgICAgICBib3gtPnBhaW50KGluZm8sIHR4IC0gYm94LT54KCksIHR5IC0gYm94
LT55KCksIGxpbmVCb3hJbmZvKTsKICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICBpbnQgeCA9
IGlzQm94KCkgPyB0b1JlbmRlckJveCh0aGlzKS0+eCgpIDogMDsKICAgICAgICAgICAgIGludCB5
ID0gaXNCb3goKSA/IHRvUmVuZGVyQm94KHRoaXMpLT55KCkgOiAwOwpJbmRleDogV2ViQ29yZS9y
ZW5kZXJpbmcvUmVuZGVySW5saW5lLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmlu
Zy9SZW5kZXJJbmxpbmUuY3BwCShyZXZpc2lvbiA1NDY2NCkKKysrIFdlYkNvcmUvcmVuZGVyaW5n
L1JlbmRlcklubGluZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ0LDcgKzQ0LDYgQEAgbmFtZXNw
YWNlIFdlYkNvcmUgewogCiBSZW5kZXJJbmxpbmU6OlJlbmRlcklubGluZShOb2RlKiBub2RlKQog
ICAgIDogUmVuZGVyQm94TW9kZWxPYmplY3Qobm9kZSkKLSAgICAsIG1fY29udGludWF0aW9uKDAp
CiAgICAgLCBtX2xpbmVIZWlnaHQoLTEpCiAgICAgLCBtX3ZlcnRpY2FsUG9zaXRpb24oUG9zaXRp
b25VbmRlZmluZWQpCiB7CkBAIC01NiwxNCArNTUsNiBAQCB2b2lkIFJlbmRlcklubGluZTo6ZGVz
dHJveSgpCiAgICAgLy8gTWFrZSBzdXJlIHRvIGRlc3Ryb3kgYW5vbnltb3VzIGNoaWxkcmVuIGZp
cnN0IHdoaWxlIHRoZXkgYXJlIHN0aWxsIGNvbm5lY3RlZCB0byB0aGUgcmVzdCBvZiB0aGUgdHJl
ZSwgc28gdGhhdCB0aGV5IHdpbGwKICAgICAvLyBwcm9wZXJseSBkaXJ0eSBsaW5lIGJveGVzIHRo
YXQgdGhleSBhcmUgcmVtb3ZlZCBmcm9tLiAgRWZmZWN0cyB0aGF0IGRvIDpiZWZvcmUvOmFmdGVy
IG9ubHkgb24gaG92ZXIgY291bGQgY3Jhc2ggb3RoZXJ3aXNlLgogICAgIGNoaWxkcmVuKCktPmRl
c3Ryb3lMZWZ0b3ZlckNoaWxkcmVuKCk7Ci0KLSAgICAvLyBEZXN0cm95IG91ciBjb250aW51YXRp
b24gYmVmb3JlIGFueXRoaW5nIG90aGVyIHRoYW4gYW5vbnltb3VzIGNoaWxkcmVuLgotICAgIC8v
IFRoZSByZWFzb24gd2UgZG9uJ3QgZGVzdHJveSBpdCBiZWZvcmUgYW5vbnltb3VzIGNoaWxkcmVu
IGlzIHRoYXQgdGhleSBtYXkKLSAgICAvLyBoYXZlIGNvbnRpbnVhdGlvbnMgb2YgdGhlaXIgb3du
IHRoYXQgYXJlIGFub255bW91cyBjaGlsZHJlbiBvZiBvdXIgY29udGludWF0aW9uLgotICAgIGlm
IChtX2NvbnRpbnVhdGlvbikgewotICAgICAgICBtX2NvbnRpbnVhdGlvbi0+ZGVzdHJveSgpOwot
ICAgICAgICBtX2NvbnRpbnVhdGlvbiA9IDA7Ci0gICAgfQogICAgIAogICAgIGlmICghZG9jdW1l
bnRCZWluZ0Rlc3Ryb3llZCgpKSB7CiAgICAgICAgIGlmIChmaXJzdExpbmVCb3goKSkgewpAQCAt
OTIsMTMgKzgzLDYgQEAgdm9pZCBSZW5kZXJJbmxpbmU6OmRlc3Ryb3koKQogICAgIFJlbmRlckJv
eE1vZGVsT2JqZWN0OjpkZXN0cm95KCk7CiB9CiAKLVJlbmRlcklubGluZSogUmVuZGVySW5saW5l
OjppbmxpbmVDb250aW51YXRpb24oKSBjb25zdAotewotICAgIGlmICghbV9jb250aW51YXRpb24g
fHwgbV9jb250aW51YXRpb24tPmlzSW5saW5lKCkpCi0gICAgICAgIHJldHVybiB0b1JlbmRlcklu
bGluZShtX2NvbnRpbnVhdGlvbik7Ci0gICAgcmV0dXJuIHRvUmVuZGVyQmxvY2sobV9jb250aW51
YXRpb24pLT5pbmxpbmVDb250aW51YXRpb24oKTsKLX0KLQogdm9pZCBSZW5kZXJJbmxpbmU6OnVw
ZGF0ZUJveE1vZGVsSW5mb0Zyb21TdHlsZSgpCiB7CiAgICAgUmVuZGVyQm94TW9kZWxPYmplY3Q6
OnVwZGF0ZUJveE1vZGVsSW5mb0Zyb21TdHlsZSgpOwpAQCAtMTE0LDE5ICs5OCw2IEBAIHZvaWQg
UmVuZGVySW5saW5lOjpzdHlsZURpZENoYW5nZShTdHlsZUQKIHsKICAgICBSZW5kZXJCb3hNb2Rl
bE9iamVjdDo6c3R5bGVEaWRDaGFuZ2UoZGlmZiwgb2xkU3R5bGUpOwogCi0gICAgLy8gRW5zdXJl
IHRoYXQgYWxsIG9mIHRoZSBzcGxpdCBpbmxpbmVzIHBpY2sgdXAgdGhlIG5ldyBzdHlsZS4gV2UK
LSAgICAvLyBvbmx5IGRvIHRoaXMgaWYgd2UncmUgYW4gaW5saW5lLCBzaW5jZSB3ZSBkb24ndCB3
YW50IHRvIHByb3BhZ2F0ZQotICAgIC8vIGEgYmxvY2sncyBzdHlsZSB0byB0aGUgb3RoZXIgaW5s
aW5lcy4KLSAgICAvLyBlLmcuLCA8Zm9udD5mb28gPGg0PmdvbzwvaDQ+IG1vbzwvZm9udD4uICBU
aGUgPGZvbnQ+IGlubGluZXMgYmVmb3JlCi0gICAgLy8gYW5kIGFmdGVyIHRoZSBibG9jayBzaGFy
ZSB0aGUgc2FtZSBzdHlsZSwgYnV0IHRoZSBibG9jayBkb2Vzbid0Ci0gICAgLy8gbmVlZCB0byBw
YXNzIGl0cyBzdHlsZSBvbiB0byBhbnlvbmUgZWxzZS4KLSAgICBmb3IgKFJlbmRlcklubGluZSog
Y3VyckNvbnQgPSBpbmxpbmVDb250aW51YXRpb24oKTsgY3VyckNvbnQ7IGN1cnJDb250ID0gY3Vy
ckNvbnQtPmlubGluZUNvbnRpbnVhdGlvbigpKSB7Ci0gICAgICAgIFJlbmRlckJveE1vZGVsT2Jq
ZWN0KiBuZXh0Q29udCA9IGN1cnJDb250LT5jb250aW51YXRpb24oKTsKLSAgICAgICAgY3VyckNv
bnQtPnNldENvbnRpbnVhdGlvbigwKTsKLSAgICAgICAgY3VyckNvbnQtPnNldFN0eWxlKHN0eWxl
KCkpOwotICAgICAgICBjdXJyQ29udC0+c2V0Q29udGludWF0aW9uKG5leHRDb250KTsKLSAgICB9
Ci0KICAgICBtX2xpbmVIZWlnaHQgPSAtMTsKIAogICAgIC8vIFVwZGF0ZSBwc2V1ZG9zIGZvciA6
YmVmb3JlIGFuZCA6YWZ0ZXIgbm93LgpAQCAtMTM2LDc5ICsxMDcsNzMgQEAgdm9pZCBSZW5kZXJJ
bmxpbmU6OnN0eWxlRGlkQ2hhbmdlKFN0eWxlRAogICAgIH0KIH0KIAotdm9pZCBSZW5kZXJJbmxp
bmU6OmFkZENoaWxkKFJlbmRlck9iamVjdCogbmV3Q2hpbGQsIFJlbmRlck9iamVjdCogYmVmb3Jl
Q2hpbGQpCi17Ci0gICAgaWYgKGNvbnRpbnVhdGlvbigpKQotICAgICAgICByZXR1cm4gYWRkQ2hp
bGRUb0NvbnRpbnVhdGlvbihuZXdDaGlsZCwgYmVmb3JlQ2hpbGQpOwotICAgIHJldHVybiBhZGRD
aGlsZElnbm9yaW5nQ29udGludWF0aW9uKG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7Ci19Ci0KLXN0
YXRpYyBSZW5kZXJCb3hNb2RlbE9iamVjdCogbmV4dENvbnRpbnVhdGlvbihSZW5kZXJPYmplY3Qq
IHJlbmRlcmVyKQordm9pZCBSZW5kZXJJbmxpbmU6OmNoaWxkQmVjYW1lTm9uSW5saW5lKFJlbmRl
ck9iamVjdCogY2hpbGQpCiB7Ci0gICAgaWYgKHJlbmRlcmVyLT5pc0lubGluZSgpICYmICFyZW5k
ZXJlci0+aXNSZXBsYWNlZCgpKQotICAgICAgICByZXR1cm4gdG9SZW5kZXJJbmxpbmUocmVuZGVy
ZXIpLT5jb250aW51YXRpb24oKTsKLSAgICByZXR1cm4gdG9SZW5kZXJCbG9jayhyZW5kZXJlcikt
PmlubGluZUNvbnRpbnVhdGlvbigpOworICAgIFJlbmRlck9iamVjdCogbmV4dCA9IGNoaWxkLT5u
ZXh0U2libGluZygpOworICAgIHJlbW92ZUNoaWxkKGNoaWxkKTsKKyAgICBhZGRDaGlsZChjaGls
ZCwgbmV4dCk7CiB9CiAKLVJlbmRlckJveE1vZGVsT2JqZWN0KiBSZW5kZXJJbmxpbmU6OmNvbnRp
bnVhdGlvbkJlZm9yZShSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkKQotewotICAgIGlmIChiZWZv
cmVDaGlsZCAmJiBiZWZvcmVDaGlsZC0+cGFyZW50KCkgPT0gdGhpcykKLSAgICAgICAgcmV0dXJu
IHRoaXM7Ci0KLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogY3VyciA9IG5leHRDb250aW51YXRp
b24odGhpcyk7Ci0gICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIG5leHRUb0xhc3QgPSB0aGlzOwot
ICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBsYXN0ID0gdGhpczsKLSAgICB3aGlsZSAoY3Vycikg
ewotICAgICAgICBpZiAoYmVmb3JlQ2hpbGQgJiYgYmVmb3JlQ2hpbGQtPnBhcmVudCgpID09IGN1
cnIpIHsKLSAgICAgICAgICAgIGlmIChjdXJyLT5maXJzdENoaWxkKCkgPT0gYmVmb3JlQ2hpbGQp
Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxhc3Q7Ci0gICAgICAgICAgICByZXR1cm4gY3VycjsK
LSAgICAgICAgfQotCi0gICAgICAgIG5leHRUb0xhc3QgPSBsYXN0OwotICAgICAgICBsYXN0ID0g
Y3VycjsKLSAgICAgICAgY3VyciA9IG5leHRDb250aW51YXRpb24oY3Vycik7Ci0gICAgfQotCi0g
ICAgaWYgKCFiZWZvcmVDaGlsZCAmJiAhbGFzdC0+Zmlyc3RDaGlsZCgpKQotICAgICAgICByZXR1
cm4gbmV4dFRvTGFzdDsKLSAgICByZXR1cm4gbGFzdDsKLX0KLQotdm9pZCBSZW5kZXJJbmxpbmU6
OmFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24oUmVuZGVyT2JqZWN0KiBuZXdDaGlsZCwgUmVu
ZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCkKK3ZvaWQgUmVuZGVySW5saW5lOjphZGRDaGlsZChSZW5k
ZXJPYmplY3QqIG5ld0NoaWxkLCBSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkKQogewogICAgIC8v
IE1ha2Ugc3VyZSB3ZSBkb24ndCBhcHBlbmQgdGhpbmdzIGFmdGVyIDphZnRlci1nZW5lcmF0ZWQg
Y29udGVudCBpZiB3ZSBoYXZlIGl0LgogICAgIGlmICghYmVmb3JlQ2hpbGQgJiYgaXNBZnRlckNv
bnRlbnQobGFzdENoaWxkKCkpKQogICAgICAgICBiZWZvcmVDaGlsZCA9IGxhc3RDaGlsZCgpOwog
Ci0gICAgaWYgKCFuZXdDaGlsZC0+aXNJbmxpbmUoKSAmJiAhbmV3Q2hpbGQtPmlzRmxvYXRpbmdP
clBvc2l0aW9uZWQoKSkgewotICAgICAgICAvLyBXZSBhcmUgcGxhY2luZyBhIGJsb2NrIGluc2lk
ZSBhbiBpbmxpbmUuIFdlIGhhdmUgdG8gcGVyZm9ybSBhIHNwbGl0IG9mIHRoaXMKLSAgICAgICAg
Ly8gaW5saW5lIGludG8gY29udGludWF0aW9ucy4gIFRoaXMgaW52b2x2ZXMgY3JlYXRpbmcgYW4g
YW5vbnltb3VzIGJsb2NrIGJveCB0byBob2xkCi0gICAgICAgIC8vIHxuZXdDaGlsZHwuICBXZSB0
aGVuIG1ha2UgdGhhdCBibG9jayBib3ggYSBjb250aW51YXRpb24gb2YgdGhpcyBpbmxpbmUuICBX
ZSB0YWtlIGFsbCBvZgotICAgICAgICAvLyB0aGUgY2hpbGRyZW4gYWZ0ZXIgfGJlZm9yZUNoaWxk
fCBhbmQgcHV0IHRoZW0gaW4gYSBjbG9uZSBvZiB0aGlzIG9iamVjdC4KLSAgICAgICAgUmVmUHRy
PFJlbmRlclN0eWxlPiBuZXdTdHlsZSA9IFJlbmRlclN0eWxlOjpjcmVhdGUoKTsKLSAgICAgICAg
bmV3U3R5bGUtPmluaGVyaXRGcm9tKHN0eWxlKCkpOwotICAgICAgICBuZXdTdHlsZS0+c2V0RGlz
cGxheShCTE9DSyk7Ci0KLSAgICAgICAgUmVuZGVyQmxvY2sqIG5ld0JveCA9IG5ldyAocmVuZGVy
QXJlbmEoKSkgUmVuZGVyQmxvY2soZG9jdW1lbnQoKSAvKiBhbm9ueW1vdXMgYm94ICovKTsKLSAg
ICAgICAgbmV3Qm94LT5zZXRTdHlsZShuZXdTdHlsZS5yZWxlYXNlKCkpOwotICAgICAgICBSZW5k
ZXJCb3hNb2RlbE9iamVjdCogb2xkQ29udGludWF0aW9uID0gY29udGludWF0aW9uKCk7Ci0gICAg
ICAgIHNldENvbnRpbnVhdGlvbihuZXdCb3gpOwotCi0gICAgICAgIC8vIFNvbWVvbmUgbWF5IGhh
dmUgcHV0IGEgPHA+IGluc2lkZSBhIDxxPiwgY2F1c2luZyBhIHNwbGl0LiAgV2hlbiB0aGlzIGhh
cHBlbnMsIHRoZSA6YWZ0ZXIgY29udGVudAotICAgICAgICAvLyBoYXMgdG8gbW92ZSBpbnRvIHRo
ZSBpbmxpbmUgY29udGludWF0aW9uLiAgQ2FsbCB1cGRhdGVCZWZvcmVBZnRlckNvbnRlbnQgdG8g
ZW5zdXJlIHRoYXQgb3VyIDphZnRlcgotICAgICAgICAvLyBjb250ZW50IGdldHMgcHJvcGVybHkg
ZGVzdHJveWVkLgotICAgICAgICBib29sIGlzTGFzdENoaWxkID0gKGJlZm9yZUNoaWxkID09IGxh
c3RDaGlsZCgpKTsKLSAgICAgICAgaWYgKGRvY3VtZW50KCktPnVzZXNCZWZvcmVBZnRlclJ1bGVz
KCkpCi0gICAgICAgICAgICBjaGlsZHJlbigpLT51cGRhdGVCZWZvcmVBZnRlckNvbnRlbnQodGhp
cywgQUZURVIpOwotICAgICAgICBpZiAoaXNMYXN0Q2hpbGQgJiYgYmVmb3JlQ2hpbGQgIT0gbGFz
dENoaWxkKCkpCi0gICAgICAgICAgICBiZWZvcmVDaGlsZCA9IDA7IC8vIFdlIGRlc3Ryb3llZCB0
aGUgbGFzdCBjaGlsZCwgc28gbm93IHdlIG5lZWQgdG8gdXBkYXRlIG91ciBpbnNlcnRpb24KLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9pbnQgdG8gYmUgMC4gIEl0J3MganVzdCBh
IHN0cmFpZ2h0IGFwcGVuZCBub3cuCi0KLSAgICAgICAgc3BsaXRGbG93KGJlZm9yZUNoaWxkLCBu
ZXdCb3gsIG5ld0NoaWxkLCBvbGRDb250aW51YXRpb24pOworICAgIC8vIElmIHRoZSByZXF1ZXN0
ZWQgYmVmb3JlQ2hpbGQgaXMgbm90IG9uZSBvZiBvdXIgY2hpbGRyZW4sIHRoZW4gdGhpcyBpcyBt
b3N0IGxpa2VseSBiZWNhdXNlCisgICAgLy8gdGhlcmUgaXMgYW4gYW5vbnltb3VzIGlubGluZS1i
bG9jayBib3ggd2l0aGluIHRoaXMgb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIGJlZm9yZUNoaWxk
LiBTbworICAgIC8vIGp1c3QgaW5zZXJ0IHRoZSBjaGlsZCBpbnRvIHRoZSBhbm9ueW1vdXMgaW5s
aW5lLWJsb2NrIGJveCBpbnN0ZWFkIG9mIGhlcmUuCisgICAgLy8gQSBzZWNvbmQgcG9zc2liaWxp
dHkgaXMgdGhhdCB0aGUgYmVmb3JlQ2hpbGQgaXMgYW4gYW5vbnltb3VzIGJsb2NrIGluc2lkZSB0
aGUgYW5vbnltb3VzIGlubGluZSBibG9jay4KKyAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgaW5s
aW5lcyBhcmUgaW5zZXJ0ZWQgaW4gYmV0d2VlbiB0d28gb2YgdGhlIGFub255bW91cyBpbmxpbmUg
YmxvY2sncyBibG9jay1sZXZlbAorICAgIC8vIGNoaWxkcmVuIGFmdGVyIGl0IGhhcyBiZWVuIGNy
ZWF0ZWQuCisgICAgaWYgKGJlZm9yZUNoaWxkICYmIGJlZm9yZUNoaWxkLT5wYXJlbnQoKSAhPSB0
aGlzKSB7CisgICAgICAgIEFTU0VSVChiZWZvcmVDaGlsZC0+cGFyZW50KCkpOworICAgICAgICBB
U1NFUlQoYmVmb3JlQ2hpbGQtPnBhcmVudCgpLT5pc0Fub255bW91c0lubGluZUJsb2NrKCkgfHwg
YmVmb3JlQ2hpbGQtPnBhcmVudCgpLT5pc0Fub255bW91c0Jsb2NrKCkpOworICAgICAgICBpZiAo
YmVmb3JlQ2hpbGQtPnBhcmVudCgpLT5pc0Fub255bW91c0lubGluZUJsb2NrKCkpIHsKKyAgICAg
ICAgICAgIGlmICghbmV3Q2hpbGQtPmlzSW5saW5lKCkgfHwgKG5ld0NoaWxkLT5pc0lubGluZSgp
ICYmIGJlZm9yZUNoaWxkLT5wYXJlbnQoKS0+Zmlyc3RDaGlsZCgpICE9IGJlZm9yZUNoaWxkKSkK
KyAgICAgICAgICAgICAgICBiZWZvcmVDaGlsZC0+cGFyZW50KCktPmFkZENoaWxkKG5ld0NoaWxk
LCBiZWZvcmVDaGlsZCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYWRkQ2hp
bGQobmV3Q2hpbGQsIGJlZm9yZUNoaWxkLT5wYXJlbnQoKSk7CisgICAgICAgIH0gZWxzZSBpZiAo
YmVmb3JlQ2hpbGQtPnBhcmVudCgpLT5pc0Fub255bW91c0Jsb2NrKCkpIHsKKyAgICAgICAgICAg
IEFTU0VSVCghYmVmb3JlQ2hpbGQtPnBhcmVudCgpLT5wYXJlbnQoKSB8fCBiZWZvcmVDaGlsZC0+
cGFyZW50KCktPnBhcmVudCgpLT5pc0Fub255bW91c0lubGluZUJsb2NrKCkpOworICAgICAgICAg
ICAgQVNTRVJUKGJlZm9yZUNoaWxkLT5pc0lubGluZSgpKTsKKyAgICAgICAgICAgIGlmIChuZXdD
aGlsZC0+aXNJbmxpbmUoKSB8fCAoIW5ld0NoaWxkLT5pc0lubGluZSgpICYmIGJlZm9yZUNoaWxk
LT5wYXJlbnQoKS0+Zmlyc3RDaGlsZCgpICE9IGJlZm9yZUNoaWxkKSkKKyAgICAgICAgICAgICAg
ICBiZWZvcmVDaGlsZC0+cGFyZW50KCktPmFkZENoaWxkKG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7
CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYWRkQ2hpbGQobmV3Q2hpbGQsIGJl
Zm9yZUNoaWxkLT5wYXJlbnQoKSk7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuOwogICAgIH0K
IAorICAgIGlmICghbmV3Q2hpbGQtPmlzSW5saW5lKCkpIHsKKyAgICAgICAgLy8gV2UgYXJlIHBs
YWNpbmcgYSBibG9jayBpbnNpZGUgYW4gaW5saW5lLiBXZSBoYXZlIHRvIHBsYWNlIHRoZSBibG9j
ayBpbnNpZGUgYW4gYW5vbnltb3VzIGlubGluZS1ibG9jay4KKyAgICAgICAgLy8gVGhpcyBpbmxp
bmUtYmxvY2sgY2FuIGhvdXNlIGEgc2VxdWVuY2Ugb2YgY29udGlndW91cyBibG9jay1sZXZlbCBj
aGlsZHJlbiwgYW5kIHRoZXkgd2lsbCBhbGwgc2l0IG9uIHRoZQorICAgICAgICAvLyBzYW1lIGxp
bmUgdG9nZXRoZXIuICBXZSB0cnkgdG8gcmV1c2Ugb25lIGZpcnN0IGlmIHBvc3NpYmxlLgorICAg
ICAgICBpZiAoYmVmb3JlQ2hpbGQpIHsKKyAgICAgICAgICAgIGlmIChiZWZvcmVDaGlsZC0+cHJl
dmlvdXNTaWJsaW5nKCkgJiYgYmVmb3JlQ2hpbGQtPnByZXZpb3VzU2libGluZygpLT5pc0Fub255
bW91c0lubGluZUJsb2NrKCkpIHsKKyAgICAgICAgICAgICAgICBiZWZvcmVDaGlsZC0+cHJldmlv
dXNTaWJsaW5nKCktPmFkZENoaWxkKG5ld0NoaWxkKTsKKyAgICAgICAgICAgICAgICByZXR1cm47
CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobGFzdENo
aWxkKCkgJiYgbGFzdENoaWxkKCktPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkgeworICAgICAg
ICAgICAgICAgIGxhc3RDaGlsZCgpLT5hZGRDaGlsZChuZXdDaGlsZCk7CisgICAgICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgCisgICAgICAgIGlmICghbmV3
Q2hpbGQtPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSkgeworICAgICAgICAgICAgLy8gVGhlcmUg
d2FzIG5vIHN1aXRhYmxlIGV4aXN0aW5nIGFub255bW91cyBib3guICBDcmVhdGUgYSBuZXcgb25l
LgorICAgICAgICAgICAgUmVmUHRyPFJlbmRlclN0eWxlPiBuZXdTdHlsZSA9IFJlbmRlclN0eWxl
OjpjcmVhdGUoKTsKKyAgICAgICAgICAgIG5ld1N0eWxlLT5pbmhlcml0RnJvbShzdHlsZSgpKTsK
KyAgICAgICAgICAgIG5ld1N0eWxlLT5zZXREaXNwbGF5KElOTElORV9CTE9DSyk7CisgICAgICAg
ICAgICBSZW5kZXJCbG9jayogbmV3Qm94ID0gbmV3IChyZW5kZXJBcmVuYSgpKSBSZW5kZXJCbG9j
ayhkb2N1bWVudCgpKTsKKyAgICAgICAgICAgIG5ld0JveC0+c2V0U3R5bGUobmV3U3R5bGUpOwor
ICAgICAgICAgICAgUmVuZGVyQm94TW9kZWxPYmplY3Q6OmFkZENoaWxkKG5ld0JveCwgYmVmb3Jl
Q2hpbGQpOworICAgICAgICAgICAgbmV3Qm94LT5hZGRDaGlsZChuZXdDaGlsZCk7CisgICAgICAg
ICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKICAgICBSZW5kZXJCb3hNb2RlbE9iamVj
dDo6YWRkQ2hpbGQobmV3Q2hpbGQsIGJlZm9yZUNoaWxkKTsKIAogICAgIG5ld0NoaWxkLT5zZXRO
ZWVkc0xheW91dEFuZFByZWZXaWR0aHNSZWNhbGMoKTsKQEAgLTIyMSwxODggKzE4Niw2IEBAIFJl
bmRlcklubGluZSogUmVuZGVySW5saW5lOjpjbG9uZUlubGluZSgKICAgICByZXR1cm4gbzsKIH0K
IAotdm9pZCBSZW5kZXJJbmxpbmU6OnNwbGl0SW5saW5lcyhSZW5kZXJCbG9jayogZnJvbUJsb2Nr
LCBSZW5kZXJCbG9jayogdG9CbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
UmVuZGVyQmxvY2sqIG1pZGRsZUJsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkLCBSZW5kZXJCb3hNb2RlbE9iamVjdCogb2xkQ29u
dCkKLXsKLSAgICAvLyBDcmVhdGUgYSBjbG9uZSBvZiB0aGlzIGlubGluZS4KLSAgICBSZW5kZXJJ
bmxpbmUqIGNsb25lID0gY2xvbmVJbmxpbmUodGhpcyk7Ci0gICAgY2xvbmUtPnNldENvbnRpbnVh
dGlvbihvbGRDb250KTsKLQotICAgIC8vIE5vdyB0YWtlIGFsbCBvZiB0aGUgY2hpbGRyZW4gZnJv
bSBiZWZvcmVDaGlsZCB0byB0aGUgZW5kIGFuZCByZW1vdmUKLSAgICAvLyB0aGVtIGZyb20gfHRo
aXN8IGFuZCBwbGFjZSB0aGVtIGluIHRoZSBjbG9uZS4KLSAgICBSZW5kZXJPYmplY3QqIG8gPSBi
ZWZvcmVDaGlsZDsKLSAgICB3aGlsZSAobykgewotICAgICAgICBSZW5kZXJPYmplY3QqIHRtcCA9
IG87Ci0gICAgICAgIG8gPSB0bXAtPm5leHRTaWJsaW5nKCk7Ci0gICAgICAgIGNsb25lLT5hZGRD
aGlsZElnbm9yaW5nQ29udGludWF0aW9uKGNoaWxkcmVuKCktPnJlbW92ZUNoaWxkTm9kZSh0aGlz
LCB0bXApLCAwKTsKLSAgICAgICAgdG1wLT5zZXROZWVkc0xheW91dEFuZFByZWZXaWR0aHNSZWNh
bGMoKTsKLSAgICB9Ci0KLSAgICAvLyBIb29rIHxjbG9uZXwgdXAgYXMgdGhlIGNvbnRpbnVhdGlv
biBvZiB0aGUgbWlkZGxlIGJsb2NrLgotICAgIG1pZGRsZUJsb2NrLT5zZXRJbmxpbmVDb250aW51
YXRpb24oY2xvbmUpOwotCi0gICAgLy8gV2UgaGF2ZSBiZWVuIHJlcGFyZW50ZWQgYW5kIGFyZSBu
b3cgdW5kZXIgdGhlIGZyb21CbG9jay4gIFdlIG5lZWQKLSAgICAvLyB0byB3YWxrIHVwIG91ciBp
bmxpbmUgcGFyZW50IGNoYWluIHVudGlsIHdlIGhpdCB0aGUgY29udGFpbmluZyBibG9jay4KLSAg
ICAvLyBPbmNlIHdlIGhpdCB0aGUgY29udGFpbmluZyBibG9jayB3ZSdyZSBkb25lLgotICAgIFJl
bmRlckJveE1vZGVsT2JqZWN0KiBjdXJyID0gdG9SZW5kZXJCb3hNb2RlbE9iamVjdChwYXJlbnQo
KSk7Ci0gICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGN1cnJDaGlsZCA9IHRoaXM7Ci0gICAgCi0g
ICAgLy8gRklYTUU6IEJlY2F1c2Ugc3BsaXR0aW5nIGlzIE8obl4yKSBhcyB0YWdzIG5lc3QgcGF0
aG9sb2dpY2FsbHksIHdlIGNhcCB0aGUgZGVwdGggYXQgd2hpY2ggd2UncmUgd2lsbGluZyB0byBj
bG9uZS4KLSAgICAvLyBUaGVyZSB3aWxsIGV2ZW50dWFsbHkgYmUgYSBiZXR0ZXIgYXBwcm9hY2gg
dG8gdGhpcyBwcm9ibGVtIHRoYXQgd2lsbCBsZXQgdXMgbmVzdCB0byBhIG11Y2gKLSAgICAvLyBn
cmVhdGVyIGRlcHRoIChzZWUgYnVnemlsbGEgYnVnIDEzNDMwKSBidXQgZm9yIG5vdyB3ZSBoYXZl
IGEgbGltaXQuICBUaGlzICp3aWxsKiByZXN1bHQgaW4KLSAgICAvLyBpbmNvcnJlY3QgcmVuZGVy
aW5nLCBidXQgdGhlIGFsdGVybmF0aXZlIGlzIHRvIGhhbmcgZm9yZXZlci4KLSAgICB1bnNpZ25l
ZCBzcGxpdERlcHRoID0gMTsKLSAgICBjb25zdCB1bnNpZ25lZCBjTWF4U3BsaXREZXB0aCA9IDIw
MDsgCi0gICAgd2hpbGUgKGN1cnIgJiYgY3VyciAhPSBmcm9tQmxvY2spIHsKLSAgICAgICAgQVNT
RVJUKGN1cnItPmlzUmVuZGVySW5saW5lKCkpOwotICAgICAgICBpZiAoc3BsaXREZXB0aCA8IGNN
YXhTcGxpdERlcHRoKSB7Ci0gICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgY2xvbmUuCi0gICAg
ICAgICAgICBSZW5kZXJJbmxpbmUqIGNsb25lQ2hpbGQgPSBjbG9uZTsKLSAgICAgICAgICAgIGNs
b25lID0gY2xvbmVJbmxpbmUodG9SZW5kZXJJbmxpbmUoY3VycikpOwotCi0gICAgICAgICAgICAv
LyBJbnNlcnQgb3VyIGNoaWxkIGNsb25lIGFzIHRoZSBmaXJzdCBjaGlsZC4KLSAgICAgICAgICAg
IGNsb25lLT5hZGRDaGlsZElnbm9yaW5nQ29udGludWF0aW9uKGNsb25lQ2hpbGQsIDApOwotCi0g
ICAgICAgICAgICAvLyBIb29rIHRoZSBjbG9uZSB1cCBhcyBhIGNvbnRpbnVhdGlvbiBvZiB8Y3Vy
cnwuCi0gICAgICAgICAgICBSZW5kZXJJbmxpbmUqIGlubGluZUN1cnIgPSB0b1JlbmRlcklubGlu
ZShjdXJyKTsKLSAgICAgICAgICAgIG9sZENvbnQgPSBpbmxpbmVDdXJyLT5jb250aW51YXRpb24o
KTsKLSAgICAgICAgICAgIGlubGluZUN1cnItPnNldENvbnRpbnVhdGlvbihjbG9uZSk7Ci0gICAg
ICAgICAgICBjbG9uZS0+c2V0Q29udGludWF0aW9uKG9sZENvbnQpOwotCi0gICAgICAgICAgICAv
LyBTb21lb25lIG1heSBoYXZlIGluZGlyZWN0bHkgY2F1c2VkIGEgPHE+IHRvIHNwbGl0LiAgV2hl
biB0aGlzIGhhcHBlbnMsIHRoZSA6YWZ0ZXIgY29udGVudAotICAgICAgICAgICAgLy8gaGFzIHRv
IG1vdmUgaW50byB0aGUgaW5saW5lIGNvbnRpbnVhdGlvbi4gIENhbGwgdXBkYXRlQmVmb3JlQWZ0
ZXJDb250ZW50IHRvIGVuc3VyZSB0aGF0IHRoZSBpbmxpbmUncyA6YWZ0ZXIKLSAgICAgICAgICAg
IC8vIGNvbnRlbnQgZ2V0cyBwcm9wZXJseSBkZXN0cm95ZWQuCi0gICAgICAgICAgICBpZiAoZG9j
dW1lbnQoKS0+dXNlc0JlZm9yZUFmdGVyUnVsZXMoKSkKLSAgICAgICAgICAgICAgICBpbmxpbmVD
dXJyLT5jaGlsZHJlbigpLT51cGRhdGVCZWZvcmVBZnRlckNvbnRlbnQodGhpcywgQUZURVIpOwot
Ci0gICAgICAgICAgICAvLyBOb3cgd2UgbmVlZCB0byB0YWtlIGFsbCBvZiB0aGUgY2hpbGRyZW4g
c3RhcnRpbmcgZnJvbSB0aGUgZmlyc3QgY2hpbGQKLSAgICAgICAgICAgIC8vICphZnRlciogY3Vy
ckNoaWxkIGFuZCBhcHBlbmQgdGhlbSBhbGwgdG8gdGhlIGNsb25lLgotICAgICAgICAgICAgbyA9
IGN1cnJDaGlsZC0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgICAgIHdoaWxlIChvKSB7Ci0gICAg
ICAgICAgICAgICAgUmVuZGVyT2JqZWN0KiB0bXAgPSBvOwotICAgICAgICAgICAgICAgIG8gPSB0
bXAtPm5leHRTaWJsaW5nKCk7Ci0gICAgICAgICAgICAgICAgY2xvbmUtPmFkZENoaWxkSWdub3Jp
bmdDb250aW51YXRpb24oaW5saW5lQ3Vyci0+Y2hpbGRyZW4oKS0+cmVtb3ZlQ2hpbGROb2RlKGN1
cnIsIHRtcCksIDApOwotICAgICAgICAgICAgICAgIHRtcC0+c2V0TmVlZHNMYXlvdXRBbmRQcmVm
V2lkdGhzUmVjYWxjKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAg
ICAgIC8vIEtlZXAgd2Fsa2luZyB1cCB0aGUgY2hhaW4uCi0gICAgICAgIGN1cnJDaGlsZCA9IGN1
cnI7Ci0gICAgICAgIGN1cnIgPSB0b1JlbmRlckJveE1vZGVsT2JqZWN0KGN1cnItPnBhcmVudCgp
KTsKLSAgICAgICAgc3BsaXREZXB0aCsrOwotICAgIH0KLQotICAgIC8vIE5vdyB3ZSBhcmUgYXQg
dGhlIGJsb2NrIGxldmVsLiBXZSBuZWVkIHRvIHB1dCB0aGUgY2xvbmUgaW50byB0aGUgdG9CbG9j
ay4KLSAgICB0b0Jsb2NrLT5jaGlsZHJlbigpLT5hcHBlbmRDaGlsZE5vZGUodG9CbG9jaywgY2xv
bmUpOwotCi0gICAgLy8gTm93IHRha2UgYWxsIHRoZSBjaGlsZHJlbiBhZnRlciBjdXJyQ2hpbGQg
YW5kIHJlbW92ZSB0aGVtIGZyb20gdGhlIGZyb21CbG9jawotICAgIC8vIGFuZCBwdXQgdGhlbSBp
biB0aGUgdG9CbG9jay4KLSAgICBvID0gY3VyckNoaWxkLT5uZXh0U2libGluZygpOwotICAgIHdo
aWxlIChvKSB7Ci0gICAgICAgIFJlbmRlck9iamVjdCogdG1wID0gbzsKLSAgICAgICAgbyA9IHRt
cC0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgdG9CbG9jay0+Y2hpbGRyZW4oKS0+YXBwZW5kQ2hp
bGROb2RlKHRvQmxvY2ssIGZyb21CbG9jay0+Y2hpbGRyZW4oKS0+cmVtb3ZlQ2hpbGROb2RlKGZy
b21CbG9jaywgdG1wKSk7Ci0gICAgfQotfQotCi12b2lkIFJlbmRlcklubGluZTo6c3BsaXRGbG93
KFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQsIFJlbmRlckJsb2NrKiBuZXdCbG9ja0JveCwKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVuZGVyT2JqZWN0KiBuZXdDaGlsZCwgUmVuZGVy
Qm94TW9kZWxPYmplY3QqIG9sZENvbnQpCi17Ci0gICAgUmVuZGVyQmxvY2sqIHByZSA9IDA7Ci0g
ICAgUmVuZGVyQmxvY2sqIGJsb2NrID0gY29udGFpbmluZ0Jsb2NrKCk7Ci0gICAgCi0gICAgLy8g
RGVsZXRlIG91ciBsaW5lIGJveGVzIGJlZm9yZSB3ZSBkbyB0aGUgaW5saW5lIHNwbGl0IGludG8g
Y29udGludWF0aW9ucy4KLSAgICBibG9jay0+ZGVsZXRlTGluZUJveFRyZWUoKTsKLSAgICAKLSAg
ICBib29sIG1hZGVOZXdCZWZvcmVCbG9jayA9IGZhbHNlOwotICAgIGlmIChibG9jay0+aXNBbm9u
eW1vdXNCbG9jaygpICYmICghYmxvY2stPnBhcmVudCgpIHx8ICFibG9jay0+cGFyZW50KCktPmNy
ZWF0ZXNBbm9ueW1vdXNXcmFwcGVyKCkpKSB7Ci0gICAgICAgIC8vIFdlIGNhbiByZXVzZSB0aGlz
IGJsb2NrIGFuZCBtYWtlIGl0IHRoZSBwcmVCbG9jayBvZiB0aGUgbmV4dCBjb250aW51YXRpb24u
Ci0gICAgICAgIHByZSA9IGJsb2NrOwotICAgICAgICBwcmUtPnJlbW92ZVBvc2l0aW9uZWRPYmpl
Y3RzKDApOwotICAgICAgICBibG9jayA9IGJsb2NrLT5jb250YWluaW5nQmxvY2soKTsKLSAgICB9
IGVsc2UgewotICAgICAgICAvLyBObyBhbm9ueW1vdXMgYmxvY2sgYXZhaWxhYmxlIGZvciB1c2Uu
ICBNYWtlIG9uZS4KLSAgICAgICAgcHJlID0gYmxvY2stPmNyZWF0ZUFub255bW91c0Jsb2NrKCk7
Ci0gICAgICAgIG1hZGVOZXdCZWZvcmVCbG9jayA9IHRydWU7Ci0gICAgfQotCi0gICAgUmVuZGVy
QmxvY2sqIHBvc3QgPSBibG9jay0+Y3JlYXRlQW5vbnltb3VzQmxvY2soKTsKLQotICAgIFJlbmRl
ck9iamVjdCogYm94Rmlyc3QgPSBtYWRlTmV3QmVmb3JlQmxvY2sgPyBibG9jay0+Zmlyc3RDaGls
ZCgpIDogcHJlLT5uZXh0U2libGluZygpOwotICAgIGlmIChtYWRlTmV3QmVmb3JlQmxvY2spCi0g
ICAgICAgIGJsb2NrLT5jaGlsZHJlbigpLT5pbnNlcnRDaGlsZE5vZGUoYmxvY2ssIHByZSwgYm94
Rmlyc3QpOwotICAgIGJsb2NrLT5jaGlsZHJlbigpLT5pbnNlcnRDaGlsZE5vZGUoYmxvY2ssIG5l
d0Jsb2NrQm94LCBib3hGaXJzdCk7Ci0gICAgYmxvY2stPmNoaWxkcmVuKCktPmluc2VydENoaWxk
Tm9kZShibG9jaywgcG9zdCwgYm94Rmlyc3QpOwotICAgIGJsb2NrLT5zZXRDaGlsZHJlbklubGlu
ZShmYWxzZSk7Ci0gICAgCi0gICAgaWYgKG1hZGVOZXdCZWZvcmVCbG9jaykgewotICAgICAgICBS
ZW5kZXJPYmplY3QqIG8gPSBib3hGaXJzdDsKLSAgICAgICAgd2hpbGUgKG8pIHsKLSAgICAgICAg
ICAgIFJlbmRlck9iamVjdCogbm8gPSBvOwotICAgICAgICAgICAgbyA9IG5vLT5uZXh0U2libGlu
ZygpOwotICAgICAgICAgICAgcHJlLT5jaGlsZHJlbigpLT5hcHBlbmRDaGlsZE5vZGUocHJlLCBi
bG9jay0+Y2hpbGRyZW4oKS0+cmVtb3ZlQ2hpbGROb2RlKGJsb2NrLCBubykpOwotICAgICAgICAg
ICAgbm8tPnNldE5lZWRzTGF5b3V0QW5kUHJlZldpZHRoc1JlY2FsYygpOwotICAgICAgICB9Ci0g
ICAgfQotCi0gICAgc3BsaXRJbmxpbmVzKHByZSwgcG9zdCwgbmV3QmxvY2tCb3gsIGJlZm9yZUNo
aWxkLCBvbGRDb250KTsKLQotICAgIC8vIFdlIGFscmVhZHkga25vdyB0aGUgbmV3QmxvY2tCb3gg
aXNuJ3QgZ29pbmcgdG8gY29udGFpbiBpbmxpbmUga2lkcywgc28gYXZvaWQgd2FzdGluZwotICAg
IC8vIHRpbWUgaW4gbWFrZUNoaWxkcmVuTm9uSW5saW5lIGJ5IGp1c3Qgc2V0dGluZyB0aGlzIGV4
cGxpY2l0bHkgdXAgZnJvbnQuCi0gICAgbmV3QmxvY2tCb3gtPnNldENoaWxkcmVuSW5saW5lKGZh
bHNlKTsKLQotICAgIC8vIFdlIGRlbGF5ZWQgYWRkaW5nIHRoZSBuZXdDaGlsZCB1bnRpbCBub3cg
c28gdGhhdCB0aGUgfG5ld0Jsb2NrQm94fCB3b3VsZCBiZSBmdWxseQotICAgIC8vIGNvbm5lY3Rl
ZCwgdGh1cyBhbGxvd2luZyBuZXdDaGlsZCBhY2Nlc3MgdG8gYSByZW5kZXJBcmVuYSBzaG91bGQg
aXQgbmVlZAotICAgIC8vIHRvIHdyYXAgaXRzZWxmIGluIGFkZGl0aW9uYWwgYm94ZXMgKGUuZy4s
IHRhYmxlIGNvbnN0cnVjdGlvbikuCi0gICAgbmV3QmxvY2tCb3gtPmFkZENoaWxkKG5ld0NoaWxk
KTsKLQotICAgIC8vIEFsd2F5cyBqdXN0IGRvIGEgZnVsbCBsYXlvdXQgaW4gb3JkZXIgdG8gZW5z
dXJlIHRoYXQgbGluZSBib3hlcyAoZXNwZWNpYWxseSB3cmFwcGVycyBmb3IgaW1hZ2VzKQotICAg
IC8vIGdldCBkZWxldGVkIHByb3Blcmx5LiAgQmVjYXVzZSBvYmplY3RzIG1vdmVzIGZyb20gdGhl
IHByZSBibG9jayBpbnRvIHRoZSBwb3N0IGJsb2NrLCB3ZSB3YW50IHRvCi0gICAgLy8gbWFrZSBu
ZXcgbGluZSBib3hlcyBpbnN0ZWFkIG9mIGxlYXZpbmcgdGhlIG9sZCBsaW5lIGJveGVzIGFyb3Vu
ZC4KLSAgICBwcmUtPnNldE5lZWRzTGF5b3V0QW5kUHJlZldpZHRoc1JlY2FsYygpOwotICAgIGJs
b2NrLT5zZXROZWVkc0xheW91dEFuZFByZWZXaWR0aHNSZWNhbGMoKTsKLSAgICBwb3N0LT5zZXRO
ZWVkc0xheW91dEFuZFByZWZXaWR0aHNSZWNhbGMoKTsKLX0KLQotdm9pZCBSZW5kZXJJbmxpbmU6
OmFkZENoaWxkVG9Db250aW51YXRpb24oUmVuZGVyT2JqZWN0KiBuZXdDaGlsZCwgUmVuZGVyT2Jq
ZWN0KiBiZWZvcmVDaGlsZCkKLXsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogZmxvdyA9IGNv
bnRpbnVhdGlvbkJlZm9yZShiZWZvcmVDaGlsZCk7Ci0gICAgQVNTRVJUKCFiZWZvcmVDaGlsZCB8
fCBiZWZvcmVDaGlsZC0+cGFyZW50KCktPmlzUmVuZGVyQmxvY2soKSB8fCBiZWZvcmVDaGlsZC0+
cGFyZW50KCktPmlzUmVuZGVySW5saW5lKCkpOwotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBi
ZWZvcmVDaGlsZFBhcmVudCA9IDA7Ci0gICAgaWYgKGJlZm9yZUNoaWxkKQotICAgICAgICBiZWZv
cmVDaGlsZFBhcmVudCA9IHRvUmVuZGVyQm94TW9kZWxPYmplY3QoYmVmb3JlQ2hpbGQtPnBhcmVu
dCgpKTsKLSAgICBlbHNlIHsKLSAgICAgICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGNvbnQgPSBu
ZXh0Q29udGludWF0aW9uKGZsb3cpOwotICAgICAgICBpZiAoY29udCkKLSAgICAgICAgICAgIGJl
Zm9yZUNoaWxkUGFyZW50ID0gY29udDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYmVmb3Jl
Q2hpbGRQYXJlbnQgPSBmbG93OwotICAgIH0KLQotICAgIGlmIChuZXdDaGlsZC0+aXNGbG9hdGlu
Z09yUG9zaXRpb25lZCgpKQotICAgICAgICByZXR1cm4gYmVmb3JlQ2hpbGRQYXJlbnQtPmFkZENo
aWxkSWdub3JpbmdDb250aW51YXRpb24obmV3Q2hpbGQsIGJlZm9yZUNoaWxkKTsKLQotICAgIC8v
IEEgY29udGludWF0aW9uIGFsd2F5cyBjb25zaXN0cyBvZiB0d28gcG90ZW50aWFsIGNhbmRpZGF0
ZXM6IGFuIGlubGluZSBvciBhbiBhbm9ueW1vdXMKLSAgICAvLyBibG9jayBib3ggaG9sZGluZyBi
bG9jayBjaGlsZHJlbi4KLSAgICBib29sIGNoaWxkSW5saW5lID0gbmV3Q2hpbGQtPmlzSW5saW5l
KCk7Ci0gICAgYm9vbCBiY3BJbmxpbmUgPSBiZWZvcmVDaGlsZFBhcmVudC0+aXNJbmxpbmUoKTsK
LSAgICBib29sIGZsb3dJbmxpbmUgPSBmbG93LT5pc0lubGluZSgpOwotCi0gICAgaWYgKGZsb3cg
PT0gYmVmb3JlQ2hpbGRQYXJlbnQpCi0gICAgICAgIHJldHVybiBmbG93LT5hZGRDaGlsZElnbm9y
aW5nQ29udGludWF0aW9uKG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7Ci0gICAgZWxzZSB7Ci0gICAg
ICAgIC8vIFRoZSBnb2FsIGhlcmUgaXMgdG8gbWF0Y2ggdXAgaWYgd2UgY2FuLCBzbyB0aGF0IHdl
IGNhbiBjb2FsZXNjZSBhbmQgY3JlYXRlIHRoZQotICAgICAgICAvLyBtaW5pbWFsICMgb2YgY29u
dGludWF0aW9ucyBuZWVkZWQgZm9yIHRoZSBpbmxpbmUuCi0gICAgICAgIGlmIChjaGlsZElubGlu
ZSA9PSBiY3BJbmxpbmUpCi0gICAgICAgICAgICByZXR1cm4gYmVmb3JlQ2hpbGRQYXJlbnQtPmFk
ZENoaWxkSWdub3JpbmdDb250aW51YXRpb24obmV3Q2hpbGQsIGJlZm9yZUNoaWxkKTsKLSAgICAg
ICAgZWxzZSBpZiAoZmxvd0lubGluZSA9PSBjaGlsZElubGluZSkKLSAgICAgICAgICAgIHJldHVy
biBmbG93LT5hZGRDaGlsZElnbm9yaW5nQ29udGludWF0aW9uKG5ld0NoaWxkLCAwKTsgLy8gSnVz
dCB0cmVhdCBsaWtlIGFuIGFwcGVuZC4KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJu
IGJlZm9yZUNoaWxkUGFyZW50LT5hZGRDaGlsZElnbm9yaW5nQ29udGludWF0aW9uKG5ld0NoaWxk
LCBiZWZvcmVDaGlsZCk7Ci0gICAgfQotfQotCiB2b2lkIFJlbmRlcklubGluZTo6cGFpbnQoUGFp
bnRJbmZvJiBwYWludEluZm8sIGludCB0eCwgaW50IHR5KQogewogICAgIG1fbGluZUJveGVzLnBh
aW50KHRoaXMsIHBhaW50SW5mbywgdHgsIHR5KTsKQEAgLTQxNSwxNiArMTk4LDYgQEAgdm9pZCBS
ZW5kZXJJbmxpbmU6OmFic29sdXRlUmVjdHMoVmVjdG9yPAogICAgICAgICAgICAgcmVjdHMuYXBw
ZW5kKEludFJlY3QodHggKyBjdXJyLT54KCksIHR5ICsgY3Vyci0+eSgpLCBjdXJyLT53aWR0aCgp
LCBjdXJyLT5oZWlnaHQoKSkpOwogICAgIH0gZWxzZQogICAgICAgICByZWN0cy5hcHBlbmQoSW50
UmVjdCh0eCwgdHksIDAsIDApKTsKLQotICAgIGlmIChjb250aW51YXRpb24oKSkgewotICAgICAg
ICBpZiAoY29udGludWF0aW9uKCktPmlzQm94KCkpIHsKLSAgICAgICAgICAgIFJlbmRlckJveCog
Ym94ID0gdG9SZW5kZXJCb3goY29udGludWF0aW9uKCkpOwotICAgICAgICAgICAgY29udGludWF0
aW9uKCktPmFic29sdXRlUmVjdHMocmVjdHMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgdHggLSBjb250YWluaW5nQmxvY2soKS0+eCgpICsgYm94LT54KCksCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eSAtIGNvbnRhaW5pbmdC
bG9jaygpLT55KCkgKyBib3gtPnkoKSk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgY29u
dGludWF0aW9uKCktPmFic29sdXRlUmVjdHMocmVjdHMsIHR4IC0gY29udGFpbmluZ0Jsb2NrKCkt
PngoKSwgdHkgLSBjb250YWluaW5nQmxvY2soKS0+eSgpKTsKLSAgICB9CiB9CiAKIHZvaWQgUmVu
ZGVySW5saW5lOjphYnNvbHV0ZVF1YWRzKFZlY3RvcjxGbG9hdFF1YWQ+JiBxdWFkcykKQEAgLTQz
Niw5ICsyMDksNiBAQCB2b2lkIFJlbmRlcklubGluZTo6YWJzb2x1dGVRdWFkcyhWZWN0b3I8CiAg
ICAgICAgIH0KICAgICB9IGVsc2UKICAgICAgICAgcXVhZHMuYXBwZW5kKGxvY2FsVG9BYnNvbHV0
ZVF1YWQoRmxvYXRSZWN0KCkpKTsKLQotICAgIGlmIChjb250aW51YXRpb24oKSkKLSAgICAgICAg
Y29udGludWF0aW9uKCktPmFic29sdXRlUXVhZHMocXVhZHMpOwogfQogCiBpbnQgUmVuZGVySW5s
aW5lOjpvZmZzZXRMZWZ0KCkgY29uc3QKQEAgLTUwNywxOCArMjc3LDYgQEAgVmlzaWJsZVBvc2l0
aW9uIFJlbmRlcklubGluZTo6cG9zaXRpb25GbwogICAgICAgICAvLyBzaG91bGQgdHJ5IHRvIGZp
bmQgYSByZXN1bHQgYnkgYXNraW5nIG91ciBjb250YWluaW5nIGJsb2NrLgogICAgICAgICByZXR1
cm4gY2ItPnBvc2l0aW9uRm9yUG9pbnQocG9pbnQpOwogICAgIH0KLQotICAgIC8vIFRyYW5zbGF0
ZSB0aGUgY29vcmRzIGZyb20gdGhlIHByZS1hbm9ueW1vdXMgYmxvY2sgdG8gdGhlIHBvc3QtYW5v
bnltb3VzIGJsb2NrLgotICAgIGludCBwYXJlbnRCbG9ja1ggPSBjYi0+eCgpICsgcG9pbnQueCgp
OwotICAgIGludCBwYXJlbnRCbG9ja1kgPSBjYi0+eSgpICsgcG9pbnQueSgpOwotICAgIFJlbmRl
ckJveE1vZGVsT2JqZWN0KiBjID0gY29udGludWF0aW9uKCk7Ci0gICAgd2hpbGUgKGMpIHsKLSAg
ICAgICAgUmVuZGVyQm94KiBjb250QmxvY2sgPSBjLT5pc0lubGluZSgpID8gYy0+Y29udGFpbmlu
Z0Jsb2NrKCkgOiB0b1JlbmRlckJsb2NrKGMpOwotICAgICAgICBpZiAoYy0+aXNJbmxpbmUoKSB8
fCBjLT5maXJzdENoaWxkKCkpCi0gICAgICAgICAgICByZXR1cm4gYy0+cG9zaXRpb25Gb3JDb29y
ZGluYXRlcyhwYXJlbnRCbG9ja1ggLSBjb250QmxvY2stPngoKSwgcGFyZW50QmxvY2tZIC0gY29u
dEJsb2NrLT55KCkpOwotICAgICAgICBjID0gdG9SZW5kZXJCbG9jayhjKS0+aW5saW5lQ29udGlu
dWF0aW9uKCk7Ci0gICAgfQotICAgIAogICAgIHJldHVybiBSZW5kZXJCb3hNb2RlbE9iamVjdDo6
cG9zaXRpb25Gb3JQb2ludChwb2ludCk7CiB9CiAKQEAgLTU3MSw3ICszMjksNyBAQCBJbnRSZWN0
IFJlbmRlcklubGluZTo6Y2xpcHBlZE92ZXJmbG93UmVjCiAgICAgLy8gT25seSBydW4taW5zIGFy
ZSBhbGxvd2VkIGluIGhlcmUgZHVyaW5nIGxheW91dC4KICAgICBBU1NFUlQoIXZpZXcoKSB8fCAh
dmlldygpLT5sYXlvdXRTdGF0ZUVuYWJsZWQoKSB8fCBpc1J1bkluKCkpOwogCi0gICAgaWYgKCFm
aXJzdExpbmVCb3goKSAmJiAhY29udGludWF0aW9uKCkpCisgICAgaWYgKCFmaXJzdExpbmVCb3go
KSkKICAgICAgICAgcmV0dXJuIEludFJlY3QoKTsKIAogICAgIC8vIEZpbmQgb3VyIGxlZnRtb3N0
IHBvc2l0aW9uLgpAQCAtNjE5LDExICszNzcsNiBAQCBJbnRSZWN0IFJlbmRlcklubGluZTo6Y2xp
cHBlZE92ZXJmbG93UmVjCiAgICAgICAgICAgICAgICAgci51bml0ZShjaGlsZFJlY3QpOwogICAg
ICAgICAgICAgfQogICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbnRpbnVhdGlvbigpICYmICFj
b250aW51YXRpb24oKS0+aXNJbmxpbmUoKSkgewotICAgICAgICAgICAgSW50UmVjdCBjb250UmVj
dCA9IGNvbnRpbnVhdGlvbigpLT5yZWN0V2l0aE91dGxpbmVGb3JSZXBhaW50KHJlcGFpbnRDb250
YWluZXIsIG93KTsKLSAgICAgICAgICAgIHIudW5pdGUoY29udFJlY3QpOwotICAgICAgICB9CiAg
ICAgfQogCiAgICAgcmV0dXJuIHI7CkBAIC03OTYsNDkgKzU0OSw2IEBAIHZvaWQgUmVuZGVySW5s
aW5lOjptYXBBYnNvbHV0ZVRvTG9jYWxQb2kKICAgICAgICAgdHJhbnNmb3JtU3RhdGUubW92ZSgt
Y29udGFpbmVyT2Zmc2V0LndpZHRoKCksIC1jb250YWluZXJPZmZzZXQuaGVpZ2h0KCksIHByZXNl
cnZlM0QgPyBUcmFuc2Zvcm1TdGF0ZTo6QWNjdW11bGF0ZVRyYW5zZm9ybSA6IFRyYW5zZm9ybVN0
YXRlOjpGbGF0dGVuVHJhbnNmb3JtKTsKIH0KIAotdm9pZCBSZW5kZXJJbmxpbmU6OnVwZGF0ZURy
YWdTdGF0ZShib29sIGRyYWdPbikKLXsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdDo6dXBkYXRl
RHJhZ1N0YXRlKGRyYWdPbik7Ci0gICAgaWYgKGNvbnRpbnVhdGlvbigpKQotICAgICAgICBjb250
aW51YXRpb24oKS0+dXBkYXRlRHJhZ1N0YXRlKGRyYWdPbik7Ci19Ci0KLXZvaWQgUmVuZGVySW5s
aW5lOjpjaGlsZEJlY2FtZU5vbklubGluZShSZW5kZXJPYmplY3QqIGNoaWxkKQotewotICAgIC8v
IFdlIGhhdmUgdG8gc3BsaXQgdGhlIHBhcmVudCBmbG93LgotICAgIFJlbmRlckJsb2NrKiBuZXdC
b3ggPSBjb250YWluaW5nQmxvY2soKS0+Y3JlYXRlQW5vbnltb3VzQmxvY2soKTsKLSAgICBSZW5k
ZXJCb3hNb2RlbE9iamVjdCogb2xkQ29udGludWF0aW9uID0gY29udGludWF0aW9uKCk7Ci0gICAg
c2V0Q29udGludWF0aW9uKG5ld0JveCk7Ci0gICAgUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCA9
IGNoaWxkLT5uZXh0U2libGluZygpOwotICAgIGNoaWxkcmVuKCktPnJlbW92ZUNoaWxkTm9kZSh0
aGlzLCBjaGlsZCk7Ci0gICAgc3BsaXRGbG93KGJlZm9yZUNoaWxkLCBuZXdCb3gsIGNoaWxkLCBv
bGRDb250aW51YXRpb24pOwotfQotCi12b2lkIFJlbmRlcklubGluZTo6dXBkYXRlSGl0VGVzdFJl
c3VsdChIaXRUZXN0UmVzdWx0JiByZXN1bHQsIGNvbnN0IEludFBvaW50JiBwb2ludCkKLXsKLSAg
ICBpZiAocmVzdWx0LmlubmVyTm9kZSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBOb2RlKiBu
ID0gbm9kZSgpOwotICAgIEludFBvaW50IGxvY2FsUG9pbnQocG9pbnQpOwotICAgIGlmIChuKSB7
Ci0gICAgICAgIGlmIChpc0lubGluZUNvbnRpbnVhdGlvbigpKSB7Ci0gICAgICAgICAgICAvLyBX
ZSdyZSBpbiB0aGUgY29udGludWF0aW9uIG9mIGEgc3BsaXQgaW5saW5lLiAgQWRqdXN0IG91ciBs
b2NhbCBwb2ludCB0byBiZSBpbiB0aGUgY29vcmRpbmF0ZSBzcGFjZQotICAgICAgICAgICAgLy8g
b2YgdGhlIHByaW5jaXBhbCByZW5kZXJlcidzIGNvbnRhaW5pbmcgYmxvY2suICBUaGlzIHdpbGwg
ZW5kIHVwIGJlaW5nIHRoZSBpbm5lck5vblNoYXJlZE5vZGUuCi0gICAgICAgICAgICBSZW5kZXJC
bG9jayogZmlyc3RCbG9jayA9IG4tPnJlbmRlcmVyKCktPmNvbnRhaW5pbmdCbG9jaygpOwotICAg
ICAgICAgICAgCi0gICAgICAgICAgICAvLyBHZXQgb3VyIGNvbnRhaW5pbmcgYmxvY2suCi0gICAg
ICAgICAgICBSZW5kZXJCb3gqIGJsb2NrID0gY29udGFpbmluZ0Jsb2NrKCk7Ci0gICAgICAgICAg
ICBsb2NhbFBvaW50Lm1vdmUoYmxvY2stPngoKSAtIGZpcnN0QmxvY2stPngoKSwgYmxvY2stPnko
KSAtIGZpcnN0QmxvY2stPnkoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQuc2V0SW5u
ZXJOb2RlKG4pOwotICAgICAgICBpZiAoIXJlc3VsdC5pbm5lck5vblNoYXJlZE5vZGUoKSkKLSAg
ICAgICAgICAgIHJlc3VsdC5zZXRJbm5lck5vblNoYXJlZE5vZGUobik7Ci0gICAgICAgIHJlc3Vs
dC5zZXRMb2NhbFBvaW50KGxvY2FsUG9pbnQpOwotICAgIH0KLX0KLQogdm9pZCBSZW5kZXJJbmxp
bmU6OmRpcnR5TGluZUJveGVzKGJvb2wgZnVsbExheW91dCkKIHsKICAgICBpZiAoZnVsbExheW91
dCkKQEAgLTk1MSwyMCArNjYxLDkgQEAgdm9pZCBSZW5kZXJJbmxpbmU6OmFkZEZvY3VzUmluZ1Jl
Y3RzKFZlYwogICAgICAgICAgICAgICAgIHBvcyA9IGN1cnItPmxvY2FsVG9BYnNvbHV0ZSgpOwog
ICAgICAgICAgICAgZWxzZSBpZiAoY3Vyci0+aXNCb3goKSkKICAgICAgICAgICAgICAgICBwb3Mu
bW92ZSh0b1JlbmRlckJveChjdXJyKS0+eCgpLCB0b1JlbmRlckJveChjdXJyKS0+eSgpKTsKLSAg
ICAgICAgICAgY3Vyci0+YWRkRm9jdXNSaW5nUmVjdHMocmVjdHMsIHBvcy54KCksIHBvcy55KCkp
OworICAgICAgICAgICAgY3Vyci0+YWRkRm9jdXNSaW5nUmVjdHMocmVjdHMsIHBvcy54KCksIHBv
cy55KCkpOwogICAgICAgICB9CiAgICAgfQotCi0gICAgaWYgKGNvbnRpbnVhdGlvbigpKSB7Ci0g
ICAgICAgIGlmIChjb250aW51YXRpb24oKS0+aXNJbmxpbmUoKSkKLSAgICAgICAgICAgIGNvbnRp
bnVhdGlvbigpLT5hZGRGb2N1c1JpbmdSZWN0cyhyZWN0cywgCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgdHggLSBjb250YWluaW5nQmxvY2soKS0+eCgpICsg
Y29udGludWF0aW9uKCktPmNvbnRhaW5pbmdCbG9jaygpLT54KCksCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHkgLSBjb250YWluaW5nQmxvY2soKS0+eSgp
ICsgY29udGludWF0aW9uKCktPmNvbnRhaW5pbmdCbG9jaygpLT55KCkpOwotICAgICAgICBlbHNl
Ci0gICAgICAgICAgICBjb250aW51YXRpb24oKS0+YWRkRm9jdXNSaW5nUmVjdHMocmVjdHMsIAot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4IC0gY29udGFp
bmluZ0Jsb2NrKCktPngoKSArIHRvUmVuZGVyQm94KGNvbnRpbnVhdGlvbigpKS0+eCgpLAotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5IC0gY29udGFpbmlu
Z0Jsb2NrKCktPnkoKSArIHRvUmVuZGVyQm94KGNvbnRpbnVhdGlvbigpKS0+eSgpKTsKLSAgICB9
CiB9CiAKIHZvaWQgUmVuZGVySW5saW5lOjpwYWludE91dGxpbmUoR3JhcGhpY3NDb250ZXh0KiBn
cmFwaGljc0NvbnRleHQsIGludCB0eCwgaW50IHR5KQpAQCAtOTk2LDcgKzY5NSw4IEBAIHZvaWQg
UmVuZGVySW5saW5lOjpwYWludE91dGxpbmUoR3JhcGhpY3MKICAgICAgICAgUm9vdElubGluZUJv
eCogcm9vdCA9IGN1cnItPnJvb3QoKTsKICAgICAgICAgaW50IHRvcCA9IG1heChyb290LT5saW5l
VG9wKCksIGN1cnItPnkoKSk7CiAgICAgICAgIGludCBib3R0b20gPSBtaW4ocm9vdC0+bGluZUJv
dHRvbSgpLCBjdXJyLT55KCkgKyBjdXJyLT5oZWlnaHQoKSk7Ci0gICAgICAgIHJlY3RzLmFwcGVu
ZChJbnRSZWN0KGN1cnItPngoKSwgdG9wLCBjdXJyLT53aWR0aCgpLCBib3R0b20gLSB0b3ApKTsK
KyAgICAgICAgaWYgKGN1cnItPndpZHRoKCkgJiYgdG9wIC0gYm90dG9tKQorICAgICAgICAgICAg
cmVjdHMuYXBwZW5kKEludFJlY3QoY3Vyci0+eCgpLCB0b3AsIGN1cnItPndpZHRoKCksIGJvdHRv
bSAtIHRvcCkpOwogICAgIH0KICAgICByZWN0cy5hcHBlbmQoSW50UmVjdCgpKTsKIApJbmRleDog
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVySW5saW5lLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9y
ZW5kZXJpbmcvUmVuZGVySW5saW5lLmgJKHJldmlzaW9uIDU0NjY0KQorKysgV2ViQ29yZS9yZW5k
ZXJpbmcvUmVuZGVySW5saW5lLmgJKHdvcmtpbmcgY29weSkKQEAgLTU4LDEwICs1OCw2IEBAIHB1
YmxpYzoKIAogICAgIElubGluZUZsb3dCb3gqIGZpcnN0TGluZUJveCgpIGNvbnN0IHsgcmV0dXJu
IG1fbGluZUJveGVzLmZpcnN0TGluZUJveCgpOyB9CiAgICAgSW5saW5lRmxvd0JveCogbGFzdExp
bmVCb3goKSBjb25zdCB7IHJldHVybiBtX2xpbmVCb3hlcy5sYXN0TGluZUJveCgpOyB9Ci0KLSAg
ICBSZW5kZXJCb3hNb2RlbE9iamVjdCogY29udGludWF0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9j
b250aW51YXRpb247IH0KLQotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVEcmFnU3RhdGUoYm9vbCBk
cmFnT24pOwogICAgIAogICAgIEludFNpemUgcmVsYXRpdmVQb3NpdGlvbmVkSW5saW5lT2Zmc2V0
KGNvbnN0IFJlbmRlckJveCogY2hpbGQpIGNvbnN0OwogCkBAIC04MSw5ICs3Nyw2IEBAIHByaXZh
dGU6CiAKICAgICB2aXJ0dWFsIGJvb2wgaXNSZW5kZXJJbmxpbmUoKSBjb25zdCB7IHJldHVybiB0
cnVlOyB9CiAKLSAgICB2b2lkIGFkZENoaWxkVG9Db250aW51YXRpb24oUmVuZGVyT2JqZWN0KiBu
ZXdDaGlsZCwgUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCk7Ci0gICAgdmlydHVhbCB2b2lkIGFk
ZENoaWxkSWdub3JpbmdDb250aW51YXRpb24oUmVuZGVyT2JqZWN0KiBuZXdDaGlsZCwgUmVuZGVy
T2JqZWN0KiBiZWZvcmVDaGlsZCA9IDApOwotCiAgICAgdm9pZCBzcGxpdElubGluZXMoUmVuZGVy
QmxvY2sqIGZyb21CbG9jaywgUmVuZGVyQmxvY2sqIHRvQmxvY2ssIFJlbmRlckJsb2NrKiBtaWRk
bGVCbG9jaywKICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxk
LCBSZW5kZXJCb3hNb2RlbE9iamVjdCogb2xkQ29udCk7CiAgICAgdm9pZCBzcGxpdEZsb3coUmVu
ZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCwgUmVuZGVyQmxvY2sqIG5ld0Jsb2NrQm94LApAQCAtMTI2
LDEzICsxMTksOCBAQCBwcml2YXRlOgogCiAgICAgdmlydHVhbCBpbnQgbGluZUhlaWdodChib29s
IGZpcnN0TGluZSwgYm9vbCBpc1Jvb3RMaW5lQm94ID0gZmFsc2UpIGNvbnN0OwogCi0gICAgUmVu
ZGVySW5saW5lKiBpbmxpbmVDb250aW51YXRpb24oKSBjb25zdDsKLSAgICB2b2lkIHNldENvbnRp
bnVhdGlvbihSZW5kZXJCb3hNb2RlbE9iamVjdCogYykgeyBtX2NvbnRpbnVhdGlvbiA9IGM7IH0K
LSAgICAKICAgICB2aXJ0dWFsIHZvaWQgY2hpbGRCZWNhbWVOb25JbmxpbmUoUmVuZGVyT2JqZWN0
KiBjaGlsZCk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlSGl0VGVzdFJlc3VsdChIaXRUZXN0
UmVzdWx0JiwgY29uc3QgSW50UG9pbnQmKTsKLQogICAgIHZpcnR1YWwgdm9pZCBpbWFnZUNoYW5n
ZWQoV3JhcHBlZEltYWdlUHRyLCBjb25zdCBJbnRSZWN0KiA9IDApOwogCiAjaWYgRU5BQkxFKERB
U0hCT0FSRF9TVVBQT1JUKQpAQCAtMTQ1LDEzICsxMzMsMTAgQEAgcHJpdmF0ZToKICAgICBzdGF0
aWMgUmVuZGVySW5saW5lKiBjbG9uZUlubGluZShSZW5kZXJJbmxpbmUqIHNyYyk7CiAKICAgICB2
b2lkIHBhaW50T3V0bGluZUZvckxpbmUoR3JhcGhpY3NDb250ZXh0KiwgaW50IHR4LCBpbnQgdHks
IGNvbnN0IEludFJlY3QmIHByZXZMaW5lLCBjb25zdCBJbnRSZWN0JiB0aGlzTGluZSwgY29uc3Qg
SW50UmVjdCYgbmV4dExpbmUpOwotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBjb250aW51YXRp
b25CZWZvcmUoUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCk7CiAKICAgICBSZW5kZXJPYmplY3RD
aGlsZExpc3QgbV9jaGlsZHJlbjsKICAgICBSZW5kZXJMaW5lQm94TGlzdCBtX2xpbmVCb3hlczsg
ICAvLyBBbGwgb2YgdGhlIGxpbmUgYm94ZXMgY3JlYXRlZCBmb3IgdGhpcyBpbmxpbmUgZmxvdy4g
IEZvciBleGFtcGxlLCA8aT5IZWxsbzxicj53b3JsZC48L2k+IHdpbGwgaGF2ZSB0d28gPGk+IGxp
bmUgYm94ZXMuCiAKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogbV9jb250aW51YXRpb247IC8v
IENhbiBiZSBlaXRoZXIgYSBibG9jayBvciBhbiBpbmxpbmUuIDxiPjxpPjxwPkhlbGxvPC9wPjwv
aT48L2I+LiBJbiB0aGlzIGV4YW1wbGUgdGhlIDxpPiB3aWxsIGhhdmUgYSBibG9jayBhcyBpdHMg
Y29udGludWF0aW9uIGJ1dCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIC8vIDxiPiB3aWxsIGp1c3QgaGF2ZSBhbiBpbmxpbmUgYXMgaXRzIGNvbnRpbnVhdGlv
bi4KICAgICBtdXRhYmxlIGludCBtX2xpbmVIZWlnaHQ7CiAgICAgbXV0YWJsZSBpbnQgbV92ZXJ0
aWNhbFBvc2l0aW9uOwogfTsKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckxpbmVCb3hM
aXN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMaW5lQm94TGlz
dC5jcHAJKHJldmlzaW9uIDU0NjY0KQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGluZUJv
eExpc3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNDYsMTIgKzE0Niw2IEBAIHZvaWQgUmVuZGVy
TGluZUJveExpc3Q6OmRpcnR5TGluZUJveGVzKCkKIAogdm9pZCBSZW5kZXJMaW5lQm94TGlzdDo6
cGFpbnQoUmVuZGVyQm94TW9kZWxPYmplY3QqIHJlbmRlcmVyLCBSZW5kZXJPYmplY3Q6OlBhaW50
SW5mbyYgcGFpbnRJbmZvLCBpbnQgdHgsIGludCB0eSkgY29uc3QKIHsKLSAgICAvLyBPbmx5IHBh
aW50IGR1cmluZyB0aGUgZm9yZWdyb3VuZC9zZWxlY3Rpb24gcGhhc2VzLgotICAgIGlmIChwYWlu
dEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZUZvcmVncm91bmQgJiYgcGFpbnRJbmZvLnBoYXNlICE9
IFBhaW50UGhhc2VTZWxlY3Rpb24gJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VPdXRs
aW5lIAotICAgICAgICAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZVNlbGZPdXRsaW5l
ICYmIHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlQ2hpbGRPdXRsaW5lcyAmJiBwYWludElu
Zm8ucGhhc2UgIT0gUGFpbnRQaGFzZVRleHRDbGlwCi0gICAgICAgICYmIHBhaW50SW5mby5waGFz
ZSAhPSBQYWludFBoYXNlTWFzaykKLSAgICAgICAgcmV0dXJuOwotCiAgICAgQVNTRVJUKHJlbmRl
cmVyLT5pc1JlbmRlckJsb2NrKCkgfHwgKHJlbmRlcmVyLT5pc1JlbmRlcklubGluZSgpICYmIHJl
bmRlcmVyLT5oYXNMYXllcigpKSk7IC8vIFRoZSBvbmx5IHdheSBhbiBpbmxpbmUgY291bGQgcGFp
bnQgbGlrZSB0aGlzIGlzIGlmIGl0IGhhcyBhIGxheWVyLgogCiAgICAgLy8gSWYgd2UgaGF2ZSBu
byBsaW5lcyB0aGVuIHdlIGhhdmUgbm8gd29yayB0byBkby4KQEAgLTE5NSwxMyArMTg5LDE3IEBA
IHZvaWQgUmVuZGVyTGluZUJveExpc3Q6OnBhaW50KFJlbmRlckJveE0KICAgICAgICAgICAgIH0K
ICAgICAgICAgfQogCi0gICAgICAgIGludCB0b3AgPSBtaW4oY3Vyci0+dG9wVmlzaWJsZU92ZXJm
bG93KCksIGN1cnItPnJvb3QoKS0+c2VsZWN0aW9uVG9wKCkpIC0gcmVuZGVyZXItPm1heGltYWxP
dXRsaW5lU2l6ZShpbmZvLnBoYXNlKTsKKyAgICAgICAgUm9vdElubGluZUJveCogcm9vdEJveCA9
IGN1cnItPnJvb3QoKTsKKyAgICAgICAgaW50IHRvcCA9IG1pbihjdXJyLT50b3BWaXNpYmxlT3Zl
cmZsb3coKSwgcm9vdEJveC0+c2VsZWN0aW9uVG9wKCkpIC0gcmVuZGVyZXItPm1heGltYWxPdXRs
aW5lU2l6ZShpbmZvLnBoYXNlKTsKICAgICAgICAgaW50IGJvdHRvbSA9IGN1cnItPmJvdHRvbVZp
c2libGVPdmVyZmxvdygpICsgcmVuZGVyZXItPm1heGltYWxPdXRsaW5lU2l6ZShpbmZvLnBoYXNl
KTsKICAgICAgICAgaCA9IGJvdHRvbSAtIHRvcDsKICAgICAgICAgeVBvcyA9IHR5ICsgdG9wOwog
ICAgICAgICB2LT5zZXRNaW5pbXVtQ29sdW1uSGVpZ2h0KGgpOwotICAgICAgICBpZiAoeVBvcyA8
IGluZm8ucmVjdC5ib3R0b20oKSAmJiB5UG9zICsgaCA+IGluZm8ucmVjdC55KCkpCi0gICAgICAg
ICAgICBjdXJyLT5wYWludChpbmZvLCB0eCwgdHkpOworICAgICAgICBpZiAoeVBvcyA8IGluZm8u
cmVjdC5ib3R0b20oKSAmJiB5UG9zICsgaCA+IGluZm8ucmVjdC55KCkpIHsKKyAgICAgICAgICAg
IExpbmVCb3hQYWludEluZm8gbGluZUJveFBhaW50SW5mbzsKKyAgICAgICAgICAgIGxpbmVCb3hQ
YWludEluZm8uYW5vbnltb3VzSW5saW5lQmxvY2sgPSByb290Qm94LT5hbm9ueW1vdXNJbmxpbmVC
bG9jaygpOworICAgICAgICAgICAgY3Vyci0+cGFpbnQoaW5mbywgdHgsIHR5LCBsaW5lQm94UGFp
bnRJbmZvKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChpbmZvLnBoYXNlID09IFBhaW50
UGhhc2VPdXRsaW5lIHx8IGluZm8ucGhhc2UgPT0gUGFpbnRQaGFzZVNlbGZPdXRsaW5lIHx8IGlu
Zm8ucGhhc2UgPT0gUGFpbnRQaGFzZUNoaWxkT3V0bGluZXMpIHsKQEAgLTIxNyw5ICsyMTUsNiBA
QCB2b2lkIFJlbmRlckxpbmVCb3hMaXN0OjpwYWludChSZW5kZXJCb3hNCiAKIGJvb2wgUmVuZGVy
TGluZUJveExpc3Q6OmhpdFRlc3QoUmVuZGVyQm94TW9kZWxPYmplY3QqIHJlbmRlcmVyLCBjb25z
dCBIaXRUZXN0UmVxdWVzdCYgcmVxdWVzdCwgSGl0VGVzdFJlc3VsdCYgcmVzdWx0LCBpbnQgeCwg
aW50IHksIGludCB0eCwgaW50IHR5LCBIaXRUZXN0QWN0aW9uIGhpdFRlc3RBY3Rpb24pIGNvbnN0
CiB7Ci0gICAgaWYgKGhpdFRlc3RBY3Rpb24gIT0gSGl0VGVzdEZvcmVncm91bmQpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLQogICAgIEFTU0VSVChyZW5kZXJlci0+aXNSZW5kZXJCbG9jaygpIHx8
IChyZW5kZXJlci0+aXNSZW5kZXJJbmxpbmUoKSAmJiByZW5kZXJlci0+aGFzTGF5ZXIoKSkpOyAv
LyBUaGUgb25seSB3YXkgYW4gaW5saW5lIGNvdWxkIGhpdCB0ZXN0IGxpa2UgdGhpcyBpcyBpZiBp
dCBoYXMgYSBsYXllci4KIAogICAgIC8vIElmIHdlIGhhdmUgbm8gbGluZXMgdGhlbiB3ZSBoYXZl
IG5vIHdvcmsgdG8gZG8uCkBAIC0yMzAsMjIgKzIyNSwzNSBAQCBib29sIFJlbmRlckxpbmVCb3hM
aXN0OjpoaXRUZXN0KFJlbmRlckJvCiAgICAgLy8gY29udGFpbiB0aGUgcG9pbnQuICBUaGlzIGlz
IGEgcXVpY2sgc2hvcnQtY2lyY3VpdCB0aGF0IHdlIGNhbiB0YWtlIHRvIGF2b2lkIHdhbGtpbmcg
YW55IGxpbmVzLgogICAgIC8vIEZJWE1FOiBUaGlzIGNoZWNrIGlzIGZsYXdlZCBpbiB0aGUgZm9s
bG93aW5nIGV4dHJlbWVseSBvYnNjdXJlIHdheToKICAgICAvLyBpZiBzb21lIGxpbmUgaW4gdGhl
IG1pZGRsZSBoYXMgYSBodWdlIG92ZXJmbG93LCBpdCBtaWdodCBhY3R1YWxseSBleHRlbmQgYmVs
b3cgdGhlIGxhc3QgbGluZS4KLSAgICBpZiAoKHkgPj0gdHkgKyBsYXN0TGluZUJveCgpLT5yb290
KCktPmJvdHRvbVZpc2libGVPdmVyZmxvdygpKSB8fCAoeSA8IHR5ICsgZmlyc3RMaW5lQm94KCkt
PnJvb3QoKS0+dG9wVmlzaWJsZU92ZXJmbG93KCkpKQorICAgIFJvb3RJbmxpbmVCb3gqIGZpcnN0
Um9vdCA9IGZpcnN0TGluZUJveCgpLT5yb290KCk7CisgICAgUm9vdElubGluZUJveCogbGFzdFJv
b3QgPSBsYXN0TGluZUJveCgpLT5yb290KCk7CisgICAgaW50IHRvcCA9IGZpcnN0Um9vdC0+dG9w
VmlzaWJsZU92ZXJmbG93KCk7CisgICAgaW50IGJvdHRvbSA9IGxhc3RSb290LT5ib3R0b21WaXNp
YmxlT3ZlcmZsb3coKTsKKyAgICBpZiAobGFzdFJvb3QtPmhhc0Fub255bW91c0lubGluZUJsb2Nr
KCkpCisgICAgICAgIGJvdHRvbSA9IG1heChib3R0b20sIGJvdHRvbSArIGxhc3RSb290LT5hbm9u
eW1vdXNJbmxpbmVCbG9jaygpLT5jb2xsYXBzZWRNYXJnaW5Cb3R0b20oKSk7CisgICAgaWYgKGZp
cnN0Um9vdC0+aGFzQW5vbnltb3VzSW5saW5lQmxvY2soKSkKKyAgICAgICAgdG9wID0gbWluKHRv
cCwgdG9wICsgZmlyc3RSb290LT5hbm9ueW1vdXNJbmxpbmVCbG9jaygpLT5jb2xsYXBzZWRNYXJn
aW5Ub3AoKSk7CisgICAgaWYgKCh5ID49IHR5ICsgYm90dG9tKSB8fCAoeSA8IHR5ICsgdG9wKSkK
ICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgLy8gU2VlIGlmIG91ciByb290IGxpbmVzIGNv
bnRhaW4gdGhlIHBvaW50LiAgSWYgc28sIHRoZW4gd2UgaGl0IHRlc3QKICAgICAvLyB0aGVtIGZ1
cnRoZXIuICBOb3RlIHRoYXQgYm94ZXMgY2FuIGVhc2lseSBvdmVybGFwLCBzbyB3ZSBjYW4ndCBt
YWtlIGFueSBhc3N1bXB0aW9ucwogICAgIC8vIGJhc2VkIG9mZiBwb3NpdGlvbnMgb2Ygb3VyIGZp
cnN0IGxpbmUgYm94IG9yIG91ciBsYXN0IGxpbmUgYm94LgogICAgIGZvciAoSW5saW5lRmxvd0Jv
eCogY3VyciA9IGxhc3RMaW5lQm94KCk7IGN1cnI7IGN1cnIgPSBjdXJyLT5wcmV2Rmxvd0JveCgp
KSB7Ci0gICAgICAgIGlmICh5ID49IHR5ICsgY3Vyci0+cm9vdCgpLT50b3BWaXNpYmxlT3ZlcmZs
b3coKSAmJiB5IDwgdHkgKyBjdXJyLT5yb290KCktPmJvdHRvbVZpc2libGVPdmVyZmxvdygpKSB7
Ci0gICAgICAgICAgICBib29sIGluc2lkZSA9IGN1cnItPm5vZGVBdFBvaW50KHJlcXVlc3QsIHJl
c3VsdCwgeCwgeSwgdHgsIHR5KTsKKyAgICAgICAgUm9vdElubGluZUJveCogY3VyclJvb3QgPSBj
dXJyLT5yb290KCk7CisgICAgICAgIGludCB0b3AgPSBjdXJyUm9vdC0+dG9wVmlzaWJsZU92ZXJm
bG93KCk7CisgICAgICAgIGludCBib3R0b20gPSBjdXJyUm9vdC0+Ym90dG9tVmlzaWJsZU92ZXJm
bG93KCk7CisgICAgICAgIGlmICh5ID49IHR5ICsgdG9wICYmIHkgPCB0eSArIGJvdHRvbSkgewor
ICAgICAgICAgICAgTGluZUJveEhpdFRlc3RJbmZvIGhpdFRlc3RJbmZvOworICAgICAgICAgICAg
aGl0VGVzdEluZm8uYW5vbnltb3VzSW5saW5lQmxvY2sgPSBjdXJyUm9vdC0+YW5vbnltb3VzSW5s
aW5lQmxvY2soKTsKKyAgICAgICAgICAgIGJvb2wgaW5zaWRlID0gY3Vyci0+bm9kZUF0UG9pbnQo
cmVxdWVzdCwgcmVzdWx0LCB4LCB5LCB0eCwgdHksIGhpdFRlc3RBY3Rpb24sIGhpdFRlc3RJbmZv
KTsKICAgICAgICAgICAgIGlmIChpbnNpZGUpIHsKICAgICAgICAgICAgICAgICByZW5kZXJlci0+
dXBkYXRlSGl0VGVzdFJlc3VsdChyZXN1bHQsIEludFBvaW50KHggLSB0eCwgeSAtIHR5KSk7CiAg
ICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAg
ICB9Ci0gICAgCisKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKQEAgLTI5Nyw2ICszMDUsMTAgQEAg
dm9pZCBSZW5kZXJMaW5lQm94TGlzdDo6ZGlydHlMaW5lc0Zyb21DaAogICAgICAgICBSb290SW5s
aW5lQm94KiBhZGphY2VudEJveDsKICAgICAgICAgYm94LT5tYXJrRGlydHkoKTsKIAorICAgICAg
ICAvLyBXZSBkb24ndCBuZWVkIHRvIGRpcnR5IGFueSBvdGhlciBsaW5lcy4KKyAgICAgICAgaWYg
KGJveC0+aGFzQW5vbnltb3VzSW5saW5lQmxvY2soKSkKKyAgICAgICAgICAgIHJldHVybjsKKwog
ICAgICAgICAvLyBkaXJ0eSB0aGUgYWRqYWNlbnQgbGluZXMgdGhhdCBtaWdodCBiZSBhZmZlY3Rl
ZAogICAgICAgICAvLyBOT1RFOiB3ZSBkaXJ0eSB0aGUgcHJldmlvdXMgbGluZSBiZWNhdXNlIFJv
b3RJbmxpbmVCb3ggb2JqZWN0cyBjYWNoZQogICAgICAgICAvLyB0aGUgYWRkcmVzcyBvZiB0aGUg
Zmlyc3Qgb2JqZWN0IG9uIHRoZSBuZXh0IGxpbmUgYWZ0ZXIgYSBCUiwgd2hpY2ggd2UgbWF5IGJl
CkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMaXN0SXRlbS5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGlzdEl0ZW0uY3BwCShyZXZpc2lvbiA1NDY2NCkK
KysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckxpc3RJdGVtLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMjcsNiArMjcsOCBAQAogI2luY2x1ZGUgIkNhY2hlZEltYWdlLmgiCiAjaW5jbHVkZSAiSFRN
TE5hbWVzLmgiCiAjaW5jbHVkZSAiSFRNTE9MaXN0RWxlbWVudC5oIgorI2luY2x1ZGUgIklubGlu
ZUl0ZXJhdG9yLmgiCisKICNpbmNsdWRlICJSZW5kZXJMaXN0TWFya2VyLmgiCiAjaW5jbHVkZSAi
UmVuZGVyVmlldy5oIgogI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KQEAgLTE1MywxOCAr
MTU1LDQ0IEBAIGJvb2wgUmVuZGVyTGlzdEl0ZW06OmlzRW1wdHkoKSBjb25zdAogICAgIHJldHVy
biBsYXN0Q2hpbGQoKSA9PSBtX21hcmtlcjsKIH0KIAotc3RhdGljIFJlbmRlck9iamVjdCogZ2V0
UGFyZW50T2ZGaXJzdExpbmVCb3goUmVuZGVyQmxvY2sqIGN1cnIsIFJlbmRlck9iamVjdCogbWFy
a2VyKQordm9pZCBSZW5kZXJMaXN0SXRlbTo6dXBkYXRlVmFsdWUoKQogewotICAgIFJlbmRlck9i
amVjdCogZmlyc3RDaGlsZCA9IGN1cnItPmZpcnN0Q2hpbGQoKTsKLSAgICBpZiAoIWZpcnN0Q2hp
bGQpCi0gICAgICAgIHJldHVybiAwOworICAgIGlmICghbV9oYXNFeHBsaWNpdFZhbHVlKSB7Cisg
ICAgICAgIG1faXNWYWx1ZVVwVG9EYXRlID0gZmFsc2U7CisgICAgICAgIGlmIChtX21hcmtlcikK
KyAgICAgICAgICAgIG1fbWFya2VyLT5zZXROZWVkc0xheW91dEFuZFByZWZXaWR0aHNSZWNhbGMo
KTsKKyAgICB9Cit9CiAKLSAgICBmb3IgKFJlbmRlck9iamVjdCogY3VyckNoaWxkID0gZmlyc3RD
aGlsZDsgY3VyckNoaWxkOyBjdXJyQ2hpbGQgPSBjdXJyQ2hpbGQtPm5leHRTaWJsaW5nKCkpIHsK
K3N0YXRpYyBSZW5kZXJPYmplY3QqIGZpcnN0Tm9uTWFya2VyQ2hpbGQoUmVuZGVyT2JqZWN0KiBw
YXJlbnQpCit7CisgICAgUmVuZGVyT2JqZWN0KiByZXN1bHQgPSBwYXJlbnQtPmZpcnN0Q2hpbGQo
KTsKKyAgICB3aGlsZSAocmVzdWx0ICYmIHJlc3VsdC0+aXNMaXN0TWFya2VyKCkpCisgICAgICAg
IHJlc3VsdCA9IHJlc3VsdC0+bmV4dFNpYmxpbmcoKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQor
CisKK3N0YXRpYyBSZW5kZXJCbG9jayogbGlzdE1hcmtlckxvY2F0aW9uKFJlbmRlckJsb2NrKiBi
bG9jaywgUmVuZGVyTGlzdE1hcmtlciogbWFya2VyKQoreworICAgIGZvciAoUmVuZGVyT2JqZWN0
KiBjdXJyQ2hpbGQgPSBibG9jay0+Zmlyc3RDaGlsZCgpOyBjdXJyQ2hpbGQ7IGN1cnJDaGlsZCA9
IGN1cnJDaGlsZC0+bmV4dFNpYmxpbmcoKSkgewogICAgICAgICBpZiAoY3VyckNoaWxkID09IG1h
cmtlcikKICAgICAgICAgICAgIGNvbnRpbnVlOwogCi0gICAgICAgIGlmIChjdXJyQ2hpbGQtPmlz
SW5saW5lKCkgJiYgKCFjdXJyQ2hpbGQtPmlzUmVuZGVySW5saW5lKCkgfHwgY3Vyci0+Z2VuZXJh
dGVzTGluZUJveGVzRm9ySW5saW5lQ2hpbGQoY3VyckNoaWxkKSkpCi0gICAgICAgICAgICByZXR1
cm4gY3VycjsKKyAgICAgICAgaWYgKGN1cnJDaGlsZC0+aXNJbmxpbmUoKSkgeworICAgICAgICAg
ICAgaWYgKCFjdXJyQ2hpbGQtPmlzUmVuZGVySW5saW5lKCkpCisgICAgICAgICAgICAgICAgcmV0
dXJuIGJsb2NrOworICAgICAgICAgICAgSW5saW5lSXRlcmF0b3IgaXQoYmxvY2ssIGN1cnJDaGls
ZCwgMCk7CisgICAgICAgICAgICB3aGlsZSAoIWl0LmF0RW5kKCkpIHsKKyAgICAgICAgICAgICAg
ICBpZiAoaXQub2JqLT5pc0Fub255bW91c0lubGluZUJsb2NrKCkpIHsKKyAgICAgICAgICAgICAg
ICAgICAgUmVuZGVyQmxvY2sqIGxpbmVCb3hQYXJlbnQgPSBsaXN0TWFya2VyTG9jYXRpb24odG9S
ZW5kZXJCbG9jayhpdC5vYmopLCBtYXJrZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAobGlu
ZUJveFBhcmVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsaW5lQm94UGFyZW50
OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoUmVuZGVyQmxvY2s6OnJlcXVpcmVzTGluZUJv
eChpdCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBibG9jazsKKyAgICAgICAgICAgICAg
ICBpdC5pbmNyZW1lbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCiAgICAgICAgIGlm
IChjdXJyQ2hpbGQtPmlzRmxvYXRpbmcoKSB8fCBjdXJyQ2hpbGQtPmlzUG9zaXRpb25lZCgpKQog
ICAgICAgICAgICAgY29udGludWU7CkBAIC0xNzIsNDEgKzIwMCwyNCBAQCBzdGF0aWMgUmVuZGVy
T2JqZWN0KiBnZXRQYXJlbnRPZkZpcnN0TGluCiAgICAgICAgIGlmIChjdXJyQ2hpbGQtPmlzVGFi
bGUoKSB8fCAhY3VyckNoaWxkLT5pc1JlbmRlckJsb2NrKCkpCiAgICAgICAgICAgICBicmVhazsK
IAotICAgICAgICBpZiAoY3Vyci0+aXNMaXN0SXRlbSgpICYmIGN1cnJDaGlsZC0+c3R5bGUoKS0+
aHRtbEhhY2tzKCkgJiYgY3VyckNoaWxkLT5ub2RlKCkgJiYKLSAgICAgICAgICAgIChjdXJyQ2hp
bGQtPm5vZGUoKS0+aGFzVGFnTmFtZSh1bFRhZyl8fCBjdXJyQ2hpbGQtPm5vZGUoKS0+aGFzVGFn
TmFtZShvbFRhZykpKQorICAgICAgICBpZiAoYmxvY2stPmlzTGlzdEl0ZW0oKSAmJiBjdXJyQ2hp
bGQtPnN0eWxlKCktPmh0bWxIYWNrcygpICYmIGN1cnJDaGlsZC0+bm9kZSgpICYmCisgICAgICAg
ICAgICAoY3VyckNoaWxkLT5ub2RlKCktPmhhc1RhZ05hbWUodWxUYWcpIHx8IGN1cnJDaGlsZC0+
bm9kZSgpLT5oYXNUYWdOYW1lKG9sVGFnKSkpCiAgICAgICAgICAgICBicmVhazsKIAotICAgICAg
ICBSZW5kZXJPYmplY3QqIGxpbmVCb3ggPSBnZXRQYXJlbnRPZkZpcnN0TGluZUJveCh0b1JlbmRl
ckJsb2NrKGN1cnJDaGlsZCksIG1hcmtlcik7Ci0gICAgICAgIGlmIChsaW5lQm94KQotICAgICAg
ICAgICAgcmV0dXJuIGxpbmVCb3g7CisgICAgICAgIFJlbmRlckJsb2NrKiBsaW5lQm94UGFyZW50
ID0gbGlzdE1hcmtlckxvY2F0aW9uKHRvUmVuZGVyQmxvY2soY3VyckNoaWxkKSwgbWFya2VyKTsK
KyAgICAgICAgaWYgKGxpbmVCb3hQYXJlbnQpCisgICAgICAgICAgICByZXR1cm4gbGluZUJveFBh
cmVudDsKICAgICB9CiAKICAgICByZXR1cm4gMDsKIH0KIAotdm9pZCBSZW5kZXJMaXN0SXRlbTo6
dXBkYXRlVmFsdWUoKQotewotICAgIGlmICghbV9oYXNFeHBsaWNpdFZhbHVlKSB7Ci0gICAgICAg
IG1faXNWYWx1ZVVwVG9EYXRlID0gZmFsc2U7Ci0gICAgICAgIGlmIChtX21hcmtlcikKLSAgICAg
ICAgICAgIG1fbWFya2VyLT5zZXROZWVkc0xheW91dEFuZFByZWZXaWR0aHNSZWNhbGMoKTsKLSAg
ICB9Ci19Ci0KLXN0YXRpYyBSZW5kZXJPYmplY3QqIGZpcnN0Tm9uTWFya2VyQ2hpbGQoUmVuZGVy
T2JqZWN0KiBwYXJlbnQpCi17Ci0gICAgUmVuZGVyT2JqZWN0KiByZXN1bHQgPSBwYXJlbnQtPmZp
cnN0Q2hpbGQoKTsKLSAgICB3aGlsZSAocmVzdWx0ICYmIHJlc3VsdC0+aXNMaXN0TWFya2VyKCkp
Ci0gICAgICAgIHJlc3VsdCA9IHJlc3VsdC0+bmV4dFNpYmxpbmcoKTsKLSAgICByZXR1cm4gcmVz
dWx0OwotfQotCiB2b2lkIFJlbmRlckxpc3RJdGVtOjp1cGRhdGVNYXJrZXJMb2NhdGlvbigpCiB7
CiAgICAgLy8gU2FuaXR5IGNoZWNrIHRoZSBsb2NhdGlvbiBvZiBvdXIgbWFya2VyLgogICAgIGlm
IChtX21hcmtlcikgewogICAgICAgICBSZW5kZXJPYmplY3QqIG1hcmtlclBhciA9IG1fbWFya2Vy
LT5wYXJlbnQoKTsKLSAgICAgICAgUmVuZGVyT2JqZWN0KiBsaW5lQm94UGFyZW50ID0gZ2V0UGFy
ZW50T2ZGaXJzdExpbmVCb3godGhpcywgbV9tYXJrZXIpOworICAgICAgICBSZW5kZXJPYmplY3Qq
IGxpbmVCb3hQYXJlbnQgPSBsaXN0TWFya2VyTG9jYXRpb24odGhpcywgbV9tYXJrZXIpOwogICAg
ICAgICBpZiAoIWxpbmVCb3hQYXJlbnQpIHsKICAgICAgICAgICAgIC8vIElmIHRoZSBtYXJrZXIg
aXMgY3VycmVudGx5IGNvbnRhaW5lZCBpbnNpZGUgYW4gYW5vbnltb3VzIGJveCwKICAgICAgICAg
ICAgIC8vIHRoZW4gd2UgYXJlIHRoZSBvbmx5IGl0ZW0gaW4gdGhhdCBhbm9ueW1vdXMgYm94IChz
aW5jZSBubyBsaW5lIGJveApAQCAtMjU3LDkgKzI2OCwxMSBAQCB2b2lkIFJlbmRlckxpc3RJdGVt
Ojpwb3NpdGlvbkxpc3RNYXJrZXIoCiAgICAgICAgIGludCBtYXJrZXJPbGRYID0gbV9tYXJrZXIt
PngoKTsKICAgICAgICAgaW50IHlPZmZzZXQgPSAwOwogICAgICAgICBpbnQgeE9mZnNldCA9IDA7
Ci0gICAgICAgIGZvciAoUmVuZGVyQm94KiBvID0gbV9tYXJrZXItPnBhcmVudEJveCgpOyBvICE9
IHRoaXM7IG8gPSBvLT5wYXJlbnRCb3goKSkgewotICAgICAgICAgICAgeU9mZnNldCArPSBvLT55
KCk7Ci0gICAgICAgICAgICB4T2Zmc2V0ICs9IG8tPngoKTsKKyAgICAgICAgZm9yIChSZW5kZXJP
YmplY3QqIG8gPSBtX21hcmtlci0+cGFyZW50KCk7IG8gIT0gdGhpczsgbyA9IG8tPnBhcmVudCgp
KSB7CisgICAgICAgICAgICBpZiAoby0+aXNCb3goKSkgeworICAgICAgICAgICAgICAgIHlPZmZz
ZXQgKz0gdG9SZW5kZXJCb3gobyktPnkoKTsKKyAgICAgICAgICAgICAgICB4T2Zmc2V0ICs9IHRv
UmVuZGVyQm94KG8pLT54KCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBi
b29sIGFkanVzdE92ZXJmbG93ID0gZmFsc2U7CkBAIC0yOTUsMTMgKzMwOCwxNCBAQCB2b2lkIFJl
bmRlckxpc3RJdGVtOjpwb3NpdGlvbkxpc3RNYXJrZXIoCiAKICAgICAgICAgaWYgKGFkanVzdE92
ZXJmbG93KSB7CiAgICAgICAgICAgICBJbnRSZWN0IG1hcmtlclJlY3QobWFya2VyWFBvcyArIHhP
ZmZzZXQsIHlPZmZzZXQsIG1fbWFya2VyLT53aWR0aCgpLCBtX21hcmtlci0+aGVpZ2h0KCkpOwot
ICAgICAgICAgICAgUmVuZGVyQm94KiBvID0gbV9tYXJrZXI7CisgICAgICAgICAgICBSZW5kZXJP
YmplY3QqIG8gPSBtX21hcmtlcjsKICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBv
ID0gby0+cGFyZW50Qm94KCk7CisgICAgICAgICAgICAgICAgbyA9IG8tPnBhcmVudCgpOwogICAg
ICAgICAgICAgICAgIGlmIChvLT5pc1JlbmRlckJsb2NrKCkpCiAgICAgICAgICAgICAgICAgICAg
IHRvUmVuZGVyQmxvY2sobyktPmFkZExheW91dE92ZXJmbG93KG1hcmtlclJlY3QpOwotICAgICAg
ICAgICAgICAgIG1hcmtlclJlY3QubW92ZSgtby0+eCgpLCAtby0+eSgpKTsKLSAgICAgICAgICAg
IH0gd2hpbGUgKG8gIT0gdGhpcyAmJiAhby0+aGFzU2VsZlBhaW50aW5nTGF5ZXIoKSk7CisgICAg
ICAgICAgICAgICAgaWYgKG8tPmlzQm94KCkpCisgICAgICAgICAgICAgICAgICAgIG1hcmtlclJl
Y3QubW92ZSgtdG9SZW5kZXJCb3gobyktPngoKSwgLXRvUmVuZGVyQm94KG8pLT55KCkpOworICAg
ICAgICAgICAgfSB3aGlsZSAobyAhPSB0aGlzICYmICghby0+aXNCb3goKSB8fCAhdG9SZW5kZXJC
b3gobyktPmhhc1NlbGZQYWludGluZ0xheWVyKCkpKTsgLy8gRklYTUU6IEludmVzdGlnYXRlIDxs
aT48c3BhbiBzdHlsZT0icG9zaXRpb246cmVsYXRpdmU7bGVmdDotMTAwcHgiPjxkaXY+dGV4dDwv
ZGl2Pjwvc3Bhbj48L2xpPgogICAgICAgICB9CiAgICAgfQogfQpJbmRleDogV2ViQ29yZS9yZW5k
ZXJpbmcvUmVuZGVyT2JqZWN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9S
ZW5kZXJPYmplY3QuY3BwCShyZXZpc2lvbiA1NDY2NCkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1Jl
bmRlck9iamVjdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIyMzIsOCArMjIzMiw2IEBAIHZvaWQg
UmVuZGVyT2JqZWN0OjpnZXRUZXh0RGVjb3JhdGlvbkNvbG8KICAgICAgICAgICAgIH0KICAgICAg
ICAgfQogICAgICAgICBjdXJyID0gY3Vyci0+cGFyZW50KCk7Ci0gICAgICAgIGlmIChjdXJyICYm
IGN1cnItPmlzUmVuZGVyQmxvY2soKSAmJiB0b1JlbmRlckJsb2NrKGN1cnIpLT5pbmxpbmVDb250
aW51YXRpb24oKSkKLSAgICAgICAgICAgIGN1cnIgPSB0b1JlbmRlckJsb2NrKGN1cnIpLT5pbmxp
bmVDb250aW51YXRpb24oKTsKICAgICB9IHdoaWxlIChjdXJyICYmIGRlY29yYXRpb25zICYmICgh
cXVpcmtzTW9kZSB8fCAhY3Vyci0+bm9kZSgpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgKCFjdXJyLT5ub2RlKCktPmhhc1RhZ05hbWUoYVRhZykgJiYgIWN1cnItPm5v
ZGUoKS0+aGFzVGFnTmFtZShmb250VGFnKSkpKTsKIApJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcv
UmVuZGVyT2JqZWN0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2Jq
ZWN0LmgJKHJldmlzaW9uIDU0NjY0KQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0
LmgJKHdvcmtpbmcgY29weSkKQEAgLTM2Niw3ICszNjYsMTEgQEAgcHVibGljOgogICAgIHZvaWQg
c2V0SXNBbm9ueW1vdXMoYm9vbCBiKSB7IG1faXNBbm9ueW1vdXMgPSBiOyB9CiAgICAgYm9vbCBp
c0Fub255bW91c0Jsb2NrKCkgY29uc3QKICAgICB7Ci0gICAgICAgIHJldHVybiBtX2lzQW5vbnlt
b3VzICYmIHN0eWxlKCktPmRpc3BsYXkoKSA9PSBCTE9DSyAmJiBzdHlsZSgpLT5zdHlsZVR5cGUo
KSA9PSBOT1BTRVVETyAmJiAhaXNMaXN0TWFya2VyKCk7CisgICAgICAgIHJldHVybiBtX2lzQW5v
bnltb3VzICYmIHN0eWxlKCktPmRpc3BsYXkoKSA9PSBCTE9DSyAmJiBzdHlsZSgpLT5zdHlsZVR5
cGUoKSA9PSBOT1BTRVVETyAmJiAhaXNUZXh0KCkgJiYgIWlzTGlzdE1hcmtlcigpOworICAgIH0K
KyAgICBib29sIGlzQW5vbnltb3VzSW5saW5lQmxvY2soKSBjb25zdAorICAgIHsKKyAgICAgICAg
cmV0dXJuIG1faXNBbm9ueW1vdXMgJiYgc3R5bGUoKS0+ZGlzcGxheSgpID09IElOTElORV9CTE9D
SyAmJiBzdHlsZSgpLT5zdHlsZVR5cGUoKSA9PSBOT1BTRVVETyAmJiAhaXNUZXh0KCkgJiYgIWlz
UnVieVJ1bigpICYmICFpc1J1YnlCYXNlKCk7CiAgICAgfQogICAgIGJvb2wgaXNJbmxpbmVDb250
aW51YXRpb24oKSBjb25zdCB7IHJldHVybiAobm9kZSgpID8gbm9kZSgpLT5yZW5kZXJlcigpICE9
IHRoaXMgOiBmYWxzZSkgJiYgaXNSZW5kZXJJbmxpbmUoKTsgfQogICAgIGJvb2wgaXNGbG9hdGlu
ZygpIGNvbnN0IHsgcmV0dXJuIG1fZmxvYXRpbmc7IH0KSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5n
L1JlbmRlck9iamVjdENoaWxkTGlzdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJp
bmcvUmVuZGVyT2JqZWN0Q2hpbGRMaXN0LmNwcAkocmV2aXNpb24gNTQ2NjQpCisrKyBXZWJDb3Jl
L3JlbmRlcmluZy9SZW5kZXJPYmplY3RDaGlsZExpc3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0z
MTYsMTYgKzMxNiw2IEBAIHZvaWQgUmVuZGVyT2JqZWN0Q2hpbGRMaXN0Ojp1cGRhdGVCZWZvcmUK
IAogICAgIC8vIFdoZXRoZXIgb3Igbm90IHdlIG5vdyB3YW50IGdlbmVyYXRlZCBjb250ZW50LiAg
CiAgICAgYm9vbCBuZXdDb250ZW50V2FudGVkID0gcHNldWRvRWxlbWVudFN0eWxlICYmIHBzZXVk
b0VsZW1lbnRTdHlsZS0+ZGlzcGxheSgpICE9IE5PTkU7Ci0KLSAgICAvLyBGb3IgPHE+PHAvPjwv
cT4sIGlmIHRoaXMgb2JqZWN0IGlzIHRoZSBpbmxpbmUgY29udGludWF0aW9uIG9mIHRoZSA8cT4s
IHdlIG9ubHkgd2FudCB0byBnZW5lcmF0ZQotICAgIC8vIDphZnRlciBjb250ZW50IGFuZCBub3Qg
OmJlZm9yZSBjb250ZW50LgotICAgIGlmIChuZXdDb250ZW50V2FudGVkICYmIHR5cGUgPT0gQkVG
T1JFICYmIG93bmVyLT5pc1JlbmRlcklubGluZSgpICYmIHRvUmVuZGVySW5saW5lKG93bmVyKS0+
aXNJbmxpbmVDb250aW51YXRpb24oKSkKLSAgICAgICAgbmV3Q29udGVudFdhbnRlZCA9IGZhbHNl
OwotCi0gICAgLy8gU2ltaWxhcmx5LCBpZiB3ZSdyZSB0aGUgYmVnaW5uaW5nIG9mIGEgPHE+LCBh
bmQgdGhlcmUncyBhbiBpbmxpbmUgY29udGludWF0aW9uIGZvciBvdXIgb2JqZWN0LAotICAgIC8v
IHRoZW4gd2UgZG9uJ3QgZ2VuZXJhdGUgdGhlIDphZnRlciBjb250ZW50LgotICAgIGlmIChuZXdD
b250ZW50V2FudGVkICYmIHR5cGUgPT0gQUZURVIgJiYgb3duZXItPmlzUmVuZGVySW5saW5lKCkg
JiYgdG9SZW5kZXJJbmxpbmUob3duZXIpLT5jb250aW51YXRpb24oKSkKLSAgICAgICAgbmV3Q29u
dGVudFdhbnRlZCA9IGZhbHNlOwogICAgIAogICAgIC8vIElmIHdlIGRvbid0IHdhbnQgZ2VuZXJh
dGVkIGNvbnRlbnQgYW55IGxvbmdlciwgb3IgaWYgd2UgaGF2ZSBnZW5lcmF0ZWQgY29udGVudCwg
YnV0IGl0J3Mgbm8gbG9uZ2VyCiAgICAgLy8gaWRlbnRpY2FsIHRvIHRoZSBuZXcgY29udGVudCBk
YXRhIHdlIHdhbnQgdG8gYnVpbGQgcmVuZGVyIG9iamVjdHMgZm9yLCB0aGVuIHdlIG51a2UgYWxs
CkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJSdWJ5QmFzZS5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyUnVieUJhc2UuY3BwCShyZXZpc2lvbiA1NDY2NCkK
KysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclJ1YnlCYXNlLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMTE4LDcgKzExOCw2IEBAIHZvaWQgUmVuZGVyUnVieUJhc2U6Om1vdmVCbG9ja0NoaWxkcmVu
KFIKICAgICAgICAgICAgICAgICBpZiAoY2hpbGQtPmlzQW5vbnltb3VzQmxvY2soKSkgewogICAg
ICAgICAgICAgICAgICAgICBSZW5kZXJCbG9jayogYW5vbkJsb2NrID0gdG9SZW5kZXJCbG9jayhj
aGlsZCk7CiAgICAgICAgICAgICAgICAgICAgIEFTU0VSVChhbm9uQmxvY2stPmNoaWxkcmVuSW5s
aW5lKCkpOwotICAgICAgICAgICAgICAgICAgICBBU1NFUlQoIWFub25CbG9jay0+aW5saW5lQ29u
dGludWF0aW9uKCkpOwogICAgICAgICAgICAgICAgICAgICBhbm9uQmxvY2stPm1vdmVBbGxDaGls
ZHJlblRvKHRvQmFzZSwgdG9CYXNlLT5jaGlsZHJlbigpKTsKICAgICAgICAgICAgICAgICAgICAg
YW5vbkJsb2NrLT5kZWxldGVMaW5lQm94VHJlZSgpOwogICAgICAgICAgICAgICAgICAgICBhbm9u
QmxvY2stPmRlc3Ryb3koKTsKQEAgLTE0NSw3ICsxNDQsNiBAQCB2b2lkIFJlbmRlclJ1YnlCYXNl
Ojptb3ZlQmxvY2tDaGlsZHJlbihSCiAKICAgICAgICAgICAgICAgICAgICAgUmVuZGVyQmxvY2sq
IGFub25CbG9jayA9IHRvUmVuZGVyQmxvY2soY2hpbGQpOwogICAgICAgICAgICAgICAgICAgICBB
U1NFUlQoYW5vbkJsb2NrLT5jaGlsZHJlbklubGluZSgpKTsKLSAgICAgICAgICAgICAgICAgICAg
QVNTRVJUKCFhbm9uQmxvY2stPmlubGluZUNvbnRpbnVhdGlvbigpKTsKICAgICAgICAgICAgICAg
ICAgICAgLy8gTW92ZSBpbmxpbmUgY2hpbGRyZW4gb3V0IG9mIGFub255bW91cyBibG9jay4KICAg
ICAgICAgICAgICAgICAgICAgYW5vbkJsb2NrLT5tb3ZlQWxsQ2hpbGRyZW5Ubyh0aGlzLCBjaGls
ZHJlbigpLCBhbm9uQmxvY2spOwogICAgICAgICAgICAgICAgICAgICBhbm9uQmxvY2stPmRlbGV0
ZUxpbmVCb3hUcmVlKCk7CkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9Sb290SW5saW5lQm94LmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9Sb290SW5saW5lQm94LmNwcAkocmV2
aXNpb24gNTQ2NjQpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9Sb290SW5saW5lQm94LmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgIlBhZ2UuaCIKICNpbmNsdWRl
ICJSZW5kZXJBcmVuYS5oIgogI2luY2x1ZGUgIlJlbmRlckJsb2NrLmgiCisjaW5jbHVkZSAiUmVu
ZGVyVmlldy5oIgogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCkBAIC0xNjEsOSArMTYyLDE1IEBA
IHZvaWQgUm9vdElubGluZUJveDo6cGFpbnRDdXN0b21IaWdobGlnaHQKIAogI2VuZGlmCiAKLXZv
aWQgUm9vdElubGluZUJveDo6cGFpbnQoUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5m
bywgaW50IHR4LCBpbnQgdHkpCit2b2lkIFJvb3RJbmxpbmVCb3g6OnBhaW50KFJlbmRlck9iamVj
dDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGludCB0eCwgaW50IHR5LCBMaW5lQm94UGFpbnRJbmZv
JiBsaW5lQm94UGFpbnRJbmZvKQogewotICAgIElubGluZUZsb3dCb3g6OnBhaW50KHBhaW50SW5m
bywgdHgsIHR5KTsKKyAgICAvLyBPbmx5IHBhaW50IGR1cmluZyB0aGUgZm9yZWdyb3VuZC9zZWxl
Y3Rpb24gcGhhc2VzLgorICAgIGlmIChwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZUZvcmVn
cm91bmQgJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VTZWxlY3Rpb24gJiYgcGFpbnRJ
bmZvLnBoYXNlICE9IFBhaW50UGhhc2VPdXRsaW5lIAorICAgICAgICAmJiBwYWludEluZm8ucGhh
c2UgIT0gUGFpbnRQaGFzZVNlbGZPdXRsaW5lICYmIHBhaW50SW5mby5waGFzZSAhPSBQYWludFBo
YXNlQ2hpbGRPdXRsaW5lcyAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZVRleHRDbGlw
CisgICAgICAgICYmIHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlTWFzaykKKyAgICAgICAg
cmV0dXJuOworCisgICAgSW5saW5lRmxvd0JveDo6cGFpbnQocGFpbnRJbmZvLCB0eCwgdHksIGxp
bmVCb3hQYWludEluZm8pOwogICAgIHBhaW50RWxsaXBzaXNCb3gocGFpbnRJbmZvLCB0eCwgdHkp
OwogI2lmIFBMQVRGT1JNKE1BQykKICAgICBSZW5kZXJTdHlsZSogc3R5bGVUb1VzZSA9IHJlbmRl
cmVyKCktPnN0eWxlKG1fZmlyc3RMaW5lKTsKQEAgLTE3MiwxNSArMTc5LDE4IEBAIHZvaWQgUm9v
dElubGluZUJveDo6cGFpbnQoUmVuZGVyT2JqZWN0OjoKICNlbmRpZgogfQogCi1ib29sIFJvb3RJ
bmxpbmVCb3g6Om5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiByZXF1ZXN0LCBIaXRU
ZXN0UmVzdWx0JiByZXN1bHQsIGludCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHkpCitib29sIFJv
b3RJbmxpbmVCb3g6Om5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiByZXF1ZXN0LCBI
aXRUZXN0UmVzdWx0JiByZXN1bHQsIGludCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHksIEhpdFRl
c3RBY3Rpb24gaGl0VGVzdEFjdGlvbiwgTGluZUJveEhpdFRlc3RJbmZvJiBoaXRUZXN0SW5mbykK
IHsKKyAgICBpZiAoaGl0VGVzdEFjdGlvbiAhPSBIaXRUZXN0Rm9yZWdyb3VuZCkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCiAgICAgaWYgKG1faGFzRWxsaXBzaXNCb3ggJiYgdmlzaWJsZVRvSGl0
VGVzdGluZygpKSB7Ci0gICAgICAgIGlmIChlbGxpcHNpc0JveCgpLT5ub2RlQXRQb2ludChyZXF1
ZXN0LCByZXN1bHQsIHgsIHksIHR4LCB0eSkpIHsKKyAgICAgICAgaWYgKGVsbGlwc2lzQm94KCkt
Pm5vZGVBdFBvaW50KHJlcXVlc3QsIHJlc3VsdCwgeCwgeSwgdHgsIHR5LCBoaXRUZXN0QWN0aW9u
LCBoaXRUZXN0SW5mbykpIHsKICAgICAgICAgICAgIHJlbmRlcmVyKCktPnVwZGF0ZUhpdFRlc3RS
ZXN1bHQocmVzdWx0LCBJbnRQb2ludCh4IC0gdHgsIHkgLSB0eSkpOwogICAgICAgICAgICAgcmV0
dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIElubGluZUZsb3dCb3g6Om5v
ZGVBdFBvaW50KHJlcXVlc3QsIHJlc3VsdCwgeCwgeSwgdHgsIHR5KTsKKyAgICByZXR1cm4gSW5s
aW5lRmxvd0JveDo6bm9kZUF0UG9pbnQocmVxdWVzdCwgcmVzdWx0LCB4LCB5LCB0eCwgdHksIEhp
dFRlc3RGb3JlZ3JvdW5kLCBoaXRUZXN0SW5mbyk7CiB9CiAKIHZvaWQgUm9vdElubGluZUJveDo6
YWRqdXN0UG9zaXRpb24oaW50IGR4LCBpbnQgZHkpCkBAIC0yMDQsNiArMjE0LDIzIEBAIHZvaWQg
Um9vdElubGluZUJveDo6Y2hpbGRSZW1vdmVkKElubGluZUIKIAogaW50IFJvb3RJbmxpbmVCb3g6
OnZlcnRpY2FsbHlBbGlnbkJveGVzKGludCBoZWlnaHRPZkJsb2NrKQogeworICAgIFJlbmRlckJs
b2NrKiBpbmxpbmVCbG9jayA9IGFub255bW91c0lubGluZUJsb2NrKCk7CisgICAgaWYgKGlubGlu
ZUJsb2NrKSB7CisgICAgICAgIGludCBsaW5lVG9wID0gaW5saW5lQmxvY2stPnkoKTsKKyAgICAg
ICAgaW50IGxpbmVCb3R0b20gPSBpbmxpbmVCbG9jay0+eSgpICsgaW5saW5lQmxvY2stPmhlaWdo
dCgpOworICAgICAgICBmb3IgKElubGluZUJveCogY3VyciA9IGZpcnN0Q2hpbGQoKTsgY3Vycjsg
Y3VyciA9IHN0YXRpY19jYXN0PElubGluZUZsb3dCb3gqPihjdXJyKS0+Zmlyc3RDaGlsZCgpKSB7
CisgICAgICAgICAgICBjdXJyLT5zZXRYKGlubGluZUJsb2NrLT54KCkpOworICAgICAgICAgICAg
Y3Vyci0+c2V0WShsaW5lVG9wKTsKKyAgICAgICAgICAgIGN1cnItPnNldFdpZHRoKGlubGluZUJs
b2NrLT53aWR0aCgpKTsKKyAgICAgICAgICAgIGlmIChjdXJyLT5yZW5kZXJlcigpID09IGlubGlu
ZUJsb2NrKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHNldFko
bGluZVRvcCk7CisgICAgICAgIGNvbXB1dGVWZXJ0aWNhbE92ZXJmbG93KGxpbmVUb3AsIGxpbmVC
b3R0b20sIHRydWUpOworICAgICAgICBzZXRMaW5lVG9wQm90dG9tUG9zaXRpb25zKGxpbmVUb3As
IGxpbmVCb3R0b20pOworICAgICAgICByZXR1cm4gaGVpZ2h0T2ZCbG9jazsKKyAgICB9CisgICAg
CiAgICAgaW50IG1heFBvc2l0aW9uVG9wID0gMDsKICAgICBpbnQgbWF4UG9zaXRpb25Cb3R0b20g
PSAwOwogICAgIGludCBtYXhBc2NlbnQgPSAwOwpAQCAtMjE3LDcgKzI0NCw2IEBAIGludCBSb290
SW5saW5lQm94Ojp2ZXJ0aWNhbGx5QWxpZ25Cb3hlcygKICAgICBib29sIHN0cmljdE1vZGUgPSAo
Y3VyciAmJiBjdXJyLT5kb2N1bWVudCgpLT5pblN0cmljdE1vZGUoKSk7CiAKICAgICBjb21wdXRl
TG9naWNhbEJveEhlaWdodHMobWF4UG9zaXRpb25Ub3AsIG1heFBvc2l0aW9uQm90dG9tLCBtYXhB
c2NlbnQsIG1heERlc2NlbnQsIHN0cmljdE1vZGUpOwotCiAgICAgaWYgKG1heEFzY2VudCArIG1h
eERlc2NlbnQgPCBtYXgobWF4UG9zaXRpb25Ub3AsIG1heFBvc2l0aW9uQm90dG9tKSkKICAgICAg
ICAgYWRqdXN0TWF4QXNjZW50QW5kRGVzY2VudChtYXhBc2NlbnQsIG1heERlc2NlbnQsIG1heFBv
c2l0aW9uVG9wLCBtYXhQb3NpdGlvbkJvdHRvbSk7CiAKQEAgLTMzMiw3ICszNTgsNyBAQCBJbmxp
bmVCb3gqIFJvb3RJbmxpbmVCb3g6Omxhc3RTZWxlY3RlZEJvCiBpbnQgUm9vdElubGluZUJveDo6
c2VsZWN0aW9uVG9wKCkgY29uc3QKIHsKICAgICBpbnQgc2VsZWN0aW9uVG9wID0gbV9saW5lVG9w
OwotICAgIGlmICghcHJldlJvb3RCb3goKSkKKyAgICBpZiAoIXByZXZSb290Qm94KCkgfHwgcHJl
dlJvb3RCb3goKS0+aGFzQW5vbnltb3VzSW5saW5lQmxvY2soKSkKICAgICAgICAgcmV0dXJuIHNl
bGVjdGlvblRvcDsKIAogICAgIGludCBwcmV2Qm90dG9tID0gcHJldlJvb3RCb3goKS0+c2VsZWN0
aW9uQm90dG9tKCk7CkBAIC00MzAsNCArNDU2LDI1IEBAIHZvaWQgUm9vdElubGluZUJveDo6YXR0
YWNoTGluZUJveFRvUmVuZGUKICAgICBibG9jaygpLT5saW5lQm94ZXMoKS0+YXR0YWNoTGluZUJv
eCh0aGlzKTsKIH0KIAorUmVuZGVyQmxvY2sqIFJvb3RJbmxpbmVCb3g6OmFub255bW91c0lubGlu
ZUJsb2NrKCkgY29uc3QKK3sKKyAgICBpZiAoaGFzQW5vbnltb3VzSW5saW5lQmxvY2soKSkKKyAg
ICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IFJvb3RBbm9ueW1vdXNJbmxpbmVCbG9ja0Jv
eCo+KHRoaXMpLT5pbmxpbmVCbG9jaygpOworICAgIHJldHVybiAwOworfQorCit2b2lkIFJvb3RB
bm9ueW1vdXNJbmxpbmVCbG9ja0JveDo6cGFpbnQoUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIHBh
aW50SW5mbywgaW50IHR4LCBpbnQgdHksIExpbmVCb3hQYWludEluZm8mIGxpbmVCb3hQYWludElu
Zm8pCit7CisgICAgLy8gU2tpcCB0aGUgZXh0cmEgd29yayBkb25lIGJ5IFJvb3RJbmxpbmVCb3g6
OnBhaW50LiBDYWNoZSBvdXIgYW5vbnltb3VzIGJsb2NrIGluIHRoZSBwYWludCBpbmZvIGZvciBl
YXN5CisgICAgLy8gYWNjZXNzIGFzIHdlIHJlY3VyIGludG8gdGhlIGxpbmUuCisgICAgbGluZUJv
eFBhaW50SW5mby5hbm9ueW1vdXNJbmxpbmVCbG9jayA9IG1fYW5vbnltb3VzSW5saW5lQmxvY2s7
CisgICAgSW5saW5lRmxvd0JveDo6cGFpbnQocGFpbnRJbmZvLCB0eCwgdHksIGxpbmVCb3hQYWlu
dEluZm8pOworfQorCitib29sIFJvb3RBbm9ueW1vdXNJbmxpbmVCbG9ja0JveDo6bm9kZUF0UG9p
bnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmIHJlcXVlc3QsIEhpdFRlc3RSZXN1bHQmIHJlc3VsdCwg
aW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSwgSGl0VGVzdEFjdGlvbiBoaXRUZXN0QWN0aW9u
LCBMaW5lQm94SGl0VGVzdEluZm8mIGhpdFRlc3RJbmZvKQoreworICAgIC8vIFNraXAgdGhlIGV4
dHJhIHdvcmsgZG9uZSBieSBSb290SW5saW5lQm94Ojpub2RlQXRQb2ludC4KKyAgICByZXR1cm4g
SW5saW5lRmxvd0JveDo6bm9kZUF0UG9pbnQocmVxdWVzdCwgcmVzdWx0LCB4LCB5LCB0eCwgdHks
IGhpdFRlc3RBY3Rpb24sIGhpdFRlc3RJbmZvKTsKK30KKwogfSAvLyBuYW1lc3BhY2UgV2ViQ29y
ZQpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUm9vdElubGluZUJveC5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvcmVuZGVyaW5nL1Jvb3RJbmxpbmVCb3guaAkocmV2aXNpb24gNTQ2NjQpCisrKyBX
ZWJDb3JlL3JlbmRlcmluZy9Sb290SW5saW5lQm94LmgJKHdvcmtpbmcgY29weSkKQEAgLTQwLDYg
KzQwLDcgQEAgcHVibGljOgogICAgICAgICAsIG1fbGluZUJyZWFrUG9zKDApCiAgICAgICAgICwg
bV9saW5lVG9wKDApCiAgICAgICAgICwgbV9saW5lQm90dG9tKDApCisgICAgICAgICwgbV9oYXNB
bm9ueW1vdXNJbmxpbmVCbG9jayhmYWxzZSkKICAgICB7CiAgICAgfQogCkBAIC0xMDEsOCArMTAy
LDggQEAgcHVibGljOgogICAgIHZvaWQgcGFpbnRDdXN0b21IaWdobGlnaHQoUmVuZGVyT2JqZWN0
OjpQYWludEluZm8mLCBpbnQgdHgsIGludCB0eSwgY29uc3QgQXRvbWljU3RyaW5nJiBoaWdobGln
aHRUeXBlKTsKICNlbmRpZgogCi0gICAgdmlydHVhbCB2b2lkIHBhaW50KFJlbmRlck9iamVjdDo6
UGFpbnRJbmZvJiwgaW50IHR4LCBpbnQgdHkpOwotICAgIHZpcnR1YWwgYm9vbCBub2RlQXRQb2lu
dChjb25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBpbnQsIGludCwgaW50LCBp
bnQpOworICAgIHZpcnR1YWwgdm9pZCBwYWludChSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGlu
dCB0eCwgaW50IHR5LCBMaW5lQm94UGFpbnRJbmZvJik7CisgICAgdmlydHVhbCBib29sIG5vZGVB
dFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiwgSGl0VGVzdFJlc3VsdCYsIGludCB4LCBpbnQg
eSwgaW50IHR4LCBpbnQgdHksIEhpdFRlc3RBY3Rpb24sIExpbmVCb3hIaXRUZXN0SW5mbyYpOwog
CiAgICAgYm9vbCBoYXNTZWxlY3RlZENoaWxkcmVuKCkgY29uc3QgeyByZXR1cm4gbV9oYXNTZWxl
Y3RlZENoaWxkcmVuOyB9CiAgICAgdm9pZCBzZXRIYXNTZWxlY3RlZENoaWxkcmVuKGJvb2wpOwpA
QCAtMTMyLDYgKzEzMywxMSBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCB2b2lkIGF0dGFjaExpbmVC
b3hUb1JlbmRlck9iamVjdCgpOwogICAgIHZpcnR1YWwgdm9pZCByZW1vdmVMaW5lQm94RnJvbVJl
bmRlck9iamVjdCgpOwogCisgICAgYm9vbCBoYXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpIGNvbnN0
IHsgcmV0dXJuIG1faGFzQW5vbnltb3VzSW5saW5lQmxvY2s7IH0KKyAgICB2b2lkIHNldEhhc0Fu
b255bW91c0lubGluZUJsb2NrKCkgeyBtX2hhc0Fub255bW91c0lubGluZUJsb2NrID0gdHJ1ZTsg
fQorCisgICAgUmVuZGVyQmxvY2sqIGFub255bW91c0lubGluZUJsb2NrKCkgY29uc3Q7CisKIHBy
b3RlY3RlZDoKICAgICAvLyBXaGVyZSB0aGlzIGxpbmUgZW5kZWQuICBUaGUgZXhhY3Qgb2JqZWN0
IGFuZCB0aGUgcG9zaXRpb24gd2l0aGluIHRoYXQgb2JqZWN0IGFyZSBzdG9yZWQgc28gdGhhdAog
ICAgIC8vIHdlIGNhbiBjcmVhdGUgYW4gSW5saW5lSXRlcmF0b3IgYmVnaW5uaW5nIGp1c3QgYWZ0
ZXIgdGhlIGVuZCBvZiB0aGlzIGxpbmUuCkBAIC0xNTIsNiArMTU4LDggQEAgcHJvdGVjdGVkOgog
ICAgIFdURjo6VW5pY29kZTo6RGlyZWN0aW9uIG1fbGluZUJyZWFrQmlkaVN0YXR1c0VvciA6IDU7
CiAgICAgV1RGOjpVbmljb2RlOjpEaXJlY3Rpb24gbV9saW5lQnJlYWtCaWRpU3RhdHVzTGFzdFN0
cm9uZyA6IDU7CiAgICAgV1RGOjpVbmljb2RlOjpEaXJlY3Rpb24gbV9saW5lQnJlYWtCaWRpU3Rh
dHVzTGFzdCA6IDU7CisgICAgCisgICAgYm9vbCBtX2hhc0Fub255bW91c0lubGluZUJsb2NrIDog
MTsKIH07CiAKIGlubGluZSB2b2lkIFJvb3RJbmxpbmVCb3g6OnNldExpbmVUb3BCb3R0b21Qb3Np
dGlvbnMoaW50IHRvcCwgaW50IGJvdHRvbSkgCkBAIC0xNjAsNiArMTY4LDI2IEBAIGlubGluZSB2
b2lkIFJvb3RJbmxpbmVCb3g6OnNldExpbmVUb3BCb3QKICAgICBtX2xpbmVCb3R0b20gPSBib3R0
b207IAogfQogCisvLyBGb3IgYW5vbnltb3VzIGlubGluZSBibG9jayBvYmplY3RzLgorY2xhc3Mg
Um9vdEFub255bW91c0lubGluZUJsb2NrQm94IDogcHVibGljIFJvb3RJbmxpbmVCb3gKK3sKK3B1
YmxpYzoKKyAgICBSb290QW5vbnltb3VzSW5saW5lQmxvY2tCb3goUmVuZGVyT2JqZWN0KiByb290
QmxvY2ssIFJlbmRlckJsb2NrKiBhbm9ueW1vdXNCbG9jaykKKyAgICAgICAgOiBSb290SW5saW5l
Qm94KHJvb3RCbG9jaykKKyAgICAgICAgLCBtX2Fub255bW91c0lubGluZUJsb2NrKGFub255bW91
c0Jsb2NrKQorICAgIHsKKyAgICAgICAgc2V0SGFzQW5vbnltb3VzSW5saW5lQmxvY2soKTsKKyAg
ICB9CisgICAgCisgICAgUmVuZGVyQmxvY2sqIGlubGluZUJsb2NrKCkgY29uc3QgeyByZXR1cm4g
bV9hbm9ueW1vdXNJbmxpbmVCbG9jazsgfQorICAgIAorICAgIHZpcnR1YWwgdm9pZCBwYWludChS
ZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJbmZvLCBpbnQgdHgsIGludCB0eSwgTGluZUJv
eFBhaW50SW5mbyYpOworICAgIHZpcnR1YWwgYm9vbCBub2RlQXRQb2ludChjb25zdCBIaXRUZXN0
UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBpbnQgeCwgaW50IHksIGludCB0eCwgaW50IHR5LCBI
aXRUZXN0QWN0aW9uLCBMaW5lQm94SGl0VGVzdEluZm8mKTsKKyAgICAKK3ByaXZhdGU6CisgICAg
UmVuZGVyQmxvY2sqIG1fYW5vbnltb3VzSW5saW5lQmxvY2s7Cit9OworCiB9IC8vIG5hbWVzcGFj
ZSBXZWJDb3JlCiAKICNlbmRpZiAvLyBSb290SW5saW5lQm94X2gKSW5kZXg6IFdlYkNvcmUvcmVu
ZGVyaW5nL1NWR0lubGluZVRleHRCb3guY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVy
aW5nL1NWR0lubGluZVRleHRCb3guY3BwCShyZXZpc2lvbiA1NDY2NCkKKysrIFdlYkNvcmUvcmVu
ZGVyaW5nL1NWR0lubGluZVRleHRCb3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yOTEsNyArMjkx
LDcgQEAgaW50IFNWR0lubGluZVRleHRCb3g6OnBvc2l0aW9uRm9yT2Zmc2V0KAogICAgIHJldHVy
biAwOwogfQogCi1ib29sIFNWR0lubGluZVRleHRCb3g6Om5vZGVBdFBvaW50KGNvbnN0IEhpdFRl
c3RSZXF1ZXN0JiwgSGl0VGVzdFJlc3VsdCYgcmVzdWx0LCBpbnQgeCwgaW50IHksIGludCB0eCwg
aW50IHR5KQorYm9vbCBTVkdJbmxpbmVUZXh0Qm94Ojpub2RlQXRQb2ludChjb25zdCBIaXRUZXN0
UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmIHJlc3VsdCwgaW50IHgsIGludCB5LCBpbnQgdHgsIGlu
dCB0eSwgSGl0VGVzdEFjdGlvbiwgTGluZUJveEhpdFRlc3RJbmZvJikKIHsKICAgICBBU1NFUlQo
IWlzTGluZUJyZWFrKCkpOwogCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9TVkdJbmxpbmVUZXh0
Qm94LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvU1ZHSW5saW5lVGV4dEJveC5o
CShyZXZpc2lvbiA1NDY2NCkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1NWR0lubGluZVRleHRCb3gu
aAkod29ya2luZyBjb3B5KQpAQCAtNjEsNyArNjEsNyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAg
ICAgICAgIHZpcnR1YWwgaW50IG9mZnNldEZvclBvc2l0aW9uKGludCB4LCBib29sIGluY2x1ZGVQ
YXJ0aWFsR2x5cGhzID0gdHJ1ZSkgY29uc3Q7CiAgICAgICAgIHZpcnR1YWwgaW50IHBvc2l0aW9u
Rm9yT2Zmc2V0KGludCBvZmZzZXQpIGNvbnN0OwogCi0gICAgICAgIHZpcnR1YWwgYm9vbCBub2Rl
QXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBpbnQgeCwgaW50
IHksIGludCB0eCwgaW50IHR5KTsKKyAgICAgICAgdmlydHVhbCBib29sIG5vZGVBdFBvaW50KGNv
bnN0IEhpdFRlc3RSZXF1ZXN0JiwgSGl0VGVzdFJlc3VsdCYsIGludCB4LCBpbnQgeSwgaW50IHR4
LCBpbnQgdHksIEhpdFRlc3RBY3Rpb24sIExpbmVCb3hIaXRUZXN0SW5mbyYpOwogICAgICAgICB2
aXJ0dWFsIEludFJlY3Qgc2VsZWN0aW9uUmVjdChpbnQgYWJzeCwgaW50IGFic3ksIGludCBzdGFy
dFBvcywgaW50IGVuZFBvcyk7CiAKICAgICAgICAgLy8gU1ZHcyBjdXN0b20gcGFpbnQgdGV4dCBt
ZXRob2QK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>48597</attachid>
            <date>2010-02-11 17:00:05 -0800</date>
            <delta_ts>2010-02-12 09:08:37 -0800</delta_ts>
            <desc>Fix the line box culling issue and the box height issue.</desc>
            <filename>patch.txt</filename>
            <type>text/plain</type>
            <size>143821</size>
            <attacher name="Dave Hyatt">hyatt</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0LmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eVJlbmRl
ck9iamVjdC5jcHAJKHJldmlzaW9uIDU0NjY0KQorKysgV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0Fj
Y2Vzc2liaWxpdHlSZW5kZXJPYmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01NjcsMTIgKzU2
Nyw4IEBAIEVsZW1lbnQqIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmFuY2gKICAgICBSZW5k
ZXJPYmplY3QqIGN1cnJSZW5kZXJlcjsKICAgICAKICAgICAvLyBTZWFyY2ggdXAgdGhlIHJlbmRl
ciB0cmVlIGZvciBhIFJlbmRlck9iamVjdCB3aXRoIGEgRE9NIG5vZGUuICBEZWZlciB0byBhbiBl
YXJsaWVyIGNvbnRpbnVhdGlvbiwgdGhvdWdoLgotICAgIGZvciAoY3VyclJlbmRlcmVyID0gbV9y
ZW5kZXJlcjsgY3VyclJlbmRlcmVyICYmICFjdXJyUmVuZGVyZXItPm5vZGUoKTsgY3VyclJlbmRl
cmVyID0gY3VyclJlbmRlcmVyLT5wYXJlbnQoKSkgewotICAgICAgICBpZiAoY3VyclJlbmRlcmVy
LT5pc1JlbmRlckJsb2NrKCkpIHsKLSAgICAgICAgICAgIFJlbmRlcklubGluZSogY29udGludWF0
aW9uID0gdG9SZW5kZXJCbG9jayhjdXJyUmVuZGVyZXIpLT5pbmxpbmVDb250aW51YXRpb24oKTsK
LSAgICAgICAgICAgIGlmIChjb250aW51YXRpb24pCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNh
Y2hlLT5nZXRPckNyZWF0ZShjb250aW51YXRpb24pLT5hbmNob3JFbGVtZW50KCk7Ci0gICAgICAg
IH0KKyAgICBmb3IgKGN1cnJSZW5kZXJlciA9IG1fcmVuZGVyZXI7IGN1cnJSZW5kZXJlciAmJiAh
Y3VyclJlbmRlcmVyLT5ub2RlKCk7IGN1cnJSZW5kZXJlciA9IGN1cnJSZW5kZXJlci0+cGFyZW50
KCkpCisgICAgewogICAgIH0KICAgICAKICAgICAvLyBiYWlsIGlmIG5vbmUgZm91bmQKSW5kZXg6
IFdlYkNvcmUvcmVuZGVyaW5nL0VsbGlwc2lzQm94LmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3JlbmRlcmluZy9FbGxpcHNpc0JveC5jcHAJKHJldmlzaW9uIDU0NjY0KQorKysgV2ViQ29yZS9y
ZW5kZXJpbmcvRWxsaXBzaXNCb3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC02NCw3ICs2NCw4IEBA
IHZvaWQgRWxsaXBzaXNCb3g6OnBhaW50KFJlbmRlck9iamVjdDo6UGEKICAgICAgICAgLy8gUGFp
bnQgdGhlIG1hcmt1cCBib3gKICAgICAgICAgdHggKz0gbV94ICsgbV93aWR0aCAtIG1fbWFya3Vw
Qm94LT54KCk7CiAgICAgICAgIHR5ICs9IG1feSArIHN0eWxlLT5mb250KCkuYXNjZW50KCkgLSAo
bV9tYXJrdXBCb3gtPnkoKSArIG1fbWFya3VwQm94LT5yZW5kZXJlcigpLT5zdHlsZShtX2ZpcnN0
TGluZSktPmZvbnQoKS5hc2NlbnQoKSk7Ci0gICAgICAgIG1fbWFya3VwQm94LT5wYWludChwYWlu
dEluZm8sIHR4LCB0eSk7CisgICAgICAgIExpbmVCb3hQYWludEluZm8gbGluZUJveFBhaW50SW5m
bzsKKyAgICAgICAgbV9tYXJrdXBCb3gtPnBhaW50KHBhaW50SW5mbywgdHgsIHR5LCBsaW5lQm94
UGFpbnRJbmZvKTsKICAgICB9CiB9CiAKQEAgLTk3LDcgKzk4LDcgQEAgdm9pZCBFbGxpcHNpc0Jv
eDo6cGFpbnRTZWxlY3Rpb24oR3JhcGhpYwogICAgIGNvbnRleHQtPnJlc3RvcmUoKTsKIH0KIAot
Ym9vbCBFbGxpcHNpc0JveDo6bm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmIHJlcXVl
c3QsIEhpdFRlc3RSZXN1bHQmIHJlc3VsdCwgaW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSkK
K2Jvb2wgRWxsaXBzaXNCb3g6Om5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiByZXF1
ZXN0LCBIaXRUZXN0UmVzdWx0JiByZXN1bHQsIGludCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHks
IEhpdFRlc3RBY3Rpb24gaGl0VGVzdEFjdGlvbiwgTGluZUJveEhpdFRlc3RJbmZvJiBoaXRUZXN0
SW5mbykKIHsKICAgICB0eCArPSBtX3g7CiAgICAgdHkgKz0gbV95OwpAQCAtMTA3LDcgKzEwOCw3
IEBAIGJvb2wgRWxsaXBzaXNCb3g6Om5vZGVBdFBvaW50KGNvbnN0IEhpdFQKICAgICAgICAgUmVu
ZGVyU3R5bGUqIHN0eWxlID0gbV9yZW5kZXJlci0+c3R5bGUobV9maXJzdExpbmUpOwogICAgICAg
ICBpbnQgbXR4ID0gdHggKyBtX3dpZHRoIC0gbV9tYXJrdXBCb3gtPngoKTsKICAgICAgICAgaW50
IG10eSA9IHR5ICsgc3R5bGUtPmZvbnQoKS5hc2NlbnQoKSAtIChtX21hcmt1cEJveC0+eSgpICsg
bV9tYXJrdXBCb3gtPnJlbmRlcmVyKCktPnN0eWxlKG1fZmlyc3RMaW5lKS0+Zm9udCgpLmFzY2Vu
dCgpKTsKLSAgICAgICAgaWYgKG1fbWFya3VwQm94LT5ub2RlQXRQb2ludChyZXF1ZXN0LCByZXN1
bHQsIHgsIHksIG10eCwgbXR5KSkgeworICAgICAgICBpZiAobV9tYXJrdXBCb3gtPm5vZGVBdFBv
aW50KHJlcXVlc3QsIHJlc3VsdCwgeCwgeSwgbXR4LCBtdHksIGhpdFRlc3RBY3Rpb24sIGhpdFRl
c3RJbmZvKSkgewogICAgICAgICAgICAgcmVuZGVyZXIoKS0+dXBkYXRlSGl0VGVzdFJlc3VsdChy
ZXN1bHQsIEludFBvaW50KHggLSBtdHgsIHkgLSBtdHkpKTsKICAgICAgICAgICAgIHJldHVybiB0
cnVlOwogICAgICAgICB9CkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9FbGxpcHNpc0JveC5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL0VsbGlwc2lzQm94LmgJKHJldmlzaW9uIDU0
NjY0KQorKysgV2ViQ29yZS9yZW5kZXJpbmcvRWxsaXBzaXNCb3guaAkod29ya2luZyBjb3B5KQpA
QCAtMzksOCArMzksOCBAQCBwdWJsaWM6CiAgICAgewogICAgIH0KIAotICAgIHZpcnR1YWwgdm9p
ZCBwYWludChSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5KTsKLSAgICB2
aXJ0dWFsIGJvb2wgbm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVz
dWx0JiwgaW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSk7CisgICAgdm9pZCBwYWludChSZW5k
ZXJPYmplY3Q6OlBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5KTsKKyAgICB2aXJ0dWFsIGJvb2wg
bm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVzdWx0JiwgaW50IHgs
IGludCB5LCBpbnQgdHgsIGludCB0eSwgSGl0VGVzdEFjdGlvbiwgTGluZUJveEhpdFRlc3RJbmZv
Jik7CiAgICAgdm9pZCBzZXRTZWxlY3Rpb25TdGF0ZShSZW5kZXJPYmplY3Q6OlNlbGVjdGlvblN0
YXRlIHMpIHsgbV9zZWxlY3Rpb25TdGF0ZSA9IHM7IH0KICAgICBJbnRSZWN0IHNlbGVjdGlvblJl
Y3QoaW50IHR4LCBpbnQgdHkpOwogCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVCb3gu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUJveC5jcHAJKHJldmlz
aW9uIDU0NjY0KQorKysgV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lQm94LmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgIkhpdFRlc3RSZXN1bHQuaCIKICNpbmNs
dWRlICJJbmxpbmVGbG93Qm94LmgiCiAjaW5jbHVkZSAiUmVuZGVyQXJlbmEuaCIKLSNpbmNsdWRl
ICJSZW5kZXJCb3guaCIKKyNpbmNsdWRlICJSZW5kZXJWaWV3LmgiCiAjaW5jbHVkZSAiUm9vdElu
bGluZUJveC5oIgogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwpAQCAtMTU5LDkgKzE1OSwyNyBAQCB2
b2lkIElubGluZUJveDo6YWRqdXN0UG9zaXRpb24oaW50IGR4LCBpCiAgICAgfQogfQogCi12b2lk
IElubGluZUJveDo6cGFpbnQoUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgaW50
IHR4LCBpbnQgdHkpCit2b2lkIElubGluZUJveDo6cGFpbnQoUmVuZGVyT2JqZWN0OjpQYWludElu
Zm8mIHBhaW50SW5mbywgaW50IHR4LCBpbnQgdHksIExpbmVCb3hQYWludEluZm8mIGxpbmVCb3hQ
YWludEluZm8pCiB7Ci0gICAgaWYgKCFyZW5kZXJlcigpLT5zaG91bGRQYWludFdpdGhpblJvb3Qo
cGFpbnRJbmZvKSB8fCAocGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VGb3JlZ3JvdW5kICYm
IHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlU2VsZWN0aW9uKSkKKyAgICBpZiAoIXJlbmRl
cmVyKCktPnNob3VsZFBhaW50V2l0aGluUm9vdChwYWludEluZm8pKQorICAgICAgICByZXR1cm47
CisgICAgCisgICAgUmVuZGVyQmxvY2sqIGFub255bW91c0lubGluZUJsb2NrID0gbGluZUJveFBh
aW50SW5mby5hbm9ueW1vdXNJbmxpbmVCbG9jazsKKyAgICBpZiAoYW5vbnltb3VzSW5saW5lQmxv
Y2sgPT0gcmVuZGVyZXIoKSkgeworICAgICAgICAvLyBUcmVhdCBwYWludGluZyBvZiBhIHNwZWNp
YWwgaW5saW5lLWJsb2NrIGxpbmUgbGlrZSB0aGUgcGFpbnRpbmcgb2YgYSBub3JtYWwgYmxvY2sg
YW5kIGdvIHRocm91Z2ggYWxsIHBoYXNlcy4KKyAgICAgICAgUGFpbnRQaGFzZSBuZXdQaGFzZSA9
IChwYWludEluZm8ucGhhc2UgPT0gUGFpbnRQaGFzZUNoaWxkT3V0bGluZXMpID8gUGFpbnRQaGFz
ZU91dGxpbmUgOiBwYWludEluZm8ucGhhc2U7CisgICAgICAgIG5ld1BoYXNlID0gKG5ld1BoYXNl
ID09IFBhaW50UGhhc2VDaGlsZEJsb2NrQmFja2dyb3VuZHMpID8gUGFpbnRQaGFzZUNoaWxkQmxv
Y2tCYWNrZ3JvdW5kIDogbmV3UGhhc2U7CisgICAgCisgICAgICAgIC8vIFdlIGRvbid0IHBhaW50
IG91ciBvd24gYmFja2dyb3VuZCwgYnV0IHdlIGRvIGxldCB0aGUgY2hpbGQgcGFpbnQgaXRzIGJh
Y2tncm91bmQuCisgICAgICAgIFJlbmRlck9iamVjdDo6UGFpbnRJbmZvIGluZm8ocGFpbnRJbmZv
KTsKKyAgICAgICAgaW5mby5waGFzZSA9IG5ld1BoYXNlOworICAgICAgICBpbmZvLnBhaW50aW5n
Um9vdCA9IHJlbmRlcmVyKCktPnBhaW50aW5nUm9vdEZvckNoaWxkcmVuKHBhaW50SW5mbyk7Cisg
ICAgICAgIGlmICghYW5vbnltb3VzSW5saW5lQmxvY2stPmhhc1NlbGZQYWludGluZ0xheWVyKCkp
CisgICAgICAgICAgICBhbm9ueW1vdXNJbmxpbmVCbG9jay0+cGFpbnQoaW5mbywgdHgsIHR5KTsK
KyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChwYWludEluZm8ucGhhc2UgIT0gUGFp
bnRQaGFzZUZvcmVncm91bmQgJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VTZWxlY3Rp
b24pCiAgICAgICAgIHJldHVybjsKIAogICAgIC8vIFBhaW50IGFsbCBwaGFzZXMgb2YgcmVwbGFj
ZWQgZWxlbWVudHMgYXRvbWljYWxseSwgYXMgdGhvdWdoIHRoZSByZXBsYWNlZCBlbGVtZW50IGVz
dGFibGlzaGVkIGl0cwpAQCAtMTgzLDkgKzIwMSwxNyBAQCB2b2lkIElubGluZUJveDo6cGFpbnQo
UmVuZGVyT2JqZWN0OjpQYWluCiAgICAgfQogfQogCi1ib29sIElubGluZUJveDo6bm9kZUF0UG9p
bnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmIHJlcXVlc3QsIEhpdFRlc3RSZXN1bHQmIHJlc3VsdCwg
aW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSkKK2Jvb2wgSW5saW5lQm94Ojpub2RlQXRQb2lu
dChjb25zdCBIaXRUZXN0UmVxdWVzdCYgcmVxdWVzdCwgSGl0VGVzdFJlc3VsdCYgcmVzdWx0LCBp
bnQgeCwgaW50IHksIGludCB0eCwgaW50IHR5LCBIaXRUZXN0QWN0aW9uIGhpdFRlc3RBY3Rpb24s
IExpbmVCb3hIaXRUZXN0SW5mbyYgaGl0VGVzdEluZm8pCiB7Ci0gICAgLy8gSGl0IHRlc3QgYWxs
IHBoYXNlcyBvZiByZXBsYWNlZCBlbGVtZW50cyBhdG9taWNhbGx5LCBhcyB0aG91Z2ggdGhlIHJl
cGxhY2VkIGVsZW1lbnQgZXN0YWJsaXNoZWQgaXRzCisgICAgLy8gSWYgd2UgYXJlIGFuIGFub255
bW91cyBpbmxpbmUgYmxvY2ssIGhvbm9yIGhpdCB0ZXN0IHBoYXNlcy4KKyAgICBpZiAoaGl0VGVz
dEluZm8uYW5vbnltb3VzSW5saW5lQmxvY2sgPT0gcmVuZGVyZXIoKSkgeworICAgICAgICBIaXRU
ZXN0QWN0aW9uIGNoaWxkSGl0VGVzdCA9IGhpdFRlc3RBY3Rpb247CisgICAgICAgIGlmIChoaXRU
ZXN0QWN0aW9uID09IEhpdFRlc3RDaGlsZEJsb2NrQmFja2dyb3VuZHMpCisgICAgICAgICAgICBj
aGlsZEhpdFRlc3QgPSBIaXRUZXN0Q2hpbGRCbG9ja0JhY2tncm91bmQ7CisgICAgICAgIHJldHVy
biBoaXRUZXN0SW5mby5hbm9ueW1vdXNJbmxpbmVCbG9jay0+bm9kZUF0UG9pbnQocmVxdWVzdCwg
cmVzdWx0LCB4LCB5LCB0eCwgdHksIGNoaWxkSGl0VGVzdCk7CisgICAgfQorCisgICAgLy8gT3Ro
ZXJ3aXNlIGhpdCB0ZXN0IGFsbCBwaGFzZXMgb2YgcmVwbGFjZWQgZWxlbWVudHMgYXRvbWljYWxs
eSwgYXMgdGhvdWdoIHRoZSByZXBsYWNlZCBlbGVtZW50IGVzdGFibGlzaGVkIGl0cwogICAgIC8v
IG93biBzdGFja2luZyBjb250ZXh0LiAgKFNlZSBBcHBlbmRpeCBFLjIsIHNlY3Rpb24gNi40IG9u
IGlubGluZSBibG9jay90YWJsZSBlbGVtZW50cyBpbiB0aGUgQ1NTMi4xCiAgICAgLy8gc3BlY2lm
aWNhdGlvbi4pCiAgICAgcmV0dXJuIHJlbmRlcmVyKCktPmhpdFRlc3QocmVxdWVzdCwgcmVzdWx0
LCBJbnRQb2ludCh4LCB5KSwgdHgsIHR5KTsKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL0lubGlu
ZUJveC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUJveC5oCShyZXZp
c2lvbiA1NDY2NCkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUJveC5oCSh3b3JraW5nIGNv
cHkpCkBAIC0zMCw2ICszMCwyMyBAQCBjbGFzcyBIaXRUZXN0UmVxdWVzdDsKIGNsYXNzIEhpdFRl
c3RSZXN1bHQ7CiBjbGFzcyBSb290SW5saW5lQm94OwogCitzdHJ1Y3QgTGluZUJveFBhaW50SW5m
bworeworICAgIExpbmVCb3hQYWludEluZm8oKQorICAgICAgICA6IGFub255bW91c0lubGluZUJs
b2NrKDApCisgICAgeyB9CisgICAgCisgICAgUmVuZGVyQmxvY2sqIGFub255bW91c0lubGluZUJs
b2NrOworfTsKKworc3RydWN0IExpbmVCb3hIaXRUZXN0SW5mbworeworICAgIExpbmVCb3hIaXRU
ZXN0SW5mbygpCisgICAgICAgIDogYW5vbnltb3VzSW5saW5lQmxvY2soMCkKKyAgICB7IH0KKyAg
ICAKKyAgICBSZW5kZXJCbG9jayogYW5vbnltb3VzSW5saW5lQmxvY2s7Cit9OwogCiAvLyBJbmxp
bmVCb3ggcmVwcmVzZW50cyBhIHJlY3RhbmdsZSB0aGF0IG9jY3VycyBvbiBhIGxpbmUuICBJdCBj
b3JyZXNwb25kcyB0bwogLy8gc29tZSBSZW5kZXJPYmplY3QgKGkuZS4sIGl0IHJlcHJlc2VudHMg
YSBwb3J0aW9uIG9mIHRoYXQgUmVuZGVyT2JqZWN0KS4KQEAgLTQ4LDkgKzY1LDcgQEAgcHVibGlj
OgogICAgICAgICAsIG1fYmlkaUVtYmVkZGluZ0xldmVsKDApCiAgICAgICAgICwgbV9kaXJ0eShm
YWxzZSkKICAgICAgICAgLCBtX2V4dHJhY3RlZChmYWxzZSkKLSNpZiBFTkFCTEUoU1ZHKQogICAg
ICAgICAsIG1faGFzVmlydHVhbEhlaWdodChmYWxzZSkKLSNlbmRpZgogICAgICAgICAsIG1fZW5k
c1dpdGhCcmVhayhmYWxzZSkKICAgICAgICAgLCBtX2hhc1NlbGVjdGVkQ2hpbGRyZW4oZmFsc2Up
CiAgICAgICAgICwgbV9oYXNFbGxpcHNpc0JveChmYWxzZSkKQEAgLTgxLDkgKzk2LDcgQEAgcHVi
bGljOgogICAgICAgICAsIG1fYmlkaUVtYmVkZGluZ0xldmVsKDApCiAgICAgICAgICwgbV9kaXJ0
eShkaXJ0eSkKICAgICAgICAgLCBtX2V4dHJhY3RlZChleHRyYWN0ZWQpCi0jaWYgRU5BQkxFKFNW
RykKICAgICAgICAgLCBtX2hhc1ZpcnR1YWxIZWlnaHQoZmFsc2UpCi0jZW5kaWYKICAgICAgICAg
LCBtX2VuZHNXaXRoQnJlYWsoZmFsc2UpCiAgICAgICAgICwgbV9oYXNTZWxlY3RlZENoaWxkcmVu
KGZhbHNlKSAgIAogICAgICAgICAsIG1faGFzRWxsaXBzaXNCb3goZmFsc2UpCkBAIC0xMTIsOCAr
MTI1LDggQEAgcHVibGljOgogCiAgICAgdmlydHVhbCB2b2lkIGFkanVzdFBvc2l0aW9uKGludCBk
eCwgaW50IGR5KTsKIAotICAgIHZpcnR1YWwgdm9pZCBwYWludChSZW5kZXJPYmplY3Q6OlBhaW50
SW5mbyYsIGludCB0eCwgaW50IHR5KTsKLSAgICB2aXJ0dWFsIGJvb2wgbm9kZUF0UG9pbnQoY29u
c3QgSGl0VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVzdWx0JiwgaW50IHgsIGludCB5LCBpbnQgdHgs
IGludCB0eSk7CisgICAgdmlydHVhbCB2b2lkIHBhaW50KFJlbmRlck9iamVjdDo6UGFpbnRJbmZv
JiwgaW50IHR4LCBpbnQgdHksIExpbmVCb3hQYWludEluZm8mKTsKKyAgICB2aXJ0dWFsIGJvb2wg
bm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVzdWx0JiwgaW50IHgs
IGludCB5LCBpbnQgdHgsIGludCB0eSwgSGl0VGVzdEFjdGlvbiwgTGluZUJveEhpdFRlc3RJbmZv
Jik7CiAKICAgICAvLyBPdmVybG9hZGVkIG5ldyBvcGVyYXRvci4KICAgICB2b2lkKiBvcGVyYXRv
ciBuZXcoc2l6ZV90LCBSZW5kZXJBcmVuYSopIHRocm93KCk7CkBAIC0xMzksMTEgKzE1MiwxMSBA
QCBwdWJsaWM6CiAgICAgdmlydHVhbCBib29sIGlzUm9vdElubGluZUJveCgpIGNvbnN0IHsgcmV0
dXJuIGZhbHNlOyB9CiAjaWYgRU5BQkxFKFNWRykgCiAgICAgdmlydHVhbCBib29sIGlzU1ZHUm9v
dElubGluZUJveCgpIHsgcmV0dXJuIGZhbHNlOyB9CisjZW5kaWYKIAogICAgIGJvb2wgaGFzVmly
dHVhbEhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1faGFzVmlydHVhbEhlaWdodDsgfQogICAgIHZv
aWQgc2V0SGFzVmlydHVhbEhlaWdodCgpIHsgbV9oYXNWaXJ0dWFsSGVpZ2h0ID0gdHJ1ZTsgfQog
ICAgIHZpcnR1YWwgaW50IHZpcnR1YWxIZWlnaHQoKSBjb25zdCB7IEFTU0VSVF9OT1RfUkVBQ0hF
RCgpOyByZXR1cm4gMDsgfQotI2VuZGlmCiAgICAgCiAgICAgYm9vbCBpc0NvbnN0cnVjdGVkKCkg
eyByZXR1cm4gbV9jb25zdHJ1Y3RlZDsgfQogICAgIHZpcnR1YWwgdm9pZCBzZXRDb25zdHJ1Y3Rl
ZCgpCkBAIC0yMDUsNiArMjE4LDggQEAgcHVibGljOgogCiAgICAgaW50IGhlaWdodCgpIGNvbnN0
OwogCisgICAgSW50UmVjdCBmcmFtZVJlY3QoKSBjb25zdCB7IHJldHVybiBJbnRSZWN0KHgoKSwg
eSgpLCB3aWR0aCgpLCBoZWlnaHQoKSk7IH0KKwogICAgIGlubGluZSBpbnQgYmFzZWxpbmVQb3Np
dGlvbihib29sIGlzUm9vdExpbmVCb3gpIGNvbnN0IHsgcmV0dXJuIHJlbmRlcmVyKCktPmJhc2Vs
aW5lUG9zaXRpb24obV9maXJzdExpbmUsIGlzUm9vdExpbmVCb3gpOyB9CiAgICAgaW5saW5lIGlu
dCBsaW5lSGVpZ2h0KGJvb2wgaXNSb290TGluZUJveCkgY29uc3QgeyByZXR1cm4gcmVuZGVyZXIo
KS0+bGluZUhlaWdodChtX2ZpcnN0TGluZSwgaXNSb290TGluZUJveCk7IH0KIApJbmRleDogV2Vi
Q29yZS9yZW5kZXJpbmcvSW5saW5lRmxvd0JveC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9y
ZW5kZXJpbmcvSW5saW5lRmxvd0JveC5jcHAJKHJldmlzaW9uIDU0NjY0KQorKysgV2ViQ29yZS9y
ZW5kZXJpbmcvSW5saW5lRmxvd0JveC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMyLDYgKzMyLDcg
QEAKICNpbmNsdWRlICJSZW5kZXJMYXllci5oIgogI2luY2x1ZGUgIlJlbmRlckxpc3RNYXJrZXIu
aCIKICNpbmNsdWRlICJSZW5kZXJUYWJsZUNlbGwuaCIKKyNpbmNsdWRlICJSZW5kZXJWaWV3Lmgi
CiAjaW5jbHVkZSAiUm9vdElubGluZUJveC5oIgogI2luY2x1ZGUgIlRleHQuaCIKIApAQCAtMjI3
LDE0ICsyMjgsMTMgQEAgdm9pZCBJbmxpbmVGbG93Qm94OjpkZXRlcm1pbmVTcGFjaW5nRm9yRgog
ICAgICAgICAvLyAoMykgVGhlIGxpbmUgbWF5IGVuZCBvbiB0aGUgaW5saW5lLiAgSWYgd2UgYXJl
IHRoZSBsYXN0IGNoaWxkIChjbGltYmluZyB1cAogICAgICAgICAvLyB0aGUgZW5kIG9iamVjdCdz
IGNoYWluKSwgdGhlbiB3ZSBqdXN0IGNsb3NlZCBhcyB3ZWxsLgogICAgICAgICBpZiAoIWxpbmVC
b3hMaXN0LT5sYXN0TGluZUJveCgpLT5pc0NvbnN0cnVjdGVkKCkpIHsKLSAgICAgICAgICAgIFJl
bmRlcklubGluZSogaW5saW5lRmxvdyA9IHRvUmVuZGVySW5saW5lKHJlbmRlcmVyKCkpOwogICAg
ICAgICAgICAgaWYgKGx0cikgewogICAgICAgICAgICAgICAgIGlmICghbmV4dExpbmVCb3goKSAm
JgotICAgICAgICAgICAgICAgICAgICAoKGxhc3RMaW5lICYmICFpbmxpbmVGbG93LT5jb250aW51
YXRpb24oKSkgfHwgbmV4dE9uTGluZUV4aXN0cygpIHx8IG9uRW5kQ2hhaW4oZW5kT2JqZWN0KSkp
CisgICAgICAgICAgICAgICAgICAgIChsYXN0TGluZSB8fCBuZXh0T25MaW5lRXhpc3RzKCkgfHwg
b25FbmRDaGFpbihlbmRPYmplY3QpKSkKICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZVJpZ2h0
RWRnZSA9IHRydWU7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmICgo
IXByZXZMaW5lQm94KCkgfHwgcHJldkxpbmVCb3goKS0+aXNDb25zdHJ1Y3RlZCgpKSAmJgotICAg
ICAgICAgICAgICAgICAgICAoKGxhc3RMaW5lICYmICFpbmxpbmVGbG93LT5jb250aW51YXRpb24o
KSkgfHwgcHJldk9uTGluZUV4aXN0cygpIHx8IG9uRW5kQ2hhaW4oZW5kT2JqZWN0KSkpCisgICAg
ICAgICAgICAgICAgICAgIChsYXN0TGluZSB8fCBwcmV2T25MaW5lRXhpc3RzKCkgfHwgb25FbmRD
aGFpbihlbmRPYmplY3QpKSkKICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZUxlZnRFZGdlID0g
dHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNTA0LDcgKzUwNCw3IEBAIHZvaWQg
SW5saW5lRmxvd0JveDo6cGxhY2VCb3hlc1ZlcnRpY2FsbHkKICAgICAgICAgICAgICAgICBuZXdZ
IC09IGN1cnItPmJveE1vZGVsT2JqZWN0KCktPmJvcmRlclRvcCgpICsgY3Vyci0+Ym94TW9kZWxP
YmplY3QoKS0+cGFkZGluZ1RvcCgpOwogICAgICAgICB9IGVsc2UgaWYgKCFjdXJyLT5yZW5kZXJl
cigpLT5pc0JSKCkpIHsKICAgICAgICAgICAgIFJlbmRlckJveCogYm94ID0gdG9SZW5kZXJCb3go
Y3Vyci0+cmVuZGVyZXIoKSk7Ci0gICAgICAgICAgICBuZXdZICs9IGJveC0+bWFyZ2luVG9wKCk7
CisgICAgICAgICAgICBuZXdZICs9IGN1cnItPnJlbmRlcmVyKCktPmlzQW5vbnltb3VzSW5saW5l
QmxvY2soKSA/IDAgOiBib3gtPm1hcmdpblRvcCgpOwogICAgICAgICB9CiAKICAgICAgICAgY3Vy
ci0+c2V0WShuZXdZKTsKQEAgLTU5OCw4ICs1OTgsMTIgQEAgdm9pZCBJbmxpbmVGbG93Qm94Ojpj
b21wdXRlVmVydGljYWxPdmVyZgogICAgIHNldFZlcnRpY2FsT3ZlcmZsb3dQb3NpdGlvbnModG9w
TGF5b3V0T3ZlcmZsb3csIGJvdHRvbUxheW91dE92ZXJmbG93LCB0b3BWaXN1YWxPdmVyZmxvdywg
Ym90dG9tVmlzdWFsT3ZlcmZsb3csIGJveEhlaWdodCk7CiB9CiAKLWJvb2wgSW5saW5lRmxvd0Jv
eDo6bm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmIHJlcXVlc3QsIEhpdFRlc3RSZXN1
bHQmIHJlc3VsdCwgaW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSkKK2Jvb2wgSW5saW5lRmxv
d0JveDo6bm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmIHJlcXVlc3QsIEhpdFRlc3RS
ZXN1bHQmIHJlc3VsdCwgaW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSwgSGl0VGVzdEFjdGlv
biBoaXRUZXN0QWN0aW9uLCBMaW5lQm94SGl0VGVzdEluZm8mIGhpdFRlc3RJbmZvKQogeworICAg
IC8vIEFzIGxvbmcgYXMgd2UgZG9uJ3QgaGF2ZSBhbiBhbm9ueW1vdXMgaW5saW5lIGJsb2NrIG9u
IG91ciBsaW5lLCB3ZSByZXN0cmljdCBvdXIgaGl0IHRlc3Rpbmcgb25seSB0byB0aGUgZm9yZWdy
b3VuZCBwaGFzZS4KKyAgICBpZiAoIWhpdFRlc3RJbmZvLmFub255bW91c0lubGluZUJsb2NrICYm
IGhpdFRlc3RBY3Rpb24gIT0gSGl0VGVzdEZvcmVncm91bmQpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKwogICAgIEludFJlY3Qgb3ZlcmZsb3dSZWN0KHZpc2libGVPdmVyZmxvd1JlY3QoKSk7CiAg
ICAgb3ZlcmZsb3dSZWN0Lm1vdmUodHgsIHR5KTsKICAgICBpZiAoIW92ZXJmbG93UmVjdC5jb250
YWlucyh4LCB5KSkKQEAgLTYwNyw3ICs2MTEsNyBAQCBib29sIElubGluZUZsb3dCb3g6Om5vZGVB
dFBvaW50KGNvbnN0IEhpCiAKICAgICAvLyBDaGVjayBjaGlsZHJlbiBmaXJzdC4KICAgICBmb3Ig
KElubGluZUJveCogY3VyciA9IGxhc3RDaGlsZCgpOyBjdXJyOyBjdXJyID0gY3Vyci0+cHJldk9u
TGluZSgpKSB7Ci0gICAgICAgIGlmICgoY3Vyci0+cmVuZGVyZXIoKS0+aXNUZXh0KCkgfHwgIWN1
cnItPmJveE1vZGVsT2JqZWN0KCktPmhhc1NlbGZQYWludGluZ0xheWVyKCkpICYmIGN1cnItPm5v
ZGVBdFBvaW50KHJlcXVlc3QsIHJlc3VsdCwgeCwgeSwgdHgsIHR5KSkgeworICAgICAgICBpZiAo
KGN1cnItPnJlbmRlcmVyKCktPmlzVGV4dCgpIHx8ICFjdXJyLT5ib3hNb2RlbE9iamVjdCgpLT5o
YXNTZWxmUGFpbnRpbmdMYXllcigpKSAmJiBjdXJyLT5ub2RlQXRQb2ludChyZXF1ZXN0LCByZXN1
bHQsIHgsIHksIHR4LCB0eSwgaGl0VGVzdEFjdGlvbiwgaGl0VGVzdEluZm8pKSB7CiAgICAgICAg
ICAgICByZW5kZXJlcigpLT51cGRhdGVIaXRUZXN0UmVzdWx0KHJlc3VsdCwgSW50UG9pbnQoeCAt
IHR4LCB5IC0gdHkpKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CkBAIC02
MjMsOCArNjI3LDE0IEBAIGJvb2wgSW5saW5lRmxvd0JveDo6bm9kZUF0UG9pbnQoY29uc3QgSGkK
ICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXZvaWQgSW5saW5lRmxvd0JveDo6cGFpbnQoUmVuZGVy
T2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgaW50IHR4LCBpbnQgdHkpCit2b2lkIElubGlu
ZUZsb3dCb3g6OnBhaW50KFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGludCB0
eCwgaW50IHR5LCBMaW5lQm94UGFpbnRJbmZvJiBsaW5lQm94UGFpbnRJbmZvKQogeworICAgIC8v
IEFzIGxvbmcgYXMgd2UgZG9uJ3QgaGF2ZSBhbiBhbm9ueW1vdXMgaW5saW5lIGJsb2NrIG9uIG91
ciBsaW5lLCB3ZSByZXN0cmljdCBvdXIgcGFpbnRpbmcgb25seSB0byBhIGZldyBwaGFzZXMuCisg
ICAgaWYgKCFsaW5lQm94UGFpbnRJbmZvLmFub255bW91c0lubGluZUJsb2NrICYmIChwYWludElu
Zm8ucGhhc2UgIT0gUGFpbnRQaGFzZUZvcmVncm91bmQgJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBh
aW50UGhhc2VTZWxlY3Rpb24gJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VPdXRsaW5l
IAorICAgICAgICAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZVNlbGZPdXRsaW5lICYm
IHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlQ2hpbGRPdXRsaW5lcyAmJiBwYWludEluZm8u
cGhhc2UgIT0gUGFpbnRQaGFzZVRleHRDbGlwCisgICAgICAgICYmIHBhaW50SW5mby5waGFzZSAh
PSBQYWludFBoYXNlTWFzaykpCisgICAgICAgIHJldHVybjsKKyAgICAKICAgICBJbnRSZWN0IG92
ZXJmbG93UmVjdCh2aXNpYmxlT3ZlcmZsb3dSZWN0KCkpOwogICAgIG92ZXJmbG93UmVjdC5pbmZs
YXRlKHJlbmRlcmVyKCktPm1heGltYWxPdXRsaW5lU2l6ZShwYWludEluZm8ucGhhc2UpKTsKICAg
ICBvdmVyZmxvd1JlY3QubW92ZSh0eCwgdHkpOwpAQCAtNjM4LDIzICs2NDgsMTcgQEAgdm9pZCBJ
bmxpbmVGbG93Qm94OjpwYWludChSZW5kZXJPYmplY3Q6OgogICAgICAgICAgICAgLy8gb3V0bGlu
ZXMuCiAgICAgICAgICAgICBpZiAocmVuZGVyZXIoKS0+c3R5bGUoKS0+dmlzaWJpbGl0eSgpID09
IFZJU0lCTEUgJiYgcmVuZGVyZXIoKS0+aGFzT3V0bGluZSgpICYmICFpc1Jvb3RJbmxpbmVCb3go
KSkgewogICAgICAgICAgICAgICAgIFJlbmRlcklubGluZSogaW5saW5lRmxvdyA9IHRvUmVuZGVy
SW5saW5lKHJlbmRlcmVyKCkpOwotICAgICAgICAgICAgICAgIGlmICgoaW5saW5lRmxvdy0+Y29u
dGludWF0aW9uKCkgfHwgaW5saW5lRmxvdy0+aXNJbmxpbmVDb250aW51YXRpb24oKSkgJiYgIWJv
eE1vZGVsT2JqZWN0KCktPmhhc1NlbGZQYWludGluZ0xheWVyKCkpIHsKLSAgICAgICAgICAgICAg
ICAgICAgLy8gQWRkIG91cnNlbHZlcyB0byB0aGUgY29udGFpbmluZyBibG9jayBvZiB0aGUgZW50
aXJlIGNvbnRpbnVhdGlvbiBzbyB0aGF0IGl0IGNhbgotICAgICAgICAgICAgICAgICAgICAvLyBw
YWludCB1cyBhdG9taWNhbGx5LgotICAgICAgICAgICAgICAgICAgICBSZW5kZXJCbG9jayogYmxv
Y2sgPSByZW5kZXJlcigpLT5jb250YWluaW5nQmxvY2soKS0+Y29udGFpbmluZ0Jsb2NrKCk7Ci0g
ICAgICAgICAgICAgICAgICAgIGJsb2NrLT5hZGRDb250aW51YXRpb25XaXRoT3V0bGluZSh0b1Jl
bmRlcklubGluZShyZW5kZXJlcigpLT5ub2RlKCktPnJlbmRlcmVyKCkpKTsKLSAgICAgICAgICAg
ICAgICB9IGVsc2UgaWYgKCFpbmxpbmVGbG93LT5pc0lubGluZUNvbnRpbnVhdGlvbigpKQotICAg
ICAgICAgICAgICAgICAgICBwYWludEluZm8ub3V0bGluZU9iamVjdHMtPmFkZChpbmxpbmVGbG93
KTsKKyAgICAgICAgICAgICAgICBwYWludEluZm8ub3V0bGluZU9iamVjdHMtPmFkZChpbmxpbmVG
bG93KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChwYWludEluZm8ucGhhc2Ug
PT0gUGFpbnRQaGFzZU1hc2spIHsKLSAgICAgICAgICAgIHBhaW50TWFzayhwYWludEluZm8sIHR4
LCB0eSk7CisgICAgICAgICAgICBwYWludE1hc2socGFpbnRJbmZvLCB0eCwgdHksIGxpbmVCb3hQ
YWludEluZm8pOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9IGVsc2UgewogICAgICAg
ICAgICAgLy8gMS4gUGFpbnQgb3VyIGJhY2tncm91bmQsIGJvcmRlciBhbmQgYm94LXNoYWRvdy4K
LSAgICAgICAgICAgIHBhaW50Qm94RGVjb3JhdGlvbnMocGFpbnRJbmZvLCB0eCwgdHkpOworICAg
ICAgICAgICAgcGFpbnRCb3hEZWNvcmF0aW9ucyhwYWludEluZm8sIHR4LCB0eSwgbGluZUJveFBh
aW50SW5mbyk7CiAKICAgICAgICAgICAgIC8vIDIuIFBhaW50IG91ciB1bmRlcmxpbmUgYW5kIG92
ZXJsaW5lLgotICAgICAgICAgICAgcGFpbnRUZXh0RGVjb3JhdGlvbnMocGFpbnRJbmZvLCB0eCwg
dHksIGZhbHNlKTsKKyAgICAgICAgICAgIHBhaW50VGV4dERlY29yYXRpb25zKHBhaW50SW5mbywg
dHgsIHR5LCBmYWxzZSwgbGluZUJveFBhaW50SW5mbyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAg
LTY3MCwxMyArNjc0LDEzIEBAIHZvaWQgSW5saW5lRmxvd0JveDo6cGFpbnQoUmVuZGVyT2JqZWN0
OjoKICAgICBpZiAocGFpbnRQaGFzZSAhPSBQYWludFBoYXNlU2VsZk91dGxpbmUpIHsKICAgICAg
ICAgZm9yIChJbmxpbmVCb3gqIGN1cnIgPSBmaXJzdENoaWxkKCk7IGN1cnI7IGN1cnIgPSBjdXJy
LT5uZXh0T25MaW5lKCkpIHsKICAgICAgICAgICAgIGlmIChjdXJyLT5yZW5kZXJlcigpLT5pc1Rl
eHQoKSB8fCAhY3Vyci0+Ym94TW9kZWxPYmplY3QoKS0+aGFzU2VsZlBhaW50aW5nTGF5ZXIoKSkK
LSAgICAgICAgICAgICAgICBjdXJyLT5wYWludChjaGlsZEluZm8sIHR4LCB0eSk7CisgICAgICAg
ICAgICAgICAgY3Vyci0+cGFpbnQoY2hpbGRJbmZvLCB0eCwgdHksIGxpbmVCb3hQYWludEluZm8p
OwogICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gNC4gUGFpbnQgb3VyIHN0cmlrZS10aHJvdWdo
CiAgICAgaWYgKHBhaW50SW5mby5waGFzZSA9PSBQYWludFBoYXNlRm9yZWdyb3VuZCB8fCBwYWlu
dEluZm8ucGhhc2UgPT0gUGFpbnRQaGFzZVNlbGVjdGlvbikKLSAgICAgICAgcGFpbnRUZXh0RGVj
b3JhdGlvbnMocGFpbnRJbmZvLCB0eCwgdHksIHRydWUpOworICAgICAgICBwYWludFRleHREZWNv
cmF0aW9ucyhwYWludEluZm8sIHR4LCB0eSwgdHJ1ZSwgbGluZUJveFBhaW50SW5mbyk7CiB9CiAK
IHZvaWQgSW5saW5lRmxvd0JveDo6cGFpbnRGaWxsTGF5ZXJzKGNvbnN0IFJlbmRlck9iamVjdDo6
UGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IENvbG9yJiBjLCBjb25zdCBGaWxsTGF5ZXIqIGZp
bGxMYXllciwgaW50IF90eCwgaW50IF90eSwgaW50IHcsIGludCBoLCBDb21wb3NpdGVPcGVyYXRv
ciBvcCkKQEAgLTcyNyw5ICs3MzEsOSBAQCB2b2lkIElubGluZUZsb3dCb3g6OnBhaW50Qm94U2hh
ZG93KEdyYXBoCiAgICAgfQogfQogCi12b2lkIElubGluZUZsb3dCb3g6OnBhaW50Qm94RGVjb3Jh
dGlvbnMoUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgaW50IHR4LCBpbnQgdHkp
Cit2b2lkIElubGluZUZsb3dCb3g6OnBhaW50Qm94RGVjb3JhdGlvbnMoUmVuZGVyT2JqZWN0OjpQ
YWludEluZm8mIHBhaW50SW5mbywgaW50IHR4LCBpbnQgdHksIExpbmVCb3hQYWludEluZm8mIGxp
bmVCb3hQYWludEluZm8pCiB7Ci0gICAgaWYgKCFyZW5kZXJlcigpLT5zaG91bGRQYWludFdpdGhp
blJvb3QocGFpbnRJbmZvKSB8fCByZW5kZXJlcigpLT5zdHlsZSgpLT52aXNpYmlsaXR5KCkgIT0g
VklTSUJMRSB8fCBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZUZvcmVncm91bmQpCisgICAg
aWYgKCFyZW5kZXJlcigpLT5zaG91bGRQYWludFdpdGhpblJvb3QocGFpbnRJbmZvKSB8fCByZW5k
ZXJlcigpLT5zdHlsZSgpLT52aXNpYmlsaXR5KCkgIT0gVklTSUJMRSB8fCBwYWludEluZm8ucGhh
c2UgIT0gUGFpbnRQaGFzZUZvcmVncm91bmQgfHwgbGluZUJveFBhaW50SW5mby5hbm9ueW1vdXNJ
bmxpbmVCbG9jaykKICAgICAgICAgcmV0dXJuOwogCiAgICAgaW50IHggPSBtX3g7CkBAIC04MDMs
OSArODA3LDkgQEAgdm9pZCBJbmxpbmVGbG93Qm94OjpwYWludEJveERlY29yYXRpb25zKAogICAg
IH0KIH0KIAotdm9pZCBJbmxpbmVGbG93Qm94OjpwYWludE1hc2soUmVuZGVyT2JqZWN0OjpQYWlu
dEluZm8mIHBhaW50SW5mbywgaW50IHR4LCBpbnQgdHkpCit2b2lkIElubGluZUZsb3dCb3g6OnBh
aW50TWFzayhSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJbmZvLCBpbnQgdHgsIGludCB0
eSwgTGluZUJveFBhaW50SW5mbyYgbGluZUJveFBhaW50SW5mbykKIHsKLSAgICBpZiAoIXJlbmRl
cmVyKCktPnNob3VsZFBhaW50V2l0aGluUm9vdChwYWludEluZm8pIHx8IHJlbmRlcmVyKCktPnN0
eWxlKCktPnZpc2liaWxpdHkoKSAhPSBWSVNJQkxFIHx8IHBhaW50SW5mby5waGFzZSAhPSBQYWlu
dFBoYXNlTWFzaykKKyAgICBpZiAoIXJlbmRlcmVyKCktPnNob3VsZFBhaW50V2l0aGluUm9vdChw
YWludEluZm8pIHx8IHJlbmRlcmVyKCktPnN0eWxlKCktPnZpc2liaWxpdHkoKSAhPSBWSVNJQkxF
IHx8IHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlTWFzayB8fCBsaW5lQm94UGFpbnRJbmZv
LmFub255bW91c0lubGluZUJsb2NrKQogICAgICAgICByZXR1cm47CiAKICAgICBpbnQgeCA9IG1f
eDsKQEAgLTg5NSwxMiArODk5LDEyIEBAIHN0YXRpYyBib29sIHNob3VsZERyYXdUZXh0RGVjb3Jh
dGlvbihSZW4KICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXZvaWQgSW5saW5lRmxvd0JveDo6cGFp
bnRUZXh0RGVjb3JhdGlvbnMoUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgaW50
IHR4LCBpbnQgdHksIGJvb2wgcGFpbnRlZENoaWxkcmVuKQordm9pZCBJbmxpbmVGbG93Qm94Ojpw
YWludFRleHREZWNvcmF0aW9ucyhSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJbmZvLCBp
bnQgdHgsIGludCB0eSwgYm9vbCBwYWludGVkQ2hpbGRyZW4sIExpbmVCb3hQYWludEluZm8mIGxp
bmVCb3hQYWludEluZm8pCiB7CiAgICAgLy8gUGFpbnQgdGV4dCBkZWNvcmF0aW9ucyBsaWtlIHVu
ZGVybGluZXMvb3ZlcmxpbmVzLiBXZSBvbmx5IGRvIHRoaXMgaWYgd2UgYXJlbid0IGluIHF1aXJr
cyBtb2RlIChpLmUuLCBpbgogICAgIC8vIGFsbW9zdC1zdHJpY3QgbW9kZSBvciBzdHJpY3QgbW9k
ZSkuCiAgICAgaWYgKHJlbmRlcmVyKCktPnN0eWxlKCktPmh0bWxIYWNrcygpIHx8ICFyZW5kZXJl
cigpLT5zaG91bGRQYWludFdpdGhpblJvb3QocGFpbnRJbmZvKSB8fAotICAgICAgICByZW5kZXJl
cigpLT5zdHlsZSgpLT52aXNpYmlsaXR5KCkgIT0gVklTSUJMRSkKKyAgICAgICAgcmVuZGVyZXIo
KS0+c3R5bGUoKS0+dmlzaWJpbGl0eSgpICE9IFZJU0lCTEUgfHwgbGluZUJveFBhaW50SW5mby5h
bm9ueW1vdXNJbmxpbmVCbG9jaykKICAgICAgICAgcmV0dXJuOwogICAgIAogICAgIC8vIFdlIGRv
bid0IHdhbnQgdW5kZXJsaW5lcyBvciBvdGhlciBkZWNvcmF0aW9ucyB3aGVuIHdlJ3JlIHRyeWlu
ZyB0byBkcmF3IG5vdGhpbmcgYnV0IHRoZSBzZWxlY3Rpb24gYXMgd2hpdGUgdGV4dC4KSW5kZXg6
IFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUZsb3dCb3guaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3JlbmRlcmluZy9JbmxpbmVGbG93Qm94LmgJKHJldmlzaW9uIDU0NjY0KQorKysgV2ViQ29yZS9y
ZW5kZXJpbmcvSW5saW5lRmxvd0JveC5oCSh3b3JraW5nIGNvcHkpCkBAIC0zOCw2ICszOCw3IEBA
IHB1YmxpYzoKICAgICAgICAgLCBtX2xhc3RDaGlsZCgwKQogICAgICAgICAsIG1faW5jbHVkZUxl
ZnRFZGdlKGZhbHNlKQogICAgICAgICAsIG1faW5jbHVkZVJpZ2h0RWRnZShmYWxzZSkKKyAgICAg
ICAgLCBtX2hhc0Fub255bW91c0lubGluZUJsb2NrKGZhbHNlKQogI2lmbmRlZiBOREVCVUcKICAg
ICAgICAgLCBtX2hhc0JhZENoaWxkTGlzdChmYWxzZSkKICNlbmRpZgpAQCAtODQsMTQgKzg1LDE0
IEBAIHB1YmxpYzoKIAogICAgIHZpcnR1YWwgdm9pZCBjbGVhclRydW5jYXRpb24oKTsKIAotICAg
IHZpcnR1YWwgdm9pZCBwYWludEJveERlY29yYXRpb25zKFJlbmRlck9iamVjdDo6UGFpbnRJbmZv
JiwgaW50IHR4LCBpbnQgdHkpOwotICAgIHZpcnR1YWwgdm9pZCBwYWludE1hc2soUmVuZGVyT2Jq
ZWN0OjpQYWludEluZm8mLCBpbnQgdHgsIGludCB0eSk7CisgICAgdm9pZCBwYWludEJveERlY29y
YXRpb25zKFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiwgaW50IHR4LCBpbnQgdHksIExpbmVCb3hQ
YWludEluZm8mKTsKKyAgICB2b2lkIHBhaW50TWFzayhSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYs
IGludCB0eCwgaW50IHR5LCBMaW5lQm94UGFpbnRJbmZvJik7CiAgICAgdm9pZCBwYWludEZpbGxM
YXllcnMoY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBjb25zdCBDb2xvciYsIGNvbnN0
IEZpbGxMYXllciosIGludCB0eCwgaW50IHR5LCBpbnQgdywgaW50IGgsIENvbXBvc2l0ZU9wZXJh
dG9yID0gQ29tcG9zaXRlU291cmNlT3Zlcik7CiAgICAgdm9pZCBwYWludEZpbGxMYXllcihjb25z
dCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGNvbnN0IENvbG9yJiwgY29uc3QgRmlsbExheWVy
KiwgaW50IHR4LCBpbnQgdHksIGludCB3LCBpbnQgaCwgQ29tcG9zaXRlT3BlcmF0b3IgPSBDb21w
b3NpdGVTb3VyY2VPdmVyKTsKICAgICB2b2lkIHBhaW50Qm94U2hhZG93KEdyYXBoaWNzQ29udGV4
dCosIFJlbmRlclN0eWxlKiwgU2hhZG93U3R5bGUsIGludCB0eCwgaW50IHR5LCBpbnQgdywgaW50
IGgpOwotICAgIHZpcnR1YWwgdm9pZCBwYWludFRleHREZWNvcmF0aW9ucyhSZW5kZXJPYmplY3Q6
OlBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5LCBib29sIHBhaW50ZWRDaGlsZHJlbiA9IGZhbHNl
KTsKLSAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBpbnQg
dHgsIGludCB0eSk7Ci0gICAgdmlydHVhbCBib29sIG5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RS
ZXF1ZXN0JiwgSGl0VGVzdFJlc3VsdCYsIGludCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHkpOwor
ICAgIHZvaWQgcGFpbnRUZXh0RGVjb3JhdGlvbnMoUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBp
bnQgdHgsIGludCB0eSwgYm9vbCBwYWludGVkQ2hpbGRyZW4sIExpbmVCb3hQYWludEluZm8mKTsK
KyAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBpbnQgdHgs
IGludCB0eSwgTGluZUJveFBhaW50SW5mbyYpOworICAgIHZpcnR1YWwgYm9vbCBub2RlQXRQb2lu
dChjb25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBpbnQgeCwgaW50IHksIGlu
dCB0eCwgaW50IHR5LCBIaXRUZXN0QWN0aW9uLCBMaW5lQm94SGl0VGVzdEluZm8mKTsKIAogICAg
IHZpcnR1YWwgUmVuZGVyTGluZUJveExpc3QqIHJlbmRlcmVyTGluZUJveGVzKCkgY29uc3Q7CiAK
QEAgLTE2MSw2ICsxNjIsOSBAQCBwdWJsaWM6CiAgICAgdm9pZCBzZXRIb3Jpem9udGFsT3ZlcmZs
b3dQb3NpdGlvbnMoaW50IGxlZnRMYXlvdXRPdmVyZmxvdywgaW50IHJpZ2h0TGF5b3V0T3ZlcmZs
b3csIGludCBsZWZ0VmlzdWFsT3ZlcmZsb3csIGludCByaWdodFZpc3VhbE92ZXJmbG93KTsKICAg
ICB2b2lkIHNldFZlcnRpY2FsT3ZlcmZsb3dQb3NpdGlvbnMoaW50IHRvcExheW91dE92ZXJmbG93
LCBpbnQgYm90dG9tTGF5b3V0T3ZlcmZsb3csIGludCB0b3BWaXN1YWxPdmVyZmxvdywgaW50IGJv
dHRvbVZpc3VhbE92ZXJmbG93LCBpbnQgYm94SGVpZ2h0KTsKIAorICAgIGJvb2wgaGFzQW5vbnlt
b3VzSW5saW5lQmxvY2soKSBjb25zdCB7IHJldHVybiBtX2hhc0Fub255bW91c0lubGluZUJsb2Nr
OyB9CisgICAgdm9pZCBzZXRIYXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpIHsgbV9oYXNBbm9ueW1v
dXNJbmxpbmVCbG9jayA9IHRydWU7IH0KKwogcHJvdGVjdGVkOgogICAgIE93blB0cjxSZW5kZXJP
dmVyZmxvdz4gbV9vdmVyZmxvdzsKIApAQCAtMTczLDEyICsxNzcsMzEgQEAgcHJpdmF0ZToKICAg
ICBib29sIG1faW5jbHVkZUxlZnRFZGdlIDogMTsKICAgICBib29sIG1faW5jbHVkZVJpZ2h0RWRn
ZSA6IDE7CiAgICAgYm9vbCBtX2hhc1RleHRDaGlsZHJlbiA6IDE7CisgICAgYm9vbCBtX2hhc0Fu
b255bW91c0lubGluZUJsb2NrOiAxOwogCiAjaWZuZGVmIE5ERUJVRwogICAgIGJvb2wgbV9oYXNC
YWRDaGlsZExpc3Q7CiAjZW5kaWYKIH07CiAKKy8vIEZvciBhbm9ueW1vdXMgaW5saW5lIGJsb2Nr
IG9iamVjdHMuCitjbGFzcyBJbmxpbmVGbG93QW5vbnltb3VzSW5saW5lQmxvY2tCb3ggOiBwdWJs
aWMgSW5saW5lRmxvd0JveAoreworcHVibGljOgorICAgIElubGluZUZsb3dBbm9ueW1vdXNJbmxp
bmVCbG9ja0JveChSZW5kZXJPYmplY3QqIGlubGluZUZsb3cpCisgICAgICAgIDogSW5saW5lRmxv
d0JveChpbmxpbmVGbG93KQorICAgIHsKKyAgICAgICAgc2V0SGFzVmlydHVhbEhlaWdodCgpOwor
ICAgICAgICBzZXRIYXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpOworICAgIH0KKyAgICAKKyAgICB2
aXJ0dWFsIGludCB2aXJ0dWFsSGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gbV9oZWlnaHQ7IH0gLy8g
VGhlIGhlaWdodCBvZiB0aGUgYW5vbnltb3VzIGlubGluZSBibG9jayBiZWxvdyB1cyBpbiB0aGUg
bGluZSBib3ggdHJlZS4KKyAgICB2b2lkIHNldEhlaWdodChpbnQgaCkgeyBtX2hlaWdodCA9IGg7
IH0KKworcHJpdmF0ZToKKyAgICBpbnQgbV9oZWlnaHQ7Cit9OworCiBpbmxpbmUgdm9pZCBJbmxp
bmVGbG93Qm94OjpzZXRIb3Jpem9udGFsT3ZlcmZsb3dQb3NpdGlvbnMoaW50IGxlZnRMYXlvdXRP
dmVyZmxvdywgaW50IHJpZ2h0TGF5b3V0T3ZlcmZsb3csIGludCBsZWZ0VmlzdWFsT3ZlcmZsb3cs
IGludCByaWdodFZpc3VhbE92ZXJmbG93KSAKIHsgCiAgICAgaWYgKCFtX292ZXJmbG93KSB7Cklu
ZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVSdW5Cb3guaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL3JlbmRlcmluZy9JbmxpbmVSdW5Cb3guaAkocmV2aXNpb24gNTQ2NjQpCisrKyBXZWJDb3Jl
L3JlbmRlcmluZy9JbmxpbmVSdW5Cb3guaAkod29ya2luZyBjb3B5KQpAQCAtMzgsMTAgKzM4LDcg
QEAgcHVibGljOgogICAgIElubGluZVJ1bkJveCogbmV4dExpbmVCb3goKSBjb25zdCB7IHJldHVy
biBtX25leHRMaW5lOyB9CiAgICAgdm9pZCBzZXROZXh0TGluZUJveChJbmxpbmVSdW5Cb3gqIG4p
IHsgbV9uZXh0TGluZSA9IG47IH0KICAgICB2b2lkIHNldFByZXZpb3VzTGluZUJveChJbmxpbmVS
dW5Cb3gqIHApIHsgbV9wcmV2TGluZSA9IHA7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBwYWludEJv
eERlY29yYXRpb25zKFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiwgaW50IC8qdHgqLywgaW50IC8q
dHkqLykgeyB9Ci0gICAgdmlydHVhbCB2b2lkIHBhaW50VGV4dERlY29yYXRpb25zKFJlbmRlck9i
amVjdDo6UGFpbnRJbmZvJiwgaW50IC8qdHgqLywgaW50IC8qdHkqLywgYm9vbCAvKnBhaW50ZWRD
aGlsZHJlbiovID0gZmFsc2UpIHsgfQotICAgIAorIAogcHJvdGVjdGVkOgogICAgIElubGluZVJ1
bkJveCogbV9wcmV2TGluZTsgIC8vIFRoZSBwcmV2aW91cyBib3ggdGhhdCBhbHNvIHVzZXMgb3Vy
IFJlbmRlck9iamVjdAogICAgIElubGluZVJ1bkJveCogbV9uZXh0TGluZTsgIC8vIFRoZSBuZXh0
IGJveCB0aGF0IGFsc28gdXNlcyBvdXIgUmVuZGVyT2JqZWN0CkluZGV4OiBXZWJDb3JlL3JlbmRl
cmluZy9JbmxpbmVUZXh0Qm94LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9J
bmxpbmVUZXh0Qm94LmNwcAkocmV2aXNpb24gNTQ2NjQpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9J
bmxpbmVUZXh0Qm94LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjYwLDcgKzI2MCw3IEBAIGJvb2wg
SW5saW5lVGV4dEJveDo6aXNMaW5lQnJlYWsoKSBjb25zdAogICAgIHJldHVybiByZW5kZXJlcigp
LT5pc0JSKCkgfHwgKHJlbmRlcmVyKCktPnN0eWxlKCktPnByZXNlcnZlTmV3bGluZSgpICYmIGxl
bigpID09IDEgJiYgKCp0ZXh0UmVuZGVyZXIoKS0+dGV4dCgpKVtzdGFydCgpXSA9PSAnXG4nKTsK
IH0KIAotYm9vbCBJbmxpbmVUZXh0Qm94Ojpub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVz
dCYsIEhpdFRlc3RSZXN1bHQmIHJlc3VsdCwgaW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSkK
K2Jvb2wgSW5saW5lVGV4dEJveDo6bm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmLCBI
aXRUZXN0UmVzdWx0JiByZXN1bHQsIGludCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHksIEhpdFRl
c3RBY3Rpb24sIExpbmVCb3hIaXRUZXN0SW5mbyYpCiB7CiAgICAgaWYgKGlzTGluZUJyZWFrKCkp
CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTMyNCw3ICszMjQsNyBAQCBzdGF0aWMgdm9pZCBw
YWludFRleHRXaXRoU2hhZG93cyhHcmFwaGljCiAgICAgfSB3aGlsZSAoc2hhZG93IHx8IHN0cm9r
ZWQgfHwgIW9wYXF1ZSk7CiB9CiAKLXZvaWQgSW5saW5lVGV4dEJveDo6cGFpbnQoUmVuZGVyT2Jq
ZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgaW50IHR4LCBpbnQgdHkpCit2b2lkIElubGluZVRl
eHRCb3g6OnBhaW50KFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGludCB0eCwg
aW50IHR5LCBMaW5lQm94UGFpbnRJbmZvJikKIHsKICAgICBpZiAoaXNMaW5lQnJlYWsoKSB8fCAh
cmVuZGVyZXIoKS0+c2hvdWxkUGFpbnRXaXRoaW5Sb290KHBhaW50SW5mbykgfHwgcmVuZGVyZXIo
KS0+c3R5bGUoKS0+dmlzaWJpbGl0eSgpICE9IFZJU0lCTEUgfHwKICAgICAgICAgbV90cnVuY2F0
aW9uID09IGNGdWxsVHJ1bmNhdGlvbiB8fCBwYWludEluZm8ucGhhc2UgPT0gUGFpbnRQaGFzZU91
dGxpbmUpCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVUZXh0Qm94LmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lVGV4dEJveC5oCShyZXZpc2lvbiA1NDY2NCkK
KysrIFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZVRleHRCb3guaAkod29ya2luZyBjb3B5KQpAQCAt
NzQsOCArNzQsOCBAQCBwdWJsaWM6CiAgICAgdm9pZCBzZWxlY3Rpb25TdGFydEVuZChpbnQmIHNQ
b3MsIGludCYgZVBvcyk7CiAKIHByaXZhdGU6Ci0gICAgdmlydHVhbCB2b2lkIHBhaW50KFJlbmRl
ck9iamVjdDo6UGFpbnRJbmZvJiwgaW50IHR4LCBpbnQgdHkpOwotICAgIHZpcnR1YWwgYm9vbCBu
b2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBpbnQgeCwg
aW50IHksIGludCB0eCwgaW50IHR5KTsKKyAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoUmVuZGVyT2Jq
ZWN0OjpQYWludEluZm8mLCBpbnQgdHgsIGludCB0eSwgTGluZUJveFBhaW50SW5mbyYpOworICAg
IHZpcnR1YWwgYm9vbCBub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RS
ZXN1bHQmLCBpbnQgeCwgaW50IHksIGludCB0eCwgaW50IHR5LCBIaXRUZXN0QWN0aW9uLCBMaW5l
Qm94SGl0VGVzdEluZm8mKTsKIAogcHVibGljOgogICAgIFJlbmRlclRleHQqIHRleHRSZW5kZXJl
cigpIGNvbnN0OwpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmNwcAkocmV2aXNpb24gNTQ2
NjQpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTc3LDggKzc3LDYgQEAgc3RhdGljIFBlcmNlbnRIZWlnaHREZXNjZW5kYW50c01hcCogZ1Bl
cgogCiB0eXBlZGVmIFdURjo6SGFzaE1hcDxjb25zdCBSZW5kZXJCb3gqLCBIYXNoU2V0PFJlbmRl
ckJsb2NrKj4qPiBQZXJjZW50SGVpZ2h0Q29udGFpbmVyTWFwOwogc3RhdGljIFBlcmNlbnRIZWln
aHRDb250YWluZXJNYXAqIGdQZXJjZW50SGVpZ2h0Q29udGFpbmVyTWFwID0gMDsKLSAgICAKLXR5
cGVkZWYgV1RGOjpIYXNoTWFwPFJlbmRlckJsb2NrKiwgTGlzdEhhc2hTZXQ8UmVuZGVySW5saW5l
Kj4qPiBDb250aW51YXRpb25PdXRsaW5lVGFibGVNYXA7CiAKIHR5cGVkZWYgV1RGOjpIYXNoU2V0
PFJlbmRlckJsb2NrKj4gRGVsYXllZFVwZGF0ZVNjcm9sbEluZm9TZXQ7CiBzdGF0aWMgaW50IGdE
ZWxheVVwZGF0ZVNjcm9sbEluZm8gPSAwOwpAQCAtOTEsNyArODksNyBAQCBSZW5kZXJCbG9jazo6
TWFyZ2luSW5mbzo6TWFyZ2luSW5mbyhSZW5kCiAgICAgLy8gaWYgd2UgaGFkIGFueSBib3JkZXIv
cGFkZGluZyAob2J2aW91c2x5KSwgaWYgd2UncmUgdGhlIHJvb3Qgb3IgSFRNTCBlbGVtZW50cywg
b3IgaWYKICAgICAvLyB3ZSdyZSBwb3NpdGlvbmVkLCBmbG9hdGluZywgYSB0YWJsZSBjZWxsLgog
ICAgIG1fY2FuQ29sbGFwc2VXaXRoQ2hpbGRyZW4gPSAhYmxvY2stPmlzUmVuZGVyVmlldygpICYm
ICFibG9jay0+aXNSb290KCkgJiYgIWJsb2NrLT5pc1Bvc2l0aW9uZWQoKSAmJgotICAgICAgICAh
YmxvY2stPmlzRmxvYXRpbmcoKSAmJiAhYmxvY2stPmlzVGFibGVDZWxsKCkgJiYgIWJsb2NrLT5o
YXNPdmVyZmxvd0NsaXAoKSAmJiAhYmxvY2stPmlzSW5saW5lQmxvY2tPcklubGluZVRhYmxlKCk7
CisgICAgICAgICFibG9jay0+aXNGbG9hdGluZygpICYmICFibG9jay0+aXNUYWJsZUNlbGwoKSAm
JiAhYmxvY2stPmhhc092ZXJmbG93Q2xpcCgpICYmICghYmxvY2stPmlzSW5saW5lQmxvY2tPcklu
bGluZVRhYmxlKCkgfHwgYmxvY2stPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSk7CiAKICAgICBt
X2NhbkNvbGxhcHNlVG9wV2l0aENoaWxkcmVuID0gbV9jYW5Db2xsYXBzZVdpdGhDaGlsZHJlbiAm
JiAodG9wID09IDApICYmIGJsb2NrLT5zdHlsZSgpLT5tYXJnaW5Ub3BDb2xsYXBzZSgpICE9IE1T
RVBBUkFURTsKIApAQCAtMTIwLDcgKzExOCw2IEBAIFJlbmRlckJsb2NrOjpSZW5kZXJCbG9jayhO
b2RlKiBub2RlKQogICAgICAgOiBSZW5kZXJCb3gobm9kZSkKICAgICAgICwgbV9mbG9hdGluZ09i
amVjdHMoMCkKICAgICAgICwgbV9wb3NpdGlvbmVkT2JqZWN0cygwKQotICAgICAgLCBtX2lubGlu
ZUNvbnRpbnVhdGlvbigwKQogICAgICAgLCBtX21heE1hcmdpbigwKQogICAgICAgLCBtX2xpbmVI
ZWlnaHQoLTEpCiB7CkBAIC0xNjEsMTQgKzE1OCw2IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmRlc3Ry
b3koKQogICAgIC8vIE1ha2Ugc3VyZSB0byBkZXN0cm95IGFub255bW91cyBjaGlsZHJlbiBmaXJz
dCB3aGlsZSB0aGV5IGFyZSBzdGlsbCBjb25uZWN0ZWQgdG8gdGhlIHJlc3Qgb2YgdGhlIHRyZWUs
IHNvIHRoYXQgdGhleSB3aWxsCiAgICAgLy8gcHJvcGVybHkgZGlydHkgbGluZSBib3hlcyB0aGF0
IHRoZXkgYXJlIHJlbW92ZWQgZnJvbS4gRWZmZWN0cyB0aGF0IGRvIDpiZWZvcmUvOmFmdGVyIG9u
bHkgb24gaG92ZXIgY291bGQgY3Jhc2ggb3RoZXJ3aXNlLgogICAgIGNoaWxkcmVuKCktPmRlc3Ry
b3lMZWZ0b3ZlckNoaWxkcmVuKCk7Ci0KLSAgICAvLyBEZXN0cm95IG91ciBjb250aW51YXRpb24g
YmVmb3JlIGFueXRoaW5nIG90aGVyIHRoYW4gYW5vbnltb3VzIGNoaWxkcmVuLgotICAgIC8vIFRo
ZSByZWFzb24gd2UgZG9uJ3QgZGVzdHJveSBpdCBiZWZvcmUgYW5vbnltb3VzIGNoaWxkcmVuIGlz
IHRoYXQgdGhleSBtYXkKLSAgICAvLyBoYXZlIGNvbnRpbnVhdGlvbnMgb2YgdGhlaXIgb3duIHRo
YXQgYXJlIGFub255bW91cyBjaGlsZHJlbiBvZiBvdXIgY29udGludWF0aW9uLgotICAgIGlmICht
X2lubGluZUNvbnRpbnVhdGlvbikgewotICAgICAgICBtX2lubGluZUNvbnRpbnVhdGlvbi0+ZGVz
dHJveSgpOwotICAgICAgICBtX2lubGluZUNvbnRpbnVhdGlvbiA9IDA7Ci0gICAgfQogICAgIAog
ICAgIGlmICghZG9jdW1lbnRCZWluZ0Rlc3Ryb3llZCgpKSB7CiAgICAgICAgIGlmIChmaXJzdExp
bmVCb3goKSkgewpAQCAtMzE2LDcgKzMwNSw3IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmFkZENoaWxk
KFJlbmRlck9iamVjdCoKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoIWNoaWxkcmVuSW5saW5l
KCkgJiYgKG5ld0NoaWxkLT5pc0Zsb2F0aW5nT3JQb3NpdGlvbmVkKCkgfHwgbmV3Q2hpbGQtPmlz
SW5saW5lKCkpKSB7CiAgICAgICAgIC8vIElmIHdlJ3JlIGluc2VydGluZyBhbiBpbmxpbmUgY2hp
bGQgYnV0IGFsbCBvZiBvdXIgY2hpbGRyZW4gYXJlIGJsb2NrcywgdGhlbiB3ZSBoYXZlIHRvIG1h
a2Ugc3VyZQotICAgICAgICAvLyBpdCBpcyBwdXQgaW50byBhbiBhbm9teW91cyBibG9jayBib3gu
IFdlIHRyeSB0byB1c2UgYW4gZXhpc3RpbmcgYW5vbnltb3VzIGJveCBpZiBwb3NzaWJsZSwgb3Ro
ZXJ3aXNlCisgICAgICAgIC8vIGl0IGlzIHB1dCBpbnRvIGFuIGFub255bW91cyBibG9jayBib3gu
IFdlIHRyeSB0byB1c2UgYW4gZXhpc3RpbmcgYW5vbnltb3VzIGJveCBpZiBwb3NzaWJsZSwgb3Ro
ZXJ3aXNlCiAgICAgICAgIC8vIGEgbmV3IG9uZSBpcyBjcmVhdGVkIGFuZCBpbnNlcnRlZCBpbnRv
IG91ciBsaXN0IG9mIGNoaWxkcmVuIGluIHRoZSBhcHByb3ByaWF0ZSBwb3NpdGlvbi4KICAgICAg
ICAgUmVuZGVyT2JqZWN0KiBhZnRlckNoaWxkID0gYmVmb3JlQ2hpbGQgPyBiZWZvcmVDaGlsZC0+
cHJldmlvdXNTaWJsaW5nKCkgOiBsYXN0Q2hpbGQoKTsKIApAQCAtMzkxLDkgKzM4MCw5IEBAIFJv
b3RJbmxpbmVCb3gqIFJlbmRlckJsb2NrOjpjcmVhdGVSb290SW4KICAgICByZXR1cm4gbmV3IChy
ZW5kZXJBcmVuYSgpKSBSb290SW5saW5lQm94KHRoaXMpOwogfQogCi1Sb290SW5saW5lQm94KiBS
ZW5kZXJCbG9jazo6Y3JlYXRlQW5kQXBwZW5kUm9vdElubGluZUJveCgpCi17Ci0gICAgUm9vdElu
bGluZUJveCogcm9vdEJveCA9IGNyZWF0ZVJvb3RJbmxpbmVCb3goKTsKK1Jvb3RJbmxpbmVCb3gq
IFJlbmRlckJsb2NrOjpjcmVhdGVBbmRBcHBlbmRSb290SW5saW5lQm94KFJlbmRlckJsb2NrKiBh
bm9ueW1vdXNJbmxpbmVCbG9jaykKK3sgCisgICAgUm9vdElubGluZUJveCogcm9vdEJveCA9IGFu
b255bW91c0lubGluZUJsb2NrID8gbmV3IChyZW5kZXJBcmVuYSgpKSBSb290QW5vbnltb3VzSW5s
aW5lQmxvY2tCb3godGhpcywgYW5vbnltb3VzSW5saW5lQmxvY2spIDogY3JlYXRlUm9vdElubGlu
ZUJveCgpOwogICAgIG1fbGluZUJveGVzLmFwcGVuZExpbmVCb3gocm9vdEJveCk7CiAgICAgcmV0
dXJuIHJvb3RCb3g7CiB9CkBAIC00OTAsOSArNDc5LDYgQEAgdm9pZCBSZW5kZXJCbG9jazo6cmVt
b3ZlTGVmdG92ZXJBbm9ueW1vdQogICAgIEFTU0VSVChjaGlsZC0+aXNBbm9ueW1vdXNCbG9jaygp
KTsKICAgICBBU1NFUlQoIWNoaWxkLT5jaGlsZHJlbklubGluZSgpKTsKICAgICAKLSAgICBpZiAo
Y2hpbGQtPmlubGluZUNvbnRpbnVhdGlvbigpKSAKLSAgICAgICAgcmV0dXJuOwotICAgIAogICAg
IFJlbmRlck9iamVjdCogZmlyc3RBbkNoaWxkID0gY2hpbGQtPm1fY2hpbGRyZW4uZmlyc3RDaGls
ZCgpOwogICAgIFJlbmRlck9iamVjdCogbGFzdEFuQ2hpbGQgPSBjaGlsZC0+bV9jaGlsZHJlbi5s
YXN0Q2hpbGQoKTsKICAgICBpZiAoZmlyc3RBbkNoaWxkKSB7CkBAIC01MzUsNyArNTIxLDcgQEAg
dm9pZCBSZW5kZXJCbG9jazo6cmVtb3ZlQ2hpbGQoUmVuZGVyT2JqZQogICAgIFJlbmRlck9iamVj
dCogcHJldiA9IG9sZENoaWxkLT5wcmV2aW91c1NpYmxpbmcoKTsKICAgICBSZW5kZXJPYmplY3Qq
IG5leHQgPSBvbGRDaGlsZC0+bmV4dFNpYmxpbmcoKTsKICAgICBib29sIGNhbkRlbGV0ZUFub255
bW91c0Jsb2NrcyA9ICFkb2N1bWVudEJlaW5nRGVzdHJveWVkKCkgJiYgIWlzSW5saW5lKCkgJiYg
IW9sZENoaWxkLT5pc0lubGluZSgpICYmIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgKCFvbGRDaGlsZC0+aXNSZW5kZXJCbG9jaygpIHx8ICF0b1JlbmRlckJsb2NrKG9sZENo
aWxkKS0+aW5saW5lQ29udGludWF0aW9uKCkpICYmIAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIW9sZENoaWxkLT5pc1JlbmRlckJsb2NrKCkgJiYgCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAoIXByZXYgfHwgKHByZXYtPmlzQW5vbnltb3VzQmxvY2so
KSAmJiBwcmV2LT5jaGlsZHJlbklubGluZSgpKSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICghbmV4dCB8fCAobmV4dC0+aXNBbm9ueW1vdXNCbG9jaygpICYmIG5leHQt
PmNoaWxkcmVuSW5saW5lKCkpKTsKICAgICBpZiAoY2FuRGVsZXRlQW5vbnltb3VzQmxvY2tzICYm
IHByZXYgJiYgbmV4dCkgewpAQCAtNTk4LDkgKzU4NCwxNSBAQCBib29sIFJlbmRlckJsb2NrOjpp
c1NlbGZDb2xsYXBzaW5nQmxvY2soCiAgICAgLy8gb24gd2hldGhlciB3ZSBoYXZlIGNvbnRlbnQg
dGhhdCBpcyBhbGwgc2VsZi1jb2xsYXBzaW5nIG9yIG5vdC4KICAgICBpZiAoaGFzQXV0b0hlaWdo
dCB8fCAoKHN0eWxlKCktPmhlaWdodCgpLmlzRml4ZWQoKSB8fCBzdHlsZSgpLT5oZWlnaHQoKS5p
c1BlcmNlbnQoKSkgJiYgc3R5bGUoKS0+aGVpZ2h0KCkuaXNaZXJvKCkpKSB7CiAgICAgICAgIC8v
IElmIHRoZSBibG9jayBoYXMgaW5saW5lIGNoaWxkcmVuLCBzZWUgaWYgd2UgZ2VuZXJhdGVkIGFu
eSBsaW5lIGJveGVzLiAgSWYgd2UgaGF2ZSBhbnkKLSAgICAgICAgLy8gbGluZSBib3hlcywgdGhl
biB3ZSBjYW4ndCBiZSBzZWxmLWNvbGxhcHNpbmcsIHNpbmNlIHdlIGhhdmUgY29udGVudC4KLSAg
ICAgICAgaWYgKGNoaWxkcmVuSW5saW5lKCkpCi0gICAgICAgICAgICByZXR1cm4gIWZpcnN0TGlu
ZUJveCgpOworICAgICAgICAvLyBsaW5lIGJveGVzLCB0aGVuIHdlIGNhbiBvbmx5IGJlIHNlbGYt
Y29sbGFwc2luZyBpZiB3ZSBoYXZlIG5vdGhpbmcgYnV0IGFub255bW91cyBpbmxpbmUgYmxvY2tz
CisgICAgICAgIC8vIHRoYXQgYXJlIGFsc28gc2VsZi1jb2xsYXBzaW5nIGluc2lkZSB1cy4KKyAg
ICAgICAgaWYgKGNoaWxkcmVuSW5saW5lKCkpIHsKKyAgICAgICAgICAgIGZvciAoUm9vdElubGlu
ZUJveCogY2hpbGQgPSBmaXJzdFJvb3RCb3goKTsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHRS
b290Qm94KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWNoaWxkLT5oYXNBbm9ueW1vdXNJbmxp
bmVCbG9jaygpIHx8ICFjaGlsZC0+YW5vbnltb3VzSW5saW5lQmxvY2soKS0+aXNTZWxmQ29sbGFw
c2luZ0Jsb2NrKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBXZSBoYXZlIG5vIGxpbmUgYm94ZXMs
IHNvIHdlIG11c3QgYmUgc2VsZi1jb2xsYXBzaW5nLgorICAgICAgICB9CiAgICAgICAgIAogICAg
ICAgICAvLyBXaGV0aGVyIG9yIG5vdCB3ZSBjb2xsYXBzZSBpcyBkZXBlbmRlbnQgb24gd2hldGhl
ciBhbGwgb3VyIG5vcm1hbCBmbG93IGNoaWxkcmVuCiAgICAgICAgIC8vIGFyZSBhbHNvIHNlbGYt
Y29sbGFwc2luZy4KQEAgLTg1NSw3ICs4NDcsOCBAQCB2b2lkIFJlbmRlckJsb2NrOjphZGRPdmVy
Zmxvd0Zyb21GbG9hdHMoCiAKIGJvb2wgUmVuZGVyQmxvY2s6OmV4cGFuZHNUb0VuY2xvc2VPdmVy
aGFuZ2luZ0Zsb2F0cygpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIGlzSW5saW5lQmxvY2tPcklubGlu
ZVRhYmxlKCkgfHwgaXNGbG9hdGluZ09yUG9zaXRpb25lZCgpIHx8IGhhc092ZXJmbG93Q2xpcCgp
IHx8IChwYXJlbnQoKSAmJiBwYXJlbnQoKS0+aXNGbGV4aWJsZUJveCgpKSB8fCBoYXNDb2x1bW5z
KCkgfHwgaXNUYWJsZUNlbGwoKSB8fCBpc0ZpZWxkc2V0KCk7CisgICAgcmV0dXJuIGlzRmxvYXRp
bmdPclBvc2l0aW9uZWQoKSB8fCBoYXNPdmVyZmxvd0NsaXAoKSB8fCAocGFyZW50KCkgJiYgcGFy
ZW50KCktPmlzRmxleGlibGVCb3goKSkgfHwgaGFzQ29sdW1ucygpIHx8IGlzVGFibGVDZWxsKCkg
fHwgaXNGaWVsZHNldCgpIHx8CisgICAgICAgICAgIChpc0lubGluZUJsb2NrT3JJbmxpbmVUYWJs
ZSgpICYmICFpc0Fub255bW91c0lubGluZUJsb2NrKCkpOwogfQogCiB2b2lkIFJlbmRlckJsb2Nr
OjphZGp1c3RQb3NpdGlvbmVkQmxvY2soUmVuZGVyQm94KiBjaGlsZCwgY29uc3QgTWFyZ2luSW5m
byYgbWFyZ2luSW5mbykKQEAgLTEwMDEsMTkgKzk5NCwxOSBAQCBib29sIFJlbmRlckJsb2NrOjpo
YW5kbGVSdW5JbkNoaWxkKFJlbmRlCiBpbnQgUmVuZGVyQmxvY2s6OmNvbGxhcHNlTWFyZ2lucyhS
ZW5kZXJCb3gqIGNoaWxkLCBNYXJnaW5JbmZvJiBtYXJnaW5JbmZvKQogewogICAgIC8vIEdldCBv
dXIgbWF4IHBvcyBhbmQgbmVnIHRvcCBtYXJnaW5zLgotICAgIGludCBwb3NUb3AgPSBjaGlsZC0+
bWF4VG9wTWFyZ2luKHRydWUpOwotICAgIGludCBuZWdUb3AgPSBjaGlsZC0+bWF4VG9wTWFyZ2lu
KGZhbHNlKTsKKyAgICBpbnQgcG9zVG9wID0gY2hpbGQgPyBjaGlsZC0+bWF4VG9wTWFyZ2luKHRy
dWUpIDogMDsKKyAgICBpbnQgbmVnVG9wID0gY2hpbGQgPyBjaGlsZC0+bWF4VG9wTWFyZ2luKGZh
bHNlKSA6IDA7CiAKICAgICAvLyBGb3Igc2VsZi1jb2xsYXBzaW5nIGJsb2NrcywgY29sbGFwc2Ug
b3VyIGJvdHRvbSBtYXJnaW5zIGludG8gb3VyCiAgICAgLy8gdG9wIHRvIGdldCBuZXcgcG9zVG9w
IGFuZCBuZWdUb3AgdmFsdWVzLgotICAgIGlmIChjaGlsZC0+aXNTZWxmQ29sbGFwc2luZ0Jsb2Nr
KCkpIHsKKyAgICBpZiAoY2hpbGQgJiYgY2hpbGQtPmlzU2VsZkNvbGxhcHNpbmdCbG9jaygpKSB7
CiAgICAgICAgIHBvc1RvcCA9IG1heChwb3NUb3AsIGNoaWxkLT5tYXhCb3R0b21NYXJnaW4odHJ1
ZSkpOwogICAgICAgICBuZWdUb3AgPSBtYXgobmVnVG9wLCBjaGlsZC0+bWF4Qm90dG9tTWFyZ2lu
KGZhbHNlKSk7CiAgICAgfQogICAgIAogICAgIC8vIFNlZSBpZiB0aGUgdG9wIG1hcmdpbiBpcyBx
dWlya3kuIFdlIG9ubHkgY2FyZSBpZiB0aGlzIGNoaWxkIGhhcwogICAgIC8vIG1hcmdpbnMgdGhh
dCB3aWxsIGNvbGxhcHNlIHdpdGggdXMuCi0gICAgYm9vbCB0b3BRdWlyayA9IGNoaWxkLT5pc1Rv
cE1hcmdpblF1aXJrKCkgfHwgc3R5bGUoKS0+bWFyZ2luVG9wQ29sbGFwc2UoKSA9PSBNRElTQ0FS
RDsKKyAgICBib29sIHRvcFF1aXJrID0gKGNoaWxkICYmIGNoaWxkLT5pc1RvcE1hcmdpblF1aXJr
KCkpIHx8IHN0eWxlKCktPm1hcmdpblRvcENvbGxhcHNlKCkgPT0gTURJU0NBUkQ7CiAKICAgICBp
ZiAobWFyZ2luSW5mby5jYW5Db2xsYXBzZVdpdGhUb3AoKSkgewogICAgICAgICAvLyBUaGlzIGNo
aWxkIGlzIGNvbGxhcHNpbmcgd2l0aCB0aGUgdG9wIG9mIHRoZQpAQCAtMTAyNiw3ICsxMDE5LDcg
QEAgaW50IFJlbmRlckJsb2NrOjpjb2xsYXBzZU1hcmdpbnMoUmVuZGVyQgogICAgICAgICAvLyBj
b2xsYXBzZSBpdCBhd2F5LCBldmVuIGlmIHRoZSBtYXJnaW4gaXMgc21hbGxlciAod3d3LndlYnJl
ZmVyZW5jZS5jb20KICAgICAgICAgLy8gaGFzIGFuIGV4YW1wbGUgb2YgdGhpcywgYSA8ZHQ+IHdp
dGggMC44ZW0gYXV0aG9yLXNwZWNpZmllZCBpbnNpZGUKICAgICAgICAgLy8gYSA8ZGw+IGluc2lk
ZSBhIDx0ZD4uCi0gICAgICAgIGlmICghbWFyZ2luSW5mby5kZXRlcm1pbmVkVG9wUXVpcmsoKSAm
JiAhdG9wUXVpcmsgJiYgKHBvc1RvcC1uZWdUb3ApKSB7CisgICAgICAgIGlmICghbWFyZ2luSW5m
by5kZXRlcm1pbmVkVG9wUXVpcmsoKSAmJiAhdG9wUXVpcmsgJiYgKHBvc1RvcCAtIG5lZ1RvcCkp
IHsKICAgICAgICAgICAgIHNldFRvcE1hcmdpblF1aXJrKGZhbHNlKTsKICAgICAgICAgICAgIG1h
cmdpbkluZm8uc2V0RGV0ZXJtaW5lZFRvcFF1aXJrKHRydWUpOwogICAgICAgICB9CkBAIC0xMDQ0
LDcgKzEwMzcsNyBAQCBpbnQgUmVuZGVyQmxvY2s6OmNvbGxhcHNlTWFyZ2lucyhSZW5kZXJCCiAg
ICAgICAgIG1hcmdpbkluZm8uc2V0VG9wUXVpcmsodG9wUXVpcmspOwogCiAgICAgaW50IHlwb3Mg
PSBoZWlnaHQoKTsKLSAgICBpZiAoY2hpbGQtPmlzU2VsZkNvbGxhcHNpbmdCbG9jaygpKSB7Cisg
ICAgaWYgKGNoaWxkICYmIGNoaWxkLT5pc1NlbGZDb2xsYXBzaW5nQmxvY2soKSkgewogICAgICAg
ICAvLyBUaGlzIGNoaWxkIGhhcyBubyBoZWlnaHQuICBXZSBuZWVkIHRvIGNvbXB1dGUgb3VyCiAg
ICAgICAgIC8vIHBvc2l0aW9uIGJlZm9yZSB3ZSBjb2xsYXBzZSB0aGUgY2hpbGQncyBtYXJnaW5z
IHRvZ2V0aGVyLAogICAgICAgICAvLyBzbyB0aGF0IHdlIGNhbiBnZXQgYW4gYWNjdXJhdGUgcG9z
aXRpb24gZm9yIHRoZSB6ZXJvLWhlaWdodCBibG9jay4KQEAgLTEwNjMsMTMgKzEwNTYsMTEgQEAg
aW50IFJlbmRlckJsb2NrOjpjb2xsYXBzZU1hcmdpbnMoUmVuZGVyQgogICAgICAgICAgICAgLy8g
dGhhdCBuZWVkcyB0byBiZSBwb3NpdGlvbmVkIGNvcnJlY3RseSAoZS5nLiwgYSBibG9jayB0aGF0
CiAgICAgICAgICAgICAvLyBoYWQgYSBzcGVjaWZpZWQgaGVpZ2h0IG9mIDAgYnV0IHRoYXQgYWN0
dWFsbHkgaGFkIHN1YmNvbnRlbnQpLgogICAgICAgICAgICAgeXBvcyA9IGhlaWdodCgpICsgY29s
bGFwc2VkVG9wUG9zIC0gY29sbGFwc2VkVG9wTmVnOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAg
ICAgaWYgKGNoaWxkLT5zdHlsZSgpLT5tYXJnaW5Ub3BDb2xsYXBzZSgpID09IE1TRVBBUkFURSkg
eworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChjaGlsZCAmJiBjaGlsZC0+c3R5bGUoKS0+bWFy
Z2luVG9wQ29sbGFwc2UoKSA9PSBNU0VQQVJBVEUpIHsKICAgICAgICAgICAgIHNldEhlaWdodCho
ZWlnaHQoKSArIG1hcmdpbkluZm8ubWFyZ2luKCkgKyBjaGlsZC0+bWFyZ2luVG9wKCkpOwogICAg
ICAgICAgICAgeXBvcyA9IGhlaWdodCgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCFt
YXJnaW5JbmZvLmF0VG9wT2ZCbG9jaygpIHx8CisgICAgICAgIH0gZWxzZSBpZiAoIW1hcmdpbklu
Zm8uYXRUb3BPZkJsb2NrKCkgfHwKICAgICAgICAgICAgICghbWFyZ2luSW5mby5jYW5Db2xsYXBz
ZVRvcFdpdGhDaGlsZHJlbigpCiAgICAgICAgICAgICAgJiYgKCFzdHlsZSgpLT5odG1sSGFja3Mo
KSB8fCAhbWFyZ2luSW5mby5xdWlya0NvbnRhaW5lcigpIHx8ICFtYXJnaW5JbmZvLnRvcFF1aXJr
KCkpKSkgewogICAgICAgICAgICAgLy8gV2UncmUgY29sbGFwc2luZyB3aXRoIGEgcHJldmlvdXMg
c2libGluZydzIG1hcmdpbnMgYW5kIG5vdApAQCAtMTA3OCwxMSArMTA2OSwxMSBAQCBpbnQgUmVu
ZGVyQmxvY2s6OmNvbGxhcHNlTWFyZ2lucyhSZW5kZXJCCiAgICAgICAgICAgICB5cG9zID0gaGVp
Z2h0KCk7CiAgICAgICAgIH0KIAotICAgICAgICBtYXJnaW5JbmZvLnNldFBvc01hcmdpbihjaGls
ZC0+bWF4Qm90dG9tTWFyZ2luKHRydWUpKTsKLSAgICAgICAgbWFyZ2luSW5mby5zZXROZWdNYXJn
aW4oY2hpbGQtPm1heEJvdHRvbU1hcmdpbihmYWxzZSkpOworICAgICAgICBtYXJnaW5JbmZvLnNl
dFBvc01hcmdpbihjaGlsZCA/IGNoaWxkLT5tYXhCb3R0b21NYXJnaW4odHJ1ZSkgOiAwKTsKKyAg
ICAgICAgbWFyZ2luSW5mby5zZXROZWdNYXJnaW4oY2hpbGQgPyBjaGlsZC0+bWF4Qm90dG9tTWFy
Z2luKGZhbHNlKSA6IDApOwogCiAgICAgICAgIGlmIChtYXJnaW5JbmZvLm1hcmdpbigpKQotICAg
ICAgICAgICAgbWFyZ2luSW5mby5zZXRCb3R0b21RdWlyayhjaGlsZC0+aXNCb3R0b21NYXJnaW5R
dWlyaygpIHx8IHN0eWxlKCktPm1hcmdpbkJvdHRvbUNvbGxhcHNlKCkgPT0gTURJU0NBUkQpOwor
ICAgICAgICAgICAgbWFyZ2luSW5mby5zZXRCb3R0b21RdWlyaygoY2hpbGQgJiYgY2hpbGQtPmlz
Qm90dG9tTWFyZ2luUXVpcmsoKSkgfHwgc3R5bGUoKS0+bWFyZ2luQm90dG9tQ29sbGFwc2UoKSA9
PSBNRElTQ0FSRCk7CiAgICAgfQogICAgIAogICAgIHJldHVybiB5cG9zOwpAQCAtMTc0OSwyMCAr
MTc0MCw3IEBAIHZvaWQgUmVuZGVyQmxvY2s6OnBhaW50T2JqZWN0KFBhaW50SW5mbyYKICAgICBp
ZiAoKHBhaW50UGhhc2UgPT0gUGFpbnRQaGFzZU91dGxpbmUgfHwgcGFpbnRQaGFzZSA9PSBQYWlu
dFBoYXNlU2VsZk91dGxpbmUpICYmIGhhc091dGxpbmUoKSAmJiBzdHlsZSgpLT52aXNpYmlsaXR5
KCkgPT0gVklTSUJMRSkKICAgICAgICAgcGFpbnRPdXRsaW5lKHBhaW50SW5mby5jb250ZXh0LCB0
eCwgdHksIHdpZHRoKCksIGhlaWdodCgpLCBzdHlsZSgpKTsKIAotICAgIC8vIDYuIHBhaW50IGNv
bnRpbnVhdGlvbiBvdXRsaW5lcy4KLSAgICBpZiAoKHBhaW50UGhhc2UgPT0gUGFpbnRQaGFzZU91
dGxpbmUgfHwgcGFpbnRQaGFzZSA9PSBQYWludFBoYXNlQ2hpbGRPdXRsaW5lcykpIHsKLSAgICAg
ICAgaWYgKGlubGluZUNvbnRpbnVhdGlvbigpICYmIGlubGluZUNvbnRpbnVhdGlvbigpLT5oYXNP
dXRsaW5lKCkgJiYgaW5saW5lQ29udGludWF0aW9uKCktPnN0eWxlKCktPnZpc2liaWxpdHkoKSA9
PSBWSVNJQkxFKSB7Ci0gICAgICAgICAgICBSZW5kZXJJbmxpbmUqIGlubGluZVJlbmRlcmVyID0g
dG9SZW5kZXJJbmxpbmUoaW5saW5lQ29udGludWF0aW9uKCktPm5vZGUoKS0+cmVuZGVyZXIoKSk7
Ci0gICAgICAgICAgICBpZiAoIWlubGluZVJlbmRlcmVyLT5oYXNTZWxmUGFpbnRpbmdMYXllcigp
KQotICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdCbG9jaygpLT5hZGRDb250aW51YXRpb25XaXRo
T3V0bGluZShpbmxpbmVSZW5kZXJlcik7Ci0gICAgICAgICAgICBlbHNlIGlmICghaW5saW5lUmVu
ZGVyZXItPmZpcnN0TGluZUJveCgpKQotICAgICAgICAgICAgICAgIGlubGluZVJlbmRlcmVyLT5w
YWludE91dGxpbmUocGFpbnRJbmZvLmNvbnRleHQsIHR4IC0geCgpICsgaW5saW5lUmVuZGVyZXIt
PmNvbnRhaW5pbmdCbG9jaygpLT54KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICB0eSAtIHkoKSArIGlubGluZVJlbmRlcmVyLT5jb250YWluaW5nQmxvY2so
KS0+eSgpKTsKLSAgICAgICAgfQotICAgICAgICBwYWludENvbnRpbnVhdGlvbk91dGxpbmVzKHBh
aW50SW5mbywgdHgsIHR5KTsKLSAgICB9Ci0KLSAgICAvLyA3LiBwYWludCBjYXJldC4KKyAgICAv
LyA2LiBwYWludCBjYXJldC4KICAgICAvLyBJZiB0aGUgY2FyZXQncyBub2RlJ3MgcmVuZGVyIG9i
amVjdCdzIGNvbnRhaW5pbmcgYmxvY2sgaXMgdGhpcyBibG9jaywgYW5kIHRoZSBwYWludCBhY3Rp
b24gaXMgUGFpbnRQaGFzZUZvcmVncm91bmQsCiAgICAgLy8gdGhlbiBwYWludCB0aGUgY2FyZXQu
CiAgICAgaWYgKHBhaW50UGhhc2UgPT0gUGFpbnRQaGFzZUZvcmVncm91bmQpIHsgICAgICAgIApA
QCAtMTgyNSw1NyArMTgwMyw2IEBAIHZvaWQgUmVuZGVyQmxvY2s6OnBhaW50RWxsaXBzaXNCb3hl
cyhQYWkKICAgICB9CiB9CiAKLXN0YXRpYyBDb250aW51YXRpb25PdXRsaW5lVGFibGVNYXAqIGNv
bnRpbnVhdGlvbk91dGxpbmVUYWJsZSgpCi17Ci0gICAgREVGSU5FX1NUQVRJQ19MT0NBTChDb250
aW51YXRpb25PdXRsaW5lVGFibGVNYXAsIHRhYmxlLCAoKSk7Ci0gICAgcmV0dXJuICZ0YWJsZTsK
LX0KLQotdm9pZCBSZW5kZXJCbG9jazo6YWRkQ29udGludWF0aW9uV2l0aE91dGxpbmUoUmVuZGVy
SW5saW5lKiBmbG93KQotewotICAgIC8vIFdlIGNhbid0IG1ha2UgdGhpcyB3b3JrIGlmIHRoZSBp
bmxpbmUgaXMgaW4gYSBsYXllci4gIFdlJ2xsIGp1c3QgcmVseSBvbiB0aGUgYnJva2VuCi0gICAg
Ly8gd2F5IG9mIHBhaW50aW5nLgotICAgIEFTU0VSVCghZmxvdy0+bGF5ZXIoKSAmJiAhZmxvdy0+
aXNJbmxpbmVDb250aW51YXRpb24oKSk7Ci0gICAgCi0gICAgQ29udGludWF0aW9uT3V0bGluZVRh
YmxlTWFwKiB0YWJsZSA9IGNvbnRpbnVhdGlvbk91dGxpbmVUYWJsZSgpOwotICAgIExpc3RIYXNo
U2V0PFJlbmRlcklubGluZSo+KiBjb250aW51YXRpb25zID0gdGFibGUtPmdldCh0aGlzKTsKLSAg
ICBpZiAoIWNvbnRpbnVhdGlvbnMpIHsKLSAgICAgICAgY29udGludWF0aW9ucyA9IG5ldyBMaXN0
SGFzaFNldDxSZW5kZXJJbmxpbmUqPjsKLSAgICAgICAgdGFibGUtPnNldCh0aGlzLCBjb250aW51
YXRpb25zKTsKLSAgICB9Ci0gICAgCi0gICAgY29udGludWF0aW9ucy0+YWRkKGZsb3cpOwotfQot
Ci12b2lkIFJlbmRlckJsb2NrOjpwYWludENvbnRpbnVhdGlvbk91dGxpbmVzKFBhaW50SW5mbyYg
aW5mbywgaW50IHR4LCBpbnQgdHkpCi17Ci0gICAgQ29udGludWF0aW9uT3V0bGluZVRhYmxlTWFw
KiB0YWJsZSA9IGNvbnRpbnVhdGlvbk91dGxpbmVUYWJsZSgpOwotICAgIGlmICh0YWJsZS0+aXNF
bXB0eSgpKQotICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgIExpc3RIYXNoU2V0PFJlbmRl
cklubGluZSo+KiBjb250aW51YXRpb25zID0gdGFibGUtPmdldCh0aGlzKTsKLSAgICBpZiAoIWNv
bnRpbnVhdGlvbnMpCi0gICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgLy8gUGFpbnQgZWFj
aCBjb250aW51YXRpb24gb3V0bGluZS4KLSAgICBMaXN0SGFzaFNldDxSZW5kZXJJbmxpbmUqPjo6
aXRlcmF0b3IgZW5kID0gY29udGludWF0aW9ucy0+ZW5kKCk7Ci0gICAgZm9yIChMaXN0SGFzaFNl
dDxSZW5kZXJJbmxpbmUqPjo6aXRlcmF0b3IgaXQgPSBjb250aW51YXRpb25zLT5iZWdpbigpOyBp
dCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgLy8gTmVlZCB0byBhZGQgaW4gdGhlIGNvb3JkaW5h
dGVzIG9mIHRoZSBpbnRlcnZlbmluZyBibG9ja3MuCi0gICAgICAgIFJlbmRlcklubGluZSogZmxv
dyA9ICppdDsKLSAgICAgICAgUmVuZGVyQmxvY2sqIGJsb2NrID0gZmxvdy0+Y29udGFpbmluZ0Js
b2NrKCk7Ci0gICAgICAgIGZvciAoIDsgYmxvY2sgJiYgYmxvY2sgIT0gdGhpczsgYmxvY2sgPSBi
bG9jay0+Y29udGFpbmluZ0Jsb2NrKCkpIHsKLSAgICAgICAgICAgIHR4ICs9IGJsb2NrLT54KCk7
Ci0gICAgICAgICAgICB0eSArPSBibG9jay0+eSgpOwotICAgICAgICB9Ci0gICAgICAgIEFTU0VS
VChibG9jayk7ICAgCi0gICAgICAgIGZsb3ctPnBhaW50T3V0bGluZShpbmZvLmNvbnRleHQsIHR4
LCB0eSk7Ci0gICAgfQotICAgIAotICAgIC8vIERlbGV0ZQotICAgIGRlbGV0ZSBjb250aW51YXRp
b25zOwotICAgIHRhYmxlLT5yZW1vdmUodGhpcyk7Ci19Ci0KIHZvaWQgUmVuZGVyQmxvY2s6OnNl
dFNlbGVjdGlvblN0YXRlKFNlbGVjdGlvblN0YXRlIHMpCiB7CiAgICAgaWYgKHNlbGVjdGlvblN0
YXRlKCkgPT0gcykKQEAgLTE4OTAsNiArMTgxNywxMiBAQCB2b2lkIFJlbmRlckJsb2NrOjpzZXRT
ZWxlY3Rpb25TdGF0ZShTZWxlCiAgICAgZWxzZQogICAgICAgICBSZW5kZXJCb3g6OnNldFNlbGVj
dGlvblN0YXRlKHMpOwogICAgIAorICAgIGlmIChpc1JlcGxhY2VkKCkgJiYgbV9pbmxpbmVCb3hX
cmFwcGVyKSB7CisgICAgICAgIFJvb3RJbmxpbmVCb3gqIGxpbmUgPSBtX2lubGluZUJveFdyYXBw
ZXItPnJvb3QoKTsKKyAgICAgICAgaWYgKGxpbmUpCisgICAgICAgICAgICBsaW5lLT5zZXRIYXNT
ZWxlY3RlZENoaWxkcmVuKHMgIT0gU2VsZWN0aW9uTm9uZSk7CisgICAgfQorCiAgICAgUmVuZGVy
QmxvY2sqIGNiID0gY29udGFpbmluZ0Jsb2NrKCk7CiAgICAgaWYgKGNiICYmICFjYi0+aXNSZW5k
ZXJWaWV3KCkpCiAgICAgICAgIGNiLT5zZXRTZWxlY3Rpb25TdGF0ZShzKTsKQEAgLTE5MDgsOSAr
MTg0MSw5IEBAIGJvb2wgUmVuZGVyQmxvY2s6OmlzU2VsZWN0aW9uUm9vdCgpIGNvbnMKICAgICAv
LyBGSVhNRTogRXZlbnR1YWxseSB0YWJsZXMgc2hvdWxkIGhhdmUgdG8gbGVhcm4gaG93IHRvIGZp
bGwgZ2FwcyBiZXR3ZWVuIGNlbGxzLCBhdCBsZWFzdCBpbiBzaW1wbGUgbm9uLXNwYW5uaW5nIGNh
c2VzLgogICAgIGlmIChpc1RhYmxlKCkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAg
CisKICAgICBpZiAoaXNCb2R5KCkgfHwgaXNSb290KCkgfHwgaGFzT3ZlcmZsb3dDbGlwKCkgfHwg
aXNSZWxQb3NpdGlvbmVkKCkgfHwKLSAgICAgICAgaXNGbG9hdGluZ09yUG9zaXRpb25lZCgpIHx8
IGlzVGFibGVDZWxsKCkgfHwgaXNJbmxpbmVCbG9ja09ySW5saW5lVGFibGUoKSB8fCBoYXNUcmFu
c2Zvcm0oKSB8fAorICAgICAgICBpc0Zsb2F0aW5nT3JQb3NpdGlvbmVkKCkgfHwgaXNUYWJsZUNl
bGwoKSB8fCAoaXNJbmxpbmVCbG9ja09ySW5saW5lVGFibGUoKSAmJiAhaXNBbm9ueW1vdXNJbmxp
bmVCbG9jaygpKSB8fCBoYXNUcmFuc2Zvcm0oKSB8fAogICAgICAgICBoYXNSZWZsZWN0aW9uKCkg
fHwgaGFzTWFzaygpKQogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAKQEAgLTIwNTUsMTggKzE5
ODgsMzAgQEAgR2FwUmVjdHMgUmVuZGVyQmxvY2s6OmZpbGxJbmxpbmVTZWxlY3RpbwogICAgIGZv
ciAoY3VyciA9IGZpcnN0Um9vdEJveCgpOyBjdXJyICYmICFjdXJyLT5oYXNTZWxlY3RlZENoaWxk
cmVuKCk7IGN1cnIgPSBjdXJyLT5uZXh0Um9vdEJveCgpKSB7IH0KIAogICAgIC8vIE5vdyBwYWlu
dCB0aGUgZ2FwcyBmb3IgdGhlIGxpbmVzLgotICAgIGZvciAoOyBjdXJyICYmIGN1cnItPmhhc1Nl
bGVjdGVkQ2hpbGRyZW4oKTsgY3VyciA9IGN1cnItPm5leHRSb290Qm94KCkpIHsKKyAgICBmb3Ig
KDsgY3VyciAmJiAoY3Vyci0+aGFzU2VsZWN0ZWRDaGlsZHJlbigpIHx8IGN1cnItPmhhc0Fub255
bW91c0lubGluZUJsb2NrKCkpOyBjdXJyID0gY3Vyci0+bmV4dFJvb3RCb3goKSkgeworICAgICAg
ICBpZiAoIWN1cnItPmhhc1NlbGVjdGVkQ2hpbGRyZW4oKSkKKyAgICAgICAgICAgIGNvbnRpbnVl
OworCiAgICAgICAgIGludCBzZWxUb3AgPSAgY3Vyci0+c2VsZWN0aW9uVG9wKCk7CiAgICAgICAg
IGludCBzZWxIZWlnaHQgPSBjdXJyLT5zZWxlY3Rpb25IZWlnaHQoKTsKIAotICAgICAgICBpZiAo
IWNvbnRhaW5zU3RhcnQgJiYgIWxhc3RTZWxlY3RlZExpbmUgJiYKLSAgICAgICAgICAgIHNlbGVj
dGlvblN0YXRlKCkgIT0gU2VsZWN0aW9uU3RhcnQgJiYgc2VsZWN0aW9uU3RhdGUoKSAhPSBTZWxl
Y3Rpb25Cb3RoKQotICAgICAgICAgICAgcmVzdWx0LnVuaXRlQ2VudGVyKGZpbGxWZXJ0aWNhbFNl
bGVjdGlvbkdhcChsYXN0VG9wLCBsYXN0TGVmdCwgbGFzdFJpZ2h0LCB0eSArIHNlbFRvcCwKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9v
dEJsb2NrLCBibG9ja1gsIGJsb2NrWSwgcGFpbnRJbmZvKSk7Ci0KLSAgICAgICAgaWYgKCFwYWlu
dEluZm8gfHwgKHR5ICsgc2VsVG9wIDwgcGFpbnRJbmZvLT5yZWN0LmJvdHRvbSgpICYmIHR5ICsg
c2VsVG9wICsgc2VsSGVpZ2h0ID4gcGFpbnRJbmZvLT5yZWN0LnkoKSkpCi0gICAgICAgICAgICBy
ZXN1bHQudW5pdGUoY3Vyci0+ZmlsbExpbmVTZWxlY3Rpb25HYXAoc2VsVG9wLCBzZWxIZWlnaHQs
IHJvb3RCbG9jaywgYmxvY2tYLCBibG9ja1ksIHR4LCB0eSwgcGFpbnRJbmZvKSk7CisgICAgICAg
IGlmIChjdXJyLT5oYXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CisgICAgICAgICAgICBpZiAo
bGFzdFNlbGVjdGVkTGluZSkgeworICAgICAgICAgICAgICAgIGxhc3RUb3AgPSAodHkgLSBibG9j
a1kpICsgbGFzdFNlbGVjdGVkTGluZS0+c2VsZWN0aW9uQm90dG9tKCk7CisgICAgICAgICAgICAg
ICAgbGFzdExlZnQgPSBsZWZ0U2VsZWN0aW9uT2Zmc2V0KHJvb3RCbG9jaywgbGFzdFNlbGVjdGVk
TGluZS0+c2VsZWN0aW9uQm90dG9tKCkpOworICAgICAgICAgICAgICAgIGxhc3RSaWdodCA9IHJp
Z2h0U2VsZWN0aW9uT2Zmc2V0KHJvb3RCbG9jaywgbGFzdFNlbGVjdGVkTGluZS0+c2VsZWN0aW9u
Qm90dG9tKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGFpbnNTdGFydCA9IGZh
bHNlOworICAgICAgICAgICAgcmVzdWx0LnVuaXRlKGN1cnItPmFub255bW91c0lubGluZUJsb2Nr
KCktPmZpbGxTZWxlY3Rpb25HYXBzKHJvb3RCbG9jaywgYmxvY2tYLCBibG9ja1ksIHR4ICsgY3Vy
ci0+eCgpLCB0eSArIGN1cnItPnkoKSwgbGFzdFRvcCwgbGFzdExlZnQsIGxhc3RSaWdodCwgcGFp
bnRJbmZvKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIWNvbnRhaW5zU3Rh
cnQgJiYgKCFsYXN0U2VsZWN0ZWRMaW5lIHx8IGxhc3RTZWxlY3RlZExpbmUtPmFub255bW91c0lu
bGluZUJsb2NrKCkpKQorICAgICAgICAgICAgICAgIHJlc3VsdC51bml0ZUNlbnRlcihmaWxsVmVy
dGljYWxTZWxlY3Rpb25HYXAobGFzdFRvcCwgbGFzdExlZnQsIGxhc3RSaWdodCwgdHkgKyBzZWxU
b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICByb290QmxvY2ssIGJsb2NrWCwgYmxvY2tZLCBwYWludEluZm8pKTsKIAorICAgICAg
ICAgICAgaWYgKCFwYWludEluZm8gfHwgKHR5ICsgc2VsVG9wIDwgcGFpbnRJbmZvLT5yZWN0LmJv
dHRvbSgpICYmIHR5ICsgc2VsVG9wICsgc2VsSGVpZ2h0ID4gcGFpbnRJbmZvLT5yZWN0LnkoKSkp
CisgICAgICAgICAgICAgICAgcmVzdWx0LnVuaXRlKGN1cnItPmZpbGxMaW5lU2VsZWN0aW9uR2Fw
KHNlbFRvcCwgc2VsSGVpZ2h0LCByb290QmxvY2ssIGJsb2NrWCwgYmxvY2tZLCB0eCwgdHksIHBh
aW50SW5mbykpOworICAgICAgICB9CisgICAgICAgIAogICAgICAgICBsYXN0U2VsZWN0ZWRMaW5l
ID0gY3VycjsKICAgICB9CiAKQEAgLTIwNzQsOCArMjAxOSw4IEBAIEdhcFJlY3RzIFJlbmRlckJs
b2NrOjpmaWxsSW5saW5lU2VsZWN0aW8KICAgICAgICAgLy8gVmlzaWJsZVNlbGVjdGlvbiBtdXN0
IHN0YXJ0IGp1c3QgYWZ0ZXIgb3VyIGxhc3QgbGluZS4KICAgICAgICAgbGFzdFNlbGVjdGVkTGlu
ZSA9IGxhc3RSb290Qm94KCk7CiAKLSAgICBpZiAobGFzdFNlbGVjdGVkTGluZSAmJiBzZWxlY3Rp
b25TdGF0ZSgpICE9IFNlbGVjdGlvbkVuZCAmJiBzZWxlY3Rpb25TdGF0ZSgpICE9IFNlbGVjdGlv
bkJvdGgpIHsKLSAgICAgICAgLy8gR28gYWhlYWQgYW5kIHVwZGF0ZSBvdXIgbGFzdFkgdG8gYmUg
dGhlIGJvdHRvbSBvZiB0aGUgbGFzdCBzZWxlY3RlZCBsaW5lLgorICAgIGlmIChsYXN0U2VsZWN0
ZWRMaW5lICYmICFsYXN0U2VsZWN0ZWRMaW5lLT5oYXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpICYm
IHNlbGVjdGlvblN0YXRlKCkgIT0gU2VsZWN0aW9uRW5kICYmIHNlbGVjdGlvblN0YXRlKCkgIT0g
U2VsZWN0aW9uQm90aCkgeworICAgICAgICAvLyBHbyBhaGVhZCBhbmQgdXBkYXRlIG91ciBsYXN0
VG9wIHRvIGJlIHRoZSBib3R0b20gb2YgdGhlIGxhc3Qgc2VsZWN0ZWQgbGluZS4KICAgICAgICAg
bGFzdFRvcCA9ICh0eSAtIGJsb2NrWSkgKyBsYXN0U2VsZWN0ZWRMaW5lLT5zZWxlY3Rpb25Cb3R0
b20oKTsKICAgICAgICAgbGFzdExlZnQgPSBsZWZ0U2VsZWN0aW9uT2Zmc2V0KHJvb3RCbG9jaywg
bGFzdFNlbGVjdGVkTGluZS0+c2VsZWN0aW9uQm90dG9tKCkpOwogICAgICAgICBsYXN0UmlnaHQg
PSByaWdodFNlbGVjdGlvbk9mZnNldChyb290QmxvY2ssIGxhc3RTZWxlY3RlZExpbmUtPnNlbGVj
dGlvbkJvdHRvbSgpKTsKQEAgLTI5ODUsMjUgKzI5MzAsMzEgQEAgdm9pZCBSZW5kZXJCbG9jazo6
Y2xlYXJGbG9hdHMoKQogICAgIC8vIG91dCBvZiBmbG93IChsaWtlIGZsb2F0aW5nL3Bvc2l0aW9u
ZWQgZWxlbWVudHMpLCBhbmQgd2UgYWxzbyBza2lwIG92ZXIgYW55IG9iamVjdHMgdGhhdCBtYXkg
aGF2ZSBzaGlmdGVkCiAgICAgLy8gdG8gYXZvaWQgZmxvYXRzLgogICAgIGJvb2wgcGFyZW50SGFz
RmxvYXRzID0gZmFsc2U7Ci0gICAgUmVuZGVyT2JqZWN0KiBwcmV2ID0gcHJldmlvdXNTaWJsaW5n
KCk7Ci0gICAgd2hpbGUgKHByZXYgJiYgKHByZXYtPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSB8
fCAhcHJldi0+aXNCb3goKSB8fCAhcHJldi0+aXNSZW5kZXJCbG9jaygpIHx8IHRvUmVuZGVyQmxv
Y2socHJldiktPmF2b2lkc0Zsb2F0cygpKSkgewotICAgICAgICBpZiAocHJldi0+aXNGbG9hdGlu
ZygpKQotICAgICAgICAgICAgcGFyZW50SGFzRmxvYXRzID0gdHJ1ZTsKLSAgICAgICAgIHByZXYg
PSBwcmV2LT5wcmV2aW91c1NpYmxpbmcoKTsKKyAgICBSZW5kZXJPYmplY3QqIHByZXYgPSAwOwor
ICAgIFJlbmRlckJsb2NrKiBwYXJlbnRCbG9jayA9IDA7CisgICAgaWYgKGlzQW5vbnltb3VzSW5s
aW5lQmxvY2soKSkgeworICAgICAgICBwYXJlbnRCbG9jayA9IGNvbnRhaW5pbmdCbG9jaygpOwor
ICAgICAgICBwYXJlbnRIYXNGbG9hdHMgPSBwYXJlbnRCbG9jay0+Y29udGFpbnNGbG9hdHMoKTsK
KyAgICB9IGVsc2UgeyAgICAKKyAgICAgICAgd2hpbGUgKHByZXYgJiYgKHByZXYtPmlzRmxvYXRp
bmdPclBvc2l0aW9uZWQoKSB8fCAhcHJldi0+aXNCb3goKSB8fCAhcHJldi0+aXNSZW5kZXJCbG9j
aygpIHx8IHRvUmVuZGVyQmxvY2socHJldiktPmF2b2lkc0Zsb2F0cygpKSkgeworICAgICAgICAg
ICAgaWYgKHByZXYtPmlzRmxvYXRpbmcoKSkKKyAgICAgICAgICAgICAgICBwYXJlbnRIYXNGbG9h
dHMgPSB0cnVlOworICAgICAgICAgICAgcHJldiA9IHByZXYtPnByZXZpb3VzU2libGluZygpOwor
ICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwYXJlbnRCbG9jayA9IHBhcmVudCgpLT5pc1Jl
bmRlckJsb2NrKCkgPyB0b1JlbmRlckJsb2NrKHBhcmVudCgpKSA6IDA7CiAgICAgfQogCiAgICAg
Ly8gRmlyc3QgYWRkIGluIGZsb2F0cyBmcm9tIHRoZSBwYXJlbnQuCiAgICAgaW50IG9mZnNldCA9
IHkoKTsKLSAgICBpZiAocGFyZW50SGFzRmxvYXRzKSB7Ci0gICAgICAgIFJlbmRlckJsb2NrKiBw
YXJlbnRCbG9jayA9IHRvUmVuZGVyQmxvY2socGFyZW50KCkpOworICAgIGlmIChwYXJlbnRIYXNG
bG9hdHMpCiAgICAgICAgIGFkZEludHJ1ZGluZ0Zsb2F0cyhwYXJlbnRCbG9jaywgcGFyZW50Qmxv
Y2stPmJvcmRlckxlZnQoKSArIHBhcmVudEJsb2NrLT5wYWRkaW5nTGVmdCgpLCBvZmZzZXQpOwot
ICAgIH0KLSAgICAKKwogICAgIGludCB4b2Zmc2V0ID0gMDsKICAgICBpZiAocHJldikKICAgICAg
ICAgb2Zmc2V0IC09IHRvUmVuZGVyQm94KHByZXYpLT55KCk7Ci0gICAgZWxzZSBpZiAocGFyZW50
KCktPmlzQm94KCkpIHsKLSAgICAgICAgcHJldiA9IHBhcmVudCgpOworICAgIGVsc2UgaWYgKHBh
cmVudEJsb2NrKSB7CisgICAgICAgIHByZXYgPSBwYXJlbnRCbG9jazsKICAgICAgICAgeG9mZnNl
dCArPSB0b1JlbmRlckJveChwcmV2KS0+Ym9yZGVyTGVmdCgpICsgdG9SZW5kZXJCb3gocHJldikt
PnBhZGRpbmdMZWZ0KCk7CiAgICAgfQogCkBAIC0zMTM4LDcgKzMwODksNyBAQCB2b2lkIFJlbmRl
ckJsb2NrOjphZGRJbnRydWRpbmdGbG9hdHMoUmVuCiAgICAgICAgICAgICAgICAgLy8gYWJvdmUu
ICB8eG9mZnwgd2lsbCBlcXVhbCAtZmxvdy0+bWFyZ2luTGVmdCgpIGluIHRoaXMgY2FzZSwgc28g
aXQncyBhbHJlYWR5IGJlZW4gdGFrZW4KICAgICAgICAgICAgICAgICAvLyBpbnRvIGFjY291bnQu
ICBPbmx5IGFwcGx5IHRoaXMgY29kZSBpZiB8Y2hpbGR8IGlzIGZhbHNlLCBzaW5jZSBvdGhlcndp
c2UgdGhlIGxlZnQgbWFyZ2luCiAgICAgICAgICAgICAgICAgLy8gd2lsbCBnZXQgYXBwbGllZCB0
d2ljZS4KLSAgICAgICAgICAgICAgICBpZiAocHJldiAhPSBwYXJlbnQoKSkKKyAgICAgICAgICAg
ICAgICBpZiAocHJldiAhPSBjb250YWluaW5nQmxvY2soKSkKICAgICAgICAgICAgICAgICAgICAg
ZmxvYXRpbmdPYmotPm1fbGVmdCArPSBwcmV2LT5tYXJnaW5MZWZ0KCk7CiAgICAgICAgICAgICAg
ICAgZmxvYXRpbmdPYmotPm1fbGVmdCAtPSBtYXJnaW5MZWZ0KCk7CiAgICAgICAgICAgICAgICAg
ZmxvYXRpbmdPYmotPm1fc2hvdWxkUGFpbnQgPSBmYWxzZTsgIC8vIFdlIGFyZSBub3QgaW4gdGhl
IGRpcmVjdCBpbmhlcml0YW5jZSBjaGFpbiBmb3IgdGhpcyBmbG9hdC4gV2Ugd2lsbCBuZXZlciBw
YWludCBpdC4KQEAgLTMxODMsNyArMzEzNCwxMyBAQCB2b2lkIFJlbmRlckJsb2NrOjptYXJrQWxs
RGVzY2VuZGFudHNXaXRoCiAgICAgICAgIHJlbW92ZUZsb2F0aW5nT2JqZWN0KGZsb2F0VG9SZW1v
dmUpOwogCiAgICAgLy8gSXRlcmF0ZSBvdmVyIG91ciBjaGlsZHJlbiBhbmQgbWFyayB0aGVtIGFz
IG5lZWRlZC4KLSAgICBpZiAoIWNoaWxkcmVuSW5saW5lKCkpIHsKKyAgICBpZiAoY2hpbGRyZW5J
bmxpbmUoKSkgeworICAgICAgICBmb3IgKFJvb3RJbmxpbmVCb3gqIGJveCA9IGZpcnN0Um9vdEJv
eCgpOyBib3g7IGJveCA9IGJveC0+bmV4dFJvb3RCb3goKSkgeworICAgICAgICAgICAgUmVuZGVy
QmxvY2sqIGNoaWxkQmxvY2sgPSBib3gtPmFub255bW91c0lubGluZUJsb2NrKCk7CisgICAgICAg
ICAgICBpZiAoY2hpbGRCbG9jayAmJiAoZmxvYXRUb1JlbW92ZSA/IGNoaWxkQmxvY2stPmNvbnRh
aW5zRmxvYXQoZmxvYXRUb1JlbW92ZSkgOiBjaGlsZEJsb2NrLT5jb250YWluc0Zsb2F0cygpKSkK
KyAgICAgICAgICAgICAgICBjaGlsZEJsb2NrLT5tYXJrQWxsRGVzY2VuZGFudHNXaXRoRmxvYXRz
Rm9yTGF5b3V0KGZsb2F0VG9SZW1vdmUsIGluTGF5b3V0KTsKKyAgICAgICAgfQorICAgIH0gZWxz
ZSB7CiAgICAgICAgIGZvciAoUmVuZGVyT2JqZWN0KiBjaGlsZCA9IGZpcnN0Q2hpbGQoKTsgY2hp
bGQ7IGNoaWxkID0gY2hpbGQtPm5leHRTaWJsaW5nKCkpIHsKICAgICAgICAgICAgIGlmICgoIWZs
b2F0VG9SZW1vdmUgJiYgY2hpbGQtPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSkgfHwgIWNoaWxk
LT5pc1JlbmRlckJsb2NrKCkpCiAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC0zNDUxLDYg
KzM0MDgsMTEgQEAgc3RhdGljIFZpc2libGVQb3NpdGlvbiBwb3NpdGlvbkZvclBvaW50UgogICAg
IHJldHVybiBhbmNlc3Rvci0+Y3JlYXRlVmlzaWJsZVBvc2l0aW9uKGNoaWxkTm9kZS0+bm9kZUlu
ZGV4KCkgKyAxLCBVUFNUUkVBTSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0NoaWxkSGl0
VGVzdENhbmRpZGF0ZShSZW5kZXJCb3gqIGJveCkKK3sKKyAgICByZXR1cm4gYm94LT5oZWlnaHQo
KSAmJiBib3gtPnN0eWxlKCktPnZpc2liaWxpdHkoKSA9PSBWSVNJQkxFICYmICFib3gtPmlzRmxv
YXRpbmdPclBvc2l0aW9uZWQoKTsKK30KKwogVmlzaWJsZVBvc2l0aW9uIFJlbmRlckJsb2NrOjpw
b3NpdGlvbkZvclBvaW50V2l0aElubGluZUNoaWxkcmVuKGNvbnN0IEludFBvaW50JiBwb2ludElu
Q29udGVudHMpCiB7CiAgICAgQVNTRVJUKGNoaWxkcmVuSW5saW5lKCkpOwpAQCAtMzQ2Myw4ICsz
NDI1LDE4IEBAIFZpc2libGVQb3NpdGlvbiBSZW5kZXJCbG9jazo6cG9zaXRpb25Gb3IKICAgICBS
b290SW5saW5lQm94KiBmaXJzdFJvb3RCb3hXaXRoQ2hpbGRyZW4gPSAwOwogICAgIFJvb3RJbmxp
bmVCb3gqIGxhc3RSb290Qm94V2l0aENoaWxkcmVuID0gMDsKICAgICBmb3IgKFJvb3RJbmxpbmVC
b3gqIHJvb3QgPSBmaXJzdFJvb3RCb3goKTsgcm9vdDsgcm9vdCA9IHJvb3QtPm5leHRSb290Qm94
KCkpIHsKKyAgICAgICAgUmVuZGVyQmxvY2sqIGNoaWxkQmxvY2sgPSByb290LT5hbm9ueW1vdXNJ
bmxpbmVCbG9jaygpOworICAgICAgICBpZiAoY2hpbGRCbG9jaykgeworICAgICAgICAgICAgZmly
c3RSb290Qm94V2l0aENoaWxkcmVuID0gMDsKKyAgICAgICAgICAgIGxhc3RSb290Qm94V2l0aENo
aWxkcmVuID0gMDsKKyAgICAgICAgICAgIGlmIChpc0NoaWxkSGl0VGVzdENhbmRpZGF0ZShjaGls
ZEJsb2NrKSAmJiBwb2ludEluQ29udGVudHMueSgpIDwgY2hpbGRCbG9jay0+ZnJhbWVSZWN0KCku
Ym90dG9tKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uRm9yUG9pbnRSZXNwZWN0
aW5nRWRpdGluZ0JvdW5kYXJpZXModGhpcywgY2hpbGRCbG9jaywgcG9pbnRJbkNvbnRlbnRzKTsK
KyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKICAgICAgICAgaWYgKCFyb290LT5m
aXJzdExlYWZDaGlsZCgpKQogICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIAogICAgICAg
ICBpZiAoIWZpcnN0Um9vdEJveFdpdGhDaGlsZHJlbikKICAgICAgICAgICAgIGZpcnN0Um9vdEJv
eFdpdGhDaGlsZHJlbiA9IHJvb3Q7CiAgICAgICAgIGxhc3RSb290Qm94V2l0aENoaWxkcmVuID0g
cm9vdDsKQEAgLTM0NzIsNyArMzQ0NCw3IEBAIFZpc2libGVQb3NpdGlvbiBSZW5kZXJCbG9jazo6
cG9zaXRpb25Gb3IKICAgICAgICAgLy8gc2V0IHRoZSBib3R0b20gYmFzZWQgb24gd2hldGhlciB0
aGVyZSBpcyBhIG5leHQgcm9vdCBib3gKICAgICAgICAgLy8gRklYTUU6IFRoaXMgd2lsbCBjb25z
aWRlciBuZXh0Um9vdEJveCBldmVuIGlmIGl0IGhhcyBubyBjaGlsZHJlbiwgYW5kIG1heWJlIGl0
IHNob3VsZG4ndC4KICAgICAgICAgaW50IGJvdHRvbTsKLSAgICAgICAgaWYgKHJvb3QtPm5leHRS
b290Qm94KCkpIHsKKyAgICAgICAgaWYgKHJvb3QtPm5leHRSb290Qm94KCkgJiYgIXJvb3QtPm5l
eHRSb290Qm94KCktPmhhc0Fub255bW91c0lubGluZUJsb2NrKCkpIHsKICAgICAgICAgICAgIC8v
IEZJWE1FOiBXZSB3b3VsZCBwcmVmZXIgdG8gbWFrZSB0aGUgYnJlYWsgcG9pbnQgaGFsZndheSBi
ZXR3ZWVuIHRoZSBib3R0b20KICAgICAgICAgICAgIC8vIG9mIHRoZSBwcmV2aW91cyByb290IGJv
eCBhbmQgdGhlIHRvcCBvZiB0aGUgbmV4dCByb290IGJveC4KICAgICAgICAgICAgIGJvdHRvbSA9
IHJvb3QtPm5leHRSb290Qm94KCktPmxpbmVUb3AoKTsKQEAgLTM1MTcsMTcgKzM0ODksMTIgQEAg
VmlzaWJsZVBvc2l0aW9uIFJlbmRlckJsb2NrOjpwb3NpdGlvbkZvcgogICAgIHJldHVybiBjcmVh
dGVWaXNpYmxlUG9zaXRpb24oMCwgRE9XTlNUUkVBTSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgYm9v
bCBpc0NoaWxkSGl0VGVzdENhbmRpZGF0ZShSZW5kZXJCb3gqIGJveCkKLXsKLSAgICByZXR1cm4g
Ym94LT5oZWlnaHQoKSAmJiBib3gtPnN0eWxlKCktPnZpc2liaWxpdHkoKSA9PSBWSVNJQkxFICYm
ICFib3gtPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKTsKLX0KLQogVmlzaWJsZVBvc2l0aW9uIFJl
bmRlckJsb2NrOjpwb3NpdGlvbkZvclBvaW50KGNvbnN0IEludFBvaW50JiBwb2ludCkKIHsKICAg
ICBpZiAoaXNUYWJsZSgpKQogICAgICAgICByZXR1cm4gUmVuZGVyQm94Ojpwb3NpdGlvbkZvclBv
aW50KHBvaW50KTsKIAotICAgIGlmIChpc1JlcGxhY2VkKCkpIHsKKyAgICBpZiAoaXNSZXBsYWNl
ZCgpICYmICFpc0Fub255bW91c0lubGluZUJsb2NrKCkpIHsKICAgICAgICAgaWYgKHBvaW50Lnko
KSA8IDAgfHwgKHBvaW50LnkoKSA8IGhlaWdodCgpICYmIHBvaW50LngoKSA8IDApKQogICAgICAg
ICAgICAgcmV0dXJuIGNyZWF0ZVZpc2libGVQb3NpdGlvbihjYXJldE1pbk9mZnNldCgpLCBET1dO
U1RSRUFNKTsKICAgICAgICAgaWYgKHBvaW50LnkoKSA+PSBoZWlnaHQoKSB8fCAocG9pbnQueSgp
ID49IDAgJiYgcG9pbnQueCgpID49IHdpZHRoKCkpKQpAQCAtNDE0MiwxNCArNDEwOSwxNSBAQCB2
b2lkIFJlbmRlckJsb2NrOjpjYWxjSW5saW5lUHJlZldpZHRocygpCiAgICAgICAgICAgICAgICAg
fSBlbHNlCiAgICAgICAgICAgICAgICAgICAgIGNsZWFyUHJldmlvdXNGbG9hdCA9IGZhbHNlOwog
Ci0gICAgICAgICAgICAgICAgYm9vbCBjYW5CcmVha1JlcGxhY2VkRWxlbWVudCA9ICFjaGlsZC0+
aXNJbWFnZSgpIHx8IGFsbG93SW1hZ2VzVG9CcmVhazsKKyAgICAgICAgICAgICAgICBib29sIGNh
bkJyZWFrUmVwbGFjZWRFbGVtZW50ID0gIWNoaWxkLT5pc0ltYWdlKCkgfHwgYWxsb3dJbWFnZXNU
b0JyZWFrIHx8IGNoaWxkLT5pc0Fub255bW91c0lubGluZUJsb2NrKCk7CiAgICAgICAgICAgICAg
ICAgaWYgKChjYW5CcmVha1JlcGxhY2VkRWxlbWVudCAmJiAoYXV0b1dyYXAgfHwgb2xkQXV0b1dy
YXApKSB8fCBjbGVhclByZXZpb3VzRmxvYXQpIHsKICAgICAgICAgICAgICAgICAgICAgbV9taW5Q
cmVmV2lkdGggPSBtYXgoaW5saW5lTWluLCBtX21pblByZWZXaWR0aCk7CiAgICAgICAgICAgICAg
ICAgICAgIGlubGluZU1pbiA9IDA7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAg
ICAgLy8gSWYgd2UncmUgc3VwcG9zZWQgdG8gY2xlYXIgdGhlIHByZXZpb3VzIGZsb2F0LCB0aGVu
IHRlcm1pbmF0ZSBtYXh3aWR0aCBhcyB3ZWxsLgotICAgICAgICAgICAgICAgIGlmIChjbGVhclBy
ZXZpb3VzRmxvYXQpIHsKKyAgICAgICAgICAgICAgICAvLyBBbHNvIGRvIHRoaXMgZm9yIGFub255
bW91cyBpbmxpbmUgYmxvY2tzLgorICAgICAgICAgICAgICAgIGlmIChjbGVhclByZXZpb3VzRmxv
YXQgfHwgY2hpbGQtPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkgewogICAgICAgICAgICAgICAg
ICAgICBtX21heFByZWZXaWR0aCA9IG1heChpbmxpbmVNYXgsIG1fbWF4UHJlZldpZHRoKTsKICAg
ICAgICAgICAgICAgICAgICAgaW5saW5lTWF4ID0gMDsKICAgICAgICAgICAgICAgICB9CkBAIC00
MTU4LDE1ICs0MTI2LDE3IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmNhbGNJbmxpbmVQcmVmV2lkdGhz
KCkKICAgICAgICAgICAgICAgICBpbnQgdGkgPSAwOwogICAgICAgICAgICAgICAgIGlmICghYWRk
ZWRUZXh0SW5kZW50KSB7CiAgICAgICAgICAgICAgICAgICAgIGFkZGVkVGV4dEluZGVudCA9IHRy
dWU7Ci0gICAgICAgICAgICAgICAgICAgIHRpID0gc3R5bGUoKS0+dGV4dEluZGVudCgpLmNhbGNN
aW5WYWx1ZShjdyk7Ci0gICAgICAgICAgICAgICAgICAgIGNoaWxkTWluKz10aTsKLSAgICAgICAg
ICAgICAgICAgICAgY2hpbGRNYXgrPXRpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxk
LT5pc0Fub255bW91c0lubGluZUJsb2NrKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRp
ID0gc3R5bGUoKS0+dGV4dEluZGVudCgpLmNhbGNNaW5WYWx1ZShjdyk7CisgICAgICAgICAgICAg
ICAgICAgICAgICBjaGlsZE1pbiArPSB0aTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxk
TWF4ICs9IHRpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCiAg
ICAgICAgICAgICAgICAgLy8gQWRkIG91ciB3aWR0aCB0byB0aGUgbWF4LgogICAgICAgICAgICAg
ICAgIGlubGluZU1heCArPSBjaGlsZE1heDsKIAotICAgICAgICAgICAgICAgIGlmICghYXV0b1dy
YXAgfHwgIWNhbkJyZWFrUmVwbGFjZWRFbGVtZW50KSB7CisgICAgICAgICAgICAgICAgaWYgKCgh
YXV0b1dyYXAgfHwgIWNhbkJyZWFrUmVwbGFjZWRFbGVtZW50KSAmJiAhY2hpbGQtPmlzQW5vbnlt
b3VzSW5saW5lQmxvY2soKSkgewogICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQtPmlzRmxv
YXRpbmcoKSkKICAgICAgICAgICAgICAgICAgICAgICAgIG1fbWluUHJlZldpZHRoID0gbWF4KGNo
aWxkTWluLCBtX21pblByZWZXaWR0aCk7CiAgICAgICAgICAgICAgICAgICAgIGVsc2UKQEAgLTQx
NzcsNiArNDE0NywxMiBAQCB2b2lkIFJlbmRlckJsb2NrOjpjYWxjSW5saW5lUHJlZldpZHRocygp
CiAKICAgICAgICAgICAgICAgICAgICAgLy8gTm93IHN0YXJ0IGEgbmV3IGxpbmUuCiAgICAgICAg
ICAgICAgICAgICAgIGlubGluZU1pbiA9IDA7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAg
ICAgICAgICAgICAgICBpZiAoY2hpbGQtPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkgeworICAg
ICAgICAgICAgICAgICAgICAgICAgLy8gVGVybWluYXRlIG1heCB3aWR0aCBhcyB3ZWxsLgorICAg
ICAgICAgICAgICAgICAgICAgICAgbV9tYXhQcmVmV2lkdGggPSBtYXgoY2hpbGRNYXgsIG1fbWF4
UHJlZldpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZU1heCA9IDA7CisgICAg
ICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAv
LyBXZSBhcmUgbm8gbG9uZ2VyIHN0cmlwcGluZyB3aGl0ZXNwYWNlIGF0IHRoZSBzdGFydCBvZgpA
QCAtNDQxNyw5ICs0MzkzLDEyIEBAIGludCBSZW5kZXJCbG9jazo6bGluZUhlaWdodChib29sIGZp
cnN0TGkKICAgICAvLyB0aGUgYmFzZSBjbGFzcy4gIElmIHdlJ3JlIGJlaW5nIHF1ZXJpZWQgYXMg
dGhvdWdoIHdlJ3JlIHRoZSByb290IGxpbmUKICAgICAvLyBib3gsIHRoZW4gdGhlIGZhY3QgdGhh
dCB3ZSdyZSBhbiBpbmxpbmUtYmxvY2sgaXMgaXJyZWxldmFudCwgYW5kIHdlIGJlaGF2ZQogICAg
IC8vIGp1c3QgbGlrZSBhIGJsb2NrLgotICAgIGlmIChpc1JlcGxhY2VkKCkgJiYgIWlzUm9vdExp
bmVCb3gpCisgICAgaWYgKGlzUmVwbGFjZWQoKSAmJiAhaXNSb290TGluZUJveCkgeworICAgICAg
ICBpZiAoaXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKQorICAgICAgICAgICAgcmV0dXJuIGhlaWdo
dCgpOwogICAgICAgICByZXR1cm4gaGVpZ2h0KCkgKyBtYXJnaW5Ub3AoKSArIG1hcmdpbkJvdHRv
bSgpOwotICAgIAorICAgIH0KKwogICAgIGlmIChmaXJzdExpbmUgJiYgZG9jdW1lbnQoKS0+dXNl
c0ZpcnN0TGluZVJ1bGVzKCkpIHsKICAgICAgICAgUmVuZGVyU3R5bGUqIHMgPSBzdHlsZShmaXJz
dExpbmUpOwogICAgICAgICBpZiAocyAhPSBzdHlsZSgpKQpAQCAtNDQ1MSw2ICs0NDMwLDggQEAg
aW50IFJlbmRlckJsb2NrOjpiYXNlbGluZVBvc2l0aW9uKGJvb2wgYgogICAgICAgICAvLyBXZSBh
bHNvIGdpdmUgdXAgb24gZmluZGluZyBhIGJhc2VsaW5lIGlmIHdlIGhhdmUgYSB2ZXJ0aWNhbCBz
Y3JvbGxiYXIsIG9yIGlmIHdlIGFyZSBzY3JvbGxlZAogICAgICAgICAvLyB2ZXJ0aWNhbGx5IChl
LmcuLCBhbiBvdmVyZmxvdzpoaWRkZW4gYmxvY2sgdGhhdCBoYXMgaGFkIHNjcm9sbFRvcCBtb3Zl
ZCkgb3IgaWYgdGhlIGJhc2VsaW5lIGlzIG91dHNpZGUKICAgICAgICAgLy8gb2Ygb3VyIGNvbnRl
bnQgYm94LgorICAgICAgICBpZiAoaXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKQorICAgICAgICAg
ICAgcmV0dXJuIGhlaWdodCgpOwogICAgICAgICBpbnQgYmFzZWxpbmVQb3MgPSAobGF5ZXIoKSAm
JiAobGF5ZXIoKS0+bWFycXVlZSgpIHx8IGxheWVyKCktPnZlcnRpY2FsU2Nyb2xsYmFyKCkgfHwg
bGF5ZXIoKS0+c2Nyb2xsWU9mZnNldCgpICE9IDApKSA/IC0xIDogbGFzdExpbmVCb3hCYXNlbGlu
ZSgpOwogICAgICAgICBpZiAoYmFzZWxpbmVQb3MgIT0gLTEgJiYgYmFzZWxpbmVQb3MgPD0gYm9y
ZGVyVG9wKCkgKyBwYWRkaW5nVG9wKCkgKyBjb250ZW50SGVpZ2h0KCkpCiAgICAgICAgICAgICBy
ZXR1cm4gbWFyZ2luVG9wKCkgKyBiYXNlbGluZVBvczsKQEAgLTQ4NzUsNjAgKzQ4NTYsNiBAQCB2
b2lkIFJlbmRlckJsb2NrOjpzZXRNYXhCb3R0b21NYXJnaW5zKGluCiAgICAgbV9tYXhNYXJnaW4t
Pm1fYm90dG9tTmVnID0gbmVnOwogfQogCi12b2lkIFJlbmRlckJsb2NrOjphYnNvbHV0ZVJlY3Rz
KFZlY3RvcjxJbnRSZWN0PiYgcmVjdHMsIGludCB0eCwgaW50IHR5KQotewotICAgIC8vIEZvciBi
bG9ja3MgaW5zaWRlIGlubGluZXMsIHdlIGdvIGFoZWFkIGFuZCBpbmNsdWRlIG1hcmdpbnMgc28g
dGhhdCB3ZSBydW4gcmlnaHQgdXAgdG8gdGhlCi0gICAgLy8gaW5saW5lIGJveGVzIGFib3ZlIGFu
ZCBiZWxvdyB1cyAodGh1cyBnZXR0aW5nIG1lcmdlZCB3aXRoIHRoZW0gdG8gZm9ybSBhIHNpbmds
ZSBpcnJlZ3VsYXIKLSAgICAvLyBzaGFwZSkuCi0gICAgaWYgKGlubGluZUNvbnRpbnVhdGlvbigp
KSB7Ci0gICAgICAgIHJlY3RzLmFwcGVuZChJbnRSZWN0KHR4LCB0eSAtIGNvbGxhcHNlZE1hcmdp
blRvcCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCgpLCBoZWlnaHQoKSAr
IGNvbGxhcHNlZE1hcmdpblRvcCgpICsgY29sbGFwc2VkTWFyZ2luQm90dG9tKCkpKTsKLSAgICAg
ICAgaW5saW5lQ29udGludWF0aW9uKCktPmFic29sdXRlUmVjdHMocmVjdHMsCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4IC0geCgpICsgaW5saW5lQ29udGlu
dWF0aW9uKCktPmNvbnRhaW5pbmdCbG9jaygpLT54KCksCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHR5IC0geSgpICsgaW5saW5lQ29udGludWF0aW9uKCktPmNv
bnRhaW5pbmdCbG9jaygpLT55KCkpOwotICAgIH0gZWxzZQotICAgICAgICByZWN0cy5hcHBlbmQo
SW50UmVjdCh0eCwgdHksIHdpZHRoKCksIGhlaWdodCgpKSk7Ci19Ci0KLXZvaWQgUmVuZGVyQmxv
Y2s6OmFic29sdXRlUXVhZHMoVmVjdG9yPEZsb2F0UXVhZD4mIHF1YWRzKQotewotICAgIC8vIEZv
ciBibG9ja3MgaW5zaWRlIGlubGluZXMsIHdlIGdvIGFoZWFkIGFuZCBpbmNsdWRlIG1hcmdpbnMg
c28gdGhhdCB3ZSBydW4gcmlnaHQgdXAgdG8gdGhlCi0gICAgLy8gaW5saW5lIGJveGVzIGFib3Zl
IGFuZCBiZWxvdyB1cyAodGh1cyBnZXR0aW5nIG1lcmdlZCB3aXRoIHRoZW0gdG8gZm9ybSBhIHNp
bmdsZSBpcnJlZ3VsYXIKLSAgICAvLyBzaGFwZSkuCi0gICAgaWYgKGlubGluZUNvbnRpbnVhdGlv
bigpKSB7Ci0gICAgICAgIEZsb2F0UmVjdCBsb2NhbFJlY3QoMCwgLWNvbGxhcHNlZE1hcmdpblRv
cCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoKCksIGhlaWdodCgpICsgY29s
bGFwc2VkTWFyZ2luVG9wKCkgKyBjb2xsYXBzZWRNYXJnaW5Cb3R0b20oKSk7Ci0gICAgICAgIHF1
YWRzLmFwcGVuZChsb2NhbFRvQWJzb2x1dGVRdWFkKGxvY2FsUmVjdCkpOwotICAgICAgICBpbmxp
bmVDb250aW51YXRpb24oKS0+YWJzb2x1dGVRdWFkcyhxdWFkcyk7Ci0gICAgfSBlbHNlCi0gICAg
ICAgIHF1YWRzLmFwcGVuZChSZW5kZXJCb3g6OmxvY2FsVG9BYnNvbHV0ZVF1YWQoRmxvYXRSZWN0
KDAsIDAsIHdpZHRoKCksIGhlaWdodCgpKSkpOwotfQotCi1JbnRSZWN0IFJlbmRlckJsb2NrOjpy
ZWN0V2l0aE91dGxpbmVGb3JSZXBhaW50KFJlbmRlckJveE1vZGVsT2JqZWN0KiByZXBhaW50Q29u
dGFpbmVyLCBpbnQgb3V0bGluZVdpZHRoKQotewotICAgIEludFJlY3QgcihSZW5kZXJCb3g6OnJl
Y3RXaXRoT3V0bGluZUZvclJlcGFpbnQocmVwYWludENvbnRhaW5lciwgb3V0bGluZVdpZHRoKSk7
Ci0gICAgaWYgKGlubGluZUNvbnRpbnVhdGlvbigpKQotICAgICAgICByLmluZmxhdGVZKGNvbGxh
cHNlZE1hcmdpblRvcCgpKTsKLSAgICByZXR1cm4gcjsKLX0KLQotUmVuZGVyT2JqZWN0KiBSZW5k
ZXJCbG9jazo6aG92ZXJBbmNlc3RvcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGlubGluZUNvbnRp
bnVhdGlvbigpID8gaW5saW5lQ29udGludWF0aW9uKCkgOiBSZW5kZXJCb3g6OmhvdmVyQW5jZXN0
b3IoKTsKLX0KLQotdm9pZCBSZW5kZXJCbG9jazo6dXBkYXRlRHJhZ1N0YXRlKGJvb2wgZHJhZ09u
KQotewotICAgIFJlbmRlckJveDo6dXBkYXRlRHJhZ1N0YXRlKGRyYWdPbik7Ci0gICAgaWYgKGlu
bGluZUNvbnRpbnVhdGlvbigpKQotICAgICAgICBpbmxpbmVDb250aW51YXRpb24oKS0+dXBkYXRl
RHJhZ1N0YXRlKGRyYWdPbik7Ci19Ci0KLVJlbmRlclN0eWxlKiBSZW5kZXJCbG9jazo6b3V0bGlu
ZVN0eWxlRm9yUmVwYWludCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGlubGluZUNvbnRpbnVhdGlv
bigpID8gaW5saW5lQ29udGludWF0aW9uKCktPnN0eWxlKCkgOiBzdHlsZSgpOwotfQotCiB2b2lk
IFJlbmRlckJsb2NrOjpjaGlsZEJlY2FtZU5vbklubGluZShSZW5kZXJPYmplY3QqKQogewogICAg
IG1ha2VDaGlsZHJlbk5vbklubGluZSgpOwpAQCAtNDkzNywyNiArNDg2NCw2IEBAIHZvaWQgUmVu
ZGVyQmxvY2s6OmNoaWxkQmVjYW1lTm9uSW5saW5lKFIKICAgICAvLyB8dGhpc3wgbWF5IGJlIGRl
YWQgaGVyZQogfQogCi12b2lkIFJlbmRlckJsb2NrOjp1cGRhdGVIaXRUZXN0UmVzdWx0KEhpdFRl
c3RSZXN1bHQmIHJlc3VsdCwgY29uc3QgSW50UG9pbnQmIHBvaW50KQotewotICAgIGlmIChyZXN1
bHQuaW5uZXJOb2RlKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIE5vZGUqIG4gPSBub2RlKCk7
Ci0gICAgaWYgKGlubGluZUNvbnRpbnVhdGlvbigpKQotICAgICAgICAvLyBXZSBhcmUgaW4gdGhl
IG1hcmdpbnMgb2YgYmxvY2sgZWxlbWVudHMgdGhhdCBhcmUgcGFydCBvZiBhIGNvbnRpbnVhdGlv
bi4gIEluCi0gICAgICAgIC8vIHRoaXMgY2FzZSB3ZSdyZSBhY3R1YWxseSBzdGlsbCBpbnNpZGUg
dGhlIGVuY2xvc2luZyBpbmxpbmUgZWxlbWVudCB0aGF0IHdhcwotICAgICAgICAvLyBzcGxpdC4g
IEdvIGFoZWFkIGFuZCBzZXQgb3VyIGlubmVyIG5vZGUgYWNjb3JkaW5nbHkuCi0gICAgICAgIG4g
PSBpbmxpbmVDb250aW51YXRpb24oKS0+bm9kZSgpOwotCi0gICAgaWYgKG4pIHsKLSAgICAgICAg
cmVzdWx0LnNldElubmVyTm9kZShuKTsKLSAgICAgICAgaWYgKCFyZXN1bHQuaW5uZXJOb25TaGFy
ZWROb2RlKCkpCi0gICAgICAgICAgICByZXN1bHQuc2V0SW5uZXJOb25TaGFyZWROb2RlKG4pOwot
ICAgICAgICByZXN1bHQuc2V0TG9jYWxQb2ludChwb2ludCk7Ci0gICAgfQotfQotCiBJbnRSZWN0
IFJlbmRlckJsb2NrOjpsb2NhbENhcmV0UmVjdChJbmxpbmVCb3gqIGlubGluZUJveCwgaW50IGNh
cmV0T2Zmc2V0LCBpbnQqIGV4dHJhV2lkdGhUb0VuZE9mTGluZSkKIHsKICAgICAvLyBEbyB0aGUg
bm9ybWFsIGNhbGN1bGF0aW9uIGluIG1vc3QgY2FzZXMuCkBAIC01MDM3LDIxICs0OTQ0LDE3IEBA
IEludFJlY3QgUmVuZGVyQmxvY2s6OmxvY2FsQ2FyZXRSZWN0KElubGkKIAogdm9pZCBSZW5kZXJC
bG9jazo6YWRkRm9jdXNSaW5nUmVjdHMoVmVjdG9yPEludFJlY3Q+JiByZWN0cywgaW50IHR4LCBp
bnQgdHkpCiB7Ci0gICAgLy8gRm9yIGJsb2NrcyBpbnNpZGUgaW5saW5lcywgd2UgZ28gYWhlYWQg
YW5kIGluY2x1ZGUgbWFyZ2lucyBzbyB0aGF0IHdlIHJ1biByaWdodCB1cCB0byB0aGUKLSAgICAv
LyBpbmxpbmUgYm94ZXMgYWJvdmUgYW5kIGJlbG93IHVzICh0aHVzIGdldHRpbmcgbWVyZ2VkIHdp
dGggdGhlbSB0byBmb3JtIGEgc2luZ2xlIGlycmVndWxhcgotICAgIC8vIHNoYXBlKS4KLSAgICBp
ZiAoaW5saW5lQ29udGludWF0aW9uKCkpIHsKLSAgICAgICAgLy8gRklYTUU6IFRoaXMgY2hlY2sg
cmVhbGx5IGlzbid0IGFjY3VyYXRlLiAKLSAgICAgICAgYm9vbCBuZXh0SW5saW5lSGFzTGluZUJv
eCA9IGlubGluZUNvbnRpbnVhdGlvbigpLT5maXJzdExpbmVCb3goKTsKLSAgICAgICAgLy8gRklY
TUU6IFRoaXMgaXMgd3JvbmcuIFRoZSBwcmluY2lwYWwgcmVuZGVyZXIgbWF5IG5vdCBiZSB0aGUg
Y29udGludWF0aW9uIHByZWNlZGluZyB0aGlzIGJsb2NrLgotICAgICAgICBib29sIHByZXZJbmxp
bmVIYXNMaW5lQm94ID0gdG9SZW5kZXJJbmxpbmUoaW5saW5lQ29udGludWF0aW9uKCktPm5vZGUo
KS0+cmVuZGVyZXIoKSktPmZpcnN0TGluZUJveCgpOyAKLSAgICAgICAgaW50IHRvcE1hcmdpbiA9
IHByZXZJbmxpbmVIYXNMaW5lQm94ID8gY29sbGFwc2VkTWFyZ2luVG9wKCkgOiAwOwotICAgICAg
ICBpbnQgYm90dG9tTWFyZ2luID0gbmV4dElubGluZUhhc0xpbmVCb3ggPyBjb2xsYXBzZWRNYXJn
aW5Cb3R0b20oKSA6IDA7Ci0gICAgICAgIEludFJlY3QgcmVjdCh0eCwgdHkgLSB0b3BNYXJnaW4s
IHdpZHRoKCksIGhlaWdodCgpICsgdG9wTWFyZ2luICsgYm90dG9tTWFyZ2luKTsKLSAgICAgICAg
aWYgKCFyZWN0LmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJlY3RzLmFwcGVuZChyZWN0KTsKLSAg
ICB9IGVsc2UgaWYgKHdpZHRoKCkgJiYgaGVpZ2h0KCkpCi0gICAgICAgIHJlY3RzLmFwcGVuZChJ
bnRSZWN0KHR4LCB0eSwgd2lkdGgoKSwgaGVpZ2h0KCkpKTsKKyAgICBpbnQgdG9wID0gdHk7Cisg
ICAgaW50IGJvdHRvbSA9IHRvcCArIGhlaWdodCgpOworICAgIGlmIChpc0Fub255bW91c0lubGlu
ZUJsb2NrKCkgJiYgaGVpZ2h0KCkpIHsKKyAgICAgICAgaWYgKG1faW5saW5lQm94V3JhcHBlciAm
JiBtX2lubGluZUJveFdyYXBwZXItPnJvb3QoKS0+cHJldlJvb3RCb3goKSkKKyAgICAgICAgICAg
IHRvcCA9IG1pbih0b3AsIHRvcCAtIGNvbGxhcHNlZE1hcmdpblRvcCgpKTsKKyAgICAgICAgaWYg
KG1faW5saW5lQm94V3JhcHBlciAmJiBtX2lubGluZUJveFdyYXBwZXItPnJvb3QoKS0+bmV4dFJv
b3RCb3goKSkKKyAgICAgICAgICAgIGJvdHRvbSA9IG1heChib3R0b20sIGJvdHRvbSArIGNvbGxh
cHNlZE1hcmdpbkJvdHRvbSgpKTsKKyAgICB9CisgICAgSW50UmVjdCByZXN1bHQodHgsIHRvcCwg
d2lkdGgoKSwgYm90dG9tIC0gdG9wKTsKKyAgICBpZiAoIXJlc3VsdC5pc0VtcHR5KCkpCisgICAg
ICAgIHJlY3RzLmFwcGVuZChyZXN1bHQpOwogCiAgICAgaWYgKCFoYXNPdmVyZmxvd0NsaXAoKSAm
JiAhaGFzQ29udHJvbENsaXAoKSkgewogICAgICAgICBmb3IgKFJvb3RJbmxpbmVCb3gqIGN1cnIg
PSBmaXJzdFJvb3RCb3goKTsgY3VycjsgY3VyciA9IGN1cnItPm5leHRSb290Qm94KCkpIHsKQEAg
LTUwNzUsMTEgKzQ5NzgsNiBAQCB2b2lkIFJlbmRlckJsb2NrOjphZGRGb2N1c1JpbmdSZWN0cyhW
ZWN0CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0KLSAgICBpZiAoaW5saW5lQ29u
dGludWF0aW9uKCkpCi0gICAgICAgIGlubGluZUNvbnRpbnVhdGlvbigpLT5hZGRGb2N1c1JpbmdS
ZWN0cyhyZWN0cywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB0eCAtIHgoKSArIGlubGluZUNvbnRpbnVhdGlvbigpLT5jb250YWluaW5nQmxvY2soKS0+
eCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHkg
LSB5KCkgKyBpbmxpbmVDb250aW51YXRpb24oKS0+Y29udGFpbmluZ0Jsb2NrKCktPnkoKSk7CiB9
CiAKIFJlbmRlckJsb2NrKiBSZW5kZXJCbG9jazo6Y3JlYXRlQW5vbnltb3VzQmxvY2soYm9vbCBp
c0ZsZXhpYmxlQm94KSBjb25zdApAQCAtNTExMSw2ICs1MDA5LDggQEAgY29uc3QgY2hhciogUmVu
ZGVyQmxvY2s6OnJlbmRlck5hbWUoKSBjbwogICAgICAgICByZXR1cm4gIlJlbmRlckJsb2NrIChw
b3NpdGlvbmVkKSI7CiAgICAgaWYgKGlzQW5vbnltb3VzQmxvY2soKSkKICAgICAgICAgcmV0dXJu
ICJSZW5kZXJCbG9jayAoYW5vbnltb3VzKSI7CisgICAgZWxzZSBpZiAoaXNBbm9ueW1vdXNJbmxp
bmVCbG9jaygpKQorICAgICAgICByZXR1cm4gIlJlbmRlckJsb2NrIChhbm9ueW1vdXMgaW5saW5l
LWJsb2NrKSI7CiAgICAgZWxzZSBpZiAoaXNBbm9ueW1vdXMoKSkKICAgICAgICAgcmV0dXJuICJS
ZW5kZXJCbG9jayAoZ2VuZXJhdGVkKSI7CiAgICAgaWYgKGlzUmVsUG9zaXRpb25lZCgpKQpJbmRl
eDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3JlbmRlcmluZy9SZW5kZXJCbG9jay5oCShyZXZpc2lvbiA1NDY2NSkKKysrIFdlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlckJsb2NrLmgJKHdvcmtpbmcgY29weSkKQEAgLTc5LDcgKzc5LDcgQEAgcHVi
bGljOgogICAgIHN0YXRpYyB2b2lkIHJlbW92ZVBlcmNlbnRIZWlnaHREZXNjZW5kYW50KFJlbmRl
ckJveCopOwogICAgIEhhc2hTZXQ8UmVuZGVyQm94Kj4qIHBlcmNlbnRIZWlnaHREZXNjZW5kYW50
cygpIGNvbnN0OwogCi0gICAgUm9vdElubGluZUJveCogY3JlYXRlQW5kQXBwZW5kUm9vdElubGlu
ZUJveCgpOworICAgIFJvb3RJbmxpbmVCb3gqIGNyZWF0ZUFuZEFwcGVuZFJvb3RJbmxpbmVCb3go
UmVuZGVyQmxvY2sqIGFub255bW91c0lubGluZUJsb2NrKTsKIAogICAgIGJvb2wgZ2VuZXJhdGVz
TGluZUJveGVzRm9ySW5saW5lQ2hpbGQoUmVuZGVyT2JqZWN0KiwgYm9vbCBpc0xpbmVFbXB0eSA9
IHRydWUsIGJvb2wgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5ID0gdHJ1ZSk7CiAKQEAgLTEyOSwx
NSArMTI5LDE1IEBAIHB1YmxpYzoKIAogICAgIHZvaWQgYWRqdXN0UmVjdEZvckNvbHVtbnMoSW50
UmVjdCYpIGNvbnN0OwogCi0gICAgdm9pZCBhZGRDb250aW51YXRpb25XaXRoT3V0bGluZShSZW5k
ZXJJbmxpbmUqKTsKLQotICAgIFJlbmRlcklubGluZSogaW5saW5lQ29udGludWF0aW9uKCkgY29u
c3QgeyByZXR1cm4gbV9pbmxpbmVDb250aW51YXRpb247IH0KLSAgICB2b2lkIHNldElubGluZUNv
bnRpbnVhdGlvbihSZW5kZXJJbmxpbmUqIGMpIHsgbV9pbmxpbmVDb250aW51YXRpb24gPSBjOyB9
Ci0KICAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGEgY29udmVuaWVuY2UgaGVscGVyIGZvciBjcmVh
dGluZyBhbiBhbm9ueW1vdXMgYmxvY2sgdGhhdCBpbmhlcml0cyBpdHMKICAgICAvLyBzdHlsZSBm
cm9tIHRoaXMgUmVuZGVyQmxvY2suCiAgICAgUmVuZGVyQmxvY2sqIGNyZWF0ZUFub255bW91c0Js
b2NrKGJvb2wgaXNGbGV4aWJsZUJveCA9IGZhbHNlKSBjb25zdDsKIAorICAgIHZpcnR1YWwgdm9p
ZCBwYWludChQYWludEluZm8mLCBpbnQgdHgsIGludCB0eSk7CisgICAgdmlydHVhbCB2b2lkIHBh
aW50T2JqZWN0KFBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5KTsKKworICAgIGJvb2wgaW5Sb290
QmxvY2tDb250ZXh0KCkgY29uc3Q7CisKICAgICBzdGF0aWMgdm9pZCBhcHBlbmRSdW5zRm9yT2Jq
ZWN0KGludCBzdGFydCwgaW50IGVuZCwgUmVuZGVyT2JqZWN0KiwgSW5saW5lQmlkaVJlc29sdmVy
Jik7ICAgIAogICAgIHN0YXRpYyBib29sIHJlcXVpcmVzTGluZUJveChjb25zdCBJbmxpbmVJdGVy
YXRvciYsIGJvb2wgaXNMaW5lRW1wdHkgPSB0cnVlLCBib29sIHByZXZpb3VzTGluZUJyb2tlQ2xl
YW5seSA9IHRydWUpOwogCkBAIC0xNjgsOSArMTY4LDYgQEAgcHJvdGVjdGVkOgogCiAgICAgdm9p
ZCBsYXlvdXRQb3NpdGlvbmVkT2JqZWN0cyhib29sIHJlbGF5b3V0Q2hpbGRyZW4pOwogCi0gICAg
dmlydHVhbCB2b2lkIHBhaW50KFBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5KTsKLSAgICB2aXJ0
dWFsIHZvaWQgcGFpbnRPYmplY3QoUGFpbnRJbmZvJiwgaW50IHR4LCBpbnQgdHkpOwotCiAgICAg
aW50IHJpZ2h0UmVsT2Zmc2V0KGludCB5LCBpbnQgZml4ZWRPZmZzZXQsIGJvb2wgYXBwbHlUZXh0
SW5kZW50ID0gdHJ1ZSwgaW50KiBoZWlnaHRSZW1haW5pbmcgPSAwKSBjb25zdDsKICAgICBpbnQg
bGVmdFJlbE9mZnNldChpbnQgeSwgaW50IGZpeGVkT2Zmc2V0LCBib29sIGFwcGx5VGV4dEluZGVu
dCA9IHRydWUsIGludCogaGVpZ2h0UmVtYWluaW5nID0gMCkgY29uc3Q7CiAKQEAgLTE4Myw4ICsx
ODAsNiBAQCBwcm90ZWN0ZWQ6CiAKICAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlRmlyc3RMZXR0ZXIo
KTsKIAotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVIaXRUZXN0UmVzdWx0KEhpdFRlc3RSZXN1bHQm
LCBjb25zdCBJbnRQb2ludCYpOwotCiAgICAgLy8gRGVsYXkgdXBkYXRlIHNjcm9sbGJhciB1bnRp
bCBmaW5pc2hEZWxheVJlcGFpbnQoKSB3aWxsIGJlCiAgICAgLy8gY2FsbGVkLiBUaGlzIGZ1bmN0
aW9uIGlzIHVzZWQgd2hlbiBhIGZsZXhib3ggaXMgbGF5aW5nIG91dCBpdHMKICAgICAvLyBkZXNj
ZW5kYW50LiBJZiBtdWx0aXBsZSBjYWxscyBhcmUgbWFkZSB0byBzdGFydERlbGF5UmVwYWludCgp
LApAQCAtMjQ4LDcgKzI0Myw5IEBAIHByaXZhdGU6CiAgICAgICAgIGJvb2wgZXZlckhhZExheW91
dDsKICAgICB9OwogCi0gICAgLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMnIGltcGxlbWVudGF0
aW9ucyBhcmUgaW4gUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcC4KKyAgICBjbGFzcyBNYXJnaW5J
bmZvOworCisgICAgLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMnIGltcGxlbWVudGF0aW9ucyBh
cmUgaW4gUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcC4gICAgCiAgICAgdm9pZCBiaWRpUmVvcmRl
ckxpbmUoSW5saW5lQmlkaVJlc29sdmVyJiwgY29uc3QgSW5saW5lSXRlcmF0b3ImIGVuZCwgYm9v
bCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHkpOwogICAgIFJvb3RJbmxpbmVCb3gqIGRldGVybWlu
ZVN0YXJ0UG9zaXRpb24oYm9vbCYgZmlyc3RMaW5lLCBib29sJiBmdWxsTGF5b3V0LCBib29sJiBw
cmV2aW91c0xpbmVCcm9rZUNsZWFubHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBJbmxpbmVCaWRpUmVzb2x2ZXImLCBWZWN0b3I8RmxvYXRXaXRoUmVjdD4mIGZs
b2F0cywgdW5zaWduZWQmIG51bUNsZWFuRmxvYXRzKTsKQEAgLTI2MSw5ICsyNTgsOSBAQCBwcml2
YXRlOgogICAgIHZvaWQgc2tpcFRyYWlsaW5nV2hpdGVzcGFjZShJbmxpbmVJdGVyYXRvciYsIGJv
b2wgaXNMaW5lRW1wdHksIGJvb2wgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KTsKICAgICBpbnQg
c2tpcExlYWRpbmdXaGl0ZXNwYWNlKElubGluZUJpZGlSZXNvbHZlciYsIGJvb2wgZmlyc3RMaW5l
LCBib29sIGlzTGluZUVtcHR5LCBib29sIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSk7CiAgICAg
dm9pZCBmaXRCZWxvd0Zsb2F0cyhpbnQgd2lkdGhUb0ZpdCwgYm9vbCBmaXJzdExpbmUsIGludCYg
YXZhaWxhYmxlV2lkdGgpOwotICAgIElubGluZUl0ZXJhdG9yIGZpbmROZXh0TGluZUJyZWFrKElu
bGluZUJpZGlSZXNvbHZlciYsIGJvb2wgZmlyc3RMaW5lLCBib29sJiBpc0xpbmVFbXB0eSwgYm9v
bCYgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5LCBFQ2xlYXIqIGNsZWFyID0gMCk7CisgICAgSW5s
aW5lSXRlcmF0b3IgZmluZE5leHRMaW5lQnJlYWsoSW5saW5lQmlkaVJlc29sdmVyJiwgYm9vbCBm
aXJzdExpbmUsIGJvb2wmIGlzTGluZUVtcHR5LCBib29sJiBwcmV2aW91c0xpbmVCcm9rZUNsZWFu
bHksIE1hcmdpbkluZm8mLCBFQ2xlYXIqIGNsZWFyID0gMCk7CiAgICAgUm9vdElubGluZUJveCog
Y29uc3RydWN0TGluZSh1bnNpZ25lZCBydW5Db3VudCwgQmlkaVJ1biogZmlyc3RSdW4sIEJpZGlS
dW4qIGxhc3RSdW4sIGJvb2wgZmlyc3RMaW5lLCBib29sIGxhc3RMaW5lLCBSZW5kZXJPYmplY3Qq
IGVuZE9iamVjdCk7Ci0gICAgSW5saW5lRmxvd0JveCogY3JlYXRlTGluZUJveGVzKFJlbmRlck9i
amVjdCosIGJvb2wgZmlyc3RMaW5lKTsKKyAgICBJbmxpbmVGbG93Qm94KiBjcmVhdGVMaW5lQm94
ZXMoUmVuZGVyT2JqZWN0KiwgYm9vbCBmaXJzdExpbmUsIFJlbmRlckJsb2NrKiBhbm9ueW1vdXNJ
bmxpbmVCbG9jayk7CiAgICAgdm9pZCBjb21wdXRlSG9yaXpvbnRhbFBvc2l0aW9uc0ZvckxpbmUo
Um9vdElubGluZUJveCosIGJvb2wgZmlyc3RMaW5lLCBCaWRpUnVuKiBmaXJzdFJ1biwgQmlkaVJ1
biogdHJhaWxpbmdTcGFjZVJ1biwgYm9vbCByZWFjaGVkRW5kKTsKICAgICB2b2lkIGNvbXB1dGVW
ZXJ0aWNhbFBvc2l0aW9uc0ZvckxpbmUoUm9vdElubGluZUJveCosIEJpZGlSdW4qKTsKICAgICB2
b2lkIGRlbGV0ZUVsbGlwc2lzTGluZUJveGVzKCk7CkBAIC0zMTYsMTMgKzMxMyw3IEBAIHByaXZh
dGU6CiAgICAgLy8gT2J0YWlucyB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgYmxvY2sgKGluY2x1ZGlu
ZyB0aGlzIGJsb2NrKSB0aGF0IGNvbnRyaWJ1dGVzIGEgZmlyc3QtbGluZSBzdHlsZSB0byBvdXIg
aW5saW5lCiAgICAgLy8gY2hpbGRyZW4uCiAgICAgdmlydHVhbCBSZW5kZXJCbG9jayogZmlyc3RM
aW5lQmxvY2soKSBjb25zdDsKLSAgICBib29sIGluUm9vdEJsb2NrQ29udGV4dCgpIGNvbnN0Owot
Ci0gICAgdmlydHVhbCBJbnRSZWN0IHJlY3RXaXRoT3V0bGluZUZvclJlcGFpbnQoUmVuZGVyQm94
TW9kZWxPYmplY3QqIHJlcGFpbnRDb250YWluZXIsIGludCBvdXRsaW5lV2lkdGgpOwotICAgIHZp
cnR1YWwgUmVuZGVyU3R5bGUqIG91dGxpbmVTdHlsZUZvclJlcGFpbnQoKSBjb25zdDsKICAgICAK
LSAgICB2aXJ0dWFsIFJlbmRlck9iamVjdCogaG92ZXJBbmNlc3RvcigpIGNvbnN0OwotICAgIHZp
cnR1YWwgdm9pZCB1cGRhdGVEcmFnU3RhdGUoYm9vbCBkcmFnT24pOwogICAgIHZpcnR1YWwgdm9p
ZCBjaGlsZEJlY2FtZU5vbklubGluZShSZW5kZXJPYmplY3QqIGNoaWxkKTsKIAogICAgIHZpcnR1
YWwgSW50UmVjdCBzZWxlY3Rpb25SZWN0Rm9yUmVwYWludChSZW5kZXJCb3hNb2RlbE9iamVjdCog
cmVwYWludENvbnRhaW5lciwgYm9vbCAvKmNsaXBUb1Zpc2libGVDb250ZW50Ki8pCkBAIC0zNDIs
MTYgKzMzMywxMSBAQCBwcml2YXRlOgogICAgIGludCBsZWZ0U2VsZWN0aW9uT2Zmc2V0KFJlbmRl
ckJsb2NrKiByb290QmxvY2ssIGludCB5KTsKICAgICBpbnQgcmlnaHRTZWxlY3Rpb25PZmZzZXQo
UmVuZGVyQmxvY2sqIHJvb3RCbG9jaywgaW50IHkpOwogCi0gICAgdmlydHVhbCB2b2lkIGFic29s
dXRlUmVjdHMoVmVjdG9yPEludFJlY3Q+JiwgaW50IHR4LCBpbnQgdHkpOwotICAgIHZpcnR1YWwg
dm9pZCBhYnNvbHV0ZVF1YWRzKFZlY3RvcjxGbG9hdFF1YWQ+Jik7Ci0KICAgICBpbnQgZGVzaXJl
ZENvbHVtbldpZHRoKCkgY29uc3Q7CiAgICAgdW5zaWduZWQgZGVzaXJlZENvbHVtbkNvdW50KCkg
Y29uc3Q7CiAgICAgVmVjdG9yPEludFJlY3Q+KiBjb2x1bW5SZWN0cygpIGNvbnN0OwogICAgIHZv
aWQgc2V0RGVzaXJlZENvbHVtbkNvdW50QW5kV2lkdGgoaW50IGNvdW50LCBpbnQgd2lkdGgpOwog
ICAgIGludCBjb2x1bW5HYXAoKSBjb25zdDsKLSAgICAKLSAgICB2b2lkIHBhaW50Q29udGludWF0
aW9uT3V0bGluZXMoUGFpbnRJbmZvJiwgaW50IHR4LCBpbnQgdHkpOwogCiAgICAgdmlydHVhbCBJ
bnRSZWN0IGxvY2FsQ2FyZXRSZWN0KElubGluZUJveCosIGludCBjYXJldE9mZnNldCwgaW50KiBl
eHRyYVdpZHRoVG9FbmRPZkxpbmUgPSAwKTsKIApAQCAtNDg3LDEyICs0NzMsNiBAQCBwcml2YXRl
OgogICAgIERlcHJlY2F0ZWRQdHJMaXN0PEZsb2F0aW5nT2JqZWN0PiogbV9mbG9hdGluZ09iamVj
dHM7CiAgICAgTGlzdEhhc2hTZXQ8UmVuZGVyQm94Kj4qIG1fcG9zaXRpb25lZE9iamVjdHM7CiAK
LSAgICAvLyBBbiBpbmxpbmUgY2FuIGJlIHNwbGl0IHdpdGggYmxvY2tzIG9jY3VycmluZyBpbiBi
ZXR3ZWVuIHRoZSBpbmxpbmUgY29udGVudC4KLSAgICAvLyBXaGVuIHRoaXMgb2NjdXJzIHdlIG5l
ZWQgYSBwb2ludGVyIHRvIG91ciBuZXh0IG9iamVjdC4gIFdlIGNhbiBiYXNpY2FsbHkgYmUKLSAg
ICAvLyBzcGxpdCBpbnRvIGEgc2VxdWVuY2Ugb2YgaW5saW5lcyBhbmQgYmxvY2tzLiAgVGhlIGNv
bnRpbnVhdGlvbiB3aWxsIGVpdGhlciBiZQotICAgIC8vIGFuIGFub255bW91cyBibG9jayAodGhh
dCBob3VzZXMgb3RoZXIgYmxvY2tzKSBvciBpdCB3aWxsIGJlIGFuIGlubGluZSBmbG93LgotICAg
IFJlbmRlcklubGluZSogbV9pbmxpbmVDb250aW51YXRpb247Ci0KICAgICAvLyBBbGxvY2F0ZWQg
b25seSB3aGVuIHNvbWUgb2YgdGhlc2UgZmllbGRzIGhhdmUgbm9uLWRlZmF1bHQgdmFsdWVzCiAg
ICAgc3RydWN0IE1heE1hcmdpbiA6IE5vbmNvcHlhYmxlIHsKICAgICAgICAgTWF4TWFyZ2luKGNv
bnN0IFJlbmRlckJsb2NrKiBvKSAKQEAgLTUyMCwxMCArNTAwLDEyIEBAIHByaXZhdGU6CiAgICAg
UmVuZGVyTGluZUJveExpc3QgbV9saW5lQm94ZXM7ICAgLy8gQWxsIG9mIHRoZSByb290IGxpbmUg
Ym94ZXMgY3JlYXRlZCBmb3IgdGhpcyBibG9jayBmbG93LiAgRm9yIGV4YW1wbGUsIDxkaXY+SGVs
bG88YnI+d29ybGQuPC9kaXY+IHdpbGwgaGF2ZSB0d28gdG90YWwgbGluZXMgZm9yIHRoZSA8ZGl2
Pi4KIAogICAgIG11dGFibGUgaW50IG1fbGluZUhlaWdodDsKLSAgICAKKwogICAgIC8vIFJlbmRl
clJ1YnlCYXNlIG9iamVjdHMgbmVlZCB0byBiZSBhYmxlIHRvIHNwbGl0IGFuZCBtZXJnZSwgbW92
aW5nIHRoZWlyIGNoaWxkcmVuIGFyb3VuZAogICAgIC8vIChjYWxsaW5nIG1vdmVDaGlsZFRvLCBt
b3ZlQWxsQ2hpbGRyZW5UbywgYW5kIG1ha2VDaGlsZHJlbk5vbklubGluZSkuCiAgICAgZnJpZW5k
IGNsYXNzIFJlbmRlclJ1YnlCYXNlOworICAgIAorICAgIGZyaWVuZCBjbGFzcyBJbmxpbmVCb3g7
CiB9OwogCiBpbmxpbmUgUmVuZGVyQmxvY2sqIHRvUmVuZGVyQmxvY2soUmVuZGVyT2JqZWN0KiBv
YmplY3QpCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5j
cHAJKHJldmlzaW9uIDU0NjY1KQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5l
TGF5b3V0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTcxLDEwICsxNzEsMTAgQEAgdm9pZCBSZW5k
ZXJCbG9jazo6YXBwZW5kUnVuc0Zvck9iamVjdChpbgogICAgIH0KIH0KIAotc3RhdGljIGlubGlu
ZSBJbmxpbmVCb3gqIGNyZWF0ZUlubGluZUJveEZvclJlbmRlcmVyKFJlbmRlck9iamVjdCogb2Jq
LCBib29sIGlzUm9vdExpbmVCb3gsIGJvb2wgaXNPbmx5UnVuID0gZmFsc2UpCitzdGF0aWMgaW5s
aW5lIElubGluZUJveCogY3JlYXRlSW5saW5lQm94Rm9yUmVuZGVyZXIoUmVuZGVyT2JqZWN0KiBv
YmosIGJvb2wgaXNSb290TGluZUJveCwgYm9vbCBpc09ubHlSdW4sIFJlbmRlckJsb2NrKiBhbm9u
eW1vdXNJbmxpbmVCbG9jaykKIHsKICAgICBpZiAoaXNSb290TGluZUJveCkKLSAgICAgICAgcmV0
dXJuIHRvUmVuZGVyQmxvY2sob2JqKS0+Y3JlYXRlQW5kQXBwZW5kUm9vdElubGluZUJveCgpOwor
ICAgICAgICByZXR1cm4gdG9SZW5kZXJCbG9jayhvYmopLT5jcmVhdGVBbmRBcHBlbmRSb290SW5s
aW5lQm94KGFub255bW91c0lubGluZUJsb2NrKTsKICAgICAKICAgICBpZiAob2JqLT5pc1RleHQo
KSkgewogICAgICAgICBJbmxpbmVUZXh0Qm94KiB0ZXh0Qm94ID0gdG9SZW5kZXJUZXh0KG9iaikt
PmNyZWF0ZUlubGluZVRleHRCb3goKTsKQEAgLTE4OCw3ICsxODgsNyBAQCBzdGF0aWMgaW5saW5l
IElubGluZUJveCogY3JlYXRlSW5saW5lQm94CiAgICAgaWYgKG9iai0+aXNCb3goKSkKICAgICAg
ICAgcmV0dXJuIHRvUmVuZGVyQm94KG9iaiktPmNyZWF0ZUlubGluZUJveCgpOwogICAgIAotICAg
IHJldHVybiB0b1JlbmRlcklubGluZShvYmopLT5jcmVhdGVBbmRBcHBlbmRJbmxpbmVGbG93Qm94
KCk7CisgICAgcmV0dXJuIHRvUmVuZGVySW5saW5lKG9iaiktPmNyZWF0ZUFuZEFwcGVuZElubGlu
ZUZsb3dCb3goYW5vbnltb3VzSW5saW5lQmxvY2spOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQg
ZGlydHlMaW5lQm94ZXNGb3JSZW5kZXJlcihSZW5kZXJPYmplY3QqIG8sIGJvb2wgZnVsbExheW91
dCkKQEAgLTIwMSw3ICsyMDEsMjEgQEAgc3RhdGljIGlubGluZSB2b2lkIGRpcnR5TGluZUJveGVz
Rm9yUmVuZAogICAgICAgICB0b1JlbmRlcklubGluZShvKS0+ZGlydHlMaW5lQm94ZXMoZnVsbExh
eW91dCk7CiB9CiAKLUlubGluZUZsb3dCb3gqIFJlbmRlckJsb2NrOjpjcmVhdGVMaW5lQm94ZXMo
UmVuZGVyT2JqZWN0KiBvYmosIGJvb2wgZmlyc3RMaW5lKQorc3RhdGljIGlubGluZSBib29sIHNo
b3VsZENvbnN0cnVjdFBhcmVudExpbmVCb3goUmVuZGVySW5saW5lKiBpbmxpbmVGbG93LCBib29s
IGlzQW5vbnltb3VzSW5saW5lQmxvY2spCit7CisgICAgLy8gRklYTUU6IEltcGxlbWVudCBsaW5l
IGJveCBjdWxsaW5nIGFuZCBjdXQgb3V0IGEgYnVuY2ggb2YgaW50ZXJtZWRpYXRlIGxpbmUgYm94
ZXMgYnkgY29tcGFyaW5nIHN0eWxlIGluZm9ybWF0aW9uCisgICAgLy8gd2l0aCBwYXJlbnRzLCBl
dGMuIHRvIG1ha2Ugc3VyZSBpdCdzIHBvc3NpYmxlIHRvIG9taXQgdGhlIGJveCBmb3IgdGhlIGxp
bmUuIAorICAgIGlmICghaXNBbm9ueW1vdXNJbmxpbmVCbG9jayB8fCAhaW5saW5lRmxvdykKKyAg
ICAgICAgcmV0dXJuIHRydWU7CisgICAgCisgICAgLy8gSWYgd2UgaGF2ZSBhbiBvdXRsaW5lIG9y
IGEgc2VsZi1wYWludGluZyBsYXllciwgdGhlbiB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGUgaW50ZXJt
ZWRpYXRlIGxpbmUgYm94LgorICAgIGJvb2wgc2hvdWxkTWFrZUJveCA9IGlubGluZUZsb3ctPmhh
c091dGxpbmUoKSB8fCBpbmxpbmVGbG93LT5oYXNTZWxmUGFpbnRpbmdMYXllcigpOworICAgIGlm
ICghc2hvdWxkTWFrZUJveCkKKyAgICAgICAgaW5saW5lRmxvdy0+c2V0SGFzQ3VsbGVkTGluZUJv
eGVzKCk7IC8vIEZJWE1FOiBTaG91bGQgZmluZCBhIHdheSB0byB1bnRhaW50IHRoZSBib3ggbGF0
ZXIsIGFsdGhvdWdoIGluIHByYWN0aWNlIHRoaXMgd2lsbCBiZSByYXJlLgorICAgIHJldHVybiBz
aG91bGRNYWtlQm94OworfQorCitJbmxpbmVGbG93Qm94KiBSZW5kZXJCbG9jazo6Y3JlYXRlTGlu
ZUJveGVzKFJlbmRlck9iamVjdCogb2JqLCBib29sIGZpcnN0TGluZSwgUmVuZGVyQmxvY2sqIGFu
b255bW91c0lubGluZUJsb2NrKQogewogICAgIC8vIFNlZSBpZiB3ZSBoYXZlIGFuIHVuY29uc3Ry
dWN0ZWQgbGluZSBib3ggZm9yIHRoaXMgb2JqZWN0IHRoYXQgaXMgYWxzbwogICAgIC8vIHRoZSBs
YXN0IGl0ZW0gb24gdGhlIGxpbmUuCkBAIC0yMTIsNiArMjI2LDggQEAgSW5saW5lRmxvd0JveCog
UmVuZGVyQmxvY2s6OmNyZWF0ZUxpbmVCbwogICAgIGRvIHsKICAgICAgICAgQVNTRVJUKG9iai0+
aXNSZW5kZXJJbmxpbmUoKSB8fCBvYmogPT0gdGhpcyk7CiAgICAgICAgIAorICAgICAgICBSZW5k
ZXJJbmxpbmUqIGlubGluZU9iaiA9IChvYmogIT0gdGhpcykgPyB0b1JlbmRlcklubGluZShvYmop
IDogMDsKKwogICAgICAgICAvLyBHZXQgdGhlIGxhc3QgYm94IHdlIG1hZGUgZm9yIHRoaXMgcmVu
ZGVyIG9iamVjdC4KICAgICAgICAgcGFyZW50Qm94ID0gb2JqLT5pc1JlbmRlcklubGluZSgpID8g
dG9SZW5kZXJJbmxpbmUob2JqKS0+bGFzdExpbmVCb3goKSA6IHRvUmVuZGVyQmxvY2sob2JqKS0+
bGFzdExpbmVCb3goKTsKIApAQCAtMjIwLDMwICsyMzYsMzQgQEAgSW5saW5lRmxvd0JveCogUmVu
ZGVyQmxvY2s6OmNyZWF0ZUxpbmVCbwogICAgICAgICAvLyBzb21ldGhpbmcgZm9sbG93aW5nIGl0
IG9uIHRoZSBsaW5lLCB0aGVuIHdlIGtub3cgd2UgaGF2ZSB0byBtYWtlIGEgbmV3IGJveAogICAg
ICAgICAvLyBhcyB3ZWxsLiAgSW4gdGhpcyBzaXR1YXRpb24gb3VyIGlubGluZSBoYXMgYWN0dWFs
bHkgYmVlbiBzcGxpdCBpbiB0d28gb24KICAgICAgICAgLy8gdGhlIHNhbWUgbGluZSAodGhpcyBj
YW4gaGFwcGVuIHdpdGggdmVyeSBmYW5jeSBsYW5ndWFnZSBtaXh0dXJlcykuCisgICAgICAgIGJv
b2wgYWxsb3dlZFRvQ29uc3RydWN0TmV3Qm94ID0gc2hvdWxkQ29uc3RydWN0UGFyZW50TGluZUJv
eChpbmxpbmVPYmosIGFub255bW91c0lubGluZUJsb2NrKTsKKyAgICAgICAgYm9vbCBjYW5Vc2VF
eGlzdGluZ1BhcmVudEJveCA9IHBhcmVudEJveCAmJiAhcGFyZW50Qm94LT5pc0NvbnN0cnVjdGVk
KCkgJiYgIXBhcmVudEJveC0+bmV4dE9uTGluZSgpOwogICAgICAgICBib29sIGNvbnN0cnVjdGVk
TmV3Qm94ID0gZmFsc2U7Ci0gICAgICAgIGlmICghcGFyZW50Qm94IHx8IHBhcmVudEJveC0+aXND
b25zdHJ1Y3RlZCgpIHx8IHBhcmVudEJveC0+bmV4dE9uTGluZSgpKSB7CisgICAgICAgIGlmIChh
bGxvd2VkVG9Db25zdHJ1Y3ROZXdCb3ggJiYgIWNhblVzZUV4aXN0aW5nUGFyZW50Qm94KSB7CiAg
ICAgICAgICAgICAvLyBXZSBuZWVkIHRvIG1ha2UgYSBuZXcgYm94IGZvciB0aGlzIHJlbmRlciBv
YmplY3QuICBPbmNlCiAgICAgICAgICAgICAvLyBtYWRlLCB3ZSBuZWVkIHRvIHBsYWNlIGl0IGF0
IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgbGluZS4KLSAgICAgICAgICAgIElubGluZUJveCogbmV3
Qm94ID0gY3JlYXRlSW5saW5lQm94Rm9yUmVuZGVyZXIob2JqLCBvYmogPT0gdGhpcyk7CisgICAg
ICAgICAgICBJbmxpbmVCb3gqIG5ld0JveCA9IGNyZWF0ZUlubGluZUJveEZvclJlbmRlcmVyKG9i
aiwgb2JqID09IHRoaXMsIGZhbHNlLCBhbm9ueW1vdXNJbmxpbmVCbG9jayk7CiAgICAgICAgICAg
ICBBU1NFUlQobmV3Qm94LT5pc0lubGluZUZsb3dCb3goKSk7CiAgICAgICAgICAgICBwYXJlbnRC
b3ggPSBzdGF0aWNfY2FzdDxJbmxpbmVGbG93Qm94Kj4obmV3Qm94KTsKICAgICAgICAgICAgIHBh
cmVudEJveC0+c2V0Rmlyc3RMaW5lU3R5bGVCaXQoZmlyc3RMaW5lKTsKICAgICAgICAgICAgIGNv
bnN0cnVjdGVkTmV3Qm94ID0gdHJ1ZTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghcmVzdWx0
KQotICAgICAgICAgICAgcmVzdWx0ID0gcGFyZW50Qm94OwotCi0gICAgICAgIC8vIElmIHdlIGhh
dmUgaGl0IHRoZSBibG9jayBpdHNlbGYsIHRoZW4gfGJveHwgcmVwcmVzZW50cyB0aGUgcm9vdAot
ICAgICAgICAvLyBpbmxpbmUgYm94IGZvciB0aGUgbGluZSwgYW5kIGl0IGRvZXNuJ3QgaGF2ZSB0
byBiZSBhcHBlbmRlZCB0byBhbnkgcGFyZW50Ci0gICAgICAgIC8vIGlubGluZS4KLSAgICAgICAg
aWYgKGNoaWxkQm94KQotICAgICAgICAgICAgcGFyZW50Qm94LT5hZGRUb0xpbmUoY2hpbGRCb3gp
OwotCi0gICAgICAgIGlmICghY29uc3RydWN0ZWROZXdCb3ggfHwgb2JqID09IHRoaXMpCi0gICAg
ICAgICAgICBicmVhazsKLQotICAgICAgICBjaGlsZEJveCA9IHBhcmVudEJveDsgICAgICAgIAor
ICAgICAgICBpZiAoY29uc3RydWN0ZWROZXdCb3ggfHwgY2FuVXNlRXhpc3RpbmdQYXJlbnRCb3gp
IHsKKyAgICAgICAgICAgIGlmICghcmVzdWx0KQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHBh
cmVudEJveDsgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGhp
dCB0aGUgYmxvY2sgaXRzZWxmLCB0aGVuIHxib3h8IHJlcHJlc2VudHMgdGhlIHJvb3QKKyAgICAg
ICAgICAgIC8vIGlubGluZSBib3ggZm9yIHRoZSBsaW5lLCBhbmQgaXQgZG9lc24ndCBoYXZlIHRv
IGJlIGFwcGVuZGVkIHRvIGFueSBwYXJlbnQKKyAgICAgICAgICAgIC8vIGlubGluZS4KKyAgICAg
ICAgICAgIGlmIChjaGlsZEJveCkKKyAgICAgICAgICAgICAgICBwYXJlbnRCb3gtPmFkZFRvTGlu
ZShjaGlsZEJveCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIWNvbnN0cnVj
dGVkTmV3Qm94IHx8IG9iaiA9PSB0aGlzKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgIAor
ICAgICAgICAgICAgY2hpbGRCb3ggPSBwYXJlbnRCb3g7CisgICAgICAgIH0KIAogICAgICAgICAv
LyBJZiB3ZSd2ZSBleGNlZWRlZCBvdXIgbGluZSBkZXB0aCwgdGhlbiBqdW1wIHN0cmFpZ2h0IHRv
IHRoZSByb290IGFuZCBza2lwIGFsbCB0aGUgcmVtYWluaW5nCiAgICAgICAgIC8vIGludGVybWVk
aWF0ZSBpbmxpbmUgZmxvd3MuCkBAIC0yNjUsMTkgKzI4NSwyMyBAQCBSb290SW5saW5lQm94KiBS
ZW5kZXJCbG9jazo6Y29uc3RydWN0TGluCiAgICAgICAgIGlmIChydW5Db3VudCA9PSAyICYmICFy
LT5tX29iamVjdC0+aXNMaXN0TWFya2VyKCkpCiAgICAgICAgICAgICBpc09ubHlSdW4gPSAoKHN0
eWxlKCktPmRpcmVjdGlvbigpID09IFJUTCkgPyBsYXN0UnVuIDogZmlyc3RSdW4pLT5tX29iamVj
dC0+aXNMaXN0TWFya2VyKCk7CiAKLSAgICAgICAgSW5saW5lQm94KiBib3ggPSBjcmVhdGVJbmxp
bmVCb3hGb3JSZW5kZXJlcihyLT5tX29iamVjdCwgZmFsc2UsIGlzT25seVJ1bik7CisgICAgICAg
IFJlbmRlckJsb2NrKiBhbm9ueW1vdXNJbmxpbmVCbG9jayA9IHItPm1fb2JqZWN0LT5pc0Fub255
bW91c0lubGluZUJsb2NrKCkgPyB0b1JlbmRlckJsb2NrKHItPm1fb2JqZWN0KSA6IDA7CisKKyAg
ICAgICAgSW5saW5lQm94KiBib3ggPSBjcmVhdGVJbmxpbmVCb3hGb3JSZW5kZXJlcihyLT5tX29i
amVjdCwgZmFsc2UsIGlzT25seVJ1biwgYW5vbnltb3VzSW5saW5lQmxvY2spOwogICAgICAgICBy
LT5tX2JveCA9IGJveDsKIAogICAgICAgICBBU1NFUlQoYm94KTsKICAgICAgICAgaWYgKCFib3gp
CiAgICAgICAgICAgICBjb250aW51ZTsKIAorICAgICAgICBSZW5kZXJPYmplY3QqIGFuY2VzdG9y
UmVuZGVyZXIgPSByLT5tX29iamVjdC0+cGFyZW50KCk7CisgCiAgICAgICAgIC8vIElmIHdlIGhh
dmUgbm8gcGFyZW50IGJveCB5ZXQsIG9yIGlmIHRoZSBydW4gaXMgbm90IHNpbXBseSBhIHNpYmxp
bmcsCiAgICAgICAgIC8vIHRoZW4gd2UgbmVlZCB0byBjb25zdHJ1Y3QgaW5saW5lIGJveGVzIGFz
IG5lY2Vzc2FyeSB0byBwcm9wZXJseSBlbmNsb3NlIHRoZQogICAgICAgICAvLyBydW4ncyBpbmxp
bmUgYm94LgotICAgICAgICBpZiAoIXBhcmVudEJveCB8fCBwYXJlbnRCb3gtPnJlbmRlcmVyKCkg
IT0gci0+bV9vYmplY3QtPnBhcmVudCgpKQorICAgICAgICBpZiAoIXBhcmVudEJveCB8fCBwYXJl
bnRCb3gtPnJlbmRlcmVyKCkgIT0gYW5jZXN0b3JSZW5kZXJlcikKICAgICAgICAgICAgIC8vIENy
ZWF0ZSBuZXcgaW5saW5lIGJveGVzIGFsbCB0aGUgd2F5IGJhY2sgdG8gdGhlIGFwcHJvcHJpYXRl
IGluc2VydGlvbiBwb2ludC4KLSAgICAgICAgICAgIHBhcmVudEJveCA9IGNyZWF0ZUxpbmVCb3hl
cyhyLT5tX29iamVjdC0+cGFyZW50KCksIGZpcnN0TGluZSk7CisgICAgICAgICAgICBwYXJlbnRC
b3ggPSBjcmVhdGVMaW5lQm94ZXMoYW5jZXN0b3JSZW5kZXJlciwgZmlyc3RMaW5lLCBhbm9ueW1v
dXNJbmxpbmVCbG9jayk7CiAKICAgICAgICAgLy8gQXBwZW5kIHRoZSBpbmxpbmUgYm94IHRvIHRo
aXMgbGluZS4KICAgICAgICAgcGFyZW50Qm94LT5hZGRUb0xpbmUoYm94KTsKQEAgLTMxOSw2ICsz
NDMsOCBAQCB2b2lkIFJlbmRlckJsb2NrOjpjb21wdXRlSG9yaXpvbnRhbFBvc2l0CiAgICAgdW5z
aWduZWQgbnVtU3BhY2VzID0gMDsKICAgICBFVGV4dEFsaWduIHRleHRBbGlnbiA9IHN0eWxlKCkt
PnRleHRBbGlnbigpOwogCisgICAgaW50IHggPSBsZWZ0T2Zmc2V0KGhlaWdodCgpLCBmaXJzdExp
bmUpOworCiAgICAgZm9yIChCaWRpUnVuKiByID0gZmlyc3RSdW47IHI7IHIgPSByLT5uZXh0KCkp
IHsKICAgICAgICAgaWYgKCFyLT5tX2JveCB8fCByLT5tX29iamVjdC0+aXNQb3NpdGlvbmVkKCkg
fHwgci0+bV9ib3gtPmlzTGluZUJyZWFrKCkpCiAgICAgICAgICAgICBjb250aW51ZTsgLy8gUG9z
aXRpb25lZCBvYmplY3RzIGFyZSBvbmx5IHBhcnRpY2lwYXRpbmcgdG8gZmlndXJlIG91dCB0aGVp
cgpAQCAtMzU2LDYgKzM4MiwxMiBAQCB2b2lkIFJlbmRlckJsb2NrOjpjb21wdXRlSG9yaXpvbnRh
bFBvc2l0CiAgICAgICAgICAgICByZW5kZXJCb3gtPmNhbGNXaWR0aCgpOwogICAgICAgICAgICAg
ci0+bV9ib3gtPnNldFdpZHRoKHJlbmRlckJveC0+d2lkdGgoKSk7CiAgICAgICAgICAgICB0b3RX
aWR0aCArPSByZW5kZXJCb3gtPm1hcmdpbkxlZnQoKSArIHJlbmRlckJveC0+bWFyZ2luUmlnaHQo
KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHItPm1fb2JqZWN0LT5pc0Fub255bW91
c0lubGluZUJsb2NrKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBBbGxvdyB0aGUgZnVsbCBhdmFp
bGFibGUgd2lkdGggdG8gYmUgdXNlZCwgc2luY2UgZmxvYXRzIHdpbGwgaW50cnVkZSBpbnRvIG91
ciBzcGFjZS4KKyAgICAgICAgICAgICAgICBhdmFpbGFibGVXaWR0aCA9IHJpZ2h0T2Zmc2V0KCkg
LSBsZWZ0T2Zmc2V0KCk7CisgICAgICAgICAgICAgICAgeCA9IGxlZnRPZmZzZXQoKTsKKyAgICAg
ICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHRvdFdpZHRoICs9IHItPm1fYm94LT53aWR0
aCgpOwpAQCAtMzY1LDcgKzM5Nyw2IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmNvbXB1dGVIb3Jpem9u
dGFsUG9zaXQKICAgICAvLyB3ZSBub3cgZXhhbWluZSBvdXIgdGV4dC1hbGlnbiBwcm9wZXJ0eSBp
biBvcmRlciB0byBkZXRlcm1pbmUgd2hlcmUgdG8gcG9zaXRpb24gdGhlCiAgICAgLy8gb2JqZWN0
cyBob3Jpem9udGFsbHkuICBUaGUgdG90YWwgd2lkdGggb2YgdGhlIGxpbmUgY2FuIGJlIGluY3Jl
YXNlZCBpZiB3ZSBlbmQgdXAKICAgICAvLyBqdXN0aWZ5aW5nIHRleHQuCi0gICAgaW50IHggPSBs
ZWZ0T2Zmc2V0KGhlaWdodCgpLCBmaXJzdExpbmUpOwogICAgIHN3aXRjaCAodGV4dEFsaWduKSB7
CiAgICAgICAgIGNhc2UgTEVGVDoKICAgICAgICAgY2FzZSBXRUJLSVRfTEVGVDoKQEAgLTUxOSw5
ICs1NTAsMTUgQEAgdm9pZCBSZW5kZXJCbG9jazo6bGF5b3V0SW5saW5lQ2hpbGRyZW4oYgogICAg
IGJvb2wgdXNlUmVwYWludEJvdW5kcyA9IGZhbHNlOwogICAgIAogICAgIG1fb3ZlcmZsb3cuY2xl
YXIoKTsKLSAgICAgICAgCi0gICAgc2V0SGVpZ2h0KGJvcmRlclRvcCgpICsgcGFkZGluZ1RvcCgp
KTsKLSAgICBpbnQgdG9BZGQgPSBib3JkZXJCb3R0b20oKSArIHBhZGRpbmdCb3R0b20oKSArIGhv
cml6b250YWxTY3JvbGxiYXJIZWlnaHQoKTsKKyAgICAKKyAgICBpbnQgdG9wID0gYm9yZGVyVG9w
KCkgKyBwYWRkaW5nVG9wKCk7CisgICAgaW50IGJvdHRvbSA9IGJvcmRlckJvdHRvbSgpICsgcGFk
ZGluZ0JvdHRvbSgpICsgaG9yaXpvbnRhbFNjcm9sbGJhckhlaWdodCgpOworCisgICAgc2V0SGVp
Z2h0KHRvcCk7CisKKyAgICAvLyBUaGUgbWFyZ2luIHN0cnVjdCBjYWNoZXMgYWxsIG91ciBjdXJy
ZW50IG1hcmdpbiBjb2xsYXBzaW5nIHN0YXRlLiBXZSBydW4gbWFyZ2luIGNvbGxhcHNpbmcgd2hl
biB3ZSBlbmNvdW50ZXIgYW5vbnltb3VzIGlubGluZSBibG9ja3MgdGhhdCBhcmUgYmVpbmcgdXNl
ZAorICAgIC8vIGZvciB0aGUgYmxvY2tzLWluc2lkZS1pbmxpbmVzIGNhc2UgKGFuZCB0aGUgaW5s
aW5lcyBhcmUgZW1wdHkpLCBlLmcsIDxzcGFuPjxkaXY+T25lPC9kaXY+PC9zcGFuPi4KKyAgICBN
YXJnaW5JbmZvIG1hcmdpbkluZm8odGhpcywgdG9wLCBib3R0b20pOwogCiAgICAgLy8gRmlndXJl
IG91dCBpZiB3ZSBzaG91bGQgY2xlYXIgb3V0IG91ciBsaW5lIGJveGVzLgogICAgIC8vIEZJWE1F
OiBIYW5kbGUgcmVzaXplIGV2ZW50dWFsbHkhCkBAIC01NTAsMTIgKzU4NywxNSBAQCB2b2lkIFJl
bmRlckJsb2NrOjpsYXlvdXRJbmxpbmVDaGlsZHJlbihiCiAgICAgICAgICAgICBpZiAoby0+aXNS
ZXBsYWNlZCgpIHx8IG8tPmlzRmxvYXRpbmcoKSB8fCBvLT5pc1Bvc2l0aW9uZWQoKSkgewogICAg
ICAgICAgICAgICAgIFJlbmRlckJveCogYm94ID0gdG9SZW5kZXJCb3gobyk7CiAgICAgICAgICAg
ICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlbGF5b3V0Q2hpbGRyZW4gfHwgby0+c3R5bGUo
KS0+d2lkdGgoKS5pc1BlcmNlbnQoKSB8fCBvLT5zdHlsZSgpLT5oZWlnaHQoKS5pc1BlcmNlbnQo
KSkKLSAgICAgICAgICAgICAgICAgICAgby0+c2V0Q2hpbGROZWVkc0xheW91dCh0cnVlLCBmYWxz
ZSk7Ci0gICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3
ZSBsYXlvdXQgY2hpbGRyZW4gaWYgdGhleSBuZWVkIGl0LgorICAgICAgICAgICAgICAgIC8vIEZJ
WE1FOiBUZWNobmljYWxseSBwZXJjZW50YWdlIGhlaWdodCBvYmplY3RzIG9ubHkgbmVlZCBhIHJl
bGF5b3V0IGlmIHRoZWlyIHBlcmNlbnRhZ2UgaXNuJ3QgZ29pbmcgdG8gYmUgdHVybmVkIGludG8K
KyAgICAgICAgICAgICAgICAvLyBhbiBhdXRvIHZhbHVlLiAgQWRkIGEgbWV0aG9kIHRvIGRldGVy
bWluZSB0aGlzLCBzbyB0aGF0IHdlIGNhbiBhdm9pZCB0aGUgcmVsYXlvdXQuCisgICAgICAgICAg
ICAgICAgaWYgKHJlbGF5b3V0Q2hpbGRyZW4gfHwgKChib3gtPnN0eWxlKCktPmhlaWdodCgpLmlz
UGVyY2VudCgpIHx8IGJveC0+c3R5bGUoKS0+bWluSGVpZ2h0KCkuaXNQZXJjZW50KCkgfHwgYm94
LT5zdHlsZSgpLT5tYXhIZWlnaHQoKS5pc1BlcmNlbnQoKSkpKQorICAgICAgICAgICAgICAgICAg
ICBib3gtPnNldENoaWxkTmVlZHNMYXlvdXQodHJ1ZSwgZmFsc2UpOworCiAgICAgICAgICAgICAg
ICAgLy8gSWYgcmVsYXlvdXRDaGlsZHJlbiBpcyBzZXQgYW5kIHdlIGhhdmUgcGVyY2VudGFnZSBw
YWRkaW5nLCB3ZSBhbHNvIG5lZWQgdG8gaW52YWxpZGF0ZSB0aGUgY2hpbGQncyBwcmVmIHdpZHRo
cy4KLSAgICAgICAgICAgICAgICBpZiAocmVsYXlvdXRDaGlsZHJlbiAmJiAoby0+c3R5bGUoKS0+
cGFkZGluZ0xlZnQoKS5pc1BlcmNlbnQoKSB8fCBvLT5zdHlsZSgpLT5wYWRkaW5nUmlnaHQoKS5p
c1BlcmNlbnQoKSkpCi0gICAgICAgICAgICAgICAgICAgIG8tPnNldFByZWZXaWR0aHNEaXJ0eSh0
cnVlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgaWYgKHJlbGF5b3V0Q2hpbGRyZW4gJiYgKGJv
eC0+c3R5bGUoKS0+cGFkZGluZ0xlZnQoKS5pc1BlcmNlbnQoKSB8fCBib3gtPnN0eWxlKCktPnBh
ZGRpbmdSaWdodCgpLmlzUGVyY2VudCgpKSkKKyAgICAgICAgICAgICAgICAgICAgYm94LT5zZXRQ
cmVmV2lkdGhzRGlydHkodHJ1ZSwgZmFsc2UpOwogICAgICAgICAgICAgCiAgICAgICAgICAgICAg
ICAgaWYgKG8tPmlzUG9zaXRpb25lZCgpKQogICAgICAgICAgICAgICAgICAgICBvLT5jb250YWlu
aW5nQmxvY2soKS0+aW5zZXJ0UG9zaXRpb25lZE9iamVjdChib3gpOwpAQCAtNTY1LDcgKzYwNSw4
IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmxheW91dElubGluZUNoaWxkcmVuKGIKICAgICAgICAgICAg
ICAgICAgICAgZWxzZSBpZiAoZnVsbExheW91dCB8fCBvLT5uZWVkc0xheW91dCgpKSAvLyBSZXBs
YWNlZCBlbGVtZW50cwogICAgICAgICAgICAgICAgICAgICAgICAgdG9SZW5kZXJCb3gobyktPmRp
cnR5TGluZUJveGVzKGZ1bGxMYXlvdXQpOwogCi0gICAgICAgICAgICAgICAgICAgIG8tPmxheW91
dElmTmVlZGVkKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghby0+aXNSZXBsYWNlZCgpIHx8
ICFvLT5pc0Fub255bW91c0lubGluZUJsb2NrKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBv
LT5sYXlvdXRJZk5lZWRlZCgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxz
ZSBpZiAoby0+aXNUZXh0KCkgfHwgKG8tPmlzUmVuZGVySW5saW5lKCkgJiYgIWVuZE9mSW5saW5l
KSkgewogICAgICAgICAgICAgICAgIGhhc0lubGluZUNoaWxkID0gdHJ1ZTsKQEAgLTY2MCw3ICs3
MDEsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjpsYXlvdXRJbmxpbmVDaGlsZHJlbihiCiAgICAgICAg
ICAgICBpc0xpbmVFbXB0eSA9IHRydWU7CiAgICAgICAgICAgICAKICAgICAgICAgICAgIEVDbGVh
ciBjbGVhciA9IENOT05FOwotICAgICAgICAgICAgZW5kID0gZmluZE5leHRMaW5lQnJlYWsocmVz
b2x2ZXIsIGZpcnN0TGluZSwgaXNMaW5lRW1wdHksIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSwg
JmNsZWFyKTsKKyAgICAgICAgICAgIGVuZCA9IGZpbmROZXh0TGluZUJyZWFrKHJlc29sdmVyLCBm
aXJzdExpbmUsIGlzTGluZUVtcHR5LCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHksIG1hcmdpbklu
Zm8sICZjbGVhcik7CiAgICAgICAgICAgICBpZiAocmVzb2x2ZXIucG9zaXRpb24oKS5hdEVuZCgp
KSB7CiAgICAgICAgICAgICAgICAgcmVzb2x2ZXIuZGVsZXRlUnVucygpOwogICAgICAgICAgICAg
ICAgIGNoZWNrRm9yRmxvYXRzRnJvbUxhc3RMaW5lID0gdHJ1ZTsKQEAgLTczMCw2ICs3NzEsMTQg
QEAgdm9pZCBSZW5kZXJCbG9jazo6bGF5b3V0SW5saW5lQ2hpbGRyZW4oYgogICAgICAgICAgICAg
ICAgICAgICBpZiAobGluZUJveCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbGluZUJveC0+
c2V0RW5kc1dpdGhCcmVhayhwcmV2aW91c0xpbmVCcm9rZUNsZWFubHkpOwogCisgICAgICAgICAg
ICAgICAgICAgICAgICAvLyBJZiBvdXIgcHJldmlvdXMgbGluZSB3YXMgYW4gYW5vbnltb3VzIGJs
b2NrIGFuZCB3ZSBhcmUgbm90IGFuIGFub255bW91cyBibG9jaywgc2ltdWxhdGUgYSBtYXJnaW4g
Y29sbGFwc2Ugbm93IHNvIHRoYXQgd2UgZ2V0IHRoZSBwcm9wZXIKKyAgICAgICAgICAgICAgICAg
ICAgICAgIC8vIGluY3JlYXNlZCBoZWlnaHQuICBXZSBhbHNvIGhhdmUgdG8gc2ltdWxhdGUgYSBt
YXJnaW4gY29sbGFwc2UgdG8gcHJvcGFnYXRlIG1hcmdpbnMgdGhyb3VnaCB0byB0aGUgdG9wIG9m
IG91ciBibG9jay4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbGluZUJveC0+aGFzQW5v
bnltb3VzSW5saW5lQmxvY2soKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgh
bGluZUJveC0+cHJldlJvb3RCb3goKSB8fCBsaW5lQm94LT5wcmV2Um9vdEJveCgpLT5oYXNBbm9u
eW1vdXNJbmxpbmVCbG9jaygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xs
YXBzZU1hcmdpbnMoMCwgbWFyZ2luSW5mbyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
bWFyZ2luSW5mby5zZXRBdFRvcE9mQmxvY2soZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAg
ICAgfQorCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3cgd2UgcG9zaXRpb24gYWxsIG9m
IG91ciB0ZXh0IHJ1bnMgaG9yaXpvbnRhbGx5LgogICAgICAgICAgICAgICAgICAgICAgICAgY29t
cHV0ZUhvcml6b250YWxQb3NpdGlvbnNGb3JMaW5lKGxpbmVCb3gsIGZpcnN0TGluZSwgcmVzb2x2
ZXIuZmlyc3RSdW4oKSwgdHJhaWxpbmdTcGFjZVJ1biwgZW5kLmF0RW5kKCkpOwogCkBAIC04NjEs
OCArOTEwLDE0IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmxheW91dElubGluZUNoaWxkcmVuKGIKICAg
ICAgICAgfQogICAgIH0KIAotICAgIC8vIE5vdyBhZGQgaW4gdGhlIGJvdHRvbSBib3JkZXIvcGFk
ZGluZy4KLSAgICBzZXRIZWlnaHQoaGVpZ2h0KCkgKyB0b0FkZCk7CisgICAgLy8gTm93IGRvIHRo
ZSBoYW5kbGluZyBvZiB0aGUgYm90dG9tIG9mIHRoZSBibG9jaywgYWRkaW5nIGluIG91ciBib3R0
b20gYm9yZGVyL3BhZGRpbmcgYW5kCisgICAgLy8gZGV0ZXJtaW5pbmcgdGhlIGNvcnJlY3QgY29s
bGFwc2VkIGJvdHRvbSBtYXJnaW4gaW5mb3JtYXRpb24uICBUaGlzIGNvbGxhcHNlIGlzIG9ubHkg
bmVjZXNzYXJ5CisgICAgLy8gaWYgb3VyIGxhc3QgY2hpbGQgd2FzIGFuIGFub255bW91cyBpbmxp
bmUgYmxvY2sgdGhhdCBtaWdodCBuZWVkIHRvIHByb3BhZ2F0ZSBtYXJnaW4gaW5mb3JtYXRpb24g
b3V0IHRvCisgICAgLy8gdXMuCisgICAgaWYgKGxhc3RSb290Qm94KCkgJiYgbGFzdFJvb3RCb3go
KS0+aGFzQW5vbnltb3VzSW5saW5lQmxvY2soKSkKKyAgICAgICAgaGFuZGxlQm90dG9tT2ZCbG9j
ayh0b3AsIGJvdHRvbSwgbWFyZ2luSW5mbyk7CisgICAgZWxzZQorICAgICAgICBzZXRIZWlnaHQo
aGVpZ2h0KCkgKyBib3R0b20pOwogCiAgICAgaWYgKCFmaXJzdExpbmVCb3goKSAmJiBoYXNMaW5l
SWZFbXB0eSgpKQogICAgICAgICBzZXRIZWlnaHQoaGVpZ2h0KCkgKyBsaW5lSGVpZ2h0KHRydWUs
IHRydWUpKTsKQEAgLTg4Myw2ICs5MzgsMTIgQEAgUm9vdElubGluZUJveCogUmVuZGVyQmxvY2s6
OmRldGVybWluZVN0YQogICAgIGlmICghZnVsbExheW91dCkgewogICAgICAgICBzaXplX3QgZmxv
YXRJbmRleCA9IDA7CiAgICAgICAgIGZvciAoY3VyciA9IGZpcnN0Um9vdEJveCgpOyBjdXJyICYm
ICFjdXJyLT5pc0RpcnR5KCk7IGN1cnIgPSBjdXJyLT5uZXh0Um9vdEJveCgpKSB7CisgICAgICAg
ICAgICBpZiAoY3Vyci0+aGFzQW5vbnltb3VzSW5saW5lQmxvY2soKSkgeworICAgICAgICAgICAg
ICAgIC8vIEZJWE1FOiBXZSBoYXZlIHRvIGRvIGJldHRlciB0aGFuIHRoaXMgb3Igd2Ugd2lsbCBy
ZXBhaW50IHRvbyBtdWNoIGFzIGNvbnRlbnQgaW5zaWRlIGFuCisgICAgICAgICAgICAgICAgLy8g
YW5vbnltb3VzIGlubGluZSBibG9jayBjb21lcyBpbi4KKyAgICAgICAgICAgICAgICBmdWxsTGF5
b3V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KICAgICAg
ICAgICAgIGlmIChWZWN0b3I8UmVuZGVyQm94Kj4qIGNsZWFuTGluZUZsb2F0cyA9IGN1cnItPmZs
b2F0c1B0cigpKSB7CiAgICAgICAgICAgICAgICAgVmVjdG9yPFJlbmRlckJveCo+OjppdGVyYXRv
ciBlbmQgPSBjbGVhbkxpbmVGbG9hdHMtPmVuZCgpOwogICAgICAgICAgICAgICAgIGZvciAoVmVj
dG9yPFJlbmRlckJveCo+OjppdGVyYXRvciBvID0gY2xlYW5MaW5lRmxvYXRzLT5iZWdpbigpOyBv
ICE9IGVuZDsgKytvKSB7CkBAIC0xMTQwLDcgKzEyMDEsNyBAQCBzdGF0aWMgYm9vbCBpbmxpbmVG
bG93UmVxdWlyZXNMaW5lQm94KFJlCiB7CiAgICAgLy8gRklYTUU6IFJpZ2h0IG5vdywgd2Ugb25s
eSBhbGxvdyBsaW5lIGJveGVzIGZvciBpbmxpbmVzIHRoYXQgYXJlIHRydWx5IGVtcHR5LgogICAg
IC8vIFdlIG5lZWQgdG8gZml4IHRoaXMsIHRob3VnaCwgYmVjYXVzZSBhdCB0aGUgdmVyeSBsZWFz
dCwgaW5saW5lcyBjb250YWluaW5nIG9ubHkKLSAgICAvLyBpZ25vcmFibGUgd2hpdGVzcGFjZSBz
aG91bGQgc2hvdWxkIGFsc28gaGF2ZSBsaW5lIGJveGVzLiAKKyAgICAvLyBpZ25vcmFibGUgd2hp
dGVzcGFjZSBzaG91bGQgYWxzbyBoYXZlIGxpbmUgYm94ZXMuIAogICAgIHJldHVybiAhZmxvdy0+
Zmlyc3RDaGlsZCgpICYmIGZsb3ctPmhhc0hvcml6b250YWxCb3JkZXJzUGFkZGluZ09yTWFyZ2lu
KCk7CiB9CiAKQEAgLTEyOTcsNyArMTM1OCw3IEBAIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgdGV4
dFdpZHRoKFJlbmRlclQKIH0KIAogSW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6OmZpbmROZXh0
TGluZUJyZWFrKElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIsIGJvb2wgZmlyc3RMaW5lLCAg
Ym9vbCYgaXNMaW5lRW1wdHksIGJvb2wmIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSwgCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUNsZWFyKiBjbGVhcikK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXJnaW5JbmZv
JiBtYXJnaW5JbmZvLCBFQ2xlYXIqIGNsZWFyKQogewogICAgIEFTU0VSVChyZXNvbHZlci5wb3Np
dGlvbigpLmJsb2NrID09IHRoaXMpOwogCkBAIC0xMzM4LDYgKzEzOTksMTEgQEAgSW5saW5lSXRl
cmF0b3IgUmVuZGVyQmxvY2s6OmZpbmROZXh0TGluZQogICAgIGJvb2wgYXV0b1dyYXBXYXNFdmVy
VHJ1ZU9uTGluZSA9IGZhbHNlOwogICAgIGJvb2wgZmxvYXRzRml0T25MaW5lID0gdHJ1ZTsKICAg
ICAKKyAgICBib29sIGlzQmxvY2tJbnNpZGVJbmxpbmUgPSBmYWxzZTsKKyAgICAKKyAgICBpbnQg
cHJldmlvdXNCbG9ja0Zsb2F0Qm90dG9tID0gMDsKKyAgICBpbnQgbWF4QmxvY2tGbG9hdEJvdHRv
bSA9IDA7CisKICAgICAvLyBGaXJlZm94IGFuZCBPcGVyYSB3aWxsIGFsbG93IGEgdGFibGUgY2Vs
bCB0byBncm93IHRvIGZpdCBhbiBpbWFnZSBpbnNpZGUgaXQgdW5kZXIKICAgICAvLyB2ZXJ5IHNw
ZWNpZmljIGNpcmN1bXN0YW5jZXMgKGluIG9yZGVyIHRvIG1hdGNoIGNvbW1vbiBXaW5JRSByZW5k
ZXJpbmdzKS4gCiAgICAgLy8gTm90IHN1cHBvcnRpbmcgdGhlIHF1aXJrIGhhcyBjYXVzZWQgdXMg
dG8gbWlzLXJlbmRlciBzb21lIHJlYWwgc2l0ZXMuIChTZWUgQnVnemlsbGEgMTA1MTcuKSAKQEAg
LTEzNDgsNyArMTQxNCw4IEBAIElubGluZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpmaW5kTmV4dExp
bmUKICAgICB3aGlsZSAobykgewogICAgICAgICBjdXJyV1MgPSBvLT5pc1JlcGxhY2VkKCkgPyBv
LT5wYXJlbnQoKS0+c3R5bGUoKS0+d2hpdGVTcGFjZSgpIDogby0+c3R5bGUoKS0+d2hpdGVTcGFj
ZSgpOwogICAgICAgICBsYXN0V1MgPSBsYXN0LT5pc1JlcGxhY2VkKCkgPyBsYXN0LT5wYXJlbnQo
KS0+c3R5bGUoKS0+d2hpdGVTcGFjZSgpIDogbGFzdC0+c3R5bGUoKS0+d2hpdGVTcGFjZSgpOwot
ICAgICAgICAKKyAgICAgICAgaXNCbG9ja0luc2lkZUlubGluZSA9IG8tPmlzQW5vbnltb3VzSW5s
aW5lQmxvY2soKTsKKwogICAgICAgICBib29sIGF1dG9XcmFwID0gUmVuZGVyU3R5bGU6OmF1dG9X
cmFwKGN1cnJXUyk7CiAgICAgICAgIGF1dG9XcmFwV2FzRXZlclRydWVPbkxpbmUgPSBhdXRvV3Jh
cFdhc0V2ZXJUcnVlT25MaW5lIHx8IGF1dG9XcmFwOwogCkBAIC0xMzU5LDcgKzE0MjYsNyBAQCBJ
bmxpbmVJdGVyYXRvciBSZW5kZXJCbG9jazo6ZmluZE5leHRMaW5lCiAjZW5kaWYKIAogICAgICAg
ICBib29sIGNvbGxhcHNlV2hpdGVTcGFjZSA9IFJlbmRlclN0eWxlOjpjb2xsYXBzZVdoaXRlU3Bh
Y2UoY3VycldTKTsKLSAgICAgICAgICAgIAorCiAgICAgICAgIGlmIChvLT5pc0JSKCkpIHsKICAg
ICAgICAgICAgIGlmICh3ICsgdG1wVyA8PSB3aWR0aCkgewogICAgICAgICAgICAgICAgIGxCcmVh
ay5vYmogPSBvOwpAQCAtMTQ2Niw4ICsxNTMzLDkgQEAgSW5saW5lSXRlcmF0b3IgUmVuZGVyQmxv
Y2s6OmZpbmROZXh0TGluZQogICAgICAgICB9IGVsc2UgaWYgKG8tPmlzUmVwbGFjZWQoKSkgewog
ICAgICAgICAgICAgUmVuZGVyQm94KiByZXBsYWNlZEJveCA9IHRvUmVuZGVyQm94KG8pOwogCi0g
ICAgICAgICAgICAvLyBCcmVhayBvbiByZXBsYWNlZCBlbGVtZW50cyBpZiBlaXRoZXIgaGFzIG5v
cm1hbCB3aGl0ZS1zcGFjZS4KLSAgICAgICAgICAgIGlmICgoYXV0b1dyYXAgfHwgUmVuZGVyU3R5
bGU6OmF1dG9XcmFwKGxhc3RXUykpICYmICghby0+aXNJbWFnZSgpIHx8IGFsbG93SW1hZ2VzVG9C
cmVhaykpIHsKKyAgICAgICAgICAgIC8vIEJyZWFrIG9uIHJlcGxhY2VkIGVsZW1lbnRzIGlmIGVp
dGhlciBoYXMgbm9ybWFsIHdoaXRlLXNwYWNlLiAgV2UgYWxzbyBhbHdheXMgYnJlYWsgaWYgd2UK
KyAgICAgICAgICAgIC8vIGVuY291bnRlciBhIHNwZWNpYWwgYW5vbnltb3VzIGlubGluZSBibG9j
ayAodXNlZCB0byBob2xkIGJsb2NrcyBpbnNpZGUgaW5saW5lcykuCisgICAgICAgICAgICBpZiAo
KGF1dG9XcmFwIHx8IFJlbmRlclN0eWxlOjphdXRvV3JhcChsYXN0V1MpIHx8IGlzQmxvY2tJbnNp
ZGVJbmxpbmUpICAmJiAoIW8tPmlzSW1hZ2UoKSB8fCBhbGxvd0ltYWdlc1RvQnJlYWspKSB7CiAg
ICAgICAgICAgICAgICAgdyArPSB0bXBXOwogICAgICAgICAgICAgICAgIHRtcFcgPSAwOwogICAg
ICAgICAgICAgICAgIGxCcmVhay5vYmogPSBvOwpAQCAtMTQ3NSw2ICsxNTQzLDE5IEBAIElubGlu
ZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpmaW5kTmV4dExpbmUKICAgICAgICAgICAgICAgICBsQnJl
YWsubmV4dEJyZWFrYWJsZVBvc2l0aW9uID0gLTE7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAg
ICAgIGlmIChpc0Jsb2NrSW5zaWRlSW5saW5lKSB7CisgICAgICAgICAgICAgICAgaWYgKCFpc0xp
bmVFbXB0eSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBlbmQ7CisKKyAgICAgICAgICAgICAg
ICAvLyBSZXNldCB0aGUgd2lkdGggdG8gaWdub3JlIGZsb2F0cywgc2luY2Ugd2UncmUgZ29pbmcg
dG8gYWxsb3cgdGhlbSB0byBpbnRydWRlIGludG8gb3VyIHNwYWNlLgorICAgICAgICAgICAgICAg
IHdpZHRoID0gcmlnaHRPZmZzZXQoKSAtIGxlZnRPZmZzZXQoKTsKKworICAgICAgICAgICAgICAg
IC8vIEZJWE1FOiBUaGlzIGNhbGwgd2lsbCB1cGRhdGUgdGhlIGhlaWdodCBvZiBvdXIgYmxvY2su
ICBJdCdzIG5vdCBjbGVhciBpZiB0aGF0J3MgZ29pbmcgdG8gYmUgb2sgb3Igbm90IHlldC4KKyAg
ICAgICAgICAgICAgICBsYXlvdXRCbG9ja0NoaWxkKHJlcGxhY2VkQm94LCBtYXJnaW5JbmZvLCBw
cmV2aW91c0Jsb2NrRmxvYXRCb3R0b20sIG1heEJsb2NrRmxvYXRCb3R0b20pOworCisgICAgICAg
ICAgICAgICAgbGluZU1pZHBvaW50U3RhdGUuYmV0d2Vlbk1pZHBvaW50cyA9IGZhbHNlOworICAg
ICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoaWdub3JpbmdTcGFjZXMpCiAgICAgICAgICAg
ICAgICAgYWRkTWlkcG9pbnQobGluZU1pZHBvaW50U3RhdGUsIElubGluZUl0ZXJhdG9yKDAsIG8s
IDApKTsKIApAQCAtMTQ5OCw2ICsxNTc5LDE1IEBAIElubGluZUl0ZXJhdG9yIFJlbmRlckJsb2Nr
OjpmaW5kTmV4dExpbmUKICAgICAgICAgICAgICAgICAgICAgdG1wVyArPSByZXBsYWNlZEJveC0+
d2lkdGgoKSArIHJlcGxhY2VkQm94LT5tYXJnaW5MZWZ0KCkgKyByZXBsYWNlZEJveC0+bWFyZ2lu
UmlnaHQoKSArIGlubGluZVdpZHRoKG8pOwogICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAg
ICAgICAgdG1wVyArPSByZXBsYWNlZEJveC0+d2lkdGgoKSArIHJlcGxhY2VkQm94LT5tYXJnaW5M
ZWZ0KCkgKyByZXBsYWNlZEJveC0+bWFyZ2luUmlnaHQoKSArIGlubGluZVdpZHRoKG8pOworICAg
ICAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGlzQmxvY2tJbnNpZGVJbmxpbmUpIHsKKyAg
ICAgICAgICAgICAgICB3ICs9IHRtcFc7CisgICAgICAgICAgICAgICAgdG1wVyA9IDA7CisgICAg
ICAgICAgICAgICAgbEJyZWFrLm9iaiA9IG87CisgICAgICAgICAgICAgICAgbEJyZWFrLnBvcyA9
IDA7CisgICAgICAgICAgICAgICAgbEJyZWFrLm5leHRCcmVha2FibGVQb3NpdGlvbiA9IC0xOwor
ICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2Ug
aWYgKG8tPmlzVGV4dCgpKSB7CiAgICAgICAgICAgICBpZiAoIXBvcykKICAgICAgICAgICAgICAg
ICBhcHBsaWVkU3RhcnRXaWR0aCA9IGZhbHNlOwpAQCAtMTg4NCw3ICsxOTc0LDcgQEAgSW5saW5l
SXRlcmF0b3IgUmVuZGVyQmxvY2s6OmZpbmROZXh0TGluZQogICAgICAgICB9CiAgICAgICAgIC8v
ZWxzZSBpZiAobEJyZWFrLnBvcyA+IDApCiAgICAgICAgIC8vICAgIGxCcmVhay5wb3MtLTsKLSAg
ICAgICAgZWxzZSBpZiAobEJyZWFrLm9iaiA9PSAwICYmIHRyYWlsaW5nU3BhY2VPYmplY3QtPmlz
VGV4dCgpKSB7CisgICAgICAgIGVsc2UgaWYgKCghbEJyZWFrLm9iaiB8fCBsQnJlYWsub2JqLT5p
c0Fub255bW91c0lubGluZUJsb2NrKCkpICYmIHRyYWlsaW5nU3BhY2VPYmplY3QtPmlzVGV4dCgp
KSB7CiAgICAgICAgICAgICAvLyBBZGQgYSBuZXcgZW5kIG1pZHBvaW50IHRoYXQgc3RvcHMgcmln
aHQgYXQgdGhlIHZlcnkgZW5kLgogICAgICAgICAgICAgUmVuZGVyVGV4dCogdGV4dCA9IHRvUmVu
ZGVyVGV4dCh0cmFpbGluZ1NwYWNlT2JqZWN0KTsKICAgICAgICAgICAgIHVuc2lnbmVkIGxlbmd0
aCA9IHRleHQtPnRleHRMZW5ndGgoKTsKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJv
eC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQm94LmNwcAkocmV2
aXNpb24gNTQ2NjQpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCb3guY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0xMzM0LDcgKzEzMzQsNyBAQCB2b2lkIFJlbmRlckJveDo6Y2FsY1dpZHRoKCkK
ICAgICB9CiAKICAgICBpZiAoY29udGFpbmVyV2lkdGggJiYgY29udGFpbmVyV2lkdGggIT0gKHdp
ZHRoKCkgKyBtX21hcmdpbkxlZnQgKyBtX21hcmdpblJpZ2h0KQotICAgICAgICAgICAgJiYgIWlz
RmxvYXRpbmcoKSAmJiAhaXNJbmxpbmUoKSAmJiAhY2ItPmlzRmxleGlibGVCb3goKSkgeworICAg
ICAgICAgICAgJiYgIWlzRmxvYXRpbmcoKSAmJiAoIWlzSW5saW5lKCkgfHwgaXNBbm9ueW1vdXNJ
bmxpbmVCbG9jaygpKSAmJiAhY2ItPmlzRmxleGlibGVCb3goKSkgewogICAgICAgICBpZiAoY2It
PnN0eWxlKCktPmRpcmVjdGlvbigpID09IExUUikKICAgICAgICAgICAgIG1fbWFyZ2luUmlnaHQg
PSBjb250YWluZXJXaWR0aCAtIHdpZHRoKCkgLSBtX21hcmdpbkxlZnQ7CiAgICAgICAgIGVsc2UK
QEAgLTEzNzMsNyArMTM3Myw3IEBAIGJvb2wgUmVuZGVyQm94OjpzaXplc1RvSW50cmluc2ljV2lk
dGgoV2kKIHsKICAgICAvLyBNYXJxdWVlcyBpbiBXaW5JRSBhcmUgbGlrZSBhIG1peHR1cmUgb2Yg
YmxvY2tzIGFuZCBpbmxpbmUtYmxvY2tzLiAgVGhleSBzaXplIGFzIHRob3VnaCB0aGV5J3JlIGJs
b2NrcywKICAgICAvLyBidXQgdGhleSBhbGxvdyB0ZXh0IHRvIHNpdCBvbiB0aGUgc2FtZSBsaW5l
IGFzIHRoZSBtYXJxdWVlLgotICAgIGlmIChpc0Zsb2F0aW5nKCkgfHwgKGlzSW5saW5lQmxvY2tP
cklubGluZVRhYmxlKCkgJiYgIWlzSFRNTE1hcnF1ZWUoKSkpCisgICAgaWYgKGlzRmxvYXRpbmco
KSB8fCAoaXNJbmxpbmVCbG9ja09ySW5saW5lVGFibGUoKSAmJiAhaXNIVE1MTWFycXVlZSgpICYm
ICFpc0Fub255bW91c0lubGluZUJsb2NrKCkpKQogICAgICAgICByZXR1cm4gdHJ1ZTsKIAogICAg
IC8vIFRoaXMgY29kZSBtYXkgbG9vayBhIGJpdCBzdHJhbmdlLiAgQmFzaWNhbGx5IHdpZHRoOmlu
dHJpbnNpYyBzaG91bGQgY2xhbXAgdGhlIHNpemUgd2hlbiB0ZXN0aW5nIGJvdGgKQEAgLTI4MTks
NyArMjgxOSw3IEBAIGJvb2wgUmVuZGVyQm94OjpzaHJpbmtUb0F2b2lkRmxvYXRzKCkgY28KIAog
Ym9vbCBSZW5kZXJCb3g6OmF2b2lkc0Zsb2F0cygpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIGlzUmVw
bGFjZWQoKSB8fCBoYXNPdmVyZmxvd0NsaXAoKSB8fCBpc0hSKCk7CisgICAgcmV0dXJuICFpc0Fu
b255bW91c0lubGluZUJsb2NrKCkgJiYgKGlzUmVwbGFjZWQoKSB8fCBoYXNPdmVyZmxvd0NsaXAo
KSB8fCBpc0hSKCkpOwogfQogCiB2b2lkIFJlbmRlckJveDo6YWRkU2hhZG93T3ZlcmZsb3coKQpJ
bmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQm94TW9kZWxPYmplY3QuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJveE1vZGVsT2JqZWN0LmNwcAkocmV2aXNp
b24gNTQ2NjQpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCb3hNb2RlbE9iamVjdC5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTUxMSw4ICs1MTEsOSBAQCB2b2lkIFJlbmRlckJveE1vZGVsT2Jq
ZWN0OjpwYWludEZpbGxMYXllCiAgICAgICAgIC8vIE5vdyBhZGQgdGhlIHRleHQgdG8gdGhlIGNs
aXAuICBXZSBkbyB0aGlzIGJ5IHBhaW50aW5nIHVzaW5nIGEgc3BlY2lhbCBwYWludCBwaGFzZSB0
aGF0IHNpZ25hbHMgdG8KICAgICAgICAgLy8gSW5saW5lVGV4dEJveGVzIHRoYXQgdGhleSBzaG91
bGQganVzdCBhZGQgdGhlaXIgY29udGVudHMgdG8gdGhlIGNsaXAuCiAgICAgICAgIFBhaW50SW5m
byBpbmZvKG1hc2tJbWFnZUNvbnRleHQsIG1hc2tSZWN0LCBQYWludFBoYXNlVGV4dENsaXAsIHRy
dWUsIDAsIDApOworICAgICAgICBMaW5lQm94UGFpbnRJbmZvIGxpbmVCb3hJbmZvOwogICAgICAg
ICBpZiAoYm94KQotICAgICAgICAgICAgYm94LT5wYWludChpbmZvLCB0eCAtIGJveC0+eCgpLCB0
eSAtIGJveC0+eSgpKTsKKyAgICAgICAgICAgIGJveC0+cGFpbnQoaW5mbywgdHggLSBib3gtPngo
KSwgdHkgLSBib3gtPnkoKSwgbGluZUJveEluZm8pOwogICAgICAgICBlbHNlIHsKICAgICAgICAg
ICAgIGludCB4ID0gaXNCb3goKSA/IHRvUmVuZGVyQm94KHRoaXMpLT54KCkgOiAwOwogICAgICAg
ICAgICAgaW50IHkgPSBpc0JveCgpID8gdG9SZW5kZXJCb3godGhpcyktPnkoKSA6IDA7CkluZGV4
OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJJbmxpbmUuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlcklubGluZS5jcHAJKHJldmlzaW9uIDU0NjY0KQorKysgV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVySW5saW5lLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDQsNyArNDQs
NiBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIFJlbmRlcklubGluZTo6UmVuZGVySW5saW5lKE5v
ZGUqIG5vZGUpCiAgICAgOiBSZW5kZXJCb3hNb2RlbE9iamVjdChub2RlKQotICAgICwgbV9jb250
aW51YXRpb24oMCkKICAgICAsIG1fbGluZUhlaWdodCgtMSkKICAgICAsIG1fdmVydGljYWxQb3Np
dGlvbihQb3NpdGlvblVuZGVmaW5lZCkKIHsKQEAgLTU2LDE0ICs1NSw2IEBAIHZvaWQgUmVuZGVy
SW5saW5lOjpkZXN0cm95KCkKICAgICAvLyBNYWtlIHN1cmUgdG8gZGVzdHJveSBhbm9ueW1vdXMg
Y2hpbGRyZW4gZmlyc3Qgd2hpbGUgdGhleSBhcmUgc3RpbGwgY29ubmVjdGVkIHRvIHRoZSByZXN0
IG9mIHRoZSB0cmVlLCBzbyB0aGF0IHRoZXkgd2lsbAogICAgIC8vIHByb3Blcmx5IGRpcnR5IGxp
bmUgYm94ZXMgdGhhdCB0aGV5IGFyZSByZW1vdmVkIGZyb20uICBFZmZlY3RzIHRoYXQgZG8gOmJl
Zm9yZS86YWZ0ZXIgb25seSBvbiBob3ZlciBjb3VsZCBjcmFzaCBvdGhlcndpc2UuCiAgICAgY2hp
bGRyZW4oKS0+ZGVzdHJveUxlZnRvdmVyQ2hpbGRyZW4oKTsKLQotICAgIC8vIERlc3Ryb3kgb3Vy
IGNvbnRpbnVhdGlvbiBiZWZvcmUgYW55dGhpbmcgb3RoZXIgdGhhbiBhbm9ueW1vdXMgY2hpbGRy
ZW4uCi0gICAgLy8gVGhlIHJlYXNvbiB3ZSBkb24ndCBkZXN0cm95IGl0IGJlZm9yZSBhbm9ueW1v
dXMgY2hpbGRyZW4gaXMgdGhhdCB0aGV5IG1heQotICAgIC8vIGhhdmUgY29udGludWF0aW9ucyBv
ZiB0aGVpciBvd24gdGhhdCBhcmUgYW5vbnltb3VzIGNoaWxkcmVuIG9mIG91ciBjb250aW51YXRp
b24uCi0gICAgaWYgKG1fY29udGludWF0aW9uKSB7Ci0gICAgICAgIG1fY29udGludWF0aW9uLT5k
ZXN0cm95KCk7Ci0gICAgICAgIG1fY29udGludWF0aW9uID0gMDsKLSAgICB9CiAgICAgCiAgICAg
aWYgKCFkb2N1bWVudEJlaW5nRGVzdHJveWVkKCkpIHsKICAgICAgICAgaWYgKGZpcnN0TGluZUJv
eCgpKSB7CkBAIC05MiwxMyArODMsNiBAQCB2b2lkIFJlbmRlcklubGluZTo6ZGVzdHJveSgpCiAg
ICAgUmVuZGVyQm94TW9kZWxPYmplY3Q6OmRlc3Ryb3koKTsKIH0KIAotUmVuZGVySW5saW5lKiBS
ZW5kZXJJbmxpbmU6OmlubGluZUNvbnRpbnVhdGlvbigpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX2Nv
bnRpbnVhdGlvbiB8fCBtX2NvbnRpbnVhdGlvbi0+aXNJbmxpbmUoKSkKLSAgICAgICAgcmV0dXJu
IHRvUmVuZGVySW5saW5lKG1fY29udGludWF0aW9uKTsKLSAgICByZXR1cm4gdG9SZW5kZXJCbG9j
ayhtX2NvbnRpbnVhdGlvbiktPmlubGluZUNvbnRpbnVhdGlvbigpOwotfQotCiB2b2lkIFJlbmRl
cklubGluZTo6dXBkYXRlQm94TW9kZWxJbmZvRnJvbVN0eWxlKCkKIHsKICAgICBSZW5kZXJCb3hN
b2RlbE9iamVjdDo6dXBkYXRlQm94TW9kZWxJbmZvRnJvbVN0eWxlKCk7CkBAIC0xMTQsMTkgKzk4
LDYgQEAgdm9pZCBSZW5kZXJJbmxpbmU6OnN0eWxlRGlkQ2hhbmdlKFN0eWxlRAogewogICAgIFJl
bmRlckJveE1vZGVsT2JqZWN0OjpzdHlsZURpZENoYW5nZShkaWZmLCBvbGRTdHlsZSk7CiAKLSAg
ICAvLyBFbnN1cmUgdGhhdCBhbGwgb2YgdGhlIHNwbGl0IGlubGluZXMgcGljayB1cCB0aGUgbmV3
IHN0eWxlLiBXZQotICAgIC8vIG9ubHkgZG8gdGhpcyBpZiB3ZSdyZSBhbiBpbmxpbmUsIHNpbmNl
IHdlIGRvbid0IHdhbnQgdG8gcHJvcGFnYXRlCi0gICAgLy8gYSBibG9jaydzIHN0eWxlIHRvIHRo
ZSBvdGhlciBpbmxpbmVzLgotICAgIC8vIGUuZy4sIDxmb250PmZvbyA8aDQ+Z29vPC9oND4gbW9v
PC9mb250Pi4gIFRoZSA8Zm9udD4gaW5saW5lcyBiZWZvcmUKLSAgICAvLyBhbmQgYWZ0ZXIgdGhl
IGJsb2NrIHNoYXJlIHRoZSBzYW1lIHN0eWxlLCBidXQgdGhlIGJsb2NrIGRvZXNuJ3QKLSAgICAv
LyBuZWVkIHRvIHBhc3MgaXRzIHN0eWxlIG9uIHRvIGFueW9uZSBlbHNlLgotICAgIGZvciAoUmVu
ZGVySW5saW5lKiBjdXJyQ29udCA9IGlubGluZUNvbnRpbnVhdGlvbigpOyBjdXJyQ29udDsgY3Vy
ckNvbnQgPSBjdXJyQ29udC0+aW5saW5lQ29udGludWF0aW9uKCkpIHsKLSAgICAgICAgUmVuZGVy
Qm94TW9kZWxPYmplY3QqIG5leHRDb250ID0gY3VyckNvbnQtPmNvbnRpbnVhdGlvbigpOwotICAg
ICAgICBjdXJyQ29udC0+c2V0Q29udGludWF0aW9uKDApOwotICAgICAgICBjdXJyQ29udC0+c2V0
U3R5bGUoc3R5bGUoKSk7Ci0gICAgICAgIGN1cnJDb250LT5zZXRDb250aW51YXRpb24obmV4dENv
bnQpOwotICAgIH0KLQogICAgIG1fbGluZUhlaWdodCA9IC0xOwogCiAgICAgLy8gVXBkYXRlIHBz
ZXVkb3MgZm9yIDpiZWZvcmUgYW5kIDphZnRlciBub3cuCkBAIC0xMzYsNzkgKzEwNyw3MyBAQCB2
b2lkIFJlbmRlcklubGluZTo6c3R5bGVEaWRDaGFuZ2UoU3R5bGVECiAgICAgfQogfQogCi12b2lk
IFJlbmRlcklubGluZTo6YWRkQ2hpbGQoUmVuZGVyT2JqZWN0KiBuZXdDaGlsZCwgUmVuZGVyT2Jq
ZWN0KiBiZWZvcmVDaGlsZCkKLXsKLSAgICBpZiAoY29udGludWF0aW9uKCkpCi0gICAgICAgIHJl
dHVybiBhZGRDaGlsZFRvQ29udGludWF0aW9uKG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7Ci0gICAg
cmV0dXJuIGFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24obmV3Q2hpbGQsIGJlZm9yZUNoaWxk
KTsKLX0KLQotc3RhdGljIFJlbmRlckJveE1vZGVsT2JqZWN0KiBuZXh0Q29udGludWF0aW9uKFJl
bmRlck9iamVjdCogcmVuZGVyZXIpCi17Ci0gICAgaWYgKHJlbmRlcmVyLT5pc0lubGluZSgpICYm
ICFyZW5kZXJlci0+aXNSZXBsYWNlZCgpKQotICAgICAgICByZXR1cm4gdG9SZW5kZXJJbmxpbmUo
cmVuZGVyZXIpLT5jb250aW51YXRpb24oKTsKLSAgICByZXR1cm4gdG9SZW5kZXJCbG9jayhyZW5k
ZXJlciktPmlubGluZUNvbnRpbnVhdGlvbigpOwotfQotCi1SZW5kZXJCb3hNb2RlbE9iamVjdCog
UmVuZGVySW5saW5lOjpjb250aW51YXRpb25CZWZvcmUoUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGls
ZCkKK3ZvaWQgUmVuZGVySW5saW5lOjpjaGlsZEJlY2FtZU5vbklubGluZShSZW5kZXJPYmplY3Qq
IGNoaWxkKQogewotICAgIGlmIChiZWZvcmVDaGlsZCAmJiBiZWZvcmVDaGlsZC0+cGFyZW50KCkg
PT0gdGhpcykKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0KLSAgICBSZW5kZXJCb3hNb2RlbE9iamVj
dCogY3VyciA9IG5leHRDb250aW51YXRpb24odGhpcyk7Ci0gICAgUmVuZGVyQm94TW9kZWxPYmpl
Y3QqIG5leHRUb0xhc3QgPSB0aGlzOwotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBsYXN0ID0g
dGhpczsKLSAgICB3aGlsZSAoY3VycikgewotICAgICAgICBpZiAoYmVmb3JlQ2hpbGQgJiYgYmVm
b3JlQ2hpbGQtPnBhcmVudCgpID09IGN1cnIpIHsKLSAgICAgICAgICAgIGlmIChjdXJyLT5maXJz
dENoaWxkKCkgPT0gYmVmb3JlQ2hpbGQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGxhc3Q7Ci0g
ICAgICAgICAgICByZXR1cm4gY3VycjsKLSAgICAgICAgfQotCi0gICAgICAgIG5leHRUb0xhc3Qg
PSBsYXN0OwotICAgICAgICBsYXN0ID0gY3VycjsKLSAgICAgICAgY3VyciA9IG5leHRDb250aW51
YXRpb24oY3Vycik7Ci0gICAgfQotCi0gICAgaWYgKCFiZWZvcmVDaGlsZCAmJiAhbGFzdC0+Zmly
c3RDaGlsZCgpKQotICAgICAgICByZXR1cm4gbmV4dFRvTGFzdDsKLSAgICByZXR1cm4gbGFzdDsK
KyAgICBSZW5kZXJPYmplY3QqIG5leHQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKTsKKyAgICByZW1v
dmVDaGlsZChjaGlsZCk7CisgICAgYWRkQ2hpbGQoY2hpbGQsIG5leHQpOwogfQogCi12b2lkIFJl
bmRlcklubGluZTo6YWRkQ2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihSZW5kZXJPYmplY3QqIG5l
d0NoaWxkLCBSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkKQordm9pZCBSZW5kZXJJbmxpbmU6OmFk
ZENoaWxkKFJlbmRlck9iamVjdCogbmV3Q2hpbGQsIFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQp
CiB7CiAgICAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IGFwcGVuZCB0aGluZ3MgYWZ0ZXIgOmFmdGVy
LWdlbmVyYXRlZCBjb250ZW50IGlmIHdlIGhhdmUgaXQuCiAgICAgaWYgKCFiZWZvcmVDaGlsZCAm
JiBpc0FmdGVyQ29udGVudChsYXN0Q2hpbGQoKSkpCiAgICAgICAgIGJlZm9yZUNoaWxkID0gbGFz
dENoaWxkKCk7CiAKLSAgICBpZiAoIW5ld0NoaWxkLT5pc0lubGluZSgpICYmICFuZXdDaGlsZC0+
aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpKSB7Ci0gICAgICAgIC8vIFdlIGFyZSBwbGFjaW5nIGEg
YmxvY2sgaW5zaWRlIGFuIGlubGluZS4gV2UgaGF2ZSB0byBwZXJmb3JtIGEgc3BsaXQgb2YgdGhp
cwotICAgICAgICAvLyBpbmxpbmUgaW50byBjb250aW51YXRpb25zLiAgVGhpcyBpbnZvbHZlcyBj
cmVhdGluZyBhbiBhbm9ueW1vdXMgYmxvY2sgYm94IHRvIGhvbGQKLSAgICAgICAgLy8gfG5ld0No
aWxkfC4gIFdlIHRoZW4gbWFrZSB0aGF0IGJsb2NrIGJveCBhIGNvbnRpbnVhdGlvbiBvZiB0aGlz
IGlubGluZS4gIFdlIHRha2UgYWxsIG9mCi0gICAgICAgIC8vIHRoZSBjaGlsZHJlbiBhZnRlciB8
YmVmb3JlQ2hpbGR8IGFuZCBwdXQgdGhlbSBpbiBhIGNsb25lIG9mIHRoaXMgb2JqZWN0LgotICAg
ICAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IG5ld1N0eWxlID0gUmVuZGVyU3R5bGU6OmNyZWF0ZSgp
OwotICAgICAgICBuZXdTdHlsZS0+aW5oZXJpdEZyb20oc3R5bGUoKSk7Ci0gICAgICAgIG5ld1N0
eWxlLT5zZXREaXNwbGF5KEJMT0NLKTsKLQotICAgICAgICBSZW5kZXJCbG9jayogbmV3Qm94ID0g
bmV3IChyZW5kZXJBcmVuYSgpKSBSZW5kZXJCbG9jayhkb2N1bWVudCgpIC8qIGFub255bW91cyBi
b3ggKi8pOwotICAgICAgICBuZXdCb3gtPnNldFN0eWxlKG5ld1N0eWxlLnJlbGVhc2UoKSk7Ci0g
ICAgICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBvbGRDb250aW51YXRpb24gPSBjb250aW51YXRp
b24oKTsKLSAgICAgICAgc2V0Q29udGludWF0aW9uKG5ld0JveCk7Ci0KLSAgICAgICAgLy8gU29t
ZW9uZSBtYXkgaGF2ZSBwdXQgYSA8cD4gaW5zaWRlIGEgPHE+LCBjYXVzaW5nIGEgc3BsaXQuICBX
aGVuIHRoaXMgaGFwcGVucywgdGhlIDphZnRlciBjb250ZW50Ci0gICAgICAgIC8vIGhhcyB0byBt
b3ZlIGludG8gdGhlIGlubGluZSBjb250aW51YXRpb24uICBDYWxsIHVwZGF0ZUJlZm9yZUFmdGVy
Q29udGVudCB0byBlbnN1cmUgdGhhdCBvdXIgOmFmdGVyCi0gICAgICAgIC8vIGNvbnRlbnQgZ2V0
cyBwcm9wZXJseSBkZXN0cm95ZWQuCi0gICAgICAgIGJvb2wgaXNMYXN0Q2hpbGQgPSAoYmVmb3Jl
Q2hpbGQgPT0gbGFzdENoaWxkKCkpOwotICAgICAgICBpZiAoZG9jdW1lbnQoKS0+dXNlc0JlZm9y
ZUFmdGVyUnVsZXMoKSkKLSAgICAgICAgICAgIGNoaWxkcmVuKCktPnVwZGF0ZUJlZm9yZUFmdGVy
Q29udGVudCh0aGlzLCBBRlRFUik7Ci0gICAgICAgIGlmIChpc0xhc3RDaGlsZCAmJiBiZWZvcmVD
aGlsZCAhPSBsYXN0Q2hpbGQoKSkKLSAgICAgICAgICAgIGJlZm9yZUNoaWxkID0gMDsgLy8gV2Ug
ZGVzdHJveWVkIHRoZSBsYXN0IGNoaWxkLCBzbyBub3cgd2UgbmVlZCB0byB1cGRhdGUgb3VyIGlu
c2VydGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb2ludCB0byBiZSAwLiAg
SXQncyBqdXN0IGEgc3RyYWlnaHQgYXBwZW5kIG5vdy4KLQotICAgICAgICBzcGxpdEZsb3coYmVm
b3JlQ2hpbGQsIG5ld0JveCwgbmV3Q2hpbGQsIG9sZENvbnRpbnVhdGlvbik7CisgICAgLy8gSWYg
dGhlIHJlcXVlc3RlZCBiZWZvcmVDaGlsZCBpcyBub3Qgb25lIG9mIG91ciBjaGlsZHJlbiwgdGhl
biB0aGlzIGlzIG1vc3QgbGlrZWx5IGJlY2F1c2UKKyAgICAvLyB0aGVyZSBpcyBhbiBhbm9ueW1v
dXMgaW5saW5lLWJsb2NrIGJveCB3aXRoaW4gdGhpcyBvYmplY3QgdGhhdCBjb250YWlucyB0aGUg
YmVmb3JlQ2hpbGQuIFNvCisgICAgLy8ganVzdCBpbnNlcnQgdGhlIGNoaWxkIGludG8gdGhlIGFu
b255bW91cyBpbmxpbmUtYmxvY2sgYm94IGluc3RlYWQgb2YgaGVyZS4KKyAgICAvLyBBIHNlY29u
ZCBwb3NzaWJpbGl0eSBpcyB0aGF0IHRoZSBiZWZvcmVDaGlsZCBpcyBhbiBhbm9ueW1vdXMgYmxv
Y2sgaW5zaWRlIHRoZSBhbm9ueW1vdXMgaW5saW5lIGJsb2NrLgorICAgIC8vIFRoaXMgY2FuIGhh
cHBlbiBpZiBpbmxpbmVzIGFyZSBpbnNlcnRlZCBpbiBiZXR3ZWVuIHR3byBvZiB0aGUgYW5vbnlt
b3VzIGlubGluZSBibG9jaydzIGJsb2NrLWxldmVsCisgICAgLy8gY2hpbGRyZW4gYWZ0ZXIgaXQg
aGFzIGJlZW4gY3JlYXRlZC4KKyAgICBpZiAoYmVmb3JlQ2hpbGQgJiYgYmVmb3JlQ2hpbGQtPnBh
cmVudCgpICE9IHRoaXMpIHsKKyAgICAgICAgQVNTRVJUKGJlZm9yZUNoaWxkLT5wYXJlbnQoKSk7
CisgICAgICAgIEFTU0VSVChiZWZvcmVDaGlsZC0+cGFyZW50KCktPmlzQW5vbnltb3VzSW5saW5l
QmxvY2soKSB8fCBiZWZvcmVDaGlsZC0+cGFyZW50KCktPmlzQW5vbnltb3VzQmxvY2soKSk7Cisg
ICAgICAgIGlmIChiZWZvcmVDaGlsZC0+cGFyZW50KCktPmlzQW5vbnltb3VzSW5saW5lQmxvY2so
KSkgeworICAgICAgICAgICAgaWYgKCFuZXdDaGlsZC0+aXNJbmxpbmUoKSB8fCAobmV3Q2hpbGQt
PmlzSW5saW5lKCkgJiYgYmVmb3JlQ2hpbGQtPnBhcmVudCgpLT5maXJzdENoaWxkKCkgIT0gYmVm
b3JlQ2hpbGQpKQorICAgICAgICAgICAgICAgIGJlZm9yZUNoaWxkLT5wYXJlbnQoKS0+YWRkQ2hp
bGQobmV3Q2hpbGQsIGJlZm9yZUNoaWxkKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAg
ICAgICBhZGRDaGlsZChuZXdDaGlsZCwgYmVmb3JlQ2hpbGQtPnBhcmVudCgpKTsKKyAgICAgICAg
fSBlbHNlIGlmIChiZWZvcmVDaGlsZC0+cGFyZW50KCktPmlzQW5vbnltb3VzQmxvY2soKSkgewor
ICAgICAgICAgICAgQVNTRVJUKCFiZWZvcmVDaGlsZC0+cGFyZW50KCktPnBhcmVudCgpIHx8IGJl
Zm9yZUNoaWxkLT5wYXJlbnQoKS0+cGFyZW50KCktPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSk7
CisgICAgICAgICAgICBBU1NFUlQoYmVmb3JlQ2hpbGQtPmlzSW5saW5lKCkpOworICAgICAgICAg
ICAgaWYgKG5ld0NoaWxkLT5pc0lubGluZSgpIHx8ICghbmV3Q2hpbGQtPmlzSW5saW5lKCkgJiYg
YmVmb3JlQ2hpbGQtPnBhcmVudCgpLT5maXJzdENoaWxkKCkgIT0gYmVmb3JlQ2hpbGQpKQorICAg
ICAgICAgICAgICAgIGJlZm9yZUNoaWxkLT5wYXJlbnQoKS0+YWRkQ2hpbGQobmV3Q2hpbGQsIGJl
Zm9yZUNoaWxkKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBhZGRDaGlsZChu
ZXdDaGlsZCwgYmVmb3JlQ2hpbGQtPnBhcmVudCgpKTsKKyAgICAgICAgfQogICAgICAgICByZXR1
cm47CiAgICAgfQogCisgICAgaWYgKCFuZXdDaGlsZC0+aXNJbmxpbmUoKSkgeworICAgICAgICAv
LyBXZSBhcmUgcGxhY2luZyBhIGJsb2NrIGluc2lkZSBhbiBpbmxpbmUuIFdlIGhhdmUgdG8gcGxh
Y2UgdGhlIGJsb2NrIGluc2lkZSBhbiBhbm9ueW1vdXMgaW5saW5lLWJsb2NrLgorICAgICAgICAv
LyBUaGlzIGlubGluZS1ibG9jayBjYW4gaG91c2UgYSBzZXF1ZW5jZSBvZiBjb250aWd1b3VzIGJs
b2NrLWxldmVsIGNoaWxkcmVuLCBhbmQgdGhleSB3aWxsIGFsbCBzaXQgb24gdGhlCisgICAgICAg
IC8vIHNhbWUgbGluZSB0b2dldGhlci4gIFdlIHRyeSB0byByZXVzZSBvbmUgZmlyc3QgaWYgcG9z
c2libGUuCisgICAgICAgIGlmIChiZWZvcmVDaGlsZCkgeworICAgICAgICAgICAgaWYgKGJlZm9y
ZUNoaWxkLT5wcmV2aW91c1NpYmxpbmcoKSAmJiBiZWZvcmVDaGlsZC0+cHJldmlvdXNTaWJsaW5n
KCktPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkgeworICAgICAgICAgICAgICAgIGJlZm9yZUNo
aWxkLT5wcmV2aW91c1NpYmxpbmcoKS0+YWRkQ2hpbGQobmV3Q2hpbGQpOworICAgICAgICAgICAg
ICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg
IGlmIChsYXN0Q2hpbGQoKSAmJiBsYXN0Q2hpbGQoKS0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygp
KSB7CisgICAgICAgICAgICAgICAgbGFzdENoaWxkKCktPmFkZENoaWxkKG5ld0NoaWxkKTsKKyAg
ICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAKKyAgICAg
ICAgaWYgKCFuZXdDaGlsZC0+aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpKSB7CisgICAgICAgICAg
ICAvLyBUaGVyZSB3YXMgbm8gc3VpdGFibGUgZXhpc3RpbmcgYW5vbnltb3VzIGJveC4gIENyZWF0
ZSBhIG5ldyBvbmUuCisgICAgICAgICAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IG5ld1N0eWxlID0g
UmVuZGVyU3R5bGU6OmNyZWF0ZSgpOworICAgICAgICAgICAgbmV3U3R5bGUtPmluaGVyaXRGcm9t
KHN0eWxlKCkpOworICAgICAgICAgICAgbmV3U3R5bGUtPnNldERpc3BsYXkoSU5MSU5FX0JMT0NL
KTsKKyAgICAgICAgICAgIFJlbmRlckJsb2NrKiBuZXdCb3ggPSBuZXcgKHJlbmRlckFyZW5hKCkp
IFJlbmRlckJsb2NrKGRvY3VtZW50KCkpOworICAgICAgICAgICAgbmV3Qm94LT5zZXRTdHlsZShu
ZXdTdHlsZSk7CisgICAgICAgICAgICBSZW5kZXJCb3hNb2RlbE9iamVjdDo6YWRkQ2hpbGQobmV3
Qm94LCBiZWZvcmVDaGlsZCk7CisgICAgICAgICAgICBuZXdCb3gtPmFkZENoaWxkKG5ld0NoaWxk
KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKwogICAgIFJlbmRlckJv
eE1vZGVsT2JqZWN0OjphZGRDaGlsZChuZXdDaGlsZCwgYmVmb3JlQ2hpbGQpOwogCiAgICAgbmV3
Q2hpbGQtPnNldE5lZWRzTGF5b3V0QW5kUHJlZldpZHRoc1JlY2FsYygpOwpAQCAtMjIxLDIyNCAr
MTg2LDU5IEBAIFJlbmRlcklubGluZSogUmVuZGVySW5saW5lOjpjbG9uZUlubGluZSgKICAgICBy
ZXR1cm4gbzsKIH0KIAotdm9pZCBSZW5kZXJJbmxpbmU6OnNwbGl0SW5saW5lcyhSZW5kZXJCbG9j
ayogZnJvbUJsb2NrLCBSZW5kZXJCbG9jayogdG9CbG9jaywKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgUmVuZGVyQmxvY2sqIG1pZGRsZUJsb2NrLAotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkLCBSZW5kZXJCb3hNb2RlbE9i
amVjdCogb2xkQ29udCkKLXsKLSAgICAvLyBDcmVhdGUgYSBjbG9uZSBvZiB0aGlzIGlubGluZS4K
LSAgICBSZW5kZXJJbmxpbmUqIGNsb25lID0gY2xvbmVJbmxpbmUodGhpcyk7Ci0gICAgY2xvbmUt
PnNldENvbnRpbnVhdGlvbihvbGRDb250KTsKLQotICAgIC8vIE5vdyB0YWtlIGFsbCBvZiB0aGUg
Y2hpbGRyZW4gZnJvbSBiZWZvcmVDaGlsZCB0byB0aGUgZW5kIGFuZCByZW1vdmUKLSAgICAvLyB0
aGVtIGZyb20gfHRoaXN8IGFuZCBwbGFjZSB0aGVtIGluIHRoZSBjbG9uZS4KLSAgICBSZW5kZXJP
YmplY3QqIG8gPSBiZWZvcmVDaGlsZDsKLSAgICB3aGlsZSAobykgewotICAgICAgICBSZW5kZXJP
YmplY3QqIHRtcCA9IG87Ci0gICAgICAgIG8gPSB0bXAtPm5leHRTaWJsaW5nKCk7Ci0gICAgICAg
IGNsb25lLT5hZGRDaGlsZElnbm9yaW5nQ29udGludWF0aW9uKGNoaWxkcmVuKCktPnJlbW92ZUNo
aWxkTm9kZSh0aGlzLCB0bXApLCAwKTsKLSAgICAgICAgdG1wLT5zZXROZWVkc0xheW91dEFuZFBy
ZWZXaWR0aHNSZWNhbGMoKTsKLSAgICB9Ci0KLSAgICAvLyBIb29rIHxjbG9uZXwgdXAgYXMgdGhl
IGNvbnRpbnVhdGlvbiBvZiB0aGUgbWlkZGxlIGJsb2NrLgotICAgIG1pZGRsZUJsb2NrLT5zZXRJ
bmxpbmVDb250aW51YXRpb24oY2xvbmUpOwotCi0gICAgLy8gV2UgaGF2ZSBiZWVuIHJlcGFyZW50
ZWQgYW5kIGFyZSBub3cgdW5kZXIgdGhlIGZyb21CbG9jay4gIFdlIG5lZWQKLSAgICAvLyB0byB3
YWxrIHVwIG91ciBpbmxpbmUgcGFyZW50IGNoYWluIHVudGlsIHdlIGhpdCB0aGUgY29udGFpbmlu
ZyBibG9jay4KLSAgICAvLyBPbmNlIHdlIGhpdCB0aGUgY29udGFpbmluZyBibG9jayB3ZSdyZSBk
b25lLgotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBjdXJyID0gdG9SZW5kZXJCb3hNb2RlbE9i
amVjdChwYXJlbnQoKSk7Ci0gICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGN1cnJDaGlsZCA9IHRo
aXM7Ci0gICAgCi0gICAgLy8gRklYTUU6IEJlY2F1c2Ugc3BsaXR0aW5nIGlzIE8obl4yKSBhcyB0
YWdzIG5lc3QgcGF0aG9sb2dpY2FsbHksIHdlIGNhcCB0aGUgZGVwdGggYXQgd2hpY2ggd2UncmUg
d2lsbGluZyB0byBjbG9uZS4KLSAgICAvLyBUaGVyZSB3aWxsIGV2ZW50dWFsbHkgYmUgYSBiZXR0
ZXIgYXBwcm9hY2ggdG8gdGhpcyBwcm9ibGVtIHRoYXQgd2lsbCBsZXQgdXMgbmVzdCB0byBhIG11
Y2gKLSAgICAvLyBncmVhdGVyIGRlcHRoIChzZWUgYnVnemlsbGEgYnVnIDEzNDMwKSBidXQgZm9y
IG5vdyB3ZSBoYXZlIGEgbGltaXQuICBUaGlzICp3aWxsKiByZXN1bHQgaW4KLSAgICAvLyBpbmNv
cnJlY3QgcmVuZGVyaW5nLCBidXQgdGhlIGFsdGVybmF0aXZlIGlzIHRvIGhhbmcgZm9yZXZlci4K
LSAgICB1bnNpZ25lZCBzcGxpdERlcHRoID0gMTsKLSAgICBjb25zdCB1bnNpZ25lZCBjTWF4U3Bs
aXREZXB0aCA9IDIwMDsgCi0gICAgd2hpbGUgKGN1cnIgJiYgY3VyciAhPSBmcm9tQmxvY2spIHsK
LSAgICAgICAgQVNTRVJUKGN1cnItPmlzUmVuZGVySW5saW5lKCkpOwotICAgICAgICBpZiAoc3Bs
aXREZXB0aCA8IGNNYXhTcGxpdERlcHRoKSB7Ci0gICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcg
Y2xvbmUuCi0gICAgICAgICAgICBSZW5kZXJJbmxpbmUqIGNsb25lQ2hpbGQgPSBjbG9uZTsKLSAg
ICAgICAgICAgIGNsb25lID0gY2xvbmVJbmxpbmUodG9SZW5kZXJJbmxpbmUoY3VycikpOwotCi0g
ICAgICAgICAgICAvLyBJbnNlcnQgb3VyIGNoaWxkIGNsb25lIGFzIHRoZSBmaXJzdCBjaGlsZC4K
LSAgICAgICAgICAgIGNsb25lLT5hZGRDaGlsZElnbm9yaW5nQ29udGludWF0aW9uKGNsb25lQ2hp
bGQsIDApOwotCi0gICAgICAgICAgICAvLyBIb29rIHRoZSBjbG9uZSB1cCBhcyBhIGNvbnRpbnVh
dGlvbiBvZiB8Y3VycnwuCi0gICAgICAgICAgICBSZW5kZXJJbmxpbmUqIGlubGluZUN1cnIgPSB0
b1JlbmRlcklubGluZShjdXJyKTsKLSAgICAgICAgICAgIG9sZENvbnQgPSBpbmxpbmVDdXJyLT5j
b250aW51YXRpb24oKTsKLSAgICAgICAgICAgIGlubGluZUN1cnItPnNldENvbnRpbnVhdGlvbihj
bG9uZSk7Ci0gICAgICAgICAgICBjbG9uZS0+c2V0Q29udGludWF0aW9uKG9sZENvbnQpOwotCi0g
ICAgICAgICAgICAvLyBTb21lb25lIG1heSBoYXZlIGluZGlyZWN0bHkgY2F1c2VkIGEgPHE+IHRv
IHNwbGl0LiAgV2hlbiB0aGlzIGhhcHBlbnMsIHRoZSA6YWZ0ZXIgY29udGVudAotICAgICAgICAg
ICAgLy8gaGFzIHRvIG1vdmUgaW50byB0aGUgaW5saW5lIGNvbnRpbnVhdGlvbi4gIENhbGwgdXBk
YXRlQmVmb3JlQWZ0ZXJDb250ZW50IHRvIGVuc3VyZSB0aGF0IHRoZSBpbmxpbmUncyA6YWZ0ZXIK
LSAgICAgICAgICAgIC8vIGNvbnRlbnQgZ2V0cyBwcm9wZXJseSBkZXN0cm95ZWQuCi0gICAgICAg
ICAgICBpZiAoZG9jdW1lbnQoKS0+dXNlc0JlZm9yZUFmdGVyUnVsZXMoKSkKLSAgICAgICAgICAg
ICAgICBpbmxpbmVDdXJyLT5jaGlsZHJlbigpLT51cGRhdGVCZWZvcmVBZnRlckNvbnRlbnQodGhp
cywgQUZURVIpOwotCi0gICAgICAgICAgICAvLyBOb3cgd2UgbmVlZCB0byB0YWtlIGFsbCBvZiB0
aGUgY2hpbGRyZW4gc3RhcnRpbmcgZnJvbSB0aGUgZmlyc3QgY2hpbGQKLSAgICAgICAgICAgIC8v
ICphZnRlciogY3VyckNoaWxkIGFuZCBhcHBlbmQgdGhlbSBhbGwgdG8gdGhlIGNsb25lLgotICAg
ICAgICAgICAgbyA9IGN1cnJDaGlsZC0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgICAgIHdoaWxl
IChvKSB7Ci0gICAgICAgICAgICAgICAgUmVuZGVyT2JqZWN0KiB0bXAgPSBvOwotICAgICAgICAg
ICAgICAgIG8gPSB0bXAtPm5leHRTaWJsaW5nKCk7Ci0gICAgICAgICAgICAgICAgY2xvbmUtPmFk
ZENoaWxkSWdub3JpbmdDb250aW51YXRpb24oaW5saW5lQ3Vyci0+Y2hpbGRyZW4oKS0+cmVtb3Zl
Q2hpbGROb2RlKGN1cnIsIHRtcCksIDApOwotICAgICAgICAgICAgICAgIHRtcC0+c2V0TmVlZHNM
YXlvdXRBbmRQcmVmV2lkdGhzUmVjYWxjKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAg
ICAgICAgCi0gICAgICAgIC8vIEtlZXAgd2Fsa2luZyB1cCB0aGUgY2hhaW4uCi0gICAgICAgIGN1
cnJDaGlsZCA9IGN1cnI7Ci0gICAgICAgIGN1cnIgPSB0b1JlbmRlckJveE1vZGVsT2JqZWN0KGN1
cnItPnBhcmVudCgpKTsKLSAgICAgICAgc3BsaXREZXB0aCsrOwotICAgIH0KLQotICAgIC8vIE5v
dyB3ZSBhcmUgYXQgdGhlIGJsb2NrIGxldmVsLiBXZSBuZWVkIHRvIHB1dCB0aGUgY2xvbmUgaW50
byB0aGUgdG9CbG9jay4KLSAgICB0b0Jsb2NrLT5jaGlsZHJlbigpLT5hcHBlbmRDaGlsZE5vZGUo
dG9CbG9jaywgY2xvbmUpOwotCi0gICAgLy8gTm93IHRha2UgYWxsIHRoZSBjaGlsZHJlbiBhZnRl
ciBjdXJyQ2hpbGQgYW5kIHJlbW92ZSB0aGVtIGZyb20gdGhlIGZyb21CbG9jawotICAgIC8vIGFu
ZCBwdXQgdGhlbSBpbiB0aGUgdG9CbG9jay4KLSAgICBvID0gY3VyckNoaWxkLT5uZXh0U2libGlu
ZygpOwotICAgIHdoaWxlIChvKSB7Ci0gICAgICAgIFJlbmRlck9iamVjdCogdG1wID0gbzsKLSAg
ICAgICAgbyA9IHRtcC0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgdG9CbG9jay0+Y2hpbGRyZW4o
KS0+YXBwZW5kQ2hpbGROb2RlKHRvQmxvY2ssIGZyb21CbG9jay0+Y2hpbGRyZW4oKS0+cmVtb3Zl
Q2hpbGROb2RlKGZyb21CbG9jaywgdG1wKSk7Ci0gICAgfQotfQotCi12b2lkIFJlbmRlcklubGlu
ZTo6c3BsaXRGbG93KFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQsIFJlbmRlckJsb2NrKiBuZXdC
bG9ja0JveCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVuZGVyT2JqZWN0KiBuZXdD
aGlsZCwgUmVuZGVyQm94TW9kZWxPYmplY3QqIG9sZENvbnQpCi17Ci0gICAgUmVuZGVyQmxvY2sq
IHByZSA9IDA7Ci0gICAgUmVuZGVyQmxvY2sqIGJsb2NrID0gY29udGFpbmluZ0Jsb2NrKCk7Ci0g
ICAgCi0gICAgLy8gRGVsZXRlIG91ciBsaW5lIGJveGVzIGJlZm9yZSB3ZSBkbyB0aGUgaW5saW5l
IHNwbGl0IGludG8gY29udGludWF0aW9ucy4KLSAgICBibG9jay0+ZGVsZXRlTGluZUJveFRyZWUo
KTsKLSAgICAKLSAgICBib29sIG1hZGVOZXdCZWZvcmVCbG9jayA9IGZhbHNlOwotICAgIGlmIChi
bG9jay0+aXNBbm9ueW1vdXNCbG9jaygpICYmICghYmxvY2stPnBhcmVudCgpIHx8ICFibG9jay0+
cGFyZW50KCktPmNyZWF0ZXNBbm9ueW1vdXNXcmFwcGVyKCkpKSB7Ci0gICAgICAgIC8vIFdlIGNh
biByZXVzZSB0aGlzIGJsb2NrIGFuZCBtYWtlIGl0IHRoZSBwcmVCbG9jayBvZiB0aGUgbmV4dCBj
b250aW51YXRpb24uCi0gICAgICAgIHByZSA9IGJsb2NrOwotICAgICAgICBwcmUtPnJlbW92ZVBv
c2l0aW9uZWRPYmplY3RzKDApOwotICAgICAgICBibG9jayA9IGJsb2NrLT5jb250YWluaW5nQmxv
Y2soKTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBObyBhbm9ueW1vdXMgYmxvY2sgYXZhaWxh
YmxlIGZvciB1c2UuICBNYWtlIG9uZS4KLSAgICAgICAgcHJlID0gYmxvY2stPmNyZWF0ZUFub255
bW91c0Jsb2NrKCk7Ci0gICAgICAgIG1hZGVOZXdCZWZvcmVCbG9jayA9IHRydWU7Ci0gICAgfQot
Ci0gICAgUmVuZGVyQmxvY2sqIHBvc3QgPSBibG9jay0+Y3JlYXRlQW5vbnltb3VzQmxvY2soKTsK
LQotICAgIFJlbmRlck9iamVjdCogYm94Rmlyc3QgPSBtYWRlTmV3QmVmb3JlQmxvY2sgPyBibG9j
ay0+Zmlyc3RDaGlsZCgpIDogcHJlLT5uZXh0U2libGluZygpOwotICAgIGlmIChtYWRlTmV3QmVm
b3JlQmxvY2spCi0gICAgICAgIGJsb2NrLT5jaGlsZHJlbigpLT5pbnNlcnRDaGlsZE5vZGUoYmxv
Y2ssIHByZSwgYm94Rmlyc3QpOwotICAgIGJsb2NrLT5jaGlsZHJlbigpLT5pbnNlcnRDaGlsZE5v
ZGUoYmxvY2ssIG5ld0Jsb2NrQm94LCBib3hGaXJzdCk7Ci0gICAgYmxvY2stPmNoaWxkcmVuKCkt
Pmluc2VydENoaWxkTm9kZShibG9jaywgcG9zdCwgYm94Rmlyc3QpOwotICAgIGJsb2NrLT5zZXRD
aGlsZHJlbklubGluZShmYWxzZSk7Ci0gICAgCi0gICAgaWYgKG1hZGVOZXdCZWZvcmVCbG9jaykg
ewotICAgICAgICBSZW5kZXJPYmplY3QqIG8gPSBib3hGaXJzdDsKLSAgICAgICAgd2hpbGUgKG8p
IHsKLSAgICAgICAgICAgIFJlbmRlck9iamVjdCogbm8gPSBvOwotICAgICAgICAgICAgbyA9IG5v
LT5uZXh0U2libGluZygpOwotICAgICAgICAgICAgcHJlLT5jaGlsZHJlbigpLT5hcHBlbmRDaGls
ZE5vZGUocHJlLCBibG9jay0+Y2hpbGRyZW4oKS0+cmVtb3ZlQ2hpbGROb2RlKGJsb2NrLCBubykp
OwotICAgICAgICAgICAgbm8tPnNldE5lZWRzTGF5b3V0QW5kUHJlZldpZHRoc1JlY2FsYygpOwot
ICAgICAgICB9Ci0gICAgfQotCi0gICAgc3BsaXRJbmxpbmVzKHByZSwgcG9zdCwgbmV3QmxvY2tC
b3gsIGJlZm9yZUNoaWxkLCBvbGRDb250KTsKLQotICAgIC8vIFdlIGFscmVhZHkga25vdyB0aGUg
bmV3QmxvY2tCb3ggaXNuJ3QgZ29pbmcgdG8gY29udGFpbiBpbmxpbmUga2lkcywgc28gYXZvaWQg
d2FzdGluZwotICAgIC8vIHRpbWUgaW4gbWFrZUNoaWxkcmVuTm9uSW5saW5lIGJ5IGp1c3Qgc2V0
dGluZyB0aGlzIGV4cGxpY2l0bHkgdXAgZnJvbnQuCi0gICAgbmV3QmxvY2tCb3gtPnNldENoaWxk
cmVuSW5saW5lKGZhbHNlKTsKLQotICAgIC8vIFdlIGRlbGF5ZWQgYWRkaW5nIHRoZSBuZXdDaGls
ZCB1bnRpbCBub3cgc28gdGhhdCB0aGUgfG5ld0Jsb2NrQm94fCB3b3VsZCBiZSBmdWxseQotICAg
IC8vIGNvbm5lY3RlZCwgdGh1cyBhbGxvd2luZyBuZXdDaGlsZCBhY2Nlc3MgdG8gYSByZW5kZXJB
cmVuYSBzaG91bGQgaXQgbmVlZAotICAgIC8vIHRvIHdyYXAgaXRzZWxmIGluIGFkZGl0aW9uYWwg
Ym94ZXMgKGUuZy4sIHRhYmxlIGNvbnN0cnVjdGlvbikuCi0gICAgbmV3QmxvY2tCb3gtPmFkZENo
aWxkKG5ld0NoaWxkKTsKLQotICAgIC8vIEFsd2F5cyBqdXN0IGRvIGEgZnVsbCBsYXlvdXQgaW4g
b3JkZXIgdG8gZW5zdXJlIHRoYXQgbGluZSBib3hlcyAoZXNwZWNpYWxseSB3cmFwcGVycyBmb3Ig
aW1hZ2VzKQotICAgIC8vIGdldCBkZWxldGVkIHByb3Blcmx5LiAgQmVjYXVzZSBvYmplY3RzIG1v
dmVzIGZyb20gdGhlIHByZSBibG9jayBpbnRvIHRoZSBwb3N0IGJsb2NrLCB3ZSB3YW50IHRvCi0g
ICAgLy8gbWFrZSBuZXcgbGluZSBib3hlcyBpbnN0ZWFkIG9mIGxlYXZpbmcgdGhlIG9sZCBsaW5l
IGJveGVzIGFyb3VuZC4KLSAgICBwcmUtPnNldE5lZWRzTGF5b3V0QW5kUHJlZldpZHRoc1JlY2Fs
YygpOwotICAgIGJsb2NrLT5zZXROZWVkc0xheW91dEFuZFByZWZXaWR0aHNSZWNhbGMoKTsKLSAg
ICBwb3N0LT5zZXROZWVkc0xheW91dEFuZFByZWZXaWR0aHNSZWNhbGMoKTsKLX0KLQotdm9pZCBS
ZW5kZXJJbmxpbmU6OmFkZENoaWxkVG9Db250aW51YXRpb24oUmVuZGVyT2JqZWN0KiBuZXdDaGls
ZCwgUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCkKLXsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVj
dCogZmxvdyA9IGNvbnRpbnVhdGlvbkJlZm9yZShiZWZvcmVDaGlsZCk7Ci0gICAgQVNTRVJUKCFi
ZWZvcmVDaGlsZCB8fCBiZWZvcmVDaGlsZC0+cGFyZW50KCktPmlzUmVuZGVyQmxvY2soKSB8fCBi
ZWZvcmVDaGlsZC0+cGFyZW50KCktPmlzUmVuZGVySW5saW5lKCkpOwotICAgIFJlbmRlckJveE1v
ZGVsT2JqZWN0KiBiZWZvcmVDaGlsZFBhcmVudCA9IDA7Ci0gICAgaWYgKGJlZm9yZUNoaWxkKQot
ICAgICAgICBiZWZvcmVDaGlsZFBhcmVudCA9IHRvUmVuZGVyQm94TW9kZWxPYmplY3QoYmVmb3Jl
Q2hpbGQtPnBhcmVudCgpKTsKLSAgICBlbHNlIHsKLSAgICAgICAgUmVuZGVyQm94TW9kZWxPYmpl
Y3QqIGNvbnQgPSBuZXh0Q29udGludWF0aW9uKGZsb3cpOwotICAgICAgICBpZiAoY29udCkKLSAg
ICAgICAgICAgIGJlZm9yZUNoaWxkUGFyZW50ID0gY29udDsKLSAgICAgICAgZWxzZQotICAgICAg
ICAgICAgYmVmb3JlQ2hpbGRQYXJlbnQgPSBmbG93OwotICAgIH0KLQotICAgIGlmIChuZXdDaGls
ZC0+aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpKQotICAgICAgICByZXR1cm4gYmVmb3JlQ2hpbGRQ
YXJlbnQtPmFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24obmV3Q2hpbGQsIGJlZm9yZUNoaWxk
KTsKLQotICAgIC8vIEEgY29udGludWF0aW9uIGFsd2F5cyBjb25zaXN0cyBvZiB0d28gcG90ZW50
aWFsIGNhbmRpZGF0ZXM6IGFuIGlubGluZSBvciBhbiBhbm9ueW1vdXMKLSAgICAvLyBibG9jayBi
b3ggaG9sZGluZyBibG9jayBjaGlsZHJlbi4KLSAgICBib29sIGNoaWxkSW5saW5lID0gbmV3Q2hp
bGQtPmlzSW5saW5lKCk7Ci0gICAgYm9vbCBiY3BJbmxpbmUgPSBiZWZvcmVDaGlsZFBhcmVudC0+
aXNJbmxpbmUoKTsKLSAgICBib29sIGZsb3dJbmxpbmUgPSBmbG93LT5pc0lubGluZSgpOwotCi0g
ICAgaWYgKGZsb3cgPT0gYmVmb3JlQ2hpbGRQYXJlbnQpCi0gICAgICAgIHJldHVybiBmbG93LT5h
ZGRDaGlsZElnbm9yaW5nQ29udGludWF0aW9uKG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7Ci0gICAg
ZWxzZSB7Ci0gICAgICAgIC8vIFRoZSBnb2FsIGhlcmUgaXMgdG8gbWF0Y2ggdXAgaWYgd2UgY2Fu
LCBzbyB0aGF0IHdlIGNhbiBjb2FsZXNjZSBhbmQgY3JlYXRlIHRoZQotICAgICAgICAvLyBtaW5p
bWFsICMgb2YgY29udGludWF0aW9ucyBuZWVkZWQgZm9yIHRoZSBpbmxpbmUuCi0gICAgICAgIGlm
IChjaGlsZElubGluZSA9PSBiY3BJbmxpbmUpCi0gICAgICAgICAgICByZXR1cm4gYmVmb3JlQ2hp
bGRQYXJlbnQtPmFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24obmV3Q2hpbGQsIGJlZm9yZUNo
aWxkKTsKLSAgICAgICAgZWxzZSBpZiAoZmxvd0lubGluZSA9PSBjaGlsZElubGluZSkKLSAgICAg
ICAgICAgIHJldHVybiBmbG93LT5hZGRDaGlsZElnbm9yaW5nQ29udGludWF0aW9uKG5ld0NoaWxk
LCAwKTsgLy8gSnVzdCB0cmVhdCBsaWtlIGFuIGFwcGVuZC4KLSAgICAgICAgZWxzZQotICAgICAg
ICAgICAgcmV0dXJuIGJlZm9yZUNoaWxkUGFyZW50LT5hZGRDaGlsZElnbm9yaW5nQ29udGludWF0
aW9uKG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7Ci0gICAgfQotfQotCiB2b2lkIFJlbmRlcklubGlu
ZTo6cGFpbnQoUGFpbnRJbmZvJiBwYWludEluZm8sIGludCB0eCwgaW50IHR5KQogewogICAgIG1f
bGluZUJveGVzLnBhaW50KHRoaXMsIHBhaW50SW5mbywgdHgsIHR5KTsKIH0KKyAKK3ZvaWQgUmVu
ZGVySW5saW5lOjpjdWxsZWRMaW5lQm94UmVjdHMoVmVjdG9yPEludFJlY3Q+JiByZWN0cywgYm9v
bCBpbmNsdWRlT3ZlcmZsb3cpIGNvbnN0Cit7CisgICAgZm9yIChSZW5kZXJPYmplY3QqIGN1cnIg
PSBmaXJzdENoaWxkKCk7IGN1cnI7IGN1cnIgPSBjdXJyLT5uZXh0U2libGluZygpKSB7CisgICAg
ICAgIGlmIChjdXJyLT5pc1JlbmRlcklubGluZSgpKQorICAgICAgICAgICAgdG9SZW5kZXJJbmxp
bmUoY3VyciktPmN1bGxlZExpbmVCb3hSZWN0cyhyZWN0cywgaW5jbHVkZU92ZXJmbG93KTsKKyAg
ICAgICAgZWxzZSBpZiAoY3Vyci0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKQorICAgICAgICAg
ICAgcmVjdHMuYXBwZW5kKGluY2x1ZGVPdmVyZmxvdyA/IHRvUmVuZGVyQmxvY2soY3VyciktPnZp
c2libGVPdmVyZmxvd1JlY3QoKSA6IHRvUmVuZGVyQmxvY2soY3VyciktPmZyYW1lUmVjdCgpKTsK
KyAgICB9Cit9CiAKIHZvaWQgUmVuZGVySW5saW5lOjphYnNvbHV0ZVJlY3RzKFZlY3RvcjxJbnRS
ZWN0PiYgcmVjdHMsIGludCB0eCwgaW50IHR5KQogewotICAgIGlmIChJbmxpbmVSdW5Cb3gqIGN1
cnIgPSBmaXJzdExpbmVCb3goKSkgewotICAgICAgICBmb3IgKDsgY3VycjsgY3VyciA9IGN1cnIt
Pm5leHRMaW5lQm94KCkpCi0gICAgICAgICAgICByZWN0cy5hcHBlbmQoSW50UmVjdCh0eCArIGN1
cnItPngoKSwgdHkgKyBjdXJyLT55KCksIGN1cnItPndpZHRoKCksIGN1cnItPmhlaWdodCgpKSk7
Ci0gICAgfSBlbHNlCisgICAgaWYgKCFmaXJzdExpbmVCb3goKSAmJiAhaGFzQ3VsbGVkTGluZUJv
eGVzKCkpIHsKICAgICAgICAgcmVjdHMuYXBwZW5kKEludFJlY3QodHgsIHR5LCAwLCAwKSk7Ci0K
LSAgICBpZiAoY29udGludWF0aW9uKCkpIHsKLSAgICAgICAgaWYgKGNvbnRpbnVhdGlvbigpLT5p
c0JveCgpKSB7Ci0gICAgICAgICAgICBSZW5kZXJCb3gqIGJveCA9IHRvUmVuZGVyQm94KGNvbnRp
bnVhdGlvbigpKTsKLSAgICAgICAgICAgIGNvbnRpbnVhdGlvbigpLT5hYnNvbHV0ZVJlY3RzKHJl
Y3RzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4IC0gY29u
dGFpbmluZ0Jsb2NrKCktPngoKSArIGJveC0+eCgpLAotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgdHkgLSBjb250YWluaW5nQmxvY2soKS0+eSgpICsgYm94LT55KCkp
OwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIGNvbnRpbnVhdGlvbigpLT5hYnNvbHV0ZVJl
Y3RzKHJlY3RzLCB0eCAtIGNvbnRhaW5pbmdCbG9jaygpLT54KCksIHR5IC0gY29udGFpbmluZ0Js
b2NrKCktPnkoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAgZm9yIChJbmxp
bmVSdW5Cb3gqIGN1cnIgPSBmaXJzdExpbmVCb3goKTsgY3VycjsgY3VyciA9IGN1cnItPm5leHRM
aW5lQm94KCkpCisgICAgICAgIHJlY3RzLmFwcGVuZChJbnRSZWN0KHR4ICsgY3Vyci0+eCgpLCB0
eSArIGN1cnItPnkoKSwgY3Vyci0+d2lkdGgoKSwgY3Vyci0+aGVpZ2h0KCkpKTsKKyAgICAKKyAg
ICBpZiAoaGFzQ3VsbGVkTGluZUJveGVzKCkpIHsKKyAgICAgICAgVmVjdG9yPEludFJlY3Q+IGN1
bGxlZFJlY3RzOworICAgICAgICBjdWxsZWRMaW5lQm94UmVjdHMoY3VsbGVkUmVjdHMpOworICAg
ICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgY3VsbGVkUmVjdHMuc2l6ZSgpOyArK2kpIHsK
KyAgICAgICAgICAgIGN1bGxlZFJlY3RzW2ldLm1vdmUodHgsIHR5KTsKKyAgICAgICAgICAgIHJl
Y3RzLmFwcGVuZChjdWxsZWRSZWN0c1tpXSk7CisgICAgICAgIH0KICAgICB9CiB9CiAKIHZvaWQg
UmVuZGVySW5saW5lOjphYnNvbHV0ZVF1YWRzKFZlY3RvcjxGbG9hdFF1YWQ+JiBxdWFkcykKIHsK
LSAgICBpZiAoSW5saW5lUnVuQm94KiBjdXJyID0gZmlyc3RMaW5lQm94KCkpIHsKLSAgICAgICAg
Zm9yICg7IGN1cnI7IGN1cnIgPSBjdXJyLT5uZXh0TGluZUJveCgpKSB7Ci0gICAgICAgICAgICBG
bG9hdFJlY3QgbG9jYWxSZWN0KGN1cnItPngoKSwgY3Vyci0+eSgpLCBjdXJyLT53aWR0aCgpLCBj
dXJyLT5oZWlnaHQoKSk7Ci0gICAgICAgICAgICBxdWFkcy5hcHBlbmQobG9jYWxUb0Fic29sdXRl
UXVhZChsb2NhbFJlY3QpKTsKLSAgICAgICAgfQotICAgIH0gZWxzZQorICAgIGlmICghZmlyc3RM
aW5lQm94KCkgJiYgIWhhc0N1bGxlZExpbmVCb3hlcygpKSB7CiAgICAgICAgIHF1YWRzLmFwcGVu
ZChsb2NhbFRvQWJzb2x1dGVRdWFkKEZsb2F0UmVjdCgpKSk7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CiAKLSAgICBpZiAoY29udGludWF0aW9uKCkpCi0gICAgICAgIGNvbnRpbnVhdGlvbigpLT5h
YnNvbHV0ZVF1YWRzKHF1YWRzKTsKKyAgICBmb3IgKElubGluZVJ1bkJveCogY3VyciA9IGZpcnN0
TGluZUJveCgpOyBjdXJyOyBjdXJyID0gY3Vyci0+bmV4dExpbmVCb3goKSkgeworICAgICAgICBG
bG9hdFJlY3QgbG9jYWxSZWN0KGN1cnItPngoKSwgY3Vyci0+eSgpLCBjdXJyLT53aWR0aCgpLCBj
dXJyLT5oZWlnaHQoKSk7CisgICAgICAgIHF1YWRzLmFwcGVuZChsb2NhbFRvQWJzb2x1dGVRdWFk
KGxvY2FsUmVjdCkpOworICAgIH0KKyAgICAKKyAgICBpZiAoaGFzQ3VsbGVkTGluZUJveGVzKCkp
IHsKKyAgICAgICAgVmVjdG9yPEludFJlY3Q+IGN1bGxlZFJlY3RzOworICAgICAgICBjdWxsZWRM
aW5lQm94UmVjdHMoY3VsbGVkUmVjdHMpOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp
IDwgY3VsbGVkUmVjdHMuc2l6ZSgpOyArK2kpCisgICAgICAgICAgICBxdWFkcy5hcHBlbmQobG9j
YWxUb0Fic29sdXRlUXVhZChGbG9hdFJlY3QoY3VsbGVkUmVjdHNbaV0pKSk7CisgICAgfQogfQog
CiBpbnQgUmVuZGVySW5saW5lOjpvZmZzZXRMZWZ0KCkgY29uc3QKQEAgLTUwNyw0MyArMzA3LDM3
IEBAIFZpc2libGVQb3NpdGlvbiBSZW5kZXJJbmxpbmU6OnBvc2l0aW9uRm8KICAgICAgICAgLy8g
c2hvdWxkIHRyeSB0byBmaW5kIGEgcmVzdWx0IGJ5IGFza2luZyBvdXIgY29udGFpbmluZyBibG9j
ay4KICAgICAgICAgcmV0dXJuIGNiLT5wb3NpdGlvbkZvclBvaW50KHBvaW50KTsKICAgICB9Cisg
ICAgcmV0dXJuIFJlbmRlckJveE1vZGVsT2JqZWN0Ojpwb3NpdGlvbkZvclBvaW50KHBvaW50KTsK
K30KIAotICAgIC8vIFRyYW5zbGF0ZSB0aGUgY29vcmRzIGZyb20gdGhlIHByZS1hbm9ueW1vdXMg
YmxvY2sgdG8gdGhlIHBvc3QtYW5vbnltb3VzIGJsb2NrLgotICAgIGludCBwYXJlbnRCbG9ja1gg
PSBjYi0+eCgpICsgcG9pbnQueCgpOwotICAgIGludCBwYXJlbnRCbG9ja1kgPSBjYi0+eSgpICsg
cG9pbnQueSgpOwotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBjID0gY29udGludWF0aW9uKCk7
Ci0gICAgd2hpbGUgKGMpIHsKLSAgICAgICAgUmVuZGVyQm94KiBjb250QmxvY2sgPSBjLT5pc0lu
bGluZSgpID8gYy0+Y29udGFpbmluZ0Jsb2NrKCkgOiB0b1JlbmRlckJsb2NrKGMpOwotICAgICAg
ICBpZiAoYy0+aXNJbmxpbmUoKSB8fCBjLT5maXJzdENoaWxkKCkpCi0gICAgICAgICAgICByZXR1
cm4gYy0+cG9zaXRpb25Gb3JDb29yZGluYXRlcyhwYXJlbnRCbG9ja1ggLSBjb250QmxvY2stPngo
KSwgcGFyZW50QmxvY2tZIC0gY29udEJsb2NrLT55KCkpOwotICAgICAgICBjID0gdG9SZW5kZXJC
bG9jayhjKS0+aW5saW5lQ29udGludWF0aW9uKCk7CitzdGF0aWMgaW5saW5lIEludFJlY3QgdW5p
dGVFdmVuSWZFbXB0eShjb25zdCBJbnRSZWN0JiBmaXJzdCwgY29uc3QgSW50UmVjdCYgc2Vjb25k
LCBib29sJiBmaXJzdFZhbGlkKQoreworICAgIGlmICghZmlyc3RWYWxpZCkgeworICAgICAgICBm
aXJzdFZhbGlkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHNlY29uZDsKICAgICB9CiAgICAgCi0g
ICAgcmV0dXJuIFJlbmRlckJveE1vZGVsT2JqZWN0Ojpwb3NpdGlvbkZvclBvaW50KHBvaW50KTsK
KyAgICBpbnQgbCA9IG1pbihmaXJzdC54KCksIHNlY29uZC54KCkpOworICAgIGludCB0ID0gbWlu
KGZpcnN0LnkoKSwgc2Vjb25kLnkoKSk7CisgICAgaW50IHIgPSBtYXgoZmlyc3QucmlnaHQoKSwg
c2Vjb25kLnJpZ2h0KCkpOworICAgIGludCBiID0gbWF4KGZpcnN0LmJvdHRvbSgpLCBzZWNvbmQu
Ym90dG9tKCkpOworCisgICAgcmV0dXJuIEludFJlY3QobCwgdCwgciAtIGwsIGIgLSB0KTsKIH0K
IAogSW50UmVjdCBSZW5kZXJJbmxpbmU6OmxpbmVzQm91bmRpbmdCb3goKSBjb25zdAogewogICAg
IEludFJlY3QgcmVzdWx0OworICAgIGJvb2wgc2V0UmVzdWx0ID0gZmFsc2U7CiAgICAgCi0gICAg
Ly8gU2VlIDxyZGFyOi8vcHJvYmxlbS81Mjg5NzIxPiwgZm9yIGFuIHVua25vd24gcmVhc29uIHRo
ZSBsaW5rZWQgbGlzdCBoZXJlIGlzIHNvbWV0aW1lcyBpbmNvbnNpc3RlbnQsIGZpcnN0IGlzIG5v
bi16ZXJvIGFuZCBsYXN0IGlzIHplcm8uICBXZSBoYXZlIGJlZW4KLSAgICAvLyB1bmFibGUgdG8g
cmVwcm9kdWNlIHRoaXMgYXQgYWxsIChhbmQgY29uc2VxdWVudGx5IHVuYWJsZSB0byBmaWd1cmUg
b3Qgd2h5IHRoaXMgaXMgaGFwcGVuaW5nKS4gIFRoZSBhc3NlcnQgd2lsbCBob3BlZnVsbHkgY2F0
Y2ggdGhlIHByb2JsZW0gaW4gZGVidWcKLSAgICAvLyBidWlsZHMgYW5kIGhlbHAgdXMgc29tZWRh
eSBmaWd1cmUgb3V0IHdoeS4gIFdlIGFsc28gcHV0IGluIGEgcmVkdW5kYW50IGNoZWNrIG9mIGxh
c3RMaW5lQm94KCkgdG8gYXZvaWQgdGhlIGNyYXNoIGZvciBub3cuCi0gICAgQVNTRVJUKCFmaXJz
dExpbmVCb3goKSA9PSAhbGFzdExpbmVCb3goKSk7ICAvLyBFaXRoZXIgYm90aCBhcmUgbnVsbCBv
ciBib3RoIGV4aXN0LgotICAgIGlmIChmaXJzdExpbmVCb3goKSAmJiBsYXN0TGluZUJveCgpKSB7
Ci0gICAgICAgIC8vIFJldHVybiB0aGUgd2lkdGggb2YgdGhlIG1pbmltYWwgbGVmdCBzaWRlIGFu
ZCB0aGUgbWF4aW1hbCByaWdodCBzaWRlLgotICAgICAgICBpbnQgbGVmdFNpZGUgPSAwOwotICAg
ICAgICBpbnQgcmlnaHRTaWRlID0gMDsKLSAgICAgICAgZm9yIChJbmxpbmVSdW5Cb3gqIGN1cnIg
PSBmaXJzdExpbmVCb3goKTsgY3VycjsgY3VyciA9IGN1cnItPm5leHRMaW5lQm94KCkpIHsKLSAg
ICAgICAgICAgIGlmIChjdXJyID09IGZpcnN0TGluZUJveCgpIHx8IGN1cnItPngoKSA8IGxlZnRT
aWRlKQotICAgICAgICAgICAgICAgIGxlZnRTaWRlID0gY3Vyci0+eCgpOwotICAgICAgICAgICAg
aWYgKGN1cnIgPT0gZmlyc3RMaW5lQm94KCkgfHwgY3Vyci0+eCgpICsgY3Vyci0+d2lkdGgoKSA+
IHJpZ2h0U2lkZSkKLSAgICAgICAgICAgICAgICByaWdodFNpZGUgPSBjdXJyLT54KCkgKyBjdXJy
LT53aWR0aCgpOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5zZXRXaWR0aChyaWdodFNpZGUg
LSBsZWZ0U2lkZSk7Ci0gICAgICAgIHJlc3VsdC5zZXRYKGxlZnRTaWRlKTsKLSAgICAgICAgcmVz
dWx0LnNldEhlaWdodChsYXN0TGluZUJveCgpLT55KCkgKyBsYXN0TGluZUJveCgpLT5oZWlnaHQo
KSAtIGZpcnN0TGluZUJveCgpLT55KCkpOwotICAgICAgICByZXN1bHQuc2V0WShmaXJzdExpbmVC
b3goKS0+eSgpKTsKKyAgICBmb3IgKElubGluZUZsb3dCb3gqIGN1cnIgPSBmaXJzdExpbmVCb3go
KTsgY3VycjsgY3VyciA9IGN1cnItPm5leHRGbG93Qm94KCkpCisgICAgICAgIHJlc3VsdCA9IHVu
aXRlRXZlbklmRW1wdHkocmVzdWx0LCBjdXJyLT5mcmFtZVJlY3QoKSwgc2V0UmVzdWx0KTsKKyAg
ICAgICAgCisgICAgaWYgKGhhc0N1bGxlZExpbmVCb3hlcygpKSB7CisgICAgICAgIFZlY3RvcjxJ
bnRSZWN0PiBjdWxsZWRSZWN0czsKKyAgICAgICAgY3VsbGVkTGluZUJveFJlY3RzKGN1bGxlZFJl
Y3RzKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGN1bGxlZFJlY3RzLnNpemUo
KTsgKytpKQorICAgICAgICAgICAgcmVzdWx0ID0gdW5pdGVFdmVuSWZFbXB0eShyZXN1bHQsIGN1
bGxlZFJlY3RzW2ldLCBzZXRSZXN1bHQpOwogICAgIH0KIAogICAgIHJldHVybiByZXN1bHQ7CkBA
IC01NTEsMTkgKzM0NSwyMCBAQCBJbnRSZWN0IFJlbmRlcklubGluZTo6bGluZXNCb3VuZGluZ0Jv
eCgpCiAKIEludFJlY3QgUmVuZGVySW5saW5lOjpsaW5lc1Zpc2libGVPdmVyZmxvd0JvdW5kaW5n
Qm94KCkgY29uc3QKIHsKLSAgICBpZiAoIWZpcnN0TGluZUJveCgpIHx8ICFsYXN0TGluZUJveCgp
KQotICAgICAgICByZXR1cm4gSW50UmVjdCgpOwotCi0gICAgLy8gUmV0dXJuIHRoZSB3aWR0aCBv
ZiB0aGUgbWluaW1hbCBsZWZ0IHNpZGUgYW5kIHRoZSBtYXhpbWFsIHJpZ2h0IHNpZGUuCi0gICAg
aW50IGxlZnRTaWRlID0gbnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCk7Ci0gICAgaW50IHJpZ2h0
U2lkZSA9IG51bWVyaWNfbGltaXRzPGludD46Om1pbigpOwotICAgIGZvciAoSW5saW5lRmxvd0Jv
eCogY3VyciA9IGZpcnN0TGluZUJveCgpOyBjdXJyOyBjdXJyID0gY3Vyci0+bmV4dEZsb3dCb3go
KSkgewotICAgICAgICBsZWZ0U2lkZSA9IG1pbihsZWZ0U2lkZSwgY3Vyci0+bGVmdFZpc2libGVP
dmVyZmxvdygpKTsKLSAgICAgICAgcmlnaHRTaWRlID0gbWF4KHJpZ2h0U2lkZSwgY3Vyci0+cmln
aHRWaXNpYmxlT3ZlcmZsb3coKSk7CisgICAgSW50UmVjdCByZXN1bHQ7CisgICAgYm9vbCBzZXRS
ZXN1bHQgPSBmYWxzZTsKKyAgICAKKyAgICBmb3IgKElubGluZUZsb3dCb3gqIGN1cnIgPSBmaXJz
dExpbmVCb3goKTsgY3VycjsgY3VyciA9IGN1cnItPm5leHRGbG93Qm94KCkpCisgICAgICAgIHJl
c3VsdCA9IHVuaXRlRXZlbklmRW1wdHkocmVzdWx0LCBjdXJyLT52aXNpYmxlT3ZlcmZsb3dSZWN0
KCksIHNldFJlc3VsdCk7CisgICAgICAgIAorICAgIGlmIChoYXNDdWxsZWRMaW5lQm94ZXMoKSkg
eworICAgICAgICBWZWN0b3I8SW50UmVjdD4gY3VsbGVkUmVjdHM7CisgICAgICAgIGN1bGxlZExp
bmVCb3hSZWN0cyhjdWxsZWRSZWN0cyk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBjdWxsZWRSZWN0cy5zaXplKCk7ICsraSkKKyAgICAgICAgICAgIHJlc3VsdCA9IHVuaXRlRXZl
bklmRW1wdHkocmVzdWx0LCBjdWxsZWRSZWN0c1tpXSwgc2V0UmVzdWx0KTsKICAgICB9CiAKLSAg
ICByZXR1cm4gSW50UmVjdChsZWZ0U2lkZSwgZmlyc3RMaW5lQm94KCktPnRvcFZpc2libGVPdmVy
ZmxvdygpLCByaWdodFNpZGUgLSBsZWZ0U2lkZSwKLSAgICAgICAgbGFzdExpbmVCb3goKS0+Ym90
dG9tVmlzaWJsZU92ZXJmbG93KCkgLSBmaXJzdExpbmVCb3goKS0+dG9wVmlzaWJsZU92ZXJmbG93
KCkpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIEludFJlY3QgUmVuZGVySW5saW5lOjpjbGlw
cGVkT3ZlcmZsb3dSZWN0Rm9yUmVwYWludChSZW5kZXJCb3hNb2RlbE9iamVjdCogcmVwYWludENv
bnRhaW5lcikKQEAgLTU3MSw3ICszNjYsNyBAQCBJbnRSZWN0IFJlbmRlcklubGluZTo6Y2xpcHBl
ZE92ZXJmbG93UmVjCiAgICAgLy8gT25seSBydW4taW5zIGFyZSBhbGxvd2VkIGluIGhlcmUgZHVy
aW5nIGxheW91dC4KICAgICBBU1NFUlQoIXZpZXcoKSB8fCAhdmlldygpLT5sYXlvdXRTdGF0ZUVu
YWJsZWQoKSB8fCBpc1J1bkluKCkpOwogCi0gICAgaWYgKCFmaXJzdExpbmVCb3goKSAmJiAhY29u
dGludWF0aW9uKCkpCisgICAgaWYgKCFmaXJzdExpbmVCb3goKSkKICAgICAgICAgcmV0dXJuIElu
dFJlY3QoKTsKIAogICAgIC8vIEZpbmQgb3VyIGxlZnRtb3N0IHBvc2l0aW9uLgpAQCAtNjE5LDEx
ICs0MTQsNiBAQCBJbnRSZWN0IFJlbmRlcklubGluZTo6Y2xpcHBlZE92ZXJmbG93UmVjCiAgICAg
ICAgICAgICAgICAgci51bml0ZShjaGlsZFJlY3QpOwogICAgICAgICAgICAgfQogICAgICAgICB9
Ci0KLSAgICAgICAgaWYgKGNvbnRpbnVhdGlvbigpICYmICFjb250aW51YXRpb24oKS0+aXNJbmxp
bmUoKSkgewotICAgICAgICAgICAgSW50UmVjdCBjb250UmVjdCA9IGNvbnRpbnVhdGlvbigpLT5y
ZWN0V2l0aE91dGxpbmVGb3JSZXBhaW50KHJlcGFpbnRDb250YWluZXIsIG93KTsKLSAgICAgICAg
ICAgIHIudW5pdGUoY29udFJlY3QpOwotICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIHI7
CkBAIC03OTYsNDkgKzU4Niw2IEBAIHZvaWQgUmVuZGVySW5saW5lOjptYXBBYnNvbHV0ZVRvTG9j
YWxQb2kKICAgICAgICAgdHJhbnNmb3JtU3RhdGUubW92ZSgtY29udGFpbmVyT2Zmc2V0LndpZHRo
KCksIC1jb250YWluZXJPZmZzZXQuaGVpZ2h0KCksIHByZXNlcnZlM0QgPyBUcmFuc2Zvcm1TdGF0
ZTo6QWNjdW11bGF0ZVRyYW5zZm9ybSA6IFRyYW5zZm9ybVN0YXRlOjpGbGF0dGVuVHJhbnNmb3Jt
KTsKIH0KIAotdm9pZCBSZW5kZXJJbmxpbmU6OnVwZGF0ZURyYWdTdGF0ZShib29sIGRyYWdPbikK
LXsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdDo6dXBkYXRlRHJhZ1N0YXRlKGRyYWdPbik7Ci0g
ICAgaWYgKGNvbnRpbnVhdGlvbigpKQotICAgICAgICBjb250aW51YXRpb24oKS0+dXBkYXRlRHJh
Z1N0YXRlKGRyYWdPbik7Ci19Ci0KLXZvaWQgUmVuZGVySW5saW5lOjpjaGlsZEJlY2FtZU5vbklu
bGluZShSZW5kZXJPYmplY3QqIGNoaWxkKQotewotICAgIC8vIFdlIGhhdmUgdG8gc3BsaXQgdGhl
IHBhcmVudCBmbG93LgotICAgIFJlbmRlckJsb2NrKiBuZXdCb3ggPSBjb250YWluaW5nQmxvY2so
KS0+Y3JlYXRlQW5vbnltb3VzQmxvY2soKTsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogb2xk
Q29udGludWF0aW9uID0gY29udGludWF0aW9uKCk7Ci0gICAgc2V0Q29udGludWF0aW9uKG5ld0Jv
eCk7Ci0gICAgUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygp
OwotICAgIGNoaWxkcmVuKCktPnJlbW92ZUNoaWxkTm9kZSh0aGlzLCBjaGlsZCk7Ci0gICAgc3Bs
aXRGbG93KGJlZm9yZUNoaWxkLCBuZXdCb3gsIGNoaWxkLCBvbGRDb250aW51YXRpb24pOwotfQot
Ci12b2lkIFJlbmRlcklubGluZTo6dXBkYXRlSGl0VGVzdFJlc3VsdChIaXRUZXN0UmVzdWx0JiBy
ZXN1bHQsIGNvbnN0IEludFBvaW50JiBwb2ludCkKLXsKLSAgICBpZiAocmVzdWx0LmlubmVyTm9k
ZSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBOb2RlKiBuID0gbm9kZSgpOwotICAgIEludFBv
aW50IGxvY2FsUG9pbnQocG9pbnQpOwotICAgIGlmIChuKSB7Ci0gICAgICAgIGlmIChpc0lubGlu
ZUNvbnRpbnVhdGlvbigpKSB7Ci0gICAgICAgICAgICAvLyBXZSdyZSBpbiB0aGUgY29udGludWF0
aW9uIG9mIGEgc3BsaXQgaW5saW5lLiAgQWRqdXN0IG91ciBsb2NhbCBwb2ludCB0byBiZSBpbiB0
aGUgY29vcmRpbmF0ZSBzcGFjZQotICAgICAgICAgICAgLy8gb2YgdGhlIHByaW5jaXBhbCByZW5k
ZXJlcidzIGNvbnRhaW5pbmcgYmxvY2suICBUaGlzIHdpbGwgZW5kIHVwIGJlaW5nIHRoZSBpbm5l
ck5vblNoYXJlZE5vZGUuCi0gICAgICAgICAgICBSZW5kZXJCbG9jayogZmlyc3RCbG9jayA9IG4t
PnJlbmRlcmVyKCktPmNvbnRhaW5pbmdCbG9jaygpOwotICAgICAgICAgICAgCi0gICAgICAgICAg
ICAvLyBHZXQgb3VyIGNvbnRhaW5pbmcgYmxvY2suCi0gICAgICAgICAgICBSZW5kZXJCb3gqIGJs
b2NrID0gY29udGFpbmluZ0Jsb2NrKCk7Ci0gICAgICAgICAgICBsb2NhbFBvaW50Lm1vdmUoYmxv
Y2stPngoKSAtIGZpcnN0QmxvY2stPngoKSwgYmxvY2stPnkoKSAtIGZpcnN0QmxvY2stPnkoKSk7
Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQuc2V0SW5uZXJOb2RlKG4pOwotICAgICAgICBp
ZiAoIXJlc3VsdC5pbm5lck5vblNoYXJlZE5vZGUoKSkKLSAgICAgICAgICAgIHJlc3VsdC5zZXRJ
bm5lck5vblNoYXJlZE5vZGUobik7Ci0gICAgICAgIHJlc3VsdC5zZXRMb2NhbFBvaW50KGxvY2Fs
UG9pbnQpOwotICAgIH0KLX0KLQogdm9pZCBSZW5kZXJJbmxpbmU6OmRpcnR5TGluZUJveGVzKGJv
b2wgZnVsbExheW91dCkKIHsKICAgICBpZiAoZnVsbExheW91dCkKQEAgLTg1Miw5ICs1OTksOSBA
QCBJbmxpbmVGbG93Qm94KiBSZW5kZXJJbmxpbmU6OmNyZWF0ZUlubGluCiAgICAgcmV0dXJuIG5l
dyAocmVuZGVyQXJlbmEoKSkgSW5saW5lRmxvd0JveCh0aGlzKTsKIH0KIAotSW5saW5lRmxvd0Jv
eCogUmVuZGVySW5saW5lOjpjcmVhdGVBbmRBcHBlbmRJbmxpbmVGbG93Qm94KCkKK0lubGluZUZs
b3dCb3gqIFJlbmRlcklubGluZTo6Y3JlYXRlQW5kQXBwZW5kSW5saW5lRmxvd0JveChSZW5kZXJC
bG9jayogYW5vbnltb3VzSW5saW5lQmxvY2spCiB7Ci0gICAgSW5saW5lRmxvd0JveCogZmxvd0Jv
eCA9IGNyZWF0ZUlubGluZUZsb3dCb3goKTsKKyAgICBJbmxpbmVGbG93Qm94KiBmbG93Qm94ID0g
YW5vbnltb3VzSW5saW5lQmxvY2sgPyBuZXcgKHJlbmRlckFyZW5hKCkpIElubGluZUZsb3dBbm9u
eW1vdXNJbmxpbmVCbG9ja0JveCh0aGlzKSA6IGNyZWF0ZUlubGluZUZsb3dCb3goKTsKICAgICBt
X2xpbmVCb3hlcy5hcHBlbmRMaW5lQm94KGZsb3dCb3gpOwogICAgIHJldHVybiBmbG93Qm94Owog
fQpAQCAtOTUxLDIwICs2OTgsOSBAQCB2b2lkIFJlbmRlcklubGluZTo6YWRkRm9jdXNSaW5nUmVj
dHMoVmVjCiAgICAgICAgICAgICAgICAgcG9zID0gY3Vyci0+bG9jYWxUb0Fic29sdXRlKCk7CiAg
ICAgICAgICAgICBlbHNlIGlmIChjdXJyLT5pc0JveCgpKQogICAgICAgICAgICAgICAgIHBvcy5t
b3ZlKHRvUmVuZGVyQm94KGN1cnIpLT54KCksIHRvUmVuZGVyQm94KGN1cnIpLT55KCkpOwotICAg
ICAgICAgICBjdXJyLT5hZGRGb2N1c1JpbmdSZWN0cyhyZWN0cywgcG9zLngoKSwgcG9zLnkoKSk7
CisgICAgICAgICAgICBjdXJyLT5hZGRGb2N1c1JpbmdSZWN0cyhyZWN0cywgcG9zLngoKSwgcG9z
LnkoKSk7CiAgICAgICAgIH0KICAgICB9Ci0KLSAgICBpZiAoY29udGludWF0aW9uKCkpIHsKLSAg
ICAgICAgaWYgKGNvbnRpbnVhdGlvbigpLT5pc0lubGluZSgpKQotICAgICAgICAgICAgY29udGlu
dWF0aW9uKCktPmFkZEZvY3VzUmluZ1JlY3RzKHJlY3RzLCAKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB0eCAtIGNvbnRhaW5pbmdCbG9jaygpLT54KCkgKyBj
b250aW51YXRpb24oKS0+Y29udGFpbmluZ0Jsb2NrKCktPngoKSwKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eSAtIGNvbnRhaW5pbmdCbG9jaygpLT55KCkg
KyBjb250aW51YXRpb24oKS0+Y29udGFpbmluZ0Jsb2NrKCktPnkoKSk7Ci0gICAgICAgIGVsc2UK
LSAgICAgICAgICAgIGNvbnRpbnVhdGlvbigpLT5hZGRGb2N1c1JpbmdSZWN0cyhyZWN0cywgCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHggLSBjb250YWlu
aW5nQmxvY2soKS0+eCgpICsgdG9SZW5kZXJCb3goY29udGludWF0aW9uKCkpLT54KCksCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHkgLSBjb250YWluaW5n
QmxvY2soKS0+eSgpICsgdG9SZW5kZXJCb3goY29udGludWF0aW9uKCkpLT55KCkpOwotICAgIH0K
IH0KIAogdm9pZCBSZW5kZXJJbmxpbmU6OnBhaW50T3V0bGluZShHcmFwaGljc0NvbnRleHQqIGdy
YXBoaWNzQ29udGV4dCwgaW50IHR4LCBpbnQgdHkpCkBAIC05OTYsNyArNzMyLDggQEAgdm9pZCBS
ZW5kZXJJbmxpbmU6OnBhaW50T3V0bGluZShHcmFwaGljcwogICAgICAgICBSb290SW5saW5lQm94
KiByb290ID0gY3Vyci0+cm9vdCgpOwogICAgICAgICBpbnQgdG9wID0gbWF4KHJvb3QtPmxpbmVU
b3AoKSwgY3Vyci0+eSgpKTsKICAgICAgICAgaW50IGJvdHRvbSA9IG1pbihyb290LT5saW5lQm90
dG9tKCksIGN1cnItPnkoKSArIGN1cnItPmhlaWdodCgpKTsKLSAgICAgICAgcmVjdHMuYXBwZW5k
KEludFJlY3QoY3Vyci0+eCgpLCB0b3AsIGN1cnItPndpZHRoKCksIGJvdHRvbSAtIHRvcCkpOwor
ICAgICAgICBpZiAoY3Vyci0+d2lkdGgoKSAmJiB0b3AgLSBib3R0b20pCisgICAgICAgICAgICBy
ZWN0cy5hcHBlbmQoSW50UmVjdChjdXJyLT54KCksIHRvcCwgY3Vyci0+d2lkdGgoKSwgYm90dG9t
IC0gdG9wKSk7CiAgICAgfQogICAgIHJlY3RzLmFwcGVuZChJbnRSZWN0KCkpOwogCkluZGV4OiBX
ZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJJbmxpbmUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3Jl
bmRlcmluZy9SZW5kZXJJbmxpbmUuaAkocmV2aXNpb24gNTQ2NjQpCisrKyBXZWJDb3JlL3JlbmRl
cmluZy9SZW5kZXJJbmxpbmUuaAkod29ya2luZyBjb3B5KQpAQCAtNDksNyArNDksNyBAQCBwdWJs
aWM6CiAgICAgSW50UmVjdCBsaW5lc0JvdW5kaW5nQm94KCkgY29uc3Q7CiAgICAgSW50UmVjdCBs
aW5lc1Zpc2libGVPdmVyZmxvd0JvdW5kaW5nQm94KCkgY29uc3Q7CiAKLSAgICBJbmxpbmVGbG93
Qm94KiBjcmVhdGVBbmRBcHBlbmRJbmxpbmVGbG93Qm94KCk7CisgICAgSW5saW5lRmxvd0JveCog
Y3JlYXRlQW5kQXBwZW5kSW5saW5lRmxvd0JveChSZW5kZXJCbG9jayogYW5vbnltb3VzSW5saW5l
QmxvY2spOwogCiAgICAgdm9pZCBkaXJ0eUxpbmVCb3hlcyhib29sIGZ1bGxMYXlvdXQpOwogCkBA
IC01OCwxMCArNTgsNiBAQCBwdWJsaWM6CiAKICAgICBJbmxpbmVGbG93Qm94KiBmaXJzdExpbmVC
b3goKSBjb25zdCB7IHJldHVybiBtX2xpbmVCb3hlcy5maXJzdExpbmVCb3goKTsgfQogICAgIElu
bGluZUZsb3dCb3gqIGxhc3RMaW5lQm94KCkgY29uc3QgeyByZXR1cm4gbV9saW5lQm94ZXMubGFz
dExpbmVCb3goKTsgfQotCi0gICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGNvbnRpbnVhdGlvbigp
IGNvbnN0IHsgcmV0dXJuIG1fY29udGludWF0aW9uOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgdXBk
YXRlRHJhZ1N0YXRlKGJvb2wgZHJhZ09uKTsKICAgICAKICAgICBJbnRTaXplIHJlbGF0aXZlUG9z
aXRpb25lZElubGluZU9mZnNldChjb25zdCBSZW5kZXJCb3gqIGNoaWxkKSBjb25zdDsKIApAQCAt
ODEsOSArNzcsNiBAQCBwcml2YXRlOgogCiAgICAgdmlydHVhbCBib29sIGlzUmVuZGVySW5saW5l
KCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQogCi0gICAgdm9pZCBhZGRDaGlsZFRvQ29udGludWF0
aW9uKFJlbmRlck9iamVjdCogbmV3Q2hpbGQsIFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQpOwot
ICAgIHZpcnR1YWwgdm9pZCBhZGRDaGlsZElnbm9yaW5nQ29udGludWF0aW9uKFJlbmRlck9iamVj
dCogbmV3Q2hpbGQsIFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQgPSAwKTsKLQogICAgIHZvaWQg
c3BsaXRJbmxpbmVzKFJlbmRlckJsb2NrKiBmcm9tQmxvY2ssIFJlbmRlckJsb2NrKiB0b0Jsb2Nr
LCBSZW5kZXJCbG9jayogbWlkZGxlQmxvY2ssCiAgICAgICAgICAgICAgICAgICAgICAgUmVuZGVy
T2JqZWN0KiBiZWZvcmVDaGlsZCwgUmVuZGVyQm94TW9kZWxPYmplY3QqIG9sZENvbnQpOwogICAg
IHZvaWQgc3BsaXRGbG93KFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQsIFJlbmRlckJsb2NrKiBu
ZXdCbG9ja0JveCwKQEAgLTEyNiwxMyArMTE5LDggQEAgcHJpdmF0ZToKIAogICAgIHZpcnR1YWwg
aW50IGxpbmVIZWlnaHQoYm9vbCBmaXJzdExpbmUsIGJvb2wgaXNSb290TGluZUJveCA9IGZhbHNl
KSBjb25zdDsKIAotICAgIFJlbmRlcklubGluZSogaW5saW5lQ29udGludWF0aW9uKCkgY29uc3Q7
Ci0gICAgdm9pZCBzZXRDb250aW51YXRpb24oUmVuZGVyQm94TW9kZWxPYmplY3QqIGMpIHsgbV9j
b250aW51YXRpb24gPSBjOyB9Ci0gICAgCiAgICAgdmlydHVhbCB2b2lkIGNoaWxkQmVjYW1lTm9u
SW5saW5lKFJlbmRlck9iamVjdCogY2hpbGQpOwogCi0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZUhp
dFRlc3RSZXN1bHQoSGl0VGVzdFJlc3VsdCYsIGNvbnN0IEludFBvaW50Jik7Ci0KICAgICB2aXJ0
dWFsIHZvaWQgaW1hZ2VDaGFuZ2VkKFdyYXBwZWRJbWFnZVB0ciwgY29uc3QgSW50UmVjdCogPSAw
KTsKIAogI2lmIEVOQUJMRShEQVNIQk9BUkRfU1VQUE9SVCkKQEAgLTE0NSwxMyArMTMzLDEyIEBA
IHByaXZhdGU6CiAgICAgc3RhdGljIFJlbmRlcklubGluZSogY2xvbmVJbmxpbmUoUmVuZGVySW5s
aW5lKiBzcmMpOwogCiAgICAgdm9pZCBwYWludE91dGxpbmVGb3JMaW5lKEdyYXBoaWNzQ29udGV4
dCosIGludCB0eCwgaW50IHR5LCBjb25zdCBJbnRSZWN0JiBwcmV2TGluZSwgY29uc3QgSW50UmVj
dCYgdGhpc0xpbmUsIGNvbnN0IEludFJlY3QmIG5leHRMaW5lKTsKLSAgICBSZW5kZXJCb3hNb2Rl
bE9iamVjdCogY29udGludWF0aW9uQmVmb3JlKFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQpOwor
CisgICAgdm9pZCBjdWxsZWRMaW5lQm94UmVjdHMoVmVjdG9yPEludFJlY3Q+JiwgYm9vbCBpbmNs
dWRlT3ZlcmZsb3cgPSBmYWxzZSkgY29uc3Q7CiAKICAgICBSZW5kZXJPYmplY3RDaGlsZExpc3Qg
bV9jaGlsZHJlbjsKICAgICBSZW5kZXJMaW5lQm94TGlzdCBtX2xpbmVCb3hlczsgICAvLyBBbGwg
b2YgdGhlIGxpbmUgYm94ZXMgY3JlYXRlZCBmb3IgdGhpcyBpbmxpbmUgZmxvdy4gIEZvciBleGFt
cGxlLCA8aT5IZWxsbzxicj53b3JsZC48L2k+IHdpbGwgaGF2ZSB0d28gPGk+IGxpbmUgYm94ZXMu
CiAKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogbV9jb250aW51YXRpb247IC8vIENhbiBiZSBl
aXRoZXIgYSBibG9jayBvciBhbiBpbmxpbmUuIDxiPjxpPjxwPkhlbGxvPC9wPjwvaT48L2I+LiBJ
biB0aGlzIGV4YW1wbGUgdGhlIDxpPiB3aWxsIGhhdmUgYSBibG9jayBhcyBpdHMgY29udGludWF0
aW9uIGJ1dCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v
IDxiPiB3aWxsIGp1c3QgaGF2ZSBhbiBpbmxpbmUgYXMgaXRzIGNvbnRpbnVhdGlvbi4KICAgICBt
dXRhYmxlIGludCBtX2xpbmVIZWlnaHQ7CiAgICAgbXV0YWJsZSBpbnQgbV92ZXJ0aWNhbFBvc2l0
aW9uOwogfTsKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckxpbmVCb3hMaXN0LmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMaW5lQm94TGlzdC5jcHAJKHJl
dmlzaW9uIDU0NjY0KQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGluZUJveExpc3QuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0xNDYsMTIgKzE0Niw2IEBAIHZvaWQgUmVuZGVyTGluZUJveExp
c3Q6OmRpcnR5TGluZUJveGVzKCkKIAogdm9pZCBSZW5kZXJMaW5lQm94TGlzdDo6cGFpbnQoUmVu
ZGVyQm94TW9kZWxPYmplY3QqIHJlbmRlcmVyLCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFp
bnRJbmZvLCBpbnQgdHgsIGludCB0eSkgY29uc3QKIHsKLSAgICAvLyBPbmx5IHBhaW50IGR1cmlu
ZyB0aGUgZm9yZWdyb3VuZC9zZWxlY3Rpb24gcGhhc2VzLgotICAgIGlmIChwYWludEluZm8ucGhh
c2UgIT0gUGFpbnRQaGFzZUZvcmVncm91bmQgJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhh
c2VTZWxlY3Rpb24gJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VPdXRsaW5lIAotICAg
ICAgICAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZVNlbGZPdXRsaW5lICYmIHBhaW50
SW5mby5waGFzZSAhPSBQYWludFBoYXNlQ2hpbGRPdXRsaW5lcyAmJiBwYWludEluZm8ucGhhc2Ug
IT0gUGFpbnRQaGFzZVRleHRDbGlwCi0gICAgICAgICYmIHBhaW50SW5mby5waGFzZSAhPSBQYWlu
dFBoYXNlTWFzaykKLSAgICAgICAgcmV0dXJuOwotCiAgICAgQVNTRVJUKHJlbmRlcmVyLT5pc1Jl
bmRlckJsb2NrKCkgfHwgKHJlbmRlcmVyLT5pc1JlbmRlcklubGluZSgpICYmIHJlbmRlcmVyLT5o
YXNMYXllcigpKSk7IC8vIFRoZSBvbmx5IHdheSBhbiBpbmxpbmUgY291bGQgcGFpbnQgbGlrZSB0
aGlzIGlzIGlmIGl0IGhhcyBhIGxheWVyLgogCiAgICAgLy8gSWYgd2UgaGF2ZSBubyBsaW5lcyB0
aGVuIHdlIGhhdmUgbm8gd29yayB0byBkby4KQEAgLTE5NSwxMyArMTg5LDE3IEBAIHZvaWQgUmVu
ZGVyTGluZUJveExpc3Q6OnBhaW50KFJlbmRlckJveE0KICAgICAgICAgICAgIH0KICAgICAgICAg
fQogCi0gICAgICAgIGludCB0b3AgPSBtaW4oY3Vyci0+dG9wVmlzaWJsZU92ZXJmbG93KCksIGN1
cnItPnJvb3QoKS0+c2VsZWN0aW9uVG9wKCkpIC0gcmVuZGVyZXItPm1heGltYWxPdXRsaW5lU2l6
ZShpbmZvLnBoYXNlKTsKKyAgICAgICAgUm9vdElubGluZUJveCogcm9vdEJveCA9IGN1cnItPnJv
b3QoKTsKKyAgICAgICAgaW50IHRvcCA9IG1pbihjdXJyLT50b3BWaXNpYmxlT3ZlcmZsb3coKSwg
cm9vdEJveC0+c2VsZWN0aW9uVG9wKCkpIC0gcmVuZGVyZXItPm1heGltYWxPdXRsaW5lU2l6ZShp
bmZvLnBoYXNlKTsKICAgICAgICAgaW50IGJvdHRvbSA9IGN1cnItPmJvdHRvbVZpc2libGVPdmVy
ZmxvdygpICsgcmVuZGVyZXItPm1heGltYWxPdXRsaW5lU2l6ZShpbmZvLnBoYXNlKTsKICAgICAg
ICAgaCA9IGJvdHRvbSAtIHRvcDsKICAgICAgICAgeVBvcyA9IHR5ICsgdG9wOwogICAgICAgICB2
LT5zZXRNaW5pbXVtQ29sdW1uSGVpZ2h0KGgpOwotICAgICAgICBpZiAoeVBvcyA8IGluZm8ucmVj
dC5ib3R0b20oKSAmJiB5UG9zICsgaCA+IGluZm8ucmVjdC55KCkpCi0gICAgICAgICAgICBjdXJy
LT5wYWludChpbmZvLCB0eCwgdHkpOworICAgICAgICBpZiAoeVBvcyA8IGluZm8ucmVjdC5ib3R0
b20oKSAmJiB5UG9zICsgaCA+IGluZm8ucmVjdC55KCkpIHsKKyAgICAgICAgICAgIExpbmVCb3hQ
YWludEluZm8gbGluZUJveFBhaW50SW5mbzsKKyAgICAgICAgICAgIGxpbmVCb3hQYWludEluZm8u
YW5vbnltb3VzSW5saW5lQmxvY2sgPSByb290Qm94LT5hbm9ueW1vdXNJbmxpbmVCbG9jaygpOwor
ICAgICAgICAgICAgY3Vyci0+cGFpbnQoaW5mbywgdHgsIHR5LCBsaW5lQm94UGFpbnRJbmZvKTsK
KyAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChpbmZvLnBoYXNlID09IFBhaW50UGhhc2VPdXRs
aW5lIHx8IGluZm8ucGhhc2UgPT0gUGFpbnRQaGFzZVNlbGZPdXRsaW5lIHx8IGluZm8ucGhhc2Ug
PT0gUGFpbnRQaGFzZUNoaWxkT3V0bGluZXMpIHsKQEAgLTIxNyw5ICsyMTUsNiBAQCB2b2lkIFJl
bmRlckxpbmVCb3hMaXN0OjpwYWludChSZW5kZXJCb3hNCiAKIGJvb2wgUmVuZGVyTGluZUJveExp
c3Q6OmhpdFRlc3QoUmVuZGVyQm94TW9kZWxPYmplY3QqIHJlbmRlcmVyLCBjb25zdCBIaXRUZXN0
UmVxdWVzdCYgcmVxdWVzdCwgSGl0VGVzdFJlc3VsdCYgcmVzdWx0LCBpbnQgeCwgaW50IHksIGlu
dCB0eCwgaW50IHR5LCBIaXRUZXN0QWN0aW9uIGhpdFRlc3RBY3Rpb24pIGNvbnN0CiB7Ci0gICAg
aWYgKGhpdFRlc3RBY3Rpb24gIT0gSGl0VGVzdEZvcmVncm91bmQpCi0gICAgICAgIHJldHVybiBm
YWxzZTsKLQogICAgIEFTU0VSVChyZW5kZXJlci0+aXNSZW5kZXJCbG9jaygpIHx8IChyZW5kZXJl
ci0+aXNSZW5kZXJJbmxpbmUoKSAmJiByZW5kZXJlci0+aGFzTGF5ZXIoKSkpOyAvLyBUaGUgb25s
eSB3YXkgYW4gaW5saW5lIGNvdWxkIGhpdCB0ZXN0IGxpa2UgdGhpcyBpcyBpZiBpdCBoYXMgYSBs
YXllci4KIAogICAgIC8vIElmIHdlIGhhdmUgbm8gbGluZXMgdGhlbiB3ZSBoYXZlIG5vIHdvcmsg
dG8gZG8uCkBAIC0yMzAsMjIgKzIyNSwzNSBAQCBib29sIFJlbmRlckxpbmVCb3hMaXN0OjpoaXRU
ZXN0KFJlbmRlckJvCiAgICAgLy8gY29udGFpbiB0aGUgcG9pbnQuICBUaGlzIGlzIGEgcXVpY2sg
c2hvcnQtY2lyY3VpdCB0aGF0IHdlIGNhbiB0YWtlIHRvIGF2b2lkIHdhbGtpbmcgYW55IGxpbmVz
LgogICAgIC8vIEZJWE1FOiBUaGlzIGNoZWNrIGlzIGZsYXdlZCBpbiB0aGUgZm9sbG93aW5nIGV4
dHJlbWVseSBvYnNjdXJlIHdheToKICAgICAvLyBpZiBzb21lIGxpbmUgaW4gdGhlIG1pZGRsZSBo
YXMgYSBodWdlIG92ZXJmbG93LCBpdCBtaWdodCBhY3R1YWxseSBleHRlbmQgYmVsb3cgdGhlIGxh
c3QgbGluZS4KLSAgICBpZiAoKHkgPj0gdHkgKyBsYXN0TGluZUJveCgpLT5yb290KCktPmJvdHRv
bVZpc2libGVPdmVyZmxvdygpKSB8fCAoeSA8IHR5ICsgZmlyc3RMaW5lQm94KCktPnJvb3QoKS0+
dG9wVmlzaWJsZU92ZXJmbG93KCkpKQorICAgIFJvb3RJbmxpbmVCb3gqIGZpcnN0Um9vdCA9IGZp
cnN0TGluZUJveCgpLT5yb290KCk7CisgICAgUm9vdElubGluZUJveCogbGFzdFJvb3QgPSBsYXN0
TGluZUJveCgpLT5yb290KCk7CisgICAgaW50IHRvcCA9IGZpcnN0Um9vdC0+dG9wVmlzaWJsZU92
ZXJmbG93KCk7CisgICAgaW50IGJvdHRvbSA9IGxhc3RSb290LT5ib3R0b21WaXNpYmxlT3ZlcmZs
b3coKTsKKyAgICBpZiAobGFzdFJvb3QtPmhhc0Fub255bW91c0lubGluZUJsb2NrKCkpCisgICAg
ICAgIGJvdHRvbSA9IG1heChib3R0b20sIGJvdHRvbSArIGxhc3RSb290LT5hbm9ueW1vdXNJbmxp
bmVCbG9jaygpLT5jb2xsYXBzZWRNYXJnaW5Cb3R0b20oKSk7CisgICAgaWYgKGZpcnN0Um9vdC0+
aGFzQW5vbnltb3VzSW5saW5lQmxvY2soKSkKKyAgICAgICAgdG9wID0gbWluKHRvcCwgdG9wICsg
Zmlyc3RSb290LT5hbm9ueW1vdXNJbmxpbmVCbG9jaygpLT5jb2xsYXBzZWRNYXJnaW5Ub3AoKSk7
CisgICAgaWYgKCh5ID49IHR5ICsgYm90dG9tKSB8fCAoeSA8IHR5ICsgdG9wKSkKICAgICAgICAg
cmV0dXJuIGZhbHNlOwogCiAgICAgLy8gU2VlIGlmIG91ciByb290IGxpbmVzIGNvbnRhaW4gdGhl
IHBvaW50LiAgSWYgc28sIHRoZW4gd2UgaGl0IHRlc3QKICAgICAvLyB0aGVtIGZ1cnRoZXIuICBO
b3RlIHRoYXQgYm94ZXMgY2FuIGVhc2lseSBvdmVybGFwLCBzbyB3ZSBjYW4ndCBtYWtlIGFueSBh
c3N1bXB0aW9ucwogICAgIC8vIGJhc2VkIG9mZiBwb3NpdGlvbnMgb2Ygb3VyIGZpcnN0IGxpbmUg
Ym94IG9yIG91ciBsYXN0IGxpbmUgYm94LgogICAgIGZvciAoSW5saW5lRmxvd0JveCogY3VyciA9
IGxhc3RMaW5lQm94KCk7IGN1cnI7IGN1cnIgPSBjdXJyLT5wcmV2Rmxvd0JveCgpKSB7Ci0gICAg
ICAgIGlmICh5ID49IHR5ICsgY3Vyci0+cm9vdCgpLT50b3BWaXNpYmxlT3ZlcmZsb3coKSAmJiB5
IDwgdHkgKyBjdXJyLT5yb290KCktPmJvdHRvbVZpc2libGVPdmVyZmxvdygpKSB7Ci0gICAgICAg
ICAgICBib29sIGluc2lkZSA9IGN1cnItPm5vZGVBdFBvaW50KHJlcXVlc3QsIHJlc3VsdCwgeCwg
eSwgdHgsIHR5KTsKKyAgICAgICAgUm9vdElubGluZUJveCogY3VyclJvb3QgPSBjdXJyLT5yb290
KCk7CisgICAgICAgIGludCB0b3AgPSBjdXJyUm9vdC0+dG9wVmlzaWJsZU92ZXJmbG93KCk7Cisg
ICAgICAgIGludCBib3R0b20gPSBjdXJyUm9vdC0+Ym90dG9tVmlzaWJsZU92ZXJmbG93KCk7Cisg
ICAgICAgIGlmICh5ID49IHR5ICsgdG9wICYmIHkgPCB0eSArIGJvdHRvbSkgeworICAgICAgICAg
ICAgTGluZUJveEhpdFRlc3RJbmZvIGhpdFRlc3RJbmZvOworICAgICAgICAgICAgaGl0VGVzdElu
Zm8uYW5vbnltb3VzSW5saW5lQmxvY2sgPSBjdXJyUm9vdC0+YW5vbnltb3VzSW5saW5lQmxvY2so
KTsKKyAgICAgICAgICAgIGJvb2wgaW5zaWRlID0gY3Vyci0+bm9kZUF0UG9pbnQocmVxdWVzdCwg
cmVzdWx0LCB4LCB5LCB0eCwgdHksIGhpdFRlc3RBY3Rpb24sIGhpdFRlc3RJbmZvKTsKICAgICAg
ICAgICAgIGlmIChpbnNpZGUpIHsKICAgICAgICAgICAgICAgICByZW5kZXJlci0+dXBkYXRlSGl0
VGVzdFJlc3VsdChyZXN1bHQsIEludFBvaW50KHggLSB0eCwgeSAtIHR5KSk7CiAgICAgICAgICAg
ICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAg
CisKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKQEAgLTI5Nyw2ICszMDUsMTAgQEAgdm9pZCBSZW5k
ZXJMaW5lQm94TGlzdDo6ZGlydHlMaW5lc0Zyb21DaAogICAgICAgICBSb290SW5saW5lQm94KiBh
ZGphY2VudEJveDsKICAgICAgICAgYm94LT5tYXJrRGlydHkoKTsKIAorICAgICAgICAvLyBXZSBk
b24ndCBuZWVkIHRvIGRpcnR5IGFueSBvdGhlciBsaW5lcy4KKyAgICAgICAgaWYgKGJveC0+aGFz
QW5vbnltb3VzSW5saW5lQmxvY2soKSkKKyAgICAgICAgICAgIHJldHVybjsKKwogICAgICAgICAv
LyBkaXJ0eSB0aGUgYWRqYWNlbnQgbGluZXMgdGhhdCBtaWdodCBiZSBhZmZlY3RlZAogICAgICAg
ICAvLyBOT1RFOiB3ZSBkaXJ0eSB0aGUgcHJldmlvdXMgbGluZSBiZWNhdXNlIFJvb3RJbmxpbmVC
b3ggb2JqZWN0cyBjYWNoZQogICAgICAgICAvLyB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3Qgb2Jq
ZWN0IG9uIHRoZSBuZXh0IGxpbmUgYWZ0ZXIgYSBCUiwgd2hpY2ggd2UgbWF5IGJlCkluZGV4OiBX
ZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMaXN0SXRlbS5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVyTGlzdEl0ZW0uY3BwCShyZXZpc2lvbiA1NDY2NCkKKysrIFdlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlckxpc3RJdGVtLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjcsNiAr
MjcsOCBAQAogI2luY2x1ZGUgIkNhY2hlZEltYWdlLmgiCiAjaW5jbHVkZSAiSFRNTE5hbWVzLmgi
CiAjaW5jbHVkZSAiSFRNTE9MaXN0RWxlbWVudC5oIgorI2luY2x1ZGUgIklubGluZUl0ZXJhdG9y
LmgiCisKICNpbmNsdWRlICJSZW5kZXJMaXN0TWFya2VyLmgiCiAjaW5jbHVkZSAiUmVuZGVyVmll
dy5oIgogI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KQEAgLTE1MywxOCArMTU1LDQ0IEBA
IGJvb2wgUmVuZGVyTGlzdEl0ZW06OmlzRW1wdHkoKSBjb25zdAogICAgIHJldHVybiBsYXN0Q2hp
bGQoKSA9PSBtX21hcmtlcjsKIH0KIAotc3RhdGljIFJlbmRlck9iamVjdCogZ2V0UGFyZW50T2ZG
aXJzdExpbmVCb3goUmVuZGVyQmxvY2sqIGN1cnIsIFJlbmRlck9iamVjdCogbWFya2VyKQordm9p
ZCBSZW5kZXJMaXN0SXRlbTo6dXBkYXRlVmFsdWUoKQogewotICAgIFJlbmRlck9iamVjdCogZmly
c3RDaGlsZCA9IGN1cnItPmZpcnN0Q2hpbGQoKTsKLSAgICBpZiAoIWZpcnN0Q2hpbGQpCi0gICAg
ICAgIHJldHVybiAwOworICAgIGlmICghbV9oYXNFeHBsaWNpdFZhbHVlKSB7CisgICAgICAgIG1f
aXNWYWx1ZVVwVG9EYXRlID0gZmFsc2U7CisgICAgICAgIGlmIChtX21hcmtlcikKKyAgICAgICAg
ICAgIG1fbWFya2VyLT5zZXROZWVkc0xheW91dEFuZFByZWZXaWR0aHNSZWNhbGMoKTsKKyAgICB9
Cit9CiAKLSAgICBmb3IgKFJlbmRlck9iamVjdCogY3VyckNoaWxkID0gZmlyc3RDaGlsZDsgY3Vy
ckNoaWxkOyBjdXJyQ2hpbGQgPSBjdXJyQ2hpbGQtPm5leHRTaWJsaW5nKCkpIHsKK3N0YXRpYyBS
ZW5kZXJPYmplY3QqIGZpcnN0Tm9uTWFya2VyQ2hpbGQoUmVuZGVyT2JqZWN0KiBwYXJlbnQpCit7
CisgICAgUmVuZGVyT2JqZWN0KiByZXN1bHQgPSBwYXJlbnQtPmZpcnN0Q2hpbGQoKTsKKyAgICB3
aGlsZSAocmVzdWx0ICYmIHJlc3VsdC0+aXNMaXN0TWFya2VyKCkpCisgICAgICAgIHJlc3VsdCA9
IHJlc3VsdC0+bmV4dFNpYmxpbmcoKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRp
YyBSZW5kZXJCbG9jayogbGlzdE1hcmtlckxvY2F0aW9uKFJlbmRlckJsb2NrKiBibG9jaywgUmVu
ZGVyTGlzdE1hcmtlciogbWFya2VyKQoreworICAgIGZvciAoUmVuZGVyT2JqZWN0KiBjdXJyQ2hp
bGQgPSBibG9jay0+Zmlyc3RDaGlsZCgpOyBjdXJyQ2hpbGQ7IGN1cnJDaGlsZCA9IGN1cnJDaGls
ZC0+bmV4dFNpYmxpbmcoKSkgewogICAgICAgICBpZiAoY3VyckNoaWxkID09IG1hcmtlcikKICAg
ICAgICAgICAgIGNvbnRpbnVlOwogCi0gICAgICAgIGlmIChjdXJyQ2hpbGQtPmlzSW5saW5lKCkg
JiYgKCFjdXJyQ2hpbGQtPmlzUmVuZGVySW5saW5lKCkgfHwgY3Vyci0+Z2VuZXJhdGVzTGluZUJv
eGVzRm9ySW5saW5lQ2hpbGQoY3VyckNoaWxkKSkpCi0gICAgICAgICAgICByZXR1cm4gY3VycjsK
KyAgICAgICAgaWYgKGN1cnJDaGlsZC0+aXNJbmxpbmUoKSkgeworICAgICAgICAgICAgaWYgKCFj
dXJyQ2hpbGQtPmlzUmVuZGVySW5saW5lKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGJsb2Nr
OworICAgICAgICAgICAgSW5saW5lSXRlcmF0b3IgaXQoYmxvY2ssIGN1cnJDaGlsZCwgMCk7Cisg
ICAgICAgICAgICB3aGlsZSAoIWl0LmF0RW5kKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXQu
b2JqLT5pc0Fub255bW91c0lubGluZUJsb2NrKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgUmVu
ZGVyQmxvY2sqIGxpbmVCb3hQYXJlbnQgPSBsaXN0TWFya2VyTG9jYXRpb24odG9SZW5kZXJCbG9j
ayhpdC5vYmopLCBtYXJrZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAobGluZUJveFBhcmVu
dCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsaW5lQm94UGFyZW50OworICAgICAg
ICAgICAgICAgIH0gZWxzZSBpZiAoUmVuZGVyQmxvY2s6OnJlcXVpcmVzTGluZUJveChpdCkpCisg
ICAgICAgICAgICAgICAgICAgIHJldHVybiBibG9jazsKKyAgICAgICAgICAgICAgICBpdC5pbmNy
ZW1lbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCiAgICAgICAgIGlmIChjdXJyQ2hp
bGQtPmlzRmxvYXRpbmcoKSB8fCBjdXJyQ2hpbGQtPmlzUG9zaXRpb25lZCgpKQogICAgICAgICAg
ICAgY29udGludWU7CkBAIC0xNzIsNDEgKzIwMCwyNCBAQCBzdGF0aWMgUmVuZGVyT2JqZWN0KiBn
ZXRQYXJlbnRPZkZpcnN0TGluCiAgICAgICAgIGlmIChjdXJyQ2hpbGQtPmlzVGFibGUoKSB8fCAh
Y3VyckNoaWxkLT5pc1JlbmRlckJsb2NrKCkpCiAgICAgICAgICAgICBicmVhazsKIAotICAgICAg
ICBpZiAoY3Vyci0+aXNMaXN0SXRlbSgpICYmIGN1cnJDaGlsZC0+c3R5bGUoKS0+aHRtbEhhY2tz
KCkgJiYgY3VyckNoaWxkLT5ub2RlKCkgJiYKLSAgICAgICAgICAgIChjdXJyQ2hpbGQtPm5vZGUo
KS0+aGFzVGFnTmFtZSh1bFRhZyl8fCBjdXJyQ2hpbGQtPm5vZGUoKS0+aGFzVGFnTmFtZShvbFRh
ZykpKQorICAgICAgICBpZiAoYmxvY2stPmlzTGlzdEl0ZW0oKSAmJiBjdXJyQ2hpbGQtPnN0eWxl
KCktPmh0bWxIYWNrcygpICYmIGN1cnJDaGlsZC0+bm9kZSgpICYmCisgICAgICAgICAgICAoY3Vy
ckNoaWxkLT5ub2RlKCktPmhhc1RhZ05hbWUodWxUYWcpIHx8IGN1cnJDaGlsZC0+bm9kZSgpLT5o
YXNUYWdOYW1lKG9sVGFnKSkpCiAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBSZW5kZXJP
YmplY3QqIGxpbmVCb3ggPSBnZXRQYXJlbnRPZkZpcnN0TGluZUJveCh0b1JlbmRlckJsb2NrKGN1
cnJDaGlsZCksIG1hcmtlcik7Ci0gICAgICAgIGlmIChsaW5lQm94KQotICAgICAgICAgICAgcmV0
dXJuIGxpbmVCb3g7CisgICAgICAgIFJlbmRlckJsb2NrKiBsaW5lQm94UGFyZW50ID0gbGlzdE1h
cmtlckxvY2F0aW9uKHRvUmVuZGVyQmxvY2soY3VyckNoaWxkKSwgbWFya2VyKTsKKyAgICAgICAg
aWYgKGxpbmVCb3hQYXJlbnQpCisgICAgICAgICAgICByZXR1cm4gbGluZUJveFBhcmVudDsKICAg
ICB9CiAKICAgICByZXR1cm4gMDsKIH0KIAotdm9pZCBSZW5kZXJMaXN0SXRlbTo6dXBkYXRlVmFs
dWUoKQotewotICAgIGlmICghbV9oYXNFeHBsaWNpdFZhbHVlKSB7Ci0gICAgICAgIG1faXNWYWx1
ZVVwVG9EYXRlID0gZmFsc2U7Ci0gICAgICAgIGlmIChtX21hcmtlcikKLSAgICAgICAgICAgIG1f
bWFya2VyLT5zZXROZWVkc0xheW91dEFuZFByZWZXaWR0aHNSZWNhbGMoKTsKLSAgICB9Ci19Ci0K
LXN0YXRpYyBSZW5kZXJPYmplY3QqIGZpcnN0Tm9uTWFya2VyQ2hpbGQoUmVuZGVyT2JqZWN0KiBw
YXJlbnQpCi17Ci0gICAgUmVuZGVyT2JqZWN0KiByZXN1bHQgPSBwYXJlbnQtPmZpcnN0Q2hpbGQo
KTsKLSAgICB3aGlsZSAocmVzdWx0ICYmIHJlc3VsdC0+aXNMaXN0TWFya2VyKCkpCi0gICAgICAg
IHJlc3VsdCA9IHJlc3VsdC0+bmV4dFNpYmxpbmcoKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQot
CiB2b2lkIFJlbmRlckxpc3RJdGVtOjp1cGRhdGVNYXJrZXJMb2NhdGlvbigpCiB7CiAgICAgLy8g
U2FuaXR5IGNoZWNrIHRoZSBsb2NhdGlvbiBvZiBvdXIgbWFya2VyLgogICAgIGlmIChtX21hcmtl
cikgewogICAgICAgICBSZW5kZXJPYmplY3QqIG1hcmtlclBhciA9IG1fbWFya2VyLT5wYXJlbnQo
KTsKLSAgICAgICAgUmVuZGVyT2JqZWN0KiBsaW5lQm94UGFyZW50ID0gZ2V0UGFyZW50T2ZGaXJz
dExpbmVCb3godGhpcywgbV9tYXJrZXIpOworICAgICAgICBSZW5kZXJPYmplY3QqIGxpbmVCb3hQ
YXJlbnQgPSBsaXN0TWFya2VyTG9jYXRpb24odGhpcywgbV9tYXJrZXIpOwogICAgICAgICBpZiAo
IWxpbmVCb3hQYXJlbnQpIHsKICAgICAgICAgICAgIC8vIElmIHRoZSBtYXJrZXIgaXMgY3VycmVu
dGx5IGNvbnRhaW5lZCBpbnNpZGUgYW4gYW5vbnltb3VzIGJveCwKICAgICAgICAgICAgIC8vIHRo
ZW4gd2UgYXJlIHRoZSBvbmx5IGl0ZW0gaW4gdGhhdCBhbm9ueW1vdXMgYm94IChzaW5jZSBubyBs
aW5lIGJveApAQCAtMjU3LDkgKzI2OCwxMSBAQCB2b2lkIFJlbmRlckxpc3RJdGVtOjpwb3NpdGlv
bkxpc3RNYXJrZXIoCiAgICAgICAgIGludCBtYXJrZXJPbGRYID0gbV9tYXJrZXItPngoKTsKICAg
ICAgICAgaW50IHlPZmZzZXQgPSAwOwogICAgICAgICBpbnQgeE9mZnNldCA9IDA7Ci0gICAgICAg
IGZvciAoUmVuZGVyQm94KiBvID0gbV9tYXJrZXItPnBhcmVudEJveCgpOyBvICE9IHRoaXM7IG8g
PSBvLT5wYXJlbnRCb3goKSkgewotICAgICAgICAgICAgeU9mZnNldCArPSBvLT55KCk7Ci0gICAg
ICAgICAgICB4T2Zmc2V0ICs9IG8tPngoKTsKKyAgICAgICAgZm9yIChSZW5kZXJPYmplY3QqIG8g
PSBtX21hcmtlci0+cGFyZW50KCk7IG8gIT0gdGhpczsgbyA9IG8tPnBhcmVudCgpKSB7CisgICAg
ICAgICAgICBpZiAoby0+aXNCb3goKSkgeworICAgICAgICAgICAgICAgIHlPZmZzZXQgKz0gdG9S
ZW5kZXJCb3gobyktPnkoKTsKKyAgICAgICAgICAgICAgICB4T2Zmc2V0ICs9IHRvUmVuZGVyQm94
KG8pLT54KCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBib29sIGFkanVz
dE92ZXJmbG93ID0gZmFsc2U7CkBAIC0yOTUsMTMgKzMwOCwxNCBAQCB2b2lkIFJlbmRlckxpc3RJ
dGVtOjpwb3NpdGlvbkxpc3RNYXJrZXIoCiAKICAgICAgICAgaWYgKGFkanVzdE92ZXJmbG93KSB7
CiAgICAgICAgICAgICBJbnRSZWN0IG1hcmtlclJlY3QobWFya2VyWFBvcyArIHhPZmZzZXQsIHlP
ZmZzZXQsIG1fbWFya2VyLT53aWR0aCgpLCBtX21hcmtlci0+aGVpZ2h0KCkpOwotICAgICAgICAg
ICAgUmVuZGVyQm94KiBvID0gbV9tYXJrZXI7CisgICAgICAgICAgICBSZW5kZXJPYmplY3QqIG8g
PSBtX21hcmtlcjsKICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBvID0gby0+cGFy
ZW50Qm94KCk7CisgICAgICAgICAgICAgICAgbyA9IG8tPnBhcmVudCgpOwogICAgICAgICAgICAg
ICAgIGlmIChvLT5pc1JlbmRlckJsb2NrKCkpCiAgICAgICAgICAgICAgICAgICAgIHRvUmVuZGVy
QmxvY2sobyktPmFkZExheW91dE92ZXJmbG93KG1hcmtlclJlY3QpOwotICAgICAgICAgICAgICAg
IG1hcmtlclJlY3QubW92ZSgtby0+eCgpLCAtby0+eSgpKTsKLSAgICAgICAgICAgIH0gd2hpbGUg
KG8gIT0gdGhpcyAmJiAhby0+aGFzU2VsZlBhaW50aW5nTGF5ZXIoKSk7CisgICAgICAgICAgICAg
ICAgaWYgKG8tPmlzQm94KCkpCisgICAgICAgICAgICAgICAgICAgIG1hcmtlclJlY3QubW92ZSgt
dG9SZW5kZXJCb3gobyktPngoKSwgLXRvUmVuZGVyQm94KG8pLT55KCkpOworICAgICAgICAgICAg
fSB3aGlsZSAobyAhPSB0aGlzICYmICghby0+aXNCb3goKSB8fCAhdG9SZW5kZXJCb3gobyktPmhh
c1NlbGZQYWludGluZ0xheWVyKCkpKTsgLy8gRklYTUU6IEludmVzdGlnYXRlIDxsaT48c3BhbiBz
dHlsZT0icG9zaXRpb246cmVsYXRpdmU7bGVmdDotMTAwcHgiPjxkaXY+dGV4dDwvZGl2Pjwvc3Bh
bj48L2xpPgogICAgICAgICB9CiAgICAgfQogfQpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVu
ZGVyT2JqZWN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmpl
Y3QuY3BwCShyZXZpc2lvbiA1NDY2NCkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlck9iamVj
dC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIwOCw2ICsyMDgsNyBAQCBSZW5kZXJPYmplY3Q6OlJl
bmRlck9iamVjdChOb2RlKiBub2RlKQogICAgICwgbV9oYXNNYXJrdXBUcnVuY2F0aW9uKGZhbHNl
KQogICAgICwgbV9zZWxlY3Rpb25TdGF0ZShTZWxlY3Rpb25Ob25lKQogICAgICwgbV9oYXNDb2x1
bW5zKGZhbHNlKQorICAgICwgbV9oYXNDdWxsZWRMaW5lQm94ZXMoZmFsc2UpCiAgICAgLCBtX2Nl
bGxXaWR0aENoYW5nZWQoZmFsc2UpCiB7CiAjaWZuZGVmIE5ERUJVRwpAQCAtMjIzMiw4ICsyMjMz
LDYgQEAgdm9pZCBSZW5kZXJPYmplY3Q6OmdldFRleHREZWNvcmF0aW9uQ29sbwogICAgICAgICAg
ICAgfQogICAgICAgICB9CiAgICAgICAgIGN1cnIgPSBjdXJyLT5wYXJlbnQoKTsKLSAgICAgICAg
aWYgKGN1cnIgJiYgY3Vyci0+aXNSZW5kZXJCbG9jaygpICYmIHRvUmVuZGVyQmxvY2soY3Vycikt
PmlubGluZUNvbnRpbnVhdGlvbigpKQotICAgICAgICAgICAgY3VyciA9IHRvUmVuZGVyQmxvY2so
Y3VyciktPmlubGluZUNvbnRpbnVhdGlvbigpOwogICAgIH0gd2hpbGUgKGN1cnIgJiYgZGVjb3Jh
dGlvbnMgJiYgKCFxdWlya3NNb2RlIHx8ICFjdXJyLT5ub2RlKCkgfHwKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAoIWN1cnItPm5vZGUoKS0+aGFzVGFnTmFtZShhVGFnKSAm
JiAhY3Vyci0+bm9kZSgpLT5oYXNUYWdOYW1lKGZvbnRUYWcpKSkpOwogCkluZGV4OiBXZWJDb3Jl
L3JlbmRlcmluZy9SZW5kZXJPYmplY3QuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmlu
Zy9SZW5kZXJPYmplY3QuaAkocmV2aXNpb24gNTQ2NjQpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9S
ZW5kZXJPYmplY3QuaAkod29ya2luZyBjb3B5KQpAQCAtMzE1LDYgKzMxNSw4IEBAIHB1YmxpYzoK
ICAgICB2b2lkIHNldENoaWxkcmVuSW5saW5lKGJvb2wgYiA9IHRydWUpIHsgbV9jaGlsZHJlbklu
bGluZSA9IGI7IH0KICAgICBib29sIGhhc0NvbHVtbnMoKSBjb25zdCB7IHJldHVybiBtX2hhc0Nv
bHVtbnM7IH0KICAgICB2b2lkIHNldEhhc0NvbHVtbnMoYm9vbCBiID0gdHJ1ZSkgeyBtX2hhc0Nv
bHVtbnMgPSBiOyB9CisgICAgYm9vbCBoYXNDdWxsZWRMaW5lQm94ZXMoKSBjb25zdCB7IHJldHVy
biBtX2hhc0N1bGxlZExpbmVCb3hlczsgfQorICAgIHZvaWQgc2V0SGFzQ3VsbGVkTGluZUJveGVz
KGJvb2wgYiA9IHRydWUpIHsgbV9oYXNDdWxsZWRMaW5lQm94ZXMgPSBiOyB9CiAgICAgYm9vbCBj
ZWxsV2lkdGhDaGFuZ2VkKCkgY29uc3QgeyByZXR1cm4gbV9jZWxsV2lkdGhDaGFuZ2VkOyB9CiAg
ICAgdm9pZCBzZXRDZWxsV2lkdGhDaGFuZ2VkKGJvb2wgYiA9IHRydWUpIHsgbV9jZWxsV2lkdGhD
aGFuZ2VkID0gYjsgfQogCkBAIC0zNjYsNyArMzY4LDExIEBAIHB1YmxpYzoKICAgICB2b2lkIHNl
dElzQW5vbnltb3VzKGJvb2wgYikgeyBtX2lzQW5vbnltb3VzID0gYjsgfQogICAgIGJvb2wgaXNB
bm9ueW1vdXNCbG9jaygpIGNvbnN0CiAgICAgewotICAgICAgICByZXR1cm4gbV9pc0Fub255bW91
cyAmJiBzdHlsZSgpLT5kaXNwbGF5KCkgPT0gQkxPQ0sgJiYgc3R5bGUoKS0+c3R5bGVUeXBlKCkg
PT0gTk9QU0VVRE8gJiYgIWlzTGlzdE1hcmtlcigpOworICAgICAgICByZXR1cm4gbV9pc0Fub255
bW91cyAmJiBzdHlsZSgpLT5kaXNwbGF5KCkgPT0gQkxPQ0sgJiYgc3R5bGUoKS0+c3R5bGVUeXBl
KCkgPT0gTk9QU0VVRE8gJiYgIWlzVGV4dCgpICYmICFpc0xpc3RNYXJrZXIoKTsKKyAgICB9Cisg
ICAgYm9vbCBpc0Fub255bW91c0lubGluZUJsb2NrKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJl
dHVybiBtX2lzQW5vbnltb3VzICYmIHN0eWxlKCktPmRpc3BsYXkoKSA9PSBJTkxJTkVfQkxPQ0sg
JiYgc3R5bGUoKS0+c3R5bGVUeXBlKCkgPT0gTk9QU0VVRE8gJiYgIWlzVGV4dCgpICYmICFpc1J1
YnlSdW4oKSAmJiAhaXNSdWJ5QmFzZSgpOwogICAgIH0KICAgICBib29sIGlzSW5saW5lQ29udGlu
dWF0aW9uKCkgY29uc3QgeyByZXR1cm4gKG5vZGUoKSA/IG5vZGUoKS0+cmVuZGVyZXIoKSAhPSB0
aGlzIDogZmFsc2UpICYmIGlzUmVuZGVySW5saW5lKCk7IH0KICAgICBib29sIGlzRmxvYXRpbmco
KSBjb25zdCB7IHJldHVybiBtX2Zsb2F0aW5nOyB9CkBAIC04NzMsNiArODc5LDkgQEAgcHJpdmF0
ZToKICAgICB1bnNpZ25lZCBtX3NlbGVjdGlvblN0YXRlIDogMzsgLy8gU2VsZWN0aW9uU3RhdGUK
ICAgICBib29sIG1faGFzQ29sdW1ucyA6IDE7CiAgICAgCisgICAgLy8gZnJvbSBSZW5kZXJJbmxp
bmUKKyAgICBib29sIG1faGFzQ3VsbGVkTGluZUJveGVzIDogMTsKKwogICAgIC8vIGZyb20gUmVu
ZGVyVGFibGVDZWxsCiAgICAgYm9vbCBtX2NlbGxXaWR0aENoYW5nZWQgOiAxOwogCkluZGV4OiBX
ZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3RDaGlsZExpc3QuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdENoaWxkTGlzdC5jcHAJKHJldmlzaW9uIDU0
NjY0KQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0Q2hpbGRMaXN0LmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMzE2LDE2ICszMTYsNiBAQCB2b2lkIFJlbmRlck9iamVjdENoaWxkTGlz
dDo6dXBkYXRlQmVmb3JlCiAKICAgICAvLyBXaGV0aGVyIG9yIG5vdCB3ZSBub3cgd2FudCBnZW5l
cmF0ZWQgY29udGVudC4gIAogICAgIGJvb2wgbmV3Q29udGVudFdhbnRlZCA9IHBzZXVkb0VsZW1l
bnRTdHlsZSAmJiBwc2V1ZG9FbGVtZW50U3R5bGUtPmRpc3BsYXkoKSAhPSBOT05FOwotCi0gICAg
Ly8gRm9yIDxxPjxwLz48L3E+LCBpZiB0aGlzIG9iamVjdCBpcyB0aGUgaW5saW5lIGNvbnRpbnVh
dGlvbiBvZiB0aGUgPHE+LCB3ZSBvbmx5IHdhbnQgdG8gZ2VuZXJhdGUKLSAgICAvLyA6YWZ0ZXIg
Y29udGVudCBhbmQgbm90IDpiZWZvcmUgY29udGVudC4KLSAgICBpZiAobmV3Q29udGVudFdhbnRl
ZCAmJiB0eXBlID09IEJFRk9SRSAmJiBvd25lci0+aXNSZW5kZXJJbmxpbmUoKSAmJiB0b1JlbmRl
cklubGluZShvd25lciktPmlzSW5saW5lQ29udGludWF0aW9uKCkpCi0gICAgICAgIG5ld0NvbnRl
bnRXYW50ZWQgPSBmYWxzZTsKLQotICAgIC8vIFNpbWlsYXJseSwgaWYgd2UncmUgdGhlIGJlZ2lu
bmluZyBvZiBhIDxxPiwgYW5kIHRoZXJlJ3MgYW4gaW5saW5lIGNvbnRpbnVhdGlvbiBmb3Igb3Vy
IG9iamVjdCwKLSAgICAvLyB0aGVuIHdlIGRvbid0IGdlbmVyYXRlIHRoZSA6YWZ0ZXIgY29udGVu
dC4KLSAgICBpZiAobmV3Q29udGVudFdhbnRlZCAmJiB0eXBlID09IEFGVEVSICYmIG93bmVyLT5p
c1JlbmRlcklubGluZSgpICYmIHRvUmVuZGVySW5saW5lKG93bmVyKS0+Y29udGludWF0aW9uKCkp
Ci0gICAgICAgIG5ld0NvbnRlbnRXYW50ZWQgPSBmYWxzZTsKICAgICAKICAgICAvLyBJZiB3ZSBk
b24ndCB3YW50IGdlbmVyYXRlZCBjb250ZW50IGFueSBsb25nZXIsIG9yIGlmIHdlIGhhdmUgZ2Vu
ZXJhdGVkIGNvbnRlbnQsIGJ1dCBpdCdzIG5vIGxvbmdlcgogICAgIC8vIGlkZW50aWNhbCB0byB0
aGUgbmV3IGNvbnRlbnQgZGF0YSB3ZSB3YW50IHRvIGJ1aWxkIHJlbmRlciBvYmplY3RzIGZvciwg
dGhlbiB3ZSBudWtlIGFsbApJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyUnVieUJhc2Uu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclJ1YnlCYXNlLmNwcAko
cmV2aXNpb24gNTQ2NjQpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJSdWJ5QmFzZS5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTExOCw3ICsxMTgsNiBAQCB2b2lkIFJlbmRlclJ1YnlCYXNlOjpt
b3ZlQmxvY2tDaGlsZHJlbihSCiAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLT5pc0Fub255bW91
c0Jsb2NrKCkpIHsKICAgICAgICAgICAgICAgICAgICAgUmVuZGVyQmxvY2sqIGFub25CbG9jayA9
IHRvUmVuZGVyQmxvY2soY2hpbGQpOwogICAgICAgICAgICAgICAgICAgICBBU1NFUlQoYW5vbkJs
b2NrLT5jaGlsZHJlbklubGluZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgQVNTRVJUKCFhbm9u
QmxvY2stPmlubGluZUNvbnRpbnVhdGlvbigpKTsKICAgICAgICAgICAgICAgICAgICAgYW5vbkJs
b2NrLT5tb3ZlQWxsQ2hpbGRyZW5Ubyh0b0Jhc2UsIHRvQmFzZS0+Y2hpbGRyZW4oKSk7CiAgICAg
ICAgICAgICAgICAgICAgIGFub25CbG9jay0+ZGVsZXRlTGluZUJveFRyZWUoKTsKICAgICAgICAg
ICAgICAgICAgICAgYW5vbkJsb2NrLT5kZXN0cm95KCk7CkBAIC0xNDUsNyArMTQ0LDYgQEAgdm9p
ZCBSZW5kZXJSdWJ5QmFzZTo6bW92ZUJsb2NrQ2hpbGRyZW4oUgogCiAgICAgICAgICAgICAgICAg
ICAgIFJlbmRlckJsb2NrKiBhbm9uQmxvY2sgPSB0b1JlbmRlckJsb2NrKGNoaWxkKTsKICAgICAg
ICAgICAgICAgICAgICAgQVNTRVJUKGFub25CbG9jay0+Y2hpbGRyZW5JbmxpbmUoKSk7Ci0gICAg
ICAgICAgICAgICAgICAgIEFTU0VSVCghYW5vbkJsb2NrLT5pbmxpbmVDb250aW51YXRpb24oKSk7
CiAgICAgICAgICAgICAgICAgICAgIC8vIE1vdmUgaW5saW5lIGNoaWxkcmVuIG91dCBvZiBhbm9u
eW1vdXMgYmxvY2suCiAgICAgICAgICAgICAgICAgICAgIGFub25CbG9jay0+bW92ZUFsbENoaWxk
cmVuVG8odGhpcywgY2hpbGRyZW4oKSwgYW5vbkJsb2NrKTsKICAgICAgICAgICAgICAgICAgICAg
YW5vbkJsb2NrLT5kZWxldGVMaW5lQm94VHJlZSgpOwpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcv
Um9vdElubGluZUJveC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUm9vdElu
bGluZUJveC5jcHAJKHJldmlzaW9uIDU0NjY0KQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUm9vdElu
bGluZUJveC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlICJQ
YWdlLmgiCiAjaW5jbHVkZSAiUmVuZGVyQXJlbmEuaCIKICNpbmNsdWRlICJSZW5kZXJCbG9jay5o
IgorI2luY2x1ZGUgIlJlbmRlclZpZXcuaCIKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIApAQCAt
MTYxLDkgKzE2MiwxNSBAQCB2b2lkIFJvb3RJbmxpbmVCb3g6OnBhaW50Q3VzdG9tSGlnaGxpZ2h0
CiAKICNlbmRpZgogCi12b2lkIFJvb3RJbmxpbmVCb3g6OnBhaW50KFJlbmRlck9iamVjdDo6UGFp
bnRJbmZvJiBwYWludEluZm8sIGludCB0eCwgaW50IHR5KQordm9pZCBSb290SW5saW5lQm94Ojpw
YWludChSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJbmZvLCBpbnQgdHgsIGludCB0eSwg
TGluZUJveFBhaW50SW5mbyYgbGluZUJveFBhaW50SW5mbykKIHsKLSAgICBJbmxpbmVGbG93Qm94
OjpwYWludChwYWludEluZm8sIHR4LCB0eSk7CisgICAgLy8gT25seSBwYWludCBkdXJpbmcgdGhl
IGZvcmVncm91bmQvc2VsZWN0aW9uIHBoYXNlcy4KKyAgICBpZiAocGFpbnRJbmZvLnBoYXNlICE9
IFBhaW50UGhhc2VGb3JlZ3JvdW5kICYmIHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlU2Vs
ZWN0aW9uICYmIHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlT3V0bGluZSAKKyAgICAgICAg
JiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VTZWxmT3V0bGluZSAmJiBwYWludEluZm8u
cGhhc2UgIT0gUGFpbnRQaGFzZUNoaWxkT3V0bGluZXMgJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBh
aW50UGhhc2VUZXh0Q2xpcAorICAgICAgICAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFz
ZU1hc2spCisgICAgICAgIHJldHVybjsKKworICAgIElubGluZUZsb3dCb3g6OnBhaW50KHBhaW50
SW5mbywgdHgsIHR5LCBsaW5lQm94UGFpbnRJbmZvKTsKICAgICBwYWludEVsbGlwc2lzQm94KHBh
aW50SW5mbywgdHgsIHR5KTsKICNpZiBQTEFURk9STShNQUMpCiAgICAgUmVuZGVyU3R5bGUqIHN0
eWxlVG9Vc2UgPSByZW5kZXJlcigpLT5zdHlsZShtX2ZpcnN0TGluZSk7CkBAIC0xNzIsMTUgKzE3
OSwxOCBAQCB2b2lkIFJvb3RJbmxpbmVCb3g6OnBhaW50KFJlbmRlck9iamVjdDo6CiAjZW5kaWYK
IH0KIAotYm9vbCBSb290SW5saW5lQm94Ojpub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVz
dCYgcmVxdWVzdCwgSGl0VGVzdFJlc3VsdCYgcmVzdWx0LCBpbnQgeCwgaW50IHksIGludCB0eCwg
aW50IHR5KQorYm9vbCBSb290SW5saW5lQm94Ojpub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVx
dWVzdCYgcmVxdWVzdCwgSGl0VGVzdFJlc3VsdCYgcmVzdWx0LCBpbnQgeCwgaW50IHksIGludCB0
eCwgaW50IHR5LCBIaXRUZXN0QWN0aW9uIGhpdFRlc3RBY3Rpb24sIExpbmVCb3hIaXRUZXN0SW5m
byYgaGl0VGVzdEluZm8pCiB7CisgICAgaWYgKGhpdFRlc3RBY3Rpb24gIT0gSGl0VGVzdEZvcmVn
cm91bmQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKwogICAgIGlmIChtX2hhc0VsbGlwc2lzQm94
ICYmIHZpc2libGVUb0hpdFRlc3RpbmcoKSkgewotICAgICAgICBpZiAoZWxsaXBzaXNCb3goKS0+
bm9kZUF0UG9pbnQocmVxdWVzdCwgcmVzdWx0LCB4LCB5LCB0eCwgdHkpKSB7CisgICAgICAgIGlm
IChlbGxpcHNpc0JveCgpLT5ub2RlQXRQb2ludChyZXF1ZXN0LCByZXN1bHQsIHgsIHksIHR4LCB0
eSwgaGl0VGVzdEFjdGlvbiwgaGl0VGVzdEluZm8pKSB7CiAgICAgICAgICAgICByZW5kZXJlcigp
LT51cGRhdGVIaXRUZXN0UmVzdWx0KHJlc3VsdCwgSW50UG9pbnQoeCAtIHR4LCB5IC0gdHkpKTsK
ICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBJ
bmxpbmVGbG93Qm94Ojpub2RlQXRQb2ludChyZXF1ZXN0LCByZXN1bHQsIHgsIHksIHR4LCB0eSk7
CisgICAgcmV0dXJuIElubGluZUZsb3dCb3g6Om5vZGVBdFBvaW50KHJlcXVlc3QsIHJlc3VsdCwg
eCwgeSwgdHgsIHR5LCBIaXRUZXN0Rm9yZWdyb3VuZCwgaGl0VGVzdEluZm8pOwogfQogCiB2b2lk
IFJvb3RJbmxpbmVCb3g6OmFkanVzdFBvc2l0aW9uKGludCBkeCwgaW50IGR5KQpAQCAtMjA0LDYg
KzIxNCwyNCBAQCB2b2lkIFJvb3RJbmxpbmVCb3g6OmNoaWxkUmVtb3ZlZChJbmxpbmVCCiAKIGlu
dCBSb290SW5saW5lQm94Ojp2ZXJ0aWNhbGx5QWxpZ25Cb3hlcyhpbnQgaGVpZ2h0T2ZCbG9jaykK
IHsKKyAgICBSZW5kZXJCbG9jayogaW5saW5lQmxvY2sgPSBhbm9ueW1vdXNJbmxpbmVCbG9jaygp
OworICAgIGlmIChpbmxpbmVCbG9jaykgeworICAgICAgICBpbnQgbGluZVRvcCA9IGlubGluZUJs
b2NrLT55KCk7CisgICAgICAgIGludCBsaW5lQm90dG9tID0gaW5saW5lQmxvY2stPnkoKSArIGlu
bGluZUJsb2NrLT5oZWlnaHQoKTsKKyAgICAgICAgZm9yIChJbmxpbmVCb3gqIGN1cnIgPSBmaXJz
dENoaWxkKCk7IGN1cnI7IGN1cnIgPSBzdGF0aWNfY2FzdDxJbmxpbmVGbG93Qm94Kj4oY3Vycikt
PmZpcnN0Q2hpbGQoKSkgeworICAgICAgICAgICAgY3Vyci0+c2V0WChpbmxpbmVCbG9jay0+eCgp
KTsKKyAgICAgICAgICAgIGN1cnItPnNldFkobGluZVRvcCk7CisgICAgICAgICAgICBjdXJyLT5z
ZXRXaWR0aChpbmxpbmVCbG9jay0+d2lkdGgoKSk7CisgICAgICAgICAgICBpZiAoY3Vyci0+cmVu
ZGVyZXIoKSA9PSBpbmxpbmVCbG9jaykKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
ICAgIHN0YXRpY19jYXN0PElubGluZUZsb3dBbm9ueW1vdXNJbmxpbmVCbG9ja0JveCo+KGN1cnIp
LT5zZXRIZWlnaHQoaW5saW5lQmxvY2stPmhlaWdodCgpKTsKKyAgICAgICAgfQorICAgICAgICBz
ZXRZKGxpbmVUb3ApOworICAgICAgICBjb21wdXRlVmVydGljYWxPdmVyZmxvdyhsaW5lVG9wLCBs
aW5lQm90dG9tLCB0cnVlKTsKKyAgICAgICAgc2V0TGluZVRvcEJvdHRvbVBvc2l0aW9ucyhsaW5l
VG9wLCBsaW5lQm90dG9tKTsKKyAgICAgICAgcmV0dXJuIGhlaWdodE9mQmxvY2s7CisgICAgfQor
ICAgIAogICAgIGludCBtYXhQb3NpdGlvblRvcCA9IDA7CiAgICAgaW50IG1heFBvc2l0aW9uQm90
dG9tID0gMDsKICAgICBpbnQgbWF4QXNjZW50ID0gMDsKQEAgLTIxNyw3ICsyNDUsNiBAQCBpbnQg
Um9vdElubGluZUJveDo6dmVydGljYWxseUFsaWduQm94ZXMoCiAgICAgYm9vbCBzdHJpY3RNb2Rl
ID0gKGN1cnIgJiYgY3Vyci0+ZG9jdW1lbnQoKS0+aW5TdHJpY3RNb2RlKCkpOwogCiAgICAgY29t
cHV0ZUxvZ2ljYWxCb3hIZWlnaHRzKG1heFBvc2l0aW9uVG9wLCBtYXhQb3NpdGlvbkJvdHRvbSwg
bWF4QXNjZW50LCBtYXhEZXNjZW50LCBzdHJpY3RNb2RlKTsKLQogICAgIGlmIChtYXhBc2NlbnQg
KyBtYXhEZXNjZW50IDwgbWF4KG1heFBvc2l0aW9uVG9wLCBtYXhQb3NpdGlvbkJvdHRvbSkpCiAg
ICAgICAgIGFkanVzdE1heEFzY2VudEFuZERlc2NlbnQobWF4QXNjZW50LCBtYXhEZXNjZW50LCBt
YXhQb3NpdGlvblRvcCwgbWF4UG9zaXRpb25Cb3R0b20pOwogCkBAIC0zMzIsNyArMzU5LDcgQEAg
SW5saW5lQm94KiBSb290SW5saW5lQm94OjpsYXN0U2VsZWN0ZWRCbwogaW50IFJvb3RJbmxpbmVC
b3g6OnNlbGVjdGlvblRvcCgpIGNvbnN0CiB7CiAgICAgaW50IHNlbGVjdGlvblRvcCA9IG1fbGlu
ZVRvcDsKLSAgICBpZiAoIXByZXZSb290Qm94KCkpCisgICAgaWYgKCFwcmV2Um9vdEJveCgpIHx8
IHByZXZSb290Qm94KCktPmhhc0Fub255bW91c0lubGluZUJsb2NrKCkpCiAgICAgICAgIHJldHVy
biBzZWxlY3Rpb25Ub3A7CiAKICAgICBpbnQgcHJldkJvdHRvbSA9IHByZXZSb290Qm94KCktPnNl
bGVjdGlvbkJvdHRvbSgpOwpAQCAtNDMwLDQgKzQ1NywyNSBAQCB2b2lkIFJvb3RJbmxpbmVCb3g6
OmF0dGFjaExpbmVCb3hUb1JlbmRlCiAgICAgYmxvY2soKS0+bGluZUJveGVzKCktPmF0dGFjaExp
bmVCb3godGhpcyk7CiB9CiAKK1JlbmRlckJsb2NrKiBSb290SW5saW5lQm94Ojphbm9ueW1vdXNJ
bmxpbmVCbG9jaygpIGNvbnN0Cit7CisgICAgaWYgKGhhc0Fub255bW91c0lubGluZUJsb2NrKCkp
CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBSb290QW5vbnltb3VzSW5saW5lQmxv
Y2tCb3gqPih0aGlzKS0+aW5saW5lQmxvY2soKTsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBS
b290QW5vbnltb3VzSW5saW5lQmxvY2tCb3g6OnBhaW50KFJlbmRlck9iamVjdDo6UGFpbnRJbmZv
JiBwYWludEluZm8sIGludCB0eCwgaW50IHR5LCBMaW5lQm94UGFpbnRJbmZvJiBsaW5lQm94UGFp
bnRJbmZvKQoreworICAgIC8vIFNraXAgdGhlIGV4dHJhIHdvcmsgZG9uZSBieSBSb290SW5saW5l
Qm94OjpwYWludC4gQ2FjaGUgb3VyIGFub255bW91cyBibG9jayBpbiB0aGUgcGFpbnQgaW5mbyBm
b3IgZWFzeQorICAgIC8vIGFjY2VzcyBhcyB3ZSByZWN1ciBpbnRvIHRoZSBsaW5lLgorICAgIGxp
bmVCb3hQYWludEluZm8uYW5vbnltb3VzSW5saW5lQmxvY2sgPSBtX2Fub255bW91c0lubGluZUJs
b2NrOworICAgIElubGluZUZsb3dCb3g6OnBhaW50KHBhaW50SW5mbywgdHgsIHR5LCBsaW5lQm94
UGFpbnRJbmZvKTsKK30KKworYm9vbCBSb290QW5vbnltb3VzSW5saW5lQmxvY2tCb3g6Om5vZGVB
dFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiByZXF1ZXN0LCBIaXRUZXN0UmVzdWx0JiByZXN1
bHQsIGludCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHksIEhpdFRlc3RBY3Rpb24gaGl0VGVzdEFj
dGlvbiwgTGluZUJveEhpdFRlc3RJbmZvJiBoaXRUZXN0SW5mbykKK3sKKyAgICAvLyBTa2lwIHRo
ZSBleHRyYSB3b3JrIGRvbmUgYnkgUm9vdElubGluZUJveDo6bm9kZUF0UG9pbnQuCisgICAgcmV0
dXJuIElubGluZUZsb3dCb3g6Om5vZGVBdFBvaW50KHJlcXVlc3QsIHJlc3VsdCwgeCwgeSwgdHgs
IHR5LCBoaXRUZXN0QWN0aW9uLCBoaXRUZXN0SW5mbyk7Cit9CisKIH0gLy8gbmFtZXNwYWNlIFdl
YkNvcmUKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1Jvb3RJbmxpbmVCb3guaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9Sb290SW5saW5lQm94LmgJKHJldmlzaW9uIDU0NjY0KQor
KysgV2ViQ29yZS9yZW5kZXJpbmcvUm9vdElubGluZUJveC5oCSh3b3JraW5nIGNvcHkpCkBAIC00
MCw2ICs0MCw3IEBAIHB1YmxpYzoKICAgICAgICAgLCBtX2xpbmVCcmVha1BvcygwKQogICAgICAg
ICAsIG1fbGluZVRvcCgwKQogICAgICAgICAsIG1fbGluZUJvdHRvbSgwKQorICAgICAgICAsIG1f
aGFzQW5vbnltb3VzSW5saW5lQmxvY2soZmFsc2UpCiAgICAgewogICAgIH0KIApAQCAtMTAxLDgg
KzEwMiw4IEBAIHB1YmxpYzoKICAgICB2b2lkIHBhaW50Q3VzdG9tSGlnaGxpZ2h0KFJlbmRlck9i
amVjdDo6UGFpbnRJbmZvJiwgaW50IHR4LCBpbnQgdHksIGNvbnN0IEF0b21pY1N0cmluZyYgaGln
aGxpZ2h0VHlwZSk7CiAjZW5kaWYKIAotICAgIHZpcnR1YWwgdm9pZCBwYWludChSZW5kZXJPYmpl
Y3Q6OlBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5KTsKLSAgICB2aXJ0dWFsIGJvb2wgbm9kZUF0
UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVzdWx0JiwgaW50LCBpbnQsIGlu
dCwgaW50KTsKKyAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoUmVuZGVyT2JqZWN0OjpQYWludEluZm8m
LCBpbnQgdHgsIGludCB0eSwgTGluZUJveFBhaW50SW5mbyYpOworICAgIHZpcnR1YWwgYm9vbCBu
b2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBpbnQgeCwg
aW50IHksIGludCB0eCwgaW50IHR5LCBIaXRUZXN0QWN0aW9uLCBMaW5lQm94SGl0VGVzdEluZm8m
KTsKIAogICAgIGJvb2wgaGFzU2VsZWN0ZWRDaGlsZHJlbigpIGNvbnN0IHsgcmV0dXJuIG1faGFz
U2VsZWN0ZWRDaGlsZHJlbjsgfQogICAgIHZvaWQgc2V0SGFzU2VsZWN0ZWRDaGlsZHJlbihib29s
KTsKQEAgLTEzMiw2ICsxMzMsMTEgQEAgcHVibGljOgogICAgIHZpcnR1YWwgdm9pZCBhdHRhY2hM
aW5lQm94VG9SZW5kZXJPYmplY3QoKTsKICAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlTGluZUJveEZy
b21SZW5kZXJPYmplY3QoKTsKIAorICAgIGJvb2wgaGFzQW5vbnltb3VzSW5saW5lQmxvY2soKSBj
b25zdCB7IHJldHVybiBtX2hhc0Fub255bW91c0lubGluZUJsb2NrOyB9CisgICAgdm9pZCBzZXRI
YXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpIHsgbV9oYXNBbm9ueW1vdXNJbmxpbmVCbG9jayA9IHRy
dWU7IH0KKworICAgIFJlbmRlckJsb2NrKiBhbm9ueW1vdXNJbmxpbmVCbG9jaygpIGNvbnN0Owor
CiBwcm90ZWN0ZWQ6CiAgICAgLy8gV2hlcmUgdGhpcyBsaW5lIGVuZGVkLiAgVGhlIGV4YWN0IG9i
amVjdCBhbmQgdGhlIHBvc2l0aW9uIHdpdGhpbiB0aGF0IG9iamVjdCBhcmUgc3RvcmVkIHNvIHRo
YXQKICAgICAvLyB3ZSBjYW4gY3JlYXRlIGFuIElubGluZUl0ZXJhdG9yIGJlZ2lubmluZyBqdXN0
IGFmdGVyIHRoZSBlbmQgb2YgdGhpcyBsaW5lLgpAQCAtMTUyLDYgKzE1OCw4IEBAIHByb3RlY3Rl
ZDoKICAgICBXVEY6OlVuaWNvZGU6OkRpcmVjdGlvbiBtX2xpbmVCcmVha0JpZGlTdGF0dXNFb3Ig
OiA1OwogICAgIFdURjo6VW5pY29kZTo6RGlyZWN0aW9uIG1fbGluZUJyZWFrQmlkaVN0YXR1c0xh
c3RTdHJvbmcgOiA1OwogICAgIFdURjo6VW5pY29kZTo6RGlyZWN0aW9uIG1fbGluZUJyZWFrQmlk
aVN0YXR1c0xhc3QgOiA1OworICAgIAorICAgIGJvb2wgbV9oYXNBbm9ueW1vdXNJbmxpbmVCbG9j
ayA6IDE7CiB9OwogCiBpbmxpbmUgdm9pZCBSb290SW5saW5lQm94OjpzZXRMaW5lVG9wQm90dG9t
UG9zaXRpb25zKGludCB0b3AsIGludCBib3R0b20pIApAQCAtMTYwLDYgKzE2OCwyNiBAQCBpbmxp
bmUgdm9pZCBSb290SW5saW5lQm94OjpzZXRMaW5lVG9wQm90CiAgICAgbV9saW5lQm90dG9tID0g
Ym90dG9tOyAKIH0KIAorLy8gRm9yIGFub255bW91cyBpbmxpbmUgYmxvY2sgb2JqZWN0cy4KK2Ns
YXNzIFJvb3RBbm9ueW1vdXNJbmxpbmVCbG9ja0JveCA6IHB1YmxpYyBSb290SW5saW5lQm94Cit7
CitwdWJsaWM6CisgICAgUm9vdEFub255bW91c0lubGluZUJsb2NrQm94KFJlbmRlck9iamVjdCog
cm9vdEJsb2NrLCBSZW5kZXJCbG9jayogYW5vbnltb3VzQmxvY2spCisgICAgICAgIDogUm9vdElu
bGluZUJveChyb290QmxvY2spCisgICAgICAgICwgbV9hbm9ueW1vdXNJbmxpbmVCbG9jayhhbm9u
eW1vdXNCbG9jaykKKyAgICB7CisgICAgICAgIHNldEhhc0Fub255bW91c0lubGluZUJsb2NrKCk7
CisgICAgfQorICAgIAorICAgIFJlbmRlckJsb2NrKiBpbmxpbmVCbG9jaygpIGNvbnN0IHsgcmV0
dXJuIG1fYW5vbnltb3VzSW5saW5lQmxvY2s7IH0KKyAgICAKKyAgICB2aXJ0dWFsIHZvaWQgcGFp
bnQoUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgaW50IHR4LCBpbnQgdHksIExp
bmVCb3hQYWludEluZm8mKTsKKyAgICB2aXJ0dWFsIGJvb2wgbm9kZUF0UG9pbnQoY29uc3QgSGl0
VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVzdWx0JiwgaW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0
eSwgSGl0VGVzdEFjdGlvbiwgTGluZUJveEhpdFRlc3RJbmZvJik7CisgICAgCitwcml2YXRlOgor
ICAgIFJlbmRlckJsb2NrKiBtX2Fub255bW91c0lubGluZUJsb2NrOworfTsKKwogfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQogCiAjZW5kaWYgLy8gUm9vdElubGluZUJveF9oCkluZGV4OiBXZWJDb3Jl
L3JlbmRlcmluZy9TVkdJbmxpbmVUZXh0Qm94LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3Jl
bmRlcmluZy9TVkdJbmxpbmVUZXh0Qm94LmNwcAkocmV2aXNpb24gNTQ2NjQpCisrKyBXZWJDb3Jl
L3JlbmRlcmluZy9TVkdJbmxpbmVUZXh0Qm94LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjkxLDcg
KzI5MSw3IEBAIGludCBTVkdJbmxpbmVUZXh0Qm94Ojpwb3NpdGlvbkZvck9mZnNldCgKICAgICBy
ZXR1cm4gMDsKIH0KIAotYm9vbCBTVkdJbmxpbmVUZXh0Qm94Ojpub2RlQXRQb2ludChjb25zdCBI
aXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmIHJlc3VsdCwgaW50IHgsIGludCB5LCBpbnQg
dHgsIGludCB0eSkKK2Jvb2wgU1ZHSW5saW5lVGV4dEJveDo6bm9kZUF0UG9pbnQoY29uc3QgSGl0
VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVzdWx0JiByZXN1bHQsIGludCB4LCBpbnQgeSwgaW50IHR4
LCBpbnQgdHksIEhpdFRlc3RBY3Rpb24sIExpbmVCb3hIaXRUZXN0SW5mbyYpCiB7CiAgICAgQVNT
RVJUKCFpc0xpbmVCcmVhaygpKTsKIApJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvU1ZHSW5saW5l
VGV4dEJveC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1NWR0lubGluZVRleHRC
b3guaAkocmV2aXNpb24gNTQ2NjQpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9TVkdJbmxpbmVUZXh0
Qm94LmgJKHdvcmtpbmcgY29weSkKQEAgLTYxLDcgKzYxLDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUg
ewogICAgICAgICB2aXJ0dWFsIGludCBvZmZzZXRGb3JQb3NpdGlvbihpbnQgeCwgYm9vbCBpbmNs
dWRlUGFydGlhbEdseXBocyA9IHRydWUpIGNvbnN0OwogICAgICAgICB2aXJ0dWFsIGludCBwb3Np
dGlvbkZvck9mZnNldChpbnQgb2Zmc2V0KSBjb25zdDsKIAotICAgICAgICB2aXJ0dWFsIGJvb2wg
bm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVzdWx0JiwgaW50IHgs
IGludCB5LCBpbnQgdHgsIGludCB0eSk7CisgICAgICAgIHZpcnR1YWwgYm9vbCBub2RlQXRQb2lu
dChjb25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBpbnQgeCwgaW50IHksIGlu
dCB0eCwgaW50IHR5LCBIaXRUZXN0QWN0aW9uLCBMaW5lQm94SGl0VGVzdEluZm8mKTsKICAgICAg
ICAgdmlydHVhbCBJbnRSZWN0IHNlbGVjdGlvblJlY3QoaW50IGFic3gsIGludCBhYnN5LCBpbnQg
c3RhcnRQb3MsIGludCBlbmRQb3MpOwogCiAgICAgICAgIC8vIFNWR3MgY3VzdG9tIHBhaW50IHRl
eHQgbWV0aG9kCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>48648</attachid>
            <date>2010-02-12 09:08:37 -0800</date>
            <delta_ts>2010-02-15 11:57:16 -0800</delta_ts>
            <desc>Sync to ToT</desc>
            <filename>patch.txt</filename>
            <type>text/plain</type>
            <size>143821</size>
            <attacher name="Dave Hyatt">hyatt</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0LmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eVJlbmRl
ck9iamVjdC5jcHAJKHJldmlzaW9uIDU0NzI3KQorKysgV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0Fj
Y2Vzc2liaWxpdHlSZW5kZXJPYmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01NjcsMTIgKzU2
Nyw4IEBAIEVsZW1lbnQqIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmFuY2gKICAgICBSZW5k
ZXJPYmplY3QqIGN1cnJSZW5kZXJlcjsKICAgICAKICAgICAvLyBTZWFyY2ggdXAgdGhlIHJlbmRl
ciB0cmVlIGZvciBhIFJlbmRlck9iamVjdCB3aXRoIGEgRE9NIG5vZGUuICBEZWZlciB0byBhbiBl
YXJsaWVyIGNvbnRpbnVhdGlvbiwgdGhvdWdoLgotICAgIGZvciAoY3VyclJlbmRlcmVyID0gbV9y
ZW5kZXJlcjsgY3VyclJlbmRlcmVyICYmICFjdXJyUmVuZGVyZXItPm5vZGUoKTsgY3VyclJlbmRl
cmVyID0gY3VyclJlbmRlcmVyLT5wYXJlbnQoKSkgewotICAgICAgICBpZiAoY3VyclJlbmRlcmVy
LT5pc1JlbmRlckJsb2NrKCkpIHsKLSAgICAgICAgICAgIFJlbmRlcklubGluZSogY29udGludWF0
aW9uID0gdG9SZW5kZXJCbG9jayhjdXJyUmVuZGVyZXIpLT5pbmxpbmVDb250aW51YXRpb24oKTsK
LSAgICAgICAgICAgIGlmIChjb250aW51YXRpb24pCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNh
Y2hlLT5nZXRPckNyZWF0ZShjb250aW51YXRpb24pLT5hbmNob3JFbGVtZW50KCk7Ci0gICAgICAg
IH0KKyAgICBmb3IgKGN1cnJSZW5kZXJlciA9IG1fcmVuZGVyZXI7IGN1cnJSZW5kZXJlciAmJiAh
Y3VyclJlbmRlcmVyLT5ub2RlKCk7IGN1cnJSZW5kZXJlciA9IGN1cnJSZW5kZXJlci0+cGFyZW50
KCkpCisgICAgewogICAgIH0KICAgICAKICAgICAvLyBiYWlsIGlmIG5vbmUgZm91bmQKSW5kZXg6
IFdlYkNvcmUvcmVuZGVyaW5nL0VsbGlwc2lzQm94LmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3JlbmRlcmluZy9FbGxpcHNpc0JveC5jcHAJKHJldmlzaW9uIDU0NzI3KQorKysgV2ViQ29yZS9y
ZW5kZXJpbmcvRWxsaXBzaXNCb3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC02NCw3ICs2NCw4IEBA
IHZvaWQgRWxsaXBzaXNCb3g6OnBhaW50KFJlbmRlck9iamVjdDo6UGEKICAgICAgICAgLy8gUGFp
bnQgdGhlIG1hcmt1cCBib3gKICAgICAgICAgdHggKz0gbV94ICsgbV93aWR0aCAtIG1fbWFya3Vw
Qm94LT54KCk7CiAgICAgICAgIHR5ICs9IG1feSArIHN0eWxlLT5mb250KCkuYXNjZW50KCkgLSAo
bV9tYXJrdXBCb3gtPnkoKSArIG1fbWFya3VwQm94LT5yZW5kZXJlcigpLT5zdHlsZShtX2ZpcnN0
TGluZSktPmZvbnQoKS5hc2NlbnQoKSk7Ci0gICAgICAgIG1fbWFya3VwQm94LT5wYWludChwYWlu
dEluZm8sIHR4LCB0eSk7CisgICAgICAgIExpbmVCb3hQYWludEluZm8gbGluZUJveFBhaW50SW5m
bzsKKyAgICAgICAgbV9tYXJrdXBCb3gtPnBhaW50KHBhaW50SW5mbywgdHgsIHR5LCBsaW5lQm94
UGFpbnRJbmZvKTsKICAgICB9CiB9CiAKQEAgLTk3LDcgKzk4LDcgQEAgdm9pZCBFbGxpcHNpc0Jv
eDo6cGFpbnRTZWxlY3Rpb24oR3JhcGhpYwogICAgIGNvbnRleHQtPnJlc3RvcmUoKTsKIH0KIAot
Ym9vbCBFbGxpcHNpc0JveDo6bm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmIHJlcXVl
c3QsIEhpdFRlc3RSZXN1bHQmIHJlc3VsdCwgaW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSkK
K2Jvb2wgRWxsaXBzaXNCb3g6Om5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiByZXF1
ZXN0LCBIaXRUZXN0UmVzdWx0JiByZXN1bHQsIGludCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHks
IEhpdFRlc3RBY3Rpb24gaGl0VGVzdEFjdGlvbiwgTGluZUJveEhpdFRlc3RJbmZvJiBoaXRUZXN0
SW5mbykKIHsKICAgICB0eCArPSBtX3g7CiAgICAgdHkgKz0gbV95OwpAQCAtMTA3LDcgKzEwOCw3
IEBAIGJvb2wgRWxsaXBzaXNCb3g6Om5vZGVBdFBvaW50KGNvbnN0IEhpdFQKICAgICAgICAgUmVu
ZGVyU3R5bGUqIHN0eWxlID0gbV9yZW5kZXJlci0+c3R5bGUobV9maXJzdExpbmUpOwogICAgICAg
ICBpbnQgbXR4ID0gdHggKyBtX3dpZHRoIC0gbV9tYXJrdXBCb3gtPngoKTsKICAgICAgICAgaW50
IG10eSA9IHR5ICsgc3R5bGUtPmZvbnQoKS5hc2NlbnQoKSAtIChtX21hcmt1cEJveC0+eSgpICsg
bV9tYXJrdXBCb3gtPnJlbmRlcmVyKCktPnN0eWxlKG1fZmlyc3RMaW5lKS0+Zm9udCgpLmFzY2Vu
dCgpKTsKLSAgICAgICAgaWYgKG1fbWFya3VwQm94LT5ub2RlQXRQb2ludChyZXF1ZXN0LCByZXN1
bHQsIHgsIHksIG10eCwgbXR5KSkgeworICAgICAgICBpZiAobV9tYXJrdXBCb3gtPm5vZGVBdFBv
aW50KHJlcXVlc3QsIHJlc3VsdCwgeCwgeSwgbXR4LCBtdHksIGhpdFRlc3RBY3Rpb24sIGhpdFRl
c3RJbmZvKSkgewogICAgICAgICAgICAgcmVuZGVyZXIoKS0+dXBkYXRlSGl0VGVzdFJlc3VsdChy
ZXN1bHQsIEludFBvaW50KHggLSBtdHgsIHkgLSBtdHkpKTsKICAgICAgICAgICAgIHJldHVybiB0
cnVlOwogICAgICAgICB9CkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9FbGxpcHNpc0JveC5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL0VsbGlwc2lzQm94LmgJKHJldmlzaW9uIDU0
NzI3KQorKysgV2ViQ29yZS9yZW5kZXJpbmcvRWxsaXBzaXNCb3guaAkod29ya2luZyBjb3B5KQpA
QCAtMzksOCArMzksOCBAQCBwdWJsaWM6CiAgICAgewogICAgIH0KIAotICAgIHZpcnR1YWwgdm9p
ZCBwYWludChSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5KTsKLSAgICB2
aXJ0dWFsIGJvb2wgbm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVz
dWx0JiwgaW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSk7CisgICAgdm9pZCBwYWludChSZW5k
ZXJPYmplY3Q6OlBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5KTsKKyAgICB2aXJ0dWFsIGJvb2wg
bm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVzdWx0JiwgaW50IHgs
IGludCB5LCBpbnQgdHgsIGludCB0eSwgSGl0VGVzdEFjdGlvbiwgTGluZUJveEhpdFRlc3RJbmZv
Jik7CiAgICAgdm9pZCBzZXRTZWxlY3Rpb25TdGF0ZShSZW5kZXJPYmplY3Q6OlNlbGVjdGlvblN0
YXRlIHMpIHsgbV9zZWxlY3Rpb25TdGF0ZSA9IHM7IH0KICAgICBJbnRSZWN0IHNlbGVjdGlvblJl
Y3QoaW50IHR4LCBpbnQgdHkpOwogCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVCb3gu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUJveC5jcHAJKHJldmlz
aW9uIDU0NzI3KQorKysgV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lQm94LmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgIkhpdFRlc3RSZXN1bHQuaCIKICNpbmNs
dWRlICJJbmxpbmVGbG93Qm94LmgiCiAjaW5jbHVkZSAiUmVuZGVyQXJlbmEuaCIKLSNpbmNsdWRl
ICJSZW5kZXJCb3guaCIKKyNpbmNsdWRlICJSZW5kZXJWaWV3LmgiCiAjaW5jbHVkZSAiUm9vdElu
bGluZUJveC5oIgogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwpAQCAtMTU5LDkgKzE1OSwyNyBAQCB2
b2lkIElubGluZUJveDo6YWRqdXN0UG9zaXRpb24oaW50IGR4LCBpCiAgICAgfQogfQogCi12b2lk
IElubGluZUJveDo6cGFpbnQoUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgaW50
IHR4LCBpbnQgdHkpCit2b2lkIElubGluZUJveDo6cGFpbnQoUmVuZGVyT2JqZWN0OjpQYWludElu
Zm8mIHBhaW50SW5mbywgaW50IHR4LCBpbnQgdHksIExpbmVCb3hQYWludEluZm8mIGxpbmVCb3hQ
YWludEluZm8pCiB7Ci0gICAgaWYgKCFyZW5kZXJlcigpLT5zaG91bGRQYWludFdpdGhpblJvb3Qo
cGFpbnRJbmZvKSB8fCAocGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VGb3JlZ3JvdW5kICYm
IHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlU2VsZWN0aW9uKSkKKyAgICBpZiAoIXJlbmRl
cmVyKCktPnNob3VsZFBhaW50V2l0aGluUm9vdChwYWludEluZm8pKQorICAgICAgICByZXR1cm47
CisgICAgCisgICAgUmVuZGVyQmxvY2sqIGFub255bW91c0lubGluZUJsb2NrID0gbGluZUJveFBh
aW50SW5mby5hbm9ueW1vdXNJbmxpbmVCbG9jazsKKyAgICBpZiAoYW5vbnltb3VzSW5saW5lQmxv
Y2sgPT0gcmVuZGVyZXIoKSkgeworICAgICAgICAvLyBUcmVhdCBwYWludGluZyBvZiBhIHNwZWNp
YWwgaW5saW5lLWJsb2NrIGxpbmUgbGlrZSB0aGUgcGFpbnRpbmcgb2YgYSBub3JtYWwgYmxvY2sg
YW5kIGdvIHRocm91Z2ggYWxsIHBoYXNlcy4KKyAgICAgICAgUGFpbnRQaGFzZSBuZXdQaGFzZSA9
IChwYWludEluZm8ucGhhc2UgPT0gUGFpbnRQaGFzZUNoaWxkT3V0bGluZXMpID8gUGFpbnRQaGFz
ZU91dGxpbmUgOiBwYWludEluZm8ucGhhc2U7CisgICAgICAgIG5ld1BoYXNlID0gKG5ld1BoYXNl
ID09IFBhaW50UGhhc2VDaGlsZEJsb2NrQmFja2dyb3VuZHMpID8gUGFpbnRQaGFzZUNoaWxkQmxv
Y2tCYWNrZ3JvdW5kIDogbmV3UGhhc2U7CisgICAgCisgICAgICAgIC8vIFdlIGRvbid0IHBhaW50
IG91ciBvd24gYmFja2dyb3VuZCwgYnV0IHdlIGRvIGxldCB0aGUgY2hpbGQgcGFpbnQgaXRzIGJh
Y2tncm91bmQuCisgICAgICAgIFJlbmRlck9iamVjdDo6UGFpbnRJbmZvIGluZm8ocGFpbnRJbmZv
KTsKKyAgICAgICAgaW5mby5waGFzZSA9IG5ld1BoYXNlOworICAgICAgICBpbmZvLnBhaW50aW5n
Um9vdCA9IHJlbmRlcmVyKCktPnBhaW50aW5nUm9vdEZvckNoaWxkcmVuKHBhaW50SW5mbyk7Cisg
ICAgICAgIGlmICghYW5vbnltb3VzSW5saW5lQmxvY2stPmhhc1NlbGZQYWludGluZ0xheWVyKCkp
CisgICAgICAgICAgICBhbm9ueW1vdXNJbmxpbmVCbG9jay0+cGFpbnQoaW5mbywgdHgsIHR5KTsK
KyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChwYWludEluZm8ucGhhc2UgIT0gUGFp
bnRQaGFzZUZvcmVncm91bmQgJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VTZWxlY3Rp
b24pCiAgICAgICAgIHJldHVybjsKIAogICAgIC8vIFBhaW50IGFsbCBwaGFzZXMgb2YgcmVwbGFj
ZWQgZWxlbWVudHMgYXRvbWljYWxseSwgYXMgdGhvdWdoIHRoZSByZXBsYWNlZCBlbGVtZW50IGVz
dGFibGlzaGVkIGl0cwpAQCAtMTgzLDkgKzIwMSwxNyBAQCB2b2lkIElubGluZUJveDo6cGFpbnQo
UmVuZGVyT2JqZWN0OjpQYWluCiAgICAgfQogfQogCi1ib29sIElubGluZUJveDo6bm9kZUF0UG9p
bnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmIHJlcXVlc3QsIEhpdFRlc3RSZXN1bHQmIHJlc3VsdCwg
aW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSkKK2Jvb2wgSW5saW5lQm94Ojpub2RlQXRQb2lu
dChjb25zdCBIaXRUZXN0UmVxdWVzdCYgcmVxdWVzdCwgSGl0VGVzdFJlc3VsdCYgcmVzdWx0LCBp
bnQgeCwgaW50IHksIGludCB0eCwgaW50IHR5LCBIaXRUZXN0QWN0aW9uIGhpdFRlc3RBY3Rpb24s
IExpbmVCb3hIaXRUZXN0SW5mbyYgaGl0VGVzdEluZm8pCiB7Ci0gICAgLy8gSGl0IHRlc3QgYWxs
IHBoYXNlcyBvZiByZXBsYWNlZCBlbGVtZW50cyBhdG9taWNhbGx5LCBhcyB0aG91Z2ggdGhlIHJl
cGxhY2VkIGVsZW1lbnQgZXN0YWJsaXNoZWQgaXRzCisgICAgLy8gSWYgd2UgYXJlIGFuIGFub255
bW91cyBpbmxpbmUgYmxvY2ssIGhvbm9yIGhpdCB0ZXN0IHBoYXNlcy4KKyAgICBpZiAoaGl0VGVz
dEluZm8uYW5vbnltb3VzSW5saW5lQmxvY2sgPT0gcmVuZGVyZXIoKSkgeworICAgICAgICBIaXRU
ZXN0QWN0aW9uIGNoaWxkSGl0VGVzdCA9IGhpdFRlc3RBY3Rpb247CisgICAgICAgIGlmIChoaXRU
ZXN0QWN0aW9uID09IEhpdFRlc3RDaGlsZEJsb2NrQmFja2dyb3VuZHMpCisgICAgICAgICAgICBj
aGlsZEhpdFRlc3QgPSBIaXRUZXN0Q2hpbGRCbG9ja0JhY2tncm91bmQ7CisgICAgICAgIHJldHVy
biBoaXRUZXN0SW5mby5hbm9ueW1vdXNJbmxpbmVCbG9jay0+bm9kZUF0UG9pbnQocmVxdWVzdCwg
cmVzdWx0LCB4LCB5LCB0eCwgdHksIGNoaWxkSGl0VGVzdCk7CisgICAgfQorCisgICAgLy8gT3Ro
ZXJ3aXNlIGhpdCB0ZXN0IGFsbCBwaGFzZXMgb2YgcmVwbGFjZWQgZWxlbWVudHMgYXRvbWljYWxs
eSwgYXMgdGhvdWdoIHRoZSByZXBsYWNlZCBlbGVtZW50IGVzdGFibGlzaGVkIGl0cwogICAgIC8v
IG93biBzdGFja2luZyBjb250ZXh0LiAgKFNlZSBBcHBlbmRpeCBFLjIsIHNlY3Rpb24gNi40IG9u
IGlubGluZSBibG9jay90YWJsZSBlbGVtZW50cyBpbiB0aGUgQ1NTMi4xCiAgICAgLy8gc3BlY2lm
aWNhdGlvbi4pCiAgICAgcmV0dXJuIHJlbmRlcmVyKCktPmhpdFRlc3QocmVxdWVzdCwgcmVzdWx0
LCBJbnRQb2ludCh4LCB5KSwgdHgsIHR5KTsKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL0lubGlu
ZUJveC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUJveC5oCShyZXZp
c2lvbiA1NDcyNykKKysrIFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUJveC5oCSh3b3JraW5nIGNv
cHkpCkBAIC0zMCw2ICszMCwyMyBAQCBjbGFzcyBIaXRUZXN0UmVxdWVzdDsKIGNsYXNzIEhpdFRl
c3RSZXN1bHQ7CiBjbGFzcyBSb290SW5saW5lQm94OwogCitzdHJ1Y3QgTGluZUJveFBhaW50SW5m
bworeworICAgIExpbmVCb3hQYWludEluZm8oKQorICAgICAgICA6IGFub255bW91c0lubGluZUJs
b2NrKDApCisgICAgeyB9CisgICAgCisgICAgUmVuZGVyQmxvY2sqIGFub255bW91c0lubGluZUJs
b2NrOworfTsKKworc3RydWN0IExpbmVCb3hIaXRUZXN0SW5mbworeworICAgIExpbmVCb3hIaXRU
ZXN0SW5mbygpCisgICAgICAgIDogYW5vbnltb3VzSW5saW5lQmxvY2soMCkKKyAgICB7IH0KKyAg
ICAKKyAgICBSZW5kZXJCbG9jayogYW5vbnltb3VzSW5saW5lQmxvY2s7Cit9OwogCiAvLyBJbmxp
bmVCb3ggcmVwcmVzZW50cyBhIHJlY3RhbmdsZSB0aGF0IG9jY3VycyBvbiBhIGxpbmUuICBJdCBj
b3JyZXNwb25kcyB0bwogLy8gc29tZSBSZW5kZXJPYmplY3QgKGkuZS4sIGl0IHJlcHJlc2VudHMg
YSBwb3J0aW9uIG9mIHRoYXQgUmVuZGVyT2JqZWN0KS4KQEAgLTQ4LDkgKzY1LDcgQEAgcHVibGlj
OgogICAgICAgICAsIG1fYmlkaUVtYmVkZGluZ0xldmVsKDApCiAgICAgICAgICwgbV9kaXJ0eShm
YWxzZSkKICAgICAgICAgLCBtX2V4dHJhY3RlZChmYWxzZSkKLSNpZiBFTkFCTEUoU1ZHKQogICAg
ICAgICAsIG1faGFzVmlydHVhbEhlaWdodChmYWxzZSkKLSNlbmRpZgogICAgICAgICAsIG1fZW5k
c1dpdGhCcmVhayhmYWxzZSkKICAgICAgICAgLCBtX2hhc1NlbGVjdGVkQ2hpbGRyZW4oZmFsc2Up
CiAgICAgICAgICwgbV9oYXNFbGxpcHNpc0JveChmYWxzZSkKQEAgLTgxLDkgKzk2LDcgQEAgcHVi
bGljOgogICAgICAgICAsIG1fYmlkaUVtYmVkZGluZ0xldmVsKDApCiAgICAgICAgICwgbV9kaXJ0
eShkaXJ0eSkKICAgICAgICAgLCBtX2V4dHJhY3RlZChleHRyYWN0ZWQpCi0jaWYgRU5BQkxFKFNW
RykKICAgICAgICAgLCBtX2hhc1ZpcnR1YWxIZWlnaHQoZmFsc2UpCi0jZW5kaWYKICAgICAgICAg
LCBtX2VuZHNXaXRoQnJlYWsoZmFsc2UpCiAgICAgICAgICwgbV9oYXNTZWxlY3RlZENoaWxkcmVu
KGZhbHNlKSAgIAogICAgICAgICAsIG1faGFzRWxsaXBzaXNCb3goZmFsc2UpCkBAIC0xMTIsOCAr
MTI1LDggQEAgcHVibGljOgogCiAgICAgdmlydHVhbCB2b2lkIGFkanVzdFBvc2l0aW9uKGludCBk
eCwgaW50IGR5KTsKIAotICAgIHZpcnR1YWwgdm9pZCBwYWludChSZW5kZXJPYmplY3Q6OlBhaW50
SW5mbyYsIGludCB0eCwgaW50IHR5KTsKLSAgICB2aXJ0dWFsIGJvb2wgbm9kZUF0UG9pbnQoY29u
c3QgSGl0VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVzdWx0JiwgaW50IHgsIGludCB5LCBpbnQgdHgs
IGludCB0eSk7CisgICAgdmlydHVhbCB2b2lkIHBhaW50KFJlbmRlck9iamVjdDo6UGFpbnRJbmZv
JiwgaW50IHR4LCBpbnQgdHksIExpbmVCb3hQYWludEluZm8mKTsKKyAgICB2aXJ0dWFsIGJvb2wg
bm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVzdWx0JiwgaW50IHgs
IGludCB5LCBpbnQgdHgsIGludCB0eSwgSGl0VGVzdEFjdGlvbiwgTGluZUJveEhpdFRlc3RJbmZv
Jik7CiAKICAgICAvLyBPdmVybG9hZGVkIG5ldyBvcGVyYXRvci4KICAgICB2b2lkKiBvcGVyYXRv
ciBuZXcoc2l6ZV90LCBSZW5kZXJBcmVuYSopIHRocm93KCk7CkBAIC0xMzksMTEgKzE1MiwxMSBA
QCBwdWJsaWM6CiAgICAgdmlydHVhbCBib29sIGlzUm9vdElubGluZUJveCgpIGNvbnN0IHsgcmV0
dXJuIGZhbHNlOyB9CiAjaWYgRU5BQkxFKFNWRykgCiAgICAgdmlydHVhbCBib29sIGlzU1ZHUm9v
dElubGluZUJveCgpIHsgcmV0dXJuIGZhbHNlOyB9CisjZW5kaWYKIAogICAgIGJvb2wgaGFzVmly
dHVhbEhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1faGFzVmlydHVhbEhlaWdodDsgfQogICAgIHZv
aWQgc2V0SGFzVmlydHVhbEhlaWdodCgpIHsgbV9oYXNWaXJ0dWFsSGVpZ2h0ID0gdHJ1ZTsgfQog
ICAgIHZpcnR1YWwgaW50IHZpcnR1YWxIZWlnaHQoKSBjb25zdCB7IEFTU0VSVF9OT1RfUkVBQ0hF
RCgpOyByZXR1cm4gMDsgfQotI2VuZGlmCiAgICAgCiAgICAgYm9vbCBpc0NvbnN0cnVjdGVkKCkg
eyByZXR1cm4gbV9jb25zdHJ1Y3RlZDsgfQogICAgIHZpcnR1YWwgdm9pZCBzZXRDb25zdHJ1Y3Rl
ZCgpCkBAIC0yMDUsNiArMjE4LDggQEAgcHVibGljOgogCiAgICAgaW50IGhlaWdodCgpIGNvbnN0
OwogCisgICAgSW50UmVjdCBmcmFtZVJlY3QoKSBjb25zdCB7IHJldHVybiBJbnRSZWN0KHgoKSwg
eSgpLCB3aWR0aCgpLCBoZWlnaHQoKSk7IH0KKwogICAgIGlubGluZSBpbnQgYmFzZWxpbmVQb3Np
dGlvbihib29sIGlzUm9vdExpbmVCb3gpIGNvbnN0IHsgcmV0dXJuIHJlbmRlcmVyKCktPmJhc2Vs
aW5lUG9zaXRpb24obV9maXJzdExpbmUsIGlzUm9vdExpbmVCb3gpOyB9CiAgICAgaW5saW5lIGlu
dCBsaW5lSGVpZ2h0KGJvb2wgaXNSb290TGluZUJveCkgY29uc3QgeyByZXR1cm4gcmVuZGVyZXIo
KS0+bGluZUhlaWdodChtX2ZpcnN0TGluZSwgaXNSb290TGluZUJveCk7IH0KIApJbmRleDogV2Vi
Q29yZS9yZW5kZXJpbmcvSW5saW5lRmxvd0JveC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9y
ZW5kZXJpbmcvSW5saW5lRmxvd0JveC5jcHAJKHJldmlzaW9uIDU0NzI3KQorKysgV2ViQ29yZS9y
ZW5kZXJpbmcvSW5saW5lRmxvd0JveC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMyLDYgKzMyLDcg
QEAKICNpbmNsdWRlICJSZW5kZXJMYXllci5oIgogI2luY2x1ZGUgIlJlbmRlckxpc3RNYXJrZXIu
aCIKICNpbmNsdWRlICJSZW5kZXJUYWJsZUNlbGwuaCIKKyNpbmNsdWRlICJSZW5kZXJWaWV3Lmgi
CiAjaW5jbHVkZSAiUm9vdElubGluZUJveC5oIgogI2luY2x1ZGUgIlRleHQuaCIKIApAQCAtMjI3
LDE0ICsyMjgsMTMgQEAgdm9pZCBJbmxpbmVGbG93Qm94OjpkZXRlcm1pbmVTcGFjaW5nRm9yRgog
ICAgICAgICAvLyAoMykgVGhlIGxpbmUgbWF5IGVuZCBvbiB0aGUgaW5saW5lLiAgSWYgd2UgYXJl
IHRoZSBsYXN0IGNoaWxkIChjbGltYmluZyB1cAogICAgICAgICAvLyB0aGUgZW5kIG9iamVjdCdz
IGNoYWluKSwgdGhlbiB3ZSBqdXN0IGNsb3NlZCBhcyB3ZWxsLgogICAgICAgICBpZiAoIWxpbmVC
b3hMaXN0LT5sYXN0TGluZUJveCgpLT5pc0NvbnN0cnVjdGVkKCkpIHsKLSAgICAgICAgICAgIFJl
bmRlcklubGluZSogaW5saW5lRmxvdyA9IHRvUmVuZGVySW5saW5lKHJlbmRlcmVyKCkpOwogICAg
ICAgICAgICAgaWYgKGx0cikgewogICAgICAgICAgICAgICAgIGlmICghbmV4dExpbmVCb3goKSAm
JgotICAgICAgICAgICAgICAgICAgICAoKGxhc3RMaW5lICYmICFpbmxpbmVGbG93LT5jb250aW51
YXRpb24oKSkgfHwgbmV4dE9uTGluZUV4aXN0cygpIHx8IG9uRW5kQ2hhaW4oZW5kT2JqZWN0KSkp
CisgICAgICAgICAgICAgICAgICAgIChsYXN0TGluZSB8fCBuZXh0T25MaW5lRXhpc3RzKCkgfHwg
b25FbmRDaGFpbihlbmRPYmplY3QpKSkKICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZVJpZ2h0
RWRnZSA9IHRydWU7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmICgo
IXByZXZMaW5lQm94KCkgfHwgcHJldkxpbmVCb3goKS0+aXNDb25zdHJ1Y3RlZCgpKSAmJgotICAg
ICAgICAgICAgICAgICAgICAoKGxhc3RMaW5lICYmICFpbmxpbmVGbG93LT5jb250aW51YXRpb24o
KSkgfHwgcHJldk9uTGluZUV4aXN0cygpIHx8IG9uRW5kQ2hhaW4oZW5kT2JqZWN0KSkpCisgICAg
ICAgICAgICAgICAgICAgIChsYXN0TGluZSB8fCBwcmV2T25MaW5lRXhpc3RzKCkgfHwgb25FbmRD
aGFpbihlbmRPYmplY3QpKSkKICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZUxlZnRFZGdlID0g
dHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNTA0LDcgKzUwNCw3IEBAIHZvaWQg
SW5saW5lRmxvd0JveDo6cGxhY2VCb3hlc1ZlcnRpY2FsbHkKICAgICAgICAgICAgICAgICBuZXdZ
IC09IGN1cnItPmJveE1vZGVsT2JqZWN0KCktPmJvcmRlclRvcCgpICsgY3Vyci0+Ym94TW9kZWxP
YmplY3QoKS0+cGFkZGluZ1RvcCgpOwogICAgICAgICB9IGVsc2UgaWYgKCFjdXJyLT5yZW5kZXJl
cigpLT5pc0JSKCkpIHsKICAgICAgICAgICAgIFJlbmRlckJveCogYm94ID0gdG9SZW5kZXJCb3go
Y3Vyci0+cmVuZGVyZXIoKSk7Ci0gICAgICAgICAgICBuZXdZICs9IGJveC0+bWFyZ2luVG9wKCk7
CisgICAgICAgICAgICBuZXdZICs9IGN1cnItPnJlbmRlcmVyKCktPmlzQW5vbnltb3VzSW5saW5l
QmxvY2soKSA/IDAgOiBib3gtPm1hcmdpblRvcCgpOwogICAgICAgICB9CiAKICAgICAgICAgY3Vy
ci0+c2V0WShuZXdZKTsKQEAgLTU5OCw4ICs1OTgsMTIgQEAgdm9pZCBJbmxpbmVGbG93Qm94Ojpj
b21wdXRlVmVydGljYWxPdmVyZgogICAgIHNldFZlcnRpY2FsT3ZlcmZsb3dQb3NpdGlvbnModG9w
TGF5b3V0T3ZlcmZsb3csIGJvdHRvbUxheW91dE92ZXJmbG93LCB0b3BWaXN1YWxPdmVyZmxvdywg
Ym90dG9tVmlzdWFsT3ZlcmZsb3csIGJveEhlaWdodCk7CiB9CiAKLWJvb2wgSW5saW5lRmxvd0Jv
eDo6bm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmIHJlcXVlc3QsIEhpdFRlc3RSZXN1
bHQmIHJlc3VsdCwgaW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSkKK2Jvb2wgSW5saW5lRmxv
d0JveDo6bm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmIHJlcXVlc3QsIEhpdFRlc3RS
ZXN1bHQmIHJlc3VsdCwgaW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSwgSGl0VGVzdEFjdGlv
biBoaXRUZXN0QWN0aW9uLCBMaW5lQm94SGl0VGVzdEluZm8mIGhpdFRlc3RJbmZvKQogeworICAg
IC8vIEFzIGxvbmcgYXMgd2UgZG9uJ3QgaGF2ZSBhbiBhbm9ueW1vdXMgaW5saW5lIGJsb2NrIG9u
IG91ciBsaW5lLCB3ZSByZXN0cmljdCBvdXIgaGl0IHRlc3Rpbmcgb25seSB0byB0aGUgZm9yZWdy
b3VuZCBwaGFzZS4KKyAgICBpZiAoIWhpdFRlc3RJbmZvLmFub255bW91c0lubGluZUJsb2NrICYm
IGhpdFRlc3RBY3Rpb24gIT0gSGl0VGVzdEZvcmVncm91bmQpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKwogICAgIEludFJlY3Qgb3ZlcmZsb3dSZWN0KHZpc2libGVPdmVyZmxvd1JlY3QoKSk7CiAg
ICAgb3ZlcmZsb3dSZWN0Lm1vdmUodHgsIHR5KTsKICAgICBpZiAoIW92ZXJmbG93UmVjdC5jb250
YWlucyh4LCB5KSkKQEAgLTYwNyw3ICs2MTEsNyBAQCBib29sIElubGluZUZsb3dCb3g6Om5vZGVB
dFBvaW50KGNvbnN0IEhpCiAKICAgICAvLyBDaGVjayBjaGlsZHJlbiBmaXJzdC4KICAgICBmb3Ig
KElubGluZUJveCogY3VyciA9IGxhc3RDaGlsZCgpOyBjdXJyOyBjdXJyID0gY3Vyci0+cHJldk9u
TGluZSgpKSB7Ci0gICAgICAgIGlmICgoY3Vyci0+cmVuZGVyZXIoKS0+aXNUZXh0KCkgfHwgIWN1
cnItPmJveE1vZGVsT2JqZWN0KCktPmhhc1NlbGZQYWludGluZ0xheWVyKCkpICYmIGN1cnItPm5v
ZGVBdFBvaW50KHJlcXVlc3QsIHJlc3VsdCwgeCwgeSwgdHgsIHR5KSkgeworICAgICAgICBpZiAo
KGN1cnItPnJlbmRlcmVyKCktPmlzVGV4dCgpIHx8ICFjdXJyLT5ib3hNb2RlbE9iamVjdCgpLT5o
YXNTZWxmUGFpbnRpbmdMYXllcigpKSAmJiBjdXJyLT5ub2RlQXRQb2ludChyZXF1ZXN0LCByZXN1
bHQsIHgsIHksIHR4LCB0eSwgaGl0VGVzdEFjdGlvbiwgaGl0VGVzdEluZm8pKSB7CiAgICAgICAg
ICAgICByZW5kZXJlcigpLT51cGRhdGVIaXRUZXN0UmVzdWx0KHJlc3VsdCwgSW50UG9pbnQoeCAt
IHR4LCB5IC0gdHkpKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CkBAIC02
MjMsOCArNjI3LDE0IEBAIGJvb2wgSW5saW5lRmxvd0JveDo6bm9kZUF0UG9pbnQoY29uc3QgSGkK
ICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXZvaWQgSW5saW5lRmxvd0JveDo6cGFpbnQoUmVuZGVy
T2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgaW50IHR4LCBpbnQgdHkpCit2b2lkIElubGlu
ZUZsb3dCb3g6OnBhaW50KFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGludCB0
eCwgaW50IHR5LCBMaW5lQm94UGFpbnRJbmZvJiBsaW5lQm94UGFpbnRJbmZvKQogeworICAgIC8v
IEFzIGxvbmcgYXMgd2UgZG9uJ3QgaGF2ZSBhbiBhbm9ueW1vdXMgaW5saW5lIGJsb2NrIG9uIG91
ciBsaW5lLCB3ZSByZXN0cmljdCBvdXIgcGFpbnRpbmcgb25seSB0byBhIGZldyBwaGFzZXMuCisg
ICAgaWYgKCFsaW5lQm94UGFpbnRJbmZvLmFub255bW91c0lubGluZUJsb2NrICYmIChwYWludElu
Zm8ucGhhc2UgIT0gUGFpbnRQaGFzZUZvcmVncm91bmQgJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBh
aW50UGhhc2VTZWxlY3Rpb24gJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VPdXRsaW5l
IAorICAgICAgICAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZVNlbGZPdXRsaW5lICYm
IHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlQ2hpbGRPdXRsaW5lcyAmJiBwYWludEluZm8u
cGhhc2UgIT0gUGFpbnRQaGFzZVRleHRDbGlwCisgICAgICAgICYmIHBhaW50SW5mby5waGFzZSAh
PSBQYWludFBoYXNlTWFzaykpCisgICAgICAgIHJldHVybjsKKyAgICAKICAgICBJbnRSZWN0IG92
ZXJmbG93UmVjdCh2aXNpYmxlT3ZlcmZsb3dSZWN0KCkpOwogICAgIG92ZXJmbG93UmVjdC5pbmZs
YXRlKHJlbmRlcmVyKCktPm1heGltYWxPdXRsaW5lU2l6ZShwYWludEluZm8ucGhhc2UpKTsKICAg
ICBvdmVyZmxvd1JlY3QubW92ZSh0eCwgdHkpOwpAQCAtNjM4LDIzICs2NDgsMTcgQEAgdm9pZCBJ
bmxpbmVGbG93Qm94OjpwYWludChSZW5kZXJPYmplY3Q6OgogICAgICAgICAgICAgLy8gb3V0bGlu
ZXMuCiAgICAgICAgICAgICBpZiAocmVuZGVyZXIoKS0+c3R5bGUoKS0+dmlzaWJpbGl0eSgpID09
IFZJU0lCTEUgJiYgcmVuZGVyZXIoKS0+aGFzT3V0bGluZSgpICYmICFpc1Jvb3RJbmxpbmVCb3go
KSkgewogICAgICAgICAgICAgICAgIFJlbmRlcklubGluZSogaW5saW5lRmxvdyA9IHRvUmVuZGVy
SW5saW5lKHJlbmRlcmVyKCkpOwotICAgICAgICAgICAgICAgIGlmICgoaW5saW5lRmxvdy0+Y29u
dGludWF0aW9uKCkgfHwgaW5saW5lRmxvdy0+aXNJbmxpbmVDb250aW51YXRpb24oKSkgJiYgIWJv
eE1vZGVsT2JqZWN0KCktPmhhc1NlbGZQYWludGluZ0xheWVyKCkpIHsKLSAgICAgICAgICAgICAg
ICAgICAgLy8gQWRkIG91cnNlbHZlcyB0byB0aGUgY29udGFpbmluZyBibG9jayBvZiB0aGUgZW50
aXJlIGNvbnRpbnVhdGlvbiBzbyB0aGF0IGl0IGNhbgotICAgICAgICAgICAgICAgICAgICAvLyBw
YWludCB1cyBhdG9taWNhbGx5LgotICAgICAgICAgICAgICAgICAgICBSZW5kZXJCbG9jayogYmxv
Y2sgPSByZW5kZXJlcigpLT5jb250YWluaW5nQmxvY2soKS0+Y29udGFpbmluZ0Jsb2NrKCk7Ci0g
ICAgICAgICAgICAgICAgICAgIGJsb2NrLT5hZGRDb250aW51YXRpb25XaXRoT3V0bGluZSh0b1Jl
bmRlcklubGluZShyZW5kZXJlcigpLT5ub2RlKCktPnJlbmRlcmVyKCkpKTsKLSAgICAgICAgICAg
ICAgICB9IGVsc2UgaWYgKCFpbmxpbmVGbG93LT5pc0lubGluZUNvbnRpbnVhdGlvbigpKQotICAg
ICAgICAgICAgICAgICAgICBwYWludEluZm8ub3V0bGluZU9iamVjdHMtPmFkZChpbmxpbmVGbG93
KTsKKyAgICAgICAgICAgICAgICBwYWludEluZm8ub3V0bGluZU9iamVjdHMtPmFkZChpbmxpbmVG
bG93KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChwYWludEluZm8ucGhhc2Ug
PT0gUGFpbnRQaGFzZU1hc2spIHsKLSAgICAgICAgICAgIHBhaW50TWFzayhwYWludEluZm8sIHR4
LCB0eSk7CisgICAgICAgICAgICBwYWludE1hc2socGFpbnRJbmZvLCB0eCwgdHksIGxpbmVCb3hQ
YWludEluZm8pOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9IGVsc2UgewogICAgICAg
ICAgICAgLy8gMS4gUGFpbnQgb3VyIGJhY2tncm91bmQsIGJvcmRlciBhbmQgYm94LXNoYWRvdy4K
LSAgICAgICAgICAgIHBhaW50Qm94RGVjb3JhdGlvbnMocGFpbnRJbmZvLCB0eCwgdHkpOworICAg
ICAgICAgICAgcGFpbnRCb3hEZWNvcmF0aW9ucyhwYWludEluZm8sIHR4LCB0eSwgbGluZUJveFBh
aW50SW5mbyk7CiAKICAgICAgICAgICAgIC8vIDIuIFBhaW50IG91ciB1bmRlcmxpbmUgYW5kIG92
ZXJsaW5lLgotICAgICAgICAgICAgcGFpbnRUZXh0RGVjb3JhdGlvbnMocGFpbnRJbmZvLCB0eCwg
dHksIGZhbHNlKTsKKyAgICAgICAgICAgIHBhaW50VGV4dERlY29yYXRpb25zKHBhaW50SW5mbywg
dHgsIHR5LCBmYWxzZSwgbGluZUJveFBhaW50SW5mbyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAg
LTY3MCwxMyArNjc0LDEzIEBAIHZvaWQgSW5saW5lRmxvd0JveDo6cGFpbnQoUmVuZGVyT2JqZWN0
OjoKICAgICBpZiAocGFpbnRQaGFzZSAhPSBQYWludFBoYXNlU2VsZk91dGxpbmUpIHsKICAgICAg
ICAgZm9yIChJbmxpbmVCb3gqIGN1cnIgPSBmaXJzdENoaWxkKCk7IGN1cnI7IGN1cnIgPSBjdXJy
LT5uZXh0T25MaW5lKCkpIHsKICAgICAgICAgICAgIGlmIChjdXJyLT5yZW5kZXJlcigpLT5pc1Rl
eHQoKSB8fCAhY3Vyci0+Ym94TW9kZWxPYmplY3QoKS0+aGFzU2VsZlBhaW50aW5nTGF5ZXIoKSkK
LSAgICAgICAgICAgICAgICBjdXJyLT5wYWludChjaGlsZEluZm8sIHR4LCB0eSk7CisgICAgICAg
ICAgICAgICAgY3Vyci0+cGFpbnQoY2hpbGRJbmZvLCB0eCwgdHksIGxpbmVCb3hQYWludEluZm8p
OwogICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gNC4gUGFpbnQgb3VyIHN0cmlrZS10aHJvdWdo
CiAgICAgaWYgKHBhaW50SW5mby5waGFzZSA9PSBQYWludFBoYXNlRm9yZWdyb3VuZCB8fCBwYWlu
dEluZm8ucGhhc2UgPT0gUGFpbnRQaGFzZVNlbGVjdGlvbikKLSAgICAgICAgcGFpbnRUZXh0RGVj
b3JhdGlvbnMocGFpbnRJbmZvLCB0eCwgdHksIHRydWUpOworICAgICAgICBwYWludFRleHREZWNv
cmF0aW9ucyhwYWludEluZm8sIHR4LCB0eSwgdHJ1ZSwgbGluZUJveFBhaW50SW5mbyk7CiB9CiAK
IHZvaWQgSW5saW5lRmxvd0JveDo6cGFpbnRGaWxsTGF5ZXJzKGNvbnN0IFJlbmRlck9iamVjdDo6
UGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IENvbG9yJiBjLCBjb25zdCBGaWxsTGF5ZXIqIGZp
bGxMYXllciwgaW50IF90eCwgaW50IF90eSwgaW50IHcsIGludCBoLCBDb21wb3NpdGVPcGVyYXRv
ciBvcCkKQEAgLTcyNyw5ICs3MzEsOSBAQCB2b2lkIElubGluZUZsb3dCb3g6OnBhaW50Qm94U2hh
ZG93KEdyYXBoCiAgICAgfQogfQogCi12b2lkIElubGluZUZsb3dCb3g6OnBhaW50Qm94RGVjb3Jh
dGlvbnMoUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgaW50IHR4LCBpbnQgdHkp
Cit2b2lkIElubGluZUZsb3dCb3g6OnBhaW50Qm94RGVjb3JhdGlvbnMoUmVuZGVyT2JqZWN0OjpQ
YWludEluZm8mIHBhaW50SW5mbywgaW50IHR4LCBpbnQgdHksIExpbmVCb3hQYWludEluZm8mIGxp
bmVCb3hQYWludEluZm8pCiB7Ci0gICAgaWYgKCFyZW5kZXJlcigpLT5zaG91bGRQYWludFdpdGhp
blJvb3QocGFpbnRJbmZvKSB8fCByZW5kZXJlcigpLT5zdHlsZSgpLT52aXNpYmlsaXR5KCkgIT0g
VklTSUJMRSB8fCBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZUZvcmVncm91bmQpCisgICAg
aWYgKCFyZW5kZXJlcigpLT5zaG91bGRQYWludFdpdGhpblJvb3QocGFpbnRJbmZvKSB8fCByZW5k
ZXJlcigpLT5zdHlsZSgpLT52aXNpYmlsaXR5KCkgIT0gVklTSUJMRSB8fCBwYWludEluZm8ucGhh
c2UgIT0gUGFpbnRQaGFzZUZvcmVncm91bmQgfHwgbGluZUJveFBhaW50SW5mby5hbm9ueW1vdXNJ
bmxpbmVCbG9jaykKICAgICAgICAgcmV0dXJuOwogCiAgICAgaW50IHggPSBtX3g7CkBAIC04MDMs
OSArODA3LDkgQEAgdm9pZCBJbmxpbmVGbG93Qm94OjpwYWludEJveERlY29yYXRpb25zKAogICAg
IH0KIH0KIAotdm9pZCBJbmxpbmVGbG93Qm94OjpwYWludE1hc2soUmVuZGVyT2JqZWN0OjpQYWlu
dEluZm8mIHBhaW50SW5mbywgaW50IHR4LCBpbnQgdHkpCit2b2lkIElubGluZUZsb3dCb3g6OnBh
aW50TWFzayhSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJbmZvLCBpbnQgdHgsIGludCB0
eSwgTGluZUJveFBhaW50SW5mbyYgbGluZUJveFBhaW50SW5mbykKIHsKLSAgICBpZiAoIXJlbmRl
cmVyKCktPnNob3VsZFBhaW50V2l0aGluUm9vdChwYWludEluZm8pIHx8IHJlbmRlcmVyKCktPnN0
eWxlKCktPnZpc2liaWxpdHkoKSAhPSBWSVNJQkxFIHx8IHBhaW50SW5mby5waGFzZSAhPSBQYWlu
dFBoYXNlTWFzaykKKyAgICBpZiAoIXJlbmRlcmVyKCktPnNob3VsZFBhaW50V2l0aGluUm9vdChw
YWludEluZm8pIHx8IHJlbmRlcmVyKCktPnN0eWxlKCktPnZpc2liaWxpdHkoKSAhPSBWSVNJQkxF
IHx8IHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlTWFzayB8fCBsaW5lQm94UGFpbnRJbmZv
LmFub255bW91c0lubGluZUJsb2NrKQogICAgICAgICByZXR1cm47CiAKICAgICBpbnQgeCA9IG1f
eDsKQEAgLTg5NSwxMiArODk5LDEyIEBAIHN0YXRpYyBib29sIHNob3VsZERyYXdUZXh0RGVjb3Jh
dGlvbihSZW4KICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXZvaWQgSW5saW5lRmxvd0JveDo6cGFp
bnRUZXh0RGVjb3JhdGlvbnMoUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgaW50
IHR4LCBpbnQgdHksIGJvb2wgcGFpbnRlZENoaWxkcmVuKQordm9pZCBJbmxpbmVGbG93Qm94Ojpw
YWludFRleHREZWNvcmF0aW9ucyhSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJbmZvLCBp
bnQgdHgsIGludCB0eSwgYm9vbCBwYWludGVkQ2hpbGRyZW4sIExpbmVCb3hQYWludEluZm8mIGxp
bmVCb3hQYWludEluZm8pCiB7CiAgICAgLy8gUGFpbnQgdGV4dCBkZWNvcmF0aW9ucyBsaWtlIHVu
ZGVybGluZXMvb3ZlcmxpbmVzLiBXZSBvbmx5IGRvIHRoaXMgaWYgd2UgYXJlbid0IGluIHF1aXJr
cyBtb2RlIChpLmUuLCBpbgogICAgIC8vIGFsbW9zdC1zdHJpY3QgbW9kZSBvciBzdHJpY3QgbW9k
ZSkuCiAgICAgaWYgKHJlbmRlcmVyKCktPnN0eWxlKCktPmh0bWxIYWNrcygpIHx8ICFyZW5kZXJl
cigpLT5zaG91bGRQYWludFdpdGhpblJvb3QocGFpbnRJbmZvKSB8fAotICAgICAgICByZW5kZXJl
cigpLT5zdHlsZSgpLT52aXNpYmlsaXR5KCkgIT0gVklTSUJMRSkKKyAgICAgICAgcmVuZGVyZXIo
KS0+c3R5bGUoKS0+dmlzaWJpbGl0eSgpICE9IFZJU0lCTEUgfHwgbGluZUJveFBhaW50SW5mby5h
bm9ueW1vdXNJbmxpbmVCbG9jaykKICAgICAgICAgcmV0dXJuOwogICAgIAogICAgIC8vIFdlIGRv
bid0IHdhbnQgdW5kZXJsaW5lcyBvciBvdGhlciBkZWNvcmF0aW9ucyB3aGVuIHdlJ3JlIHRyeWlu
ZyB0byBkcmF3IG5vdGhpbmcgYnV0IHRoZSBzZWxlY3Rpb24gYXMgd2hpdGUgdGV4dC4KSW5kZXg6
IFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUZsb3dCb3guaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3JlbmRlcmluZy9JbmxpbmVGbG93Qm94LmgJKHJldmlzaW9uIDU0NzI3KQorKysgV2ViQ29yZS9y
ZW5kZXJpbmcvSW5saW5lRmxvd0JveC5oCSh3b3JraW5nIGNvcHkpCkBAIC0zOCw2ICszOCw3IEBA
IHB1YmxpYzoKICAgICAgICAgLCBtX2xhc3RDaGlsZCgwKQogICAgICAgICAsIG1faW5jbHVkZUxl
ZnRFZGdlKGZhbHNlKQogICAgICAgICAsIG1faW5jbHVkZVJpZ2h0RWRnZShmYWxzZSkKKyAgICAg
ICAgLCBtX2hhc0Fub255bW91c0lubGluZUJsb2NrKGZhbHNlKQogI2lmbmRlZiBOREVCVUcKICAg
ICAgICAgLCBtX2hhc0JhZENoaWxkTGlzdChmYWxzZSkKICNlbmRpZgpAQCAtODQsMTQgKzg1LDE0
IEBAIHB1YmxpYzoKIAogICAgIHZpcnR1YWwgdm9pZCBjbGVhclRydW5jYXRpb24oKTsKIAotICAg
IHZpcnR1YWwgdm9pZCBwYWludEJveERlY29yYXRpb25zKFJlbmRlck9iamVjdDo6UGFpbnRJbmZv
JiwgaW50IHR4LCBpbnQgdHkpOwotICAgIHZpcnR1YWwgdm9pZCBwYWludE1hc2soUmVuZGVyT2Jq
ZWN0OjpQYWludEluZm8mLCBpbnQgdHgsIGludCB0eSk7CisgICAgdm9pZCBwYWludEJveERlY29y
YXRpb25zKFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiwgaW50IHR4LCBpbnQgdHksIExpbmVCb3hQ
YWludEluZm8mKTsKKyAgICB2b2lkIHBhaW50TWFzayhSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYs
IGludCB0eCwgaW50IHR5LCBMaW5lQm94UGFpbnRJbmZvJik7CiAgICAgdm9pZCBwYWludEZpbGxM
YXllcnMoY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBjb25zdCBDb2xvciYsIGNvbnN0
IEZpbGxMYXllciosIGludCB0eCwgaW50IHR5LCBpbnQgdywgaW50IGgsIENvbXBvc2l0ZU9wZXJh
dG9yID0gQ29tcG9zaXRlU291cmNlT3Zlcik7CiAgICAgdm9pZCBwYWludEZpbGxMYXllcihjb25z
dCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGNvbnN0IENvbG9yJiwgY29uc3QgRmlsbExheWVy
KiwgaW50IHR4LCBpbnQgdHksIGludCB3LCBpbnQgaCwgQ29tcG9zaXRlT3BlcmF0b3IgPSBDb21w
b3NpdGVTb3VyY2VPdmVyKTsKICAgICB2b2lkIHBhaW50Qm94U2hhZG93KEdyYXBoaWNzQ29udGV4
dCosIFJlbmRlclN0eWxlKiwgU2hhZG93U3R5bGUsIGludCB0eCwgaW50IHR5LCBpbnQgdywgaW50
IGgpOwotICAgIHZpcnR1YWwgdm9pZCBwYWludFRleHREZWNvcmF0aW9ucyhSZW5kZXJPYmplY3Q6
OlBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5LCBib29sIHBhaW50ZWRDaGlsZHJlbiA9IGZhbHNl
KTsKLSAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBpbnQg
dHgsIGludCB0eSk7Ci0gICAgdmlydHVhbCBib29sIG5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RS
ZXF1ZXN0JiwgSGl0VGVzdFJlc3VsdCYsIGludCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHkpOwor
ICAgIHZvaWQgcGFpbnRUZXh0RGVjb3JhdGlvbnMoUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBp
bnQgdHgsIGludCB0eSwgYm9vbCBwYWludGVkQ2hpbGRyZW4sIExpbmVCb3hQYWludEluZm8mKTsK
KyAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBpbnQgdHgs
IGludCB0eSwgTGluZUJveFBhaW50SW5mbyYpOworICAgIHZpcnR1YWwgYm9vbCBub2RlQXRQb2lu
dChjb25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBpbnQgeCwgaW50IHksIGlu
dCB0eCwgaW50IHR5LCBIaXRUZXN0QWN0aW9uLCBMaW5lQm94SGl0VGVzdEluZm8mKTsKIAogICAg
IHZpcnR1YWwgUmVuZGVyTGluZUJveExpc3QqIHJlbmRlcmVyTGluZUJveGVzKCkgY29uc3Q7CiAK
QEAgLTE2MSw2ICsxNjIsOSBAQCBwdWJsaWM6CiAgICAgdm9pZCBzZXRIb3Jpem9udGFsT3ZlcmZs
b3dQb3NpdGlvbnMoaW50IGxlZnRMYXlvdXRPdmVyZmxvdywgaW50IHJpZ2h0TGF5b3V0T3ZlcmZs
b3csIGludCBsZWZ0VmlzdWFsT3ZlcmZsb3csIGludCByaWdodFZpc3VhbE92ZXJmbG93KTsKICAg
ICB2b2lkIHNldFZlcnRpY2FsT3ZlcmZsb3dQb3NpdGlvbnMoaW50IHRvcExheW91dE92ZXJmbG93
LCBpbnQgYm90dG9tTGF5b3V0T3ZlcmZsb3csIGludCB0b3BWaXN1YWxPdmVyZmxvdywgaW50IGJv
dHRvbVZpc3VhbE92ZXJmbG93LCBpbnQgYm94SGVpZ2h0KTsKIAorICAgIGJvb2wgaGFzQW5vbnlt
b3VzSW5saW5lQmxvY2soKSBjb25zdCB7IHJldHVybiBtX2hhc0Fub255bW91c0lubGluZUJsb2Nr
OyB9CisgICAgdm9pZCBzZXRIYXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpIHsgbV9oYXNBbm9ueW1v
dXNJbmxpbmVCbG9jayA9IHRydWU7IH0KKwogcHJvdGVjdGVkOgogICAgIE93blB0cjxSZW5kZXJP
dmVyZmxvdz4gbV9vdmVyZmxvdzsKIApAQCAtMTczLDEyICsxNzcsMzEgQEAgcHJpdmF0ZToKICAg
ICBib29sIG1faW5jbHVkZUxlZnRFZGdlIDogMTsKICAgICBib29sIG1faW5jbHVkZVJpZ2h0RWRn
ZSA6IDE7CiAgICAgYm9vbCBtX2hhc1RleHRDaGlsZHJlbiA6IDE7CisgICAgYm9vbCBtX2hhc0Fu
b255bW91c0lubGluZUJsb2NrOiAxOwogCiAjaWZuZGVmIE5ERUJVRwogICAgIGJvb2wgbV9oYXNC
YWRDaGlsZExpc3Q7CiAjZW5kaWYKIH07CiAKKy8vIEZvciBhbm9ueW1vdXMgaW5saW5lIGJsb2Nr
IG9iamVjdHMuCitjbGFzcyBJbmxpbmVGbG93QW5vbnltb3VzSW5saW5lQmxvY2tCb3ggOiBwdWJs
aWMgSW5saW5lRmxvd0JveAoreworcHVibGljOgorICAgIElubGluZUZsb3dBbm9ueW1vdXNJbmxp
bmVCbG9ja0JveChSZW5kZXJPYmplY3QqIGlubGluZUZsb3cpCisgICAgICAgIDogSW5saW5lRmxv
d0JveChpbmxpbmVGbG93KQorICAgIHsKKyAgICAgICAgc2V0SGFzVmlydHVhbEhlaWdodCgpOwor
ICAgICAgICBzZXRIYXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpOworICAgIH0KKyAgICAKKyAgICB2
aXJ0dWFsIGludCB2aXJ0dWFsSGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gbV9oZWlnaHQ7IH0gLy8g
VGhlIGhlaWdodCBvZiB0aGUgYW5vbnltb3VzIGlubGluZSBibG9jayBiZWxvdyB1cyBpbiB0aGUg
bGluZSBib3ggdHJlZS4KKyAgICB2b2lkIHNldEhlaWdodChpbnQgaCkgeyBtX2hlaWdodCA9IGg7
IH0KKworcHJpdmF0ZToKKyAgICBpbnQgbV9oZWlnaHQ7Cit9OworCiBpbmxpbmUgdm9pZCBJbmxp
bmVGbG93Qm94OjpzZXRIb3Jpem9udGFsT3ZlcmZsb3dQb3NpdGlvbnMoaW50IGxlZnRMYXlvdXRP
dmVyZmxvdywgaW50IHJpZ2h0TGF5b3V0T3ZlcmZsb3csIGludCBsZWZ0VmlzdWFsT3ZlcmZsb3cs
IGludCByaWdodFZpc3VhbE92ZXJmbG93KSAKIHsgCiAgICAgaWYgKCFtX292ZXJmbG93KSB7Cklu
ZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVSdW5Cb3guaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL3JlbmRlcmluZy9JbmxpbmVSdW5Cb3guaAkocmV2aXNpb24gNTQ3MjcpCisrKyBXZWJDb3Jl
L3JlbmRlcmluZy9JbmxpbmVSdW5Cb3guaAkod29ya2luZyBjb3B5KQpAQCAtMzgsMTAgKzM4LDcg
QEAgcHVibGljOgogICAgIElubGluZVJ1bkJveCogbmV4dExpbmVCb3goKSBjb25zdCB7IHJldHVy
biBtX25leHRMaW5lOyB9CiAgICAgdm9pZCBzZXROZXh0TGluZUJveChJbmxpbmVSdW5Cb3gqIG4p
IHsgbV9uZXh0TGluZSA9IG47IH0KICAgICB2b2lkIHNldFByZXZpb3VzTGluZUJveChJbmxpbmVS
dW5Cb3gqIHApIHsgbV9wcmV2TGluZSA9IHA7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBwYWludEJv
eERlY29yYXRpb25zKFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiwgaW50IC8qdHgqLywgaW50IC8q
dHkqLykgeyB9Ci0gICAgdmlydHVhbCB2b2lkIHBhaW50VGV4dERlY29yYXRpb25zKFJlbmRlck9i
amVjdDo6UGFpbnRJbmZvJiwgaW50IC8qdHgqLywgaW50IC8qdHkqLywgYm9vbCAvKnBhaW50ZWRD
aGlsZHJlbiovID0gZmFsc2UpIHsgfQotICAgIAorIAogcHJvdGVjdGVkOgogICAgIElubGluZVJ1
bkJveCogbV9wcmV2TGluZTsgIC8vIFRoZSBwcmV2aW91cyBib3ggdGhhdCBhbHNvIHVzZXMgb3Vy
IFJlbmRlck9iamVjdAogICAgIElubGluZVJ1bkJveCogbV9uZXh0TGluZTsgIC8vIFRoZSBuZXh0
IGJveCB0aGF0IGFsc28gdXNlcyBvdXIgUmVuZGVyT2JqZWN0CkluZGV4OiBXZWJDb3JlL3JlbmRl
cmluZy9JbmxpbmVUZXh0Qm94LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9J
bmxpbmVUZXh0Qm94LmNwcAkocmV2aXNpb24gNTQ3MjcpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9J
bmxpbmVUZXh0Qm94LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjYwLDcgKzI2MCw3IEBAIGJvb2wg
SW5saW5lVGV4dEJveDo6aXNMaW5lQnJlYWsoKSBjb25zdAogICAgIHJldHVybiByZW5kZXJlcigp
LT5pc0JSKCkgfHwgKHJlbmRlcmVyKCktPnN0eWxlKCktPnByZXNlcnZlTmV3bGluZSgpICYmIGxl
bigpID09IDEgJiYgKCp0ZXh0UmVuZGVyZXIoKS0+dGV4dCgpKVtzdGFydCgpXSA9PSAnXG4nKTsK
IH0KIAotYm9vbCBJbmxpbmVUZXh0Qm94Ojpub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVz
dCYsIEhpdFRlc3RSZXN1bHQmIHJlc3VsdCwgaW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSkK
K2Jvb2wgSW5saW5lVGV4dEJveDo6bm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmLCBI
aXRUZXN0UmVzdWx0JiByZXN1bHQsIGludCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHksIEhpdFRl
c3RBY3Rpb24sIExpbmVCb3hIaXRUZXN0SW5mbyYpCiB7CiAgICAgaWYgKGlzTGluZUJyZWFrKCkp
CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTMyNCw3ICszMjQsNyBAQCBzdGF0aWMgdm9pZCBw
YWludFRleHRXaXRoU2hhZG93cyhHcmFwaGljCiAgICAgfSB3aGlsZSAoc2hhZG93IHx8IHN0cm9r
ZWQgfHwgIW9wYXF1ZSk7CiB9CiAKLXZvaWQgSW5saW5lVGV4dEJveDo6cGFpbnQoUmVuZGVyT2Jq
ZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgaW50IHR4LCBpbnQgdHkpCit2b2lkIElubGluZVRl
eHRCb3g6OnBhaW50KFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGludCB0eCwg
aW50IHR5LCBMaW5lQm94UGFpbnRJbmZvJikKIHsKICAgICBpZiAoaXNMaW5lQnJlYWsoKSB8fCAh
cmVuZGVyZXIoKS0+c2hvdWxkUGFpbnRXaXRoaW5Sb290KHBhaW50SW5mbykgfHwgcmVuZGVyZXIo
KS0+c3R5bGUoKS0+dmlzaWJpbGl0eSgpICE9IFZJU0lCTEUgfHwKICAgICAgICAgbV90cnVuY2F0
aW9uID09IGNGdWxsVHJ1bmNhdGlvbiB8fCBwYWludEluZm8ucGhhc2UgPT0gUGFpbnRQaGFzZU91
dGxpbmUpCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVUZXh0Qm94LmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lVGV4dEJveC5oCShyZXZpc2lvbiA1NDcyNykK
KysrIFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZVRleHRCb3guaAkod29ya2luZyBjb3B5KQpAQCAt
NzQsOCArNzQsOCBAQCBwdWJsaWM6CiAgICAgdm9pZCBzZWxlY3Rpb25TdGFydEVuZChpbnQmIHNQ
b3MsIGludCYgZVBvcyk7CiAKIHByaXZhdGU6Ci0gICAgdmlydHVhbCB2b2lkIHBhaW50KFJlbmRl
ck9iamVjdDo6UGFpbnRJbmZvJiwgaW50IHR4LCBpbnQgdHkpOwotICAgIHZpcnR1YWwgYm9vbCBu
b2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBpbnQgeCwg
aW50IHksIGludCB0eCwgaW50IHR5KTsKKyAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoUmVuZGVyT2Jq
ZWN0OjpQYWludEluZm8mLCBpbnQgdHgsIGludCB0eSwgTGluZUJveFBhaW50SW5mbyYpOworICAg
IHZpcnR1YWwgYm9vbCBub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RS
ZXN1bHQmLCBpbnQgeCwgaW50IHksIGludCB0eCwgaW50IHR5LCBIaXRUZXN0QWN0aW9uLCBMaW5l
Qm94SGl0VGVzdEluZm8mKTsKIAogcHVibGljOgogICAgIFJlbmRlclRleHQqIHRleHRSZW5kZXJl
cigpIGNvbnN0OwpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmNwcAkocmV2aXNpb24gNTQ3
MjcpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTc3LDggKzc3LDYgQEAgc3RhdGljIFBlcmNlbnRIZWlnaHREZXNjZW5kYW50c01hcCogZ1Bl
cgogCiB0eXBlZGVmIFdURjo6SGFzaE1hcDxjb25zdCBSZW5kZXJCb3gqLCBIYXNoU2V0PFJlbmRl
ckJsb2NrKj4qPiBQZXJjZW50SGVpZ2h0Q29udGFpbmVyTWFwOwogc3RhdGljIFBlcmNlbnRIZWln
aHRDb250YWluZXJNYXAqIGdQZXJjZW50SGVpZ2h0Q29udGFpbmVyTWFwID0gMDsKLSAgICAKLXR5
cGVkZWYgV1RGOjpIYXNoTWFwPFJlbmRlckJsb2NrKiwgTGlzdEhhc2hTZXQ8UmVuZGVySW5saW5l
Kj4qPiBDb250aW51YXRpb25PdXRsaW5lVGFibGVNYXA7CiAKIHR5cGVkZWYgV1RGOjpIYXNoU2V0
PFJlbmRlckJsb2NrKj4gRGVsYXllZFVwZGF0ZVNjcm9sbEluZm9TZXQ7CiBzdGF0aWMgaW50IGdE
ZWxheVVwZGF0ZVNjcm9sbEluZm8gPSAwOwpAQCAtOTEsNyArODksNyBAQCBSZW5kZXJCbG9jazo6
TWFyZ2luSW5mbzo6TWFyZ2luSW5mbyhSZW5kCiAgICAgLy8gaWYgd2UgaGFkIGFueSBib3JkZXIv
cGFkZGluZyAob2J2aW91c2x5KSwgaWYgd2UncmUgdGhlIHJvb3Qgb3IgSFRNTCBlbGVtZW50cywg
b3IgaWYKICAgICAvLyB3ZSdyZSBwb3NpdGlvbmVkLCBmbG9hdGluZywgYSB0YWJsZSBjZWxsLgog
ICAgIG1fY2FuQ29sbGFwc2VXaXRoQ2hpbGRyZW4gPSAhYmxvY2stPmlzUmVuZGVyVmlldygpICYm
ICFibG9jay0+aXNSb290KCkgJiYgIWJsb2NrLT5pc1Bvc2l0aW9uZWQoKSAmJgotICAgICAgICAh
YmxvY2stPmlzRmxvYXRpbmcoKSAmJiAhYmxvY2stPmlzVGFibGVDZWxsKCkgJiYgIWJsb2NrLT5o
YXNPdmVyZmxvd0NsaXAoKSAmJiAhYmxvY2stPmlzSW5saW5lQmxvY2tPcklubGluZVRhYmxlKCk7
CisgICAgICAgICFibG9jay0+aXNGbG9hdGluZygpICYmICFibG9jay0+aXNUYWJsZUNlbGwoKSAm
JiAhYmxvY2stPmhhc092ZXJmbG93Q2xpcCgpICYmICghYmxvY2stPmlzSW5saW5lQmxvY2tPcklu
bGluZVRhYmxlKCkgfHwgYmxvY2stPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSk7CiAKICAgICBt
X2NhbkNvbGxhcHNlVG9wV2l0aENoaWxkcmVuID0gbV9jYW5Db2xsYXBzZVdpdGhDaGlsZHJlbiAm
JiAodG9wID09IDApICYmIGJsb2NrLT5zdHlsZSgpLT5tYXJnaW5Ub3BDb2xsYXBzZSgpICE9IE1T
RVBBUkFURTsKIApAQCAtMTIwLDcgKzExOCw2IEBAIFJlbmRlckJsb2NrOjpSZW5kZXJCbG9jayhO
b2RlKiBub2RlKQogICAgICAgOiBSZW5kZXJCb3gobm9kZSkKICAgICAgICwgbV9mbG9hdGluZ09i
amVjdHMoMCkKICAgICAgICwgbV9wb3NpdGlvbmVkT2JqZWN0cygwKQotICAgICAgLCBtX2lubGlu
ZUNvbnRpbnVhdGlvbigwKQogICAgICAgLCBtX21heE1hcmdpbigwKQogICAgICAgLCBtX2xpbmVI
ZWlnaHQoLTEpCiB7CkBAIC0xNjEsMTQgKzE1OCw2IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmRlc3Ry
b3koKQogICAgIC8vIE1ha2Ugc3VyZSB0byBkZXN0cm95IGFub255bW91cyBjaGlsZHJlbiBmaXJz
dCB3aGlsZSB0aGV5IGFyZSBzdGlsbCBjb25uZWN0ZWQgdG8gdGhlIHJlc3Qgb2YgdGhlIHRyZWUs
IHNvIHRoYXQgdGhleSB3aWxsCiAgICAgLy8gcHJvcGVybHkgZGlydHkgbGluZSBib3hlcyB0aGF0
IHRoZXkgYXJlIHJlbW92ZWQgZnJvbS4gRWZmZWN0cyB0aGF0IGRvIDpiZWZvcmUvOmFmdGVyIG9u
bHkgb24gaG92ZXIgY291bGQgY3Jhc2ggb3RoZXJ3aXNlLgogICAgIGNoaWxkcmVuKCktPmRlc3Ry
b3lMZWZ0b3ZlckNoaWxkcmVuKCk7Ci0KLSAgICAvLyBEZXN0cm95IG91ciBjb250aW51YXRpb24g
YmVmb3JlIGFueXRoaW5nIG90aGVyIHRoYW4gYW5vbnltb3VzIGNoaWxkcmVuLgotICAgIC8vIFRo
ZSByZWFzb24gd2UgZG9uJ3QgZGVzdHJveSBpdCBiZWZvcmUgYW5vbnltb3VzIGNoaWxkcmVuIGlz
IHRoYXQgdGhleSBtYXkKLSAgICAvLyBoYXZlIGNvbnRpbnVhdGlvbnMgb2YgdGhlaXIgb3duIHRo
YXQgYXJlIGFub255bW91cyBjaGlsZHJlbiBvZiBvdXIgY29udGludWF0aW9uLgotICAgIGlmICht
X2lubGluZUNvbnRpbnVhdGlvbikgewotICAgICAgICBtX2lubGluZUNvbnRpbnVhdGlvbi0+ZGVz
dHJveSgpOwotICAgICAgICBtX2lubGluZUNvbnRpbnVhdGlvbiA9IDA7Ci0gICAgfQogICAgIAog
ICAgIGlmICghZG9jdW1lbnRCZWluZ0Rlc3Ryb3llZCgpKSB7CiAgICAgICAgIGlmIChmaXJzdExp
bmVCb3goKSkgewpAQCAtMzE2LDcgKzMwNSw3IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmFkZENoaWxk
KFJlbmRlck9iamVjdCoKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoIWNoaWxkcmVuSW5saW5l
KCkgJiYgKG5ld0NoaWxkLT5pc0Zsb2F0aW5nT3JQb3NpdGlvbmVkKCkgfHwgbmV3Q2hpbGQtPmlz
SW5saW5lKCkpKSB7CiAgICAgICAgIC8vIElmIHdlJ3JlIGluc2VydGluZyBhbiBpbmxpbmUgY2hp
bGQgYnV0IGFsbCBvZiBvdXIgY2hpbGRyZW4gYXJlIGJsb2NrcywgdGhlbiB3ZSBoYXZlIHRvIG1h
a2Ugc3VyZQotICAgICAgICAvLyBpdCBpcyBwdXQgaW50byBhbiBhbm9teW91cyBibG9jayBib3gu
IFdlIHRyeSB0byB1c2UgYW4gZXhpc3RpbmcgYW5vbnltb3VzIGJveCBpZiBwb3NzaWJsZSwgb3Ro
ZXJ3aXNlCisgICAgICAgIC8vIGl0IGlzIHB1dCBpbnRvIGFuIGFub255bW91cyBibG9jayBib3gu
IFdlIHRyeSB0byB1c2UgYW4gZXhpc3RpbmcgYW5vbnltb3VzIGJveCBpZiBwb3NzaWJsZSwgb3Ro
ZXJ3aXNlCiAgICAgICAgIC8vIGEgbmV3IG9uZSBpcyBjcmVhdGVkIGFuZCBpbnNlcnRlZCBpbnRv
IG91ciBsaXN0IG9mIGNoaWxkcmVuIGluIHRoZSBhcHByb3ByaWF0ZSBwb3NpdGlvbi4KICAgICAg
ICAgUmVuZGVyT2JqZWN0KiBhZnRlckNoaWxkID0gYmVmb3JlQ2hpbGQgPyBiZWZvcmVDaGlsZC0+
cHJldmlvdXNTaWJsaW5nKCkgOiBsYXN0Q2hpbGQoKTsKIApAQCAtMzkxLDkgKzM4MCw5IEBAIFJv
b3RJbmxpbmVCb3gqIFJlbmRlckJsb2NrOjpjcmVhdGVSb290SW4KICAgICByZXR1cm4gbmV3IChy
ZW5kZXJBcmVuYSgpKSBSb290SW5saW5lQm94KHRoaXMpOwogfQogCi1Sb290SW5saW5lQm94KiBS
ZW5kZXJCbG9jazo6Y3JlYXRlQW5kQXBwZW5kUm9vdElubGluZUJveCgpCi17Ci0gICAgUm9vdElu
bGluZUJveCogcm9vdEJveCA9IGNyZWF0ZVJvb3RJbmxpbmVCb3goKTsKK1Jvb3RJbmxpbmVCb3gq
IFJlbmRlckJsb2NrOjpjcmVhdGVBbmRBcHBlbmRSb290SW5saW5lQm94KFJlbmRlckJsb2NrKiBh
bm9ueW1vdXNJbmxpbmVCbG9jaykKK3sgCisgICAgUm9vdElubGluZUJveCogcm9vdEJveCA9IGFu
b255bW91c0lubGluZUJsb2NrID8gbmV3IChyZW5kZXJBcmVuYSgpKSBSb290QW5vbnltb3VzSW5s
aW5lQmxvY2tCb3godGhpcywgYW5vbnltb3VzSW5saW5lQmxvY2spIDogY3JlYXRlUm9vdElubGlu
ZUJveCgpOwogICAgIG1fbGluZUJveGVzLmFwcGVuZExpbmVCb3gocm9vdEJveCk7CiAgICAgcmV0
dXJuIHJvb3RCb3g7CiB9CkBAIC00OTAsOSArNDc5LDYgQEAgdm9pZCBSZW5kZXJCbG9jazo6cmVt
b3ZlTGVmdG92ZXJBbm9ueW1vdQogICAgIEFTU0VSVChjaGlsZC0+aXNBbm9ueW1vdXNCbG9jaygp
KTsKICAgICBBU1NFUlQoIWNoaWxkLT5jaGlsZHJlbklubGluZSgpKTsKICAgICAKLSAgICBpZiAo
Y2hpbGQtPmlubGluZUNvbnRpbnVhdGlvbigpKSAKLSAgICAgICAgcmV0dXJuOwotICAgIAogICAg
IFJlbmRlck9iamVjdCogZmlyc3RBbkNoaWxkID0gY2hpbGQtPm1fY2hpbGRyZW4uZmlyc3RDaGls
ZCgpOwogICAgIFJlbmRlck9iamVjdCogbGFzdEFuQ2hpbGQgPSBjaGlsZC0+bV9jaGlsZHJlbi5s
YXN0Q2hpbGQoKTsKICAgICBpZiAoZmlyc3RBbkNoaWxkKSB7CkBAIC01MzUsNyArNTIxLDcgQEAg
dm9pZCBSZW5kZXJCbG9jazo6cmVtb3ZlQ2hpbGQoUmVuZGVyT2JqZQogICAgIFJlbmRlck9iamVj
dCogcHJldiA9IG9sZENoaWxkLT5wcmV2aW91c1NpYmxpbmcoKTsKICAgICBSZW5kZXJPYmplY3Qq
IG5leHQgPSBvbGRDaGlsZC0+bmV4dFNpYmxpbmcoKTsKICAgICBib29sIGNhbkRlbGV0ZUFub255
bW91c0Jsb2NrcyA9ICFkb2N1bWVudEJlaW5nRGVzdHJveWVkKCkgJiYgIWlzSW5saW5lKCkgJiYg
IW9sZENoaWxkLT5pc0lubGluZSgpICYmIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgKCFvbGRDaGlsZC0+aXNSZW5kZXJCbG9jaygpIHx8ICF0b1JlbmRlckJsb2NrKG9sZENo
aWxkKS0+aW5saW5lQ29udGludWF0aW9uKCkpICYmIAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIW9sZENoaWxkLT5pc1JlbmRlckJsb2NrKCkgJiYgCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAoIXByZXYgfHwgKHByZXYtPmlzQW5vbnltb3VzQmxvY2so
KSAmJiBwcmV2LT5jaGlsZHJlbklubGluZSgpKSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICghbmV4dCB8fCAobmV4dC0+aXNBbm9ueW1vdXNCbG9jaygpICYmIG5leHQt
PmNoaWxkcmVuSW5saW5lKCkpKTsKICAgICBpZiAoY2FuRGVsZXRlQW5vbnltb3VzQmxvY2tzICYm
IHByZXYgJiYgbmV4dCkgewpAQCAtNTk4LDkgKzU4NCwxNSBAQCBib29sIFJlbmRlckJsb2NrOjpp
c1NlbGZDb2xsYXBzaW5nQmxvY2soCiAgICAgLy8gb24gd2hldGhlciB3ZSBoYXZlIGNvbnRlbnQg
dGhhdCBpcyBhbGwgc2VsZi1jb2xsYXBzaW5nIG9yIG5vdC4KICAgICBpZiAoaGFzQXV0b0hlaWdo
dCB8fCAoKHN0eWxlKCktPmhlaWdodCgpLmlzRml4ZWQoKSB8fCBzdHlsZSgpLT5oZWlnaHQoKS5p
c1BlcmNlbnQoKSkgJiYgc3R5bGUoKS0+aGVpZ2h0KCkuaXNaZXJvKCkpKSB7CiAgICAgICAgIC8v
IElmIHRoZSBibG9jayBoYXMgaW5saW5lIGNoaWxkcmVuLCBzZWUgaWYgd2UgZ2VuZXJhdGVkIGFu
eSBsaW5lIGJveGVzLiAgSWYgd2UgaGF2ZSBhbnkKLSAgICAgICAgLy8gbGluZSBib3hlcywgdGhl
biB3ZSBjYW4ndCBiZSBzZWxmLWNvbGxhcHNpbmcsIHNpbmNlIHdlIGhhdmUgY29udGVudC4KLSAg
ICAgICAgaWYgKGNoaWxkcmVuSW5saW5lKCkpCi0gICAgICAgICAgICByZXR1cm4gIWZpcnN0TGlu
ZUJveCgpOworICAgICAgICAvLyBsaW5lIGJveGVzLCB0aGVuIHdlIGNhbiBvbmx5IGJlIHNlbGYt
Y29sbGFwc2luZyBpZiB3ZSBoYXZlIG5vdGhpbmcgYnV0IGFub255bW91cyBpbmxpbmUgYmxvY2tz
CisgICAgICAgIC8vIHRoYXQgYXJlIGFsc28gc2VsZi1jb2xsYXBzaW5nIGluc2lkZSB1cy4KKyAg
ICAgICAgaWYgKGNoaWxkcmVuSW5saW5lKCkpIHsKKyAgICAgICAgICAgIGZvciAoUm9vdElubGlu
ZUJveCogY2hpbGQgPSBmaXJzdFJvb3RCb3goKTsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHRS
b290Qm94KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWNoaWxkLT5oYXNBbm9ueW1vdXNJbmxp
bmVCbG9jaygpIHx8ICFjaGlsZC0+YW5vbnltb3VzSW5saW5lQmxvY2soKS0+aXNTZWxmQ29sbGFw
c2luZ0Jsb2NrKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBXZSBoYXZlIG5vIGxpbmUgYm94ZXMs
IHNvIHdlIG11c3QgYmUgc2VsZi1jb2xsYXBzaW5nLgorICAgICAgICB9CiAgICAgICAgIAogICAg
ICAgICAvLyBXaGV0aGVyIG9yIG5vdCB3ZSBjb2xsYXBzZSBpcyBkZXBlbmRlbnQgb24gd2hldGhl
ciBhbGwgb3VyIG5vcm1hbCBmbG93IGNoaWxkcmVuCiAgICAgICAgIC8vIGFyZSBhbHNvIHNlbGYt
Y29sbGFwc2luZy4KQEAgLTg1NSw3ICs4NDcsOCBAQCB2b2lkIFJlbmRlckJsb2NrOjphZGRPdmVy
Zmxvd0Zyb21GbG9hdHMoCiAKIGJvb2wgUmVuZGVyQmxvY2s6OmV4cGFuZHNUb0VuY2xvc2VPdmVy
aGFuZ2luZ0Zsb2F0cygpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIGlzSW5saW5lQmxvY2tPcklubGlu
ZVRhYmxlKCkgfHwgaXNGbG9hdGluZ09yUG9zaXRpb25lZCgpIHx8IGhhc092ZXJmbG93Q2xpcCgp
IHx8IChwYXJlbnQoKSAmJiBwYXJlbnQoKS0+aXNGbGV4aWJsZUJveCgpKSB8fCBoYXNDb2x1bW5z
KCkgfHwgaXNUYWJsZUNlbGwoKSB8fCBpc0ZpZWxkc2V0KCk7CisgICAgcmV0dXJuIGlzRmxvYXRp
bmdPclBvc2l0aW9uZWQoKSB8fCBoYXNPdmVyZmxvd0NsaXAoKSB8fCAocGFyZW50KCkgJiYgcGFy
ZW50KCktPmlzRmxleGlibGVCb3goKSkgfHwgaGFzQ29sdW1ucygpIHx8IGlzVGFibGVDZWxsKCkg
fHwgaXNGaWVsZHNldCgpIHx8CisgICAgICAgICAgIChpc0lubGluZUJsb2NrT3JJbmxpbmVUYWJs
ZSgpICYmICFpc0Fub255bW91c0lubGluZUJsb2NrKCkpOwogfQogCiB2b2lkIFJlbmRlckJsb2Nr
OjphZGp1c3RQb3NpdGlvbmVkQmxvY2soUmVuZGVyQm94KiBjaGlsZCwgY29uc3QgTWFyZ2luSW5m
byYgbWFyZ2luSW5mbykKQEAgLTEwMDEsMTkgKzk5NCwxOSBAQCBib29sIFJlbmRlckJsb2NrOjpo
YW5kbGVSdW5JbkNoaWxkKFJlbmRlCiBpbnQgUmVuZGVyQmxvY2s6OmNvbGxhcHNlTWFyZ2lucyhS
ZW5kZXJCb3gqIGNoaWxkLCBNYXJnaW5JbmZvJiBtYXJnaW5JbmZvKQogewogICAgIC8vIEdldCBv
dXIgbWF4IHBvcyBhbmQgbmVnIHRvcCBtYXJnaW5zLgotICAgIGludCBwb3NUb3AgPSBjaGlsZC0+
bWF4VG9wTWFyZ2luKHRydWUpOwotICAgIGludCBuZWdUb3AgPSBjaGlsZC0+bWF4VG9wTWFyZ2lu
KGZhbHNlKTsKKyAgICBpbnQgcG9zVG9wID0gY2hpbGQgPyBjaGlsZC0+bWF4VG9wTWFyZ2luKHRy
dWUpIDogMDsKKyAgICBpbnQgbmVnVG9wID0gY2hpbGQgPyBjaGlsZC0+bWF4VG9wTWFyZ2luKGZh
bHNlKSA6IDA7CiAKICAgICAvLyBGb3Igc2VsZi1jb2xsYXBzaW5nIGJsb2NrcywgY29sbGFwc2Ug
b3VyIGJvdHRvbSBtYXJnaW5zIGludG8gb3VyCiAgICAgLy8gdG9wIHRvIGdldCBuZXcgcG9zVG9w
IGFuZCBuZWdUb3AgdmFsdWVzLgotICAgIGlmIChjaGlsZC0+aXNTZWxmQ29sbGFwc2luZ0Jsb2Nr
KCkpIHsKKyAgICBpZiAoY2hpbGQgJiYgY2hpbGQtPmlzU2VsZkNvbGxhcHNpbmdCbG9jaygpKSB7
CiAgICAgICAgIHBvc1RvcCA9IG1heChwb3NUb3AsIGNoaWxkLT5tYXhCb3R0b21NYXJnaW4odHJ1
ZSkpOwogICAgICAgICBuZWdUb3AgPSBtYXgobmVnVG9wLCBjaGlsZC0+bWF4Qm90dG9tTWFyZ2lu
KGZhbHNlKSk7CiAgICAgfQogICAgIAogICAgIC8vIFNlZSBpZiB0aGUgdG9wIG1hcmdpbiBpcyBx
dWlya3kuIFdlIG9ubHkgY2FyZSBpZiB0aGlzIGNoaWxkIGhhcwogICAgIC8vIG1hcmdpbnMgdGhh
dCB3aWxsIGNvbGxhcHNlIHdpdGggdXMuCi0gICAgYm9vbCB0b3BRdWlyayA9IGNoaWxkLT5pc1Rv
cE1hcmdpblF1aXJrKCkgfHwgc3R5bGUoKS0+bWFyZ2luVG9wQ29sbGFwc2UoKSA9PSBNRElTQ0FS
RDsKKyAgICBib29sIHRvcFF1aXJrID0gKGNoaWxkICYmIGNoaWxkLT5pc1RvcE1hcmdpblF1aXJr
KCkpIHx8IHN0eWxlKCktPm1hcmdpblRvcENvbGxhcHNlKCkgPT0gTURJU0NBUkQ7CiAKICAgICBp
ZiAobWFyZ2luSW5mby5jYW5Db2xsYXBzZVdpdGhUb3AoKSkgewogICAgICAgICAvLyBUaGlzIGNo
aWxkIGlzIGNvbGxhcHNpbmcgd2l0aCB0aGUgdG9wIG9mIHRoZQpAQCAtMTAyNiw3ICsxMDE5LDcg
QEAgaW50IFJlbmRlckJsb2NrOjpjb2xsYXBzZU1hcmdpbnMoUmVuZGVyQgogICAgICAgICAvLyBj
b2xsYXBzZSBpdCBhd2F5LCBldmVuIGlmIHRoZSBtYXJnaW4gaXMgc21hbGxlciAod3d3LndlYnJl
ZmVyZW5jZS5jb20KICAgICAgICAgLy8gaGFzIGFuIGV4YW1wbGUgb2YgdGhpcywgYSA8ZHQ+IHdp
dGggMC44ZW0gYXV0aG9yLXNwZWNpZmllZCBpbnNpZGUKICAgICAgICAgLy8gYSA8ZGw+IGluc2lk
ZSBhIDx0ZD4uCi0gICAgICAgIGlmICghbWFyZ2luSW5mby5kZXRlcm1pbmVkVG9wUXVpcmsoKSAm
JiAhdG9wUXVpcmsgJiYgKHBvc1RvcC1uZWdUb3ApKSB7CisgICAgICAgIGlmICghbWFyZ2luSW5m
by5kZXRlcm1pbmVkVG9wUXVpcmsoKSAmJiAhdG9wUXVpcmsgJiYgKHBvc1RvcCAtIG5lZ1RvcCkp
IHsKICAgICAgICAgICAgIHNldFRvcE1hcmdpblF1aXJrKGZhbHNlKTsKICAgICAgICAgICAgIG1h
cmdpbkluZm8uc2V0RGV0ZXJtaW5lZFRvcFF1aXJrKHRydWUpOwogICAgICAgICB9CkBAIC0xMDQ0
LDcgKzEwMzcsNyBAQCBpbnQgUmVuZGVyQmxvY2s6OmNvbGxhcHNlTWFyZ2lucyhSZW5kZXJCCiAg
ICAgICAgIG1hcmdpbkluZm8uc2V0VG9wUXVpcmsodG9wUXVpcmspOwogCiAgICAgaW50IHlwb3Mg
PSBoZWlnaHQoKTsKLSAgICBpZiAoY2hpbGQtPmlzU2VsZkNvbGxhcHNpbmdCbG9jaygpKSB7Cisg
ICAgaWYgKGNoaWxkICYmIGNoaWxkLT5pc1NlbGZDb2xsYXBzaW5nQmxvY2soKSkgewogICAgICAg
ICAvLyBUaGlzIGNoaWxkIGhhcyBubyBoZWlnaHQuICBXZSBuZWVkIHRvIGNvbXB1dGUgb3VyCiAg
ICAgICAgIC8vIHBvc2l0aW9uIGJlZm9yZSB3ZSBjb2xsYXBzZSB0aGUgY2hpbGQncyBtYXJnaW5z
IHRvZ2V0aGVyLAogICAgICAgICAvLyBzbyB0aGF0IHdlIGNhbiBnZXQgYW4gYWNjdXJhdGUgcG9z
aXRpb24gZm9yIHRoZSB6ZXJvLWhlaWdodCBibG9jay4KQEAgLTEwNjMsMTMgKzEwNTYsMTEgQEAg
aW50IFJlbmRlckJsb2NrOjpjb2xsYXBzZU1hcmdpbnMoUmVuZGVyQgogICAgICAgICAgICAgLy8g
dGhhdCBuZWVkcyB0byBiZSBwb3NpdGlvbmVkIGNvcnJlY3RseSAoZS5nLiwgYSBibG9jayB0aGF0
CiAgICAgICAgICAgICAvLyBoYWQgYSBzcGVjaWZpZWQgaGVpZ2h0IG9mIDAgYnV0IHRoYXQgYWN0
dWFsbHkgaGFkIHN1YmNvbnRlbnQpLgogICAgICAgICAgICAgeXBvcyA9IGhlaWdodCgpICsgY29s
bGFwc2VkVG9wUG9zIC0gY29sbGFwc2VkVG9wTmVnOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAg
ICAgaWYgKGNoaWxkLT5zdHlsZSgpLT5tYXJnaW5Ub3BDb2xsYXBzZSgpID09IE1TRVBBUkFURSkg
eworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChjaGlsZCAmJiBjaGlsZC0+c3R5bGUoKS0+bWFy
Z2luVG9wQ29sbGFwc2UoKSA9PSBNU0VQQVJBVEUpIHsKICAgICAgICAgICAgIHNldEhlaWdodCho
ZWlnaHQoKSArIG1hcmdpbkluZm8ubWFyZ2luKCkgKyBjaGlsZC0+bWFyZ2luVG9wKCkpOwogICAg
ICAgICAgICAgeXBvcyA9IGhlaWdodCgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCFt
YXJnaW5JbmZvLmF0VG9wT2ZCbG9jaygpIHx8CisgICAgICAgIH0gZWxzZSBpZiAoIW1hcmdpbklu
Zm8uYXRUb3BPZkJsb2NrKCkgfHwKICAgICAgICAgICAgICghbWFyZ2luSW5mby5jYW5Db2xsYXBz
ZVRvcFdpdGhDaGlsZHJlbigpCiAgICAgICAgICAgICAgJiYgKCFzdHlsZSgpLT5odG1sSGFja3Mo
KSB8fCAhbWFyZ2luSW5mby5xdWlya0NvbnRhaW5lcigpIHx8ICFtYXJnaW5JbmZvLnRvcFF1aXJr
KCkpKSkgewogICAgICAgICAgICAgLy8gV2UncmUgY29sbGFwc2luZyB3aXRoIGEgcHJldmlvdXMg
c2libGluZydzIG1hcmdpbnMgYW5kIG5vdApAQCAtMTA3OCwxMSArMTA2OSwxMSBAQCBpbnQgUmVu
ZGVyQmxvY2s6OmNvbGxhcHNlTWFyZ2lucyhSZW5kZXJCCiAgICAgICAgICAgICB5cG9zID0gaGVp
Z2h0KCk7CiAgICAgICAgIH0KIAotICAgICAgICBtYXJnaW5JbmZvLnNldFBvc01hcmdpbihjaGls
ZC0+bWF4Qm90dG9tTWFyZ2luKHRydWUpKTsKLSAgICAgICAgbWFyZ2luSW5mby5zZXROZWdNYXJn
aW4oY2hpbGQtPm1heEJvdHRvbU1hcmdpbihmYWxzZSkpOworICAgICAgICBtYXJnaW5JbmZvLnNl
dFBvc01hcmdpbihjaGlsZCA/IGNoaWxkLT5tYXhCb3R0b21NYXJnaW4odHJ1ZSkgOiAwKTsKKyAg
ICAgICAgbWFyZ2luSW5mby5zZXROZWdNYXJnaW4oY2hpbGQgPyBjaGlsZC0+bWF4Qm90dG9tTWFy
Z2luKGZhbHNlKSA6IDApOwogCiAgICAgICAgIGlmIChtYXJnaW5JbmZvLm1hcmdpbigpKQotICAg
ICAgICAgICAgbWFyZ2luSW5mby5zZXRCb3R0b21RdWlyayhjaGlsZC0+aXNCb3R0b21NYXJnaW5R
dWlyaygpIHx8IHN0eWxlKCktPm1hcmdpbkJvdHRvbUNvbGxhcHNlKCkgPT0gTURJU0NBUkQpOwor
ICAgICAgICAgICAgbWFyZ2luSW5mby5zZXRCb3R0b21RdWlyaygoY2hpbGQgJiYgY2hpbGQtPmlz
Qm90dG9tTWFyZ2luUXVpcmsoKSkgfHwgc3R5bGUoKS0+bWFyZ2luQm90dG9tQ29sbGFwc2UoKSA9
PSBNRElTQ0FSRCk7CiAgICAgfQogICAgIAogICAgIHJldHVybiB5cG9zOwpAQCAtMTc0OSwyMCAr
MTc0MCw3IEBAIHZvaWQgUmVuZGVyQmxvY2s6OnBhaW50T2JqZWN0KFBhaW50SW5mbyYKICAgICBp
ZiAoKHBhaW50UGhhc2UgPT0gUGFpbnRQaGFzZU91dGxpbmUgfHwgcGFpbnRQaGFzZSA9PSBQYWlu
dFBoYXNlU2VsZk91dGxpbmUpICYmIGhhc091dGxpbmUoKSAmJiBzdHlsZSgpLT52aXNpYmlsaXR5
KCkgPT0gVklTSUJMRSkKICAgICAgICAgcGFpbnRPdXRsaW5lKHBhaW50SW5mby5jb250ZXh0LCB0
eCwgdHksIHdpZHRoKCksIGhlaWdodCgpLCBzdHlsZSgpKTsKIAotICAgIC8vIDYuIHBhaW50IGNv
bnRpbnVhdGlvbiBvdXRsaW5lcy4KLSAgICBpZiAoKHBhaW50UGhhc2UgPT0gUGFpbnRQaGFzZU91
dGxpbmUgfHwgcGFpbnRQaGFzZSA9PSBQYWludFBoYXNlQ2hpbGRPdXRsaW5lcykpIHsKLSAgICAg
ICAgaWYgKGlubGluZUNvbnRpbnVhdGlvbigpICYmIGlubGluZUNvbnRpbnVhdGlvbigpLT5oYXNP
dXRsaW5lKCkgJiYgaW5saW5lQ29udGludWF0aW9uKCktPnN0eWxlKCktPnZpc2liaWxpdHkoKSA9
PSBWSVNJQkxFKSB7Ci0gICAgICAgICAgICBSZW5kZXJJbmxpbmUqIGlubGluZVJlbmRlcmVyID0g
dG9SZW5kZXJJbmxpbmUoaW5saW5lQ29udGludWF0aW9uKCktPm5vZGUoKS0+cmVuZGVyZXIoKSk7
Ci0gICAgICAgICAgICBpZiAoIWlubGluZVJlbmRlcmVyLT5oYXNTZWxmUGFpbnRpbmdMYXllcigp
KQotICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdCbG9jaygpLT5hZGRDb250aW51YXRpb25XaXRo
T3V0bGluZShpbmxpbmVSZW5kZXJlcik7Ci0gICAgICAgICAgICBlbHNlIGlmICghaW5saW5lUmVu
ZGVyZXItPmZpcnN0TGluZUJveCgpKQotICAgICAgICAgICAgICAgIGlubGluZVJlbmRlcmVyLT5w
YWludE91dGxpbmUocGFpbnRJbmZvLmNvbnRleHQsIHR4IC0geCgpICsgaW5saW5lUmVuZGVyZXIt
PmNvbnRhaW5pbmdCbG9jaygpLT54KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICB0eSAtIHkoKSArIGlubGluZVJlbmRlcmVyLT5jb250YWluaW5nQmxvY2so
KS0+eSgpKTsKLSAgICAgICAgfQotICAgICAgICBwYWludENvbnRpbnVhdGlvbk91dGxpbmVzKHBh
aW50SW5mbywgdHgsIHR5KTsKLSAgICB9Ci0KLSAgICAvLyA3LiBwYWludCBjYXJldC4KKyAgICAv
LyA2LiBwYWludCBjYXJldC4KICAgICAvLyBJZiB0aGUgY2FyZXQncyBub2RlJ3MgcmVuZGVyIG9i
amVjdCdzIGNvbnRhaW5pbmcgYmxvY2sgaXMgdGhpcyBibG9jaywgYW5kIHRoZSBwYWludCBhY3Rp
b24gaXMgUGFpbnRQaGFzZUZvcmVncm91bmQsCiAgICAgLy8gdGhlbiBwYWludCB0aGUgY2FyZXQu
CiAgICAgaWYgKHBhaW50UGhhc2UgPT0gUGFpbnRQaGFzZUZvcmVncm91bmQpIHsgICAgICAgIApA
QCAtMTgyNSw1NyArMTgwMyw2IEBAIHZvaWQgUmVuZGVyQmxvY2s6OnBhaW50RWxsaXBzaXNCb3hl
cyhQYWkKICAgICB9CiB9CiAKLXN0YXRpYyBDb250aW51YXRpb25PdXRsaW5lVGFibGVNYXAqIGNv
bnRpbnVhdGlvbk91dGxpbmVUYWJsZSgpCi17Ci0gICAgREVGSU5FX1NUQVRJQ19MT0NBTChDb250
aW51YXRpb25PdXRsaW5lVGFibGVNYXAsIHRhYmxlLCAoKSk7Ci0gICAgcmV0dXJuICZ0YWJsZTsK
LX0KLQotdm9pZCBSZW5kZXJCbG9jazo6YWRkQ29udGludWF0aW9uV2l0aE91dGxpbmUoUmVuZGVy
SW5saW5lKiBmbG93KQotewotICAgIC8vIFdlIGNhbid0IG1ha2UgdGhpcyB3b3JrIGlmIHRoZSBp
bmxpbmUgaXMgaW4gYSBsYXllci4gIFdlJ2xsIGp1c3QgcmVseSBvbiB0aGUgYnJva2VuCi0gICAg
Ly8gd2F5IG9mIHBhaW50aW5nLgotICAgIEFTU0VSVCghZmxvdy0+bGF5ZXIoKSAmJiAhZmxvdy0+
aXNJbmxpbmVDb250aW51YXRpb24oKSk7Ci0gICAgCi0gICAgQ29udGludWF0aW9uT3V0bGluZVRh
YmxlTWFwKiB0YWJsZSA9IGNvbnRpbnVhdGlvbk91dGxpbmVUYWJsZSgpOwotICAgIExpc3RIYXNo
U2V0PFJlbmRlcklubGluZSo+KiBjb250aW51YXRpb25zID0gdGFibGUtPmdldCh0aGlzKTsKLSAg
ICBpZiAoIWNvbnRpbnVhdGlvbnMpIHsKLSAgICAgICAgY29udGludWF0aW9ucyA9IG5ldyBMaXN0
SGFzaFNldDxSZW5kZXJJbmxpbmUqPjsKLSAgICAgICAgdGFibGUtPnNldCh0aGlzLCBjb250aW51
YXRpb25zKTsKLSAgICB9Ci0gICAgCi0gICAgY29udGludWF0aW9ucy0+YWRkKGZsb3cpOwotfQot
Ci12b2lkIFJlbmRlckJsb2NrOjpwYWludENvbnRpbnVhdGlvbk91dGxpbmVzKFBhaW50SW5mbyYg
aW5mbywgaW50IHR4LCBpbnQgdHkpCi17Ci0gICAgQ29udGludWF0aW9uT3V0bGluZVRhYmxlTWFw
KiB0YWJsZSA9IGNvbnRpbnVhdGlvbk91dGxpbmVUYWJsZSgpOwotICAgIGlmICh0YWJsZS0+aXNF
bXB0eSgpKQotICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgIExpc3RIYXNoU2V0PFJlbmRl
cklubGluZSo+KiBjb250aW51YXRpb25zID0gdGFibGUtPmdldCh0aGlzKTsKLSAgICBpZiAoIWNv
bnRpbnVhdGlvbnMpCi0gICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgLy8gUGFpbnQgZWFj
aCBjb250aW51YXRpb24gb3V0bGluZS4KLSAgICBMaXN0SGFzaFNldDxSZW5kZXJJbmxpbmUqPjo6
aXRlcmF0b3IgZW5kID0gY29udGludWF0aW9ucy0+ZW5kKCk7Ci0gICAgZm9yIChMaXN0SGFzaFNl
dDxSZW5kZXJJbmxpbmUqPjo6aXRlcmF0b3IgaXQgPSBjb250aW51YXRpb25zLT5iZWdpbigpOyBp
dCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgLy8gTmVlZCB0byBhZGQgaW4gdGhlIGNvb3JkaW5h
dGVzIG9mIHRoZSBpbnRlcnZlbmluZyBibG9ja3MuCi0gICAgICAgIFJlbmRlcklubGluZSogZmxv
dyA9ICppdDsKLSAgICAgICAgUmVuZGVyQmxvY2sqIGJsb2NrID0gZmxvdy0+Y29udGFpbmluZ0Js
b2NrKCk7Ci0gICAgICAgIGZvciAoIDsgYmxvY2sgJiYgYmxvY2sgIT0gdGhpczsgYmxvY2sgPSBi
bG9jay0+Y29udGFpbmluZ0Jsb2NrKCkpIHsKLSAgICAgICAgICAgIHR4ICs9IGJsb2NrLT54KCk7
Ci0gICAgICAgICAgICB0eSArPSBibG9jay0+eSgpOwotICAgICAgICB9Ci0gICAgICAgIEFTU0VS
VChibG9jayk7ICAgCi0gICAgICAgIGZsb3ctPnBhaW50T3V0bGluZShpbmZvLmNvbnRleHQsIHR4
LCB0eSk7Ci0gICAgfQotICAgIAotICAgIC8vIERlbGV0ZQotICAgIGRlbGV0ZSBjb250aW51YXRp
b25zOwotICAgIHRhYmxlLT5yZW1vdmUodGhpcyk7Ci19Ci0KIHZvaWQgUmVuZGVyQmxvY2s6OnNl
dFNlbGVjdGlvblN0YXRlKFNlbGVjdGlvblN0YXRlIHMpCiB7CiAgICAgaWYgKHNlbGVjdGlvblN0
YXRlKCkgPT0gcykKQEAgLTE4OTAsNiArMTgxNywxMiBAQCB2b2lkIFJlbmRlckJsb2NrOjpzZXRT
ZWxlY3Rpb25TdGF0ZShTZWxlCiAgICAgZWxzZQogICAgICAgICBSZW5kZXJCb3g6OnNldFNlbGVj
dGlvblN0YXRlKHMpOwogICAgIAorICAgIGlmIChpc1JlcGxhY2VkKCkgJiYgbV9pbmxpbmVCb3hX
cmFwcGVyKSB7CisgICAgICAgIFJvb3RJbmxpbmVCb3gqIGxpbmUgPSBtX2lubGluZUJveFdyYXBw
ZXItPnJvb3QoKTsKKyAgICAgICAgaWYgKGxpbmUpCisgICAgICAgICAgICBsaW5lLT5zZXRIYXNT
ZWxlY3RlZENoaWxkcmVuKHMgIT0gU2VsZWN0aW9uTm9uZSk7CisgICAgfQorCiAgICAgUmVuZGVy
QmxvY2sqIGNiID0gY29udGFpbmluZ0Jsb2NrKCk7CiAgICAgaWYgKGNiICYmICFjYi0+aXNSZW5k
ZXJWaWV3KCkpCiAgICAgICAgIGNiLT5zZXRTZWxlY3Rpb25TdGF0ZShzKTsKQEAgLTE5MDgsOSAr
MTg0MSw5IEBAIGJvb2wgUmVuZGVyQmxvY2s6OmlzU2VsZWN0aW9uUm9vdCgpIGNvbnMKICAgICAv
LyBGSVhNRTogRXZlbnR1YWxseSB0YWJsZXMgc2hvdWxkIGhhdmUgdG8gbGVhcm4gaG93IHRvIGZp
bGwgZ2FwcyBiZXR3ZWVuIGNlbGxzLCBhdCBsZWFzdCBpbiBzaW1wbGUgbm9uLXNwYW5uaW5nIGNh
c2VzLgogICAgIGlmIChpc1RhYmxlKCkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAg
CisKICAgICBpZiAoaXNCb2R5KCkgfHwgaXNSb290KCkgfHwgaGFzT3ZlcmZsb3dDbGlwKCkgfHwg
aXNSZWxQb3NpdGlvbmVkKCkgfHwKLSAgICAgICAgaXNGbG9hdGluZ09yUG9zaXRpb25lZCgpIHx8
IGlzVGFibGVDZWxsKCkgfHwgaXNJbmxpbmVCbG9ja09ySW5saW5lVGFibGUoKSB8fCBoYXNUcmFu
c2Zvcm0oKSB8fAorICAgICAgICBpc0Zsb2F0aW5nT3JQb3NpdGlvbmVkKCkgfHwgaXNUYWJsZUNl
bGwoKSB8fCAoaXNJbmxpbmVCbG9ja09ySW5saW5lVGFibGUoKSAmJiAhaXNBbm9ueW1vdXNJbmxp
bmVCbG9jaygpKSB8fCBoYXNUcmFuc2Zvcm0oKSB8fAogICAgICAgICBoYXNSZWZsZWN0aW9uKCkg
fHwgaGFzTWFzaygpKQogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAKQEAgLTIwNTUsMTggKzE5
ODgsMzAgQEAgR2FwUmVjdHMgUmVuZGVyQmxvY2s6OmZpbGxJbmxpbmVTZWxlY3RpbwogICAgIGZv
ciAoY3VyciA9IGZpcnN0Um9vdEJveCgpOyBjdXJyICYmICFjdXJyLT5oYXNTZWxlY3RlZENoaWxk
cmVuKCk7IGN1cnIgPSBjdXJyLT5uZXh0Um9vdEJveCgpKSB7IH0KIAogICAgIC8vIE5vdyBwYWlu
dCB0aGUgZ2FwcyBmb3IgdGhlIGxpbmVzLgotICAgIGZvciAoOyBjdXJyICYmIGN1cnItPmhhc1Nl
bGVjdGVkQ2hpbGRyZW4oKTsgY3VyciA9IGN1cnItPm5leHRSb290Qm94KCkpIHsKKyAgICBmb3Ig
KDsgY3VyciAmJiAoY3Vyci0+aGFzU2VsZWN0ZWRDaGlsZHJlbigpIHx8IGN1cnItPmhhc0Fub255
bW91c0lubGluZUJsb2NrKCkpOyBjdXJyID0gY3Vyci0+bmV4dFJvb3RCb3goKSkgeworICAgICAg
ICBpZiAoIWN1cnItPmhhc1NlbGVjdGVkQ2hpbGRyZW4oKSkKKyAgICAgICAgICAgIGNvbnRpbnVl
OworCiAgICAgICAgIGludCBzZWxUb3AgPSAgY3Vyci0+c2VsZWN0aW9uVG9wKCk7CiAgICAgICAg
IGludCBzZWxIZWlnaHQgPSBjdXJyLT5zZWxlY3Rpb25IZWlnaHQoKTsKIAotICAgICAgICBpZiAo
IWNvbnRhaW5zU3RhcnQgJiYgIWxhc3RTZWxlY3RlZExpbmUgJiYKLSAgICAgICAgICAgIHNlbGVj
dGlvblN0YXRlKCkgIT0gU2VsZWN0aW9uU3RhcnQgJiYgc2VsZWN0aW9uU3RhdGUoKSAhPSBTZWxl
Y3Rpb25Cb3RoKQotICAgICAgICAgICAgcmVzdWx0LnVuaXRlQ2VudGVyKGZpbGxWZXJ0aWNhbFNl
bGVjdGlvbkdhcChsYXN0VG9wLCBsYXN0TGVmdCwgbGFzdFJpZ2h0LCB0eSArIHNlbFRvcCwKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9v
dEJsb2NrLCBibG9ja1gsIGJsb2NrWSwgcGFpbnRJbmZvKSk7Ci0KLSAgICAgICAgaWYgKCFwYWlu
dEluZm8gfHwgKHR5ICsgc2VsVG9wIDwgcGFpbnRJbmZvLT5yZWN0LmJvdHRvbSgpICYmIHR5ICsg
c2VsVG9wICsgc2VsSGVpZ2h0ID4gcGFpbnRJbmZvLT5yZWN0LnkoKSkpCi0gICAgICAgICAgICBy
ZXN1bHQudW5pdGUoY3Vyci0+ZmlsbExpbmVTZWxlY3Rpb25HYXAoc2VsVG9wLCBzZWxIZWlnaHQs
IHJvb3RCbG9jaywgYmxvY2tYLCBibG9ja1ksIHR4LCB0eSwgcGFpbnRJbmZvKSk7CisgICAgICAg
IGlmIChjdXJyLT5oYXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CisgICAgICAgICAgICBpZiAo
bGFzdFNlbGVjdGVkTGluZSkgeworICAgICAgICAgICAgICAgIGxhc3RUb3AgPSAodHkgLSBibG9j
a1kpICsgbGFzdFNlbGVjdGVkTGluZS0+c2VsZWN0aW9uQm90dG9tKCk7CisgICAgICAgICAgICAg
ICAgbGFzdExlZnQgPSBsZWZ0U2VsZWN0aW9uT2Zmc2V0KHJvb3RCbG9jaywgbGFzdFNlbGVjdGVk
TGluZS0+c2VsZWN0aW9uQm90dG9tKCkpOworICAgICAgICAgICAgICAgIGxhc3RSaWdodCA9IHJp
Z2h0U2VsZWN0aW9uT2Zmc2V0KHJvb3RCbG9jaywgbGFzdFNlbGVjdGVkTGluZS0+c2VsZWN0aW9u
Qm90dG9tKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGFpbnNTdGFydCA9IGZh
bHNlOworICAgICAgICAgICAgcmVzdWx0LnVuaXRlKGN1cnItPmFub255bW91c0lubGluZUJsb2Nr
KCktPmZpbGxTZWxlY3Rpb25HYXBzKHJvb3RCbG9jaywgYmxvY2tYLCBibG9ja1ksIHR4ICsgY3Vy
ci0+eCgpLCB0eSArIGN1cnItPnkoKSwgbGFzdFRvcCwgbGFzdExlZnQsIGxhc3RSaWdodCwgcGFp
bnRJbmZvKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIWNvbnRhaW5zU3Rh
cnQgJiYgKCFsYXN0U2VsZWN0ZWRMaW5lIHx8IGxhc3RTZWxlY3RlZExpbmUtPmFub255bW91c0lu
bGluZUJsb2NrKCkpKQorICAgICAgICAgICAgICAgIHJlc3VsdC51bml0ZUNlbnRlcihmaWxsVmVy
dGljYWxTZWxlY3Rpb25HYXAobGFzdFRvcCwgbGFzdExlZnQsIGxhc3RSaWdodCwgdHkgKyBzZWxU
b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICByb290QmxvY2ssIGJsb2NrWCwgYmxvY2tZLCBwYWludEluZm8pKTsKIAorICAgICAg
ICAgICAgaWYgKCFwYWludEluZm8gfHwgKHR5ICsgc2VsVG9wIDwgcGFpbnRJbmZvLT5yZWN0LmJv
dHRvbSgpICYmIHR5ICsgc2VsVG9wICsgc2VsSGVpZ2h0ID4gcGFpbnRJbmZvLT5yZWN0LnkoKSkp
CisgICAgICAgICAgICAgICAgcmVzdWx0LnVuaXRlKGN1cnItPmZpbGxMaW5lU2VsZWN0aW9uR2Fw
KHNlbFRvcCwgc2VsSGVpZ2h0LCByb290QmxvY2ssIGJsb2NrWCwgYmxvY2tZLCB0eCwgdHksIHBh
aW50SW5mbykpOworICAgICAgICB9CisgICAgICAgIAogICAgICAgICBsYXN0U2VsZWN0ZWRMaW5l
ID0gY3VycjsKICAgICB9CiAKQEAgLTIwNzQsOCArMjAxOSw4IEBAIEdhcFJlY3RzIFJlbmRlckJs
b2NrOjpmaWxsSW5saW5lU2VsZWN0aW8KICAgICAgICAgLy8gVmlzaWJsZVNlbGVjdGlvbiBtdXN0
IHN0YXJ0IGp1c3QgYWZ0ZXIgb3VyIGxhc3QgbGluZS4KICAgICAgICAgbGFzdFNlbGVjdGVkTGlu
ZSA9IGxhc3RSb290Qm94KCk7CiAKLSAgICBpZiAobGFzdFNlbGVjdGVkTGluZSAmJiBzZWxlY3Rp
b25TdGF0ZSgpICE9IFNlbGVjdGlvbkVuZCAmJiBzZWxlY3Rpb25TdGF0ZSgpICE9IFNlbGVjdGlv
bkJvdGgpIHsKLSAgICAgICAgLy8gR28gYWhlYWQgYW5kIHVwZGF0ZSBvdXIgbGFzdFkgdG8gYmUg
dGhlIGJvdHRvbSBvZiB0aGUgbGFzdCBzZWxlY3RlZCBsaW5lLgorICAgIGlmIChsYXN0U2VsZWN0
ZWRMaW5lICYmICFsYXN0U2VsZWN0ZWRMaW5lLT5oYXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpICYm
IHNlbGVjdGlvblN0YXRlKCkgIT0gU2VsZWN0aW9uRW5kICYmIHNlbGVjdGlvblN0YXRlKCkgIT0g
U2VsZWN0aW9uQm90aCkgeworICAgICAgICAvLyBHbyBhaGVhZCBhbmQgdXBkYXRlIG91ciBsYXN0
VG9wIHRvIGJlIHRoZSBib3R0b20gb2YgdGhlIGxhc3Qgc2VsZWN0ZWQgbGluZS4KICAgICAgICAg
bGFzdFRvcCA9ICh0eSAtIGJsb2NrWSkgKyBsYXN0U2VsZWN0ZWRMaW5lLT5zZWxlY3Rpb25Cb3R0
b20oKTsKICAgICAgICAgbGFzdExlZnQgPSBsZWZ0U2VsZWN0aW9uT2Zmc2V0KHJvb3RCbG9jaywg
bGFzdFNlbGVjdGVkTGluZS0+c2VsZWN0aW9uQm90dG9tKCkpOwogICAgICAgICBsYXN0UmlnaHQg
PSByaWdodFNlbGVjdGlvbk9mZnNldChyb290QmxvY2ssIGxhc3RTZWxlY3RlZExpbmUtPnNlbGVj
dGlvbkJvdHRvbSgpKTsKQEAgLTI5ODUsMjUgKzI5MzAsMzEgQEAgdm9pZCBSZW5kZXJCbG9jazo6
Y2xlYXJGbG9hdHMoKQogICAgIC8vIG91dCBvZiBmbG93IChsaWtlIGZsb2F0aW5nL3Bvc2l0aW9u
ZWQgZWxlbWVudHMpLCBhbmQgd2UgYWxzbyBza2lwIG92ZXIgYW55IG9iamVjdHMgdGhhdCBtYXkg
aGF2ZSBzaGlmdGVkCiAgICAgLy8gdG8gYXZvaWQgZmxvYXRzLgogICAgIGJvb2wgcGFyZW50SGFz
RmxvYXRzID0gZmFsc2U7Ci0gICAgUmVuZGVyT2JqZWN0KiBwcmV2ID0gcHJldmlvdXNTaWJsaW5n
KCk7Ci0gICAgd2hpbGUgKHByZXYgJiYgKHByZXYtPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSB8
fCAhcHJldi0+aXNCb3goKSB8fCAhcHJldi0+aXNSZW5kZXJCbG9jaygpIHx8IHRvUmVuZGVyQmxv
Y2socHJldiktPmF2b2lkc0Zsb2F0cygpKSkgewotICAgICAgICBpZiAocHJldi0+aXNGbG9hdGlu
ZygpKQotICAgICAgICAgICAgcGFyZW50SGFzRmxvYXRzID0gdHJ1ZTsKLSAgICAgICAgIHByZXYg
PSBwcmV2LT5wcmV2aW91c1NpYmxpbmcoKTsKKyAgICBSZW5kZXJPYmplY3QqIHByZXYgPSAwOwor
ICAgIFJlbmRlckJsb2NrKiBwYXJlbnRCbG9jayA9IDA7CisgICAgaWYgKGlzQW5vbnltb3VzSW5s
aW5lQmxvY2soKSkgeworICAgICAgICBwYXJlbnRCbG9jayA9IGNvbnRhaW5pbmdCbG9jaygpOwor
ICAgICAgICBwYXJlbnRIYXNGbG9hdHMgPSBwYXJlbnRCbG9jay0+Y29udGFpbnNGbG9hdHMoKTsK
KyAgICB9IGVsc2UgeyAgICAKKyAgICAgICAgd2hpbGUgKHByZXYgJiYgKHByZXYtPmlzRmxvYXRp
bmdPclBvc2l0aW9uZWQoKSB8fCAhcHJldi0+aXNCb3goKSB8fCAhcHJldi0+aXNSZW5kZXJCbG9j
aygpIHx8IHRvUmVuZGVyQmxvY2socHJldiktPmF2b2lkc0Zsb2F0cygpKSkgeworICAgICAgICAg
ICAgaWYgKHByZXYtPmlzRmxvYXRpbmcoKSkKKyAgICAgICAgICAgICAgICBwYXJlbnRIYXNGbG9h
dHMgPSB0cnVlOworICAgICAgICAgICAgcHJldiA9IHByZXYtPnByZXZpb3VzU2libGluZygpOwor
ICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwYXJlbnRCbG9jayA9IHBhcmVudCgpLT5pc1Jl
bmRlckJsb2NrKCkgPyB0b1JlbmRlckJsb2NrKHBhcmVudCgpKSA6IDA7CiAgICAgfQogCiAgICAg
Ly8gRmlyc3QgYWRkIGluIGZsb2F0cyBmcm9tIHRoZSBwYXJlbnQuCiAgICAgaW50IG9mZnNldCA9
IHkoKTsKLSAgICBpZiAocGFyZW50SGFzRmxvYXRzKSB7Ci0gICAgICAgIFJlbmRlckJsb2NrKiBw
YXJlbnRCbG9jayA9IHRvUmVuZGVyQmxvY2socGFyZW50KCkpOworICAgIGlmIChwYXJlbnRIYXNG
bG9hdHMpCiAgICAgICAgIGFkZEludHJ1ZGluZ0Zsb2F0cyhwYXJlbnRCbG9jaywgcGFyZW50Qmxv
Y2stPmJvcmRlckxlZnQoKSArIHBhcmVudEJsb2NrLT5wYWRkaW5nTGVmdCgpLCBvZmZzZXQpOwot
ICAgIH0KLSAgICAKKwogICAgIGludCB4b2Zmc2V0ID0gMDsKICAgICBpZiAocHJldikKICAgICAg
ICAgb2Zmc2V0IC09IHRvUmVuZGVyQm94KHByZXYpLT55KCk7Ci0gICAgZWxzZSBpZiAocGFyZW50
KCktPmlzQm94KCkpIHsKLSAgICAgICAgcHJldiA9IHBhcmVudCgpOworICAgIGVsc2UgaWYgKHBh
cmVudEJsb2NrKSB7CisgICAgICAgIHByZXYgPSBwYXJlbnRCbG9jazsKICAgICAgICAgeG9mZnNl
dCArPSB0b1JlbmRlckJveChwcmV2KS0+Ym9yZGVyTGVmdCgpICsgdG9SZW5kZXJCb3gocHJldikt
PnBhZGRpbmdMZWZ0KCk7CiAgICAgfQogCkBAIC0zMTM4LDcgKzMwODksNyBAQCB2b2lkIFJlbmRl
ckJsb2NrOjphZGRJbnRydWRpbmdGbG9hdHMoUmVuCiAgICAgICAgICAgICAgICAgLy8gYWJvdmUu
ICB8eG9mZnwgd2lsbCBlcXVhbCAtZmxvdy0+bWFyZ2luTGVmdCgpIGluIHRoaXMgY2FzZSwgc28g
aXQncyBhbHJlYWR5IGJlZW4gdGFrZW4KICAgICAgICAgICAgICAgICAvLyBpbnRvIGFjY291bnQu
ICBPbmx5IGFwcGx5IHRoaXMgY29kZSBpZiB8Y2hpbGR8IGlzIGZhbHNlLCBzaW5jZSBvdGhlcndp
c2UgdGhlIGxlZnQgbWFyZ2luCiAgICAgICAgICAgICAgICAgLy8gd2lsbCBnZXQgYXBwbGllZCB0
d2ljZS4KLSAgICAgICAgICAgICAgICBpZiAocHJldiAhPSBwYXJlbnQoKSkKKyAgICAgICAgICAg
ICAgICBpZiAocHJldiAhPSBjb250YWluaW5nQmxvY2soKSkKICAgICAgICAgICAgICAgICAgICAg
ZmxvYXRpbmdPYmotPm1fbGVmdCArPSBwcmV2LT5tYXJnaW5MZWZ0KCk7CiAgICAgICAgICAgICAg
ICAgZmxvYXRpbmdPYmotPm1fbGVmdCAtPSBtYXJnaW5MZWZ0KCk7CiAgICAgICAgICAgICAgICAg
ZmxvYXRpbmdPYmotPm1fc2hvdWxkUGFpbnQgPSBmYWxzZTsgIC8vIFdlIGFyZSBub3QgaW4gdGhl
IGRpcmVjdCBpbmhlcml0YW5jZSBjaGFpbiBmb3IgdGhpcyBmbG9hdC4gV2Ugd2lsbCBuZXZlciBw
YWludCBpdC4KQEAgLTMxODMsNyArMzEzNCwxMyBAQCB2b2lkIFJlbmRlckJsb2NrOjptYXJrQWxs
RGVzY2VuZGFudHNXaXRoCiAgICAgICAgIHJlbW92ZUZsb2F0aW5nT2JqZWN0KGZsb2F0VG9SZW1v
dmUpOwogCiAgICAgLy8gSXRlcmF0ZSBvdmVyIG91ciBjaGlsZHJlbiBhbmQgbWFyayB0aGVtIGFz
IG5lZWRlZC4KLSAgICBpZiAoIWNoaWxkcmVuSW5saW5lKCkpIHsKKyAgICBpZiAoY2hpbGRyZW5J
bmxpbmUoKSkgeworICAgICAgICBmb3IgKFJvb3RJbmxpbmVCb3gqIGJveCA9IGZpcnN0Um9vdEJv
eCgpOyBib3g7IGJveCA9IGJveC0+bmV4dFJvb3RCb3goKSkgeworICAgICAgICAgICAgUmVuZGVy
QmxvY2sqIGNoaWxkQmxvY2sgPSBib3gtPmFub255bW91c0lubGluZUJsb2NrKCk7CisgICAgICAg
ICAgICBpZiAoY2hpbGRCbG9jayAmJiAoZmxvYXRUb1JlbW92ZSA/IGNoaWxkQmxvY2stPmNvbnRh
aW5zRmxvYXQoZmxvYXRUb1JlbW92ZSkgOiBjaGlsZEJsb2NrLT5jb250YWluc0Zsb2F0cygpKSkK
KyAgICAgICAgICAgICAgICBjaGlsZEJsb2NrLT5tYXJrQWxsRGVzY2VuZGFudHNXaXRoRmxvYXRz
Rm9yTGF5b3V0KGZsb2F0VG9SZW1vdmUsIGluTGF5b3V0KTsKKyAgICAgICAgfQorICAgIH0gZWxz
ZSB7CiAgICAgICAgIGZvciAoUmVuZGVyT2JqZWN0KiBjaGlsZCA9IGZpcnN0Q2hpbGQoKTsgY2hp
bGQ7IGNoaWxkID0gY2hpbGQtPm5leHRTaWJsaW5nKCkpIHsKICAgICAgICAgICAgIGlmICgoIWZs
b2F0VG9SZW1vdmUgJiYgY2hpbGQtPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSkgfHwgIWNoaWxk
LT5pc1JlbmRlckJsb2NrKCkpCiAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC0zNDUxLDYg
KzM0MDgsMTEgQEAgc3RhdGljIFZpc2libGVQb3NpdGlvbiBwb3NpdGlvbkZvclBvaW50UgogICAg
IHJldHVybiBhbmNlc3Rvci0+Y3JlYXRlVmlzaWJsZVBvc2l0aW9uKGNoaWxkTm9kZS0+bm9kZUlu
ZGV4KCkgKyAxLCBVUFNUUkVBTSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0NoaWxkSGl0
VGVzdENhbmRpZGF0ZShSZW5kZXJCb3gqIGJveCkKK3sKKyAgICByZXR1cm4gYm94LT5oZWlnaHQo
KSAmJiBib3gtPnN0eWxlKCktPnZpc2liaWxpdHkoKSA9PSBWSVNJQkxFICYmICFib3gtPmlzRmxv
YXRpbmdPclBvc2l0aW9uZWQoKTsKK30KKwogVmlzaWJsZVBvc2l0aW9uIFJlbmRlckJsb2NrOjpw
b3NpdGlvbkZvclBvaW50V2l0aElubGluZUNoaWxkcmVuKGNvbnN0IEludFBvaW50JiBwb2ludElu
Q29udGVudHMpCiB7CiAgICAgQVNTRVJUKGNoaWxkcmVuSW5saW5lKCkpOwpAQCAtMzQ2Myw4ICsz
NDI1LDE4IEBAIFZpc2libGVQb3NpdGlvbiBSZW5kZXJCbG9jazo6cG9zaXRpb25Gb3IKICAgICBS
b290SW5saW5lQm94KiBmaXJzdFJvb3RCb3hXaXRoQ2hpbGRyZW4gPSAwOwogICAgIFJvb3RJbmxp
bmVCb3gqIGxhc3RSb290Qm94V2l0aENoaWxkcmVuID0gMDsKICAgICBmb3IgKFJvb3RJbmxpbmVC
b3gqIHJvb3QgPSBmaXJzdFJvb3RCb3goKTsgcm9vdDsgcm9vdCA9IHJvb3QtPm5leHRSb290Qm94
KCkpIHsKKyAgICAgICAgUmVuZGVyQmxvY2sqIGNoaWxkQmxvY2sgPSByb290LT5hbm9ueW1vdXNJ
bmxpbmVCbG9jaygpOworICAgICAgICBpZiAoY2hpbGRCbG9jaykgeworICAgICAgICAgICAgZmly
c3RSb290Qm94V2l0aENoaWxkcmVuID0gMDsKKyAgICAgICAgICAgIGxhc3RSb290Qm94V2l0aENo
aWxkcmVuID0gMDsKKyAgICAgICAgICAgIGlmIChpc0NoaWxkSGl0VGVzdENhbmRpZGF0ZShjaGls
ZEJsb2NrKSAmJiBwb2ludEluQ29udGVudHMueSgpIDwgY2hpbGRCbG9jay0+ZnJhbWVSZWN0KCku
Ym90dG9tKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uRm9yUG9pbnRSZXNwZWN0
aW5nRWRpdGluZ0JvdW5kYXJpZXModGhpcywgY2hpbGRCbG9jaywgcG9pbnRJbkNvbnRlbnRzKTsK
KyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKICAgICAgICAgaWYgKCFyb290LT5m
aXJzdExlYWZDaGlsZCgpKQogICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIAogICAgICAg
ICBpZiAoIWZpcnN0Um9vdEJveFdpdGhDaGlsZHJlbikKICAgICAgICAgICAgIGZpcnN0Um9vdEJv
eFdpdGhDaGlsZHJlbiA9IHJvb3Q7CiAgICAgICAgIGxhc3RSb290Qm94V2l0aENoaWxkcmVuID0g
cm9vdDsKQEAgLTM0NzIsNyArMzQ0NCw3IEBAIFZpc2libGVQb3NpdGlvbiBSZW5kZXJCbG9jazo6
cG9zaXRpb25Gb3IKICAgICAgICAgLy8gc2V0IHRoZSBib3R0b20gYmFzZWQgb24gd2hldGhlciB0
aGVyZSBpcyBhIG5leHQgcm9vdCBib3gKICAgICAgICAgLy8gRklYTUU6IFRoaXMgd2lsbCBjb25z
aWRlciBuZXh0Um9vdEJveCBldmVuIGlmIGl0IGhhcyBubyBjaGlsZHJlbiwgYW5kIG1heWJlIGl0
IHNob3VsZG4ndC4KICAgICAgICAgaW50IGJvdHRvbTsKLSAgICAgICAgaWYgKHJvb3QtPm5leHRS
b290Qm94KCkpIHsKKyAgICAgICAgaWYgKHJvb3QtPm5leHRSb290Qm94KCkgJiYgIXJvb3QtPm5l
eHRSb290Qm94KCktPmhhc0Fub255bW91c0lubGluZUJsb2NrKCkpIHsKICAgICAgICAgICAgIC8v
IEZJWE1FOiBXZSB3b3VsZCBwcmVmZXIgdG8gbWFrZSB0aGUgYnJlYWsgcG9pbnQgaGFsZndheSBi
ZXR3ZWVuIHRoZSBib3R0b20KICAgICAgICAgICAgIC8vIG9mIHRoZSBwcmV2aW91cyByb290IGJv
eCBhbmQgdGhlIHRvcCBvZiB0aGUgbmV4dCByb290IGJveC4KICAgICAgICAgICAgIGJvdHRvbSA9
IHJvb3QtPm5leHRSb290Qm94KCktPmxpbmVUb3AoKTsKQEAgLTM1MTcsMTcgKzM0ODksMTIgQEAg
VmlzaWJsZVBvc2l0aW9uIFJlbmRlckJsb2NrOjpwb3NpdGlvbkZvcgogICAgIHJldHVybiBjcmVh
dGVWaXNpYmxlUG9zaXRpb24oMCwgRE9XTlNUUkVBTSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgYm9v
bCBpc0NoaWxkSGl0VGVzdENhbmRpZGF0ZShSZW5kZXJCb3gqIGJveCkKLXsKLSAgICByZXR1cm4g
Ym94LT5oZWlnaHQoKSAmJiBib3gtPnN0eWxlKCktPnZpc2liaWxpdHkoKSA9PSBWSVNJQkxFICYm
ICFib3gtPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKTsKLX0KLQogVmlzaWJsZVBvc2l0aW9uIFJl
bmRlckJsb2NrOjpwb3NpdGlvbkZvclBvaW50KGNvbnN0IEludFBvaW50JiBwb2ludCkKIHsKICAg
ICBpZiAoaXNUYWJsZSgpKQogICAgICAgICByZXR1cm4gUmVuZGVyQm94Ojpwb3NpdGlvbkZvclBv
aW50KHBvaW50KTsKIAotICAgIGlmIChpc1JlcGxhY2VkKCkpIHsKKyAgICBpZiAoaXNSZXBsYWNl
ZCgpICYmICFpc0Fub255bW91c0lubGluZUJsb2NrKCkpIHsKICAgICAgICAgaWYgKHBvaW50Lnko
KSA8IDAgfHwgKHBvaW50LnkoKSA8IGhlaWdodCgpICYmIHBvaW50LngoKSA8IDApKQogICAgICAg
ICAgICAgcmV0dXJuIGNyZWF0ZVZpc2libGVQb3NpdGlvbihjYXJldE1pbk9mZnNldCgpLCBET1dO
U1RSRUFNKTsKICAgICAgICAgaWYgKHBvaW50LnkoKSA+PSBoZWlnaHQoKSB8fCAocG9pbnQueSgp
ID49IDAgJiYgcG9pbnQueCgpID49IHdpZHRoKCkpKQpAQCAtNDE0MiwxNCArNDEwOSwxNSBAQCB2
b2lkIFJlbmRlckJsb2NrOjpjYWxjSW5saW5lUHJlZldpZHRocygpCiAgICAgICAgICAgICAgICAg
fSBlbHNlCiAgICAgICAgICAgICAgICAgICAgIGNsZWFyUHJldmlvdXNGbG9hdCA9IGZhbHNlOwog
Ci0gICAgICAgICAgICAgICAgYm9vbCBjYW5CcmVha1JlcGxhY2VkRWxlbWVudCA9ICFjaGlsZC0+
aXNJbWFnZSgpIHx8IGFsbG93SW1hZ2VzVG9CcmVhazsKKyAgICAgICAgICAgICAgICBib29sIGNh
bkJyZWFrUmVwbGFjZWRFbGVtZW50ID0gIWNoaWxkLT5pc0ltYWdlKCkgfHwgYWxsb3dJbWFnZXNU
b0JyZWFrIHx8IGNoaWxkLT5pc0Fub255bW91c0lubGluZUJsb2NrKCk7CiAgICAgICAgICAgICAg
ICAgaWYgKChjYW5CcmVha1JlcGxhY2VkRWxlbWVudCAmJiAoYXV0b1dyYXAgfHwgb2xkQXV0b1dy
YXApKSB8fCBjbGVhclByZXZpb3VzRmxvYXQpIHsKICAgICAgICAgICAgICAgICAgICAgbV9taW5Q
cmVmV2lkdGggPSBtYXgoaW5saW5lTWluLCBtX21pblByZWZXaWR0aCk7CiAgICAgICAgICAgICAg
ICAgICAgIGlubGluZU1pbiA9IDA7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAg
ICAgLy8gSWYgd2UncmUgc3VwcG9zZWQgdG8gY2xlYXIgdGhlIHByZXZpb3VzIGZsb2F0LCB0aGVu
IHRlcm1pbmF0ZSBtYXh3aWR0aCBhcyB3ZWxsLgotICAgICAgICAgICAgICAgIGlmIChjbGVhclBy
ZXZpb3VzRmxvYXQpIHsKKyAgICAgICAgICAgICAgICAvLyBBbHNvIGRvIHRoaXMgZm9yIGFub255
bW91cyBpbmxpbmUgYmxvY2tzLgorICAgICAgICAgICAgICAgIGlmIChjbGVhclByZXZpb3VzRmxv
YXQgfHwgY2hpbGQtPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkgewogICAgICAgICAgICAgICAg
ICAgICBtX21heFByZWZXaWR0aCA9IG1heChpbmxpbmVNYXgsIG1fbWF4UHJlZldpZHRoKTsKICAg
ICAgICAgICAgICAgICAgICAgaW5saW5lTWF4ID0gMDsKICAgICAgICAgICAgICAgICB9CkBAIC00
MTU4LDE1ICs0MTI2LDE3IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmNhbGNJbmxpbmVQcmVmV2lkdGhz
KCkKICAgICAgICAgICAgICAgICBpbnQgdGkgPSAwOwogICAgICAgICAgICAgICAgIGlmICghYWRk
ZWRUZXh0SW5kZW50KSB7CiAgICAgICAgICAgICAgICAgICAgIGFkZGVkVGV4dEluZGVudCA9IHRy
dWU7Ci0gICAgICAgICAgICAgICAgICAgIHRpID0gc3R5bGUoKS0+dGV4dEluZGVudCgpLmNhbGNN
aW5WYWx1ZShjdyk7Ci0gICAgICAgICAgICAgICAgICAgIGNoaWxkTWluKz10aTsKLSAgICAgICAg
ICAgICAgICAgICAgY2hpbGRNYXgrPXRpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxk
LT5pc0Fub255bW91c0lubGluZUJsb2NrKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRp
ID0gc3R5bGUoKS0+dGV4dEluZGVudCgpLmNhbGNNaW5WYWx1ZShjdyk7CisgICAgICAgICAgICAg
ICAgICAgICAgICBjaGlsZE1pbiArPSB0aTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxk
TWF4ICs9IHRpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCiAg
ICAgICAgICAgICAgICAgLy8gQWRkIG91ciB3aWR0aCB0byB0aGUgbWF4LgogICAgICAgICAgICAg
ICAgIGlubGluZU1heCArPSBjaGlsZE1heDsKIAotICAgICAgICAgICAgICAgIGlmICghYXV0b1dy
YXAgfHwgIWNhbkJyZWFrUmVwbGFjZWRFbGVtZW50KSB7CisgICAgICAgICAgICAgICAgaWYgKCgh
YXV0b1dyYXAgfHwgIWNhbkJyZWFrUmVwbGFjZWRFbGVtZW50KSAmJiAhY2hpbGQtPmlzQW5vbnlt
b3VzSW5saW5lQmxvY2soKSkgewogICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQtPmlzRmxv
YXRpbmcoKSkKICAgICAgICAgICAgICAgICAgICAgICAgIG1fbWluUHJlZldpZHRoID0gbWF4KGNo
aWxkTWluLCBtX21pblByZWZXaWR0aCk7CiAgICAgICAgICAgICAgICAgICAgIGVsc2UKQEAgLTQx
NzcsNiArNDE0NywxMiBAQCB2b2lkIFJlbmRlckJsb2NrOjpjYWxjSW5saW5lUHJlZldpZHRocygp
CiAKICAgICAgICAgICAgICAgICAgICAgLy8gTm93IHN0YXJ0IGEgbmV3IGxpbmUuCiAgICAgICAg
ICAgICAgICAgICAgIGlubGluZU1pbiA9IDA7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAg
ICAgICAgICAgICAgICBpZiAoY2hpbGQtPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkgeworICAg
ICAgICAgICAgICAgICAgICAgICAgLy8gVGVybWluYXRlIG1heCB3aWR0aCBhcyB3ZWxsLgorICAg
ICAgICAgICAgICAgICAgICAgICAgbV9tYXhQcmVmV2lkdGggPSBtYXgoY2hpbGRNYXgsIG1fbWF4
UHJlZldpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZU1heCA9IDA7CisgICAg
ICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAv
LyBXZSBhcmUgbm8gbG9uZ2VyIHN0cmlwcGluZyB3aGl0ZXNwYWNlIGF0IHRoZSBzdGFydCBvZgpA
QCAtNDQxNyw5ICs0MzkzLDEyIEBAIGludCBSZW5kZXJCbG9jazo6bGluZUhlaWdodChib29sIGZp
cnN0TGkKICAgICAvLyB0aGUgYmFzZSBjbGFzcy4gIElmIHdlJ3JlIGJlaW5nIHF1ZXJpZWQgYXMg
dGhvdWdoIHdlJ3JlIHRoZSByb290IGxpbmUKICAgICAvLyBib3gsIHRoZW4gdGhlIGZhY3QgdGhh
dCB3ZSdyZSBhbiBpbmxpbmUtYmxvY2sgaXMgaXJyZWxldmFudCwgYW5kIHdlIGJlaGF2ZQogICAg
IC8vIGp1c3QgbGlrZSBhIGJsb2NrLgotICAgIGlmIChpc1JlcGxhY2VkKCkgJiYgIWlzUm9vdExp
bmVCb3gpCisgICAgaWYgKGlzUmVwbGFjZWQoKSAmJiAhaXNSb290TGluZUJveCkgeworICAgICAg
ICBpZiAoaXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKQorICAgICAgICAgICAgcmV0dXJuIGhlaWdo
dCgpOwogICAgICAgICByZXR1cm4gaGVpZ2h0KCkgKyBtYXJnaW5Ub3AoKSArIG1hcmdpbkJvdHRv
bSgpOwotICAgIAorICAgIH0KKwogICAgIGlmIChmaXJzdExpbmUgJiYgZG9jdW1lbnQoKS0+dXNl
c0ZpcnN0TGluZVJ1bGVzKCkpIHsKICAgICAgICAgUmVuZGVyU3R5bGUqIHMgPSBzdHlsZShmaXJz
dExpbmUpOwogICAgICAgICBpZiAocyAhPSBzdHlsZSgpKQpAQCAtNDQ1MSw2ICs0NDMwLDggQEAg
aW50IFJlbmRlckJsb2NrOjpiYXNlbGluZVBvc2l0aW9uKGJvb2wgYgogICAgICAgICAvLyBXZSBh
bHNvIGdpdmUgdXAgb24gZmluZGluZyBhIGJhc2VsaW5lIGlmIHdlIGhhdmUgYSB2ZXJ0aWNhbCBz
Y3JvbGxiYXIsIG9yIGlmIHdlIGFyZSBzY3JvbGxlZAogICAgICAgICAvLyB2ZXJ0aWNhbGx5IChl
LmcuLCBhbiBvdmVyZmxvdzpoaWRkZW4gYmxvY2sgdGhhdCBoYXMgaGFkIHNjcm9sbFRvcCBtb3Zl
ZCkgb3IgaWYgdGhlIGJhc2VsaW5lIGlzIG91dHNpZGUKICAgICAgICAgLy8gb2Ygb3VyIGNvbnRl
bnQgYm94LgorICAgICAgICBpZiAoaXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKQorICAgICAgICAg
ICAgcmV0dXJuIGhlaWdodCgpOwogICAgICAgICBpbnQgYmFzZWxpbmVQb3MgPSAobGF5ZXIoKSAm
JiAobGF5ZXIoKS0+bWFycXVlZSgpIHx8IGxheWVyKCktPnZlcnRpY2FsU2Nyb2xsYmFyKCkgfHwg
bGF5ZXIoKS0+c2Nyb2xsWU9mZnNldCgpICE9IDApKSA/IC0xIDogbGFzdExpbmVCb3hCYXNlbGlu
ZSgpOwogICAgICAgICBpZiAoYmFzZWxpbmVQb3MgIT0gLTEgJiYgYmFzZWxpbmVQb3MgPD0gYm9y
ZGVyVG9wKCkgKyBwYWRkaW5nVG9wKCkgKyBjb250ZW50SGVpZ2h0KCkpCiAgICAgICAgICAgICBy
ZXR1cm4gbWFyZ2luVG9wKCkgKyBiYXNlbGluZVBvczsKQEAgLTQ4NzUsNjAgKzQ4NTYsNiBAQCB2
b2lkIFJlbmRlckJsb2NrOjpzZXRNYXhCb3R0b21NYXJnaW5zKGluCiAgICAgbV9tYXhNYXJnaW4t
Pm1fYm90dG9tTmVnID0gbmVnOwogfQogCi12b2lkIFJlbmRlckJsb2NrOjphYnNvbHV0ZVJlY3Rz
KFZlY3RvcjxJbnRSZWN0PiYgcmVjdHMsIGludCB0eCwgaW50IHR5KQotewotICAgIC8vIEZvciBi
bG9ja3MgaW5zaWRlIGlubGluZXMsIHdlIGdvIGFoZWFkIGFuZCBpbmNsdWRlIG1hcmdpbnMgc28g
dGhhdCB3ZSBydW4gcmlnaHQgdXAgdG8gdGhlCi0gICAgLy8gaW5saW5lIGJveGVzIGFib3ZlIGFu
ZCBiZWxvdyB1cyAodGh1cyBnZXR0aW5nIG1lcmdlZCB3aXRoIHRoZW0gdG8gZm9ybSBhIHNpbmds
ZSBpcnJlZ3VsYXIKLSAgICAvLyBzaGFwZSkuCi0gICAgaWYgKGlubGluZUNvbnRpbnVhdGlvbigp
KSB7Ci0gICAgICAgIHJlY3RzLmFwcGVuZChJbnRSZWN0KHR4LCB0eSAtIGNvbGxhcHNlZE1hcmdp
blRvcCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCgpLCBoZWlnaHQoKSAr
IGNvbGxhcHNlZE1hcmdpblRvcCgpICsgY29sbGFwc2VkTWFyZ2luQm90dG9tKCkpKTsKLSAgICAg
ICAgaW5saW5lQ29udGludWF0aW9uKCktPmFic29sdXRlUmVjdHMocmVjdHMsCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4IC0geCgpICsgaW5saW5lQ29udGlu
dWF0aW9uKCktPmNvbnRhaW5pbmdCbG9jaygpLT54KCksCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHR5IC0geSgpICsgaW5saW5lQ29udGludWF0aW9uKCktPmNv
bnRhaW5pbmdCbG9jaygpLT55KCkpOwotICAgIH0gZWxzZQotICAgICAgICByZWN0cy5hcHBlbmQo
SW50UmVjdCh0eCwgdHksIHdpZHRoKCksIGhlaWdodCgpKSk7Ci19Ci0KLXZvaWQgUmVuZGVyQmxv
Y2s6OmFic29sdXRlUXVhZHMoVmVjdG9yPEZsb2F0UXVhZD4mIHF1YWRzKQotewotICAgIC8vIEZv
ciBibG9ja3MgaW5zaWRlIGlubGluZXMsIHdlIGdvIGFoZWFkIGFuZCBpbmNsdWRlIG1hcmdpbnMg
c28gdGhhdCB3ZSBydW4gcmlnaHQgdXAgdG8gdGhlCi0gICAgLy8gaW5saW5lIGJveGVzIGFib3Zl
IGFuZCBiZWxvdyB1cyAodGh1cyBnZXR0aW5nIG1lcmdlZCB3aXRoIHRoZW0gdG8gZm9ybSBhIHNp
bmdsZSBpcnJlZ3VsYXIKLSAgICAvLyBzaGFwZSkuCi0gICAgaWYgKGlubGluZUNvbnRpbnVhdGlv
bigpKSB7Ci0gICAgICAgIEZsb2F0UmVjdCBsb2NhbFJlY3QoMCwgLWNvbGxhcHNlZE1hcmdpblRv
cCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoKCksIGhlaWdodCgpICsgY29s
bGFwc2VkTWFyZ2luVG9wKCkgKyBjb2xsYXBzZWRNYXJnaW5Cb3R0b20oKSk7Ci0gICAgICAgIHF1
YWRzLmFwcGVuZChsb2NhbFRvQWJzb2x1dGVRdWFkKGxvY2FsUmVjdCkpOwotICAgICAgICBpbmxp
bmVDb250aW51YXRpb24oKS0+YWJzb2x1dGVRdWFkcyhxdWFkcyk7Ci0gICAgfSBlbHNlCi0gICAg
ICAgIHF1YWRzLmFwcGVuZChSZW5kZXJCb3g6OmxvY2FsVG9BYnNvbHV0ZVF1YWQoRmxvYXRSZWN0
KDAsIDAsIHdpZHRoKCksIGhlaWdodCgpKSkpOwotfQotCi1JbnRSZWN0IFJlbmRlckJsb2NrOjpy
ZWN0V2l0aE91dGxpbmVGb3JSZXBhaW50KFJlbmRlckJveE1vZGVsT2JqZWN0KiByZXBhaW50Q29u
dGFpbmVyLCBpbnQgb3V0bGluZVdpZHRoKQotewotICAgIEludFJlY3QgcihSZW5kZXJCb3g6OnJl
Y3RXaXRoT3V0bGluZUZvclJlcGFpbnQocmVwYWludENvbnRhaW5lciwgb3V0bGluZVdpZHRoKSk7
Ci0gICAgaWYgKGlubGluZUNvbnRpbnVhdGlvbigpKQotICAgICAgICByLmluZmxhdGVZKGNvbGxh
cHNlZE1hcmdpblRvcCgpKTsKLSAgICByZXR1cm4gcjsKLX0KLQotUmVuZGVyT2JqZWN0KiBSZW5k
ZXJCbG9jazo6aG92ZXJBbmNlc3RvcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGlubGluZUNvbnRp
bnVhdGlvbigpID8gaW5saW5lQ29udGludWF0aW9uKCkgOiBSZW5kZXJCb3g6OmhvdmVyQW5jZXN0
b3IoKTsKLX0KLQotdm9pZCBSZW5kZXJCbG9jazo6dXBkYXRlRHJhZ1N0YXRlKGJvb2wgZHJhZ09u
KQotewotICAgIFJlbmRlckJveDo6dXBkYXRlRHJhZ1N0YXRlKGRyYWdPbik7Ci0gICAgaWYgKGlu
bGluZUNvbnRpbnVhdGlvbigpKQotICAgICAgICBpbmxpbmVDb250aW51YXRpb24oKS0+dXBkYXRl
RHJhZ1N0YXRlKGRyYWdPbik7Ci19Ci0KLVJlbmRlclN0eWxlKiBSZW5kZXJCbG9jazo6b3V0bGlu
ZVN0eWxlRm9yUmVwYWludCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGlubGluZUNvbnRpbnVhdGlv
bigpID8gaW5saW5lQ29udGludWF0aW9uKCktPnN0eWxlKCkgOiBzdHlsZSgpOwotfQotCiB2b2lk
IFJlbmRlckJsb2NrOjpjaGlsZEJlY2FtZU5vbklubGluZShSZW5kZXJPYmplY3QqKQogewogICAg
IG1ha2VDaGlsZHJlbk5vbklubGluZSgpOwpAQCAtNDkzNywyNiArNDg2NCw2IEBAIHZvaWQgUmVu
ZGVyQmxvY2s6OmNoaWxkQmVjYW1lTm9uSW5saW5lKFIKICAgICAvLyB8dGhpc3wgbWF5IGJlIGRl
YWQgaGVyZQogfQogCi12b2lkIFJlbmRlckJsb2NrOjp1cGRhdGVIaXRUZXN0UmVzdWx0KEhpdFRl
c3RSZXN1bHQmIHJlc3VsdCwgY29uc3QgSW50UG9pbnQmIHBvaW50KQotewotICAgIGlmIChyZXN1
bHQuaW5uZXJOb2RlKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIE5vZGUqIG4gPSBub2RlKCk7
Ci0gICAgaWYgKGlubGluZUNvbnRpbnVhdGlvbigpKQotICAgICAgICAvLyBXZSBhcmUgaW4gdGhl
IG1hcmdpbnMgb2YgYmxvY2sgZWxlbWVudHMgdGhhdCBhcmUgcGFydCBvZiBhIGNvbnRpbnVhdGlv
bi4gIEluCi0gICAgICAgIC8vIHRoaXMgY2FzZSB3ZSdyZSBhY3R1YWxseSBzdGlsbCBpbnNpZGUg
dGhlIGVuY2xvc2luZyBpbmxpbmUgZWxlbWVudCB0aGF0IHdhcwotICAgICAgICAvLyBzcGxpdC4g
IEdvIGFoZWFkIGFuZCBzZXQgb3VyIGlubmVyIG5vZGUgYWNjb3JkaW5nbHkuCi0gICAgICAgIG4g
PSBpbmxpbmVDb250aW51YXRpb24oKS0+bm9kZSgpOwotCi0gICAgaWYgKG4pIHsKLSAgICAgICAg
cmVzdWx0LnNldElubmVyTm9kZShuKTsKLSAgICAgICAgaWYgKCFyZXN1bHQuaW5uZXJOb25TaGFy
ZWROb2RlKCkpCi0gICAgICAgICAgICByZXN1bHQuc2V0SW5uZXJOb25TaGFyZWROb2RlKG4pOwot
ICAgICAgICByZXN1bHQuc2V0TG9jYWxQb2ludChwb2ludCk7Ci0gICAgfQotfQotCiBJbnRSZWN0
IFJlbmRlckJsb2NrOjpsb2NhbENhcmV0UmVjdChJbmxpbmVCb3gqIGlubGluZUJveCwgaW50IGNh
cmV0T2Zmc2V0LCBpbnQqIGV4dHJhV2lkdGhUb0VuZE9mTGluZSkKIHsKICAgICAvLyBEbyB0aGUg
bm9ybWFsIGNhbGN1bGF0aW9uIGluIG1vc3QgY2FzZXMuCkBAIC01MDM3LDIxICs0OTQ0LDE3IEBA
IEludFJlY3QgUmVuZGVyQmxvY2s6OmxvY2FsQ2FyZXRSZWN0KElubGkKIAogdm9pZCBSZW5kZXJC
bG9jazo6YWRkRm9jdXNSaW5nUmVjdHMoVmVjdG9yPEludFJlY3Q+JiByZWN0cywgaW50IHR4LCBp
bnQgdHkpCiB7Ci0gICAgLy8gRm9yIGJsb2NrcyBpbnNpZGUgaW5saW5lcywgd2UgZ28gYWhlYWQg
YW5kIGluY2x1ZGUgbWFyZ2lucyBzbyB0aGF0IHdlIHJ1biByaWdodCB1cCB0byB0aGUKLSAgICAv
LyBpbmxpbmUgYm94ZXMgYWJvdmUgYW5kIGJlbG93IHVzICh0aHVzIGdldHRpbmcgbWVyZ2VkIHdp
dGggdGhlbSB0byBmb3JtIGEgc2luZ2xlIGlycmVndWxhcgotICAgIC8vIHNoYXBlKS4KLSAgICBp
ZiAoaW5saW5lQ29udGludWF0aW9uKCkpIHsKLSAgICAgICAgLy8gRklYTUU6IFRoaXMgY2hlY2sg
cmVhbGx5IGlzbid0IGFjY3VyYXRlLiAKLSAgICAgICAgYm9vbCBuZXh0SW5saW5lSGFzTGluZUJv
eCA9IGlubGluZUNvbnRpbnVhdGlvbigpLT5maXJzdExpbmVCb3goKTsKLSAgICAgICAgLy8gRklY
TUU6IFRoaXMgaXMgd3JvbmcuIFRoZSBwcmluY2lwYWwgcmVuZGVyZXIgbWF5IG5vdCBiZSB0aGUg
Y29udGludWF0aW9uIHByZWNlZGluZyB0aGlzIGJsb2NrLgotICAgICAgICBib29sIHByZXZJbmxp
bmVIYXNMaW5lQm94ID0gdG9SZW5kZXJJbmxpbmUoaW5saW5lQ29udGludWF0aW9uKCktPm5vZGUo
KS0+cmVuZGVyZXIoKSktPmZpcnN0TGluZUJveCgpOyAKLSAgICAgICAgaW50IHRvcE1hcmdpbiA9
IHByZXZJbmxpbmVIYXNMaW5lQm94ID8gY29sbGFwc2VkTWFyZ2luVG9wKCkgOiAwOwotICAgICAg
ICBpbnQgYm90dG9tTWFyZ2luID0gbmV4dElubGluZUhhc0xpbmVCb3ggPyBjb2xsYXBzZWRNYXJn
aW5Cb3R0b20oKSA6IDA7Ci0gICAgICAgIEludFJlY3QgcmVjdCh0eCwgdHkgLSB0b3BNYXJnaW4s
IHdpZHRoKCksIGhlaWdodCgpICsgdG9wTWFyZ2luICsgYm90dG9tTWFyZ2luKTsKLSAgICAgICAg
aWYgKCFyZWN0LmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJlY3RzLmFwcGVuZChyZWN0KTsKLSAg
ICB9IGVsc2UgaWYgKHdpZHRoKCkgJiYgaGVpZ2h0KCkpCi0gICAgICAgIHJlY3RzLmFwcGVuZChJ
bnRSZWN0KHR4LCB0eSwgd2lkdGgoKSwgaGVpZ2h0KCkpKTsKKyAgICBpbnQgdG9wID0gdHk7Cisg
ICAgaW50IGJvdHRvbSA9IHRvcCArIGhlaWdodCgpOworICAgIGlmIChpc0Fub255bW91c0lubGlu
ZUJsb2NrKCkgJiYgaGVpZ2h0KCkpIHsKKyAgICAgICAgaWYgKG1faW5saW5lQm94V3JhcHBlciAm
JiBtX2lubGluZUJveFdyYXBwZXItPnJvb3QoKS0+cHJldlJvb3RCb3goKSkKKyAgICAgICAgICAg
IHRvcCA9IG1pbih0b3AsIHRvcCAtIGNvbGxhcHNlZE1hcmdpblRvcCgpKTsKKyAgICAgICAgaWYg
KG1faW5saW5lQm94V3JhcHBlciAmJiBtX2lubGluZUJveFdyYXBwZXItPnJvb3QoKS0+bmV4dFJv
b3RCb3goKSkKKyAgICAgICAgICAgIGJvdHRvbSA9IG1heChib3R0b20sIGJvdHRvbSArIGNvbGxh
cHNlZE1hcmdpbkJvdHRvbSgpKTsKKyAgICB9CisgICAgSW50UmVjdCByZXN1bHQodHgsIHRvcCwg
d2lkdGgoKSwgYm90dG9tIC0gdG9wKTsKKyAgICBpZiAoIXJlc3VsdC5pc0VtcHR5KCkpCisgICAg
ICAgIHJlY3RzLmFwcGVuZChyZXN1bHQpOwogCiAgICAgaWYgKCFoYXNPdmVyZmxvd0NsaXAoKSAm
JiAhaGFzQ29udHJvbENsaXAoKSkgewogICAgICAgICBmb3IgKFJvb3RJbmxpbmVCb3gqIGN1cnIg
PSBmaXJzdFJvb3RCb3goKTsgY3VycjsgY3VyciA9IGN1cnItPm5leHRSb290Qm94KCkpIHsKQEAg
LTUwNzUsMTEgKzQ5NzgsNiBAQCB2b2lkIFJlbmRlckJsb2NrOjphZGRGb2N1c1JpbmdSZWN0cyhW
ZWN0CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0KLSAgICBpZiAoaW5saW5lQ29u
dGludWF0aW9uKCkpCi0gICAgICAgIGlubGluZUNvbnRpbnVhdGlvbigpLT5hZGRGb2N1c1JpbmdS
ZWN0cyhyZWN0cywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB0eCAtIHgoKSArIGlubGluZUNvbnRpbnVhdGlvbigpLT5jb250YWluaW5nQmxvY2soKS0+
eCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHkg
LSB5KCkgKyBpbmxpbmVDb250aW51YXRpb24oKS0+Y29udGFpbmluZ0Jsb2NrKCktPnkoKSk7CiB9
CiAKIFJlbmRlckJsb2NrKiBSZW5kZXJCbG9jazo6Y3JlYXRlQW5vbnltb3VzQmxvY2soYm9vbCBp
c0ZsZXhpYmxlQm94KSBjb25zdApAQCAtNTExMSw2ICs1MDA5LDggQEAgY29uc3QgY2hhciogUmVu
ZGVyQmxvY2s6OnJlbmRlck5hbWUoKSBjbwogICAgICAgICByZXR1cm4gIlJlbmRlckJsb2NrIChw
b3NpdGlvbmVkKSI7CiAgICAgaWYgKGlzQW5vbnltb3VzQmxvY2soKSkKICAgICAgICAgcmV0dXJu
ICJSZW5kZXJCbG9jayAoYW5vbnltb3VzKSI7CisgICAgZWxzZSBpZiAoaXNBbm9ueW1vdXNJbmxp
bmVCbG9jaygpKQorICAgICAgICByZXR1cm4gIlJlbmRlckJsb2NrIChhbm9ueW1vdXMgaW5saW5l
LWJsb2NrKSI7CiAgICAgZWxzZSBpZiAoaXNBbm9ueW1vdXMoKSkKICAgICAgICAgcmV0dXJuICJS
ZW5kZXJCbG9jayAoZ2VuZXJhdGVkKSI7CiAgICAgaWYgKGlzUmVsUG9zaXRpb25lZCgpKQpJbmRl
eDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3JlbmRlcmluZy9SZW5kZXJCbG9jay5oCShyZXZpc2lvbiA1NDcyNykKKysrIFdlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlckJsb2NrLmgJKHdvcmtpbmcgY29weSkKQEAgLTc5LDcgKzc5LDcgQEAgcHVi
bGljOgogICAgIHN0YXRpYyB2b2lkIHJlbW92ZVBlcmNlbnRIZWlnaHREZXNjZW5kYW50KFJlbmRl
ckJveCopOwogICAgIEhhc2hTZXQ8UmVuZGVyQm94Kj4qIHBlcmNlbnRIZWlnaHREZXNjZW5kYW50
cygpIGNvbnN0OwogCi0gICAgUm9vdElubGluZUJveCogY3JlYXRlQW5kQXBwZW5kUm9vdElubGlu
ZUJveCgpOworICAgIFJvb3RJbmxpbmVCb3gqIGNyZWF0ZUFuZEFwcGVuZFJvb3RJbmxpbmVCb3go
UmVuZGVyQmxvY2sqIGFub255bW91c0lubGluZUJsb2NrKTsKIAogICAgIGJvb2wgZ2VuZXJhdGVz
TGluZUJveGVzRm9ySW5saW5lQ2hpbGQoUmVuZGVyT2JqZWN0KiwgYm9vbCBpc0xpbmVFbXB0eSA9
IHRydWUsIGJvb2wgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5ID0gdHJ1ZSk7CiAKQEAgLTEyOSwx
NSArMTI5LDE1IEBAIHB1YmxpYzoKIAogICAgIHZvaWQgYWRqdXN0UmVjdEZvckNvbHVtbnMoSW50
UmVjdCYpIGNvbnN0OwogCi0gICAgdm9pZCBhZGRDb250aW51YXRpb25XaXRoT3V0bGluZShSZW5k
ZXJJbmxpbmUqKTsKLQotICAgIFJlbmRlcklubGluZSogaW5saW5lQ29udGludWF0aW9uKCkgY29u
c3QgeyByZXR1cm4gbV9pbmxpbmVDb250aW51YXRpb247IH0KLSAgICB2b2lkIHNldElubGluZUNv
bnRpbnVhdGlvbihSZW5kZXJJbmxpbmUqIGMpIHsgbV9pbmxpbmVDb250aW51YXRpb24gPSBjOyB9
Ci0KICAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGEgY29udmVuaWVuY2UgaGVscGVyIGZvciBjcmVh
dGluZyBhbiBhbm9ueW1vdXMgYmxvY2sgdGhhdCBpbmhlcml0cyBpdHMKICAgICAvLyBzdHlsZSBm
cm9tIHRoaXMgUmVuZGVyQmxvY2suCiAgICAgUmVuZGVyQmxvY2sqIGNyZWF0ZUFub255bW91c0Js
b2NrKGJvb2wgaXNGbGV4aWJsZUJveCA9IGZhbHNlKSBjb25zdDsKIAorICAgIHZpcnR1YWwgdm9p
ZCBwYWludChQYWludEluZm8mLCBpbnQgdHgsIGludCB0eSk7CisgICAgdmlydHVhbCB2b2lkIHBh
aW50T2JqZWN0KFBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5KTsKKworICAgIGJvb2wgaW5Sb290
QmxvY2tDb250ZXh0KCkgY29uc3Q7CisKICAgICBzdGF0aWMgdm9pZCBhcHBlbmRSdW5zRm9yT2Jq
ZWN0KGludCBzdGFydCwgaW50IGVuZCwgUmVuZGVyT2JqZWN0KiwgSW5saW5lQmlkaVJlc29sdmVy
Jik7ICAgIAogICAgIHN0YXRpYyBib29sIHJlcXVpcmVzTGluZUJveChjb25zdCBJbmxpbmVJdGVy
YXRvciYsIGJvb2wgaXNMaW5lRW1wdHkgPSB0cnVlLCBib29sIHByZXZpb3VzTGluZUJyb2tlQ2xl
YW5seSA9IHRydWUpOwogCkBAIC0xNjgsOSArMTY4LDYgQEAgcHJvdGVjdGVkOgogCiAgICAgdm9p
ZCBsYXlvdXRQb3NpdGlvbmVkT2JqZWN0cyhib29sIHJlbGF5b3V0Q2hpbGRyZW4pOwogCi0gICAg
dmlydHVhbCB2b2lkIHBhaW50KFBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5KTsKLSAgICB2aXJ0
dWFsIHZvaWQgcGFpbnRPYmplY3QoUGFpbnRJbmZvJiwgaW50IHR4LCBpbnQgdHkpOwotCiAgICAg
aW50IHJpZ2h0UmVsT2Zmc2V0KGludCB5LCBpbnQgZml4ZWRPZmZzZXQsIGJvb2wgYXBwbHlUZXh0
SW5kZW50ID0gdHJ1ZSwgaW50KiBoZWlnaHRSZW1haW5pbmcgPSAwKSBjb25zdDsKICAgICBpbnQg
bGVmdFJlbE9mZnNldChpbnQgeSwgaW50IGZpeGVkT2Zmc2V0LCBib29sIGFwcGx5VGV4dEluZGVu
dCA9IHRydWUsIGludCogaGVpZ2h0UmVtYWluaW5nID0gMCkgY29uc3Q7CiAKQEAgLTE4Myw4ICsx
ODAsNiBAQCBwcm90ZWN0ZWQ6CiAKICAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlRmlyc3RMZXR0ZXIo
KTsKIAotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVIaXRUZXN0UmVzdWx0KEhpdFRlc3RSZXN1bHQm
LCBjb25zdCBJbnRQb2ludCYpOwotCiAgICAgLy8gRGVsYXkgdXBkYXRlIHNjcm9sbGJhciB1bnRp
bCBmaW5pc2hEZWxheVJlcGFpbnQoKSB3aWxsIGJlCiAgICAgLy8gY2FsbGVkLiBUaGlzIGZ1bmN0
aW9uIGlzIHVzZWQgd2hlbiBhIGZsZXhib3ggaXMgbGF5aW5nIG91dCBpdHMKICAgICAvLyBkZXNj
ZW5kYW50LiBJZiBtdWx0aXBsZSBjYWxscyBhcmUgbWFkZSB0byBzdGFydERlbGF5UmVwYWludCgp
LApAQCAtMjQ4LDcgKzI0Myw5IEBAIHByaXZhdGU6CiAgICAgICAgIGJvb2wgZXZlckhhZExheW91
dDsKICAgICB9OwogCi0gICAgLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMnIGltcGxlbWVudGF0
aW9ucyBhcmUgaW4gUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcC4KKyAgICBjbGFzcyBNYXJnaW5J
bmZvOworCisgICAgLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMnIGltcGxlbWVudGF0aW9ucyBh
cmUgaW4gUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcC4gICAgCiAgICAgdm9pZCBiaWRpUmVvcmRl
ckxpbmUoSW5saW5lQmlkaVJlc29sdmVyJiwgY29uc3QgSW5saW5lSXRlcmF0b3ImIGVuZCwgYm9v
bCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHkpOwogICAgIFJvb3RJbmxpbmVCb3gqIGRldGVybWlu
ZVN0YXJ0UG9zaXRpb24oYm9vbCYgZmlyc3RMaW5lLCBib29sJiBmdWxsTGF5b3V0LCBib29sJiBw
cmV2aW91c0xpbmVCcm9rZUNsZWFubHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBJbmxpbmVCaWRpUmVzb2x2ZXImLCBWZWN0b3I8RmxvYXRXaXRoUmVjdD4mIGZs
b2F0cywgdW5zaWduZWQmIG51bUNsZWFuRmxvYXRzKTsKQEAgLTI2MSw5ICsyNTgsOSBAQCBwcml2
YXRlOgogICAgIHZvaWQgc2tpcFRyYWlsaW5nV2hpdGVzcGFjZShJbmxpbmVJdGVyYXRvciYsIGJv
b2wgaXNMaW5lRW1wdHksIGJvb2wgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KTsKICAgICBpbnQg
c2tpcExlYWRpbmdXaGl0ZXNwYWNlKElubGluZUJpZGlSZXNvbHZlciYsIGJvb2wgZmlyc3RMaW5l
LCBib29sIGlzTGluZUVtcHR5LCBib29sIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSk7CiAgICAg
dm9pZCBmaXRCZWxvd0Zsb2F0cyhpbnQgd2lkdGhUb0ZpdCwgYm9vbCBmaXJzdExpbmUsIGludCYg
YXZhaWxhYmxlV2lkdGgpOwotICAgIElubGluZUl0ZXJhdG9yIGZpbmROZXh0TGluZUJyZWFrKElu
bGluZUJpZGlSZXNvbHZlciYsIGJvb2wgZmlyc3RMaW5lLCBib29sJiBpc0xpbmVFbXB0eSwgYm9v
bCYgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5LCBFQ2xlYXIqIGNsZWFyID0gMCk7CisgICAgSW5s
aW5lSXRlcmF0b3IgZmluZE5leHRMaW5lQnJlYWsoSW5saW5lQmlkaVJlc29sdmVyJiwgYm9vbCBm
aXJzdExpbmUsIGJvb2wmIGlzTGluZUVtcHR5LCBib29sJiBwcmV2aW91c0xpbmVCcm9rZUNsZWFu
bHksIE1hcmdpbkluZm8mLCBFQ2xlYXIqIGNsZWFyID0gMCk7CiAgICAgUm9vdElubGluZUJveCog
Y29uc3RydWN0TGluZSh1bnNpZ25lZCBydW5Db3VudCwgQmlkaVJ1biogZmlyc3RSdW4sIEJpZGlS
dW4qIGxhc3RSdW4sIGJvb2wgZmlyc3RMaW5lLCBib29sIGxhc3RMaW5lLCBSZW5kZXJPYmplY3Qq
IGVuZE9iamVjdCk7Ci0gICAgSW5saW5lRmxvd0JveCogY3JlYXRlTGluZUJveGVzKFJlbmRlck9i
amVjdCosIGJvb2wgZmlyc3RMaW5lKTsKKyAgICBJbmxpbmVGbG93Qm94KiBjcmVhdGVMaW5lQm94
ZXMoUmVuZGVyT2JqZWN0KiwgYm9vbCBmaXJzdExpbmUsIFJlbmRlckJsb2NrKiBhbm9ueW1vdXNJ
bmxpbmVCbG9jayk7CiAgICAgdm9pZCBjb21wdXRlSG9yaXpvbnRhbFBvc2l0aW9uc0ZvckxpbmUo
Um9vdElubGluZUJveCosIGJvb2wgZmlyc3RMaW5lLCBCaWRpUnVuKiBmaXJzdFJ1biwgQmlkaVJ1
biogdHJhaWxpbmdTcGFjZVJ1biwgYm9vbCByZWFjaGVkRW5kKTsKICAgICB2b2lkIGNvbXB1dGVW
ZXJ0aWNhbFBvc2l0aW9uc0ZvckxpbmUoUm9vdElubGluZUJveCosIEJpZGlSdW4qKTsKICAgICB2
b2lkIGRlbGV0ZUVsbGlwc2lzTGluZUJveGVzKCk7CkBAIC0zMTYsMTMgKzMxMyw3IEBAIHByaXZh
dGU6CiAgICAgLy8gT2J0YWlucyB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgYmxvY2sgKGluY2x1ZGlu
ZyB0aGlzIGJsb2NrKSB0aGF0IGNvbnRyaWJ1dGVzIGEgZmlyc3QtbGluZSBzdHlsZSB0byBvdXIg
aW5saW5lCiAgICAgLy8gY2hpbGRyZW4uCiAgICAgdmlydHVhbCBSZW5kZXJCbG9jayogZmlyc3RM
aW5lQmxvY2soKSBjb25zdDsKLSAgICBib29sIGluUm9vdEJsb2NrQ29udGV4dCgpIGNvbnN0Owot
Ci0gICAgdmlydHVhbCBJbnRSZWN0IHJlY3RXaXRoT3V0bGluZUZvclJlcGFpbnQoUmVuZGVyQm94
TW9kZWxPYmplY3QqIHJlcGFpbnRDb250YWluZXIsIGludCBvdXRsaW5lV2lkdGgpOwotICAgIHZp
cnR1YWwgUmVuZGVyU3R5bGUqIG91dGxpbmVTdHlsZUZvclJlcGFpbnQoKSBjb25zdDsKICAgICAK
LSAgICB2aXJ0dWFsIFJlbmRlck9iamVjdCogaG92ZXJBbmNlc3RvcigpIGNvbnN0OwotICAgIHZp
cnR1YWwgdm9pZCB1cGRhdGVEcmFnU3RhdGUoYm9vbCBkcmFnT24pOwogICAgIHZpcnR1YWwgdm9p
ZCBjaGlsZEJlY2FtZU5vbklubGluZShSZW5kZXJPYmplY3QqIGNoaWxkKTsKIAogICAgIHZpcnR1
YWwgSW50UmVjdCBzZWxlY3Rpb25SZWN0Rm9yUmVwYWludChSZW5kZXJCb3hNb2RlbE9iamVjdCog
cmVwYWludENvbnRhaW5lciwgYm9vbCAvKmNsaXBUb1Zpc2libGVDb250ZW50Ki8pCkBAIC0zNDIs
MTYgKzMzMywxMSBAQCBwcml2YXRlOgogICAgIGludCBsZWZ0U2VsZWN0aW9uT2Zmc2V0KFJlbmRl
ckJsb2NrKiByb290QmxvY2ssIGludCB5KTsKICAgICBpbnQgcmlnaHRTZWxlY3Rpb25PZmZzZXQo
UmVuZGVyQmxvY2sqIHJvb3RCbG9jaywgaW50IHkpOwogCi0gICAgdmlydHVhbCB2b2lkIGFic29s
dXRlUmVjdHMoVmVjdG9yPEludFJlY3Q+JiwgaW50IHR4LCBpbnQgdHkpOwotICAgIHZpcnR1YWwg
dm9pZCBhYnNvbHV0ZVF1YWRzKFZlY3RvcjxGbG9hdFF1YWQ+Jik7Ci0KICAgICBpbnQgZGVzaXJl
ZENvbHVtbldpZHRoKCkgY29uc3Q7CiAgICAgdW5zaWduZWQgZGVzaXJlZENvbHVtbkNvdW50KCkg
Y29uc3Q7CiAgICAgVmVjdG9yPEludFJlY3Q+KiBjb2x1bW5SZWN0cygpIGNvbnN0OwogICAgIHZv
aWQgc2V0RGVzaXJlZENvbHVtbkNvdW50QW5kV2lkdGgoaW50IGNvdW50LCBpbnQgd2lkdGgpOwog
ICAgIGludCBjb2x1bW5HYXAoKSBjb25zdDsKLSAgICAKLSAgICB2b2lkIHBhaW50Q29udGludWF0
aW9uT3V0bGluZXMoUGFpbnRJbmZvJiwgaW50IHR4LCBpbnQgdHkpOwogCiAgICAgdmlydHVhbCBJ
bnRSZWN0IGxvY2FsQ2FyZXRSZWN0KElubGluZUJveCosIGludCBjYXJldE9mZnNldCwgaW50KiBl
eHRyYVdpZHRoVG9FbmRPZkxpbmUgPSAwKTsKIApAQCAtNDg3LDEyICs0NzMsNiBAQCBwcml2YXRl
OgogICAgIERlcHJlY2F0ZWRQdHJMaXN0PEZsb2F0aW5nT2JqZWN0PiogbV9mbG9hdGluZ09iamVj
dHM7CiAgICAgTGlzdEhhc2hTZXQ8UmVuZGVyQm94Kj4qIG1fcG9zaXRpb25lZE9iamVjdHM7CiAK
LSAgICAvLyBBbiBpbmxpbmUgY2FuIGJlIHNwbGl0IHdpdGggYmxvY2tzIG9jY3VycmluZyBpbiBi
ZXR3ZWVuIHRoZSBpbmxpbmUgY29udGVudC4KLSAgICAvLyBXaGVuIHRoaXMgb2NjdXJzIHdlIG5l
ZWQgYSBwb2ludGVyIHRvIG91ciBuZXh0IG9iamVjdC4gIFdlIGNhbiBiYXNpY2FsbHkgYmUKLSAg
ICAvLyBzcGxpdCBpbnRvIGEgc2VxdWVuY2Ugb2YgaW5saW5lcyBhbmQgYmxvY2tzLiAgVGhlIGNv
bnRpbnVhdGlvbiB3aWxsIGVpdGhlciBiZQotICAgIC8vIGFuIGFub255bW91cyBibG9jayAodGhh
dCBob3VzZXMgb3RoZXIgYmxvY2tzKSBvciBpdCB3aWxsIGJlIGFuIGlubGluZSBmbG93LgotICAg
IFJlbmRlcklubGluZSogbV9pbmxpbmVDb250aW51YXRpb247Ci0KICAgICAvLyBBbGxvY2F0ZWQg
b25seSB3aGVuIHNvbWUgb2YgdGhlc2UgZmllbGRzIGhhdmUgbm9uLWRlZmF1bHQgdmFsdWVzCiAg
ICAgc3RydWN0IE1heE1hcmdpbiA6IE5vbmNvcHlhYmxlIHsKICAgICAgICAgTWF4TWFyZ2luKGNv
bnN0IFJlbmRlckJsb2NrKiBvKSAKQEAgLTUyMCwxMCArNTAwLDEyIEBAIHByaXZhdGU6CiAgICAg
UmVuZGVyTGluZUJveExpc3QgbV9saW5lQm94ZXM7ICAgLy8gQWxsIG9mIHRoZSByb290IGxpbmUg
Ym94ZXMgY3JlYXRlZCBmb3IgdGhpcyBibG9jayBmbG93LiAgRm9yIGV4YW1wbGUsIDxkaXY+SGVs
bG88YnI+d29ybGQuPC9kaXY+IHdpbGwgaGF2ZSB0d28gdG90YWwgbGluZXMgZm9yIHRoZSA8ZGl2
Pi4KIAogICAgIG11dGFibGUgaW50IG1fbGluZUhlaWdodDsKLSAgICAKKwogICAgIC8vIFJlbmRl
clJ1YnlCYXNlIG9iamVjdHMgbmVlZCB0byBiZSBhYmxlIHRvIHNwbGl0IGFuZCBtZXJnZSwgbW92
aW5nIHRoZWlyIGNoaWxkcmVuIGFyb3VuZAogICAgIC8vIChjYWxsaW5nIG1vdmVDaGlsZFRvLCBt
b3ZlQWxsQ2hpbGRyZW5UbywgYW5kIG1ha2VDaGlsZHJlbk5vbklubGluZSkuCiAgICAgZnJpZW5k
IGNsYXNzIFJlbmRlclJ1YnlCYXNlOworICAgIAorICAgIGZyaWVuZCBjbGFzcyBJbmxpbmVCb3g7
CiB9OwogCiBpbmxpbmUgUmVuZGVyQmxvY2sqIHRvUmVuZGVyQmxvY2soUmVuZGVyT2JqZWN0KiBv
YmplY3QpCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5j
cHAJKHJldmlzaW9uIDU0NzI3KQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5l
TGF5b3V0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTcxLDEwICsxNzEsMTAgQEAgdm9pZCBSZW5k
ZXJCbG9jazo6YXBwZW5kUnVuc0Zvck9iamVjdChpbgogICAgIH0KIH0KIAotc3RhdGljIGlubGlu
ZSBJbmxpbmVCb3gqIGNyZWF0ZUlubGluZUJveEZvclJlbmRlcmVyKFJlbmRlck9iamVjdCogb2Jq
LCBib29sIGlzUm9vdExpbmVCb3gsIGJvb2wgaXNPbmx5UnVuID0gZmFsc2UpCitzdGF0aWMgaW5s
aW5lIElubGluZUJveCogY3JlYXRlSW5saW5lQm94Rm9yUmVuZGVyZXIoUmVuZGVyT2JqZWN0KiBv
YmosIGJvb2wgaXNSb290TGluZUJveCwgYm9vbCBpc09ubHlSdW4sIFJlbmRlckJsb2NrKiBhbm9u
eW1vdXNJbmxpbmVCbG9jaykKIHsKICAgICBpZiAoaXNSb290TGluZUJveCkKLSAgICAgICAgcmV0
dXJuIHRvUmVuZGVyQmxvY2sob2JqKS0+Y3JlYXRlQW5kQXBwZW5kUm9vdElubGluZUJveCgpOwor
ICAgICAgICByZXR1cm4gdG9SZW5kZXJCbG9jayhvYmopLT5jcmVhdGVBbmRBcHBlbmRSb290SW5s
aW5lQm94KGFub255bW91c0lubGluZUJsb2NrKTsKICAgICAKICAgICBpZiAob2JqLT5pc1RleHQo
KSkgewogICAgICAgICBJbmxpbmVUZXh0Qm94KiB0ZXh0Qm94ID0gdG9SZW5kZXJUZXh0KG9iaikt
PmNyZWF0ZUlubGluZVRleHRCb3goKTsKQEAgLTE4OCw3ICsxODgsNyBAQCBzdGF0aWMgaW5saW5l
IElubGluZUJveCogY3JlYXRlSW5saW5lQm94CiAgICAgaWYgKG9iai0+aXNCb3goKSkKICAgICAg
ICAgcmV0dXJuIHRvUmVuZGVyQm94KG9iaiktPmNyZWF0ZUlubGluZUJveCgpOwogICAgIAotICAg
IHJldHVybiB0b1JlbmRlcklubGluZShvYmopLT5jcmVhdGVBbmRBcHBlbmRJbmxpbmVGbG93Qm94
KCk7CisgICAgcmV0dXJuIHRvUmVuZGVySW5saW5lKG9iaiktPmNyZWF0ZUFuZEFwcGVuZElubGlu
ZUZsb3dCb3goYW5vbnltb3VzSW5saW5lQmxvY2spOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQg
ZGlydHlMaW5lQm94ZXNGb3JSZW5kZXJlcihSZW5kZXJPYmplY3QqIG8sIGJvb2wgZnVsbExheW91
dCkKQEAgLTIwMSw3ICsyMDEsMjEgQEAgc3RhdGljIGlubGluZSB2b2lkIGRpcnR5TGluZUJveGVz
Rm9yUmVuZAogICAgICAgICB0b1JlbmRlcklubGluZShvKS0+ZGlydHlMaW5lQm94ZXMoZnVsbExh
eW91dCk7CiB9CiAKLUlubGluZUZsb3dCb3gqIFJlbmRlckJsb2NrOjpjcmVhdGVMaW5lQm94ZXMo
UmVuZGVyT2JqZWN0KiBvYmosIGJvb2wgZmlyc3RMaW5lKQorc3RhdGljIGlubGluZSBib29sIHNo
b3VsZENvbnN0cnVjdFBhcmVudExpbmVCb3goUmVuZGVySW5saW5lKiBpbmxpbmVGbG93LCBib29s
IGlzQW5vbnltb3VzSW5saW5lQmxvY2spCit7CisgICAgLy8gRklYTUU6IEltcGxlbWVudCBsaW5l
IGJveCBjdWxsaW5nIGFuZCBjdXQgb3V0IGEgYnVuY2ggb2YgaW50ZXJtZWRpYXRlIGxpbmUgYm94
ZXMgYnkgY29tcGFyaW5nIHN0eWxlIGluZm9ybWF0aW9uCisgICAgLy8gd2l0aCBwYXJlbnRzLCBl
dGMuIHRvIG1ha2Ugc3VyZSBpdCdzIHBvc3NpYmxlIHRvIG9taXQgdGhlIGJveCBmb3IgdGhlIGxp
bmUuIAorICAgIGlmICghaXNBbm9ueW1vdXNJbmxpbmVCbG9jayB8fCAhaW5saW5lRmxvdykKKyAg
ICAgICAgcmV0dXJuIHRydWU7CisgICAgCisgICAgLy8gSWYgd2UgaGF2ZSBhbiBvdXRsaW5lIG9y
IGEgc2VsZi1wYWludGluZyBsYXllciwgdGhlbiB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGUgaW50ZXJt
ZWRpYXRlIGxpbmUgYm94LgorICAgIGJvb2wgc2hvdWxkTWFrZUJveCA9IGlubGluZUZsb3ctPmhh
c091dGxpbmUoKSB8fCBpbmxpbmVGbG93LT5oYXNTZWxmUGFpbnRpbmdMYXllcigpOworICAgIGlm
ICghc2hvdWxkTWFrZUJveCkKKyAgICAgICAgaW5saW5lRmxvdy0+c2V0SGFzQ3VsbGVkTGluZUJv
eGVzKCk7IC8vIEZJWE1FOiBTaG91bGQgZmluZCBhIHdheSB0byB1bnRhaW50IHRoZSBib3ggbGF0
ZXIsIGFsdGhvdWdoIGluIHByYWN0aWNlIHRoaXMgd2lsbCBiZSByYXJlLgorICAgIHJldHVybiBz
aG91bGRNYWtlQm94OworfQorCitJbmxpbmVGbG93Qm94KiBSZW5kZXJCbG9jazo6Y3JlYXRlTGlu
ZUJveGVzKFJlbmRlck9iamVjdCogb2JqLCBib29sIGZpcnN0TGluZSwgUmVuZGVyQmxvY2sqIGFu
b255bW91c0lubGluZUJsb2NrKQogewogICAgIC8vIFNlZSBpZiB3ZSBoYXZlIGFuIHVuY29uc3Ry
dWN0ZWQgbGluZSBib3ggZm9yIHRoaXMgb2JqZWN0IHRoYXQgaXMgYWxzbwogICAgIC8vIHRoZSBs
YXN0IGl0ZW0gb24gdGhlIGxpbmUuCkBAIC0yMTIsNiArMjI2LDggQEAgSW5saW5lRmxvd0JveCog
UmVuZGVyQmxvY2s6OmNyZWF0ZUxpbmVCbwogICAgIGRvIHsKICAgICAgICAgQVNTRVJUKG9iai0+
aXNSZW5kZXJJbmxpbmUoKSB8fCBvYmogPT0gdGhpcyk7CiAgICAgICAgIAorICAgICAgICBSZW5k
ZXJJbmxpbmUqIGlubGluZU9iaiA9IChvYmogIT0gdGhpcykgPyB0b1JlbmRlcklubGluZShvYmop
IDogMDsKKwogICAgICAgICAvLyBHZXQgdGhlIGxhc3QgYm94IHdlIG1hZGUgZm9yIHRoaXMgcmVu
ZGVyIG9iamVjdC4KICAgICAgICAgcGFyZW50Qm94ID0gb2JqLT5pc1JlbmRlcklubGluZSgpID8g
dG9SZW5kZXJJbmxpbmUob2JqKS0+bGFzdExpbmVCb3goKSA6IHRvUmVuZGVyQmxvY2sob2JqKS0+
bGFzdExpbmVCb3goKTsKIApAQCAtMjIwLDMwICsyMzYsMzQgQEAgSW5saW5lRmxvd0JveCogUmVu
ZGVyQmxvY2s6OmNyZWF0ZUxpbmVCbwogICAgICAgICAvLyBzb21ldGhpbmcgZm9sbG93aW5nIGl0
IG9uIHRoZSBsaW5lLCB0aGVuIHdlIGtub3cgd2UgaGF2ZSB0byBtYWtlIGEgbmV3IGJveAogICAg
ICAgICAvLyBhcyB3ZWxsLiAgSW4gdGhpcyBzaXR1YXRpb24gb3VyIGlubGluZSBoYXMgYWN0dWFs
bHkgYmVlbiBzcGxpdCBpbiB0d28gb24KICAgICAgICAgLy8gdGhlIHNhbWUgbGluZSAodGhpcyBj
YW4gaGFwcGVuIHdpdGggdmVyeSBmYW5jeSBsYW5ndWFnZSBtaXh0dXJlcykuCisgICAgICAgIGJv
b2wgYWxsb3dlZFRvQ29uc3RydWN0TmV3Qm94ID0gc2hvdWxkQ29uc3RydWN0UGFyZW50TGluZUJv
eChpbmxpbmVPYmosIGFub255bW91c0lubGluZUJsb2NrKTsKKyAgICAgICAgYm9vbCBjYW5Vc2VF
eGlzdGluZ1BhcmVudEJveCA9IHBhcmVudEJveCAmJiAhcGFyZW50Qm94LT5pc0NvbnN0cnVjdGVk
KCkgJiYgIXBhcmVudEJveC0+bmV4dE9uTGluZSgpOwogICAgICAgICBib29sIGNvbnN0cnVjdGVk
TmV3Qm94ID0gZmFsc2U7Ci0gICAgICAgIGlmICghcGFyZW50Qm94IHx8IHBhcmVudEJveC0+aXND
b25zdHJ1Y3RlZCgpIHx8IHBhcmVudEJveC0+bmV4dE9uTGluZSgpKSB7CisgICAgICAgIGlmIChh
bGxvd2VkVG9Db25zdHJ1Y3ROZXdCb3ggJiYgIWNhblVzZUV4aXN0aW5nUGFyZW50Qm94KSB7CiAg
ICAgICAgICAgICAvLyBXZSBuZWVkIHRvIG1ha2UgYSBuZXcgYm94IGZvciB0aGlzIHJlbmRlciBv
YmplY3QuICBPbmNlCiAgICAgICAgICAgICAvLyBtYWRlLCB3ZSBuZWVkIHRvIHBsYWNlIGl0IGF0
IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgbGluZS4KLSAgICAgICAgICAgIElubGluZUJveCogbmV3
Qm94ID0gY3JlYXRlSW5saW5lQm94Rm9yUmVuZGVyZXIob2JqLCBvYmogPT0gdGhpcyk7CisgICAg
ICAgICAgICBJbmxpbmVCb3gqIG5ld0JveCA9IGNyZWF0ZUlubGluZUJveEZvclJlbmRlcmVyKG9i
aiwgb2JqID09IHRoaXMsIGZhbHNlLCBhbm9ueW1vdXNJbmxpbmVCbG9jayk7CiAgICAgICAgICAg
ICBBU1NFUlQobmV3Qm94LT5pc0lubGluZUZsb3dCb3goKSk7CiAgICAgICAgICAgICBwYXJlbnRC
b3ggPSBzdGF0aWNfY2FzdDxJbmxpbmVGbG93Qm94Kj4obmV3Qm94KTsKICAgICAgICAgICAgIHBh
cmVudEJveC0+c2V0Rmlyc3RMaW5lU3R5bGVCaXQoZmlyc3RMaW5lKTsKICAgICAgICAgICAgIGNv
bnN0cnVjdGVkTmV3Qm94ID0gdHJ1ZTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghcmVzdWx0
KQotICAgICAgICAgICAgcmVzdWx0ID0gcGFyZW50Qm94OwotCi0gICAgICAgIC8vIElmIHdlIGhh
dmUgaGl0IHRoZSBibG9jayBpdHNlbGYsIHRoZW4gfGJveHwgcmVwcmVzZW50cyB0aGUgcm9vdAot
ICAgICAgICAvLyBpbmxpbmUgYm94IGZvciB0aGUgbGluZSwgYW5kIGl0IGRvZXNuJ3QgaGF2ZSB0
byBiZSBhcHBlbmRlZCB0byBhbnkgcGFyZW50Ci0gICAgICAgIC8vIGlubGluZS4KLSAgICAgICAg
aWYgKGNoaWxkQm94KQotICAgICAgICAgICAgcGFyZW50Qm94LT5hZGRUb0xpbmUoY2hpbGRCb3gp
OwotCi0gICAgICAgIGlmICghY29uc3RydWN0ZWROZXdCb3ggfHwgb2JqID09IHRoaXMpCi0gICAg
ICAgICAgICBicmVhazsKLQotICAgICAgICBjaGlsZEJveCA9IHBhcmVudEJveDsgICAgICAgIAor
ICAgICAgICBpZiAoY29uc3RydWN0ZWROZXdCb3ggfHwgY2FuVXNlRXhpc3RpbmdQYXJlbnRCb3gp
IHsKKyAgICAgICAgICAgIGlmICghcmVzdWx0KQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHBh
cmVudEJveDsgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGhp
dCB0aGUgYmxvY2sgaXRzZWxmLCB0aGVuIHxib3h8IHJlcHJlc2VudHMgdGhlIHJvb3QKKyAgICAg
ICAgICAgIC8vIGlubGluZSBib3ggZm9yIHRoZSBsaW5lLCBhbmQgaXQgZG9lc24ndCBoYXZlIHRv
IGJlIGFwcGVuZGVkIHRvIGFueSBwYXJlbnQKKyAgICAgICAgICAgIC8vIGlubGluZS4KKyAgICAg
ICAgICAgIGlmIChjaGlsZEJveCkKKyAgICAgICAgICAgICAgICBwYXJlbnRCb3gtPmFkZFRvTGlu
ZShjaGlsZEJveCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIWNvbnN0cnVj
dGVkTmV3Qm94IHx8IG9iaiA9PSB0aGlzKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgIAor
ICAgICAgICAgICAgY2hpbGRCb3ggPSBwYXJlbnRCb3g7CisgICAgICAgIH0KIAogICAgICAgICAv
LyBJZiB3ZSd2ZSBleGNlZWRlZCBvdXIgbGluZSBkZXB0aCwgdGhlbiBqdW1wIHN0cmFpZ2h0IHRv
IHRoZSByb290IGFuZCBza2lwIGFsbCB0aGUgcmVtYWluaW5nCiAgICAgICAgIC8vIGludGVybWVk
aWF0ZSBpbmxpbmUgZmxvd3MuCkBAIC0yNjUsMTkgKzI4NSwyMyBAQCBSb290SW5saW5lQm94KiBS
ZW5kZXJCbG9jazo6Y29uc3RydWN0TGluCiAgICAgICAgIGlmIChydW5Db3VudCA9PSAyICYmICFy
LT5tX29iamVjdC0+aXNMaXN0TWFya2VyKCkpCiAgICAgICAgICAgICBpc09ubHlSdW4gPSAoKHN0
eWxlKCktPmRpcmVjdGlvbigpID09IFJUTCkgPyBsYXN0UnVuIDogZmlyc3RSdW4pLT5tX29iamVj
dC0+aXNMaXN0TWFya2VyKCk7CiAKLSAgICAgICAgSW5saW5lQm94KiBib3ggPSBjcmVhdGVJbmxp
bmVCb3hGb3JSZW5kZXJlcihyLT5tX29iamVjdCwgZmFsc2UsIGlzT25seVJ1bik7CisgICAgICAg
IFJlbmRlckJsb2NrKiBhbm9ueW1vdXNJbmxpbmVCbG9jayA9IHItPm1fb2JqZWN0LT5pc0Fub255
bW91c0lubGluZUJsb2NrKCkgPyB0b1JlbmRlckJsb2NrKHItPm1fb2JqZWN0KSA6IDA7CisKKyAg
ICAgICAgSW5saW5lQm94KiBib3ggPSBjcmVhdGVJbmxpbmVCb3hGb3JSZW5kZXJlcihyLT5tX29i
amVjdCwgZmFsc2UsIGlzT25seVJ1biwgYW5vbnltb3VzSW5saW5lQmxvY2spOwogICAgICAgICBy
LT5tX2JveCA9IGJveDsKIAogICAgICAgICBBU1NFUlQoYm94KTsKICAgICAgICAgaWYgKCFib3gp
CiAgICAgICAgICAgICBjb250aW51ZTsKIAorICAgICAgICBSZW5kZXJPYmplY3QqIGFuY2VzdG9y
UmVuZGVyZXIgPSByLT5tX29iamVjdC0+cGFyZW50KCk7CisgCiAgICAgICAgIC8vIElmIHdlIGhh
dmUgbm8gcGFyZW50IGJveCB5ZXQsIG9yIGlmIHRoZSBydW4gaXMgbm90IHNpbXBseSBhIHNpYmxp
bmcsCiAgICAgICAgIC8vIHRoZW4gd2UgbmVlZCB0byBjb25zdHJ1Y3QgaW5saW5lIGJveGVzIGFz
IG5lY2Vzc2FyeSB0byBwcm9wZXJseSBlbmNsb3NlIHRoZQogICAgICAgICAvLyBydW4ncyBpbmxp
bmUgYm94LgotICAgICAgICBpZiAoIXBhcmVudEJveCB8fCBwYXJlbnRCb3gtPnJlbmRlcmVyKCkg
IT0gci0+bV9vYmplY3QtPnBhcmVudCgpKQorICAgICAgICBpZiAoIXBhcmVudEJveCB8fCBwYXJl
bnRCb3gtPnJlbmRlcmVyKCkgIT0gYW5jZXN0b3JSZW5kZXJlcikKICAgICAgICAgICAgIC8vIENy
ZWF0ZSBuZXcgaW5saW5lIGJveGVzIGFsbCB0aGUgd2F5IGJhY2sgdG8gdGhlIGFwcHJvcHJpYXRl
IGluc2VydGlvbiBwb2ludC4KLSAgICAgICAgICAgIHBhcmVudEJveCA9IGNyZWF0ZUxpbmVCb3hl
cyhyLT5tX29iamVjdC0+cGFyZW50KCksIGZpcnN0TGluZSk7CisgICAgICAgICAgICBwYXJlbnRC
b3ggPSBjcmVhdGVMaW5lQm94ZXMoYW5jZXN0b3JSZW5kZXJlciwgZmlyc3RMaW5lLCBhbm9ueW1v
dXNJbmxpbmVCbG9jayk7CiAKICAgICAgICAgLy8gQXBwZW5kIHRoZSBpbmxpbmUgYm94IHRvIHRo
aXMgbGluZS4KICAgICAgICAgcGFyZW50Qm94LT5hZGRUb0xpbmUoYm94KTsKQEAgLTMxOSw2ICsz
NDMsOCBAQCB2b2lkIFJlbmRlckJsb2NrOjpjb21wdXRlSG9yaXpvbnRhbFBvc2l0CiAgICAgdW5z
aWduZWQgbnVtU3BhY2VzID0gMDsKICAgICBFVGV4dEFsaWduIHRleHRBbGlnbiA9IHN0eWxlKCkt
PnRleHRBbGlnbigpOwogCisgICAgaW50IHggPSBsZWZ0T2Zmc2V0KGhlaWdodCgpLCBmaXJzdExp
bmUpOworCiAgICAgZm9yIChCaWRpUnVuKiByID0gZmlyc3RSdW47IHI7IHIgPSByLT5uZXh0KCkp
IHsKICAgICAgICAgaWYgKCFyLT5tX2JveCB8fCByLT5tX29iamVjdC0+aXNQb3NpdGlvbmVkKCkg
fHwgci0+bV9ib3gtPmlzTGluZUJyZWFrKCkpCiAgICAgICAgICAgICBjb250aW51ZTsgLy8gUG9z
aXRpb25lZCBvYmplY3RzIGFyZSBvbmx5IHBhcnRpY2lwYXRpbmcgdG8gZmlndXJlIG91dCB0aGVp
cgpAQCAtMzU2LDYgKzM4MiwxMiBAQCB2b2lkIFJlbmRlckJsb2NrOjpjb21wdXRlSG9yaXpvbnRh
bFBvc2l0CiAgICAgICAgICAgICByZW5kZXJCb3gtPmNhbGNXaWR0aCgpOwogICAgICAgICAgICAg
ci0+bV9ib3gtPnNldFdpZHRoKHJlbmRlckJveC0+d2lkdGgoKSk7CiAgICAgICAgICAgICB0b3RX
aWR0aCArPSByZW5kZXJCb3gtPm1hcmdpbkxlZnQoKSArIHJlbmRlckJveC0+bWFyZ2luUmlnaHQo
KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHItPm1fb2JqZWN0LT5pc0Fub255bW91
c0lubGluZUJsb2NrKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBBbGxvdyB0aGUgZnVsbCBhdmFp
bGFibGUgd2lkdGggdG8gYmUgdXNlZCwgc2luY2UgZmxvYXRzIHdpbGwgaW50cnVkZSBpbnRvIG91
ciBzcGFjZS4KKyAgICAgICAgICAgICAgICBhdmFpbGFibGVXaWR0aCA9IHJpZ2h0T2Zmc2V0KCkg
LSBsZWZ0T2Zmc2V0KCk7CisgICAgICAgICAgICAgICAgeCA9IGxlZnRPZmZzZXQoKTsKKyAgICAg
ICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHRvdFdpZHRoICs9IHItPm1fYm94LT53aWR0
aCgpOwpAQCAtMzY1LDcgKzM5Nyw2IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmNvbXB1dGVIb3Jpem9u
dGFsUG9zaXQKICAgICAvLyB3ZSBub3cgZXhhbWluZSBvdXIgdGV4dC1hbGlnbiBwcm9wZXJ0eSBp
biBvcmRlciB0byBkZXRlcm1pbmUgd2hlcmUgdG8gcG9zaXRpb24gdGhlCiAgICAgLy8gb2JqZWN0
cyBob3Jpem9udGFsbHkuICBUaGUgdG90YWwgd2lkdGggb2YgdGhlIGxpbmUgY2FuIGJlIGluY3Jl
YXNlZCBpZiB3ZSBlbmQgdXAKICAgICAvLyBqdXN0aWZ5aW5nIHRleHQuCi0gICAgaW50IHggPSBs
ZWZ0T2Zmc2V0KGhlaWdodCgpLCBmaXJzdExpbmUpOwogICAgIHN3aXRjaCAodGV4dEFsaWduKSB7
CiAgICAgICAgIGNhc2UgTEVGVDoKICAgICAgICAgY2FzZSBXRUJLSVRfTEVGVDoKQEAgLTUxOSw5
ICs1NTAsMTUgQEAgdm9pZCBSZW5kZXJCbG9jazo6bGF5b3V0SW5saW5lQ2hpbGRyZW4oYgogICAg
IGJvb2wgdXNlUmVwYWludEJvdW5kcyA9IGZhbHNlOwogICAgIAogICAgIG1fb3ZlcmZsb3cuY2xl
YXIoKTsKLSAgICAgICAgCi0gICAgc2V0SGVpZ2h0KGJvcmRlclRvcCgpICsgcGFkZGluZ1RvcCgp
KTsKLSAgICBpbnQgdG9BZGQgPSBib3JkZXJCb3R0b20oKSArIHBhZGRpbmdCb3R0b20oKSArIGhv
cml6b250YWxTY3JvbGxiYXJIZWlnaHQoKTsKKyAgICAKKyAgICBpbnQgdG9wID0gYm9yZGVyVG9w
KCkgKyBwYWRkaW5nVG9wKCk7CisgICAgaW50IGJvdHRvbSA9IGJvcmRlckJvdHRvbSgpICsgcGFk
ZGluZ0JvdHRvbSgpICsgaG9yaXpvbnRhbFNjcm9sbGJhckhlaWdodCgpOworCisgICAgc2V0SGVp
Z2h0KHRvcCk7CisKKyAgICAvLyBUaGUgbWFyZ2luIHN0cnVjdCBjYWNoZXMgYWxsIG91ciBjdXJy
ZW50IG1hcmdpbiBjb2xsYXBzaW5nIHN0YXRlLiBXZSBydW4gbWFyZ2luIGNvbGxhcHNpbmcgd2hl
biB3ZSBlbmNvdW50ZXIgYW5vbnltb3VzIGlubGluZSBibG9ja3MgdGhhdCBhcmUgYmVpbmcgdXNl
ZAorICAgIC8vIGZvciB0aGUgYmxvY2tzLWluc2lkZS1pbmxpbmVzIGNhc2UgKGFuZCB0aGUgaW5s
aW5lcyBhcmUgZW1wdHkpLCBlLmcsIDxzcGFuPjxkaXY+T25lPC9kaXY+PC9zcGFuPi4KKyAgICBN
YXJnaW5JbmZvIG1hcmdpbkluZm8odGhpcywgdG9wLCBib3R0b20pOwogCiAgICAgLy8gRmlndXJl
IG91dCBpZiB3ZSBzaG91bGQgY2xlYXIgb3V0IG91ciBsaW5lIGJveGVzLgogICAgIC8vIEZJWE1F
OiBIYW5kbGUgcmVzaXplIGV2ZW50dWFsbHkhCkBAIC01NTAsMTIgKzU4NywxNSBAQCB2b2lkIFJl
bmRlckJsb2NrOjpsYXlvdXRJbmxpbmVDaGlsZHJlbihiCiAgICAgICAgICAgICBpZiAoby0+aXNS
ZXBsYWNlZCgpIHx8IG8tPmlzRmxvYXRpbmcoKSB8fCBvLT5pc1Bvc2l0aW9uZWQoKSkgewogICAg
ICAgICAgICAgICAgIFJlbmRlckJveCogYm94ID0gdG9SZW5kZXJCb3gobyk7CiAgICAgICAgICAg
ICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlbGF5b3V0Q2hpbGRyZW4gfHwgby0+c3R5bGUo
KS0+d2lkdGgoKS5pc1BlcmNlbnQoKSB8fCBvLT5zdHlsZSgpLT5oZWlnaHQoKS5pc1BlcmNlbnQo
KSkKLSAgICAgICAgICAgICAgICAgICAgby0+c2V0Q2hpbGROZWVkc0xheW91dCh0cnVlLCBmYWxz
ZSk7Ci0gICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3
ZSBsYXlvdXQgY2hpbGRyZW4gaWYgdGhleSBuZWVkIGl0LgorICAgICAgICAgICAgICAgIC8vIEZJ
WE1FOiBUZWNobmljYWxseSBwZXJjZW50YWdlIGhlaWdodCBvYmplY3RzIG9ubHkgbmVlZCBhIHJl
bGF5b3V0IGlmIHRoZWlyIHBlcmNlbnRhZ2UgaXNuJ3QgZ29pbmcgdG8gYmUgdHVybmVkIGludG8K
KyAgICAgICAgICAgICAgICAvLyBhbiBhdXRvIHZhbHVlLiAgQWRkIGEgbWV0aG9kIHRvIGRldGVy
bWluZSB0aGlzLCBzbyB0aGF0IHdlIGNhbiBhdm9pZCB0aGUgcmVsYXlvdXQuCisgICAgICAgICAg
ICAgICAgaWYgKHJlbGF5b3V0Q2hpbGRyZW4gfHwgKChib3gtPnN0eWxlKCktPmhlaWdodCgpLmlz
UGVyY2VudCgpIHx8IGJveC0+c3R5bGUoKS0+bWluSGVpZ2h0KCkuaXNQZXJjZW50KCkgfHwgYm94
LT5zdHlsZSgpLT5tYXhIZWlnaHQoKS5pc1BlcmNlbnQoKSkpKQorICAgICAgICAgICAgICAgICAg
ICBib3gtPnNldENoaWxkTmVlZHNMYXlvdXQodHJ1ZSwgZmFsc2UpOworCiAgICAgICAgICAgICAg
ICAgLy8gSWYgcmVsYXlvdXRDaGlsZHJlbiBpcyBzZXQgYW5kIHdlIGhhdmUgcGVyY2VudGFnZSBw
YWRkaW5nLCB3ZSBhbHNvIG5lZWQgdG8gaW52YWxpZGF0ZSB0aGUgY2hpbGQncyBwcmVmIHdpZHRo
cy4KLSAgICAgICAgICAgICAgICBpZiAocmVsYXlvdXRDaGlsZHJlbiAmJiAoby0+c3R5bGUoKS0+
cGFkZGluZ0xlZnQoKS5pc1BlcmNlbnQoKSB8fCBvLT5zdHlsZSgpLT5wYWRkaW5nUmlnaHQoKS5p
c1BlcmNlbnQoKSkpCi0gICAgICAgICAgICAgICAgICAgIG8tPnNldFByZWZXaWR0aHNEaXJ0eSh0
cnVlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgaWYgKHJlbGF5b3V0Q2hpbGRyZW4gJiYgKGJv
eC0+c3R5bGUoKS0+cGFkZGluZ0xlZnQoKS5pc1BlcmNlbnQoKSB8fCBib3gtPnN0eWxlKCktPnBh
ZGRpbmdSaWdodCgpLmlzUGVyY2VudCgpKSkKKyAgICAgICAgICAgICAgICAgICAgYm94LT5zZXRQ
cmVmV2lkdGhzRGlydHkodHJ1ZSwgZmFsc2UpOwogICAgICAgICAgICAgCiAgICAgICAgICAgICAg
ICAgaWYgKG8tPmlzUG9zaXRpb25lZCgpKQogICAgICAgICAgICAgICAgICAgICBvLT5jb250YWlu
aW5nQmxvY2soKS0+aW5zZXJ0UG9zaXRpb25lZE9iamVjdChib3gpOwpAQCAtNTY1LDcgKzYwNSw4
IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmxheW91dElubGluZUNoaWxkcmVuKGIKICAgICAgICAgICAg
ICAgICAgICAgZWxzZSBpZiAoZnVsbExheW91dCB8fCBvLT5uZWVkc0xheW91dCgpKSAvLyBSZXBs
YWNlZCBlbGVtZW50cwogICAgICAgICAgICAgICAgICAgICAgICAgdG9SZW5kZXJCb3gobyktPmRp
cnR5TGluZUJveGVzKGZ1bGxMYXlvdXQpOwogCi0gICAgICAgICAgICAgICAgICAgIG8tPmxheW91
dElmTmVlZGVkKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghby0+aXNSZXBsYWNlZCgpIHx8
ICFvLT5pc0Fub255bW91c0lubGluZUJsb2NrKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBv
LT5sYXlvdXRJZk5lZWRlZCgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxz
ZSBpZiAoby0+aXNUZXh0KCkgfHwgKG8tPmlzUmVuZGVySW5saW5lKCkgJiYgIWVuZE9mSW5saW5l
KSkgewogICAgICAgICAgICAgICAgIGhhc0lubGluZUNoaWxkID0gdHJ1ZTsKQEAgLTY2MCw3ICs3
MDEsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjpsYXlvdXRJbmxpbmVDaGlsZHJlbihiCiAgICAgICAg
ICAgICBpc0xpbmVFbXB0eSA9IHRydWU7CiAgICAgICAgICAgICAKICAgICAgICAgICAgIEVDbGVh
ciBjbGVhciA9IENOT05FOwotICAgICAgICAgICAgZW5kID0gZmluZE5leHRMaW5lQnJlYWsocmVz
b2x2ZXIsIGZpcnN0TGluZSwgaXNMaW5lRW1wdHksIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSwg
JmNsZWFyKTsKKyAgICAgICAgICAgIGVuZCA9IGZpbmROZXh0TGluZUJyZWFrKHJlc29sdmVyLCBm
aXJzdExpbmUsIGlzTGluZUVtcHR5LCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHksIG1hcmdpbklu
Zm8sICZjbGVhcik7CiAgICAgICAgICAgICBpZiAocmVzb2x2ZXIucG9zaXRpb24oKS5hdEVuZCgp
KSB7CiAgICAgICAgICAgICAgICAgcmVzb2x2ZXIuZGVsZXRlUnVucygpOwogICAgICAgICAgICAg
ICAgIGNoZWNrRm9yRmxvYXRzRnJvbUxhc3RMaW5lID0gdHJ1ZTsKQEAgLTczMCw2ICs3NzEsMTQg
QEAgdm9pZCBSZW5kZXJCbG9jazo6bGF5b3V0SW5saW5lQ2hpbGRyZW4oYgogICAgICAgICAgICAg
ICAgICAgICBpZiAobGluZUJveCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbGluZUJveC0+
c2V0RW5kc1dpdGhCcmVhayhwcmV2aW91c0xpbmVCcm9rZUNsZWFubHkpOwogCisgICAgICAgICAg
ICAgICAgICAgICAgICAvLyBJZiBvdXIgcHJldmlvdXMgbGluZSB3YXMgYW4gYW5vbnltb3VzIGJs
b2NrIGFuZCB3ZSBhcmUgbm90IGFuIGFub255bW91cyBibG9jaywgc2ltdWxhdGUgYSBtYXJnaW4g
Y29sbGFwc2Ugbm93IHNvIHRoYXQgd2UgZ2V0IHRoZSBwcm9wZXIKKyAgICAgICAgICAgICAgICAg
ICAgICAgIC8vIGluY3JlYXNlZCBoZWlnaHQuICBXZSBhbHNvIGhhdmUgdG8gc2ltdWxhdGUgYSBt
YXJnaW4gY29sbGFwc2UgdG8gcHJvcGFnYXRlIG1hcmdpbnMgdGhyb3VnaCB0byB0aGUgdG9wIG9m
IG91ciBibG9jay4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbGluZUJveC0+aGFzQW5v
bnltb3VzSW5saW5lQmxvY2soKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgh
bGluZUJveC0+cHJldlJvb3RCb3goKSB8fCBsaW5lQm94LT5wcmV2Um9vdEJveCgpLT5oYXNBbm9u
eW1vdXNJbmxpbmVCbG9jaygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xs
YXBzZU1hcmdpbnMoMCwgbWFyZ2luSW5mbyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
bWFyZ2luSW5mby5zZXRBdFRvcE9mQmxvY2soZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAg
ICAgfQorCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3cgd2UgcG9zaXRpb24gYWxsIG9m
IG91ciB0ZXh0IHJ1bnMgaG9yaXpvbnRhbGx5LgogICAgICAgICAgICAgICAgICAgICAgICAgY29t
cHV0ZUhvcml6b250YWxQb3NpdGlvbnNGb3JMaW5lKGxpbmVCb3gsIGZpcnN0TGluZSwgcmVzb2x2
ZXIuZmlyc3RSdW4oKSwgdHJhaWxpbmdTcGFjZVJ1biwgZW5kLmF0RW5kKCkpOwogCkBAIC04NjEs
OCArOTEwLDE0IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmxheW91dElubGluZUNoaWxkcmVuKGIKICAg
ICAgICAgfQogICAgIH0KIAotICAgIC8vIE5vdyBhZGQgaW4gdGhlIGJvdHRvbSBib3JkZXIvcGFk
ZGluZy4KLSAgICBzZXRIZWlnaHQoaGVpZ2h0KCkgKyB0b0FkZCk7CisgICAgLy8gTm93IGRvIHRo
ZSBoYW5kbGluZyBvZiB0aGUgYm90dG9tIG9mIHRoZSBibG9jaywgYWRkaW5nIGluIG91ciBib3R0
b20gYm9yZGVyL3BhZGRpbmcgYW5kCisgICAgLy8gZGV0ZXJtaW5pbmcgdGhlIGNvcnJlY3QgY29s
bGFwc2VkIGJvdHRvbSBtYXJnaW4gaW5mb3JtYXRpb24uICBUaGlzIGNvbGxhcHNlIGlzIG9ubHkg
bmVjZXNzYXJ5CisgICAgLy8gaWYgb3VyIGxhc3QgY2hpbGQgd2FzIGFuIGFub255bW91cyBpbmxp
bmUgYmxvY2sgdGhhdCBtaWdodCBuZWVkIHRvIHByb3BhZ2F0ZSBtYXJnaW4gaW5mb3JtYXRpb24g
b3V0IHRvCisgICAgLy8gdXMuCisgICAgaWYgKGxhc3RSb290Qm94KCkgJiYgbGFzdFJvb3RCb3go
KS0+aGFzQW5vbnltb3VzSW5saW5lQmxvY2soKSkKKyAgICAgICAgaGFuZGxlQm90dG9tT2ZCbG9j
ayh0b3AsIGJvdHRvbSwgbWFyZ2luSW5mbyk7CisgICAgZWxzZQorICAgICAgICBzZXRIZWlnaHQo
aGVpZ2h0KCkgKyBib3R0b20pOwogCiAgICAgaWYgKCFmaXJzdExpbmVCb3goKSAmJiBoYXNMaW5l
SWZFbXB0eSgpKQogICAgICAgICBzZXRIZWlnaHQoaGVpZ2h0KCkgKyBsaW5lSGVpZ2h0KHRydWUs
IHRydWUpKTsKQEAgLTg4Myw2ICs5MzgsMTIgQEAgUm9vdElubGluZUJveCogUmVuZGVyQmxvY2s6
OmRldGVybWluZVN0YQogICAgIGlmICghZnVsbExheW91dCkgewogICAgICAgICBzaXplX3QgZmxv
YXRJbmRleCA9IDA7CiAgICAgICAgIGZvciAoY3VyciA9IGZpcnN0Um9vdEJveCgpOyBjdXJyICYm
ICFjdXJyLT5pc0RpcnR5KCk7IGN1cnIgPSBjdXJyLT5uZXh0Um9vdEJveCgpKSB7CisgICAgICAg
ICAgICBpZiAoY3Vyci0+aGFzQW5vbnltb3VzSW5saW5lQmxvY2soKSkgeworICAgICAgICAgICAg
ICAgIC8vIEZJWE1FOiBXZSBoYXZlIHRvIGRvIGJldHRlciB0aGFuIHRoaXMgb3Igd2Ugd2lsbCBy
ZXBhaW50IHRvbyBtdWNoIGFzIGNvbnRlbnQgaW5zaWRlIGFuCisgICAgICAgICAgICAgICAgLy8g
YW5vbnltb3VzIGlubGluZSBibG9jayBjb21lcyBpbi4KKyAgICAgICAgICAgICAgICBmdWxsTGF5
b3V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KICAgICAg
ICAgICAgIGlmIChWZWN0b3I8UmVuZGVyQm94Kj4qIGNsZWFuTGluZUZsb2F0cyA9IGN1cnItPmZs
b2F0c1B0cigpKSB7CiAgICAgICAgICAgICAgICAgVmVjdG9yPFJlbmRlckJveCo+OjppdGVyYXRv
ciBlbmQgPSBjbGVhbkxpbmVGbG9hdHMtPmVuZCgpOwogICAgICAgICAgICAgICAgIGZvciAoVmVj
dG9yPFJlbmRlckJveCo+OjppdGVyYXRvciBvID0gY2xlYW5MaW5lRmxvYXRzLT5iZWdpbigpOyBv
ICE9IGVuZDsgKytvKSB7CkBAIC0xMTQwLDcgKzEyMDEsNyBAQCBzdGF0aWMgYm9vbCBpbmxpbmVG
bG93UmVxdWlyZXNMaW5lQm94KFJlCiB7CiAgICAgLy8gRklYTUU6IFJpZ2h0IG5vdywgd2Ugb25s
eSBhbGxvdyBsaW5lIGJveGVzIGZvciBpbmxpbmVzIHRoYXQgYXJlIHRydWx5IGVtcHR5LgogICAg
IC8vIFdlIG5lZWQgdG8gZml4IHRoaXMsIHRob3VnaCwgYmVjYXVzZSBhdCB0aGUgdmVyeSBsZWFz
dCwgaW5saW5lcyBjb250YWluaW5nIG9ubHkKLSAgICAvLyBpZ25vcmFibGUgd2hpdGVzcGFjZSBz
aG91bGQgc2hvdWxkIGFsc28gaGF2ZSBsaW5lIGJveGVzLiAKKyAgICAvLyBpZ25vcmFibGUgd2hp
dGVzcGFjZSBzaG91bGQgYWxzbyBoYXZlIGxpbmUgYm94ZXMuIAogICAgIHJldHVybiAhZmxvdy0+
Zmlyc3RDaGlsZCgpICYmIGZsb3ctPmhhc0hvcml6b250YWxCb3JkZXJzUGFkZGluZ09yTWFyZ2lu
KCk7CiB9CiAKQEAgLTEyOTcsNyArMTM1OCw3IEBAIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgdGV4
dFdpZHRoKFJlbmRlclQKIH0KIAogSW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6OmZpbmROZXh0
TGluZUJyZWFrKElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIsIGJvb2wgZmlyc3RMaW5lLCAg
Ym9vbCYgaXNMaW5lRW1wdHksIGJvb2wmIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSwgCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUNsZWFyKiBjbGVhcikK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXJnaW5JbmZv
JiBtYXJnaW5JbmZvLCBFQ2xlYXIqIGNsZWFyKQogewogICAgIEFTU0VSVChyZXNvbHZlci5wb3Np
dGlvbigpLmJsb2NrID09IHRoaXMpOwogCkBAIC0xMzM4LDYgKzEzOTksMTEgQEAgSW5saW5lSXRl
cmF0b3IgUmVuZGVyQmxvY2s6OmZpbmROZXh0TGluZQogICAgIGJvb2wgYXV0b1dyYXBXYXNFdmVy
VHJ1ZU9uTGluZSA9IGZhbHNlOwogICAgIGJvb2wgZmxvYXRzRml0T25MaW5lID0gdHJ1ZTsKICAg
ICAKKyAgICBib29sIGlzQmxvY2tJbnNpZGVJbmxpbmUgPSBmYWxzZTsKKyAgICAKKyAgICBpbnQg
cHJldmlvdXNCbG9ja0Zsb2F0Qm90dG9tID0gMDsKKyAgICBpbnQgbWF4QmxvY2tGbG9hdEJvdHRv
bSA9IDA7CisKICAgICAvLyBGaXJlZm94IGFuZCBPcGVyYSB3aWxsIGFsbG93IGEgdGFibGUgY2Vs
bCB0byBncm93IHRvIGZpdCBhbiBpbWFnZSBpbnNpZGUgaXQgdW5kZXIKICAgICAvLyB2ZXJ5IHNw
ZWNpZmljIGNpcmN1bXN0YW5jZXMgKGluIG9yZGVyIHRvIG1hdGNoIGNvbW1vbiBXaW5JRSByZW5k
ZXJpbmdzKS4gCiAgICAgLy8gTm90IHN1cHBvcnRpbmcgdGhlIHF1aXJrIGhhcyBjYXVzZWQgdXMg
dG8gbWlzLXJlbmRlciBzb21lIHJlYWwgc2l0ZXMuIChTZWUgQnVnemlsbGEgMTA1MTcuKSAKQEAg
LTEzNDgsNyArMTQxNCw4IEBAIElubGluZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpmaW5kTmV4dExp
bmUKICAgICB3aGlsZSAobykgewogICAgICAgICBjdXJyV1MgPSBvLT5pc1JlcGxhY2VkKCkgPyBv
LT5wYXJlbnQoKS0+c3R5bGUoKS0+d2hpdGVTcGFjZSgpIDogby0+c3R5bGUoKS0+d2hpdGVTcGFj
ZSgpOwogICAgICAgICBsYXN0V1MgPSBsYXN0LT5pc1JlcGxhY2VkKCkgPyBsYXN0LT5wYXJlbnQo
KS0+c3R5bGUoKS0+d2hpdGVTcGFjZSgpIDogbGFzdC0+c3R5bGUoKS0+d2hpdGVTcGFjZSgpOwot
ICAgICAgICAKKyAgICAgICAgaXNCbG9ja0luc2lkZUlubGluZSA9IG8tPmlzQW5vbnltb3VzSW5s
aW5lQmxvY2soKTsKKwogICAgICAgICBib29sIGF1dG9XcmFwID0gUmVuZGVyU3R5bGU6OmF1dG9X
cmFwKGN1cnJXUyk7CiAgICAgICAgIGF1dG9XcmFwV2FzRXZlclRydWVPbkxpbmUgPSBhdXRvV3Jh
cFdhc0V2ZXJUcnVlT25MaW5lIHx8IGF1dG9XcmFwOwogCkBAIC0xMzU5LDcgKzE0MjYsNyBAQCBJ
bmxpbmVJdGVyYXRvciBSZW5kZXJCbG9jazo6ZmluZE5leHRMaW5lCiAjZW5kaWYKIAogICAgICAg
ICBib29sIGNvbGxhcHNlV2hpdGVTcGFjZSA9IFJlbmRlclN0eWxlOjpjb2xsYXBzZVdoaXRlU3Bh
Y2UoY3VycldTKTsKLSAgICAgICAgICAgIAorCiAgICAgICAgIGlmIChvLT5pc0JSKCkpIHsKICAg
ICAgICAgICAgIGlmICh3ICsgdG1wVyA8PSB3aWR0aCkgewogICAgICAgICAgICAgICAgIGxCcmVh
ay5vYmogPSBvOwpAQCAtMTQ2Niw4ICsxNTMzLDkgQEAgSW5saW5lSXRlcmF0b3IgUmVuZGVyQmxv
Y2s6OmZpbmROZXh0TGluZQogICAgICAgICB9IGVsc2UgaWYgKG8tPmlzUmVwbGFjZWQoKSkgewog
ICAgICAgICAgICAgUmVuZGVyQm94KiByZXBsYWNlZEJveCA9IHRvUmVuZGVyQm94KG8pOwogCi0g
ICAgICAgICAgICAvLyBCcmVhayBvbiByZXBsYWNlZCBlbGVtZW50cyBpZiBlaXRoZXIgaGFzIG5v
cm1hbCB3aGl0ZS1zcGFjZS4KLSAgICAgICAgICAgIGlmICgoYXV0b1dyYXAgfHwgUmVuZGVyU3R5
bGU6OmF1dG9XcmFwKGxhc3RXUykpICYmICghby0+aXNJbWFnZSgpIHx8IGFsbG93SW1hZ2VzVG9C
cmVhaykpIHsKKyAgICAgICAgICAgIC8vIEJyZWFrIG9uIHJlcGxhY2VkIGVsZW1lbnRzIGlmIGVp
dGhlciBoYXMgbm9ybWFsIHdoaXRlLXNwYWNlLiAgV2UgYWxzbyBhbHdheXMgYnJlYWsgaWYgd2UK
KyAgICAgICAgICAgIC8vIGVuY291bnRlciBhIHNwZWNpYWwgYW5vbnltb3VzIGlubGluZSBibG9j
ayAodXNlZCB0byBob2xkIGJsb2NrcyBpbnNpZGUgaW5saW5lcykuCisgICAgICAgICAgICBpZiAo
KGF1dG9XcmFwIHx8IFJlbmRlclN0eWxlOjphdXRvV3JhcChsYXN0V1MpIHx8IGlzQmxvY2tJbnNp
ZGVJbmxpbmUpICAmJiAoIW8tPmlzSW1hZ2UoKSB8fCBhbGxvd0ltYWdlc1RvQnJlYWspKSB7CiAg
ICAgICAgICAgICAgICAgdyArPSB0bXBXOwogICAgICAgICAgICAgICAgIHRtcFcgPSAwOwogICAg
ICAgICAgICAgICAgIGxCcmVhay5vYmogPSBvOwpAQCAtMTQ3NSw2ICsxNTQzLDE5IEBAIElubGlu
ZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpmaW5kTmV4dExpbmUKICAgICAgICAgICAgICAgICBsQnJl
YWsubmV4dEJyZWFrYWJsZVBvc2l0aW9uID0gLTE7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAg
ICAgIGlmIChpc0Jsb2NrSW5zaWRlSW5saW5lKSB7CisgICAgICAgICAgICAgICAgaWYgKCFpc0xp
bmVFbXB0eSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBlbmQ7CisKKyAgICAgICAgICAgICAg
ICAvLyBSZXNldCB0aGUgd2lkdGggdG8gaWdub3JlIGZsb2F0cywgc2luY2Ugd2UncmUgZ29pbmcg
dG8gYWxsb3cgdGhlbSB0byBpbnRydWRlIGludG8gb3VyIHNwYWNlLgorICAgICAgICAgICAgICAg
IHdpZHRoID0gcmlnaHRPZmZzZXQoKSAtIGxlZnRPZmZzZXQoKTsKKworICAgICAgICAgICAgICAg
IC8vIEZJWE1FOiBUaGlzIGNhbGwgd2lsbCB1cGRhdGUgdGhlIGhlaWdodCBvZiBvdXIgYmxvY2su
ICBJdCdzIG5vdCBjbGVhciBpZiB0aGF0J3MgZ29pbmcgdG8gYmUgb2sgb3Igbm90IHlldC4KKyAg
ICAgICAgICAgICAgICBsYXlvdXRCbG9ja0NoaWxkKHJlcGxhY2VkQm94LCBtYXJnaW5JbmZvLCBw
cmV2aW91c0Jsb2NrRmxvYXRCb3R0b20sIG1heEJsb2NrRmxvYXRCb3R0b20pOworCisgICAgICAg
ICAgICAgICAgbGluZU1pZHBvaW50U3RhdGUuYmV0d2Vlbk1pZHBvaW50cyA9IGZhbHNlOworICAg
ICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoaWdub3JpbmdTcGFjZXMpCiAgICAgICAgICAg
ICAgICAgYWRkTWlkcG9pbnQobGluZU1pZHBvaW50U3RhdGUsIElubGluZUl0ZXJhdG9yKDAsIG8s
IDApKTsKIApAQCAtMTQ5OCw2ICsxNTc5LDE1IEBAIElubGluZUl0ZXJhdG9yIFJlbmRlckJsb2Nr
OjpmaW5kTmV4dExpbmUKICAgICAgICAgICAgICAgICAgICAgdG1wVyArPSByZXBsYWNlZEJveC0+
d2lkdGgoKSArIHJlcGxhY2VkQm94LT5tYXJnaW5MZWZ0KCkgKyByZXBsYWNlZEJveC0+bWFyZ2lu
UmlnaHQoKSArIGlubGluZVdpZHRoKG8pOwogICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAg
ICAgICAgdG1wVyArPSByZXBsYWNlZEJveC0+d2lkdGgoKSArIHJlcGxhY2VkQm94LT5tYXJnaW5M
ZWZ0KCkgKyByZXBsYWNlZEJveC0+bWFyZ2luUmlnaHQoKSArIGlubGluZVdpZHRoKG8pOworICAg
ICAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGlzQmxvY2tJbnNpZGVJbmxpbmUpIHsKKyAg
ICAgICAgICAgICAgICB3ICs9IHRtcFc7CisgICAgICAgICAgICAgICAgdG1wVyA9IDA7CisgICAg
ICAgICAgICAgICAgbEJyZWFrLm9iaiA9IG87CisgICAgICAgICAgICAgICAgbEJyZWFrLnBvcyA9
IDA7CisgICAgICAgICAgICAgICAgbEJyZWFrLm5leHRCcmVha2FibGVQb3NpdGlvbiA9IC0xOwor
ICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2Ug
aWYgKG8tPmlzVGV4dCgpKSB7CiAgICAgICAgICAgICBpZiAoIXBvcykKICAgICAgICAgICAgICAg
ICBhcHBsaWVkU3RhcnRXaWR0aCA9IGZhbHNlOwpAQCAtMTg4NCw3ICsxOTc0LDcgQEAgSW5saW5l
SXRlcmF0b3IgUmVuZGVyQmxvY2s6OmZpbmROZXh0TGluZQogICAgICAgICB9CiAgICAgICAgIC8v
ZWxzZSBpZiAobEJyZWFrLnBvcyA+IDApCiAgICAgICAgIC8vICAgIGxCcmVhay5wb3MtLTsKLSAg
ICAgICAgZWxzZSBpZiAobEJyZWFrLm9iaiA9PSAwICYmIHRyYWlsaW5nU3BhY2VPYmplY3QtPmlz
VGV4dCgpKSB7CisgICAgICAgIGVsc2UgaWYgKCghbEJyZWFrLm9iaiB8fCBsQnJlYWsub2JqLT5p
c0Fub255bW91c0lubGluZUJsb2NrKCkpICYmIHRyYWlsaW5nU3BhY2VPYmplY3QtPmlzVGV4dCgp
KSB7CiAgICAgICAgICAgICAvLyBBZGQgYSBuZXcgZW5kIG1pZHBvaW50IHRoYXQgc3RvcHMgcmln
aHQgYXQgdGhlIHZlcnkgZW5kLgogICAgICAgICAgICAgUmVuZGVyVGV4dCogdGV4dCA9IHRvUmVu
ZGVyVGV4dCh0cmFpbGluZ1NwYWNlT2JqZWN0KTsKICAgICAgICAgICAgIHVuc2lnbmVkIGxlbmd0
aCA9IHRleHQtPnRleHRMZW5ndGgoKTsKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJv
eC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQm94LmNwcAkocmV2
aXNpb24gNTQ3MjcpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCb3guY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0xMzM0LDcgKzEzMzQsNyBAQCB2b2lkIFJlbmRlckJveDo6Y2FsY1dpZHRoKCkK
ICAgICB9CiAKICAgICBpZiAoY29udGFpbmVyV2lkdGggJiYgY29udGFpbmVyV2lkdGggIT0gKHdp
ZHRoKCkgKyBtX21hcmdpbkxlZnQgKyBtX21hcmdpblJpZ2h0KQotICAgICAgICAgICAgJiYgIWlz
RmxvYXRpbmcoKSAmJiAhaXNJbmxpbmUoKSAmJiAhY2ItPmlzRmxleGlibGVCb3goKSkgeworICAg
ICAgICAgICAgJiYgIWlzRmxvYXRpbmcoKSAmJiAoIWlzSW5saW5lKCkgfHwgaXNBbm9ueW1vdXNJ
bmxpbmVCbG9jaygpKSAmJiAhY2ItPmlzRmxleGlibGVCb3goKSkgewogICAgICAgICBpZiAoY2It
PnN0eWxlKCktPmRpcmVjdGlvbigpID09IExUUikKICAgICAgICAgICAgIG1fbWFyZ2luUmlnaHQg
PSBjb250YWluZXJXaWR0aCAtIHdpZHRoKCkgLSBtX21hcmdpbkxlZnQ7CiAgICAgICAgIGVsc2UK
QEAgLTEzNzMsNyArMTM3Myw3IEBAIGJvb2wgUmVuZGVyQm94OjpzaXplc1RvSW50cmluc2ljV2lk
dGgoV2kKIHsKICAgICAvLyBNYXJxdWVlcyBpbiBXaW5JRSBhcmUgbGlrZSBhIG1peHR1cmUgb2Yg
YmxvY2tzIGFuZCBpbmxpbmUtYmxvY2tzLiAgVGhleSBzaXplIGFzIHRob3VnaCB0aGV5J3JlIGJs
b2NrcywKICAgICAvLyBidXQgdGhleSBhbGxvdyB0ZXh0IHRvIHNpdCBvbiB0aGUgc2FtZSBsaW5l
IGFzIHRoZSBtYXJxdWVlLgotICAgIGlmIChpc0Zsb2F0aW5nKCkgfHwgKGlzSW5saW5lQmxvY2tP
cklubGluZVRhYmxlKCkgJiYgIWlzSFRNTE1hcnF1ZWUoKSkpCisgICAgaWYgKGlzRmxvYXRpbmco
KSB8fCAoaXNJbmxpbmVCbG9ja09ySW5saW5lVGFibGUoKSAmJiAhaXNIVE1MTWFycXVlZSgpICYm
ICFpc0Fub255bW91c0lubGluZUJsb2NrKCkpKQogICAgICAgICByZXR1cm4gdHJ1ZTsKIAogICAg
IC8vIFRoaXMgY29kZSBtYXkgbG9vayBhIGJpdCBzdHJhbmdlLiAgQmFzaWNhbGx5IHdpZHRoOmlu
dHJpbnNpYyBzaG91bGQgY2xhbXAgdGhlIHNpemUgd2hlbiB0ZXN0aW5nIGJvdGgKQEAgLTI4MTks
NyArMjgxOSw3IEBAIGJvb2wgUmVuZGVyQm94OjpzaHJpbmtUb0F2b2lkRmxvYXRzKCkgY28KIAog
Ym9vbCBSZW5kZXJCb3g6OmF2b2lkc0Zsb2F0cygpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIGlzUmVw
bGFjZWQoKSB8fCBoYXNPdmVyZmxvd0NsaXAoKSB8fCBpc0hSKCk7CisgICAgcmV0dXJuICFpc0Fu
b255bW91c0lubGluZUJsb2NrKCkgJiYgKGlzUmVwbGFjZWQoKSB8fCBoYXNPdmVyZmxvd0NsaXAo
KSB8fCBpc0hSKCkpOwogfQogCiB2b2lkIFJlbmRlckJveDo6YWRkU2hhZG93T3ZlcmZsb3coKQpJ
bmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQm94TW9kZWxPYmplY3QuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJveE1vZGVsT2JqZWN0LmNwcAkocmV2aXNp
b24gNTQ3MjcpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCb3hNb2RlbE9iamVjdC5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTUxMSw4ICs1MTEsOSBAQCB2b2lkIFJlbmRlckJveE1vZGVsT2Jq
ZWN0OjpwYWludEZpbGxMYXllCiAgICAgICAgIC8vIE5vdyBhZGQgdGhlIHRleHQgdG8gdGhlIGNs
aXAuICBXZSBkbyB0aGlzIGJ5IHBhaW50aW5nIHVzaW5nIGEgc3BlY2lhbCBwYWludCBwaGFzZSB0
aGF0IHNpZ25hbHMgdG8KICAgICAgICAgLy8gSW5saW5lVGV4dEJveGVzIHRoYXQgdGhleSBzaG91
bGQganVzdCBhZGQgdGhlaXIgY29udGVudHMgdG8gdGhlIGNsaXAuCiAgICAgICAgIFBhaW50SW5m
byBpbmZvKG1hc2tJbWFnZUNvbnRleHQsIG1hc2tSZWN0LCBQYWludFBoYXNlVGV4dENsaXAsIHRy
dWUsIDAsIDApOworICAgICAgICBMaW5lQm94UGFpbnRJbmZvIGxpbmVCb3hJbmZvOwogICAgICAg
ICBpZiAoYm94KQotICAgICAgICAgICAgYm94LT5wYWludChpbmZvLCB0eCAtIGJveC0+eCgpLCB0
eSAtIGJveC0+eSgpKTsKKyAgICAgICAgICAgIGJveC0+cGFpbnQoaW5mbywgdHggLSBib3gtPngo
KSwgdHkgLSBib3gtPnkoKSwgbGluZUJveEluZm8pOwogICAgICAgICBlbHNlIHsKICAgICAgICAg
ICAgIGludCB4ID0gaXNCb3goKSA/IHRvUmVuZGVyQm94KHRoaXMpLT54KCkgOiAwOwogICAgICAg
ICAgICAgaW50IHkgPSBpc0JveCgpID8gdG9SZW5kZXJCb3godGhpcyktPnkoKSA6IDA7CkluZGV4
OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJJbmxpbmUuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlcklubGluZS5jcHAJKHJldmlzaW9uIDU0NzI3KQorKysgV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVySW5saW5lLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDQsNyArNDQs
NiBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIFJlbmRlcklubGluZTo6UmVuZGVySW5saW5lKE5v
ZGUqIG5vZGUpCiAgICAgOiBSZW5kZXJCb3hNb2RlbE9iamVjdChub2RlKQotICAgICwgbV9jb250
aW51YXRpb24oMCkKICAgICAsIG1fbGluZUhlaWdodCgtMSkKICAgICAsIG1fdmVydGljYWxQb3Np
dGlvbihQb3NpdGlvblVuZGVmaW5lZCkKIHsKQEAgLTU2LDE0ICs1NSw2IEBAIHZvaWQgUmVuZGVy
SW5saW5lOjpkZXN0cm95KCkKICAgICAvLyBNYWtlIHN1cmUgdG8gZGVzdHJveSBhbm9ueW1vdXMg
Y2hpbGRyZW4gZmlyc3Qgd2hpbGUgdGhleSBhcmUgc3RpbGwgY29ubmVjdGVkIHRvIHRoZSByZXN0
IG9mIHRoZSB0cmVlLCBzbyB0aGF0IHRoZXkgd2lsbAogICAgIC8vIHByb3Blcmx5IGRpcnR5IGxp
bmUgYm94ZXMgdGhhdCB0aGV5IGFyZSByZW1vdmVkIGZyb20uICBFZmZlY3RzIHRoYXQgZG8gOmJl
Zm9yZS86YWZ0ZXIgb25seSBvbiBob3ZlciBjb3VsZCBjcmFzaCBvdGhlcndpc2UuCiAgICAgY2hp
bGRyZW4oKS0+ZGVzdHJveUxlZnRvdmVyQ2hpbGRyZW4oKTsKLQotICAgIC8vIERlc3Ryb3kgb3Vy
IGNvbnRpbnVhdGlvbiBiZWZvcmUgYW55dGhpbmcgb3RoZXIgdGhhbiBhbm9ueW1vdXMgY2hpbGRy
ZW4uCi0gICAgLy8gVGhlIHJlYXNvbiB3ZSBkb24ndCBkZXN0cm95IGl0IGJlZm9yZSBhbm9ueW1v
dXMgY2hpbGRyZW4gaXMgdGhhdCB0aGV5IG1heQotICAgIC8vIGhhdmUgY29udGludWF0aW9ucyBv
ZiB0aGVpciBvd24gdGhhdCBhcmUgYW5vbnltb3VzIGNoaWxkcmVuIG9mIG91ciBjb250aW51YXRp
b24uCi0gICAgaWYgKG1fY29udGludWF0aW9uKSB7Ci0gICAgICAgIG1fY29udGludWF0aW9uLT5k
ZXN0cm95KCk7Ci0gICAgICAgIG1fY29udGludWF0aW9uID0gMDsKLSAgICB9CiAgICAgCiAgICAg
aWYgKCFkb2N1bWVudEJlaW5nRGVzdHJveWVkKCkpIHsKICAgICAgICAgaWYgKGZpcnN0TGluZUJv
eCgpKSB7CkBAIC05MiwxMyArODMsNiBAQCB2b2lkIFJlbmRlcklubGluZTo6ZGVzdHJveSgpCiAg
ICAgUmVuZGVyQm94TW9kZWxPYmplY3Q6OmRlc3Ryb3koKTsKIH0KIAotUmVuZGVySW5saW5lKiBS
ZW5kZXJJbmxpbmU6OmlubGluZUNvbnRpbnVhdGlvbigpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX2Nv
bnRpbnVhdGlvbiB8fCBtX2NvbnRpbnVhdGlvbi0+aXNJbmxpbmUoKSkKLSAgICAgICAgcmV0dXJu
IHRvUmVuZGVySW5saW5lKG1fY29udGludWF0aW9uKTsKLSAgICByZXR1cm4gdG9SZW5kZXJCbG9j
ayhtX2NvbnRpbnVhdGlvbiktPmlubGluZUNvbnRpbnVhdGlvbigpOwotfQotCiB2b2lkIFJlbmRl
cklubGluZTo6dXBkYXRlQm94TW9kZWxJbmZvRnJvbVN0eWxlKCkKIHsKICAgICBSZW5kZXJCb3hN
b2RlbE9iamVjdDo6dXBkYXRlQm94TW9kZWxJbmZvRnJvbVN0eWxlKCk7CkBAIC0xMTQsMTkgKzk4
LDYgQEAgdm9pZCBSZW5kZXJJbmxpbmU6OnN0eWxlRGlkQ2hhbmdlKFN0eWxlRAogewogICAgIFJl
bmRlckJveE1vZGVsT2JqZWN0OjpzdHlsZURpZENoYW5nZShkaWZmLCBvbGRTdHlsZSk7CiAKLSAg
ICAvLyBFbnN1cmUgdGhhdCBhbGwgb2YgdGhlIHNwbGl0IGlubGluZXMgcGljayB1cCB0aGUgbmV3
IHN0eWxlLiBXZQotICAgIC8vIG9ubHkgZG8gdGhpcyBpZiB3ZSdyZSBhbiBpbmxpbmUsIHNpbmNl
IHdlIGRvbid0IHdhbnQgdG8gcHJvcGFnYXRlCi0gICAgLy8gYSBibG9jaydzIHN0eWxlIHRvIHRo
ZSBvdGhlciBpbmxpbmVzLgotICAgIC8vIGUuZy4sIDxmb250PmZvbyA8aDQ+Z29vPC9oND4gbW9v
PC9mb250Pi4gIFRoZSA8Zm9udD4gaW5saW5lcyBiZWZvcmUKLSAgICAvLyBhbmQgYWZ0ZXIgdGhl
IGJsb2NrIHNoYXJlIHRoZSBzYW1lIHN0eWxlLCBidXQgdGhlIGJsb2NrIGRvZXNuJ3QKLSAgICAv
LyBuZWVkIHRvIHBhc3MgaXRzIHN0eWxlIG9uIHRvIGFueW9uZSBlbHNlLgotICAgIGZvciAoUmVu
ZGVySW5saW5lKiBjdXJyQ29udCA9IGlubGluZUNvbnRpbnVhdGlvbigpOyBjdXJyQ29udDsgY3Vy
ckNvbnQgPSBjdXJyQ29udC0+aW5saW5lQ29udGludWF0aW9uKCkpIHsKLSAgICAgICAgUmVuZGVy
Qm94TW9kZWxPYmplY3QqIG5leHRDb250ID0gY3VyckNvbnQtPmNvbnRpbnVhdGlvbigpOwotICAg
ICAgICBjdXJyQ29udC0+c2V0Q29udGludWF0aW9uKDApOwotICAgICAgICBjdXJyQ29udC0+c2V0
U3R5bGUoc3R5bGUoKSk7Ci0gICAgICAgIGN1cnJDb250LT5zZXRDb250aW51YXRpb24obmV4dENv
bnQpOwotICAgIH0KLQogICAgIG1fbGluZUhlaWdodCA9IC0xOwogCiAgICAgLy8gVXBkYXRlIHBz
ZXVkb3MgZm9yIDpiZWZvcmUgYW5kIDphZnRlciBub3cuCkBAIC0xMzYsNzkgKzEwNyw3MyBAQCB2
b2lkIFJlbmRlcklubGluZTo6c3R5bGVEaWRDaGFuZ2UoU3R5bGVECiAgICAgfQogfQogCi12b2lk
IFJlbmRlcklubGluZTo6YWRkQ2hpbGQoUmVuZGVyT2JqZWN0KiBuZXdDaGlsZCwgUmVuZGVyT2Jq
ZWN0KiBiZWZvcmVDaGlsZCkKLXsKLSAgICBpZiAoY29udGludWF0aW9uKCkpCi0gICAgICAgIHJl
dHVybiBhZGRDaGlsZFRvQ29udGludWF0aW9uKG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7Ci0gICAg
cmV0dXJuIGFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24obmV3Q2hpbGQsIGJlZm9yZUNoaWxk
KTsKLX0KLQotc3RhdGljIFJlbmRlckJveE1vZGVsT2JqZWN0KiBuZXh0Q29udGludWF0aW9uKFJl
bmRlck9iamVjdCogcmVuZGVyZXIpCi17Ci0gICAgaWYgKHJlbmRlcmVyLT5pc0lubGluZSgpICYm
ICFyZW5kZXJlci0+aXNSZXBsYWNlZCgpKQotICAgICAgICByZXR1cm4gdG9SZW5kZXJJbmxpbmUo
cmVuZGVyZXIpLT5jb250aW51YXRpb24oKTsKLSAgICByZXR1cm4gdG9SZW5kZXJCbG9jayhyZW5k
ZXJlciktPmlubGluZUNvbnRpbnVhdGlvbigpOwotfQotCi1SZW5kZXJCb3hNb2RlbE9iamVjdCog
UmVuZGVySW5saW5lOjpjb250aW51YXRpb25CZWZvcmUoUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGls
ZCkKK3ZvaWQgUmVuZGVySW5saW5lOjpjaGlsZEJlY2FtZU5vbklubGluZShSZW5kZXJPYmplY3Qq
IGNoaWxkKQogewotICAgIGlmIChiZWZvcmVDaGlsZCAmJiBiZWZvcmVDaGlsZC0+cGFyZW50KCkg
PT0gdGhpcykKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0KLSAgICBSZW5kZXJCb3hNb2RlbE9iamVj
dCogY3VyciA9IG5leHRDb250aW51YXRpb24odGhpcyk7Ci0gICAgUmVuZGVyQm94TW9kZWxPYmpl
Y3QqIG5leHRUb0xhc3QgPSB0aGlzOwotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBsYXN0ID0g
dGhpczsKLSAgICB3aGlsZSAoY3VycikgewotICAgICAgICBpZiAoYmVmb3JlQ2hpbGQgJiYgYmVm
b3JlQ2hpbGQtPnBhcmVudCgpID09IGN1cnIpIHsKLSAgICAgICAgICAgIGlmIChjdXJyLT5maXJz
dENoaWxkKCkgPT0gYmVmb3JlQ2hpbGQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGxhc3Q7Ci0g
ICAgICAgICAgICByZXR1cm4gY3VycjsKLSAgICAgICAgfQotCi0gICAgICAgIG5leHRUb0xhc3Qg
PSBsYXN0OwotICAgICAgICBsYXN0ID0gY3VycjsKLSAgICAgICAgY3VyciA9IG5leHRDb250aW51
YXRpb24oY3Vycik7Ci0gICAgfQotCi0gICAgaWYgKCFiZWZvcmVDaGlsZCAmJiAhbGFzdC0+Zmly
c3RDaGlsZCgpKQotICAgICAgICByZXR1cm4gbmV4dFRvTGFzdDsKLSAgICByZXR1cm4gbGFzdDsK
KyAgICBSZW5kZXJPYmplY3QqIG5leHQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKTsKKyAgICByZW1v
dmVDaGlsZChjaGlsZCk7CisgICAgYWRkQ2hpbGQoY2hpbGQsIG5leHQpOwogfQogCi12b2lkIFJl
bmRlcklubGluZTo6YWRkQ2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihSZW5kZXJPYmplY3QqIG5l
d0NoaWxkLCBSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkKQordm9pZCBSZW5kZXJJbmxpbmU6OmFk
ZENoaWxkKFJlbmRlck9iamVjdCogbmV3Q2hpbGQsIFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQp
CiB7CiAgICAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IGFwcGVuZCB0aGluZ3MgYWZ0ZXIgOmFmdGVy
LWdlbmVyYXRlZCBjb250ZW50IGlmIHdlIGhhdmUgaXQuCiAgICAgaWYgKCFiZWZvcmVDaGlsZCAm
JiBpc0FmdGVyQ29udGVudChsYXN0Q2hpbGQoKSkpCiAgICAgICAgIGJlZm9yZUNoaWxkID0gbGFz
dENoaWxkKCk7CiAKLSAgICBpZiAoIW5ld0NoaWxkLT5pc0lubGluZSgpICYmICFuZXdDaGlsZC0+
aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpKSB7Ci0gICAgICAgIC8vIFdlIGFyZSBwbGFjaW5nIGEg
YmxvY2sgaW5zaWRlIGFuIGlubGluZS4gV2UgaGF2ZSB0byBwZXJmb3JtIGEgc3BsaXQgb2YgdGhp
cwotICAgICAgICAvLyBpbmxpbmUgaW50byBjb250aW51YXRpb25zLiAgVGhpcyBpbnZvbHZlcyBj
cmVhdGluZyBhbiBhbm9ueW1vdXMgYmxvY2sgYm94IHRvIGhvbGQKLSAgICAgICAgLy8gfG5ld0No
aWxkfC4gIFdlIHRoZW4gbWFrZSB0aGF0IGJsb2NrIGJveCBhIGNvbnRpbnVhdGlvbiBvZiB0aGlz
IGlubGluZS4gIFdlIHRha2UgYWxsIG9mCi0gICAgICAgIC8vIHRoZSBjaGlsZHJlbiBhZnRlciB8
YmVmb3JlQ2hpbGR8IGFuZCBwdXQgdGhlbSBpbiBhIGNsb25lIG9mIHRoaXMgb2JqZWN0LgotICAg
ICAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IG5ld1N0eWxlID0gUmVuZGVyU3R5bGU6OmNyZWF0ZSgp
OwotICAgICAgICBuZXdTdHlsZS0+aW5oZXJpdEZyb20oc3R5bGUoKSk7Ci0gICAgICAgIG5ld1N0
eWxlLT5zZXREaXNwbGF5KEJMT0NLKTsKLQotICAgICAgICBSZW5kZXJCbG9jayogbmV3Qm94ID0g
bmV3IChyZW5kZXJBcmVuYSgpKSBSZW5kZXJCbG9jayhkb2N1bWVudCgpIC8qIGFub255bW91cyBi
b3ggKi8pOwotICAgICAgICBuZXdCb3gtPnNldFN0eWxlKG5ld1N0eWxlLnJlbGVhc2UoKSk7Ci0g
ICAgICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBvbGRDb250aW51YXRpb24gPSBjb250aW51YXRp
b24oKTsKLSAgICAgICAgc2V0Q29udGludWF0aW9uKG5ld0JveCk7Ci0KLSAgICAgICAgLy8gU29t
ZW9uZSBtYXkgaGF2ZSBwdXQgYSA8cD4gaW5zaWRlIGEgPHE+LCBjYXVzaW5nIGEgc3BsaXQuICBX
aGVuIHRoaXMgaGFwcGVucywgdGhlIDphZnRlciBjb250ZW50Ci0gICAgICAgIC8vIGhhcyB0byBt
b3ZlIGludG8gdGhlIGlubGluZSBjb250aW51YXRpb24uICBDYWxsIHVwZGF0ZUJlZm9yZUFmdGVy
Q29udGVudCB0byBlbnN1cmUgdGhhdCBvdXIgOmFmdGVyCi0gICAgICAgIC8vIGNvbnRlbnQgZ2V0
cyBwcm9wZXJseSBkZXN0cm95ZWQuCi0gICAgICAgIGJvb2wgaXNMYXN0Q2hpbGQgPSAoYmVmb3Jl
Q2hpbGQgPT0gbGFzdENoaWxkKCkpOwotICAgICAgICBpZiAoZG9jdW1lbnQoKS0+dXNlc0JlZm9y
ZUFmdGVyUnVsZXMoKSkKLSAgICAgICAgICAgIGNoaWxkcmVuKCktPnVwZGF0ZUJlZm9yZUFmdGVy
Q29udGVudCh0aGlzLCBBRlRFUik7Ci0gICAgICAgIGlmIChpc0xhc3RDaGlsZCAmJiBiZWZvcmVD
aGlsZCAhPSBsYXN0Q2hpbGQoKSkKLSAgICAgICAgICAgIGJlZm9yZUNoaWxkID0gMDsgLy8gV2Ug
ZGVzdHJveWVkIHRoZSBsYXN0IGNoaWxkLCBzbyBub3cgd2UgbmVlZCB0byB1cGRhdGUgb3VyIGlu
c2VydGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb2ludCB0byBiZSAwLiAg
SXQncyBqdXN0IGEgc3RyYWlnaHQgYXBwZW5kIG5vdy4KLQotICAgICAgICBzcGxpdEZsb3coYmVm
b3JlQ2hpbGQsIG5ld0JveCwgbmV3Q2hpbGQsIG9sZENvbnRpbnVhdGlvbik7CisgICAgLy8gSWYg
dGhlIHJlcXVlc3RlZCBiZWZvcmVDaGlsZCBpcyBub3Qgb25lIG9mIG91ciBjaGlsZHJlbiwgdGhl
biB0aGlzIGlzIG1vc3QgbGlrZWx5IGJlY2F1c2UKKyAgICAvLyB0aGVyZSBpcyBhbiBhbm9ueW1v
dXMgaW5saW5lLWJsb2NrIGJveCB3aXRoaW4gdGhpcyBvYmplY3QgdGhhdCBjb250YWlucyB0aGUg
YmVmb3JlQ2hpbGQuIFNvCisgICAgLy8ganVzdCBpbnNlcnQgdGhlIGNoaWxkIGludG8gdGhlIGFu
b255bW91cyBpbmxpbmUtYmxvY2sgYm94IGluc3RlYWQgb2YgaGVyZS4KKyAgICAvLyBBIHNlY29u
ZCBwb3NzaWJpbGl0eSBpcyB0aGF0IHRoZSBiZWZvcmVDaGlsZCBpcyBhbiBhbm9ueW1vdXMgYmxv
Y2sgaW5zaWRlIHRoZSBhbm9ueW1vdXMgaW5saW5lIGJsb2NrLgorICAgIC8vIFRoaXMgY2FuIGhh
cHBlbiBpZiBpbmxpbmVzIGFyZSBpbnNlcnRlZCBpbiBiZXR3ZWVuIHR3byBvZiB0aGUgYW5vbnlt
b3VzIGlubGluZSBibG9jaydzIGJsb2NrLWxldmVsCisgICAgLy8gY2hpbGRyZW4gYWZ0ZXIgaXQg
aGFzIGJlZW4gY3JlYXRlZC4KKyAgICBpZiAoYmVmb3JlQ2hpbGQgJiYgYmVmb3JlQ2hpbGQtPnBh
cmVudCgpICE9IHRoaXMpIHsKKyAgICAgICAgQVNTRVJUKGJlZm9yZUNoaWxkLT5wYXJlbnQoKSk7
CisgICAgICAgIEFTU0VSVChiZWZvcmVDaGlsZC0+cGFyZW50KCktPmlzQW5vbnltb3VzSW5saW5l
QmxvY2soKSB8fCBiZWZvcmVDaGlsZC0+cGFyZW50KCktPmlzQW5vbnltb3VzQmxvY2soKSk7Cisg
ICAgICAgIGlmIChiZWZvcmVDaGlsZC0+cGFyZW50KCktPmlzQW5vbnltb3VzSW5saW5lQmxvY2so
KSkgeworICAgICAgICAgICAgaWYgKCFuZXdDaGlsZC0+aXNJbmxpbmUoKSB8fCAobmV3Q2hpbGQt
PmlzSW5saW5lKCkgJiYgYmVmb3JlQ2hpbGQtPnBhcmVudCgpLT5maXJzdENoaWxkKCkgIT0gYmVm
b3JlQ2hpbGQpKQorICAgICAgICAgICAgICAgIGJlZm9yZUNoaWxkLT5wYXJlbnQoKS0+YWRkQ2hp
bGQobmV3Q2hpbGQsIGJlZm9yZUNoaWxkKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAg
ICAgICBhZGRDaGlsZChuZXdDaGlsZCwgYmVmb3JlQ2hpbGQtPnBhcmVudCgpKTsKKyAgICAgICAg
fSBlbHNlIGlmIChiZWZvcmVDaGlsZC0+cGFyZW50KCktPmlzQW5vbnltb3VzQmxvY2soKSkgewor
ICAgICAgICAgICAgQVNTRVJUKCFiZWZvcmVDaGlsZC0+cGFyZW50KCktPnBhcmVudCgpIHx8IGJl
Zm9yZUNoaWxkLT5wYXJlbnQoKS0+cGFyZW50KCktPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSk7
CisgICAgICAgICAgICBBU1NFUlQoYmVmb3JlQ2hpbGQtPmlzSW5saW5lKCkpOworICAgICAgICAg
ICAgaWYgKG5ld0NoaWxkLT5pc0lubGluZSgpIHx8ICghbmV3Q2hpbGQtPmlzSW5saW5lKCkgJiYg
YmVmb3JlQ2hpbGQtPnBhcmVudCgpLT5maXJzdENoaWxkKCkgIT0gYmVmb3JlQ2hpbGQpKQorICAg
ICAgICAgICAgICAgIGJlZm9yZUNoaWxkLT5wYXJlbnQoKS0+YWRkQ2hpbGQobmV3Q2hpbGQsIGJl
Zm9yZUNoaWxkKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBhZGRDaGlsZChu
ZXdDaGlsZCwgYmVmb3JlQ2hpbGQtPnBhcmVudCgpKTsKKyAgICAgICAgfQogICAgICAgICByZXR1
cm47CiAgICAgfQogCisgICAgaWYgKCFuZXdDaGlsZC0+aXNJbmxpbmUoKSkgeworICAgICAgICAv
LyBXZSBhcmUgcGxhY2luZyBhIGJsb2NrIGluc2lkZSBhbiBpbmxpbmUuIFdlIGhhdmUgdG8gcGxh
Y2UgdGhlIGJsb2NrIGluc2lkZSBhbiBhbm9ueW1vdXMgaW5saW5lLWJsb2NrLgorICAgICAgICAv
LyBUaGlzIGlubGluZS1ibG9jayBjYW4gaG91c2UgYSBzZXF1ZW5jZSBvZiBjb250aWd1b3VzIGJs
b2NrLWxldmVsIGNoaWxkcmVuLCBhbmQgdGhleSB3aWxsIGFsbCBzaXQgb24gdGhlCisgICAgICAg
IC8vIHNhbWUgbGluZSB0b2dldGhlci4gIFdlIHRyeSB0byByZXVzZSBvbmUgZmlyc3QgaWYgcG9z
c2libGUuCisgICAgICAgIGlmIChiZWZvcmVDaGlsZCkgeworICAgICAgICAgICAgaWYgKGJlZm9y
ZUNoaWxkLT5wcmV2aW91c1NpYmxpbmcoKSAmJiBiZWZvcmVDaGlsZC0+cHJldmlvdXNTaWJsaW5n
KCktPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkgeworICAgICAgICAgICAgICAgIGJlZm9yZUNo
aWxkLT5wcmV2aW91c1NpYmxpbmcoKS0+YWRkQ2hpbGQobmV3Q2hpbGQpOworICAgICAgICAgICAg
ICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg
IGlmIChsYXN0Q2hpbGQoKSAmJiBsYXN0Q2hpbGQoKS0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygp
KSB7CisgICAgICAgICAgICAgICAgbGFzdENoaWxkKCktPmFkZENoaWxkKG5ld0NoaWxkKTsKKyAg
ICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAKKyAgICAg
ICAgaWYgKCFuZXdDaGlsZC0+aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpKSB7CisgICAgICAgICAg
ICAvLyBUaGVyZSB3YXMgbm8gc3VpdGFibGUgZXhpc3RpbmcgYW5vbnltb3VzIGJveC4gIENyZWF0
ZSBhIG5ldyBvbmUuCisgICAgICAgICAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IG5ld1N0eWxlID0g
UmVuZGVyU3R5bGU6OmNyZWF0ZSgpOworICAgICAgICAgICAgbmV3U3R5bGUtPmluaGVyaXRGcm9t
KHN0eWxlKCkpOworICAgICAgICAgICAgbmV3U3R5bGUtPnNldERpc3BsYXkoSU5MSU5FX0JMT0NL
KTsKKyAgICAgICAgICAgIFJlbmRlckJsb2NrKiBuZXdCb3ggPSBuZXcgKHJlbmRlckFyZW5hKCkp
IFJlbmRlckJsb2NrKGRvY3VtZW50KCkpOworICAgICAgICAgICAgbmV3Qm94LT5zZXRTdHlsZShu
ZXdTdHlsZSk7CisgICAgICAgICAgICBSZW5kZXJCb3hNb2RlbE9iamVjdDo6YWRkQ2hpbGQobmV3
Qm94LCBiZWZvcmVDaGlsZCk7CisgICAgICAgICAgICBuZXdCb3gtPmFkZENoaWxkKG5ld0NoaWxk
KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKwogICAgIFJlbmRlckJv
eE1vZGVsT2JqZWN0OjphZGRDaGlsZChuZXdDaGlsZCwgYmVmb3JlQ2hpbGQpOwogCiAgICAgbmV3
Q2hpbGQtPnNldE5lZWRzTGF5b3V0QW5kUHJlZldpZHRoc1JlY2FsYygpOwpAQCAtMjIxLDIyNCAr
MTg2LDU5IEBAIFJlbmRlcklubGluZSogUmVuZGVySW5saW5lOjpjbG9uZUlubGluZSgKICAgICBy
ZXR1cm4gbzsKIH0KIAotdm9pZCBSZW5kZXJJbmxpbmU6OnNwbGl0SW5saW5lcyhSZW5kZXJCbG9j
ayogZnJvbUJsb2NrLCBSZW5kZXJCbG9jayogdG9CbG9jaywKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgUmVuZGVyQmxvY2sqIG1pZGRsZUJsb2NrLAotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkLCBSZW5kZXJCb3hNb2RlbE9i
amVjdCogb2xkQ29udCkKLXsKLSAgICAvLyBDcmVhdGUgYSBjbG9uZSBvZiB0aGlzIGlubGluZS4K
LSAgICBSZW5kZXJJbmxpbmUqIGNsb25lID0gY2xvbmVJbmxpbmUodGhpcyk7Ci0gICAgY2xvbmUt
PnNldENvbnRpbnVhdGlvbihvbGRDb250KTsKLQotICAgIC8vIE5vdyB0YWtlIGFsbCBvZiB0aGUg
Y2hpbGRyZW4gZnJvbSBiZWZvcmVDaGlsZCB0byB0aGUgZW5kIGFuZCByZW1vdmUKLSAgICAvLyB0
aGVtIGZyb20gfHRoaXN8IGFuZCBwbGFjZSB0aGVtIGluIHRoZSBjbG9uZS4KLSAgICBSZW5kZXJP
YmplY3QqIG8gPSBiZWZvcmVDaGlsZDsKLSAgICB3aGlsZSAobykgewotICAgICAgICBSZW5kZXJP
YmplY3QqIHRtcCA9IG87Ci0gICAgICAgIG8gPSB0bXAtPm5leHRTaWJsaW5nKCk7Ci0gICAgICAg
IGNsb25lLT5hZGRDaGlsZElnbm9yaW5nQ29udGludWF0aW9uKGNoaWxkcmVuKCktPnJlbW92ZUNo
aWxkTm9kZSh0aGlzLCB0bXApLCAwKTsKLSAgICAgICAgdG1wLT5zZXROZWVkc0xheW91dEFuZFBy
ZWZXaWR0aHNSZWNhbGMoKTsKLSAgICB9Ci0KLSAgICAvLyBIb29rIHxjbG9uZXwgdXAgYXMgdGhl
IGNvbnRpbnVhdGlvbiBvZiB0aGUgbWlkZGxlIGJsb2NrLgotICAgIG1pZGRsZUJsb2NrLT5zZXRJ
bmxpbmVDb250aW51YXRpb24oY2xvbmUpOwotCi0gICAgLy8gV2UgaGF2ZSBiZWVuIHJlcGFyZW50
ZWQgYW5kIGFyZSBub3cgdW5kZXIgdGhlIGZyb21CbG9jay4gIFdlIG5lZWQKLSAgICAvLyB0byB3
YWxrIHVwIG91ciBpbmxpbmUgcGFyZW50IGNoYWluIHVudGlsIHdlIGhpdCB0aGUgY29udGFpbmlu
ZyBibG9jay4KLSAgICAvLyBPbmNlIHdlIGhpdCB0aGUgY29udGFpbmluZyBibG9jayB3ZSdyZSBk
b25lLgotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBjdXJyID0gdG9SZW5kZXJCb3hNb2RlbE9i
amVjdChwYXJlbnQoKSk7Ci0gICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGN1cnJDaGlsZCA9IHRo
aXM7Ci0gICAgCi0gICAgLy8gRklYTUU6IEJlY2F1c2Ugc3BsaXR0aW5nIGlzIE8obl4yKSBhcyB0
YWdzIG5lc3QgcGF0aG9sb2dpY2FsbHksIHdlIGNhcCB0aGUgZGVwdGggYXQgd2hpY2ggd2UncmUg
d2lsbGluZyB0byBjbG9uZS4KLSAgICAvLyBUaGVyZSB3aWxsIGV2ZW50dWFsbHkgYmUgYSBiZXR0
ZXIgYXBwcm9hY2ggdG8gdGhpcyBwcm9ibGVtIHRoYXQgd2lsbCBsZXQgdXMgbmVzdCB0byBhIG11
Y2gKLSAgICAvLyBncmVhdGVyIGRlcHRoIChzZWUgYnVnemlsbGEgYnVnIDEzNDMwKSBidXQgZm9y
IG5vdyB3ZSBoYXZlIGEgbGltaXQuICBUaGlzICp3aWxsKiByZXN1bHQgaW4KLSAgICAvLyBpbmNv
cnJlY3QgcmVuZGVyaW5nLCBidXQgdGhlIGFsdGVybmF0aXZlIGlzIHRvIGhhbmcgZm9yZXZlci4K
LSAgICB1bnNpZ25lZCBzcGxpdERlcHRoID0gMTsKLSAgICBjb25zdCB1bnNpZ25lZCBjTWF4U3Bs
aXREZXB0aCA9IDIwMDsgCi0gICAgd2hpbGUgKGN1cnIgJiYgY3VyciAhPSBmcm9tQmxvY2spIHsK
LSAgICAgICAgQVNTRVJUKGN1cnItPmlzUmVuZGVySW5saW5lKCkpOwotICAgICAgICBpZiAoc3Bs
aXREZXB0aCA8IGNNYXhTcGxpdERlcHRoKSB7Ci0gICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcg
Y2xvbmUuCi0gICAgICAgICAgICBSZW5kZXJJbmxpbmUqIGNsb25lQ2hpbGQgPSBjbG9uZTsKLSAg
ICAgICAgICAgIGNsb25lID0gY2xvbmVJbmxpbmUodG9SZW5kZXJJbmxpbmUoY3VycikpOwotCi0g
ICAgICAgICAgICAvLyBJbnNlcnQgb3VyIGNoaWxkIGNsb25lIGFzIHRoZSBmaXJzdCBjaGlsZC4K
LSAgICAgICAgICAgIGNsb25lLT5hZGRDaGlsZElnbm9yaW5nQ29udGludWF0aW9uKGNsb25lQ2hp
bGQsIDApOwotCi0gICAgICAgICAgICAvLyBIb29rIHRoZSBjbG9uZSB1cCBhcyBhIGNvbnRpbnVh
dGlvbiBvZiB8Y3VycnwuCi0gICAgICAgICAgICBSZW5kZXJJbmxpbmUqIGlubGluZUN1cnIgPSB0
b1JlbmRlcklubGluZShjdXJyKTsKLSAgICAgICAgICAgIG9sZENvbnQgPSBpbmxpbmVDdXJyLT5j
b250aW51YXRpb24oKTsKLSAgICAgICAgICAgIGlubGluZUN1cnItPnNldENvbnRpbnVhdGlvbihj
bG9uZSk7Ci0gICAgICAgICAgICBjbG9uZS0+c2V0Q29udGludWF0aW9uKG9sZENvbnQpOwotCi0g
ICAgICAgICAgICAvLyBTb21lb25lIG1heSBoYXZlIGluZGlyZWN0bHkgY2F1c2VkIGEgPHE+IHRv
IHNwbGl0LiAgV2hlbiB0aGlzIGhhcHBlbnMsIHRoZSA6YWZ0ZXIgY29udGVudAotICAgICAgICAg
ICAgLy8gaGFzIHRvIG1vdmUgaW50byB0aGUgaW5saW5lIGNvbnRpbnVhdGlvbi4gIENhbGwgdXBk
YXRlQmVmb3JlQWZ0ZXJDb250ZW50IHRvIGVuc3VyZSB0aGF0IHRoZSBpbmxpbmUncyA6YWZ0ZXIK
LSAgICAgICAgICAgIC8vIGNvbnRlbnQgZ2V0cyBwcm9wZXJseSBkZXN0cm95ZWQuCi0gICAgICAg
ICAgICBpZiAoZG9jdW1lbnQoKS0+dXNlc0JlZm9yZUFmdGVyUnVsZXMoKSkKLSAgICAgICAgICAg
ICAgICBpbmxpbmVDdXJyLT5jaGlsZHJlbigpLT51cGRhdGVCZWZvcmVBZnRlckNvbnRlbnQodGhp
cywgQUZURVIpOwotCi0gICAgICAgICAgICAvLyBOb3cgd2UgbmVlZCB0byB0YWtlIGFsbCBvZiB0
aGUgY2hpbGRyZW4gc3RhcnRpbmcgZnJvbSB0aGUgZmlyc3QgY2hpbGQKLSAgICAgICAgICAgIC8v
ICphZnRlciogY3VyckNoaWxkIGFuZCBhcHBlbmQgdGhlbSBhbGwgdG8gdGhlIGNsb25lLgotICAg
ICAgICAgICAgbyA9IGN1cnJDaGlsZC0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgICAgIHdoaWxl
IChvKSB7Ci0gICAgICAgICAgICAgICAgUmVuZGVyT2JqZWN0KiB0bXAgPSBvOwotICAgICAgICAg
ICAgICAgIG8gPSB0bXAtPm5leHRTaWJsaW5nKCk7Ci0gICAgICAgICAgICAgICAgY2xvbmUtPmFk
ZENoaWxkSWdub3JpbmdDb250aW51YXRpb24oaW5saW5lQ3Vyci0+Y2hpbGRyZW4oKS0+cmVtb3Zl
Q2hpbGROb2RlKGN1cnIsIHRtcCksIDApOwotICAgICAgICAgICAgICAgIHRtcC0+c2V0TmVlZHNM
YXlvdXRBbmRQcmVmV2lkdGhzUmVjYWxjKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAg
ICAgICAgCi0gICAgICAgIC8vIEtlZXAgd2Fsa2luZyB1cCB0aGUgY2hhaW4uCi0gICAgICAgIGN1
cnJDaGlsZCA9IGN1cnI7Ci0gICAgICAgIGN1cnIgPSB0b1JlbmRlckJveE1vZGVsT2JqZWN0KGN1
cnItPnBhcmVudCgpKTsKLSAgICAgICAgc3BsaXREZXB0aCsrOwotICAgIH0KLQotICAgIC8vIE5v
dyB3ZSBhcmUgYXQgdGhlIGJsb2NrIGxldmVsLiBXZSBuZWVkIHRvIHB1dCB0aGUgY2xvbmUgaW50
byB0aGUgdG9CbG9jay4KLSAgICB0b0Jsb2NrLT5jaGlsZHJlbigpLT5hcHBlbmRDaGlsZE5vZGUo
dG9CbG9jaywgY2xvbmUpOwotCi0gICAgLy8gTm93IHRha2UgYWxsIHRoZSBjaGlsZHJlbiBhZnRl
ciBjdXJyQ2hpbGQgYW5kIHJlbW92ZSB0aGVtIGZyb20gdGhlIGZyb21CbG9jawotICAgIC8vIGFu
ZCBwdXQgdGhlbSBpbiB0aGUgdG9CbG9jay4KLSAgICBvID0gY3VyckNoaWxkLT5uZXh0U2libGlu
ZygpOwotICAgIHdoaWxlIChvKSB7Ci0gICAgICAgIFJlbmRlck9iamVjdCogdG1wID0gbzsKLSAg
ICAgICAgbyA9IHRtcC0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgdG9CbG9jay0+Y2hpbGRyZW4o
KS0+YXBwZW5kQ2hpbGROb2RlKHRvQmxvY2ssIGZyb21CbG9jay0+Y2hpbGRyZW4oKS0+cmVtb3Zl
Q2hpbGROb2RlKGZyb21CbG9jaywgdG1wKSk7Ci0gICAgfQotfQotCi12b2lkIFJlbmRlcklubGlu
ZTo6c3BsaXRGbG93KFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQsIFJlbmRlckJsb2NrKiBuZXdC
bG9ja0JveCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVuZGVyT2JqZWN0KiBuZXdD
aGlsZCwgUmVuZGVyQm94TW9kZWxPYmplY3QqIG9sZENvbnQpCi17Ci0gICAgUmVuZGVyQmxvY2sq
IHByZSA9IDA7Ci0gICAgUmVuZGVyQmxvY2sqIGJsb2NrID0gY29udGFpbmluZ0Jsb2NrKCk7Ci0g
ICAgCi0gICAgLy8gRGVsZXRlIG91ciBsaW5lIGJveGVzIGJlZm9yZSB3ZSBkbyB0aGUgaW5saW5l
IHNwbGl0IGludG8gY29udGludWF0aW9ucy4KLSAgICBibG9jay0+ZGVsZXRlTGluZUJveFRyZWUo
KTsKLSAgICAKLSAgICBib29sIG1hZGVOZXdCZWZvcmVCbG9jayA9IGZhbHNlOwotICAgIGlmIChi
bG9jay0+aXNBbm9ueW1vdXNCbG9jaygpICYmICghYmxvY2stPnBhcmVudCgpIHx8ICFibG9jay0+
cGFyZW50KCktPmNyZWF0ZXNBbm9ueW1vdXNXcmFwcGVyKCkpKSB7Ci0gICAgICAgIC8vIFdlIGNh
biByZXVzZSB0aGlzIGJsb2NrIGFuZCBtYWtlIGl0IHRoZSBwcmVCbG9jayBvZiB0aGUgbmV4dCBj
b250aW51YXRpb24uCi0gICAgICAgIHByZSA9IGJsb2NrOwotICAgICAgICBwcmUtPnJlbW92ZVBv
c2l0aW9uZWRPYmplY3RzKDApOwotICAgICAgICBibG9jayA9IGJsb2NrLT5jb250YWluaW5nQmxv
Y2soKTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBObyBhbm9ueW1vdXMgYmxvY2sgYXZhaWxh
YmxlIGZvciB1c2UuICBNYWtlIG9uZS4KLSAgICAgICAgcHJlID0gYmxvY2stPmNyZWF0ZUFub255
bW91c0Jsb2NrKCk7Ci0gICAgICAgIG1hZGVOZXdCZWZvcmVCbG9jayA9IHRydWU7Ci0gICAgfQot
Ci0gICAgUmVuZGVyQmxvY2sqIHBvc3QgPSBibG9jay0+Y3JlYXRlQW5vbnltb3VzQmxvY2soKTsK
LQotICAgIFJlbmRlck9iamVjdCogYm94Rmlyc3QgPSBtYWRlTmV3QmVmb3JlQmxvY2sgPyBibG9j
ay0+Zmlyc3RDaGlsZCgpIDogcHJlLT5uZXh0U2libGluZygpOwotICAgIGlmIChtYWRlTmV3QmVm
b3JlQmxvY2spCi0gICAgICAgIGJsb2NrLT5jaGlsZHJlbigpLT5pbnNlcnRDaGlsZE5vZGUoYmxv
Y2ssIHByZSwgYm94Rmlyc3QpOwotICAgIGJsb2NrLT5jaGlsZHJlbigpLT5pbnNlcnRDaGlsZE5v
ZGUoYmxvY2ssIG5ld0Jsb2NrQm94LCBib3hGaXJzdCk7Ci0gICAgYmxvY2stPmNoaWxkcmVuKCkt
Pmluc2VydENoaWxkTm9kZShibG9jaywgcG9zdCwgYm94Rmlyc3QpOwotICAgIGJsb2NrLT5zZXRD
aGlsZHJlbklubGluZShmYWxzZSk7Ci0gICAgCi0gICAgaWYgKG1hZGVOZXdCZWZvcmVCbG9jaykg
ewotICAgICAgICBSZW5kZXJPYmplY3QqIG8gPSBib3hGaXJzdDsKLSAgICAgICAgd2hpbGUgKG8p
IHsKLSAgICAgICAgICAgIFJlbmRlck9iamVjdCogbm8gPSBvOwotICAgICAgICAgICAgbyA9IG5v
LT5uZXh0U2libGluZygpOwotICAgICAgICAgICAgcHJlLT5jaGlsZHJlbigpLT5hcHBlbmRDaGls
ZE5vZGUocHJlLCBibG9jay0+Y2hpbGRyZW4oKS0+cmVtb3ZlQ2hpbGROb2RlKGJsb2NrLCBubykp
OwotICAgICAgICAgICAgbm8tPnNldE5lZWRzTGF5b3V0QW5kUHJlZldpZHRoc1JlY2FsYygpOwot
ICAgICAgICB9Ci0gICAgfQotCi0gICAgc3BsaXRJbmxpbmVzKHByZSwgcG9zdCwgbmV3QmxvY2tC
b3gsIGJlZm9yZUNoaWxkLCBvbGRDb250KTsKLQotICAgIC8vIFdlIGFscmVhZHkga25vdyB0aGUg
bmV3QmxvY2tCb3ggaXNuJ3QgZ29pbmcgdG8gY29udGFpbiBpbmxpbmUga2lkcywgc28gYXZvaWQg
d2FzdGluZwotICAgIC8vIHRpbWUgaW4gbWFrZUNoaWxkcmVuTm9uSW5saW5lIGJ5IGp1c3Qgc2V0
dGluZyB0aGlzIGV4cGxpY2l0bHkgdXAgZnJvbnQuCi0gICAgbmV3QmxvY2tCb3gtPnNldENoaWxk
cmVuSW5saW5lKGZhbHNlKTsKLQotICAgIC8vIFdlIGRlbGF5ZWQgYWRkaW5nIHRoZSBuZXdDaGls
ZCB1bnRpbCBub3cgc28gdGhhdCB0aGUgfG5ld0Jsb2NrQm94fCB3b3VsZCBiZSBmdWxseQotICAg
IC8vIGNvbm5lY3RlZCwgdGh1cyBhbGxvd2luZyBuZXdDaGlsZCBhY2Nlc3MgdG8gYSByZW5kZXJB
cmVuYSBzaG91bGQgaXQgbmVlZAotICAgIC8vIHRvIHdyYXAgaXRzZWxmIGluIGFkZGl0aW9uYWwg
Ym94ZXMgKGUuZy4sIHRhYmxlIGNvbnN0cnVjdGlvbikuCi0gICAgbmV3QmxvY2tCb3gtPmFkZENo
aWxkKG5ld0NoaWxkKTsKLQotICAgIC8vIEFsd2F5cyBqdXN0IGRvIGEgZnVsbCBsYXlvdXQgaW4g
b3JkZXIgdG8gZW5zdXJlIHRoYXQgbGluZSBib3hlcyAoZXNwZWNpYWxseSB3cmFwcGVycyBmb3Ig
aW1hZ2VzKQotICAgIC8vIGdldCBkZWxldGVkIHByb3Blcmx5LiAgQmVjYXVzZSBvYmplY3RzIG1v
dmVzIGZyb20gdGhlIHByZSBibG9jayBpbnRvIHRoZSBwb3N0IGJsb2NrLCB3ZSB3YW50IHRvCi0g
ICAgLy8gbWFrZSBuZXcgbGluZSBib3hlcyBpbnN0ZWFkIG9mIGxlYXZpbmcgdGhlIG9sZCBsaW5l
IGJveGVzIGFyb3VuZC4KLSAgICBwcmUtPnNldE5lZWRzTGF5b3V0QW5kUHJlZldpZHRoc1JlY2Fs
YygpOwotICAgIGJsb2NrLT5zZXROZWVkc0xheW91dEFuZFByZWZXaWR0aHNSZWNhbGMoKTsKLSAg
ICBwb3N0LT5zZXROZWVkc0xheW91dEFuZFByZWZXaWR0aHNSZWNhbGMoKTsKLX0KLQotdm9pZCBS
ZW5kZXJJbmxpbmU6OmFkZENoaWxkVG9Db250aW51YXRpb24oUmVuZGVyT2JqZWN0KiBuZXdDaGls
ZCwgUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCkKLXsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVj
dCogZmxvdyA9IGNvbnRpbnVhdGlvbkJlZm9yZShiZWZvcmVDaGlsZCk7Ci0gICAgQVNTRVJUKCFi
ZWZvcmVDaGlsZCB8fCBiZWZvcmVDaGlsZC0+cGFyZW50KCktPmlzUmVuZGVyQmxvY2soKSB8fCBi
ZWZvcmVDaGlsZC0+cGFyZW50KCktPmlzUmVuZGVySW5saW5lKCkpOwotICAgIFJlbmRlckJveE1v
ZGVsT2JqZWN0KiBiZWZvcmVDaGlsZFBhcmVudCA9IDA7Ci0gICAgaWYgKGJlZm9yZUNoaWxkKQot
ICAgICAgICBiZWZvcmVDaGlsZFBhcmVudCA9IHRvUmVuZGVyQm94TW9kZWxPYmplY3QoYmVmb3Jl
Q2hpbGQtPnBhcmVudCgpKTsKLSAgICBlbHNlIHsKLSAgICAgICAgUmVuZGVyQm94TW9kZWxPYmpl
Y3QqIGNvbnQgPSBuZXh0Q29udGludWF0aW9uKGZsb3cpOwotICAgICAgICBpZiAoY29udCkKLSAg
ICAgICAgICAgIGJlZm9yZUNoaWxkUGFyZW50ID0gY29udDsKLSAgICAgICAgZWxzZQotICAgICAg
ICAgICAgYmVmb3JlQ2hpbGRQYXJlbnQgPSBmbG93OwotICAgIH0KLQotICAgIGlmIChuZXdDaGls
ZC0+aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpKQotICAgICAgICByZXR1cm4gYmVmb3JlQ2hpbGRQ
YXJlbnQtPmFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24obmV3Q2hpbGQsIGJlZm9yZUNoaWxk
KTsKLQotICAgIC8vIEEgY29udGludWF0aW9uIGFsd2F5cyBjb25zaXN0cyBvZiB0d28gcG90ZW50
aWFsIGNhbmRpZGF0ZXM6IGFuIGlubGluZSBvciBhbiBhbm9ueW1vdXMKLSAgICAvLyBibG9jayBi
b3ggaG9sZGluZyBibG9jayBjaGlsZHJlbi4KLSAgICBib29sIGNoaWxkSW5saW5lID0gbmV3Q2hp
bGQtPmlzSW5saW5lKCk7Ci0gICAgYm9vbCBiY3BJbmxpbmUgPSBiZWZvcmVDaGlsZFBhcmVudC0+
aXNJbmxpbmUoKTsKLSAgICBib29sIGZsb3dJbmxpbmUgPSBmbG93LT5pc0lubGluZSgpOwotCi0g
ICAgaWYgKGZsb3cgPT0gYmVmb3JlQ2hpbGRQYXJlbnQpCi0gICAgICAgIHJldHVybiBmbG93LT5h
ZGRDaGlsZElnbm9yaW5nQ29udGludWF0aW9uKG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7Ci0gICAg
ZWxzZSB7Ci0gICAgICAgIC8vIFRoZSBnb2FsIGhlcmUgaXMgdG8gbWF0Y2ggdXAgaWYgd2UgY2Fu
LCBzbyB0aGF0IHdlIGNhbiBjb2FsZXNjZSBhbmQgY3JlYXRlIHRoZQotICAgICAgICAvLyBtaW5p
bWFsICMgb2YgY29udGludWF0aW9ucyBuZWVkZWQgZm9yIHRoZSBpbmxpbmUuCi0gICAgICAgIGlm
IChjaGlsZElubGluZSA9PSBiY3BJbmxpbmUpCi0gICAgICAgICAgICByZXR1cm4gYmVmb3JlQ2hp
bGRQYXJlbnQtPmFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24obmV3Q2hpbGQsIGJlZm9yZUNo
aWxkKTsKLSAgICAgICAgZWxzZSBpZiAoZmxvd0lubGluZSA9PSBjaGlsZElubGluZSkKLSAgICAg
ICAgICAgIHJldHVybiBmbG93LT5hZGRDaGlsZElnbm9yaW5nQ29udGludWF0aW9uKG5ld0NoaWxk
LCAwKTsgLy8gSnVzdCB0cmVhdCBsaWtlIGFuIGFwcGVuZC4KLSAgICAgICAgZWxzZQotICAgICAg
ICAgICAgcmV0dXJuIGJlZm9yZUNoaWxkUGFyZW50LT5hZGRDaGlsZElnbm9yaW5nQ29udGludWF0
aW9uKG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7Ci0gICAgfQotfQotCiB2b2lkIFJlbmRlcklubGlu
ZTo6cGFpbnQoUGFpbnRJbmZvJiBwYWludEluZm8sIGludCB0eCwgaW50IHR5KQogewogICAgIG1f
bGluZUJveGVzLnBhaW50KHRoaXMsIHBhaW50SW5mbywgdHgsIHR5KTsKIH0KKyAKK3ZvaWQgUmVu
ZGVySW5saW5lOjpjdWxsZWRMaW5lQm94UmVjdHMoVmVjdG9yPEludFJlY3Q+JiByZWN0cywgYm9v
bCBpbmNsdWRlT3ZlcmZsb3cpIGNvbnN0Cit7CisgICAgZm9yIChSZW5kZXJPYmplY3QqIGN1cnIg
PSBmaXJzdENoaWxkKCk7IGN1cnI7IGN1cnIgPSBjdXJyLT5uZXh0U2libGluZygpKSB7CisgICAg
ICAgIGlmIChjdXJyLT5pc1JlbmRlcklubGluZSgpKQorICAgICAgICAgICAgdG9SZW5kZXJJbmxp
bmUoY3VyciktPmN1bGxlZExpbmVCb3hSZWN0cyhyZWN0cywgaW5jbHVkZU92ZXJmbG93KTsKKyAg
ICAgICAgZWxzZSBpZiAoY3Vyci0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKQorICAgICAgICAg
ICAgcmVjdHMuYXBwZW5kKGluY2x1ZGVPdmVyZmxvdyA/IHRvUmVuZGVyQmxvY2soY3VyciktPnZp
c2libGVPdmVyZmxvd1JlY3QoKSA6IHRvUmVuZGVyQmxvY2soY3VyciktPmZyYW1lUmVjdCgpKTsK
KyAgICB9Cit9CiAKIHZvaWQgUmVuZGVySW5saW5lOjphYnNvbHV0ZVJlY3RzKFZlY3RvcjxJbnRS
ZWN0PiYgcmVjdHMsIGludCB0eCwgaW50IHR5KQogewotICAgIGlmIChJbmxpbmVSdW5Cb3gqIGN1
cnIgPSBmaXJzdExpbmVCb3goKSkgewotICAgICAgICBmb3IgKDsgY3VycjsgY3VyciA9IGN1cnIt
Pm5leHRMaW5lQm94KCkpCi0gICAgICAgICAgICByZWN0cy5hcHBlbmQoSW50UmVjdCh0eCArIGN1
cnItPngoKSwgdHkgKyBjdXJyLT55KCksIGN1cnItPndpZHRoKCksIGN1cnItPmhlaWdodCgpKSk7
Ci0gICAgfSBlbHNlCisgICAgaWYgKCFmaXJzdExpbmVCb3goKSAmJiAhaGFzQ3VsbGVkTGluZUJv
eGVzKCkpIHsKICAgICAgICAgcmVjdHMuYXBwZW5kKEludFJlY3QodHgsIHR5LCAwLCAwKSk7Ci0K
LSAgICBpZiAoY29udGludWF0aW9uKCkpIHsKLSAgICAgICAgaWYgKGNvbnRpbnVhdGlvbigpLT5p
c0JveCgpKSB7Ci0gICAgICAgICAgICBSZW5kZXJCb3gqIGJveCA9IHRvUmVuZGVyQm94KGNvbnRp
bnVhdGlvbigpKTsKLSAgICAgICAgICAgIGNvbnRpbnVhdGlvbigpLT5hYnNvbHV0ZVJlY3RzKHJl
Y3RzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4IC0gY29u
dGFpbmluZ0Jsb2NrKCktPngoKSArIGJveC0+eCgpLAotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgdHkgLSBjb250YWluaW5nQmxvY2soKS0+eSgpICsgYm94LT55KCkp
OwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIGNvbnRpbnVhdGlvbigpLT5hYnNvbHV0ZVJl
Y3RzKHJlY3RzLCB0eCAtIGNvbnRhaW5pbmdCbG9jaygpLT54KCksIHR5IC0gY29udGFpbmluZ0Js
b2NrKCktPnkoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAgZm9yIChJbmxp
bmVSdW5Cb3gqIGN1cnIgPSBmaXJzdExpbmVCb3goKTsgY3VycjsgY3VyciA9IGN1cnItPm5leHRM
aW5lQm94KCkpCisgICAgICAgIHJlY3RzLmFwcGVuZChJbnRSZWN0KHR4ICsgY3Vyci0+eCgpLCB0
eSArIGN1cnItPnkoKSwgY3Vyci0+d2lkdGgoKSwgY3Vyci0+aGVpZ2h0KCkpKTsKKyAgICAKKyAg
ICBpZiAoaGFzQ3VsbGVkTGluZUJveGVzKCkpIHsKKyAgICAgICAgVmVjdG9yPEludFJlY3Q+IGN1
bGxlZFJlY3RzOworICAgICAgICBjdWxsZWRMaW5lQm94UmVjdHMoY3VsbGVkUmVjdHMpOworICAg
ICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgY3VsbGVkUmVjdHMuc2l6ZSgpOyArK2kpIHsK
KyAgICAgICAgICAgIGN1bGxlZFJlY3RzW2ldLm1vdmUodHgsIHR5KTsKKyAgICAgICAgICAgIHJl
Y3RzLmFwcGVuZChjdWxsZWRSZWN0c1tpXSk7CisgICAgICAgIH0KICAgICB9CiB9CiAKIHZvaWQg
UmVuZGVySW5saW5lOjphYnNvbHV0ZVF1YWRzKFZlY3RvcjxGbG9hdFF1YWQ+JiBxdWFkcykKIHsK
LSAgICBpZiAoSW5saW5lUnVuQm94KiBjdXJyID0gZmlyc3RMaW5lQm94KCkpIHsKLSAgICAgICAg
Zm9yICg7IGN1cnI7IGN1cnIgPSBjdXJyLT5uZXh0TGluZUJveCgpKSB7Ci0gICAgICAgICAgICBG
bG9hdFJlY3QgbG9jYWxSZWN0KGN1cnItPngoKSwgY3Vyci0+eSgpLCBjdXJyLT53aWR0aCgpLCBj
dXJyLT5oZWlnaHQoKSk7Ci0gICAgICAgICAgICBxdWFkcy5hcHBlbmQobG9jYWxUb0Fic29sdXRl
UXVhZChsb2NhbFJlY3QpKTsKLSAgICAgICAgfQotICAgIH0gZWxzZQorICAgIGlmICghZmlyc3RM
aW5lQm94KCkgJiYgIWhhc0N1bGxlZExpbmVCb3hlcygpKSB7CiAgICAgICAgIHF1YWRzLmFwcGVu
ZChsb2NhbFRvQWJzb2x1dGVRdWFkKEZsb2F0UmVjdCgpKSk7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CiAKLSAgICBpZiAoY29udGludWF0aW9uKCkpCi0gICAgICAgIGNvbnRpbnVhdGlvbigpLT5h
YnNvbHV0ZVF1YWRzKHF1YWRzKTsKKyAgICBmb3IgKElubGluZVJ1bkJveCogY3VyciA9IGZpcnN0
TGluZUJveCgpOyBjdXJyOyBjdXJyID0gY3Vyci0+bmV4dExpbmVCb3goKSkgeworICAgICAgICBG
bG9hdFJlY3QgbG9jYWxSZWN0KGN1cnItPngoKSwgY3Vyci0+eSgpLCBjdXJyLT53aWR0aCgpLCBj
dXJyLT5oZWlnaHQoKSk7CisgICAgICAgIHF1YWRzLmFwcGVuZChsb2NhbFRvQWJzb2x1dGVRdWFk
KGxvY2FsUmVjdCkpOworICAgIH0KKyAgICAKKyAgICBpZiAoaGFzQ3VsbGVkTGluZUJveGVzKCkp
IHsKKyAgICAgICAgVmVjdG9yPEludFJlY3Q+IGN1bGxlZFJlY3RzOworICAgICAgICBjdWxsZWRM
aW5lQm94UmVjdHMoY3VsbGVkUmVjdHMpOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp
IDwgY3VsbGVkUmVjdHMuc2l6ZSgpOyArK2kpCisgICAgICAgICAgICBxdWFkcy5hcHBlbmQobG9j
YWxUb0Fic29sdXRlUXVhZChGbG9hdFJlY3QoY3VsbGVkUmVjdHNbaV0pKSk7CisgICAgfQogfQog
CiBpbnQgUmVuZGVySW5saW5lOjpvZmZzZXRMZWZ0KCkgY29uc3QKQEAgLTUwNyw0MyArMzA3LDM3
IEBAIFZpc2libGVQb3NpdGlvbiBSZW5kZXJJbmxpbmU6OnBvc2l0aW9uRm8KICAgICAgICAgLy8g
c2hvdWxkIHRyeSB0byBmaW5kIGEgcmVzdWx0IGJ5IGFza2luZyBvdXIgY29udGFpbmluZyBibG9j
ay4KICAgICAgICAgcmV0dXJuIGNiLT5wb3NpdGlvbkZvclBvaW50KHBvaW50KTsKICAgICB9Cisg
ICAgcmV0dXJuIFJlbmRlckJveE1vZGVsT2JqZWN0Ojpwb3NpdGlvbkZvclBvaW50KHBvaW50KTsK
K30KIAotICAgIC8vIFRyYW5zbGF0ZSB0aGUgY29vcmRzIGZyb20gdGhlIHByZS1hbm9ueW1vdXMg
YmxvY2sgdG8gdGhlIHBvc3QtYW5vbnltb3VzIGJsb2NrLgotICAgIGludCBwYXJlbnRCbG9ja1gg
PSBjYi0+eCgpICsgcG9pbnQueCgpOwotICAgIGludCBwYXJlbnRCbG9ja1kgPSBjYi0+eSgpICsg
cG9pbnQueSgpOwotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBjID0gY29udGludWF0aW9uKCk7
Ci0gICAgd2hpbGUgKGMpIHsKLSAgICAgICAgUmVuZGVyQm94KiBjb250QmxvY2sgPSBjLT5pc0lu
bGluZSgpID8gYy0+Y29udGFpbmluZ0Jsb2NrKCkgOiB0b1JlbmRlckJsb2NrKGMpOwotICAgICAg
ICBpZiAoYy0+aXNJbmxpbmUoKSB8fCBjLT5maXJzdENoaWxkKCkpCi0gICAgICAgICAgICByZXR1
cm4gYy0+cG9zaXRpb25Gb3JDb29yZGluYXRlcyhwYXJlbnRCbG9ja1ggLSBjb250QmxvY2stPngo
KSwgcGFyZW50QmxvY2tZIC0gY29udEJsb2NrLT55KCkpOwotICAgICAgICBjID0gdG9SZW5kZXJC
bG9jayhjKS0+aW5saW5lQ29udGludWF0aW9uKCk7CitzdGF0aWMgaW5saW5lIEludFJlY3QgdW5p
dGVFdmVuSWZFbXB0eShjb25zdCBJbnRSZWN0JiBmaXJzdCwgY29uc3QgSW50UmVjdCYgc2Vjb25k
LCBib29sJiBmaXJzdFZhbGlkKQoreworICAgIGlmICghZmlyc3RWYWxpZCkgeworICAgICAgICBm
aXJzdFZhbGlkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHNlY29uZDsKICAgICB9CiAgICAgCi0g
ICAgcmV0dXJuIFJlbmRlckJveE1vZGVsT2JqZWN0Ojpwb3NpdGlvbkZvclBvaW50KHBvaW50KTsK
KyAgICBpbnQgbCA9IG1pbihmaXJzdC54KCksIHNlY29uZC54KCkpOworICAgIGludCB0ID0gbWlu
KGZpcnN0LnkoKSwgc2Vjb25kLnkoKSk7CisgICAgaW50IHIgPSBtYXgoZmlyc3QucmlnaHQoKSwg
c2Vjb25kLnJpZ2h0KCkpOworICAgIGludCBiID0gbWF4KGZpcnN0LmJvdHRvbSgpLCBzZWNvbmQu
Ym90dG9tKCkpOworCisgICAgcmV0dXJuIEludFJlY3QobCwgdCwgciAtIGwsIGIgLSB0KTsKIH0K
IAogSW50UmVjdCBSZW5kZXJJbmxpbmU6OmxpbmVzQm91bmRpbmdCb3goKSBjb25zdAogewogICAg
IEludFJlY3QgcmVzdWx0OworICAgIGJvb2wgc2V0UmVzdWx0ID0gZmFsc2U7CiAgICAgCi0gICAg
Ly8gU2VlIDxyZGFyOi8vcHJvYmxlbS81Mjg5NzIxPiwgZm9yIGFuIHVua25vd24gcmVhc29uIHRo
ZSBsaW5rZWQgbGlzdCBoZXJlIGlzIHNvbWV0aW1lcyBpbmNvbnNpc3RlbnQsIGZpcnN0IGlzIG5v
bi16ZXJvIGFuZCBsYXN0IGlzIHplcm8uICBXZSBoYXZlIGJlZW4KLSAgICAvLyB1bmFibGUgdG8g
cmVwcm9kdWNlIHRoaXMgYXQgYWxsIChhbmQgY29uc2VxdWVudGx5IHVuYWJsZSB0byBmaWd1cmUg
b3Qgd2h5IHRoaXMgaXMgaGFwcGVuaW5nKS4gIFRoZSBhc3NlcnQgd2lsbCBob3BlZnVsbHkgY2F0
Y2ggdGhlIHByb2JsZW0gaW4gZGVidWcKLSAgICAvLyBidWlsZHMgYW5kIGhlbHAgdXMgc29tZWRh
eSBmaWd1cmUgb3V0IHdoeS4gIFdlIGFsc28gcHV0IGluIGEgcmVkdW5kYW50IGNoZWNrIG9mIGxh
c3RMaW5lQm94KCkgdG8gYXZvaWQgdGhlIGNyYXNoIGZvciBub3cuCi0gICAgQVNTRVJUKCFmaXJz
dExpbmVCb3goKSA9PSAhbGFzdExpbmVCb3goKSk7ICAvLyBFaXRoZXIgYm90aCBhcmUgbnVsbCBv
ciBib3RoIGV4aXN0LgotICAgIGlmIChmaXJzdExpbmVCb3goKSAmJiBsYXN0TGluZUJveCgpKSB7
Ci0gICAgICAgIC8vIFJldHVybiB0aGUgd2lkdGggb2YgdGhlIG1pbmltYWwgbGVmdCBzaWRlIGFu
ZCB0aGUgbWF4aW1hbCByaWdodCBzaWRlLgotICAgICAgICBpbnQgbGVmdFNpZGUgPSAwOwotICAg
ICAgICBpbnQgcmlnaHRTaWRlID0gMDsKLSAgICAgICAgZm9yIChJbmxpbmVSdW5Cb3gqIGN1cnIg
PSBmaXJzdExpbmVCb3goKTsgY3VycjsgY3VyciA9IGN1cnItPm5leHRMaW5lQm94KCkpIHsKLSAg
ICAgICAgICAgIGlmIChjdXJyID09IGZpcnN0TGluZUJveCgpIHx8IGN1cnItPngoKSA8IGxlZnRT
aWRlKQotICAgICAgICAgICAgICAgIGxlZnRTaWRlID0gY3Vyci0+eCgpOwotICAgICAgICAgICAg
aWYgKGN1cnIgPT0gZmlyc3RMaW5lQm94KCkgfHwgY3Vyci0+eCgpICsgY3Vyci0+d2lkdGgoKSA+
IHJpZ2h0U2lkZSkKLSAgICAgICAgICAgICAgICByaWdodFNpZGUgPSBjdXJyLT54KCkgKyBjdXJy
LT53aWR0aCgpOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5zZXRXaWR0aChyaWdodFNpZGUg
LSBsZWZ0U2lkZSk7Ci0gICAgICAgIHJlc3VsdC5zZXRYKGxlZnRTaWRlKTsKLSAgICAgICAgcmVz
dWx0LnNldEhlaWdodChsYXN0TGluZUJveCgpLT55KCkgKyBsYXN0TGluZUJveCgpLT5oZWlnaHQo
KSAtIGZpcnN0TGluZUJveCgpLT55KCkpOwotICAgICAgICByZXN1bHQuc2V0WShmaXJzdExpbmVC
b3goKS0+eSgpKTsKKyAgICBmb3IgKElubGluZUZsb3dCb3gqIGN1cnIgPSBmaXJzdExpbmVCb3go
KTsgY3VycjsgY3VyciA9IGN1cnItPm5leHRGbG93Qm94KCkpCisgICAgICAgIHJlc3VsdCA9IHVu
aXRlRXZlbklmRW1wdHkocmVzdWx0LCBjdXJyLT5mcmFtZVJlY3QoKSwgc2V0UmVzdWx0KTsKKyAg
ICAgICAgCisgICAgaWYgKGhhc0N1bGxlZExpbmVCb3hlcygpKSB7CisgICAgICAgIFZlY3RvcjxJ
bnRSZWN0PiBjdWxsZWRSZWN0czsKKyAgICAgICAgY3VsbGVkTGluZUJveFJlY3RzKGN1bGxlZFJl
Y3RzKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGN1bGxlZFJlY3RzLnNpemUo
KTsgKytpKQorICAgICAgICAgICAgcmVzdWx0ID0gdW5pdGVFdmVuSWZFbXB0eShyZXN1bHQsIGN1
bGxlZFJlY3RzW2ldLCBzZXRSZXN1bHQpOwogICAgIH0KIAogICAgIHJldHVybiByZXN1bHQ7CkBA
IC01NTEsMTkgKzM0NSwyMCBAQCBJbnRSZWN0IFJlbmRlcklubGluZTo6bGluZXNCb3VuZGluZ0Jv
eCgpCiAKIEludFJlY3QgUmVuZGVySW5saW5lOjpsaW5lc1Zpc2libGVPdmVyZmxvd0JvdW5kaW5n
Qm94KCkgY29uc3QKIHsKLSAgICBpZiAoIWZpcnN0TGluZUJveCgpIHx8ICFsYXN0TGluZUJveCgp
KQotICAgICAgICByZXR1cm4gSW50UmVjdCgpOwotCi0gICAgLy8gUmV0dXJuIHRoZSB3aWR0aCBv
ZiB0aGUgbWluaW1hbCBsZWZ0IHNpZGUgYW5kIHRoZSBtYXhpbWFsIHJpZ2h0IHNpZGUuCi0gICAg
aW50IGxlZnRTaWRlID0gbnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCk7Ci0gICAgaW50IHJpZ2h0
U2lkZSA9IG51bWVyaWNfbGltaXRzPGludD46Om1pbigpOwotICAgIGZvciAoSW5saW5lRmxvd0Jv
eCogY3VyciA9IGZpcnN0TGluZUJveCgpOyBjdXJyOyBjdXJyID0gY3Vyci0+bmV4dEZsb3dCb3go
KSkgewotICAgICAgICBsZWZ0U2lkZSA9IG1pbihsZWZ0U2lkZSwgY3Vyci0+bGVmdFZpc2libGVP
dmVyZmxvdygpKTsKLSAgICAgICAgcmlnaHRTaWRlID0gbWF4KHJpZ2h0U2lkZSwgY3Vyci0+cmln
aHRWaXNpYmxlT3ZlcmZsb3coKSk7CisgICAgSW50UmVjdCByZXN1bHQ7CisgICAgYm9vbCBzZXRS
ZXN1bHQgPSBmYWxzZTsKKyAgICAKKyAgICBmb3IgKElubGluZUZsb3dCb3gqIGN1cnIgPSBmaXJz
dExpbmVCb3goKTsgY3VycjsgY3VyciA9IGN1cnItPm5leHRGbG93Qm94KCkpCisgICAgICAgIHJl
c3VsdCA9IHVuaXRlRXZlbklmRW1wdHkocmVzdWx0LCBjdXJyLT52aXNpYmxlT3ZlcmZsb3dSZWN0
KCksIHNldFJlc3VsdCk7CisgICAgICAgIAorICAgIGlmIChoYXNDdWxsZWRMaW5lQm94ZXMoKSkg
eworICAgICAgICBWZWN0b3I8SW50UmVjdD4gY3VsbGVkUmVjdHM7CisgICAgICAgIGN1bGxlZExp
bmVCb3hSZWN0cyhjdWxsZWRSZWN0cyk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBjdWxsZWRSZWN0cy5zaXplKCk7ICsraSkKKyAgICAgICAgICAgIHJlc3VsdCA9IHVuaXRlRXZl
bklmRW1wdHkocmVzdWx0LCBjdWxsZWRSZWN0c1tpXSwgc2V0UmVzdWx0KTsKICAgICB9CiAKLSAg
ICByZXR1cm4gSW50UmVjdChsZWZ0U2lkZSwgZmlyc3RMaW5lQm94KCktPnRvcFZpc2libGVPdmVy
ZmxvdygpLCByaWdodFNpZGUgLSBsZWZ0U2lkZSwKLSAgICAgICAgbGFzdExpbmVCb3goKS0+Ym90
dG9tVmlzaWJsZU92ZXJmbG93KCkgLSBmaXJzdExpbmVCb3goKS0+dG9wVmlzaWJsZU92ZXJmbG93
KCkpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIEludFJlY3QgUmVuZGVySW5saW5lOjpjbGlw
cGVkT3ZlcmZsb3dSZWN0Rm9yUmVwYWludChSZW5kZXJCb3hNb2RlbE9iamVjdCogcmVwYWludENv
bnRhaW5lcikKQEAgLTU3MSw3ICszNjYsNyBAQCBJbnRSZWN0IFJlbmRlcklubGluZTo6Y2xpcHBl
ZE92ZXJmbG93UmVjCiAgICAgLy8gT25seSBydW4taW5zIGFyZSBhbGxvd2VkIGluIGhlcmUgZHVy
aW5nIGxheW91dC4KICAgICBBU1NFUlQoIXZpZXcoKSB8fCAhdmlldygpLT5sYXlvdXRTdGF0ZUVu
YWJsZWQoKSB8fCBpc1J1bkluKCkpOwogCi0gICAgaWYgKCFmaXJzdExpbmVCb3goKSAmJiAhY29u
dGludWF0aW9uKCkpCisgICAgaWYgKCFmaXJzdExpbmVCb3goKSkKICAgICAgICAgcmV0dXJuIElu
dFJlY3QoKTsKIAogICAgIC8vIEZpbmQgb3VyIGxlZnRtb3N0IHBvc2l0aW9uLgpAQCAtNjE5LDEx
ICs0MTQsNiBAQCBJbnRSZWN0IFJlbmRlcklubGluZTo6Y2xpcHBlZE92ZXJmbG93UmVjCiAgICAg
ICAgICAgICAgICAgci51bml0ZShjaGlsZFJlY3QpOwogICAgICAgICAgICAgfQogICAgICAgICB9
Ci0KLSAgICAgICAgaWYgKGNvbnRpbnVhdGlvbigpICYmICFjb250aW51YXRpb24oKS0+aXNJbmxp
bmUoKSkgewotICAgICAgICAgICAgSW50UmVjdCBjb250UmVjdCA9IGNvbnRpbnVhdGlvbigpLT5y
ZWN0V2l0aE91dGxpbmVGb3JSZXBhaW50KHJlcGFpbnRDb250YWluZXIsIG93KTsKLSAgICAgICAg
ICAgIHIudW5pdGUoY29udFJlY3QpOwotICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIHI7
CkBAIC03OTYsNDkgKzU4Niw2IEBAIHZvaWQgUmVuZGVySW5saW5lOjptYXBBYnNvbHV0ZVRvTG9j
YWxQb2kKICAgICAgICAgdHJhbnNmb3JtU3RhdGUubW92ZSgtY29udGFpbmVyT2Zmc2V0LndpZHRo
KCksIC1jb250YWluZXJPZmZzZXQuaGVpZ2h0KCksIHByZXNlcnZlM0QgPyBUcmFuc2Zvcm1TdGF0
ZTo6QWNjdW11bGF0ZVRyYW5zZm9ybSA6IFRyYW5zZm9ybVN0YXRlOjpGbGF0dGVuVHJhbnNmb3Jt
KTsKIH0KIAotdm9pZCBSZW5kZXJJbmxpbmU6OnVwZGF0ZURyYWdTdGF0ZShib29sIGRyYWdPbikK
LXsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdDo6dXBkYXRlRHJhZ1N0YXRlKGRyYWdPbik7Ci0g
ICAgaWYgKGNvbnRpbnVhdGlvbigpKQotICAgICAgICBjb250aW51YXRpb24oKS0+dXBkYXRlRHJh
Z1N0YXRlKGRyYWdPbik7Ci19Ci0KLXZvaWQgUmVuZGVySW5saW5lOjpjaGlsZEJlY2FtZU5vbklu
bGluZShSZW5kZXJPYmplY3QqIGNoaWxkKQotewotICAgIC8vIFdlIGhhdmUgdG8gc3BsaXQgdGhl
IHBhcmVudCBmbG93LgotICAgIFJlbmRlckJsb2NrKiBuZXdCb3ggPSBjb250YWluaW5nQmxvY2so
KS0+Y3JlYXRlQW5vbnltb3VzQmxvY2soKTsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogb2xk
Q29udGludWF0aW9uID0gY29udGludWF0aW9uKCk7Ci0gICAgc2V0Q29udGludWF0aW9uKG5ld0Jv
eCk7Ci0gICAgUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygp
OwotICAgIGNoaWxkcmVuKCktPnJlbW92ZUNoaWxkTm9kZSh0aGlzLCBjaGlsZCk7Ci0gICAgc3Bs
aXRGbG93KGJlZm9yZUNoaWxkLCBuZXdCb3gsIGNoaWxkLCBvbGRDb250aW51YXRpb24pOwotfQot
Ci12b2lkIFJlbmRlcklubGluZTo6dXBkYXRlSGl0VGVzdFJlc3VsdChIaXRUZXN0UmVzdWx0JiBy
ZXN1bHQsIGNvbnN0IEludFBvaW50JiBwb2ludCkKLXsKLSAgICBpZiAocmVzdWx0LmlubmVyTm9k
ZSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBOb2RlKiBuID0gbm9kZSgpOwotICAgIEludFBv
aW50IGxvY2FsUG9pbnQocG9pbnQpOwotICAgIGlmIChuKSB7Ci0gICAgICAgIGlmIChpc0lubGlu
ZUNvbnRpbnVhdGlvbigpKSB7Ci0gICAgICAgICAgICAvLyBXZSdyZSBpbiB0aGUgY29udGludWF0
aW9uIG9mIGEgc3BsaXQgaW5saW5lLiAgQWRqdXN0IG91ciBsb2NhbCBwb2ludCB0byBiZSBpbiB0
aGUgY29vcmRpbmF0ZSBzcGFjZQotICAgICAgICAgICAgLy8gb2YgdGhlIHByaW5jaXBhbCByZW5k
ZXJlcidzIGNvbnRhaW5pbmcgYmxvY2suICBUaGlzIHdpbGwgZW5kIHVwIGJlaW5nIHRoZSBpbm5l
ck5vblNoYXJlZE5vZGUuCi0gICAgICAgICAgICBSZW5kZXJCbG9jayogZmlyc3RCbG9jayA9IG4t
PnJlbmRlcmVyKCktPmNvbnRhaW5pbmdCbG9jaygpOwotICAgICAgICAgICAgCi0gICAgICAgICAg
ICAvLyBHZXQgb3VyIGNvbnRhaW5pbmcgYmxvY2suCi0gICAgICAgICAgICBSZW5kZXJCb3gqIGJs
b2NrID0gY29udGFpbmluZ0Jsb2NrKCk7Ci0gICAgICAgICAgICBsb2NhbFBvaW50Lm1vdmUoYmxv
Y2stPngoKSAtIGZpcnN0QmxvY2stPngoKSwgYmxvY2stPnkoKSAtIGZpcnN0QmxvY2stPnkoKSk7
Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQuc2V0SW5uZXJOb2RlKG4pOwotICAgICAgICBp
ZiAoIXJlc3VsdC5pbm5lck5vblNoYXJlZE5vZGUoKSkKLSAgICAgICAgICAgIHJlc3VsdC5zZXRJ
bm5lck5vblNoYXJlZE5vZGUobik7Ci0gICAgICAgIHJlc3VsdC5zZXRMb2NhbFBvaW50KGxvY2Fs
UG9pbnQpOwotICAgIH0KLX0KLQogdm9pZCBSZW5kZXJJbmxpbmU6OmRpcnR5TGluZUJveGVzKGJv
b2wgZnVsbExheW91dCkKIHsKICAgICBpZiAoZnVsbExheW91dCkKQEAgLTg1Miw5ICs1OTksOSBA
QCBJbmxpbmVGbG93Qm94KiBSZW5kZXJJbmxpbmU6OmNyZWF0ZUlubGluCiAgICAgcmV0dXJuIG5l
dyAocmVuZGVyQXJlbmEoKSkgSW5saW5lRmxvd0JveCh0aGlzKTsKIH0KIAotSW5saW5lRmxvd0Jv
eCogUmVuZGVySW5saW5lOjpjcmVhdGVBbmRBcHBlbmRJbmxpbmVGbG93Qm94KCkKK0lubGluZUZs
b3dCb3gqIFJlbmRlcklubGluZTo6Y3JlYXRlQW5kQXBwZW5kSW5saW5lRmxvd0JveChSZW5kZXJC
bG9jayogYW5vbnltb3VzSW5saW5lQmxvY2spCiB7Ci0gICAgSW5saW5lRmxvd0JveCogZmxvd0Jv
eCA9IGNyZWF0ZUlubGluZUZsb3dCb3goKTsKKyAgICBJbmxpbmVGbG93Qm94KiBmbG93Qm94ID0g
YW5vbnltb3VzSW5saW5lQmxvY2sgPyBuZXcgKHJlbmRlckFyZW5hKCkpIElubGluZUZsb3dBbm9u
eW1vdXNJbmxpbmVCbG9ja0JveCh0aGlzKSA6IGNyZWF0ZUlubGluZUZsb3dCb3goKTsKICAgICBt
X2xpbmVCb3hlcy5hcHBlbmRMaW5lQm94KGZsb3dCb3gpOwogICAgIHJldHVybiBmbG93Qm94Owog
fQpAQCAtOTUxLDIwICs2OTgsOSBAQCB2b2lkIFJlbmRlcklubGluZTo6YWRkRm9jdXNSaW5nUmVj
dHMoVmVjCiAgICAgICAgICAgICAgICAgcG9zID0gY3Vyci0+bG9jYWxUb0Fic29sdXRlKCk7CiAg
ICAgICAgICAgICBlbHNlIGlmIChjdXJyLT5pc0JveCgpKQogICAgICAgICAgICAgICAgIHBvcy5t
b3ZlKHRvUmVuZGVyQm94KGN1cnIpLT54KCksIHRvUmVuZGVyQm94KGN1cnIpLT55KCkpOwotICAg
ICAgICAgICBjdXJyLT5hZGRGb2N1c1JpbmdSZWN0cyhyZWN0cywgcG9zLngoKSwgcG9zLnkoKSk7
CisgICAgICAgICAgICBjdXJyLT5hZGRGb2N1c1JpbmdSZWN0cyhyZWN0cywgcG9zLngoKSwgcG9z
LnkoKSk7CiAgICAgICAgIH0KICAgICB9Ci0KLSAgICBpZiAoY29udGludWF0aW9uKCkpIHsKLSAg
ICAgICAgaWYgKGNvbnRpbnVhdGlvbigpLT5pc0lubGluZSgpKQotICAgICAgICAgICAgY29udGlu
dWF0aW9uKCktPmFkZEZvY3VzUmluZ1JlY3RzKHJlY3RzLCAKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB0eCAtIGNvbnRhaW5pbmdCbG9jaygpLT54KCkgKyBj
b250aW51YXRpb24oKS0+Y29udGFpbmluZ0Jsb2NrKCktPngoKSwKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eSAtIGNvbnRhaW5pbmdCbG9jaygpLT55KCkg
KyBjb250aW51YXRpb24oKS0+Y29udGFpbmluZ0Jsb2NrKCktPnkoKSk7Ci0gICAgICAgIGVsc2UK
LSAgICAgICAgICAgIGNvbnRpbnVhdGlvbigpLT5hZGRGb2N1c1JpbmdSZWN0cyhyZWN0cywgCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHggLSBjb250YWlu
aW5nQmxvY2soKS0+eCgpICsgdG9SZW5kZXJCb3goY29udGludWF0aW9uKCkpLT54KCksCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHkgLSBjb250YWluaW5n
QmxvY2soKS0+eSgpICsgdG9SZW5kZXJCb3goY29udGludWF0aW9uKCkpLT55KCkpOwotICAgIH0K
IH0KIAogdm9pZCBSZW5kZXJJbmxpbmU6OnBhaW50T3V0bGluZShHcmFwaGljc0NvbnRleHQqIGdy
YXBoaWNzQ29udGV4dCwgaW50IHR4LCBpbnQgdHkpCkBAIC05OTYsNyArNzMyLDggQEAgdm9pZCBS
ZW5kZXJJbmxpbmU6OnBhaW50T3V0bGluZShHcmFwaGljcwogICAgICAgICBSb290SW5saW5lQm94
KiByb290ID0gY3Vyci0+cm9vdCgpOwogICAgICAgICBpbnQgdG9wID0gbWF4KHJvb3QtPmxpbmVU
b3AoKSwgY3Vyci0+eSgpKTsKICAgICAgICAgaW50IGJvdHRvbSA9IG1pbihyb290LT5saW5lQm90
dG9tKCksIGN1cnItPnkoKSArIGN1cnItPmhlaWdodCgpKTsKLSAgICAgICAgcmVjdHMuYXBwZW5k
KEludFJlY3QoY3Vyci0+eCgpLCB0b3AsIGN1cnItPndpZHRoKCksIGJvdHRvbSAtIHRvcCkpOwor
ICAgICAgICBpZiAoY3Vyci0+d2lkdGgoKSAmJiB0b3AgLSBib3R0b20pCisgICAgICAgICAgICBy
ZWN0cy5hcHBlbmQoSW50UmVjdChjdXJyLT54KCksIHRvcCwgY3Vyci0+d2lkdGgoKSwgYm90dG9t
IC0gdG9wKSk7CiAgICAgfQogICAgIHJlY3RzLmFwcGVuZChJbnRSZWN0KCkpOwogCkluZGV4OiBX
ZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJJbmxpbmUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3Jl
bmRlcmluZy9SZW5kZXJJbmxpbmUuaAkocmV2aXNpb24gNTQ3MjcpCisrKyBXZWJDb3JlL3JlbmRl
cmluZy9SZW5kZXJJbmxpbmUuaAkod29ya2luZyBjb3B5KQpAQCAtNDksNyArNDksNyBAQCBwdWJs
aWM6CiAgICAgSW50UmVjdCBsaW5lc0JvdW5kaW5nQm94KCkgY29uc3Q7CiAgICAgSW50UmVjdCBs
aW5lc1Zpc2libGVPdmVyZmxvd0JvdW5kaW5nQm94KCkgY29uc3Q7CiAKLSAgICBJbmxpbmVGbG93
Qm94KiBjcmVhdGVBbmRBcHBlbmRJbmxpbmVGbG93Qm94KCk7CisgICAgSW5saW5lRmxvd0JveCog
Y3JlYXRlQW5kQXBwZW5kSW5saW5lRmxvd0JveChSZW5kZXJCbG9jayogYW5vbnltb3VzSW5saW5l
QmxvY2spOwogCiAgICAgdm9pZCBkaXJ0eUxpbmVCb3hlcyhib29sIGZ1bGxMYXlvdXQpOwogCkBA
IC01OCwxMCArNTgsNiBAQCBwdWJsaWM6CiAKICAgICBJbmxpbmVGbG93Qm94KiBmaXJzdExpbmVC
b3goKSBjb25zdCB7IHJldHVybiBtX2xpbmVCb3hlcy5maXJzdExpbmVCb3goKTsgfQogICAgIElu
bGluZUZsb3dCb3gqIGxhc3RMaW5lQm94KCkgY29uc3QgeyByZXR1cm4gbV9saW5lQm94ZXMubGFz
dExpbmVCb3goKTsgfQotCi0gICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGNvbnRpbnVhdGlvbigp
IGNvbnN0IHsgcmV0dXJuIG1fY29udGludWF0aW9uOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgdXBk
YXRlRHJhZ1N0YXRlKGJvb2wgZHJhZ09uKTsKICAgICAKICAgICBJbnRTaXplIHJlbGF0aXZlUG9z
aXRpb25lZElubGluZU9mZnNldChjb25zdCBSZW5kZXJCb3gqIGNoaWxkKSBjb25zdDsKIApAQCAt
ODEsOSArNzcsNiBAQCBwcml2YXRlOgogCiAgICAgdmlydHVhbCBib29sIGlzUmVuZGVySW5saW5l
KCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQogCi0gICAgdm9pZCBhZGRDaGlsZFRvQ29udGludWF0
aW9uKFJlbmRlck9iamVjdCogbmV3Q2hpbGQsIFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQpOwot
ICAgIHZpcnR1YWwgdm9pZCBhZGRDaGlsZElnbm9yaW5nQ29udGludWF0aW9uKFJlbmRlck9iamVj
dCogbmV3Q2hpbGQsIFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQgPSAwKTsKLQogICAgIHZvaWQg
c3BsaXRJbmxpbmVzKFJlbmRlckJsb2NrKiBmcm9tQmxvY2ssIFJlbmRlckJsb2NrKiB0b0Jsb2Nr
LCBSZW5kZXJCbG9jayogbWlkZGxlQmxvY2ssCiAgICAgICAgICAgICAgICAgICAgICAgUmVuZGVy
T2JqZWN0KiBiZWZvcmVDaGlsZCwgUmVuZGVyQm94TW9kZWxPYmplY3QqIG9sZENvbnQpOwogICAg
IHZvaWQgc3BsaXRGbG93KFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQsIFJlbmRlckJsb2NrKiBu
ZXdCbG9ja0JveCwKQEAgLTEyNiwxMyArMTE5LDggQEAgcHJpdmF0ZToKIAogICAgIHZpcnR1YWwg
aW50IGxpbmVIZWlnaHQoYm9vbCBmaXJzdExpbmUsIGJvb2wgaXNSb290TGluZUJveCA9IGZhbHNl
KSBjb25zdDsKIAotICAgIFJlbmRlcklubGluZSogaW5saW5lQ29udGludWF0aW9uKCkgY29uc3Q7
Ci0gICAgdm9pZCBzZXRDb250aW51YXRpb24oUmVuZGVyQm94TW9kZWxPYmplY3QqIGMpIHsgbV9j
b250aW51YXRpb24gPSBjOyB9Ci0gICAgCiAgICAgdmlydHVhbCB2b2lkIGNoaWxkQmVjYW1lTm9u
SW5saW5lKFJlbmRlck9iamVjdCogY2hpbGQpOwogCi0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZUhp
dFRlc3RSZXN1bHQoSGl0VGVzdFJlc3VsdCYsIGNvbnN0IEludFBvaW50Jik7Ci0KICAgICB2aXJ0
dWFsIHZvaWQgaW1hZ2VDaGFuZ2VkKFdyYXBwZWRJbWFnZVB0ciwgY29uc3QgSW50UmVjdCogPSAw
KTsKIAogI2lmIEVOQUJMRShEQVNIQk9BUkRfU1VQUE9SVCkKQEAgLTE0NSwxMyArMTMzLDEyIEBA
IHByaXZhdGU6CiAgICAgc3RhdGljIFJlbmRlcklubGluZSogY2xvbmVJbmxpbmUoUmVuZGVySW5s
aW5lKiBzcmMpOwogCiAgICAgdm9pZCBwYWludE91dGxpbmVGb3JMaW5lKEdyYXBoaWNzQ29udGV4
dCosIGludCB0eCwgaW50IHR5LCBjb25zdCBJbnRSZWN0JiBwcmV2TGluZSwgY29uc3QgSW50UmVj
dCYgdGhpc0xpbmUsIGNvbnN0IEludFJlY3QmIG5leHRMaW5lKTsKLSAgICBSZW5kZXJCb3hNb2Rl
bE9iamVjdCogY29udGludWF0aW9uQmVmb3JlKFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQpOwor
CisgICAgdm9pZCBjdWxsZWRMaW5lQm94UmVjdHMoVmVjdG9yPEludFJlY3Q+JiwgYm9vbCBpbmNs
dWRlT3ZlcmZsb3cgPSBmYWxzZSkgY29uc3Q7CiAKICAgICBSZW5kZXJPYmplY3RDaGlsZExpc3Qg
bV9jaGlsZHJlbjsKICAgICBSZW5kZXJMaW5lQm94TGlzdCBtX2xpbmVCb3hlczsgICAvLyBBbGwg
b2YgdGhlIGxpbmUgYm94ZXMgY3JlYXRlZCBmb3IgdGhpcyBpbmxpbmUgZmxvdy4gIEZvciBleGFt
cGxlLCA8aT5IZWxsbzxicj53b3JsZC48L2k+IHdpbGwgaGF2ZSB0d28gPGk+IGxpbmUgYm94ZXMu
CiAKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogbV9jb250aW51YXRpb247IC8vIENhbiBiZSBl
aXRoZXIgYSBibG9jayBvciBhbiBpbmxpbmUuIDxiPjxpPjxwPkhlbGxvPC9wPjwvaT48L2I+LiBJ
biB0aGlzIGV4YW1wbGUgdGhlIDxpPiB3aWxsIGhhdmUgYSBibG9jayBhcyBpdHMgY29udGludWF0
aW9uIGJ1dCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v
IDxiPiB3aWxsIGp1c3QgaGF2ZSBhbiBpbmxpbmUgYXMgaXRzIGNvbnRpbnVhdGlvbi4KICAgICBt
dXRhYmxlIGludCBtX2xpbmVIZWlnaHQ7CiAgICAgbXV0YWJsZSBpbnQgbV92ZXJ0aWNhbFBvc2l0
aW9uOwogfTsKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckxpbmVCb3hMaXN0LmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMaW5lQm94TGlzdC5jcHAJKHJl
dmlzaW9uIDU0NzI3KQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGluZUJveExpc3QuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0xNDYsMTIgKzE0Niw2IEBAIHZvaWQgUmVuZGVyTGluZUJveExp
c3Q6OmRpcnR5TGluZUJveGVzKCkKIAogdm9pZCBSZW5kZXJMaW5lQm94TGlzdDo6cGFpbnQoUmVu
ZGVyQm94TW9kZWxPYmplY3QqIHJlbmRlcmVyLCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFp
bnRJbmZvLCBpbnQgdHgsIGludCB0eSkgY29uc3QKIHsKLSAgICAvLyBPbmx5IHBhaW50IGR1cmlu
ZyB0aGUgZm9yZWdyb3VuZC9zZWxlY3Rpb24gcGhhc2VzLgotICAgIGlmIChwYWludEluZm8ucGhh
c2UgIT0gUGFpbnRQaGFzZUZvcmVncm91bmQgJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhh
c2VTZWxlY3Rpb24gJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VPdXRsaW5lIAotICAg
ICAgICAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZVNlbGZPdXRsaW5lICYmIHBhaW50
SW5mby5waGFzZSAhPSBQYWludFBoYXNlQ2hpbGRPdXRsaW5lcyAmJiBwYWludEluZm8ucGhhc2Ug
IT0gUGFpbnRQaGFzZVRleHRDbGlwCi0gICAgICAgICYmIHBhaW50SW5mby5waGFzZSAhPSBQYWlu
dFBoYXNlTWFzaykKLSAgICAgICAgcmV0dXJuOwotCiAgICAgQVNTRVJUKHJlbmRlcmVyLT5pc1Jl
bmRlckJsb2NrKCkgfHwgKHJlbmRlcmVyLT5pc1JlbmRlcklubGluZSgpICYmIHJlbmRlcmVyLT5o
YXNMYXllcigpKSk7IC8vIFRoZSBvbmx5IHdheSBhbiBpbmxpbmUgY291bGQgcGFpbnQgbGlrZSB0
aGlzIGlzIGlmIGl0IGhhcyBhIGxheWVyLgogCiAgICAgLy8gSWYgd2UgaGF2ZSBubyBsaW5lcyB0
aGVuIHdlIGhhdmUgbm8gd29yayB0byBkby4KQEAgLTE5NSwxMyArMTg5LDE3IEBAIHZvaWQgUmVu
ZGVyTGluZUJveExpc3Q6OnBhaW50KFJlbmRlckJveE0KICAgICAgICAgICAgIH0KICAgICAgICAg
fQogCi0gICAgICAgIGludCB0b3AgPSBtaW4oY3Vyci0+dG9wVmlzaWJsZU92ZXJmbG93KCksIGN1
cnItPnJvb3QoKS0+c2VsZWN0aW9uVG9wKCkpIC0gcmVuZGVyZXItPm1heGltYWxPdXRsaW5lU2l6
ZShpbmZvLnBoYXNlKTsKKyAgICAgICAgUm9vdElubGluZUJveCogcm9vdEJveCA9IGN1cnItPnJv
b3QoKTsKKyAgICAgICAgaW50IHRvcCA9IG1pbihjdXJyLT50b3BWaXNpYmxlT3ZlcmZsb3coKSwg
cm9vdEJveC0+c2VsZWN0aW9uVG9wKCkpIC0gcmVuZGVyZXItPm1heGltYWxPdXRsaW5lU2l6ZShp
bmZvLnBoYXNlKTsKICAgICAgICAgaW50IGJvdHRvbSA9IGN1cnItPmJvdHRvbVZpc2libGVPdmVy
ZmxvdygpICsgcmVuZGVyZXItPm1heGltYWxPdXRsaW5lU2l6ZShpbmZvLnBoYXNlKTsKICAgICAg
ICAgaCA9IGJvdHRvbSAtIHRvcDsKICAgICAgICAgeVBvcyA9IHR5ICsgdG9wOwogICAgICAgICB2
LT5zZXRNaW5pbXVtQ29sdW1uSGVpZ2h0KGgpOwotICAgICAgICBpZiAoeVBvcyA8IGluZm8ucmVj
dC5ib3R0b20oKSAmJiB5UG9zICsgaCA+IGluZm8ucmVjdC55KCkpCi0gICAgICAgICAgICBjdXJy
LT5wYWludChpbmZvLCB0eCwgdHkpOworICAgICAgICBpZiAoeVBvcyA8IGluZm8ucmVjdC5ib3R0
b20oKSAmJiB5UG9zICsgaCA+IGluZm8ucmVjdC55KCkpIHsKKyAgICAgICAgICAgIExpbmVCb3hQ
YWludEluZm8gbGluZUJveFBhaW50SW5mbzsKKyAgICAgICAgICAgIGxpbmVCb3hQYWludEluZm8u
YW5vbnltb3VzSW5saW5lQmxvY2sgPSByb290Qm94LT5hbm9ueW1vdXNJbmxpbmVCbG9jaygpOwor
ICAgICAgICAgICAgY3Vyci0+cGFpbnQoaW5mbywgdHgsIHR5LCBsaW5lQm94UGFpbnRJbmZvKTsK
KyAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChpbmZvLnBoYXNlID09IFBhaW50UGhhc2VPdXRs
aW5lIHx8IGluZm8ucGhhc2UgPT0gUGFpbnRQaGFzZVNlbGZPdXRsaW5lIHx8IGluZm8ucGhhc2Ug
PT0gUGFpbnRQaGFzZUNoaWxkT3V0bGluZXMpIHsKQEAgLTIxNyw5ICsyMTUsNiBAQCB2b2lkIFJl
bmRlckxpbmVCb3hMaXN0OjpwYWludChSZW5kZXJCb3hNCiAKIGJvb2wgUmVuZGVyTGluZUJveExp
c3Q6OmhpdFRlc3QoUmVuZGVyQm94TW9kZWxPYmplY3QqIHJlbmRlcmVyLCBjb25zdCBIaXRUZXN0
UmVxdWVzdCYgcmVxdWVzdCwgSGl0VGVzdFJlc3VsdCYgcmVzdWx0LCBpbnQgeCwgaW50IHksIGlu
dCB0eCwgaW50IHR5LCBIaXRUZXN0QWN0aW9uIGhpdFRlc3RBY3Rpb24pIGNvbnN0CiB7Ci0gICAg
aWYgKGhpdFRlc3RBY3Rpb24gIT0gSGl0VGVzdEZvcmVncm91bmQpCi0gICAgICAgIHJldHVybiBm
YWxzZTsKLQogICAgIEFTU0VSVChyZW5kZXJlci0+aXNSZW5kZXJCbG9jaygpIHx8IChyZW5kZXJl
ci0+aXNSZW5kZXJJbmxpbmUoKSAmJiByZW5kZXJlci0+aGFzTGF5ZXIoKSkpOyAvLyBUaGUgb25s
eSB3YXkgYW4gaW5saW5lIGNvdWxkIGhpdCB0ZXN0IGxpa2UgdGhpcyBpcyBpZiBpdCBoYXMgYSBs
YXllci4KIAogICAgIC8vIElmIHdlIGhhdmUgbm8gbGluZXMgdGhlbiB3ZSBoYXZlIG5vIHdvcmsg
dG8gZG8uCkBAIC0yMzAsMjIgKzIyNSwzNSBAQCBib29sIFJlbmRlckxpbmVCb3hMaXN0OjpoaXRU
ZXN0KFJlbmRlckJvCiAgICAgLy8gY29udGFpbiB0aGUgcG9pbnQuICBUaGlzIGlzIGEgcXVpY2sg
c2hvcnQtY2lyY3VpdCB0aGF0IHdlIGNhbiB0YWtlIHRvIGF2b2lkIHdhbGtpbmcgYW55IGxpbmVz
LgogICAgIC8vIEZJWE1FOiBUaGlzIGNoZWNrIGlzIGZsYXdlZCBpbiB0aGUgZm9sbG93aW5nIGV4
dHJlbWVseSBvYnNjdXJlIHdheToKICAgICAvLyBpZiBzb21lIGxpbmUgaW4gdGhlIG1pZGRsZSBo
YXMgYSBodWdlIG92ZXJmbG93LCBpdCBtaWdodCBhY3R1YWxseSBleHRlbmQgYmVsb3cgdGhlIGxh
c3QgbGluZS4KLSAgICBpZiAoKHkgPj0gdHkgKyBsYXN0TGluZUJveCgpLT5yb290KCktPmJvdHRv
bVZpc2libGVPdmVyZmxvdygpKSB8fCAoeSA8IHR5ICsgZmlyc3RMaW5lQm94KCktPnJvb3QoKS0+
dG9wVmlzaWJsZU92ZXJmbG93KCkpKQorICAgIFJvb3RJbmxpbmVCb3gqIGZpcnN0Um9vdCA9IGZp
cnN0TGluZUJveCgpLT5yb290KCk7CisgICAgUm9vdElubGluZUJveCogbGFzdFJvb3QgPSBsYXN0
TGluZUJveCgpLT5yb290KCk7CisgICAgaW50IHRvcCA9IGZpcnN0Um9vdC0+dG9wVmlzaWJsZU92
ZXJmbG93KCk7CisgICAgaW50IGJvdHRvbSA9IGxhc3RSb290LT5ib3R0b21WaXNpYmxlT3ZlcmZs
b3coKTsKKyAgICBpZiAobGFzdFJvb3QtPmhhc0Fub255bW91c0lubGluZUJsb2NrKCkpCisgICAg
ICAgIGJvdHRvbSA9IG1heChib3R0b20sIGJvdHRvbSArIGxhc3RSb290LT5hbm9ueW1vdXNJbmxp
bmVCbG9jaygpLT5jb2xsYXBzZWRNYXJnaW5Cb3R0b20oKSk7CisgICAgaWYgKGZpcnN0Um9vdC0+
aGFzQW5vbnltb3VzSW5saW5lQmxvY2soKSkKKyAgICAgICAgdG9wID0gbWluKHRvcCwgdG9wICsg
Zmlyc3RSb290LT5hbm9ueW1vdXNJbmxpbmVCbG9jaygpLT5jb2xsYXBzZWRNYXJnaW5Ub3AoKSk7
CisgICAgaWYgKCh5ID49IHR5ICsgYm90dG9tKSB8fCAoeSA8IHR5ICsgdG9wKSkKICAgICAgICAg
cmV0dXJuIGZhbHNlOwogCiAgICAgLy8gU2VlIGlmIG91ciByb290IGxpbmVzIGNvbnRhaW4gdGhl
IHBvaW50LiAgSWYgc28sIHRoZW4gd2UgaGl0IHRlc3QKICAgICAvLyB0aGVtIGZ1cnRoZXIuICBO
b3RlIHRoYXQgYm94ZXMgY2FuIGVhc2lseSBvdmVybGFwLCBzbyB3ZSBjYW4ndCBtYWtlIGFueSBh
c3N1bXB0aW9ucwogICAgIC8vIGJhc2VkIG9mZiBwb3NpdGlvbnMgb2Ygb3VyIGZpcnN0IGxpbmUg
Ym94IG9yIG91ciBsYXN0IGxpbmUgYm94LgogICAgIGZvciAoSW5saW5lRmxvd0JveCogY3VyciA9
IGxhc3RMaW5lQm94KCk7IGN1cnI7IGN1cnIgPSBjdXJyLT5wcmV2Rmxvd0JveCgpKSB7Ci0gICAg
ICAgIGlmICh5ID49IHR5ICsgY3Vyci0+cm9vdCgpLT50b3BWaXNpYmxlT3ZlcmZsb3coKSAmJiB5
IDwgdHkgKyBjdXJyLT5yb290KCktPmJvdHRvbVZpc2libGVPdmVyZmxvdygpKSB7Ci0gICAgICAg
ICAgICBib29sIGluc2lkZSA9IGN1cnItPm5vZGVBdFBvaW50KHJlcXVlc3QsIHJlc3VsdCwgeCwg
eSwgdHgsIHR5KTsKKyAgICAgICAgUm9vdElubGluZUJveCogY3VyclJvb3QgPSBjdXJyLT5yb290
KCk7CisgICAgICAgIGludCB0b3AgPSBjdXJyUm9vdC0+dG9wVmlzaWJsZU92ZXJmbG93KCk7Cisg
ICAgICAgIGludCBib3R0b20gPSBjdXJyUm9vdC0+Ym90dG9tVmlzaWJsZU92ZXJmbG93KCk7Cisg
ICAgICAgIGlmICh5ID49IHR5ICsgdG9wICYmIHkgPCB0eSArIGJvdHRvbSkgeworICAgICAgICAg
ICAgTGluZUJveEhpdFRlc3RJbmZvIGhpdFRlc3RJbmZvOworICAgICAgICAgICAgaGl0VGVzdElu
Zm8uYW5vbnltb3VzSW5saW5lQmxvY2sgPSBjdXJyUm9vdC0+YW5vbnltb3VzSW5saW5lQmxvY2so
KTsKKyAgICAgICAgICAgIGJvb2wgaW5zaWRlID0gY3Vyci0+bm9kZUF0UG9pbnQocmVxdWVzdCwg
cmVzdWx0LCB4LCB5LCB0eCwgdHksIGhpdFRlc3RBY3Rpb24sIGhpdFRlc3RJbmZvKTsKICAgICAg
ICAgICAgIGlmIChpbnNpZGUpIHsKICAgICAgICAgICAgICAgICByZW5kZXJlci0+dXBkYXRlSGl0
VGVzdFJlc3VsdChyZXN1bHQsIEludFBvaW50KHggLSB0eCwgeSAtIHR5KSk7CiAgICAgICAgICAg
ICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAg
CisKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKQEAgLTI5Nyw2ICszMDUsMTAgQEAgdm9pZCBSZW5k
ZXJMaW5lQm94TGlzdDo6ZGlydHlMaW5lc0Zyb21DaAogICAgICAgICBSb290SW5saW5lQm94KiBh
ZGphY2VudEJveDsKICAgICAgICAgYm94LT5tYXJrRGlydHkoKTsKIAorICAgICAgICAvLyBXZSBk
b24ndCBuZWVkIHRvIGRpcnR5IGFueSBvdGhlciBsaW5lcy4KKyAgICAgICAgaWYgKGJveC0+aGFz
QW5vbnltb3VzSW5saW5lQmxvY2soKSkKKyAgICAgICAgICAgIHJldHVybjsKKwogICAgICAgICAv
LyBkaXJ0eSB0aGUgYWRqYWNlbnQgbGluZXMgdGhhdCBtaWdodCBiZSBhZmZlY3RlZAogICAgICAg
ICAvLyBOT1RFOiB3ZSBkaXJ0eSB0aGUgcHJldmlvdXMgbGluZSBiZWNhdXNlIFJvb3RJbmxpbmVC
b3ggb2JqZWN0cyBjYWNoZQogICAgICAgICAvLyB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3Qgb2Jq
ZWN0IG9uIHRoZSBuZXh0IGxpbmUgYWZ0ZXIgYSBCUiwgd2hpY2ggd2UgbWF5IGJlCkluZGV4OiBX
ZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMaXN0SXRlbS5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVyTGlzdEl0ZW0uY3BwCShyZXZpc2lvbiA1NDcyNykKKysrIFdlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlckxpc3RJdGVtLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjcsNiAr
MjcsOCBAQAogI2luY2x1ZGUgIkNhY2hlZEltYWdlLmgiCiAjaW5jbHVkZSAiSFRNTE5hbWVzLmgi
CiAjaW5jbHVkZSAiSFRNTE9MaXN0RWxlbWVudC5oIgorI2luY2x1ZGUgIklubGluZUl0ZXJhdG9y
LmgiCisKICNpbmNsdWRlICJSZW5kZXJMaXN0TWFya2VyLmgiCiAjaW5jbHVkZSAiUmVuZGVyVmll
dy5oIgogI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KQEAgLTE1MywxOCArMTU1LDQ0IEBA
IGJvb2wgUmVuZGVyTGlzdEl0ZW06OmlzRW1wdHkoKSBjb25zdAogICAgIHJldHVybiBsYXN0Q2hp
bGQoKSA9PSBtX21hcmtlcjsKIH0KIAotc3RhdGljIFJlbmRlck9iamVjdCogZ2V0UGFyZW50T2ZG
aXJzdExpbmVCb3goUmVuZGVyQmxvY2sqIGN1cnIsIFJlbmRlck9iamVjdCogbWFya2VyKQordm9p
ZCBSZW5kZXJMaXN0SXRlbTo6dXBkYXRlVmFsdWUoKQogewotICAgIFJlbmRlck9iamVjdCogZmly
c3RDaGlsZCA9IGN1cnItPmZpcnN0Q2hpbGQoKTsKLSAgICBpZiAoIWZpcnN0Q2hpbGQpCi0gICAg
ICAgIHJldHVybiAwOworICAgIGlmICghbV9oYXNFeHBsaWNpdFZhbHVlKSB7CisgICAgICAgIG1f
aXNWYWx1ZVVwVG9EYXRlID0gZmFsc2U7CisgICAgICAgIGlmIChtX21hcmtlcikKKyAgICAgICAg
ICAgIG1fbWFya2VyLT5zZXROZWVkc0xheW91dEFuZFByZWZXaWR0aHNSZWNhbGMoKTsKKyAgICB9
Cit9CiAKLSAgICBmb3IgKFJlbmRlck9iamVjdCogY3VyckNoaWxkID0gZmlyc3RDaGlsZDsgY3Vy
ckNoaWxkOyBjdXJyQ2hpbGQgPSBjdXJyQ2hpbGQtPm5leHRTaWJsaW5nKCkpIHsKK3N0YXRpYyBS
ZW5kZXJPYmplY3QqIGZpcnN0Tm9uTWFya2VyQ2hpbGQoUmVuZGVyT2JqZWN0KiBwYXJlbnQpCit7
CisgICAgUmVuZGVyT2JqZWN0KiByZXN1bHQgPSBwYXJlbnQtPmZpcnN0Q2hpbGQoKTsKKyAgICB3
aGlsZSAocmVzdWx0ICYmIHJlc3VsdC0+aXNMaXN0TWFya2VyKCkpCisgICAgICAgIHJlc3VsdCA9
IHJlc3VsdC0+bmV4dFNpYmxpbmcoKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRp
YyBSZW5kZXJCbG9jayogbGlzdE1hcmtlckxvY2F0aW9uKFJlbmRlckJsb2NrKiBibG9jaywgUmVu
ZGVyTGlzdE1hcmtlciogbWFya2VyKQoreworICAgIGZvciAoUmVuZGVyT2JqZWN0KiBjdXJyQ2hp
bGQgPSBibG9jay0+Zmlyc3RDaGlsZCgpOyBjdXJyQ2hpbGQ7IGN1cnJDaGlsZCA9IGN1cnJDaGls
ZC0+bmV4dFNpYmxpbmcoKSkgewogICAgICAgICBpZiAoY3VyckNoaWxkID09IG1hcmtlcikKICAg
ICAgICAgICAgIGNvbnRpbnVlOwogCi0gICAgICAgIGlmIChjdXJyQ2hpbGQtPmlzSW5saW5lKCkg
JiYgKCFjdXJyQ2hpbGQtPmlzUmVuZGVySW5saW5lKCkgfHwgY3Vyci0+Z2VuZXJhdGVzTGluZUJv
eGVzRm9ySW5saW5lQ2hpbGQoY3VyckNoaWxkKSkpCi0gICAgICAgICAgICByZXR1cm4gY3VycjsK
KyAgICAgICAgaWYgKGN1cnJDaGlsZC0+aXNJbmxpbmUoKSkgeworICAgICAgICAgICAgaWYgKCFj
dXJyQ2hpbGQtPmlzUmVuZGVySW5saW5lKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGJsb2Nr
OworICAgICAgICAgICAgSW5saW5lSXRlcmF0b3IgaXQoYmxvY2ssIGN1cnJDaGlsZCwgMCk7Cisg
ICAgICAgICAgICB3aGlsZSAoIWl0LmF0RW5kKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXQu
b2JqLT5pc0Fub255bW91c0lubGluZUJsb2NrKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgUmVu
ZGVyQmxvY2sqIGxpbmVCb3hQYXJlbnQgPSBsaXN0TWFya2VyTG9jYXRpb24odG9SZW5kZXJCbG9j
ayhpdC5vYmopLCBtYXJrZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAobGluZUJveFBhcmVu
dCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsaW5lQm94UGFyZW50OworICAgICAg
ICAgICAgICAgIH0gZWxzZSBpZiAoUmVuZGVyQmxvY2s6OnJlcXVpcmVzTGluZUJveChpdCkpCisg
ICAgICAgICAgICAgICAgICAgIHJldHVybiBibG9jazsKKyAgICAgICAgICAgICAgICBpdC5pbmNy
ZW1lbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCiAgICAgICAgIGlmIChjdXJyQ2hp
bGQtPmlzRmxvYXRpbmcoKSB8fCBjdXJyQ2hpbGQtPmlzUG9zaXRpb25lZCgpKQogICAgICAgICAg
ICAgY29udGludWU7CkBAIC0xNzIsNDEgKzIwMCwyNCBAQCBzdGF0aWMgUmVuZGVyT2JqZWN0KiBn
ZXRQYXJlbnRPZkZpcnN0TGluCiAgICAgICAgIGlmIChjdXJyQ2hpbGQtPmlzVGFibGUoKSB8fCAh
Y3VyckNoaWxkLT5pc1JlbmRlckJsb2NrKCkpCiAgICAgICAgICAgICBicmVhazsKIAotICAgICAg
ICBpZiAoY3Vyci0+aXNMaXN0SXRlbSgpICYmIGN1cnJDaGlsZC0+c3R5bGUoKS0+aHRtbEhhY2tz
KCkgJiYgY3VyckNoaWxkLT5ub2RlKCkgJiYKLSAgICAgICAgICAgIChjdXJyQ2hpbGQtPm5vZGUo
KS0+aGFzVGFnTmFtZSh1bFRhZyl8fCBjdXJyQ2hpbGQtPm5vZGUoKS0+aGFzVGFnTmFtZShvbFRh
ZykpKQorICAgICAgICBpZiAoYmxvY2stPmlzTGlzdEl0ZW0oKSAmJiBjdXJyQ2hpbGQtPnN0eWxl
KCktPmh0bWxIYWNrcygpICYmIGN1cnJDaGlsZC0+bm9kZSgpICYmCisgICAgICAgICAgICAoY3Vy
ckNoaWxkLT5ub2RlKCktPmhhc1RhZ05hbWUodWxUYWcpIHx8IGN1cnJDaGlsZC0+bm9kZSgpLT5o
YXNUYWdOYW1lKG9sVGFnKSkpCiAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBSZW5kZXJP
YmplY3QqIGxpbmVCb3ggPSBnZXRQYXJlbnRPZkZpcnN0TGluZUJveCh0b1JlbmRlckJsb2NrKGN1
cnJDaGlsZCksIG1hcmtlcik7Ci0gICAgICAgIGlmIChsaW5lQm94KQotICAgICAgICAgICAgcmV0
dXJuIGxpbmVCb3g7CisgICAgICAgIFJlbmRlckJsb2NrKiBsaW5lQm94UGFyZW50ID0gbGlzdE1h
cmtlckxvY2F0aW9uKHRvUmVuZGVyQmxvY2soY3VyckNoaWxkKSwgbWFya2VyKTsKKyAgICAgICAg
aWYgKGxpbmVCb3hQYXJlbnQpCisgICAgICAgICAgICByZXR1cm4gbGluZUJveFBhcmVudDsKICAg
ICB9CiAKICAgICByZXR1cm4gMDsKIH0KIAotdm9pZCBSZW5kZXJMaXN0SXRlbTo6dXBkYXRlVmFs
dWUoKQotewotICAgIGlmICghbV9oYXNFeHBsaWNpdFZhbHVlKSB7Ci0gICAgICAgIG1faXNWYWx1
ZVVwVG9EYXRlID0gZmFsc2U7Ci0gICAgICAgIGlmIChtX21hcmtlcikKLSAgICAgICAgICAgIG1f
bWFya2VyLT5zZXROZWVkc0xheW91dEFuZFByZWZXaWR0aHNSZWNhbGMoKTsKLSAgICB9Ci19Ci0K
LXN0YXRpYyBSZW5kZXJPYmplY3QqIGZpcnN0Tm9uTWFya2VyQ2hpbGQoUmVuZGVyT2JqZWN0KiBw
YXJlbnQpCi17Ci0gICAgUmVuZGVyT2JqZWN0KiByZXN1bHQgPSBwYXJlbnQtPmZpcnN0Q2hpbGQo
KTsKLSAgICB3aGlsZSAocmVzdWx0ICYmIHJlc3VsdC0+aXNMaXN0TWFya2VyKCkpCi0gICAgICAg
IHJlc3VsdCA9IHJlc3VsdC0+bmV4dFNpYmxpbmcoKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQot
CiB2b2lkIFJlbmRlckxpc3RJdGVtOjp1cGRhdGVNYXJrZXJMb2NhdGlvbigpCiB7CiAgICAgLy8g
U2FuaXR5IGNoZWNrIHRoZSBsb2NhdGlvbiBvZiBvdXIgbWFya2VyLgogICAgIGlmIChtX21hcmtl
cikgewogICAgICAgICBSZW5kZXJPYmplY3QqIG1hcmtlclBhciA9IG1fbWFya2VyLT5wYXJlbnQo
KTsKLSAgICAgICAgUmVuZGVyT2JqZWN0KiBsaW5lQm94UGFyZW50ID0gZ2V0UGFyZW50T2ZGaXJz
dExpbmVCb3godGhpcywgbV9tYXJrZXIpOworICAgICAgICBSZW5kZXJPYmplY3QqIGxpbmVCb3hQ
YXJlbnQgPSBsaXN0TWFya2VyTG9jYXRpb24odGhpcywgbV9tYXJrZXIpOwogICAgICAgICBpZiAo
IWxpbmVCb3hQYXJlbnQpIHsKICAgICAgICAgICAgIC8vIElmIHRoZSBtYXJrZXIgaXMgY3VycmVu
dGx5IGNvbnRhaW5lZCBpbnNpZGUgYW4gYW5vbnltb3VzIGJveCwKICAgICAgICAgICAgIC8vIHRo
ZW4gd2UgYXJlIHRoZSBvbmx5IGl0ZW0gaW4gdGhhdCBhbm9ueW1vdXMgYm94IChzaW5jZSBubyBs
aW5lIGJveApAQCAtMjU3LDkgKzI2OCwxMSBAQCB2b2lkIFJlbmRlckxpc3RJdGVtOjpwb3NpdGlv
bkxpc3RNYXJrZXIoCiAgICAgICAgIGludCBtYXJrZXJPbGRYID0gbV9tYXJrZXItPngoKTsKICAg
ICAgICAgaW50IHlPZmZzZXQgPSAwOwogICAgICAgICBpbnQgeE9mZnNldCA9IDA7Ci0gICAgICAg
IGZvciAoUmVuZGVyQm94KiBvID0gbV9tYXJrZXItPnBhcmVudEJveCgpOyBvICE9IHRoaXM7IG8g
PSBvLT5wYXJlbnRCb3goKSkgewotICAgICAgICAgICAgeU9mZnNldCArPSBvLT55KCk7Ci0gICAg
ICAgICAgICB4T2Zmc2V0ICs9IG8tPngoKTsKKyAgICAgICAgZm9yIChSZW5kZXJPYmplY3QqIG8g
PSBtX21hcmtlci0+cGFyZW50KCk7IG8gIT0gdGhpczsgbyA9IG8tPnBhcmVudCgpKSB7CisgICAg
ICAgICAgICBpZiAoby0+aXNCb3goKSkgeworICAgICAgICAgICAgICAgIHlPZmZzZXQgKz0gdG9S
ZW5kZXJCb3gobyktPnkoKTsKKyAgICAgICAgICAgICAgICB4T2Zmc2V0ICs9IHRvUmVuZGVyQm94
KG8pLT54KCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBib29sIGFkanVz
dE92ZXJmbG93ID0gZmFsc2U7CkBAIC0yOTUsMTMgKzMwOCwxNCBAQCB2b2lkIFJlbmRlckxpc3RJ
dGVtOjpwb3NpdGlvbkxpc3RNYXJrZXIoCiAKICAgICAgICAgaWYgKGFkanVzdE92ZXJmbG93KSB7
CiAgICAgICAgICAgICBJbnRSZWN0IG1hcmtlclJlY3QobWFya2VyWFBvcyArIHhPZmZzZXQsIHlP
ZmZzZXQsIG1fbWFya2VyLT53aWR0aCgpLCBtX21hcmtlci0+aGVpZ2h0KCkpOwotICAgICAgICAg
ICAgUmVuZGVyQm94KiBvID0gbV9tYXJrZXI7CisgICAgICAgICAgICBSZW5kZXJPYmplY3QqIG8g
PSBtX21hcmtlcjsKICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBvID0gby0+cGFy
ZW50Qm94KCk7CisgICAgICAgICAgICAgICAgbyA9IG8tPnBhcmVudCgpOwogICAgICAgICAgICAg
ICAgIGlmIChvLT5pc1JlbmRlckJsb2NrKCkpCiAgICAgICAgICAgICAgICAgICAgIHRvUmVuZGVy
QmxvY2sobyktPmFkZExheW91dE92ZXJmbG93KG1hcmtlclJlY3QpOwotICAgICAgICAgICAgICAg
IG1hcmtlclJlY3QubW92ZSgtby0+eCgpLCAtby0+eSgpKTsKLSAgICAgICAgICAgIH0gd2hpbGUg
KG8gIT0gdGhpcyAmJiAhby0+aGFzU2VsZlBhaW50aW5nTGF5ZXIoKSk7CisgICAgICAgICAgICAg
ICAgaWYgKG8tPmlzQm94KCkpCisgICAgICAgICAgICAgICAgICAgIG1hcmtlclJlY3QubW92ZSgt
dG9SZW5kZXJCb3gobyktPngoKSwgLXRvUmVuZGVyQm94KG8pLT55KCkpOworICAgICAgICAgICAg
fSB3aGlsZSAobyAhPSB0aGlzICYmICghby0+aXNCb3goKSB8fCAhdG9SZW5kZXJCb3gobyktPmhh
c1NlbGZQYWludGluZ0xheWVyKCkpKTsgLy8gRklYTUU6IEludmVzdGlnYXRlIDxsaT48c3BhbiBz
dHlsZT0icG9zaXRpb246cmVsYXRpdmU7bGVmdDotMTAwcHgiPjxkaXY+dGV4dDwvZGl2Pjwvc3Bh
bj48L2xpPgogICAgICAgICB9CiAgICAgfQogfQpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVu
ZGVyT2JqZWN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmpl
Y3QuY3BwCShyZXZpc2lvbiA1NDcyNykKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlck9iamVj
dC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIwOCw2ICsyMDgsNyBAQCBSZW5kZXJPYmplY3Q6OlJl
bmRlck9iamVjdChOb2RlKiBub2RlKQogICAgICwgbV9oYXNNYXJrdXBUcnVuY2F0aW9uKGZhbHNl
KQogICAgICwgbV9zZWxlY3Rpb25TdGF0ZShTZWxlY3Rpb25Ob25lKQogICAgICwgbV9oYXNDb2x1
bW5zKGZhbHNlKQorICAgICwgbV9oYXNDdWxsZWRMaW5lQm94ZXMoZmFsc2UpCiAgICAgLCBtX2Nl
bGxXaWR0aENoYW5nZWQoZmFsc2UpCiB7CiAjaWZuZGVmIE5ERUJVRwpAQCAtMjIzMiw4ICsyMjMz
LDYgQEAgdm9pZCBSZW5kZXJPYmplY3Q6OmdldFRleHREZWNvcmF0aW9uQ29sbwogICAgICAgICAg
ICAgfQogICAgICAgICB9CiAgICAgICAgIGN1cnIgPSBjdXJyLT5wYXJlbnQoKTsKLSAgICAgICAg
aWYgKGN1cnIgJiYgY3Vyci0+aXNSZW5kZXJCbG9jaygpICYmIHRvUmVuZGVyQmxvY2soY3Vycikt
PmlubGluZUNvbnRpbnVhdGlvbigpKQotICAgICAgICAgICAgY3VyciA9IHRvUmVuZGVyQmxvY2so
Y3VyciktPmlubGluZUNvbnRpbnVhdGlvbigpOwogICAgIH0gd2hpbGUgKGN1cnIgJiYgZGVjb3Jh
dGlvbnMgJiYgKCFxdWlya3NNb2RlIHx8ICFjdXJyLT5ub2RlKCkgfHwKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAoIWN1cnItPm5vZGUoKS0+aGFzVGFnTmFtZShhVGFnKSAm
JiAhY3Vyci0+bm9kZSgpLT5oYXNUYWdOYW1lKGZvbnRUYWcpKSkpOwogCkluZGV4OiBXZWJDb3Jl
L3JlbmRlcmluZy9SZW5kZXJPYmplY3QuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmlu
Zy9SZW5kZXJPYmplY3QuaAkocmV2aXNpb24gNTQ3MjcpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9S
ZW5kZXJPYmplY3QuaAkod29ya2luZyBjb3B5KQpAQCAtMzE1LDYgKzMxNSw4IEBAIHB1YmxpYzoK
ICAgICB2b2lkIHNldENoaWxkcmVuSW5saW5lKGJvb2wgYiA9IHRydWUpIHsgbV9jaGlsZHJlbklu
bGluZSA9IGI7IH0KICAgICBib29sIGhhc0NvbHVtbnMoKSBjb25zdCB7IHJldHVybiBtX2hhc0Nv
bHVtbnM7IH0KICAgICB2b2lkIHNldEhhc0NvbHVtbnMoYm9vbCBiID0gdHJ1ZSkgeyBtX2hhc0Nv
bHVtbnMgPSBiOyB9CisgICAgYm9vbCBoYXNDdWxsZWRMaW5lQm94ZXMoKSBjb25zdCB7IHJldHVy
biBtX2hhc0N1bGxlZExpbmVCb3hlczsgfQorICAgIHZvaWQgc2V0SGFzQ3VsbGVkTGluZUJveGVz
KGJvb2wgYiA9IHRydWUpIHsgbV9oYXNDdWxsZWRMaW5lQm94ZXMgPSBiOyB9CiAgICAgYm9vbCBj
ZWxsV2lkdGhDaGFuZ2VkKCkgY29uc3QgeyByZXR1cm4gbV9jZWxsV2lkdGhDaGFuZ2VkOyB9CiAg
ICAgdm9pZCBzZXRDZWxsV2lkdGhDaGFuZ2VkKGJvb2wgYiA9IHRydWUpIHsgbV9jZWxsV2lkdGhD
aGFuZ2VkID0gYjsgfQogCkBAIC0zNjYsNyArMzY4LDExIEBAIHB1YmxpYzoKICAgICB2b2lkIHNl
dElzQW5vbnltb3VzKGJvb2wgYikgeyBtX2lzQW5vbnltb3VzID0gYjsgfQogICAgIGJvb2wgaXNB
bm9ueW1vdXNCbG9jaygpIGNvbnN0CiAgICAgewotICAgICAgICByZXR1cm4gbV9pc0Fub255bW91
cyAmJiBzdHlsZSgpLT5kaXNwbGF5KCkgPT0gQkxPQ0sgJiYgc3R5bGUoKS0+c3R5bGVUeXBlKCkg
PT0gTk9QU0VVRE8gJiYgIWlzTGlzdE1hcmtlcigpOworICAgICAgICByZXR1cm4gbV9pc0Fub255
bW91cyAmJiBzdHlsZSgpLT5kaXNwbGF5KCkgPT0gQkxPQ0sgJiYgc3R5bGUoKS0+c3R5bGVUeXBl
KCkgPT0gTk9QU0VVRE8gJiYgIWlzVGV4dCgpICYmICFpc0xpc3RNYXJrZXIoKTsKKyAgICB9Cisg
ICAgYm9vbCBpc0Fub255bW91c0lubGluZUJsb2NrKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJl
dHVybiBtX2lzQW5vbnltb3VzICYmIHN0eWxlKCktPmRpc3BsYXkoKSA9PSBJTkxJTkVfQkxPQ0sg
JiYgc3R5bGUoKS0+c3R5bGVUeXBlKCkgPT0gTk9QU0VVRE8gJiYgIWlzVGV4dCgpICYmICFpc1J1
YnlSdW4oKSAmJiAhaXNSdWJ5QmFzZSgpOwogICAgIH0KICAgICBib29sIGlzSW5saW5lQ29udGlu
dWF0aW9uKCkgY29uc3QgeyByZXR1cm4gKG5vZGUoKSA/IG5vZGUoKS0+cmVuZGVyZXIoKSAhPSB0
aGlzIDogZmFsc2UpICYmIGlzUmVuZGVySW5saW5lKCk7IH0KICAgICBib29sIGlzRmxvYXRpbmco
KSBjb25zdCB7IHJldHVybiBtX2Zsb2F0aW5nOyB9CkBAIC04NzMsNiArODc5LDkgQEAgcHJpdmF0
ZToKICAgICB1bnNpZ25lZCBtX3NlbGVjdGlvblN0YXRlIDogMzsgLy8gU2VsZWN0aW9uU3RhdGUK
ICAgICBib29sIG1faGFzQ29sdW1ucyA6IDE7CiAgICAgCisgICAgLy8gZnJvbSBSZW5kZXJJbmxp
bmUKKyAgICBib29sIG1faGFzQ3VsbGVkTGluZUJveGVzIDogMTsKKwogICAgIC8vIGZyb20gUmVu
ZGVyVGFibGVDZWxsCiAgICAgYm9vbCBtX2NlbGxXaWR0aENoYW5nZWQgOiAxOwogCkluZGV4OiBX
ZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3RDaGlsZExpc3QuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdENoaWxkTGlzdC5jcHAJKHJldmlzaW9uIDU0
NzI3KQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0Q2hpbGRMaXN0LmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMzE2LDE2ICszMTYsNiBAQCB2b2lkIFJlbmRlck9iamVjdENoaWxkTGlz
dDo6dXBkYXRlQmVmb3JlCiAKICAgICAvLyBXaGV0aGVyIG9yIG5vdCB3ZSBub3cgd2FudCBnZW5l
cmF0ZWQgY29udGVudC4gIAogICAgIGJvb2wgbmV3Q29udGVudFdhbnRlZCA9IHBzZXVkb0VsZW1l
bnRTdHlsZSAmJiBwc2V1ZG9FbGVtZW50U3R5bGUtPmRpc3BsYXkoKSAhPSBOT05FOwotCi0gICAg
Ly8gRm9yIDxxPjxwLz48L3E+LCBpZiB0aGlzIG9iamVjdCBpcyB0aGUgaW5saW5lIGNvbnRpbnVh
dGlvbiBvZiB0aGUgPHE+LCB3ZSBvbmx5IHdhbnQgdG8gZ2VuZXJhdGUKLSAgICAvLyA6YWZ0ZXIg
Y29udGVudCBhbmQgbm90IDpiZWZvcmUgY29udGVudC4KLSAgICBpZiAobmV3Q29udGVudFdhbnRl
ZCAmJiB0eXBlID09IEJFRk9SRSAmJiBvd25lci0+aXNSZW5kZXJJbmxpbmUoKSAmJiB0b1JlbmRl
cklubGluZShvd25lciktPmlzSW5saW5lQ29udGludWF0aW9uKCkpCi0gICAgICAgIG5ld0NvbnRl
bnRXYW50ZWQgPSBmYWxzZTsKLQotICAgIC8vIFNpbWlsYXJseSwgaWYgd2UncmUgdGhlIGJlZ2lu
bmluZyBvZiBhIDxxPiwgYW5kIHRoZXJlJ3MgYW4gaW5saW5lIGNvbnRpbnVhdGlvbiBmb3Igb3Vy
IG9iamVjdCwKLSAgICAvLyB0aGVuIHdlIGRvbid0IGdlbmVyYXRlIHRoZSA6YWZ0ZXIgY29udGVu
dC4KLSAgICBpZiAobmV3Q29udGVudFdhbnRlZCAmJiB0eXBlID09IEFGVEVSICYmIG93bmVyLT5p
c1JlbmRlcklubGluZSgpICYmIHRvUmVuZGVySW5saW5lKG93bmVyKS0+Y29udGludWF0aW9uKCkp
Ci0gICAgICAgIG5ld0NvbnRlbnRXYW50ZWQgPSBmYWxzZTsKICAgICAKICAgICAvLyBJZiB3ZSBk
b24ndCB3YW50IGdlbmVyYXRlZCBjb250ZW50IGFueSBsb25nZXIsIG9yIGlmIHdlIGhhdmUgZ2Vu
ZXJhdGVkIGNvbnRlbnQsIGJ1dCBpdCdzIG5vIGxvbmdlcgogICAgIC8vIGlkZW50aWNhbCB0byB0
aGUgbmV3IGNvbnRlbnQgZGF0YSB3ZSB3YW50IHRvIGJ1aWxkIHJlbmRlciBvYmplY3RzIGZvciwg
dGhlbiB3ZSBudWtlIGFsbApJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyUnVieUJhc2Uu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclJ1YnlCYXNlLmNwcAko
cmV2aXNpb24gNTQ3MjcpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJSdWJ5QmFzZS5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTExOCw3ICsxMTgsNiBAQCB2b2lkIFJlbmRlclJ1YnlCYXNlOjpt
b3ZlQmxvY2tDaGlsZHJlbihSCiAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLT5pc0Fub255bW91
c0Jsb2NrKCkpIHsKICAgICAgICAgICAgICAgICAgICAgUmVuZGVyQmxvY2sqIGFub25CbG9jayA9
IHRvUmVuZGVyQmxvY2soY2hpbGQpOwogICAgICAgICAgICAgICAgICAgICBBU1NFUlQoYW5vbkJs
b2NrLT5jaGlsZHJlbklubGluZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgQVNTRVJUKCFhbm9u
QmxvY2stPmlubGluZUNvbnRpbnVhdGlvbigpKTsKICAgICAgICAgICAgICAgICAgICAgYW5vbkJs
b2NrLT5tb3ZlQWxsQ2hpbGRyZW5Ubyh0b0Jhc2UsIHRvQmFzZS0+Y2hpbGRyZW4oKSk7CiAgICAg
ICAgICAgICAgICAgICAgIGFub25CbG9jay0+ZGVsZXRlTGluZUJveFRyZWUoKTsKICAgICAgICAg
ICAgICAgICAgICAgYW5vbkJsb2NrLT5kZXN0cm95KCk7CkBAIC0xNDUsNyArMTQ0LDYgQEAgdm9p
ZCBSZW5kZXJSdWJ5QmFzZTo6bW92ZUJsb2NrQ2hpbGRyZW4oUgogCiAgICAgICAgICAgICAgICAg
ICAgIFJlbmRlckJsb2NrKiBhbm9uQmxvY2sgPSB0b1JlbmRlckJsb2NrKGNoaWxkKTsKICAgICAg
ICAgICAgICAgICAgICAgQVNTRVJUKGFub25CbG9jay0+Y2hpbGRyZW5JbmxpbmUoKSk7Ci0gICAg
ICAgICAgICAgICAgICAgIEFTU0VSVCghYW5vbkJsb2NrLT5pbmxpbmVDb250aW51YXRpb24oKSk7
CiAgICAgICAgICAgICAgICAgICAgIC8vIE1vdmUgaW5saW5lIGNoaWxkcmVuIG91dCBvZiBhbm9u
eW1vdXMgYmxvY2suCiAgICAgICAgICAgICAgICAgICAgIGFub25CbG9jay0+bW92ZUFsbENoaWxk
cmVuVG8odGhpcywgY2hpbGRyZW4oKSwgYW5vbkJsb2NrKTsKICAgICAgICAgICAgICAgICAgICAg
YW5vbkJsb2NrLT5kZWxldGVMaW5lQm94VHJlZSgpOwpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcv
Um9vdElubGluZUJveC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUm9vdElu
bGluZUJveC5jcHAJKHJldmlzaW9uIDU0NzI3KQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUm9vdElu
bGluZUJveC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlICJQ
YWdlLmgiCiAjaW5jbHVkZSAiUmVuZGVyQXJlbmEuaCIKICNpbmNsdWRlICJSZW5kZXJCbG9jay5o
IgorI2luY2x1ZGUgIlJlbmRlclZpZXcuaCIKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIApAQCAt
MTYxLDkgKzE2MiwxNSBAQCB2b2lkIFJvb3RJbmxpbmVCb3g6OnBhaW50Q3VzdG9tSGlnaGxpZ2h0
CiAKICNlbmRpZgogCi12b2lkIFJvb3RJbmxpbmVCb3g6OnBhaW50KFJlbmRlck9iamVjdDo6UGFp
bnRJbmZvJiBwYWludEluZm8sIGludCB0eCwgaW50IHR5KQordm9pZCBSb290SW5saW5lQm94Ojpw
YWludChSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJbmZvLCBpbnQgdHgsIGludCB0eSwg
TGluZUJveFBhaW50SW5mbyYgbGluZUJveFBhaW50SW5mbykKIHsKLSAgICBJbmxpbmVGbG93Qm94
OjpwYWludChwYWludEluZm8sIHR4LCB0eSk7CisgICAgLy8gT25seSBwYWludCBkdXJpbmcgdGhl
IGZvcmVncm91bmQvc2VsZWN0aW9uIHBoYXNlcy4KKyAgICBpZiAocGFpbnRJbmZvLnBoYXNlICE9
IFBhaW50UGhhc2VGb3JlZ3JvdW5kICYmIHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlU2Vs
ZWN0aW9uICYmIHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlT3V0bGluZSAKKyAgICAgICAg
JiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VTZWxmT3V0bGluZSAmJiBwYWludEluZm8u
cGhhc2UgIT0gUGFpbnRQaGFzZUNoaWxkT3V0bGluZXMgJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBh
aW50UGhhc2VUZXh0Q2xpcAorICAgICAgICAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFz
ZU1hc2spCisgICAgICAgIHJldHVybjsKKworICAgIElubGluZUZsb3dCb3g6OnBhaW50KHBhaW50
SW5mbywgdHgsIHR5LCBsaW5lQm94UGFpbnRJbmZvKTsKICAgICBwYWludEVsbGlwc2lzQm94KHBh
aW50SW5mbywgdHgsIHR5KTsKICNpZiBQTEFURk9STShNQUMpCiAgICAgUmVuZGVyU3R5bGUqIHN0
eWxlVG9Vc2UgPSByZW5kZXJlcigpLT5zdHlsZShtX2ZpcnN0TGluZSk7CkBAIC0xNzIsMTUgKzE3
OSwxOCBAQCB2b2lkIFJvb3RJbmxpbmVCb3g6OnBhaW50KFJlbmRlck9iamVjdDo6CiAjZW5kaWYK
IH0KIAotYm9vbCBSb290SW5saW5lQm94Ojpub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVz
dCYgcmVxdWVzdCwgSGl0VGVzdFJlc3VsdCYgcmVzdWx0LCBpbnQgeCwgaW50IHksIGludCB0eCwg
aW50IHR5KQorYm9vbCBSb290SW5saW5lQm94Ojpub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVx
dWVzdCYgcmVxdWVzdCwgSGl0VGVzdFJlc3VsdCYgcmVzdWx0LCBpbnQgeCwgaW50IHksIGludCB0
eCwgaW50IHR5LCBIaXRUZXN0QWN0aW9uIGhpdFRlc3RBY3Rpb24sIExpbmVCb3hIaXRUZXN0SW5m
byYgaGl0VGVzdEluZm8pCiB7CisgICAgaWYgKGhpdFRlc3RBY3Rpb24gIT0gSGl0VGVzdEZvcmVn
cm91bmQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKwogICAgIGlmIChtX2hhc0VsbGlwc2lzQm94
ICYmIHZpc2libGVUb0hpdFRlc3RpbmcoKSkgewotICAgICAgICBpZiAoZWxsaXBzaXNCb3goKS0+
bm9kZUF0UG9pbnQocmVxdWVzdCwgcmVzdWx0LCB4LCB5LCB0eCwgdHkpKSB7CisgICAgICAgIGlm
IChlbGxpcHNpc0JveCgpLT5ub2RlQXRQb2ludChyZXF1ZXN0LCByZXN1bHQsIHgsIHksIHR4LCB0
eSwgaGl0VGVzdEFjdGlvbiwgaGl0VGVzdEluZm8pKSB7CiAgICAgICAgICAgICByZW5kZXJlcigp
LT51cGRhdGVIaXRUZXN0UmVzdWx0KHJlc3VsdCwgSW50UG9pbnQoeCAtIHR4LCB5IC0gdHkpKTsK
ICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBJ
bmxpbmVGbG93Qm94Ojpub2RlQXRQb2ludChyZXF1ZXN0LCByZXN1bHQsIHgsIHksIHR4LCB0eSk7
CisgICAgcmV0dXJuIElubGluZUZsb3dCb3g6Om5vZGVBdFBvaW50KHJlcXVlc3QsIHJlc3VsdCwg
eCwgeSwgdHgsIHR5LCBIaXRUZXN0Rm9yZWdyb3VuZCwgaGl0VGVzdEluZm8pOwogfQogCiB2b2lk
IFJvb3RJbmxpbmVCb3g6OmFkanVzdFBvc2l0aW9uKGludCBkeCwgaW50IGR5KQpAQCAtMjA0LDYg
KzIxNCwyNCBAQCB2b2lkIFJvb3RJbmxpbmVCb3g6OmNoaWxkUmVtb3ZlZChJbmxpbmVCCiAKIGlu
dCBSb290SW5saW5lQm94Ojp2ZXJ0aWNhbGx5QWxpZ25Cb3hlcyhpbnQgaGVpZ2h0T2ZCbG9jaykK
IHsKKyAgICBSZW5kZXJCbG9jayogaW5saW5lQmxvY2sgPSBhbm9ueW1vdXNJbmxpbmVCbG9jaygp
OworICAgIGlmIChpbmxpbmVCbG9jaykgeworICAgICAgICBpbnQgbGluZVRvcCA9IGlubGluZUJs
b2NrLT55KCk7CisgICAgICAgIGludCBsaW5lQm90dG9tID0gaW5saW5lQmxvY2stPnkoKSArIGlu
bGluZUJsb2NrLT5oZWlnaHQoKTsKKyAgICAgICAgZm9yIChJbmxpbmVCb3gqIGN1cnIgPSBmaXJz
dENoaWxkKCk7IGN1cnI7IGN1cnIgPSBzdGF0aWNfY2FzdDxJbmxpbmVGbG93Qm94Kj4oY3Vycikt
PmZpcnN0Q2hpbGQoKSkgeworICAgICAgICAgICAgY3Vyci0+c2V0WChpbmxpbmVCbG9jay0+eCgp
KTsKKyAgICAgICAgICAgIGN1cnItPnNldFkobGluZVRvcCk7CisgICAgICAgICAgICBjdXJyLT5z
ZXRXaWR0aChpbmxpbmVCbG9jay0+d2lkdGgoKSk7CisgICAgICAgICAgICBpZiAoY3Vyci0+cmVu
ZGVyZXIoKSA9PSBpbmxpbmVCbG9jaykKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
ICAgIHN0YXRpY19jYXN0PElubGluZUZsb3dBbm9ueW1vdXNJbmxpbmVCbG9ja0JveCo+KGN1cnIp
LT5zZXRIZWlnaHQoaW5saW5lQmxvY2stPmhlaWdodCgpKTsKKyAgICAgICAgfQorICAgICAgICBz
ZXRZKGxpbmVUb3ApOworICAgICAgICBjb21wdXRlVmVydGljYWxPdmVyZmxvdyhsaW5lVG9wLCBs
aW5lQm90dG9tLCB0cnVlKTsKKyAgICAgICAgc2V0TGluZVRvcEJvdHRvbVBvc2l0aW9ucyhsaW5l
VG9wLCBsaW5lQm90dG9tKTsKKyAgICAgICAgcmV0dXJuIGhlaWdodE9mQmxvY2s7CisgICAgfQor
ICAgIAogICAgIGludCBtYXhQb3NpdGlvblRvcCA9IDA7CiAgICAgaW50IG1heFBvc2l0aW9uQm90
dG9tID0gMDsKICAgICBpbnQgbWF4QXNjZW50ID0gMDsKQEAgLTIxNyw3ICsyNDUsNiBAQCBpbnQg
Um9vdElubGluZUJveDo6dmVydGljYWxseUFsaWduQm94ZXMoCiAgICAgYm9vbCBzdHJpY3RNb2Rl
ID0gKGN1cnIgJiYgY3Vyci0+ZG9jdW1lbnQoKS0+aW5TdHJpY3RNb2RlKCkpOwogCiAgICAgY29t
cHV0ZUxvZ2ljYWxCb3hIZWlnaHRzKG1heFBvc2l0aW9uVG9wLCBtYXhQb3NpdGlvbkJvdHRvbSwg
bWF4QXNjZW50LCBtYXhEZXNjZW50LCBzdHJpY3RNb2RlKTsKLQogICAgIGlmIChtYXhBc2NlbnQg
KyBtYXhEZXNjZW50IDwgbWF4KG1heFBvc2l0aW9uVG9wLCBtYXhQb3NpdGlvbkJvdHRvbSkpCiAg
ICAgICAgIGFkanVzdE1heEFzY2VudEFuZERlc2NlbnQobWF4QXNjZW50LCBtYXhEZXNjZW50LCBt
YXhQb3NpdGlvblRvcCwgbWF4UG9zaXRpb25Cb3R0b20pOwogCkBAIC0zMzIsNyArMzU5LDcgQEAg
SW5saW5lQm94KiBSb290SW5saW5lQm94OjpsYXN0U2VsZWN0ZWRCbwogaW50IFJvb3RJbmxpbmVC
b3g6OnNlbGVjdGlvblRvcCgpIGNvbnN0CiB7CiAgICAgaW50IHNlbGVjdGlvblRvcCA9IG1fbGlu
ZVRvcDsKLSAgICBpZiAoIXByZXZSb290Qm94KCkpCisgICAgaWYgKCFwcmV2Um9vdEJveCgpIHx8
IHByZXZSb290Qm94KCktPmhhc0Fub255bW91c0lubGluZUJsb2NrKCkpCiAgICAgICAgIHJldHVy
biBzZWxlY3Rpb25Ub3A7CiAKICAgICBpbnQgcHJldkJvdHRvbSA9IHByZXZSb290Qm94KCktPnNl
bGVjdGlvbkJvdHRvbSgpOwpAQCAtNDMwLDQgKzQ1NywyNSBAQCB2b2lkIFJvb3RJbmxpbmVCb3g6
OmF0dGFjaExpbmVCb3hUb1JlbmRlCiAgICAgYmxvY2soKS0+bGluZUJveGVzKCktPmF0dGFjaExp
bmVCb3godGhpcyk7CiB9CiAKK1JlbmRlckJsb2NrKiBSb290SW5saW5lQm94Ojphbm9ueW1vdXNJ
bmxpbmVCbG9jaygpIGNvbnN0Cit7CisgICAgaWYgKGhhc0Fub255bW91c0lubGluZUJsb2NrKCkp
CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBSb290QW5vbnltb3VzSW5saW5lQmxv
Y2tCb3gqPih0aGlzKS0+aW5saW5lQmxvY2soKTsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBS
b290QW5vbnltb3VzSW5saW5lQmxvY2tCb3g6OnBhaW50KFJlbmRlck9iamVjdDo6UGFpbnRJbmZv
JiBwYWludEluZm8sIGludCB0eCwgaW50IHR5LCBMaW5lQm94UGFpbnRJbmZvJiBsaW5lQm94UGFp
bnRJbmZvKQoreworICAgIC8vIFNraXAgdGhlIGV4dHJhIHdvcmsgZG9uZSBieSBSb290SW5saW5l
Qm94OjpwYWludC4gQ2FjaGUgb3VyIGFub255bW91cyBibG9jayBpbiB0aGUgcGFpbnQgaW5mbyBm
b3IgZWFzeQorICAgIC8vIGFjY2VzcyBhcyB3ZSByZWN1ciBpbnRvIHRoZSBsaW5lLgorICAgIGxp
bmVCb3hQYWludEluZm8uYW5vbnltb3VzSW5saW5lQmxvY2sgPSBtX2Fub255bW91c0lubGluZUJs
b2NrOworICAgIElubGluZUZsb3dCb3g6OnBhaW50KHBhaW50SW5mbywgdHgsIHR5LCBsaW5lQm94
UGFpbnRJbmZvKTsKK30KKworYm9vbCBSb290QW5vbnltb3VzSW5saW5lQmxvY2tCb3g6Om5vZGVB
dFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiByZXF1ZXN0LCBIaXRUZXN0UmVzdWx0JiByZXN1
bHQsIGludCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHksIEhpdFRlc3RBY3Rpb24gaGl0VGVzdEFj
dGlvbiwgTGluZUJveEhpdFRlc3RJbmZvJiBoaXRUZXN0SW5mbykKK3sKKyAgICAvLyBTa2lwIHRo
ZSBleHRyYSB3b3JrIGRvbmUgYnkgUm9vdElubGluZUJveDo6bm9kZUF0UG9pbnQuCisgICAgcmV0
dXJuIElubGluZUZsb3dCb3g6Om5vZGVBdFBvaW50KHJlcXVlc3QsIHJlc3VsdCwgeCwgeSwgdHgs
IHR5LCBoaXRUZXN0QWN0aW9uLCBoaXRUZXN0SW5mbyk7Cit9CisKIH0gLy8gbmFtZXNwYWNlIFdl
YkNvcmUKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1Jvb3RJbmxpbmVCb3guaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9Sb290SW5saW5lQm94LmgJKHJldmlzaW9uIDU0NzI3KQor
KysgV2ViQ29yZS9yZW5kZXJpbmcvUm9vdElubGluZUJveC5oCSh3b3JraW5nIGNvcHkpCkBAIC00
MCw2ICs0MCw3IEBAIHB1YmxpYzoKICAgICAgICAgLCBtX2xpbmVCcmVha1BvcygwKQogICAgICAg
ICAsIG1fbGluZVRvcCgwKQogICAgICAgICAsIG1fbGluZUJvdHRvbSgwKQorICAgICAgICAsIG1f
aGFzQW5vbnltb3VzSW5saW5lQmxvY2soZmFsc2UpCiAgICAgewogICAgIH0KIApAQCAtMTAxLDgg
KzEwMiw4IEBAIHB1YmxpYzoKICAgICB2b2lkIHBhaW50Q3VzdG9tSGlnaGxpZ2h0KFJlbmRlck9i
amVjdDo6UGFpbnRJbmZvJiwgaW50IHR4LCBpbnQgdHksIGNvbnN0IEF0b21pY1N0cmluZyYgaGln
aGxpZ2h0VHlwZSk7CiAjZW5kaWYKIAotICAgIHZpcnR1YWwgdm9pZCBwYWludChSZW5kZXJPYmpl
Y3Q6OlBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5KTsKLSAgICB2aXJ0dWFsIGJvb2wgbm9kZUF0
UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVzdWx0JiwgaW50LCBpbnQsIGlu
dCwgaW50KTsKKyAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoUmVuZGVyT2JqZWN0OjpQYWludEluZm8m
LCBpbnQgdHgsIGludCB0eSwgTGluZUJveFBhaW50SW5mbyYpOworICAgIHZpcnR1YWwgYm9vbCBu
b2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBpbnQgeCwg
aW50IHksIGludCB0eCwgaW50IHR5LCBIaXRUZXN0QWN0aW9uLCBMaW5lQm94SGl0VGVzdEluZm8m
KTsKIAogICAgIGJvb2wgaGFzU2VsZWN0ZWRDaGlsZHJlbigpIGNvbnN0IHsgcmV0dXJuIG1faGFz
U2VsZWN0ZWRDaGlsZHJlbjsgfQogICAgIHZvaWQgc2V0SGFzU2VsZWN0ZWRDaGlsZHJlbihib29s
KTsKQEAgLTEzMiw2ICsxMzMsMTEgQEAgcHVibGljOgogICAgIHZpcnR1YWwgdm9pZCBhdHRhY2hM
aW5lQm94VG9SZW5kZXJPYmplY3QoKTsKICAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlTGluZUJveEZy
b21SZW5kZXJPYmplY3QoKTsKIAorICAgIGJvb2wgaGFzQW5vbnltb3VzSW5saW5lQmxvY2soKSBj
b25zdCB7IHJldHVybiBtX2hhc0Fub255bW91c0lubGluZUJsb2NrOyB9CisgICAgdm9pZCBzZXRI
YXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpIHsgbV9oYXNBbm9ueW1vdXNJbmxpbmVCbG9jayA9IHRy
dWU7IH0KKworICAgIFJlbmRlckJsb2NrKiBhbm9ueW1vdXNJbmxpbmVCbG9jaygpIGNvbnN0Owor
CiBwcm90ZWN0ZWQ6CiAgICAgLy8gV2hlcmUgdGhpcyBsaW5lIGVuZGVkLiAgVGhlIGV4YWN0IG9i
amVjdCBhbmQgdGhlIHBvc2l0aW9uIHdpdGhpbiB0aGF0IG9iamVjdCBhcmUgc3RvcmVkIHNvIHRo
YXQKICAgICAvLyB3ZSBjYW4gY3JlYXRlIGFuIElubGluZUl0ZXJhdG9yIGJlZ2lubmluZyBqdXN0
IGFmdGVyIHRoZSBlbmQgb2YgdGhpcyBsaW5lLgpAQCAtMTUyLDYgKzE1OCw4IEBAIHByb3RlY3Rl
ZDoKICAgICBXVEY6OlVuaWNvZGU6OkRpcmVjdGlvbiBtX2xpbmVCcmVha0JpZGlTdGF0dXNFb3Ig
OiA1OwogICAgIFdURjo6VW5pY29kZTo6RGlyZWN0aW9uIG1fbGluZUJyZWFrQmlkaVN0YXR1c0xh
c3RTdHJvbmcgOiA1OwogICAgIFdURjo6VW5pY29kZTo6RGlyZWN0aW9uIG1fbGluZUJyZWFrQmlk
aVN0YXR1c0xhc3QgOiA1OworICAgIAorICAgIGJvb2wgbV9oYXNBbm9ueW1vdXNJbmxpbmVCbG9j
ayA6IDE7CiB9OwogCiBpbmxpbmUgdm9pZCBSb290SW5saW5lQm94OjpzZXRMaW5lVG9wQm90dG9t
UG9zaXRpb25zKGludCB0b3AsIGludCBib3R0b20pIApAQCAtMTYwLDYgKzE2OCwyNiBAQCBpbmxp
bmUgdm9pZCBSb290SW5saW5lQm94OjpzZXRMaW5lVG9wQm90CiAgICAgbV9saW5lQm90dG9tID0g
Ym90dG9tOyAKIH0KIAorLy8gRm9yIGFub255bW91cyBpbmxpbmUgYmxvY2sgb2JqZWN0cy4KK2Ns
YXNzIFJvb3RBbm9ueW1vdXNJbmxpbmVCbG9ja0JveCA6IHB1YmxpYyBSb290SW5saW5lQm94Cit7
CitwdWJsaWM6CisgICAgUm9vdEFub255bW91c0lubGluZUJsb2NrQm94KFJlbmRlck9iamVjdCog
cm9vdEJsb2NrLCBSZW5kZXJCbG9jayogYW5vbnltb3VzQmxvY2spCisgICAgICAgIDogUm9vdElu
bGluZUJveChyb290QmxvY2spCisgICAgICAgICwgbV9hbm9ueW1vdXNJbmxpbmVCbG9jayhhbm9u
eW1vdXNCbG9jaykKKyAgICB7CisgICAgICAgIHNldEhhc0Fub255bW91c0lubGluZUJsb2NrKCk7
CisgICAgfQorICAgIAorICAgIFJlbmRlckJsb2NrKiBpbmxpbmVCbG9jaygpIGNvbnN0IHsgcmV0
dXJuIG1fYW5vbnltb3VzSW5saW5lQmxvY2s7IH0KKyAgICAKKyAgICB2aXJ0dWFsIHZvaWQgcGFp
bnQoUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgaW50IHR4LCBpbnQgdHksIExp
bmVCb3hQYWludEluZm8mKTsKKyAgICB2aXJ0dWFsIGJvb2wgbm9kZUF0UG9pbnQoY29uc3QgSGl0
VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVzdWx0JiwgaW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0
eSwgSGl0VGVzdEFjdGlvbiwgTGluZUJveEhpdFRlc3RJbmZvJik7CisgICAgCitwcml2YXRlOgor
ICAgIFJlbmRlckJsb2NrKiBtX2Fub255bW91c0lubGluZUJsb2NrOworfTsKKwogfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQogCiAjZW5kaWYgLy8gUm9vdElubGluZUJveF9oCkluZGV4OiBXZWJDb3Jl
L3JlbmRlcmluZy9TVkdJbmxpbmVUZXh0Qm94LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3Jl
bmRlcmluZy9TVkdJbmxpbmVUZXh0Qm94LmNwcAkocmV2aXNpb24gNTQ3MjcpCisrKyBXZWJDb3Jl
L3JlbmRlcmluZy9TVkdJbmxpbmVUZXh0Qm94LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjkxLDcg
KzI5MSw3IEBAIGludCBTVkdJbmxpbmVUZXh0Qm94Ojpwb3NpdGlvbkZvck9mZnNldCgKICAgICBy
ZXR1cm4gMDsKIH0KIAotYm9vbCBTVkdJbmxpbmVUZXh0Qm94Ojpub2RlQXRQb2ludChjb25zdCBI
aXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmIHJlc3VsdCwgaW50IHgsIGludCB5LCBpbnQg
dHgsIGludCB0eSkKK2Jvb2wgU1ZHSW5saW5lVGV4dEJveDo6bm9kZUF0UG9pbnQoY29uc3QgSGl0
VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVzdWx0JiByZXN1bHQsIGludCB4LCBpbnQgeSwgaW50IHR4
LCBpbnQgdHksIEhpdFRlc3RBY3Rpb24sIExpbmVCb3hIaXRUZXN0SW5mbyYpCiB7CiAgICAgQVNT
RVJUKCFpc0xpbmVCcmVhaygpKTsKIApJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvU1ZHSW5saW5l
VGV4dEJveC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1NWR0lubGluZVRleHRC
b3guaAkocmV2aXNpb24gNTQ3MjcpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9TVkdJbmxpbmVUZXh0
Qm94LmgJKHdvcmtpbmcgY29weSkKQEAgLTYxLDcgKzYxLDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUg
ewogICAgICAgICB2aXJ0dWFsIGludCBvZmZzZXRGb3JQb3NpdGlvbihpbnQgeCwgYm9vbCBpbmNs
dWRlUGFydGlhbEdseXBocyA9IHRydWUpIGNvbnN0OwogICAgICAgICB2aXJ0dWFsIGludCBwb3Np
dGlvbkZvck9mZnNldChpbnQgb2Zmc2V0KSBjb25zdDsKIAotICAgICAgICB2aXJ0dWFsIGJvb2wg
bm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVzdWx0JiwgaW50IHgs
IGludCB5LCBpbnQgdHgsIGludCB0eSk7CisgICAgICAgIHZpcnR1YWwgYm9vbCBub2RlQXRQb2lu
dChjb25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBpbnQgeCwgaW50IHksIGlu
dCB0eCwgaW50IHR5LCBIaXRUZXN0QWN0aW9uLCBMaW5lQm94SGl0VGVzdEluZm8mKTsKICAgICAg
ICAgdmlydHVhbCBJbnRSZWN0IHNlbGVjdGlvblJlY3QoaW50IGFic3gsIGludCBhYnN5LCBpbnQg
c3RhcnRQb3MsIGludCBlbmRQb3MpOwogCiAgICAgICAgIC8vIFNWR3MgY3VzdG9tIHBhaW50IHRl
eHQgbWV0aG9kCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>48766</attachid>
            <date>2010-02-15 11:57:16 -0800</date>
            <delta_ts>2010-06-10 20:57:29 -0700</delta_ts>
            <desc>Fix the determineStartPosition problem</desc>
            <filename>patch.txt</filename>
            <type>text/plain</type>
            <size>150018</size>
            <attacher name="Dave Hyatt">hyatt</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0LmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eVJlbmRl
ck9iamVjdC5jcHAJKHJldmlzaW9uIDU0Nzc1KQorKysgV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0Fj
Y2Vzc2liaWxpdHlSZW5kZXJPYmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01NjcsMTIgKzU2
Nyw4IEBAIEVsZW1lbnQqIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmFuY2gKICAgICBSZW5k
ZXJPYmplY3QqIGN1cnJSZW5kZXJlcjsKICAgICAKICAgICAvLyBTZWFyY2ggdXAgdGhlIHJlbmRl
ciB0cmVlIGZvciBhIFJlbmRlck9iamVjdCB3aXRoIGEgRE9NIG5vZGUuICBEZWZlciB0byBhbiBl
YXJsaWVyIGNvbnRpbnVhdGlvbiwgdGhvdWdoLgotICAgIGZvciAoY3VyclJlbmRlcmVyID0gbV9y
ZW5kZXJlcjsgY3VyclJlbmRlcmVyICYmICFjdXJyUmVuZGVyZXItPm5vZGUoKTsgY3VyclJlbmRl
cmVyID0gY3VyclJlbmRlcmVyLT5wYXJlbnQoKSkgewotICAgICAgICBpZiAoY3VyclJlbmRlcmVy
LT5pc1JlbmRlckJsb2NrKCkpIHsKLSAgICAgICAgICAgIFJlbmRlcklubGluZSogY29udGludWF0
aW9uID0gdG9SZW5kZXJCbG9jayhjdXJyUmVuZGVyZXIpLT5pbmxpbmVDb250aW51YXRpb24oKTsK
LSAgICAgICAgICAgIGlmIChjb250aW51YXRpb24pCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNh
Y2hlLT5nZXRPckNyZWF0ZShjb250aW51YXRpb24pLT5hbmNob3JFbGVtZW50KCk7Ci0gICAgICAg
IH0KKyAgICBmb3IgKGN1cnJSZW5kZXJlciA9IG1fcmVuZGVyZXI7IGN1cnJSZW5kZXJlciAmJiAh
Y3VyclJlbmRlcmVyLT5ub2RlKCk7IGN1cnJSZW5kZXJlciA9IGN1cnJSZW5kZXJlci0+cGFyZW50
KCkpCisgICAgewogICAgIH0KICAgICAKICAgICAvLyBiYWlsIGlmIG5vbmUgZm91bmQKSW5kZXg6
IFdlYkNvcmUvcmVuZGVyaW5nL0VsbGlwc2lzQm94LmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3JlbmRlcmluZy9FbGxpcHNpc0JveC5jcHAJKHJldmlzaW9uIDU0Nzc1KQorKysgV2ViQ29yZS9y
ZW5kZXJpbmcvRWxsaXBzaXNCb3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC02NCw3ICs2NCw4IEBA
IHZvaWQgRWxsaXBzaXNCb3g6OnBhaW50KFJlbmRlck9iamVjdDo6UGEKICAgICAgICAgLy8gUGFp
bnQgdGhlIG1hcmt1cCBib3gKICAgICAgICAgdHggKz0gbV94ICsgbV93aWR0aCAtIG1fbWFya3Vw
Qm94LT54KCk7CiAgICAgICAgIHR5ICs9IG1feSArIHN0eWxlLT5mb250KCkuYXNjZW50KCkgLSAo
bV9tYXJrdXBCb3gtPnkoKSArIG1fbWFya3VwQm94LT5yZW5kZXJlcigpLT5zdHlsZShtX2ZpcnN0
TGluZSktPmZvbnQoKS5hc2NlbnQoKSk7Ci0gICAgICAgIG1fbWFya3VwQm94LT5wYWludChwYWlu
dEluZm8sIHR4LCB0eSk7CisgICAgICAgIExpbmVCb3hQYWludEluZm8gbGluZUJveFBhaW50SW5m
bzsKKyAgICAgICAgbV9tYXJrdXBCb3gtPnBhaW50KHBhaW50SW5mbywgdHgsIHR5LCBsaW5lQm94
UGFpbnRJbmZvKTsKICAgICB9CiB9CiAKQEAgLTk3LDcgKzk4LDcgQEAgdm9pZCBFbGxpcHNpc0Jv
eDo6cGFpbnRTZWxlY3Rpb24oR3JhcGhpYwogICAgIGNvbnRleHQtPnJlc3RvcmUoKTsKIH0KIAot
Ym9vbCBFbGxpcHNpc0JveDo6bm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmIHJlcXVl
c3QsIEhpdFRlc3RSZXN1bHQmIHJlc3VsdCwgaW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSkK
K2Jvb2wgRWxsaXBzaXNCb3g6Om5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiByZXF1
ZXN0LCBIaXRUZXN0UmVzdWx0JiByZXN1bHQsIGludCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHks
IEhpdFRlc3RBY3Rpb24gaGl0VGVzdEFjdGlvbiwgTGluZUJveEhpdFRlc3RJbmZvJiBoaXRUZXN0
SW5mbykKIHsKICAgICB0eCArPSBtX3g7CiAgICAgdHkgKz0gbV95OwpAQCAtMTA3LDcgKzEwOCw3
IEBAIGJvb2wgRWxsaXBzaXNCb3g6Om5vZGVBdFBvaW50KGNvbnN0IEhpdFQKICAgICAgICAgUmVu
ZGVyU3R5bGUqIHN0eWxlID0gbV9yZW5kZXJlci0+c3R5bGUobV9maXJzdExpbmUpOwogICAgICAg
ICBpbnQgbXR4ID0gdHggKyBtX3dpZHRoIC0gbV9tYXJrdXBCb3gtPngoKTsKICAgICAgICAgaW50
IG10eSA9IHR5ICsgc3R5bGUtPmZvbnQoKS5hc2NlbnQoKSAtIChtX21hcmt1cEJveC0+eSgpICsg
bV9tYXJrdXBCb3gtPnJlbmRlcmVyKCktPnN0eWxlKG1fZmlyc3RMaW5lKS0+Zm9udCgpLmFzY2Vu
dCgpKTsKLSAgICAgICAgaWYgKG1fbWFya3VwQm94LT5ub2RlQXRQb2ludChyZXF1ZXN0LCByZXN1
bHQsIHgsIHksIG10eCwgbXR5KSkgeworICAgICAgICBpZiAobV9tYXJrdXBCb3gtPm5vZGVBdFBv
aW50KHJlcXVlc3QsIHJlc3VsdCwgeCwgeSwgbXR4LCBtdHksIGhpdFRlc3RBY3Rpb24sIGhpdFRl
c3RJbmZvKSkgewogICAgICAgICAgICAgcmVuZGVyZXIoKS0+dXBkYXRlSGl0VGVzdFJlc3VsdChy
ZXN1bHQsIEludFBvaW50KHggLSBtdHgsIHkgLSBtdHkpKTsKICAgICAgICAgICAgIHJldHVybiB0
cnVlOwogICAgICAgICB9CkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9FbGxpcHNpc0JveC5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL0VsbGlwc2lzQm94LmgJKHJldmlzaW9uIDU0
Nzc1KQorKysgV2ViQ29yZS9yZW5kZXJpbmcvRWxsaXBzaXNCb3guaAkod29ya2luZyBjb3B5KQpA
QCAtMzksOCArMzksOCBAQCBwdWJsaWM6CiAgICAgewogICAgIH0KIAotICAgIHZpcnR1YWwgdm9p
ZCBwYWludChSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5KTsKLSAgICB2
aXJ0dWFsIGJvb2wgbm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVz
dWx0JiwgaW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSk7CisgICAgdm9pZCBwYWludChSZW5k
ZXJPYmplY3Q6OlBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5KTsKKyAgICB2aXJ0dWFsIGJvb2wg
bm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVzdWx0JiwgaW50IHgs
IGludCB5LCBpbnQgdHgsIGludCB0eSwgSGl0VGVzdEFjdGlvbiwgTGluZUJveEhpdFRlc3RJbmZv
Jik7CiAgICAgdm9pZCBzZXRTZWxlY3Rpb25TdGF0ZShSZW5kZXJPYmplY3Q6OlNlbGVjdGlvblN0
YXRlIHMpIHsgbV9zZWxlY3Rpb25TdGF0ZSA9IHM7IH0KICAgICBJbnRSZWN0IHNlbGVjdGlvblJl
Y3QoaW50IHR4LCBpbnQgdHkpOwogCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVCb3gu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUJveC5jcHAJKHJldmlz
aW9uIDU0Nzc1KQorKysgV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lQm94LmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgIkhpdFRlc3RSZXN1bHQuaCIKICNpbmNs
dWRlICJJbmxpbmVGbG93Qm94LmgiCiAjaW5jbHVkZSAiUmVuZGVyQXJlbmEuaCIKLSNpbmNsdWRl
ICJSZW5kZXJCb3guaCIKKyNpbmNsdWRlICJSZW5kZXJWaWV3LmgiCiAjaW5jbHVkZSAiUm9vdElu
bGluZUJveC5oIgogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwpAQCAtMTU5LDkgKzE1OSwyNyBAQCB2
b2lkIElubGluZUJveDo6YWRqdXN0UG9zaXRpb24oaW50IGR4LCBpCiAgICAgfQogfQogCi12b2lk
IElubGluZUJveDo6cGFpbnQoUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgaW50
IHR4LCBpbnQgdHkpCit2b2lkIElubGluZUJveDo6cGFpbnQoUmVuZGVyT2JqZWN0OjpQYWludElu
Zm8mIHBhaW50SW5mbywgaW50IHR4LCBpbnQgdHksIExpbmVCb3hQYWludEluZm8mIGxpbmVCb3hQ
YWludEluZm8pCiB7Ci0gICAgaWYgKCFyZW5kZXJlcigpLT5zaG91bGRQYWludFdpdGhpblJvb3Qo
cGFpbnRJbmZvKSB8fCAocGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VGb3JlZ3JvdW5kICYm
IHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlU2VsZWN0aW9uKSkKKyAgICBpZiAoIXJlbmRl
cmVyKCktPnNob3VsZFBhaW50V2l0aGluUm9vdChwYWludEluZm8pKQorICAgICAgICByZXR1cm47
CisgICAgCisgICAgUmVuZGVyQmxvY2sqIGFub255bW91c0lubGluZUJsb2NrID0gbGluZUJveFBh
aW50SW5mby5hbm9ueW1vdXNJbmxpbmVCbG9jazsKKyAgICBpZiAoYW5vbnltb3VzSW5saW5lQmxv
Y2sgPT0gcmVuZGVyZXIoKSkgeworICAgICAgICAvLyBUcmVhdCBwYWludGluZyBvZiBhIHNwZWNp
YWwgaW5saW5lLWJsb2NrIGxpbmUgbGlrZSB0aGUgcGFpbnRpbmcgb2YgYSBub3JtYWwgYmxvY2sg
YW5kIGdvIHRocm91Z2ggYWxsIHBoYXNlcy4KKyAgICAgICAgUGFpbnRQaGFzZSBuZXdQaGFzZSA9
IChwYWludEluZm8ucGhhc2UgPT0gUGFpbnRQaGFzZUNoaWxkT3V0bGluZXMpID8gUGFpbnRQaGFz
ZU91dGxpbmUgOiBwYWludEluZm8ucGhhc2U7CisgICAgICAgIG5ld1BoYXNlID0gKG5ld1BoYXNl
ID09IFBhaW50UGhhc2VDaGlsZEJsb2NrQmFja2dyb3VuZHMpID8gUGFpbnRQaGFzZUNoaWxkQmxv
Y2tCYWNrZ3JvdW5kIDogbmV3UGhhc2U7CisgICAgCisgICAgICAgIC8vIFdlIGRvbid0IHBhaW50
IG91ciBvd24gYmFja2dyb3VuZCwgYnV0IHdlIGRvIGxldCB0aGUgY2hpbGQgcGFpbnQgaXRzIGJh
Y2tncm91bmQuCisgICAgICAgIFJlbmRlck9iamVjdDo6UGFpbnRJbmZvIGluZm8ocGFpbnRJbmZv
KTsKKyAgICAgICAgaW5mby5waGFzZSA9IG5ld1BoYXNlOworICAgICAgICBpbmZvLnBhaW50aW5n
Um9vdCA9IHJlbmRlcmVyKCktPnBhaW50aW5nUm9vdEZvckNoaWxkcmVuKHBhaW50SW5mbyk7Cisg
ICAgICAgIGlmICghYW5vbnltb3VzSW5saW5lQmxvY2stPmhhc1NlbGZQYWludGluZ0xheWVyKCkp
CisgICAgICAgICAgICBhbm9ueW1vdXNJbmxpbmVCbG9jay0+cGFpbnQoaW5mbywgdHgsIHR5KTsK
KyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChwYWludEluZm8ucGhhc2UgIT0gUGFp
bnRQaGFzZUZvcmVncm91bmQgJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VTZWxlY3Rp
b24pCiAgICAgICAgIHJldHVybjsKIAogICAgIC8vIFBhaW50IGFsbCBwaGFzZXMgb2YgcmVwbGFj
ZWQgZWxlbWVudHMgYXRvbWljYWxseSwgYXMgdGhvdWdoIHRoZSByZXBsYWNlZCBlbGVtZW50IGVz
dGFibGlzaGVkIGl0cwpAQCAtMTgzLDkgKzIwMSwxNyBAQCB2b2lkIElubGluZUJveDo6cGFpbnQo
UmVuZGVyT2JqZWN0OjpQYWluCiAgICAgfQogfQogCi1ib29sIElubGluZUJveDo6bm9kZUF0UG9p
bnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmIHJlcXVlc3QsIEhpdFRlc3RSZXN1bHQmIHJlc3VsdCwg
aW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSkKK2Jvb2wgSW5saW5lQm94Ojpub2RlQXRQb2lu
dChjb25zdCBIaXRUZXN0UmVxdWVzdCYgcmVxdWVzdCwgSGl0VGVzdFJlc3VsdCYgcmVzdWx0LCBp
bnQgeCwgaW50IHksIGludCB0eCwgaW50IHR5LCBIaXRUZXN0QWN0aW9uIGhpdFRlc3RBY3Rpb24s
IExpbmVCb3hIaXRUZXN0SW5mbyYgaGl0VGVzdEluZm8pCiB7Ci0gICAgLy8gSGl0IHRlc3QgYWxs
IHBoYXNlcyBvZiByZXBsYWNlZCBlbGVtZW50cyBhdG9taWNhbGx5LCBhcyB0aG91Z2ggdGhlIHJl
cGxhY2VkIGVsZW1lbnQgZXN0YWJsaXNoZWQgaXRzCisgICAgLy8gSWYgd2UgYXJlIGFuIGFub255
bW91cyBpbmxpbmUgYmxvY2ssIGhvbm9yIGhpdCB0ZXN0IHBoYXNlcy4KKyAgICBpZiAoaGl0VGVz
dEluZm8uYW5vbnltb3VzSW5saW5lQmxvY2sgPT0gcmVuZGVyZXIoKSkgeworICAgICAgICBIaXRU
ZXN0QWN0aW9uIGNoaWxkSGl0VGVzdCA9IGhpdFRlc3RBY3Rpb247CisgICAgICAgIGlmIChoaXRU
ZXN0QWN0aW9uID09IEhpdFRlc3RDaGlsZEJsb2NrQmFja2dyb3VuZHMpCisgICAgICAgICAgICBj
aGlsZEhpdFRlc3QgPSBIaXRUZXN0Q2hpbGRCbG9ja0JhY2tncm91bmQ7CisgICAgICAgIHJldHVy
biBoaXRUZXN0SW5mby5hbm9ueW1vdXNJbmxpbmVCbG9jay0+bm9kZUF0UG9pbnQocmVxdWVzdCwg
cmVzdWx0LCB4LCB5LCB0eCwgdHksIGNoaWxkSGl0VGVzdCk7CisgICAgfQorCisgICAgLy8gT3Ro
ZXJ3aXNlIGhpdCB0ZXN0IGFsbCBwaGFzZXMgb2YgcmVwbGFjZWQgZWxlbWVudHMgYXRvbWljYWxs
eSwgYXMgdGhvdWdoIHRoZSByZXBsYWNlZCBlbGVtZW50IGVzdGFibGlzaGVkIGl0cwogICAgIC8v
IG93biBzdGFja2luZyBjb250ZXh0LiAgKFNlZSBBcHBlbmRpeCBFLjIsIHNlY3Rpb24gNi40IG9u
IGlubGluZSBibG9jay90YWJsZSBlbGVtZW50cyBpbiB0aGUgQ1NTMi4xCiAgICAgLy8gc3BlY2lm
aWNhdGlvbi4pCiAgICAgcmV0dXJuIHJlbmRlcmVyKCktPmhpdFRlc3QocmVxdWVzdCwgcmVzdWx0
LCBJbnRQb2ludCh4LCB5KSwgdHgsIHR5KTsKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL0lubGlu
ZUJveC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUJveC5oCShyZXZp
c2lvbiA1NDc3NSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUJveC5oCSh3b3JraW5nIGNv
cHkpCkBAIC0zMCw2ICszMCwyMyBAQCBjbGFzcyBIaXRUZXN0UmVxdWVzdDsKIGNsYXNzIEhpdFRl
c3RSZXN1bHQ7CiBjbGFzcyBSb290SW5saW5lQm94OwogCitzdHJ1Y3QgTGluZUJveFBhaW50SW5m
bworeworICAgIExpbmVCb3hQYWludEluZm8oKQorICAgICAgICA6IGFub255bW91c0lubGluZUJs
b2NrKDApCisgICAgeyB9CisgICAgCisgICAgUmVuZGVyQmxvY2sqIGFub255bW91c0lubGluZUJs
b2NrOworfTsKKworc3RydWN0IExpbmVCb3hIaXRUZXN0SW5mbworeworICAgIExpbmVCb3hIaXRU
ZXN0SW5mbygpCisgICAgICAgIDogYW5vbnltb3VzSW5saW5lQmxvY2soMCkKKyAgICB7IH0KKyAg
ICAKKyAgICBSZW5kZXJCbG9jayogYW5vbnltb3VzSW5saW5lQmxvY2s7Cit9OwogCiAvLyBJbmxp
bmVCb3ggcmVwcmVzZW50cyBhIHJlY3RhbmdsZSB0aGF0IG9jY3VycyBvbiBhIGxpbmUuICBJdCBj
b3JyZXNwb25kcyB0bwogLy8gc29tZSBSZW5kZXJPYmplY3QgKGkuZS4sIGl0IHJlcHJlc2VudHMg
YSBwb3J0aW9uIG9mIHRoYXQgUmVuZGVyT2JqZWN0KS4KQEAgLTQ4LDkgKzY1LDcgQEAgcHVibGlj
OgogICAgICAgICAsIG1fYmlkaUVtYmVkZGluZ0xldmVsKDApCiAgICAgICAgICwgbV9kaXJ0eShm
YWxzZSkKICAgICAgICAgLCBtX2V4dHJhY3RlZChmYWxzZSkKLSNpZiBFTkFCTEUoU1ZHKQogICAg
ICAgICAsIG1faGFzVmlydHVhbEhlaWdodChmYWxzZSkKLSNlbmRpZgogICAgICAgICAsIG1fZW5k
c1dpdGhCcmVhayhmYWxzZSkKICAgICAgICAgLCBtX2hhc1NlbGVjdGVkQ2hpbGRyZW4oZmFsc2Up
CiAgICAgICAgICwgbV9oYXNFbGxpcHNpc0JveChmYWxzZSkKQEAgLTgxLDkgKzk2LDcgQEAgcHVi
bGljOgogICAgICAgICAsIG1fYmlkaUVtYmVkZGluZ0xldmVsKDApCiAgICAgICAgICwgbV9kaXJ0
eShkaXJ0eSkKICAgICAgICAgLCBtX2V4dHJhY3RlZChleHRyYWN0ZWQpCi0jaWYgRU5BQkxFKFNW
RykKICAgICAgICAgLCBtX2hhc1ZpcnR1YWxIZWlnaHQoZmFsc2UpCi0jZW5kaWYKICAgICAgICAg
LCBtX2VuZHNXaXRoQnJlYWsoZmFsc2UpCiAgICAgICAgICwgbV9oYXNTZWxlY3RlZENoaWxkcmVu
KGZhbHNlKSAgIAogICAgICAgICAsIG1faGFzRWxsaXBzaXNCb3goZmFsc2UpCkBAIC0xMTIsOCAr
MTI1LDggQEAgcHVibGljOgogCiAgICAgdmlydHVhbCB2b2lkIGFkanVzdFBvc2l0aW9uKGludCBk
eCwgaW50IGR5KTsKIAotICAgIHZpcnR1YWwgdm9pZCBwYWludChSZW5kZXJPYmplY3Q6OlBhaW50
SW5mbyYsIGludCB0eCwgaW50IHR5KTsKLSAgICB2aXJ0dWFsIGJvb2wgbm9kZUF0UG9pbnQoY29u
c3QgSGl0VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVzdWx0JiwgaW50IHgsIGludCB5LCBpbnQgdHgs
IGludCB0eSk7CisgICAgdmlydHVhbCB2b2lkIHBhaW50KFJlbmRlck9iamVjdDo6UGFpbnRJbmZv
JiwgaW50IHR4LCBpbnQgdHksIExpbmVCb3hQYWludEluZm8mKTsKKyAgICB2aXJ0dWFsIGJvb2wg
bm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVzdWx0JiwgaW50IHgs
IGludCB5LCBpbnQgdHgsIGludCB0eSwgSGl0VGVzdEFjdGlvbiwgTGluZUJveEhpdFRlc3RJbmZv
Jik7CiAKICAgICAvLyBPdmVybG9hZGVkIG5ldyBvcGVyYXRvci4KICAgICB2b2lkKiBvcGVyYXRv
ciBuZXcoc2l6ZV90LCBSZW5kZXJBcmVuYSopIHRocm93KCk7CkBAIC0xMzksMTEgKzE1MiwxMSBA
QCBwdWJsaWM6CiAgICAgdmlydHVhbCBib29sIGlzUm9vdElubGluZUJveCgpIGNvbnN0IHsgcmV0
dXJuIGZhbHNlOyB9CiAjaWYgRU5BQkxFKFNWRykgCiAgICAgdmlydHVhbCBib29sIGlzU1ZHUm9v
dElubGluZUJveCgpIHsgcmV0dXJuIGZhbHNlOyB9CisjZW5kaWYKIAogICAgIGJvb2wgaGFzVmly
dHVhbEhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1faGFzVmlydHVhbEhlaWdodDsgfQogICAgIHZv
aWQgc2V0SGFzVmlydHVhbEhlaWdodCgpIHsgbV9oYXNWaXJ0dWFsSGVpZ2h0ID0gdHJ1ZTsgfQog
ICAgIHZpcnR1YWwgaW50IHZpcnR1YWxIZWlnaHQoKSBjb25zdCB7IEFTU0VSVF9OT1RfUkVBQ0hF
RCgpOyByZXR1cm4gMDsgfQotI2VuZGlmCiAgICAgCiAgICAgYm9vbCBpc0NvbnN0cnVjdGVkKCkg
eyByZXR1cm4gbV9jb25zdHJ1Y3RlZDsgfQogICAgIHZpcnR1YWwgdm9pZCBzZXRDb25zdHJ1Y3Rl
ZCgpCkBAIC0yMDUsNiArMjE4LDggQEAgcHVibGljOgogCiAgICAgaW50IGhlaWdodCgpIGNvbnN0
OwogCisgICAgSW50UmVjdCBmcmFtZVJlY3QoKSBjb25zdCB7IHJldHVybiBJbnRSZWN0KHgoKSwg
eSgpLCB3aWR0aCgpLCBoZWlnaHQoKSk7IH0KKwogICAgIGlubGluZSBpbnQgYmFzZWxpbmVQb3Np
dGlvbihib29sIGlzUm9vdExpbmVCb3gpIGNvbnN0IHsgcmV0dXJuIHJlbmRlcmVyKCktPmJhc2Vs
aW5lUG9zaXRpb24obV9maXJzdExpbmUsIGlzUm9vdExpbmVCb3gpOyB9CiAgICAgaW5saW5lIGlu
dCBsaW5lSGVpZ2h0KGJvb2wgaXNSb290TGluZUJveCkgY29uc3QgeyByZXR1cm4gcmVuZGVyZXIo
KS0+bGluZUhlaWdodChtX2ZpcnN0TGluZSwgaXNSb290TGluZUJveCk7IH0KIApJbmRleDogV2Vi
Q29yZS9yZW5kZXJpbmcvSW5saW5lRmxvd0JveC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9y
ZW5kZXJpbmcvSW5saW5lRmxvd0JveC5jcHAJKHJldmlzaW9uIDU0Nzc1KQorKysgV2ViQ29yZS9y
ZW5kZXJpbmcvSW5saW5lRmxvd0JveC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMyLDYgKzMyLDcg
QEAKICNpbmNsdWRlICJSZW5kZXJMYXllci5oIgogI2luY2x1ZGUgIlJlbmRlckxpc3RNYXJrZXIu
aCIKICNpbmNsdWRlICJSZW5kZXJUYWJsZUNlbGwuaCIKKyNpbmNsdWRlICJSZW5kZXJWaWV3Lmgi
CiAjaW5jbHVkZSAiUm9vdElubGluZUJveC5oIgogI2luY2x1ZGUgIlRleHQuaCIKIApAQCAtMjI3
LDE0ICsyMjgsMTMgQEAgdm9pZCBJbmxpbmVGbG93Qm94OjpkZXRlcm1pbmVTcGFjaW5nRm9yRgog
ICAgICAgICAvLyAoMykgVGhlIGxpbmUgbWF5IGVuZCBvbiB0aGUgaW5saW5lLiAgSWYgd2UgYXJl
IHRoZSBsYXN0IGNoaWxkIChjbGltYmluZyB1cAogICAgICAgICAvLyB0aGUgZW5kIG9iamVjdCdz
IGNoYWluKSwgdGhlbiB3ZSBqdXN0IGNsb3NlZCBhcyB3ZWxsLgogICAgICAgICBpZiAoIWxpbmVC
b3hMaXN0LT5sYXN0TGluZUJveCgpLT5pc0NvbnN0cnVjdGVkKCkpIHsKLSAgICAgICAgICAgIFJl
bmRlcklubGluZSogaW5saW5lRmxvdyA9IHRvUmVuZGVySW5saW5lKHJlbmRlcmVyKCkpOwogICAg
ICAgICAgICAgaWYgKGx0cikgewogICAgICAgICAgICAgICAgIGlmICghbmV4dExpbmVCb3goKSAm
JgotICAgICAgICAgICAgICAgICAgICAoKGxhc3RMaW5lICYmICFpbmxpbmVGbG93LT5jb250aW51
YXRpb24oKSkgfHwgbmV4dE9uTGluZUV4aXN0cygpIHx8IG9uRW5kQ2hhaW4oZW5kT2JqZWN0KSkp
CisgICAgICAgICAgICAgICAgICAgIChsYXN0TGluZSB8fCBuZXh0T25MaW5lRXhpc3RzKCkgfHwg
b25FbmRDaGFpbihlbmRPYmplY3QpKSkKICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZVJpZ2h0
RWRnZSA9IHRydWU7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmICgo
IXByZXZMaW5lQm94KCkgfHwgcHJldkxpbmVCb3goKS0+aXNDb25zdHJ1Y3RlZCgpKSAmJgotICAg
ICAgICAgICAgICAgICAgICAoKGxhc3RMaW5lICYmICFpbmxpbmVGbG93LT5jb250aW51YXRpb24o
KSkgfHwgcHJldk9uTGluZUV4aXN0cygpIHx8IG9uRW5kQ2hhaW4oZW5kT2JqZWN0KSkpCisgICAg
ICAgICAgICAgICAgICAgIChsYXN0TGluZSB8fCBwcmV2T25MaW5lRXhpc3RzKCkgfHwgb25FbmRD
aGFpbihlbmRPYmplY3QpKSkKICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZUxlZnRFZGdlID0g
dHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNTA0LDcgKzUwNCw3IEBAIHZvaWQg
SW5saW5lRmxvd0JveDo6cGxhY2VCb3hlc1ZlcnRpY2FsbHkKICAgICAgICAgICAgICAgICBuZXdZ
IC09IGN1cnItPmJveE1vZGVsT2JqZWN0KCktPmJvcmRlclRvcCgpICsgY3Vyci0+Ym94TW9kZWxP
YmplY3QoKS0+cGFkZGluZ1RvcCgpOwogICAgICAgICB9IGVsc2UgaWYgKCFjdXJyLT5yZW5kZXJl
cigpLT5pc0JSKCkpIHsKICAgICAgICAgICAgIFJlbmRlckJveCogYm94ID0gdG9SZW5kZXJCb3go
Y3Vyci0+cmVuZGVyZXIoKSk7Ci0gICAgICAgICAgICBuZXdZICs9IGJveC0+bWFyZ2luVG9wKCk7
CisgICAgICAgICAgICBuZXdZICs9IGN1cnItPnJlbmRlcmVyKCktPmlzQW5vbnltb3VzSW5saW5l
QmxvY2soKSA/IDAgOiBib3gtPm1hcmdpblRvcCgpOwogICAgICAgICB9CiAKICAgICAgICAgY3Vy
ci0+c2V0WShuZXdZKTsKQEAgLTU5OCw4ICs1OTgsMTIgQEAgdm9pZCBJbmxpbmVGbG93Qm94Ojpj
b21wdXRlVmVydGljYWxPdmVyZgogICAgIHNldFZlcnRpY2FsT3ZlcmZsb3dQb3NpdGlvbnModG9w
TGF5b3V0T3ZlcmZsb3csIGJvdHRvbUxheW91dE92ZXJmbG93LCB0b3BWaXN1YWxPdmVyZmxvdywg
Ym90dG9tVmlzdWFsT3ZlcmZsb3csIGJveEhlaWdodCk7CiB9CiAKLWJvb2wgSW5saW5lRmxvd0Jv
eDo6bm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmIHJlcXVlc3QsIEhpdFRlc3RSZXN1
bHQmIHJlc3VsdCwgaW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSkKK2Jvb2wgSW5saW5lRmxv
d0JveDo6bm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmIHJlcXVlc3QsIEhpdFRlc3RS
ZXN1bHQmIHJlc3VsdCwgaW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSwgSGl0VGVzdEFjdGlv
biBoaXRUZXN0QWN0aW9uLCBMaW5lQm94SGl0VGVzdEluZm8mIGhpdFRlc3RJbmZvKQogeworICAg
IC8vIEFzIGxvbmcgYXMgd2UgZG9uJ3QgaGF2ZSBhbiBhbm9ueW1vdXMgaW5saW5lIGJsb2NrIG9u
IG91ciBsaW5lLCB3ZSByZXN0cmljdCBvdXIgaGl0IHRlc3Rpbmcgb25seSB0byB0aGUgZm9yZWdy
b3VuZCBwaGFzZS4KKyAgICBpZiAoIWhpdFRlc3RJbmZvLmFub255bW91c0lubGluZUJsb2NrICYm
IGhpdFRlc3RBY3Rpb24gIT0gSGl0VGVzdEZvcmVncm91bmQpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKwogICAgIEludFJlY3Qgb3ZlcmZsb3dSZWN0KHZpc2libGVPdmVyZmxvd1JlY3QoKSk7CiAg
ICAgb3ZlcmZsb3dSZWN0Lm1vdmUodHgsIHR5KTsKICAgICBpZiAoIW92ZXJmbG93UmVjdC5jb250
YWlucyh4LCB5KSkKQEAgLTYwNyw3ICs2MTEsNyBAQCBib29sIElubGluZUZsb3dCb3g6Om5vZGVB
dFBvaW50KGNvbnN0IEhpCiAKICAgICAvLyBDaGVjayBjaGlsZHJlbiBmaXJzdC4KICAgICBmb3Ig
KElubGluZUJveCogY3VyciA9IGxhc3RDaGlsZCgpOyBjdXJyOyBjdXJyID0gY3Vyci0+cHJldk9u
TGluZSgpKSB7Ci0gICAgICAgIGlmICgoY3Vyci0+cmVuZGVyZXIoKS0+aXNUZXh0KCkgfHwgIWN1
cnItPmJveE1vZGVsT2JqZWN0KCktPmhhc1NlbGZQYWludGluZ0xheWVyKCkpICYmIGN1cnItPm5v
ZGVBdFBvaW50KHJlcXVlc3QsIHJlc3VsdCwgeCwgeSwgdHgsIHR5KSkgeworICAgICAgICBpZiAo
KGN1cnItPnJlbmRlcmVyKCktPmlzVGV4dCgpIHx8ICFjdXJyLT5ib3hNb2RlbE9iamVjdCgpLT5o
YXNTZWxmUGFpbnRpbmdMYXllcigpKSAmJiBjdXJyLT5ub2RlQXRQb2ludChyZXF1ZXN0LCByZXN1
bHQsIHgsIHksIHR4LCB0eSwgaGl0VGVzdEFjdGlvbiwgaGl0VGVzdEluZm8pKSB7CiAgICAgICAg
ICAgICByZW5kZXJlcigpLT51cGRhdGVIaXRUZXN0UmVzdWx0KHJlc3VsdCwgSW50UG9pbnQoeCAt
IHR4LCB5IC0gdHkpKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CkBAIC02
MjMsOCArNjI3LDE0IEBAIGJvb2wgSW5saW5lRmxvd0JveDo6bm9kZUF0UG9pbnQoY29uc3QgSGkK
ICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXZvaWQgSW5saW5lRmxvd0JveDo6cGFpbnQoUmVuZGVy
T2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgaW50IHR4LCBpbnQgdHkpCit2b2lkIElubGlu
ZUZsb3dCb3g6OnBhaW50KFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGludCB0
eCwgaW50IHR5LCBMaW5lQm94UGFpbnRJbmZvJiBsaW5lQm94UGFpbnRJbmZvKQogeworICAgIC8v
IEFzIGxvbmcgYXMgd2UgZG9uJ3QgaGF2ZSBhbiBhbm9ueW1vdXMgaW5saW5lIGJsb2NrIG9uIG91
ciBsaW5lLCB3ZSByZXN0cmljdCBvdXIgcGFpbnRpbmcgb25seSB0byBhIGZldyBwaGFzZXMuCisg
ICAgaWYgKCFsaW5lQm94UGFpbnRJbmZvLmFub255bW91c0lubGluZUJsb2NrICYmIChwYWludElu
Zm8ucGhhc2UgIT0gUGFpbnRQaGFzZUZvcmVncm91bmQgJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBh
aW50UGhhc2VTZWxlY3Rpb24gJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VPdXRsaW5l
IAorICAgICAgICAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZVNlbGZPdXRsaW5lICYm
IHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlQ2hpbGRPdXRsaW5lcyAmJiBwYWludEluZm8u
cGhhc2UgIT0gUGFpbnRQaGFzZVRleHRDbGlwCisgICAgICAgICYmIHBhaW50SW5mby5waGFzZSAh
PSBQYWludFBoYXNlTWFzaykpCisgICAgICAgIHJldHVybjsKKyAgICAKICAgICBJbnRSZWN0IG92
ZXJmbG93UmVjdCh2aXNpYmxlT3ZlcmZsb3dSZWN0KCkpOwogICAgIG92ZXJmbG93UmVjdC5pbmZs
YXRlKHJlbmRlcmVyKCktPm1heGltYWxPdXRsaW5lU2l6ZShwYWludEluZm8ucGhhc2UpKTsKICAg
ICBvdmVyZmxvd1JlY3QubW92ZSh0eCwgdHkpOwpAQCAtNjM4LDIzICs2NDgsMTcgQEAgdm9pZCBJ
bmxpbmVGbG93Qm94OjpwYWludChSZW5kZXJPYmplY3Q6OgogICAgICAgICAgICAgLy8gb3V0bGlu
ZXMuCiAgICAgICAgICAgICBpZiAocmVuZGVyZXIoKS0+c3R5bGUoKS0+dmlzaWJpbGl0eSgpID09
IFZJU0lCTEUgJiYgcmVuZGVyZXIoKS0+aGFzT3V0bGluZSgpICYmICFpc1Jvb3RJbmxpbmVCb3go
KSkgewogICAgICAgICAgICAgICAgIFJlbmRlcklubGluZSogaW5saW5lRmxvdyA9IHRvUmVuZGVy
SW5saW5lKHJlbmRlcmVyKCkpOwotICAgICAgICAgICAgICAgIGlmICgoaW5saW5lRmxvdy0+Y29u
dGludWF0aW9uKCkgfHwgaW5saW5lRmxvdy0+aXNJbmxpbmVDb250aW51YXRpb24oKSkgJiYgIWJv
eE1vZGVsT2JqZWN0KCktPmhhc1NlbGZQYWludGluZ0xheWVyKCkpIHsKLSAgICAgICAgICAgICAg
ICAgICAgLy8gQWRkIG91cnNlbHZlcyB0byB0aGUgY29udGFpbmluZyBibG9jayBvZiB0aGUgZW50
aXJlIGNvbnRpbnVhdGlvbiBzbyB0aGF0IGl0IGNhbgotICAgICAgICAgICAgICAgICAgICAvLyBw
YWludCB1cyBhdG9taWNhbGx5LgotICAgICAgICAgICAgICAgICAgICBSZW5kZXJCbG9jayogYmxv
Y2sgPSByZW5kZXJlcigpLT5jb250YWluaW5nQmxvY2soKS0+Y29udGFpbmluZ0Jsb2NrKCk7Ci0g
ICAgICAgICAgICAgICAgICAgIGJsb2NrLT5hZGRDb250aW51YXRpb25XaXRoT3V0bGluZSh0b1Jl
bmRlcklubGluZShyZW5kZXJlcigpLT5ub2RlKCktPnJlbmRlcmVyKCkpKTsKLSAgICAgICAgICAg
ICAgICB9IGVsc2UgaWYgKCFpbmxpbmVGbG93LT5pc0lubGluZUNvbnRpbnVhdGlvbigpKQotICAg
ICAgICAgICAgICAgICAgICBwYWludEluZm8ub3V0bGluZU9iamVjdHMtPmFkZChpbmxpbmVGbG93
KTsKKyAgICAgICAgICAgICAgICBwYWludEluZm8ub3V0bGluZU9iamVjdHMtPmFkZChpbmxpbmVG
bG93KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChwYWludEluZm8ucGhhc2Ug
PT0gUGFpbnRQaGFzZU1hc2spIHsKLSAgICAgICAgICAgIHBhaW50TWFzayhwYWludEluZm8sIHR4
LCB0eSk7CisgICAgICAgICAgICBwYWludE1hc2socGFpbnRJbmZvLCB0eCwgdHksIGxpbmVCb3hQ
YWludEluZm8pOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9IGVsc2UgewogICAgICAg
ICAgICAgLy8gMS4gUGFpbnQgb3VyIGJhY2tncm91bmQsIGJvcmRlciBhbmQgYm94LXNoYWRvdy4K
LSAgICAgICAgICAgIHBhaW50Qm94RGVjb3JhdGlvbnMocGFpbnRJbmZvLCB0eCwgdHkpOworICAg
ICAgICAgICAgcGFpbnRCb3hEZWNvcmF0aW9ucyhwYWludEluZm8sIHR4LCB0eSwgbGluZUJveFBh
aW50SW5mbyk7CiAKICAgICAgICAgICAgIC8vIDIuIFBhaW50IG91ciB1bmRlcmxpbmUgYW5kIG92
ZXJsaW5lLgotICAgICAgICAgICAgcGFpbnRUZXh0RGVjb3JhdGlvbnMocGFpbnRJbmZvLCB0eCwg
dHksIGZhbHNlKTsKKyAgICAgICAgICAgIHBhaW50VGV4dERlY29yYXRpb25zKHBhaW50SW5mbywg
dHgsIHR5LCBmYWxzZSwgbGluZUJveFBhaW50SW5mbyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAg
LTY3MCwxMyArNjc0LDEzIEBAIHZvaWQgSW5saW5lRmxvd0JveDo6cGFpbnQoUmVuZGVyT2JqZWN0
OjoKICAgICBpZiAocGFpbnRQaGFzZSAhPSBQYWludFBoYXNlU2VsZk91dGxpbmUpIHsKICAgICAg
ICAgZm9yIChJbmxpbmVCb3gqIGN1cnIgPSBmaXJzdENoaWxkKCk7IGN1cnI7IGN1cnIgPSBjdXJy
LT5uZXh0T25MaW5lKCkpIHsKICAgICAgICAgICAgIGlmIChjdXJyLT5yZW5kZXJlcigpLT5pc1Rl
eHQoKSB8fCAhY3Vyci0+Ym94TW9kZWxPYmplY3QoKS0+aGFzU2VsZlBhaW50aW5nTGF5ZXIoKSkK
LSAgICAgICAgICAgICAgICBjdXJyLT5wYWludChjaGlsZEluZm8sIHR4LCB0eSk7CisgICAgICAg
ICAgICAgICAgY3Vyci0+cGFpbnQoY2hpbGRJbmZvLCB0eCwgdHksIGxpbmVCb3hQYWludEluZm8p
OwogICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gNC4gUGFpbnQgb3VyIHN0cmlrZS10aHJvdWdo
CiAgICAgaWYgKHBhaW50SW5mby5waGFzZSA9PSBQYWludFBoYXNlRm9yZWdyb3VuZCB8fCBwYWlu
dEluZm8ucGhhc2UgPT0gUGFpbnRQaGFzZVNlbGVjdGlvbikKLSAgICAgICAgcGFpbnRUZXh0RGVj
b3JhdGlvbnMocGFpbnRJbmZvLCB0eCwgdHksIHRydWUpOworICAgICAgICBwYWludFRleHREZWNv
cmF0aW9ucyhwYWludEluZm8sIHR4LCB0eSwgdHJ1ZSwgbGluZUJveFBhaW50SW5mbyk7CiB9CiAK
IHZvaWQgSW5saW5lRmxvd0JveDo6cGFpbnRGaWxsTGF5ZXJzKGNvbnN0IFJlbmRlck9iamVjdDo6
UGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IENvbG9yJiBjLCBjb25zdCBGaWxsTGF5ZXIqIGZp
bGxMYXllciwgaW50IF90eCwgaW50IF90eSwgaW50IHcsIGludCBoLCBDb21wb3NpdGVPcGVyYXRv
ciBvcCkKQEAgLTcyNyw5ICs3MzEsOSBAQCB2b2lkIElubGluZUZsb3dCb3g6OnBhaW50Qm94U2hh
ZG93KEdyYXBoCiAgICAgfQogfQogCi12b2lkIElubGluZUZsb3dCb3g6OnBhaW50Qm94RGVjb3Jh
dGlvbnMoUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgaW50IHR4LCBpbnQgdHkp
Cit2b2lkIElubGluZUZsb3dCb3g6OnBhaW50Qm94RGVjb3JhdGlvbnMoUmVuZGVyT2JqZWN0OjpQ
YWludEluZm8mIHBhaW50SW5mbywgaW50IHR4LCBpbnQgdHksIExpbmVCb3hQYWludEluZm8mIGxp
bmVCb3hQYWludEluZm8pCiB7Ci0gICAgaWYgKCFyZW5kZXJlcigpLT5zaG91bGRQYWludFdpdGhp
blJvb3QocGFpbnRJbmZvKSB8fCByZW5kZXJlcigpLT5zdHlsZSgpLT52aXNpYmlsaXR5KCkgIT0g
VklTSUJMRSB8fCBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZUZvcmVncm91bmQpCisgICAg
aWYgKCFyZW5kZXJlcigpLT5zaG91bGRQYWludFdpdGhpblJvb3QocGFpbnRJbmZvKSB8fCByZW5k
ZXJlcigpLT5zdHlsZSgpLT52aXNpYmlsaXR5KCkgIT0gVklTSUJMRSB8fCBwYWludEluZm8ucGhh
c2UgIT0gUGFpbnRQaGFzZUZvcmVncm91bmQgfHwgbGluZUJveFBhaW50SW5mby5hbm9ueW1vdXNJ
bmxpbmVCbG9jaykKICAgICAgICAgcmV0dXJuOwogCiAgICAgaW50IHggPSBtX3g7CkBAIC04MDMs
OSArODA3LDkgQEAgdm9pZCBJbmxpbmVGbG93Qm94OjpwYWludEJveERlY29yYXRpb25zKAogICAg
IH0KIH0KIAotdm9pZCBJbmxpbmVGbG93Qm94OjpwYWludE1hc2soUmVuZGVyT2JqZWN0OjpQYWlu
dEluZm8mIHBhaW50SW5mbywgaW50IHR4LCBpbnQgdHkpCit2b2lkIElubGluZUZsb3dCb3g6OnBh
aW50TWFzayhSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJbmZvLCBpbnQgdHgsIGludCB0
eSwgTGluZUJveFBhaW50SW5mbyYgbGluZUJveFBhaW50SW5mbykKIHsKLSAgICBpZiAoIXJlbmRl
cmVyKCktPnNob3VsZFBhaW50V2l0aGluUm9vdChwYWludEluZm8pIHx8IHJlbmRlcmVyKCktPnN0
eWxlKCktPnZpc2liaWxpdHkoKSAhPSBWSVNJQkxFIHx8IHBhaW50SW5mby5waGFzZSAhPSBQYWlu
dFBoYXNlTWFzaykKKyAgICBpZiAoIXJlbmRlcmVyKCktPnNob3VsZFBhaW50V2l0aGluUm9vdChw
YWludEluZm8pIHx8IHJlbmRlcmVyKCktPnN0eWxlKCktPnZpc2liaWxpdHkoKSAhPSBWSVNJQkxF
IHx8IHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlTWFzayB8fCBsaW5lQm94UGFpbnRJbmZv
LmFub255bW91c0lubGluZUJsb2NrKQogICAgICAgICByZXR1cm47CiAKICAgICBpbnQgeCA9IG1f
eDsKQEAgLTg5NSwxMiArODk5LDEyIEBAIHN0YXRpYyBib29sIHNob3VsZERyYXdUZXh0RGVjb3Jh
dGlvbihSZW4KICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXZvaWQgSW5saW5lRmxvd0JveDo6cGFp
bnRUZXh0RGVjb3JhdGlvbnMoUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgaW50
IHR4LCBpbnQgdHksIGJvb2wgcGFpbnRlZENoaWxkcmVuKQordm9pZCBJbmxpbmVGbG93Qm94Ojpw
YWludFRleHREZWNvcmF0aW9ucyhSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJbmZvLCBp
bnQgdHgsIGludCB0eSwgYm9vbCBwYWludGVkQ2hpbGRyZW4sIExpbmVCb3hQYWludEluZm8mIGxp
bmVCb3hQYWludEluZm8pCiB7CiAgICAgLy8gUGFpbnQgdGV4dCBkZWNvcmF0aW9ucyBsaWtlIHVu
ZGVybGluZXMvb3ZlcmxpbmVzLiBXZSBvbmx5IGRvIHRoaXMgaWYgd2UgYXJlbid0IGluIHF1aXJr
cyBtb2RlIChpLmUuLCBpbgogICAgIC8vIGFsbW9zdC1zdHJpY3QgbW9kZSBvciBzdHJpY3QgbW9k
ZSkuCiAgICAgaWYgKHJlbmRlcmVyKCktPnN0eWxlKCktPmh0bWxIYWNrcygpIHx8ICFyZW5kZXJl
cigpLT5zaG91bGRQYWludFdpdGhpblJvb3QocGFpbnRJbmZvKSB8fAotICAgICAgICByZW5kZXJl
cigpLT5zdHlsZSgpLT52aXNpYmlsaXR5KCkgIT0gVklTSUJMRSkKKyAgICAgICAgcmVuZGVyZXIo
KS0+c3R5bGUoKS0+dmlzaWJpbGl0eSgpICE9IFZJU0lCTEUgfHwgbGluZUJveFBhaW50SW5mby5h
bm9ueW1vdXNJbmxpbmVCbG9jaykKICAgICAgICAgcmV0dXJuOwogICAgIAogICAgIC8vIFdlIGRv
bid0IHdhbnQgdW5kZXJsaW5lcyBvciBvdGhlciBkZWNvcmF0aW9ucyB3aGVuIHdlJ3JlIHRyeWlu
ZyB0byBkcmF3IG5vdGhpbmcgYnV0IHRoZSBzZWxlY3Rpb24gYXMgd2hpdGUgdGV4dC4KSW5kZXg6
IFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZUZsb3dCb3guaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3JlbmRlcmluZy9JbmxpbmVGbG93Qm94LmgJKHJldmlzaW9uIDU0Nzc1KQorKysgV2ViQ29yZS9y
ZW5kZXJpbmcvSW5saW5lRmxvd0JveC5oCSh3b3JraW5nIGNvcHkpCkBAIC0zOCw2ICszOCw3IEBA
IHB1YmxpYzoKICAgICAgICAgLCBtX2xhc3RDaGlsZCgwKQogICAgICAgICAsIG1faW5jbHVkZUxl
ZnRFZGdlKGZhbHNlKQogICAgICAgICAsIG1faW5jbHVkZVJpZ2h0RWRnZShmYWxzZSkKKyAgICAg
ICAgLCBtX2hhc0Fub255bW91c0lubGluZUJsb2NrKGZhbHNlKQogI2lmbmRlZiBOREVCVUcKICAg
ICAgICAgLCBtX2hhc0JhZENoaWxkTGlzdChmYWxzZSkKICNlbmRpZgpAQCAtODQsMTQgKzg1LDE0
IEBAIHB1YmxpYzoKIAogICAgIHZpcnR1YWwgdm9pZCBjbGVhclRydW5jYXRpb24oKTsKIAotICAg
IHZpcnR1YWwgdm9pZCBwYWludEJveERlY29yYXRpb25zKFJlbmRlck9iamVjdDo6UGFpbnRJbmZv
JiwgaW50IHR4LCBpbnQgdHkpOwotICAgIHZpcnR1YWwgdm9pZCBwYWludE1hc2soUmVuZGVyT2Jq
ZWN0OjpQYWludEluZm8mLCBpbnQgdHgsIGludCB0eSk7CisgICAgdm9pZCBwYWludEJveERlY29y
YXRpb25zKFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiwgaW50IHR4LCBpbnQgdHksIExpbmVCb3hQ
YWludEluZm8mKTsKKyAgICB2b2lkIHBhaW50TWFzayhSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYs
IGludCB0eCwgaW50IHR5LCBMaW5lQm94UGFpbnRJbmZvJik7CiAgICAgdm9pZCBwYWludEZpbGxM
YXllcnMoY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBjb25zdCBDb2xvciYsIGNvbnN0
IEZpbGxMYXllciosIGludCB0eCwgaW50IHR5LCBpbnQgdywgaW50IGgsIENvbXBvc2l0ZU9wZXJh
dG9yID0gQ29tcG9zaXRlU291cmNlT3Zlcik7CiAgICAgdm9pZCBwYWludEZpbGxMYXllcihjb25z
dCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGNvbnN0IENvbG9yJiwgY29uc3QgRmlsbExheWVy
KiwgaW50IHR4LCBpbnQgdHksIGludCB3LCBpbnQgaCwgQ29tcG9zaXRlT3BlcmF0b3IgPSBDb21w
b3NpdGVTb3VyY2VPdmVyKTsKICAgICB2b2lkIHBhaW50Qm94U2hhZG93KEdyYXBoaWNzQ29udGV4
dCosIFJlbmRlclN0eWxlKiwgU2hhZG93U3R5bGUsIGludCB0eCwgaW50IHR5LCBpbnQgdywgaW50
IGgpOwotICAgIHZpcnR1YWwgdm9pZCBwYWludFRleHREZWNvcmF0aW9ucyhSZW5kZXJPYmplY3Q6
OlBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5LCBib29sIHBhaW50ZWRDaGlsZHJlbiA9IGZhbHNl
KTsKLSAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBpbnQg
dHgsIGludCB0eSk7Ci0gICAgdmlydHVhbCBib29sIG5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RS
ZXF1ZXN0JiwgSGl0VGVzdFJlc3VsdCYsIGludCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHkpOwor
ICAgIHZvaWQgcGFpbnRUZXh0RGVjb3JhdGlvbnMoUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBp
bnQgdHgsIGludCB0eSwgYm9vbCBwYWludGVkQ2hpbGRyZW4sIExpbmVCb3hQYWludEluZm8mKTsK
KyAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBpbnQgdHgs
IGludCB0eSwgTGluZUJveFBhaW50SW5mbyYpOworICAgIHZpcnR1YWwgYm9vbCBub2RlQXRQb2lu
dChjb25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBpbnQgeCwgaW50IHksIGlu
dCB0eCwgaW50IHR5LCBIaXRUZXN0QWN0aW9uLCBMaW5lQm94SGl0VGVzdEluZm8mKTsKIAogICAg
IHZpcnR1YWwgUmVuZGVyTGluZUJveExpc3QqIHJlbmRlcmVyTGluZUJveGVzKCkgY29uc3Q7CiAK
QEAgLTE2MSw2ICsxNjIsOSBAQCBwdWJsaWM6CiAgICAgdm9pZCBzZXRIb3Jpem9udGFsT3ZlcmZs
b3dQb3NpdGlvbnMoaW50IGxlZnRMYXlvdXRPdmVyZmxvdywgaW50IHJpZ2h0TGF5b3V0T3ZlcmZs
b3csIGludCBsZWZ0VmlzdWFsT3ZlcmZsb3csIGludCByaWdodFZpc3VhbE92ZXJmbG93KTsKICAg
ICB2b2lkIHNldFZlcnRpY2FsT3ZlcmZsb3dQb3NpdGlvbnMoaW50IHRvcExheW91dE92ZXJmbG93
LCBpbnQgYm90dG9tTGF5b3V0T3ZlcmZsb3csIGludCB0b3BWaXN1YWxPdmVyZmxvdywgaW50IGJv
dHRvbVZpc3VhbE92ZXJmbG93LCBpbnQgYm94SGVpZ2h0KTsKIAorICAgIGJvb2wgaGFzQW5vbnlt
b3VzSW5saW5lQmxvY2soKSBjb25zdCB7IHJldHVybiBtX2hhc0Fub255bW91c0lubGluZUJsb2Nr
OyB9CisgICAgdm9pZCBzZXRIYXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpIHsgbV9oYXNBbm9ueW1v
dXNJbmxpbmVCbG9jayA9IHRydWU7IH0KKwogcHJvdGVjdGVkOgogICAgIE93blB0cjxSZW5kZXJP
dmVyZmxvdz4gbV9vdmVyZmxvdzsKIApAQCAtMTczLDEyICsxNzcsMzEgQEAgcHJpdmF0ZToKICAg
ICBib29sIG1faW5jbHVkZUxlZnRFZGdlIDogMTsKICAgICBib29sIG1faW5jbHVkZVJpZ2h0RWRn
ZSA6IDE7CiAgICAgYm9vbCBtX2hhc1RleHRDaGlsZHJlbiA6IDE7CisgICAgYm9vbCBtX2hhc0Fu
b255bW91c0lubGluZUJsb2NrOiAxOwogCiAjaWZuZGVmIE5ERUJVRwogICAgIGJvb2wgbV9oYXNC
YWRDaGlsZExpc3Q7CiAjZW5kaWYKIH07CiAKKy8vIEZvciBhbm9ueW1vdXMgaW5saW5lIGJsb2Nr
IG9iamVjdHMuCitjbGFzcyBJbmxpbmVGbG93QW5vbnltb3VzSW5saW5lQmxvY2tCb3ggOiBwdWJs
aWMgSW5saW5lRmxvd0JveAoreworcHVibGljOgorICAgIElubGluZUZsb3dBbm9ueW1vdXNJbmxp
bmVCbG9ja0JveChSZW5kZXJPYmplY3QqIGlubGluZUZsb3cpCisgICAgICAgIDogSW5saW5lRmxv
d0JveChpbmxpbmVGbG93KQorICAgIHsKKyAgICAgICAgc2V0SGFzVmlydHVhbEhlaWdodCgpOwor
ICAgICAgICBzZXRIYXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpOworICAgIH0KKyAgICAKKyAgICB2
aXJ0dWFsIGludCB2aXJ0dWFsSGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gbV9oZWlnaHQ7IH0gLy8g
VGhlIGhlaWdodCBvZiB0aGUgYW5vbnltb3VzIGlubGluZSBibG9jayBiZWxvdyB1cyBpbiB0aGUg
bGluZSBib3ggdHJlZS4KKyAgICB2b2lkIHNldEhlaWdodChpbnQgaCkgeyBtX2hlaWdodCA9IGg7
IH0KKworcHJpdmF0ZToKKyAgICBpbnQgbV9oZWlnaHQ7Cit9OworCiBpbmxpbmUgdm9pZCBJbmxp
bmVGbG93Qm94OjpzZXRIb3Jpem9udGFsT3ZlcmZsb3dQb3NpdGlvbnMoaW50IGxlZnRMYXlvdXRP
dmVyZmxvdywgaW50IHJpZ2h0TGF5b3V0T3ZlcmZsb3csIGludCBsZWZ0VmlzdWFsT3ZlcmZsb3cs
IGludCByaWdodFZpc3VhbE92ZXJmbG93KSAKIHsgCiAgICAgaWYgKCFtX292ZXJmbG93KSB7Cklu
ZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVSdW5Cb3guaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL3JlbmRlcmluZy9JbmxpbmVSdW5Cb3guaAkocmV2aXNpb24gNTQ3NzUpCisrKyBXZWJDb3Jl
L3JlbmRlcmluZy9JbmxpbmVSdW5Cb3guaAkod29ya2luZyBjb3B5KQpAQCAtMzgsMTAgKzM4LDcg
QEAgcHVibGljOgogICAgIElubGluZVJ1bkJveCogbmV4dExpbmVCb3goKSBjb25zdCB7IHJldHVy
biBtX25leHRMaW5lOyB9CiAgICAgdm9pZCBzZXROZXh0TGluZUJveChJbmxpbmVSdW5Cb3gqIG4p
IHsgbV9uZXh0TGluZSA9IG47IH0KICAgICB2b2lkIHNldFByZXZpb3VzTGluZUJveChJbmxpbmVS
dW5Cb3gqIHApIHsgbV9wcmV2TGluZSA9IHA7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBwYWludEJv
eERlY29yYXRpb25zKFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiwgaW50IC8qdHgqLywgaW50IC8q
dHkqLykgeyB9Ci0gICAgdmlydHVhbCB2b2lkIHBhaW50VGV4dERlY29yYXRpb25zKFJlbmRlck9i
amVjdDo6UGFpbnRJbmZvJiwgaW50IC8qdHgqLywgaW50IC8qdHkqLywgYm9vbCAvKnBhaW50ZWRD
aGlsZHJlbiovID0gZmFsc2UpIHsgfQotICAgIAorIAogcHJvdGVjdGVkOgogICAgIElubGluZVJ1
bkJveCogbV9wcmV2TGluZTsgIC8vIFRoZSBwcmV2aW91cyBib3ggdGhhdCBhbHNvIHVzZXMgb3Vy
IFJlbmRlck9iamVjdAogICAgIElubGluZVJ1bkJveCogbV9uZXh0TGluZTsgIC8vIFRoZSBuZXh0
IGJveCB0aGF0IGFsc28gdXNlcyBvdXIgUmVuZGVyT2JqZWN0CkluZGV4OiBXZWJDb3JlL3JlbmRl
cmluZy9JbmxpbmVUZXh0Qm94LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9J
bmxpbmVUZXh0Qm94LmNwcAkocmV2aXNpb24gNTQ3NzUpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9J
bmxpbmVUZXh0Qm94LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjYwLDcgKzI2MCw3IEBAIGJvb2wg
SW5saW5lVGV4dEJveDo6aXNMaW5lQnJlYWsoKSBjb25zdAogICAgIHJldHVybiByZW5kZXJlcigp
LT5pc0JSKCkgfHwgKHJlbmRlcmVyKCktPnN0eWxlKCktPnByZXNlcnZlTmV3bGluZSgpICYmIGxl
bigpID09IDEgJiYgKCp0ZXh0UmVuZGVyZXIoKS0+dGV4dCgpKVtzdGFydCgpXSA9PSAnXG4nKTsK
IH0KIAotYm9vbCBJbmxpbmVUZXh0Qm94Ojpub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVz
dCYsIEhpdFRlc3RSZXN1bHQmIHJlc3VsdCwgaW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSkK
K2Jvb2wgSW5saW5lVGV4dEJveDo6bm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmLCBI
aXRUZXN0UmVzdWx0JiByZXN1bHQsIGludCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHksIEhpdFRl
c3RBY3Rpb24sIExpbmVCb3hIaXRUZXN0SW5mbyYpCiB7CiAgICAgaWYgKGlzTGluZUJyZWFrKCkp
CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTMyNCw3ICszMjQsNyBAQCBzdGF0aWMgdm9pZCBw
YWludFRleHRXaXRoU2hhZG93cyhHcmFwaGljCiAgICAgfSB3aGlsZSAoc2hhZG93IHx8IHN0cm9r
ZWQgfHwgIW9wYXF1ZSk7CiB9CiAKLXZvaWQgSW5saW5lVGV4dEJveDo6cGFpbnQoUmVuZGVyT2Jq
ZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgaW50IHR4LCBpbnQgdHkpCit2b2lkIElubGluZVRl
eHRCb3g6OnBhaW50KFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGludCB0eCwg
aW50IHR5LCBMaW5lQm94UGFpbnRJbmZvJikKIHsKICAgICBpZiAoaXNMaW5lQnJlYWsoKSB8fCAh
cmVuZGVyZXIoKS0+c2hvdWxkUGFpbnRXaXRoaW5Sb290KHBhaW50SW5mbykgfHwgcmVuZGVyZXIo
KS0+c3R5bGUoKS0+dmlzaWJpbGl0eSgpICE9IFZJU0lCTEUgfHwKICAgICAgICAgbV90cnVuY2F0
aW9uID09IGNGdWxsVHJ1bmNhdGlvbiB8fCBwYWludEluZm8ucGhhc2UgPT0gUGFpbnRQaGFzZU91
dGxpbmUpCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVUZXh0Qm94LmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lVGV4dEJveC5oCShyZXZpc2lvbiA1NDc3NSkK
KysrIFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZVRleHRCb3guaAkod29ya2luZyBjb3B5KQpAQCAt
NzQsOCArNzQsOCBAQCBwdWJsaWM6CiAgICAgdm9pZCBzZWxlY3Rpb25TdGFydEVuZChpbnQmIHNQ
b3MsIGludCYgZVBvcyk7CiAKIHByaXZhdGU6Ci0gICAgdmlydHVhbCB2b2lkIHBhaW50KFJlbmRl
ck9iamVjdDo6UGFpbnRJbmZvJiwgaW50IHR4LCBpbnQgdHkpOwotICAgIHZpcnR1YWwgYm9vbCBu
b2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBpbnQgeCwg
aW50IHksIGludCB0eCwgaW50IHR5KTsKKyAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoUmVuZGVyT2Jq
ZWN0OjpQYWludEluZm8mLCBpbnQgdHgsIGludCB0eSwgTGluZUJveFBhaW50SW5mbyYpOworICAg
IHZpcnR1YWwgYm9vbCBub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RS
ZXN1bHQmLCBpbnQgeCwgaW50IHksIGludCB0eCwgaW50IHR5LCBIaXRUZXN0QWN0aW9uLCBMaW5l
Qm94SGl0VGVzdEluZm8mKTsKIAogcHVibGljOgogICAgIFJlbmRlclRleHQqIHRleHRSZW5kZXJl
cigpIGNvbnN0OwpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmNwcAkocmV2aXNpb24gNTQ3
NzUpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTc3LDggKzc3LDYgQEAgc3RhdGljIFBlcmNlbnRIZWlnaHREZXNjZW5kYW50c01hcCogZ1Bl
cgogCiB0eXBlZGVmIFdURjo6SGFzaE1hcDxjb25zdCBSZW5kZXJCb3gqLCBIYXNoU2V0PFJlbmRl
ckJsb2NrKj4qPiBQZXJjZW50SGVpZ2h0Q29udGFpbmVyTWFwOwogc3RhdGljIFBlcmNlbnRIZWln
aHRDb250YWluZXJNYXAqIGdQZXJjZW50SGVpZ2h0Q29udGFpbmVyTWFwID0gMDsKLSAgICAKLXR5
cGVkZWYgV1RGOjpIYXNoTWFwPFJlbmRlckJsb2NrKiwgTGlzdEhhc2hTZXQ8UmVuZGVySW5saW5l
Kj4qPiBDb250aW51YXRpb25PdXRsaW5lVGFibGVNYXA7CiAKIHR5cGVkZWYgV1RGOjpIYXNoU2V0
PFJlbmRlckJsb2NrKj4gRGVsYXllZFVwZGF0ZVNjcm9sbEluZm9TZXQ7CiBzdGF0aWMgaW50IGdE
ZWxheVVwZGF0ZVNjcm9sbEluZm8gPSAwOwpAQCAtOTEsNyArODksNyBAQCBSZW5kZXJCbG9jazo6
TWFyZ2luSW5mbzo6TWFyZ2luSW5mbyhSZW5kCiAgICAgLy8gaWYgd2UgaGFkIGFueSBib3JkZXIv
cGFkZGluZyAob2J2aW91c2x5KSwgaWYgd2UncmUgdGhlIHJvb3Qgb3IgSFRNTCBlbGVtZW50cywg
b3IgaWYKICAgICAvLyB3ZSdyZSBwb3NpdGlvbmVkLCBmbG9hdGluZywgYSB0YWJsZSBjZWxsLgog
ICAgIG1fY2FuQ29sbGFwc2VXaXRoQ2hpbGRyZW4gPSAhYmxvY2stPmlzUmVuZGVyVmlldygpICYm
ICFibG9jay0+aXNSb290KCkgJiYgIWJsb2NrLT5pc1Bvc2l0aW9uZWQoKSAmJgotICAgICAgICAh
YmxvY2stPmlzRmxvYXRpbmcoKSAmJiAhYmxvY2stPmlzVGFibGVDZWxsKCkgJiYgIWJsb2NrLT5o
YXNPdmVyZmxvd0NsaXAoKSAmJiAhYmxvY2stPmlzSW5saW5lQmxvY2tPcklubGluZVRhYmxlKCk7
CisgICAgICAgICFibG9jay0+aXNGbG9hdGluZygpICYmICFibG9jay0+aXNUYWJsZUNlbGwoKSAm
JiAhYmxvY2stPmhhc092ZXJmbG93Q2xpcCgpICYmICghYmxvY2stPmlzSW5saW5lQmxvY2tPcklu
bGluZVRhYmxlKCkgfHwgYmxvY2stPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSk7CiAKICAgICBt
X2NhbkNvbGxhcHNlVG9wV2l0aENoaWxkcmVuID0gbV9jYW5Db2xsYXBzZVdpdGhDaGlsZHJlbiAm
JiAodG9wID09IDApICYmIGJsb2NrLT5zdHlsZSgpLT5tYXJnaW5Ub3BDb2xsYXBzZSgpICE9IE1T
RVBBUkFURTsKIApAQCAtMTIwLDcgKzExOCw2IEBAIFJlbmRlckJsb2NrOjpSZW5kZXJCbG9jayhO
b2RlKiBub2RlKQogICAgICAgOiBSZW5kZXJCb3gobm9kZSkKICAgICAgICwgbV9mbG9hdGluZ09i
amVjdHMoMCkKICAgICAgICwgbV9wb3NpdGlvbmVkT2JqZWN0cygwKQotICAgICAgLCBtX2lubGlu
ZUNvbnRpbnVhdGlvbigwKQogICAgICAgLCBtX21heE1hcmdpbigwKQogICAgICAgLCBtX2xpbmVI
ZWlnaHQoLTEpCiB7CkBAIC0xNjEsMTQgKzE1OCw2IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmRlc3Ry
b3koKQogICAgIC8vIE1ha2Ugc3VyZSB0byBkZXN0cm95IGFub255bW91cyBjaGlsZHJlbiBmaXJz
dCB3aGlsZSB0aGV5IGFyZSBzdGlsbCBjb25uZWN0ZWQgdG8gdGhlIHJlc3Qgb2YgdGhlIHRyZWUs
IHNvIHRoYXQgdGhleSB3aWxsCiAgICAgLy8gcHJvcGVybHkgZGlydHkgbGluZSBib3hlcyB0aGF0
IHRoZXkgYXJlIHJlbW92ZWQgZnJvbS4gRWZmZWN0cyB0aGF0IGRvIDpiZWZvcmUvOmFmdGVyIG9u
bHkgb24gaG92ZXIgY291bGQgY3Jhc2ggb3RoZXJ3aXNlLgogICAgIGNoaWxkcmVuKCktPmRlc3Ry
b3lMZWZ0b3ZlckNoaWxkcmVuKCk7Ci0KLSAgICAvLyBEZXN0cm95IG91ciBjb250aW51YXRpb24g
YmVmb3JlIGFueXRoaW5nIG90aGVyIHRoYW4gYW5vbnltb3VzIGNoaWxkcmVuLgotICAgIC8vIFRo
ZSByZWFzb24gd2UgZG9uJ3QgZGVzdHJveSBpdCBiZWZvcmUgYW5vbnltb3VzIGNoaWxkcmVuIGlz
IHRoYXQgdGhleSBtYXkKLSAgICAvLyBoYXZlIGNvbnRpbnVhdGlvbnMgb2YgdGhlaXIgb3duIHRo
YXQgYXJlIGFub255bW91cyBjaGlsZHJlbiBvZiBvdXIgY29udGludWF0aW9uLgotICAgIGlmICht
X2lubGluZUNvbnRpbnVhdGlvbikgewotICAgICAgICBtX2lubGluZUNvbnRpbnVhdGlvbi0+ZGVz
dHJveSgpOwotICAgICAgICBtX2lubGluZUNvbnRpbnVhdGlvbiA9IDA7Ci0gICAgfQogICAgIAog
ICAgIGlmICghZG9jdW1lbnRCZWluZ0Rlc3Ryb3llZCgpKSB7CiAgICAgICAgIGlmIChmaXJzdExp
bmVCb3goKSkgewpAQCAtMzE2LDcgKzMwNSw3IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmFkZENoaWxk
KFJlbmRlck9iamVjdCoKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoIWNoaWxkcmVuSW5saW5l
KCkgJiYgKG5ld0NoaWxkLT5pc0Zsb2F0aW5nT3JQb3NpdGlvbmVkKCkgfHwgbmV3Q2hpbGQtPmlz
SW5saW5lKCkpKSB7CiAgICAgICAgIC8vIElmIHdlJ3JlIGluc2VydGluZyBhbiBpbmxpbmUgY2hp
bGQgYnV0IGFsbCBvZiBvdXIgY2hpbGRyZW4gYXJlIGJsb2NrcywgdGhlbiB3ZSBoYXZlIHRvIG1h
a2Ugc3VyZQotICAgICAgICAvLyBpdCBpcyBwdXQgaW50byBhbiBhbm9teW91cyBibG9jayBib3gu
IFdlIHRyeSB0byB1c2UgYW4gZXhpc3RpbmcgYW5vbnltb3VzIGJveCBpZiBwb3NzaWJsZSwgb3Ro
ZXJ3aXNlCisgICAgICAgIC8vIGl0IGlzIHB1dCBpbnRvIGFuIGFub255bW91cyBibG9jayBib3gu
IFdlIHRyeSB0byB1c2UgYW4gZXhpc3RpbmcgYW5vbnltb3VzIGJveCBpZiBwb3NzaWJsZSwgb3Ro
ZXJ3aXNlCiAgICAgICAgIC8vIGEgbmV3IG9uZSBpcyBjcmVhdGVkIGFuZCBpbnNlcnRlZCBpbnRv
IG91ciBsaXN0IG9mIGNoaWxkcmVuIGluIHRoZSBhcHByb3ByaWF0ZSBwb3NpdGlvbi4KICAgICAg
ICAgUmVuZGVyT2JqZWN0KiBhZnRlckNoaWxkID0gYmVmb3JlQ2hpbGQgPyBiZWZvcmVDaGlsZC0+
cHJldmlvdXNTaWJsaW5nKCkgOiBsYXN0Q2hpbGQoKTsKIApAQCAtMzkxLDkgKzM4MCw5IEBAIFJv
b3RJbmxpbmVCb3gqIFJlbmRlckJsb2NrOjpjcmVhdGVSb290SW4KICAgICByZXR1cm4gbmV3IChy
ZW5kZXJBcmVuYSgpKSBSb290SW5saW5lQm94KHRoaXMpOwogfQogCi1Sb290SW5saW5lQm94KiBS
ZW5kZXJCbG9jazo6Y3JlYXRlQW5kQXBwZW5kUm9vdElubGluZUJveCgpCi17Ci0gICAgUm9vdElu
bGluZUJveCogcm9vdEJveCA9IGNyZWF0ZVJvb3RJbmxpbmVCb3goKTsKK1Jvb3RJbmxpbmVCb3gq
IFJlbmRlckJsb2NrOjpjcmVhdGVBbmRBcHBlbmRSb290SW5saW5lQm94KFJlbmRlckJsb2NrKiBh
bm9ueW1vdXNJbmxpbmVCbG9jaykKK3sgCisgICAgUm9vdElubGluZUJveCogcm9vdEJveCA9IGFu
b255bW91c0lubGluZUJsb2NrID8gbmV3IChyZW5kZXJBcmVuYSgpKSBSb290QW5vbnltb3VzSW5s
aW5lQmxvY2tCb3godGhpcywgYW5vbnltb3VzSW5saW5lQmxvY2spIDogY3JlYXRlUm9vdElubGlu
ZUJveCgpOwogICAgIG1fbGluZUJveGVzLmFwcGVuZExpbmVCb3gocm9vdEJveCk7CiAgICAgcmV0
dXJuIHJvb3RCb3g7CiB9CkBAIC00OTAsOSArNDc5LDYgQEAgdm9pZCBSZW5kZXJCbG9jazo6cmVt
b3ZlTGVmdG92ZXJBbm9ueW1vdQogICAgIEFTU0VSVChjaGlsZC0+aXNBbm9ueW1vdXNCbG9jaygp
KTsKICAgICBBU1NFUlQoIWNoaWxkLT5jaGlsZHJlbklubGluZSgpKTsKICAgICAKLSAgICBpZiAo
Y2hpbGQtPmlubGluZUNvbnRpbnVhdGlvbigpKSAKLSAgICAgICAgcmV0dXJuOwotICAgIAogICAg
IFJlbmRlck9iamVjdCogZmlyc3RBbkNoaWxkID0gY2hpbGQtPm1fY2hpbGRyZW4uZmlyc3RDaGls
ZCgpOwogICAgIFJlbmRlck9iamVjdCogbGFzdEFuQ2hpbGQgPSBjaGlsZC0+bV9jaGlsZHJlbi5s
YXN0Q2hpbGQoKTsKICAgICBpZiAoZmlyc3RBbkNoaWxkKSB7CkBAIC01MzUsNyArNTIxLDcgQEAg
dm9pZCBSZW5kZXJCbG9jazo6cmVtb3ZlQ2hpbGQoUmVuZGVyT2JqZQogICAgIFJlbmRlck9iamVj
dCogcHJldiA9IG9sZENoaWxkLT5wcmV2aW91c1NpYmxpbmcoKTsKICAgICBSZW5kZXJPYmplY3Qq
IG5leHQgPSBvbGRDaGlsZC0+bmV4dFNpYmxpbmcoKTsKICAgICBib29sIGNhbkRlbGV0ZUFub255
bW91c0Jsb2NrcyA9ICFkb2N1bWVudEJlaW5nRGVzdHJveWVkKCkgJiYgIWlzSW5saW5lKCkgJiYg
IW9sZENoaWxkLT5pc0lubGluZSgpICYmIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgKCFvbGRDaGlsZC0+aXNSZW5kZXJCbG9jaygpIHx8ICF0b1JlbmRlckJsb2NrKG9sZENo
aWxkKS0+aW5saW5lQ29udGludWF0aW9uKCkpICYmIAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIW9sZENoaWxkLT5pc1JlbmRlckJsb2NrKCkgJiYgCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAoIXByZXYgfHwgKHByZXYtPmlzQW5vbnltb3VzQmxvY2so
KSAmJiBwcmV2LT5jaGlsZHJlbklubGluZSgpKSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICghbmV4dCB8fCAobmV4dC0+aXNBbm9ueW1vdXNCbG9jaygpICYmIG5leHQt
PmNoaWxkcmVuSW5saW5lKCkpKTsKICAgICBpZiAoY2FuRGVsZXRlQW5vbnltb3VzQmxvY2tzICYm
IHByZXYgJiYgbmV4dCkgewpAQCAtNTk4LDkgKzU4NCwxNSBAQCBib29sIFJlbmRlckJsb2NrOjpp
c1NlbGZDb2xsYXBzaW5nQmxvY2soCiAgICAgLy8gb24gd2hldGhlciB3ZSBoYXZlIGNvbnRlbnQg
dGhhdCBpcyBhbGwgc2VsZi1jb2xsYXBzaW5nIG9yIG5vdC4KICAgICBpZiAoaGFzQXV0b0hlaWdo
dCB8fCAoKHN0eWxlKCktPmhlaWdodCgpLmlzRml4ZWQoKSB8fCBzdHlsZSgpLT5oZWlnaHQoKS5p
c1BlcmNlbnQoKSkgJiYgc3R5bGUoKS0+aGVpZ2h0KCkuaXNaZXJvKCkpKSB7CiAgICAgICAgIC8v
IElmIHRoZSBibG9jayBoYXMgaW5saW5lIGNoaWxkcmVuLCBzZWUgaWYgd2UgZ2VuZXJhdGVkIGFu
eSBsaW5lIGJveGVzLiAgSWYgd2UgaGF2ZSBhbnkKLSAgICAgICAgLy8gbGluZSBib3hlcywgdGhl
biB3ZSBjYW4ndCBiZSBzZWxmLWNvbGxhcHNpbmcsIHNpbmNlIHdlIGhhdmUgY29udGVudC4KLSAg
ICAgICAgaWYgKGNoaWxkcmVuSW5saW5lKCkpCi0gICAgICAgICAgICByZXR1cm4gIWZpcnN0TGlu
ZUJveCgpOworICAgICAgICAvLyBsaW5lIGJveGVzLCB0aGVuIHdlIGNhbiBvbmx5IGJlIHNlbGYt
Y29sbGFwc2luZyBpZiB3ZSBoYXZlIG5vdGhpbmcgYnV0IGFub255bW91cyBpbmxpbmUgYmxvY2tz
CisgICAgICAgIC8vIHRoYXQgYXJlIGFsc28gc2VsZi1jb2xsYXBzaW5nIGluc2lkZSB1cy4KKyAg
ICAgICAgaWYgKGNoaWxkcmVuSW5saW5lKCkpIHsKKyAgICAgICAgICAgIGZvciAoUm9vdElubGlu
ZUJveCogY2hpbGQgPSBmaXJzdFJvb3RCb3goKTsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHRS
b290Qm94KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWNoaWxkLT5oYXNBbm9ueW1vdXNJbmxp
bmVCbG9jaygpIHx8ICFjaGlsZC0+YW5vbnltb3VzSW5saW5lQmxvY2soKS0+aXNTZWxmQ29sbGFw
c2luZ0Jsb2NrKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBXZSBoYXZlIG5vIGxpbmUgYm94ZXMs
IHNvIHdlIG11c3QgYmUgc2VsZi1jb2xsYXBzaW5nLgorICAgICAgICB9CiAgICAgICAgIAogICAg
ICAgICAvLyBXaGV0aGVyIG9yIG5vdCB3ZSBjb2xsYXBzZSBpcyBkZXBlbmRlbnQgb24gd2hldGhl
ciBhbGwgb3VyIG5vcm1hbCBmbG93IGNoaWxkcmVuCiAgICAgICAgIC8vIGFyZSBhbHNvIHNlbGYt
Y29sbGFwc2luZy4KQEAgLTg1NSw3ICs4NDcsOCBAQCB2b2lkIFJlbmRlckJsb2NrOjphZGRPdmVy
Zmxvd0Zyb21GbG9hdHMoCiAKIGJvb2wgUmVuZGVyQmxvY2s6OmV4cGFuZHNUb0VuY2xvc2VPdmVy
aGFuZ2luZ0Zsb2F0cygpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIGlzSW5saW5lQmxvY2tPcklubGlu
ZVRhYmxlKCkgfHwgaXNGbG9hdGluZ09yUG9zaXRpb25lZCgpIHx8IGhhc092ZXJmbG93Q2xpcCgp
IHx8IChwYXJlbnQoKSAmJiBwYXJlbnQoKS0+aXNGbGV4aWJsZUJveCgpKSB8fCBoYXNDb2x1bW5z
KCkgfHwgaXNUYWJsZUNlbGwoKSB8fCBpc0ZpZWxkc2V0KCk7CisgICAgcmV0dXJuIGlzRmxvYXRp
bmdPclBvc2l0aW9uZWQoKSB8fCBoYXNPdmVyZmxvd0NsaXAoKSB8fCAocGFyZW50KCkgJiYgcGFy
ZW50KCktPmlzRmxleGlibGVCb3goKSkgfHwgaGFzQ29sdW1ucygpIHx8IGlzVGFibGVDZWxsKCkg
fHwgaXNGaWVsZHNldCgpIHx8CisgICAgICAgICAgIChpc0lubGluZUJsb2NrT3JJbmxpbmVUYWJs
ZSgpICYmICFpc0Fub255bW91c0lubGluZUJsb2NrKCkpOwogfQogCiB2b2lkIFJlbmRlckJsb2Nr
OjphZGp1c3RQb3NpdGlvbmVkQmxvY2soUmVuZGVyQm94KiBjaGlsZCwgY29uc3QgTWFyZ2luSW5m
byYgbWFyZ2luSW5mbykKQEAgLTEwMDEsMTkgKzk5NCwxOSBAQCBib29sIFJlbmRlckJsb2NrOjpo
YW5kbGVSdW5JbkNoaWxkKFJlbmRlCiBpbnQgUmVuZGVyQmxvY2s6OmNvbGxhcHNlTWFyZ2lucyhS
ZW5kZXJCb3gqIGNoaWxkLCBNYXJnaW5JbmZvJiBtYXJnaW5JbmZvKQogewogICAgIC8vIEdldCBv
dXIgbWF4IHBvcyBhbmQgbmVnIHRvcCBtYXJnaW5zLgotICAgIGludCBwb3NUb3AgPSBjaGlsZC0+
bWF4VG9wTWFyZ2luKHRydWUpOwotICAgIGludCBuZWdUb3AgPSBjaGlsZC0+bWF4VG9wTWFyZ2lu
KGZhbHNlKTsKKyAgICBpbnQgcG9zVG9wID0gY2hpbGQgPyBjaGlsZC0+bWF4VG9wTWFyZ2luKHRy
dWUpIDogMDsKKyAgICBpbnQgbmVnVG9wID0gY2hpbGQgPyBjaGlsZC0+bWF4VG9wTWFyZ2luKGZh
bHNlKSA6IDA7CiAKICAgICAvLyBGb3Igc2VsZi1jb2xsYXBzaW5nIGJsb2NrcywgY29sbGFwc2Ug
b3VyIGJvdHRvbSBtYXJnaW5zIGludG8gb3VyCiAgICAgLy8gdG9wIHRvIGdldCBuZXcgcG9zVG9w
IGFuZCBuZWdUb3AgdmFsdWVzLgotICAgIGlmIChjaGlsZC0+aXNTZWxmQ29sbGFwc2luZ0Jsb2Nr
KCkpIHsKKyAgICBpZiAoY2hpbGQgJiYgY2hpbGQtPmlzU2VsZkNvbGxhcHNpbmdCbG9jaygpKSB7
CiAgICAgICAgIHBvc1RvcCA9IG1heChwb3NUb3AsIGNoaWxkLT5tYXhCb3R0b21NYXJnaW4odHJ1
ZSkpOwogICAgICAgICBuZWdUb3AgPSBtYXgobmVnVG9wLCBjaGlsZC0+bWF4Qm90dG9tTWFyZ2lu
KGZhbHNlKSk7CiAgICAgfQogICAgIAogICAgIC8vIFNlZSBpZiB0aGUgdG9wIG1hcmdpbiBpcyBx
dWlya3kuIFdlIG9ubHkgY2FyZSBpZiB0aGlzIGNoaWxkIGhhcwogICAgIC8vIG1hcmdpbnMgdGhh
dCB3aWxsIGNvbGxhcHNlIHdpdGggdXMuCi0gICAgYm9vbCB0b3BRdWlyayA9IGNoaWxkLT5pc1Rv
cE1hcmdpblF1aXJrKCkgfHwgc3R5bGUoKS0+bWFyZ2luVG9wQ29sbGFwc2UoKSA9PSBNRElTQ0FS
RDsKKyAgICBib29sIHRvcFF1aXJrID0gKGNoaWxkICYmIGNoaWxkLT5pc1RvcE1hcmdpblF1aXJr
KCkpIHx8IHN0eWxlKCktPm1hcmdpblRvcENvbGxhcHNlKCkgPT0gTURJU0NBUkQ7CiAKICAgICBp
ZiAobWFyZ2luSW5mby5jYW5Db2xsYXBzZVdpdGhUb3AoKSkgewogICAgICAgICAvLyBUaGlzIGNo
aWxkIGlzIGNvbGxhcHNpbmcgd2l0aCB0aGUgdG9wIG9mIHRoZQpAQCAtMTAyNiw3ICsxMDE5LDcg
QEAgaW50IFJlbmRlckJsb2NrOjpjb2xsYXBzZU1hcmdpbnMoUmVuZGVyQgogICAgICAgICAvLyBj
b2xsYXBzZSBpdCBhd2F5LCBldmVuIGlmIHRoZSBtYXJnaW4gaXMgc21hbGxlciAod3d3LndlYnJl
ZmVyZW5jZS5jb20KICAgICAgICAgLy8gaGFzIGFuIGV4YW1wbGUgb2YgdGhpcywgYSA8ZHQ+IHdp
dGggMC44ZW0gYXV0aG9yLXNwZWNpZmllZCBpbnNpZGUKICAgICAgICAgLy8gYSA8ZGw+IGluc2lk
ZSBhIDx0ZD4uCi0gICAgICAgIGlmICghbWFyZ2luSW5mby5kZXRlcm1pbmVkVG9wUXVpcmsoKSAm
JiAhdG9wUXVpcmsgJiYgKHBvc1RvcC1uZWdUb3ApKSB7CisgICAgICAgIGlmICghbWFyZ2luSW5m
by5kZXRlcm1pbmVkVG9wUXVpcmsoKSAmJiAhdG9wUXVpcmsgJiYgKHBvc1RvcCAtIG5lZ1RvcCkp
IHsKICAgICAgICAgICAgIHNldFRvcE1hcmdpblF1aXJrKGZhbHNlKTsKICAgICAgICAgICAgIG1h
cmdpbkluZm8uc2V0RGV0ZXJtaW5lZFRvcFF1aXJrKHRydWUpOwogICAgICAgICB9CkBAIC0xMDQ0
LDcgKzEwMzcsNyBAQCBpbnQgUmVuZGVyQmxvY2s6OmNvbGxhcHNlTWFyZ2lucyhSZW5kZXJCCiAg
ICAgICAgIG1hcmdpbkluZm8uc2V0VG9wUXVpcmsodG9wUXVpcmspOwogCiAgICAgaW50IHlwb3Mg
PSBoZWlnaHQoKTsKLSAgICBpZiAoY2hpbGQtPmlzU2VsZkNvbGxhcHNpbmdCbG9jaygpKSB7Cisg
ICAgaWYgKGNoaWxkICYmIGNoaWxkLT5pc1NlbGZDb2xsYXBzaW5nQmxvY2soKSkgewogICAgICAg
ICAvLyBUaGlzIGNoaWxkIGhhcyBubyBoZWlnaHQuICBXZSBuZWVkIHRvIGNvbXB1dGUgb3VyCiAg
ICAgICAgIC8vIHBvc2l0aW9uIGJlZm9yZSB3ZSBjb2xsYXBzZSB0aGUgY2hpbGQncyBtYXJnaW5z
IHRvZ2V0aGVyLAogICAgICAgICAvLyBzbyB0aGF0IHdlIGNhbiBnZXQgYW4gYWNjdXJhdGUgcG9z
aXRpb24gZm9yIHRoZSB6ZXJvLWhlaWdodCBibG9jay4KQEAgLTEwNjMsMTMgKzEwNTYsMTEgQEAg
aW50IFJlbmRlckJsb2NrOjpjb2xsYXBzZU1hcmdpbnMoUmVuZGVyQgogICAgICAgICAgICAgLy8g
dGhhdCBuZWVkcyB0byBiZSBwb3NpdGlvbmVkIGNvcnJlY3RseSAoZS5nLiwgYSBibG9jayB0aGF0
CiAgICAgICAgICAgICAvLyBoYWQgYSBzcGVjaWZpZWQgaGVpZ2h0IG9mIDAgYnV0IHRoYXQgYWN0
dWFsbHkgaGFkIHN1YmNvbnRlbnQpLgogICAgICAgICAgICAgeXBvcyA9IGhlaWdodCgpICsgY29s
bGFwc2VkVG9wUG9zIC0gY29sbGFwc2VkVG9wTmVnOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAg
ICAgaWYgKGNoaWxkLT5zdHlsZSgpLT5tYXJnaW5Ub3BDb2xsYXBzZSgpID09IE1TRVBBUkFURSkg
eworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChjaGlsZCAmJiBjaGlsZC0+c3R5bGUoKS0+bWFy
Z2luVG9wQ29sbGFwc2UoKSA9PSBNU0VQQVJBVEUpIHsKICAgICAgICAgICAgIHNldEhlaWdodCho
ZWlnaHQoKSArIG1hcmdpbkluZm8ubWFyZ2luKCkgKyBjaGlsZC0+bWFyZ2luVG9wKCkpOwogICAg
ICAgICAgICAgeXBvcyA9IGhlaWdodCgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCFt
YXJnaW5JbmZvLmF0VG9wT2ZCbG9jaygpIHx8CisgICAgICAgIH0gZWxzZSBpZiAoIW1hcmdpbklu
Zm8uYXRUb3BPZkJsb2NrKCkgfHwKICAgICAgICAgICAgICghbWFyZ2luSW5mby5jYW5Db2xsYXBz
ZVRvcFdpdGhDaGlsZHJlbigpCiAgICAgICAgICAgICAgJiYgKCFzdHlsZSgpLT5odG1sSGFja3Mo
KSB8fCAhbWFyZ2luSW5mby5xdWlya0NvbnRhaW5lcigpIHx8ICFtYXJnaW5JbmZvLnRvcFF1aXJr
KCkpKSkgewogICAgICAgICAgICAgLy8gV2UncmUgY29sbGFwc2luZyB3aXRoIGEgcHJldmlvdXMg
c2libGluZydzIG1hcmdpbnMgYW5kIG5vdApAQCAtMTA3OCwxMSArMTA2OSwxMSBAQCBpbnQgUmVu
ZGVyQmxvY2s6OmNvbGxhcHNlTWFyZ2lucyhSZW5kZXJCCiAgICAgICAgICAgICB5cG9zID0gaGVp
Z2h0KCk7CiAgICAgICAgIH0KIAotICAgICAgICBtYXJnaW5JbmZvLnNldFBvc01hcmdpbihjaGls
ZC0+bWF4Qm90dG9tTWFyZ2luKHRydWUpKTsKLSAgICAgICAgbWFyZ2luSW5mby5zZXROZWdNYXJn
aW4oY2hpbGQtPm1heEJvdHRvbU1hcmdpbihmYWxzZSkpOworICAgICAgICBtYXJnaW5JbmZvLnNl
dFBvc01hcmdpbihjaGlsZCA/IGNoaWxkLT5tYXhCb3R0b21NYXJnaW4odHJ1ZSkgOiAwKTsKKyAg
ICAgICAgbWFyZ2luSW5mby5zZXROZWdNYXJnaW4oY2hpbGQgPyBjaGlsZC0+bWF4Qm90dG9tTWFy
Z2luKGZhbHNlKSA6IDApOwogCiAgICAgICAgIGlmIChtYXJnaW5JbmZvLm1hcmdpbigpKQotICAg
ICAgICAgICAgbWFyZ2luSW5mby5zZXRCb3R0b21RdWlyayhjaGlsZC0+aXNCb3R0b21NYXJnaW5R
dWlyaygpIHx8IHN0eWxlKCktPm1hcmdpbkJvdHRvbUNvbGxhcHNlKCkgPT0gTURJU0NBUkQpOwor
ICAgICAgICAgICAgbWFyZ2luSW5mby5zZXRCb3R0b21RdWlyaygoY2hpbGQgJiYgY2hpbGQtPmlz
Qm90dG9tTWFyZ2luUXVpcmsoKSkgfHwgc3R5bGUoKS0+bWFyZ2luQm90dG9tQ29sbGFwc2UoKSA9
PSBNRElTQ0FSRCk7CiAgICAgfQogICAgIAogICAgIHJldHVybiB5cG9zOwpAQCAtMTc0OSwyMCAr
MTc0MCw3IEBAIHZvaWQgUmVuZGVyQmxvY2s6OnBhaW50T2JqZWN0KFBhaW50SW5mbyYKICAgICBp
ZiAoKHBhaW50UGhhc2UgPT0gUGFpbnRQaGFzZU91dGxpbmUgfHwgcGFpbnRQaGFzZSA9PSBQYWlu
dFBoYXNlU2VsZk91dGxpbmUpICYmIGhhc091dGxpbmUoKSAmJiBzdHlsZSgpLT52aXNpYmlsaXR5
KCkgPT0gVklTSUJMRSkKICAgICAgICAgcGFpbnRPdXRsaW5lKHBhaW50SW5mby5jb250ZXh0LCB0
eCwgdHksIHdpZHRoKCksIGhlaWdodCgpLCBzdHlsZSgpKTsKIAotICAgIC8vIDYuIHBhaW50IGNv
bnRpbnVhdGlvbiBvdXRsaW5lcy4KLSAgICBpZiAoKHBhaW50UGhhc2UgPT0gUGFpbnRQaGFzZU91
dGxpbmUgfHwgcGFpbnRQaGFzZSA9PSBQYWludFBoYXNlQ2hpbGRPdXRsaW5lcykpIHsKLSAgICAg
ICAgaWYgKGlubGluZUNvbnRpbnVhdGlvbigpICYmIGlubGluZUNvbnRpbnVhdGlvbigpLT5oYXNP
dXRsaW5lKCkgJiYgaW5saW5lQ29udGludWF0aW9uKCktPnN0eWxlKCktPnZpc2liaWxpdHkoKSA9
PSBWSVNJQkxFKSB7Ci0gICAgICAgICAgICBSZW5kZXJJbmxpbmUqIGlubGluZVJlbmRlcmVyID0g
dG9SZW5kZXJJbmxpbmUoaW5saW5lQ29udGludWF0aW9uKCktPm5vZGUoKS0+cmVuZGVyZXIoKSk7
Ci0gICAgICAgICAgICBpZiAoIWlubGluZVJlbmRlcmVyLT5oYXNTZWxmUGFpbnRpbmdMYXllcigp
KQotICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdCbG9jaygpLT5hZGRDb250aW51YXRpb25XaXRo
T3V0bGluZShpbmxpbmVSZW5kZXJlcik7Ci0gICAgICAgICAgICBlbHNlIGlmICghaW5saW5lUmVu
ZGVyZXItPmZpcnN0TGluZUJveCgpKQotICAgICAgICAgICAgICAgIGlubGluZVJlbmRlcmVyLT5w
YWludE91dGxpbmUocGFpbnRJbmZvLmNvbnRleHQsIHR4IC0geCgpICsgaW5saW5lUmVuZGVyZXIt
PmNvbnRhaW5pbmdCbG9jaygpLT54KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICB0eSAtIHkoKSArIGlubGluZVJlbmRlcmVyLT5jb250YWluaW5nQmxvY2so
KS0+eSgpKTsKLSAgICAgICAgfQotICAgICAgICBwYWludENvbnRpbnVhdGlvbk91dGxpbmVzKHBh
aW50SW5mbywgdHgsIHR5KTsKLSAgICB9Ci0KLSAgICAvLyA3LiBwYWludCBjYXJldC4KKyAgICAv
LyA2LiBwYWludCBjYXJldC4KICAgICAvLyBJZiB0aGUgY2FyZXQncyBub2RlJ3MgcmVuZGVyIG9i
amVjdCdzIGNvbnRhaW5pbmcgYmxvY2sgaXMgdGhpcyBibG9jaywgYW5kIHRoZSBwYWludCBhY3Rp
b24gaXMgUGFpbnRQaGFzZUZvcmVncm91bmQsCiAgICAgLy8gdGhlbiBwYWludCB0aGUgY2FyZXQu
CiAgICAgaWYgKHBhaW50UGhhc2UgPT0gUGFpbnRQaGFzZUZvcmVncm91bmQpIHsgICAgICAgIApA
QCAtMTgyNSw1NyArMTgwMyw2IEBAIHZvaWQgUmVuZGVyQmxvY2s6OnBhaW50RWxsaXBzaXNCb3hl
cyhQYWkKICAgICB9CiB9CiAKLXN0YXRpYyBDb250aW51YXRpb25PdXRsaW5lVGFibGVNYXAqIGNv
bnRpbnVhdGlvbk91dGxpbmVUYWJsZSgpCi17Ci0gICAgREVGSU5FX1NUQVRJQ19MT0NBTChDb250
aW51YXRpb25PdXRsaW5lVGFibGVNYXAsIHRhYmxlLCAoKSk7Ci0gICAgcmV0dXJuICZ0YWJsZTsK
LX0KLQotdm9pZCBSZW5kZXJCbG9jazo6YWRkQ29udGludWF0aW9uV2l0aE91dGxpbmUoUmVuZGVy
SW5saW5lKiBmbG93KQotewotICAgIC8vIFdlIGNhbid0IG1ha2UgdGhpcyB3b3JrIGlmIHRoZSBp
bmxpbmUgaXMgaW4gYSBsYXllci4gIFdlJ2xsIGp1c3QgcmVseSBvbiB0aGUgYnJva2VuCi0gICAg
Ly8gd2F5IG9mIHBhaW50aW5nLgotICAgIEFTU0VSVCghZmxvdy0+bGF5ZXIoKSAmJiAhZmxvdy0+
aXNJbmxpbmVDb250aW51YXRpb24oKSk7Ci0gICAgCi0gICAgQ29udGludWF0aW9uT3V0bGluZVRh
YmxlTWFwKiB0YWJsZSA9IGNvbnRpbnVhdGlvbk91dGxpbmVUYWJsZSgpOwotICAgIExpc3RIYXNo
U2V0PFJlbmRlcklubGluZSo+KiBjb250aW51YXRpb25zID0gdGFibGUtPmdldCh0aGlzKTsKLSAg
ICBpZiAoIWNvbnRpbnVhdGlvbnMpIHsKLSAgICAgICAgY29udGludWF0aW9ucyA9IG5ldyBMaXN0
SGFzaFNldDxSZW5kZXJJbmxpbmUqPjsKLSAgICAgICAgdGFibGUtPnNldCh0aGlzLCBjb250aW51
YXRpb25zKTsKLSAgICB9Ci0gICAgCi0gICAgY29udGludWF0aW9ucy0+YWRkKGZsb3cpOwotfQot
Ci12b2lkIFJlbmRlckJsb2NrOjpwYWludENvbnRpbnVhdGlvbk91dGxpbmVzKFBhaW50SW5mbyYg
aW5mbywgaW50IHR4LCBpbnQgdHkpCi17Ci0gICAgQ29udGludWF0aW9uT3V0bGluZVRhYmxlTWFw
KiB0YWJsZSA9IGNvbnRpbnVhdGlvbk91dGxpbmVUYWJsZSgpOwotICAgIGlmICh0YWJsZS0+aXNF
bXB0eSgpKQotICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgIExpc3RIYXNoU2V0PFJlbmRl
cklubGluZSo+KiBjb250aW51YXRpb25zID0gdGFibGUtPmdldCh0aGlzKTsKLSAgICBpZiAoIWNv
bnRpbnVhdGlvbnMpCi0gICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgLy8gUGFpbnQgZWFj
aCBjb250aW51YXRpb24gb3V0bGluZS4KLSAgICBMaXN0SGFzaFNldDxSZW5kZXJJbmxpbmUqPjo6
aXRlcmF0b3IgZW5kID0gY29udGludWF0aW9ucy0+ZW5kKCk7Ci0gICAgZm9yIChMaXN0SGFzaFNl
dDxSZW5kZXJJbmxpbmUqPjo6aXRlcmF0b3IgaXQgPSBjb250aW51YXRpb25zLT5iZWdpbigpOyBp
dCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgLy8gTmVlZCB0byBhZGQgaW4gdGhlIGNvb3JkaW5h
dGVzIG9mIHRoZSBpbnRlcnZlbmluZyBibG9ja3MuCi0gICAgICAgIFJlbmRlcklubGluZSogZmxv
dyA9ICppdDsKLSAgICAgICAgUmVuZGVyQmxvY2sqIGJsb2NrID0gZmxvdy0+Y29udGFpbmluZ0Js
b2NrKCk7Ci0gICAgICAgIGZvciAoIDsgYmxvY2sgJiYgYmxvY2sgIT0gdGhpczsgYmxvY2sgPSBi
bG9jay0+Y29udGFpbmluZ0Jsb2NrKCkpIHsKLSAgICAgICAgICAgIHR4ICs9IGJsb2NrLT54KCk7
Ci0gICAgICAgICAgICB0eSArPSBibG9jay0+eSgpOwotICAgICAgICB9Ci0gICAgICAgIEFTU0VS
VChibG9jayk7ICAgCi0gICAgICAgIGZsb3ctPnBhaW50T3V0bGluZShpbmZvLmNvbnRleHQsIHR4
LCB0eSk7Ci0gICAgfQotICAgIAotICAgIC8vIERlbGV0ZQotICAgIGRlbGV0ZSBjb250aW51YXRp
b25zOwotICAgIHRhYmxlLT5yZW1vdmUodGhpcyk7Ci19Ci0KIHZvaWQgUmVuZGVyQmxvY2s6OnNl
dFNlbGVjdGlvblN0YXRlKFNlbGVjdGlvblN0YXRlIHMpCiB7CiAgICAgaWYgKHNlbGVjdGlvblN0
YXRlKCkgPT0gcykKQEAgLTE4OTAsNiArMTgxNywxMiBAQCB2b2lkIFJlbmRlckJsb2NrOjpzZXRT
ZWxlY3Rpb25TdGF0ZShTZWxlCiAgICAgZWxzZQogICAgICAgICBSZW5kZXJCb3g6OnNldFNlbGVj
dGlvblN0YXRlKHMpOwogICAgIAorICAgIGlmIChpc1JlcGxhY2VkKCkgJiYgbV9pbmxpbmVCb3hX
cmFwcGVyKSB7CisgICAgICAgIFJvb3RJbmxpbmVCb3gqIGxpbmUgPSBtX2lubGluZUJveFdyYXBw
ZXItPnJvb3QoKTsKKyAgICAgICAgaWYgKGxpbmUpCisgICAgICAgICAgICBsaW5lLT5zZXRIYXNT
ZWxlY3RlZENoaWxkcmVuKHMgIT0gU2VsZWN0aW9uTm9uZSk7CisgICAgfQorCiAgICAgUmVuZGVy
QmxvY2sqIGNiID0gY29udGFpbmluZ0Jsb2NrKCk7CiAgICAgaWYgKGNiICYmICFjYi0+aXNSZW5k
ZXJWaWV3KCkpCiAgICAgICAgIGNiLT5zZXRTZWxlY3Rpb25TdGF0ZShzKTsKQEAgLTE5MDgsOSAr
MTg0MSw5IEBAIGJvb2wgUmVuZGVyQmxvY2s6OmlzU2VsZWN0aW9uUm9vdCgpIGNvbnMKICAgICAv
LyBGSVhNRTogRXZlbnR1YWxseSB0YWJsZXMgc2hvdWxkIGhhdmUgdG8gbGVhcm4gaG93IHRvIGZp
bGwgZ2FwcyBiZXR3ZWVuIGNlbGxzLCBhdCBsZWFzdCBpbiBzaW1wbGUgbm9uLXNwYW5uaW5nIGNh
c2VzLgogICAgIGlmIChpc1RhYmxlKCkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAg
CisKICAgICBpZiAoaXNCb2R5KCkgfHwgaXNSb290KCkgfHwgaGFzT3ZlcmZsb3dDbGlwKCkgfHwg
aXNSZWxQb3NpdGlvbmVkKCkgfHwKLSAgICAgICAgaXNGbG9hdGluZ09yUG9zaXRpb25lZCgpIHx8
IGlzVGFibGVDZWxsKCkgfHwgaXNJbmxpbmVCbG9ja09ySW5saW5lVGFibGUoKSB8fCBoYXNUcmFu
c2Zvcm0oKSB8fAorICAgICAgICBpc0Zsb2F0aW5nT3JQb3NpdGlvbmVkKCkgfHwgaXNUYWJsZUNl
bGwoKSB8fCAoaXNJbmxpbmVCbG9ja09ySW5saW5lVGFibGUoKSAmJiAhaXNBbm9ueW1vdXNJbmxp
bmVCbG9jaygpKSB8fCBoYXNUcmFuc2Zvcm0oKSB8fAogICAgICAgICBoYXNSZWZsZWN0aW9uKCkg
fHwgaGFzTWFzaygpKQogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAKQEAgLTIwNTUsMTggKzE5
ODgsMzAgQEAgR2FwUmVjdHMgUmVuZGVyQmxvY2s6OmZpbGxJbmxpbmVTZWxlY3RpbwogICAgIGZv
ciAoY3VyciA9IGZpcnN0Um9vdEJveCgpOyBjdXJyICYmICFjdXJyLT5oYXNTZWxlY3RlZENoaWxk
cmVuKCk7IGN1cnIgPSBjdXJyLT5uZXh0Um9vdEJveCgpKSB7IH0KIAogICAgIC8vIE5vdyBwYWlu
dCB0aGUgZ2FwcyBmb3IgdGhlIGxpbmVzLgotICAgIGZvciAoOyBjdXJyICYmIGN1cnItPmhhc1Nl
bGVjdGVkQ2hpbGRyZW4oKTsgY3VyciA9IGN1cnItPm5leHRSb290Qm94KCkpIHsKKyAgICBmb3Ig
KDsgY3VyciAmJiAoY3Vyci0+aGFzU2VsZWN0ZWRDaGlsZHJlbigpIHx8IGN1cnItPmhhc0Fub255
bW91c0lubGluZUJsb2NrKCkpOyBjdXJyID0gY3Vyci0+bmV4dFJvb3RCb3goKSkgeworICAgICAg
ICBpZiAoIWN1cnItPmhhc1NlbGVjdGVkQ2hpbGRyZW4oKSkKKyAgICAgICAgICAgIGNvbnRpbnVl
OworCiAgICAgICAgIGludCBzZWxUb3AgPSAgY3Vyci0+c2VsZWN0aW9uVG9wKCk7CiAgICAgICAg
IGludCBzZWxIZWlnaHQgPSBjdXJyLT5zZWxlY3Rpb25IZWlnaHQoKTsKIAotICAgICAgICBpZiAo
IWNvbnRhaW5zU3RhcnQgJiYgIWxhc3RTZWxlY3RlZExpbmUgJiYKLSAgICAgICAgICAgIHNlbGVj
dGlvblN0YXRlKCkgIT0gU2VsZWN0aW9uU3RhcnQgJiYgc2VsZWN0aW9uU3RhdGUoKSAhPSBTZWxl
Y3Rpb25Cb3RoKQotICAgICAgICAgICAgcmVzdWx0LnVuaXRlQ2VudGVyKGZpbGxWZXJ0aWNhbFNl
bGVjdGlvbkdhcChsYXN0VG9wLCBsYXN0TGVmdCwgbGFzdFJpZ2h0LCB0eSArIHNlbFRvcCwKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9v
dEJsb2NrLCBibG9ja1gsIGJsb2NrWSwgcGFpbnRJbmZvKSk7Ci0KLSAgICAgICAgaWYgKCFwYWlu
dEluZm8gfHwgKHR5ICsgc2VsVG9wIDwgcGFpbnRJbmZvLT5yZWN0LmJvdHRvbSgpICYmIHR5ICsg
c2VsVG9wICsgc2VsSGVpZ2h0ID4gcGFpbnRJbmZvLT5yZWN0LnkoKSkpCi0gICAgICAgICAgICBy
ZXN1bHQudW5pdGUoY3Vyci0+ZmlsbExpbmVTZWxlY3Rpb25HYXAoc2VsVG9wLCBzZWxIZWlnaHQs
IHJvb3RCbG9jaywgYmxvY2tYLCBibG9ja1ksIHR4LCB0eSwgcGFpbnRJbmZvKSk7CisgICAgICAg
IGlmIChjdXJyLT5oYXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CisgICAgICAgICAgICBpZiAo
bGFzdFNlbGVjdGVkTGluZSkgeworICAgICAgICAgICAgICAgIGxhc3RUb3AgPSAodHkgLSBibG9j
a1kpICsgbGFzdFNlbGVjdGVkTGluZS0+c2VsZWN0aW9uQm90dG9tKCk7CisgICAgICAgICAgICAg
ICAgbGFzdExlZnQgPSBsZWZ0U2VsZWN0aW9uT2Zmc2V0KHJvb3RCbG9jaywgbGFzdFNlbGVjdGVk
TGluZS0+c2VsZWN0aW9uQm90dG9tKCkpOworICAgICAgICAgICAgICAgIGxhc3RSaWdodCA9IHJp
Z2h0U2VsZWN0aW9uT2Zmc2V0KHJvb3RCbG9jaywgbGFzdFNlbGVjdGVkTGluZS0+c2VsZWN0aW9u
Qm90dG9tKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGFpbnNTdGFydCA9IGZh
bHNlOworICAgICAgICAgICAgcmVzdWx0LnVuaXRlKGN1cnItPmFub255bW91c0lubGluZUJsb2Nr
KCktPmZpbGxTZWxlY3Rpb25HYXBzKHJvb3RCbG9jaywgYmxvY2tYLCBibG9ja1ksIHR4ICsgY3Vy
ci0+eCgpLCB0eSArIGN1cnItPnkoKSwgbGFzdFRvcCwgbGFzdExlZnQsIGxhc3RSaWdodCwgcGFp
bnRJbmZvKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIWNvbnRhaW5zU3Rh
cnQgJiYgKCFsYXN0U2VsZWN0ZWRMaW5lIHx8IGxhc3RTZWxlY3RlZExpbmUtPmFub255bW91c0lu
bGluZUJsb2NrKCkpKQorICAgICAgICAgICAgICAgIHJlc3VsdC51bml0ZUNlbnRlcihmaWxsVmVy
dGljYWxTZWxlY3Rpb25HYXAobGFzdFRvcCwgbGFzdExlZnQsIGxhc3RSaWdodCwgdHkgKyBzZWxU
b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICByb290QmxvY2ssIGJsb2NrWCwgYmxvY2tZLCBwYWludEluZm8pKTsKIAorICAgICAg
ICAgICAgaWYgKCFwYWludEluZm8gfHwgKHR5ICsgc2VsVG9wIDwgcGFpbnRJbmZvLT5yZWN0LmJv
dHRvbSgpICYmIHR5ICsgc2VsVG9wICsgc2VsSGVpZ2h0ID4gcGFpbnRJbmZvLT5yZWN0LnkoKSkp
CisgICAgICAgICAgICAgICAgcmVzdWx0LnVuaXRlKGN1cnItPmZpbGxMaW5lU2VsZWN0aW9uR2Fw
KHNlbFRvcCwgc2VsSGVpZ2h0LCByb290QmxvY2ssIGJsb2NrWCwgYmxvY2tZLCB0eCwgdHksIHBh
aW50SW5mbykpOworICAgICAgICB9CisgICAgICAgIAogICAgICAgICBsYXN0U2VsZWN0ZWRMaW5l
ID0gY3VycjsKICAgICB9CiAKQEAgLTIwNzQsOCArMjAxOSw4IEBAIEdhcFJlY3RzIFJlbmRlckJs
b2NrOjpmaWxsSW5saW5lU2VsZWN0aW8KICAgICAgICAgLy8gVmlzaWJsZVNlbGVjdGlvbiBtdXN0
IHN0YXJ0IGp1c3QgYWZ0ZXIgb3VyIGxhc3QgbGluZS4KICAgICAgICAgbGFzdFNlbGVjdGVkTGlu
ZSA9IGxhc3RSb290Qm94KCk7CiAKLSAgICBpZiAobGFzdFNlbGVjdGVkTGluZSAmJiBzZWxlY3Rp
b25TdGF0ZSgpICE9IFNlbGVjdGlvbkVuZCAmJiBzZWxlY3Rpb25TdGF0ZSgpICE9IFNlbGVjdGlv
bkJvdGgpIHsKLSAgICAgICAgLy8gR28gYWhlYWQgYW5kIHVwZGF0ZSBvdXIgbGFzdFkgdG8gYmUg
dGhlIGJvdHRvbSBvZiB0aGUgbGFzdCBzZWxlY3RlZCBsaW5lLgorICAgIGlmIChsYXN0U2VsZWN0
ZWRMaW5lICYmICFsYXN0U2VsZWN0ZWRMaW5lLT5oYXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpICYm
IHNlbGVjdGlvblN0YXRlKCkgIT0gU2VsZWN0aW9uRW5kICYmIHNlbGVjdGlvblN0YXRlKCkgIT0g
U2VsZWN0aW9uQm90aCkgeworICAgICAgICAvLyBHbyBhaGVhZCBhbmQgdXBkYXRlIG91ciBsYXN0
VG9wIHRvIGJlIHRoZSBib3R0b20gb2YgdGhlIGxhc3Qgc2VsZWN0ZWQgbGluZS4KICAgICAgICAg
bGFzdFRvcCA9ICh0eSAtIGJsb2NrWSkgKyBsYXN0U2VsZWN0ZWRMaW5lLT5zZWxlY3Rpb25Cb3R0
b20oKTsKICAgICAgICAgbGFzdExlZnQgPSBsZWZ0U2VsZWN0aW9uT2Zmc2V0KHJvb3RCbG9jaywg
bGFzdFNlbGVjdGVkTGluZS0+c2VsZWN0aW9uQm90dG9tKCkpOwogICAgICAgICBsYXN0UmlnaHQg
PSByaWdodFNlbGVjdGlvbk9mZnNldChyb290QmxvY2ssIGxhc3RTZWxlY3RlZExpbmUtPnNlbGVj
dGlvbkJvdHRvbSgpKTsKQEAgLTI5ODUsMjUgKzI5MzAsMzEgQEAgdm9pZCBSZW5kZXJCbG9jazo6
Y2xlYXJGbG9hdHMoKQogICAgIC8vIG91dCBvZiBmbG93IChsaWtlIGZsb2F0aW5nL3Bvc2l0aW9u
ZWQgZWxlbWVudHMpLCBhbmQgd2UgYWxzbyBza2lwIG92ZXIgYW55IG9iamVjdHMgdGhhdCBtYXkg
aGF2ZSBzaGlmdGVkCiAgICAgLy8gdG8gYXZvaWQgZmxvYXRzLgogICAgIGJvb2wgcGFyZW50SGFz
RmxvYXRzID0gZmFsc2U7Ci0gICAgUmVuZGVyT2JqZWN0KiBwcmV2ID0gcHJldmlvdXNTaWJsaW5n
KCk7Ci0gICAgd2hpbGUgKHByZXYgJiYgKHByZXYtPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSB8
fCAhcHJldi0+aXNCb3goKSB8fCAhcHJldi0+aXNSZW5kZXJCbG9jaygpIHx8IHRvUmVuZGVyQmxv
Y2socHJldiktPmF2b2lkc0Zsb2F0cygpKSkgewotICAgICAgICBpZiAocHJldi0+aXNGbG9hdGlu
ZygpKQotICAgICAgICAgICAgcGFyZW50SGFzRmxvYXRzID0gdHJ1ZTsKLSAgICAgICAgIHByZXYg
PSBwcmV2LT5wcmV2aW91c1NpYmxpbmcoKTsKKyAgICBSZW5kZXJPYmplY3QqIHByZXYgPSAwOwor
ICAgIFJlbmRlckJsb2NrKiBwYXJlbnRCbG9jayA9IDA7CisgICAgaWYgKGlzQW5vbnltb3VzSW5s
aW5lQmxvY2soKSkgeworICAgICAgICBwYXJlbnRCbG9jayA9IGNvbnRhaW5pbmdCbG9jaygpOwor
ICAgICAgICBwYXJlbnRIYXNGbG9hdHMgPSBwYXJlbnRCbG9jay0+Y29udGFpbnNGbG9hdHMoKTsK
KyAgICB9IGVsc2UgeyAgICAKKyAgICAgICAgd2hpbGUgKHByZXYgJiYgKHByZXYtPmlzRmxvYXRp
bmdPclBvc2l0aW9uZWQoKSB8fCAhcHJldi0+aXNCb3goKSB8fCAhcHJldi0+aXNSZW5kZXJCbG9j
aygpIHx8IHRvUmVuZGVyQmxvY2socHJldiktPmF2b2lkc0Zsb2F0cygpKSkgeworICAgICAgICAg
ICAgaWYgKHByZXYtPmlzRmxvYXRpbmcoKSkKKyAgICAgICAgICAgICAgICBwYXJlbnRIYXNGbG9h
dHMgPSB0cnVlOworICAgICAgICAgICAgcHJldiA9IHByZXYtPnByZXZpb3VzU2libGluZygpOwor
ICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwYXJlbnRCbG9jayA9IHBhcmVudCgpLT5pc1Jl
bmRlckJsb2NrKCkgPyB0b1JlbmRlckJsb2NrKHBhcmVudCgpKSA6IDA7CiAgICAgfQogCiAgICAg
Ly8gRmlyc3QgYWRkIGluIGZsb2F0cyBmcm9tIHRoZSBwYXJlbnQuCiAgICAgaW50IG9mZnNldCA9
IHkoKTsKLSAgICBpZiAocGFyZW50SGFzRmxvYXRzKSB7Ci0gICAgICAgIFJlbmRlckJsb2NrKiBw
YXJlbnRCbG9jayA9IHRvUmVuZGVyQmxvY2socGFyZW50KCkpOworICAgIGlmIChwYXJlbnRIYXNG
bG9hdHMpCiAgICAgICAgIGFkZEludHJ1ZGluZ0Zsb2F0cyhwYXJlbnRCbG9jaywgcGFyZW50Qmxv
Y2stPmJvcmRlckxlZnQoKSArIHBhcmVudEJsb2NrLT5wYWRkaW5nTGVmdCgpLCBvZmZzZXQpOwot
ICAgIH0KLSAgICAKKwogICAgIGludCB4b2Zmc2V0ID0gMDsKICAgICBpZiAocHJldikKICAgICAg
ICAgb2Zmc2V0IC09IHRvUmVuZGVyQm94KHByZXYpLT55KCk7Ci0gICAgZWxzZSBpZiAocGFyZW50
KCktPmlzQm94KCkpIHsKLSAgICAgICAgcHJldiA9IHBhcmVudCgpOworICAgIGVsc2UgaWYgKHBh
cmVudEJsb2NrKSB7CisgICAgICAgIHByZXYgPSBwYXJlbnRCbG9jazsKICAgICAgICAgeG9mZnNl
dCArPSB0b1JlbmRlckJveChwcmV2KS0+Ym9yZGVyTGVmdCgpICsgdG9SZW5kZXJCb3gocHJldikt
PnBhZGRpbmdMZWZ0KCk7CiAgICAgfQogCkBAIC0zMTM4LDcgKzMwODksNyBAQCB2b2lkIFJlbmRl
ckJsb2NrOjphZGRJbnRydWRpbmdGbG9hdHMoUmVuCiAgICAgICAgICAgICAgICAgLy8gYWJvdmUu
ICB8eG9mZnwgd2lsbCBlcXVhbCAtZmxvdy0+bWFyZ2luTGVmdCgpIGluIHRoaXMgY2FzZSwgc28g
aXQncyBhbHJlYWR5IGJlZW4gdGFrZW4KICAgICAgICAgICAgICAgICAvLyBpbnRvIGFjY291bnQu
ICBPbmx5IGFwcGx5IHRoaXMgY29kZSBpZiB8Y2hpbGR8IGlzIGZhbHNlLCBzaW5jZSBvdGhlcndp
c2UgdGhlIGxlZnQgbWFyZ2luCiAgICAgICAgICAgICAgICAgLy8gd2lsbCBnZXQgYXBwbGllZCB0
d2ljZS4KLSAgICAgICAgICAgICAgICBpZiAocHJldiAhPSBwYXJlbnQoKSkKKyAgICAgICAgICAg
ICAgICBpZiAocHJldiAhPSBjb250YWluaW5nQmxvY2soKSkKICAgICAgICAgICAgICAgICAgICAg
ZmxvYXRpbmdPYmotPm1fbGVmdCArPSBwcmV2LT5tYXJnaW5MZWZ0KCk7CiAgICAgICAgICAgICAg
ICAgZmxvYXRpbmdPYmotPm1fbGVmdCAtPSBtYXJnaW5MZWZ0KCk7CiAgICAgICAgICAgICAgICAg
ZmxvYXRpbmdPYmotPm1fc2hvdWxkUGFpbnQgPSBmYWxzZTsgIC8vIFdlIGFyZSBub3QgaW4gdGhl
IGRpcmVjdCBpbmhlcml0YW5jZSBjaGFpbiBmb3IgdGhpcyBmbG9hdC4gV2Ugd2lsbCBuZXZlciBw
YWludCBpdC4KQEAgLTMxODMsNyArMzEzNCwxMyBAQCB2b2lkIFJlbmRlckJsb2NrOjptYXJrQWxs
RGVzY2VuZGFudHNXaXRoCiAgICAgICAgIHJlbW92ZUZsb2F0aW5nT2JqZWN0KGZsb2F0VG9SZW1v
dmUpOwogCiAgICAgLy8gSXRlcmF0ZSBvdmVyIG91ciBjaGlsZHJlbiBhbmQgbWFyayB0aGVtIGFz
IG5lZWRlZC4KLSAgICBpZiAoIWNoaWxkcmVuSW5saW5lKCkpIHsKKyAgICBpZiAoY2hpbGRyZW5J
bmxpbmUoKSkgeworICAgICAgICBmb3IgKFJvb3RJbmxpbmVCb3gqIGJveCA9IGZpcnN0Um9vdEJv
eCgpOyBib3g7IGJveCA9IGJveC0+bmV4dFJvb3RCb3goKSkgeworICAgICAgICAgICAgUmVuZGVy
QmxvY2sqIGNoaWxkQmxvY2sgPSBib3gtPmFub255bW91c0lubGluZUJsb2NrKCk7CisgICAgICAg
ICAgICBpZiAoY2hpbGRCbG9jayAmJiAoZmxvYXRUb1JlbW92ZSA/IGNoaWxkQmxvY2stPmNvbnRh
aW5zRmxvYXQoZmxvYXRUb1JlbW92ZSkgOiBjaGlsZEJsb2NrLT5jb250YWluc0Zsb2F0cygpKSkK
KyAgICAgICAgICAgICAgICBjaGlsZEJsb2NrLT5tYXJrQWxsRGVzY2VuZGFudHNXaXRoRmxvYXRz
Rm9yTGF5b3V0KGZsb2F0VG9SZW1vdmUsIGluTGF5b3V0KTsKKyAgICAgICAgfQorICAgIH0gZWxz
ZSB7CiAgICAgICAgIGZvciAoUmVuZGVyT2JqZWN0KiBjaGlsZCA9IGZpcnN0Q2hpbGQoKTsgY2hp
bGQ7IGNoaWxkID0gY2hpbGQtPm5leHRTaWJsaW5nKCkpIHsKICAgICAgICAgICAgIGlmICgoIWZs
b2F0VG9SZW1vdmUgJiYgY2hpbGQtPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSkgfHwgIWNoaWxk
LT5pc1JlbmRlckJsb2NrKCkpCiAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC0zNDUxLDYg
KzM0MDgsMTEgQEAgc3RhdGljIFZpc2libGVQb3NpdGlvbiBwb3NpdGlvbkZvclBvaW50UgogICAg
IHJldHVybiBhbmNlc3Rvci0+Y3JlYXRlVmlzaWJsZVBvc2l0aW9uKGNoaWxkTm9kZS0+bm9kZUlu
ZGV4KCkgKyAxLCBVUFNUUkVBTSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0NoaWxkSGl0
VGVzdENhbmRpZGF0ZShSZW5kZXJCb3gqIGJveCkKK3sKKyAgICByZXR1cm4gYm94LT5oZWlnaHQo
KSAmJiBib3gtPnN0eWxlKCktPnZpc2liaWxpdHkoKSA9PSBWSVNJQkxFICYmICFib3gtPmlzRmxv
YXRpbmdPclBvc2l0aW9uZWQoKTsKK30KKwogVmlzaWJsZVBvc2l0aW9uIFJlbmRlckJsb2NrOjpw
b3NpdGlvbkZvclBvaW50V2l0aElubGluZUNoaWxkcmVuKGNvbnN0IEludFBvaW50JiBwb2ludElu
Q29udGVudHMpCiB7CiAgICAgQVNTRVJUKGNoaWxkcmVuSW5saW5lKCkpOwpAQCAtMzQ2Myw4ICsz
NDI1LDE4IEBAIFZpc2libGVQb3NpdGlvbiBSZW5kZXJCbG9jazo6cG9zaXRpb25Gb3IKICAgICBS
b290SW5saW5lQm94KiBmaXJzdFJvb3RCb3hXaXRoQ2hpbGRyZW4gPSAwOwogICAgIFJvb3RJbmxp
bmVCb3gqIGxhc3RSb290Qm94V2l0aENoaWxkcmVuID0gMDsKICAgICBmb3IgKFJvb3RJbmxpbmVC
b3gqIHJvb3QgPSBmaXJzdFJvb3RCb3goKTsgcm9vdDsgcm9vdCA9IHJvb3QtPm5leHRSb290Qm94
KCkpIHsKKyAgICAgICAgUmVuZGVyQmxvY2sqIGNoaWxkQmxvY2sgPSByb290LT5hbm9ueW1vdXNJ
bmxpbmVCbG9jaygpOworICAgICAgICBpZiAoY2hpbGRCbG9jaykgeworICAgICAgICAgICAgZmly
c3RSb290Qm94V2l0aENoaWxkcmVuID0gMDsKKyAgICAgICAgICAgIGxhc3RSb290Qm94V2l0aENo
aWxkcmVuID0gMDsKKyAgICAgICAgICAgIGlmIChpc0NoaWxkSGl0VGVzdENhbmRpZGF0ZShjaGls
ZEJsb2NrKSAmJiBwb2ludEluQ29udGVudHMueSgpIDwgY2hpbGRCbG9jay0+ZnJhbWVSZWN0KCku
Ym90dG9tKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uRm9yUG9pbnRSZXNwZWN0
aW5nRWRpdGluZ0JvdW5kYXJpZXModGhpcywgY2hpbGRCbG9jaywgcG9pbnRJbkNvbnRlbnRzKTsK
KyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKICAgICAgICAgaWYgKCFyb290LT5m
aXJzdExlYWZDaGlsZCgpKQogICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIAogICAgICAg
ICBpZiAoIWZpcnN0Um9vdEJveFdpdGhDaGlsZHJlbikKICAgICAgICAgICAgIGZpcnN0Um9vdEJv
eFdpdGhDaGlsZHJlbiA9IHJvb3Q7CiAgICAgICAgIGxhc3RSb290Qm94V2l0aENoaWxkcmVuID0g
cm9vdDsKQEAgLTM0NzIsNyArMzQ0NCw3IEBAIFZpc2libGVQb3NpdGlvbiBSZW5kZXJCbG9jazo6
cG9zaXRpb25Gb3IKICAgICAgICAgLy8gc2V0IHRoZSBib3R0b20gYmFzZWQgb24gd2hldGhlciB0
aGVyZSBpcyBhIG5leHQgcm9vdCBib3gKICAgICAgICAgLy8gRklYTUU6IFRoaXMgd2lsbCBjb25z
aWRlciBuZXh0Um9vdEJveCBldmVuIGlmIGl0IGhhcyBubyBjaGlsZHJlbiwgYW5kIG1heWJlIGl0
IHNob3VsZG4ndC4KICAgICAgICAgaW50IGJvdHRvbTsKLSAgICAgICAgaWYgKHJvb3QtPm5leHRS
b290Qm94KCkpIHsKKyAgICAgICAgaWYgKHJvb3QtPm5leHRSb290Qm94KCkgJiYgIXJvb3QtPm5l
eHRSb290Qm94KCktPmhhc0Fub255bW91c0lubGluZUJsb2NrKCkpIHsKICAgICAgICAgICAgIC8v
IEZJWE1FOiBXZSB3b3VsZCBwcmVmZXIgdG8gbWFrZSB0aGUgYnJlYWsgcG9pbnQgaGFsZndheSBi
ZXR3ZWVuIHRoZSBib3R0b20KICAgICAgICAgICAgIC8vIG9mIHRoZSBwcmV2aW91cyByb290IGJv
eCBhbmQgdGhlIHRvcCBvZiB0aGUgbmV4dCByb290IGJveC4KICAgICAgICAgICAgIGJvdHRvbSA9
IHJvb3QtPm5leHRSb290Qm94KCktPmxpbmVUb3AoKTsKQEAgLTM1MTcsMTcgKzM0ODksMTIgQEAg
VmlzaWJsZVBvc2l0aW9uIFJlbmRlckJsb2NrOjpwb3NpdGlvbkZvcgogICAgIHJldHVybiBjcmVh
dGVWaXNpYmxlUG9zaXRpb24oMCwgRE9XTlNUUkVBTSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgYm9v
bCBpc0NoaWxkSGl0VGVzdENhbmRpZGF0ZShSZW5kZXJCb3gqIGJveCkKLXsKLSAgICByZXR1cm4g
Ym94LT5oZWlnaHQoKSAmJiBib3gtPnN0eWxlKCktPnZpc2liaWxpdHkoKSA9PSBWSVNJQkxFICYm
ICFib3gtPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKTsKLX0KLQogVmlzaWJsZVBvc2l0aW9uIFJl
bmRlckJsb2NrOjpwb3NpdGlvbkZvclBvaW50KGNvbnN0IEludFBvaW50JiBwb2ludCkKIHsKICAg
ICBpZiAoaXNUYWJsZSgpKQogICAgICAgICByZXR1cm4gUmVuZGVyQm94Ojpwb3NpdGlvbkZvclBv
aW50KHBvaW50KTsKIAotICAgIGlmIChpc1JlcGxhY2VkKCkpIHsKKyAgICBpZiAoaXNSZXBsYWNl
ZCgpICYmICFpc0Fub255bW91c0lubGluZUJsb2NrKCkpIHsKICAgICAgICAgaWYgKHBvaW50Lnko
KSA8IDAgfHwgKHBvaW50LnkoKSA8IGhlaWdodCgpICYmIHBvaW50LngoKSA8IDApKQogICAgICAg
ICAgICAgcmV0dXJuIGNyZWF0ZVZpc2libGVQb3NpdGlvbihjYXJldE1pbk9mZnNldCgpLCBET1dO
U1RSRUFNKTsKICAgICAgICAgaWYgKHBvaW50LnkoKSA+PSBoZWlnaHQoKSB8fCAocG9pbnQueSgp
ID49IDAgJiYgcG9pbnQueCgpID49IHdpZHRoKCkpKQpAQCAtNDE0MiwxNCArNDEwOSwxNSBAQCB2
b2lkIFJlbmRlckJsb2NrOjpjYWxjSW5saW5lUHJlZldpZHRocygpCiAgICAgICAgICAgICAgICAg
fSBlbHNlCiAgICAgICAgICAgICAgICAgICAgIGNsZWFyUHJldmlvdXNGbG9hdCA9IGZhbHNlOwog
Ci0gICAgICAgICAgICAgICAgYm9vbCBjYW5CcmVha1JlcGxhY2VkRWxlbWVudCA9ICFjaGlsZC0+
aXNJbWFnZSgpIHx8IGFsbG93SW1hZ2VzVG9CcmVhazsKKyAgICAgICAgICAgICAgICBib29sIGNh
bkJyZWFrUmVwbGFjZWRFbGVtZW50ID0gIWNoaWxkLT5pc0ltYWdlKCkgfHwgYWxsb3dJbWFnZXNU
b0JyZWFrIHx8IGNoaWxkLT5pc0Fub255bW91c0lubGluZUJsb2NrKCk7CiAgICAgICAgICAgICAg
ICAgaWYgKChjYW5CcmVha1JlcGxhY2VkRWxlbWVudCAmJiAoYXV0b1dyYXAgfHwgb2xkQXV0b1dy
YXApKSB8fCBjbGVhclByZXZpb3VzRmxvYXQpIHsKICAgICAgICAgICAgICAgICAgICAgbV9taW5Q
cmVmV2lkdGggPSBtYXgoaW5saW5lTWluLCBtX21pblByZWZXaWR0aCk7CiAgICAgICAgICAgICAg
ICAgICAgIGlubGluZU1pbiA9IDA7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAg
ICAgLy8gSWYgd2UncmUgc3VwcG9zZWQgdG8gY2xlYXIgdGhlIHByZXZpb3VzIGZsb2F0LCB0aGVu
IHRlcm1pbmF0ZSBtYXh3aWR0aCBhcyB3ZWxsLgotICAgICAgICAgICAgICAgIGlmIChjbGVhclBy
ZXZpb3VzRmxvYXQpIHsKKyAgICAgICAgICAgICAgICAvLyBBbHNvIGRvIHRoaXMgZm9yIGFub255
bW91cyBpbmxpbmUgYmxvY2tzLgorICAgICAgICAgICAgICAgIGlmIChjbGVhclByZXZpb3VzRmxv
YXQgfHwgY2hpbGQtPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkgewogICAgICAgICAgICAgICAg
ICAgICBtX21heFByZWZXaWR0aCA9IG1heChpbmxpbmVNYXgsIG1fbWF4UHJlZldpZHRoKTsKICAg
ICAgICAgICAgICAgICAgICAgaW5saW5lTWF4ID0gMDsKICAgICAgICAgICAgICAgICB9CkBAIC00
MTU4LDE1ICs0MTI2LDE3IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmNhbGNJbmxpbmVQcmVmV2lkdGhz
KCkKICAgICAgICAgICAgICAgICBpbnQgdGkgPSAwOwogICAgICAgICAgICAgICAgIGlmICghYWRk
ZWRUZXh0SW5kZW50KSB7CiAgICAgICAgICAgICAgICAgICAgIGFkZGVkVGV4dEluZGVudCA9IHRy
dWU7Ci0gICAgICAgICAgICAgICAgICAgIHRpID0gc3R5bGUoKS0+dGV4dEluZGVudCgpLmNhbGNN
aW5WYWx1ZShjdyk7Ci0gICAgICAgICAgICAgICAgICAgIGNoaWxkTWluKz10aTsKLSAgICAgICAg
ICAgICAgICAgICAgY2hpbGRNYXgrPXRpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxk
LT5pc0Fub255bW91c0lubGluZUJsb2NrKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRp
ID0gc3R5bGUoKS0+dGV4dEluZGVudCgpLmNhbGNNaW5WYWx1ZShjdyk7CisgICAgICAgICAgICAg
ICAgICAgICAgICBjaGlsZE1pbiArPSB0aTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxk
TWF4ICs9IHRpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCiAg
ICAgICAgICAgICAgICAgLy8gQWRkIG91ciB3aWR0aCB0byB0aGUgbWF4LgogICAgICAgICAgICAg
ICAgIGlubGluZU1heCArPSBjaGlsZE1heDsKIAotICAgICAgICAgICAgICAgIGlmICghYXV0b1dy
YXAgfHwgIWNhbkJyZWFrUmVwbGFjZWRFbGVtZW50KSB7CisgICAgICAgICAgICAgICAgaWYgKCgh
YXV0b1dyYXAgfHwgIWNhbkJyZWFrUmVwbGFjZWRFbGVtZW50KSAmJiAhY2hpbGQtPmlzQW5vbnlt
b3VzSW5saW5lQmxvY2soKSkgewogICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQtPmlzRmxv
YXRpbmcoKSkKICAgICAgICAgICAgICAgICAgICAgICAgIG1fbWluUHJlZldpZHRoID0gbWF4KGNo
aWxkTWluLCBtX21pblByZWZXaWR0aCk7CiAgICAgICAgICAgICAgICAgICAgIGVsc2UKQEAgLTQx
NzcsNiArNDE0NywxMiBAQCB2b2lkIFJlbmRlckJsb2NrOjpjYWxjSW5saW5lUHJlZldpZHRocygp
CiAKICAgICAgICAgICAgICAgICAgICAgLy8gTm93IHN0YXJ0IGEgbmV3IGxpbmUuCiAgICAgICAg
ICAgICAgICAgICAgIGlubGluZU1pbiA9IDA7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAg
ICAgICAgICAgICAgICBpZiAoY2hpbGQtPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkgeworICAg
ICAgICAgICAgICAgICAgICAgICAgLy8gVGVybWluYXRlIG1heCB3aWR0aCBhcyB3ZWxsLgorICAg
ICAgICAgICAgICAgICAgICAgICAgbV9tYXhQcmVmV2lkdGggPSBtYXgoY2hpbGRNYXgsIG1fbWF4
UHJlZldpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZU1heCA9IDA7CisgICAg
ICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAv
LyBXZSBhcmUgbm8gbG9uZ2VyIHN0cmlwcGluZyB3aGl0ZXNwYWNlIGF0IHRoZSBzdGFydCBvZgpA
QCAtNDQxNyw5ICs0MzkzLDEyIEBAIGludCBSZW5kZXJCbG9jazo6bGluZUhlaWdodChib29sIGZp
cnN0TGkKICAgICAvLyB0aGUgYmFzZSBjbGFzcy4gIElmIHdlJ3JlIGJlaW5nIHF1ZXJpZWQgYXMg
dGhvdWdoIHdlJ3JlIHRoZSByb290IGxpbmUKICAgICAvLyBib3gsIHRoZW4gdGhlIGZhY3QgdGhh
dCB3ZSdyZSBhbiBpbmxpbmUtYmxvY2sgaXMgaXJyZWxldmFudCwgYW5kIHdlIGJlaGF2ZQogICAg
IC8vIGp1c3QgbGlrZSBhIGJsb2NrLgotICAgIGlmIChpc1JlcGxhY2VkKCkgJiYgIWlzUm9vdExp
bmVCb3gpCisgICAgaWYgKGlzUmVwbGFjZWQoKSAmJiAhaXNSb290TGluZUJveCkgeworICAgICAg
ICBpZiAoaXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKQorICAgICAgICAgICAgcmV0dXJuIGhlaWdo
dCgpOwogICAgICAgICByZXR1cm4gaGVpZ2h0KCkgKyBtYXJnaW5Ub3AoKSArIG1hcmdpbkJvdHRv
bSgpOwotICAgIAorICAgIH0KKwogICAgIGlmIChmaXJzdExpbmUgJiYgZG9jdW1lbnQoKS0+dXNl
c0ZpcnN0TGluZVJ1bGVzKCkpIHsKICAgICAgICAgUmVuZGVyU3R5bGUqIHMgPSBzdHlsZShmaXJz
dExpbmUpOwogICAgICAgICBpZiAocyAhPSBzdHlsZSgpKQpAQCAtNDQ1MSw2ICs0NDMwLDggQEAg
aW50IFJlbmRlckJsb2NrOjpiYXNlbGluZVBvc2l0aW9uKGJvb2wgYgogICAgICAgICAvLyBXZSBh
bHNvIGdpdmUgdXAgb24gZmluZGluZyBhIGJhc2VsaW5lIGlmIHdlIGhhdmUgYSB2ZXJ0aWNhbCBz
Y3JvbGxiYXIsIG9yIGlmIHdlIGFyZSBzY3JvbGxlZAogICAgICAgICAvLyB2ZXJ0aWNhbGx5IChl
LmcuLCBhbiBvdmVyZmxvdzpoaWRkZW4gYmxvY2sgdGhhdCBoYXMgaGFkIHNjcm9sbFRvcCBtb3Zl
ZCkgb3IgaWYgdGhlIGJhc2VsaW5lIGlzIG91dHNpZGUKICAgICAgICAgLy8gb2Ygb3VyIGNvbnRl
bnQgYm94LgorICAgICAgICBpZiAoaXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKQorICAgICAgICAg
ICAgcmV0dXJuIGhlaWdodCgpOwogICAgICAgICBpbnQgYmFzZWxpbmVQb3MgPSAobGF5ZXIoKSAm
JiAobGF5ZXIoKS0+bWFycXVlZSgpIHx8IGxheWVyKCktPnZlcnRpY2FsU2Nyb2xsYmFyKCkgfHwg
bGF5ZXIoKS0+c2Nyb2xsWU9mZnNldCgpICE9IDApKSA/IC0xIDogbGFzdExpbmVCb3hCYXNlbGlu
ZSgpOwogICAgICAgICBpZiAoYmFzZWxpbmVQb3MgIT0gLTEgJiYgYmFzZWxpbmVQb3MgPD0gYm9y
ZGVyVG9wKCkgKyBwYWRkaW5nVG9wKCkgKyBjb250ZW50SGVpZ2h0KCkpCiAgICAgICAgICAgICBy
ZXR1cm4gbWFyZ2luVG9wKCkgKyBiYXNlbGluZVBvczsKQEAgLTQ4NzUsNjAgKzQ4NTYsNiBAQCB2
b2lkIFJlbmRlckJsb2NrOjpzZXRNYXhCb3R0b21NYXJnaW5zKGluCiAgICAgbV9tYXhNYXJnaW4t
Pm1fYm90dG9tTmVnID0gbmVnOwogfQogCi12b2lkIFJlbmRlckJsb2NrOjphYnNvbHV0ZVJlY3Rz
KFZlY3RvcjxJbnRSZWN0PiYgcmVjdHMsIGludCB0eCwgaW50IHR5KQotewotICAgIC8vIEZvciBi
bG9ja3MgaW5zaWRlIGlubGluZXMsIHdlIGdvIGFoZWFkIGFuZCBpbmNsdWRlIG1hcmdpbnMgc28g
dGhhdCB3ZSBydW4gcmlnaHQgdXAgdG8gdGhlCi0gICAgLy8gaW5saW5lIGJveGVzIGFib3ZlIGFu
ZCBiZWxvdyB1cyAodGh1cyBnZXR0aW5nIG1lcmdlZCB3aXRoIHRoZW0gdG8gZm9ybSBhIHNpbmds
ZSBpcnJlZ3VsYXIKLSAgICAvLyBzaGFwZSkuCi0gICAgaWYgKGlubGluZUNvbnRpbnVhdGlvbigp
KSB7Ci0gICAgICAgIHJlY3RzLmFwcGVuZChJbnRSZWN0KHR4LCB0eSAtIGNvbGxhcHNlZE1hcmdp
blRvcCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCgpLCBoZWlnaHQoKSAr
IGNvbGxhcHNlZE1hcmdpblRvcCgpICsgY29sbGFwc2VkTWFyZ2luQm90dG9tKCkpKTsKLSAgICAg
ICAgaW5saW5lQ29udGludWF0aW9uKCktPmFic29sdXRlUmVjdHMocmVjdHMsCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4IC0geCgpICsgaW5saW5lQ29udGlu
dWF0aW9uKCktPmNvbnRhaW5pbmdCbG9jaygpLT54KCksCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHR5IC0geSgpICsgaW5saW5lQ29udGludWF0aW9uKCktPmNv
bnRhaW5pbmdCbG9jaygpLT55KCkpOwotICAgIH0gZWxzZQotICAgICAgICByZWN0cy5hcHBlbmQo
SW50UmVjdCh0eCwgdHksIHdpZHRoKCksIGhlaWdodCgpKSk7Ci19Ci0KLXZvaWQgUmVuZGVyQmxv
Y2s6OmFic29sdXRlUXVhZHMoVmVjdG9yPEZsb2F0UXVhZD4mIHF1YWRzKQotewotICAgIC8vIEZv
ciBibG9ja3MgaW5zaWRlIGlubGluZXMsIHdlIGdvIGFoZWFkIGFuZCBpbmNsdWRlIG1hcmdpbnMg
c28gdGhhdCB3ZSBydW4gcmlnaHQgdXAgdG8gdGhlCi0gICAgLy8gaW5saW5lIGJveGVzIGFib3Zl
IGFuZCBiZWxvdyB1cyAodGh1cyBnZXR0aW5nIG1lcmdlZCB3aXRoIHRoZW0gdG8gZm9ybSBhIHNp
bmdsZSBpcnJlZ3VsYXIKLSAgICAvLyBzaGFwZSkuCi0gICAgaWYgKGlubGluZUNvbnRpbnVhdGlv
bigpKSB7Ci0gICAgICAgIEZsb2F0UmVjdCBsb2NhbFJlY3QoMCwgLWNvbGxhcHNlZE1hcmdpblRv
cCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoKCksIGhlaWdodCgpICsgY29s
bGFwc2VkTWFyZ2luVG9wKCkgKyBjb2xsYXBzZWRNYXJnaW5Cb3R0b20oKSk7Ci0gICAgICAgIHF1
YWRzLmFwcGVuZChsb2NhbFRvQWJzb2x1dGVRdWFkKGxvY2FsUmVjdCkpOwotICAgICAgICBpbmxp
bmVDb250aW51YXRpb24oKS0+YWJzb2x1dGVRdWFkcyhxdWFkcyk7Ci0gICAgfSBlbHNlCi0gICAg
ICAgIHF1YWRzLmFwcGVuZChSZW5kZXJCb3g6OmxvY2FsVG9BYnNvbHV0ZVF1YWQoRmxvYXRSZWN0
KDAsIDAsIHdpZHRoKCksIGhlaWdodCgpKSkpOwotfQotCi1JbnRSZWN0IFJlbmRlckJsb2NrOjpy
ZWN0V2l0aE91dGxpbmVGb3JSZXBhaW50KFJlbmRlckJveE1vZGVsT2JqZWN0KiByZXBhaW50Q29u
dGFpbmVyLCBpbnQgb3V0bGluZVdpZHRoKQotewotICAgIEludFJlY3QgcihSZW5kZXJCb3g6OnJl
Y3RXaXRoT3V0bGluZUZvclJlcGFpbnQocmVwYWludENvbnRhaW5lciwgb3V0bGluZVdpZHRoKSk7
Ci0gICAgaWYgKGlubGluZUNvbnRpbnVhdGlvbigpKQotICAgICAgICByLmluZmxhdGVZKGNvbGxh
cHNlZE1hcmdpblRvcCgpKTsKLSAgICByZXR1cm4gcjsKLX0KLQotUmVuZGVyT2JqZWN0KiBSZW5k
ZXJCbG9jazo6aG92ZXJBbmNlc3RvcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGlubGluZUNvbnRp
bnVhdGlvbigpID8gaW5saW5lQ29udGludWF0aW9uKCkgOiBSZW5kZXJCb3g6OmhvdmVyQW5jZXN0
b3IoKTsKLX0KLQotdm9pZCBSZW5kZXJCbG9jazo6dXBkYXRlRHJhZ1N0YXRlKGJvb2wgZHJhZ09u
KQotewotICAgIFJlbmRlckJveDo6dXBkYXRlRHJhZ1N0YXRlKGRyYWdPbik7Ci0gICAgaWYgKGlu
bGluZUNvbnRpbnVhdGlvbigpKQotICAgICAgICBpbmxpbmVDb250aW51YXRpb24oKS0+dXBkYXRl
RHJhZ1N0YXRlKGRyYWdPbik7Ci19Ci0KLVJlbmRlclN0eWxlKiBSZW5kZXJCbG9jazo6b3V0bGlu
ZVN0eWxlRm9yUmVwYWludCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGlubGluZUNvbnRpbnVhdGlv
bigpID8gaW5saW5lQ29udGludWF0aW9uKCktPnN0eWxlKCkgOiBzdHlsZSgpOwotfQotCiB2b2lk
IFJlbmRlckJsb2NrOjpjaGlsZEJlY2FtZU5vbklubGluZShSZW5kZXJPYmplY3QqKQogewogICAg
IG1ha2VDaGlsZHJlbk5vbklubGluZSgpOwpAQCAtNDkzNywyNiArNDg2NCw2IEBAIHZvaWQgUmVu
ZGVyQmxvY2s6OmNoaWxkQmVjYW1lTm9uSW5saW5lKFIKICAgICAvLyB8dGhpc3wgbWF5IGJlIGRl
YWQgaGVyZQogfQogCi12b2lkIFJlbmRlckJsb2NrOjp1cGRhdGVIaXRUZXN0UmVzdWx0KEhpdFRl
c3RSZXN1bHQmIHJlc3VsdCwgY29uc3QgSW50UG9pbnQmIHBvaW50KQotewotICAgIGlmIChyZXN1
bHQuaW5uZXJOb2RlKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIE5vZGUqIG4gPSBub2RlKCk7
Ci0gICAgaWYgKGlubGluZUNvbnRpbnVhdGlvbigpKQotICAgICAgICAvLyBXZSBhcmUgaW4gdGhl
IG1hcmdpbnMgb2YgYmxvY2sgZWxlbWVudHMgdGhhdCBhcmUgcGFydCBvZiBhIGNvbnRpbnVhdGlv
bi4gIEluCi0gICAgICAgIC8vIHRoaXMgY2FzZSB3ZSdyZSBhY3R1YWxseSBzdGlsbCBpbnNpZGUg
dGhlIGVuY2xvc2luZyBpbmxpbmUgZWxlbWVudCB0aGF0IHdhcwotICAgICAgICAvLyBzcGxpdC4g
IEdvIGFoZWFkIGFuZCBzZXQgb3VyIGlubmVyIG5vZGUgYWNjb3JkaW5nbHkuCi0gICAgICAgIG4g
PSBpbmxpbmVDb250aW51YXRpb24oKS0+bm9kZSgpOwotCi0gICAgaWYgKG4pIHsKLSAgICAgICAg
cmVzdWx0LnNldElubmVyTm9kZShuKTsKLSAgICAgICAgaWYgKCFyZXN1bHQuaW5uZXJOb25TaGFy
ZWROb2RlKCkpCi0gICAgICAgICAgICByZXN1bHQuc2V0SW5uZXJOb25TaGFyZWROb2RlKG4pOwot
ICAgICAgICByZXN1bHQuc2V0TG9jYWxQb2ludChwb2ludCk7Ci0gICAgfQotfQotCiBJbnRSZWN0
IFJlbmRlckJsb2NrOjpsb2NhbENhcmV0UmVjdChJbmxpbmVCb3gqIGlubGluZUJveCwgaW50IGNh
cmV0T2Zmc2V0LCBpbnQqIGV4dHJhV2lkdGhUb0VuZE9mTGluZSkKIHsKICAgICAvLyBEbyB0aGUg
bm9ybWFsIGNhbGN1bGF0aW9uIGluIG1vc3QgY2FzZXMuCkBAIC01MDM3LDIxICs0OTQ0LDE3IEBA
IEludFJlY3QgUmVuZGVyQmxvY2s6OmxvY2FsQ2FyZXRSZWN0KElubGkKIAogdm9pZCBSZW5kZXJC
bG9jazo6YWRkRm9jdXNSaW5nUmVjdHMoVmVjdG9yPEludFJlY3Q+JiByZWN0cywgaW50IHR4LCBp
bnQgdHkpCiB7Ci0gICAgLy8gRm9yIGJsb2NrcyBpbnNpZGUgaW5saW5lcywgd2UgZ28gYWhlYWQg
YW5kIGluY2x1ZGUgbWFyZ2lucyBzbyB0aGF0IHdlIHJ1biByaWdodCB1cCB0byB0aGUKLSAgICAv
LyBpbmxpbmUgYm94ZXMgYWJvdmUgYW5kIGJlbG93IHVzICh0aHVzIGdldHRpbmcgbWVyZ2VkIHdp
dGggdGhlbSB0byBmb3JtIGEgc2luZ2xlIGlycmVndWxhcgotICAgIC8vIHNoYXBlKS4KLSAgICBp
ZiAoaW5saW5lQ29udGludWF0aW9uKCkpIHsKLSAgICAgICAgLy8gRklYTUU6IFRoaXMgY2hlY2sg
cmVhbGx5IGlzbid0IGFjY3VyYXRlLiAKLSAgICAgICAgYm9vbCBuZXh0SW5saW5lSGFzTGluZUJv
eCA9IGlubGluZUNvbnRpbnVhdGlvbigpLT5maXJzdExpbmVCb3goKTsKLSAgICAgICAgLy8gRklY
TUU6IFRoaXMgaXMgd3JvbmcuIFRoZSBwcmluY2lwYWwgcmVuZGVyZXIgbWF5IG5vdCBiZSB0aGUg
Y29udGludWF0aW9uIHByZWNlZGluZyB0aGlzIGJsb2NrLgotICAgICAgICBib29sIHByZXZJbmxp
bmVIYXNMaW5lQm94ID0gdG9SZW5kZXJJbmxpbmUoaW5saW5lQ29udGludWF0aW9uKCktPm5vZGUo
KS0+cmVuZGVyZXIoKSktPmZpcnN0TGluZUJveCgpOyAKLSAgICAgICAgaW50IHRvcE1hcmdpbiA9
IHByZXZJbmxpbmVIYXNMaW5lQm94ID8gY29sbGFwc2VkTWFyZ2luVG9wKCkgOiAwOwotICAgICAg
ICBpbnQgYm90dG9tTWFyZ2luID0gbmV4dElubGluZUhhc0xpbmVCb3ggPyBjb2xsYXBzZWRNYXJn
aW5Cb3R0b20oKSA6IDA7Ci0gICAgICAgIEludFJlY3QgcmVjdCh0eCwgdHkgLSB0b3BNYXJnaW4s
IHdpZHRoKCksIGhlaWdodCgpICsgdG9wTWFyZ2luICsgYm90dG9tTWFyZ2luKTsKLSAgICAgICAg
aWYgKCFyZWN0LmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJlY3RzLmFwcGVuZChyZWN0KTsKLSAg
ICB9IGVsc2UgaWYgKHdpZHRoKCkgJiYgaGVpZ2h0KCkpCi0gICAgICAgIHJlY3RzLmFwcGVuZChJ
bnRSZWN0KHR4LCB0eSwgd2lkdGgoKSwgaGVpZ2h0KCkpKTsKKyAgICBpbnQgdG9wID0gdHk7Cisg
ICAgaW50IGJvdHRvbSA9IHRvcCArIGhlaWdodCgpOworICAgIGlmIChpc0Fub255bW91c0lubGlu
ZUJsb2NrKCkgJiYgaGVpZ2h0KCkpIHsKKyAgICAgICAgaWYgKG1faW5saW5lQm94V3JhcHBlciAm
JiBtX2lubGluZUJveFdyYXBwZXItPnJvb3QoKS0+cHJldlJvb3RCb3goKSkKKyAgICAgICAgICAg
IHRvcCA9IG1pbih0b3AsIHRvcCAtIGNvbGxhcHNlZE1hcmdpblRvcCgpKTsKKyAgICAgICAgaWYg
KG1faW5saW5lQm94V3JhcHBlciAmJiBtX2lubGluZUJveFdyYXBwZXItPnJvb3QoKS0+bmV4dFJv
b3RCb3goKSkKKyAgICAgICAgICAgIGJvdHRvbSA9IG1heChib3R0b20sIGJvdHRvbSArIGNvbGxh
cHNlZE1hcmdpbkJvdHRvbSgpKTsKKyAgICB9CisgICAgSW50UmVjdCByZXN1bHQodHgsIHRvcCwg
d2lkdGgoKSwgYm90dG9tIC0gdG9wKTsKKyAgICBpZiAoIXJlc3VsdC5pc0VtcHR5KCkpCisgICAg
ICAgIHJlY3RzLmFwcGVuZChyZXN1bHQpOwogCiAgICAgaWYgKCFoYXNPdmVyZmxvd0NsaXAoKSAm
JiAhaGFzQ29udHJvbENsaXAoKSkgewogICAgICAgICBmb3IgKFJvb3RJbmxpbmVCb3gqIGN1cnIg
PSBmaXJzdFJvb3RCb3goKTsgY3VycjsgY3VyciA9IGN1cnItPm5leHRSb290Qm94KCkpIHsKQEAg
LTUwNzUsMTEgKzQ5NzgsNiBAQCB2b2lkIFJlbmRlckJsb2NrOjphZGRGb2N1c1JpbmdSZWN0cyhW
ZWN0CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0KLSAgICBpZiAoaW5saW5lQ29u
dGludWF0aW9uKCkpCi0gICAgICAgIGlubGluZUNvbnRpbnVhdGlvbigpLT5hZGRGb2N1c1JpbmdS
ZWN0cyhyZWN0cywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB0eCAtIHgoKSArIGlubGluZUNvbnRpbnVhdGlvbigpLT5jb250YWluaW5nQmxvY2soKS0+
eCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHkg
LSB5KCkgKyBpbmxpbmVDb250aW51YXRpb24oKS0+Y29udGFpbmluZ0Jsb2NrKCktPnkoKSk7CiB9
CiAKIFJlbmRlckJsb2NrKiBSZW5kZXJCbG9jazo6Y3JlYXRlQW5vbnltb3VzQmxvY2soYm9vbCBp
c0ZsZXhpYmxlQm94KSBjb25zdApAQCAtNTExMSw2ICs1MDA5LDggQEAgY29uc3QgY2hhciogUmVu
ZGVyQmxvY2s6OnJlbmRlck5hbWUoKSBjbwogICAgICAgICByZXR1cm4gIlJlbmRlckJsb2NrIChw
b3NpdGlvbmVkKSI7CiAgICAgaWYgKGlzQW5vbnltb3VzQmxvY2soKSkKICAgICAgICAgcmV0dXJu
ICJSZW5kZXJCbG9jayAoYW5vbnltb3VzKSI7CisgICAgZWxzZSBpZiAoaXNBbm9ueW1vdXNJbmxp
bmVCbG9jaygpKQorICAgICAgICByZXR1cm4gIlJlbmRlckJsb2NrIChhbm9ueW1vdXMgaW5saW5l
LWJsb2NrKSI7CiAgICAgZWxzZSBpZiAoaXNBbm9ueW1vdXMoKSkKICAgICAgICAgcmV0dXJuICJS
ZW5kZXJCbG9jayAoZ2VuZXJhdGVkKSI7CiAgICAgaWYgKGlzUmVsUG9zaXRpb25lZCgpKQpJbmRl
eDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3JlbmRlcmluZy9SZW5kZXJCbG9jay5oCShyZXZpc2lvbiA1NDc3NSkKKysrIFdlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlckJsb2NrLmgJKHdvcmtpbmcgY29weSkKQEAgLTc5LDcgKzc5LDcgQEAgcHVi
bGljOgogICAgIHN0YXRpYyB2b2lkIHJlbW92ZVBlcmNlbnRIZWlnaHREZXNjZW5kYW50KFJlbmRl
ckJveCopOwogICAgIEhhc2hTZXQ8UmVuZGVyQm94Kj4qIHBlcmNlbnRIZWlnaHREZXNjZW5kYW50
cygpIGNvbnN0OwogCi0gICAgUm9vdElubGluZUJveCogY3JlYXRlQW5kQXBwZW5kUm9vdElubGlu
ZUJveCgpOworICAgIFJvb3RJbmxpbmVCb3gqIGNyZWF0ZUFuZEFwcGVuZFJvb3RJbmxpbmVCb3go
UmVuZGVyQmxvY2sqIGFub255bW91c0lubGluZUJsb2NrKTsKIAogICAgIGJvb2wgZ2VuZXJhdGVz
TGluZUJveGVzRm9ySW5saW5lQ2hpbGQoUmVuZGVyT2JqZWN0KiwgYm9vbCBpc0xpbmVFbXB0eSA9
IHRydWUsIGJvb2wgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5ID0gdHJ1ZSk7CiAKQEAgLTEyOSwx
NSArMTI5LDE1IEBAIHB1YmxpYzoKIAogICAgIHZvaWQgYWRqdXN0UmVjdEZvckNvbHVtbnMoSW50
UmVjdCYpIGNvbnN0OwogCi0gICAgdm9pZCBhZGRDb250aW51YXRpb25XaXRoT3V0bGluZShSZW5k
ZXJJbmxpbmUqKTsKLQotICAgIFJlbmRlcklubGluZSogaW5saW5lQ29udGludWF0aW9uKCkgY29u
c3QgeyByZXR1cm4gbV9pbmxpbmVDb250aW51YXRpb247IH0KLSAgICB2b2lkIHNldElubGluZUNv
bnRpbnVhdGlvbihSZW5kZXJJbmxpbmUqIGMpIHsgbV9pbmxpbmVDb250aW51YXRpb24gPSBjOyB9
Ci0KICAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGEgY29udmVuaWVuY2UgaGVscGVyIGZvciBjcmVh
dGluZyBhbiBhbm9ueW1vdXMgYmxvY2sgdGhhdCBpbmhlcml0cyBpdHMKICAgICAvLyBzdHlsZSBm
cm9tIHRoaXMgUmVuZGVyQmxvY2suCiAgICAgUmVuZGVyQmxvY2sqIGNyZWF0ZUFub255bW91c0Js
b2NrKGJvb2wgaXNGbGV4aWJsZUJveCA9IGZhbHNlKSBjb25zdDsKIAorICAgIHZpcnR1YWwgdm9p
ZCBwYWludChQYWludEluZm8mLCBpbnQgdHgsIGludCB0eSk7CisgICAgdmlydHVhbCB2b2lkIHBh
aW50T2JqZWN0KFBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5KTsKKworICAgIGJvb2wgaW5Sb290
QmxvY2tDb250ZXh0KCkgY29uc3Q7CisKICAgICBzdGF0aWMgdm9pZCBhcHBlbmRSdW5zRm9yT2Jq
ZWN0KGludCBzdGFydCwgaW50IGVuZCwgUmVuZGVyT2JqZWN0KiwgSW5saW5lQmlkaVJlc29sdmVy
Jik7ICAgIAogICAgIHN0YXRpYyBib29sIHJlcXVpcmVzTGluZUJveChjb25zdCBJbmxpbmVJdGVy
YXRvciYsIGJvb2wgaXNMaW5lRW1wdHkgPSB0cnVlLCBib29sIHByZXZpb3VzTGluZUJyb2tlQ2xl
YW5seSA9IHRydWUpOwogCkBAIC0xNjgsOSArMTY4LDYgQEAgcHJvdGVjdGVkOgogCiAgICAgdm9p
ZCBsYXlvdXRQb3NpdGlvbmVkT2JqZWN0cyhib29sIHJlbGF5b3V0Q2hpbGRyZW4pOwogCi0gICAg
dmlydHVhbCB2b2lkIHBhaW50KFBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5KTsKLSAgICB2aXJ0
dWFsIHZvaWQgcGFpbnRPYmplY3QoUGFpbnRJbmZvJiwgaW50IHR4LCBpbnQgdHkpOwotCiAgICAg
aW50IHJpZ2h0UmVsT2Zmc2V0KGludCB5LCBpbnQgZml4ZWRPZmZzZXQsIGJvb2wgYXBwbHlUZXh0
SW5kZW50ID0gdHJ1ZSwgaW50KiBoZWlnaHRSZW1haW5pbmcgPSAwKSBjb25zdDsKICAgICBpbnQg
bGVmdFJlbE9mZnNldChpbnQgeSwgaW50IGZpeGVkT2Zmc2V0LCBib29sIGFwcGx5VGV4dEluZGVu
dCA9IHRydWUsIGludCogaGVpZ2h0UmVtYWluaW5nID0gMCkgY29uc3Q7CiAKQEAgLTE4Myw4ICsx
ODAsNiBAQCBwcm90ZWN0ZWQ6CiAKICAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlRmlyc3RMZXR0ZXIo
KTsKIAotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVIaXRUZXN0UmVzdWx0KEhpdFRlc3RSZXN1bHQm
LCBjb25zdCBJbnRQb2ludCYpOwotCiAgICAgLy8gRGVsYXkgdXBkYXRlIHNjcm9sbGJhciB1bnRp
bCBmaW5pc2hEZWxheVJlcGFpbnQoKSB3aWxsIGJlCiAgICAgLy8gY2FsbGVkLiBUaGlzIGZ1bmN0
aW9uIGlzIHVzZWQgd2hlbiBhIGZsZXhib3ggaXMgbGF5aW5nIG91dCBpdHMKICAgICAvLyBkZXNj
ZW5kYW50LiBJZiBtdWx0aXBsZSBjYWxscyBhcmUgbWFkZSB0byBzdGFydERlbGF5UmVwYWludCgp
LApAQCAtMjQ4LDcgKzI0Myw5IEBAIHByaXZhdGU6CiAgICAgICAgIGJvb2wgZXZlckhhZExheW91
dDsKICAgICB9OwogCi0gICAgLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMnIGltcGxlbWVudGF0
aW9ucyBhcmUgaW4gUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcC4KKyAgICBjbGFzcyBNYXJnaW5J
bmZvOworCisgICAgLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMnIGltcGxlbWVudGF0aW9ucyBh
cmUgaW4gUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcC4gICAgCiAgICAgdm9pZCBiaWRpUmVvcmRl
ckxpbmUoSW5saW5lQmlkaVJlc29sdmVyJiwgY29uc3QgSW5saW5lSXRlcmF0b3ImIGVuZCwgYm9v
bCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHkpOwogICAgIFJvb3RJbmxpbmVCb3gqIGRldGVybWlu
ZVN0YXJ0UG9zaXRpb24oYm9vbCYgZmlyc3RMaW5lLCBib29sJiBmdWxsTGF5b3V0LCBib29sJiBw
cmV2aW91c0xpbmVCcm9rZUNsZWFubHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBJbmxpbmVCaWRpUmVzb2x2ZXImLCBWZWN0b3I8RmxvYXRXaXRoUmVjdD4mIGZs
b2F0cywgdW5zaWduZWQmIG51bUNsZWFuRmxvYXRzKTsKQEAgLTI2MSwxNCArMjU4LDE1IEBAIHBy
aXZhdGU6CiAgICAgdm9pZCBza2lwVHJhaWxpbmdXaGl0ZXNwYWNlKElubGluZUl0ZXJhdG9yJiwg
Ym9vbCBpc0xpbmVFbXB0eSwgYm9vbCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHkpOwogICAgIGlu
dCBza2lwTGVhZGluZ1doaXRlc3BhY2UoSW5saW5lQmlkaVJlc29sdmVyJiwgYm9vbCBmaXJzdExp
bmUsIGJvb2wgaXNMaW5lRW1wdHksIGJvb2wgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KTsKICAg
ICB2b2lkIGZpdEJlbG93RmxvYXRzKGludCB3aWR0aFRvRml0LCBib29sIGZpcnN0TGluZSwgaW50
JiBhdmFpbGFibGVXaWR0aCk7Ci0gICAgSW5saW5lSXRlcmF0b3IgZmluZE5leHRMaW5lQnJlYWso
SW5saW5lQmlkaVJlc29sdmVyJiwgYm9vbCBmaXJzdExpbmUsIGJvb2wmIGlzTGluZUVtcHR5LCBi
b29sJiBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHksIEVDbGVhciogY2xlYXIgPSAwKTsKKyAgICBJ
bmxpbmVJdGVyYXRvciBmaW5kTmV4dExpbmVCcmVhayhJbmxpbmVCaWRpUmVzb2x2ZXImLCBib29s
IGZpcnN0TGluZSwgYm9vbCYgaXNMaW5lRW1wdHksIGJvb2wmIHByZXZpb3VzTGluZUJyb2tlQ2xl
YW5seSwgTWFyZ2luSW5mbyYsIEVDbGVhciogY2xlYXIgPSAwKTsKICAgICBSb290SW5saW5lQm94
KiBjb25zdHJ1Y3RMaW5lKHVuc2lnbmVkIHJ1bkNvdW50LCBCaWRpUnVuKiBmaXJzdFJ1biwgQmlk
aVJ1biogbGFzdFJ1biwgYm9vbCBmaXJzdExpbmUsIGJvb2wgbGFzdExpbmUsIFJlbmRlck9iamVj
dCogZW5kT2JqZWN0KTsKLSAgICBJbmxpbmVGbG93Qm94KiBjcmVhdGVMaW5lQm94ZXMoUmVuZGVy
T2JqZWN0KiwgYm9vbCBmaXJzdExpbmUpOworICAgIElubGluZUZsb3dCb3gqIGNyZWF0ZUxpbmVC
b3hlcyhSZW5kZXJPYmplY3QqLCBib29sIGZpcnN0TGluZSwgUmVuZGVyQmxvY2sqIGFub255bW91
c0lubGluZUJsb2NrKTsKICAgICB2b2lkIGNvbXB1dGVIb3Jpem9udGFsUG9zaXRpb25zRm9yTGlu
ZShSb290SW5saW5lQm94KiwgYm9vbCBmaXJzdExpbmUsIEJpZGlSdW4qIGZpcnN0UnVuLCBCaWRp
UnVuKiB0cmFpbGluZ1NwYWNlUnVuLCBib29sIHJlYWNoZWRFbmQpOwogICAgIHZvaWQgY29tcHV0
ZVZlcnRpY2FsUG9zaXRpb25zRm9yTGluZShSb290SW5saW5lQm94KiwgQmlkaVJ1biopOwogICAg
IHZvaWQgZGVsZXRlRWxsaXBzaXNMaW5lQm94ZXMoKTsKICAgICB2b2lkIGNoZWNrTGluZXNGb3JU
ZXh0T3ZlcmZsb3coKTsKICAgICB2b2lkIGFkZE92ZXJmbG93RnJvbUlubGluZUNoaWxkcmVuKCk7
CisgICAgdm9pZCBtYXJnaW5Db2xsYXBzZUxpbmVzRnJvbVN0YXJ0KE1hcmdpbkluZm8mLCBSb290
SW5saW5lQm94KiBzdG9wTGluZSk7CiAgICAgLy8gRW5kIG9mIGZ1bmN0aW9ucyBkZWZpbmVkIGlu
IFJlbmRlckJsb2NrTGluZUxheW91dC5jcHAuCiAKICAgICB2b2lkIGFkZE92ZXJmbG93RnJvbUJs
b2NrQ2hpbGRyZW4oKTsKQEAgLTMxNiwxMyArMzE0LDcgQEAgcHJpdmF0ZToKICAgICAvLyBPYnRh
aW5zIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBibG9jayAoaW5jbHVkaW5nIHRoaXMgYmxvY2spIHRo
YXQgY29udHJpYnV0ZXMgYSBmaXJzdC1saW5lIHN0eWxlIHRvIG91ciBpbmxpbmUKICAgICAvLyBj
aGlsZHJlbi4KICAgICB2aXJ0dWFsIFJlbmRlckJsb2NrKiBmaXJzdExpbmVCbG9jaygpIGNvbnN0
OwotICAgIGJvb2wgaW5Sb290QmxvY2tDb250ZXh0KCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIElu
dFJlY3QgcmVjdFdpdGhPdXRsaW5lRm9yUmVwYWludChSZW5kZXJCb3hNb2RlbE9iamVjdCogcmVw
YWludENvbnRhaW5lciwgaW50IG91dGxpbmVXaWR0aCk7Ci0gICAgdmlydHVhbCBSZW5kZXJTdHls
ZSogb3V0bGluZVN0eWxlRm9yUmVwYWludCgpIGNvbnN0OwogICAgIAotICAgIHZpcnR1YWwgUmVu
ZGVyT2JqZWN0KiBob3ZlckFuY2VzdG9yKCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHVwZGF0
ZURyYWdTdGF0ZShib29sIGRyYWdPbik7CiAgICAgdmlydHVhbCB2b2lkIGNoaWxkQmVjYW1lTm9u
SW5saW5lKFJlbmRlck9iamVjdCogY2hpbGQpOwogCiAgICAgdmlydHVhbCBJbnRSZWN0IHNlbGVj
dGlvblJlY3RGb3JSZXBhaW50KFJlbmRlckJveE1vZGVsT2JqZWN0KiByZXBhaW50Q29udGFpbmVy
LCBib29sIC8qY2xpcFRvVmlzaWJsZUNvbnRlbnQqLykKQEAgLTM0MiwxNiArMzM0LDExIEBAIHBy
aXZhdGU6CiAgICAgaW50IGxlZnRTZWxlY3Rpb25PZmZzZXQoUmVuZGVyQmxvY2sqIHJvb3RCbG9j
aywgaW50IHkpOwogICAgIGludCByaWdodFNlbGVjdGlvbk9mZnNldChSZW5kZXJCbG9jayogcm9v
dEJsb2NrLCBpbnQgeSk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgYWJzb2x1dGVSZWN0cyhWZWN0b3I8
SW50UmVjdD4mLCBpbnQgdHgsIGludCB0eSk7Ci0gICAgdmlydHVhbCB2b2lkIGFic29sdXRlUXVh
ZHMoVmVjdG9yPEZsb2F0UXVhZD4mKTsKLQogICAgIGludCBkZXNpcmVkQ29sdW1uV2lkdGgoKSBj
b25zdDsKICAgICB1bnNpZ25lZCBkZXNpcmVkQ29sdW1uQ291bnQoKSBjb25zdDsKICAgICBWZWN0
b3I8SW50UmVjdD4qIGNvbHVtblJlY3RzKCkgY29uc3Q7CiAgICAgdm9pZCBzZXREZXNpcmVkQ29s
dW1uQ291bnRBbmRXaWR0aChpbnQgY291bnQsIGludCB3aWR0aCk7CiAgICAgaW50IGNvbHVtbkdh
cCgpIGNvbnN0OwotICAgIAotICAgIHZvaWQgcGFpbnRDb250aW51YXRpb25PdXRsaW5lcyhQYWlu
dEluZm8mLCBpbnQgdHgsIGludCB0eSk7CiAKICAgICB2aXJ0dWFsIEludFJlY3QgbG9jYWxDYXJl
dFJlY3QoSW5saW5lQm94KiwgaW50IGNhcmV0T2Zmc2V0LCBpbnQqIGV4dHJhV2lkdGhUb0VuZE9m
TGluZSA9IDApOwogCkBAIC00ODcsMTIgKzQ3NCw2IEBAIHByaXZhdGU6CiAgICAgRGVwcmVjYXRl
ZFB0ckxpc3Q8RmxvYXRpbmdPYmplY3Q+KiBtX2Zsb2F0aW5nT2JqZWN0czsKICAgICBMaXN0SGFz
aFNldDxSZW5kZXJCb3gqPiogbV9wb3NpdGlvbmVkT2JqZWN0czsKIAotICAgIC8vIEFuIGlubGlu
ZSBjYW4gYmUgc3BsaXQgd2l0aCBibG9ja3Mgb2NjdXJyaW5nIGluIGJldHdlZW4gdGhlIGlubGlu
ZSBjb250ZW50LgotICAgIC8vIFdoZW4gdGhpcyBvY2N1cnMgd2UgbmVlZCBhIHBvaW50ZXIgdG8g
b3VyIG5leHQgb2JqZWN0LiAgV2UgY2FuIGJhc2ljYWxseSBiZQotICAgIC8vIHNwbGl0IGludG8g
YSBzZXF1ZW5jZSBvZiBpbmxpbmVzIGFuZCBibG9ja3MuICBUaGUgY29udGludWF0aW9uIHdpbGwg
ZWl0aGVyIGJlCi0gICAgLy8gYW4gYW5vbnltb3VzIGJsb2NrICh0aGF0IGhvdXNlcyBvdGhlciBi
bG9ja3MpIG9yIGl0IHdpbGwgYmUgYW4gaW5saW5lIGZsb3cuCi0gICAgUmVuZGVySW5saW5lKiBt
X2lubGluZUNvbnRpbnVhdGlvbjsKLQogICAgIC8vIEFsbG9jYXRlZCBvbmx5IHdoZW4gc29tZSBv
ZiB0aGVzZSBmaWVsZHMgaGF2ZSBub24tZGVmYXVsdCB2YWx1ZXMKICAgICBzdHJ1Y3QgTWF4TWFy
Z2luIDogTm9uY29weWFibGUgewogICAgICAgICBNYXhNYXJnaW4oY29uc3QgUmVuZGVyQmxvY2sq
IG8pIApAQCAtNTIwLDEwICs1MDEsMTIgQEAgcHJpdmF0ZToKICAgICBSZW5kZXJMaW5lQm94TGlz
dCBtX2xpbmVCb3hlczsgICAvLyBBbGwgb2YgdGhlIHJvb3QgbGluZSBib3hlcyBjcmVhdGVkIGZv
ciB0aGlzIGJsb2NrIGZsb3cuICBGb3IgZXhhbXBsZSwgPGRpdj5IZWxsbzxicj53b3JsZC48L2Rp
dj4gd2lsbCBoYXZlIHR3byB0b3RhbCBsaW5lcyBmb3IgdGhlIDxkaXY+LgogCiAgICAgbXV0YWJs
ZSBpbnQgbV9saW5lSGVpZ2h0OwotICAgIAorCiAgICAgLy8gUmVuZGVyUnVieUJhc2Ugb2JqZWN0
cyBuZWVkIHRvIGJlIGFibGUgdG8gc3BsaXQgYW5kIG1lcmdlLCBtb3ZpbmcgdGhlaXIgY2hpbGRy
ZW4gYXJvdW5kCiAgICAgLy8gKGNhbGxpbmcgbW92ZUNoaWxkVG8sIG1vdmVBbGxDaGlsZHJlblRv
LCBhbmQgbWFrZUNoaWxkcmVuTm9uSW5saW5lKS4KICAgICBmcmllbmQgY2xhc3MgUmVuZGVyUnVi
eUJhc2U7CisgICAgCisgICAgZnJpZW5kIGNsYXNzIElubGluZUJveDsKIH07CiAKIGlubGluZSBS
ZW5kZXJCbG9jayogdG9SZW5kZXJCbG9jayhSZW5kZXJPYmplY3QqIG9iamVjdCkKSW5kZXg6IFdl
YkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcAkocmV2aXNpb24gNTQ3
NzUpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xNzEsMTAgKzE3MSwxMCBAQCB2b2lkIFJlbmRlckJsb2NrOjphcHBlbmRS
dW5zRm9yT2JqZWN0KGluCiAgICAgfQogfQogCi1zdGF0aWMgaW5saW5lIElubGluZUJveCogY3Jl
YXRlSW5saW5lQm94Rm9yUmVuZGVyZXIoUmVuZGVyT2JqZWN0KiBvYmosIGJvb2wgaXNSb290TGlu
ZUJveCwgYm9vbCBpc09ubHlSdW4gPSBmYWxzZSkKK3N0YXRpYyBpbmxpbmUgSW5saW5lQm94KiBj
cmVhdGVJbmxpbmVCb3hGb3JSZW5kZXJlcihSZW5kZXJPYmplY3QqIG9iaiwgYm9vbCBpc1Jvb3RM
aW5lQm94LCBib29sIGlzT25seVJ1biwgUmVuZGVyQmxvY2sqIGFub255bW91c0lubGluZUJsb2Nr
KQogewogICAgIGlmIChpc1Jvb3RMaW5lQm94KQotICAgICAgICByZXR1cm4gdG9SZW5kZXJCbG9j
ayhvYmopLT5jcmVhdGVBbmRBcHBlbmRSb290SW5saW5lQm94KCk7CisgICAgICAgIHJldHVybiB0
b1JlbmRlckJsb2NrKG9iaiktPmNyZWF0ZUFuZEFwcGVuZFJvb3RJbmxpbmVCb3goYW5vbnltb3Vz
SW5saW5lQmxvY2spOwogICAgIAogICAgIGlmIChvYmotPmlzVGV4dCgpKSB7CiAgICAgICAgIElu
bGluZVRleHRCb3gqIHRleHRCb3ggPSB0b1JlbmRlclRleHQob2JqKS0+Y3JlYXRlSW5saW5lVGV4
dEJveCgpOwpAQCAtMTg4LDcgKzE4OCw3IEBAIHN0YXRpYyBpbmxpbmUgSW5saW5lQm94KiBjcmVh
dGVJbmxpbmVCb3gKICAgICBpZiAob2JqLT5pc0JveCgpKQogICAgICAgICByZXR1cm4gdG9SZW5k
ZXJCb3gob2JqKS0+Y3JlYXRlSW5saW5lQm94KCk7CiAgICAgCi0gICAgcmV0dXJuIHRvUmVuZGVy
SW5saW5lKG9iaiktPmNyZWF0ZUFuZEFwcGVuZElubGluZUZsb3dCb3goKTsKKyAgICByZXR1cm4g
dG9SZW5kZXJJbmxpbmUob2JqKS0+Y3JlYXRlQW5kQXBwZW5kSW5saW5lRmxvd0JveChhbm9ueW1v
dXNJbmxpbmVCbG9jayk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkaXJ0eUxpbmVCb3hlc0Zv
clJlbmRlcmVyKFJlbmRlck9iamVjdCogbywgYm9vbCBmdWxsTGF5b3V0KQpAQCAtMjAxLDcgKzIw
MSwyMSBAQCBzdGF0aWMgaW5saW5lIHZvaWQgZGlydHlMaW5lQm94ZXNGb3JSZW5kCiAgICAgICAg
IHRvUmVuZGVySW5saW5lKG8pLT5kaXJ0eUxpbmVCb3hlcyhmdWxsTGF5b3V0KTsKIH0KIAotSW5s
aW5lRmxvd0JveCogUmVuZGVyQmxvY2s6OmNyZWF0ZUxpbmVCb3hlcyhSZW5kZXJPYmplY3QqIG9i
aiwgYm9vbCBmaXJzdExpbmUpCitzdGF0aWMgaW5saW5lIGJvb2wgc2hvdWxkQ29uc3RydWN0UGFy
ZW50TGluZUJveChSZW5kZXJJbmxpbmUqIGlubGluZUZsb3csIGJvb2wgaXNBbm9ueW1vdXNJbmxp
bmVCbG9jaykKK3sKKyAgICAvLyBGSVhNRTogSW1wbGVtZW50IGxpbmUgYm94IGN1bGxpbmcgYW5k
IGN1dCBvdXQgYSBidW5jaCBvZiBpbnRlcm1lZGlhdGUgbGluZSBib3hlcyBieSBjb21wYXJpbmcg
c3R5bGUgaW5mb3JtYXRpb24KKyAgICAvLyB3aXRoIHBhcmVudHMsIGV0Yy4gdG8gbWFrZSBzdXJl
IGl0J3MgcG9zc2libGUgdG8gb21pdCB0aGUgYm94IGZvciB0aGUgbGluZS4gCisgICAgaWYgKCFp
c0Fub255bW91c0lubGluZUJsb2NrIHx8ICFpbmxpbmVGbG93KQorICAgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICAKKyAgICAvLyBJZiB3ZSBoYXZlIGFuIG91dGxpbmUgb3IgYSBzZWxmLXBhaW50aW5n
IGxheWVyLCB0aGVuIHdlIG5lZWQgdG8gY3JlYXRlIHRoZSBpbnRlcm1lZGlhdGUgbGluZSBib3gu
CisgICAgYm9vbCBzaG91bGRNYWtlQm94ID0gaW5saW5lRmxvdy0+aGFzT3V0bGluZSgpIHx8IGlu
bGluZUZsb3ctPmhhc1NlbGZQYWludGluZ0xheWVyKCk7CisgICAgaWYgKCFzaG91bGRNYWtlQm94
KQorICAgICAgICBpbmxpbmVGbG93LT5zZXRIYXNDdWxsZWRMaW5lQm94ZXMoKTsgLy8gRklYTUU6
IFNob3VsZCBmaW5kIGEgd2F5IHRvIHVudGFpbnQgdGhlIGJveCBsYXRlciwgYWx0aG91Z2ggaW4g
cHJhY3RpY2UgdGhpcyB3aWxsIGJlIHJhcmUuCisgICAgcmV0dXJuIHNob3VsZE1ha2VCb3g7Cit9
CisKK0lubGluZUZsb3dCb3gqIFJlbmRlckJsb2NrOjpjcmVhdGVMaW5lQm94ZXMoUmVuZGVyT2Jq
ZWN0KiBvYmosIGJvb2wgZmlyc3RMaW5lLCBSZW5kZXJCbG9jayogYW5vbnltb3VzSW5saW5lQmxv
Y2spCiB7CiAgICAgLy8gU2VlIGlmIHdlIGhhdmUgYW4gdW5jb25zdHJ1Y3RlZCBsaW5lIGJveCBm
b3IgdGhpcyBvYmplY3QgdGhhdCBpcyBhbHNvCiAgICAgLy8gdGhlIGxhc3QgaXRlbSBvbiB0aGUg
bGluZS4KQEAgLTIxMiw2ICsyMjYsOCBAQCBJbmxpbmVGbG93Qm94KiBSZW5kZXJCbG9jazo6Y3Jl
YXRlTGluZUJvCiAgICAgZG8gewogICAgICAgICBBU1NFUlQob2JqLT5pc1JlbmRlcklubGluZSgp
IHx8IG9iaiA9PSB0aGlzKTsKICAgICAgICAgCisgICAgICAgIFJlbmRlcklubGluZSogaW5saW5l
T2JqID0gKG9iaiAhPSB0aGlzKSA/IHRvUmVuZGVySW5saW5lKG9iaikgOiAwOworCiAgICAgICAg
IC8vIEdldCB0aGUgbGFzdCBib3ggd2UgbWFkZSBmb3IgdGhpcyByZW5kZXIgb2JqZWN0LgogICAg
ICAgICBwYXJlbnRCb3ggPSBvYmotPmlzUmVuZGVySW5saW5lKCkgPyB0b1JlbmRlcklubGluZShv
YmopLT5sYXN0TGluZUJveCgpIDogdG9SZW5kZXJCbG9jayhvYmopLT5sYXN0TGluZUJveCgpOwog
CkBAIC0yMjAsMzAgKzIzNiwzNCBAQCBJbmxpbmVGbG93Qm94KiBSZW5kZXJCbG9jazo6Y3JlYXRl
TGluZUJvCiAgICAgICAgIC8vIHNvbWV0aGluZyBmb2xsb3dpbmcgaXQgb24gdGhlIGxpbmUsIHRo
ZW4gd2Uga25vdyB3ZSBoYXZlIHRvIG1ha2UgYSBuZXcgYm94CiAgICAgICAgIC8vIGFzIHdlbGwu
ICBJbiB0aGlzIHNpdHVhdGlvbiBvdXIgaW5saW5lIGhhcyBhY3R1YWxseSBiZWVuIHNwbGl0IGlu
IHR3byBvbgogICAgICAgICAvLyB0aGUgc2FtZSBsaW5lICh0aGlzIGNhbiBoYXBwZW4gd2l0aCB2
ZXJ5IGZhbmN5IGxhbmd1YWdlIG1peHR1cmVzKS4KKyAgICAgICAgYm9vbCBhbGxvd2VkVG9Db25z
dHJ1Y3ROZXdCb3ggPSBzaG91bGRDb25zdHJ1Y3RQYXJlbnRMaW5lQm94KGlubGluZU9iaiwgYW5v
bnltb3VzSW5saW5lQmxvY2spOworICAgICAgICBib29sIGNhblVzZUV4aXN0aW5nUGFyZW50Qm94
ID0gcGFyZW50Qm94ICYmICFwYXJlbnRCb3gtPmlzQ29uc3RydWN0ZWQoKSAmJiAhcGFyZW50Qm94
LT5uZXh0T25MaW5lKCk7CiAgICAgICAgIGJvb2wgY29uc3RydWN0ZWROZXdCb3ggPSBmYWxzZTsK
LSAgICAgICAgaWYgKCFwYXJlbnRCb3ggfHwgcGFyZW50Qm94LT5pc0NvbnN0cnVjdGVkKCkgfHwg
cGFyZW50Qm94LT5uZXh0T25MaW5lKCkpIHsKKyAgICAgICAgaWYgKGFsbG93ZWRUb0NvbnN0cnVj
dE5ld0JveCAmJiAhY2FuVXNlRXhpc3RpbmdQYXJlbnRCb3gpIHsKICAgICAgICAgICAgIC8vIFdl
IG5lZWQgdG8gbWFrZSBhIG5ldyBib3ggZm9yIHRoaXMgcmVuZGVyIG9iamVjdC4gIE9uY2UKICAg
ICAgICAgICAgIC8vIG1hZGUsIHdlIG5lZWQgdG8gcGxhY2UgaXQgYXQgdGhlIGVuZCBvZiB0aGUg
Y3VycmVudCBsaW5lLgotICAgICAgICAgICAgSW5saW5lQm94KiBuZXdCb3ggPSBjcmVhdGVJbmxp
bmVCb3hGb3JSZW5kZXJlcihvYmosIG9iaiA9PSB0aGlzKTsKKyAgICAgICAgICAgIElubGluZUJv
eCogbmV3Qm94ID0gY3JlYXRlSW5saW5lQm94Rm9yUmVuZGVyZXIob2JqLCBvYmogPT0gdGhpcywg
ZmFsc2UsIGFub255bW91c0lubGluZUJsb2NrKTsKICAgICAgICAgICAgIEFTU0VSVChuZXdCb3gt
PmlzSW5saW5lRmxvd0JveCgpKTsKICAgICAgICAgICAgIHBhcmVudEJveCA9IHN0YXRpY19jYXN0
PElubGluZUZsb3dCb3gqPihuZXdCb3gpOwogICAgICAgICAgICAgcGFyZW50Qm94LT5zZXRGaXJz
dExpbmVTdHlsZUJpdChmaXJzdExpbmUpOwogICAgICAgICAgICAgY29uc3RydWN0ZWROZXdCb3gg
PSB0cnVlOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCFyZXN1bHQpCi0gICAgICAgICAgICBy
ZXN1bHQgPSBwYXJlbnRCb3g7Ci0KLSAgICAgICAgLy8gSWYgd2UgaGF2ZSBoaXQgdGhlIGJsb2Nr
IGl0c2VsZiwgdGhlbiB8Ym94fCByZXByZXNlbnRzIHRoZSByb290Ci0gICAgICAgIC8vIGlubGlu
ZSBib3ggZm9yIHRoZSBsaW5lLCBhbmQgaXQgZG9lc24ndCBoYXZlIHRvIGJlIGFwcGVuZGVkIHRv
IGFueSBwYXJlbnQKLSAgICAgICAgLy8gaW5saW5lLgotICAgICAgICBpZiAoY2hpbGRCb3gpCi0g
ICAgICAgICAgICBwYXJlbnRCb3gtPmFkZFRvTGluZShjaGlsZEJveCk7Ci0KLSAgICAgICAgaWYg
KCFjb25zdHJ1Y3RlZE5ld0JveCB8fCBvYmogPT0gdGhpcykKLSAgICAgICAgICAgIGJyZWFrOwot
Ci0gICAgICAgIGNoaWxkQm94ID0gcGFyZW50Qm94OyAgICAgICAgCisgICAgICAgIGlmIChjb25z
dHJ1Y3RlZE5ld0JveCB8fCBjYW5Vc2VFeGlzdGluZ1BhcmVudEJveCkgeworICAgICAgICAgICAg
aWYgKCFyZXN1bHQpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gcGFyZW50Qm94OyAKKyAgICAg
ICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgaGl0IHRoZSBibG9jayBpdHNl
bGYsIHRoZW4gfGJveHwgcmVwcmVzZW50cyB0aGUgcm9vdAorICAgICAgICAgICAgLy8gaW5saW5l
IGJveCBmb3IgdGhlIGxpbmUsIGFuZCBpdCBkb2Vzbid0IGhhdmUgdG8gYmUgYXBwZW5kZWQgdG8g
YW55IHBhcmVudAorICAgICAgICAgICAgLy8gaW5saW5lLgorICAgICAgICAgICAgaWYgKGNoaWxk
Qm94KQorICAgICAgICAgICAgICAgIHBhcmVudEJveC0+YWRkVG9MaW5lKGNoaWxkQm94KTsKKyAg
ICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICghY29uc3RydWN0ZWROZXdCb3ggfHwgb2Jq
ID09IHRoaXMpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgCisgICAgICAgICAgICBjaGls
ZEJveCA9IHBhcmVudEJveDsKKyAgICAgICAgfQogCiAgICAgICAgIC8vIElmIHdlJ3ZlIGV4Y2Vl
ZGVkIG91ciBsaW5lIGRlcHRoLCB0aGVuIGp1bXAgc3RyYWlnaHQgdG8gdGhlIHJvb3QgYW5kIHNr
aXAgYWxsIHRoZSByZW1haW5pbmcKICAgICAgICAgLy8gaW50ZXJtZWRpYXRlIGlubGluZSBmbG93
cy4KQEAgLTI2NSwxOSArMjg1LDIzIEBAIFJvb3RJbmxpbmVCb3gqIFJlbmRlckJsb2NrOjpjb25z
dHJ1Y3RMaW4KICAgICAgICAgaWYgKHJ1bkNvdW50ID09IDIgJiYgIXItPm1fb2JqZWN0LT5pc0xp
c3RNYXJrZXIoKSkKICAgICAgICAgICAgIGlzT25seVJ1biA9ICgoc3R5bGUoKS0+ZGlyZWN0aW9u
KCkgPT0gUlRMKSA/IGxhc3RSdW4gOiBmaXJzdFJ1biktPm1fb2JqZWN0LT5pc0xpc3RNYXJrZXIo
KTsKIAotICAgICAgICBJbmxpbmVCb3gqIGJveCA9IGNyZWF0ZUlubGluZUJveEZvclJlbmRlcmVy
KHItPm1fb2JqZWN0LCBmYWxzZSwgaXNPbmx5UnVuKTsKKyAgICAgICAgUmVuZGVyQmxvY2sqIGFu
b255bW91c0lubGluZUJsb2NrID0gci0+bV9vYmplY3QtPmlzQW5vbnltb3VzSW5saW5lQmxvY2so
KSA/IHRvUmVuZGVyQmxvY2soci0+bV9vYmplY3QpIDogMDsKKworICAgICAgICBJbmxpbmVCb3gq
IGJveCA9IGNyZWF0ZUlubGluZUJveEZvclJlbmRlcmVyKHItPm1fb2JqZWN0LCBmYWxzZSwgaXNP
bmx5UnVuLCBhbm9ueW1vdXNJbmxpbmVCbG9jayk7CiAgICAgICAgIHItPm1fYm94ID0gYm94Owog
CiAgICAgICAgIEFTU0VSVChib3gpOwogICAgICAgICBpZiAoIWJveCkKICAgICAgICAgICAgIGNv
bnRpbnVlOwogCisgICAgICAgIFJlbmRlck9iamVjdCogYW5jZXN0b3JSZW5kZXJlciA9IHItPm1f
b2JqZWN0LT5wYXJlbnQoKTsKKyAKICAgICAgICAgLy8gSWYgd2UgaGF2ZSBubyBwYXJlbnQgYm94
IHlldCwgb3IgaWYgdGhlIHJ1biBpcyBub3Qgc2ltcGx5IGEgc2libGluZywKICAgICAgICAgLy8g
dGhlbiB3ZSBuZWVkIHRvIGNvbnN0cnVjdCBpbmxpbmUgYm94ZXMgYXMgbmVjZXNzYXJ5IHRvIHBy
b3Blcmx5IGVuY2xvc2UgdGhlCiAgICAgICAgIC8vIHJ1bidzIGlubGluZSBib3guCi0gICAgICAg
IGlmICghcGFyZW50Qm94IHx8IHBhcmVudEJveC0+cmVuZGVyZXIoKSAhPSByLT5tX29iamVjdC0+
cGFyZW50KCkpCisgICAgICAgIGlmICghcGFyZW50Qm94IHx8IHBhcmVudEJveC0+cmVuZGVyZXIo
KSAhPSBhbmNlc3RvclJlbmRlcmVyKQogICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyBpbmxpbmUg
Ym94ZXMgYWxsIHRoZSB3YXkgYmFjayB0byB0aGUgYXBwcm9wcmlhdGUgaW5zZXJ0aW9uIHBvaW50
LgotICAgICAgICAgICAgcGFyZW50Qm94ID0gY3JlYXRlTGluZUJveGVzKHItPm1fb2JqZWN0LT5w
YXJlbnQoKSwgZmlyc3RMaW5lKTsKKyAgICAgICAgICAgIHBhcmVudEJveCA9IGNyZWF0ZUxpbmVC
b3hlcyhhbmNlc3RvclJlbmRlcmVyLCBmaXJzdExpbmUsIGFub255bW91c0lubGluZUJsb2NrKTsK
IAogICAgICAgICAvLyBBcHBlbmQgdGhlIGlubGluZSBib3ggdG8gdGhpcyBsaW5lLgogICAgICAg
ICBwYXJlbnRCb3gtPmFkZFRvTGluZShib3gpOwpAQCAtMzE5LDYgKzM0Myw4IEBAIHZvaWQgUmVu
ZGVyQmxvY2s6OmNvbXB1dGVIb3Jpem9udGFsUG9zaXQKICAgICB1bnNpZ25lZCBudW1TcGFjZXMg
PSAwOwogICAgIEVUZXh0QWxpZ24gdGV4dEFsaWduID0gc3R5bGUoKS0+dGV4dEFsaWduKCk7CiAK
KyAgICBpbnQgeCA9IGxlZnRPZmZzZXQoaGVpZ2h0KCksIGZpcnN0TGluZSk7CisKICAgICBmb3Ig
KEJpZGlSdW4qIHIgPSBmaXJzdFJ1bjsgcjsgciA9IHItPm5leHQoKSkgewogICAgICAgICBpZiAo
IXItPm1fYm94IHx8IHItPm1fb2JqZWN0LT5pc1Bvc2l0aW9uZWQoKSB8fCByLT5tX2JveC0+aXNM
aW5lQnJlYWsoKSkKICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBQb3NpdGlvbmVkIG9iamVjdHMg
YXJlIG9ubHkgcGFydGljaXBhdGluZyB0byBmaWd1cmUgb3V0IHRoZWlyCkBAIC0zNTYsNiArMzgy
LDEyIEBAIHZvaWQgUmVuZGVyQmxvY2s6OmNvbXB1dGVIb3Jpem9udGFsUG9zaXQKICAgICAgICAg
ICAgIHJlbmRlckJveC0+Y2FsY1dpZHRoKCk7CiAgICAgICAgICAgICByLT5tX2JveC0+c2V0V2lk
dGgocmVuZGVyQm94LT53aWR0aCgpKTsKICAgICAgICAgICAgIHRvdFdpZHRoICs9IHJlbmRlckJv
eC0+bWFyZ2luTGVmdCgpICsgcmVuZGVyQm94LT5tYXJnaW5SaWdodCgpOworICAgICAgICAgICAg
CisgICAgICAgICAgICBpZiAoci0+bV9vYmplY3QtPmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkg
eworICAgICAgICAgICAgICAgIC8vIEFsbG93IHRoZSBmdWxsIGF2YWlsYWJsZSB3aWR0aCB0byBi
ZSB1c2VkLCBzaW5jZSBmbG9hdHMgd2lsbCBpbnRydWRlIGludG8gb3VyIHNwYWNlLgorICAgICAg
ICAgICAgICAgIGF2YWlsYWJsZVdpZHRoID0gcmlnaHRPZmZzZXQoKSAtIGxlZnRPZmZzZXQoKTsK
KyAgICAgICAgICAgICAgICB4ID0gbGVmdE9mZnNldCgpOworICAgICAgICAgICAgfQogICAgICAg
ICB9CiAKICAgICAgICAgdG90V2lkdGggKz0gci0+bV9ib3gtPndpZHRoKCk7CkBAIC0zNjUsNyAr
Mzk3LDYgQEAgdm9pZCBSZW5kZXJCbG9jazo6Y29tcHV0ZUhvcml6b250YWxQb3NpdAogICAgIC8v
IHdlIG5vdyBleGFtaW5lIG91ciB0ZXh0LWFsaWduIHByb3BlcnR5IGluIG9yZGVyIHRvIGRldGVy
bWluZSB3aGVyZSB0byBwb3NpdGlvbiB0aGUKICAgICAvLyBvYmplY3RzIGhvcml6b250YWxseS4g
IFRoZSB0b3RhbCB3aWR0aCBvZiB0aGUgbGluZSBjYW4gYmUgaW5jcmVhc2VkIGlmIHdlIGVuZCB1
cAogICAgIC8vIGp1c3RpZnlpbmcgdGV4dC4KLSAgICBpbnQgeCA9IGxlZnRPZmZzZXQoaGVpZ2h0
KCksIGZpcnN0TGluZSk7CiAgICAgc3dpdGNoICh0ZXh0QWxpZ24pIHsKICAgICAgICAgY2FzZSBM
RUZUOgogICAgICAgICBjYXNlIFdFQktJVF9MRUZUOgpAQCAtNTE5LDkgKzU1MCwxNSBAQCB2b2lk
IFJlbmRlckJsb2NrOjpsYXlvdXRJbmxpbmVDaGlsZHJlbihiCiAgICAgYm9vbCB1c2VSZXBhaW50
Qm91bmRzID0gZmFsc2U7CiAgICAgCiAgICAgbV9vdmVyZmxvdy5jbGVhcigpOwotICAgICAgICAK
LSAgICBzZXRIZWlnaHQoYm9yZGVyVG9wKCkgKyBwYWRkaW5nVG9wKCkpOwotICAgIGludCB0b0Fk
ZCA9IGJvcmRlckJvdHRvbSgpICsgcGFkZGluZ0JvdHRvbSgpICsgaG9yaXpvbnRhbFNjcm9sbGJh
ckhlaWdodCgpOworICAgIAorICAgIGludCB0b3AgPSBib3JkZXJUb3AoKSArIHBhZGRpbmdUb3Ao
KTsKKyAgICBpbnQgYm90dG9tID0gYm9yZGVyQm90dG9tKCkgKyBwYWRkaW5nQm90dG9tKCkgKyBo
b3Jpem9udGFsU2Nyb2xsYmFySGVpZ2h0KCk7CisKKyAgICBzZXRIZWlnaHQodG9wKTsKKworICAg
IC8vIFRoZSBtYXJnaW4gc3RydWN0IGNhY2hlcyBhbGwgb3VyIGN1cnJlbnQgbWFyZ2luIGNvbGxh
cHNpbmcgc3RhdGUuIFdlIHJ1biBtYXJnaW4gY29sbGFwc2luZyB3aGVuIHdlIGVuY291bnRlciBh
bm9ueW1vdXMgaW5saW5lIGJsb2NrcyB0aGF0IGFyZSBiZWluZyB1c2VkCisgICAgLy8gZm9yIHRo
ZSBibG9ja3MtaW5zaWRlLWlubGluZXMgY2FzZSAoYW5kIHRoZSBpbmxpbmVzIGFyZSBlbXB0eSks
IGUuZywgPHNwYW4+PGRpdj5PbmU8L2Rpdj48L3NwYW4+LgorICAgIE1hcmdpbkluZm8gbWFyZ2lu
SW5mbyh0aGlzLCB0b3AsIGJvdHRvbSk7CiAKICAgICAvLyBGaWd1cmUgb3V0IGlmIHdlIHNob3Vs
ZCBjbGVhciBvdXQgb3VyIGxpbmUgYm94ZXMuCiAgICAgLy8gRklYTUU6IEhhbmRsZSByZXNpemUg
ZXZlbnR1YWxseSEKQEAgLTU1MCwxMiArNTg3LDE1IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmxheW91
dElubGluZUNoaWxkcmVuKGIKICAgICAgICAgICAgIGlmIChvLT5pc1JlcGxhY2VkKCkgfHwgby0+
aXNGbG9hdGluZygpIHx8IG8tPmlzUG9zaXRpb25lZCgpKSB7CiAgICAgICAgICAgICAgICAgUmVu
ZGVyQm94KiBib3ggPSB0b1JlbmRlckJveChvKTsKICAgICAgICAgICAgICAgICAKLSAgICAgICAg
ICAgICAgICBpZiAocmVsYXlvdXRDaGlsZHJlbiB8fCBvLT5zdHlsZSgpLT53aWR0aCgpLmlzUGVy
Y2VudCgpIHx8IG8tPnN0eWxlKCktPmhlaWdodCgpLmlzUGVyY2VudCgpKQotICAgICAgICAgICAg
ICAgICAgICBvLT5zZXRDaGlsZE5lZWRzTGF5b3V0KHRydWUsIGZhbHNlKTsKLSAgICAgICAgICAg
ICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGxheW91dCBjaGlsZHJl
biBpZiB0aGV5IG5lZWQgaXQuCisgICAgICAgICAgICAgICAgLy8gRklYTUU6IFRlY2huaWNhbGx5
IHBlcmNlbnRhZ2UgaGVpZ2h0IG9iamVjdHMgb25seSBuZWVkIGEgcmVsYXlvdXQgaWYgdGhlaXIg
cGVyY2VudGFnZSBpc24ndCBnb2luZyB0byBiZSB0dXJuZWQgaW50bworICAgICAgICAgICAgICAg
IC8vIGFuIGF1dG8gdmFsdWUuICBBZGQgYSBtZXRob2QgdG8gZGV0ZXJtaW5lIHRoaXMsIHNvIHRo
YXQgd2UgY2FuIGF2b2lkIHRoZSByZWxheW91dC4KKyAgICAgICAgICAgICAgICBpZiAocmVsYXlv
dXRDaGlsZHJlbiB8fCAoKGJveC0+c3R5bGUoKS0+aGVpZ2h0KCkuaXNQZXJjZW50KCkgfHwgYm94
LT5zdHlsZSgpLT5taW5IZWlnaHQoKS5pc1BlcmNlbnQoKSB8fCBib3gtPnN0eWxlKCktPm1heEhl
aWdodCgpLmlzUGVyY2VudCgpKSkpCisgICAgICAgICAgICAgICAgICAgIGJveC0+c2V0Q2hpbGRO
ZWVkc0xheW91dCh0cnVlLCBmYWxzZSk7CisKICAgICAgICAgICAgICAgICAvLyBJZiByZWxheW91
dENoaWxkcmVuIGlzIHNldCBhbmQgd2UgaGF2ZSBwZXJjZW50YWdlIHBhZGRpbmcsIHdlIGFsc28g
bmVlZCB0byBpbnZhbGlkYXRlIHRoZSBjaGlsZCdzIHByZWYgd2lkdGhzLgotICAgICAgICAgICAg
ICAgIGlmIChyZWxheW91dENoaWxkcmVuICYmIChvLT5zdHlsZSgpLT5wYWRkaW5nTGVmdCgpLmlz
UGVyY2VudCgpIHx8IG8tPnN0eWxlKCktPnBhZGRpbmdSaWdodCgpLmlzUGVyY2VudCgpKSkKLSAg
ICAgICAgICAgICAgICAgICAgby0+c2V0UHJlZldpZHRoc0RpcnR5KHRydWUsIGZhbHNlKTsKKyAg
ICAgICAgICAgICAgICBpZiAocmVsYXlvdXRDaGlsZHJlbiAmJiAoYm94LT5zdHlsZSgpLT5wYWRk
aW5nTGVmdCgpLmlzUGVyY2VudCgpIHx8IGJveC0+c3R5bGUoKS0+cGFkZGluZ1JpZ2h0KCkuaXNQ
ZXJjZW50KCkpKQorICAgICAgICAgICAgICAgICAgICBib3gtPnNldFByZWZXaWR0aHNEaXJ0eSh0
cnVlLCBmYWxzZSk7CiAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICBpZiAoby0+aXNQb3Np
dGlvbmVkKCkpCiAgICAgICAgICAgICAgICAgICAgIG8tPmNvbnRhaW5pbmdCbG9jaygpLT5pbnNl
cnRQb3NpdGlvbmVkT2JqZWN0KGJveCk7CkBAIC01NjUsNyArNjA1LDggQEAgdm9pZCBSZW5kZXJC
bG9jazo6bGF5b3V0SW5saW5lQ2hpbGRyZW4oYgogICAgICAgICAgICAgICAgICAgICBlbHNlIGlm
IChmdWxsTGF5b3V0IHx8IG8tPm5lZWRzTGF5b3V0KCkpIC8vIFJlcGxhY2VkIGVsZW1lbnRzCiAg
ICAgICAgICAgICAgICAgICAgICAgICB0b1JlbmRlckJveChvKS0+ZGlydHlMaW5lQm94ZXMoZnVs
bExheW91dCk7CiAKLSAgICAgICAgICAgICAgICAgICAgby0+bGF5b3V0SWZOZWVkZWQoKTsKKyAg
ICAgICAgICAgICAgICAgICAgaWYgKCFvLT5pc1JlcGxhY2VkKCkgfHwgIW8tPmlzQW5vbnltb3Vz
SW5saW5lQmxvY2soKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG8tPmxheW91dElmTmVlZGVk
KCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmIChvLT5pc1RleHQo
KSB8fCAoby0+aXNSZW5kZXJJbmxpbmUoKSAmJiAhZW5kT2ZJbmxpbmUpKSB7CiAgICAgICAgICAg
ICAgICAgaGFzSW5saW5lQ2hpbGQgPSB0cnVlOwpAQCAtNTg0LDYgKzYyNSw4IEBAIHZvaWQgUmVu
ZGVyQmxvY2s6OmxheW91dElubGluZUNoaWxkcmVuKGIKICAgICAgICAgYm9vbCBmaXJzdExpbmUg
PSB0cnVlOwogICAgICAgICBib29sIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSA9IHRydWU7CiAg
ICAgICAgIFJvb3RJbmxpbmVCb3gqIHN0YXJ0TGluZSA9IGRldGVybWluZVN0YXJ0UG9zaXRpb24o
Zmlyc3RMaW5lLCBmdWxsTGF5b3V0LCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHksIHJlc29sdmVy
LCBmbG9hdHMsIGZsb2F0SW5kZXgpOworICAgICAgICBpZiAoc3RhcnRMaW5lKQorICAgICAgICAg
ICAgbWFyZ2luQ29sbGFwc2VMaW5lc0Zyb21TdGFydChtYXJnaW5JbmZvLCBzdGFydExpbmUpOwog
CiAgICAgICAgIGlmIChmdWxsTGF5b3V0ICYmIGhhc0lubGluZUNoaWxkICYmICFzZWxmTmVlZHNM
YXlvdXQoKSkgewogICAgICAgICAgICAgc2V0TmVlZHNMYXlvdXQodHJ1ZSwgZmFsc2UpOyAgLy8g
TWFyayBvdXJzZWx2ZXMgYXMgbmVlZGluZyBhIGZ1bGwgbGF5b3V0LiBUaGlzIHdheSB3ZSdsbCBy
ZXBhaW50IGxpa2UKQEAgLTY1MiwxNSArNjk1LDE3IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmxheW91
dElubGluZUNoaWxkcmVuKGIKIAogICAgICAgICB3aGlsZSAoIWVuZC5hdEVuZCgpKSB7CiAgICAg
ICAgICAgICAvLyBGSVhNRTogSXMgdGhpcyBjaGVjayBuZWNlc3NhcnkgYmVmb3JlIHRoZSBmaXJz
dCBpdGVyYXRpb24gb3IgY2FuIGl0IGJlIG1vdmVkIHRvIHRoZSBlbmQ/Ci0gICAgICAgICAgICBp
ZiAoY2hlY2tGb3JFbmRMaW5lTWF0Y2ggJiYgKGVuZExpbmVNYXRjaGVkID0gbWF0Y2hlZEVuZExp
bmUocmVzb2x2ZXIsIGNsZWFuTGluZVN0YXJ0LCBjbGVhbkxpbmVCaWRpU3RhdHVzLCBlbmRMaW5l
LCBlbmRMaW5lWVBvcywgcmVwYWludEJvdHRvbSwgcmVwYWludFRvcCkpKQorICAgICAgICAgICAg
aWYgKGNoZWNrRm9yRW5kTGluZU1hdGNoICYmIChlbmRMaW5lTWF0Y2hlZCA9IG1hdGNoZWRFbmRM
aW5lKHJlc29sdmVyLCBjbGVhbkxpbmVTdGFydCwgY2xlYW5MaW5lQmlkaVN0YXR1cywgZW5kTGlu
ZSwgZW5kTGluZVlQb3MsIHJlcGFpbnRCb3R0b20sIHJlcGFpbnRUb3ApKSkgeworICAgICAgICAg
ICAgICAgIG1hcmdpbkluZm8uY2xlYXJNYXJnaW4oKTsKICAgICAgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbGluZU1pZHBvaW50U3RhdGUucmVzZXQoKTsK
ICAgICAgICAgICAgIAogICAgICAgICAgICAgaXNMaW5lRW1wdHkgPSB0cnVlOwogICAgICAgICAg
ICAgCiAgICAgICAgICAgICBFQ2xlYXIgY2xlYXIgPSBDTk9ORTsKLSAgICAgICAgICAgIGVuZCA9
IGZpbmROZXh0TGluZUJyZWFrKHJlc29sdmVyLCBmaXJzdExpbmUsIGlzTGluZUVtcHR5LCBwcmV2
aW91c0xpbmVCcm9rZUNsZWFubHksICZjbGVhcik7CisgICAgICAgICAgICBlbmQgPSBmaW5kTmV4
dExpbmVCcmVhayhyZXNvbHZlciwgZmlyc3RMaW5lLCBpc0xpbmVFbXB0eSwgcHJldmlvdXNMaW5l
QnJva2VDbGVhbmx5LCBtYXJnaW5JbmZvLCAmY2xlYXIpOwogICAgICAgICAgICAgaWYgKHJlc29s
dmVyLnBvc2l0aW9uKCkuYXRFbmQoKSkgewogICAgICAgICAgICAgICAgIHJlc29sdmVyLmRlbGV0
ZVJ1bnMoKTsKICAgICAgICAgICAgICAgICBjaGVja0ZvckZsb2F0c0Zyb21MYXN0TGluZSA9IHRy
dWU7CkBAIC03MzAsNiArNzc1LDE0IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmxheW91dElubGluZUNo
aWxkcmVuKGIKICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVCb3gpIHsKICAgICAgICAgICAg
ICAgICAgICAgICAgIGxpbmVCb3gtPnNldEVuZHNXaXRoQnJlYWsocHJldmlvdXNMaW5lQnJva2VD
bGVhbmx5KTsKIAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgb3VyIHByZXZpb3VzIGxp
bmUgd2FzIGFuIGFub255bW91cyBibG9jayBhbmQgd2UgYXJlIG5vdCBhbiBhbm9ueW1vdXMgYmxv
Y2ssIHNpbXVsYXRlIGEgbWFyZ2luIGNvbGxhcHNlIG5vdyBzbyB0aGF0IHdlIGdldCB0aGUgcHJv
cGVyCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNyZWFzZWQgaGVpZ2h0LiAgV2UgYWxz
byBoYXZlIHRvIHNpbXVsYXRlIGEgbWFyZ2luIGNvbGxhcHNlIHRvIHByb3BhZ2F0ZSBtYXJnaW5z
IHRocm91Z2ggdG8gdGhlIHRvcCBvZiBvdXIgYmxvY2suCisgICAgICAgICAgICAgICAgICAgICAg
ICBpZiAoIWxpbmVCb3gtPmhhc0Fub255bW91c0lubGluZUJsb2NrKCkpIHsKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBpZiAoIWxpbmVCb3gtPnByZXZSb290Qm94KCkgfHwgbGluZUJveC0+
cHJldlJvb3RCb3goKS0+aGFzQW5vbnltb3VzSW5saW5lQmxvY2soKSkKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgY29sbGFwc2VNYXJnaW5zKDAsIG1hcmdpbkluZm8pOworICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbkluZm8uc2V0QXRUb3BPZkJsb2NrKGZhbHNlKTsK
KyAgICAgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICAgICAgLy8g
Tm93IHdlIHBvc2l0aW9uIGFsbCBvZiBvdXIgdGV4dCBydW5zIGhvcml6b250YWxseS4KICAgICAg
ICAgICAgICAgICAgICAgICAgIGNvbXB1dGVIb3Jpem9udGFsUG9zaXRpb25zRm9yTGluZShsaW5l
Qm94LCBmaXJzdExpbmUsIHJlc29sdmVyLmZpcnN0UnVuKCksIHRyYWlsaW5nU3BhY2VSdW4sIGVu
ZC5hdEVuZCgpKTsKIApAQCAtODYxLDggKzkxNCwxNCBAQCB2b2lkIFJlbmRlckJsb2NrOjpsYXlv
dXRJbmxpbmVDaGlsZHJlbihiCiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBOb3cgYWRkIGlu
IHRoZSBib3R0b20gYm9yZGVyL3BhZGRpbmcuCi0gICAgc2V0SGVpZ2h0KGhlaWdodCgpICsgdG9B
ZGQpOworICAgIC8vIE5vdyBkbyB0aGUgaGFuZGxpbmcgb2YgdGhlIGJvdHRvbSBvZiB0aGUgYmxv
Y2ssIGFkZGluZyBpbiBvdXIgYm90dG9tIGJvcmRlci9wYWRkaW5nIGFuZAorICAgIC8vIGRldGVy
bWluaW5nIHRoZSBjb3JyZWN0IGNvbGxhcHNlZCBib3R0b20gbWFyZ2luIGluZm9ybWF0aW9uLiAg
VGhpcyBjb2xsYXBzZSBpcyBvbmx5IG5lY2Vzc2FyeQorICAgIC8vIGlmIG91ciBsYXN0IGNoaWxk
IHdhcyBhbiBhbm9ueW1vdXMgaW5saW5lIGJsb2NrIHRoYXQgbWlnaHQgbmVlZCB0byBwcm9wYWdh
dGUgbWFyZ2luIGluZm9ybWF0aW9uIG91dCB0bworICAgIC8vIHVzLgorICAgIGlmIChsYXN0Um9v
dEJveCgpICYmIGxhc3RSb290Qm94KCktPmhhc0Fub255bW91c0lubGluZUJsb2NrKCkpCisgICAg
ICAgIGhhbmRsZUJvdHRvbU9mQmxvY2sodG9wLCBib3R0b20sIG1hcmdpbkluZm8pOworICAgIGVs
c2UKKyAgICAgICAgc2V0SGVpZ2h0KGhlaWdodCgpICsgYm90dG9tKTsKIAogICAgIGlmICghZmly
c3RMaW5lQm94KCkgJiYgaGFzTGluZUlmRW1wdHkoKSkKICAgICAgICAgc2V0SGVpZ2h0KGhlaWdo
dCgpICsgbGluZUhlaWdodCh0cnVlLCB0cnVlKSk7CkBAIC04NzMsNiArOTMyLDQyIEBAIHZvaWQg
UmVuZGVyQmxvY2s6OmxheW91dElubGluZUNoaWxkcmVuKGIKICAgICAgICAgY2hlY2tMaW5lc0Zv
clRleHRPdmVyZmxvdygpOwogfQogCit2b2lkIFJlbmRlckJsb2NrOjptYXJnaW5Db2xsYXBzZUxp
bmVzRnJvbVN0YXJ0KE1hcmdpbkluZm8mIG1hcmdpbkluZm8sIFJvb3RJbmxpbmVCb3gqIHN0b3BM
aW5lKQoreworICAgIC8vIFdlIGhhdmUgdG8gaGFuZGxlIGFuIGFub255bW91cyBpbmxpbmUgYmxv
Y2sgc3RyZWFrIGF0IHRoZSBzdGFydCBvZiB0aGUgYmxvY2sgaW4gb3JkZXIgdG8gbWFrZSBzdXJl
IG91ciBvd24gbWFyZ2lucyBhcmUKKyAgICAvLyBjb3JyZWN0LiAgV2Ugb25seSBoYXZlIHRvIGRv
IHRoaXMgaWYgdGhlIGNoaWxkcmVuIGNhbiBwcm9wYWdhdGUgbWFyZ2lucyBvdXQgdG8gdXMuCisg
ICAgaW50IHByZXZpb3VzRmxvYXRCb3R0b207CisgICAgaW50IG1heEZsb2F0Qm90dG9tOworICAg
IGlmIChtYXJnaW5JbmZvLmNhbkNvbGxhcHNlV2l0aFRvcCgpKSB7CisgICAgICAgIGludCBjdXJy
SGVpZ2h0ID0gaGVpZ2h0KCk7CisgICAgICAgIHNldEhlaWdodChib3JkZXJUb3AoKSArIHBhZGRp
bmdUb3AoKSk7CisgICAgICAgIFJvb3RJbmxpbmVCb3gqIHN0YXJ0TGluZSA9IGZpcnN0Um9vdEJv
eCgpOworICAgICAgICBSb290SW5saW5lQm94KiBjdXJyOworICAgICAgICBmb3IgKGN1cnIgPSBz
dGFydExpbmU7IGN1cnIgJiYgY3Vyci0+aGFzQW5vbnltb3VzSW5saW5lQmxvY2soKSAmJiBtYXJn
aW5JbmZvLmNhbkNvbGxhcHNlV2l0aFRvcCgpOyBjdXJyID0gY3Vyci0+bmV4dFJvb3RCb3goKSkg
eworICAgICAgICAgICAgaWYgKGN1cnIgPT0gc3RvcExpbmUpCisgICAgICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICAgICAgbGF5b3V0QmxvY2tDaGlsZChjdXJyLT5hbm9ueW1vdXNJbmxpbmVC
bG9jaygpLCBtYXJnaW5JbmZvLCBwcmV2aW91c0Zsb2F0Qm90dG9tLCBtYXhGbG9hdEJvdHRvbSk7
CisgICAgICAgIH0KKyAgICAgICAgc2V0SGVpZ2h0KGN1cnJIZWlnaHQpOyAvLyBLZWVwIHRoZSBo
ZWlnaHQgdGhlIHNhbWUsIHNpbmNlIG1hcmdpbiBjb2xsYXBzaW5nIHJlc2V0cyBpdCwgYW5kIHdl
IGRvbid0IHdhbnQgdGhhdC4KKyAgICB9CisKKyAgICAvLyBOb3cgdGhhdCB3ZSd2ZSBoYW5kbGVk
IHRoZSB0b3Agb2YgdGhlIGJsb2NrLCBpZiB0aGUgc3RvcExpbmUgaXNuJ3QgYW4gYW5vbnltb3Vz
IGJsb2NrLCB0aGVuIHdlJ3JlIGRvbmUuCisgICAgaWYgKCFzdG9wTGluZS0+aGFzQW5vbnltb3Vz
SW5saW5lQmxvY2soKSkKKyAgICAgICAgcmV0dXJuOworICAgIAorICAgIC8vIFJlLXJ1biBtYXJn
aW4gY29sbGFwc2luZyBvbiB0aGUgYmxvY2sgc2VxdWVuY2UgdGhhdCBzdG9wTGluZSBpcyBhIHBh
cnQgb2YuCisgICAgLy8gRmlyc3QgZ28gYmFja3dhcmRzIHRvIGdldCB0aGUgZW50aXJlIHNlcXVl
bmNlLgorICAgIFJvb3RJbmxpbmVCb3gqIHByZXYgPSBzdG9wTGluZTsKKyAgICBmb3IgKCA7IHBy
ZXYtPmhhc0Fub255bW91c0lubGluZUJsb2NrKCk7IHByZXYgPSBwcmV2LT5wcmV2Um9vdEJveCgp
KSB7IH07CisgICAgCisgICAgLy8gVXBkYXRlIHRoZSBibG9jayBoZWlnaHQgdG8gdGhlIGNvcnJl
Y3Qgc3RhdGUuCisgICAgc2V0SGVpZ2h0KHByZXYtPmJsb2NrSGVpZ2h0KCkpOworICAgIAorICAg
IC8vIE5vdyBydW4gbWFyZ2luIGNvbGxhcHNpbmcgb24gdGhvc2UgbGluZXMuCisgICAgZm9yIChw
cmV2ID0gcHJldi0+bmV4dFJvb3RCb3goKTsgcHJldiAhPSBzdG9wTGluZTsgcHJldiA9IHByZXYt
Pm5leHRSb290Qm94KCkpCisgICAgICAgIGxheW91dEJsb2NrQ2hpbGQocHJldi0+YW5vbnltb3Vz
SW5saW5lQmxvY2soKSwgbWFyZ2luSW5mbywgcHJldmlvdXNGbG9hdEJvdHRvbSwgbWF4RmxvYXRC
b3R0b20pOworfQorCiBSb290SW5saW5lQm94KiBSZW5kZXJCbG9jazo6ZGV0ZXJtaW5lU3RhcnRQ
b3NpdGlvbihib29sJiBmaXJzdExpbmUsIGJvb2wmIGZ1bGxMYXlvdXQsIGJvb2wmIHByZXZpb3Vz
TGluZUJyb2tlQ2xlYW5seSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBJbmxpbmVCaWRpUmVzb2x2ZXImIHJlc29sdmVyLCBWZWN0b3I8RmxvYXRX
aXRoUmVjdD4mIGZsb2F0cywgdW5zaWduZWQmIG51bUNsZWFuRmxvYXRzKQogewpAQCAtODgwLDkg
Kzk3NSwxMiBAQCBSb290SW5saW5lQm94KiBSZW5kZXJCbG9jazo6ZGV0ZXJtaW5lU3RhCiAgICAg
Um9vdElubGluZUJveCogbGFzdCA9IDA7CiAKICAgICBib29sIGRpcnRpZWRCeUZsb2F0ID0gZmFs
c2U7CisgICAgYm9vbCBoYXNBbm9ueW1vdXNJbmxpbmVCbG9ja0xpbmUgPSBmYWxzZTsKICAgICBp
ZiAoIWZ1bGxMYXlvdXQpIHsKICAgICAgICAgc2l6ZV90IGZsb2F0SW5kZXggPSAwOwogICAgICAg
ICBmb3IgKGN1cnIgPSBmaXJzdFJvb3RCb3goKTsgY3VyciAmJiAhY3Vyci0+aXNEaXJ0eSgpOyBj
dXJyID0gY3Vyci0+bmV4dFJvb3RCb3goKSkgeworICAgICAgICAgICAgaWYgKGN1cnItPmhhc0Fu
b255bW91c0lubGluZUJsb2NrKCkpCisgICAgICAgICAgICAgICAgaGFzQW5vbnltb3VzSW5saW5l
QmxvY2tMaW5lID0gdHJ1ZTsKICAgICAgICAgICAgIGlmIChWZWN0b3I8UmVuZGVyQm94Kj4qIGNs
ZWFuTGluZUZsb2F0cyA9IGN1cnItPmZsb2F0c1B0cigpKSB7CiAgICAgICAgICAgICAgICAgVmVj
dG9yPFJlbmRlckJveCo+OjppdGVyYXRvciBlbmQgPSBjbGVhbkxpbmVGbG9hdHMtPmVuZCgpOwog
ICAgICAgICAgICAgICAgIGZvciAoVmVjdG9yPFJlbmRlckJveCo+OjppdGVyYXRvciBvID0gY2xl
YW5MaW5lRmxvYXRzLT5iZWdpbigpOyBvICE9IGVuZDsgKytvKSB7CkBAIC05MzAsNyArMTAyOCw3
IEBAIFJvb3RJbmxpbmVCb3gqIFJlbmRlckJsb2NrOjpkZXRlcm1pbmVTdGEKICAgICAgICAgICAg
IC8vIFdlIGhhdmUgYSBkaXJ0eSBsaW5lLgogICAgICAgICAgICAgaWYgKFJvb3RJbmxpbmVCb3gq
IHByZXZSb290Qm94ID0gY3Vyci0+cHJldlJvb3RCb3goKSkgewogICAgICAgICAgICAgICAgIC8v
IFdlIGhhdmUgYSBwcmV2aW91cyBsaW5lLgotICAgICAgICAgICAgICAgIGlmICghZGlydGllZEJ5
RmxvYXQgJiYgKCFwcmV2Um9vdEJveC0+ZW5kc1dpdGhCcmVhaygpIHx8IChwcmV2Um9vdEJveC0+
bGluZUJyZWFrT2JqKCktPmlzVGV4dCgpICYmIHByZXZSb290Qm94LT5saW5lQnJlYWtQb3MoKSA+
PSB0b1JlbmRlclRleHQocHJldlJvb3RCb3gtPmxpbmVCcmVha09iaigpKS0+dGV4dExlbmd0aCgp
KSkpCisgICAgICAgICAgICAgICAgaWYgKCFkaXJ0aWVkQnlGbG9hdCAmJiAhY3Vyci0+aGFzQW5v
bnltb3VzSW5saW5lQmxvY2soKSAmJiAoIXByZXZSb290Qm94LT5lbmRzV2l0aEJyZWFrKCkgfHwg
KHByZXZSb290Qm94LT5saW5lQnJlYWtPYmooKS0+aXNUZXh0KCkgJiYgcHJldlJvb3RCb3gtPmxp
bmVCcmVha1BvcygpID49IHRvUmVuZGVyVGV4dChwcmV2Um9vdEJveC0+bGluZUJyZWFrT2JqKCkp
LT50ZXh0TGVuZ3RoKCkpKSkKICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHByZXZpb3VzIGxp
bmUgZGlkbid0IGJyZWFrIGNsZWFubHkgb3IgYnJva2UgYXQgYSBuZXdsaW5lCiAgICAgICAgICAg
ICAgICAgICAgIC8vIHRoYXQgaGFzIGJlZW4gZGVsZXRlZCwgc28gdHJlYXQgaXQgYXMgZGlydHkg
dG9vLgogICAgICAgICAgICAgICAgICAgICBjdXJyID0gcHJldlJvb3RCb3g7CkBAIC05MzgsNyAr
MTAzNiw3IEBAIFJvb3RJbmxpbmVCb3gqIFJlbmRlckJsb2NrOjpkZXRlcm1pbmVTdGEKICAgICAg
ICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIE5vIGRpcnR5IGxpbmVzIHdlcmUgZm91bmQuCiAg
ICAgICAgICAgICAvLyBJZiB0aGUgbGFzdCBsaW5lIGRpZG4ndCBicmVhayBjbGVhbmx5LCB0cmVh
dCBpdCBhcyBkaXJ0eS4KLSAgICAgICAgICAgIGlmIChsYXN0Um9vdEJveCgpICYmICFsYXN0Um9v
dEJveCgpLT5lbmRzV2l0aEJyZWFrKCkpCisgICAgICAgICAgICBpZiAobGFzdFJvb3RCb3goKSAm
JiAhbGFzdFJvb3RCb3goKS0+ZW5kc1dpdGhCcmVhaygpICYmICFsYXN0Um9vdEJveCgpLT5oYXNB
bm9ueW1vdXNJbmxpbmVCbG9jaygpKQogICAgICAgICAgICAgICAgIGN1cnIgPSBsYXN0Um9vdEJv
eCgpOwogICAgICAgICB9CiAKQEAgLTk5NCw3ICsxMDkyLDYgQEAgUm9vdElubGluZUJveCogUmVu
ZGVyQmxvY2s6OmRldGVybWluZVN0YQogICAgIH0KIAogICAgIHJlc29sdmVyLnNldFBvc2l0aW9u
KElubGluZUl0ZXJhdG9yKHRoaXMsIHN0YXJ0T2JqLCBwb3MpKTsKLQogICAgIHJldHVybiBjdXJy
OwogfQogCkBAIC0xMDI5LDcgKzExMjYsNyBAQCBSb290SW5saW5lQm94KiBSZW5kZXJCbG9jazo6
ZGV0ZXJtaW5lRW5kCiAKIGJvb2wgUmVuZGVyQmxvY2s6Om1hdGNoZWRFbmRMaW5lKGNvbnN0IElu
bGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIsIGNvbnN0IElubGluZUl0ZXJhdG9yJiBlbmRMaW5l
U3RhcnQsIGNvbnN0IEJpZGlTdGF0dXMmIGVuZExpbmVTdGF0dXMsIFJvb3RJbmxpbmVCb3gqJiBl
bmRMaW5lLCBpbnQmIGVuZFlQb3MsIGludCYgcmVwYWludEJvdHRvbSwgaW50JiByZXBhaW50VG9w
KQogewotICAgIGlmIChyZXNvbHZlci5wb3NpdGlvbigpID09IGVuZExpbmVTdGFydCkgeworICAg
IGlmIChyZXNvbHZlci5wb3NpdGlvbigpID09IGVuZExpbmVTdGFydCAmJiAhZW5kTGluZS0+aGFz
QW5vbnltb3VzSW5saW5lQmxvY2soKSkgewogICAgICAgICBpZiAocmVzb2x2ZXIuc3RhdHVzKCkg
IT0gZW5kTGluZVN0YXR1cykKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIApAQCAtMTA1OSw3
ICsxMTU2LDcgQEAgYm9vbCBSZW5kZXJCbG9jazo6bWF0Y2hlZEVuZExpbmUoY29uc3QgSQogICAg
IHN0YXRpYyBpbnQgbnVtTGluZXMgPSA4OyAvLyBUaGUgIyBvZiBsaW5lcyB3ZSdyZSB3aWxsaW5n
IHRvIG1hdGNoIGFnYWluc3QuCiAgICAgUm9vdElubGluZUJveCogbGluZSA9IGVuZExpbmU7CiAg
ICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1MaW5lcyAmJiBsaW5lOyBpKyssIGxpbmUgPSBsaW5l
LT5uZXh0Um9vdEJveCgpKSB7Ci0gICAgICAgIGlmIChsaW5lLT5saW5lQnJlYWtPYmooKSA9PSBy
ZXNvbHZlci5wb3NpdGlvbigpLm9iaiAmJiBsaW5lLT5saW5lQnJlYWtQb3MoKSA9PSByZXNvbHZl
ci5wb3NpdGlvbigpLnBvcykgeworICAgICAgICBpZiAobGluZS0+bGluZUJyZWFrT2JqKCkgPT0g
cmVzb2x2ZXIucG9zaXRpb24oKS5vYmogJiYgbGluZS0+bGluZUJyZWFrUG9zKCkgPT0gcmVzb2x2
ZXIucG9zaXRpb24oKS5wb3MgJiYgIWxpbmUtPmhhc0Fub255bW91c0lubGluZUJsb2NrKCkpIHsK
ICAgICAgICAgICAgIC8vIFdlIGhhdmUgYSBtYXRjaC4KICAgICAgICAgICAgIGlmIChsaW5lLT5s
aW5lQnJlYWtCaWRpU3RhdHVzKCkgIT0gcmVzb2x2ZXIuc3RhdHVzKCkpCiAgICAgICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOyAvLyAuLi5idXQgdGhlIGJpZGkgc3RhdGUgZG9lc24ndCBtYXRjaC4K
QEAgLTExNDAsNyArMTIzNyw3IEBAIHN0YXRpYyBib29sIGlubGluZUZsb3dSZXF1aXJlc0xpbmVC
b3goUmUKIHsKICAgICAvLyBGSVhNRTogUmlnaHQgbm93LCB3ZSBvbmx5IGFsbG93IGxpbmUgYm94
ZXMgZm9yIGlubGluZXMgdGhhdCBhcmUgdHJ1bHkgZW1wdHkuCiAgICAgLy8gV2UgbmVlZCB0byBm
aXggdGhpcywgdGhvdWdoLCBiZWNhdXNlIGF0IHRoZSB2ZXJ5IGxlYXN0LCBpbmxpbmVzIGNvbnRh
aW5pbmcgb25seQotICAgIC8vIGlnbm9yYWJsZSB3aGl0ZXNwYWNlIHNob3VsZCBzaG91bGQgYWxz
byBoYXZlIGxpbmUgYm94ZXMuIAorICAgIC8vIGlnbm9yYWJsZSB3aGl0ZXNwYWNlIHNob3VsZCBh
bHNvIGhhdmUgbGluZSBib3hlcy4gCiAgICAgcmV0dXJuICFmbG93LT5maXJzdENoaWxkKCkgJiYg
Zmxvdy0+aGFzSG9yaXpvbnRhbEJvcmRlcnNQYWRkaW5nT3JNYXJnaW4oKTsKIH0KIApAQCAtMTI5
Nyw3ICsxMzk0LDcgQEAgc3RhdGljIGlubGluZSB1bnNpZ25lZCB0ZXh0V2lkdGgoUmVuZGVyVAog
fQogCiBJbmxpbmVJdGVyYXRvciBSZW5kZXJCbG9jazo6ZmluZE5leHRMaW5lQnJlYWsoSW5saW5l
QmlkaVJlc29sdmVyJiByZXNvbHZlciwgYm9vbCBmaXJzdExpbmUsICBib29sJiBpc0xpbmVFbXB0
eSwgYm9vbCYgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5LCAKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBFQ2xlYXIqIGNsZWFyKQorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcmdpbkluZm8mIG1hcmdpbkluZm8sIEVD
bGVhciogY2xlYXIpCiB7CiAgICAgQVNTRVJUKHJlc29sdmVyLnBvc2l0aW9uKCkuYmxvY2sgPT0g
dGhpcyk7CiAKQEAgLTEzMzgsNiArMTQzNSwxMSBAQCBJbmxpbmVJdGVyYXRvciBSZW5kZXJCbG9j
azo6ZmluZE5leHRMaW5lCiAgICAgYm9vbCBhdXRvV3JhcFdhc0V2ZXJUcnVlT25MaW5lID0gZmFs
c2U7CiAgICAgYm9vbCBmbG9hdHNGaXRPbkxpbmUgPSB0cnVlOwogICAgIAorICAgIGJvb2wgaXNC
bG9ja0luc2lkZUlubGluZSA9IGZhbHNlOworICAgIAorICAgIGludCBwcmV2aW91c0Jsb2NrRmxv
YXRCb3R0b20gPSAwOworICAgIGludCBtYXhCbG9ja0Zsb2F0Qm90dG9tID0gMDsKKwogICAgIC8v
IEZpcmVmb3ggYW5kIE9wZXJhIHdpbGwgYWxsb3cgYSB0YWJsZSBjZWxsIHRvIGdyb3cgdG8gZml0
IGFuIGltYWdlIGluc2lkZSBpdCB1bmRlcgogICAgIC8vIHZlcnkgc3BlY2lmaWMgY2lyY3Vtc3Rh
bmNlcyAoaW4gb3JkZXIgdG8gbWF0Y2ggY29tbW9uIFdpbklFIHJlbmRlcmluZ3MpLiAKICAgICAv
LyBOb3Qgc3VwcG9ydGluZyB0aGUgcXVpcmsgaGFzIGNhdXNlZCB1cyB0byBtaXMtcmVuZGVyIHNv
bWUgcmVhbCBzaXRlcy4gKFNlZSBCdWd6aWxsYSAxMDUxNy4pIApAQCAtMTM0OCw3ICsxNDUwLDgg
QEAgSW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6OmZpbmROZXh0TGluZQogICAgIHdoaWxlIChv
KSB7CiAgICAgICAgIGN1cnJXUyA9IG8tPmlzUmVwbGFjZWQoKSA/IG8tPnBhcmVudCgpLT5zdHls
ZSgpLT53aGl0ZVNwYWNlKCkgOiBvLT5zdHlsZSgpLT53aGl0ZVNwYWNlKCk7CiAgICAgICAgIGxh
c3RXUyA9IGxhc3QtPmlzUmVwbGFjZWQoKSA/IGxhc3QtPnBhcmVudCgpLT5zdHlsZSgpLT53aGl0
ZVNwYWNlKCkgOiBsYXN0LT5zdHlsZSgpLT53aGl0ZVNwYWNlKCk7Ci0gICAgICAgIAorICAgICAg
ICBpc0Jsb2NrSW5zaWRlSW5saW5lID0gby0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpOworCiAg
ICAgICAgIGJvb2wgYXV0b1dyYXAgPSBSZW5kZXJTdHlsZTo6YXV0b1dyYXAoY3VycldTKTsKICAg
ICAgICAgYXV0b1dyYXBXYXNFdmVyVHJ1ZU9uTGluZSA9IGF1dG9XcmFwV2FzRXZlclRydWVPbkxp
bmUgfHwgYXV0b1dyYXA7CiAKQEAgLTEzNTksNyArMTQ2Miw3IEBAIElubGluZUl0ZXJhdG9yIFJl
bmRlckJsb2NrOjpmaW5kTmV4dExpbmUKICNlbmRpZgogCiAgICAgICAgIGJvb2wgY29sbGFwc2VX
aGl0ZVNwYWNlID0gUmVuZGVyU3R5bGU6OmNvbGxhcHNlV2hpdGVTcGFjZShjdXJyV1MpOwotICAg
ICAgICAgICAgCisKICAgICAgICAgaWYgKG8tPmlzQlIoKSkgewogICAgICAgICAgICAgaWYgKHcg
KyB0bXBXIDw9IHdpZHRoKSB7CiAgICAgICAgICAgICAgICAgbEJyZWFrLm9iaiA9IG87CkBAIC0x
NDY2LDggKzE1NjksOSBAQCBJbmxpbmVJdGVyYXRvciBSZW5kZXJCbG9jazo6ZmluZE5leHRMaW5l
CiAgICAgICAgIH0gZWxzZSBpZiAoby0+aXNSZXBsYWNlZCgpKSB7CiAgICAgICAgICAgICBSZW5k
ZXJCb3gqIHJlcGxhY2VkQm94ID0gdG9SZW5kZXJCb3gobyk7CiAKLSAgICAgICAgICAgIC8vIEJy
ZWFrIG9uIHJlcGxhY2VkIGVsZW1lbnRzIGlmIGVpdGhlciBoYXMgbm9ybWFsIHdoaXRlLXNwYWNl
LgotICAgICAgICAgICAgaWYgKChhdXRvV3JhcCB8fCBSZW5kZXJTdHlsZTo6YXV0b1dyYXAobGFz
dFdTKSkgJiYgKCFvLT5pc0ltYWdlKCkgfHwgYWxsb3dJbWFnZXNUb0JyZWFrKSkgeworICAgICAg
ICAgICAgLy8gQnJlYWsgb24gcmVwbGFjZWQgZWxlbWVudHMgaWYgZWl0aGVyIGhhcyBub3JtYWwg
d2hpdGUtc3BhY2UuICBXZSBhbHNvIGFsd2F5cyBicmVhayBpZiB3ZQorICAgICAgICAgICAgLy8g
ZW5jb3VudGVyIGEgc3BlY2lhbCBhbm9ueW1vdXMgaW5saW5lIGJsb2NrICh1c2VkIHRvIGhvbGQg
YmxvY2tzIGluc2lkZSBpbmxpbmVzKS4KKyAgICAgICAgICAgIGlmICgoYXV0b1dyYXAgfHwgUmVu
ZGVyU3R5bGU6OmF1dG9XcmFwKGxhc3RXUykgfHwgaXNCbG9ja0luc2lkZUlubGluZSkgICYmICgh
by0+aXNJbWFnZSgpIHx8IGFsbG93SW1hZ2VzVG9CcmVhaykpIHsKICAgICAgICAgICAgICAgICB3
ICs9IHRtcFc7CiAgICAgICAgICAgICAgICAgdG1wVyA9IDA7CiAgICAgICAgICAgICAgICAgbEJy
ZWFrLm9iaiA9IG87CkBAIC0xNDc1LDYgKzE1NzksMTkgQEAgSW5saW5lSXRlcmF0b3IgUmVuZGVy
QmxvY2s6OmZpbmROZXh0TGluZQogICAgICAgICAgICAgICAgIGxCcmVhay5uZXh0QnJlYWthYmxl
UG9zaXRpb24gPSAtMTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaWYgKGlzQmxvY2tJ
bnNpZGVJbmxpbmUpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWlzTGluZUVtcHR5KQorICAgICAg
ICAgICAgICAgICAgICBnb3RvIGVuZDsKKworICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSB3
aWR0aCB0byBpZ25vcmUgZmxvYXRzLCBzaW5jZSB3ZSdyZSBnb2luZyB0byBhbGxvdyB0aGVtIHRv
IGludHJ1ZGUgaW50byBvdXIgc3BhY2UuCisgICAgICAgICAgICAgICAgd2lkdGggPSByaWdodE9m
ZnNldCgpIC0gbGVmdE9mZnNldCgpOworCisgICAgICAgICAgICAgICAgLy8gRklYTUU6IFRoaXMg
Y2FsbCB3aWxsIHVwZGF0ZSB0aGUgaGVpZ2h0IG9mIG91ciBibG9jay4gIEl0J3Mgbm90IGNsZWFy
IGlmIHRoYXQncyBnb2luZyB0byBiZSBvayBvciBub3QgeWV0LgorICAgICAgICAgICAgICAgIGxh
eW91dEJsb2NrQ2hpbGQocmVwbGFjZWRCb3gsIG1hcmdpbkluZm8sIHByZXZpb3VzQmxvY2tGbG9h
dEJvdHRvbSwgbWF4QmxvY2tGbG9hdEJvdHRvbSk7CisKKyAgICAgICAgICAgICAgICBsaW5lTWlk
cG9pbnRTdGF0ZS5iZXR3ZWVuTWlkcG9pbnRzID0gZmFsc2U7CisgICAgICAgICAgICB9CisKICAg
ICAgICAgICAgIGlmIChpZ25vcmluZ1NwYWNlcykKICAgICAgICAgICAgICAgICBhZGRNaWRwb2lu
dChsaW5lTWlkcG9pbnRTdGF0ZSwgSW5saW5lSXRlcmF0b3IoMCwgbywgMCkpOwogCkBAIC0xNDk4
LDYgKzE2MTUsMTUgQEAgSW5saW5lSXRlcmF0b3IgUmVuZGVyQmxvY2s6OmZpbmROZXh0TGluZQog
ICAgICAgICAgICAgICAgICAgICB0bXBXICs9IHJlcGxhY2VkQm94LT53aWR0aCgpICsgcmVwbGFj
ZWRCb3gtPm1hcmdpbkxlZnQoKSArIHJlcGxhY2VkQm94LT5tYXJnaW5SaWdodCgpICsgaW5saW5l
V2lkdGgobyk7CiAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICB0bXBXICs9IHJl
cGxhY2VkQm94LT53aWR0aCgpICsgcmVwbGFjZWRCb3gtPm1hcmdpbkxlZnQoKSArIHJlcGxhY2Vk
Qm94LT5tYXJnaW5SaWdodCgpICsgaW5saW5lV2lkdGgobyk7CisgICAgICAgICAgICAgICAgCisg
ICAgICAgICAgICBpZiAoaXNCbG9ja0luc2lkZUlubGluZSkgeworICAgICAgICAgICAgICAgIHcg
Kz0gdG1wVzsKKyAgICAgICAgICAgICAgICB0bXBXID0gMDsKKyAgICAgICAgICAgICAgICBsQnJl
YWsub2JqID0gbzsKKyAgICAgICAgICAgICAgICBsQnJlYWsucG9zID0gMDsKKyAgICAgICAgICAg
ICAgICBsQnJlYWsubmV4dEJyZWFrYWJsZVBvc2l0aW9uID0gLTE7CisgICAgICAgICAgICAgICAg
Z290byBlbmQ7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoby0+aXNUZXh0KCkp
IHsKICAgICAgICAgICAgIGlmICghcG9zKQogICAgICAgICAgICAgICAgIGFwcGxpZWRTdGFydFdp
ZHRoID0gZmFsc2U7CkBAIC0xODg0LDcgKzIwMTAsNyBAQCBJbmxpbmVJdGVyYXRvciBSZW5kZXJC
bG9jazo6ZmluZE5leHRMaW5lCiAgICAgICAgIH0KICAgICAgICAgLy9lbHNlIGlmIChsQnJlYWsu
cG9zID4gMCkKICAgICAgICAgLy8gICAgbEJyZWFrLnBvcy0tOwotICAgICAgICBlbHNlIGlmIChs
QnJlYWsub2JqID09IDAgJiYgdHJhaWxpbmdTcGFjZU9iamVjdC0+aXNUZXh0KCkpIHsKKyAgICAg
ICAgZWxzZSBpZiAoKCFsQnJlYWsub2JqIHx8IGxCcmVhay5vYmotPmlzQW5vbnltb3VzSW5saW5l
QmxvY2soKSkgJiYgdHJhaWxpbmdTcGFjZU9iamVjdC0+aXNUZXh0KCkpIHsKICAgICAgICAgICAg
IC8vIEFkZCBhIG5ldyBlbmQgbWlkcG9pbnQgdGhhdCBzdG9wcyByaWdodCBhdCB0aGUgdmVyeSBl
bmQuCiAgICAgICAgICAgICBSZW5kZXJUZXh0KiB0ZXh0ID0gdG9SZW5kZXJUZXh0KHRyYWlsaW5n
U3BhY2VPYmplY3QpOwogICAgICAgICAgICAgdW5zaWduZWQgbGVuZ3RoID0gdGV4dC0+dGV4dExl
bmd0aCgpOwpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQm94LmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCb3guY3BwCShyZXZpc2lvbiA1NDc3NSkKKysr
IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJveC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEzMzQs
NyArMTMzNCw3IEBAIHZvaWQgUmVuZGVyQm94OjpjYWxjV2lkdGgoKQogICAgIH0KIAogICAgIGlm
IChjb250YWluZXJXaWR0aCAmJiBjb250YWluZXJXaWR0aCAhPSAod2lkdGgoKSArIG1fbWFyZ2lu
TGVmdCArIG1fbWFyZ2luUmlnaHQpCi0gICAgICAgICAgICAmJiAhaXNGbG9hdGluZygpICYmICFp
c0lubGluZSgpICYmICFjYi0+aXNGbGV4aWJsZUJveCgpKSB7CisgICAgICAgICAgICAmJiAhaXNG
bG9hdGluZygpICYmICghaXNJbmxpbmUoKSB8fCBpc0Fub255bW91c0lubGluZUJsb2NrKCkpICYm
ICFjYi0+aXNGbGV4aWJsZUJveCgpKSB7CiAgICAgICAgIGlmIChjYi0+c3R5bGUoKS0+ZGlyZWN0
aW9uKCkgPT0gTFRSKQogICAgICAgICAgICAgbV9tYXJnaW5SaWdodCA9IGNvbnRhaW5lcldpZHRo
IC0gd2lkdGgoKSAtIG1fbWFyZ2luTGVmdDsKICAgICAgICAgZWxzZQpAQCAtMTM3Myw3ICsxMzcz
LDcgQEAgYm9vbCBSZW5kZXJCb3g6OnNpemVzVG9JbnRyaW5zaWNXaWR0aChXaQogewogICAgIC8v
IE1hcnF1ZWVzIGluIFdpbklFIGFyZSBsaWtlIGEgbWl4dHVyZSBvZiBibG9ja3MgYW5kIGlubGlu
ZS1ibG9ja3MuICBUaGV5IHNpemUgYXMgdGhvdWdoIHRoZXkncmUgYmxvY2tzLAogICAgIC8vIGJ1
dCB0aGV5IGFsbG93IHRleHQgdG8gc2l0IG9uIHRoZSBzYW1lIGxpbmUgYXMgdGhlIG1hcnF1ZWUu
Ci0gICAgaWYgKGlzRmxvYXRpbmcoKSB8fCAoaXNJbmxpbmVCbG9ja09ySW5saW5lVGFibGUoKSAm
JiAhaXNIVE1MTWFycXVlZSgpKSkKKyAgICBpZiAoaXNGbG9hdGluZygpIHx8IChpc0lubGluZUJs
b2NrT3JJbmxpbmVUYWJsZSgpICYmICFpc0hUTUxNYXJxdWVlKCkgJiYgIWlzQW5vbnltb3VzSW5s
aW5lQmxvY2soKSkpCiAgICAgICAgIHJldHVybiB0cnVlOwogCiAgICAgLy8gVGhpcyBjb2RlIG1h
eSBsb29rIGEgYml0IHN0cmFuZ2UuICBCYXNpY2FsbHkgd2lkdGg6aW50cmluc2ljIHNob3VsZCBj
bGFtcCB0aGUgc2l6ZSB3aGVuIHRlc3RpbmcgYm90aApAQCAtMjgxOSw3ICsyODE5LDcgQEAgYm9v
bCBSZW5kZXJCb3g6OnNocmlua1RvQXZvaWRGbG9hdHMoKSBjbwogCiBib29sIFJlbmRlckJveDo6
YXZvaWRzRmxvYXRzKCkgY29uc3QKIHsKLSAgICByZXR1cm4gaXNSZXBsYWNlZCgpIHx8IGhhc092
ZXJmbG93Q2xpcCgpIHx8IGlzSFIoKTsKKyAgICByZXR1cm4gIWlzQW5vbnltb3VzSW5saW5lQmxv
Y2soKSAmJiAoaXNSZXBsYWNlZCgpIHx8IGhhc092ZXJmbG93Q2xpcCgpIHx8IGlzSFIoKSk7CiB9
CiAKIHZvaWQgUmVuZGVyQm94OjphZGRTaGFkb3dPdmVyZmxvdygpCkluZGV4OiBXZWJDb3JlL3Jl
bmRlcmluZy9SZW5kZXJCb3hNb2RlbE9iamVjdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9y
ZW5kZXJpbmcvUmVuZGVyQm94TW9kZWxPYmplY3QuY3BwCShyZXZpc2lvbiA1NDc3NSkKKysrIFdl
YkNvcmUvcmVuZGVyaW5nL1JlbmRlckJveE1vZGVsT2JqZWN0LmNwcAkod29ya2luZyBjb3B5KQpA
QCAtNTExLDggKzUxMSw5IEBAIHZvaWQgUmVuZGVyQm94TW9kZWxPYmplY3Q6OnBhaW50RmlsbExh
eWUKICAgICAgICAgLy8gTm93IGFkZCB0aGUgdGV4dCB0byB0aGUgY2xpcC4gIFdlIGRvIHRoaXMg
YnkgcGFpbnRpbmcgdXNpbmcgYSBzcGVjaWFsIHBhaW50IHBoYXNlIHRoYXQgc2lnbmFscyB0bwog
ICAgICAgICAvLyBJbmxpbmVUZXh0Qm94ZXMgdGhhdCB0aGV5IHNob3VsZCBqdXN0IGFkZCB0aGVp
ciBjb250ZW50cyB0byB0aGUgY2xpcC4KICAgICAgICAgUGFpbnRJbmZvIGluZm8obWFza0ltYWdl
Q29udGV4dCwgbWFza1JlY3QsIFBhaW50UGhhc2VUZXh0Q2xpcCwgdHJ1ZSwgMCwgMCk7CisgICAg
ICAgIExpbmVCb3hQYWludEluZm8gbGluZUJveEluZm87CiAgICAgICAgIGlmIChib3gpCi0gICAg
ICAgICAgICBib3gtPnBhaW50KGluZm8sIHR4IC0gYm94LT54KCksIHR5IC0gYm94LT55KCkpOwor
ICAgICAgICAgICAgYm94LT5wYWludChpbmZvLCB0eCAtIGJveC0+eCgpLCB0eSAtIGJveC0+eSgp
LCBsaW5lQm94SW5mbyk7CiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgaW50IHggPSBpc0Jv
eCgpID8gdG9SZW5kZXJCb3godGhpcyktPngoKSA6IDA7CiAgICAgICAgICAgICBpbnQgeSA9IGlz
Qm94KCkgPyB0b1JlbmRlckJveCh0aGlzKS0+eSgpIDogMDsKSW5kZXg6IFdlYkNvcmUvcmVuZGVy
aW5nL1JlbmRlcklubGluZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVu
ZGVySW5saW5lLmNwcAkocmV2aXNpb24gNTQ3NzUpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5k
ZXJJbmxpbmUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00NCw3ICs0NCw2IEBAIG5hbWVzcGFjZSBX
ZWJDb3JlIHsKIAogUmVuZGVySW5saW5lOjpSZW5kZXJJbmxpbmUoTm9kZSogbm9kZSkKICAgICA6
IFJlbmRlckJveE1vZGVsT2JqZWN0KG5vZGUpCi0gICAgLCBtX2NvbnRpbnVhdGlvbigwKQogICAg
ICwgbV9saW5lSGVpZ2h0KC0xKQogICAgICwgbV92ZXJ0aWNhbFBvc2l0aW9uKFBvc2l0aW9uVW5k
ZWZpbmVkKQogewpAQCAtNTYsMTQgKzU1LDYgQEAgdm9pZCBSZW5kZXJJbmxpbmU6OmRlc3Ryb3ko
KQogICAgIC8vIE1ha2Ugc3VyZSB0byBkZXN0cm95IGFub255bW91cyBjaGlsZHJlbiBmaXJzdCB3
aGlsZSB0aGV5IGFyZSBzdGlsbCBjb25uZWN0ZWQgdG8gdGhlIHJlc3Qgb2YgdGhlIHRyZWUsIHNv
IHRoYXQgdGhleSB3aWxsCiAgICAgLy8gcHJvcGVybHkgZGlydHkgbGluZSBib3hlcyB0aGF0IHRo
ZXkgYXJlIHJlbW92ZWQgZnJvbS4gIEVmZmVjdHMgdGhhdCBkbyA6YmVmb3JlLzphZnRlciBvbmx5
IG9uIGhvdmVyIGNvdWxkIGNyYXNoIG90aGVyd2lzZS4KICAgICBjaGlsZHJlbigpLT5kZXN0cm95
TGVmdG92ZXJDaGlsZHJlbigpOwotCi0gICAgLy8gRGVzdHJveSBvdXIgY29udGludWF0aW9uIGJl
Zm9yZSBhbnl0aGluZyBvdGhlciB0aGFuIGFub255bW91cyBjaGlsZHJlbi4KLSAgICAvLyBUaGUg
cmVhc29uIHdlIGRvbid0IGRlc3Ryb3kgaXQgYmVmb3JlIGFub255bW91cyBjaGlsZHJlbiBpcyB0
aGF0IHRoZXkgbWF5Ci0gICAgLy8gaGF2ZSBjb250aW51YXRpb25zIG9mIHRoZWlyIG93biB0aGF0
IGFyZSBhbm9ueW1vdXMgY2hpbGRyZW4gb2Ygb3VyIGNvbnRpbnVhdGlvbi4KLSAgICBpZiAobV9j
b250aW51YXRpb24pIHsKLSAgICAgICAgbV9jb250aW51YXRpb24tPmRlc3Ryb3koKTsKLSAgICAg
ICAgbV9jb250aW51YXRpb24gPSAwOwotICAgIH0KICAgICAKICAgICBpZiAoIWRvY3VtZW50QmVp
bmdEZXN0cm95ZWQoKSkgewogICAgICAgICBpZiAoZmlyc3RMaW5lQm94KCkpIHsKQEAgLTkyLDEz
ICs4Myw2IEBAIHZvaWQgUmVuZGVySW5saW5lOjpkZXN0cm95KCkKICAgICBSZW5kZXJCb3hNb2Rl
bE9iamVjdDo6ZGVzdHJveSgpOwogfQogCi1SZW5kZXJJbmxpbmUqIFJlbmRlcklubGluZTo6aW5s
aW5lQ29udGludWF0aW9uKCkgY29uc3QKLXsKLSAgICBpZiAoIW1fY29udGludWF0aW9uIHx8IG1f
Y29udGludWF0aW9uLT5pc0lubGluZSgpKQotICAgICAgICByZXR1cm4gdG9SZW5kZXJJbmxpbmUo
bV9jb250aW51YXRpb24pOwotICAgIHJldHVybiB0b1JlbmRlckJsb2NrKG1fY29udGludWF0aW9u
KS0+aW5saW5lQ29udGludWF0aW9uKCk7Ci19Ci0KIHZvaWQgUmVuZGVySW5saW5lOjp1cGRhdGVC
b3hNb2RlbEluZm9Gcm9tU3R5bGUoKQogewogICAgIFJlbmRlckJveE1vZGVsT2JqZWN0Ojp1cGRh
dGVCb3hNb2RlbEluZm9Gcm9tU3R5bGUoKTsKQEAgLTExNCwxOSArOTgsNiBAQCB2b2lkIFJlbmRl
cklubGluZTo6c3R5bGVEaWRDaGFuZ2UoU3R5bGVECiB7CiAgICAgUmVuZGVyQm94TW9kZWxPYmpl
Y3Q6OnN0eWxlRGlkQ2hhbmdlKGRpZmYsIG9sZFN0eWxlKTsKIAotICAgIC8vIEVuc3VyZSB0aGF0
IGFsbCBvZiB0aGUgc3BsaXQgaW5saW5lcyBwaWNrIHVwIHRoZSBuZXcgc3R5bGUuIFdlCi0gICAg
Ly8gb25seSBkbyB0aGlzIGlmIHdlJ3JlIGFuIGlubGluZSwgc2luY2Ugd2UgZG9uJ3Qgd2FudCB0
byBwcm9wYWdhdGUKLSAgICAvLyBhIGJsb2NrJ3Mgc3R5bGUgdG8gdGhlIG90aGVyIGlubGluZXMu
Ci0gICAgLy8gZS5nLiwgPGZvbnQ+Zm9vIDxoND5nb288L2g0PiBtb288L2ZvbnQ+LiAgVGhlIDxm
b250PiBpbmxpbmVzIGJlZm9yZQotICAgIC8vIGFuZCBhZnRlciB0aGUgYmxvY2sgc2hhcmUgdGhl
IHNhbWUgc3R5bGUsIGJ1dCB0aGUgYmxvY2sgZG9lc24ndAotICAgIC8vIG5lZWQgdG8gcGFzcyBp
dHMgc3R5bGUgb24gdG8gYW55b25lIGVsc2UuCi0gICAgZm9yIChSZW5kZXJJbmxpbmUqIGN1cnJD
b250ID0gaW5saW5lQ29udGludWF0aW9uKCk7IGN1cnJDb250OyBjdXJyQ29udCA9IGN1cnJDb250
LT5pbmxpbmVDb250aW51YXRpb24oKSkgewotICAgICAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCog
bmV4dENvbnQgPSBjdXJyQ29udC0+Y29udGludWF0aW9uKCk7Ci0gICAgICAgIGN1cnJDb250LT5z
ZXRDb250aW51YXRpb24oMCk7Ci0gICAgICAgIGN1cnJDb250LT5zZXRTdHlsZShzdHlsZSgpKTsK
LSAgICAgICAgY3VyckNvbnQtPnNldENvbnRpbnVhdGlvbihuZXh0Q29udCk7Ci0gICAgfQotCiAg
ICAgbV9saW5lSGVpZ2h0ID0gLTE7CiAKICAgICAvLyBVcGRhdGUgcHNldWRvcyBmb3IgOmJlZm9y
ZSBhbmQgOmFmdGVyIG5vdy4KQEAgLTEzNiw3OSArMTA3LDczIEBAIHZvaWQgUmVuZGVySW5saW5l
OjpzdHlsZURpZENoYW5nZShTdHlsZUQKICAgICB9CiB9CiAKLXZvaWQgUmVuZGVySW5saW5lOjph
ZGRDaGlsZChSZW5kZXJPYmplY3QqIG5ld0NoaWxkLCBSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxk
KQotewotICAgIGlmIChjb250aW51YXRpb24oKSkKLSAgICAgICAgcmV0dXJuIGFkZENoaWxkVG9D
b250aW51YXRpb24obmV3Q2hpbGQsIGJlZm9yZUNoaWxkKTsKLSAgICByZXR1cm4gYWRkQ2hpbGRJ
Z25vcmluZ0NvbnRpbnVhdGlvbihuZXdDaGlsZCwgYmVmb3JlQ2hpbGQpOwotfQotCi1zdGF0aWMg
UmVuZGVyQm94TW9kZWxPYmplY3QqIG5leHRDb250aW51YXRpb24oUmVuZGVyT2JqZWN0KiByZW5k
ZXJlcikKLXsKLSAgICBpZiAocmVuZGVyZXItPmlzSW5saW5lKCkgJiYgIXJlbmRlcmVyLT5pc1Jl
cGxhY2VkKCkpCi0gICAgICAgIHJldHVybiB0b1JlbmRlcklubGluZShyZW5kZXJlciktPmNvbnRp
bnVhdGlvbigpOwotICAgIHJldHVybiB0b1JlbmRlckJsb2NrKHJlbmRlcmVyKS0+aW5saW5lQ29u
dGludWF0aW9uKCk7Ci19Ci0KLVJlbmRlckJveE1vZGVsT2JqZWN0KiBSZW5kZXJJbmxpbmU6OmNv
bnRpbnVhdGlvbkJlZm9yZShSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkKQordm9pZCBSZW5kZXJJ
bmxpbmU6OmNoaWxkQmVjYW1lTm9uSW5saW5lKFJlbmRlck9iamVjdCogY2hpbGQpCiB7Ci0gICAg
aWYgKGJlZm9yZUNoaWxkICYmIGJlZm9yZUNoaWxkLT5wYXJlbnQoKSA9PSB0aGlzKQotICAgICAg
ICByZXR1cm4gdGhpczsKLQotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBjdXJyID0gbmV4dENv
bnRpbnVhdGlvbih0aGlzKTsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogbmV4dFRvTGFzdCA9
IHRoaXM7Ci0gICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGxhc3QgPSB0aGlzOwotICAgIHdoaWxl
IChjdXJyKSB7Ci0gICAgICAgIGlmIChiZWZvcmVDaGlsZCAmJiBiZWZvcmVDaGlsZC0+cGFyZW50
KCkgPT0gY3VycikgewotICAgICAgICAgICAgaWYgKGN1cnItPmZpcnN0Q2hpbGQoKSA9PSBiZWZv
cmVDaGlsZCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbGFzdDsKLSAgICAgICAgICAgIHJldHVy
biBjdXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgbmV4dFRvTGFzdCA9IGxhc3Q7Ci0gICAgICAg
IGxhc3QgPSBjdXJyOwotICAgICAgICBjdXJyID0gbmV4dENvbnRpbnVhdGlvbihjdXJyKTsKLSAg
ICB9Ci0KLSAgICBpZiAoIWJlZm9yZUNoaWxkICYmICFsYXN0LT5maXJzdENoaWxkKCkpCi0gICAg
ICAgIHJldHVybiBuZXh0VG9MYXN0OwotICAgIHJldHVybiBsYXN0OworICAgIFJlbmRlck9iamVj
dCogbmV4dCA9IGNoaWxkLT5uZXh0U2libGluZygpOworICAgIHJlbW92ZUNoaWxkKGNoaWxkKTsK
KyAgICBhZGRDaGlsZChjaGlsZCwgbmV4dCk7CiB9CiAKLXZvaWQgUmVuZGVySW5saW5lOjphZGRD
aGlsZElnbm9yaW5nQ29udGludWF0aW9uKFJlbmRlck9iamVjdCogbmV3Q2hpbGQsIFJlbmRlck9i
amVjdCogYmVmb3JlQ2hpbGQpCit2b2lkIFJlbmRlcklubGluZTo6YWRkQ2hpbGQoUmVuZGVyT2Jq
ZWN0KiBuZXdDaGlsZCwgUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCkKIHsKICAgICAvLyBNYWtl
IHN1cmUgd2UgZG9uJ3QgYXBwZW5kIHRoaW5ncyBhZnRlciA6YWZ0ZXItZ2VuZXJhdGVkIGNvbnRl
bnQgaWYgd2UgaGF2ZSBpdC4KICAgICBpZiAoIWJlZm9yZUNoaWxkICYmIGlzQWZ0ZXJDb250ZW50
KGxhc3RDaGlsZCgpKSkKICAgICAgICAgYmVmb3JlQ2hpbGQgPSBsYXN0Q2hpbGQoKTsKIAotICAg
IGlmICghbmV3Q2hpbGQtPmlzSW5saW5lKCkgJiYgIW5ld0NoaWxkLT5pc0Zsb2F0aW5nT3JQb3Np
dGlvbmVkKCkpIHsKLSAgICAgICAgLy8gV2UgYXJlIHBsYWNpbmcgYSBibG9jayBpbnNpZGUgYW4g
aW5saW5lLiBXZSBoYXZlIHRvIHBlcmZvcm0gYSBzcGxpdCBvZiB0aGlzCi0gICAgICAgIC8vIGlu
bGluZSBpbnRvIGNvbnRpbnVhdGlvbnMuICBUaGlzIGludm9sdmVzIGNyZWF0aW5nIGFuIGFub255
bW91cyBibG9jayBib3ggdG8gaG9sZAotICAgICAgICAvLyB8bmV3Q2hpbGR8LiAgV2UgdGhlbiBt
YWtlIHRoYXQgYmxvY2sgYm94IGEgY29udGludWF0aW9uIG9mIHRoaXMgaW5saW5lLiAgV2UgdGFr
ZSBhbGwgb2YKLSAgICAgICAgLy8gdGhlIGNoaWxkcmVuIGFmdGVyIHxiZWZvcmVDaGlsZHwgYW5k
IHB1dCB0aGVtIGluIGEgY2xvbmUgb2YgdGhpcyBvYmplY3QuCi0gICAgICAgIFJlZlB0cjxSZW5k
ZXJTdHlsZT4gbmV3U3R5bGUgPSBSZW5kZXJTdHlsZTo6Y3JlYXRlKCk7Ci0gICAgICAgIG5ld1N0
eWxlLT5pbmhlcml0RnJvbShzdHlsZSgpKTsKLSAgICAgICAgbmV3U3R5bGUtPnNldERpc3BsYXko
QkxPQ0spOwotCi0gICAgICAgIFJlbmRlckJsb2NrKiBuZXdCb3ggPSBuZXcgKHJlbmRlckFyZW5h
KCkpIFJlbmRlckJsb2NrKGRvY3VtZW50KCkgLyogYW5vbnltb3VzIGJveCAqLyk7Ci0gICAgICAg
IG5ld0JveC0+c2V0U3R5bGUobmV3U3R5bGUucmVsZWFzZSgpKTsKLSAgICAgICAgUmVuZGVyQm94
TW9kZWxPYmplY3QqIG9sZENvbnRpbnVhdGlvbiA9IGNvbnRpbnVhdGlvbigpOwotICAgICAgICBz
ZXRDb250aW51YXRpb24obmV3Qm94KTsKLQotICAgICAgICAvLyBTb21lb25lIG1heSBoYXZlIHB1
dCBhIDxwPiBpbnNpZGUgYSA8cT4sIGNhdXNpbmcgYSBzcGxpdC4gIFdoZW4gdGhpcyBoYXBwZW5z
LCB0aGUgOmFmdGVyIGNvbnRlbnQKLSAgICAgICAgLy8gaGFzIHRvIG1vdmUgaW50byB0aGUgaW5s
aW5lIGNvbnRpbnVhdGlvbi4gIENhbGwgdXBkYXRlQmVmb3JlQWZ0ZXJDb250ZW50IHRvIGVuc3Vy
ZSB0aGF0IG91ciA6YWZ0ZXIKLSAgICAgICAgLy8gY29udGVudCBnZXRzIHByb3Blcmx5IGRlc3Ry
b3llZC4KLSAgICAgICAgYm9vbCBpc0xhc3RDaGlsZCA9IChiZWZvcmVDaGlsZCA9PSBsYXN0Q2hp
bGQoKSk7Ci0gICAgICAgIGlmIChkb2N1bWVudCgpLT51c2VzQmVmb3JlQWZ0ZXJSdWxlcygpKQot
ICAgICAgICAgICAgY2hpbGRyZW4oKS0+dXBkYXRlQmVmb3JlQWZ0ZXJDb250ZW50KHRoaXMsIEFG
VEVSKTsKLSAgICAgICAgaWYgKGlzTGFzdENoaWxkICYmIGJlZm9yZUNoaWxkICE9IGxhc3RDaGls
ZCgpKQotICAgICAgICAgICAgYmVmb3JlQ2hpbGQgPSAwOyAvLyBXZSBkZXN0cm95ZWQgdGhlIGxh
c3QgY2hpbGQsIHNvIG5vdyB3ZSBuZWVkIHRvIHVwZGF0ZSBvdXIgaW5zZXJ0aW9uCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIC8vIHBvaW50IHRvIGJlIDAuICBJdCdzIGp1c3QgYSBzdHJh
aWdodCBhcHBlbmQgbm93LgotCi0gICAgICAgIHNwbGl0RmxvdyhiZWZvcmVDaGlsZCwgbmV3Qm94
LCBuZXdDaGlsZCwgb2xkQ29udGludWF0aW9uKTsKKyAgICAvLyBJZiB0aGUgcmVxdWVzdGVkIGJl
Zm9yZUNoaWxkIGlzIG5vdCBvbmUgb2Ygb3VyIGNoaWxkcmVuLCB0aGVuIHRoaXMgaXMgbW9zdCBs
aWtlbHkgYmVjYXVzZQorICAgIC8vIHRoZXJlIGlzIGFuIGFub255bW91cyBpbmxpbmUtYmxvY2sg
Ym94IHdpdGhpbiB0aGlzIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBiZWZvcmVDaGlsZC4gU28K
KyAgICAvLyBqdXN0IGluc2VydCB0aGUgY2hpbGQgaW50byB0aGUgYW5vbnltb3VzIGlubGluZS1i
bG9jayBib3ggaW5zdGVhZCBvZiBoZXJlLgorICAgIC8vIEEgc2Vjb25kIHBvc3NpYmlsaXR5IGlz
IHRoYXQgdGhlIGJlZm9yZUNoaWxkIGlzIGFuIGFub255bW91cyBibG9jayBpbnNpZGUgdGhlIGFu
b255bW91cyBpbmxpbmUgYmxvY2suCisgICAgLy8gVGhpcyBjYW4gaGFwcGVuIGlmIGlubGluZXMg
YXJlIGluc2VydGVkIGluIGJldHdlZW4gdHdvIG9mIHRoZSBhbm9ueW1vdXMgaW5saW5lIGJsb2Nr
J3MgYmxvY2stbGV2ZWwKKyAgICAvLyBjaGlsZHJlbiBhZnRlciBpdCBoYXMgYmVlbiBjcmVhdGVk
LgorICAgIGlmIChiZWZvcmVDaGlsZCAmJiBiZWZvcmVDaGlsZC0+cGFyZW50KCkgIT0gdGhpcykg
eworICAgICAgICBBU1NFUlQoYmVmb3JlQ2hpbGQtPnBhcmVudCgpKTsKKyAgICAgICAgQVNTRVJU
KGJlZm9yZUNoaWxkLT5wYXJlbnQoKS0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpIHx8IGJlZm9y
ZUNoaWxkLT5wYXJlbnQoKS0+aXNBbm9ueW1vdXNCbG9jaygpKTsKKyAgICAgICAgaWYgKGJlZm9y
ZUNoaWxkLT5wYXJlbnQoKS0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CisgICAgICAgICAg
ICBpZiAoIW5ld0NoaWxkLT5pc0lubGluZSgpIHx8IChuZXdDaGlsZC0+aXNJbmxpbmUoKSAmJiBi
ZWZvcmVDaGlsZC0+cGFyZW50KCktPmZpcnN0Q2hpbGQoKSAhPSBiZWZvcmVDaGlsZCkpCisgICAg
ICAgICAgICAgICAgYmVmb3JlQ2hpbGQtPnBhcmVudCgpLT5hZGRDaGlsZChuZXdDaGlsZCwgYmVm
b3JlQ2hpbGQpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGFkZENoaWxkKG5l
d0NoaWxkLCBiZWZvcmVDaGlsZC0+cGFyZW50KCkpOworICAgICAgICB9IGVsc2UgaWYgKGJlZm9y
ZUNoaWxkLT5wYXJlbnQoKS0+aXNBbm9ueW1vdXNCbG9jaygpKSB7CisgICAgICAgICAgICBBU1NF
UlQoIWJlZm9yZUNoaWxkLT5wYXJlbnQoKS0+cGFyZW50KCkgfHwgYmVmb3JlQ2hpbGQtPnBhcmVu
dCgpLT5wYXJlbnQoKS0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKTsKKyAgICAgICAgICAgIEFT
U0VSVChiZWZvcmVDaGlsZC0+aXNJbmxpbmUoKSk7CisgICAgICAgICAgICBpZiAobmV3Q2hpbGQt
PmlzSW5saW5lKCkgfHwgKCFuZXdDaGlsZC0+aXNJbmxpbmUoKSAmJiBiZWZvcmVDaGlsZC0+cGFy
ZW50KCktPmZpcnN0Q2hpbGQoKSAhPSBiZWZvcmVDaGlsZCkpCisgICAgICAgICAgICAgICAgYmVm
b3JlQ2hpbGQtPnBhcmVudCgpLT5hZGRDaGlsZChuZXdDaGlsZCwgYmVmb3JlQ2hpbGQpOworICAg
ICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGFkZENoaWxkKG5ld0NoaWxkLCBiZWZvcmVD
aGlsZC0+cGFyZW50KCkpOworICAgICAgICB9CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKKyAg
ICBpZiAoIW5ld0NoaWxkLT5pc0lubGluZSgpKSB7CisgICAgICAgIC8vIFdlIGFyZSBwbGFjaW5n
IGEgYmxvY2sgaW5zaWRlIGFuIGlubGluZS4gV2UgaGF2ZSB0byBwbGFjZSB0aGUgYmxvY2sgaW5z
aWRlIGFuIGFub255bW91cyBpbmxpbmUtYmxvY2suCisgICAgICAgIC8vIFRoaXMgaW5saW5lLWJs
b2NrIGNhbiBob3VzZSBhIHNlcXVlbmNlIG9mIGNvbnRpZ3VvdXMgYmxvY2stbGV2ZWwgY2hpbGRy
ZW4sIGFuZCB0aGV5IHdpbGwgYWxsIHNpdCBvbiB0aGUKKyAgICAgICAgLy8gc2FtZSBsaW5lIHRv
Z2V0aGVyLiAgV2UgdHJ5IHRvIHJldXNlIG9uZSBmaXJzdCBpZiBwb3NzaWJsZS4KKyAgICAgICAg
aWYgKGJlZm9yZUNoaWxkKSB7CisgICAgICAgICAgICBpZiAoYmVmb3JlQ2hpbGQtPnByZXZpb3Vz
U2libGluZygpICYmIGJlZm9yZUNoaWxkLT5wcmV2aW91c1NpYmxpbmcoKS0+aXNBbm9ueW1vdXNJ
bmxpbmVCbG9jaygpKSB7CisgICAgICAgICAgICAgICAgYmVmb3JlQ2hpbGQtPnByZXZpb3VzU2li
bGluZygpLT5hZGRDaGlsZChuZXdDaGlsZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAg
ICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGxhc3RDaGlsZCgp
ICYmIGxhc3RDaGlsZCgpLT5pc0Fub255bW91c0lubGluZUJsb2NrKCkpIHsKKyAgICAgICAgICAg
ICAgICBsYXN0Q2hpbGQoKS0+YWRkQ2hpbGQobmV3Q2hpbGQpOworICAgICAgICAgICAgICAgIHJl
dHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorIAorICAgICAgICBpZiAoIW5ld0NoaWxk
LT5pc0Zsb2F0aW5nT3JQb3NpdGlvbmVkKCkpIHsKKyAgICAgICAgICAgIC8vIFRoZXJlIHdhcyBu
byBzdWl0YWJsZSBleGlzdGluZyBhbm9ueW1vdXMgYm94LiAgQ3JlYXRlIGEgbmV3IG9uZS4KKyAg
ICAgICAgICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gbmV3U3R5bGUgPSBSZW5kZXJTdHlsZTo6Y3Jl
YXRlKCk7CisgICAgICAgICAgICBuZXdTdHlsZS0+aW5oZXJpdEZyb20oc3R5bGUoKSk7CisgICAg
ICAgICAgICBuZXdTdHlsZS0+c2V0RGlzcGxheShJTkxJTkVfQkxPQ0spOworICAgICAgICAgICAg
UmVuZGVyQmxvY2sqIG5ld0JveCA9IG5ldyAocmVuZGVyQXJlbmEoKSkgUmVuZGVyQmxvY2soZG9j
dW1lbnQoKSk7CisgICAgICAgICAgICBuZXdCb3gtPnNldFN0eWxlKG5ld1N0eWxlKTsKKyAgICAg
ICAgICAgIFJlbmRlckJveE1vZGVsT2JqZWN0OjphZGRDaGlsZChuZXdCb3gsIGJlZm9yZUNoaWxk
KTsKKyAgICAgICAgICAgIG5ld0JveC0+YWRkQ2hpbGQobmV3Q2hpbGQpOworICAgICAgICAgICAg
cmV0dXJuOworICAgICAgICB9CisgICAgfQorCiAgICAgUmVuZGVyQm94TW9kZWxPYmplY3Q6OmFk
ZENoaWxkKG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7CiAKICAgICBuZXdDaGlsZC0+c2V0TmVlZHNM
YXlvdXRBbmRQcmVmV2lkdGhzUmVjYWxjKCk7CkBAIC0yMjEsMjI0ICsxODYsNTkgQEAgUmVuZGVy
SW5saW5lKiBSZW5kZXJJbmxpbmU6OmNsb25lSW5saW5lKAogICAgIHJldHVybiBvOwogfQogCi12
b2lkIFJlbmRlcklubGluZTo6c3BsaXRJbmxpbmVzKFJlbmRlckJsb2NrKiBmcm9tQmxvY2ssIFJl
bmRlckJsb2NrKiB0b0Jsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW5k
ZXJCbG9jayogbWlkZGxlQmxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJl
bmRlck9iamVjdCogYmVmb3JlQ2hpbGQsIFJlbmRlckJveE1vZGVsT2JqZWN0KiBvbGRDb250KQot
ewotICAgIC8vIENyZWF0ZSBhIGNsb25lIG9mIHRoaXMgaW5saW5lLgotICAgIFJlbmRlcklubGlu
ZSogY2xvbmUgPSBjbG9uZUlubGluZSh0aGlzKTsKLSAgICBjbG9uZS0+c2V0Q29udGludWF0aW9u
KG9sZENvbnQpOwotCi0gICAgLy8gTm93IHRha2UgYWxsIG9mIHRoZSBjaGlsZHJlbiBmcm9tIGJl
Zm9yZUNoaWxkIHRvIHRoZSBlbmQgYW5kIHJlbW92ZQotICAgIC8vIHRoZW0gZnJvbSB8dGhpc3wg
YW5kIHBsYWNlIHRoZW0gaW4gdGhlIGNsb25lLgotICAgIFJlbmRlck9iamVjdCogbyA9IGJlZm9y
ZUNoaWxkOwotICAgIHdoaWxlIChvKSB7Ci0gICAgICAgIFJlbmRlck9iamVjdCogdG1wID0gbzsK
LSAgICAgICAgbyA9IHRtcC0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgY2xvbmUtPmFkZENoaWxk
SWdub3JpbmdDb250aW51YXRpb24oY2hpbGRyZW4oKS0+cmVtb3ZlQ2hpbGROb2RlKHRoaXMsIHRt
cCksIDApOwotICAgICAgICB0bXAtPnNldE5lZWRzTGF5b3V0QW5kUHJlZldpZHRoc1JlY2FsYygp
OwotICAgIH0KLQotICAgIC8vIEhvb2sgfGNsb25lfCB1cCBhcyB0aGUgY29udGludWF0aW9uIG9m
IHRoZSBtaWRkbGUgYmxvY2suCi0gICAgbWlkZGxlQmxvY2stPnNldElubGluZUNvbnRpbnVhdGlv
bihjbG9uZSk7Ci0KLSAgICAvLyBXZSBoYXZlIGJlZW4gcmVwYXJlbnRlZCBhbmQgYXJlIG5vdyB1
bmRlciB0aGUgZnJvbUJsb2NrLiAgV2UgbmVlZAotICAgIC8vIHRvIHdhbGsgdXAgb3VyIGlubGlu
ZSBwYXJlbnQgY2hhaW4gdW50aWwgd2UgaGl0IHRoZSBjb250YWluaW5nIGJsb2NrLgotICAgIC8v
IE9uY2Ugd2UgaGl0IHRoZSBjb250YWluaW5nIGJsb2NrIHdlJ3JlIGRvbmUuCi0gICAgUmVuZGVy
Qm94TW9kZWxPYmplY3QqIGN1cnIgPSB0b1JlbmRlckJveE1vZGVsT2JqZWN0KHBhcmVudCgpKTsK
LSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogY3VyckNoaWxkID0gdGhpczsKLSAgICAKLSAgICAv
LyBGSVhNRTogQmVjYXVzZSBzcGxpdHRpbmcgaXMgTyhuXjIpIGFzIHRhZ3MgbmVzdCBwYXRob2xv
Z2ljYWxseSwgd2UgY2FwIHRoZSBkZXB0aCBhdCB3aGljaCB3ZSdyZSB3aWxsaW5nIHRvIGNsb25l
LgotICAgIC8vIFRoZXJlIHdpbGwgZXZlbnR1YWxseSBiZSBhIGJldHRlciBhcHByb2FjaCB0byB0
aGlzIHByb2JsZW0gdGhhdCB3aWxsIGxldCB1cyBuZXN0IHRvIGEgbXVjaAotICAgIC8vIGdyZWF0
ZXIgZGVwdGggKHNlZSBidWd6aWxsYSBidWcgMTM0MzApIGJ1dCBmb3Igbm93IHdlIGhhdmUgYSBs
aW1pdC4gIFRoaXMgKndpbGwqIHJlc3VsdCBpbgotICAgIC8vIGluY29ycmVjdCByZW5kZXJpbmcs
IGJ1dCB0aGUgYWx0ZXJuYXRpdmUgaXMgdG8gaGFuZyBmb3JldmVyLgotICAgIHVuc2lnbmVkIHNw
bGl0RGVwdGggPSAxOwotICAgIGNvbnN0IHVuc2lnbmVkIGNNYXhTcGxpdERlcHRoID0gMjAwOyAK
LSAgICB3aGlsZSAoY3VyciAmJiBjdXJyICE9IGZyb21CbG9jaykgewotICAgICAgICBBU1NFUlQo
Y3Vyci0+aXNSZW5kZXJJbmxpbmUoKSk7Ci0gICAgICAgIGlmIChzcGxpdERlcHRoIDwgY01heFNw
bGl0RGVwdGgpIHsKLSAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBjbG9uZS4KLSAgICAgICAg
ICAgIFJlbmRlcklubGluZSogY2xvbmVDaGlsZCA9IGNsb25lOwotICAgICAgICAgICAgY2xvbmUg
PSBjbG9uZUlubGluZSh0b1JlbmRlcklubGluZShjdXJyKSk7Ci0KLSAgICAgICAgICAgIC8vIElu
c2VydCBvdXIgY2hpbGQgY2xvbmUgYXMgdGhlIGZpcnN0IGNoaWxkLgotICAgICAgICAgICAgY2xv
bmUtPmFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24oY2xvbmVDaGlsZCwgMCk7Ci0KLSAgICAg
ICAgICAgIC8vIEhvb2sgdGhlIGNsb25lIHVwIGFzIGEgY29udGludWF0aW9uIG9mIHxjdXJyfC4K
LSAgICAgICAgICAgIFJlbmRlcklubGluZSogaW5saW5lQ3VyciA9IHRvUmVuZGVySW5saW5lKGN1
cnIpOwotICAgICAgICAgICAgb2xkQ29udCA9IGlubGluZUN1cnItPmNvbnRpbnVhdGlvbigpOwot
ICAgICAgICAgICAgaW5saW5lQ3Vyci0+c2V0Q29udGludWF0aW9uKGNsb25lKTsKLSAgICAgICAg
ICAgIGNsb25lLT5zZXRDb250aW51YXRpb24ob2xkQ29udCk7Ci0KLSAgICAgICAgICAgIC8vIFNv
bWVvbmUgbWF5IGhhdmUgaW5kaXJlY3RseSBjYXVzZWQgYSA8cT4gdG8gc3BsaXQuICBXaGVuIHRo
aXMgaGFwcGVucywgdGhlIDphZnRlciBjb250ZW50Ci0gICAgICAgICAgICAvLyBoYXMgdG8gbW92
ZSBpbnRvIHRoZSBpbmxpbmUgY29udGludWF0aW9uLiAgQ2FsbCB1cGRhdGVCZWZvcmVBZnRlckNv
bnRlbnQgdG8gZW5zdXJlIHRoYXQgdGhlIGlubGluZSdzIDphZnRlcgotICAgICAgICAgICAgLy8g
Y29udGVudCBnZXRzIHByb3Blcmx5IGRlc3Ryb3llZC4KLSAgICAgICAgICAgIGlmIChkb2N1bWVu
dCgpLT51c2VzQmVmb3JlQWZ0ZXJSdWxlcygpKQotICAgICAgICAgICAgICAgIGlubGluZUN1cnIt
PmNoaWxkcmVuKCktPnVwZGF0ZUJlZm9yZUFmdGVyQ29udGVudCh0aGlzLCBBRlRFUik7Ci0KLSAg
ICAgICAgICAgIC8vIE5vdyB3ZSBuZWVkIHRvIHRha2UgYWxsIG9mIHRoZSBjaGlsZHJlbiBzdGFy
dGluZyBmcm9tIHRoZSBmaXJzdCBjaGlsZAotICAgICAgICAgICAgLy8gKmFmdGVyKiBjdXJyQ2hp
bGQgYW5kIGFwcGVuZCB0aGVtIGFsbCB0byB0aGUgY2xvbmUuCi0gICAgICAgICAgICBvID0gY3Vy
ckNoaWxkLT5uZXh0U2libGluZygpOwotICAgICAgICAgICAgd2hpbGUgKG8pIHsKLSAgICAgICAg
ICAgICAgICBSZW5kZXJPYmplY3QqIHRtcCA9IG87Ci0gICAgICAgICAgICAgICAgbyA9IHRtcC0+
bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgICAgICAgICBjbG9uZS0+YWRkQ2hpbGRJZ25vcmluZ0Nv
bnRpbnVhdGlvbihpbmxpbmVDdXJyLT5jaGlsZHJlbigpLT5yZW1vdmVDaGlsZE5vZGUoY3Vyciwg
dG1wKSwgMCk7Ci0gICAgICAgICAgICAgICAgdG1wLT5zZXROZWVkc0xheW91dEFuZFByZWZXaWR0
aHNSZWNhbGMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAg
Ly8gS2VlcCB3YWxraW5nIHVwIHRoZSBjaGFpbi4KLSAgICAgICAgY3VyckNoaWxkID0gY3VycjsK
LSAgICAgICAgY3VyciA9IHRvUmVuZGVyQm94TW9kZWxPYmplY3QoY3Vyci0+cGFyZW50KCkpOwot
ICAgICAgICBzcGxpdERlcHRoKys7Ci0gICAgfQotCi0gICAgLy8gTm93IHdlIGFyZSBhdCB0aGUg
YmxvY2sgbGV2ZWwuIFdlIG5lZWQgdG8gcHV0IHRoZSBjbG9uZSBpbnRvIHRoZSB0b0Jsb2NrLgot
ICAgIHRvQmxvY2stPmNoaWxkcmVuKCktPmFwcGVuZENoaWxkTm9kZSh0b0Jsb2NrLCBjbG9uZSk7
Ci0KLSAgICAvLyBOb3cgdGFrZSBhbGwgdGhlIGNoaWxkcmVuIGFmdGVyIGN1cnJDaGlsZCBhbmQg
cmVtb3ZlIHRoZW0gZnJvbSB0aGUgZnJvbUJsb2NrCi0gICAgLy8gYW5kIHB1dCB0aGVtIGluIHRo
ZSB0b0Jsb2NrLgotICAgIG8gPSBjdXJyQ2hpbGQtPm5leHRTaWJsaW5nKCk7Ci0gICAgd2hpbGUg
KG8pIHsKLSAgICAgICAgUmVuZGVyT2JqZWN0KiB0bXAgPSBvOwotICAgICAgICBvID0gdG1wLT5u
ZXh0U2libGluZygpOwotICAgICAgICB0b0Jsb2NrLT5jaGlsZHJlbigpLT5hcHBlbmRDaGlsZE5v
ZGUodG9CbG9jaywgZnJvbUJsb2NrLT5jaGlsZHJlbigpLT5yZW1vdmVDaGlsZE5vZGUoZnJvbUJs
b2NrLCB0bXApKTsKLSAgICB9Ci19Ci0KLXZvaWQgUmVuZGVySW5saW5lOjpzcGxpdEZsb3coUmVu
ZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCwgUmVuZGVyQmxvY2sqIG5ld0Jsb2NrQm94LAotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXJPYmplY3QqIG5ld0NoaWxkLCBSZW5kZXJCb3hN
b2RlbE9iamVjdCogb2xkQ29udCkKLXsKLSAgICBSZW5kZXJCbG9jayogcHJlID0gMDsKLSAgICBS
ZW5kZXJCbG9jayogYmxvY2sgPSBjb250YWluaW5nQmxvY2soKTsKLSAgICAKLSAgICAvLyBEZWxl
dGUgb3VyIGxpbmUgYm94ZXMgYmVmb3JlIHdlIGRvIHRoZSBpbmxpbmUgc3BsaXQgaW50byBjb250
aW51YXRpb25zLgotICAgIGJsb2NrLT5kZWxldGVMaW5lQm94VHJlZSgpOwotICAgIAotICAgIGJv
b2wgbWFkZU5ld0JlZm9yZUJsb2NrID0gZmFsc2U7Ci0gICAgaWYgKGJsb2NrLT5pc0Fub255bW91
c0Jsb2NrKCkgJiYgKCFibG9jay0+cGFyZW50KCkgfHwgIWJsb2NrLT5wYXJlbnQoKS0+Y3JlYXRl
c0Fub255bW91c1dyYXBwZXIoKSkpIHsKLSAgICAgICAgLy8gV2UgY2FuIHJldXNlIHRoaXMgYmxv
Y2sgYW5kIG1ha2UgaXQgdGhlIHByZUJsb2NrIG9mIHRoZSBuZXh0IGNvbnRpbnVhdGlvbi4KLSAg
ICAgICAgcHJlID0gYmxvY2s7Ci0gICAgICAgIHByZS0+cmVtb3ZlUG9zaXRpb25lZE9iamVjdHMo
MCk7Ci0gICAgICAgIGJsb2NrID0gYmxvY2stPmNvbnRhaW5pbmdCbG9jaygpOwotICAgIH0gZWxz
ZSB7Ci0gICAgICAgIC8vIE5vIGFub255bW91cyBibG9jayBhdmFpbGFibGUgZm9yIHVzZS4gIE1h
a2Ugb25lLgotICAgICAgICBwcmUgPSBibG9jay0+Y3JlYXRlQW5vbnltb3VzQmxvY2soKTsKLSAg
ICAgICAgbWFkZU5ld0JlZm9yZUJsb2NrID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBSZW5kZXJCbG9j
ayogcG9zdCA9IGJsb2NrLT5jcmVhdGVBbm9ueW1vdXNCbG9jaygpOwotCi0gICAgUmVuZGVyT2Jq
ZWN0KiBib3hGaXJzdCA9IG1hZGVOZXdCZWZvcmVCbG9jayA/IGJsb2NrLT5maXJzdENoaWxkKCkg
OiBwcmUtPm5leHRTaWJsaW5nKCk7Ci0gICAgaWYgKG1hZGVOZXdCZWZvcmVCbG9jaykKLSAgICAg
ICAgYmxvY2stPmNoaWxkcmVuKCktPmluc2VydENoaWxkTm9kZShibG9jaywgcHJlLCBib3hGaXJz
dCk7Ci0gICAgYmxvY2stPmNoaWxkcmVuKCktPmluc2VydENoaWxkTm9kZShibG9jaywgbmV3Qmxv
Y2tCb3gsIGJveEZpcnN0KTsKLSAgICBibG9jay0+Y2hpbGRyZW4oKS0+aW5zZXJ0Q2hpbGROb2Rl
KGJsb2NrLCBwb3N0LCBib3hGaXJzdCk7Ci0gICAgYmxvY2stPnNldENoaWxkcmVuSW5saW5lKGZh
bHNlKTsKLSAgICAKLSAgICBpZiAobWFkZU5ld0JlZm9yZUJsb2NrKSB7Ci0gICAgICAgIFJlbmRl
ck9iamVjdCogbyA9IGJveEZpcnN0OwotICAgICAgICB3aGlsZSAobykgewotICAgICAgICAgICAg
UmVuZGVyT2JqZWN0KiBubyA9IG87Ci0gICAgICAgICAgICBvID0gbm8tPm5leHRTaWJsaW5nKCk7
Ci0gICAgICAgICAgICBwcmUtPmNoaWxkcmVuKCktPmFwcGVuZENoaWxkTm9kZShwcmUsIGJsb2Nr
LT5jaGlsZHJlbigpLT5yZW1vdmVDaGlsZE5vZGUoYmxvY2ssIG5vKSk7Ci0gICAgICAgICAgICBu
by0+c2V0TmVlZHNMYXlvdXRBbmRQcmVmV2lkdGhzUmVjYWxjKCk7Ci0gICAgICAgIH0KLSAgICB9
Ci0KLSAgICBzcGxpdElubGluZXMocHJlLCBwb3N0LCBuZXdCbG9ja0JveCwgYmVmb3JlQ2hpbGQs
IG9sZENvbnQpOwotCi0gICAgLy8gV2UgYWxyZWFkeSBrbm93IHRoZSBuZXdCbG9ja0JveCBpc24n
dCBnb2luZyB0byBjb250YWluIGlubGluZSBraWRzLCBzbyBhdm9pZCB3YXN0aW5nCi0gICAgLy8g
dGltZSBpbiBtYWtlQ2hpbGRyZW5Ob25JbmxpbmUgYnkganVzdCBzZXR0aW5nIHRoaXMgZXhwbGlj
aXRseSB1cCBmcm9udC4KLSAgICBuZXdCbG9ja0JveC0+c2V0Q2hpbGRyZW5JbmxpbmUoZmFsc2Up
OwotCi0gICAgLy8gV2UgZGVsYXllZCBhZGRpbmcgdGhlIG5ld0NoaWxkIHVudGlsIG5vdyBzbyB0
aGF0IHRoZSB8bmV3QmxvY2tCb3h8IHdvdWxkIGJlIGZ1bGx5Ci0gICAgLy8gY29ubmVjdGVkLCB0
aHVzIGFsbG93aW5nIG5ld0NoaWxkIGFjY2VzcyB0byBhIHJlbmRlckFyZW5hIHNob3VsZCBpdCBu
ZWVkCi0gICAgLy8gdG8gd3JhcCBpdHNlbGYgaW4gYWRkaXRpb25hbCBib3hlcyAoZS5nLiwgdGFi
bGUgY29uc3RydWN0aW9uKS4KLSAgICBuZXdCbG9ja0JveC0+YWRkQ2hpbGQobmV3Q2hpbGQpOwot
Ci0gICAgLy8gQWx3YXlzIGp1c3QgZG8gYSBmdWxsIGxheW91dCBpbiBvcmRlciB0byBlbnN1cmUg
dGhhdCBsaW5lIGJveGVzIChlc3BlY2lhbGx5IHdyYXBwZXJzIGZvciBpbWFnZXMpCi0gICAgLy8g
Z2V0IGRlbGV0ZWQgcHJvcGVybHkuICBCZWNhdXNlIG9iamVjdHMgbW92ZXMgZnJvbSB0aGUgcHJl
IGJsb2NrIGludG8gdGhlIHBvc3QgYmxvY2ssIHdlIHdhbnQgdG8KLSAgICAvLyBtYWtlIG5ldyBs
aW5lIGJveGVzIGluc3RlYWQgb2YgbGVhdmluZyB0aGUgb2xkIGxpbmUgYm94ZXMgYXJvdW5kLgot
ICAgIHByZS0+c2V0TmVlZHNMYXlvdXRBbmRQcmVmV2lkdGhzUmVjYWxjKCk7Ci0gICAgYmxvY2st
PnNldE5lZWRzTGF5b3V0QW5kUHJlZldpZHRoc1JlY2FsYygpOwotICAgIHBvc3QtPnNldE5lZWRz
TGF5b3V0QW5kUHJlZldpZHRoc1JlY2FsYygpOwotfQotCi12b2lkIFJlbmRlcklubGluZTo6YWRk
Q2hpbGRUb0NvbnRpbnVhdGlvbihSZW5kZXJPYmplY3QqIG5ld0NoaWxkLCBSZW5kZXJPYmplY3Qq
IGJlZm9yZUNoaWxkKQotewotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBmbG93ID0gY29udGlu
dWF0aW9uQmVmb3JlKGJlZm9yZUNoaWxkKTsKLSAgICBBU1NFUlQoIWJlZm9yZUNoaWxkIHx8IGJl
Zm9yZUNoaWxkLT5wYXJlbnQoKS0+aXNSZW5kZXJCbG9jaygpIHx8IGJlZm9yZUNoaWxkLT5wYXJl
bnQoKS0+aXNSZW5kZXJJbmxpbmUoKSk7Ci0gICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGJlZm9y
ZUNoaWxkUGFyZW50ID0gMDsKLSAgICBpZiAoYmVmb3JlQ2hpbGQpCi0gICAgICAgIGJlZm9yZUNo
aWxkUGFyZW50ID0gdG9SZW5kZXJCb3hNb2RlbE9iamVjdChiZWZvcmVDaGlsZC0+cGFyZW50KCkp
OwotICAgIGVsc2UgewotICAgICAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogY29udCA9IG5leHRD
b250aW51YXRpb24oZmxvdyk7Ci0gICAgICAgIGlmIChjb250KQotICAgICAgICAgICAgYmVmb3Jl
Q2hpbGRQYXJlbnQgPSBjb250OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBiZWZvcmVDaGls
ZFBhcmVudCA9IGZsb3c7Ci0gICAgfQotCi0gICAgaWYgKG5ld0NoaWxkLT5pc0Zsb2F0aW5nT3JQ
b3NpdGlvbmVkKCkpCi0gICAgICAgIHJldHVybiBiZWZvcmVDaGlsZFBhcmVudC0+YWRkQ2hpbGRJ
Z25vcmluZ0NvbnRpbnVhdGlvbihuZXdDaGlsZCwgYmVmb3JlQ2hpbGQpOwotCi0gICAgLy8gQSBj
b250aW51YXRpb24gYWx3YXlzIGNvbnNpc3RzIG9mIHR3byBwb3RlbnRpYWwgY2FuZGlkYXRlczog
YW4gaW5saW5lIG9yIGFuIGFub255bW91cwotICAgIC8vIGJsb2NrIGJveCBob2xkaW5nIGJsb2Nr
IGNoaWxkcmVuLgotICAgIGJvb2wgY2hpbGRJbmxpbmUgPSBuZXdDaGlsZC0+aXNJbmxpbmUoKTsK
LSAgICBib29sIGJjcElubGluZSA9IGJlZm9yZUNoaWxkUGFyZW50LT5pc0lubGluZSgpOwotICAg
IGJvb2wgZmxvd0lubGluZSA9IGZsb3ctPmlzSW5saW5lKCk7Ci0KLSAgICBpZiAoZmxvdyA9PSBi
ZWZvcmVDaGlsZFBhcmVudCkKLSAgICAgICAgcmV0dXJuIGZsb3ctPmFkZENoaWxkSWdub3JpbmdD
b250aW51YXRpb24obmV3Q2hpbGQsIGJlZm9yZUNoaWxkKTsKLSAgICBlbHNlIHsKLSAgICAgICAg
Ly8gVGhlIGdvYWwgaGVyZSBpcyB0byBtYXRjaCB1cCBpZiB3ZSBjYW4sIHNvIHRoYXQgd2UgY2Fu
IGNvYWxlc2NlIGFuZCBjcmVhdGUgdGhlCi0gICAgICAgIC8vIG1pbmltYWwgIyBvZiBjb250aW51
YXRpb25zIG5lZWRlZCBmb3IgdGhlIGlubGluZS4KLSAgICAgICAgaWYgKGNoaWxkSW5saW5lID09
IGJjcElubGluZSkKLSAgICAgICAgICAgIHJldHVybiBiZWZvcmVDaGlsZFBhcmVudC0+YWRkQ2hp
bGRJZ25vcmluZ0NvbnRpbnVhdGlvbihuZXdDaGlsZCwgYmVmb3JlQ2hpbGQpOwotICAgICAgICBl
bHNlIGlmIChmbG93SW5saW5lID09IGNoaWxkSW5saW5lKQotICAgICAgICAgICAgcmV0dXJuIGZs
b3ctPmFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24obmV3Q2hpbGQsIDApOyAvLyBKdXN0IHRy
ZWF0IGxpa2UgYW4gYXBwZW5kLgotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gYmVm
b3JlQ2hpbGRQYXJlbnQtPmFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24obmV3Q2hpbGQsIGJl
Zm9yZUNoaWxkKTsKLSAgICB9Ci19Ci0KIHZvaWQgUmVuZGVySW5saW5lOjpwYWludChQYWludElu
Zm8mIHBhaW50SW5mbywgaW50IHR4LCBpbnQgdHkpCiB7CiAgICAgbV9saW5lQm94ZXMucGFpbnQo
dGhpcywgcGFpbnRJbmZvLCB0eCwgdHkpOwogfQorIAordm9pZCBSZW5kZXJJbmxpbmU6OmN1bGxl
ZExpbmVCb3hSZWN0cyhWZWN0b3I8SW50UmVjdD4mIHJlY3RzLCBib29sIGluY2x1ZGVPdmVyZmxv
dykgY29uc3QKK3sKKyAgICBmb3IgKFJlbmRlck9iamVjdCogY3VyciA9IGZpcnN0Q2hpbGQoKTsg
Y3VycjsgY3VyciA9IGN1cnItPm5leHRTaWJsaW5nKCkpIHsKKyAgICAgICAgaWYgKGN1cnItPmlz
UmVuZGVySW5saW5lKCkpCisgICAgICAgICAgICB0b1JlbmRlcklubGluZShjdXJyKS0+Y3VsbGVk
TGluZUJveFJlY3RzKHJlY3RzLCBpbmNsdWRlT3ZlcmZsb3cpOworICAgICAgICBlbHNlIGlmIChj
dXJyLT5pc0Fub255bW91c0lubGluZUJsb2NrKCkpCisgICAgICAgICAgICByZWN0cy5hcHBlbmQo
aW5jbHVkZU92ZXJmbG93ID8gdG9SZW5kZXJCbG9jayhjdXJyKS0+dmlzaWJsZU92ZXJmbG93UmVj
dCgpIDogdG9SZW5kZXJCbG9jayhjdXJyKS0+ZnJhbWVSZWN0KCkpOworICAgIH0KK30KIAogdm9p
ZCBSZW5kZXJJbmxpbmU6OmFic29sdXRlUmVjdHMoVmVjdG9yPEludFJlY3Q+JiByZWN0cywgaW50
IHR4LCBpbnQgdHkpCiB7Ci0gICAgaWYgKElubGluZVJ1bkJveCogY3VyciA9IGZpcnN0TGluZUJv
eCgpKSB7Ci0gICAgICAgIGZvciAoOyBjdXJyOyBjdXJyID0gY3Vyci0+bmV4dExpbmVCb3goKSkK
LSAgICAgICAgICAgIHJlY3RzLmFwcGVuZChJbnRSZWN0KHR4ICsgY3Vyci0+eCgpLCB0eSArIGN1
cnItPnkoKSwgY3Vyci0+d2lkdGgoKSwgY3Vyci0+aGVpZ2h0KCkpKTsKLSAgICB9IGVsc2UKKyAg
ICBpZiAoIWZpcnN0TGluZUJveCgpICYmICFoYXNDdWxsZWRMaW5lQm94ZXMoKSkgewogICAgICAg
ICByZWN0cy5hcHBlbmQoSW50UmVjdCh0eCwgdHksIDAsIDApKTsKLQotICAgIGlmIChjb250aW51
YXRpb24oKSkgewotICAgICAgICBpZiAoY29udGludWF0aW9uKCktPmlzQm94KCkpIHsKLSAgICAg
ICAgICAgIFJlbmRlckJveCogYm94ID0gdG9SZW5kZXJCb3goY29udGludWF0aW9uKCkpOwotICAg
ICAgICAgICAgY29udGludWF0aW9uKCktPmFic29sdXRlUmVjdHMocmVjdHMsIAotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHggLSBjb250YWluaW5nQmxvY2soKS0+
eCgpICsgYm94LT54KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICB0eSAtIGNvbnRhaW5pbmdCbG9jaygpLT55KCkgKyBib3gtPnkoKSk7Ci0gICAgICAgIH0gZWxz
ZQotICAgICAgICAgICAgY29udGludWF0aW9uKCktPmFic29sdXRlUmVjdHMocmVjdHMsIHR4IC0g
Y29udGFpbmluZ0Jsb2NrKCktPngoKSwgdHkgLSBjb250YWluaW5nQmxvY2soKS0+eSgpKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICBmb3IgKElubGluZVJ1bkJveCogY3VyciA9
IGZpcnN0TGluZUJveCgpOyBjdXJyOyBjdXJyID0gY3Vyci0+bmV4dExpbmVCb3goKSkKKyAgICAg
ICAgcmVjdHMuYXBwZW5kKEludFJlY3QodHggKyBjdXJyLT54KCksIHR5ICsgY3Vyci0+eSgpLCBj
dXJyLT53aWR0aCgpLCBjdXJyLT5oZWlnaHQoKSkpOworICAgIAorICAgIGlmIChoYXNDdWxsZWRM
aW5lQm94ZXMoKSkgeworICAgICAgICBWZWN0b3I8SW50UmVjdD4gY3VsbGVkUmVjdHM7CisgICAg
ICAgIGN1bGxlZExpbmVCb3hSZWN0cyhjdWxsZWRSZWN0cyk7CisgICAgICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBjdWxsZWRSZWN0cy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgY3Vs
bGVkUmVjdHNbaV0ubW92ZSh0eCwgdHkpOworICAgICAgICAgICAgcmVjdHMuYXBwZW5kKGN1bGxl
ZFJlY3RzW2ldKTsKKyAgICAgICAgfQogICAgIH0KIH0KIAogdm9pZCBSZW5kZXJJbmxpbmU6OmFi
c29sdXRlUXVhZHMoVmVjdG9yPEZsb2F0UXVhZD4mIHF1YWRzKQogewotICAgIGlmIChJbmxpbmVS
dW5Cb3gqIGN1cnIgPSBmaXJzdExpbmVCb3goKSkgewotICAgICAgICBmb3IgKDsgY3VycjsgY3Vy
ciA9IGN1cnItPm5leHRMaW5lQm94KCkpIHsKLSAgICAgICAgICAgIEZsb2F0UmVjdCBsb2NhbFJl
Y3QoY3Vyci0+eCgpLCBjdXJyLT55KCksIGN1cnItPndpZHRoKCksIGN1cnItPmhlaWdodCgpKTsK
LSAgICAgICAgICAgIHF1YWRzLmFwcGVuZChsb2NhbFRvQWJzb2x1dGVRdWFkKGxvY2FsUmVjdCkp
OwotICAgICAgICB9Ci0gICAgfSBlbHNlCisgICAgaWYgKCFmaXJzdExpbmVCb3goKSAmJiAhaGFz
Q3VsbGVkTGluZUJveGVzKCkpIHsKICAgICAgICAgcXVhZHMuYXBwZW5kKGxvY2FsVG9BYnNvbHV0
ZVF1YWQoRmxvYXRSZWN0KCkpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAotICAgIGlmIChj
b250aW51YXRpb24oKSkKLSAgICAgICAgY29udGludWF0aW9uKCktPmFic29sdXRlUXVhZHMocXVh
ZHMpOworICAgIGZvciAoSW5saW5lUnVuQm94KiBjdXJyID0gZmlyc3RMaW5lQm94KCk7IGN1cnI7
IGN1cnIgPSBjdXJyLT5uZXh0TGluZUJveCgpKSB7CisgICAgICAgIEZsb2F0UmVjdCBsb2NhbFJl
Y3QoY3Vyci0+eCgpLCBjdXJyLT55KCksIGN1cnItPndpZHRoKCksIGN1cnItPmhlaWdodCgpKTsK
KyAgICAgICAgcXVhZHMuYXBwZW5kKGxvY2FsVG9BYnNvbHV0ZVF1YWQobG9jYWxSZWN0KSk7Cisg
ICAgfQorICAgIAorICAgIGlmIChoYXNDdWxsZWRMaW5lQm94ZXMoKSkgeworICAgICAgICBWZWN0
b3I8SW50UmVjdD4gY3VsbGVkUmVjdHM7CisgICAgICAgIGN1bGxlZExpbmVCb3hSZWN0cyhjdWxs
ZWRSZWN0cyk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBjdWxsZWRSZWN0cy5z
aXplKCk7ICsraSkKKyAgICAgICAgICAgIHF1YWRzLmFwcGVuZChsb2NhbFRvQWJzb2x1dGVRdWFk
KEZsb2F0UmVjdChjdWxsZWRSZWN0c1tpXSkpKTsKKyAgICB9CiB9CiAKIGludCBSZW5kZXJJbmxp
bmU6Om9mZnNldExlZnQoKSBjb25zdApAQCAtNTA3LDQzICszMDcsMzcgQEAgVmlzaWJsZVBvc2l0
aW9uIFJlbmRlcklubGluZTo6cG9zaXRpb25GbwogICAgICAgICAvLyBzaG91bGQgdHJ5IHRvIGZp
bmQgYSByZXN1bHQgYnkgYXNraW5nIG91ciBjb250YWluaW5nIGJsb2NrLgogICAgICAgICByZXR1
cm4gY2ItPnBvc2l0aW9uRm9yUG9pbnQocG9pbnQpOwogICAgIH0KKyAgICByZXR1cm4gUmVuZGVy
Qm94TW9kZWxPYmplY3Q6OnBvc2l0aW9uRm9yUG9pbnQocG9pbnQpOworfQogCi0gICAgLy8gVHJh
bnNsYXRlIHRoZSBjb29yZHMgZnJvbSB0aGUgcHJlLWFub255bW91cyBibG9jayB0byB0aGUgcG9z
dC1hbm9ueW1vdXMgYmxvY2suCi0gICAgaW50IHBhcmVudEJsb2NrWCA9IGNiLT54KCkgKyBwb2lu
dC54KCk7Ci0gICAgaW50IHBhcmVudEJsb2NrWSA9IGNiLT55KCkgKyBwb2ludC55KCk7Ci0gICAg
UmVuZGVyQm94TW9kZWxPYmplY3QqIGMgPSBjb250aW51YXRpb24oKTsKLSAgICB3aGlsZSAoYykg
ewotICAgICAgICBSZW5kZXJCb3gqIGNvbnRCbG9jayA9IGMtPmlzSW5saW5lKCkgPyBjLT5jb250
YWluaW5nQmxvY2soKSA6IHRvUmVuZGVyQmxvY2soYyk7Ci0gICAgICAgIGlmIChjLT5pc0lubGlu
ZSgpIHx8IGMtPmZpcnN0Q2hpbGQoKSkKLSAgICAgICAgICAgIHJldHVybiBjLT5wb3NpdGlvbkZv
ckNvb3JkaW5hdGVzKHBhcmVudEJsb2NrWCAtIGNvbnRCbG9jay0+eCgpLCBwYXJlbnRCbG9ja1kg
LSBjb250QmxvY2stPnkoKSk7Ci0gICAgICAgIGMgPSB0b1JlbmRlckJsb2NrKGMpLT5pbmxpbmVD
b250aW51YXRpb24oKTsKK3N0YXRpYyBpbmxpbmUgSW50UmVjdCB1bml0ZUV2ZW5JZkVtcHR5KGNv
bnN0IEludFJlY3QmIGZpcnN0LCBjb25zdCBJbnRSZWN0JiBzZWNvbmQsIGJvb2wmIGZpcnN0VmFs
aWQpCit7CisgICAgaWYgKCFmaXJzdFZhbGlkKSB7CisgICAgICAgIGZpcnN0VmFsaWQgPSB0cnVl
OworICAgICAgICByZXR1cm4gc2Vjb25kOwogICAgIH0KICAgICAKLSAgICByZXR1cm4gUmVuZGVy
Qm94TW9kZWxPYmplY3Q6OnBvc2l0aW9uRm9yUG9pbnQocG9pbnQpOworICAgIGludCBsID0gbWlu
KGZpcnN0LngoKSwgc2Vjb25kLngoKSk7CisgICAgaW50IHQgPSBtaW4oZmlyc3QueSgpLCBzZWNv
bmQueSgpKTsKKyAgICBpbnQgciA9IG1heChmaXJzdC5yaWdodCgpLCBzZWNvbmQucmlnaHQoKSk7
CisgICAgaW50IGIgPSBtYXgoZmlyc3QuYm90dG9tKCksIHNlY29uZC5ib3R0b20oKSk7CisKKyAg
ICByZXR1cm4gSW50UmVjdChsLCB0LCByIC0gbCwgYiAtIHQpOwogfQogCiBJbnRSZWN0IFJlbmRl
cklubGluZTo6bGluZXNCb3VuZGluZ0JveCgpIGNvbnN0CiB7CiAgICAgSW50UmVjdCByZXN1bHQ7
CisgICAgYm9vbCBzZXRSZXN1bHQgPSBmYWxzZTsKICAgICAKLSAgICAvLyBTZWUgPHJkYXI6Ly9w
cm9ibGVtLzUyODk3MjE+LCBmb3IgYW4gdW5rbm93biByZWFzb24gdGhlIGxpbmtlZCBsaXN0IGhl
cmUgaXMgc29tZXRpbWVzIGluY29uc2lzdGVudCwgZmlyc3QgaXMgbm9uLXplcm8gYW5kIGxhc3Qg
aXMgemVyby4gIFdlIGhhdmUgYmVlbgotICAgIC8vIHVuYWJsZSB0byByZXByb2R1Y2UgdGhpcyBh
dCBhbGwgKGFuZCBjb25zZXF1ZW50bHkgdW5hYmxlIHRvIGZpZ3VyZSBvdCB3aHkgdGhpcyBpcyBo
YXBwZW5pbmcpLiAgVGhlIGFzc2VydCB3aWxsIGhvcGVmdWxseSBjYXRjaCB0aGUgcHJvYmxlbSBp
biBkZWJ1ZwotICAgIC8vIGJ1aWxkcyBhbmQgaGVscCB1cyBzb21lZGF5IGZpZ3VyZSBvdXQgd2h5
LiAgV2UgYWxzbyBwdXQgaW4gYSByZWR1bmRhbnQgY2hlY2sgb2YgbGFzdExpbmVCb3goKSB0byBh
dm9pZCB0aGUgY3Jhc2ggZm9yIG5vdy4KLSAgICBBU1NFUlQoIWZpcnN0TGluZUJveCgpID09ICFs
YXN0TGluZUJveCgpKTsgIC8vIEVpdGhlciBib3RoIGFyZSBudWxsIG9yIGJvdGggZXhpc3QuCi0g
ICAgaWYgKGZpcnN0TGluZUJveCgpICYmIGxhc3RMaW5lQm94KCkpIHsKLSAgICAgICAgLy8gUmV0
dXJuIHRoZSB3aWR0aCBvZiB0aGUgbWluaW1hbCBsZWZ0IHNpZGUgYW5kIHRoZSBtYXhpbWFsIHJp
Z2h0IHNpZGUuCi0gICAgICAgIGludCBsZWZ0U2lkZSA9IDA7Ci0gICAgICAgIGludCByaWdodFNp
ZGUgPSAwOwotICAgICAgICBmb3IgKElubGluZVJ1bkJveCogY3VyciA9IGZpcnN0TGluZUJveCgp
OyBjdXJyOyBjdXJyID0gY3Vyci0+bmV4dExpbmVCb3goKSkgewotICAgICAgICAgICAgaWYgKGN1
cnIgPT0gZmlyc3RMaW5lQm94KCkgfHwgY3Vyci0+eCgpIDwgbGVmdFNpZGUpCi0gICAgICAgICAg
ICAgICAgbGVmdFNpZGUgPSBjdXJyLT54KCk7Ci0gICAgICAgICAgICBpZiAoY3VyciA9PSBmaXJz
dExpbmVCb3goKSB8fCBjdXJyLT54KCkgKyBjdXJyLT53aWR0aCgpID4gcmlnaHRTaWRlKQotICAg
ICAgICAgICAgICAgIHJpZ2h0U2lkZSA9IGN1cnItPngoKSArIGN1cnItPndpZHRoKCk7Ci0gICAg
ICAgIH0KLSAgICAgICAgcmVzdWx0LnNldFdpZHRoKHJpZ2h0U2lkZSAtIGxlZnRTaWRlKTsKLSAg
ICAgICAgcmVzdWx0LnNldFgobGVmdFNpZGUpOwotICAgICAgICByZXN1bHQuc2V0SGVpZ2h0KGxh
c3RMaW5lQm94KCktPnkoKSArIGxhc3RMaW5lQm94KCktPmhlaWdodCgpIC0gZmlyc3RMaW5lQm94
KCktPnkoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRZKGZpcnN0TGluZUJveCgpLT55KCkpOworICAg
IGZvciAoSW5saW5lRmxvd0JveCogY3VyciA9IGZpcnN0TGluZUJveCgpOyBjdXJyOyBjdXJyID0g
Y3Vyci0+bmV4dEZsb3dCb3goKSkKKyAgICAgICAgcmVzdWx0ID0gdW5pdGVFdmVuSWZFbXB0eShy
ZXN1bHQsIGN1cnItPmZyYW1lUmVjdCgpLCBzZXRSZXN1bHQpOworICAgICAgICAKKyAgICBpZiAo
aGFzQ3VsbGVkTGluZUJveGVzKCkpIHsKKyAgICAgICAgVmVjdG9yPEludFJlY3Q+IGN1bGxlZFJl
Y3RzOworICAgICAgICBjdWxsZWRMaW5lQm94UmVjdHMoY3VsbGVkUmVjdHMpOworICAgICAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgY3VsbGVkUmVjdHMuc2l6ZSgpOyArK2kpCisgICAgICAg
ICAgICByZXN1bHQgPSB1bml0ZUV2ZW5JZkVtcHR5KHJlc3VsdCwgY3VsbGVkUmVjdHNbaV0sIHNl
dFJlc3VsdCk7CiAgICAgfQogCiAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTU1MSwxOSArMzQ1LDIw
IEBAIEludFJlY3QgUmVuZGVySW5saW5lOjpsaW5lc0JvdW5kaW5nQm94KCkKIAogSW50UmVjdCBS
ZW5kZXJJbmxpbmU6OmxpbmVzVmlzaWJsZU92ZXJmbG93Qm91bmRpbmdCb3goKSBjb25zdAogewot
ICAgIGlmICghZmlyc3RMaW5lQm94KCkgfHwgIWxhc3RMaW5lQm94KCkpCi0gICAgICAgIHJldHVy
biBJbnRSZWN0KCk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIHdpZHRoIG9mIHRoZSBtaW5pbWFsIGxl
ZnQgc2lkZSBhbmQgdGhlIG1heGltYWwgcmlnaHQgc2lkZS4KLSAgICBpbnQgbGVmdFNpZGUgPSBu
dW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKTsKLSAgICBpbnQgcmlnaHRTaWRlID0gbnVtZXJpY19s
aW1pdHM8aW50Pjo6bWluKCk7Ci0gICAgZm9yIChJbmxpbmVGbG93Qm94KiBjdXJyID0gZmlyc3RM
aW5lQm94KCk7IGN1cnI7IGN1cnIgPSBjdXJyLT5uZXh0Rmxvd0JveCgpKSB7Ci0gICAgICAgIGxl
ZnRTaWRlID0gbWluKGxlZnRTaWRlLCBjdXJyLT5sZWZ0VmlzaWJsZU92ZXJmbG93KCkpOwotICAg
ICAgICByaWdodFNpZGUgPSBtYXgocmlnaHRTaWRlLCBjdXJyLT5yaWdodFZpc2libGVPdmVyZmxv
dygpKTsKKyAgICBJbnRSZWN0IHJlc3VsdDsKKyAgICBib29sIHNldFJlc3VsdCA9IGZhbHNlOwor
ICAgIAorICAgIGZvciAoSW5saW5lRmxvd0JveCogY3VyciA9IGZpcnN0TGluZUJveCgpOyBjdXJy
OyBjdXJyID0gY3Vyci0+bmV4dEZsb3dCb3goKSkKKyAgICAgICAgcmVzdWx0ID0gdW5pdGVFdmVu
SWZFbXB0eShyZXN1bHQsIGN1cnItPnZpc2libGVPdmVyZmxvd1JlY3QoKSwgc2V0UmVzdWx0KTsK
KyAgICAgICAgCisgICAgaWYgKGhhc0N1bGxlZExpbmVCb3hlcygpKSB7CisgICAgICAgIFZlY3Rv
cjxJbnRSZWN0PiBjdWxsZWRSZWN0czsKKyAgICAgICAgY3VsbGVkTGluZUJveFJlY3RzKGN1bGxl
ZFJlY3RzKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGN1bGxlZFJlY3RzLnNp
emUoKTsgKytpKQorICAgICAgICAgICAgcmVzdWx0ID0gdW5pdGVFdmVuSWZFbXB0eShyZXN1bHQs
IGN1bGxlZFJlY3RzW2ldLCBzZXRSZXN1bHQpOwogICAgIH0KIAotICAgIHJldHVybiBJbnRSZWN0
KGxlZnRTaWRlLCBmaXJzdExpbmVCb3goKS0+dG9wVmlzaWJsZU92ZXJmbG93KCksIHJpZ2h0U2lk
ZSAtIGxlZnRTaWRlLAotICAgICAgICBsYXN0TGluZUJveCgpLT5ib3R0b21WaXNpYmxlT3ZlcmZs
b3coKSAtIGZpcnN0TGluZUJveCgpLT50b3BWaXNpYmxlT3ZlcmZsb3coKSk7CisgICAgcmV0dXJu
IHJlc3VsdDsKIH0KIAogSW50UmVjdCBSZW5kZXJJbmxpbmU6OmNsaXBwZWRPdmVyZmxvd1JlY3RG
b3JSZXBhaW50KFJlbmRlckJveE1vZGVsT2JqZWN0KiByZXBhaW50Q29udGFpbmVyKQpAQCAtNTcx
LDcgKzM2Niw3IEBAIEludFJlY3QgUmVuZGVySW5saW5lOjpjbGlwcGVkT3ZlcmZsb3dSZWMKICAg
ICAvLyBPbmx5IHJ1bi1pbnMgYXJlIGFsbG93ZWQgaW4gaGVyZSBkdXJpbmcgbGF5b3V0LgogICAg
IEFTU0VSVCghdmlldygpIHx8ICF2aWV3KCktPmxheW91dFN0YXRlRW5hYmxlZCgpIHx8IGlzUnVu
SW4oKSk7CiAKLSAgICBpZiAoIWZpcnN0TGluZUJveCgpICYmICFjb250aW51YXRpb24oKSkKKyAg
ICBpZiAoIWZpcnN0TGluZUJveCgpKQogICAgICAgICByZXR1cm4gSW50UmVjdCgpOwogCiAgICAg
Ly8gRmluZCBvdXIgbGVmdG1vc3QgcG9zaXRpb24uCkBAIC02MTksMTEgKzQxNCw2IEBAIEludFJl
Y3QgUmVuZGVySW5saW5lOjpjbGlwcGVkT3ZlcmZsb3dSZWMKICAgICAgICAgICAgICAgICByLnVu
aXRlKGNoaWxkUmVjdCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQotICAgICAgICBpZiAo
Y29udGludWF0aW9uKCkgJiYgIWNvbnRpbnVhdGlvbigpLT5pc0lubGluZSgpKSB7Ci0gICAgICAg
ICAgICBJbnRSZWN0IGNvbnRSZWN0ID0gY29udGludWF0aW9uKCktPnJlY3RXaXRoT3V0bGluZUZv
clJlcGFpbnQocmVwYWludENvbnRhaW5lciwgb3cpOwotICAgICAgICAgICAgci51bml0ZShjb250
UmVjdCk7Ci0gICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gcjsKQEAgLTc5Niw0OSArNTg2
LDYgQEAgdm9pZCBSZW5kZXJJbmxpbmU6Om1hcEFic29sdXRlVG9Mb2NhbFBvaQogICAgICAgICB0
cmFuc2Zvcm1TdGF0ZS5tb3ZlKC1jb250YWluZXJPZmZzZXQud2lkdGgoKSwgLWNvbnRhaW5lck9m
ZnNldC5oZWlnaHQoKSwgcHJlc2VydmUzRCA/IFRyYW5zZm9ybVN0YXRlOjpBY2N1bXVsYXRlVHJh
bnNmb3JtIDogVHJhbnNmb3JtU3RhdGU6OkZsYXR0ZW5UcmFuc2Zvcm0pOwogfQogCi12b2lkIFJl
bmRlcklubGluZTo6dXBkYXRlRHJhZ1N0YXRlKGJvb2wgZHJhZ09uKQotewotICAgIFJlbmRlckJv
eE1vZGVsT2JqZWN0Ojp1cGRhdGVEcmFnU3RhdGUoZHJhZ09uKTsKLSAgICBpZiAoY29udGludWF0
aW9uKCkpCi0gICAgICAgIGNvbnRpbnVhdGlvbigpLT51cGRhdGVEcmFnU3RhdGUoZHJhZ09uKTsK
LX0KLQotdm9pZCBSZW5kZXJJbmxpbmU6OmNoaWxkQmVjYW1lTm9uSW5saW5lKFJlbmRlck9iamVj
dCogY2hpbGQpCi17Ci0gICAgLy8gV2UgaGF2ZSB0byBzcGxpdCB0aGUgcGFyZW50IGZsb3cuCi0g
ICAgUmVuZGVyQmxvY2sqIG5ld0JveCA9IGNvbnRhaW5pbmdCbG9jaygpLT5jcmVhdGVBbm9ueW1v
dXNCbG9jaygpOwotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBvbGRDb250aW51YXRpb24gPSBj
b250aW51YXRpb24oKTsKLSAgICBzZXRDb250aW51YXRpb24obmV3Qm94KTsKLSAgICBSZW5kZXJP
YmplY3QqIGJlZm9yZUNoaWxkID0gY2hpbGQtPm5leHRTaWJsaW5nKCk7Ci0gICAgY2hpbGRyZW4o
KS0+cmVtb3ZlQ2hpbGROb2RlKHRoaXMsIGNoaWxkKTsKLSAgICBzcGxpdEZsb3coYmVmb3JlQ2hp
bGQsIG5ld0JveCwgY2hpbGQsIG9sZENvbnRpbnVhdGlvbik7Ci19Ci0KLXZvaWQgUmVuZGVySW5s
aW5lOjp1cGRhdGVIaXRUZXN0UmVzdWx0KEhpdFRlc3RSZXN1bHQmIHJlc3VsdCwgY29uc3QgSW50
UG9pbnQmIHBvaW50KQotewotICAgIGlmIChyZXN1bHQuaW5uZXJOb2RlKCkpCi0gICAgICAgIHJl
dHVybjsKLQotICAgIE5vZGUqIG4gPSBub2RlKCk7Ci0gICAgSW50UG9pbnQgbG9jYWxQb2ludChw
b2ludCk7Ci0gICAgaWYgKG4pIHsKLSAgICAgICAgaWYgKGlzSW5saW5lQ29udGludWF0aW9uKCkp
IHsKLSAgICAgICAgICAgIC8vIFdlJ3JlIGluIHRoZSBjb250aW51YXRpb24gb2YgYSBzcGxpdCBp
bmxpbmUuICBBZGp1c3Qgb3VyIGxvY2FsIHBvaW50IHRvIGJlIGluIHRoZSBjb29yZGluYXRlIHNw
YWNlCi0gICAgICAgICAgICAvLyBvZiB0aGUgcHJpbmNpcGFsIHJlbmRlcmVyJ3MgY29udGFpbmlu
ZyBibG9jay4gIFRoaXMgd2lsbCBlbmQgdXAgYmVpbmcgdGhlIGlubmVyTm9uU2hhcmVkTm9kZS4K
LSAgICAgICAgICAgIFJlbmRlckJsb2NrKiBmaXJzdEJsb2NrID0gbi0+cmVuZGVyZXIoKS0+Y29u
dGFpbmluZ0Jsb2NrKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEdldCBvdXIgY29u
dGFpbmluZyBibG9jay4KLSAgICAgICAgICAgIFJlbmRlckJveCogYmxvY2sgPSBjb250YWluaW5n
QmxvY2soKTsKLSAgICAgICAgICAgIGxvY2FsUG9pbnQubW92ZShibG9jay0+eCgpIC0gZmlyc3RC
bG9jay0+eCgpLCBibG9jay0+eSgpIC0gZmlyc3RCbG9jay0+eSgpKTsKLSAgICAgICAgfQotCi0g
ICAgICAgIHJlc3VsdC5zZXRJbm5lck5vZGUobik7Ci0gICAgICAgIGlmICghcmVzdWx0LmlubmVy
Tm9uU2hhcmVkTm9kZSgpKQotICAgICAgICAgICAgcmVzdWx0LnNldElubmVyTm9uU2hhcmVkTm9k
ZShuKTsKLSAgICAgICAgcmVzdWx0LnNldExvY2FsUG9pbnQobG9jYWxQb2ludCk7Ci0gICAgfQot
fQotCiB2b2lkIFJlbmRlcklubGluZTo6ZGlydHlMaW5lQm94ZXMoYm9vbCBmdWxsTGF5b3V0KQog
ewogICAgIGlmIChmdWxsTGF5b3V0KQpAQCAtODUyLDkgKzU5OSw5IEBAIElubGluZUZsb3dCb3gq
IFJlbmRlcklubGluZTo6Y3JlYXRlSW5saW4KICAgICByZXR1cm4gbmV3IChyZW5kZXJBcmVuYSgp
KSBJbmxpbmVGbG93Qm94KHRoaXMpOwogfQogCi1JbmxpbmVGbG93Qm94KiBSZW5kZXJJbmxpbmU6
OmNyZWF0ZUFuZEFwcGVuZElubGluZUZsb3dCb3goKQorSW5saW5lRmxvd0JveCogUmVuZGVySW5s
aW5lOjpjcmVhdGVBbmRBcHBlbmRJbmxpbmVGbG93Qm94KFJlbmRlckJsb2NrKiBhbm9ueW1vdXNJ
bmxpbmVCbG9jaykKIHsKLSAgICBJbmxpbmVGbG93Qm94KiBmbG93Qm94ID0gY3JlYXRlSW5saW5l
Rmxvd0JveCgpOworICAgIElubGluZUZsb3dCb3gqIGZsb3dCb3ggPSBhbm9ueW1vdXNJbmxpbmVC
bG9jayA/IG5ldyAocmVuZGVyQXJlbmEoKSkgSW5saW5lRmxvd0Fub255bW91c0lubGluZUJsb2Nr
Qm94KHRoaXMpIDogY3JlYXRlSW5saW5lRmxvd0JveCgpOwogICAgIG1fbGluZUJveGVzLmFwcGVu
ZExpbmVCb3goZmxvd0JveCk7CiAgICAgcmV0dXJuIGZsb3dCb3g7CiB9CkBAIC05NTEsMjAgKzY5
OCw5IEBAIHZvaWQgUmVuZGVySW5saW5lOjphZGRGb2N1c1JpbmdSZWN0cyhWZWMKICAgICAgICAg
ICAgICAgICBwb3MgPSBjdXJyLT5sb2NhbFRvQWJzb2x1dGUoKTsKICAgICAgICAgICAgIGVsc2Ug
aWYgKGN1cnItPmlzQm94KCkpCiAgICAgICAgICAgICAgICAgcG9zLm1vdmUodG9SZW5kZXJCb3go
Y3VyciktPngoKSwgdG9SZW5kZXJCb3goY3VyciktPnkoKSk7Ci0gICAgICAgICAgIGN1cnItPmFk
ZEZvY3VzUmluZ1JlY3RzKHJlY3RzLCBwb3MueCgpLCBwb3MueSgpKTsKKyAgICAgICAgICAgIGN1
cnItPmFkZEZvY3VzUmluZ1JlY3RzKHJlY3RzLCBwb3MueCgpLCBwb3MueSgpKTsKICAgICAgICAg
fQogICAgIH0KLQotICAgIGlmIChjb250aW51YXRpb24oKSkgewotICAgICAgICBpZiAoY29udGlu
dWF0aW9uKCktPmlzSW5saW5lKCkpCi0gICAgICAgICAgICBjb250aW51YXRpb24oKS0+YWRkRm9j
dXNSaW5nUmVjdHMocmVjdHMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHR4IC0gY29udGFpbmluZ0Jsb2NrKCktPngoKSArIGNvbnRpbnVhdGlvbigpLT5j
b250YWluaW5nQmxvY2soKS0+eCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHR5IC0gY29udGFpbmluZ0Jsb2NrKCktPnkoKSArIGNvbnRpbnVhdGlvbigp
LT5jb250YWluaW5nQmxvY2soKS0+eSgpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgY29u
dGludWF0aW9uKCktPmFkZEZvY3VzUmluZ1JlY3RzKHJlY3RzLCAKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eCAtIGNvbnRhaW5pbmdCbG9jaygpLT54KCkg
KyB0b1JlbmRlckJveChjb250aW51YXRpb24oKSktPngoKSwKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB0eSAtIGNvbnRhaW5pbmdCbG9jaygpLT55KCkgKyB0
b1JlbmRlckJveChjb250aW51YXRpb24oKSktPnkoKSk7Ci0gICAgfQogfQogCiB2b2lkIFJlbmRl
cklubGluZTo6cGFpbnRPdXRsaW5lKEdyYXBoaWNzQ29udGV4dCogZ3JhcGhpY3NDb250ZXh0LCBp
bnQgdHgsIGludCB0eSkKQEAgLTk5Niw3ICs3MzIsOCBAQCB2b2lkIFJlbmRlcklubGluZTo6cGFp
bnRPdXRsaW5lKEdyYXBoaWNzCiAgICAgICAgIFJvb3RJbmxpbmVCb3gqIHJvb3QgPSBjdXJyLT5y
b290KCk7CiAgICAgICAgIGludCB0b3AgPSBtYXgocm9vdC0+bGluZVRvcCgpLCBjdXJyLT55KCkp
OwogICAgICAgICBpbnQgYm90dG9tID0gbWluKHJvb3QtPmxpbmVCb3R0b20oKSwgY3Vyci0+eSgp
ICsgY3Vyci0+aGVpZ2h0KCkpOwotICAgICAgICByZWN0cy5hcHBlbmQoSW50UmVjdChjdXJyLT54
KCksIHRvcCwgY3Vyci0+d2lkdGgoKSwgYm90dG9tIC0gdG9wKSk7CisgICAgICAgIGlmIChjdXJy
LT53aWR0aCgpICYmIHRvcCAtIGJvdHRvbSkKKyAgICAgICAgICAgIHJlY3RzLmFwcGVuZChJbnRS
ZWN0KGN1cnItPngoKSwgdG9wLCBjdXJyLT53aWR0aCgpLCBib3R0b20gLSB0b3ApKTsKICAgICB9
CiAgICAgcmVjdHMuYXBwZW5kKEludFJlY3QoKSk7CiAKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5n
L1JlbmRlcklubGluZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlcklu
bGluZS5oCShyZXZpc2lvbiA1NDc3NSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlcklubGlu
ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC00OSw3ICs0OSw3IEBAIHB1YmxpYzoKICAgICBJbnRSZWN0
IGxpbmVzQm91bmRpbmdCb3goKSBjb25zdDsKICAgICBJbnRSZWN0IGxpbmVzVmlzaWJsZU92ZXJm
bG93Qm91bmRpbmdCb3goKSBjb25zdDsKIAotICAgIElubGluZUZsb3dCb3gqIGNyZWF0ZUFuZEFw
cGVuZElubGluZUZsb3dCb3goKTsKKyAgICBJbmxpbmVGbG93Qm94KiBjcmVhdGVBbmRBcHBlbmRJ
bmxpbmVGbG93Qm94KFJlbmRlckJsb2NrKiBhbm9ueW1vdXNJbmxpbmVCbG9jayk7CiAKICAgICB2
b2lkIGRpcnR5TGluZUJveGVzKGJvb2wgZnVsbExheW91dCk7CiAKQEAgLTU4LDEwICs1OCw2IEBA
IHB1YmxpYzoKIAogICAgIElubGluZUZsb3dCb3gqIGZpcnN0TGluZUJveCgpIGNvbnN0IHsgcmV0
dXJuIG1fbGluZUJveGVzLmZpcnN0TGluZUJveCgpOyB9CiAgICAgSW5saW5lRmxvd0JveCogbGFz
dExpbmVCb3goKSBjb25zdCB7IHJldHVybiBtX2xpbmVCb3hlcy5sYXN0TGluZUJveCgpOyB9Ci0K
LSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogY29udGludWF0aW9uKCkgY29uc3QgeyByZXR1cm4g
bV9jb250aW51YXRpb247IH0KLQotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVEcmFnU3RhdGUoYm9v
bCBkcmFnT24pOwogICAgIAogICAgIEludFNpemUgcmVsYXRpdmVQb3NpdGlvbmVkSW5saW5lT2Zm
c2V0KGNvbnN0IFJlbmRlckJveCogY2hpbGQpIGNvbnN0OwogCkBAIC04MSw5ICs3Nyw2IEBAIHBy
aXZhdGU6CiAKICAgICB2aXJ0dWFsIGJvb2wgaXNSZW5kZXJJbmxpbmUoKSBjb25zdCB7IHJldHVy
biB0cnVlOyB9CiAKLSAgICB2b2lkIGFkZENoaWxkVG9Db250aW51YXRpb24oUmVuZGVyT2JqZWN0
KiBuZXdDaGlsZCwgUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCk7Ci0gICAgdmlydHVhbCB2b2lk
IGFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24oUmVuZGVyT2JqZWN0KiBuZXdDaGlsZCwgUmVu
ZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCA9IDApOwotCiAgICAgdm9pZCBzcGxpdElubGluZXMoUmVu
ZGVyQmxvY2sqIGZyb21CbG9jaywgUmVuZGVyQmxvY2sqIHRvQmxvY2ssIFJlbmRlckJsb2NrKiBt
aWRkbGVCbG9jaywKICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXJPYmplY3QqIGJlZm9yZUNo
aWxkLCBSZW5kZXJCb3hNb2RlbE9iamVjdCogb2xkQ29udCk7CiAgICAgdm9pZCBzcGxpdEZsb3co
UmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCwgUmVuZGVyQmxvY2sqIG5ld0Jsb2NrQm94LApAQCAt
MTI2LDEzICsxMTksOCBAQCBwcml2YXRlOgogCiAgICAgdmlydHVhbCBpbnQgbGluZUhlaWdodChi
b29sIGZpcnN0TGluZSwgYm9vbCBpc1Jvb3RMaW5lQm94ID0gZmFsc2UpIGNvbnN0OwogCi0gICAg
UmVuZGVySW5saW5lKiBpbmxpbmVDb250aW51YXRpb24oKSBjb25zdDsKLSAgICB2b2lkIHNldENv
bnRpbnVhdGlvbihSZW5kZXJCb3hNb2RlbE9iamVjdCogYykgeyBtX2NvbnRpbnVhdGlvbiA9IGM7
IH0KLSAgICAKICAgICB2aXJ0dWFsIHZvaWQgY2hpbGRCZWNhbWVOb25JbmxpbmUoUmVuZGVyT2Jq
ZWN0KiBjaGlsZCk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlSGl0VGVzdFJlc3VsdChIaXRU
ZXN0UmVzdWx0JiwgY29uc3QgSW50UG9pbnQmKTsKLQogICAgIHZpcnR1YWwgdm9pZCBpbWFnZUNo
YW5nZWQoV3JhcHBlZEltYWdlUHRyLCBjb25zdCBJbnRSZWN0KiA9IDApOwogCiAjaWYgRU5BQkxF
KERBU0hCT0FSRF9TVVBQT1JUKQpAQCAtMTQ1LDEzICsxMzMsMTIgQEAgcHJpdmF0ZToKICAgICBz
dGF0aWMgUmVuZGVySW5saW5lKiBjbG9uZUlubGluZShSZW5kZXJJbmxpbmUqIHNyYyk7CiAKICAg
ICB2b2lkIHBhaW50T3V0bGluZUZvckxpbmUoR3JhcGhpY3NDb250ZXh0KiwgaW50IHR4LCBpbnQg
dHksIGNvbnN0IEludFJlY3QmIHByZXZMaW5lLCBjb25zdCBJbnRSZWN0JiB0aGlzTGluZSwgY29u
c3QgSW50UmVjdCYgbmV4dExpbmUpOwotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBjb250aW51
YXRpb25CZWZvcmUoUmVuZGVyT2JqZWN0KiBiZWZvcmVDaGlsZCk7CisKKyAgICB2b2lkIGN1bGxl
ZExpbmVCb3hSZWN0cyhWZWN0b3I8SW50UmVjdD4mLCBib29sIGluY2x1ZGVPdmVyZmxvdyA9IGZh
bHNlKSBjb25zdDsKIAogICAgIFJlbmRlck9iamVjdENoaWxkTGlzdCBtX2NoaWxkcmVuOwogICAg
IFJlbmRlckxpbmVCb3hMaXN0IG1fbGluZUJveGVzOyAgIC8vIEFsbCBvZiB0aGUgbGluZSBib3hl
cyBjcmVhdGVkIGZvciB0aGlzIGlubGluZSBmbG93LiAgRm9yIGV4YW1wbGUsIDxpPkhlbGxvPGJy
PndvcmxkLjwvaT4gd2lsbCBoYXZlIHR3byA8aT4gbGluZSBib3hlcy4KIAotICAgIFJlbmRlckJv
eE1vZGVsT2JqZWN0KiBtX2NvbnRpbnVhdGlvbjsgLy8gQ2FuIGJlIGVpdGhlciBhIGJsb2NrIG9y
IGFuIGlubGluZS4gPGI+PGk+PHA+SGVsbG88L3A+PC9pPjwvYj4uIEluIHRoaXMgZXhhbXBsZSB0
aGUgPGk+IHdpbGwgaGF2ZSBhIGJsb2NrIGFzIGl0cyBjb250aW51YXRpb24gYnV0IHRoZQotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPGI+IHdpbGwganVzdCBo
YXZlIGFuIGlubGluZSBhcyBpdHMgY29udGludWF0aW9uLgogICAgIG11dGFibGUgaW50IG1fbGlu
ZUhlaWdodDsKICAgICBtdXRhYmxlIGludCBtX3ZlcnRpY2FsUG9zaXRpb247CiB9OwpJbmRleDog
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGluZUJveExpc3QuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvcmVuZGVyaW5nL1JlbmRlckxpbmVCb3hMaXN0LmNwcAkocmV2aXNpb24gNTQ3NzUpCisr
KyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMaW5lQm94TGlzdC5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTE0NiwxMiArMTQ2LDYgQEAgdm9pZCBSZW5kZXJMaW5lQm94TGlzdDo6ZGlydHlMaW5lQm94
ZXMoKQogCiB2b2lkIFJlbmRlckxpbmVCb3hMaXN0OjpwYWludChSZW5kZXJCb3hNb2RlbE9iamVj
dCogcmVuZGVyZXIsIFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGludCB0eCwg
aW50IHR5KSBjb25zdAogewotICAgIC8vIE9ubHkgcGFpbnQgZHVyaW5nIHRoZSBmb3JlZ3JvdW5k
L3NlbGVjdGlvbiBwaGFzZXMuCi0gICAgaWYgKHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNl
Rm9yZWdyb3VuZCAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZVNlbGVjdGlvbiAmJiBw
YWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZU91dGxpbmUgCi0gICAgICAgICYmIHBhaW50SW5m
by5waGFzZSAhPSBQYWludFBoYXNlU2VsZk91dGxpbmUgJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBh
aW50UGhhc2VDaGlsZE91dGxpbmVzICYmIHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlVGV4
dENsaXAKLSAgICAgICAgJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VNYXNrKQotICAg
ICAgICByZXR1cm47Ci0KICAgICBBU1NFUlQocmVuZGVyZXItPmlzUmVuZGVyQmxvY2soKSB8fCAo
cmVuZGVyZXItPmlzUmVuZGVySW5saW5lKCkgJiYgcmVuZGVyZXItPmhhc0xheWVyKCkpKTsgLy8g
VGhlIG9ubHkgd2F5IGFuIGlubGluZSBjb3VsZCBwYWludCBsaWtlIHRoaXMgaXMgaWYgaXQgaGFz
IGEgbGF5ZXIuCiAKICAgICAvLyBJZiB3ZSBoYXZlIG5vIGxpbmVzIHRoZW4gd2UgaGF2ZSBubyB3
b3JrIHRvIGRvLgpAQCAtMTk1LDEzICsxODksMTcgQEAgdm9pZCBSZW5kZXJMaW5lQm94TGlzdDo6
cGFpbnQoUmVuZGVyQm94TQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaW50
IHRvcCA9IG1pbihjdXJyLT50b3BWaXNpYmxlT3ZlcmZsb3coKSwgY3Vyci0+cm9vdCgpLT5zZWxl
Y3Rpb25Ub3AoKSkgLSByZW5kZXJlci0+bWF4aW1hbE91dGxpbmVTaXplKGluZm8ucGhhc2UpOwor
ICAgICAgICBSb290SW5saW5lQm94KiByb290Qm94ID0gY3Vyci0+cm9vdCgpOworICAgICAgICBp
bnQgdG9wID0gbWluKGN1cnItPnRvcFZpc2libGVPdmVyZmxvdygpLCByb290Qm94LT5zZWxlY3Rp
b25Ub3AoKSkgLSByZW5kZXJlci0+bWF4aW1hbE91dGxpbmVTaXplKGluZm8ucGhhc2UpOwogICAg
ICAgICBpbnQgYm90dG9tID0gY3Vyci0+Ym90dG9tVmlzaWJsZU92ZXJmbG93KCkgKyByZW5kZXJl
ci0+bWF4aW1hbE91dGxpbmVTaXplKGluZm8ucGhhc2UpOwogICAgICAgICBoID0gYm90dG9tIC0g
dG9wOwogICAgICAgICB5UG9zID0gdHkgKyB0b3A7CiAgICAgICAgIHYtPnNldE1pbmltdW1Db2x1
bW5IZWlnaHQoaCk7Ci0gICAgICAgIGlmICh5UG9zIDwgaW5mby5yZWN0LmJvdHRvbSgpICYmIHlQ
b3MgKyBoID4gaW5mby5yZWN0LnkoKSkKLSAgICAgICAgICAgIGN1cnItPnBhaW50KGluZm8sIHR4
LCB0eSk7CisgICAgICAgIGlmICh5UG9zIDwgaW5mby5yZWN0LmJvdHRvbSgpICYmIHlQb3MgKyBo
ID4gaW5mby5yZWN0LnkoKSkgeworICAgICAgICAgICAgTGluZUJveFBhaW50SW5mbyBsaW5lQm94
UGFpbnRJbmZvOworICAgICAgICAgICAgbGluZUJveFBhaW50SW5mby5hbm9ueW1vdXNJbmxpbmVC
bG9jayA9IHJvb3RCb3gtPmFub255bW91c0lubGluZUJsb2NrKCk7CisgICAgICAgICAgICBjdXJy
LT5wYWludChpbmZvLCB0eCwgdHksIGxpbmVCb3hQYWludEluZm8pOworICAgICAgICB9CiAgICAg
fQogCiAgICAgaWYgKGluZm8ucGhhc2UgPT0gUGFpbnRQaGFzZU91dGxpbmUgfHwgaW5mby5waGFz
ZSA9PSBQYWludFBoYXNlU2VsZk91dGxpbmUgfHwgaW5mby5waGFzZSA9PSBQYWludFBoYXNlQ2hp
bGRPdXRsaW5lcykgewpAQCAtMjE3LDkgKzIxNSw2IEBAIHZvaWQgUmVuZGVyTGluZUJveExpc3Q6
OnBhaW50KFJlbmRlckJveE0KIAogYm9vbCBSZW5kZXJMaW5lQm94TGlzdDo6aGl0VGVzdChSZW5k
ZXJCb3hNb2RlbE9iamVjdCogcmVuZGVyZXIsIGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiByZXF1ZXN0
LCBIaXRUZXN0UmVzdWx0JiByZXN1bHQsIGludCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHksIEhp
dFRlc3RBY3Rpb24gaGl0VGVzdEFjdGlvbikgY29uc3QKIHsKLSAgICBpZiAoaGl0VGVzdEFjdGlv
biAhPSBIaXRUZXN0Rm9yZWdyb3VuZCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCiAgICAgQVNT
RVJUKHJlbmRlcmVyLT5pc1JlbmRlckJsb2NrKCkgfHwgKHJlbmRlcmVyLT5pc1JlbmRlcklubGlu
ZSgpICYmIHJlbmRlcmVyLT5oYXNMYXllcigpKSk7IC8vIFRoZSBvbmx5IHdheSBhbiBpbmxpbmUg
Y291bGQgaGl0IHRlc3QgbGlrZSB0aGlzIGlzIGlmIGl0IGhhcyBhIGxheWVyLgogCiAgICAgLy8g
SWYgd2UgaGF2ZSBubyBsaW5lcyB0aGVuIHdlIGhhdmUgbm8gd29yayB0byBkby4KQEAgLTIzMCwy
MiArMjI1LDM1IEBAIGJvb2wgUmVuZGVyTGluZUJveExpc3Q6OmhpdFRlc3QoUmVuZGVyQm8KICAg
ICAvLyBjb250YWluIHRoZSBwb2ludC4gIFRoaXMgaXMgYSBxdWljayBzaG9ydC1jaXJjdWl0IHRo
YXQgd2UgY2FuIHRha2UgdG8gYXZvaWQgd2Fsa2luZyBhbnkgbGluZXMuCiAgICAgLy8gRklYTUU6
IFRoaXMgY2hlY2sgaXMgZmxhd2VkIGluIHRoZSBmb2xsb3dpbmcgZXh0cmVtZWx5IG9ic2N1cmUg
d2F5OgogICAgIC8vIGlmIHNvbWUgbGluZSBpbiB0aGUgbWlkZGxlIGhhcyBhIGh1Z2Ugb3ZlcmZs
b3csIGl0IG1pZ2h0IGFjdHVhbGx5IGV4dGVuZCBiZWxvdyB0aGUgbGFzdCBsaW5lLgotICAgIGlm
ICgoeSA+PSB0eSArIGxhc3RMaW5lQm94KCktPnJvb3QoKS0+Ym90dG9tVmlzaWJsZU92ZXJmbG93
KCkpIHx8ICh5IDwgdHkgKyBmaXJzdExpbmVCb3goKS0+cm9vdCgpLT50b3BWaXNpYmxlT3ZlcmZs
b3coKSkpCisgICAgUm9vdElubGluZUJveCogZmlyc3RSb290ID0gZmlyc3RMaW5lQm94KCktPnJv
b3QoKTsKKyAgICBSb290SW5saW5lQm94KiBsYXN0Um9vdCA9IGxhc3RMaW5lQm94KCktPnJvb3Qo
KTsKKyAgICBpbnQgdG9wID0gZmlyc3RSb290LT50b3BWaXNpYmxlT3ZlcmZsb3coKTsKKyAgICBp
bnQgYm90dG9tID0gbGFzdFJvb3QtPmJvdHRvbVZpc2libGVPdmVyZmxvdygpOworICAgIGlmIChs
YXN0Um9vdC0+aGFzQW5vbnltb3VzSW5saW5lQmxvY2soKSkKKyAgICAgICAgYm90dG9tID0gbWF4
KGJvdHRvbSwgYm90dG9tICsgbGFzdFJvb3QtPmFub255bW91c0lubGluZUJsb2NrKCktPmNvbGxh
cHNlZE1hcmdpbkJvdHRvbSgpKTsKKyAgICBpZiAoZmlyc3RSb290LT5oYXNBbm9ueW1vdXNJbmxp
bmVCbG9jaygpKQorICAgICAgICB0b3AgPSBtaW4odG9wLCB0b3AgKyBmaXJzdFJvb3QtPmFub255
bW91c0lubGluZUJsb2NrKCktPmNvbGxhcHNlZE1hcmdpblRvcCgpKTsKKyAgICBpZiAoKHkgPj0g
dHkgKyBib3R0b20pIHx8ICh5IDwgdHkgKyB0b3ApKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAK
ICAgICAvLyBTZWUgaWYgb3VyIHJvb3QgbGluZXMgY29udGFpbiB0aGUgcG9pbnQuICBJZiBzbywg
dGhlbiB3ZSBoaXQgdGVzdAogICAgIC8vIHRoZW0gZnVydGhlci4gIE5vdGUgdGhhdCBib3hlcyBj
YW4gZWFzaWx5IG92ZXJsYXAsIHNvIHdlIGNhbid0IG1ha2UgYW55IGFzc3VtcHRpb25zCiAgICAg
Ly8gYmFzZWQgb2ZmIHBvc2l0aW9ucyBvZiBvdXIgZmlyc3QgbGluZSBib3ggb3Igb3VyIGxhc3Qg
bGluZSBib3guCiAgICAgZm9yIChJbmxpbmVGbG93Qm94KiBjdXJyID0gbGFzdExpbmVCb3goKTsg
Y3VycjsgY3VyciA9IGN1cnItPnByZXZGbG93Qm94KCkpIHsKLSAgICAgICAgaWYgKHkgPj0gdHkg
KyBjdXJyLT5yb290KCktPnRvcFZpc2libGVPdmVyZmxvdygpICYmIHkgPCB0eSArIGN1cnItPnJv
b3QoKS0+Ym90dG9tVmlzaWJsZU92ZXJmbG93KCkpIHsKLSAgICAgICAgICAgIGJvb2wgaW5zaWRl
ID0gY3Vyci0+bm9kZUF0UG9pbnQocmVxdWVzdCwgcmVzdWx0LCB4LCB5LCB0eCwgdHkpOworICAg
ICAgICBSb290SW5saW5lQm94KiBjdXJyUm9vdCA9IGN1cnItPnJvb3QoKTsKKyAgICAgICAgaW50
IHRvcCA9IGN1cnJSb290LT50b3BWaXNpYmxlT3ZlcmZsb3coKTsKKyAgICAgICAgaW50IGJvdHRv
bSA9IGN1cnJSb290LT5ib3R0b21WaXNpYmxlT3ZlcmZsb3coKTsKKyAgICAgICAgaWYgKHkgPj0g
dHkgKyB0b3AgJiYgeSA8IHR5ICsgYm90dG9tKSB7CisgICAgICAgICAgICBMaW5lQm94SGl0VGVz
dEluZm8gaGl0VGVzdEluZm87CisgICAgICAgICAgICBoaXRUZXN0SW5mby5hbm9ueW1vdXNJbmxp
bmVCbG9jayA9IGN1cnJSb290LT5hbm9ueW1vdXNJbmxpbmVCbG9jaygpOworICAgICAgICAgICAg
Ym9vbCBpbnNpZGUgPSBjdXJyLT5ub2RlQXRQb2ludChyZXF1ZXN0LCByZXN1bHQsIHgsIHksIHR4
LCB0eSwgaGl0VGVzdEFjdGlvbiwgaGl0VGVzdEluZm8pOwogICAgICAgICAgICAgaWYgKGluc2lk
ZSkgewogICAgICAgICAgICAgICAgIHJlbmRlcmVyLT51cGRhdGVIaXRUZXN0UmVzdWx0KHJlc3Vs
dCwgSW50UG9pbnQoeCAtIHR4LCB5IC0gdHkpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1
ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHJldHVybiBm
YWxzZTsKIH0KIApAQCAtMjk3LDYgKzMwNSwxMCBAQCB2b2lkIFJlbmRlckxpbmVCb3hMaXN0Ojpk
aXJ0eUxpbmVzRnJvbUNoCiAgICAgICAgIFJvb3RJbmxpbmVCb3gqIGFkamFjZW50Qm94OwogICAg
ICAgICBib3gtPm1hcmtEaXJ0eSgpOwogCisgICAgICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gZGly
dHkgYW55IG90aGVyIGxpbmVzLgorICAgICAgICBpZiAoYm94LT5oYXNBbm9ueW1vdXNJbmxpbmVC
bG9jaygpKQorICAgICAgICAgICAgcmV0dXJuOworCiAgICAgICAgIC8vIGRpcnR5IHRoZSBhZGph
Y2VudCBsaW5lcyB0aGF0IG1pZ2h0IGJlIGFmZmVjdGVkCiAgICAgICAgIC8vIE5PVEU6IHdlIGRp
cnR5IHRoZSBwcmV2aW91cyBsaW5lIGJlY2F1c2UgUm9vdElubGluZUJveCBvYmplY3RzIGNhY2hl
CiAgICAgICAgIC8vIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBvYmplY3Qgb24gdGhlIG5leHQg
bGluZSBhZnRlciBhIEJSLCB3aGljaCB3ZSBtYXkgYmUKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5n
L1JlbmRlckxpc3RJdGVtLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5k
ZXJMaXN0SXRlbS5jcHAJKHJldmlzaW9uIDU0Nzc1KQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUmVu
ZGVyTGlzdEl0ZW0uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNyw2ICsyNyw4IEBACiAjaW5jbHVk
ZSAiQ2FjaGVkSW1hZ2UuaCIKICNpbmNsdWRlICJIVE1MTmFtZXMuaCIKICNpbmNsdWRlICJIVE1M
T0xpc3RFbGVtZW50LmgiCisjaW5jbHVkZSAiSW5saW5lSXRlcmF0b3IuaCIKKwogI2luY2x1ZGUg
IlJlbmRlckxpc3RNYXJrZXIuaCIKICNpbmNsdWRlICJSZW5kZXJWaWV3LmgiCiAjaW5jbHVkZSA8
d3RmL1N0ZExpYkV4dHJhcy5oPgpAQCAtMTUzLDE4ICsxNTUsNDQgQEAgYm9vbCBSZW5kZXJMaXN0
SXRlbTo6aXNFbXB0eSgpIGNvbnN0CiAgICAgcmV0dXJuIGxhc3RDaGlsZCgpID09IG1fbWFya2Vy
OwogfQogCi1zdGF0aWMgUmVuZGVyT2JqZWN0KiBnZXRQYXJlbnRPZkZpcnN0TGluZUJveChSZW5k
ZXJCbG9jayogY3VyciwgUmVuZGVyT2JqZWN0KiBtYXJrZXIpCit2b2lkIFJlbmRlckxpc3RJdGVt
Ojp1cGRhdGVWYWx1ZSgpCiB7Ci0gICAgUmVuZGVyT2JqZWN0KiBmaXJzdENoaWxkID0gY3Vyci0+
Zmlyc3RDaGlsZCgpOwotICAgIGlmICghZmlyc3RDaGlsZCkKLSAgICAgICAgcmV0dXJuIDA7Cisg
ICAgaWYgKCFtX2hhc0V4cGxpY2l0VmFsdWUpIHsKKyAgICAgICAgbV9pc1ZhbHVlVXBUb0RhdGUg
PSBmYWxzZTsKKyAgICAgICAgaWYgKG1fbWFya2VyKQorICAgICAgICAgICAgbV9tYXJrZXItPnNl
dE5lZWRzTGF5b3V0QW5kUHJlZldpZHRoc1JlY2FsYygpOworICAgIH0KK30KIAotICAgIGZvciAo
UmVuZGVyT2JqZWN0KiBjdXJyQ2hpbGQgPSBmaXJzdENoaWxkOyBjdXJyQ2hpbGQ7IGN1cnJDaGls
ZCA9IGN1cnJDaGlsZC0+bmV4dFNpYmxpbmcoKSkgeworc3RhdGljIFJlbmRlck9iamVjdCogZmly
c3ROb25NYXJrZXJDaGlsZChSZW5kZXJPYmplY3QqIHBhcmVudCkKK3sKKyAgICBSZW5kZXJPYmpl
Y3QqIHJlc3VsdCA9IHBhcmVudC0+Zmlyc3RDaGlsZCgpOworICAgIHdoaWxlIChyZXN1bHQgJiYg
cmVzdWx0LT5pc0xpc3RNYXJrZXIoKSkKKyAgICAgICAgcmVzdWx0ID0gcmVzdWx0LT5uZXh0U2li
bGluZygpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIFJlbmRlckJsb2NrKiBs
aXN0TWFya2VyTG9jYXRpb24oUmVuZGVyQmxvY2sqIGJsb2NrLCBSZW5kZXJMaXN0TWFya2VyKiBt
YXJrZXIpCit7CisgICAgZm9yIChSZW5kZXJPYmplY3QqIGN1cnJDaGlsZCA9IGJsb2NrLT5maXJz
dENoaWxkKCk7IGN1cnJDaGlsZDsgY3VyckNoaWxkID0gY3VyckNoaWxkLT5uZXh0U2libGluZygp
KSB7CiAgICAgICAgIGlmIChjdXJyQ2hpbGQgPT0gbWFya2VyKQogICAgICAgICAgICAgY29udGlu
dWU7CiAKLSAgICAgICAgaWYgKGN1cnJDaGlsZC0+aXNJbmxpbmUoKSAmJiAoIWN1cnJDaGlsZC0+
aXNSZW5kZXJJbmxpbmUoKSB8fCBjdXJyLT5nZW5lcmF0ZXNMaW5lQm94ZXNGb3JJbmxpbmVDaGls
ZChjdXJyQ2hpbGQpKSkKLSAgICAgICAgICAgIHJldHVybiBjdXJyOworICAgICAgICBpZiAoY3Vy
ckNoaWxkLT5pc0lubGluZSgpKSB7CisgICAgICAgICAgICBpZiAoIWN1cnJDaGlsZC0+aXNSZW5k
ZXJJbmxpbmUoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gYmxvY2s7CisgICAgICAgICAgICBJ
bmxpbmVJdGVyYXRvciBpdChibG9jaywgY3VyckNoaWxkLCAwKTsKKyAgICAgICAgICAgIHdoaWxl
ICghaXQuYXRFbmQoKSkgeworICAgICAgICAgICAgICAgIGlmIChpdC5vYmotPmlzQW5vbnltb3Vz
SW5saW5lQmxvY2soKSkgeworICAgICAgICAgICAgICAgICAgICBSZW5kZXJCbG9jayogbGluZUJv
eFBhcmVudCA9IGxpc3RNYXJrZXJMb2NhdGlvbih0b1JlbmRlckJsb2NrKGl0Lm9iaiksIG1hcmtl
cik7CisgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lQm94UGFyZW50KQorICAgICAgICAgICAg
ICAgICAgICAgICAgcmV0dXJuIGxpbmVCb3hQYXJlbnQ7CisgICAgICAgICAgICAgICAgfSBlbHNl
IGlmIChSZW5kZXJCbG9jazo6cmVxdWlyZXNMaW5lQm94KGl0KSkKKyAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuIGJsb2NrOworICAgICAgICAgICAgICAgIGl0LmluY3JlbWVudCgpOworICAgICAg
ICAgICAgfQorICAgICAgICB9CiAKICAgICAgICAgaWYgKGN1cnJDaGlsZC0+aXNGbG9hdGluZygp
IHx8IGN1cnJDaGlsZC0+aXNQb3NpdGlvbmVkKCkpCiAgICAgICAgICAgICBjb250aW51ZTsKQEAg
LTE3Miw0MSArMjAwLDI0IEBAIHN0YXRpYyBSZW5kZXJPYmplY3QqIGdldFBhcmVudE9mRmlyc3RM
aW4KICAgICAgICAgaWYgKGN1cnJDaGlsZC0+aXNUYWJsZSgpIHx8ICFjdXJyQ2hpbGQtPmlzUmVu
ZGVyQmxvY2soKSkKICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGlmIChjdXJyLT5pc0xp
c3RJdGVtKCkgJiYgY3VyckNoaWxkLT5zdHlsZSgpLT5odG1sSGFja3MoKSAmJiBjdXJyQ2hpbGQt
Pm5vZGUoKSAmJgotICAgICAgICAgICAgKGN1cnJDaGlsZC0+bm9kZSgpLT5oYXNUYWdOYW1lKHVs
VGFnKXx8IGN1cnJDaGlsZC0+bm9kZSgpLT5oYXNUYWdOYW1lKG9sVGFnKSkpCisgICAgICAgIGlm
IChibG9jay0+aXNMaXN0SXRlbSgpICYmIGN1cnJDaGlsZC0+c3R5bGUoKS0+aHRtbEhhY2tzKCkg
JiYgY3VyckNoaWxkLT5ub2RlKCkgJiYKKyAgICAgICAgICAgIChjdXJyQ2hpbGQtPm5vZGUoKS0+
aGFzVGFnTmFtZSh1bFRhZykgfHwgY3VyckNoaWxkLT5ub2RlKCktPmhhc1RhZ05hbWUob2xUYWcp
KSkKICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIFJlbmRlck9iamVjdCogbGluZUJveCA9
IGdldFBhcmVudE9mRmlyc3RMaW5lQm94KHRvUmVuZGVyQmxvY2soY3VyckNoaWxkKSwgbWFya2Vy
KTsKLSAgICAgICAgaWYgKGxpbmVCb3gpCi0gICAgICAgICAgICByZXR1cm4gbGluZUJveDsKKyAg
ICAgICAgUmVuZGVyQmxvY2sqIGxpbmVCb3hQYXJlbnQgPSBsaXN0TWFya2VyTG9jYXRpb24odG9S
ZW5kZXJCbG9jayhjdXJyQ2hpbGQpLCBtYXJrZXIpOworICAgICAgICBpZiAobGluZUJveFBhcmVu
dCkKKyAgICAgICAgICAgIHJldHVybiBsaW5lQm94UGFyZW50OwogICAgIH0KIAogICAgIHJldHVy
biAwOwogfQogCi12b2lkIFJlbmRlckxpc3RJdGVtOjp1cGRhdGVWYWx1ZSgpCi17Ci0gICAgaWYg
KCFtX2hhc0V4cGxpY2l0VmFsdWUpIHsKLSAgICAgICAgbV9pc1ZhbHVlVXBUb0RhdGUgPSBmYWxz
ZTsKLSAgICAgICAgaWYgKG1fbWFya2VyKQotICAgICAgICAgICAgbV9tYXJrZXItPnNldE5lZWRz
TGF5b3V0QW5kUHJlZldpZHRoc1JlY2FsYygpOwotICAgIH0KLX0KLQotc3RhdGljIFJlbmRlck9i
amVjdCogZmlyc3ROb25NYXJrZXJDaGlsZChSZW5kZXJPYmplY3QqIHBhcmVudCkKLXsKLSAgICBS
ZW5kZXJPYmplY3QqIHJlc3VsdCA9IHBhcmVudC0+Zmlyc3RDaGlsZCgpOwotICAgIHdoaWxlIChy
ZXN1bHQgJiYgcmVzdWx0LT5pc0xpc3RNYXJrZXIoKSkKLSAgICAgICAgcmVzdWx0ID0gcmVzdWx0
LT5uZXh0U2libGluZygpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KIHZvaWQgUmVuZGVyTGlz
dEl0ZW06OnVwZGF0ZU1hcmtlckxvY2F0aW9uKCkKIHsKICAgICAvLyBTYW5pdHkgY2hlY2sgdGhl
IGxvY2F0aW9uIG9mIG91ciBtYXJrZXIuCiAgICAgaWYgKG1fbWFya2VyKSB7CiAgICAgICAgIFJl
bmRlck9iamVjdCogbWFya2VyUGFyID0gbV9tYXJrZXItPnBhcmVudCgpOwotICAgICAgICBSZW5k
ZXJPYmplY3QqIGxpbmVCb3hQYXJlbnQgPSBnZXRQYXJlbnRPZkZpcnN0TGluZUJveCh0aGlzLCBt
X21hcmtlcik7CisgICAgICAgIFJlbmRlck9iamVjdCogbGluZUJveFBhcmVudCA9IGxpc3RNYXJr
ZXJMb2NhdGlvbih0aGlzLCBtX21hcmtlcik7CiAgICAgICAgIGlmICghbGluZUJveFBhcmVudCkg
ewogICAgICAgICAgICAgLy8gSWYgdGhlIG1hcmtlciBpcyBjdXJyZW50bHkgY29udGFpbmVkIGlu
c2lkZSBhbiBhbm9ueW1vdXMgYm94LAogICAgICAgICAgICAgLy8gdGhlbiB3ZSBhcmUgdGhlIG9u
bHkgaXRlbSBpbiB0aGF0IGFub255bW91cyBib3ggKHNpbmNlIG5vIGxpbmUgYm94CkBAIC0yNTcs
OSArMjY4LDExIEBAIHZvaWQgUmVuZGVyTGlzdEl0ZW06OnBvc2l0aW9uTGlzdE1hcmtlcigKICAg
ICAgICAgaW50IG1hcmtlck9sZFggPSBtX21hcmtlci0+eCgpOwogICAgICAgICBpbnQgeU9mZnNl
dCA9IDA7CiAgICAgICAgIGludCB4T2Zmc2V0ID0gMDsKLSAgICAgICAgZm9yIChSZW5kZXJCb3gq
IG8gPSBtX21hcmtlci0+cGFyZW50Qm94KCk7IG8gIT0gdGhpczsgbyA9IG8tPnBhcmVudEJveCgp
KSB7Ci0gICAgICAgICAgICB5T2Zmc2V0ICs9IG8tPnkoKTsKLSAgICAgICAgICAgIHhPZmZzZXQg
Kz0gby0+eCgpOworICAgICAgICBmb3IgKFJlbmRlck9iamVjdCogbyA9IG1fbWFya2VyLT5wYXJl
bnQoKTsgbyAhPSB0aGlzOyBvID0gby0+cGFyZW50KCkpIHsKKyAgICAgICAgICAgIGlmIChvLT5p
c0JveCgpKSB7CisgICAgICAgICAgICAgICAgeU9mZnNldCArPSB0b1JlbmRlckJveChvKS0+eSgp
OworICAgICAgICAgICAgICAgIHhPZmZzZXQgKz0gdG9SZW5kZXJCb3gobyktPngoKTsKKyAgICAg
ICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGJvb2wgYWRqdXN0T3ZlcmZsb3cgPSBmYWxz
ZTsKQEAgLTI5NSwxMyArMzA4LDE0IEBAIHZvaWQgUmVuZGVyTGlzdEl0ZW06OnBvc2l0aW9uTGlz
dE1hcmtlcigKIAogICAgICAgICBpZiAoYWRqdXN0T3ZlcmZsb3cpIHsKICAgICAgICAgICAgIElu
dFJlY3QgbWFya2VyUmVjdChtYXJrZXJYUG9zICsgeE9mZnNldCwgeU9mZnNldCwgbV9tYXJrZXIt
PndpZHRoKCksIG1fbWFya2VyLT5oZWlnaHQoKSk7Ci0gICAgICAgICAgICBSZW5kZXJCb3gqIG8g
PSBtX21hcmtlcjsKKyAgICAgICAgICAgIFJlbmRlck9iamVjdCogbyA9IG1fbWFya2VyOwogICAg
ICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIG8gPSBvLT5wYXJlbnRCb3goKTsKKyAgICAg
ICAgICAgICAgICBvID0gby0+cGFyZW50KCk7CiAgICAgICAgICAgICAgICAgaWYgKG8tPmlzUmVu
ZGVyQmxvY2soKSkKICAgICAgICAgICAgICAgICAgICAgdG9SZW5kZXJCbG9jayhvKS0+YWRkTGF5
b3V0T3ZlcmZsb3cobWFya2VyUmVjdCk7Ci0gICAgICAgICAgICAgICAgbWFya2VyUmVjdC5tb3Zl
KC1vLT54KCksIC1vLT55KCkpOwotICAgICAgICAgICAgfSB3aGlsZSAobyAhPSB0aGlzICYmICFv
LT5oYXNTZWxmUGFpbnRpbmdMYXllcigpKTsKKyAgICAgICAgICAgICAgICBpZiAoby0+aXNCb3go
KSkKKyAgICAgICAgICAgICAgICAgICAgbWFya2VyUmVjdC5tb3ZlKC10b1JlbmRlckJveChvKS0+
eCgpLCAtdG9SZW5kZXJCb3gobyktPnkoKSk7CisgICAgICAgICAgICB9IHdoaWxlIChvICE9IHRo
aXMgJiYgKCFvLT5pc0JveCgpIHx8ICF0b1JlbmRlckJveChvKS0+aGFzU2VsZlBhaW50aW5nTGF5
ZXIoKSkpOyAvLyBGSVhNRTogSW52ZXN0aWdhdGUgPGxpPjxzcGFuIHN0eWxlPSJwb3NpdGlvbjpy
ZWxhdGl2ZTtsZWZ0Oi0xMDBweCI+PGRpdj50ZXh0PC9kaXY+PC9zcGFuPjwvbGk+CiAgICAgICAg
IH0KICAgICB9CiB9CkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3QuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdC5jcHAJKHJldmlzaW9u
IDU0Nzc1KQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMjA4LDYgKzIwOCw3IEBAIFJlbmRlck9iamVjdDo6UmVuZGVyT2JqZWN0KE5vZGUq
IG5vZGUpCiAgICAgLCBtX2hhc01hcmt1cFRydW5jYXRpb24oZmFsc2UpCiAgICAgLCBtX3NlbGVj
dGlvblN0YXRlKFNlbGVjdGlvbk5vbmUpCiAgICAgLCBtX2hhc0NvbHVtbnMoZmFsc2UpCisgICAg
LCBtX2hhc0N1bGxlZExpbmVCb3hlcyhmYWxzZSkKICAgICAsIG1fY2VsbFdpZHRoQ2hhbmdlZChm
YWxzZSkKIHsKICNpZm5kZWYgTkRFQlVHCkBAIC0yMjMyLDggKzIyMzMsNiBAQCB2b2lkIFJlbmRl
ck9iamVjdDo6Z2V0VGV4dERlY29yYXRpb25Db2xvCiAgICAgICAgICAgICB9CiAgICAgICAgIH0K
ICAgICAgICAgY3VyciA9IGN1cnItPnBhcmVudCgpOwotICAgICAgICBpZiAoY3VyciAmJiBjdXJy
LT5pc1JlbmRlckJsb2NrKCkgJiYgdG9SZW5kZXJCbG9jayhjdXJyKS0+aW5saW5lQ29udGludWF0
aW9uKCkpCi0gICAgICAgICAgICBjdXJyID0gdG9SZW5kZXJCbG9jayhjdXJyKS0+aW5saW5lQ29u
dGludWF0aW9uKCk7CiAgICAgfSB3aGlsZSAoY3VyciAmJiBkZWNvcmF0aW9ucyAmJiAoIXF1aXJr
c01vZGUgfHwgIWN1cnItPm5vZGUoKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICghY3Vyci0+bm9kZSgpLT5oYXNUYWdOYW1lKGFUYWcpICYmICFjdXJyLT5ub2RlKCkt
Pmhhc1RhZ05hbWUoZm9udFRhZykpKSk7CiAKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRl
ck9iamVjdC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdC5o
CShyZXZpc2lvbiA1NDc3NSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdC5oCSh3
b3JraW5nIGNvcHkpCkBAIC0zMTUsNiArMzE1LDggQEAgcHVibGljOgogICAgIHZvaWQgc2V0Q2hp
bGRyZW5JbmxpbmUoYm9vbCBiID0gdHJ1ZSkgeyBtX2NoaWxkcmVuSW5saW5lID0gYjsgfQogICAg
IGJvb2wgaGFzQ29sdW1ucygpIGNvbnN0IHsgcmV0dXJuIG1faGFzQ29sdW1uczsgfQogICAgIHZv
aWQgc2V0SGFzQ29sdW1ucyhib29sIGIgPSB0cnVlKSB7IG1faGFzQ29sdW1ucyA9IGI7IH0KKyAg
ICBib29sIGhhc0N1bGxlZExpbmVCb3hlcygpIGNvbnN0IHsgcmV0dXJuIG1faGFzQ3VsbGVkTGlu
ZUJveGVzOyB9CisgICAgdm9pZCBzZXRIYXNDdWxsZWRMaW5lQm94ZXMoYm9vbCBiID0gdHJ1ZSkg
eyBtX2hhc0N1bGxlZExpbmVCb3hlcyA9IGI7IH0KICAgICBib29sIGNlbGxXaWR0aENoYW5nZWQo
KSBjb25zdCB7IHJldHVybiBtX2NlbGxXaWR0aENoYW5nZWQ7IH0KICAgICB2b2lkIHNldENlbGxX
aWR0aENoYW5nZWQoYm9vbCBiID0gdHJ1ZSkgeyBtX2NlbGxXaWR0aENoYW5nZWQgPSBiOyB9CiAK
QEAgLTM2Niw3ICszNjgsMTEgQEAgcHVibGljOgogICAgIHZvaWQgc2V0SXNBbm9ueW1vdXMoYm9v
bCBiKSB7IG1faXNBbm9ueW1vdXMgPSBiOyB9CiAgICAgYm9vbCBpc0Fub255bW91c0Jsb2NrKCkg
Y29uc3QKICAgICB7Ci0gICAgICAgIHJldHVybiBtX2lzQW5vbnltb3VzICYmIHN0eWxlKCktPmRp
c3BsYXkoKSA9PSBCTE9DSyAmJiBzdHlsZSgpLT5zdHlsZVR5cGUoKSA9PSBOT1BTRVVETyAmJiAh
aXNMaXN0TWFya2VyKCk7CisgICAgICAgIHJldHVybiBtX2lzQW5vbnltb3VzICYmIHN0eWxlKCkt
PmRpc3BsYXkoKSA9PSBCTE9DSyAmJiBzdHlsZSgpLT5zdHlsZVR5cGUoKSA9PSBOT1BTRVVETyAm
JiAhaXNUZXh0KCkgJiYgIWlzTGlzdE1hcmtlcigpOworICAgIH0KKyAgICBib29sIGlzQW5vbnlt
b3VzSW5saW5lQmxvY2soKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1faXNBbm9ueW1v
dXMgJiYgc3R5bGUoKS0+ZGlzcGxheSgpID09IElOTElORV9CTE9DSyAmJiBzdHlsZSgpLT5zdHls
ZVR5cGUoKSA9PSBOT1BTRVVETyAmJiAhaXNUZXh0KCkgJiYgIWlzUnVieVJ1bigpICYmICFpc1J1
YnlCYXNlKCk7CiAgICAgfQogICAgIGJvb2wgaXNJbmxpbmVDb250aW51YXRpb24oKSBjb25zdCB7
IHJldHVybiAobm9kZSgpID8gbm9kZSgpLT5yZW5kZXJlcigpICE9IHRoaXMgOiBmYWxzZSkgJiYg
aXNSZW5kZXJJbmxpbmUoKTsgfQogICAgIGJvb2wgaXNGbG9hdGluZygpIGNvbnN0IHsgcmV0dXJu
IG1fZmxvYXRpbmc7IH0KQEAgLTg3Myw2ICs4NzksOSBAQCBwcml2YXRlOgogICAgIHVuc2lnbmVk
IG1fc2VsZWN0aW9uU3RhdGUgOiAzOyAvLyBTZWxlY3Rpb25TdGF0ZQogICAgIGJvb2wgbV9oYXND
b2x1bW5zIDogMTsKICAgICAKKyAgICAvLyBmcm9tIFJlbmRlcklubGluZQorICAgIGJvb2wgbV9o
YXNDdWxsZWRMaW5lQm94ZXMgOiAxOworCiAgICAgLy8gZnJvbSBSZW5kZXJUYWJsZUNlbGwKICAg
ICBib29sIG1fY2VsbFdpZHRoQ2hhbmdlZCA6IDE7CiAKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5n
L1JlbmRlck9iamVjdENoaWxkTGlzdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJp
bmcvUmVuZGVyT2JqZWN0Q2hpbGRMaXN0LmNwcAkocmV2aXNpb24gNTQ3NzUpCisrKyBXZWJDb3Jl
L3JlbmRlcmluZy9SZW5kZXJPYmplY3RDaGlsZExpc3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0z
MTYsMTYgKzMxNiw2IEBAIHZvaWQgUmVuZGVyT2JqZWN0Q2hpbGRMaXN0Ojp1cGRhdGVCZWZvcmUK
IAogICAgIC8vIFdoZXRoZXIgb3Igbm90IHdlIG5vdyB3YW50IGdlbmVyYXRlZCBjb250ZW50LiAg
CiAgICAgYm9vbCBuZXdDb250ZW50V2FudGVkID0gcHNldWRvRWxlbWVudFN0eWxlICYmIHBzZXVk
b0VsZW1lbnRTdHlsZS0+ZGlzcGxheSgpICE9IE5PTkU7Ci0KLSAgICAvLyBGb3IgPHE+PHAvPjwv
cT4sIGlmIHRoaXMgb2JqZWN0IGlzIHRoZSBpbmxpbmUgY29udGludWF0aW9uIG9mIHRoZSA8cT4s
IHdlIG9ubHkgd2FudCB0byBnZW5lcmF0ZQotICAgIC8vIDphZnRlciBjb250ZW50IGFuZCBub3Qg
OmJlZm9yZSBjb250ZW50LgotICAgIGlmIChuZXdDb250ZW50V2FudGVkICYmIHR5cGUgPT0gQkVG
T1JFICYmIG93bmVyLT5pc1JlbmRlcklubGluZSgpICYmIHRvUmVuZGVySW5saW5lKG93bmVyKS0+
aXNJbmxpbmVDb250aW51YXRpb24oKSkKLSAgICAgICAgbmV3Q29udGVudFdhbnRlZCA9IGZhbHNl
OwotCi0gICAgLy8gU2ltaWxhcmx5LCBpZiB3ZSdyZSB0aGUgYmVnaW5uaW5nIG9mIGEgPHE+LCBh
bmQgdGhlcmUncyBhbiBpbmxpbmUgY29udGludWF0aW9uIGZvciBvdXIgb2JqZWN0LAotICAgIC8v
IHRoZW4gd2UgZG9uJ3QgZ2VuZXJhdGUgdGhlIDphZnRlciBjb250ZW50LgotICAgIGlmIChuZXdD
b250ZW50V2FudGVkICYmIHR5cGUgPT0gQUZURVIgJiYgb3duZXItPmlzUmVuZGVySW5saW5lKCkg
JiYgdG9SZW5kZXJJbmxpbmUob3duZXIpLT5jb250aW51YXRpb24oKSkKLSAgICAgICAgbmV3Q29u
dGVudFdhbnRlZCA9IGZhbHNlOwogICAgIAogICAgIC8vIElmIHdlIGRvbid0IHdhbnQgZ2VuZXJh
dGVkIGNvbnRlbnQgYW55IGxvbmdlciwgb3IgaWYgd2UgaGF2ZSBnZW5lcmF0ZWQgY29udGVudCwg
YnV0IGl0J3Mgbm8gbG9uZ2VyCiAgICAgLy8gaWRlbnRpY2FsIHRvIHRoZSBuZXcgY29udGVudCBk
YXRhIHdlIHdhbnQgdG8gYnVpbGQgcmVuZGVyIG9iamVjdHMgZm9yLCB0aGVuIHdlIG51a2UgYWxs
CkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJSdWJ5QmFzZS5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyUnVieUJhc2UuY3BwCShyZXZpc2lvbiA1NDc3NSkK
KysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclJ1YnlCYXNlLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMTE4LDcgKzExOCw2IEBAIHZvaWQgUmVuZGVyUnVieUJhc2U6Om1vdmVCbG9ja0NoaWxkcmVu
KFIKICAgICAgICAgICAgICAgICBpZiAoY2hpbGQtPmlzQW5vbnltb3VzQmxvY2soKSkgewogICAg
ICAgICAgICAgICAgICAgICBSZW5kZXJCbG9jayogYW5vbkJsb2NrID0gdG9SZW5kZXJCbG9jayhj
aGlsZCk7CiAgICAgICAgICAgICAgICAgICAgIEFTU0VSVChhbm9uQmxvY2stPmNoaWxkcmVuSW5s
aW5lKCkpOwotICAgICAgICAgICAgICAgICAgICBBU1NFUlQoIWFub25CbG9jay0+aW5saW5lQ29u
dGludWF0aW9uKCkpOwogICAgICAgICAgICAgICAgICAgICBhbm9uQmxvY2stPm1vdmVBbGxDaGls
ZHJlblRvKHRvQmFzZSwgdG9CYXNlLT5jaGlsZHJlbigpKTsKICAgICAgICAgICAgICAgICAgICAg
YW5vbkJsb2NrLT5kZWxldGVMaW5lQm94VHJlZSgpOwogICAgICAgICAgICAgICAgICAgICBhbm9u
QmxvY2stPmRlc3Ryb3koKTsKQEAgLTE0NSw3ICsxNDQsNiBAQCB2b2lkIFJlbmRlclJ1YnlCYXNl
Ojptb3ZlQmxvY2tDaGlsZHJlbihSCiAKICAgICAgICAgICAgICAgICAgICAgUmVuZGVyQmxvY2sq
IGFub25CbG9jayA9IHRvUmVuZGVyQmxvY2soY2hpbGQpOwogICAgICAgICAgICAgICAgICAgICBB
U1NFUlQoYW5vbkJsb2NrLT5jaGlsZHJlbklubGluZSgpKTsKLSAgICAgICAgICAgICAgICAgICAg
QVNTRVJUKCFhbm9uQmxvY2stPmlubGluZUNvbnRpbnVhdGlvbigpKTsKICAgICAgICAgICAgICAg
ICAgICAgLy8gTW92ZSBpbmxpbmUgY2hpbGRyZW4gb3V0IG9mIGFub255bW91cyBibG9jay4KICAg
ICAgICAgICAgICAgICAgICAgYW5vbkJsb2NrLT5tb3ZlQWxsQ2hpbGRyZW5Ubyh0aGlzLCBjaGls
ZHJlbigpLCBhbm9uQmxvY2spOwogICAgICAgICAgICAgICAgICAgICBhbm9uQmxvY2stPmRlbGV0
ZUxpbmVCb3hUcmVlKCk7CkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9Sb290SW5saW5lQm94LmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9Sb290SW5saW5lQm94LmNwcAkocmV2
aXNpb24gNTQ3NzUpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9Sb290SW5saW5lQm94LmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgIlBhZ2UuaCIKICNpbmNsdWRl
ICJSZW5kZXJBcmVuYS5oIgogI2luY2x1ZGUgIlJlbmRlckJsb2NrLmgiCisjaW5jbHVkZSAiUmVu
ZGVyVmlldy5oIgogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCkBAIC0xNjEsOSArMTYyLDE1IEBA
IHZvaWQgUm9vdElubGluZUJveDo6cGFpbnRDdXN0b21IaWdobGlnaHQKIAogI2VuZGlmCiAKLXZv
aWQgUm9vdElubGluZUJveDo6cGFpbnQoUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5m
bywgaW50IHR4LCBpbnQgdHkpCit2b2lkIFJvb3RJbmxpbmVCb3g6OnBhaW50KFJlbmRlck9iamVj
dDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGludCB0eCwgaW50IHR5LCBMaW5lQm94UGFpbnRJbmZv
JiBsaW5lQm94UGFpbnRJbmZvKQogewotICAgIElubGluZUZsb3dCb3g6OnBhaW50KHBhaW50SW5m
bywgdHgsIHR5KTsKKyAgICAvLyBPbmx5IHBhaW50IGR1cmluZyB0aGUgZm9yZWdyb3VuZC9zZWxl
Y3Rpb24gcGhhc2VzLgorICAgIGlmIChwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZUZvcmVn
cm91bmQgJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VTZWxlY3Rpb24gJiYgcGFpbnRJ
bmZvLnBoYXNlICE9IFBhaW50UGhhc2VPdXRsaW5lIAorICAgICAgICAmJiBwYWludEluZm8ucGhh
c2UgIT0gUGFpbnRQaGFzZVNlbGZPdXRsaW5lICYmIHBhaW50SW5mby5waGFzZSAhPSBQYWludFBo
YXNlQ2hpbGRPdXRsaW5lcyAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZVRleHRDbGlw
CisgICAgICAgICYmIHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlTWFzaykKKyAgICAgICAg
cmV0dXJuOworCisgICAgSW5saW5lRmxvd0JveDo6cGFpbnQocGFpbnRJbmZvLCB0eCwgdHksIGxp
bmVCb3hQYWludEluZm8pOwogICAgIHBhaW50RWxsaXBzaXNCb3gocGFpbnRJbmZvLCB0eCwgdHkp
OwogI2lmIFBMQVRGT1JNKE1BQykKICAgICBSZW5kZXJTdHlsZSogc3R5bGVUb1VzZSA9IHJlbmRl
cmVyKCktPnN0eWxlKG1fZmlyc3RMaW5lKTsKQEAgLTE3MiwxNSArMTc5LDE4IEBAIHZvaWQgUm9v
dElubGluZUJveDo6cGFpbnQoUmVuZGVyT2JqZWN0OjoKICNlbmRpZgogfQogCi1ib29sIFJvb3RJ
bmxpbmVCb3g6Om5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiByZXF1ZXN0LCBIaXRU
ZXN0UmVzdWx0JiByZXN1bHQsIGludCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHkpCitib29sIFJv
b3RJbmxpbmVCb3g6Om5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiByZXF1ZXN0LCBI
aXRUZXN0UmVzdWx0JiByZXN1bHQsIGludCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHksIEhpdFRl
c3RBY3Rpb24gaGl0VGVzdEFjdGlvbiwgTGluZUJveEhpdFRlc3RJbmZvJiBoaXRUZXN0SW5mbykK
IHsKKyAgICBpZiAoaGl0VGVzdEFjdGlvbiAhPSBIaXRUZXN0Rm9yZWdyb3VuZCkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCiAgICAgaWYgKG1faGFzRWxsaXBzaXNCb3ggJiYgdmlzaWJsZVRvSGl0
VGVzdGluZygpKSB7Ci0gICAgICAgIGlmIChlbGxpcHNpc0JveCgpLT5ub2RlQXRQb2ludChyZXF1
ZXN0LCByZXN1bHQsIHgsIHksIHR4LCB0eSkpIHsKKyAgICAgICAgaWYgKGVsbGlwc2lzQm94KCkt
Pm5vZGVBdFBvaW50KHJlcXVlc3QsIHJlc3VsdCwgeCwgeSwgdHgsIHR5LCBoaXRUZXN0QWN0aW9u
LCBoaXRUZXN0SW5mbykpIHsKICAgICAgICAgICAgIHJlbmRlcmVyKCktPnVwZGF0ZUhpdFRlc3RS
ZXN1bHQocmVzdWx0LCBJbnRQb2ludCh4IC0gdHgsIHkgLSB0eSkpOwogICAgICAgICAgICAgcmV0
dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIElubGluZUZsb3dCb3g6Om5v
ZGVBdFBvaW50KHJlcXVlc3QsIHJlc3VsdCwgeCwgeSwgdHgsIHR5KTsKKyAgICByZXR1cm4gSW5s
aW5lRmxvd0JveDo6bm9kZUF0UG9pbnQocmVxdWVzdCwgcmVzdWx0LCB4LCB5LCB0eCwgdHksIEhp
dFRlc3RGb3JlZ3JvdW5kLCBoaXRUZXN0SW5mbyk7CiB9CiAKIHZvaWQgUm9vdElubGluZUJveDo6
YWRqdXN0UG9zaXRpb24oaW50IGR4LCBpbnQgZHkpCkBAIC0yMDQsNiArMjE0LDI0IEBAIHZvaWQg
Um9vdElubGluZUJveDo6Y2hpbGRSZW1vdmVkKElubGluZUIKIAogaW50IFJvb3RJbmxpbmVCb3g6
OnZlcnRpY2FsbHlBbGlnbkJveGVzKGludCBoZWlnaHRPZkJsb2NrKQogeworICAgIFJlbmRlckJs
b2NrKiBpbmxpbmVCbG9jayA9IGFub255bW91c0lubGluZUJsb2NrKCk7CisgICAgaWYgKGlubGlu
ZUJsb2NrKSB7CisgICAgICAgIGludCBsaW5lVG9wID0gaW5saW5lQmxvY2stPnkoKTsKKyAgICAg
ICAgaW50IGxpbmVCb3R0b20gPSBpbmxpbmVCbG9jay0+eSgpICsgaW5saW5lQmxvY2stPmhlaWdo
dCgpOworICAgICAgICBmb3IgKElubGluZUJveCogY3VyciA9IGZpcnN0Q2hpbGQoKTsgY3Vycjsg
Y3VyciA9IHN0YXRpY19jYXN0PElubGluZUZsb3dCb3gqPihjdXJyKS0+Zmlyc3RDaGlsZCgpKSB7
CisgICAgICAgICAgICBjdXJyLT5zZXRYKGlubGluZUJsb2NrLT54KCkpOworICAgICAgICAgICAg
Y3Vyci0+c2V0WShsaW5lVG9wKTsKKyAgICAgICAgICAgIGN1cnItPnNldFdpZHRoKGlubGluZUJs
b2NrLT53aWR0aCgpKTsKKyAgICAgICAgICAgIGlmIChjdXJyLT5yZW5kZXJlcigpID09IGlubGlu
ZUJsb2NrKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgc3RhdGljX2Nhc3Q8
SW5saW5lRmxvd0Fub255bW91c0lubGluZUJsb2NrQm94Kj4oY3VyciktPnNldEhlaWdodChpbmxp
bmVCbG9jay0+aGVpZ2h0KCkpOworICAgICAgICB9CisgICAgICAgIHNldFkobGluZVRvcCk7Cisg
ICAgICAgIGNvbXB1dGVWZXJ0aWNhbE92ZXJmbG93KGxpbmVUb3AsIGxpbmVCb3R0b20sIHRydWUp
OworICAgICAgICBzZXRMaW5lVG9wQm90dG9tUG9zaXRpb25zKGxpbmVUb3AsIGxpbmVCb3R0b20p
OworICAgICAgICByZXR1cm4gaGVpZ2h0T2ZCbG9jazsKKyAgICB9CisgICAgCiAgICAgaW50IG1h
eFBvc2l0aW9uVG9wID0gMDsKICAgICBpbnQgbWF4UG9zaXRpb25Cb3R0b20gPSAwOwogICAgIGlu
dCBtYXhBc2NlbnQgPSAwOwpAQCAtMjE3LDcgKzI0NSw2IEBAIGludCBSb290SW5saW5lQm94Ojp2
ZXJ0aWNhbGx5QWxpZ25Cb3hlcygKICAgICBib29sIHN0cmljdE1vZGUgPSAoY3VyciAmJiBjdXJy
LT5kb2N1bWVudCgpLT5pblN0cmljdE1vZGUoKSk7CiAKICAgICBjb21wdXRlTG9naWNhbEJveEhl
aWdodHMobWF4UG9zaXRpb25Ub3AsIG1heFBvc2l0aW9uQm90dG9tLCBtYXhBc2NlbnQsIG1heERl
c2NlbnQsIHN0cmljdE1vZGUpOwotCiAgICAgaWYgKG1heEFzY2VudCArIG1heERlc2NlbnQgPCBt
YXgobWF4UG9zaXRpb25Ub3AsIG1heFBvc2l0aW9uQm90dG9tKSkKICAgICAgICAgYWRqdXN0TWF4
QXNjZW50QW5kRGVzY2VudChtYXhBc2NlbnQsIG1heERlc2NlbnQsIG1heFBvc2l0aW9uVG9wLCBt
YXhQb3NpdGlvbkJvdHRvbSk7CiAKQEAgLTMzMiw3ICszNTksNyBAQCBJbmxpbmVCb3gqIFJvb3RJ
bmxpbmVCb3g6Omxhc3RTZWxlY3RlZEJvCiBpbnQgUm9vdElubGluZUJveDo6c2VsZWN0aW9uVG9w
KCkgY29uc3QKIHsKICAgICBpbnQgc2VsZWN0aW9uVG9wID0gbV9saW5lVG9wOwotICAgIGlmICgh
cHJldlJvb3RCb3goKSkKKyAgICBpZiAoIXByZXZSb290Qm94KCkgfHwgcHJldlJvb3RCb3goKS0+
aGFzQW5vbnltb3VzSW5saW5lQmxvY2soKSkKICAgICAgICAgcmV0dXJuIHNlbGVjdGlvblRvcDsK
IAogICAgIGludCBwcmV2Qm90dG9tID0gcHJldlJvb3RCb3goKS0+c2VsZWN0aW9uQm90dG9tKCk7
CkBAIC00MzAsNCArNDU3LDI1IEBAIHZvaWQgUm9vdElubGluZUJveDo6YXR0YWNoTGluZUJveFRv
UmVuZGUKICAgICBibG9jaygpLT5saW5lQm94ZXMoKS0+YXR0YWNoTGluZUJveCh0aGlzKTsKIH0K
IAorUmVuZGVyQmxvY2sqIFJvb3RJbmxpbmVCb3g6OmFub255bW91c0lubGluZUJsb2NrKCkgY29u
c3QKK3sKKyAgICBpZiAoaGFzQW5vbnltb3VzSW5saW5lQmxvY2soKSkKKyAgICAgICAgcmV0dXJu
IHN0YXRpY19jYXN0PGNvbnN0IFJvb3RBbm9ueW1vdXNJbmxpbmVCbG9ja0JveCo+KHRoaXMpLT5p
bmxpbmVCbG9jaygpOworICAgIHJldHVybiAwOworfQorCit2b2lkIFJvb3RBbm9ueW1vdXNJbmxp
bmVCbG9ja0JveDo6cGFpbnQoUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgaW50
IHR4LCBpbnQgdHksIExpbmVCb3hQYWludEluZm8mIGxpbmVCb3hQYWludEluZm8pCit7CisgICAg
Ly8gU2tpcCB0aGUgZXh0cmEgd29yayBkb25lIGJ5IFJvb3RJbmxpbmVCb3g6OnBhaW50LiBDYWNo
ZSBvdXIgYW5vbnltb3VzIGJsb2NrIGluIHRoZSBwYWludCBpbmZvIGZvciBlYXN5CisgICAgLy8g
YWNjZXNzIGFzIHdlIHJlY3VyIGludG8gdGhlIGxpbmUuCisgICAgbGluZUJveFBhaW50SW5mby5h
bm9ueW1vdXNJbmxpbmVCbG9jayA9IG1fYW5vbnltb3VzSW5saW5lQmxvY2s7CisgICAgSW5saW5l
Rmxvd0JveDo6cGFpbnQocGFpbnRJbmZvLCB0eCwgdHksIGxpbmVCb3hQYWludEluZm8pOworfQor
Citib29sIFJvb3RBbm9ueW1vdXNJbmxpbmVCbG9ja0JveDo6bm9kZUF0UG9pbnQoY29uc3QgSGl0
VGVzdFJlcXVlc3QmIHJlcXVlc3QsIEhpdFRlc3RSZXN1bHQmIHJlc3VsdCwgaW50IHgsIGludCB5
LCBpbnQgdHgsIGludCB0eSwgSGl0VGVzdEFjdGlvbiBoaXRUZXN0QWN0aW9uLCBMaW5lQm94SGl0
VGVzdEluZm8mIGhpdFRlc3RJbmZvKQoreworICAgIC8vIFNraXAgdGhlIGV4dHJhIHdvcmsgZG9u
ZSBieSBSb290SW5saW5lQm94Ojpub2RlQXRQb2ludC4KKyAgICByZXR1cm4gSW5saW5lRmxvd0Jv
eDo6bm9kZUF0UG9pbnQocmVxdWVzdCwgcmVzdWx0LCB4LCB5LCB0eCwgdHksIGhpdFRlc3RBY3Rp
b24sIGhpdFRlc3RJbmZvKTsKK30KKwogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2Vi
Q29yZS9yZW5kZXJpbmcvUm9vdElubGluZUJveC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVu
ZGVyaW5nL1Jvb3RJbmxpbmVCb3guaAkocmV2aXNpb24gNTQ3NzUpCisrKyBXZWJDb3JlL3JlbmRl
cmluZy9Sb290SW5saW5lQm94LmgJKHdvcmtpbmcgY29weSkKQEAgLTQwLDYgKzQwLDcgQEAgcHVi
bGljOgogICAgICAgICAsIG1fbGluZUJyZWFrUG9zKDApCiAgICAgICAgICwgbV9saW5lVG9wKDAp
CiAgICAgICAgICwgbV9saW5lQm90dG9tKDApCisgICAgICAgICwgbV9oYXNBbm9ueW1vdXNJbmxp
bmVCbG9jayhmYWxzZSkKICAgICB7CiAgICAgfQogCkBAIC0xMDEsOCArMTAyLDggQEAgcHVibGlj
OgogICAgIHZvaWQgcGFpbnRDdXN0b21IaWdobGlnaHQoUmVuZGVyT2JqZWN0OjpQYWludEluZm8m
LCBpbnQgdHgsIGludCB0eSwgY29uc3QgQXRvbWljU3RyaW5nJiBoaWdobGlnaHRUeXBlKTsKICNl
bmRpZgogCi0gICAgdmlydHVhbCB2b2lkIHBhaW50KFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiwg
aW50IHR4LCBpbnQgdHkpOwotICAgIHZpcnR1YWwgYm9vbCBub2RlQXRQb2ludChjb25zdCBIaXRU
ZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBpbnQsIGludCwgaW50LCBpbnQpOworICAgIHZp
cnR1YWwgdm9pZCBwYWludChSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5
LCBMaW5lQm94UGFpbnRJbmZvJik7CisgICAgdmlydHVhbCBib29sIG5vZGVBdFBvaW50KGNvbnN0
IEhpdFRlc3RSZXF1ZXN0JiwgSGl0VGVzdFJlc3VsdCYsIGludCB4LCBpbnQgeSwgaW50IHR4LCBp
bnQgdHksIEhpdFRlc3RBY3Rpb24sIExpbmVCb3hIaXRUZXN0SW5mbyYpOwogCiAgICAgYm9vbCBo
YXNTZWxlY3RlZENoaWxkcmVuKCkgY29uc3QgeyByZXR1cm4gbV9oYXNTZWxlY3RlZENoaWxkcmVu
OyB9CiAgICAgdm9pZCBzZXRIYXNTZWxlY3RlZENoaWxkcmVuKGJvb2wpOwpAQCAtMTMyLDYgKzEz
MywxMSBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCB2b2lkIGF0dGFjaExpbmVCb3hUb1JlbmRlck9i
amVjdCgpOwogICAgIHZpcnR1YWwgdm9pZCByZW1vdmVMaW5lQm94RnJvbVJlbmRlck9iamVjdCgp
OwogCisgICAgYm9vbCBoYXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpIGNvbnN0IHsgcmV0dXJuIG1f
aGFzQW5vbnltb3VzSW5saW5lQmxvY2s7IH0KKyAgICB2b2lkIHNldEhhc0Fub255bW91c0lubGlu
ZUJsb2NrKCkgeyBtX2hhc0Fub255bW91c0lubGluZUJsb2NrID0gdHJ1ZTsgfQorCisgICAgUmVu
ZGVyQmxvY2sqIGFub255bW91c0lubGluZUJsb2NrKCkgY29uc3Q7CisKIHByb3RlY3RlZDoKICAg
ICAvLyBXaGVyZSB0aGlzIGxpbmUgZW5kZWQuICBUaGUgZXhhY3Qgb2JqZWN0IGFuZCB0aGUgcG9z
aXRpb24gd2l0aGluIHRoYXQgb2JqZWN0IGFyZSBzdG9yZWQgc28gdGhhdAogICAgIC8vIHdlIGNh
biBjcmVhdGUgYW4gSW5saW5lSXRlcmF0b3IgYmVnaW5uaW5nIGp1c3QgYWZ0ZXIgdGhlIGVuZCBv
ZiB0aGlzIGxpbmUuCkBAIC0xNTIsNiArMTU4LDggQEAgcHJvdGVjdGVkOgogICAgIFdURjo6VW5p
Y29kZTo6RGlyZWN0aW9uIG1fbGluZUJyZWFrQmlkaVN0YXR1c0VvciA6IDU7CiAgICAgV1RGOjpV
bmljb2RlOjpEaXJlY3Rpb24gbV9saW5lQnJlYWtCaWRpU3RhdHVzTGFzdFN0cm9uZyA6IDU7CiAg
ICAgV1RGOjpVbmljb2RlOjpEaXJlY3Rpb24gbV9saW5lQnJlYWtCaWRpU3RhdHVzTGFzdCA6IDU7
CisgICAgCisgICAgYm9vbCBtX2hhc0Fub255bW91c0lubGluZUJsb2NrIDogMTsKIH07CiAKIGlu
bGluZSB2b2lkIFJvb3RJbmxpbmVCb3g6OnNldExpbmVUb3BCb3R0b21Qb3NpdGlvbnMoaW50IHRv
cCwgaW50IGJvdHRvbSkgCkBAIC0xNjAsNiArMTY4LDI2IEBAIGlubGluZSB2b2lkIFJvb3RJbmxp
bmVCb3g6OnNldExpbmVUb3BCb3QKICAgICBtX2xpbmVCb3R0b20gPSBib3R0b207IAogfQogCisv
LyBGb3IgYW5vbnltb3VzIGlubGluZSBibG9jayBvYmplY3RzLgorY2xhc3MgUm9vdEFub255bW91
c0lubGluZUJsb2NrQm94IDogcHVibGljIFJvb3RJbmxpbmVCb3gKK3sKK3B1YmxpYzoKKyAgICBS
b290QW5vbnltb3VzSW5saW5lQmxvY2tCb3goUmVuZGVyT2JqZWN0KiByb290QmxvY2ssIFJlbmRl
ckJsb2NrKiBhbm9ueW1vdXNCbG9jaykKKyAgICAgICAgOiBSb290SW5saW5lQm94KHJvb3RCbG9j
aykKKyAgICAgICAgLCBtX2Fub255bW91c0lubGluZUJsb2NrKGFub255bW91c0Jsb2NrKQorICAg
IHsKKyAgICAgICAgc2V0SGFzQW5vbnltb3VzSW5saW5lQmxvY2soKTsKKyAgICB9CisgICAgCisg
ICAgUmVuZGVyQmxvY2sqIGlubGluZUJsb2NrKCkgY29uc3QgeyByZXR1cm4gbV9hbm9ueW1vdXNJ
bmxpbmVCbG9jazsgfQorICAgIAorICAgIHZpcnR1YWwgdm9pZCBwYWludChSZW5kZXJPYmplY3Q6
OlBhaW50SW5mbyYgcGFpbnRJbmZvLCBpbnQgdHgsIGludCB0eSwgTGluZUJveFBhaW50SW5mbyYp
OworICAgIHZpcnR1YWwgYm9vbCBub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYsIEhp
dFRlc3RSZXN1bHQmLCBpbnQgeCwgaW50IHksIGludCB0eCwgaW50IHR5LCBIaXRUZXN0QWN0aW9u
LCBMaW5lQm94SGl0VGVzdEluZm8mKTsKKyAgICAKK3ByaXZhdGU6CisgICAgUmVuZGVyQmxvY2sq
IG1fYW5vbnltb3VzSW5saW5lQmxvY2s7Cit9OworCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCiAK
ICNlbmRpZiAvLyBSb290SW5saW5lQm94X2gKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1NWR0lu
bGluZVRleHRCb3guY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1NWR0lubGlu
ZVRleHRCb3guY3BwCShyZXZpc2lvbiA1NDc3NSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1NWR0lu
bGluZVRleHRCb3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yOTEsNyArMjkxLDcgQEAgaW50IFNW
R0lubGluZVRleHRCb3g6OnBvc2l0aW9uRm9yT2Zmc2V0KAogICAgIHJldHVybiAwOwogfQogCi1i
b29sIFNWR0lubGluZVRleHRCb3g6Om5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0Jiwg
SGl0VGVzdFJlc3VsdCYgcmVzdWx0LCBpbnQgeCwgaW50IHksIGludCB0eCwgaW50IHR5KQorYm9v
bCBTVkdJbmxpbmVUZXh0Qm94Ojpub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYsIEhp
dFRlc3RSZXN1bHQmIHJlc3VsdCwgaW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSwgSGl0VGVz
dEFjdGlvbiwgTGluZUJveEhpdFRlc3RJbmZvJikKIHsKICAgICBBU1NFUlQoIWlzTGluZUJyZWFr
KCkpOwogCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9TVkdJbmxpbmVUZXh0Qm94LmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvU1ZHSW5saW5lVGV4dEJveC5oCShyZXZpc2lvbiA1
NDc3NSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1NWR0lubGluZVRleHRCb3guaAkod29ya2luZyBj
b3B5KQpAQCAtNjEsNyArNjEsNyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgICAgIHZpcnR1
YWwgaW50IG9mZnNldEZvclBvc2l0aW9uKGludCB4LCBib29sIGluY2x1ZGVQYXJ0aWFsR2x5cGhz
ID0gdHJ1ZSkgY29uc3Q7CiAgICAgICAgIHZpcnR1YWwgaW50IHBvc2l0aW9uRm9yT2Zmc2V0KGlu
dCBvZmZzZXQpIGNvbnN0OwogCi0gICAgICAgIHZpcnR1YWwgYm9vbCBub2RlQXRQb2ludChjb25z
dCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBpbnQgeCwgaW50IHksIGludCB0eCwg
aW50IHR5KTsKKyAgICAgICAgdmlydHVhbCBib29sIG5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RS
ZXF1ZXN0JiwgSGl0VGVzdFJlc3VsdCYsIGludCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHksIEhp
dFRlc3RBY3Rpb24sIExpbmVCb3hIaXRUZXN0SW5mbyYpOwogICAgICAgICB2aXJ0dWFsIEludFJl
Y3Qgc2VsZWN0aW9uUmVjdChpbnQgYWJzeCwgaW50IGFic3ksIGludCBzdGFydFBvcywgaW50IGVu
ZFBvcyk7CiAKICAgICAgICAgLy8gU1ZHcyBjdXN0b20gcGFpbnQgdGV4dCBtZXRob2QK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>248464</attachid>
            <date>2015-03-11 16:43:36 -0700</date>
            <delta_ts>2015-03-12 11:32:03 -0700</delta_ts>
            <desc>Starting to update this to ToT</desc>
            <filename>patch.txt</filename>
            <type>text/plain</type>
            <size>108672</size>
            <attacher name="Dave Hyatt">hyatt</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eVJlbmRlck9i
amVjdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nl
c3NpYmlsaXR5UmVuZGVyT2JqZWN0LmNwcAkocmV2aXNpb24gMTgxMzI5KQorKysgU291cmNlL1dl
YkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0LmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMTYyLDY2ICsxNjIsMTIgQEAgdm9pZCBBY2Nlc3NpYmlsaXR5UmVuZGVyT2Jq
ZWN0OjpzZXRSZW5kZQogICAgIHNldE5vZGUocmVuZGVyZXItPm5vZGUoKSk7CiB9CiAKLXN0YXRp
YyBpbmxpbmUgYm9vbCBpc0lubGluZVdpdGhDb250aW51YXRpb24oUmVuZGVyT2JqZWN0JiBvYmpl
Y3QpCi17Ci0gICAgcmV0dXJuIGlzPFJlbmRlcklubGluZT4ob2JqZWN0KSAmJiBkb3duY2FzdDxS
ZW5kZXJJbmxpbmU+KG9iamVjdCkuY29udGludWF0aW9uKCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUg
UmVuZGVyT2JqZWN0KiBmaXJzdENoaWxkSW5Db250aW51YXRpb24oUmVuZGVySW5saW5lJiByZW5k
ZXJlcikKLXsKLSAgICBhdXRvIGNvbnRpbnVhdGlvbiA9IHJlbmRlcmVyLmNvbnRpbnVhdGlvbigp
OwotCi0gICAgd2hpbGUgKGNvbnRpbnVhdGlvbikgewotICAgICAgICBpZiAoaXM8UmVuZGVyQmxv
Y2s+KCpjb250aW51YXRpb24pKQotICAgICAgICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbjsKLSAg
ICAgICAgaWYgKFJlbmRlck9iamVjdCogY2hpbGQgPSBjb250aW51YXRpb24tPmZpcnN0Q2hpbGQo
KSkKLSAgICAgICAgICAgIHJldHVybiBjaGlsZDsKLSAgICAgICAgY29udGludWF0aW9uID0gZG93
bmNhc3Q8UmVuZGVySW5saW5lPigqY29udGludWF0aW9uKS5jb250aW51YXRpb24oKTsKLSAgICB9
Ci0KLSAgICByZXR1cm4gbnVsbHB0cjsKLX0KLQotc3RhdGljIGlubGluZSBSZW5kZXJPYmplY3Qq
IGZpcnN0Q2hpbGRDb25zaWRlcmluZ0NvbnRpbnVhdGlvbihSZW5kZXJPYmplY3QmIHJlbmRlcmVy
KQotewotICAgIFJlbmRlck9iamVjdCogZmlyc3RDaGlsZCA9IHJlbmRlcmVyLmZpcnN0Q2hpbGRT
bG93KCk7Ci0KLSAgICBpZiAoIWZpcnN0Q2hpbGQgJiYgaXNJbmxpbmVXaXRoQ29udGludWF0aW9u
KHJlbmRlcmVyKSkKLSAgICAgICAgZmlyc3RDaGlsZCA9IGZpcnN0Q2hpbGRJbkNvbnRpbnVhdGlv
bihkb3duY2FzdDxSZW5kZXJJbmxpbmU+KHJlbmRlcmVyKSk7Ci0KLSAgICByZXR1cm4gZmlyc3RD
aGlsZDsKLX0KLQotCi1zdGF0aWMgaW5saW5lIFJlbmRlck9iamVjdCogbGFzdENoaWxkQ29uc2lk
ZXJpbmdDb250aW51YXRpb24oUmVuZGVyT2JqZWN0JiByZW5kZXJlcikKLXsKLSAgICBpZiAoIWlz
PFJlbmRlcklubGluZT4ocmVuZGVyZXIpICYmICFpczxSZW5kZXJCbG9jaz4ocmVuZGVyZXIpKQot
ICAgICAgICByZXR1cm4gJnJlbmRlcmVyOwotCi0gICAgUmVuZGVyT2JqZWN0KiBsYXN0Q2hpbGQg
PSBkb3duY2FzdDxSZW5kZXJCb3hNb2RlbE9iamVjdD4ocmVuZGVyZXIpLmxhc3RDaGlsZCgpOwot
ICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBwcmV2aW91czsKLSAgICBmb3IgKGF1dG8qIGN1cnJl
bnQgPSAmZG93bmNhc3Q8UmVuZGVyQm94TW9kZWxPYmplY3Q+KHJlbmRlcmVyKTsgY3VycmVudDsg
KSB7Ci0gICAgICAgIHByZXZpb3VzID0gY3VycmVudDsKLQotICAgICAgICBpZiAoUmVuZGVyT2Jq
ZWN0KiBuZXdMYXN0Q2hpbGQgPSBjdXJyZW50LT5sYXN0Q2hpbGQoKSkKLSAgICAgICAgICAgIGxh
c3RDaGlsZCA9IG5ld0xhc3RDaGlsZDsKLQotICAgICAgICBpZiAoaXM8UmVuZGVySW5saW5lPigq
Y3VycmVudCkpIHsKLSAgICAgICAgICAgIGN1cnJlbnQgPSBkb3duY2FzdDxSZW5kZXJJbmxpbmU+
KCpjdXJyZW50KS5pbmxpbmVFbGVtZW50Q29udGludWF0aW9uKCk7Ci0gICAgICAgICAgICBBU1NF
UlRfVU5VU0VEKHByZXZpb3VzLCBjdXJyZW50IHx8ICFkb3duY2FzdDxSZW5kZXJJbmxpbmU+KCpw
cmV2aW91cykuY29udGludWF0aW9uKCkpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIGN1
cnJlbnQgPSBkb3duY2FzdDxSZW5kZXJCbG9jaz4oKmN1cnJlbnQpLmlubGluZUVsZW1lbnRDb250
aW51YXRpb24oKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbGFzdENoaWxkOwotfQotCiBBY2Nlc3Np
YmlsaXR5T2JqZWN0KiBBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0OjpmaXJzdENoaWxkKCkgY29u
c3QKIHsKICAgICBpZiAoIW1fcmVuZGVyZXIpCiAgICAgICAgIHJldHVybiBudWxscHRyOwogICAg
IAotICAgIFJlbmRlck9iamVjdCogZmlyc3RDaGlsZCA9IGZpcnN0Q2hpbGRDb25zaWRlcmluZ0Nv
bnRpbnVhdGlvbigqbV9yZW5kZXJlcik7CisgICAgUmVuZGVyT2JqZWN0KiBmaXJzdENoaWxkID0g
bV9yZW5kZXJlci0+Zmlyc3RDaGlsZFNsb3coKTsKIAogICAgIC8vIElmIGFuIG9iamVjdCBjYW4n
dCBoYXZlIGNoaWxkcmVuLCB0aGVuIGl0IGlzIHVzaW5nIHRoaXMgbWV0aG9kIHRvIGhlbHAKICAg
ICAvLyBjYWxjdWxhdGUgc29tZSBpbnRlcm5hbCBwcm9wZXJ0eSAobGlrZSBpdHMgZGVzY3JpcHRp
b24pLgpAQCAtMjM4LDcgKzE4NCw3IEBAIEFjY2Vzc2liaWxpdHlPYmplY3QqIEFjY2Vzc2liaWxp
dHlSZW5kZXIKICAgICBpZiAoIW1fcmVuZGVyZXIpCiAgICAgICAgIHJldHVybiBudWxscHRyOwog
Ci0gICAgUmVuZGVyT2JqZWN0KiBsYXN0Q2hpbGQgPSBsYXN0Q2hpbGRDb25zaWRlcmluZ0NvbnRp
bnVhdGlvbigqbV9yZW5kZXJlcik7CisgICAgUmVuZGVyT2JqZWN0KiBsYXN0Q2hpbGQgPSBtX3Jl
bmRlcmVyLT5sYXN0Q2hpbGRTbG93KCk7CiAKICAgICBpZiAoIWxhc3RDaGlsZCAmJiAhY2FuSGF2
ZUNoaWxkcmVuKCkpCiAgICAgICAgIHJldHVybiBBY2Nlc3NpYmlsaXR5Tm9kZU9iamVjdDo6bGFz
dENoaWxkKCk7CkBAIC0yNDYsNzAgKzE5Miw2IEBAIEFjY2Vzc2liaWxpdHlPYmplY3QqIEFjY2Vz
c2liaWxpdHlSZW5kZXIKICAgICByZXR1cm4gYXhPYmplY3RDYWNoZSgpLT5nZXRPckNyZWF0ZShs
YXN0Q2hpbGQpOwogfQogCi1zdGF0aWMgaW5saW5lIFJlbmRlcklubGluZSogc3RhcnRPZkNvbnRp
bnVhdGlvbnMoUmVuZGVyT2JqZWN0JiByZW5kZXJlcikKLXsKLSAgICBpZiAocmVuZGVyZXIuaXNJ
bmxpbmVFbGVtZW50Q29udGludWF0aW9uKCkgJiYgaXM8UmVuZGVySW5saW5lPihyZW5kZXJlci5u
b2RlKCktPnJlbmRlcmVyKCkpKQotICAgICAgICByZXR1cm4gZG93bmNhc3Q8UmVuZGVySW5saW5l
PihyZW5kZXJlci5ub2RlKCktPnJlbmRlcmVyKCkpOwotCi0gICAgLy8gQmxvY2tzIHdpdGggYSBw
cmV2aW91cyBjb250aW51YXRpb24gYWx3YXlzIGhhdmUgYSBuZXh0IGNvbnRpbnVhdGlvbgotICAg
IGlmIChpczxSZW5kZXJCbG9jaz4ocmVuZGVyZXIpICYmIGRvd25jYXN0PFJlbmRlckJsb2NrPihy
ZW5kZXJlcikuaW5saW5lRWxlbWVudENvbnRpbnVhdGlvbigpKQotICAgICAgICByZXR1cm4gZG93
bmNhc3Q8UmVuZGVySW5saW5lPihkb3duY2FzdDxSZW5kZXJCbG9jaz4ocmVuZGVyZXIpLmlubGlu
ZUVsZW1lbnRDb250aW51YXRpb24oKS0+ZWxlbWVudCgpLT5yZW5kZXJlcigpKTsKLQotICAgIHJl
dHVybiBudWxscHRyOwotfQotCi1zdGF0aWMgaW5saW5lIFJlbmRlck9iamVjdCogZW5kT2ZDb250
aW51YXRpb25zKFJlbmRlck9iamVjdCYgcmVuZGVyZXIpCi17Ci0gICAgaWYgKCFpczxSZW5kZXJJ
bmxpbmU+KHJlbmRlcmVyKSAmJiAhaXM8UmVuZGVyQmxvY2s+KHJlbmRlcmVyKSkKLSAgICAgICAg
cmV0dXJuICZyZW5kZXJlcjsKLQotICAgIGF1dG8qIHByZXZpb3VzID0gJmRvd25jYXN0PFJlbmRl
ckJveE1vZGVsT2JqZWN0PihyZW5kZXJlcik7Ci0gICAgZm9yIChhdXRvKiBjdXJyZW50ID0gcHJl
dmlvdXM7IGN1cnJlbnQ7ICkgewotICAgICAgICBwcmV2aW91cyA9IGN1cnJlbnQ7Ci0gICAgICAg
IGlmIChpczxSZW5kZXJJbmxpbmU+KCpjdXJyZW50KSkgewotICAgICAgICAgICAgY3VycmVudCA9
IGRvd25jYXN0PFJlbmRlcklubGluZT4oKmN1cnJlbnQpLmlubGluZUVsZW1lbnRDb250aW51YXRp
b24oKTsKLSAgICAgICAgICAgIEFTU0VSVChjdXJyZW50IHx8ICFkb3duY2FzdDxSZW5kZXJJbmxp
bmU+KCpwcmV2aW91cykuY29udGludWF0aW9uKCkpOwotICAgICAgICB9IGVsc2UgCi0gICAgICAg
ICAgICBjdXJyZW50ID0gZG93bmNhc3Q8UmVuZGVyQmxvY2s+KCpjdXJyZW50KS5pbmxpbmVFbGVt
ZW50Q29udGludWF0aW9uKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHByZXZpb3VzOwotfQotCi0K
LXN0YXRpYyBpbmxpbmUgUmVuZGVyT2JqZWN0KiBjaGlsZEJlZm9yZUNvbnNpZGVyaW5nQ29udGlu
dWF0aW9ucyhSZW5kZXJJbmxpbmUqIHJlbmRlcmVyLCBSZW5kZXJPYmplY3QqIGNoaWxkKQotewot
ICAgIFJlbmRlck9iamVjdCogcHJldmlvdXMgPSBudWxscHRyOwotICAgIGZvciAoUmVuZGVyQm94
TW9kZWxPYmplY3QqIGN1cnJlbnRDb250YWluZXIgPSByZW5kZXJlcjsgY3VycmVudENvbnRhaW5l
cjsgKSB7Ci0gICAgICAgIGlmIChpczxSZW5kZXJJbmxpbmU+KCpjdXJyZW50Q29udGFpbmVyKSkg
ewotICAgICAgICAgICAgYXV0byogY3VycmVudCA9IGN1cnJlbnRDb250YWluZXItPmZpcnN0Q2hp
bGQoKTsKLSAgICAgICAgICAgIHdoaWxlIChjdXJyZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYg
KGN1cnJlbnQgPT0gY2hpbGQpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmV2aW91czsK
LSAgICAgICAgICAgICAgICBwcmV2aW91cyA9IGN1cnJlbnQ7Ci0gICAgICAgICAgICAgICAgY3Vy
cmVudCA9IGN1cnJlbnQtPm5leHRTaWJsaW5nKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAg
ICAgIGN1cnJlbnRDb250YWluZXIgPSBkb3duY2FzdDxSZW5kZXJJbmxpbmU+KCpjdXJyZW50Q29u
dGFpbmVyKS5jb250aW51YXRpb24oKTsKLSAgICAgICAgfSBlbHNlIGlmIChpczxSZW5kZXJCbG9j
az4oKmN1cnJlbnRDb250YWluZXIpKSB7Ci0gICAgICAgICAgICBpZiAoY3VycmVudENvbnRhaW5l
ciA9PSBjaGlsZCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcHJldmlvdXM7Ci0KLSAgICAgICAg
ICAgIHByZXZpb3VzID0gY3VycmVudENvbnRhaW5lcjsKLSAgICAgICAgICAgIGN1cnJlbnRDb250
YWluZXIgPSBkb3duY2FzdDxSZW5kZXJCbG9jaz4oKmN1cnJlbnRDb250YWluZXIpLmlubGluZUVs
ZW1lbnRDb250aW51YXRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEFTU0VSVF9OT1Rf
UkVBQ0hFRCgpOwotICAgIHJldHVybiBudWxscHRyOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wg
Zmlyc3RDaGlsZElzSW5saW5lQ29udGludWF0aW9uKFJlbmRlckVsZW1lbnQmIHJlbmRlcmVyKQot
ewotICAgIFJlbmRlck9iamVjdCogY2hpbGQgPSByZW5kZXJlci5maXJzdENoaWxkKCk7Ci0gICAg
cmV0dXJuIGNoaWxkICYmIGNoaWxkLT5pc0lubGluZUVsZW1lbnRDb250aW51YXRpb24oKTsKLX0K
LQogQWNjZXNzaWJpbGl0eU9iamVjdCogQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6cHJldmlv
dXNTaWJsaW5nKCkgY29uc3QKIHsKICAgICBpZiAoIW1fcmVuZGVyZXIpCkBAIC0zMTcsNDQgKzE5
OSwxNSBAQCBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBBY2Nlc3NpYmlsaXR5UmVuZGVyCiAKICAgICBS
ZW5kZXJPYmplY3QqIHByZXZpb3VzU2libGluZyA9IG51bGxwdHI7CiAKLSAgICAvLyBDYXNlIDE6
IFRoZSBub2RlIGlzIGEgYmxvY2sgYW5kIGlzIGFuIGlubGluZSdzIGNvbnRpbnVhdGlvbi4gSW4g
dGhhdCBjYXNlLCB0aGUgaW5saW5lJ3MKLSAgICAvLyBsYXN0IGNoaWxkIGlzIG91ciBwcmV2aW91
cyBzaWJsaW5nIChvciBmdXJ0aGVyIGJhY2sgaW4gdGhlIGNvbnRpbnVhdGlvbiBjaGFpbikKLSAg
ICBSZW5kZXJJbmxpbmUqIHN0YXJ0T2ZDb250czsKLSAgICBpZiAoaXM8UmVuZGVyQm94PigqbV9y
ZW5kZXJlcikgJiYgKHN0YXJ0T2ZDb250cyA9IHN0YXJ0T2ZDb250aW51YXRpb25zKCptX3JlbmRl
cmVyKSkpCi0gICAgICAgIHByZXZpb3VzU2libGluZyA9IGNoaWxkQmVmb3JlQ29uc2lkZXJpbmdD
b250aW51YXRpb25zKHN0YXJ0T2ZDb250cywgbV9yZW5kZXJlcik7Ci0KLSAgICAvLyBDYXNlIDI6
IEFub255bW91cyBibG9jayBwYXJlbnQgb2YgdGhlIGVuZCBvZiBhIGNvbnRpbnVhdGlvbiAtIHNr
aXAgYWxsIHRoZSB3YXkgdG8gYmVmb3JlCi0gICAgLy8gdGhlIHBhcmVudCBvZiB0aGUgc3RhcnQs
IHNpbmNlIGV2ZXJ5dGhpbmcgaW4gYmV0d2VlbiB3aWxsIGJlIGxpbmtlZCB1cCB2aWEgdGhlIGNv
bnRpbnVhdGlvbi4KLSAgICBlbHNlIGlmIChtX3JlbmRlcmVyLT5pc0Fub255bW91c0Jsb2NrKCkg
JiYgZmlyc3RDaGlsZElzSW5saW5lQ29udGludWF0aW9uKGRvd25jYXN0PFJlbmRlckJsb2NrPigq
bV9yZW5kZXJlcikpKSB7Ci0gICAgICAgIFJlbmRlckJsb2NrJiByZW5kZXJCbG9jayA9IGRvd25j
YXN0PFJlbmRlckJsb2NrPigqbV9yZW5kZXJlcik7Ci0gICAgICAgIGF1dG8qIGZpcnN0UGFyZW50
ID0gc3RhcnRPZkNvbnRpbnVhdGlvbnMoKnJlbmRlckJsb2NrLmZpcnN0Q2hpbGQoKSktPnBhcmVu
dCgpOwotICAgICAgICBBU1NFUlQoZmlyc3RQYXJlbnQpOwotICAgICAgICB3aGlsZSAoZmlyc3RD
aGlsZElzSW5saW5lQ29udGludWF0aW9uKCpmaXJzdFBhcmVudCkpCi0gICAgICAgICAgICBmaXJz
dFBhcmVudCA9IHN0YXJ0T2ZDb250aW51YXRpb25zKCpmaXJzdFBhcmVudC0+Zmlyc3RDaGlsZCgp
KS0+cGFyZW50KCk7Ci0gICAgICAgIHByZXZpb3VzU2libGluZyA9IGZpcnN0UGFyZW50LT5wcmV2
aW91c1NpYmxpbmcoKTsKLSAgICB9Ci0KLSAgICAvLyBDYXNlIDM6IFRoZSBub2RlIGhhcyBhbiBh
Y3R1YWwgcHJldmlvdXMgc2libGluZwotICAgIGVsc2UgaWYgKFJlbmRlck9iamVjdCogcHMgPSBt
X3JlbmRlcmVyLT5wcmV2aW91c1NpYmxpbmcoKSkKKyAgICBpZiAoUmVuZGVyT2JqZWN0KiBwcyA9
IG1fcmVuZGVyZXItPnByZXZpb3VzU2libGluZygpKQogICAgICAgICBwcmV2aW91c1NpYmxpbmcg
PSBwczsKIAotICAgIC8vIENhc2UgNDogVGhpcyBub2RlIGhhcyBubyBwcmV2aW91cyBzaWJsaW5n
cywgYnV0IGl0cyBwYXJlbnQgaXMgYW4gaW5saW5lLAotICAgIC8vIGFuZCBpcyBhbm90aGVyIG5v
ZGUncyBpbmxpbmUgY29udGludXRhdGlvbi4gRm9sbG93IHRoZSBjb250aW51YXRpb24gY2hhaW4u
Ci0gICAgZWxzZSBpZiAoaXM8UmVuZGVySW5saW5lPigqbV9yZW5kZXJlci0+cGFyZW50KCkpICYm
IChzdGFydE9mQ29udHMgPSBzdGFydE9mQ29udGludWF0aW9ucygqbV9yZW5kZXJlci0+cGFyZW50
KCkpKSkKLSAgICAgICAgcHJldmlvdXNTaWJsaW5nID0gY2hpbGRCZWZvcmVDb25zaWRlcmluZ0Nv
bnRpbnVhdGlvbnMoc3RhcnRPZkNvbnRzLCBtX3JlbmRlcmVyLT5wYXJlbnQoKS0+Zmlyc3RDaGls
ZCgpKTsKLQogICAgIGlmICghcHJldmlvdXNTaWJsaW5nKQogICAgICAgICByZXR1cm4gbnVsbHB0
cjsKICAgICAKICAgICByZXR1cm4gYXhPYmplY3RDYWNoZSgpLT5nZXRPckNyZWF0ZShwcmV2aW91
c1NpYmxpbmcpOwogfQogCi1zdGF0aWMgaW5saW5lIGJvb2wgbGFzdENoaWxkSGFzQ29udGludWF0
aW9uKFJlbmRlckVsZW1lbnQmIHJlbmRlcmVyKQotewotICAgIFJlbmRlck9iamVjdCogY2hpbGQg
PSByZW5kZXJlci5sYXN0Q2hpbGQoKTsKLSAgICByZXR1cm4gY2hpbGQgJiYgaXNJbmxpbmVXaXRo
Q29udGludWF0aW9uKCpjaGlsZCk7Ci19Ci0KIEFjY2Vzc2liaWxpdHlPYmplY3QqIEFjY2Vzc2li
aWxpdHlSZW5kZXJPYmplY3Q6Om5leHRTaWJsaW5nKCkgY29uc3QKIHsKICAgICBpZiAoIW1fcmVu
ZGVyZXIpCkBAIC0zNjIsNTcgKzIxNSwxNCBAQCBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBBY2Nlc3Np
YmlsaXR5UmVuZGVyCiAKICAgICBSZW5kZXJPYmplY3QqIG5leHRTaWJsaW5nID0gbnVsbHB0cjsK
IAotICAgIC8vIENhc2UgMTogbm9kZSBpcyBhIGJsb2NrIGFuZCBoYXMgYW4gaW5saW5lIGNvbnRp
bnVhdGlvbi4gTmV4dCBzaWJsaW5nIGlzIHRoZSBpbmxpbmUgY29udGludWF0aW9uJ3MKLSAgICAv
LyBmaXJzdCBjaGlsZC4KLSAgICBSZW5kZXJJbmxpbmUqIGlubGluZUNvbnRpbnVhdGlvbjsKLSAg
ICBpZiAoaXM8UmVuZGVyQmxvY2s+KCptX3JlbmRlcmVyKSAmJiAoaW5saW5lQ29udGludWF0aW9u
ID0gZG93bmNhc3Q8UmVuZGVyQmxvY2s+KCptX3JlbmRlcmVyKS5pbmxpbmVFbGVtZW50Q29udGlu
dWF0aW9uKCkpKQotICAgICAgICBuZXh0U2libGluZyA9IGZpcnN0Q2hpbGRDb25zaWRlcmluZ0Nv
bnRpbnVhdGlvbigqaW5saW5lQ29udGludWF0aW9uKTsKLQotICAgIC8vIENhc2UgMjogQW5vbnlt
b3VzIGJsb2NrIHBhcmVudCBvZiB0aGUgc3RhcnQgb2YgYSBjb250aW51YXRpb24gLSBza2lwIGFs
bCB0aGUgd2F5IHRvCi0gICAgLy8gYWZ0ZXIgdGhlIHBhcmVudCBvZiB0aGUgZW5kLCBzaW5jZSBl
dmVyeXRoaW5nIGluIGJldHdlZW4gd2lsbCBiZSBsaW5rZWQgdXAgdmlhIHRoZSBjb250aW51YXRp
b24uCi0gICAgZWxzZSBpZiAobV9yZW5kZXJlci0+aXNBbm9ueW1vdXNCbG9jaygpICYmIGxhc3RD
aGlsZEhhc0NvbnRpbnVhdGlvbihkb3duY2FzdDxSZW5kZXJCbG9jaz4oKm1fcmVuZGVyZXIpKSkg
ewotICAgICAgICBSZW5kZXJFbGVtZW50KiBsYXN0UGFyZW50ID0gZW5kT2ZDb250aW51YXRpb25z
KCpkb3duY2FzdDxSZW5kZXJCbG9jaz4oKm1fcmVuZGVyZXIpLmxhc3RDaGlsZCgpKS0+cGFyZW50
KCk7Ci0gICAgICAgIEFTU0VSVChsYXN0UGFyZW50KTsKLSAgICAgICAgd2hpbGUgKGxhc3RDaGls
ZEhhc0NvbnRpbnVhdGlvbigqbGFzdFBhcmVudCkpCi0gICAgICAgICAgICBsYXN0UGFyZW50ID0g
ZW5kT2ZDb250aW51YXRpb25zKCpsYXN0UGFyZW50LT5sYXN0Q2hpbGQoKSktPnBhcmVudCgpOwot
ICAgICAgICBuZXh0U2libGluZyA9IGxhc3RQYXJlbnQtPm5leHRTaWJsaW5nKCk7Ci0gICAgfQot
Ci0gICAgLy8gQ2FzZSAzOiBub2RlIGhhcyBhbiBhY3R1YWwgbmV4dCBzaWJsaW5nCi0gICAgZWxz
ZSBpZiAoUmVuZGVyT2JqZWN0KiBucyA9IG1fcmVuZGVyZXItPm5leHRTaWJsaW5nKCkpCisgICAg
aWYgKFJlbmRlck9iamVjdCogbnMgPSBtX3JlbmRlcmVyLT5uZXh0U2libGluZygpKQogICAgICAg
ICBuZXh0U2libGluZyA9IG5zOwogCi0gICAgLy8gQ2FzZSA0OiBub2RlIGlzIGFuIGlubGluZSB3
aXRoIGEgY29udGludWF0aW9uLiBOZXh0IHNpYmxpbmcgaXMgdGhlIG5leHQgc2libGluZyBvZiB0
aGUgZW5kIAotICAgIC8vIG9mIHRoZSBjb250aW51YXRpb24gY2hhaW4uCi0gICAgZWxzZSBpZiAo
aXNJbmxpbmVXaXRoQ29udGludWF0aW9uKCptX3JlbmRlcmVyKSkKLSAgICAgICAgbmV4dFNpYmxp
bmcgPSBlbmRPZkNvbnRpbnVhdGlvbnMoKm1fcmVuZGVyZXIpLT5uZXh0U2libGluZygpOwotCi0g
ICAgLy8gQ2FzZSA1OiBub2RlIGhhcyBubyBuZXh0IHNpYmxpbmcsIGFuZCBpdHMgcGFyZW50IGlz
IGFuIGlubGluZSB3aXRoIGEgY29udGludWF0aW9uLgotICAgIGVsc2UgaWYgKGlzSW5saW5lV2l0
aENvbnRpbnVhdGlvbigqbV9yZW5kZXJlci0+cGFyZW50KCkpKSB7Ci0gICAgICAgIGF1dG8mIGNv
bnRpbnVhdGlvbiA9ICpkb3duY2FzdDxSZW5kZXJJbmxpbmU+KCptX3JlbmRlcmVyLT5wYXJlbnQo
KSkuY29udGludWF0aW9uKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBDYXNlIDVhOiBjb250aW51
YXRpb24gaXMgYSBibG9jayAtIGluIHRoaXMgY2FzZSB0aGUgYmxvY2sgaXRzZWxmIGlzIHRoZSBu
ZXh0IHNpYmxpbmcuCi0gICAgICAgIGlmIChpczxSZW5kZXJCbG9jaz4oY29udGludWF0aW9uKSkK
LSAgICAgICAgICAgIG5leHRTaWJsaW5nID0gJmNvbnRpbnVhdGlvbjsKLSAgICAgICAgLy8gQ2Fz
ZSA1YjogY29udGludWF0aW9uIGlzIGFuIGlubGluZSAtIGluIHRoaXMgY2FzZSB0aGUgaW5saW5l
J3MgZmlyc3QgY2hpbGQgaXMgdGhlIG5leHQgc2libGluZwotICAgICAgICBlbHNlCi0gICAgICAg
ICAgICBuZXh0U2libGluZyA9IGZpcnN0Q2hpbGRDb25zaWRlcmluZ0NvbnRpbnVhdGlvbihjb250
aW51YXRpb24pOwotICAgIH0KLQogICAgIGlmICghbmV4dFNpYmxpbmcpCiAgICAgICAgIHJldHVy
biBudWxscHRyOwogICAgIAogICAgIHJldHVybiBheE9iamVjdENhY2hlKCktPmdldE9yQ3JlYXRl
KG5leHRTaWJsaW5nKTsKIH0KLQotc3RhdGljIFJlbmRlckJveE1vZGVsT2JqZWN0KiBuZXh0Q29u
dGludWF0aW9uKFJlbmRlck9iamVjdCYgcmVuZGVyZXIpCi17Ci0gICAgaWYgKGlzPFJlbmRlcklu
bGluZT4ocmVuZGVyZXIpICYmICFyZW5kZXJlci5pc1JlcGxhY2VkKCkpCi0gICAgICAgIHJldHVy
biBkb3duY2FzdDxSZW5kZXJJbmxpbmU+KHJlbmRlcmVyKS5jb250aW51YXRpb24oKTsKLSAgICBp
ZiAoaXM8UmVuZGVyQmxvY2s+KHJlbmRlcmVyKSkKLSAgICAgICAgcmV0dXJuIGRvd25jYXN0PFJl
bmRlckJsb2NrPihyZW5kZXJlcikuaW5saW5lRWxlbWVudENvbnRpbnVhdGlvbigpOwotICAgIHJl
dHVybiBudWxscHRyOwotfQogICAgIAogUmVuZGVyT2JqZWN0KiBBY2Nlc3NpYmlsaXR5UmVuZGVy
T2JqZWN0OjpyZW5kZXJQYXJlbnRPYmplY3QoKSBjb25zdAogewpAQCAtNDIwLDQwICsyMzAsNiBA
QCBSZW5kZXJPYmplY3QqIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6CiAgICAgICAgIHJldHVy
biBudWxscHRyOwogCiAgICAgUmVuZGVyRWxlbWVudCogcGFyZW50ID0gbV9yZW5kZXJlci0+cGFy
ZW50KCk7Ci0KLSAgICAvLyBDYXNlIDE6IG5vZGUgaXMgYSBibG9jayBhbmQgaXMgYW4gaW5saW5l
J3MgY29udGludWF0aW9uLiBQYXJlbnQKLSAgICAvLyBpcyB0aGUgc3RhcnQgb2YgdGhlIGNvbnRp
bnVhdGlvbiBjaGFpbi4KLSAgICBSZW5kZXJJbmxpbmUqIHN0YXJ0T2ZDb250cyA9IG51bGxwdHI7
Ci0gICAgUmVuZGVyT2JqZWN0KiBmaXJzdENoaWxkID0gbnVsbHB0cjsKLSAgICBpZiAoaXM8UmVu
ZGVyQmxvY2s+KCptX3JlbmRlcmVyKSAmJiAoc3RhcnRPZkNvbnRzID0gc3RhcnRPZkNvbnRpbnVh
dGlvbnMoKm1fcmVuZGVyZXIpKSkKLSAgICAgICAgcGFyZW50ID0gc3RhcnRPZkNvbnRzOwotCi0g
ICAgLy8gQ2FzZSAyOiBub2RlJ3MgcGFyZW50IGlzIGFuIGlubGluZSB3aGljaCBpcyBzb21lIG5v
ZGUncyBjb250aW51YXRpb247IHBhcmVudCBpcyAKLSAgICAvLyB0aGUgZWFybGllc3Qgbm9kZSBp
biB0aGUgY29udGludWF0aW9uIGNoYWluLgotICAgIGVsc2UgaWYgKGlzPFJlbmRlcklubGluZT4o
cGFyZW50KSAmJiAoc3RhcnRPZkNvbnRzID0gc3RhcnRPZkNvbnRpbnVhdGlvbnMoKnBhcmVudCkp
KQotICAgICAgICBwYXJlbnQgPSBzdGFydE9mQ29udHM7Ci0gICAgCi0gICAgLy8gQ2FzZSAzOiBU
aGUgZmlyc3Qgc2libGluZyBpcyB0aGUgYmVnaW5uaW5nIG9mIGEgY29udGludWF0aW9uIGNoYWlu
LiBGaW5kIHRoZSBvcmlnaW4gb2YgdGhhdCBjb250aW51YXRpb24uCi0gICAgZWxzZSBpZiAocGFy
ZW50ICYmIChmaXJzdENoaWxkID0gcGFyZW50LT5maXJzdENoaWxkKCkpICYmIGZpcnN0Q2hpbGQt
Pm5vZGUoKSkgewotICAgICAgICAvLyBHZXQgdGhlIG5vZGUncyByZW5kZXJlciBhbmQgZm9sbG93
IHRoYXQgY29udGludWF0aW9uIGNoYWluIHVudGlsIHRoZSBmaXJzdCBjaGlsZCBpcyBmb3VuZAot
ICAgICAgICBSZW5kZXJPYmplY3QqIG5vZGVSZW5kZXJGaXJzdENoaWxkID0gZmlyc3RDaGlsZC0+
bm9kZSgpLT5yZW5kZXJlcigpOwotICAgICAgICB3aGlsZSAobm9kZVJlbmRlckZpcnN0Q2hpbGQg
IT0gZmlyc3RDaGlsZCkgewotICAgICAgICAgICAgZm9yIChSZW5kZXJPYmplY3QqIGNvbnRzVGVz
dCA9IG5vZGVSZW5kZXJGaXJzdENoaWxkOyBjb250c1Rlc3Q7IGNvbnRzVGVzdCA9IG5leHRDb250
aW51YXRpb24oKmNvbnRzVGVzdCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoY29udHNUZXN0ID09
IGZpcnN0Q2hpbGQpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gbm9kZVJlbmRlckZp
cnN0Q2hpbGQtPnBhcmVudCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBSZW5kZXJPYmplY3QqIHBhcmVu
dEZpcnN0Q2hpbGQgPSBwYXJlbnQtPmZpcnN0Q2hpbGQoKTsKLSAgICAgICAgICAgIGlmIChmaXJz
dENoaWxkID09IHBhcmVudEZpcnN0Q2hpbGQpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgICAgICBmaXJzdENoaWxkID0gcGFyZW50Rmlyc3RDaGlsZDsKLSAgICAgICAgICAgIGlmICgh
Zmlyc3RDaGlsZC0+bm9kZSgpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAg
bm9kZVJlbmRlckZpcnN0Q2hpbGQgPSBmaXJzdENoaWxkLT5ub2RlKCktPnJlbmRlcmVyKCk7Ci0g
ICAgICAgIH0KLSAgICB9Ci0gICAgICAgIAogICAgIHJldHVybiBwYXJlbnQ7CiB9CiAgICAgCkBA
IC01NTgsMTIgKzMzNCw5IEBAIEVsZW1lbnQqIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmFu
Y2gKICAgICAKICAgICBSZW5kZXJPYmplY3QqIGN1cnJlbnRSZW5kZXJlcjsKICAgICAKLSAgICAv
LyBTZWFyY2ggdXAgdGhlIHJlbmRlciB0cmVlIGZvciBhIFJlbmRlck9iamVjdCB3aXRoIGEgRE9N
IG5vZGUuICBEZWZlciB0byBhbiBlYXJsaWVyIGNvbnRpbnVhdGlvbiwgdGhvdWdoLgotICAgIGZv
ciAoY3VycmVudFJlbmRlcmVyID0gbV9yZW5kZXJlcjsgY3VycmVudFJlbmRlcmVyICYmICFjdXJy
ZW50UmVuZGVyZXItPm5vZGUoKTsgY3VycmVudFJlbmRlcmVyID0gY3VycmVudFJlbmRlcmVyLT5w
YXJlbnQoKSkgewotICAgICAgICBpZiAoY3VycmVudFJlbmRlcmVyLT5pc0Fub255bW91c0Jsb2Nr
KCkpIHsKLSAgICAgICAgICAgIGlmIChSZW5kZXJPYmplY3QqIGNvbnRpbnVhdGlvbiA9IGRvd25j
YXN0PFJlbmRlckJsb2NrPigqY3VycmVudFJlbmRlcmVyKS5jb250aW51YXRpb24oKSkKLSAgICAg
ICAgICAgICAgICByZXR1cm4gY2FjaGUtPmdldE9yQ3JlYXRlKGNvbnRpbnVhdGlvbiktPmFuY2hv
ckVsZW1lbnQoKTsKLSAgICAgICAgfQorICAgIC8vIFNlYXJjaCB1cCB0aGUgcmVuZGVyIHRyZWUg
Zm9yIGEgUmVuZGVyT2JqZWN0IHdpdGggYSBET00gbm9kZS4KKyAgICBmb3IgKGN1cnJlbnRSZW5k
ZXJlciA9IG1fcmVuZGVyZXI7IGN1cnJlbnRSZW5kZXJlciAmJiAhY3VycmVudFJlbmRlcmVyLT5u
b2RlKCk7IGN1cnJlbnRSZW5kZXJlciA9IGN1cnJlbnRSZW5kZXJlci0+cGFyZW50KCkpCisgICAg
ewogICAgIH0KICAgICAKICAgICAvLyBiYWlsIGlmIG5vbmUgZm91bmQKQEAgLTgwOSw5ICs1ODIs
NiBAQCBMYXlvdXRSZWN0IEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmJvCiAgICAgaWYgKCFv
YmopCiAgICAgICAgIHJldHVybiBMYXlvdXRSZWN0KCk7CiAgICAgCi0gICAgaWYgKG9iai0+bm9k
ZSgpKSAvLyBJZiB3ZSBhcmUgYSBjb250aW51YXRpb24sIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHRv
IHVzZSB0aGUgcHJpbWFyeSByZW5kZXJlci4KLSAgICAgICAgb2JqID0gb2JqLT5ub2RlKCktPnJl
bmRlcmVyKCk7Ci0gICAgCiAgICAgLy8gYWJzb2x1dGVGb2N1c1JpbmdRdWFkcyB3aWxsIHF1ZXJ5
IHRoZSBoaWVyYXJjaHkgYmVsb3cgdGhpcyBlbGVtZW50LCB3aGljaCBmb3IgbGFyZ2Ugd2VicGFn
ZXMgY2FuIGJlIHZlcnkgc2xvdy4KICAgICAvLyBGb3IgYSB3ZWIgYXJlYSwgd2hpY2ggd2lsbCBo
YXZlIHRoZSBtb3N0IGVsZW1lbnRzIG9mIGFueSBlbGVtZW50LCBhYnNvbHV0ZVF1YWRzIHNob3Vs
ZCBiZSB1c2VkLgogICAgIC8vIFdlIHNob3VsZCBhbHNvIHVzZSBhYnNvbHV0ZVF1YWRzIGZvciBT
VkcgZWxlbWVudHMsIG90aGVyd2lzZSB0cmFuc2Zvcm1zIHdvbid0IGJlIGFwcGxpZWQuCkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9vYmpjL0RPTVVJS2l0RXh0ZW5zaW9ucy5tbQo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9vYmpjL0RPTVVJS2l0RXh0ZW5zaW9u
cy5tbQkocmV2aXNpb24gMTgxMzI5KQorKysgU291cmNlL1dlYkNvcmUvYmluZGluZ3Mvb2JqYy9E
T01VSUtpdEV4dGVuc2lvbnMubW0JKHdvcmtpbmcgY29weSkKQEAgLTIwOCwxNCArMjA4LDE0IEBA
IC0gKEJPT0wpY29udGFpbnNPbmx5SW5saW5lT2JqZWN0cwogICAgIFJlbmRlck9iamVjdCogcmVu
ZGVyZXIgPSBjb3JlKHNlbGYpLT5yZW5kZXJlcigpOwogICAgIHJldHVybiByZW5kZXJlcgogICAg
ICAgICAmJiByZW5kZXJlci0+Y2hpbGRyZW5JbmxpbmUoKQotICAgICAgICAmJiAoaXM8UmVuZGVy
QmxvY2s+KCpyZW5kZXJlcikgJiYgIWRvd25jYXN0PFJlbmRlckJsb2NrPigqcmVuZGVyZXIpLmlu
bGluZUVsZW1lbnRDb250aW51YXRpb24oKSkKKyAgICAgICAgJiYgKGlzPFJlbmRlckJsb2NrPigq
cmVuZGVyZXIpCiAgICAgICAgICYmICFyZW5kZXJlci0+aXNUYWJsZSgpOwogfQogCiAtIChCT09M
KWlzU2VsZWN0YWJsZUJsb2NrCiB7CiAgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IGNvcmUo
c2VsZiktPnJlbmRlcmVyKCk7Ci0gICAgcmV0dXJuIHJlbmRlcmVyICYmIChpczxSZW5kZXJCbG9j
a0Zsb3c+KCpyZW5kZXJlcikgfHwgKGlzPFJlbmRlckJsb2NrPigqcmVuZGVyZXIpICYmIGRvd25j
YXN0PFJlbmRlckJsb2NrPigqcmVuZGVyZXIpLmlubGluZUVsZW1lbnRDb250aW51YXRpb24oKSAh
PSBuaWwpKTsKKyAgICByZXR1cm4gcmVuZGVyZXIgJiYgKGlzPFJlbmRlckJsb2NrRmxvdz4oKnJl
bmRlcmVyKSk7CiB9CiAKIC0gKERPTVJhbmdlICopcmFuZ2VPZkNvbnRhaW5pbmdQYXJhZ3JhcGgK
QEAgLTM0Miw3ICszNDIsNyBAQCAtIChpbnQpc3RydWN0dXJhbENvbXBsZXhpdHlDb250cmlidXRp
b24KICAgICAgICAgICAgIHJlc3VsdCA9IElOVF9NQVg7CiAgICAgICAgIH0gZWxzZSBpZiAocmVu
ZGVyZXItPmlzRW1wdHkoKSkgewogICAgICAgICAgICAgcmVzdWx0ID0gMDsKLSAgICAgICAgfSBl
bHNlIGlmIChpczxSZW5kZXJCbG9ja0Zsb3c+KCpyZW5kZXJlcikgfHwgKGlzPFJlbmRlckJsb2Nr
PigqcmVuZGVyZXIpICYmIGRvd25jYXN0PFJlbmRlckJsb2NrPigqcmVuZGVyZXIpLmlubGluZUVs
ZW1lbnRDb250aW51YXRpb24oKSkpIHsKKyAgICAgICAgfSBlbHNlIGlmIChpczxSZW5kZXJCbG9j
a0Zsb3c+KCpyZW5kZXJlcikpIHsKICAgICAgICAgICAgIEJPT0wgbm9Db3N0ID0gTk87CiAgICAg
ICAgICAgICBpZiAoaXM8UmVuZGVyQm94PigqcmVuZGVyZXIpKSB7CiAgICAgICAgICAgICAgICAg
UmVuZGVyQm94JiBhc0JveCA9IHJlbmRlcmVyLT5lbmNsb3NpbmdCb3goKTsKSW5kZXg6IFNvdXJj
ZS9XZWJDb3JlL3JlbmRlcmluZy9FbGxpcHNpc0JveC5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYkNvcmUvcmVuZGVyaW5nL0VsbGlwc2lzQm94LmNwcAkocmV2aXNpb24gMTgxMzI5KQorKysg
U291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL0VsbGlwc2lzQm94LmNwcAkod29ya2luZyBjb3B5KQpA
QCAtNDAsNyArNDAsNyBAQCBFbGxpcHNpc0JveDo6RWxsaXBzaXNCb3goUmVuZGVyQmxvY2tGbG93
CiB7CiB9CiAKLXZvaWQgRWxsaXBzaXNCb3g6OnBhaW50KFBhaW50SW5mbyYgcGFpbnRJbmZvLCBj
b25zdCBMYXlvdXRQb2ludCYgcGFpbnRPZmZzZXQsIExheW91dFVuaXQgbGluZVRvcCwgTGF5b3V0
VW5pdCBsaW5lQm90dG9tKQordm9pZCBFbGxpcHNpc0JveDo6cGFpbnRFbGxpcHNpc0JveChQYWlu
dEluZm8mIHBhaW50SW5mbywgY29uc3QgTGF5b3V0UG9pbnQmIHBhaW50T2Zmc2V0LCBMYXlvdXRV
bml0IGxpbmVUb3AsIExheW91dFVuaXQgbGluZUJvdHRvbSkKIHsKICAgICBHcmFwaGljc0NvbnRl
eHQqIGNvbnRleHQgPSBwYWludEluZm8uY29udGV4dDsKICAgICBjb25zdCBSZW5kZXJTdHlsZSYg
bGluZVN0eWxlID0gdGhpcy0+bGluZVN0eWxlKCk7CkBAIC0xMDQsNyArMTA0LDggQEAgdm9pZCBF
bGxpcHNpc0JveDo6cGFpbnRNYXJrdXBCb3goUGFpbnRJbgogICAgIExheW91dFBvaW50IGFkanVz
dGVkUGFpbnRPZmZzZXQgPSBwYWludE9mZnNldDsKICAgICBhZGp1c3RlZFBhaW50T2Zmc2V0Lm1v
dmUoeCgpICsgbV9sb2dpY2FsV2lkdGggLSBtYXJrdXBCb3gtPngoKSwKICAgICAgICAgeSgpICsg
c3R5bGUuZm9udE1ldHJpY3MoKS5hc2NlbnQoKSAtIChtYXJrdXBCb3gtPnkoKSArIG1hcmt1cEJv
eC0+bGluZVN0eWxlKCkuZm9udE1ldHJpY3MoKS5hc2NlbnQoKSkpOwotICAgIG1hcmt1cEJveC0+
cGFpbnQocGFpbnRJbmZvLCBhZGp1c3RlZFBhaW50T2Zmc2V0LCBsaW5lVG9wLCBsaW5lQm90dG9t
KTsKKyAgICBMaW5lQm94UGFpbnRJbmZvIGxpbmVCb3hQYWludEluZm87CisgICAgbWFya3VwQm94
LT5wYWludChwYWludEluZm8sIGFkanVzdGVkUGFpbnRPZmZzZXQsIGxpbmVUb3AsIGxpbmVCb3R0
b20sIGxpbmVCb3hQYWludEluZm8pOwogfQogCiBJbnRSZWN0IEVsbGlwc2lzQm94OjpzZWxlY3Rp
b25SZWN0KCkKQEAgLTE0MCw3ICsxNDEsOCBAQCB2b2lkIEVsbGlwc2lzQm94OjpwYWludFNlbGVj
dGlvbihHcmFwaGljCiAgICAgY29udGV4dC0+ZmlsbFJlY3Qoc25hcFJlY3RUb0RldmljZVBpeGVs
c1dpdGhXcml0aW5nRGlyZWN0aW9uKHNlbGVjdGlvblJlY3QsIHJlbmRlcmVyKCkuZG9jdW1lbnQo
KS5kZXZpY2VTY2FsZUZhY3RvcigpLCBydW4ubHRyKCkpLCBjLCBzdHlsZS5jb2xvclNwYWNlKCkp
OwogfQogCi1ib29sIEVsbGlwc2lzQm94Ojpub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVz
dCYgcmVxdWVzdCwgSGl0VGVzdFJlc3VsdCYgcmVzdWx0LCBjb25zdCBIaXRUZXN0TG9jYXRpb24m
IGxvY2F0aW9uSW5Db250YWluZXIsIGNvbnN0IExheW91dFBvaW50JiBhY2N1bXVsYXRlZE9mZnNl
dCwgTGF5b3V0VW5pdCBsaW5lVG9wLCBMYXlvdXRVbml0IGxpbmVCb3R0b20pCitib29sIEVsbGlw
c2lzQm94Ojpub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYgcmVxdWVzdCwgSGl0VGVz
dFJlc3VsdCYgcmVzdWx0LCBjb25zdCBIaXRUZXN0TG9jYXRpb24mIGxvY2F0aW9uSW5Db250YWlu
ZXIsIGNvbnN0IExheW91dFBvaW50JiBhY2N1bXVsYXRlZE9mZnNldCwgTGF5b3V0VW5pdCBsaW5l
VG9wLCBMYXlvdXRVbml0IGxpbmVCb3R0b20sCisgICAgSGl0VGVzdEFjdGlvbiBoaXRUZXN0QWN0
aW9uLCBMaW5lQm94SGl0VGVzdEluZm8mIGhpdFRlc3RJbmZvKQogewogICAgIExheW91dFBvaW50
IGFkanVzdGVkTG9jYXRpb24gPSBhY2N1bXVsYXRlZE9mZnNldCArIExheW91dFBvaW50KHRvcExl
ZnQoKSk7CiAKQEAgLTE0OSw3ICsxNTEsNyBAQCBib29sIEVsbGlwc2lzQm94Ojpub2RlQXRQb2lu
dChjb25zdCBIaXRUCiAgICAgICAgIGNvbnN0IFJlbmRlclN0eWxlJiBsaW5lU3R5bGUgPSB0aGlz
LT5saW5lU3R5bGUoKTsKICAgICAgICAgTGF5b3V0VW5pdCBtdHggPSBhZGp1c3RlZExvY2F0aW9u
LngoKSArIG1fbG9naWNhbFdpZHRoIC0gbWFya3VwQm94LT54KCk7CiAgICAgICAgIExheW91dFVu
aXQgbXR5ID0gYWRqdXN0ZWRMb2NhdGlvbi55KCkgKyBsaW5lU3R5bGUuZm9udE1ldHJpY3MoKS5h
c2NlbnQoKSAtIChtYXJrdXBCb3gtPnkoKSArIG1hcmt1cEJveC0+bGluZVN0eWxlKCkuZm9udE1l
dHJpY3MoKS5hc2NlbnQoKSk7Ci0gICAgICAgIGlmIChtYXJrdXBCb3gtPm5vZGVBdFBvaW50KHJl
cXVlc3QsIHJlc3VsdCwgbG9jYXRpb25JbkNvbnRhaW5lciwgTGF5b3V0UG9pbnQobXR4LCBtdHkp
LCBsaW5lVG9wLCBsaW5lQm90dG9tKSkgeworICAgICAgICBpZiAobWFya3VwQm94LT5ub2RlQXRQ
b2ludChyZXF1ZXN0LCByZXN1bHQsIGxvY2F0aW9uSW5Db250YWluZXIsIExheW91dFBvaW50KG10
eCwgbXR5KSwgbGluZVRvcCwgbGluZUJvdHRvbSwgaGl0VGVzdEFjdGlvbiwgaGl0VGVzdEluZm8p
KSB7CiAgICAgICAgICAgICBibG9ja0Zsb3coKS51cGRhdGVIaXRUZXN0UmVzdWx0KHJlc3VsdCwg
bG9jYXRpb25JbkNvbnRhaW5lci5wb2ludCgpIC0gTGF5b3V0U2l6ZShtdHgsIG10eSkpOwogICAg
ICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3Jl
bmRlcmluZy9FbGxpcHNpc0JveC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRl
cmluZy9FbGxpcHNpc0JveC5oCShyZXZpc2lvbiAxODEzMjkpCisrKyBTb3VyY2UvV2ViQ29yZS9y
ZW5kZXJpbmcvRWxsaXBzaXNCb3guaAkod29ya2luZyBjb3B5KQpAQCAtMzEsOCArMzEsOCBAQCBj
bGFzcyBIaXRUZXN0UmVzdWx0OwogY2xhc3MgRWxsaXBzaXNCb3ggZmluYWwgOiBwdWJsaWMgSW5s
aW5lRWxlbWVudEJveCB7CiBwdWJsaWM6CiAgICAgRWxsaXBzaXNCb3goUmVuZGVyQmxvY2tGbG93
JiwgY29uc3QgQXRvbWljU3RyaW5nJiBlbGxpcHNpc1N0ciwgSW5saW5lRmxvd0JveCogcGFyZW50
LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCB5LCBib29sIGZpcnN0TGluZSwgYm9vbCBpc1Zl
cnRpY2FsLCBJbmxpbmVCb3gqIG1hcmt1cEJveCk7Ci0gICAgdmlydHVhbCB2b2lkIHBhaW50KFBh
aW50SW5mbyYsIGNvbnN0IExheW91dFBvaW50JiwgTGF5b3V0VW5pdCBsaW5lVG9wLCBMYXlvdXRV
bml0IGxpbmVCb3R0b20pIG92ZXJyaWRlOwotICAgIHZpcnR1YWwgYm9vbCBub2RlQXRQb2ludChj
b25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBjb25zdCBIaXRUZXN0TG9jYXRp
b24mIGxvY2F0aW9uSW5Db250YWluZXIsIGNvbnN0IExheW91dFBvaW50JiBhY2N1bXVsYXRlZE9m
ZnNldCwgTGF5b3V0VW5pdCBsaW5lVG9wLCBMYXlvdXRVbml0IGxpbmVCb3R0b20pIG92ZXJyaWRl
OworICAgIHZvaWQgcGFpbnRFbGxpcHNpc0JveChQYWludEluZm8mLCBjb25zdCBMYXlvdXRQb2lu
dCYsIExheW91dFVuaXQgbGluZVRvcCwgTGF5b3V0VW5pdCBsaW5lQm90dG9tKTsKKyAgICB2aXJ0
dWFsIGJvb2wgbm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVzdWx0
JiwgY29uc3QgSGl0VGVzdExvY2F0aW9uJiBsb2NhdGlvbkluQ29udGFpbmVyLCBjb25zdCBMYXlv
dXRQb2ludCYgYWNjdW11bGF0ZWRPZmZzZXQsIExheW91dFVuaXQgbGluZVRvcCwgTGF5b3V0VW5p
dCBsaW5lQm90dG9tLCBIaXRUZXN0QWN0aW9uLCBMaW5lQm94SGl0VGVzdEluZm8mKSBvdmVycmlk
ZTsKICAgICB2b2lkIHNldFNlbGVjdGlvblN0YXRlKFJlbmRlck9iamVjdDo6U2VsZWN0aW9uU3Rh
dGUgcykgeyBtX3NlbGVjdGlvblN0YXRlID0gczsgfQogICAgIEludFJlY3Qgc2VsZWN0aW9uUmVj
dCgpOwogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lQm94LmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lQm94LmNwcAkocmV2aXNp
b24gMTgxMzI5KQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL0lubGluZUJveC5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTI2LDcgKzI2LDcgQEAKICNpbmNsdWRlICJJbmxpbmVGbG93Qm94Lmgi
CiAjaW5jbHVkZSAiUGFnZS5oIgogI2luY2x1ZGUgIlBhaW50SW5mby5oIgotI2luY2x1ZGUgIlJl
bmRlckJsb2NrRmxvdy5oIgorI2luY2x1ZGUgIlJlbmRlclZpZXcuaCIKICNpbmNsdWRlICJSZW5k
ZXJMaW5lQnJlYWsuaCIKICNpbmNsdWRlICJSb290SW5saW5lQm94LmgiCiAKSW5kZXg6IFNvdXJj
ZS9XZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVCb3guaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9yZW5kZXJpbmcvSW5saW5lQm94LmgJKHJldmlzaW9uIDE4MTMyOSkKKysrIFNvdXJjZS9X
ZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVCb3guaAkod29ya2luZyBjb3B5KQpAQCAtMzIsNiArMzIs
MjYgQEAgY2xhc3MgSGl0VGVzdFJlcXVlc3Q7CiBjbGFzcyBIaXRUZXN0UmVzdWx0OwogY2xhc3Mg
Um9vdElubGluZUJveDsKIAorLy8gRXZlbiB0aG91Z2ggdGhlc2UgdHdvIHN0cnVjdHMgYXJlIGlk
ZW50aWNhbCBmb3Igbm93LCB0aGV5IGNvdWxkIGNoYW5nZSBpbiB0aGUgZnV0dXJlLiBLZWVwIHRo
ZW0KKy8vIGRpc3RpbmN0Lgorc3RydWN0IExpbmVCb3hQYWludEluZm8KK3sKKyAgICBMaW5lQm94
UGFpbnRJbmZvKCkKKyAgICA6YW5vbnltb3VzSW5saW5lQmxvY2soMCkKKyAgICB7IH0KKyAKKyAg
ICBSZW5kZXJCbG9jayogYW5vbnltb3VzSW5saW5lQmxvY2s7Cit9OworCitzdHJ1Y3QgTGluZUJv
eEhpdFRlc3RJbmZvCit7CisgICAgTGluZUJveEhpdFRlc3RJbmZvKCkKKyAgICA6YW5vbnltb3Vz
SW5saW5lQmxvY2soMCkKKyAgICB7IH0KKyAgICAKKyAgICBSZW5kZXJCbG9jayogYW5vbnltb3Vz
SW5saW5lQmxvY2s7Cit9OworIAogLy8gSW5saW5lQm94IHJlcHJlc2VudHMgYSByZWN0YW5nbGUg
dGhhdCBvY2N1cnMgb24gYSBsaW5lLiAgSXQgY29ycmVzcG9uZHMgdG8KIC8vIHNvbWUgUmVuZGVy
T2JqZWN0IChpLmUuLCBpdCByZXByZXNlbnRzIGEgcG9ydGlvbiBvZiB0aGF0IFJlbmRlck9iamVj
dCkuCiBjbGFzcyBJbmxpbmVCb3ggewpAQCAtNzAsOCArOTAsOCBAQCBwdWJsaWM6CiAgICAgICAg
ICAgICBhZGp1c3RQb3NpdGlvbihkZWx0YSwgMCk7CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lk
IHBhaW50KFBhaW50SW5mbyYsIGNvbnN0IExheW91dFBvaW50JiwgTGF5b3V0VW5pdCBsaW5lVG9w
LCBMYXlvdXRVbml0IGxpbmVCb3R0b20pID0gMDsKLSAgICB2aXJ0dWFsIGJvb2wgbm9kZUF0UG9p
bnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVzdWx0JiwgY29uc3QgSGl0VGVzdExv
Y2F0aW9uJiBsb2NhdGlvbkluQ29udGFpbmVyLCBjb25zdCBMYXlvdXRQb2ludCYgYWNjdW11bGF0
ZWRPZmZzZXQsIExheW91dFVuaXQgbGluZVRvcCwgTGF5b3V0VW5pdCBsaW5lQm90dG9tKSA9IDA7
CisgICAgdmlydHVhbCB2b2lkIHBhaW50KFBhaW50SW5mbyYsIGNvbnN0IExheW91dFBvaW50Jiwg
TGF5b3V0VW5pdCBsaW5lVG9wLCBMYXlvdXRVbml0IGxpbmVCb3R0b20sIExpbmVCb3hQYWludElu
Zm8mKSA9IDA7CisgICAgdmlydHVhbCBib29sIG5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1
ZXN0JiwgSGl0VGVzdFJlc3VsdCYsIGNvbnN0IEhpdFRlc3RMb2NhdGlvbiYgbG9jYXRpb25JbkNv
bnRhaW5lciwgY29uc3QgTGF5b3V0UG9pbnQmIGFjY3VtdWxhdGVkT2Zmc2V0LCBMYXlvdXRVbml0
IGxpbmVUb3AsIExheW91dFVuaXQgbGluZUJvdHRvbSwgSGl0VGVzdEFjdGlvbiwgTGluZUJveEhp
dFRlc3RJbmZvJikgPSAwOwogCiAjaWYgRU5BQkxFKFRSRUVfREVCVUdHSU5HKQogICAgIHZvaWQg
c2hvd05vZGVUcmVlRm9yVGhpcygpIGNvbnN0OwpJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVy
aW5nL0lubGluZUVsZW1lbnRCb3guY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3Jl
bmRlcmluZy9JbmxpbmVFbGVtZW50Qm94LmNwcAkocmV2aXNpb24gMTgxMzI5KQorKysgU291cmNl
L1dlYkNvcmUvcmVuZGVyaW5nL0lubGluZUVsZW1lbnRCb3guY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC02Myw5ICs2MywyNyBAQCB2b2lkIElubGluZUVsZW1lbnRCb3g6OmF0dGFjaExpbmUoKQogICAg
ICAgICBkb3duY2FzdDxSZW5kZXJMaW5lQnJlYWs+KHJlbmRlcmVyKCkpLnNldElubGluZUJveFdy
YXBwZXIodGhpcyk7CiB9CiAKLXZvaWQgSW5saW5lRWxlbWVudEJveDo6cGFpbnQoUGFpbnRJbmZv
JiBwYWludEluZm8sIGNvbnN0IExheW91dFBvaW50JiBwYWludE9mZnNldCwgTGF5b3V0VW5pdCAv
KiBsaW5lVG9wICovLCBMYXlvdXRVbml0IC8qbGluZUJvdHRvbSovKQordm9pZCBJbmxpbmVFbGVt
ZW50Qm94OjpwYWludChQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgTGF5b3V0UG9pbnQmIHBh
aW50T2Zmc2V0LCBMYXlvdXRVbml0IC8qIGxpbmVUb3AgKi8sIExheW91dFVuaXQgLypsaW5lQm90
dG9tKi8sIExpbmVCb3hQYWludEluZm8mIGxpbmVCb3hQYWludEluZm8pCiB7Ci0gICAgaWYgKCFw
YWludEluZm8uc2hvdWxkUGFpbnRXaXRoaW5Sb290KHJlbmRlcmVyKCkpIHx8IChwYWludEluZm8u
cGhhc2UgIT0gUGFpbnRQaGFzZUZvcmVncm91bmQgJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50
UGhhc2VTZWxlY3Rpb24pKQorICAgIGlmICghcGFpbnRJbmZvLnNob3VsZFBhaW50V2l0aGluUm9v
dChyZW5kZXJlcigpKSkKKyAgICAgICAgcmV0dXJuOworIAorICAgIFJlbmRlckJsb2NrKiBhbm9u
eW1vdXNJbmxpbmVCbG9jayA9IGxpbmVCb3hQYWludEluZm8uYW5vbnltb3VzSW5saW5lQmxvY2s7
CisgICAgaWYgKGFub255bW91c0lubGluZUJsb2NrID09ICZyZW5kZXJlcigpKSB7CisgICAgICAg
IC8vIFRyZWF0IHBhaW50aW5nIG9mIGEgc3BlY2lhbCBpbmxpbmUtYmxvY2sgbGluZSBsaWtlIHRo
ZSBwYWludGluZyBvZiBhIG5vcm1hbCBibG9jayBhbmQgZ28gdGhyb3VnaCBhbGwgcGhhc2VzLgor
ICAgICAgICBQYWludFBoYXNlIG5ld1BoYXNlID0gKHBhaW50SW5mby5waGFzZSA9PSBQYWludFBo
YXNlQ2hpbGRPdXRsaW5lcykgPyBQYWludFBoYXNlT3V0bGluZSA6IHBhaW50SW5mby5waGFzZTsK
KyAgICAgICAgbmV3UGhhc2UgPSAobmV3UGhhc2UgPT0gUGFpbnRQaGFzZUNoaWxkQmxvY2tCYWNr
Z3JvdW5kcykgPyBQYWludFBoYXNlQ2hpbGRCbG9ja0JhY2tncm91bmQgOiBuZXdQaGFzZTsKKyAK
KyAgICAgICAgLy8gV2UgZG9uJ3QgcGFpbnQgb3VyIG93biBiYWNrZ3JvdW5kLCBidXQgd2UgZG8g
bGV0IHRoZSBjaGlsZCBwYWludCBpdHMgYmFja2dyb3VuZC4KKyAgICAgICAgUGFpbnRJbmZvIGlu
Zm8ocGFpbnRJbmZvKTsKKyAgICAgICAgaW5mby5waGFzZSA9IG5ld1BoYXNlOworICAgICAgICBp
bmZvLnVwZGF0ZVN1YnRyZWVQYWludFJvb3RGb3JDaGlsZHJlbigmcmVuZGVyZXIoKSk7CisgICAg
ICAgIGlmICghYW5vbnltb3VzSW5saW5lQmxvY2stPmhhc1NlbGZQYWludGluZ0xheWVyKCkpCisg
ICAgICAgICAgICBhbm9ueW1vdXNJbmxpbmVCbG9jay0+cGFpbnQoaW5mbywgcGFpbnRPZmZzZXQp
OworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIGlmIChwYWludEluZm8ucGhhc2Ug
IT0gUGFpbnRQaGFzZUZvcmVncm91bmQgJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VT
ZWxlY3Rpb24pCiAgICAgICAgIHJldHVybjsKIAogICAgIExheW91dFBvaW50IGNoaWxkUG9pbnQg
PSBwYWludE9mZnNldDsKQEAgLTkxLDkgKzEwOSwxNyBAQCB2b2lkIElubGluZUVsZW1lbnRCb3g6
OnBhaW50KFBhaW50SW5mbyYgCiAgICAgfQogfQogCi1ib29sIElubGluZUVsZW1lbnRCb3g6Om5v
ZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiByZXF1ZXN0LCBIaXRUZXN0UmVzdWx0JiBy
ZXN1bHQsIGNvbnN0IEhpdFRlc3RMb2NhdGlvbiYgbG9jYXRpb25JbkNvbnRhaW5lciwgY29uc3Qg
TGF5b3V0UG9pbnQmIGFjY3VtdWxhdGVkT2Zmc2V0LCBMYXlvdXRVbml0IC8qIGxpbmVUb3AgKi8s
IExheW91dFVuaXQgLypsaW5lQm90dG9tKi8pCitib29sIElubGluZUVsZW1lbnRCb3g6Om5vZGVB
dFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiByZXF1ZXN0LCBIaXRUZXN0UmVzdWx0JiByZXN1
bHQsIGNvbnN0IEhpdFRlc3RMb2NhdGlvbiYgbG9jYXRpb25JbkNvbnRhaW5lciwgY29uc3QgTGF5
b3V0UG9pbnQmIGFjY3VtdWxhdGVkT2Zmc2V0LCBMYXlvdXRVbml0IC8qIGxpbmVUb3AgKi8sIExh
eW91dFVuaXQgLypsaW5lQm90dG9tKi8sIEhpdFRlc3RBY3Rpb24gaGl0VGVzdEFjdGlvbiwgTGlu
ZUJveEhpdFRlc3RJbmZvJiBoaXRUZXN0SW5mbykKIHsKLSAgICAvLyBIaXQgdGVzdCBhbGwgcGhh
c2VzIG9mIHJlcGxhY2VkIGVsZW1lbnRzIGF0b21pY2FsbHksIGFzIHRob3VnaCB0aGUgcmVwbGFj
ZWQgZWxlbWVudCBlc3RhYmxpc2hlZCBpdHMKKyAgICAvLyBJZiB3ZSBhcmUgYW4gYW5vbnltb3Vz
IGlubGluZSBibG9jaywgaG9ub3IgaGl0IHRlc3QgcGhhc2VzLgorICAgIGlmIChoaXRUZXN0SW5m
by5hbm9ueW1vdXNJbmxpbmVCbG9jayA9PSAmcmVuZGVyZXIoKSkgeworICAgICAgICBIaXRUZXN0
QWN0aW9uIGNoaWxkSGl0VGVzdCA9IGhpdFRlc3RBY3Rpb247CisgICAgICAgIGlmIChoaXRUZXN0
QWN0aW9uID09IEhpdFRlc3RDaGlsZEJsb2NrQmFja2dyb3VuZHMpCisgICAgICAgICAgICBjaGls
ZEhpdFRlc3QgPSBIaXRUZXN0Q2hpbGRCbG9ja0JhY2tncm91bmQ7CisgICAgICAgIHJldHVybiBo
aXRUZXN0SW5mby5hbm9ueW1vdXNJbmxpbmVCbG9jay0+bm9kZUF0UG9pbnQocmVxdWVzdCwgcmVz
dWx0LCBsb2NhdGlvbkluQ29udGFpbmVyLCBhY2N1bXVsYXRlZE9mZnNldCwgY2hpbGRIaXRUZXN0
KTsKKyAgICB9CisgCisgICAgLy8gT3RoZXJ3aXNlIGhpdCB0ZXN0IGFsbCBwaGFzZXMgb2YgcmVw
bGFjZWQgZWxlbWVudHMgYXRvbWljYWxseSwgYXMgdGhvdWdoIHRoZSByZXBsYWNlZCBlbGVtZW50
IGVzdGFibGlzaGVkIGl0cwogICAgIC8vIG93biBzdGFja2luZyBjb250ZXh0LiAgKFNlZSBBcHBl
bmRpeCBFLjIsIHNlY3Rpb24gNi40IG9uIGlubGluZSBibG9jay90YWJsZSBlbGVtZW50cyBpbiB0
aGUgQ1NTMi4xCiAgICAgLy8gc3BlY2lmaWNhdGlvbi4pCiAgICAgTGF5b3V0UG9pbnQgY2hpbGRQ
b2ludCA9IGFjY3VtdWxhdGVkT2Zmc2V0OwpJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5n
L0lubGluZUVsZW1lbnRCb3guaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJp
bmcvSW5saW5lRWxlbWVudEJveC5oCShyZXZpc2lvbiAxODEzMjkpCisrKyBTb3VyY2UvV2ViQ29y
ZS9yZW5kZXJpbmcvSW5saW5lRWxlbWVudEJveC5oCSh3b3JraW5nIGNvcHkpCkBAIC00OCw4ICs0
OCw4IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIHZvaWQgZXh0cmFjdExpbmUoKSBvdmVycmlkZSBm
aW5hbDsKICAgICB2aXJ0dWFsIHZvaWQgYXR0YWNoTGluZSgpIG92ZXJyaWRlIGZpbmFsOwogCi0g
ICAgdmlydHVhbCB2b2lkIHBhaW50KFBhaW50SW5mbyYsIGNvbnN0IExheW91dFBvaW50JiwgTGF5
b3V0VW5pdCBsaW5lVG9wLCBMYXlvdXRVbml0IGxpbmVCb3R0b20pIG92ZXJyaWRlOwotICAgIHZp
cnR1YWwgYm9vbCBub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1
bHQmLCBjb25zdCBIaXRUZXN0TG9jYXRpb24mIGxvY2F0aW9uSW5Db250YWluZXIsIGNvbnN0IExh
eW91dFBvaW50JiBhY2N1bXVsYXRlZE9mZnNldCwgTGF5b3V0VW5pdCBsaW5lVG9wLCBMYXlvdXRV
bml0IGxpbmVCb3R0b20pIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBwYWludChQYWludElu
Zm8mLCBjb25zdCBMYXlvdXRQb2ludCYsIExheW91dFVuaXQgbGluZVRvcCwgTGF5b3V0VW5pdCBs
aW5lQm90dG9tLCBMaW5lQm94UGFpbnRJbmZvJikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBib29s
IG5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiwgSGl0VGVzdFJlc3VsdCYsIGNvbnN0
IEhpdFRlc3RMb2NhdGlvbiYgbG9jYXRpb25JbkNvbnRhaW5lciwgY29uc3QgTGF5b3V0UG9pbnQm
IGFjY3VtdWxhdGVkT2Zmc2V0LCBMYXlvdXRVbml0IGxpbmVUb3AsIExheW91dFVuaXQgbGluZUJv
dHRvbSwgSGl0VGVzdEFjdGlvbiwgTGluZUJveEhpdFRlc3RJbmZvJikgb3ZlcnJpZGU7CiAKIHBy
aXZhdGU6CiAgICAgdmlydHVhbCBib29sIGlzSW5saW5lRWxlbWVudEJveCgpIGNvbnN0IG92ZXJy
aWRlIGZpbmFsIHsgcmV0dXJuIHRydWU7IH0KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmlu
Zy9JbmxpbmVGbG93Qm94LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJp
bmcvSW5saW5lRmxvd0JveC5jcHAJKHJldmlzaW9uIDE4MTMyOSkKKysrIFNvdXJjZS9XZWJDb3Jl
L3JlbmRlcmluZy9JbmxpbmVGbG93Qm94LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzE1LDcgKzMx
NSw3IEBAIHZvaWQgSW5saW5lRmxvd0JveDo6ZGV0ZXJtaW5lU3BhY2luZ0ZvckYKICAgICAgICAg
Ly8gQ2hlY2sgdG8gc2VlIGlmIGFsbCBpbml0aWFsIGxpbmVzIGFyZSB1bmNvbnN0cnVjdGVkLiAg
SWYgc28sIHRoZW4KICAgICAgICAgLy8gd2Uga25vdyB0aGUgaW5saW5lIGJlZ2FuIG9uIHRoaXMg
bGluZSAodW5sZXNzIHdlIGFyZSBhIGNvbnRpbnVhdGlvbikuCiAgICAgICAgIGNvbnN0IGF1dG8m
IGxpbmVCb3hMaXN0ID0gaW5saW5lRmxvdy5saW5lQm94ZXMoKTsKLSAgICAgICAgaWYgKCFsaW5l
Qm94TGlzdC5maXJzdExpbmVCb3goKS0+aXNDb25zdHJ1Y3RlZCgpICYmICFyZW5kZXJlcigpLmlz
SW5saW5lRWxlbWVudENvbnRpbnVhdGlvbigpKSB7CisgICAgICAgIGlmICghbGluZUJveExpc3Qu
Zmlyc3RMaW5lQm94KCktPmlzQ29uc3RydWN0ZWQoKSkgewogI2lmIEVOQUJMRShDU1NfQk9YX0RF
Q09SQVRJT05fQlJFQUspCiAgICAgICAgICAgICBpZiAocmVuZGVyZXIoKS5zdHlsZSgpLmJveERl
Y29yYXRpb25CcmVhaygpID09IERDTE9ORSkKICAgICAgICAgICAgICAgICBpbmNsdWRlTGVmdEVk
Z2UgPSBpbmNsdWRlUmlnaHRFZGdlID0gdHJ1ZTsKQEAgLTM0MiwxMSArMzQyLDExIEBAIHZvaWQg
SW5saW5lRmxvd0JveDo6ZGV0ZXJtaW5lU3BhY2luZ0ZvckYKICNlbmRpZgogICAgICAgICAgICAg
aWYgKGx0cikgewogICAgICAgICAgICAgICAgIGlmICghbmV4dExpbmVCb3goKQotICAgICAgICAg
ICAgICAgICAgICAmJiAoKGxhc3RMaW5lIHx8IGlzTGFzdE9iamVjdE9uTGluZSkgJiYgIWlubGlu
ZUZsb3cuY29udGludWF0aW9uKCkpKQorICAgICAgICAgICAgICAgICAgICAmJiAoKGxhc3RMaW5l
IHx8IGlzTGFzdE9iamVjdE9uTGluZSkpKQogICAgICAgICAgICAgICAgICAgICBpbmNsdWRlUmln
aHRFZGdlID0gdHJ1ZTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYg
KCghcHJldkxpbmVCb3goKSB8fCBwcmV2TGluZUJveCgpLT5pc0NvbnN0cnVjdGVkKCkpCi0gICAg
ICAgICAgICAgICAgICAgICYmICgobGFzdExpbmUgfHwgaXNMYXN0T2JqZWN0T25MaW5lKSAmJiAh
aW5saW5lRmxvdy5jb250aW51YXRpb24oKSkpCisgICAgICAgICAgICAgICAgICAgICYmICgobGFz
dExpbmUgfHwgaXNMYXN0T2JqZWN0T25MaW5lKSkpCiAgICAgICAgICAgICAgICAgICAgIGluY2x1
ZGVMZWZ0RWRnZSA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTY3Niw2ICs2
NzYsMTAgQEAgdm9pZCBJbmxpbmVGbG93Qm94OjpwbGFjZUJveGVzSW5CbG9ja0RpcgogICAgICAg
ICAgICAgbmV3TG9naWNhbFRvcEluY2x1ZGluZ01hcmdpbnMgPSBuZXdMb2dpY2FsVG9wOwogICAg
ICAgICAgICAgTGF5b3V0VW5pdCBvdmVyU2lkZU1hcmdpbiA9IGNoaWxkLT5pc0hvcml6b250YWwo
KSA/IGJveC5tYXJnaW5Ub3AoKSA6IGJveC5tYXJnaW5SaWdodCgpOwogICAgICAgICAgICAgTGF5
b3V0VW5pdCB1bmRlclNpZGVNYXJnaW4gPSBjaGlsZC0+aXNIb3Jpem9udGFsKCkgPyBib3gubWFy
Z2luQm90dG9tKCkgOiBib3gubWFyZ2luTGVmdCgpOworICAgICAgICAgICAgaWYgKGNoaWxkLT5y
ZW5kZXJlcigpLmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkgeworICAgICAgICAgICAgICAgIG92
ZXJTaWRlTWFyZ2luID0gMDsKKyAgICAgICAgICAgICAgICB1bmRlclNpZGVNYXJnaW4gPSAwOwor
ICAgICAgICAgICAgfQogICAgICAgICAgICAgbmV3TG9naWNhbFRvcCArPSBvdmVyU2lkZU1hcmdp
bjsKICAgICAgICAgICAgIGJveEhlaWdodEluY2x1ZGluZ01hcmdpbnMgKz0gb3ZlclNpZGVNYXJn
aW4gKyB1bmRlclNpZGVNYXJnaW47CiAgICAgICAgIH0KQEAgLTEwMzIsNyArMTAzNiw4IEBAIHZv
aWQgSW5saW5lRmxvd0JveDo6c2V0T3ZlcmZsb3dGcm9tTG9naWMKICAgICBzZXRWaXN1YWxPdmVy
Zmxvdyh2aXN1YWxPdmVyZmxvdywgbGluZVRvcCwgbGluZUJvdHRvbSk7CiB9CiAKLWJvb2wgSW5s
aW5lRmxvd0JveDo6bm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmIHJlcXVlc3QsIEhp
dFRlc3RSZXN1bHQmIHJlc3VsdCwgY29uc3QgSGl0VGVzdExvY2F0aW9uJiBsb2NhdGlvbkluQ29u
dGFpbmVyLCBjb25zdCBMYXlvdXRQb2ludCYgYWNjdW11bGF0ZWRPZmZzZXQsIExheW91dFVuaXQg
bGluZVRvcCwgTGF5b3V0VW5pdCBsaW5lQm90dG9tKQorYm9vbCBJbmxpbmVGbG93Qm94Ojpub2Rl
QXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYgcmVxdWVzdCwgSGl0VGVzdFJlc3VsdCYgcmVz
dWx0LCBjb25zdCBIaXRUZXN0TG9jYXRpb24mIGxvY2F0aW9uSW5Db250YWluZXIsIGNvbnN0IExh
eW91dFBvaW50JiBhY2N1bXVsYXRlZE9mZnNldCwgTGF5b3V0VW5pdCBsaW5lVG9wLCBMYXlvdXRV
bml0IGxpbmVCb3R0b20sCisgICAgSGl0VGVzdEFjdGlvbiBoaXRUZXN0QWN0aW9uLCBMaW5lQm94
SGl0VGVzdEluZm8mIGhpdFRlc3RJbmZvKQogewogICAgIExheW91dFJlY3Qgb3ZlcmZsb3dSZWN0
KHZpc3VhbE92ZXJmbG93UmVjdChsaW5lVG9wLCBsaW5lQm90dG9tKSk7CiAgICAgZmxpcEZvcldy
aXRpbmdNb2RlKG92ZXJmbG93UmVjdCk7CkBAIC0xMDY0LDcgKzEwNjksNyBAQCBib29sIElubGlu
ZUZsb3dCb3g6Om5vZGVBdFBvaW50KGNvbnN0IEhpCiAgICAgICAgICAgICAgICAgfQogICAgICAg
ICAgICAgICAgIGN1bGxlZFBhcmVudCA9IG5ld1BhcmVudDsKICAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIGlmIChjaGlsZC0+bm9kZUF0UG9pbnQocmVxdWVzdCwgcmVzdWx0LCBsb2NhdGlvbklu
Q29udGFpbmVyLCBhY2N1bXVsYXRlZE9mZnNldCwgbGluZVRvcCwgbGluZUJvdHRvbSkpIHsKKyAg
ICAgICAgICAgIGlmIChjaGlsZC0+bm9kZUF0UG9pbnQocmVxdWVzdCwgcmVzdWx0LCBsb2NhdGlv
bkluQ29udGFpbmVyLCBhY2N1bXVsYXRlZE9mZnNldCwgbGluZVRvcCwgbGluZUJvdHRvbSwgaGl0
VGVzdEFjdGlvbiwgaGl0VGVzdEluZm8pKSB7CiAgICAgICAgICAgICAgICAgcmVuZGVyZXIoKS51
cGRhdGVIaXRUZXN0UmVzdWx0KHJlc3VsdCwgbG9jYXRpb25JbkNvbnRhaW5lci5wb2ludCgpIC0g
dG9MYXlvdXRTaXplKGFjY3VtdWxhdGVkT2Zmc2V0KSk7CiAgICAgICAgICAgICAgICAgcmV0dXJu
IHRydWU7CiAgICAgICAgICAgICB9CkBAIC0xMTIzLDggKzExMjgsMTIgQEAgYm9vbCBJbmxpbmVG
bG93Qm94Ojpub2RlQXRQb2ludChjb25zdCBIaQogICAgIHJldHVybiBmYWxzZTsKIH0KIAotdm9p
ZCBJbmxpbmVGbG93Qm94OjpwYWludChQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgTGF5b3V0
UG9pbnQmIHBhaW50T2Zmc2V0LCBMYXlvdXRVbml0IGxpbmVUb3AsIExheW91dFVuaXQgbGluZUJv
dHRvbSkKK3ZvaWQgSW5saW5lRmxvd0JveDo6cGFpbnQoUGFpbnRJbmZvJiBwYWludEluZm8sIGNv
bnN0IExheW91dFBvaW50JiBwYWludE9mZnNldCwgTGF5b3V0VW5pdCBsaW5lVG9wLCBMYXlvdXRV
bml0IGxpbmVCb3R0b20sIExpbmVCb3hQYWludEluZm8mIGxpbmVCb3hQYWludEluZm8pCiB7Cisg
ICAgLy8gQXMgbG9uZyBhcyB3ZSBkb24ndCBoYXZlIGFuIGFub255bW91cyBpbmxpbmUgYmxvY2sg
b24gb3VyIGxpbmUsIHdlIHJlc3RyaWN0IG91ciBwYWludGluZyBvbmx5IHRvIGEgZmV3IHBoYXNl
cy4KKyAgICBpZiAoIWxpbmVCb3hQYWludEluZm8uYW5vbnltb3VzSW5saW5lQmxvY2sgJiYgKHBh
aW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlRm9yZWdyb3VuZCAmJiBwYWludEluZm8ucGhhc2Ug
IT0gUGFpbnRQaGFzZVNlbGVjdGlvbiAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZU91
dGxpbmUgJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VTZWxmT3V0bGluZSAmJiBwYWlu
dEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZUNoaWxkT3V0bGluZXMgJiYgcGFpbnRJbmZvLnBoYXNl
ICE9IFBhaW50UGhhc2VUZXh0Q2xpcCAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZU1h
c2spKQorICAgICAgICByZXR1cm47CisgCiAgICAgTGF5b3V0UmVjdCBvdmVyZmxvd1JlY3Qodmlz
dWFsT3ZlcmZsb3dSZWN0KGxpbmVUb3AsIGxpbmVCb3R0b20pKTsKICAgICBvdmVyZmxvd1JlY3Qu
aW5mbGF0ZShyZW5kZXJlcigpLm1heGltYWxPdXRsaW5lU2l6ZShwYWludEluZm8ucGhhc2UpKTsK
ICAgICBmbGlwRm9yV3JpdGluZ01vZGUob3ZlcmZsb3dSZWN0KTsKQEAgLTExMzksNDAgKzExNDgs
MTYgQEAgdm9pZCBJbmxpbmVGbG93Qm94OjpwYWludChQYWludEluZm8mIHBhaQogICAgICAgICAg
ICAgLy8gb3V0bGluZXMuCiAgICAgICAgICAgICBpZiAocmVuZGVyZXIoKS5zdHlsZSgpLnZpc2li
aWxpdHkoKSA9PSBWSVNJQkxFICYmIHJlbmRlcmVyKCkuaGFzT3V0bGluZSgpICYmICFpc1Jvb3RJ
bmxpbmVCb3goKSkgewogICAgICAgICAgICAgICAgIFJlbmRlcklubGluZSYgaW5saW5lRmxvdyA9
IGRvd25jYXN0PFJlbmRlcklubGluZT4ocmVuZGVyZXIoKSk7Ci0KLSAgICAgICAgICAgICAgICBS
ZW5kZXJCbG9jayogY29udGFpbmluZ0Jsb2NrID0gbnVsbHB0cjsKLSAgICAgICAgICAgICAgICBi
b29sIGNvbnRhaW5pbmdCbG9ja1BhaW50c0NvbnRpbnVhdGlvbk91dGxpbmUgPSBpbmxpbmVGbG93
LmNvbnRpbnVhdGlvbigpIHx8IGlubGluZUZsb3cuaXNJbmxpbmVFbGVtZW50Q29udGludWF0aW9u
KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5pbmdCbG9ja1BhaW50c0NvbnRpbnVhdGlv
bk91dGxpbmUpIHsgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogU2Vl
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD01NDY5MC4gV2UgY3VycmVu
dGx5IGRvbid0IHJlY29ubmVjdCBpbmxpbmUgY29udGludWF0aW9ucwotICAgICAgICAgICAgICAg
ICAgICAvLyBhZnRlciBhIGNoaWxkIHJlbW92YWwuIEFzIGEgcmVzdWx0LCB0aG9zZSBtZXJnZWQg
aW5saW5lcyBkbyBub3QgZ2V0IHNlcGVyYXRlZCBhbmQgaGVuY2Ugbm90IGdldCBlbmNsb3NlZCBi
eQotICAgICAgICAgICAgICAgICAgICAvLyBhbm9ueW1vdXMgYmxvY2tzLiBJbiB0aGlzIGNhc2Us
IGl0IGlzIGJldHRlciB0byBiYWlsIG91dCBhbmQgcGFpbnQgaXQgb3Vyc2VsZi4KLSAgICAgICAg
ICAgICAgICAgICAgUmVuZGVyQmxvY2sqIGVuY2xvc2luZ0Fub255bW91c0Jsb2NrID0gcmVuZGVy
ZXIoKS5jb250YWluaW5nQmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFlbmNsb3Np
bmdBbm9ueW1vdXNCbG9jay0+aXNBbm9ueW1vdXNCbG9jaygpKQotICAgICAgICAgICAgICAgICAg
ICAgICAgY29udGFpbmluZ0Jsb2NrUGFpbnRzQ29udGludWF0aW9uT3V0bGluZSA9IGZhbHNlOwot
ICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRh
aW5pbmdCbG9jayA9IGVuY2xvc2luZ0Fub255bW91c0Jsb2NrLT5jb250YWluaW5nQmxvY2soKTsK
LSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYXV0byBib3ggPSAmcmVuZGVyZXIoKTsgYm94
ICE9IGNvbnRhaW5pbmdCbG9jazsgYm94ID0gJmJveC0+cGFyZW50KCktPmVuY2xvc2luZ0JveE1v
ZGVsT2JqZWN0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYm94LT5oYXNT
ZWxmUGFpbnRpbmdMYXllcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNv
bnRhaW5pbmdCbG9ja1BhaW50c0NvbnRpbnVhdGlvbk91dGxpbmUgPSBmYWxzZTsKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5pbmdCbG9ja1Bh
aW50c0NvbnRpbnVhdGlvbk91dGxpbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQWRkIG91
cnNlbHZlcyB0byB0aGUgY29udGFpbmluZyBibG9jayBvZiB0aGUgZW50aXJlIGNvbnRpbnVhdGlv
biBzbyB0aGF0IGl0IGNhbgotICAgICAgICAgICAgICAgICAgICAvLyBwYWludCB1cyBhdG9taWNh
bGx5LgotICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nQmxvY2stPmFkZENvbnRpbnVhdGlv
bldpdGhPdXRsaW5lKGRvd25jYXN0PFJlbmRlcklubGluZT4ocmVuZGVyZXIoKS5lbGVtZW50KCkt
PnJlbmRlcmVyKCkpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpbmxpbmVGbG93Lmlz
SW5saW5lRWxlbWVudENvbnRpbnVhdGlvbigpKQotICAgICAgICAgICAgICAgICAgICBwYWludElu
Zm8ub3V0bGluZU9iamVjdHMtPmFkZCgmaW5saW5lRmxvdyk7CisgICAgICAgICAgICAgICAgcGFp
bnRJbmZvLm91dGxpbmVPYmplY3RzLT5hZGQoJmlubGluZUZsb3cpOwogICAgICAgICAgICAgfQog
ICAgICAgICB9IGVsc2UgaWYgKHBhaW50SW5mby5waGFzZSA9PSBQYWludFBoYXNlTWFzaykgewot
ICAgICAgICAgICAgcGFpbnRNYXNrKHBhaW50SW5mbywgcGFpbnRPZmZzZXQpOworICAgICAgICAg
ICAgaWYgKCFsaW5lQm94UGFpbnRJbmZvLmFub255bW91c0lubGluZUJsb2NrKQorICAgICAgICAg
ICAgICAgIHBhaW50TWFzayhwYWludEluZm8sIHBhaW50T2Zmc2V0KTsKICAgICAgICAgICAgIHJl
dHVybjsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIFBhaW50IG91ciBiYWNrZ3Jv
dW5kLCBib3JkZXIgYW5kIGJveC1zaGFkb3cuCi0gICAgICAgICAgICBwYWludEJveERlY29yYXRp
b25zKHBhaW50SW5mbywgcGFpbnRPZmZzZXQpOworICAgICAgICAgICAgaWYgKCFsaW5lQm94UGFp
bnRJbmZvLmFub255bW91c0lubGluZUJsb2NrKQorICAgICAgICAgICAgICAgIHBhaW50Qm94RGVj
b3JhdGlvbnMocGFpbnRJbmZvLCBwYWludE9mZnNldCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAg
LTExODgsNyArMTE3Myw3IEBAIHZvaWQgSW5saW5lRmxvd0JveDo6cGFpbnQoUGFpbnRJbmZvJiBw
YWkKICAgICBpZiAocGFpbnRQaGFzZSAhPSBQYWludFBoYXNlU2VsZk91dGxpbmUpIHsKICAgICAg
ICAgZm9yIChJbmxpbmVCb3gqIGN1cnIgPSBmaXJzdENoaWxkKCk7IGN1cnI7IGN1cnIgPSBjdXJy
LT5uZXh0T25MaW5lKCkpIHsKICAgICAgICAgICAgIGlmIChjdXJyLT5yZW5kZXJlcigpLmlzVGV4
dCgpIHx8ICFjdXJyLT5ib3hNb2RlbE9iamVjdCgpLT5oYXNTZWxmUGFpbnRpbmdMYXllcigpKQot
ICAgICAgICAgICAgICAgIGN1cnItPnBhaW50KGNoaWxkSW5mbywgcGFpbnRPZmZzZXQsIGxpbmVU
b3AsIGxpbmVCb3R0b20pOworICAgICAgICAgICAgICAgIGN1cnItPnBhaW50KGNoaWxkSW5mbywg
cGFpbnRPZmZzZXQsIGxpbmVUb3AsIGxpbmVCb3R0b20sIGxpbmVCb3hQYWludEluZm8pOwogICAg
ICAgICB9CiAgICAgfQogfQpJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL0lubGluZUZs
b3dCb3guaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lRmxv
d0JveC5oCShyZXZpc2lvbiAxODEzMjkpCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvSW5s
aW5lRmxvd0JveC5oCSh3b3JraW5nIGNvcHkpCkBAIC00OCw2ICs0OCw3IEBAIHB1YmxpYzoKICAg
ICAgICAgLCBtX25leHRMaW5lQm94KDApCiAgICAgICAgICwgbV9pbmNsdWRlTG9naWNhbExlZnRF
ZGdlKGZhbHNlKQogICAgICAgICAsIG1faW5jbHVkZUxvZ2ljYWxSaWdodEVkZ2UoZmFsc2UpCisg
ICAgICAgICwgbV9oYXNBbm9ueW1vdXNJbmxpbmVCbG9jayhmYWxzZSkKICAgICAgICAgLCBtX2Rl
c2NlbmRhbnRzSGF2ZVNhbWVMaW5lSGVpZ2h0QW5kQmFzZWxpbmUodHJ1ZSkKICAgICAgICAgLCBt
X2Jhc2VsaW5lVHlwZShBbHBoYWJldGljQmFzZWxpbmUpCiAgICAgICAgICwgbV9oYXNBbm5vdGF0
aW9uc0JlZm9yZShmYWxzZSkKQEAgLTExOCw4ICsxMTksOCBAQCBwdWJsaWM6CiAgICAgdm9pZCBw
YWludEZpbGxMYXllcnMoY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgQ29sb3ImLCBjb25zdCBGaWxs
TGF5ZXIqLCBjb25zdCBMYXlvdXRSZWN0JiwgQ29tcG9zaXRlT3BlcmF0b3IgPSBDb21wb3NpdGVT
b3VyY2VPdmVyKTsKICAgICB2b2lkIHBhaW50RmlsbExheWVyKGNvbnN0IFBhaW50SW5mbyYsIGNv
bnN0IENvbG9yJiwgY29uc3QgRmlsbExheWVyKiwgY29uc3QgTGF5b3V0UmVjdCYsIENvbXBvc2l0
ZU9wZXJhdG9yID0gQ29tcG9zaXRlU291cmNlT3Zlcik7CiAgICAgdm9pZCBwYWludEJveFNoYWRv
dyhjb25zdCBQYWludEluZm8mLCBjb25zdCBSZW5kZXJTdHlsZSYsIFNoYWRvd1N0eWxlLCBjb25z
dCBMYXlvdXRSZWN0Jik7Ci0gICAgdmlydHVhbCB2b2lkIHBhaW50KFBhaW50SW5mbyYsIGNvbnN0
IExheW91dFBvaW50JiwgTGF5b3V0VW5pdCBsaW5lVG9wLCBMYXlvdXRVbml0IGxpbmVCb3R0b20p
IG92ZXJyaWRlOwotICAgIHZpcnR1YWwgYm9vbCBub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVx
dWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBjb25zdCBIaXRUZXN0TG9jYXRpb24mIGxvY2F0aW9uSW5D
b250YWluZXIsIGNvbnN0IExheW91dFBvaW50JiBhY2N1bXVsYXRlZE9mZnNldCwgTGF5b3V0VW5p
dCBsaW5lVG9wLCBMYXlvdXRVbml0IGxpbmVCb3R0b20pIG92ZXJyaWRlOworICAgIHZpcnR1YWwg
dm9pZCBwYWludChQYWludEluZm8mLCBjb25zdCBMYXlvdXRQb2ludCYsIExheW91dFVuaXQgbGlu
ZVRvcCwgTGF5b3V0VW5pdCBsaW5lQm90dG9tLCBMaW5lQm94UGFpbnRJbmZvJikgb3ZlcnJpZGU7
CisgICAgdmlydHVhbCBib29sIG5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiwgSGl0
VGVzdFJlc3VsdCYsIGNvbnN0IEhpdFRlc3RMb2NhdGlvbiYgbG9jYXRpb25JbkNvbnRhaW5lciwg
Y29uc3QgTGF5b3V0UG9pbnQmIGFjY3VtdWxhdGVkT2Zmc2V0LCBMYXlvdXRVbml0IGxpbmVUb3As
IExheW91dFVuaXQgbGluZUJvdHRvbSwgSGl0VGVzdEFjdGlvbiwgTGluZUJveEhpdFRlc3RJbmZv
Jikgb3ZlcnJpZGU7CiAKICAgICBib29sIGJveFNoYWRvd0NhbkJlQXBwbGllZFRvQmFja2dyb3Vu
ZChjb25zdCBGaWxsTGF5ZXImKSBjb25zdDsKIApAQCAtMjcwLDYgKzI3MSw5IEBAIHB1YmxpYzoK
ICAgICB2b2lkIHNldE92ZXJmbG93RnJvbUxvZ2ljYWxSZWN0cyhjb25zdCBMYXlvdXRSZWN0JiBs
b2dpY2FsTGF5b3V0T3ZlcmZsb3csIGNvbnN0IExheW91dFJlY3QmIGxvZ2ljYWxWaXN1YWxPdmVy
ZmxvdywgTGF5b3V0VW5pdCBsaW5lVG9wLCBMYXlvdXRVbml0IGxpbmVCb3R0b20pOwogICAgIHZv
aWQgc2V0TGF5b3V0T3ZlcmZsb3coY29uc3QgTGF5b3V0UmVjdCYsIExheW91dFVuaXQgbGluZVRv
cCwgTGF5b3V0VW5pdCBsaW5lQm90dG9tKTsKICAgICB2b2lkIHNldFZpc3VhbE92ZXJmbG93KGNv
bnN0IExheW91dFJlY3QmLCBMYXlvdXRVbml0IGxpbmVUb3AsIExheW91dFVuaXQgbGluZUJvdHRv
bSk7CisgICAgCisgICAgYm9vbCBoYXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpIGNvbnN0IHsgcmV0
dXJuIG1faGFzQW5vbnltb3VzSW5saW5lQmxvY2s7IH0KKyAgICB2b2lkIHNldEhhc0Fub255bW91
c0lubGluZUJsb2NrKCkgeyBtX2hhc0Fub255bW91c0lubGluZUJsb2NrID0gdHJ1ZTsgfQogCiAg
ICAgRmxvYXRSZWN0IGZyYW1lUmVjdEluY2x1ZGluZ0xpbmVIZWlnaHQoTGF5b3V0VW5pdCBsaW5l
VG9wLCBMYXlvdXRVbml0IGxpbmVCb3R0b20pIGNvbnN0CiAgICAgewpAQCAtMzE5LDYgKzMyMyw3
IEBAIHByb3RlY3RlZDoKIHByaXZhdGU6CiAgICAgdW5zaWduZWQgbV9pbmNsdWRlTG9naWNhbExl
ZnRFZGdlIDogMTsKICAgICB1bnNpZ25lZCBtX2luY2x1ZGVMb2dpY2FsUmlnaHRFZGdlIDogMTsK
KyAgICB1bnNpZ25lZCBtX2hhc0Fub255bW91c0lubGluZUJsb2NrOiAxOwogICAgIHVuc2lnbmVk
IG1faGFzVGV4dENoaWxkcmVuIDogMTsKICAgICB1bnNpZ25lZCBtX2hhc1RleHREZXNjZW5kYW50
cyA6IDE7CiAgICAgdW5zaWduZWQgbV9kZXNjZW5kYW50c0hhdmVTYW1lTGluZUhlaWdodEFuZEJh
c2VsaW5lIDogMTsKQEAgLTM0Nyw2ICszNTIsMjQgQEAgcHJpdmF0ZToKICNlbmRpZgogfTsKIAor
Ly8gRm9yIGFub255bW91cyBpbmxpbmUgYmxvY2sgb2JqZWN0cy4KK2NsYXNzIElubGluZUZsb3dB
bm9ueW1vdXNJbmxpbmVCbG9ja0JveCA6IHB1YmxpYyBJbmxpbmVGbG93Qm94Cit7CitwdWJsaWM6
CisgICAgSW5saW5lRmxvd0Fub255bW91c0lubGluZUJsb2NrQm94KFJlbmRlckJveE1vZGVsT2Jq
ZWN0JiByZW5kZXJlcikKKyAgICA6IElubGluZUZsb3dCb3gocmVuZGVyZXIpCisgICAgeworICAg
ICAgICBzZXRIYXNWaXJ0dWFsTG9naWNhbEhlaWdodCgpOworICAgICAgICBzZXRIYXNBbm9ueW1v
dXNJbmxpbmVCbG9jaygpOworICAgIH0KKworICAgIHZpcnR1YWwgZmxvYXQgdmlydHVhbExvZ2lj
YWxIZWlnaHQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtX2xvZ2ljYWxIZWlnaHQ7IH0gLy8g
VGhlIGhlaWdodCBvZiB0aGUgYW5vbnltb3VzIGlubGluZSBibG9jayBiZWxvdyB1cyBpbiB0aGUg
bGluZSBib3ggdHJlZS4KKyAgICB2b2lkIHNldExvZ2ljYWxIZWlnaHQoTGF5b3V0VW5pdCBoKSB7
IG1fbG9naWNhbEhlaWdodCA9IGg7IH0KKworcHJpdmF0ZToKKyAgICBMYXlvdXRVbml0IG1fbG9n
aWNhbEhlaWdodDsKK307CisKICNpZmRlZiBOREVCVUcKIAogaW5saW5lIHZvaWQgSW5saW5lRmxv
d0JveDo6Y2hlY2tDb25zaXN0ZW5jeSgpIGNvbnN0CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5k
ZXJpbmcvSW5saW5lVGV4dEJveC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVu
ZGVyaW5nL0lubGluZVRleHRCb3guY3BwCShyZXZpc2lvbiAxODEzMjkpCisrKyBTb3VyY2UvV2Vi
Q29yZS9yZW5kZXJpbmcvSW5saW5lVGV4dEJveC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM4OSw3
ICszODksOCBAQCBib29sIElubGluZVRleHRCb3g6OmlzTGluZUJyZWFrKCkgY29uc3QKICAgICBy
ZXR1cm4gcmVuZGVyZXIoKS5zdHlsZSgpLnByZXNlcnZlTmV3bGluZSgpICYmIGxlbigpID09IDEg
JiYgKCpyZW5kZXJlcigpLnRleHQoKSlbc3RhcnQoKV0gPT0gJ1xuJzsKIH0KIAotYm9vbCBJbmxp
bmVUZXh0Qm94Ojpub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYgcmVxdWVzdCwgSGl0
VGVzdFJlc3VsdCYgcmVzdWx0LCBjb25zdCBIaXRUZXN0TG9jYXRpb24mIGxvY2F0aW9uSW5Db250
YWluZXIsIGNvbnN0IExheW91dFBvaW50JiBhY2N1bXVsYXRlZE9mZnNldCwgTGF5b3V0VW5pdCAv
KiBsaW5lVG9wICovLCBMYXlvdXRVbml0IC8qbGluZUJvdHRvbSovKQorYm9vbCBJbmxpbmVUZXh0
Qm94Ojpub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYgcmVxdWVzdCwgSGl0VGVzdFJl
c3VsdCYgcmVzdWx0LCBjb25zdCBIaXRUZXN0TG9jYXRpb24mIGxvY2F0aW9uSW5Db250YWluZXIs
IGNvbnN0IExheW91dFBvaW50JiBhY2N1bXVsYXRlZE9mZnNldCwgTGF5b3V0VW5pdCAvKiBsaW5l
VG9wICovLCBMYXlvdXRVbml0IC8qbGluZUJvdHRvbSovLAorICAgIEhpdFRlc3RBY3Rpb24sIExp
bmVCb3hIaXRUZXN0SW5mbyYpCiB7CiAgICAgaWYgKCF2aXNpYmxlVG9IaXRUZXN0aW5nKCkpCiAg
ICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTQ2MCw3ICs0NjEsNyBAQCBib29sIElubGluZVRleHRC
b3g6OmVtcGhhc2lzTWFya0V4aXN0c0FuCiAgICAgcmV0dXJuICFydWJ5VGV4dCB8fCAhcnVieVRl
eHQtPmhhc0xpbmVzKCk7CiB9CiAKLXZvaWQgSW5saW5lVGV4dEJveDo6cGFpbnQoUGFpbnRJbmZv
JiBwYWludEluZm8sIGNvbnN0IExheW91dFBvaW50JiBwYWludE9mZnNldCwgTGF5b3V0VW5pdCAv
KmxpbmVUb3AqLywgTGF5b3V0VW5pdCAvKmxpbmVCb3R0b20qLykKK3ZvaWQgSW5saW5lVGV4dEJv
eDo6cGFpbnQoUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IExheW91dFBvaW50JiBwYWludE9m
ZnNldCwgTGF5b3V0VW5pdCAvKmxpbmVUb3AqLywgTGF5b3V0VW5pdCAvKmxpbmVCb3R0b20qLywg
TGluZUJveFBhaW50SW5mbyYpCiB7CiAgICAgaWYgKGlzTGluZUJyZWFrKCkgfHwgIXBhaW50SW5m
by5zaG91bGRQYWludFdpdGhpblJvb3QocmVuZGVyZXIoKSkgfHwgcmVuZGVyZXIoKS5zdHlsZSgp
LnZpc2liaWxpdHkoKSAhPSBWSVNJQkxFCiAgICAgICAgIHx8IG1fdHJ1bmNhdGlvbiA9PSBjRnVs
bFRydW5jYXRpb24gfHwgcGFpbnRJbmZvLnBoYXNlID09IFBhaW50UGhhc2VPdXRsaW5lIHx8ICFt
X2xlbikKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVUZXh0Qm94LmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL0lubGluZVRleHRCb3guaAkocmV2
aXNpb24gMTgxMzI5KQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL0lubGluZVRleHRCb3gu
aAkod29ya2luZyBjb3B5KQpAQCAtMTE1LDggKzExNSw4IEBAIHB1YmxpYzoKICAgICB2b2lkIHNl
bGVjdGlvblN0YXJ0RW5kKGludCYgc1BvcywgaW50JiBlUG9zKTsKIAogcHJvdGVjdGVkOgotICAg
IHZpcnR1YWwgdm9pZCBwYWludChQYWludEluZm8mLCBjb25zdCBMYXlvdXRQb2ludCYsIExheW91
dFVuaXQgbGluZVRvcCwgTGF5b3V0VW5pdCBsaW5lQm90dG9tKTsKLSAgICB2aXJ0dWFsIGJvb2wg
bm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVzdWx0JiwgY29uc3Qg
SGl0VGVzdExvY2F0aW9uJiBsb2NhdGlvbkluQ29udGFpbmVyLCBjb25zdCBMYXlvdXRQb2ludCYg
YWNjdW11bGF0ZWRPZmZzZXQsIExheW91dFVuaXQgbGluZVRvcCwgTGF5b3V0VW5pdCBsaW5lQm90
dG9tKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoUGFpbnRJbmZvJiwgY29uc3Qg
TGF5b3V0UG9pbnQmLCBMYXlvdXRVbml0IGxpbmVUb3AsIExheW91dFVuaXQgbGluZUJvdHRvbSwg
TGluZUJveFBhaW50SW5mbyYpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYm9vbCBub2RlQXRQb2lu
dChjb25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBjb25zdCBIaXRUZXN0TG9j
YXRpb24mIGxvY2F0aW9uSW5Db250YWluZXIsIGNvbnN0IExheW91dFBvaW50JiBhY2N1bXVsYXRl
ZE9mZnNldCwgTGF5b3V0VW5pdCBsaW5lVG9wLCBMYXlvdXRVbml0IGxpbmVCb3R0b20sIEhpdFRl
c3RBY3Rpb24sIExpbmVCb3hIaXRUZXN0SW5mbyYpIG92ZXJyaWRlOwogCiBwcml2YXRlOgogICAg
IHZpcnR1YWwgdm9pZCBkZWxldGVMaW5lKCkgb3ZlcnJpZGUgZmluYWw7CkluZGV4OiBTb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5jcHAJKHJldmlzaW9uIDE4MTMyOSkKKysrIFNv
dXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTk2LDggKzk2LDYgQEAgc3RhdGljIFRyYWNrZWREZXNjZW5kYW50c01hcCogZ1BlcmNlbnRIZQog
c3RhdGljIFRyYWNrZWRDb250YWluZXJNYXAqIGdQb3NpdGlvbmVkQ29udGFpbmVyTWFwID0gMDsK
IHN0YXRpYyBUcmFja2VkQ29udGFpbmVyTWFwKiBnUGVyY2VudEhlaWdodENvbnRhaW5lck1hcCA9
IDA7CiAKLXR5cGVkZWYgSGFzaE1hcDxSZW5kZXJCbG9jayosIHN0ZDo6dW5pcXVlX3B0cjxMaXN0
SGFzaFNldDxSZW5kZXJJbmxpbmUqPj4+IENvbnRpbnVhdGlvbk91dGxpbmVUYWJsZU1hcDsKLQog
c3RydWN0IFVwZGF0ZVNjcm9sbEluZm9BZnRlckxheW91dFRyYW5zYWN0aW9uIHsKICAgICBVcGRh
dGVTY3JvbGxJbmZvQWZ0ZXJMYXlvdXRUcmFuc2FjdGlvbihjb25zdCBSZW5kZXJWaWV3JiB2aWV3
KQogICAgICAgICA6IG5lc3RlZENvdW50KDApCkBAIC0yOTYsMTYgKzI5NCw2IEBAIHZvaWQgUmVu
ZGVyQmxvY2s6OnN0eWxlRGlkQ2hhbmdlKFN0eWxlRGkKICAgICBpZiAoaGFkVHJhbnNmb3JtICE9
IGhhc1RyYW5zZm9ybSgpICYmICFmbG93VGhyZWFkQ29udGFpbmluZ0Jsb2NrSW52YWxpZGF0ZWQp
CiAgICAgICAgIGludmFsaWRhdGVGbG93VGhyZWFkQ29udGFpbmluZ0Jsb2NrSW5jbHVkaW5nRGVz
Y2VuZGFudHMoKTsKIAotICAgIGlmICghaXNBbm9ueW1vdXNCbG9jaygpKSB7Ci0gICAgICAgIC8v
IEVuc3VyZSB0aGF0IGFsbCBvZiBvdXIgY29udGludWF0aW9uIGJsb2NrcyBwaWNrIHVwIHRoZSBu
ZXcgc3R5bGUuCi0gICAgICAgIGZvciAoUmVuZGVyQmxvY2sqIGN1cnJDb250ID0gYmxvY2tFbGVt
ZW50Q29udGludWF0aW9uKCk7IGN1cnJDb250OyBjdXJyQ29udCA9IGN1cnJDb250LT5ibG9ja0Vs
ZW1lbnRDb250aW51YXRpb24oKSkgewotICAgICAgICAgICAgUmVuZGVyQm94TW9kZWxPYmplY3Qq
IG5leHRDb250ID0gY3VyckNvbnQtPmNvbnRpbnVhdGlvbigpOwotICAgICAgICAgICAgY3VyckNv
bnQtPnNldENvbnRpbnVhdGlvbigwKTsKLSAgICAgICAgICAgIGN1cnJDb250LT5zZXRTdHlsZShu
ZXdTdHlsZSk7Ci0gICAgICAgICAgICBjdXJyQ29udC0+c2V0Q29udGludWF0aW9uKG5leHRDb250
KTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIHByb3BhZ2F0ZVN0eWxlVG9Bbm9ueW1vdXNDaGls
ZHJlbihQcm9wYWdhdGVUb0Jsb2NrQ2hpbGRyZW5Pbmx5KTsKIAogICAgIC8vIEl0J3MgcG9zc2li
bGUgZm9yIG91ciBib3JkZXIvcGFkZGluZyB0byBjaGFuZ2UsIGJ1dCBmb3IgdGhlIG92ZXJhbGwg
bG9naWNhbCB3aWR0aCBvZiB0aGUgYmxvY2sgdG8KQEAgLTMxMyw2OCArMzAxLDE1IEBAIHZvaWQg
UmVuZGVyQmxvY2s6OnN0eWxlRGlkQ2hhbmdlKFN0eWxlRGkKICAgICBzZXRIYXNCb3JkZXJPclBh
ZGRpbmdMb2dpY2FsV2lkdGhDaGFuZ2VkKG9sZFN0eWxlICYmIGRpZmYgPT0gU3R5bGVEaWZmZXJl
bmNlTGF5b3V0ICYmIG5lZWRzTGF5b3V0KCkgJiYgYm9yZGVyT3JQYWRkaW5nTG9naWNhbFdpZHRo
Q2hhbmdlZChvbGRTdHlsZSwgJm5ld1N0eWxlKSk7CiB9CiAKLVJlbmRlckJsb2NrKiBSZW5kZXJC
bG9jazo6Y29udGludWF0aW9uQmVmb3JlKFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQpCi17Ci0g
ICAgaWYgKGJlZm9yZUNoaWxkICYmIGJlZm9yZUNoaWxkLT5wYXJlbnQoKSA9PSB0aGlzKQotICAg
ICAgICByZXR1cm4gdGhpczsKLQotICAgIFJlbmRlckJsb2NrKiBuZXh0VG9MYXN0ID0gdGhpczsK
LSAgICBSZW5kZXJCbG9jayogbGFzdCA9IHRoaXM7Ci0gICAgZm9yIChhdXRvKiBjdXJyZW50ID0g
ZG93bmNhc3Q8UmVuZGVyQmxvY2s+KGNvbnRpbnVhdGlvbigpKTsgY3VycmVudDsgY3VycmVudCA9
IGRvd25jYXN0PFJlbmRlckJsb2NrPihjdXJyZW50LT5jb250aW51YXRpb24oKSkpIHsKLSAgICAg
ICAgaWYgKGJlZm9yZUNoaWxkICYmIGJlZm9yZUNoaWxkLT5wYXJlbnQoKSA9PSBjdXJyZW50KSB7
Ci0gICAgICAgICAgICBpZiAoY3VycmVudC0+Zmlyc3RDaGlsZCgpID09IGJlZm9yZUNoaWxkKQot
ICAgICAgICAgICAgICAgIHJldHVybiBsYXN0OwotICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7
Ci0gICAgICAgIH0KLQotICAgICAgICBuZXh0VG9MYXN0ID0gbGFzdDsKLSAgICAgICAgbGFzdCA9
IGN1cnJlbnQ7Ci0gICAgfQotCi0gICAgaWYgKCFiZWZvcmVDaGlsZCAmJiAhbGFzdC0+Zmlyc3RD
aGlsZCgpKQotICAgICAgICByZXR1cm4gbmV4dFRvTGFzdDsKLSAgICByZXR1cm4gbGFzdDsKLX0K
LQogdm9pZCBSZW5kZXJCbG9jazo6YWRkQ2hpbGRUb0NvbnRpbnVhdGlvbihSZW5kZXJPYmplY3Qq
IG5ld0NoaWxkLCBSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkKQogewotICAgIFJlbmRlckJsb2Nr
KiBmbG93ID0gY29udGludWF0aW9uQmVmb3JlKGJlZm9yZUNoaWxkKTsKICAgICBBU1NFUlQoIWJl
Zm9yZUNoaWxkIHx8IGlzPFJlbmRlckJsb2NrPigqYmVmb3JlQ2hpbGQtPnBhcmVudCgpKSk7CiAg
ICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGJlZm9yZUNoaWxkUGFyZW50ID0gbnVsbHB0cjsKICAg
ICBpZiAoYmVmb3JlQ2hpbGQpCiAgICAgICAgIGJlZm9yZUNoaWxkUGFyZW50ID0gZG93bmNhc3Q8
UmVuZGVyQm94TW9kZWxPYmplY3Q+KGJlZm9yZUNoaWxkLT5wYXJlbnQoKSk7Ci0gICAgZWxzZSB7
Ci0gICAgICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBjb250aW51YXRpb24gPSBmbG93LT5jb250
aW51YXRpb24oKTsKLSAgICAgICAgaWYgKGNvbnRpbnVhdGlvbikKLSAgICAgICAgICAgIGJlZm9y
ZUNoaWxkUGFyZW50ID0gY29udGludWF0aW9uOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBi
ZWZvcmVDaGlsZFBhcmVudCA9IGZsb3c7Ci0gICAgfQotCi0gICAgaWYgKG5ld0NoaWxkLT5pc0Zs
b2F0aW5nT3JPdXRPZkZsb3dQb3NpdGlvbmVkKCkpIHsKLSAgICAgICAgYmVmb3JlQ2hpbGRQYXJl
bnQtPmFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24obmV3Q2hpbGQsIGJlZm9yZUNoaWxkKTsK
LSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGJvb2wgY2hpbGRJc05vcm1hbCA9IG5ld0No
aWxkLT5pc0lubGluZSgpIHx8ICFuZXdDaGlsZC0+c3R5bGUoKS5jb2x1bW5TcGFuKCk7Ci0gICAg
Ym9vbCBiY3BJc05vcm1hbCA9IGJlZm9yZUNoaWxkUGFyZW50LT5pc0lubGluZSgpIHx8ICFiZWZv
cmVDaGlsZFBhcmVudC0+c3R5bGUoKS5jb2x1bW5TcGFuKCk7Ci0gICAgYm9vbCBmbG93SXNOb3Jt
YWwgPSBmbG93LT5pc0lubGluZSgpIHx8ICFmbG93LT5zdHlsZSgpLmNvbHVtblNwYW4oKTsKKyAg
ICBlbHNlCisgICAgICAgIGJlZm9yZUNoaWxkUGFyZW50ID0gdGhpczsKIAotICAgIGlmIChmbG93
ID09IGJlZm9yZUNoaWxkUGFyZW50KSB7Ci0gICAgICAgIGZsb3ctPmFkZENoaWxkSWdub3JpbmdD
b250aW51YXRpb24obmV3Q2hpbGQsIGJlZm9yZUNoaWxkKTsKLSAgICAgICAgcmV0dXJuOwotICAg
IH0KLSAgICAKLSAgICAvLyBUaGUgZ29hbCBoZXJlIGlzIHRvIG1hdGNoIHVwIGlmIHdlIGNhbiwg
c28gdGhhdCB3ZSBjYW4gY29hbGVzY2UgYW5kIGNyZWF0ZSB0aGUKLSAgICAvLyBtaW5pbWFsICMg
b2YgY29udGludWF0aW9ucyBuZWVkZWQgZm9yIHRoZSBpbmxpbmUuCi0gICAgaWYgKGNoaWxkSXNO
b3JtYWwgPT0gYmNwSXNOb3JtYWwpIHsKLSAgICAgICAgYmVmb3JlQ2hpbGRQYXJlbnQtPmFkZENo
aWxkSWdub3JpbmdDb250aW51YXRpb24obmV3Q2hpbGQsIGJlZm9yZUNoaWxkKTsKLSAgICAgICAg
cmV0dXJuOwotICAgIH0KLSAgICBpZiAoZmxvd0lzTm9ybWFsID09IGNoaWxkSXNOb3JtYWwpIHsK
LSAgICAgICAgZmxvdy0+YWRkQ2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihuZXdDaGlsZCwgMCk7
IC8vIEp1c3QgdHJlYXQgbGlrZSBhbiBhcHBlbmQuCi0gICAgICAgIHJldHVybjsKLSAgICB9CiAg
ICAgYmVmb3JlQ2hpbGRQYXJlbnQtPmFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24obmV3Q2hp
bGQsIGJlZm9yZUNoaWxkKTsKIH0KIApAQCAtNDY3LDcgKzQwMiw3IEBAIHZvaWQgUmVuZGVyQmxv
Y2s6OmFkZENoaWxkSWdub3JpbmdDb250aW4KICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoIWNo
aWxkcmVuSW5saW5lKCkgJiYgKG5ld0NoaWxkLT5pc0Zsb2F0aW5nT3JPdXRPZkZsb3dQb3NpdGlv
bmVkKCkgfHwgbmV3Q2hpbGQtPmlzSW5saW5lKCkpKSB7CiAgICAgICAgIC8vIElmIHdlJ3JlIGlu
c2VydGluZyBhbiBpbmxpbmUgY2hpbGQgYnV0IGFsbCBvZiBvdXIgY2hpbGRyZW4gYXJlIGJsb2Nr
cywgdGhlbiB3ZSBoYXZlIHRvIG1ha2Ugc3VyZQotICAgICAgICAvLyBpdCBpcyBwdXQgaW50byBh
biBhbm9teW91cyBibG9jayBib3guIFdlIHRyeSB0byB1c2UgYW4gZXhpc3RpbmcgYW5vbnltb3Vz
IGJveCBpZiBwb3NzaWJsZSwgb3RoZXJ3aXNlCisgICAgICAgIC8vIGl0IGlzIHB1dCBpbnRvIGFu
IGFub255bW91cyBibG9jayBib3guIFdlIHRyeSB0byB1c2UgYW4gZXhpc3RpbmcgYW5vbnltb3Vz
IGJveCBpZiBwb3NzaWJsZSwgb3RoZXJ3aXNlCiAgICAgICAgIC8vIGEgbmV3IG9uZSBpcyBjcmVh
dGVkIGFuZCBpbnNlcnRlZCBpbnRvIG91ciBsaXN0IG9mIGNoaWxkcmVuIGluIHRoZSBhcHByb3By
aWF0ZSBwb3NpdGlvbi4KICAgICAgICAgUmVuZGVyT2JqZWN0KiBhZnRlckNoaWxkID0gYmVmb3Jl
Q2hpbGQgPyBiZWZvcmVDaGlsZC0+cHJldmlvdXNTaWJsaW5nKCkgOiBsYXN0Q2hpbGQoKTsKIApA
QCAtNTg3LDEwICs1MjIsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjpyZW1vdmVMZWZ0b3ZlckFub255
bW91CiB7CiAgICAgQVNTRVJUKGNoaWxkLT5pc0Fub255bW91c0Jsb2NrKCkpOwogICAgIEFTU0VS
VCghY2hpbGQtPmNoaWxkcmVuSW5saW5lKCkpOwotICAgIAotICAgIGlmIChjaGlsZC0+Y29udGlu
dWF0aW9uKCkpCi0gICAgICAgIHJldHVybjsKLSAgICAKKwogICAgIFJlbmRlck9iamVjdCogZmly
c3RBbkNoaWxkID0gY2hpbGQtPmZpcnN0Q2hpbGQoKTsKICAgICBSZW5kZXJPYmplY3QqIGxhc3RB
bkNoaWxkID0gY2hpbGQtPmxhc3RDaGlsZCgpOwogICAgIGlmIChmaXJzdEFuQ2hpbGQpIHsKQEAg
LTYzNywxNiArNTY5LDE0IEBAIHZvaWQgUmVuZGVyQmxvY2s6OnJlbW92ZUxlZnRvdmVyQW5vbnlt
b3UKIAogc3RhdGljIGJvb2wgY2FuTWVyZ2VBbm9ueW1vdXNCbG9jayhSZW5kZXJCbG9jayYgYW5v
bnltb3VzQmxvY2spCiB7Ci0gICAgaWYgKGFub255bW91c0Jsb2NrLmJlaW5nRGVzdHJveWVkKCkg
fHwgYW5vbnltb3VzQmxvY2suY29udGludWF0aW9uKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICBpZiAoYW5vbnltb3VzQmxvY2suaXNSdWJ5UnVuKCkgfHwgYW5vbnltb3VzQmxvY2suaXNS
dWJ5QmFzZSgpKQorICAgIGlmIChhbm9ueW1vdXNCbG9jay5iZWluZ0Rlc3Ryb3llZCgpIHx8IGFu
b255bW91c0Jsb2NrLmlzUnVieVJ1bigpIHx8IGFub255bW91c0Jsb2NrLmlzUnVieUJhc2UoKSkK
ICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIHJldHVybiB0cnVlOwogfQogCiBzdGF0aWMgYm9v
bCBjYW5NZXJnZUNvbnRpZ3VvdXNBbm9ueW1vdXNCbG9ja3MoUmVuZGVyT2JqZWN0JiBvbGRDaGls
ZCwgUmVuZGVyT2JqZWN0KiBwcmV2aW91cywgUmVuZGVyT2JqZWN0KiBuZXh0KQogewotICAgIGlm
IChvbGRDaGlsZC5kb2N1bWVudEJlaW5nRGVzdHJveWVkKCkgfHwgb2xkQ2hpbGQuaXNJbmxpbmUo
KSB8fCBvbGRDaGlsZC52aXJ0dWFsQ29udGludWF0aW9uKCkpCisgICAgaWYgKG9sZENoaWxkLmRv
Y3VtZW50QmVpbmdEZXN0cm95ZWQoKSB8fCBvbGRDaGlsZC5pc0lubGluZSgpKQogICAgICAgICBy
ZXR1cm4gZmFsc2U7CiAKICAgICBpZiAocHJldmlvdXMpIHsKQEAgLTcwNywxMCArNjM3LDcgQEAg
dm9pZCBSZW5kZXJCbG9jazo6cmVtb3ZlQ2hpbGQoUmVuZGVyT2JqZQogICAgICAgICAgICAgUmVu
ZGVyQmxvY2smIGJsb2NrQ2hpbGRyZW5CbG9jayA9IHByZXYtPmNoaWxkcmVuSW5saW5lKCkgPyBu
ZXh0QmxvY2sgOiBwcmV2QmxvY2s7CiAgICAgICAgICAgICAKICAgICAgICAgICAgIC8vIFBsYWNl
IHRoZSBpbmxpbmUgY2hpbGRyZW4gYmxvY2sgaW5zaWRlIG9mIHRoZSBibG9jayBjaGlsZHJlbiBi
bG9jayBpbnN0ZWFkIG9mIGRlbGV0aW5nIGl0LgotICAgICAgICAgICAgLy8gSW4gb3JkZXIgdG8g
cmV1c2UgaXQsIHdlIGhhdmUgdG8gcmVzZXQgaXQgdG8ganVzdCBiZSBhIGdlbmVyaWMgYW5vbnlt
b3VzIGJsb2NrLiAgTWFrZSBzdXJlCi0gICAgICAgICAgICAvLyB0byBjbGVhciBvdXQgaW5oZXJp
dGVkIGNvbHVtbiBwcm9wZXJ0aWVzIGJ5IGp1c3QgbWFraW5nIGEgbmV3IHN0eWxlLCBhbmQgdG8g
YWxzbyBjbGVhciB0aGUKLSAgICAgICAgICAgIC8vIGNvbHVtbiBzcGFuIGZsYWcgaWYgaXQgaXMg
c2V0LgotICAgICAgICAgICAgQVNTRVJUKCFpbmxpbmVDaGlsZHJlbkJsb2NrLmNvbnRpbnVhdGlv
bigpKTsKKyAgICAgICAgICAgIC8vIEluIG9yZGVyIHRvIHJldXNlIGl0LCB3ZSBoYXZlIHRvIHJl
c2V0IGl0IHRvIGp1c3QgYmUgYSBnZW5lcmljIGFub255bW91cyBibG9jay4KICAgICAgICAgICAg
IC8vIENhY2hlIHRoaXMgdmFsdWUgYXMgaXQgbWlnaHQgZ2V0IGNoYW5nZWQgaW4gc2V0U3R5bGUo
KSBjYWxsLgogICAgICAgICAgICAgYm9vbCBpbmxpbmVDaGlsZHJlbkJsb2NrSGFzTGF5ZXIgPSBp
bmxpbmVDaGlsZHJlbkJsb2NrLmhhc0xheWVyKCk7CiAgICAgICAgICAgICBpbmxpbmVDaGlsZHJl
bkJsb2NrLnNldFN0eWxlKFJlbmRlclN0eWxlOjpjcmVhdGVBbm9ueW1vdXNTdHlsZVdpdGhEaXNw
bGF5KCZzdHlsZSgpLCBCTE9DSykpOwpAQCAtNzY2LDMyICs2OTMsNiBAQCB2b2lkIFJlbmRlckJs
b2NrOjpyZW1vdmVDaGlsZChSZW5kZXJPYmplCiAgICAgICAgIC8vIElmIHRoaXMgd2FzIG91ciBs
YXN0IGNoaWxkIGJlIHN1cmUgdG8gY2xlYXIgb3V0IG91ciBsaW5lIGJveGVzLgogICAgICAgICBp
ZiAoY2hpbGRyZW5JbmxpbmUoKSkKICAgICAgICAgICAgIGRlbGV0ZUxpbmVzKCk7Ci0KLSAgICAg
ICAgLy8gSWYgd2UgYXJlIGFuIGVtcHR5IGFub255bW91cyBibG9jayBpbiB0aGUgY29udGludWF0
aW9uIGNoYWluLAotICAgICAgICAvLyB3ZSBuZWVkIHRvIHJlbW92ZSBvdXJzZWxmIGFuZCBmaXgg
dGhlIGNvbnRpbnVhdGlvbiBjaGFpbi4KLSAgICAgICAgaWYgKCFiZWluZ0Rlc3Ryb3llZCgpICYm
IGlzQW5vbnltb3VzQmxvY2tDb250aW51YXRpb24oKSAmJiAhb2xkQ2hpbGQuaXNMaXN0TWFya2Vy
KCkpIHsKLSAgICAgICAgICAgIGF1dG8gY29udGFpbmluZ0Jsb2NrSWdub3JpbmdBbm9ueW1vdXMg
PSBjb250YWluaW5nQmxvY2soKTsKLSAgICAgICAgICAgIHdoaWxlIChjb250YWluaW5nQmxvY2tJ
Z25vcmluZ0Fub255bW91cyAmJiBjb250YWluaW5nQmxvY2tJZ25vcmluZ0Fub255bW91cy0+aXNB
bm9ueW1vdXNCbG9jaygpKQotICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdCbG9ja0lnbm9yaW5n
QW5vbnltb3VzID0gY29udGFpbmluZ0Jsb2NrSWdub3JpbmdBbm9ueW1vdXMtPmNvbnRhaW5pbmdC
bG9jaygpOwotICAgICAgICAgICAgZm9yIChSZW5kZXJPYmplY3QqIGN1cnJlbnQgPSB0aGlzOyBj
dXJyZW50OyBjdXJyZW50ID0gY3VycmVudC0+cHJldmlvdXNJblByZU9yZGVyKGNvbnRhaW5pbmdC
bG9ja0lnbm9yaW5nQW5vbnltb3VzKSkgewotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LT52
aXJ0dWFsQ29udGludWF0aW9uKCkgIT0gdGhpcykKLSAgICAgICAgICAgICAgICAgICAgY29udGlu
dWU7Ci0KLSAgICAgICAgICAgICAgICAvLyBGb3VuZCBvdXIgcHJldmlvdXMgY29udGludWF0aW9u
LiBXZSBqdXN0IG5lZWQgdG8gcG9pbnQgaXQgdG8KLSAgICAgICAgICAgICAgICAvLyB8dGhpc3wn
cyBuZXh0IGNvbnRpbnVhdGlvbi4KLSAgICAgICAgICAgICAgICBSZW5kZXJCb3hNb2RlbE9iamVj
dCogbmV4dENvbnRpbnVhdGlvbiA9IGNvbnRpbnVhdGlvbigpOwotICAgICAgICAgICAgICAgIGlm
IChpczxSZW5kZXJJbmxpbmU+KCpjdXJyZW50KSkKLSAgICAgICAgICAgICAgICAgICAgZG93bmNh
c3Q8UmVuZGVySW5saW5lPigqY3VycmVudCkuc2V0Q29udGludWF0aW9uKG5leHRDb250aW51YXRp
b24pOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzPFJlbmRlckJsb2NrPigqY3VycmVudCkp
Ci0gICAgICAgICAgICAgICAgICAgIGRvd25jYXN0PFJlbmRlckJsb2NrPigqY3VycmVudCkuc2V0
Q29udGludWF0aW9uKG5leHRDb250aW51YXRpb24pOwotICAgICAgICAgICAgICAgIGVsc2UKLSAg
ICAgICAgICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0KLSAgICAgICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldENvbnRpbnVhdGlvbihudWxs
cHRyKTsKLSAgICAgICAgICAgIGRlc3Ryb3koKTsKLSAgICAgICAgfQogICAgIH0KIH0KIApAQCAt
ODIzLDEwICs3MjQsMTggQEAgYm9vbCBSZW5kZXJCbG9jazo6aXNTZWxmQ29sbGFwc2luZ0Jsb2Nr
KAogICAgIC8vIG9uIHdoZXRoZXIgd2UgaGF2ZSBjb250ZW50IHRoYXQgaXMgYWxsIHNlbGYtY29s
bGFwc2luZyBvciBub3QuCiAgICAgaWYgKGhhc0F1dG9IZWlnaHQgfHwgKChsb2dpY2FsSGVpZ2h0
TGVuZ3RoLmlzRml4ZWQoKSB8fCBsb2dpY2FsSGVpZ2h0TGVuZ3RoLmlzUGVyY2VudCgpKSAmJiBs
b2dpY2FsSGVpZ2h0TGVuZ3RoLmlzWmVybygpKSkgewogICAgICAgICAvLyBJZiB0aGUgYmxvY2sg
aGFzIGlubGluZSBjaGlsZHJlbiwgc2VlIGlmIHdlIGdlbmVyYXRlZCBhbnkgbGluZSBib3hlcy4g
IElmIHdlIGhhdmUgYW55Ci0gICAgICAgIC8vIGxpbmUgYm94ZXMsIHRoZW4gd2UgY2FuJ3QgYmUg
c2VsZi1jb2xsYXBzaW5nLCBzaW5jZSB3ZSBoYXZlIGNvbnRlbnQuCi0gICAgICAgIGlmIChjaGls
ZHJlbklubGluZSgpKQotICAgICAgICAgICAgcmV0dXJuICFoYXNMaW5lcygpOwotICAgICAgICAK
KyAgICAgICAgLy8gbGluZSBib3hlcywgdGhlbiB3ZSBjYW4gb25seSBiZSBzZWxmLWNvbGxhcHNp
bmcgaWYgd2UgaGF2ZSBub3RoaW5nIGJ1dCBhbm9ueW1vdXMgaW5saW5lIGJsb2NrcworICAgICAg
ICAvLyB0aGF0IGFyZSBhbHNvIHNlbGYtY29sbGFwc2luZyBpbnNpZGUgdXMuCisgICAgICAgIGlm
IChjaGlsZHJlbklubGluZSgpKSB7CisgICAgICAgICAgICBpZiAoYXV0byBzaW1wbGVMaW5lTGF5
b3V0ID0gdGhpcy0+c2ltcGxlTGluZUxheW91dCgpKQorICAgICAgICAgICAgICAgIHJldHVybiAh
c2ltcGxlTGluZUxheW91dC0+bGluZUNvdW50KCk7CisgICAgICAgICAgICBmb3IgKFJvb3RJbmxp
bmVCb3gqIGNoaWxkID0gZmlyc3RSb290Qm94KCk7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0
Um9vdEJveCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFjaGlsZC0+aGFzQW5vbnltb3VzSW5s
aW5lQmxvY2soKSB8fCAhY2hpbGQtPmFub255bW91c0lubGluZUJsb2NrKCktPmlzU2VsZkNvbGxh
cHNpbmdCbG9jaygpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
ICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gV2UgaGF2ZSBubyBsaW5lIGJveGVz
LCBzbyB3ZSBtdXN0IGJlIHNlbGYtY29sbGFwc2luZy4KKyAgICAgICAgfQorCiAgICAgICAgIC8v
IFdoZXRoZXIgb3Igbm90IHdlIGNvbGxhcHNlIGlzIGRlcGVuZGVudCBvbiB3aGV0aGVyIGFsbCBv
dXIgbm9ybWFsIGZsb3cgY2hpbGRyZW4KICAgICAgICAgLy8gYXJlIGFsc28gc2VsZi1jb2xsYXBz
aW5nLgogICAgICAgICBmb3IgKFJlbmRlckJveCogY2hpbGQgPSBmaXJzdENoaWxkQm94KCk7IGNo
aWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0U2libGluZ0JveCgpKSB7CkBAIC0xNTk5LDMzICsxNTA4
LDcgQEAgdm9pZCBSZW5kZXJCbG9jazo6cGFpbnRPYmplY3QoUGFpbnRJbmZvJgogICAgIGlmICgo
cGFpbnRQaGFzZSA9PSBQYWludFBoYXNlT3V0bGluZSB8fCBwYWludFBoYXNlID09IFBhaW50UGhh
c2VTZWxmT3V0bGluZSkgJiYgaGFzT3V0bGluZSgpICYmIHN0eWxlKCkudmlzaWJpbGl0eSgpID09
IFZJU0lCTEUpCiAgICAgICAgIHBhaW50T3V0bGluZShwYWludEluZm8sIExheW91dFJlY3QocGFp
bnRPZmZzZXQsIHNpemUoKSkpOwogCi0gICAgLy8gNi4gcGFpbnQgY29udGludWF0aW9uIG91dGxp
bmVzLgotICAgIGlmICgocGFpbnRQaGFzZSA9PSBQYWludFBoYXNlT3V0bGluZSB8fCBwYWludFBo
YXNlID09IFBhaW50UGhhc2VDaGlsZE91dGxpbmVzKSkgewotICAgICAgICBSZW5kZXJJbmxpbmUq
IGlubGluZUNvbnQgPSBpbmxpbmVFbGVtZW50Q29udGludWF0aW9uKCk7Ci0gICAgICAgIGlmIChp
bmxpbmVDb250ICYmIGlubGluZUNvbnQtPmhhc091dGxpbmUoKSAmJiBpbmxpbmVDb250LT5zdHls
ZSgpLnZpc2liaWxpdHkoKSA9PSBWSVNJQkxFKSB7Ci0gICAgICAgICAgICBSZW5kZXJJbmxpbmUq
IGlubGluZVJlbmRlcmVyID0gZG93bmNhc3Q8UmVuZGVySW5saW5lPihpbmxpbmVDb250LT5lbGVt
ZW50KCktPnJlbmRlcmVyKCkpOwotICAgICAgICAgICAgUmVuZGVyQmxvY2sqIGNvbnRhaW5pbmdC
bG9jayA9IHRoaXMtPmNvbnRhaW5pbmdCbG9jaygpOwotCi0gICAgICAgICAgICBib29sIGlubGlu
ZUVuY2xvc2VkSW5TZWxmUGFpbnRpbmdMYXllciA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChS
ZW5kZXJCb3hNb2RlbE9iamVjdCogYm94ID0gaW5saW5lUmVuZGVyZXI7IGJveCAhPSBjb250YWlu
aW5nQmxvY2s7IGJveCA9ICZib3gtPnBhcmVudCgpLT5lbmNsb3NpbmdCb3hNb2RlbE9iamVjdCgp
KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJveC0+aGFzU2VsZlBhaW50aW5nTGF5ZXIoKSkgewot
ICAgICAgICAgICAgICAgICAgICBpbmxpbmVFbmNsb3NlZEluU2VsZlBhaW50aW5nTGF5ZXIgPSB0
cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIERvIG5vdCBhZGQgY29udGludWF0aW9ucyBmb3Ig
b3V0bGluZSBwYWludGluZyBieSBvdXIgY29udGFpbmluZyBibG9jayBpZiB3ZSBhcmUgYSByZWxh
dGl2ZSBwb3NpdGlvbmVkCi0gICAgICAgICAgICAvLyBhbm9ueW1vdXMgYmxvY2sgKGkuZS4gaGF2
ZSBvdXIgb3duIGxheWVyKSwgcGFpbnQgdGhlbSBzdHJhaWdodGF3YXkgaW5zdGVhZC4gVGhpcyBp
cyBiZWNhdXNlIGEgYmxvY2sgZGVwZW5kcyBvbiByZW5kZXJlcnMgaW4gaXRzIGNvbnRpbnVhdGlv
biB0YWJsZSBiZWluZwotICAgICAgICAgICAgLy8gaW4gdGhlIHNhbWUgbGF5ZXIuIAotICAgICAg
ICAgICAgaWYgKCFpbmxpbmVFbmNsb3NlZEluU2VsZlBhaW50aW5nTGF5ZXIgJiYgIWhhc0xheWVy
KCkpCi0gICAgICAgICAgICAgICAgY29udGFpbmluZ0Jsb2NrLT5hZGRDb250aW51YXRpb25XaXRo
T3V0bGluZShpbmxpbmVSZW5kZXJlcik7Ci0gICAgICAgICAgICBlbHNlIGlmICghaW5saW5lUmVu
ZGVyZXItPmZpcnN0TGluZUJveCgpIHx8ICghaW5saW5lRW5jbG9zZWRJblNlbGZQYWludGluZ0xh
eWVyICYmIGhhc0xheWVyKCkpKQotICAgICAgICAgICAgICAgIGlubGluZVJlbmRlcmVyLT5wYWlu
dE91dGxpbmUocGFpbnRJbmZvLCBwYWludE9mZnNldCAtIGxvY2F0aW9uT2Zmc2V0KCkgKyBpbmxp
bmVSZW5kZXJlci0+Y29udGFpbmluZ0Jsb2NrKCktPmxvY2F0aW9uKCkpOwotICAgICAgICB9Ci0g
ICAgICAgIHBhaW50Q29udGludWF0aW9uT3V0bGluZXMocGFpbnRJbmZvLCBwYWludE9mZnNldCk7
Ci0gICAgfQotCi0gICAgLy8gNy4gcGFpbnQgY2FyZXQuCisgICAgLy8gNi4gcGFpbnQgY2FyZXQu
CiAgICAgLy8gSWYgdGhlIGNhcmV0J3Mgbm9kZSdzIHJlbmRlciBvYmplY3QncyBjb250YWluaW5n
IGJsb2NrIGlzIHRoaXMgYmxvY2ssIGFuZCB0aGUgcGFpbnQgYWN0aW9uIGlzIFBhaW50UGhhc2VG
b3JlZ3JvdW5kLAogICAgIC8vIHRoZW4gcGFpbnQgdGhlIGNhcmV0LgogICAgIGlmIChwYWludFBo
YXNlID09IFBhaW50UGhhc2VGb3JlZ3JvdW5kKSB7ICAgICAgICAKQEAgLTE2MzMsODMgKzE1MTYs
NiBAQCB2b2lkIFJlbmRlckJsb2NrOjpwYWludE9iamVjdChQYWludEluZm8mCiAgICAgICAgIHBh
aW50Q2FyZXQocGFpbnRJbmZvLCBwYWludE9mZnNldCwgRHJhZ0NhcmV0KTsKICAgICB9CiB9Ci0K
LVJlbmRlcklubGluZSogUmVuZGVyQmxvY2s6OmlubGluZUVsZW1lbnRDb250aW51YXRpb24oKSBj
b25zdAoteyAKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogY29udGludWF0aW9uID0gdGhpcy0+
Y29udGludWF0aW9uKCk7Ci0gICAgcmV0dXJuIGlzPFJlbmRlcklubGluZT4oY29udGludWF0aW9u
KSA/IGRvd25jYXN0PFJlbmRlcklubGluZT4oY29udGludWF0aW9uKSA6IG51bGxwdHI7Ci19Ci0K
LVJlbmRlckJsb2NrKiBSZW5kZXJCbG9jazo6YmxvY2tFbGVtZW50Q29udGludWF0aW9uKCkgY29u
c3QKLXsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogY3VycmVudENvbnRpbnVhdGlvbiA9IGNv
bnRpbnVhdGlvbigpOwotICAgIGlmICghY3VycmVudENvbnRpbnVhdGlvbiB8fCBjdXJyZW50Q29u
dGludWF0aW9uLT5pc0lubGluZSgpKQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICBSZW5k
ZXJCbG9jayYgbmV4dENvbnRpbnVhdGlvbiA9IGRvd25jYXN0PFJlbmRlckJsb2NrPigqY3VycmVu
dENvbnRpbnVhdGlvbik7Ci0gICAgaWYgKG5leHRDb250aW51YXRpb24uaXNBbm9ueW1vdXNCbG9j
aygpKQotICAgICAgICByZXR1cm4gbmV4dENvbnRpbnVhdGlvbi5ibG9ja0VsZW1lbnRDb250aW51
YXRpb24oKTsKLSAgICByZXR1cm4gJm5leHRDb250aW51YXRpb247Ci19Ci0gICAgCi1zdGF0aWMg
Q29udGludWF0aW9uT3V0bGluZVRhYmxlTWFwKiBjb250aW51YXRpb25PdXRsaW5lVGFibGUoKQot
ewotICAgIERFUFJFQ0FURURfREVGSU5FX1NUQVRJQ19MT0NBTChDb250aW51YXRpb25PdXRsaW5l
VGFibGVNYXAsIHRhYmxlLCAoKSk7Ci0gICAgcmV0dXJuICZ0YWJsZTsKLX0KLQotdm9pZCBSZW5k
ZXJCbG9jazo6YWRkQ29udGludWF0aW9uV2l0aE91dGxpbmUoUmVuZGVySW5saW5lKiBmbG93KQot
ewotICAgIC8vIFdlIGNhbid0IG1ha2UgdGhpcyB3b3JrIGlmIHRoZSBpbmxpbmUgaXMgaW4gYSBs
YXllci4gIFdlJ2xsIGp1c3QgcmVseSBvbiB0aGUgYnJva2VuCi0gICAgLy8gd2F5IG9mIHBhaW50
aW5nLgotICAgIEFTU0VSVCghZmxvdy0+bGF5ZXIoKSAmJiAhZmxvdy0+aXNJbmxpbmVFbGVtZW50
Q29udGludWF0aW9uKCkpOwotICAgIAotICAgIENvbnRpbnVhdGlvbk91dGxpbmVUYWJsZU1hcCog
dGFibGUgPSBjb250aW51YXRpb25PdXRsaW5lVGFibGUoKTsKLSAgICBMaXN0SGFzaFNldDxSZW5k
ZXJJbmxpbmUqPiogY29udGludWF0aW9ucyA9IHRhYmxlLT5nZXQodGhpcyk7Ci0gICAgaWYgKCFj
b250aW51YXRpb25zKSB7Ci0gICAgICAgIGNvbnRpbnVhdGlvbnMgPSBuZXcgTGlzdEhhc2hTZXQ8
UmVuZGVySW5saW5lKj47Ci0gICAgICAgIHRhYmxlLT5zZXQodGhpcywgc3RkOjp1bmlxdWVfcHRy
PExpc3RIYXNoU2V0PFJlbmRlcklubGluZSo+Pihjb250aW51YXRpb25zKSk7Ci0gICAgfQotICAg
IAotICAgIGNvbnRpbnVhdGlvbnMtPmFkZChmbG93KTsKLX0KLQotYm9vbCBSZW5kZXJCbG9jazo6
cGFpbnRzQ29udGludWF0aW9uT3V0bGluZShSZW5kZXJJbmxpbmUqIGZsb3cpCi17Ci0gICAgQ29u
dGludWF0aW9uT3V0bGluZVRhYmxlTWFwKiB0YWJsZSA9IGNvbnRpbnVhdGlvbk91dGxpbmVUYWJs
ZSgpOwotICAgIGlmICh0YWJsZS0+aXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgICAgIAotICAgIExpc3RIYXNoU2V0PFJlbmRlcklubGluZSo+KiBjb250aW51YXRpb25zID0g
dGFibGUtPmdldCh0aGlzKTsKLSAgICBpZiAoIWNvbnRpbnVhdGlvbnMpCi0gICAgICAgIHJldHVy
biBmYWxzZTsKLQotICAgIHJldHVybiBjb250aW51YXRpb25zLT5jb250YWlucyhmbG93KTsKLX0K
LQotdm9pZCBSZW5kZXJCbG9jazo6cGFpbnRDb250aW51YXRpb25PdXRsaW5lcyhQYWludEluZm8m
IGluZm8sIGNvbnN0IExheW91dFBvaW50JiBwYWludE9mZnNldCkKLXsKLSAgICBDb250aW51YXRp
b25PdXRsaW5lVGFibGVNYXAqIHRhYmxlID0gY29udGludWF0aW9uT3V0bGluZVRhYmxlKCk7Ci0g
ICAgaWYgKHRhYmxlLT5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAg
c3RkOjp1bmlxdWVfcHRyPExpc3RIYXNoU2V0PFJlbmRlcklubGluZSo+PiBjb250aW51YXRpb25z
ID0gdGFibGUtPnRha2UodGhpcyk7Ci0gICAgaWYgKCFjb250aW51YXRpb25zKQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBMYXlvdXRQb2ludCBhY2N1bXVsYXRlZFBhaW50T2Zmc2V0ID0gcGFpbnRP
ZmZzZXQ7Ci0gICAgLy8gUGFpbnQgZWFjaCBjb250aW51YXRpb24gb3V0bGluZS4KLSAgICBMaXN0
SGFzaFNldDxSZW5kZXJJbmxpbmUqPjo6aXRlcmF0b3IgZW5kID0gY29udGludWF0aW9ucy0+ZW5k
KCk7Ci0gICAgZm9yIChMaXN0SGFzaFNldDxSZW5kZXJJbmxpbmUqPjo6aXRlcmF0b3IgaXQgPSBj
b250aW51YXRpb25zLT5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgLy8gTmVl
ZCB0byBhZGQgaW4gdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBpbnRlcnZlbmluZyBibG9ja3MuCi0g
ICAgICAgIFJlbmRlcklubGluZSogZmxvdyA9ICppdDsKLSAgICAgICAgUmVuZGVyQmxvY2sqIGJs
b2NrID0gZmxvdy0+Y29udGFpbmluZ0Jsb2NrKCk7Ci0gICAgICAgIGZvciAoIDsgYmxvY2sgJiYg
YmxvY2sgIT0gdGhpczsgYmxvY2sgPSBibG9jay0+Y29udGFpbmluZ0Jsb2NrKCkpCi0gICAgICAg
ICAgICBhY2N1bXVsYXRlZFBhaW50T2Zmc2V0Lm1vdmVCeShibG9jay0+bG9jYXRpb24oKSk7Ci0g
ICAgICAgIEFTU0VSVChibG9jayk7ICAgCi0gICAgICAgIGZsb3ctPnBhaW50T3V0bGluZShpbmZv
LCBhY2N1bXVsYXRlZFBhaW50T2Zmc2V0KTsKLSAgICB9Ci19Ci0KIGJvb2wgUmVuZGVyQmxvY2s6
OnNob3VsZFBhaW50U2VsZWN0aW9uR2FwcygpIGNvbnN0CiB7CiAgICAgcmV0dXJuIHNlbGVjdGlv
blN0YXRlKCkgIT0gU2VsZWN0aW9uTm9uZSAmJiBzdHlsZSgpLnZpc2liaWxpdHkoKSA9PSBWSVNJ
QkxFICYmIGlzU2VsZWN0aW9uUm9vdCgpOwpAQCAtMTcyNyw3ICsxNTMzLDcgQEAgYm9vbCBSZW5k
ZXJCbG9jazo6aXNTZWxlY3Rpb25Sb290KCkgY29ucwogICAgICAgICAKICAgICBpZiAoaXNCb2R5
KCkgfHwgaXNSb290KCkgfHwgaGFzT3ZlcmZsb3dDbGlwKCkKICAgICAgICAgfHwgaXNQb3NpdGlv
bmVkKCkgfHwgaXNGbG9hdGluZygpCi0gICAgICAgIHx8IGlzVGFibGVDZWxsKCkgfHwgaXNJbmxp
bmVCbG9ja09ySW5saW5lVGFibGUoKQorICAgICAgICB8fCBpc1RhYmxlQ2VsbCgpIHx8IChpc0lu
bGluZUJsb2NrT3JJbmxpbmVUYWJsZSgpICYmICFpc0Fub255bW91c0lubGluZUJsb2NrKCkpCiAg
ICAgICAgIHx8IGhhc1RyYW5zZm9ybSgpIHx8IGhhc1JlZmxlY3Rpb24oKSB8fCBoYXNNYXNrKCkg
fHwgaXNXcml0aW5nTW9kZVJvb3QoKQogICAgICAgICB8fCBpc1JlbmRlckZsb3dUaHJlYWQoKSB8
fCBzdHlsZSgpLmNvbHVtblNwYW4oKSA9PSBDb2x1bW5TcGFuQWxsKQogICAgICAgICByZXR1cm4g
dHJ1ZTsKQEAgLTIzODksNyArMjE5NSw3IEBAIE5vZGUqIFJlbmRlckJsb2NrOjpub2RlRm9ySGl0
VGVzdCgpIGNvbnMKICAgICAvLyB0aGF0IHdhcyBzcGxpdC4gVXNlIHRoZSBhcHByb3ByaWF0ZSBp
bm5lciBub2RlLgogICAgIGlmIChpc1JlbmRlclZpZXcoKSkKICAgICAgICAgcmV0dXJuICZkb2N1
bWVudCgpOwotICAgIHJldHVybiBpc0Fub255bW91c0Jsb2NrQ29udGludWF0aW9uKCkgPyBjb250
aW51YXRpb24oKS0+ZWxlbWVudCgpIDogZWxlbWVudCgpOworICAgIHJldHVybiBlbGVtZW50KCk7
CiB9CiAKIGJvb2wgUmVuZGVyQmxvY2s6Om5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0
JiByZXF1ZXN0LCBIaXRUZXN0UmVzdWx0JiByZXN1bHQsIGNvbnN0IEhpdFRlc3RMb2NhdGlvbiYg
bG9jYXRpb25JbkNvbnRhaW5lciwgY29uc3QgTGF5b3V0UG9pbnQmIGFjY3VtdWxhdGVkT2Zmc2V0
LCBIaXRUZXN0QWN0aW9uIGhpdFRlc3RBY3Rpb24pCkBAIC0yNTcyLDcgKzIzNzgsNyBAQCBWaXNp
YmxlUG9zaXRpb24gUmVuZGVyQmxvY2s6OnBvc2l0aW9uRm9yCiAKIHN0YXRpYyBpbmxpbmUgYm9v
bCBpc0NoaWxkSGl0VGVzdENhbmRpZGF0ZShjb25zdCBSZW5kZXJCb3gmIGJveCkKIHsKLSAgICBy
ZXR1cm4gYm94LmhlaWdodCgpICYmIGJveC5zdHlsZSgpLnZpc2liaWxpdHkoKSA9PSBWSVNJQkxF
ICYmICFib3guaXNGbG9hdGluZ09yT3V0T2ZGbG93UG9zaXRpb25lZCgpICYmICFib3guaXNJbkZs
b3dSZW5kZXJGbG93VGhyZWFkKCk7CisgICAgcmV0dXJuIGJveC5sb2dpY2FsSGVpZ2h0KCkgJiYg
Ym94LnN0eWxlKCkudmlzaWJpbGl0eSgpID09IFZJU0lCTEUgJiYgIWJveC5pc0Zsb2F0aW5nT3JP
dXRPZkZsb3dQb3NpdGlvbmVkKCkgJiYgIWJveC5pc0luRmxvd1JlbmRlckZsb3dUaHJlYWQoKTsK
IH0KIAogLy8gVmFsaWQgY2FuZGlkYXRlcyBpbiBhIEZsb3dUaHJlYWQgbXVzdCBiZSByZW5kZXJl
ZCBieSB0aGUgcmVnaW9uLgpAQCAtMjU5MSw3ICsyMzk3LDcgQEAgVmlzaWJsZVBvc2l0aW9uIFJl
bmRlckJsb2NrOjpwb3NpdGlvbkZvcgogICAgIGlmIChpc1RhYmxlKCkpCiAgICAgICAgIHJldHVy
biBSZW5kZXJCb3g6OnBvc2l0aW9uRm9yUG9pbnQocG9pbnQsIHJlZ2lvbik7CiAKLSAgICBpZiAo
aXNSZXBsYWNlZCgpKSB7CisgICAgaWYgKGlzUmVwbGFjZWQoKSAmJiAhaXNBbm9ueW1vdXNJbmxp
bmVCbG9jaygpKSB7CiAgICAgICAgIC8vIEZJWE1FOiBUaGlzIHNlZW1zIHdyb25nIHdoZW4gdGhl
IG9iamVjdCdzIHdyaXRpbmctbW9kZSBkb2Vzbid0IG1hdGNoIHRoZSBsaW5lJ3Mgd3JpdGluZy1t
b2RlLgogICAgICAgICBMYXlvdXRVbml0IHBvaW50TG9naWNhbExlZnQgPSBpc0hvcml6b250YWxX
cml0aW5nTW9kZSgpID8gcG9pbnQueCgpIDogcG9pbnQueSgpOwogICAgICAgICBMYXlvdXRVbml0
IHBvaW50TG9naWNhbFRvcCA9IGlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkgPyBwb2ludC55KCkg
OiBwb2ludC54KCk7CkBAIC0yODQ1LDcgKzI2NTEsNyBAQCBpbnQgUmVuZGVyQmxvY2s6OmJhc2Vs
aW5lUG9zaXRpb24oRm9udEJhCiAgICAgICAgIC8vICh0aGUgY29udGVudCBpbnNpZGUgdGhlbSBt
b3ZlcykuICBUaGlzIG1hdGNoZXMgV2luSUUgYXMgd2VsbCwgd2hpY2gganVzdCBib3R0b20tYWxp
Z25zIHRoZW0uCiAgICAgICAgIC8vIFdlIGFsc28gZ2l2ZSB1cCBvbiBmaW5kaW5nIGEgYmFzZWxp
bmUgaWYgd2UgaGF2ZSBhIHZlcnRpY2FsIHNjcm9sbGJhciwgb3IgaWYgd2UgYXJlIHNjcm9sbGVk
CiAgICAgICAgIC8vIHZlcnRpY2FsbHkgKGUuZy4sIGFuIG92ZXJmbG93OmhpZGRlbiBibG9jayB0
aGF0IGhhcyBoYWQgc2Nyb2xsVG9wIG1vdmVkKS4KLSAgICAgICAgYm9vbCBpZ25vcmVCYXNlbGlu
ZSA9IChsYXllcigpICYmIChsYXllcigpLT5tYXJxdWVlKCkgfHwgKGRpcmVjdGlvbiA9PSBIb3Jp
em9udGFsTGluZSA/IChsYXllcigpLT52ZXJ0aWNhbFNjcm9sbGJhcigpIHx8IGxheWVyKCktPnNj
cm9sbFlPZmZzZXQoKSAhPSAwKQorICAgICAgICBib29sIGlnbm9yZUJhc2VsaW5lID0gaXNBbm9u
eW1vdXNJbmxpbmVCbG9jaygpIHx8IChsYXllcigpICYmIChsYXllcigpLT5tYXJxdWVlKCkgfHwg
KGRpcmVjdGlvbiA9PSBIb3Jpem9udGFsTGluZSA/IChsYXllcigpLT52ZXJ0aWNhbFNjcm9sbGJh
cigpIHx8IGxheWVyKCktPnNjcm9sbFlPZmZzZXQoKSAhPSAwKQogICAgICAgICAgICAgOiAobGF5
ZXIoKS0+aG9yaXpvbnRhbFNjcm9sbGJhcigpIHx8IGxheWVyKCktPnNjcm9sbFhPZmZzZXQoKSAh
PSAwKSkpKSB8fCAoaXNXcml0aW5nTW9kZVJvb3QoKSAmJiAhaXNSdWJ5UnVuKCkpOwogICAgICAg
ICAKICAgICAgICAgaW50IGJhc2VsaW5lUG9zID0gaWdub3JlQmFzZWxpbmUgPyAtMSA6IGlubGlu
ZUJsb2NrQmFzZWxpbmUoZGlyZWN0aW9uKTsKQEAgLTMzMTMsNjQgKzMxMTksMTggQEAgdm9pZCBS
ZW5kZXJCbG9jazo6c2V0UGFnZUxvZ2ljYWxPZmZzZXQoTAogICAgIHJhcmVEYXRhLT5tX3BhZ2VM
b2dpY2FsT2Zmc2V0ID0gbG9naWNhbE9mZnNldDsKIH0KIAotdm9pZCBSZW5kZXJCbG9jazo6YWJz
b2x1dGVSZWN0cyhWZWN0b3I8SW50UmVjdD4mIHJlY3RzLCBjb25zdCBMYXlvdXRQb2ludCYgYWNj
dW11bGF0ZWRPZmZzZXQpIGNvbnN0Ci17Ci0gICAgLy8gRm9yIGJsb2NrcyBpbnNpZGUgaW5saW5l
cywgd2UgZ28gYWhlYWQgYW5kIGluY2x1ZGUgbWFyZ2lucyBzbyB0aGF0IHdlIHJ1biByaWdodCB1
cCB0byB0aGUKLSAgICAvLyBpbmxpbmUgYm94ZXMgYWJvdmUgYW5kIGJlbG93IHVzICh0aHVzIGdl
dHRpbmcgbWVyZ2VkIHdpdGggdGhlbSB0byBmb3JtIGEgc2luZ2xlIGlycmVndWxhcgotICAgIC8v
IHNoYXBlKS4KLSAgICBpZiAoaXNBbm9ueW1vdXNCbG9ja0NvbnRpbnVhdGlvbigpKSB7Ci0gICAg
ICAgIC8vIEZJWE1FOiBUaGlzIGlzIHdyb25nIGZvciBibG9jay1mbG93cyB0aGF0IGFyZSBob3Jp
em9udGFsLgotICAgICAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9NDY3ODEKLSAgICAgICAgcmVjdHMuYXBwZW5kKHNuYXBwZWRJbnRSZWN0KGFjY3VtdWxhdGVk
T2Zmc2V0LngoKSwgYWNjdW11bGF0ZWRPZmZzZXQueSgpIC0gY29sbGFwc2VkTWFyZ2luQmVmb3Jl
KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoKCksIGhlaWdodCgpICsg
Y29sbGFwc2VkTWFyZ2luQmVmb3JlKCkgKyBjb2xsYXBzZWRNYXJnaW5BZnRlcigpKSk7Ci0gICAg
ICAgIGNvbnRpbnVhdGlvbigpLT5hYnNvbHV0ZVJlY3RzKHJlY3RzLCBhY2N1bXVsYXRlZE9mZnNl
dCAtIHRvTGF5b3V0U2l6ZShsb2NhdGlvbigpICsKLSAgICAgICAgICAgICAgICBpbmxpbmVFbGVt
ZW50Q29udGludWF0aW9uKCktPmNvbnRhaW5pbmdCbG9jaygpLT5sb2NhdGlvbigpKSk7Ci0gICAg
fSBlbHNlCi0gICAgICAgIHJlY3RzLmFwcGVuZChzbmFwcGVkSW50UmVjdChhY2N1bXVsYXRlZE9m
ZnNldCwgc2l6ZSgpKSk7Ci19Ci0KIHZvaWQgUmVuZGVyQmxvY2s6OmFic29sdXRlUXVhZHMoVmVj
dG9yPEZsb2F0UXVhZD4mIHF1YWRzLCBib29sKiB3YXNGaXhlZCkgY29uc3QKIHsKICAgICAvLyBG
b3IgYmxvY2tzIGluc2lkZSBpbmxpbmVzLCB3ZSBnbyBhaGVhZCBhbmQgaW5jbHVkZSBtYXJnaW5z
IHNvIHRoYXQgd2UgcnVuIHJpZ2h0IHVwIHRvIHRoZQogICAgIC8vIGlubGluZSBib3hlcyBhYm92
ZSBhbmQgYmVsb3cgdXMgKHRodXMgZ2V0dGluZyBtZXJnZWQgd2l0aCB0aGVtIHRvIGZvcm0gYSBz
aW5nbGUgaXJyZWd1bGFyCiAgICAgLy8gc2hhcGUpLgotICAgIEZsb2F0UmVjdCBsb2NhbFJlY3Qg
PSBpc0Fub255bW91c0Jsb2NrQ29udGludWF0aW9uKCkgCi0gICAgICAgID8gRmxvYXRSZWN0KDAs
IC1jb2xsYXBzZWRNYXJnaW5CZWZvcmUoKSwgd2lkdGgoKSwgaGVpZ2h0KCkgKyBjb2xsYXBzZWRN
YXJnaW5CZWZvcmUoKSArIGNvbGxhcHNlZE1hcmdpbkFmdGVyKCkpCi0gICAgICAgIDogRmxvYXRS
ZWN0KDAsIDAsIHdpZHRoKCksIGhlaWdodCgpKTsKKyAgICBGbG9hdFJlY3QgbG9jYWxSZWN0ID0g
RmxvYXRSZWN0KDAsIDAsIHdpZHRoKCksIGhlaWdodCgpKTsKICAgICAKICAgICAvLyBGSVhNRTog
VGhpcyBpcyB3cm9uZyBmb3IgYmxvY2stZmxvd3MgdGhhdCBhcmUgaG9yaXpvbnRhbC4KICAgICAv
LyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDY3ODEKICAgICBSZW5k
ZXJGbG93VGhyZWFkKiBmbG93VGhyZWFkID0gZmxvd1RocmVhZENvbnRhaW5pbmdCbG9jaygpOwog
ICAgIGlmICghZmxvd1RocmVhZCB8fCAhZmxvd1RocmVhZC0+YWJzb2x1dGVRdWFkc0ZvckJveChx
dWFkcywgd2FzRml4ZWQsIHRoaXMsIGxvY2FsUmVjdC55KCksIGxvY2FsUmVjdC5tYXhZKCkpKQog
ICAgICAgICBxdWFkcy5hcHBlbmQobG9jYWxUb0Fic29sdXRlUXVhZChsb2NhbFJlY3QsIDAgLyog
bW9kZSAqLywgd2FzRml4ZWQpKTsKLQotICAgIGlmIChpc0Fub255bW91c0Jsb2NrQ29udGludWF0
aW9uKCkpCi0gICAgICAgIGNvbnRpbnVhdGlvbigpLT5hYnNvbHV0ZVF1YWRzKHF1YWRzLCB3YXNG
aXhlZCk7Ci19Ci0KLUxheW91dFJlY3QgUmVuZGVyQmxvY2s6OnJlY3RXaXRoT3V0bGluZUZvclJl
cGFpbnQoY29uc3QgUmVuZGVyTGF5ZXJNb2RlbE9iamVjdCogcmVwYWludENvbnRhaW5lciwgTGF5
b3V0VW5pdCBvdXRsaW5lV2lkdGgpIGNvbnN0Ci17Ci0gICAgTGF5b3V0UmVjdCByKFJlbmRlckJv
eDo6cmVjdFdpdGhPdXRsaW5lRm9yUmVwYWludChyZXBhaW50Q29udGFpbmVyLCBvdXRsaW5lV2lk
dGgpKTsKLSAgICBpZiAoaXNBbm9ueW1vdXNCbG9ja0NvbnRpbnVhdGlvbigpKQotICAgICAgICBy
LmluZmxhdGVZKGNvbGxhcHNlZE1hcmdpbkJlZm9yZSgpKTsgLy8gRklYTUU6IFRoaXMgaXMgd3Jv
bmcgZm9yIGJsb2NrLWZsb3dzIHRoYXQgYXJlIGhvcml6b250YWwuCi0gICAgcmV0dXJuIHI7Ci19
Ci0KLVJlbmRlckVsZW1lbnQqIFJlbmRlckJsb2NrOjpob3ZlckFuY2VzdG9yKCkgY29uc3QKLXsK
LSAgICByZXR1cm4gaXNBbm9ueW1vdXNCbG9ja0NvbnRpbnVhdGlvbigpID8gY29udGludWF0aW9u
KCkgOiBSZW5kZXJCb3g6OmhvdmVyQW5jZXN0b3IoKTsKLX0KLQotdm9pZCBSZW5kZXJCbG9jazo6
dXBkYXRlRHJhZ1N0YXRlKGJvb2wgZHJhZ09uKQotewotICAgIFJlbmRlckJveDo6dXBkYXRlRHJh
Z1N0YXRlKGRyYWdPbik7Ci0gICAgaWYgKFJlbmRlckJveE1vZGVsT2JqZWN0KiBjb250aW51YXRp
b24gPSB0aGlzLT5jb250aW51YXRpb24oKSkKLSAgICAgICAgY29udGludWF0aW9uLT51cGRhdGVE
cmFnU3RhdGUoZHJhZ09uKTsKLX0KLQotY29uc3QgUmVuZGVyU3R5bGUmIFJlbmRlckJsb2NrOjpv
dXRsaW5lU3R5bGVGb3JSZXBhaW50KCkgY29uc3QKLXsKLSAgICByZXR1cm4gaXNBbm9ueW1vdXNC
bG9ja0NvbnRpbnVhdGlvbigpID8gY29udGludWF0aW9uKCktPnN0eWxlKCkgOiBzdHlsZSgpOwog
fQogCiB2b2lkIFJlbmRlckJsb2NrOjpjaGlsZEJlY2FtZU5vbklubGluZShSZW5kZXJFbGVtZW50
JikKQEAgLTM0MTksMjAgKzMxNzksMjIgQEAgdm9pZCBSZW5kZXJCbG9jazo6YWRkRm9jdXNSaW5n
UmVjdHMoVmVjdAogICAgIC8vIEZvciBibG9ja3MgaW5zaWRlIGlubGluZXMsIHdlIGdvIGFoZWFk
IGFuZCBpbmNsdWRlIG1hcmdpbnMgc28gdGhhdCB3ZSBydW4gcmlnaHQgdXAgdG8gdGhlCiAgICAg
Ly8gaW5saW5lIGJveGVzIGFib3ZlIGFuZCBiZWxvdyB1cyAodGh1cyBnZXR0aW5nIG1lcmdlZCB3
aXRoIHRoZW0gdG8gZm9ybSBhIHNpbmdsZSBpcnJlZ3VsYXIKICAgICAvLyBzaGFwZSkuCi0gICAg
aWYgKGlubGluZUVsZW1lbnRDb250aW51YXRpb24oKSkgewotICAgICAgICAvLyBGSVhNRTogVGhp
cyBjaGVjayByZWFsbHkgaXNuJ3QgYWNjdXJhdGUuIAotICAgICAgICBib29sIG5leHRJbmxpbmVI
YXNMaW5lQm94ID0gaW5saW5lRWxlbWVudENvbnRpbnVhdGlvbigpLT5maXJzdExpbmVCb3goKTsK
LSAgICAgICAgLy8gRklYTUU6IFRoaXMgaXMgd3JvbmcuIFRoZSBwcmluY2lwYWwgcmVuZGVyZXIg
bWF5IG5vdCBiZSB0aGUgY29udGludWF0aW9uIHByZWNlZGluZyB0aGlzIGJsb2NrLgotICAgICAg
ICAvLyBGSVhNRTogVGhpcyBpcyB3cm9uZyBmb3IgYmxvY2stZmxvd3MgdGhhdCBhcmUgaG9yaXpv
bnRhbC4KLSAgICAgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTQ2NzgxCi0gICAgICAgIGJvb2wgcHJldklubGluZUhhc0xpbmVCb3ggPSBkb3duY2FzdDxSZW5k
ZXJJbmxpbmU+KCppbmxpbmVFbGVtZW50Q29udGludWF0aW9uKCktPmVsZW1lbnQoKS0+cmVuZGVy
ZXIoKSkuZmlyc3RMaW5lQm94KCk7Ci0gICAgICAgIGZsb2F0IHRvcE1hcmdpbiA9IHByZXZJbmxp
bmVIYXNMaW5lQm94ID8gY29sbGFwc2VkTWFyZ2luQmVmb3JlKCkgOiBMYXlvdXRVbml0KCk7Ci0g
ICAgICAgIGZsb2F0IGJvdHRvbU1hcmdpbiA9IG5leHRJbmxpbmVIYXNMaW5lQm94ID8gY29sbGFw
c2VkTWFyZ2luQWZ0ZXIoKSA6IExheW91dFVuaXQoKTsKLSAgICAgICAgTGF5b3V0UmVjdCByZWN0
KGFkZGl0aW9uYWxPZmZzZXQueCgpLCBhZGRpdGlvbmFsT2Zmc2V0LnkoKSAtIHRvcE1hcmdpbiwg
d2lkdGgoKSwgaGVpZ2h0KCkgKyB0b3BNYXJnaW4gKyBib3R0b21NYXJnaW4pOwotICAgICAgICBp
ZiAoIXJlY3QuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmVjdHMuYXBwZW5kKHNuYXBwZWRJbnRS
ZWN0KHJlY3QpKTsKLSAgICB9IGVsc2UgaWYgKHdpZHRoKCkgJiYgaGVpZ2h0KCkpCi0gICAgICAg
IHJlY3RzLmFwcGVuZChzbmFwcGVkSW50UmVjdChhZGRpdGlvbmFsT2Zmc2V0LCBzaXplKCkpKTsK
KyAgICBpZiAoaXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpICYmIGxvZ2ljYWxIZWlnaHQoKSkgewor
ICAgICAgICAvLyBGSVhNRTogTm90IHN1cmUgaWYgdGhpcyB3b3JrcyB3aXRoIGZsaXBwZWQgbGlu
ZXMsIGJ1dCBub25lIG9mIHRoZSBvdGhlciBmb2N1cyByaW5nCisgICAgICAgIC8vIGNvZGUgZXZl
biB3b3JrcyB3aXRoIHZlcnRpY2FsIHdyaXRpbmcgbW9kZSwgc28gd2UncmUgYWxyZWFkeSBhaGVh
ZCBvZiB0aGUgY3VydmUuIDspCisgICAgICAgIExheW91dFVuaXQgdG9wID0gaXNIb3Jpem9udGFs
V3JpdGluZ01vZGUoKSA/IGFkZGl0aW9uYWxPZmZzZXQueSgpIDogYWRkaXRpb25hbE9mZnNldC54
KCk7CisgICAgICAgIExheW91dFVuaXQgYm90dG9tID0gdG9wICsgbG9naWNhbEhlaWdodCgpOwor
ICAgICAgICBpZiAoaW5saW5lQm94V3JhcHBlcigpICYmIGlubGluZUJveFdyYXBwZXIoKS0+cm9v
dCgpLnByZXZSb290Qm94KCkpCisgICAgICAgICAgICB0b3AgPSBzdGQ6Om1pbih0b3AsIHRvcCAt
IGNvbnRhaW5pbmdCbG9jaygpLT5jb2xsYXBzZWRNYXJnaW5CZWZvcmVGb3JDaGlsZCgqdGhpcykp
OworICAgICAgICBpZiAoaW5saW5lQm94V3JhcHBlcigpICYmIGlubGluZUJveFdyYXBwZXIoKS0+
cm9vdCgpLm5leHRSb290Qm94KCkpCisgICAgICAgICAgICBib3R0b20gPSBzdGQ6Om1heChib3R0
b20sIGJvdHRvbSArIGNvbnRhaW5pbmdCbG9jaygpLT5jb2xsYXBzZWRNYXJnaW5BZnRlckZvckNo
aWxkKCp0aGlzKSk7CisgICAgICAgIExheW91dFJlY3QgcmVzdWx0KGlzSG9yaXpvbnRhbFdyaXRp
bmdNb2RlKCkgPyBhZGRpdGlvbmFsT2Zmc2V0LngoKSA6IGFkZGl0aW9uYWxPZmZzZXQueSgpLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AsIGxvZ2ljYWxXaWR0aCgpLCBib3R0b20gLSB0
b3ApOworICAgICAgICBpZiAoIWlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpCisgICAgICAgICAg
ICByZXN1bHQgPSByZXN1bHQudHJhbnNwb3NlZFJlY3QoKTsKKyAgICAgICAgaWYgKCFyZXN1bHQu
aXNFbXB0eSgpKQorICAgICAgICAgICAgcmVjdHMuYXBwZW5kKHJlc3VsdCk7CisgICAgfQogCiAg
ICAgaWYgKCFoYXNPdmVyZmxvd0NsaXAoKSAmJiAhaGFzQ29udHJvbENsaXAoKSkgewogICAgICAg
ICBpZiAoY2hpbGRyZW5JbmxpbmUoKSkKQEAgLTM0NTEsOSArMzIxMyw2IEBAIHZvaWQgUmVuZGVy
QmxvY2s6OmFkZEZvY3VzUmluZ1JlY3RzKFZlY3QKICAgICAgICAgICAgIH0KICAgICAgICAgfQog
ICAgIH0KLQotICAgIGlmIChpbmxpbmVFbGVtZW50Q29udGludWF0aW9uKCkpCi0gICAgICAgIGlu
bGluZUVsZW1lbnRDb250aW51YXRpb24oKS0+YWRkRm9jdXNSaW5nUmVjdHMocmVjdHMsIGZsb29y
ZWRMYXlvdXRQb2ludChMYXlvdXRQb2ludChhZGRpdGlvbmFsT2Zmc2V0ICsgaW5saW5lRWxlbWVu
dENvbnRpbnVhdGlvbigpLT5jb250YWluaW5nQmxvY2soKS0+bG9jYXRpb24oKSAtIGxvY2F0aW9u
KCkpKSwgcGFpbnRDb250YWluZXIpOwogfQogCiBSZW5kZXJCb3gqIFJlbmRlckJsb2NrOjpjcmVh
dGVBbm9ueW1vdXNCb3hXaXRoU2FtZVR5cGVBcyhjb25zdCBSZW5kZXJPYmplY3QqIHBhcmVudCkg
Y29uc3QKQEAgLTM2NjYsNiArMzQyNSw5IEBAIGNvbnN0IGNoYXIqIFJlbmRlckJsb2NrOjpyZW5k
ZXJOYW1lKCkgY28KICAgICAgICAgcmV0dXJuICJSZW5kZXJCbG9jayAocG9zaXRpb25lZCkiOwog
ICAgIGlmIChpc0Fub255bW91c0Jsb2NrKCkpCiAgICAgICAgIHJldHVybiAiUmVuZGVyQmxvY2sg
KGFub255bW91cykiOworICAgIGlmIChpc0Fub255bW91c0lubGluZUJsb2NrKCkpCisgICAgICAg
IHJldHVybiAiUmVuZGVyQmxvY2sgKGFub255bW91cyBpbmxpbmUtYmxvY2spIjsKKyAKICAgICAv
LyBGSVhNRTogVGVtcG9yYXJ5IGhhY2sgd2hpbGUgdGhlIG5ldyBnZW5lcmF0ZWQgY29udGVudCBz
eXN0ZW0gaXMgYmVpbmcgaW1wbGVtZW50ZWQuCiAgICAgaWYgKGlzUHNldWRvRWxlbWVudCgpKQog
ICAgICAgICByZXR1cm4gIlJlbmRlckJsb2NrIChnZW5lcmF0ZWQpIjsKSW5kZXg6IFNvdXJjZS9X
ZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJD
b3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5oCShyZXZpc2lvbiAxODEzMjkpCisrKyBTb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suaAkod29ya2luZyBjb3B5KQpAQCAtMTgyLDE3
ICsxODIsNiBAQCBwdWJsaWM6CiAKICAgICBMYXlvdXRSZWN0IGxvZ2ljYWxSZWN0VG9QaHlzaWNh
bFJlY3QoY29uc3QgTGF5b3V0UG9pbnQmIHBoeXNpY2FsUG9zaXRpb24sIGNvbnN0IExheW91dFJl
Y3QmIGxvZ2ljYWxSZWN0KTsKIAotICAgIHZvaWQgYWRkQ29udGludWF0aW9uV2l0aE91dGxpbmUo
UmVuZGVySW5saW5lKik7Ci0gICAgYm9vbCBwYWludHNDb250aW51YXRpb25PdXRsaW5lKFJlbmRl
cklubGluZSopOwotCi0gICAgdmlydHVhbCBSZW5kZXJCb3hNb2RlbE9iamVjdCogdmlydHVhbENv
bnRpbnVhdGlvbigpIGNvbnN0IG92ZXJyaWRlIGZpbmFsIHsgcmV0dXJuIGNvbnRpbnVhdGlvbigp
OyB9Ci0gICAgYm9vbCBpc0Fub255bW91c0Jsb2NrQ29udGludWF0aW9uKCkgY29uc3QgeyByZXR1
cm4gaXNBbm9ueW1vdXNCbG9jaygpICYmIGNvbnRpbnVhdGlvbigpOyB9Ci0gICAgV0VCQ09SRV9F
WFBPUlQgUmVuZGVySW5saW5lKiBpbmxpbmVFbGVtZW50Q29udGludWF0aW9uKCkgY29uc3Q7Ci0g
ICAgUmVuZGVyQmxvY2sqIGJsb2NrRWxlbWVudENvbnRpbnVhdGlvbigpIGNvbnN0OwotCi0gICAg
dXNpbmcgUmVuZGVyQm94TW9kZWxPYmplY3Q6OmNvbnRpbnVhdGlvbjsKLSAgICB1c2luZyBSZW5k
ZXJCb3hNb2RlbE9iamVjdDo6c2V0Q29udGludWF0aW9uOwotCiAgICAgc3RhdGljIFJlbmRlckJs
b2NrKiBjcmVhdGVBbm9ueW1vdXNXaXRoUGFyZW50UmVuZGVyZXJBbmREaXNwbGF5KGNvbnN0IFJl
bmRlck9iamVjdCosIEVEaXNwbGF5ID0gQkxPQ0spOwogICAgIFJlbmRlckJsb2NrKiBjcmVhdGVB
bm9ueW1vdXNCbG9jayhFRGlzcGxheSBkaXNwbGF5ID0gQkxPQ0spIGNvbnN0IHsgcmV0dXJuIGNy
ZWF0ZUFub255bW91c1dpdGhQYXJlbnRSZW5kZXJlckFuZERpc3BsYXkodGhpcywgZGlzcGxheSk7
IH0KICAgICBzdGF0aWMgdm9pZCBjb2xsYXBzZUFub255bW91c0JveENoaWxkKFJlbmRlckJsb2Nr
JiBwYXJlbnQsIFJlbmRlckJsb2NrKiBjaGlsZCk7CkBAIC00NTIsMTEgKzQ0MSw2IEBAIHByaXZh
dGU6CiAgICAgLy8gY2hpbGRyZW4uCiAgICAgdmlydHVhbCBSZW5kZXJCbG9jayogZmlyc3RMaW5l
QmxvY2soKSBjb25zdCBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgTGF5b3V0UmVjdCByZWN0V2l0
aE91dGxpbmVGb3JSZXBhaW50KGNvbnN0IFJlbmRlckxheWVyTW9kZWxPYmplY3QqIHJlcGFpbnRD
b250YWluZXIsIExheW91dFVuaXQgb3V0bGluZVdpZHRoKSBjb25zdCBvdmVycmlkZSBmaW5hbDsK
LSAgICB2aXJ0dWFsIGNvbnN0IFJlbmRlclN0eWxlJiBvdXRsaW5lU3R5bGVGb3JSZXBhaW50KCkg
Y29uc3Qgb3ZlcnJpZGUgZmluYWw7Ci0KLSAgICB2aXJ0dWFsIFJlbmRlckVsZW1lbnQqIGhvdmVy
QW5jZXN0b3IoKSBjb25zdCBvdmVycmlkZSBmaW5hbDsKLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRl
RHJhZ1N0YXRlKGJvb2wgZHJhZ09uKSBvdmVycmlkZSBmaW5hbDsKICAgICB2aXJ0dWFsIHZvaWQg
Y2hpbGRCZWNhbWVOb25JbmxpbmUoUmVuZGVyRWxlbWVudCYpIG92ZXJyaWRlIGZpbmFsOwogCiAg
ICAgdmlydHVhbCBMYXlvdXRSZWN0IHNlbGVjdGlvblJlY3RGb3JSZXBhaW50KGNvbnN0IFJlbmRl
ckxheWVyTW9kZWxPYmplY3QqIHJlcGFpbnRDb250YWluZXIsIGJvb2wgLypjbGlwVG9WaXNpYmxl
Q29udGVudCovKSBvdmVycmlkZSBmaW5hbApAQCAtNDc5LDE5ICs0NjMsMTUgQEAgcHJpdmF0ZToK
ICAgICB2aXJ0dWFsIHZvaWQgY2xpcE91dEZsb2F0aW5nT2JqZWN0cyhSZW5kZXJCbG9jayYsIGNv
bnN0IFBhaW50SW5mbyosIGNvbnN0IExheW91dFBvaW50JiwgY29uc3QgTGF5b3V0U2l6ZSYpIHsg
fTsKICAgICBmcmllbmQgY2xhc3MgTG9naWNhbFNlbGVjdGlvbk9mZnNldENhY2hlczsKIAotICAg
IHZpcnR1YWwgdm9pZCBhYnNvbHV0ZVJlY3RzKFZlY3RvcjxJbnRSZWN0PiYsIGNvbnN0IExheW91
dFBvaW50JiBhY2N1bXVsYXRlZE9mZnNldCkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCB2
b2lkIGFic29sdXRlUXVhZHMoVmVjdG9yPEZsb2F0UXVhZD4mLCBib29sKiB3YXNGaXhlZCkgY29u
c3Qgb3ZlcnJpZGU7CiAKLSAgICB2b2lkIHBhaW50Q29udGludWF0aW9uT3V0bGluZXMoUGFpbnRJ
bmZvJiwgY29uc3QgTGF5b3V0UG9pbnQmKTsKLQogICAgIHZpcnR1YWwgTGF5b3V0UmVjdCBsb2Nh
bENhcmV0UmVjdChJbmxpbmVCb3gqLCBpbnQgY2FyZXRPZmZzZXQsIExheW91dFVuaXQqIGV4dHJh
V2lkdGhUb0VuZE9mTGluZSA9IDApIG92ZXJyaWRlIGZpbmFsOwogICAgIAogICAgIC8vIEZJWE1F
LUJMT0NLRkxPVzogUmVtb3ZlIHZpcnR1YWxpemFpb24gd2hlbiBhbGwgY2FsbGVycyBoYXZlIG1v
dmVkIHRvIFJlbmRlckJsb2NrRmxvdwogICAgIHZpcnR1YWwgVmlzaWJsZVBvc2l0aW9uIHBvc2l0
aW9uRm9yUG9pbnRXaXRoSW5saW5lQ2hpbGRyZW4oY29uc3QgTGF5b3V0UG9pbnQmLCBjb25zdCBS
ZW5kZXJSZWdpb24qKTsKIAogICAgIFJlbmRlclB0cjxSZW5kZXJCbG9jaz4gY2xvbmUoKSBjb25z
dDsKLSAgICBSZW5kZXJCbG9jayogY29udGludWF0aW9uQmVmb3JlKFJlbmRlck9iamVjdCogYmVm
b3JlQ2hpbGQpOwotCisgCiAgICAgUmVuZGVyRmxvd1RocmVhZCogdXBkYXRlQ2FjaGVkRmxvd1Ro
cmVhZENvbnRhaW5pbmdCbG9jayhSZW5kZXJGbG93VGhyZWFkKikgY29uc3Q7CiAKIHByaXZhdGU6
CkBAIC01MTYsNiArNDk2LDggQEAgcHVibGljOgogICAgIC8vIFJlbmRlclJ1YnlCYXNlIG9iamVj
dHMgbmVlZCB0byBiZSBhYmxlIHRvIHNwbGl0IGFuZCBtZXJnZSwgbW92aW5nIHRoZWlyIGNoaWxk
cmVuIGFyb3VuZAogICAgIC8vIChjYWxsaW5nIG1vdmVDaGlsZFRvLCBtb3ZlQWxsQ2hpbGRyZW5U
bywgYW5kIG1ha2VDaGlsZHJlbk5vbklubGluZSkuCiAgICAgZnJpZW5kIGNsYXNzIFJlbmRlclJ1
YnlCYXNlOworICAgIAorICAgIGZyaWVuZCBjbGFzcyBJbmxpbmVFbGVtZW50Qm94OwogCiBwcml2
YXRlOgogICAgIC8vIFVzZWQgdG8gc3RvcmUgc3RhdGUgYmV0d2VlbiBzdHlsZVdpbGxDaGFuZ2Ug
YW5kIHN0eWxlRGlkQ2hhbmdlCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVy
QmxvY2tGbG93LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVu
ZGVyQmxvY2tGbG93LmNwcAkocmV2aXNpb24gMTgxMzI5KQorKysgU291cmNlL1dlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlckJsb2NrRmxvdy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMyLDYgKzMyLDcg
QEAKICNpbmNsdWRlICJIaXRUZXN0TG9jYXRpb24uaCIKICNpbmNsdWRlICJJbmxpbmVUZXh0Qm94
LmgiCiAjaW5jbHVkZSAiTGF5b3V0UmVwYWludGVyLmgiCisjaW5jbHVkZSAiTG9naWNhbFNlbGVj
dGlvbk9mZnNldENhY2hlcy5oIgogI2luY2x1ZGUgIlJlbmRlckNvbWJpbmVUZXh0LmgiCiAjaW5j
bHVkZSAiUmVuZGVyRmxvd1RocmVhZC5oIgogI2luY2x1ZGUgIlJlbmRlcklubGluZS5oIgpAQCAt
MjM3LDkgKzIzOCwxMSBAQCB2b2lkIFJlbmRlckJsb2NrRmxvdzo6cmVidWlsZEZsb2F0aW5nT2Jq
CiAKICAgICAvLyBGaXJzdCBhZGQgaW4gZmxvYXRzIGZyb20gdGhlIHBhcmVudC4gU2VsZi1jb2xs
YXBzaW5nIGJsb2NrcyBsZXQgdGhlaXIgcGFyZW50IHRyYWNrIGFueSBmbG9hdHMgdGhhdCBpbnRy
dWRlIGludG8KICAgICAvLyB0aGVtIChhcyBvcHBvc2VkIHRvIGZsb2F0cyB0aGV5IGNvbnRhaW4g
dGhlbXNlbHZlcykgc28gY2hlY2sgZm9yIHRob3NlIGhlcmUgdG9vLgotICAgIFJlbmRlckJsb2Nr
RmxvdyYgcGFyZW50QmxvY2sgPSBkb3duY2FzdDxSZW5kZXJCbG9ja0Zsb3c+KCpwYXJlbnQoKSk7
Ci0gICAgYm9vbCBwYXJlbnRIYXNGbG9hdHMgPSBmYWxzZTsKLSAgICBSZW5kZXJCbG9ja0Zsb3cq
IHByZXZpb3VzQmxvY2sgPSBwcmV2aW91c1NpYmxpbmdXaXRoT3ZlcmhhbmdpbmdGbG9hdHMocGFy
ZW50SGFzRmxvYXRzKTsKKyAgICBSZW5kZXJCbG9ja0Zsb3cmIHBhcmVudEJsb2NrID0gZG93bmNh
c3Q8UmVuZGVyQmxvY2tGbG93Pihpc0Fub255bW91c0lubGluZUJsb2NrKCkgPyAqY29udGFpbmlu
Z0Jsb2NrKCkgOiAqcGFyZW50KCkpOworICAgIGJvb2wgcGFyZW50SGFzRmxvYXRzID0gaXNBbm9u
eW1vdXNJbmxpbmVCbG9jaygpID8gcGFyZW50QmxvY2suY29udGFpbnNGbG9hdHMoKSA6IGZhbHNl
OworICAgIFJlbmRlckJsb2NrRmxvdyogcHJldmlvdXNCbG9jayA9IG51bGxwdHI7CisgICAgaWYg
KCFpc0Fub255bW91c0lubGluZUJsb2NrKCkpCisgICAgICAgIHByZXZpb3VzQmxvY2sgPSBwcmV2
aW91c1NpYmxpbmdXaXRoT3ZlcmhhbmdpbmdGbG9hdHMocGFyZW50SGFzRmxvYXRzKTsKICAgICBM
YXlvdXRVbml0IGxvZ2ljYWxUb3BPZmZzZXQgPSBsb2dpY2FsVG9wKCk7CiAgICAgaWYgKHBhcmVu
dEhhc0Zsb2F0cyB8fCAocGFyZW50QmxvY2subG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tKCkgPiBs
b2dpY2FsVG9wT2Zmc2V0ICYmIHByZXZpb3VzQmxvY2sgJiYgcHJldmlvdXNCbG9jay0+aXNTZWxm
Q29sbGFwc2luZ0Jsb2NrKCkpKQogICAgICAgICBhZGRJbnRydWRpbmdGbG9hdHMoJnBhcmVudEJs
b2NrLCBwYXJlbnRCbG9jay5sb2dpY2FsTGVmdE9mZnNldEZvckNvbnRlbnQoKSwgbG9naWNhbFRv
cE9mZnNldCk7CkBAIC03MDksNyArNzEyLDcgQEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmxheW91
dEJsb2NrQ2hpbGQoUgogCiAgICAgLy8gTm93IGRldGVybWluZSB0aGUgY29ycmVjdCB5cG9zIGJh
c2VkIG9mZiBleGFtaW5hdGlvbiBvZiBjb2xsYXBzaW5nIG1hcmdpbgogICAgIC8vIHZhbHVlcy4K
LSAgICBMYXlvdXRVbml0IGxvZ2ljYWxUb3BCZWZvcmVDbGVhciA9IGNvbGxhcHNlTWFyZ2lucyhj
aGlsZCwgbWFyZ2luSW5mbyk7CisgICAgTGF5b3V0VW5pdCBsb2dpY2FsVG9wQmVmb3JlQ2xlYXIg
PSBjb2xsYXBzZU1hcmdpbnMoJmNoaWxkLCBjaGlsZC5wcmV2aW91c1NpYmxpbmcoKSwgbWFyZ2lu
SW5mbyk7CiAKICAgICAvLyBOb3cgY2hlY2sgZm9yIGNsZWFyLgogICAgIExheW91dFVuaXQgbG9n
aWNhbFRvcEFmdGVyQ2xlYXIgPSBjbGVhckZsb2F0c0lmTmVlZGVkKGNoaWxkLCBtYXJnaW5JbmZv
LCBvbGRQb3NNYXJnaW5CZWZvcmUsIG9sZE5lZ01hcmdpbkJlZm9yZSwgbG9naWNhbFRvcEJlZm9y
ZUNsZWFyKTsKQEAgLTk0MiwxNyArOTQ1LDE3IEBAIFJlbmRlckJsb2NrRmxvdzo6TWFyZ2luVmFs
dWVzIFJlbmRlckJsb2MKICAgICByZXR1cm4gTWFyZ2luVmFsdWVzKGNoaWxkQmVmb3JlUG9zaXRp
dmUsIGNoaWxkQmVmb3JlTmVnYXRpdmUsIGNoaWxkQWZ0ZXJQb3NpdGl2ZSwgY2hpbGRBZnRlck5l
Z2F0aXZlKTsKIH0KIAotTGF5b3V0VW5pdCBSZW5kZXJCbG9ja0Zsb3c6OmNvbGxhcHNlTWFyZ2lu
cyhSZW5kZXJCb3gmIGNoaWxkLCBNYXJnaW5JbmZvJiBtYXJnaW5JbmZvKQorTGF5b3V0VW5pdCBS
ZW5kZXJCbG9ja0Zsb3c6OmNvbGxhcHNlTWFyZ2lucyhSZW5kZXJCb3gqIGNoaWxkLCBSZW5kZXJP
YmplY3QqIHByZXYsIE1hcmdpbkluZm8mIG1hcmdpbkluZm8pCiB7Ci0gICAgYm9vbCBjaGlsZERp
c2NhcmRNYXJnaW5CZWZvcmUgPSBtdXN0RGlzY2FyZE1hcmdpbkJlZm9yZUZvckNoaWxkKGNoaWxk
KTsKLSAgICBib29sIGNoaWxkRGlzY2FyZE1hcmdpbkFmdGVyID0gbXVzdERpc2NhcmRNYXJnaW5B
ZnRlckZvckNoaWxkKGNoaWxkKTsKLSAgICBib29sIGNoaWxkSXNTZWxmQ29sbGFwc2luZyA9IGNo
aWxkLmlzU2VsZkNvbGxhcHNpbmdCbG9jaygpOworICAgIGJvb2wgY2hpbGREaXNjYXJkTWFyZ2lu
QmVmb3JlID0gY2hpbGQgPyBtdXN0RGlzY2FyZE1hcmdpbkJlZm9yZUZvckNoaWxkKCpjaGlsZCkg
OiBmYWxzZTsKKyAgICBib29sIGNoaWxkRGlzY2FyZE1hcmdpbkFmdGVyID0gY2hpbGQgPyBtdXN0
RGlzY2FyZE1hcmdpbkFmdGVyRm9yQ2hpbGQoKmNoaWxkKSA6IGZhbHNlOworICAgIGJvb2wgY2hp
bGRJc1NlbGZDb2xsYXBzaW5nID0gY2hpbGQgPyBjaGlsZC0+aXNTZWxmQ29sbGFwc2luZ0Jsb2Nr
KCkgOiBmYWxzZTsKIAogICAgIC8vIFRoZSBjaGlsZCBkaXNjYXJkcyB0aGUgYmVmb3JlIG1hcmdp
biB3aGVuIHRoZSB0aGUgYWZ0ZXIgbWFyZ2luIGhhcyBkaXNjYXJkIGluIHRoZSBjYXNlIG9mIGEg
c2VsZiBjb2xsYXBzaW5nIGJsb2NrLgogICAgIGNoaWxkRGlzY2FyZE1hcmdpbkJlZm9yZSA9IGNo
aWxkRGlzY2FyZE1hcmdpbkJlZm9yZSB8fCAoY2hpbGREaXNjYXJkTWFyZ2luQWZ0ZXIgJiYgY2hp
bGRJc1NlbGZDb2xsYXBzaW5nKTsKIAogICAgIC8vIEdldCB0aGUgZm91ciBtYXJnaW4gdmFsdWVz
IGZvciB0aGUgY2hpbGQgYW5kIGNhY2hlIHRoZW0uCi0gICAgY29uc3QgTWFyZ2luVmFsdWVzIGNo
aWxkTWFyZ2lucyA9IG1hcmdpblZhbHVlc0ZvckNoaWxkKGNoaWxkKTsKKyAgICBjb25zdCBNYXJn
aW5WYWx1ZXMgY2hpbGRNYXJnaW5zID0gY2hpbGQgPyBtYXJnaW5WYWx1ZXNGb3JDaGlsZCgqY2hp
bGQpIDogTWFyZ2luVmFsdWVzKDAsIDAsIDAsIDApOwogCiAgICAgLy8gR2V0IG91ciBtYXggcG9z
IGFuZCBuZWcgdG9wIG1hcmdpbnMuCiAgICAgTGF5b3V0VW5pdCBwb3NUb3AgPSBjaGlsZE1hcmdp
bnMucG9zaXRpdmVNYXJnaW5CZWZvcmUoKTsKQEAgLTk2Nyw3ICs5NzAsNyBAQCBMYXlvdXRVbml0
IFJlbmRlckJsb2NrRmxvdzo6Y29sbGFwc2VNYXJnCiAgICAgCiAgICAgLy8gU2VlIGlmIHRoZSB0
b3AgbWFyZ2luIGlzIHF1aXJreS4gV2Ugb25seSBjYXJlIGlmIHRoaXMgY2hpbGQgaGFzCiAgICAg
Ly8gbWFyZ2lucyB0aGF0IHdpbGwgY29sbGFwc2Ugd2l0aCB1cy4KLSAgICBib29sIHRvcFF1aXJr
ID0gaGFzTWFyZ2luQmVmb3JlUXVpcmsoY2hpbGQpOworICAgIGJvb2wgdG9wUXVpcmsgPSBjaGls
ZCA/IGhhc01hcmdpbkJlZm9yZVF1aXJrKCpjaGlsZCkgOiBmYWxzZTsKIAogICAgIGlmIChtYXJn
aW5JbmZvLmNhbkNvbGxhcHNlV2l0aE1hcmdpbkJlZm9yZSgpKSB7CiAgICAgICAgIGlmICghY2hp
bGREaXNjYXJkTWFyZ2luQmVmb3JlICYmICFtYXJnaW5JbmZvLmRpc2NhcmRNYXJnaW4oKSkgewpA
QCAtMTAxMSw3ICsxMDE0LDcgQEAgTGF5b3V0VW5pdCBSZW5kZXJCbG9ja0Zsb3c6OmNvbGxhcHNl
TWFyZwogICAgIExheW91dFVuaXQgbG9naWNhbFRvcCA9IGJlZm9yZUNvbGxhcHNlTG9naWNhbFRv
cDsKIAogICAgIExheW91dFVuaXQgY2xlYXJhbmNlRm9yU2VsZkNvbGxhcHNpbmdCbG9jazsKLSAg
ICBSZW5kZXJPYmplY3QqIHByZXYgPSBjaGlsZC5wcmV2aW91c1NpYmxpbmcoKTsKKyAgICAKICAg
ICAvLyBJZiB0aGUgY2hpbGQncyBwcmV2aW91cyBzaWJsaW5nIGlzIGEgc2VsZi1jb2xsYXBzaW5n
IGJsb2NrIHRoYXQgY2xlYXJlZCBhIGZsb2F0IHRoZW4gaXRzIHRvcCBib3JkZXIgZWRnZSBoYXMg
YmVlbiBzZXQgYXQgdGhlIGJvdHRvbSBib3JkZXIgZWRnZQogICAgIC8vIG9mIHRoZSBmbG9hdC4g
U2luY2Ugd2Ugd2FudCB0byBjb2xsYXBzZSB0aGUgY2hpbGQncyB0b3AgbWFyZ2luIHdpdGggdGhl
IHNlbGYtY29sbGFwc2luZyBibG9jaydzIHRvcCBhbmQgYm90dG9tIG1hcmdpbnMgd2UgbmVlZCB0
byBhZGp1c3Qgb3VyIHBhcmVudCdzIGhlaWdodCB0byBtYXRjaCB0aGUgCiAgICAgLy8gbWFyZ2lu
IHRvcCBvZiB0aGUgc2VsZi1jb2xsYXBzaW5nIGJsb2NrLiBJZiB0aGUgcmVzdWx0aW5nIGNvbGxh
cHNlZCBtYXJnaW4gbGVhdmVzIHRoZSBjaGlsZCBzdGlsbCBpbnRydWRpbmcgaW50byB0aGUgZmxv
YXQgdGhlbiB3ZSB3aWxsIHdhbnQgdG8gY2xlYXIgaXQuCkBAIC0xMDQ0LDEzICsxMDQ3LDEzIEBA
IExheW91dFVuaXQgUmVuZGVyQmxvY2tGbG93Ojpjb2xsYXBzZU1hcmcKICAgICAgICAgICAgICAg
ICBsb2dpY2FsVG9wID0gbG9naWNhbEhlaWdodCgpICsgY29sbGFwc2VkQmVmb3JlUG9zIC0gY29s
bGFwc2VkQmVmb3JlTmVnOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG11
c3RTZXBhcmF0ZU1hcmdpbkJlZm9yZUZvckNoaWxkKGNoaWxkKSkgeworICAgICAgICBpZiAoY2hp
bGQgJiYgbXVzdFNlcGFyYXRlTWFyZ2luQmVmb3JlRm9yQ2hpbGQoKmNoaWxkKSkgewogICAgICAg
ICAgICAgQVNTRVJUKCFtYXJnaW5JbmZvLmRpc2NhcmRNYXJnaW4oKSB8fCAobWFyZ2luSW5mby5k
aXNjYXJkTWFyZ2luKCkgJiYgIW1hcmdpbkluZm8ubWFyZ2luKCkpKTsKICAgICAgICAgICAgIC8v
IElmIHdlIGFyZSBhdCB0aGUgYmVmb3JlIHNpZGUgb2YgdGhlIGJsb2NrIGFuZCB3ZSBjb2xsYXBz
ZSwgaWdub3JlIHRoZSBjb21wdXRlZCBtYXJnaW4KICAgICAgICAgICAgIC8vIGFuZCBqdXN0IGFk
ZCB0aGUgY2hpbGQgbWFyZ2luIHRvIHRoZSBjb250YWluZXIgaGVpZ2h0LiBUaGlzIHdpbGwgY29y
cmVjdGx5IHBvc2l0aW9uCiAgICAgICAgICAgICAvLyB0aGUgY2hpbGQgaW5zaWRlIHRoZSBjb250
YWluZXIuCiAgICAgICAgICAgICBMYXlvdXRVbml0IHNlcGFyYXRlTWFyZ2luID0gIW1hcmdpbklu
Zm8uY2FuQ29sbGFwc2VXaXRoTWFyZ2luQmVmb3JlKCkgPyBtYXJnaW5JbmZvLm1hcmdpbigpIDog
TGF5b3V0VW5pdDo6ZnJvbVBpeGVsKDApOwotICAgICAgICAgICAgc2V0TG9naWNhbEhlaWdodChs
b2dpY2FsSGVpZ2h0KCkgKyBzZXBhcmF0ZU1hcmdpbiArIG1hcmdpbkJlZm9yZUZvckNoaWxkKGNo
aWxkKSk7CisgICAgICAgICAgICBzZXRMb2dpY2FsSGVpZ2h0KGxvZ2ljYWxIZWlnaHQoKSArIHNl
cGFyYXRlTWFyZ2luICsgbWFyZ2luQmVmb3JlRm9yQ2hpbGQoKmNoaWxkKSk7CiAgICAgICAgICAg
ICBsb2dpY2FsVG9wID0gbG9naWNhbEhlaWdodCgpOwogICAgICAgICB9IGVsc2UgaWYgKCFtYXJn
aW5JbmZvLmRpc2NhcmRNYXJnaW4oKSAmJiAoIW1hcmdpbkluZm8uYXRCZWZvcmVTaWRlT2ZCbG9j
aygpCiAgICAgICAgICAgICB8fCAoIW1hcmdpbkluZm8uY2FuQ29sbGFwc2VNYXJnaW5CZWZvcmVX
aXRoQ2hpbGRyZW4oKQpAQCAtMTA3MCw3ICsxMDczLDcgQEAgTGF5b3V0VW5pdCBSZW5kZXJCbG9j
a0Zsb3c6OmNvbGxhcHNlTWFyZwogICAgICAgICAgICAgbWFyZ2luSW5mby5jbGVhck1hcmdpbigp
OwogCiAgICAgICAgIGlmIChtYXJnaW5JbmZvLm1hcmdpbigpKQotICAgICAgICAgICAgbWFyZ2lu
SW5mby5zZXRIYXNNYXJnaW5BZnRlclF1aXJrKGhhc01hcmdpbkFmdGVyUXVpcmsoY2hpbGQpKTsK
KyAgICAgICAgICAgIG1hcmdpbkluZm8uc2V0SGFzTWFyZ2luQWZ0ZXJRdWlyayhjaGlsZCAmJiBo
YXNNYXJnaW5BZnRlclF1aXJrKCpjaGlsZCkpOwogICAgIH0KICAgICAKICAgICAvLyBJZiBtYXJn
aW5zIHdvdWxkIHB1bGwgdXMgcGFzdCB0aGUgdG9wIG9mIHRoZSBuZXh0IHBhZ2UsIHRoZW4gd2Ug
bmVlZCB0byBwdWxsIGJhY2sgYW5kIHByZXRlbmQgbGlrZSB0aGUgbWFyZ2lucwpAQCAtMTA5Nyw4
ICsxMTAwLDggQEAgTGF5b3V0VW5pdCBSZW5kZXJCbG9ja0Zsb3c6OmNvbGxhcHNlTWFyZwogICAg
ICAgICAvLyBpbnRvIHRoZSBtYXJnaW4gYXJlYSBvZiB0aGUgc2VsZi1jb2xsYXBzaW5nIGJsb2Nr
IHRoZW4gdGhlIGZsb2F0IGl0IGNsZWFycyBpcyBub3cgaW50cnVkaW5nIGludG8gfGNoaWxkfC4g
TGF5b3V0IGFnYWluIHNvIHRoYXQgd2UgY2FuIGxvb2sgZm9yCiAgICAgICAgIC8vIGZsb2F0cyBp
biB0aGUgcGFyZW50IHRoYXQgb3ZlcmhhbmcgfGNoaWxkfCdzIG5ldyBsb2dpY2FsIHRvcC4KICAg
ICAgICAgYm9vbCBsb2dpY2FsVG9wSW50cnVkZXNJbnRvRmxvYXQgPSBjbGVhcmFuY2VGb3JTZWxm
Q29sbGFwc2luZ0Jsb2NrID4gMCAmJiBsb2dpY2FsVG9wIDwgYmVmb3JlQ29sbGFwc2VMb2dpY2Fs
VG9wOwotICAgICAgICBpZiAobG9naWNhbFRvcEludHJ1ZGVzSW50b0Zsb2F0ICYmIGNvbnRhaW5z
RmxvYXRzKCkgJiYgIWNoaWxkLmF2b2lkc0Zsb2F0cygpICYmIGxvd2VzdEZsb2F0TG9naWNhbEJv
dHRvbSgpID4gbG9naWNhbFRvcCkKLSAgICAgICAgICAgIGNoaWxkLnNldE5lZWRzTGF5b3V0KCk7
CisgICAgICAgIGlmIChsb2dpY2FsVG9wSW50cnVkZXNJbnRvRmxvYXQgJiYgY29udGFpbnNGbG9h
dHMoKSAmJiAhY2hpbGQtPmF2b2lkc0Zsb2F0cygpICYmIGxvd2VzdEZsb2F0TG9naWNhbEJvdHRv
bSgpID4gbG9naWNhbFRvcCkKKyAgICAgICAgICAgIGNoaWxkLT5zZXROZWVkc0xheW91dCgpOwog
ICAgIH0KIAogICAgIHJldHVybiBsb2dpY2FsVG9wOwpAQCAtMjY5NCw3ICsyNjk3LDkgQEAgdm9p
ZCBSZW5kZXJCbG9ja0Zsb3c6OmFkZEludHJ1ZGluZ0Zsb2F0cwogICAgICAgICByZXR1cm47CiAK
ICAgICBsb2dpY2FsTGVmdE9mZnNldCArPSBtYXJnaW5Mb2dpY2FsTGVmdCgpOwotCisgICAgCisg
ICAgUmVuZGVyQmxvY2sqIGNiID0gY29udGFpbmluZ0Jsb2NrKCk7CisgICAgCiAgICAgY29uc3Qg
RmxvYXRpbmdPYmplY3RTZXQmIHByZXZTZXQgPSBwcmV2LT5tX2Zsb2F0aW5nT2JqZWN0cy0+c2V0
KCk7CiAgICAgYXV0byBwcmV2RW5kID0gcHJldlNldC5lbmQoKTsKICAgICBmb3IgKGF1dG8gcHJl
dkl0ID0gcHJldlNldC5iZWdpbigpOyBwcmV2SXQgIT0gcHJldkVuZDsgKytwcmV2SXQpIHsKQEAg
LTI3MTEsOCArMjcxNiw4IEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93OjphZGRJbnRydWRpbmdGbG9h
dHMKICAgICAgICAgICAgICAgICAvLyBpbnRvIGFjY291bnQuIE9ubHkgYXBwbHkgdGhpcyBjb2Rl
IGlmIHByZXYgaXMgdGhlIHBhcmVudCwgc2luY2Ugb3RoZXJ3aXNlIHRoZSBsZWZ0IG1hcmdpbgog
ICAgICAgICAgICAgICAgIC8vIHdpbGwgZ2V0IGFwcGxpZWQgdHdpY2UuCiAgICAgICAgICAgICAg
ICAgTGF5b3V0U2l6ZSBvZmZzZXQgPSBpc0hvcml6b250YWxXcml0aW5nTW9kZSgpCi0gICAgICAg
ICAgICAgICAgICAgID8gTGF5b3V0U2l6ZShsb2dpY2FsTGVmdE9mZnNldCAtIChwcmV2ICE9IHBh
cmVudCgpID8gcHJldi0+bWFyZ2luTGVmdCgpIDogTGF5b3V0VW5pdCgpKSwgbG9naWNhbFRvcE9m
ZnNldCkKLSAgICAgICAgICAgICAgICAgICAgOiBMYXlvdXRTaXplKGxvZ2ljYWxUb3BPZmZzZXQs
IGxvZ2ljYWxMZWZ0T2Zmc2V0IC0gKHByZXYgIT0gcGFyZW50KCkgPyBwcmV2LT5tYXJnaW5Ub3Ao
KSA6IExheW91dFVuaXQoKSkpOworICAgICAgICAgICAgICAgICAgICA/IExheW91dFNpemUobG9n
aWNhbExlZnRPZmZzZXQgLSAocHJldiAhPSBjYiA/IHByZXYtPm1hcmdpbkxlZnQoKSA6IExheW91
dFVuaXQoKSksIGxvZ2ljYWxUb3BPZmZzZXQpCisgICAgICAgICAgICAgICAgICAgIDogTGF5b3V0
U2l6ZShsb2dpY2FsVG9wT2Zmc2V0LCBsb2dpY2FsTGVmdE9mZnNldCAtIChwcmV2ICE9IGNiID8g
cHJldi0+bWFyZ2luVG9wKCkgOiBMYXlvdXRVbml0KCkpKTsKIAogICAgICAgICAgICAgICAgIG1f
ZmxvYXRpbmdPYmplY3RzLT5hZGQoZmxvYXRpbmdPYmplY3QtPmNvcHlUb05ld0NvbnRhaW5lcihv
ZmZzZXQpKTsKICAgICAgICAgICAgIH0KQEAgLTI3MzAsNyArMjczNSwxNiBAQCB2b2lkIFJlbmRl
ckJsb2NrRmxvdzo6bWFya0FsbERlc2NlbmRhbnRzCiAKICAgICBpZiAoZmxvYXRUb1JlbW92ZSkK
ICAgICAgICAgcmVtb3ZlRmxvYXRpbmdPYmplY3QoKmZsb2F0VG9SZW1vdmUpOwotCisgICAgCisg
ICAgaWYgKGNoaWxkcmVuSW5saW5lKCkpIHsKKyAgICAgICAgZm9yIChSb290SW5saW5lQm94KiBi
b3ggPSBmaXJzdFJvb3RCb3goKTsgYm94OyBib3ggPSBib3gtPm5leHRSb290Qm94KCkpIHsKKyAg
ICAgICAgICAgIFJlbmRlckJsb2NrRmxvdyogY2hpbGRCbG9jayA9IGJveC0+YW5vbnltb3VzSW5s
aW5lQmxvY2soKTsKKyAgICAgICAgICAgIGlmIChjaGlsZEJsb2NrICYmIChmbG9hdFRvUmVtb3Zl
ID8gY2hpbGRCbG9jay0+Y29udGFpbnNGbG9hdCgqZmxvYXRUb1JlbW92ZSkgOiBjaGlsZEJsb2Nr
LT5jb250YWluc0Zsb2F0cygpKSkKKyAgICAgICAgICAgICAgICBjaGlsZEJsb2NrLT5tYXJrQWxs
RGVzY2VuZGFudHNXaXRoRmxvYXRzRm9yTGF5b3V0KGZsb2F0VG9SZW1vdmUsIGluTGF5b3V0KTsK
KyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorIAogICAgIC8vIEl0ZXJhdGUgb3Zl
ciBvdXIgYmxvY2sgY2hpbGRyZW4gYW5kIG1hcmsgdGhlbSBhcyBuZWVkZWQuCiAgICAgZm9yIChh
dXRvJiBibG9jayA6IGNoaWxkcmVuT2ZUeXBlPFJlbmRlckJsb2NrPigqdGhpcykpIHsKICAgICAg
ICAgaWYgKCFmbG9hdFRvUmVtb3ZlICYmIGJsb2NrLmlzRmxvYXRpbmdPck91dE9mRmxvd1Bvc2l0
aW9uZWQoKSkKQEAgLTI3NTMsNyArMjc2Nyw3IEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93OjptYXJr
U2libGluZ3NXaXRoRmwKIAogICAgIGNvbnN0IEZsb2F0aW5nT2JqZWN0U2V0JiBmbG9hdGluZ09i
amVjdFNldCA9IG1fZmxvYXRpbmdPYmplY3RzLT5zZXQoKTsKICAgICBhdXRvIGVuZCA9IGZsb2F0
aW5nT2JqZWN0U2V0LmVuZCgpOwotCisgICAgCiAgICAgZm9yIChSZW5kZXJPYmplY3QqIG5leHQg
PSBuZXh0U2libGluZygpOyBuZXh0OyBuZXh0ID0gbmV4dC0+bmV4dFNpYmxpbmcoKSkgewogICAg
ICAgICBpZiAoIWlzPFJlbmRlckJsb2NrRmxvdz4oKm5leHQpIHx8IG5leHQtPmlzRmxvYXRpbmdP
ck91dE9mRmxvd1Bvc2l0aW9uZWQoKSB8fCBkb3duY2FzdDxSZW5kZXJCbG9ja0Zsb3c+KCpuZXh0
KS5hdm9pZHNGbG9hdHMoKSkKICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtMzA2MiwyMiArMzA3
NiwzNyBAQCBHYXBSZWN0cyBSZW5kZXJCbG9ja0Zsb3c6OmlubGluZVNlbGVjdGlvCiAgICAgUm9v
dElubGluZUJveCogbGFzdFNlbGVjdGVkTGluZSA9IDA7CiAgICAgUm9vdElubGluZUJveCogY3Vy
cjsKICAgICBmb3IgKGN1cnIgPSBmaXJzdFJvb3RCb3goKTsgY3VyciAmJiAhY3Vyci0+aGFzU2Vs
ZWN0ZWRDaGlsZHJlbigpOyBjdXJyID0gY3Vyci0+bmV4dFJvb3RCb3goKSkgeyB9CisgICAgCisg
ICAgTG9naWNhbFNlbGVjdGlvbk9mZnNldENhY2hlcyBjaGlsZENhY2hlKCp0aGlzLCBjYWNoZSk7
CiAKICAgICAvLyBOb3cgcGFpbnQgdGhlIGdhcHMgZm9yIHRoZSBsaW5lcy4KLSAgICBmb3IgKDsg
Y3VyciAmJiBjdXJyLT5oYXNTZWxlY3RlZENoaWxkcmVuKCk7IGN1cnIgPSBjdXJyLT5uZXh0Um9v
dEJveCgpKSB7CisgICAgZm9yICg7IGN1cnIgJiYgKGN1cnItPmhhc1NlbGVjdGVkQ2hpbGRyZW4o
KSB8fCBjdXJyLT5oYXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKTsgY3VyciA9IGN1cnItPm5leHRS
b290Qm94KCkpIHsKKyAgICAgICAgaWYgKCFjdXJyLT5oYXNTZWxlY3RlZENoaWxkcmVuKCkpCisg
ICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgTGF5b3V0VW5pdCBzZWxUb3AgPSAgY3Vyci0+
c2VsZWN0aW9uVG9wQWRqdXN0ZWRGb3JQcmVjZWRpbmdCbG9jaygpOwogICAgICAgICBMYXlvdXRV
bml0IHNlbEhlaWdodCA9IGN1cnItPnNlbGVjdGlvbkhlaWdodEFkanVzdGVkRm9yUHJlY2VkaW5n
QmxvY2soKTsKIAotICAgICAgICBpZiAoIWNvbnRhaW5zU3RhcnQgJiYgIWxhc3RTZWxlY3RlZExp
bmUgJiYKLSAgICAgICAgICAgIHNlbGVjdGlvblN0YXRlKCkgIT0gU2VsZWN0aW9uU3RhcnQgJiYg
c2VsZWN0aW9uU3RhdGUoKSAhPSBTZWxlY3Rpb25Cb3RoICYmICFpc1J1YnlCYXNlKCkpCi0gICAg
ICAgICAgICByZXN1bHQudW5pdGVDZW50ZXIoYmxvY2tTZWxlY3Rpb25HYXAocm9vdEJsb2NrLCBy
b290QmxvY2tQaHlzaWNhbFBvc2l0aW9uLCBvZmZzZXRGcm9tUm9vdEJsb2NrLCBsYXN0TG9naWNh
bFRvcCwgbGFzdExvZ2ljYWxMZWZ0LCBsYXN0TG9naWNhbFJpZ2h0LCBzZWxUb3AsIGNhY2hlLCBw
YWludEluZm8pKTsKLSAgICAgICAgCi0gICAgICAgIExheW91dFJlY3QgbG9naWNhbFJlY3QoY3Vy
ci0+bG9naWNhbExlZnQoKSwgc2VsVG9wLCBjdXJyLT5sb2dpY2FsV2lkdGgoKSwgc2VsVG9wICsg
c2VsSGVpZ2h0KTsKLSAgICAgICAgbG9naWNhbFJlY3QubW92ZShpc0hvcml6b250YWxXcml0aW5n
TW9kZSgpID8gb2Zmc2V0RnJvbVJvb3RCbG9jayA6IG9mZnNldEZyb21Sb290QmxvY2sudHJhbnNw
b3NlZFNpemUoKSk7Ci0gICAgICAgIExheW91dFJlY3QgcGh5c2ljYWxSZWN0ID0gcm9vdEJsb2Nr
LmxvZ2ljYWxSZWN0VG9QaHlzaWNhbFJlY3Qocm9vdEJsb2NrUGh5c2ljYWxQb3NpdGlvbiwgbG9n
aWNhbFJlY3QpOwotICAgICAgICBpZiAoIXBhaW50SW5mbyB8fCAoaXNIb3Jpem9udGFsV3JpdGlu
Z01vZGUoKSAmJiBwaHlzaWNhbFJlY3QueSgpIDwgcGFpbnRJbmZvLT5yZWN0Lm1heFkoKSAmJiBw
aHlzaWNhbFJlY3QubWF4WSgpID4gcGFpbnRJbmZvLT5yZWN0LnkoKSkKLSAgICAgICAgICAgIHx8
ICghaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSAmJiBwaHlzaWNhbFJlY3QueCgpIDwgcGFpbnRJ
bmZvLT5yZWN0Lm1heFgoKSAmJiBwaHlzaWNhbFJlY3QubWF4WCgpID4gcGFpbnRJbmZvLT5yZWN0
LngoKSkpCi0gICAgICAgICAgICByZXN1bHQudW5pdGUoY3Vyci0+bGluZVNlbGVjdGlvbkdhcChy
b290QmxvY2ssIHJvb3RCbG9ja1BoeXNpY2FsUG9zaXRpb24sIG9mZnNldEZyb21Sb290QmxvY2ss
IHNlbFRvcCwgc2VsSGVpZ2h0LCBjYWNoZSwgcGFpbnRJbmZvKSk7CisgICAgICAgIGlmIChjdXJy
LT5oYXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CisgICAgICAgICAgICBpZiAobGFzdFNlbGVj
dGVkTGluZSkgeworICAgICAgICAgICAgICAgIGxhc3RMb2dpY2FsVG9wID0gYmxvY2tEaXJlY3Rp
b25PZmZzZXQocm9vdEJsb2NrLCBvZmZzZXRGcm9tUm9vdEJsb2NrKSArIGxhc3RTZWxlY3RlZExp
bmUtPnNlbGVjdGlvbkJvdHRvbSgpOworICAgICAgICAgICAgICAgIGxhc3RMb2dpY2FsTGVmdCA9
IGxvZ2ljYWxMZWZ0U2VsZWN0aW9uT2Zmc2V0KHJvb3RCbG9jaywgbGFzdFNlbGVjdGVkTGluZS0+
c2VsZWN0aW9uQm90dG9tKCksIGNhY2hlKTsKKyAgICAgICAgICAgICAgICBsYXN0TG9naWNhbFJp
Z2h0ID0gbG9naWNhbFJpZ2h0U2VsZWN0aW9uT2Zmc2V0KHJvb3RCbG9jaywgbGFzdFNlbGVjdGVk
TGluZS0+c2VsZWN0aW9uQm90dG9tKCksIGNhY2hlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIGNvbnRhaW5zU3RhcnQgPSBmYWxzZTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmVz
dWx0LnVuaXRlKGN1cnItPmFub255bW91c0lubGluZUJsb2NrKCktPnNlbGVjdGlvbkdhcHMocm9v
dEJsb2NrLCByb290QmxvY2tQaHlzaWNhbFBvc2l0aW9uLCBMYXlvdXRTaXplKG9mZnNldEZyb21S
b290QmxvY2sud2lkdGgoKSArIGN1cnItPmFub255bW91c0lubGluZUJsb2NrKCktPngoKSwgb2Zm
c2V0RnJvbVJvb3RCbG9jay5oZWlnaHQoKSArIGN1cnItPmFub255bW91c0lubGluZUJsb2NrKCkt
PnkoKSksIGxhc3RMb2dpY2FsVG9wLCBsYXN0TG9naWNhbExlZnQsIGxhc3RMb2dpY2FsUmlnaHQs
IGNoaWxkQ2FjaGUsIHBhaW50SW5mbykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAg
aWYgKCFjb250YWluc1N0YXJ0ICYmICghbGFzdFNlbGVjdGVkTGluZSB8fCBsYXN0U2VsZWN0ZWRM
aW5lLT5hbm9ueW1vdXNJbmxpbmVCbG9jaygpKSAmJgorICAgICAgICAgICAgICAgIHNlbGVjdGlv
blN0YXRlKCkgIT0gU2VsZWN0aW9uU3RhcnQgJiYgc2VsZWN0aW9uU3RhdGUoKSAhPSBTZWxlY3Rp
b25Cb3RoICYmICFpc1J1YnlCYXNlKCkpCisgICAgICAgICAgICAgICAgcmVzdWx0LnVuaXRlQ2Vu
dGVyKGJsb2NrU2VsZWN0aW9uR2FwKHJvb3RCbG9jaywgcm9vdEJsb2NrUGh5c2ljYWxQb3NpdGlv
biwgb2Zmc2V0RnJvbVJvb3RCbG9jaywgbGFzdExvZ2ljYWxUb3AsIGxhc3RMb2dpY2FsTGVmdCwg
bGFzdExvZ2ljYWxSaWdodCwgc2VsVG9wLCBjYWNoZSwgcGFpbnRJbmZvKSk7CisgICAgICAgICAg
ICAKKyAgICAgICAgICAgIExheW91dFJlY3QgbG9naWNhbFJlY3QoY3Vyci0+bG9naWNhbExlZnQo
KSwgc2VsVG9wLCBjdXJyLT5sb2dpY2FsV2lkdGgoKSwgc2VsVG9wICsgc2VsSGVpZ2h0KTsKKyAg
ICAgICAgICAgIGxvZ2ljYWxSZWN0Lm1vdmUoaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSA/IG9m
ZnNldEZyb21Sb290QmxvY2sgOiBvZmZzZXRGcm9tUm9vdEJsb2NrLnRyYW5zcG9zZWRTaXplKCkp
OworICAgICAgICAgICAgTGF5b3V0UmVjdCBwaHlzaWNhbFJlY3QgPSByb290QmxvY2subG9naWNh
bFJlY3RUb1BoeXNpY2FsUmVjdChyb290QmxvY2tQaHlzaWNhbFBvc2l0aW9uLCBsb2dpY2FsUmVj
dCk7CisgICAgICAgICAgICBpZiAoIXBhaW50SW5mbyB8fCAoaXNIb3Jpem9udGFsV3JpdGluZ01v
ZGUoKSAmJiBwaHlzaWNhbFJlY3QueSgpIDwgcGFpbnRJbmZvLT5yZWN0Lm1heFkoKSAmJiBwaHlz
aWNhbFJlY3QubWF4WSgpID4gcGFpbnRJbmZvLT5yZWN0LnkoKSkKKyAgICAgICAgICAgICAgICB8
fCAoIWlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkgJiYgcGh5c2ljYWxSZWN0LngoKSA8IHBhaW50
SW5mby0+cmVjdC5tYXhYKCkgJiYgcGh5c2ljYWxSZWN0Lm1heFgoKSA+IHBhaW50SW5mby0+cmVj
dC54KCkpKQorICAgICAgICAgICAgICAgIHJlc3VsdC51bml0ZShjdXJyLT5saW5lU2VsZWN0aW9u
R2FwKHJvb3RCbG9jaywgcm9vdEJsb2NrUGh5c2ljYWxQb3NpdGlvbiwgb2Zmc2V0RnJvbVJvb3RC
bG9jaywgc2VsVG9wLCBzZWxIZWlnaHQsIGNhY2hlLCBwYWludEluZm8pKTsKKyAgICAgICAgfQog
CiAgICAgICAgIGxhc3RTZWxlY3RlZExpbmUgPSBjdXJyOwogICAgIH0KQEAgLTMwODYsOCArMzEx
NSw4IEBAIEdhcFJlY3RzIFJlbmRlckJsb2NrRmxvdzo6aW5saW5lU2VsZWN0aW8KICAgICAgICAg
Ly8gVmlzaWJsZVNlbGVjdGlvbiBtdXN0IHN0YXJ0IGp1c3QgYWZ0ZXIgb3VyIGxhc3QgbGluZS4K
ICAgICAgICAgbGFzdFNlbGVjdGVkTGluZSA9IGxhc3RSb290Qm94KCk7CiAKLSAgICBpZiAobGFz
dFNlbGVjdGVkTGluZSAmJiBzZWxlY3Rpb25TdGF0ZSgpICE9IFNlbGVjdGlvbkVuZCAmJiBzZWxl
Y3Rpb25TdGF0ZSgpICE9IFNlbGVjdGlvbkJvdGgpIHsKLSAgICAgICAgLy8gR28gYWhlYWQgYW5k
IHVwZGF0ZSBvdXIgbGFzdFkgdG8gYmUgdGhlIGJvdHRvbSBvZiB0aGUgbGFzdCBzZWxlY3RlZCBs
aW5lLgorICAgIGlmIChsYXN0U2VsZWN0ZWRMaW5lICYmICFsYXN0U2VsZWN0ZWRMaW5lLT5oYXNB
bm9ueW1vdXNJbmxpbmVCbG9jaygpICYmIHNlbGVjdGlvblN0YXRlKCkgIT0gU2VsZWN0aW9uRW5k
ICYmIHNlbGVjdGlvblN0YXRlKCkgIT0gU2VsZWN0aW9uQm90aCkgeworICAgICAgICAvLyBHbyBh
aGVhZCBhbmQgdXBkYXRlIG91ciBsYXN0TG9naWNhbFRvcCB0byBiZSB0aGUgYm90dG9tIG9mIHRo
ZSBsYXN0IHNlbGVjdGVkIGxpbmUuCiAgICAgICAgIGxhc3RMb2dpY2FsVG9wID0gYmxvY2tEaXJl
Y3Rpb25PZmZzZXQocm9vdEJsb2NrLCBvZmZzZXRGcm9tUm9vdEJsb2NrKSArIGxhc3RTZWxlY3Rl
ZExpbmUtPnNlbGVjdGlvbkJvdHRvbSgpOwogICAgICAgICBsYXN0TG9naWNhbExlZnQgPSBsb2dp
Y2FsTGVmdFNlbGVjdGlvbk9mZnNldChyb290QmxvY2ssIGxhc3RTZWxlY3RlZExpbmUtPnNlbGVj
dGlvbkJvdHRvbSgpLCBjYWNoZSk7CiAgICAgICAgIGxhc3RMb2dpY2FsUmlnaHQgPSBsb2dpY2Fs
UmlnaHRTZWxlY3Rpb25PZmZzZXQocm9vdEJsb2NrLCBsYXN0U2VsZWN0ZWRMaW5lLT5zZWxlY3Rp
b25Cb3R0b20oKSwgY2FjaGUpOwpAQCAtMzMzMCw3ICszMzU5LDE4IEBAIFZpc2libGVQb3NpdGlv
biBSZW5kZXJCbG9ja0Zsb3c6OnBvc2l0aW8KICAgICBmb3IgKFJvb3RJbmxpbmVCb3gqIHJvb3Qg
PSBmaXJzdFJvb3RCb3goKTsgcm9vdDsgcm9vdCA9IHJvb3QtPm5leHRSb290Qm94KCkpIHsKICAg
ICAgICAgaWYgKHJlZ2lvbiAmJiByb290LT5jb250YWluaW5nUmVnaW9uKCkgIT0gcmVnaW9uKQog
ICAgICAgICAgICAgY29udGludWU7Ci0KKyAgICAgICAgCisgICAgICAgIFJlbmRlckJsb2NrKiBj
aGlsZEJsb2NrID0gcm9vdC0+YW5vbnltb3VzSW5saW5lQmxvY2soKTsKKyAgICAgICAgaWYgKGNo
aWxkQmxvY2spIHsKKyAgICAgICAgICAgIGZpcnN0Um9vdEJveFdpdGhDaGlsZHJlbiA9IDA7Cisg
ICAgICAgICAgICBsYXN0Um9vdEJveFdpdGhDaGlsZHJlbiA9IDA7CisgICAgICAgICAgICBMYXlv
dXRVbml0IGNoaWxkTG9naWNhbEJvdHRvbSA9IGxvZ2ljYWxUb3BGb3JDaGlsZCgqY2hpbGRCbG9j
aykgKyBsb2dpY2FsSGVpZ2h0Rm9yQ2hpbGQoKmNoaWxkQmxvY2spOworICAgICAgICAgICAgaWYg
KGNoaWxkQmxvY2stPmxvZ2ljYWxIZWlnaHQoKSAmJiBjaGlsZEJsb2NrLT5zdHlsZSgpLnZpc2li
aWxpdHkoKSA9PSBWSVNJQkxFICYmCisgICAgICAgICAgICAgICAgKChwb2ludEluTG9naWNhbENv
bnRlbnRzLnkoKSA8IGNoaWxkTG9naWNhbEJvdHRvbSkgfHwgKGJsb2Nrc0FyZUZsaXBwZWQgJiYg
cG9pbnRJbkxvZ2ljYWxDb250ZW50cy55KCkgPT0gY2hpbGRMb2dpY2FsQm90dG9tKSkpCisgICAg
ICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uRm9yUG9pbnRSZXNwZWN0aW5nRWRpdGluZ0JvdW5k
YXJpZXMoKnRoaXMsICpjaGlsZEJsb2NrLCBwb2ludEluTG9naWNhbENvbnRlbnRzKTsKKyAgICAg
ICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgCiAgICAgICAgIGlmICghcm9vdC0+Zmlyc3RM
ZWFmQ2hpbGQoKSkKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICBpZiAoIWZpcnN0Um9v
dEJveFdpdGhDaGlsZHJlbikKQEAgLTQxMDksMjAgKzQxNDksMjEgQEAgdm9pZCBSZW5kZXJCbG9j
a0Zsb3c6OmNvbXB1dGVJbmxpbmVQcmVmZQogICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAg
ICAgICAgICAgICAgICBjbGVhclByZXZpb3VzRmxvYXQgPSBmYWxzZTsKIAotICAgICAgICAgICAg
ICAgIGJvb2wgY2FuQnJlYWtSZXBsYWNlZEVsZW1lbnQgPSAhY2hpbGQtPmlzSW1hZ2UoKSB8fCBh
bGxvd0ltYWdlc1RvQnJlYWs7CisgICAgICAgICAgICAgICAgYm9vbCBjYW5CcmVha1JlcGxhY2Vk
RWxlbWVudCA9ICFjaGlsZC0+aXNJbWFnZSgpIHx8IGFsbG93SW1hZ2VzVG9CcmVhayB8fCBjaGls
ZC0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpOwogICAgICAgICAgICAgICAgIGlmICgoY2FuQnJl
YWtSZXBsYWNlZEVsZW1lbnQgJiYgKGF1dG9XcmFwIHx8IG9sZEF1dG9XcmFwKSAmJiAoIWlzUHJl
dkNoaWxkSW5saW5lRmxvdyB8fCBzaG91bGRCcmVha0xpbmVBZnRlclRleHQpKSB8fCBjbGVhclBy
ZXZpb3VzRmxvYXQpIHsKICAgICAgICAgICAgICAgICAgICAgbWluTG9naWNhbFdpZHRoID0gcHJl
ZmVycmVkV2lkdGgobWluTG9naWNhbFdpZHRoLCBpbmxpbmVNaW4pOwogICAgICAgICAgICAgICAg
ICAgICBpbmxpbmVNaW4gPSAwOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAg
IC8vIElmIHdlJ3JlIHN1cHBvc2VkIHRvIGNsZWFyIHRoZSBwcmV2aW91cyBmbG9hdCwgdGhlbiB0
ZXJtaW5hdGUgbWF4d2lkdGggYXMgd2VsbC4KLSAgICAgICAgICAgICAgICBpZiAoY2xlYXJQcmV2
aW91c0Zsb2F0KSB7CisgICAgICAgICAgICAgICAgLy8gQWxzbyBkbyB0aGlzIGZvciBhbm9ueW1v
dXMgaW5saW5lIGJsb2Nrcy4KKyAgICAgICAgICAgICAgICBpZiAoY2xlYXJQcmV2aW91c0Zsb2F0
IHx8IGNoaWxkLT5pc0Fub255bW91c0lubGluZUJsb2NrKCkpIHsKICAgICAgICAgICAgICAgICAg
ICAgbWF4TG9naWNhbFdpZHRoID0gcHJlZmVycmVkV2lkdGgobWF4TG9naWNhbFdpZHRoLCBpbmxp
bmVNYXgpOwogICAgICAgICAgICAgICAgICAgICBpbmxpbmVNYXggPSAwOwogICAgICAgICAgICAg
ICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIEFkZCBpbiB0ZXh0LWluZGVudC4gVGhpcyBpcyBh
ZGRlZCBpbiBvbmx5IG9uY2UuCi0gICAgICAgICAgICAgICAgaWYgKCFhZGRlZFRleHRJbmRlbnQg
JiYgIWNoaWxkLT5pc0Zsb2F0aW5nKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWFkZGVkVGV4
dEluZGVudCAmJiAhY2hpbGQtPmlzRmxvYXRpbmcoKSAmJiAhY2hpbGQtPmlzQW5vbnltb3VzSW5s
aW5lQmxvY2soKSkgewogICAgICAgICAgICAgICAgICAgICBMYXlvdXRVbml0IGNlaWxlZEluZGVu
dCA9IHRleHRJbmRlbnQuY2VpbFRvRmxvYXQoKTsKICAgICAgICAgICAgICAgICAgICAgY2hpbGRN
aW4gKz0gY2VpbGVkSW5kZW50OwogICAgICAgICAgICAgICAgICAgICBjaGlsZE1heCArPSBjZWls
ZWRJbmRlbnQ7CkBAIC00MTM2LDcgKzQxNzcsOCBAQCB2b2lkIFJlbmRlckJsb2NrRmxvdzo6Y29t
cHV0ZUlubGluZVByZWZlCiAgICAgICAgICAgICAgICAgLy8gQWRkIG91ciB3aWR0aCB0byB0aGUg
bWF4LgogICAgICAgICAgICAgICAgIGlubGluZU1heCArPSBzdGQ6Om1heDxmbG9hdD4oMCwgY2hp
bGRNYXgpOwogCi0gICAgICAgICAgICAgICAgaWYgKCFhdXRvV3JhcCB8fCAhY2FuQnJlYWtSZXBs
YWNlZEVsZW1lbnQgfHwgKGlzUHJldkNoaWxkSW5saW5lRmxvdyAmJiAhc2hvdWxkQnJlYWtMaW5l
QWZ0ZXJUZXh0KSkgeworICAgICAgICAgICAgICAgIGlmICgoIWF1dG9XcmFwIHx8ICFjYW5CcmVh
a1JlcGxhY2VkRWxlbWVudCB8fCAoaXNQcmV2Q2hpbGRJbmxpbmVGbG93ICYmICFzaG91bGRCcmVh
a0xpbmVBZnRlclRleHQpKQorICAgICAgICAgICAgICAgICAgICAmJiAhY2hpbGQtPmlzQW5vbnlt
b3VzSW5saW5lQmxvY2soKSkgewogICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQtPmlzRmxv
YXRpbmcoKSkKICAgICAgICAgICAgICAgICAgICAgICAgIG1pbkxvZ2ljYWxXaWR0aCA9IHByZWZl
cnJlZFdpZHRoKG1pbkxvZ2ljYWxXaWR0aCwgY2hpbGRNaW4pOwogICAgICAgICAgICAgICAgICAg
ICBlbHNlCkBAIC00MTQ3LDYgKzQxODksMTIgQEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmNvbXB1
dGVJbmxpbmVQcmVmZQogCiAgICAgICAgICAgICAgICAgICAgIC8vIE5vdyBzdGFydCBhIG5ldyBs
aW5lLgogICAgICAgICAgICAgICAgICAgICBpbmxpbmVNaW4gPSAwOworICAgICAgICAgICAgICAg
ICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLT5pc0Fub255bW91c0lubGluZUJs
b2NrKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRlcm1pbmF0ZSBtYXggd2lkdGgg
YXMgd2VsbC4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1heExvZ2ljYWxXaWR0aCA9IHByZWZl
cnJlZFdpZHRoKG1heExvZ2ljYWxXaWR0aCwgY2hpbGRNYXgpOworICAgICAgICAgICAgICAgICAg
ICAgICAgaW5saW5lTWF4ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAg
ICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChhdXRvV3JhcCAmJiBjYW5CcmVha1JlcGxhY2Vk
RWxlbWVudCAmJiBpc1ByZXZDaGlsZElubGluZUZsb3cpIHsKSW5kZXg6IFNvdXJjZS9XZWJDb3Jl
L3JlbmRlcmluZy9SZW5kZXJCbG9ja0Zsb3cuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tGbG93LmgJKHJldmlzaW9uIDE4MTMyOSkKKysrIFNvdXJj
ZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0Zsb3cuaAkod29ya2luZyBjb3B5KQpAQCAt
MjQ4LDcgKzI0OCw3IEBAIHB1YmxpYzoKICAgICB2b2lkIHNldFN0YXRpY0lubGluZVBvc2l0aW9u
Rm9yQ2hpbGQoUmVuZGVyQm94JiBjaGlsZCwgTGF5b3V0VW5pdCBibG9ja09mZnNldCwgTGF5b3V0
VW5pdCBpbmxpbmVQb3NpdGlvbik7CiAgICAgdm9pZCB1cGRhdGVTdGF0aWNJbmxpbmVQb3NpdGlv
bkZvckNoaWxkKFJlbmRlckJveCYgY2hpbGQsIExheW91dFVuaXQgbG9naWNhbFRvcCk7CiAKLSAg
ICBMYXlvdXRVbml0IGNvbGxhcHNlTWFyZ2lucyhSZW5kZXJCb3gmIGNoaWxkLCBNYXJnaW5JbmZv
Jik7CisgICAgTGF5b3V0VW5pdCBjb2xsYXBzZU1hcmdpbnMoUmVuZGVyQm94KiBjaGlsZCwgUmVu
ZGVyT2JqZWN0KiBwcmV2LCBNYXJnaW5JbmZvJik7CiAgICAgTGF5b3V0VW5pdCBjbGVhckZsb2F0
c0lmTmVlZGVkKFJlbmRlckJveCYgY2hpbGQsIE1hcmdpbkluZm8mLCBMYXlvdXRVbml0IG9sZFRv
cFBvc01hcmdpbiwgTGF5b3V0VW5pdCBvbGRUb3BOZWdNYXJnaW4sIExheW91dFVuaXQgeVBvcyk7
CiAgICAgTGF5b3V0VW5pdCBlc3RpbWF0ZUxvZ2ljYWxUb3BQb3NpdGlvbihSZW5kZXJCb3gmIGNo
aWxkLCBjb25zdCBNYXJnaW5JbmZvJiwgTGF5b3V0VW5pdCYgZXN0aW1hdGVXaXRob3V0UGFnaW5h
dGlvbik7CiAgICAgdm9pZCBtYXJnaW5CZWZvcmVFc3RpbWF0ZUZvckNoaWxkKFJlbmRlckJveCYs
IExheW91dFVuaXQmLCBMYXlvdXRVbml0JiwgYm9vbCYpIGNvbnN0OwpAQCAtNTM4LDcgKzUzOCw3
IEBAIHByaXZhdGU6CiAvLyBTVEFSVCBNRVRIT0RTIERFRklORUQgSU4gUmVuZGVyQmxvY2tMaW5l
TGF5b3V0CiBwdWJsaWM6CiAgICAgc3RhdGljIHZvaWQgYXBwZW5kUnVuc0Zvck9iamVjdChCaWRp
UnVuTGlzdDxCaWRpUnVuPiYsIGludCBzdGFydCwgaW50IGVuZCwgUmVuZGVyT2JqZWN0KiwgSW5s
aW5lQmlkaVJlc29sdmVyJik7Ci0gICAgUm9vdElubGluZUJveCogY3JlYXRlQW5kQXBwZW5kUm9v
dElubGluZUJveCgpOworICAgIFJvb3RJbmxpbmVCb3gqIGNyZWF0ZUFuZEFwcGVuZFJvb3RJbmxp
bmVCb3goUmVuZGVyQmxvY2tGbG93KiBhbm9ueW1vdXNJbmxpbmVCbG9jayk7CiAKICAgICBMYXlv
dXRVbml0IHN0YXJ0QWxpZ25lZE9mZnNldEZvckxpbmUoTGF5b3V0VW5pdCBwb3NpdGlvbiwgYm9v
bCBzaG91bGRJbmRlbnRUZXh0KTsKICAgICB2aXJ0dWFsIEVUZXh0QWxpZ24gdGV4dEFsaWdubWVu
dEZvckxpbmUoYm9vbCBlbmRzV2l0aFNvZnRCcmVhaykgY29uc3Q7CkluZGV4OiBTb3VyY2UvV2Vi
Q29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcAkocmV2aXNp
b24gMTgxMzI5KQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrTGluZUxh
eW91dC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEyNCw5ICsxMjQsMTUgQEAgc3RkOjp1bmlxdWVf
cHRyPFJvb3RJbmxpbmVCb3g+IFJlbmRlckJsbwogICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVl
PFJvb3RJbmxpbmVCb3g+KCp0aGlzKTsKIH0KIAotUm9vdElubGluZUJveCogUmVuZGVyQmxvY2tG
bG93OjpjcmVhdGVBbmRBcHBlbmRSb290SW5saW5lQm94KCkKK1Jvb3RJbmxpbmVCb3gqIFJlbmRl
ckJsb2NrRmxvdzo6Y3JlYXRlQW5kQXBwZW5kUm9vdElubGluZUJveChSZW5kZXJCbG9ja0Zsb3cq
IGFub255bW91c0lubGluZUJsb2NrKQogewotICAgIGF1dG8gbmV3Um9vdEJveCA9IGNyZWF0ZVJv
b3RJbmxpbmVCb3goKTsKKyAgICBhdXRvIG5ld1Jvb3RCb3ggPSBudWxscHRyOworICAgIGlmIChh
bm9ueW1vdXNJbmxpbmVCbG9jaykgeworICAgICAgICBuZXdSb290Qm94ID0gc3RkOjptYWtlX3Vu
aXF1ZTxSb290QW5vbnltb3VzSW5saW5lQmxvY2tCb3g+KCp0aGlzKTsKKyAgICAgICAgbmV3Um9v
dEJveC0+c2V0QW5vbnltb3VzSW5saW5lQmxvY2soYW5vbnltb3VzSW5saW5lQmxvY2spOworICAg
IH0gZWxzZQorICAgICAgICBuZXdSb290Qm94ID0gY3JlYXRlUm9vdElubGluZUJveCgpOworCiAg
ICAgUm9vdElubGluZUJveCogcm9vdEJveCA9IG5ld1Jvb3RCb3guZ2V0KCk7CiAgICAgbV9saW5l
Qm94ZXMuYXBwZW5kTGluZUJveChXVEY6Om1vdmUobmV3Um9vdEJveCkpOwogCkluZGV4OiBTb3Vy
Y2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQm94LmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQm94LmNwcAkocmV2aXNpb24gMTgxMzI5KQorKysgU291
cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJveC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQy
OTgsNyArNDI5OCw3IEBAIGJvb2wgUmVuZGVyQm94OjpzaHJpbmtUb0F2b2lkRmxvYXRzKCkgY28K
IAogYm9vbCBSZW5kZXJCb3g6OmNyZWF0ZXNOZXdGb3JtYXR0aW5nQ29udGV4dCgpIGNvbnN0CiB7
Ci0gICAgcmV0dXJuIGlzSW5saW5lQmxvY2tPcklubGluZVRhYmxlKCkgfHwgaXNGbG9hdGluZ09y
T3V0T2ZGbG93UG9zaXRpb25lZCgpIHx8IGhhc092ZXJmbG93Q2xpcCgpIHx8IGlzRmxleEl0ZW1J
bmNsdWRpbmdEZXByZWNhdGVkKCkKKyAgICByZXR1cm4gKGlzSW5saW5lQmxvY2tPcklubGluZVRh
YmxlKCkgJiYgIWlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkgfHwgaXNGbG9hdGluZ09yT3V0T2ZG
bG93UG9zaXRpb25lZCgpIHx8IGhhc092ZXJmbG93Q2xpcCgpIHx8IGlzRmxleEl0ZW1JbmNsdWRp
bmdEZXByZWNhdGVkKCkKICAgICAgICAgfHwgaXNUYWJsZUNlbGwoKSB8fCBpc1RhYmxlQ2FwdGlv
bigpIHx8IGlzRmllbGRzZXQoKSB8fCBpc1dyaXRpbmdNb2RlUm9vdCgpIHx8IGlzUm9vdCgpIHx8
IGlzUmVuZGVyRmxvd1RocmVhZCgpIHx8IGlzUmVuZGVyUmVnaW9uKCkKICNpZiBFTkFCTEUoQ1NT
X0dSSURfTEFZT1VUKQogICAgICAgICB8fCBpc0dyaWRJdGVtKCkKQEAgLTQzMDgsNyArNDMwOCw3
IEBAIGJvb2wgUmVuZGVyQm94OjpjcmVhdGVzTmV3Rm9ybWF0dGluZ0NvbnQKIAogYm9vbCBSZW5k
ZXJCb3g6OmF2b2lkc0Zsb2F0cygpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIGlzUmVwbGFjZWQoKSB8
fCBpc0hSKCkgfHwgaXNMZWdlbmQoKSB8fCBjcmVhdGVzTmV3Rm9ybWF0dGluZ0NvbnRleHQoKTsK
KyAgICByZXR1cm4gIWlzQW5vbnltb3VzSW5saW5lQmxvY2soKSAmJiAoaXNSZXBsYWNlZCgpIHx8
IGlzSFIoKSB8fCBpc0xlZ2VuZCgpIHx8IGNyZWF0ZXNOZXdGb3JtYXR0aW5nQ29udGV4dCgpKTsK
IH0KIAogdm9pZCBSZW5kZXJCb3g6OmFkZFZpc3VhbEVmZmVjdE92ZXJmbG93KCkKQEAgLTQ1MjUs
MTQgKzQ1MjUsMTkgQEAgYm9vbCBSZW5kZXJCb3g6OmlzVW5zcGxpdHRhYmxlRm9yUGFnaW5hdAog
CiBMYXlvdXRVbml0IFJlbmRlckJveDo6bGluZUhlaWdodChib29sIC8qZmlyc3RMaW5lKi8sIExp
bmVEaXJlY3Rpb25Nb2RlIGRpcmVjdGlvbiwgTGluZVBvc2l0aW9uTW9kZSAvKmxpbmVQb3NpdGlv
bk1vZGUqLykgY29uc3QKIHsKLSAgICBpZiAoaXNSZXBsYWNlZCgpKQorICAgIGlmIChpc1JlcGxh
Y2VkKCkpIHsKKyAgICAgICAgaWYgKGlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkKKyAgICAgICAg
ICAgIHJldHVybiBkaXJlY3Rpb24gPT0gSG9yaXpvbnRhbExpbmUgPyBoZWlnaHQoKSA6IHdpZHRo
KCk7CiAgICAgICAgIHJldHVybiBkaXJlY3Rpb24gPT0gSG9yaXpvbnRhbExpbmUgPyBtX21hcmdp
bkJveC50b3AoKSArIGhlaWdodCgpICsgbV9tYXJnaW5Cb3guYm90dG9tKCkgOiBtX21hcmdpbkJv
eC5yaWdodCgpICsgd2lkdGgoKSArIG1fbWFyZ2luQm94LmxlZnQoKTsKKyAgICB9CiAgICAgcmV0
dXJuIDA7CiB9CiAKIGludCBSZW5kZXJCb3g6OmJhc2VsaW5lUG9zaXRpb24oRm9udEJhc2VsaW5l
IGJhc2VsaW5lVHlwZSwgYm9vbCAvKmZpcnN0TGluZSovLCBMaW5lRGlyZWN0aW9uTW9kZSBkaXJl
Y3Rpb24sIExpbmVQb3NpdGlvbk1vZGUgLypsaW5lUG9zaXRpb25Nb2RlKi8pIGNvbnN0CiB7CiAg
ICAgaWYgKGlzUmVwbGFjZWQoKSkgeworICAgICAgICBpZiAoaXNBbm9ueW1vdXNJbmxpbmVCbG9j
aygpKQorICAgICAgICAgICAgcmV0dXJuIGRpcmVjdGlvbiA9PSBIb3Jpem9udGFsTGluZSA/IGhl
aWdodCgpIDogd2lkdGgoKTsKICAgICAgICAgaW50IHJlc3VsdCA9IGRpcmVjdGlvbiA9PSBIb3Jp
em9udGFsTGluZSA/IG1fbWFyZ2luQm94LnRvcCgpICsgaGVpZ2h0KCkgKyBtX21hcmdpbkJveC5i
b3R0b20oKSA6IG1fbWFyZ2luQm94LnJpZ2h0KCkgKyB3aWR0aCgpICsgbV9tYXJnaW5Cb3gubGVm
dCgpOwogICAgICAgICBpZiAoYmFzZWxpbmVUeXBlID09IEFscGhhYmV0aWNCYXNlbGluZSkKICAg
ICAgICAgICAgIHJldHVybiByZXN1bHQ7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcv
UmVuZGVyQm94TW9kZWxPYmplY3QuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3Jl
bmRlcmluZy9SZW5kZXJCb3hNb2RlbE9iamVjdC5jcHAJKHJldmlzaW9uIDE4MTMyOSkKKysrIFNv
dXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCb3hNb2RlbE9iamVjdC5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTY2LDIyICs2Niw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogdXNpbmcgbmFt
ZXNwYWNlIEhUTUxOYW1lczsKIAotLy8gVGhlIEhhc2hNYXAgZm9yIHN0b3JpbmcgY29udGludWF0
aW9uIHBvaW50ZXJzLgotLy8gQW4gaW5saW5lIGNhbiBiZSBzcGxpdCB3aXRoIGJsb2NrcyBvY2N1
cmluZyBpbiBiZXR3ZWVuIHRoZSBpbmxpbmUgY29udGVudC4KLS8vIFdoZW4gdGhpcyBvY2N1cnMg
d2UgbmVlZCBhIHBvaW50ZXIgdG8gdGhlIG5leHQgb2JqZWN0LiBXZSBjYW4gYmFzaWNhbGx5IGJl
Ci0vLyBzcGxpdCBpbnRvIGEgc2VxdWVuY2Ugb2YgaW5saW5lcyBhbmQgYmxvY2tzLiBUaGUgY29u
dGludWF0aW9uIHdpbGwgZWl0aGVyIGJlCi0vLyBhbiBhbm9ueW1vdXMgYmxvY2sgKHRoYXQgaG91
c2VzIG90aGVyIGJsb2Nrcykgb3IgaXQgd2lsbCBiZSBhbiBpbmxpbmUgZmxvdy4KLS8vIDxiPjxp
PjxwPkhlbGxvPC9wPjwvaT48L2I+LiBJbiB0aGlzIGV4YW1wbGUgdGhlIDxpPiB3aWxsIGhhdmUg
YSBibG9jayBhcwotLy8gaXRzIGNvbnRpbnVhdGlvbiBidXQgdGhlIDxiPiB3aWxsIGp1c3QgaGF2
ZSBhbiBpbmxpbmUgYXMgaXRzIGNvbnRpbnVhdGlvbi4KLXR5cGVkZWYgSGFzaE1hcDxjb25zdCBS
ZW5kZXJCb3hNb2RlbE9iamVjdCosIFJlbmRlckJveE1vZGVsT2JqZWN0Kj4gQ29udGludWF0aW9u
TWFwOwotc3RhdGljIENvbnRpbnVhdGlvbk1hcCYgY29udGludWF0aW9uTWFwKCkKLXsKLSAgICBz
dGF0aWMgTmV2ZXJEZXN0cm95ZWQ8Q29udGludWF0aW9uTWFwPiBtYXA7Ci0gICAgcmV0dXJuIG1h
cDsKLX0KLQotLy8gVGhpcyBIYXNoTWFwIGlzIHNpbWlsYXIgdG8gdGhlIGNvbnRpbnVhdGlvbiBt
YXAsIGJ1dCBjb25uZWN0cyBmaXJzdC1sZXR0ZXIKLS8vIHJlbmRlcmVycyB0byB0aGVpciByZW1h
aW5pbmcgdGV4dCBmcmFnbWVudHMuCisvLyBUaGlzIEhhc2hNYXAgY29ubmVjdHMgZmlyc3QtbGV0
dGVyIHJlbmRlcmVycyB0byB0aGVpciByZW1haW5pbmcgdGV4dCBmcmFnbWVudHMuCiB0eXBlZGVm
IEhhc2hNYXA8Y29uc3QgUmVuZGVyQm94TW9kZWxPYmplY3QqLCBSZW5kZXJUZXh0RnJhZ21lbnQq
PiBGaXJzdExldHRlclJlbWFpbmluZ1RleHRNYXA7CiBzdGF0aWMgRmlyc3RMZXR0ZXJSZW1haW5p
bmdUZXh0TWFwKiBmaXJzdExldHRlclJlbWFpbmluZ1RleHRNYXAgPSAwOwogCkBAIC0xODcsMTEg
KzE3Miw2IEBAIFJlbmRlckJveE1vZGVsT2JqZWN0Ojp+UmVuZGVyQm94TW9kZWxPYmoKIAogdm9p
ZCBSZW5kZXJCb3hNb2RlbE9iamVjdDo6d2lsbEJlRGVzdHJveWVkKCkKIHsKLSAgICBpZiAoaGFz
Q29udGludWF0aW9uKCkpIHsKLSAgICAgICAgY29udGludWF0aW9uKCktPmRlc3Ryb3koKTsKLSAg
ICAgICAgc2V0Q29udGludWF0aW9uKG51bGxwdHIpOwotICAgIH0KLQogICAgIC8vIElmIHRoaXMg
aXMgYSBmaXJzdC1sZXR0ZXIgb2JqZWN0IHdpdGggYSByZW1haW5pbmcgdGV4dCBmcmFnbWVudCB0
aGVuIHRoZQogICAgIC8vIGVudHJ5IG5lZWRzIHRvIGJlIGNsZWFyZWQgZnJvbSB0aGUgbWFwLgog
ICAgIGlmIChmaXJzdExldHRlclJlbWFpbmluZ1RleHQoKSkKQEAgLTIyMSwxOCArMjAxLDYgQEAg
dm9pZCBSZW5kZXJCb3hNb2RlbE9iamVjdDo6dXBkYXRlRnJvbVN0eQogICAgIHNldEhvcml6b250
YWxXcml0aW5nTW9kZShzdHlsZVRvVXNlLmlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpOwogfQog
Ci1zdGF0aWMgTGF5b3V0U2l6ZSBhY2N1bXVsYXRlSW5GbG93UG9zaXRpb25PZmZzZXRzKGNvbnN0
IFJlbmRlck9iamVjdCogY2hpbGQpCi17Ci0gICAgaWYgKCFjaGlsZC0+aXNBbm9ueW1vdXNCbG9j
aygpIHx8ICFjaGlsZC0+aXNJbkZsb3dQb3NpdGlvbmVkKCkpCi0gICAgICAgIHJldHVybiBMYXlv
dXRTaXplKCk7Ci0gICAgTGF5b3V0U2l6ZSBvZmZzZXQ7Ci0gICAgZm9yIChSZW5kZXJFbGVtZW50
KiBwYXJlbnQgPSBkb3duY2FzdDxSZW5kZXJCbG9jaz4oKmNoaWxkKS5pbmxpbmVFbGVtZW50Q29u
dGludWF0aW9uKCk7IGlzPFJlbmRlcklubGluZT4ocGFyZW50KTsgcGFyZW50ID0gcGFyZW50LT5w
YXJlbnQoKSkgewotICAgICAgICBpZiAocGFyZW50LT5pc0luRmxvd1Bvc2l0aW9uZWQoKSkKLSAg
ICAgICAgICAgIG9mZnNldCArPSBkb3duY2FzdDxSZW5kZXJJbmxpbmU+KCpwYXJlbnQpLm9mZnNl
dEZvckluRmxvd1Bvc2l0aW9uKCk7Ci0gICAgfQotICAgIHJldHVybiBvZmZzZXQ7Ci19Ci0KIGJv
b2wgUmVuZGVyQm94TW9kZWxPYmplY3Q6Omhhc0F1dG9IZWlnaHRPckNvbnRhaW5pbmdCbG9ja1dp
dGhBdXRvSGVpZ2h0KCkgY29uc3QKIHsKICAgICBMZW5ndGggbG9naWNhbEhlaWdodExlbmd0aCA9
IHN0eWxlKCkubG9naWNhbEhlaWdodCgpOwpAQCAtMjcyLDcgKzI0MCw3IEBAIGJvb2wgUmVuZGVy
Qm94TW9kZWxPYmplY3Q6Omhhc0F1dG9IZWlnaHQKIAogTGF5b3V0U2l6ZSBSZW5kZXJCb3hNb2Rl
bE9iamVjdDo6cmVsYXRpdmVQb3NpdGlvbk9mZnNldCgpIGNvbnN0CiB7Ci0gICAgTGF5b3V0U2l6
ZSBvZmZzZXQgPSBhY2N1bXVsYXRlSW5GbG93UG9zaXRpb25PZmZzZXRzKHRoaXMpOworICAgIExh
eW91dFNpemUgb2Zmc2V0ID0gTGF5b3V0U2l6ZSgpOwogCiAgICAgUmVuZGVyQmxvY2sqIGNvbnRh
aW5pbmdCbG9jayA9IHRoaXMtPmNvbnRhaW5pbmdCbG9jaygpOwogCkBAIC0yNTEyLDIyICsyNDgw
LDYgQEAgTGF5b3V0VW5pdCBSZW5kZXJCb3hNb2RlbE9iamVjdDo6Y29udGFpbgogICAgIHJldHVy
biBjb250YWluaW5nQmxvY2soKS0+YXZhaWxhYmxlTG9naWNhbFdpZHRoKCk7CiB9CiAKLVJlbmRl
ckJveE1vZGVsT2JqZWN0KiBSZW5kZXJCb3hNb2RlbE9iamVjdDo6Y29udGludWF0aW9uKCkgY29u
c3QKLXsKLSAgICBpZiAoIWhhc0NvbnRpbnVhdGlvbigpKQotICAgICAgICByZXR1cm4gbnVsbHB0
cjsKLSAgICByZXR1cm4gY29udGludWF0aW9uTWFwKCkuZ2V0KHRoaXMpOwotfQotCi12b2lkIFJl
bmRlckJveE1vZGVsT2JqZWN0OjpzZXRDb250aW51YXRpb24oUmVuZGVyQm94TW9kZWxPYmplY3Qq
IGNvbnRpbnVhdGlvbikKLXsKLSAgICBpZiAoY29udGludWF0aW9uKQotICAgICAgICBjb250aW51
YXRpb25NYXAoKS5zZXQodGhpcywgY29udGludWF0aW9uKTsKLSAgICBlbHNlIGlmIChoYXNDb250
aW51YXRpb24oKSkKLSAgICAgICAgY29udGludWF0aW9uTWFwKCkucmVtb3ZlKHRoaXMpOwotICAg
IHNldEhhc0NvbnRpbnVhdGlvbighIWNvbnRpbnVhdGlvbik7Ci19Ci0KIFJlbmRlclRleHRGcmFn
bWVudCogUmVuZGVyQm94TW9kZWxPYmplY3Q6OmZpcnN0TGV0dGVyUmVtYWluaW5nVGV4dCgpIGNv
bnN0CiB7CiAgICAgaWYgKCFmaXJzdExldHRlclJlbWFpbmluZ1RleHRNYXApCkluZGV4OiBTb3Vy
Y2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQm94TW9kZWxPYmplY3QuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQm94TW9kZWxPYmplY3QuaAkocmV2aXNp
b24gMTgxMzI5KQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJveE1vZGVsT2Jq
ZWN0LmgJKHdvcmtpbmcgY29weSkKQEAgLTI0OCw5ICsyNDgsNiBAQCBwcm90ZWN0ZWQ6CiAKICAg
ICBib29sIHNob3VsZFBhaW50QXRMb3dRdWFsaXR5KEdyYXBoaWNzQ29udGV4dCosIEltYWdlKiwg
Y29uc3Qgdm9pZCosIGNvbnN0IExheW91dFNpemUmKTsKIAotICAgIFJlbmRlckJveE1vZGVsT2Jq
ZWN0KiBjb250aW51YXRpb24oKSBjb25zdDsKLSAgICB2b2lkIHNldENvbnRpbnVhdGlvbihSZW5k
ZXJCb3hNb2RlbE9iamVjdCopOwotCiAgICAgTGF5b3V0UmVjdCBsb2NhbENhcmV0UmVjdEZvckVt
cHR5RWxlbWVudChMYXlvdXRVbml0IHdpZHRoLCBMYXlvdXRVbml0IHRleHRJbmRlbnRPZmZzZXQp
OwogCiAgICAgc3RhdGljIGJvb2wgc2hvdWxkQW50aWFsaWFzTGluZXMoR3JhcGhpY3NDb250ZXh0
Kik7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyRWxlbWVudC5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJFbGVtZW50LmgJKHJldmlz
aW9uIDE4MTMyOSkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJFbGVtZW50LmgJ
KHdvcmtpbmcgY29weSkKQEAgLTIyOSw5ICsyMjksNiBAQCBwcm90ZWN0ZWQ6CiAgICAgdm9pZCBz
ZXRSZW5kZXJJbmxpbmVBbHdheXNDcmVhdGVzTGluZUJveGVzKGJvb2wgYikgeyBtX3JlbmRlcklu
bGluZUFsd2F5c0NyZWF0ZXNMaW5lQm94ZXMgPSBiOyB9CiAgICAgYm9vbCByZW5kZXJJbmxpbmVB
bHdheXNDcmVhdGVzTGluZUJveGVzKCkgY29uc3QgeyByZXR1cm4gbV9yZW5kZXJJbmxpbmVBbHdh
eXNDcmVhdGVzTGluZUJveGVzOyB9CiAKLSAgICB2b2lkIHNldEhhc0NvbnRpbnVhdGlvbihib29s
IGIpIHsgbV9oYXNDb250aW51YXRpb24gPSBiOyB9Ci0gICAgYm9vbCBoYXNDb250aW51YXRpb24o
KSBjb25zdCB7IHJldHVybiBtX2hhc0NvbnRpbnVhdGlvbjsgfQotCiAgICAgc3RhdGljIGJvb2wg
aGFzQ29udHJvbFN0YXRlc0ZvclJlbmRlcmVyKGNvbnN0IFJlbmRlck9iamVjdCopOwogICAgIHN0
YXRpYyBDb250cm9sU3RhdGVzKiBjb250cm9sU3RhdGVzRm9yUmVuZGVyZXIoY29uc3QgUmVuZGVy
T2JqZWN0Kik7CiAgICAgc3RhdGljIHZvaWQgcmVtb3ZlQ29udHJvbFN0YXRlc0ZvclJlbmRlcmVy
KGNvbnN0IFJlbmRlck9iamVjdCopOwpAQCAtMjkyLDcgKzI4OSw2IEBAIHByaXZhdGU6CiAgICAg
dW5zaWduZWQgbV9oYXNQYXVzZWRJbWFnZUFuaW1hdGlvbnMgOiAxOwogICAgIHVuc2lnbmVkIG1f
aGFzQ291bnRlck5vZGVNYXAgOiAxOwogICAgIHVuc2lnbmVkIG1faXNDU1NBbmltYXRpbmcgOiAx
OwotICAgIHVuc2lnbmVkIG1faGFzQ29udGludWF0aW9uIDogMTsKIAogICAgIHVuc2lnbmVkIG1f
cmVuZGVyQmxvY2tIYXNNYXJnaW5CZWZvcmVRdWlyayA6IDE7CiAgICAgdW5zaWduZWQgbV9yZW5k
ZXJCbG9ja0hhc01hcmdpbkFmdGVyUXVpcmsgOiAxOwpJbmRleDogU291cmNlL1dlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlcklubGluZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlcklubGluZS5jcHAJKHJldmlzaW9uIDE4MTMyOSkKKysrIFNvdXJjZS9XZWJD
b3JlL3JlbmRlcmluZy9SZW5kZXJJbmxpbmUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMzgsMzAg
KzEzOCw2IEBAIHN0YXRpYyBSZW5kZXJFbGVtZW50KiBpbkZsb3dQb3NpdGlvbmVkSW4KICAgICBy
ZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgdXBkYXRlU3R5bGVPZkFub255bW91c0Jsb2NrQ29u
dGludWF0aW9ucyhSZW5kZXJCb3gqIGJveCwgY29uc3QgUmVuZGVyU3R5bGUqIG5ld1N0eWxlLCBj
b25zdCBSZW5kZXJTdHlsZSogb2xkU3R5bGUpCi17Ci0gICAgZm9yICg7Ym94ICYmIGJveC0+aXNB
bm9ueW1vdXNCbG9jaygpOyBib3ggPSBib3gtPm5leHRTaWJsaW5nQm94KCkpIHsKLSAgICAgICAg
aWYgKGJveC0+c3R5bGUoKS5wb3NpdGlvbigpID09IG5ld1N0eWxlLT5wb3NpdGlvbigpKQotICAg
ICAgICAgICAgY29udGludWU7Ci0gICAgICAgIAotICAgICAgICBpZiAoIWlzPFJlbmRlckJsb2Nr
PigqYm94KSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIFJlbmRlckJsb2NrJiBi
bG9jayA9IGRvd25jYXN0PFJlbmRlckJsb2NrPigqYm94KTsKLSAgICAgICAgaWYgKCFibG9jay5p
c0Fub255bW91c0Jsb2NrQ29udGludWF0aW9uKCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAg
ICAgICAgCi0gICAgICAgIC8vIElmIHdlIGFyZSBubyBsb25nZXIgaW4tZmxvdyBwb3NpdGlvbmVk
IGJ1dCBvdXIgZGVzY2VuZGFudCBibG9jayhzKSBzdGlsbCBoYXZlIGFuIGluLWZsb3cgcG9zaXRp
b25lZCBhbmNlc3RvciB0aGVuCi0gICAgICAgIC8vIHRoZWlyIGNvbnRhaW5pbmcgYW5vbnltb3Vz
IGJsb2NrIHNob3VsZCBrZWVwIGl0cyBpbi1mbG93IHBvc2l0aW9uaW5nLiAKLSAgICAgICAgUmVu
ZGVySW5saW5lKiBjb250aW51YXRpb24gPSBibG9jay5pbmxpbmVFbGVtZW50Q29udGludWF0aW9u
KCk7Ci0gICAgICAgIGlmIChvbGRTdHlsZS0+aGFzSW5GbG93UG9zaXRpb24oKSAmJiBpbkZsb3dQ
b3NpdGlvbmVkSW5saW5lQW5jZXN0b3IoY29udGludWF0aW9uKSkKLSAgICAgICAgICAgIGNvbnRp
bnVlOwotICAgICAgICBhdXRvIGJsb2NrU3R5bGUgPSBSZW5kZXJTdHlsZTo6Y3JlYXRlQW5vbnlt
b3VzU3R5bGVXaXRoRGlzcGxheSgmYmxvY2suc3R5bGUoKSwgQkxPQ0spOwotICAgICAgICBibG9j
a1N0eWxlLmdldCgpLnNldFBvc2l0aW9uKG5ld1N0eWxlLT5wb3NpdGlvbigpKTsKLSAgICAgICAg
YmxvY2suc2V0U3R5bGUoV1RGOjptb3ZlKGJsb2NrU3R5bGUpKTsKLSAgICB9Ci19Ci0KIHZvaWQg
UmVuZGVySW5saW5lOjpzdHlsZURpZENoYW5nZShTdHlsZURpZmZlcmVuY2UgZGlmZiwgY29uc3Qg
UmVuZGVyU3R5bGUqIG9sZFN0eWxlKQogewogICAgIFJlbmRlckJveE1vZGVsT2JqZWN0OjpzdHls
ZURpZENoYW5nZShkaWZmLCBvbGRTdHlsZSk7CkBAIC0xNzMsMjMgKzE0OSw2IEBAIHZvaWQgUmVu
ZGVySW5saW5lOjpzdHlsZURpZENoYW5nZShTdHlsZUQKICAgICAvLyBhbmQgYWZ0ZXIgdGhlIGJs
b2NrIHNoYXJlIHRoZSBzYW1lIHN0eWxlLCBidXQgdGhlIGJsb2NrIGRvZXNuJ3QKICAgICAvLyBu
ZWVkIHRvIHBhc3MgaXRzIHN0eWxlIG9uIHRvIGFueW9uZSBlbHNlLgogICAgIFJlbmRlclN0eWxl
JiBuZXdTdHlsZSA9IHN0eWxlKCk7Ci0gICAgUmVuZGVySW5saW5lKiBjb250aW51YXRpb24gPSBp
bmxpbmVFbGVtZW50Q29udGludWF0aW9uKCk7Ci0gICAgZm9yIChSZW5kZXJJbmxpbmUqIGN1cnJD
b250ID0gY29udGludWF0aW9uOyBjdXJyQ29udDsgY3VyckNvbnQgPSBjdXJyQ29udC0+aW5saW5l
RWxlbWVudENvbnRpbnVhdGlvbigpKSB7Ci0gICAgICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBu
ZXh0Q29udCA9IGN1cnJDb250LT5jb250aW51YXRpb24oKTsKLSAgICAgICAgY3VyckNvbnQtPnNl
dENvbnRpbnVhdGlvbihudWxscHRyKTsKLSAgICAgICAgY3VyckNvbnQtPnNldFN0eWxlKG5ld1N0
eWxlKTsKLSAgICAgICAgY3VyckNvbnQtPnNldENvbnRpbnVhdGlvbihuZXh0Q29udCk7Ci0gICAg
fQotCi0gICAgLy8gSWYgYW4gaW5saW5lJ3MgaW4tZmxvdyBwb3NpdGlvbmluZyBoYXMgY2hhbmdl
ZCB0aGVuIGFueSBkZXNjZW5kYW50IGJsb2NrcyB3aWxsIG5lZWQgdG8gY2hhbmdlIHRoZWlyIGlu
LWZsb3cgcG9zaXRpb25pbmcgYWNjb3JkaW5nbHkuCi0gICAgLy8gRG8gdGhpcyBieSB1cGRhdGlu
ZyB0aGUgcG9zaXRpb24gb2YgdGhlIGRlc2NlbmRhbnQgYmxvY2tzJyBjb250YWluaW5nIGFub255
bW91cyBibG9ja3MgLSB0aGVyZSBtYXkgYmUgbW9yZSB0aGFuIG9uZS4KLSAgICBpZiAoY29udGlu
dWF0aW9uICYmIG9sZFN0eWxlICYmIG5ld1N0eWxlLnBvc2l0aW9uKCkgIT0gb2xkU3R5bGUtPnBv
c2l0aW9uKCkKLSAgICAgICAgJiYgKG5ld1N0eWxlLmhhc0luRmxvd1Bvc2l0aW9uKCkgfHwgb2xk
U3R5bGUtPmhhc0luRmxvd1Bvc2l0aW9uKCkpKSB7Ci0gICAgICAgIC8vIElmIGFueSBkZXNjZW5k
YW50IGJsb2NrcyBleGlzdCB0aGVuIHRoZXkgd2lsbCBiZSBpbiB0aGUgbmV4dCBhbm9ueW1vdXMg
YmxvY2sgYW5kIGl0cyBzaWJsaW5ncy4KLSAgICAgICAgUmVuZGVyT2JqZWN0KiBibG9jayA9IGNv
bnRhaW5pbmdCbG9jaygpLT5uZXh0U2libGluZygpOwotICAgICAgICBBU1NFUlQoYmxvY2sgJiYg
YmxvY2stPmlzQW5vbnltb3VzQmxvY2soKSk7Ci0gICAgICAgIHVwZGF0ZVN0eWxlT2ZBbm9ueW1v
dXNCbG9ja0NvbnRpbnVhdGlvbnMoZG93bmNhc3Q8UmVuZGVyQmxvY2s+KGJsb2NrKSwgJm5ld1N0
eWxlLCBvbGRTdHlsZSk7Ci0gICAgfQogCiAgICAgaWYgKCFhbHdheXNDcmVhdGVMaW5lQm94ZXMo
KSkgewogICAgICAgICBib29sIGFsd2F5c0NyZWF0ZUxpbmVCb3hlcyA9IGhhc1NlbGZQYWludGlu
Z0xheWVyKCkgfHwgaGFzQm94RGVjb3JhdGlvbnMoKSB8fCBuZXdTdHlsZS5oYXNQYWRkaW5nKCkg
fHwgbmV3U3R5bGUuaGFzTWFyZ2luKCkgfHwgaGFzT3V0bGluZSgpOwpAQCAtMjYyLDQzICsyMjEs
OSBAQCBMYXlvdXRSZWN0IFJlbmRlcklubGluZTo6bG9jYWxDYXJldFJlY3QoCiAKIHZvaWQgUmVu
ZGVySW5saW5lOjphZGRDaGlsZChSZW5kZXJPYmplY3QqIG5ld0NoaWxkLCBSZW5kZXJPYmplY3Qq
IGJlZm9yZUNoaWxkKQogewotICAgIGlmIChjb250aW51YXRpb24oKSkKLSAgICAgICAgcmV0dXJu
IGFkZENoaWxkVG9Db250aW51YXRpb24obmV3Q2hpbGQsIGJlZm9yZUNoaWxkKTsKICAgICByZXR1
cm4gYWRkQ2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihuZXdDaGlsZCwgYmVmb3JlQ2hpbGQpOwog
fQogCi1zdGF0aWMgUmVuZGVyQm94TW9kZWxPYmplY3QqIG5leHRDb250aW51YXRpb24oUmVuZGVy
T2JqZWN0KiByZW5kZXJlcikKLXsKLSAgICBpZiAoaXM8UmVuZGVySW5saW5lPigqcmVuZGVyZXIp
ICYmICFyZW5kZXJlci0+aXNSZXBsYWNlZCgpKQotICAgICAgICByZXR1cm4gZG93bmNhc3Q8UmVu
ZGVySW5saW5lPigqcmVuZGVyZXIpLmNvbnRpbnVhdGlvbigpOwotICAgIHJldHVybiBkb3duY2Fz
dDxSZW5kZXJCbG9jaz4oKnJlbmRlcmVyKS5pbmxpbmVFbGVtZW50Q29udGludWF0aW9uKCk7Ci19
Ci0KLVJlbmRlckJveE1vZGVsT2JqZWN0KiBSZW5kZXJJbmxpbmU6OmNvbnRpbnVhdGlvbkJlZm9y
ZShSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkKQotewotICAgIGlmIChiZWZvcmVDaGlsZCAmJiBi
ZWZvcmVDaGlsZC0+cGFyZW50KCkgPT0gdGhpcykKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0KLSAg
ICBSZW5kZXJCb3hNb2RlbE9iamVjdCogY3VyciA9IG5leHRDb250aW51YXRpb24odGhpcyk7Ci0g
ICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIG5leHRUb0xhc3QgPSB0aGlzOwotICAgIFJlbmRlckJv
eE1vZGVsT2JqZWN0KiBsYXN0ID0gdGhpczsKLSAgICB3aGlsZSAoY3VycikgewotICAgICAgICBp
ZiAoYmVmb3JlQ2hpbGQgJiYgYmVmb3JlQ2hpbGQtPnBhcmVudCgpID09IGN1cnIpIHsKLSAgICAg
ICAgICAgIGlmIChjdXJyLT5maXJzdENoaWxkKCkgPT0gYmVmb3JlQ2hpbGQpCi0gICAgICAgICAg
ICAgICAgcmV0dXJuIGxhc3Q7Ci0gICAgICAgICAgICByZXR1cm4gY3VycjsKLSAgICAgICAgfQot
Ci0gICAgICAgIG5leHRUb0xhc3QgPSBsYXN0OwotICAgICAgICBsYXN0ID0gY3VycjsKLSAgICAg
ICAgY3VyciA9IG5leHRDb250aW51YXRpb24oY3Vycik7Ci0gICAgfQotCi0gICAgaWYgKCFiZWZv
cmVDaGlsZCAmJiAhbGFzdC0+Zmlyc3RDaGlsZCgpKQotICAgICAgICByZXR1cm4gbmV4dFRvTGFz
dDsKLSAgICByZXR1cm4gbGFzdDsKLX0KLQogdm9pZCBSZW5kZXJJbmxpbmU6OmFkZENoaWxkSWdu
b3JpbmdDb250aW51YXRpb24oUmVuZGVyT2JqZWN0KiBuZXdDaGlsZCwgUmVuZGVyT2JqZWN0KiBi
ZWZvcmVDaGlsZCkKIHsKICAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3QgYXBwZW5kIHRoaW5ncyBh
ZnRlciA6YWZ0ZXItZ2VuZXJhdGVkIGNvbnRlbnQgaWYgd2UgaGF2ZSBpdC4KQEAgLTUwNiwxMiAr
NDMxLDggQEAgdm9pZCBSZW5kZXJJbmxpbmU6OmFkZENoaWxkVG9Db250aW51YXRpbwogICAgIFJl
bmRlckJveE1vZGVsT2JqZWN0KiBiZWZvcmVDaGlsZFBhcmVudCA9IG51bGxwdHI7CiAgICAgaWYg
KGJlZm9yZUNoaWxkKQogICAgICAgICBiZWZvcmVDaGlsZFBhcmVudCA9IGRvd25jYXN0PFJlbmRl
ckJveE1vZGVsT2JqZWN0PihiZWZvcmVDaGlsZC0+cGFyZW50KCkpOwotICAgIGVsc2UgewotICAg
ICAgICBpZiAoUmVuZGVyQm94TW9kZWxPYmplY3QqIGNvbnRpbnVhdGlvbiA9IG5leHRDb250aW51
YXRpb24oZmxvdykpCi0gICAgICAgICAgICBiZWZvcmVDaGlsZFBhcmVudCA9IGNvbnRpbnVhdGlv
bjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYmVmb3JlQ2hpbGRQYXJlbnQgPSBmbG93Owot
ICAgIH0KKyAgICBlbHNlCisgICAgICAgIGJlZm9yZUNoaWxkUGFyZW50ID0gZmxvdzsKIAogICAg
IGlmIChuZXdDaGlsZC0+aXNGbG9hdGluZ09yT3V0T2ZGbG93UG9zaXRpb25lZCgpKQogICAgICAg
ICByZXR1cm4gYmVmb3JlQ2hpbGRQYXJlbnQtPmFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24o
bmV3Q2hpbGQsIGJlZm9yZUNoaWxkKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9S
ZW5kZXJJbmxpbmUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVu
ZGVySW5saW5lLmgJKHJldmlzaW9uIDE4MTMyOSkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmlu
Zy9SZW5kZXJJbmxpbmUuaAkod29ya2luZyBjb3B5KQpAQCAtODAsOSArODAsNiBAQCBwdWJsaWM6
CiAgICAgdmlydHVhbCB2b2lkIGFic29sdXRlUXVhZHNGb3JTZWxlY3Rpb24oVmVjdG9yPEZsb2F0
UXVhZD4mIHF1YWRzKSBjb25zdCBvdmVycmlkZTsKICNlbmRpZgogCi0gICAgdmlydHVhbCBSZW5k
ZXJCb3hNb2RlbE9iamVjdCogdmlydHVhbENvbnRpbnVhdGlvbigpIGNvbnN0IG92ZXJyaWRlIGZp
bmFsIHsgcmV0dXJuIGNvbnRpbnVhdGlvbigpOyB9Ci0gICAgUmVuZGVySW5saW5lKiBpbmxpbmVF
bGVtZW50Q29udGludWF0aW9uKCkgY29uc3Q7Ci0KICAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlRHJh
Z1N0YXRlKGJvb2wgZHJhZ09uKSBvdmVycmlkZSBmaW5hbDsKICAgICAKICAgICBMYXlvdXRTaXpl
IG9mZnNldEZvckluRmxvd1Bvc2l0aW9uZWRJbmxpbmUoY29uc3QgUmVuZGVyQm94KiBjaGlsZCkg
Y29uc3Q7CkBAIC05MCw5ICs4Nyw2IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIHZvaWQgYWRkRm9j
dXNSaW5nUmVjdHMoVmVjdG9yPEludFJlY3Q+JiwgY29uc3QgTGF5b3V0UG9pbnQmIGFkZGl0aW9u
YWxPZmZzZXQsIGNvbnN0IFJlbmRlckxheWVyTW9kZWxPYmplY3QqIHBhaW50Q29udGFpbmVyID0g
MCkgb3ZlcnJpZGUgZmluYWw7CiAgICAgdm9pZCBwYWludE91dGxpbmUoUGFpbnRJbmZvJiwgY29u
c3QgTGF5b3V0UG9pbnQmKTsKIAotICAgIHVzaW5nIFJlbmRlckJveE1vZGVsT2JqZWN0Ojpjb250
aW51YXRpb247Ci0gICAgdXNpbmcgUmVuZGVyQm94TW9kZWxPYmplY3Q6OnNldENvbnRpbnVhdGlv
bjsKLQogICAgIGJvb2wgYWx3YXlzQ3JlYXRlTGluZUJveGVzKCkgY29uc3QgeyByZXR1cm4gcmVu
ZGVySW5saW5lQWx3YXlzQ3JlYXRlc0xpbmVCb3hlcygpOyB9CiAgICAgdm9pZCBzZXRBbHdheXND
cmVhdGVMaW5lQm94ZXMoKSB7IHNldFJlbmRlcklubGluZUFsd2F5c0NyZWF0ZXNMaW5lQm94ZXMo
dHJ1ZSk7IH0KICAgICB2b2lkIHVwZGF0ZUFsd2F5c0NyZWF0ZUxpbmVCb3hlcyhib29sIGZ1bGxM
YXlvdXQpOwpAQCAtMTczLDEwICsxNjcsOCBAQCBwcml2YXRlOgogICAgIAogICAgIFJlbmRlclB0
cjxSZW5kZXJJbmxpbmU+IGNsb25lKCkgY29uc3Q7CiAKLSAgICB2b2lkIHBhaW50T3V0bGluZUZv
ckxpbmUoR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgTGF5b3V0UG9pbnQmLCBjb25zdCBMYXlvdXRS
ZWN0JiBwcmV2TGluZSwgY29uc3QgTGF5b3V0UmVjdCYgdGhpc0xpbmUsCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGNvbnN0IExheW91dFJlY3QmIG5leHRMaW5lLCBjb25zdCBDb2xvcik7
Ci0gICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGNvbnRpbnVhdGlvbkJlZm9yZShSZW5kZXJPYmpl
Y3QqIGJlZm9yZUNoaWxkKTsKLQorICAgIHZvaWQgcGFpbnRPdXRsaW5lRm9yTGluZShHcmFwaGlj
c0NvbnRleHQqLCBjb25zdCBMYXlvdXRQb2ludCYsIGNvbnN0IExheW91dFJlY3QmIHByZXZMaW5l
LCBjb25zdCBMYXlvdXRSZWN0JiB0aGlzTGluZSwgY29uc3QgTGF5b3V0UmVjdCYgbmV4dExpbmUs
IGNvbnN0IENvbG9yKTsKKyAKICAgICBSZW5kZXJMaW5lQm94TGlzdCBtX2xpbmVCb3hlczsgICAv
LyBBbGwgb2YgdGhlIGxpbmUgYm94ZXMgY3JlYXRlZCBmb3IgdGhpcyBpbmxpbmUgZmxvdy4gIEZv
ciBleGFtcGxlLCA8aT5IZWxsbzxicj53b3JsZC48L2k+IHdpbGwgaGF2ZSB0d28gPGk+IGxpbmUg
Ym94ZXMuCiB9OwogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGlzdEl0
ZW0uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMaXN0
SXRlbS5jcHAJKHJldmlzaW9uIDE4MTMyOSkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9S
ZW5kZXJMaXN0SXRlbS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI5Niw3ICsyOTYsNyBAQCB2b2lk
IFJlbmRlckxpc3RJdGVtOjppbnNlcnRPck1vdmVNYXJrZXJSCiAgICAgICAgIG5ld1BhcmVudC0+
YWRkQ2hpbGQobV9tYXJrZXIsIGZpcnN0Tm9uTWFya2VyQ2hpbGQoKm5ld1BhcmVudCkpOwogICAg
ICAgICBtX21hcmtlci0+dXBkYXRlTWFyZ2luc0FuZENvbnRlbnQoKTsKICAgICAgICAgLy8gSWYg
Y3VycmVudCBwYXJlbnQgaXMgYW4gYW5vbnltb3VzIGJsb2NrIHRoYXQgaGFzIGxvc3QgYWxsIGl0
cyBjaGlsZHJlbiwgZGVzdHJveSBpdC4KLSAgICAgICAgaWYgKGN1cnJlbnRQYXJlbnQgJiYgY3Vy
cmVudFBhcmVudC0+aXNBbm9ueW1vdXNCbG9jaygpICYmICFjdXJyZW50UGFyZW50LT5maXJzdENo
aWxkKCkgJiYgIWRvd25jYXN0PFJlbmRlckJsb2NrPigqY3VycmVudFBhcmVudCkuY29udGludWF0
aW9uKCkpCisgICAgICAgIGlmIChjdXJyZW50UGFyZW50ICYmIGN1cnJlbnRQYXJlbnQtPmlzQW5v
bnltb3VzQmxvY2soKSAmJiAhY3VycmVudFBhcmVudC0+Zmlyc3RDaGlsZCgpKQogICAgICAgICAg
ICAgY3VycmVudFBhcmVudC0+ZGVzdHJveSgpOwogICAgIH0KIApJbmRleDogU291cmNlL1dlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdC5jcHAJKHJldmlzaW9uIDE4MTMyOSkKKysrIFNvdXJj
ZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0y
MTUwLDggKzIxNTAsNiBAQCB2b2lkIFJlbmRlck9iamVjdDo6Z2V0VGV4dERlY29yYXRpb25Db2xv
CiAgICAgICAgIGlmIChjdXJyZW50LT5pc1J1YnlUZXh0KCkpCiAgICAgICAgICAgICByZXR1cm47
CiAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5wYXJlbnQoKTsKLSAgICAgICAgaWYgKGN1cnJl
bnQgJiYgY3VycmVudC0+aXNBbm9ueW1vdXNCbG9jaygpICYmIGRvd25jYXN0PFJlbmRlckJsb2Nr
PigqY3VycmVudCkuY29udGludWF0aW9uKCkpCi0gICAgICAgICAgICBjdXJyZW50ID0gZG93bmNh
c3Q8UmVuZGVyQmxvY2s+KCpjdXJyZW50KS5jb250aW51YXRpb24oKTsKICAgICB9IHdoaWxlIChj
dXJyZW50ICYmIGRlY29yYXRpb25zICYmICghY3VycmVudC0+bm9kZSgpIHx8ICghaXM8SFRNTEFu
Y2hvckVsZW1lbnQ+KCpjdXJyZW50LT5ub2RlKCkpICYmICFjdXJyZW50LT5ub2RlKCktPmhhc1Rh
Z05hbWUoZm9udFRhZykpKSk7CiAKICAgICAvLyBJZiB3ZSBiYWlsZWQgb3V0LCB1c2UgdGhlIGVs
ZW1lbnQgd2UgYmFpbGVkIG91dCBhdCAodHlwaWNhbGx5IGEgPGZvbnQ+IG9yIDxhPiBlbGVtZW50
KS4KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3QuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmgJKHJldmlzaW9u
IDE4MTMyOSkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3QuaAkod29y
a2luZyBjb3B5KQpAQCAtNDg5LDEwICs0ODksMTAgQEAgcHVibGljOgogI2VuZGlmCiAgICAgICAg
ICAgICA7CiAgICAgfQotICAgIGJvb2wgaXNFbGVtZW50Q29udGludWF0aW9uKCkgY29uc3QgeyBy
ZXR1cm4gbm9kZSgpICYmIG5vZGUoKS0+cmVuZGVyZXIoKSAhPSB0aGlzOyB9Ci0gICAgYm9vbCBp
c0lubGluZUVsZW1lbnRDb250aW51YXRpb24oKSBjb25zdCB7IHJldHVybiBpc0VsZW1lbnRDb250
aW51YXRpb24oKSAmJiBpc0lubGluZSgpOyB9Ci0gICAgYm9vbCBpc0Jsb2NrRWxlbWVudENvbnRp
bnVhdGlvbigpIGNvbnN0IHsgcmV0dXJuIGlzRWxlbWVudENvbnRpbnVhdGlvbigpICYmICFpc0lu
bGluZSgpOyB9Ci0gICAgdmlydHVhbCBSZW5kZXJCb3hNb2RlbE9iamVjdCogdmlydHVhbENvbnRp
bnVhdGlvbigpIGNvbnN0IHsgcmV0dXJuIG51bGxwdHI7IH0KKyAgICBib29sIGlzQW5vbnltb3Vz
SW5saW5lQmxvY2soKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzQW5vbnltb3VzKCkg
JiYgc3R5bGUoKS5kaXNwbGF5KCkgPT0gSU5MSU5FX0JMT0NLICYmIHN0eWxlKCkuc3R5bGVUeXBl
KCkgPT0gTk9QU0VVRE8gJiYgIWlzVGV4dCgpICYmICFpc1J1YnlSdW4oKSAmJiAhaXNSdWJ5QmFz
ZSgpOworICAgIH0KIAogICAgIGJvb2wgaXNGbG9hdGluZygpIGNvbnN0IHsgcmV0dXJuIG1fYml0
ZmllbGRzLmZsb2F0aW5nKCk7IH0KIApJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1Jv
b3RJbmxpbmVCb3guaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUm9v
dElubGluZUJveC5oCShyZXZpc2lvbiAxODEzMjkpCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJp
bmcvUm9vdElubGluZUJveC5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMTgsOCArMTE4LDggQEAgcHVi
bGljOgogICAgIHZpcnR1YWwgaW50IGJhc2VsaW5lUG9zaXRpb24oRm9udEJhc2VsaW5lIGJhc2Vs
aW5lVHlwZSkgY29uc3Qgb3ZlcnJpZGUgZmluYWw7CiAgICAgdmlydHVhbCBMYXlvdXRVbml0IGxp
bmVIZWlnaHQoKSBjb25zdCBvdmVycmlkZSBmaW5hbDsKIAotICAgIHZpcnR1YWwgdm9pZCBwYWlu
dChQYWludEluZm8mLCBjb25zdCBMYXlvdXRQb2ludCYsIExheW91dFVuaXQgbGluZVRvcCwgTGF5
b3V0VW5pdCBsaW5lQm90dG9tKSBvdmVycmlkZTsKLSAgICB2aXJ0dWFsIGJvb2wgbm9kZUF0UG9p
bnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVzdWx0JiwgY29uc3QgSGl0VGVzdExv
Y2F0aW9uJiBsb2NhdGlvbkluQ29udGFpbmVyLCBjb25zdCBMYXlvdXRQb2ludCYgYWNjdW11bGF0
ZWRPZmZzZXQsIExheW91dFVuaXQgbGluZVRvcCwgTGF5b3V0VW5pdCBsaW5lQm90dG9tKSBvdmVy
cmlkZSBmaW5hbDsKKyAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoUGFpbnRJbmZvJiwgY29uc3QgTGF5
b3V0UG9pbnQmLCBMYXlvdXRVbml0IGxpbmVUb3AsIExheW91dFVuaXQgbGluZUJvdHRvbSwgTGlu
ZUJveFBhaW50SW5mbyYpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYm9vbCBub2RlQXRQb2ludChj
b25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBjb25zdCBIaXRUZXN0TG9jYXRp
b24mIGxvY2F0aW9uSW5Db250YWluZXIsIGNvbnN0IExheW91dFBvaW50JiBhY2N1bXVsYXRlZE9m
ZnNldCwgTGF5b3V0VW5pdCBsaW5lVG9wLCBMYXlvdXRVbml0IGxpbmVCb3R0b20sIEhpdFRlc3RB
Y3Rpb24sIExpbmVCb3hIaXRUZXN0SW5mbyYpIG92ZXJyaWRlOwogCiAgICAgdXNpbmcgSW5saW5l
Qm94OjpoYXNTZWxlY3RlZENoaWxkcmVuOwogICAgIHVzaW5nIElubGluZUJveDo6c2V0SGFzU2Vs
ZWN0ZWRDaGlsZHJlbjsKQEAgLTE5MCw2ICsxOTAsMTEgQEAgcHVibGljOgogICAgIE5vZGUqIGdl
dExvZ2ljYWxTdGFydEJveFdpdGhOb2RlKElubGluZUJveComKSBjb25zdDsKICAgICBOb2RlKiBn
ZXRMb2dpY2FsRW5kQm94V2l0aE5vZGUoSW5saW5lQm94KiYpIGNvbnN0OwogCisgICAgYm9vbCBo
YXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpIGNvbnN0IHsgcmV0dXJuIG1faGFzQW5vbnltb3VzSW5s
aW5lQmxvY2s7IH0KKyAgICB2b2lkIHNldEhhc0Fub255bW91c0lubGluZUJsb2NrKCkgeyBtX2hh
c0Fub255bW91c0lubGluZUJsb2NrID0gdHJ1ZTsgfQorICAgIAorICAgIFJlbmRlckJsb2NrRmxv
dyogYW5vbnltb3VzSW5saW5lQmxvY2soKSBjb25zdDsKKwogI2lmIEVOQUJMRShUUkVFX0RFQlVH
R0lORykKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGJveE5hbWUoKSBjb25zdCBvdmVycmlkZSBm
aW5hbDsKICNlbmRpZgpAQCAtMjI2LDggKzIzMSwzMCBAQCBwcml2YXRlOgogICAgIC8vIEZsb2F0
cyBoYW5naW5nIG9mZiB0aGUgbGluZSBhcmUgcHVzaGVkIGludG8gdGhpcyB2ZWN0b3IgZHVyaW5n
IGxheW91dC4gSXQgaXMgb25seQogICAgIC8vIGdvb2QgZm9yIGFzIGxvbmcgYXMgdGhlIGxpbmUg
aGFzIG5vdCBiZWVuIG1hcmtlZCBkaXJ0eS4KICAgICBzdGQ6OnVuaXF1ZV9wdHI8VmVjdG9yPFJl
bmRlckJveCo+PiBtX2Zsb2F0czsKKyAgICAKKyAgICB1bnNpZ25lZCBtX2hhc0Fub255bW91c0lu
bGluZUJsb2NrIDogMTsKIH07CiAKKy8vIEZvciBhbm9ueW1vdXMgaW5saW5lIGJsb2NrIG9iamVj
dHMuCitjbGFzcyBSb290QW5vbnltb3VzSW5saW5lQmxvY2tCb3ggOiBwdWJsaWMgUm9vdElubGlu
ZUJveAoreworcHVibGljOgorICAgIFJvb3RBbm9ueW1vdXNJbmxpbmVCbG9ja0JveChSZW5kZXJC
bG9ja0Zsb3cmIHJvb3RCbG9jaywgUmVuZGVyQmxvY2tGbG93KiBhbm9ueW1vdXNCbG9jaykKKyAg
ICA6IFJvb3RJbmxpbmVCb3gocm9vdEJsb2NrKQorICAgICwgbV9hbm9ueW1vdXNJbmxpbmVCbG9j
ayhhbm9ueW1vdXNCbG9jaykKKyAgICB7CisgICAgICAgIHNldEhhc0Fub255bW91c0lubGluZUJs
b2NrKCk7CisgICAgfQorICAgIAorICAgIFJlbmRlckJsb2NrRmxvdyogaW5saW5lQmxvY2soKSBj
b25zdCB7IHJldHVybiBtX2Fub255bW91c0lubGluZUJsb2NrOyB9CisKKyAgICB2aXJ0dWFsIHZv
aWQgcGFpbnQoUGFpbnRJbmZvJiwgY29uc3QgTGF5b3V0UG9pbnQmLCBMYXlvdXRVbml0IGxpbmVU
b3AsIExheW91dFVuaXQgbGluZUJvdHRvbSwgTGluZUJveFBhaW50SW5mbyYpIG92ZXJyaWRlIGZp
bmFsOworICAgIHZpcnR1YWwgYm9vbCBub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYs
IEhpdFRlc3RSZXN1bHQmLCBjb25zdCBIaXRUZXN0TG9jYXRpb24mIGxvY2F0aW9uSW5Db250YWlu
ZXIsIGNvbnN0IExheW91dFBvaW50JiBhY2N1bXVsYXRlZE9mZnNldCwgTGF5b3V0VW5pdCBsaW5l
VG9wLCBMYXlvdXRVbml0IGxpbmVCb3R0b20sIEhpdFRlc3RBY3Rpb24sIExpbmVCb3hIaXRUZXN0
SW5mbyYpIG92ZXJyaWRlIGZpbmFsOworCitwcml2YXRlOgorICAgIFJlbmRlckJsb2NrRmxvdyog
bV9hbm9ueW1vdXNJbmxpbmVCbG9jazsKK307CisgCiBpbmxpbmUgUm9vdElubGluZUJveCogUm9v
dElubGluZUJveDo6bmV4dFJvb3RCb3goKSBjb25zdAogewogICAgIHJldHVybiBkb3duY2FzdDxS
b290SW5saW5lQm94PihtX25leHRMaW5lQm94KTsK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>248528</attachid>
            <date>2015-03-12 11:32:03 -0700</date>
            <delta_ts>2015-03-12 11:32:03 -0700</delta_ts>
            <desc>More work to bring patch to ToT (about 75% merged)</desc>
            <filename>patch.txt</filename>
            <type>text/plain</type>
            <size>132441</size>
            <attacher name="Dave Hyatt">hyatt</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eVJlbmRlck9i
amVjdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nl
c3NpYmlsaXR5UmVuZGVyT2JqZWN0LmNwcAkocmV2aXNpb24gMTgxMzI5KQorKysgU291cmNlL1dl
YkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0LmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMTYyLDY2ICsxNjIsMTIgQEAgdm9pZCBBY2Nlc3NpYmlsaXR5UmVuZGVyT2Jq
ZWN0OjpzZXRSZW5kZQogICAgIHNldE5vZGUocmVuZGVyZXItPm5vZGUoKSk7CiB9CiAKLXN0YXRp
YyBpbmxpbmUgYm9vbCBpc0lubGluZVdpdGhDb250aW51YXRpb24oUmVuZGVyT2JqZWN0JiBvYmpl
Y3QpCi17Ci0gICAgcmV0dXJuIGlzPFJlbmRlcklubGluZT4ob2JqZWN0KSAmJiBkb3duY2FzdDxS
ZW5kZXJJbmxpbmU+KG9iamVjdCkuY29udGludWF0aW9uKCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUg
UmVuZGVyT2JqZWN0KiBmaXJzdENoaWxkSW5Db250aW51YXRpb24oUmVuZGVySW5saW5lJiByZW5k
ZXJlcikKLXsKLSAgICBhdXRvIGNvbnRpbnVhdGlvbiA9IHJlbmRlcmVyLmNvbnRpbnVhdGlvbigp
OwotCi0gICAgd2hpbGUgKGNvbnRpbnVhdGlvbikgewotICAgICAgICBpZiAoaXM8UmVuZGVyQmxv
Y2s+KCpjb250aW51YXRpb24pKQotICAgICAgICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbjsKLSAg
ICAgICAgaWYgKFJlbmRlck9iamVjdCogY2hpbGQgPSBjb250aW51YXRpb24tPmZpcnN0Q2hpbGQo
KSkKLSAgICAgICAgICAgIHJldHVybiBjaGlsZDsKLSAgICAgICAgY29udGludWF0aW9uID0gZG93
bmNhc3Q8UmVuZGVySW5saW5lPigqY29udGludWF0aW9uKS5jb250aW51YXRpb24oKTsKLSAgICB9
Ci0KLSAgICByZXR1cm4gbnVsbHB0cjsKLX0KLQotc3RhdGljIGlubGluZSBSZW5kZXJPYmplY3Qq
IGZpcnN0Q2hpbGRDb25zaWRlcmluZ0NvbnRpbnVhdGlvbihSZW5kZXJPYmplY3QmIHJlbmRlcmVy
KQotewotICAgIFJlbmRlck9iamVjdCogZmlyc3RDaGlsZCA9IHJlbmRlcmVyLmZpcnN0Q2hpbGRT
bG93KCk7Ci0KLSAgICBpZiAoIWZpcnN0Q2hpbGQgJiYgaXNJbmxpbmVXaXRoQ29udGludWF0aW9u
KHJlbmRlcmVyKSkKLSAgICAgICAgZmlyc3RDaGlsZCA9IGZpcnN0Q2hpbGRJbkNvbnRpbnVhdGlv
bihkb3duY2FzdDxSZW5kZXJJbmxpbmU+KHJlbmRlcmVyKSk7Ci0KLSAgICByZXR1cm4gZmlyc3RD
aGlsZDsKLX0KLQotCi1zdGF0aWMgaW5saW5lIFJlbmRlck9iamVjdCogbGFzdENoaWxkQ29uc2lk
ZXJpbmdDb250aW51YXRpb24oUmVuZGVyT2JqZWN0JiByZW5kZXJlcikKLXsKLSAgICBpZiAoIWlz
PFJlbmRlcklubGluZT4ocmVuZGVyZXIpICYmICFpczxSZW5kZXJCbG9jaz4ocmVuZGVyZXIpKQot
ICAgICAgICByZXR1cm4gJnJlbmRlcmVyOwotCi0gICAgUmVuZGVyT2JqZWN0KiBsYXN0Q2hpbGQg
PSBkb3duY2FzdDxSZW5kZXJCb3hNb2RlbE9iamVjdD4ocmVuZGVyZXIpLmxhc3RDaGlsZCgpOwot
ICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBwcmV2aW91czsKLSAgICBmb3IgKGF1dG8qIGN1cnJl
bnQgPSAmZG93bmNhc3Q8UmVuZGVyQm94TW9kZWxPYmplY3Q+KHJlbmRlcmVyKTsgY3VycmVudDsg
KSB7Ci0gICAgICAgIHByZXZpb3VzID0gY3VycmVudDsKLQotICAgICAgICBpZiAoUmVuZGVyT2Jq
ZWN0KiBuZXdMYXN0Q2hpbGQgPSBjdXJyZW50LT5sYXN0Q2hpbGQoKSkKLSAgICAgICAgICAgIGxh
c3RDaGlsZCA9IG5ld0xhc3RDaGlsZDsKLQotICAgICAgICBpZiAoaXM8UmVuZGVySW5saW5lPigq
Y3VycmVudCkpIHsKLSAgICAgICAgICAgIGN1cnJlbnQgPSBkb3duY2FzdDxSZW5kZXJJbmxpbmU+
KCpjdXJyZW50KS5pbmxpbmVFbGVtZW50Q29udGludWF0aW9uKCk7Ci0gICAgICAgICAgICBBU1NF
UlRfVU5VU0VEKHByZXZpb3VzLCBjdXJyZW50IHx8ICFkb3duY2FzdDxSZW5kZXJJbmxpbmU+KCpw
cmV2aW91cykuY29udGludWF0aW9uKCkpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIGN1
cnJlbnQgPSBkb3duY2FzdDxSZW5kZXJCbG9jaz4oKmN1cnJlbnQpLmlubGluZUVsZW1lbnRDb250
aW51YXRpb24oKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbGFzdENoaWxkOwotfQotCiBBY2Nlc3Np
YmlsaXR5T2JqZWN0KiBBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0OjpmaXJzdENoaWxkKCkgY29u
c3QKIHsKICAgICBpZiAoIW1fcmVuZGVyZXIpCiAgICAgICAgIHJldHVybiBudWxscHRyOwogICAg
IAotICAgIFJlbmRlck9iamVjdCogZmlyc3RDaGlsZCA9IGZpcnN0Q2hpbGRDb25zaWRlcmluZ0Nv
bnRpbnVhdGlvbigqbV9yZW5kZXJlcik7CisgICAgUmVuZGVyT2JqZWN0KiBmaXJzdENoaWxkID0g
bV9yZW5kZXJlci0+Zmlyc3RDaGlsZFNsb3coKTsKIAogICAgIC8vIElmIGFuIG9iamVjdCBjYW4n
dCBoYXZlIGNoaWxkcmVuLCB0aGVuIGl0IGlzIHVzaW5nIHRoaXMgbWV0aG9kIHRvIGhlbHAKICAg
ICAvLyBjYWxjdWxhdGUgc29tZSBpbnRlcm5hbCBwcm9wZXJ0eSAobGlrZSBpdHMgZGVzY3JpcHRp
b24pLgpAQCAtMjM4LDcgKzE4NCw3IEBAIEFjY2Vzc2liaWxpdHlPYmplY3QqIEFjY2Vzc2liaWxp
dHlSZW5kZXIKICAgICBpZiAoIW1fcmVuZGVyZXIpCiAgICAgICAgIHJldHVybiBudWxscHRyOwog
Ci0gICAgUmVuZGVyT2JqZWN0KiBsYXN0Q2hpbGQgPSBsYXN0Q2hpbGRDb25zaWRlcmluZ0NvbnRp
bnVhdGlvbigqbV9yZW5kZXJlcik7CisgICAgUmVuZGVyT2JqZWN0KiBsYXN0Q2hpbGQgPSBtX3Jl
bmRlcmVyLT5sYXN0Q2hpbGRTbG93KCk7CiAKICAgICBpZiAoIWxhc3RDaGlsZCAmJiAhY2FuSGF2
ZUNoaWxkcmVuKCkpCiAgICAgICAgIHJldHVybiBBY2Nlc3NpYmlsaXR5Tm9kZU9iamVjdDo6bGFz
dENoaWxkKCk7CkBAIC0yNDYsNzAgKzE5Miw2IEBAIEFjY2Vzc2liaWxpdHlPYmplY3QqIEFjY2Vz
c2liaWxpdHlSZW5kZXIKICAgICByZXR1cm4gYXhPYmplY3RDYWNoZSgpLT5nZXRPckNyZWF0ZShs
YXN0Q2hpbGQpOwogfQogCi1zdGF0aWMgaW5saW5lIFJlbmRlcklubGluZSogc3RhcnRPZkNvbnRp
bnVhdGlvbnMoUmVuZGVyT2JqZWN0JiByZW5kZXJlcikKLXsKLSAgICBpZiAocmVuZGVyZXIuaXNJ
bmxpbmVFbGVtZW50Q29udGludWF0aW9uKCkgJiYgaXM8UmVuZGVySW5saW5lPihyZW5kZXJlci5u
b2RlKCktPnJlbmRlcmVyKCkpKQotICAgICAgICByZXR1cm4gZG93bmNhc3Q8UmVuZGVySW5saW5l
PihyZW5kZXJlci5ub2RlKCktPnJlbmRlcmVyKCkpOwotCi0gICAgLy8gQmxvY2tzIHdpdGggYSBw
cmV2aW91cyBjb250aW51YXRpb24gYWx3YXlzIGhhdmUgYSBuZXh0IGNvbnRpbnVhdGlvbgotICAg
IGlmIChpczxSZW5kZXJCbG9jaz4ocmVuZGVyZXIpICYmIGRvd25jYXN0PFJlbmRlckJsb2NrPihy
ZW5kZXJlcikuaW5saW5lRWxlbWVudENvbnRpbnVhdGlvbigpKQotICAgICAgICByZXR1cm4gZG93
bmNhc3Q8UmVuZGVySW5saW5lPihkb3duY2FzdDxSZW5kZXJCbG9jaz4ocmVuZGVyZXIpLmlubGlu
ZUVsZW1lbnRDb250aW51YXRpb24oKS0+ZWxlbWVudCgpLT5yZW5kZXJlcigpKTsKLQotICAgIHJl
dHVybiBudWxscHRyOwotfQotCi1zdGF0aWMgaW5saW5lIFJlbmRlck9iamVjdCogZW5kT2ZDb250
aW51YXRpb25zKFJlbmRlck9iamVjdCYgcmVuZGVyZXIpCi17Ci0gICAgaWYgKCFpczxSZW5kZXJJ
bmxpbmU+KHJlbmRlcmVyKSAmJiAhaXM8UmVuZGVyQmxvY2s+KHJlbmRlcmVyKSkKLSAgICAgICAg
cmV0dXJuICZyZW5kZXJlcjsKLQotICAgIGF1dG8qIHByZXZpb3VzID0gJmRvd25jYXN0PFJlbmRl
ckJveE1vZGVsT2JqZWN0PihyZW5kZXJlcik7Ci0gICAgZm9yIChhdXRvKiBjdXJyZW50ID0gcHJl
dmlvdXM7IGN1cnJlbnQ7ICkgewotICAgICAgICBwcmV2aW91cyA9IGN1cnJlbnQ7Ci0gICAgICAg
IGlmIChpczxSZW5kZXJJbmxpbmU+KCpjdXJyZW50KSkgewotICAgICAgICAgICAgY3VycmVudCA9
IGRvd25jYXN0PFJlbmRlcklubGluZT4oKmN1cnJlbnQpLmlubGluZUVsZW1lbnRDb250aW51YXRp
b24oKTsKLSAgICAgICAgICAgIEFTU0VSVChjdXJyZW50IHx8ICFkb3duY2FzdDxSZW5kZXJJbmxp
bmU+KCpwcmV2aW91cykuY29udGludWF0aW9uKCkpOwotICAgICAgICB9IGVsc2UgCi0gICAgICAg
ICAgICBjdXJyZW50ID0gZG93bmNhc3Q8UmVuZGVyQmxvY2s+KCpjdXJyZW50KS5pbmxpbmVFbGVt
ZW50Q29udGludWF0aW9uKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHByZXZpb3VzOwotfQotCi0K
LXN0YXRpYyBpbmxpbmUgUmVuZGVyT2JqZWN0KiBjaGlsZEJlZm9yZUNvbnNpZGVyaW5nQ29udGlu
dWF0aW9ucyhSZW5kZXJJbmxpbmUqIHJlbmRlcmVyLCBSZW5kZXJPYmplY3QqIGNoaWxkKQotewot
ICAgIFJlbmRlck9iamVjdCogcHJldmlvdXMgPSBudWxscHRyOwotICAgIGZvciAoUmVuZGVyQm94
TW9kZWxPYmplY3QqIGN1cnJlbnRDb250YWluZXIgPSByZW5kZXJlcjsgY3VycmVudENvbnRhaW5l
cjsgKSB7Ci0gICAgICAgIGlmIChpczxSZW5kZXJJbmxpbmU+KCpjdXJyZW50Q29udGFpbmVyKSkg
ewotICAgICAgICAgICAgYXV0byogY3VycmVudCA9IGN1cnJlbnRDb250YWluZXItPmZpcnN0Q2hp
bGQoKTsKLSAgICAgICAgICAgIHdoaWxlIChjdXJyZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYg
KGN1cnJlbnQgPT0gY2hpbGQpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmV2aW91czsK
LSAgICAgICAgICAgICAgICBwcmV2aW91cyA9IGN1cnJlbnQ7Ci0gICAgICAgICAgICAgICAgY3Vy
cmVudCA9IGN1cnJlbnQtPm5leHRTaWJsaW5nKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAg
ICAgIGN1cnJlbnRDb250YWluZXIgPSBkb3duY2FzdDxSZW5kZXJJbmxpbmU+KCpjdXJyZW50Q29u
dGFpbmVyKS5jb250aW51YXRpb24oKTsKLSAgICAgICAgfSBlbHNlIGlmIChpczxSZW5kZXJCbG9j
az4oKmN1cnJlbnRDb250YWluZXIpKSB7Ci0gICAgICAgICAgICBpZiAoY3VycmVudENvbnRhaW5l
ciA9PSBjaGlsZCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcHJldmlvdXM7Ci0KLSAgICAgICAg
ICAgIHByZXZpb3VzID0gY3VycmVudENvbnRhaW5lcjsKLSAgICAgICAgICAgIGN1cnJlbnRDb250
YWluZXIgPSBkb3duY2FzdDxSZW5kZXJCbG9jaz4oKmN1cnJlbnRDb250YWluZXIpLmlubGluZUVs
ZW1lbnRDb250aW51YXRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEFTU0VSVF9OT1Rf
UkVBQ0hFRCgpOwotICAgIHJldHVybiBudWxscHRyOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wg
Zmlyc3RDaGlsZElzSW5saW5lQ29udGludWF0aW9uKFJlbmRlckVsZW1lbnQmIHJlbmRlcmVyKQot
ewotICAgIFJlbmRlck9iamVjdCogY2hpbGQgPSByZW5kZXJlci5maXJzdENoaWxkKCk7Ci0gICAg
cmV0dXJuIGNoaWxkICYmIGNoaWxkLT5pc0lubGluZUVsZW1lbnRDb250aW51YXRpb24oKTsKLX0K
LQogQWNjZXNzaWJpbGl0eU9iamVjdCogQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6cHJldmlv
dXNTaWJsaW5nKCkgY29uc3QKIHsKICAgICBpZiAoIW1fcmVuZGVyZXIpCkBAIC0zMTcsNDQgKzE5
OSwxNSBAQCBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBBY2Nlc3NpYmlsaXR5UmVuZGVyCiAKICAgICBS
ZW5kZXJPYmplY3QqIHByZXZpb3VzU2libGluZyA9IG51bGxwdHI7CiAKLSAgICAvLyBDYXNlIDE6
IFRoZSBub2RlIGlzIGEgYmxvY2sgYW5kIGlzIGFuIGlubGluZSdzIGNvbnRpbnVhdGlvbi4gSW4g
dGhhdCBjYXNlLCB0aGUgaW5saW5lJ3MKLSAgICAvLyBsYXN0IGNoaWxkIGlzIG91ciBwcmV2aW91
cyBzaWJsaW5nIChvciBmdXJ0aGVyIGJhY2sgaW4gdGhlIGNvbnRpbnVhdGlvbiBjaGFpbikKLSAg
ICBSZW5kZXJJbmxpbmUqIHN0YXJ0T2ZDb250czsKLSAgICBpZiAoaXM8UmVuZGVyQm94PigqbV9y
ZW5kZXJlcikgJiYgKHN0YXJ0T2ZDb250cyA9IHN0YXJ0T2ZDb250aW51YXRpb25zKCptX3JlbmRl
cmVyKSkpCi0gICAgICAgIHByZXZpb3VzU2libGluZyA9IGNoaWxkQmVmb3JlQ29uc2lkZXJpbmdD
b250aW51YXRpb25zKHN0YXJ0T2ZDb250cywgbV9yZW5kZXJlcik7Ci0KLSAgICAvLyBDYXNlIDI6
IEFub255bW91cyBibG9jayBwYXJlbnQgb2YgdGhlIGVuZCBvZiBhIGNvbnRpbnVhdGlvbiAtIHNr
aXAgYWxsIHRoZSB3YXkgdG8gYmVmb3JlCi0gICAgLy8gdGhlIHBhcmVudCBvZiB0aGUgc3RhcnQs
IHNpbmNlIGV2ZXJ5dGhpbmcgaW4gYmV0d2VlbiB3aWxsIGJlIGxpbmtlZCB1cCB2aWEgdGhlIGNv
bnRpbnVhdGlvbi4KLSAgICBlbHNlIGlmIChtX3JlbmRlcmVyLT5pc0Fub255bW91c0Jsb2NrKCkg
JiYgZmlyc3RDaGlsZElzSW5saW5lQ29udGludWF0aW9uKGRvd25jYXN0PFJlbmRlckJsb2NrPigq
bV9yZW5kZXJlcikpKSB7Ci0gICAgICAgIFJlbmRlckJsb2NrJiByZW5kZXJCbG9jayA9IGRvd25j
YXN0PFJlbmRlckJsb2NrPigqbV9yZW5kZXJlcik7Ci0gICAgICAgIGF1dG8qIGZpcnN0UGFyZW50
ID0gc3RhcnRPZkNvbnRpbnVhdGlvbnMoKnJlbmRlckJsb2NrLmZpcnN0Q2hpbGQoKSktPnBhcmVu
dCgpOwotICAgICAgICBBU1NFUlQoZmlyc3RQYXJlbnQpOwotICAgICAgICB3aGlsZSAoZmlyc3RD
aGlsZElzSW5saW5lQ29udGludWF0aW9uKCpmaXJzdFBhcmVudCkpCi0gICAgICAgICAgICBmaXJz
dFBhcmVudCA9IHN0YXJ0T2ZDb250aW51YXRpb25zKCpmaXJzdFBhcmVudC0+Zmlyc3RDaGlsZCgp
KS0+cGFyZW50KCk7Ci0gICAgICAgIHByZXZpb3VzU2libGluZyA9IGZpcnN0UGFyZW50LT5wcmV2
aW91c1NpYmxpbmcoKTsKLSAgICB9Ci0KLSAgICAvLyBDYXNlIDM6IFRoZSBub2RlIGhhcyBhbiBh
Y3R1YWwgcHJldmlvdXMgc2libGluZwotICAgIGVsc2UgaWYgKFJlbmRlck9iamVjdCogcHMgPSBt
X3JlbmRlcmVyLT5wcmV2aW91c1NpYmxpbmcoKSkKKyAgICBpZiAoUmVuZGVyT2JqZWN0KiBwcyA9
IG1fcmVuZGVyZXItPnByZXZpb3VzU2libGluZygpKQogICAgICAgICBwcmV2aW91c1NpYmxpbmcg
PSBwczsKIAotICAgIC8vIENhc2UgNDogVGhpcyBub2RlIGhhcyBubyBwcmV2aW91cyBzaWJsaW5n
cywgYnV0IGl0cyBwYXJlbnQgaXMgYW4gaW5saW5lLAotICAgIC8vIGFuZCBpcyBhbm90aGVyIG5v
ZGUncyBpbmxpbmUgY29udGludXRhdGlvbi4gRm9sbG93IHRoZSBjb250aW51YXRpb24gY2hhaW4u
Ci0gICAgZWxzZSBpZiAoaXM8UmVuZGVySW5saW5lPigqbV9yZW5kZXJlci0+cGFyZW50KCkpICYm
IChzdGFydE9mQ29udHMgPSBzdGFydE9mQ29udGludWF0aW9ucygqbV9yZW5kZXJlci0+cGFyZW50
KCkpKSkKLSAgICAgICAgcHJldmlvdXNTaWJsaW5nID0gY2hpbGRCZWZvcmVDb25zaWRlcmluZ0Nv
bnRpbnVhdGlvbnMoc3RhcnRPZkNvbnRzLCBtX3JlbmRlcmVyLT5wYXJlbnQoKS0+Zmlyc3RDaGls
ZCgpKTsKLQogICAgIGlmICghcHJldmlvdXNTaWJsaW5nKQogICAgICAgICByZXR1cm4gbnVsbHB0
cjsKICAgICAKICAgICByZXR1cm4gYXhPYmplY3RDYWNoZSgpLT5nZXRPckNyZWF0ZShwcmV2aW91
c1NpYmxpbmcpOwogfQogCi1zdGF0aWMgaW5saW5lIGJvb2wgbGFzdENoaWxkSGFzQ29udGludWF0
aW9uKFJlbmRlckVsZW1lbnQmIHJlbmRlcmVyKQotewotICAgIFJlbmRlck9iamVjdCogY2hpbGQg
PSByZW5kZXJlci5sYXN0Q2hpbGQoKTsKLSAgICByZXR1cm4gY2hpbGQgJiYgaXNJbmxpbmVXaXRo
Q29udGludWF0aW9uKCpjaGlsZCk7Ci19Ci0KIEFjY2Vzc2liaWxpdHlPYmplY3QqIEFjY2Vzc2li
aWxpdHlSZW5kZXJPYmplY3Q6Om5leHRTaWJsaW5nKCkgY29uc3QKIHsKICAgICBpZiAoIW1fcmVu
ZGVyZXIpCkBAIC0zNjIsNTcgKzIxNSwxNCBAQCBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBBY2Nlc3Np
YmlsaXR5UmVuZGVyCiAKICAgICBSZW5kZXJPYmplY3QqIG5leHRTaWJsaW5nID0gbnVsbHB0cjsK
IAotICAgIC8vIENhc2UgMTogbm9kZSBpcyBhIGJsb2NrIGFuZCBoYXMgYW4gaW5saW5lIGNvbnRp
bnVhdGlvbi4gTmV4dCBzaWJsaW5nIGlzIHRoZSBpbmxpbmUgY29udGludWF0aW9uJ3MKLSAgICAv
LyBmaXJzdCBjaGlsZC4KLSAgICBSZW5kZXJJbmxpbmUqIGlubGluZUNvbnRpbnVhdGlvbjsKLSAg
ICBpZiAoaXM8UmVuZGVyQmxvY2s+KCptX3JlbmRlcmVyKSAmJiAoaW5saW5lQ29udGludWF0aW9u
ID0gZG93bmNhc3Q8UmVuZGVyQmxvY2s+KCptX3JlbmRlcmVyKS5pbmxpbmVFbGVtZW50Q29udGlu
dWF0aW9uKCkpKQotICAgICAgICBuZXh0U2libGluZyA9IGZpcnN0Q2hpbGRDb25zaWRlcmluZ0Nv
bnRpbnVhdGlvbigqaW5saW5lQ29udGludWF0aW9uKTsKLQotICAgIC8vIENhc2UgMjogQW5vbnlt
b3VzIGJsb2NrIHBhcmVudCBvZiB0aGUgc3RhcnQgb2YgYSBjb250aW51YXRpb24gLSBza2lwIGFs
bCB0aGUgd2F5IHRvCi0gICAgLy8gYWZ0ZXIgdGhlIHBhcmVudCBvZiB0aGUgZW5kLCBzaW5jZSBl
dmVyeXRoaW5nIGluIGJldHdlZW4gd2lsbCBiZSBsaW5rZWQgdXAgdmlhIHRoZSBjb250aW51YXRp
b24uCi0gICAgZWxzZSBpZiAobV9yZW5kZXJlci0+aXNBbm9ueW1vdXNCbG9jaygpICYmIGxhc3RD
aGlsZEhhc0NvbnRpbnVhdGlvbihkb3duY2FzdDxSZW5kZXJCbG9jaz4oKm1fcmVuZGVyZXIpKSkg
ewotICAgICAgICBSZW5kZXJFbGVtZW50KiBsYXN0UGFyZW50ID0gZW5kT2ZDb250aW51YXRpb25z
KCpkb3duY2FzdDxSZW5kZXJCbG9jaz4oKm1fcmVuZGVyZXIpLmxhc3RDaGlsZCgpKS0+cGFyZW50
KCk7Ci0gICAgICAgIEFTU0VSVChsYXN0UGFyZW50KTsKLSAgICAgICAgd2hpbGUgKGxhc3RDaGls
ZEhhc0NvbnRpbnVhdGlvbigqbGFzdFBhcmVudCkpCi0gICAgICAgICAgICBsYXN0UGFyZW50ID0g
ZW5kT2ZDb250aW51YXRpb25zKCpsYXN0UGFyZW50LT5sYXN0Q2hpbGQoKSktPnBhcmVudCgpOwot
ICAgICAgICBuZXh0U2libGluZyA9IGxhc3RQYXJlbnQtPm5leHRTaWJsaW5nKCk7Ci0gICAgfQot
Ci0gICAgLy8gQ2FzZSAzOiBub2RlIGhhcyBhbiBhY3R1YWwgbmV4dCBzaWJsaW5nCi0gICAgZWxz
ZSBpZiAoUmVuZGVyT2JqZWN0KiBucyA9IG1fcmVuZGVyZXItPm5leHRTaWJsaW5nKCkpCisgICAg
aWYgKFJlbmRlck9iamVjdCogbnMgPSBtX3JlbmRlcmVyLT5uZXh0U2libGluZygpKQogICAgICAg
ICBuZXh0U2libGluZyA9IG5zOwogCi0gICAgLy8gQ2FzZSA0OiBub2RlIGlzIGFuIGlubGluZSB3
aXRoIGEgY29udGludWF0aW9uLiBOZXh0IHNpYmxpbmcgaXMgdGhlIG5leHQgc2libGluZyBvZiB0
aGUgZW5kIAotICAgIC8vIG9mIHRoZSBjb250aW51YXRpb24gY2hhaW4uCi0gICAgZWxzZSBpZiAo
aXNJbmxpbmVXaXRoQ29udGludWF0aW9uKCptX3JlbmRlcmVyKSkKLSAgICAgICAgbmV4dFNpYmxp
bmcgPSBlbmRPZkNvbnRpbnVhdGlvbnMoKm1fcmVuZGVyZXIpLT5uZXh0U2libGluZygpOwotCi0g
ICAgLy8gQ2FzZSA1OiBub2RlIGhhcyBubyBuZXh0IHNpYmxpbmcsIGFuZCBpdHMgcGFyZW50IGlz
IGFuIGlubGluZSB3aXRoIGEgY29udGludWF0aW9uLgotICAgIGVsc2UgaWYgKGlzSW5saW5lV2l0
aENvbnRpbnVhdGlvbigqbV9yZW5kZXJlci0+cGFyZW50KCkpKSB7Ci0gICAgICAgIGF1dG8mIGNv
bnRpbnVhdGlvbiA9ICpkb3duY2FzdDxSZW5kZXJJbmxpbmU+KCptX3JlbmRlcmVyLT5wYXJlbnQo
KSkuY29udGludWF0aW9uKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBDYXNlIDVhOiBjb250aW51
YXRpb24gaXMgYSBibG9jayAtIGluIHRoaXMgY2FzZSB0aGUgYmxvY2sgaXRzZWxmIGlzIHRoZSBu
ZXh0IHNpYmxpbmcuCi0gICAgICAgIGlmIChpczxSZW5kZXJCbG9jaz4oY29udGludWF0aW9uKSkK
LSAgICAgICAgICAgIG5leHRTaWJsaW5nID0gJmNvbnRpbnVhdGlvbjsKLSAgICAgICAgLy8gQ2Fz
ZSA1YjogY29udGludWF0aW9uIGlzIGFuIGlubGluZSAtIGluIHRoaXMgY2FzZSB0aGUgaW5saW5l
J3MgZmlyc3QgY2hpbGQgaXMgdGhlIG5leHQgc2libGluZwotICAgICAgICBlbHNlCi0gICAgICAg
ICAgICBuZXh0U2libGluZyA9IGZpcnN0Q2hpbGRDb25zaWRlcmluZ0NvbnRpbnVhdGlvbihjb250
aW51YXRpb24pOwotICAgIH0KLQogICAgIGlmICghbmV4dFNpYmxpbmcpCiAgICAgICAgIHJldHVy
biBudWxscHRyOwogICAgIAogICAgIHJldHVybiBheE9iamVjdENhY2hlKCktPmdldE9yQ3JlYXRl
KG5leHRTaWJsaW5nKTsKIH0KLQotc3RhdGljIFJlbmRlckJveE1vZGVsT2JqZWN0KiBuZXh0Q29u
dGludWF0aW9uKFJlbmRlck9iamVjdCYgcmVuZGVyZXIpCi17Ci0gICAgaWYgKGlzPFJlbmRlcklu
bGluZT4ocmVuZGVyZXIpICYmICFyZW5kZXJlci5pc1JlcGxhY2VkKCkpCi0gICAgICAgIHJldHVy
biBkb3duY2FzdDxSZW5kZXJJbmxpbmU+KHJlbmRlcmVyKS5jb250aW51YXRpb24oKTsKLSAgICBp
ZiAoaXM8UmVuZGVyQmxvY2s+KHJlbmRlcmVyKSkKLSAgICAgICAgcmV0dXJuIGRvd25jYXN0PFJl
bmRlckJsb2NrPihyZW5kZXJlcikuaW5saW5lRWxlbWVudENvbnRpbnVhdGlvbigpOwotICAgIHJl
dHVybiBudWxscHRyOwotfQogICAgIAogUmVuZGVyT2JqZWN0KiBBY2Nlc3NpYmlsaXR5UmVuZGVy
T2JqZWN0OjpyZW5kZXJQYXJlbnRPYmplY3QoKSBjb25zdAogewpAQCAtNDIwLDQwICsyMzAsNiBA
QCBSZW5kZXJPYmplY3QqIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6CiAgICAgICAgIHJldHVy
biBudWxscHRyOwogCiAgICAgUmVuZGVyRWxlbWVudCogcGFyZW50ID0gbV9yZW5kZXJlci0+cGFy
ZW50KCk7Ci0KLSAgICAvLyBDYXNlIDE6IG5vZGUgaXMgYSBibG9jayBhbmQgaXMgYW4gaW5saW5l
J3MgY29udGludWF0aW9uLiBQYXJlbnQKLSAgICAvLyBpcyB0aGUgc3RhcnQgb2YgdGhlIGNvbnRp
bnVhdGlvbiBjaGFpbi4KLSAgICBSZW5kZXJJbmxpbmUqIHN0YXJ0T2ZDb250cyA9IG51bGxwdHI7
Ci0gICAgUmVuZGVyT2JqZWN0KiBmaXJzdENoaWxkID0gbnVsbHB0cjsKLSAgICBpZiAoaXM8UmVu
ZGVyQmxvY2s+KCptX3JlbmRlcmVyKSAmJiAoc3RhcnRPZkNvbnRzID0gc3RhcnRPZkNvbnRpbnVh
dGlvbnMoKm1fcmVuZGVyZXIpKSkKLSAgICAgICAgcGFyZW50ID0gc3RhcnRPZkNvbnRzOwotCi0g
ICAgLy8gQ2FzZSAyOiBub2RlJ3MgcGFyZW50IGlzIGFuIGlubGluZSB3aGljaCBpcyBzb21lIG5v
ZGUncyBjb250aW51YXRpb247IHBhcmVudCBpcyAKLSAgICAvLyB0aGUgZWFybGllc3Qgbm9kZSBp
biB0aGUgY29udGludWF0aW9uIGNoYWluLgotICAgIGVsc2UgaWYgKGlzPFJlbmRlcklubGluZT4o
cGFyZW50KSAmJiAoc3RhcnRPZkNvbnRzID0gc3RhcnRPZkNvbnRpbnVhdGlvbnMoKnBhcmVudCkp
KQotICAgICAgICBwYXJlbnQgPSBzdGFydE9mQ29udHM7Ci0gICAgCi0gICAgLy8gQ2FzZSAzOiBU
aGUgZmlyc3Qgc2libGluZyBpcyB0aGUgYmVnaW5uaW5nIG9mIGEgY29udGludWF0aW9uIGNoYWlu
LiBGaW5kIHRoZSBvcmlnaW4gb2YgdGhhdCBjb250aW51YXRpb24uCi0gICAgZWxzZSBpZiAocGFy
ZW50ICYmIChmaXJzdENoaWxkID0gcGFyZW50LT5maXJzdENoaWxkKCkpICYmIGZpcnN0Q2hpbGQt
Pm5vZGUoKSkgewotICAgICAgICAvLyBHZXQgdGhlIG5vZGUncyByZW5kZXJlciBhbmQgZm9sbG93
IHRoYXQgY29udGludWF0aW9uIGNoYWluIHVudGlsIHRoZSBmaXJzdCBjaGlsZCBpcyBmb3VuZAot
ICAgICAgICBSZW5kZXJPYmplY3QqIG5vZGVSZW5kZXJGaXJzdENoaWxkID0gZmlyc3RDaGlsZC0+
bm9kZSgpLT5yZW5kZXJlcigpOwotICAgICAgICB3aGlsZSAobm9kZVJlbmRlckZpcnN0Q2hpbGQg
IT0gZmlyc3RDaGlsZCkgewotICAgICAgICAgICAgZm9yIChSZW5kZXJPYmplY3QqIGNvbnRzVGVz
dCA9IG5vZGVSZW5kZXJGaXJzdENoaWxkOyBjb250c1Rlc3Q7IGNvbnRzVGVzdCA9IG5leHRDb250
aW51YXRpb24oKmNvbnRzVGVzdCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoY29udHNUZXN0ID09
IGZpcnN0Q2hpbGQpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gbm9kZVJlbmRlckZp
cnN0Q2hpbGQtPnBhcmVudCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBSZW5kZXJPYmplY3QqIHBhcmVu
dEZpcnN0Q2hpbGQgPSBwYXJlbnQtPmZpcnN0Q2hpbGQoKTsKLSAgICAgICAgICAgIGlmIChmaXJz
dENoaWxkID09IHBhcmVudEZpcnN0Q2hpbGQpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgICAgICBmaXJzdENoaWxkID0gcGFyZW50Rmlyc3RDaGlsZDsKLSAgICAgICAgICAgIGlmICgh
Zmlyc3RDaGlsZC0+bm9kZSgpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAg
bm9kZVJlbmRlckZpcnN0Q2hpbGQgPSBmaXJzdENoaWxkLT5ub2RlKCktPnJlbmRlcmVyKCk7Ci0g
ICAgICAgIH0KLSAgICB9Ci0gICAgICAgIAogICAgIHJldHVybiBwYXJlbnQ7CiB9CiAgICAgCkBA
IC01NTgsMTIgKzMzNCw5IEBAIEVsZW1lbnQqIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmFu
Y2gKICAgICAKICAgICBSZW5kZXJPYmplY3QqIGN1cnJlbnRSZW5kZXJlcjsKICAgICAKLSAgICAv
LyBTZWFyY2ggdXAgdGhlIHJlbmRlciB0cmVlIGZvciBhIFJlbmRlck9iamVjdCB3aXRoIGEgRE9N
IG5vZGUuICBEZWZlciB0byBhbiBlYXJsaWVyIGNvbnRpbnVhdGlvbiwgdGhvdWdoLgotICAgIGZv
ciAoY3VycmVudFJlbmRlcmVyID0gbV9yZW5kZXJlcjsgY3VycmVudFJlbmRlcmVyICYmICFjdXJy
ZW50UmVuZGVyZXItPm5vZGUoKTsgY3VycmVudFJlbmRlcmVyID0gY3VycmVudFJlbmRlcmVyLT5w
YXJlbnQoKSkgewotICAgICAgICBpZiAoY3VycmVudFJlbmRlcmVyLT5pc0Fub255bW91c0Jsb2Nr
KCkpIHsKLSAgICAgICAgICAgIGlmIChSZW5kZXJPYmplY3QqIGNvbnRpbnVhdGlvbiA9IGRvd25j
YXN0PFJlbmRlckJsb2NrPigqY3VycmVudFJlbmRlcmVyKS5jb250aW51YXRpb24oKSkKLSAgICAg
ICAgICAgICAgICByZXR1cm4gY2FjaGUtPmdldE9yQ3JlYXRlKGNvbnRpbnVhdGlvbiktPmFuY2hv
ckVsZW1lbnQoKTsKLSAgICAgICAgfQorICAgIC8vIFNlYXJjaCB1cCB0aGUgcmVuZGVyIHRyZWUg
Zm9yIGEgUmVuZGVyT2JqZWN0IHdpdGggYSBET00gbm9kZS4KKyAgICBmb3IgKGN1cnJlbnRSZW5k
ZXJlciA9IG1fcmVuZGVyZXI7IGN1cnJlbnRSZW5kZXJlciAmJiAhY3VycmVudFJlbmRlcmVyLT5u
b2RlKCk7IGN1cnJlbnRSZW5kZXJlciA9IGN1cnJlbnRSZW5kZXJlci0+cGFyZW50KCkpCisgICAg
ewogICAgIH0KICAgICAKICAgICAvLyBiYWlsIGlmIG5vbmUgZm91bmQKQEAgLTgwOSw5ICs1ODIs
NiBAQCBMYXlvdXRSZWN0IEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmJvCiAgICAgaWYgKCFv
YmopCiAgICAgICAgIHJldHVybiBMYXlvdXRSZWN0KCk7CiAgICAgCi0gICAgaWYgKG9iai0+bm9k
ZSgpKSAvLyBJZiB3ZSBhcmUgYSBjb250aW51YXRpb24sIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHRv
IHVzZSB0aGUgcHJpbWFyeSByZW5kZXJlci4KLSAgICAgICAgb2JqID0gb2JqLT5ub2RlKCktPnJl
bmRlcmVyKCk7Ci0gICAgCiAgICAgLy8gYWJzb2x1dGVGb2N1c1JpbmdRdWFkcyB3aWxsIHF1ZXJ5
IHRoZSBoaWVyYXJjaHkgYmVsb3cgdGhpcyBlbGVtZW50LCB3aGljaCBmb3IgbGFyZ2Ugd2VicGFn
ZXMgY2FuIGJlIHZlcnkgc2xvdy4KICAgICAvLyBGb3IgYSB3ZWIgYXJlYSwgd2hpY2ggd2lsbCBo
YXZlIHRoZSBtb3N0IGVsZW1lbnRzIG9mIGFueSBlbGVtZW50LCBhYnNvbHV0ZVF1YWRzIHNob3Vs
ZCBiZSB1c2VkLgogICAgIC8vIFdlIHNob3VsZCBhbHNvIHVzZSBhYnNvbHV0ZVF1YWRzIGZvciBT
VkcgZWxlbWVudHMsIG90aGVyd2lzZSB0cmFuc2Zvcm1zIHdvbid0IGJlIGFwcGxpZWQuCkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9vYmpjL0RPTVVJS2l0RXh0ZW5zaW9ucy5tbQo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9vYmpjL0RPTVVJS2l0RXh0ZW5zaW9u
cy5tbQkocmV2aXNpb24gMTgxMzI5KQorKysgU291cmNlL1dlYkNvcmUvYmluZGluZ3Mvb2JqYy9E
T01VSUtpdEV4dGVuc2lvbnMubW0JKHdvcmtpbmcgY29weSkKQEAgLTIwOCwxNCArMjA4LDE0IEBA
IC0gKEJPT0wpY29udGFpbnNPbmx5SW5saW5lT2JqZWN0cwogICAgIFJlbmRlck9iamVjdCogcmVu
ZGVyZXIgPSBjb3JlKHNlbGYpLT5yZW5kZXJlcigpOwogICAgIHJldHVybiByZW5kZXJlcgogICAg
ICAgICAmJiByZW5kZXJlci0+Y2hpbGRyZW5JbmxpbmUoKQotICAgICAgICAmJiAoaXM8UmVuZGVy
QmxvY2s+KCpyZW5kZXJlcikgJiYgIWRvd25jYXN0PFJlbmRlckJsb2NrPigqcmVuZGVyZXIpLmlu
bGluZUVsZW1lbnRDb250aW51YXRpb24oKSkKKyAgICAgICAgJiYgKGlzPFJlbmRlckJsb2NrPigq
cmVuZGVyZXIpCiAgICAgICAgICYmICFyZW5kZXJlci0+aXNUYWJsZSgpOwogfQogCiAtIChCT09M
KWlzU2VsZWN0YWJsZUJsb2NrCiB7CiAgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IGNvcmUo
c2VsZiktPnJlbmRlcmVyKCk7Ci0gICAgcmV0dXJuIHJlbmRlcmVyICYmIChpczxSZW5kZXJCbG9j
a0Zsb3c+KCpyZW5kZXJlcikgfHwgKGlzPFJlbmRlckJsb2NrPigqcmVuZGVyZXIpICYmIGRvd25j
YXN0PFJlbmRlckJsb2NrPigqcmVuZGVyZXIpLmlubGluZUVsZW1lbnRDb250aW51YXRpb24oKSAh
PSBuaWwpKTsKKyAgICByZXR1cm4gcmVuZGVyZXIgJiYgKGlzPFJlbmRlckJsb2NrRmxvdz4oKnJl
bmRlcmVyKSk7CiB9CiAKIC0gKERPTVJhbmdlICopcmFuZ2VPZkNvbnRhaW5pbmdQYXJhZ3JhcGgK
QEAgLTM0Miw3ICszNDIsNyBAQCAtIChpbnQpc3RydWN0dXJhbENvbXBsZXhpdHlDb250cmlidXRp
b24KICAgICAgICAgICAgIHJlc3VsdCA9IElOVF9NQVg7CiAgICAgICAgIH0gZWxzZSBpZiAocmVu
ZGVyZXItPmlzRW1wdHkoKSkgewogICAgICAgICAgICAgcmVzdWx0ID0gMDsKLSAgICAgICAgfSBl
bHNlIGlmIChpczxSZW5kZXJCbG9ja0Zsb3c+KCpyZW5kZXJlcikgfHwgKGlzPFJlbmRlckJsb2Nr
PigqcmVuZGVyZXIpICYmIGRvd25jYXN0PFJlbmRlckJsb2NrPigqcmVuZGVyZXIpLmlubGluZUVs
ZW1lbnRDb250aW51YXRpb24oKSkpIHsKKyAgICAgICAgfSBlbHNlIGlmIChpczxSZW5kZXJCbG9j
a0Zsb3c+KCpyZW5kZXJlcikpIHsKICAgICAgICAgICAgIEJPT0wgbm9Db3N0ID0gTk87CiAgICAg
ICAgICAgICBpZiAoaXM8UmVuZGVyQm94PigqcmVuZGVyZXIpKSB7CiAgICAgICAgICAgICAgICAg
UmVuZGVyQm94JiBhc0JveCA9IHJlbmRlcmVyLT5lbmNsb3NpbmdCb3goKTsKSW5kZXg6IFNvdXJj
ZS9XZWJDb3JlL3JlbmRlcmluZy9FbGxpcHNpc0JveC5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYkNvcmUvcmVuZGVyaW5nL0VsbGlwc2lzQm94LmNwcAkocmV2aXNpb24gMTgxMzI5KQorKysg
U291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL0VsbGlwc2lzQm94LmNwcAkod29ya2luZyBjb3B5KQpA
QCAtNDAsNyArNDAsNyBAQCBFbGxpcHNpc0JveDo6RWxsaXBzaXNCb3goUmVuZGVyQmxvY2tGbG93
CiB7CiB9CiAKLXZvaWQgRWxsaXBzaXNCb3g6OnBhaW50KFBhaW50SW5mbyYgcGFpbnRJbmZvLCBj
b25zdCBMYXlvdXRQb2ludCYgcGFpbnRPZmZzZXQsIExheW91dFVuaXQgbGluZVRvcCwgTGF5b3V0
VW5pdCBsaW5lQm90dG9tKQordm9pZCBFbGxpcHNpc0JveDo6cGFpbnRFbGxpcHNpc0JveChQYWlu
dEluZm8mIHBhaW50SW5mbywgY29uc3QgTGF5b3V0UG9pbnQmIHBhaW50T2Zmc2V0LCBMYXlvdXRV
bml0IGxpbmVUb3AsIExheW91dFVuaXQgbGluZUJvdHRvbSkKIHsKICAgICBHcmFwaGljc0NvbnRl
eHQqIGNvbnRleHQgPSBwYWludEluZm8uY29udGV4dDsKICAgICBjb25zdCBSZW5kZXJTdHlsZSYg
bGluZVN0eWxlID0gdGhpcy0+bGluZVN0eWxlKCk7CkBAIC0xMDQsNyArMTA0LDggQEAgdm9pZCBF
bGxpcHNpc0JveDo6cGFpbnRNYXJrdXBCb3goUGFpbnRJbgogICAgIExheW91dFBvaW50IGFkanVz
dGVkUGFpbnRPZmZzZXQgPSBwYWludE9mZnNldDsKICAgICBhZGp1c3RlZFBhaW50T2Zmc2V0Lm1v
dmUoeCgpICsgbV9sb2dpY2FsV2lkdGggLSBtYXJrdXBCb3gtPngoKSwKICAgICAgICAgeSgpICsg
c3R5bGUuZm9udE1ldHJpY3MoKS5hc2NlbnQoKSAtIChtYXJrdXBCb3gtPnkoKSArIG1hcmt1cEJv
eC0+bGluZVN0eWxlKCkuZm9udE1ldHJpY3MoKS5hc2NlbnQoKSkpOwotICAgIG1hcmt1cEJveC0+
cGFpbnQocGFpbnRJbmZvLCBhZGp1c3RlZFBhaW50T2Zmc2V0LCBsaW5lVG9wLCBsaW5lQm90dG9t
KTsKKyAgICBMaW5lQm94UGFpbnRJbmZvIGxpbmVCb3hQYWludEluZm87CisgICAgbWFya3VwQm94
LT5wYWludChwYWludEluZm8sIGFkanVzdGVkUGFpbnRPZmZzZXQsIGxpbmVUb3AsIGxpbmVCb3R0
b20sIGxpbmVCb3hQYWludEluZm8pOwogfQogCiBJbnRSZWN0IEVsbGlwc2lzQm94OjpzZWxlY3Rp
b25SZWN0KCkKQEAgLTE0MCw3ICsxNDEsOCBAQCB2b2lkIEVsbGlwc2lzQm94OjpwYWludFNlbGVj
dGlvbihHcmFwaGljCiAgICAgY29udGV4dC0+ZmlsbFJlY3Qoc25hcFJlY3RUb0RldmljZVBpeGVs
c1dpdGhXcml0aW5nRGlyZWN0aW9uKHNlbGVjdGlvblJlY3QsIHJlbmRlcmVyKCkuZG9jdW1lbnQo
KS5kZXZpY2VTY2FsZUZhY3RvcigpLCBydW4ubHRyKCkpLCBjLCBzdHlsZS5jb2xvclNwYWNlKCkp
OwogfQogCi1ib29sIEVsbGlwc2lzQm94Ojpub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVz
dCYgcmVxdWVzdCwgSGl0VGVzdFJlc3VsdCYgcmVzdWx0LCBjb25zdCBIaXRUZXN0TG9jYXRpb24m
IGxvY2F0aW9uSW5Db250YWluZXIsIGNvbnN0IExheW91dFBvaW50JiBhY2N1bXVsYXRlZE9mZnNl
dCwgTGF5b3V0VW5pdCBsaW5lVG9wLCBMYXlvdXRVbml0IGxpbmVCb3R0b20pCitib29sIEVsbGlw
c2lzQm94Ojpub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYgcmVxdWVzdCwgSGl0VGVz
dFJlc3VsdCYgcmVzdWx0LCBjb25zdCBIaXRUZXN0TG9jYXRpb24mIGxvY2F0aW9uSW5Db250YWlu
ZXIsIGNvbnN0IExheW91dFBvaW50JiBhY2N1bXVsYXRlZE9mZnNldCwgTGF5b3V0VW5pdCBsaW5l
VG9wLCBMYXlvdXRVbml0IGxpbmVCb3R0b20sCisgICAgSGl0VGVzdEFjdGlvbiBoaXRUZXN0QWN0
aW9uLCBMaW5lQm94SGl0VGVzdEluZm8mIGhpdFRlc3RJbmZvKQogewogICAgIExheW91dFBvaW50
IGFkanVzdGVkTG9jYXRpb24gPSBhY2N1bXVsYXRlZE9mZnNldCArIExheW91dFBvaW50KHRvcExl
ZnQoKSk7CiAKQEAgLTE0OSw3ICsxNTEsNyBAQCBib29sIEVsbGlwc2lzQm94Ojpub2RlQXRQb2lu
dChjb25zdCBIaXRUCiAgICAgICAgIGNvbnN0IFJlbmRlclN0eWxlJiBsaW5lU3R5bGUgPSB0aGlz
LT5saW5lU3R5bGUoKTsKICAgICAgICAgTGF5b3V0VW5pdCBtdHggPSBhZGp1c3RlZExvY2F0aW9u
LngoKSArIG1fbG9naWNhbFdpZHRoIC0gbWFya3VwQm94LT54KCk7CiAgICAgICAgIExheW91dFVu
aXQgbXR5ID0gYWRqdXN0ZWRMb2NhdGlvbi55KCkgKyBsaW5lU3R5bGUuZm9udE1ldHJpY3MoKS5h
c2NlbnQoKSAtIChtYXJrdXBCb3gtPnkoKSArIG1hcmt1cEJveC0+bGluZVN0eWxlKCkuZm9udE1l
dHJpY3MoKS5hc2NlbnQoKSk7Ci0gICAgICAgIGlmIChtYXJrdXBCb3gtPm5vZGVBdFBvaW50KHJl
cXVlc3QsIHJlc3VsdCwgbG9jYXRpb25JbkNvbnRhaW5lciwgTGF5b3V0UG9pbnQobXR4LCBtdHkp
LCBsaW5lVG9wLCBsaW5lQm90dG9tKSkgeworICAgICAgICBpZiAobWFya3VwQm94LT5ub2RlQXRQ
b2ludChyZXF1ZXN0LCByZXN1bHQsIGxvY2F0aW9uSW5Db250YWluZXIsIExheW91dFBvaW50KG10
eCwgbXR5KSwgbGluZVRvcCwgbGluZUJvdHRvbSwgaGl0VGVzdEFjdGlvbiwgaGl0VGVzdEluZm8p
KSB7CiAgICAgICAgICAgICBibG9ja0Zsb3coKS51cGRhdGVIaXRUZXN0UmVzdWx0KHJlc3VsdCwg
bG9jYXRpb25JbkNvbnRhaW5lci5wb2ludCgpIC0gTGF5b3V0U2l6ZShtdHgsIG10eSkpOwogICAg
ICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3Jl
bmRlcmluZy9FbGxpcHNpc0JveC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRl
cmluZy9FbGxpcHNpc0JveC5oCShyZXZpc2lvbiAxODEzMjkpCisrKyBTb3VyY2UvV2ViQ29yZS9y
ZW5kZXJpbmcvRWxsaXBzaXNCb3guaAkod29ya2luZyBjb3B5KQpAQCAtMzEsOCArMzEsOCBAQCBj
bGFzcyBIaXRUZXN0UmVzdWx0OwogY2xhc3MgRWxsaXBzaXNCb3ggZmluYWwgOiBwdWJsaWMgSW5s
aW5lRWxlbWVudEJveCB7CiBwdWJsaWM6CiAgICAgRWxsaXBzaXNCb3goUmVuZGVyQmxvY2tGbG93
JiwgY29uc3QgQXRvbWljU3RyaW5nJiBlbGxpcHNpc1N0ciwgSW5saW5lRmxvd0JveCogcGFyZW50
LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCB5LCBib29sIGZpcnN0TGluZSwgYm9vbCBpc1Zl
cnRpY2FsLCBJbmxpbmVCb3gqIG1hcmt1cEJveCk7Ci0gICAgdmlydHVhbCB2b2lkIHBhaW50KFBh
aW50SW5mbyYsIGNvbnN0IExheW91dFBvaW50JiwgTGF5b3V0VW5pdCBsaW5lVG9wLCBMYXlvdXRV
bml0IGxpbmVCb3R0b20pIG92ZXJyaWRlOwotICAgIHZpcnR1YWwgYm9vbCBub2RlQXRQb2ludChj
b25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBjb25zdCBIaXRUZXN0TG9jYXRp
b24mIGxvY2F0aW9uSW5Db250YWluZXIsIGNvbnN0IExheW91dFBvaW50JiBhY2N1bXVsYXRlZE9m
ZnNldCwgTGF5b3V0VW5pdCBsaW5lVG9wLCBMYXlvdXRVbml0IGxpbmVCb3R0b20pIG92ZXJyaWRl
OworICAgIHZvaWQgcGFpbnRFbGxpcHNpc0JveChQYWludEluZm8mLCBjb25zdCBMYXlvdXRQb2lu
dCYsIExheW91dFVuaXQgbGluZVRvcCwgTGF5b3V0VW5pdCBsaW5lQm90dG9tKTsKKyAgICB2aXJ0
dWFsIGJvb2wgbm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVzdWx0
JiwgY29uc3QgSGl0VGVzdExvY2F0aW9uJiBsb2NhdGlvbkluQ29udGFpbmVyLCBjb25zdCBMYXlv
dXRQb2ludCYgYWNjdW11bGF0ZWRPZmZzZXQsIExheW91dFVuaXQgbGluZVRvcCwgTGF5b3V0VW5p
dCBsaW5lQm90dG9tLCBIaXRUZXN0QWN0aW9uLCBMaW5lQm94SGl0VGVzdEluZm8mKSBvdmVycmlk
ZTsKICAgICB2b2lkIHNldFNlbGVjdGlvblN0YXRlKFJlbmRlck9iamVjdDo6U2VsZWN0aW9uU3Rh
dGUgcykgeyBtX3NlbGVjdGlvblN0YXRlID0gczsgfQogICAgIEludFJlY3Qgc2VsZWN0aW9uUmVj
dCgpOwogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lQm94LmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lQm94LmNwcAkocmV2aXNp
b24gMTgxMzI5KQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL0lubGluZUJveC5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTI2LDcgKzI2LDcgQEAKICNpbmNsdWRlICJJbmxpbmVGbG93Qm94Lmgi
CiAjaW5jbHVkZSAiUGFnZS5oIgogI2luY2x1ZGUgIlBhaW50SW5mby5oIgotI2luY2x1ZGUgIlJl
bmRlckJsb2NrRmxvdy5oIgorI2luY2x1ZGUgIlJlbmRlclZpZXcuaCIKICNpbmNsdWRlICJSZW5k
ZXJMaW5lQnJlYWsuaCIKICNpbmNsdWRlICJSb290SW5saW5lQm94LmgiCiAKSW5kZXg6IFNvdXJj
ZS9XZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVCb3guaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9yZW5kZXJpbmcvSW5saW5lQm94LmgJKHJldmlzaW9uIDE4MTMyOSkKKysrIFNvdXJjZS9X
ZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVCb3guaAkod29ya2luZyBjb3B5KQpAQCAtMzIsNiArMzIs
MjYgQEAgY2xhc3MgSGl0VGVzdFJlcXVlc3Q7CiBjbGFzcyBIaXRUZXN0UmVzdWx0OwogY2xhc3Mg
Um9vdElubGluZUJveDsKIAorLy8gRXZlbiB0aG91Z2ggdGhlc2UgdHdvIHN0cnVjdHMgYXJlIGlk
ZW50aWNhbCBmb3Igbm93LCB0aGV5IGNvdWxkIGNoYW5nZSBpbiB0aGUgZnV0dXJlLiBLZWVwIHRo
ZW0KKy8vIGRpc3RpbmN0Lgorc3RydWN0IExpbmVCb3hQYWludEluZm8KK3sKKyAgICBMaW5lQm94
UGFpbnRJbmZvKCkKKyAgICA6YW5vbnltb3VzSW5saW5lQmxvY2soMCkKKyAgICB7IH0KKyAKKyAg
ICBSZW5kZXJCbG9jayogYW5vbnltb3VzSW5saW5lQmxvY2s7Cit9OworCitzdHJ1Y3QgTGluZUJv
eEhpdFRlc3RJbmZvCit7CisgICAgTGluZUJveEhpdFRlc3RJbmZvKCkKKyAgICA6YW5vbnltb3Vz
SW5saW5lQmxvY2soMCkKKyAgICB7IH0KKyAgICAKKyAgICBSZW5kZXJCbG9jayogYW5vbnltb3Vz
SW5saW5lQmxvY2s7Cit9OworIAogLy8gSW5saW5lQm94IHJlcHJlc2VudHMgYSByZWN0YW5nbGUg
dGhhdCBvY2N1cnMgb24gYSBsaW5lLiAgSXQgY29ycmVzcG9uZHMgdG8KIC8vIHNvbWUgUmVuZGVy
T2JqZWN0IChpLmUuLCBpdCByZXByZXNlbnRzIGEgcG9ydGlvbiBvZiB0aGF0IFJlbmRlck9iamVj
dCkuCiBjbGFzcyBJbmxpbmVCb3ggewpAQCAtNzAsOCArOTAsOCBAQCBwdWJsaWM6CiAgICAgICAg
ICAgICBhZGp1c3RQb3NpdGlvbihkZWx0YSwgMCk7CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lk
IHBhaW50KFBhaW50SW5mbyYsIGNvbnN0IExheW91dFBvaW50JiwgTGF5b3V0VW5pdCBsaW5lVG9w
LCBMYXlvdXRVbml0IGxpbmVCb3R0b20pID0gMDsKLSAgICB2aXJ0dWFsIGJvb2wgbm9kZUF0UG9p
bnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVzdWx0JiwgY29uc3QgSGl0VGVzdExv
Y2F0aW9uJiBsb2NhdGlvbkluQ29udGFpbmVyLCBjb25zdCBMYXlvdXRQb2ludCYgYWNjdW11bGF0
ZWRPZmZzZXQsIExheW91dFVuaXQgbGluZVRvcCwgTGF5b3V0VW5pdCBsaW5lQm90dG9tKSA9IDA7
CisgICAgdmlydHVhbCB2b2lkIHBhaW50KFBhaW50SW5mbyYsIGNvbnN0IExheW91dFBvaW50Jiwg
TGF5b3V0VW5pdCBsaW5lVG9wLCBMYXlvdXRVbml0IGxpbmVCb3R0b20sIExpbmVCb3hQYWludElu
Zm8mKSA9IDA7CisgICAgdmlydHVhbCBib29sIG5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1
ZXN0JiwgSGl0VGVzdFJlc3VsdCYsIGNvbnN0IEhpdFRlc3RMb2NhdGlvbiYgbG9jYXRpb25JbkNv
bnRhaW5lciwgY29uc3QgTGF5b3V0UG9pbnQmIGFjY3VtdWxhdGVkT2Zmc2V0LCBMYXlvdXRVbml0
IGxpbmVUb3AsIExheW91dFVuaXQgbGluZUJvdHRvbSwgSGl0VGVzdEFjdGlvbiwgTGluZUJveEhp
dFRlc3RJbmZvJikgPSAwOwogCiAjaWYgRU5BQkxFKFRSRUVfREVCVUdHSU5HKQogICAgIHZvaWQg
c2hvd05vZGVUcmVlRm9yVGhpcygpIGNvbnN0OwpJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVy
aW5nL0lubGluZUVsZW1lbnRCb3guY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3Jl
bmRlcmluZy9JbmxpbmVFbGVtZW50Qm94LmNwcAkocmV2aXNpb24gMTgxMzI5KQorKysgU291cmNl
L1dlYkNvcmUvcmVuZGVyaW5nL0lubGluZUVsZW1lbnRCb3guY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC02Myw5ICs2MywyNyBAQCB2b2lkIElubGluZUVsZW1lbnRCb3g6OmF0dGFjaExpbmUoKQogICAg
ICAgICBkb3duY2FzdDxSZW5kZXJMaW5lQnJlYWs+KHJlbmRlcmVyKCkpLnNldElubGluZUJveFdy
YXBwZXIodGhpcyk7CiB9CiAKLXZvaWQgSW5saW5lRWxlbWVudEJveDo6cGFpbnQoUGFpbnRJbmZv
JiBwYWludEluZm8sIGNvbnN0IExheW91dFBvaW50JiBwYWludE9mZnNldCwgTGF5b3V0VW5pdCAv
KiBsaW5lVG9wICovLCBMYXlvdXRVbml0IC8qbGluZUJvdHRvbSovKQordm9pZCBJbmxpbmVFbGVt
ZW50Qm94OjpwYWludChQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgTGF5b3V0UG9pbnQmIHBh
aW50T2Zmc2V0LCBMYXlvdXRVbml0IC8qIGxpbmVUb3AgKi8sIExheW91dFVuaXQgLypsaW5lQm90
dG9tKi8sIExpbmVCb3hQYWludEluZm8mIGxpbmVCb3hQYWludEluZm8pCiB7Ci0gICAgaWYgKCFw
YWludEluZm8uc2hvdWxkUGFpbnRXaXRoaW5Sb290KHJlbmRlcmVyKCkpIHx8IChwYWludEluZm8u
cGhhc2UgIT0gUGFpbnRQaGFzZUZvcmVncm91bmQgJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50
UGhhc2VTZWxlY3Rpb24pKQorICAgIGlmICghcGFpbnRJbmZvLnNob3VsZFBhaW50V2l0aGluUm9v
dChyZW5kZXJlcigpKSkKKyAgICAgICAgcmV0dXJuOworIAorICAgIFJlbmRlckJsb2NrKiBhbm9u
eW1vdXNJbmxpbmVCbG9jayA9IGxpbmVCb3hQYWludEluZm8uYW5vbnltb3VzSW5saW5lQmxvY2s7
CisgICAgaWYgKGFub255bW91c0lubGluZUJsb2NrID09ICZyZW5kZXJlcigpKSB7CisgICAgICAg
IC8vIFRyZWF0IHBhaW50aW5nIG9mIGEgc3BlY2lhbCBpbmxpbmUtYmxvY2sgbGluZSBsaWtlIHRo
ZSBwYWludGluZyBvZiBhIG5vcm1hbCBibG9jayBhbmQgZ28gdGhyb3VnaCBhbGwgcGhhc2VzLgor
ICAgICAgICBQYWludFBoYXNlIG5ld1BoYXNlID0gKHBhaW50SW5mby5waGFzZSA9PSBQYWludFBo
YXNlQ2hpbGRPdXRsaW5lcykgPyBQYWludFBoYXNlT3V0bGluZSA6IHBhaW50SW5mby5waGFzZTsK
KyAgICAgICAgbmV3UGhhc2UgPSAobmV3UGhhc2UgPT0gUGFpbnRQaGFzZUNoaWxkQmxvY2tCYWNr
Z3JvdW5kcykgPyBQYWludFBoYXNlQ2hpbGRCbG9ja0JhY2tncm91bmQgOiBuZXdQaGFzZTsKKyAK
KyAgICAgICAgLy8gV2UgZG9uJ3QgcGFpbnQgb3VyIG93biBiYWNrZ3JvdW5kLCBidXQgd2UgZG8g
bGV0IHRoZSBjaGlsZCBwYWludCBpdHMgYmFja2dyb3VuZC4KKyAgICAgICAgUGFpbnRJbmZvIGlu
Zm8ocGFpbnRJbmZvKTsKKyAgICAgICAgaW5mby5waGFzZSA9IG5ld1BoYXNlOworICAgICAgICBp
bmZvLnVwZGF0ZVN1YnRyZWVQYWludFJvb3RGb3JDaGlsZHJlbigmcmVuZGVyZXIoKSk7CisgICAg
ICAgIGlmICghYW5vbnltb3VzSW5saW5lQmxvY2stPmhhc1NlbGZQYWludGluZ0xheWVyKCkpCisg
ICAgICAgICAgICBhbm9ueW1vdXNJbmxpbmVCbG9jay0+cGFpbnQoaW5mbywgcGFpbnRPZmZzZXQp
OworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIGlmIChwYWludEluZm8ucGhhc2Ug
IT0gUGFpbnRQaGFzZUZvcmVncm91bmQgJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VT
ZWxlY3Rpb24pCiAgICAgICAgIHJldHVybjsKIAogICAgIExheW91dFBvaW50IGNoaWxkUG9pbnQg
PSBwYWludE9mZnNldDsKQEAgLTkxLDkgKzEwOSwxNyBAQCB2b2lkIElubGluZUVsZW1lbnRCb3g6
OnBhaW50KFBhaW50SW5mbyYgCiAgICAgfQogfQogCi1ib29sIElubGluZUVsZW1lbnRCb3g6Om5v
ZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiByZXF1ZXN0LCBIaXRUZXN0UmVzdWx0JiBy
ZXN1bHQsIGNvbnN0IEhpdFRlc3RMb2NhdGlvbiYgbG9jYXRpb25JbkNvbnRhaW5lciwgY29uc3Qg
TGF5b3V0UG9pbnQmIGFjY3VtdWxhdGVkT2Zmc2V0LCBMYXlvdXRVbml0IC8qIGxpbmVUb3AgKi8s
IExheW91dFVuaXQgLypsaW5lQm90dG9tKi8pCitib29sIElubGluZUVsZW1lbnRCb3g6Om5vZGVB
dFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiByZXF1ZXN0LCBIaXRUZXN0UmVzdWx0JiByZXN1
bHQsIGNvbnN0IEhpdFRlc3RMb2NhdGlvbiYgbG9jYXRpb25JbkNvbnRhaW5lciwgY29uc3QgTGF5
b3V0UG9pbnQmIGFjY3VtdWxhdGVkT2Zmc2V0LCBMYXlvdXRVbml0IC8qIGxpbmVUb3AgKi8sIExh
eW91dFVuaXQgLypsaW5lQm90dG9tKi8sIEhpdFRlc3RBY3Rpb24gaGl0VGVzdEFjdGlvbiwgTGlu
ZUJveEhpdFRlc3RJbmZvJiBoaXRUZXN0SW5mbykKIHsKLSAgICAvLyBIaXQgdGVzdCBhbGwgcGhh
c2VzIG9mIHJlcGxhY2VkIGVsZW1lbnRzIGF0b21pY2FsbHksIGFzIHRob3VnaCB0aGUgcmVwbGFj
ZWQgZWxlbWVudCBlc3RhYmxpc2hlZCBpdHMKKyAgICAvLyBJZiB3ZSBhcmUgYW4gYW5vbnltb3Vz
IGlubGluZSBibG9jaywgaG9ub3IgaGl0IHRlc3QgcGhhc2VzLgorICAgIGlmIChoaXRUZXN0SW5m
by5hbm9ueW1vdXNJbmxpbmVCbG9jayA9PSAmcmVuZGVyZXIoKSkgeworICAgICAgICBIaXRUZXN0
QWN0aW9uIGNoaWxkSGl0VGVzdCA9IGhpdFRlc3RBY3Rpb247CisgICAgICAgIGlmIChoaXRUZXN0
QWN0aW9uID09IEhpdFRlc3RDaGlsZEJsb2NrQmFja2dyb3VuZHMpCisgICAgICAgICAgICBjaGls
ZEhpdFRlc3QgPSBIaXRUZXN0Q2hpbGRCbG9ja0JhY2tncm91bmQ7CisgICAgICAgIHJldHVybiBo
aXRUZXN0SW5mby5hbm9ueW1vdXNJbmxpbmVCbG9jay0+bm9kZUF0UG9pbnQocmVxdWVzdCwgcmVz
dWx0LCBsb2NhdGlvbkluQ29udGFpbmVyLCBhY2N1bXVsYXRlZE9mZnNldCwgY2hpbGRIaXRUZXN0
KTsKKyAgICB9CisgCisgICAgLy8gT3RoZXJ3aXNlIGhpdCB0ZXN0IGFsbCBwaGFzZXMgb2YgcmVw
bGFjZWQgZWxlbWVudHMgYXRvbWljYWxseSwgYXMgdGhvdWdoIHRoZSByZXBsYWNlZCBlbGVtZW50
IGVzdGFibGlzaGVkIGl0cwogICAgIC8vIG93biBzdGFja2luZyBjb250ZXh0LiAgKFNlZSBBcHBl
bmRpeCBFLjIsIHNlY3Rpb24gNi40IG9uIGlubGluZSBibG9jay90YWJsZSBlbGVtZW50cyBpbiB0
aGUgQ1NTMi4xCiAgICAgLy8gc3BlY2lmaWNhdGlvbi4pCiAgICAgTGF5b3V0UG9pbnQgY2hpbGRQ
b2ludCA9IGFjY3VtdWxhdGVkT2Zmc2V0OwpJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5n
L0lubGluZUVsZW1lbnRCb3guaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJp
bmcvSW5saW5lRWxlbWVudEJveC5oCShyZXZpc2lvbiAxODEzMjkpCisrKyBTb3VyY2UvV2ViQ29y
ZS9yZW5kZXJpbmcvSW5saW5lRWxlbWVudEJveC5oCSh3b3JraW5nIGNvcHkpCkBAIC00OCw4ICs0
OCw4IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIHZvaWQgZXh0cmFjdExpbmUoKSBvdmVycmlkZSBm
aW5hbDsKICAgICB2aXJ0dWFsIHZvaWQgYXR0YWNoTGluZSgpIG92ZXJyaWRlIGZpbmFsOwogCi0g
ICAgdmlydHVhbCB2b2lkIHBhaW50KFBhaW50SW5mbyYsIGNvbnN0IExheW91dFBvaW50JiwgTGF5
b3V0VW5pdCBsaW5lVG9wLCBMYXlvdXRVbml0IGxpbmVCb3R0b20pIG92ZXJyaWRlOwotICAgIHZp
cnR1YWwgYm9vbCBub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1
bHQmLCBjb25zdCBIaXRUZXN0TG9jYXRpb24mIGxvY2F0aW9uSW5Db250YWluZXIsIGNvbnN0IExh
eW91dFBvaW50JiBhY2N1bXVsYXRlZE9mZnNldCwgTGF5b3V0VW5pdCBsaW5lVG9wLCBMYXlvdXRV
bml0IGxpbmVCb3R0b20pIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBwYWludChQYWludElu
Zm8mLCBjb25zdCBMYXlvdXRQb2ludCYsIExheW91dFVuaXQgbGluZVRvcCwgTGF5b3V0VW5pdCBs
aW5lQm90dG9tLCBMaW5lQm94UGFpbnRJbmZvJikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBib29s
IG5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiwgSGl0VGVzdFJlc3VsdCYsIGNvbnN0
IEhpdFRlc3RMb2NhdGlvbiYgbG9jYXRpb25JbkNvbnRhaW5lciwgY29uc3QgTGF5b3V0UG9pbnQm
IGFjY3VtdWxhdGVkT2Zmc2V0LCBMYXlvdXRVbml0IGxpbmVUb3AsIExheW91dFVuaXQgbGluZUJv
dHRvbSwgSGl0VGVzdEFjdGlvbiwgTGluZUJveEhpdFRlc3RJbmZvJikgb3ZlcnJpZGU7CiAKIHBy
aXZhdGU6CiAgICAgdmlydHVhbCBib29sIGlzSW5saW5lRWxlbWVudEJveCgpIGNvbnN0IG92ZXJy
aWRlIGZpbmFsIHsgcmV0dXJuIHRydWU7IH0KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmlu
Zy9JbmxpbmVGbG93Qm94LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJp
bmcvSW5saW5lRmxvd0JveC5jcHAJKHJldmlzaW9uIDE4MTMyOSkKKysrIFNvdXJjZS9XZWJDb3Jl
L3JlbmRlcmluZy9JbmxpbmVGbG93Qm94LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzE1LDcgKzMx
NSw3IEBAIHZvaWQgSW5saW5lRmxvd0JveDo6ZGV0ZXJtaW5lU3BhY2luZ0ZvckYKICAgICAgICAg
Ly8gQ2hlY2sgdG8gc2VlIGlmIGFsbCBpbml0aWFsIGxpbmVzIGFyZSB1bmNvbnN0cnVjdGVkLiAg
SWYgc28sIHRoZW4KICAgICAgICAgLy8gd2Uga25vdyB0aGUgaW5saW5lIGJlZ2FuIG9uIHRoaXMg
bGluZSAodW5sZXNzIHdlIGFyZSBhIGNvbnRpbnVhdGlvbikuCiAgICAgICAgIGNvbnN0IGF1dG8m
IGxpbmVCb3hMaXN0ID0gaW5saW5lRmxvdy5saW5lQm94ZXMoKTsKLSAgICAgICAgaWYgKCFsaW5l
Qm94TGlzdC5maXJzdExpbmVCb3goKS0+aXNDb25zdHJ1Y3RlZCgpICYmICFyZW5kZXJlcigpLmlz
SW5saW5lRWxlbWVudENvbnRpbnVhdGlvbigpKSB7CisgICAgICAgIGlmICghbGluZUJveExpc3Qu
Zmlyc3RMaW5lQm94KCktPmlzQ29uc3RydWN0ZWQoKSkgewogI2lmIEVOQUJMRShDU1NfQk9YX0RF
Q09SQVRJT05fQlJFQUspCiAgICAgICAgICAgICBpZiAocmVuZGVyZXIoKS5zdHlsZSgpLmJveERl
Y29yYXRpb25CcmVhaygpID09IERDTE9ORSkKICAgICAgICAgICAgICAgICBpbmNsdWRlTGVmdEVk
Z2UgPSBpbmNsdWRlUmlnaHRFZGdlID0gdHJ1ZTsKQEAgLTM0MiwxMSArMzQyLDExIEBAIHZvaWQg
SW5saW5lRmxvd0JveDo6ZGV0ZXJtaW5lU3BhY2luZ0ZvckYKICNlbmRpZgogICAgICAgICAgICAg
aWYgKGx0cikgewogICAgICAgICAgICAgICAgIGlmICghbmV4dExpbmVCb3goKQotICAgICAgICAg
ICAgICAgICAgICAmJiAoKGxhc3RMaW5lIHx8IGlzTGFzdE9iamVjdE9uTGluZSkgJiYgIWlubGlu
ZUZsb3cuY29udGludWF0aW9uKCkpKQorICAgICAgICAgICAgICAgICAgICAmJiAoKGxhc3RMaW5l
IHx8IGlzTGFzdE9iamVjdE9uTGluZSkpKQogICAgICAgICAgICAgICAgICAgICBpbmNsdWRlUmln
aHRFZGdlID0gdHJ1ZTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYg
KCghcHJldkxpbmVCb3goKSB8fCBwcmV2TGluZUJveCgpLT5pc0NvbnN0cnVjdGVkKCkpCi0gICAg
ICAgICAgICAgICAgICAgICYmICgobGFzdExpbmUgfHwgaXNMYXN0T2JqZWN0T25MaW5lKSAmJiAh
aW5saW5lRmxvdy5jb250aW51YXRpb24oKSkpCisgICAgICAgICAgICAgICAgICAgICYmICgobGFz
dExpbmUgfHwgaXNMYXN0T2JqZWN0T25MaW5lKSkpCiAgICAgICAgICAgICAgICAgICAgIGluY2x1
ZGVMZWZ0RWRnZSA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTY3Niw2ICs2
NzYsMTAgQEAgdm9pZCBJbmxpbmVGbG93Qm94OjpwbGFjZUJveGVzSW5CbG9ja0RpcgogICAgICAg
ICAgICAgbmV3TG9naWNhbFRvcEluY2x1ZGluZ01hcmdpbnMgPSBuZXdMb2dpY2FsVG9wOwogICAg
ICAgICAgICAgTGF5b3V0VW5pdCBvdmVyU2lkZU1hcmdpbiA9IGNoaWxkLT5pc0hvcml6b250YWwo
KSA/IGJveC5tYXJnaW5Ub3AoKSA6IGJveC5tYXJnaW5SaWdodCgpOwogICAgICAgICAgICAgTGF5
b3V0VW5pdCB1bmRlclNpZGVNYXJnaW4gPSBjaGlsZC0+aXNIb3Jpem9udGFsKCkgPyBib3gubWFy
Z2luQm90dG9tKCkgOiBib3gubWFyZ2luTGVmdCgpOworICAgICAgICAgICAgaWYgKGNoaWxkLT5y
ZW5kZXJlcigpLmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkgeworICAgICAgICAgICAgICAgIG92
ZXJTaWRlTWFyZ2luID0gMDsKKyAgICAgICAgICAgICAgICB1bmRlclNpZGVNYXJnaW4gPSAwOwor
ICAgICAgICAgICAgfQogICAgICAgICAgICAgbmV3TG9naWNhbFRvcCArPSBvdmVyU2lkZU1hcmdp
bjsKICAgICAgICAgICAgIGJveEhlaWdodEluY2x1ZGluZ01hcmdpbnMgKz0gb3ZlclNpZGVNYXJn
aW4gKyB1bmRlclNpZGVNYXJnaW47CiAgICAgICAgIH0KQEAgLTEwMzIsNyArMTAzNiw4IEBAIHZv
aWQgSW5saW5lRmxvd0JveDo6c2V0T3ZlcmZsb3dGcm9tTG9naWMKICAgICBzZXRWaXN1YWxPdmVy
Zmxvdyh2aXN1YWxPdmVyZmxvdywgbGluZVRvcCwgbGluZUJvdHRvbSk7CiB9CiAKLWJvb2wgSW5s
aW5lRmxvd0JveDo6bm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmIHJlcXVlc3QsIEhp
dFRlc3RSZXN1bHQmIHJlc3VsdCwgY29uc3QgSGl0VGVzdExvY2F0aW9uJiBsb2NhdGlvbkluQ29u
dGFpbmVyLCBjb25zdCBMYXlvdXRQb2ludCYgYWNjdW11bGF0ZWRPZmZzZXQsIExheW91dFVuaXQg
bGluZVRvcCwgTGF5b3V0VW5pdCBsaW5lQm90dG9tKQorYm9vbCBJbmxpbmVGbG93Qm94Ojpub2Rl
QXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYgcmVxdWVzdCwgSGl0VGVzdFJlc3VsdCYgcmVz
dWx0LCBjb25zdCBIaXRUZXN0TG9jYXRpb24mIGxvY2F0aW9uSW5Db250YWluZXIsIGNvbnN0IExh
eW91dFBvaW50JiBhY2N1bXVsYXRlZE9mZnNldCwgTGF5b3V0VW5pdCBsaW5lVG9wLCBMYXlvdXRV
bml0IGxpbmVCb3R0b20sCisgICAgSGl0VGVzdEFjdGlvbiBoaXRUZXN0QWN0aW9uLCBMaW5lQm94
SGl0VGVzdEluZm8mIGhpdFRlc3RJbmZvKQogewogICAgIExheW91dFJlY3Qgb3ZlcmZsb3dSZWN0
KHZpc3VhbE92ZXJmbG93UmVjdChsaW5lVG9wLCBsaW5lQm90dG9tKSk7CiAgICAgZmxpcEZvcldy
aXRpbmdNb2RlKG92ZXJmbG93UmVjdCk7CkBAIC0xMDY0LDcgKzEwNjksNyBAQCBib29sIElubGlu
ZUZsb3dCb3g6Om5vZGVBdFBvaW50KGNvbnN0IEhpCiAgICAgICAgICAgICAgICAgfQogICAgICAg
ICAgICAgICAgIGN1bGxlZFBhcmVudCA9IG5ld1BhcmVudDsKICAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIGlmIChjaGlsZC0+bm9kZUF0UG9pbnQocmVxdWVzdCwgcmVzdWx0LCBsb2NhdGlvbklu
Q29udGFpbmVyLCBhY2N1bXVsYXRlZE9mZnNldCwgbGluZVRvcCwgbGluZUJvdHRvbSkpIHsKKyAg
ICAgICAgICAgIGlmIChjaGlsZC0+bm9kZUF0UG9pbnQocmVxdWVzdCwgcmVzdWx0LCBsb2NhdGlv
bkluQ29udGFpbmVyLCBhY2N1bXVsYXRlZE9mZnNldCwgbGluZVRvcCwgbGluZUJvdHRvbSwgaGl0
VGVzdEFjdGlvbiwgaGl0VGVzdEluZm8pKSB7CiAgICAgICAgICAgICAgICAgcmVuZGVyZXIoKS51
cGRhdGVIaXRUZXN0UmVzdWx0KHJlc3VsdCwgbG9jYXRpb25JbkNvbnRhaW5lci5wb2ludCgpIC0g
dG9MYXlvdXRTaXplKGFjY3VtdWxhdGVkT2Zmc2V0KSk7CiAgICAgICAgICAgICAgICAgcmV0dXJu
IHRydWU7CiAgICAgICAgICAgICB9CkBAIC0xMTIzLDggKzExMjgsMTIgQEAgYm9vbCBJbmxpbmVG
bG93Qm94Ojpub2RlQXRQb2ludChjb25zdCBIaQogICAgIHJldHVybiBmYWxzZTsKIH0KIAotdm9p
ZCBJbmxpbmVGbG93Qm94OjpwYWludChQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgTGF5b3V0
UG9pbnQmIHBhaW50T2Zmc2V0LCBMYXlvdXRVbml0IGxpbmVUb3AsIExheW91dFVuaXQgbGluZUJv
dHRvbSkKK3ZvaWQgSW5saW5lRmxvd0JveDo6cGFpbnQoUGFpbnRJbmZvJiBwYWludEluZm8sIGNv
bnN0IExheW91dFBvaW50JiBwYWludE9mZnNldCwgTGF5b3V0VW5pdCBsaW5lVG9wLCBMYXlvdXRV
bml0IGxpbmVCb3R0b20sIExpbmVCb3hQYWludEluZm8mIGxpbmVCb3hQYWludEluZm8pCiB7Cisg
ICAgLy8gQXMgbG9uZyBhcyB3ZSBkb24ndCBoYXZlIGFuIGFub255bW91cyBpbmxpbmUgYmxvY2sg
b24gb3VyIGxpbmUsIHdlIHJlc3RyaWN0IG91ciBwYWludGluZyBvbmx5IHRvIGEgZmV3IHBoYXNl
cy4KKyAgICBpZiAoIWxpbmVCb3hQYWludEluZm8uYW5vbnltb3VzSW5saW5lQmxvY2sgJiYgKHBh
aW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlRm9yZWdyb3VuZCAmJiBwYWludEluZm8ucGhhc2Ug
IT0gUGFpbnRQaGFzZVNlbGVjdGlvbiAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZU91
dGxpbmUgJiYgcGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VTZWxmT3V0bGluZSAmJiBwYWlu
dEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZUNoaWxkT3V0bGluZXMgJiYgcGFpbnRJbmZvLnBoYXNl
ICE9IFBhaW50UGhhc2VUZXh0Q2xpcCAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZU1h
c2spKQorICAgICAgICByZXR1cm47CisgCiAgICAgTGF5b3V0UmVjdCBvdmVyZmxvd1JlY3Qodmlz
dWFsT3ZlcmZsb3dSZWN0KGxpbmVUb3AsIGxpbmVCb3R0b20pKTsKICAgICBvdmVyZmxvd1JlY3Qu
aW5mbGF0ZShyZW5kZXJlcigpLm1heGltYWxPdXRsaW5lU2l6ZShwYWludEluZm8ucGhhc2UpKTsK
ICAgICBmbGlwRm9yV3JpdGluZ01vZGUob3ZlcmZsb3dSZWN0KTsKQEAgLTExMzksNDAgKzExNDgs
MTYgQEAgdm9pZCBJbmxpbmVGbG93Qm94OjpwYWludChQYWludEluZm8mIHBhaQogICAgICAgICAg
ICAgLy8gb3V0bGluZXMuCiAgICAgICAgICAgICBpZiAocmVuZGVyZXIoKS5zdHlsZSgpLnZpc2li
aWxpdHkoKSA9PSBWSVNJQkxFICYmIHJlbmRlcmVyKCkuaGFzT3V0bGluZSgpICYmICFpc1Jvb3RJ
bmxpbmVCb3goKSkgewogICAgICAgICAgICAgICAgIFJlbmRlcklubGluZSYgaW5saW5lRmxvdyA9
IGRvd25jYXN0PFJlbmRlcklubGluZT4ocmVuZGVyZXIoKSk7Ci0KLSAgICAgICAgICAgICAgICBS
ZW5kZXJCbG9jayogY29udGFpbmluZ0Jsb2NrID0gbnVsbHB0cjsKLSAgICAgICAgICAgICAgICBi
b29sIGNvbnRhaW5pbmdCbG9ja1BhaW50c0NvbnRpbnVhdGlvbk91dGxpbmUgPSBpbmxpbmVGbG93
LmNvbnRpbnVhdGlvbigpIHx8IGlubGluZUZsb3cuaXNJbmxpbmVFbGVtZW50Q29udGludWF0aW9u
KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5pbmdCbG9ja1BhaW50c0NvbnRpbnVhdGlv
bk91dGxpbmUpIHsgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogU2Vl
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD01NDY5MC4gV2UgY3VycmVu
dGx5IGRvbid0IHJlY29ubmVjdCBpbmxpbmUgY29udGludWF0aW9ucwotICAgICAgICAgICAgICAg
ICAgICAvLyBhZnRlciBhIGNoaWxkIHJlbW92YWwuIEFzIGEgcmVzdWx0LCB0aG9zZSBtZXJnZWQg
aW5saW5lcyBkbyBub3QgZ2V0IHNlcGVyYXRlZCBhbmQgaGVuY2Ugbm90IGdldCBlbmNsb3NlZCBi
eQotICAgICAgICAgICAgICAgICAgICAvLyBhbm9ueW1vdXMgYmxvY2tzLiBJbiB0aGlzIGNhc2Us
IGl0IGlzIGJldHRlciB0byBiYWlsIG91dCBhbmQgcGFpbnQgaXQgb3Vyc2VsZi4KLSAgICAgICAg
ICAgICAgICAgICAgUmVuZGVyQmxvY2sqIGVuY2xvc2luZ0Fub255bW91c0Jsb2NrID0gcmVuZGVy
ZXIoKS5jb250YWluaW5nQmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFlbmNsb3Np
bmdBbm9ueW1vdXNCbG9jay0+aXNBbm9ueW1vdXNCbG9jaygpKQotICAgICAgICAgICAgICAgICAg
ICAgICAgY29udGFpbmluZ0Jsb2NrUGFpbnRzQ29udGludWF0aW9uT3V0bGluZSA9IGZhbHNlOwot
ICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRh
aW5pbmdCbG9jayA9IGVuY2xvc2luZ0Fub255bW91c0Jsb2NrLT5jb250YWluaW5nQmxvY2soKTsK
LSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYXV0byBib3ggPSAmcmVuZGVyZXIoKTsgYm94
ICE9IGNvbnRhaW5pbmdCbG9jazsgYm94ID0gJmJveC0+cGFyZW50KCktPmVuY2xvc2luZ0JveE1v
ZGVsT2JqZWN0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYm94LT5oYXNT
ZWxmUGFpbnRpbmdMYXllcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNv
bnRhaW5pbmdCbG9ja1BhaW50c0NvbnRpbnVhdGlvbk91dGxpbmUgPSBmYWxzZTsKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5pbmdCbG9ja1Bh
aW50c0NvbnRpbnVhdGlvbk91dGxpbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQWRkIG91
cnNlbHZlcyB0byB0aGUgY29udGFpbmluZyBibG9jayBvZiB0aGUgZW50aXJlIGNvbnRpbnVhdGlv
biBzbyB0aGF0IGl0IGNhbgotICAgICAgICAgICAgICAgICAgICAvLyBwYWludCB1cyBhdG9taWNh
bGx5LgotICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nQmxvY2stPmFkZENvbnRpbnVhdGlv
bldpdGhPdXRsaW5lKGRvd25jYXN0PFJlbmRlcklubGluZT4ocmVuZGVyZXIoKS5lbGVtZW50KCkt
PnJlbmRlcmVyKCkpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpbmxpbmVGbG93Lmlz
SW5saW5lRWxlbWVudENvbnRpbnVhdGlvbigpKQotICAgICAgICAgICAgICAgICAgICBwYWludElu
Zm8ub3V0bGluZU9iamVjdHMtPmFkZCgmaW5saW5lRmxvdyk7CisgICAgICAgICAgICAgICAgcGFp
bnRJbmZvLm91dGxpbmVPYmplY3RzLT5hZGQoJmlubGluZUZsb3cpOwogICAgICAgICAgICAgfQog
ICAgICAgICB9IGVsc2UgaWYgKHBhaW50SW5mby5waGFzZSA9PSBQYWludFBoYXNlTWFzaykgewot
ICAgICAgICAgICAgcGFpbnRNYXNrKHBhaW50SW5mbywgcGFpbnRPZmZzZXQpOworICAgICAgICAg
ICAgaWYgKCFsaW5lQm94UGFpbnRJbmZvLmFub255bW91c0lubGluZUJsb2NrKQorICAgICAgICAg
ICAgICAgIHBhaW50TWFzayhwYWludEluZm8sIHBhaW50T2Zmc2V0KTsKICAgICAgICAgICAgIHJl
dHVybjsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIFBhaW50IG91ciBiYWNrZ3Jv
dW5kLCBib3JkZXIgYW5kIGJveC1zaGFkb3cuCi0gICAgICAgICAgICBwYWludEJveERlY29yYXRp
b25zKHBhaW50SW5mbywgcGFpbnRPZmZzZXQpOworICAgICAgICAgICAgaWYgKCFsaW5lQm94UGFp
bnRJbmZvLmFub255bW91c0lubGluZUJsb2NrKQorICAgICAgICAgICAgICAgIHBhaW50Qm94RGVj
b3JhdGlvbnMocGFpbnRJbmZvLCBwYWludE9mZnNldCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAg
LTExODgsNyArMTE3Myw3IEBAIHZvaWQgSW5saW5lRmxvd0JveDo6cGFpbnQoUGFpbnRJbmZvJiBw
YWkKICAgICBpZiAocGFpbnRQaGFzZSAhPSBQYWludFBoYXNlU2VsZk91dGxpbmUpIHsKICAgICAg
ICAgZm9yIChJbmxpbmVCb3gqIGN1cnIgPSBmaXJzdENoaWxkKCk7IGN1cnI7IGN1cnIgPSBjdXJy
LT5uZXh0T25MaW5lKCkpIHsKICAgICAgICAgICAgIGlmIChjdXJyLT5yZW5kZXJlcigpLmlzVGV4
dCgpIHx8ICFjdXJyLT5ib3hNb2RlbE9iamVjdCgpLT5oYXNTZWxmUGFpbnRpbmdMYXllcigpKQot
ICAgICAgICAgICAgICAgIGN1cnItPnBhaW50KGNoaWxkSW5mbywgcGFpbnRPZmZzZXQsIGxpbmVU
b3AsIGxpbmVCb3R0b20pOworICAgICAgICAgICAgICAgIGN1cnItPnBhaW50KGNoaWxkSW5mbywg
cGFpbnRPZmZzZXQsIGxpbmVUb3AsIGxpbmVCb3R0b20sIGxpbmVCb3hQYWludEluZm8pOwogICAg
ICAgICB9CiAgICAgfQogfQpJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL0lubGluZUZs
b3dCb3guaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lRmxv
d0JveC5oCShyZXZpc2lvbiAxODEzMjkpCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvSW5s
aW5lRmxvd0JveC5oCSh3b3JraW5nIGNvcHkpCkBAIC00OCw2ICs0OCw3IEBAIHB1YmxpYzoKICAg
ICAgICAgLCBtX25leHRMaW5lQm94KDApCiAgICAgICAgICwgbV9pbmNsdWRlTG9naWNhbExlZnRF
ZGdlKGZhbHNlKQogICAgICAgICAsIG1faW5jbHVkZUxvZ2ljYWxSaWdodEVkZ2UoZmFsc2UpCisg
ICAgICAgICwgbV9oYXNBbm9ueW1vdXNJbmxpbmVCbG9jayhmYWxzZSkKICAgICAgICAgLCBtX2Rl
c2NlbmRhbnRzSGF2ZVNhbWVMaW5lSGVpZ2h0QW5kQmFzZWxpbmUodHJ1ZSkKICAgICAgICAgLCBt
X2Jhc2VsaW5lVHlwZShBbHBoYWJldGljQmFzZWxpbmUpCiAgICAgICAgICwgbV9oYXNBbm5vdGF0
aW9uc0JlZm9yZShmYWxzZSkKQEAgLTExOCw4ICsxMTksOCBAQCBwdWJsaWM6CiAgICAgdm9pZCBw
YWludEZpbGxMYXllcnMoY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgQ29sb3ImLCBjb25zdCBGaWxs
TGF5ZXIqLCBjb25zdCBMYXlvdXRSZWN0JiwgQ29tcG9zaXRlT3BlcmF0b3IgPSBDb21wb3NpdGVT
b3VyY2VPdmVyKTsKICAgICB2b2lkIHBhaW50RmlsbExheWVyKGNvbnN0IFBhaW50SW5mbyYsIGNv
bnN0IENvbG9yJiwgY29uc3QgRmlsbExheWVyKiwgY29uc3QgTGF5b3V0UmVjdCYsIENvbXBvc2l0
ZU9wZXJhdG9yID0gQ29tcG9zaXRlU291cmNlT3Zlcik7CiAgICAgdm9pZCBwYWludEJveFNoYWRv
dyhjb25zdCBQYWludEluZm8mLCBjb25zdCBSZW5kZXJTdHlsZSYsIFNoYWRvd1N0eWxlLCBjb25z
dCBMYXlvdXRSZWN0Jik7Ci0gICAgdmlydHVhbCB2b2lkIHBhaW50KFBhaW50SW5mbyYsIGNvbnN0
IExheW91dFBvaW50JiwgTGF5b3V0VW5pdCBsaW5lVG9wLCBMYXlvdXRVbml0IGxpbmVCb3R0b20p
IG92ZXJyaWRlOwotICAgIHZpcnR1YWwgYm9vbCBub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVx
dWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBjb25zdCBIaXRUZXN0TG9jYXRpb24mIGxvY2F0aW9uSW5D
b250YWluZXIsIGNvbnN0IExheW91dFBvaW50JiBhY2N1bXVsYXRlZE9mZnNldCwgTGF5b3V0VW5p
dCBsaW5lVG9wLCBMYXlvdXRVbml0IGxpbmVCb3R0b20pIG92ZXJyaWRlOworICAgIHZpcnR1YWwg
dm9pZCBwYWludChQYWludEluZm8mLCBjb25zdCBMYXlvdXRQb2ludCYsIExheW91dFVuaXQgbGlu
ZVRvcCwgTGF5b3V0VW5pdCBsaW5lQm90dG9tLCBMaW5lQm94UGFpbnRJbmZvJikgb3ZlcnJpZGU7
CisgICAgdmlydHVhbCBib29sIG5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiwgSGl0
VGVzdFJlc3VsdCYsIGNvbnN0IEhpdFRlc3RMb2NhdGlvbiYgbG9jYXRpb25JbkNvbnRhaW5lciwg
Y29uc3QgTGF5b3V0UG9pbnQmIGFjY3VtdWxhdGVkT2Zmc2V0LCBMYXlvdXRVbml0IGxpbmVUb3As
IExheW91dFVuaXQgbGluZUJvdHRvbSwgSGl0VGVzdEFjdGlvbiwgTGluZUJveEhpdFRlc3RJbmZv
Jikgb3ZlcnJpZGU7CiAKICAgICBib29sIGJveFNoYWRvd0NhbkJlQXBwbGllZFRvQmFja2dyb3Vu
ZChjb25zdCBGaWxsTGF5ZXImKSBjb25zdDsKIApAQCAtMjcwLDYgKzI3MSw5IEBAIHB1YmxpYzoK
ICAgICB2b2lkIHNldE92ZXJmbG93RnJvbUxvZ2ljYWxSZWN0cyhjb25zdCBMYXlvdXRSZWN0JiBs
b2dpY2FsTGF5b3V0T3ZlcmZsb3csIGNvbnN0IExheW91dFJlY3QmIGxvZ2ljYWxWaXN1YWxPdmVy
ZmxvdywgTGF5b3V0VW5pdCBsaW5lVG9wLCBMYXlvdXRVbml0IGxpbmVCb3R0b20pOwogICAgIHZv
aWQgc2V0TGF5b3V0T3ZlcmZsb3coY29uc3QgTGF5b3V0UmVjdCYsIExheW91dFVuaXQgbGluZVRv
cCwgTGF5b3V0VW5pdCBsaW5lQm90dG9tKTsKICAgICB2b2lkIHNldFZpc3VhbE92ZXJmbG93KGNv
bnN0IExheW91dFJlY3QmLCBMYXlvdXRVbml0IGxpbmVUb3AsIExheW91dFVuaXQgbGluZUJvdHRv
bSk7CisgICAgCisgICAgYm9vbCBoYXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpIGNvbnN0IHsgcmV0
dXJuIG1faGFzQW5vbnltb3VzSW5saW5lQmxvY2s7IH0KKyAgICB2b2lkIHNldEhhc0Fub255bW91
c0lubGluZUJsb2NrKCkgeyBtX2hhc0Fub255bW91c0lubGluZUJsb2NrID0gdHJ1ZTsgfQogCiAg
ICAgRmxvYXRSZWN0IGZyYW1lUmVjdEluY2x1ZGluZ0xpbmVIZWlnaHQoTGF5b3V0VW5pdCBsaW5l
VG9wLCBMYXlvdXRVbml0IGxpbmVCb3R0b20pIGNvbnN0CiAgICAgewpAQCAtMzE5LDYgKzMyMyw3
IEBAIHByb3RlY3RlZDoKIHByaXZhdGU6CiAgICAgdW5zaWduZWQgbV9pbmNsdWRlTG9naWNhbExl
ZnRFZGdlIDogMTsKICAgICB1bnNpZ25lZCBtX2luY2x1ZGVMb2dpY2FsUmlnaHRFZGdlIDogMTsK
KyAgICB1bnNpZ25lZCBtX2hhc0Fub255bW91c0lubGluZUJsb2NrOiAxOwogICAgIHVuc2lnbmVk
IG1faGFzVGV4dENoaWxkcmVuIDogMTsKICAgICB1bnNpZ25lZCBtX2hhc1RleHREZXNjZW5kYW50
cyA6IDE7CiAgICAgdW5zaWduZWQgbV9kZXNjZW5kYW50c0hhdmVTYW1lTGluZUhlaWdodEFuZEJh
c2VsaW5lIDogMTsKQEAgLTM0Nyw2ICszNTIsMjQgQEAgcHJpdmF0ZToKICNlbmRpZgogfTsKIAor
Ly8gRm9yIGFub255bW91cyBpbmxpbmUgYmxvY2sgb2JqZWN0cy4KK2NsYXNzIElubGluZUZsb3dB
bm9ueW1vdXNJbmxpbmVCbG9ja0JveCA6IHB1YmxpYyBJbmxpbmVGbG93Qm94Cit7CitwdWJsaWM6
CisgICAgSW5saW5lRmxvd0Fub255bW91c0lubGluZUJsb2NrQm94KFJlbmRlckJveE1vZGVsT2Jq
ZWN0JiByZW5kZXJlcikKKyAgICA6IElubGluZUZsb3dCb3gocmVuZGVyZXIpCisgICAgeworICAg
ICAgICBzZXRIYXNWaXJ0dWFsTG9naWNhbEhlaWdodCgpOworICAgICAgICBzZXRIYXNBbm9ueW1v
dXNJbmxpbmVCbG9jaygpOworICAgIH0KKworICAgIHZpcnR1YWwgZmxvYXQgdmlydHVhbExvZ2lj
YWxIZWlnaHQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtX2xvZ2ljYWxIZWlnaHQ7IH0gLy8g
VGhlIGhlaWdodCBvZiB0aGUgYW5vbnltb3VzIGlubGluZSBibG9jayBiZWxvdyB1cyBpbiB0aGUg
bGluZSBib3ggdHJlZS4KKyAgICB2b2lkIHNldExvZ2ljYWxIZWlnaHQoTGF5b3V0VW5pdCBoKSB7
IG1fbG9naWNhbEhlaWdodCA9IGg7IH0KKworcHJpdmF0ZToKKyAgICBMYXlvdXRVbml0IG1fbG9n
aWNhbEhlaWdodDsKK307CisKICNpZmRlZiBOREVCVUcKIAogaW5saW5lIHZvaWQgSW5saW5lRmxv
d0JveDo6Y2hlY2tDb25zaXN0ZW5jeSgpIGNvbnN0CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5k
ZXJpbmcvSW5saW5lVGV4dEJveC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVu
ZGVyaW5nL0lubGluZVRleHRCb3guY3BwCShyZXZpc2lvbiAxODEzMjkpCisrKyBTb3VyY2UvV2Vi
Q29yZS9yZW5kZXJpbmcvSW5saW5lVGV4dEJveC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM4OSw3
ICszODksOCBAQCBib29sIElubGluZVRleHRCb3g6OmlzTGluZUJyZWFrKCkgY29uc3QKICAgICBy
ZXR1cm4gcmVuZGVyZXIoKS5zdHlsZSgpLnByZXNlcnZlTmV3bGluZSgpICYmIGxlbigpID09IDEg
JiYgKCpyZW5kZXJlcigpLnRleHQoKSlbc3RhcnQoKV0gPT0gJ1xuJzsKIH0KIAotYm9vbCBJbmxp
bmVUZXh0Qm94Ojpub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYgcmVxdWVzdCwgSGl0
VGVzdFJlc3VsdCYgcmVzdWx0LCBjb25zdCBIaXRUZXN0TG9jYXRpb24mIGxvY2F0aW9uSW5Db250
YWluZXIsIGNvbnN0IExheW91dFBvaW50JiBhY2N1bXVsYXRlZE9mZnNldCwgTGF5b3V0VW5pdCAv
KiBsaW5lVG9wICovLCBMYXlvdXRVbml0IC8qbGluZUJvdHRvbSovKQorYm9vbCBJbmxpbmVUZXh0
Qm94Ojpub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYgcmVxdWVzdCwgSGl0VGVzdFJl
c3VsdCYgcmVzdWx0LCBjb25zdCBIaXRUZXN0TG9jYXRpb24mIGxvY2F0aW9uSW5Db250YWluZXIs
IGNvbnN0IExheW91dFBvaW50JiBhY2N1bXVsYXRlZE9mZnNldCwgTGF5b3V0VW5pdCAvKiBsaW5l
VG9wICovLCBMYXlvdXRVbml0IC8qbGluZUJvdHRvbSovLAorICAgIEhpdFRlc3RBY3Rpb24sIExp
bmVCb3hIaXRUZXN0SW5mbyYpCiB7CiAgICAgaWYgKCF2aXNpYmxlVG9IaXRUZXN0aW5nKCkpCiAg
ICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTQ2MCw3ICs0NjEsNyBAQCBib29sIElubGluZVRleHRC
b3g6OmVtcGhhc2lzTWFya0V4aXN0c0FuCiAgICAgcmV0dXJuICFydWJ5VGV4dCB8fCAhcnVieVRl
eHQtPmhhc0xpbmVzKCk7CiB9CiAKLXZvaWQgSW5saW5lVGV4dEJveDo6cGFpbnQoUGFpbnRJbmZv
JiBwYWludEluZm8sIGNvbnN0IExheW91dFBvaW50JiBwYWludE9mZnNldCwgTGF5b3V0VW5pdCAv
KmxpbmVUb3AqLywgTGF5b3V0VW5pdCAvKmxpbmVCb3R0b20qLykKK3ZvaWQgSW5saW5lVGV4dEJv
eDo6cGFpbnQoUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IExheW91dFBvaW50JiBwYWludE9m
ZnNldCwgTGF5b3V0VW5pdCAvKmxpbmVUb3AqLywgTGF5b3V0VW5pdCAvKmxpbmVCb3R0b20qLywg
TGluZUJveFBhaW50SW5mbyYpCiB7CiAgICAgaWYgKGlzTGluZUJyZWFrKCkgfHwgIXBhaW50SW5m
by5zaG91bGRQYWludFdpdGhpblJvb3QocmVuZGVyZXIoKSkgfHwgcmVuZGVyZXIoKS5zdHlsZSgp
LnZpc2liaWxpdHkoKSAhPSBWSVNJQkxFCiAgICAgICAgIHx8IG1fdHJ1bmNhdGlvbiA9PSBjRnVs
bFRydW5jYXRpb24gfHwgcGFpbnRJbmZvLnBoYXNlID09IFBhaW50UGhhc2VPdXRsaW5lIHx8ICFt
X2xlbikKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVUZXh0Qm94LmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL0lubGluZVRleHRCb3guaAkocmV2
aXNpb24gMTgxMzI5KQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL0lubGluZVRleHRCb3gu
aAkod29ya2luZyBjb3B5KQpAQCAtMTE1LDggKzExNSw4IEBAIHB1YmxpYzoKICAgICB2b2lkIHNl
bGVjdGlvblN0YXJ0RW5kKGludCYgc1BvcywgaW50JiBlUG9zKTsKIAogcHJvdGVjdGVkOgotICAg
IHZpcnR1YWwgdm9pZCBwYWludChQYWludEluZm8mLCBjb25zdCBMYXlvdXRQb2ludCYsIExheW91
dFVuaXQgbGluZVRvcCwgTGF5b3V0VW5pdCBsaW5lQm90dG9tKTsKLSAgICB2aXJ0dWFsIGJvb2wg
bm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVzdWx0JiwgY29uc3Qg
SGl0VGVzdExvY2F0aW9uJiBsb2NhdGlvbkluQ29udGFpbmVyLCBjb25zdCBMYXlvdXRQb2ludCYg
YWNjdW11bGF0ZWRPZmZzZXQsIExheW91dFVuaXQgbGluZVRvcCwgTGF5b3V0VW5pdCBsaW5lQm90
dG9tKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoUGFpbnRJbmZvJiwgY29uc3Qg
TGF5b3V0UG9pbnQmLCBMYXlvdXRVbml0IGxpbmVUb3AsIExheW91dFVuaXQgbGluZUJvdHRvbSwg
TGluZUJveFBhaW50SW5mbyYpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYm9vbCBub2RlQXRQb2lu
dChjb25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBjb25zdCBIaXRUZXN0TG9j
YXRpb24mIGxvY2F0aW9uSW5Db250YWluZXIsIGNvbnN0IExheW91dFBvaW50JiBhY2N1bXVsYXRl
ZE9mZnNldCwgTGF5b3V0VW5pdCBsaW5lVG9wLCBMYXlvdXRVbml0IGxpbmVCb3R0b20sIEhpdFRl
c3RBY3Rpb24sIExpbmVCb3hIaXRUZXN0SW5mbyYpIG92ZXJyaWRlOwogCiBwcml2YXRlOgogICAg
IHZpcnR1YWwgdm9pZCBkZWxldGVMaW5lKCkgb3ZlcnJpZGUgZmluYWw7CkluZGV4OiBTb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5jcHAJKHJldmlzaW9uIDE4MTMyOSkKKysrIFNv
dXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTk2LDggKzk2LDYgQEAgc3RhdGljIFRyYWNrZWREZXNjZW5kYW50c01hcCogZ1BlcmNlbnRIZQog
c3RhdGljIFRyYWNrZWRDb250YWluZXJNYXAqIGdQb3NpdGlvbmVkQ29udGFpbmVyTWFwID0gMDsK
IHN0YXRpYyBUcmFja2VkQ29udGFpbmVyTWFwKiBnUGVyY2VudEhlaWdodENvbnRhaW5lck1hcCA9
IDA7CiAKLXR5cGVkZWYgSGFzaE1hcDxSZW5kZXJCbG9jayosIHN0ZDo6dW5pcXVlX3B0cjxMaXN0
SGFzaFNldDxSZW5kZXJJbmxpbmUqPj4+IENvbnRpbnVhdGlvbk91dGxpbmVUYWJsZU1hcDsKLQog
c3RydWN0IFVwZGF0ZVNjcm9sbEluZm9BZnRlckxheW91dFRyYW5zYWN0aW9uIHsKICAgICBVcGRh
dGVTY3JvbGxJbmZvQWZ0ZXJMYXlvdXRUcmFuc2FjdGlvbihjb25zdCBSZW5kZXJWaWV3JiB2aWV3
KQogICAgICAgICA6IG5lc3RlZENvdW50KDApCkBAIC0yOTYsMTYgKzI5NCw2IEBAIHZvaWQgUmVu
ZGVyQmxvY2s6OnN0eWxlRGlkQ2hhbmdlKFN0eWxlRGkKICAgICBpZiAoaGFkVHJhbnNmb3JtICE9
IGhhc1RyYW5zZm9ybSgpICYmICFmbG93VGhyZWFkQ29udGFpbmluZ0Jsb2NrSW52YWxpZGF0ZWQp
CiAgICAgICAgIGludmFsaWRhdGVGbG93VGhyZWFkQ29udGFpbmluZ0Jsb2NrSW5jbHVkaW5nRGVz
Y2VuZGFudHMoKTsKIAotICAgIGlmICghaXNBbm9ueW1vdXNCbG9jaygpKSB7Ci0gICAgICAgIC8v
IEVuc3VyZSB0aGF0IGFsbCBvZiBvdXIgY29udGludWF0aW9uIGJsb2NrcyBwaWNrIHVwIHRoZSBu
ZXcgc3R5bGUuCi0gICAgICAgIGZvciAoUmVuZGVyQmxvY2sqIGN1cnJDb250ID0gYmxvY2tFbGVt
ZW50Q29udGludWF0aW9uKCk7IGN1cnJDb250OyBjdXJyQ29udCA9IGN1cnJDb250LT5ibG9ja0Vs
ZW1lbnRDb250aW51YXRpb24oKSkgewotICAgICAgICAgICAgUmVuZGVyQm94TW9kZWxPYmplY3Qq
IG5leHRDb250ID0gY3VyckNvbnQtPmNvbnRpbnVhdGlvbigpOwotICAgICAgICAgICAgY3VyckNv
bnQtPnNldENvbnRpbnVhdGlvbigwKTsKLSAgICAgICAgICAgIGN1cnJDb250LT5zZXRTdHlsZShu
ZXdTdHlsZSk7Ci0gICAgICAgICAgICBjdXJyQ29udC0+c2V0Q29udGludWF0aW9uKG5leHRDb250
KTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIHByb3BhZ2F0ZVN0eWxlVG9Bbm9ueW1vdXNDaGls
ZHJlbihQcm9wYWdhdGVUb0Jsb2NrQ2hpbGRyZW5Pbmx5KTsKIAogICAgIC8vIEl0J3MgcG9zc2li
bGUgZm9yIG91ciBib3JkZXIvcGFkZGluZyB0byBjaGFuZ2UsIGJ1dCBmb3IgdGhlIG92ZXJhbGwg
bG9naWNhbCB3aWR0aCBvZiB0aGUgYmxvY2sgdG8KQEAgLTMxMyw2OCArMzAxLDE1IEBAIHZvaWQg
UmVuZGVyQmxvY2s6OnN0eWxlRGlkQ2hhbmdlKFN0eWxlRGkKICAgICBzZXRIYXNCb3JkZXJPclBh
ZGRpbmdMb2dpY2FsV2lkdGhDaGFuZ2VkKG9sZFN0eWxlICYmIGRpZmYgPT0gU3R5bGVEaWZmZXJl
bmNlTGF5b3V0ICYmIG5lZWRzTGF5b3V0KCkgJiYgYm9yZGVyT3JQYWRkaW5nTG9naWNhbFdpZHRo
Q2hhbmdlZChvbGRTdHlsZSwgJm5ld1N0eWxlKSk7CiB9CiAKLVJlbmRlckJsb2NrKiBSZW5kZXJC
bG9jazo6Y29udGludWF0aW9uQmVmb3JlKFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQpCi17Ci0g
ICAgaWYgKGJlZm9yZUNoaWxkICYmIGJlZm9yZUNoaWxkLT5wYXJlbnQoKSA9PSB0aGlzKQotICAg
ICAgICByZXR1cm4gdGhpczsKLQotICAgIFJlbmRlckJsb2NrKiBuZXh0VG9MYXN0ID0gdGhpczsK
LSAgICBSZW5kZXJCbG9jayogbGFzdCA9IHRoaXM7Ci0gICAgZm9yIChhdXRvKiBjdXJyZW50ID0g
ZG93bmNhc3Q8UmVuZGVyQmxvY2s+KGNvbnRpbnVhdGlvbigpKTsgY3VycmVudDsgY3VycmVudCA9
IGRvd25jYXN0PFJlbmRlckJsb2NrPihjdXJyZW50LT5jb250aW51YXRpb24oKSkpIHsKLSAgICAg
ICAgaWYgKGJlZm9yZUNoaWxkICYmIGJlZm9yZUNoaWxkLT5wYXJlbnQoKSA9PSBjdXJyZW50KSB7
Ci0gICAgICAgICAgICBpZiAoY3VycmVudC0+Zmlyc3RDaGlsZCgpID09IGJlZm9yZUNoaWxkKQot
ICAgICAgICAgICAgICAgIHJldHVybiBsYXN0OwotICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7
Ci0gICAgICAgIH0KLQotICAgICAgICBuZXh0VG9MYXN0ID0gbGFzdDsKLSAgICAgICAgbGFzdCA9
IGN1cnJlbnQ7Ci0gICAgfQotCi0gICAgaWYgKCFiZWZvcmVDaGlsZCAmJiAhbGFzdC0+Zmlyc3RD
aGlsZCgpKQotICAgICAgICByZXR1cm4gbmV4dFRvTGFzdDsKLSAgICByZXR1cm4gbGFzdDsKLX0K
LQogdm9pZCBSZW5kZXJCbG9jazo6YWRkQ2hpbGRUb0NvbnRpbnVhdGlvbihSZW5kZXJPYmplY3Qq
IG5ld0NoaWxkLCBSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkKQogewotICAgIFJlbmRlckJsb2Nr
KiBmbG93ID0gY29udGludWF0aW9uQmVmb3JlKGJlZm9yZUNoaWxkKTsKICAgICBBU1NFUlQoIWJl
Zm9yZUNoaWxkIHx8IGlzPFJlbmRlckJsb2NrPigqYmVmb3JlQ2hpbGQtPnBhcmVudCgpKSk7CiAg
ICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGJlZm9yZUNoaWxkUGFyZW50ID0gbnVsbHB0cjsKICAg
ICBpZiAoYmVmb3JlQ2hpbGQpCiAgICAgICAgIGJlZm9yZUNoaWxkUGFyZW50ID0gZG93bmNhc3Q8
UmVuZGVyQm94TW9kZWxPYmplY3Q+KGJlZm9yZUNoaWxkLT5wYXJlbnQoKSk7Ci0gICAgZWxzZSB7
Ci0gICAgICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBjb250aW51YXRpb24gPSBmbG93LT5jb250
aW51YXRpb24oKTsKLSAgICAgICAgaWYgKGNvbnRpbnVhdGlvbikKLSAgICAgICAgICAgIGJlZm9y
ZUNoaWxkUGFyZW50ID0gY29udGludWF0aW9uOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBi
ZWZvcmVDaGlsZFBhcmVudCA9IGZsb3c7Ci0gICAgfQotCi0gICAgaWYgKG5ld0NoaWxkLT5pc0Zs
b2F0aW5nT3JPdXRPZkZsb3dQb3NpdGlvbmVkKCkpIHsKLSAgICAgICAgYmVmb3JlQ2hpbGRQYXJl
bnQtPmFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24obmV3Q2hpbGQsIGJlZm9yZUNoaWxkKTsK
LSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGJvb2wgY2hpbGRJc05vcm1hbCA9IG5ld0No
aWxkLT5pc0lubGluZSgpIHx8ICFuZXdDaGlsZC0+c3R5bGUoKS5jb2x1bW5TcGFuKCk7Ci0gICAg
Ym9vbCBiY3BJc05vcm1hbCA9IGJlZm9yZUNoaWxkUGFyZW50LT5pc0lubGluZSgpIHx8ICFiZWZv
cmVDaGlsZFBhcmVudC0+c3R5bGUoKS5jb2x1bW5TcGFuKCk7Ci0gICAgYm9vbCBmbG93SXNOb3Jt
YWwgPSBmbG93LT5pc0lubGluZSgpIHx8ICFmbG93LT5zdHlsZSgpLmNvbHVtblNwYW4oKTsKKyAg
ICBlbHNlCisgICAgICAgIGJlZm9yZUNoaWxkUGFyZW50ID0gdGhpczsKIAotICAgIGlmIChmbG93
ID09IGJlZm9yZUNoaWxkUGFyZW50KSB7Ci0gICAgICAgIGZsb3ctPmFkZENoaWxkSWdub3JpbmdD
b250aW51YXRpb24obmV3Q2hpbGQsIGJlZm9yZUNoaWxkKTsKLSAgICAgICAgcmV0dXJuOwotICAg
IH0KLSAgICAKLSAgICAvLyBUaGUgZ29hbCBoZXJlIGlzIHRvIG1hdGNoIHVwIGlmIHdlIGNhbiwg
c28gdGhhdCB3ZSBjYW4gY29hbGVzY2UgYW5kIGNyZWF0ZSB0aGUKLSAgICAvLyBtaW5pbWFsICMg
b2YgY29udGludWF0aW9ucyBuZWVkZWQgZm9yIHRoZSBpbmxpbmUuCi0gICAgaWYgKGNoaWxkSXNO
b3JtYWwgPT0gYmNwSXNOb3JtYWwpIHsKLSAgICAgICAgYmVmb3JlQ2hpbGRQYXJlbnQtPmFkZENo
aWxkSWdub3JpbmdDb250aW51YXRpb24obmV3Q2hpbGQsIGJlZm9yZUNoaWxkKTsKLSAgICAgICAg
cmV0dXJuOwotICAgIH0KLSAgICBpZiAoZmxvd0lzTm9ybWFsID09IGNoaWxkSXNOb3JtYWwpIHsK
LSAgICAgICAgZmxvdy0+YWRkQ2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihuZXdDaGlsZCwgMCk7
IC8vIEp1c3QgdHJlYXQgbGlrZSBhbiBhcHBlbmQuCi0gICAgICAgIHJldHVybjsKLSAgICB9CiAg
ICAgYmVmb3JlQ2hpbGRQYXJlbnQtPmFkZENoaWxkSWdub3JpbmdDb250aW51YXRpb24obmV3Q2hp
bGQsIGJlZm9yZUNoaWxkKTsKIH0KIApAQCAtNDY3LDcgKzQwMiw3IEBAIHZvaWQgUmVuZGVyQmxv
Y2s6OmFkZENoaWxkSWdub3JpbmdDb250aW4KICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoIWNo
aWxkcmVuSW5saW5lKCkgJiYgKG5ld0NoaWxkLT5pc0Zsb2F0aW5nT3JPdXRPZkZsb3dQb3NpdGlv
bmVkKCkgfHwgbmV3Q2hpbGQtPmlzSW5saW5lKCkpKSB7CiAgICAgICAgIC8vIElmIHdlJ3JlIGlu
c2VydGluZyBhbiBpbmxpbmUgY2hpbGQgYnV0IGFsbCBvZiBvdXIgY2hpbGRyZW4gYXJlIGJsb2Nr
cywgdGhlbiB3ZSBoYXZlIHRvIG1ha2Ugc3VyZQotICAgICAgICAvLyBpdCBpcyBwdXQgaW50byBh
biBhbm9teW91cyBibG9jayBib3guIFdlIHRyeSB0byB1c2UgYW4gZXhpc3RpbmcgYW5vbnltb3Vz
IGJveCBpZiBwb3NzaWJsZSwgb3RoZXJ3aXNlCisgICAgICAgIC8vIGl0IGlzIHB1dCBpbnRvIGFu
IGFub255bW91cyBibG9jayBib3guIFdlIHRyeSB0byB1c2UgYW4gZXhpc3RpbmcgYW5vbnltb3Vz
IGJveCBpZiBwb3NzaWJsZSwgb3RoZXJ3aXNlCiAgICAgICAgIC8vIGEgbmV3IG9uZSBpcyBjcmVh
dGVkIGFuZCBpbnNlcnRlZCBpbnRvIG91ciBsaXN0IG9mIGNoaWxkcmVuIGluIHRoZSBhcHByb3By
aWF0ZSBwb3NpdGlvbi4KICAgICAgICAgUmVuZGVyT2JqZWN0KiBhZnRlckNoaWxkID0gYmVmb3Jl
Q2hpbGQgPyBiZWZvcmVDaGlsZC0+cHJldmlvdXNTaWJsaW5nKCkgOiBsYXN0Q2hpbGQoKTsKIApA
QCAtNTg3LDEwICs1MjIsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjpyZW1vdmVMZWZ0b3ZlckFub255
bW91CiB7CiAgICAgQVNTRVJUKGNoaWxkLT5pc0Fub255bW91c0Jsb2NrKCkpOwogICAgIEFTU0VS
VCghY2hpbGQtPmNoaWxkcmVuSW5saW5lKCkpOwotICAgIAotICAgIGlmIChjaGlsZC0+Y29udGlu
dWF0aW9uKCkpCi0gICAgICAgIHJldHVybjsKLSAgICAKKwogICAgIFJlbmRlck9iamVjdCogZmly
c3RBbkNoaWxkID0gY2hpbGQtPmZpcnN0Q2hpbGQoKTsKICAgICBSZW5kZXJPYmplY3QqIGxhc3RB
bkNoaWxkID0gY2hpbGQtPmxhc3RDaGlsZCgpOwogICAgIGlmIChmaXJzdEFuQ2hpbGQpIHsKQEAg
LTYzNywxNiArNTY5LDE0IEBAIHZvaWQgUmVuZGVyQmxvY2s6OnJlbW92ZUxlZnRvdmVyQW5vbnlt
b3UKIAogc3RhdGljIGJvb2wgY2FuTWVyZ2VBbm9ueW1vdXNCbG9jayhSZW5kZXJCbG9jayYgYW5v
bnltb3VzQmxvY2spCiB7Ci0gICAgaWYgKGFub255bW91c0Jsb2NrLmJlaW5nRGVzdHJveWVkKCkg
fHwgYW5vbnltb3VzQmxvY2suY29udGludWF0aW9uKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICBpZiAoYW5vbnltb3VzQmxvY2suaXNSdWJ5UnVuKCkgfHwgYW5vbnltb3VzQmxvY2suaXNS
dWJ5QmFzZSgpKQorICAgIGlmIChhbm9ueW1vdXNCbG9jay5iZWluZ0Rlc3Ryb3llZCgpIHx8IGFu
b255bW91c0Jsb2NrLmlzUnVieVJ1bigpIHx8IGFub255bW91c0Jsb2NrLmlzUnVieUJhc2UoKSkK
ICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIHJldHVybiB0cnVlOwogfQogCiBzdGF0aWMgYm9v
bCBjYW5NZXJnZUNvbnRpZ3VvdXNBbm9ueW1vdXNCbG9ja3MoUmVuZGVyT2JqZWN0JiBvbGRDaGls
ZCwgUmVuZGVyT2JqZWN0KiBwcmV2aW91cywgUmVuZGVyT2JqZWN0KiBuZXh0KQogewotICAgIGlm
IChvbGRDaGlsZC5kb2N1bWVudEJlaW5nRGVzdHJveWVkKCkgfHwgb2xkQ2hpbGQuaXNJbmxpbmUo
KSB8fCBvbGRDaGlsZC52aXJ0dWFsQ29udGludWF0aW9uKCkpCisgICAgaWYgKG9sZENoaWxkLmRv
Y3VtZW50QmVpbmdEZXN0cm95ZWQoKSB8fCBvbGRDaGlsZC5pc0lubGluZSgpKQogICAgICAgICBy
ZXR1cm4gZmFsc2U7CiAKICAgICBpZiAocHJldmlvdXMpIHsKQEAgLTcwNywxMCArNjM3LDcgQEAg
dm9pZCBSZW5kZXJCbG9jazo6cmVtb3ZlQ2hpbGQoUmVuZGVyT2JqZQogICAgICAgICAgICAgUmVu
ZGVyQmxvY2smIGJsb2NrQ2hpbGRyZW5CbG9jayA9IHByZXYtPmNoaWxkcmVuSW5saW5lKCkgPyBu
ZXh0QmxvY2sgOiBwcmV2QmxvY2s7CiAgICAgICAgICAgICAKICAgICAgICAgICAgIC8vIFBsYWNl
IHRoZSBpbmxpbmUgY2hpbGRyZW4gYmxvY2sgaW5zaWRlIG9mIHRoZSBibG9jayBjaGlsZHJlbiBi
bG9jayBpbnN0ZWFkIG9mIGRlbGV0aW5nIGl0LgotICAgICAgICAgICAgLy8gSW4gb3JkZXIgdG8g
cmV1c2UgaXQsIHdlIGhhdmUgdG8gcmVzZXQgaXQgdG8ganVzdCBiZSBhIGdlbmVyaWMgYW5vbnlt
b3VzIGJsb2NrLiAgTWFrZSBzdXJlCi0gICAgICAgICAgICAvLyB0byBjbGVhciBvdXQgaW5oZXJp
dGVkIGNvbHVtbiBwcm9wZXJ0aWVzIGJ5IGp1c3QgbWFraW5nIGEgbmV3IHN0eWxlLCBhbmQgdG8g
YWxzbyBjbGVhciB0aGUKLSAgICAgICAgICAgIC8vIGNvbHVtbiBzcGFuIGZsYWcgaWYgaXQgaXMg
c2V0LgotICAgICAgICAgICAgQVNTRVJUKCFpbmxpbmVDaGlsZHJlbkJsb2NrLmNvbnRpbnVhdGlv
bigpKTsKKyAgICAgICAgICAgIC8vIEluIG9yZGVyIHRvIHJldXNlIGl0LCB3ZSBoYXZlIHRvIHJl
c2V0IGl0IHRvIGp1c3QgYmUgYSBnZW5lcmljIGFub255bW91cyBibG9jay4KICAgICAgICAgICAg
IC8vIENhY2hlIHRoaXMgdmFsdWUgYXMgaXQgbWlnaHQgZ2V0IGNoYW5nZWQgaW4gc2V0U3R5bGUo
KSBjYWxsLgogICAgICAgICAgICAgYm9vbCBpbmxpbmVDaGlsZHJlbkJsb2NrSGFzTGF5ZXIgPSBp
bmxpbmVDaGlsZHJlbkJsb2NrLmhhc0xheWVyKCk7CiAgICAgICAgICAgICBpbmxpbmVDaGlsZHJl
bkJsb2NrLnNldFN0eWxlKFJlbmRlclN0eWxlOjpjcmVhdGVBbm9ueW1vdXNTdHlsZVdpdGhEaXNw
bGF5KCZzdHlsZSgpLCBCTE9DSykpOwpAQCAtNzY2LDMyICs2OTMsNiBAQCB2b2lkIFJlbmRlckJs
b2NrOjpyZW1vdmVDaGlsZChSZW5kZXJPYmplCiAgICAgICAgIC8vIElmIHRoaXMgd2FzIG91ciBs
YXN0IGNoaWxkIGJlIHN1cmUgdG8gY2xlYXIgb3V0IG91ciBsaW5lIGJveGVzLgogICAgICAgICBp
ZiAoY2hpbGRyZW5JbmxpbmUoKSkKICAgICAgICAgICAgIGRlbGV0ZUxpbmVzKCk7Ci0KLSAgICAg
ICAgLy8gSWYgd2UgYXJlIGFuIGVtcHR5IGFub255bW91cyBibG9jayBpbiB0aGUgY29udGludWF0
aW9uIGNoYWluLAotICAgICAgICAvLyB3ZSBuZWVkIHRvIHJlbW92ZSBvdXJzZWxmIGFuZCBmaXgg
dGhlIGNvbnRpbnVhdGlvbiBjaGFpbi4KLSAgICAgICAgaWYgKCFiZWluZ0Rlc3Ryb3llZCgpICYm
IGlzQW5vbnltb3VzQmxvY2tDb250aW51YXRpb24oKSAmJiAhb2xkQ2hpbGQuaXNMaXN0TWFya2Vy
KCkpIHsKLSAgICAgICAgICAgIGF1dG8gY29udGFpbmluZ0Jsb2NrSWdub3JpbmdBbm9ueW1vdXMg
PSBjb250YWluaW5nQmxvY2soKTsKLSAgICAgICAgICAgIHdoaWxlIChjb250YWluaW5nQmxvY2tJ
Z25vcmluZ0Fub255bW91cyAmJiBjb250YWluaW5nQmxvY2tJZ25vcmluZ0Fub255bW91cy0+aXNB
bm9ueW1vdXNCbG9jaygpKQotICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdCbG9ja0lnbm9yaW5n
QW5vbnltb3VzID0gY29udGFpbmluZ0Jsb2NrSWdub3JpbmdBbm9ueW1vdXMtPmNvbnRhaW5pbmdC
bG9jaygpOwotICAgICAgICAgICAgZm9yIChSZW5kZXJPYmplY3QqIGN1cnJlbnQgPSB0aGlzOyBj
dXJyZW50OyBjdXJyZW50ID0gY3VycmVudC0+cHJldmlvdXNJblByZU9yZGVyKGNvbnRhaW5pbmdC
bG9ja0lnbm9yaW5nQW5vbnltb3VzKSkgewotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LT52
aXJ0dWFsQ29udGludWF0aW9uKCkgIT0gdGhpcykKLSAgICAgICAgICAgICAgICAgICAgY29udGlu
dWU7Ci0KLSAgICAgICAgICAgICAgICAvLyBGb3VuZCBvdXIgcHJldmlvdXMgY29udGludWF0aW9u
LiBXZSBqdXN0IG5lZWQgdG8gcG9pbnQgaXQgdG8KLSAgICAgICAgICAgICAgICAvLyB8dGhpc3wn
cyBuZXh0IGNvbnRpbnVhdGlvbi4KLSAgICAgICAgICAgICAgICBSZW5kZXJCb3hNb2RlbE9iamVj
dCogbmV4dENvbnRpbnVhdGlvbiA9IGNvbnRpbnVhdGlvbigpOwotICAgICAgICAgICAgICAgIGlm
IChpczxSZW5kZXJJbmxpbmU+KCpjdXJyZW50KSkKLSAgICAgICAgICAgICAgICAgICAgZG93bmNh
c3Q8UmVuZGVySW5saW5lPigqY3VycmVudCkuc2V0Q29udGludWF0aW9uKG5leHRDb250aW51YXRp
b24pOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzPFJlbmRlckJsb2NrPigqY3VycmVudCkp
Ci0gICAgICAgICAgICAgICAgICAgIGRvd25jYXN0PFJlbmRlckJsb2NrPigqY3VycmVudCkuc2V0
Q29udGludWF0aW9uKG5leHRDb250aW51YXRpb24pOwotICAgICAgICAgICAgICAgIGVsc2UKLSAg
ICAgICAgICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0KLSAgICAgICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldENvbnRpbnVhdGlvbihudWxs
cHRyKTsKLSAgICAgICAgICAgIGRlc3Ryb3koKTsKLSAgICAgICAgfQogICAgIH0KIH0KIApAQCAt
ODIzLDEwICs3MjQsMTggQEAgYm9vbCBSZW5kZXJCbG9jazo6aXNTZWxmQ29sbGFwc2luZ0Jsb2Nr
KAogICAgIC8vIG9uIHdoZXRoZXIgd2UgaGF2ZSBjb250ZW50IHRoYXQgaXMgYWxsIHNlbGYtY29s
bGFwc2luZyBvciBub3QuCiAgICAgaWYgKGhhc0F1dG9IZWlnaHQgfHwgKChsb2dpY2FsSGVpZ2h0
TGVuZ3RoLmlzRml4ZWQoKSB8fCBsb2dpY2FsSGVpZ2h0TGVuZ3RoLmlzUGVyY2VudCgpKSAmJiBs
b2dpY2FsSGVpZ2h0TGVuZ3RoLmlzWmVybygpKSkgewogICAgICAgICAvLyBJZiB0aGUgYmxvY2sg
aGFzIGlubGluZSBjaGlsZHJlbiwgc2VlIGlmIHdlIGdlbmVyYXRlZCBhbnkgbGluZSBib3hlcy4g
IElmIHdlIGhhdmUgYW55Ci0gICAgICAgIC8vIGxpbmUgYm94ZXMsIHRoZW4gd2UgY2FuJ3QgYmUg
c2VsZi1jb2xsYXBzaW5nLCBzaW5jZSB3ZSBoYXZlIGNvbnRlbnQuCi0gICAgICAgIGlmIChjaGls
ZHJlbklubGluZSgpKQotICAgICAgICAgICAgcmV0dXJuICFoYXNMaW5lcygpOwotICAgICAgICAK
KyAgICAgICAgLy8gbGluZSBib3hlcywgdGhlbiB3ZSBjYW4gb25seSBiZSBzZWxmLWNvbGxhcHNp
bmcgaWYgd2UgaGF2ZSBub3RoaW5nIGJ1dCBhbm9ueW1vdXMgaW5saW5lIGJsb2NrcworICAgICAg
ICAvLyB0aGF0IGFyZSBhbHNvIHNlbGYtY29sbGFwc2luZyBpbnNpZGUgdXMuCisgICAgICAgIGlm
IChjaGlsZHJlbklubGluZSgpKSB7CisgICAgICAgICAgICBpZiAoYXV0byBzaW1wbGVMaW5lTGF5
b3V0ID0gdGhpcy0+c2ltcGxlTGluZUxheW91dCgpKQorICAgICAgICAgICAgICAgIHJldHVybiAh
c2ltcGxlTGluZUxheW91dC0+bGluZUNvdW50KCk7CisgICAgICAgICAgICBmb3IgKFJvb3RJbmxp
bmVCb3gqIGNoaWxkID0gZmlyc3RSb290Qm94KCk7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0
Um9vdEJveCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFjaGlsZC0+aGFzQW5vbnltb3VzSW5s
aW5lQmxvY2soKSB8fCAhY2hpbGQtPmFub255bW91c0lubGluZUJsb2NrKCktPmlzU2VsZkNvbGxh
cHNpbmdCbG9jaygpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
ICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gV2UgaGF2ZSBubyBsaW5lIGJveGVz
LCBzbyB3ZSBtdXN0IGJlIHNlbGYtY29sbGFwc2luZy4KKyAgICAgICAgfQorCiAgICAgICAgIC8v
IFdoZXRoZXIgb3Igbm90IHdlIGNvbGxhcHNlIGlzIGRlcGVuZGVudCBvbiB3aGV0aGVyIGFsbCBv
dXIgbm9ybWFsIGZsb3cgY2hpbGRyZW4KICAgICAgICAgLy8gYXJlIGFsc28gc2VsZi1jb2xsYXBz
aW5nLgogICAgICAgICBmb3IgKFJlbmRlckJveCogY2hpbGQgPSBmaXJzdENoaWxkQm94KCk7IGNo
aWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0U2libGluZ0JveCgpKSB7CkBAIC0xNTk5LDMzICsxNTA4
LDcgQEAgdm9pZCBSZW5kZXJCbG9jazo6cGFpbnRPYmplY3QoUGFpbnRJbmZvJgogICAgIGlmICgo
cGFpbnRQaGFzZSA9PSBQYWludFBoYXNlT3V0bGluZSB8fCBwYWludFBoYXNlID09IFBhaW50UGhh
c2VTZWxmT3V0bGluZSkgJiYgaGFzT3V0bGluZSgpICYmIHN0eWxlKCkudmlzaWJpbGl0eSgpID09
IFZJU0lCTEUpCiAgICAgICAgIHBhaW50T3V0bGluZShwYWludEluZm8sIExheW91dFJlY3QocGFp
bnRPZmZzZXQsIHNpemUoKSkpOwogCi0gICAgLy8gNi4gcGFpbnQgY29udGludWF0aW9uIG91dGxp
bmVzLgotICAgIGlmICgocGFpbnRQaGFzZSA9PSBQYWludFBoYXNlT3V0bGluZSB8fCBwYWludFBo
YXNlID09IFBhaW50UGhhc2VDaGlsZE91dGxpbmVzKSkgewotICAgICAgICBSZW5kZXJJbmxpbmUq
IGlubGluZUNvbnQgPSBpbmxpbmVFbGVtZW50Q29udGludWF0aW9uKCk7Ci0gICAgICAgIGlmIChp
bmxpbmVDb250ICYmIGlubGluZUNvbnQtPmhhc091dGxpbmUoKSAmJiBpbmxpbmVDb250LT5zdHls
ZSgpLnZpc2liaWxpdHkoKSA9PSBWSVNJQkxFKSB7Ci0gICAgICAgICAgICBSZW5kZXJJbmxpbmUq
IGlubGluZVJlbmRlcmVyID0gZG93bmNhc3Q8UmVuZGVySW5saW5lPihpbmxpbmVDb250LT5lbGVt
ZW50KCktPnJlbmRlcmVyKCkpOwotICAgICAgICAgICAgUmVuZGVyQmxvY2sqIGNvbnRhaW5pbmdC
bG9jayA9IHRoaXMtPmNvbnRhaW5pbmdCbG9jaygpOwotCi0gICAgICAgICAgICBib29sIGlubGlu
ZUVuY2xvc2VkSW5TZWxmUGFpbnRpbmdMYXllciA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChS
ZW5kZXJCb3hNb2RlbE9iamVjdCogYm94ID0gaW5saW5lUmVuZGVyZXI7IGJveCAhPSBjb250YWlu
aW5nQmxvY2s7IGJveCA9ICZib3gtPnBhcmVudCgpLT5lbmNsb3NpbmdCb3hNb2RlbE9iamVjdCgp
KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJveC0+aGFzU2VsZlBhaW50aW5nTGF5ZXIoKSkgewot
ICAgICAgICAgICAgICAgICAgICBpbmxpbmVFbmNsb3NlZEluU2VsZlBhaW50aW5nTGF5ZXIgPSB0
cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIERvIG5vdCBhZGQgY29udGludWF0aW9ucyBmb3Ig
b3V0bGluZSBwYWludGluZyBieSBvdXIgY29udGFpbmluZyBibG9jayBpZiB3ZSBhcmUgYSByZWxh
dGl2ZSBwb3NpdGlvbmVkCi0gICAgICAgICAgICAvLyBhbm9ueW1vdXMgYmxvY2sgKGkuZS4gaGF2
ZSBvdXIgb3duIGxheWVyKSwgcGFpbnQgdGhlbSBzdHJhaWdodGF3YXkgaW5zdGVhZC4gVGhpcyBp
cyBiZWNhdXNlIGEgYmxvY2sgZGVwZW5kcyBvbiByZW5kZXJlcnMgaW4gaXRzIGNvbnRpbnVhdGlv
biB0YWJsZSBiZWluZwotICAgICAgICAgICAgLy8gaW4gdGhlIHNhbWUgbGF5ZXIuIAotICAgICAg
ICAgICAgaWYgKCFpbmxpbmVFbmNsb3NlZEluU2VsZlBhaW50aW5nTGF5ZXIgJiYgIWhhc0xheWVy
KCkpCi0gICAgICAgICAgICAgICAgY29udGFpbmluZ0Jsb2NrLT5hZGRDb250aW51YXRpb25XaXRo
T3V0bGluZShpbmxpbmVSZW5kZXJlcik7Ci0gICAgICAgICAgICBlbHNlIGlmICghaW5saW5lUmVu
ZGVyZXItPmZpcnN0TGluZUJveCgpIHx8ICghaW5saW5lRW5jbG9zZWRJblNlbGZQYWludGluZ0xh
eWVyICYmIGhhc0xheWVyKCkpKQotICAgICAgICAgICAgICAgIGlubGluZVJlbmRlcmVyLT5wYWlu
dE91dGxpbmUocGFpbnRJbmZvLCBwYWludE9mZnNldCAtIGxvY2F0aW9uT2Zmc2V0KCkgKyBpbmxp
bmVSZW5kZXJlci0+Y29udGFpbmluZ0Jsb2NrKCktPmxvY2F0aW9uKCkpOwotICAgICAgICB9Ci0g
ICAgICAgIHBhaW50Q29udGludWF0aW9uT3V0bGluZXMocGFpbnRJbmZvLCBwYWludE9mZnNldCk7
Ci0gICAgfQotCi0gICAgLy8gNy4gcGFpbnQgY2FyZXQuCisgICAgLy8gNi4gcGFpbnQgY2FyZXQu
CiAgICAgLy8gSWYgdGhlIGNhcmV0J3Mgbm9kZSdzIHJlbmRlciBvYmplY3QncyBjb250YWluaW5n
IGJsb2NrIGlzIHRoaXMgYmxvY2ssIGFuZCB0aGUgcGFpbnQgYWN0aW9uIGlzIFBhaW50UGhhc2VG
b3JlZ3JvdW5kLAogICAgIC8vIHRoZW4gcGFpbnQgdGhlIGNhcmV0LgogICAgIGlmIChwYWludFBo
YXNlID09IFBhaW50UGhhc2VGb3JlZ3JvdW5kKSB7ICAgICAgICAKQEAgLTE2MzMsODMgKzE1MTYs
NiBAQCB2b2lkIFJlbmRlckJsb2NrOjpwYWludE9iamVjdChQYWludEluZm8mCiAgICAgICAgIHBh
aW50Q2FyZXQocGFpbnRJbmZvLCBwYWludE9mZnNldCwgRHJhZ0NhcmV0KTsKICAgICB9CiB9Ci0K
LVJlbmRlcklubGluZSogUmVuZGVyQmxvY2s6OmlubGluZUVsZW1lbnRDb250aW51YXRpb24oKSBj
b25zdAoteyAKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogY29udGludWF0aW9uID0gdGhpcy0+
Y29udGludWF0aW9uKCk7Ci0gICAgcmV0dXJuIGlzPFJlbmRlcklubGluZT4oY29udGludWF0aW9u
KSA/IGRvd25jYXN0PFJlbmRlcklubGluZT4oY29udGludWF0aW9uKSA6IG51bGxwdHI7Ci19Ci0K
LVJlbmRlckJsb2NrKiBSZW5kZXJCbG9jazo6YmxvY2tFbGVtZW50Q29udGludWF0aW9uKCkgY29u
c3QKLXsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogY3VycmVudENvbnRpbnVhdGlvbiA9IGNv
bnRpbnVhdGlvbigpOwotICAgIGlmICghY3VycmVudENvbnRpbnVhdGlvbiB8fCBjdXJyZW50Q29u
dGludWF0aW9uLT5pc0lubGluZSgpKQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICBSZW5k
ZXJCbG9jayYgbmV4dENvbnRpbnVhdGlvbiA9IGRvd25jYXN0PFJlbmRlckJsb2NrPigqY3VycmVu
dENvbnRpbnVhdGlvbik7Ci0gICAgaWYgKG5leHRDb250aW51YXRpb24uaXNBbm9ueW1vdXNCbG9j
aygpKQotICAgICAgICByZXR1cm4gbmV4dENvbnRpbnVhdGlvbi5ibG9ja0VsZW1lbnRDb250aW51
YXRpb24oKTsKLSAgICByZXR1cm4gJm5leHRDb250aW51YXRpb247Ci19Ci0gICAgCi1zdGF0aWMg
Q29udGludWF0aW9uT3V0bGluZVRhYmxlTWFwKiBjb250aW51YXRpb25PdXRsaW5lVGFibGUoKQot
ewotICAgIERFUFJFQ0FURURfREVGSU5FX1NUQVRJQ19MT0NBTChDb250aW51YXRpb25PdXRsaW5l
VGFibGVNYXAsIHRhYmxlLCAoKSk7Ci0gICAgcmV0dXJuICZ0YWJsZTsKLX0KLQotdm9pZCBSZW5k
ZXJCbG9jazo6YWRkQ29udGludWF0aW9uV2l0aE91dGxpbmUoUmVuZGVySW5saW5lKiBmbG93KQot
ewotICAgIC8vIFdlIGNhbid0IG1ha2UgdGhpcyB3b3JrIGlmIHRoZSBpbmxpbmUgaXMgaW4gYSBs
YXllci4gIFdlJ2xsIGp1c3QgcmVseSBvbiB0aGUgYnJva2VuCi0gICAgLy8gd2F5IG9mIHBhaW50
aW5nLgotICAgIEFTU0VSVCghZmxvdy0+bGF5ZXIoKSAmJiAhZmxvdy0+aXNJbmxpbmVFbGVtZW50
Q29udGludWF0aW9uKCkpOwotICAgIAotICAgIENvbnRpbnVhdGlvbk91dGxpbmVUYWJsZU1hcCog
dGFibGUgPSBjb250aW51YXRpb25PdXRsaW5lVGFibGUoKTsKLSAgICBMaXN0SGFzaFNldDxSZW5k
ZXJJbmxpbmUqPiogY29udGludWF0aW9ucyA9IHRhYmxlLT5nZXQodGhpcyk7Ci0gICAgaWYgKCFj
b250aW51YXRpb25zKSB7Ci0gICAgICAgIGNvbnRpbnVhdGlvbnMgPSBuZXcgTGlzdEhhc2hTZXQ8
UmVuZGVySW5saW5lKj47Ci0gICAgICAgIHRhYmxlLT5zZXQodGhpcywgc3RkOjp1bmlxdWVfcHRy
PExpc3RIYXNoU2V0PFJlbmRlcklubGluZSo+Pihjb250aW51YXRpb25zKSk7Ci0gICAgfQotICAg
IAotICAgIGNvbnRpbnVhdGlvbnMtPmFkZChmbG93KTsKLX0KLQotYm9vbCBSZW5kZXJCbG9jazo6
cGFpbnRzQ29udGludWF0aW9uT3V0bGluZShSZW5kZXJJbmxpbmUqIGZsb3cpCi17Ci0gICAgQ29u
dGludWF0aW9uT3V0bGluZVRhYmxlTWFwKiB0YWJsZSA9IGNvbnRpbnVhdGlvbk91dGxpbmVUYWJs
ZSgpOwotICAgIGlmICh0YWJsZS0+aXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgICAgIAotICAgIExpc3RIYXNoU2V0PFJlbmRlcklubGluZSo+KiBjb250aW51YXRpb25zID0g
dGFibGUtPmdldCh0aGlzKTsKLSAgICBpZiAoIWNvbnRpbnVhdGlvbnMpCi0gICAgICAgIHJldHVy
biBmYWxzZTsKLQotICAgIHJldHVybiBjb250aW51YXRpb25zLT5jb250YWlucyhmbG93KTsKLX0K
LQotdm9pZCBSZW5kZXJCbG9jazo6cGFpbnRDb250aW51YXRpb25PdXRsaW5lcyhQYWludEluZm8m
IGluZm8sIGNvbnN0IExheW91dFBvaW50JiBwYWludE9mZnNldCkKLXsKLSAgICBDb250aW51YXRp
b25PdXRsaW5lVGFibGVNYXAqIHRhYmxlID0gY29udGludWF0aW9uT3V0bGluZVRhYmxlKCk7Ci0g
ICAgaWYgKHRhYmxlLT5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAg
c3RkOjp1bmlxdWVfcHRyPExpc3RIYXNoU2V0PFJlbmRlcklubGluZSo+PiBjb250aW51YXRpb25z
ID0gdGFibGUtPnRha2UodGhpcyk7Ci0gICAgaWYgKCFjb250aW51YXRpb25zKQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBMYXlvdXRQb2ludCBhY2N1bXVsYXRlZFBhaW50T2Zmc2V0ID0gcGFpbnRP
ZmZzZXQ7Ci0gICAgLy8gUGFpbnQgZWFjaCBjb250aW51YXRpb24gb3V0bGluZS4KLSAgICBMaXN0
SGFzaFNldDxSZW5kZXJJbmxpbmUqPjo6aXRlcmF0b3IgZW5kID0gY29udGludWF0aW9ucy0+ZW5k
KCk7Ci0gICAgZm9yIChMaXN0SGFzaFNldDxSZW5kZXJJbmxpbmUqPjo6aXRlcmF0b3IgaXQgPSBj
b250aW51YXRpb25zLT5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgLy8gTmVl
ZCB0byBhZGQgaW4gdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBpbnRlcnZlbmluZyBibG9ja3MuCi0g
ICAgICAgIFJlbmRlcklubGluZSogZmxvdyA9ICppdDsKLSAgICAgICAgUmVuZGVyQmxvY2sqIGJs
b2NrID0gZmxvdy0+Y29udGFpbmluZ0Jsb2NrKCk7Ci0gICAgICAgIGZvciAoIDsgYmxvY2sgJiYg
YmxvY2sgIT0gdGhpczsgYmxvY2sgPSBibG9jay0+Y29udGFpbmluZ0Jsb2NrKCkpCi0gICAgICAg
ICAgICBhY2N1bXVsYXRlZFBhaW50T2Zmc2V0Lm1vdmVCeShibG9jay0+bG9jYXRpb24oKSk7Ci0g
ICAgICAgIEFTU0VSVChibG9jayk7ICAgCi0gICAgICAgIGZsb3ctPnBhaW50T3V0bGluZShpbmZv
LCBhY2N1bXVsYXRlZFBhaW50T2Zmc2V0KTsKLSAgICB9Ci19Ci0KIGJvb2wgUmVuZGVyQmxvY2s6
OnNob3VsZFBhaW50U2VsZWN0aW9uR2FwcygpIGNvbnN0CiB7CiAgICAgcmV0dXJuIHNlbGVjdGlv
blN0YXRlKCkgIT0gU2VsZWN0aW9uTm9uZSAmJiBzdHlsZSgpLnZpc2liaWxpdHkoKSA9PSBWSVNJ
QkxFICYmIGlzU2VsZWN0aW9uUm9vdCgpOwpAQCAtMTcyNyw3ICsxNTMzLDcgQEAgYm9vbCBSZW5k
ZXJCbG9jazo6aXNTZWxlY3Rpb25Sb290KCkgY29ucwogICAgICAgICAKICAgICBpZiAoaXNCb2R5
KCkgfHwgaXNSb290KCkgfHwgaGFzT3ZlcmZsb3dDbGlwKCkKICAgICAgICAgfHwgaXNQb3NpdGlv
bmVkKCkgfHwgaXNGbG9hdGluZygpCi0gICAgICAgIHx8IGlzVGFibGVDZWxsKCkgfHwgaXNJbmxp
bmVCbG9ja09ySW5saW5lVGFibGUoKQorICAgICAgICB8fCBpc1RhYmxlQ2VsbCgpIHx8IChpc0lu
bGluZUJsb2NrT3JJbmxpbmVUYWJsZSgpICYmICFpc0Fub255bW91c0lubGluZUJsb2NrKCkpCiAg
ICAgICAgIHx8IGhhc1RyYW5zZm9ybSgpIHx8IGhhc1JlZmxlY3Rpb24oKSB8fCBoYXNNYXNrKCkg
fHwgaXNXcml0aW5nTW9kZVJvb3QoKQogICAgICAgICB8fCBpc1JlbmRlckZsb3dUaHJlYWQoKSB8
fCBzdHlsZSgpLmNvbHVtblNwYW4oKSA9PSBDb2x1bW5TcGFuQWxsKQogICAgICAgICByZXR1cm4g
dHJ1ZTsKQEAgLTIzODksNyArMjE5NSw3IEBAIE5vZGUqIFJlbmRlckJsb2NrOjpub2RlRm9ySGl0
VGVzdCgpIGNvbnMKICAgICAvLyB0aGF0IHdhcyBzcGxpdC4gVXNlIHRoZSBhcHByb3ByaWF0ZSBp
bm5lciBub2RlLgogICAgIGlmIChpc1JlbmRlclZpZXcoKSkKICAgICAgICAgcmV0dXJuICZkb2N1
bWVudCgpOwotICAgIHJldHVybiBpc0Fub255bW91c0Jsb2NrQ29udGludWF0aW9uKCkgPyBjb250
aW51YXRpb24oKS0+ZWxlbWVudCgpIDogZWxlbWVudCgpOworICAgIHJldHVybiBlbGVtZW50KCk7
CiB9CiAKIGJvb2wgUmVuZGVyQmxvY2s6Om5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0
JiByZXF1ZXN0LCBIaXRUZXN0UmVzdWx0JiByZXN1bHQsIGNvbnN0IEhpdFRlc3RMb2NhdGlvbiYg
bG9jYXRpb25JbkNvbnRhaW5lciwgY29uc3QgTGF5b3V0UG9pbnQmIGFjY3VtdWxhdGVkT2Zmc2V0
LCBIaXRUZXN0QWN0aW9uIGhpdFRlc3RBY3Rpb24pCkBAIC0yNTcyLDcgKzIzNzgsNyBAQCBWaXNp
YmxlUG9zaXRpb24gUmVuZGVyQmxvY2s6OnBvc2l0aW9uRm9yCiAKIHN0YXRpYyBpbmxpbmUgYm9v
bCBpc0NoaWxkSGl0VGVzdENhbmRpZGF0ZShjb25zdCBSZW5kZXJCb3gmIGJveCkKIHsKLSAgICBy
ZXR1cm4gYm94LmhlaWdodCgpICYmIGJveC5zdHlsZSgpLnZpc2liaWxpdHkoKSA9PSBWSVNJQkxF
ICYmICFib3guaXNGbG9hdGluZ09yT3V0T2ZGbG93UG9zaXRpb25lZCgpICYmICFib3guaXNJbkZs
b3dSZW5kZXJGbG93VGhyZWFkKCk7CisgICAgcmV0dXJuIGJveC5sb2dpY2FsSGVpZ2h0KCkgJiYg
Ym94LnN0eWxlKCkudmlzaWJpbGl0eSgpID09IFZJU0lCTEUgJiYgIWJveC5pc0Zsb2F0aW5nT3JP
dXRPZkZsb3dQb3NpdGlvbmVkKCkgJiYgIWJveC5pc0luRmxvd1JlbmRlckZsb3dUaHJlYWQoKTsK
IH0KIAogLy8gVmFsaWQgY2FuZGlkYXRlcyBpbiBhIEZsb3dUaHJlYWQgbXVzdCBiZSByZW5kZXJl
ZCBieSB0aGUgcmVnaW9uLgpAQCAtMjU5MSw3ICsyMzk3LDcgQEAgVmlzaWJsZVBvc2l0aW9uIFJl
bmRlckJsb2NrOjpwb3NpdGlvbkZvcgogICAgIGlmIChpc1RhYmxlKCkpCiAgICAgICAgIHJldHVy
biBSZW5kZXJCb3g6OnBvc2l0aW9uRm9yUG9pbnQocG9pbnQsIHJlZ2lvbik7CiAKLSAgICBpZiAo
aXNSZXBsYWNlZCgpKSB7CisgICAgaWYgKGlzUmVwbGFjZWQoKSAmJiAhaXNBbm9ueW1vdXNJbmxp
bmVCbG9jaygpKSB7CiAgICAgICAgIC8vIEZJWE1FOiBUaGlzIHNlZW1zIHdyb25nIHdoZW4gdGhl
IG9iamVjdCdzIHdyaXRpbmctbW9kZSBkb2Vzbid0IG1hdGNoIHRoZSBsaW5lJ3Mgd3JpdGluZy1t
b2RlLgogICAgICAgICBMYXlvdXRVbml0IHBvaW50TG9naWNhbExlZnQgPSBpc0hvcml6b250YWxX
cml0aW5nTW9kZSgpID8gcG9pbnQueCgpIDogcG9pbnQueSgpOwogICAgICAgICBMYXlvdXRVbml0
IHBvaW50TG9naWNhbFRvcCA9IGlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkgPyBwb2ludC55KCkg
OiBwb2ludC54KCk7CkBAIC0yODQ1LDcgKzI2NTEsNyBAQCBpbnQgUmVuZGVyQmxvY2s6OmJhc2Vs
aW5lUG9zaXRpb24oRm9udEJhCiAgICAgICAgIC8vICh0aGUgY29udGVudCBpbnNpZGUgdGhlbSBt
b3ZlcykuICBUaGlzIG1hdGNoZXMgV2luSUUgYXMgd2VsbCwgd2hpY2gganVzdCBib3R0b20tYWxp
Z25zIHRoZW0uCiAgICAgICAgIC8vIFdlIGFsc28gZ2l2ZSB1cCBvbiBmaW5kaW5nIGEgYmFzZWxp
bmUgaWYgd2UgaGF2ZSBhIHZlcnRpY2FsIHNjcm9sbGJhciwgb3IgaWYgd2UgYXJlIHNjcm9sbGVk
CiAgICAgICAgIC8vIHZlcnRpY2FsbHkgKGUuZy4sIGFuIG92ZXJmbG93OmhpZGRlbiBibG9jayB0
aGF0IGhhcyBoYWQgc2Nyb2xsVG9wIG1vdmVkKS4KLSAgICAgICAgYm9vbCBpZ25vcmVCYXNlbGlu
ZSA9IChsYXllcigpICYmIChsYXllcigpLT5tYXJxdWVlKCkgfHwgKGRpcmVjdGlvbiA9PSBIb3Jp
em9udGFsTGluZSA/IChsYXllcigpLT52ZXJ0aWNhbFNjcm9sbGJhcigpIHx8IGxheWVyKCktPnNj
cm9sbFlPZmZzZXQoKSAhPSAwKQorICAgICAgICBib29sIGlnbm9yZUJhc2VsaW5lID0gaXNBbm9u
eW1vdXNJbmxpbmVCbG9jaygpIHx8IChsYXllcigpICYmIChsYXllcigpLT5tYXJxdWVlKCkgfHwg
KGRpcmVjdGlvbiA9PSBIb3Jpem9udGFsTGluZSA/IChsYXllcigpLT52ZXJ0aWNhbFNjcm9sbGJh
cigpIHx8IGxheWVyKCktPnNjcm9sbFlPZmZzZXQoKSAhPSAwKQogICAgICAgICAgICAgOiAobGF5
ZXIoKS0+aG9yaXpvbnRhbFNjcm9sbGJhcigpIHx8IGxheWVyKCktPnNjcm9sbFhPZmZzZXQoKSAh
PSAwKSkpKSB8fCAoaXNXcml0aW5nTW9kZVJvb3QoKSAmJiAhaXNSdWJ5UnVuKCkpOwogICAgICAg
ICAKICAgICAgICAgaW50IGJhc2VsaW5lUG9zID0gaWdub3JlQmFzZWxpbmUgPyAtMSA6IGlubGlu
ZUJsb2NrQmFzZWxpbmUoZGlyZWN0aW9uKTsKQEAgLTMzMTMsNjQgKzMxMTksMTggQEAgdm9pZCBS
ZW5kZXJCbG9jazo6c2V0UGFnZUxvZ2ljYWxPZmZzZXQoTAogICAgIHJhcmVEYXRhLT5tX3BhZ2VM
b2dpY2FsT2Zmc2V0ID0gbG9naWNhbE9mZnNldDsKIH0KIAotdm9pZCBSZW5kZXJCbG9jazo6YWJz
b2x1dGVSZWN0cyhWZWN0b3I8SW50UmVjdD4mIHJlY3RzLCBjb25zdCBMYXlvdXRQb2ludCYgYWNj
dW11bGF0ZWRPZmZzZXQpIGNvbnN0Ci17Ci0gICAgLy8gRm9yIGJsb2NrcyBpbnNpZGUgaW5saW5l
cywgd2UgZ28gYWhlYWQgYW5kIGluY2x1ZGUgbWFyZ2lucyBzbyB0aGF0IHdlIHJ1biByaWdodCB1
cCB0byB0aGUKLSAgICAvLyBpbmxpbmUgYm94ZXMgYWJvdmUgYW5kIGJlbG93IHVzICh0aHVzIGdl
dHRpbmcgbWVyZ2VkIHdpdGggdGhlbSB0byBmb3JtIGEgc2luZ2xlIGlycmVndWxhcgotICAgIC8v
IHNoYXBlKS4KLSAgICBpZiAoaXNBbm9ueW1vdXNCbG9ja0NvbnRpbnVhdGlvbigpKSB7Ci0gICAg
ICAgIC8vIEZJWE1FOiBUaGlzIGlzIHdyb25nIGZvciBibG9jay1mbG93cyB0aGF0IGFyZSBob3Jp
em9udGFsLgotICAgICAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9NDY3ODEKLSAgICAgICAgcmVjdHMuYXBwZW5kKHNuYXBwZWRJbnRSZWN0KGFjY3VtdWxhdGVk
T2Zmc2V0LngoKSwgYWNjdW11bGF0ZWRPZmZzZXQueSgpIC0gY29sbGFwc2VkTWFyZ2luQmVmb3Jl
KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoKCksIGhlaWdodCgpICsg
Y29sbGFwc2VkTWFyZ2luQmVmb3JlKCkgKyBjb2xsYXBzZWRNYXJnaW5BZnRlcigpKSk7Ci0gICAg
ICAgIGNvbnRpbnVhdGlvbigpLT5hYnNvbHV0ZVJlY3RzKHJlY3RzLCBhY2N1bXVsYXRlZE9mZnNl
dCAtIHRvTGF5b3V0U2l6ZShsb2NhdGlvbigpICsKLSAgICAgICAgICAgICAgICBpbmxpbmVFbGVt
ZW50Q29udGludWF0aW9uKCktPmNvbnRhaW5pbmdCbG9jaygpLT5sb2NhdGlvbigpKSk7Ci0gICAg
fSBlbHNlCi0gICAgICAgIHJlY3RzLmFwcGVuZChzbmFwcGVkSW50UmVjdChhY2N1bXVsYXRlZE9m
ZnNldCwgc2l6ZSgpKSk7Ci19Ci0KIHZvaWQgUmVuZGVyQmxvY2s6OmFic29sdXRlUXVhZHMoVmVj
dG9yPEZsb2F0UXVhZD4mIHF1YWRzLCBib29sKiB3YXNGaXhlZCkgY29uc3QKIHsKICAgICAvLyBG
b3IgYmxvY2tzIGluc2lkZSBpbmxpbmVzLCB3ZSBnbyBhaGVhZCBhbmQgaW5jbHVkZSBtYXJnaW5z
IHNvIHRoYXQgd2UgcnVuIHJpZ2h0IHVwIHRvIHRoZQogICAgIC8vIGlubGluZSBib3hlcyBhYm92
ZSBhbmQgYmVsb3cgdXMgKHRodXMgZ2V0dGluZyBtZXJnZWQgd2l0aCB0aGVtIHRvIGZvcm0gYSBz
aW5nbGUgaXJyZWd1bGFyCiAgICAgLy8gc2hhcGUpLgotICAgIEZsb2F0UmVjdCBsb2NhbFJlY3Qg
PSBpc0Fub255bW91c0Jsb2NrQ29udGludWF0aW9uKCkgCi0gICAgICAgID8gRmxvYXRSZWN0KDAs
IC1jb2xsYXBzZWRNYXJnaW5CZWZvcmUoKSwgd2lkdGgoKSwgaGVpZ2h0KCkgKyBjb2xsYXBzZWRN
YXJnaW5CZWZvcmUoKSArIGNvbGxhcHNlZE1hcmdpbkFmdGVyKCkpCi0gICAgICAgIDogRmxvYXRS
ZWN0KDAsIDAsIHdpZHRoKCksIGhlaWdodCgpKTsKKyAgICBGbG9hdFJlY3QgbG9jYWxSZWN0ID0g
RmxvYXRSZWN0KDAsIDAsIHdpZHRoKCksIGhlaWdodCgpKTsKICAgICAKICAgICAvLyBGSVhNRTog
VGhpcyBpcyB3cm9uZyBmb3IgYmxvY2stZmxvd3MgdGhhdCBhcmUgaG9yaXpvbnRhbC4KICAgICAv
LyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDY3ODEKICAgICBSZW5k
ZXJGbG93VGhyZWFkKiBmbG93VGhyZWFkID0gZmxvd1RocmVhZENvbnRhaW5pbmdCbG9jaygpOwog
ICAgIGlmICghZmxvd1RocmVhZCB8fCAhZmxvd1RocmVhZC0+YWJzb2x1dGVRdWFkc0ZvckJveChx
dWFkcywgd2FzRml4ZWQsIHRoaXMsIGxvY2FsUmVjdC55KCksIGxvY2FsUmVjdC5tYXhZKCkpKQog
ICAgICAgICBxdWFkcy5hcHBlbmQobG9jYWxUb0Fic29sdXRlUXVhZChsb2NhbFJlY3QsIDAgLyog
bW9kZSAqLywgd2FzRml4ZWQpKTsKLQotICAgIGlmIChpc0Fub255bW91c0Jsb2NrQ29udGludWF0
aW9uKCkpCi0gICAgICAgIGNvbnRpbnVhdGlvbigpLT5hYnNvbHV0ZVF1YWRzKHF1YWRzLCB3YXNG
aXhlZCk7Ci19Ci0KLUxheW91dFJlY3QgUmVuZGVyQmxvY2s6OnJlY3RXaXRoT3V0bGluZUZvclJl
cGFpbnQoY29uc3QgUmVuZGVyTGF5ZXJNb2RlbE9iamVjdCogcmVwYWludENvbnRhaW5lciwgTGF5
b3V0VW5pdCBvdXRsaW5lV2lkdGgpIGNvbnN0Ci17Ci0gICAgTGF5b3V0UmVjdCByKFJlbmRlckJv
eDo6cmVjdFdpdGhPdXRsaW5lRm9yUmVwYWludChyZXBhaW50Q29udGFpbmVyLCBvdXRsaW5lV2lk
dGgpKTsKLSAgICBpZiAoaXNBbm9ueW1vdXNCbG9ja0NvbnRpbnVhdGlvbigpKQotICAgICAgICBy
LmluZmxhdGVZKGNvbGxhcHNlZE1hcmdpbkJlZm9yZSgpKTsgLy8gRklYTUU6IFRoaXMgaXMgd3Jv
bmcgZm9yIGJsb2NrLWZsb3dzIHRoYXQgYXJlIGhvcml6b250YWwuCi0gICAgcmV0dXJuIHI7Ci19
Ci0KLVJlbmRlckVsZW1lbnQqIFJlbmRlckJsb2NrOjpob3ZlckFuY2VzdG9yKCkgY29uc3QKLXsK
LSAgICByZXR1cm4gaXNBbm9ueW1vdXNCbG9ja0NvbnRpbnVhdGlvbigpID8gY29udGludWF0aW9u
KCkgOiBSZW5kZXJCb3g6OmhvdmVyQW5jZXN0b3IoKTsKLX0KLQotdm9pZCBSZW5kZXJCbG9jazo6
dXBkYXRlRHJhZ1N0YXRlKGJvb2wgZHJhZ09uKQotewotICAgIFJlbmRlckJveDo6dXBkYXRlRHJh
Z1N0YXRlKGRyYWdPbik7Ci0gICAgaWYgKFJlbmRlckJveE1vZGVsT2JqZWN0KiBjb250aW51YXRp
b24gPSB0aGlzLT5jb250aW51YXRpb24oKSkKLSAgICAgICAgY29udGludWF0aW9uLT51cGRhdGVE
cmFnU3RhdGUoZHJhZ09uKTsKLX0KLQotY29uc3QgUmVuZGVyU3R5bGUmIFJlbmRlckJsb2NrOjpv
dXRsaW5lU3R5bGVGb3JSZXBhaW50KCkgY29uc3QKLXsKLSAgICByZXR1cm4gaXNBbm9ueW1vdXNC
bG9ja0NvbnRpbnVhdGlvbigpID8gY29udGludWF0aW9uKCktPnN0eWxlKCkgOiBzdHlsZSgpOwog
fQogCiB2b2lkIFJlbmRlckJsb2NrOjpjaGlsZEJlY2FtZU5vbklubGluZShSZW5kZXJFbGVtZW50
JikKQEAgLTM0MTksMjAgKzMxNzksMjIgQEAgdm9pZCBSZW5kZXJCbG9jazo6YWRkRm9jdXNSaW5n
UmVjdHMoVmVjdAogICAgIC8vIEZvciBibG9ja3MgaW5zaWRlIGlubGluZXMsIHdlIGdvIGFoZWFk
IGFuZCBpbmNsdWRlIG1hcmdpbnMgc28gdGhhdCB3ZSBydW4gcmlnaHQgdXAgdG8gdGhlCiAgICAg
Ly8gaW5saW5lIGJveGVzIGFib3ZlIGFuZCBiZWxvdyB1cyAodGh1cyBnZXR0aW5nIG1lcmdlZCB3
aXRoIHRoZW0gdG8gZm9ybSBhIHNpbmdsZSBpcnJlZ3VsYXIKICAgICAvLyBzaGFwZSkuCi0gICAg
aWYgKGlubGluZUVsZW1lbnRDb250aW51YXRpb24oKSkgewotICAgICAgICAvLyBGSVhNRTogVGhp
cyBjaGVjayByZWFsbHkgaXNuJ3QgYWNjdXJhdGUuIAotICAgICAgICBib29sIG5leHRJbmxpbmVI
YXNMaW5lQm94ID0gaW5saW5lRWxlbWVudENvbnRpbnVhdGlvbigpLT5maXJzdExpbmVCb3goKTsK
LSAgICAgICAgLy8gRklYTUU6IFRoaXMgaXMgd3JvbmcuIFRoZSBwcmluY2lwYWwgcmVuZGVyZXIg
bWF5IG5vdCBiZSB0aGUgY29udGludWF0aW9uIHByZWNlZGluZyB0aGlzIGJsb2NrLgotICAgICAg
ICAvLyBGSVhNRTogVGhpcyBpcyB3cm9uZyBmb3IgYmxvY2stZmxvd3MgdGhhdCBhcmUgaG9yaXpv
bnRhbC4KLSAgICAgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTQ2NzgxCi0gICAgICAgIGJvb2wgcHJldklubGluZUhhc0xpbmVCb3ggPSBkb3duY2FzdDxSZW5k
ZXJJbmxpbmU+KCppbmxpbmVFbGVtZW50Q29udGludWF0aW9uKCktPmVsZW1lbnQoKS0+cmVuZGVy
ZXIoKSkuZmlyc3RMaW5lQm94KCk7Ci0gICAgICAgIGZsb2F0IHRvcE1hcmdpbiA9IHByZXZJbmxp
bmVIYXNMaW5lQm94ID8gY29sbGFwc2VkTWFyZ2luQmVmb3JlKCkgOiBMYXlvdXRVbml0KCk7Ci0g
ICAgICAgIGZsb2F0IGJvdHRvbU1hcmdpbiA9IG5leHRJbmxpbmVIYXNMaW5lQm94ID8gY29sbGFw
c2VkTWFyZ2luQWZ0ZXIoKSA6IExheW91dFVuaXQoKTsKLSAgICAgICAgTGF5b3V0UmVjdCByZWN0
KGFkZGl0aW9uYWxPZmZzZXQueCgpLCBhZGRpdGlvbmFsT2Zmc2V0LnkoKSAtIHRvcE1hcmdpbiwg
d2lkdGgoKSwgaGVpZ2h0KCkgKyB0b3BNYXJnaW4gKyBib3R0b21NYXJnaW4pOwotICAgICAgICBp
ZiAoIXJlY3QuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmVjdHMuYXBwZW5kKHNuYXBwZWRJbnRS
ZWN0KHJlY3QpKTsKLSAgICB9IGVsc2UgaWYgKHdpZHRoKCkgJiYgaGVpZ2h0KCkpCi0gICAgICAg
IHJlY3RzLmFwcGVuZChzbmFwcGVkSW50UmVjdChhZGRpdGlvbmFsT2Zmc2V0LCBzaXplKCkpKTsK
KyAgICBpZiAoaXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpICYmIGxvZ2ljYWxIZWlnaHQoKSkgewor
ICAgICAgICAvLyBGSVhNRTogTm90IHN1cmUgaWYgdGhpcyB3b3JrcyB3aXRoIGZsaXBwZWQgbGlu
ZXMsIGJ1dCBub25lIG9mIHRoZSBvdGhlciBmb2N1cyByaW5nCisgICAgICAgIC8vIGNvZGUgZXZl
biB3b3JrcyB3aXRoIHZlcnRpY2FsIHdyaXRpbmcgbW9kZSwgc28gd2UncmUgYWxyZWFkeSBhaGVh
ZCBvZiB0aGUgY3VydmUuIDspCisgICAgICAgIExheW91dFVuaXQgdG9wID0gaXNIb3Jpem9udGFs
V3JpdGluZ01vZGUoKSA/IGFkZGl0aW9uYWxPZmZzZXQueSgpIDogYWRkaXRpb25hbE9mZnNldC54
KCk7CisgICAgICAgIExheW91dFVuaXQgYm90dG9tID0gdG9wICsgbG9naWNhbEhlaWdodCgpOwor
ICAgICAgICBpZiAoaW5saW5lQm94V3JhcHBlcigpICYmIGlubGluZUJveFdyYXBwZXIoKS0+cm9v
dCgpLnByZXZSb290Qm94KCkpCisgICAgICAgICAgICB0b3AgPSBzdGQ6Om1pbih0b3AsIHRvcCAt
IGNvbnRhaW5pbmdCbG9jaygpLT5jb2xsYXBzZWRNYXJnaW5CZWZvcmVGb3JDaGlsZCgqdGhpcykp
OworICAgICAgICBpZiAoaW5saW5lQm94V3JhcHBlcigpICYmIGlubGluZUJveFdyYXBwZXIoKS0+
cm9vdCgpLm5leHRSb290Qm94KCkpCisgICAgICAgICAgICBib3R0b20gPSBzdGQ6Om1heChib3R0
b20sIGJvdHRvbSArIGNvbnRhaW5pbmdCbG9jaygpLT5jb2xsYXBzZWRNYXJnaW5BZnRlckZvckNo
aWxkKCp0aGlzKSk7CisgICAgICAgIExheW91dFJlY3QgcmVzdWx0KGlzSG9yaXpvbnRhbFdyaXRp
bmdNb2RlKCkgPyBhZGRpdGlvbmFsT2Zmc2V0LngoKSA6IGFkZGl0aW9uYWxPZmZzZXQueSgpLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AsIGxvZ2ljYWxXaWR0aCgpLCBib3R0b20gLSB0
b3ApOworICAgICAgICBpZiAoIWlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpCisgICAgICAgICAg
ICByZXN1bHQgPSByZXN1bHQudHJhbnNwb3NlZFJlY3QoKTsKKyAgICAgICAgaWYgKCFyZXN1bHQu
aXNFbXB0eSgpKQorICAgICAgICAgICAgcmVjdHMuYXBwZW5kKHJlc3VsdCk7CisgICAgfQogCiAg
ICAgaWYgKCFoYXNPdmVyZmxvd0NsaXAoKSAmJiAhaGFzQ29udHJvbENsaXAoKSkgewogICAgICAg
ICBpZiAoY2hpbGRyZW5JbmxpbmUoKSkKQEAgLTM0NTEsOSArMzIxMyw2IEBAIHZvaWQgUmVuZGVy
QmxvY2s6OmFkZEZvY3VzUmluZ1JlY3RzKFZlY3QKICAgICAgICAgICAgIH0KICAgICAgICAgfQog
ICAgIH0KLQotICAgIGlmIChpbmxpbmVFbGVtZW50Q29udGludWF0aW9uKCkpCi0gICAgICAgIGlu
bGluZUVsZW1lbnRDb250aW51YXRpb24oKS0+YWRkRm9jdXNSaW5nUmVjdHMocmVjdHMsIGZsb29y
ZWRMYXlvdXRQb2ludChMYXlvdXRQb2ludChhZGRpdGlvbmFsT2Zmc2V0ICsgaW5saW5lRWxlbWVu
dENvbnRpbnVhdGlvbigpLT5jb250YWluaW5nQmxvY2soKS0+bG9jYXRpb24oKSAtIGxvY2F0aW9u
KCkpKSwgcGFpbnRDb250YWluZXIpOwogfQogCiBSZW5kZXJCb3gqIFJlbmRlckJsb2NrOjpjcmVh
dGVBbm9ueW1vdXNCb3hXaXRoU2FtZVR5cGVBcyhjb25zdCBSZW5kZXJPYmplY3QqIHBhcmVudCkg
Y29uc3QKQEAgLTM2NjYsNiArMzQyNSw5IEBAIGNvbnN0IGNoYXIqIFJlbmRlckJsb2NrOjpyZW5k
ZXJOYW1lKCkgY28KICAgICAgICAgcmV0dXJuICJSZW5kZXJCbG9jayAocG9zaXRpb25lZCkiOwog
ICAgIGlmIChpc0Fub255bW91c0Jsb2NrKCkpCiAgICAgICAgIHJldHVybiAiUmVuZGVyQmxvY2sg
KGFub255bW91cykiOworICAgIGlmIChpc0Fub255bW91c0lubGluZUJsb2NrKCkpCisgICAgICAg
IHJldHVybiAiUmVuZGVyQmxvY2sgKGFub255bW91cyBpbmxpbmUtYmxvY2spIjsKKyAKICAgICAv
LyBGSVhNRTogVGVtcG9yYXJ5IGhhY2sgd2hpbGUgdGhlIG5ldyBnZW5lcmF0ZWQgY29udGVudCBz
eXN0ZW0gaXMgYmVpbmcgaW1wbGVtZW50ZWQuCiAgICAgaWYgKGlzUHNldWRvRWxlbWVudCgpKQog
ICAgICAgICByZXR1cm4gIlJlbmRlckJsb2NrIChnZW5lcmF0ZWQpIjsKSW5kZXg6IFNvdXJjZS9X
ZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJD
b3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5oCShyZXZpc2lvbiAxODEzMjkpCisrKyBTb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suaAkod29ya2luZyBjb3B5KQpAQCAtMTgyLDE3
ICsxODIsNiBAQCBwdWJsaWM6CiAKICAgICBMYXlvdXRSZWN0IGxvZ2ljYWxSZWN0VG9QaHlzaWNh
bFJlY3QoY29uc3QgTGF5b3V0UG9pbnQmIHBoeXNpY2FsUG9zaXRpb24sIGNvbnN0IExheW91dFJl
Y3QmIGxvZ2ljYWxSZWN0KTsKIAotICAgIHZvaWQgYWRkQ29udGludWF0aW9uV2l0aE91dGxpbmUo
UmVuZGVySW5saW5lKik7Ci0gICAgYm9vbCBwYWludHNDb250aW51YXRpb25PdXRsaW5lKFJlbmRl
cklubGluZSopOwotCi0gICAgdmlydHVhbCBSZW5kZXJCb3hNb2RlbE9iamVjdCogdmlydHVhbENv
bnRpbnVhdGlvbigpIGNvbnN0IG92ZXJyaWRlIGZpbmFsIHsgcmV0dXJuIGNvbnRpbnVhdGlvbigp
OyB9Ci0gICAgYm9vbCBpc0Fub255bW91c0Jsb2NrQ29udGludWF0aW9uKCkgY29uc3QgeyByZXR1
cm4gaXNBbm9ueW1vdXNCbG9jaygpICYmIGNvbnRpbnVhdGlvbigpOyB9Ci0gICAgV0VCQ09SRV9F
WFBPUlQgUmVuZGVySW5saW5lKiBpbmxpbmVFbGVtZW50Q29udGludWF0aW9uKCkgY29uc3Q7Ci0g
ICAgUmVuZGVyQmxvY2sqIGJsb2NrRWxlbWVudENvbnRpbnVhdGlvbigpIGNvbnN0OwotCi0gICAg
dXNpbmcgUmVuZGVyQm94TW9kZWxPYmplY3Q6OmNvbnRpbnVhdGlvbjsKLSAgICB1c2luZyBSZW5k
ZXJCb3hNb2RlbE9iamVjdDo6c2V0Q29udGludWF0aW9uOwotCiAgICAgc3RhdGljIFJlbmRlckJs
b2NrKiBjcmVhdGVBbm9ueW1vdXNXaXRoUGFyZW50UmVuZGVyZXJBbmREaXNwbGF5KGNvbnN0IFJl
bmRlck9iamVjdCosIEVEaXNwbGF5ID0gQkxPQ0spOwogICAgIFJlbmRlckJsb2NrKiBjcmVhdGVB
bm9ueW1vdXNCbG9jayhFRGlzcGxheSBkaXNwbGF5ID0gQkxPQ0spIGNvbnN0IHsgcmV0dXJuIGNy
ZWF0ZUFub255bW91c1dpdGhQYXJlbnRSZW5kZXJlckFuZERpc3BsYXkodGhpcywgZGlzcGxheSk7
IH0KICAgICBzdGF0aWMgdm9pZCBjb2xsYXBzZUFub255bW91c0JveENoaWxkKFJlbmRlckJsb2Nr
JiBwYXJlbnQsIFJlbmRlckJsb2NrKiBjaGlsZCk7CkBAIC00NTIsMTEgKzQ0MSw2IEBAIHByaXZh
dGU6CiAgICAgLy8gY2hpbGRyZW4uCiAgICAgdmlydHVhbCBSZW5kZXJCbG9jayogZmlyc3RMaW5l
QmxvY2soKSBjb25zdCBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgTGF5b3V0UmVjdCByZWN0V2l0
aE91dGxpbmVGb3JSZXBhaW50KGNvbnN0IFJlbmRlckxheWVyTW9kZWxPYmplY3QqIHJlcGFpbnRD
b250YWluZXIsIExheW91dFVuaXQgb3V0bGluZVdpZHRoKSBjb25zdCBvdmVycmlkZSBmaW5hbDsK
LSAgICB2aXJ0dWFsIGNvbnN0IFJlbmRlclN0eWxlJiBvdXRsaW5lU3R5bGVGb3JSZXBhaW50KCkg
Y29uc3Qgb3ZlcnJpZGUgZmluYWw7Ci0KLSAgICB2aXJ0dWFsIFJlbmRlckVsZW1lbnQqIGhvdmVy
QW5jZXN0b3IoKSBjb25zdCBvdmVycmlkZSBmaW5hbDsKLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRl
RHJhZ1N0YXRlKGJvb2wgZHJhZ09uKSBvdmVycmlkZSBmaW5hbDsKICAgICB2aXJ0dWFsIHZvaWQg
Y2hpbGRCZWNhbWVOb25JbmxpbmUoUmVuZGVyRWxlbWVudCYpIG92ZXJyaWRlIGZpbmFsOwogCiAg
ICAgdmlydHVhbCBMYXlvdXRSZWN0IHNlbGVjdGlvblJlY3RGb3JSZXBhaW50KGNvbnN0IFJlbmRl
ckxheWVyTW9kZWxPYmplY3QqIHJlcGFpbnRDb250YWluZXIsIGJvb2wgLypjbGlwVG9WaXNpYmxl
Q29udGVudCovKSBvdmVycmlkZSBmaW5hbApAQCAtNDc5LDE5ICs0NjMsMTUgQEAgcHJpdmF0ZToK
ICAgICB2aXJ0dWFsIHZvaWQgY2xpcE91dEZsb2F0aW5nT2JqZWN0cyhSZW5kZXJCbG9jayYsIGNv
bnN0IFBhaW50SW5mbyosIGNvbnN0IExheW91dFBvaW50JiwgY29uc3QgTGF5b3V0U2l6ZSYpIHsg
fTsKICAgICBmcmllbmQgY2xhc3MgTG9naWNhbFNlbGVjdGlvbk9mZnNldENhY2hlczsKIAotICAg
IHZpcnR1YWwgdm9pZCBhYnNvbHV0ZVJlY3RzKFZlY3RvcjxJbnRSZWN0PiYsIGNvbnN0IExheW91
dFBvaW50JiBhY2N1bXVsYXRlZE9mZnNldCkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCB2
b2lkIGFic29sdXRlUXVhZHMoVmVjdG9yPEZsb2F0UXVhZD4mLCBib29sKiB3YXNGaXhlZCkgY29u
c3Qgb3ZlcnJpZGU7CiAKLSAgICB2b2lkIHBhaW50Q29udGludWF0aW9uT3V0bGluZXMoUGFpbnRJ
bmZvJiwgY29uc3QgTGF5b3V0UG9pbnQmKTsKLQogICAgIHZpcnR1YWwgTGF5b3V0UmVjdCBsb2Nh
bENhcmV0UmVjdChJbmxpbmVCb3gqLCBpbnQgY2FyZXRPZmZzZXQsIExheW91dFVuaXQqIGV4dHJh
V2lkdGhUb0VuZE9mTGluZSA9IDApIG92ZXJyaWRlIGZpbmFsOwogICAgIAogICAgIC8vIEZJWE1F
LUJMT0NLRkxPVzogUmVtb3ZlIHZpcnR1YWxpemFpb24gd2hlbiBhbGwgY2FsbGVycyBoYXZlIG1v
dmVkIHRvIFJlbmRlckJsb2NrRmxvdwogICAgIHZpcnR1YWwgVmlzaWJsZVBvc2l0aW9uIHBvc2l0
aW9uRm9yUG9pbnRXaXRoSW5saW5lQ2hpbGRyZW4oY29uc3QgTGF5b3V0UG9pbnQmLCBjb25zdCBS
ZW5kZXJSZWdpb24qKTsKIAogICAgIFJlbmRlclB0cjxSZW5kZXJCbG9jaz4gY2xvbmUoKSBjb25z
dDsKLSAgICBSZW5kZXJCbG9jayogY29udGludWF0aW9uQmVmb3JlKFJlbmRlck9iamVjdCogYmVm
b3JlQ2hpbGQpOwotCisgCiAgICAgUmVuZGVyRmxvd1RocmVhZCogdXBkYXRlQ2FjaGVkRmxvd1Ro
cmVhZENvbnRhaW5pbmdCbG9jayhSZW5kZXJGbG93VGhyZWFkKikgY29uc3Q7CiAKIHByaXZhdGU6
CkBAIC01MTYsNiArNDk2LDggQEAgcHVibGljOgogICAgIC8vIFJlbmRlclJ1YnlCYXNlIG9iamVj
dHMgbmVlZCB0byBiZSBhYmxlIHRvIHNwbGl0IGFuZCBtZXJnZSwgbW92aW5nIHRoZWlyIGNoaWxk
cmVuIGFyb3VuZAogICAgIC8vIChjYWxsaW5nIG1vdmVDaGlsZFRvLCBtb3ZlQWxsQ2hpbGRyZW5U
bywgYW5kIG1ha2VDaGlsZHJlbk5vbklubGluZSkuCiAgICAgZnJpZW5kIGNsYXNzIFJlbmRlclJ1
YnlCYXNlOworICAgIAorICAgIGZyaWVuZCBjbGFzcyBJbmxpbmVFbGVtZW50Qm94OwogCiBwcml2
YXRlOgogICAgIC8vIFVzZWQgdG8gc3RvcmUgc3RhdGUgYmV0d2VlbiBzdHlsZVdpbGxDaGFuZ2Ug
YW5kIHN0eWxlRGlkQ2hhbmdlCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVy
QmxvY2tGbG93LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVu
ZGVyQmxvY2tGbG93LmNwcAkocmV2aXNpb24gMTgxMzI5KQorKysgU291cmNlL1dlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlckJsb2NrRmxvdy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMyLDYgKzMyLDcg
QEAKICNpbmNsdWRlICJIaXRUZXN0TG9jYXRpb24uaCIKICNpbmNsdWRlICJJbmxpbmVUZXh0Qm94
LmgiCiAjaW5jbHVkZSAiTGF5b3V0UmVwYWludGVyLmgiCisjaW5jbHVkZSAiTG9naWNhbFNlbGVj
dGlvbk9mZnNldENhY2hlcy5oIgogI2luY2x1ZGUgIlJlbmRlckNvbWJpbmVUZXh0LmgiCiAjaW5j
bHVkZSAiUmVuZGVyRmxvd1RocmVhZC5oIgogI2luY2x1ZGUgIlJlbmRlcklubGluZS5oIgpAQCAt
MjM3LDkgKzIzOCwxMSBAQCB2b2lkIFJlbmRlckJsb2NrRmxvdzo6cmVidWlsZEZsb2F0aW5nT2Jq
CiAKICAgICAvLyBGaXJzdCBhZGQgaW4gZmxvYXRzIGZyb20gdGhlIHBhcmVudC4gU2VsZi1jb2xs
YXBzaW5nIGJsb2NrcyBsZXQgdGhlaXIgcGFyZW50IHRyYWNrIGFueSBmbG9hdHMgdGhhdCBpbnRy
dWRlIGludG8KICAgICAvLyB0aGVtIChhcyBvcHBvc2VkIHRvIGZsb2F0cyB0aGV5IGNvbnRhaW4g
dGhlbXNlbHZlcykgc28gY2hlY2sgZm9yIHRob3NlIGhlcmUgdG9vLgotICAgIFJlbmRlckJsb2Nr
RmxvdyYgcGFyZW50QmxvY2sgPSBkb3duY2FzdDxSZW5kZXJCbG9ja0Zsb3c+KCpwYXJlbnQoKSk7
Ci0gICAgYm9vbCBwYXJlbnRIYXNGbG9hdHMgPSBmYWxzZTsKLSAgICBSZW5kZXJCbG9ja0Zsb3cq
IHByZXZpb3VzQmxvY2sgPSBwcmV2aW91c1NpYmxpbmdXaXRoT3ZlcmhhbmdpbmdGbG9hdHMocGFy
ZW50SGFzRmxvYXRzKTsKKyAgICBSZW5kZXJCbG9ja0Zsb3cmIHBhcmVudEJsb2NrID0gZG93bmNh
c3Q8UmVuZGVyQmxvY2tGbG93Pihpc0Fub255bW91c0lubGluZUJsb2NrKCkgPyAqY29udGFpbmlu
Z0Jsb2NrKCkgOiAqcGFyZW50KCkpOworICAgIGJvb2wgcGFyZW50SGFzRmxvYXRzID0gaXNBbm9u
eW1vdXNJbmxpbmVCbG9jaygpID8gcGFyZW50QmxvY2suY29udGFpbnNGbG9hdHMoKSA6IGZhbHNl
OworICAgIFJlbmRlckJsb2NrRmxvdyogcHJldmlvdXNCbG9jayA9IG51bGxwdHI7CisgICAgaWYg
KCFpc0Fub255bW91c0lubGluZUJsb2NrKCkpCisgICAgICAgIHByZXZpb3VzQmxvY2sgPSBwcmV2
aW91c1NpYmxpbmdXaXRoT3ZlcmhhbmdpbmdGbG9hdHMocGFyZW50SGFzRmxvYXRzKTsKICAgICBM
YXlvdXRVbml0IGxvZ2ljYWxUb3BPZmZzZXQgPSBsb2dpY2FsVG9wKCk7CiAgICAgaWYgKHBhcmVu
dEhhc0Zsb2F0cyB8fCAocGFyZW50QmxvY2subG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tKCkgPiBs
b2dpY2FsVG9wT2Zmc2V0ICYmIHByZXZpb3VzQmxvY2sgJiYgcHJldmlvdXNCbG9jay0+aXNTZWxm
Q29sbGFwc2luZ0Jsb2NrKCkpKQogICAgICAgICBhZGRJbnRydWRpbmdGbG9hdHMoJnBhcmVudEJs
b2NrLCBwYXJlbnRCbG9jay5sb2dpY2FsTGVmdE9mZnNldEZvckNvbnRlbnQoKSwgbG9naWNhbFRv
cE9mZnNldCk7CkBAIC03MDksNyArNzEyLDcgQEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmxheW91
dEJsb2NrQ2hpbGQoUgogCiAgICAgLy8gTm93IGRldGVybWluZSB0aGUgY29ycmVjdCB5cG9zIGJh
c2VkIG9mZiBleGFtaW5hdGlvbiBvZiBjb2xsYXBzaW5nIG1hcmdpbgogICAgIC8vIHZhbHVlcy4K
LSAgICBMYXlvdXRVbml0IGxvZ2ljYWxUb3BCZWZvcmVDbGVhciA9IGNvbGxhcHNlTWFyZ2lucyhj
aGlsZCwgbWFyZ2luSW5mbyk7CisgICAgTGF5b3V0VW5pdCBsb2dpY2FsVG9wQmVmb3JlQ2xlYXIg
PSBjb2xsYXBzZU1hcmdpbnMoJmNoaWxkLCBjaGlsZC5wcmV2aW91c1NpYmxpbmcoKSwgbWFyZ2lu
SW5mbyk7CiAKICAgICAvLyBOb3cgY2hlY2sgZm9yIGNsZWFyLgogICAgIExheW91dFVuaXQgbG9n
aWNhbFRvcEFmdGVyQ2xlYXIgPSBjbGVhckZsb2F0c0lmTmVlZGVkKGNoaWxkLCBtYXJnaW5JbmZv
LCBvbGRQb3NNYXJnaW5CZWZvcmUsIG9sZE5lZ01hcmdpbkJlZm9yZSwgbG9naWNhbFRvcEJlZm9y
ZUNsZWFyKTsKQEAgLTk0MiwxNyArOTQ1LDE3IEBAIFJlbmRlckJsb2NrRmxvdzo6TWFyZ2luVmFs
dWVzIFJlbmRlckJsb2MKICAgICByZXR1cm4gTWFyZ2luVmFsdWVzKGNoaWxkQmVmb3JlUG9zaXRp
dmUsIGNoaWxkQmVmb3JlTmVnYXRpdmUsIGNoaWxkQWZ0ZXJQb3NpdGl2ZSwgY2hpbGRBZnRlck5l
Z2F0aXZlKTsKIH0KIAotTGF5b3V0VW5pdCBSZW5kZXJCbG9ja0Zsb3c6OmNvbGxhcHNlTWFyZ2lu
cyhSZW5kZXJCb3gmIGNoaWxkLCBNYXJnaW5JbmZvJiBtYXJnaW5JbmZvKQorTGF5b3V0VW5pdCBS
ZW5kZXJCbG9ja0Zsb3c6OmNvbGxhcHNlTWFyZ2lucyhSZW5kZXJCb3gqIGNoaWxkLCBSZW5kZXJP
YmplY3QqIHByZXYsIE1hcmdpbkluZm8mIG1hcmdpbkluZm8pCiB7Ci0gICAgYm9vbCBjaGlsZERp
c2NhcmRNYXJnaW5CZWZvcmUgPSBtdXN0RGlzY2FyZE1hcmdpbkJlZm9yZUZvckNoaWxkKGNoaWxk
KTsKLSAgICBib29sIGNoaWxkRGlzY2FyZE1hcmdpbkFmdGVyID0gbXVzdERpc2NhcmRNYXJnaW5B
ZnRlckZvckNoaWxkKGNoaWxkKTsKLSAgICBib29sIGNoaWxkSXNTZWxmQ29sbGFwc2luZyA9IGNo
aWxkLmlzU2VsZkNvbGxhcHNpbmdCbG9jaygpOworICAgIGJvb2wgY2hpbGREaXNjYXJkTWFyZ2lu
QmVmb3JlID0gY2hpbGQgPyBtdXN0RGlzY2FyZE1hcmdpbkJlZm9yZUZvckNoaWxkKCpjaGlsZCkg
OiBmYWxzZTsKKyAgICBib29sIGNoaWxkRGlzY2FyZE1hcmdpbkFmdGVyID0gY2hpbGQgPyBtdXN0
RGlzY2FyZE1hcmdpbkFmdGVyRm9yQ2hpbGQoKmNoaWxkKSA6IGZhbHNlOworICAgIGJvb2wgY2hp
bGRJc1NlbGZDb2xsYXBzaW5nID0gY2hpbGQgPyBjaGlsZC0+aXNTZWxmQ29sbGFwc2luZ0Jsb2Nr
KCkgOiBmYWxzZTsKIAogICAgIC8vIFRoZSBjaGlsZCBkaXNjYXJkcyB0aGUgYmVmb3JlIG1hcmdp
biB3aGVuIHRoZSB0aGUgYWZ0ZXIgbWFyZ2luIGhhcyBkaXNjYXJkIGluIHRoZSBjYXNlIG9mIGEg
c2VsZiBjb2xsYXBzaW5nIGJsb2NrLgogICAgIGNoaWxkRGlzY2FyZE1hcmdpbkJlZm9yZSA9IGNo
aWxkRGlzY2FyZE1hcmdpbkJlZm9yZSB8fCAoY2hpbGREaXNjYXJkTWFyZ2luQWZ0ZXIgJiYgY2hp
bGRJc1NlbGZDb2xsYXBzaW5nKTsKIAogICAgIC8vIEdldCB0aGUgZm91ciBtYXJnaW4gdmFsdWVz
IGZvciB0aGUgY2hpbGQgYW5kIGNhY2hlIHRoZW0uCi0gICAgY29uc3QgTWFyZ2luVmFsdWVzIGNo
aWxkTWFyZ2lucyA9IG1hcmdpblZhbHVlc0ZvckNoaWxkKGNoaWxkKTsKKyAgICBjb25zdCBNYXJn
aW5WYWx1ZXMgY2hpbGRNYXJnaW5zID0gY2hpbGQgPyBtYXJnaW5WYWx1ZXNGb3JDaGlsZCgqY2hp
bGQpIDogTWFyZ2luVmFsdWVzKDAsIDAsIDAsIDApOwogCiAgICAgLy8gR2V0IG91ciBtYXggcG9z
IGFuZCBuZWcgdG9wIG1hcmdpbnMuCiAgICAgTGF5b3V0VW5pdCBwb3NUb3AgPSBjaGlsZE1hcmdp
bnMucG9zaXRpdmVNYXJnaW5CZWZvcmUoKTsKQEAgLTk2Nyw3ICs5NzAsNyBAQCBMYXlvdXRVbml0
IFJlbmRlckJsb2NrRmxvdzo6Y29sbGFwc2VNYXJnCiAgICAgCiAgICAgLy8gU2VlIGlmIHRoZSB0
b3AgbWFyZ2luIGlzIHF1aXJreS4gV2Ugb25seSBjYXJlIGlmIHRoaXMgY2hpbGQgaGFzCiAgICAg
Ly8gbWFyZ2lucyB0aGF0IHdpbGwgY29sbGFwc2Ugd2l0aCB1cy4KLSAgICBib29sIHRvcFF1aXJr
ID0gaGFzTWFyZ2luQmVmb3JlUXVpcmsoY2hpbGQpOworICAgIGJvb2wgdG9wUXVpcmsgPSBjaGls
ZCA/IGhhc01hcmdpbkJlZm9yZVF1aXJrKCpjaGlsZCkgOiBmYWxzZTsKIAogICAgIGlmIChtYXJn
aW5JbmZvLmNhbkNvbGxhcHNlV2l0aE1hcmdpbkJlZm9yZSgpKSB7CiAgICAgICAgIGlmICghY2hp
bGREaXNjYXJkTWFyZ2luQmVmb3JlICYmICFtYXJnaW5JbmZvLmRpc2NhcmRNYXJnaW4oKSkgewpA
QCAtMTAxMSw3ICsxMDE0LDcgQEAgTGF5b3V0VW5pdCBSZW5kZXJCbG9ja0Zsb3c6OmNvbGxhcHNl
TWFyZwogICAgIExheW91dFVuaXQgbG9naWNhbFRvcCA9IGJlZm9yZUNvbGxhcHNlTG9naWNhbFRv
cDsKIAogICAgIExheW91dFVuaXQgY2xlYXJhbmNlRm9yU2VsZkNvbGxhcHNpbmdCbG9jazsKLSAg
ICBSZW5kZXJPYmplY3QqIHByZXYgPSBjaGlsZC5wcmV2aW91c1NpYmxpbmcoKTsKKyAgICAKICAg
ICAvLyBJZiB0aGUgY2hpbGQncyBwcmV2aW91cyBzaWJsaW5nIGlzIGEgc2VsZi1jb2xsYXBzaW5n
IGJsb2NrIHRoYXQgY2xlYXJlZCBhIGZsb2F0IHRoZW4gaXRzIHRvcCBib3JkZXIgZWRnZSBoYXMg
YmVlbiBzZXQgYXQgdGhlIGJvdHRvbSBib3JkZXIgZWRnZQogICAgIC8vIG9mIHRoZSBmbG9hdC4g
U2luY2Ugd2Ugd2FudCB0byBjb2xsYXBzZSB0aGUgY2hpbGQncyB0b3AgbWFyZ2luIHdpdGggdGhl
IHNlbGYtY29sbGFwc2luZyBibG9jaydzIHRvcCBhbmQgYm90dG9tIG1hcmdpbnMgd2UgbmVlZCB0
byBhZGp1c3Qgb3VyIHBhcmVudCdzIGhlaWdodCB0byBtYXRjaCB0aGUgCiAgICAgLy8gbWFyZ2lu
IHRvcCBvZiB0aGUgc2VsZi1jb2xsYXBzaW5nIGJsb2NrLiBJZiB0aGUgcmVzdWx0aW5nIGNvbGxh
cHNlZCBtYXJnaW4gbGVhdmVzIHRoZSBjaGlsZCBzdGlsbCBpbnRydWRpbmcgaW50byB0aGUgZmxv
YXQgdGhlbiB3ZSB3aWxsIHdhbnQgdG8gY2xlYXIgaXQuCkBAIC0xMDQ0LDEzICsxMDQ3LDEzIEBA
IExheW91dFVuaXQgUmVuZGVyQmxvY2tGbG93Ojpjb2xsYXBzZU1hcmcKICAgICAgICAgICAgICAg
ICBsb2dpY2FsVG9wID0gbG9naWNhbEhlaWdodCgpICsgY29sbGFwc2VkQmVmb3JlUG9zIC0gY29s
bGFwc2VkQmVmb3JlTmVnOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG11
c3RTZXBhcmF0ZU1hcmdpbkJlZm9yZUZvckNoaWxkKGNoaWxkKSkgeworICAgICAgICBpZiAoY2hp
bGQgJiYgbXVzdFNlcGFyYXRlTWFyZ2luQmVmb3JlRm9yQ2hpbGQoKmNoaWxkKSkgewogICAgICAg
ICAgICAgQVNTRVJUKCFtYXJnaW5JbmZvLmRpc2NhcmRNYXJnaW4oKSB8fCAobWFyZ2luSW5mby5k
aXNjYXJkTWFyZ2luKCkgJiYgIW1hcmdpbkluZm8ubWFyZ2luKCkpKTsKICAgICAgICAgICAgIC8v
IElmIHdlIGFyZSBhdCB0aGUgYmVmb3JlIHNpZGUgb2YgdGhlIGJsb2NrIGFuZCB3ZSBjb2xsYXBz
ZSwgaWdub3JlIHRoZSBjb21wdXRlZCBtYXJnaW4KICAgICAgICAgICAgIC8vIGFuZCBqdXN0IGFk
ZCB0aGUgY2hpbGQgbWFyZ2luIHRvIHRoZSBjb250YWluZXIgaGVpZ2h0LiBUaGlzIHdpbGwgY29y
cmVjdGx5IHBvc2l0aW9uCiAgICAgICAgICAgICAvLyB0aGUgY2hpbGQgaW5zaWRlIHRoZSBjb250
YWluZXIuCiAgICAgICAgICAgICBMYXlvdXRVbml0IHNlcGFyYXRlTWFyZ2luID0gIW1hcmdpbklu
Zm8uY2FuQ29sbGFwc2VXaXRoTWFyZ2luQmVmb3JlKCkgPyBtYXJnaW5JbmZvLm1hcmdpbigpIDog
TGF5b3V0VW5pdDo6ZnJvbVBpeGVsKDApOwotICAgICAgICAgICAgc2V0TG9naWNhbEhlaWdodChs
b2dpY2FsSGVpZ2h0KCkgKyBzZXBhcmF0ZU1hcmdpbiArIG1hcmdpbkJlZm9yZUZvckNoaWxkKGNo
aWxkKSk7CisgICAgICAgICAgICBzZXRMb2dpY2FsSGVpZ2h0KGxvZ2ljYWxIZWlnaHQoKSArIHNl
cGFyYXRlTWFyZ2luICsgbWFyZ2luQmVmb3JlRm9yQ2hpbGQoKmNoaWxkKSk7CiAgICAgICAgICAg
ICBsb2dpY2FsVG9wID0gbG9naWNhbEhlaWdodCgpOwogICAgICAgICB9IGVsc2UgaWYgKCFtYXJn
aW5JbmZvLmRpc2NhcmRNYXJnaW4oKSAmJiAoIW1hcmdpbkluZm8uYXRCZWZvcmVTaWRlT2ZCbG9j
aygpCiAgICAgICAgICAgICB8fCAoIW1hcmdpbkluZm8uY2FuQ29sbGFwc2VNYXJnaW5CZWZvcmVX
aXRoQ2hpbGRyZW4oKQpAQCAtMTA3MCw3ICsxMDczLDcgQEAgTGF5b3V0VW5pdCBSZW5kZXJCbG9j
a0Zsb3c6OmNvbGxhcHNlTWFyZwogICAgICAgICAgICAgbWFyZ2luSW5mby5jbGVhck1hcmdpbigp
OwogCiAgICAgICAgIGlmIChtYXJnaW5JbmZvLm1hcmdpbigpKQotICAgICAgICAgICAgbWFyZ2lu
SW5mby5zZXRIYXNNYXJnaW5BZnRlclF1aXJrKGhhc01hcmdpbkFmdGVyUXVpcmsoY2hpbGQpKTsK
KyAgICAgICAgICAgIG1hcmdpbkluZm8uc2V0SGFzTWFyZ2luQWZ0ZXJRdWlyayhjaGlsZCAmJiBo
YXNNYXJnaW5BZnRlclF1aXJrKCpjaGlsZCkpOwogICAgIH0KICAgICAKICAgICAvLyBJZiBtYXJn
aW5zIHdvdWxkIHB1bGwgdXMgcGFzdCB0aGUgdG9wIG9mIHRoZSBuZXh0IHBhZ2UsIHRoZW4gd2Ug
bmVlZCB0byBwdWxsIGJhY2sgYW5kIHByZXRlbmQgbGlrZSB0aGUgbWFyZ2lucwpAQCAtMTA5Nyw4
ICsxMTAwLDggQEAgTGF5b3V0VW5pdCBSZW5kZXJCbG9ja0Zsb3c6OmNvbGxhcHNlTWFyZwogICAg
ICAgICAvLyBpbnRvIHRoZSBtYXJnaW4gYXJlYSBvZiB0aGUgc2VsZi1jb2xsYXBzaW5nIGJsb2Nr
IHRoZW4gdGhlIGZsb2F0IGl0IGNsZWFycyBpcyBub3cgaW50cnVkaW5nIGludG8gfGNoaWxkfC4g
TGF5b3V0IGFnYWluIHNvIHRoYXQgd2UgY2FuIGxvb2sgZm9yCiAgICAgICAgIC8vIGZsb2F0cyBp
biB0aGUgcGFyZW50IHRoYXQgb3ZlcmhhbmcgfGNoaWxkfCdzIG5ldyBsb2dpY2FsIHRvcC4KICAg
ICAgICAgYm9vbCBsb2dpY2FsVG9wSW50cnVkZXNJbnRvRmxvYXQgPSBjbGVhcmFuY2VGb3JTZWxm
Q29sbGFwc2luZ0Jsb2NrID4gMCAmJiBsb2dpY2FsVG9wIDwgYmVmb3JlQ29sbGFwc2VMb2dpY2Fs
VG9wOwotICAgICAgICBpZiAobG9naWNhbFRvcEludHJ1ZGVzSW50b0Zsb2F0ICYmIGNvbnRhaW5z
RmxvYXRzKCkgJiYgIWNoaWxkLmF2b2lkc0Zsb2F0cygpICYmIGxvd2VzdEZsb2F0TG9naWNhbEJv
dHRvbSgpID4gbG9naWNhbFRvcCkKLSAgICAgICAgICAgIGNoaWxkLnNldE5lZWRzTGF5b3V0KCk7
CisgICAgICAgIGlmIChsb2dpY2FsVG9wSW50cnVkZXNJbnRvRmxvYXQgJiYgY29udGFpbnNGbG9h
dHMoKSAmJiAhY2hpbGQtPmF2b2lkc0Zsb2F0cygpICYmIGxvd2VzdEZsb2F0TG9naWNhbEJvdHRv
bSgpID4gbG9naWNhbFRvcCkKKyAgICAgICAgICAgIGNoaWxkLT5zZXROZWVkc0xheW91dCgpOwog
ICAgIH0KIAogICAgIHJldHVybiBsb2dpY2FsVG9wOwpAQCAtMjY5NCw3ICsyNjk3LDkgQEAgdm9p
ZCBSZW5kZXJCbG9ja0Zsb3c6OmFkZEludHJ1ZGluZ0Zsb2F0cwogICAgICAgICByZXR1cm47CiAK
ICAgICBsb2dpY2FsTGVmdE9mZnNldCArPSBtYXJnaW5Mb2dpY2FsTGVmdCgpOwotCisgICAgCisg
ICAgUmVuZGVyQmxvY2sqIGNiID0gY29udGFpbmluZ0Jsb2NrKCk7CisgICAgCiAgICAgY29uc3Qg
RmxvYXRpbmdPYmplY3RTZXQmIHByZXZTZXQgPSBwcmV2LT5tX2Zsb2F0aW5nT2JqZWN0cy0+c2V0
KCk7CiAgICAgYXV0byBwcmV2RW5kID0gcHJldlNldC5lbmQoKTsKICAgICBmb3IgKGF1dG8gcHJl
dkl0ID0gcHJldlNldC5iZWdpbigpOyBwcmV2SXQgIT0gcHJldkVuZDsgKytwcmV2SXQpIHsKQEAg
LTI3MTEsOCArMjcxNiw4IEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93OjphZGRJbnRydWRpbmdGbG9h
dHMKICAgICAgICAgICAgICAgICAvLyBpbnRvIGFjY291bnQuIE9ubHkgYXBwbHkgdGhpcyBjb2Rl
IGlmIHByZXYgaXMgdGhlIHBhcmVudCwgc2luY2Ugb3RoZXJ3aXNlIHRoZSBsZWZ0IG1hcmdpbgog
ICAgICAgICAgICAgICAgIC8vIHdpbGwgZ2V0IGFwcGxpZWQgdHdpY2UuCiAgICAgICAgICAgICAg
ICAgTGF5b3V0U2l6ZSBvZmZzZXQgPSBpc0hvcml6b250YWxXcml0aW5nTW9kZSgpCi0gICAgICAg
ICAgICAgICAgICAgID8gTGF5b3V0U2l6ZShsb2dpY2FsTGVmdE9mZnNldCAtIChwcmV2ICE9IHBh
cmVudCgpID8gcHJldi0+bWFyZ2luTGVmdCgpIDogTGF5b3V0VW5pdCgpKSwgbG9naWNhbFRvcE9m
ZnNldCkKLSAgICAgICAgICAgICAgICAgICAgOiBMYXlvdXRTaXplKGxvZ2ljYWxUb3BPZmZzZXQs
IGxvZ2ljYWxMZWZ0T2Zmc2V0IC0gKHByZXYgIT0gcGFyZW50KCkgPyBwcmV2LT5tYXJnaW5Ub3Ao
KSA6IExheW91dFVuaXQoKSkpOworICAgICAgICAgICAgICAgICAgICA/IExheW91dFNpemUobG9n
aWNhbExlZnRPZmZzZXQgLSAocHJldiAhPSBjYiA/IHByZXYtPm1hcmdpbkxlZnQoKSA6IExheW91
dFVuaXQoKSksIGxvZ2ljYWxUb3BPZmZzZXQpCisgICAgICAgICAgICAgICAgICAgIDogTGF5b3V0
U2l6ZShsb2dpY2FsVG9wT2Zmc2V0LCBsb2dpY2FsTGVmdE9mZnNldCAtIChwcmV2ICE9IGNiID8g
cHJldi0+bWFyZ2luVG9wKCkgOiBMYXlvdXRVbml0KCkpKTsKIAogICAgICAgICAgICAgICAgIG1f
ZmxvYXRpbmdPYmplY3RzLT5hZGQoZmxvYXRpbmdPYmplY3QtPmNvcHlUb05ld0NvbnRhaW5lcihv
ZmZzZXQpKTsKICAgICAgICAgICAgIH0KQEAgLTI3MzAsNyArMjczNSwxNiBAQCB2b2lkIFJlbmRl
ckJsb2NrRmxvdzo6bWFya0FsbERlc2NlbmRhbnRzCiAKICAgICBpZiAoZmxvYXRUb1JlbW92ZSkK
ICAgICAgICAgcmVtb3ZlRmxvYXRpbmdPYmplY3QoKmZsb2F0VG9SZW1vdmUpOwotCisgICAgCisg
ICAgaWYgKGNoaWxkcmVuSW5saW5lKCkpIHsKKyAgICAgICAgZm9yIChSb290SW5saW5lQm94KiBi
b3ggPSBmaXJzdFJvb3RCb3goKTsgYm94OyBib3ggPSBib3gtPm5leHRSb290Qm94KCkpIHsKKyAg
ICAgICAgICAgIFJlbmRlckJsb2NrRmxvdyogY2hpbGRCbG9jayA9IGJveC0+YW5vbnltb3VzSW5s
aW5lQmxvY2soKTsKKyAgICAgICAgICAgIGlmIChjaGlsZEJsb2NrICYmIChmbG9hdFRvUmVtb3Zl
ID8gY2hpbGRCbG9jay0+Y29udGFpbnNGbG9hdCgqZmxvYXRUb1JlbW92ZSkgOiBjaGlsZEJsb2Nr
LT5jb250YWluc0Zsb2F0cygpKSkKKyAgICAgICAgICAgICAgICBjaGlsZEJsb2NrLT5tYXJrQWxs
RGVzY2VuZGFudHNXaXRoRmxvYXRzRm9yTGF5b3V0KGZsb2F0VG9SZW1vdmUsIGluTGF5b3V0KTsK
KyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorIAogICAgIC8vIEl0ZXJhdGUgb3Zl
ciBvdXIgYmxvY2sgY2hpbGRyZW4gYW5kIG1hcmsgdGhlbSBhcyBuZWVkZWQuCiAgICAgZm9yIChh
dXRvJiBibG9jayA6IGNoaWxkcmVuT2ZUeXBlPFJlbmRlckJsb2NrPigqdGhpcykpIHsKICAgICAg
ICAgaWYgKCFmbG9hdFRvUmVtb3ZlICYmIGJsb2NrLmlzRmxvYXRpbmdPck91dE9mRmxvd1Bvc2l0
aW9uZWQoKSkKQEAgLTI3NTMsNyArMjc2Nyw3IEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93OjptYXJr
U2libGluZ3NXaXRoRmwKIAogICAgIGNvbnN0IEZsb2F0aW5nT2JqZWN0U2V0JiBmbG9hdGluZ09i
amVjdFNldCA9IG1fZmxvYXRpbmdPYmplY3RzLT5zZXQoKTsKICAgICBhdXRvIGVuZCA9IGZsb2F0
aW5nT2JqZWN0U2V0LmVuZCgpOwotCisgICAgCiAgICAgZm9yIChSZW5kZXJPYmplY3QqIG5leHQg
PSBuZXh0U2libGluZygpOyBuZXh0OyBuZXh0ID0gbmV4dC0+bmV4dFNpYmxpbmcoKSkgewogICAg
ICAgICBpZiAoIWlzPFJlbmRlckJsb2NrRmxvdz4oKm5leHQpIHx8IG5leHQtPmlzRmxvYXRpbmdP
ck91dE9mRmxvd1Bvc2l0aW9uZWQoKSB8fCBkb3duY2FzdDxSZW5kZXJCbG9ja0Zsb3c+KCpuZXh0
KS5hdm9pZHNGbG9hdHMoKSkKICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtMzA2MiwyMiArMzA3
NiwzNyBAQCBHYXBSZWN0cyBSZW5kZXJCbG9ja0Zsb3c6OmlubGluZVNlbGVjdGlvCiAgICAgUm9v
dElubGluZUJveCogbGFzdFNlbGVjdGVkTGluZSA9IDA7CiAgICAgUm9vdElubGluZUJveCogY3Vy
cjsKICAgICBmb3IgKGN1cnIgPSBmaXJzdFJvb3RCb3goKTsgY3VyciAmJiAhY3Vyci0+aGFzU2Vs
ZWN0ZWRDaGlsZHJlbigpOyBjdXJyID0gY3Vyci0+bmV4dFJvb3RCb3goKSkgeyB9CisgICAgCisg
ICAgTG9naWNhbFNlbGVjdGlvbk9mZnNldENhY2hlcyBjaGlsZENhY2hlKCp0aGlzLCBjYWNoZSk7
CiAKICAgICAvLyBOb3cgcGFpbnQgdGhlIGdhcHMgZm9yIHRoZSBsaW5lcy4KLSAgICBmb3IgKDsg
Y3VyciAmJiBjdXJyLT5oYXNTZWxlY3RlZENoaWxkcmVuKCk7IGN1cnIgPSBjdXJyLT5uZXh0Um9v
dEJveCgpKSB7CisgICAgZm9yICg7IGN1cnIgJiYgKGN1cnItPmhhc1NlbGVjdGVkQ2hpbGRyZW4o
KSB8fCBjdXJyLT5oYXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKTsgY3VyciA9IGN1cnItPm5leHRS
b290Qm94KCkpIHsKKyAgICAgICAgaWYgKCFjdXJyLT5oYXNTZWxlY3RlZENoaWxkcmVuKCkpCisg
ICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgTGF5b3V0VW5pdCBzZWxUb3AgPSAgY3Vyci0+
c2VsZWN0aW9uVG9wQWRqdXN0ZWRGb3JQcmVjZWRpbmdCbG9jaygpOwogICAgICAgICBMYXlvdXRV
bml0IHNlbEhlaWdodCA9IGN1cnItPnNlbGVjdGlvbkhlaWdodEFkanVzdGVkRm9yUHJlY2VkaW5n
QmxvY2soKTsKIAotICAgICAgICBpZiAoIWNvbnRhaW5zU3RhcnQgJiYgIWxhc3RTZWxlY3RlZExp
bmUgJiYKLSAgICAgICAgICAgIHNlbGVjdGlvblN0YXRlKCkgIT0gU2VsZWN0aW9uU3RhcnQgJiYg
c2VsZWN0aW9uU3RhdGUoKSAhPSBTZWxlY3Rpb25Cb3RoICYmICFpc1J1YnlCYXNlKCkpCi0gICAg
ICAgICAgICByZXN1bHQudW5pdGVDZW50ZXIoYmxvY2tTZWxlY3Rpb25HYXAocm9vdEJsb2NrLCBy
b290QmxvY2tQaHlzaWNhbFBvc2l0aW9uLCBvZmZzZXRGcm9tUm9vdEJsb2NrLCBsYXN0TG9naWNh
bFRvcCwgbGFzdExvZ2ljYWxMZWZ0LCBsYXN0TG9naWNhbFJpZ2h0LCBzZWxUb3AsIGNhY2hlLCBw
YWludEluZm8pKTsKLSAgICAgICAgCi0gICAgICAgIExheW91dFJlY3QgbG9naWNhbFJlY3QoY3Vy
ci0+bG9naWNhbExlZnQoKSwgc2VsVG9wLCBjdXJyLT5sb2dpY2FsV2lkdGgoKSwgc2VsVG9wICsg
c2VsSGVpZ2h0KTsKLSAgICAgICAgbG9naWNhbFJlY3QubW92ZShpc0hvcml6b250YWxXcml0aW5n
TW9kZSgpID8gb2Zmc2V0RnJvbVJvb3RCbG9jayA6IG9mZnNldEZyb21Sb290QmxvY2sudHJhbnNw
b3NlZFNpemUoKSk7Ci0gICAgICAgIExheW91dFJlY3QgcGh5c2ljYWxSZWN0ID0gcm9vdEJsb2Nr
LmxvZ2ljYWxSZWN0VG9QaHlzaWNhbFJlY3Qocm9vdEJsb2NrUGh5c2ljYWxQb3NpdGlvbiwgbG9n
aWNhbFJlY3QpOwotICAgICAgICBpZiAoIXBhaW50SW5mbyB8fCAoaXNIb3Jpem9udGFsV3JpdGlu
Z01vZGUoKSAmJiBwaHlzaWNhbFJlY3QueSgpIDwgcGFpbnRJbmZvLT5yZWN0Lm1heFkoKSAmJiBw
aHlzaWNhbFJlY3QubWF4WSgpID4gcGFpbnRJbmZvLT5yZWN0LnkoKSkKLSAgICAgICAgICAgIHx8
ICghaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSAmJiBwaHlzaWNhbFJlY3QueCgpIDwgcGFpbnRJ
bmZvLT5yZWN0Lm1heFgoKSAmJiBwaHlzaWNhbFJlY3QubWF4WCgpID4gcGFpbnRJbmZvLT5yZWN0
LngoKSkpCi0gICAgICAgICAgICByZXN1bHQudW5pdGUoY3Vyci0+bGluZVNlbGVjdGlvbkdhcChy
b290QmxvY2ssIHJvb3RCbG9ja1BoeXNpY2FsUG9zaXRpb24sIG9mZnNldEZyb21Sb290QmxvY2ss
IHNlbFRvcCwgc2VsSGVpZ2h0LCBjYWNoZSwgcGFpbnRJbmZvKSk7CisgICAgICAgIGlmIChjdXJy
LT5oYXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpKSB7CisgICAgICAgICAgICBpZiAobGFzdFNlbGVj
dGVkTGluZSkgeworICAgICAgICAgICAgICAgIGxhc3RMb2dpY2FsVG9wID0gYmxvY2tEaXJlY3Rp
b25PZmZzZXQocm9vdEJsb2NrLCBvZmZzZXRGcm9tUm9vdEJsb2NrKSArIGxhc3RTZWxlY3RlZExp
bmUtPnNlbGVjdGlvbkJvdHRvbSgpOworICAgICAgICAgICAgICAgIGxhc3RMb2dpY2FsTGVmdCA9
IGxvZ2ljYWxMZWZ0U2VsZWN0aW9uT2Zmc2V0KHJvb3RCbG9jaywgbGFzdFNlbGVjdGVkTGluZS0+
c2VsZWN0aW9uQm90dG9tKCksIGNhY2hlKTsKKyAgICAgICAgICAgICAgICBsYXN0TG9naWNhbFJp
Z2h0ID0gbG9naWNhbFJpZ2h0U2VsZWN0aW9uT2Zmc2V0KHJvb3RCbG9jaywgbGFzdFNlbGVjdGVk
TGluZS0+c2VsZWN0aW9uQm90dG9tKCksIGNhY2hlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIGNvbnRhaW5zU3RhcnQgPSBmYWxzZTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmVz
dWx0LnVuaXRlKGN1cnItPmFub255bW91c0lubGluZUJsb2NrKCktPnNlbGVjdGlvbkdhcHMocm9v
dEJsb2NrLCByb290QmxvY2tQaHlzaWNhbFBvc2l0aW9uLCBMYXlvdXRTaXplKG9mZnNldEZyb21S
b290QmxvY2sud2lkdGgoKSArIGN1cnItPmFub255bW91c0lubGluZUJsb2NrKCktPngoKSwgb2Zm
c2V0RnJvbVJvb3RCbG9jay5oZWlnaHQoKSArIGN1cnItPmFub255bW91c0lubGluZUJsb2NrKCkt
PnkoKSksIGxhc3RMb2dpY2FsVG9wLCBsYXN0TG9naWNhbExlZnQsIGxhc3RMb2dpY2FsUmlnaHQs
IGNoaWxkQ2FjaGUsIHBhaW50SW5mbykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAg
aWYgKCFjb250YWluc1N0YXJ0ICYmICghbGFzdFNlbGVjdGVkTGluZSB8fCBsYXN0U2VsZWN0ZWRM
aW5lLT5hbm9ueW1vdXNJbmxpbmVCbG9jaygpKSAmJgorICAgICAgICAgICAgICAgIHNlbGVjdGlv
blN0YXRlKCkgIT0gU2VsZWN0aW9uU3RhcnQgJiYgc2VsZWN0aW9uU3RhdGUoKSAhPSBTZWxlY3Rp
b25Cb3RoICYmICFpc1J1YnlCYXNlKCkpCisgICAgICAgICAgICAgICAgcmVzdWx0LnVuaXRlQ2Vu
dGVyKGJsb2NrU2VsZWN0aW9uR2FwKHJvb3RCbG9jaywgcm9vdEJsb2NrUGh5c2ljYWxQb3NpdGlv
biwgb2Zmc2V0RnJvbVJvb3RCbG9jaywgbGFzdExvZ2ljYWxUb3AsIGxhc3RMb2dpY2FsTGVmdCwg
bGFzdExvZ2ljYWxSaWdodCwgc2VsVG9wLCBjYWNoZSwgcGFpbnRJbmZvKSk7CisgICAgICAgICAg
ICAKKyAgICAgICAgICAgIExheW91dFJlY3QgbG9naWNhbFJlY3QoY3Vyci0+bG9naWNhbExlZnQo
KSwgc2VsVG9wLCBjdXJyLT5sb2dpY2FsV2lkdGgoKSwgc2VsVG9wICsgc2VsSGVpZ2h0KTsKKyAg
ICAgICAgICAgIGxvZ2ljYWxSZWN0Lm1vdmUoaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSA/IG9m
ZnNldEZyb21Sb290QmxvY2sgOiBvZmZzZXRGcm9tUm9vdEJsb2NrLnRyYW5zcG9zZWRTaXplKCkp
OworICAgICAgICAgICAgTGF5b3V0UmVjdCBwaHlzaWNhbFJlY3QgPSByb290QmxvY2subG9naWNh
bFJlY3RUb1BoeXNpY2FsUmVjdChyb290QmxvY2tQaHlzaWNhbFBvc2l0aW9uLCBsb2dpY2FsUmVj
dCk7CisgICAgICAgICAgICBpZiAoIXBhaW50SW5mbyB8fCAoaXNIb3Jpem9udGFsV3JpdGluZ01v
ZGUoKSAmJiBwaHlzaWNhbFJlY3QueSgpIDwgcGFpbnRJbmZvLT5yZWN0Lm1heFkoKSAmJiBwaHlz
aWNhbFJlY3QubWF4WSgpID4gcGFpbnRJbmZvLT5yZWN0LnkoKSkKKyAgICAgICAgICAgICAgICB8
fCAoIWlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkgJiYgcGh5c2ljYWxSZWN0LngoKSA8IHBhaW50
SW5mby0+cmVjdC5tYXhYKCkgJiYgcGh5c2ljYWxSZWN0Lm1heFgoKSA+IHBhaW50SW5mby0+cmVj
dC54KCkpKQorICAgICAgICAgICAgICAgIHJlc3VsdC51bml0ZShjdXJyLT5saW5lU2VsZWN0aW9u
R2FwKHJvb3RCbG9jaywgcm9vdEJsb2NrUGh5c2ljYWxQb3NpdGlvbiwgb2Zmc2V0RnJvbVJvb3RC
bG9jaywgc2VsVG9wLCBzZWxIZWlnaHQsIGNhY2hlLCBwYWludEluZm8pKTsKKyAgICAgICAgfQog
CiAgICAgICAgIGxhc3RTZWxlY3RlZExpbmUgPSBjdXJyOwogICAgIH0KQEAgLTMwODYsOCArMzEx
NSw4IEBAIEdhcFJlY3RzIFJlbmRlckJsb2NrRmxvdzo6aW5saW5lU2VsZWN0aW8KICAgICAgICAg
Ly8gVmlzaWJsZVNlbGVjdGlvbiBtdXN0IHN0YXJ0IGp1c3QgYWZ0ZXIgb3VyIGxhc3QgbGluZS4K
ICAgICAgICAgbGFzdFNlbGVjdGVkTGluZSA9IGxhc3RSb290Qm94KCk7CiAKLSAgICBpZiAobGFz
dFNlbGVjdGVkTGluZSAmJiBzZWxlY3Rpb25TdGF0ZSgpICE9IFNlbGVjdGlvbkVuZCAmJiBzZWxl
Y3Rpb25TdGF0ZSgpICE9IFNlbGVjdGlvbkJvdGgpIHsKLSAgICAgICAgLy8gR28gYWhlYWQgYW5k
IHVwZGF0ZSBvdXIgbGFzdFkgdG8gYmUgdGhlIGJvdHRvbSBvZiB0aGUgbGFzdCBzZWxlY3RlZCBs
aW5lLgorICAgIGlmIChsYXN0U2VsZWN0ZWRMaW5lICYmICFsYXN0U2VsZWN0ZWRMaW5lLT5oYXNB
bm9ueW1vdXNJbmxpbmVCbG9jaygpICYmIHNlbGVjdGlvblN0YXRlKCkgIT0gU2VsZWN0aW9uRW5k
ICYmIHNlbGVjdGlvblN0YXRlKCkgIT0gU2VsZWN0aW9uQm90aCkgeworICAgICAgICAvLyBHbyBh
aGVhZCBhbmQgdXBkYXRlIG91ciBsYXN0TG9naWNhbFRvcCB0byBiZSB0aGUgYm90dG9tIG9mIHRo
ZSBsYXN0IHNlbGVjdGVkIGxpbmUuCiAgICAgICAgIGxhc3RMb2dpY2FsVG9wID0gYmxvY2tEaXJl
Y3Rpb25PZmZzZXQocm9vdEJsb2NrLCBvZmZzZXRGcm9tUm9vdEJsb2NrKSArIGxhc3RTZWxlY3Rl
ZExpbmUtPnNlbGVjdGlvbkJvdHRvbSgpOwogICAgICAgICBsYXN0TG9naWNhbExlZnQgPSBsb2dp
Y2FsTGVmdFNlbGVjdGlvbk9mZnNldChyb290QmxvY2ssIGxhc3RTZWxlY3RlZExpbmUtPnNlbGVj
dGlvbkJvdHRvbSgpLCBjYWNoZSk7CiAgICAgICAgIGxhc3RMb2dpY2FsUmlnaHQgPSBsb2dpY2Fs
UmlnaHRTZWxlY3Rpb25PZmZzZXQocm9vdEJsb2NrLCBsYXN0U2VsZWN0ZWRMaW5lLT5zZWxlY3Rp
b25Cb3R0b20oKSwgY2FjaGUpOwpAQCAtMzMzMCw3ICszMzU5LDE4IEBAIFZpc2libGVQb3NpdGlv
biBSZW5kZXJCbG9ja0Zsb3c6OnBvc2l0aW8KICAgICBmb3IgKFJvb3RJbmxpbmVCb3gqIHJvb3Qg
PSBmaXJzdFJvb3RCb3goKTsgcm9vdDsgcm9vdCA9IHJvb3QtPm5leHRSb290Qm94KCkpIHsKICAg
ICAgICAgaWYgKHJlZ2lvbiAmJiByb290LT5jb250YWluaW5nUmVnaW9uKCkgIT0gcmVnaW9uKQog
ICAgICAgICAgICAgY29udGludWU7Ci0KKyAgICAgICAgCisgICAgICAgIFJlbmRlckJsb2NrKiBj
aGlsZEJsb2NrID0gcm9vdC0+YW5vbnltb3VzSW5saW5lQmxvY2soKTsKKyAgICAgICAgaWYgKGNo
aWxkQmxvY2spIHsKKyAgICAgICAgICAgIGZpcnN0Um9vdEJveFdpdGhDaGlsZHJlbiA9IDA7Cisg
ICAgICAgICAgICBsYXN0Um9vdEJveFdpdGhDaGlsZHJlbiA9IDA7CisgICAgICAgICAgICBMYXlv
dXRVbml0IGNoaWxkTG9naWNhbEJvdHRvbSA9IGxvZ2ljYWxUb3BGb3JDaGlsZCgqY2hpbGRCbG9j
aykgKyBsb2dpY2FsSGVpZ2h0Rm9yQ2hpbGQoKmNoaWxkQmxvY2spOworICAgICAgICAgICAgaWYg
KGNoaWxkQmxvY2stPmxvZ2ljYWxIZWlnaHQoKSAmJiBjaGlsZEJsb2NrLT5zdHlsZSgpLnZpc2li
aWxpdHkoKSA9PSBWSVNJQkxFICYmCisgICAgICAgICAgICAgICAgKChwb2ludEluTG9naWNhbENv
bnRlbnRzLnkoKSA8IGNoaWxkTG9naWNhbEJvdHRvbSkgfHwgKGJsb2Nrc0FyZUZsaXBwZWQgJiYg
cG9pbnRJbkxvZ2ljYWxDb250ZW50cy55KCkgPT0gY2hpbGRMb2dpY2FsQm90dG9tKSkpCisgICAg
ICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uRm9yUG9pbnRSZXNwZWN0aW5nRWRpdGluZ0JvdW5k
YXJpZXMoKnRoaXMsICpjaGlsZEJsb2NrLCBwb2ludEluTG9naWNhbENvbnRlbnRzKTsKKyAgICAg
ICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgCiAgICAgICAgIGlmICghcm9vdC0+Zmlyc3RM
ZWFmQ2hpbGQoKSkKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICBpZiAoIWZpcnN0Um9v
dEJveFdpdGhDaGlsZHJlbikKQEAgLTQxMDksMjAgKzQxNDksMjEgQEAgdm9pZCBSZW5kZXJCbG9j
a0Zsb3c6OmNvbXB1dGVJbmxpbmVQcmVmZQogICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAg
ICAgICAgICAgICAgICBjbGVhclByZXZpb3VzRmxvYXQgPSBmYWxzZTsKIAotICAgICAgICAgICAg
ICAgIGJvb2wgY2FuQnJlYWtSZXBsYWNlZEVsZW1lbnQgPSAhY2hpbGQtPmlzSW1hZ2UoKSB8fCBh
bGxvd0ltYWdlc1RvQnJlYWs7CisgICAgICAgICAgICAgICAgYm9vbCBjYW5CcmVha1JlcGxhY2Vk
RWxlbWVudCA9ICFjaGlsZC0+aXNJbWFnZSgpIHx8IGFsbG93SW1hZ2VzVG9CcmVhayB8fCBjaGls
ZC0+aXNBbm9ueW1vdXNJbmxpbmVCbG9jaygpOwogICAgICAgICAgICAgICAgIGlmICgoY2FuQnJl
YWtSZXBsYWNlZEVsZW1lbnQgJiYgKGF1dG9XcmFwIHx8IG9sZEF1dG9XcmFwKSAmJiAoIWlzUHJl
dkNoaWxkSW5saW5lRmxvdyB8fCBzaG91bGRCcmVha0xpbmVBZnRlclRleHQpKSB8fCBjbGVhclBy
ZXZpb3VzRmxvYXQpIHsKICAgICAgICAgICAgICAgICAgICAgbWluTG9naWNhbFdpZHRoID0gcHJl
ZmVycmVkV2lkdGgobWluTG9naWNhbFdpZHRoLCBpbmxpbmVNaW4pOwogICAgICAgICAgICAgICAg
ICAgICBpbmxpbmVNaW4gPSAwOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAg
IC8vIElmIHdlJ3JlIHN1cHBvc2VkIHRvIGNsZWFyIHRoZSBwcmV2aW91cyBmbG9hdCwgdGhlbiB0
ZXJtaW5hdGUgbWF4d2lkdGggYXMgd2VsbC4KLSAgICAgICAgICAgICAgICBpZiAoY2xlYXJQcmV2
aW91c0Zsb2F0KSB7CisgICAgICAgICAgICAgICAgLy8gQWxzbyBkbyB0aGlzIGZvciBhbm9ueW1v
dXMgaW5saW5lIGJsb2Nrcy4KKyAgICAgICAgICAgICAgICBpZiAoY2xlYXJQcmV2aW91c0Zsb2F0
IHx8IGNoaWxkLT5pc0Fub255bW91c0lubGluZUJsb2NrKCkpIHsKICAgICAgICAgICAgICAgICAg
ICAgbWF4TG9naWNhbFdpZHRoID0gcHJlZmVycmVkV2lkdGgobWF4TG9naWNhbFdpZHRoLCBpbmxp
bmVNYXgpOwogICAgICAgICAgICAgICAgICAgICBpbmxpbmVNYXggPSAwOwogICAgICAgICAgICAg
ICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIEFkZCBpbiB0ZXh0LWluZGVudC4gVGhpcyBpcyBh
ZGRlZCBpbiBvbmx5IG9uY2UuCi0gICAgICAgICAgICAgICAgaWYgKCFhZGRlZFRleHRJbmRlbnQg
JiYgIWNoaWxkLT5pc0Zsb2F0aW5nKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWFkZGVkVGV4
dEluZGVudCAmJiAhY2hpbGQtPmlzRmxvYXRpbmcoKSAmJiAhY2hpbGQtPmlzQW5vbnltb3VzSW5s
aW5lQmxvY2soKSkgewogICAgICAgICAgICAgICAgICAgICBMYXlvdXRVbml0IGNlaWxlZEluZGVu
dCA9IHRleHRJbmRlbnQuY2VpbFRvRmxvYXQoKTsKICAgICAgICAgICAgICAgICAgICAgY2hpbGRN
aW4gKz0gY2VpbGVkSW5kZW50OwogICAgICAgICAgICAgICAgICAgICBjaGlsZE1heCArPSBjZWls
ZWRJbmRlbnQ7CkBAIC00MTM2LDcgKzQxNzcsOCBAQCB2b2lkIFJlbmRlckJsb2NrRmxvdzo6Y29t
cHV0ZUlubGluZVByZWZlCiAgICAgICAgICAgICAgICAgLy8gQWRkIG91ciB3aWR0aCB0byB0aGUg
bWF4LgogICAgICAgICAgICAgICAgIGlubGluZU1heCArPSBzdGQ6Om1heDxmbG9hdD4oMCwgY2hp
bGRNYXgpOwogCi0gICAgICAgICAgICAgICAgaWYgKCFhdXRvV3JhcCB8fCAhY2FuQnJlYWtSZXBs
YWNlZEVsZW1lbnQgfHwgKGlzUHJldkNoaWxkSW5saW5lRmxvdyAmJiAhc2hvdWxkQnJlYWtMaW5l
QWZ0ZXJUZXh0KSkgeworICAgICAgICAgICAgICAgIGlmICgoIWF1dG9XcmFwIHx8ICFjYW5CcmVh
a1JlcGxhY2VkRWxlbWVudCB8fCAoaXNQcmV2Q2hpbGRJbmxpbmVGbG93ICYmICFzaG91bGRCcmVh
a0xpbmVBZnRlclRleHQpKQorICAgICAgICAgICAgICAgICAgICAmJiAhY2hpbGQtPmlzQW5vbnlt
b3VzSW5saW5lQmxvY2soKSkgewogICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQtPmlzRmxv
YXRpbmcoKSkKICAgICAgICAgICAgICAgICAgICAgICAgIG1pbkxvZ2ljYWxXaWR0aCA9IHByZWZl
cnJlZFdpZHRoKG1pbkxvZ2ljYWxXaWR0aCwgY2hpbGRNaW4pOwogICAgICAgICAgICAgICAgICAg
ICBlbHNlCkBAIC00MTQ3LDYgKzQxODksMTIgQEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmNvbXB1
dGVJbmxpbmVQcmVmZQogCiAgICAgICAgICAgICAgICAgICAgIC8vIE5vdyBzdGFydCBhIG5ldyBs
aW5lLgogICAgICAgICAgICAgICAgICAgICBpbmxpbmVNaW4gPSAwOworICAgICAgICAgICAgICAg
ICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLT5pc0Fub255bW91c0lubGluZUJs
b2NrKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRlcm1pbmF0ZSBtYXggd2lkdGgg
YXMgd2VsbC4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1heExvZ2ljYWxXaWR0aCA9IHByZWZl
cnJlZFdpZHRoKG1heExvZ2ljYWxXaWR0aCwgY2hpbGRNYXgpOworICAgICAgICAgICAgICAgICAg
ICAgICAgaW5saW5lTWF4ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAg
ICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChhdXRvV3JhcCAmJiBjYW5CcmVha1JlcGxhY2Vk
RWxlbWVudCAmJiBpc1ByZXZDaGlsZElubGluZUZsb3cpIHsKSW5kZXg6IFNvdXJjZS9XZWJDb3Jl
L3JlbmRlcmluZy9SZW5kZXJCbG9ja0Zsb3cuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tGbG93LmgJKHJldmlzaW9uIDE4MTMyOSkKKysrIFNvdXJj
ZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0Zsb3cuaAkod29ya2luZyBjb3B5KQpAQCAt
MjQ4LDcgKzI0OCw3IEBAIHB1YmxpYzoKICAgICB2b2lkIHNldFN0YXRpY0lubGluZVBvc2l0aW9u
Rm9yQ2hpbGQoUmVuZGVyQm94JiBjaGlsZCwgTGF5b3V0VW5pdCBibG9ja09mZnNldCwgTGF5b3V0
VW5pdCBpbmxpbmVQb3NpdGlvbik7CiAgICAgdm9pZCB1cGRhdGVTdGF0aWNJbmxpbmVQb3NpdGlv
bkZvckNoaWxkKFJlbmRlckJveCYgY2hpbGQsIExheW91dFVuaXQgbG9naWNhbFRvcCk7CiAKLSAg
ICBMYXlvdXRVbml0IGNvbGxhcHNlTWFyZ2lucyhSZW5kZXJCb3gmIGNoaWxkLCBNYXJnaW5JbmZv
Jik7CisgICAgTGF5b3V0VW5pdCBjb2xsYXBzZU1hcmdpbnMoUmVuZGVyQm94KiBjaGlsZCwgUmVu
ZGVyT2JqZWN0KiBwcmV2LCBNYXJnaW5JbmZvJik7CiAgICAgTGF5b3V0VW5pdCBjbGVhckZsb2F0
c0lmTmVlZGVkKFJlbmRlckJveCYgY2hpbGQsIE1hcmdpbkluZm8mLCBMYXlvdXRVbml0IG9sZFRv
cFBvc01hcmdpbiwgTGF5b3V0VW5pdCBvbGRUb3BOZWdNYXJnaW4sIExheW91dFVuaXQgeVBvcyk7
CiAgICAgTGF5b3V0VW5pdCBlc3RpbWF0ZUxvZ2ljYWxUb3BQb3NpdGlvbihSZW5kZXJCb3gmIGNo
aWxkLCBjb25zdCBNYXJnaW5JbmZvJiwgTGF5b3V0VW5pdCYgZXN0aW1hdGVXaXRob3V0UGFnaW5h
dGlvbik7CiAgICAgdm9pZCBtYXJnaW5CZWZvcmVFc3RpbWF0ZUZvckNoaWxkKFJlbmRlckJveCYs
IExheW91dFVuaXQmLCBMYXlvdXRVbml0JiwgYm9vbCYpIGNvbnN0OwpAQCAtNTM4LDcgKzUzOCw3
IEBAIHByaXZhdGU6CiAvLyBTVEFSVCBNRVRIT0RTIERFRklORUQgSU4gUmVuZGVyQmxvY2tMaW5l
TGF5b3V0CiBwdWJsaWM6CiAgICAgc3RhdGljIHZvaWQgYXBwZW5kUnVuc0Zvck9iamVjdChCaWRp
UnVuTGlzdDxCaWRpUnVuPiYsIGludCBzdGFydCwgaW50IGVuZCwgUmVuZGVyT2JqZWN0KiwgSW5s
aW5lQmlkaVJlc29sdmVyJik7Ci0gICAgUm9vdElubGluZUJveCogY3JlYXRlQW5kQXBwZW5kUm9v
dElubGluZUJveCgpOworICAgIFJvb3RJbmxpbmVCb3gqIGNyZWF0ZUFuZEFwcGVuZFJvb3RJbmxp
bmVCb3goUmVuZGVyQmxvY2tGbG93KiBhbm9ueW1vdXNJbmxpbmVCbG9jayk7CiAKICAgICBMYXlv
dXRVbml0IHN0YXJ0QWxpZ25lZE9mZnNldEZvckxpbmUoTGF5b3V0VW5pdCBwb3NpdGlvbiwgYm9v
bCBzaG91bGRJbmRlbnRUZXh0KTsKICAgICB2aXJ0dWFsIEVUZXh0QWxpZ24gdGV4dEFsaWdubWVu
dEZvckxpbmUoYm9vbCBlbmRzV2l0aFNvZnRCcmVhaykgY29uc3Q7CkBAIC01NTAsOCArNTUwLDgg
QEAgcHJpdmF0ZTogICAgICAgIAogICAgIHZvaWQgbGF5b3V0TGluZUJveGVzKGJvb2wgcmVsYXlv
dXRDaGlsZHJlbiwgTGF5b3V0VW5pdCYgcmVwYWludExvZ2ljYWxUb3AsIExheW91dFVuaXQmIHJl
cGFpbnRMb2dpY2FsQm90dG9tKTsKICAgICB2b2lkIGxheW91dFNpbXBsZUxpbmVzKGJvb2wgcmVs
YXlvdXRDaGlsZHJlbiwgTGF5b3V0VW5pdCYgcmVwYWludExvZ2ljYWxUb3AsIExheW91dFVuaXQm
IHJlcGFpbnRMb2dpY2FsQm90dG9tKTsKIAotICAgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPFJv
b3RJbmxpbmVCb3g+IGNyZWF0ZVJvb3RJbmxpbmVCb3goKTsgLy8gU3ViY2xhc3NlZCBieSBSZW5k
ZXJTVkdUZXh0LgotICAgIElubGluZUZsb3dCb3gqIGNyZWF0ZUxpbmVCb3hlcyhSZW5kZXJPYmpl
Y3QqLCBjb25zdCBMaW5lSW5mbyYsIElubGluZUJveCogY2hpbGRCb3gpOworICAgIHZpcnR1YWwg
c3RkOjp1bmlxdWVfcHRyPFJvb3RJbmxpbmVCb3g+IGNyZWF0ZVJvb3RJbmxpbmVCb3goUmVuZGVy
QmxvY2tGbG93KiBhbm9ueW1vdXNJbmxpbmVCbG9jayk7IC8vIFN1YmNsYXNzZWQgYnkgUmVuZGVy
U1ZHVGV4dC4KKyAgICBJbmxpbmVGbG93Qm94KiBjcmVhdGVMaW5lQm94ZXMoUmVuZGVyT2JqZWN0
KiwgY29uc3QgTGluZUluZm8mLCBJbmxpbmVCb3gqIGNoaWxkQm94LCBSZW5kZXJCbG9ja0Zsb3cq
IGFub255bW91c0lubGluZUJsb2NrKTsKICAgICBSb290SW5saW5lQm94KiBjb25zdHJ1Y3RMaW5l
KEJpZGlSdW5MaXN0PEJpZGlSdW4+JiwgY29uc3QgTGluZUluZm8mKTsKICAgICB2b2lkIHNldE1h
cmdpbnNGb3JSdWJ5UnVuKEJpZGlSdW4qLCBSZW5kZXJSdWJ5UnVuJiwgUmVuZGVyT2JqZWN0Kiwg
Y29uc3QgTGluZUluZm8mKTsKICAgICB2b2lkIGNvbXB1dGVJbmxpbmVEaXJlY3Rpb25Qb3NpdGlv
bnNGb3JMaW5lKFJvb3RJbmxpbmVCb3gqLCBjb25zdCBMaW5lSW5mbyYsIEJpZGlSdW4qIGZpcnN0
UnVuLCBCaWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVuLCBib29sIHJlYWNoZWRFbmQsIEdseXBoT3Zl
cmZsb3dBbmRGYWxsYmFja0ZvbnRzTWFwJiwgVmVydGljYWxQb3NpdGlvbkNhY2hlJiwgV29yZE1l
YXN1cmVtZW50cyYpOwpAQCAtNTYzLDcgKzU2Myw3IEBAIHByaXZhdGU6ICAgICAgICAKICAgICBC
aWRpUnVuKiBoYW5kbGVUcmFpbGluZ1NwYWNlcyhCaWRpUnVuTGlzdDxCaWRpUnVuPiYsIEJpZGlD
b250ZXh0Kik7CiAgICAgdm9pZCBhcHBlbmRGbG9hdGluZ09iamVjdFRvTGFzdExpbmUoRmxvYXRp
bmdPYmplY3QqKTsKICAgICAvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIGxheW91dElubGluZUNoaWxk
cmVuKCkKLSAgICBSb290SW5saW5lQm94KiBjcmVhdGVMaW5lQm94ZXNGcm9tQmlkaVJ1bnModW5z
aWduZWQgYmlkaUxldmVsLCBCaWRpUnVuTGlzdDxCaWRpUnVuPiYsIGNvbnN0IElubGluZUl0ZXJh
dG9yJiBlbmQsIExpbmVJbmZvJiwgVmVydGljYWxQb3NpdGlvbkNhY2hlJiwgQmlkaVJ1biogdHJh
aWxpbmdTcGFjZVJ1biwgV29yZE1lYXN1cmVtZW50cyYpOworICAgIFJvb3RJbmxpbmVCb3gqIGNy
ZWF0ZUxpbmVCb3hlc0Zyb21CaWRpUnVucyh1bnNpZ25lZCBiaWRpTGV2ZWwsIEJpZGlSdW5MaXN0
PEJpZGlSdW4+JiwgY29uc3QgSW5saW5lSXRlcmF0b3ImIGVuZCwgTGluZUluZm8mLCBWZXJ0aWNh
bFBvc2l0aW9uQ2FjaGUmLCBCaWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVuLCBXb3JkTWVhc3VyZW1l
bnRzJiwgTWFyZ2luSW5mbyYpOwogICAgIHZvaWQgbGF5b3V0UnVuc0FuZEZsb2F0cyhMaW5lTGF5
b3V0U3RhdGUmLCBib29sIGhhc0lubGluZUNoaWxkKTsKICAgICBjb25zdCBJbmxpbmVJdGVyYXRv
ciYgcmVzdGFydExheW91dFJ1bnNBbmRGbG9hdHNJblJhbmdlKExheW91dFVuaXQgb2xkTG9naWNh
bEhlaWdodCwgTGF5b3V0VW5pdCBuZXdMb2dpY2FsSGVpZ2h0LCAgRmxvYXRpbmdPYmplY3QqIGxh
c3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIElubGluZUJpZGlSZXNvbHZlciYsICBjb25zdCBJbmxp
bmVJdGVyYXRvciYpOwogICAgIHZvaWQgbGF5b3V0UnVuc0FuZEZsb2F0c0luUmFuZ2UoTGluZUxh
eW91dFN0YXRlJiwgSW5saW5lQmlkaVJlc29sdmVyJiwgY29uc3QgSW5saW5lSXRlcmF0b3ImIGNs
ZWFuTGluZVN0YXJ0LCBjb25zdCBCaWRpU3RhdHVzJiBjbGVhbkxpbmVCaWRpU3RhdHVzLCB1bnNp
Z25lZCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcyk7CkBAIC01ODQsNyArNTg0LDggQEAgcHJp
dmF0ZTogICAgICAgIAogICAgIC8vIGxpbmUsIGkuZS4sIHRoYXQgaXQgY2FuJ3QgYmUgcmUtdXNl
ZC4KICAgICBib29sIGxpbmVXaWR0aEZvclBhZ2luYXRlZExpbmVDaGFuZ2VkKFJvb3RJbmxpbmVC
b3gqLCBMYXlvdXRVbml0IGxpbmVEZWx0YSwgUmVuZGVyRmxvd1RocmVhZCopIGNvbnN0OwogICAg
IHZvaWQgdXBkYXRlTG9naWNhbFdpZHRoRm9yQWxpZ25tZW50KGNvbnN0IEVUZXh0QWxpZ24mLCBj
b25zdCBSb290SW5saW5lQm94KiwgQmlkaVJ1biogdHJhaWxpbmdTcGFjZVJ1biwgZmxvYXQmIGxv
Z2ljYWxMZWZ0LCBmbG9hdCYgdG90YWxMb2dpY2FsV2lkdGgsIGZsb2F0JiBhdmFpbGFibGVMb2dp
Y2FsV2lkdGgsIGludCBleHBhbnNpb25PcHBvcnR1bml0eUNvdW50KTsKLQorICAgIHZvaWQgbWFy
Z2luQ29sbGFwc2VMaW5lc0Zyb21TdGFydChNYXJnaW5JbmZvJiwgUm9vdElubGluZUJveCogc3Rv
cExpbmUpOworICAgIAogLy8gRU5EIE1FVEhPRFMgREVGSU5FRCBJTiBSZW5kZXJCbG9ja0xpbmVM
YXlvdXQKIAogICAgIGJvb2wgbmFtZWRGbG93RnJhZ21lbnROZWVkc1VwZGF0ZSgpIGNvbnN0OwpJ
bmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrTGluZUxh
eW91dC5jcHAJKHJldmlzaW9uIDE4MTMyOSkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9S
ZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMTksMTUgKzExOSwx
NSBAQCB2b2lkIFJlbmRlckJsb2NrRmxvdzo6YXBwZW5kUnVuc0Zvck9iamVjCiAgICAgfQogfQog
Ci1zdGQ6OnVuaXF1ZV9wdHI8Um9vdElubGluZUJveD4gUmVuZGVyQmxvY2tGbG93OjpjcmVhdGVS
b290SW5saW5lQm94KCkKK3N0ZDo6dW5pcXVlX3B0cjxSb290SW5saW5lQm94PiBSZW5kZXJCbG9j
a0Zsb3c6OmNyZWF0ZVJvb3RJbmxpbmVCb3goUmVuZGVyQmxvY2tGbG93KiBhbm9ueW1vdXNJbmxp
bmVCbG9jaykKIHsKLSAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxSb290SW5saW5lQm94Pigq
dGhpcyk7CisgICAgcmV0dXJuIGFub255bW91c0lubGluZUJsb2NrID8gc3RkOjptYWtlX3VuaXF1
ZTxSb290QW5vbnltb3VzSW5saW5lQmxvY2tCb3g+KCp0aGlzLCBhbm9ueW1vdXNJbmxpbmVCbG9j
aykgOiBzdGQ6Om1ha2VfdW5pcXVlPFJvb3RJbmxpbmVCb3g+KCp0aGlzKTsKIH0KIAotUm9vdElu
bGluZUJveCogUmVuZGVyQmxvY2tGbG93OjpjcmVhdGVBbmRBcHBlbmRSb290SW5saW5lQm94KCkK
K1Jvb3RJbmxpbmVCb3gqIFJlbmRlckJsb2NrRmxvdzo6Y3JlYXRlQW5kQXBwZW5kUm9vdElubGlu
ZUJveChSZW5kZXJCbG9ja0Zsb3cqIGFub255bW91c0lubGluZUJsb2NrKQogewotICAgIGF1dG8g
bmV3Um9vdEJveCA9IGNyZWF0ZVJvb3RJbmxpbmVCb3goKTsKLSAgICBSb290SW5saW5lQm94KiBy
b290Qm94ID0gbmV3Um9vdEJveC5nZXQoKTsKKyAgICBhdXRvIG5ld1Jvb3RCb3ggPSBjcmVhdGVS
b290SW5saW5lQm94KGFub255bW91c0lubGluZUJsb2NrKTsKKyAgICBhdXRvIHJvb3RCb3ggPSBu
ZXdSb290Qm94LmdldCgpOwogICAgIG1fbGluZUJveGVzLmFwcGVuZExpbmVCb3goV1RGOjptb3Zl
KG5ld1Jvb3RCb3gpKTsKIAogICAgIGlmIChVTkxJS0VMWShBWE9iamVjdENhY2hlOjphY2Nlc3Np
YmlsaXR5RW5hYmxlZCgpKSAmJiBmaXJzdFJvb3RCb3goKSA9PSByb290Qm94KSB7CkBAIC0xMzgs
MTAgKzEzOCwxMCBAQCBSb290SW5saW5lQm94KiBSZW5kZXJCbG9ja0Zsb3c6OmNyZWF0ZUFuCiAg
ICAgcmV0dXJuIHJvb3RCb3g7CiB9CiAKLXN0YXRpYyBpbmxpbmUgSW5saW5lQm94KiBjcmVhdGVJ
bmxpbmVCb3hGb3JSZW5kZXJlcihSZW5kZXJPYmplY3QqIHJlbmRlcmVyLCBib29sIGlzUm9vdExp
bmVCb3gsIGJvb2wgaXNPbmx5UnVuID0gZmFsc2UpCitzdGF0aWMgaW5saW5lIElubGluZUJveCog
Y3JlYXRlSW5saW5lQm94Rm9yUmVuZGVyZXIoUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgYm9vbCBp
c1Jvb3RMaW5lQm94LCBib29sIGlzT25seVJ1biwgUmVuZGVyQmxvY2tGbG93KiBhbm9ueW1vdXNJ
bmxpbmVCbG9jaykKIHsKICAgICBpZiAoaXNSb290TGluZUJveCkKLSAgICAgICAgcmV0dXJuIGRv
d25jYXN0PFJlbmRlckJsb2NrRmxvdz4oKnJlbmRlcmVyKS5jcmVhdGVBbmRBcHBlbmRSb290SW5s
aW5lQm94KCk7CisgICAgICAgIHJldHVybiBkb3duY2FzdDxSZW5kZXJCbG9ja0Zsb3c+KCpyZW5k
ZXJlcikuY3JlYXRlQW5kQXBwZW5kUm9vdElubGluZUJveChhbm9ueW1vdXNJbmxpbmVCbG9jayk7
CiAKICAgICBpZiAoaXM8UmVuZGVyVGV4dD4oKnJlbmRlcmVyKSkKICAgICAgICAgcmV0dXJuIGRv
d25jYXN0PFJlbmRlclRleHQ+KCpyZW5kZXJlcikuY3JlYXRlSW5saW5lVGV4dEJveCgpOwpAQCAt
MTYwLDcgKzE2MCw3IEBAIHN0YXRpYyBpbmxpbmUgSW5saW5lQm94KiBjcmVhdGVJbmxpbmVCb3gK
ICAgICAgICAgcmV0dXJuIGlubGluZUJveDsKICAgICB9CiAKLSAgICByZXR1cm4gZG93bmNhc3Q8
UmVuZGVySW5saW5lPigqcmVuZGVyZXIpLmNyZWF0ZUFuZEFwcGVuZElubGluZUZsb3dCb3goKTsK
KyAgICByZXR1cm4gZG93bmNhc3Q8UmVuZGVySW5saW5lPigqcmVuZGVyZXIpLmNyZWF0ZUFuZEFw
cGVuZElubGluZUZsb3dCb3goYW5vbnltb3VzSW5saW5lQmxvY2spOwogfQogCiBzdGF0aWMgaW5s
aW5lIHZvaWQgZGlydHlMaW5lQm94ZXNGb3JSZW5kZXJlcihSZW5kZXJPYmplY3QmIHJlbmRlcmVy
LCBib29sIGZ1bGxMYXlvdXQpCkBAIC0xODUsNyArMTg1LDggQEAgc3RhdGljIGJvb2wgcGFyZW50
SXNDb25zdHJ1Y3RlZE9ySGF2ZU5leAogICAgIHJldHVybiBmYWxzZTsKIH0KIAotSW5saW5lRmxv
d0JveCogUmVuZGVyQmxvY2tGbG93OjpjcmVhdGVMaW5lQm94ZXMoUmVuZGVyT2JqZWN0KiBvYmos
IGNvbnN0IExpbmVJbmZvJiBsaW5lSW5mbywgSW5saW5lQm94KiBjaGlsZEJveCkKK0lubGluZUZs
b3dCb3gqIFJlbmRlckJsb2NrRmxvdzo6Y3JlYXRlTGluZUJveGVzKFJlbmRlck9iamVjdCogb2Jq
LCBjb25zdCBMaW5lSW5mbyYgbGluZUluZm8sIElubGluZUJveCogY2hpbGRCb3gsCisgICAgUmVu
ZGVyQmxvY2tGbG93KiBhbm9ueW1vdXNJbmxpbmVCbG9jaykKIHsKICAgICAvLyBTZWUgaWYgd2Ug
aGF2ZSBhbiB1bmNvbnN0cnVjdGVkIGxpbmUgYm94IGZvciB0aGlzIG9iamVjdCB0aGF0IGlzIGFs
c28KICAgICAvLyB0aGUgbGFzdCBpdGVtIG9uIHRoZSBsaW5lLgpAQCAtMjEyLDcgKzIxMyw3IEBA
IElubGluZUZsb3dCb3gqIFJlbmRlckJsb2NrRmxvdzo6Y3JlYXRlTGkKICAgICAgICAgaWYgKGFs
bG93ZWRUb0NvbnN0cnVjdE5ld0JveCAmJiAhY2FuVXNlRXhpc3RpbmdQYXJlbnRCb3gpIHsKICAg
ICAgICAgICAgIC8vIFdlIG5lZWQgdG8gbWFrZSBhIG5ldyBib3ggZm9yIHRoaXMgcmVuZGVyIG9i
amVjdC4gIE9uY2UKICAgICAgICAgICAgIC8vIG1hZGUsIHdlIG5lZWQgdG8gcGxhY2UgaXQgYXQg
dGhlIGVuZCBvZiB0aGUgY3VycmVudCBsaW5lLgotICAgICAgICAgICAgSW5saW5lQm94KiBuZXdC
b3ggPSBjcmVhdGVJbmxpbmVCb3hGb3JSZW5kZXJlcihvYmosIG9iaiA9PSB0aGlzKTsKKyAgICAg
ICAgICAgIElubGluZUJveCogbmV3Qm94ID0gY3JlYXRlSW5saW5lQm94Rm9yUmVuZGVyZXIob2Jq
LCBvYmogPT0gdGhpcywgZmFsc2UsIGFub255bW91c0lubGluZUJsb2NrKTsKICAgICAgICAgICAg
IHBhcmVudEJveCA9IGRvd25jYXN0PElubGluZUZsb3dCb3g+KG5ld0JveCk7CiAgICAgICAgICAg
ICBwYXJlbnRCb3gtPnNldElzRmlyc3RMaW5lKGxpbmVJbmZvLmlzRmlyc3RMaW5lKCkpOwogICAg
ICAgICAgICAgcGFyZW50Qm94LT5zZXRJc0hvcml6b250YWwoaXNIb3Jpem9udGFsV3JpdGluZ01v
ZGUoKSk7CkBAIC0yOTEsOCArMjkyLDkgQEAgUm9vdElubGluZUJveCogUmVuZGVyQmxvY2tGbG93
Ojpjb25zdHJ1YwogCiAgICAgICAgIGlmIChsaW5lSW5mby5pc0VtcHR5KCkpCiAgICAgICAgICAg
ICBjb250aW51ZTsKLQotICAgICAgICBJbmxpbmVCb3gqIGJveCA9IGNyZWF0ZUlubGluZUJveEZv
clJlbmRlcmVyKCZyLT5yZW5kZXJlcigpLCBmYWxzZSwgaXNPbmx5UnVuKTsKKyAgICAgICAgCisg
ICAgICAgIFJlbmRlckJsb2NrRmxvdyogYW5vbnltb3VzSW5saW5lQmxvY2sgPSByLT5yZW5kZXJl
cigpLmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSA/IGRvd25jYXN0PFJlbmRlckJsb2NrRmxvdz4o
JnItPnJlbmRlcmVyKCkpIDogMDsKKyAgICAgICAgSW5saW5lQm94KiBib3ggPSBjcmVhdGVJbmxp
bmVCb3hGb3JSZW5kZXJlcigmci0+cmVuZGVyZXIoKSwgZmFsc2UsIGlzT25seVJ1biwgYW5vbnlt
b3VzSW5saW5lQmxvY2spOwogICAgICAgICByLT5zZXRCb3goKmJveCk7CiAKICAgICAgICAgaWYg
KCFyb290SGFzU2VsZWN0ZWRDaGlsZHJlbiAmJiBib3gtPnJlbmRlcmVyKCkuc2VsZWN0aW9uU3Rh
dGUoKSAhPSBSZW5kZXJPYmplY3Q6OlNlbGVjdGlvbk5vbmUpCkBAIC0zMDQsNyArMzA2LDcgQEAg
Um9vdElubGluZUJveCogUmVuZGVyQmxvY2tGbG93Ojpjb25zdHJ1YwogICAgICAgICAvLyB0aGV5
IGFyZSBwb3NpdGlvbmVkIHNlcGFyYXRlbHkuCiAgICAgICAgIGlmICghcGFyZW50Qm94IHx8ICZw
YXJlbnRCb3gtPnJlbmRlcmVyKCkgIT0gci0+cmVuZGVyZXIoKS5wYXJlbnQoKSkgewogICAgICAg
ICAgICAgLy8gQ3JlYXRlIG5ldyBpbmxpbmUgYm94ZXMgYWxsIHRoZSB3YXkgYmFjayB0byB0aGUg
YXBwcm9wcmlhdGUgaW5zZXJ0aW9uIHBvaW50LgotICAgICAgICAgICAgcGFyZW50Qm94ID0gY3Jl
YXRlTGluZUJveGVzKHItPnJlbmRlcmVyKCkucGFyZW50KCksIGxpbmVJbmZvLCBib3gpOworICAg
ICAgICAgICAgcGFyZW50Qm94ID0gY3JlYXRlTGluZUJveGVzKHItPnJlbmRlcmVyKCkucGFyZW50
KCksIGxpbmVJbmZvLCBib3gsIGFub255bW91c0lubGluZUJsb2NrKTsKICAgICAgICAgfSBlbHNl
IHsKICAgICAgICAgICAgIC8vIEFwcGVuZCB0aGUgaW5saW5lIGJveCB0byB0aGlzIGxpbmUuCiAg
ICAgICAgICAgICBwYXJlbnRCb3gtPmFkZFRvTGluZShib3gpOwpAQCAtMTAwMSw3ICsxMDAzLDcg
QEAgc3RhdGljIGlubGluZSB2b2lkIGNvbnN0cnVjdEJpZGlSdW5zRm9yUwogfQogCiAvLyBUaGlz
IGZ1bmN0aW9uIGNvbnN0cnVjdHMgbGluZSBib3hlcyBmb3IgYWxsIG9mIHRoZSB0ZXh0IHJ1bnMg
aW4gdGhlIHJlc29sdmVyIGFuZCBjb21wdXRlcyB0aGVpciBwb3NpdGlvbi4KLVJvb3RJbmxpbmVC
b3gqIFJlbmRlckJsb2NrRmxvdzo6Y3JlYXRlTGluZUJveGVzRnJvbUJpZGlSdW5zKHVuc2lnbmVk
IGJpZGlMZXZlbCwgQmlkaVJ1bkxpc3Q8QmlkaVJ1bj4mIGJpZGlSdW5zLCBjb25zdCBJbmxpbmVJ
dGVyYXRvciYgZW5kLCBMaW5lSW5mbyYgbGluZUluZm8sIFZlcnRpY2FsUG9zaXRpb25DYWNoZSYg
dmVydGljYWxQb3NpdGlvbkNhY2hlLCBCaWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVuLCBXb3JkTWVh
c3VyZW1lbnRzJiB3b3JkTWVhc3VyZW1lbnRzKQorUm9vdElubGluZUJveCogUmVuZGVyQmxvY2tG
bG93OjpjcmVhdGVMaW5lQm94ZXNGcm9tQmlkaVJ1bnModW5zaWduZWQgYmlkaUxldmVsLCBCaWRp
UnVuTGlzdDxCaWRpUnVuPiYgYmlkaVJ1bnMsIGNvbnN0IElubGluZUl0ZXJhdG9yJiBlbmQsIExp
bmVJbmZvJiBsaW5lSW5mbywgVmVydGljYWxQb3NpdGlvbkNhY2hlJiB2ZXJ0aWNhbFBvc2l0aW9u
Q2FjaGUsIEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4sIFdvcmRNZWFzdXJlbWVudHMmIHdvcmRN
ZWFzdXJlbWVudHMsIE1hcmdpbkluZm8mIG1hcmdpbkluZm8pCiB7CiAgICAgaWYgKCFiaWRpUnVu
cy5ydW5Db3VudCgpKQogICAgICAgICByZXR1cm4gMDsKQEAgLTEwMTYsNiArMTAxOCwxNiBAQCBS
b290SW5saW5lQm94KiBSZW5kZXJCbG9ja0Zsb3c6OmNyZWF0ZUxpCiAgICAgbGluZUJveC0+c2V0
QmlkaUxldmVsKGJpZGlMZXZlbCk7CiAgICAgbGluZUJveC0+c2V0RW5kc1dpdGhCcmVhayhsaW5l
SW5mby5wcmV2aW91c0xpbmVCcm9rZUNsZWFubHkoKSk7CiAgICAgCisgICAgLy8gSWYgb3VyIHBy
ZXZpb3VzIGxpbmUgd2FzIGFuIGFub255bW91cyBibG9jayBhbmQgd2UgYXJlIG5vdCBhbiBhbm9u
eW1vdXMgYmxvY2ssCisgICAgLy8gc2ltdWxhdGUgYSBtYXJnaW4gY29sbGFwc2Ugbm93IHNvIHRo
YXQgd2UgZ2V0IHRoZSBwcm9wZXIKKyAgICAvLyBpbmNyZWFzZWQgaGVpZ2h0LiAgV2UgYWxzbyBo
YXZlIHRvIHNpbXVsYXRlIGEgbWFyZ2luIGNvbGxhcHNlIHRvIHByb3BhZ2F0ZSBtYXJnaW5zCisg
ICAgLy8gdGhyb3VnaCB0byB0aGUgdG9wIG9mIG91ciBibG9jay4KKyAgICBpZiAoIWxpbmVCb3gt
Pmhhc0Fub255bW91c0lubGluZUJsb2NrKCkpIHsKKyAgICAgICAgaWYgKCFsaW5lQm94LT5wcmV2
Um9vdEJveCgpIHx8IGxpbmVCb3gtPnByZXZSb290Qm94KCktPmhhc0Fub255bW91c0lubGluZUJs
b2NrKCkpCisgICAgICAgICAgICBjb2xsYXBzZU1hcmdpbnMobnVsbHB0ciwgbnVsbHB0ciwgbWFy
Z2luSW5mbyk7CisgICAgICAgIG1hcmdpbkluZm8uc2V0QXRCZWZvcmVTaWRlT2ZCbG9jayhmYWxz
ZSk7CisgICAgfQorCiAgICAgYm9vbCBpc1NWR1Jvb3RJbmxpbmVCb3ggPSBpczxTVkdSb290SW5s
aW5lQm94PigqbGluZUJveCk7CiAgICAgCiAgICAgR2x5cGhPdmVyZmxvd0FuZEZhbGxiYWNrRm9u
dHNNYXAgdGV4dEJveERhdGFNYXA7CkBAIC0xMDYxLDcgKzEwNzMsOSBAQCB2b2lkIFJlbmRlckJs
b2NrRmxvdzo6bGF5b3V0UnVuc0FuZEZsb2F0CiAgICAgLy8gV2Ugd2FudCB0byBza2lwIGFoZWFk
IHRvIHRoZSBmaXJzdCBkaXJ0eSBsaW5lCiAgICAgSW5saW5lQmlkaVJlc29sdmVyIHJlc29sdmVy
OwogICAgIFJvb3RJbmxpbmVCb3gqIHN0YXJ0TGluZSA9IGRldGVybWluZVN0YXJ0UG9zaXRpb24o
bGF5b3V0U3RhdGUsIHJlc29sdmVyKTsKLQorICAgIGlmIChzdGFydExpbmUpCisgICAgICAgIG1h
cmdpbkNvbGxhcHNlTGluZXNGcm9tU3RhcnQobGF5b3V0U3RhdGUubWFyZ2luSW5mbygpLCBzdGFy
dExpbmUpOworIAogICAgIHVuc2lnbmVkIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzID0gMDsK
ICAgICBpZiAoc3RhcnRMaW5lKSB7CiAgICAgICAgIGZvciAoUm9vdElubGluZUJveCogbGluZSA9
IHN0YXJ0TGluZS0+cHJldlJvb3RCb3goKTsgbGluZSAmJiBsaW5lLT5pc0h5cGhlbmF0ZWQoKTsg
bGluZSA9IGxpbmUtPnByZXZSb290Qm94KCkpCkBAIC0xMTU2LDYgKzExNzAsNyBAQCB2b2lkIFJl
bmRlckJsb2NrRmxvdzo6bGF5b3V0UnVuc0FuZEZsb2F0CiAgICAgICAgICAgICBsYXlvdXRTdGF0
ZS5zZXRFbmRMaW5lTWF0Y2hlZChtYXRjaGVkRW5kTGluZShsYXlvdXRTdGF0ZSwgcmVzb2x2ZXIs
IGNsZWFuTGluZVN0YXJ0LCBjbGVhbkxpbmVCaWRpU3RhdHVzKSk7CiAgICAgICAgICAgICBpZiAo
bGF5b3V0U3RhdGUuZW5kTGluZU1hdGNoZWQoKSkgewogICAgICAgICAgICAgICAgIHJlc29sdmVy
LnNldFBvc2l0aW9uKElubGluZUl0ZXJhdG9yKHJlc29sdmVyLnBvc2l0aW9uKCkucm9vdCgpLCAw
LCAwKSwgMCk7CisgICAgICAgICAgICAgICAgbGF5b3V0U3RhdGUubWFyZ2luSW5mbygpLmNsZWFy
TWFyZ2luKCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAg
IH0KQEAgLTEyMTUsNyArMTIzMCw3IEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93OjpsYXlvdXRSdW5z
QW5kRmxvYXQKICAgICAgICAgICAgIC8vIGlubGluZSBmbG93IGJveGVzLgogCiAgICAgICAgICAg
ICBMYXlvdXRVbml0IG9sZExvZ2ljYWxIZWlnaHQgPSBsb2dpY2FsSGVpZ2h0KCk7Ci0gICAgICAg
ICAgICBSb290SW5saW5lQm94KiBsaW5lQm94ID0gY3JlYXRlTGluZUJveGVzRnJvbUJpZGlSdW5z
KHJlc29sdmVyLnN0YXR1cygpLmNvbnRleHQtPmxldmVsKCksIGJpZGlSdW5zLCBlbmQsIGxheW91
dFN0YXRlLmxpbmVJbmZvKCksIHZlcnRpY2FsUG9zaXRpb25DYWNoZSwgdHJhaWxpbmdTcGFjZVJ1
biwgd29yZE1lYXN1cmVtZW50cyk7CisgICAgICAgICAgICBSb290SW5saW5lQm94KiBsaW5lQm94
ID0gY3JlYXRlTGluZUJveGVzRnJvbUJpZGlSdW5zKHJlc29sdmVyLnN0YXR1cygpLmNvbnRleHQt
PmxldmVsKCksIGJpZGlSdW5zLCBlbmQsIGxheW91dFN0YXRlLmxpbmVJbmZvKCksIHZlcnRpY2Fs
UG9zaXRpb25DYWNoZSwgdHJhaWxpbmdTcGFjZVJ1biwgd29yZE1lYXN1cmVtZW50cywgbGF5b3V0
U3RhdGUubWFyZ2luSW5mbygpKTsKIAogICAgICAgICAgICAgYmlkaVJ1bnMuZGVsZXRlUnVucygp
OwogICAgICAgICAgICAgcmVzb2x2ZXIubWFya0N1cnJlbnRSdW5FbXB0eSgpOyAvLyBGSVhNRTog
VGhpcyBjYW4gcHJvYmFibHkgYmUgcmVwbGFjZWQgYnkgYW4gQVNTRVJUIChvciBqdXN0IHJlbW92
ZWQpLgpAQCAtMTQ1Myw3ICsxNDY4LDcgQEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OnJlcGFpbnRE
aXJ0eUZsb2F0cwogdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmxheW91dExpbmVCb3hlcyhib29sIHJl
bGF5b3V0Q2hpbGRyZW4sIExheW91dFVuaXQmIHJlcGFpbnRMb2dpY2FsVG9wLCBMYXlvdXRVbml0
JiByZXBhaW50TG9naWNhbEJvdHRvbSkKIHsKICAgICBBU1NFUlQoIW1fc2ltcGxlTGluZUxheW91
dCk7Ci0KKyAgICAKICAgICBzZXRMb2dpY2FsSGVpZ2h0KGJvcmRlckFuZFBhZGRpbmdCZWZvcmUo
KSk7CiAgICAgCiAgICAgLy8gTGF5IG91dCBvdXIgaHlwb3RoZXRpY2FsIGdyaWQgbGluZSBhcyB0
aG91Z2ggaXQgb2NjdXJzIGF0IHRoZSB0b3Agb2YgdGhlIGJsb2NrLgpAQCAtMTQ2Niw3ICsxNDgx
LDcgQEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmxheW91dExpbmVCb3hlcyhibwogICAgIC8vIEZp
Z3VyZSBvdXQgaWYgd2Ugc2hvdWxkIGNsZWFyIG91dCBvdXIgbGluZSBib3hlcy4KICAgICAvLyBG
SVhNRTogSGFuZGxlIHJlc2l6ZSBldmVudHVhbGx5IQogICAgIGJvb2wgaXNGdWxsTGF5b3V0ID0g
IWZpcnN0Um9vdEJveCgpIHx8IHNlbGZOZWVkc0xheW91dCgpIHx8IHJlbGF5b3V0Q2hpbGRyZW4g
fHwgY2xlYXJMaW5lc0ZvclBhZ2luYXRpb247Ci0gICAgTGluZUxheW91dFN0YXRlIGxheW91dFN0
YXRlKGlzRnVsbExheW91dCwgcmVwYWludExvZ2ljYWxUb3AsIHJlcGFpbnRMb2dpY2FsQm90dG9t
LCBmbG93VGhyZWFkKTsKKyAgICBMaW5lTGF5b3V0U3RhdGUgbGF5b3V0U3RhdGUoKnRoaXMsIGlz
RnVsbExheW91dCwgcmVwYWludExvZ2ljYWxUb3AsIHJlcGFpbnRMb2dpY2FsQm90dG9tLCBmbG93
VGhyZWFkKTsKIAogICAgIGlmIChpc0Z1bGxMYXlvdXQpCiAgICAgICAgIGxpbmVCb3hlcygpLmRl
bGV0ZUxpbmVCb3hlcygpOwpAQCAtMTUxNSwxMCArMTUzMCwxMiBAQCB2b2lkIFJlbmRlckJsb2Nr
Rmxvdzo6bGF5b3V0TGluZUJveGVzKGJvCiAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNGdWxs
TGF5b3V0IHx8IGJveC5uZWVkc0xheW91dCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFJl
cGxhY2VkIGVsZW1lbnQuCiAgICAgICAgICAgICAgICAgICAgIGJveC5kaXJ0eUxpbmVCb3hlcyhp
c0Z1bGxMYXlvdXQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaXNGdWxsTGF5b3V0KQotICAg
ICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZWRDaGlsZHJlbi5hcHBlbmQoJmJveCk7Ci0gICAg
ICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGJveC5sYXlvdXRJ
Zk5lZWRlZCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoIW8uaXNSZXBsYWNlZCgpIHx8ICFv
LmlzQW5vbnltb3VzSW5saW5lQmxvY2soKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYg
KGlzRnVsbExheW91dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlZENoaWxk
cmVuLmFwcGVuZCgmYm94KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBib3gubGF5b3V0SWZOZWVkZWQoKTsKKyAgICAgICAgICAgICAg
ICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAoby5pc1Rl
eHRPckxpbmVCcmVhaygpIHx8IChpczxSZW5kZXJJbmxpbmU+KG8pICYmICF3YWxrZXIuYXRFbmRP
ZklubGluZSgpKSkgewogICAgICAgICAgICAgICAgIGlmIChpczxSZW5kZXJJbmxpbmU+KG8pKQpA
QCAtMTU0NSw5ICsxNTYyLDE3IEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93OjpsYXlvdXRMaW5lQm94
ZXMoYm8KICAgICAgICAgICAgIGxhc3RMaW5lQW5ub3RhdGlvbnNBZGp1c3RtZW50ID0gbGFzdFJv
b3RCb3goKS0+Y29tcHV0ZU92ZXJBbm5vdGF0aW9uQWRqdXN0bWVudChsb3dlc3RBbGxvd2VkUG9z
aXRpb24pOwogICAgIH0KIAotICAgIC8vIE5vdyBhZGQgaW4gdGhlIGJvdHRvbSBib3JkZXIvcGFk
ZGluZy4KLSAgICBzZXRMb2dpY2FsSGVpZ2h0KGxvZ2ljYWxIZWlnaHQoKSArIGxhc3RMaW5lQW5u
b3RhdGlvbnNBZGp1c3RtZW50ICsgYm9yZGVyQW5kUGFkZGluZ0FmdGVyKCkgKyBzY3JvbGxiYXJM
b2dpY2FsSGVpZ2h0KCkpOwotCisgICAgLy8gTm93IGRvIHRoZSBoYW5kbGluZyBvZiB0aGUgYm90
dG9tIG9mIHRoZSBibG9jaywgYWRkaW5nIGluIG91ciBib3R0b20gYm9yZGVyL3BhZGRpbmcgYW5k
CisgICAgLy8gZGV0ZXJtaW5pbmcgdGhlIGNvcnJlY3QgY29sbGFwc2VkIGJvdHRvbSBtYXJnaW4g
aW5mb3JtYXRpb24uICBUaGlzIGNvbGxhcHNlIGlzIG9ubHkgbmVjZXNzYXJ5CisgICAgLy8gaWYg
b3VyIGxhc3QgY2hpbGQgd2FzIGFuIGFub255bW91cyBpbmxpbmUgYmxvY2sgdGhhdCBtaWdodCBu
ZWVkIHRvIHByb3BhZ2F0ZSBtYXJnaW4gaW5mb3JtYXRpb24gb3V0IHRvCisgICAgLy8gdXMuCisg
ICAgTGF5b3V0VW5pdCBiZWZvcmVFZGdlID0gYm9yZGVyQW5kUGFkZGluZ0JlZm9yZSgpOworICAg
IExheW91dFVuaXQgYWZ0ZXJFZGdlID0gYm9yZGVyQW5kUGFkZGluZ0FmdGVyKCkgKyBzY3JvbGxi
YXJMb2dpY2FsSGVpZ2h0KCkgKyArIGxhc3RMaW5lQW5ub3RhdGlvbnNBZGp1c3RtZW50OworICAg
IGlmIChsYXN0Um9vdEJveCgpICYmIGxhc3RSb290Qm94KCktPmhhc0Fub255bW91c0lubGluZUJs
b2NrKCkpCisgICAgICAgIGhhbmRsZUFmdGVyU2lkZU9mQmxvY2soYmVmb3JlRWRnZSwgYWZ0ZXJF
ZGdlLCBsYXlvdXRTdGF0ZS5tYXJnaW5JbmZvKCkpOworICAgIGVsc2UKKyAgICAgICAgc2V0TG9n
aWNhbEhlaWdodChsb2dpY2FsSGVpZ2h0KCkgKyBhZnRlckVkZ2UpOworIAogICAgIGlmICghZmly
c3RSb290Qm94KCkgJiYgaGFzTGluZUlmRW1wdHkoKSkKICAgICAgICAgc2V0TG9naWNhbEhlaWdo
dChsb2dpY2FsSGVpZ2h0KCkgKyBsaW5lSGVpZ2h0KHRydWUsIGlzSG9yaXpvbnRhbFdyaXRpbmdN
b2RlKCkgPyBIb3Jpem9udGFsTGluZSA6IFZlcnRpY2FsTGluZSwgUG9zaXRpb25PZkludGVyaW9y
TGluZUJveGVzKSk7CiAKQEAgLTE2MDAsMTIgKzE2MjUsMTUgQEAgUm9vdElubGluZUJveCogUmVu
ZGVyQmxvY2tGbG93OjpkZXRlcm1pbgogCiAgICAgLy8gRklYTUU6IFRoaXMgZW50aXJlIGZsb2F0
LWNoZWNraW5nIGJsb2NrIG5lZWRzIHRvIGJlIGJyb2tlbiBpbnRvIGEgbmV3IGZ1bmN0aW9uLgog
ICAgIGJvb2wgZGlydGllZEJ5RmxvYXQgPSBmYWxzZTsKKyAgICBib29sIGhhc0Fub255bW91c0lu
bGluZUJsb2NrTGluZSA9IGZhbHNlOwogICAgIGlmICghbGF5b3V0U3RhdGUuaXNGdWxsTGF5b3V0
KCkpIHsKICAgICAgICAgLy8gUGFnaW5hdGUgYWxsIG9mIHRoZSBjbGVhbiBsaW5lcy4KICAgICAg
ICAgYm9vbCBwYWdpbmF0ZWQgPSB2aWV3KCkubGF5b3V0U3RhdGUoKSAmJiB2aWV3KCkubGF5b3V0
U3RhdGUoKS0+aXNQYWdpbmF0ZWQoKTsKICAgICAgICAgTGF5b3V0VW5pdCBwYWdpbmF0aW9uRGVs
dGEgPSAwOwogICAgICAgICBzaXplX3QgZmxvYXRJbmRleCA9IDA7CiAgICAgICAgIGZvciAoY3Vy
ciA9IGZpcnN0Um9vdEJveCgpOyBjdXJyICYmICFjdXJyLT5pc0RpcnR5KCk7IGN1cnIgPSBjdXJy
LT5uZXh0Um9vdEJveCgpKSB7CisgICAgICAgICAgICBpZiAoY3Vyci0+aGFzQW5vbnltb3VzSW5s
aW5lQmxvY2soKSkKKyAgICAgICAgICAgICAgICBoYXNBbm9ueW1vdXNJbmxpbmVCbG9ja0xpbmUg
PSB0cnVlOwogICAgICAgICAgICAgaWYgKHBhZ2luYXRlZCkgewogICAgICAgICAgICAgICAgIGlm
IChsaW5lV2lkdGhGb3JQYWdpbmF0ZWRMaW5lQ2hhbmdlZChjdXJyLCAwLCBsYXlvdXRTdGF0ZS5m
bG93VGhyZWFkKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgIGN1cnItPm1hcmtEaXJ0eSgpOwpA
QCAtMTY1Miw3ICsxNjgwLDcgQEAgUm9vdElubGluZUJveCogUmVuZGVyQmxvY2tGbG93OjpkZXRl
cm1pbgogICAgICAgICAgICAgLy8gV2UgaGF2ZSBhIGRpcnR5IGxpbmUuCiAgICAgICAgICAgICBp
ZiAoUm9vdElubGluZUJveCogcHJldlJvb3RCb3ggPSBjdXJyLT5wcmV2Um9vdEJveCgpKSB7CiAg
ICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhIHByZXZpb3VzIGxpbmUuCi0gICAgICAgICAgICAg
ICAgaWYgKCFkaXJ0aWVkQnlGbG9hdCAmJiAoIXByZXZSb290Qm94LT5lbmRzV2l0aEJyZWFrKCkg
fHwgIXByZXZSb290Qm94LT5saW5lQnJlYWtPYmooKSB8fCAoaXM8UmVuZGVyVGV4dD4oKnByZXZS
b290Qm94LT5saW5lQnJlYWtPYmooKSkgJiYgcHJldlJvb3RCb3gtPmxpbmVCcmVha1BvcygpID49
IGRvd25jYXN0PFJlbmRlclRleHQ+KCpwcmV2Um9vdEJveC0+bGluZUJyZWFrT2JqKCkpLnRleHRM
ZW5ndGgoKSkpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFkaXJ0aWVkQnlGbG9hdCAmJiAhY3Vy
ci0+aGFzQW5vbnltb3VzSW5saW5lQmxvY2soKSAmJiAoIXByZXZSb290Qm94LT5lbmRzV2l0aEJy
ZWFrKCkgfHwgIXByZXZSb290Qm94LT5saW5lQnJlYWtPYmooKSB8fCAoaXM8UmVuZGVyVGV4dD4o
KnByZXZSb290Qm94LT5saW5lQnJlYWtPYmooKSkgJiYgcHJldlJvb3RCb3gtPmxpbmVCcmVha1Bv
cygpID49IGRvd25jYXN0PFJlbmRlclRleHQ+KCpwcmV2Um9vdEJveC0+bGluZUJyZWFrT2JqKCkp
LnRleHRMZW5ndGgoKSkpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBwcmV2aW91cyBs
aW5lIGRpZG4ndCBicmVhayBjbGVhbmx5IG9yIGJyb2tlIGF0IGEgbmV3bGluZQogICAgICAgICAg
ICAgICAgICAgICAvLyB0aGF0IGhhcyBiZWVuIGRlbGV0ZWQsIHNvIHRyZWF0IGl0IGFzIGRpcnR5
IHRvby4KICAgICAgICAgICAgICAgICAgICAgY3VyciA9IHByZXZSb290Qm94OwpAQCAtMTgxNSw3
ICsxODQzLDcgQEAgYm9vbCBSZW5kZXJCbG9ja0Zsb3c6Om1hdGNoZWRFbmRMaW5lKExpbgogICAg
IFJvb3RJbmxpbmVCb3gqIG9yaWdpbmFsRW5kTGluZSA9IGxheW91dFN0YXRlLmVuZExpbmUoKTsK
ICAgICBSb290SW5saW5lQm94KiBsaW5lID0gb3JpZ2luYWxFbmRMaW5lOwogICAgIGZvciAoaW50
IGkgPSAwOyBpIDwgbnVtTGluZXMgJiYgbGluZTsgaSsrLCBsaW5lID0gbGluZS0+bmV4dFJvb3RC
b3goKSkgewotICAgICAgICBpZiAobGluZS0+bGluZUJyZWFrT2JqKCkgPT0gcmVzb2x2ZXIucG9z
aXRpb24oKS5yZW5kZXJlcigpICYmIGxpbmUtPmxpbmVCcmVha1BvcygpID09IHJlc29sdmVyLnBv
c2l0aW9uKCkub2Zmc2V0KCkpIHsKKyAgICAgICAgaWYgKGxpbmUtPmxpbmVCcmVha09iaigpID09
IHJlc29sdmVyLnBvc2l0aW9uKCkucmVuZGVyZXIoKSAmJiBsaW5lLT5saW5lQnJlYWtQb3MoKSA9
PSByZXNvbHZlci5wb3NpdGlvbigpLm9mZnNldCgpICYmICFsaW5lLT5oYXNBbm9ueW1vdXNJbmxp
bmVCbG9jaygpKSB7CiAgICAgICAgICAgICAvLyBXZSBoYXZlIGEgbWF0Y2guCiAgICAgICAgICAg
ICBpZiAobGluZS0+bGluZUJyZWFrQmlkaVN0YXR1cygpICE9IHJlc29sdmVyLnN0YXR1cygpKQog
ICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gLi4uYnV0IHRoZSBiaWRpIHN0YXRlIGRv
ZXNuJ3QgbWF0Y2guCkBAIC0yMDQ2LDQgKzIwNzQsNDAgQEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6
OnVwZGF0ZVJlZ2lvbkZvckxpbgogICAgICAgICBsaW5lQm94LT5zZXRJc0ZpcnN0QWZ0ZXJQYWdl
QnJlYWsodHJ1ZSk7CiB9CiAKK3ZvaWQgUmVuZGVyQmxvY2tGbG93OjptYXJnaW5Db2xsYXBzZUxp
bmVzRnJvbVN0YXJ0KE1hcmdpbkluZm8mIG1hcmdpbkluZm8sIFJvb3RJbmxpbmVCb3gqIHN0b3BM
aW5lKQoreworICAgIC8vIFdlIGhhdmUgdG8gaGFuZGxlIGFuIGFub255bW91cyBpbmxpbmUgYmxv
Y2sgc3RyZWFrIGF0IHRoZSBzdGFydCBvZiB0aGUgYmxvY2sgaW4gb3JkZXIgdG8gbWFrZSBzdXJl
IG91ciBvd24gbWFyZ2lucyBhcmUKKyAgICAvLyBjb3JyZWN0LiAgV2Ugb25seSBoYXZlIHRvIGRv
IHRoaXMgaWYgdGhlIGNoaWxkcmVuIGNhbiBwcm9wYWdhdGUgbWFyZ2lucyBvdXQgdG8gdXMuCisg
ICAgTGF5b3V0VW5pdCBwcmV2aW91c0Zsb2F0Qm90dG9tOworICAgIExheW91dFVuaXQgbWF4Rmxv
YXRCb3R0b207CisgICAgaWYgKG1hcmdpbkluZm8uY2FuQ29sbGFwc2VXaXRoTWFyZ2luQmVmb3Jl
KCkpIHsKKyAgICAgICAgaW50IGN1cnJIZWlnaHQgPSBsb2dpY2FsSGVpZ2h0KCk7CisgICAgICAg
IHNldEhlaWdodChib3JkZXJBbmRQYWRkaW5nQmVmb3JlKCkpOworICAgICAgICBSb290SW5saW5l
Qm94KiBzdGFydExpbmUgPSBmaXJzdFJvb3RCb3goKTsKKyAgICAgICAgUm9vdElubGluZUJveCog
Y3VycjsKKyAgICAgICAgZm9yIChjdXJyID0gc3RhcnRMaW5lOyBjdXJyICYmIGN1cnItPmhhc0Fu
b255bW91c0lubGluZUJsb2NrKCkgJiYgbWFyZ2luSW5mby5jYW5Db2xsYXBzZVdpdGhNYXJnaW5C
ZWZvcmUoKTsgY3VyciA9IGN1cnItPm5leHRSb290Qm94KCkpIHsKKyAgICAgICAgICAgIGlmIChj
dXJyID09IHN0b3BMaW5lKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGxh
eW91dEJsb2NrQ2hpbGQoKmN1cnItPmFub255bW91c0lubGluZUJsb2NrKCksIG1hcmdpbkluZm8s
IHByZXZpb3VzRmxvYXRCb3R0b20sIG1heEZsb2F0Qm90dG9tKTsKKyAgICAgICAgfQorICAgICAg
ICBzZXRMb2dpY2FsSGVpZ2h0KGN1cnJIZWlnaHQpOyAvLyBLZWVwIHRoZSBoZWlnaHQgdGhlIHNh
bWUsIHNpbmNlIG1hcmdpbiBjb2xsYXBzaW5nIHJlc2V0cyBpdCwgYW5kIHdlIGRvbid0IHdhbnQg
dGhhdC4KKyAgICB9CisgCisgICAgLy8gTm93IHRoYXQgd2UndmUgaGFuZGxlZCB0aGUgdG9wIG9m
IHRoZSBibG9jaywgaWYgdGhlIHN0b3BMaW5lIGlzbid0IGFuIGFub255bW91cyBibG9jaywgdGhl
biB3ZSdyZSBkb25lLgorICAgIGlmICghc3RvcExpbmUtPmhhc0Fub255bW91c0lubGluZUJsb2Nr
KCkpCisgICAgICAgIHJldHVybjsKKyAKKyAgICAvLyBSZS1ydW4gbWFyZ2luIGNvbGxhcHNpbmcg
b24gdGhlIGJsb2NrIHNlcXVlbmNlIHRoYXQgc3RvcExpbmUgaXMgYSBwYXJ0IG9mLgorICAgIC8v
IEZpcnN0IGdvIGJhY2t3YXJkcyB0byBnZXQgdGhlIGVudGlyZSBzZXF1ZW5jZS4KKyAgICBSb290
SW5saW5lQm94KiBwcmV2ID0gc3RvcExpbmU7CisgICAgZm9yICggOyBwcmV2LT5oYXNBbm9ueW1v
dXNJbmxpbmVCbG9jaygpOyBwcmV2ID0gcHJldi0+cHJldlJvb3RCb3goKSkgeyB9OworIAorICAg
IC8vIFVwZGF0ZSB0aGUgYmxvY2sgaGVpZ2h0IHRvIHRoZSBjb3JyZWN0IHN0YXRlLgorICAgIHNl
dExvZ2ljYWxIZWlnaHQocHJldi0+bGluZUJvdHRvbVdpdGhMZWFkaW5nKCkpOworIAorICAgIC8v
IE5vdyBydW4gbWFyZ2luIGNvbGxhcHNpbmcgb24gdGhvc2UgbGluZXMuCisgICAgZm9yIChwcmV2
ID0gcHJldi0+bmV4dFJvb3RCb3goKTsgcHJldiAhPSBzdG9wTGluZTsgcHJldiA9IHByZXYtPm5l
eHRSb290Qm94KCkpCisgICAgICAgIGxheW91dEJsb2NrQ2hpbGQoKnByZXYtPmFub255bW91c0lu
bGluZUJsb2NrKCksIG1hcmdpbkluZm8sIHByZXZpb3VzRmxvYXRCb3R0b20sIG1heEZsb2F0Qm90
dG9tKTsKK30KKyAKIH0KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCb3gu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCb3guY3Bw
CShyZXZpc2lvbiAxODEzMjkpCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQm94
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDI5OCw3ICs0Mjk4LDcgQEAgYm9vbCBSZW5kZXJCb3g6
OnNocmlua1RvQXZvaWRGbG9hdHMoKSBjbwogCiBib29sIFJlbmRlckJveDo6Y3JlYXRlc05ld0Zv
cm1hdHRpbmdDb250ZXh0KCkgY29uc3QKIHsKLSAgICByZXR1cm4gaXNJbmxpbmVCbG9ja09ySW5s
aW5lVGFibGUoKSB8fCBpc0Zsb2F0aW5nT3JPdXRPZkZsb3dQb3NpdGlvbmVkKCkgfHwgaGFzT3Zl
cmZsb3dDbGlwKCkgfHwgaXNGbGV4SXRlbUluY2x1ZGluZ0RlcHJlY2F0ZWQoKQorICAgIHJldHVy
biAoaXNJbmxpbmVCbG9ja09ySW5saW5lVGFibGUoKSAmJiAhaXNBbm9ueW1vdXNJbmxpbmVCbG9j
aygpKSB8fCBpc0Zsb2F0aW5nT3JPdXRPZkZsb3dQb3NpdGlvbmVkKCkgfHwgaGFzT3ZlcmZsb3dD
bGlwKCkgfHwgaXNGbGV4SXRlbUluY2x1ZGluZ0RlcHJlY2F0ZWQoKQogICAgICAgICB8fCBpc1Rh
YmxlQ2VsbCgpIHx8IGlzVGFibGVDYXB0aW9uKCkgfHwgaXNGaWVsZHNldCgpIHx8IGlzV3JpdGlu
Z01vZGVSb290KCkgfHwgaXNSb290KCkgfHwgaXNSZW5kZXJGbG93VGhyZWFkKCkgfHwgaXNSZW5k
ZXJSZWdpb24oKQogI2lmIEVOQUJMRShDU1NfR1JJRF9MQVlPVVQpCiAgICAgICAgIHx8IGlzR3Jp
ZEl0ZW0oKQpAQCAtNDMwOCw3ICs0MzA4LDcgQEAgYm9vbCBSZW5kZXJCb3g6OmNyZWF0ZXNOZXdG
b3JtYXR0aW5nQ29udAogCiBib29sIFJlbmRlckJveDo6YXZvaWRzRmxvYXRzKCkgY29uc3QKIHsK
LSAgICByZXR1cm4gaXNSZXBsYWNlZCgpIHx8IGlzSFIoKSB8fCBpc0xlZ2VuZCgpIHx8IGNyZWF0
ZXNOZXdGb3JtYXR0aW5nQ29udGV4dCgpOworICAgIHJldHVybiAhaXNBbm9ueW1vdXNJbmxpbmVC
bG9jaygpICYmIChpc1JlcGxhY2VkKCkgfHwgaXNIUigpIHx8IGlzTGVnZW5kKCkgfHwgY3JlYXRl
c05ld0Zvcm1hdHRpbmdDb250ZXh0KCkpOwogfQogCiB2b2lkIFJlbmRlckJveDo6YWRkVmlzdWFs
RWZmZWN0T3ZlcmZsb3coKQpAQCAtNDUyNSwxNCArNDUyNSwxOSBAQCBib29sIFJlbmRlckJveDo6
aXNVbnNwbGl0dGFibGVGb3JQYWdpbmF0CiAKIExheW91dFVuaXQgUmVuZGVyQm94OjpsaW5lSGVp
Z2h0KGJvb2wgLypmaXJzdExpbmUqLywgTGluZURpcmVjdGlvbk1vZGUgZGlyZWN0aW9uLCBMaW5l
UG9zaXRpb25Nb2RlIC8qbGluZVBvc2l0aW9uTW9kZSovKSBjb25zdAogewotICAgIGlmIChpc1Jl
cGxhY2VkKCkpCisgICAgaWYgKGlzUmVwbGFjZWQoKSkgeworICAgICAgICBpZiAoaXNBbm9ueW1v
dXNJbmxpbmVCbG9jaygpKQorICAgICAgICAgICAgcmV0dXJuIGRpcmVjdGlvbiA9PSBIb3Jpem9u
dGFsTGluZSA/IGhlaWdodCgpIDogd2lkdGgoKTsKICAgICAgICAgcmV0dXJuIGRpcmVjdGlvbiA9
PSBIb3Jpem9udGFsTGluZSA/IG1fbWFyZ2luQm94LnRvcCgpICsgaGVpZ2h0KCkgKyBtX21hcmdp
bkJveC5ib3R0b20oKSA6IG1fbWFyZ2luQm94LnJpZ2h0KCkgKyB3aWR0aCgpICsgbV9tYXJnaW5C
b3gubGVmdCgpOworICAgIH0KICAgICByZXR1cm4gMDsKIH0KIAogaW50IFJlbmRlckJveDo6YmFz
ZWxpbmVQb3NpdGlvbihGb250QmFzZWxpbmUgYmFzZWxpbmVUeXBlLCBib29sIC8qZmlyc3RMaW5l
Ki8sIExpbmVEaXJlY3Rpb25Nb2RlIGRpcmVjdGlvbiwgTGluZVBvc2l0aW9uTW9kZSAvKmxpbmVQ
b3NpdGlvbk1vZGUqLykgY29uc3QKIHsKICAgICBpZiAoaXNSZXBsYWNlZCgpKSB7CisgICAgICAg
IGlmIChpc0Fub255bW91c0lubGluZUJsb2NrKCkpCisgICAgICAgICAgICByZXR1cm4gZGlyZWN0
aW9uID09IEhvcml6b250YWxMaW5lID8gaGVpZ2h0KCkgOiB3aWR0aCgpOwogICAgICAgICBpbnQg
cmVzdWx0ID0gZGlyZWN0aW9uID09IEhvcml6b250YWxMaW5lID8gbV9tYXJnaW5Cb3gudG9wKCkg
KyBoZWlnaHQoKSArIG1fbWFyZ2luQm94LmJvdHRvbSgpIDogbV9tYXJnaW5Cb3gucmlnaHQoKSAr
IHdpZHRoKCkgKyBtX21hcmdpbkJveC5sZWZ0KCk7CiAgICAgICAgIGlmIChiYXNlbGluZVR5cGUg
PT0gQWxwaGFiZXRpY0Jhc2VsaW5lKQogICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKSW5kZXg6
IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCb3hNb2RlbE9iamVjdC5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJveE1vZGVsT2JqZWN0LmNw
cAkocmV2aXNpb24gMTgxMzI5KQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJv
eE1vZGVsT2JqZWN0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjYsMjIgKzY2LDcgQEAgbmFtZXNw
YWNlIFdlYkNvcmUgewogCiB1c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwogCi0vLyBUaGUgSGFz
aE1hcCBmb3Igc3RvcmluZyBjb250aW51YXRpb24gcG9pbnRlcnMuCi0vLyBBbiBpbmxpbmUgY2Fu
IGJlIHNwbGl0IHdpdGggYmxvY2tzIG9jY3VyaW5nIGluIGJldHdlZW4gdGhlIGlubGluZSBjb250
ZW50LgotLy8gV2hlbiB0aGlzIG9jY3VycyB3ZSBuZWVkIGEgcG9pbnRlciB0byB0aGUgbmV4dCBv
YmplY3QuIFdlIGNhbiBiYXNpY2FsbHkgYmUKLS8vIHNwbGl0IGludG8gYSBzZXF1ZW5jZSBvZiBp
bmxpbmVzIGFuZCBibG9ja3MuIFRoZSBjb250aW51YXRpb24gd2lsbCBlaXRoZXIgYmUKLS8vIGFu
IGFub255bW91cyBibG9jayAodGhhdCBob3VzZXMgb3RoZXIgYmxvY2tzKSBvciBpdCB3aWxsIGJl
IGFuIGlubGluZSBmbG93LgotLy8gPGI+PGk+PHA+SGVsbG88L3A+PC9pPjwvYj4uIEluIHRoaXMg
ZXhhbXBsZSB0aGUgPGk+IHdpbGwgaGF2ZSBhIGJsb2NrIGFzCi0vLyBpdHMgY29udGludWF0aW9u
IGJ1dCB0aGUgPGI+IHdpbGwganVzdCBoYXZlIGFuIGlubGluZSBhcyBpdHMgY29udGludWF0aW9u
LgotdHlwZWRlZiBIYXNoTWFwPGNvbnN0IFJlbmRlckJveE1vZGVsT2JqZWN0KiwgUmVuZGVyQm94
TW9kZWxPYmplY3QqPiBDb250aW51YXRpb25NYXA7Ci1zdGF0aWMgQ29udGludWF0aW9uTWFwJiBj
b250aW51YXRpb25NYXAoKQotewotICAgIHN0YXRpYyBOZXZlckRlc3Ryb3llZDxDb250aW51YXRp
b25NYXA+IG1hcDsKLSAgICByZXR1cm4gbWFwOwotfQotCi0vLyBUaGlzIEhhc2hNYXAgaXMgc2lt
aWxhciB0byB0aGUgY29udGludWF0aW9uIG1hcCwgYnV0IGNvbm5lY3RzIGZpcnN0LWxldHRlcgot
Ly8gcmVuZGVyZXJzIHRvIHRoZWlyIHJlbWFpbmluZyB0ZXh0IGZyYWdtZW50cy4KKy8vIFRoaXMg
SGFzaE1hcCBjb25uZWN0cyBmaXJzdC1sZXR0ZXIgcmVuZGVyZXJzIHRvIHRoZWlyIHJlbWFpbmlu
ZyB0ZXh0IGZyYWdtZW50cy4KIHR5cGVkZWYgSGFzaE1hcDxjb25zdCBSZW5kZXJCb3hNb2RlbE9i
amVjdCosIFJlbmRlclRleHRGcmFnbWVudCo+IEZpcnN0TGV0dGVyUmVtYWluaW5nVGV4dE1hcDsK
IHN0YXRpYyBGaXJzdExldHRlclJlbWFpbmluZ1RleHRNYXAqIGZpcnN0TGV0dGVyUmVtYWluaW5n
VGV4dE1hcCA9IDA7CiAKQEAgLTE4NywxMSArMTcyLDYgQEAgUmVuZGVyQm94TW9kZWxPYmplY3Q6
On5SZW5kZXJCb3hNb2RlbE9iagogCiB2b2lkIFJlbmRlckJveE1vZGVsT2JqZWN0Ojp3aWxsQmVE
ZXN0cm95ZWQoKQogewotICAgIGlmIChoYXNDb250aW51YXRpb24oKSkgewotICAgICAgICBjb250
aW51YXRpb24oKS0+ZGVzdHJveSgpOwotICAgICAgICBzZXRDb250aW51YXRpb24obnVsbHB0cik7
Ci0gICAgfQotCiAgICAgLy8gSWYgdGhpcyBpcyBhIGZpcnN0LWxldHRlciBvYmplY3Qgd2l0aCBh
IHJlbWFpbmluZyB0ZXh0IGZyYWdtZW50IHRoZW4gdGhlCiAgICAgLy8gZW50cnkgbmVlZHMgdG8g
YmUgY2xlYXJlZCBmcm9tIHRoZSBtYXAuCiAgICAgaWYgKGZpcnN0TGV0dGVyUmVtYWluaW5nVGV4
dCgpKQpAQCAtMjIxLDE4ICsyMDEsNiBAQCB2b2lkIFJlbmRlckJveE1vZGVsT2JqZWN0Ojp1cGRh
dGVGcm9tU3R5CiAgICAgc2V0SG9yaXpvbnRhbFdyaXRpbmdNb2RlKHN0eWxlVG9Vc2UuaXNIb3Jp
em9udGFsV3JpdGluZ01vZGUoKSk7CiB9CiAKLXN0YXRpYyBMYXlvdXRTaXplIGFjY3VtdWxhdGVJ
bkZsb3dQb3NpdGlvbk9mZnNldHMoY29uc3QgUmVuZGVyT2JqZWN0KiBjaGlsZCkKLXsKLSAgICBp
ZiAoIWNoaWxkLT5pc0Fub255bW91c0Jsb2NrKCkgfHwgIWNoaWxkLT5pc0luRmxvd1Bvc2l0aW9u
ZWQoKSkKLSAgICAgICAgcmV0dXJuIExheW91dFNpemUoKTsKLSAgICBMYXlvdXRTaXplIG9mZnNl
dDsKLSAgICBmb3IgKFJlbmRlckVsZW1lbnQqIHBhcmVudCA9IGRvd25jYXN0PFJlbmRlckJsb2Nr
PigqY2hpbGQpLmlubGluZUVsZW1lbnRDb250aW51YXRpb24oKTsgaXM8UmVuZGVySW5saW5lPihw
YXJlbnQpOyBwYXJlbnQgPSBwYXJlbnQtPnBhcmVudCgpKSB7Ci0gICAgICAgIGlmIChwYXJlbnQt
PmlzSW5GbG93UG9zaXRpb25lZCgpKQotICAgICAgICAgICAgb2Zmc2V0ICs9IGRvd25jYXN0PFJl
bmRlcklubGluZT4oKnBhcmVudCkub2Zmc2V0Rm9ySW5GbG93UG9zaXRpb24oKTsKLSAgICB9Ci0g
ICAgcmV0dXJuIG9mZnNldDsKLX0KLQogYm9vbCBSZW5kZXJCb3hNb2RlbE9iamVjdDo6aGFzQXV0
b0hlaWdodE9yQ29udGFpbmluZ0Jsb2NrV2l0aEF1dG9IZWlnaHQoKSBjb25zdAogewogICAgIExl
bmd0aCBsb2dpY2FsSGVpZ2h0TGVuZ3RoID0gc3R5bGUoKS5sb2dpY2FsSGVpZ2h0KCk7CkBAIC0y
NzIsNyArMjQwLDcgQEAgYm9vbCBSZW5kZXJCb3hNb2RlbE9iamVjdDo6aGFzQXV0b0hlaWdodAog
CiBMYXlvdXRTaXplIFJlbmRlckJveE1vZGVsT2JqZWN0OjpyZWxhdGl2ZVBvc2l0aW9uT2Zmc2V0
KCkgY29uc3QKIHsKLSAgICBMYXlvdXRTaXplIG9mZnNldCA9IGFjY3VtdWxhdGVJbkZsb3dQb3Np
dGlvbk9mZnNldHModGhpcyk7CisgICAgTGF5b3V0U2l6ZSBvZmZzZXQgPSBMYXlvdXRTaXplKCk7
CiAKICAgICBSZW5kZXJCbG9jayogY29udGFpbmluZ0Jsb2NrID0gdGhpcy0+Y29udGFpbmluZ0Js
b2NrKCk7CiAKQEAgLTI1MTIsMjIgKzI0ODAsNiBAQCBMYXlvdXRVbml0IFJlbmRlckJveE1vZGVs
T2JqZWN0Ojpjb250YWluCiAgICAgcmV0dXJuIGNvbnRhaW5pbmdCbG9jaygpLT5hdmFpbGFibGVM
b2dpY2FsV2lkdGgoKTsKIH0KIAotUmVuZGVyQm94TW9kZWxPYmplY3QqIFJlbmRlckJveE1vZGVs
T2JqZWN0Ojpjb250aW51YXRpb24oKSBjb25zdAotewotICAgIGlmICghaGFzQ29udGludWF0aW9u
KCkpCi0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIHJldHVybiBjb250aW51YXRpb25NYXAo
KS5nZXQodGhpcyk7Ci19Ci0KLXZvaWQgUmVuZGVyQm94TW9kZWxPYmplY3Q6OnNldENvbnRpbnVh
dGlvbihSZW5kZXJCb3hNb2RlbE9iamVjdCogY29udGludWF0aW9uKQotewotICAgIGlmIChjb250
aW51YXRpb24pCi0gICAgICAgIGNvbnRpbnVhdGlvbk1hcCgpLnNldCh0aGlzLCBjb250aW51YXRp
b24pOwotICAgIGVsc2UgaWYgKGhhc0NvbnRpbnVhdGlvbigpKQotICAgICAgICBjb250aW51YXRp
b25NYXAoKS5yZW1vdmUodGhpcyk7Ci0gICAgc2V0SGFzQ29udGludWF0aW9uKCEhY29udGludWF0
aW9uKTsKLX0KLQogUmVuZGVyVGV4dEZyYWdtZW50KiBSZW5kZXJCb3hNb2RlbE9iamVjdDo6Zmly
c3RMZXR0ZXJSZW1haW5pbmdUZXh0KCkgY29uc3QKIHsKICAgICBpZiAoIWZpcnN0TGV0dGVyUmVt
YWluaW5nVGV4dE1hcCkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCb3hN
b2RlbE9iamVjdC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5k
ZXJCb3hNb2RlbE9iamVjdC5oCShyZXZpc2lvbiAxODEzMjkpCisrKyBTb3VyY2UvV2ViQ29yZS9y
ZW5kZXJpbmcvUmVuZGVyQm94TW9kZWxPYmplY3QuaAkod29ya2luZyBjb3B5KQpAQCAtMjQ4LDkg
KzI0OCw2IEBAIHByb3RlY3RlZDoKIAogICAgIGJvb2wgc2hvdWxkUGFpbnRBdExvd1F1YWxpdHko
R3JhcGhpY3NDb250ZXh0KiwgSW1hZ2UqLCBjb25zdCB2b2lkKiwgY29uc3QgTGF5b3V0U2l6ZSYp
OwogCi0gICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGNvbnRpbnVhdGlvbigpIGNvbnN0OwotICAg
IHZvaWQgc2V0Q29udGludWF0aW9uKFJlbmRlckJveE1vZGVsT2JqZWN0Kik7Ci0KICAgICBMYXlv
dXRSZWN0IGxvY2FsQ2FyZXRSZWN0Rm9yRW1wdHlFbGVtZW50KExheW91dFVuaXQgd2lkdGgsIExh
eW91dFVuaXQgdGV4dEluZGVudE9mZnNldCk7CiAKICAgICBzdGF0aWMgYm9vbCBzaG91bGRBbnRp
YWxpYXNMaW5lcyhHcmFwaGljc0NvbnRleHQqKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRl
cmluZy9SZW5kZXJFbGVtZW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVy
aW5nL1JlbmRlckVsZW1lbnQuaAkocmV2aXNpb24gMTgxMzI5KQorKysgU291cmNlL1dlYkNvcmUv
cmVuZGVyaW5nL1JlbmRlckVsZW1lbnQuaAkod29ya2luZyBjb3B5KQpAQCAtMjI5LDkgKzIyOSw2
IEBAIHByb3RlY3RlZDoKICAgICB2b2lkIHNldFJlbmRlcklubGluZUFsd2F5c0NyZWF0ZXNMaW5l
Qm94ZXMoYm9vbCBiKSB7IG1fcmVuZGVySW5saW5lQWx3YXlzQ3JlYXRlc0xpbmVCb3hlcyA9IGI7
IH0KICAgICBib29sIHJlbmRlcklubGluZUFsd2F5c0NyZWF0ZXNMaW5lQm94ZXMoKSBjb25zdCB7
IHJldHVybiBtX3JlbmRlcklubGluZUFsd2F5c0NyZWF0ZXNMaW5lQm94ZXM7IH0KIAotICAgIHZv
aWQgc2V0SGFzQ29udGludWF0aW9uKGJvb2wgYikgeyBtX2hhc0NvbnRpbnVhdGlvbiA9IGI7IH0K
LSAgICBib29sIGhhc0NvbnRpbnVhdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1faGFzQ29udGludWF0
aW9uOyB9Ci0KICAgICBzdGF0aWMgYm9vbCBoYXNDb250cm9sU3RhdGVzRm9yUmVuZGVyZXIoY29u
c3QgUmVuZGVyT2JqZWN0Kik7CiAgICAgc3RhdGljIENvbnRyb2xTdGF0ZXMqIGNvbnRyb2xTdGF0
ZXNGb3JSZW5kZXJlcihjb25zdCBSZW5kZXJPYmplY3QqKTsKICAgICBzdGF0aWMgdm9pZCByZW1v
dmVDb250cm9sU3RhdGVzRm9yUmVuZGVyZXIoY29uc3QgUmVuZGVyT2JqZWN0Kik7CkBAIC0yOTIs
NyArMjg5LDYgQEAgcHJpdmF0ZToKICAgICB1bnNpZ25lZCBtX2hhc1BhdXNlZEltYWdlQW5pbWF0
aW9ucyA6IDE7CiAgICAgdW5zaWduZWQgbV9oYXNDb3VudGVyTm9kZU1hcCA6IDE7CiAgICAgdW5z
aWduZWQgbV9pc0NTU0FuaW1hdGluZyA6IDE7Ci0gICAgdW5zaWduZWQgbV9oYXNDb250aW51YXRp
b24gOiAxOwogCiAgICAgdW5zaWduZWQgbV9yZW5kZXJCbG9ja0hhc01hcmdpbkJlZm9yZVF1aXJr
IDogMTsKICAgICB1bnNpZ25lZCBtX3JlbmRlckJsb2NrSGFzTWFyZ2luQWZ0ZXJRdWlyayA6IDE7
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVySW5saW5lLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVySW5saW5lLmNwcAkocmV2aXNp
b24gMTgxMzI5KQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlcklubGluZS5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTEzOCwzMCArMTM4LDYgQEAgc3RhdGljIFJlbmRlckVsZW1lbnQq
IGluRmxvd1Bvc2l0aW9uZWRJbgogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCB1cGRh
dGVTdHlsZU9mQW5vbnltb3VzQmxvY2tDb250aW51YXRpb25zKFJlbmRlckJveCogYm94LCBjb25z
dCBSZW5kZXJTdHlsZSogbmV3U3R5bGUsIGNvbnN0IFJlbmRlclN0eWxlKiBvbGRTdHlsZSkKLXsK
LSAgICBmb3IgKDtib3ggJiYgYm94LT5pc0Fub255bW91c0Jsb2NrKCk7IGJveCA9IGJveC0+bmV4
dFNpYmxpbmdCb3goKSkgewotICAgICAgICBpZiAoYm94LT5zdHlsZSgpLnBvc2l0aW9uKCkgPT0g
bmV3U3R5bGUtPnBvc2l0aW9uKCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgCi0g
ICAgICAgIGlmICghaXM8UmVuZGVyQmxvY2s+KCpib3gpKQotICAgICAgICAgICAgY29udGludWU7
Ci0KLSAgICAgICAgUmVuZGVyQmxvY2smIGJsb2NrID0gZG93bmNhc3Q8UmVuZGVyQmxvY2s+KCpi
b3gpOwotICAgICAgICBpZiAoIWJsb2NrLmlzQW5vbnltb3VzQmxvY2tDb250aW51YXRpb24oKSkK
LSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAKLSAgICAgICAgLy8gSWYgd2UgYXJlIG5v
IGxvbmdlciBpbi1mbG93IHBvc2l0aW9uZWQgYnV0IG91ciBkZXNjZW5kYW50IGJsb2NrKHMpIHN0
aWxsIGhhdmUgYW4gaW4tZmxvdyBwb3NpdGlvbmVkIGFuY2VzdG9yIHRoZW4KLSAgICAgICAgLy8g
dGhlaXIgY29udGFpbmluZyBhbm9ueW1vdXMgYmxvY2sgc2hvdWxkIGtlZXAgaXRzIGluLWZsb3cg
cG9zaXRpb25pbmcuIAotICAgICAgICBSZW5kZXJJbmxpbmUqIGNvbnRpbnVhdGlvbiA9IGJsb2Nr
LmlubGluZUVsZW1lbnRDb250aW51YXRpb24oKTsKLSAgICAgICAgaWYgKG9sZFN0eWxlLT5oYXNJ
bkZsb3dQb3NpdGlvbigpICYmIGluRmxvd1Bvc2l0aW9uZWRJbmxpbmVBbmNlc3Rvcihjb250aW51
YXRpb24pKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGF1dG8gYmxvY2tTdHlsZSA9
IFJlbmRlclN0eWxlOjpjcmVhdGVBbm9ueW1vdXNTdHlsZVdpdGhEaXNwbGF5KCZibG9jay5zdHls
ZSgpLCBCTE9DSyk7Ci0gICAgICAgIGJsb2NrU3R5bGUuZ2V0KCkuc2V0UG9zaXRpb24obmV3U3R5
bGUtPnBvc2l0aW9uKCkpOwotICAgICAgICBibG9jay5zZXRTdHlsZShXVEY6Om1vdmUoYmxvY2tT
dHlsZSkpOwotICAgIH0KLX0KLQogdm9pZCBSZW5kZXJJbmxpbmU6OnN0eWxlRGlkQ2hhbmdlKFN0
eWxlRGlmZmVyZW5jZSBkaWZmLCBjb25zdCBSZW5kZXJTdHlsZSogb2xkU3R5bGUpCiB7CiAgICAg
UmVuZGVyQm94TW9kZWxPYmplY3Q6OnN0eWxlRGlkQ2hhbmdlKGRpZmYsIG9sZFN0eWxlKTsKQEAg
LTE3MywyMyArMTQ5LDYgQEAgdm9pZCBSZW5kZXJJbmxpbmU6OnN0eWxlRGlkQ2hhbmdlKFN0eWxl
RAogICAgIC8vIGFuZCBhZnRlciB0aGUgYmxvY2sgc2hhcmUgdGhlIHNhbWUgc3R5bGUsIGJ1dCB0
aGUgYmxvY2sgZG9lc24ndAogICAgIC8vIG5lZWQgdG8gcGFzcyBpdHMgc3R5bGUgb24gdG8gYW55
b25lIGVsc2UuCiAgICAgUmVuZGVyU3R5bGUmIG5ld1N0eWxlID0gc3R5bGUoKTsKLSAgICBSZW5k
ZXJJbmxpbmUqIGNvbnRpbnVhdGlvbiA9IGlubGluZUVsZW1lbnRDb250aW51YXRpb24oKTsKLSAg
ICBmb3IgKFJlbmRlcklubGluZSogY3VyckNvbnQgPSBjb250aW51YXRpb247IGN1cnJDb250OyBj
dXJyQ29udCA9IGN1cnJDb250LT5pbmxpbmVFbGVtZW50Q29udGludWF0aW9uKCkpIHsKLSAgICAg
ICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIG5leHRDb250ID0gY3VyckNvbnQtPmNvbnRpbnVhdGlv
bigpOwotICAgICAgICBjdXJyQ29udC0+c2V0Q29udGludWF0aW9uKG51bGxwdHIpOwotICAgICAg
ICBjdXJyQ29udC0+c2V0U3R5bGUobmV3U3R5bGUpOwotICAgICAgICBjdXJyQ29udC0+c2V0Q29u
dGludWF0aW9uKG5leHRDb250KTsKLSAgICB9Ci0KLSAgICAvLyBJZiBhbiBpbmxpbmUncyBpbi1m
bG93IHBvc2l0aW9uaW5nIGhhcyBjaGFuZ2VkIHRoZW4gYW55IGRlc2NlbmRhbnQgYmxvY2tzIHdp
bGwgbmVlZCB0byBjaGFuZ2UgdGhlaXIgaW4tZmxvdyBwb3NpdGlvbmluZyBhY2NvcmRpbmdseS4K
LSAgICAvLyBEbyB0aGlzIGJ5IHVwZGF0aW5nIHRoZSBwb3NpdGlvbiBvZiB0aGUgZGVzY2VuZGFu
dCBibG9ja3MnIGNvbnRhaW5pbmcgYW5vbnltb3VzIGJsb2NrcyAtIHRoZXJlIG1heSBiZSBtb3Jl
IHRoYW4gb25lLgotICAgIGlmIChjb250aW51YXRpb24gJiYgb2xkU3R5bGUgJiYgbmV3U3R5bGUu
cG9zaXRpb24oKSAhPSBvbGRTdHlsZS0+cG9zaXRpb24oKQotICAgICAgICAmJiAobmV3U3R5bGUu
aGFzSW5GbG93UG9zaXRpb24oKSB8fCBvbGRTdHlsZS0+aGFzSW5GbG93UG9zaXRpb24oKSkpIHsK
LSAgICAgICAgLy8gSWYgYW55IGRlc2NlbmRhbnQgYmxvY2tzIGV4aXN0IHRoZW4gdGhleSB3aWxs
IGJlIGluIHRoZSBuZXh0IGFub255bW91cyBibG9jayBhbmQgaXRzIHNpYmxpbmdzLgotICAgICAg
ICBSZW5kZXJPYmplY3QqIGJsb2NrID0gY29udGFpbmluZ0Jsb2NrKCktPm5leHRTaWJsaW5nKCk7
Ci0gICAgICAgIEFTU0VSVChibG9jayAmJiBibG9jay0+aXNBbm9ueW1vdXNCbG9jaygpKTsKLSAg
ICAgICAgdXBkYXRlU3R5bGVPZkFub255bW91c0Jsb2NrQ29udGludWF0aW9ucyhkb3duY2FzdDxS
ZW5kZXJCbG9jaz4oYmxvY2spLCAmbmV3U3R5bGUsIG9sZFN0eWxlKTsKLSAgICB9CiAKICAgICBp
ZiAoIWFsd2F5c0NyZWF0ZUxpbmVCb3hlcygpKSB7CiAgICAgICAgIGJvb2wgYWx3YXlzQ3JlYXRl
TGluZUJveGVzID0gaGFzU2VsZlBhaW50aW5nTGF5ZXIoKSB8fCBoYXNCb3hEZWNvcmF0aW9ucygp
IHx8IG5ld1N0eWxlLmhhc1BhZGRpbmcoKSB8fCBuZXdTdHlsZS5oYXNNYXJnaW4oKSB8fCBoYXNP
dXRsaW5lKCk7CkBAIC0yNjIsNDMgKzIyMSw5IEBAIExheW91dFJlY3QgUmVuZGVySW5saW5lOjps
b2NhbENhcmV0UmVjdCgKIAogdm9pZCBSZW5kZXJJbmxpbmU6OmFkZENoaWxkKFJlbmRlck9iamVj
dCogbmV3Q2hpbGQsIFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQpCiB7Ci0gICAgaWYgKGNvbnRp
bnVhdGlvbigpKQotICAgICAgICByZXR1cm4gYWRkQ2hpbGRUb0NvbnRpbnVhdGlvbihuZXdDaGls
ZCwgYmVmb3JlQ2hpbGQpOwogICAgIHJldHVybiBhZGRDaGlsZElnbm9yaW5nQ29udGludWF0aW9u
KG5ld0NoaWxkLCBiZWZvcmVDaGlsZCk7CiB9CiAKLXN0YXRpYyBSZW5kZXJCb3hNb2RlbE9iamVj
dCogbmV4dENvbnRpbnVhdGlvbihSZW5kZXJPYmplY3QqIHJlbmRlcmVyKQotewotICAgIGlmIChp
czxSZW5kZXJJbmxpbmU+KCpyZW5kZXJlcikgJiYgIXJlbmRlcmVyLT5pc1JlcGxhY2VkKCkpCi0g
ICAgICAgIHJldHVybiBkb3duY2FzdDxSZW5kZXJJbmxpbmU+KCpyZW5kZXJlcikuY29udGludWF0
aW9uKCk7Ci0gICAgcmV0dXJuIGRvd25jYXN0PFJlbmRlckJsb2NrPigqcmVuZGVyZXIpLmlubGlu
ZUVsZW1lbnRDb250aW51YXRpb24oKTsKLX0KLQotUmVuZGVyQm94TW9kZWxPYmplY3QqIFJlbmRl
cklubGluZTo6Y29udGludWF0aW9uQmVmb3JlKFJlbmRlck9iamVjdCogYmVmb3JlQ2hpbGQpCi17
Ci0gICAgaWYgKGJlZm9yZUNoaWxkICYmIGJlZm9yZUNoaWxkLT5wYXJlbnQoKSA9PSB0aGlzKQot
ICAgICAgICByZXR1cm4gdGhpczsKLQotICAgIFJlbmRlckJveE1vZGVsT2JqZWN0KiBjdXJyID0g
bmV4dENvbnRpbnVhdGlvbih0aGlzKTsKLSAgICBSZW5kZXJCb3hNb2RlbE9iamVjdCogbmV4dFRv
TGFzdCA9IHRoaXM7Ci0gICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGxhc3QgPSB0aGlzOwotICAg
IHdoaWxlIChjdXJyKSB7Ci0gICAgICAgIGlmIChiZWZvcmVDaGlsZCAmJiBiZWZvcmVDaGlsZC0+
cGFyZW50KCkgPT0gY3VycikgewotICAgICAgICAgICAgaWYgKGN1cnItPmZpcnN0Q2hpbGQoKSA9
PSBiZWZvcmVDaGlsZCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbGFzdDsKLSAgICAgICAgICAg
IHJldHVybiBjdXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgbmV4dFRvTGFzdCA9IGxhc3Q7Ci0g
ICAgICAgIGxhc3QgPSBjdXJyOwotICAgICAgICBjdXJyID0gbmV4dENvbnRpbnVhdGlvbihjdXJy
KTsKLSAgICB9Ci0KLSAgICBpZiAoIWJlZm9yZUNoaWxkICYmICFsYXN0LT5maXJzdENoaWxkKCkp
Ci0gICAgICAgIHJldHVybiBuZXh0VG9MYXN0OwotICAgIHJldHVybiBsYXN0OwotfQotCiB2b2lk
IFJlbmRlcklubGluZTo6YWRkQ2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihSZW5kZXJPYmplY3Qq
IG5ld0NoaWxkLCBSZW5kZXJPYmplY3QqIGJlZm9yZUNoaWxkKQogewogICAgIC8vIE1ha2Ugc3Vy
ZSB3ZSBkb24ndCBhcHBlbmQgdGhpbmdzIGFmdGVyIDphZnRlci1nZW5lcmF0ZWQgY29udGVudCBp
ZiB3ZSBoYXZlIGl0LgpAQCAtNTA2LDEyICs0MzEsOCBAQCB2b2lkIFJlbmRlcklubGluZTo6YWRk
Q2hpbGRUb0NvbnRpbnVhdGlvCiAgICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGJlZm9yZUNoaWxk
UGFyZW50ID0gbnVsbHB0cjsKICAgICBpZiAoYmVmb3JlQ2hpbGQpCiAgICAgICAgIGJlZm9yZUNo
aWxkUGFyZW50ID0gZG93bmNhc3Q8UmVuZGVyQm94TW9kZWxPYmplY3Q+KGJlZm9yZUNoaWxkLT5w
YXJlbnQoKSk7Ci0gICAgZWxzZSB7Ci0gICAgICAgIGlmIChSZW5kZXJCb3hNb2RlbE9iamVjdCog
Y29udGludWF0aW9uID0gbmV4dENvbnRpbnVhdGlvbihmbG93KSkKLSAgICAgICAgICAgIGJlZm9y
ZUNoaWxkUGFyZW50ID0gY29udGludWF0aW9uOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBi
ZWZvcmVDaGlsZFBhcmVudCA9IGZsb3c7Ci0gICAgfQorICAgIGVsc2UKKyAgICAgICAgYmVmb3Jl
Q2hpbGRQYXJlbnQgPSBmbG93OwogCiAgICAgaWYgKG5ld0NoaWxkLT5pc0Zsb2F0aW5nT3JPdXRP
ZkZsb3dQb3NpdGlvbmVkKCkpCiAgICAgICAgIHJldHVybiBiZWZvcmVDaGlsZFBhcmVudC0+YWRk
Q2hpbGRJZ25vcmluZ0NvbnRpbnVhdGlvbihuZXdDaGlsZCwgYmVmb3JlQ2hpbGQpOwpAQCAtMTM3
NiwxNSArMTI5NywxNiBAQCB2b2lkIFJlbmRlcklubGluZTo6ZGVsZXRlTGluZXMoKQogICAgIG1f
bGluZUJveGVzLmRlbGV0ZUxpbmVCb3hUcmVlKCk7CiB9CiAKLXN0ZDo6dW5pcXVlX3B0cjxJbmxp
bmVGbG93Qm94PiBSZW5kZXJJbmxpbmU6OmNyZWF0ZUlubGluZUZsb3dCb3goKQorc3RkOjp1bmlx
dWVfcHRyPElubGluZUZsb3dCb3g+IFJlbmRlcklubGluZTo6Y3JlYXRlSW5saW5lRmxvd0JveChS
ZW5kZXJCbG9ja0Zsb3cqIGFub255bW91c0lubGluZUJsb2NrKQogewotICAgIHJldHVybiBzdGQ6
Om1ha2VfdW5pcXVlPElubGluZUZsb3dCb3g+KCp0aGlzKTsKKyAgICByZXR1cm4gYW5vbnltb3Vz
SW5saW5lQmxvY2sgPyBzdGQ6Om1ha2VfdW5pcXVlPElubGluZUZsb3dBbm9ueW1vdXNJbmxpbmVC
bG9ja0JveD4oKnRoaXMpIDogc3RkOjptYWtlX3VuaXF1ZTxJbmxpbmVGbG93Qm94PigqdGhpcyk7
CiB9CiAKLUlubGluZUZsb3dCb3gqIFJlbmRlcklubGluZTo6Y3JlYXRlQW5kQXBwZW5kSW5saW5l
Rmxvd0JveCgpCitJbmxpbmVGbG93Qm94KiBSZW5kZXJJbmxpbmU6OmNyZWF0ZUFuZEFwcGVuZElu
bGluZUZsb3dCb3goUmVuZGVyQmxvY2tGbG93KiBhbm9ueW1vdXNJbmxpbmVCbG9jaykKIHsKICAg
ICBzZXRBbHdheXNDcmVhdGVMaW5lQm94ZXMoKTsKLSAgICBhdXRvIG5ld0Zsb3dCb3ggPSBjcmVh
dGVJbmxpbmVGbG93Qm94KCk7CisgICAgCisgICAgYXV0byBuZXdGbG93Qm94ID0gY3JlYXRlSW5s
aW5lRmxvd0JveChhbm9ueW1vdXNJbmxpbmVCbG9jayk7CiAgICAgYXV0byBmbG93Qm94ID0gbmV3
Rmxvd0JveC5nZXQoKTsKICAgICBtX2xpbmVCb3hlcy5hcHBlbmRMaW5lQm94KFdURjo6bW92ZShu
ZXdGbG93Qm94KSk7CiAgICAgcmV0dXJuIGZsb3dCb3g7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9y
ZW5kZXJpbmcvUmVuZGVySW5saW5lLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlcklubGluZS5oCShyZXZpc2lvbiAxODEzMjkpCisrKyBTb3VyY2UvV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVySW5saW5lLmgJKHdvcmtpbmcgY29weSkKQEAgLTYzLDcgKzYzLDcg
QEAgcHVibGljOgogICAgIExheW91dFJlY3QgbGluZXNWaXN1YWxPdmVyZmxvd0JvdW5kaW5nQm94
KCkgY29uc3Q7CiAgICAgTGF5b3V0UmVjdCBsaW5lc1Zpc3VhbE92ZXJmbG93Qm91bmRpbmdCb3hJ
blJlZ2lvbihjb25zdCBSZW5kZXJSZWdpb24qKSBjb25zdDsKIAotICAgIElubGluZUZsb3dCb3gq
IGNyZWF0ZUFuZEFwcGVuZElubGluZUZsb3dCb3goKTsKKyAgICBJbmxpbmVGbG93Qm94KiBjcmVh
dGVBbmRBcHBlbmRJbmxpbmVGbG93Qm94KFJlbmRlckJsb2NrRmxvdyogYW5vbnltb3VzSW5saW5l
QmxvY2spOwogCiAgICAgdm9pZCBkaXJ0eUxpbmVCb3hlcyhib29sIGZ1bGxMYXlvdXQpOwogICAg
IHZvaWQgZGVsZXRlTGluZXMoKTsKQEAgLTgwLDkgKzgwLDYgQEAgcHVibGljOgogICAgIHZpcnR1
YWwgdm9pZCBhYnNvbHV0ZVF1YWRzRm9yU2VsZWN0aW9uKFZlY3RvcjxGbG9hdFF1YWQ+JiBxdWFk
cykgY29uc3Qgb3ZlcnJpZGU7CiAjZW5kaWYKIAotICAgIHZpcnR1YWwgUmVuZGVyQm94TW9kZWxP
YmplY3QqIHZpcnR1YWxDb250aW51YXRpb24oKSBjb25zdCBvdmVycmlkZSBmaW5hbCB7IHJldHVy
biBjb250aW51YXRpb24oKTsgfQotICAgIFJlbmRlcklubGluZSogaW5saW5lRWxlbWVudENvbnRp
bnVhdGlvbigpIGNvbnN0OwotCiAgICAgdmlydHVhbCB2b2lkIHVwZGF0ZURyYWdTdGF0ZShib29s
IGRyYWdPbikgb3ZlcnJpZGUgZmluYWw7CiAgICAgCiAgICAgTGF5b3V0U2l6ZSBvZmZzZXRGb3JJ
bkZsb3dQb3NpdGlvbmVkSW5saW5lKGNvbnN0IFJlbmRlckJveCogY2hpbGQpIGNvbnN0OwpAQCAt
OTAsOSArODcsNiBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCB2b2lkIGFkZEZvY3VzUmluZ1JlY3Rz
KFZlY3RvcjxJbnRSZWN0PiYsIGNvbnN0IExheW91dFBvaW50JiBhZGRpdGlvbmFsT2Zmc2V0LCBj
b25zdCBSZW5kZXJMYXllck1vZGVsT2JqZWN0KiBwYWludENvbnRhaW5lciA9IDApIG92ZXJyaWRl
IGZpbmFsOwogICAgIHZvaWQgcGFpbnRPdXRsaW5lKFBhaW50SW5mbyYsIGNvbnN0IExheW91dFBv
aW50Jik7CiAKLSAgICB1c2luZyBSZW5kZXJCb3hNb2RlbE9iamVjdDo6Y29udGludWF0aW9uOwot
ICAgIHVzaW5nIFJlbmRlckJveE1vZGVsT2JqZWN0OjpzZXRDb250aW51YXRpb247Ci0KICAgICBi
b29sIGFsd2F5c0NyZWF0ZUxpbmVCb3hlcygpIGNvbnN0IHsgcmV0dXJuIHJlbmRlcklubGluZUFs
d2F5c0NyZWF0ZXNMaW5lQm94ZXMoKTsgfQogICAgIHZvaWQgc2V0QWx3YXlzQ3JlYXRlTGluZUJv
eGVzKCkgeyBzZXRSZW5kZXJJbmxpbmVBbHdheXNDcmVhdGVzTGluZUJveGVzKHRydWUpOyB9CiAg
ICAgdm9pZCB1cGRhdGVBbHdheXNDcmVhdGVMaW5lQm94ZXMoYm9vbCBmdWxsTGF5b3V0KTsKQEAg
LTE1NCw3ICsxNDgsNyBAQCBwcml2YXRlOgogCiAgICAgdmlydHVhbCBMYXlvdXRSZWN0IGZyYW1l
UmVjdEZvclN0aWNreVBvc2l0aW9uaW5nKCkgY29uc3Qgb3ZlcnJpZGUgZmluYWwgeyByZXR1cm4g
bGluZXNCb3VuZGluZ0JveCgpOyB9CiAKLSAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxJbmxp
bmVGbG93Qm94PiBjcmVhdGVJbmxpbmVGbG93Qm94KCk7IC8vIFN1YmNsYXNzZWQgYnkgUmVuZGVy
U1ZHSW5saW5lCisgICAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8SW5saW5lRmxvd0JveD4gY3Jl
YXRlSW5saW5lRmxvd0JveChSZW5kZXJCbG9ja0Zsb3cqIGFub255bW91c0lubGluZUJsb2NrKTsg
Ly8gU3ViY2xhc3NlZCBieSBSZW5kZXJTVkdJbmxpbmUKIAogICAgIHZpcnR1YWwgdm9pZCBkaXJ0
eUxpbmVzRnJvbUNoYW5nZWRDaGlsZChSZW5kZXJPYmplY3QmIGNoaWxkKSBvdmVycmlkZSBmaW5h
bCB7IG1fbGluZUJveGVzLmRpcnR5TGluZXNGcm9tQ2hhbmdlZENoaWxkKCp0aGlzLCBjaGlsZCk7
IH0KIApAQCAtMTczLDEwICsxNjcsOCBAQCBwcml2YXRlOgogICAgIAogICAgIFJlbmRlclB0cjxS
ZW5kZXJJbmxpbmU+IGNsb25lKCkgY29uc3Q7CiAKLSAgICB2b2lkIHBhaW50T3V0bGluZUZvckxp
bmUoR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgTGF5b3V0UG9pbnQmLCBjb25zdCBMYXlvdXRSZWN0
JiBwcmV2TGluZSwgY29uc3QgTGF5b3V0UmVjdCYgdGhpc0xpbmUsCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGNvbnN0IExheW91dFJlY3QmIG5leHRMaW5lLCBjb25zdCBDb2xvcik7Ci0g
ICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGNvbnRpbnVhdGlvbkJlZm9yZShSZW5kZXJPYmplY3Qq
IGJlZm9yZUNoaWxkKTsKLQorICAgIHZvaWQgcGFpbnRPdXRsaW5lRm9yTGluZShHcmFwaGljc0Nv
bnRleHQqLCBjb25zdCBMYXlvdXRQb2ludCYsIGNvbnN0IExheW91dFJlY3QmIHByZXZMaW5lLCBj
b25zdCBMYXlvdXRSZWN0JiB0aGlzTGluZSwgY29uc3QgTGF5b3V0UmVjdCYgbmV4dExpbmUsIGNv
bnN0IENvbG9yKTsKKyAKICAgICBSZW5kZXJMaW5lQm94TGlzdCBtX2xpbmVCb3hlczsgICAvLyBB
bGwgb2YgdGhlIGxpbmUgYm94ZXMgY3JlYXRlZCBmb3IgdGhpcyBpbmxpbmUgZmxvdy4gIEZvciBl
eGFtcGxlLCA8aT5IZWxsbzxicj53b3JsZC48L2k+IHdpbGwgaGF2ZSB0d28gPGk+IGxpbmUgYm94
ZXMuCiB9OwogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGlzdEl0ZW0u
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMaXN0SXRl
bS5jcHAJKHJldmlzaW9uIDE4MTMyOSkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5k
ZXJMaXN0SXRlbS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI5Niw3ICsyOTYsNyBAQCB2b2lkIFJl
bmRlckxpc3RJdGVtOjppbnNlcnRPck1vdmVNYXJrZXJSCiAgICAgICAgIG5ld1BhcmVudC0+YWRk
Q2hpbGQobV9tYXJrZXIsIGZpcnN0Tm9uTWFya2VyQ2hpbGQoKm5ld1BhcmVudCkpOwogICAgICAg
ICBtX21hcmtlci0+dXBkYXRlTWFyZ2luc0FuZENvbnRlbnQoKTsKICAgICAgICAgLy8gSWYgY3Vy
cmVudCBwYXJlbnQgaXMgYW4gYW5vbnltb3VzIGJsb2NrIHRoYXQgaGFzIGxvc3QgYWxsIGl0cyBj
aGlsZHJlbiwgZGVzdHJveSBpdC4KLSAgICAgICAgaWYgKGN1cnJlbnRQYXJlbnQgJiYgY3VycmVu
dFBhcmVudC0+aXNBbm9ueW1vdXNCbG9jaygpICYmICFjdXJyZW50UGFyZW50LT5maXJzdENoaWxk
KCkgJiYgIWRvd25jYXN0PFJlbmRlckJsb2NrPigqY3VycmVudFBhcmVudCkuY29udGludWF0aW9u
KCkpCisgICAgICAgIGlmIChjdXJyZW50UGFyZW50ICYmIGN1cnJlbnRQYXJlbnQtPmlzQW5vbnlt
b3VzQmxvY2soKSAmJiAhY3VycmVudFBhcmVudC0+Zmlyc3RDaGlsZCgpKQogICAgICAgICAgICAg
Y3VycmVudFBhcmVudC0+ZGVzdHJveSgpOwogICAgIH0KIApJbmRleDogU291cmNlL1dlYkNvcmUv
cmVuZGVyaW5nL1JlbmRlck9iamVjdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUv
cmVuZGVyaW5nL1JlbmRlck9iamVjdC5jcHAJKHJldmlzaW9uIDE4MTMyOSkKKysrIFNvdXJjZS9X
ZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMTUw
LDggKzIxNTAsNiBAQCB2b2lkIFJlbmRlck9iamVjdDo6Z2V0VGV4dERlY29yYXRpb25Db2xvCiAg
ICAgICAgIGlmIChjdXJyZW50LT5pc1J1YnlUZXh0KCkpCiAgICAgICAgICAgICByZXR1cm47CiAg
ICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5wYXJlbnQoKTsKLSAgICAgICAgaWYgKGN1cnJlbnQg
JiYgY3VycmVudC0+aXNBbm9ueW1vdXNCbG9jaygpICYmIGRvd25jYXN0PFJlbmRlckJsb2NrPigq
Y3VycmVudCkuY29udGludWF0aW9uKCkpCi0gICAgICAgICAgICBjdXJyZW50ID0gZG93bmNhc3Q8
UmVuZGVyQmxvY2s+KCpjdXJyZW50KS5jb250aW51YXRpb24oKTsKICAgICB9IHdoaWxlIChjdXJy
ZW50ICYmIGRlY29yYXRpb25zICYmICghY3VycmVudC0+bm9kZSgpIHx8ICghaXM8SFRNTEFuY2hv
ckVsZW1lbnQ+KCpjdXJyZW50LT5ub2RlKCkpICYmICFjdXJyZW50LT5ub2RlKCktPmhhc1RhZ05h
bWUoZm9udFRhZykpKSk7CiAKICAgICAvLyBJZiB3ZSBiYWlsZWQgb3V0LCB1c2UgdGhlIGVsZW1l
bnQgd2UgYmFpbGVkIG91dCBhdCAodHlwaWNhbGx5IGEgPGZvbnQ+IG9yIDxhPiBlbGVtZW50KS4K
SW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3QuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmgJKHJldmlzaW9uIDE4
MTMyOSkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJPYmplY3QuaAkod29ya2lu
ZyBjb3B5KQpAQCAtNDg5LDEwICs0ODksMTAgQEAgcHVibGljOgogI2VuZGlmCiAgICAgICAgICAg
ICA7CiAgICAgfQotICAgIGJvb2wgaXNFbGVtZW50Q29udGludWF0aW9uKCkgY29uc3QgeyByZXR1
cm4gbm9kZSgpICYmIG5vZGUoKS0+cmVuZGVyZXIoKSAhPSB0aGlzOyB9Ci0gICAgYm9vbCBpc0lu
bGluZUVsZW1lbnRDb250aW51YXRpb24oKSBjb25zdCB7IHJldHVybiBpc0VsZW1lbnRDb250aW51
YXRpb24oKSAmJiBpc0lubGluZSgpOyB9Ci0gICAgYm9vbCBpc0Jsb2NrRWxlbWVudENvbnRpbnVh
dGlvbigpIGNvbnN0IHsgcmV0dXJuIGlzRWxlbWVudENvbnRpbnVhdGlvbigpICYmICFpc0lubGlu
ZSgpOyB9Ci0gICAgdmlydHVhbCBSZW5kZXJCb3hNb2RlbE9iamVjdCogdmlydHVhbENvbnRpbnVh
dGlvbigpIGNvbnN0IHsgcmV0dXJuIG51bGxwdHI7IH0KKyAgICBib29sIGlzQW5vbnltb3VzSW5s
aW5lQmxvY2soKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzQW5vbnltb3VzKCkgJiYg
c3R5bGUoKS5kaXNwbGF5KCkgPT0gSU5MSU5FX0JMT0NLICYmIHN0eWxlKCkuc3R5bGVUeXBlKCkg
PT0gTk9QU0VVRE8gJiYgIWlzVGV4dCgpICYmICFpc1J1YnlSdW4oKSAmJiAhaXNSdWJ5QmFzZSgp
OworICAgIH0KIAogICAgIGJvb2wgaXNGbG9hdGluZygpIGNvbnN0IHsgcmV0dXJuIG1fYml0Zmll
bGRzLmZsb2F0aW5nKCk7IH0KIApJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1Jvb3RJ
bmxpbmVCb3guaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUm9vdElu
bGluZUJveC5oCShyZXZpc2lvbiAxODEzMjkpCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcv
Um9vdElubGluZUJveC5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMTgsOCArMTE4LDggQEAgcHVibGlj
OgogICAgIHZpcnR1YWwgaW50IGJhc2VsaW5lUG9zaXRpb24oRm9udEJhc2VsaW5lIGJhc2VsaW5l
VHlwZSkgY29uc3Qgb3ZlcnJpZGUgZmluYWw7CiAgICAgdmlydHVhbCBMYXlvdXRVbml0IGxpbmVI
ZWlnaHQoKSBjb25zdCBvdmVycmlkZSBmaW5hbDsKIAotICAgIHZpcnR1YWwgdm9pZCBwYWludChQ
YWludEluZm8mLCBjb25zdCBMYXlvdXRQb2ludCYsIExheW91dFVuaXQgbGluZVRvcCwgTGF5b3V0
VW5pdCBsaW5lQm90dG9tKSBvdmVycmlkZTsKLSAgICB2aXJ0dWFsIGJvb2wgbm9kZUF0UG9pbnQo
Y29uc3QgSGl0VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVzdWx0JiwgY29uc3QgSGl0VGVzdExvY2F0
aW9uJiBsb2NhdGlvbkluQ29udGFpbmVyLCBjb25zdCBMYXlvdXRQb2ludCYgYWNjdW11bGF0ZWRP
ZmZzZXQsIExheW91dFVuaXQgbGluZVRvcCwgTGF5b3V0VW5pdCBsaW5lQm90dG9tKSBvdmVycmlk
ZSBmaW5hbDsKKyAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoUGFpbnRJbmZvJiwgY29uc3QgTGF5b3V0
UG9pbnQmLCBMYXlvdXRVbml0IGxpbmVUb3AsIExheW91dFVuaXQgbGluZUJvdHRvbSwgTGluZUJv
eFBhaW50SW5mbyYpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYm9vbCBub2RlQXRQb2ludChjb25z
dCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBjb25zdCBIaXRUZXN0TG9jYXRpb24m
IGxvY2F0aW9uSW5Db250YWluZXIsIGNvbnN0IExheW91dFBvaW50JiBhY2N1bXVsYXRlZE9mZnNl
dCwgTGF5b3V0VW5pdCBsaW5lVG9wLCBMYXlvdXRVbml0IGxpbmVCb3R0b20sIEhpdFRlc3RBY3Rp
b24sIExpbmVCb3hIaXRUZXN0SW5mbyYpIG92ZXJyaWRlOwogCiAgICAgdXNpbmcgSW5saW5lQm94
OjpoYXNTZWxlY3RlZENoaWxkcmVuOwogICAgIHVzaW5nIElubGluZUJveDo6c2V0SGFzU2VsZWN0
ZWRDaGlsZHJlbjsKQEAgLTE5MCw2ICsxOTAsMTEgQEAgcHVibGljOgogICAgIE5vZGUqIGdldExv
Z2ljYWxTdGFydEJveFdpdGhOb2RlKElubGluZUJveComKSBjb25zdDsKICAgICBOb2RlKiBnZXRM
b2dpY2FsRW5kQm94V2l0aE5vZGUoSW5saW5lQm94KiYpIGNvbnN0OwogCisgICAgYm9vbCBoYXNB
bm9ueW1vdXNJbmxpbmVCbG9jaygpIGNvbnN0IHsgcmV0dXJuIG1faGFzQW5vbnltb3VzSW5saW5l
QmxvY2s7IH0KKyAgICB2b2lkIHNldEhhc0Fub255bW91c0lubGluZUJsb2NrKCkgeyBtX2hhc0Fu
b255bW91c0lubGluZUJsb2NrID0gdHJ1ZTsgfQorICAgIAorICAgIFJlbmRlckJsb2NrRmxvdyog
YW5vbnltb3VzSW5saW5lQmxvY2soKSBjb25zdDsKKwogI2lmIEVOQUJMRShUUkVFX0RFQlVHR0lO
RykKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGJveE5hbWUoKSBjb25zdCBvdmVycmlkZSBmaW5h
bDsKICNlbmRpZgpAQCAtMjI2LDggKzIzMSwzMCBAQCBwcml2YXRlOgogICAgIC8vIEZsb2F0cyBo
YW5naW5nIG9mZiB0aGUgbGluZSBhcmUgcHVzaGVkIGludG8gdGhpcyB2ZWN0b3IgZHVyaW5nIGxh
eW91dC4gSXQgaXMgb25seQogICAgIC8vIGdvb2QgZm9yIGFzIGxvbmcgYXMgdGhlIGxpbmUgaGFz
IG5vdCBiZWVuIG1hcmtlZCBkaXJ0eS4KICAgICBzdGQ6OnVuaXF1ZV9wdHI8VmVjdG9yPFJlbmRl
ckJveCo+PiBtX2Zsb2F0czsKKyAgICAKKyAgICB1bnNpZ25lZCBtX2hhc0Fub255bW91c0lubGlu
ZUJsb2NrIDogMTsKIH07CiAKKy8vIEZvciBhbm9ueW1vdXMgaW5saW5lIGJsb2NrIG9iamVjdHMu
CitjbGFzcyBSb290QW5vbnltb3VzSW5saW5lQmxvY2tCb3ggOiBwdWJsaWMgUm9vdElubGluZUJv
eAoreworcHVibGljOgorICAgIFJvb3RBbm9ueW1vdXNJbmxpbmVCbG9ja0JveChSZW5kZXJCbG9j
a0Zsb3cmIHJvb3RCbG9jaywgUmVuZGVyQmxvY2tGbG93KiBhbm9ueW1vdXNCbG9jaykKKyAgICA6
IFJvb3RJbmxpbmVCb3gocm9vdEJsb2NrKQorICAgICwgbV9hbm9ueW1vdXNJbmxpbmVCbG9jayhh
bm9ueW1vdXNCbG9jaykKKyAgICB7CisgICAgICAgIHNldEhhc0Fub255bW91c0lubGluZUJsb2Nr
KCk7CisgICAgfQorICAgIAorICAgIFJlbmRlckJsb2NrRmxvdyogaW5saW5lQmxvY2soKSBjb25z
dCB7IHJldHVybiBtX2Fub255bW91c0lubGluZUJsb2NrOyB9CisKKyAgICB2aXJ0dWFsIHZvaWQg
cGFpbnQoUGFpbnRJbmZvJiwgY29uc3QgTGF5b3V0UG9pbnQmLCBMYXlvdXRVbml0IGxpbmVUb3As
IExheW91dFVuaXQgbGluZUJvdHRvbSwgTGluZUJveFBhaW50SW5mbyYpIG92ZXJyaWRlIGZpbmFs
OworICAgIHZpcnR1YWwgYm9vbCBub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYsIEhp
dFRlc3RSZXN1bHQmLCBjb25zdCBIaXRUZXN0TG9jYXRpb24mIGxvY2F0aW9uSW5Db250YWluZXIs
IGNvbnN0IExheW91dFBvaW50JiBhY2N1bXVsYXRlZE9mZnNldCwgTGF5b3V0VW5pdCBsaW5lVG9w
LCBMYXlvdXRVbml0IGxpbmVCb3R0b20sIEhpdFRlc3RBY3Rpb24sIExpbmVCb3hIaXRUZXN0SW5m
byYpIG92ZXJyaWRlIGZpbmFsOworCitwcml2YXRlOgorICAgIFJlbmRlckJsb2NrRmxvdyogbV9h
bm9ueW1vdXNJbmxpbmVCbG9jazsKK307CisgCiBpbmxpbmUgUm9vdElubGluZUJveCogUm9vdElu
bGluZUJveDo6bmV4dFJvb3RCb3goKSBjb25zdAogewogICAgIHJldHVybiBkb3duY2FzdDxSb290
SW5saW5lQm94PihtX25leHRMaW5lQm94KTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmlu
Zy9saW5lL0xpbmVMYXlvdXRTdGF0ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3Jl
bmRlcmluZy9saW5lL0xpbmVMYXlvdXRTdGF0ZS5oCShyZXZpc2lvbiAxODEzMjkpCisrKyBTb3Vy
Y2UvV2ViQ29yZS9yZW5kZXJpbmcvbGluZS9MaW5lTGF5b3V0U3RhdGUuaAkod29ya2luZyBjb3B5
KQpAQCAtNTYsNyArNTYsNyBAQCBzdHJ1Y3QgRmxvYXRXaXRoUmVjdCB7CiAvLyBkdXJpbmcgYW4g
ZW50aXJlIGxpbmVib3ggdHJlZSBsYXlvdXQgcGFzcyAoYWthIGxheW91dElubGluZUNoaWxkcmVu
KS4KIGNsYXNzIExpbmVMYXlvdXRTdGF0ZSB7CiBwdWJsaWM6Ci0gICAgTGluZUxheW91dFN0YXRl
KGJvb2wgZnVsbExheW91dCwgTGF5b3V0VW5pdCYgcmVwYWludExvZ2ljYWxUb3AsIExheW91dFVu
aXQmIHJlcGFpbnRMb2dpY2FsQm90dG9tLCBSZW5kZXJGbG93VGhyZWFkKiBmbG93VGhyZWFkKQor
ICAgIExpbmVMYXlvdXRTdGF0ZShjb25zdCBSZW5kZXJCbG9ja0Zsb3cmIGJsb2NrRmxvdywgYm9v
bCBmdWxsTGF5b3V0LCBMYXlvdXRVbml0JiByZXBhaW50TG9naWNhbFRvcCwgTGF5b3V0VW5pdCYg
cmVwYWludExvZ2ljYWxCb3R0b20sIFJlbmRlckZsb3dUaHJlYWQqIGZsb3dUaHJlYWQpCiAgICAg
ICAgIDogbV9lbmRMaW5lTG9naWNhbFRvcCgwKQogICAgICAgICAsIG1fZW5kTGluZSgwKQogICAg
ICAgICAsIG1fbGFzdEZsb2F0KDApCkBAIC02NSw2ICs2NSw3IEBAIHB1YmxpYzoKICAgICAgICAg
LCBtX2Zsb3dUaHJlYWQoZmxvd1RocmVhZCkKICAgICAgICAgLCBtX3JlcGFpbnRMb2dpY2FsVG9w
KHJlcGFpbnRMb2dpY2FsVG9wKQogICAgICAgICAsIG1fcmVwYWludExvZ2ljYWxCb3R0b20ocmVw
YWludExvZ2ljYWxCb3R0b20pCisgICAgICAgICwgbV9tYXJnaW5JbmZvKGJsb2NrRmxvdywgYmxv
Y2tGbG93LmJvcmRlckFuZFBhZGRpbmdCZWZvcmUoKSwgYmxvY2tGbG93LmJvcmRlckFuZFBhZGRp
bmdBZnRlcigpICsgYmxvY2tGbG93LnNjcm9sbGJhckxvZ2ljYWxIZWlnaHQoKSkKICAgICAgICAg
LCBtX2VuZExpbmVNYXRjaGVkKGZhbHNlKQogICAgICAgICAsIG1fY2hlY2tGb3JGbG9hdHNGcm9t
TGFzdExpbmUoZmFsc2UpCiAgICAgICAgICwgbV9pc0Z1bGxMYXlvdXQoZnVsbExheW91dCkKQEAg
LTExOSw2ICsxMjAsOCBAQCBwdWJsaWM6CiAgICAgICAgIG1fcmVwYWludExvZ2ljYWxCb3R0b20g
PSBzdGQ6Om1heChtX3JlcGFpbnRMb2dpY2FsQm90dG9tLCBib3gtPmxvZ2ljYWxCb3R0b21WaXN1
YWxPdmVyZmxvdygpICsgc3RkOjptYXg8TGF5b3V0VW5pdD4ocGFnaW5hdGlvbkRlbHRhLCAwKSk7
CiAgICAgfQogCisgICAgTWFyZ2luSW5mbyYgbWFyZ2luSW5mbygpIHsgcmV0dXJuIG1fbWFyZ2lu
SW5mbzsgfQorCiBwcml2YXRlOgogICAgIExpbmVJbmZvIG1fbGluZUluZm87CiAgICAgTGF5b3V0
VW5pdCBtX2VuZExpbmVMb2dpY2FsVG9wOwpAQCAtMTM1LDcgKzEzOCw5IEBAIHByaXZhdGU6CiAg
ICAgLy8gRklYTUU6IFNob3VsZCB0aGlzIGJlIGEgcmFuZ2Ugb2JqZWN0IGluc3RlYWQgb2YgdHdv
IGludHM/CiAgICAgTGF5b3V0VW5pdCYgbV9yZXBhaW50TG9naWNhbFRvcDsKICAgICBMYXlvdXRV
bml0JiBtX3JlcGFpbnRMb2dpY2FsQm90dG9tOwotCisgICAgCisgICAgTWFyZ2luSW5mbyBtX21h
cmdpbkluZm87CisgICAgCiAgICAgYm9vbCBtX2VuZExpbmVNYXRjaGVkIDogMTsKICAgICBib29s
IG1fY2hlY2tGb3JGbG9hdHNGcm9tTGFzdExpbmUgOiAxOwogICAgIGJvb2wgbV9pc0Z1bGxMYXlv
dXQgOiAxOwpJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL3N2Zy9SZW5kZXJTVkdJbmxp
bmUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcvUmVuZGVy
U1ZHSW5saW5lLmNwcAkocmV2aXNpb24gMTgxMzI5KQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVy
aW5nL3N2Zy9SZW5kZXJTVkdJbmxpbmUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNiw3ICszNiw3
IEBAIFJlbmRlclNWR0lubGluZTo6UmVuZGVyU1ZHSW5saW5lKFNWR0dyYXAKICAgICBzZXRBbHdh
eXNDcmVhdGVMaW5lQm94ZXMoKTsKIH0KIAotc3RkOjp1bmlxdWVfcHRyPElubGluZUZsb3dCb3g+
IFJlbmRlclNWR0lubGluZTo6Y3JlYXRlSW5saW5lRmxvd0JveCgpCitzdGQ6OnVuaXF1ZV9wdHI8
SW5saW5lRmxvd0JveD4gUmVuZGVyU1ZHSW5saW5lOjpjcmVhdGVJbmxpbmVGbG93Qm94KFJlbmRl
ckJsb2NrRmxvdyopCiB7CiAgICAgYXV0byBib3ggPSBzdGQ6Om1ha2VfdW5pcXVlPFNWR0lubGlu
ZUZsb3dCb3g+KCp0aGlzKTsKICAgICBib3gtPnNldEhhc1ZpcnR1YWxMb2dpY2FsSGVpZ2h0KCk7
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvc3ZnL1JlbmRlclNWR0lubGluZS5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcvUmVuZGVyU1ZHSW5saW5l
LmgJKHJldmlzaW9uIDE4MTMyOSkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcvUmVu
ZGVyU1ZHSW5saW5lLmgJKHdvcmtpbmcgY29weSkKQEAgLTU2LDcgKzU2LDcgQEAgcHJpdmF0ZToK
ICAgICB2aXJ0dWFsIGNvbnN0IFJlbmRlck9iamVjdCogcHVzaE1hcHBpbmdUb0NvbnRhaW5lcihj
b25zdCBSZW5kZXJMYXllck1vZGVsT2JqZWN0KiBhbmNlc3RvclRvU3RvcEF0LCBSZW5kZXJHZW9t
ZXRyeU1hcCYpIGNvbnN0IG92ZXJyaWRlIGZpbmFsOwogICAgIHZpcnR1YWwgdm9pZCBhYnNvbHV0
ZVF1YWRzKFZlY3RvcjxGbG9hdFF1YWQ+JiwgYm9vbCogd2FzRml4ZWQpIGNvbnN0IG92ZXJyaWRl
IGZpbmFsOwogCi0gICAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8SW5saW5lRmxvd0JveD4gY3Jl
YXRlSW5saW5lRmxvd0JveCgpIG92ZXJyaWRlIGZpbmFsOworICAgIHZpcnR1YWwgc3RkOjp1bmlx
dWVfcHRyPElubGluZUZsb3dCb3g+IGNyZWF0ZUlubGluZUZsb3dCb3goUmVuZGVyQmxvY2tGbG93
Kikgb3ZlcnJpZGUgZmluYWw7CiAKICAgICB2aXJ0dWFsIHZvaWQgd2lsbEJlRGVzdHJveWVkKCkg
b3ZlcnJpZGUgZmluYWw7CiAgICAgdmlydHVhbCB2b2lkIHN0eWxlRGlkQ2hhbmdlKFN0eWxlRGlm
ZmVyZW5jZSwgY29uc3QgUmVuZGVyU3R5bGUqIG9sZFN0eWxlKSBvdmVycmlkZSBmaW5hbDsKSW5k
ZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcvUmVuZGVyU1ZHVGV4dC5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL3N2Zy9SZW5kZXJTVkdUZXh0LmNwcAko
cmV2aXNpb24gMTgxMzI5KQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL3N2Zy9SZW5kZXJT
VkdUZXh0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDI0LDcgKzQyNCw3IEBAIHZvaWQgUmVuZGVy
U1ZHVGV4dDo6bGF5b3V0KCkKICAgICBjbGVhck5lZWRzTGF5b3V0KCk7CiB9CiAKLXN0ZDo6dW5p
cXVlX3B0cjxSb290SW5saW5lQm94PiBSZW5kZXJTVkdUZXh0OjpjcmVhdGVSb290SW5saW5lQm94
KCkKK3N0ZDo6dW5pcXVlX3B0cjxSb290SW5saW5lQm94PiBSZW5kZXJTVkdUZXh0OjpjcmVhdGVS
b290SW5saW5lQm94KFJlbmRlckJsb2NrRmxvdyopCiB7CiAgICAgYXV0byBib3ggPSBzdGQ6Om1h
a2VfdW5pcXVlPFNWR1Jvb3RJbmxpbmVCb3g+KCp0aGlzKTsKICAgICBib3gtPnNldEhhc1ZpcnR1
YWxMb2dpY2FsSGVpZ2h0KCk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvc3ZnL1Jl
bmRlclNWR1RleHQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvc3Zn
L1JlbmRlclNWR1RleHQuaAkocmV2aXNpb24gMTgxMzI5KQorKysgU291cmNlL1dlYkNvcmUvcmVu
ZGVyaW5nL3N2Zy9SZW5kZXJTVkdUZXh0LmgJKHdvcmtpbmcgY29weSkKQEAgLTg5LDcgKzg5LDcg
QEAgcHJpdmF0ZToKIAogICAgIHZpcnR1YWwgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiBsb2NhbFRv
UGFyZW50VHJhbnNmb3JtKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbV9sb2NhbFRyYW5zZm9y
bTsgfQogICAgIHZpcnR1YWwgQWZmaW5lVHJhbnNmb3JtIGxvY2FsVHJhbnNmb3JtKCkgY29uc3Qg
b3ZlcnJpZGUgeyByZXR1cm4gbV9sb2NhbFRyYW5zZm9ybTsgfQotICAgIHZpcnR1YWwgc3RkOjp1
bmlxdWVfcHRyPFJvb3RJbmxpbmVCb3g+IGNyZWF0ZVJvb3RJbmxpbmVCb3goKSBvdmVycmlkZTsK
KyAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxSb290SW5saW5lQm94PiBjcmVhdGVSb290SW5s
aW5lQm94KFJlbmRlckJsb2NrRmxvdyopIG92ZXJyaWRlOwogCiAgICAgdmlydHVhbCBSZW5kZXJC
bG9jayogZmlyc3RMaW5lQmxvY2soKSBjb25zdCBvdmVycmlkZTsKICAgICB2aXJ0dWFsIHZvaWQg
dXBkYXRlRmlyc3RMZXR0ZXIoKSBvdmVycmlkZTsK
</data>

          </attachment>
      

    </bug>

</bugzilla>